library(tidyverse)
## Warning: package 'tidyverse' was built under R version 4.3.1
## Warning: package 'ggplot2' was built under R version 4.3.1
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr     1.1.2     ✔ readr     2.1.4
## ✔ forcats   1.0.0     ✔ stringr   1.5.0
## ✔ ggplot2   3.4.2     ✔ tibble    3.2.1
## ✔ lubridate 1.9.2     ✔ tidyr     1.3.0
## ✔ purrr     1.0.1     
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag()    masks stats::lag()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
library(epitools)
library(DescTools)
## Warning: package 'DescTools' was built under R version 4.3.1
library(ggplot2)
library(readxl)
library(caret)
## Warning: package 'caret' was built under R version 4.3.1
## Loading required package: lattice
## 
## Attaching package: 'caret'
## 
## The following objects are masked from 'package:DescTools':
## 
##     MAE, RMSE
## 
## The following object is masked from 'package:purrr':
## 
##     lift
library(lmtest)
## Warning: package 'lmtest' was built under R version 4.3.1
## Loading required package: zoo
## Warning: package 'zoo' was built under R version 4.3.1
## 
## Attaching package: 'zoo'
## 
## The following objects are masked from 'package:base':
## 
##     as.Date, as.Date.numeric
library(fBasics)
## Warning: package 'fBasics' was built under R version 4.3.1
dt <- read_excel("C:/HK2-2023/Phân tích dữ liệu định tính/btvn.xlsx")

1 Bài về nhà tuần 6

Chạy mô hình hồi quy cho biến định lượng trong câu 2, thực hiện các bài toán liên quan.

1.1 Mô hình hồi quy

mh <- lm(formula = dt$Salary ~ dt$Gender+dt$Age+dt$`Education Level`+dt$`Job Title`+dt$`Years of Experience`, data = dt)
summary(mh)
## 
## Call:
## lm(formula = dt$Salary ~ dt$Gender + dt$Age + dt$`Education Level` + 
##     dt$`Job Title` + dt$`Years of Experience`, data = dt)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -138903  -16165   -3200   14822   83569 
## 
## Coefficients:
##                                         Estimate Std. Error t value Pr(>|t|)
## (Intercept)                              78173.3     3460.8  22.588  < 2e-16
## dt$GenderMale                             5797.0      670.6   8.645  < 2e-16
## dt$Age                                   -1762.0      125.8 -14.010  < 2e-16
## dt$`Education Level`High School         -35526.2     1409.1 -25.213  < 2e-16
## dt$`Education Level`Master's Degree      13503.6     1077.5  12.533  < 2e-16
## dt$`Education Level`PhD                  29449.5     1233.8  23.869  < 2e-16
## dt$`Job Title`Digital Marketing Manager  15023.3     1719.3   8.738  < 2e-16
## dt$`Job Title`Event Coordinator          33864.7     1626.7  20.818  < 2e-16
## dt$`Job Title`Junior Financial Advisor   27656.6     1689.2  16.372  < 2e-16
## dt$`Job Title`Software Engineer          28513.4     1764.4  16.160  < 2e-16
## dt$`Job Title`Technical Recruiter        10548.9     1744.8   6.046 1.57e-09
## dt$`Years of Experience`                  7938.0      157.9  50.267  < 2e-16
##                                            
## (Intercept)                             ***
## dt$GenderMale                           ***
## dt$Age                                  ***
## dt$`Education Level`High School         ***
## dt$`Education Level`Master's Degree     ***
## dt$`Education Level`PhD                 ***
## dt$`Job Title`Digital Marketing Manager ***
## dt$`Job Title`Event Coordinator         ***
## dt$`Job Title`Junior Financial Advisor  ***
## dt$`Job Title`Software Engineer         ***
## dt$`Job Title`Technical Recruiter       ***
## dt$`Years of Experience`                ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 26500 on 6686 degrees of freedom
## Multiple R-squared:  0.7484, Adjusted R-squared:  0.748 
## F-statistic:  1808 on 11 and 6686 DF,  p-value: < 2.2e-16

Hệ số R-squared = 0,7484 cho biết các biến độc lập trong mô hình giải thích được 74,84% sự biến thiên của mức lương nhận được.

Các biến có ý nghĩa thống kê bao gồm: GenderMale, Age, Education Level High School, Education Level Master’s Degree, Education Level PhD, Job Title Digital Marketing Manager, Job Title Event Coordinator, Job Title Junior Financial Advisor, Job Title Software Engineer, Job Title Technical Recruiter, Years of Experience.

1.2 Kiểm định khuyết tật của mô hình

1.2.1 Kiểm định hiện tượng đa cộng tuyến

VIF(mh)
##                              GVIF Df GVIF^(1/(2*Df))
## dt$Gender                1.061810  1        1.030441
## dt$Age                   8.749150  1        2.957896
## dt$`Education Level`     3.191830  3        1.213407
## dt$`Job Title`           2.461579  5        1.094262
## dt$`Years of Experience` 8.734994  1        2.955502

Kết quả tính toán cho thấy hệ số VIF của các biến đều nhỏ hơn 10. Do đó, mô hình không bị đa cộng tuyến cao.

1.2.2 Kiểm định phương sai sai số thay đổi

Giả thuyết/Đối thuyết:

  • \(H_0\): Mô hình không có phương sai sai số thay đổi

  • \(H_1\): Mô hình có phương sai sai số thay đổi

Xét thống kê:

bptest(mh)
## 
##  studentized Breusch-Pagan test
## 
## data:  mh
## BP = 1230.6, df = 11, p-value < 2.2e-16

Ta có p-value < 0,05 nên bác bỏ giả thuyết \(H_0\).

Vậy mô hình có phương sai sai số thay đổi.

1.2.3 Kiểm định tự tương quan

Giả thuyết/Đối thuyết:

  • \(H_0\): Mô hình không có tự tương quan bậc 2

  • \(H_1\): Mô hình có tự tương quan bậc 2

Xét thống kê:

Box.test(mh$residuals, lag = 2, type = "Ljung-Box")
## 
##  Box-Ljung test
## 
## data:  mh$residuals
## X-squared = 3161.8, df = 2, p-value < 2.2e-16

Ta có p-value < 0,05 nên bác bỏ giả thuyết \(H_0\).

Vậy mô hình có tự tương quan bậc 2.

2 Bài về nhà tuần 4 và tuần 5

Phân tích thống kê mô tả của 2 biến phụ thuộc ở câu 2 với 5 biến còn lại trong câu 3, nhận xét về kết quả phân tích này.

Chạy mô hình hồi quy cho biến định tính trong câu 2, thực hiện các bài toán liên quan.

2.1 Phân tích 2 biến là Job Title và Gender

Với dữ liệu gốc, biến chức vụ công việc (Job Title) là biến định tính có 6 giá trị: Delivery Driver, Event Coordinator, Junior Financial Advisor, Software Engineer, Digital Marketing Manager, Technical Recruiter, nên tác giả đã đặt quy ước về việc chuyển biến Job Title như sau: Chuyên môn thấp (Delivery Driver, Event Coordinator, Junior Financial Advisor) và Chuyên môn cao (Software Engineer, Digital Marketing Manager, Technical Recruiter).

w <- data.frame(dt)
Congviec <- w %>% mutate(cv = case_when(dt$`Job Title` == "Delivery Driver" ~ 1, dt$`Job Title` == "Event Coordinator" ~ 1, dt$`Job Title` == "Junior Financial Advisor" ~ 1, dt$`Job Title` == "Software Engineer" ~ 3, dt$`Job Title` == "Digital Marketing Manager" ~ 3, dt$`Job Title` == "Technical Recruiter" ~ 3))
Congviec <- cut(Congviec$cv, breaks = c(0,2,4), labels=c("Chuyên môn thấp", "Chuyên môn cao"))
Gioitinh <- dt$Gender
table(Gioitinh,Congviec)
##         Congviec
## Gioitinh Chuyên môn thấp Chuyên môn cao
##   Female            1030           1988
##   Male              1481           2199
prop.table(table(Gioitinh,Congviec))
##         Congviec
## Gioitinh Chuyên môn thấp Chuyên môn cao
##   Female       0.1537772      0.2968050
##   Male         0.2211108      0.3283070
addmargins(table(Gioitinh,Congviec))
##         Congviec
## Gioitinh Chuyên môn thấp Chuyên môn cao  Sum
##   Female            1030           1988 3018
##   Male              1481           2199 3680
##   Sum               2511           4187 6698
ggplot(dt, aes(Congviec, fill = Gioitinh)) +  geom_bar(position = 'dodge')+ylab("Số lượng")+xlab("Chức vụ công việc")

Từ bảng tần số và đồ thị, ta thấy:

  • Trong số 2511 người làm việc chuyên môn thấp có 1030 người là nữ (chiếm 15,38%) và 1481 người là nam (chiếm 22,11%).

  • Trong số 4187 người làm việc chuyên môn cao có 1988 người là nữ (chiếm 29,68%) và 2199 người là nam (chiếm 32,83%).

Như vậy ở cả hai giới tính nam và nữ thì những người làm việc chuyên môn cao đều chiếm tỷ lệ cao hơn. Cho dù làm việc chuyên môn thấp hay chuyên môn cao thì tỷ lệ giới tính nam luôn cao hơn giới tính nữ.

Rủi ro tương đối

epitab(table(Gioitinh,Congviec),method = 'riskratio', rev = 'c')
## $tab
##         Congviec
## Gioitinh Chuyên môn cao        p0 Chuyên môn thấp        p1 riskratio    lower
##   Female           1988 0.6587144            1030 0.3412856  1.000000       NA
##   Male             2199 0.5975543            1481 0.4024457  1.179205 1.106876
##         Congviec
## Gioitinh    upper      p.value
##   Female       NA           NA
##   Male   1.256259 2.610728e-07
## 
## $measure
## [1] "wald"
## 
## $conf.level
## [1] 0.95
## 
## $pvalue
## [1] "fisher.exact"

Tỷ lệ giữa những người giới tính nam làm việc chuyên môn thấp so với tỷ lệ giữa những người giới tính nữ làm việc chuyên môn thấp là 1,18.

Vậy rủi ro tương đối mẫu là 1,18 cho thấy tỷ lệ giữa những người làm việc chuyên môn thấp trong những người giới tính nam cao hơn 1,18 lần so với tỷ lệ những người giới tính nữ.

Với độ tin cậy 95% thì giá trị này cho biết tỷ lệ những người làm việc chuyên môn thấp trong những người giới tính nam cao hơn trong khoảng 1,11 lần đến 1,26 lần so với tỷ lệ những người giới tính nữ.

Tỉ lệ chênh

epitab(table(Gioitinh,Congviec), method = 'oddsratio', rev = 'c')
## $tab
##         Congviec
## Gioitinh Chuyên môn cao       p0 Chuyên môn thấp        p1 oddsratio   lower
##   Female           1988 0.474803            1030 0.4101951  1.000000      NA
##   Male             2199 0.525197            1481 0.5898049  1.299897 1.17618
##         Congviec
## Gioitinh    upper      p.value
##   Female       NA           NA
##   Male   1.436627 2.610728e-07
## 
## $measure
## [1] "wald"
## 
## $conf.level
## [1] 0.95
## 
## $pvalue
## [1] "fisher.exact"

Tỷ lệ chuyên môn thấp so với chuyên môn cao của những người giới tính nữ gấp 1,3 lần tỷ lệ chuyên môn thấp so với chuyên môn cao của những người giới tính nam.

2.2 Phân tích 2 biến là Job Title và Age

Với dữ liệu gốc, biến độ tuổi (Age) là biến định lượng có giá trị trong khoảng 21 - 62, nên tác giả đã đặt quy ước về việc chuyển biến Age như sau: Dưới 40 tuổi (0 - 40) và Trên 40 tuổi (40 - 70).

Tuoi <- cut(dt$Age, breaks = c(0,40,70), labels = c("Dưới 40 tuổi", "Trên 40 tuổi"))
table(Tuoi,Congviec)
##               Congviec
## Tuoi           Chuyên môn thấp Chuyên môn cao
##   Dưới 40 tuổi            2357           2993
##   Trên 40 tuổi             154           1194
prop.table(table(Tuoi,Congviec))
##               Congviec
## Tuoi           Chuyên môn thấp Chuyên môn cao
##   Dưới 40 tuổi      0.35189609     0.44684981
##   Trên 40 tuổi      0.02299194     0.17826217
addmargins(table(Tuoi,Congviec))
##               Congviec
## Tuoi           Chuyên môn thấp Chuyên môn cao  Sum
##   Dưới 40 tuổi            2357           2993 5350
##   Trên 40 tuổi             154           1194 1348
##   Sum                     2511           4187 6698
ggplot(dt, aes(Congviec, fill = Tuoi)) +  geom_bar(position = 'dodge')+ylab("Số lượng")+xlab("Chức vụ công việc")

Từ bảng tần số và đồ thị, ta thấy:

  • Trong số 2511 người làm việc chuyên môn thấp có 2357 người dưới 40 tuổi (chiếm 35,19%) và 154 người trên 40 tuổi (chiếm 2,3%).

  • Trong số 4187 người làm việc chuyên môn cao có 2993 người dưới 40 tuổi (chiếm 44,68%) và 1194 người trên 40 tuổi (chiếm 17,83%).

Như vậy dù làm việc chuyên môn thấp hay chuyên môn cao thì người dưới 40 tuổi vẫn chiếm tỷ lệ cao hơn.

Rủi ro tương đối

epitab(table(Tuoi,Congviec),method = 'riskratio', rev = 'c')
## $tab
##               Congviec
## Tuoi           Chuyên môn cao        p0 Chuyên môn thấp        p1 riskratio
##   Dưới 40 tuổi           2993 0.5594393            2357 0.4405607 1.0000000
##   Trên 40 tuổi           1194 0.8857567             154 0.1142433 0.2593134
##               Congviec
## Tuoi               lower     upper       p.value
##   Dưới 40 tuổi        NA        NA            NA
##   Trên 40 tuổi 0.2228187 0.3017856 3.650612e-124
## 
## $measure
## [1] "wald"
## 
## $conf.level
## [1] 0.95
## 
## $pvalue
## [1] "fisher.exact"

Tỷ lệ giữa những người trên 40 tuổi làm việc chuyên môn thấp so với tỷ lệ giữa những người dưới 40 tuổi làm việc chuyên môn thấp là 0,26.

Vậy rủi ro tương đối mẫu là 0,26 cho thấy tỷ lệ người làm việc chuyên môn thấp đối với những người trên 40 tuổi thấp hơn 74% so với những người dưới 40 tuổi.

Với độ tin cậy 95%, thì tỷ lệ những người làm việc chuyên môn thấp trên 40 tuổi ít hơn 69,82% đến 77,72% những người dưới 40 tuổi.

Tỉ lệ chênh

epitab(table(Tuoi,Congviec), method = 'oddsratio', rev = 'c')
## $tab
##               Congviec
## Tuoi           Chuyên môn cao        p0 Chuyên môn thấp         p1 oddsratio
##   Dưới 40 tuổi           2993 0.7148316            2357 0.93866985  1.000000
##   Trên 40 tuổi           1194 0.2851684             154 0.06133015  0.163781
##               Congviec
## Tuoi               lower     upper       p.value
##   Dưới 40 tuổi        NA        NA            NA
##   Trên 40 tuổi 0.1373111 0.1953537 3.650612e-124
## 
## $measure
## [1] "wald"
## 
## $conf.level
## [1] 0.95
## 
## $pvalue
## [1] "fisher.exact"

Tỷ lệ chuyên môn thấp so với chuyên môn cao của những người dưới 40 tuổi bằng 16,38% tỷ lệ chuyên môn thấp so với chuyên môn cao của những người trên 40 tuổi.

2.3 Phân tích 2 biến là Salary và Education Level

Với dữ liệu gốc, biến mức lương (Salary) là biến định lượng có giá trị trong khoảng 350 - 250000, nên tác giả đã đặt quy ước về việc chuyển biến Salary như sau: Thấp (0 - 100000) và Cao (100000 - 260000). Biến tình trạng học vấn (Education Level) là biến định tính có 4 giá trị: Bachelor’s Degree, High School, Master’s Degree, PhD, nên tác giả đã đặt quy ước về việc chuyển biến Education Level như sau: Dưới đại học (Bachelor’s Degree, High School) và Trên đại học (Master’s Degree, PhD).

Hocvan <- w %>% mutate(hv = case_when(dt$`Education Level` == "Bachelor's Degree" ~ 1, dt$`Education Level` == "High School" ~ 1, dt$`Education Level` == "Master's Degree" ~ 3, dt$`Education Level` == "PhD" ~ 3))
Hocvan <- cut(Hocvan$hv, breaks = c(0,2,4), labels=c("Dưới đại học", "Trên đại học"))
Luong <- cut(dt$Salary, breaks = c(0,100000,260000), labels = c("Thấp", "Cao"))
table(Hocvan,Luong)
##               Luong
## Hocvan         Thấp  Cao
##   Dưới đại học 2380 1089
##   Trên đại học  546 2683
prop.table(table(Hocvan,Luong))
##               Luong
## Hocvan               Thấp        Cao
##   Dưới đại học 0.35532995 0.16258585
##   Trên đại học 0.08151687 0.40056733
addmargins(table(Hocvan,Luong))
##               Luong
## Hocvan         Thấp  Cao  Sum
##   Dưới đại học 2380 1089 3469
##   Trên đại học  546 2683 3229
##   Sum          2926 3772 6698
ggplot(dt, aes(Luong, fill = Hocvan)) +  geom_bar(position = 'dodge')+ylab("Số lượng")+xlab("Mức lương")

Từ bảng tần số và đồ thị, ta thấy:

  • Trong số 2926 người lương thấp có 2380 người trình độ dưới đại học (chiếm 35,53%) và 546 người trên đại học (chiếm 8,15%).

  • Trong số 3772 người lương cao có 1089 người dưới đại học (chiếm 16,26%) và 1194 người trên đại học (chiếm 40,06%).

Từ đồ thị ta thấy trong số những người lương thấp thì tỷ lệ người dưới đại học cao hơn tỷ lệ người trên đại học. Còn ở những người lương cao thì tỷ lệ người trên đại học cao hơn.

Rủi ro tương đối

epitab(table(Hocvan,Luong),method = 'riskratio', rev = 'c')
## $tab
##               Luong
## Hocvan          Cao        p0 Thấp        p1 riskratio     lower     upper
##   Dưới đại học 1089 0.3139233 2380 0.6860767 1.0000000        NA        NA
##   Trên đại học 2683 0.8309074  546 0.1690926 0.2464631 0.2275816 0.2669112
##               Luong
## Hocvan         p.value
##   Dưới đại học      NA
##   Trên đại học       0
## 
## $measure
## [1] "wald"
## 
## $conf.level
## [1] 0.95
## 
## $pvalue
## [1] "fisher.exact"

Tỷ lệ giữa những người trên đại học có lương thấp so với tỷ lệ giữa những người dưới đại học có lương thấp là 0,25.

Vậy rủi ro tương đối mẫu là 0,25 cho thấy tỷ lệ lương thấp đối với những người trên đại học thấp hơn 75% so với những người dưới đại học.

Với độ tin cậy 95%, thì tỷ lệ lương thấp trong những người trên đại học ít hơn 73,31% đến 77,24% so với những người dưới đại học.

Tỉ lệ chênh

epitab(table(Hocvan,Luong), method = 'oddsratio', rev = 'c')
## $tab
##               Luong
## Hocvan          Cao        p0 Thấp        p1 oddsratio      lower     upper
##   Dưới đại học 1089 0.2887063 2380 0.8133971 1.0000000         NA        NA
##   Trên đại học 2683 0.7112937  546 0.1866029 0.0931157 0.08286272 0.1046373
##               Luong
## Hocvan         p.value
##   Dưới đại học      NA
##   Trên đại học       0
## 
## $measure
## [1] "wald"
## 
## $conf.level
## [1] 0.95
## 
## $pvalue
## [1] "fisher.exact"

Tỷ lệ lương thấp so với lương cao của những người dưới đại học bằng 9,3% tỷ lệ lương thấp so với lương cao của những người trên đại học.

2.4 Phân tích 2 biến là Salary và Years of Experience

Với dữ liệu gốc, biến kinh nghiệm làm việc (Years of Experience) là biến định lượng có giá trị trong khoảng 0 - 34, nên tác giả đã đặt quy ước về việc chuyển biến Years of Experience như sau: Ít (0 - 10) và Nhiều (10 - 35).

Kinhnghiem <- cut(dt$`Years of Experience`, breaks = c(-1,10,35), labels = c("Ít", "Nhiều"))
table(Kinhnghiem,Luong)
##           Luong
## Kinhnghiem Thấp  Cao
##      Ít    2906 1687
##      Nhiều   20 2085
prop.table(table(Kinhnghiem,Luong))
##           Luong
## Kinhnghiem        Thấp         Cao
##      Ít    0.433860854 0.251866229
##      Nhiều 0.002985966 0.311286951
addmargins(table(Kinhnghiem,Luong))
##           Luong
## Kinhnghiem Thấp  Cao  Sum
##      Ít    2906 1687 4593
##      Nhiều   20 2085 2105
##      Sum   2926 3772 6698
ggplot(dt, aes(Luong, fill = Kinhnghiem)) +  geom_bar(position = 'dodge')+ylab("Số lượng")+xlab("Mức lương")

Từ bảng tần số và đồ thị, ta thấy:

  • Trong số 2926 người lương thấp có 2906 người có ít kinh nghiệm làm việc (chiếm 43,39%) và 20 người nhiều kinh nghiệm làm việc (chiếm 0,3%).

  • Trong số 3772 người lương cao có 1687 người ít kinh nghiệm làm việc (chiếm 25,19%) và 2105 người nhiều kinh nghiệm làm việc (chiếm 31,13%).

Từ đồ thị ta thấy trong số những người lương thấp thì tỷ lệ người ít kinh nghiệm làm việc cao hơn tỷ lệ người nhiều kinh nghiệm làm việc. Còn ở những người lương cao thì tỷ lệ người nhiều kinh nghiệm làm việc cao hơn.

Rủi ro tương đối

epitab(table(Kinhnghiem,Luong),method = 'riskratio', rev = 'c')
## $tab
##           Luong
## Kinhnghiem  Cao        p0 Thấp          p1  riskratio       lower      upper
##      Ít    1687 0.3672981 2906 0.632701938 1.00000000          NA         NA
##      Nhiều 2085 0.9904988   20 0.009501188 0.01501685 0.009703068 0.02324066
##           Luong
## Kinhnghiem p.value
##      Ít         NA
##      Nhiều       0
## 
## $measure
## [1] "wald"
## 
## $conf.level
## [1] 0.95
## 
## $pvalue
## [1] "fisher.exact"

Tỷ lệ giữa những người nhiều kinh nghiệm làm việc có lương thấp so với tỷ lệ giữa những người ít kinh nghiệm làm việc có lương thấp là 0,02.

Vậy rủi ro tương đối mẫu là 0,02 cho thấy tỷ lệ lương thấp của những người nhiều kinh nghiệm làm việc thấp hơn 98% so với những người ít kinh nghiệm làm việc.

Với độ tin cậy 95%, thì tỷ lệ lương thấp của người nhiều kinh nghiệm làm việc ít hơn 97,77% đến 99,03% so với những người ít kinh nghiệm làm việc.

Tỉ lệ chênh

epitab(table(Kinhnghiem,Luong), method = 'oddsratio', rev = 'c')
## $tab
##           Luong
## Kinhnghiem  Cao        p0 Thấp         p1   oddsratio       lower       upper
##      Ít    1687 0.4472428 2906 0.99316473 1.000000000          NA          NA
##      Nhiều 2085 0.5527572   20 0.00683527 0.005568566 0.003570522 0.008684706
##           Luong
## Kinhnghiem p.value
##      Ít         NA
##      Nhiều       0
## 
## $measure
## [1] "wald"
## 
## $conf.level
## [1] 0.95
## 
## $pvalue
## [1] "fisher.exact"

Tỷ lệ lương thấp so với lương cao của những người ít kinh nghiệm làm việc bằng 0,56% tỷ lệ lương thấp so với lương cao của những nhiều kinh nghiệm làm việc.

2.5 Thống kê suy diễn cho dữ liệu định tính

2.5.1 Kiểm định tính độc lập cho hai biến định tính

Kiểm định tính độc lập cho hai biến Congviec và Gioitinh

Giả thuyết/Đối thuyết:

  • \(H_0\): Biến Congviec và biến Gioitinh độc lập

  • \(H_1\): Biến Congviec và biến Gioitinh không độc lập

Xét thống kê:

chisq.test(table(Congviec,Gioitinh))
## 
##  Pearson's Chi-squared test with Yates' continuity correction
## 
## data:  table(Congviec, Gioitinh)
## X-squared = 26.206, df = 1, p-value = 3.068e-07

Ta có p-value = 3,068e-07 < 0,05 nên bác bỏ giả thuyết \(H_0\).

Vậy với mức ý nghĩa 5%, biến Congviec và biến Gioitinh không độc lập với nhau.

Kiểm định tính độc lập cho hai biến Congviec và Kinhnghiem

Giả thuyết/Đối thuyết:

  • \(H_0\): Biến Congviec và biến Kinhnghiem độc lập

  • \(H_1\): Biến Congviec và biến Kinhnghiem không độc lập

Xét thống kê:

chisq.test(table(Congviec,Kinhnghiem))
## 
##  Pearson's Chi-squared test with Yates' continuity correction
## 
## data:  table(Congviec, Kinhnghiem)
## X-squared = 735.04, df = 1, p-value < 2.2e-16

Ta có p-value = 2,2e-16 < 0,05 nên bác bỏ giả thuyết \(H_0\).

Vậy với mức ý nghĩa 5%, biến Congviec và biến Kinhnghiem không độc lập với nhau.

Kiểm định tính độc lập cho hai biến Luong và Tuoi

Giả thuyết/Đối thuyết:

  • \(H_0\): Biến Luong và biến Tuoi độc lập

  • \(H_1\): Biến Luong và biến Tuoi không độc lập

Xét thống kê:

chisq.test(table(Luong,Tuoi))
## 
##  Pearson's Chi-squared test with Yates' continuity correction
## 
## data:  table(Luong, Tuoi)
## X-squared = 1271.6, df = 1, p-value < 2.2e-16

Ta có p-value = 2,2e-16 < 0,05 nên bác bỏ giả thuyết \(H_0\).

Vậy với mức ý nghĩa 5%, biến Luong và biến Tuoi không độc lập với nhau.

Kiểm định tính độc lập cho hai biến Luong và Hocvan

Giả thuyết/Đối thuyết:

  • \(H_0\): Biến Luong và biến Hocvan độc lập

  • \(H_1\): Biến Luong và biến Hocvan không độc lập

Xét thống kê:

chisq.test(table(Luong,Hocvan))
## 
##  Pearson's Chi-squared test with Yates' continuity correction
## 
## data:  table(Luong, Hocvan)
## X-squared = 1814.8, df = 1, p-value < 2.2e-16

Ta có p-value = 2,2e-16 < 0,05 nên bác bỏ giả thuyết \(H_0\).

Vậy với mức ý nghĩa 5%, biến Luong và biến Hocvan không độc lập với nhau.

2.5.2 Khoảng ước lượng cho tỷ lệ

Ước lượng tỷ lệ người có lương cao

a <- dt[dt$Salary == 100000 | dt$Salary > 100000,]
prop.test(length(a$Salary == 100000 | a$Salary > 100000), length(dt$Salary))
## 
##  1-sample proportions test with continuity correction
## 
## data:  length(a$Salary == 1e+05 | a$Salary > 1e+05) out of length(dt$Salary), null probability 0.5
## X-squared = 216.07, df = 1, p-value < 2.2e-16
## alternative hypothesis: true p is not equal to 0.5
## 95 percent confidence interval:
##  0.5779753 0.6016762
## sample estimates:
##         p 
## 0.5898776

Với độ tin cậy 95%, ước lượng tỷ lệ người có lương cao nằm trong khoảng từ 57,8% đến 60,17%.

Ước lượng sự chênh lệch về tỷ lệ người có ít kinh nghiệm làm việc giữa nam và nữ. Đồng thời thực hiện bài toán kiểm định sự chênh lệch này

gtm <- dt[dt$Gender == "Male",]
gtf <- dt[dt$Gender == "Female",]

gtm1 <- gtm[gtm$`Years of Experience` < 10,]
gtf1 <- gtf[gtf$`Years of Experience` < 10,]

x <- c(nrow(gtm), nrow(gtf))
z <- c(nrow(gtm1), nrow(gtf1))

prop.test(z,x)
## 
##  2-sample test for equality of proportions with continuity correction
## 
## data:  z out of x
## X-squared = 39.502, df = 1, p-value = 3.277e-10
## alternative hypothesis: two.sided
## 95 percent confidence interval:
##  -0.09653110 -0.05060637
## sample estimates:
##    prop 1    prop 2 
## 0.6239130 0.6974818

Ta có p-value > 0 nên bác bỏ giả thuyết \(H_0\), do đó không có sự chênh lệch về tỷ lệ người có ít kinh nghiệm làm việc giữa nam và nữ.

Khoảng tin cậy 95% cho chênh lệch tỷ lệ nằm trong khoảng từ -0,0965311 đến -0,05060637.

2.6 Ma trận hệ số Tương quan

continuous_vars <- dt[, sapply(dt, is.numeric)]
cor_matrix <- cor(continuous_vars)
cor_matrix
##                              ID        Age Years of Experience     Salary
## ID                   1.00000000 -0.1191793         -0.09868927 -0.3081368
## Age                 -0.11917925  1.0000000          0.93772531  0.7280606
## Years of Experience -0.09868927  0.9377253          1.00000000  0.8089682
## Salary              -0.30813680  0.7280606          0.80896817  1.0000000

Từ ma trận hệ số tương quan, ta thấy có mối tương quan mạnh giữa những cặp biến Age và Years of Experience, Age và Salary, Years of Experience và Salary.

2.7 Mô hình hồi quy

2.7.1 Mô hình logit

2.7.1.1 Mô hình 1

MH1 <- glm(factor(dt$`Job Title`)~dt$Gender+dt$Age+dt$Country+dt$Race+dt$`Education Level`+dt$`Years of Experience`+dt$Salary, family = binomial(link = "logit"), data = dt)
summary(MH1)
## 
## Call:
## glm(formula = factor(dt$`Job Title`) ~ dt$Gender + dt$Age + dt$Country + 
##     dt$Race + dt$`Education Level` + dt$`Years of Experience` + 
##     dt$Salary, family = binomial(link = "logit"), data = dt)
## 
## Coefficients:
##                                       Estimate Std. Error z value Pr(>|z|)    
## (Intercept)                          1.183e+00  8.612e-01   1.374  0.16953    
## dt$GenderMale                       -1.778e-01  1.283e-01  -1.386  0.16579    
## dt$Age                              -9.116e-02  2.944e-02  -3.096  0.00196 ** 
## dt$CountryCanada                     2.380e-01  2.413e-01   0.986  0.32396    
## dt$CountryChina                      5.494e-02  3.022e-01   0.182  0.85577    
## dt$CountryUK                         1.359e-01  2.588e-01   0.525  0.59969    
## dt$CountryUSA                       -2.661e-03  2.452e-01  -0.011  0.99134    
## dt$RaceAsian                         8.126e-02  3.216e-01   0.253  0.80055    
## dt$RaceAustralian                    3.376e-01  4.229e-01   0.798  0.42472    
## dt$RaceBlack                        -2.916e-01  4.206e-01  -0.693  0.48823    
## dt$RaceChinese                       4.227e-01  4.686e-01   0.902  0.36703    
## dt$RaceHispanic                      3.028e-01  3.816e-01   0.793  0.42750    
## dt$RaceKorean                       -1.347e-01  4.546e-01  -0.296  0.76704    
## dt$RaceMixed                         1.273e-01  4.625e-01   0.275  0.78306    
## dt$RaceWelsh                         3.270e-01  4.743e-01   0.689  0.49056    
## dt$RaceWhite                        -3.393e-02  3.194e-01  -0.106  0.91540    
## dt$`Education Level`High School      2.790e+00  2.855e-01   9.770  < 2e-16 ***
## dt$`Education Level`Master's Degree  2.193e+00  2.841e-01   7.716 1.20e-14 ***
## dt$`Education Level`PhD              1.890e+01  3.889e+02   0.049  0.96123    
## dt$`Years of Experience`            -3.104e-01  4.402e-02  -7.053 1.75e-12 ***
## dt$Salary                            6.808e-05  4.846e-06  14.050  < 2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 2712.6  on 6697  degrees of freedom
## Residual deviance: 1887.1  on 6677  degrees of freedom
## AIC: 1929.1
## 
## Number of Fisher Scoring iterations: 19

Kiểm định sự phù hợp của mô hình

Giả thuyết/Đối thuyết:

  • \(H_0\): Mô hình không phù hợp

  • \(H_1\): Mô hình phù hợp

lr_test <- anova(MH1, test = "Chisq")
p_value <- lr_test$Pr[2]
p_value
## [1] 0.2666465

Ta có p-value = 0,2666465 > 0,05 nên chưa đủ cơ sở bác bỏ giả thuyết \(H_0\). Vì vậy mô hình không phù hợp với dữ liệu.

2.7.1.2 Mô hình 2

Từ mô hình 1 ta thấy chỉ có các biến Age, Education Level, Years of Experience và Salary có ý nghĩa thống kê nên sử dụng để chạy mô hình 2.

MH2 <- glm(factor(dt$`Job Title`)~dt$Age+dt$`Education Level`+dt$`Years of Experience`+dt$Salary, family = binomial(link = "logit"), data = dt)
summary(MH2)
## 
## Call:
## glm(formula = factor(dt$`Job Title`) ~ dt$Age + dt$`Education Level` + 
##     dt$`Years of Experience` + dt$Salary, family = binomial(link = "logit"), 
##     data = dt)
## 
## Coefficients:
##                                       Estimate Std. Error z value Pr(>|z|)    
## (Intercept)                          1.338e+00  7.901e-01   1.693   0.0905 .  
## dt$Age                              -9.122e-02  2.937e-02  -3.106   0.0019 ** 
## dt$`Education Level`High School      2.758e+00  2.831e-01   9.743  < 2e-16 ***
## dt$`Education Level`Master's Degree  2.235e+00  2.812e-01   7.949 1.87e-15 ***
## dt$`Education Level`PhD              1.889e+01  3.908e+02   0.048   0.9614    
## dt$`Years of Experience`            -3.019e-01  4.336e-02  -6.963 3.34e-12 ***
## dt$Salary                            6.608e-05  4.627e-06  14.281  < 2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 2712.6  on 6697  degrees of freedom
## Residual deviance: 1897.3  on 6691  degrees of freedom
## AIC: 1911.3
## 
## Number of Fisher Scoring iterations: 19

Kiểm định sự phù hợp của mô hình

Giả thuyết/Đối thuyết:

  • \(H_0\): Mô hình không phù hợp

  • \(H_1\): Mô hình phù hợp

lr_test <- anova(MH2, test = "Chisq")
p_value <- lr_test$Pr[2]
p_value
## [1] 1.725049e-07

Ta có p-value = 1,725049e-07 < 0,05 nên bác bỏ giả thuyết \(H_0\). Vì vậy mô hình phù hợp với dữ liệu.

BrierScore

BrierScore(MH2)
## [1] 0.03975666

Ma trận nhầm lẫn

h <- predict(MH2, type = "response")
j <- ifelse(h > 0.5, "1", "0")
k <- factor(j, levels = c("0","1"))
l <- factor(Congviec, labels = c("0","1"))
confusionMatrix(table(k,l))
## Confusion Matrix and Statistics
## 
##    l
## k      0    1
##   0   29    5
##   1 2482 4182
##                                          
##                Accuracy : 0.6287         
##                  95% CI : (0.617, 0.6403)
##     No Information Rate : 0.6251         
##     P-Value [Acc > NIR] : 0.2768         
##                                          
##                   Kappa : 0.0129         
##                                          
##  Mcnemar's Test P-Value : <2e-16         
##                                          
##             Sensitivity : 0.011549       
##             Specificity : 0.998806       
##          Pos Pred Value : 0.852941       
##          Neg Pred Value : 0.627551       
##              Prevalence : 0.374888       
##          Detection Rate : 0.004330       
##    Detection Prevalence : 0.005076       
##       Balanced Accuracy : 0.505178       
##                                          
##        'Positive' Class : 0              
## 

MH2 có độ chính xác toàn thể là 62,87%, độ nhạy là 1,15% và độ hiệu quả là 99,88%.

2.7.2 Mô hình hồi quy probit

MH3 <- glm(factor(dt$`Job Title`)~dt$Age+dt$`Education Level`+dt$`Years of Experience`+dt$Salary, family = binomial(link = "probit"), data = dt)
## Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
summary(MH3)
## 
## Call:
## glm(formula = factor(dt$`Job Title`) ~ dt$Age + dt$`Education Level` + 
##     dt$`Years of Experience` + dt$Salary, family = binomial(link = "probit"), 
##     data = dt)
## 
## Coefficients:
##                                       Estimate Std. Error z value Pr(>|z|)    
## (Intercept)                          9.160e-01  4.091e-01   2.239  0.02516 *  
## dt$Age                              -4.571e-02  1.534e-02  -2.980  0.00288 ** 
## dt$`Education Level`High School      1.216e+00  1.236e-01   9.832  < 2e-16 ***
## dt$`Education Level`Master's Degree  1.064e+00  1.192e-01   8.923  < 2e-16 ***
## dt$`Education Level`PhD              7.020e+00  7.049e+01   0.100  0.92068    
## dt$`Years of Experience`            -1.514e-01  2.230e-02  -6.792 1.11e-11 ***
## dt$Salary                            3.179e-05  2.271e-06  13.999  < 2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 2712.6  on 6697  degrees of freedom
## Residual deviance: 1912.0  on 6691  degrees of freedom
## AIC: 1926
## 
## Number of Fisher Scoring iterations: 19

Kiểm định sự phù hợp của mô hình

Giả thuyết/Đối thuyết:

  • \(H_0\): Mô hình không phù hợp

  • \(H_1\): Mô hình phù hợp

lr_test <- anova(MH3, test = "Chisq")
## Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
p_value <- lr_test$Pr[2]
p_value
## [1] 1.197276e-07

Ta có p-value = 1,197276e-07 < 0,05 nên bác bỏ giả thuyết \(H_0\). Vì vậy mô hình phù hợp với dữ liệu.

BrierScore

BrierScore(MH3)
## [1] 0.04013739

Ma trận nhầm lẫn

h <- predict(MH3, type = "response")
j <- ifelse(h > 0.5, "1", "0")
k <- factor(j, levels = c("0","1"))
l <- factor(Congviec, labels = c("0","1"))
confusionMatrix(table(k,l))
## Confusion Matrix and Statistics
## 
##    l
## k      0    1
##   0   19    5
##   1 2492 4182
##                                           
##                Accuracy : 0.6272          
##                  95% CI : (0.6155, 0.6388)
##     No Information Rate : 0.6251          
##     P-Value [Acc > NIR] : 0.367           
##                                           
##                   Kappa : 0.0079          
##                                           
##  Mcnemar's Test P-Value : <2e-16          
##                                           
##             Sensitivity : 0.007567        
##             Specificity : 0.998806        
##          Pos Pred Value : 0.791667        
##          Neg Pred Value : 0.626611        
##              Prevalence : 0.374888        
##          Detection Rate : 0.002837        
##    Detection Prevalence : 0.003583        
##       Balanced Accuracy : 0.503186        
##                                           
##        'Positive' Class : 0               
## 

MH3 có độ chính xác toàn thể là 62,72%, độ nhạy là 0,76% và độ hiệu quả là 99,88%.

2.7.3 Mô hình hồi quy cloglog

MH4 <- glm(factor(dt$`Job Title`)~dt$Age+dt$`Education Level`+dt$`Years of Experience`+dt$Salary, family = binomial(link = "cloglog"), data = dt)
## Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
summary(MH4)
## 
## Call:
## glm(formula = factor(dt$`Job Title`) ~ dt$Age + dt$`Education Level` + 
##     dt$`Years of Experience` + dt$Salary, family = binomial(link = "cloglog"), 
##     data = dt)
## 
## Coefficients:
##                                       Estimate Std. Error z value Pr(>|z|)    
## (Intercept)                          5.381e-01  3.144e-01   1.712   0.0870 .  
## dt$Age                              -3.012e-02  1.189e-02  -2.532   0.0113 *  
## dt$`Education Level`High School      7.689e-01  8.618e-02   8.922  < 2e-16 ***
## dt$`Education Level`Master's Degree  7.708e-01  7.983e-02   9.657  < 2e-16 ***
## dt$`Education Level`PhD              4.613e+00  3.088e+01   0.149   0.8813    
## dt$`Years of Experience`            -1.186e-01  1.770e-02  -6.701 2.08e-11 ***
## dt$Salary                            2.256e-05  1.731e-06  13.033  < 2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 2712.6  on 6697  degrees of freedom
## Residual deviance: 1932.9  on 6691  degrees of freedom
## AIC: 1946.9
## 
## Number of Fisher Scoring iterations: 20

Kiểm định sự phù hợp của mô hình

Giả thuyết/Đối thuyết:

  • \(H_0\): Mô hình không phù hợp

  • \(H_1\): Mô hình phù hợp

lr_test <- anova(MH4, test = "Chisq")
## Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
p_value <- lr_test$Pr[2]
p_value
## [1] 8.819132e-08

Ta có p-value = 8,819132e-08 < 0,05 nên bác bỏ giả thuyết \(H_0\). Vì vậy mô hình phù hợp với dữ liệu.

BrierScore

BrierScore(MH4)
## [1] 0.04077284

Ma trận nhầm lẫn

h <- predict(MH4, type = "response")
j <- ifelse(h > 0.5, "1", "0")
k <- factor(j, levels = c("0","1"))
l <- factor(Congviec, labels = c("0","1"))
confusionMatrix(table(k,l))
## Confusion Matrix and Statistics
## 
##    l
## k      0    1
##   0   15    4
##   1 2496 4183
##                                          
##                Accuracy : 0.6268         
##                  95% CI : (0.615, 0.6384)
##     No Information Rate : 0.6251         
##     P-Value [Acc > NIR] : 0.3959         
##                                          
##                   Kappa : 0.0063         
##                                          
##  Mcnemar's Test P-Value : <2e-16         
##                                          
##             Sensitivity : 0.005974       
##             Specificity : 0.999045       
##          Pos Pred Value : 0.789474       
##          Neg Pred Value : 0.626291       
##              Prevalence : 0.374888       
##          Detection Rate : 0.002239       
##    Detection Prevalence : 0.002837       
##       Balanced Accuracy : 0.502509       
##                                          
##        'Positive' Class : 0              
## 

MH4 có độ chính xác toàn thể là 62,68%, độ nhạy là 0,6% và độ hiệu quả là 99,9%.

2.7.4 Lựa chọn mô hình phù hợp

Môhình <- c("Logit","Probit","Cloglog","Lựa chọn")
AIC <- c(1911.3,1926,1946.9,"Logit")
Deviance <- c(1897.0,1912.0,1932.9,"Logit")
BrierScore <- c(0.03975666,0.04013739,0.04077284,"Logit")
ConfusionMatrix <- c(0.6287,0.6272,0.6268,"Logit")
bang <- data.frame(Môhình,AIC,Deviance,BrierScore,ConfusionMatrix)
bang

Dựa vào bảng kết quả của 3 mô hình, thông qua các chỉ số AIC, Deviance, BrierScore và ConfusionMatrix đều chỉ ra mô hình logit là tốt nhất. Do đó, mô hình logit được lựa chọn để phân tích các yếu tố tác động chức vụ công việc của người được khảo sát.

2.8 Kết quả của mô hình logit

summary(MH2)
## 
## Call:
## glm(formula = factor(dt$`Job Title`) ~ dt$Age + dt$`Education Level` + 
##     dt$`Years of Experience` + dt$Salary, family = binomial(link = "logit"), 
##     data = dt)
## 
## Coefficients:
##                                       Estimate Std. Error z value Pr(>|z|)    
## (Intercept)                          1.338e+00  7.901e-01   1.693   0.0905 .  
## dt$Age                              -9.122e-02  2.937e-02  -3.106   0.0019 ** 
## dt$`Education Level`High School      2.758e+00  2.831e-01   9.743  < 2e-16 ***
## dt$`Education Level`Master's Degree  2.235e+00  2.812e-01   7.949 1.87e-15 ***
## dt$`Education Level`PhD              1.889e+01  3.908e+02   0.048   0.9614    
## dt$`Years of Experience`            -3.019e-01  4.336e-02  -6.963 3.34e-12 ***
## dt$Salary                            6.608e-05  4.627e-06  14.281  < 2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 2712.6  on 6697  degrees of freedom
## Residual deviance: 1897.3  on 6691  degrees of freedom
## AIC: 1911.3
## 
## Number of Fisher Scoring iterations: 19

2.8.1 Giải thích kết quả

Kết quả phân tích hồi quy Logit cho thấy có 4 biến độc lập có ý nghĩa thống kê bao gồm:

  • Age: Độ tuổi của người khảo sát.

  • Education Level: Trình độ học vấn.

  • Years of Experience: Kinh nghiệm làm việc.

  • Salary: Mức lương nhận được.

Với giả thuyết các yếu tố khác không đổi, tác động của từng biến được diễn giải như sau:

  • Ở mức ý nghĩa 1%, độ tuổi có tác động tiêu cực đến quyết định chức vụ công việc.

  • Ở mức ý nghĩa 1%, trình độ học vấn có tác động tích cực đến chức vụ công việc.

  • Ở mức ý nghĩa 1%, kinh nghiệm làm việc có tác động tiêu cực đến chức vụ công việc.

  • Ở mức ý nghĩa 1%, mức lương có tác động tích cực đến chức vụ công việc.

2.8.2 Khoảng ước lượng cho hệ số hồi quy

confint.default(MH2)
##                                             2.5 %        97.5 %
## (Intercept)                         -2.109816e-01  2.886001e+00
## dt$Age                              -1.487886e-01 -3.365034e-02
## dt$`Education Level`High School      2.203449e+00  3.313229e+00
## dt$`Education Level`Master's Degree  1.684133e+00  2.786337e+00
## dt$`Education Level`PhD             -7.471254e+02  7.849134e+02
## dt$`Years of Experience`            -3.868599e-01 -2.169029e-01
## dt$Salary                            5.701135e-05  7.514998e-05

2.8.3 Dự báo

pr <- predict(MH2,type = "response")
head(round(pr,4),10)
##      1      2      3      4      5      6      7      8      9     10 
## 0.9456 0.9880 1.0000 0.4763 0.9975 0.8485 0.9829 0.9301 0.8372 1.0000

3 Bài về nhà tuần 3

Làm thống kê mô tả cho ít nhất 7 biến (vừa định tính định lượng và có 2 biến đã chọn ở câu 2) nhận xét về kết quả phân tích này.

3.1 Biến Gender

table(dt$Gender)
## 
## Female   Male 
##   3018   3680
table(dt$Gender)/sum(table(dt$Gender))
## 
##    Female      Male 
## 0.4505823 0.5494177
ggplot(dt,aes(Gender))+geom_bar(color = "red",fill = "pink")+ geom_text(aes(label = scales::percent(after_stat(count/sum(count)))), stat = 'count', vjust = - .5)+xlab("Giới tính của người được khảo sát")+ylab("Số lượng")+theme_classic()

Biến Gender là biến định tính, theo thống kê ghi nhận được:

  • Có 3018 người là nữ (chiếm 45,06%).

  • Có 3680 người là nam (chiếm 54,94%).

Từ đồ thị thấy được khảo sát không có sự chênh lệch đáng kể về giới tính, tỷ lệ giới tính nam chỉ cao hơn khoảng 10% so với giới tính nữ.

3.2 Biến Country

table(dt$Country)
## 
## Australia    Canada     China        UK       USA 
##      1336      1325      1343      1335      1359
table(dt$Country)/sum(table(dt$Country))
## 
## Australia    Canada     China        UK       USA 
## 0.1994625 0.1978202 0.2005076 0.1993132 0.2028964
ggplot(dt,aes(Country))+geom_bar(color = "red",fill = "pink")+ geom_text(aes(label = scales::percent(after_stat(count/sum(count)))), stat = 'count', vjust = - .5)+xlab("Quốc gia của người được khảo sát")+ylab("Số lượng")+theme_classic()

Biến Country là biến định tính, theo kết quả thu thập được có:

  • 1336 người ở Úc, chiếm 19,95%.

  • 1325 người ở Canada, chiếm 19,78%.

  • 1343 người ở Trung Quốc, chiếm 20,05%

  • 1335 người ở Vương Quốc Anh, chiếm 19,93%.

  • 1359 người ở Hoa Kỳ, chiếm 20,29%.

Từ đồ thị thấy được không có sự chênh lệch đáng kể về tỷ lệ quốc gia giữa những người được khảo sát.

3.3 Biến Race

table(dt$Race)
## 
## African American            Asian       Australian            Black 
##              354             1603              452              437 
##          Chinese         Hispanic           Korean            Mixed 
##              444              322              457              334 
##            Welsh            White 
##              333             1962
table(dt$Race)/sum(table(dt$Race))
## 
## African American            Asian       Australian            Black 
##       0.05285160       0.23932517       0.06748283       0.06524336 
##          Chinese         Hispanic           Korean            Mixed 
##       0.06628844       0.04807405       0.06822932       0.04986563 
##            Welsh            White 
##       0.04971633       0.29292326
pie(table(dt$Race), col = rainbow(10), main = "Biểu đồ tròn về chủng tộc")

Biến Race là biến định tính, theo kết quả thu thập được có:

  • 354 người Mỹ gốc Phi, chiếm 5,29%.

  • 1603 người Châu Á, chiếm 23,93%.

  • 452 người Úc, chiếm 6,75%

  • 437 người da đen, chiếm 6,52%.

  • 444 người Trung Quốc, chiếm 6,63%.

  • 322 người Tây Ban Nha, chiếm 4,81%.

  • 457 người Hàn Quốc, chiếm 6,82%.

  • 334 người chủng tộc hỗn hợp, chiếm 4,99%.

  • 333 người Xứ Wales, chiếm 4,97%.

  • 1962 người da trắng, chiếm 29,29%

Từ đồ thị thấy được tỷ lệ người da trắng là cao nhất với 29,29%.

3.4 Biến Education Level

table(dt$`Education Level`)
## 
## Bachelor's Degree       High School   Master's Degree               PhD 
##              3021               448              1860              1369
table(dt$`Education Level`)/sum(table(dt$`Education Level`))
## 
## Bachelor's Degree       High School   Master's Degree               PhD 
##        0.45103016        0.06688564        0.27769483        0.20438937
ggplot(dt,aes(`Education Level`))+geom_bar(color = "red",fill = "pink")+ geom_text(aes(label = scales::percent(after_stat(count/sum(count)))), stat = 'count', vjust = - .5)+xlab("Trình độ học vấn")+ylab("Số lượng")+theme_classic()

Biến Education Level là biến định tính, theo kết quả thu thập được có:

  • 3021 người có bằng cử nhân, chiếm 45,1%.

  • 448 người có bằng trung học, chiếm 6,69%.

  • 1860 người có bằng thạc sĩ, chiếm 27,77%

  • 1369 người có bằng tiến sĩ, chiếm 20,44%.

Từ đồ thị thấy được trong những người được khảo sát thì người có bằng cử nhân chiếm tỷ lệ cao nhất với 45,1%.

3.5 Biến Job Title

table(dt$`Job Title`)
## 
##           Delivery Driver Digital Marketing Manager         Event Coordinator 
##                       344                      1792                      1201 
##  Junior Financial Advisor         Software Engineer       Technical Recruiter 
##                       966                      1383                      1012
table(dt$`Job Title`)/sum(table(dt$`Job Title`))
## 
##           Delivery Driver Digital Marketing Manager         Event Coordinator 
##                0.05135861                0.26754255                0.17930726 
##  Junior Financial Advisor         Software Engineer       Technical Recruiter 
##                0.14422216                0.20647955                0.15108988
ggplot(dt,aes(`Job Title`))+geom_bar(color = "red",fill = "pink")+ geom_text(aes(label = scales::percent(after_stat(count/sum(count)))), stat = 'count', vjust = - .5)+xlab("Chức vụ công việc")+ylab("Số lượng")+theme_classic()

Biến Job Title là biến định tính, theo kết quả thu thập được có:

  • 344 người làm tài xế giao hàng, chiếm 5,14%.

  • 1792 người làm giám đốc tiếp thị kỹ thuật số, chiếm 26,75%.

  • 1201 người làm điều phối viên sự kiện, chiếm 17,93%

  • 966 người làm cố vấn tài chính, chiếm 14,42%.

  • 1383 người làm kỹ sư phần mềm, chiếm 20,65%.

  • 1012 người làm kỹ thuật viên, chiếm 15,11%.

Từ đồ thị thấy được trong những người được khảo sát thì người làm giám đốc tiếp thị kỹ thuật số chiếm tỷ lệ cao nhất với 26,75%.

3.6 Biến Age

summary(dt$Age)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   21.00   28.00   32.00   33.62   38.00   62.00

Biến Age là biến định lượng, từ kết quả thống kê ta thấy:

  • Độ tuổi trung bình là 33,62.

  • Độ tuổi thấp nhất là 21.

  • Độ tuổi cao nhất là 62.

  • Có 25% số người dưới 28 tuổi.

  • Có 50% số người dưới 32 tuổi.

  • Có 75% số người dưới 38 tuổi.

hist(dt$Age, col = "pink", main = "Biểu đồ độ tuổi", xlab = "Độ tuổi của người khảo sát", ylab = "Số lượng")

Từ biểu đồ thấy được độ tuổi của người khảo sát nhiều nhất là trong khoảng 25 - 35 tuổi.

3.7 Biến Years of Experience

summary(dt$`Years of Experience`)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   0.000   3.000   7.000   8.095  12.000  34.000

Biến Years of Experience là biến định lượng, từ kết quả thống kê ta thấy:

  • Kinh nghiệm làm việc trung bình là 8,095.

  • Kinh nghiệm làm việc thấp nhất là 0.

  • Kinh nghiệm làm việc cao nhất là 34.

  • Có 25% số người có dưới 3 năm kinh nghiệm làm việc.

  • Có 50% số người có dưới 7 năm kinh nghiệm làm việc.

  • Có 75% số người có dưới 12 năm kinh nghiệm làm việc.

hist(dt$`Years of Experience`, col = "pink", main = "Biểu đồ kinh nghiệm làm việc", xlab = "Kinh nghiệm làm việc của người khảo sát", ylab = "Số lượng")

Từ biểu đồ thấy được kinh nghiệm làm việc của người khảo sát nhiều nhất là dưới 10 năm.

3.8 Biến Salary

summary(dt$Salary)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##     350   70000  115000  115329  160000  250000

Biến Salary là biến định lượng, từ kết quả thống kê ta thấy:

  • Mức lương trung bình là 11532.

  • Mức lương thấp nhất là 350.

  • Mức lương cao nhất là 250000.

  • Có 25% số người có mức lương dưới 7000.

  • Có 50% số người có mức lương dưới 115000.

  • Có 75% số người có mức lương dưới 160000.

hist(dt$Salary, col = "pink", main = "Biểu đồ mức lương", xlab = "Mức lương của người khảo sát", ylab = "Số lượng")

Từ biểu đồ thấy được mức lương của người khảo sát khá đồng đều và nằm trong khoảng từ 50000 - 200000 là nhiều nhất.

4 Bài về nhà tuần 2

Chọn 1 biến định tính và 1 biến định lượng làm biến phụ thuộc để phân tích, giải thích lý do.

4.1 Phân loại các biến trong dữ liệu

4.1.1 Dữ liệu định tính

  • Gender: Giới tính (Male: Nam, Female: Nữ)

  • Country: Quốc gia của người được khảo sát (Australia: Úc, Canada: Canada, China: Trung Quốc, UK: Vương Quốc Anh, USA: Hoa Kỳ)

  • Race: Chủng tộc của người được khảo sát (African American: Người Mỹ gốc Phi, Asian: Người Châu Á, Australian: Người Úc, Black: Người da đen, Chinese: Người Trung Quốc, Hispanic: Người Tây Ban Nha, Korean: Người Hàn Quốc, Mixed: Người chủng tộc hỗn hợp, Welsh: Người Xứ Wales, White: Người da trắng)

  • Education Level: Trình độ học vấn (High School: Có bằng trung học, Bachelor’Degree: Có bằng Cử nhân, Master’Degree: Có bằng Thạc Sĩ, PhD: Có bằng Tiến Sĩ)

  • Job Title: Chức vụ công việc (Delivery driver: Tài xế giao hàng, Digital Marketing Manager: Giám đốc Tiếp thị kỹ thuật số, Event Coordinator: Điều phối viên sự kiện, Junior Financial Advisor: Cố vấn tài chính, Software Engineer: Kỹ sư phần mềm, Technical Recruiter: Kỹ thuật viên)

4.1.2 Dữ liệu định lượng

  • ID: Số thứ tự của người được khảo sát của người được khảo sát

  • Age: Độ tuổi (tính theo năm)

  • Years of Experience: Kinh nghiệm làm việc

  • Salary: Mức lương nhận được

4.2 Chọn biến phụ thuộc

4.2.1 Chọn biến định tính làm biến phụ thuộc

Phân tích các yếu tố ảnh hưởng đến chức vụ công việc (Job Title).

Chức vụ công việc có thể sẽ bị ảnh hưởng bởi các yếu tố như giới tính (Gender), trình độ học vấn (Education Level), độ tuổi (Age), kinh nghiệm làm việc (Years of Experience),… Do đó, chọn phân tích biến Job Title để phần nào giúp cho các nhà nghiên cứu hiểu sâu hơn về các biến, phục vụ cho công tác nghiên cứu đạt được kết quả tốt.

4.2.2 Chọn biến định lượng làm biến phụ thuộc

Phân tích các yếu tố ảnh hưởng đến mức lương của người được khảo sát (Salary).

Phân tích để xem xét mức lương có bị ảnh hưởng bởi các yếu tố: giới tính (Gender), trình độ học vấn (Education Level), độ tuổi (Age), kinh nghiệm làm việc (Years of Experience),… Do đó, chọn phân tích biến Salary để phần nào giúp cho các nhà nghiên cứu hiểu sâu hơn về các biến, phục vụ cho công tác nghiên cứu đạt được kết quả tốt.

5 Bài về nhà tuần 1

Tìm một dataset có dữ liệu định tính, có dữ liệu định lượng, có trên 5 biến và nhiều hơn 150 quan sát.

5.1 Dữ liệu nghiên cứu

Bộ dữ liệu bao gồm một bộ sưu tập toàn diện về lương và thông tin nhân khẩu học với các chi tiết bổ sung về số năm kinh nghiệm. Nó cung cấp một nguồn tài nguyên quý giá để nghiên cứu mối quan hệ giữa thu nhập và các yếu tố nhân khẩu xã hội khác nhau. Các thuộc tính nhân khẩu học bao gồm tuổi tác, giới tính, giáo dục, quốc gia và chủng tộc, cung cấp nhiều biến số khác nhau để phân tích. Các nhà nghiên cứu có thể khám phá các mô hình và xu hướng phân phối thu nhập trên các danh mục nhân khẩu học khác nhau, cho phép hiểu rõ hơn về sự chênh lệch tiềm năng hoặc các biến thể trong khả năng kiếm tiền. Hơn nữa, bộ dữ liệu kết hợp khía cạnh quan trọng của số năm kinh nghiệm, cho phép điều tra tác động của nhiệm kỳ chuyên môn đối với mức lương. Khía cạnh này bổ sung một khía cạnh năng động cho phân tích, cho phép các nhà nghiên cứu kiểm tra thu nhập thay đổi như thế nào dựa trên cả đặc điểm nhân khẩu học và kinh nghiệm làm việc tích lũy. Bộ dữ liệu mang đến cơ hội phong phú để thực hiện các nghiên cứu toàn diện về đa dạng thu nhập và hiểu các yếu tố nhiều mặt ảnh hưởng đến tiềm năng kiếm tiền trong lực lượng lao động ngày nay.

Bộ dữ liệu được thu thập từ Kaggle và mới được cập nhất gần đây vào tháng 06/2023.

5.2 Giải thích các biến

Bộ dữ liệu có 9 biến bao gồm 6698 quan sát có 4 biến định lượng và 5 biến định tính.

  • ID: Số thứ tự của người được khảo sát

  • Gender: Giới tính (Male: Nam, Female: Nữ)

  • Age: Độ tuổi (tính theo năm)

  • Country: Quốc gia của người được khảo sát (Australia: Úc, Canada: Canada, China: Trung Quốc, UK: Vương Quốc Anh, USA: Hoa Kỳ)

  • Race: Chủng tộc của người được khảo sát (African American: Người Mỹ gốc Phi, Asian: Người Châu Á, Australian: Người Úc, Black: Người da đen, Chinese: Người Trung Quốc, Hispanic: Người Tây Ban Nha, Korean: Người Hàn Quốc, Mixed: Người chủng tộc hỗn hợp, Welsh: Người Xứ Wales, White: Người da trắng)

  • Education Level: Trình độ học vấn (High School: Có bằng trung học, Bachelor’Degree: Có bằng Cử nhân, Master’Degree: Có bằng Thạc Sĩ, PhD: Có bằng Tiến Sĩ)

  • Job Title: Chức vụ công việc (Delivery driver: Tài xế giao hàng, Digital Marketing Manager: Giám đốc Tiếp thị kỹ thuật số, Event Coordinator: Điều phối viên sự kiện, Junior Financial Advisor: Cố vấn tài chính, Software Engineer: Kỹ sư phần mềm, Technical Recruiter: Kỹ thuật viên)

  • Years of Experience: Kinh nghiệm làm việc

  • Salary: Mức lương nhận được

dt <- read_excel("C:/HK2-2023/Phân tích dữ liệu định tính/btvn.xlsx")
dt
str(dt)
## tibble [6,698 × 9] (S3: tbl_df/tbl/data.frame)
##  $ ID                 : num [1:6698] 0 1 2 3 4 5 6 7 8 9 ...
##  $ Gender             : chr [1:6698] "Male" "Female" "Male" "Female" ...
##  $ Age                : num [1:6698] 32 28 45 36 52 29 42 31 26 38 ...
##  $ Country            : chr [1:6698] "UK" "USA" "Canada" "USA" ...
##  $ Race               : chr [1:6698] "White" "Hispanic" "White" "Hispanic" ...
##  $ Education Level    : chr [1:6698] "Bachelor's Degree" "Master's Degree" "PhD" "Bachelor's Degree" ...
##  $ Job Title          : chr [1:6698] "Delivery Driver" "Software Engineer" "Digital Marketing Manager" "Delivery Driver" ...
##  $ Years of Experience: num [1:6698] 5 3 15 7 20 2 12 4 1 10 ...
##  $ Salary             : num [1:6698] 90000 65000 150000 60000 200000 55000 120000 80000 45000 110000 ...
LS0tDQp0aXRsZTogIlBow6JuIHTDrWNoIGThu68gbGnhu4d1IMSR4buLbmggdMOtbmgiDQphdXRob3I6ICJOZ3V54buFbiBUcsawxqFuZyBC4bqjbyBUcsOibiINCmRhdGU6ICIyMDIzLTA2LTE0Ig0Kb3V0cHV0OiANCiAgaHRtbF9kb2N1bWVudDoNCiAgICB0b2M6IHRydWUNCiAgICBudW1iZXJfc2VjdGlvbjogdHJ1ZQ0KICAgIGNvZGVfZm9sZGluZzogaGlkZQ0KICAgIGNvZGVfZG93bmxvYWQ6IHRydWUNCiAgICB0b2NfZmxvYXQ6IA0KICAgICAgY29sbGFwc2VkOiBmYWxzZQ0KICAgIGRmX3ByaW50OiBwYWdlZA0KICBwZGZfZG9jdW1lbnQ6IGRlZmF1bHQNCiAgd29yZF9kb2N1bmVudDogZGVmYXVsdA0KICANCi0tLQ0KYGBge3J9DQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCmxpYnJhcnkoZXBpdG9vbHMpDQpsaWJyYXJ5KERlc2NUb29scykNCmxpYnJhcnkoZ2dwbG90MikNCmxpYnJhcnkocmVhZHhsKQ0KbGlicmFyeShjYXJldCkNCmxpYnJhcnkobG10ZXN0KQ0KbGlicmFyeShmQmFzaWNzKQ0KZHQgPC0gcmVhZF9leGNlbCgiQzovSEsyLTIwMjMvUGjDom4gdMOtY2ggZOG7ryBsaeG7h3UgxJHhu4tuaCB0w61uaC9idHZuLnhsc3giKQ0KYGBgDQoNCiMgQsOgaSB24buBIG5ow6AgdHXhuqduIDYNCg0KQ2jhuqF5IG3DtCBow6xuaCBo4buTaSBxdXkgY2hvIGJp4bq/biDEkeG7i25oIGzGsOG7o25nIHRyb25nIGPDonUgMiwgdGjhu7FjIGhp4buHbiBjw6FjIGLDoGkgdG/DoW4gbGnDqm4gcXVhbi4NCg0KIyMgTcO0IGjDrG5oIGjhu5NpIHF1eQ0KDQpgYGB7cn0NCm1oIDwtIGxtKGZvcm11bGEgPSBkdCRTYWxhcnkgfiBkdCRHZW5kZXIrZHQkQWdlK2R0JGBFZHVjYXRpb24gTGV2ZWxgK2R0JGBKb2IgVGl0bGVgK2R0JGBZZWFycyBvZiBFeHBlcmllbmNlYCwgZGF0YSA9IGR0KQ0Kc3VtbWFyeShtaCkNCmBgYA0KDQpI4buHIHPhu5EgUi1zcXVhcmVkID0gMCw3NDg0IGNobyBiaeG6v3QgY8OhYyBiaeG6v24gxJHhu5ljIGzhuq1wIHRyb25nIG3DtCBow6xuaCBnaeG6o2kgdGjDrWNoIMSRxrDhu6NjIDc0LDg0JSBz4buxIGJp4bq/biB0aGnDqm4gY+G7p2EgbeG7qWMgbMawxqFuZyBuaOG6rW4gxJHGsOG7o2MuDQoNCkPDoWMgYmnhur9uIGPDsyDDvSBuZ2jEqWEgdGjhu5FuZyBrw6ogYmFvIGfhu5NtOiBHZW5kZXJNYWxlLCBBZ2UsIEVkdWNhdGlvbiBMZXZlbCBIaWdoIFNjaG9vbCwgRWR1Y2F0aW9uIExldmVsIE1hc3RlcidzIERlZ3JlZSwgRWR1Y2F0aW9uIExldmVsIFBoRCwgSm9iIFRpdGxlIERpZ2l0YWwgTWFya2V0aW5nIE1hbmFnZXIsIEpvYiBUaXRsZSBFdmVudCBDb29yZGluYXRvciwgSm9iIFRpdGxlIEp1bmlvciBGaW5hbmNpYWwgQWR2aXNvciwgSm9iIFRpdGxlIFNvZnR3YXJlIEVuZ2luZWVyLCBKb2IgVGl0bGUgVGVjaG5pY2FsIFJlY3J1aXRlciwgWWVhcnMgb2YgRXhwZXJpZW5jZS4NCg0KIyMgS2nhu4NtIMSR4buLbmgga2h1eeG6v3QgdOG6rXQgY+G7p2EgbcO0IGjDrG5oDQoNCiMjIyBLaeG7g20gxJHhu4tuaCBoaeG7h24gdMaw4bujbmcgxJFhIGPhu5luZyB0dXnhur9uDQoNCmBgYHtyfQ0KVklGKG1oKQ0KYGBgDQoNCkvhur90IHF14bqjIHTDrW5oIHRvw6FuIGNobyB0aOG6pXkgaOG7hyBz4buRIFZJRiBj4bunYSBjw6FjIGJp4bq/biDEkeG7gXUgbmjhu48gaMahbiAxMC4gRG8gxJHDsywgbcO0IGjDrG5oIGtow7RuZyBi4buLIMSRYSBj4buZbmcgdHV54bq/biBjYW8uDQoNCiMjIyBLaeG7g20gxJHhu4tuaCBwaMawxqFuZyBzYWkgc2FpIHPhu5EgdGhheSDEkeG7lWkNCg0KR2nhuqMgdGh1eeG6v3QvxJDhu5FpIHRodXnhur90Og0KDQotICRIXzAkOiBNw7QgaMOsbmgga2jDtG5nIGPDsyBwaMawxqFuZyBzYWkgc2FpIHPhu5EgdGhheSDEkeG7lWkNCg0KLSAkSF8xJDogTcO0IGjDrG5oIGPDsyBwaMawxqFuZyBzYWkgc2FpIHPhu5EgdGhheSDEkeG7lWkNCg0KWMOpdCB0aOG7kW5nIGvDqjoNCg0KYGBge3J9DQpicHRlc3QobWgpDQpgYGANCg0KVGEgY8OzIHAtdmFsdWUgPCAwLDA1IG7Dqm4gYsOhYyBi4buPIGdp4bqjIHRodXnhur90ICRIXzAkLg0KDQpW4bqteSBtw7QgaMOsbmggY8OzIHBoxrDGoW5nIHNhaSBzYWkgc+G7kSB0aGF5IMSR4buVaS4NCg0KIyMjIEtp4buDbSDEkeG7i25oIHThu7EgdMawxqFuZyBxdWFuDQoNCkdp4bqjIHRodXnhur90L8SQ4buRaSB0aHV54bq/dDoNCg0KLSAkSF8wJDogTcO0IGjDrG5oIGtow7RuZyBjw7MgdOG7sSB0xrDGoW5nIHF1YW4gYuG6rWMgMg0KDQotICRIXzEkOiBNw7QgaMOsbmggY8OzIHThu7EgdMawxqFuZyBxdWFuIGLhuq1jIDINCg0KWMOpdCB0aOG7kW5nIGvDqjoNCg0KYGBge3J9DQpCb3gudGVzdChtaCRyZXNpZHVhbHMsIGxhZyA9IDIsIHR5cGUgPSAiTGp1bmctQm94IikNCmBgYA0KDQpUYSBjw7MgcC12YWx1ZSA8IDAsMDUgbsOqbiBiw6FjIGLhu48gZ2nhuqMgdGh1eeG6v3QgJEhfMCQuDQoNClbhuq15IG3DtCBow6xuaCBjw7MgdOG7sSB0xrDGoW5nIHF1YW4gYuG6rWMgMi4NCg0KIyBCw6BpIHbhu4EgbmjDoCB0deG6p24gNCB2w6AgdHXhuqduIDUNCg0KUGjDom4gdMOtY2ggdGjhu5FuZyBrw6ogbcO0IHThuqMgY+G7p2EgMiBiaeG6v24gcGjhu6UgdGh14buZYyDhu58gY8OidSAyIHbhu5tpIDUgYmnhur9uIGPDsm4gbOG6oWkgdHJvbmcgY8OidSAzLCBuaOG6rW4geMOpdCB24buBIGvhur90IHF14bqjIHBow6JuIHTDrWNoIG7DoHkuDQoNCkNo4bqheSBtw7QgaMOsbmggaOG7k2kgcXV5IGNobyBiaeG6v24gxJHhu4tuaCB0w61uaCB0cm9uZyBjw6J1IDIsIHRo4buxYyBoaeG7h24gY8OhYyBiw6BpIHRvw6FuIGxpw6puIHF1YW4uDQoNCiMjIFBow6JuIHTDrWNoIDIgYmnhur9uIGzDoCBKb2IgVGl0bGUgdsOgIEdlbmRlcg0KDQpW4bubaSBk4buvIGxp4buHdSBn4buRYywgYmnhur9uIGNo4bupYyB24bulIGPDtG5nIHZp4buHYyAoSm9iIFRpdGxlKSBsw6AgYmnhur9uIMSR4buLbmggdMOtbmggY8OzIDYgZ2nDoSB0cuG7izogRGVsaXZlcnkgRHJpdmVyLCBFdmVudCBDb29yZGluYXRvciwgSnVuaW9yIEZpbmFuY2lhbCBBZHZpc29yLCBTb2Z0d2FyZSBFbmdpbmVlciwgRGlnaXRhbCBNYXJrZXRpbmcgTWFuYWdlciwgVGVjaG5pY2FsIFJlY3J1aXRlciwgbsOqbiB0w6FjIGdp4bqjIMSRw6MgxJHhurd0IHF1eSDGsOG7m2MgduG7gSB2aeG7h2MgY2h1eeG7g24gYmnhur9uIEpvYiBUaXRsZSBuaMawIHNhdTogQ2h1ecOqbiBtw7RuIHRo4bqlcCAoRGVsaXZlcnkgRHJpdmVyLCBFdmVudCBDb29yZGluYXRvciwgSnVuaW9yIEZpbmFuY2lhbCBBZHZpc29yKSB2w6AgQ2h1ecOqbiBtw7RuIGNhbyAoU29mdHdhcmUgRW5naW5lZXIsIERpZ2l0YWwgTWFya2V0aW5nIE1hbmFnZXIsIFRlY2huaWNhbCBSZWNydWl0ZXIpLg0KDQpgYGBge3J9DQp3IDwtIGRhdGEuZnJhbWUoZHQpDQpDb25ndmllYyA8LSB3ICU+JSBtdXRhdGUoY3YgPSBjYXNlX3doZW4oZHQkYEpvYiBUaXRsZWAgPT0gIkRlbGl2ZXJ5IERyaXZlciIgfiAxLCBkdCRgSm9iIFRpdGxlYCA9PSAiRXZlbnQgQ29vcmRpbmF0b3IiIH4gMSwgZHQkYEpvYiBUaXRsZWAgPT0gIkp1bmlvciBGaW5hbmNpYWwgQWR2aXNvciIgfiAxLCBkdCRgSm9iIFRpdGxlYCA9PSAiU29mdHdhcmUgRW5naW5lZXIiIH4gMywgZHQkYEpvYiBUaXRsZWAgPT0gIkRpZ2l0YWwgTWFya2V0aW5nIE1hbmFnZXIiIH4gMywgZHQkYEpvYiBUaXRsZWAgPT0gIlRlY2huaWNhbCBSZWNydWl0ZXIiIH4gMykpDQpDb25ndmllYyA8LSBjdXQoQ29uZ3ZpZWMkY3YsIGJyZWFrcyA9IGMoMCwyLDQpLCBsYWJlbHM9YygiQ2h1ecOqbiBtw7RuIHRo4bqlcCIsICJDaHV5w6puIG3DtG4gY2FvIikpDQpHaW9pdGluaCA8LSBkdCRHZW5kZXINCnRhYmxlKEdpb2l0aW5oLENvbmd2aWVjKQ0KcHJvcC50YWJsZSh0YWJsZShHaW9pdGluaCxDb25ndmllYykpDQphZGRtYXJnaW5zKHRhYmxlKEdpb2l0aW5oLENvbmd2aWVjKSkNCmdncGxvdChkdCwgYWVzKENvbmd2aWVjLCBmaWxsID0gR2lvaXRpbmgpKSArICBnZW9tX2Jhcihwb3NpdGlvbiA9ICdkb2RnZScpK3lsYWIoIlPhu5EgbMaw4bujbmciKSt4bGFiKCJDaOG7qWMgduG7pSBjw7RuZyB2aeG7h2MiKQ0KYGBgDQoNClThu6sgYuG6o25nIHThuqduIHPhu5EgdsOgIMSR4buTIHRo4buLLCB0YSB0aOG6pXk6IA0KDQotIFRyb25nIHPhu5EgMjUxMSBuZ8aw4budaSBsw6BtIHZp4buHYyBjaHV5w6puIG3DtG4gdGjhuqVwIGPDsyAxMDMwIG5nxrDhu51pIGzDoCBu4buvIChjaGnhur9tIDE1LDM4JSkgdsOgIDE0ODEgbmfGsOG7nWkgbMOgIG5hbSAoY2hp4bq/bSAyMiwxMSUpLg0KDQotIFRyb25nIHPhu5EgNDE4NyBuZ8aw4budaSBsw6BtIHZp4buHYyBjaHV5w6puIG3DtG4gY2FvIGPDsyAxOTg4IG5nxrDhu51pIGzDoCBu4buvIChjaGnhur9tIDI5LDY4JSkgdsOgIDIxOTkgbmfGsOG7nWkgbMOgIG5hbSAoY2hp4bq/bSAzMiw4MyUpLg0KDQpOaMawIHbhuq15IOG7nyBj4bqjIGhhaSBnaeG7m2kgdMOtbmggbmFtIHbDoCBu4buvIHRow6wgbmjhu69uZyBuZ8aw4budaSBsw6BtIHZp4buHYyBjaHV5w6puIG3DtG4gY2FvIMSR4buBdSBjaGnhur9tIHThu7cgbOG7hyBjYW8gaMahbi4gQ2hvIGTDuSBsw6BtIHZp4buHYyBjaHV5w6puIG3DtG4gdGjhuqVwIGhheSBjaHV5w6puIG3DtG4gY2FvIHRow6wgdOG7tyBs4buHIGdp4bubaSB0w61uaCBuYW0gbHXDtG4gY2FvIGjGoW4gZ2nhu5tpIHTDrW5oIG7hu68uDQoNCioqUuG7p2kgcm8gdMawxqFuZyDEkeG7kWkqKg0KDQpgYGB7cn0NCmVwaXRhYih0YWJsZShHaW9pdGluaCxDb25ndmllYyksbWV0aG9kID0gJ3Jpc2tyYXRpbycsIHJldiA9ICdjJykNCmBgYA0KDQpU4bu3IGzhu4cgZ2nhu69hIG5o4buvbmcgbmfGsOG7nWkgZ2nhu5tpIHTDrW5oIG5hbSBsw6BtIHZp4buHYyBjaHV5w6puIG3DtG4gdGjhuqVwIHNvIHbhu5tpIHThu7cgbOG7hyBnaeG7r2Egbmjhu69uZyBuZ8aw4budaSBnaeG7m2kgdMOtbmggbuG7ryBsw6BtIHZp4buHYyBjaHV5w6puIG3DtG4gdGjhuqVwIGzDoCAxLDE4Lg0KDQpW4bqteSBy4bunaSBybyB0xrDGoW5nIMSR4buRaSBt4bqrdSBsw6AgMSwxOCBjaG8gdGjhuqV5IHThu7cgbOG7hyBnaeG7r2Egbmjhu69uZyBuZ8aw4budaSBsw6BtIHZp4buHYyBjaHV5w6puIG3DtG4gdGjhuqVwIHRyb25nIG5o4buvbmcgbmfGsOG7nWkgZ2nhu5tpIHTDrW5oIG5hbSBjYW8gaMahbiAxLDE4IGzhuqduIHNvIHbhu5tpIHThu7cgbOG7hyBuaOG7r25nIG5nxrDhu51pIGdp4bubaSB0w61uaCBu4buvLg0KDQpW4bubaSDEkeG7mSB0aW4gY+G6rXkgOTUlIHRow6wgZ2nDoSB0cuG7iyBuw6B5IGNobyBiaeG6v3QgdOG7tyBs4buHIG5o4buvbmcgbmfGsOG7nWkgbMOgbSB2aeG7h2MgY2h1ecOqbiBtw7RuIHRo4bqlcCB0cm9uZyBuaOG7r25nIG5nxrDhu51pIGdp4bubaSB0w61uaCBuYW0gY2FvIGjGoW4gdHJvbmcga2hv4bqjbmcgMSwxMSBs4bqnbiDEkeG6v24gMSwyNiBs4bqnbiBzbyB24bubaSB04bu3IGzhu4cgbmjhu69uZyBuZ8aw4budaSBnaeG7m2kgdMOtbmggbuG7ry4NCg0KKipU4buJIGzhu4cgY2jDqm5oKioNCg0KYGBge3J9DQplcGl0YWIodGFibGUoR2lvaXRpbmgsQ29uZ3ZpZWMpLCBtZXRob2QgPSAnb2Rkc3JhdGlvJywgcmV2ID0gJ2MnKQ0KYGBgDQoNClThu7cgbOG7hyBjaHV5w6puIG3DtG4gdGjhuqVwIHNvIHbhu5tpIGNodXnDqm4gbcO0biBjYW8gY+G7p2Egbmjhu69uZyBuZ8aw4budaSBnaeG7m2kgdMOtbmggbuG7ryBn4bqlcCAxLDMgbOG6p24gdOG7tyBs4buHIGNodXnDqm4gbcO0biB0aOG6pXAgc28gduG7m2kgY2h1ecOqbiBtw7RuIGNhbyBj4bunYSBuaOG7r25nIG5nxrDhu51pIGdp4bubaSB0w61uaCBuYW0uDQoNCiMjIFBow6JuIHTDrWNoIDIgYmnhur9uIGzDoCBKb2IgVGl0bGUgdsOgIEFnZQ0KDQpW4bubaSBk4buvIGxp4buHdSBn4buRYywgYmnhur9uIMSR4buZIHR14buVaSAoQWdlKSBsw6AgYmnhur9uIMSR4buLbmggbMaw4bujbmcgY8OzIGdpw6EgdHLhu4sgdHJvbmcga2hv4bqjbmcgMjEgLSA2MiwgbsOqbiB0w6FjIGdp4bqjIMSRw6MgxJHhurd0IHF1eSDGsOG7m2MgduG7gSB2aeG7h2MgY2h1eeG7g24gYmnhur9uIEFnZSBuaMawIHNhdTogRMaw4bubaSA0MCB0deG7lWkgKDAgLSA0MCkgdsOgIFRyw6puIDQwIHR14buVaSAoNDAgLSA3MCkuDQoNCmBgYGB7cn0NClR1b2kgPC0gY3V0KGR0JEFnZSwgYnJlYWtzID0gYygwLDQwLDcwKSwgbGFiZWxzID0gYygiRMaw4bubaSA0MCB0deG7lWkiLCAiVHLDqm4gNDAgdHXhu5VpIikpDQp0YWJsZShUdW9pLENvbmd2aWVjKQ0KcHJvcC50YWJsZSh0YWJsZShUdW9pLENvbmd2aWVjKSkNCmFkZG1hcmdpbnModGFibGUoVHVvaSxDb25ndmllYykpDQpnZ3Bsb3QoZHQsIGFlcyhDb25ndmllYywgZmlsbCA9IFR1b2kpKSArICBnZW9tX2Jhcihwb3NpdGlvbiA9ICdkb2RnZScpK3lsYWIoIlPhu5EgbMaw4bujbmciKSt4bGFiKCJDaOG7qWMgduG7pSBjw7RuZyB2aeG7h2MiKQ0KYGBgDQoNClThu6sgYuG6o25nIHThuqduIHPhu5EgdsOgIMSR4buTIHRo4buLLCB0YSB0aOG6pXk6IA0KDQotIFRyb25nIHPhu5EgMjUxMSBuZ8aw4budaSBsw6BtIHZp4buHYyBjaHV5w6puIG3DtG4gdGjhuqVwIGPDsyAyMzU3IG5nxrDhu51pIGTGsOG7m2kgNDAgdHXhu5VpIChjaGnhur9tIDM1LDE5JSkgdsOgIDE1NCBuZ8aw4budaSB0csOqbiA0MCB0deG7lWkgKGNoaeG6v20gMiwzJSkuDQoNCi0gVHJvbmcgc+G7kSA0MTg3IG5nxrDhu51pIGzDoG0gdmnhu4djIGNodXnDqm4gbcO0biBjYW8gY8OzIDI5OTMgbmfGsOG7nWkgZMaw4bubaSA0MCB0deG7lWkgKGNoaeG6v20gNDQsNjglKSB2w6AgMTE5NCBuZ8aw4budaSB0csOqbiA0MCB0deG7lWkgKGNoaeG6v20gMTcsODMlKS4NCg0KTmjGsCB24bqteSBkw7kgbMOgbSB2aeG7h2MgY2h1ecOqbiBtw7RuIHRo4bqlcCBoYXkgY2h1ecOqbiBtw7RuIGNhbyB0aMOsIG5nxrDhu51pIGTGsOG7m2kgNDAgdHXhu5VpIHbhuqtuIGNoaeG6v20gdOG7tyBs4buHIGNhbyBoxqFuLg0KDQoqKlLhu6dpIHJvIHTGsMahbmcgxJHhu5FpKioNCg0KYGBge3J9DQplcGl0YWIodGFibGUoVHVvaSxDb25ndmllYyksbWV0aG9kID0gJ3Jpc2tyYXRpbycsIHJldiA9ICdjJykNCmBgYA0KDQpU4bu3IGzhu4cgZ2nhu69hIG5o4buvbmcgbmfGsOG7nWkgdHLDqm4gNDAgdHXhu5VpIGzDoG0gdmnhu4djIGNodXnDqm4gbcO0biB0aOG6pXAgc28gduG7m2kgdOG7tyBs4buHIGdp4buvYSBuaOG7r25nIG5nxrDhu51pIGTGsOG7m2kgNDAgdHXhu5VpIGzDoG0gdmnhu4djIGNodXnDqm4gbcO0biB0aOG6pXAgbMOgIDAsMjYuDQoNClbhuq15IHLhu6dpIHJvIHTGsMahbmcgxJHhu5FpIG3huqt1IGzDoCAwLDI2IGNobyB0aOG6pXkgdOG7tyBs4buHIG5nxrDhu51pIGzDoG0gdmnhu4djIGNodXnDqm4gbcO0biB0aOG6pXAgxJHhu5FpIHbhu5tpIG5o4buvbmcgbmfGsOG7nWkgdHLDqm4gNDAgdHXhu5VpIHRo4bqlcCBoxqFuIDc0JSBzbyB24bubaSBuaOG7r25nIG5nxrDhu51pIGTGsOG7m2kgNDAgdHXhu5VpLg0KDQpW4bubaSDEkeG7mSB0aW4gY+G6rXkgOTUlLCB0aMOsIHThu7cgbOG7hyBuaOG7r25nIG5nxrDhu51pIGzDoG0gdmnhu4djIGNodXnDqm4gbcO0biB0aOG6pXAgdHLDqm4gNDAgdHXhu5VpIMOtdCBoxqFuIDY5LDgyJSDEkeG6v24gNzcsNzIlIG5o4buvbmcgbmfGsOG7nWkgZMaw4bubaSA0MCB0deG7lWkuDQoNCg0KKipU4buJIGzhu4cgY2jDqm5oKioNCg0KYGBge3J9DQplcGl0YWIodGFibGUoVHVvaSxDb25ndmllYyksIG1ldGhvZCA9ICdvZGRzcmF0aW8nLCByZXYgPSAnYycpDQpgYGANCg0KVOG7tyBs4buHIGNodXnDqm4gbcO0biB0aOG6pXAgc28gduG7m2kgY2h1ecOqbiBtw7RuIGNhbyBj4bunYSBuaOG7r25nIG5nxrDhu51pIGTGsOG7m2kgNDAgdHXhu5VpIGLhurFuZyAxNiwzOCUgdOG7tyBs4buHIGNodXnDqm4gbcO0biB0aOG6pXAgc28gduG7m2kgY2h1ecOqbiBtw7RuIGNhbyBj4bunYSBuaOG7r25nIG5nxrDhu51pIHRyw6puIDQwIHR14buVaS4NCg0KIyMgUGjDom4gdMOtY2ggMiBiaeG6v24gbMOgIFNhbGFyeSB2w6AgRWR1Y2F0aW9uIExldmVsDQoNClbhu5tpIGThu68gbGnhu4d1IGfhu5FjLCBiaeG6v24gbeG7qWMgbMawxqFuZyAoU2FsYXJ5KSBsw6AgYmnhur9uIMSR4buLbmggbMaw4bujbmcgY8OzIGdpw6EgdHLhu4sgdHJvbmcga2hv4bqjbmcgMzUwIC0gMjUwMDAwLCBuw6puIHTDoWMgZ2nhuqMgxJHDoyDEkeG6t3QgcXV5IMaw4bubYyB24buBIHZp4buHYyBjaHV54buDbiBiaeG6v24gU2FsYXJ5IG5oxrAgc2F1OiBUaOG6pXAgKDAgLSAxMDAwMDApIHbDoCBDYW8gKDEwMDAwMCAtIDI2MDAwMCkuIEJp4bq/biB0w6xuaCB0cuG6oW5nIGjhu41jIHbhuqVuIChFZHVjYXRpb24gTGV2ZWwpIGzDoCBiaeG6v24gxJHhu4tuaCB0w61uaCBjw7MgNCBnacOhIHRy4buLOiBCYWNoZWxvcidzIERlZ3JlZSwgSGlnaCBTY2hvb2wsIE1hc3RlcidzIERlZ3JlZSwgUGhELCBuw6puIHTDoWMgZ2nhuqMgxJHDoyDEkeG6t3QgcXV5IMaw4bubYyB24buBIHZp4buHYyBjaHV54buDbiBiaeG6v24gRWR1Y2F0aW9uIExldmVsIG5oxrAgc2F1OiBExrDhu5tpIMSR4bqhaSBo4buNYyAoQmFjaGVsb3IncyBEZWdyZWUsIEhpZ2ggU2Nob29sKSB2w6AgVHLDqm4gxJHhuqFpIGjhu41jIChNYXN0ZXIncyBEZWdyZWUsIFBoRCkuDQoNCmBgYGB7cn0NCkhvY3ZhbiA8LSB3ICU+JSBtdXRhdGUoaHYgPSBjYXNlX3doZW4oZHQkYEVkdWNhdGlvbiBMZXZlbGAgPT0gIkJhY2hlbG9yJ3MgRGVncmVlIiB+IDEsIGR0JGBFZHVjYXRpb24gTGV2ZWxgID09ICJIaWdoIFNjaG9vbCIgfiAxLCBkdCRgRWR1Y2F0aW9uIExldmVsYCA9PSAiTWFzdGVyJ3MgRGVncmVlIiB+IDMsIGR0JGBFZHVjYXRpb24gTGV2ZWxgID09ICJQaEQiIH4gMykpDQpIb2N2YW4gPC0gY3V0KEhvY3ZhbiRodiwgYnJlYWtzID0gYygwLDIsNCksIGxhYmVscz1jKCJExrDhu5tpIMSR4bqhaSBo4buNYyIsICJUcsOqbiDEkeG6oWkgaOG7jWMiKSkNCkx1b25nIDwtIGN1dChkdCRTYWxhcnksIGJyZWFrcyA9IGMoMCwxMDAwMDAsMjYwMDAwKSwgbGFiZWxzID0gYygiVGjhuqVwIiwgIkNhbyIpKQ0KdGFibGUoSG9jdmFuLEx1b25nKQ0KcHJvcC50YWJsZSh0YWJsZShIb2N2YW4sTHVvbmcpKQ0KYWRkbWFyZ2lucyh0YWJsZShIb2N2YW4sTHVvbmcpKQ0KZ2dwbG90KGR0LCBhZXMoTHVvbmcsIGZpbGwgPSBIb2N2YW4pKSArICBnZW9tX2Jhcihwb3NpdGlvbiA9ICdkb2RnZScpK3lsYWIoIlPhu5EgbMaw4bujbmciKSt4bGFiKCJN4bupYyBsxrDGoW5nIikNCmBgYA0KDQpU4burIGLhuqNuZyB04bqnbiBz4buRIHbDoCDEkeG7kyB0aOG7iywgdGEgdGjhuqV5OiANCg0KLSBUcm9uZyBz4buRIDI5MjYgbmfGsOG7nWkgbMawxqFuZyB0aOG6pXAgY8OzIDIzODAgbmfGsOG7nWkgdHLDrG5oIMSR4buZIGTGsOG7m2kgxJHhuqFpIGjhu41jIChjaGnhur9tIDM1LDUzJSkgdsOgIDU0NiBuZ8aw4budaSB0csOqbiDEkeG6oWkgaOG7jWMgKGNoaeG6v20gOCwxNSUpLg0KDQotIFRyb25nIHPhu5EgMzc3MiBuZ8aw4budaSBsxrDGoW5nIGNhbyBjw7MgMTA4OSBuZ8aw4budaSBkxrDhu5tpIMSR4bqhaSBo4buNYyAoY2hp4bq/bSAxNiwyNiUpIHbDoCAxMTk0IG5nxrDhu51pIHRyw6puIMSR4bqhaSBo4buNYyAoY2hp4bq/bSA0MCwwNiUpLg0KDQpU4burIMSR4buTIHRo4buLIHRhIHRo4bqleSB0cm9uZyBz4buRIG5o4buvbmcgbmfGsOG7nWkgbMawxqFuZyB0aOG6pXAgdGjDrCB04bu3IGzhu4cgbmfGsOG7nWkgZMaw4bubaSDEkeG6oWkgaOG7jWMgY2FvIGjGoW4gdOG7tyBs4buHIG5nxrDhu51pIHRyw6puIMSR4bqhaSBo4buNYy4gQ8OybiDhu58gbmjhu69uZyBuZ8aw4budaSBsxrDGoW5nIGNhbyB0aMOsIHThu7cgbOG7hyBuZ8aw4budaSB0csOqbiDEkeG6oWkgaOG7jWMgY2FvIGjGoW4uDQoNCioqUuG7p2kgcm8gdMawxqFuZyDEkeG7kWkqKg0KDQpgYGB7cn0NCmVwaXRhYih0YWJsZShIb2N2YW4sTHVvbmcpLG1ldGhvZCA9ICdyaXNrcmF0aW8nLCByZXYgPSAnYycpDQpgYGANCg0KVOG7tyBs4buHIGdp4buvYSBuaOG7r25nIG5nxrDhu51pIHRyw6puIMSR4bqhaSBo4buNYyBjw7MgbMawxqFuZyB0aOG6pXAgc28gduG7m2kgdOG7tyBs4buHIGdp4buvYSBuaOG7r25nIG5nxrDhu51pIGTGsOG7m2kgxJHhuqFpIGjhu41jIGPDsyBsxrDGoW5nIHRo4bqlcCBsw6AgMCwyNS4NCg0KVuG6rXkgcuG7p2kgcm8gdMawxqFuZyDEkeG7kWkgbeG6q3UgbMOgIDAsMjUgY2hvIHRo4bqleSB04bu3IGzhu4cgbMawxqFuZyB0aOG6pXAgxJHhu5FpIHbhu5tpIG5o4buvbmcgbmfGsOG7nWkgdHLDqm4gxJHhuqFpIGjhu41jIHRo4bqlcCBoxqFuIDc1JSBzbyB24bubaSBuaOG7r25nIG5nxrDhu51pIGTGsOG7m2kgxJHhuqFpIGjhu41jLg0KDQpW4bubaSDEkeG7mSB0aW4gY+G6rXkgOTUlLCB0aMOsIHThu7cgbOG7hyBsxrDGoW5nIHRo4bqlcCB0cm9uZyBuaOG7r25nIG5nxrDhu51pIHRyw6puIMSR4bqhaSBo4buNYyDDrXQgaMahbiA3MywzMSUgxJHhur9uIDc3LDI0JSBzbyB24bubaSBuaOG7r25nIG5nxrDhu51pIGTGsOG7m2kgxJHhuqFpIGjhu41jLg0KDQoNCioqVOG7iSBs4buHIGNow6puaCoqDQoNCmBgYHtyfQ0KZXBpdGFiKHRhYmxlKEhvY3ZhbixMdW9uZyksIG1ldGhvZCA9ICdvZGRzcmF0aW8nLCByZXYgPSAnYycpDQpgYGANCg0KVOG7tyBs4buHIGzGsMahbmcgdGjhuqVwIHNvIHbhu5tpIGzGsMahbmcgY2FvIGPhu6dhIG5o4buvbmcgbmfGsOG7nWkgZMaw4bubaSDEkeG6oWkgaOG7jWMgYuG6sW5nIDksMyUgdOG7tyBs4buHIGzGsMahbmcgdGjhuqVwIHNvIHbhu5tpIGzGsMahbmcgY2FvIGPhu6dhIG5o4buvbmcgbmfGsOG7nWkgdHLDqm4gxJHhuqFpIGjhu41jLg0KDQojIyBQaMOibiB0w61jaCAyIGJp4bq/biBsw6AgU2FsYXJ5IHbDoCBZZWFycyBvZiBFeHBlcmllbmNlDQoNClbhu5tpIGThu68gbGnhu4d1IGfhu5FjLCBiaeG6v24ga2luaCBuZ2hp4buHbSBsw6BtIHZp4buHYyAoWWVhcnMgb2YgRXhwZXJpZW5jZSkgbMOgIGJp4bq/biDEkeG7i25oIGzGsOG7o25nIGPDsyBnacOhIHRy4buLIHRyb25nIGtob+G6o25nIDAgLSAzNCwgbsOqbiB0w6FjIGdp4bqjIMSRw6MgxJHhurd0IHF1eSDGsOG7m2MgduG7gSB2aeG7h2MgY2h1eeG7g24gYmnhur9uIFllYXJzIG9mIEV4cGVyaWVuY2UgbmjGsCBzYXU6IMONdCAoMCAtIDEwKSB2w6AgTmhp4buBdSAoMTAgLSAzNSkuDQoNCmBgYGB7cn0NCktpbmhuZ2hpZW0gPC0gY3V0KGR0JGBZZWFycyBvZiBFeHBlcmllbmNlYCwgYnJlYWtzID0gYygtMSwxMCwzNSksIGxhYmVscyA9IGMoIsONdCIsICJOaGnhu4F1IikpDQp0YWJsZShLaW5obmdoaWVtLEx1b25nKQ0KcHJvcC50YWJsZSh0YWJsZShLaW5obmdoaWVtLEx1b25nKSkNCmFkZG1hcmdpbnModGFibGUoS2luaG5naGllbSxMdW9uZykpDQpnZ3Bsb3QoZHQsIGFlcyhMdW9uZywgZmlsbCA9IEtpbmhuZ2hpZW0pKSArICBnZW9tX2Jhcihwb3NpdGlvbiA9ICdkb2RnZScpK3lsYWIoIlPhu5EgbMaw4bujbmciKSt4bGFiKCJN4bupYyBsxrDGoW5nIikNCmBgYA0KDQpU4burIGLhuqNuZyB04bqnbiBz4buRIHbDoCDEkeG7kyB0aOG7iywgdGEgdGjhuqV5OiANCg0KLSBUcm9uZyBz4buRIDI5MjYgbmfGsOG7nWkgbMawxqFuZyB0aOG6pXAgY8OzIDI5MDYgbmfGsOG7nWkgY8OzIMOtdCBraW5oIG5naGnhu4dtIGzDoG0gdmnhu4djIChjaGnhur9tIDQzLDM5JSkgdsOgIDIwIG5nxrDhu51pIG5oaeG7gXUga2luaCBuZ2hp4buHbSBsw6BtIHZp4buHYyAoY2hp4bq/bSAwLDMlKS4NCg0KLSBUcm9uZyBz4buRIDM3NzIgbmfGsOG7nWkgbMawxqFuZyBjYW8gY8OzIDE2ODcgbmfGsOG7nWkgw610IGtpbmggbmdoaeG7h20gbMOgbSB2aeG7h2MgKGNoaeG6v20gMjUsMTklKSB2w6AgMjEwNSBuZ8aw4budaSBuaGnhu4F1IGtpbmggbmdoaeG7h20gbMOgbSB2aeG7h2MgKGNoaeG6v20gMzEsMTMlKS4NCg0KVOG7qyDEkeG7kyB0aOG7iyB0YSB0aOG6pXkgdHJvbmcgc+G7kSBuaOG7r25nIG5nxrDhu51pIGzGsMahbmcgdGjhuqVwIHRow6wgdOG7tyBs4buHIG5nxrDhu51pIMOtdCBraW5oIG5naGnhu4dtIGzDoG0gdmnhu4djIGNhbyBoxqFuIHThu7cgbOG7hyBuZ8aw4budaSBuaGnhu4F1IGtpbmggbmdoaeG7h20gbMOgbSB2aeG7h2MuIEPDsm4g4bufIG5o4buvbmcgbmfGsOG7nWkgbMawxqFuZyBjYW8gdGjDrCB04bu3IGzhu4cgbmfGsOG7nWkgbmhp4buBdSBraW5oIG5naGnhu4dtIGzDoG0gdmnhu4djIGNhbyBoxqFuLg0KDQoqKlLhu6dpIHJvIHTGsMahbmcgxJHhu5FpKioNCg0KYGBge3J9DQplcGl0YWIodGFibGUoS2luaG5naGllbSxMdW9uZyksbWV0aG9kID0gJ3Jpc2tyYXRpbycsIHJldiA9ICdjJykNCmBgYA0KDQpU4bu3IGzhu4cgZ2nhu69hIG5o4buvbmcgbmfGsOG7nWkgbmhp4buBdSBraW5oIG5naGnhu4dtIGzDoG0gdmnhu4djIGPDsyBsxrDGoW5nIHRo4bqlcCBzbyB24bubaSB04bu3IGzhu4cgZ2nhu69hIG5o4buvbmcgbmfGsOG7nWkgw610IGtpbmggbmdoaeG7h20gbMOgbSB2aeG7h2MgY8OzIGzGsMahbmcgdGjhuqVwIGzDoCAwLDAyLg0KDQpW4bqteSBy4bunaSBybyB0xrDGoW5nIMSR4buRaSBt4bqrdSBsw6AgMCwwMiBjaG8gdGjhuqV5IHThu7cgbOG7hyBsxrDGoW5nIHRo4bqlcCBj4bunYSBuaOG7r25nIG5nxrDhu51pIG5oaeG7gXUga2luaCBuZ2hp4buHbSBsw6BtIHZp4buHYyB0aOG6pXAgaMahbiA5OCUgc28gduG7m2kgbmjhu69uZyBuZ8aw4budaSDDrXQga2luaCBuZ2hp4buHbSBsw6BtIHZp4buHYy4NCg0KVuG7m2kgxJHhu5kgdGluIGPhuq15IDk1JSwgdGjDrCB04bu3IGzhu4cgbMawxqFuZyB0aOG6pXAgY+G7p2EgbmfGsOG7nWkgbmhp4buBdSBraW5oIG5naGnhu4dtIGzDoG0gdmnhu4djIMOtdCBoxqFuIDk3LDc3JSDEkeG6v24gOTksMDMlIHNvIHbhu5tpIG5o4buvbmcgbmfGsOG7nWkgw610IGtpbmggbmdoaeG7h20gbMOgbSB2aeG7h2MuDQoNCg0KKipU4buJIGzhu4cgY2jDqm5oKioNCg0KYGBge3J9DQplcGl0YWIodGFibGUoS2luaG5naGllbSxMdW9uZyksIG1ldGhvZCA9ICdvZGRzcmF0aW8nLCByZXYgPSAnYycpDQpgYGANCg0KVOG7tyBs4buHIGzGsMahbmcgdGjhuqVwIHNvIHbhu5tpIGzGsMahbmcgY2FvIGPhu6dhIG5o4buvbmcgbmfGsOG7nWkgw610IGtpbmggbmdoaeG7h20gbMOgbSB2aeG7h2MgYuG6sW5nIDAsNTYlIHThu7cgbOG7hyBsxrDGoW5nIHRo4bqlcCBzbyB24bubaSBsxrDGoW5nIGNhbyBj4bunYSBuaOG7r25nIG5oaeG7gXUga2luaCBuZ2hp4buHbSBsw6BtIHZp4buHYy4NCg0KIyMgVGjhu5FuZyBrw6ogc3V5IGRp4buFbiBjaG8gZOG7ryBsaeG7h3UgxJHhu4tuaCB0w61uaA0KDQojIyMgS2nhu4NtIMSR4buLbmggdMOtbmggxJHhu5ljIGzhuq1wIGNobyBoYWkgYmnhur9uIMSR4buLbmggdMOtbmgNCg0KKipLaeG7g20gxJHhu4tuaCB0w61uaCDEkeG7mWMgbOG6rXAgY2hvIGhhaSBiaeG6v24gQ29uZ3ZpZWMgdsOgIEdpb2l0aW5oKioNCg0KR2nhuqMgdGh1eeG6v3QvxJDhu5FpIHRodXnhur90Og0KDQotICRIXzAkOiBCaeG6v24gQ29uZ3ZpZWMgdsOgIGJp4bq/biBHaW9pdGluaCDEkeG7mWMgbOG6rXANCg0KLSAkSF8xJDogQmnhur9uIENvbmd2aWVjIHbDoCBiaeG6v24gR2lvaXRpbmgga2jDtG5nIMSR4buZYyBs4bqtcA0KDQpYw6l0IHRo4buRbmcga8OqOg0KDQpgYGB7cn0NCmNoaXNxLnRlc3QodGFibGUoQ29uZ3ZpZWMsR2lvaXRpbmgpKQ0KYGBgDQoNClRhIGPDsyBwLXZhbHVlID0gMywwNjhlLTA3IDwgMCwwNSBuw6puIGLDoWMgYuG7jyBnaeG6oyB0aHV54bq/dCAkSF8wJC4NCg0KVuG6rXkgduG7m2kgbeG7qWMgw70gbmdoxKlhIDUlLCBiaeG6v24gQ29uZ3ZpZWMgdsOgIGJp4bq/biBHaW9pdGluaCBraMO0bmcgxJHhu5ljIGzhuq1wIHbhu5tpIG5oYXUuDQoNCioqS2nhu4NtIMSR4buLbmggdMOtbmggxJHhu5ljIGzhuq1wIGNobyBoYWkgYmnhur9uIENvbmd2aWVjIHbDoCBLaW5obmdoaWVtKioNCg0KR2nhuqMgdGh1eeG6v3QvxJDhu5FpIHRodXnhur90Og0KDQotICRIXzAkOiBCaeG6v24gQ29uZ3ZpZWMgdsOgIGJp4bq/biBLaW5obmdoaWVtIMSR4buZYyBs4bqtcA0KDQotICRIXzEkOiBCaeG6v24gQ29uZ3ZpZWMgdsOgIGJp4bq/biBLaW5obmdoaWVtIGtow7RuZyDEkeG7mWMgbOG6rXANCg0KWMOpdCB0aOG7kW5nIGvDqjoNCg0KYGBge3J9DQpjaGlzcS50ZXN0KHRhYmxlKENvbmd2aWVjLEtpbmhuZ2hpZW0pKQ0KYGBgDQoNClRhIGPDsyBwLXZhbHVlID0gMiwyZS0xNiA8IDAsMDUgbsOqbiBiw6FjIGLhu48gZ2nhuqMgdGh1eeG6v3QgJEhfMCQuDQoNClbhuq15IHbhu5tpIG3hu6ljIMO9IG5naMSpYSA1JSwgYmnhur9uIENvbmd2aWVjIHbDoCBiaeG6v24gS2luaG5naGllbSBraMO0bmcgxJHhu5ljIGzhuq1wIHbhu5tpIG5oYXUuDQoNCioqS2nhu4NtIMSR4buLbmggdMOtbmggxJHhu5ljIGzhuq1wIGNobyBoYWkgYmnhur9uIEx1b25nIHbDoCBUdW9pKioNCg0KR2nhuqMgdGh1eeG6v3QvxJDhu5FpIHRodXnhur90Og0KDQotICRIXzAkOiBCaeG6v24gTHVvbmcgdsOgIGJp4bq/biBUdW9pIMSR4buZYyBs4bqtcA0KDQotICRIXzEkOiBCaeG6v24gTHVvbmcgdsOgIGJp4bq/biBUdW9pIGtow7RuZyDEkeG7mWMgbOG6rXANCg0KWMOpdCB0aOG7kW5nIGvDqjoNCg0KYGBge3J9DQpjaGlzcS50ZXN0KHRhYmxlKEx1b25nLFR1b2kpKQ0KYGBgDQoNClRhIGPDsyBwLXZhbHVlID0gMiwyZS0xNiA8IDAsMDUgbsOqbiBiw6FjIGLhu48gZ2nhuqMgdGh1eeG6v3QgJEhfMCQuDQoNClbhuq15IHbhu5tpIG3hu6ljIMO9IG5naMSpYSA1JSwgYmnhur9uIEx1b25nIHbDoCBiaeG6v24gVHVvaSBraMO0bmcgxJHhu5ljIGzhuq1wIHbhu5tpIG5oYXUuDQoNCioqS2nhu4NtIMSR4buLbmggdMOtbmggxJHhu5ljIGzhuq1wIGNobyBoYWkgYmnhur9uIEx1b25nIHbDoCBIb2N2YW4qKg0KDQpHaeG6oyB0aHV54bq/dC/EkOG7kWkgdGh1eeG6v3Q6DQoNCi0gJEhfMCQ6IEJp4bq/biBMdW9uZyB2w6AgYmnhur9uIEhvY3ZhbiDEkeG7mWMgbOG6rXANCg0KLSAkSF8xJDogQmnhur9uIEx1b25nIHbDoCBiaeG6v24gSG9jdmFuIGtow7RuZyDEkeG7mWMgbOG6rXANCg0KWMOpdCB0aOG7kW5nIGvDqjoNCg0KYGBge3J9DQpjaGlzcS50ZXN0KHRhYmxlKEx1b25nLEhvY3ZhbikpDQpgYGANCg0KVGEgY8OzIHAtdmFsdWUgPSAyLDJlLTE2IDwgMCwwNSBuw6puIGLDoWMgYuG7jyBnaeG6oyB0aHV54bq/dCAkSF8wJC4NCg0KVuG6rXkgduG7m2kgbeG7qWMgw70gbmdoxKlhIDUlLCBiaeG6v24gTHVvbmcgdsOgIGJp4bq/biBIb2N2YW4ga2jDtG5nIMSR4buZYyBs4bqtcCB24bubaSBuaGF1Lg0KDQojIyMgS2hv4bqjbmcgxrDhu5tjIGzGsOG7o25nIGNobyB04bu3IGzhu4cNCg0KKirGr+G7m2MgbMaw4bujbmcgdOG7tyBs4buHIG5nxrDhu51pIGPDsyBsxrDGoW5nIGNhbyoqDQoNCmBgYHtyfQ0KYSA8LSBkdFtkdCRTYWxhcnkgPT0gMTAwMDAwIHwgZHQkU2FsYXJ5ID4gMTAwMDAwLF0NCnByb3AudGVzdChsZW5ndGgoYSRTYWxhcnkgPT0gMTAwMDAwIHwgYSRTYWxhcnkgPiAxMDAwMDApLCBsZW5ndGgoZHQkU2FsYXJ5KSkNCmBgYA0KDQpW4bubaSDEkeG7mSB0aW4gY+G6rXkgOTUlLCDGsOG7m2MgbMaw4bujbmcgdOG7tyBs4buHIG5nxrDhu51pIGPDsyBsxrDGoW5nIGNhbyBu4bqxbSB0cm9uZyBraG/huqNuZyB04burIDU3LDglIMSR4bq/biA2MCwxNyUuDQoNCioqxq/hu5tjIGzGsOG7o25nIHPhu7EgY2jDqm5oIGzhu4djaCB24buBIHThu7cgbOG7hyBuZ8aw4budaSBjw7Mgw610IGtpbmggbmdoaeG7h20gbMOgbSB2aeG7h2MgZ2nhu69hIG5hbSB2w6AgbuG7ry4gxJDhu5NuZyB0aOG7nWkgdGjhu7FjIGhp4buHbiBiw6BpIHRvw6FuIGtp4buDbSDEkeG7i25oIHPhu7EgY2jDqm5oIGzhu4djaCBuw6B5KioNCg0KYGBge3J9DQpndG0gPC0gZHRbZHQkR2VuZGVyID09ICJNYWxlIixdDQpndGYgPC0gZHRbZHQkR2VuZGVyID09ICJGZW1hbGUiLF0NCg0KZ3RtMSA8LSBndG1bZ3RtJGBZZWFycyBvZiBFeHBlcmllbmNlYCA8IDEwLF0NCmd0ZjEgPC0gZ3RmW2d0ZiRgWWVhcnMgb2YgRXhwZXJpZW5jZWAgPCAxMCxdDQoNCnggPC0gYyhucm93KGd0bSksIG5yb3coZ3RmKSkNCnogPC0gYyhucm93KGd0bTEpLCBucm93KGd0ZjEpKQ0KDQpwcm9wLnRlc3Qoeix4KQ0KYGBgDQoNClRhIGPDsyBwLXZhbHVlID4gMCBuw6puIGLDoWMgYuG7jyBnaeG6oyB0aHV54bq/dCAkSF8wJCwgZG8gxJHDsyBraMO0bmcgY8OzIHPhu7EgY2jDqm5oIGzhu4djaCB24buBIHThu7cgbOG7hyBuZ8aw4budaSBjw7Mgw610IGtpbmggbmdoaeG7h20gbMOgbSB2aeG7h2MgZ2nhu69hIG5hbSB2w6AgbuG7ry4NCg0KS2hv4bqjbmcgdGluIGPhuq15IDk1JSBjaG8gY2jDqm5oIGzhu4djaCB04bu3IGzhu4cgbuG6sW0gdHJvbmcga2hv4bqjbmcgdOG7qyAtMCwwOTY1MzExIMSR4bq/biAtMCwwNTA2MDYzNy4NCg0KIyMgTWEgdHLhuq1uIGjhu4cgc+G7kSBUxrDGoW5nIHF1YW4NCg0KYGBge3J9DQpjb250aW51b3VzX3ZhcnMgPC0gZHRbLCBzYXBwbHkoZHQsIGlzLm51bWVyaWMpXQ0KY29yX21hdHJpeCA8LSBjb3IoY29udGludW91c192YXJzKQ0KY29yX21hdHJpeA0KYGBgDQoNClThu6sgbWEgdHLhuq1uIGjhu4cgc+G7kSB0xrDGoW5nIHF1YW4sIHRhIHRo4bqleSBjw7MgbeG7kWkgdMawxqFuZyBxdWFuIG3huqFuaCBnaeG7r2Egbmjhu69uZyBj4bq3cCBiaeG6v24gQWdlIHbDoCBZZWFycyBvZiBFeHBlcmllbmNlLCBBZ2UgdsOgIFNhbGFyeSwgWWVhcnMgb2YgRXhwZXJpZW5jZSB2w6AgU2FsYXJ5Lg0KDQojIyBNw7QgaMOsbmggaOG7k2kgcXV5DQoNCiMjIyBNw7QgaMOsbmggbG9naXQNCg0KIyMjIyBNw7QgaMOsbmggMQ0KDQpgYGB7cn0NCk1IMSA8LSBnbG0oZmFjdG9yKGR0JGBKb2IgVGl0bGVgKX5kdCRHZW5kZXIrZHQkQWdlK2R0JENvdW50cnkrZHQkUmFjZStkdCRgRWR1Y2F0aW9uIExldmVsYCtkdCRgWWVhcnMgb2YgRXhwZXJpZW5jZWArZHQkU2FsYXJ5LCBmYW1pbHkgPSBiaW5vbWlhbChsaW5rID0gImxvZ2l0IiksIGRhdGEgPSBkdCkNCnN1bW1hcnkoTUgxKQ0KYGBgDQoNCioqS2nhu4NtIMSR4buLbmggc+G7sSBwaMO5IGjhu6NwIGPhu6dhIG3DtCBow6xuaCoqDQoNCkdp4bqjIHRodXnhur90L8SQ4buRaSB0aHV54bq/dDoNCg0KLSAkSF8wJDogTcO0IGjDrG5oIGtow7RuZyBwaMO5IGjhu6NwDQoNCi0gJEhfMSQ6IE3DtCBow6xuaCBwaMO5IGjhu6NwDQoNCmBgYHtyfQ0KbHJfdGVzdCA8LSBhbm92YShNSDEsIHRlc3QgPSAiQ2hpc3EiKQ0KcF92YWx1ZSA8LSBscl90ZXN0JFByWzJdDQpwX3ZhbHVlDQpgYGANCg0KVGEgY8OzIHAtdmFsdWUgPSAwLDI2NjY0NjUgPiAwLDA1IG7Dqm4gY2jGsGEgxJHhu6cgY8ahIHPhu58gYsOhYyBi4buPIGdp4bqjIHRodXnhur90ICRIXzAkLiBWw6wgduG6rXkgbcO0IGjDrG5oIGtow7RuZyBwaMO5IGjhu6NwIHbhu5tpIGThu68gbGnhu4d1Lg0KDQojIyMjIE3DtCBow6xuaCAyDQoNClThu6sgbcO0IGjDrG5oIDEgdGEgdGjhuqV5IGNo4buJIGPDsyBjw6FjIGJp4bq/biBBZ2UsIEVkdWNhdGlvbiBMZXZlbCwgWWVhcnMgb2YgRXhwZXJpZW5jZSB2w6AgU2FsYXJ5IGPDsyDDvSBuZ2jEqWEgdGjhu5FuZyBrw6ogbsOqbiBz4butIGThu6VuZyDEkeG7gyBjaOG6oXkgbcO0IGjDrG5oIDIuDQoNCmBgYHtyfQ0KTUgyIDwtIGdsbShmYWN0b3IoZHQkYEpvYiBUaXRsZWApfmR0JEFnZStkdCRgRWR1Y2F0aW9uIExldmVsYCtkdCRgWWVhcnMgb2YgRXhwZXJpZW5jZWArZHQkU2FsYXJ5LCBmYW1pbHkgPSBiaW5vbWlhbChsaW5rID0gImxvZ2l0IiksIGRhdGEgPSBkdCkNCnN1bW1hcnkoTUgyKQ0KYGBgDQoNCioqS2nhu4NtIMSR4buLbmggc+G7sSBwaMO5IGjhu6NwIGPhu6dhIG3DtCBow6xuaCoqDQoNCkdp4bqjIHRodXnhur90L8SQ4buRaSB0aHV54bq/dDoNCg0KLSAkSF8wJDogTcO0IGjDrG5oIGtow7RuZyBwaMO5IGjhu6NwDQoNCi0gJEhfMSQ6IE3DtCBow6xuaCBwaMO5IGjhu6NwDQoNCmBgYHtyfQ0KbHJfdGVzdCA8LSBhbm92YShNSDIsIHRlc3QgPSAiQ2hpc3EiKQ0KcF92YWx1ZSA8LSBscl90ZXN0JFByWzJdDQpwX3ZhbHVlDQpgYGANCg0KVGEgY8OzIHAtdmFsdWUgPSAxLDcyNTA0OWUtMDcgPCAwLDA1IG7Dqm4gYsOhYyBi4buPIGdp4bqjIHRodXnhur90ICRIXzAkLiBWw6wgduG6rXkgbcO0IGjDrG5oIHBow7kgaOG7o3AgduG7m2kgZOG7ryBsaeG7h3UuDQoNCioqQnJpZXJTY29yZSoqDQoNCmBgYHtyfQ0KQnJpZXJTY29yZShNSDIpDQpgYGANCg0KKipNYSB0cuG6rW4gbmjhuqdtIGzhuqtuKioNCg0KYGBge3J9DQpoIDwtIHByZWRpY3QoTUgyLCB0eXBlID0gInJlc3BvbnNlIikNCmogPC0gaWZlbHNlKGggPiAwLjUsICIxIiwgIjAiKQ0KayA8LSBmYWN0b3IoaiwgbGV2ZWxzID0gYygiMCIsIjEiKSkNCmwgPC0gZmFjdG9yKENvbmd2aWVjLCBsYWJlbHMgPSBjKCIwIiwiMSIpKQ0KY29uZnVzaW9uTWF0cml4KHRhYmxlKGssbCkpDQpgYGANCg0KTUgyIGPDsyDEkeG7mSBjaMOtbmggeMOhYyB0b8OgbiB0aOG7gyBsw6AgNjIsODclLCDEkeG7mSBuaOG6oXkgbMOgIDEsMTUlIHbDoCDEkeG7mSBoaeG7h3UgcXXhuqMgbMOgIDk5LDg4JS4NCg0KIyMjIE3DtCBow6xuaCBo4buTaSBxdXkgcHJvYml0DQoNCmBgYHtyfQ0KTUgzIDwtIGdsbShmYWN0b3IoZHQkYEpvYiBUaXRsZWApfmR0JEFnZStkdCRgRWR1Y2F0aW9uIExldmVsYCtkdCRgWWVhcnMgb2YgRXhwZXJpZW5jZWArZHQkU2FsYXJ5LCBmYW1pbHkgPSBiaW5vbWlhbChsaW5rID0gInByb2JpdCIpLCBkYXRhID0gZHQpDQpzdW1tYXJ5KE1IMykNCmBgYA0KDQoqKktp4buDbSDEkeG7i25oIHPhu7EgcGjDuSBo4bujcCBj4bunYSBtw7QgaMOsbmgqKg0KDQpHaeG6oyB0aHV54bq/dC/EkOG7kWkgdGh1eeG6v3Q6DQoNCi0gJEhfMCQ6IE3DtCBow6xuaCBraMO0bmcgcGjDuSBo4bujcA0KDQotICRIXzEkOiBNw7QgaMOsbmggcGjDuSBo4bujcA0KDQpgYGB7cn0NCmxyX3Rlc3QgPC0gYW5vdmEoTUgzLCB0ZXN0ID0gIkNoaXNxIikNCnBfdmFsdWUgPC0gbHJfdGVzdCRQclsyXQ0KcF92YWx1ZQ0KYGBgDQoNClRhIGPDsyBwLXZhbHVlID0gMSwxOTcyNzZlLTA3IDwgMCwwNSBuw6puIGLDoWMgYuG7jyBnaeG6oyB0aHV54bq/dCAkSF8wJC4gVsOsIHbhuq15IG3DtCBow6xuaCBwaMO5IGjhu6NwIHbhu5tpIGThu68gbGnhu4d1Lg0KDQoqKkJyaWVyU2NvcmUqKg0KDQpgYGB7cn0NCkJyaWVyU2NvcmUoTUgzKQ0KYGBgDQoNCioqTWEgdHLhuq1uIG5o4bqnbSBs4bqrbioqDQoNCmBgYHtyfQ0KaCA8LSBwcmVkaWN0KE1IMywgdHlwZSA9ICJyZXNwb25zZSIpDQpqIDwtIGlmZWxzZShoID4gMC41LCAiMSIsICIwIikNCmsgPC0gZmFjdG9yKGosIGxldmVscyA9IGMoIjAiLCIxIikpDQpsIDwtIGZhY3RvcihDb25ndmllYywgbGFiZWxzID0gYygiMCIsIjEiKSkNCmNvbmZ1c2lvbk1hdHJpeCh0YWJsZShrLGwpKQ0KYGBgDQoNCk1IMyBjw7MgxJHhu5kgY2jDrW5oIHjDoWMgdG/DoG4gdGjhu4MgbMOgIDYyLDcyJSwgxJHhu5kgbmjhuqF5IGzDoCAwLDc2JSB2w6AgxJHhu5kgaGnhu4d1IHF14bqjIGzDoCA5OSw4OCUuDQoNCiMjIyBNw7QgaMOsbmggaOG7k2kgcXV5IGNsb2dsb2cNCg0KYGBge3J9DQpNSDQgPC0gZ2xtKGZhY3RvcihkdCRgSm9iIFRpdGxlYCl+ZHQkQWdlK2R0JGBFZHVjYXRpb24gTGV2ZWxgK2R0JGBZZWFycyBvZiBFeHBlcmllbmNlYCtkdCRTYWxhcnksIGZhbWlseSA9IGJpbm9taWFsKGxpbmsgPSAiY2xvZ2xvZyIpLCBkYXRhID0gZHQpDQpzdW1tYXJ5KE1INCkNCmBgYA0KDQoqKktp4buDbSDEkeG7i25oIHPhu7EgcGjDuSBo4bujcCBj4bunYSBtw7QgaMOsbmgqKg0KDQpHaeG6oyB0aHV54bq/dC/EkOG7kWkgdGh1eeG6v3Q6DQoNCi0gJEhfMCQ6IE3DtCBow6xuaCBraMO0bmcgcGjDuSBo4bujcA0KDQotICRIXzEkOiBNw7QgaMOsbmggcGjDuSBo4bujcA0KDQpgYGB7cn0NCmxyX3Rlc3QgPC0gYW5vdmEoTUg0LCB0ZXN0ID0gIkNoaXNxIikNCnBfdmFsdWUgPC0gbHJfdGVzdCRQclsyXQ0KcF92YWx1ZQ0KYGBgDQoNClRhIGPDsyBwLXZhbHVlID0gOCw4MTkxMzJlLTA4IDwgMCwwNSBuw6puIGLDoWMgYuG7jyBnaeG6oyB0aHV54bq/dCAkSF8wJC4gVsOsIHbhuq15IG3DtCBow6xuaCBwaMO5IGjhu6NwIHbhu5tpIGThu68gbGnhu4d1Lg0KDQoqKkJyaWVyU2NvcmUqKg0KDQpgYGB7cn0NCkJyaWVyU2NvcmUoTUg0KQ0KYGBgDQoNCioqTWEgdHLhuq1uIG5o4bqnbSBs4bqrbioqDQoNCmBgYHtyfQ0KaCA8LSBwcmVkaWN0KE1INCwgdHlwZSA9ICJyZXNwb25zZSIpDQpqIDwtIGlmZWxzZShoID4gMC41LCAiMSIsICIwIikNCmsgPC0gZmFjdG9yKGosIGxldmVscyA9IGMoIjAiLCIxIikpDQpsIDwtIGZhY3RvcihDb25ndmllYywgbGFiZWxzID0gYygiMCIsIjEiKSkNCmNvbmZ1c2lvbk1hdHJpeCh0YWJsZShrLGwpKQ0KYGBgDQoNCk1INCBjw7MgxJHhu5kgY2jDrW5oIHjDoWMgdG/DoG4gdGjhu4MgbMOgIDYyLDY4JSwgxJHhu5kgbmjhuqF5IGzDoCAwLDYlIHbDoCDEkeG7mSBoaeG7h3UgcXXhuqMgbMOgIDk5LDklLg0KDQojIyMgTOG7sWEgY2jhu41uIG3DtCBow6xuaCBwaMO5IGjhu6NwDQoNCmBgYHtyfQ0KTcO0aMOsbmggPC0gYygiTG9naXQiLCJQcm9iaXQiLCJDbG9nbG9nIiwiTOG7sWEgY2jhu41uIikNCkFJQyA8LSBjKDE5MTEuMywxOTI2LDE5NDYuOSwiTG9naXQiKQ0KRGV2aWFuY2UgPC0gYygxODk3LjAsMTkxMi4wLDE5MzIuOSwiTG9naXQiKQ0KQnJpZXJTY29yZSA8LSBjKDAuMDM5NzU2NjYsMC4wNDAxMzczOSwwLjA0MDc3Mjg0LCJMb2dpdCIpDQpDb25mdXNpb25NYXRyaXggPC0gYygwLjYyODcsMC42MjcyLDAuNjI2OCwiTG9naXQiKQ0KYmFuZyA8LSBkYXRhLmZyYW1lKE3DtGjDrG5oLEFJQyxEZXZpYW5jZSxCcmllclNjb3JlLENvbmZ1c2lvbk1hdHJpeCkNCmJhbmcNCmBgYA0KDQpE4buxYSB2w6BvIGLhuqNuZyBr4bq/dCBxdeG6oyBj4bunYSAzIG3DtCBow6xuaCwgdGjDtG5nIHF1YSBjw6FjIGNo4buJIHPhu5EgQUlDLCBEZXZpYW5jZSwgQnJpZXJTY29yZSB2w6AgQ29uZnVzaW9uTWF0cml4IMSR4buBdSBjaOG7iSByYSBtw7QgaMOsbmggbG9naXQgbMOgIHThu5F0IG5o4bqldC4gRG8gxJHDsywgbcO0IGjDrG5oIGxvZ2l0IMSRxrDhu6NjIGzhu7FhIGNo4buNbiDEkeG7gyBwaMOibiB0w61jaCBjw6FjIHnhur91IHThu5EgdMOhYyDEkeG7mW5nIGNo4bupYyB24bulIGPDtG5nIHZp4buHYyBj4bunYSBuZ8aw4budaSDEkcaw4bujYyBraOG6o28gc8OhdC4NCg0KIyMgS+G6v3QgcXXhuqMgY+G7p2EgbcO0IGjDrG5oIGxvZ2l0DQoNCmBgYHtyfQ0Kc3VtbWFyeShNSDIpDQpgYGANCg0KIyMjIEdp4bqjaSB0aMOtY2gga+G6v3QgcXXhuqMNCg0KS+G6v3QgcXXhuqMgcGjDom4gdMOtY2ggaOG7k2kgcXV5IExvZ2l0IGNobyB0aOG6pXkgY8OzIDQgYmnhur9uIMSR4buZYyBs4bqtcCBjw7Mgw70gbmdoxKlhIHRo4buRbmcga8OqIGJhbyBn4buTbToNCg0KLSBBZ2U6IMSQ4buZIHR14buVaSBj4bunYSBuZ8aw4budaSBraOG6o28gc8OhdC4NCg0KLSBFZHVjYXRpb24gTGV2ZWw6IFRyw6xuaCDEkeG7mSBo4buNYyB24bqlbi4NCg0KLSBZZWFycyBvZiBFeHBlcmllbmNlOiBLaW5oIG5naGnhu4dtIGzDoG0gdmnhu4djLg0KDQotIFNhbGFyeTogTeG7qWMgbMawxqFuZyBuaOG6rW4gxJHGsOG7o2MuDQoNClbhu5tpIGdp4bqjIHRodXnhur90IGPDoWMgeeG6v3UgdOG7kSBraMOhYyBraMO0bmcgxJHhu5VpLCB0w6FjIMSR4buZbmcgY+G7p2EgdOG7q25nIGJp4bq/biDEkcaw4bujYyBkaeG7hW4gZ2nhuqNpIG5oxrAgc2F1Og0KDQotIOG7niBt4bupYyDDvSBuZ2jEqWEgMSUsIMSR4buZIHR14buVaSBjw7MgdMOhYyDEkeG7mW5nIHRpw6p1IGPhu7FjIMSR4bq/biBxdXnhur90IMSR4buLbmggY2jhu6ljIHbhu6UgY8O0bmcgdmnhu4djLg0KDQotIOG7niBt4bupYyDDvSBuZ2jEqWEgMSUsIHRyw6xuaCDEkeG7mSBo4buNYyB24bqlbiBjw7MgdMOhYyDEkeG7mW5nIHTDrWNoIGPhu7FjIMSR4bq/biBjaOG7qWMgduG7pSBjw7RuZyB2aeG7h2MuDQoNCi0g4bueIG3hu6ljIMO9IG5naMSpYSAxJSwga2luaCBuZ2hp4buHbSBsw6BtIHZp4buHYyBjw7MgdMOhYyDEkeG7mW5nIHRpw6p1IGPhu7FjIMSR4bq/biBjaOG7qWMgduG7pSBjw7RuZyB2aeG7h2MuDQoNCi0g4bueIG3hu6ljIMO9IG5naMSpYSAxJSwgbeG7qWMgbMawxqFuZyBjw7MgdMOhYyDEkeG7mW5nIHTDrWNoIGPhu7FjIMSR4bq/biBjaOG7qWMgduG7pSBjw7RuZyB2aeG7h2MuDQoNCiMjIyBLaG/huqNuZyDGsOG7m2MgbMaw4bujbmcgY2hvIGjhu4cgc+G7kSBo4buTaSBxdXkNCg0KYGBge3J9DQpjb25maW50LmRlZmF1bHQoTUgyKQ0KYGBgDQoNCiMjIyBE4buxIGLDoW8NCg0KYGBge3J9DQpwciA8LSBwcmVkaWN0KE1IMix0eXBlID0gInJlc3BvbnNlIikNCmhlYWQocm91bmQocHIsNCksMTApDQpgYGANCg0KIyBCw6BpIHbhu4EgbmjDoCB0deG6p24gMw0KDQpMw6BtIHRo4buRbmcga8OqIG3DtCB04bqjIGNobyDDrXQgbmjhuqV0IDcgYmnhur9uICh24burYSDEkeG7i25oIHTDrW5oIMSR4buLbmggbMaw4bujbmcgdsOgIGPDsyAyIGJp4bq/biDEkcOjIGNo4buNbiDhu58gY8OidSAyKSBuaOG6rW4geMOpdCB24buBIGvhur90IHF14bqjIHBow6JuIHTDrWNoIG7DoHkuDQoNCiMjIEJp4bq/biBHZW5kZXINCg0KYGBge3J9DQp0YWJsZShkdCRHZW5kZXIpDQp0YWJsZShkdCRHZW5kZXIpL3N1bSh0YWJsZShkdCRHZW5kZXIpKQ0KZ2dwbG90KGR0LGFlcyhHZW5kZXIpKStnZW9tX2Jhcihjb2xvciA9ICJyZWQiLGZpbGwgPSAicGluayIpKyBnZW9tX3RleHQoYWVzKGxhYmVsID0gc2NhbGVzOjpwZXJjZW50KGFmdGVyX3N0YXQoY291bnQvc3VtKGNvdW50KSkpKSwgc3RhdCA9ICdjb3VudCcsIHZqdXN0ID0gLSAuNSkreGxhYigiR2nhu5tpIHTDrW5oIGPhu6dhIG5nxrDhu51pIMSRxrDhu6NjIGto4bqjbyBzw6F0IikreWxhYigiU+G7kSBsxrDhu6NuZyIpK3RoZW1lX2NsYXNzaWMoKQ0KYGBgDQoNCkJp4bq/biBHZW5kZXIgbMOgIGJp4bq/biDEkeG7i25oIHTDrW5oLCB0aGVvIHRo4buRbmcga8OqIGdoaSBuaOG6rW4gxJHGsOG7o2M6DQoNCi0gQ8OzIDMwMTggbmfGsOG7nWkgbMOgIG7hu68gKGNoaeG6v20gNDUsMDYlKS4NCg0KLSBDw7MgMzY4MCBuZ8aw4budaSBsw6AgbmFtIChjaGnhur9tIDU0LDk0JSkuIA0KDQpU4burIMSR4buTIHRo4buLIHRo4bqleSDEkcaw4bujYyBraOG6o28gc8OhdCBraMO0bmcgY8OzIHPhu7EgY2jDqm5oIGzhu4djaCDEkcOhbmcga+G7gyB24buBIGdp4bubaSB0w61uaCwgdOG7tyBs4buHIGdp4bubaSB0w61uaCBuYW0gY2jhu4kgY2FvIGjGoW4ga2hv4bqjbmcgMTAlIHNvIHbhu5tpIGdp4bubaSB0w61uaCBu4buvLg0KDQojIyBCaeG6v24gQ291bnRyeQ0KDQpgYGB7cn0NCnRhYmxlKGR0JENvdW50cnkpDQp0YWJsZShkdCRDb3VudHJ5KS9zdW0odGFibGUoZHQkQ291bnRyeSkpDQpnZ3Bsb3QoZHQsYWVzKENvdW50cnkpKStnZW9tX2Jhcihjb2xvciA9ICJyZWQiLGZpbGwgPSAicGluayIpKyBnZW9tX3RleHQoYWVzKGxhYmVsID0gc2NhbGVzOjpwZXJjZW50KGFmdGVyX3N0YXQoY291bnQvc3VtKGNvdW50KSkpKSwgc3RhdCA9ICdjb3VudCcsIHZqdXN0ID0gLSAuNSkreGxhYigiUXXhu5FjIGdpYSBj4bunYSBuZ8aw4budaSDEkcaw4bujYyBraOG6o28gc8OhdCIpK3lsYWIoIlPhu5EgbMaw4bujbmciKSt0aGVtZV9jbGFzc2ljKCkNCmBgYA0KDQpCaeG6v24gQ291bnRyeSBsw6AgYmnhur9uIMSR4buLbmggdMOtbmgsIHRoZW8ga+G6v3QgcXXhuqMgdGh1IHRo4bqtcCDEkcaw4bujYyBjw7M6DQoNCi0gMTMzNiBuZ8aw4budaSDhu58gw5pjLCBjaGnhur9tIDE5LDk1JS4NCg0KLSAxMzI1IG5nxrDhu51pIOG7nyBDYW5hZGEsIGNoaeG6v20gMTksNzglLg0KDQotIDEzNDMgbmfGsOG7nWkg4bufIFRydW5nIFF14buRYywgY2hp4bq/bSAyMCwwNSUNCg0KLSAxMzM1IG5nxrDhu51pIOG7nyBWxrDGoW5nIFF14buRYyBBbmgsIGNoaeG6v20gMTksOTMlLg0KDQotIDEzNTkgbmfGsOG7nWkg4bufIEhvYSBL4buzLCBjaGnhur9tIDIwLDI5JS4NCg0KVOG7qyDEkeG7kyB0aOG7iyB0aOG6pXkgxJHGsOG7o2Mga2jDtG5nIGPDsyBz4buxIGNow6puaCBs4buHY2ggxJHDoW5nIGvhu4MgduG7gSB04bu3IGzhu4cgcXXhu5FjIGdpYSBnaeG7r2Egbmjhu69uZyBuZ8aw4budaSDEkcaw4bujYyBraOG6o28gc8OhdC4NCg0KIyMgQmnhur9uIFJhY2UNCg0KYGBge3J9DQp0YWJsZShkdCRSYWNlKQ0KdGFibGUoZHQkUmFjZSkvc3VtKHRhYmxlKGR0JFJhY2UpKQ0KcGllKHRhYmxlKGR0JFJhY2UpLCBjb2wgPSByYWluYm93KDEwKSwgbWFpbiA9ICJCaeG7g3UgxJHhu5MgdHLDsm4gduG7gSBjaOG7p25nIHThu5ljIikNCmBgYA0KDQpCaeG6v24gUmFjZSBsw6AgYmnhur9uIMSR4buLbmggdMOtbmgsIHRoZW8ga+G6v3QgcXXhuqMgdGh1IHRo4bqtcCDEkcaw4bujYyBjw7M6DQoNCi0gMzU0IG5nxrDhu51pIE3hu7kgZ+G7kWMgUGhpLCBjaGnhur9tIDUsMjklLg0KDQotIDE2MDMgbmfGsOG7nWkgQ2jDonUgw4EsIGNoaeG6v20gMjMsOTMlLg0KDQotIDQ1MiBuZ8aw4budaSDDmmMsIGNoaeG6v20gNiw3NSUNCg0KLSA0MzcgbmfGsOG7nWkgZGEgxJFlbiwgY2hp4bq/bSA2LDUyJS4NCg0KLSA0NDQgbmfGsOG7nWkgVHJ1bmcgUXXhu5FjLCBjaGnhur9tIDYsNjMlLg0KDQotIDMyMiBuZ8aw4budaSBUw6J5IEJhbiBOaGEsIGNoaeG6v20gNCw4MSUuDQoNCi0gNDU3IG5nxrDhu51pIEjDoG4gUXXhu5FjLCBjaGnhur9tIDYsODIlLg0KDQotIDMzNCBuZ8aw4budaSBjaOG7p25nIHThu5ljIGjhu5duIGjhu6NwLCBjaGnhur9tIDQsOTklLg0KDQotIDMzMyBuZ8aw4budaSBY4bupIFdhbGVzLCBjaGnhur9tIDQsOTclLg0KDQotIDE5NjIgbmfGsOG7nWkgZGEgdHLhuq9uZywgY2hp4bq/bSAyOSwyOSUNCg0KVOG7qyDEkeG7kyB0aOG7iyB0aOG6pXkgxJHGsOG7o2MgdOG7tyBs4buHIG5nxrDhu51pIGRhIHRy4bqvbmcgbMOgIGNhbyBuaOG6pXQgduG7m2kgMjksMjklLg0KDQojIyBCaeG6v24gRWR1Y2F0aW9uIExldmVsDQoNCmBgYHtyfQ0KdGFibGUoZHQkYEVkdWNhdGlvbiBMZXZlbGApDQp0YWJsZShkdCRgRWR1Y2F0aW9uIExldmVsYCkvc3VtKHRhYmxlKGR0JGBFZHVjYXRpb24gTGV2ZWxgKSkNCmdncGxvdChkdCxhZXMoYEVkdWNhdGlvbiBMZXZlbGApKStnZW9tX2Jhcihjb2xvciA9ICJyZWQiLGZpbGwgPSAicGluayIpKyBnZW9tX3RleHQoYWVzKGxhYmVsID0gc2NhbGVzOjpwZXJjZW50KGFmdGVyX3N0YXQoY291bnQvc3VtKGNvdW50KSkpKSwgc3RhdCA9ICdjb3VudCcsIHZqdXN0ID0gLSAuNSkreGxhYigiVHLDrG5oIMSR4buZIGjhu41jIHbhuqVuIikreWxhYigiU+G7kSBsxrDhu6NuZyIpK3RoZW1lX2NsYXNzaWMoKQ0KYGBgDQoNCkJp4bq/biBFZHVjYXRpb24gTGV2ZWwgbMOgIGJp4bq/biDEkeG7i25oIHTDrW5oLCB0aGVvIGvhur90IHF14bqjIHRodSB0aOG6rXAgxJHGsOG7o2MgY8OzOg0KDQotIDMwMjEgbmfGsOG7nWkgY8OzIGLhurFuZyBj4butIG5ow6JuLCBjaGnhur9tIDQ1LDElLg0KDQotIDQ0OCBuZ8aw4budaSBjw7MgYuG6sW5nIHRydW5nIGjhu41jLCBjaGnhur9tIDYsNjklLg0KDQotIDE4NjAgbmfGsOG7nWkgY8OzIGLhurFuZyB0aOG6oWMgc8SpLCBjaGnhur9tIDI3LDc3JQ0KDQotIDEzNjkgbmfGsOG7nWkgY8OzIGLhurFuZyB0aeG6v24gc8SpLCBjaGnhur9tIDIwLDQ0JS4NCg0KVOG7qyDEkeG7kyB0aOG7iyB0aOG6pXkgxJHGsOG7o2MgdHJvbmcgbmjhu69uZyBuZ8aw4budaSDEkcaw4bujYyBraOG6o28gc8OhdCB0aMOsIG5nxrDhu51pIGPDsyBi4bqxbmcgY+G7rSBuaMOibiBjaGnhur9tIHThu7cgbOG7hyBjYW8gbmjhuqV0IHbhu5tpIDQ1LDElLg0KDQojIyBCaeG6v24gSm9iIFRpdGxlDQoNCmBgYHtyfQ0KdGFibGUoZHQkYEpvYiBUaXRsZWApDQp0YWJsZShkdCRgSm9iIFRpdGxlYCkvc3VtKHRhYmxlKGR0JGBKb2IgVGl0bGVgKSkNCmdncGxvdChkdCxhZXMoYEpvYiBUaXRsZWApKStnZW9tX2Jhcihjb2xvciA9ICJyZWQiLGZpbGwgPSAicGluayIpKyBnZW9tX3RleHQoYWVzKGxhYmVsID0gc2NhbGVzOjpwZXJjZW50KGFmdGVyX3N0YXQoY291bnQvc3VtKGNvdW50KSkpKSwgc3RhdCA9ICdjb3VudCcsIHZqdXN0ID0gLSAuNSkreGxhYigiQ2jhu6ljIHbhu6UgY8O0bmcgdmnhu4djIikreWxhYigiU+G7kSBsxrDhu6NuZyIpK3RoZW1lX2NsYXNzaWMoKQ0KYGBgDQoNCkJp4bq/biBKb2IgVGl0bGUgbMOgIGJp4bq/biDEkeG7i25oIHTDrW5oLCB0aGVvIGvhur90IHF14bqjIHRodSB0aOG6rXAgxJHGsOG7o2MgY8OzOg0KDQotIDM0NCBuZ8aw4budaSBsw6BtIHTDoGkgeOG6vyBnaWFvIGjDoG5nLCBjaGnhur9tIDUsMTQlLg0KDQotIDE3OTIgbmfGsOG7nWkgbMOgbSBnacOhbSDEkeG7kWMgdGnhur9wIHRo4buLIGvhu7kgdGh14bqtdCBz4buRLCBjaGnhur9tIDI2LDc1JS4NCg0KLSAxMjAxIG5nxrDhu51pIGzDoG0gxJFp4buBdSBwaOG7kWkgdmnDqm4gc+G7sSBraeG7h24sIGNoaeG6v20gMTcsOTMlDQoNCi0gOTY2IG5nxrDhu51pIGzDoG0gY+G7kSB24bqlbiB0w6BpIGNow61uaCwgY2hp4bq/bSAxNCw0MiUuDQoNCi0gMTM4MyBuZ8aw4budaSBsw6BtIGvhu7kgc8awIHBo4bqnbiBt4buBbSwgY2hp4bq/bSAyMCw2NSUuDQoNCi0gMTAxMiBuZ8aw4budaSBsw6BtIGvhu7kgdGh14bqtdCB2acOqbiwgY2hp4bq/bSAxNSwxMSUuDQoNClThu6sgxJHhu5MgdGjhu4sgdGjhuqV5IMSRxrDhu6NjIHRyb25nIG5o4buvbmcgbmfGsOG7nWkgxJHGsOG7o2Mga2jhuqNvIHPDoXQgdGjDrCBuZ8aw4budaSBsw6BtIGdpw6FtIMSR4buRYyB0aeG6v3AgdGjhu4sga+G7uSB0aHXhuq10IHPhu5EgY2hp4bq/bSB04bu3IGzhu4cgY2FvIG5o4bqldCB24bubaSAyNiw3NSUuDQoNCiMjIEJp4bq/biBBZ2UNCg0KYGBge3J9DQpzdW1tYXJ5KGR0JEFnZSkNCmBgYA0KDQpCaeG6v24gQWdlIGzDoCBiaeG6v24gxJHhu4tuaCBsxrDhu6NuZywgdOG7qyBr4bq/dCBxdeG6oyB0aOG7kW5nIGvDqiB0YSB0aOG6pXk6DQoNCi0gxJDhu5kgdHXhu5VpIHRydW5nIGLDrG5oIGzDoCAzMyw2Mi4NCg0KLSDEkOG7mSB0deG7lWkgdGjhuqVwIG5o4bqldCBsw6AgMjEuDQoNCi0gxJDhu5kgdHXhu5VpIGNhbyBuaOG6pXQgbMOgIDYyLg0KDQotIEPDsyAyNSUgc+G7kSBuZ8aw4budaSBkxrDhu5tpIDI4IHR14buVaS4NCg0KLSBDw7MgNTAlIHPhu5EgbmfGsOG7nWkgZMaw4bubaSAzMiB0deG7lWkuDQoNCi0gQ8OzIDc1JSBz4buRIG5nxrDhu51pIGTGsOG7m2kgMzggdHXhu5VpLg0KDQpgYGB7cn0NCmhpc3QoZHQkQWdlLCBjb2wgPSAicGluayIsIG1haW4gPSAiQmnhu4N1IMSR4buTIMSR4buZIHR14buVaSIsIHhsYWIgPSAixJDhu5kgdHXhu5VpIGPhu6dhIG5nxrDhu51pIGto4bqjbyBzw6F0IiwgeWxhYiA9ICJT4buRIGzGsOG7o25nIikNCmBgYA0KDQpU4burIGJp4buDdSDEkeG7kyB0aOG6pXkgxJHGsOG7o2MgxJHhu5kgdHXhu5VpIGPhu6dhIG5nxrDhu51pIGto4bqjbyBzw6F0IG5oaeG7gXUgbmjhuqV0IGzDoCB0cm9uZyBraG/huqNuZyAyNSAtIDM1IHR14buVaS4NCg0KIyMgQmnhur9uIFllYXJzIG9mIEV4cGVyaWVuY2UNCg0KYGBge3J9DQpzdW1tYXJ5KGR0JGBZZWFycyBvZiBFeHBlcmllbmNlYCkNCmBgYA0KDQpCaeG6v24gWWVhcnMgb2YgRXhwZXJpZW5jZSBsw6AgYmnhur9uIMSR4buLbmggbMaw4bujbmcsIHThu6sga+G6v3QgcXXhuqMgdGjhu5FuZyBrw6ogdGEgdGjhuqV5Og0KDQotIEtpbmggbmdoaeG7h20gbMOgbSB2aeG7h2MgdHJ1bmcgYsOsbmggbMOgIDgsMDk1Lg0KDQotIEtpbmggbmdoaeG7h20gbMOgbSB2aeG7h2MgdGjhuqVwIG5o4bqldCBsw6AgMC4NCg0KLSBLaW5oIG5naGnhu4dtIGzDoG0gdmnhu4djIGNhbyBuaOG6pXQgbMOgIDM0Lg0KDQotIEPDsyAyNSUgc+G7kSBuZ8aw4budaSBjw7MgZMaw4bubaSAzIG7Eg20ga2luaCBuZ2hp4buHbSBsw6BtIHZp4buHYy4NCg0KLSBDw7MgNTAlIHPhu5EgbmfGsOG7nWkgY8OzIGTGsOG7m2kgNyBuxINtIGtpbmggbmdoaeG7h20gbMOgbSB2aeG7h2MuDQoNCi0gQ8OzIDc1JSBz4buRIG5nxrDhu51pIGPDsyBkxrDhu5tpIDEyIG7Eg20ga2luaCBuZ2hp4buHbSBsw6BtIHZp4buHYy4NCg0KYGBge3J9DQpoaXN0KGR0JGBZZWFycyBvZiBFeHBlcmllbmNlYCwgY29sID0gInBpbmsiLCBtYWluID0gIkJp4buDdSDEkeG7kyBraW5oIG5naGnhu4dtIGzDoG0gdmnhu4djIiwgeGxhYiA9ICJLaW5oIG5naGnhu4dtIGzDoG0gdmnhu4djIGPhu6dhIG5nxrDhu51pIGto4bqjbyBzw6F0IiwgeWxhYiA9ICJT4buRIGzGsOG7o25nIikNCmBgYA0KDQpU4burIGJp4buDdSDEkeG7kyB0aOG6pXkgxJHGsOG7o2Mga2luaCBuZ2hp4buHbSBsw6BtIHZp4buHYyBj4bunYSBuZ8aw4budaSBraOG6o28gc8OhdCBuaGnhu4F1IG5o4bqldCBsw6AgZMaw4bubaSAxMCBuxINtLg0KDQojIyBCaeG6v24gU2FsYXJ5DQoNCmBgYHtyfQ0Kc3VtbWFyeShkdCRTYWxhcnkpDQpgYGANCg0KQmnhur9uIFNhbGFyeSBsw6AgYmnhur9uIMSR4buLbmggbMaw4bujbmcsIHThu6sga+G6v3QgcXXhuqMgdGjhu5FuZyBrw6ogdGEgdGjhuqV5Og0KDQotIE3hu6ljIGzGsMahbmcgdHJ1bmcgYsOsbmggbMOgIDExNTMyLg0KDQotIE3hu6ljIGzGsMahbmcgdGjhuqVwIG5o4bqldCBsw6AgMzUwLg0KDQotIE3hu6ljIGzGsMahbmcgY2FvIG5o4bqldCBsw6AgMjUwMDAwLg0KDQotIEPDsyAyNSUgc+G7kSBuZ8aw4budaSBjw7MgbeG7qWMgbMawxqFuZyBkxrDhu5tpIDcwMDAuDQoNCi0gQ8OzIDUwJSBz4buRIG5nxrDhu51pIGPDsyBt4bupYyBsxrDGoW5nIGTGsOG7m2kgMTE1MDAwLg0KDQotIEPDsyA3NSUgc+G7kSBuZ8aw4budaSBjw7MgbeG7qWMgbMawxqFuZyBkxrDhu5tpIDE2MDAwMC4NCg0KYGBge3J9DQpoaXN0KGR0JFNhbGFyeSwgY29sID0gInBpbmsiLCBtYWluID0gIkJp4buDdSDEkeG7kyBt4bupYyBsxrDGoW5nIiwgeGxhYiA9ICJN4bupYyBsxrDGoW5nIGPhu6dhIG5nxrDhu51pIGto4bqjbyBzw6F0IiwgeWxhYiA9ICJT4buRIGzGsOG7o25nIikNCmBgYA0KDQpU4burIGJp4buDdSDEkeG7kyB0aOG6pXkgxJHGsOG7o2MgbeG7qWMgbMawxqFuZyBj4bunYSBuZ8aw4budaSBraOG6o28gc8OhdCBraMOhIMSR4buTbmcgxJHhu4F1IHbDoCBu4bqxbSB0cm9uZyBraG/huqNuZyB04burIDUwMDAwIC0gMjAwMDAwIGzDoCBuaGnhu4F1IG5o4bqldC4NCg0KIyBCw6BpIHbhu4EgbmjDoCB0deG6p24gMg0KDQpDaOG7jW4gMSBiaeG6v24gxJHhu4tuaCB0w61uaCB2w6AgMSBiaeG6v24gxJHhu4tuaCBsxrDhu6NuZyBsw6BtIGJp4bq/biBwaOG7pSB0aHXhu5ljIMSR4buDIHBow6JuIHTDrWNoLCBnaeG6o2kgdGjDrWNoIGzDvSBkby4NCg0KIyMgUGjDom4gbG/huqFpIGPDoWMgYmnhur9uIHRyb25nIGThu68gbGnhu4d1DQoNCiMjIyBE4buvIGxp4buHdSDEkeG7i25oIHTDrW5oDQoNCi0gKipHZW5kZXI6KiogR2nhu5tpIHTDrW5oIChNYWxlOiBOYW0sIEZlbWFsZTogTuG7rykNCg0KLSAqKkNvdW50cnk6KiogUXXhu5FjIGdpYSBj4bunYSBuZ8aw4budaSDEkcaw4bujYyBraOG6o28gc8OhdCAoQXVzdHJhbGlhOiDDmmMsIENhbmFkYTogQ2FuYWRhLCBDaGluYTogVHJ1bmcgUXXhu5FjLCBVSzogVsawxqFuZyBRdeG7kWMgQW5oLCBVU0E6IEhvYSBL4buzKQ0KDQotICoqUmFjZToqKiBDaOG7p25nIHThu5ljIGPhu6dhIG5nxrDhu51pIMSRxrDhu6NjIGto4bqjbyBzw6F0IChBZnJpY2FuIEFtZXJpY2FuOiBOZ8aw4budaSBN4bu5IGfhu5FjIFBoaSwgQXNpYW46IE5nxrDhu51pIENow6J1IMOBLCBBdXN0cmFsaWFuOiBOZ8aw4budaSDDmmMsIEJsYWNrOiBOZ8aw4budaSBkYSDEkWVuLCBDaGluZXNlOiBOZ8aw4budaSBUcnVuZyBRdeG7kWMsIEhpc3BhbmljOiBOZ8aw4budaSBUw6J5IEJhbiBOaGEsIEtvcmVhbjogTmfGsOG7nWkgSMOgbiBRdeG7kWMsIE1peGVkOiBOZ8aw4budaSBjaOG7p25nIHThu5ljIGjhu5duIGjhu6NwLCBXZWxzaDogTmfGsOG7nWkgWOG7qSBXYWxlcywgV2hpdGU6IE5nxrDhu51pIGRhIHRy4bqvbmcpDQoNCi0gKipFZHVjYXRpb24gTGV2ZWw6KiogVHLDrG5oIMSR4buZIGjhu41jIHbhuqVuIChIaWdoIFNjaG9vbDogQ8OzIGLhurFuZyB0cnVuZyBo4buNYywgQmFjaGVsb3InRGVncmVlOiBDw7MgYuG6sW5nIEPhu60gbmjDom4sIE1hc3RlcidEZWdyZWU6IEPDsyBi4bqxbmcgVGjhuqFjIFPEqSwgUGhEOiBDw7MgYuG6sW5nIFRp4bq/biBTxKkpDQoNCi0gKipKb2IgVGl0bGU6KiogQ2jhu6ljIHbhu6UgY8O0bmcgdmnhu4djIChEZWxpdmVyeSBkcml2ZXI6IFTDoGkgeOG6vyBnaWFvIGjDoG5nLCBEaWdpdGFsIE1hcmtldGluZyBNYW5hZ2VyOiBHacOhbSDEkeG7kWMgVGnhur9wIHRo4buLIGvhu7kgdGh14bqtdCBz4buRLCBFdmVudCBDb29yZGluYXRvcjogxJBp4buBdSBwaOG7kWkgdmnDqm4gc+G7sSBraeG7h24sIEp1bmlvciBGaW5hbmNpYWwgQWR2aXNvcjogQ+G7kSB24bqlbiB0w6BpIGNow61uaCwgU29mdHdhcmUgRW5naW5lZXI6IEvhu7kgc8awIHBo4bqnbiBt4buBbSwgVGVjaG5pY2FsIFJlY3J1aXRlcjogS+G7uSB0aHXhuq10IHZpw6puKQ0KDQojIyMgROG7ryBsaeG7h3UgxJHhu4tuaCBsxrDhu6NuZw0KDQotICoqSUQ6KiogU+G7kSB0aOG7qSB04buxIGPhu6dhIG5nxrDhu51pIMSRxrDhu6NjIGto4bqjbyBzw6F0IGPhu6dhIG5nxrDhu51pIMSRxrDhu6NjIGto4bqjbyBzw6F0DQoNCi0gKipBZ2U6KiogxJDhu5kgdHXhu5VpICh0w61uaCB0aGVvIG7Eg20pDQoNCi0gKipZZWFycyBvZiBFeHBlcmllbmNlOioqIEtpbmggbmdoaeG7h20gbMOgbSB2aeG7h2MNCg0KLSAqKlNhbGFyeToqKiBN4bupYyBsxrDGoW5nIG5o4bqtbiDEkcaw4bujYw0KDQojIyBDaOG7jW4gYmnhur9uIHBo4bulIHRodeG7mWMNCg0KIyMjIENo4buNbiBiaeG6v24gxJHhu4tuaCB0w61uaCBsw6BtIGJp4bq/biBwaOG7pSB0aHXhu5ljDQoNCioqUGjDom4gdMOtY2ggY8OhYyB54bq/dSB04buRIOG6o25oIGjGsOG7n25nIMSR4bq/biBjaOG7qWMgduG7pSBjw7RuZyB2aeG7h2MgKEpvYiBUaXRsZSkuKioNCg0KQ2jhu6ljIHbhu6UgY8O0bmcgdmnhu4djIGPDsyB0aOG7gyBz4bq9IGLhu4sg4bqjbmggaMaw4bufbmcgYuG7n2kgY8OhYyB54bq/dSB04buRIG5oxrAgZ2nhu5tpIHTDrW5oIChHZW5kZXIpLCB0csOsbmggxJHhu5kgaOG7jWMgduG6pW4gKEVkdWNhdGlvbiBMZXZlbCksIMSR4buZIHR14buVaSAoQWdlKSwga2luaCBuZ2hp4buHbSBsw6BtIHZp4buHYyAoWWVhcnMgb2YgRXhwZXJpZW5jZSksLi4uIERvIMSRw7MsIGNo4buNbiBwaMOibiB0w61jaCBiaeG6v24gSm9iIFRpdGxlIMSR4buDIHBo4bqnbiBuw6BvIGdpw7pwIGNobyBjw6FjIG5ow6AgbmdoacOqbiBj4bupdSBoaeG7g3Ugc8OidSBoxqFuIHbhu4EgY8OhYyBiaeG6v24sIHBo4bulYyB24bulIGNobyBjw7RuZyB0w6FjIG5naGnDqm4gY+G7qXUgxJHhuqF0IMSRxrDhu6NjIGvhur90IHF14bqjIHThu5F0Lg0KDQojIyMgQ2jhu41uIGJp4bq/biDEkeG7i25oIGzGsOG7o25nIGzDoG0gYmnhur9uIHBo4bulIHRodeG7mWMNCg0KKipQaMOibiB0w61jaCBjw6FjIHnhur91IHThu5Eg4bqjbmggaMaw4bufbmcgxJHhur9uIG3hu6ljIGzGsMahbmcgY+G7p2EgbmfGsOG7nWkgxJHGsOG7o2Mga2jhuqNvIHPDoXQgKFNhbGFyeSkuKioNCg0KUGjDom4gdMOtY2ggxJHhu4MgeGVtIHjDqXQgbeG7qWMgbMawxqFuZyBjw7MgYuG7iyDhuqNuaCBoxrDhu59uZyBi4bufaSBjw6FjIHnhur91IHThu5E6IGdp4bubaSB0w61uaCAoR2VuZGVyKSwgdHLDrG5oIMSR4buZIGjhu41jIHbhuqVuIChFZHVjYXRpb24gTGV2ZWwpLCDEkeG7mSB0deG7lWkgKEFnZSksIGtpbmggbmdoaeG7h20gbMOgbSB2aeG7h2MgKFllYXJzIG9mIEV4cGVyaWVuY2UpLC4uLiBEbyDEkcOzLCBjaOG7jW4gcGjDom4gdMOtY2ggYmnhur9uIFNhbGFyeSDEkeG7gyBwaOG6p24gbsOgbyBnacO6cCBjaG8gY8OhYyBuaMOgIG5naGnDqm4gY+G7qXUgaGnhu4N1IHPDonUgaMahbiB24buBIGPDoWMgYmnhur9uLCBwaOG7pWMgduG7pSBjaG8gY8O0bmcgdMOhYyBuZ2hpw6puIGPhu6l1IMSR4bqhdCDEkcaw4bujYyBr4bq/dCBxdeG6oyB04buRdC4NCg0KIyBCw6BpIHbhu4EgbmjDoCB0deG6p24gMQ0KDQpUw6xtIG3hu5l0IGRhdGFzZXQgY8OzIGThu68gbGnhu4d1IMSR4buLbmggdMOtbmgsIGPDsyBk4buvIGxp4buHdSDEkeG7i25oIGzGsOG7o25nLCBjw7MgdHLDqm4gNSBiaeG6v24gdsOgIG5oaeG7gXUgaMahbiAxNTAgcXVhbiBzw6F0Lg0KDQojIyBE4buvIGxp4buHdSBuZ2hpw6puIGPhu6l1DQoNCkLhu5kgZOG7ryBsaeG7h3UgYmFvIGfhu5NtIG3hu5l0IGLhu5kgc8awdSB04bqtcCB0b8OgbiBkaeG7h24gduG7gSBsxrDGoW5nIHbDoCB0aMO0bmcgdGluIG5ow6JuIGto4bqpdSBo4buNYyB24bubaSBjw6FjIGNoaSB0aeG6v3QgYuG7lSBzdW5nIHbhu4Egc+G7kSBuxINtIGtpbmggbmdoaeG7h20uIE7DsyBjdW5nIGPhuqVwIG3hu5l0IG5ndeG7k24gdMOgaSBuZ3V5w6puIHF1w70gZ2nDoSDEkeG7gyBuZ2hpw6puIGPhu6l1IG3hu5FpIHF1YW4gaOG7hyBnaeG7r2EgdGh1IG5o4bqtcCB2w6AgY8OhYyB54bq/dSB04buRIG5ow6JuIGto4bqpdSB4w6MgaOG7mWkga2jDoWMgbmhhdS4gQ8OhYyB0aHXhu5ljIHTDrW5oIG5ow6JuIGto4bqpdSBo4buNYyBiYW8gZ+G7k20gdHXhu5VpIHTDoWMsIGdp4bubaSB0w61uaCwgZ2nDoW8gZOG7pWMsIHF14buRYyBnaWEgdsOgIGNo4bunbmcgdOG7mWMsIGN1bmcgY+G6pXAgbmhp4buBdSBiaeG6v24gc+G7kSBraMOhYyBuaGF1IMSR4buDIHBow6JuIHTDrWNoLiBDw6FjIG5ow6AgbmdoacOqbiBj4bupdSBjw7MgdGjhu4Mga2jDoW0gcGjDoSBjw6FjIG3DtCBow6xuaCB2w6AgeHUgaMaw4bubbmcgcGjDom4gcGjhu5FpIHRodSBuaOG6rXAgdHLDqm4gY8OhYyBkYW5oIG3hu6VjIG5ow6JuIGto4bqpdSBo4buNYyBraMOhYyBuaGF1LCBjaG8gcGjDqXAgaGnhu4N1IHLDtSBoxqFuIHbhu4Egc+G7sSBjaMOqbmggbOG7h2NoIHRp4buBbSBuxINuZyBob+G6t2MgY8OhYyBiaeG6v24gdGjhu4MgdHJvbmcga2jhuqMgbsSDbmcga2nhur9tIHRp4buBbi4gSMahbiBu4buvYSwgYuG7mSBk4buvIGxp4buHdSBr4bq/dCBo4bujcCBraMOtYSBj4bqhbmggcXVhbiB0cuG7jW5nIGPhu6dhIHPhu5EgbsSDbSBraW5oIG5naGnhu4dtLCBjaG8gcGjDqXAgxJFp4buBdSB0cmEgdMOhYyDEkeG7mW5nIGPhu6dhIG5oaeG7h20ga+G7syBjaHV5w6puIG3DtG4gxJHhu5FpIHbhu5tpIG3hu6ljIGzGsMahbmcuIEtow61hIGPhuqFuaCBuw6B5IGLhu5Ugc3VuZyBt4buZdCBraMOtYSBj4bqhbmggbsSDbmcgxJHhu5luZyBjaG8gcGjDom4gdMOtY2gsIGNobyBwaMOpcCBjw6FjIG5ow6AgbmdoacOqbiBj4bupdSBraeG7g20gdHJhIHRodSBuaOG6rXAgdGhheSDEkeG7lWkgbmjGsCB0aOG6vyBuw6BvIGThu7FhIHRyw6puIGPhuqMgxJHhurdjIMSRaeG7g20gbmjDom4ga2jhuql1IGjhu41jIHbDoCBraW5oIG5naGnhu4dtIGzDoG0gdmnhu4djIHTDrWNoIGzFqXkuIELhu5kgZOG7ryBsaeG7h3UgbWFuZyDEkeG6v24gY8ahIGjhu5lpIHBob25nIHBow7ogxJHhu4MgdGjhu7FjIGhp4buHbiBjw6FjIG5naGnDqm4gY+G7qXUgdG/DoG4gZGnhu4duIHbhu4EgxJFhIGThuqFuZyB0aHUgbmjhuq1wIHbDoCBoaeG7g3UgY8OhYyB54bq/dSB04buRIG5oaeG7gXUgbeG6t3Qg4bqjbmggaMaw4bufbmcgxJHhur9uIHRp4buBbSBuxINuZyBraeG6v20gdGnhu4FuIHRyb25nIGzhu7FjIGzGsOG7o25nIGxhbyDEkeG7mW5nIG5nw6B5IG5heS4NCg0KQuG7mSBk4buvIGxp4buHdSDEkcaw4bujYyB0aHUgdGjhuq1wIHThu6sgS2FnZ2xlIHbDoCBt4bubaSDEkcaw4bujYyBj4bqtcCBuaOG6pXQgZ+G6p24gxJHDonkgdsOgbyB0aMOhbmcgMDYvMjAyMy4NCg0KIyMgR2nhuqNpIHRow61jaCBjw6FjIGJp4bq/bg0KDQpC4buZIGThu68gbGnhu4d1IGPDsyA5IGJp4bq/biBiYW8gZ+G7k20gNjY5OCBxdWFuIHPDoXQgY8OzIDQgYmnhur9uIMSR4buLbmggbMaw4bujbmcgdsOgIDUgYmnhur9uIMSR4buLbmggdMOtbmguDQoNCi0gKipJRDoqKiBT4buRIHRo4bupIHThu7EgY+G7p2EgbmfGsOG7nWkgxJHGsOG7o2Mga2jhuqNvIHPDoXQNCg0KLSAqKkdlbmRlcjoqKiBHaeG7m2kgdMOtbmggKE1hbGU6IE5hbSwgRmVtYWxlOiBO4buvKQ0KDQotICoqQWdlOioqIMSQ4buZIHR14buVaSAodMOtbmggdGhlbyBuxINtKQ0KDQotICoqQ291bnRyeToqKiBRdeG7kWMgZ2lhIGPhu6dhIG5nxrDhu51pIMSRxrDhu6NjIGto4bqjbyBzw6F0IChBdXN0cmFsaWE6IMOaYywgQ2FuYWRhOiBDYW5hZGEsIENoaW5hOiBUcnVuZyBRdeG7kWMsIFVLOiBWxrDGoW5nIFF14buRYyBBbmgsIFVTQTogSG9hIEvhu7MpDQoNCi0gKipSYWNlOioqIENo4bunbmcgdOG7mWMgY+G7p2EgbmfGsOG7nWkgxJHGsOG7o2Mga2jhuqNvIHPDoXQgKEFmcmljYW4gQW1lcmljYW46IE5nxrDhu51pIE3hu7kgZ+G7kWMgUGhpLCBBc2lhbjogTmfGsOG7nWkgQ2jDonUgw4EsIEF1c3RyYWxpYW46IE5nxrDhu51pIMOaYywgQmxhY2s6IE5nxrDhu51pIGRhIMSRZW4sIENoaW5lc2U6IE5nxrDhu51pIFRydW5nIFF14buRYywgSGlzcGFuaWM6IE5nxrDhu51pIFTDonkgQmFuIE5oYSwgS29yZWFuOiBOZ8aw4budaSBIw6BuIFF14buRYywgTWl4ZWQ6IE5nxrDhu51pIGNo4bunbmcgdOG7mWMgaOG7l24gaOG7o3AsIFdlbHNoOiBOZ8aw4budaSBY4bupIFdhbGVzLCBXaGl0ZTogTmfGsOG7nWkgZGEgdHLhuq9uZykNCg0KLSAqKkVkdWNhdGlvbiBMZXZlbDoqKiBUcsOsbmggxJHhu5kgaOG7jWMgduG6pW4gKEhpZ2ggU2Nob29sOiBDw7MgYuG6sW5nIHRydW5nIGjhu41jLCBCYWNoZWxvcidEZWdyZWU6IEPDsyBi4bqxbmcgQ+G7rSBuaMOibiwgTWFzdGVyJ0RlZ3JlZTogQ8OzIGLhurFuZyBUaOG6oWMgU8SpLCBQaEQ6IEPDsyBi4bqxbmcgVGnhur9uIFPEqSkNCg0KLSAqKkpvYiBUaXRsZToqKiAgQ2jhu6ljIHbhu6UgY8O0bmcgdmnhu4djIChEZWxpdmVyeSBkcml2ZXI6IFTDoGkgeOG6vyBnaWFvIGjDoG5nLCBEaWdpdGFsIE1hcmtldGluZyBNYW5hZ2VyOiBHacOhbSDEkeG7kWMgVGnhur9wIHRo4buLIGvhu7kgdGh14bqtdCBz4buRLCBFdmVudCBDb29yZGluYXRvcjogxJBp4buBdSBwaOG7kWkgdmnDqm4gc+G7sSBraeG7h24sIEp1bmlvciBGaW5hbmNpYWwgQWR2aXNvcjogQ+G7kSB24bqlbiB0w6BpIGNow61uaCwgU29mdHdhcmUgRW5naW5lZXI6IEvhu7kgc8awIHBo4bqnbiBt4buBbSwgVGVjaG5pY2FsIFJlY3J1aXRlcjogS+G7uSB0aHXhuq10IHZpw6puKQ0KDQotICoqWWVhcnMgb2YgRXhwZXJpZW5jZToqKiBLaW5oIG5naGnhu4dtIGzDoG0gdmnhu4djDQoNCi0gKipTYWxhcnk6KiogTeG7qWMgbMawxqFuZyBuaOG6rW4gxJHGsOG7o2MNCg0KYGBge3J9DQpkdCA8LSByZWFkX2V4Y2VsKCJDOi9ISzItMjAyMy9QaMOibiB0w61jaCBk4buvIGxp4buHdSDEkeG7i25oIHTDrW5oL2J0dm4ueGxzeCIpDQpkdA0Kc3RyKGR0KQ0KYGBg