Случайни експерименти
Избор на случайни елементи от вектор с връщане:
sample(x=1:5, size=3, replace=T)
[1] 4 2 3
Избор на случайни елементи от вектор без
връщане:
sample(x=1:5, size=3, replace=F)
[1] 1 2 5
Генериране на пермутация:
x <- 1:5
sample(x, length(x), replace=F)
[1] 4 5 1 3 2
Намиране на честота на събитие (приблизителна
вероятност):
В отдел на фирма работят 20 човека. За Коледа те решават да си
разменят подаръци. В кутия слагат 20 листчета, на всяко от които има
едно име. Всеки тегли листче (без да го връща) и подарява на този, чието
име е изтеглил. Каква е вероятността поне един да изтегли своето
име?
sim <- function(num_people) {
x <- sample( 1:num_people, num_people, replace=F ) # permute
d <- x - 1:num_people # diff between personal and received number
any(d==0) # check if for any there is no diff between the two numbers
}
prob <- function(times, num_people) {
result <- replicate(times, sim(num_people))
sum(result)/length(result)
}
prob(100000, 20)
[1] 0.63365
Условна вероятност:
Имаме 3 карти: първата е бяла от двете страни, втората е черна от
двете страни, а третата е бяла от едната и черна от другата страна.
Всяка карта е поставена в затворена кутия. Избираме произволна кутия,
отваряме я и виждаме, че горната страна на картата в нея е бяла. Каква е
вероятността другата страна на картата също да е бяла?
sim <- function() {
cards <- sample(c("bb", "ww", "bw"), 1)
side <- sample(1:2, 1 )
up <- substr(cards, start=side, stop=side)
c(up, cards)
}
prob <- function(times) {
result <- replicate(times, sim())
sum(result[2,]=="ww") / sum(result[1,]=="w")
}
prob(100000)
[1] 0.665913
Случайни величини
Дискретни случайни величини
Бернулиево разпределение
X - брой успехи
successes <- 10
tries <- 20
success_probability <- 0.5
number_observations <- 10
# P(X = successes)
dbinom(successes, tries, success_probability)
[1] 0.1761971
# P(X <= successes)
pbinom(successes, tries, success_probability)
[1] 0.5880985
# generate number_observations numbers from the Binomial distribution
rbinom(number_observations, tries, success_probability)
[1] 12 12 9 8 13 10 12 11 10 10
Геометрично разпределение
X - брой опити до успех
tries <- 2
success_probability <- 0.5
number_observations <- 10
# P(X = tries)
dgeom(tries - 1, success_probability)
[1] 0.25
# P(X <= tries)
pgeom(tries - 1, success_probability)
[1] 0.75
# generate number_observations numbers from the Geometric distribution
rgeom(number_observations, success_probability) + 1
[1] 2 1 3 1 1 1 2 4 6 1
X - брой неуспехи преди първи успех
tries <- 2
success_probability <- 0.5
number_observations <- 10
# P(X = tries)
dgeom(tries, success_probability)
[1] 0.125
# P(X <= tries)
pgeom(tries, success_probability)
[1] 0.875
# generate number_observations numbers from the Geometric distribution
rgeom(number_observations, success_probability)
[1] 1 2 0 2 1 1 0 0 1 0
Отрицателно биномно разпределение
X - брой опити преди r-ти успех включително
successes <- 10
tries <- 20
success_probability <- 0.5
number_observations <- 10
# P(X = tries)
dnbinom(tries - successes, successes, success_probability)
[1] 0.08809853
# P(X <= tries)
pnbinom(tries - successes, successes, success_probability)
[1] 0.5880985
# generate number_observations numbers from the Negative Binomial distribution
rnbinom(number_observations, successes, success_probability) + successes
[1] 19 14 17 17 20 18 17 15 14 18
X - брой неуспехи преди r-ти успех
successes <- 10
failures <- 10
success_probability <- 0.5
number_observations <- 10
# P(X = failures)
dnbinom(failures, successes, success_probability)
[1] 0.08809853
# P(X <= tries)
pnbinom(failures, successes, success_probability)
[1] 0.5880985
# generate number_observations numbers from the Negative Binomial distribution
rnbinom(number_observations, successes, success_probability)
[1] 13 15 21 5 7 12 4 21 12 8
Хипергеометрично резпределение
N - общ брой топки
M - брой бели топки
X - брой извадени бели топки (при извадени L без
връщане)
chosen_white <- 5
white <- 10
all <- 20
tries <- 10
number_observations <- 10
# P(X = chosen_white)
dhyper(chosen_white, white, all - white, tries)
[1] 0.3437182
# P(X <= chosen_white)
phyper(chosen_white, white, all - white, tries)
[1] 0.6718591
# generate number_observations numbers from the Hypergeometric distribution
rhyper(number_observations, white, all - white, tries)
[1] 8 6 5 6 6 5 7 5 7 5
Поасоново разпределение
X - брой случвания на събитието
occurences <- 1
rate <- 0.6
number_observations <- 10
# P(X = occurences)
dpois(occurences, rate)
[1] 0.329287
# P(X <= occurences)
ppois(occurences, rate)
[1] 0.8780986
# generate number_observations numbers from the Poisson distribution
rpois(number_observations, rate)
[1] 2 1 2 0 2 0 0 1 1 1
Непрекъснати случайни величини
Равномерно разпределение
min <- 0
max <- 10
x <- 4
p <- 0.5
number_observations <- 5
# f(x)
dunif(x, min, max)
[1] 0.1
# P(X <= x)
punif(x, min, max)
[1] 0.4
# Q(x)
qunif(p, min, max)
[1] 5
# generate number_observations numbers from the Uniform distribution
runif(number_observations, min, max)
[1] 6.234611 9.345693 5.801829 7.479652 0.631416
Експоненциално разпределение
В теорията на вероятностите и статистиката, експоненциалното
разпределение е разпределение на времето между
събитията в процес на точка на Поасон, т.е. процес, при който
събитията се случват непрекъснато и независимо с
постоянна средна скорост.
rate <- 0.5
x <- 4
p <- 0.5
number_observations <- 5
# f(x)
dexp(x, rate)
[1] 0.06766764
# P(X <= x)
pexp(x, rate)
[1] 0.8646647
# Q(x)
qexp(p, rate)
[1] 1.386294
# generate number_observations numbers from the Exponential distribution
rexp(number_observations, rate)
[1] 1.464470 1.279188 2.916724 1.401556 3.430103
Нормално разпределение
mean <- 5
standard_deviation <- 2
x <- 6
p <- 0.5
number_observations <- 5
# f(x)
dnorm(x, mean, standard_deviation)
[1] 0.1760327
# P(X <= x)
pnorm(x, mean, standard_deviation)
[1] 0.6914625
# Q(x)
qnorm(p, mean, standard_deviation)
[1] 5
# generate number_observations numbers from the Normal distribution
rnorm(number_observations, mean, standard_deviation)
[1] 9.374021 7.834550 5.923814 9.338697 7.004951
Данни. Таблици и графики
Данни от тест
exam <- read.table("../datasets/examAB.txt", header=T)
exam
variant <- exam$variant
class(variant)
[1] "character"
character
table(variant)
variant
A B
33 35
table(variant) / length(variant)
variant
A B
0.4852941 0.5147059
sort(table(variant) / length(variant), decreasing=T)
variant
B A
0.5147059 0.4852941
barplot(table(variant))
barplot(table(variant) / length(variant))
barplot(sort(table(variant) / length(variant), decreasing=T))
pie(table(variant))
Други числови данни
wait <- c(2,3,3,5,5,2,7,10,4,3,1,7,11,10,5,6,3,8,5,12,5,3,8,5,7)
table(wait)
wait
1 2 3 4 5 6 7 8 10 11 12
1 2 5 1 6 1 3 2 2 1 1
wait_grouped <- cut(wait, breaks=seq(0,12,2))
table(wait_grouped)
wait_grouped
(0,2] (2,4] (4,6] (6,8] (8,10] (10,12]
3 6 7 5 2 2
table(wait_grouped)/length(wait)
wait_grouped
(0,2] (2,4] (4,6] (6,8] (8,10] (10,12]
0.12 0.24 0.28 0.20 0.08 0.08
barplot(table(wait_grouped))
hist(wait)
hist(wait, probability=T)
hist(wait, breaks=seq(0, 12, 3))
# хистограма с честотен полигон
h <- hist(wait, probability=T)
lines(
x=c(
min(h$breaks),
h$mids,
max(h$breaks)
),
y=c(
0,
h$density,
0
),
type="l",
lwd=2,
col="darkorange1"
)
stripchart(
wait,
method="stack",
pch=20,
cex=1.5
)
# диаграма клон с листа (stem-and-leaf plot)
# интервали: [0, 4], (4, 9], (9, 12]
stem(wait)
The decimal point is 1 digit(s) to the right of the |
0 | 122333334
0 | 555555677788
1 | 0012
# увеличаване на броя подинтервали
# интервали: [0, 1] (1, 3] (3, 5], (5, 7], (7, 9], (9, 11] (11, 13]
stem(wait, scale=2)
The decimal point is at the |
0 | 0
2 | 0000000
4 | 0000000
6 | 0000
8 | 00
10 | 000
12 | 0
Многомерни данни
library(MASS)
?survey
str(survey)
'data.frame': 237 obs. of 12 variables:
$ Sex : Factor w/ 2 levels "Female","Male": 1 2 2 2 2 1 2 1 2 2 ...
$ Wr.Hnd: num 18.5 19.5 18 18.8 20 18 17.7 17 20 18.5 ...
$ NW.Hnd: num 18 20.5 13.3 18.9 20 17.7 17.7 17.3 19.5 18.5 ...
$ W.Hnd : Factor w/ 2 levels "Left","Right": 2 1 2 2 2 2 2 2 2 2 ...
$ Fold : Factor w/ 3 levels "L on R","Neither",..: 3 3 1 3 2 1 1 3 3 3 ...
$ Pulse : int 92 104 87 NA 35 64 83 74 72 90 ...
$ Clap : Factor w/ 3 levels "Left","Neither",..: 1 1 2 2 3 3 3 3 3 3 ...
$ Exer : Factor w/ 3 levels "Freq","None",..: 3 2 2 2 3 3 1 1 3 3 ...
$ Smoke : Factor w/ 4 levels "Heavy","Never",..: 2 4 3 2 2 2 2 2 2 2 ...
$ Height: num 173 178 NA 160 165 ...
$ M.I : Factor w/ 2 levels "Imperial","Metric": 2 1 NA 2 2 1 1 2 2 2 ...
$ Age : num 18.2 17.6 16.9 20.3 23.7 ...
# извежда данните като таблица
# fix(survey)
summary(survey)
Sex Wr.Hnd NW.Hnd W.Hnd Fold
Female:118 Min. :13.00 Min. :12.50 Left : 18 L on R : 99
Male :118 1st Qu.:17.50 1st Qu.:17.50 Right:218 Neither: 18
NA's : 1 Median :18.50 Median :18.50 NA's : 1 R on L :120
Mean :18.67 Mean :18.58
3rd Qu.:19.80 3rd Qu.:19.73
Max. :23.20 Max. :23.50
NA's :1 NA's :1
Pulse Clap Exer Smoke Height
Min. : 35.00 Left : 39 Freq:115 Heavy: 11 Min. :150.0
1st Qu.: 66.00 Neither: 50 None: 24 Never:189 1st Qu.:165.0
Median : 72.50 Right :147 Some: 98 Occas: 19 Median :171.0
Mean : 74.15 NA's : 1 Regul: 17 Mean :172.4
3rd Qu.: 80.00 NA's : 1 3rd Qu.:180.0
Max. :104.00 Max. :200.0
NA's :45 NA's :28
M.I Age
Imperial: 68 Min. :16.75
Metric :141 1st Qu.:17.67
NA's : 28 Median :18.58
Mean :20.37
3rd Qu.:20.17
Max. :73.00
# equilavnt notations
survey[, 'Age']
[1] 18.250 17.583 16.917 20.333 23.667 21.000 18.833 35.833 19.000 22.333
[11] 28.500 18.250 18.750 17.500 17.167 17.167 19.333 18.333 19.750 17.917
[21] 17.917 18.167 17.833 18.250 19.167 17.583 17.500 18.083 21.917 19.250
[31] 41.583 17.500 39.750 17.167 17.750 18.000 19.000 17.917 35.500 19.917
[41] 17.500 17.083 28.583 17.500 17.417 18.500 18.917 19.417 18.417 30.750
[51] 18.500 17.500 18.333 17.417 20.000 18.333 17.167 17.417 17.667 18.417
[61] 20.333 17.333 17.500 19.833 18.583 18.000 30.667 16.917 19.917 18.333
[71] 17.583 17.833 17.667 17.417 17.750 20.667 23.583 17.167 17.083 18.750
[81] 16.750 20.167 17.667 17.167 17.167 17.250 18.000 18.750 21.583 17.583
[91] 19.667 18.000 19.667 17.083 22.833 17.083 19.417 23.250 18.083 19.083
[101] 18.917 17.750 20.833 20.167 17.667 18.250 17.000 18.500 18.583 17.750
[111] 24.167 18.167 21.167 17.917 17.417 20.500 22.917 18.917 18.917 20.083
[121] 17.500 18.250 17.500 17.417 21.000 19.833 17.667 18.083 18.000 18.333
[131] 20.000 18.750 19.083 18.500 18.417 19.167 21.500 19.333 21.417 18.667
[141] 17.500 21.083 17.250 19.000 19.167 19.000 23.000 32.667 20.000 20.167
[151] 25.500 18.167 23.500 70.417 43.833 23.583 21.083 44.250 19.667 17.917
[161] 18.417 21.167 17.500 29.083 19.917 18.500 18.167 32.750 17.417 17.333
[171] 73.000 18.667 18.500 18.667 17.750 17.250 36.583 23.083 19.250 17.167
[181] 23.417 17.083 17.250 23.833 18.750 21.167 24.667 18.500 20.333 20.083
[191] 18.917 27.333 18.917 17.250 18.167 26.500 17.000 17.167 19.167 17.500
[201] 19.250 21.333 18.583 20.167 18.667 17.083 17.417 18.583 19.500 18.500
[211] 17.167 17.250 17.500 20.417 17.083 21.250 19.250 19.333 19.167 18.917
[221] 20.917 17.333 18.167 20.750 19.917 18.667 18.417 17.417 20.333 19.333
[231] 18.167 20.750 17.667 16.917 18.583 17.167 17.750
survey$Age
[1] 18.250 17.583 16.917 20.333 23.667 21.000 18.833 35.833 19.000 22.333
[11] 28.500 18.250 18.750 17.500 17.167 17.167 19.333 18.333 19.750 17.917
[21] 17.917 18.167 17.833 18.250 19.167 17.583 17.500 18.083 21.917 19.250
[31] 41.583 17.500 39.750 17.167 17.750 18.000 19.000 17.917 35.500 19.917
[41] 17.500 17.083 28.583 17.500 17.417 18.500 18.917 19.417 18.417 30.750
[51] 18.500 17.500 18.333 17.417 20.000 18.333 17.167 17.417 17.667 18.417
[61] 20.333 17.333 17.500 19.833 18.583 18.000 30.667 16.917 19.917 18.333
[71] 17.583 17.833 17.667 17.417 17.750 20.667 23.583 17.167 17.083 18.750
[81] 16.750 20.167 17.667 17.167 17.167 17.250 18.000 18.750 21.583 17.583
[91] 19.667 18.000 19.667 17.083 22.833 17.083 19.417 23.250 18.083 19.083
[101] 18.917 17.750 20.833 20.167 17.667 18.250 17.000 18.500 18.583 17.750
[111] 24.167 18.167 21.167 17.917 17.417 20.500 22.917 18.917 18.917 20.083
[121] 17.500 18.250 17.500 17.417 21.000 19.833 17.667 18.083 18.000 18.333
[131] 20.000 18.750 19.083 18.500 18.417 19.167 21.500 19.333 21.417 18.667
[141] 17.500 21.083 17.250 19.000 19.167 19.000 23.000 32.667 20.000 20.167
[151] 25.500 18.167 23.500 70.417 43.833 23.583 21.083 44.250 19.667 17.917
[161] 18.417 21.167 17.500 29.083 19.917 18.500 18.167 32.750 17.417 17.333
[171] 73.000 18.667 18.500 18.667 17.750 17.250 36.583 23.083 19.250 17.167
[181] 23.417 17.083 17.250 23.833 18.750 21.167 24.667 18.500 20.333 20.083
[191] 18.917 27.333 18.917 17.250 18.167 26.500 17.000 17.167 19.167 17.500
[201] 19.250 21.333 18.583 20.167 18.667 17.083 17.417 18.583 19.500 18.500
[211] 17.167 17.250 17.500 20.417 17.083 21.250 19.250 19.333 19.167 18.917
[221] 20.917 17.333 18.167 20.750 19.917 18.667 18.417 17.417 20.333 19.333
[231] 18.167 20.750 17.667 16.917 18.583 17.167 17.750
# 12-та колона
survey[ ,12]
[1] 18.250 17.583 16.917 20.333 23.667 21.000 18.833 35.833 19.000 22.333
[11] 28.500 18.250 18.750 17.500 17.167 17.167 19.333 18.333 19.750 17.917
[21] 17.917 18.167 17.833 18.250 19.167 17.583 17.500 18.083 21.917 19.250
[31] 41.583 17.500 39.750 17.167 17.750 18.000 19.000 17.917 35.500 19.917
[41] 17.500 17.083 28.583 17.500 17.417 18.500 18.917 19.417 18.417 30.750
[51] 18.500 17.500 18.333 17.417 20.000 18.333 17.167 17.417 17.667 18.417
[61] 20.333 17.333 17.500 19.833 18.583 18.000 30.667 16.917 19.917 18.333
[71] 17.583 17.833 17.667 17.417 17.750 20.667 23.583 17.167 17.083 18.750
[81] 16.750 20.167 17.667 17.167 17.167 17.250 18.000 18.750 21.583 17.583
[91] 19.667 18.000 19.667 17.083 22.833 17.083 19.417 23.250 18.083 19.083
[101] 18.917 17.750 20.833 20.167 17.667 18.250 17.000 18.500 18.583 17.750
[111] 24.167 18.167 21.167 17.917 17.417 20.500 22.917 18.917 18.917 20.083
[121] 17.500 18.250 17.500 17.417 21.000 19.833 17.667 18.083 18.000 18.333
[131] 20.000 18.750 19.083 18.500 18.417 19.167 21.500 19.333 21.417 18.667
[141] 17.500 21.083 17.250 19.000 19.167 19.000 23.000 32.667 20.000 20.167
[151] 25.500 18.167 23.500 70.417 43.833 23.583 21.083 44.250 19.667 17.917
[161] 18.417 21.167 17.500 29.083 19.917 18.500 18.167 32.750 17.417 17.333
[171] 73.000 18.667 18.500 18.667 17.750 17.250 36.583 23.083 19.250 17.167
[181] 23.417 17.083 17.250 23.833 18.750 21.167 24.667 18.500 20.333 20.083
[191] 18.917 27.333 18.917 17.250 18.167 26.500 17.000 17.167 19.167 17.500
[201] 19.250 21.333 18.583 20.167 18.667 17.083 17.417 18.583 19.500 18.500
[211] 17.167 17.250 17.500 20.417 17.083 21.250 19.250 19.333 19.167 18.917
[221] 20.917 17.333 18.167 20.750 19.917 18.667 18.417 17.417 20.333 19.333
[231] 18.167 20.750 17.667 16.917 18.583 17.167 17.750
# 5-ти ред
survey[5, ]
Крос-таблица
attach(survey)
table(Smoke, W.Hnd)
W.Hnd
Smoke Left Right
Heavy 1 10
Never 13 175
Occas 3 16
Regul 1 16
# премахване на липсващите наблюдения
table(Smoke, W.Hnd, useNA="no")
W.Hnd
Smoke Left Right
Heavy 1 10
Never 13 175
Occas 3 16
Regul 1 16
Сравняване на таблици
# таблица с относителния дял
prop.table(table(Smoke, W.Hnd))
W.Hnd
Smoke Left Right
Heavy 0.004255319 0.042553191
Never 0.055319149 0.744680851
Occas 0.012765957 0.068085106
Regul 0.004255319 0.068085106
# таблица с редови проценти
prop.table(table(Smoke, W.Hnd), 1)
W.Hnd
Smoke Left Right
Heavy 0.09090909 0.90909091
Never 0.06914894 0.93085106
Occas 0.15789474 0.84210526
Regul 0.05882353 0.94117647
# таблица с колонни проценти
prop.table(table(Smoke, W.Hnd), 2)
W.Hnd
Smoke Left Right
Heavy 0.05555556 0.04608295
Never 0.72222222 0.80645161
Occas 0.16666667 0.07373272
Regul 0.05555556 0.07373272
barplot(
table(Smoke, W.Hnd),
legend=T,
args.legend=list(
x="topleft",
inset=0.05
)
)
barplot(
table(W.Hnd, Smoke),
beside=T,
legend=T,
args.legend=list(
x="topright",
inset=0.05
)
)
Сравняване на стойности на категорийни променливи и
корелация
Ако данните са близо до “възходяща” права линия, то корелацията им е
близко до 1. Това показва, че те “растат” заедно.
Ако данните са близо до “низходяща” права линия, то корелацията им е
близко до -1. Това показва, че те “растат” противоположно.
Ако корелацията им е близо до 0, то не наблюдаваме тенденции на
линейна зависимост между тях.
# кутуя с мустаци
boxplot(Pulse ~ Smoke)
# лентова диаграма
stripchart(Pulse ~ Smoke, vertical=T)
# точкова диаграма
plot(Height, Pulse)
cor(Height, Pulse, use="complete.obs")
[1] -0.08394058
plot(Wr.Hnd, Height)
cor(Wr.Hnd, Height, use="complete.obs")
[1] 0.6009909
plot(Wr.Hnd, NW.Hnd)
cor(Wr.Hnd, NW.Hnd, use="complete.obs")
[1] 0.9483103
# преобразуваме данните, за да получим отрицателна корелация
plot(Wr.Hnd, -1 * NW.Hnd)
cor(Wr.Hnd, -1 * NW.Hnd, use="complete.obs")
[1] -0.9483103
Проверка на хипотези при една извадка
z-тест за средно
Използваме z-тест за средно, когато искаме да сравним наблюдаваната
средна стойност на случайни величини с предварително зададена стойност.
Дисперсията на случайните величини е известна.
Пример
Фирма произвежда електрически крушки. Средното време на живот на една
крушка е 2000 часа със стандартно отклонение 300 часа. Предложен е нов
тип крушки. Изпробвани са 100 крушки от новия тип. Резултатите показват
средно време на живот на новите крушки 2100 часа и същото стандартно
отклонение. Може ли да се твърди, че средното време на живот на новия
тип крушки е повече от 2000 часа?
# H_0: mu = 2000
# H_1: mu > 2000
x.bar <- 2100
n <- 100
sigma <- 300
mu <- 2000
# пресмятаме наблюдаваната стойност
z.obs <- (x.bar - mu) / (sigma/sqrt(n))
# P(X <= 2000) = pnorm(z.obs)
# P(X > 2000) = 1 - pnorm(z.obs)
p.value <- 1 - pnorm(z.obs)
# p-стойността е по-малка от 0,05
# -> отхвърляме H_0 в полза на H_1]
# -> времето на живот е повече от 2000
p.value
[1] 0.0004290603
t-тест за средно
Използваме t-тест за средно, когато искаме да сравним наблюдаваната
средна стойност на случайни величини с предварително зададена стойност.
Дисперсията на случайните величини е неизвестна.
Пример
Според исторически данни, средната киселинност на дъждовете в
определен индустриален район е 5.2. За да се провери има ли изменение в
тази стойност е измерена киселинността на 12 валежа през изминалата
година. Получени са следните резултати:
6.1 5.4 4.8 5.8 6.6 5.3 6.1 4.4 3.9 6.8 6.5 6.3
От предишни изследвания е известно, че киселинността на валежите има
нормално разпределение. Имаме ли основания да твърдим, че киселинността
в района се е променила в сравнение с историческите данни?
# H_0: mu = 5.2
# H_1: mu =\= 5.2
x <- c(6.1, 5.4, 4.8, 5.8, 6.6, 5.3, 6.1, 4.4, 3.9, 6.8, 6.5, 6.3)
t.test(x, mu=5.2)
One Sample t-test
data: x
t = 1.7556, df = 11, p-value = 0.1069
alternative hypothesis: true mean is not equal to 5.2
95 percent confidence interval:
5.081616 6.251717
sample estimates:
mean of x
5.666667
# p-стойността е по-голяма от 0.05
# -> не отхвърляме H_0
# -> средната стойност не се е променила
t.test(x, mu=5.2)$p.value
[1] 0.1069226
z-тест за пропорция
Използваме z-тест за пропроция, когато имаме Бернулиеви
опити (с резултат “успех” или “неуспех”), всеки от които с
вероятност за успех p. Предполагаме, че имаме “успех” в X% от
случаите. Искаме да проверим дали предположението ни отговаря
на действителността.
Пример
Известно е, че при 10% от колите от дадена марка се появява сериозен
дефект по време на гаранционния срок. От първите 25000 продадени коли от
нов модел, 2700 се оказали с дефект. Може ли да се твърди, че
вероятността в кола от новия модел да се появи дефект не е 10%?
# H_0: p = 0.1
# H_1: p =\= 0.1
prop.test(x=2700, n=25000, p=0.1, correct=F)
1-sample proportions test without continuity correction
data: 2700 out of 25000, null probability 0.1
X-squared = 17.778, df = 1, p-value = 2.483e-05
alternative hypothesis: true p is not equal to 0.1
95 percent confidence interval:
0.1042126 0.1119078
sample estimates:
p
0.108
# p-стойността е по-малка от 0.05
# -> отхвърляме H_0 в полза на H_1
# -> вероятността не е 10%
prop.test(x=2700, n=25000, p=0.1, correct=F)$p.value
[1] 2.482661e-05
Проверка на хипотези при две извадки
t-тест за разлика на средни
Използваме t-тест за разлика на средни, когато имаме 2 независими
извадки, чиито средни искаме да сравним.
Пример
Мениджър обмисля въвеждане на допълнителна 15-минутна почивка за
работниците си. За да разбере дали такава почивка ще намали броя на
грешките, които правят работниците, избрал случайно 2 групи по 10 души.
Първата група имала допълнителна почивка, а втората работила по
обичайното работно време. Данните за броя на допуснатите грешки от двете
групи са следните:
Група 1: 8, 7, 5, 8, 10, 9, 7, 8, 4, 5
Група 2: 7, 6, 14, 12, 13, 8, 9, 6, 10, 9
Приемаме, че данните са приблизително нормално разпределени. Може ли
да се заключи, че работниците с допълнителна почивка правят средно
по-малко грешки?
# H_0: mu_X = mu_Y
# H_1: mu_X < mu_Y
x <- c(8, 7, 5, 8, 10, 9, 7, 8, 4, 5)
y <- c(7, 6, 14, 12, 13, 8, 9, 6, 10, 9)
t.test(x, y, alt="less")
Welch Two Sample t-test
data: x and y
t = -2.1264, df = 15.78, p-value = 0.02481
alternative hypothesis: true difference in means is less than 0
95 percent confidence interval:
-Inf -0.4099189
sample estimates:
mean of x mean of y
7.1 9.4
# p-стойността е по-малка от 0.05
# -> отхвърляме H_0 в полза на H_1
# -> средното на група 1 е по-малко от това на група 2
t.test(x, y, alt="less")$p.value
[1] 0.02480789
t-тест при зависими извадки
t-тест, който използваме, когато имаме 2 зависими извадки (т.е. на
всеки елемент от 1-вата извадка съответства елемент от втората - двойки
наблюдения), чиито средни искаме да сравним.
Пример
За да се изследва ефекта на диета върху нивото на холестерол в кръвта
са избрани 15 мъже на възраст между 35 и 50 години. Нивото на
холестерола на всеки участник е измерено преди започване на диетата и
три месеца след прилагане на диетата. Данните са следните:
Участник Преди След
1 265 229
2 240 231
3 258 227
4 295 240
5 251 238
6 245 241
7 287 234
8 314 256
9 260 247
10 279 239
11 283 246
12 240 218
13 238 219
14 225 226
15 247 233
Приемаме, че нивото на холестерол е нормално разпределено. Дали тези
данни дават основание да се твърди, че диетата намалява нивото на
холестерол в средно?
# H_0: mu_X = mu_Y
# H_1: mu_X > mu_Y
x <- c(265,240,258,295,251,245,287,314,260,279,283,240,238,225,247)
y <- c(229,231,227,240,238,241,234,256,247,239,246,218,219,226,233)
t.test(x, y, alt="greater", paired=T)
Paired t-test
data: x and y
t = 5.4659, df = 14, p-value = 4.158e-05
alternative hypothesis: true mean difference is greater than 0
95 percent confidence interval:
18.20922 Inf
sample estimates:
mean difference
26.86667
# p-стойността е по-малка от 0.05
# -> отхвърляме H_0 в полза на H_1
# -> средното "Преди" е по-малко от това "След"
t.test(x, y, alt="greater", paired=T)$p.value
[1] 4.157964e-05
z-тест за разлика на пропорции
Използваме z-тест за разлика на пропорции, когато имаме 2 независими
извадки, показващи резултати от Бернулиеви опити (т.е. всеки един
елемент от извадката да е булева стойност), и искаме да сравним
пропорциите на “успех” в двете извадки.
Пример
В проучване участвали 220 жени и 210 мъже. Според резултатите, 71
жени и 58 мъже отговорили, че предпочитат безкофеиново кафе. Може ли да
твърдим, че процентът на жените, предпочитащи безкофеиново кафе, е
различен от процентът на мъжете, предпочитащи безкофеиново кафе?
# H_0: p_X = p_Y
# H_1: p_X =\= p_Y
# брой "успехи" във всяка от извадките
x <- c(71,58)
# съответстващ общ брой наблюдения във всяка от извадките
n <- c(220,210)
prop.test(x, n, correct=F)
2-sample test for equality of proportions without continuity correction
data: x out of n
X-squared = 1.108, df = 1, p-value = 0.2925
alternative hypothesis: two.sided
95 percent confidence interval:
-0.03991226 0.13298585
sample estimates:
prop 1 prop 2
0.3227273 0.2761905
# p-стойността е по-голяма от 0.05
# -> не отхвърляме H_0
# -> процентът на жените, пиещи безкофеиново кафе, не е по-голям от този на мъжете
prop.test(x, n, correct=F)$p.value
[1] 0.292513
Доверителни интервали
Доверителен интервал за средно при известна
дисперсия
Намираме доверителен интервал за средното независими и
еднакво разпределени случайни величини. Дисперсията трябва да е
известна.
Пример
Фирма произвежда електрически крушки. Средното време на живот на една
крушка е 2000 часа със стандартно отклонение 300 часа. Предложен е нов
тип крушки. Изпробвани са 100 крушки от новия тип. Резултатите показват
средно време на живот на новите крушки 2100 часа и същото стандартно
отклонение. Намерете 95-процентен доверителен интервал за средното време
на живот на новия тип крушки.
z1.ci <- function(x.bar, sigma, n, alpha) {
b1 <- x.bar - qnorm(1-alpha/2)*(sigma/sqrt(n))
b2 <- x.bar + qnorm(1-alpha/2)*(sigma/sqrt(n))
c(b1, b2)
}
z1.ci(x.bar=2100, sigma=300, n=100, alpha=0.05)
[1] 2041.201 2158.799
Доверителен интервал за средно при неизвестна
дисперсия
Намираме доверителен интервал за средното независими и
еднакво разпределени случайни величини. Дисперсията трябва да е
неизвестна.
Пример
Според исторически данни, средната киселинност на дъждовете в
определен индустриален район е 5.2. За да се провери има ли изменение в
тази стойност е измерена киселинността на 12 валежа през изминалата
година. Получени са следните резултати:
6.1 5.4 4.8 5.8 6.6 5.3 6.1 4.4 3.9 6.8 6.5 6.3
Намерете 99-процентен доверителен интервал за средната
киселинност.
x <- c(6.1, 5.4, 4.8, 5.8, 6.6, 5.3, 6.1, 4.4, 3.9, 6.8, 6.5, 6.3)
t.test(x, conf.level=0.99)$conf.int[1:2]
[1] 4.841103 6.492230
Доверителен интервал за пропорция
Намираме доверителен интервал за процента успехи при
Бернулиеви опити.
Пример
От първите 25000 продадени коли от нов модел, 2700 се оказали с
дефект. Намерете 95-процентен доверителен интервал за вероятността кола
от новия модел да е дефектна.
prop.test(x=2700, n=25000, conf.level=0.95, correct=F)$conf.int[1:2]
[1] 0.1042126 0.1119078
Доверителен интервал за медиана
Пример
Направено е проучване с цел да се изследва ефектът на звука от
сърдечния ритъм на майката върху новороденото. Бебетата в родилно
отделение са разделени на две групи. Първата група е непрекъснато
изложена на звука от сърдечния ритъм на възрастен, а втората група не е
изложена на такъв звук. Измерена е промяната в теглото на бебетата от
раждането до четвъртия ден. Данните са във файла salk.txt . Намерете
95-процентен доверителен интервал за медианата на промяната в теглото на
бебетата (за първата и за втората група).
med1.ci <- function(x, alpha=0.05, nboot=1000) {
x <- x[is.finite(x)]
nx <- length(x)
est1 <- median(x)
med1.bt <- replicate( nboot, median( sample( x, size=nx, replace=TRUE ) ) )
ci <- quantile( med1.bt, probs=c(alpha/2, 1-alpha/2), names=FALSE )
list( est.med1=est1, ci=ci )
}
Доверителен интервал за разлика на медиани
Пример
Направено е проучване с цел да се изследва ефектът на звука от
сърдечния ритъм на майката върху новороденото. Бебетата в родилно
отделение са разделени на две групи. Първата група е непрекъснато
изложена на звука от сърдечния ритъм на възрастен, а втората група не е
изложена на такъв звук. Измерена е промяната в теглото на бебетата от
раждането до четвъртия ден. Данните са във файла salk.txt . Намерете
95-процентен доверителен интервал за медианата на промяната в теглото на
бебетата (за първата и за втората група).
med2.ci <- function(x, y, alpha=0.05, nboot=1000) {
x <- x[is.finite(x)]
y <- y[is.finite(y)]
nx <- length(x)
ny <- length(y)
est1 <- median(x)
est2 <- median(y)
est.dif <- est1 - est2
med1.bt <- replicate( nboot, median( sample( x, size=nx, replace=TRUE ) ) )
med2.bt <- replicate( nboot, median( sample( y, size=ny, replace=TRUE ) ) )
dif.bt <- med1.bt - med2.bt
ci <- quantile( dif.bt, probs=c(alpha/2, 1-alpha/2), names=FALSE )
list( est.med1=est1, est.med2=est2, est.dif=est.dif, ci=ci )
}
LS0tDQp0aXRsZTogIkNoZWF0c2hlZXQiDQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sNCi0tLQ0KDQojIyDQodC70YPRh9Cw0LnQvdC4INC10LrRgdC/0LXRgNC40LzQtdC90YLQuA0KDQoqKtCY0LfQsdC+0YAg0L3QsCDRgdC70YPRh9Cw0LnQvdC4INC10LvQtdC80LXQvdGC0Lgg0L7RgiDQstC10LrRgtC+0YAg0YEg0LLRgNGK0YnQsNC90LU6KioNCmBgYHtyfQ0KICAgIHNhbXBsZSh4PTE6NSwgc2l6ZT0zLCByZXBsYWNlPVQpDQpgYGANCg0KKirQmNC30LHQvtGAINC90LAg0YHQu9GD0YfQsNC50L3QuCDQtdC70LXQvNC10L3RgtC4INC+0YIg0LLQtdC60YLQvtGAINCx0LXQtyDQstGA0YrRidCw0L3QtToqKg0KYGBge3J9DQogICAgc2FtcGxlKHg9MTo1LCBzaXplPTMsIHJlcGxhY2U9RikNCmBgYA0KDQoqKtCT0LXQvdC10YDQuNGA0LDQvdC1INC90LAg0L/QtdGA0LzRg9GC0LDRhtC40Y86KioNCmBgYHtyfQ0KICAgIHggPC0gMTo1DQogICAgc2FtcGxlKHgsIGxlbmd0aCh4KSwgcmVwbGFjZT1GKQ0KYGBgDQoqKtCd0LDQvNC40YDQsNC90LUg0L3QsCDRh9C10YHRgtC+0YLQsCDQvdCwINGB0YrQsdC40YLQuNC1ICjQv9GA0LjQsdC70LjQt9C40YLQtdC70L3QsCDQstC10YDQvtGP0YLQvdC+0YHRgik6KioNCg0K0JIg0L7RgtC00LXQuyDQvdCwINGE0LjRgNC80LAg0YDQsNCx0L7RgtGP0YIgMjAg0YfQvtCy0LXQutCwLiDQl9CwINCa0L7Qu9C10LTQsCDRgtC1INGA0LXRiNCw0LLQsNGCINC00LAg0YHQuCDRgNCw0LfQvNC10L3Rj9GCDQrQv9C+0LTQsNGA0YrRhtC4LiDQkiDQutGD0YLQuNGPINGB0LvQsNCz0LDRgiAyMCDQu9C40YHRgtGH0LXRgtCwLCDQvdCwINCy0YHRj9C60L4g0L7RgiDQutC+0LjRgtC+INC40LzQsCDQtdC00L3QviDQuNC80LUuINCS0YHQtdC60Lgg0YLQtdCz0LvQuCDQu9C40YHRgtGH0LUNCijQsdC10Lcg0LTQsCDQs9C+INCy0YDRitGJ0LApINC4INC/0L7QtNCw0YDRj9Cy0LAg0L3QsCDRgtC+0LfQuCwg0YfQuNC10YLQviDQuNC80LUg0LUg0LjQt9GC0LXQs9C70LjQuy4g0JrQsNC60LLQsCDQtSDQstC10YDQvtGP0YLQvdC+0YHRgtGC0LAg0L/QvtC90LUNCtC10LTQuNC9INC00LAg0LjQt9GC0LXQs9C70Lgg0YHQstC+0LXRgtC+INC40LzQtT8NCg0KYGBge3J9DQpzaW0gPC0gZnVuY3Rpb24obnVtX3Blb3BsZSkgew0KICAgIHggPC0gc2FtcGxlKCAxOm51bV9wZW9wbGUsIG51bV9wZW9wbGUsIHJlcGxhY2U9RiApICMgcGVybXV0ZQ0KICAgIGQgPC0geCAtIDE6bnVtX3Blb3BsZSAjIGRpZmYgYmV0d2VlbiBwZXJzb25hbCBhbmQgcmVjZWl2ZWQgbnVtYmVyDQogICAgYW55KGQ9PTApICMgY2hlY2sgaWYgZm9yIGFueSB0aGVyZSBpcyBubyBkaWZmIGJldHdlZW4gdGhlIHR3byBudW1iZXJzDQp9DQoNCnByb2IgPC0gZnVuY3Rpb24odGltZXMsIG51bV9wZW9wbGUpIHsNCiAgICByZXN1bHQgPC0gcmVwbGljYXRlKHRpbWVzLCBzaW0obnVtX3Blb3BsZSkpDQogICAgc3VtKHJlc3VsdCkvbGVuZ3RoKHJlc3VsdCkNCn0NCg0KcHJvYigxMDAwMDAsIDIwKQ0KYGBgDQoqKtCj0YHQu9C+0LLQvdCwINCy0LXRgNC+0Y/RgtC90L7RgdGCOioqDQoNCtCY0LzQsNC80LUgMyDQutCw0YDRgtC4OiDQv9GK0YDQstCw0YLQsCDQtSDQsdGP0LvQsCDQvtGCINC00LLQtdGC0LUg0YHRgtGA0LDQvdC4LCDQstGC0L7RgNCw0YLQsCDQtSDRh9C10YDQvdCwINC+0YIg0LTQstC10YLQtQ0K0YHRgtGA0LDQvdC4LCDQsCDRgtGA0LXRgtCw0YLQsCDQtSDQsdGP0LvQsCDQvtGCINC10LTQvdCw0YLQsCDQuCDRh9C10YDQvdCwINC+0YIg0LTRgNGD0LPQsNGC0LAg0YHRgtGA0LDQvdCwLiDQktGB0Y/QutCwINC60LDRgNGC0LAg0LUg0L/QvtGB0YLQsNCy0LXQvdCwINCyDQrQt9Cw0YLQstC+0YDQtdC90LAg0LrRg9GC0LjRjy4g0JjQt9Cx0LjRgNCw0LzQtSDQv9GA0L7QuNC30LLQvtC70L3QsCDQutGD0YLQuNGPLCDQvtGC0LLQsNGA0Y/QvNC1INGPINC4INCy0LjQttC00LDQvNC1LCDRh9C1INCz0L7RgNC90LDRgtCwINGB0YLRgNCw0L3QsA0K0L3QsCDQutCw0YDRgtCw0YLQsCDQsiDQvdC10Y8g0LUg0LHRj9C70LAuINCa0LDQutCy0LAg0LUg0LLQtdGA0L7Rj9GC0L3QvtGB0YLRgtCwINC00YDRg9Cz0LDRgtCwINGB0YLRgNCw0L3QsCDQvdCwINC60LDRgNGC0LDRgtCwINGB0YrRidC+INC00LAg0LUg0LHRj9C70LA/DQoNCmBgYHtyfQ0Kc2ltIDwtIGZ1bmN0aW9uKCkgew0KICAgIGNhcmRzIDwtIHNhbXBsZShjKCJiYiIsICJ3dyIsICJidyIpLCAxKQ0KICAgIHNpZGUgPC0gc2FtcGxlKDE6MiwgMSApDQogICAgdXAgPC0gc3Vic3RyKGNhcmRzLCBzdGFydD1zaWRlLCBzdG9wPXNpZGUpDQogICAgYyh1cCwgY2FyZHMpDQp9DQoNCnByb2IgPC0gZnVuY3Rpb24odGltZXMpIHsNCiAgICByZXN1bHQgPC0gcmVwbGljYXRlKHRpbWVzLCBzaW0oKSkNCiAgICBzdW0ocmVzdWx0WzIsXT09Ind3IikgLyBzdW0ocmVzdWx0WzEsXT09InciKQ0KfQ0KDQpwcm9iKDEwMDAwMCkNCmBgYA0KIyMg0KHQu9GD0YfQsNC50L3QuCDQstC10LvQuNGH0LjQvdC4DQoNCiMjIyDQlNC40YHQutGA0LXRgtC90Lgg0YHQu9GD0YfQsNC50L3QuCDQstC10LvQuNGH0LjQvdC4DQoNCioq0JHQtdGA0L3Rg9C70LjQtdCy0L4g0YDQsNC30L/RgNC10LTQtdC70LXQvdC40LUqKg0KDQpYIC0gKtCx0YDQvtC5INGD0YHQv9C10YXQuCoNCg0KYGBge3J9DQpzdWNjZXNzZXMgPC0gMTANCnRyaWVzIDwtIDIwDQpzdWNjZXNzX3Byb2JhYmlsaXR5IDwtIDAuNQ0KbnVtYmVyX29ic2VydmF0aW9ucyA8LSAxMA0KDQojIFAoWCA9IHN1Y2Nlc3NlcykNCmRiaW5vbShzdWNjZXNzZXMsIHRyaWVzLCBzdWNjZXNzX3Byb2JhYmlsaXR5KQ0KDQojIFAoWCA8PSBzdWNjZXNzZXMpDQpwYmlub20oc3VjY2Vzc2VzLCB0cmllcywgc3VjY2Vzc19wcm9iYWJpbGl0eSkNCg0KIyBnZW5lcmF0ZSBudW1iZXJfb2JzZXJ2YXRpb25zIG51bWJlcnMgZnJvbSB0aGUgQmlub21pYWwgZGlzdHJpYnV0aW9uDQpyYmlub20obnVtYmVyX29ic2VydmF0aW9ucywgdHJpZXMsIHN1Y2Nlc3NfcHJvYmFiaWxpdHkpDQpgYGANCg0KKirQk9C10L7QvNC10YLRgNC40YfQvdC+INGA0LDQt9C/0YDQtdC00LXQu9C10L3QuNC1KioNCg0KWCAtICrQsdGA0L7QuSDQvtC/0LjRgtC4INC00L4g0YPRgdC/0LXRhSoNCg0KYGBge3J9DQp0cmllcyA8LSAyDQpzdWNjZXNzX3Byb2JhYmlsaXR5IDwtIDAuNQ0KbnVtYmVyX29ic2VydmF0aW9ucyA8LSAxMA0KDQojIFAoWCA9IHRyaWVzKQ0KZGdlb20odHJpZXMgLSAxLCBzdWNjZXNzX3Byb2JhYmlsaXR5KQ0KDQojIFAoWCA8PSB0cmllcykNCnBnZW9tKHRyaWVzIC0gMSwgc3VjY2Vzc19wcm9iYWJpbGl0eSkNCg0KIyBnZW5lcmF0ZSBudW1iZXJfb2JzZXJ2YXRpb25zIG51bWJlcnMgZnJvbSB0aGUgR2VvbWV0cmljIGRpc3RyaWJ1dGlvbg0Kcmdlb20obnVtYmVyX29ic2VydmF0aW9ucywgc3VjY2Vzc19wcm9iYWJpbGl0eSkgKyAxDQpgYGANCg0KWCAtICrQsdGA0L7QuSDQvdC10YPRgdC/0LXRhdC4INC/0YDQtdC00Lgg0L/RitGA0LLQuCDRg9GB0L/QtdGFKg0KDQpgYGB7cn0NCnRyaWVzIDwtIDINCnN1Y2Nlc3NfcHJvYmFiaWxpdHkgPC0gMC41DQpudW1iZXJfb2JzZXJ2YXRpb25zIDwtIDEwDQoNCiMgUChYID0gdHJpZXMpDQpkZ2VvbSh0cmllcywgc3VjY2Vzc19wcm9iYWJpbGl0eSkNCg0KIyBQKFggPD0gdHJpZXMpDQpwZ2VvbSh0cmllcywgc3VjY2Vzc19wcm9iYWJpbGl0eSkNCg0KIyBnZW5lcmF0ZSBudW1iZXJfb2JzZXJ2YXRpb25zIG51bWJlcnMgZnJvbSB0aGUgR2VvbWV0cmljIGRpc3RyaWJ1dGlvbg0Kcmdlb20obnVtYmVyX29ic2VydmF0aW9ucywgc3VjY2Vzc19wcm9iYWJpbGl0eSkNCmBgYA0KDQoqKtCe0YLRgNC40YbQsNGC0LXQu9C90L4g0LHQuNC90L7QvNC90L4g0YDQsNC30L/RgNC10LTQtdC70LXQvdC40LUqKg0KDQpYIC0gKtCx0YDQvtC5INC+0L/QuNGC0Lgg0L/RgNC10LTQuCByLdGC0Lgg0YPRgdC/0LXRhSDQstC60LvRjtGH0LjRgtC10LvQvdC+Kg0KDQpgYGB7cn0NCnN1Y2Nlc3NlcyA8LSAxMA0KdHJpZXMgPC0gMjANCnN1Y2Nlc3NfcHJvYmFiaWxpdHkgPC0gMC41DQpudW1iZXJfb2JzZXJ2YXRpb25zIDwtIDEwDQoNCiMgUChYID0gdHJpZXMpDQpkbmJpbm9tKHRyaWVzIC0gc3VjY2Vzc2VzLCBzdWNjZXNzZXMsIHN1Y2Nlc3NfcHJvYmFiaWxpdHkpDQoNCiMgUChYIDw9IHRyaWVzKQ0KcG5iaW5vbSh0cmllcyAtIHN1Y2Nlc3Nlcywgc3VjY2Vzc2VzLCBzdWNjZXNzX3Byb2JhYmlsaXR5KQ0KDQojIGdlbmVyYXRlIG51bWJlcl9vYnNlcnZhdGlvbnMgbnVtYmVycyBmcm9tIHRoZSBOZWdhdGl2ZSBCaW5vbWlhbCBkaXN0cmlidXRpb24NCnJuYmlub20obnVtYmVyX29ic2VydmF0aW9ucywgc3VjY2Vzc2VzLCBzdWNjZXNzX3Byb2JhYmlsaXR5KSArIHN1Y2Nlc3Nlcw0KYGBgDQoNClggLSAq0LHRgNC+0Lkg0L3QtdGD0YHQv9C10YXQuCDQv9GA0LXQtNC4IHIt0YLQuCDRg9GB0L/QtdGFKg0KDQpgYGB7cn0NCnN1Y2Nlc3NlcyA8LSAxMA0KZmFpbHVyZXMgPC0gMTANCnN1Y2Nlc3NfcHJvYmFiaWxpdHkgPC0gMC41DQpudW1iZXJfb2JzZXJ2YXRpb25zIDwtIDEwDQoNCiMgUChYID0gZmFpbHVyZXMpDQpkbmJpbm9tKGZhaWx1cmVzLCBzdWNjZXNzZXMsIHN1Y2Nlc3NfcHJvYmFiaWxpdHkpDQoNCiMgUChYIDw9IHRyaWVzKQ0KcG5iaW5vbShmYWlsdXJlcywgc3VjY2Vzc2VzLCBzdWNjZXNzX3Byb2JhYmlsaXR5KQ0KDQojIGdlbmVyYXRlIG51bWJlcl9vYnNlcnZhdGlvbnMgbnVtYmVycyBmcm9tIHRoZSBOZWdhdGl2ZSBCaW5vbWlhbCBkaXN0cmlidXRpb24NCnJuYmlub20obnVtYmVyX29ic2VydmF0aW9ucywgc3VjY2Vzc2VzLCBzdWNjZXNzX3Byb2JhYmlsaXR5KQ0KYGBgDQoNCioq0KXQuNC/0LXRgNCz0LXQvtC80LXRgtGA0LjRh9C90L4g0YDQtdC30L/RgNC10LTQtdC70LXQvdC40LUqKg0KDQpOIC0gKtC+0LHRiSDQsdGA0L7QuSDRgtC+0L/QutC4Kg0KDQpNIC0gKtCx0YDQvtC5INCx0LXQu9C4INGC0L7Qv9C60LgqDQoNClggLSAq0LHRgNC+0Lkg0LjQt9Cy0LDQtNC10L3QuCDQsdC10LvQuCDRgtC+0L/QutC4ICjQv9GA0Lgg0LjQt9Cy0LDQtNC10L3QuCBMINCx0LXQtyDQstGA0YrRidCw0L3QtSkqDQoNCmBgYHtyfQ0KY2hvc2VuX3doaXRlIDwtIDUNCndoaXRlIDwtIDEwDQphbGwgPC0gMjANCnRyaWVzIDwtIDEwDQpudW1iZXJfb2JzZXJ2YXRpb25zIDwtIDEwDQoNCiMgUChYID0gY2hvc2VuX3doaXRlKQ0KZGh5cGVyKGNob3Nlbl93aGl0ZSwgd2hpdGUsIGFsbCAtIHdoaXRlLCB0cmllcykNCg0KIyBQKFggPD0gY2hvc2VuX3doaXRlKQ0KcGh5cGVyKGNob3Nlbl93aGl0ZSwgd2hpdGUsIGFsbCAtIHdoaXRlLCB0cmllcykNCg0KIyBnZW5lcmF0ZSBudW1iZXJfb2JzZXJ2YXRpb25zIG51bWJlcnMgZnJvbSB0aGUgSHlwZXJnZW9tZXRyaWMgZGlzdHJpYnV0aW9uDQpyaHlwZXIobnVtYmVyX29ic2VydmF0aW9ucywgd2hpdGUsIGFsbCAtIHdoaXRlLCB0cmllcykNCmBgYA0KDQoqKtCf0L7QsNGB0L7QvdC+0LLQviDRgNCw0LfQv9GA0LXQtNC10LvQtdC90LjQtSoqDQoNClggLSAqKtCx0YDQvtC5INGB0LvRg9GH0LLQsNC90LjRjyDQvdCwINGB0YrQsdC40YLQuNC10YLQvioqDQoNCmBgYHtyfQ0Kb2NjdXJlbmNlcyA8LSAxDQpyYXRlIDwtIDAuNg0KbnVtYmVyX29ic2VydmF0aW9ucyA8LSAxMA0KDQojIFAoWCA9IG9jY3VyZW5jZXMpDQpkcG9pcyhvY2N1cmVuY2VzLCByYXRlKQ0KDQojIFAoWCA8PSBvY2N1cmVuY2VzKQ0KcHBvaXMob2NjdXJlbmNlcywgcmF0ZSkNCg0KIyBnZW5lcmF0ZSBudW1iZXJfb2JzZXJ2YXRpb25zIG51bWJlcnMgZnJvbSB0aGUgUG9pc3NvbiBkaXN0cmlidXRpb24NCnJwb2lzKG51bWJlcl9vYnNlcnZhdGlvbnMsIHJhdGUpDQpgYGANCg0KIyMjINCd0LXQv9GA0LXQutGK0YHQvdCw0YLQuCDRgdC70YPRh9Cw0LnQvdC4INCy0LXQu9C40YfQuNC90LgNCg0KKirQoNCw0LLQvdC+0LzQtdGA0L3QviDRgNCw0LfQv9GA0LXQtNC10LvQtdC90LjQtSoqDQoNCg0KYGBge3J9DQptaW4gPC0gMA0KbWF4IDwtIDEwDQp4IDwtIDQNCnAgPC0gMC41DQpudW1iZXJfb2JzZXJ2YXRpb25zIDwtIDUNCg0KIyBmKHgpDQpkdW5pZih4LCBtaW4sIG1heCkNCg0KIyBQKFggPD0geCkNCnB1bmlmKHgsIG1pbiwgbWF4KQ0KDQojIFEoeCkNCnF1bmlmKHAsIG1pbiwgbWF4KQ0KDQojIGdlbmVyYXRlIG51bWJlcl9vYnNlcnZhdGlvbnMgbnVtYmVycyBmcm9tIHRoZSBVbmlmb3JtIGRpc3RyaWJ1dGlvbg0KcnVuaWYobnVtYmVyX29ic2VydmF0aW9ucywgbWluLCBtYXgpDQpgYGANCioq0JXQutGB0L/QvtC90LXQvdGG0LjQsNC70L3QviDRgNCw0LfQv9GA0LXQtNC10LvQtdC90LjQtSoqDQoNCg0K0JIg0YLQtdC+0YDQuNGP0YLQsCDQvdCwINCy0LXRgNC+0Y/RgtC90L7RgdGC0LjRgtC1INC4INGB0YLQsNGC0LjRgdGC0LjQutCw0YLQsCwg0LXQutGB0L/QvtC90LXQvdGG0LjQsNC70L3QvtGC0L4g0YDQsNC30L/RgNC10LTQtdC70LXQvdC40LUg0LUg0YDQsNC30L/RgNC10LTQtdC70LXQvdC40LUg0L3QsCAqKtCy0YDQtdC80LXRgtC+INC80LXQttC00YMg0YHRitCx0LjRgtC40Y/RgtCwKiog0LIg0L/RgNC+0YbQtdGBINC90LAg0YLQvtGH0LrQsCDQvdCwINCf0L7QsNGB0L7QvSwg0YIu0LUuINC/0YDQvtGG0LXRgSwg0L/RgNC4INC60L7QudGC0L4gKirRgdGK0LHQuNGC0LjRj9GC0LAg0YHQtSDRgdC70YPRh9Cy0LDRgiDQvdC10L/RgNC10LrRitGB0L3QsNGC0L4g0Lgg0L3QtdC30LDQstC40YHQuNC80L4qKiDRgSDQv9C+0YHRgtC+0Y/QvdC90LAg0YHRgNC10LTQvdCwINGB0LrQvtGA0L7RgdGCLg0KDQpgYGB7cn0NCnJhdGUgPC0gMC41DQp4IDwtIDQNCnAgPC0gMC41DQpudW1iZXJfb2JzZXJ2YXRpb25zIDwtIDUNCg0KIyBmKHgpDQpkZXhwKHgsIHJhdGUpDQoNCiMgUChYIDw9IHgpDQpwZXhwKHgsIHJhdGUpDQoNCiMgUSh4KQ0KcWV4cChwLCByYXRlKQ0KDQojIGdlbmVyYXRlIG51bWJlcl9vYnNlcnZhdGlvbnMgbnVtYmVycyBmcm9tIHRoZSBFeHBvbmVudGlhbCBkaXN0cmlidXRpb24NCnJleHAobnVtYmVyX29ic2VydmF0aW9ucywgcmF0ZSkNCmBgYA0KDQoqKtCd0L7RgNC80LDQu9C90L4g0YDQsNC30L/RgNC10LTQtdC70LXQvdC40LUqKg0KDQpgYGB7cn0NCm1lYW4gPC0gNQ0Kc3RhbmRhcmRfZGV2aWF0aW9uIDwtIDINCnggPC0gNg0KcCA8LSAwLjUNCm51bWJlcl9vYnNlcnZhdGlvbnMgPC0gNQ0KDQojIGYoeCkNCmRub3JtKHgsIG1lYW4sIHN0YW5kYXJkX2RldmlhdGlvbikNCg0KIyBQKFggPD0geCkNCnBub3JtKHgsIG1lYW4sIHN0YW5kYXJkX2RldmlhdGlvbikNCg0KIyBRKHgpDQpxbm9ybShwLCBtZWFuLCBzdGFuZGFyZF9kZXZpYXRpb24pDQoNCiMgZ2VuZXJhdGUgbnVtYmVyX29ic2VydmF0aW9ucyBudW1iZXJzIGZyb20gdGhlIE5vcm1hbCBkaXN0cmlidXRpb24NCnJub3JtKG51bWJlcl9vYnNlcnZhdGlvbnMsIG1lYW4sIHN0YW5kYXJkX2RldmlhdGlvbikNCmBgYA0KDQojIyDQlNCw0L3QvdC4LiDQotCw0LHQu9C40YbQuCDQuCDQs9GA0LDRhNC40LrQuA0KDQojIyMg0JTQsNC90L3QuCDQvtGCINGC0LXRgdGCDQpgYGB7cn0NCmV4YW0gPC0gcmVhZC50YWJsZSgiLi4vZGF0YXNldHMvZXhhbUFCLnR4dCIsIGhlYWRlcj1UKQ0KZXhhbQ0KDQp2YXJpYW50IDwtIGV4YW0kdmFyaWFudA0KDQpjbGFzcyh2YXJpYW50KQ0KDQp0YWJsZSh2YXJpYW50KQ0KdGFibGUodmFyaWFudCkgLyBsZW5ndGgodmFyaWFudCkNCnNvcnQodGFibGUodmFyaWFudCkgLyBsZW5ndGgodmFyaWFudCksIGRlY3JlYXNpbmc9VCkNCg0KYmFycGxvdCh0YWJsZSh2YXJpYW50KSkNCmJhcnBsb3QodGFibGUodmFyaWFudCkgLyBsZW5ndGgodmFyaWFudCkpDQpiYXJwbG90KHNvcnQodGFibGUodmFyaWFudCkgLyBsZW5ndGgodmFyaWFudCksIGRlY3JlYXNpbmc9VCkpDQpwaWUodGFibGUodmFyaWFudCkpDQoNCmBgYA0KDQojIyMg0JTRgNGD0LPQuCDRh9C40YHQu9C+0LLQuCDQtNCw0L3QvdC4DQpgYGB7cn0NCndhaXQgPC0gYygyLDMsMyw1LDUsMiw3LDEwLDQsMywxLDcsMTEsMTAsNSw2LDMsOCw1LDEyLDUsMyw4LDUsNykNCg0KdGFibGUod2FpdCkNCg0Kd2FpdF9ncm91cGVkIDwtIGN1dCh3YWl0LCBicmVha3M9c2VxKDAsMTIsMikpDQp0YWJsZSh3YWl0X2dyb3VwZWQpDQp0YWJsZSh3YWl0X2dyb3VwZWQpL2xlbmd0aCh3YWl0KQ0KDQpiYXJwbG90KHRhYmxlKHdhaXRfZ3JvdXBlZCkpDQoNCmhpc3Qod2FpdCkNCmhpc3Qod2FpdCwgcHJvYmFiaWxpdHk9VCkNCmhpc3Qod2FpdCwgYnJlYWtzPXNlcSgwLCAxMiwgMykpDQoNCiMg0YXQuNGB0YLQvtCz0YDQsNC80LAg0YEg0YfQtdGB0YLQvtGC0LXQvSDQv9C+0LvQuNCz0L7QvQ0KaCA8LSBoaXN0KHdhaXQsIHByb2JhYmlsaXR5PVQpDQpsaW5lcygNCiAgICB4PWMoDQogICAgICAgIG1pbihoJGJyZWFrcyksDQogICAgICAgIGgkbWlkcywNCiAgICAgICAgbWF4KGgkYnJlYWtzKQ0KICAgICksDQogICAgeT1jKA0KICAgICAgMCwNCiAgICAgIGgkZGVuc2l0eSwNCiAgICAgIDANCiAgICApLA0KICAgIHR5cGU9ImwiLA0KICAgIGx3ZD0yLA0KICAgIGNvbD0iZGFya29yYW5nZTEiDQopDQoNCnN0cmlwY2hhcnQoDQogICAgd2FpdCwNCiAgICBtZXRob2Q9InN0YWNrIiwNCiAgICBwY2g9MjAsDQogICAgY2V4PTEuNQ0KKQ0KDQojINC00LjQsNCz0YDQsNC80LAg0LrQu9C+0L0g0YEg0LvQuNGB0YLQsCAoc3RlbS1hbmQtbGVhZiBwbG90KQ0KIyDQuNC90YLQtdGA0LLQsNC70Lg6IFswLCA0XSwgKDQsIDldLCAoOSwgMTJdDQpzdGVtKHdhaXQpDQoNCiMg0YPQstC10LvQuNGH0LDQstCw0L3QtSDQvdCwINCx0YDQvtGPINC/0L7QtNC40L3RgtC10YDQstCw0LvQuA0KIyDQuNC90YLQtdGA0LLQsNC70Lg6IFswLCAxXSAoMSwgM10gKDMsIDVdLCAoNSwgN10sICg3LCA5XSwgKDksIDExXSAoMTEsIDEzXQ0Kc3RlbSh3YWl0LCBzY2FsZT0yKQ0KDQoNCmBgYA0KDQojIyDQp9C40YHQu9C+0LLQuCDRhdCw0YDQsNC60YLQtdGA0LjRgdGC0LjQutC4INC90LAg0LTQsNC90L3QuNGC0LUNCmBgYHtyfQ0KeCA8LSBhaXJxdWFsaXR5JFRlbXANCg0KIyDRgdGA0LXQtNC90L4NCm1lYW4oeCkNCg0KIyDQvNC10LTQuNCw0L3QsA0KbWVkaWFuKHgpDQoNCiMg0YHRgtCw0L3QtNCw0YDRgtC90L4g0L7RgtC60LvQvtC90LXQvdC40LUNCnNkKHgpDQoNCiMgcC3QutCy0LDQvdGC0LjQuw0KcXVhbnRpbGUoeCwgcCkNCg0KIyBRMQ0KcXVhbnRpbGUoeCwgMC4yNSkNCiMgUTMNCnF1YW50aWxlKHgsIDAuNzUpDQoNCiMgSVFSID0gUTMgLSBRMQ0KSVFSKHgpDQoNCnN1bW1hcnkoeCkNCg0KYm94cGxvdCh4LCBob3Jpem9udGFsPVQpDQpgYGANCg0KIyMg0JzQvdC+0LPQvtC80LXRgNC90Lgg0LTQsNC90L3QuA0KDQpgYGB7cn0NCmxpYnJhcnkoTUFTUykNCj9zdXJ2ZXkNCnN0cihzdXJ2ZXkpDQoNCiMg0LjQt9Cy0LXQttC00LAg0LTQsNC90L3QuNGC0LUg0LrQsNGC0L4g0YLQsNCx0LvQuNGG0LANCiMgZml4KHN1cnZleSkNCg0Kc3VtbWFyeShzdXJ2ZXkpDQoNCiMgZXF1aWxhdm50IG5vdGF0aW9ucw0Kc3VydmV5WywgJ0FnZSddDQpzdXJ2ZXkkQWdlDQoNCiMgMTIt0YLQsCDQutC+0LvQvtC90LANCnN1cnZleVsgLDEyXQ0KDQojIDUt0YLQuCDRgNC10LQNCnN1cnZleVs1LCBdDQpgYGANCioq0JrRgNC+0YEt0YLQsNCx0LvQuNGG0LAqKg0KYGBge3J9DQphdHRhY2goc3VydmV5KQ0KDQp0YWJsZShTbW9rZSwgVy5IbmQpDQoNCiMg0L/RgNC10LzQsNGF0LLQsNC90LUg0L3QsCDQu9C40L/RgdCy0LDRidC40YLQtSDQvdCw0LHQu9GO0LTQtdC90LjRjw0KdGFibGUoU21va2UsIFcuSG5kLCB1c2VOQT0ibm8iKQ0KYGBgDQoNCioq0KHRgNCw0LLQvdGP0LLQsNC90LUg0L3QsCDRgtCw0LHQu9C40YbQuCoqDQpgYGB7cn0NCiMg0YLQsNCx0LvQuNGG0LAg0YEg0L7RgtC90L7RgdC40YLQtdC70L3QuNGPINC00Y/Quw0KcHJvcC50YWJsZSh0YWJsZShTbW9rZSwgVy5IbmQpKQ0KDQojINGC0LDQsdC70LjRhtCwINGBINGA0LXQtNC+0LLQuCDQv9GA0L7RhtC10L3RgtC4DQpwcm9wLnRhYmxlKHRhYmxlKFNtb2tlLCBXLkhuZCksIDEpDQoNCiMg0YLQsNCx0LvQuNGG0LAg0YEg0LrQvtC70L7QvdC90Lgg0L/RgNC+0YbQtdC90YLQuA0KcHJvcC50YWJsZSh0YWJsZShTbW9rZSwgVy5IbmQpLCAyKQ0KDQpiYXJwbG90KA0KICAgIHRhYmxlKFNtb2tlLCBXLkhuZCksDQogICAgbGVnZW5kPVQsDQogICAgYXJncy5sZWdlbmQ9bGlzdCgNCiAgICAgICAgeD0idG9wbGVmdCIsDQogICAgICAgIGluc2V0PTAuMDUNCiAgICApDQopDQpiYXJwbG90KA0KICAgIHRhYmxlKFcuSG5kLCBTbW9rZSksDQogICAgYmVzaWRlPVQsDQogICAgbGVnZW5kPVQsDQogICAgYXJncy5sZWdlbmQ9bGlzdCgNCiAgICAgICAgeD0idG9wcmlnaHQiLA0KICAgICAgICBpbnNldD0wLjA1DQogICAgKQ0KKQ0KYGBgDQoNCioq0KHRgNCw0LLQvdGP0LLQsNC90LUg0L3QsCDRgdGC0L7QudC90L7RgdGC0Lgg0L3QsCDQutCw0YLQtdCz0L7RgNC40LnQvdC4INC/0YDQvtC80LXQvdC70LjQstC4INC4INC60L7RgNC10LvQsNGG0LjRjyoqDQoNCtCQ0LrQviDQtNCw0L3QvdC40YLQtSDRgdCwINCx0LvQuNC30L4g0LTQviAi0LLRitC30YXQvtC00Y/RidCwIiDQv9GA0LDQstCwINC70LjQvdC40Y8sINGC0L4g0LrQvtGA0LXQu9Cw0YbQuNGP0YLQsCDQuNC8INC1INCx0LvQuNC30LrQviDQtNC+IDEuINCi0L7QstCwINC/0L7QutCw0LfQstCwLCDRh9C1INGC0LUgItGA0LDRgdGC0LDRgiIgKtC30LDQtdC00L3QviouDQoNCtCQ0LrQviDQtNCw0L3QvdC40YLQtSDRgdCwINCx0LvQuNC30L4g0LTQviAi0L3QuNC30YXQvtC00Y/RidCwIiDQv9GA0LDQstCwINC70LjQvdC40Y8sINGC0L4g0LrQvtGA0LXQu9Cw0YbQuNGP0YLQsCDQuNC8INC1INCx0LvQuNC30LrQviDQtNC+IC0xLiDQotC+0LLQsCDQv9C+0LrQsNC30LLQsCwg0YfQtSDRgtC1ICLRgNCw0YHRgtCw0YIiICrQv9GA0L7RgtC40LLQvtC/0L7Qu9C+0LbQvdC+Ki4NCg0K0JDQutC+INC60L7RgNC10LvQsNGG0LjRj9GC0LAg0LjQvCDQtSDQsdC70LjQt9C+INC00L4gMCwg0YLQviDQvdC1INC90LDQsdC70Y7QtNCw0LLQsNC80LUg0YLQtdC90LTQtdC90YbQuNC4INC90LAg0LvQuNC90LXQudC90LAg0LfQsNCy0LjRgdC40LzQvtGB0YIg0LzQtdC20LTRgyDRgtGP0YUuDQoNCmBgYHtyfQ0KIyDQutGD0YLRg9GPINGBINC80YPRgdGC0LDRhtC4DQpib3hwbG90KFB1bHNlIH4gU21va2UpDQoNCiMg0LvQtdC90YLQvtCy0LAg0LTQuNCw0LPRgNCw0LzQsA0Kc3RyaXBjaGFydChQdWxzZSB+IFNtb2tlLCB2ZXJ0aWNhbD1UKQ0KDQojINGC0L7Rh9C60L7QstCwINC00LjQsNCz0YDQsNC80LANCnBsb3QoSGVpZ2h0LCBQdWxzZSkNCmNvcihIZWlnaHQsIFB1bHNlLCB1c2U9ImNvbXBsZXRlLm9icyIpDQoNCnBsb3QoV3IuSG5kLCBIZWlnaHQpDQpjb3IoV3IuSG5kLCBIZWlnaHQsIHVzZT0iY29tcGxldGUub2JzIikNCg0KcGxvdChXci5IbmQsIE5XLkhuZCkNCmNvcihXci5IbmQsIE5XLkhuZCwgdXNlPSJjb21wbGV0ZS5vYnMiKQ0KDQojINC/0YDQtdC+0LHRgNCw0LfRg9Cy0LDQvNC1INC00LDQvdC90LjRgtC1LCDQt9CwINC00LAg0L/QvtC70YPRh9C40Lwg0L7RgtGA0LjRhtCw0YLQtdC70L3QsCDQutC+0YDQtdC70LDRhtC40Y8NCnBsb3QoV3IuSG5kLCAtMSAqIE5XLkhuZCkNCmNvcihXci5IbmQsIC0xICogTlcuSG5kLCB1c2U9ImNvbXBsZXRlLm9icyIpDQpgYGANCg0KIyMg0KbQtdC90YLRgNCw0LvQvdCwINCz0YDQsNC90LjRh9C90LAg0YLQtdC+0YDQtdC80LANCg0KKirQptC10L3RgtGA0LDQu9C90LAg0LPRgNCw0L3QuNGH0L3QsCDRgtC10L7RgNC10LzQsCoqDQoNCtCm0LXQvdGC0YDQsNC70L3QsNGC0LAg0LPRgNCw0L3QuNGH0L3QsCDRgtC10L7RgNC10LzQsCDQs9C70LDRgdC4LCDRh9C1INGA0LDQt9C/0YDQtdC00LXQu9C10L3QuNC10YLQviDQvdCwICoq0YHRgNC10LTQvdC+0YLQviDQvdCwINC40LfQstCw0LTQutCw0YLQsCDQtSDQv9GA0LjQsdC70LjQt9C40YLQtdC70L3QviDQvdC+0YDQvNCw0LvQvdC+KiosINCw0LrQviDRgNCw0LfQvNC10YDRitGCINC90LAg0LjQt9Cy0LDQtNC60LDRgtCwINC1INC00L7RgdGC0LDRgtGK0YfQvdC+INCz0L7Qu9GP0LwsINC00L7RgNC4INCw0LrQviDRgNCw0LfQv9GA0LXQtNC10LvQtdC90LjQtdGC0L4g0L3QsCDQv9C+0L/Rg9C70LDRhtC40Y/RgtCwINC90LUg0LUg0L3QvtGA0LzQsNC70L3Qvi4NCg0KDQoqKtCf0YDQuNC80LXRgCAxKioNCg0K0JLRgNC10LzQtdGC0L4g0L3QsCDQttC40LLQvtGCINC90LAg0LXQu9C10LrRgtGA0LjRh9C10YHQutCwINC60YDRg9GI0LrQsCDQvtGCINC00LDQtNC10L0g0YLQuNC/INC40LzQsCDQtdC60YHQv9C+0L3QtdC90YbQuNCw0LvQvdC+DQrRgNCw0LfQv9GA0LXQtNC10LvQtdC90LjQtSDRgdGK0YEg0YHRgNC10LTQvdC+IDkwMCDRh9Cw0YHQsC4g0JjQt9C80LXRgNC10L3QviDQtSDQstGA0LXQvNC10YLQviDQvdCwINC20LjQstC+0YIg0L3QsCAxMDAg0YHQu9GD0YfQsNC50L3QviDQuNC30LHRgNCw0L3QuA0K0LrRgNGD0YjQutC4LiDQmtCw0LrQstCwINC1INCy0LXRgNC+0Y/RgtC90L7RgdGC0YLQsCDQv9C+0LvRg9GH0LXQvdC+0YLQviDRgdGA0LXQtNC90L4g0LLRgNC10LzQtSDQtNCwINC1INC90LDQtCA5ODAg0YfQsNGB0LA/DQoNCtCY0LfQv9C+0LvQt9Cy0LDQvNC1INGC0LDQt9C4INGE0L7RgNC80YPQu9CwOg0KDQohW10oLi9pbWFnZXMvQ0xUXzEuSlBHKQ0KDQpgYGB7cn0NCmEgPC0gKDk4MC05MDApLyg5MDAvc3FydCgxMDApKQ0KDQojIFAoWCA8PSA5ODApID0gcG5vcm0oYSkNCiMgUChYID4gOTgwKSA9IDEgLSBwbm9ybShhKQ0KMSAtIHBub3JtKGEpDQpgYGANCg0KKirQn9GA0LjQvNC10YAgMioqDQoNCtCg0LXQs9C40YHRgtGA0LjRgNCw0L3QuNGP0YIg0LHQsNCz0LDQtiDQvdCwINC/0YrRgtC90LjRhtC40YLQtSDQsiDQtNCw0LTQtdC9INGB0LDQvNC+0LvQtdGCINC90LUg0YLRgNGP0LHQstCwINC00LAg0L3QsNC00LLQuNGI0LDQstCwINC+0LHRidC+IDQwMDAg0LrQsy4g0JrQvtC70LjRh9C10YHRgtCy0L7RgtC+INGA0LXQs9C40YHRgtGA0LjRgNCw0L0g0LHQsNCz0LDQtiDQvdCwINC/0YDQvtC40LfQstC+0LvQvdC+INC40LfQsdGA0LDQvSDQv9GK0YLQvdC40Log0LUg0YHQu9GD0YfQsNC50L3QsA0K0LLQtdC70LjRh9C40L3QsCDRgdGK0YEg0YHRgNC10LTQvdC+IDI0INC60LMg0Lgg0YHRgtCw0L3QtNCw0YDRgtC90L4g0L7RgtC60LvQvtC90LXQvdC40LUgNyDQutCzLiDQmtCw0LrQstCwINC1INCy0LXRgNC+0Y/RgtC90L7RgdGC0YLQsCDQvtCx0YnQvtGC0L4g0LrQvtC70LjRh9C10YHRgtCy0L4g0YDQtdCz0LjRgdGC0YDQuNGA0LDQvSDQsdCw0LPQsNC2INCyINGB0LDQvNC+0LvQtdGCINGB0YrRgSAxNjAg0L/RitGC0L3QuNGG0Lgg0LTQsCDQvdCw0LTQstC40YjQuCA0MDAwINC60LM/DQoNCtCY0LfQv9C+0LvQt9Cy0LDQvNC1INC10LrQstC40LLQsNC70LXQvdGC0L3QsCDRhNC+0YDQvNGD0LvQsDoNCg0KIVtdKC4vaW1hZ2VzL0NMVF8yLkpQRykNCg0KYGBge3J9DQphIDwtICg0MDAwIC0gMTYwKjI0KS8oNypzcXJ0KDE2MCkpDQoNCiMgUChYIDw9IDQwMDApID0gcG5vcm0oYSkNCiMgUChYID4gNDAwMCkgPSAxIC0gcG5vcm0oYSkNCjEgLSBwbm9ybShhKQ0KYGBgDQoNCiMg0J/RgNC+0LLQtdGA0LrQsCDQvdCwINGF0LjQv9C+0YLQtdC30Lgg0L/RgNC4INC10LTQvdCwINC40LfQstCw0LTQutCwDQoNCioqei3RgtC10YHRgiDQt9CwINGB0YDQtdC00L3QvioqDQoNCtCY0LfQv9C+0LvQt9Cy0LDQvNC1IHot0YLQtdGB0YIg0LfQsCDRgdGA0LXQtNC90L4sINC60L7Qs9Cw0YLQviDQuNGB0LrQsNC80LUg0LTQsCDRgdGA0LDQstC90LjQvCDQvdCw0LHQu9GO0LTQsNCy0LDQvdCw0YLQsCDRgdGA0LXQtNC90LAg0YHRgtC+0LnQvdC+0YHRgiDQvdCwINGB0LvRg9GH0LDQudC90Lgg0LLQtdC70LjRh9C40L3QuCDRgSDQv9GA0LXQtNCy0LDRgNC40YLQtdC70L3QviDQt9Cw0LTQsNC00LXQvdCwINGB0YLQvtC50L3QvtGB0YIuDQrQlNC40YHQv9C10YDRgdC40Y/RgtCwINC90LAg0YHQu9GD0YfQsNC50L3QuNGC0LUg0LLQtdC70LjRh9C40L3QuCDQtSAqKtC40LfQstC10YHRgtC90LAqKi4NCg0KIVtdKC4vaW1hZ2VzL1pfdGVzdF9tdS5KUEcpDQoNCioq0J/RgNC40LzQtdGAKioNCg0K0KTQuNGA0LzQsCDQv9GA0L7QuNC30LLQtdC20LTQsCDQtdC70LXQutGC0YDQuNGH0LXRgdC60Lgg0LrRgNGD0YjQutC4LiDQodGA0LXQtNC90L7RgtC+INCy0YDQtdC80LUg0L3QsCDQttC40LLQvtGCINC90LAg0LXQtNC90LANCtC60YDRg9GI0LrQsCDQtSAyMDAwINGH0LDRgdCwINGB0YrRgSDRgdGC0LDQvdC00LDRgNGC0L3QviDQvtGC0LrQu9C+0L3QtdC90LjQtSAzMDAg0YfQsNGB0LAuINCf0YDQtdC00LvQvtC20LXQvSDQtSDQvdC+0LIg0YLQuNC/INC60YDRg9GI0LrQuC4NCtCY0LfQv9GA0L7QsdCy0LDQvdC4INGB0LAgMTAwINC60YDRg9GI0LrQuCDQvtGCINC90L7QstC40Y8g0YLQuNC/LiDQoNC10LfRg9C70YLQsNGC0LjRgtC1INC/0L7QutCw0LfQstCw0YIg0YHRgNC10LTQvdC+INCy0YDQtdC80LUg0L3QsCDQttC40LLQvtGCDQrQvdCwINC90L7QstC40YLQtSDQutGA0YPRiNC60LggMjEwMCDRh9Cw0YHQsCDQuCDRgdGK0YnQvtGC0L4g0YHRgtCw0L3QtNCw0YDRgtC90L4g0L7RgtC60LvQvtC90LXQvdC40LUuINCc0L7QttC1INC70Lgg0LTQsCDRgdC1INGC0LLRitGA0LTQuCwg0YfQtQ0K0YHRgNC10LTQvdC+0YLQviDQstGA0LXQvNC1INC90LAg0LbQuNCy0L7RgiDQvdCwINC90L7QstC40Y8g0YLQuNC/INC60YDRg9GI0LrQuCDQtSDQv9C+0LLQtdGH0LUg0L7RgiAyMDAwINGH0LDRgdCwPw0KDQpgYGB7cn0NCiMgSF8wOiBtdSA9IDIwMDANCiMgSF8xOiBtdSA+IDIwMDANCnguYmFyIDwtIDIxMDANCm4gPC0gMTAwDQpzaWdtYSA8LSAzMDANCm11IDwtIDIwMDANCg0KIyDQv9GA0LXRgdC80Y/RgtCw0LzQtSDQvdCw0LHQu9GO0LTQsNCy0LDQvdCw0YLQsCDRgdGC0L7QudC90L7RgdGCDQp6Lm9icyA8LSAoeC5iYXIgLSBtdSkgLyAoc2lnbWEvc3FydChuKSkNCg0KIyBQKFggPD0gMjAwMCkgPSBwbm9ybSh6Lm9icykNCiMgUChYID4gMjAwMCkgPSAxIC0gcG5vcm0oei5vYnMpDQpwLnZhbHVlIDwtIDEgLSBwbm9ybSh6Lm9icykNCg0KIyBwLdGB0YLQvtC50L3QvtGB0YLRgtCwINC1INC/0L4t0LzQsNC70LrQsCDQvtGCIDAsMDUNCiMgLT4g0L7RgtGF0LLRitGA0LvRj9C80LUgSF8wINCyINC/0L7Qu9C30LAg0L3QsCBIXzFdDQojIC0+INCy0YDQtdC80LXRgtC+INC90LAg0LbQuNCy0L7RgiDQtSDQv9C+0LLQtdGH0LUg0L7RgiAyMDAwDQpwLnZhbHVlDQpgYGANCg0KKip0LdGC0LXRgdGCINC30LAg0YHRgNC10LTQvdC+KioNCg0K0JjQt9C/0L7Qu9C30LLQsNC80LUgdC3RgtC10YHRgiDQt9CwINGB0YDQtdC00L3Qviwg0LrQvtCz0LDRgtC+INC40YHQutCw0LzQtSDQtNCwINGB0YDQsNCy0L3QuNC8INC90LDQsdC70Y7QtNCw0LLQsNC90LDRgtCwINGB0YDQtdC00L3QsCDRgdGC0L7QudC90L7RgdGCINC90LAg0YHQu9GD0YfQsNC50L3QuCDQstC10LvQuNGH0LjQvdC4INGBINC/0YDQtdC00LLQsNGA0LjRgtC10LvQvdC+INC30LDQtNCw0LTQtdC90LAg0YHRgtC+0LnQvdC+0YHRgi4NCtCU0LjRgdC/0LXRgNGB0LjRj9GC0LAg0L3QsCDRgdC70YPRh9Cw0LnQvdC40YLQtSDQstC10LvQuNGH0LjQvdC4INC1ICoq0L3QtdC40LfQstC10YHRgtC90LAqKi4NCg0KIVtdKC4vaW1hZ2VzL1RfdGVzdF9tdS5KUEcpDQoNCioq0J/RgNC40LzQtdGAKioNCg0K0KHQv9C+0YDQtdC0INC40YHRgtC+0YDQuNGH0LXRgdC60Lgg0LTQsNC90L3QuCwg0YHRgNC10LTQvdCw0YLQsCDQutC40YHQtdC70LjQvdC90L7RgdGCINC90LAg0LTRitC20LTQvtCy0LXRgtC1INCyINC+0L/RgNC10LTQtdC70LXQvQ0K0LjQvdC00YPRgdGC0YDQuNCw0LvQtdC9INGA0LDQudC+0L0g0LUgNS4yLiDQl9CwINC00LAg0YHQtSDQv9GA0L7QstC10YDQuCDQuNC80LAg0LvQuCDQuNC30LzQtdC90LXQvdC40LUg0LIg0YLQsNC30Lgg0YHRgtC+0LnQvdC+0YHRgiDQtSDQuNC30LzQtdGA0LXQvdCwDQrQutC40YHQtdC70LjQvdC90L7RgdGC0YLQsCDQvdCwIDEyINCy0LDQu9C10LbQsCDQv9GA0LXQtyDQuNC30LzQuNC90LDQu9Cw0YLQsCDQs9C+0LTQuNC90LAuINCf0L7Qu9GD0YfQtdC90Lgg0YHQsCDRgdC70LXQtNC90LjRgtC1INGA0LXQt9GD0LvRgtCw0YLQuDoNCmBgYGB7dmVyYmF0aW19DQo2LjEgICA1LjQgICA0LjggICA1LjggICA2LjYgICA1LjMgICA2LjEgICA0LjQgICAzLjkgICA2LjggICA2LjUgICA2LjMNCmBgYGANCtCe0YIg0L/RgNC10LTQuNGI0L3QuCDQuNC30YHQu9C10LTQstCw0L3QuNGPINC1INC40LfQstC10YHRgtC90L4sINGH0LUg0LrQuNGB0LXQu9C40L3QvdC+0YHRgtGC0LAg0L3QsCDQstCw0LvQtdC20LjRgtC1INC40LzQsCDQvdC+0YDQvNCw0LvQvdC+INGA0LDQt9C/0YDQtdC00LXQu9C10L3QuNC1LiDQmNC80LDQvNC1INC70Lgg0L7RgdC90L7QstCw0L3QuNGPINC00LAg0YLQstGK0YDQtNC40LwsINGH0LUg0LrQuNGB0LXQu9C40L3QvdC+0YHRgtGC0LAg0LIg0YDQsNC50L7QvdCwINGB0LUg0LUg0L/RgNC+0LzQtdC90LjQu9CwINCyINGB0YDQsNCy0L3QtdC90LjQtSDRgSDQuNGB0YLQvtGA0LjRh9C10YHQutC40YLQtSDQtNCw0L3QvdC4Pw0KDQpgYGB7cn0NCiMgSF8wOiBtdSA9IDUuMg0KIyBIXzE6IG11ID1cPSA1LjINCnggPC0gYyg2LjEsIDUuNCwgNC44LCA1LjgsIDYuNiwgNS4zLCA2LjEsIDQuNCwgMy45LCA2LjgsIDYuNSwgNi4zKQ0KDQp0LnRlc3QoeCwgbXU9NS4yKQ0KDQojIHAt0YHRgtC+0LnQvdC+0YHRgtGC0LAg0LUg0L/Qvi3Qs9C+0LvRj9C80LAg0L7RgiAwLjA1DQojIC0+INC90LUg0L7RgtGF0LLRitGA0LvRj9C80LUgSF8wDQojIC0+INGB0YDQtdC00L3QsNGC0LAg0YHRgtC+0LnQvdC+0YHRgiDQvdC1INGB0LUg0LUg0L/RgNC+0LzQtdC90LjQu9CwDQp0LnRlc3QoeCwgbXU9NS4yKSRwLnZhbHVlDQpgYGANCg0KDQoqKnot0YLQtdGB0YIg0LfQsCDQv9GA0L7Qv9C+0YDRhtC40Y8qKg0KDQrQmNC30L/QvtC70LfQstCw0LzQtSB6LdGC0LXRgdGCINC30LAg0L/RgNC+0L/RgNC+0YbQuNGPLCDQutC+0LPQsNGC0L4g0LjQvNCw0LzQtSAqKtCR0LXRgNC90YPQu9C40LXQstC4INC+0L/QuNGC0LgqKiAo0YEg0YDQtdC30YPQu9GC0LDRgiAi0YPRgdC/0LXRhSIg0LjQu9C4ICLQvdC10YPRgdC/0LXRhSIpLCDQstGB0LXQutC4INC+0YIg0LrQvtC40YLQviDRgSDQstC10YDQvtGP0YLQvdC+0YHRgiDQt9CwINGD0YHQv9C10YUgcC4g0J/RgNC10LTQv9C+0LvQsNCz0LDQvNC1LCDRh9C1INC40LzQsNC80LUgKioi0YPRgdC/0LXRhSIg0LIgWCUg0L7RgiDRgdC70YPRh9Cw0LjRgtC1KiouINCY0YHQutCw0LzQtSDQtNCwINC/0YDQvtCy0LXRgNC40Lwg0LTQsNC70Lgg0L/RgNC10LTQv9C+0LvQvtC20LXQvdC40LXRgtC+INC90Lgg0L7RgtCz0L7QstCw0YDRjyDQvdCwINC00LXQudGB0YLQstC40YLQtdC70L3QvtGB0YLRgtCwLg0KDQohW10oLi9pbWFnZXMvWl90ZXN0X3Byb3AuSlBHKQ0KDQoqKtCf0YDQuNC80LXRgCoqDQoNCtCY0LfQstC10YHRgtC90L4g0LUsINGH0LUg0L/RgNC4IDEwJSDQvtGCINC60L7Qu9C40YLQtSDQvtGCINC00LDQtNC10L3QsCDQvNCw0YDQutCwINGB0LUg0L/QvtGP0LLRj9Cy0LAg0YHQtdGA0LjQvtC30LXQvQ0K0LTQtdGE0LXQutGCINC/0L4g0LLRgNC10LzQtSDQvdCwINCz0LDRgNCw0L3RhtC40L7QvdC90LjRjyDRgdGA0L7Qui4g0J7RgiDQv9GK0YDQstC40YLQtSAyNTAwMCDQv9GA0L7QtNCw0LTQtdC90Lgg0LrQvtC70Lgg0L7RgiDQvdC+0LIg0LzQvtC00LXQuywNCjI3MDAg0YHQtSDQvtC60LDQt9Cw0LvQuCDRgSDQtNC10YTQtdC60YIuINCc0L7QttC1INC70Lgg0LTQsCDRgdC1INGC0LLRitGA0LTQuCwg0YfQtSDQstC10YDQvtGP0YLQvdC+0YHRgtGC0LAg0LIg0LrQvtC70LAg0L7RgiDQvdC+0LLQuNGPINC80L7QtNC10Lsg0LTQsCDRgdC1INC/0L7Rj9Cy0Lgg0LTQtdGE0LXQutGCINC90LUg0LUgMTAlPw0KDQpgYGB7cn0NCiMgSF8wOiBwID0gMC4xDQojIEhfMTogcCA9XD0gMC4xDQpwcm9wLnRlc3QoeD0yNzAwLCBuPTI1MDAwLCBwPTAuMSwgY29ycmVjdD1GKQ0KDQojIHAt0YHRgtC+0LnQvdC+0YHRgtGC0LAg0LUg0L/Qvi3QvNCw0LvQutCwINC+0YIgMC4wNQ0KIyAtPiDQvtGC0YXQstGK0YDQu9GP0LzQtSBIXzAg0LIg0L/QvtC70LfQsCDQvdCwIEhfMQ0KIyAtPiDQstC10YDQvtGP0YLQvdC+0YHRgtGC0LAg0L3QtSDQtSAxMCUNCnByb3AudGVzdCh4PTI3MDAsIG49MjUwMDAsIHA9MC4xLCBjb3JyZWN0PUYpJHAudmFsdWUNCmBgYA0KDQojIyDQn9GA0L7QstC10YDQutCwINC90LAg0YXQuNC/0L7RgtC10LfQuCDQv9GA0Lgg0LTQstC1INC40LfQstCw0LTQutC4DQoNCioqdC3RgtC10YHRgiDQt9CwINGA0LDQt9C70LjQutCwINC90LAg0YHRgNC10LTQvdC4KioNCg0K0JjQt9C/0L7Qu9C30LLQsNC80LUgdC3RgtC10YHRgiDQt9CwINGA0LDQt9C70LjQutCwINC90LAg0YHRgNC10LTQvdC4LCDQutC+0LPQsNGC0L4g0LjQvNCw0LzQtSAyINC90LXQt9Cw0LLQuNGB0LjQvNC4INC40LfQstCw0LTQutC4LCDRh9C40LjRgtC+INGB0YDQtdC00L3QuCDQuNGB0LrQsNC80LUg0LTQsCDRgdGA0LDQstC90LjQvC4NCg0KIVtdKC4vaW1hZ2VzL1RfdGVzdF8yX3NhbXBsZXMuSlBHKQ0KDQoqKtCf0YDQuNC80LXRgCoqDQoNCtCc0LXQvdC40LTQttGK0YAg0L7QsdC80LjRgdC70Y8g0LLRitCy0LXQttC00LDQvdC1INC90LAg0LTQvtC/0YrQu9C90LjRgtC10LvQvdCwIDE1LdC80LjQvdGD0YLQvdCwINC/0L7Rh9C40LLQutCwINC30LAg0YDQsNCx0L7RgtC90LjRhtC40YLQtSDRgdC4LiDQl9CwINC00LAg0YDQsNC30LHQtdGA0LUg0LTQsNC70Lgg0YLQsNC60LDQstCwINC/0L7Rh9C40LLQutCwINGJ0LUg0L3QsNC80LDQu9C4INCx0YDQvtGPINC90LAg0LPRgNC10YjQutC40YLQtSwg0LrQvtC40YLQviDQv9GA0LDQstGP0YINCtGA0LDQsdC+0YLQvdC40YbQuNGC0LUsINC40LfQsdGA0LDQuyDRgdC70YPRh9Cw0LnQvdC+IDIg0LPRgNGD0L/QuCDQv9C+IDEwINC00YPRiNC4LiDQn9GK0YDQstCw0YLQsCDQs9GA0YPQv9CwINC40LzQsNC70LAg0LTQvtC/0YrQu9C90LjRgtC10LvQvdCwINC/0L7Rh9C40LLQutCwLCDQsCDQstGC0L7RgNCw0YLQsCDRgNCw0LHQvtGC0LjQu9CwINC/0L4g0L7QsdC40YfQsNC50L3QvtGC0L4g0YDQsNCx0L7RgtC90L4g0LLRgNC10LzQtS4g0JTQsNC90L3QuNGC0LUg0LfQsCDQsdGA0L7RjyDQvdCwINC00L7Qv9GD0YHQvdCw0YLQuNGC0LUNCtCz0YDQtdGI0LrQuCDQvtGCINC00LLQtdGC0LUg0LPRgNGD0L/QuCDRgdCwINGB0LvQtdC00L3QuNGC0LU6DQpgYGBge3ZlcmJhdGltfQ0K0JPRgNGD0L/QsCAxOiA4LCA3LCA1LCA4LCAxMCwgOSwgNywgOCwgNCwgNQ0K0JPRgNGD0L/QsCAyOiA3LCA2LCAxNCwgMTIsIDEzLCA4LCA5LCA2LCAxMCwgOQ0KYGBgYA0K0J/RgNC40LXQvNCw0LzQtSwg0YfQtSDQtNCw0L3QvdC40YLQtSDRgdCwINC/0YDQuNCx0LvQuNC30LjRgtC10LvQvdC+INC90L7RgNC80LDQu9C90L4g0YDQsNC30L/RgNC10LTQtdC70LXQvdC4LiDQnNC+0LbQtSDQu9C4INC00LAg0YHQtSDQt9Cw0LrQu9GO0YfQuCwNCtGH0LUg0YDQsNCx0L7RgtC90LjRhtC40YLQtSDRgSDQtNC+0L/RitC70L3QuNGC0LXQu9C90LAg0L/QvtGH0LjQstC60LAg0L/RgNCw0LLRj9GCINGB0YDQtdC00L3QviDQv9C+LdC80LDQu9C60L4g0LPRgNC10YjQutC4Pw0KDQpgYGB7cn0NCiMgSF8wOiBtdV9YID0gbXVfWQ0KIyBIXzE6IG11X1ggPCBtdV9ZDQp4IDwtIGMoOCwgNywgNSwgOCwgMTAsIDksIDcsIDgsIDQsIDUpDQp5IDwtIGMoNywgNiwgMTQsIDEyLCAxMywgOCwgOSwgNiwgMTAsIDkpDQoNCg0KdC50ZXN0KHgsIHksIGFsdD0ibGVzcyIpDQoNCiMgcC3RgdGC0L7QudC90L7RgdGC0YLQsCDQtSDQv9C+LdC80LDQu9C60LAg0L7RgiAwLjA1DQojIC0+INC+0YLRhdCy0YrRgNC70Y/QvNC1IEhfMCDQsiDQv9C+0LvQt9CwINC90LAgSF8xDQojIC0+INGB0YDQtdC00L3QvtGC0L4g0L3QsCDQs9GA0YPQv9CwIDEg0LUg0L/Qvi3QvNCw0LvQutC+INC+0YIg0YLQvtCy0LAg0L3QsCDQs9GA0YPQv9CwIDINCnQudGVzdCh4LCB5LCBhbHQ9Imxlc3MiKSRwLnZhbHVlDQpgYGANCg0KKip0LdGC0LXRgdGCINC/0YDQuCDQt9Cw0LLQuNGB0LjQvNC4INC40LfQstCw0LTQutC4KioNCg0KdC3RgtC10YHRgiwg0LrQvtC50YLQviDQuNC30L/QvtC70LfQstCw0LzQtSwg0LrQvtCz0LDRgtC+INC40LzQsNC80LUgMiDQt9Cw0LLQuNGB0LjQvNC4INC40LfQstCw0LTQutC4ICjRgi7QtS4g0L3QsCDQstGB0LXQutC4INC10LvQtdC80LXQvdGCINC+0YIgMS3QstCw0YLQsCDQuNC30LLQsNC00LrQsCDRgdGK0L7RgtCy0LXRgtGB0YLQstCwINC10LvQtdC80LXQvdGCDQrQvtGCINCy0YLQvtGA0LDRgtCwIC0g0LTQstC+0LnQutC4INC90LDQsdC70Y7QtNC10L3QuNGPKSwg0YfQuNC40YLQviDRgdGA0LXQtNC90Lgg0LjRgdC60LDQvNC1INC00LAg0YHRgNCw0LLQvdC40LwuDQoNCioq0J/RgNC40LzQtdGAKioNCg0K0JfQsCDQtNCwINGB0LUg0LjQt9GB0LvQtdC00LLQsCDQtdGE0LXQutGC0LAg0L3QsCDQtNC40LXRgtCwINCy0YrRgNGF0YMg0L3QuNCy0L7RgtC+INC90LAg0YXQvtC70LXRgdGC0LXRgNC+0Lsg0LIg0LrRgNGK0LLRgtCwDQrRgdCwINC40LfQsdGA0LDQvdC4IDE1INC80YrQttC1INC90LAg0LLRitC30YDQsNGB0YIg0LzQtdC20LTRgyAzNSDQuCA1MCDQs9C+0LTQuNC90LguINCd0LjQstC+0YLQviDQvdCwINGF0L7Qu9C10YHRgtC10YDQvtC70LAg0L3QsCDQstGB0LXQutC4DQrRg9GH0LDRgdGC0L3QuNC6INC1INC40LfQvNC10YDQtdC90L4g0L/RgNC10LTQuCDQt9Cw0L/QvtGH0LLQsNC90LUg0L3QsCDQtNC40LXRgtCw0YLQsCDQuCDRgtGA0Lgg0LzQtdGB0LXRhtCwINGB0LvQtdC0INC/0YDQuNC70LDQs9Cw0L3QtSDQvdCwINC00LjQtdGC0LDRgtCwLg0K0JTQsNC90L3QuNGC0LUg0YHQsCDRgdC70LXQtNC90LjRgtC1Og0KDQpgYGBge3ZlcmJhdGltfQ0K0KPRh9Cw0YHRgtC90LjQuiDQn9GA0LXQtNC4INCh0LvQtdC0DQogICAgICAgMSAgIDI2NSAgMjI5DQogICAgICAgMiAgIDI0MCAgMjMxDQogICAgICAgMyAgIDI1OCAgMjI3DQogICAgICAgNCAgIDI5NSAgMjQwDQogICAgICAgNSAgIDI1MSAgMjM4DQogICAgICAgNiAgIDI0NSAgMjQxDQogICAgICAgNyAgIDI4NyAgMjM0DQogICAgICAgOCAgIDMxNCAgMjU2DQogICAgICAgOSAgIDI2MCAgMjQ3DQogICAgICAxMCAgIDI3OSAgMjM5DQogICAgICAxMSAgIDI4MyAgMjQ2DQogICAgICAxMiAgIDI0MCAgMjE4DQogICAgICAxMyAgIDIzOCAgMjE5DQogICAgICAxNCAgIDIyNSAgMjI2DQogICAgICAxNSAgIDI0NyAgMjMzDQpgYGBgDQrQn9GA0LjQtdC80LDQvNC1LCDRh9C1INC90LjQstC+0YLQviDQvdCwINGF0L7Qu9C10YHRgtC10YDQvtC7INC1INC90L7RgNC80LDQu9C90L4g0YDQsNC30L/RgNC10LTQtdC70LXQvdC+LiDQlNCw0LvQuCDRgtC10LfQuCDQtNCw0L3QvdC4INC00LDQstCw0YIg0L7RgdC90L7QstCw0L3QuNC1INC00LAg0YHQtSDRgtCy0YrRgNC00LgsINGH0LUg0LTQuNC10YLQsNGC0LAg0L3QsNC80LDQu9GP0LLQsCDQvdC40LLQvtGC0L4g0L3QsCDRhdC+0LvQtdGB0YLQtdGA0L7QuyDQsiDRgdGA0LXQtNC90L4/DQpgYGB7cn0NCiMgSF8wOiBtdV9YID0gbXVfWQ0KIyBIXzE6IG11X1ggPiBtdV9ZDQp4IDwtIGMoMjY1LDI0MCwyNTgsMjk1LDI1MSwyNDUsMjg3LDMxNCwyNjAsMjc5LDI4MywyNDAsMjM4LDIyNSwyNDcpDQp5IDwtIGMoMjI5LDIzMSwyMjcsMjQwLDIzOCwyNDEsMjM0LDI1NiwyNDcsMjM5LDI0NiwyMTgsMjE5LDIyNiwyMzMpDQoNCnQudGVzdCh4LCB5LCBhbHQ9ImdyZWF0ZXIiLCBwYWlyZWQ9VCkNCg0KIyBwLdGB0YLQvtC50L3QvtGB0YLRgtCwINC1INC/0L4t0LzQsNC70LrQsCDQvtGCIDAuMDUNCiMgLT4g0L7RgtGF0LLRitGA0LvRj9C80LUgSF8wINCyINC/0L7Qu9C30LAg0L3QsCBIXzENCiMgLT4g0YHRgNC10LTQvdC+0YLQviAi0J/RgNC10LTQuCIg0LUg0L/Qvi3QvNCw0LvQutC+INC+0YIg0YLQvtCy0LAgItCh0LvQtdC0Ig0KdC50ZXN0KHgsIHksIGFsdD0iZ3JlYXRlciIsIHBhaXJlZD1UKSRwLnZhbHVlDQpgYGANCg0KKip6LdGC0LXRgdGCINC30LAg0YDQsNC30LvQuNC60LAg0L3QsCDQv9GA0L7Qv9C+0YDRhtC40LgqKg0KDQrQmNC30L/QvtC70LfQstCw0LzQtSB6LdGC0LXRgdGCINC30LAg0YDQsNC30LvQuNC60LAg0L3QsCDQv9GA0L7Qv9C+0YDRhtC40LgsINC60L7Qs9Cw0YLQviDQuNC80LDQvNC1IDIg0L3QtdC30LDQstC40YHQuNC80Lgg0LjQt9Cy0LDQtNC60LgsINC/0L7QutCw0LfQstCw0YnQuCDRgNC10LfRg9C70YLQsNGC0Lgg0L7RgiDQkdC10YDQvdGD0LvQuNC10LLQuCDQvtC/0LjRgtC4ICjRgi7QtS4g0LLRgdC10LrQuCDQtdC00LjQvSDQtdC70LXQvNC10L3RgiDQvtGCINC40LfQstCw0LTQutCw0YLQsCDQtNCwINC1INCx0YPQu9C10LLQsCDRgdGC0L7QudC90L7RgdGCKSwg0Lgg0LjRgdC60LDQvNC1INC00LAg0YHRgNCw0LLQvdC40Lwg0L/RgNC+0L/QvtGA0YbQuNC40YLQtSDQvdCwICLRg9GB0L/QtdGFIiDQsiDQtNCy0LXRgtC1INC40LfQstCw0LTQutC4Lg0KDQohW10oLi9pbWFnZXMvWl90ZXN0XzJfc2FtcGxlc19wcm9wLkpQRykNCg0KKirQn9GA0LjQvNC10YAqKg0KDQrQkiDQv9GA0L7Rg9GH0LLQsNC90LUg0YPRh9Cw0YHRgtCy0LDQu9C4IDIyMCDQttC10L3QuCDQuCAyMTAg0LzRitC20LUuINCh0L/QvtGA0LXQtCDRgNC10LfRg9C70YLQsNGC0LjRgtC1LCA3MSDQttC10L3QuA0K0LggNTgg0LzRitC20LUg0L7RgtCz0L7QstC+0YDQuNC70LgsINGH0LUg0L/RgNC10LTQv9C+0YfQuNGC0LDRgiDQsdC10LfQutC+0YTQtdC40L3QvtCy0L4g0LrQsNGE0LUuINCc0L7QttC1INC70Lgg0LTQsCDRgtCy0YrRgNC00LjQvCwg0YfQtSDQv9GA0L7RhtC10L3RgtGK0YIg0L3QsCDQttC10L3QuNGC0LUsINC/0YDQtdC00L/QvtGH0LjRgtCw0YnQuCDQsdC10LfQutC+0YTQtdC40L3QvtCy0L4g0LrQsNGE0LUsINC1INGA0LDQt9C70LjRh9C10L0g0L7RgiDQv9GA0L7RhtC10L3RgtGK0YIg0L3QsCDQvNGK0LbQtdGC0LUsINC/0YDQtdC00L/QvtGH0LjRgtCw0YnQuCDQsdC10LfQutC+0YTQtdC40L3QvtCy0L4g0LrQsNGE0LU/DQoNCmBgYHtyfQ0KIyBIXzA6IHBfWCA9IHBfWQ0KIyBIXzE6IHBfWCA9XD0gcF9ZDQoNCiMg0LHRgNC+0LkgItGD0YHQv9C10YXQuCIg0LLRitCyINCy0YHRj9C60LAg0L7RgiDQuNC30LLQsNC00LrQuNGC0LUNCnggPC0gYyg3MSw1OCkNCiMg0YHRitC+0YLQstC10YLRgdGC0LLQsNGJINC+0LHRiSDQsdGA0L7QuSDQvdCw0LHQu9GO0LTQtdC90LjRjyDQstGK0LIg0LLRgdGP0LrQsCDQvtGCINC40LfQstCw0LTQutC40YLQtQ0KbiA8LSBjKDIyMCwyMTApDQoNCnByb3AudGVzdCh4LCBuLCBjb3JyZWN0PUYpDQoNCiMgcC3RgdGC0L7QudC90L7RgdGC0YLQsCDQtSDQv9C+LdCz0L7Qu9GP0LzQsCDQvtGCIDAuMDUNCiMgLT4g0L3QtSDQvtGC0YXQstGK0YDQu9GP0LzQtSBIXzANCiMgLT4g0L/RgNC+0YbQtdC90YLRitGCINC90LAg0LbQtdC90LjRgtC1LCDQv9C40LXRidC4INCx0LXQt9C60L7RhNC10LjQvdC+0LLQviDQutCw0YTQtSwg0L3QtSDQtSDQv9C+LdCz0L7Qu9GP0Lwg0L7RgiDRgtC+0LfQuCDQvdCwINC80YrQttC10YLQtQ0KcHJvcC50ZXN0KHgsIG4sIGNvcnJlY3Q9RikkcC52YWx1ZQ0KYGBgDQoNCiMjINCU0L7QstC10YDQuNGC0LXQu9C90Lgg0LjQvdGC0LXRgNCy0LDQu9C4DQoNCioq0JTQvtCy0LXRgNC40YLQtdC70LXQvSDQuNC90YLQtdGA0LLQsNC7INC30LAg0YHRgNC10LTQvdC+INC/0YDQuCDQuNC30LLQtdGB0YLQvdCwINC00LjRgdC/0LXRgNGB0LjRjyoqDQoNCtCd0LDQvNC40YDQsNC80LUg0LTQvtCy0LXRgNC40YLQtdC70LXQvSDQuNC90YLQtdGA0LLQsNC7INC30LAg0YHRgNC10LTQvdC+0YLQviAqKtC90LXQt9Cw0LLQuNGB0LjQvNC4INC4INC10LTQvdCw0LrQstC+INGA0LDQt9C/0YDQtdC00LXQu9C10L3QuCoqINGB0LvRg9GH0LDQudC90Lgg0LLQtdC70LjRh9C40L3QuC4g0JTQuNGB0L/QtdGA0YHQuNGP0YLQsCDRgtGA0Y/QsdCy0LANCtC00LAg0LUgKirQuNC30LLQtdGB0YLQvdCwKiouDQoNCioq0J/RgNC40LzQtdGAKioNCg0K0KTQuNGA0LzQsCDQv9GA0L7QuNC30LLQtdC20LTQsCDQtdC70LXQutGC0YDQuNGH0LXRgdC60Lgg0LrRgNGD0YjQutC4LiDQodGA0LXQtNC90L7RgtC+INCy0YDQtdC80LUg0L3QsCDQttC40LLQvtGCINC90LANCtC10LTQvdCwINC60YDRg9GI0LrQsCDQtSAyMDAwINGH0LDRgdCwINGB0YrRgSDRgdGC0LDQvdC00LDRgNGC0L3QviDQvtGC0LrQu9C+0L3QtdC90LjQtSAzMDAg0YfQsNGB0LAuINCf0YDQtdC00LvQvtC20LXQvSDQtSDQvdC+0LIg0YLQuNC/INC60YDRg9GI0LrQuC4NCtCY0LfQv9GA0L7QsdCy0LDQvdC4INGB0LAgMTAwINC60YDRg9GI0LrQuCDQvtGCINC90L7QstC40Y8g0YLQuNC/LiDQoNC10LfRg9C70YLQsNGC0LjRgtC1INC/0L7QutCw0LfQstCw0YIg0YHRgNC10LTQvdC+INCy0YDQtdC80LUg0L3QsCDQttC40LLQvtGCINC90LANCtC90L7QstC40YLQtSDQutGA0YPRiNC60LggMjEwMCDRh9Cw0YHQsCDQuCDRgdGK0YnQvtGC0L4g0YHRgtCw0L3QtNCw0YDRgtC90L4g0L7RgtC60LvQvtC90LXQvdC40LUuINCd0LDQvNC10YDQtdGC0LUgOTUt0L/RgNC+0YbQtdC90YLQtdC9INC00L7QstC10YDQuNGC0LXQu9C10L0g0LjQvdGC0LXRgNCy0LDQuyDQt9CwINGB0YDQtdC00L3QvtGC0L4g0LLRgNC10LzQtQ0K0L3QsCDQttC40LLQvtGCINC90LAg0L3QvtCy0LjRjyDRgtC40L8g0LrRgNGD0YjQutC4Lg0KYGBge3J9DQp6MS5jaSA8LSBmdW5jdGlvbih4LmJhciwgc2lnbWEsIG4sIGFscGhhKSB7DQpiMSA8LSB4LmJhciAtIHFub3JtKDEtYWxwaGEvMikqKHNpZ21hL3NxcnQobikpDQpiMiA8LSB4LmJhciArIHFub3JtKDEtYWxwaGEvMikqKHNpZ21hL3NxcnQobikpDQpjKGIxLCBiMikNCn0NCg0KejEuY2koeC5iYXI9MjEwMCwgc2lnbWE9MzAwLCBuPTEwMCwgYWxwaGE9MC4wNSkNCmBgYA0KDQoqKtCU0L7QstC10YDQuNGC0LXQu9C10L0g0LjQvdGC0LXRgNCy0LDQuyDQt9CwINGB0YDQtdC00L3QviDQv9GA0Lgg0L3QtdC40LfQstC10YHRgtC90LAg0LTQuNGB0L/QtdGA0YHQuNGPKioNCg0K0J3QsNC80LjRgNCw0LzQtSDQtNC+0LLQtdGA0LjRgtC10LvQtdC9INC40L3RgtC10YDQstCw0Lsg0LfQsCDRgdGA0LXQtNC90L7RgtC+ICoq0L3QtdC30LDQstC40YHQuNC80Lgg0Lgg0LXQtNC90LDQutCy0L4g0YDQsNC30L/RgNC10LTQtdC70LXQvdC4Kiog0YHQu9GD0YfQsNC50L3QuCDQstC10LvQuNGH0LjQvdC4LiDQlNC40YHQv9C10YDRgdC40Y/RgtCwINGC0YDRj9Cx0LLQsA0K0LTQsCDQtSAqKtC90LXQuNC30LLQtdGB0YLQvdCwKiouDQoNCioq0J/RgNC40LzQtdGAKioNCg0K0KHQv9C+0YDQtdC0INC40YHRgtC+0YDQuNGH0LXRgdC60Lgg0LTQsNC90L3QuCwg0YHRgNC10LTQvdCw0YLQsCDQutC40YHQtdC70LjQvdC90L7RgdGCINC90LAg0LTRitC20LTQvtCy0LXRgtC1INCyINC+0L/RgNC10LTQtdC70LXQvQ0K0LjQvdC00YPRgdGC0YDQuNCw0LvQtdC9INGA0LDQudC+0L0g0LUgNS4yLiDQl9CwINC00LAg0YHQtSDQv9GA0L7QstC10YDQuCDQuNC80LAg0LvQuCDQuNC30LzQtdC90LXQvdC40LUg0LIg0YLQsNC30Lgg0YHRgtC+0LnQvdC+0YHRgiDQtSDQuNC30LzQtdGA0LXQvdCwDQrQutC40YHQtdC70LjQvdC90L7RgdGC0YLQsCDQvdCwIDEyINCy0LDQu9C10LbQsCDQv9GA0LXQtyDQuNC30LzQuNC90LDQu9Cw0YLQsCDQs9C+0LTQuNC90LAuINCf0L7Qu9GD0YfQtdC90Lgg0YHQsCDRgdC70LXQtNC90LjRgtC1INGA0LXQt9GD0LvRgtCw0YLQuDoNCmBgYGB7dmVyYmF0aW19DQo2LjEgICA1LjQgICA0LjggICA1LjggICA2LjYgICA1LjMgICA2LjEgICA0LjQgICAzLjkgICA2LjggICA2LjUgICA2LjMNCmBgYGANCtCd0LDQvNC10YDQtdGC0LUgOTkt0L/RgNC+0YbQtdC90YLQtdC9INC00L7QstC10YDQuNGC0LXQu9C10L0g0LjQvdGC0LXRgNCy0LDQuyDQt9CwINGB0YDQtdC00L3QsNGC0LAg0LrQuNGB0LXQu9C40L3QvdC+0YHRgi4NCmBgYHtyfQ0KeCA8LSBjKDYuMSwgNS40LCA0LjgsIDUuOCwgNi42LCA1LjMsIDYuMSwgNC40LCAzLjksIDYuOCwgNi41LCA2LjMpDQoNCnQudGVzdCh4LCBjb25mLmxldmVsPTAuOTkpJGNvbmYuaW50WzE6Ml0NCmBgYA0KDQoqKtCU0L7QstC10YDQuNGC0LXQu9C10L0g0LjQvdGC0LXRgNCy0LDQuyDQt9CwINC/0YDQvtC/0L7RgNGG0LjRjyoqDQoNCtCd0LDQvNC40YDQsNC80LUg0LTQvtCy0LXRgNC40YLQtdC70LXQvSDQuNC90YLQtdGA0LLQsNC7INC30LAgKirQv9GA0L7RhtC10L3RgtCwINGD0YHQv9C10YXQuCoqINC/0YDQuCAqKtCR0LXRgNC90YPQu9C40LXQstC4INC+0L/QuNGC0LgqKi4NCg0KKirQn9GA0LjQvNC10YAqKg0KDQrQntGCINC/0YrRgNCy0LjRgtC1IDI1MDAwINC/0YDQvtC00LDQtNC10L3QuCDQutC+0LvQuCDQvtGCINC90L7QsiDQvNC+0LTQtdC7LCAyNzAwINGB0LUg0L7QutCw0LfQsNC70Lgg0YEg0LTQtdGE0LXQutGCLg0K0J3QsNC80LXRgNC10YLQtSA5NS3Qv9GA0L7RhtC10L3RgtC10L0g0LTQvtCy0LXRgNC40YLQtdC70LXQvSDQuNC90YLQtdGA0LLQsNC7INC30LAg0LLQtdGA0L7Rj9GC0L3QvtGB0YLRgtCwINC60L7Qu9CwINC+0YIg0L3QvtCy0LjRjyDQvNC+0LTQtdC7INC00LAg0LUNCtC00LXRhNC10LrRgtC90LAuDQpgYGB7cn0NCnByb3AudGVzdCh4PTI3MDAsIG49MjUwMDAsIGNvbmYubGV2ZWw9MC45NSwgY29ycmVjdD1GKSRjb25mLmludFsxOjJdDQpgYGANCg0KKirQlNC+0LLQtdGA0LjRgtC10LvQtdC9INC40L3RgtC10YDQstCw0Lsg0LfQsCDQvNC10LTQuNCw0L3QsCoqDQoNCg0KKirQn9GA0LjQvNC10YAqKg0KDQrQndCw0L/RgNCw0LLQtdC90L4g0LUg0L/RgNC+0YPRh9Cy0LDQvdC1INGBINGG0LXQuyDQtNCwINGB0LUg0LjQt9GB0LvQtdC00LLQsCDQtdGE0LXQutGC0YrRgiDQvdCwINC30LLRg9C60LAg0L7RgiDRgdGK0YDQtNC10YfQvdC40Y8NCtGA0LjRgtGK0Lwg0L3QsCDQvNCw0LnQutCw0YLQsCDQstGK0YDRhdGDINC90L7QstC+0YDQvtC00LXQvdC+0YLQvi4g0JHQtdCx0LXRgtCw0YLQsCDQsiDRgNC+0LTQuNC70L3QviDQvtGC0LTQtdC70LXQvdC40LUg0YHQsCDRgNCw0LfQtNC10LvQtdC90Lgg0L3QsCDQtNCy0LUNCtCz0YDRg9C/0LguINCf0YrRgNCy0LDRgtCwINCz0YDRg9C/0LAg0LUg0L3QtdC/0YDQtdC60YrRgdC90LDRgtC+INC40LfQu9C+0LbQtdC90LAg0L3QsCDQt9Cy0YPQutCwINC+0YIg0YHRitGA0LTQtdGH0L3QuNGPINGA0LjRgtGK0Lwg0L3QsCDQstGK0LfRgNCw0YHRgtC10L0sDQrQsCDQstGC0L7RgNCw0YLQsCDQs9GA0YPQv9CwINC90LUg0LUg0LjQt9C70L7QttC10L3QsCDQvdCwINGC0LDQutGK0LIg0LfQstGD0LouINCY0LfQvNC10YDQtdC90LAg0LUg0L/RgNC+0LzRj9C90LDRgtCwINCyINGC0LXQs9C70L7RgtC+INC90LAg0LHQtdCx0LXRgtCw0YLQsA0K0L7RgiDRgNCw0LbQtNCw0L3QtdGC0L4g0LTQviDRh9C10YLQstGK0YDRgtC40Y8g0LTQtdC9LiDQlNCw0L3QvdC40YLQtSDRgdCwINCy0YrQsiDRhNCw0LnQu9CwIHNhbGsudHh0IC4g0J3QsNC80LXRgNC10YLQtSA5NS3Qv9GA0L7RhtC10L3RgtC10L0NCtC00L7QstC10YDQuNGC0LXQu9C10L0g0LjQvdGC0LXRgNCy0LDQuyDQt9CwINC80LXQtNC40LDQvdCw0YLQsCDQvdCwINC/0YDQvtC80Y/QvdCw0YLQsCDQsiDRgtC10LPQu9C+0YLQviDQvdCwINCx0LXQsdC10YLQsNGC0LAgKNC30LAg0L/RitGA0LLQsNGC0LAg0Lgg0LfQsA0K0LLRgtC+0YDQsNGC0LAg0LPRgNGD0L/QsCkuDQoNCmBgYHtyfQ0KbWVkMS5jaSA8LSBmdW5jdGlvbih4LCBhbHBoYT0wLjA1LCBuYm9vdD0xMDAwKSB7DQp4IDwtIHhbaXMuZmluaXRlKHgpXQ0KbnggPC0gbGVuZ3RoKHgpDQplc3QxIDwtIG1lZGlhbih4KQ0KbWVkMS5idCA8LSByZXBsaWNhdGUoIG5ib290LCBtZWRpYW4oIHNhbXBsZSggeCwgc2l6ZT1ueCwgcmVwbGFjZT1UUlVFICkgKSApDQpjaSA8LSBxdWFudGlsZSggbWVkMS5idCwgcHJvYnM9YyhhbHBoYS8yLCAxLWFscGhhLzIpLCBuYW1lcz1GQUxTRSApDQpsaXN0KCBlc3QubWVkMT1lc3QxLCBjaT1jaSApDQp9DQpgYGANCg0KKirQlNC+0LLQtdGA0LjRgtC10LvQtdC9INC40L3RgtC10YDQstCw0Lsg0LfQsCDRgNCw0LfQu9C40LrQsCDQvdCwINC80LXQtNC40LDQvdC4KioNCg0KKirQn9GA0LjQvNC10YAqKg0KDQrQndCw0L/RgNCw0LLQtdC90L4g0LUg0L/RgNC+0YPRh9Cy0LDQvdC1INGBINGG0LXQuyDQtNCwINGB0LUg0LjQt9GB0LvQtdC00LLQsCDQtdGE0LXQutGC0YrRgiDQvdCwINC30LLRg9C60LAg0L7RgiDRgdGK0YDQtNC10YfQvdC40Y8NCtGA0LjRgtGK0Lwg0L3QsCDQvNCw0LnQutCw0YLQsCDQstGK0YDRhdGDINC90L7QstC+0YDQvtC00LXQvdC+0YLQvi4g0JHQtdCx0LXRgtCw0YLQsCDQsiDRgNC+0LTQuNC70L3QviDQvtGC0LTQtdC70LXQvdC40LUg0YHQsCDRgNCw0LfQtNC10LvQtdC90Lgg0L3QsCDQtNCy0LUNCtCz0YDRg9C/0LguINCf0YrRgNCy0LDRgtCwINCz0YDRg9C/0LAg0LUg0L3QtdC/0YDQtdC60YrRgdC90LDRgtC+INC40LfQu9C+0LbQtdC90LAg0L3QsCDQt9Cy0YPQutCwINC+0YIg0YHRitGA0LTQtdGH0L3QuNGPINGA0LjRgtGK0Lwg0L3QsCDQstGK0LfRgNCw0YHRgtC10L0sDQrQsCDQstGC0L7RgNCw0YLQsCDQs9GA0YPQv9CwINC90LUg0LUg0LjQt9C70L7QttC10L3QsCDQvdCwINGC0LDQutGK0LIg0LfQstGD0LouINCY0LfQvNC10YDQtdC90LAg0LUg0L/RgNC+0LzRj9C90LDRgtCwINCyINGC0LXQs9C70L7RgtC+INC90LAg0LHQtdCx0LXRgtCw0YLQsA0K0L7RgiDRgNCw0LbQtNCw0L3QtdGC0L4g0LTQviDRh9C10YLQstGK0YDRgtC40Y8g0LTQtdC9LiDQlNCw0L3QvdC40YLQtSDRgdCwINCy0YrQsiDRhNCw0LnQu9CwIHNhbGsudHh0IC4g0J3QsNC80LXRgNC10YLQtSA5NS3Qv9GA0L7RhtC10L3RgtC10L0NCtC00L7QstC10YDQuNGC0LXQu9C10L0g0LjQvdGC0LXRgNCy0LDQuyDQt9CwINC80LXQtNC40LDQvdCw0YLQsCDQvdCwINC/0YDQvtC80Y/QvdCw0YLQsCDQsiDRgtC10LPQu9C+0YLQviDQvdCwINCx0LXQsdC10YLQsNGC0LAgKNC30LAg0L/RitGA0LLQsNGC0LAg0Lgg0LfQsA0K0LLRgtC+0YDQsNGC0LAg0LPRgNGD0L/QsCkuDQpgYGB7cn0NCm1lZDIuY2kgPC0gZnVuY3Rpb24oeCwgeSwgYWxwaGE9MC4wNSwgbmJvb3Q9MTAwMCkgew0KICAgIHggPC0geFtpcy5maW5pdGUoeCldDQogICAgeSA8LSB5W2lzLmZpbml0ZSh5KV0NCiAgICBueCA8LSBsZW5ndGgoeCkNCiAgICBueSA8LSBsZW5ndGgoeSkNCiAgICBlc3QxIDwtIG1lZGlhbih4KQ0KICAgIGVzdDIgPC0gbWVkaWFuKHkpDQogICAgZXN0LmRpZiA8LSBlc3QxIC0gZXN0Mg0KICAgIG1lZDEuYnQgPC0gcmVwbGljYXRlKCBuYm9vdCwgbWVkaWFuKCBzYW1wbGUoIHgsIHNpemU9bngsIHJlcGxhY2U9VFJVRSApICkgKQ0KICAgIG1lZDIuYnQgPC0gcmVwbGljYXRlKCBuYm9vdCwgbWVkaWFuKCBzYW1wbGUoIHksIHNpemU9bnksIHJlcGxhY2U9VFJVRSApICkgKQ0KICAgIGRpZi5idCA8LSBtZWQxLmJ0IC0gbWVkMi5idA0KICAgIGNpIDwtIHF1YW50aWxlKCBkaWYuYnQsIHByb2JzPWMoYWxwaGEvMiwgMS1hbHBoYS8yKSwgbmFtZXM9RkFMU0UgKQ0KICAgIGxpc3QoIGVzdC5tZWQxPWVzdDEsIGVzdC5tZWQyPWVzdDIsIGVzdC5kaWY9ZXN0LmRpZiwgY2k9Y2kgKQ0KfQ0KYGBgDQo=