Introduction

Last week we explored the coalescence times we expect to see if sequences are neutral with those we estimated from nucleotide sequence data. As we discussed in class, under an infinite sites model of evolution we can derive estimates of \(\theta = 4N_e\mu\) from either the number of segregating sites, \(k\), or from the nucleotide diversity, \(\pi\).

\[ \begin{eqnarray*} \hat\theta_\pi &=& \hat\pi \\ \hat\theta_k &=& \frac{k}{\sum_i^{n-1}\frac{1}{i}} \quad , \end{eqnarray*} \]

where \(n\) is the number of sequences in our sample. Since \(\hat\theta_\pi\)1 and \(\hat\theta_k\) are both estimates of \(\theta\), they should be equal if sequences are evolving neutrally2 and the population is at a drift-mutation equilibrium. Tajima’s \(D\) is defined as

\[ \hat D = \frac{\hat\theta_\pi - \hat\theta_k}{\mbox{Var}(\hat\theta_\pi - \hat\theta_k)} \quad . \] If \(D \ne 0\), then we know either that fitness differences among the sequences are not effectively neutral or that the population is not at a drift-mutation equilibrium.3

Esitmating Tajima’s D

It is quite straightforward to estimate Tajima’s \(D\) and to assess whether it is different from 0 in R. Here’s how we’d do it with an sRNase data set from Solanum peruvianum.4

library(adegenet)
library(pegas)

rm(list = ls())

solanum <- read.dna("solanum-peruvianum.clw.clwstrict", format = "clustal")

solanum_taj <- tajima.test(solanum)
solanum_taj

The output is pretty easy to intepret. D is our estimate of Tajima’s \(D\), PVal.normal is the probability of getting the observed value of \(D\) if the sequence variation were neutral and the population was at a drift-mutation equilibrium assuming that \(D\) follows a normal distribution with mean zero and variance one. Pval.beta is the probability of getting the observed value of \(D\) if the sequence variation were neutral and the population was at a drift-mutation equilibrium assuming that \(D\) follows a beta distribution, which was Tajima’s original proposal.

Here we have a positive \(D\), suggesting that there might be diversifying selection, but the support for that suggestion is very weak. There’s about a 62 percent chance we’d get a value of \(D\) as large as what we observe here even if there were no selection acting on these sequences and the population were at a drift-mutation equilibrium.5

Lab 10

For this lab exercise you’ll be exploring genetic variation at four loci in loblolly pine. The data are derived from Gonzalez-Martinez and colleagues.6 There are two data sets for each of the loci included in the analysis:

One data set for each locus, the Pinus-taeda-<gene name>-coding.fasta data set, includes only the coding portion of the nucleotide sequence as downloaded from Genbank. The other data set, the Pinus-taeda-<gene name>.fasta data set, includes the complete nucleotide sequence as downloaded from Genbank. Each data set contains 32 sequences that were aligned using Muscle. The following table shows the number of nucleotides included in each data set.

NOTE: You’ll need to specify format = "fasta" when you call read.dna().

Using these data, answer the following questions:

  1. Is there evidence for selection, a recent population expansion, or a recent population bottleneck at any locus when the complete sequence is considered?

  2. Is there evidence for selection, a recent population expansion, or a recent population bottleneck at any locus when only the coding sequence is considered?

  3. Assume that there has not been a recent population expansion, a recent bottleneck, or a recent change in range size. What kind of selection might account for the patterns revealed in your answers? Are the patterns of selection you detect consistent with these loci being adaptively important in drought responses?


  1. IMPORTANT NOTE #1: I realized when I was putting this lab exercise together, that I’ve been getting a couple of details about Tajima’s \(D\) wrong for several years. The definition of \(\theta_pi\) is the first example. In the notes and in lecture I defined \(\hat\pi\) as \[ \hat\pi = \sum_{ij}x_ix_j\delta_{ij}/N \quad , \] where \(\delta_{ij}\) is the number of nucleotide differences between haplotypes \(i\) and \(j\), and \(N\) is the length of the sequence. I should have left off the division by \(N\). \(\pi\) then becomes the average number of nucleotide differences between two randomly chosen haplotypes.↩︎

  2. Remember that when we say that sequences are evolving neutrally, we really mean that any fitness differences are effectively neutral because \(N_es < 1\).↩︎

  3. IMPORTANT NOTE #2: This is the second way I have been getting things wrong. Our estimate of \(D\) isn’t simply the difference between \(\theta_pi\) and \(\theta_k\). That difference is divided by the corresponding variance, giving \(\hat D\) a mean of zero and a variance of one if the sequences are evolving neutrally and the population is at a drift-mutation equilibrium. This scaling allows us to use a normal distributiion with a mean of zero and a variance of one or a beta distribution to calculate the probability of getting the observed value of \(\hat D\). I’ve updated the online notes to reflect these corrections. If you’ve already downloaded a copy, you might want to download them again and throw out the old version.↩︎

  4. Miller, J.S., and J. Kostyun. 2010. Functional gametophytic self-incompatibility in a peripheral population of Solanum peruvianum (Solanaceae). Heredity 107:30-39. doi: https://doi.org/10.1038/hdy.2010.151↩︎

  5. Note: Miller and Kostyun use more sophisticated methods to explore site-specific patterns of selection and find evidence that selection favors diversity in regions of the gene associated with determining the specificity of self-incompatibility reactions and that there is purifying selection in other parts of the gene. Sounds a bit like ADH in Drosophila melanogaster, doesn’t it?↩︎

  6. Gonzalez-Martinez, S.C., E. Ersoz, G.R. Brown, N.C. Wheeler, and D.B. Neale. 2006. DNA sequence fariation and selection of tag single-nucleotide polymorphisms at candidate genes for drought-stress response in Pinus taeda L. Genetics 172:1915-1926. doi: https://doi.org/10.1534/genetics.105.047126↩︎

LS0tCnRpdGxlOiAiVGFqaW1hJ3MgRCIKb3V0cHV0OiAKICBodG1sX25vdGVib29rOgogICAgdG9jOiB5ZXMKICAgIHRvY19mbG9hdDogdHJ1ZQotLS0KCiMgSW50cm9kdWN0aW9uCgpMYXN0IHdlZWsgd2UgZXhwbG9yZWQgdGhlIGNvYWxlc2NlbmNlIHRpbWVzIHdlIGV4cGVjdCB0byBzZWUgaWYgc2VxdWVuY2VzIGFyZSBuZXV0cmFsIHdpdGggdGhvc2Ugd2UgZXN0aW1hdGVkIGZyb20gbnVjbGVvdGlkZSBzZXF1ZW5jZSBkYXRhLiBBcyB3ZSBkaXNjdXNzZWQgaW4gY2xhc3MsIHVuZGVyIGFuIGluZmluaXRlIHNpdGVzIG1vZGVsIG9mIGV2b2x1dGlvbiB3ZSBjYW4gZGVyaXZlIGVzdGltYXRlcyBvZiAkXHRoZXRhID0gNE5fZVxtdSQgZnJvbSBlaXRoZXIgdGhlIG51bWJlciBvZiBzZWdyZWdhdGluZyBzaXRlcywgJGskLCBvciBmcm9tIHRoZSBudWNsZW90aWRlIGRpdmVyc2l0eSwgJFxwaSQuCgokJApcYmVnaW57ZXFuYXJyYXkqfQpcaGF0XHRoZXRhX1xwaSAmPSYgXGhhdFxwaSBcXApcaGF0XHRoZXRhX2sgJj0mIFxmcmFje2t9e1xzdW1faV57bi0xfVxmcmFjezF9e2l9fSBccXVhZCAsClxlbmR7ZXFuYXJyYXkqfQokJAoKd2hlcmUgJG4kIGlzIHRoZSBudW1iZXIgb2Ygc2VxdWVuY2VzIGluIG91ciBzYW1wbGUuIFNpbmNlICRcaGF0XHRoZXRhX1xwaSReWyoqKklNUE9SVEFOVCBOT1RFICAjMSoqKjogSSByZWFsaXplZCB3aGVuIEkgd2FzIHB1dHRpbmcgdGhpcyBsYWIgZXhlcmNpc2UgdG9nZXRoZXIsIHRoYXQgSSd2ZSBiZWVuIGdldHRpbmcgYSBjb3VwbGUgb2YgZGV0YWlscyBhYm91dCBUYWppbWEncyAkRCQgd3JvbmcgZm9yIHNldmVyYWwgeWVhcnMuIFRoZSBkZWZpbml0aW9uIG9mICRcdGhldGFfcGkkIGlzIHRoZSBmaXJzdCBleGFtcGxlLiBJbiB0aGUgbm90ZXMgYW5kIGluIGxlY3R1cmUgSSBkZWZpbmVkICRcaGF0XHBpJCBhcwokJApcaGF0XHBpID0gXHN1bV97aWp9eF9peF9qXGRlbHRhX3tpan0vTiBccXVhZCAsCiQkCndoZXJlICRcZGVsdGFfe2lqfSQgaXMgdGhlIG51bWJlciBvZiBudWNsZW90aWRlIGRpZmZlcmVuY2VzIGJldHdlZW4gaGFwbG90eXBlcyAkaSQgYW5kICRqJCwgYW5kICROJCBpcyB0aGUgbGVuZ3RoIG9mIHRoZSBzZXF1ZW5jZS4gSSBzaG91bGQgaGF2ZSBsZWZ0IG9mZiB0aGUgZGl2aXNpb24gYnkgJE4kLiAkXHBpJCB0aGVuIGJlY29tZXMgdGhlIGF2ZXJhZ2UgbnVtYmVyIG9mIG51Y2xlb3RpZGUgZGlmZmVyZW5jZXMgYmV0d2VlbiB0d28gcmFuZG9tbHkgY2hvc2VuIGhhcGxvdHlwZXMuXSBhbmQgJFxoYXRcdGhldGFfayQgYXJlIGJvdGggZXN0aW1hdGVzIG9mICRcdGhldGEkLCB0aGV5IHNob3VsZCBiZSBlcXVhbCBpZiBzZXF1ZW5jZXMgYXJlIGV2b2x2aW5nIG5ldXRyYWxseV5bUmVtZW1iZXIgdGhhdCB3aGVuIHdlIHNheSB0aGF0IHNlcXVlbmNlcyBhcmUgZXZvbHZpbmcgbmV1dHJhbGx5LCB3ZSByZWFsbHkgbWVhbiB0aGF0IGFueSBmaXRuZXNzIGRpZmZlcmVuY2VzIGFyZSBlZmZlY3RpdmVseSBuZXV0cmFsIGJlY2F1c2UgJE5fZXMgPCAxJC5dIGFuZCB0aGUgcG9wdWxhdGlvbiBpcyBhdCBhIGRyaWZ0LW11dGF0aW9uIGVxdWlsaWJyaXVtLiBUYWppbWEncyAkRCQgaXMgZGVmaW5lZCBhcwoKJCQKXGhhdCBEID0gXGZyYWN7XGhhdFx0aGV0YV9ccGkgLSBcaGF0XHRoZXRhX2t9e1xtYm94e1Zhcn0oXGhhdFx0aGV0YV9ccGkgLSBcaGF0XHRoZXRhX2spfSBccXVhZCAuCiQkCklmICREIFxuZSAwJCwgdGhlbiB3ZSBrbm93IGVpdGhlciB0aGF0IGZpdG5lc3MgZGlmZmVyZW5jZXMgYW1vbmcgdGhlIHNlcXVlbmNlcyBhcmUgKioqbm90KioqIGVmZmVjdGl2ZWx5IG5ldXRyYWwgb3IgdGhhdCB0aGUgcG9wdWxhdGlvbiBpcyBub3QgYXQgYSBkcmlmdC1tdXRhdGlvbiBlcXVpbGlicml1bS5eWyoqKklNUE9SVEFOVCBOT1RFICMyKioqOiBUaGlzIGlzIHRoZSBzZWNvbmQgd2F5IEkgaGF2ZSBiZWVuIGdldHRpbmcgdGhpbmdzIHdyb25nLiBPdXIgZXN0aW1hdGUgb2YgJEQkIGlzbid0IHNpbXBseSB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuICRcdGhldGFfcGkkIGFuZCAkXHRoZXRhX2skLiBUaGF0IGRpZmZlcmVuY2UgaXMgZGl2aWRlZCBieSB0aGUgY29ycmVzcG9uZGluZyB2YXJpYW5jZSwgZ2l2aW5nICRcaGF0IEQkIGEgbWVhbiBvZiB6ZXJvIGFuZCBhIHZhcmlhbmNlIG9mIG9uZSBpZiB0aGUgc2VxdWVuY2VzIGFyZSBldm9sdmluZyBuZXV0cmFsbHkgYW5kIHRoZSBwb3B1bGF0aW9uIGlzIGF0IGEgZHJpZnQtbXV0YXRpb24gZXF1aWxpYnJpdW0uIFRoaXMgc2NhbGluZyBhbGxvd3MgdXMgdG8gdXNlIGEgbm9ybWFsIGRpc3RyaWJ1dGlpb24gd2l0aCBhIG1lYW4gb2YgemVybyBhbmQgYSB2YXJpYW5jZSBvZiBvbmUgb3IgYSBiZXRhIGRpc3RyaWJ1dGlvbiB0byBjYWxjdWxhdGUgdGhlIHByb2JhYmlsaXR5IG9mIGdldHRpbmcgdGhlIG9ic2VydmVkIHZhbHVlIG9mICRcaGF0IEQkLiBJJ3ZlIHVwZGF0ZWQgdGhlIG9ubGluZSBub3RlcyB0byByZWZsZWN0IHRoZXNlIGNvcnJlY3Rpb25zLiBJZiB5b3UndmUgYWxyZWFkeSBkb3dubG9hZGVkIGEgY29weSwgeW91IG1pZ2h0IHdhbnQgdG8gZG93bmxvYWQgdGhlbSBhZ2FpbiBhbmQgdGhyb3cgb3V0IHRoZSBvbGQgdmVyc2lvbi5dCgojIyBFc2l0bWF0aW5nIFRhamltYSdzIEQKCkl0IGlzIHF1aXRlIHN0cmFpZ2h0Zm9yd2FyZCB0byBlc3RpbWF0ZSBUYWppbWEncyAkRCQgYW5kIHRvIGFzc2VzcyB3aGV0aGVyIGl0IGlzIGRpZmZlcmVudCBmcm9tIDAgaW4gYFJgLiBIZXJlJ3MgaG93IHdlJ2QgZG8gaXQgd2l0aCBhbiBzUk5hc2UgZGF0YSBzZXQgZnJvbSAqU29sYW51bSBwZXJ1dmlhbnVtKi5eW01pbGxlciwgSi5TLiwgYW5kIEouIEtvc3R5dW4uICAyMDEwLiAgRnVuY3Rpb25hbCBnYW1ldG9waHl0aWMgc2VsZi1pbmNvbXBhdGliaWxpdHkgaW4gYSBwZXJpcGhlcmFsIHBvcHVsYXRpb24gb2YgU29sYW51bSBwZXJ1dmlhbnVtIChTb2xhbmFjZWFlKS4gKkhlcmVkaXR5KiAgMTA3OjMwLTM5LiAgZG9pOiBbaHR0cHM6Ly9kb2kub3JnLzEwLjEwMzgvaGR5LjIwMTAuMTUxXShodHRwczovL2RvaS5vcmcvMTAuMTAzOC9oZHkuMjAxMC4xNTEpXQoKYGBge3IsIG1lc3NhZ2UgPSBGQUxTRX0KbGlicmFyeShhZGVnZW5ldCkKbGlicmFyeShwZWdhcykKCnJtKGxpc3QgPSBscygpKQoKc29sYW51bSA8LSByZWFkLmRuYSgic29sYW51bS1wZXJ1dmlhbnVtLmNsdy5jbHdzdHJpY3QiLCBmb3JtYXQgPSAiY2x1c3RhbCIpCgpzb2xhbnVtX3RhaiA8LSB0YWppbWEudGVzdChzb2xhbnVtKQpzb2xhbnVtX3RhagpgYGAKClRoZSBvdXRwdXQgaXMgcHJldHR5IGVhc3kgdG8gaW50ZXByZXQuIGBEYCBpcyBvdXIgZXN0aW1hdGUgb2YgVGFqaW1hJ3MgJEQkLCBgUFZhbC5ub3JtYWxgIGlzIHRoZSBwcm9iYWJpbGl0eSBvZiBnZXR0aW5nIHRoZSBvYnNlcnZlZCB2YWx1ZSBvZiAkRCQgaWYgdGhlIHNlcXVlbmNlIHZhcmlhdGlvbiB3ZXJlIG5ldXRyYWwgYW5kIHRoZSBwb3B1bGF0aW9uIHdhcyBhdCBhIGRyaWZ0LW11dGF0aW9uIGVxdWlsaWJyaXVtIGFzc3VtaW5nIHRoYXQgJEQkIGZvbGxvd3MgYSBub3JtYWwgZGlzdHJpYnV0aW9uIHdpdGggbWVhbiB6ZXJvIGFuZCB2YXJpYW5jZSBvbmUuIGBQdmFsLmJldGFgIGlzIHRoZSBwcm9iYWJpbGl0eSBvZiBnZXR0aW5nIHRoZSBvYnNlcnZlZCB2YWx1ZSBvZiAkRCQgaWYgdGhlIHNlcXVlbmNlIHZhcmlhdGlvbiB3ZXJlIG5ldXRyYWwgYW5kIHRoZSBwb3B1bGF0aW9uIHdhcyBhdCBhIGRyaWZ0LW11dGF0aW9uIGVxdWlsaWJyaXVtIGFzc3VtaW5nIHRoYXQgJEQkIGZvbGxvd3MgYSBiZXRhIGRpc3RyaWJ1dGlvbiwgd2hpY2ggd2FzIFRhamltYSdzIG9yaWdpbmFsIHByb3Bvc2FsLgoKSGVyZSB3ZSBoYXZlIGEgcG9zaXRpdmUgJEQkLCBzdWdnZXN0aW5nIHRoYXQgdGhlcmUgbWlnaHQgYmUgZGl2ZXJzaWZ5aW5nIHNlbGVjdGlvbiwgYnV0IHRoZSBzdXBwb3J0IGZvciB0aGF0IHN1Z2dlc3Rpb24gaXMgdmVyeSB3ZWFrLiBUaGVyZSdzIGFib3V0IGEgNjIgcGVyY2VudCBjaGFuY2Ugd2UnZCBnZXQgYSB2YWx1ZSBvZiAkRCQgYXMgbGFyZ2UgYXMgd2hhdCB3ZSBvYnNlcnZlIGhlcmUgZXZlbiBpZiB0aGVyZSB3ZXJlIG5vIHNlbGVjdGlvbiBhY3Rpbmcgb24gdGhlc2Ugc2VxdWVuY2VzIGFuZCB0aGUgcG9wdWxhdGlvbiB3ZXJlIGF0IGEgZHJpZnQtbXV0YXRpb24gZXF1aWxpYnJpdW0uXltOb3RlOiBNaWxsZXIgYW5kIEtvc3R5dW4gdXNlIG1vcmUgc29waGlzdGljYXRlZCBtZXRob2RzIHRvIGV4cGxvcmUgc2l0ZS1zcGVjaWZpYyBwYXR0ZXJucyBvZiBzZWxlY3Rpb24gYW5kIGZpbmQgZXZpZGVuY2UgdGhhdCBzZWxlY3Rpb24gZmF2b3JzIGRpdmVyc2l0eSBpbiByZWdpb25zIG9mIHRoZSBnZW5lIGFzc29jaWF0ZWQgd2l0aCBkZXRlcm1pbmluZyB0aGUgc3BlY2lmaWNpdHkgb2Ygc2VsZi1pbmNvbXBhdGliaWxpdHkgcmVhY3Rpb25zIGFuZCB0aGF0IHRoZXJlIGlzIHB1cmlmeWluZyBzZWxlY3Rpb24gaW4gb3RoZXIgcGFydHMgb2YgdGhlIGdlbmUuIFNvdW5kcyBhIGJpdCBsaWtlIEFESCBpbiAqRHJvc29waGlsYSBtZWxhbm9nYXN0ZXIqLCBkb2Vzbid0IGl0P10KCiMgTGFiIDEwCgpGb3IgdGhpcyBsYWIgZXhlcmNpc2UgeW91J2xsIGJlIGV4cGxvcmluZyBnZW5ldGljIHZhcmlhdGlvbiBhdCBmb3VyIGxvY2kgaW4gbG9ibG9sbHkgcGluZS4gVGhlIGRhdGEgYXJlIGRlcml2ZWQgZnJvbSBHb256YWxlei1NYXJ0aW5leiBhbmQgY29sbGVhZ3Vlcy5eW0dvbnphbGV6LU1hcnRpbmV6LCBTLkMuLCBFLiBFcnNveiwgRy5SLiBCcm93biwgTi5DLiBXaGVlbGVyLCBhbmQgRC5CLiBOZWFsZS4gIDIwMDYuICBETkEgc2VxdWVuY2UgZmFyaWF0aW9uIGFuZCBzZWxlY3Rpb24gb2YgdGFnIHNpbmdsZS1udWNsZW90aWRlIHBvbHltb3JwaGlzbXMgYXQgY2FuZGlkYXRlIGdlbmVzIGZvciBkcm91Z2h0LXN0cmVzcyByZXNwb25zZSBpbiAqUGludXMgdGFlZGEqIEwuICAqR2VuZXRpY3MqICAxNzI6MTkxNS0xOTI2LiAgZG9pOiBbaHR0cHM6Ly9kb2kub3JnLzEwLjE1MzQvZ2VuZXRpY3MuMTA1LjA0NzEyNl0oaHR0cHM6Ly9kb2kub3JnLzEwLjE1MzQvZ2VuZXRpY3MuMTA1LjA0NzEyNildIFRoZXJlIGFyZSB0d28gZGF0YSBzZXRzIGZvciBlYWNoIG9mIHRoZSBsb2NpIGluY2x1ZGVkIGluIHRoZSBhbmFseXNpczoKCi0gKmNjb2FvbXQtMSogOiBjYWZmZW95bC1Db0EtTy1tZXRoeWx0cmFuc2ZlcmFzZSAxOgogIC0gW0Z1bGwgc2VxdWVuY2VdKGh0dHA6Ly9kYXJ3aW4uZWViLnVjb25uLmVkdS9lZWIzNDgtcmVzb3VyY2VzL1BpbnVzLXRhZWRhLWNjb2FvbXQtMS5mYXN0YSkKICAtIFtDb2Rpbmcgc2VxdWVuY2VdKGh0dHA6Ly9kYXJ3aW4uZWViLnVjb25uLmVkdS9lZWIzNDgtcmVzb3VyY2VzL1BpbnVzLXRhZWRhLWNjb2FvbXQtMS1jb2RpbmcuZmFzdGEpCi0gKmNwazMqIDogY2FsY2l1bS1kZXBlbmRlbnQgcHJvdGVpbiBraW5hc2UKICAtIFtGdWxsIHNlcXVlbmNlXShodHRwOi8vZGFyd2luLmVlYi51Y29ubi5lZHUvZWViMzQ4LXJlc291cmNlcy9QaW51cy10YWVkYS1jcGszLmZhc3RhKQogIC0gW0NvZGluZyBzZXF1ZW5jZV0oaHR0cDovL2Rhcndpbi5lZWIudWNvbm4uZWR1L2VlYjM0OC1yZXNvdXJjZXMvUGludXMtdGFlZGEtY3BrMy1jb2RpbmcuZmFzdGEpCi0gKmVyZDMqIDogZWFybHkgcmVzcG9uc2UgdG8gZHJvdWdodCAzCiAgLSBbRnVsbCBzZXF1ZW5jZV0oaHR0cDovL2Rhcndpbi5lZWIudWNvbm4uZWR1L2VlYjM0OC1yZXNvdXJjZXMvUGludXMtdGFlZGEtZXJkMy5mYXN0YSkKICAtIFtDb2Rpbmcgc2VxdWVuY2VdKGh0dHA6Ly9kYXJ3aW4uZWViLnVjb25uLmVkdS9lZWIzNDgtcmVzb3VyY2VzL1BpbnVzLXRhZWRhLWVyZDMtY29kaW5nLmZhc3RhKQotICpwcDJjKjogcHJvdGVpbiBwaG9zcGhhdGFzZSAyQy1saWtlIHByb3RlaW4KICAtIFtGdWxsIHNlcXVlbmNlXShodHRwOi8vZGFyd2luLmVlYi51Y29ubi5lZHUvZWViMzQ4LXJlc291cmNlcy9QaW51cy10YWVkYS1wcDJjLmZhc3RhKQogIC0gW0NvZGluZyBzZXF1ZW5jZV0oaHR0cDovL2Rhcndpbi5lZWIudWNvbm4uZWR1L2VlYjM0OC1yZXNvdXJjZXMvUGludXMtdGFlZGEtcHAyYy1jb2RpbmcuZmFzdGEpCgpPbmUgZGF0YSBzZXQgZm9yIGVhY2ggbG9jdXMsIHRoZSBgUGludXMtdGFlZGEtPGdlbmUgbmFtZT4tY29kaW5nLmZhc3RhYCBkYXRhIHNldCwgaW5jbHVkZXMgb25seSB0aGUgY29kaW5nIHBvcnRpb24gb2YgdGhlIG51Y2xlb3RpZGUgc2VxdWVuY2UgYXMgZG93bmxvYWRlZCBmcm9tIEdlbmJhbmsuIFRoZSBvdGhlciBkYXRhIHNldCwgdGhlIGBQaW51cy10YWVkYS08Z2VuZSBuYW1lPi5mYXN0YWAgZGF0YSBzZXQsIGluY2x1ZGVzIHRoZSBjb21wbGV0ZSBudWNsZW90aWRlIHNlcXVlbmNlIGFzIGRvd25sb2FkZWQgZnJvbSBHZW5iYW5rLiBFYWNoIGRhdGEgc2V0IGNvbnRhaW5zIDMyIHNlcXVlbmNlcyB0aGF0IHdlcmUgYWxpZ25lZCB1c2luZyBbTXVzY2xlXShodHRwOi8vd3d3LmViaS5hYy51ay9Ub29scy9tc2EvbXVzY2xlKS4gVGhlIGZvbGxvd2luZyB0YWJsZSBzaG93cyB0aGUgbnVtYmVyIG9mIG51Y2xlb3RpZGVzIGluY2x1ZGVkIGluIGVhY2ggZGF0YSBzZXQuCgpOT1RFOiBZb3UnbGwgbmVlZCB0byBzcGVjaWZ5IGBmb3JtYXQgPSAiZmFzdGEiYCB3aGVuIHlvdSBjYWxsIGByZWFkLmRuYSgpYC4KCmBgYHtyLCBtZXNzYWdlID0gRkFMU0UsIGVjaG8gPSBGQUxTRX0KbGlicmFyeShodG1sVGFibGUpCgpkZiA8LSBkYXRhLmZyYW1lKExvY3VzID0gYygiY2NvYW9tdC0xIiwgImNwazMiLCAiZXJkMyIsICJwcDJjIiksCiAgICAgICAgICAgICAgICAgQ29kaW5nID0gYygyNTgsIDM3OCwgNjI1LCA0NjEpLAogICAgICAgICAgICAgICAgIENvbXBsZXRlID0gYyg1MTcsIDYzMCwgODgyLCA2MzQpKQpodG1sVGFibGUoZGYsIAogICAgICAgICAgY2dyb3VwID0gYygiIiwgIk51Y2xlb3RpZGUgc2VxdWVuY2UgbGVuZ3RoIiksCiAgICAgICAgICBuLmNncm91cCA9IGMoMSwgMiksCiAgICAgICAgICBybmFtZXMgPSBGQUxTRSkKYGBgCgpVc2luZyB0aGVzZSBkYXRhLCBhbnN3ZXIgdGhlIGZvbGxvd2luZyBxdWVzdGlvbnM6CgoxLiBJcyB0aGVyZSBldmlkZW5jZSBmb3Igc2VsZWN0aW9uLCBhIHJlY2VudCBwb3B1bGF0aW9uIGV4cGFuc2lvbiwgb3IgYSByZWNlbnQgcG9wdWxhdGlvbiBib3R0bGVuZWNrIGF0IGFueSBsb2N1cyB3aGVuIHRoZSBjb21wbGV0ZSBzZXF1ZW5jZSBpcyBjb25zaWRlcmVkPwoKMi4gSXMgdGhlcmUgZXZpZGVuY2UgZm9yIHNlbGVjdGlvbiwgYSByZWNlbnQgcG9wdWxhdGlvbiBleHBhbnNpb24sIG9yIGEgcmVjZW50IHBvcHVsYXRpb24gYm90dGxlbmVjayBhdCBhbnkgbG9jdXMgd2hlbiBvbmx5IHRoZSBjb2Rpbmcgc2VxdWVuY2UgaXMgY29uc2lkZXJlZD8KCjMuIEFzc3VtZSB0aGF0IHRoZXJlIGhhcyBub3QgYmVlbiBhIHJlY2VudCBwb3B1bGF0aW9uIGV4cGFuc2lvbiwgYSByZWNlbnQgYm90dGxlbmVjaywgb3IgYSByZWNlbnQgY2hhbmdlIGluIHJhbmdlIHNpemUuIFdoYXQga2luZCBvZiBzZWxlY3Rpb24gbWlnaHQgYWNjb3VudCBmb3IgdGhlIHBhdHRlcm5zIHJldmVhbGVkIGluIHlvdXIgYW5zd2Vycz8gQXJlIHRoZSBwYXR0ZXJucyBvZiBzZWxlY3Rpb24geW91IGRldGVjdCBjb25zaXN0ZW50IHdpdGggdGhlc2UgbG9jaSBiZWluZyBhZGFwdGl2ZWx5IGltcG9ydGFudCBpbiBkcm91Z2h0IHJlc3BvbnNlcz8K