Topics
- Sample space, Random variable
- Probability mass/density function
- Cumulative distribution function
- Discrete distributions
- Uniform distribution
- Bernoulli distribution
- Binomial distribution
- Poisson distribution
- Multinomial distribution
- Continuous distributions
- Uniform distribution
- Exponential distribution
- Gamma distribution
- Normal (Gaussian) distribution
- Expectation
- Variance
- Law of large numbers
- Central limit theorem
Reference
- Wasserman (2004), Chapters 2, 3, and 5
Sample Space
Sample space \(\Omega\) is the set of possible outcomes.
examples: \(\Omega = \{H, T\}\) for a coin toss
\(\Omega = \{HH, HT, TH, TT\}\) for two coin tosses
Outcome \(\omega\): an element of sample space \(\Omega\)
- example: \(\omega=H\) for a coin toss
Event \(A\): subset of sample space \(\Omega\)
- example: \(\Omega = \{HT, TH\}\) for tow coin tosses
Probability \(P(A)\) of an event \(A\) represents the frequency of observing \(A\)
Random Variable
Random variable \(X\) is a mapping from each outcome \(\omega\in\Omega\) to a real number
Probability for a random variable for the events that give the value:
- $P(X=1) = P({HT,TH}) = 1/2$
- $P(X\le 1) = P({TT,HT,TH}) = 3/4$
In general:
- \(P(X=x) = P(\omega\in\Omega; X(\omega)=x)\)
- \(P(X\in A) = P(\omega\in\Omega; X(\omega)=A)\)
Probability function (or probability mass function)
p = 0.3
x = 0:2
f = c((1-p)^2, 2*p*(1-p), p^2)
plot(x, f, type="h", lwd=3, ylim=c(0, 1)) # "h" for histogram-like

Probability density function (PDF)
Probability density function:
x = seq(-0.5, 1.5, 0.01)
f = dunif(x, 0, 1)
plot(x, f, type="l")

Cumulative distribution function (CDF)
Inverse CDF (or quantile function)
p = 0.5
f = c((1-p)^2, 2*p*(1-p), p^2)
# CDF
F = rep( c(0, cumsum(f)), each=2)
x = c(-1, rep(0:2, each=2), 3)
par(mfrow=c(1, 2)) # side by side
plot(x, F, type="l")
# Inverse CDF
plot(F, x, type="l", xlab="q", ylab="x=F^-1(q)")

- Example: Uniform distribution in \([0,1]\)
x = seq(-0.5, 1.5, 0.01)
# CDF
F = punif(x, 0, 1)
par(mfrow=c(1, 2)) # side by side
plot(x, F, type="l")
# Inverse CDF
plot(F, x, type="l", xlab="q", ylab="x=F^-1(q)")

Discrete Random Variables
\(X \sim F\) means \(X\) has distribution \(F\)
Bernoulli Distribution
\[X \sim \mbox{Bernoulli}(p)\]
- coin toss with the probability of head \(p\)
\[P(X=1) = p\] \[P(X=0) = 1-p\]
The probability (mass) function can be represented as: \[f(x) = p^x(1-p)^{1-x}\]
p = 0.3
x = 0:1
f = p^x * (1-p)^(1-x) # = c(1-p, p)
plot(x, f, type="h", lwd=3, ylim=c(0,1))

Binomial Distribution
\[X \sim \mbox{Binomial}(n, p)\]
- number of heads in \(n\) coin tosses the probability of head \(p\)
\[f(x) = {n \choose x} p^x(1-p)^{n-x}\] \({n \choose x}=\frac{n!}{x!(n-x)!}\): the number of ways choosing \(x\) items out of \(n\).
n = 5
p = 0.6
x = 0:n
f = choose(n,x) * p^x * (1-p)^(n-x)
#f = dbinom(x, n, p)
plot(x, f, type="h", lwd=3, ylim=c(0,1))

Probability distributions in R
Most popular distributions are available with the convention:
d...()
: probability density or mass function
p...()
: CDF
q...()
: Quantile function (inverse CDF)
r...()
: draw samples
# binomial distribution
n = 5
p = 0.3
par(mfcol=c(2,2)) # in 2x2 grid
# mass function
x = 0:n
plot(x, dbinom(x, n, p), type="h", lwd=3, ylim=c(0,1))
# CDF
x = seq(0, n, 0.05)
plot(x, pbinom(x, n, p), type="l")
# Quantile function
q = seq(0, 1, 0.01)
plot(q, qbinom(q, n, p), type="l")
# draw samples
plot(rbinom(100, n, p))

Poisson Disbribution
\[X \sim \mbox{Poisson}(\lambda)\]
- count of events that occur at average rate \(\lambda\)
\[f(x) = e^{-\lambda} \frac{\lambda^x}{x!}\]
lambda = 2
x = 0:10
f = dpois(x, lambda)
plot(x, f, type="h", lwd=3, ylim=c(0,1))

Multinomial distribution
\[X \sim \mbox{Multinomial}(n,p)\]
- For \(k\) possible outcomes with probabiliies \(p=(p_1,..,p_k)\), number of each outcome after \(n\) draws \(X=(X_1,...,X_k)\)
\[f(x) = {n \choose x_1...x_k} p_1^{x_1}...p_k^{x_k}\] \({n \choose x_1...x_k} = \frac{n!}{x_1!...x_k!}\)
p = c(0.4, 0.5, 0.1) # k=3
n = 10
dmn <-function(x1, x2){
if(x1+x2 > n){
return(0) # cannot happen
}else{
x = c(x1, x2, n-x1-x2) # sum up to n
return(dmultinom(x, prob=p))
}
}
x1 = x2 = 0:n
f = outer(x1, x2, Vectorize(dmn))
persp(x1, x2, f, theta=60)

Continuous Random Variables
Exponential Distribution
\[X \sim \mbox{Exp}(\lambda)\]
- Interval of events happening at rate \(\lambda\)
\[f(x) = \lambda e^{-\lambda x}\]
Defined for \(x \ge 0\) and \(\lambda > 0\).
lambda = .5
x = seq(-5, 10, 0.1)
f = dexp(x, lambda)
plot(x, f, type="l")

It is sometimes parameterized by \(\beta = \frac{1}{\lambda}\).
Gamma Distribution
\[X \sim \mbox{Gamma}(a,b)\]
Sum of \(a\) independent samples from Exp(\(b\))
\[f(x) = \frac{b^a}{\Gamma(a)} x^{a-1} e^{-bx}\] where the “Gamma function” is defined as \[\Gamma(a) =\int_0^\infty t^{a-1}e^{-t}dt\] For integer values of \(a\), \(\Gamma(a)=a!\).
a = 1 # same as exp
b = 1
x = seq(-2, 10, 0.01)
f = dgamma(x, a, b)
plot(x, f, type="l")
for (a in 2:6){ # see the change with a
lines(x, dgamma(x, a, b), col=a)
}

For independent random variables \(X_i \sim \mbox{Gamma}(a_i,b)\), \[\sum_{i=1}^n X_i \sim \mbox{Gamma}(\sum_{i=1}^n a_i, b)\]
Normal (Gaussian) Distribution
\[X \sim \mathcal{N}(\mu,\sigma)\] mean \(\mu\) and standard deviation \(\sigma\)
\[f(x) = \frac{1}{\sigma\sqrt{2\pi}} e^{-\frac{(x-\mu)^2}{2\sigma^2}}\]
x = seq(-5, 5, 0.1)
f = dnorm(x) # default: mu=0, sigma=1
plot(x, f, type="l")

Expectation
Expectation (or mean, or first moment) of random variable \(X\):
\[E(X) = \int x dF(x)\]
\[E(X) = \sum_x x f(x)\]
\[E(X) = \int_{-\infty}^{\infty} x f(x) dx\]
Expectation is often denoted as \(E(X)=\mu_X=\mu\).
Properties of Expectations
- Expectation of a function \(Y=r(X)\):
\[E(Y) = E(r(X)) = \int r(x)dF_X(x)\]
\[E(\sum_i a_i X_i) =\sum_i a_i E(X_i)\]
- Product of independent random variables:
\[E(\prod_i X_i) =\prod_i E(X_i)\]
Variance
Variance is a measure of the spread of a distribution.
- Variance \(V(X)=\sigma_X^2=\sigma^2\) for a random variable \(X\) with the mean \(\mu\):
\[V(X) = E((X-\mu)^2) = \int(x-\mu)^2 dF(x)\]
\[V(\sum_i a_i X_i) =\sum_i a_i^2 V(X_i)\]
Limit Theory
- Probability theory allows us to predict what happens when we gather a large sample.
The Law of Large Numbers
The sample average \(\bar{X}_n=\frac{1}{n}\sum_{i=1}^n X_i\) converges in probability to the expectation \(\mu=EE(X_i)\).
- \(X_n\) converges to \(X\) in probability
\[X_n\stackrel{P}{\rightarrow}X\]
For every \(\epsilon>0\), as \(n\rightarrow\infty\), \[P(|X_n-X|>\epsilon)\rightarrow 0\]
The Central Limit Theorem
For any distribution of \(X\) with mean \(\mu\) and variance \(\sigma^2\), the distribution of sample averages \(X_n\) follows a Normal distribution \(\mathcal{N}(\mu,\frac{\sigma^2}{n})\)
Deviation of the sample average from the true mean, scaled by \(n\) as \(\sqrt{n}(\bar{X}_n-\mu)\), converges in distribution to a Normal distribution \(\mathcal{N}(0,\sigma^2)\).
\(X_n\) converges to \(X\) in distribution
\[X_n\leadsto X\]
The cumulative distribution function \(F_n(X_n)\) converges to \(F(X)\) at every point \(x\) where \(F\) is continuous. \[\lim_{n\rightarrow\infty}F_n(x)=F(x)\]
Exercise
1. PDF and CDF
- For an exponential distribution, plot the PDF, CDF and inverse CDF (quantile function) by
dexp
, pexp
and qexp
.
- Derive the mathematical form of the CDF of the exponential distribution from its PDF \[f(x) = \lambda e^{-\lambda x}\]
and compare with the plot above.
- Derive the mathematical form of the inverse CDF (quantile function) of the exponential distribution
and compare with the plot above.
2. Relationships between distributions
- Make a sample by summing samples from Bernoulli distribution. Plot its histgram and chek if that fits with the Binomial distribution give by
dbinom()
.
- By taking \(n\) large and scaling \(p\) by \(\frac{1}{n}\) in Binomial distribution, see if the distribution comes close to Poisson distribution
- Draw a sequence of samples from a Bernoulli distribution with small \(p\). Make a histogram of the time intervals between 1s and see what distribution it follows.
- Divide the above sequence into time bins of length \(T\) and count 1s in each bin. What distribution does it follow?
- By summing up multiple samples from exponential distribution, check whether that follows Gamma distribution.
- See in what case Gamma distribution become close to the normal distribution.
3. Expectation and Variance
*is optional for those with mathematical background
Derive the mean and the variance of Bernoulli distribution.
Derive the mean and the variance of Binomial distribution.
Drive the mean and the variance of uniform distribution.
4*) Compute the mean of the exponential distribution from PDF: \[E(X) = \int_0^\infty x f(x) dx\]
5*) Compute the mean of the exponential distribution from CDF: \[E(X) = \int x dF(x) = \int_0^1 F^{-1}(q) dq\]
6*) Derive the variance of the exponential distribution.
- Derive the mean and the variance of Gamma distribution as a sum of the samples from exponential distribution.
LS0tCnRpdGxlOiAiMi4gUHJvYmFiaWxpdHkgRGlzdHJpYnV0aW9ucyIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKIyBUb3BpY3MKCiogU2FtcGxlIHNwYWNlLCBSYW5kb20gdmFyaWFibGUKKiBQcm9iYWJpbGl0eSBtYXNzL2RlbnNpdHkgZnVuY3Rpb24KKiBDdW11bGF0aXZlIGRpc3RyaWJ1dGlvbiBmdW5jdGlvbgoqIERpc2NyZXRlIGRpc3RyaWJ1dGlvbnMKICAgICogVW5pZm9ybSBkaXN0cmlidXRpb24KICAgICogQmVybm91bGxpIGRpc3RyaWJ1dGlvbgogICAgKiBCaW5vbWlhbCBkaXN0cmlidXRpb24KICAgICogUG9pc3NvbiBkaXN0cmlidXRpb24KICAgICogTXVsdGlub21pYWwgZGlzdHJpYnV0aW9uCiogQ29udGludW91cyBkaXN0cmlidXRpb25zCiAgICAqIFVuaWZvcm0gZGlzdHJpYnV0aW9uCiAgICAqIEV4cG9uZW50aWFsIGRpc3RyaWJ1dGlvbgogICAgKiBHYW1tYSBkaXN0cmlidXRpb24KICAgICogTm9ybWFsIChHYXVzc2lhbikgZGlzdHJpYnV0aW9uCiogRXhwZWN0YXRpb24KKiBWYXJpYW5jZQoqIExhdyBvZiBsYXJnZSBudW1iZXJzCiogQ2VudHJhbCBsaW1pdCB0aGVvcmVtCgojIyMjIFJlZmVyZW5jZQoKKiBXYXNzZXJtYW4gKDIwMDQpLCBDaGFwdGVycyAyLCAzLCBhbmQgNQoKIyMgU2FtcGxlIFNwYWNlCgpTYW1wbGUgc3BhY2UgJFxPbWVnYSQgaXMgdGhlIHNldCBvZiBwb3NzaWJsZSBvdXRjb21lcy4KCiogZXhhbXBsZXM6IFwoXE9tZWdhID0gXHtILCBUXH0gXCkgZm9yIGEgY29pbiB0b3NzCiAgICAKKiBcKFxPbWVnYSA9IFx7SEgsIEhULCBUSCwgVFRcfVwpIGZvciB0d28gY29pbiB0b3NzZXMKCk91dGNvbWUgJFxvbWVnYSQ6IGFuIGVsZW1lbnQgb2Ygc2FtcGxlIHNwYWNlICRcT21lZ2EkCgoqIGV4YW1wbGU6ICRcb21lZ2E9SCQgZm9yIGEgY29pbiB0b3NzICAKCkV2ZW50ICRBJDogc3Vic2V0IG9mIHNhbXBsZSBzcGFjZSAkXE9tZWdhJAoKKiBleGFtcGxlOiAkXE9tZWdhID0gXHtIVCwgVEhcfSQgZm9yIHRvdyBjb2luIHRvc3NlcyAgCgpQcm9iYWJpbGl0eSAkUChBKSQgb2YgYW4gZXZlbnQgJEEkIHJlcHJlc2VudHMgdGhlIGZyZXF1ZW5jeSBvZiBvYnNlcnZpbmcgJEEkCgoqIFByb2JhYmlsaXR5IGRpc3RyaWJ1dGlvbiAkUCQgaXMgYSBmdW5jdGlvbiB0aGF0IHNhdGlzZmllczoKCiAgICArICRQKEEpIFxnZSAwJCBmb3IgZXZlcnkgZXZlbnQgJEEkICAKICAgICsgJFAoXE9tZWdhKSA9IDEkICAKICAgICsgSWYgJEEkIGFuZCAkQiQgYXJlIGRpc2pvaW50LCAkUChBXGN1cCBCKSA9IFAoQSkgKyBQKEIpJAoKIyMgUmFuZG9tIFZhcmlhYmxlCgpSYW5kb20gdmFyaWFibGUgJFgkIGlzIGEgbWFwcGluZyBmcm9tIGVhY2ggb3V0Y29tZSAkXG9tZWdhXGluXE9tZWdhJCB0byBhIHJlYWwgbnVtYmVyCgoqIGV4YW1wbGU6ICRYJCBpcyB0aGUgbnVtYmVyIG9mIGhlYWRzIGluIHR3byBjb2luIHRvc3NlcwoKICAgIC0gJFgoXG9tZWdhKT0xJCBmb3IgYm90aCAkXG9tZWdhPUhUJCBhbmQgJFxvbWVnYT1USCQuCgpQcm9iYWJpbGl0eSBmb3IgYSByYW5kb20gdmFyaWFibGUgZm9yIHRoZSBldmVudHMgdGhhdCBnaXZlIHRoZSB2YWx1ZTogIAoKICAgIC0gJFAoWD0xKSA9IFAoe0hULFRIfSkgPSAxLzIkICAKICAgIC0gJFAoWFxsZSAxKSA9IFAoe1RULEhULFRIfSkgPSAzLzQkICAKCiogSW4gZ2VuZXJhbDoKCiAgICAtICRQKFg9eCkgPSBQKFxvbWVnYVxpblxPbWVnYTsgWChcb21lZ2EpPXgpJCAgCiAgICAtICRQKFhcaW4gQSkgPSBQKFxvbWVnYVxpblxPbWVnYTsgWChcb21lZ2EpPUEpJCAgCgojIyBQcm9iYWJpbGl0eSBmdW5jdGlvbiAob3IgcHJvYmFiaWxpdHkgbWFzcyBmdW5jdGlvbikKCiogRm9yIGRpc2NyZXRlIHJhZG9tIHZhcmlhYmxlOiAkZl9YKHgpPVAoWD14KSQKCiogRXhhbXBsZTogIyBvZiBoZWFkcyBpbiB0d28gY29pbiB0b3NzZXMKCmBgYHtyfQpwID0gMC4zCnggPSAwOjIKZiA9IGMoKDEtcCleMiwgMipwKigxLXApLCBwXjIpCnBsb3QoeCwgZiwgdHlwZT0iaCIsIGx3ZD0zLCB5bGltPWMoMCwgMSkpICAjICJoIiBmb3IgaGlzdG9ncmFtLWxpa2UKYGBgCgojIyBQcm9iYWJpbGl0eSBkZW5zaXR5IGZ1bmN0aW9uIChQREYpCgoqIEZvciBjb250aW51b3VzIHJhbmRvbSB2YXJpYWJsZSAkWCQuCgogICAgLSAkZl9YKHgpIFxnZSAwJCBmb3IgYWxsICR4JCAgCiAgICAtICRcaW50X3stXGluZnR5fV57XGluZnR5fSBmX1goeClkeCA9IDEkICAKICAgIAogICAgLSAkUChhPFg8YikgPSBcaW50X3thfV57Yn0gZl9YKHgpZHgkICAKCiogRXhhbXBsZTogIFVuaWZvcm0gZGlzdHJpYnV0aW9uIGluICRbMCwxXSQKClByb2JhYmlsaXR5IGRlbnNpdHkgZnVuY3Rpb246CmBgYHtyfQp4ID0gc2VxKC0wLjUsIDEuNSwgMC4wMSkKZiA9IGR1bmlmKHgsIDAsIDEpCnBsb3QoeCwgZiwgdHlwZT0ibCIpCmBgYAoKIyMgQ3VtdWxhdGl2ZSBkaXN0cmlidXRpb24gZnVuY3Rpb24gKENERikKCiogJEZfWCh4KT1QKFhcbGUgeCkkICAKCiogQ0RGIGlzIHJlbGF0ZWQgd2l0aCBQREYgYXM6CgogICAgLSAkRl9YKHgpID0gXGludF97LVxpbmZ0eX1ee3h9IGZfWCh4KWR4JCAgCiAgICAtICRmX1goeCkgPSBGJ19YKHgpJCB3aGVyZSAkRl9YJCBpcyBkaWZmZXJlbnRpYWJsZQoKKiBDREYgYWxsb3dzIGRlYWxpbmcgd2l0aCBkaXNjcmV0ZSBhbmQgY29udGludW91cyByYW5kb20gdmFyaWFibGVzIGluIGEgdW5pZmllZCB3YXkuCgojIyBJbnZlcnNlIENERiAob3IgcXVhbnRpbGUgZnVuY3Rpb24pCgoqICRGXnstMX0ocSkgPSBcaW5mXHt4OiBGKHgpPnFcfSQgCgoqIEV4YW1wbGU6ICMgb2YgaGVhZHMgaW4gdHdvIGNvaW4gdG9zc2VzCgpgYGB7cn0KcCA9IDAuNQpmID0gYygoMS1wKV4yLCAyKnAqKDEtcCksIHBeMikKIyBDREYKRiA9IHJlcCggYygwLCBjdW1zdW0oZikpLCBlYWNoPTIpCnggPSBjKC0xLCByZXAoMDoyLCBlYWNoPTIpLCAzKQpwYXIobWZyb3c9YygxLCAyKSkgICMgc2lkZSBieSBzaWRlIApwbG90KHgsIEYsIHR5cGU9ImwiKQojIEludmVyc2UgQ0RGCnBsb3QoRiwgeCwgdHlwZT0ibCIsIHhsYWI9InEiLCB5bGFiPSJ4PUZeLTEocSkiKQpgYGAKCiogRXhhbXBsZTogVW5pZm9ybSBkaXN0cmlidXRpb24gaW4gJFswLDFdJAoKYGBge3J9CnggPSBzZXEoLTAuNSwgMS41LCAwLjAxKQojIENERgpGID0gcHVuaWYoeCwgMCwgMSkKcGFyKG1mcm93PWMoMSwgMikpICAjIHNpZGUgYnkgc2lkZSAKcGxvdCh4LCBGLCB0eXBlPSJsIikKIyBJbnZlcnNlIENERgpwbG90KEYsIHgsIHR5cGU9ImwiLCB4bGFiPSJxIiwgeWxhYj0ieD1GXi0xKHEpIikKYGBgCgojIERpc2NyZXRlIFJhbmRvbSBWYXJpYWJsZXMKCiRYIFxzaW0gRiQgbWVhbnMgJFgkIGhhcyBkaXN0cmlidXRpb24gJEYkCgojIyBVbmlmb3JtIGRpc3RyaWJ1dGlvbiBvbiBpbnRlZ2VycyAkezEsLi4uLGt9JDoKCiQkZih4KSA9IFxmcmFjezF9e2t9JCQKCmBgYHtyfQprID0gNQp4ID0gMTprCmYgPSBtYXRyaXgoMS9rLCAxLCBrKQpwbG90KHgsIGYsIHR5cGU9ImgiLCBsd2Q9MywgeWxpbT1jKDAsMSkpCmBgYAoKIyMgQmVybm91bGxpIERpc3RyaWJ1dGlvbgoKJCRYIFxzaW0gXG1ib3h7QmVybm91bGxpfShwKSQkCgoqIGNvaW4gdG9zcyB3aXRoIHRoZSBwcm9iYWJpbGl0eSBvZiBoZWFkICRwJAoKJCRQKFg9MSkgPSBwJCQKJCRQKFg9MCkgPSAxLXAkJAoKVGhlIHByb2JhYmlsaXR5IChtYXNzKSBmdW5jdGlvbiBjYW4gYmUgcmVwcmVzZW50ZWQgYXM6CiQkZih4KSA9IHBeeCgxLXApXnsxLXh9JCQKYGBge3J9CnAgPSAwLjMKeCA9IDA6MQpmID0gcF54ICogKDEtcCleKDEteCkgICMgPSBjKDEtcCwgcCkKcGxvdCh4LCBmLCB0eXBlPSJoIiwgbHdkPTMsIHlsaW09YygwLDEpKQpgYGAKCiMjIEJpbm9taWFsIERpc3RyaWJ1dGlvbgoKJCRYIFxzaW0gXG1ib3h7Qmlub21pYWx9KG4sIHApJCQKCiogbnVtYmVyIG9mIGhlYWRzIGluICRuJCBjb2luIHRvc3NlcyB0aGUgcHJvYmFiaWxpdHkgb2YgaGVhZCAkcCQKCiQkZih4KSA9IHtuIFxjaG9vc2UgeH0gcF54KDEtcClee24teH0kJAoke24gXGNob29zZSB4fT1cZnJhY3tuIX17eCEobi14KSF9JDogdGhlIG51bWJlciBvZiB3YXlzIGNob29zaW5nICR4JCBpdGVtcyBvdXQgb2YgJG4kLgoKYGBge3J9Cm4gPSA1CnAgPSAwLjYKeCA9IDA6bgpmID0gY2hvb3NlKG4seCkgKiBwXnggKiAoMS1wKV4obi14KQojZiA9IGRiaW5vbSh4LCBuLCBwKQpwbG90KHgsIGYsIHR5cGU9ImgiLCBsd2Q9MywgeWxpbT1jKDAsMSkpCmBgYAoKIyMjIFByb2JhYmlsaXR5IGRpc3RyaWJ1dGlvbnMgaW4gUgoKTW9zdCBwb3B1bGFyIGRpc3RyaWJ1dGlvbnMgYXJlIGF2YWlsYWJsZSB3aXRoIHRoZSBjb252ZW50aW9uOgoKKiBgZC4uLigpYDogcHJvYmFiaWxpdHkgZGVuc2l0eSBvciBtYXNzIGZ1bmN0aW9uCiogYHAuLi4oKWA6IENERgoqIGBxLi4uKClgOiBRdWFudGlsZSBmdW5jdGlvbiAoaW52ZXJzZSBDREYpCiogYHIuLi4oKWA6IGRyYXcgc2FtcGxlcwoKYGBge3J9CiMgYmlub21pYWwgZGlzdHJpYnV0aW9uCm4gPSA1CnAgPSAwLjMKcGFyKG1mY29sPWMoMiwyKSkgICMgaW4gMngyIGdyaWQKIyBtYXNzIGZ1bmN0aW9uCnggPSAwOm4KcGxvdCh4LCBkYmlub20oeCwgbiwgcCksIHR5cGU9ImgiLCBsd2Q9MywgeWxpbT1jKDAsMSkpCiMgQ0RGCnggPSBzZXEoMCwgbiwgMC4wNSkKcGxvdCh4LCBwYmlub20oeCwgbiwgcCksIHR5cGU9ImwiKQojIFF1YW50aWxlIGZ1bmN0aW9uCnEgPSBzZXEoMCwgMSwgMC4wMSkKcGxvdChxLCBxYmlub20ocSwgbiwgcCksIHR5cGU9ImwiKQojIGRyYXcgc2FtcGxlcwpwbG90KHJiaW5vbSgxMDAsIG4sIHApKQpgYGAKCiMjIFBvaXNzb24gRGlzYnJpYnV0aW9uCgokJFggXHNpbSBcbWJveHtQb2lzc29ufShcbGFtYmRhKSQkCgoqIGNvdW50IG9mIGV2ZW50cyB0aGF0IG9jY3VyIGF0IGF2ZXJhZ2UgcmF0ZSAkXGxhbWJkYSQgCgokJGYoeCkgPSBlXnstXGxhbWJkYX0gXGZyYWN7XGxhbWJkYV54fXt4IX0kJAoKYGBge3J9CmxhbWJkYSA9IDIKeCA9IDA6MTAKZiA9IGRwb2lzKHgsIGxhbWJkYSkKcGxvdCh4LCBmLCB0eXBlPSJoIiwgbHdkPTMsIHlsaW09YygwLDEpKQpgYGAKCiMjIE11bHRpbm9taWFsIGRpc3RyaWJ1dGlvbgoKJCRYIFxzaW0gXG1ib3h7TXVsdGlub21pYWx9KG4scCkkJAoKKiBGb3IgJGskIHBvc3NpYmxlIG91dGNvbWVzIHdpdGggcHJvYmFiaWxpaWVzICRwPShwXzEsLi4scF9rKSQsCm51bWJlciBvZiBlYWNoIG91dGNvbWUgYWZ0ZXIgJG4kIGRyYXdzICRYPShYXzEsLi4uLFhfaykkCgokJGYoeCkgPSB7biBcY2hvb3NlIHhfMS4uLnhfa30gcF8xXnt4XzF9Li4ucF9rXnt4X2t9JCQKJHtuIFxjaG9vc2UgeF8xLi4ueF9rfSA9IFxmcmFje24hfXt4XzEhLi4ueF9rIX0kCgpgYGB7cn0KcCA9IGMoMC40LCAwLjUsIDAuMSkgICMgaz0zCm4gPSAxMApkbW4gPC1mdW5jdGlvbih4MSwgeDIpewogIGlmKHgxK3gyID4gbil7CiAgICByZXR1cm4oMCkgICMgY2Fubm90IGhhcHBlbgogIH1lbHNlewogICAgeCA9IGMoeDEsIHgyLCBuLXgxLXgyKSAgIyBzdW0gdXAgdG8gbgogICAgcmV0dXJuKGRtdWx0aW5vbSh4LCBwcm9iPXApKQogIH0KfQp4MSA9IHgyID0gMDpuCmYgPSBvdXRlcih4MSwgeDIsIFZlY3Rvcml6ZShkbW4pKQpwZXJzcCh4MSwgeDIsIGYsIHRoZXRhPTYwKQpgYGAKCiMgQ29udGludW91cyBSYW5kb20gVmFyaWFibGVzCgojIyBVbmlmb3JtIERpc3RyaWJ1dGlvbgoKJCRYIFxzaW0gXG1ib3h7VW5pZm9ybX0oYSxiKSQkCgokJGYoeCkgPSBcbGVmdFx7XGJlZ2lue2FycmF5fXtjbH0gXGZyYWN7MX17Yi1hfSAmIFxtYm94e2ZvciB9IHggXGluIFthLGJdXFwKMCAmIFxtYm94e290aGVyd2lzZX1cZW5ke2FycmF5fVxyaWdodC4kJAoKYGBge3J9CnggPSBzZXEoLTIsIDIsIDAuMDEpCmYgPSBkdW5pZih4LCAtMSwgMSkKcGxvdCh4LCBmLCB0eXBlPSJsIikKYGBgCgojIyBFeHBvbmVudGlhbCBEaXN0cmlidXRpb24KCiQkWCBcc2ltIFxtYm94e0V4cH0oXGxhbWJkYSkkJAoKKiBJbnRlcnZhbCBvZiBldmVudHMgaGFwcGVuaW5nIGF0IHJhdGUgJFxsYW1iZGEkCgokJGYoeCkgPSBcbGFtYmRhIGVeey1cbGFtYmRhIHh9JCQKCkRlZmluZWQgZm9yICR4IFxnZSAwJCBhbmQgJFxsYW1iZGEgPiAwJC4KCmBgYHtyfQpsYW1iZGEgPSAuNQp4ID0gc2VxKC01LCAxMCwgMC4xKQpmID0gZGV4cCh4LCBsYW1iZGEpCnBsb3QoeCwgZiwgdHlwZT0ibCIpCmBgYAoKSXQgaXMgc29tZXRpbWVzIHBhcmFtZXRlcml6ZWQgYnkgJFxiZXRhID0gXGZyYWN7MX17XGxhbWJkYX0kLgoKIyMgR2FtbWEgRGlzdHJpYnV0aW9uCgokJFggXHNpbSBcbWJveHtHYW1tYX0oYSxiKSQkCgpTdW0gb2YgJGEkIGluZGVwZW5kZW50IHNhbXBsZXMgZnJvbSBFeHAoJGIkKQoKJCRmKHgpID0gXGZyYWN7Yl5hfXtcR2FtbWEoYSl9IHhee2EtMX0gZV57LWJ4fSQkCndoZXJlIHRoZSAiR2FtbWEgZnVuY3Rpb24iIGlzIGRlZmluZWQgYXMKJCRcR2FtbWEoYSkgPVxpbnRfMF5caW5mdHkgdF57YS0xfWVeey10fWR0JCQKRm9yIGludGVnZXIgdmFsdWVzIG9mICRhJCwgJFxHYW1tYShhKT1hISQuCgpgYGB7cn0KYSA9IDEgICMgc2FtZSBhcyBleHAKYiA9IDEKeCA9IHNlcSgtMiwgMTAsIDAuMDEpCmYgPSBkZ2FtbWEoeCwgYSwgYikKcGxvdCh4LCBmLCB0eXBlPSJsIikKZm9yIChhIGluIDI6Nil7ICAjIHNlZSB0aGUgY2hhbmdlIHdpdGggYQogIGxpbmVzKHgsIGRnYW1tYSh4LCBhLCBiKSwgY29sPWEpCn0KYGBgCgpGb3IgaW5kZXBlbmRlbnQgcmFuZG9tIHZhcmlhYmxlcyAkWF9pIFxzaW0gXG1ib3h7R2FtbWF9KGFfaSxiKSQsIAokJFxzdW1fe2k9MX1ebiBYX2kgXHNpbSBcbWJveHtHYW1tYX0oXHN1bV97aT0xfV5uIGFfaSwgYikkJAoKIyMgTm9ybWFsIChHYXVzc2lhbikgRGlzdHJpYnV0aW9uCgokJFggXHNpbSBcbWF0aGNhbHtOfShcbXUsXHNpZ21hKSQkCm1lYW4gJFxtdSQgYW5kIHN0YW5kYXJkIGRldmlhdGlvbiAkXHNpZ21hJAoKJCRmKHgpID0gXGZyYWN7MX17XHNpZ21hXHNxcnR7MlxwaX19IGVeey1cZnJhY3soeC1cbXUpXjJ9ezJcc2lnbWFeMn19JCQKCgpgYGB7cn0KeCA9IHNlcSgtNSwgNSwgMC4xKQpmID0gZG5vcm0oeCkgICMgZGVmYXVsdDogbXU9MCwgc2lnbWE9MQpwbG90KHgsIGYsIHR5cGU9ImwiKQpgYGAKCiMgRXhwZWN0YXRpb24gCgpFeHBlY3RhdGlvbiAob3IgbWVhbiwgb3IgZmlyc3QgbW9tZW50KSBvZiByYW5kb20gdmFyaWFibGUgJFgkOgoKJCRFKFgpID0gXGludCB4IGRGKHgpJCQKCiogZm9yIGRpc2NyZXRlICRYJDogCgokJEUoWCkgPSBcc3VtX3ggeCBmKHgpJCQgCgoqIGZvciBjb250aW51b3VzICRYJDogCgokJEUoWCkgPSBcaW50X3stXGluZnR5fV57XGluZnR5fSB4IGYoeCkgZHgkJAoKRXhwZWN0YXRpb24gaXMgb2Z0ZW4gZGVub3RlZCBhcyAkRShYKT1cbXVfWD1cbXUkLgoKIyMgUHJvcGVydGllcyBvZiBFeHBlY3RhdGlvbnMKCiogRXhwZWN0YXRpb24gb2YgYSBmdW5jdGlvbiAkWT1yKFgpJDoKCiQkRShZKSA9IEUocihYKSkgPSBcaW50IHIoeClkRl9YKHgpJCQKCiogTGluZWFyIHN1bTogCgokJEUoXHN1bV9pIGFfaSBYX2kpID1cc3VtX2kgYV9pIEUoWF9pKSQkCgoqIFByb2R1Y3Qgb2YgaW5kZXBlbmRlbnQgcmFuZG9tIHZhcmlhYmxlczoKCiQkRShccHJvZF9pIFhfaSkgPVxwcm9kX2kgRShYX2kpJCQKCiMgVmFyaWFuY2UKClZhcmlhbmNlIGlzIGEgbWVhc3VyZSBvZiB0aGUgc3ByZWFkIG9mIGEgZGlzdHJpYnV0aW9uLgoKKiBWYXJpYW5jZSAkVihYKT1cc2lnbWFfWF4yPVxzaWdtYV4yJCBmb3IgYSByYW5kb20gdmFyaWFibGUgJFgkIHdpdGggdGhlIG1lYW4gJFxtdSQ6CgokJFYoWCkgPSBFKChYLVxtdSleMikgPSBcaW50KHgtXG11KV4yIGRGKHgpJCQKCiogJFYoWCkgPSBFKFheMiktXG11XjIkCgoqICRWKGFYK2IpID0gYV4yIFYoWCkkCgoqIGZvciBpbmRlcGVuZGVudCByYW5kb20gdmFyaWFibGVzOgoKJCRWKFxzdW1faSBhX2kgWF9pKSA9XHN1bV9pIGFfaV4yIFYoWF9pKSQkCgojIExpbWl0IFRoZW9yeQoKKiBQcm9iYWJpbGl0eSB0aGVvcnkgYWxsb3dzIHVzIHRvIHByZWRpY3Qgd2hhdCBoYXBwZW5zIHdoZW4gd2UgZ2F0aGVyIGEgbGFyZ2Ugc2FtcGxlLgoKIyMgVGhlIExhdyBvZiBMYXJnZSBOdW1iZXJzCgpUaGUgc2FtcGxlIGF2ZXJhZ2UgJFxiYXJ7WH1fbj1cZnJhY3sxfXtufVxzdW1fe2k9MX1ebiBYX2kkIGNvbnZlcmdlcyBpbiBwcm9iYWJpbGl0eSB0byB0aGUgZXhwZWN0YXRpb24gJFxtdT1FRShYX2kpJC4KCiogJFhfbiQgY29udmVyZ2VzIHRvICRYJCAqaW4gcHJvYmFiaWxpdHkqCgokJFhfblxzdGFja3JlbHtQfXtccmlnaHRhcnJvd31YJCQKCkZvciBldmVyeSAkXGVwc2lsb24+MCQsIGFzICRuXHJpZ2h0YXJyb3dcaW5mdHkkLAokJFAofFhfbi1YfD5cZXBzaWxvbilccmlnaHRhcnJvdyAwJCQKCiMjIFRoZSBDZW50cmFsIExpbWl0IFRoZW9yZW0KCkZvciBhbnkgZGlzdHJpYnV0aW9uIG9mICRYJCB3aXRoIG1lYW4gJFxtdSQgYW5kIHZhcmlhbmNlICRcc2lnbWFeMiQsIHRoZSBkaXN0cmlidXRpb24gb2Ygc2FtcGxlIGF2ZXJhZ2VzICRYX24kIGZvbGxvd3MgYSBOb3JtYWwgZGlzdHJpYnV0aW9uICRcbWF0aGNhbHtOfShcbXUsXGZyYWN7XHNpZ21hXjJ9e259KSQKCiogRGV2aWF0aW9uIG9mIHRoZSBzYW1wbGUgYXZlcmFnZSBmcm9tIHRoZSB0cnVlIG1lYW4sIHNjYWxlZCBieSAkbiQgYXMgJFxzcXJ0e259KFxiYXJ7WH1fbi1cbXUpJCwgY29udmVyZ2VzIGluIGRpc3RyaWJ1dGlvbiB0byBhIE5vcm1hbCBkaXN0cmlidXRpb24gJFxtYXRoY2Fse059KDAsXHNpZ21hXjIpJC4KCiogJFhfbiQgY29udmVyZ2VzIHRvICRYJCAqaW4gZGlzdHJpYnV0aW9uKgoKJCRYX25cbGVhZHN0byBYJCQKClRoZSBjdW11bGF0aXZlIGRpc3RyaWJ1dGlvbiBmdW5jdGlvbiAkRl9uKFhfbikkIGNvbnZlcmdlcyB0byAkRihYKSQgYXQgZXZlcnkgcG9pbnQgJHgkIHdoZXJlICRGJCBpcyBjb250aW51b3VzLgokJFxsaW1fe25ccmlnaHRhcnJvd1xpbmZ0eX1GX24oeCk9Rih4KSQkCgojIEV4ZXJjaXNlCgojIyAxLiBQREYgYW5kIENERgoKMSkgRm9yIGFuIGV4cG9uZW50aWFsIGRpc3RyaWJ1dGlvbiwgcGxvdCB0aGUgUERGLCBDREYgYW5kIGludmVyc2UgQ0RGIChxdWFudGlsZSBmdW5jdGlvbikgYnkgYGRleHBgLCBgcGV4cGAgYW5kIGBxZXhwYC4KCmBgYHtyfQoKYGBgCgoyKSBEZXJpdmUgdGhlIG1hdGhlbWF0aWNhbCBmb3JtIG9mIHRoZSBDREYgb2YgdGhlIGV4cG9uZW50aWFsIGRpc3RyaWJ1dGlvbiBmcm9tIGl0cyBQREYgCiQkZih4KSA9IFxsYW1iZGEgZV57LVxsYW1iZGEgeH0kJAoKCgphbmQgY29tcGFyZSB3aXRoIHRoZSBwbG90IGFib3ZlLgoKYGBge3J9CgpgYGAKCjMpIERlcml2ZSB0aGUgbWF0aGVtYXRpY2FsIGZvcm0gb2YgdGhlIGludmVyc2UgQ0RGIChxdWFudGlsZSBmdW5jdGlvbikgb2YgdGhlIGV4cG9uZW50aWFsIGRpc3RyaWJ1dGlvbgoKCgphbmQgY29tcGFyZSB3aXRoIHRoZSBwbG90IGFib3ZlLgoKCmBgYHtyfQoKYGBgCgojIyAyLiBSZWxhdGlvbnNoaXBzIGJldHdlZW4gZGlzdHJpYnV0aW9ucwoKMSkgTWFrZSBhIHNhbXBsZSBieSBzdW1taW5nIHNhbXBsZXMgZnJvbSBCZXJub3VsbGkgZGlzdHJpYnV0aW9uLiBQbG90IGl0cyBoaXN0Z3JhbSBhbmQgY2hlayBpZiB0aGF0IGZpdHMgd2l0aCB0aGUgQmlub21pYWwgZGlzdHJpYnV0aW9uIGdpdmUgYnkgYGRiaW5vbSgpYC4KCmBgYHtyfQoKYGBgCgoyKSBCeSB0YWtpbmcgJG4kIGxhcmdlIGFuZCBzY2FsaW5nICRwJCBieSAkXGZyYWN7MX17bn0kIGluIEJpbm9taWFsIGRpc3RyaWJ1dGlvbiwgc2VlIGlmIHRoZSBkaXN0cmlidXRpb24gY29tZXMgY2xvc2UgdG8gUG9pc3NvbiBkaXN0cmlidXRpb24KCmBgYHtyfQoKYGBgCgozKSBEcmF3IGEgc2VxdWVuY2Ugb2Ygc2FtcGxlcyBmcm9tIGEgQmVybm91bGxpIGRpc3RyaWJ1dGlvbiB3aXRoIHNtYWxsICRwJC4gTWFrZSBhIGhpc3RvZ3JhbSBvZiB0aGUgdGltZSBpbnRlcnZhbHMgYmV0d2VlbiAxcyBhbmQgc2VlIHdoYXQgZGlzdHJpYnV0aW9uIGl0IGZvbGxvd3MuCgpgYGB7cn0KCmBgYAoKNCkgRGl2aWRlIHRoZSBhYm92ZSBzZXF1ZW5jZSBpbnRvIHRpbWUgYmlucyBvZiBsZW5ndGggJFQkIGFuZCBjb3VudCAxcyBpbiBlYWNoIGJpbi4gV2hhdCBkaXN0cmlidXRpb24gZG9lcyBpdCBmb2xsb3c/CgpgYGB7cn0KCmBgYAoKNSkgQnkgc3VtbWluZyB1cCBtdWx0aXBsZSBzYW1wbGVzIGZyb20gZXhwb25lbnRpYWwgZGlzdHJpYnV0aW9uLCBjaGVjayB3aGV0aGVyIHRoYXQgZm9sbG93cyBHYW1tYSBkaXN0cmlidXRpb24uCgpgYGB7cn0KCmBgYAoKNikgU2VlIGluIHdoYXQgY2FzZSBHYW1tYSBkaXN0cmlidXRpb24gYmVjb21lIGNsb3NlIHRvIHRoZSBub3JtYWwgZGlzdHJpYnV0aW9uLgoKIyMgMy4gRXhwZWN0YXRpb24gYW5kIFZhcmlhbmNlCgoqaXMgb3B0aW9uYWwgZm9yIHRob3NlIHdpdGggbWF0aGVtYXRpY2FsIGJhY2tncm91bmQKCjEpIERlcml2ZSB0aGUgbWVhbiBhbmQgdGhlIHZhcmlhbmNlIG9mIEJlcm5vdWxsaSBkaXN0cmlidXRpb24uCgoKCjIpIERlcml2ZSB0aGUgbWVhbiBhbmQgdGhlIHZhcmlhbmNlIG9mIEJpbm9taWFsIGRpc3RyaWJ1dGlvbi4KCgoKMykgRHJpdmUgdGhlIG1lYW4gYW5kIHRoZSB2YXJpYW5jZSBvZiB1bmlmb3JtIGRpc3RyaWJ1dGlvbi4KCgoKNCopIENvbXB1dGUgdGhlIG1lYW4gb2YgdGhlIGV4cG9uZW50aWFsIGRpc3RyaWJ1dGlvbiBmcm9tIFBERjoKJCRFKFgpID0gXGludF8wXlxpbmZ0eSB4IGYoeCkgZHgkJAoKCgo1KikgQ29tcHV0ZSB0aGUgbWVhbiBvZiB0aGUgZXhwb25lbnRpYWwgZGlzdHJpYnV0aW9uIGZyb20gQ0RGOgokJEUoWCkgPSBcaW50IHggZEYoeCkgPSBcaW50XzBeMSBGXnstMX0ocSkgZHEkJAoKCgo2KikgRGVyaXZlIHRoZSB2YXJpYW5jZSBvZiB0aGUgZXhwb25lbnRpYWwgZGlzdHJpYnV0aW9uLgoKCgo3KSBEZXJpdmUgdGhlIG1lYW4gYW5kIHRoZSB2YXJpYW5jZSBvZiBHYW1tYSBkaXN0cmlidXRpb24gYXMgYSBzdW0gb2YgdGhlIHNhbXBsZXMgZnJvbSBleHBvbmVudGlhbCBkaXN0cmlidXRpb24uIAoKCg==