Introduction

Installing Bioinformatics tools can be a major headache and frustration; even for experienced Bioinformaticians. In this brief tutorial we explain how you can run command-line Bioinformatics tools on your own desktop / laptop, or University of Sheffield computing cluster, with minimal setup.

It will be assumed that you have some familiarity with the Unix command-line interface, and know what commands you want to run. You can get a primer from the Software Carpentry organisation for example.

The particular example we will give is for an RNA-seq analysis. If you have a different analysis to perform, please check-out the RNA-seq instructions before seeing what seeing what other software we have made available.

Disclaimer:- this is not a tutorial on how to perform an RNA-seq analysis and which tools to use. You should use this tutorial when you are familiar with the workflow and want to run the tools on your own data.

Video walkthrough

Setup on your own machine

A Virtual-Machine approach (e.g. using VirtualBox) could be used, but we will consider a solution using “Docker”.

Docker is an open platform for developers to build and ship applications, whether on laptops, servers in a data center, or the cloud. It is a (relatively) painless way for you to install and try out Bioinformatics software. You can think of it as an isolated environment inside your existing operating system where you can install and run software without messing with the main OS.

It is worth bearing in mind that the first approach will use the CPU and RAM from your own machine, so if you do not have adequate resources, some of the analyses may struggle and you might have to consider using a computing cluster.

Installing Docker

Choose the appropriate link below to install docker on your machine

Windows

Once you have installed Docker using the instructions above, you can open a terminal (Mac) or command prompt (Windows; search for the CMD program) and type the following to check that everything is working

docker run hello-world

Using the environment to analyse your own data

hello-world is a pre-built container that prints a “Hello world” message to the screen. Many popular software (not just Bioinformatics) and pipelines are distributed using docker and in particular the dockerhub website. Our container for RNA-seq analysis is available at sheffieldbioinformatics/rnaseq-training.

With the default settings, the “container” is isolated from your own machine; we can neither bring files that we create back to our own OS, or analyse our own data.

However, adding an -v argument allows certain folders on your own OS to be visible within the environment.

Lets assume the files I want to analyse are to be found in the folder /c/work/my_fastq_data. Here’s what the files look like on my Windows machine

The following command would map that directory to the folder /data inside the docker container

docker run --rm  -it -v /c/work/my_fastq_data:/data sheffieldbioinformatics/rnaseq-training

Notice how the command prompt changes to indicate that I am now the root user within a different file system

N.B. the other options being used here are –rm to delete the container afterwards, and -it to make it interactive.

We now should be able to see our files with the ls command on the directory /data/.

cd /data/
ls

If I now want to run fastqc to perform a QC check on my files, the fastqc tool is available to us.

cd /data
fastqc *.fastq.gz

Conveniently the results are appear in the directory on our Windows machine

Other commonly-used tools that are available include:-

## QC
multiqc

## alignment
hisat2
tophat2
bowtie2
STAR

## trimming
cutadapt

## quantification
salmon
kallisto

## countinh
featureCounts
htseq-count
cuffdiff

## general
samtools

The trimmomatic trimming tool can also be executed using:-

java -jar $TRIMMOMATIC

Various tools from the RSEM suite can also be used. To see a full list, type rsem and press the tab key.

rsem-calculate-expression
rsem-prepare-reference

##etc

The sra-toolkit is available for downloading files directly from the Sequence Read Archive (SRA)

fastq-dump

Additionally, various standard command-line tools are available to help you navigate and manipulate files.

cd
ls
cat
more
cp
wget
unzip
gunzip
tar

When you have finished with analysis, type exit and close the command prompt.

exit

Any software missing?

If you have the need for any RNA-seq software that is not covered by this list, but drop us a line ().

Analysis on the UoS cluster

As described above, docker can be used to run an RNA-seq analysis on a personal laptop or desktop. However, there are some security implications of docker that prohibits it being installed on a high-performance computing system. An alternative is singularity, which allows computing environments to be distributed as a single image file. We have created such a singularity image for the analysis of RNA-seq and made it available on sharc (The University of Sheffield’s HPC).

If you don’t already have one, you will need to request an account on sharc.

https://www.sheffield.ac.uk/it-services/research/hpc/register

The UoS website has documentation on connecting to the HPC and transfering data.

https://www.sheffield.ac.uk/it-services/research/hpc/sharc

Interactive mode

On my Windows machine I use the free tools putty and WinSCP to connect to the cluster

Firstly, login to sharc using the steps in the documentation and then open an interactive shell. e.g. 

ssh USERNAME@sharc.shef.ac.uk

## open an interactive shell with 6Gb of RAM. Change as required

qrshx -l rmem=6G

Standard Unix commands (e.g. ls, cd, pwd, wget…) are already available when you first login to sharc. However, the tools specific to NGS analysis will require you to prefix the path to the singularity image before the command to run the tool.

To save typing to path to the singularity image can be saved as a variable

export IMAGE_BASE="singularity exec /usr/local/community/bioinformatics-core/singularity/rnaseq-training.sif"

Lets say that I have some fastq files in the folder /fastdata/md1mjdx/my_fastqs then I could run fastqc as follows.

cd /fastdata/md1mjdx/my_fastqs
$IMAGE_BASE fastqc *.fastq.gz

The tools listed in the previous section are all available, but this time the command must be prefixed with $IMAGE_BASE. The commands listed below will typically print the help. For details of how to run the command for your analysis consult the corresponding documentation.

Other example commands

$IMAGE_BASE multiqc
$IMAGE_BASE salmon
$IMAGE_BASE kallisto
$IMAGE_BASE hisat2-build
$IMAGE_BASE hisat2 
$IMAGE_BASE STAR
$IMAGE_BASE samtools 
$IMAGE_BASE featureCounts
$IMAGE_BASE htseq-count

Script submission

Analysis on another computing cluster

If you are outside the University of Sheffield We are not able to offer a great deal of support for analysis on your institutes’ computing environment. In brief, the singularity tool will need to be installed, which can then be used to convert the docker container into a corresponding singularity file.

singularity build rnaseq-training.sif docker://sheffieldbioinformatics/rnaseq-training

Other NGS analyses

ChIP-seq

docker

The command to run the docker container for this is:-

docker run --rm  -it -v /c/work/my_fastq_data:/data sheffieldbioinformatics/chipseq-training

Providing the following software

# qc
fastqc
multiqc

# trimming
cutadapt


# alignment

bowtie2

# peak-calling

macs2

# downstream

meme

# general

samtools
bedtools

# SRA toolkit

fastq-dump

The picard suite of tools can also be accessed

java -jar $PICARD
``


### UoS computing cluster

export IMAGE_BASE=“singularity exec /usr/local/community/bioinformatics-core/singularity/chipseq-training.sif” ```

Variant-calling

Coming soon….

LS0tDQp0aXRsZTogIlNldHRpbmctdXAgYW5kIHVzaW5nIGNvbW1hbmQtbGluZSBCaW9pbmZvcm1hdGljcyB0b29scyINCmF1dGhvcjogIk1hcmsgRHVubmluZyINCmRhdGU6ICdgciBmb3JtYXQoU3lzLnRpbWUoKSwgIkxhc3QgbW9kaWZpZWQ6ICVkICViICVZIilgJw0Kb3V0cHV0Og0KICBodG1sX25vdGVib29rOg0KICAgIHRvYzogeWVzDQogICAgdG9jX2Zsb2F0OiB5ZXMNCi0tLQ0KDQojIEludHJvZHVjdGlvbg0KDQpJbnN0YWxsaW5nIEJpb2luZm9ybWF0aWNzIHRvb2xzIGNhbiBiZSBhIG1ham9yIGhlYWRhY2hlIGFuZCBmcnVzdHJhdGlvbjsgZXZlbiBmb3IgZXhwZXJpZW5jZWQgQmlvaW5mb3JtYXRpY2lhbnMuIEluIHRoaXMgYnJpZWYgdHV0b3JpYWwgd2UgZXhwbGFpbiBob3cgeW91IGNhbiBydW4gY29tbWFuZC1saW5lIEJpb2luZm9ybWF0aWNzIHRvb2xzIG9uIHlvdXIgb3duIGRlc2t0b3AgLyBsYXB0b3AsIG9yIFVuaXZlcnNpdHkgb2YgU2hlZmZpZWxkIGNvbXB1dGluZyBjbHVzdGVyLCB3aXRoIG1pbmltYWwgc2V0dXAuIA0KDQpJdCB3aWxsIGJlIGFzc3VtZWQgdGhhdCB5b3UgaGF2ZSBzb21lIGZhbWlsaWFyaXR5IHdpdGggdGhlIFVuaXggY29tbWFuZC1saW5lIGludGVyZmFjZSwgYW5kIGtub3cgd2hhdCBjb21tYW5kcyB5b3Ugd2FudCB0byBydW4uIFlvdSBjYW4gZ2V0IGEgcHJpbWVyIGZyb20gdGhlIFNvZnR3YXJlIENhcnBlbnRyeSBvcmdhbmlzYXRpb24gZm9yIGV4YW1wbGUuDQoNCi0gW1NvZnR3YXJlIENhcnBlbnRyeV0oaHR0cHM6Ly9zd2NhcnBlbnRyeS5naXRodWIuaW8vc2hlbGwtbm92aWNlLykNCg0KVGhlIHBhcnRpY3VsYXIgZXhhbXBsZSB3ZSB3aWxsIGdpdmUgaXMgZm9yIGFuIFJOQS1zZXEgYW5hbHlzaXMuIElmIHlvdSBoYXZlIGEgZGlmZmVyZW50IGFuYWx5c2lzIHRvIHBlcmZvcm0sIHBsZWFzZSBjaGVjay1vdXQgdGhlIFJOQS1zZXEgaW5zdHJ1Y3Rpb25zIGJlZm9yZSBzZWVpbmcgd2hhdCBzZWVpbmcgd2hhdCBvdGhlciBzb2Z0d2FyZSB3ZSBoYXZlIG1hZGUgYXZhaWxhYmxlLg0KDQoqKkRpc2NsYWltZXI6LSB0aGlzIGlzIG5vdCBhIHR1dG9yaWFsIG9uIGhvdyB0byBwZXJmb3JtIGFuIFJOQS1zZXEgYW5hbHlzaXMgYW5kIHdoaWNoIHRvb2xzIHRvIHVzZS4gWW91IHNob3VsZCB1c2UgdGhpcyB0dXRvcmlhbCB3aGVuIHlvdSBhcmUgZmFtaWxpYXIgd2l0aCB0aGUgd29ya2Zsb3cgYW5kIHdhbnQgdG8gcnVuIHRoZSB0b29scyBvbiB5b3VyIG93biBkYXRhLioqDQoNCi0gW1NCQyB0dXRvcmlhbCBvbiBSTkEtc2VxIHByb2Nlc3NpbmddKGh0dHBzOi8vc2JjLnNoZWYuYWMudWsvd29ya3Nob3BzLzIwMjAtMDItMTItY29tbWFuZC1saW5lL2FsaWduLWFuZC1xdWFudGlmaWNhdGlvbi5uYi5odG1sKQ0KDQoNCiMgVmlkZW8gd2Fsa3Rocm91Z2gNCg0KLSBbVmlkZW8gd2Fsa3Rocm91Z2hdKGh0dHBzOi8veW91dHUuYmUvazZ2d2NUNmxBdkkpDQoNCiMgU2V0dXAgb24geW91ciBvd24gbWFjaGluZQ0KDQpBIFZpcnR1YWwtTWFjaGluZSBhcHByb2FjaCAoZS5nLiB1c2luZyBWaXJ0dWFsQm94KSBjb3VsZCBiZSB1c2VkLCBidXQgd2Ugd2lsbCBjb25zaWRlciBhIHNvbHV0aW9uIHVzaW5nICJEb2NrZXIiLg0KDQpEb2NrZXIgaXMgYW4gb3BlbiBwbGF0Zm9ybSBmb3IgZGV2ZWxvcGVycyB0byBidWlsZCBhbmQgc2hpcCBhcHBsaWNhdGlvbnMsIHdoZXRoZXIgb24gbGFwdG9wcywgc2VydmVycyBpbiBhIGRhdGEgY2VudGVyLCBvciB0aGUgY2xvdWQuIEl0IGlzIGEgKHJlbGF0aXZlbHkpIHBhaW5sZXNzIHdheSBmb3IgeW91IHRvIGluc3RhbGwgYW5kIHRyeSBvdXQgQmlvaW5mb3JtYXRpY3Mgc29mdHdhcmUuIFlvdSBjYW4gdGhpbmsgb2YgaXQgYXMgYW4gaXNvbGF0ZWQgZW52aXJvbm1lbnQgaW5zaWRlIHlvdXIgZXhpc3Rpbmcgb3BlcmF0aW5nIHN5c3RlbSB3aGVyZSB5b3UgY2FuIGluc3RhbGwgYW5kIHJ1biBzb2Z0d2FyZSB3aXRob3V0IG1lc3Npbmcgd2l0aCB0aGUgbWFpbiBPUy4NCg0KSXQgaXMgd29ydGggYmVhcmluZyBpbiBtaW5kIHRoYXQgdGhlIGZpcnN0IGFwcHJvYWNoIHdpbGwgdXNlIHRoZSBDUFUgYW5kIFJBTSBmcm9tIHlvdXIgb3duIG1hY2hpbmUsIHNvIGlmIHlvdSBkbyBub3QgaGF2ZSBhZGVxdWF0ZSByZXNvdXJjZXMsIHNvbWUgb2YgdGhlIGFuYWx5c2VzIG1heSBzdHJ1Z2dsZSBhbmQgeW91IG1pZ2h0IGhhdmUgdG8gY29uc2lkZXIgW3VzaW5nIGEgY29tcHV0aW5nIGNsdXN0ZXJdKCNBbmFseXNpcy1vbi10aGUtVW9TLWNsdXN0ZXIpLg0KDQojIyBJbnN0YWxsaW5nIERvY2tlcg0KDQpDaG9vc2UgdGhlIGFwcHJvcHJpYXRlIGxpbmsgYmVsb3cgdG8gaW5zdGFsbCBkb2NrZXIgb24geW91ciBtYWNoaW5lDQoNCiMjIyBNYWMNCg0KLSBbTWFjIE9TWCAtIDEwLjEwLjMgb3IgbmV3ZXJdKGh0dHBzOi8vd3d3LmRvY2tlci5jb20vZG9ja2VyLW1hYykNCi0gW09sZGVyIE1hY3NdKGh0dHBzOi8vZG93bmxvYWQuZG9ja2VyLmNvbS9tYWMvc3RhYmxlL0RvY2tlclRvb2xib3gucGtnKQ0KDQojIyMgV2luZG93cw0KDQotIFtXaW5kb3dzIDEwIFByb2Zlc3Npb25hbCAvIEVkdWNhdGlvbmFsXShodHRwczovL3d3dy5kb2NrZXIuY29tL2RvY2tlci13aW5kb3dzKQ0KLSBbT3RoZXIgV2luZG93c10oaHR0cHM6Ly9kb3dubG9hZC5kb2NrZXIuY29tL3dpbi9zdGFibGUvRG9ja2VyVG9vbGJveC5leGUpDQoNCk9uY2UgeW91IGhhdmUgaW5zdGFsbGVkIERvY2tlciB1c2luZyB0aGUgaW5zdHJ1Y3Rpb25zIGFib3ZlLCB5b3UgY2FuIG9wZW4gYSB0ZXJtaW5hbCAoTWFjKSBvciBjb21tYW5kIHByb21wdCAoV2luZG93czsgc2VhcmNoIGZvciB0aGUgQ01EIHByb2dyYW0pIGFuZCB0eXBlIHRoZSBmb2xsb3dpbmcgdG8gY2hlY2sgdGhhdCBldmVyeXRoaW5nIGlzIHdvcmtpbmcNCg0KYGBgDQpkb2NrZXIgcnVuIGhlbGxvLXdvcmxkDQpgYGANCg0KIVtdKGltYWdlcy9kb2NrZXIxLlBORykNCg0KDQojIyMgVXNpbmcgdGhlIGVudmlyb25tZW50IHRvIGFuYWx5c2UgeW91ciBvd24gZGF0YQ0KDQpgaGVsbG8td29ybGRgIGlzIGEgcHJlLWJ1aWx0IGNvbnRhaW5lciB0aGF0IHByaW50cyBhICJIZWxsbyB3b3JsZCIgbWVzc2FnZSB0byB0aGUgc2NyZWVuLiBNYW55IHBvcHVsYXIgc29mdHdhcmUgKG5vdCBqdXN0IEJpb2luZm9ybWF0aWNzKSBhbmQgcGlwZWxpbmVzIGFyZSBkaXN0cmlidXRlZCB1c2luZyBkb2NrZXIgYW5kIGluIHBhcnRpY3VsYXIgdGhlIFtkb2NrZXJodWJdKGh0dHA6Ly9kb2NrZXJodWIuY29tLykgd2Vic2l0ZS4gT3VyIGNvbnRhaW5lciBmb3IgUk5BLXNlcSBhbmFseXNpcyBpcyBhdmFpbGFibGUgYXQgYHNoZWZmaWVsZGJpb2luZm9ybWF0aWNzL3JuYXNlcS10cmFpbmluZ2AuDQoNCldpdGggdGhlIGRlZmF1bHQgc2V0dGluZ3MsIHRoZSAiY29udGFpbmVyIiBpcyBpc29sYXRlZCBmcm9tIHlvdXIgb3duIG1hY2hpbmU7IHdlIGNhbiBuZWl0aGVyIGJyaW5nIGZpbGVzIHRoYXQgd2UgY3JlYXRlIGJhY2sgdG8gb3VyIG93biBPUywgb3IgYW5hbHlzZSBvdXIgb3duIGRhdGEuDQoNCkhvd2V2ZXIsIGFkZGluZyBhbiBgLXZgIGFyZ3VtZW50IGFsbG93cyBjZXJ0YWluIGZvbGRlcnMgb24geW91ciBvd24gT1MgdG8gYmUgdmlzaWJsZSB3aXRoaW4gdGhlIGVudmlyb25tZW50LiANCg0KTGV0cyBhc3N1bWUgdGhlIGZpbGVzIEkgd2FudCB0byBhbmFseXNlIGFyZSB0byBiZSBmb3VuZCBpbiB0aGUgZm9sZGVyIGAvYy93b3JrL215X2Zhc3RxX2RhdGFgLiBIZXJlJ3Mgd2hhdCB0aGUgZmlsZXMgbG9vayBsaWtlIG9uIG15IFdpbmRvd3MgbWFjaGluZQ0KDQohW10oaW1hZ2VzL3dpbmRvd3NfZmlsZXMuUE5HKQ0KDQpUaGUgZm9sbG93aW5nIGNvbW1hbmQgd291bGQgbWFwIHRoYXQgZGlyZWN0b3J5IHRvIHRoZSBmb2xkZXIgYC9kYXRhYCBpbnNpZGUgdGhlIGRvY2tlciBjb250YWluZXINCg0KYGBgDQpkb2NrZXIgcnVuIC0tcm0gIC1pdCAtdiAvYy93b3JrL215X2Zhc3RxX2RhdGE6L2RhdGEgc2hlZmZpZWxkYmlvaW5mb3JtYXRpY3Mvcm5hc2VxLXRyYWluaW5nDQpgYGANCg0KTm90aWNlIGhvdyB0aGUgKmNvbW1hbmQgcHJvbXB0KiBjaGFuZ2VzIHRvIGluZGljYXRlIHRoYXQgSSBhbSBub3cgdGhlIGByb290YCB1c2VyIHdpdGhpbiBhIGRpZmZlcmVudCBmaWxlIHN5c3RlbQ0KDQoqTi5CLiB0aGUgb3RoZXIgb3B0aW9ucyBiZWluZyB1c2VkIGhlcmUgYXJlIC0tcm0gdG8gZGVsZXRlIHRoZSBjb250YWluZXIgYWZ0ZXJ3YXJkcywgYW5kIC1pdCB0byBtYWtlIGl0IGludGVyYWN0aXZlKi4NCg0KDQpXZSBub3cgc2hvdWxkIGJlIGFibGUgdG8gc2VlIG91ciBmaWxlcyB3aXRoIHRoZSBgbHNgIGNvbW1hbmQgb24gdGhlIGRpcmVjdG9yeSBgL2RhdGEvYC4NCg0KYGBgDQpjZCAvZGF0YS8NCmxzDQpgYGANCg0KIVtdKGltYWdlcy9kb2NrZXIyLlBORykNCg0KDQpJZiBJIG5vdyB3YW50IHRvIHJ1biBgZmFzdHFjYCB0byBwZXJmb3JtIGEgUUMgY2hlY2sgb24gbXkgZmlsZXMsIHRoZSBgZmFzdHFjYCB0b29sIGlzIGF2YWlsYWJsZSB0byB1cy4NCg0KYGBgDQpjZCAvZGF0YQ0KZmFzdHFjICouZmFzdHEuZ3oNCg0KYGBgDQpDb252ZW5pZW50bHkgdGhlIHJlc3VsdHMgYXJlIGFwcGVhciBpbiB0aGUgZGlyZWN0b3J5IG9uIG91ciBXaW5kb3dzIG1hY2hpbmUNCg0KIVtdKGltYWdlcy93aW5kb3dzX2ZpbGVzMi5QTkcpDQoNCk90aGVyIGNvbW1vbmx5LXVzZWQgdG9vbHMgdGhhdCBhcmUgYXZhaWxhYmxlIGluY2x1ZGU6LQ0KDQpgYGANCiMjIFFDDQptdWx0aXFjDQoNCiMjIGFsaWdubWVudA0KaGlzYXQyDQp0b3BoYXQyDQpib3d0aWUyDQpTVEFSDQoNCiMjIHRyaW1taW5nDQpjdXRhZGFwdA0KDQojIyBxdWFudGlmaWNhdGlvbg0Kc2FsbW9uDQprYWxsaXN0bw0KDQojIyBjb3VudGluaA0KZmVhdHVyZUNvdW50cw0KaHRzZXEtY291bnQNCmN1ZmZkaWZmDQoNCiMjIGdlbmVyYWwNCnNhbXRvb2xzDQoNCmBgYA0KDQpUaGUgdHJpbW1vbWF0aWMgdHJpbW1pbmcgdG9vbCBjYW4gYWxzbyBiZSBleGVjdXRlZCB1c2luZzotDQoNCg0KYGBgDQpqYXZhIC1qYXIgJFRSSU1NT01BVElDDQpgYGANCg0KVmFyaW91cyB0b29scyBmcm9tIHRoZSBSU0VNIHN1aXRlIGNhbiBhbHNvIGJlIHVzZWQuIFRvIHNlZSBhIGZ1bGwgbGlzdCwgdHlwZSBgcnNlbWAgYW5kIHByZXNzIHRoZSB0YWIga2V5Lg0KDQpgYGANCnJzZW0tY2FsY3VsYXRlLWV4cHJlc3Npb24NCnJzZW0tcHJlcGFyZS1yZWZlcmVuY2UNCg0KIyNldGMNCg0KYGBgDQoNClRoZSBzcmEtdG9vbGtpdCBpcyBhdmFpbGFibGUgZm9yIGRvd25sb2FkaW5nIGZpbGVzIGRpcmVjdGx5IGZyb20gdGhlIFNlcXVlbmNlIFJlYWQgQXJjaGl2ZSAoU1JBKQ0KDQpgYGANCmZhc3RxLWR1bXANCmBgYA0KDQpBZGRpdGlvbmFsbHksIHZhcmlvdXMgc3RhbmRhcmQgY29tbWFuZC1saW5lIHRvb2xzIGFyZSBhdmFpbGFibGUgdG8gaGVscCB5b3UgbmF2aWdhdGUgYW5kIG1hbmlwdWxhdGUgZmlsZXMuDQoNCmBgYA0KY2QNCmxzDQpjYXQNCm1vcmUNCmNwDQp3Z2V0DQp1bnppcA0KZ3VuemlwDQp0YXINCmBgYA0KDQoNCldoZW4geW91IGhhdmUgZmluaXNoZWQgd2l0aCBhbmFseXNpcywgdHlwZSBgZXhpdGAgYW5kIGNsb3NlIHRoZSBjb21tYW5kIHByb21wdC4NCg0KYGBgDQpleGl0DQpgYGANCg0KIyMgQW55IHNvZnR3YXJlIG1pc3Npbmc/DQoNCklmIHlvdSBoYXZlIHRoZSBuZWVkIGZvciBhbnkgUk5BLXNlcSBzb2Z0d2FyZSB0aGF0IGlzIG5vdCBjb3ZlcmVkIGJ5IHRoaXMgbGlzdCwgYnV0IGRyb3AgdXMgYSBsaW5lIChiaW9pbmZvcm1hdGljcy1jb3JlQHNoZWZmaWVsZC5hYy51aykuIA0KDQoNCiMgQW5hbHlzaXMgb24gdGhlIFVvUyBjbHVzdGVyDQoNCkFzIGRlc2NyaWJlZCBhYm92ZSwgYGRvY2tlcmAgY2FuIGJlIHVzZWQgdG8gcnVuIGFuIFJOQS1zZXEgYW5hbHlzaXMgb24gYSBwZXJzb25hbCBsYXB0b3Agb3IgZGVza3RvcC4gSG93ZXZlciwgdGhlcmUgYXJlIHNvbWUgc2VjdXJpdHkgaW1wbGljYXRpb25zIG9mIGRvY2tlciB0aGF0IHByb2hpYml0cyBpdCBiZWluZyBpbnN0YWxsZWQgb24gYSBoaWdoLXBlcmZvcm1hbmNlIGNvbXB1dGluZyBzeXN0ZW0uIEFuIGFsdGVybmF0aXZlIGlzIGBzaW5ndWxhcml0eWAsIHdoaWNoIGFsbG93cyBjb21wdXRpbmcgZW52aXJvbm1lbnRzIHRvIGJlIGRpc3RyaWJ1dGVkIGFzIGEgc2luZ2xlIGltYWdlIGZpbGUuIFdlIGhhdmUgY3JlYXRlZCBzdWNoIGEgc2luZ3VsYXJpdHkgaW1hZ2UgZm9yIHRoZSBhbmFseXNpcyBvZiBSTkEtc2VxIGFuZCBtYWRlIGl0IGF2YWlsYWJsZSBvbiBzaGFyYyAoVGhlIFVuaXZlcnNpdHkgb2YgU2hlZmZpZWxkJ3MgSFBDKS4NCg0KSWYgeW91IGRvbid0IGFscmVhZHkgaGF2ZSBvbmUsIHlvdSB3aWxsIG5lZWQgdG8gcmVxdWVzdCBhbiBhY2NvdW50IG9uIHNoYXJjLg0KDQpodHRwczovL3d3dy5zaGVmZmllbGQuYWMudWsvaXQtc2VydmljZXMvcmVzZWFyY2gvaHBjL3JlZ2lzdGVyDQoNClRoZSBVb1Mgd2Vic2l0ZSBoYXMgZG9jdW1lbnRhdGlvbiBvbiBjb25uZWN0aW5nIHRvIHRoZSBIUEMgYW5kIHRyYW5zZmVyaW5nIGRhdGEuDQoNCmh0dHBzOi8vd3d3LnNoZWZmaWVsZC5hYy51ay9pdC1zZXJ2aWNlcy9yZXNlYXJjaC9ocGMvc2hhcmMNCg0KIyMgSW50ZXJhY3RpdmUgbW9kZQ0KDQpPbiBteSBXaW5kb3dzIG1hY2hpbmUgSSB1c2UgdGhlIGZyZWUgdG9vbHMgcHV0dHkgYW5kIFdpblNDUCB0byBjb25uZWN0IHRvIHRoZSBjbHVzdGVyDQoNCi0gW1dpblNDUF0oaHR0cHM6Ly93aW5zY3AubmV0L2VuZy9pbmRleC5waHApDQotIFtwdXR0eV0oaHR0cHM6Ly93d3cuY2hpYXJrLmdyZWVuZW5kLm9yZy51ay9+c2d0YXRoYW0vcHV0dHkvKQ0KDQoNCkZpcnN0bHksIGxvZ2luIHRvIHNoYXJjIHVzaW5nIHRoZSBbc3RlcHMgaW4gdGhlIGRvY3VtZW50YXRpb25dKGh0dHBzOi8vd3d3LnNoZWZmaWVsZC5hYy51ay9pdC1zZXJ2aWNlcy9yZXNlYXJjaC9ocGMvdXNpbmcvYWNjZXNzL2ludHJvKSBhbmQgdGhlbiBvcGVuIGFuIGludGVyYWN0aXZlIHNoZWxsLiBlLmcuIA0KDQpgYGB7YmFzaCBldmFsPUZBTFNFfQ0Kc3NoIFVTRVJOQU1FQHNoYXJjLnNoZWYuYWMudWsNCg0KIyMgb3BlbiBhbiBpbnRlcmFjdGl2ZSBzaGVsbCB3aXRoIDZHYiBvZiBSQU0uIENoYW5nZSBhcyByZXF1aXJlZA0KDQpxcnNoeCAtbCBybWVtPTZHDQpgYGANCg0KDQpTdGFuZGFyZCBVbml4IGNvbW1hbmRzIChlLmcuIGBsc2AsIGBjZGAsIGBwd2RgLCBgd2dldGAuLi4pIGFyZSBhbHJlYWR5IGF2YWlsYWJsZSB3aGVuIHlvdSBmaXJzdCBsb2dpbiB0byBgc2hhcmNgLiBIb3dldmVyLCB0aGUgdG9vbHMgc3BlY2lmaWMgdG8gTkdTIGFuYWx5c2lzIHdpbGwgcmVxdWlyZSB5b3UgdG8gcHJlZml4IHRoZSBwYXRoIHRvIHRoZSBzaW5ndWxhcml0eSBpbWFnZSBiZWZvcmUgdGhlIGNvbW1hbmQgdG8gcnVuIHRoZSB0b29sLg0KDQpUbyBzYXZlIHR5cGluZyB0byBwYXRoIHRvIHRoZSBzaW5ndWxhcml0eSBpbWFnZSBjYW4gYmUgc2F2ZWQgYXMgYSB2YXJpYWJsZQ0KDQpgYGB7YmFzaCBldmFsPUZBTFNFfQ0KZXhwb3J0IElNQUdFX0JBU0U9InNpbmd1bGFyaXR5IGV4ZWMgL3Vzci9sb2NhbC9jb21tdW5pdHkvYmlvaW5mb3JtYXRpY3MtY29yZS9zaW5ndWxhcml0eS9ybmFzZXEtdHJhaW5pbmcuc2lmIg0KDQpgYGANCg0KDQpMZXRzIHNheSB0aGF0IEkgaGF2ZSBzb21lIGBmYXN0cWAgZmlsZXMgaW4gdGhlIGZvbGRlciBgL2Zhc3RkYXRhL21kMW1qZHgvbXlfZmFzdHFzYCB0aGVuIEkgY291bGQgcnVuIGBmYXN0cWNgIGFzIGZvbGxvd3MuDQoNCmBgYHtiYXNoIGV2YWw9RkFMU0V9DQpjZCAvZmFzdGRhdGEvbWQxbWpkeC9teV9mYXN0cXMNCiRJTUFHRV9CQVNFIGZhc3RxYyAqLmZhc3RxLmd6DQpgYGANCg0KVGhlIHRvb2xzIGxpc3RlZCBpbiB0aGUgcHJldmlvdXMgc2VjdGlvbiBhcmUgYWxsIGF2YWlsYWJsZSwgYnV0IHRoaXMgdGltZSB0aGUgY29tbWFuZCBtdXN0IGJlIHByZWZpeGVkIHdpdGggYCRJTUFHRV9CQVNFYC4gVGhlIGNvbW1hbmRzIGxpc3RlZCBiZWxvdyB3aWxsIHR5cGljYWxseSBwcmludCB0aGUgaGVscC4gRm9yIGRldGFpbHMgb2YgaG93IHRvIHJ1biB0aGUgY29tbWFuZCBmb3IgeW91ciBhbmFseXNpcyBjb25zdWx0IHRoZSBjb3JyZXNwb25kaW5nIGRvY3VtZW50YXRpb24uDQoNCiMjIyBPdGhlciBleGFtcGxlIGNvbW1hbmRzDQoNCg0KYGBge2Jhc2ggZXZhbD1GQUxTRX0NCiRJTUFHRV9CQVNFIG11bHRpcWMNCmBgYA0KDQpgYGB7YmFzaCBldmFsPUZBTFNFfQ0KJElNQUdFX0JBU0Ugc2FsbW9uDQpgYGANCg0KDQpgYGB7YmFzaCBldmFsPUZBTFNFfQ0KJElNQUdFX0JBU0Uga2FsbGlzdG8NCmBgYA0KDQoNCmBgYHtiYXNoIGV2YWw9RkFMU0V9DQokSU1BR0VfQkFTRSBoaXNhdDItYnVpbGQNCmBgYA0KDQoNCmBgYHtiYXNoIGV2YWw9RkFMU0V9DQokSU1BR0VfQkFTRSBoaXNhdDIgDQpgYGANCg0KYGBge2Jhc2ggZXZhbD1GQUxTRX0NCiRJTUFHRV9CQVNFIFNUQVINCmBgYA0KDQpgYGB7YmFzaCBldmFsPUZBTFNFfQ0KJElNQUdFX0JBU0Ugc2FtdG9vbHMgDQpgYGANCg0KYGBge2Jhc2ggZXZhbD1GQUxTRX0NCiRJTUFHRV9CQVNFIGZlYXR1cmVDb3VudHMNCmBgYA0KDQpgYGB7YmFzaCBldmFsPUZBTFNFfQ0KJElNQUdFX0JBU0UgaHRzZXEtY291bnQNCmBgYA0KDQoNCg0KDQojIyBTY3JpcHQgc3VibWlzc2lvbg0KDQoNCg0KIyBBbmFseXNpcyBvbiBhbm90aGVyIGNvbXB1dGluZyBjbHVzdGVyDQoNCklmIHlvdSBhcmUgb3V0c2lkZSB0aGUgVW5pdmVyc2l0eSBvZiBTaGVmZmllbGQgV2UgYXJlIG5vdCBhYmxlIHRvIG9mZmVyIGEgZ3JlYXQgZGVhbCBvZiBzdXBwb3J0IGZvciBhbmFseXNpcyBvbiB5b3VyIGluc3RpdHV0ZXMnIGNvbXB1dGluZyBlbnZpcm9ubWVudC4gSW4gYnJpZWYsIHRoZSBgc2luZ3VsYXJpdHlgIHRvb2wgd2lsbCBuZWVkIHRvIGJlIGluc3RhbGxlZCwgd2hpY2ggY2FuIHRoZW4gYmUgdXNlZCB0byBjb252ZXJ0IHRoZSBkb2NrZXIgY29udGFpbmVyIGludG8gYSBjb3JyZXNwb25kaW5nIHNpbmd1bGFyaXR5IGZpbGUuIA0KDQpgYGANCnNpbmd1bGFyaXR5IGJ1aWxkIHJuYXNlcS10cmFpbmluZy5zaWYgZG9ja2VyOi8vc2hlZmZpZWxkYmlvaW5mb3JtYXRpY3Mvcm5hc2VxLXRyYWluaW5nDQpgYGANCg0KDQoNCiMgT3RoZXIgTkdTIGFuYWx5c2VzDQoNCiMjIENoSVAtc2VxDQoNCg0KIyMjIGRvY2tlcg0KDQpUaGUgY29tbWFuZCB0byBydW4gdGhlIGRvY2tlciBjb250YWluZXIgZm9yIHRoaXMgaXM6LQ0KDQpgYGANCmRvY2tlciBydW4gLS1ybSAgLWl0IC12IC9jL3dvcmsvbXlfZmFzdHFfZGF0YTovZGF0YSBzaGVmZmllbGRiaW9pbmZvcm1hdGljcy9jaGlwc2VxLXRyYWluaW5nDQpgYGANCg0KDQpQcm92aWRpbmcgdGhlIGZvbGxvd2luZyBzb2Z0d2FyZQ0KDQpgYGANCiMgcWMNCmZhc3RxYw0KbXVsdGlxYw0KDQojIHRyaW1taW5nDQpjdXRhZGFwdA0KDQoNCiMgYWxpZ25tZW50DQoNCmJvd3RpZTINCg0KIyBwZWFrLWNhbGxpbmcNCg0KbWFjczINCg0KIyBkb3duc3RyZWFtDQoNCm1lbWUNCg0KIyBnZW5lcmFsDQoNCnNhbXRvb2xzDQpiZWR0b29scw0KDQojIFNSQSB0b29sa2l0DQoNCmZhc3RxLWR1bXANCmBgYA0KDQpUaGUgcGljYXJkIHN1aXRlIG9mIHRvb2xzIGNhbiBhbHNvIGJlIGFjY2Vzc2VkDQoNCmBgYA0KamF2YSAtamFyICRQSUNBUkQNCmBgDQoNCg0KIyMjIFVvUyBjb21wdXRpbmcgY2x1c3Rlcg0KDQpgYGANCmV4cG9ydCBJTUFHRV9CQVNFPSJzaW5ndWxhcml0eSBleGVjIC91c3IvbG9jYWwvY29tbXVuaXR5L2Jpb2luZm9ybWF0aWNzLWNvcmUvc2luZ3VsYXJpdHkvY2hpcHNlcS10cmFpbmluZy5zaWYiDQpgYGANCg0KDQojIyBWYXJpYW50LWNhbGxpbmcNCg0KQ29taW5nIHNvb24uLi4uDQoNCg==