1 Bài tập tuần 5 + 6

Đề: Chạy mô hình với các phân phối khác nhau với các biến đầu vào.

library('psych')
## Warning: package 'psych' was built under R version 4.3.1
setwd("C:/Users/Ngoc Loi/Downloads")
cfdemit <- read.csv("C:/Users/Ngoc Loi/Downloads/datademit.csv")
library(DT)
## Warning: package 'DT' was built under R version 4.3.1
cfdemit %>% DT::datatable(cfdemit)

1.1 TÍNH VÀ ƯỚC LƯỢNG DOANH THU

DOANHTHU <- 18000 * cfdemit$Cfs + 15000 * cfdemit$cfd  +25000 * cfdemit$cam +   22000 * cfdemit$bx  + 20000 * cfdemit$sting + 20000 * cfdemit$nutifood
summary(DOANHTHU)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
## 1155000 1390000 1477000 1470950 1546000 1784000

Biến doanh thu (DT) trong khoảng [1.155.000;1.784.000]

*ĐVT: Đồng

Dựa vào bảng thống kê mô tả, tôi ước lượng doanh thu của cfdemit như sau:

  • Doanh thu thấp sẽ dưới 1.300.000đ trên 1 ngày

  • Doanh thu vừa sẽ từ 1.300.000đ đến 1.500.000đ trên 1 ngày

  • Doanh thu cao sẽ từ 1.5000.000 đồng trở lên trên 1 ngày

DTthap <- DOANHTHU[DOANHTHU < 1300000]
DTvua <- DOANHTHU[DOANHTHU > 13000000 & DOANHTHU <= 1500000]
DTcao <- DOANHTHU[DOANHTHU> 1500000]

table(cut(DOANHTHU,breaks = 3))
## 
## (1.15e+06,1.36e+06] (1.36e+06,1.57e+06] (1.57e+06,1.78e+06] 
##                  32                 113                  36
doanhthu1 <-table(cut(DOANHTHU,3, labels = c('thap','vua','cao')))
doanhthu1
## 
## thap  vua  cao 
##   32  113   36

Từ kết quả trên, Doanh thu của 181 ngày trong 6 tháng đầu năm 2023 của quán cfdemit gồm có 32 ngày thu dược doanh thu thấp, 113 ngày thu được doanh thu vừa và 36 ngày thu được doanh thu cao.

library(pastecs) 
## Warning: package 'pastecs' was built under R version 4.3.1
stat.desc(DOANHTHU)
##      nbr.val     nbr.null       nbr.na          min          max        range 
## 1.810000e+02 0.000000e+00 0.000000e+00 1.155000e+06 1.784000e+06 6.290000e+05 
##          sum       median         mean      SE.mean CI.mean.0.95          var 
## 2.662420e+08 1.477000e+06 1.470950e+06 8.724806e+03 1.721606e+04 1.377813e+10 
##      std.dev     coef.var 
## 1.173803e+05 7.979893e-02

Dựa vào bảng thống kê mô tả, tôi có thể hiểu rõ hơn về doanh thu của như sau:

  • Tôi có 181 giá trị doanh thu, không có giá trị bằng 0 hay bị thiếu.

  • Doanh thu nhỏ nhất của tôi là 1.155.000 đồng, lớn nhất là 1.784.000 đồng.

  • Phạm vi biến thiên của doanh thu của bạn là 629.000 đồng, tức là sự chênh lệch giữa doanh thu cao nhất và thấp nhất.

  • Tổng doanh thu của tôi là 266.242.000 đồng.

  • Trung vị doanh thu của tôi là 1.477.000 đồng, tức là nếu sắp xếp các giá trị doanh thu theo thứ tự tăng dần, thì giá trị ở vị trí thứ 91 sẽ là trung vị .

  • Trung bình cộng doanh thu của tôi là 1.470.950 đồng, tức là nếu chia tổng doanh thu cho số lượng giá trị, thì sẽ được kết quả này.

  • Sai số chuẩn của trung bình cộng doanh thu của tôi là 8.724 đồng, tức là độ lệch chuẩn của doanh thu chia cho căn bậc hai của số lượng giá trị .

  • Khoảng tin cậy 95% cho trung bình cộng doanh thu của tôi là 17.216 đồng, tức là khoảng chứa giá trị thực sự của trung bình cộng doanh thu với xác suất 95% .

  • Phương sai của doanh thu của tôi là 13.778.130.000 đồng, tức là trung bình cộng của bình phương các độ lệch so với trung bình cộng.

  • Độ lệch chuẩn của doanh thu của tôi là 117.380 đồng, tức là căn bậc hai của phương sai .

  • Hệ số biến động của doanh thu của tôi là 7.98%, tức là độ lệch chuẩn chia cho trung bình cộng .

library(ggplot2)
## Warning: package 'ggplot2' was built under R version 4.3.1
## 
## Attaching package: 'ggplot2'
## The following objects are masked from 'package:psych':
## 
##     %+%, alpha
doanhthu1 <- c(Doanhthuthap = 32, Doanhthuvua = 113, Doanhthucao = 36)
labels1 <- c("Doanh thu thấp", "Doanh thu vừa", "Doanh thu cao")
colors1 <- c("blue", "red", "green")
barplot(doanhthu1, names.arg = labels1, col = colors1)

1.2 Kiểm định phân phối doanh thu

# Kiểm định phân phối chuẩn
hist(DOANHTHU, col="blue")

Đặt giả thuyết:

\(H_0\): biến DOANHTHU có phân phối chuẩn

\(H_1\): biến DOANHTHU không có phân phối chuẩn

shapiro.test(DOANHTHU)
## 
##  Shapiro-Wilk normality test
## 
## data:  DOANHTHU
## W = 0.99675, p-value = 0.9683

Vì p-value = 0.9683 > 0,05 nên biến DOANHTHU có phân phối chuẩn.

library(ggpubr)
## Warning: package 'ggpubr' was built under R version 4.3.1
ggqqplot(DOANHTHU,col="blue")

Vì biến DOANHTHU có phân phối chuẩn nên ta thu được kết quả từ biểu đồ trên có các giá trị đều nằm trên đường thẳng.

#Kiểm định phân phối mũ
ks.test(DOANHTHU, y=pexp)
## Warning in ks.test.default(DOANHTHU, y = pexp): ties should not be present for
## the Kolmogorov-Smirnov test
## 
##  Asymptotic one-sample Kolmogorov-Smirnov test
## 
## data:  DOANHTHU
## D = 1, p-value < 2.2e-16
## alternative hypothesis: two-sided

\(H_0\): biến DOANHTHU có phân phối mũ

\(H_1\): biến DOANHTHU không có phân phối mũ

Vì p_value < 0,05 nên ta đủ cơ sở bác bỏ \(H_0\), vì vậy biến DOANHTHU không có phân phối mũ.

# Kiểm định phân phối đều
ks.test(DOANHTHU, y = 'punif')
## Warning in ks.test.default(DOANHTHU, y = "punif"): ties should not be present
## for the Kolmogorov-Smirnov test
## 
##  Asymptotic one-sample Kolmogorov-Smirnov test
## 
## data:  DOANHTHU
## D = 1, p-value < 2.2e-16
## alternative hypothesis: two-sided

\(H_0\): biến DOANHTHU có phân phối đều

\(H_1\): biến DOANHTHU không có phân phối đều

Vì p_value < 0,05 nên ta đủ cơ sở bác bỏ \(H_0\), vì vậy biến DOANHTHU không có phân phối đều.

## Kiểm định phân phối loga chuẩn 
ks.test(DOANHTHU, y = "plnorm")
## Warning in ks.test.default(DOANHTHU, y = "plnorm"): ties should not be present
## for the Kolmogorov-Smirnov test
## 
##  Asymptotic one-sample Kolmogorov-Smirnov test
## 
## data:  DOANHTHU
## D = 1, p-value < 2.2e-16
## alternative hypothesis: two-sided

Đặt giả thiết:

\(H_0\): biến DOANHTHU có phân phối loga chuẩn

\(H_1\): biến DOANHTHU không có phân phối loga chuẩn

Vì p_value < 0,05 nên ta đủ cơ sở bác bỏ H0, vì vậy biến DOANHTHU không có phân phối loga chuẩn.

1.3 Mô phỏng phân phối chuẩn biến DOANHTHU trong 184 ngày tới

Vì DOANHTHU theo phân phối chuẩn, nên tôi tiến hành mô phỏng doanh thu trong 184 ngày tới.

sd(DOANHTHU)
## [1] 117380.3
set.seed(123)
L1 <- rnorm(n= 184, mean= 1470950.3 ,sd= 117380) 
hist(L1, main = "Mô phỏng doanh thu theo phân phối chuẩn", xlab = "L1", col = "lightpink")

library(ggpubr)
ggqqplot(L1,col="blue")

summary(L1)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
## 1199900 1397499 1465047 1470913 1537669 1851384

Doanh thu mô phỏng trong 184 ngày tới có giá trị trung bình là 1.470.913, có giá trị thấp nhất là 1.199.900 và có giá trị lớn nhất là 1.851.384

1.4 Nhận xét

set.seed(123)
DTthap1 <- L1[L1 < 1300000]
DTvua1 <- L1[L1 > 13000000 & L1 <= 1500000]
DTcao1 <- L1[L1> 1500000]

table(cut(L1,breaks = 3))
## 
##  (1.2e+06,1.42e+06] (1.42e+06,1.63e+06] (1.63e+06,1.85e+06] 
##                  58                 112                  14
table(cut(L1,3, labels = c('thap','vua','cao')))
## 
## thap  vua  cao 
##   58  112   14

Doanh thu mô phỏng thu được có 58 ngày có doanh thu thấp, 113 ngày có doanh thu vừa và 14 ngày có doanh thu cao.

Nếu các yếu tố khác không thay đổi, thì tôi dự đoán quán cfdemit vẫn hoạt động bình thường.

par(mfrow=c(1,3))
hist(L1, col="blue")
boxplot(L1, col="blue")
plot(density(L1), col="blue")

Giải thích ý nghĩa:

Đồ thị cột (histogram) cho biết tần suất xuất hiện của các giá trị trong biến L1(Doanh thu mô phỏng). Tôi có thể nhìn thấy rằng phần lớn các giá trị nằm trong khoảng từ 1.200.000 đến 1.800.000, và có một số . Hầu hết được phân bố nhiều nhất tại 1.400.000đ.

Đồ thị hộp (boxplot) cho biết các thông số mô tả của biến L1, trung vị ở khoảng 1.500.000.

Đồ thị mật độ (density plot) cho biết hình dạng của phân bố của biến FTS1, một đỉnh ở khoảng 1.500.000. Đồ thị này cũng cho biết độ rộng băng thông (bandwidth =3.318e+04).

library(ggplot2)
doanhthu2 <- c(Doanhthuthap = 58, Doanhthuvua = 112, Doanhthucao = 14)
barplot(doanhthu2, names.arg = labels1, col = colors1)

2 Bài tập tuần 4

Đề: Xây dựng mô hình cho đối tượng cần mô phỏng và giải thích mô hình.

2.1 Xác định mô hình Doanh thu của quán cf Demit qua 6 loại nước bán nhiều nhất:

Doanh thu = Đơn giá x Số lượng

\(Doanh thu = ĐG_{Cfs}.SL_{Cfs} + ĐG_{cfd}. SL_{cfd} +ĐG_{cam}. .SL_{cam}+ ĐG_{bx}.SL_{bx} + ĐG_{sting}.SL_{sting}+ ĐG_{nutifood} .SL_{nutifood}\)

Cụ thể là:

\(Doanh thu = 18000.SL_{Cfs} + 15000. SL_{cfd} +25000 .SL_{cam}+ 22000 .SL_{bx} + 20000.SL_{sting}+ 20000 .SL_{nutifood}\)

Giải thích mô hình doanh thu theo ngày:

  • \(ĐG_{Cfs}\)là đơn giá của 1 ly cafe sữa (ĐVT: đồng)

  • \(SL_{Cfs}\) là số lượng ly cafe sữa bán ra trong 1 ngày

  • \(ĐG_{cfd}\) là đơn giá của 1 ly cafe đen(ĐVT: đồng)

  • \(SL_{cfd}\) là số lượng ly cafe đen bán ra trong 1 ngày

  • \(ĐG_{cam}\) là đơn giá của 1 ly nước cam (ĐVT: đồng)

  • \(SL_{cam}\) là số lượng ly nước cam bán ra trong 1 ngày

  • \(ĐG_{bx}\) là đơn giá của 1 ly bạc xỉu (ĐVT: đồng)

  • \(SL_{bx}\) là số lượng ly bạc xỉu bán ra trong 1 ngày

  • \(ĐG_{sting}\) là đơn giá của 1 ly sting sữa (ĐVT: đồng)

  • \(SL_{sting}\) là số lượng ly sting bán ra trong 1 ngày

  • \(ĐG_{nutifood}\) là đơn giá của 1 ly nutifood (ĐVT: đồng)

  • \(SL_{nutifood}\) là số lượng ly nutifood bán ra trong 1 ngày

3 Bài tập tuần 3

3.1 Đề: Xác đinh phân phối các biến

setwd("C:/Users/Ngoc Loi/Downloads")
cfdemit <- read.csv("C:/Users/Ngoc Loi/Downloads/datademit.csv")
str(cfdemit)
## 'data.frame':    181 obs. of  7 variables:
##  $ ngay    : chr  "1/1/2023" "1/2/2023" "1/3/2023" "1/4/2023" ...
##  $ Cfs     : int  19 20 16 12 17 20 18 10 16 12 ...
##  $ cfd     : int  6 6 6 9 9 9 5 5 7 9 ...
##  $ cam     : int  14 14 10 12 14 12 14 13 12 8 ...
##  $ bx      : int  16 13 11 11 15 15 14 13 16 13 ...
##  $ sting   : int  18 17 20 17 17 15 15 20 13 15 ...
##  $ nutifood: int  7 8 7 12 11 12 9 10 11 11 ...

3.2 Xác định phân phối của biến Cfs

# Kiểm định phân phối chuẩn
hist(cfdemit$Cfs)

Đặt giả thuyết:

H0: biến Cfs có phân phối chuẩn

H1: biến Cfs không có phân phối chuẩn

Cfss <- as.data.frame(cfdemit$Cfs)
shapiro.test(cfdemit$Cfs)
## 
##  Shapiro-Wilk normality test
## 
## data:  cfdemit$Cfs
## W = 0.934, p-value = 2.364e-07

Vì p-value <0,05 nên ta đủ cơ sở bác bỏ H0, vì vậy biến Cfs không có phân phối chuẩn

#Kiểm định phân phối mũ
ks.test(cfdemit$Cfs, y=pexp)
## Warning in ks.test.default(cfdemit$Cfs, y = pexp): ties should not be present
## for the Kolmogorov-Smirnov test
## 
##  Asymptotic one-sample Kolmogorov-Smirnov test
## 
## data:  cfdemit$Cfs
## D = 0.99995, p-value < 2.2e-16
## alternative hypothesis: two-sided

H0: biến Cfs có phân phối mũ

H1: biến Cfs không có phân phối mũ

Vì p_value < 0,05 nên ta đủ cơ sở bác bỏ H0, vì vậy biến Cfs không có phân phối mũ.

# Kiểm định phân phối đều
ks.test(cfdemit$Cfs, y = 'punif')
## Warning in ks.test.default(cfdemit$Cfs, y = "punif"): ties should not be
## present for the Kolmogorov-Smirnov test
## 
##  Asymptotic one-sample Kolmogorov-Smirnov test
## 
## data:  cfdemit$Cfs
## D = 1, p-value < 2.2e-16
## alternative hypothesis: two-sided

H0: biến Cfs có phân phối đều

H1: biến Cfs không có phân phối đều

Vì p_value < 0,05 nên ta đủ cơ sở bác bỏ H0, vì vậy biến Cfs không có phân phối đều.

3.3 Xác định phân phối của biến cfd

# Kiểm định phân phối chuẩn
hist(cfdemit$cfd)

Đặt giả thuyết:

H0: biến cfd có phân phối chuẩn

H1: biến cfd không có phân phối chuẩn

cfds <- as.data.frame(cfdemit$cfd)
shapiro.test(cfdemit$cfd)
## 
##  Shapiro-Wilk normality test
## 
## data:  cfdemit$cfd
## W = 0.89806, p-value = 8.077e-10

Vì p-value <0,05 nên ta đủ cơ sở bác bỏ H0, vì vậy biến cfd không có phân phối chuẩn

#Kiểm định phân phối mũ
ks.test(cfdemit$Cfs, y=pexp)
## Warning in ks.test.default(cfdemit$Cfs, y = pexp): ties should not be present
## for the Kolmogorov-Smirnov test
## 
##  Asymptotic one-sample Kolmogorov-Smirnov test
## 
## data:  cfdemit$Cfs
## D = 0.99995, p-value < 2.2e-16
## alternative hypothesis: two-sided

H0: biến Cfs có phân phối mũ

H1: biến Cfs không có phân phối mũ

Vì p_value < 0,05 nên ta đủ cơ sở bác bỏ H0, vì vậy biến Cfs không có phân phối mũ.

# Kiểm định phân phối đều
ks.test(cfdemit$Cfs, y = 'punif')
## Warning in ks.test.default(cfdemit$Cfs, y = "punif"): ties should not be
## present for the Kolmogorov-Smirnov test
## 
##  Asymptotic one-sample Kolmogorov-Smirnov test
## 
## data:  cfdemit$Cfs
## D = 1, p-value < 2.2e-16
## alternative hypothesis: two-sided

H0: biến Cfs có phân phối đều

H1: biến Cfs không có phân phối đều

Vì p_value < 0,05 nên ta đủ cơ sở bác bỏ H0, vì vậy biến Cfs không có phân phối đều.

3.4 Xác định phân phối của biến cam

# Kiểm định phân phối chuẩn
hist(cfdemit$cam)

Đặt giả thuyết:

H0: biến cam có phân phối chuẩn

H1: biến cam không có phân phối chuẩn

cams <- as.data.frame(cfdemit$cam)
shapiro.test(cfdemit$cam)
## 
##  Shapiro-Wilk normality test
## 
## data:  cfdemit$cam
## W = 0.9231, p-value = 3.58e-08

Vì p-value <0,05 nên ta đủ cơ sở bác bỏ H0, vì vậy biến cam không có phân phối chuẩn

#Kiểm định phân phối mũ
ks.test(cfdemit$Cfs, y=pexp)
## Warning in ks.test.default(cfdemit$Cfs, y = pexp): ties should not be present
## for the Kolmogorov-Smirnov test
## 
##  Asymptotic one-sample Kolmogorov-Smirnov test
## 
## data:  cfdemit$Cfs
## D = 0.99995, p-value < 2.2e-16
## alternative hypothesis: two-sided

H0: biến Cfs có phân phối mũ

H1: biến Cfs không có phân phối mũ

Vì p_value < 0,05 nên ta đủ cơ sở bác bỏ H0, vì vậy biến Cfs không có phân phối mũ.

# Kiểm định phân phối đều
ks.test(cfdemit$Cfs, y = 'punif')
## Warning in ks.test.default(cfdemit$Cfs, y = "punif"): ties should not be
## present for the Kolmogorov-Smirnov test
## 
##  Asymptotic one-sample Kolmogorov-Smirnov test
## 
## data:  cfdemit$Cfs
## D = 1, p-value < 2.2e-16
## alternative hypothesis: two-sided

H0: biến Cfs có phân phối đều

H1: biến Cfs không có phân phối đều

Vì p_value < 0,05 nên ta đủ cơ sở bác bỏ H0, vì vậy biến Cfs không có phân phối đều.

3.5 Xác định phân phối của biến bx

# Kiểm định phân phối chuẩn
hist(cfdemit$bx)

Đặt giả thuyết:

H0: biến bx có phân phối chuẩn

H1: biến bx không có phân phối chuẩn

bxs <- as.data.frame(cfdemit$bx)
shapiro.test(cfdemit$bx)
## 
##  Shapiro-Wilk normality test
## 
## data:  cfdemit$bx
## W = 0.91806, p-value = 1.58e-08

Vì p-value <0,05 nên ta đủ cơ sở bác bỏ H0, vì vậy biến bx không có phân phối chuẩn

#Kiểm định phân phối mũ
ks.test(cfdemit$bx, y=pexp)
## Warning in ks.test.default(cfdemit$bx, y = pexp): ties should not be present
## for the Kolmogorov-Smirnov test
## 
##  Asymptotic one-sample Kolmogorov-Smirnov test
## 
## data:  cfdemit$bx
## D = 0.99995, p-value < 2.2e-16
## alternative hypothesis: two-sided

H0: biến bx có phân phối mũ

H1: biến bx không có phân phối mũ

Vì p_value < 0,05 nên ta đủ cơ sở bác bỏ H0, vì vậy biến bx không có phân phối mũ.

# Kiểm định phân phối đều
ks.test(cfdemit$bx, y = 'punif')
## Warning in ks.test.default(cfdemit$bx, y = "punif"): ties should not be present
## for the Kolmogorov-Smirnov test
## 
##  Asymptotic one-sample Kolmogorov-Smirnov test
## 
## data:  cfdemit$bx
## D = 1, p-value < 2.2e-16
## alternative hypothesis: two-sided

H0: biến bx có phân phối đều

H1: biến bx không có phân phối đều

Vì p_value < 0,05 nên ta đủ cơ sở bác bỏ H0, vì vậy biến bx không có phân phối đều.

3.6 Xác định phân phối của biến sting

# Kiểm định phân phối chuẩn
hist(cfdemit$sting)

Đặt giả thuyết:

H0: biến sting có phân phối chuẩn

H1: biến sting không có phân phối chuẩn

stings <- as.data.frame(cfdemit$sting)
shapiro.test(cfdemit$sting)
## 
##  Shapiro-Wilk normality test
## 
## data:  cfdemit$sting
## W = 0.94102, p-value = 8.774e-07

Vì p-value <0,05 nên ta đủ cơ sở bác bỏ H0, vì vậy biến sting không có phân phối chuẩn

#Kiểm định phân phối mũ
ks.test(cfdemit$sting, y=pexp)
## Warning in ks.test.default(cfdemit$sting, y = pexp): ties should not be present
## for the Kolmogorov-Smirnov test
## 
##  Asymptotic one-sample Kolmogorov-Smirnov test
## 
## data:  cfdemit$sting
## D = 0.99999, p-value < 2.2e-16
## alternative hypothesis: two-sided

H0: biến sting có phân phối mũ

H1: biến sting không có phân phối mũ

Vì p_value < 0,05 nên ta đủ cơ sở bác bỏ H0, vì vậy biến sting không có phân phối mũ.

# Kiểm định phân phối đều
ks.test(cfdemit$sting, y = 'punif')
## Warning in ks.test.default(cfdemit$sting, y = "punif"): ties should not be
## present for the Kolmogorov-Smirnov test
## 
##  Asymptotic one-sample Kolmogorov-Smirnov test
## 
## data:  cfdemit$sting
## D = 1, p-value < 2.2e-16
## alternative hypothesis: two-sided

H0: biến sting có phân phối đều

H1: biến sting không có phân phối đều

Vì p_value < 0,05 nên ta đủ cơ sở bác bỏ H0, vì vậy biến sting không có phân phối đều.

3.7 Xác định phân phối của biến nutifood

# Kiểm định phân phối chuẩn
hist(cfdemit$nutifood)

Đặt giả thuyết:

H0: biến nutifood có phân phối chuẩn

H1: biến nutifood không có phân phối chuẩn

nutifoods <- as.data.frame(cfdemit$nutifood)
shapiro.test(cfdemit$nutifood)
## 
##  Shapiro-Wilk normality test
## 
## data:  cfdemit$nutifood
## W = 0.91, p-value = 4.537e-09

Vì p-value <0,05 nên ta đủ cơ sở bác bỏ H0, vì vậy biến nutifood không có phân phối chuẩn.

#Kiểm định phân phối mũ
ks.test(cfdemit$nutifood, y=pexp)
## Warning in ks.test.default(cfdemit$nutifood, y = pexp): ties should not be
## present for the Kolmogorov-Smirnov test
## 
##  Asymptotic one-sample Kolmogorov-Smirnov test
## 
## data:  cfdemit$nutifood
## D = 0.99909, p-value < 2.2e-16
## alternative hypothesis: two-sided

H0: biến nutifood có phân phối mũ

H1: biến nutifood không có phân phối mũ

Vì p_value < 0,05 nên ta đủ cơ sở bác bỏ H0, vì vậy biến nutifood không có phân phối mũ.

# Kiểm định phân phối đều
ks.test(cfdemit$nutifood, y = 'punif')
## Warning in ks.test.default(cfdemit$nutifood, y = "punif"): ties should not be
## present for the Kolmogorov-Smirnov test
## 
##  Asymptotic one-sample Kolmogorov-Smirnov test
## 
## data:  cfdemit$nutifood
## D = 1, p-value < 2.2e-16
## alternative hypothesis: two-sided

H0: biến nutifood có phân phối đều

H1: biến nutifood không có phân phối đều

Vì p_value < 0,05 nên ta đủ cơ sở bác bỏ H0, vì vậy biến nutifood không có phân phối đều.

4 Bài tập tuần 2

Đề tài: Chọn và giải thích đối tượng cần mô phỏng (ít ngất có 6 biến ngẫu nhiên)

4.1 Chủ đề chọn:

Mô phỏng doanh thu của quán cafe DEMIT theo ngày trên đường 385 Lê Văn Việt, Quận 9 trong khoảng thời gian từ ngày 1/7/2023 đến cuối năm 2023.

4.2 Khái niệm:

Doanh thu (revenue) là khoản tiển mà doanh nghiệp nhận được khi bán hàng hoá và dịch vụ do nó sản xuất ra. Doanh thu được tính bằng cách lấy giá bán nhân với lượng hàng bán ra.

4.3 Các loại doanh thu:

  • Doanh thu bán hàng: doanh thu thu được từ hoạt động bán hàng hóa, bán thành phẩm/sản phẩm, bán bất động sản đầu tư…

  • Doanh thu cung cấp dịch vụ: doanh thu thu từ dịch vụ du lịch, doanh nghiệp nhận gia công, đại lí…

  • Doanh thu hoạt động tài chính: Doanh thu từ lãi tiền gửi; Doanh thu từ lãi cho vay; Doanh thu từ lãi đầu tư Trái phiếu, tín phiếu; Doanh thù từ các khoản đầu tư; Cổ tức, lợi nhuận được chia; Chiết khấu thanh toán được hưởng.

  • Doanh thu bất thường: là khoản tiền từ các hoạt động không xảy ra thường xuyên như bán vật tư hàng hóa dư thừa, dụng cụ đã phân bố hết, các khoản phải trả nhưng không cần trả, thanh lý tài sản…

  • Doanh thu bán hàng nội bộ: là doanh thu của số sản phẩm, hàng hóa, dịch vụ tiêu thụ trong nội bộ doanh nghiệp, là lợi ích kinh tế thu được từ việc bán hàng hóa, sản phẩm, cung cấp dịch vụ nội bộ giữa các đơn vị trực thuộc hạch toán phụ thuộc trong cùng một công ty, tổng công ty tính theo giá bán nội bộ.

4.4 Xác định vấn đề:

Mô phỏng Doanh thu bán nước của quán cafe Demit dựa trên 6 loại nước bán chạy theo ngày, trong khoảng 6 tháng cuối năm 2023 (từ ngày 1/7/2023 đến cuối năm 2023) để đưa ra ra các nhận định trong 6 tháng tới thông qua các dự báo của mô hình, giúp điều chỉnh ở một số yếu tố để mang lại doanh thu tối ưu nhất.

4.5 Dữ liệu đầu vào:

Tôi đã thu thập dữ liệu doanh thu bán hàng của quán Cafe Demit từ đầu năm 2023 đến cuối tháng 6/2023 (181 quan sát) của 6 món nước bán chạy bao gồm cafe sữa, cafe đen, bạc xỉu, nước cam, sting, nutifood.

setwd("C:/Users/Ngoc Loi/Downloads")
cfdemit <- read.csv("C:/Users/Ngoc Loi/Downloads/datademit.csv")
str(cfdemit)
## 'data.frame':    181 obs. of  7 variables:
##  $ ngay    : chr  "1/1/2023" "1/2/2023" "1/3/2023" "1/4/2023" ...
##  $ Cfs     : int  19 20 16 12 17 20 18 10 16 12 ...
##  $ cfd     : int  6 6 6 9 9 9 5 5 7 9 ...
##  $ cam     : int  14 14 10 12 14 12 14 13 12 8 ...
##  $ bx      : int  16 13 11 11 15 15 14 13 16 13 ...
##  $ sting   : int  18 17 20 17 17 15 15 20 13 15 ...
##  $ nutifood: int  7 8 7 12 11 12 9 10 11 11 ...

4.6 Giải thích biến ý nghĩa

  • ngay: Số quan sát từ ngày 1/1/2023 đến 30/6/2023 (181 quan sát)

  • cfs: Số lượng nước Cafe sữa bán trong 1 ngày

  • cfd: số lượng nước Cafe đen bán trong 1 ngày

  • cam: số lượng nước cam bán trong 1 ngày

  • bx: số lượng nước bạc xỉu bán trong 1 ngày

  • sting: số lượng nước sting bán trong 1 ngày

  • nutifood: số lượng nước nutifood bán trong 1 ngày

4.7 Đối tượng mô phỏng

Doanh thu = Giá bán x số lượng

Mức giá của 6 loại nước bán chạy:

  • Cafe sữa: 18 nghìn đồng/ly

  • Cafe đen: 15 nghìn đồng/ly

  • Nước cam: 25 nghìn đồng/ly

  • Bạc xỉu: 22 nghìn đồng/ly

  • Sting: 20 nghìn đồng/chai

  • Nutifood: 20 nghìn đồng/ chai

4.8 Bảng thống kê

summary(cfdemit)
##      ngay                Cfs             cfd              cam       
##  Length:181         Min.   :10.00   Min.   : 5.000   Min.   : 8.00  
##  Class :character   1st Qu.:12.00   1st Qu.: 6.000   1st Qu.:10.00  
##  Mode  :character   Median :16.00   Median : 7.000   Median :11.00  
##                     Mean   :15.28   Mean   : 7.293   Mean   :11.48  
##                     3rd Qu.:18.00   3rd Qu.: 9.000   3rd Qu.:14.00  
##                     Max.   :20.00   Max.   :10.000   Max.   :15.00  
##        bx            sting          nutifood     
##  Min.   :10.00   Min.   :12.00   Min.   : 7.000  
##  1st Qu.:11.00   1st Qu.:14.00   1st Qu.: 8.000  
##  Median :13.00   Median :16.00   Median : 9.000  
##  Mean   :13.27   Mean   :15.86   Mean   : 9.519  
##  3rd Qu.:15.00   3rd Qu.:18.00   3rd Qu.:11.000  
##  Max.   :17.00   Max.   :20.00   Max.   :12.000

Trong khoảng thời gian từ đầu tháng 1/2023 đến cuối tháng 6/2023

  • Số ly cafe sữa bán nhiều nhất trong ngày là 20 ly, ít nhất là 10 ly và trung bình một ngày bán được 9 ly.

  • Số ly cafe đen bán nhiều nhất trong ngày là 10 ly, ít nhất là 5 ly và trung bình một ngày bán được 7 ly.

  • Số ly nước cam bán nhiều nhất trong ngày là 15 ly, ít nhất là 8 ly và trung bình một ngày bán được 11 ly.

  • Số ly bạc xỉu bán nhiều nhất trong ngày là 17 ly, ít nhất là 10 ly và trung bình một ngày bán được 16 ly.

  • Số chai sting bán nhiều nhất trong ngày là 20 chai, ít nhất là 12 chai và trung bình một ngày bán được 7 chai.

  • Số chai nutifood bán nhiều nhất trong ngày là 12 chai, ít nhất là 7 chai và trung bình một ngày bán được 9 chai.

5 Bài tập tuần 1

5.0.1 Phân phối chuẩn

Giả sử: giá cổ phiếu ban đầu là 100 VNĐ với lợi suất trung bình là 5% và độ lệch chuẩn là 0.2. Tiến hành mô phỏng ngẫu nhiên 1000 giá trị của một cổ phiếu theo phân phối chuẩn, với công thức tính như sau:

\(S_t = S_0 e^{(r - \frac{\sigma^2}{2})t + \sigma W_t}\)

# Giá cổ phiếu ban đầu
S01 <- 100 
# Lợi suất trung bình
mu1 <- 0.05 
# Độ lệch chuẩn
sigma1 <- 0.2 
# Thời gian đến hết hạn
T1 <- 1 
# Số lượng giá trị cần mô phỏng
N1 <- 1000 
# Tạo số ngẫu nhiên theo phân phối chuẩn
Z1 <- rnorm(N1)
# Tính giá cổ phiếu 
S1 <- S01 * exp((mu1 - 0.5 * sigma1^2) * T1 + sigma1 * sqrt(T1) * Z1)
plot(S1, type = "l", main = "Mô phỏng giá cổ phiếu theo phân phối chuẩn", xlab = "Thời gian", ylab = "Giá cổ phiếu")

hist(S1, main = "phân phối chuẩn", xlab = "S", col="pink")

Dựa vào biểu đồ histogram, ta thấy giá dao động nhiều nhất ở mức giá +- 100, và thấp nhất ở khoảng +-50 và +-180.

summary(S1)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   58.75   90.88  103.24  105.44  117.69  197.03

Từ kết quả trên, ta xác định được như sau: Giá cổ phiếu thấp nhất ở mức 58.75 với trung bình là 105.44 và giá cao nhất là 197.03

5.0.2 Phân phối nhị phân

Giả sử tôi muốn mô phỏng tung đồng xu 100 lần với xác suất ra mặt ngửa là 50%.

rbinom(100, 1, 0.5)
##   [1] 0 0 0 1 0 1 0 0 0 0 1 0 1 1 1 0 1 0 0 0 1 0 1 0 0 0 1 1 0 1 1 1 1 0 0 1 1
##  [38] 1 1 1 0 0 0 1 1 1 1 0 0 0 1 0 1 0 1 0 1 1 1 1 0 1 1 1 0 0 0 0 1 1 0 1 1 0
##  [75] 1 1 1 0 1 0 0 1 1 0 0 1 0 1 1 0 0 0 0 0 0 1 1 0 1 0

Kết quả sẽ là một vector có 100 phần tử, mỗi phần tử là 0 hoặc 1, tương ứng với mặt sấp hoặc mặt ngửa

K1 <-table(rbinom(100, 1, 0.5))
K1
## 
##  0  1 
## 49 51
library(ggplot2)
barplot(table(K1), col="pink")

vậy số lần ra mặt sấp là 55 và mặt ngữa là 45 lần.

5.0.3 Phân phối Poisson

Tôi muốn mô phỏng 100 lần quan sát số lượng xe hơi đi ngang qua trong một giờ, với giả sử rằng trung bình có 20 xe hơi sẽ đi ngang qua trong một giờ.

C1 <-rpois(100, 20)
table(C1)
## C1
## 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 28 30 33 34 
##  1  2  1  5  6 13  9  7  6  8  7 10  8  6  2  3  2  2  1  1
hist(C1, main="Phân phối Poisson", xlab ="C1", col="pink")

summary(C1)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   11.00   16.00   19.50   19.75   22.25   34.00

Số lần xe đi qua trong 1 giờ nhiều nhất là 35 lần, ít nhất là 11 lần với giá trị trung bình là 20.4

5.0.4 Phân phối đều

Giả sử tôi muốn mô phỏng số ngẫu nhiên được phát sinh bởi máy tính, nếu giả sử rằng số ngẫu nhiên có thể, tôi muốn mô phỏng 100 số ngẫu nhiên trong khoảng từ 0 đến 1, bạn có thể viết:

u1 <- runif(n=100,min = 0,max = 1)
hist(u1, main = "phân phối đều", xlab = "u",col="pink")

summary(u1)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
## 0.01034 0.28838 0.52345 0.51771 0.76231 0.96272

Xác suất để máy tính phát sinh nhiều nhất là 98.8%, thấp nhất là 0.9% với trung bình là 0.512895

5.0.5 Phân phối mũ

Tôi muốn mô phỏng 100 lần quan sát thời gian giữa hai cuộc gọi đến trung tâm dịch vụ khách hàng, nếu giả sử rằng tỷ lệ của phân phối mũ là 0.2, tức là trung bình có 0.2 cuộc gọi đến trong một đơn vị thời gian.

i1 <- rexp(n=100,rate=0.2)
hist(i1, main = "phân phối mũ", xlab = "i1", col="pink")

summary(i1)
##     Min.  1st Qu.   Median     Mean  3rd Qu.     Max. 
##  0.03926  1.46991  3.22197  5.20700  8.30982 23.55333

Số lân 2 cuộc gọi đến cùng lúc nhiều nhất là 21.3, thấp nhất là 0.003049 với trung bình là 4.773907

LS0tDQp0aXRsZTogIkJUQVAgVkUgTkhBIFRV4bqmTiAxLTItMy00LTUiDQphdXRob3I6ICJOZ3V54buFbiBU4bqlbiBM4buZYyINCmRhdGU6ICIyMDIzLTA2LTI0Ig0Kb3V0cHV0Og0KICBodG1sX2RvY3VtZW50Og0KICAgIHRvYzogdHJ1ZQ0KICAgIG51bWJlcl9zZWN0aW9uczogeWVzDQogICAgdG9jX2Zsb2F0Og0KICAgICAgY29sbGFwc2VkOiBubw0KICAgICAgZGZfcHJpbnQ6IHBhZ2VkDQogICAgICBoaWdobGlnaHQ6IGthdGUNCiAgICBjb2RlX2ZvbGRpbmc6IGhpZGUNCiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlDQotLS0NCg0KYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9DQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IFRSVUUpDQpgYGANCg0KIyBCw6BpIHThuq1wIHR14bqnbiA1ICsgNg0KDQrEkOG7gTogQ2jhuqF5IG3DtCBow6xuaCB24bubaSBjw6FjIHBow6JuIHBo4buRaSBraMOhYyBuaGF1IHbhu5tpIGPDoWMgYmnhur9uIMSR4bqndSB2w6BvLg0KDQpgYGB7cn0NCmxpYnJhcnkoJ3BzeWNoJykNCnNldHdkKCJDOi9Vc2Vycy9OZ29jIExvaS9Eb3dubG9hZHMiKQ0KY2ZkZW1pdCA8LSByZWFkLmNzdigiQzovVXNlcnMvTmdvYyBMb2kvRG93bmxvYWRzL2RhdGFkZW1pdC5jc3YiKQ0KbGlicmFyeShEVCkNCmNmZGVtaXQgJT4lIERUOjpkYXRhdGFibGUoY2ZkZW1pdCkNCmBgYA0KIyMgVMONTkggVsOAIMav4buaQyBMxq/hu6JORyBET0FOSCBUSFUNCg0KYGBge3J9DQpET0FOSFRIVSA8LSAxODAwMCAqIGNmZGVtaXQkQ2ZzICsgMTUwMDAgKiBjZmRlbWl0JGNmZCAgKzI1MDAwICogY2ZkZW1pdCRjYW0gKwkyMjAwMCAqIGNmZGVtaXQkYnggICsgMjAwMDAgKiBjZmRlbWl0JHN0aW5nICsgMjAwMDAgKiBjZmRlbWl0JG51dGlmb29kDQpzdW1tYXJ5KERPQU5IVEhVKQ0KYGBgDQoNCkJp4bq/biBkb2FuaCB0aHUgKERUKSB0cm9uZyBraG/huqNuZyBbMS4xNTUuMDAwOzEuNzg0LjAwMF0NCg0KKsSQVlQ6IMSQ4buTbmcNCg0KROG7sWEgdsOgbyBi4bqjbmcgdGjhu5FuZyBrw6ogbcO0IHThuqMsIHTDtGkgxrDhu5tjIGzGsOG7o25nIGRvYW5oIHRodSBj4bunYSBjZmRlbWl0IG5oxrAgc2F1Og0KDQotIERvYW5oIHRodSB0aOG6pXAgc+G6vSBkxrDhu5tpIDEuMzAwLjAwMMSRIHRyw6puIDEgbmfDoHkNCg0KLSBEb2FuaCB0aHUgduG7q2Egc+G6vSB04burIDEuMzAwLjAwMMSRIMSR4bq/biAxLjUwMC4wMDDEkSB0csOqbiAxIG5nw6B5DQoNCi0gRG9hbmggdGh1IGNhbyBz4bq9IHThu6sgMS41MDAwLjAwMCDEkeG7k25nIHRy4bufIGzDqm4gdHLDqm4gMSBuZ8OgeQ0KDQpgYGB7cn0NCkRUdGhhcCA8LSBET0FOSFRIVVtET0FOSFRIVSA8IDEzMDAwMDBdDQpEVHZ1YSA8LSBET0FOSFRIVVtET0FOSFRIVSA+IDEzMDAwMDAwICYgRE9BTkhUSFUgPD0gMTUwMDAwMF0NCkRUY2FvIDwtIERPQU5IVEhVW0RPQU5IVEhVPiAxNTAwMDAwXQ0KDQp0YWJsZShjdXQoRE9BTkhUSFUsYnJlYWtzID0gMykpDQpgYGANCmBgYHtyfQ0KZG9hbmh0aHUxIDwtdGFibGUoY3V0KERPQU5IVEhVLDMsIGxhYmVscyA9IGMoJ3RoYXAnLCd2dWEnLCdjYW8nKSkpDQpkb2FuaHRodTENCmBgYA0KDQpU4burIGvhur90IHF14bqjIHRyw6puLCBEb2FuaCB0aHUgY+G7p2EgMTgxIG5nw6B5IHRyb25nIDYgdGjDoW5nIMSR4bqndSBuxINtIDIwMjMgY+G7p2EgcXXDoW4gY2ZkZW1pdCBn4buTbSBjw7MgMzIgbmfDoHkgdGh1IGTGsOG7o2MgZG9hbmggdGh1IHRo4bqlcCwgMTEzIG5nw6B5IHRodSDEkcaw4bujYyBkb2FuaCB0aHUgduG7q2EgdsOgIDM2IG5nw6B5IHRodSDEkcaw4bujYyBkb2FuaCB0aHUgY2FvLg0KYGBge3J9DQpsaWJyYXJ5KHBhc3RlY3MpIA0Kc3RhdC5kZXNjKERPQU5IVEhVKQ0KYGBgDQpE4buxYSB2w6BvIGLhuqNuZyB0aOG7kW5nIGvDqiBtw7QgdOG6oywgdMO0aSBjw7MgdGjhu4MgaGnhu4N1IHLDtSBoxqFuIHbhu4EgZG9hbmggdGh1IGPhu6dhICBuaMawIHNhdToNCg0KLSBUw7RpIGPDsyAxODEgZ2nDoSB0cuG7iyBkb2FuaCB0aHUsIGtow7RuZyBjw7MgZ2nDoSB0cuG7iyBi4bqxbmcgMCBoYXkgYuG7iyB0aGnhur91Lg0KDQotIERvYW5oIHRodSBuaOG7jyBuaOG6pXQgY+G7p2EgdMO0aSBsw6AgMS4xNTUuMDAwIMSR4buTbmcsIGzhu5tuIG5o4bqldCBsw6AgMS43ODQuMDAwIMSR4buTbmcuDQoNCi0gUGjhuqFtIHZpIGJp4bq/biB0aGnDqm4gY+G7p2EgZG9hbmggdGh1IGPhu6dhIGLhuqFuIGzDoCA2MjkuMDAwIMSR4buTbmcsIHThu6ljIGzDoCBz4buxIGNow6puaCBs4buHY2ggZ2nhu69hIGRvYW5oIHRodSBjYW8gbmjhuqV0IHbDoCB0aOG6pXAgbmjhuqV0Lg0KDQotIFThu5VuZyBkb2FuaCB0aHUgY+G7p2EgdMO0aSBsw6AgMjY2LjI0Mi4wMDAgxJHhu5NuZy4NCg0KLSBUcnVuZyB24buLIGRvYW5oIHRodSBj4bunYSB0w7RpIGzDoCAxLjQ3Ny4wMDAgxJHhu5NuZywgdOG7qWMgbMOgIG7hur91IHPhuq9wIHjhur9wIGPDoWMgZ2nDoSB0cuG7iyBkb2FuaCB0aHUgdGhlbyB0aOG7qSB04buxIHTEg25nIGThuqduLCB0aMOsIGdpw6EgdHLhu4sg4bufIHbhu4sgdHLDrSB0aOG7qSA5MSBz4bq9IGzDoCB0cnVuZyB24buLIC4NCg0KLSBUcnVuZyBiw6xuaCBj4buZbmcgZG9hbmggdGh1IGPhu6dhIHTDtGkgbMOgIDEuNDcwLjk1MCDEkeG7k25nLCB04bupYyBsw6AgbuG6v3UgY2hpYSB04buVbmcgZG9hbmggdGh1IGNobyBz4buRIGzGsOG7o25nIGdpw6EgdHLhu4ssIHRow6wgc+G6vSDEkcaw4bujYyBr4bq/dCBxdeG6oyBuw6B5Lg0KDQotIFNhaSBz4buRIGNodeG6qW4gY+G7p2EgdHJ1bmcgYsOsbmggY+G7mW5nIGRvYW5oIHRodSBj4bunYSB0w7RpIGzDoCA4LjcyNCDEkeG7k25nLCB04bupYyBsw6AgxJHhu5kgbOG7h2NoIGNodeG6qW4gY+G7p2EgZG9hbmggdGh1IGNoaWEgY2hvIGPEg24gYuG6rWMgaGFpIGPhu6dhIHPhu5EgbMaw4bujbmcgZ2nDoSB0cuG7iyAuDQoNCi0gS2hv4bqjbmcgdGluIGPhuq15IDk1JSBjaG8gdHJ1bmcgYsOsbmggY+G7mW5nIGRvYW5oIHRodSBj4bunYSB0w7RpIGzDoCAxNy4yMTYgxJHhu5NuZywgdOG7qWMgbMOgIGtob+G6o25nIGNo4bupYSBnacOhIHRy4buLIHRo4buxYyBz4buxIGPhu6dhIHRydW5nIGLDrG5oIGPhu5luZyBkb2FuaCB0aHUgduG7m2kgeMOhYyBzdeG6pXQgOTUlIC4NCg0KLSBQaMawxqFuZyBzYWkgY+G7p2EgZG9hbmggdGh1IGPhu6dhIHTDtGkgbMOgIDEzLjc3OC4xMzAuMDAwIMSR4buTbmcsIHThu6ljIGzDoCB0cnVuZyBiw6xuaCBj4buZbmcgY+G7p2EgYsOsbmggcGjGsMahbmcgY8OhYyDEkeG7mSBs4buHY2ggc28gduG7m2kgdHJ1bmcgYsOsbmggY+G7mW5nLg0KDQotIMSQ4buZIGzhu4djaCBjaHXhuqluIGPhu6dhIGRvYW5oIHRodSBj4bunYSB0w7RpIGzDoCAxMTcuMzgwIMSR4buTbmcsIHThu6ljIGzDoCBjxINuIGLhuq1jIGhhaSBj4bunYSBwaMawxqFuZyBzYWkgLg0KDQotIEjhu4cgc+G7kSBiaeG6v24gxJHhu5luZyBj4bunYSBkb2FuaCB0aHUgY+G7p2EgdMO0aSBsw6AgNy45OCUsIHThu6ljIGzDoCDEkeG7mSBs4buHY2ggY2h14bqpbiBjaGlhIGNobyB0cnVuZyBiw6xuaCBj4buZbmcgLg0KDQpgYGB7cn0NCmxpYnJhcnkoZ2dwbG90MikNCmRvYW5odGh1MSA8LSBjKERvYW5odGh1dGhhcCA9IDMyLCBEb2FuaHRodXZ1YSA9IDExMywgRG9hbmh0aHVjYW8gPSAzNikNCmxhYmVsczEgPC0gYygiRG9hbmggdGh1IHRo4bqlcCIsICJEb2FuaCB0aHUgduG7q2EiLCAiRG9hbmggdGh1IGNhbyIpDQpjb2xvcnMxIDwtIGMoImJsdWUiLCAicmVkIiwgImdyZWVuIikNCmJhcnBsb3QoZG9hbmh0aHUxLCBuYW1lcy5hcmcgPSBsYWJlbHMxLCBjb2wgPSBjb2xvcnMxKQ0KYGBgDQoNCiMjIEtp4buDbSDEkeG7i25oIHBow6JuIHBo4buRaSBkb2FuaCB0aHUNCg0KYGBge3J9DQojIEtp4buDbSDEkeG7i25oIHBow6JuIHBo4buRaSBjaHXhuqluDQpoaXN0KERPQU5IVEhVLCBjb2w9ImJsdWUiKQ0KYGBgDQoNCsSQ4bq3dCBnaeG6oyB0aHV54bq/dDoNCg0KJEhfMCQ6IGJp4bq/biBET0FOSFRIVSBjw7MgcGjDom4gcGjhu5FpIGNodeG6qW4NCg0KJEhfMSQ6IGJp4bq/biBET0FOSFRIVSBraMO0bmcgY8OzIHBow6JuIHBo4buRaSBjaHXhuqluDQoNCmBgYHtyfQ0Kc2hhcGlyby50ZXN0KERPQU5IVEhVKQ0KYGBgDQpWw6wgcC12YWx1ZSA9IDAuOTY4MyA+IDAsMDUgbsOqbiBiaeG6v24gRE9BTkhUSFUgY8OzIHBow6JuIHBo4buRaSBjaHXhuqluLg0KDQpgYGB7cn0NCmxpYnJhcnkoZ2dwdWJyKQ0KZ2dxcXBsb3QoRE9BTkhUSFUsY29sPSJibHVlIikNCmBgYA0KDQpWw6wgYmnhur9uIERPQU5IVEhVIGPDsyBwaMOibiBwaOG7kWkgY2h14bqpbiBuw6puIHRhIHRodSDEkcaw4bujYyBr4bq/dCBxdeG6oyB04burIGJp4buDdSDEkeG7kyB0csOqbiBjw7MgY8OhYyBnacOhIHRy4buLIMSR4buBdSBu4bqxbSB0csOqbiDEkcaw4budbmcgdGjhurNuZy4NCg0KYGBge3J9DQojS2nhu4NtIMSR4buLbmggcGjDom4gcGjhu5FpIG3FqQ0Ka3MudGVzdChET0FOSFRIVSwgeT1wZXhwKQ0KYGBgDQokSF8wJDogYmnhur9uIERPQU5IVEhVIGPDsyBwaMOibiBwaOG7kWkgbcWpDQoNCiRIXzEkOiBiaeG6v24gRE9BTkhUSFUga2jDtG5nIGPDsyBwaMOibiBwaOG7kWkgbcWpDQoNClbDrCBwX3ZhbHVlIDwgMCwwNSBuw6puIHRhIMSR4bunIGPGoSBz4bufIGLDoWMgYuG7jyAkSF8wJCwgdsOsIHbhuq15IGJp4bq/biBET0FOSFRIVSBraMO0bmcgY8OzIHBow6JuIHBo4buRaSBtxakuDQoNCmBgYHtyfQ0KIyBLaeG7g20gxJHhu4tuaCBwaMOibiBwaOG7kWkgxJHhu4F1DQprcy50ZXN0KERPQU5IVEhVLCB5ID0gJ3B1bmlmJykNCmBgYA0KJEhfMCQ6IGJp4bq/biBET0FOSFRIVSBjw7MgcGjDom4gcGjhu5FpIMSR4buBdQ0KDQokSF8xJDogYmnhur9uIERPQU5IVEhVIGtow7RuZyBjw7MgcGjDom4gcGjhu5FpIMSR4buBdQ0KDQpWw6wgcF92YWx1ZSA8IDAsMDUgbsOqbiB0YSDEkeG7pyBjxqEgc+G7nyBiw6FjIGLhu48gJEhfMCQsIHbDrCB24bqteSBiaeG6v24gRE9BTkhUSFUga2jDtG5nIGPDsyBwaMOibiBwaOG7kWkgxJHhu4F1Lg0KDQpgYGB7cn0NCiMjIEtp4buDbSDEkeG7i25oIHBow6JuIHBo4buRaSBsb2dhIGNodeG6qW4gDQprcy50ZXN0KERPQU5IVEhVLCB5ID0gInBsbm9ybSIpDQpgYGANCsSQ4bq3dCBnaeG6oyB0aGnhur90Og0KDQokSF8wJDogYmnhur9uIERPQU5IVEhVIGPDsyBwaMOibiBwaOG7kWkgbG9nYSBjaHXhuqluDQoNCiRIXzEkOiBiaeG6v24gRE9BTkhUSFUga2jDtG5nIGPDsyBwaMOibiBwaOG7kWkgbG9nYSBjaHXhuqluDQoNClbDrCBwX3ZhbHVlIDwgMCwwNSBuw6puIHRhIMSR4bunIGPGoSBz4bufIGLDoWMgYuG7jyBIMCwgdsOsIHbhuq15IGJp4bq/biBET0FOSFRIVSBraMO0bmcgY8OzIHBow6JuIHBo4buRaSBsb2dhIGNodeG6qW4uDQoNCg0KIyMgTcO0IHBo4buPbmcgcGjDom4gcGjhu5FpIGNodeG6qW4gYmnhur9uIERPQU5IVEhVIHRyb25nIDE4NCBuZ8OgeSB04bubaQ0KDQpWw6wgRE9BTkhUSFUgdGhlbyBwaMOibiBwaOG7kWkgY2h14bqpbiwgbsOqbiB0w7RpIHRp4bq/biBow6BuaCBtw7QgcGjhu49uZyBkb2FuaCB0aHUgdHJvbmcgMTg0IG5nw6B5IHThu5tpLg0KDQpgYGB7cn0NCnNkKERPQU5IVEhVKQ0KYGBgDQoNCmBgYHtyfQ0Kc2V0LnNlZWQoMTIzKQ0KTDEgPC0gcm5vcm0obj0gMTg0LCBtZWFuPSAxNDcwOTUwLjMgLHNkPSAxMTczODApIA0KaGlzdChMMSwgbWFpbiA9ICJNw7QgcGjhu49uZyBkb2FuaCB0aHUgdGhlbyBwaMOibiBwaOG7kWkgY2h14bqpbiIsIHhsYWIgPSAiTDEiLCBjb2wgPSAibGlnaHRwaW5rIikNCmBgYA0KDQpgYGB7cn0NCmxpYnJhcnkoZ2dwdWJyKQ0KZ2dxcXBsb3QoTDEsY29sPSJibHVlIikNCmBgYA0KDQpgYGB7cn0NCnN1bW1hcnkoTDEpDQpgYGANCkRvYW5oIHRodSBtw7QgcGjhu49uZyB0cm9uZyAxODQgbmfDoHkgdOG7m2kgY8OzIGdpw6EgdHLhu4sgdHJ1bmcgYsOsbmggbMOgIDEuNDcwLjkxMywgY8OzIGdpw6EgdHLhu4sgdGjhuqVwIG5o4bqldCBsw6AgMS4xOTkuOTAwIHbDoCBjw7MgZ2nDoSB0cuG7iyBs4bubbiBuaOG6pXQgbMOgIDEuODUxLjM4NA0KDQojIyBOaOG6rW4geMOpdA0KDQpgYGB7cn0NCnNldC5zZWVkKDEyMykNCkRUdGhhcDEgPC0gTDFbTDEgPCAxMzAwMDAwXQ0KRFR2dWExIDwtIEwxW0wxID4gMTMwMDAwMDAgJiBMMSA8PSAxNTAwMDAwXQ0KRFRjYW8xIDwtIEwxW0wxPiAxNTAwMDAwXQ0KDQp0YWJsZShjdXQoTDEsYnJlYWtzID0gMykpDQpgYGANCmBgYHtyfQ0KdGFibGUoY3V0KEwxLDMsIGxhYmVscyA9IGMoJ3RoYXAnLCd2dWEnLCdjYW8nKSkpDQpgYGANCkRvYW5oIHRodSBtw7QgcGjhu49uZyB0aHUgxJHGsOG7o2MgY8OzIDU4IG5nw6B5IGPDsyBkb2FuaCB0aHUgdGjhuqVwLCAxMTMgbmfDoHkgY8OzIGRvYW5oIHRodSB24burYSB2w6AgMTQgbmfDoHkgY8OzIGRvYW5oIHRodSBjYW8uDQoNCk7hur91IGPDoWMgeeG6v3UgdOG7kSBraMOhYyBraMO0bmcgdGhheSDEkeG7lWksIHRow6wgdMO0aSBk4buxIMSRb8OhbiBxdcOhbiBjZmRlbWl0IHbhuqtuIGhv4bqhdCDEkeG7mW5nIGLDrG5oIHRoxrDhu51uZy4NCg0KYGBge3J9DQpwYXIobWZyb3c9YygxLDMpKQ0KaGlzdChMMSwgY29sPSJibHVlIikNCmJveHBsb3QoTDEsIGNvbD0iYmx1ZSIpDQpwbG90KGRlbnNpdHkoTDEpLCBjb2w9ImJsdWUiKQ0KYGBgDQoNCkdp4bqjaSB0aMOtY2ggw70gbmdoxKlhOg0KDQrEkOG7kyB0aOG7iyBj4buZdCAoaGlzdG9ncmFtKSBjaG8gYmnhur90IHThuqduIHN14bqldCB4deG6pXQgaGnhu4duIGPhu6dhIGPDoWMgZ2nDoSB0cuG7iyB0cm9uZyBiaeG6v24gTDEoRG9hbmggdGh1IG3DtCBwaOG7j25nKS4gVMO0aSBjw7MgdGjhu4MgbmjDrG4gdGjhuqV5IHLhurFuZyBwaOG6p24gbOG7m24gY8OhYyBnacOhIHRy4buLIG7hurFtIHRyb25nIGtob+G6o25nIHThu6sgMS4yMDAuMDAwIMSR4bq/biAxLjgwMC4wMDAsIHbDoCBjw7MgbeG7mXQgc+G7kSAuIEjhuqd1IGjhur90IMSRxrDhu6NjIHBow6JuIGLhu5Egbmhp4buBdSBuaOG6pXQgdOG6oWkgMS40MDAuMDAwxJEuDQoNCsSQ4buTIHRo4buLIGjhu5lwIChib3hwbG90KSBjaG8gYmnhur90IGPDoWMgdGjDtG5nIHPhu5EgbcO0IHThuqMgY+G7p2EgYmnhur9uIEwxLCB0cnVuZyB24buLIOG7nyBraG/huqNuZyAxLjUwMC4wMDAuDQoNCsSQ4buTIHRo4buLIG3huq10IMSR4buZIChkZW5zaXR5IHBsb3QpIGNobyBiaeG6v3QgaMOsbmggZOG6oW5nIGPhu6dhIHBow6JuIGLhu5EgY+G7p2EgYmnhur9uIEZUUzEsIG3hu5l0IMSR4buJbmgg4bufIGtob+G6o25nIDEuNTAwLjAwMC4gxJDhu5MgdGjhu4sgbsOgeSBjxaluZyBjaG8gYmnhur90IMSR4buZIHLhu5luZyBixINuZyB0aMO0bmcgKGJhbmR3aWR0aCA9My4zMThlKzA0KS4NCg0KYGBge3J9DQpsaWJyYXJ5KGdncGxvdDIpDQpkb2FuaHRodTIgPC0gYyhEb2FuaHRodXRoYXAgPSA1OCwgRG9hbmh0aHV2dWEgPSAxMTIsIERvYW5odGh1Y2FvID0gMTQpDQpiYXJwbG90KGRvYW5odGh1MiwgbmFtZXMuYXJnID0gbGFiZWxzMSwgY29sID0gY29sb3JzMSkNCmBgYA0KDQojIELDoGkgdOG6rXAgdHXhuqduIDQNCg0KxJDhu4E6IFjDonkgZOG7sW5nIG3DtCBow6xuaCBjaG8gxJHhu5FpIHTGsOG7o25nIGPhuqduIG3DtCBwaOG7j25nIHbDoCBnaeG6o2kgdGjDrWNoIG3DtCBow6xuaC4NCg0KIyMgWMOhYyDEkeG7i25oIG3DtCBow6xuaCBEb2FuaCB0aHUgY+G7p2EgcXXDoW4gY2YgRGVtaXQgcXVhIDYgbG/huqFpIG7GsOG7m2MgYsOhbiBuaGnhu4F1IG5o4bqldDoNCg0KRG9hbmggdGh1ID0gxJDGoW4gZ2nDoSB4IFPhu5EgbMaw4bujbmcNCg0KJERvYW5oIHRodSA9IMSQR197Q2ZzfS5TTF97Q2ZzfSArIMSQR197Y2ZkfS4gU0xfe2NmZH0gK8SQR197Y2FtfS4gLlNMX3tjYW19KwnEkEdfe2J4fS5TTF97Ynh9ICsgxJBHX3tzdGluZ30uU0xfe3N0aW5nfSsgxJBHX3tudXRpZm9vZH0gLlNMX3tudXRpZm9vZH0kDQoNCkPhu6UgdGjhu4MgbMOgOg0KDQokRG9hbmggdGh1ID0gMTgwMDAuU0xfe0Nmc30gKyAxNTAwMC4gU0xfe2NmZH0gKzI1MDAwIC5TTF97Y2FtfSsJMjIwMDAgLlNMX3tieH0gKyAyMDAwMC5TTF97c3Rpbmd9KyAyMDAwMCAuU0xfe251dGlmb29kfSQNCg0KR2nhuqNpIHRow61jaCBtw7QgaMOsbmggZG9hbmggdGh1IHRoZW8gbmfDoHk6DQoNCi0gJMSQR197Q2ZzfSRsw6AgxJHGoW4gZ2nDoSBj4bunYSAxIGx5IGNhZmUgc+G7r2EgKMSQVlQ6IMSR4buTbmcpDQoNCi0gJFNMX3tDZnN9JCBsw6Agc+G7kSBsxrDhu6NuZyBseSBjYWZlIHPhu69hIGLDoW4gcmEgdHJvbmcgMSBuZ8OgeQ0KDQotICTEkEdfe2NmZH0kIGzDoCDEkcahbiBnacOhIGPhu6dhIDEgbHkgY2FmZSDEkWVuKMSQVlQ6IMSR4buTbmcpDQoNCi0gJFNMX3tjZmR9JCBsw6Agc+G7kSBsxrDhu6NuZyBseSBjYWZlIMSRZW4gYsOhbiByYSB0cm9uZyAxIG5nw6B5DQoNCi0gJMSQR197Y2FtfSQgbMOgIMSRxqFuIGdpw6EgY+G7p2EgMSBseSBuxrDhu5tjIGNhbSAoxJBWVDogxJHhu5NuZykNCg0KLSAkU0xfe2NhbX0kIGzDoCBz4buRIGzGsOG7o25nIGx5IG7GsOG7m2MgY2FtIGLDoW4gcmEgdHJvbmcgMSBuZ8OgeQ0KDQotICTEkEdfe2J4fSQgbMOgIMSRxqFuIGdpw6EgY+G7p2EgMSBseSBi4bqhYyB44buJdSAoxJBWVDogxJHhu5NuZykNCg0KLSAkU0xfe2J4fSQgbMOgIHPhu5EgbMaw4bujbmcgbHkgYuG6oWMgeOG7iXUgYsOhbiByYSB0cm9uZyAxIG5nw6B5DQoNCi0gJMSQR197c3Rpbmd9JCBsw6AgxJHGoW4gZ2nDoSBj4bunYSAxIGx5IHN0aW5nIHPhu69hICjEkFZUOiDEkeG7k25nKQ0KDQotICRTTF97c3Rpbmd9JCBsw6Agc+G7kSBsxrDhu6NuZyBseSBzdGluZyBiw6FuIHJhIHRyb25nIDEgbmfDoHkNCg0KLSAkxJBHX3tudXRpZm9vZH0kIGzDoCDEkcahbiBnacOhIGPhu6dhIDEgbHkgbnV0aWZvb2QgKMSQVlQ6IMSR4buTbmcpDQoNCi0gJFNMX3tudXRpZm9vZH0kIGzDoCBz4buRIGzGsOG7o25nIGx5IG51dGlmb29kIGLDoW4gcmEgdHJvbmcgMSBuZ8OgeQ0KDQojIELDoGkgdOG6rXAgdHXhuqduIDMNCg0KIyMgxJDhu4E6IFjDoWMgxJFpbmggcGjDom4gcGjhu5FpIGPDoWMgYmnhur9uDQoNCmBgYHtyfQ0Kc2V0d2QoIkM6L1VzZXJzL05nb2MgTG9pL0Rvd25sb2FkcyIpDQpjZmRlbWl0IDwtIHJlYWQuY3N2KCJDOi9Vc2Vycy9OZ29jIExvaS9Eb3dubG9hZHMvZGF0YWRlbWl0LmNzdiIpDQpzdHIoY2ZkZW1pdCkNCmBgYA0KDQojIyBYw6FjIMSR4buLbmggcGjDom4gcGjhu5FpIGPhu6dhIGJp4bq/biBDZnMNCg0KYGBge3J9DQojIEtp4buDbSDEkeG7i25oIHBow6JuIHBo4buRaSBjaHXhuqluDQpoaXN0KGNmZGVtaXQkQ2ZzKQ0KYGBgDQoNCsSQ4bq3dCBnaeG6oyB0aHV54bq/dDoNCg0KSDA6IGJp4bq/biBDZnMgY8OzIHBow6JuIHBo4buRaSBjaHXhuqluDQoNCkgxOiBiaeG6v24gQ2ZzIGtow7RuZyBjw7MgcGjDom4gcGjhu5FpIGNodeG6qW4NCg0KYGBge3J9DQpDZnNzIDwtIGFzLmRhdGEuZnJhbWUoY2ZkZW1pdCRDZnMpDQpzaGFwaXJvLnRlc3QoY2ZkZW1pdCRDZnMpDQpgYGANClbDrCBwLXZhbHVlIDwwLDA1IG7Dqm4gdGEgxJHhu6cgY8ahIHPhu58gYsOhYyBi4buPIEgwLCB2w6wgduG6rXkgYmnhur9uIENmcyBraMO0bmcgY8OzIHBow6JuIHBo4buRaSBjaHXhuqluDQoNCmBgYHtyfQ0KI0tp4buDbSDEkeG7i25oIHBow6JuIHBo4buRaSBtxakNCmtzLnRlc3QoY2ZkZW1pdCRDZnMsIHk9cGV4cCkNCmBgYA0KSDA6IGJp4bq/biBDZnMgY8OzIHBow6JuIHBo4buRaSBtxakNCg0KSDE6IGJp4bq/biBDZnMga2jDtG5nIGPDsyBwaMOibiBwaOG7kWkgbcWpDQoNClbDrCBwX3ZhbHVlIDwgMCwwNSBuw6puIHRhIMSR4bunIGPGoSBz4bufIGLDoWMgYuG7jyBIMCwgdsOsIHbhuq15IGJp4bq/biBDZnMga2jDtG5nIGPDsyBwaMOibiBwaOG7kWkgbcWpLg0KDQpgYGB7cn0NCiMgS2nhu4NtIMSR4buLbmggcGjDom4gcGjhu5FpIMSR4buBdQ0Ka3MudGVzdChjZmRlbWl0JENmcywgeSA9ICdwdW5pZicpDQpgYGANCkgwOiBiaeG6v24gQ2ZzIGPDsyBwaMOibiBwaOG7kWkgxJHhu4F1DQoNCkgxOiBiaeG6v24gQ2ZzIGtow7RuZyBjw7MgcGjDom4gcGjhu5FpIMSR4buBdQ0KDQpWw6wgcF92YWx1ZSA8IDAsMDUgbsOqbiB0YSDEkeG7pyBjxqEgc+G7nyBiw6FjIGLhu48gSDAsIHbDrCB24bqteSBiaeG6v24gQ2ZzIGtow7RuZyBjw7MgcGjDom4gcGjhu5FpIMSR4buBdS4NCg0KIyMgWMOhYyDEkeG7i25oIHBow6JuIHBo4buRaSBj4bunYSBiaeG6v24gY2ZkDQoNCmBgYHtyfQ0KIyBLaeG7g20gxJHhu4tuaCBwaMOibiBwaOG7kWkgY2h14bqpbg0KaGlzdChjZmRlbWl0JGNmZCkNCmBgYA0KDQrEkOG6t3QgZ2nhuqMgdGh1eeG6v3Q6DQoNCkgwOiBiaeG6v24gY2ZkIGPDsyBwaMOibiBwaOG7kWkgY2h14bqpbg0KDQpIMTogYmnhur9uIGNmZCBraMO0bmcgY8OzIHBow6JuIHBo4buRaSBjaHXhuqluDQoNCmBgYHtyfQ0KY2ZkcyA8LSBhcy5kYXRhLmZyYW1lKGNmZGVtaXQkY2ZkKQ0Kc2hhcGlyby50ZXN0KGNmZGVtaXQkY2ZkKQ0KYGBgDQpWw6wgcC12YWx1ZSA8MCwwNSBuw6puIHRhIMSR4bunIGPGoSBz4bufIGLDoWMgYuG7jyBIMCwgdsOsIHbhuq15IGJp4bq/biBjZmQga2jDtG5nIGPDsyBwaMOibiBwaOG7kWkgY2h14bqpbg0KDQoNCmBgYHtyfQ0KI0tp4buDbSDEkeG7i25oIHBow6JuIHBo4buRaSBtxakNCmtzLnRlc3QoY2ZkZW1pdCRDZnMsIHk9cGV4cCkNCmBgYA0KSDA6IGJp4bq/biBDZnMgY8OzIHBow6JuIHBo4buRaSBtxakNCg0KSDE6IGJp4bq/biBDZnMga2jDtG5nIGPDsyBwaMOibiBwaOG7kWkgbcWpDQoNClbDrCBwX3ZhbHVlIDwgMCwwNSBuw6puIHRhIMSR4bunIGPGoSBz4bufIGLDoWMgYuG7jyBIMCwgdsOsIHbhuq15IGJp4bq/biBDZnMga2jDtG5nIGPDsyBwaMOibiBwaOG7kWkgbcWpLg0KDQpgYGB7cn0NCiMgS2nhu4NtIMSR4buLbmggcGjDom4gcGjhu5FpIMSR4buBdQ0Ka3MudGVzdChjZmRlbWl0JENmcywgeSA9ICdwdW5pZicpDQpgYGANCkgwOiBiaeG6v24gQ2ZzIGPDsyBwaMOibiBwaOG7kWkgxJHhu4F1DQoNCkgxOiBiaeG6v24gQ2ZzIGtow7RuZyBjw7MgcGjDom4gcGjhu5FpIMSR4buBdQ0KDQpWw6wgcF92YWx1ZSA8IDAsMDUgbsOqbiB0YSDEkeG7pyBjxqEgc+G7nyBiw6FjIGLhu48gSDAsIHbDrCB24bqteSBiaeG6v24gQ2ZzIGtow7RuZyBjw7MgcGjDom4gcGjhu5FpIMSR4buBdS4NCg0KIyMgWMOhYyDEkeG7i25oIHBow6JuIHBo4buRaSBj4bunYSBiaeG6v24gY2FtDQoNCmBgYHtyfQ0KIyBLaeG7g20gxJHhu4tuaCBwaMOibiBwaOG7kWkgY2h14bqpbg0KaGlzdChjZmRlbWl0JGNhbSkNCmBgYA0KDQrEkOG6t3QgZ2nhuqMgdGh1eeG6v3Q6DQoNCkgwOiBiaeG6v24gY2FtIGPDsyBwaMOibiBwaOG7kWkgY2h14bqpbg0KDQpIMTogYmnhur9uIGNhbSBraMO0bmcgY8OzIHBow6JuIHBo4buRaSBjaHXhuqluDQoNCmBgYHtyfQ0KY2FtcyA8LSBhcy5kYXRhLmZyYW1lKGNmZGVtaXQkY2FtKQ0Kc2hhcGlyby50ZXN0KGNmZGVtaXQkY2FtKQ0KYGBgDQpWw6wgcC12YWx1ZSA8MCwwNSBuw6puIHRhIMSR4bunIGPGoSBz4bufIGLDoWMgYuG7jyBIMCwgdsOsIHbhuq15IGJp4bq/biBjYW0ga2jDtG5nIGPDsyBwaMOibiBwaOG7kWkgY2h14bqpbg0KDQoNCmBgYHtyfQ0KI0tp4buDbSDEkeG7i25oIHBow6JuIHBo4buRaSBtxakNCmtzLnRlc3QoY2ZkZW1pdCRDZnMsIHk9cGV4cCkNCmBgYA0KSDA6IGJp4bq/biBDZnMgY8OzIHBow6JuIHBo4buRaSBtxakNCg0KSDE6IGJp4bq/biBDZnMga2jDtG5nIGPDsyBwaMOibiBwaOG7kWkgbcWpDQoNClbDrCBwX3ZhbHVlIDwgMCwwNSBuw6puIHRhIMSR4bunIGPGoSBz4bufIGLDoWMgYuG7jyBIMCwgdsOsIHbhuq15IGJp4bq/biBDZnMga2jDtG5nIGPDsyBwaMOibiBwaOG7kWkgbcWpLg0KDQpgYGB7cn0NCiMgS2nhu4NtIMSR4buLbmggcGjDom4gcGjhu5FpIMSR4buBdQ0Ka3MudGVzdChjZmRlbWl0JENmcywgeSA9ICdwdW5pZicpDQpgYGANCkgwOiBiaeG6v24gQ2ZzIGPDsyBwaMOibiBwaOG7kWkgxJHhu4F1DQoNCkgxOiBiaeG6v24gQ2ZzIGtow7RuZyBjw7MgcGjDom4gcGjhu5FpIMSR4buBdQ0KDQpWw6wgcF92YWx1ZSA8IDAsMDUgbsOqbiB0YSDEkeG7pyBjxqEgc+G7nyBiw6FjIGLhu48gSDAsIHbDrCB24bqteSBiaeG6v24gQ2ZzIGtow7RuZyBjw7MgcGjDom4gcGjhu5FpIMSR4buBdS4NCg0KIyMgWMOhYyDEkeG7i25oIHBow6JuIHBo4buRaSBj4bunYSBiaeG6v24gYngNCg0KYGBge3J9DQojIEtp4buDbSDEkeG7i25oIHBow6JuIHBo4buRaSBjaHXhuqluDQpoaXN0KGNmZGVtaXQkYngpDQpgYGANCg0KxJDhurd0IGdp4bqjIHRodXnhur90Og0KDQpIMDogYmnhur9uIGJ4IGPDsyBwaMOibiBwaOG7kWkgY2h14bqpbg0KDQpIMTogYmnhur9uIGJ4IGtow7RuZyBjw7MgcGjDom4gcGjhu5FpIGNodeG6qW4NCg0KYGBge3J9DQpieHMgPC0gYXMuZGF0YS5mcmFtZShjZmRlbWl0JGJ4KQ0Kc2hhcGlyby50ZXN0KGNmZGVtaXQkYngpDQpgYGANCg0KVsOsIHAtdmFsdWUgPDAsMDUgbsOqbiB0YSDEkeG7pyBjxqEgc+G7nyBiw6FjIGLhu48gSDAsIHbDrCB24bqteSBiaeG6v24gYngga2jDtG5nIGPDsyBwaMOibiBwaOG7kWkgY2h14bqpbg0KDQoNCmBgYHtyfQ0KI0tp4buDbSDEkeG7i25oIHBow6JuIHBo4buRaSBtxakNCmtzLnRlc3QoY2ZkZW1pdCRieCwgeT1wZXhwKQ0KYGBgDQpIMDogYmnhur9uIGJ4IGPDsyBwaMOibiBwaOG7kWkgbcWpDQoNCkgxOiBiaeG6v24gYngga2jDtG5nIGPDsyBwaMOibiBwaOG7kWkgbcWpDQoNClbDrCBwX3ZhbHVlIDwgMCwwNSBuw6puIHRhIMSR4bunIGPGoSBz4bufIGLDoWMgYuG7jyBIMCwgdsOsIHbhuq15IGJp4bq/biBieCBraMO0bmcgY8OzIHBow6JuIHBo4buRaSBtxakuDQoNCmBgYHtyfQ0KIyBLaeG7g20gxJHhu4tuaCBwaMOibiBwaOG7kWkgxJHhu4F1DQprcy50ZXN0KGNmZGVtaXQkYngsIHkgPSAncHVuaWYnKQ0KYGBgDQpIMDogYmnhur9uIGJ4IGPDsyBwaMOibiBwaOG7kWkgxJHhu4F1DQoNCkgxOiBiaeG6v24gYngga2jDtG5nIGPDsyBwaMOibiBwaOG7kWkgxJHhu4F1DQoNClbDrCBwX3ZhbHVlIDwgMCwwNSBuw6puIHRhIMSR4bunIGPGoSBz4bufIGLDoWMgYuG7jyBIMCwgdsOsIHbhuq15IGJp4bq/biBieCBraMO0bmcgY8OzIHBow6JuIHBo4buRaSDEkeG7gXUuDQoNCiMjIFjDoWMgxJHhu4tuaCBwaMOibiBwaOG7kWkgY+G7p2EgYmnhur9uIHN0aW5nDQoNCmBgYHtyfQ0KIyBLaeG7g20gxJHhu4tuaCBwaMOibiBwaOG7kWkgY2h14bqpbg0KaGlzdChjZmRlbWl0JHN0aW5nKQ0KYGBgDQoNCsSQ4bq3dCBnaeG6oyB0aHV54bq/dDoNCg0KSDA6IGJp4bq/biBzdGluZyBjw7MgcGjDom4gcGjhu5FpIGNodeG6qW4NCg0KSDE6IGJp4bq/biBzdGluZyBraMO0bmcgY8OzIHBow6JuIHBo4buRaSBjaHXhuqluDQoNCmBgYHtyfQ0Kc3RpbmdzIDwtIGFzLmRhdGEuZnJhbWUoY2ZkZW1pdCRzdGluZykNCnNoYXBpcm8udGVzdChjZmRlbWl0JHN0aW5nKQ0KYGBgDQoNClbDrCBwLXZhbHVlIDwwLDA1IG7Dqm4gdGEgxJHhu6cgY8ahIHPhu58gYsOhYyBi4buPIEgwLCB2w6wgduG6rXkgYmnhur9uIHN0aW5nIGtow7RuZyBjw7MgcGjDom4gcGjhu5FpIGNodeG6qW4NCg0KDQpgYGB7cn0NCiNLaeG7g20gxJHhu4tuaCBwaMOibiBwaOG7kWkgbcWpDQprcy50ZXN0KGNmZGVtaXQkc3RpbmcsIHk9cGV4cCkNCmBgYA0KSDA6IGJp4bq/biBzdGluZyBjw7MgcGjDom4gcGjhu5FpIG3FqQ0KDQpIMTogYmnhur9uIHN0aW5nIGtow7RuZyBjw7MgcGjDom4gcGjhu5FpIG3FqQ0KDQpWw6wgcF92YWx1ZSA8IDAsMDUgbsOqbiB0YSDEkeG7pyBjxqEgc+G7nyBiw6FjIGLhu48gSDAsIHbDrCB24bqteSBiaeG6v24gc3Rpbmcga2jDtG5nIGPDsyBwaMOibiBwaOG7kWkgbcWpLg0KDQpgYGB7cn0NCiMgS2nhu4NtIMSR4buLbmggcGjDom4gcGjhu5FpIMSR4buBdQ0Ka3MudGVzdChjZmRlbWl0JHN0aW5nLCB5ID0gJ3B1bmlmJykNCmBgYA0KSDA6IGJp4bq/biBzdGluZyBjw7MgcGjDom4gcGjhu5FpIMSR4buBdQ0KDQpIMTogYmnhur9uIHN0aW5nIGtow7RuZyBjw7MgcGjDom4gcGjhu5FpIMSR4buBdQ0KDQpWw6wgcF92YWx1ZSA8IDAsMDUgbsOqbiB0YSDEkeG7pyBjxqEgc+G7nyBiw6FjIGLhu48gSDAsIHbDrCB24bqteSBiaeG6v24gc3Rpbmcga2jDtG5nIGPDsyBwaMOibiBwaOG7kWkgxJHhu4F1Lg0KDQojIyBYw6FjIMSR4buLbmggcGjDom4gcGjhu5FpIGPhu6dhIGJp4bq/biBudXRpZm9vZA0KDQpgYGB7cn0NCiMgS2nhu4NtIMSR4buLbmggcGjDom4gcGjhu5FpIGNodeG6qW4NCmhpc3QoY2ZkZW1pdCRudXRpZm9vZCkNCmBgYA0KDQrEkOG6t3QgZ2nhuqMgdGh1eeG6v3Q6DQoNCkgwOiBiaeG6v24gbnV0aWZvb2QgY8OzIHBow6JuIHBo4buRaSBjaHXhuqluDQoNCkgxOiBiaeG6v24gbnV0aWZvb2Qga2jDtG5nIGPDsyBwaMOibiBwaOG7kWkgY2h14bqpbg0KDQpgYGB7cn0NCm51dGlmb29kcyA8LSBhcy5kYXRhLmZyYW1lKGNmZGVtaXQkbnV0aWZvb2QpDQpzaGFwaXJvLnRlc3QoY2ZkZW1pdCRudXRpZm9vZCkNCmBgYA0KVsOsIHAtdmFsdWUgPDAsMDUgbsOqbiB0YSDEkeG7pyBjxqEgc+G7nyBiw6FjIGLhu48gSDAsIHbDrCB24bqteSBiaeG6v24gbnV0aWZvb2Qga2jDtG5nIGPDsyBwaMOibiBwaOG7kWkgY2h14bqpbi4NCg0KDQpgYGB7cn0NCiNLaeG7g20gxJHhu4tuaCBwaMOibiBwaOG7kWkgbcWpDQprcy50ZXN0KGNmZGVtaXQkbnV0aWZvb2QsIHk9cGV4cCkNCmBgYA0KSDA6IGJp4bq/biBudXRpZm9vZCBjw7MgcGjDom4gcGjhu5FpIG3FqQ0KDQpIMTogYmnhur9uIG51dGlmb29kIGtow7RuZyBjw7MgcGjDom4gcGjhu5FpIG3FqQ0KDQpWw6wgcF92YWx1ZSA8IDAsMDUgbsOqbiB0YSDEkeG7pyBjxqEgc+G7nyBiw6FjIGLhu48gSDAsIHbDrCB24bqteSBiaeG6v24gbnV0aWZvb2Qga2jDtG5nIGPDsyBwaMOibiBwaOG7kWkgbcWpLg0KDQpgYGB7cn0NCiMgS2nhu4NtIMSR4buLbmggcGjDom4gcGjhu5FpIMSR4buBdQ0Ka3MudGVzdChjZmRlbWl0JG51dGlmb29kLCB5ID0gJ3B1bmlmJykNCmBgYA0KSDA6IGJp4bq/biBudXRpZm9vZCBjw7MgcGjDom4gcGjhu5FpIMSR4buBdQ0KDQpIMTogYmnhur9uIG51dGlmb29kIGtow7RuZyBjw7MgcGjDom4gcGjhu5FpIMSR4buBdQ0KDQpWw6wgcF92YWx1ZSA8IDAsMDUgbsOqbiB0YSDEkeG7pyBjxqEgc+G7nyBiw6FjIGLhu48gSDAsIHbDrCB24bqteSBiaeG6v24gbnV0aWZvb2Qga2jDtG5nIGPDsyBwaMOibiBwaOG7kWkgxJHhu4F1Lg0KDQoNCiMgQsOgaSB04bqtcCB0deG6p24gMg0KDQrEkOG7gSB0w6BpOiBDaOG7jW4gdsOgIGdp4bqjaSB0aMOtY2ggxJHhu5FpIHTGsOG7o25nIGPhuqduIG3DtCBwaOG7j25nICjDrXQgbmfhuqV0IGPDsyA2IGJp4bq/biBuZ+G6q3Ugbmhpw6puKQ0KDQojIyBDaOG7pyDEkeG7gSBjaOG7jW46IA0KDQpNw7QgcGjhu49uZyBkb2FuaCB0aHUgY+G7p2EgcXXDoW4gY2FmZSBERU1JVCB0aGVvIG5nw6B5IHRyw6puIMSRxrDhu51uZyAzODUgTMOqIFbEg24gVmnhu4d0LCBRdeG6rW4gOSB0cm9uZyBraG/huqNuZyB0aOG7nWkgZ2lhbiB04burIG5nw6B5IDEvNy8yMDIzIMSR4bq/biBjdeG7kWkgbsSDbSAyMDIzLg0KDQojIyBLaMOhaSBuaeG7h206DQoNCkRvYW5oIHRodSAocmV2ZW51ZSkgbMOgIGtob+G6o24gdGnhu4NuIG3DoCBkb2FuaCBuZ2hp4buHcCBuaOG6rW4gxJHGsOG7o2Mga2hpIGLDoW4gaMOgbmcgaG/DoSB2w6AgZOG7i2NoIHbhu6UgZG8gbsOzIHPhuqNuIHh14bqldCByYS4gRG9hbmggdGh1IMSRxrDhu6NjIHTDrW5oIGLhurFuZyBjw6FjaCBs4bqleSBnacOhIGLDoW4gbmjDom4gduG7m2kgbMaw4bujbmcgaMOgbmcgYsOhbiByYS4NCg0KIyMgQ8OhYyBsb+G6oWkgZG9hbmggdGh1Og0KDQotIERvYW5oIHRodSBiw6FuIGjDoG5nOiBkb2FuaCB0aHUgdGh1IMSRxrDhu6NjIHThu6sgaG/huqF0IMSR4buZbmcgYsOhbiBow6BuZyBow7NhLCBiw6FuIHRow6BuaCBwaOG6qW0vc+G6o24gcGjhuqltLCBiw6FuIGLhuqV0IMSR4buZbmcgc+G6o24gxJHhuqd1IHTGsC4uLg0KDQotIERvYW5oIHRodSBjdW5nIGPhuqVwIGThu4tjaCB24bulOiBkb2FuaCB0aHUgdGh1IHThu6sgZOG7i2NoIHbhu6UgZHUgbOG7i2NoLCBkb2FuaCBuZ2hp4buHcCBuaOG6rW4gZ2lhIGPDtG5nLCDEkeG6oWkgbMOtLi4uDQoNCi0gRG9hbmggdGh1IGhv4bqhdCDEkeG7mW5nIHTDoGkgY2jDrW5oOiBEb2FuaCB0aHUgdOG7qyBsw6NpIHRp4buBbiBn4butaTsgRG9hbmggdGh1IHThu6sgbMOjaSBjaG8gdmF5OyBEb2FuaCB0aHUgdOG7qyBsw6NpIMSR4bqndSB0xrAgVHLDoWkgcGhp4bq/dSwgdMOtbiBwaGnhur91OyBEb2FuaCB0aMO5IHThu6sgY8OhYyBraG/huqNuIMSR4bqndSB0xrA7IEPhu5UgdOG7qWMsIGzhu6NpIG5odeG6rW4gxJHGsOG7o2MgY2hpYTsgQ2hp4bq/dCBraOG6pXUgdGhhbmggdG/DoW4gxJHGsOG7o2MgaMaw4bufbmcuDQoNCi0gRG9hbmggdGh1IGLhuqV0IHRoxrDhu51uZzogbMOgIGtob+G6o24gdGnhu4FuIHThu6sgY8OhYyBob+G6oXQgxJHhu5luZyBraMO0bmcgeOG6o3kgcmEgdGjGsOG7nW5nIHh1ecOqbiBuaMawIGLDoW4gduG6rXQgdMawIGjDoG5nIGjDs2EgZMawIHRo4burYSwgZOG7pW5nIGPhu6UgxJHDoyBwaMOibiBi4buRIGjhur90LCBjw6FjIGtob+G6o24gcGjhuqNpIHRy4bqjIG5oxrBuZyBraMO0bmcgY+G6p24gdHLhuqMsIHRoYW5oIGzDvSB0w6BpIHPhuqNuLi4uDQoNCi0gRG9hbmggdGh1IGLDoW4gaMOgbmcgbuG7mWkgYuG7mTogbMOgIGRvYW5oIHRodSBj4bunYSBz4buRIHPhuqNuIHBo4bqpbSwgaMOgbmcgaMOzYSwgZOG7i2NoIHbhu6UgdGnDqnUgdGjhu6UgdHJvbmcgbuG7mWkgYuG7mSBkb2FuaCBuZ2hp4buHcCwgbMOgIGzhu6NpIMOtY2gga2luaCB04bq/IHRodSDEkcaw4bujYyB04burIHZp4buHYyBiw6FuIGjDoG5nIGjDs2EsIHPhuqNuIHBo4bqpbSwgY3VuZyBj4bqlcCBk4buLY2ggduG7pSBu4buZaSBi4buZIGdp4buvYSBjw6FjIMSRxqFuIHbhu4sgdHLhu7FjIHRodeG7mWMgaOG6oWNoIHRvw6FuIHBo4bulIHRodeG7mWMgdHJvbmcgY8O5bmcgbeG7mXQgY8O0bmcgdHksIHThu5VuZyBjw7RuZyB0eSB0w61uaCB0aGVvIGdpw6EgYsOhbiBu4buZaSBi4buZLiANCg0KIyMgWMOhYyDEkeG7i25oIHbhuqVuIMSR4buBOiANCg0KTcO0IHBo4buPbmcgRG9hbmggdGh1IGLDoW4gbsaw4bubYyBj4bunYSBxdcOhbiBjYWZlIERlbWl0IGThu7FhIHRyw6puIDYgbG/huqFpIG7GsOG7m2MgYsOhbiBjaOG6oXkgdGhlbyBuZ8OgeSwgdHJvbmcga2hv4bqjbmcgNiB0aMOhbmcgY3Xhu5FpIG7Eg20gMjAyMyAodOG7qyBuZ8OgeSAxLzcvMjAyMyDEkeG6v24gY3Xhu5FpIG7Eg20gMjAyMykgxJHhu4MgxJHGsGEgcmEgcmEgY8OhYyBuaOG6rW4gxJHhu4tuaCB0cm9uZyA2IHRow6FuZyB04bubaSB0aMO0bmcgcXVhIGPDoWMgZOG7sSBiw6FvIGPhu6dhIG3DtCBow6xuaCwgZ2nDunAgxJFp4buBdSBjaOG7iW5oIOG7nyBt4buZdCBz4buRIHnhur91IHThu5EgxJHhu4MgbWFuZyBs4bqhaSBkb2FuaCB0aHUgdOG7kWkgxrB1IG5o4bqldC4NCg0KIyMgROG7ryBsaeG7h3UgxJHhuqd1IHbDoG86DQoNClTDtGkgxJHDoyB0aHUgdGjhuq1wIGThu68gbGnhu4d1IGRvYW5oIHRodSBiw6FuIGjDoG5nIGPhu6dhIHF1w6FuIENhZmUgRGVtaXQgdOG7qyDEkeG6p3UgbsSDbSAyMDIzIMSR4bq/biBjdeG7kWkgdGjDoW5nIDYvMjAyMyAoMTgxIHF1YW4gc8OhdCkgY+G7p2EgNiBtw7NuIG7GsOG7m2MgYsOhbiBjaOG6oXkgYmFvIGfhu5NtIGNhZmUgc+G7r2EsIGNhZmUgxJFlbiwgYuG6oWMgeOG7iXUsIG7GsOG7m2MgY2FtLCBzdGluZywgbnV0aWZvb2QuDQoNCmBgYHtyfQ0Kc2V0d2QoIkM6L1VzZXJzL05nb2MgTG9pL0Rvd25sb2FkcyIpDQpjZmRlbWl0IDwtIHJlYWQuY3N2KCJDOi9Vc2Vycy9OZ29jIExvaS9Eb3dubG9hZHMvZGF0YWRlbWl0LmNzdiIpDQpzdHIoY2ZkZW1pdCkNCmBgYA0KIyMgR2nhuqNpIHRow61jaCBiaeG6v24gw70gbmdoxKlhDQoNCi0gbmdheTogU+G7kSBxdWFuIHPDoXQgdOG7qyBuZ8OgeSAxLzEvMjAyMyDEkeG6v24gMzAvNi8yMDIzICgxODEgcXVhbiBzw6F0KQ0KDQotIGNmczogU+G7kSBsxrDhu6NuZyBuxrDhu5tjIENhZmUgc+G7r2EgYsOhbiB0cm9uZyAxIG5nw6B5DQoNCi0gY2ZkOiBz4buRIGzGsOG7o25nIG7GsOG7m2MgQ2FmZSDEkWVuIGLDoW4gdHJvbmcgMSBuZ8OgeQ0KDQotIGNhbTogc+G7kSBsxrDhu6NuZyBuxrDhu5tjIGNhbSBiw6FuIHRyb25nIDEgbmfDoHkNCg0KLSBieDogc+G7kSBsxrDhu6NuZyBuxrDhu5tjIGLhuqFjIHjhu4l1IGLDoW4gdHJvbmcgMSBuZ8OgeQ0KDQotIHN0aW5nOiBz4buRIGzGsOG7o25nIG7GsOG7m2Mgc3RpbmcgYsOhbiB0cm9uZyAxIG5nw6B5DQogDQotIG51dGlmb29kOiBz4buRIGzGsOG7o25nIG7GsOG7m2MgbnV0aWZvb2QgYsOhbiB0cm9uZyAxIG5nw6B5DQoNCiMjIMSQ4buRaSB0xrDhu6NuZyBtw7QgcGjhu49uZw0KDQpEb2FuaCB0aHUgPSBHacOhIGLDoW4geCBz4buRIGzGsOG7o25nDQoNCk3hu6ljIGdpw6EgY+G7p2EgNiBsb+G6oWkgbsaw4bubYyBiw6FuIGNo4bqheToNCg0KLSBDYWZlIHPhu69hOiAxOCBuZ2jDrG4gxJHhu5NuZy9seQ0KDQotIENhZmUgxJFlbjogMTUgbmdow6xuIMSR4buTbmcvbHkNCg0KLSBOxrDhu5tjIGNhbTogMjUgbmdow6xuIMSR4buTbmcvbHkNCg0KLSBC4bqhYyB44buJdTogMjIgbmdow6xuIMSR4buTbmcvbHkNCg0KLSBTdGluZzogMjAgbmdow6xuIMSR4buTbmcvY2hhaQ0KDQotIE51dGlmb29kOiAyMCBuZ2jDrG4gxJHhu5NuZy8gY2hhaQ0KDQojIyBC4bqjbmcgdGjhu5FuZyBrw6ogDQpgYGB7cn0NCnN1bW1hcnkoY2ZkZW1pdCkNCmBgYA0KVHJvbmcga2hv4bqjbmcgdGjhu51pIGdpYW4gdOG7qyDEkeG6p3UgdGjDoW5nIDEvMjAyMyDEkeG6v24gY3Xhu5FpIHRow6FuZyA2LzIwMjMNCg0KLSBT4buRIGx5IGNhZmUgc+G7r2EgYsOhbiBuaGnhu4F1IG5o4bqldCB0cm9uZyBuZ8OgeSBsw6AgMjAgbHksIMOtdCBuaOG6pXQgbMOgIDEwIGx5IHbDoCB0cnVuZyBiw6xuaCBt4buZdCBuZ8OgeSBiw6FuIMSRxrDhu6NjIDkgbHkuDQoNCi0gU+G7kSBseSBjYWZlIMSRZW4gYsOhbiBuaGnhu4F1IG5o4bqldCB0cm9uZyBuZ8OgeSBsw6AgMTAgbHksIMOtdCBuaOG6pXQgbMOgIDUgbHkgdsOgIHRydW5nIGLDrG5oIG3hu5l0IG5nw6B5IGLDoW4gxJHGsOG7o2MgNyBseS4NCg0KLSBT4buRIGx5IG7GsOG7m2MgY2FtIGLDoW4gbmhp4buBdSBuaOG6pXQgdHJvbmcgbmfDoHkgbMOgIDE1IGx5LCDDrXQgbmjhuqV0IGzDoCA4IGx5IHbDoCB0cnVuZyBiw6xuaCBt4buZdCBuZ8OgeSBiw6FuIMSRxrDhu6NjIDExIGx5Lg0KDQotIFPhu5EgbHkgYuG6oWMgeOG7iXUgYsOhbiBuaGnhu4F1IG5o4bqldCB0cm9uZyBuZ8OgeSBsw6AgMTcgbHksIMOtdCBuaOG6pXQgbMOgIDEwIGx5IHbDoCB0cnVuZyBiw6xuaCBt4buZdCBuZ8OgeSBiw6FuIMSRxrDhu6NjIDE2IGx5Lg0KDQotIFPhu5EgY2hhaSBzdGluZyBiw6FuIG5oaeG7gXUgbmjhuqV0IHRyb25nIG5nw6B5IGzDoCAyMCBjaGFpLCDDrXQgbmjhuqV0IGzDoCAxMiBjaGFpIHbDoCB0cnVuZyBiw6xuaCBt4buZdCBuZ8OgeSBiw6FuIMSRxrDhu6NjIDcgY2hhaS4NCg0KLSBT4buRIGNoYWkgbnV0aWZvb2QgYsOhbiBuaGnhu4F1IG5o4bqldCB0cm9uZyBuZ8OgeSBsw6AgMTIgY2hhaSwgw610IG5o4bqldCBsw6AgNyBjaGFpIHbDoCB0cnVuZyBiw6xuaCBt4buZdCBuZ8OgeSBiw6FuIMSRxrDhu6NjIDkgY2hhaS4NCg0KIyBCw6BpIHThuq1wIHR14bqnbiAxDQoNCiMjIyBQaMOibiBwaOG7kWkgY2h14bqpbg0KDQpHaeG6oyBz4butOiBnacOhIGPhu5UgcGhp4bq/dSBiYW4gxJHhuqd1IGzDoCAxMDAgVk7EkCB24bubaSBs4bujaSBzdeG6pXQgdHJ1bmcgYsOsbmggbMOgIDUlIHbDoCDEkeG7mSBs4buHY2ggY2h14bqpbiBsw6AgMC4yLiBUaeG6v24gaMOgbmggbcO0IHBo4buPbmcgbmfhuqt1IG5oacOqbiAxMDAwIGdpw6EgdHLhu4sgY+G7p2EgbeG7mXQgY+G7lSBwaGnhur91IHRoZW8gcGjDom4gcGjhu5FpIGNodeG6qW4sIHbhu5tpIGPDtG5nIHRo4bupYyB0w61uaCBuaMawIHNhdToNCg0KICRTX3QgPSBTXzAgZV57KHIgLSBcZnJhY3tcc2lnbWFeMn17Mn0pdCArIFxzaWdtYSBXX3R9JA0KDQoNCmBgYHtyfQ0KIyBHacOhIGPhu5UgcGhp4bq/dSBiYW4gxJHhuqd1DQpTMDEgPC0gMTAwIA0KIyBM4bujaSBzdeG6pXQgdHJ1bmcgYsOsbmgNCm11MSA8LSAwLjA1IA0KIyDEkOG7mSBs4buHY2ggY2h14bqpbg0Kc2lnbWExIDwtIDAuMiANCiMgVGjhu51pIGdpYW4gxJHhur9uIGjhur90IGjhuqFuDQpUMSA8LSAxIA0KIyBT4buRIGzGsOG7o25nIGdpw6EgdHLhu4sgY+G6p24gbcO0IHBo4buPbmcNCk4xIDwtIDEwMDAgDQpgYGANCg0KYGBge3J9DQojIFThuqFvIHPhu5Egbmfhuqt1IG5oacOqbiB0aGVvIHBow6JuIHBo4buRaSBjaHXhuqluDQpaMSA8LSBybm9ybShOMSkNCiMgVMOtbmggZ2nDoSBj4buVIHBoaeG6v3UgDQpTMSA8LSBTMDEgKiBleHAoKG11MSAtIDAuNSAqIHNpZ21hMV4yKSAqIFQxICsgc2lnbWExICogc3FydChUMSkgKiBaMSkNCnBsb3QoUzEsIHR5cGUgPSAibCIsIG1haW4gPSAiTcO0IHBo4buPbmcgZ2nDoSBj4buVIHBoaeG6v3UgdGhlbyBwaMOibiBwaOG7kWkgY2h14bqpbiIsIHhsYWIgPSAiVGjhu51pIGdpYW4iLCB5bGFiID0gIkdpw6EgY+G7lSBwaGnhur91IikNCmBgYA0KDQpgYGB7cn0NCmhpc3QoUzEsIG1haW4gPSAicGjDom4gcGjhu5FpIGNodeG6qW4iLCB4bGFiID0gIlMiLCBjb2w9InBpbmsiKQ0KYGBgDQoNCkThu7FhIHbDoG8gYmnhu4N1IMSR4buTIGhpc3RvZ3JhbSwgdGEgdGjhuqV5IGdpw6EgZGFvIMSR4buZbmcgbmhp4buBdSBuaOG6pXQg4bufIG3hu6ljIGdpw6EgKy0gMTAwLCB2w6AgdGjhuqVwIG5o4bqldCDhu58ga2hv4bqjbmcgKy01MCB2w6AgKy0xODAuDQoNCmBgYHtyfQ0Kc3VtbWFyeShTMSkNCmBgYA0KVOG7qyBr4bq/dCBxdeG6oyB0csOqbiwgdGEgeMOhYyDEkeG7i25oIMSRxrDhu6NjIG5oxrAgc2F1OiBHacOhIGPhu5UgcGhp4bq/dSB0aOG6pXAgbmjhuqV0IOG7nyBt4bupYyA1OC43NSB24bubaSB0cnVuZyBiw6xuaCBsw6AgMTA1LjQ0IHbDoCBnacOhIGNhbyBuaOG6pXQgbMOgIDE5Ny4wMyANCg0KIyMjIFBow6JuIHBo4buRaSBuaOG7iyBwaMOibg0KDQpHaeG6oyBz4butIHTDtGkgbXXhu5FuIG3DtCBwaOG7j25nIHR1bmcgxJHhu5NuZyB4dSAxMDAgbOG6p24gduG7m2kgeMOhYyBzdeG6pXQgcmEgbeG6t3Qgbmfhu61hIGzDoCA1MCUuDQoNCmBgYHtyfQ0KcmJpbm9tKDEwMCwgMSwgMC41KQ0KYGBgDQpL4bq/dCBxdeG6oyBz4bq9IGzDoCBt4buZdCB2ZWN0b3IgY8OzIDEwMCBwaOG6p24gdOG7rSwgbeG7l2kgcGjhuqduIHThu60gbMOgIDAgaG/hurdjIDEsIHTGsMahbmcg4bupbmcgduG7m2kgbeG6t3Qgc+G6pXAgaG/hurdjIG3hurd0IG5n4butYQ0KDQpgYGB7cn0NCksxIDwtdGFibGUocmJpbm9tKDEwMCwgMSwgMC41KSkNCksxDQpgYGANCg0KYGBge3J9DQpsaWJyYXJ5KGdncGxvdDIpDQpiYXJwbG90KHRhYmxlKEsxKSwgY29sPSJwaW5rIikNCmBgYA0KDQp24bqteSBz4buRIGzhuqduIHJhIG3hurd0IHPhuqVwIGzDoCA1NSB2w6AgbeG6t3Qgbmfhu69hIGzDoCA0NSBs4bqnbi4NCg0KIyMjIFBow6JuIHBo4buRaSBQb2lzc29uDQoNClTDtGkgbXXhu5FuIG3DtCBwaOG7j25nIDEwMCBs4bqnbiBxdWFuIHPDoXQgc+G7kSBsxrDhu6NuZyB4ZSBoxqFpIMSRaSBuZ2FuZyBxdWEgdHJvbmcgbeG7mXQgZ2nhu50sIHbhu5tpIGdp4bqjIHPhu60gcuG6sW5nIHRydW5nIGLDrG5oIGPDsyAyMCB4ZSBoxqFpIHPhur0gxJFpIG5nYW5nIHF1YSB0cm9uZyBt4buZdCBnaeG7nS4NCg0KYGBge3J9DQpDMSA8LXJwb2lzKDEwMCwgMjApDQp0YWJsZShDMSkNCmBgYA0KYGBge3J9DQpoaXN0KEMxLCBtYWluPSJQaMOibiBwaOG7kWkgUG9pc3NvbiIsIHhsYWIgPSJDMSIsIGNvbD0icGluayIpDQpgYGANCg0KYGBge3J9DQpzdW1tYXJ5KEMxKQ0KYGBgDQoNClPhu5EgbOG6p24geGUgxJFpIHF1YSB0cm9uZyAxIGdp4budIG5oaeG7gXUgbmjhuqV0IGzDoCAzNSBs4bqnbiwgw610IG5o4bqldCBsw6AgMTEgbOG6p24gduG7m2kgZ2nDoSB0cuG7iyB0cnVuZyBiw6xuaCBsw6AgMjAuNA0KDQojIyMgUGjDom4gcGjhu5FpIMSR4buBdQ0KDQpHaeG6oyBz4butIHTDtGkgbXXhu5FuIG3DtCBwaOG7j25nIHPhu5Egbmfhuqt1IG5oacOqbiDEkcaw4bujYyBwaMOhdCBzaW5oIGLhu59pIG3DoXkgdMOtbmgsIG7hur91IGdp4bqjIHPhu60gcuG6sW5nIHPhu5Egbmfhuqt1IG5oacOqbiBjw7MgdGjhu4MsIHTDtGkgbXXhu5FuIG3DtCBwaOG7j25nIDEwMCBz4buRIG5n4bqrdSBuaGnDqm4gdHJvbmcga2hv4bqjbmcgdOG7qyAwIMSR4bq/biAxLCBi4bqhbiBjw7MgdGjhu4Mgdmnhur90Og0KDQpgYGB7cn0NCnUxIDwtIHJ1bmlmKG49MTAwLG1pbiA9IDAsbWF4ID0gMSkNCmhpc3QodTEsIG1haW4gPSAicGjDom4gcGjhu5FpIMSR4buBdSIsIHhsYWIgPSAidSIsY29sPSJwaW5rIikNCmBgYA0KDQpgYGB7cn0NCnN1bW1hcnkodTEpDQpgYGANCg0KWMOhYyBzdeG6pXQgxJHhu4MgbcOheSB0w61uaCBwaMOhdCBzaW5oIG5oaeG7gXUgbmjhuqV0IGzDoCA5OC44JSwgdGjhuqVwIG5o4bqldCBsw6AgMC45JSB24bubaSB0cnVuZyBiw6xuaCBsw6AgMC41MTI4OTUNCg0KIyMjIFBow6JuIHBo4buRaSBtxakNCg0KVMO0aSBtdeG7kW4gbcO0IHBo4buPbmcgMTAwIGzhuqduIHF1YW4gc8OhdCB0aOG7nWkgZ2lhbiBnaeG7r2EgaGFpIGN14buZYyBn4buNaSDEkeG6v24gdHJ1bmcgdMOibSBk4buLY2ggduG7pSBraMOhY2ggaMOgbmcsIG7hur91IGdp4bqjIHPhu60gcuG6sW5nIHThu7cgbOG7hyBj4bunYSBwaMOibiBwaOG7kWkgbcWpIGzDoCAwLjIsIHThu6ljIGzDoCB0cnVuZyBiw6xuaCBjw7MgMC4yIGN14buZYyBn4buNaSDEkeG6v24gdHJvbmcgbeG7mXQgxJHGoW4gduG7iyB0aOG7nWkgZ2lhbi4NCg0KYGBge3J9DQppMSA8LSByZXhwKG49MTAwLHJhdGU9MC4yKQ0KaGlzdChpMSwgbWFpbiA9ICJwaMOibiBwaOG7kWkgbcWpIiwgeGxhYiA9ICJpMSIsIGNvbD0icGluayIpDQpgYGANCg0KYGBge3J9DQpzdW1tYXJ5KGkxKQ0KYGBgDQpT4buRIGzDom4gMiBjdeG7mWMgZ+G7jWkgxJHhur9uIGPDuW5nIGzDumMgbmhp4buBdSBuaOG6pXQgbMOgIDIxLjMsIHRo4bqlcCBuaOG6pXQgbMOgIDAuMDAzMDQ5IHbhu5tpIHRydW5nIGLDrG5oIGzDoCA0Ljc3MzkwNw0KDQo=