This notebook performs a simple NCBI BLASTn (Altschul et al. 1990) against an miRNA database to attempt to identify miRNA in P.meandrina sRNAseq:

Relies on the following software:

  • fastx_toolkit

    • fastx_collapser: Collapses duplicate sequences in FastA/Q into single sequence.

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 "# 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}/F-Pmea/output/10.1-Pmea-sRNAseq-BLASTn-31bp-fastp-merged-cnidarian_miRBase'
echo 'export trimmed_fastqs_dir="${deep_dive_dir}/F-Pmea/output/08.2-Pmea-sRNAseq-trimming-31bp-fastp-merged/trimmed-reads"'
echo 'export blast_dbs_dir="${deep_dive_dir}/data/blast_dbs"'
echo ""

echo "# Input/Output files"
echo 'export collapsed_reads_fasta="collapsed-reads-all.fasta"'
echo 'export concatenated_trimmed_reads_fastq="concatenated-trimmed-reads-all.fastq.gz"'
echo 'export mirbase_mature_fasta_name="cnidarian-mirbase-mature-v22.1.fasta"'
echo 'export mirbase_mature_fasta_no_U="cnidarian-mirbase-mature-v22.1-no_U.fa"'
echo 'export mirgene_mature_fasta_name="mirgene-mature-all-v2.1.fa"'
echo 'export mirgene_mature_fasta_no_U="mirgene-mature-all-v2.1-no_U.fa"'
echo ""

echo "# External data URLs"
echo 'export mirgenedb_fasta_url="https://www.mirgenedb.org/fasta/ALL?mat=1"'
echo ""

echo "# Paths to programs"
echo 'export ncbi_blast_dir="/home/shared/ncbi-blast-2.15.0+/bin/"'
echo 'export ncbi_blastn="${ncbi_blast_dir}/blastn"'
echo 'export ncbi_makeblast_db="${ncbi_blast_dir}/makeblastdb"'
echo 'export fastx_collapser="/home/shared/fastx_toolkit_0.0.13_binaries_Linux_2.6_amd64/bin/fastx_collapser"'

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

echo "# Initialize arrays"
echo 'export trimmed_fastqs_array=()'


} > .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}/F-Pmea/output/10.1-Pmea-sRNAseq-BLASTn-31bp-fastp-merged-cnidarian_miRBase
export trimmed_fastqs_dir="${deep_dive_dir}/F-Pmea/output/08.2-Pmea-sRNAseq-trimming-31bp-fastp-merged/trimmed-reads"
export blast_dbs_dir="${deep_dive_dir}/data/blast_dbs"

# Input/Output files
export collapsed_reads_fasta="collapsed-reads-all.fasta"
export concatenated_trimmed_reads_fastq="concatenated-trimmed-reads-all.fastq.gz"
export mirbase_mature_fasta_name="cnidarian-mirbase-mature-v22.1.fasta"
export mirbase_mature_fasta_no_U="cnidarian-mirbase-mature-v22.1-no_U.fa"
export mirgene_mature_fasta_name="mirgene-mature-all-v2.1.fa"
export mirgene_mature_fasta_no_U="mirgene-mature-all-v2.1-no_U.fa"

# External data URLs
export mirgenedb_fasta_url="https://www.mirgenedb.org/fasta/ALL?mat=1"

# Paths to programs
export ncbi_blast_dir="/home/shared/ncbi-blast-2.15.0+/bin/"
export ncbi_blastn="${ncbi_blast_dir}/blastn"
export ncbi_makeblast_db="${ncbi_blast_dir}/makeblastdb"
export fastx_collapser="/home/shared/fastx_toolkit_0.0.13_binaries_Linux_2.6_amd64/bin/fastx_collapser"
# Set number of CPUs to use
export threads=46

# Initialize arrays
export trimmed_fastqs_array=()

2 Download MirGeneDB Fasta

# Load bash variables into memory
source .bashvars

# Download MirGeneDB, if it doesn't exist
if [ ! -f "${deep_dive_data_dir}/${mirgene_mature_fasta_name}" ]; then

  wget \
  --no-check-certificate \
  --continue \
  --no-host-directories \
  --no-directories \
  --no-parent \
  --quiet \
  --execute robots=off \
  --output-document ${deep_dive_data_dir}/${mirgene_mature_fasta_name} \
   ${mirgenedb_fasta_url}
 
fi
 
ls -lh ${deep_dive_data_dir}
total 24M
drwxr-xr-x 2 sam sam 4.0K Apr 22 11:41 blast_dbs
-rw-rw-r-- 1 sam sam 3.8M Apr  2 06:51 cnidarian-mirbase-mature-v22.1.fasta
-rw-r--r-- 1 sam sam 3.8M Apr 19 12:22 cnidarian-mirbase-mature-v22.1-no_spaces.fa
-rw-r--r-- 1 sam sam 3.8M Apr 22 12:56 cnidarian-mirbase-mature-v22.1-no_U.fa
-rw-r--r-- 1 sam sam  44K Apr  2 06:49 cnidarian_miRNAs.fasta
-rw-r--r-- 1 sam sam 3.7M Feb 16 12:36 mirbase-mature-v22.1.fa
-rw-r--r-- 1 sam sam 3.7M Dec  4 11:05 mirbase-mature-v22.1-no_spaces.fa
-rw-r--r-- 1 sam sam 3.7M Apr 22 10:12 mirbase-mature-v22.1-no_U.fa
-rw-r--r-- 1 sam sam 726K Nov  7 14:36 mirgene-mature-all-v2.1.fa
-rw-r--r-- 1 sam sam 726K Apr 22 12:56 mirgene-mature-all-v2.1-no_U.fa

3 Inspect miRNA FastAs

# Load bash variables into memory
source .bashvars

head "${deep_dive_data_dir}"/[cm][ni]*.fa*
==> /home/shared/8TB_HDD_01/sam/gitrepos/deep-dive/data/cnidarian-mirbase-mature-v22.1.fasta <==
>cel-let-7-5p MIMAT0000001 Caenorhabditis elegans let-7-5p
UGAGGUAGUAGGUUGUAUAGUU
>cel-let-7-3p MIMAT0015091 Caenorhabditis elegans let-7-3p
CUAUGCAAUUUUCUACCUUACC
>cel-lin-4-5p MIMAT0000002 Caenorhabditis elegans lin-4-5p
UCCCUGAGACCUCAAGUGUGA
>cel-lin-4-3p MIMAT0015092 Caenorhabditis elegans lin-4-3p
ACACCUGGGCUCUCCGGGUACC
>cel-miR-1-5p MIMAT0020301 Caenorhabditis elegans miR-1-5p
CAUACUUCCUUACAUGCCCAUA

==> /home/shared/8TB_HDD_01/sam/gitrepos/deep-dive/data/cnidarian-mirbase-mature-v22.1-no_spaces.fa <==
>cel-let-7-5p_MIMAT0000001_Caenorhabditis_elegans_let-7-5p
UGAGGUAGUAGGUUGUAUAGUU
>cel-let-7-3p_MIMAT0015091_Caenorhabditis_elegans_let-7-3p
CUAUGCAAUUUUCUACCUUACC
>cel-lin-4-5p_MIMAT0000002_Caenorhabditis_elegans_lin-4-5p
UCCCUGAGACCUCAAGUGUGA
>cel-lin-4-3p_MIMAT0015092_Caenorhabditis_elegans_lin-4-3p
ACACCUGGGCUCUCCGGGUACC
>cel-miR-1-5p_MIMAT0020301_Caenorhabditis_elegans_miR-1-5p
CAUACUUCCUUACAUGCCCAUA

==> /home/shared/8TB_HDD_01/sam/gitrepos/deep-dive/data/cnidarian-mirbase-mature-v22.1-no_U.fa <==
>cel-let-7-5p MIMAT0000001 Caenorhabditis elegans let-7-5p
TGAGGTAGTAGGTTGTATAGTT
>cel-let-7-3p MIMAT0015091 Caenorhabditis elegans let-7-3p
CTATGCAATTTTCTACCTTACC
>cel-lin-4-5p MIMAT0000002 Caenorhabditis elegans lin-4-5p
TCCCTGAGACCTCAAGTGTGA
>cel-lin-4-3p MIMAT0015092 Caenorhabditis elegans lin-4-3p
ACACCTGGGCTCTCCGGGTACC
>cel-miR-1-5p MIMAT0020301 Caenorhabditis elegans miR-1-5p
CATACTTCCTTACATGCCCATA

==> /home/shared/8TB_HDD_01/sam/gitrepos/deep-dive/data/cnidarian_miRNAs.fasta <==
>spi-mir-temp-1_Stylophora_pistillata_Liew_et_al._2014_Matches_miR-100_family.
ACCCGUAGAUCCGAACUUGUGG
>spi-mir-temp-2_Stylophora_pistillata_Liew_et_al._2014_NA
UAUCGAAUCCGUCAAAAAGAGA
>spi-mir-temp-3_Stylophora_pistillata_Liew_et_al._2014_NA
UCAGGGAUUGUGGUGAGUUAGUU
>spi-mir-temp-4_Stylophora_pistillata_Liew_et_al._2014_Exact_match_of_nve-miR-2023.
AAAGAAGUACAAGUGGUAGGG
>spi-mir-temp-5_Stylophora_pistillata_Liew_et_al._2014_NA
GAGGUCCGGAUGGUUGA

==> /home/shared/8TB_HDD_01/sam/gitrepos/deep-dive/data/mirbase-mature-v22.1.fa <==
>cel-let-7-5p MIMAT0000001 Caenorhabditis elegans let-7-5p
UGAGGUAGUAGGUUGUAUAGUU
>cel-let-7-3p MIMAT0015091 Caenorhabditis elegans let-7-3p
CUAUGCAAUUUUCUACCUUACC
>cel-lin-4-5p MIMAT0000002 Caenorhabditis elegans lin-4-5p
UCCCUGAGACCUCAAGUGUGA
>cel-lin-4-3p MIMAT0015092 Caenorhabditis elegans lin-4-3p
ACACCUGGGCUCUCCGGGUACC
>cel-miR-1-5p MIMAT0020301 Caenorhabditis elegans miR-1-5p
CAUACUUCCUUACAUGCCCAUA

==> /home/shared/8TB_HDD_01/sam/gitrepos/deep-dive/data/mirbase-mature-v22.1-no_spaces.fa <==
>cel-let-7-5p_MIMAT0000001_Caenorhabditis_elegans_let-7-5p
UGAGGUAGUAGGUUGUAUAGUU
>cel-let-7-3p_MIMAT0015091_Caenorhabditis_elegans_let-7-3p
CUAUGCAAUUUUCUACCUUACC
>cel-lin-4-5p_MIMAT0000002_Caenorhabditis_elegans_lin-4-5p
UCCCUGAGACCUCAAGUGUGA
>cel-lin-4-3p_MIMAT0015092_Caenorhabditis_elegans_lin-4-3p
ACACCUGGGCUCUCCGGGUACC
>cel-miR-1-5p_MIMAT0020301_Caenorhabditis_elegans_miR-1-5p
CAUACUUCCUUACAUGCCCAUA

==> /home/shared/8TB_HDD_01/sam/gitrepos/deep-dive/data/mirbase-mature-v22.1-no_U.fa <==
>cel-let-7-5p MIMAT0000001 Caenorhabditis elegans let-7-5p
TGAGGTAGTAGGTTGTATAGTT
>cel-let-7-3p MIMAT0015091 Caenorhabditis elegans let-7-3p
CTATGCAATTTTCTACCTTACC
>cel-lin-4-5p MIMAT0000002 Caenorhabditis elegans lin-4-5p
TCCCTGAGACCTCAAGTGTGA
>cel-lin-4-3p MIMAT0015092 Caenorhabditis elegans lin-4-3p
ACACCTGGGCTCTCCGGGTACC
>cel-miR-1-5p MIMAT0020301 Caenorhabditis elegans miR-1-5p
CATACTTCCTTACATGCCCATA

==> /home/shared/8TB_HDD_01/sam/gitrepos/deep-dive/data/mirgene-mature-all-v2.1.fa <==
>Aae-Bantam_3p
UGAGAUCAUUUUGAAAGCUGAUU
>Bge-Bantam_3p
UGAGAUCAUUGUGAAAGCUGAUU
>Bpl-Bantam_3p
UGAGAUCAUUGUGAAAACUGAU
>Cgi-Bantam_3p
UGAGAUCAUUGUGAAAACUGAUU
>Cte-Bantam_3p
UGAGAUCAUUGUGAAAACUAAUC

==> /home/shared/8TB_HDD_01/sam/gitrepos/deep-dive/data/mirgene-mature-all-v2.1-no_U.fa <==
>Aae-Bantam_3p
TGAGATCATTTTGAAAGCTGATT
>Bge-Bantam_3p
TGAGATCATTGTGAAAGCTGATT
>Bpl-Bantam_3p
TGAGATCATTGTGAAAACTGAT
>Cgi-Bantam_3p
TGAGATCATTGTGAAAACTGATT
>Cte-Bantam_3p
TGAGATCATTGTGAAAACTAATC

4 Convert U to T in miRNA FastAs

This is needed because the sRNAseq sequences do not have uracils (U) - they have thymines (T).

# Load bash variables into memory
source .bashvars

# Convert miRBase FastA
sed '/^[^>]/s/U/T/g' "${deep_dive_data_dir}/${mirbase_mature_fasta_name}" \
> "${deep_dive_data_dir}/${mirbase_mature_fasta_no_U}"

# Convert MirGene FastA
sed '/^[^>]/s/U/T/g' "${deep_dive_data_dir}/${mirgene_mature_fasta_name}" \
> "${deep_dive_data_dir}/${mirgene_mature_fasta_no_U}"

head "${deep_dive_data_dir}"/[cm][ni]*U.fa
  
==> /home/shared/8TB_HDD_01/sam/gitrepos/deep-dive/data/cnidarian-mirbase-mature-v22.1-no_U.fa <==
>cel-let-7-5p MIMAT0000001 Caenorhabditis elegans let-7-5p
TGAGGTAGTAGGTTGTATAGTT
>cel-let-7-3p MIMAT0015091 Caenorhabditis elegans let-7-3p
CTATGCAATTTTCTACCTTACC
>cel-lin-4-5p MIMAT0000002 Caenorhabditis elegans lin-4-5p
TCCCTGAGACCTCAAGTGTGA
>cel-lin-4-3p MIMAT0015092 Caenorhabditis elegans lin-4-3p
ACACCTGGGCTCTCCGGGTACC
>cel-miR-1-5p MIMAT0020301 Caenorhabditis elegans miR-1-5p
CATACTTCCTTACATGCCCATA

==> /home/shared/8TB_HDD_01/sam/gitrepos/deep-dive/data/mirbase-mature-v22.1-no_U.fa <==
>cel-let-7-5p MIMAT0000001 Caenorhabditis elegans let-7-5p
TGAGGTAGTAGGTTGTATAGTT
>cel-let-7-3p MIMAT0015091 Caenorhabditis elegans let-7-3p
CTATGCAATTTTCTACCTTACC
>cel-lin-4-5p MIMAT0000002 Caenorhabditis elegans lin-4-5p
TCCCTGAGACCTCAAGTGTGA
>cel-lin-4-3p MIMAT0015092 Caenorhabditis elegans lin-4-3p
ACACCTGGGCTCTCCGGGTACC
>cel-miR-1-5p MIMAT0020301 Caenorhabditis elegans miR-1-5p
CATACTTCCTTACATGCCCATA

==> /home/shared/8TB_HDD_01/sam/gitrepos/deep-dive/data/mirgene-mature-all-v2.1-no_U.fa <==
>Aae-Bantam_3p
TGAGATCATTTTGAAAGCTGATT
>Bge-Bantam_3p
TGAGATCATTGTGAAAGCTGATT
>Bpl-Bantam_3p
TGAGATCATTGTGAAAACTGAT
>Cgi-Bantam_3p
TGAGATCATTGTGAAAACTGATT
>Cte-Bantam_3p
TGAGATCATTGTGAAAACTAATC

5 Create BLAST Databases

# Load bash variables into memory
source .bashvars

# MirGene BLAST DB
## Make sure output directory exists
if [ ! -d "${blast_dbs_dir}" ]; then
  mkdir --parents "${blast_dbs_dir}"
fi

## Check for pre-exising database
if [ ! -f "${blast_dbs_dir}/${mirgene_mature_fasta_no_U%.*}.blastdb.log" ]; then
  ${ncbi_makeblast_db} \
  -in ${deep_dive_data_dir}/${mirgene_mature_fasta_no_U} \
  -title ${mirgene_mature_fasta_no_U%.*} \
  -dbtype nucl \
  -out ${blast_dbs_dir}/${mirgene_mature_fasta_no_U%.*} \
  -logfile ${blast_dbs_dir}/${mirgene_mature_fasta_no_U%.*}.blastdb.log
fi

# miRBase BLAST DB
## Make sure output directory exists
if [ ! -d "${blast_dbs_dir}" ]; then
  mkdir --parents "${blast_dbs_dir}"
fi

## Check for pre-exising database
if [ ! -f "${blast_dbs_dir}/${mirbase_mature_fasta_no_U%.*}.blastdb.log" ]; then
  ${ncbi_makeblast_db} \
  -in ${deep_dive_data_dir}/${mirbase_mature_fasta_no_U} \
  -title ${mirbase_mature_fasta_no_U%.*} \
  -dbtype nucl \
  -out ${blast_dbs_dir}/${mirbase_mature_fasta_no_U%.*} \
  -logfile ${blast_dbs_dir}/${mirbase_mature_fasta_no_U%.*}.blastdb.log
fi

6 Prepare reads for BLASTing

6.1 Concatenate all trimmed reads

# Load bash variables into memory
source .bashvars

# Make output directory, if it doens't exist
if [ ! -d "${output_dir_top}" ]; then
  mkdir --parents "${output_dir_top}"
fi

# Check for existence of concatenated FastA before running
if [ ! -f "${output_dir_top}/${concatenated_trimmed_reads_fastq}" ]; then
  cat ${trimmed_fastqs_dir}/${trimmed_fastqs_pattern} \
  > "${output_dir_top}/${concatenated_trimmed_reads_fastq}"
fi

ls -lh "${output_dir_top}/${concatenated_trimmed_reads_fastq}"
-rw-r--r-- 1 sam sam 1.1G Apr 22 11:03 /home/shared/8TB_HDD_01/sam/gitrepos/deep-dive/F-Pmea/output/10.1-Pmea-sRNAseq-BLASTn-31bp-fastp-merged-cnidarian_miRBase/concatenated-trimmed-reads-all.fastq.gz

6.2 Collapse reads to FastA

Uses fastx_collapser to collapse to unique reads.

Requires undocumented quality setting. Have selected 30 as cuttoff: -Q30.

# Load bash variables into memory
source .bashvars

# Check for existence of collapsed FastA before running
time \
if [ ! -f "${output_dir_top}/${collapsed_reads_fasta}" ]; then
  zcat ${output_dir_top}/${concatenated_trimmed_reads_fastq} \
  | ${fastx_collapser} \
  -Q30 \
  -o "${output_dir_top}/${collapsed_reads_fasta}"
fi

head "${output_dir_top}/${collapsed_reads_fasta}"

echo ""

echo "-----------------------------------------------------"
echo ""
echo "Number of collapsed reads:"
grep --count "^>" "${output_dir_top}/${collapsed_reads_fasta}"

real    0m0.000s
user    0m0.000s
sys 0m0.000s
>1-10257663
TGAAAATCTTTGCTCTGAAGTGGAA
>2-2952210
CTCGGGCTGAGACTTGAAGCG
>3-1527059
GCACTGGTGGTTCAGTGGTAGAATTCTC
>4-1205244
GCACTGGTGGTTCAGTGGTAGAATTCTCGCC
>5-1189262
CTCGGGCTGAGACTTGAAGCA

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

Number of collapsed reads:
6393700

7 Run BLASTn Default E-value

  • 1000 for blastn-short

Runs BLASTn using the blastn-short task for sequences < 30bp.

Look for top match (-max_hsps 1 & -max_target_seqs 1) for each query.

  • Suppress subsequent warning Examining 5 or more matches is recommended by redirecting stdout: 2> /dev/null

7.1 Cnidarian miRBase BLASTn Default e-value

# Load bash variables into memory
source .bashvars

time \
${ncbi_blastn} \
-db ${blast_dbs_dir}/${mirbase_mature_fasta_no_U%.*} \
-query ${output_dir_top}/${collapsed_reads_fasta} \
-out ${output_dir_top}/miRBase-BLASTn-eval_1000.outfmt6 \
-task blastn-short \
-max_hsps 1 \
-max_target_seqs 1 \
-outfmt 6 \
-num_threads ${threads} \
2> /dev/null

7.2 MirGene BLASTn Default e-value

# Load bash variables into memory
source .bashvars

time \
${ncbi_blastn} \
-db ${blast_dbs_dir}/${mirgene_mature_fasta_no_U%.*} \
-query ${output_dir_top}/${collapsed_reads_fasta} \
-out ${output_dir_top}/MirGene-BLASTn-eval_1000.outfmt6 \
-task blastn-short \
-max_hsps 1 \
-max_target_seqs 1 \
-outfmt 6 \
-num_threads ${threads} \
2> /dev/null

8 BLASTn E-value = 10

Running this for simple comparison to the defaul blastn-short value of 1000.

8.1 Cnidarian miRBase BLASTn e-value = 10

# Load bash variables into memory
source .bashvars

time \
${ncbi_blastn} \
-db ${blast_dbs_dir}/${mirbase_mature_fasta_no_U%.*} \
-query ${output_dir_top}/${collapsed_reads_fasta} \
-out ${output_dir_top}/miRBase-BLASTn-eval_10.outfmt6 \
-task blastn-short \
-evalue 10 \
-max_hsps 1 \
-max_target_seqs 1 \
-outfmt 6 \
-num_threads ${threads} \
2> /dev/null

8.2 MirGene BLASTn e-value = 10

# Load bash variables into memory
source .bashvars

time \
${ncbi_blastn} \
-db ${blast_dbs_dir}/${mirgene_mature_fasta_no_U%.*} \
-query ${output_dir_top}/${collapsed_reads_fasta} \
-out ${output_dir_top}/MirGene-BLASTn-eval_10.outfmt6 \
-task blastn-short \
-evalue 10 \
-max_hsps 1 \
-max_target_seqs 1 \
-outfmt 6 \
-num_threads ${threads} \
2> /dev/null

9 BLASTn E-value = 1

Running this for simple comparison to the default blastn-short value of 1000.

9.1 Cnidarian miRBase BLASTn e-value = 1

# Load bash variables into memory
source .bashvars

time \
${ncbi_blastn} \
-db ${blast_dbs_dir}/${mirbase_mature_fasta_no_U%.*} \
-query ${output_dir_top}/${collapsed_reads_fasta} \
-out ${output_dir_top}/cindarian-miRBase-BLASTn-eval_1.outfmt6 \
-task blastn-short \
-evalue 1 \
-max_hsps 1 \
-max_target_seqs 1 \
-outfmt 6 \
-num_threads ${threads} \
2> /dev/null

9.2 MirGene BLASTn e-value = 1

# Load bash variables into memory
source .bashvars

time \
${ncbi_blastn} \
-db ${blast_dbs_dir}/${mirgene_mature_fasta_no_U%.*} \
-query ${output_dir_top}/${collapsed_reads_fasta} \
-out ${output_dir_top}/MirGene-BLASTn-eval_1.outfmt6 \
-task blastn-short \
-evalue 1 \
-max_hsps 1 \
-max_target_seqs 1 \
-outfmt 6 \
-num_threads ${threads} \
2> /dev/null

10 Results

10.1 Check BLASTn Default e-value results

# Load bash variables into memory
source .bashvars

head ${output_dir_top}/*eval_1000.outfmt6

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

wc -l ${output_dir_top}/*eval_1000.outfmt6
==> /home/shared/8TB_HDD_01/sam/gitrepos/deep-dive/F-Pmea/output/10.1-Pmea-sRNAseq-BLASTn-31bp-fastp-merged-cnidarian_miRBase/miRBase-BLASTn-eval_1000.outfmt6 <==
1-10257663  ssc-miR-7143-5p 100.000 11  0   0   12  22  8   18  1.5 22.3
2-2952210   cpo-miR-1379-5p 100.000 12  0   0   1   12  18  7   0.26    24.3
3-1527059   ppc-miR-8214-5p 100.000 13  0   0   12  24  18  6   0.11    26.3
4-1205244   ppc-miR-8214-5p 100.000 13  0   0   12  24  18  6   0.11    26.3
5-1189262   cpo-miR-1379-5p 100.000 12  0   0   1   12  18  7   0.26    24.3
6-630167    cpo-miR-509c-3p 100.000 12  0   0   13  24  8   19  0.37    24.3
7-548099    ppc-miR-8214-5p 100.000 13  0   0   12  24  18  6   0.11    26.3
8-512116    hpo-miR-10025-5p    100.000 10  0   0   11  20  17  8   4.9 20.3
9-432671    cpo-miR-1379-5p 100.000 12  0   0   1   12  18  7   0.34    24.3
10-407718   ppc-miR-8214-5p 100.000 13  0   0   12  24  18  6   0.11    26.3

==> /home/shared/8TB_HDD_01/sam/gitrepos/deep-dive/F-Pmea/output/10.1-Pmea-sRNAseq-BLASTn-31bp-fastp-merged-cnidarian_miRBase/MirGene-BLASTn-eval_1000.outfmt6 <==
1-10257663  Tca-Mir-87-P2_3p    100.000 11  0   0   5   15  13  3   0.54    22.3
2-2952210   Ovu-Novel-55_5p 100.000 9   0   0   10  18  14  6   7.3 18.3
3-1527059   Pma-Mir-96-P3o2_5p  100.000 11  0   0   16  26  9   19  0.66    22.3
4-1205244   Pma-Mir-96-P3o2_5p  100.000 11  0   0   16  26  9   19  0.78    22.3
5-1189262   Obi-Novel-51_3p 100.000 9   0   0   5   13  7   15  7.3 18.3
6-630167    Cpo-Mir-506-o3_3p   100.000 12  0   0   13  24  8   19  0.14    24.3
7-548099    Pma-Mir-96-P3o2_5p  100.000 11  0   0   16  26  9   19  0.62    22.3
8-512116    Ovu-Novel-18_5p 92.308  13  1   0   7   19  21  9   8.6 18.3
9-432671    Mml-Mir-2114_5p 100.000 11  0   0   13  23  11  21  0.51    22.3
10-407718   Pma-Mir-96-P3o2_5p  100.000 11  0   0   16  26  9   19  0.78    22.3

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

  6393700 /home/shared/8TB_HDD_01/sam/gitrepos/deep-dive/F-Pmea/output/10.1-Pmea-sRNAseq-BLASTn-31bp-fastp-merged-cnidarian_miRBase/miRBase-BLASTn-eval_1000.outfmt6
  6393700 /home/shared/8TB_HDD_01/sam/gitrepos/deep-dive/F-Pmea/output/10.1-Pmea-sRNAseq-BLASTn-31bp-fastp-merged-cnidarian_miRBase/MirGene-BLASTn-eval_1000.outfmt6
 12787400 total

10.2 Check BLASTn e-value = 10 results

# Load bash variables into memory
source .bashvars

head ${output_dir_top}/*eval_10.outfmt6

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

wc -l ${output_dir_top}/*eval_10.outfmt6
==> /home/shared/8TB_HDD_01/sam/gitrepos/deep-dive/F-Pmea/output/10.1-Pmea-sRNAseq-BLASTn-31bp-fastp-merged-cnidarian_miRBase/miRBase-BLASTn-eval_10.outfmt6 <==
1-10257663  ssc-miR-7143-5p 100.000 11  0   0   12  22  8   18  1.5 22.3
2-2952210   cpo-miR-1379-5p 100.000 12  0   0   1   12  18  7   0.26    24.3
3-1527059   ppc-miR-8214-5p 100.000 13  0   0   12  24  18  6   0.11    26.3
4-1205244   ppc-miR-8214-5p 100.000 13  0   0   12  24  18  6   0.11    26.3
5-1189262   cpo-miR-1379-5p 100.000 12  0   0   1   12  18  7   0.26    24.3
6-630167    cpo-miR-509c-3p 100.000 12  0   0   13  24  8   19  0.37    24.3
7-548099    ppc-miR-8214-5p 100.000 13  0   0   12  24  18  6   0.11    26.3
8-512116    hpo-miR-10025-5p    100.000 10  0   0   11  20  17  8   4.9 20.3
9-432671    cpo-miR-1379-5p 100.000 12  0   0   1   12  18  7   0.34    24.3
10-407718   ppc-miR-8214-5p 100.000 13  0   0   12  24  18  6   0.11    26.3

==> /home/shared/8TB_HDD_01/sam/gitrepos/deep-dive/F-Pmea/output/10.1-Pmea-sRNAseq-BLASTn-31bp-fastp-merged-cnidarian_miRBase/MirGene-BLASTn-eval_10.outfmt6 <==
1-10257663  Tca-Mir-87-P2_3p    100.000 11  0   0   5   15  13  3   0.54    22.3
2-2952210   Ovu-Novel-55_5p 100.000 9   0   0   10  18  14  6   7.3 18.3
3-1527059   Pma-Mir-96-P3o2_5p  100.000 11  0   0   16  26  9   19  0.66    22.3
4-1205244   Pma-Mir-96-P3o2_5p  100.000 11  0   0   16  26  9   19  0.78    22.3
5-1189262   Obi-Novel-51_3p 100.000 9   0   0   5   13  7   15  7.3 18.3
6-630167    Cpo-Mir-506-o3_3p   100.000 12  0   0   13  24  8   19  0.14    24.3
7-548099    Pma-Mir-96-P3o2_5p  100.000 11  0   0   16  26  9   19  0.62    22.3
8-512116    Ovu-Novel-18_5p 92.308  13  1   0   7   19  21  9   8.6 18.3
9-432671    Mml-Mir-2114_5p 100.000 11  0   0   13  23  11  21  0.51    22.3
10-407718   Pma-Mir-96-P3o2_5p  100.000 11  0   0   16  26  9   19  0.78    22.3

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

  6367488 /home/shared/8TB_HDD_01/sam/gitrepos/deep-dive/F-Pmea/output/10.1-Pmea-sRNAseq-BLASTn-31bp-fastp-merged-cnidarian_miRBase/miRBase-BLASTn-eval_10.outfmt6
  6010885 /home/shared/8TB_HDD_01/sam/gitrepos/deep-dive/F-Pmea/output/10.1-Pmea-sRNAseq-BLASTn-31bp-fastp-merged-cnidarian_miRBase/MirGene-BLASTn-eval_10.outfmt6
 12378373 total

10.3 Check BLASTn e-value = 1 results

# Load bash variables into memory
source .bashvars

head ${output_dir_top}/*eval_1.outfmt6

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

wc -l ${output_dir_top}/*eval_1.outfmt6
==> /home/shared/8TB_HDD_01/sam/gitrepos/deep-dive/F-Pmea/output/10.1-Pmea-sRNAseq-BLASTn-31bp-fastp-merged-cnidarian_miRBase/cindarian-miRBase-BLASTn-eval_1.outfmt6 <==
2-2952210   cpo-miR-1379-5p 100.000 12  0   0   1   12  18  7   0.26    24.3
3-1527059   ppc-miR-8214-5p 100.000 13  0   0   12  24  18  6   0.11    26.3
4-1205244   ppc-miR-8214-5p 100.000 13  0   0   12  24  18  6   0.11    26.3
5-1189262   cpo-miR-1379-5p 100.000 12  0   0   1   12  18  7   0.26    24.3
6-630167    cpo-miR-509c-3p 100.000 12  0   0   13  24  8   19  0.37    24.3
7-548099    ppc-miR-8214-5p 100.000 13  0   0   12  24  18  6   0.11    26.3
9-432671    cpo-miR-1379-5p 100.000 12  0   0   1   12  18  7   0.34    24.3
10-407718   ppc-miR-8214-5p 100.000 13  0   0   12  24  18  6   0.11    26.3
11-398433   ppc-miR-8214-5p 100.000 13  0   0   11  23  18  6   0.11    26.3
12-361684   spi-miR-L-temp-15_Stylophora_pistillata_Praher_et_al._2021_NA   100.000 22  0   0   1   22  1   22  3.12e-07    44.1

==> /home/shared/8TB_HDD_01/sam/gitrepos/deep-dive/F-Pmea/output/10.1-Pmea-sRNAseq-BLASTn-31bp-fastp-merged-cnidarian_miRBase/MirGene-BLASTn-eval_1.outfmt6 <==
1-10257663  Tca-Mir-87-P2_3p    100.000 11  0   0   5   15  13  3   0.54    22.3
3-1527059   Pma-Mir-96-P3o2_5p  100.000 11  0   0   16  26  9   19  0.66    22.3
4-1205244   Pma-Mir-96-P3o2_5p  100.000 11  0   0   16  26  9   19  0.78    22.3
6-630167    Cpo-Mir-506-o3_3p   100.000 12  0   0   13  24  8   19  0.14    24.3
7-548099    Pma-Mir-96-P3o2_5p  100.000 11  0   0   16  26  9   19  0.62    22.3
9-432671    Mml-Mir-2114_5p 100.000 11  0   0   13  23  11  21  0.51    22.3
10-407718   Pma-Mir-96-P3o2_5p  100.000 11  0   0   16  26  9   19  0.78    22.3
11-398433   Pma-Mir-96-P3o2_5p  100.000 11  0   0   15  25  9   19  0.62    22.3
12-361684   Xla-Mir-456-P2_3p   100.000 11  0   0   9   19  2   12  0.51    22.3
13-339071   Pma-Mir-96-P3o2_5p  100.000 11  0   0   15  25  9   19  0.74    22.3

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

  2914563 /home/shared/8TB_HDD_01/sam/gitrepos/deep-dive/F-Pmea/output/10.1-Pmea-sRNAseq-BLASTn-31bp-fastp-merged-cnidarian_miRBase/cindarian-miRBase-BLASTn-eval_1.outfmt6
  2130019 /home/shared/8TB_HDD_01/sam/gitrepos/deep-dive/F-Pmea/output/10.1-Pmea-sRNAseq-BLASTn-31bp-fastp-merged-cnidarian_miRBase/MirGene-BLASTn-eval_1.outfmt6
  5044582 total

11 Summary

The default e-value results in alignments for 100% of sequences.

Decreasing the e-value to 10 resulted in fewer query alignments, as we’d expect, but only minimally.

Decreasing the e-value to 1 resulted in ~40-45% of query alignments.

For further analysis, we should probably discuss a reasonable e-value to use for filtering, as it might be worthwhile to test even lower e-value thresholds.

For further analysis, we should probably discuss a reasonable e-value to use for filtering.


Citations

Altschul, Stephen F., Warren Gish, Webb Miller, Eugene W. Myers, and David J. Lipman. 1990. “Basic Local Alignment Search Tool.” Journal of Molecular Biology 215 (3): 403–10. https://doi.org/10.1016/s0022-2836(05)80360-2.
LS0tCnRpdGxlOiAiMTAuMS1QbWVhLXNSTkFzZXEtQkxBU1RuLTMxYnAtZmFzdHAtbWVyZ2VkLWNuaWRhcmlhbl9taVJCYXNlIgphdXRob3I6ICJTYW0gV2hpdGUgKG1vZGlmaWVkIGJ5IEsgRHVya2luIGZvciBQLiBtZWFuZHJpbmEgYW5hbHlzaXMpIgpkYXRlOiAiMjAyNC0wNC0xOSIKb3V0cHV0OiAKICBib29rZG93bjo6aHRtbF9kb2N1bWVudDI6CiAgICB0aGVtZTogY29zbW8KICAgIHRvYzogdHJ1ZQogICAgdG9jX2Zsb2F0OiB0cnVlCiAgICBudW1iZXJfc2VjdGlvbnM6IHRydWUKICAgIGNvZGVfZm9sZGluZzogc2hvdwogICAgY29kZV9kb3dubG9hZDogdHJ1ZQogIGdpdGh1Yl9kb2N1bWVudDoKICAgIHRvYzogdHJ1ZQogICAgbnVtYmVyX3NlY3Rpb25zOiB0cnVlCiAgaHRtbF9kb2N1bWVudDoKICAgIHRoZW1lOiBjb3NtbwogICAgdG9jOiB0cnVlCiAgICB0b2NfZmxvYXQ6IHRydWUKICAgIG51bWJlcl9zZWN0aW9uczogdHJ1ZQogICAgY29kZV9mb2xkaW5nOiBzaG93CiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlCmJpYmxpb2dyYXBoeTogcmVmZXJlbmNlcy5iaWIKbGluay1jaXRhdGlvbnM6IHRydWUKLS0tCgpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0KbGlicmFyeShrbml0cikKbGlicmFyeShrYWJsZUV4dHJhKQpsaWJyYXJ5KGRwbHlyKQpsaWJyYXJ5KHJldGljdWxhdGUpCmtuaXRyOjpvcHRzX2NodW5rJHNldCgKICBlY2hvID0gVFJVRSwgICAgICAgICAjIERpc3BsYXkgY29kZSBjaHVua3MKICBldmFsID0gRkFMU0UsICAgICAgICAjIEV2YWx1YXRlIGNvZGUgY2h1bmtzCiAgd2FybmluZyA9IEZBTFNFLCAgICAgIyBIaWRlIHdhcm5pbmdzCiAgbWVzc2FnZSA9IEZBTFNFLCAgICAgIyBIaWRlIG1lc3NhZ2VzCiAgY29tbWVudCA9ICIiLCAgICAgICAgIyBQcmV2ZW50cyBhcHBlbmRpbmcgJyMjJyB0byBiZWdpbm5pbmcgb2YgbGluZXMgaW4gY29kZSBvdXRwdXQKICB3aWR0aCA9IDEwMDAgICAgICAgICAjIGFkZHMgc2Nyb2xsIGJhcgopCmBgYAoKVGhpcyBub3RlYm9vayBwZXJmb3JtcyBhIHNpbXBsZSBbTkNCSSBCTEFTVG5dKGh0dHBzOi8vd3d3Lm5jYmkubmxtLm5paC5nb3YvYm9va3MvTkJLMjc5NjkwLykgW0BhbHRzY2h1bDE5OTBdIGFnYWluc3QgYW4gbWlSTkEgZGF0YWJhc2UgdG8gYXR0ZW1wdCB0byBpZGVudGlmeSBtaVJOQSBpbiAqUC5tZWFuZHJpbmEqIHNSTkFzZXE6CgotICAgW21pUkJhc2VdKGh0dHBzOi8vbWlyYmFzZS5vcmcvZG93bmxvYWQvKQogICAgLSAgIFV0aWxpemVzIGEgbW9kaWZpZWQgdmVyc2lvbiwgd2hpY2ggaW5jbHVkZXMgY25pZGFyaWFuIG1pUk5BIGN1bGxlZCBmcm9tIGxpdGVyYXR1cmUgYnkgSmlsbCBBaHNsZXkuCgogICAgLSAgIFtgY25pZGFyaWFuLW1pcmJhc2UtbWF0dXJlLXYyMi4xLmZhc3RhYF0oLi4vLi4vZGF0YS9jbmlkYXJpYW4tbWlyYmFzZS1tYXR1cmUtdjIyLjEuZmFzdGEpCiAgICAKLSBbTWlyR2VuZURCXShodHRwczovL3d3dy5taXJnZW5lZGIub3JnL2Rvd25sb2FkKQoKUmVsaWVzIG9uIHRoZSBmb2xsb3dpbmcgc29mdHdhcmU6CgotICAgW2Zhc3R4X3Rvb2xraXRdKGh0dHA6Ly9oYW5ub25sYWIuY3NobC5lZHUvZmFzdHhfdG9vbGtpdC8pCgogICAgLSAgIGBmYXN0eF9jb2xsYXBzZXJgOiBDb2xsYXBzZXMgZHVwbGljYXRlIHNlcXVlbmNlcyBpbiBGYXN0QS9RIGludG8gc2luZ2xlIHNlcXVlbmNlLgoKIyBDcmVhdGUgYSBCYXNoIHZhcmlhYmxlcyBmaWxlCgpUaGlzIGFsbG93cyB1c2FnZSBvZiBCYXNoIHZhcmlhYmxlcyBhY3Jvc3MgUiBNYXJrZG93biBjaHVua3MuCgpgYGB7ciBzYXZlLWJhc2gtdmFyaWFibGVzLXRvLXJ2YXJzLWZpbGUsIGVuZ2luZT0nYmFzaCcsIGV2YWw9VFJVRX0KewplY2hvICIjIyMjIEFzc2lnbiBWYXJpYWJsZXMgIyMjIyIKZWNobyAiIgoKZWNobyAiIyBUcmltbWVkIEZhc3RRIG5hbWluZyBwYXR0ZXJuIgplY2hvICJleHBvcnQgdHJpbW1lZF9mYXN0cXNfcGF0dGVybj0nKmZhc3RwLWFkYXB0ZXJzLXBvbHlHLTMxYnAtbWVyZ2VkLmZxLmd6JyIKCmVjaG8gIiMgRGF0YSBkaXJlY3RvcmllcyIKZWNobyAnZXhwb3J0IGRlZXBfZGl2ZV9kaXI9L2hvbWUvc2hhcmVkLzhUQl9IRERfMDEvc2FtL2dpdHJlcG9zL2RlZXAtZGl2ZScKZWNobyAnZXhwb3J0IGRlZXBfZGl2ZV9kYXRhX2Rpcj0iJHtkZWVwX2RpdmVfZGlyfS9kYXRhIicKZWNobyAnZXhwb3J0IG91dHB1dF9kaXJfdG9wPSR7ZGVlcF9kaXZlX2Rpcn0vRi1QbWVhL291dHB1dC8xMC4xLVBtZWEtc1JOQXNlcS1CTEFTVG4tMzFicC1mYXN0cC1tZXJnZWQtY25pZGFyaWFuX21pUkJhc2UnCmVjaG8gJ2V4cG9ydCB0cmltbWVkX2Zhc3Rxc19kaXI9IiR7ZGVlcF9kaXZlX2Rpcn0vRi1QbWVhL291dHB1dC8wOC4yLVBtZWEtc1JOQXNlcS10cmltbWluZy0zMWJwLWZhc3RwLW1lcmdlZC90cmltbWVkLXJlYWRzIicKZWNobyAnZXhwb3J0IGJsYXN0X2Ric19kaXI9IiR7ZGVlcF9kaXZlX2Rpcn0vZGF0YS9ibGFzdF9kYnMiJwplY2hvICIiCgplY2hvICIjIElucHV0L091dHB1dCBmaWxlcyIKZWNobyAnZXhwb3J0IGNvbGxhcHNlZF9yZWFkc19mYXN0YT0iY29sbGFwc2VkLXJlYWRzLWFsbC5mYXN0YSInCmVjaG8gJ2V4cG9ydCBjb25jYXRlbmF0ZWRfdHJpbW1lZF9yZWFkc19mYXN0cT0iY29uY2F0ZW5hdGVkLXRyaW1tZWQtcmVhZHMtYWxsLmZhc3RxLmd6IicKZWNobyAnZXhwb3J0IG1pcmJhc2VfbWF0dXJlX2Zhc3RhX25hbWU9ImNuaWRhcmlhbi1taXJiYXNlLW1hdHVyZS12MjIuMS5mYXN0YSInCmVjaG8gJ2V4cG9ydCBtaXJiYXNlX21hdHVyZV9mYXN0YV9ub19VPSJjbmlkYXJpYW4tbWlyYmFzZS1tYXR1cmUtdjIyLjEtbm9fVS5mYSInCmVjaG8gJ2V4cG9ydCBtaXJnZW5lX21hdHVyZV9mYXN0YV9uYW1lPSJtaXJnZW5lLW1hdHVyZS1hbGwtdjIuMS5mYSInCmVjaG8gJ2V4cG9ydCBtaXJnZW5lX21hdHVyZV9mYXN0YV9ub19VPSJtaXJnZW5lLW1hdHVyZS1hbGwtdjIuMS1ub19VLmZhIicKZWNobyAiIgoKZWNobyAiIyBFeHRlcm5hbCBkYXRhIFVSTHMiCmVjaG8gJ2V4cG9ydCBtaXJnZW5lZGJfZmFzdGFfdXJsPSJodHRwczovL3d3dy5taXJnZW5lZGIub3JnL2Zhc3RhL0FMTD9tYXQ9MSInCmVjaG8gIiIKCmVjaG8gIiMgUGF0aHMgdG8gcHJvZ3JhbXMiCmVjaG8gJ2V4cG9ydCBuY2JpX2JsYXN0X2Rpcj0iL2hvbWUvc2hhcmVkL25jYmktYmxhc3QtMi4xNS4wKy9iaW4vIicKZWNobyAnZXhwb3J0IG5jYmlfYmxhc3RuPSIke25jYmlfYmxhc3RfZGlyfS9ibGFzdG4iJwplY2hvICdleHBvcnQgbmNiaV9tYWtlYmxhc3RfZGI9IiR7bmNiaV9ibGFzdF9kaXJ9L21ha2VibGFzdGRiIicKZWNobyAnZXhwb3J0IGZhc3R4X2NvbGxhcHNlcj0iL2hvbWUvc2hhcmVkL2Zhc3R4X3Rvb2xraXRfMC4wLjEzX2JpbmFyaWVzX0xpbnV4XzIuNl9hbWQ2NC9iaW4vZmFzdHhfY29sbGFwc2VyIicKCmVjaG8gIiMgU2V0IG51bWJlciBvZiBDUFVzIHRvIHVzZSIKZWNobyAnZXhwb3J0IHRocmVhZHM9NDYnCmVjaG8gIiIKCmVjaG8gIiMgSW5pdGlhbGl6ZSBhcnJheXMiCmVjaG8gJ2V4cG9ydCB0cmltbWVkX2Zhc3Rxc19hcnJheT0oKScKCgp9ID4gLmJhc2h2YXJzCgpjYXQgLmJhc2h2YXJzCmBgYAojIERvd25sb2FkIE1pckdlbmVEQiBGYXN0YQpgYGB7ciBkb3dubG9hZC1taXJnZW5lLWRiLUZhc3RBLCBlbmdpbmU9J2Jhc2gnLCBldmFsPVRSVUV9CiMgTG9hZCBiYXNoIHZhcmlhYmxlcyBpbnRvIG1lbW9yeQpzb3VyY2UgLmJhc2h2YXJzCgojIERvd25sb2FkIE1pckdlbmVEQiwgaWYgaXQgZG9lc24ndCBleGlzdAppZiBbICEgLWYgIiR7ZGVlcF9kaXZlX2RhdGFfZGlyfS8ke21pcmdlbmVfbWF0dXJlX2Zhc3RhX25hbWV9IiBdOyB0aGVuCgogIHdnZXQgXAogIC0tbm8tY2hlY2stY2VydGlmaWNhdGUgXAogIC0tY29udGludWUgXAogIC0tbm8taG9zdC1kaXJlY3RvcmllcyBcCiAgLS1uby1kaXJlY3RvcmllcyBcCiAgLS1uby1wYXJlbnQgXAogIC0tcXVpZXQgXAogIC0tZXhlY3V0ZSByb2JvdHM9b2ZmIFwKICAtLW91dHB1dC1kb2N1bWVudCAke2RlZXBfZGl2ZV9kYXRhX2Rpcn0vJHttaXJnZW5lX21hdHVyZV9mYXN0YV9uYW1lfSBcCiAgICR7bWlyZ2VuZWRiX2Zhc3RhX3VybH0KIApmaQogCmxzIC1saCAke2RlZXBfZGl2ZV9kYXRhX2Rpcn0KYGBgCgoKIyBJbnNwZWN0IG1pUk5BIEZhc3RBcwoKYGBge3IgaW5zcGVjdC1taVJOQS1GYXN0QXMsIGVuZ2luZT0nYmFzaCcsIGV2YWw9VFJVRX0KIyBMb2FkIGJhc2ggdmFyaWFibGVzIGludG8gbWVtb3J5CnNvdXJjZSAuYmFzaHZhcnMKCmhlYWQgIiR7ZGVlcF9kaXZlX2RhdGFfZGlyfSIvW2NtXVtuaV0qLmZhKgpgYGAKCiMgQ29udmVydCBgVWAgdG8gYFRgIGluIG1pUk5BIEZhc3RBcwoKVGhpcyBpcyBuZWVkZWQgYmVjYXVzZSB0aGUgc1JOQXNlcSBzZXF1ZW5jZXMgZG8gKm5vdCogaGF2ZSB1cmFjaWxzIChgVWApIC0gdGhleSBoYXZlIHRoeW1pbmVzIChgVGApLgoKYGBge3IgY29udmVydC1VLXRvLVQsIGVuZ2luZT0nYmFzaCcsIGV2YWw9VFJVRX0KIyBMb2FkIGJhc2ggdmFyaWFibGVzIGludG8gbWVtb3J5CnNvdXJjZSAuYmFzaHZhcnMKCiMgQ29udmVydCBtaVJCYXNlIEZhc3RBCnNlZCAnL15bXj5dL3MvVS9UL2cnICIke2RlZXBfZGl2ZV9kYXRhX2Rpcn0vJHttaXJiYXNlX21hdHVyZV9mYXN0YV9uYW1lfSIgXAo+ICIke2RlZXBfZGl2ZV9kYXRhX2Rpcn0vJHttaXJiYXNlX21hdHVyZV9mYXN0YV9ub19VfSIKCiMgQ29udmVydCBNaXJHZW5lIEZhc3RBCnNlZCAnL15bXj5dL3MvVS9UL2cnICIke2RlZXBfZGl2ZV9kYXRhX2Rpcn0vJHttaXJnZW5lX21hdHVyZV9mYXN0YV9uYW1lfSIgXAo+ICIke2RlZXBfZGl2ZV9kYXRhX2Rpcn0vJHttaXJnZW5lX21hdHVyZV9mYXN0YV9ub19VfSIKCmhlYWQgIiR7ZGVlcF9kaXZlX2RhdGFfZGlyfSIvW2NtXVtuaV0qVS5mYQogIApgYGAKCiMgQ3JlYXRlIEJMQVNUIERhdGFiYXNlcwoKYGBge3IgbWFrZS1ibGFzdC1kYnMsIGVuZ2luZT0nYmFzaCcsIGV2YWw9VFJVRX0KIyBMb2FkIGJhc2ggdmFyaWFibGVzIGludG8gbWVtb3J5CnNvdXJjZSAuYmFzaHZhcnMKCiMgTWlyR2VuZSBCTEFTVCBEQgojIyBNYWtlIHN1cmUgb3V0cHV0IGRpcmVjdG9yeSBleGlzdHMKaWYgWyAhIC1kICIke2JsYXN0X2Ric19kaXJ9IiBdOyB0aGVuCiAgbWtkaXIgLS1wYXJlbnRzICIke2JsYXN0X2Ric19kaXJ9IgpmaQoKIyMgQ2hlY2sgZm9yIHByZS1leGlzaW5nIGRhdGFiYXNlCmlmIFsgISAtZiAiJHtibGFzdF9kYnNfZGlyfS8ke21pcmdlbmVfbWF0dXJlX2Zhc3RhX25vX1UlLip9LmJsYXN0ZGIubG9nIiBdOyB0aGVuCiAgJHtuY2JpX21ha2VibGFzdF9kYn0gXAogIC1pbiAke2RlZXBfZGl2ZV9kYXRhX2Rpcn0vJHttaXJnZW5lX21hdHVyZV9mYXN0YV9ub19VfSBcCiAgLXRpdGxlICR7bWlyZ2VuZV9tYXR1cmVfZmFzdGFfbm9fVSUuKn0gXAogIC1kYnR5cGUgbnVjbCBcCiAgLW91dCAke2JsYXN0X2Ric19kaXJ9LyR7bWlyZ2VuZV9tYXR1cmVfZmFzdGFfbm9fVSUuKn0gXAogIC1sb2dmaWxlICR7Ymxhc3RfZGJzX2Rpcn0vJHttaXJnZW5lX21hdHVyZV9mYXN0YV9ub19VJS4qfS5ibGFzdGRiLmxvZwpmaQoKIyBtaVJCYXNlIEJMQVNUIERCCiMjIE1ha2Ugc3VyZSBvdXRwdXQgZGlyZWN0b3J5IGV4aXN0cwppZiBbICEgLWQgIiR7Ymxhc3RfZGJzX2Rpcn0iIF07IHRoZW4KICBta2RpciAtLXBhcmVudHMgIiR7Ymxhc3RfZGJzX2Rpcn0iCmZpCgojIyBDaGVjayBmb3IgcHJlLWV4aXNpbmcgZGF0YWJhc2UKaWYgWyAhIC1mICIke2JsYXN0X2Ric19kaXJ9LyR7bWlyYmFzZV9tYXR1cmVfZmFzdGFfbm9fVSUuKn0uYmxhc3RkYi5sb2ciIF07IHRoZW4KICAke25jYmlfbWFrZWJsYXN0X2RifSBcCiAgLWluICR7ZGVlcF9kaXZlX2RhdGFfZGlyfS8ke21pcmJhc2VfbWF0dXJlX2Zhc3RhX25vX1V9IFwKICAtdGl0bGUgJHttaXJiYXNlX21hdHVyZV9mYXN0YV9ub19VJS4qfSBcCiAgLWRidHlwZSBudWNsIFwKICAtb3V0ICR7Ymxhc3RfZGJzX2Rpcn0vJHttaXJiYXNlX21hdHVyZV9mYXN0YV9ub19VJS4qfSBcCiAgLWxvZ2ZpbGUgJHtibGFzdF9kYnNfZGlyfS8ke21pcmJhc2VfbWF0dXJlX2Zhc3RhX25vX1UlLip9LmJsYXN0ZGIubG9nCmZpCmBgYAoKIyBQcmVwYXJlIHJlYWRzIGZvciBCTEFTVGluZwoKIyMgQ29uY2F0ZW5hdGUgYWxsIHRyaW1tZWQgcmVhZHMKCmBgYHtyIGNvbmNhdGVuYXRlLXRyaW1tZWQtcmVhZHMsIGVuZ2luZT0nYmFzaCcsIGV2YWw9VFJVRX0KIyBMb2FkIGJhc2ggdmFyaWFibGVzIGludG8gbWVtb3J5CnNvdXJjZSAuYmFzaHZhcnMKCiMgTWFrZSBvdXRwdXQgZGlyZWN0b3J5LCBpZiBpdCBkb2Vucyd0IGV4aXN0CmlmIFsgISAtZCAiJHtvdXRwdXRfZGlyX3RvcH0iIF07IHRoZW4KICBta2RpciAtLXBhcmVudHMgIiR7b3V0cHV0X2Rpcl90b3B9IgpmaQoKIyBDaGVjayBmb3IgZXhpc3RlbmNlIG9mIGNvbmNhdGVuYXRlZCBGYXN0QSBiZWZvcmUgcnVubmluZwppZiBbICEgLWYgIiR7b3V0cHV0X2Rpcl90b3B9LyR7Y29uY2F0ZW5hdGVkX3RyaW1tZWRfcmVhZHNfZmFzdHF9IiBdOyB0aGVuCiAgY2F0ICR7dHJpbW1lZF9mYXN0cXNfZGlyfS8ke3RyaW1tZWRfZmFzdHFzX3BhdHRlcm59IFwKICA+ICIke291dHB1dF9kaXJfdG9wfS8ke2NvbmNhdGVuYXRlZF90cmltbWVkX3JlYWRzX2Zhc3RxfSIKZmkKCmxzIC1saCAiJHtvdXRwdXRfZGlyX3RvcH0vJHtjb25jYXRlbmF0ZWRfdHJpbW1lZF9yZWFkc19mYXN0cX0iCmBgYAoKIyMgQ29sbGFwc2UgcmVhZHMgdG8gRmFzdEEKClVzZXMgYGZhc3R4X2NvbGxhcHNlcmAgdG8gY29sbGFwc2UgdG8gdW5pcXVlIHJlYWRzLgoKUmVxdWlyZXMgdW5kb2N1bWVudGVkIHF1YWxpdHkgc2V0dGluZy4gSGF2ZSBzZWxlY3RlZCBgMzBgIGFzIGN1dHRvZmY6IGAtUTMwYC4KCmBgYHtyIGNvbGxhcHNlLXJlYWRzLXRvLUZhc3RBLCBlbmdpbmU9J2Jhc2gnLCBldmFsPVRSVUV9CiMgTG9hZCBiYXNoIHZhcmlhYmxlcyBpbnRvIG1lbW9yeQpzb3VyY2UgLmJhc2h2YXJzCgojIENoZWNrIGZvciBleGlzdGVuY2Ugb2YgY29sbGFwc2VkIEZhc3RBIGJlZm9yZSBydW5uaW5nCnRpbWUgXAppZiBbICEgLWYgIiR7b3V0cHV0X2Rpcl90b3B9LyR7Y29sbGFwc2VkX3JlYWRzX2Zhc3RhfSIgXTsgdGhlbgogIHpjYXQgJHtvdXRwdXRfZGlyX3RvcH0vJHtjb25jYXRlbmF0ZWRfdHJpbW1lZF9yZWFkc19mYXN0cX0gXAogIHwgJHtmYXN0eF9jb2xsYXBzZXJ9IFwKICAtUTMwIFwKICAtbyAiJHtvdXRwdXRfZGlyX3RvcH0vJHtjb2xsYXBzZWRfcmVhZHNfZmFzdGF9IgpmaQoKaGVhZCAiJHtvdXRwdXRfZGlyX3RvcH0vJHtjb2xsYXBzZWRfcmVhZHNfZmFzdGF9IgoKZWNobyAiIgoKZWNobyAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iCmVjaG8gIiIKZWNobyAiTnVtYmVyIG9mIGNvbGxhcHNlZCByZWFkczoiCmdyZXAgLS1jb3VudCAiXj4iICIke291dHB1dF9kaXJfdG9wfS8ke2NvbGxhcHNlZF9yZWFkc19mYXN0YX0iCmBgYAoKIyBSdW4gQkxBU1RuIERlZmF1bHQgRS12YWx1ZQoKLSAgIGAxMDAwYCBmb3IgYGJsYXN0bi1zaG9ydGAKClJ1bnMgQkxBU1RuIHVzaW5nIHRoZSBgYmxhc3RuLXNob3J0YCB0YXNrIGZvciBzZXF1ZW5jZXMgXDwgMzBicC4KCkxvb2sgZm9yIHRvcCBtYXRjaCAoYC1tYXhfaHNwcyAxYCAmIGAtbWF4X3RhcmdldF9zZXFzIDFgKSBmb3IgZWFjaCBxdWVyeS4KCi0gICBTdXBwcmVzcyBzdWJzZXF1ZW50IHdhcm5pbmcgYEV4YW1pbmluZyA1IG9yIG1vcmUgbWF0Y2hlcyBpcyByZWNvbW1lbmRlZGAgYnkgcmVkaXJlY3Rpbmcgc3Rkb3V0OiBgMj4gL2Rldi9udWxsYAoKIyMgQ25pZGFyaWFuIG1pUkJhc2UgQkxBU1RuIERlZmF1bHQgZS12YWx1ZQoKYGBge3IgbWlSQmFzZS1CTEFTVG4tZGVmYXVsdC1ldmFsLCBlbmdpbmU9J2Jhc2gnLCBjYWNoZT1UUlVFfQojIExvYWQgYmFzaCB2YXJpYWJsZXMgaW50byBtZW1vcnkKc291cmNlIC5iYXNodmFycwoKdGltZSBcCiR7bmNiaV9ibGFzdG59IFwKLWRiICR7Ymxhc3RfZGJzX2Rpcn0vJHttaXJiYXNlX21hdHVyZV9mYXN0YV9ub19VJS4qfSBcCi1xdWVyeSAke291dHB1dF9kaXJfdG9wfS8ke2NvbGxhcHNlZF9yZWFkc19mYXN0YX0gXAotb3V0ICR7b3V0cHV0X2Rpcl90b3B9L21pUkJhc2UtQkxBU1RuLWV2YWxfMTAwMC5vdXRmbXQ2IFwKLXRhc2sgYmxhc3RuLXNob3J0IFwKLW1heF9oc3BzIDEgXAotbWF4X3RhcmdldF9zZXFzIDEgXAotb3V0Zm10IDYgXAotbnVtX3RocmVhZHMgJHt0aHJlYWRzfSBcCjI+IC9kZXYvbnVsbApgYGAKCiMjIE1pckdlbmUgQkxBU1RuIERlZmF1bHQgZS12YWx1ZQoKYGBge3IgTWlyR2VuZS1CTEFTVG4tZGVmYXVsdC1ldmFsLCBlbmdpbmU9J2Jhc2gnLCBjYWNoZT1UUlVFfQojIExvYWQgYmFzaCB2YXJpYWJsZXMgaW50byBtZW1vcnkKc291cmNlIC5iYXNodmFycwoKdGltZSBcCiR7bmNiaV9ibGFzdG59IFwKLWRiICR7Ymxhc3RfZGJzX2Rpcn0vJHttaXJnZW5lX21hdHVyZV9mYXN0YV9ub19VJS4qfSBcCi1xdWVyeSAke291dHB1dF9kaXJfdG9wfS8ke2NvbGxhcHNlZF9yZWFkc19mYXN0YX0gXAotb3V0ICR7b3V0cHV0X2Rpcl90b3B9L01pckdlbmUtQkxBU1RuLWV2YWxfMTAwMC5vdXRmbXQ2IFwKLXRhc2sgYmxhc3RuLXNob3J0IFwKLW1heF9oc3BzIDEgXAotbWF4X3RhcmdldF9zZXFzIDEgXAotb3V0Zm10IDYgXAotbnVtX3RocmVhZHMgJHt0aHJlYWRzfSBcCjI+IC9kZXYvbnVsbApgYGAKCiMgQkxBU1RuIEUtdmFsdWUgPSAxMAoKUnVubmluZyB0aGlzIGZvciBzaW1wbGUgY29tcGFyaXNvbiB0byB0aGUgZGVmYXVsIGBibGFzdG4tc2hvcnRgIHZhbHVlIG9mIDEwMDAuCgojIyBDbmlkYXJpYW4gbWlSQmFzZSBCTEFTVG4gZS12YWx1ZSA9IDEwCgpgYGB7ciBtaVJCYXNlLUJMQVNUbi0xMC1ldmFsLCBlbmdpbmU9J2Jhc2gnLCBjYWNoZT1UUlVFfQojIExvYWQgYmFzaCB2YXJpYWJsZXMgaW50byBtZW1vcnkKc291cmNlIC5iYXNodmFycwoKdGltZSBcCiR7bmNiaV9ibGFzdG59IFwKLWRiICR7Ymxhc3RfZGJzX2Rpcn0vJHttaXJiYXNlX21hdHVyZV9mYXN0YV9ub19VJS4qfSBcCi1xdWVyeSAke291dHB1dF9kaXJfdG9wfS8ke2NvbGxhcHNlZF9yZWFkc19mYXN0YX0gXAotb3V0ICR7b3V0cHV0X2Rpcl90b3B9L21pUkJhc2UtQkxBU1RuLWV2YWxfMTAub3V0Zm10NiBcCi10YXNrIGJsYXN0bi1zaG9ydCBcCi1ldmFsdWUgMTAgXAotbWF4X2hzcHMgMSBcCi1tYXhfdGFyZ2V0X3NlcXMgMSBcCi1vdXRmbXQgNiBcCi1udW1fdGhyZWFkcyAke3RocmVhZHN9IFwKMj4gL2Rldi9udWxsCmBgYAoKIyMgTWlyR2VuZSBCTEFTVG4gZS12YWx1ZSA9IDEwCgpgYGB7ciBNaXJHZW5lLUJMQVNUbi0xMC1ldmFsLCBlbmdpbmU9J2Jhc2gnLCBjYWNoZT1UUlVFfQojIExvYWQgYmFzaCB2YXJpYWJsZXMgaW50byBtZW1vcnkKc291cmNlIC5iYXNodmFycwoKdGltZSBcCiR7bmNiaV9ibGFzdG59IFwKLWRiICR7Ymxhc3RfZGJzX2Rpcn0vJHttaXJnZW5lX21hdHVyZV9mYXN0YV9ub19VJS4qfSBcCi1xdWVyeSAke291dHB1dF9kaXJfdG9wfS8ke2NvbGxhcHNlZF9yZWFkc19mYXN0YX0gXAotb3V0ICR7b3V0cHV0X2Rpcl90b3B9L01pckdlbmUtQkxBU1RuLWV2YWxfMTAub3V0Zm10NiBcCi10YXNrIGJsYXN0bi1zaG9ydCBcCi1ldmFsdWUgMTAgXAotbWF4X2hzcHMgMSBcCi1tYXhfdGFyZ2V0X3NlcXMgMSBcCi1vdXRmbXQgNiBcCi1udW1fdGhyZWFkcyAke3RocmVhZHN9IFwKMj4gL2Rldi9udWxsCmBgYAoKCiMgQkxBU1RuIEUtdmFsdWUgPSAxCgpSdW5uaW5nIHRoaXMgZm9yIHNpbXBsZSBjb21wYXJpc29uIHRvIHRoZSBkZWZhdWx0IGBibGFzdG4tc2hvcnRgIHZhbHVlIG9mIDEwMDAuCgojIyBDbmlkYXJpYW4gbWlSQmFzZSBCTEFTVG4gZS12YWx1ZSA9IDEKCmBgYHtyIG1pUkJhc2UtQkxBU1RuLTEtZXZhbCwgZW5naW5lPSdiYXNoJywgY2FjaGU9VFJVRX0KIyBMb2FkIGJhc2ggdmFyaWFibGVzIGludG8gbWVtb3J5CnNvdXJjZSAuYmFzaHZhcnMKCnRpbWUgXAoke25jYmlfYmxhc3RufSBcCi1kYiAke2JsYXN0X2Ric19kaXJ9LyR7bWlyYmFzZV9tYXR1cmVfZmFzdGFfbm9fVSUuKn0gXAotcXVlcnkgJHtvdXRwdXRfZGlyX3RvcH0vJHtjb2xsYXBzZWRfcmVhZHNfZmFzdGF9IFwKLW91dCAke291dHB1dF9kaXJfdG9wfS9jaW5kYXJpYW4tbWlSQmFzZS1CTEFTVG4tZXZhbF8xLm91dGZtdDYgXAotdGFzayBibGFzdG4tc2hvcnQgXAotZXZhbHVlIDEgXAotbWF4X2hzcHMgMSBcCi1tYXhfdGFyZ2V0X3NlcXMgMSBcCi1vdXRmbXQgNiBcCi1udW1fdGhyZWFkcyAke3RocmVhZHN9IFwKMj4gL2Rldi9udWxsCmBgYAoKIyMgTWlyR2VuZSBCTEFTVG4gZS12YWx1ZSA9IDEKCmBgYHtyIE1pckdlbmUtQkxBU1RuLTEtZXZhbCwgZW5naW5lPSdiYXNoJywgY2FjaGU9VFJVRX0KIyBMb2FkIGJhc2ggdmFyaWFibGVzIGludG8gbWVtb3J5CnNvdXJjZSAuYmFzaHZhcnMKCnRpbWUgXAoke25jYmlfYmxhc3RufSBcCi1kYiAke2JsYXN0X2Ric19kaXJ9LyR7bWlyZ2VuZV9tYXR1cmVfZmFzdGFfbm9fVSUuKn0gXAotcXVlcnkgJHtvdXRwdXRfZGlyX3RvcH0vJHtjb2xsYXBzZWRfcmVhZHNfZmFzdGF9IFwKLW91dCAke291dHB1dF9kaXJfdG9wfS9NaXJHZW5lLUJMQVNUbi1ldmFsXzEub3V0Zm10NiBcCi10YXNrIGJsYXN0bi1zaG9ydCBcCi1ldmFsdWUgMSBcCi1tYXhfaHNwcyAxIFwKLW1heF90YXJnZXRfc2VxcyAxIFwKLW91dGZtdCA2IFwKLW51bV90aHJlYWRzICR7dGhyZWFkc30gXAoyPiAvZGV2L251bGwKYGBgCgoKIyBSZXN1bHRzCgojIyBDaGVjayBCTEFTVG4gRGVmYXVsdCBlLXZhbHVlIHJlc3VsdHMKCmBgYHtyIGJsYXN0bi1kZWZhdWx0LWV2YWx1ZS1yZXN1bHRzLCBlbmdpbmU9J2Jhc2gnLCBldmFsPVRSVUV9CiMgTG9hZCBiYXNoIHZhcmlhYmxlcyBpbnRvIG1lbW9yeQpzb3VyY2UgLmJhc2h2YXJzCgpoZWFkICR7b3V0cHV0X2Rpcl90b3B9LypldmFsXzEwMDAub3V0Zm10NgoKZWNobyAiIgplY2hvICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIKZWNobyAiIgoKd2MgLWwgJHtvdXRwdXRfZGlyX3RvcH0vKmV2YWxfMTAwMC5vdXRmbXQ2CmBgYAoKIyMgQ2hlY2sgQkxBU1RuIGUtdmFsdWUgPSAxMCByZXN1bHRzCgpgYGB7ciBibGFzdG4tMTAtZXZhbHVlLXJlc3VsdHMsIGVuZ2luZT0nYmFzaCcsIGV2YWw9VFJVRX0KIyBMb2FkIGJhc2ggdmFyaWFibGVzIGludG8gbWVtb3J5CnNvdXJjZSAuYmFzaHZhcnMKCmhlYWQgJHtvdXRwdXRfZGlyX3RvcH0vKmV2YWxfMTAub3V0Zm10NgoKZWNobyAiIgplY2hvICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIKZWNobyAiIgoKd2MgLWwgJHtvdXRwdXRfZGlyX3RvcH0vKmV2YWxfMTAub3V0Zm10NgpgYGAKCgojIyBDaGVjayBCTEFTVG4gZS12YWx1ZSA9IDEgcmVzdWx0cwpgYGB7ciBibGFzdG4tMS1ldmFsdWUtcmVzdWx0cywgZW5naW5lPSdiYXNoJywgZXZhbD1UUlVFfQojIExvYWQgYmFzaCB2YXJpYWJsZXMgaW50byBtZW1vcnkKc291cmNlIC5iYXNodmFycwoKaGVhZCAke291dHB1dF9kaXJfdG9wfS8qZXZhbF8xLm91dGZtdDYKCmVjaG8gIiIKZWNobyAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iCmVjaG8gIiIKCndjIC1sICR7b3V0cHV0X2Rpcl90b3B9LypldmFsXzEub3V0Zm10NgpgYGAKCiMgU3VtbWFyeQoKVGhlIGRlZmF1bHQgZS12YWx1ZSByZXN1bHRzIGluIGFsaWdubWVudHMgZm9yIDEwMCUgb2Ygc2VxdWVuY2VzLgoKRGVjcmVhc2luZyB0aGUgZS12YWx1ZSB0byBgMTBgIHJlc3VsdGVkIGluIGZld2VyIHF1ZXJ5IGFsaWdubWVudHMsIGFzIHdlJ2QgZXhwZWN0LCBidXQgb25seSBtaW5pbWFsbHkuCgpEZWNyZWFzaW5nIHRoZSBlLXZhbHVlIHRvIGAxYCByZXN1bHRlZCBpbiB+NDAtNDUlIG9mIHF1ZXJ5IGFsaWdubWVudHMuCgpGb3IgZnVydGhlciBhbmFseXNpcywgd2Ugc2hvdWxkIHByb2JhYmx5IGRpc2N1c3MgYSByZWFzb25hYmxlIGUtdmFsdWUgdG8gdXNlIGZvciBmaWx0ZXJpbmcsIGFzIGl0IG1pZ2h0IGJlIHdvcnRod2hpbGUgdG8gdGVzdCBldmVuIGxvd2VyIGUtdmFsdWUgdGhyZXNob2xkcy4KCkZvciBmdXJ0aGVyIGFuYWx5c2lzLCB3ZSBzaG91bGQgcHJvYmFibHkgZGlzY3VzcyBhIHJlYXNvbmFibGUgZS12YWx1ZSB0byB1c2UgZm9yIGZpbHRlcmluZy4KCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKIyBDaXRhdGlvbnMK