Description

Please answer the following questions as part of the narrative in your project report. For each question, make sure that the corresponding code is included along with your results.

What is the average amount of missing data per individual?

library(dartR)
Loading required package: ggplot2
Loading required package: dplyr

Attaching package: ‘dplyr’

The following objects are masked from ‘package:stats’:

    filter, lag

The following objects are masked from ‘package:base’:

    intersect, setdiff, setequal, union

Loading required package: dartR.data
**** Welcome to dartR.data [Version 1.0.8 ] ****

Registered S3 method overwritten by 'pegas':
  method      from
  print.amova ade4
Registered S3 method overwritten by 'GGally':
  method from   
  +.gg   ggplot2
Registered S3 method overwritten by 'genetics':
  method      from 
  [.haplotype pegas
**** Welcome to dartR [Version 2.9.7 ] ****

Be aware that owing to CRAN requirements and compatibility reasons not all functions of the package may run after the basic installation, as some packages could still be missing. Hence for a most enjoyable experience we recommend to run the function 
gl.install.vanilla.dartR()
This installs all missing and required packages for your version of dartR. In case something fails during installation please refer to this tutorial: https://github.com/green-striped-gecko/dartR/wiki/Installation-tutorial.

For information how to cite dartR, please use:
citation('dartR')
Global verbosity is set to: 2


**** Have fun using dartR! ****

Attaching package: ‘dartR’

The following objects are masked from ‘package:dartR.data’:

    bandicoot.gl, possums.gl, testset.gl, testset.gs

Setting the work directory

print(genlight_obj)
 /// GENLIGHT OBJECT /////////

 // 77 genotypes,  5,308 binary SNPs, size: 2.2 Mb
 226944 (55.53 %) missing data

 // Basic content
   @gen: list of 77 SNPbin
   @ploidy: ploidy of each individual  (range: 2-2)

 // Optional content
   @ind.names:  77 individual labels
   @loc.names:  5308 locus labels
   @loc.all:  5308 alleles
   @chromosome: factor storing chromosomes of the SNPs
   @position: integer storing positions of the SNPs
   @pop: population of each individual (group size range: 77-77)
   @other: a list containing: loc.metrics  loc.metrics.flags  verbose  history  ind.metrics 

Questions:

Q1:

How many individuals are in the dataset? There are 77 individuals after filtering them (see the {sh} below for the command line) The average missing data per individual in the matrix is 0.5553 At the very least 25 individual are candidate for exclusion under 50% of missing data per individuals.

vcftools --vcf temp_filtered.vcf --minDP 10 --max-meanDP 40 --max-missing 0.2 --min-alleles 2 --max-alleles 2 --remove-indels --recode --out final_filtered_variants
print(id_indiv_discard)
AC1-AC16_0509_023.q10.sorted.bam 
                              25 

Q2:

How did you choose to filter your data, and how many SNPs do you retain after filtering? Filtered data with a threshold of 80%, meaning individual with 80% of data are retain and others are excluded. After filters, 333 SNPs are retained.

Why did you choose to use the filters that you did with these data? The filter threshold was selected to prevent low-quality SNPs where significant missing data can mislead the results and interpretations.

What are we trying to mitigate by using these filters? The 80% filter threshold remove any individual that does not have 80% of data, creating high quality of individuals data. The monomorph filter seems to remove SNPs with no variants, which could be ideal to understand only those individuals that contribute to genetic diversity.

print(paste("# of SNPs retained aftered filteres:", num_snps_retained))
[1] "# of SNPs retained aftered filteres: 333"

Q3

Are there any individuals that seem to have elevated heterozygosity in the sampled population? Please provide a plot that demonstrates this. At least three individuals have elevated heterozygosity on the data frame.

Why might an individual with elevated heterozygosity be concerning? Unusual elevated heterozygosity might be due to contaminants, external genetic influences and/or biases on the outcomes if ot accounted for.

#1. We calculate the heterogeneity (het) per individuals
het_data <- gl.report.heterozygosity(genlight_obj)
Starting gl.report.heterozygosity 
  Processing genlight object with SNP data
  Calculating Observed Heterozygosities, averaged across 
                    loci, for each population
  Calculating Expected Heterozygosities
Completed: gl.report.heterozygosity 

Q4

How diverse is the sampled population? Please provide an estimate of genetic diversity and a brief explanation of the measure of diversity that you chose to use. The expected heterozygosity average is 0.137.

Would you make a management recommendation based solely on this diversity estimate? The expected and observed genetic diversity might not be enough to make management decision, but it is a good base line to make decision on what kind of data to collect.

Why or why not? If not, what further information would you want before making a recommendation? We should know more about the population size, the structure of the population and environmental factors. Those threats and pressures would define the

ggplot(diversity_df, aes(x = Heterozygosity)) +
  geom_histogram(binwidth = 0.05, fill = "steelblue", color = "black") +
  labs(title = "Distribution of Genetic Diversity (Obv. Het)",
       x = "Heterozygosity",
       y = "Frequency")
Error in `geom_histogram()`:
! Problem while computing aesthetics.
ℹ Error occurred in the 1st layer.
Caused by error:
! object 'Heterozygosity' not found
Backtrace:
  1. base (local) `<fn>`(x)
  2. ggplot2:::print.ggplot(x)
  4. ggplot2:::ggplot_build.ggplot(x)
  5. ggplot2:::by_layer(...)
 12. ggplot2 (local) f(l = layers[[i]], d = data[[i]])
 13. l$compute_aesthetics(d, plot)
 14. ggplot2 (local) compute_aesthetics(..., self = self)
 15. base::lapply(aesthetics, eval_tidy, data = data, env = env)
 16. rlang (local) FUN(X[[i]], ...)

Q5:

Are the majority of loci in this population in Hardy-Weinberg equilibrium (HWE) overall? The majority of the loci tested are distal of the HWE. It could be a issue in the data or from the filter function of p-value 0.05. The filter function was set with colunm “Prob” for p-value.

If not, how do you interpret its departure from HWE? What could this mean about the population or sampling scheme? If it is actually an outcome of the dataset, we can consider the population to be highly inbreeding and perhaps the population size decline. The environmental structure factors in for the lack of heterozygosity. On the other hand, sampling randomization could influence in the outcome if the bioinformatics are process carefully. Both are possibilities for the distal from HWE.

print(paste("loci distal from HWE:", num_hwe_loci))
[1] "loci distal from HWE: 1153"

Q6:

Please provide a PCA plot visualizing the genetic relatedness among individuals. What stands out to you in this visualization? We have three clear clusters, two of the three more packed, while the third has some deviation. The two more packed suggested genetic similarity and perhaps it comes from the same ecosystem. Also, it coud suggest shared ancestry.

There are a couple of outlines that might have some interesting genetic diversity or fragmented by phisical varries with little migration opportunities.

Q7:

What additional question(s) do you have about this dataset that would aid in your interpretation of these data? Yes: here are three that come to mind: (they might be incorrect or out of the scoepe) 1. Is there evidence of population structure within the dataset? k-mean cluster assigment test suggests population structuring with the available data.

  1. How does inbreeding affect the genetic diversity observed in this population? This analysis could help to understand the clustering of the individuals that has been presented on previous question answer.

LS0tCnRpdGxlOiAiUG9yamVjdCAxIgpzdWJ0aXRsZTogIkJpb2luZm9ybWF0aWNzIGZvciBDb3NlcnZhdGlvbiIKYXV0aG9yOiAiTmt3aSBGbG9yZXMiCm91dHB1dDogaHRtbF9ub3RlYm9vawotLS0KCiMgRGVzY3JpcHRpb24KUGxlYXNlIGFuc3dlciB0aGUgZm9sbG93aW5nIHF1ZXN0aW9ucyBhcyBwYXJ0IG9mIHRoZSBuYXJyYXRpdmUgaW4geW91ciBwcm9qZWN0IHJlcG9ydC4gRm9yIGVhY2ggcXVlc3Rpb24sIG1ha2Ugc3VyZSB0aGF0IHRoZSBjb3JyZXNwb25kaW5nIGNvZGUgaXMgaW5jbHVkZWQgYWxvbmcgd2l0aCB5b3VyIHJlc3VsdHMuCgoKV2hhdCBpcyB0aGUgYXZlcmFnZSBhbW91bnQgb2YgbWlzc2luZyBkYXRhIHBlciBpbmRpdmlkdWFsPwpgYGB7cn0KIyBJbnN0YWxsIG5lY2Vzc2FyeSBwYWNrYWdlcyAoaWYgbm90IGFscmVhZHkgaW5zdGFsbGVkKQpsaWJyYXJ5KHRpZHl2ZXJzZSkKbGlicmFyeShkYXJ0UikKbGlicmFyeShhZGVnZW5ldCkKCmBgYApTZXR0aW5nIHRoZSB3b3JrIGRpcmVjdG9yeQpgYGB7cn0Kc2V0d2QoIn4vTGlicmFyeS9DbG91ZFN0b3JhZ2UvT25lRHJpdmUtVW5pdmVyc2l0eW9mQXJpem9uYS9Eb2N1bWVudHMvc2FuZGJveC9iaW9pbmZvcm1hdGljcy9kYXRhLyIpCgojTG9hZCB0aGUgdmNmIGZpbGUgImZpbmFsX2ZpbHRlcmVkX3ZhcmlhbnRzLnJlY29kZS52Y2YiCiNXZSB1c2UgdGhlIHRvb2wgZ2VubGlnaHRfb2JqCnZjZl9maWxlIDwtICIvVXNlcnMvbmtmL0xpYnJhcnkvQ2xvdWRTdG9yYWdlL09uZURyaXZlLVVuaXZlcnNpdHlvZkFyaXpvbmEvRG9jdW1lbnRzL3NhbmRib3gvYmlvaW5mb3JtYXRpY3MvZGF0YS9maW5hbF9maWx0ZXJlZF92YXJpYW50cy5yZWNvZGUudmNmIgpnZW5saWdodF9vYmogPC0gZ2wucmVhZC52Y2YodmNmX2ZpbGUpCgpwcmludChnZW5saWdodF9vYmopCgpgYGAKCiMgUXVlc3Rpb25zOgojIyMgUTE6CioqSG93IG1hbnkgaW5kaXZpZHVhbHMgYXJlIGluIHRoZSBkYXRhc2V0PyoqClRoZXJlIGFyZSA3NyBpbmRpdmlkdWFscyBhZnRlciBmaWx0ZXJpbmcgdGhlbSAoc2VlIHRoZSB7c2h9IGJlbG93IGZvciB0aGUgY29tbWFuZCBsaW5lKQpUaGUgYXZlcmFnZSBtaXNzaW5nIGRhdGEgcGVyIGluZGl2aWR1YWwgaW4gdGhlIG1hdHJpeCBpcyAwLjU1NTMKQXQgdGhlIHZlcnkgbGVhc3QgMjUgaW5kaXZpZHVhbCBhcmUgY2FuZGlkYXRlIGZvciBleGNsdXNpb24gdW5kZXIgNTAlIG9mIG1pc3NpbmcgZGF0YSBwZXIgaW5kaXZpZHVhbHMuCmBgYHtzaH0KdmNmdG9vbHMgLS12Y2YgdGVtcF9maWx0ZXJlZC52Y2YgLS1taW5EUCAxMCAtLW1heC1tZWFuRFAgNDAgLS1tYXgtbWlzc2luZyAwLjIgLS1taW4tYWxsZWxlcyAyIC0tbWF4LWFsbGVsZXMgMiAtLXJlbW92ZS1pbmRlbHMgLS1yZWNvZGUgLS1vdXQgZmluYWxfZmlsdGVyZWRfdmFyaWFudHMKYGBgCgpgYGB7ciwgbGFiZWwgPSBRMX0KIzEuIFdlIGNvdW50IHRoZSBudW1iZXIgb2YgaW5pZHZpZHVhbHMKbnVtX2luZGl2IDwtIG5JbmQoZ2VubGlnaHRfb2JqKQpwcmludChwYXN0ZSgibnVtYmVyIG9mIGluZGl2aWR1YWxzIiwgbnVtX2luZGl2KSkKCiMyLiBXZSBleHRyYWN0ZWQgdGhlIGdlbm90eXBlIGFzIGEgbWF0cml4IGJlY2F1c2Ugc29tZSBmdW5jdGlvbnMgbm90IHdvcmtpbmcgZm9yIHRoaXMgdmVyc2lvbiBvZiBSLgpnZW5vdHlwZV9tYXRyaXggPC0gYXMubWF0cml4KGdlbmxpZ2h0X29iaikKIzMuIFdlIHRyeSB0byBjYWxjdWxhdGUgdGhlIG1pc3NpbmcgZGF0YSBwZXIgaW5kaXZpZHVhbAptaXNzaW5nX2RhdGFfaW5kaXZpZHVhbCA8LSBhcHBseShnZW5vdHlwZV9tYXRyaXgsIDEsIGZ1bmN0aW9uKHgpIG1lYW4oaXMubmEoeCkpKQojNC4gV2UgZXN0aW1hdGVkIHRoZSBhdmVyYWdlIG1pc3NpbmcgZGF0YSBvbiB0aGUgbWF0cml4CmF2Z19taXNzaW5nX2RhdGEgPC1tZWFuKG1pc3NpbmdfZGF0YV9pbmRpdmlkdWFsKQpwcmludChwYXN0ZSgiYXZlcmFnZSBtaXNzaW5nIGRhdGEgcGVyIGluZGl2aWR1YWwgaW4gdGhlIG1hdHJpeDoiLCByb3VuZChhdmdfbWlzc2luZ19kYXRhLCA0KSkpCgojNS4gd2UgdHJ5IHRvIGlkIGluZGl2aWR1YWxzIHRvIGRpc2NhcmQgZHVlIHRvIG1pc3NpbmcgZGF0YS4gV2Ugc2V0IHRoZSB0aHJlc2hvbGQgbG93IGF0IDUwJSBtaXNzaW5nIGRhdGEgCnRocmVzaG9sZCA8LSAwLjUKaWRfaW5kaXZfZGlzY2FyZCA8LSB3aGljaChtaXNzaW5nX2RhdGFfaW5kaXZpZHVhbCA+IHRocmVzaG9sZCkKcHJpbnQoImluZGl2aWR1YWwgd2l0aCBtb3JlIHRoZSAlIG1pc3NpbmcgZGF0YSIpCnByaW50KGlkX2luZGl2X2Rpc2NhcmQpCgpgYGAKYGBge3J9CgpgYGAKCiMjIyBRMjoKKipIb3cgZGlkIHlvdSBjaG9vc2UgdG8gZmlsdGVyIHlvdXIgZGF0YSwgYW5kIGhvdyBtYW55IFNOUHMgZG8geW91IHJldGFpbiBhZnRlciBmaWx0ZXJpbmc/KioKRmlsdGVyZWQgZGF0YSB3aXRoIGEgdGhyZXNob2xkIG9mIDgwJSwgbWVhbmluZyBpbmRpdmlkdWFsIHdpdGggODAlIG9mIGRhdGEgYXJlIHJldGFpbiBhbmQgb3RoZXJzIGFyZSBleGNsdWRlZC4KQWZ0ZXIgZmlsdGVycywgMzMzIFNOUHMgYXJlIHJldGFpbmVkLgoKKipXaHkgZGlkIHlvdSBjaG9vc2UgdG8gdXNlIHRoZSBmaWx0ZXJzIHRoYXQgeW91IGRpZCB3aXRoIHRoZXNlIGRhdGE/KioKVGhlIGZpbHRlciB0aHJlc2hvbGQgd2FzIHNlbGVjdGVkIHRvIHByZXZlbnQgbG93LXF1YWxpdHkgU05QcyB3aGVyZSBzaWduaWZpY2FudCBtaXNzaW5nIGRhdGEgY2FuIG1pc2xlYWQgdGhlIHJlc3VsdHMgYW5kIGludGVycHJldGF0aW9ucy4KCioqV2hhdCBhcmUgd2UgdHJ5aW5nIHRvIG1pdGlnYXRlIGJ5IHVzaW5nIHRoZXNlIGZpbHRlcnM/KioKVGhlIDgwJSBmaWx0ZXIgdGhyZXNob2xkIHJlbW92ZSBhbnkgaW5kaXZpZHVhbCB0aGF0IGRvZXMgbm90IGhhdmUgODAlIG9mIGRhdGEsIGNyZWF0aW5nIGhpZ2ggcXVhbGl0eSBvZiBpbmRpdmlkdWFscyBkYXRhLiBUaGUgbW9ub21vcnBoIGZpbHRlciBzZWVtcyB0byByZW1vdmUgU05QcyB3aXRoIG5vIHZhcmlhbnRzLCB3aGljaCBjb3VsZCBiZSBpZGVhbCB0byB1bmRlcnN0YW5kIG9ubHkgdGhvc2UgaW5kaXZpZHVhbHMgdGhhdCBjb250cmlidXRlIHRvIGdlbmV0aWMgZGl2ZXJzaXR5LgoKYGBge3IsIGxhYmUgPSBRMn0KIzEuIHJldGFpbiBpbmRpdmlkdWFscyB3aXRoIGVub3VnaCBkYXRhLiBzZXQgdGhyZXNob2xkIGF0IDgwJS4KZ2VubGlnaHRfZmlsdGVyZWQgPC0gZ2wuZmlsdGVyLmNhbGxyYXRlKGdlbmxpZ2h0X29iaiwgdGhyZXNob2xkID0gMC44KQpnZW5saWdodF9maWx0ZXJlZCA8LSBnbC5maWx0ZXIubW9ub21vcnBocyhnZW5saWdodF9maWx0ZXJlZCkKIzIuIENvdW50IHJldGFpbiBTTlBzCm51bV9zbnBzX3JldGFpbmVkIDwtIG5Mb2MoZ2VubGlnaHRfZmlsdGVyZWQpCnByaW50KHBhc3RlKCIjIG9mIFNOUHMgcmV0YWluZWQgYWZ0ZXJlZCBmaWx0ZXJlczoiLCBudW1fc25wc19yZXRhaW5lZCkpCmBgYAojIyMgUTMKKipBcmUgdGhlcmUgYW55IGluZGl2aWR1YWxzIHRoYXQgc2VlbSB0byBoYXZlIGVsZXZhdGVkIGhldGVyb3p5Z29zaXR5IGluIHRoZSBzYW1wbGVkIHBvcHVsYXRpb24/IFBsZWFzZSBwcm92aWRlIGEgcGxvdCB0aGF0IGRlbW9uc3RyYXRlcyB0aGlzLioqCkF0IGxlYXN0IHRocmVlIGluZGl2aWR1YWxzIGhhdmUgZWxldmF0ZWQgaGV0ZXJvenlnb3NpdHkgb24gdGhlIGRhdGEgZnJhbWUuCgoqKldoeSBtaWdodCBhbiBpbmRpdmlkdWFsIHdpdGggZWxldmF0ZWQgaGV0ZXJvenlnb3NpdHkgYmUgY29uY2VybmluZz8qKgpVbnVzdWFsIGVsZXZhdGVkIGhldGVyb3p5Z29zaXR5IG1pZ2h0IGJlIGR1ZSB0byBjb250YW1pbmFudHMsIGV4dGVybmFsIGdlbmV0aWMgaW5mbHVlbmNlcyBhbmQvb3IgYmlhc2VzIG9uIHRoZSBvdXRjb21lcyBpZiBvdCBhY2NvdW50ZWQgZm9yLgoKYGBge3IsIGxhYmVsID0gUTN9CiMxLiBXZSBjYWxjdWxhdGUgdGhlIGhldGVyb2dlbmVpdHkgKGhldCkgcGVyIGluZGl2aWR1YWxzCmhldF9kYXRhIDwtIGdsLnJlcG9ydC5oZXRlcm96eWdvc2l0eShnZW5saWdodF9vYmopCgojMi4gd2UgY29udmVydCB0aGlzIGhldF9kYXRhIHRvIGRhdGEgZnJhbWUgCmhldF9kZiA8LSBhcy5kYXRhLmZyYW1lKGhldF9kYXRhKQpjb2xuYW1lcyhoZXRfZGYpIDwtIGMoIkluZGl2aWR1YWwiLCAiSGV0ZXJvenlnb3NpdHkiKQoKIzMuIFBsb3QgdGhlIGhldF9kZiAoaGV0ZXJvenlnb3NpdHkgZGF0YSBmcmFtZSkKZ2dwbG90KGhldF9kZiwgYWVzKHggPSBJbmRpdmlkdWFsLCB5ID0gSGV0ZXJvenlnb3NpdHkpKSArCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIpICsKICBsYWJzKHRpdGxlID0gIkhldGVyb3p5Z29zaXR5IHBlciBJbmRpdmlkdWFsIiwKICAgICAgIHggPSAiSW5kaXZpZHVhbCIsCiAgICAgICB5ID0gIkhldGVyb3p5Z29zaXR5IikgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTAsIGhqdXN0ID0gMSkpCgojNC4gdGFnIHRoZSBpbmRpdmlkdWFsIHdpdGggdW51c3VhbCBoZXRlcm96eWdvc2l0eQptZWFuX2hldCA8LSBtZWFuKGhldF9kZiRIZXRlcm96eWdvc2l0eSkKc2RfaGV0IDwtIHNkKGhldF9kZiRIZXRlcm96eWdvc2l0eSkKdGhyZXNob2xkIDwtIG1lYW5faGV0ICsgMiAqIHNkX2hldCAjc2V0cyB0aGUgdGhyZXNob2xkIHRvIGlkIHRoZSBlbGV2YXRlZCBoZXRlcm96eWdvc2l0eSBwZXIgaW5kaXZpZHVhbAoKY29sbmFtZXMoaGV0X2RmKQoKIzUuIGlkIGluZGl2aWR1YWwgd2l0aCBhYm92ZSB0aHJlc2hvbGQgaGV0ZXJvenlnb3NpdHkKZWxldmF0ZWRfaGV0IDwtIGhldF9kZiAlPiUKICBmaWx0ZXIoSGV0ZXJvenlnb3NpdHkgPiB0aHJlc2hvbGQpCnByaW50KCJpbmRpdmlkdWFsIHdpdGggZWxldmF0ZWQgaGV0ZXJvenlnb3N5IikKcHJpbnQoZWxldmF0ZWRfaGV0KQpgYGAKIyMjIFE0CioqSG93IGRpdmVyc2UgaXMgdGhlIHNhbXBsZWQgcG9wdWxhdGlvbj8gUGxlYXNlIHByb3ZpZGUgYW4gZXN0aW1hdGUgb2YgZ2VuZXRpYyBkaXZlcnNpdHkgYW5kIGEgYnJpZWYgZXhwbGFuYXRpb24gb2YgdGhlIG1lYXN1cmUgb2YgZGl2ZXJzaXR5IHRoYXQgeW91IGNob3NlIHRvIHVzZS4qKgpUaGUgZXhwZWN0ZWQgaGV0ZXJvenlnb3NpdHkgYXZlcmFnZSBpcyAwLjEzNy4gCgoqKldvdWxkIHlvdSBtYWtlIGEgbWFuYWdlbWVudCByZWNvbW1lbmRhdGlvbiBiYXNlZCBzb2xlbHkgb24gdGhpcyBkaXZlcnNpdHkgZXN0aW1hdGU/KioKVGhlIGV4cGVjdGVkIGFuZCBvYnNlcnZlZCBnZW5ldGljIGRpdmVyc2l0eSBtaWdodCBub3QgYmUgZW5vdWdoIHRvIG1ha2UgbWFuYWdlbWVudCBkZWNpc2lvbiwgYnV0IGl0IGlzIGEgZ29vZCBiYXNlIGxpbmUgdG8gbWFrZSBkZWNpc2lvbiBvbiB3aGF0IGtpbmQgb2YgZGF0YSB0byBjb2xsZWN0LgoKKipXaHkgb3Igd2h5IG5vdD8gSWYgbm90LCB3aGF0IGZ1cnRoZXIgaW5mb3JtYXRpb24gd291bGQgeW91IHdhbnQgYmVmb3JlIG1ha2luZyBhIHJlY29tbWVuZGF0aW9uPyoqCldlIHNob3VsZCBrbm93IG1vcmUgYWJvdXQgdGhlIHBvcHVsYXRpb24gc2l6ZSwgdGhlIHN0cnVjdHVyZSBvZiB0aGUgcG9wdWxhdGlvbiBhbmQgZW52aXJvbm1lbnRhbCBmYWN0b3JzLiBUaG9zZSB0aHJlYXRzIGFuZCBwcmVzc3VyZXMgd291bGQgZGVmaW5lIHRoZSAKCmBgYHtyLCBsYWJlbCA9IFE0fQojMS4gR2VuZXRpYyBkaXZlcnNpdHkgY2FsY3VsYXRpb24uIEhvID0gb2JzZXJ2ZWQgaGV0ZXJvenlnb3NpdHksIHdoaWNoIGlzIHRoZSBwcm9wb3J0aW9uIG9mIG1lYXN1cmUgZ2VuZXRpYyBkaXZlcnNpdHkuCmdlbmV0aWNfZGl2ZXJzaXR5IDwtIGdsLmJhc2ljLnN0YXRzKGdlbmxpZ2h0X29iaikkSG8KI3ByaW50KGdlbmV0aWNfZGl2ZXJzaXR5KQoKIzIuIEFsdGVybmF0aXZlIGV4cGVjdGVkIGhldCBjYWxjdWxhdGlvbi4gSGUgPSBleHBlY3RlZCBoZXRlcm96eWdvc2l0eSBpcyB3aGF0IGlzIGV4cGVjdGVkIHVuZGVyIHRoZSBIYXJkeS1XZWluYmVyZy4KZXhwZWN0ZWRfaGV0IDwtIG1lYW4oZ2wuYmFzaWMuc3RhdHMoZ2VubGlnaHRfb2JqKSRIcywgbmEucm0gPSBUUlVFKQpwcmludChwYXN0ZSgiZXhwZWN0ZWQgaGV0ZXJvenlzb3NpdHkgKGhldCk6Iiwgcm91bmQoZXhwZWN0ZWRfaGV0LCA0KSkpCgojMy4gdHJ5IHRvIHZpc3VhbGl6ZSB0aGUgZGF0YSBhcyBkYXRhIGZyYW1lLgpkaXZlcnNpdHlfZGYgPC0gZGF0YS5mcmFtZShIZXRlcm96eWdvc2l0eSA9IGdlbmV0aWNfZGl2ZXJzaXR5KQpnZ3Bsb3QoZGl2ZXJzaXR5X2RmLCBhZXMoeCA9IEhldGVyb3p5Z29zaXR5KSkgKwogIGdlb21faGlzdG9ncmFtKGJpbndpZHRoID0gMC4wNSwgZmlsbCA9ICJzdGVlbGJsdWUiLCBjb2xvciA9ICJibGFjayIpICsKICBsYWJzKHRpdGxlID0gIkRpc3RyaWJ1dGlvbiBvZiBHZW5ldGljIERpdmVyc2l0eSAoT2J2LiBIZXQpIiwKICAgICAgIHggPSAiSGV0ZXJvenlnb3NpdHkiLAogICAgICAgeSA9ICJGcmVxdWVuY3kiKQpgYGAKIyMgUTU6CioqQXJlIHRoZSBtYWpvcml0eSBvZiBsb2NpIGluIHRoaXMgcG9wdWxhdGlvbiBpbiBIYXJkeS1XZWluYmVyZyBlcXVpbGlicml1bSAoSFdFKSBvdmVyYWxsPyoqClRoZSBtYWpvcml0eSBvZiB0aGUgbG9jaSB0ZXN0ZWQgYXJlIGRpc3RhbCBvZiB0aGUgSFdFLiBJdCBjb3VsZCBiZSBhIGlzc3VlIGluIHRoZSBkYXRhIG9yIGZyb20gdGhlIGZpbHRlciBmdW5jdGlvbiBvZiBwLXZhbHVlIDAuMDUuIFRoZSBmaWx0ZXIgZnVuY3Rpb24gd2FzIHNldCB3aXRoIGNvbHVubSAiUHJvYiIgZm9yIHAtdmFsdWUuCgoqKklmIG5vdCwgaG93IGRvIHlvdSBpbnRlcnByZXQgaXRzIGRlcGFydHVyZSBmcm9tIEhXRT8gV2hhdCBjb3VsZCB0aGlzIG1lYW4gYWJvdXQgdGhlIHBvcHVsYXRpb24gb3Igc2FtcGxpbmcgc2NoZW1lPyoqCklmIGl0IGlzIGFjdHVhbGx5IGFuIG91dGNvbWUgb2YgdGhlIGRhdGFzZXQsIHdlIGNhbiBjb25zaWRlciB0aGUgcG9wdWxhdGlvbiB0byBiZSBoaWdobHkgaW5icmVlZGluZyBhbmQgcGVyaGFwcyB0aGUgcG9wdWxhdGlvbiBzaXplIGRlY2xpbmUuIFRoZSBlbnZpcm9ubWVudGFsIHN0cnVjdHVyZSBmYWN0b3JzIGluIGZvciB0aGUgbGFjayBvZiBoZXRlcm96eWdvc2l0eS4gCk9uIHRoZSBvdGhlciBoYW5kLCBzYW1wbGluZyByYW5kb21pemF0aW9uIGNvdWxkIGluZmx1ZW5jZSBpbiB0aGUgb3V0Y29tZSBpZiB0aGUgYmlvaW5mb3JtYXRpY3MgYXJlIHByb2Nlc3MgY2FyZWZ1bGx5LiBCb3RoIGFyZSBwb3NzaWJpbGl0aWVzIGZvciB0aGUgZGlzdGFsIGZyb20gSFdFLgpgYGB7ciwgbGFiZWwgPSBRNX0KIzEuIHRlc3QgZm9yIHRoZSBoYXJkeS1XZWluYmVyZyBlcXVpbGlicml1bS4gSXQgaXMgYSByZXN1bHQgZm9yIGVhY2ggbG9jaSBpbiB0aGUgcG9wdWxhdGlvbiB3aXRoIGEgZGVmYXVsdCBwLXZhbHVlIG9mIDAuMDUuIApod2VfcmVzdWx0cyA8LSBnbC5yZXBvcnQuaHdlKGdlbmxpZ2h0X29iaikKCiMyLiB3ZSBjb3VudCBmb3IgdGhlIG51bWJlciBvZiBsb2NpIGRpc3RhbCBmcm9tIGhhcmR5LXdlaWdoYnJpZGdlIApod2VfZGV2aWF0aW9uIDwtIGh3ZV9yZXN1bHRzICU+JQogIGZpbHRlcihQcm9iIDwgMC4wNSkKCiMzLiBDb3VudGluZyB0aGUgbnVtYmVyIG9mIEhXRSBwZXIgbG9jaSB0aGF0IGFyZSBkaXN0YWwgCm51bV90b3RhbF9sb2NpIDwtIG5yb3coaHdlX3Jlc3VsdHMpCm51bV9od2VfbG9jaSA8LSBucm93KGh3ZV9kZXZpYXRpb24pCm51bV9pbl9od2UgPC0gbnVtX3RvdGFsX2xvY2kgLSBudW1faHdlX2xvY2kKCnByaW50KHBhc3RlKCJ0b3RhbCBsb2NpIHRlc3RlZDoiLCBudW1fdG90YWxfbG9jaSkpCnByaW50KHBhc3RlKCJsb2NpIGluIEhXRToiLCBudW1faW5faHdlKSkKcHJpbnQocGFzdGUoImxvY2kgZGlzdGFsIGZyb20gSFdFOiIsIG51bV9od2VfbG9jaSkpCmBgYAojIyBRNjoKKipQbGVhc2UgcHJvdmlkZSBhIFBDQSBwbG90IHZpc3VhbGl6aW5nIHRoZSBnZW5ldGljIHJlbGF0ZWRuZXNzIGFtb25nIGluZGl2aWR1YWxzLiBXaGF0IHN0YW5kcyBvdXQgdG8geW91IGluIHRoaXMgdmlzdWFsaXphdGlvbj8qKgpXZSBoYXZlIHRocmVlIGNsZWFyIGNsdXN0ZXJzLCB0d28gb2YgdGhlIHRocmVlIG1vcmUgcGFja2VkLCB3aGlsZSB0aGUgdGhpcmQgaGFzIHNvbWUgZGV2aWF0aW9uLiBUaGUgdHdvIG1vcmUgcGFja2VkIHN1Z2dlc3RlZCBnZW5ldGljIHNpbWlsYXJpdHkgYW5kIHBlcmhhcHMgaXQgY29tZXMgZnJvbSB0aGUgc2FtZSBlY29zeXN0ZW0uIEFsc28sIGl0IGNvdWQgc3VnZ2VzdCBzaGFyZWQgYW5jZXN0cnkuCgpUaGVyZSBhcmUgYSBjb3VwbGUgb2Ygb3V0bGluZXMgdGhhdCBtaWdodCBoYXZlIHNvbWUgaW50ZXJlc3RpbmcgZ2VuZXRpYyBkaXZlcnNpdHkgb3IgZnJhZ21lbnRlZCBieSBwaGlzaWNhbCB2YXJyaWVzIHdpdGggbGl0dGxlIG1pZ3JhdGlvbiBvcHBvcnR1bml0aWVzLiAKCmBgYHtyLCBsYWJlbCA9IFE2fQojbG9hZGluZyBhZGRpdGlvbmFsIGxpYnJhcnkgCmxpYnJhcnkoZ2dwbG90MikKCiMxLiBQcmluY2lwYWwgY29vcmRpbmF0ZXMgYW5hbHlzaXMgKFBDQSkKIyBQQ0Egc3VtbWFyeSB0aGUgZ2VuZXRpYyB2YXJpYXRpb24gYW1vbmcgaW5kaXZpZHVhbHMKcGNhX3Jlc3VsdCA8LSBnbC5wY29hKGdlbmxpZ2h0X29iaikKCiMyLiBwbG90dGluZyBQQ0EgZnJvbSB0aGUgZXh0cmFjdCBhbmQgcHJlcGFyZWQgZGF0YSAKcGNhX2RmIDwtIGFzLmRhdGEuZnJhbWUocGNhX3Jlc3VsdCRzY29yZXMpICNjb3ZlcnNlIHRoZSBQQ0Egc2NvcmVzIHRvIGRhdGEgZnJhbWVzIHdpdGggZWFjaCByb3cgZm9yIGVhY2ggaW5kaXZpZHVhbApjb2xuYW1lcyhwY2FfZGYpIDwtIGMoIlBDMSIsICJQQzIiKSAjcmVuYW1lIGNvbHVtbnMgZm9yIGVhc3kgcGxvdHRpbmcgKFByaW5jaXBhbCBDb21wb25lbnQpCnBjYV9kZiRJbmRpdmlkdWFsIDwtIHJvd25hbWVzKHBjYV9kZikgI2FkZGVkIGluZGl2aWR1YWwgaWRlbnRpZmllcnMgCgojMy4gcGxvdHRpbmcgdGhlIGdlbmV0aWMgcmVsYXRlZG5lc3MgYW1vbmcgaW5kaXZpZHVhbHMKZ2dwbG90KHBjYV9kZiwgYWVzKHggPSBQQzEsIHkgPSBQQzIsIGxhYmVsID0gSW5kaXZpZHVhbCkpICsKICBnZW9tX3BvaW50KGNvbG9yID0gImJsdWUiLCBzaXplID0gMykgKwogICNnZW9tX3RleHQodmp1c3QgPSAtMC41LCBoanVzdCA9IDAuNSwgc2l6ZSA9IDMpICsKICBsYWJzKHRpdGxlID0gIlBDQSBvZiBnZW5ldGljIHJlbGF0ZWRuZXNzIGFtb25nIGluZGl2aWR1YWxzIiwKICAgICAgIHggPSAiUEMxIiwKICAgICAgIHkgPSAiUEMyIikKYGBgCiMjIFE3OgpXaGF0IGFkZGl0aW9uYWwgcXVlc3Rpb24ocykgZG8geW91IGhhdmUgYWJvdXQgdGhpcyBkYXRhc2V0IHRoYXQgd291bGQgYWlkIGluIHlvdXIgaW50ZXJwcmV0YXRpb24gb2YgdGhlc2UgZGF0YT8KWWVzOiBoZXJlIGFyZSB0aHJlZSB0aGF0IGNvbWUgdG8gbWluZDogKHRoZXkgbWlnaHQgYmUgaW5jb3JyZWN0IG9yIG91dCBvZiB0aGUgc2NvZXBlKQoxLiAgSXMgdGhlcmUgZXZpZGVuY2Ugb2YgcG9wdWxhdGlvbiBzdHJ1Y3R1cmUgd2l0aGluIHRoZSBkYXRhc2V0PwprLW1lYW4gY2x1c3RlciBhc3NpZ21lbnQgdGVzdCBzdWdnZXN0cyBwb3B1bGF0aW9uIHN0cnVjdHVyaW5nIHdpdGggdGhlIGF2YWlsYWJsZSBkYXRhLgoKMi4gSG93IGRvZXMgaW5icmVlZGluZyBhZmZlY3QgdGhlIGdlbmV0aWMgZGl2ZXJzaXR5IG9ic2VydmVkIGluIHRoaXMgcG9wdWxhdGlvbj8KVGhpcyBhbmFseXNpcyBjb3VsZCBoZWxwIHRvIHVuZGVyc3RhbmQgdGhlIGNsdXN0ZXJpbmcgb2YgdGhlIGluZGl2aWR1YWxzIHRoYXQgaGFzIGJlZW4gcHJlc2VudGVkIG9uIHByZXZpb3VzIHF1ZXN0aW9uIGFuc3dlci4KYGBge3IsIGxhYmVsID0gUTd9CiMxLiBVc2UgdGhlIHBjYV9kZiBmcm9tIHF1ZXN0aW9uIDYuIFRoZSBrLW1lYW4gY2x1c3RlcmVkIGJhc2VkIG9uIGsgPSAyCmttZWFuX3Jlc3VsdCA8LSBrbWVhbnMocGNhX2RmWywgYygiUEMxIiwgIlBDMiIpXSwgY2VudGVycyA9IDIpCgojIGNsdXN0ZXIgYWRkZWQgdG8gZGF0ZSBmcmFtZQpwY2FfZGYkQ2x1c3RlciA8LSBhcy5mYWN0b3Ioa21lYW5fcmVzdWx0JGNsdXN0ZXIpCgojIHBsb3QgdGhlIHBjYV9kZiBhc3NpZ25lZCB0byBjbHVzdGVyCmdncGxvdChwY2FfZGYsIGFlcyh4ID0gUEMxLCB5ID0gUEMyLCBjb2xvciA9IENsdXN0ZXIpKSArCiAgZ2VvbV9wb2ludChzaXplID0gMykgKwogIGxhYnModGl0bGUgPSAiSy1tZWFuIGNsdXN0ZXIgZnJvbSBQQ0EiLAogICAgICAgeCA9ICJQQzEiLAogICAgICAgeSA9ICJQQzIiKSArCiAgdGhlbWVfbWluaW1hbCgpCgojMi4gaW5icmVlZGluZyBjb2VmZmljaWVudCAoRmlzKQpvYnNfaGV0IDwtIGdsLmJhc2ljLnN0YXRzKGdlbmxpZ2h0X29iaikkSG8KZXhwdF9oZXQgPC0gZ2wuYmFzaWMuc3RhdHMoZ2VubGlnaHRfb2JqKSRIcwpmaXNfdmFsdWVzIDwtIDEgLSAob2JzX2hldCAvIGV4cHRfaGV0KQoKI3JlcGxhY2UgTmFOIHZhbHVlcyAoZGl2aWRlZCBieSB6ZXJvKSB3aXRoIE5BIGZvciBjbGFyaXR5IApmaXNfdmFsdWVzW2lzLm5hbihmaXNfdmFsdWVzKV0gPC0gTkEKI2xlbmd0aChmaXNfdmFsdWVzKQojaGVhZChmaXNfdmFsdWVzKQojbmFtZXMoZmlzX3ZhbHVlcykgPC0gbmFtZXMob2JzX2hldCkKI25hbWVzKGZpc192YWx1ZXMpIDwtIG5hbWVzKGV4cHRfaGV0KQojIGNyZWF0ZSB0aGUgZGF0ZSBmcmFtZSBmb3IgYW5hbHlzaXMgCmZpc192YWx1ZXMgPC0gYXMudmVjdG9yKGZpc192YWx1ZXMpCm5hbWVzKGZpc192YWx1ZXMpIDwtIG5hbWVzKG9ic19oZXQpCmZpc19kZiA8LSBkYXRhLmZyYW1lKExvY3VzID0gbmFtZXMoZmlzX3ZhbHVlcyksIEZpcyA9IGZpc192YWx1ZXMpCmhlYWQoZmlzX2RmKQpgYGAKCgo=