0.1 intersectBed

Examine our input files (intersectBed accepts .bed and .gff files)

head -5 ../output/11.1-Pmea-sRNAseq-miRdeep2-31bp-fastp-merged-cnidarian_miRBase/mirna_results_22_04_2024_t_15_27_22/novel_mature_22_04_2024_t_15_27_22_score-50_to_na.bed
echo ""
head -5 ../output/13.2.1-Pmea-sRNAseq-ShortStack-31bp-fastp-merged-cnidarian_miRBase/ShortStack_out/Results.gff3
browser position 
browser hide all
track name="notTrackname.novel_miRNAs" description="novel miRNAs detected by miRDeep2 for notTrackname" visibility=2
itemRgb="On";
Pocillopora_meandrina_HIv1___Sc0000000  20372434    20372456    Pocillopora_meandrina_HIv1___Sc0000000_60202    266239.8    -   20372434    20372456    0,0,255

Pocillopora_meandrina_HIv1___Sc0000000  ShortStack  Unknown_sRNA_locus  9092    9521    10746   +   .   ID=Cluster_1;DicerCall=N;MIRNA=N
Pocillopora_meandrina_HIv1___Sc0000000  ShortStack  Unknown_sRNA_locus  53578   53997   286 +   .   ID=Cluster_2;DicerCall=N;MIRNA=N
Pocillopora_meandrina_HIv1___Sc0000000  ShortStack  Unknown_sRNA_locus  150243  150718  2549    -   .   ID=Cluster_3;DicerCall=N;MIRNA=N
Pocillopora_meandrina_HIv1___Sc0000000  ShortStack  siRNA22_locus   173728  174150  1257    +   .   ID=Cluster_4;DicerCall=22;MIRNA=N
Pocillopora_meandrina_HIv1___Sc0000000  ShortStack  Unknown_sRNA_locus  187562  188076  182 .   .   ID=Cluster_5;DicerCall=N;MIRNA=N

We need to get two input files that contain only mature miRNAs and are correctly formatted. That means we need to remove the header lines of the miRdeep2 mature miRNAs file, and the ShortStack full results file needs to be filtered.

# remove header lines
tail -n +5 ../output/11.1-Pmea-sRNAseq-miRdeep2-31bp-fastp-merged-cnidarian_miRBase/mirna_results_22_04_2024_t_15_27_22/novel_mature_22_04_2024_t_15_27_22_score-50_to_na.bed > ../output/11.1-Pmea-sRNAseq-miRdeep2-31bp-fastp-merged-cnidarian_miRBase/mirna_results_22_04_2024_t_15_27_22/novel_mature_22_04_2024_t_15_27_22_score-50_to_na._formatted.bed

# filter full results to obtain a gff file of only the mature miRNAs
awk -F'\t' '$3 == "mature_miRNA"' ../output/13.2.1-Pmea-sRNAseq-ShortStack-31bp-fastp-merged-cnidarian_miRBase/ShortStack_out/Results.gff3 > ../output/13.2.1-Pmea-sRNAseq-ShortStack-31bp-fastp-merged-cnidarian_miRBase/ShortStack_out/Results_mature.gff3

Check the files

head -5 ../output/11.1-Pmea-sRNAseq-miRdeep2-31bp-fastp-merged-cnidarian_miRBase/mirna_results_22_04_2024_t_15_27_22/novel_mature_22_04_2024_t_15_27_22_score-50_to_na._formatted.bed
echo ""
head -5 ../output/13.2.1-Pmea-sRNAseq-ShortStack-31bp-fastp-merged-cnidarian_miRBase/ShortStack_out/Results_mature.gff3
Pocillopora_meandrina_HIv1___Sc0000000  20372434    20372456    Pocillopora_meandrina_HIv1___Sc0000000_60202    266239.8    -   20372434    20372456    0,0,255
Pocillopora_meandrina_HIv1___Sc0000017  5050957 5050980 Pocillopora_meandrina_HIv1___Sc0000017_655645   67675.4 -   5050957 5050980 0,0,255
Pocillopora_meandrina_HIv1___Sc0000005  601625  601646  Pocillopora_meandrina_HIv1___Sc0000005_273871   65863.2 +   601625  601646  255,0,0
Pocillopora_meandrina_HIv1___xfSc0000017    39556   39581   Pocillopora_meandrina_HIv1___xfSc0000017_985353 65601.9 -   39556   39581   0,0,255
Pocillopora_meandrina_HIv1___Sc0000009  11978171    11978196    Pocillopora_meandrina_HIv1___Sc0000009_442963   64606.4 -   11978171    11978196    0,0,255

Pocillopora_meandrina_HIv1___Sc0000000  ShortStack  mature_miRNA    818049  818070  3240    +   .   ID=Cluster_21.mature;Parent=Cluster_21
Pocillopora_meandrina_HIv1___Sc0000000  ShortStack  mature_miRNA    2872041 2872061 110 +   .   ID=Cluster_37.mature;Parent=Cluster_37
Pocillopora_meandrina_HIv1___Sc0000000  ShortStack  mature_miRNA    20372469    20372490    769 -   .   ID=Cluster_361.mature;Parent=Cluster_361
Pocillopora_meandrina_HIv1___Sc0000001  ShortStack  mature_miRNA    19145788    19145809    1102    +   .   ID=Cluster_759.mature;Parent=Cluster_759
Pocillopora_meandrina_HIv1___Sc0000002  ShortStack  mature_miRNA    3841966 3841987 98704   -   .   ID=Cluster_918.mature;Parent=Cluster_918

Looks good! Now we can input into intersectBed.

# intersectBed to ID sequences in the miRdeep2 mature miRNA output that match mature miRNAs ID'd by ShortStack
# -wa and -wb ensure we recieve full annotations from both input files in the output
/home/shared/bedtools2/bin/intersectBed \
-wa \
-wb \
-a ../output/13.2.1-Pmea-sRNAseq-ShortStack-31bp-fastp-merged-cnidarian_miRBase/ShortStack_out/Results_mature.gff3 \
-b ../output/11.1-Pmea-sRNAseq-miRdeep2-31bp-fastp-merged-cnidarian_miRBase/mirna_results_22_04_2024_t_15_27_22/novel_mature_22_04_2024_t_15_27_22_score-50_to_na._formatted.bed \
&> ../output/17-Pmea-ShortStack-miRdeep2-comparison/ShortStack_miRdeep2_mature_intersect.bed

0.2 Results

echo "Number of ShortStack mature miRNAs:"
wc -l < ../output/13.2.1-Pmea-sRNAseq-ShortStack-31bp-fastp-merged-cnidarian_miRBase/ShortStack_out/Results_mature.gff3
echo ""
echo "Number of ShortStack mature miRNAs also identified by miRdeep2:"
wc -l < ../output/17-Pmea-ShortStack-miRdeep2-comparison/ShortStack_miRdeep2_mature_intersect.bed
Number of ShortStack mature miRNAs:
36

Number of ShortStack mature miRNAs also identified by miRdeep2:
27

While looking through the output file I noticed that two of the intersects originate from the same cluster… not really sure what that’s about…

head -2 ../output/17-Pmea-ShortStack-miRdeep2-comparison/ShortStack_miRdeep2_mature_intersect.bed
Pocillopora_meandrina_HIv1___Sc0000000  ShortStack  mature_miRNA    818049  818070  3240    +   .   ID=Cluster_21.mature;Parent=Cluster_21  Pocillopora_meandrina_HIv1___Sc0000000  818048  818071  Pocillopora_meandrina_HIv1___Sc0000000_1750 6153    +   818048  818071  255,0,0
Pocillopora_meandrina_HIv1___Sc0000000  ShortStack  mature_miRNA    818049  818070  3240    +   .   ID=Cluster_21.mature;Parent=Cluster_21  Pocillopora_meandrina_HIv1___Sc0000000  818046  818069  Pocillopora_meandrina_HIv1___Sc0000000_34562    10  -   818046  818069  0,0,255

It looks like they have pretty much identical entries (cluster, coordinates, etc.), except the end of the miRdeep locus name (Pocillopora_meandrina_HIv1_Sc0000000_1750 vs Pocillopora_meandrina_HIv1_Sc0000000_34562) and the miRdeep2 “score” value assigned to them (this is the column following the miRdeep2 locus name, 6153 vs 10). We can also check these two loci in the full miRdeep2 output.


# View full mirdeep2 output for these two loci
awk -F'\t' '$1 == "Pocillopora_meandrina_HIv1___Sc0000000_1750"' ../output/11.1-Pmea-sRNAseq-miRdeep2-31bp-fastp-merged-cnidarian_miRBase/parsable-result_22_04_2024_t_15_27_22.csv
echo""
awk -F'\t' '$1 == "Pocillopora_meandrina_HIv1___Sc0000000_34562"' ../output/11.1-Pmea-sRNAseq-miRdeep2-31bp-fastp-merged-cnidarian_miRBase/parsable-result_22_04_2024_t_15_27_22.csv

echo""
echo""

echo "mature miRNA sequences for these two loci:"
awk -F'\t' '$1 == "Pocillopora_meandrina_HIv1___Sc0000000_1750"' ../output/11.1-Pmea-sRNAseq-miRdeep2-31bp-fastp-merged-cnidarian_miRBase/parsable-result_22_04_2024_t_15_27_22.csv | awk '{print $13}'

awk -F'\t' '$1 == "Pocillopora_meandrina_HIv1___Sc0000000_34562"' ../output/11.1-Pmea-sRNAseq-miRdeep2-31bp-fastp-merged-cnidarian_miRBase/parsable-result_22_04_2024_t_15_27_22.csv | awk '{print $13}'

echo ""
echo ""

echo "miRNA* sequences for these two loci:"
awk -F'\t' '$1 == "Pocillopora_meandrina_HIv1___Sc0000000_1750"' ../output/11.1-Pmea-sRNAseq-miRdeep2-31bp-fastp-merged-cnidarian_miRBase/parsable-result_22_04_2024_t_15_27_22.csv | awk '{print $14}'

awk -F'\t' '$1 == "Pocillopora_meandrina_HIv1___Sc0000000_34562"' ../output/11.1-Pmea-sRNAseq-miRdeep2-31bp-fastp-merged-cnidarian_miRBase/parsable-result_22_04_2024_t_15_27_22.csv | awk '{print $14}'

echo ""
echo ""

echo "precursor miRNA sequences for these two loci:"
awk -F'\t' '$1 == "Pocillopora_meandrina_HIv1___Sc0000000_1750"' ../output/11.1-Pmea-sRNAseq-miRdeep2-31bp-fastp-merged-cnidarian_miRBase/parsable-result_22_04_2024_t_15_27_22.csv | awk '{print $15}'

awk -F'\t' '$1 == "Pocillopora_meandrina_HIv1___Sc0000000_34562"' ../output/11.1-Pmea-sRNAseq-miRdeep2-31bp-fastp-merged-cnidarian_miRBase/parsable-result_22_04_2024_t_15_27_22.csv | awk '{print $15}'
Pocillopora_meandrina_HIv1___Sc0000000_1750 6153        -   12060   11275   0   785 yes -   hsa-miR-2117_MIMAT0011162_Homo_sapiens_miR-2117 -   -   uguucucucugcaguaagcaugu augcuugcuguaaagagaacuug uguucucucugcaguaagcauguuuugacaugcuugcuguaaagagaacuug    Pocillopora_meandrina_HIv1___Sc0000000:818048..818100:+

Pocillopora_meandrina_HIv1___Sc0000000_34562    10      -   11  9   0   2   yes -   egr-miR-153-5p_MIMAT0037428_Echinococcus_granulosus_miR-153-5p  -   -   augcuuacugcagagagaacaug aaguucucuuuacagcaagcaugucaaa    aaguucucuuuacagcaagcaugucaaaacaugcuuacugcagagagaacaug   Pocillopora_meandrina_HIv1___Sc0000000:818046..818099:-


mature miRNA sequences for these two loci:
uguucucucugcaguaagcaugu
augcuuacugcagagagaacaug


miRNA* sequences for these two loci:
augcuugcuguaaagagaacuug
aaguucucuuuacagcaagcaugucaaa


precursor miRNA sequences for these two loci:
uguucucucugcaguaagcauguuuugacaugcuugcuguaaagagaacuug
aaguucucuuuacagcaagcaugucaaaacaugcuuacugcagagagaacaug

Interesting… The two loci have very similar precursor sequences and reversed mature and star sequences! In other words, the mature miRNA sequence for Pocillopora_meandrina_HIv1_Sc0000000_1750 is almost identical to the miRNA* sequence of Pocillopora_meandrina_HIv1_Sc0000000_34562, and vice versa! I’m not exactly sure what this means though… is miRdeep2 just incorrectly distinguishing the mature and star sequences for one of these loci? Does the much higher miRdeep2 score of Pocillopora_meandrina_HIv1___Sc0000000_1750 mean we should be more confident in it being correctly distinguished?

Let’s set that aside for now and do some quick investigation of the miRdeep2 evaluation criteria for all of these ShortStack/miRdeep2 shared miRNAs. This could give us an idea of what thresholds may be appropriate for filtering the miRdeep2 output.

mirdeepIDs=$(awk '{print $13}' ../output/17-Pmea-ShortStack-miRdeep2-comparison/ShortStack_miRdeep2_mature_intersect.bed)

head -1 ../output/11.1-Pmea-sRNAseq-miRdeep2-31bp-fastp-merged-cnidarian_miRBase/parsable-result_22_04_2024_t_15_27_22.csv > ../output/17-Pmea-ShortStack-miRdeep2-comparison/intersect_miRdeep2_stats.txt
while IFS= read -r id; do
  # Use awk to process fileA and match column 1 with the current ID
  awk -F'\t' -v id="$id" '$1 == id {print}' ../output/11.1-Pmea-sRNAseq-miRdeep2-31bp-fastp-merged-cnidarian_miRBase/parsable-result_22_04_2024_t_15_27_22.csv
done <<< "$mirdeepIDs" >> ../output/17-Pmea-ShortStack-miRdeep2-comparison/intersect_miRdeep2_stats.txt
intersect_miRdeep2_stats <- read.csv("../output/17-Pmea-ShortStack-miRdeep2-comparison/intersect_miRdeep2_stats.txt", sep="\t")

intersect_miRdeep2_stats %>% 
  select(miRDeep2.score, significant.randfold.p.value) %>% 
  arrange(desc(miRDeep2.score)) %>%
  kable()
miRDeep2.score significant.randfold.p.value
67675.4 yes
65863.2 yes
54159.5 yes
29656.8 yes
15853.5 yes
13573.1 yes
8138.8 yes
6153.0 yes
5845.2 yes
5647.4 yes
2344.8 yes
1515.4 yes
1188.9 yes
775.3 yes
712.0 yes
526.9 yes
509.1 yes
184.8 yes
170.7 yes
152.7 yes
136.5 yes
91.4 yes
59.1 yes
10.0 yes
5.3 yes
5.2 yes
5.1 yes

The miRdeep2 score is “the log-odds score assigned to the hairpin” and is essentially a probability that the locus is a miRNA (presumably based on the hairpin structure) on, with higher values indicating higher probability. MiRdeep2’s default score threshold for miRNA classification is 0, but coral miRNA papers we’ve seen use myriad thresholds (e.g., 4, 10).

The randfold is also an evaluation of ncrna secondary structure, and we want a significant randfold value (this would indicate high likelihood of miRNA precursory structure)

23 out of 27 shared miRNAs have miRdeep2 scores >10, and all 30 have significant randfold p-values, which is good support for using these thresholds.

LS0tCnRpdGxlOiAiMTctUG1lYS1TaG9ydFN0YWNrLW1pUmRlZXAyLWNvbXBhcmlzb24iCmF1dGhvcjogIkthdGhsZWVuIER1cmtpbiIKZGF0ZTogIjIwMjQtMDUtMTciCm91dHB1dDogCiAgYm9va2Rvd246Omh0bWxfZG9jdW1lbnQyOgogICAgdGhlbWU6IGNvc21vCiAgICB0b2M6IHRydWUKICAgIHRvY19mbG9hdDogdHJ1ZQogICAgbnVtYmVyX3NlY3Rpb25zOiB0cnVlCiAgICBjb2RlX2ZvbGRpbmc6IHNob3cKICAgIGNvZGVfZG93bmxvYWQ6IHRydWUKICBnaXRodWJfZG9jdW1lbnQ6CiAgICB0b2M6IHRydWUKICAgIG51bWJlcl9zZWN0aW9uczogdHJ1ZQogIGh0bWxfZG9jdW1lbnQ6CiAgICB0aGVtZTogY29zbW8KICAgIHRvYzogdHJ1ZQogICAgdG9jX2Zsb2F0OiB0cnVlCiAgICBudW1iZXJfc2VjdGlvbnM6IHRydWUKICAgIGNvZGVfZm9sZGluZzogc2hvdwogICAgY29kZV9kb3dubG9hZDogdHJ1ZQotLS0KCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQpsaWJyYXJ5KGtuaXRyKQpsaWJyYXJ5KGthYmxlRXh0cmEpCmxpYnJhcnkoZHBseXIpCmtuaXRyOjpvcHRzX2NodW5rJHNldCgKICBlY2hvID0gVFJVRSwgICAgICAgICAjIERpc3BsYXkgY29kZSBjaHVua3MKICBldmFsID0gRkFMU0UsICAgICAgICAjIEV2YWx1YXRlIGNvZGUgY2h1bmtzCiAgd2FybmluZyA9IEZBTFNFLCAgICAgIyBIaWRlIHdhcm5pbmdzCiAgbWVzc2FnZSA9IEZBTFNFLCAgICAgIyBIaWRlIG1lc3NhZ2VzCiAgY29tbWVudCA9ICIiICAgICAgICAgIyBQcmV2ZW50cyBhcHBlbmRpbmcgJyMjJyB0byBiZWdpbm5pbmcgb2YgbGluZXMgaW4gY29kZSBvdXRwdXQKKQpgYGAKCiMjIGludGVyc2VjdEJlZAoKRXhhbWluZSBvdXIgaW5wdXQgZmlsZXMgKGludGVyc2VjdEJlZCBhY2NlcHRzIC5iZWQgYW5kIC5nZmYgZmlsZXMpCgpgYGB7ciB2aWV3LU9HLWlucHV0LWZpbGVzLCBlbmdpbmU9J2Jhc2gnLCBldmFsPVRSVUV9CmhlYWQgLTUgLi4vb3V0cHV0LzExLjEtUG1lYS1zUk5Bc2VxLW1pUmRlZXAyLTMxYnAtZmFzdHAtbWVyZ2VkLWNuaWRhcmlhbl9taVJCYXNlL21pcm5hX3Jlc3VsdHNfMjJfMDRfMjAyNF90XzE1XzI3XzIyL25vdmVsX21hdHVyZV8yMl8wNF8yMDI0X3RfMTVfMjdfMjJfc2NvcmUtNTBfdG9fbmEuYmVkCmVjaG8gIiIKaGVhZCAtNSAuLi9vdXRwdXQvMTMuMi4xLVBtZWEtc1JOQXNlcS1TaG9ydFN0YWNrLTMxYnAtZmFzdHAtbWVyZ2VkLWNuaWRhcmlhbl9taVJCYXNlL1Nob3J0U3RhY2tfb3V0L1Jlc3VsdHMuZ2ZmMwpgYGAKCldlIG5lZWQgdG8gZ2V0IHR3byBpbnB1dCBmaWxlcyB0aGF0IGNvbnRhaW4gb25seSBtYXR1cmUgbWlSTkFzIGFuZCBhcmUgY29ycmVjdGx5IGZvcm1hdHRlZC4gVGhhdCBtZWFucyB3ZSBuZWVkIHRvIHJlbW92ZSB0aGUgaGVhZGVyIGxpbmVzIG9mIHRoZSBtaVJkZWVwMiBtYXR1cmUgbWlSTkFzIGZpbGUsIGFuZCB0aGUgU2hvcnRTdGFjayBmdWxsIHJlc3VsdHMgZmlsZSBuZWVkcyB0byBiZSBmaWx0ZXJlZC4KCmBgYHtyIHByZXAtaW5wdXQtZmlsZXMsIGVuZ2luZT0nYmFzaCcsIGV2YWw9VFJVRX0KIyByZW1vdmUgaGVhZGVyIGxpbmVzCnRhaWwgLW4gKzUgLi4vb3V0cHV0LzExLjEtUG1lYS1zUk5Bc2VxLW1pUmRlZXAyLTMxYnAtZmFzdHAtbWVyZ2VkLWNuaWRhcmlhbl9taVJCYXNlL21pcm5hX3Jlc3VsdHNfMjJfMDRfMjAyNF90XzE1XzI3XzIyL25vdmVsX21hdHVyZV8yMl8wNF8yMDI0X3RfMTVfMjdfMjJfc2NvcmUtNTBfdG9fbmEuYmVkID4gLi4vb3V0cHV0LzExLjEtUG1lYS1zUk5Bc2VxLW1pUmRlZXAyLTMxYnAtZmFzdHAtbWVyZ2VkLWNuaWRhcmlhbl9taVJCYXNlL21pcm5hX3Jlc3VsdHNfMjJfMDRfMjAyNF90XzE1XzI3XzIyL25vdmVsX21hdHVyZV8yMl8wNF8yMDI0X3RfMTVfMjdfMjJfc2NvcmUtNTBfdG9fbmEuX2Zvcm1hdHRlZC5iZWQKCiMgZmlsdGVyIGZ1bGwgcmVzdWx0cyB0byBvYnRhaW4gYSBnZmYgZmlsZSBvZiBvbmx5IHRoZSBtYXR1cmUgbWlSTkFzCmF3ayAtRidcdCcgJyQzID09ICJtYXR1cmVfbWlSTkEiJyAuLi9vdXRwdXQvMTMuMi4xLVBtZWEtc1JOQXNlcS1TaG9ydFN0YWNrLTMxYnAtZmFzdHAtbWVyZ2VkLWNuaWRhcmlhbl9taVJCYXNlL1Nob3J0U3RhY2tfb3V0L1Jlc3VsdHMuZ2ZmMyA+IC4uL291dHB1dC8xMy4yLjEtUG1lYS1zUk5Bc2VxLVNob3J0U3RhY2stMzFicC1mYXN0cC1tZXJnZWQtY25pZGFyaWFuX21pUkJhc2UvU2hvcnRTdGFja19vdXQvUmVzdWx0c19tYXR1cmUuZ2ZmMwpgYGAKCkNoZWNrIHRoZSBmaWxlcwoKYGBge3Igdmlldy1wcmVwcGVkLWlucHV0LWZpbGVzLCBlbmdpbmU9J2Jhc2gnLCBldmFsPVRSVUV9CmhlYWQgLTUgLi4vb3V0cHV0LzExLjEtUG1lYS1zUk5Bc2VxLW1pUmRlZXAyLTMxYnAtZmFzdHAtbWVyZ2VkLWNuaWRhcmlhbl9taVJCYXNlL21pcm5hX3Jlc3VsdHNfMjJfMDRfMjAyNF90XzE1XzI3XzIyL25vdmVsX21hdHVyZV8yMl8wNF8yMDI0X3RfMTVfMjdfMjJfc2NvcmUtNTBfdG9fbmEuX2Zvcm1hdHRlZC5iZWQKZWNobyAiIgpoZWFkIC01IC4uL291dHB1dC8xMy4yLjEtUG1lYS1zUk5Bc2VxLVNob3J0U3RhY2stMzFicC1mYXN0cC1tZXJnZWQtY25pZGFyaWFuX21pUkJhc2UvU2hvcnRTdGFja19vdXQvUmVzdWx0c19tYXR1cmUuZ2ZmMwpgYGAKCkxvb2tzIGdvb2QhIE5vdyB3ZSBjYW4gaW5wdXQgaW50byBpbnRlcnNlY3RCZWQuCgpgYGB7ciBpbnRlcnNlY3RCZWQsIGVuZ2luZT0nYmFzaCcsIGV2YWw9VFJVRX0KIyBpbnRlcnNlY3RCZWQgdG8gSUQgc2VxdWVuY2VzIGluIHRoZSBtaVJkZWVwMiBtYXR1cmUgbWlSTkEgb3V0cHV0IHRoYXQgbWF0Y2ggbWF0dXJlIG1pUk5BcyBJRCdkIGJ5IFNob3J0U3RhY2sKIyAtd2EgYW5kIC13YiBlbnN1cmUgd2UgcmVjaWV2ZSBmdWxsIGFubm90YXRpb25zIGZyb20gYm90aCBpbnB1dCBmaWxlcyBpbiB0aGUgb3V0cHV0Ci9ob21lL3NoYXJlZC9iZWR0b29sczIvYmluL2ludGVyc2VjdEJlZCBcCi13YSBcCi13YiBcCi1hIC4uL291dHB1dC8xMy4yLjEtUG1lYS1zUk5Bc2VxLVNob3J0U3RhY2stMzFicC1mYXN0cC1tZXJnZWQtY25pZGFyaWFuX21pUkJhc2UvU2hvcnRTdGFja19vdXQvUmVzdWx0c19tYXR1cmUuZ2ZmMyBcCi1iIC4uL291dHB1dC8xMS4xLVBtZWEtc1JOQXNlcS1taVJkZWVwMi0zMWJwLWZhc3RwLW1lcmdlZC1jbmlkYXJpYW5fbWlSQmFzZS9taXJuYV9yZXN1bHRzXzIyXzA0XzIwMjRfdF8xNV8yN18yMi9ub3ZlbF9tYXR1cmVfMjJfMDRfMjAyNF90XzE1XzI3XzIyX3Njb3JlLTUwX3RvX25hLl9mb3JtYXR0ZWQuYmVkIFwKJj4gLi4vb3V0cHV0LzE3LVBtZWEtU2hvcnRTdGFjay1taVJkZWVwMi1jb21wYXJpc29uL1Nob3J0U3RhY2tfbWlSZGVlcDJfbWF0dXJlX2ludGVyc2VjdC5iZWQKCmBgYAoKIyMgUmVzdWx0cwoKYGBge3IgY291bnQtaW50ZXJzZWN0cywgZW5naW5lPSdiYXNoJywgZXZhbD1UUlVFfQplY2hvICJOdW1iZXIgb2YgU2hvcnRTdGFjayBtYXR1cmUgbWlSTkFzOiIKd2MgLWwgPCAuLi9vdXRwdXQvMTMuMi4xLVBtZWEtc1JOQXNlcS1TaG9ydFN0YWNrLTMxYnAtZmFzdHAtbWVyZ2VkLWNuaWRhcmlhbl9taVJCYXNlL1Nob3J0U3RhY2tfb3V0L1Jlc3VsdHNfbWF0dXJlLmdmZjMKZWNobyAiIgplY2hvICJOdW1iZXIgb2YgU2hvcnRTdGFjayBtYXR1cmUgbWlSTkFzIGFsc28gaWRlbnRpZmllZCBieSBtaVJkZWVwMjoiCndjIC1sIDwgLi4vb3V0cHV0LzE3LVBtZWEtU2hvcnRTdGFjay1taVJkZWVwMi1jb21wYXJpc29uL1Nob3J0U3RhY2tfbWlSZGVlcDJfbWF0dXJlX2ludGVyc2VjdC5iZWQKYGBgCgpXaGlsZSBsb29raW5nIHRocm91Z2ggdGhlIG91dHB1dCBmaWxlIEkgbm90aWNlZCB0aGF0IHR3byBvZiB0aGUgaW50ZXJzZWN0cyBvcmlnaW5hdGUgZnJvbSB0aGUgc2FtZSBjbHVzdGVyLi4uIG5vdCByZWFsbHkgc3VyZSB3aGF0IHRoYXQncyBhYm91dC4uLgoKYGBge3IsIGVuZ2luZT0nYmFzaCcsIGV2YWw9VFJVRX0KaGVhZCAtMiAuLi9vdXRwdXQvMTctUG1lYS1TaG9ydFN0YWNrLW1pUmRlZXAyLWNvbXBhcmlzb24vU2hvcnRTdGFja19taVJkZWVwMl9tYXR1cmVfaW50ZXJzZWN0LmJlZApgYGAKCkl0IGxvb2tzIGxpa2UgdGhleSBoYXZlIHByZXR0eSBtdWNoIGlkZW50aWNhbCBlbnRyaWVzIChjbHVzdGVyLCBjb29yZGluYXRlcywgZXRjLiksIGV4Y2VwdCB0aGUgZW5kIG9mIHRoZSBtaVJkZWVwIGxvY3VzIG5hbWUgKFBvY2lsbG9wb3JhX21lYW5kcmluYV9ISXYxX19fU2MwMDAwMDAwXzE3NTAgdnMgUG9jaWxsb3BvcmFfbWVhbmRyaW5hX0hJdjFfX19TYzAwMDAwMDBfMzQ1NjIpIGFuZCB0aGUgbWlSZGVlcDIgInNjb3JlIiB2YWx1ZSBhc3NpZ25lZCB0byB0aGVtICh0aGlzIGlzIHRoZSBjb2x1bW4gZm9sbG93aW5nIHRoZSBtaVJkZWVwMiBsb2N1cyBuYW1lLCA2MTUzIHZzIDEwKS4gV2UgY2FuIGFsc28gY2hlY2sgdGhlc2UgdHdvIGxvY2kgaW4gdGhlIGZ1bGwgbWlSZGVlcDIgb3V0cHV0LgoKYGBge3IgY2hlY2stbWlyZGVlcC1vdXRwdXQtZHVwZXMsIGVuZ2luZT0nYmFzaCcsIGV2YWw9VFJVRX0KCiMgVmlldyBmdWxsIG1pcmRlZXAyIG91dHB1dCBmb3IgdGhlc2UgdHdvIGxvY2kKYXdrIC1GJ1x0JyAnJDEgPT0gIlBvY2lsbG9wb3JhX21lYW5kcmluYV9ISXYxX19fU2MwMDAwMDAwXzE3NTAiJyAuLi9vdXRwdXQvMTEuMS1QbWVhLXNSTkFzZXEtbWlSZGVlcDItMzFicC1mYXN0cC1tZXJnZWQtY25pZGFyaWFuX21pUkJhc2UvcGFyc2FibGUtcmVzdWx0XzIyXzA0XzIwMjRfdF8xNV8yN18yMi5jc3YKZWNobyIiCmF3ayAtRidcdCcgJyQxID09ICJQb2NpbGxvcG9yYV9tZWFuZHJpbmFfSEl2MV9fX1NjMDAwMDAwMF8zNDU2MiInIC4uL291dHB1dC8xMS4xLVBtZWEtc1JOQXNlcS1taVJkZWVwMi0zMWJwLWZhc3RwLW1lcmdlZC1jbmlkYXJpYW5fbWlSQmFzZS9wYXJzYWJsZS1yZXN1bHRfMjJfMDRfMjAyNF90XzE1XzI3XzIyLmNzdgoKZWNobyIiCmVjaG8iIgoKZWNobyAibWF0dXJlIG1pUk5BIHNlcXVlbmNlcyBmb3IgdGhlc2UgdHdvIGxvY2k6Igphd2sgLUYnXHQnICckMSA9PSAiUG9jaWxsb3BvcmFfbWVhbmRyaW5hX0hJdjFfX19TYzAwMDAwMDBfMTc1MCInIC4uL291dHB1dC8xMS4xLVBtZWEtc1JOQXNlcS1taVJkZWVwMi0zMWJwLWZhc3RwLW1lcmdlZC1jbmlkYXJpYW5fbWlSQmFzZS9wYXJzYWJsZS1yZXN1bHRfMjJfMDRfMjAyNF90XzE1XzI3XzIyLmNzdiB8IGF3ayAne3ByaW50ICQxM30nCgphd2sgLUYnXHQnICckMSA9PSAiUG9jaWxsb3BvcmFfbWVhbmRyaW5hX0hJdjFfX19TYzAwMDAwMDBfMzQ1NjIiJyAuLi9vdXRwdXQvMTEuMS1QbWVhLXNSTkFzZXEtbWlSZGVlcDItMzFicC1mYXN0cC1tZXJnZWQtY25pZGFyaWFuX21pUkJhc2UvcGFyc2FibGUtcmVzdWx0XzIyXzA0XzIwMjRfdF8xNV8yN18yMi5jc3YgfCBhd2sgJ3twcmludCAkMTN9JwoKZWNobyAiIgplY2hvICIiCgplY2hvICJtaVJOQSogc2VxdWVuY2VzIGZvciB0aGVzZSB0d28gbG9jaToiCmF3ayAtRidcdCcgJyQxID09ICJQb2NpbGxvcG9yYV9tZWFuZHJpbmFfSEl2MV9fX1NjMDAwMDAwMF8xNzUwIicgLi4vb3V0cHV0LzExLjEtUG1lYS1zUk5Bc2VxLW1pUmRlZXAyLTMxYnAtZmFzdHAtbWVyZ2VkLWNuaWRhcmlhbl9taVJCYXNlL3BhcnNhYmxlLXJlc3VsdF8yMl8wNF8yMDI0X3RfMTVfMjdfMjIuY3N2IHwgYXdrICd7cHJpbnQgJDE0fScKCmF3ayAtRidcdCcgJyQxID09ICJQb2NpbGxvcG9yYV9tZWFuZHJpbmFfSEl2MV9fX1NjMDAwMDAwMF8zNDU2MiInIC4uL291dHB1dC8xMS4xLVBtZWEtc1JOQXNlcS1taVJkZWVwMi0zMWJwLWZhc3RwLW1lcmdlZC1jbmlkYXJpYW5fbWlSQmFzZS9wYXJzYWJsZS1yZXN1bHRfMjJfMDRfMjAyNF90XzE1XzI3XzIyLmNzdiB8IGF3ayAne3ByaW50ICQxNH0nCgplY2hvICIiCmVjaG8gIiIKCmVjaG8gInByZWN1cnNvciBtaVJOQSBzZXF1ZW5jZXMgZm9yIHRoZXNlIHR3byBsb2NpOiIKYXdrIC1GJ1x0JyAnJDEgPT0gIlBvY2lsbG9wb3JhX21lYW5kcmluYV9ISXYxX19fU2MwMDAwMDAwXzE3NTAiJyAuLi9vdXRwdXQvMTEuMS1QbWVhLXNSTkFzZXEtbWlSZGVlcDItMzFicC1mYXN0cC1tZXJnZWQtY25pZGFyaWFuX21pUkJhc2UvcGFyc2FibGUtcmVzdWx0XzIyXzA0XzIwMjRfdF8xNV8yN18yMi5jc3YgfCBhd2sgJ3twcmludCAkMTV9JwoKYXdrIC1GJ1x0JyAnJDEgPT0gIlBvY2lsbG9wb3JhX21lYW5kcmluYV9ISXYxX19fU2MwMDAwMDAwXzM0NTYyIicgLi4vb3V0cHV0LzExLjEtUG1lYS1zUk5Bc2VxLW1pUmRlZXAyLTMxYnAtZmFzdHAtbWVyZ2VkLWNuaWRhcmlhbl9taVJCYXNlL3BhcnNhYmxlLXJlc3VsdF8yMl8wNF8yMDI0X3RfMTVfMjdfMjIuY3N2IHwgYXdrICd7cHJpbnQgJDE1fScKYGBgCkludGVyZXN0aW5nLi4uIFRoZSB0d28gbG9jaSBoYXZlICp2ZXJ5KiBzaW1pbGFyIHByZWN1cnNvciBzZXF1ZW5jZXMgYW5kIHJldmVyc2VkIG1hdHVyZSBhbmQgc3RhciBzZXF1ZW5jZXMhIEluIG90aGVyIHdvcmRzLCB0aGUgbWF0dXJlIG1pUk5BIHNlcXVlbmNlIGZvciBQb2NpbGxvcG9yYV9tZWFuZHJpbmFfSEl2MV9fX1NjMDAwMDAwMF8xNzUwIGlzIGFsbW9zdCBpZGVudGljYWwgdG8gdGhlIG1pUk5BKiBzZXF1ZW5jZSBvZiBQb2NpbGxvcG9yYV9tZWFuZHJpbmFfSEl2MV9fX1NjMDAwMDAwMF8zNDU2MiwgYW5kIHZpY2UgdmVyc2EhIEknbSBub3QgZXhhY3RseSBzdXJlIHdoYXQgdGhpcyBtZWFucyB0aG91Z2guLi4gaXMgbWlSZGVlcDIganVzdCBpbmNvcnJlY3RseSBkaXN0aW5ndWlzaGluZyB0aGUgbWF0dXJlIGFuZCBzdGFyIHNlcXVlbmNlcyBmb3Igb25lIG9mIHRoZXNlIGxvY2k/IERvZXMgdGhlIG11Y2ggaGlnaGVyIG1pUmRlZXAyIHNjb3JlIG9mIFBvY2lsbG9wb3JhX21lYW5kcmluYV9ISXYxX19fU2MwMDAwMDAwXzE3NTAgbWVhbiB3ZSBzaG91bGQgYmUgbW9yZSBjb25maWRlbnQgaW4gaXQgYmVpbmcgY29ycmVjdGx5IGRpc3Rpbmd1aXNoZWQ/CgpMZXQncyBzZXQgdGhhdCBhc2lkZSBmb3Igbm93IGFuZCBkbyBzb21lIHF1aWNrIGludmVzdGlnYXRpb24gb2YgdGhlIG1pUmRlZXAyIGV2YWx1YXRpb24gY3JpdGVyaWEgZm9yIGFsbCBvZiB0aGVzZSBTaG9ydFN0YWNrL21pUmRlZXAyIHNoYXJlZCBtaVJOQXMuIFRoaXMgY291bGQgZ2l2ZSB1cyBhbiBpZGVhIG9mIHdoYXQgdGhyZXNob2xkcyBtYXkgYmUgYXBwcm9wcmlhdGUgZm9yIGZpbHRlcmluZyB0aGUgbWlSZGVlcDIgb3V0cHV0LiAKYGBge3IgY2hlY2stbWlyZGVlcDItb3V0cHV0LWFsbC1zaGFyZWQsIGVuZ2luZT0nYmFzaCcsIGV2YWw9VFJVRX0KbWlyZGVlcElEcz0kKGF3ayAne3ByaW50ICQxM30nIC4uL291dHB1dC8xNy1QbWVhLVNob3J0U3RhY2stbWlSZGVlcDItY29tcGFyaXNvbi9TaG9ydFN0YWNrX21pUmRlZXAyX21hdHVyZV9pbnRlcnNlY3QuYmVkKQoKaGVhZCAtMSAuLi9vdXRwdXQvMTEuMS1QbWVhLXNSTkFzZXEtbWlSZGVlcDItMzFicC1mYXN0cC1tZXJnZWQtY25pZGFyaWFuX21pUkJhc2UvcGFyc2FibGUtcmVzdWx0XzIyXzA0XzIwMjRfdF8xNV8yN18yMi5jc3YgPiAuLi9vdXRwdXQvMTctUG1lYS1TaG9ydFN0YWNrLW1pUmRlZXAyLWNvbXBhcmlzb24vaW50ZXJzZWN0X21pUmRlZXAyX3N0YXRzLnR4dAp3aGlsZSBJRlM9IHJlYWQgLXIgaWQ7IGRvCiAgIyBVc2UgYXdrIHRvIHByb2Nlc3MgZmlsZUEgYW5kIG1hdGNoIGNvbHVtbiAxIHdpdGggdGhlIGN1cnJlbnQgSUQKICBhd2sgLUYnXHQnIC12IGlkPSIkaWQiICckMSA9PSBpZCB7cHJpbnR9JyAuLi9vdXRwdXQvMTEuMS1QbWVhLXNSTkFzZXEtbWlSZGVlcDItMzFicC1mYXN0cC1tZXJnZWQtY25pZGFyaWFuX21pUkJhc2UvcGFyc2FibGUtcmVzdWx0XzIyXzA0XzIwMjRfdF8xNV8yN18yMi5jc3YKZG9uZSA8PDwgIiRtaXJkZWVwSURzIiA+PiAuLi9vdXRwdXQvMTctUG1lYS1TaG9ydFN0YWNrLW1pUmRlZXAyLWNvbXBhcmlzb24vaW50ZXJzZWN0X21pUmRlZXAyX3N0YXRzLnR4dApgYGAKCmBgYHtyIHZpZXctY3JpdGVyaWEsIGV2YWw9VFJVRX0KaW50ZXJzZWN0X21pUmRlZXAyX3N0YXRzIDwtIHJlYWQuY3N2KCIuLi9vdXRwdXQvMTctUG1lYS1TaG9ydFN0YWNrLW1pUmRlZXAyLWNvbXBhcmlzb24vaW50ZXJzZWN0X21pUmRlZXAyX3N0YXRzLnR4dCIsIHNlcD0iXHQiKQoKaW50ZXJzZWN0X21pUmRlZXAyX3N0YXRzICU+JSAKICBzZWxlY3QobWlSRGVlcDIuc2NvcmUsIHNpZ25pZmljYW50LnJhbmRmb2xkLnAudmFsdWUpICU+JSAKICBhcnJhbmdlKGRlc2MobWlSRGVlcDIuc2NvcmUpKSAlPiUKICBrYWJsZSgpCmBgYAoKVGhlIG1pUmRlZXAyIHNjb3JlIGlzICJ0aGUgbG9nLW9kZHMgc2NvcmUgYXNzaWduZWQgdG8gdGhlIGhhaXJwaW4iIGFuZCBpcyBlc3NlbnRpYWxseSBhIHByb2JhYmlsaXR5IHRoYXQgdGhlIGxvY3VzIGlzIGEgbWlSTkEgKHByZXN1bWFibHkgYmFzZWQgb24gdGhlIGhhaXJwaW4gc3RydWN0dXJlKSBvbiwgd2l0aCBoaWdoZXIgdmFsdWVzIGluZGljYXRpbmcgaGlnaGVyIHByb2JhYmlsaXR5LiBNaVJkZWVwMidzIGRlZmF1bHQgc2NvcmUgdGhyZXNob2xkIGZvciBtaVJOQSBjbGFzc2lmaWNhdGlvbiBpcyAwLCBidXQgY29yYWwgbWlSTkEgcGFwZXJzIHdlJ3ZlIHNlZW4gdXNlIG15cmlhZCB0aHJlc2hvbGRzIChlLmcuLCA0LCAxMCkuCgpUaGUgcmFuZGZvbGQgaXMgYWxzbyBhbiBldmFsdWF0aW9uIG9mIG5jcm5hIHNlY29uZGFyeSBzdHJ1Y3R1cmUsIGFuZCB3ZSB3YW50IGEgc2lnbmlmaWNhbnQgcmFuZGZvbGQgdmFsdWUgKHRoaXMgd291bGQgaW5kaWNhdGUgaGlnaCBsaWtlbGlob29kIG9mIG1pUk5BIHByZWN1cnNvcnkgc3RydWN0dXJlKQoKMjMgb3V0IG9mIDI3IHNoYXJlZCBtaVJOQXMgaGF2ZSBtaVJkZWVwMiBzY29yZXMgPjEwLCBhbmQgYWxsIDMwIGhhdmUgc2lnbmlmaWNhbnQgcmFuZGZvbGQgcC12YWx1ZXMsIHdoaWNoIGlzIGdvb2Qgc3VwcG9ydCBmb3IgdXNpbmcgdGhlc2UgdGhyZXNob2xkcy4K