Question 1. Consider the Binomial distribution with \(n = 24\) and \(p
= .9\) that is used to model the number of correctly received
bits on a satellite link that transmits data in \(24\)-bit blocks.
Quesion 1 (a) Plot the probability
density function and cumulative distribution function for the number of
correctly received bits
#Answer 1a
n <- 24
x <- 0:n
p <- 0.9
#PDF
plot (x,dbinom(x,n,p), type = 'h')

xlab = "Number of correctly-received bits"
ylab= "probability"
#CDF
cdf<-pbinom (0:n, 24, 0.9)
plot(x,cdf, type ='s')

xlab= "Number of correctly-received bits"
ylab= "CDF"
Quesion 1 (b) What is the mean number of
correctly received bits? What is the standard deviation?
#Answer 1b
#(make sure that what you print make sense to me) - for example to print mean you can use cat command once you done with the calculation and have value in the variable
#variable_name=10
#cat("Mean number of correctly received bits ", variable_name)
n <- 24
p <- 0.9
bitMean <- (n*p)
cat ("Mean number of correctly received bits is", bitMean)
Mean number of correctly received bits is 21.6
cat ("\n")
stDev <- sqrt((n*p)*(1-p))
cat ("Standard Deviation of correctly received bits is", stDev)
Standard Deviation of correctly received bits is 1.469694
Quesion 1 (c) What is the probability of
more than \(3\)-bit errors in the block
of \(24\)?
#Answer 1c
probMoreThanThree <- 1-pbinom(3, 24, 0.1)
cat("The probability of more than 3 bit errors in the block is", probMoreThanThree)
The probability of more than 3 bit errors in the block is 0.2142622
Quesion 1 (e) What is the 60th quantile
of this distribution? What can you interpret from this
value?
#Answer 1e
quant60 <- qbinom (0.6, 24, 0.9)
quant60
[1] 22
#Interpretation
cat("The 60th quantile is 22, meaning that 60% of the time, there will be 22 or less bits being received correctly.")
The 60th quantile is 22, meaning that 60% of the time, there will be 22 or less bits being received correctly.
Question2. The Public Service Answering Point (PSAP) in San
Francisco employs \(19\) operators in
\(8\)-hour shifts to process \(911\) calls. There are at least \(5\) operators always answering calls. The
number of calls processed per operator can be modeled with a Poisson
random variable with rate \(\lambda_0
=20\) calls per hour.
Quesion 2 (a) What is the probability an
operator can process 20 calls in an hour? Repeat for 30 calls in an
hour?
#Answer 2a
lambda <- 20
prob20 <- dpois (20, lambda)
prob30 <-dpois (30, lambda)
cat (prob20, "is the probability an operator can process 20 calls in an hour")
0.08883532 is the probability an operator can process 20 calls in an hour
cat("\n")
cat (prob30, "is the probability an operator can process 30 calls in an hour")
0.008343536 is the probability an operator can process 30 calls in an hour
Quesion 2 (b) Given that 240 calls
occurred in an hour, what is the probability that the ten operators can
process them all assuming they are split equally among the
operators?
#Answer 2b
##each op takes 24 calls wtihin an hour
prob24 <- dpois (24, lambda)
probAll <- (prob24)^10
probAll
[1] 2.892317e-13
Quesion 2 (c) Now, If the aggregate call
rate per hour \(\lambda_c\) , is
measured by \(\lambda_c = 85\) calls
per hour, what is the probability of more than \(100\) calls in an hour
#Answer 2c
newLambda <- 85
Prob100<-1-ppois(100, 85)
cat("The probability of more than 100 calls in an hour is", Prob100)
The probability of more than 100 calls in an hour is 0.04934533
Question 3. For the two random number generator below A and B(don’t
forget to add your R code)
- [A] \(Z_i = (9Z_{i-1} + 1) \mod
16\) with \(Z_0 = 5\).
- [B] \(Z_i = (7Z_{i-1} + 3) \mod
32\) with \(Z_0 = 10\),
Quesion 3 (a) Compute \(Z_i\) and \(U_i\) for values of \(i\) until a number is repeated, what is the
period of both the generator? Provide your comments about the period of
both RNG
#Answer 3a
seed <- 5
a <- 9
c<- 1
m<- 16
rlength <- 50
lcg <- function(a, c, m, rlength, seed) {
z <-rep (0, rlength)
z[1] <- seed
# loop to gen random numbers
for (i in 1:(rlength-1)) {
#compute next lcg value
z[i+1] <- (a*z[i] +c) %% m
}
U <- z / m
return (list(z=z,U=U))
}
lcg (9,1,16, 25, 5)
$z
[1] 5 14 15 8 9 2 3 12 13 6 7 0 1 10 11 4 5 14 15 8 9 2 3 12 13
$U
[1] 0.3125 0.8750 0.9375 0.5000 0.5625 0.1250 0.1875 0.7500 0.8125 0.3750 0.4375 0.0000 0.0625 0.6250 0.6875 0.2500 0.3125
[18] 0.8750 0.9375 0.5000 0.5625 0.1250 0.1875 0.7500 0.8125
cat ("The period for equation A is 16. This is equal to the modulus, meaning this is its full period, the same value as the mod.")
The period for equation A is 16. This is equal to the modulus, meaning this is its full period, the same value as the mod.
seed <- 10
a <- 7
c <- 3
m <- 32
rlength <- 50
lcg <- function(a, c, m, rlength, seed) {
z <- rep(0,rlength)
z[1] <- Z0_forB
for (i in 1:(rlength-1)) {
z[i+1] <- (a*z[i] +c) %% m
}
#Calculate uniform rand value U in [0,1]
U <- z/m
#Return
return (list(z=z,U=U))
}
lcg(7,3,32,25,10)
$z
[1] 10 9 2 17 26 25 18 1 10 9 2 17 26 25 18 1 10 9 2 17 26 25 18 1 10
$U
[1] 0.31250 0.28125 0.06250 0.53125 0.81250 0.78125 0.56250 0.03125 0.31250 0.28125 0.06250 0.53125 0.81250 0.78125
[15] 0.56250 0.03125 0.31250 0.28125 0.06250 0.53125 0.81250 0.78125 0.56250 0.03125 0.31250
Question 3 (b) Which of these parameters
effect the period of LCG – \(a\), \(b\), \(Z_0\)
#Answer
cat("Parameters a and c affect the period of the LCG. The seed is multiplied by a and added to by c, and this number is operated upon by the modulo value.")
Parameters a and c affect the period of the LCG. The seed is multiplied by a and added to by c, and this number is operated upon by the modulo value.
Quesion 3 (c) For both generators plot a
scatter diagram of the Zi values 1 apart. What are your observations
from these plots? What do you think about the property of randomness of
these generators?
#Answer
lcg <- function(a, c, m, rlength, seed) {
z <- rep(0,rlength)
z[1] <- Z0_forB
for (i in 1:(rlength-1)) {
z[i+1] <- (a*z[i] +c) %% m
}
#Calculate uniform rand value U in [0,1]
U <- z/m
#Return
return (list(z=z,U=U)) }
example <- lcg(9,1,16, 25, 5)
ZT = example$z
Z1 =ZT[1:16]
Z2 = ZT[2:17]
plot (Z1, Z2, main = "Scatterplot of Zi Values for Equation A")

example <- lcg(7,3,32,25,10)
ZT = example$z
Z1 =ZT[1:8]
Z2 = ZT[2:9]
plot (Z1, Z2, main = "Scatterplot of Zi Values for Equation B")

cat("In scatterplot A, a visible and predictable pattern is shown. This means that LCG equation A is not very random. In scatterplot B, there is a less predictable pattern and the plot points are more scattered about. This shows that LCG B is more random, and can generate more unpreditable sequences than A.")
In scatterplot A, a visible and predictable pattern is shown. This means that LCG equation A is not very random. In scatterplot B, there is a less predictable pattern and the plot points are more scattered about. This shows that LCG B is more random, and can generate more unpreditable sequences than A.
Question 3 (d) Randomness of default
random generator of R – Run runif command to generate 100 random numbers
and plot the scatter diagram of these numbers ( values 1 apart) and
discuss your observations about randomness of this random generator.
#Answer
rand <-runif(100)
rand
[1] 0.57608160 0.90633661 0.86341068 0.06518454 0.94756522 0.31624360 0.39735815 0.29912225 0.61354231 0.62707194
[11] 0.58216907 0.82012066 0.19860669 0.08905146 0.21158870 0.30366478 0.31175807 0.96213756 0.22735787 0.81010627
[21] 0.13580325 0.55613351 0.19740285 0.78554348 0.88587381 0.28749707 0.84680518 0.56461377 0.35905576 0.26812346
[31] 0.35646099 0.36033073 0.16581994 0.32082877 0.66402564 0.95992280 0.95425132 0.47297589 0.48864110 0.52958244
[41] 0.99667129 0.69244686 0.95172444 0.63557902 0.66240638 0.12003894 0.71171426 0.52332448 0.49005332 0.14609978
[51] 0.77039162 0.94400060 0.30546333 0.74528827 0.83473715 0.84479895 0.79791058 0.79453675 0.82380320 0.95854745
[61] 0.03976804 0.65061744 0.12354842 0.01488115 0.42201990 0.31200090 0.98822245 0.60617974 0.38253127 0.97231882
[71] 0.87166879 0.61465042 0.58090161 0.29415328 0.33103456 0.93238347 0.38675807 0.90356363 0.46713331 0.92869827
[81] 0.23277721 0.25709528 0.86156281 0.69523689 0.14707560 0.35884933 0.07953704 0.20422794 0.15875490 0.77472802
[91] 0.92148488 0.08272197 0.04469671 0.67531416 0.24090663 0.57905143 0.59784965 0.84457965 0.89290587 0.90498868
##Scatterplot
plot(rand[-length(rand)],rand[-1])

cat("This random generator is very unpredictable, as shown by the pattern on the scatterplot. There is no discernable pattern, and it appears that it is much stronger at generating unpredictable numbers than an LCG.")
This random generator is very unpredictable, as shown by the pattern on the scatterplot. There is no discernable pattern, and it appears that it is much stronger at generating unpredictable numbers than an LCG.
Question 3 (e) Compute the mean value of
\(U_i\) across the period
#Answer
meanUi <- mean(rand)
cat("The mean value of Ui across the period is", meanUi, "\n")
The mean value of Ui across the period is 0.5441508
Question 6. For our specific random variable, we know that its PDF
is defined by the function \(f(x) =
10x(1-x)\). Utilize the accept-reject algorithm to draw samples
from this distribution. Take a look at Lecture 10 slide 8 and 9
#Answer
accept_reject <- function(f, c, g, rg, n) {
n.accepts <- 0
result.sample <- rep(NA, n)
while (n.accepts < n) {
x.star <- rg(1) # step 1
u <- runif(1,0,1) # step 2
if (u < f(x.star)/(c*g(x.star))) { # step 3 (accept)
n.accepts <- n.accepts+1
result.sample[n.accepts] = x.star
}
}
result.sample
}
f <- function(x) 10*x*(1-x)
g <- function(x) x/x
rg <- function(n) runif(n,0,1)
c <- 2
vals <- accept_reject(f, c, g, rg, 1000)
hist(vals,freq=FALSE, main="Histogram")

LS0tCnRpdGxlOiAiIDxjZW50ZXI+PHNwYW4gc3R5bGU9J2NvbG9yOiBibHVlOyc+IEhvbWV3b3JrIDMgPC9zcGFuPjwvY2VudGVyPiIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKCiMgUXVlc3Rpb24gMS4gIENvbnNpZGVyIHRoZSBCaW5vbWlhbCBkaXN0cmlidXRpb24gd2l0aCAkbiA9IDI0JCBhbmQgJHAgPSAuOSQgdGhhdCBpcyB1c2VkIHRvIG1vZGVsIHRoZSBudW1iZXIgb2YgY29ycmVjdGx5IHJlY2VpdmVkIGJpdHMgb24gYSBzYXRlbGxpdGUgbGluayB0aGF0IHRyYW5zbWl0cyBkYXRhIGluICQyNCQtYml0IGJsb2Nrcy4KCiMjIyA8c3BhbiBzdHlsZT0nY29sb3I6IGdyZXk7Jz5RdWVzaW9uIDEgKGEpIFBsb3QgdGhlIHByb2JhYmlsaXR5IGRlbnNpdHkgZnVuY3Rpb24gYW5kIGN1bXVsYXRpdmUgZGlzdHJpYnV0aW9uIGZ1bmN0aW9uIGZvciB0aGUgbnVtYmVyIG9mIGNvcnJlY3RseSByZWNlaXZlZCBiaXRzPC9zcGFuPgoKYGBge3J9CiNBbnN3ZXIgMWEKbiA8LSAyNAp4IDwtIDA6bgpwIDwtIDAuOQojUERGCnBsb3QgKHgsZGJpbm9tKHgsbixwKSwgdHlwZSA9ICdoJykKeGxhYiA9ICJOdW1iZXIgb2YgY29ycmVjdGx5LXJlY2VpdmVkIGJpdHMiCnlsYWI9ICJwcm9iYWJpbGl0eSIKCiNDREYKY2RmPC1wYmlub20gKDA6biwgMjQsIDAuOSkKcGxvdCh4LGNkZiwgdHlwZSA9J3MnKQp4bGFiPSAiTnVtYmVyIG9mIGNvcnJlY3RseS1yZWNlaXZlZCBiaXRzIiAKeWxhYj0gIkNERiIKCmBgYAoKIyMjIDxzcGFuIHN0eWxlPSdjb2xvcjogZ3JleTsnPlF1ZXNpb24gMSAoYikgV2hhdCBpcyB0aGUgbWVhbiBudW1iZXIgb2YgY29ycmVjdGx5IHJlY2VpdmVkIGJpdHM/IFdoYXQgaXMgdGhlIHN0YW5kYXJkIGRldmlhdGlvbj88L3NwYW4+CmBgYHtyfQojQW5zd2VyIDFiCiMobWFrZSBzdXJlIHRoYXQgd2hhdCB5b3UgcHJpbnQgbWFrZSBzZW5zZSB0byBtZSkgLSBmb3IgZXhhbXBsZSB0byBwcmludCBtZWFuIHlvdSBjYW4gdXNlIGNhdCBjb21tYW5kIG9uY2UgeW91IGRvbmUgd2l0aCB0aGUgY2FsY3VsYXRpb24gYW5kIGhhdmUgdmFsdWUgaW4gdGhlIHZhcmlhYmxlCiN2YXJpYWJsZV9uYW1lPTEwIAojY2F0KCJNZWFuIG51bWJlciBvZiBjb3JyZWN0bHkgcmVjZWl2ZWQgYml0cyAiLCAgdmFyaWFibGVfbmFtZSkKbiA8LSAyNApwIDwtIDAuOQpiaXRNZWFuIDwtIChuKnApCmNhdCAoIk1lYW4gbnVtYmVyIG9mIGNvcnJlY3RseSByZWNlaXZlZCBiaXRzIGlzIiwgYml0TWVhbikgCmNhdCAoIlxuIikKc3REZXYgPC0gc3FydCgobipwKSooMS1wKSkKY2F0ICgiU3RhbmRhcmQgRGV2aWF0aW9uIG9mIGNvcnJlY3RseSByZWNlaXZlZCBiaXRzIGlzIiwgc3REZXYpCmBgYAoKIyMjIDxzcGFuIHN0eWxlPSdjb2xvcjogZ3JleTsnPlF1ZXNpb24gMSAoYykgV2hhdCBpcyB0aGUgcHJvYmFiaWxpdHkgb2YgbW9yZSB0aGFuICQzJC1iaXQgZXJyb3JzIGluIHRoZSBibG9jayBvZiAkMjQkPzwvc3Bhbj4KYGBge3J9CiNBbnN3ZXIgMWMKcHJvYk1vcmVUaGFuVGhyZWUgPC0gMS1wYmlub20oMywgMjQsIDAuMSkKY2F0KCJUaGUgcHJvYmFiaWxpdHkgb2YgbW9yZSB0aGFuIDMgYml0IGVycm9ycyBpbiB0aGUgYmxvY2sgaXMiLCBwcm9iTW9yZVRoYW5UaHJlZSkKYGBgCgoKIyMjIDxzcGFuIHN0eWxlPSdjb2xvcjogZ3JleTsnPlF1ZXNpb24gMSAoZCkgV2hhdCBpcyB0aGUgbWVkaWFuIG9mIHRoaXMgZGlzdHJpYnV0aW9uPyBXaGF0IGNhbiB5b3UgaW50ZXJwcmV0IGZyb20gdGhlIG1lZGlhbiB2YWx1ZT8gPC9zcGFuPgpgYGB7cn0KI0Fuc3dlciAxZAptZWRpYW5EaXN0PC1xYmlub20oMC41LCAyNCwgMC45KQptZWRpYW5EaXN0CmNhdCAoIlRoZSBtZWRpYW4gaXMiLCBtZWRpYW5EaXN0LCAiYW5kIGl0IGNhbiB0ZWxsIHlvdSB0aGUgYW1vdW50IG9mIHRpbWVzICgyMiBvciBmZXdlcikgdGhlIGNvcnJlY3QgYml0IHdpbGwgYmUgcmVjZWl2ZWQgNTAlIG9mIHRoZSB0aW1lLiIpCmBgYAoKCiMjIyA8c3BhbiBzdHlsZT0nY29sb3I6IGdyZXk7Jz5RdWVzaW9uIDEgKGUpICBXaGF0IGlzIHRoZSA2MHRoIHF1YW50aWxlIG9mIHRoaXMgZGlzdHJpYnV0aW9uPyBXaGF0IGNhbiB5b3UgaW50ZXJwcmV0IGZyb20gdGhpcyB2YWx1ZT88L3NwYW4+CmBgYHtyfQojQW5zd2VyIDFlCnF1YW50NjAgPC0gcWJpbm9tICgwLjYsIDI0LCAwLjkpCnF1YW50NjAKI0ludGVycHJldGF0aW9uCmNhdCgiVGhlIDYwdGggcXVhbnRpbGUgaXMgMjIsIG1lYW5pbmcgdGhhdCA2MCUgb2YgdGhlIHRpbWUsIHRoZXJlIHdpbGwgYmUgMjIgb3IgbGVzcyBiaXRzIGJlaW5nIHJlY2VpdmVkIGNvcnJlY3RseS4iKQpgYGAKCiMgUXVlc3Rpb24yLiBUaGUgUHVibGljIFNlcnZpY2UgQW5zd2VyaW5nIFBvaW50IChQU0FQKSBpbiBTYW4gRnJhbmNpc2NvIGVtcGxveXMgJDE5JCBvcGVyYXRvcnMgaW4gJDgkLWhvdXIgc2hpZnRzIHRvIHByb2Nlc3MgJDkxMSQgY2FsbHMuIFRoZXJlIGFyZSBhdCBsZWFzdCAkNSQgb3BlcmF0b3JzIGFsd2F5cyBhbnN3ZXJpbmcgY2FsbHMuIFRoZSBudW1iZXIgb2YgY2FsbHMgcHJvY2Vzc2VkIHBlciBvcGVyYXRvciBjYW4gYmUgbW9kZWxlZCB3aXRoIGEgUG9pc3NvbiByYW5kb20gdmFyaWFibGUgd2l0aCByYXRlICRcbGFtYmRhXzAgPTIwJCBjYWxscyBwZXIgaG91ci4KCiMjIyA8c3BhbiBzdHlsZT0nY29sb3I6IGdyZXk7Jz5RdWVzaW9uIDIgKGEpIFdoYXQgaXMgdGhlIHByb2JhYmlsaXR5IGFuIG9wZXJhdG9yIGNhbiBwcm9jZXNzIDIwIGNhbGxzIGluIGFuIGhvdXI/IFJlcGVhdCBmb3IgMzAgY2FsbHMgaW4gYW4gaG91cj8gPC9zcGFuPgpgYGB7cn0KI0Fuc3dlciAyYQpsYW1iZGEgPC0gMjAKcHJvYjIwIDwtIGRwb2lzICgyMCwgbGFtYmRhKQpwcm9iMzAgPC1kcG9pcyAoMzAsIGxhbWJkYSkKY2F0IChwcm9iMjAsICAiaXMgdGhlIHByb2JhYmlsaXR5IGFuIG9wZXJhdG9yIGNhbiBwcm9jZXNzIDIwIGNhbGxzIGluIGFuIGhvdXIiKQpjYXQoIlxuIikKY2F0IChwcm9iMzAsICJpcyB0aGUgcHJvYmFiaWxpdHkgYW4gb3BlcmF0b3IgY2FuIHByb2Nlc3MgMzAgY2FsbHMgaW4gYW4gaG91ciIpCmBgYAoKCiMjIyA8c3BhbiBzdHlsZT0nY29sb3I6IGdyZXk7Jz5RdWVzaW9uIDIgKGIpIEdpdmVuIHRoYXQgMjQwIGNhbGxzIG9jY3VycmVkIGluIGFuIGhvdXIsIHdoYXQgaXMgdGhlIHByb2JhYmlsaXR5IHRoYXQgdGhlIHRlbiBvcGVyYXRvcnMgY2FuIHByb2Nlc3MgdGhlbSBhbGwgYXNzdW1pbmcgdGhleSBhcmUgc3BsaXQgZXF1YWxseSBhbW9uZyB0aGUgb3BlcmF0b3JzPzwvc3Bhbj4KYGBge3J9CiNBbnN3ZXIgMmIKIyNlYWNoIG9wIHRha2VzIDI0IGNhbGxzIHd0aWhpbiBhbiBob3VyCnByb2IyNCA8LSBkcG9pcyAoMjQsIGxhbWJkYSkKcHJvYkFsbCA8LSAocHJvYjI0KV4xMApwcm9iQWxsCmBgYAoKCiMjIyA8c3BhbiBzdHlsZT0nY29sb3I6IGdyZXk7Jz5RdWVzaW9uIDIgKGMpIE5vdywgSWYgdGhlIGFnZ3JlZ2F0ZSBjYWxsIHJhdGUgcGVyIGhvdXIgJFxsYW1iZGFfYyQgLCBpcyBtZWFzdXJlZCBieSAkXGxhbWJkYV9jID0gODUkIGNhbGxzIHBlciBob3VyLCB3aGF0IGlzIHRoZSBwcm9iYWJpbGl0eSBvZiBtb3JlIHRoYW4gJDEwMCQgY2FsbHMgaW4gYW4gaG91cjwvc3Bhbj4KYGBge3J9CiNBbnN3ZXIgMmMKbmV3TGFtYmRhIDwtIDg1ClByb2IxMDA8LTEtcHBvaXMoMTAwLCA4NSkKY2F0KCJUaGUgcHJvYmFiaWxpdHkgb2YgbW9yZSB0aGFuIDEwMCBjYWxscyBpbiBhbiBob3VyIGlzIiwgUHJvYjEwMCkKCmBgYAoKIyBRdWVzdGlvbiAzLiBGb3IgdGhlIHR3byByYW5kb20gbnVtYmVyIGdlbmVyYXRvciBiZWxvdyBBIGFuZCBCKGRvbuKAmXQgZm9yZ2V0IHRvIGFkZCB5b3VyIFIgY29kZSkKIyMjIC0gW0FdIFwoWl9pID0gKDlaX3tpLTF9ICsgMSkgXG1vZCAxNlwpIHdpdGggXChaXzAgPSA1XCkuCiMjIyAtIFtCXSBcKFpfaSA9ICg3Wl97aS0xfSArIDMpIFxtb2QgMzJcKSB3aXRoIFwoWl8wID0gMTBcKSwKCiMjIyA8c3BhbiBzdHlsZT0nY29sb3I6IGdyZXk7Jz5RdWVzaW9uIDMgKGEpIENvbXB1dGUgJFpfaSQgYW5kICRVX2kkIGZvciB2YWx1ZXMgb2YgJGkkIHVudGlsIGEgbnVtYmVyIGlzIHJlcGVhdGVkLCB3aGF0IGlzIHRoZSBwZXJpb2Qgb2YgYm90aCB0aGUgZ2VuZXJhdG9yPyBQcm92aWRlIHlvdXIgY29tbWVudHMgYWJvdXQgdGhlIHBlcmlvZCBvZiBib3RoIFJORyA8L3NwYW4+CgpgYGB7cn0KI0Fuc3dlciAzYQpzZWVkIDwtIDUKYSA8LSA5CmM8LSAxCm08LSAxNgpybGVuZ3RoIDwtIDUwCgpsY2cgPC0gZnVuY3Rpb24oYSwgYywgbSwgcmxlbmd0aCwgc2VlZCkgewp6IDwtcmVwICgwLCBybGVuZ3RoKQp6WzFdIDwtIHNlZWQKCiMgbG9vcCB0byBnZW4gcmFuZG9tIG51bWJlcnMKZm9yIChpIGluIDE6KHJsZW5ndGgtMSkpIHsKICAjY29tcHV0ZSBuZXh0IGxjZyB2YWx1ZQogIHpbaSsxXSA8LSAoYSp6W2ldICtjKSAlJSBtCn0KVSA8LSB6IC8gbQpyZXR1cm4gKGxpc3Qoej16LFU9VSkpCn0KCmxjZyAoOSwxLDE2LCAyNSwgNSkKY2F0ICgiVGhlIHBlcmlvZCBmb3IgZXF1YXRpb24gQSBpcyAxNi4gVGhpcyBpcyBlcXVhbCB0byB0aGUgbW9kdWx1cywgbWVhbmluZyB0aGlzIGlzIGl0cyBmdWxsIHBlcmlvZCwgdGhlIHNhbWUgdmFsdWUgYXMgdGhlIG1vZC4iKQpgYGAKCmBgYHtyfQpzZWVkIDwtIDEwCmEgPC0gNwpjIDwtIDMKbSA8LSAzMgpybGVuZ3RoIDwtIDUwCgpsY2cgPC0gZnVuY3Rpb24oYSwgYywgbSwgcmxlbmd0aCwgc2VlZCkgewp6IDwtIHJlcCgwLHJsZW5ndGgpCnpbMV0gPC0gWjBfZm9yQgpmb3IgKGkgaW4gMToocmxlbmd0aC0xKSkgewogIHpbaSsxXSA8LSAoYSp6W2ldICtjKSAlJSBtCn0KCiNDYWxjdWxhdGUgdW5pZm9ybSByYW5kIHZhbHVlIFUgaW4gWzAsMV0KVSA8LSB6L20KCiNSZXR1cm4KcmV0dXJuIChsaXN0KHo9eixVPVUpKQp9CmxjZyg3LDMsMzIsMjUsMTApCgpjYXQgKCJUaGUgcGVyaW9kIGZvciBlcXVhdGlvbiBCIGlzIDguIFRoaXMgaXMgMS80IG9mIHRoZSBtb2R1bHVzLCBtZWFuaW5nIGl0IGlzIG5vdCBpdHMgZnVsbCBwZXJpb2QsIHdoaWNoIGlzIDMyLiIpCmBgYAoKCiMjIyA8c3BhbiBzdHlsZT0nY29sb3I6IGdyZXk7Jz5RdWVzdGlvbiAzIChiKSBXaGljaCBvZiB0aGVzZSBwYXJhbWV0ZXJzIGVmZmVjdCB0aGUgcGVyaW9kIG9mIExDRyDigJMgJGEkLCAkYiQsICRaXzAkIDwvc3Bhbj4KYGBge3J9CiNBbnN3ZXIgCmNhdCgiUGFyYW1ldGVycyBhIGFuZCBjIGFmZmVjdCB0aGUgcGVyaW9kIG9mIHRoZSBMQ0cuIFRoZSBzZWVkIGlzIG11bHRpcGxpZWQgYnkgYSBhbmQgYWRkZWQgdG8gYnkgYywgYW5kIHRoaXMgbnVtYmVyIGlzIG9wZXJhdGVkIHVwb24gYnkgdGhlIG1vZHVsbyB2YWx1ZS4iKQpgYGAKCgojIyMgPHNwYW4gc3R5bGU9J2NvbG9yOiBncmV5Oyc+UXVlc2lvbiAzIChjKSBGb3IgYm90aCBnZW5lcmF0b3JzIHBsb3QgYSBzY2F0dGVyIGRpYWdyYW0gb2YgdGhlIFppIHZhbHVlcyAxIGFwYXJ0LiBXaGF0IGFyZSB5b3VyIG9ic2VydmF0aW9ucyBmcm9tIHRoZXNlIHBsb3RzPyBXaGF0IGRvIHlvdSB0aGluayBhYm91dCB0aGUgcHJvcGVydHkgb2YgcmFuZG9tbmVzcyBvZiB0aGVzZSBnZW5lcmF0b3JzPyA8L3NwYW4+CmBgYHtyfQojQW5zd2VyCmxjZyA8LSBmdW5jdGlvbihhLCBjLCBtLCBybGVuZ3RoLCBzZWVkKSB7CnogPC0gcmVwKDAscmxlbmd0aCkKelsxXSA8LSBaMF9mb3JCCmZvciAoaSBpbiAxOihybGVuZ3RoLTEpKSB7CiAgeltpKzFdIDwtIChhKnpbaV0gK2MpICUlIG0KfQoKI0NhbGN1bGF0ZSB1bmlmb3JtIHJhbmQgdmFsdWUgVSBpbiBbMCwxXQpVIDwtIHovbQoKI1JldHVybgpyZXR1cm4gKGxpc3Qoej16LFU9VSkpIH0KZXhhbXBsZSA8LSBsY2coOSwxLDE2LCAyNSwgNSkKWlQgPSBleGFtcGxlJHoKWjEgPVpUWzE6MTZdCloyID0gWlRbMjoxN10KcGxvdCAoWjEsIFoyLCBtYWluID0gIlNjYXR0ZXJwbG90IG9mIFppIFZhbHVlcyBmb3IgRXF1YXRpb24gQSIpCgpleGFtcGxlIDwtIGxjZyg3LDMsMzIsMjUsMTApClpUID0gZXhhbXBsZSR6CloxID1aVFsxOjhdCloyID0gWlRbMjo5XQpwbG90IChaMSwgWjIsIG1haW4gPSAiU2NhdHRlcnBsb3Qgb2YgWmkgVmFsdWVzIGZvciBFcXVhdGlvbiBCIikKCmNhdCgiSW4gc2NhdHRlcnBsb3QgQSwgYSB2aXNpYmxlIGFuZCBwcmVkaWN0YWJsZSBwYXR0ZXJuIGlzIHNob3duLiBUaGlzIG1lYW5zIHRoYXQgTENHIGVxdWF0aW9uIEEgaXMgbm90IHZlcnkgcmFuZG9tLiBJbiBzY2F0dGVycGxvdCBCLCB0aGVyZSBpcyBhIGxlc3MgcHJlZGljdGFibGUgcGF0dGVybiBhbmQgdGhlIHBsb3QgcG9pbnRzIGFyZSBtb3JlIHNjYXR0ZXJlZCBhYm91dC4gVGhpcyBzaG93cyB0aGF0IExDRyBCIGlzIG1vcmUgcmFuZG9tLCBhbmQgY2FuIGdlbmVyYXRlIG1vcmUgdW5wcmVkaXRhYmxlIHNlcXVlbmNlcyB0aGFuIEEuIikKYGBgCgoKIyMjIDxzcGFuIHN0eWxlPSdjb2xvcjogZ3JleTsnPlF1ZXN0aW9uIDMgKGQpIFJhbmRvbW5lc3Mgb2YgZGVmYXVsdCByYW5kb20gZ2VuZXJhdG9yIG9mIFIg4oCTIFJ1biBydW5pZiBjb21tYW5kIHRvIGdlbmVyYXRlIDEwMCByYW5kb20gbnVtYmVycyBhbmQgcGxvdCB0aGUgc2NhdHRlciBkaWFncmFtIG9mIHRoZXNlIG51bWJlcnMgKCB2YWx1ZXMgMSBhcGFydCkgYW5kIGRpc2N1c3MgeW91ciBvYnNlcnZhdGlvbnMgYWJvdXQgcmFuZG9tbmVzcyBvZiB0aGlzIHJhbmRvbSBnZW5lcmF0b3IuIDwvc3Bhbj4KYGBge3J9CiNBbnN3ZXIKcmFuZCA8LXJ1bmlmKDEwMCkKcmFuZAojI1NjYXR0ZXJwbG90CnBsb3QocmFuZFstbGVuZ3RoKHJhbmQpXSxyYW5kWy0xXSkKCmNhdCgiVGhpcyByYW5kb20gZ2VuZXJhdG9yIGlzIHZlcnkgc3Ryb25nLCBhcyBzaG93biBieSB0aGUgcGF0dGVybiBvbiB0aGUgc2NhdHRlcnBsb3QuIFRoZXJlIGlzIG5vIGRpc2Nlcm5hYmxlIHBhdHRlcm4sIGFuZCBpdCBhcHBlYXJzIHRoYXQgaXQgaXMgbXVjaCBzdHJvbmdlciBhdCBnZW5lcmF0aW5nIHVucHJlZGljdGFibGUgbnVtYmVycyB0aGFuIGFuIExDRy4iKQpgYGAKCgojIyMgPHNwYW4gc3R5bGU9J2NvbG9yOiBncmV5Oyc+UXVlc3Rpb24gMyAoZSkgQ29tcHV0ZSB0aGUgbWVhbiB2YWx1ZSBvZiAkVV9pJCBhY3Jvc3MgdGhlIHBlcmlvZDwvc3Bhbj4KYGBge3J9CiNBbnN3ZXIKbWVhblVpIDwtIG1lYW4ocmFuZCkKY2F0KCJUaGUgbWVhbiB2YWx1ZSBvZiBVaSBhY3Jvc3MgdGhlIHBlcmlvZCBpcyIsIG1lYW5VaSwgIlxuIikKCmBgYAoKCiMjIyA8c3BhbiBzdHlsZT0nY29sb3I6IGdyZXk7Jz5RdWVzdGlvbiAzIChmKSBCeSBwcm92aWRpbmcgYSBwbG90IG9mIGRlbnNpdHkgKGhpc3RvZ3JhbSkgZGlzY3VzcyB0aGUgdW5pZm9ybWl0eSBvZiBib3RoIG9mIHRoZSBnZW5lcmF0b3JzIDwvc3Bhbj4KYGBge3J9CiNBbnN3ZXIKZXhhbXBsZUEgPC0gbGNnKDksMSwxNiwxNiwgNSkKaGRhdGFBPC0gZXhhbXBsZUEkVQpoaXN0KGhkYXRhQSkKCgpleGFtcGxlQiA8LSBsY2coNywzLDMyLDMyLDEwKQpoZGF0YUI8LSBleGFtcGxlQiRVCmhpc3QoaGRhdGFCKQoKY2F0KCJBIHNob3dzIG1vcmUgdW5pZm9ybWl0eSwgc3VwcG9ydGluZyB0aGF0IGl0IGZ1bGx5IHV0aWxpemVzIHRoZSB3aG9sZSBwZXJpb2Qgd2l0aCBpdHMgZ2VuZXJhdGVkIHZhbHVlcy4gQiBvbiB0aGUgb3RoZXIgaGFuZCBpcyBtb3JlIGRpc3BlcnNlZCwgc2hvd2luZyBpdCBkb2VzIG5vdCB1c2UgaXRzIGZ1bGwgcGVyaW9kLiIpCmBgYAoKIyBRdWVzdGlvbiA0LiBVc2luZyB0aGUgaW52ZXJzZSB0cmFuc2Zvcm0gbWV0aG9kCgojIyMgPHNwYW4gc3R5bGU9J2NvbG9yOiBncmV5Oyc+UXVlc3Rpb24gNC4oYSkgRGV2ZWxvcCBhbiBhbGdvcml0aG0gZm9yIHRoZSByYW5kb20gdmFyaWFibGUgd2l0aCBjdW11bGF0aXZlIGRpc3RyaWJ1dGlvbiBmdW5jdGlvbiBGKHgpIGJlbG93Ljwvc3Bhbj4KClxbIEYoeCkgPSAxIC0gZV57LSh4L1xsYW1iZGEpXmt9IFxdCgp3aGVyZSBcKCB4IFxnZXEgMCBcKSwgXCggXGxhbWJkYSBcZ2VxIDAgXCksIGFuZCBcKCBrIFxnZXEgMCBcKS4KCmBgYHtyfQojIEFuc3dlciA0YQojIFRoaXMgbWlnaHQgYmUgaGFyZCB0byBwcmludCB1c2luZyBSIC0geW91IGNhbiB3cml0ZSB0aGUgc3RlcCBpbiB5b3VyIG5vdGVib29rIGFuZCB0aGVuIGluY2x1ZGUgaW1hZ2UgaGVyZSAvIG9yIHlvdSBjYW4gaW5jbHVkZSBhcyBzZXBlcmF0ZSBmaWxlIHdoZW4gdXBsb2FkCgojIENoZWNrIGlmIHRoZSBJUmRpc3BsYXkgcGFja2FnZSBpcyBhbHJlYWR5IGluc3RhbGxlZAppZiAoIXJlcXVpcmUoSVJkaXNwbGF5LCBxdWlldGx5ID0gVFJVRSkpIHsKICAjIElmIG5vdCBpbnN0YWxsZWQsIGluc3RhbGwgaXQKICBpbnN0YWxsLnBhY2thZ2VzKCJJUmRpc3BsYXkiKQogIAogICMgTG9hZCB0aGUgSVJkaXNwbGF5IGxpYnJhcnkKICBsaWJyYXJ5KElSZGlzcGxheSkKfSBlbHNlIHsKICAjIElmIGFscmVhZHkgaW5zdGFsbGVkLCBqdXN0IGxvYWQgdGhlIGxpYnJhcnkKICBsaWJyYXJ5KElSZGlzcGxheSkKfQoKaW52ZXJzZXRyYW5zZm9ybSA8LSBmdW5jdGlvbihudW0sIGxhbWJkYSwgaykgewogIFUgPC0gcnVuaWYobnVtLCAwLDEpCiAgdmFsdWVzIDwtIHJlcCgwLCBudW0pCiAgaSA8LSAxCmZvciAoaSBpbiAxOiBsZW5ndGgoVSkpIHsKICB2YWx1ZXNbaV0gPC0gbGFtYmRhICogKG50aHJvb3QobG9nKDEtVVtpXSksaykpCn0gIAp9CmBgYAoKCiMjIyA8c3BhbiBzdHlsZT0nY29sb3I6IGdyZXk7Jz5RdWVzdGlvbiA0IChiKSBVc2UgdGhlIGZpcnN0IHRocmVlIFVpIHZhbHVlcyBmcm9tIHBhcnQgKGEpIGFuZCBnZW5lcmF0b3IgW0FdIG9mIHByZXZpb3VzIHByb2JsZW0gdG8gY3JlYXRlIDMgdmFsdWVzIGZyb20gdGhlIHJhbmRvbSB2YXJpYWJsZSB3aGVuLCAkXGxhbWJkYSA9IDEkLCAk8J2RmCA9IDUkPC9zcGFuPgpgYGB7cn0KI0Fuc3dlcgpVaTEgPC0gLTEuMDMwNwpVaTIgPC0gLTAuNjY4NQpVaTMgPC0gLTAuNTc4MApgYGAKCgojIyMgPHNwYW4gc3R5bGU9J2NvbG9yOiBncmV5Oyc+UXVlc3Rpb24gNCAoYykgc2luZyBSIGdlbmVyYXRlIDEwLDAwMCB2YWx1ZXMgZnJvbSB5b3VyIGFsZ29yaXRobSB3aGVuICBcbGFtYmRhID0gMSAsIPCdkZggPSA1ICBhbmQgcGxvdCBhIGhpc3RvZ3JhbSBvZiB0aGUgZGVuc2l0eS4gRGlzY3VzcyB3aGF0IGluc2lnaHRzIHlvdSBvYnRhaW4gd2hlbiB5b3UgbG9vayBhdCB0aGUgcGxvdCBnZW5lcmF0ZWQgaGVyZSB2cyB0aGUgcGxvdCB5b3UgZ2VuZXJhdGVkIGluIHF1ZXN0aW9uIDMgKGUpIDwvc3Bhbj4KYGBge3J9CiNBbnN3ZXIKCmBgYAoKIyBRdWVzdGlvbiA1LiBEZXZlbG9wIGEgTW9udGUgQ2FybG8gc2ltdWxhdGlvbiBpbiBSIHRoYXQgY291bnRzIHRoZSBudW1iZXIgb2YgdW5pZm9ybSBbMCwxXSByYW5kb20gbnVtYmVycyB0aGF0IG11c3QgYmUgc3VtbWVkIHRvIGdldCBhIHN1bSBncmVhdGVyIHRoYW4gMS4gUnVuIGEgc2luZ2xlIHNpbXVsYXRpb24gd2l0aCBuID0gMTAsMDAwIHRpbWVzIGFuZCBmaW5kIHRoZSBtZWFuIG9mIHRoZSBudW1iZXIgb2YgY291bnRzLiBEbyB5b3UgdGhpbmsgdGhpcyBudW1iZXIgbG9va3Mgc29tZXdoYXQgZmFtaWxpYXIuIEV2ZXJ5IHN0dWRlbnQgbWlnaHQgZ2V0IHNsaWdodGx5IGRpZmZlcmVudCB2YWx1ZSBhbnkgaWRlYXMgd2h5PwpgYGB7cn0KI0Fuc3dlcgpzaW11bGF0aW9uX2NvdW50cyA9IGZ1bmN0aW9uKCkgewogIHZhbHVlcyA8LSAwCiAgY291bnQgPC0gMAogIHdoaWxlICh2YWx1ZXMgPD0xKSB7CiAgICBjb3VudCA9IGNvdW50ICsxCiAgICB2YWx1ZXMgPSB2YWx1ZXMgK3J1bmlmKDEpCiAgfQogIHJldHVybiAoY291bnQpCn0KCgpuIDwtIDEwMDAwCnJlcCA9IHJlcGxpY2F0ZShuLCBzaW11bGF0aW9uX2NvdW50cygpKQptZWFuQ291bnRzID0gbWVhbihyZXApCmNhdCAoIlRoZSBtZWFuIG51bWJlciBvZiBjb3VudHMgaXMiLCBtZWFuQ291bnRzLCAiXG4iKQpjYXQgKCJTdHVkZW50cyBnZXQgZGlmZmVyZW50IHZhbHVlcyBiZWNhdXNlIHRoZSBudW1iZXJzIGFyZSByYW5kb21seSBnZW5lcmF0ZWQuIikKCmBgYAoKIyBRdWVzdGlvbiA2LiBGb3Igb3VyIHNwZWNpZmljIHJhbmRvbSB2YXJpYWJsZSwgd2Uga25vdyB0aGF0IGl0cyBQREYgaXMgZGVmaW5lZCBieSB0aGUgZnVuY3Rpb24gJGYoeCkgPSAxMHgoMS14KSQuIFV0aWxpemUgdGhlIGFjY2VwdC1yZWplY3QgYWxnb3JpdGhtIHRvIGRyYXcgc2FtcGxlcyBmcm9tIHRoaXMgZGlzdHJpYnV0aW9uLiBUYWtlIGEgbG9vayBhdCBMZWN0dXJlIDEwIHNsaWRlIDggYW5kIDkKCmBgYHtyfQojQW5zd2VyIAoKYWNjZXB0X3JlamVjdCA8LSBmdW5jdGlvbihmLCBjLCBnLCByZywgbikgewpuLmFjY2VwdHMgPC0gMApyZXN1bHQuc2FtcGxlIDwtIHJlcChOQSwgbikKd2hpbGUgKG4uYWNjZXB0cyA8IG4pIHsKeC5zdGFyIDwtIHJnKDEpICMgc3RlcCAxCnUgPC0gcnVuaWYoMSwwLDEpICMgc3RlcCAyCmlmICh1IDwgZih4LnN0YXIpLyhjKmcoeC5zdGFyKSkpIHsgIyBzdGVwIDMgKGFjY2VwdCkKbi5hY2NlcHRzIDwtIG4uYWNjZXB0cysxCnJlc3VsdC5zYW1wbGVbbi5hY2NlcHRzXSA9IHguc3Rhcgp9Cn0KcmVzdWx0LnNhbXBsZQp9CgpmIDwtIGZ1bmN0aW9uKHgpIDEwKngqKDEteCkgCmcgPC0gZnVuY3Rpb24oeCkgeC94IApyZyA8LSBmdW5jdGlvbihuKSBydW5pZihuLDAsMSkgCmMgPC0gMiAKdmFscyA8LSBhY2NlcHRfcmVqZWN0KGYsIGMsIGcsIHJnLCAxMDAwKQpoaXN0KHZhbHMsZnJlcT1GQUxTRSwgbWFpbj0iSGlzdG9ncmFtIikKYGBgCgoKIyMjIDxzcGFuIHN0eWxlPSdjb2xvcjogZ3JleTsnPlF1ZXNpb24gMSAoYikgPC9zcGFuPgpgYGB7cn0KI0Fuc3dlcgoKYGBgCgo=