(Adapted from Bolstad, Introduction to Bayesian Statistics.)

An urn contains 5 balls, each of which is either red or green. Let \(\theta\) (the unknown parameter) be the total number of red balls and assume that each of the six possible values of \(\theta\) (0, 1, 2, 3, 4, or 5) is a priori equally likely. (Another way to say this is that we have a uniform prior, which represents the absence of prior information.)

Problem 1

Suppose we draw out a red ball. What is the posterior probability distribution of \(\theta\)? In other words, given some data (one red ball), how does that change our assessment of the probability of any given number of red balls in the urn?

Solution

Recall Bayes’s Theorem:

\[p(\theta \mid x) = \frac{p(\theta) p(x \mid \theta)}{p(x)}.\]

Using the so-called “law of total probability”, we expand the denominator:

\[p(\theta \mid x) = \frac{p(\theta) p(x \mid \theta)}{\sum_{\theta} p(\theta) p(x \mid \theta)}.\]

The sum is taken over all possible values of \(\theta\). (Remember that we treat \(x\) as a constant.)

The prior \(p(\theta)\) is \(1/6\) for all values of \(\theta\).

We need to compute the likelihood \(p(x \mid \theta)\). Remember that this is a function of \(\theta\); the data \(x\) is fixed (one red ball). Therefore, we need to compute the value of this function for every possible value of \(\theta\).

For example, if \(\theta\) were zero, then there would be no red balls at all in the urn, and then the likelihood \(p(x \mid \theta)\) would be zero. (You can’t draw a red ball if there are no red balls.) If \(\theta\) were equal to 1, then the probability of drawing the lone red ball from the urn would be \(1/5\). If \(\theta\) were equal to 2, the probability of drawing one of two red balls from the urn would be \(2/5\). Similarly for all other possible values of \(\theta\).

It is convenient to organize our work into a table, shown below. The first column contains the possible values of the parameter. The second column records the prior probabilities. (These should add up to 1.) The third column is the likelihood function. (These will generally not add up to 1.) We multiply the prior times the likelihood in the fourth column. Then by scaling the fourth column appropriately (dividing by the “evidence”), we get the final column, the posterior. The scaling factor in Bayes’s Theorem is

\[p(x) = \sum_{\theta} p(\theta) p(x \mid \theta).\] In other words, we can get this scaling factor by adding up the fourth column containing the values of the prior times the likelihood. (In the following table, that sum is \(0 + 1/30 + 2/30 + 3/30 + 4/30 + 5/30 = 15/30 = 1/2\).) Therefore, the posterior probabilities are the values from the fourth column divided by \(1/2\) (equivalently, multiplied by 2).

\(\theta\) \(p(\theta)\) \(p(x \mid \theta)\) \(p(\theta) p(x \mid \theta)\) \(p(\theta \mid x)\)
0 1/6 0 0 (0)/(1/2) = 0
1 1/6 1/5 1/30 (1/30)/(1/2) = 1/15
2 1/6 2/5 2/30 (2/30)/(1/2) = 2/15
3 1/6 3/5 3/30 (3/30)/(1/2) = 3/15
4 1/6 4/5 4/30 (4/30)/(1/2) = 4/15
5 1/6 5/5 5/30 (5/30)/(1/2) = 5/15

As a sanity check, the last column should add up to 1 since represents a probability function.

The interpretation of the last column is that, given our prior understanding of the situation (in this case, really no prior information) and given a data observation of one red ball, we can now assert our beliefs about the unseen balls left in the urn. Perhaps we got lucky and chose the only red ball in there. There is a \(1/15\) chance of that. Maybe all the balls were red. There is a \(1/3\) (\(5/15\)) chance of that. Don’t confuse this with the likelihood: if you assume all the balls are red, then there is, of course, a 100% chance of pulling out a red ball. That’s not what we’re saying. A posterior probability of \(1/3\) means that we think there’s a reasonably good chance that our draw gave us evidence of an urn full of all red balls, as opposed to other possible scenarios in which there are only, say 4 red balls, or 3 red balls, etc. We’re placing wagers on the question, “How many red balls are there?” and distributing probability across all the possible answers to that question.

We can plot the posterior probability distribution as follows. First, we store the values of the parameter and the posterior probability in a data frame:

theta <- 0:5
post_prob <- c(0, 1/15, 2/15, 3/15, 4/15, 5/15)
plot_df <- data.frame(theta, post_prob)
plot_df

Then we create a “lollipop” plot (which is common for probability mass functions).

library(ggplot2)
ggplot(plot_df, aes(y = post_prob, x = theta)) +
    geom_point() +
    geom_segment(aes(y = 0, yend = post_prob, x = theta, xend = theta)) +
    labs(x = expression(theta),
         y = "Posterior probability")

In fact, to make things even easier in the future, let’s just write a quick and dirty function that takes the parameter values, the prior, and the likelihood as input vectors, then calculates the posterior and plots it.

bayes_plot_discrete <- function(theta, prior, likelihood) {
    # Calculate posterior using Bayes's Theorem
    post_prob <- prior * likelihood / ( sum(prior * likelihood) )
    
    # Gather all variables into a data frame
    plot_df <- data.frame(theta, post_prob)
    
    #Create lollipop plot
    posterior_plot <-
        ggplot(plot_df, aes(y = post_prob, x = theta)) +
            geom_point() +
            geom_segment(aes(y = 0, yend = post_prob,
                             x = theta, xend = theta)) +
            labs(x = expression(theta),
                 y = "Posterior probability")
    
    # Print plot
    posterior_plot
}

Let’s test out the function. We’ve already defined theta, so we just need values for the prior and likelihood.

prior <- rep(1/6, 6)
likelihood1 <- c(0, 1/5, 2/5, 3/5, 4/5, 5/5)
bayes_plot_discrete(theta = theta, prior = prior, likelihood = likelihood1)

Problem 2

Given the same setup as Problem 1 (an urn with five balls and a uniform prior on the total number of red balls), what if you pull out two red balls? Now what is the posterior probability distribution?

First solution

The symbol \(x\) will now represent two red balls.

All that changes here is the likelihood. Note that \(\theta = 0\) and \(\theta = 1\) make it impossible to pull out two red balls.

If \(\theta = 2\), then there is a \(2/5\) chance of red on the first draw. Then, with one remaining red ball left in the urn, there is a \(1/4\) chance of drawing the second red ball.

\[p(x \mid \theta = 2) = (2/5)(1/4) = 1/10\]

(To make the calculations easier, we’ll simplify fractions this time.)

The remaining calculations are similar:

\[p(x \mid \theta = 3) = (3/5)(2/4) = 3/10\] \[p(x \mid \theta = 4) = (4/5)(3/4) = 6/10\] \[p(x \mid \theta = 5) = (5/5)(4/4) = 1\]

Here’s the full table with all the calculations:

\(\theta\) \(p(\theta)\) \(p(x \mid \theta)\) \(p(\theta) p(x \mid \theta)\) \(p(\theta \mid x)\)
0 1/6 0 0 0
1 1/6 0 0 0
2 1/6 1/10 1/60 1/20
3 1/6 3/10 1/20 3/20
4 1/6 6/10 1/10 3/10
5 1/6 1 1/6 1/2

(In case you get lost between the fourth and fifth columns, remember that we have to sum the fourth column to get the scaling factor. Every entry in the fourth column is divided by \(1/60 + 1/20 + 1/10 + 1/6 = 1/3\) to get the corresponding entries in the last column.)

We can plot this using our bayes_plot_discrete function. The parameter values and the prior are the same as before, so we only need to use the new likelihood function.

likelihood2 <- c(0, 0, 1/10, 3/10, 6/10, 1)
bayes_plot_discrete(theta = theta, prior = prior, likelihood = likelihood2)

Second solution

Bayes’s Theorem works sequentially. What this means is that we can gather some data (like the first red ball) and get a posterior distribution. Then, when we get more data (the second red ball), we can assume we’ve already obtained the earlier data. In other words, our posterior after the first round of data collection becomes our prior for the next round.

To illustrate how this works, first work out the likelihood function for drawing one red ball from an urn with four balls. Now \(\theta\) can take values from 0 through 4.

\[p(x \mid \theta = 0) = 0\] \[p(x \mid \theta = 1) = 1/4\] \[p(x \mid \theta = 2) = 2/4\] \[p(x \mid \theta = 3) = 3/4\] \[p(x \mid \theta = 4) = 4/4\]

Now we copy the posterior from Problem 1 into the prior column here. We account for the probabilities after the first draw by starting with those as our new distribution prior to the second draw. Then we fill out the rest of the table except that we ignore the zero row from Problem 1. (If we had no red balls for the first draw, we never would arrive here at the second draw.) Also, we have shifted the values up one row. For example, if there were three red balls among the original five (\(\theta = 3\)), then after the first draw, we would be looking for the probability associated with two red balls among the remaining four (\(\theta = 2\)).

Note that the scaling factor is \(1/30 + 1/10 + 1/5 + 1/3 = 2/3\).

\(\theta\) \(p(\theta)\) \(p(x \mid \theta)\) \(p(\theta) p(x \mid \theta)\) \(p(\theta \mid x)\)
0 1/15 0 0 0
1 2/15 1/4 1/30 1/20
2 3/15 2/4 1/10 3/20
3 4/15 3/4 1/5 3/10
4 5/15 4/4 1/3 1/2

This is the same as the first solution (except the one missing row with zero probability).

Problem 3

Now suppose we draw the balls from the urn with replacement, meaning that we draw the ball, then we put it back before drawing again.

If we draw two red balls with replacement, what is the posterior probability distribution? (We’ll still assume a uniform prior.)

Solution

Since the draws are now independent (the first draw will no longer affect the second draw), the likelihood changes. Skipping over the easy case where \(\theta\) is zero,

\[p(x \mid \theta = 1) = (1/5)(1/5) = 1/25\]

\[p(x \mid \theta = 2) = (2/5)(2/5) = 4/25\] \[p(x \mid \theta = 3) = (3/5)(3/5) = 9/25\] \[p(x \mid \theta = 4) = (4/5)(4/5) = 16/25\] (The case \(\theta = 5\) should also be obvious, right?)

Here is the table. The scaling factor is \(1/150 + 2/75 + 3/50 + 8/75 + 1/6 = 11/305\).

\(\theta\) \(p(\theta)\) \(p(x \mid \theta)\) \(p(\theta) p(x \mid \theta)\) \(p(\theta \mid x)\)
0 1/6 0 0 0
1 1/6 1/25 1/150 1/55
2 1/6 4/25 2/75 4/55
3 1/6 9/25 3/50 9/55
4 1/6 16/25 8/75 16/55
5 1/6 1 1/6 5/11

Again, check that the final column adds to 1.

We plot the posterior probability mass function as before.

likelihood3 <- c(0, 1/25, 4/25, 9/25, 16/25, 1)
bayes_plot_discrete(theta = theta, prior = prior, likelihood = likelihood3)

Why do you think the posterior probability of \(\theta = 5\) here is slightly less than \(1/2\) even though it was exactly \(1/2\) in Problem 2? In other words, why does sampling with replacement make us slightly less confident about lots of red balls than sampling without replacement?

LS0tCnRpdGxlOiAiMS4gRGlzY3JldGUgQmF5ZXMgZXhhbXBsZSIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKKEFkYXB0ZWQgZnJvbSBCb2xzdGFkLCAqSW50cm9kdWN0aW9uIHRvIEJheWVzaWFuIFN0YXRpc3RpY3MqLikKCkFuIHVybiBjb250YWlucyA1IGJhbGxzLCBlYWNoIG9mIHdoaWNoIGlzIGVpdGhlciByZWQgb3IgZ3JlZW4uIExldCAkXHRoZXRhJCAodGhlIHVua25vd24gcGFyYW1ldGVyKSBiZSB0aGUgdG90YWwgbnVtYmVyIG9mIHJlZCBiYWxscyBhbmQgYXNzdW1lIHRoYXQgZWFjaCBvZiB0aGUgc2l4IHBvc3NpYmxlIHZhbHVlcyBvZiAkXHRoZXRhJCAoMCwgMSwgMiwgMywgNCwgb3IgNSkgaXMgKmEgcHJpb3JpKiBlcXVhbGx5IGxpa2VseS4gKEFub3RoZXIgd2F5IHRvIHNheSB0aGlzIGlzIHRoYXQgd2UgaGF2ZSBhICp1bmlmb3JtKiBwcmlvciwgd2hpY2ggcmVwcmVzZW50cyB0aGUgYWJzZW5jZSBvZiBwcmlvciBpbmZvcm1hdGlvbi4pCgoKIyMgUHJvYmxlbSAxCgpTdXBwb3NlIHdlIGRyYXcgb3V0IGEgcmVkIGJhbGwuIFdoYXQgaXMgdGhlIHBvc3RlcmlvciBwcm9iYWJpbGl0eSBkaXN0cmlidXRpb24gb2YgJFx0aGV0YSQ/IEluIG90aGVyIHdvcmRzLCBnaXZlbiBzb21lIGRhdGEgKG9uZSByZWQgYmFsbCksIGhvdyBkb2VzIHRoYXQgY2hhbmdlIG91ciBhc3Nlc3NtZW50IG9mIHRoZSBwcm9iYWJpbGl0eSBvZiBhbnkgZ2l2ZW4gbnVtYmVyIG9mIHJlZCBiYWxscyBpbiB0aGUgdXJuPwoKIyMjIFNvbHV0aW9uCgpSZWNhbGwgQmF5ZXMncyBUaGVvcmVtOgoKJCRwKFx0aGV0YSBcbWlkIHgpID0gXGZyYWN7cChcdGhldGEpIHAoeCBcbWlkIFx0aGV0YSl9e3AoeCl9LiQkCgpVc2luZyB0aGUgc28tY2FsbGVkICJsYXcgb2YgdG90YWwgcHJvYmFiaWxpdHkiLCB3ZSBleHBhbmQgdGhlIGRlbm9taW5hdG9yOgoKJCRwKFx0aGV0YSBcbWlkIHgpID0gXGZyYWN7cChcdGhldGEpIHAoeCBcbWlkIFx0aGV0YSl9e1xzdW1fe1x0aGV0YX0gcChcdGhldGEpIHAoeCBcbWlkIFx0aGV0YSl9LiQkCgpUaGUgc3VtIGlzIHRha2VuIG92ZXIgYWxsIHBvc3NpYmxlIHZhbHVlcyBvZiAkXHRoZXRhJC4gKFJlbWVtYmVyIHRoYXQgd2UgdHJlYXQgJHgkIGFzIGEgY29uc3RhbnQuKQoKVGhlIHByaW9yICRwKFx0aGV0YSkkIGlzICQxLzYkIGZvciBhbGwgdmFsdWVzIG9mICRcdGhldGEkLgoKV2UgbmVlZCB0byBjb21wdXRlIHRoZSBsaWtlbGlob29kICRwKHggXG1pZCBcdGhldGEpJC4gUmVtZW1iZXIgdGhhdCB0aGlzIGlzIGEgZnVuY3Rpb24gb2YgJFx0aGV0YSQ7IHRoZSBkYXRhICR4JCBpcyBmaXhlZCAob25lIHJlZCBiYWxsKS4gVGhlcmVmb3JlLCB3ZSBuZWVkIHRvIGNvbXB1dGUgdGhlIHZhbHVlIG9mIHRoaXMgZnVuY3Rpb24gZm9yIGV2ZXJ5IHBvc3NpYmxlIHZhbHVlIG9mICRcdGhldGEkLgoKRm9yIGV4YW1wbGUsIGlmICRcdGhldGEkIHdlcmUgemVybywgdGhlbiB0aGVyZSB3b3VsZCBiZSBubyByZWQgYmFsbHMgYXQgYWxsIGluIHRoZSB1cm4sIGFuZCB0aGVuIHRoZSBsaWtlbGlob29kICRwKHggXG1pZCBcdGhldGEpJCB3b3VsZCBiZSB6ZXJvLiAoWW91IGNhbid0IGRyYXcgYSByZWQgYmFsbCBpZiB0aGVyZSBhcmUgbm8gcmVkIGJhbGxzLikgSWYgJFx0aGV0YSQgd2VyZSBlcXVhbCB0byAxLCB0aGVuIHRoZSBwcm9iYWJpbGl0eSBvZiBkcmF3aW5nIHRoZSBsb25lIHJlZCBiYWxsIGZyb20gdGhlIHVybiB3b3VsZCBiZSAkMS81JC4gSWYgJFx0aGV0YSQgd2VyZSBlcXVhbCB0byAyLCB0aGUgcHJvYmFiaWxpdHkgb2YgZHJhd2luZyBvbmUgb2YgdHdvIHJlZCBiYWxscyBmcm9tIHRoZSB1cm4gd291bGQgYmUgJDIvNSQuIFNpbWlsYXJseSBmb3IgYWxsIG90aGVyIHBvc3NpYmxlIHZhbHVlcyBvZiAkXHRoZXRhJC4KCkl0IGlzIGNvbnZlbmllbnQgdG8gb3JnYW5pemUgb3VyIHdvcmsgaW50byBhIHRhYmxlLCBzaG93biBiZWxvdy4gVGhlIGZpcnN0IGNvbHVtbiBjb250YWlucyB0aGUgcG9zc2libGUgdmFsdWVzIG9mIHRoZSBwYXJhbWV0ZXIuIFRoZSBzZWNvbmQgY29sdW1uIHJlY29yZHMgdGhlIHByaW9yIHByb2JhYmlsaXRpZXMuIChUaGVzZSBzaG91bGQgYWRkIHVwIHRvIDEuKSBUaGUgdGhpcmQgY29sdW1uIGlzIHRoZSBsaWtlbGlob29kIGZ1bmN0aW9uLiAoVGhlc2Ugd2lsbCBnZW5lcmFsbHkgbm90IGFkZCB1cCB0byAxLikgV2UgbXVsdGlwbHkgdGhlIHByaW9yIHRpbWVzIHRoZSBsaWtlbGlob29kIGluIHRoZSBmb3VydGggY29sdW1uLiBUaGVuIGJ5IHNjYWxpbmcgdGhlIGZvdXJ0aCBjb2x1bW4gYXBwcm9wcmlhdGVseSAoZGl2aWRpbmcgYnkgdGhlICJldmlkZW5jZSIpLCB3ZSBnZXQgdGhlIGZpbmFsIGNvbHVtbiwgdGhlIHBvc3Rlcmlvci4gVGhlIHNjYWxpbmcgZmFjdG9yIGluIEJheWVzJ3MgVGhlb3JlbSBpcwoKJCRwKHgpID0gXHN1bV97XHRoZXRhfSBwKFx0aGV0YSkgcCh4IFxtaWQgXHRoZXRhKS4kJApJbiBvdGhlciB3b3Jkcywgd2UgY2FuIGdldCB0aGlzIHNjYWxpbmcgZmFjdG9yIGJ5IGFkZGluZyB1cCB0aGUgZm91cnRoIGNvbHVtbiBjb250YWluaW5nIHRoZSB2YWx1ZXMgb2YgdGhlIHByaW9yIHRpbWVzIHRoZSBsaWtlbGlob29kLiAoSW4gdGhlIGZvbGxvd2luZyB0YWJsZSwgdGhhdCBzdW0gaXMgJDAgKyAxLzMwICsgMi8zMCArIDMvMzAgKyA0LzMwICsgNS8zMCA9IDE1LzMwID0gIDEvMiQuKSBUaGVyZWZvcmUsIHRoZSBwb3N0ZXJpb3IgcHJvYmFiaWxpdGllcyBhcmUgdGhlIHZhbHVlcyBmcm9tIHRoZSBmb3VydGggY29sdW1uIGRpdmlkZWQgYnkgJDEvMiQgKGVxdWl2YWxlbnRseSwgbXVsdGlwbGllZCBieSAyKS4KCgokXHRoZXRhJCB8ICRwKFx0aGV0YSkkIHwgJHAoeCBcbWlkIFx0aGV0YSkkIHwgJHAoXHRoZXRhKSBwKHggXG1pZCBcdGhldGEpJCB8ICRwKFx0aGV0YSBcbWlkIHgpJCB8Ci0tLS0tLS0tfC0tLS0tLS18LS0tLS0tLXwtLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKMCAgICAgICB8IDEvNiAgIHwgMCAgICAgfCAwICAgICB8ICgwKS8oMS8yKSA9ICAqKjAqKiAgICAgICAgfAoxICAgICAgIHwgMS82ICAgfCAxLzUgICB8IDEvMzAgIHwgKDEvMzApLygxLzIpID0gICoqMS8xNSoqICB8CjIgICAgICAgfCAxLzYgICB8IDIvNSAgIHwgMi8zMCAgfCAoMi8zMCkvKDEvMikgPSAgKioyLzE1KiogIHwKMyAgICAgICB8IDEvNiAgIHwgMy81ICAgfCAzLzMwICB8ICgzLzMwKS8oMS8yKSA9ICAqKjMvMTUqKiAgfAo0ICAgICAgIHwgMS82ICAgfCA0LzUgICB8IDQvMzAgIHwgKDQvMzApLygxLzIpID0gICoqNC8xNSoqICB8CjUgICAgICAgfCAxLzYgICB8IDUvNSAgIHwgNS8zMCAgfCAoNS8zMCkvKDEvMikgPSAgKio1LzE1KiogIHwKCkFzIGEgc2FuaXR5IGNoZWNrLCB0aGUgbGFzdCBjb2x1bW4gc2hvdWxkIGFkZCB1cCB0byAxIHNpbmNlIHJlcHJlc2VudHMgYSBwcm9iYWJpbGl0eSBmdW5jdGlvbi4KClRoZSBpbnRlcnByZXRhdGlvbiBvZiB0aGUgbGFzdCBjb2x1bW4gaXMgdGhhdCwgZ2l2ZW4gb3VyIHByaW9yIHVuZGVyc3RhbmRpbmcgb2YgdGhlIHNpdHVhdGlvbiAoaW4gdGhpcyBjYXNlLCByZWFsbHkgbm8gcHJpb3IgaW5mb3JtYXRpb24pIGFuZCBnaXZlbiBhIGRhdGEgb2JzZXJ2YXRpb24gb2Ygb25lIHJlZCBiYWxsLCB3ZSBjYW4gbm93IGFzc2VydCBvdXIgYmVsaWVmcyBhYm91dCB0aGUgdW5zZWVuIGJhbGxzIGxlZnQgaW4gdGhlIHVybi4gUGVyaGFwcyB3ZSBnb3QgbHVja3kgYW5kIGNob3NlIHRoZSBvbmx5IHJlZCBiYWxsIGluIHRoZXJlLiBUaGVyZSBpcyBhICQxLzE1JCBjaGFuY2Ugb2YgdGhhdC4gTWF5YmUgYWxsIHRoZSBiYWxscyB3ZXJlIHJlZC4gVGhlcmUgaXMgYSAkMS8zJCAoJDUvMTUkKSBjaGFuY2Ugb2YgdGhhdC4gRG9uJ3QgY29uZnVzZSB0aGlzIHdpdGggdGhlIGxpa2VsaWhvb2Q6ICppZiogeW91IGFzc3VtZSBhbGwgdGhlIGJhbGxzIGFyZSByZWQsIHRoZW4gdGhlcmUgaXMsIG9mIGNvdXJzZSwgYSAxMDAlIGNoYW5jZSBvZiBwdWxsaW5nIG91dCBhIHJlZCBiYWxsLiBUaGF0J3Mgbm90IHdoYXQgd2UncmUgc2F5aW5nLiBBIHBvc3RlcmlvciBwcm9iYWJpbGl0eSBvZiAkMS8zJCBtZWFucyB0aGF0IHdlIHRoaW5rIHRoZXJlJ3MgYSByZWFzb25hYmx5IGdvb2QgY2hhbmNlIHRoYXQgb3VyIGRyYXcgZ2F2ZSB1cyBldmlkZW5jZSBvZiBhbiB1cm4gZnVsbCBvZiBhbGwgcmVkIGJhbGxzLCBhcyBvcHBvc2VkIHRvIG90aGVyIHBvc3NpYmxlIHNjZW5hcmlvcyBpbiB3aGljaCB0aGVyZSBhcmUgb25seSwgc2F5IDQgcmVkIGJhbGxzLCBvciAzIHJlZCBiYWxscywgZXRjLiBXZSdyZSBwbGFjaW5nIHdhZ2VycyBvbiB0aGUgcXVlc3Rpb24sICJIb3cgbWFueSByZWQgYmFsbHMgYXJlIHRoZXJlPyIgYW5kIGRpc3RyaWJ1dGluZyBwcm9iYWJpbGl0eSBhY3Jvc3MgYWxsIHRoZSBwb3NzaWJsZSBhbnN3ZXJzIHRvIHRoYXQgcXVlc3Rpb24uCgpXZSBjYW4gcGxvdCB0aGUgcG9zdGVyaW9yIHByb2JhYmlsaXR5IGRpc3RyaWJ1dGlvbiBhcyBmb2xsb3dzLiBGaXJzdCwgd2Ugc3RvcmUgdGhlIHZhbHVlcyBvZiB0aGUgcGFyYW1ldGVyIGFuZCB0aGUgcG9zdGVyaW9yIHByb2JhYmlsaXR5IGluIGEgZGF0YSBmcmFtZToKCmBgYHtyfQp0aGV0YSA8LSAwOjUKcG9zdF9wcm9iIDwtIGMoMCwgMS8xNSwgMi8xNSwgMy8xNSwgNC8xNSwgNS8xNSkKcGxvdF9kZiA8LSBkYXRhLmZyYW1lKHRoZXRhLCBwb3N0X3Byb2IpCnBsb3RfZGYKYGBgCgpUaGVuIHdlIGNyZWF0ZSBhICJsb2xsaXBvcCIgcGxvdCAod2hpY2ggaXMgY29tbW9uIGZvciBwcm9iYWJpbGl0eSBtYXNzIGZ1bmN0aW9ucykuCgpgYGB7cn0KbGlicmFyeShnZ3Bsb3QyKQpnZ3Bsb3QocGxvdF9kZiwgYWVzKHkgPSBwb3N0X3Byb2IsIHggPSB0aGV0YSkpICsKICAgIGdlb21fcG9pbnQoKSArCiAgICBnZW9tX3NlZ21lbnQoYWVzKHkgPSAwLCB5ZW5kID0gcG9zdF9wcm9iLCB4ID0gdGhldGEsIHhlbmQgPSB0aGV0YSkpICsKICAgIGxhYnMoeCA9IGV4cHJlc3Npb24odGhldGEpLAogICAgICAgICB5ID0gIlBvc3RlcmlvciBwcm9iYWJpbGl0eSIpCmBgYAoKSW4gZmFjdCwgdG8gbWFrZSB0aGluZ3MgZXZlbiBlYXNpZXIgaW4gdGhlIGZ1dHVyZSwgbGV0J3MganVzdCB3cml0ZSBhIHF1aWNrIGFuZCBkaXJ0eSBmdW5jdGlvbiB0aGF0IHRha2VzIHRoZSBwYXJhbWV0ZXIgdmFsdWVzLCB0aGUgcHJpb3IsIGFuZCB0aGUgbGlrZWxpaG9vZCBhcyBpbnB1dCB2ZWN0b3JzLCB0aGVuIGNhbGN1bGF0ZXMgdGhlIHBvc3RlcmlvciBhbmQgcGxvdHMgaXQuCgpgYGB7cn0KYmF5ZXNfcGxvdF9kaXNjcmV0ZSA8LSBmdW5jdGlvbih0aGV0YSwgcHJpb3IsIGxpa2VsaWhvb2QpIHsKICAgICMgQ2FsY3VsYXRlIHBvc3RlcmlvciB1c2luZyBCYXllcydzIFRoZW9yZW0KICAgIHBvc3RfcHJvYiA8LSBwcmlvciAqIGxpa2VsaWhvb2QgLyAoIHN1bShwcmlvciAqIGxpa2VsaWhvb2QpICkKICAgIAogICAgIyBHYXRoZXIgYWxsIHZhcmlhYmxlcyBpbnRvIGEgZGF0YSBmcmFtZQogICAgcGxvdF9kZiA8LSBkYXRhLmZyYW1lKHRoZXRhLCBwb3N0X3Byb2IpCiAgICAKICAgICNDcmVhdGUgbG9sbGlwb3AgcGxvdAogICAgcG9zdGVyaW9yX3Bsb3QgPC0KICAgICAgICBnZ3Bsb3QocGxvdF9kZiwgYWVzKHkgPSBwb3N0X3Byb2IsIHggPSB0aGV0YSkpICsKICAgICAgICAgICAgZ2VvbV9wb2ludCgpICsKICAgICAgICAgICAgZ2VvbV9zZWdtZW50KGFlcyh5ID0gMCwgeWVuZCA9IHBvc3RfcHJvYiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4ID0gdGhldGEsIHhlbmQgPSB0aGV0YSkpICsKICAgICAgICAgICAgbGFicyh4ID0gZXhwcmVzc2lvbih0aGV0YSksCiAgICAgICAgICAgICAgICAgeSA9ICJQb3N0ZXJpb3IgcHJvYmFiaWxpdHkiKQogICAgCiAgICAjIFByaW50IHBsb3QKICAgIHBvc3Rlcmlvcl9wbG90Cn0KYGBgCgpMZXQncyB0ZXN0IG91dCB0aGUgZnVuY3Rpb24uIFdlJ3ZlIGFscmVhZHkgZGVmaW5lZCBgdGhldGFgLCBzbyB3ZSBqdXN0IG5lZWQgdmFsdWVzIGZvciB0aGUgcHJpb3IgYW5kIGxpa2VsaWhvb2QuCgpgYGB7cn0KcHJpb3IgPC0gcmVwKDEvNiwgNikKbGlrZWxpaG9vZDEgPC0gYygwLCAxLzUsIDIvNSwgMy81LCA0LzUsIDUvNSkKYmF5ZXNfcGxvdF9kaXNjcmV0ZSh0aGV0YSA9IHRoZXRhLCBwcmlvciA9IHByaW9yLCBsaWtlbGlob29kID0gbGlrZWxpaG9vZDEpCmBgYAoKCiMjIFByb2JsZW0gMgoKR2l2ZW4gdGhlIHNhbWUgc2V0dXAgYXMgUHJvYmxlbSAxIChhbiB1cm4gd2l0aCBmaXZlIGJhbGxzIGFuZCBhIHVuaWZvcm0gcHJpb3Igb24gdGhlIHRvdGFsIG51bWJlciBvZiByZWQgYmFsbHMpLCB3aGF0IGlmIHlvdSBwdWxsIG91dCB0d28gcmVkIGJhbGxzPyBOb3cgd2hhdCBpcyB0aGUgcG9zdGVyaW9yIHByb2JhYmlsaXR5IGRpc3RyaWJ1dGlvbj8KCiMjIyBGaXJzdCBzb2x1dGlvbgoKVGhlIHN5bWJvbCAkeCQgd2lsbCBub3cgcmVwcmVzZW50IHR3byByZWQgYmFsbHMuCgpBbGwgdGhhdCBjaGFuZ2VzIGhlcmUgaXMgdGhlIGxpa2VsaWhvb2QuIE5vdGUgdGhhdCAkXHRoZXRhID0gMCQgYW5kICRcdGhldGEgPSAxJCBtYWtlIGl0IGltcG9zc2libGUgdG8gcHVsbCBvdXQgdHdvIHJlZCBiYWxscy4KCklmICRcdGhldGEgPSAyJCwgdGhlbiB0aGVyZSBpcyBhICQyLzUkIGNoYW5jZSBvZiByZWQgb24gdGhlIGZpcnN0IGRyYXcuIFRoZW4sIHdpdGggb25lIHJlbWFpbmluZyByZWQgYmFsbCBsZWZ0IGluIHRoZSB1cm4sIHRoZXJlIGlzIGEgJDEvNCQgY2hhbmNlIG9mIGRyYXdpbmcgdGhlIHNlY29uZCByZWQgYmFsbC4KCiQkcCh4IFxtaWQgXHRoZXRhID0gMikgPSAoMi81KSgxLzQpID0gMS8xMCQkCgooVG8gbWFrZSB0aGUgY2FsY3VsYXRpb25zIGVhc2llciwgd2UnbGwgc2ltcGxpZnkgZnJhY3Rpb25zIHRoaXMgdGltZS4pCgpUaGUgcmVtYWluaW5nIGNhbGN1bGF0aW9ucyBhcmUgc2ltaWxhcjoKCiQkcCh4IFxtaWQgXHRoZXRhID0gMykgPSAoMy81KSgyLzQpID0gMy8xMCQkCiQkcCh4IFxtaWQgXHRoZXRhID0gNCkgPSAoNC81KSgzLzQpID0gNi8xMCQkCiQkcCh4IFxtaWQgXHRoZXRhID0gNSkgPSAoNS81KSg0LzQpID0gMSQkCgpIZXJlJ3MgdGhlIGZ1bGwgdGFibGUgd2l0aCBhbGwgdGhlIGNhbGN1bGF0aW9uczoKCiRcdGhldGEkIHwgJHAoXHRoZXRhKSQgfCAkcCh4IFxtaWQgXHRoZXRhKSQgfCAkcChcdGhldGEpIHAoeCBcbWlkIFx0aGV0YSkkIHwgJHAoXHRoZXRhIFxtaWQgeCkkIHwKLS0tLS0tLS18LS0tLS0tLXwtLS0tLS0tfC0tLS0tLS18LS0tLS0tLS0tLS18CjAgICAgICAgfCAxLzYgICB8IDAgICAgIHwgMCAgICAgfCAqKjAqKiAgICAgfAoxICAgICAgIHwgMS82ICAgfCAwICAgICB8IDAgICAgIHwgKiowKiogICAgIHwKMiAgICAgICB8IDEvNiAgIHwgMS8xMCAgfCAxLzYwICB8ICoqMS8yMCoqICB8CjMgICAgICAgfCAxLzYgICB8IDMvMTAgIHwgMS8yMCAgfCAqKjMvMjAqKiAgfAo0ICAgICAgIHwgMS82ICAgfCA2LzEwICB8IDEvMTAgIHwgKiozLzEwKiogIHwKNSAgICAgICB8IDEvNiAgIHwgMSAgICAgfCAxLzYgICB8ICoqMS8yKiogICB8CgooSW4gY2FzZSB5b3UgZ2V0IGxvc3QgYmV0d2VlbiB0aGUgZm91cnRoIGFuZCBmaWZ0aCBjb2x1bW5zLCByZW1lbWJlciB0aGF0IHdlIGhhdmUgdG8gc3VtIHRoZSBmb3VydGggY29sdW1uIHRvIGdldCB0aGUgc2NhbGluZyBmYWN0b3IuIEV2ZXJ5IGVudHJ5IGluIHRoZSBmb3VydGggY29sdW1uIGlzIGRpdmlkZWQgYnkgJDEvNjAgKyAxLzIwICsgMS8xMCArIDEvNiA9ICAxLzMkIHRvIGdldCB0aGUgY29ycmVzcG9uZGluZyBlbnRyaWVzIGluIHRoZSBsYXN0IGNvbHVtbi4pCgpXZSBjYW4gcGxvdCB0aGlzIHVzaW5nIG91ciBgYmF5ZXNfcGxvdF9kaXNjcmV0ZWAgZnVuY3Rpb24uIFRoZSBwYXJhbWV0ZXIgdmFsdWVzIGFuZCB0aGUgcHJpb3IgYXJlIHRoZSBzYW1lIGFzIGJlZm9yZSwgc28gd2Ugb25seSBuZWVkIHRvIHVzZSB0aGUgbmV3IGxpa2VsaWhvb2QgZnVuY3Rpb24uCgpgYGB7cn0KbGlrZWxpaG9vZDIgPC0gYygwLCAwLCAxLzEwLCAzLzEwLCA2LzEwLCAxKQpiYXllc19wbG90X2Rpc2NyZXRlKHRoZXRhID0gdGhldGEsIHByaW9yID0gcHJpb3IsIGxpa2VsaWhvb2QgPSBsaWtlbGlob29kMikKYGBgCgoKIyMjIFNlY29uZCBzb2x1dGlvbgoKQmF5ZXMncyBUaGVvcmVtIHdvcmtzICpzZXF1ZW50aWFsbHkqLiBXaGF0IHRoaXMgbWVhbnMgaXMgdGhhdCB3ZSBjYW4gZ2F0aGVyIHNvbWUgZGF0YSAobGlrZSB0aGUgZmlyc3QgcmVkIGJhbGwpIGFuZCBnZXQgYSBwb3N0ZXJpb3IgZGlzdHJpYnV0aW9uLiBUaGVuLCB3aGVuIHdlIGdldCBtb3JlIGRhdGEgKHRoZSBzZWNvbmQgcmVkIGJhbGwpLCB3ZSBjYW4gYXNzdW1lIHdlJ3ZlIGFscmVhZHkgb2J0YWluZWQgdGhlIGVhcmxpZXIgZGF0YS4gSW4gb3RoZXIgd29yZHMsIG91ciBwb3N0ZXJpb3IgYWZ0ZXIgdGhlIGZpcnN0IHJvdW5kIG9mIGRhdGEgY29sbGVjdGlvbiBiZWNvbWVzIG91ciBwcmlvciBmb3IgdGhlIG5leHQgcm91bmQuCgpUbyBpbGx1c3RyYXRlIGhvdyB0aGlzIHdvcmtzLCBmaXJzdCB3b3JrIG91dCB0aGUgbGlrZWxpaG9vZCBmdW5jdGlvbiBmb3IgZHJhd2luZyBvbmUgcmVkIGJhbGwgZnJvbSBhbiB1cm4gd2l0aCAqZm91ciogYmFsbHMuIE5vdyAkXHRoZXRhJCBjYW4gdGFrZSB2YWx1ZXMgZnJvbSAwIHRocm91Z2ggNC4KCiQkcCh4IFxtaWQgXHRoZXRhID0gMCkgPSAwJCQKJCRwKHggXG1pZCBcdGhldGEgPSAxKSA9IDEvNCQkCiQkcCh4IFxtaWQgXHRoZXRhID0gMikgPSAyLzQkJAokJHAoeCBcbWlkIFx0aGV0YSA9IDMpID0gMy80JCQKJCRwKHggXG1pZCBcdGhldGEgPSA0KSA9IDQvNCQkCgpOb3cgd2UgY29weSB0aGUgcG9zdGVyaW9yIGZyb20gUHJvYmxlbSAxIGludG8gdGhlIHByaW9yIGNvbHVtbiBoZXJlLiBXZSBhY2NvdW50IGZvciB0aGUgcHJvYmFiaWxpdGllcyBhZnRlciB0aGUgZmlyc3QgZHJhdyBieSBzdGFydGluZyB3aXRoIHRob3NlIGFzIG91ciBuZXcgZGlzdHJpYnV0aW9uIHByaW9yIHRvIHRoZSBzZWNvbmQgZHJhdy4gVGhlbiB3ZSBmaWxsIG91dCB0aGUgcmVzdCBvZiB0aGUgdGFibGUgZXhjZXB0IHRoYXQgd2UgaWdub3JlIHRoZSB6ZXJvIHJvdyBmcm9tIFByb2JsZW0gMS4gKElmIHdlIGhhZCBubyByZWQgYmFsbHMgZm9yIHRoZSBmaXJzdCBkcmF3LCB3ZSBuZXZlciB3b3VsZCBhcnJpdmUgaGVyZSBhdCB0aGUgc2Vjb25kIGRyYXcuKSBBbHNvLCB3ZSBoYXZlIHNoaWZ0ZWQgdGhlIHZhbHVlcyB1cCBvbmUgcm93LiBGb3IgZXhhbXBsZSwgaWYgdGhlcmUgd2VyZSB0aHJlZSByZWQgYmFsbHMgYW1vbmcgdGhlIG9yaWdpbmFsIGZpdmUgKCRcdGhldGEgPSAzJCksIHRoZW4gYWZ0ZXIgdGhlIGZpcnN0IGRyYXcsIHdlIHdvdWxkIGJlIGxvb2tpbmcgZm9yIHRoZSBwcm9iYWJpbGl0eSBhc3NvY2lhdGVkIHdpdGggdHdvIHJlZCBiYWxscyBhbW9uZyB0aGUgcmVtYWluaW5nIGZvdXIgKCRcdGhldGEgPSAyJCkuCgpOb3RlIHRoYXQgdGhlIHNjYWxpbmcgZmFjdG9yIGlzICQxLzMwICsgMS8xMCArIDEvNSArIDEvMyA9IDIvMyQuCgokXHRoZXRhJCB8ICRwKFx0aGV0YSkkIHwgJHAoeCBcbWlkIFx0aGV0YSkkIHwgJHAoXHRoZXRhKSBwKHggXG1pZCBcdGhldGEpJCB8ICRwKFx0aGV0YSBcbWlkIHgpJCB8Ci0tLS0tLS0tfC0tLS0tLS18LS0tLS0tLXwtLS0tLS0tfC0tLS0tLS0tLS0tfAowICAgICAgIHwgMS8xNSAgfCAwICAgICB8IDAgICAgIHwgKiowKiogICAgIHwKMSAgICAgICB8IDIvMTUgIHwgMS80ICAgfCAxLzMwICB8ICoqMS8yMCoqICB8CjIgICAgICAgfCAzLzE1ICB8IDIvNCAgIHwgMS8xMCAgfCAqKjMvMjAqKiAgfAozICAgICAgIHwgNC8xNSAgfCAzLzQgICB8IDEvNSAgIHwgKiozLzEwKiogIHwKNCAgICAgICB8IDUvMTUgIHwgNC80ICAgfCAxLzMgICB8ICoqMS8yKiogICB8CgpUaGlzIGlzIHRoZSBzYW1lIGFzIHRoZSBmaXJzdCBzb2x1dGlvbiAoZXhjZXB0IHRoZSBvbmUgbWlzc2luZyByb3cgd2l0aCB6ZXJvIHByb2JhYmlsaXR5KS4KCgojIyBQcm9ibGVtIDMKCk5vdyBzdXBwb3NlIHdlIGRyYXcgdGhlIGJhbGxzIGZyb20gdGhlIHVybiAqd2l0aCByZXBsYWNlbWVudCosIG1lYW5pbmcgdGhhdCB3ZSBkcmF3IHRoZSBiYWxsLCB0aGVuIHdlIHB1dCBpdCBiYWNrIGJlZm9yZSBkcmF3aW5nIGFnYWluLgoKSWYgd2UgZHJhdyB0d28gcmVkIGJhbGxzICp3aXRoIHJlcGxhY2VtZW50Kiwgd2hhdCBpcyB0aGUgcG9zdGVyaW9yIHByb2JhYmlsaXR5IGRpc3RyaWJ1dGlvbj8gKFdlJ2xsIHN0aWxsIGFzc3VtZSBhIHVuaWZvcm0gcHJpb3IuKQoKIyMjIFNvbHV0aW9uCgpTaW5jZSB0aGUgZHJhd3MgYXJlIG5vdyBpbmRlcGVuZGVudCAodGhlIGZpcnN0IGRyYXcgd2lsbCBubyBsb25nZXIgYWZmZWN0IHRoZSBzZWNvbmQgZHJhdyksIHRoZSBsaWtlbGlob29kIGNoYW5nZXMuIFNraXBwaW5nIG92ZXIgdGhlIGVhc3kgY2FzZSB3aGVyZSAkXHRoZXRhJCBpcyB6ZXJvLAoKJCRwKHggXG1pZCBcdGhldGEgPSAxKSA9ICgxLzUpKDEvNSkgPSAxLzI1JCQKCiQkcCh4IFxtaWQgXHRoZXRhID0gMikgPSAoMi81KSgyLzUpID0gNC8yNSQkCiQkcCh4IFxtaWQgXHRoZXRhID0gMykgPSAoMy81KSgzLzUpID0gOS8yNSQkCiQkcCh4IFxtaWQgXHRoZXRhID0gNCkgPSAoNC81KSg0LzUpID0gMTYvMjUkJAooVGhlIGNhc2UgJFx0aGV0YSA9IDUkIHNob3VsZCBhbHNvIGJlIG9idmlvdXMsIHJpZ2h0PykKCkhlcmUgaXMgdGhlIHRhYmxlLiBUaGUgc2NhbGluZyBmYWN0b3IgaXMgJDEvMTUwICsgMi83NSArIDMvNTAgKyA4Lzc1ICsgMS82ID0gMTEvMzA1JC4KCiRcdGhldGEkIHwgJHAoXHRoZXRhKSQgfCAkcCh4IFxtaWQgXHRoZXRhKSQgfCAkcChcdGhldGEpIHAoeCBcbWlkIFx0aGV0YSkkIHwgJHAoXHRoZXRhIFxtaWQgeCkkIHwKLS0tLS0tLS18LS0tLS0tLXwtLS0tLS0tfC0tLS0tLS18LS0tLS0tLS0tLS18CjAgICAgICAgfCAxLzYgICB8IDAgICAgIHwgMCAgICAgfCAqKjAqKiAgICAgfAoxICAgICAgIHwgMS82ICAgfCAxLzI1ICB8IDEvMTUwIHwgKioxLzU1KiogIHwKMiAgICAgICB8IDEvNiAgIHwgNC8yNSAgfCAyLzc1ICB8ICoqNC81NSoqICB8CjMgICAgICAgfCAxLzYgICB8IDkvMjUgIHwgMy81MCAgfCAqKjkvNTUqKiAgfAo0ICAgICAgIHwgMS82ICAgfCAxNi8yNSB8IDgvNzUgIHwgKioxNi81NSoqIHwKNSAgICAgICB8IDEvNiAgIHwgMSAgICAgfCAxLzYgICB8ICoqNS8xMSoqIHwKCkFnYWluLCBjaGVjayB0aGF0IHRoZSBmaW5hbCBjb2x1bW4gYWRkcyB0byAxLgoKV2UgcGxvdCB0aGUgcG9zdGVyaW9yIHByb2JhYmlsaXR5IG1hc3MgZnVuY3Rpb24gYXMgYmVmb3JlLgoKYGBge3J9Cmxpa2VsaWhvb2QzIDwtIGMoMCwgMS8yNSwgNC8yNSwgOS8yNSwgMTYvMjUsIDEpCmJheWVzX3Bsb3RfZGlzY3JldGUodGhldGEgPSB0aGV0YSwgcHJpb3IgPSBwcmlvciwgbGlrZWxpaG9vZCA9IGxpa2VsaWhvb2QzKQpgYGAKCgpXaHkgZG8geW91IHRoaW5rIHRoZSBwb3N0ZXJpb3IgcHJvYmFiaWxpdHkgb2YgJFx0aGV0YSA9IDUkIGhlcmUgaXMgc2xpZ2h0bHkgbGVzcyB0aGFuICQxLzIkIGV2ZW4gdGhvdWdoIGl0IHdhcyBleGFjdGx5ICQxLzIkIGluIFByb2JsZW0gMj8gSW4gb3RoZXIgd29yZHMsIHdoeSBkb2VzIHNhbXBsaW5nIHdpdGggcmVwbGFjZW1lbnQgbWFrZSB1cyBzbGlnaHRseSBsZXNzIGNvbmZpZGVudCBhYm91dCBsb3RzIG9mIHJlZCBiYWxscyB0aGFuIHNhbXBsaW5nIHdpdGhvdXQgcmVwbGFjZW1lbnQ/Cgo=