Use miRDeep2 (Friedländer et al. 2011) to identify potential miRNAs using A.pulchra sRNAseq reads. The A.millepora genome will be used as the reference genome for A.pulchra, as A.pulchra does not currently have a sequenced genome and A.millepora had highest alignment rates for standard RNAseq data compared to other published genomes tested. The mature miRBase miRNA database will also be used.


Inputs:

Outputs:

  • Primary outputs are a result table in BED, CSV (tab-delimited), and HTML formats.

  • Due to the nature of mirDeep2’s naming, trying to use variable names is challenging. As such, the chunks processing those files will require manual intervention to identify and provide the output filename(s); they are not handled at in the .bashvars file at the top of this script.

  • Other output files are too large for GitHub (and some (all?) are not needed for this analysis). Please find a full backup here:

https://gannet.fish.washington.edu/Atumefaciens/gitrepos/deep-dive/D-Apul/output/11.1-Apul-sRNAseq-miRdeep2-31bp-fastp-merged/


1 Create a Bash variables file

This allows usage of Bash variables across R Markdown chunks.

{
echo "#### Assign Variables ####"
echo ""

echo "# Trimmed FastQ naming pattern"
echo "export trimmed_fastqs_pattern='*fastp-adapters-polyG-31bp-merged.fq.gz'"
echo ""

echo "# Data directories"
echo 'export deep_dive_dir=/home/shared/8TB_HDD_01/sam/gitrepos/deep-dive'
echo 'export deep_dive_data_dir="${deep_dive_dir}/data"'
echo 'export output_dir_top=${deep_dive_dir}/D-Apul/output/11.1-Apul-sRNAseq-miRdeep2-31bp-fastp-merged'
echo 'export genome_fasta_dir=${deep_dive_dir}/D-Apul/data/Amil/ncbi_dataset/data/GCF_013753865.1'
echo 'export trimmed_fastqs_dir="${deep_dive_dir}/D-Apul/output/08.2-Apul-sRNAseq-trimming-31bp-fastp-merged/trimmed-reads"'
echo 'export collapsed_reads_dir="${deep_dive_dir}/D-Apul/output/10.1-Apul-sRNAseq-BLASTn-31bp-fastp-merged-cnidarian_miRBase"'
echo ""

echo "# Input/Output files"
echo 'export collapsed_reads_fasta="collapsed-reads-all.fasta"'
echo 'export collapsed_reads_mirdeep2="collapsed-reads-all-mirdeep2.fasta"'
echo 'export collapsed_reads_gt17bp_mirdeep2="collapsed_reads_gt17bp_mirdeep2.fasta"'
echo 'export concatenated_trimmed_reads_fastq="concatenated-trimmed-reads-all.fastq.gz"'
echo 'export genome_fasta_name="GCF_013753865.1_Amil_v2.1_genomic.fna"'
echo 'export genome_fasta_no_spaces="GCF_013753865.1_Amil_v2.1_genomic-no_spaces.fna"'
echo 'export mirdeep2_mapping_file="Apul-mirdeep2-mapping.arf"'
echo 'export mirbase_mature_fasta_name="cnidarian-mirbase-mature-v22.1.fasta"'
echo 'export mirbase_mature_fasta_no_spaces="cnidarian-mirbase-mature-v22.1-no_spaces.fa"'
echo ""


echo "# Paths to programs"
echo 'export mirdeep2_mapper="mapper.pl"'
echo 'export mirdeep2="miRDeep2.pl"'
echo 'export mirdeep2_fastaparse="fastaparse.pl"'
echo 'export bowtie_build="/home/shared/bowtie-1.3.1-linux-x86_64/bowtie-build"'
echo ""

echo "# Set number of CPUs to use"
echo 'export threads=40'
echo ""



} > .bashvars

cat .bashvars
#### Assign Variables ####

# Trimmed FastQ naming pattern
export trimmed_fastqs_pattern='*fastp-adapters-polyG-31bp-merged.fq.gz'

# Data directories
export deep_dive_dir=/home/shared/8TB_HDD_01/sam/gitrepos/deep-dive
export deep_dive_data_dir="${deep_dive_dir}/data"
export output_dir_top=${deep_dive_dir}/D-Apul/output/11.1-Apul-sRNAseq-miRdeep2-31bp-fastp-merged
export genome_fasta_dir=${deep_dive_dir}/D-Apul/data/Amil/ncbi_dataset/data/GCF_013753865.1
export trimmed_fastqs_dir="${deep_dive_dir}/D-Apul/output/08.2-Apul-sRNAseq-trimming-31bp-fastp-merged/trimmed-reads"
export collapsed_reads_dir="${deep_dive_dir}/D-Apul/output/10.1-Apul-sRNAseq-BLASTn-31bp-fastp-merged-cnidarian_miRBase"

# Input/Output files
export collapsed_reads_fasta="collapsed-reads-all.fasta"
export collapsed_reads_mirdeep2="collapsed-reads-all-mirdeep2.fasta"
export collapsed_reads_gt17bp_mirdeep2="collapsed_reads_gt17bp_mirdeep2.fasta"
export concatenated_trimmed_reads_fastq="concatenated-trimmed-reads-all.fastq.gz"
export genome_fasta_name="GCF_013753865.1_Amil_v2.1_genomic.fna"
export genome_fasta_no_spaces="GCF_013753865.1_Amil_v2.1_genomic-no_spaces.fna"
export mirdeep2_mapping_file="Apul-mirdeep2-mapping.arf"
export mirbase_mature_fasta_name="cnidarian-mirbase-mature-v22.1.fasta"
export mirbase_mature_fasta_no_spaces="cnidarian-mirbase-mature-v22.1-no_spaces.fa"

# Paths to programs
export mirdeep2_mapper="mapper.pl"
export mirdeep2="miRDeep2.pl"
export mirdeep2_fastaparse="fastaparse.pl"
export bowtie_build="/home/shared/bowtie-1.3.1-linux-x86_64/bowtie-build"

# Set number of CPUs to use
export threads=40

2 Prepare reads for miRDeep2

Per miRDeep2 documentation:

The readID must end with _xNumber and is not allowed to contain whitespaces. has to have the format name_uniqueNumber_xnumber

# Load bash variables into memory
source .bashvars

# Append miRDeep2 to system PATH and set PERL5LIB
export PATH=$PATH:/home/shared/mirdeep2/bin
export PERL5LIB=$PERL5LIB:/home/shared/mirdeep2/lib/perl5

mkdir --parents "${output_dir_top}"


sed '/^>/ s/-/_x/g' "${collapsed_reads_dir}/${collapsed_reads_fasta}" \
| sed '/^>/ s/>/>seq_/' \
> "${output_dir_top}/${collapsed_reads_mirdeep2}"

# Filter for reads at least 17 bases long
# Min. read length required for MirDeep2
${mirdeep2_fastaparse} \
"${output_dir_top}/${collapsed_reads_mirdeep2}" \
-a 17 \
> "${output_dir_top}/${collapsed_reads_gt17bp_mirdeep2}" \
2> /dev/null

grep "^>" ${collapsed_reads_dir}/${collapsed_reads_fasta} \
| head

echo ""
echo "--------------------------------------------------"
echo ""

grep "^>" ${output_dir_top}/${collapsed_reads_gt17bp_mirdeep2} \
| head
>1-1843196
>2-1083086
>3-967720
>4-832824
>5-750080
>6-691325
>7-659957
>8-606529
>9-571297
>10-528956

--------------------------------------------------

>seq_1_x1843196
>seq_2_x1083086
>seq_3_x967720
>seq_4_x832824
>seq_5_x750080
>seq_6_x691325
>seq_7_x659957
>seq_8_x606529
>seq_9_x571297
>seq_10_x528956

3 Reformat genome FastA description lines

miRDeep2 can’t process genome FastAs with spaces in the description lines.

So, I’m replacing spaces with underscores.

And, for aesthetics, I’m also removing commas.

# Load bash variables into memory
source .bashvars


sed '/^>/ s/ /_/g' "${genome_fasta_dir}/${genome_fasta_name}" \
| sed '/^>/ s/,//g' \
> "${genome_fasta_dir}/${genome_fasta_no_spaces}"

grep "^>" ${genome_fasta_dir}/${genome_fasta_name} \
| head

echo ""
echo "--------------------------------------------------"
echo ""

grep "^>" ${genome_fasta_dir}/${genome_fasta_no_spaces} \
| head
>NC_058066.1 Acropora millepora isolate JS-1 chromosome 1, Amil_v2.1, whole genome shotgun sequence
>NC_058067.1 Acropora millepora isolate JS-1 chromosome 2, Amil_v2.1, whole genome shotgun sequence
>NC_058068.1 Acropora millepora isolate JS-1 chromosome 3, Amil_v2.1, whole genome shotgun sequence
>NC_058069.1 Acropora millepora isolate JS-1 chromosome 4, Amil_v2.1, whole genome shotgun sequence
>NC_058070.1 Acropora millepora isolate JS-1 chromosome 5, Amil_v2.1, whole genome shotgun sequence
>NC_058071.1 Acropora millepora isolate JS-1 chromosome 6, Amil_v2.1, whole genome shotgun sequence
>NC_058072.1 Acropora millepora isolate JS-1 chromosome 7, Amil_v2.1, whole genome shotgun sequence
>NC_058073.1 Acropora millepora isolate JS-1 chromosome 8, Amil_v2.1, whole genome shotgun sequence
>NC_058074.1 Acropora millepora isolate JS-1 chromosome 9, Amil_v2.1, whole genome shotgun sequence
>NC_058075.1 Acropora millepora isolate JS-1 chromosome 10, Amil_v2.1, whole genome shotgun sequence

--------------------------------------------------

>NC_058066.1_Acropora_millepora_isolate_JS-1_chromosome_1_Amil_v2.1_whole_genome_shotgun_sequence
>NC_058067.1_Acropora_millepora_isolate_JS-1_chromosome_2_Amil_v2.1_whole_genome_shotgun_sequence
>NC_058068.1_Acropora_millepora_isolate_JS-1_chromosome_3_Amil_v2.1_whole_genome_shotgun_sequence
>NC_058069.1_Acropora_millepora_isolate_JS-1_chromosome_4_Amil_v2.1_whole_genome_shotgun_sequence
>NC_058070.1_Acropora_millepora_isolate_JS-1_chromosome_5_Amil_v2.1_whole_genome_shotgun_sequence
>NC_058071.1_Acropora_millepora_isolate_JS-1_chromosome_6_Amil_v2.1_whole_genome_shotgun_sequence
>NC_058072.1_Acropora_millepora_isolate_JS-1_chromosome_7_Amil_v2.1_whole_genome_shotgun_sequence
>NC_058073.1_Acropora_millepora_isolate_JS-1_chromosome_8_Amil_v2.1_whole_genome_shotgun_sequence
>NC_058074.1_Acropora_millepora_isolate_JS-1_chromosome_9_Amil_v2.1_whole_genome_shotgun_sequence
>NC_058075.1_Acropora_millepora_isolate_JS-1_chromosome_10_Amil_v2.1_whole_genome_shotgun_sequence

4 Reformat cnidarian miRBase FastA description lines

# Load bash variables into memory
source .bashvars


sed '/^>/ s/ /_/g' "${deep_dive_data_dir}/${mirbase_mature_fasta_name}" \
| sed '/^>/ s/,//g' \
> "${deep_dive_data_dir}/${mirbase_mature_fasta_no_spaces}"

grep "^>" ${deep_dive_data_dir}/${mirbase_mature_fasta_name} \
| head

echo ""
echo "--------------------------------------------------"
echo ""

grep "^>" ${deep_dive_data_dir}/${mirbase_mature_fasta_no_spaces} \
| head
>cel-let-7-5p MIMAT0000001 Caenorhabditis elegans let-7-5p
>cel-let-7-3p MIMAT0015091 Caenorhabditis elegans let-7-3p
>cel-lin-4-5p MIMAT0000002 Caenorhabditis elegans lin-4-5p
>cel-lin-4-3p MIMAT0015092 Caenorhabditis elegans lin-4-3p
>cel-miR-1-5p MIMAT0020301 Caenorhabditis elegans miR-1-5p
>cel-miR-1-3p MIMAT0000003 Caenorhabditis elegans miR-1-3p
>cel-miR-2-5p MIMAT0020302 Caenorhabditis elegans miR-2-5p
>cel-miR-2-3p MIMAT0000004 Caenorhabditis elegans miR-2-3p
>cel-miR-34-5p MIMAT0000005 Caenorhabditis elegans miR-34-5p
>cel-miR-34-3p MIMAT0015093 Caenorhabditis elegans miR-34-3p

--------------------------------------------------

>cel-let-7-5p_MIMAT0000001_Caenorhabditis_elegans_let-7-5p
>cel-let-7-3p_MIMAT0015091_Caenorhabditis_elegans_let-7-3p
>cel-lin-4-5p_MIMAT0000002_Caenorhabditis_elegans_lin-4-5p
>cel-lin-4-3p_MIMAT0015092_Caenorhabditis_elegans_lin-4-3p
>cel-miR-1-5p_MIMAT0020301_Caenorhabditis_elegans_miR-1-5p
>cel-miR-1-3p_MIMAT0000003_Caenorhabditis_elegans_miR-1-3p
>cel-miR-2-5p_MIMAT0020302_Caenorhabditis_elegans_miR-2-5p
>cel-miR-2-3p_MIMAT0000004_Caenorhabditis_elegans_miR-2-3p
>cel-miR-34-5p_MIMAT0000005_Caenorhabditis_elegans_miR-34-5p
>cel-miR-34-3p_MIMAT0015093_Caenorhabditis_elegans_miR-34-3p

5 Bowtie v1 genome index

miRDeep2 requires a Bowtie v1 genome index - cannot use Bowtie2 index

# Load bash variables into memory
source .bashvars

# Check for existence of genome index first
if [ ! -f "${genome_fasta_no_spaces%.*}.[0-9].ebwt" ]; then
  ${bowtie_build} \
  ${genome_fasta_dir}/${genome_fasta_no_spaces} \
  ${genome_fasta_dir}/${genome_fasta_no_spaces%.*} \
  --threads ${threads} \
  --quiet
fi

6 Map reads to genome

Requires genome to be previously indexed with Bowtie.

Additionally, requires user to enter path to their mirdeep2 directory as well as their perl5 installation.

# Load bash variables into memory
source .bashvars

# Append miRDeep2 to system PATH and set PERL5LIB
export PATH=$PATH:/home/shared/mirdeep2/bin
export PERL5LIB=$PERL5LIB:/home/shared/mirdeep2/lib/perl5

# Run miRDeep2 mapping
time \
${mirdeep2_mapper} \
${output_dir_top}/${collapsed_reads_gt17bp_mirdeep2} \
-c \
-p ${genome_fasta_dir}/${genome_fasta_no_spaces%.*} \
-t ${output_dir_top}/${mirdeep2_mapping_file} \
-o ${threads}

7 Run miRDeep2

Recommendation is to use the closest related species in the miRDeep2 options, even if the species isn’t very closely related. The documentation indicates that miRDeep2 is always more accurate when at least a species is provided.

The options provided to the command are as follows:

  • none: Known miRNAs of the species being analyzed.
  • -t S.pupuratus: Related species.
  • none: Known miRNA precursors in this species.
  • -P: Specifies miRBase version > 18.
  • -v: Remove temporary files after completion.
  • -g -1: Number of precursors to analyze. A setting of -1 will analyze all. Default is 50,000 I set this to -1 after multiple attempts to run using the default kept failing.

NOTE: This will take an extremely long time to run (days). Could possibly be shortened by excluding randfold analysis.

# Load bash variables into memory
source .bashvars

# Append miRDeep2 to system PATH and set PERL5LIB
export PATH=$PATH:/home/shared/mirdeep2/bin
export PERL5LIB=$PERL5LIB:/home/shared/mirdeep2/lib/perl5

time \
${mirdeep2} \
${output_dir_top}/${collapsed_reads_gt17bp_mirdeep2} \
${genome_fasta_dir}/${genome_fasta_no_spaces} \
${output_dir_top}/${mirdeep2_mapping_file} \
none \
${deep_dive_data_dir}/${mirbase_mature_fasta_no_spaces} \
none \
-t S.purpuratus \
-P \
-v \
-g -1 \
2>${output_dir_top}/miRDeep2-S.purpuratus-report.log

7.1 Check runtime

# Load bash variables into memory
source .bashvars

tail -n 6 ${output_dir_top}/miRDeep2-S.purpuratus-report.log
miRDeep runtime: 

started: 13:0:39
ended: 12:37:10
total:23h:36m:31s

8 Move output files to output directory

MiRDeep2 outputs all files to the current working directly with no way to redirect so want to move to intended output directory.

8.1 Move output files

Output files will be in the format of result_* and error_*

# Load bash variables into memory
source .bashvars

for file in result_* error_*
do
  mv "${file}" "${output_dir_top}/"
done

8.2 Identify directories

# Load bash variables into memory
source .bashvars

ls -l | grep "^d"
drwxrwxr-x 3 sam sam    4096 Oct 30 14:00 07-Apul-lncRNA-dist_files
drwxr-xr-x 4 sam sam    4096 Feb 12 10:38 08.1-Dapul-sRNAseq-trimming-R1-only_cache
drwxr-xr-x 4 sam sam    4096 Apr  1 14:06 10.1-Apul-sRNAseq-BLASTn-31bp-fastp-merged-cnidarian_miRBase_cache
drwxr-xr-x 4 sam sam    4096 Nov  7 14:29 10-Apul-sRNAseq-BLASTn_cache
drwxr-xr-x 4 sam sam    4096 Apr 19 12:22 11.1-Apul-sRNAseq-miRdeep2-31bp-fastp-merged_cache
drwxr-xr-x 3 sam sam    4096 Nov  2 13:10 12-Apul-sRNAseq-MirMachine_cache
drwxr-xr-x 4 sam sam    4096 Feb 15 13:35 13.1.1-Apul-sRNAseq-ShortStack-R1-reads-cnidarian_miRBase_cache
drwxr-xr-x 4 sam sam    4096 Feb 13 11:20 13.1-Apul-sRNAseq-ShortStack-R1-reads_cache
drwxr-xr-x 4 sam sam    4096 Feb 15 12:27 13.2.1-Apul-sRNAseq-ShortStack-31bp-fastp-merged-cnidarian_miRBase_cache
drwxr-xr-x 4 sam sam    4096 Feb 15 08:39 13.2-Apul-sRNAseq-ShortStack-31bp-fastp-merged_cache
drwxr-xr-x 4 sam sam    4096 Nov  5 17:39 13-Apul-sRNAseq-ShortStack_cache
drwxrwxr-x 3 sam sam    4096 May  5  2023 rsconnect

8.3 Rsync directories

# Load bash variables into memory
source .bashvars

rsync -aP . --include='dir***' --exclude='*' --quiet "${output_dir_top}/"

rsync -aP . --include='map***' --exclude='*' --quiet "${output_dir_top}/"

rsync -aP . --exclude='mirgene*' --include='mir***' --exclude='*' --quiet "${output_dir_top}/"

rsync -aP . --include='pdfs***' --exclude='*' --quiet "${output_dir_top}/"

echo ""
echo "Check new location:"
echo ""

ls -l "${output_dir_top}/" | grep "^d"

8.4 Confirm deletion patterns work before deletion!

FYI - eval=FALSE is set because the following command will only work once…

ls --directory dir_* mapper_logs mirdeep_runs mirna_results* pdfs_*

8.5 Remove directories from code directory

# Load bash variables into memory
source .bashvars

rm -rf dir_* mapper_logs mirdeep_runs mirna_results* pdfs_*

8.6 Check to make sure they’re gone

ls --directory dir_* mapper_logs mirdeep_runs mirna_results* pdfs_*
ls: cannot access 'dir_*': No such file or directory
ls: cannot access 'mapper_logs': No such file or directory
ls: cannot access 'mirdeep_runs': No such file or directory
ls: cannot access 'mirna_results*': No such file or directory
ls: cannot access 'pdfs_*': No such file or directory

9 Results

9.1 Peep output file format

The formatting of this CSV is terrible. It has a 3-column table on top of a 17-column table. This makes parsing a bit of a pain in its raw format.

# Load bash variables into memory
source .bashvars


head -n 30 "${output_dir_top}/result_03_04_2024_t_13_00_39.csv"
miRDeep2 score  estimated signal-to-noise   excision gearing
10  7.3 1
9   7.2 1
8   7.3 1
7   7.3 1
6   7.2 1
5   6.8 1
4   5.8 1
3   4.7 1
2   3.1 1
1   2.4 1
0   2.1 1
-1  1.6 1
-2  1.2 1
-3  1   1
-4  1   1
-5  1   1
-6  1   1
-7  1   1
-8  1   1
-9  1   1
-10 1   1



novel miRNAs predicted by miRDeep2
provisional id  miRDeep2 score  estimated probability that the miRNA candidate is a true positive   rfam alert  total read count    mature read count   loop read count star read count significant randfold p-value    miRBase miRNA   example miRBase miRNA with the same seed    UCSC browser    NCBI blastn consensus mature sequence   consensus star sequence consensus precursor sequence    precursor coordinate
NC_058066.1_Acropora_millepora_isolate_JS-1_chromosome_1_Amil_v2.1_whole_genome_shotgun_sequence_49320  127017.5        -   249134  248655  0   479 no  -   nve-miR-9437_MIMAT0035398_Nematostella_vectensis_miR-9437   -   -   uuaacgaguagauaaaugaagaga    cuucguuuauucacucguucaua cuucguuuauucacucguucauauuuauuauuaacgaguagauaaaugaagaga  NC_058066.1_Acropora_millepora_isolate_JS-1_chromosome_1_Amil_v2.1_whole_genome_shotgun_sequence:20346247..20346301:-
NC_058070.1_Acropora_millepora_isolate_JS-1_chromosome_5_Amil_v2.1_whole_genome_shotgun_sequence_208678 40616.1     -   79661   79121   0   540 no  -   hsa-miR-4330_MIMAT0016924_Homo_sapiens_miR-4330 -   -   ucucagauuacaguaguuaagu  cuuaacuacugcaaucugaacau ucucagauuacaguaguuaaguaauuaaauacuuaacuacugcaaucugaacau  NC_058070.1_Acropora_millepora_isolate_JS-1_chromosome_5_Amil_v2.1_whole_genome_shotgun_sequence:11598966..11599020:+
NC_058068.1_Acropora_millepora_isolate_JS-1_chromosome_3_Amil_v2.1_whole_genome_shotgun_sequence_123927 40339.4     -   79122   73935   0   5187    no  -   bdi-miR7733-3p_MIMAT0030201_Brachypodium_distachyon_miR7733-3p  -   -   ucugcguuaucggugaaauugu  auuucacuagauaagcgcuaac  auuucacuagauaagcgcuaacuguuauuguucugcguuaucggugaaauugu   NC_058068.1_Acropora_millepora_isolate_JS-1_chromosome_3_Amil_v2.1_whole_genome_shotgun_sequence:597846..597899:+

9.2 Create more easily parasable results file

This will match the line beginning with provisional id and print to the end of the file (represented by the $p. $ = end, p = print)

# Load bash variables into memory
source .bashvars


sed --quiet '/provisional id/,$p' "${output_dir_top}/result_03_04_2024_t_13_00_39.csv" \
> "${output_dir_top}/parsable-result_03_04_2024_t_13_00_39.csv"

head "${output_dir_top}/parsable-result_03_04_2024_t_13_00_39.csv"
provisional id  miRDeep2 score  estimated probability that the miRNA candidate is a true positive   rfam alert  total read count    mature read count   loop read count star read count significant randfold p-value    miRBase miRNA   example miRBase miRNA with the same seed    UCSC browser    NCBI blastn consensus mature sequence   consensus star sequence consensus precursor sequence    precursor coordinate
NC_058066.1_Acropora_millepora_isolate_JS-1_chromosome_1_Amil_v2.1_whole_genome_shotgun_sequence_49320  127017.5        -   249134  248655  0   479 no  -   nve-miR-9437_MIMAT0035398_Nematostella_vectensis_miR-9437   -   -   uuaacgaguagauaaaugaagaga    cuucguuuauucacucguucaua cuucguuuauucacucguucauauuuauuauuaacgaguagauaaaugaagaga  NC_058066.1_Acropora_millepora_isolate_JS-1_chromosome_1_Amil_v2.1_whole_genome_shotgun_sequence:20346247..20346301:-
NC_058070.1_Acropora_millepora_isolate_JS-1_chromosome_5_Amil_v2.1_whole_genome_shotgun_sequence_208678 40616.1     -   79661   79121   0   540 no  -   hsa-miR-4330_MIMAT0016924_Homo_sapiens_miR-4330 -   -   ucucagauuacaguaguuaagu  cuuaacuacugcaaucugaacau ucucagauuacaguaguuaaguaauuaaauacuuaacuacugcaaucugaacau  NC_058070.1_Acropora_millepora_isolate_JS-1_chromosome_5_Amil_v2.1_whole_genome_shotgun_sequence:11598966..11599020:+
NC_058068.1_Acropora_millepora_isolate_JS-1_chromosome_3_Amil_v2.1_whole_genome_shotgun_sequence_123927 40339.4     -   79122   73935   0   5187    no  -   bdi-miR7733-3p_MIMAT0030201_Brachypodium_distachyon_miR7733-3p  -   -   ucugcguuaucggugaaauugu  auuucacuagauaagcgcuaac  auuucacuagauaagcgcuaacuguuauuguucugcguuaucggugaaauugu   NC_058068.1_Acropora_millepora_isolate_JS-1_chromosome_3_Amil_v2.1_whole_genome_shotgun_sequence:597846..597899:+
NC_058071.1_Acropora_millepora_isolate_JS-1_chromosome_6_Amil_v2.1_whole_genome_shotgun_sequence_256047 39769.6     -   78001   65898   0   12103   no  -   nve-miR-2023-3p_MIMAT0009756_Nematostella_vectensis_miR-2023-3p -   -   aaagaaguacaagugguaggg   cugcuacuuggacuuuuuuca   cugcuacuuggacuuuuuucacguuuaucgaugaaagaaguacaagugguaggg  NC_058071.1_Acropora_millepora_isolate_JS-1_chromosome_6_Amil_v2.1_whole_genome_shotgun_sequence:8840769..8840823:+
NC_058068.1_Acropora_millepora_isolate_JS-1_chromosome_3_Amil_v2.1_whole_genome_shotgun_sequence_123929 38710.3     -   75924   73935   0   1989    no  -   bdi-miR7733-3p_MIMAT0030201_Brachypodium_distachyon_miR7733-3p  -   -   ucugcguuaucggugaaauugu  auuucacuagaugagcgcuaac  auuucacuagaugagcgcuaacuguuauuguucugcguuaucggugaaauugu   NC_058068.1_Acropora_millepora_isolate_JS-1_chromosome_3_Amil_v2.1_whole_genome_shotgun_sequence:598142..598195:+
NC_058073.1_Acropora_millepora_isolate_JS-1_chromosome_8_Amil_v2.1_whole_genome_shotgun_sequence_341478 25654.9     -   50316   49080   0   1236    no  -   mtr-miR2651_MIMAT0013423_Medicago_truncatula_miR2651    -   -   auugauuguagacaagccucuga aggguauugucuaugaucaaaaa aggguauugucuaugaucaaaaauuuuauuauugauuguagacaagccucuga   NC_058073.1_Acropora_millepora_isolate_JS-1_chromosome_8_Amil_v2.1_whole_genome_shotgun_sequence:11426819..11426872:-
NC_058075.1_Acropora_millepora_isolate_JS-1_chromosome_10_Amil_v2.1_whole_genome_shotgun_sequence_406883    20352.5     -   39917   39897   0   20  no  -   mmu-miR-7664-5p_MIMAT0029834_Mus_musculus_miR-7664-5p   -   -   uaguuuacaggcucaacuuugcu ggaguugaucuuguaaac  uaguuuacaggcucaacuuugcuuuaaagggaguugaucuuguaaac NC_058075.1_Acropora_millepora_isolate_JS-1_chromosome_10_Amil_v2.1_whole_genome_shotgun_sequence:15858707..15858754:-
NC_058067.1_Acropora_millepora_isolate_JS-1_chromosome_2_Amil_v2.1_whole_genome_shotgun_sequence_81558  14705.5     -   28847   27971   0   876 no  -   -   -   -   uaggcguauuuccgauugucc   gacagccggaacuacgucugu   uaggcguauuuccgauuguccuuuuacuacgacagccggaacuacgucugu NC_058067.1_Acropora_millepora_isolate_JS-1_chromosome_2_Amil_v2.1_whole_genome_shotgun_sequence:21549048..21549099:+
NC_058077.1_Acropora_millepora_isolate_JS-1_chromosome_12_Amil_v2.1_whole_genome_shotgun_sequence_459486    12860.5     -   25227   25162   0   65  no  -   -   -   -   agugcacuuuucucaggaugaa  cuucuugagaaaauuucaccca  agugcacuuuucucaggaugaauugaauucuucuugagaaaauuucaccca NC_058077.1_Acropora_millepora_isolate_JS-1_chromosome_12_Amil_v2.1_whole_genome_shotgun_sequence:21629096..21629147:+

9.3 Read in output CSV

This chunk provides a more concise overview of the data and it’s columns.

mirdeep_result.df <- read.csv("../output/11.1-Apul-sRNAseq-miRdeep2-31bp-fastp-merged/parsable-result_03_04_2024_t_13_00_39.csv",
                              header = TRUE,
                              sep = "\t")

str(mirdeep_result.df)
'data.frame':   896 obs. of  17 variables:
 $ provisional.id                                                   : chr  "NC_058066.1_Acropora_millepora_isolate_JS-1_chromosome_1_Amil_v2.1_whole_genome_shotgun_sequence_49320" "NC_058070.1_Acropora_millepora_isolate_JS-1_chromosome_5_Amil_v2.1_whole_genome_shotgun_sequence_208678" "NC_058068.1_Acropora_millepora_isolate_JS-1_chromosome_3_Amil_v2.1_whole_genome_shotgun_sequence_123927" "NC_058071.1_Acropora_millepora_isolate_JS-1_chromosome_6_Amil_v2.1_whole_genome_shotgun_sequence_256047" ...
 $ miRDeep2.score                                                   : num  127018 40616 40339 39770 38710 ...
 $ estimated.probability.that.the.miRNA.candidate.is.a.true.positive: logi  NA NA NA NA NA NA ...
 $ rfam.alert                                                       : chr  "-" "-" "-" "-" ...
 $ total.read.count                                                 : int  249134 79661 79122 78001 75924 50316 39917 28847 25227 24755 ...
 $ mature.read.count                                                : int  248655 79121 73935 65898 73935 49080 39897 27971 25162 24435 ...
 $ loop.read.count                                                  : int  0 0 0 0 0 0 0 0 0 0 ...
 $ star.read.count                                                  : int  479 540 5187 12103 1989 1236 20 876 65 320 ...
 $ significant.randfold.p.value                                     : chr  "no" "no" "no" "no" ...
 $ miRBase.miRNA                                                    : chr  "-" "-" "-" "-" ...
 $ example.miRBase.miRNA.with.the.same.seed                         : chr  "nve-miR-9437_MIMAT0035398_Nematostella_vectensis_miR-9437" "hsa-miR-4330_MIMAT0016924_Homo_sapiens_miR-4330" "bdi-miR7733-3p_MIMAT0030201_Brachypodium_distachyon_miR7733-3p" "nve-miR-2023-3p_MIMAT0009756_Nematostella_vectensis_miR-2023-3p" ...
 $ UCSC.browser                                                     : chr  "-" "-" "-" "-" ...
 $ NCBI.blastn                                                      : chr  "-" "-" "-" "-" ...
 $ consensus.mature.sequence                                        : chr  "uuaacgaguagauaaaugaagaga" "ucucagauuacaguaguuaagu" "ucugcguuaucggugaaauugu" "aaagaaguacaagugguaggg" ...
 $ consensus.star.sequence                                          : chr  "cuucguuuauucacucguucaua" "cuuaacuacugcaaucugaacau" "auuucacuagauaagcgcuaac" "cugcuacuuggacuuuuuuca" ...
 $ consensus.precursor.sequence                                     : chr  "cuucguuuauucacucguucauauuuauuauuaacgaguagauaaaugaagaga" "ucucagauuacaguaguuaaguaauuaaauacuuaacuacugcaaucugaacau" "auuucacuagauaagcgcuaacuguuauuguucugcguuaucggugaaauugu" "cugcuacuuggacuuuuuucacguuuaucgaugaaagaaguacaagugguaggg" ...
 $ precursor.coordinate                                             : chr  "NC_058066.1_Acropora_millepora_isolate_JS-1_chromosome_1_Amil_v2.1_whole_genome_shotgun_sequence:20346247..20346301:-" "NC_058070.1_Acropora_millepora_isolate_JS-1_chromosome_5_Amil_v2.1_whole_genome_shotgun_sequence:11598966..11599020:+" "NC_058068.1_Acropora_millepora_isolate_JS-1_chromosome_3_Amil_v2.1_whole_genome_shotgun_sequence:597846..597899:+" "NC_058071.1_Acropora_millepora_isolate_JS-1_chromosome_6_Amil_v2.1_whole_genome_shotgun_sequence:8840769..8840823:+" ...

9.4 miRNAs count data

This provides some rudimentary numbers for the miRDeep2 output.

Further analysis is possibly desired to evaluate score thresholds, miRNA families, etc.

# Load bash variables into memory
source .bashvars

# Total predicted miRNAS
total_miRNAs=$(awk 'NR > 1' ${output_dir_top}/parsable-result_03_04_2024_t_13_00_39.csv \
| wc -l
)

echo "Total of predicted miRNAs: ${total_miRNAs}"
echo ""

# Matches to known mature miRNAs
mature_miRNAs=$(awk -F'\t' '$11 != "-" && $11 != "" {print $11}' ${output_dir_top}/parsable-result_03_04_2024_t_13_00_39.csv \
| wc -l
)

echo "Number of seed matches to known miRNAS: ${mature_miRNAs}"
echo ""

# Novel miRNAs
novel_miRNAs=$(awk -F "\t" '$11 == "-" || $11 == "" {print $11}' ${output_dir_top}/parsable-result_03_04_2024_t_13_00_39.csv \
| awk 'NR > 1' \
| wc -l
)

echo "Number of novel miRNAs: ${novel_miRNAs}"
Total of predicted miRNAs: 896

Number of seed matches to known miRNAS: 777

Number of novel miRNAs: 119

Citations

Friedländer, Marc R., Sebastian D. Mackowiak, Na Li, Wei Chen, and Nikolaus Rajewsky. 2011. “miRDeep2 Accurately Identifies Known and Hundreds of Novel microRNA Genes in Seven Animal Clades.” Nucleic Acids Research 40 (1): 37–52. https://doi.org/10.1093/nar/gkr688.
LS0tCnRpdGxlOiAiMTEuMS1BcHVsLXNSTkFzZXEtbWlSZGVlcDItMzFicC1mYXN0cC1tZXJnZWQiCmF1dGhvcjogIlNhbSBXaGl0ZSIKZGF0ZTogIjIwMjQtMDQtMDEiCm91dHB1dDogCiAgYm9va2Rvd246Omh0bWxfZG9jdW1lbnQyOgogICAgdGhlbWU6IGNvc21vCiAgICB0b2M6IHRydWUKICAgIHRvY19mbG9hdDogdHJ1ZQogICAgbnVtYmVyX3NlY3Rpb25zOiB0cnVlCiAgICBjb2RlX2ZvbGRpbmc6IHNob3cKICAgIGNvZGVfZG93bmxvYWQ6IHRydWUKICBnaXRodWJfZG9jdW1lbnQ6CiAgICB0b2M6IHRydWUKICAgIG51bWJlcl9zZWN0aW9uczogdHJ1ZQogIGh0bWxfZG9jdW1lbnQ6CiAgICB0aGVtZTogY29zbW8KICAgIHRvYzogdHJ1ZQogICAgdG9jX2Zsb2F0OiB0cnVlCiAgICBudW1iZXJfc2VjdGlvbnM6IHRydWUKICAgIGNvZGVfZm9sZGluZzogc2hvdwogICAgY29kZV9kb3dubG9hZDogdHJ1ZQpiaWJsaW9ncmFwaHk6IHJlZmVyZW5jZXMuYmliCmxpbmstY2l0YXRpb25zOiB0cnVlCi0tLQoKVXNlIFttaVJEZWVwMl0oaHR0cHM6Ly9naXRodWIuY29tL3JhamV3c2t5LWxhYi9taXJkZWVwMikgW0BmcmllZGzDpG5kZXIyMDExXSB0byBpZGVudGlmeSBwb3RlbnRpYWwgbWlSTkFzIHVzaW5nIF9BLnB1bGNocmFfIHNSTkFzZXEgcmVhZHMuIFRoZSAqQS5taWxsZXBvcmEqIGdlbm9tZSB3aWxsIGJlIHVzZWQgYXMgdGhlIHJlZmVyZW5jZSBnZW5vbWUgZm9yICpBLnB1bGNocmEqLCBhcyAqQS5wdWxjaHJhKiBkb2VzIG5vdCBjdXJyZW50bHkgaGF2ZSBhIHNlcXVlbmNlZCBnZW5vbWUgYW5kICpBLm1pbGxlcG9yYSogaGFkIGhpZ2hlc3QgYWxpZ25tZW50IHJhdGVzIGZvciBzdGFuZGFyZCBSTkFzZXEgZGF0YSBjb21wYXJlZCB0byBvdGhlciBwdWJsaXNoZWQgZ2Vub21lcyB0ZXN0ZWQuIFRoZSBtYXR1cmUgbWlSQmFzZSBtaVJOQSBkYXRhYmFzZSB3aWxsIGFsc28gYmUgdXNlZC4KCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKSW5wdXRzOgoKLSAgIFJlcXVpcmVzIGNvbGxhcHNlZCByZWFkcyAoaS5lLiBjb25jYXRlbmF0ZWQsIHVuaXF1ZSByZWFkcykgaW4gRmFzdEEgZm9ybWF0LiBTZWUgWzEwLjEtQXB1bC1zUk5Bc2VxLUJMQVNUbi0zMWJwLWZhc3RwLW1lcmdlZC1jbmlkYXJpYW5fbWlSQmFzZS5SbWRdKC4vMTAuMS1BcHVsLXNSTkFzZXEtQkxBU1RuLTMxYnAtZmFzdHAtbWVyZ2VkLWNuaWRhcmlhbl9taVJCYXNlLlJtZCkgZm9yIGNvZGUuCgotICAgKkEubWlsbGVwb3JhKiBnZW5vbWUgRmFzdEEuIFNlZSBbMTItQXB1bC1zUk5Bc2VxLU1pck1hY2hpbmUuUm1kXShodHRwczovL2dpdGh1Yi5jb20vdXJvbC1lNS9kZWVwLWRpdmUvYmxvYi9tYWluL0QtQXB1bC9jb2RlLzEyLUFwdWwtc1JOQXNlcS1NaXJNYWNoaW5lLlJtZCkgZm9yIGRvd25sb2FkIGluZm8gaWYgbmVlZGVkLgoKLSBbbWlSQmFzZV0oaHR0cHM6Ly9taXJiYXNlLm9yZy9kb3dubG9hZC8pCgogIC0gVXRpbGl6ZXMgYSBtb2RpZmllZCB2ZXJzaW9uLCB3aGljaCBpbmNsdWRlcyBjbmlkYXJpYW4gbWlSTkEgY3VsbGVkIGZyb20gbGl0ZXJhdHVyZSBieSBKaWxsIEFoc2xleS4KICAKICAtIFtgY25pZGFyaWFuLW1pcmJhc2UtbWF0dXJlLXYyMi4xLmZhc3RhYF0oLi4vLi4vZGF0YS9jbmlkYXJpYW4tbWlyYmFzZS1tYXR1cmUtdjIyLjEuZmFzdGEpCgpPdXRwdXRzOgoKLSAgIFByaW1hcnkgb3V0cHV0cyBhcmUgYSByZXN1bHQgdGFibGUgaW4gQkVELCBDU1YgKHRhYi1kZWxpbWl0ZWQpLCBhbmQgSFRNTCBmb3JtYXRzLgoKICAtIER1ZSB0byB0aGUgbmF0dXJlIG9mIG1pckRlZXAyJ3MgbmFtaW5nLCB0cnlpbmcgdG8gdXNlIHZhcmlhYmxlIG5hbWVzIGlzIGNoYWxsZW5naW5nLiBBcyBzdWNoLCB0aGUgY2h1bmtzIHByb2Nlc3NpbmcgdGhvc2UgZmlsZXMgd2lsbCByZXF1aXJlIG1hbnVhbCBpbnRlcnZlbnRpb24gdG8gaWRlbnRpZnkgYW5kIHByb3ZpZGUgdGhlIG91dHB1dCBmaWxlbmFtZShzKTsgdGhleSBhcmUgX25vdF8gaGFuZGxlZCBhdCBpbiB0aGUgYC5iYXNodmFyc2AgZmlsZSBhdCB0aGUgdG9wIG9mIHRoaXMgc2NyaXB0LgogIAotIE90aGVyIG91dHB1dCBmaWxlcyBhcmUgdG9vIGxhcmdlIGZvciBHaXRIdWIgKGFuZCBzb21lIChhbGw/KSBhcmUgbm90IG5lZWRlZCBmb3IgdGhpcyBhbmFseXNpcykuIFBsZWFzZSBmaW5kIGEgZnVsbCBiYWNrdXAgaGVyZToKCmh0dHBzOi8vZ2FubmV0LmZpc2gud2FzaGluZ3Rvbi5lZHUvQXR1bWVmYWNpZW5zL2dpdHJlcG9zL2RlZXAtZGl2ZS9ELUFwdWwvb3V0cHV0LzExLjEtQXB1bC1zUk5Bc2VxLW1pUmRlZXAyLTMxYnAtZmFzdHAtbWVyZ2VkLwoKCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQpsaWJyYXJ5KGtuaXRyKQpsaWJyYXJ5KGthYmxlRXh0cmEpCmxpYnJhcnkoZHBseXIpCmxpYnJhcnkocmV0aWN1bGF0ZSkKa25pdHI6Om9wdHNfY2h1bmskc2V0KAogIGVjaG8gPSBUUlVFLCAgICAgICAgICMgRGlzcGxheSBjb2RlIGNodW5rcwogIGV2YWwgPSBGQUxTRSwgICAgICAgICMgRXZhbHVhdGUgY29kZSBjaHVua3MKICB3YXJuaW5nID0gRkFMU0UsICAgICAjIEhpZGUgd2FybmluZ3MKICBtZXNzYWdlID0gRkFMU0UsICAgICAjIEhpZGUgbWVzc2FnZXMKICBjb21tZW50ID0gIiIsICAgICAgICAjIFByZXZlbnRzIGFwcGVuZGluZyAnIyMnIHRvIGJlZ2lubmluZyBvZiBsaW5lcyBpbiBjb2RlIG91dHB1dAogIHdpZHRoID0gMTAwMCAgICAgICAgICMgYWRkcyBzY3JvbGwgYmFyCikKYGBgCgojIENyZWF0ZSBhIEJhc2ggdmFyaWFibGVzIGZpbGUKClRoaXMgYWxsb3dzIHVzYWdlIG9mIEJhc2ggdmFyaWFibGVzIGFjcm9zcyBSIE1hcmtkb3duIGNodW5rcy4KCmBgYHtyIHNhdmUtYmFzaC12YXJpYWJsZXMtdG8tcnZhcnMtZmlsZSwgZW5naW5lPSdiYXNoJywgZXZhbD1UUlVFfQp7CmVjaG8gIiMjIyMgQXNzaWduIFZhcmlhYmxlcyAjIyMjIgplY2hvICIiCgplY2hvICIjIFRyaW1tZWQgRmFzdFEgbmFtaW5nIHBhdHRlcm4iCmVjaG8gImV4cG9ydCB0cmltbWVkX2Zhc3Rxc19wYXR0ZXJuPScqZmFzdHAtYWRhcHRlcnMtcG9seUctMzFicC1tZXJnZWQuZnEuZ3onIgplY2hvICIiCgplY2hvICIjIERhdGEgZGlyZWN0b3JpZXMiCmVjaG8gJ2V4cG9ydCBkZWVwX2RpdmVfZGlyPS9ob21lL3NoYXJlZC84VEJfSEREXzAxL3NhbS9naXRyZXBvcy9kZWVwLWRpdmUnCmVjaG8gJ2V4cG9ydCBkZWVwX2RpdmVfZGF0YV9kaXI9IiR7ZGVlcF9kaXZlX2Rpcn0vZGF0YSInCmVjaG8gJ2V4cG9ydCBvdXRwdXRfZGlyX3RvcD0ke2RlZXBfZGl2ZV9kaXJ9L0QtQXB1bC9vdXRwdXQvMTEuMS1BcHVsLXNSTkFzZXEtbWlSZGVlcDItMzFicC1mYXN0cC1tZXJnZWQnCmVjaG8gJ2V4cG9ydCBnZW5vbWVfZmFzdGFfZGlyPSR7ZGVlcF9kaXZlX2Rpcn0vRC1BcHVsL2RhdGEvQW1pbC9uY2JpX2RhdGFzZXQvZGF0YS9HQ0ZfMDEzNzUzODY1LjEnCmVjaG8gJ2V4cG9ydCB0cmltbWVkX2Zhc3Rxc19kaXI9IiR7ZGVlcF9kaXZlX2Rpcn0vRC1BcHVsL291dHB1dC8wOC4yLUFwdWwtc1JOQXNlcS10cmltbWluZy0zMWJwLWZhc3RwLW1lcmdlZC90cmltbWVkLXJlYWRzIicKZWNobyAnZXhwb3J0IGNvbGxhcHNlZF9yZWFkc19kaXI9IiR7ZGVlcF9kaXZlX2Rpcn0vRC1BcHVsL291dHB1dC8xMC4xLUFwdWwtc1JOQXNlcS1CTEFTVG4tMzFicC1mYXN0cC1tZXJnZWQtY25pZGFyaWFuX21pUkJhc2UiJwplY2hvICIiCgplY2hvICIjIElucHV0L091dHB1dCBmaWxlcyIKZWNobyAnZXhwb3J0IGNvbGxhcHNlZF9yZWFkc19mYXN0YT0iY29sbGFwc2VkLXJlYWRzLWFsbC5mYXN0YSInCmVjaG8gJ2V4cG9ydCBjb2xsYXBzZWRfcmVhZHNfbWlyZGVlcDI9ImNvbGxhcHNlZC1yZWFkcy1hbGwtbWlyZGVlcDIuZmFzdGEiJwplY2hvICdleHBvcnQgY29sbGFwc2VkX3JlYWRzX2d0MTdicF9taXJkZWVwMj0iY29sbGFwc2VkX3JlYWRzX2d0MTdicF9taXJkZWVwMi5mYXN0YSInCmVjaG8gJ2V4cG9ydCBjb25jYXRlbmF0ZWRfdHJpbW1lZF9yZWFkc19mYXN0cT0iY29uY2F0ZW5hdGVkLXRyaW1tZWQtcmVhZHMtYWxsLmZhc3RxLmd6IicKZWNobyAnZXhwb3J0IGdlbm9tZV9mYXN0YV9uYW1lPSJHQ0ZfMDEzNzUzODY1LjFfQW1pbF92Mi4xX2dlbm9taWMuZm5hIicKZWNobyAnZXhwb3J0IGdlbm9tZV9mYXN0YV9ub19zcGFjZXM9IkdDRl8wMTM3NTM4NjUuMV9BbWlsX3YyLjFfZ2Vub21pYy1ub19zcGFjZXMuZm5hIicKZWNobyAnZXhwb3J0IG1pcmRlZXAyX21hcHBpbmdfZmlsZT0iQXB1bC1taXJkZWVwMi1tYXBwaW5nLmFyZiInCmVjaG8gJ2V4cG9ydCBtaXJiYXNlX21hdHVyZV9mYXN0YV9uYW1lPSJjbmlkYXJpYW4tbWlyYmFzZS1tYXR1cmUtdjIyLjEuZmFzdGEiJwplY2hvICdleHBvcnQgbWlyYmFzZV9tYXR1cmVfZmFzdGFfbm9fc3BhY2VzPSJjbmlkYXJpYW4tbWlyYmFzZS1tYXR1cmUtdjIyLjEtbm9fc3BhY2VzLmZhIicKZWNobyAiIgoKCmVjaG8gIiMgUGF0aHMgdG8gcHJvZ3JhbXMiCmVjaG8gJ2V4cG9ydCBtaXJkZWVwMl9tYXBwZXI9Im1hcHBlci5wbCInCmVjaG8gJ2V4cG9ydCBtaXJkZWVwMj0ibWlSRGVlcDIucGwiJwplY2hvICdleHBvcnQgbWlyZGVlcDJfZmFzdGFwYXJzZT0iZmFzdGFwYXJzZS5wbCInCmVjaG8gJ2V4cG9ydCBib3d0aWVfYnVpbGQ9Ii9ob21lL3NoYXJlZC9ib3d0aWUtMS4zLjEtbGludXgteDg2XzY0L2Jvd3RpZS1idWlsZCInCmVjaG8gIiIKCmVjaG8gIiMgU2V0IG51bWJlciBvZiBDUFVzIHRvIHVzZSIKZWNobyAnZXhwb3J0IHRocmVhZHM9NDAnCmVjaG8gIiIKCgoKfSA+IC5iYXNodmFycwoKY2F0IC5iYXNodmFycwpgYGAKCiMgUHJlcGFyZSByZWFkcyBmb3IgbWlSRGVlcDIKClBlciBtaVJEZWVwMiBkb2N1bWVudGF0aW9uOgoKPiBUaGUgcmVhZElEIG11c3QgZW5kIHdpdGggXF94TnVtYmVyIGFuZCBpcyBub3QgYWxsb3dlZCB0byBjb250YWluCj4gd2hpdGVzcGFjZXMuIGhhcyB0byBoYXZlIHRoZSBmb3JtYXQgbmFtZV91bmlxdWVOdW1iZXJfeG51bWJlcgoKYGBge3IgcmVmb3JtYXQtcmVhZC1JRHMsIGV2YWw9VFJVRSwgZW5naW5lPSdiYXNoJ30KIyBMb2FkIGJhc2ggdmFyaWFibGVzIGludG8gbWVtb3J5CnNvdXJjZSAuYmFzaHZhcnMKCiMgQXBwZW5kIG1pUkRlZXAyIHRvIHN5c3RlbSBQQVRIIGFuZCBzZXQgUEVSTDVMSUIKZXhwb3J0IFBBVEg9JFBBVEg6L2hvbWUvc2hhcmVkL21pcmRlZXAyL2JpbgpleHBvcnQgUEVSTDVMSUI9JFBFUkw1TElCOi9ob21lL3NoYXJlZC9taXJkZWVwMi9saWIvcGVybDUKCm1rZGlyIC0tcGFyZW50cyAiJHtvdXRwdXRfZGlyX3RvcH0iCgoKc2VkICcvXj4vIHMvLS9feC9nJyAiJHtjb2xsYXBzZWRfcmVhZHNfZGlyfS8ke2NvbGxhcHNlZF9yZWFkc19mYXN0YX0iIFwKfCBzZWQgJy9ePi8gcy8+Lz5zZXFfLycgXAo+ICIke291dHB1dF9kaXJfdG9wfS8ke2NvbGxhcHNlZF9yZWFkc19taXJkZWVwMn0iCgojIEZpbHRlciBmb3IgcmVhZHMgYXQgbGVhc3QgMTcgYmFzZXMgbG9uZwojIE1pbi4gcmVhZCBsZW5ndGggcmVxdWlyZWQgZm9yIE1pckRlZXAyCiR7bWlyZGVlcDJfZmFzdGFwYXJzZX0gXAoiJHtvdXRwdXRfZGlyX3RvcH0vJHtjb2xsYXBzZWRfcmVhZHNfbWlyZGVlcDJ9IiBcCi1hIDE3IFwKPiAiJHtvdXRwdXRfZGlyX3RvcH0vJHtjb2xsYXBzZWRfcmVhZHNfZ3QxN2JwX21pcmRlZXAyfSIgXAoyPiAvZGV2L251bGwKCmdyZXAgIl4+IiAke2NvbGxhcHNlZF9yZWFkc19kaXJ9LyR7Y29sbGFwc2VkX3JlYWRzX2Zhc3RhfSBcCnwgaGVhZAoKZWNobyAiIgplY2hvICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIKZWNobyAiIgoKZ3JlcCAiXj4iICR7b3V0cHV0X2Rpcl90b3B9LyR7Y29sbGFwc2VkX3JlYWRzX2d0MTdicF9taXJkZWVwMn0gXAp8IGhlYWQKYGBgCgojIFJlZm9ybWF0IGdlbm9tZSBGYXN0QSBkZXNjcmlwdGlvbiBsaW5lcwoKbWlSRGVlcDIgY2FuJ3QgcHJvY2VzcyBnZW5vbWUgRmFzdEFzIHdpdGggc3BhY2VzIGluIHRoZSBkZXNjcmlwdGlvbgpsaW5lcy4KClNvLCBJJ20gcmVwbGFjaW5nIHNwYWNlcyB3aXRoIHVuZGVyc2NvcmVzLgoKQW5kLCBmb3IgYWVzdGhldGljcywgSSdtIGFsc28gcmVtb3ZpbmcgY29tbWFzLgoKYGBge3IgcmVtb3ZlLXNwYWNlcy1nZW5vbWUtRmFzdEEsIGV2YWw9VFJVRSwgZW5naW5lPSdiYXNoJ30KIyBMb2FkIGJhc2ggdmFyaWFibGVzIGludG8gbWVtb3J5CnNvdXJjZSAuYmFzaHZhcnMKCgpzZWQgJy9ePi8gcy8gL18vZycgIiR7Z2Vub21lX2Zhc3RhX2Rpcn0vJHtnZW5vbWVfZmFzdGFfbmFtZX0iIFwKfCBzZWQgJy9ePi8gcy8sLy9nJyBcCj4gIiR7Z2Vub21lX2Zhc3RhX2Rpcn0vJHtnZW5vbWVfZmFzdGFfbm9fc3BhY2VzfSIKCmdyZXAgIl4+IiAke2dlbm9tZV9mYXN0YV9kaXJ9LyR7Z2Vub21lX2Zhc3RhX25hbWV9IFwKfCBoZWFkCgplY2hvICIiCmVjaG8gIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIgplY2hvICIiCgpncmVwICJePiIgJHtnZW5vbWVfZmFzdGFfZGlyfS8ke2dlbm9tZV9mYXN0YV9ub19zcGFjZXN9IFwKfCBoZWFkCmBgYAoKIyBSZWZvcm1hdCBjbmlkYXJpYW4gbWlSQmFzZSBGYXN0QSBkZXNjcmlwdGlvbiBsaW5lcwoKYGBge3IgcmVtb3ZlLXNwYWNlcy1jbmlkYXJpYW4tbWlyYmFzZS1GYXN0QSwgZXZhbD1UUlVFLCBlbmdpbmU9J2Jhc2gnfQojIExvYWQgYmFzaCB2YXJpYWJsZXMgaW50byBtZW1vcnkKc291cmNlIC5iYXNodmFycwoKCnNlZCAnL14+LyBzLyAvXy9nJyAiJHtkZWVwX2RpdmVfZGF0YV9kaXJ9LyR7bWlyYmFzZV9tYXR1cmVfZmFzdGFfbmFtZX0iIFwKfCBzZWQgJy9ePi8gcy8sLy9nJyBcCj4gIiR7ZGVlcF9kaXZlX2RhdGFfZGlyfS8ke21pcmJhc2VfbWF0dXJlX2Zhc3RhX25vX3NwYWNlc30iCgpncmVwICJePiIgJHtkZWVwX2RpdmVfZGF0YV9kaXJ9LyR7bWlyYmFzZV9tYXR1cmVfZmFzdGFfbmFtZX0gXAp8IGhlYWQKCmVjaG8gIiIKZWNobyAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iCmVjaG8gIiIKCmdyZXAgIl4+IiAke2RlZXBfZGl2ZV9kYXRhX2Rpcn0vJHttaXJiYXNlX21hdHVyZV9mYXN0YV9ub19zcGFjZXN9IFwKfCBoZWFkCmBgYAoKIyBCb3d0aWUgdjEgZ2Vub21lIGluZGV4CgptaVJEZWVwMiByZXF1aXJlcyBhIEJvd3RpZSB2MSBnZW5vbWUgaW5kZXggLSBjYW5ub3QgdXNlIEJvd3RpZTIgaW5kZXgKCmBgYHtyIGJvd3RpZTEtaW5kZXgsIGV2YWw9RkFMU0UsIGVuZ2luZT0nYmFzaCd9CiMgTG9hZCBiYXNoIHZhcmlhYmxlcyBpbnRvIG1lbW9yeQpzb3VyY2UgLmJhc2h2YXJzCgojIENoZWNrIGZvciBleGlzdGVuY2Ugb2YgZ2Vub21lIGluZGV4IGZpcnN0CmlmIFsgISAtZiAiJHtnZW5vbWVfZmFzdGFfbm9fc3BhY2VzJS4qfS5bMC05XS5lYnd0IiBdOyB0aGVuCiAgJHtib3d0aWVfYnVpbGR9IFwKICAke2dlbm9tZV9mYXN0YV9kaXJ9LyR7Z2Vub21lX2Zhc3RhX25vX3NwYWNlc30gXAogICR7Z2Vub21lX2Zhc3RhX2Rpcn0vJHtnZW5vbWVfZmFzdGFfbm9fc3BhY2VzJS4qfSBcCiAgLS10aHJlYWRzICR7dGhyZWFkc30gXAogIC0tcXVpZXQKZmkKYGBgCgojIE1hcCByZWFkcyB0byBnZW5vbWUKClJlcXVpcmVzIGdlbm9tZSB0byBiZSBwcmV2aW91c2x5IGluZGV4ZWQgd2l0aCBCb3d0aWUuCgpBZGRpdGlvbmFsbHksIHJlcXVpcmVzIHVzZXIgdG8gZW50ZXIgcGF0aCB0byB0aGVpciBgbWlyZGVlcDJgIGRpcmVjdG9yeSBhcyB3ZWxsCmFzIHRoZWlyIGBwZXJsNWAgaW5zdGFsbGF0aW9uLgoKYGBge3IgbWFwLXJlYWQtZ2Vub21lLCBldmFsPUZBTFNFLCBjYWNoZT1UUlVFLCBlbmdpbmU9J2Jhc2gnfQojIExvYWQgYmFzaCB2YXJpYWJsZXMgaW50byBtZW1vcnkKc291cmNlIC5iYXNodmFycwoKIyBBcHBlbmQgbWlSRGVlcDIgdG8gc3lzdGVtIFBBVEggYW5kIHNldCBQRVJMNUxJQgpleHBvcnQgUEFUSD0kUEFUSDovaG9tZS9zaGFyZWQvbWlyZGVlcDIvYmluCmV4cG9ydCBQRVJMNUxJQj0kUEVSTDVMSUI6L2hvbWUvc2hhcmVkL21pcmRlZXAyL2xpYi9wZXJsNQoKIyBSdW4gbWlSRGVlcDIgbWFwcGluZwp0aW1lIFwKJHttaXJkZWVwMl9tYXBwZXJ9IFwKJHtvdXRwdXRfZGlyX3RvcH0vJHtjb2xsYXBzZWRfcmVhZHNfZ3QxN2JwX21pcmRlZXAyfSBcCi1jIFwKLXAgJHtnZW5vbWVfZmFzdGFfZGlyfS8ke2dlbm9tZV9mYXN0YV9ub19zcGFjZXMlLip9IFwKLXQgJHtvdXRwdXRfZGlyX3RvcH0vJHttaXJkZWVwMl9tYXBwaW5nX2ZpbGV9IFwKLW8gJHt0aHJlYWRzfQpgYGAKCiMgUnVuIG1pUkRlZXAyCgpSZWNvbW1lbmRhdGlvbiBpcyB0byB1c2UgdGhlIGNsb3Nlc3QgcmVsYXRlZCBzcGVjaWVzIGluIHRoZSBtaVJEZWVwMiBvcHRpb25zLCBldmVuCmlmIHRoZSBzcGVjaWVzIGlzbid0IHZlcnkgY2xvc2VseSByZWxhdGVkLiBUaGUgZG9jdW1lbnRhdGlvbiBpbmRpY2F0ZXMgdGhhdCBtaVJEZWVwMgppcyBhbHdheXMgbW9yZSBhY2N1cmF0ZSB3aGVuIGF0IGxlYXN0IGEgc3BlY2llcyBpcyBwcm92aWRlZC4KClRoZSBvcHRpb25zIHByb3ZpZGVkIHRvIHRoZSBjb21tYW5kIGFyZSBhcyBmb2xsb3dzOgoKLSBgbm9uZWA6IEtub3duIG1pUk5BcyBvZiB0aGUgc3BlY2llcyBiZWluZyBhbmFseXplZC4KLSBgLXQgUy5wdXB1cmF0dXNgOiBSZWxhdGVkIHNwZWNpZXMuCi0gYG5vbmVgOiBLbm93biBtaVJOQSBwcmVjdXJzb3JzIGluIHRoaXMgc3BlY2llcy4KLSBgLVBgOiBTcGVjaWZpZXMgbWlSQmFzZSB2ZXJzaW9uID4gMTguCi0gYC12YDogUmVtb3ZlIHRlbXBvcmFyeSBmaWxlcyBhZnRlciBjb21wbGV0aW9uLgotIGAtZyAtMWA6IE51bWJlciBvZiBwcmVjdXJzb3JzIHRvIGFuYWx5emUuIEEgc2V0dGluZyBvZiBgLTFgIHdpbGwgYW5hbHl6ZSBhbGwuIERlZmF1bHQgaXMgNTAsMDAwCkkgc2V0IHRoaXMgdG8gYC0xYCBhZnRlciBtdWx0aXBsZSBhdHRlbXB0cyB0byBydW4gdXNpbmcgdGhlIGRlZmF1bHQga2VwdCBmYWlsaW5nLgoKTk9URTogVGhpcyB3aWxsIHRha2UgYW4gX2V4dHJlbWVseV8gbG9uZyB0aW1lIHRvIHJ1biAoZGF5cykuIENvdWxkIHBvc3NpYmx5IGJlIHNob3J0ZW5lZCBieQpleGNsdWRpbmcgYHJhbmRmb2xkYCBhbmFseXNpcy4KCgpgYGB7ciBtaXJkZWVwMiwgZXZhbD1GQUxTRSwgY2FjaGU9VFJVRSwgZW5naW5lPSdiYXNoJ30KIyBMb2FkIGJhc2ggdmFyaWFibGVzIGludG8gbWVtb3J5CnNvdXJjZSAuYmFzaHZhcnMKCiMgQXBwZW5kIG1pUkRlZXAyIHRvIHN5c3RlbSBQQVRIIGFuZCBzZXQgUEVSTDVMSUIKZXhwb3J0IFBBVEg9JFBBVEg6L2hvbWUvc2hhcmVkL21pcmRlZXAyL2JpbgpleHBvcnQgUEVSTDVMSUI9JFBFUkw1TElCOi9ob21lL3NoYXJlZC9taXJkZWVwMi9saWIvcGVybDUKCnRpbWUgXAoke21pcmRlZXAyfSBcCiR7b3V0cHV0X2Rpcl90b3B9LyR7Y29sbGFwc2VkX3JlYWRzX2d0MTdicF9taXJkZWVwMn0gXAoke2dlbm9tZV9mYXN0YV9kaXJ9LyR7Z2Vub21lX2Zhc3RhX25vX3NwYWNlc30gXAoke291dHB1dF9kaXJfdG9wfS8ke21pcmRlZXAyX21hcHBpbmdfZmlsZX0gXApub25lIFwKJHtkZWVwX2RpdmVfZGF0YV9kaXJ9LyR7bWlyYmFzZV9tYXR1cmVfZmFzdGFfbm9fc3BhY2VzfSBcCm5vbmUgXAotdCBTLnB1cnB1cmF0dXMgXAotUCBcCi12IFwKLWcgLTEgXAoyPiR7b3V0cHV0X2Rpcl90b3B9L21pUkRlZXAyLVMucHVycHVyYXR1cy1yZXBvcnQubG9nCmBgYAoKIyMgQ2hlY2sgcnVudGltZQoKYGBge3IgcnVudGltZS1taXJkZWVwMiwgZXZhbD1UUlVFLCBlbmdpbmU9J2Jhc2gnfQojIExvYWQgYmFzaCB2YXJpYWJsZXMgaW50byBtZW1vcnkKc291cmNlIC5iYXNodmFycwoKdGFpbCAtbiA2ICR7b3V0cHV0X2Rpcl90b3B9L21pUkRlZXAyLVMucHVycHVyYXR1cy1yZXBvcnQubG9nCmBgYAoKIyBNb3ZlIG91dHB1dCBmaWxlcyB0byBvdXRwdXQgZGlyZWN0b3J5CgpNaVJEZWVwMiBvdXRwdXRzIGFsbCBmaWxlcyB0byB0aGUgY3VycmVudCB3b3JraW5nIGRpcmVjdGx5IHdpdGggbm8gd2F5CnRvIHJlZGlyZWN0IHNvIHdhbnQgdG8gbW92ZSB0byBpbnRlbmRlZCBvdXRwdXQgZGlyZWN0b3J5LgoKIyMgTW92ZSBvdXRwdXQgZmlsZXMKCk91dHB1dCBmaWxlcyB3aWxsIGJlIGluIHRoZSBmb3JtYXQgb2YgYHJlc3VsdF8qYCBhbmQgYGVycm9yXypgCgpgYGB7ciBtb3ZlLW1pcmRlZXAyLW91dHB1dC1maWxlcywgZXZhbD1GQUxTRSwgZW5naW5lPSdiYXNoJ30KIyBMb2FkIGJhc2ggdmFyaWFibGVzIGludG8gbWVtb3J5CnNvdXJjZSAuYmFzaHZhcnMKCmZvciBmaWxlIGluIHJlc3VsdF8qIGVycm9yXyoKZG8KICBtdiAiJHtmaWxlfSIgIiR7b3V0cHV0X2Rpcl90b3B9LyIKZG9uZQpgYGAKCiMjIElkZW50aWZ5IGRpcmVjdG9yaWVzCgpgYGB7ciBpZGVudGlmeS1taXJkZWVwMi1vdXRwdXQtZGlycywgZXZhbD1UUlVFLCBlbmdpbmU9J2Jhc2gnfQojIExvYWQgYmFzaCB2YXJpYWJsZXMgaW50byBtZW1vcnkKc291cmNlIC5iYXNodmFycwoKbHMgLWwgfCBncmVwICJeZCIKYGBgCgojIyBSc3luYyBkaXJlY3RvcmllcwoKYGBge3IgcnN5bmMtbWlyZGVlcDItb3V0cHV0LWZpbGVzLCBldmFsPUZBTFNFLCBlbmdpbmU9J2Jhc2gnfQojIExvYWQgYmFzaCB2YXJpYWJsZXMgaW50byBtZW1vcnkKc291cmNlIC5iYXNodmFycwoKcnN5bmMgLWFQIC4gLS1pbmNsdWRlPSdkaXIqKionIC0tZXhjbHVkZT0nKicgLS1xdWlldCAiJHtvdXRwdXRfZGlyX3RvcH0vIgoKcnN5bmMgLWFQIC4gLS1pbmNsdWRlPSdtYXAqKionIC0tZXhjbHVkZT0nKicgLS1xdWlldCAiJHtvdXRwdXRfZGlyX3RvcH0vIgoKcnN5bmMgLWFQIC4gLS1leGNsdWRlPSdtaXJnZW5lKicgLS1pbmNsdWRlPSdtaXIqKionIC0tZXhjbHVkZT0nKicgLS1xdWlldCAiJHtvdXRwdXRfZGlyX3RvcH0vIgoKcnN5bmMgLWFQIC4gLS1pbmNsdWRlPSdwZGZzKioqJyAtLWV4Y2x1ZGU9JyonIC0tcXVpZXQgIiR7b3V0cHV0X2Rpcl90b3B9LyIKCmVjaG8gIiIKZWNobyAiQ2hlY2sgbmV3IGxvY2F0aW9uOiIKZWNobyAiIgoKbHMgLWwgIiR7b3V0cHV0X2Rpcl90b3B9LyIgfCBncmVwICJeZCIKCgpgYGAKCiMjIENvbmZpcm0gZGVsZXRpb24gcGF0dGVybnMgd29yayAqYmVmb3JlKiBkZWxldGlvbiEKCkZZSSAtIGBldmFsPUZBTFNFYCBpcyBzZXQgYmVjYXVzZSB0aGUgZm9sbG93aW5nIGNvbW1hbmQgd2lsbCBvbmx5IHdvcmsKb25jZS4uLgoKYGBge3IgdGVzdC1kZWxldGlvbi1wYXR0ZXJucywgZXZhbD1GQUxTRSwgZW5naW5lPSdiYXNoJ30KbHMgLS1kaXJlY3RvcnkgZGlyXyogbWFwcGVyX2xvZ3MgbWlyZGVlcF9ydW5zIG1pcm5hX3Jlc3VsdHMqIHBkZnNfKgpgYGAKCiMjIFJlbW92ZSBkaXJlY3RvcmllcyBmcm9tIGNvZGUgZGlyZWN0b3J5CgpgYGB7ciByZW1vdmUtbWlyZGVlcDItb3V0cHV0LWRpcnMsIGV2YWw9RkFMU0UsIGVuZ2luZT0nYmFzaCd9CiMgTG9hZCBiYXNoIHZhcmlhYmxlcyBpbnRvIG1lbW9yeQpzb3VyY2UgLmJhc2h2YXJzCgpybSAtcmYgZGlyXyogbWFwcGVyX2xvZ3MgbWlyZGVlcF9ydW5zIG1pcm5hX3Jlc3VsdHMqIHBkZnNfKgoKYGBgCgojIyBDaGVjayB0byBtYWtlIHN1cmUgdGhleSdyZSBnb25lCgpgYGB7ciBjaGVjay1kZWxldGlvbi1zdWNjZXNzLCBldmFsPVRSVUUsIGVuZ2luZT0nYmFzaCcsIGVycm9yPVRSVUV9CmxzIC0tZGlyZWN0b3J5IGRpcl8qIG1hcHBlcl9sb2dzIG1pcmRlZXBfcnVucyBtaXJuYV9yZXN1bHRzKiBwZGZzXyoKYGBgCgojIFJlc3VsdHMKCiMjIFBlZXAgb3V0cHV0IGZpbGUgZm9ybWF0CgpUaGUgZm9ybWF0dGluZyBvZiB0aGlzIENTViBpcyB0ZXJyaWJsZS4gSXQgaGFzIGEgMy1jb2x1bW4gdGFibGUgb24gdG9wCm9mIGEgMTctY29sdW1uIHRhYmxlLiBUaGlzIG1ha2VzIHBhcnNpbmcgYSBiaXQgb2YgYSBwYWluIGluIGl0cyByYXcKZm9ybWF0LgoKYGBge3IgY2hlY2stcmVzdWx0cy1maWxlLCBldmFsPVRSVUUsIGVuZ2luZT0nYmFzaCd9CiMgTG9hZCBiYXNoIHZhcmlhYmxlcyBpbnRvIG1lbW9yeQpzb3VyY2UgLmJhc2h2YXJzCgoKaGVhZCAtbiAzMCAiJHtvdXRwdXRfZGlyX3RvcH0vcmVzdWx0XzAzXzA0XzIwMjRfdF8xM18wMF8zOS5jc3YiCmBgYAoKIyMgQ3JlYXRlIG1vcmUgZWFzaWx5IHBhcmFzYWJsZSByZXN1bHRzIGZpbGUKClRoaXMgd2lsbCBtYXRjaCB0aGUgbGluZSBiZWdpbm5pbmcgd2l0aCBgcHJvdmlzaW9uYWwgaWRgIGFuZCBwcmludCB0bwp0aGUgZW5kIG9mIHRoZSBmaWxlIChyZXByZXNlbnRlZCBieSB0aGUgYCRwYC4gYCRgID0gZW5kLCBgcGAgPSBwcmludCkKCmBgYHtyIHBhcnNhYmxlLXJlc3VsdHMtZmlsZSwgZXZhbD1UUlVFLCBlbmdpbmU9J2Jhc2gnfQojIExvYWQgYmFzaCB2YXJpYWJsZXMgaW50byBtZW1vcnkKc291cmNlIC5iYXNodmFycwoKCnNlZCAtLXF1aWV0ICcvcHJvdmlzaW9uYWwgaWQvLCRwJyAiJHtvdXRwdXRfZGlyX3RvcH0vcmVzdWx0XzAzXzA0XzIwMjRfdF8xM18wMF8zOS5jc3YiIFwKPiAiJHtvdXRwdXRfZGlyX3RvcH0vcGFyc2FibGUtcmVzdWx0XzAzXzA0XzIwMjRfdF8xM18wMF8zOS5jc3YiCgpoZWFkICIke291dHB1dF9kaXJfdG9wfS9wYXJzYWJsZS1yZXN1bHRfMDNfMDRfMjAyNF90XzEzXzAwXzM5LmNzdiIKYGBgCgojIyBSZWFkIGluIG91dHB1dCBDU1YKClRoaXMgY2h1bmsgcHJvdmlkZXMgYSBtb3JlIGNvbmNpc2Ugb3ZlcnZpZXcgb2YgdGhlIGRhdGEgYW5kIGl0J3MKY29sdW1ucy4KCmBgYHtyIHJlYWQtaW4tcmVzdWx0LWNzdiwgZXZhbD1UUlVFfQoKbWlyZGVlcF9yZXN1bHQuZGYgPC0gcmVhZC5jc3YoIi4uL291dHB1dC8xMS4xLUFwdWwtc1JOQXNlcS1taVJkZWVwMi0zMWJwLWZhc3RwLW1lcmdlZC9wYXJzYWJsZS1yZXN1bHRfMDNfMDRfMjAyNF90XzEzXzAwXzM5LmNzdiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlciA9IFRSVUUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcCA9ICJcdCIpCgpzdHIobWlyZGVlcF9yZXN1bHQuZGYpCgpgYGAKCiMjIG1pUk5BcyBjb3VudCBkYXRhCgpUaGlzIHByb3ZpZGVzIHNvbWUgcnVkaW1lbnRhcnkgbnVtYmVycyBmb3IgdGhlIG1pUkRlZXAyIG91dHB1dC4KCkZ1cnRoZXIgYW5hbHlzaXMgaXMgcG9zc2libHkgZGVzaXJlZCB0byBldmFsdWF0ZSBzY29yZSB0aHJlc2hvbGRzLCBtaVJOQQpmYW1pbGllcywgZXRjLgoKYGBge3IgcmVzdWx0cy1jb3VudHMsIGV2YWw9VFJVRSwgZW5naW5lPSdiYXNoJ30KIyBMb2FkIGJhc2ggdmFyaWFibGVzIGludG8gbWVtb3J5CnNvdXJjZSAuYmFzaHZhcnMKCiMgVG90YWwgcHJlZGljdGVkIG1pUk5BUwp0b3RhbF9taVJOQXM9JChhd2sgJ05SID4gMScgJHtvdXRwdXRfZGlyX3RvcH0vcGFyc2FibGUtcmVzdWx0XzAzXzA0XzIwMjRfdF8xM18wMF8zOS5jc3YgXAp8IHdjIC1sCikKCmVjaG8gIlRvdGFsIG9mIHByZWRpY3RlZCBtaVJOQXM6ICR7dG90YWxfbWlSTkFzfSIKZWNobyAiIgoKIyBNYXRjaGVzIHRvIGtub3duIG1hdHVyZSBtaVJOQXMKbWF0dXJlX21pUk5Bcz0kKGF3ayAtRidcdCcgJyQxMSAhPSAiLSIgJiYgJDExICE9ICIiIHtwcmludCAkMTF9JyAke291dHB1dF9kaXJfdG9wfS9wYXJzYWJsZS1yZXN1bHRfMDNfMDRfMjAyNF90XzEzXzAwXzM5LmNzdiBcCnwgd2MgLWwKKQoKZWNobyAiTnVtYmVyIG9mIHNlZWQgbWF0Y2hlcyB0byBrbm93biBtaVJOQVM6ICR7bWF0dXJlX21pUk5Bc30iCmVjaG8gIiIKCiMgTm92ZWwgbWlSTkFzCm5vdmVsX21pUk5Bcz0kKGF3ayAtRiAiXHQiICckMTEgPT0gIi0iIHx8ICQxMSA9PSAiIiB7cHJpbnQgJDExfScgJHtvdXRwdXRfZGlyX3RvcH0vcGFyc2FibGUtcmVzdWx0XzAzXzA0XzIwMjRfdF8xM18wMF8zOS5jc3YgXAp8IGF3ayAnTlIgPiAxJyBcCnwgd2MgLWwKKQoKZWNobyAiTnVtYmVyIG9mIG5vdmVsIG1pUk5BczogJHtub3ZlbF9taVJOQXN9IgoKYGBgCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiMgQ2l0YXRpb25zCg==