Nhiệm vụ 5

library(tidyverse)
library(DT)
library(scales)
library(psych)
library(knitr)
library(kableExtra)
library(DescTools)
library(epitools)
library(AER)
library(dplyr)

Phần 1:Tìm hiểu và chuẩn bị dữ liệu

1.1 Giới thiệu bộ dữ liệu

Bộ dữ liệu CPS1985 (Current Population Survey 1985) là một tập dữ liệu điều tra cá nhân được trích xuất từ Khảo sát Dân số Hiện hành tại Hoa Kỳ. Dữ liệu này cung cấp thông tin về mức lương theo giờ cùng các đặc điểm nhân khẩu học và nghề nghiệp của 534 cá nhân đang làm việc, bao gồm giới tính, chủng tộc, trình độ học vấn, kinh nghiệm, tuổi, tình trạng hôn nhân, nghề nghiệp và khu vực làm việc.

data("CPS1985")
k<-CPS1985
datatable(k,options = list(scrollX = TRUE)) #bật cuộn ngang
names(k)
##  [1] "wage"       "education"  "experience" "age"        "ethnicity" 
##  [6] "region"     "gender"     "occupation" "sector"     "union"     
## [11] "married"

Bộ dữ liệu với các biến định tính

Ta thực hiện tạo 1 dataframe mới chỉ chứa các biến định tính, ta gán data mới này vào object với tên k_cat.

cat<- c("ethnicity", "region","gender", "occupation", "sector","union", "married")
k_cat<-k[, cat]
# Thay đổi giá trị của biến `card`và owner
k_cat$married <- dplyr::recode(k_cat$married, "yes" = "M" , "no" = "S")
datatable(k_cat,options = list(scrollX = TRUE))

1.2 Cấu trúc của dữ liệu

Để có cái nhìn tổng quan về cấu trúc của bộ dữ liệu, bao gồm số lượng quan sát, số lượng biến, kiểu dữ liệu của từng biến và một số giá trị điển hình, ta sử dụng hàm str() như sau:

str(k) #Cấu trúc trong dữ liệu
## 'data.frame':    534 obs. of  11 variables:
##  $ wage      : num  5.1 4.95 6.67 4 7.5 ...
##  $ education : num  8 9 12 12 12 13 10 12 16 12 ...
##  $ experience: num  21 42 1 4 17 9 27 9 11 9 ...
##  $ age       : num  35 57 19 22 35 28 43 27 33 27 ...
##  $ ethnicity : Factor w/ 3 levels "cauc","hispanic",..: 2 1 1 1 1 1 1 1 1 1 ...
##  $ region    : Factor w/ 2 levels "south","other": 2 2 2 2 2 2 1 2 2 2 ...
##  $ gender    : Factor w/ 2 levels "male","female": 2 2 1 1 1 1 1 1 1 1 ...
##  $ occupation: Factor w/ 6 levels "worker","technical",..: 1 1 1 1 1 1 1 1 1 1 ...
##  $ sector    : Factor w/ 3 levels "manufacturing",..: 1 1 1 3 3 3 3 3 1 3 ...
##  $ union     : Factor w/ 2 levels "no","yes": 1 1 1 1 1 2 1 1 1 1 ...
##  $ married   : Factor w/ 2 levels "no","yes": 2 2 1 1 2 1 1 1 2 1 ...

Qua kết quả của hàm str(), ta thấy bộ dữ liệu trong nghiên cứu là CPS1985 (Current Population Survey 1985), bao gồm thông tin của 534 người đang tham gia thị trường lao động tại Hoa Kỳ. Dữ liệu được thu thập nhằm mục đích khảo sát các yếu tố nhân khẩu học và kinh tế – xã hội ảnh hưởng đến thu nhập của người lao động. Tập dữ liệu chứa tổng cộng 11 biến, bao gồm cả biến định lượng và biến định tính, cụ thể như sau:

Các biến định lượng:

  • wage: Mức lương theo giờ của cá nhân (tính bằng đô la Mỹ), là biến mục tiêu quan trọng trong nghiên cứu về thu nhập.

  • education: Tổng số năm học chính quy của cá nhân, phản ánh trình độ học vấn.

  • experience: Số năm kinh nghiệm làm việc.

  • age: Tuổi hiện tại của cá nhân.

Các biến định tính:

  • ethnicity: Chủng tộc, được phân thành ba nhóm chính (ví dụ: “cauc”, “hispanic”, “other”).

  • region: Khu vực sinh sống, gồm hai mức: miền Nam (south) và các khu vực khác (other).

  • gender: Giới tính của cá nhân, bao gồm nam và nữ.

  • occupation: Nhóm ngành nghề chính, được chia thành sáu loại khác nhau.

  • sector: Khu vực kinh tế nơi cá nhân làm việc, với ba mức như khu vực sản xuất, khu vực công, và khu vực khác.

  • union: Tình trạng tham gia công đoàn, có hai mức là “có” và “không”.

  • married: Tình trạng hôn nhân, gồm hai mức là độc thân (S) và đã kết hôn (M).

1.3 Hiển thị một vài dòng đầu và cuối của dữ liệu

Nhằm có được cái nhòn tổng quan về bộ dữ liệu ta sử dụng hàm head() và taid() để xem một số dòng đầu và dòng cuối của bộ dữ liệu Current Population Survey 1985:

head(k) #hiển thị vài dòng đầu
##       wage education experience age ethnicity region gender occupation
## 1     5.10         8         21  35  hispanic  other female     worker
## 1100  4.95         9         42  57      cauc  other female     worker
## 2     6.67        12          1  19      cauc  other   male     worker
## 3     4.00        12          4  22      cauc  other   male     worker
## 4     7.50        12         17  35      cauc  other   male     worker
## 5    13.07        13          9  28      cauc  other   male     worker
##             sector union married
## 1    manufacturing    no     yes
## 1100 manufacturing    no     yes
## 2    manufacturing    no      no
## 3            other    no      no
## 4            other    no     yes
## 5            other   yes      no
tail(k) #hiển thị vào dòng cuối 
##      wage education experience age ethnicity region gender occupation
## 528 11.79        16          6  28      cauc  other female  technical
## 529 11.36        18          5  29      cauc  other   male  technical
## 530  6.10        12         33  51     other  other female  technical
## 531 23.25        17         25  48     other  other female  technical
## 532 19.88        12         13  31      cauc  south   male  technical
## 533 15.38        16         33  55      cauc  other   male  technical
##            sector union married
## 528         other   yes      no
## 529         other    no      no
## 530         other    no     yes
## 531         other   yes     yes
## 532         other   yes     yes
## 533 manufacturing    no     yes

1.4 Kiểm tra giá trị thiếu

Nhằm đảm bảo chất lượng dữ liệu và tránh sai lệch trong quá trình phân tích, ta cần kiểm tra xem bộ dữ liệu có chứa giá trị thiếu (NA) hay không. Điều này giúp xác định liệu có cần xử lý hoặc làm sạch dữ liệu trước khi tiếp tục phân tích:

if (any(is.na(k))) {
  cat("Có giá trị thiếu trong dữ liệu.\n")
} else {
  cat("Không có giá trị thiếu trong dữ liệu.\n")
}
## Không có giá trị thiếu trong dữ liệu.

Với đoạn code trên nếu trong bộ dữ liệu có bất kì dữ liệu nào thiếu thì kết quả sẽ nhận được là có giá trị thiếu trong dữ liệu và ngược lại.

Với bộ dữ liệu được gán cho k nhận được kết quả là Không có giá trị thiếu trong dữ liệu. Điều này cho thấy dữ liệu không có ô trống hay giá trị bị thiếu trong toàn bộ bộ dữ liệu. Đây là điều kiện để tiến hành các phân tích tiếp theo mà không cần thực hiện bước xử lý giá trị thiếu.

Phần 2: Phân tích mô tả các biến định tính

2.1 Biến ethnicity

Ta thực hiện thống kê tần số và tần suất cho biến ethnicity được kết quả như sau:

Thống kê tần suất

ethnicity_1<-table(k_cat$ethnicity)
ethnicity_1
## 
##     cauc hispanic    other 
##      440       27       67
ethnicity_2<-table(k_cat$ethnicity)/sum(nrow(k_cat))*100 #tần suất
ethnicity_2
## 
##     cauc hispanic    other 
## 82.39700  5.05618 12.54682

Trực quan hóa dữ liệu

c <- as.data.frame(table(k_cat$ethnicity)) #chuyển kết quả thành bảng dữ liệu (data.frame) với 2 cột
colnames(c) <- c("ethnicity", "Count")
ggplot(c, aes(x = ethnicity, y = Count, fill = ethnicity)) +
  geom_bar(stat = "identity") +
  labs(title = "Biểu đồ biểu thị chủng tộc", x = "Chủng tộc", y = "Số lượng") +
  theme_minimal() +  
  theme(text = element_text(family = "sans"))

pie(ethnicity_2,
labels = paste(names(ethnicity_2), round(ethnicity_2, 2), "%"),
main = "Tỷ lệ chủng tộc")

Nhận xét

Biểu đồ cho thấy nhóm chủng tộc Caucasian (người da tắng) chiếm ưu thế rõ rệt với 440 người 82.4% chiếm tỷ lệ cao nhất trong 3 nhóm. Nhóm other đứng thứ hai với 67 người, trong khi Hispanic (Mỹ latinh) chỉ có 27 người. Sự chênh lệch này cho thấy mẫu khảo sát có xu hướng nghiêng nhiều về một nhóm chủng tộc nhất định, có thể ảnh hưởng đến kết quả nghiên cứu nếu mục tiêu là phản ánh sự đa dạng chủng tộc.

2.2 Biến region

Ta thực hiện thống kê tần số và tần suất cho biến region được kết quả như sau

Thống kê tần suất

region_1<-table(k_cat$region)
region_1
## 
## south other 
##   156   378
region_2<-table(k_cat$region)/sum(nrow(k_cat))*100 #tần suất
region_2
## 
##    south    other 
## 29.21348 70.78652

Trực quan hóa dữ liệu

region_1 <- k_cat |>
  group_by(region) |>
  summarise(freq = n()) |>
  mutate(per = freq / sum(freq),
         label = paste0(freq, " (", round(per * 100, 1), "%)"))

ggplot(region_1 , aes(x = "", y = per, fill = region)) +
  geom_col(width = 1, color = "white") +
  coord_polar("y") +
  geom_text(aes(label = paste0(round(per*100, 2), "%")),
            position = position_stack(vjust = 0.5),
            size = 2.5) +
  scale_fill_brewer(palette = "Pastel1") +  # Bạn có thể chọn Set1, Set2...
  labs(title = "Tỷ lệ người sinh sống ở các khu vực", fill = "Khu vực") +
  theme_void()

Nhận xét

Kết quả biểu đồ cho thấy đa số người dân sinh sống tại các khu vực ngoài miền Nam chiếm khoảng 70.79%, trong khi chỉ có 29.21% cư trú tại khu vực miền Nam. Điều này cho thấy sự phân bố dân cư trong mẫu có phần nghiêng về các vùng ngoài miền Nam.

2.3 Biến gender

Ta thực hiện thống kê tần số và tần suất cho biến region được kết quả như sau

Thống kê tần suất

gender_1<-table(k_cat$gender)
gender_1
## 
##   male female 
##    289    245
gender_2<-table(k_cat$gender)/sum(nrow(k_cat))*100 #tần suất
gender_2
## 
##     male   female 
## 54.11985 45.88015

Trực quan hóa dữ liệu

cols <- c("lightblue","lightpink")
# Nhãn phần trăm
gender_2bd<- paste0( round(gender_2, 2), "%")
# Vẽ pie 
pie(
  gender_2 ,
  labels = NA,
  main   = "Tần suất biến giới tính",
  col    = cols,
  border = "white")

# Thêm legend
legend(
  x      ="topright",
  legend = paste(names(gender_2 ),gender_2bd),
  fill   = cols,
  )

Nhận xét

Dựa vào kết quả khảo sát trên cho thấy trong số những người khảo sát có 289 người là nam giới chiếm 54.12% và 245 người là nữ giới chiếm 45.88%. Qua kết quả đó ta thấy giới tính của những khảo sát không có sự chênh lệch quá nhiều.

2.4 Biến occupation

Ta thực hiện thống kê tần số và tần suất cho biến occupation được kết quả như sau

Thống kê tần suất

occupation_1<-table(k_cat$occupation)
occupation_1
## 
##     worker  technical   services     office      sales management 
##        156        105         83         97         38         55
occupation_2<-table(k_cat$occupation)/sum(nrow(k_cat))*100 #tần suất
occupation_2
## 
##     worker  technical   services     office      sales management 
##  29.213483  19.662921  15.543071  18.164794   7.116105  10.299625

Trực quan hóa dữ liệu

c3 <- as.data.frame(occupation_1)
colnames(c3) <- c("occupation", "Count")

ggplot(c3, aes(x = occupation, y = Count, fill = occupation)) +
  geom_col(fill = "lightblue", color = "black") +
  labs(x = "Ngành nghề", y = "Tần số", title = "Các ngành nghề khảo sát") +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))

Nhận xét

Kết quả cho thấy nhóm công nhân (worker) chiếm tỷ lệ lớn nhất trong mẫu khảo sát chiếm khoảng 28,33%, theo sau là nhóm kỹ thuật (technical) và văn phòng (office) với lần lượt 19,06% và 17,61%. Trong khi đó, nhóm bán hàng (sales) có số lượng thấp nhất, chỉ chiếm 6,90%. Sự phân bố này cho thấy rằng mẫu khảo sát có xu hướng nghiêng về các ngành lao động chân tay và kỹ thuật.

2.5 Biến sector

Ta thực hiện thống kê tần số và tần suất cho biến sector được kết quả như sau

Thống kê tần suất

sector_1<-table(k_cat$sector)
sector_1
## 
## manufacturing  construction         other 
##            99            24           411
sector_2<-table(k_cat$sector)/sum(nrow(k_cat))*100 #tần suất
sector_2
## 
## manufacturing  construction         other 
##     18.539326      4.494382     76.966292

Trực quan hóa dữ liệu

cols <- c("lightblue","lightpink", "lightgreen")
# Nhãn phần trăm
sector_2bd<- paste0( round(sector_2, 2), "%")
# Vẽ pie chart ẩn nhãn
pie(
  sector_2,
  labels = NA,
  main   = "Tần suất biến giới tính",
  col    = cols,
  border = "white")

# Thêm legend bên ngoài
legend(
  x      ="topright",
  legend = paste(names(sector_2),sector_2bd),
  fill   = cols,
  )

Nhận xét

Kết quả cho thấy phần lớn người tham gia khảo sát làm việc trong khu vực khác (chiếm khoảng 76,97%), trong khi chỉ có 18,54% thuộc khu vực sản xuất và 4,49% làm việc trong ngành xây dựng. Điều này cho thấy mẫu khảo sát tập trung chủ yếu vào các đối tượng không làm việc trong lĩnh vực công nghiệp hay xây dựng.

2.6 Biến union

Ta thực hiện thống kê tần số và tần suất cho biến union được kết quả như sau

Thống kê tần suất

union_1<-table(k_cat$union)
union_1
## 
##  no yes 
## 438  96
union_2<-table(k_cat$union)/sum(nrow(k_cat))*100 #tần suất
union_2
## 
##       no      yes 
## 82.02247 17.97753

Trực quan hóa dữ liệu

cols <- c("lightblue","lightpink")
# Nhãn phần trăm
union_2bd<- paste0( round(union_2, 2), "%")
# Vẽ pie chart ẩn nhãn
pie(
  union_2 ,
  labels = NA,
  main   = "Tần suất tham gia hoặc không gia công đoàn",
  col    = cols,
  border = "white")

# Thêm legend bên ngoài
legend(
  x      ="topright",
  legend = paste(names(union_2),union_2bd),
  fill   = cols,
  )

Nhận xét

Dựa vào kết quả trên ta nhận thấy số người tham gia công đoàn chỉ chiểm 17.98% trong khi đó số người không tham gia công đoàn chiếm tỷ lệ lớn với 82.02%. Qua kết quả trên ta thấy có sự chênh lệch quá lớn giữa 2 trang thái.

2.7 Biến married

Ta thực hiện thống kê tần số và tần suất cho biến married được kết quả như sau

Thống kê tần suất

married_1<-table(k_cat$married)
married_1
## 
##   S   M 
## 184 350
married_2<-table(k_cat$married)/sum(nrow(k_cat))*100 #tần suất
married_2
## 
##        S        M 
## 34.45693 65.54307

Trực quan hóa dữ liệu

cols <- c("lightblue","lightpink")
# Nhãn phần trăm
married_2bd<- paste0( round(married_2, 2), "%")
# Vẽ pie chart ẩn nhãn
pie(
  married_2,
  labels = NA,
  main   = "Tỷ lệ tình trạng kết hôn của người dân",
  col    = cols,
  border = "white")

# Thêm legend bên ngoài
legend(
  x      ="topright",
  legend = paste(names(married_2),married_2bd),
  fill   = cols,
  )

Nhận xét

Kết quả phân tích cho thấy phần lớn người dân trong mẫu khảo sát đã kết hôn, chiếm khoảng 65,54%, trong khi tỷ lệ người độc thân là 34,46%. Điều này phản ánh rằng đa số người được khảo sát đang sống trong các mối quan hệ hôn nhân chính thức.

Phần 3: Phân tích sự tác động của các biến lên việc tham gia công đoàn (union)

3.1 Biến union và gender

3.1.1 Bảng tần suất chéo và trực quan hóa

Bảng tần suất chéo

b1<- table(k_cat$union,k_cat$gender)
addmargins(b1) 
##      
##       male female Sum
##   no   221    217 438
##   yes   68     28  96
##   Sum  289    245 534

Bảng tần suất chéo theo tỷ lệ hàng

prop.table(b1, margin = 1)
##      
##            male    female
##   no  0.5045662 0.4954338
##   yes 0.7083333 0.2916667

Trực quan hóa

# Chuyển sang data frame
b1_df <- as.data.frame(b1)
colnames(b1_df) <- c("union", "gender", "Frequency")
# Vẽ biểu đồ từ bảng tần suất
ggplot(b1_df, aes(x = union, y = Frequency, fill = gender)) +
  geom_bar(stat = "identity", position = "dodge") +
  labs(
    title = "Biểu đồ tần suất giữa union và gender",
    x = "union",
    y = "Tần suất"
  ) +
  theme_minimal()

Nhận xét: Tỷ lệ tham gia công đoàn (union = “yes”) thấp hơn rõ rệt so với không tham gia (union = “no”) ở cả nam và nữ. Cụ thể, tổng số người không tham gia công đoàn là 438 người, chiếm khoảng 82% tổng thể (438/534), trong khi chỉ có 96 người tham gia tương đương khoảng 18%. Trong nhóm tham gia công đoàn, nam giới chiếm tỷ lệ vượt trội với 68 người (70.8%), còn nữ giới chỉ chiếm 28 người (29.2%), cho thấy nam giới có xu hướng tham gia công đoàn cao hơn đáng kể so với nữ giới. Ngược lại, trong nhóm không tham gia công đoàn, tỷ lệ nam và nữ gần như bằng nhau, lần lượt là 50.5% và 49.5%, điều này cho thấy không có sự khác biệt đáng kể về giới tính trong nhóm không tham gia công đoàn.

3.1.2 Kiểm định thống kê (Kiểm định Chi-bình phương)

Để đánh giá xem có mối liên hệ có ý nghĩa thống kê giữa hai biến phân loại là union và gender hay không, sẽ sử dụng kiểm định Chi-bình phương (Chi-square test).

# Kiểm định
chisq_result <- chisq.test(b1)
# In kết quả
chisq_result
## 
##  Pearson's Chi-squared test with Yates' continuity correction
## 
## data:  b1
## X-squared = 12.359, df = 1, p-value = 0.0004388

Giả thuyết:

\[ \left\{ \begin{array}{ll} H_0: & \text{Biến union và biến gender không có mối quan hệ.} \\\\ H_1: & \text{Biến union và biến gender có mối quan hệ.} \ \end{array} \right. \]

Nhận xét: Kết quả kiểm định: Với mức ý nghĩa 0.05, vì p-value = 0.0004388 < 0.05, bác bỏ giả thuyết \(H_0\). Vậy giữa biến union và biến gender tồn tại mối quan hệ.

3.1.3 Relative risk

Nhằm phân tích mối quan hệ giữa các biến, chúng ta sử dụng chỉ số Relative Risk (RR) để đo lường mức độ rủi ro hoặc khả năng xảy ra của một sự kiện.

TH1: Không tham gia công đoàn là biến tham chiếu

rr1<- riskratio(b1)
rr1
## $data
##        
##         male female Total
##   no     221    217   438
##   yes     68     28    96
##   Total  289    245   534
## 
## $measure
##      risk ratio with 95% C.I.
##        estimate     lower     upper
##   no  1.0000000        NA        NA
##   yes 0.5887097 0.4250407 0.8154021
## 
## $p.value
##      two-sided
##         midp.exact fisher.exact   chi.square
##   no            NA           NA           NA
##   yes 0.0002542858 0.0002800058 0.0002849038
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"

Nhận xét: Kết quả phân tích Relative Risk (RR) giữa tình trạng tham gia công đoàn (union) và giới tính (gender) cho thấy sự khác biệt rõ rệt giữa việc tham gia và không tham gia công đoàn. Cụ thể, không tham gia công đoàn được chọn làm nhóm tham chiếu với RR = 1.00, trong khi việc tham gia công đoàn có RR = 0.5887 tức là tỷ lệ tham gia công đoàn ở nữ chỉ bằng khoảng 58.87% so tỷ lệ không tham gia công đoàn. Khoảng tin cậy 95% của RR nằm trong khoảng từ 0.4250 đến 0.8154, không bao gồm 1, cho thấy sự khác biệt này có ý nghĩa thống kê. Các kiểm định đi kèm như kiểm định mid-p exact, Fisher’s exact và Chi-square đều cho giá trị p rất nhỏ (p < 0.001), củng cố thêm bằng chứng rằng sự khác biệt về tỷ lệ tham gia công đoàn giữa nam và nữ.

TH2: Tham gia công đoàn là biến tham chiếu

rr1r<- riskratio(b1, rev="r")
rr1r
## $data
##        
##         male female Total
##   yes     68     28    96
##   no     221    217   438
##   Total  289    245   534
## 
## $measure
##      risk ratio with 95% C.I.
##       estimate    lower    upper
##   yes  1.00000       NA       NA
##   no   1.69863 1.226389 2.352716
## 
## $p.value
##      two-sided
##         midp.exact fisher.exact   chi.square
##   yes           NA           NA           NA
##   no  0.0002542858 0.0002800058 0.0002849038
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"

Nhận xét: Kết quá Relatiev Risk (RR) giữ tình trạng tham gia công đoàn (union) và giới tính (gender) cho thấy sự khác biệt rõ rệt giữa việc tham gia và không tham gia công đoàn. Cụ thể, tham gia công đoàn được chọn làm biến tham chiếu với RR=1, trong khi việc không tham gia công đoàncos RR = 1.69863 tức là tỷ lệ không tham gia công đòa ở nữ cao hơn 69,86% tỷ lệ tham gia công đoàn ở nữ. Khoảng tin cậy 95% của RR nằm trong khoảng từ 1.226 đến 2.353. Các kiểm định đi kèm như mid-p exact, Fisher’s exact và Chi-square đều cho giá trị p < 0.005, củng cố bằng chứng rằng tỷ lệ không tham gia công đoàn ở nữ giới cao hơn rõ rệt.

3.1.4 Odd ratio

or1 <- oddsratio(b1)
or1
## $data
##        
##         male female Total
##   no     221    217   438
##   yes     68     28    96
##   Total  289    245   534
## 
## $measure
##      odds ratio with 95% C.I.
##       estimate     lower     upper
##   no   1.00000        NA        NA
##   yes  0.42126 0.2572726 0.6737883
## 
## $p.value
##      two-sided
##         midp.exact fisher.exact   chi.square
##   no            NA           NA           NA
##   yes 0.0002542858 0.0002800058 0.0002849038
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "median-unbiased estimate & mid-p exact CI"

Nhận xét: Kết quả phân tích cho thấy khả năng tham gia công đoàn ở nữ thấp hơn đáng kể so với nam giới. Tỷ số chênh (Odds Ratio – OR) được ước lượng là 0.4213, nghĩa là xác suất tham gia công đoàn ở nữ giới chỉ bằng khoảng 42.1% so với xác suất không tham gia công đoàn ở nữ, hay nói cách khác nữ giới ít có khả năng tham gia công đoàn hơn. Khoảng tin cậy 95% của OR nằm trong khoảng [0.2573; 0.6738],các kiểm định đi kèm như mid-p exact, Fisher’s exact và Chi-square đều cho p-value < 0.001, chứng minh rằng sự khác biệt này là có ý nghĩa thống kê.

3.2 Biến union và occupation

3.2.1 Bảng tần suất chéo và trực quan hóa

Bảng tần suất chéo

b2<- table(k_cat$union,k_cat$occupation)
addmargins(b2) 
##      
##       worker technical services office sales management Sum
##   no     112        82       66     89    37         52 438
##   yes     44        23       17      8     1          3  96
##   Sum    156       105       83     97    38         55 534

Bảng tần suất chéo theo tỷ lệ hàng

prop.table(b2, margin = 1)
##      
##           worker  technical   services     office      sales management
##   no  0.25570776 0.18721461 0.15068493 0.20319635 0.08447489 0.11872146
##   yes 0.45833333 0.23958333 0.17708333 0.08333333 0.01041667 0.03125000

Trực quan hóa

# Chuyển sang data frame
b2_df <- as.data.frame(b2)
colnames(b2_df) <- c("union", "occupation", "Frequency")
# Vẽ biểu đồ từ bảng tần suất
ggplot(b2_df, aes(x = union, y = Frequency, fill = occupation)) +
  geom_bar(stat = "identity", position = "dodge") +
  labs(
    title = "Biểu đồ tần suất giữa union và occupation",
    x = "union",
    y = "Tần suất"
  ) +
  theme_minimal()

Nhận xét: Biểu đồ thể hiện tần suất giữa việc tham gia công đoàn (union) và các nhóm nghề nghiệp (occupation) cho thấy sự khác biệt rõ rệt giữa các nhóm. Nhìn chung, tỷ lệ tham gia công đoàn cao nhất thuộc về nhóm lao động phổ thông (worker) với khoảng 28,2%, tiếp theo là technical (21,9%) và services (20,5%). Ngược lại, các nhóm như office, management và sales có tỷ lệ tham gia rất thấp, lần lượt khoảng 8,2%, 5,5% và chỉ 2,6%. Điều này phản ánh xu hướng những người làm các công việc tay chân hoặc kỹ thuật thường đối mặt với điều kiện lao động khó khăn hơn nên có nhu cầu tham gia công đoàn để bảo vệ quyền lợi.

3.2.2 Kiểm định thống kê (Kiểm định Chi-bình phương)

Để đánh giá xem có mối liên hệ có ý nghĩa thống kê giữa hai biến phân loại là union và occupation hay không, sẽ sử dụng kiểm định Chi-bình phương (Chi-square test).

# Kiểm định
chisq_result <- chisq.test(b2)
# In kết quả
chisq_result
## 
##  Pearson's Chi-squared test
## 
## data:  b2
## X-squared = 30.664, df = 5, p-value = 1.091e-05

Giả thuyết:

\[ \left\{ \begin{array}{ll} H_0: & \text{Biến union và biến occupation không có mối quan hệ.} \\\\ H_1: & \text{Biến union và biến occupation có mối quan hệ.} \ \end{array} \right. \]

Nhận xét: Kết quả kiểm định: Với mức ý nghĩa 0.05, vì p-value = 1.091e-05 < 0.05, bác bỏ giả thuyết \(H_0\). Vậy giữa biến union và biến occupation tồn tại mối quan hệ.

3.2.3 Relative risk

Nhằm phân tích mối quan hệ giữa các biến, chúng ta sử dụng chỉ số Relative Risk (RR) để đo lường mức độ rủi ro hoặc khả năng xảy ra của một sự kiện.

prop.table(b2, margin = 1)
##      
##           worker  technical   services     office      sales management
##   no  0.25570776 0.18721461 0.15068493 0.20319635 0.08447489 0.11872146
##   yes 0.45833333 0.23958333 0.17708333 0.08333333 0.01041667 0.03125000

Kết hợp dữ liệu nhóm ngành nghề thành hai nhóm chính: nhóm công nhân (worker) và nhóm other bao gồm technical, services, office và management.

b2_new <- cbind(   # kết hợp hai cột này thành một bảng dữ liệu mới gọi là k4_new.
  worker = b2[, "worker"],  #lấy dữ liệu cột "cauc" từ bảng k4
  other = b2[, "technical"] + b2[, "services"]+b2[, "office"] +b2[, "sales"] + b2[, "management"]# cộng dữ liệu hai cột "hispanic" và "other" từ bảng k4.
)
b2_new
##     worker other
## no     112   326
## yes     44    52

TH1: Không tham gia công đoàn là biến tham chiếu

rr2<- riskratio(b2_new)
rr2
## $data
##       worker other Total
## no       112   326   438
## yes       44    52    96
## Total    156   378   534
## 
## $measure
##                         NA
## risk ratio with 95% C.I.  estimate     lower    upper
##                      no  1.0000000        NA       NA
##                      yes 0.7277607 0.6006131 0.881825
## 
## $p.value
##          NA
## two-sided   midp.exact fisher.exact   chi.square
##       no            NA           NA           NA
##       yes 0.0001361793  0.000170972 7.687681e-05
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"

Nhận xét: Kết quả phân tích Relative Risk (RR) giữa tình trạng tham gia công đoàn (union) và nhóm ngành nghề chính (worker) cho thấy sự khác biệt rõ rệt giữa việc tham gia và không tham gia công đoàn. Cụ thể, không tham gia công đoàn được chọn làm nhóm tham chiếu với RR = 1.00, trong khi việc tham gia công đoàn có RR = 0.7277 tức là tỷ lệ tham gia công đoàn ở các ngành nghề khác chỉ bằng khoảng 72.77% so tỷ lệ không tham gia công đoàn. Các kiểm định đi kèm như kiểm định mid-p exact, Fisher’s exact và Chi-square đều cho giá trị p rất nhỏ (p < 0.001), củng cố thêm bằng chứng rằng sự khác biệt về tỷ lệ tham gia công đoàn giữa ngành công nhân và các ngành nghề khác.

TH2: Tham gia công đoàn là biến tham chiếu

rr2r<- riskratio(b2_new, rev="c")
rr2r
## $data
##       other worker Total
## no      326    112   438
## yes      52     44    96
## Total   378    156   534
## 
## $measure
##                         NA
## risk ratio with 95% C.I. estimate    lower    upper
##                      no  1.000000       NA       NA
##                      yes 1.792411 1.368495 2.347642
## 
## $p.value
##          NA
## two-sided   midp.exact fisher.exact   chi.square
##       no            NA           NA           NA
##       yes 0.0001361793  0.000170972 7.687681e-05
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"

Nhận xét: Kết quả phân tích Relative Risk (RR) giữa tình trạng tham gia công đoàn (union) và nhóm ngành nghề chính (worker) cho thấy sự khác biệt rõ rệt giữa việc tham gia và không tham gia công đoàn. Cụ thể, không tham gia công đoàn được chọn làm nhóm tham chiếu với RR = 1.00, trong khi tham gia công đoàn có RR = 1.7924 tức là tỷ lệ tham gia công đoàn ở các ngành nghề công nhân cao hơn 79.24% so tỷ lệ không tham gia công đoàn ở ngành công nhân. Các kiểm định đi kèm như kiểm định mid-p exact, Fisher’s exact và Chi-square đều cho giá trị p rất nhỏ (p < 0.05), củng cố thêm bằng chứng rằng sự khác biệt về tỷ lệ tham gia công đoàn giữa ngành công nhân và các ngành nghề khác.

3.2.4 Odd ratio

or2 <- oddsratio(b2_new)
or2
## $data
##       worker other Total
## no       112   326   438
## yes       44    52    96
## Total    156   378   534
## 
## $measure
##                         NA
## odds ratio with 95% C.I.  estimate     lower     upper
##                      no  1.0000000        NA        NA
##                      yes 0.4067117 0.2576189 0.6432423
## 
## $p.value
##          NA
## two-sided   midp.exact fisher.exact   chi.square
##       no            NA           NA           NA
##       yes 0.0001361793  0.000170972 7.687681e-05
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "median-unbiased estimate & mid-p exact CI"

Nhận xét: Kết quả phân tích cho thấy khả năng tham gia công đoàn ở các ngành nghề khác thấp hơn đáng kể so với ngành công nhân. Tỷ số chênh (Odds Ratio – OR) được ước lượng là 0.4067, nghĩa là xác suất tham gia công đoàn ở các ngành nghề khác bằng khoảng 40.67% so với tỷ lệ không tham gia công đoàn ở ngành khác. Khoảng tin cậy 95% của OR nằm trong khoảng [0.2576; 0.6432],các kiểm định đi kèm như mid-p exact, Fisher’s exact và Chi-square đều cho p-value < 0.001, chứng minh rằng sự khác biệt này là có ý nghĩa thống kê.

3.3 Biến union và married

3.3.1 Bảng tần suất chéo và trực quan hóa

Bảng tần suất chéo

b3<- table(k_cat$union,k_cat$married)
addmargins(b3) 
##      
##         S   M Sum
##   no  160 278 438
##   yes  24  72  96
##   Sum 184 350 534

Bảng tần suất chéo theo tỷ lệ hàng

prop.table(b3, margin = 1)
##      
##               S         M
##   no  0.3652968 0.6347032
##   yes 0.2500000 0.7500000

Trực quan hóa

# Chuyển sang data frame
b3_df <- as.data.frame(b3)
colnames(b3_df) <- c("union", "married", "Frequency")
# Vẽ biểu đồ từ bảng tần suất
ggplot(b3_df, aes(x = union, y = Frequency, fill = married)) +
  geom_bar(stat = "identity", position = "dodge") +
  labs(
    title = "Biểu đồ tần suất giữa union và married",
    x = "union",
    y = "Tần suất"
  ) +
  theme_minimal()

Nhận xét: Biểu đồ thể hiện tần suất giữa việc tham gia công đoàn (union) và tình trạng hôn nhân (married) cho thấy sự khác biệt rõ rệt giữa hai nhóm: độc thân (S) và đã kết hôn (M). Trong nhóm không tham gia công đoàn (union = no) phần lớn là người đã kết hôn (278 người, chiếm khoảng 63,5%) và còn lại là người độc thân (160 người, chiếm khoảng 36,5%). Trong khi đó, trong nhóm có tham gia công đoàn (union = yes), tỷ lệ người đã kết hôn càng chiếm ưu thế rõ rệt hơn (72 người, chiếm 75%), còn người độc thân chỉ có 24 người (25%). Qua đó cho thấy người đã kết hôn có xu hướng tham gia công đoàn cao hơn người độc thân phản ánh rằng người đã lập gia đình thường có xu hướng quan tâm nhiều hơn đến sự ổn định và quyền lợi trong công việc, nên họ chủ động hơn trong việc tham gia các tổ chức đại diện như công đoàn.

3.3.2 Kiểm định thống kê (Kiểm định Chi-bình phương)

Để đánh giá xem có mối liên hệ có ý nghĩa thống kê giữa hai biến phân loại là union và married hay không, sẽ sử dụng kiểm định Chi-bình phương (Chi-square test).

# Kiểm định
chisq_result <- chisq.test(b3)
# In kết quả
chisq_result
## 
##  Pearson's Chi-squared test with Yates' continuity correction
## 
## data:  b3
## X-squared = 4.1384, df = 1, p-value = 0.04192

Giả thuyết:

\[ \left\{ \begin{array}{ll} H_0: & \text{Biến union và biến married không có mối quan hệ.} \\\\ H_1: & \text{Biến union và biến married có mối quan hệ.} \ \end{array} \right. \]

Nhận xét: Kết quả kiểm định: Với mức ý nghĩa 0.05, vì p-value = 0.04192 < 0.05, bác bỏ giả thuyết \(H_0\). Vậy giữa biến union và biến married tồn tại mối quan hệ.

3.3.3 Relative risk

Nhằm phân tích mối quan hệ giữa các biến, chúng ta sử dụng chỉ số Relative Risk (RR) để đo lường mức độ rủi ro hoặc khả năng xảy ra của một sự kiện.

prop.table(b3, margin = 1)
##      
##               S         M
##   no  0.3652968 0.6347032
##   yes 0.2500000 0.7500000

TH1: Không tham gia công đoàn là biến tham chiếu

rr3<- riskratio(b3)
rr3
## $data
##        
##           S   M Total
##   no    160 278   438
##   yes    24  72    96
##   Total 184 350   534
## 
## $measure
##      risk ratio with 95% C.I.
##       estimate    lower    upper
##   no  1.000000       NA       NA
##   yes 1.181655 1.031816 1.353253
## 
## $p.value
##      two-sided
##       midp.exact fisher.exact chi.square
##   no          NA           NA         NA
##   yes 0.02981075   0.03303146 0.03132896
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"

Nhận xét: Kết quả phân tích Relative Risk (RR) giữa tình trạng tham gia công đoàn (union) và tình trạng hôn nhân (married) cho thấy sự khác biệt rõ rệt giữa việc tham gia và không tham gia công đoàn. Cụ thể, không tham gia công đoàn được chọn làm nhóm tham chiếu với RR = 1.00, trong khi tham gia công đoàn có RR = 1.1816 tức là tỷ lệ tham gia công đoàn ở người đã kết hôn cao hơn 18.16% so tỷ lệ không tham gia công đoàn ở ngườiđã kết hôn. Các kiểm định đi kèm như kiểm định mid-p exact, Fisher’s exact và Chi-square đều cho giá trị p rất nhỏ (p < 0.05), củng cố thêm bằng chứng rằng sự khác biệt về tỷ lệ tham gia công đoàn giữa ngành công nhân và các ngành nghề khác.

TH2: Tham gia công đoàn là biến tham chiếu

rrr3r<- riskratio(b3, rev="c")
rrr3r
## $data
##        
##           M   S Total
##   no    278 160   438
##   yes    72  24    96
##   Total 350 184   534
## 
## $measure
##      risk ratio with 95% C.I.
##       estimate     lower    upper
##   no  1.000000        NA       NA
##   yes 0.684375 0.4737577 0.988626
## 
## $p.value
##      two-sided
##       midp.exact fisher.exact chi.square
##   no          NA           NA         NA
##   yes 0.02981075   0.03303146 0.03132896
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"

Nhận xét: Kết quả phân tích Relative Risk (RR) giữa tình trạng tham gia công đoàn (union) và tình trạng hôn nhân (married) cho thấy sự khác biệt rõ rệt giữa việc tham gia và không tham gia công đoàn. Cụ thể, tham gia công đoàn được chọn làm nhóm tham chiếu với RR = 1.00, trong khi không tham gia công đoàn có RR = 0.6843 tức là tỷ lệ tham gia công đoàn ở người chưa kết hôn bằng khoảng 68,43% so tỷ lệ không tham gia công đoàn ở người chưa kết hôn. Các kiểm định đi kèm như kiểm định mid-p exact, Fisher’s exact và Chi-square đều cho giá trị p rất nhỏ (p < 0.05), củng cố thêm bằng chứng rằng sự khác biệt về tỷ lệ tham gia công đoàn giữa ngành công nhân và các ngành nghề khác.

3.3.4 Odd ratio

or2 <- oddsratio(b3)
or2
## $data
##        
##           S   M Total
##   no    160 278   438
##   yes    24  72    96
##   Total 184 350   534
## 
## $measure
##      odds ratio with 95% C.I.
##       estimate    lower    upper
##   no  1.000000       NA       NA
##   yes 1.718401 1.053111 2.890456
## 
## $p.value
##      two-sided
##       midp.exact fisher.exact chi.square
##   no          NA           NA         NA
##   yes 0.02981075   0.03303146 0.03132896
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "median-unbiased estimate & mid-p exact CI"

Nhận xét: Kết quả phân tích cho thấy khả năng tham gia công đoàn ở người đã kết hôn cao hơn đáng kể so với khả năng tham gia công đoàn ở người chưa kết hôn. Tỷ số chênh (Odds Ratio – OR) được ước lượng là 1.7184, nghĩa là xác suất tham gia công đoàn ở người đã kết hôn cao hơn 71.84% so với xác suất không tham gia công đoàn ở người đã kết hôn. Khoảng tin cậy 95% của OR nằm trong khoảng [1.0531;2.8904],các kiểm định đi kèm như mid-p exact, Fisher’s exact và Chi-square đều cho p-value < 0.05, chứng minh rằng sự khác biệt này là có ý nghĩa thống kê.

Phần 4; Phân tích sự tác động của các biến lên biến giới tính (gender)

4.1 Biến gender và biến sector

4.1.1 Bảng tần suất chéo và trực quan hóa

Bảng tần suất chéo

e1<- table(k_cat$gender, k_cat$sector)
addmargins(e1) 
##         
##          manufacturing construction other Sum
##   male              60           22   207 289
##   female            39            2   204 245
##   Sum               99           24   411 534

Bảng tần suất chéo theo tỷ lệ hàng

prop.table(e1, margin = 1)
##         
##          manufacturing construction       other
##   male     0.207612457  0.076124567 0.716262976
##   female   0.159183673  0.008163265 0.832653061

Trực quan hóa

# Chuyển sang data frame
e1_df <- as.data.frame(e1)
colnames(e1_df) <- c("gender", "sector", "Frequency")
# Vẽ biểu đồ từ bảng tần suất
ggplot(e1_df, aes(x = gender, y = Frequency, fill =sector )) +
  geom_bar(stat = "identity", position = "dodge") +
  labs(
    title = "Biểu đồ tần suất giữa sector và gender",
    x = "gender",
    y = "Tần suất"
  ) +
  theme_minimal()

Nhận xét: Biểu đồ thể hiện mối quan hệ giữa ngành nghề (sector) và giới tính (gender) cho thấy sự phân bố không đồng đều giữa nam và nữ trong các lĩnh vực. Ngành xây dựng có tỷ lệ nam giới chiếm ưu thế tuyệt đối với 91,7%, trong khi nữ giới chỉ chiếm 8,3%. Ngành sản xuất cũng có sự chênh lệch, khi nam giới chiếm 60,6% và nữ giới là 39,4%. Ngược lại, nhóm ngành “other” lại có sự phân bố giới tính khá cân bằng, với khoảng 50,4% nam và 49,6% nữ. Điều này phản ánh thực trạng định kiến giới trong lựa chọn nghề nghiệp, khi các ngành đòi hỏi lao động thể chất như xây dựng vẫn chủ yếu là nam giới, còn các ngành khác có xu hướng mở rộng hơn cho cả nam và nữ.

4.1.2 Kiểm định thống kê (Kiểm định Chi-bình phương)

Để đánh giá xem có mối liên hệ có ý nghĩa thống kê giữa hai biến phân loại là sector và gender hay không, sẽ sử dụng kiểm định Chi-bình phương (Chi-square test).

# Kiểm định
chisq_result <- chisq.test(e1)
# In kết quả
chisq_result
## 
##  Pearson's Chi-squared test
## 
## data:  e1
## X-squared = 17.637, df = 2, p-value = 0.0001479

Giả thuyết:

\[ \left\{ \begin{array}{ll} H_0: & \text{Biến gender và biến sector không có mối quan hệ.} \\\\ H_1: & \text{Biến gender và biến sector có mối quan hệ.} \ \end{array} \right. \]

Nhận xét: Kết quả kiểm định: Với mức ý nghĩa 0.05, vì p-value = 0.0001479 < 0.05, bác bỏ giả thuyết \(H_0\). Vậy giữa Biến sector và biến gender tồn tại mối quan hệ.

4.1.3 Relative risk

e1_new <- cbind(   
  construction= e1[, "construction"],  
  other = e1[, "manufacturing"] + e1[, "other"] 
)
e1_new
##        construction other
## male             22   267
## female            2   243

Nhằm phân tích mối quan hệ giữa các biến, chúng ta sử dụng chỉ số Relative Risk (RR) để đo lường mức độ rủi ro hoặc khả năng xảy ra của một sự kiện.

rrs1<- riskratio(e1_new, rev="c")
rrs1
## $data
##        other construction Total
## male     267           22   289
## female   243            2   245
## Total    510           24   534
## 
## $measure
##                         NA
## risk ratio with 95% C.I.  estimate      lower     upper
##                   male   1.0000000         NA        NA
##                   female 0.1072356 0.02547102 0.4514731
## 
## $p.value
##          NA
## two-sided   midp.exact fisher.exact   chi.square
##    male             NA           NA           NA
##    female 7.027025e-05  8.38247e-05 0.0001585815
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"

Nhận xét: Kết quả phân tích Relative Risk (RR) giữa khu vực kinh tế (sector) và giới tính (gender) cho thấy sự khác biệt rõ rệt giữa các khu vực kinh tế. Cụ thể, giới tính nam được chọn làm nhóm tham chiếu với RR = 1.00, trong khi giưới tính nữ có RR = 0.1072 tức là tỷ lệ nữ ở các ngành xây dựng chỉ bằng khoảng 10.72% so tỷ lệ nam ở các ngành xây dựng. Các kiểm định đi kèm như kiểm định mid-p exact, Fisher’s exact và Chi-square đều cho giá trị p rất nhỏ (p < 0.05), củng cố thêm bằng chứng rằng sự khác biệt về tỷ lệ tham gia công đoàn giữa ngành công nhân và các ngành nghề khác.

4.1.4 Odd ratio

or1s<-oddsratio(e1_new)
or1s
## $data
##        construction other Total
## male             22   267   289
## female            2   243   245
## Total            24   510   534
## 
## $measure
##                         NA
## odds ratio with 95% C.I. estimate    lower   upper
##                   male   1.000000       NA      NA
##                   female 9.337391 2.697792 63.5094
## 
## $p.value
##          NA
## two-sided   midp.exact fisher.exact   chi.square
##    male             NA           NA           NA
##    female 7.027025e-05  8.38247e-05 0.0001585815
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "median-unbiased estimate & mid-p exact CI"

Nhận xét

Dựa trên kết quả phân tích Odds Ratio (OR) giữa biến sector và gender. Giới tính nam được chọn làm nhóm tham chiếu (OR = 1.00), nên các Odds Ratio của giưới tính nữ sẽ so sánh. Với giới tính nữ, Odds Ratio = 9.337391 và giá trị p đều nhỏ hơn 0.01 cho tất cả các phương pháp kiểm định. Cụ thể, xác suất nữ giới làm việc trong ngành khác cao hơn 9 lần so với nam trong nhóm ngành khác

4.2 Biến gender và biến union

Để hiểu rõ hơn mối quan hệ giữa nhóm giới tính (gender) và nhóm tình trạng tham gia công đoàn (union), chúng ta sẽ xây dựng bảng tần suất chéo thể hiện số lượng từng kết hợp giữa hai biến này. Sau đó, biểu đồ cột sẽ được sử dụng để trực quan hóa sự phân bố của nhóm tình trạng tham gia công đoàn theo từng giới tính, giúp quan sát dễ dàng sự khác biệt và xu hướng tiêu dùng giữa các nhóm.

4.2.1 Bảng tần suất chéo và trực quan hóa

Bảng tần suất chéo

e2 <- table(k_cat$gender,k_cat$union)
addmargins(e2) 
##         
##           no yes Sum
##   male   221  68 289
##   female 217  28 245
##   Sum    438  96 534

Bảng tần suất chéo theo tỷ lệ hàng

prop.table(e2, margin = 1)
##         
##                 no       yes
##   male   0.7647059 0.2352941
##   female 0.8857143 0.1142857

Trực quan hóa

# Chuyển sang data frame
e2_df <- as.data.frame(e2)
colnames(e2_df) <- c("gender", "union", "Frequency")
# Vẽ biểu đồ từ bảng tần suất
ggplot(e2_df, aes(x = gender, y = Frequency, fill = union)) +
  geom_bar(stat = "identity", position = "dodge") +
  labs(
    title = "Biểu đồ tần số giữa gender và union",
    x = "gender",
    y = "Tần số"
  ) +
  theme_minimal()

Nhận xét

Dựa vào biểu đồ trên ta thấy tỷ lệ nam giới tham gia công đoàn cao hơn nữ giới. Cụ thể, trong tổng số 289 nam thì có 68 người tham gia công đoàn chiếm khoảng 23,5%, trong khi ở nữ giới chỉ có 28 trên tổng số 245 người tham gia chiếm khoảng 11,4%. Điều này cho thấy nam giới có xu hướng gắn kết với công đoàn nhiều hơn so với nữ giới, phản ánh sự khác biệt về mức độ tham gia tổ chức lao động giữa hai giới. Tuy nhiên tổng thể thì nam và nữ điều không có xu hướng tham gia công đoàn bởi tỷ lệ nam và nư không tham gia chiếm tỷ lệ rất lớn.

4.2.2 Kiểm định thống kê (Kiểm định Chi-bình phương)

Để đánh giá xem có mối liên hệ có ý nghĩa thống kê giữa hai biến phân loại là gender và union hay không, sẽ sử dụng kiểm định Chi-bình phương (Chi-square test).

# Kiểm định
chisq_result <- chisq.test(e2)

# In kết quả
chisq_result
## 
##  Pearson's Chi-squared test with Yates' continuity correction
## 
## data:  e2
## X-squared = 12.359, df = 1, p-value = 0.0004388

Giả thuyết:

\[ \left\{ \begin{array}{ll} H_0: & \text{Biến gender và biến union không có mối quan hệ.} \\\\ H_1: & \text{Biến gender và biến union có mối quan hệ.} \ \end{array} \right. \]

Nhận xét: Kết quả kiểm định: Với mức ý nghĩa 0.05, vì p-value = 0.0004388 < 0.05, bác bỏ giả thuyết \(H_0\). Vậy giữa biến gender và biến union tồn tại mối quan hệ.

4.2.3 Relative Risk

TH1: Nam làm biến tham chiếu

Nhằm phân tích mối quan hệ giữa các biến, chúng ta sử dụng chỉ số Relative Risk (RR) để đo lường mức độ rủi ro hoặc khả năng xảy ra của một sự kiện.

rr2<- riskratio(e2)
rr2
## $data
##         
##           no yes Total
##   male   221  68   289
##   female 217  28   245
##   Total  438  96   534
## 
## $measure
##         risk ratio with 95% C.I.
##           estimate     lower     upper
##   male   1.0000000        NA        NA
##   female 0.4857143 0.3236845 0.7288529
## 
## $p.value
##         two-sided
##            midp.exact fisher.exact   chi.square
##   male             NA           NA           NA
##   female 0.0002542858 0.0002800058 0.0002849038
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"

Nhận xét: Kết quả phân tích Relative Risk (RR) giữa giới tính (gender) và tình trạng tham gia công đoàn (union) cho thấy sự khác biệt rõ rệt giữa nam và nữ. Cụ thể, nam giới được chọn làm nhóm tham chiếu với RR = 1.00, trong khi nữ giới có RR = 0.486 tức là khả năng nữ tham gia công đoàn chi bằng khoảng 48.6% so với nam tham gia công đoàn. Khoảng tin cậy 95% cho RR của nữ nằm trong khoảng từ 0.324 đến 0.729, cho thấy kết quả này có độ tin cậy cao. Hơn nữa, các kiểm định thống kê (midp.exact, fisher.exact, chi.square) đều cho giá trị p rất nhỏ (< 0.05), chứng tỏ sự khác biệt này có ý nghĩa thống kê.

TH2: Nam làm biến tham chiếu

rr3<- riskratio(e2, rev ="c")
rr3
## $data
##         
##          yes  no Total
##   male    68 221   289
##   female  28 217   245
##   Total   96 438   534
## 
## $measure
##         risk ratio with 95% C.I.
##          estimate    lower    upper
##   male   1.000000       NA       NA
##   female 1.158242 1.071133 1.252435
## 
## $p.value
##         two-sided
##            midp.exact fisher.exact   chi.square
##   male             NA           NA           NA
##   female 0.0002542858 0.0002800058 0.0002849038
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"

Nhận xét: Kết quả phân tích Relative Risk (RR) giữa giới tính (gender) và tình trạng tham gia công đoàn (union) cho thấy sự khác biệt rõ rệt giữa nam và nữ. Cụ thể, nam giới được chọn làm nhóm tham chiếu với RR = 1.00, trong khi nữ giới có RR = 1.158 tức là khả năng nữ không tham gia công đoàn cao hơn 15.8% so với nam không tham gia công đoàn. Khoảng tin cậy 95% cho RR của nữ nằm trong khoảng từ 1.0711 đến 1.252, cho thấy kết quả này có độ tin cậy cao. Hơn nữa, các kiểm định thống kê (midp.exact, fisher.exact, chi.square) đều cho giá trị p rất nhỏ (< 0.05), chứng tỏ sự khác biệt này có ý nghĩa thống kê.

4.2.4 Odds ratio

orgu <- oddsratio(e2)
orgu
## $data
##         
##           no yes Total
##   male   221  68   289
##   female 217  28   245
##   Total  438  96   534
## 
## $measure
##         odds ratio with 95% C.I.
##          estimate     lower     upper
##   male    1.00000        NA        NA
##   female  0.42126 0.2572726 0.6737883
## 
## $p.value
##         two-sided
##            midp.exact fisher.exact   chi.square
##   male             NA           NA           NA
##   female 0.0002542858 0.0002800058 0.0002849038
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "median-unbiased estimate & mid-p exact CI"

Nhận xét

Dựa trên kết quả phân tích Odds Ratio (OR) giữa biến sector và gunion. Giới tính nam được chọn làm nhóm tham chiếu (OR = 1.00), nên các Odds Ratio của giơi tính nữ sẽ so sánh. Với giới tính nữ, Odds Ratio = 0.42126 và giá trị p đều nhỏ hơn 0.01 cho tất cả các phương pháp kiểm định. Cụ thể, xác suất nữ giới tham gia công đoàn chỉ bằng 42.126% so với nam tham gia công đoàn.

Ước lượng hợp lý tối đa (Maximum Likelihood Estimation - MLE)

Trong thống kê và học máy, dữ liệu thực nghiệm thường được giả định là phát sinh từ một phân phối xác suất cụ thể, với một số tham số chưa biết. Mục tiêu của người phân tích là ước lượng những tham số này sao cho phân phối mô hình phù hợp nhất với dữ liệu thực tế.

Một trong những phương pháp nền tảng để làm điều đó là ước lượng hợp lý tối đa (Maximum Likelihood Estimation - MLE). MLE tìm bộ tham số \(\mathbf{w}\) sao cho xác suất quan sát được tập dữ liệu \(\mathcal{D}\) là lớn nhất dưới mô hình đã giả định. Hàm biểu diễn xác suất này được gọi là hàm hợp lý và ký hiệu là:

\[ L(\mathbf{w}) = P(\mathcal{D}|\mathbf{w}) \]

Giả sử tập dữ liệu gồm \(N\) quan sát độc lập và đồng phân phối (i.i.d) là \(\{x_1, x_2, \ldots, x_N\}\), khi đó hàm hợp lý có thể viết lại như sau:

\[ L(\mathbf{w}) = \prod_{i=1}^{N} P(x_i|\mathbf{w}) \]

Do tích nhiều xác suất nhỏ dễ gây tràn số khi tính toán, ta thường dùng logarit của hàm hợp lý (log-likelihood):

\[ \ell(\mathbf{w}) = \log L(\mathbf{w}) = \sum_{i=1}^{N} \log P(x_i|\mathbf{w}) \]

Bài toán MLE trở thành bài toán tối ưu hàm log-likelihood:

\[ \hat{\mathbf{w}} = \arg\max_{\mathbf{w}} \ell(\mathbf{w}) = \arg\max_{\mathbf{w}} \sum_{i=1}^{N} \log P(x_i|\mathbf{w}) \]

Phương pháp MLE được ứng dụng rộng rãi trong nhiều mô hình học máy như Naive Bayes, hồi quy logistic, và các mô hình dựa trên phân phối xác suất khác. Một trong những ưu điểm quan trọng của MLE là khả năng khái quát và áp dụng linh hoạt trên nhiều dạng phân phối.

Tóm lại, MLE là một phương pháp ước lượng mạnh mẽ, đóng vai trò then chốt trong việc thiết lập và huấn luyện các mô hình học máy dựa trên xác suất.

LS0tDQp0aXRsZTogIk5oaeG7h20gduG7pSBUdeG6p24gNSINCmF1dGhvcjogIlF14buzbmggSMawxqFuZyINCmRhdGU6ICJgciBmb3JtYXQoU3lzLnRpbWUoKSwgJyVIOiVNOiVTLCAlZCAtICVtIC0gJVknKWAiDQpvdXRwdXQ6DQogIGh0bWxfZG9jdW1lbnQ6DQogICAgY29kZV9mb2xkaW5nOiBoaWRlDQogICAgY29kZV9kb3dubG9hZDogdHJ1ZQ0KICAgIG51bWJlcl9zZWN0aW9uczogZmFsc2UgIA0KICAgIHRvYzogdHJ1ZQ0KICAgIHRvY19kZXB0aDogNQ0KICAgIHRvY19mbG9hdDoNCiAgICAgIGNvbGxhcHNlZDogdHJ1ZQ0KICAgICAgc21vb3RoX3Njcm9sbDogdHJ1ZQ0KICB3b3JkX2RvY3VtZW50Og0KICAgIHRvYzogdHJ1ZQ0KLS0tDQoNCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQ0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBUUlVFLCB3YXJuaW5nID0gRkFMU0UsIG1lc3NhZ2UgPSBGQUxTRSkNCmBgYA0KDQoNCmBgYHtjc3MsZWNobyA9IEZBTFNFfQ0KaDEgew0KICBmb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiIsIFRpbWVzLCBzZXJpZjsNCiAgZm9udC1zaXplOiAzMnB4Ow0KICBmb250LXdlaWdodDogYm9sZA0KICB9DQoNCmgyIHsNCiAgZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iLCBUaW1lcywgc2VyaWY7DQogIGZvbnQtc2l6ZTogMjhweDsNCiAgZm9udC13ZWlnaHQ6IGJvbGQ7DQogDQp9DQoNCmgzIHsNCiAgZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iLCBUaW1lcywgc2VyaWY7DQogIGZvbnQtc2l6ZTogMjRweDsNCiAgZm9udC13ZWlnaHQ6IGJvbGQ7DQogIGZvbnQtc3R5bGU6IGl0YWxpYzsNCn0NCg0KaDQge2ZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOw0KICBmb250LXNpemU6IDIwcHg7DQogIGZvbnQtc3R5bGU6IGl0YWxpY30NCg0KYm9keSB7DQogIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOw0KICBmb250LXNpemU6IDE4cHg7DQogIA0KfQ0KcDpub3QoaDEpOm5vdChoMik6bm90KGgzKTpub3QoaDQpOm5vdChoNSkgew0KICB0ZXh0LWluZGVudDogMmVtO30NCnAgew0KICB0ZXh0LWFsaWduOiBqdXN0aWZ5Ow0KICB9DQoudG9jaWZ5LWhlYWRlciB7DQogIGZvbnQtd2VpZ2h0OiBib2xkOw0KfQ0KDQpgYGANCg0KIyAqKk5oaeG7h20gduG7pSA1KioNCg0KYGBge3IsbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCmxpYnJhcnkodGlkeXZlcnNlKQ0KbGlicmFyeShEVCkNCmxpYnJhcnkoc2NhbGVzKQ0KbGlicmFyeShwc3ljaCkNCmxpYnJhcnkoa25pdHIpDQpsaWJyYXJ5KGthYmxlRXh0cmEpDQpsaWJyYXJ5KERlc2NUb29scykNCmxpYnJhcnkoZXBpdG9vbHMpDQpsaWJyYXJ5KEFFUikNCmxpYnJhcnkoZHBseXIpDQpgYGANCg0KDQojIyAqKlBo4bqnbiAxOlTDrG0gaGnhu4N1IHbDoCBjaHXhuqluIGLhu4sgZOG7ryBsaeG7h3UqKg0KDQojIyMgKioxLjEgR2nhu5tpIHRoaeG7h3UgYuG7mSBk4buvIGxp4buHdSoqDQoNCkLhu5kgZOG7ryBsaeG7h3UgQ1BTMTk4NSAoQ3VycmVudCBQb3B1bGF0aW9uIFN1cnZleSAxOTg1KSBsw6AgbeG7mXQgdOG6rXAgZOG7ryBsaeG7h3UgxJFp4buBdSB0cmEgY8OhIG5ow6JuIMSRxrDhu6NjIHRyw61jaCB4deG6pXQgdOG7qyBLaOG6o28gc8OhdCBEw6JuIHPhu5EgSGnhu4duIGjDoG5oIHThuqFpIEhvYSBL4buzLiBE4buvIGxp4buHdSBuw6B5IGN1bmcgY+G6pXAgdGjDtG5nIHRpbiB24buBIG3hu6ljIGzGsMahbmcgdGhlbyBnaeG7nSBjw7luZyBjw6FjIMSR4bq3YyDEkWnhu4NtIG5ow6JuIGto4bqpdSBo4buNYyB2w6Agbmdo4buBIG5naGnhu4dwIGPhu6dhIDUzNCBjw6EgbmjDom4gxJFhbmcgbMOgbSB2aeG7h2MsIGJhbyBn4buTbSBnaeG7m2kgdMOtbmgsIGNo4bunbmcgdOG7mWMsIHRyw6xuaCDEkeG7mSBo4buNYyB24bqlbiwga2luaCBuZ2hp4buHbSwgdHXhu5VpLCB0w6xuaCB0cuG6oW5nIGjDtG4gbmjDom4sIG5naOG7gSBuZ2hp4buHcCB2w6Aga2h1IHbhu7FjIGzDoG0gdmnhu4djLiANCg0KYGBge3J9DQpkYXRhKCJDUFMxOTg1IikNCms8LUNQUzE5ODUNCmRhdGF0YWJsZShrLG9wdGlvbnMgPSBsaXN0KHNjcm9sbFggPSBUUlVFKSkgI2Lhuq10IGN14buZbiBuZ2FuZw0KYGBgDQoNCmBgYHtyfQ0KbmFtZXMoaykNCmBgYA0KDQoqKkLhu5kgZOG7ryBsaeG7h3UgduG7m2kgY8OhYyBiaeG6v24gxJHhu4tuaCB0w61uaCoqDQogDQpUYSB0aOG7sWMgaGnhu4duIHThuqFvIDEgZGF0YWZyYW1lIG3hu5tpIGNo4buJIGNo4bupYSBjw6FjIGJp4bq/biDEkeG7i25oIHTDrW5oLCB0YSBnw6FuIGRhdGEgbeG7m2kgbsOgeSB2w6BvIG9iamVjdCB24bubaSB0w6puIGtfY2F0Lg0KDQpgYGB7ciwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCmNhdDwtIGMoImV0aG5pY2l0eSIsICJyZWdpb24iLCJnZW5kZXIiLCAib2NjdXBhdGlvbiIsICJzZWN0b3IiLCJ1bmlvbiIsICJtYXJyaWVkIikNCmtfY2F0PC1rWywgY2F0XQ0KIyBUaGF5IMSR4buVaSBnacOhIHRy4buLIGPhu6dhIGJp4bq/biBgY2FyZGB2w6Agb3duZXINCmtfY2F0JG1hcnJpZWQgPC0gZHBseXI6OnJlY29kZShrX2NhdCRtYXJyaWVkLCAieWVzIiA9ICJNIiAsICJubyIgPSAiUyIpDQpkYXRhdGFibGUoa19jYXQsb3B0aW9ucyA9IGxpc3Qoc2Nyb2xsWCA9IFRSVUUpKQ0KYGBgDQoNCiMjIyAqKjEuMiBD4bqldSB0csO6YyBj4bunYSBk4buvIGxp4buHdSoqIA0KDQrEkOG7gyBjw7MgY8OhaSBuaMOsbiB04buVbmcgcXVhbiB24buBIGPhuqV1IHRyw7pjIGPhu6dhIGLhu5kgZOG7ryBsaeG7h3UsIGJhbyBn4buTbSBz4buRIGzGsOG7o25nIHF1YW4gc8OhdCwgc+G7kSBsxrDhu6NuZyBiaeG6v24sIGtp4buDdSBk4buvIGxp4buHdSBj4bunYSB04burbmcgYmnhur9uIHbDoCBt4buZdCBz4buRIGdpw6EgdHLhu4sgxJFp4buDbiBow6xuaCwgdGEgc+G7rSBk4bulbmcgaMOgbSBzdHIoKSBuaMawIHNhdToNCg0KYGBge3J9DQpzdHIoaykgI0PhuqV1IHRyw7pjIHRyb25nIGThu68gbGnhu4d1DQpgYGANCg0KUXVhIGvhur90IHF14bqjIGPhu6dhIGjDoG0gc3RyKCksIHRhIHRo4bqleSBi4buZIGThu68gbGnhu4d1IHRyb25nIG5naGnDqm4gY+G7qXUgbMOgIENQUzE5ODUgKEN1cnJlbnQgUG9wdWxhdGlvbiBTdXJ2ZXkgMTk4NSksIGJhbyBn4buTbSB0aMO0bmcgdGluIGPhu6dhIDUzNCBuZ8aw4budaSDEkWFuZyB0aGFtIGdpYSB0aOG7iyB0csaw4budbmcgbGFvIMSR4buZbmcgdOG6oWkgSG9hIEvhu7MuIEThu68gbGnhu4d1IMSRxrDhu6NjIHRodSB0aOG6rXAgbmjhurFtIG3hu6VjIMSRw61jaCBraOG6o28gc8OhdCBjw6FjIHnhur91IHThu5EgbmjDom4ga2jhuql1IGjhu41jIHbDoCBraW5oIHThur8g4oCTIHjDoyBo4buZaSDhuqNuaCBoxrDhu59uZyDEkeG6v24gdGh1IG5o4bqtcCBj4bunYSBuZ8aw4budaSBsYW8gxJHhu5luZy4gVOG6rXAgZOG7ryBsaeG7h3UgY2jhu6lhIHThu5VuZyBj4buZbmcgMTEgYmnhur9uLCBiYW8gZ+G7k20gY+G6oyBiaeG6v24gxJHhu4tuaCBsxrDhu6NuZyB2w6AgYmnhur9uIMSR4buLbmggdMOtbmgsIGPhu6UgdGjhu4MgbmjGsCBzYXU6DQoNCioqQ8OhYyBiaeG6v24gxJHhu4tuaCBsxrDhu6NuZzoqKg0KDQotIHdhZ2U6IE3hu6ljIGzGsMahbmcgdGhlbyBnaeG7nSBj4bunYSBjw6EgbmjDom4gKHTDrW5oIGLhurFuZyDEkcO0IGxhIE3hu7kpLCBsw6AgYmnhur9uIG3hu6VjIHRpw6p1IHF1YW4gdHLhu41uZyB0cm9uZyBuZ2hpw6puIGPhu6l1IHbhu4EgdGh1IG5o4bqtcC4NCg0KLSBlZHVjYXRpb246IFThu5VuZyBz4buRIG7Eg20gaOG7jWMgY2jDrW5oIHF1eSBj4bunYSBjw6EgbmjDom4sIHBo4bqjbiDDoW5oIHRyw6xuaCDEkeG7mSBo4buNYyB24bqlbi4NCg0KLSBleHBlcmllbmNlOiBT4buRIG7Eg20ga2luaCBuZ2hp4buHbSBsw6BtIHZp4buHYy4NCg0KLSBhZ2U6IFR14buVaSBoaeG7h24gdOG6oWkgY+G7p2EgY8OhIG5ow6JuLg0KDQoqKkPDoWMgYmnhur9uIMSR4buLbmggdMOtbmg6KioNCg0KLSBldGhuaWNpdHk6IENo4bunbmcgdOG7mWMsIMSRxrDhu6NjIHBow6JuIHRow6BuaCBiYSBuaMOzbSBjaMOtbmggKHbDrSBk4bulOiAiY2F1YyIsICJoaXNwYW5pYyIsICJvdGhlciIpLg0KDQotIHJlZ2lvbjogS2h1IHbhu7FjIHNpbmggc+G7kW5nLCBn4buTbSBoYWkgbeG7qWM6IG1p4buBbiBOYW0gKHNvdXRoKSB2w6AgY8OhYyBraHUgduG7sWMga2jDoWMgKG90aGVyKS4NCg0KLSBnZW5kZXI6IEdp4bubaSB0w61uaCBj4bunYSBjw6EgbmjDom4sIGJhbyBn4buTbSBuYW0gdsOgIG7hu68uDQoNCi0gb2NjdXBhdGlvbjogTmjDs20gbmfDoG5oIG5naOG7gSBjaMOtbmgsIMSRxrDhu6NjIGNoaWEgdGjDoG5oIHPDoXUgbG/huqFpIGtow6FjIG5oYXUuDQoNCi0gc2VjdG9yOiBLaHUgduG7sWMga2luaCB04bq/IG7GoWkgY8OhIG5ow6JuIGzDoG0gdmnhu4djLCB24bubaSBiYSBt4bupYyBuaMawIGtodSB24buxYyBz4bqjbiB4deG6pXQsIGtodSB24buxYyBjw7RuZywgdsOgIGtodSB24buxYyBraMOhYy4NCg0KLSB1bmlvbjogVMOsbmggdHLhuqFuZyB0aGFtIGdpYSBjw7RuZyDEkW/DoG4sIGPDsyBoYWkgbeG7qWMgbMOgIOKAnGPDs+KAnSB2w6Ag4oCca2jDtG5n4oCdLg0KDQotIG1hcnJpZWQ6IFTDrG5oIHRy4bqhbmcgaMO0biBuaMOibiwgZ+G7k20gaGFpIG3hu6ljIGzDoCDEkeG7mWMgdGjDom4gKFMpIHbDoCDEkcOjIGvhur90IGjDtG4gKE0pLg0KDQojIyMgKioxLjMgSGnhu4NuIHRo4buLIG3hu5l0IHbDoGkgZMOybmcgxJHhuqd1IHbDoCBjdeG7kWkgY+G7p2EgZOG7ryBsaeG7h3UqKg0KDQpOaOG6sW0gY8OzIMSRxrDhu6NjIGPDoWkgbmjDsm4gdOG7lW5nIHF1YW4gduG7gSBi4buZIGThu68gbGnhu4d1IHRhIHPhu60gZOG7pW5nIGjDoG0gaGVhZCgpIHbDoCB0YWlkKCkgxJHhu4MgeGVtIG3hu5l0IHPhu5EgZMOybmcgxJHhuqd1IHbDoCBkw7JuZyBjdeG7kWkgY+G7p2EgYuG7mSBk4buvIGxp4buHdSBDdXJyZW50IFBvcHVsYXRpb24gU3VydmV5IDE5ODU6IA0KDQpgYGB7cn0NCmhlYWQoaykgI2hp4buDbiB0aOG7iyB2w6BpIGTDsm5nIMSR4bqndQ0KYGBgDQpgYGB7cn0NCnRhaWwoaykgI2hp4buDbiB0aOG7iyB2w6BvIGTDsm5nIGN14buRaSANCmBgYA0KDQojIyMgKioxLjQgS2nhu4NtIHRyYSBnacOhIHRy4buLIHRoaeG6v3UqKg0KIA0KTmjhurFtIMSR4bqjbSBi4bqjbyBjaOG6pXQgbMaw4bujbmcgZOG7ryBsaeG7h3UgdsOgIHRyw6FuaCBzYWkgbOG7h2NoIHRyb25nIHF1w6EgdHLDrG5oIHBow6JuIHTDrWNoLCB0YSBj4bqnbiBraeG7g20gdHJhIHhlbSBi4buZIGThu68gbGnhu4d1IGPDsyBjaOG7qWEgZ2nDoSB0cuG7iyB0aGnhur91IChOQSkgaGF5IGtow7RuZy4gxJBp4buBdSBuw6B5IGdpw7pwIHjDoWMgxJHhu4tuaCBsaeG7h3UgY8OzIGPhuqduIHjhu60gbMO9IGhv4bq3YyBsw6BtIHPhuqFjaCBk4buvIGxp4buHdSB0csaw4bubYyBraGkgdGnhur9wIHThu6VjIHBow6JuIHTDrWNoOg0KDQpgYGB7cn0NCmlmIChhbnkoaXMubmEoaykpKSB7DQogIGNhdCgiQ8OzIGdpw6EgdHLhu4sgdGhp4bq/dSB0cm9uZyBk4buvIGxp4buHdS5cbiIpDQp9IGVsc2Ugew0KICBjYXQoIktow7RuZyBjw7MgZ2nDoSB0cuG7iyB0aGnhur91IHRyb25nIGThu68gbGnhu4d1LlxuIikNCn0NCmBgYA0KDQpW4bubaSDEkW/huqFuIGNvZGUgdHLDqm4gbuG6v3UgdHJvbmcgYuG7mSBk4buvIGxp4buHdSBjw7MgYuG6pXQga8OsIGThu68gbGnhu4d1IG7DoG8gdGhp4bq/dSB0aMOsIGvhur90IHF14bqjIHPhur0gbmjhuq1uIMSRxrDhu6NjIGzDoCBjw7MgZ2nDoSB0cuG7iyB0aGnhur91IHRyb25nIGThu68gbGnhu4d1IHbDoCBuZ8aw4bujYyBs4bqhaS4gDQoNClbhu5tpIGLhu5kgZOG7ryBsaeG7h3UgxJHGsOG7o2MgZ8OhbiBjaG8gKiprKiogbmjhuq1uIMSRxrDhu6NjIGvhur90IHF14bqjIGzDoCBLaMO0bmcgY8OzIGdpw6EgdHLhu4sgdGhp4bq/dSB0cm9uZyBk4buvIGxp4buHdS4gxJBp4buBdSBuw6B5IGNobyB0aOG6pXkgZOG7ryBsaeG7h3UgIGtow7RuZyBjw7Mgw7QgdHLhu5FuZyBoYXkgZ2nDoSB0cuG7iyBi4buLIHRoaeG6v3UgdHJvbmcgdG/DoG4gYuG7mSBi4buZIGThu68gbGnhu4d1LiDEkMOieSBsw6AgxJFp4buBdSBraeG7h24gxJHhu4MgdGnhur9uIGjDoG5oIGPDoWMgcGjDom4gdMOtY2ggdGnhur9wIHRoZW8gbcOgIGtow7RuZyBj4bqnbiB0aOG7sWMgaGnhu4duIGLGsOG7m2MgeOG7rSBsw70gZ2nDoSB0cuG7iyB0aGnhur91Lg0KDQoNCiMjICoqUGjhuqduIDI6IFBow6JuIHTDrWNoIG3DtCB04bqjIGPDoWMgYmnhur9uIMSR4buLbmggdMOtbmgqKg0KDQojIyMgKioyLjEgQmnhur9uIGV0aG5pY2l0eSoqDQoNClRhIHRo4buxYyBoaeG7h24gdGjhu5FuZyBrw6ogdOG6p24gc+G7kSB2w6AgdOG6p24gc3XhuqV0IGNobyBiaeG6v24gZXRobmljaXR5IMSRxrDhu6NjIGvhur90IHF14bqjIG5oxrAgc2F1Og0KDQoqVGjhu5FuZyBrw6ogdOG6p24gc3XhuqV0KiANCg0KYGBge3J9DQpldGhuaWNpdHlfMTwtdGFibGUoa19jYXQkZXRobmljaXR5KQ0KZXRobmljaXR5XzENCmBgYA0KDQpgYGB7cn0NCmV0aG5pY2l0eV8yPC10YWJsZShrX2NhdCRldGhuaWNpdHkpL3N1bShucm93KGtfY2F0KSkqMTAwICN04bqnbiBzdeG6pXQNCmV0aG5pY2l0eV8yDQpgYGANCg0KKlRy4buxYyBxdWFuIGjDs2EgZOG7ryBsaeG7h3UqDQoNCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KDQpjIDwtIGFzLmRhdGEuZnJhbWUodGFibGUoa19jYXQkZXRobmljaXR5KSkgI2NodXnhu4NuIGvhur90IHF14bqjIHRow6BuaCBi4bqjbmcgZOG7ryBsaeG7h3UgKGRhdGEuZnJhbWUpIHbhu5tpIDIgY+G7mXQNCmNvbG5hbWVzKGMpIDwtIGMoImV0aG5pY2l0eSIsICJDb3VudCIpDQpnZ3Bsb3QoYywgYWVzKHggPSBldGhuaWNpdHksIHkgPSBDb3VudCwgZmlsbCA9IGV0aG5pY2l0eSkpICsNCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIpICsNCiAgbGFicyh0aXRsZSA9ICJCaeG7g3UgxJHhu5MgYmnhu4N1IHRo4buLIGNo4bunbmcgdOG7mWMiLCB4ID0gIkNo4bunbmcgdOG7mWMiLCB5ID0gIlPhu5EgbMaw4bujbmciKSArDQogIHRoZW1lX21pbmltYWwoKSArICANCiAgdGhlbWUodGV4dCA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSAic2FucyIpKQ0KYGBgDQoNCmBgYHtyfQ0KcGllKGV0aG5pY2l0eV8yLA0KbGFiZWxzID0gcGFzdGUobmFtZXMoZXRobmljaXR5XzIpLCByb3VuZChldGhuaWNpdHlfMiwgMiksICIlIiksDQptYWluID0gIlThu7cgbOG7hyBjaOG7p25nIHThu5ljIikNCmBgYA0KDQoqTmjhuq1uIHjDqXQqDQoNCkJp4buDdSDEkeG7kyBjaG8gdGjhuqV5IG5ow7NtIGNo4bunbmcgdOG7mWMgQ2F1Y2FzaWFuIChuZ8aw4budaSBkYSB04bqvbmcpIGNoaeG6v20gxrB1IHRo4bq/IHLDtSBy4buHdCB24bubaSA0NDAgbmfGsOG7nWkgODIuNCUgY2hp4bq/bSB04bu3IGzhu4cgY2FvIG5o4bqldCB0cm9uZyAzIG5ow7NtLiBOaMOzbSBvdGhlciDEkeG7qW5nIHRo4bupIGhhaSB24bubaSA2NyBuZ8aw4budaSwgdHJvbmcga2hpIEhpc3BhbmljIChN4bu5IGxhdGluaCkgY2jhu4kgY8OzIDI3IG5nxrDhu51pLiBT4buxIGNow6puaCBs4buHY2ggbsOgeSBjaG8gdGjhuqV5IG3huqt1IGto4bqjbyBzw6F0IGPDsyB4dSBoxrDhu5tuZyBuZ2hpw6puZyBuaGnhu4F1IHbhu4EgbeG7mXQgbmjDs20gY2jhu6duZyB04buZYyBuaOG6pXQgxJHhu4tuaCwgY8OzIHRo4buDIOG6o25oIGjGsOG7n25nIMSR4bq/biBr4bq/dCBxdeG6oyBuZ2hpw6puIGPhu6l1IG7hur91IG3hu6VjIHRpw6p1IGzDoCBwaOG6o24gw6FuaCBz4buxIMSRYSBk4bqhbmcgY2jhu6duZyB04buZYy4NCg0KIyMjICoqMi4yIEJp4bq/biByZWdpb24qKg0KDQpUYSB0aOG7sWMgaGnhu4duIHRo4buRbmcga8OqIHThuqduIHPhu5EgdsOgIHThuqduIHN14bqldCBjaG8gYmnhur9uIHJlZ2lvbiDEkcaw4bujYyBr4bq/dCBxdeG6oyBuaMawIHNhdQ0KDQoqVGjhu5FuZyBrw6ogdOG6p24gc3XhuqV0KiANCg0KYGBge3J9DQpyZWdpb25fMTwtdGFibGUoa19jYXQkcmVnaW9uKQ0KcmVnaW9uXzENCmBgYA0KDQpgYGB7cn0NCnJlZ2lvbl8yPC10YWJsZShrX2NhdCRyZWdpb24pL3N1bShucm93KGtfY2F0KSkqMTAwICN04bqnbiBzdeG6pXQNCnJlZ2lvbl8yDQpgYGANCg0KKlRy4buxYyBxdWFuIGjDs2EgZOG7ryBsaeG7h3UqDQoNCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KDQpyZWdpb25fMSA8LSBrX2NhdCB8Pg0KICBncm91cF9ieShyZWdpb24pIHw+DQogIHN1bW1hcmlzZShmcmVxID0gbigpKSB8Pg0KICBtdXRhdGUocGVyID0gZnJlcSAvIHN1bShmcmVxKSwNCiAgICAgICAgIGxhYmVsID0gcGFzdGUwKGZyZXEsICIgKCIsIHJvdW5kKHBlciAqIDEwMCwgMSksICIlKSIpKQ0KDQpnZ3Bsb3QocmVnaW9uXzEgLCBhZXMoeCA9ICIiLCB5ID0gcGVyLCBmaWxsID0gcmVnaW9uKSkgKw0KICBnZW9tX2NvbCh3aWR0aCA9IDEsIGNvbG9yID0gIndoaXRlIikgKw0KICBjb29yZF9wb2xhcigieSIpICsNCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IHBhc3RlMChyb3VuZChwZXIqMTAwLCAyKSwgIiUiKSksDQogICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX3N0YWNrKHZqdXN0ID0gMC41KSwNCiAgICAgICAgICAgIHNpemUgPSAyLjUpICsNCiAgc2NhbGVfZmlsbF9icmV3ZXIocGFsZXR0ZSA9ICJQYXN0ZWwxIikgKyAgIyBC4bqhbiBjw7MgdGjhu4MgY2jhu41uIFNldDEsIFNldDIuLi4NCiAgbGFicyh0aXRsZSA9ICJU4bu3IGzhu4cgbmfGsOG7nWkgc2luaCBz4buRbmcg4bufIGPDoWMga2h1IHbhu7FjIiwgZmlsbCA9ICJLaHUgduG7sWMiKSArDQogIHRoZW1lX3ZvaWQoKQ0KDQpgYGANCg0KKk5o4bqtbiB4w6l0Kg0KDQpL4bq/dCBxdeG6oyBiaeG7g3UgxJHhu5MgY2hvIHRo4bqleSDEkWEgc+G7kSBuZ8aw4budaSBkw6JuIHNpbmggc+G7kW5nIHThuqFpIGPDoWMga2h1IHbhu7FjIG5nb8OgaSBtaeG7gW4gTmFtIGNoaeG6v20ga2hv4bqjbmcgNzAuNzklLCB0cm9uZyBraGkgY2jhu4kgY8OzIDI5LjIxJSBjxrAgdHLDuiB04bqhaSBraHUgduG7sWMgbWnhu4FuIE5hbS4gxJBp4buBdSBuw6B5IGNobyB0aOG6pXkgc+G7sSBwaMOibiBi4buRIGTDom4gY8awIHRyb25nIG3huqt1IGPDsyBwaOG6p24gbmdoacOqbmcgduG7gSBjw6FjIHbDuW5nIG5nb8OgaSBtaeG7gW4gTmFtLg0KDQojIyMgKioyLjMgQmnhur9uIGdlbmRlcioqDQoNClRhIHRo4buxYyBoaeG7h24gdGjhu5FuZyBrw6ogdOG6p24gc+G7kSB2w6AgdOG6p24gc3XhuqV0IGNobyBiaeG6v24gcmVnaW9uIMSRxrDhu6NjIGvhur90IHF14bqjIG5oxrAgc2F1DQoNCipUaOG7kW5nIGvDqiB04bqnbiBzdeG6pXQqIA0KDQpgYGB7cn0NCmdlbmRlcl8xPC10YWJsZShrX2NhdCRnZW5kZXIpDQpnZW5kZXJfMQ0KYGBgDQoNCmBgYHtyfQ0KZ2VuZGVyXzI8LXRhYmxlKGtfY2F0JGdlbmRlcikvc3VtKG5yb3coa19jYXQpKSoxMDAgI3ThuqduIHN14bqldA0KZ2VuZGVyXzINCmBgYA0KDQoqVHLhu7FjIHF1YW4gaMOzYSBk4buvIGxp4buHdSoNCg0KYGBge3IsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQoNCmNvbHMgPC0gYygibGlnaHRibHVlIiwibGlnaHRwaW5rIikNCiMgTmjDo24gcGjhuqduIHRyxINtDQpnZW5kZXJfMmJkPC0gcGFzdGUwKCByb3VuZChnZW5kZXJfMiwgMiksICIlIikNCiMgVuG6vSBwaWUgDQpwaWUoDQogIGdlbmRlcl8yICwNCiAgbGFiZWxzID0gTkEsDQogIG1haW4gICA9ICJU4bqnbiBzdeG6pXQgYmnhur9uIGdp4bubaSB0w61uaCIsDQogIGNvbCAgICA9IGNvbHMsDQogIGJvcmRlciA9ICJ3aGl0ZSIpDQoNCiMgVGjDqm0gbGVnZW5kDQpsZWdlbmQoDQogIHggICAgICA9InRvcHJpZ2h0IiwNCiAgbGVnZW5kID0gcGFzdGUobmFtZXMoZ2VuZGVyXzIgKSxnZW5kZXJfMmJkKSwNCiAgZmlsbCAgID0gY29scywNCiAgKQ0KYGBgDQoNCipOaOG6rW4geMOpdCoNCg0KROG7sWEgdsOgbyBr4bq/dCBxdeG6oyBraOG6o28gc8OhdCB0csOqbiBjaG8gdGjhuqV5IHRyb25nIHPhu5Egbmjhu69uZyBuZ8aw4budaSBraOG6o28gc8OhdCBjw7MgMjg5IG5nxrDhu51pIGzDoCBuYW0gZ2nhu5tpIGNoaeG6v20gNTQuMTIlIHbDoCAyNDUgbmfGsOG7nWkgbMOgIG7hu68gZ2nhu5tpIGNoaeG6v20gNDUuODglLiBRdWEga+G6v3QgcXXhuqMgxJHDsyB0YSB0aOG6pXkgZ2nhu5tpIHTDrW5oIGPhu6dhIG5o4buvbmcga2jhuqNvIHPDoXQga2jDtG5nIGPDsyBz4buxIGNow6puaCBs4buHY2ggcXXDoSBuaGnhu4F1Lg0KDQojIyMgKioyLjQgQmnhur9uIG9jY3VwYXRpb24qKg0KDQpUYSB0aOG7sWMgaGnhu4duIHRo4buRbmcga8OqIHThuqduIHPhu5EgdsOgIHThuqduIHN14bqldCBjaG8gYmnhur9uIG9jY3VwYXRpb24gxJHGsOG7o2Mga+G6v3QgcXXhuqMgbmjGsCBzYXUNCg0KKlRo4buRbmcga8OqIHThuqduIHN14bqldCogDQoNCmBgYHtyfQ0Kb2NjdXBhdGlvbl8xPC10YWJsZShrX2NhdCRvY2N1cGF0aW9uKQ0Kb2NjdXBhdGlvbl8xDQpgYGANCg0KYGBge3J9DQpvY2N1cGF0aW9uXzI8LXRhYmxlKGtfY2F0JG9jY3VwYXRpb24pL3N1bShucm93KGtfY2F0KSkqMTAwICN04bqnbiBzdeG6pXQNCm9jY3VwYXRpb25fMg0KYGBgDQoNCipUcuG7sWMgcXVhbiBow7NhIGThu68gbGnhu4d1Kg0KDQpgYGB7cn0NCmMzIDwtIGFzLmRhdGEuZnJhbWUob2NjdXBhdGlvbl8xKQ0KY29sbmFtZXMoYzMpIDwtIGMoIm9jY3VwYXRpb24iLCAiQ291bnQiKQ0KDQpnZ3Bsb3QoYzMsIGFlcyh4ID0gb2NjdXBhdGlvbiwgeSA9IENvdW50LCBmaWxsID0gb2NjdXBhdGlvbikpICsNCiAgZ2VvbV9jb2woZmlsbCA9ICJsaWdodGJsdWUiLCBjb2xvciA9ICJibGFjayIpICsNCiAgbGFicyh4ID0gIk5nw6BuaCBuZ2jhu4EiLCB5ID0gIlThuqduIHPhu5EiLCB0aXRsZSA9ICJDw6FjIG5nw6BuaCBuZ2jhu4Ega2jhuqNvIHPDoXQiKSArDQogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSkpDQpgYGANCg0KKk5o4bqtbiB4w6l0Kg0KDQpL4bq/dCBxdeG6oyBjaG8gdGjhuqV5IG5ow7NtIGPDtG5nIG5ow6JuICh3b3JrZXIpIGNoaeG6v20gdOG7tyBs4buHIGzhu5tuIG5o4bqldCB0cm9uZyBt4bqrdSBraOG6o28gc8OhdCBjaGnhur9tIGtob+G6o25nIDI4LDMzJSwgdGhlbyBzYXUgbMOgIG5ow7NtIGvhu7kgdGh14bqtdCAodGVjaG5pY2FsKSB2w6AgdsSDbiBwaMOybmcgKG9mZmljZSkgduG7m2kgbOG6p24gbMaw4bujdCAxOSwwNiUgdsOgIDE3LDYxJS4gVHJvbmcga2hpIMSRw7MsIG5ow7NtIGLDoW4gaMOgbmcgKHNhbGVzKSBjw7Mgc+G7kSBsxrDhu6NuZyB0aOG6pXAgbmjhuqV0LCBjaOG7iSBjaGnhur9tIDYsOTAlLiBT4buxIHBow6JuIGLhu5EgbsOgeSBjaG8gdGjhuqV5IHLhurFuZyBt4bqrdSBraOG6o28gc8OhdCBjw7MgeHUgaMaw4bubbmcgbmdoacOqbmcgduG7gSBjw6FjIG5nw6BuaCBsYW8gxJHhu5luZyBjaMOibiB0YXkgdsOgIGvhu7kgdGh14bqtdC4gDQoNCiMjIyAqKjIuNSBCaeG6v24gc2VjdG9yKioNCg0KVGEgdGjhu7FjIGhp4buHbiB0aOG7kW5nIGvDqiB04bqnbiBz4buRIHbDoCB04bqnbiBzdeG6pXQgY2hvIGJp4bq/biBzZWN0b3IgxJHGsOG7o2Mga+G6v3QgcXXhuqMgbmjGsCBzYXUNCg0KKlRo4buRbmcga8OqIHThuqduIHN14bqldCogDQoNCmBgYHtyfQ0Kc2VjdG9yXzE8LXRhYmxlKGtfY2F0JHNlY3RvcikNCnNlY3Rvcl8xDQpgYGANCmBgYHtyfQ0Kc2VjdG9yXzI8LXRhYmxlKGtfY2F0JHNlY3Rvcikvc3VtKG5yb3coa19jYXQpKSoxMDAgI3ThuqduIHN14bqldA0Kc2VjdG9yXzINCmBgYA0KDQoqVHLhu7FjIHF1YW4gaMOzYSBk4buvIGxp4buHdSoNCg0KYGBge3IsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQoNCmNvbHMgPC0gYygibGlnaHRibHVlIiwibGlnaHRwaW5rIiwgImxpZ2h0Z3JlZW4iKQ0KIyBOaMOjbiBwaOG6p24gdHLEg20NCnNlY3Rvcl8yYmQ8LSBwYXN0ZTAoIHJvdW5kKHNlY3Rvcl8yLCAyKSwgIiUiKQ0KIyBW4bq9IHBpZSBjaGFydCDhuqluIG5ow6NuDQpwaWUoDQogIHNlY3Rvcl8yLA0KICBsYWJlbHMgPSBOQSwNCiAgbWFpbiAgID0gIlThuqduIHN14bqldCBiaeG6v24gZ2nhu5tpIHTDrW5oIiwNCiAgY29sICAgID0gY29scywNCiAgYm9yZGVyID0gIndoaXRlIikNCg0KIyBUaMOqbSBsZWdlbmQgYsOqbiBuZ2/DoGkNCmxlZ2VuZCgNCiAgeCAgICAgID0idG9wcmlnaHQiLA0KICBsZWdlbmQgPSBwYXN0ZShuYW1lcyhzZWN0b3JfMiksc2VjdG9yXzJiZCksDQogIGZpbGwgICA9IGNvbHMsDQogICkNCmBgYA0KDQoqTmjhuq1uIHjDqXQqDQoNCkvhur90IHF14bqjIGNobyB0aOG6pXkgcGjhuqduIGzhu5tuIG5nxrDhu51pIHRoYW0gZ2lhIGto4bqjbyBzw6F0IGzDoG0gdmnhu4djIHRyb25nIGtodSB24buxYyBraMOhYyAoY2hp4bq/bSBraG/huqNuZyA3Niw5NyUpLCB0cm9uZyBraGkgY2jhu4kgY8OzIDE4LDU0JSB0aHXhu5ljIGtodSB24buxYyBz4bqjbiB4deG6pXQgdsOgIDQsNDklIGzDoG0gdmnhu4djIHRyb25nIG5nw6BuaCB4w6J5IGThu7FuZy4gxJBp4buBdSBuw6B5IGNobyB0aOG6pXkgbeG6q3Uga2jhuqNvIHPDoXQgdOG6rXAgdHJ1bmcgY2jhu6cgeeG6v3UgdsOgbyBjw6FjIMSR4buRaSB0xrDhu6NuZyBraMO0bmcgbMOgbSB2aeG7h2MgdHJvbmcgbMSpbmggduG7sWMgY8O0bmcgbmdoaeG7h3AgaGF5IHjDonkgZOG7sW5nLg0KDQojIyMgKioyLjYgQmnhur9uIHVuaW9uKioNCg0KVGEgdGjhu7FjIGhp4buHbiB0aOG7kW5nIGvDqiB04bqnbiBz4buRIHbDoCB04bqnbiBzdeG6pXQgY2hvIGJp4bq/biB1bmlvbiDEkcaw4bujYyBr4bq/dCBxdeG6oyBuaMawIHNhdQ0KDQoqVGjhu5FuZyBrw6ogdOG6p24gc3XhuqV0KiANCg0KYGBge3J9DQp1bmlvbl8xPC10YWJsZShrX2NhdCR1bmlvbikNCnVuaW9uXzENCmBgYA0KYGBge3J9DQp1bmlvbl8yPC10YWJsZShrX2NhdCR1bmlvbikvc3VtKG5yb3coa19jYXQpKSoxMDAgI3ThuqduIHN14bqldA0KdW5pb25fMg0KYGBgDQoNCipUcuG7sWMgcXVhbiBow7NhIGThu68gbGnhu4d1Kg0KDQpgYGB7ciwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCg0KY29scyA8LSBjKCJsaWdodGJsdWUiLCJsaWdodHBpbmsiKQ0KIyBOaMOjbiBwaOG6p24gdHLEg20NCnVuaW9uXzJiZDwtIHBhc3RlMCggcm91bmQodW5pb25fMiwgMiksICIlIikNCiMgVuG6vSBwaWUgY2hhcnQg4bqpbiBuaMOjbg0KcGllKA0KICB1bmlvbl8yICwNCiAgbGFiZWxzID0gTkEsDQogIG1haW4gICA9ICJU4bqnbiBzdeG6pXQgdGhhbSBnaWEgaG/hurdjIGtow7RuZyBnaWEgY8O0bmcgxJFvw6BuIiwNCiAgY29sICAgID0gY29scywNCiAgYm9yZGVyID0gIndoaXRlIikNCg0KIyBUaMOqbSBsZWdlbmQgYsOqbiBuZ2/DoGkNCmxlZ2VuZCgNCiAgeCAgICAgID0idG9wcmlnaHQiLA0KICBsZWdlbmQgPSBwYXN0ZShuYW1lcyh1bmlvbl8yKSx1bmlvbl8yYmQpLA0KICBmaWxsICAgPSBjb2xzLA0KICApDQpgYGANCg0KKk5o4bqtbiB4w6l0Kg0KDQpE4buxYSB2w6BvIGvhur90IHF14bqjIHRyw6puIHRhIG5o4bqtbiB0aOG6pXkgc+G7kSBuZ8aw4budaSB0aGFtIGdpYSBjw7RuZyDEkW/DoG4gY2jhu4kgY2hp4buDbSAxNy45OCUgdHJvbmcga2hpIMSRw7Mgc+G7kSBuZ8aw4budaSBraMO0bmcgdGhhbSBnaWEgY8O0bmcgxJFvw6BuIGNoaeG6v20gdOG7tyBs4buHIGzhu5tuIHbhu5tpIDgyLjAyJS4gUXVhIGvhur90IHF14bqjIHRyw6puIHRhIHRo4bqleSBjw7Mgc+G7sSBjaMOqbmggbOG7h2NoIHF1w6EgbOG7m24gZ2nhu69hIDIgdHJhbmcgdGjDoWkuDQoNCiMjIyAqKjIuNyBCaeG6v24gbWFycmllZCoqDQoNClRhIHRo4buxYyBoaeG7h24gdGjhu5FuZyBrw6ogdOG6p24gc+G7kSB2w6AgdOG6p24gc3XhuqV0IGNobyBiaeG6v24gbWFycmllZCDEkcaw4bujYyBr4bq/dCBxdeG6oyBuaMawIHNhdQ0KDQoqVGjhu5FuZyBrw6ogdOG6p24gc3XhuqV0KiANCg0KYGBge3J9DQptYXJyaWVkXzE8LXRhYmxlKGtfY2F0JG1hcnJpZWQpDQptYXJyaWVkXzENCmBgYA0KYGBge3J9DQptYXJyaWVkXzI8LXRhYmxlKGtfY2F0JG1hcnJpZWQpL3N1bShucm93KGtfY2F0KSkqMTAwICN04bqnbiBzdeG6pXQNCm1hcnJpZWRfMg0KYGBgDQoNCipUcuG7sWMgcXVhbiBow7NhIGThu68gbGnhu4d1Kg0KDQpgYGB7ciwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCg0KY29scyA8LSBjKCJsaWdodGJsdWUiLCJsaWdodHBpbmsiKQ0KIyBOaMOjbiBwaOG6p24gdHLEg20NCm1hcnJpZWRfMmJkPC0gcGFzdGUwKCByb3VuZChtYXJyaWVkXzIsIDIpLCAiJSIpDQojIFbhur0gcGllIGNoYXJ0IOG6qW4gbmjDo24NCnBpZSgNCiAgbWFycmllZF8yLA0KICBsYWJlbHMgPSBOQSwNCiAgbWFpbiAgID0gIlThu7cgbOG7hyB0w6xuaCB0cuG6oW5nIGvhur90IGjDtG4gY+G7p2EgbmfGsOG7nWkgZMOibiIsDQogIGNvbCAgICA9IGNvbHMsDQogIGJvcmRlciA9ICJ3aGl0ZSIpDQoNCiMgVGjDqm0gbGVnZW5kIGLDqm4gbmdvw6BpDQpsZWdlbmQoDQogIHggICAgICA9InRvcHJpZ2h0IiwNCiAgbGVnZW5kID0gcGFzdGUobmFtZXMobWFycmllZF8yKSxtYXJyaWVkXzJiZCksDQogIGZpbGwgICA9IGNvbHMsDQogICkNCmBgYA0KDQoqTmjhuq1uIHjDqXQqDQoNCkvhur90IHF14bqjIHBow6JuIHTDrWNoIGNobyB0aOG6pXkgcGjhuqduIGzhu5tuIG5nxrDhu51pIGTDom4gdHJvbmcgbeG6q3Uga2jhuqNvIHPDoXQgxJHDoyBr4bq/dCBow7RuLCBjaGnhur9tIGtob+G6o25nIDY1LDU0JSwgdHJvbmcga2hpIHThu7cgbOG7hyBuZ8aw4budaSDEkeG7mWMgdGjDom4gbMOgIDM0LDQ2JS4gxJBp4buBdSBuw6B5IHBo4bqjbiDDoW5oIHLhurFuZyDEkWEgc+G7kSBuZ8aw4budaSDEkcaw4bujYyBraOG6o28gc8OhdCDEkWFuZyBz4buRbmcgdHJvbmcgY8OhYyBt4buRaSBxdWFuIGjhu4cgaMO0biBuaMOibiBjaMOtbmggdGjhu6ljLiANCg0KIyMgKipQaOG6p24gMzogUGjDom4gdMOtY2ggc+G7sSB0w6FjIMSR4buZbmcgY+G7p2EgY8OhYyBiaeG6v24gbMOqbiB2aeG7h2MgdGhhbSBnaWEgY8O0bmcgxJFvw6BuICh1bmlvbikqKg0KDQojIyMgKiozLjEgQmnhur9uIHVuaW9uIHbDoCBnZW5kZXIqKg0KDQojIyMjICoqMy4xLjEgQuG6o25nIHThuqduIHN14bqldCBjaMOpbyB2w6AgdHLhu7FjIHF1YW4gaMOzYSoqDQoNCipC4bqjbmcgdOG6p24gc3XhuqV0IGNow6lvKg0KDQpgYGB7cn0NCmIxPC0gdGFibGUoa19jYXQkdW5pb24sa19jYXQkZ2VuZGVyKQ0KYWRkbWFyZ2lucyhiMSkgDQpgYGANCg0KKkLhuqNuZyB04bqnbiBzdeG6pXQgY2jDqW8gdGhlbyB04bu3IGzhu4cgaMOgbmcqDQoNCmBgYHtyfQ0KcHJvcC50YWJsZShiMSwgbWFyZ2luID0gMSkNCmBgYA0KDQoqVHLhu7FjIHF1YW4gaMOzYSoNCiANCmBgYHtyfQ0KIyBDaHV54buDbiBzYW5nIGRhdGEgZnJhbWUNCmIxX2RmIDwtIGFzLmRhdGEuZnJhbWUoYjEpDQpjb2xuYW1lcyhiMV9kZikgPC0gYygidW5pb24iLCAiZ2VuZGVyIiwgIkZyZXF1ZW5jeSIpDQojIFbhur0gYmnhu4N1IMSR4buTIHThu6sgYuG6o25nIHThuqduIHN14bqldA0KZ2dwbG90KGIxX2RmLCBhZXMoeCA9IHVuaW9uLCB5ID0gRnJlcXVlbmN5LCBmaWxsID0gZ2VuZGVyKSkgKw0KICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IiwgcG9zaXRpb24gPSAiZG9kZ2UiKSArDQogIGxhYnMoDQogICAgdGl0bGUgPSAiQmnhu4N1IMSR4buTIHThuqduIHN14bqldCBnaeG7r2EgdW5pb24gdsOgIGdlbmRlciIsDQogICAgeCA9ICJ1bmlvbiIsDQogICAgeSA9ICJU4bqnbiBzdeG6pXQiDQogICkgKw0KICB0aGVtZV9taW5pbWFsKCkNCg0KYGBgDQoNCipOaOG6rW4geMOpdDoqIFThu7cgbOG7hyB0aGFtIGdpYSBjw7RuZyDEkW/DoG4gKHVuaW9uID0gInllcyIpIHRo4bqlcCBoxqFuIHLDtSBy4buHdCBzbyB24bubaSBraMO0bmcgdGhhbSBnaWEgKHVuaW9uID0gIm5vIikg4bufIGPhuqMgbmFtIHbDoCBu4buvLiBD4bulIHRo4buDLCB04buVbmcgc+G7kSBuZ8aw4budaSBraMO0bmcgdGhhbSBnaWEgY8O0bmcgxJFvw6BuIGzDoCA0MzggbmfGsOG7nWksIGNoaeG6v20ga2hv4bqjbmcgODIlIHThu5VuZyB0aOG7gyAoNDM4LzUzNCksIHRyb25nIGtoaSBjaOG7iSBjw7MgOTYgbmfGsOG7nWkgdGhhbSBnaWEgdMawxqFuZyDEkcawxqFuZyBraG/huqNuZyAxOCUuIFRyb25nIG5ow7NtIHRoYW0gZ2lhIGPDtG5nIMSRb8OgbiwgbmFtIGdp4bubaSBjaGnhur9tIHThu7cgbOG7hyB2xrDhu6N0IHRy4buZaSB24bubaSA2OCBuZ8aw4budaSAoNzAuOCUpLCBjw7JuIG7hu68gZ2nhu5tpIGNo4buJIGNoaeG6v20gMjggbmfGsOG7nWkgKDI5LjIlKSwgY2hvIHRo4bqleSBuYW0gZ2nhu5tpIGPDsyB4dSBoxrDhu5tuZyB0aGFtIGdpYSBjw7RuZyDEkW/DoG4gY2FvIGjGoW4gxJHDoW5nIGvhu4Mgc28gduG7m2kgbuG7ryBnaeG7m2kuIE5nxrDhu6NjIGzhuqFpLCB0cm9uZyBuaMOzbSBraMO0bmcgdGhhbSBnaWEgY8O0bmcgxJFvw6BuLCB04bu3IGzhu4cgbmFtIHbDoCBu4buvIGfhuqduIG5oxrAgYuG6sW5nIG5oYXUsIGzhuqduIGzGsOG7o3QgbMOgIDUwLjUlIHbDoCA0OS41JSwgxJFp4buBdSBuw6B5IGNobyB0aOG6pXkga2jDtG5nIGPDsyBz4buxIGtow6FjIGJp4buHdCDEkcOhbmcga+G7gyB24buBIGdp4bubaSB0w61uaCB0cm9uZyBuaMOzbSBraMO0bmcgdGhhbSBnaWEgY8O0bmcgxJFvw6BuLg0KDQoNCiMjIyMgKiozLjEuMiBLaeG7g20gxJHhu4tuaCB0aOG7kW5nIGvDqiAoS2nhu4NtIMSR4buLbmggQ2hpLWLDrG5oIHBoxrDGoW5nKSoqDQoNCsSQ4buDIMSRw6FuaCBnacOhIHhlbSBjw7MgbeG7kWkgbGnDqm4gaOG7hyBjw7Mgw70gbmdoxKlhIHRo4buRbmcga8OqIGdp4buvYSBoYWkgYmnhur9uIHBow6JuIGxv4bqhaSBsw6AgdW5pb24gdsOgIGdlbmRlciBoYXkga2jDtG5nLCBz4bq9IHPhu60gZOG7pW5nIGtp4buDbSDEkeG7i25oIENoaS1iw6xuaCBwaMawxqFuZyAoQ2hpLXNxdWFyZSB0ZXN0KS4gDQoNCmBgYHtyfQ0KIyBLaeG7g20gxJHhu4tuaA0KY2hpc3FfcmVzdWx0IDwtIGNoaXNxLnRlc3QoYjEpDQojIEluIGvhur90IHF14bqjDQpjaGlzcV9yZXN1bHQNCmBgYA0KDQpHaeG6oyB0aHV54bq/dDoNCg0KJCQNClxsZWZ0XHsNClxiZWdpbnthcnJheX17bGx9DQpIXzA6ICYgXHRleHR7Qmnhur9uIHVuaW9uIHbDoCBiaeG6v24gZ2VuZGVyIGtow7RuZyBjw7MgbeG7kWkgcXVhbiBo4buHLn0gIFxcXFwNCkhfMTogJiBcdGV4dHtCaeG6v24gdW5pb24gdsOgIGJp4bq/biBnZW5kZXIgY8OzIG3hu5FpIHF1YW4gaOG7hy59IFwNClxlbmR7YXJyYXl9DQpccmlnaHQuDQokJA0KDQoqTmjhuq1uIHjDqXQqOiBL4bq/dCBxdeG6oyBraeG7g20gxJHhu4tuaDogVuG7m2kgbeG7qWMgw70gbmdoxKlhIDAuMDUsIHbDrCBwLXZhbHVlID0gMC4wMDA0Mzg4IDwgMC4wNSwgYsOhYyBi4buPIGdp4bqjIHRodXnhur90ICRIXzAkLiBW4bqteSAgZ2nhu69hIGJp4bq/biB1bmlvbiB2w6AgYmnhur9uIGdlbmRlciB04buTbiB04bqhaSBt4buRaSBxdWFuIGjhu4cuDQoNCiMjIyMgKiozLjEuMyBSZWxhdGl2ZSByaXNrKioNCg0KTmjhurFtIHBow6JuIHTDrWNoIG3hu5FpIHF1YW4gaOG7hyBnaeG7r2EgY8OhYyBiaeG6v24sIGNow7puZyB0YSBz4butIGThu6VuZyBjaOG7iSBz4buRIFJlbGF0aXZlIFJpc2sgKFJSKSDEkeG7gyDEkW8gbMaw4budbmcgbeG7qWMgxJHhu5kgcuG7p2kgcm8gaG/hurdjIGto4bqjIG7Eg25nIHjhuqN5IHJhIGPhu6dhIG3hu5l0IHPhu7Ega2nhu4duLg0KDQoqVEgxOiBLaMO0bmcgdGhhbSBnaWEgY8O0bmcgxJFvw6BuIGzDoCBiaeG6v24gdGhhbSBjaGnhur91Kg0KDQpgYGB7ciwgd2FybmluZz1GQUxTRX0NCnJyMTwtIHJpc2tyYXRpbyhiMSkNCnJyMQ0KYGBgDQoNCipOaOG6rW4geMOpdDoqIEvhur90IHF14bqjIHBow6JuIHTDrWNoIFJlbGF0aXZlIFJpc2sgKFJSKSBnaeG7r2EgdMOsbmggdHLhuqFuZyB0aGFtIGdpYSBjw7RuZyDEkW/DoG4gKHVuaW9uKSB2w6AgZ2nhu5tpIHTDrW5oIChnZW5kZXIpIGNobyB0aOG6pXkgc+G7sSBraMOhYyBiaeG7h3QgcsO1IHLhu4d0IGdp4buvYSB2aeG7h2MgdGhhbSBnaWEgdsOgIGtow7RuZyB0aGFtIGdpYSBjw7RuZyDEkW/DoG4uIEPhu6UgdGjhu4MsIGtow7RuZyB0aGFtIGdpYSBjw7RuZyDEkW/DoG4gxJHGsOG7o2MgY2jhu41uIGzDoG0gbmjDs20gdGhhbSBjaGnhur91IHbhu5tpIFJSID0gMS4wMCwgdHJvbmcga2hpIHZp4buHYyB0aGFtIGdpYSBjw7RuZyDEkW/DoG4gY8OzIFJSID0gMC41ODg3IHThu6ljIGzDoCB04bu3IGzhu4cgdGhhbSBnaWEgY8O0bmcgxJFvw6BuIOG7nyBu4buvIGNo4buJIGLhurFuZyBraG/huqNuZyA1OC44NyUgc28gdOG7tyBs4buHIGtow7RuZyB0aGFtIGdpYSBjw7RuZyDEkW/DoG4uIEtob+G6o25nIHRpbiBj4bqteSA5NSUgY+G7p2EgUlIgbuG6sW0gdHJvbmcga2hv4bqjbmcgdOG7qyAwLjQyNTAgxJHhur9uIDAuODE1NCwga2jDtG5nIGJhbyBn4buTbSAxLCBjaG8gdGjhuqV5IHPhu7Ega2jDoWMgYmnhu4d0IG7DoHkgY8OzIMO9IG5naMSpYSB0aOG7kW5nIGvDqi4gQ8OhYyBraeG7g20gxJHhu4tuaCDEkWkga8OobSBuaMawIGtp4buDbSDEkeG7i25oIG1pZC1wIGV4YWN0LCBGaXNoZXLigJlzIGV4YWN0IHbDoCBDaGktc3F1YXJlIMSR4buBdSBjaG8gZ2nDoSB0cuG7iyBwIHLhuqV0IG5o4buPIChwIDwgMC4wMDEpLCBj4bunbmcgY+G7kSB0aMOqbSBi4bqxbmcgY2jhu6luZyBy4bqxbmcgc+G7sSBraMOhYyBiaeG7h3QgduG7gSB04bu3IGzhu4cgdGhhbSBnaWEgY8O0bmcgxJFvw6BuIGdp4buvYSBuYW0gdsOgIG7hu68uDQoNCipUSDI6IFRoYW0gZ2lhIGPDtG5nIMSRb8OgbiBsw6AgYmnhur9uIHRoYW0gY2hp4bq/dSoNCg0KYGBge3IsIHdhcm5pbmc9RkFMU0V9DQpycjFyPC0gcmlza3JhdGlvKGIxLCByZXY9InIiKQ0KcnIxcg0KYGBgDQoNCipOaOG6rW4geMOpdDoqIEvhur90IHF1w6EgUmVsYXRpZXYgUmlzayAoUlIpIGdp4buvIHTDrG5oIHRy4bqhbmcgdGhhbSBnaWEgY8O0bmcgxJFvw6BuICh1bmlvbikgdsOgIGdp4bubaSB0w61uaCAoZ2VuZGVyKSBjaG8gdGjhuqV5IHPhu7Ega2jDoWMgYmnhu4d0IHLDtSBy4buHdCBnaeG7r2Egdmnhu4djIHRoYW0gZ2lhIHbDoCBraMO0bmcgdGhhbSBnaWEgY8O0bmcgxJFvw6BuLiBD4bulIHRo4buDLCB0aGFtIGdpYSBjw7RuZyDEkW/DoG4gxJHGsOG7o2MgY2jhu41uIGzDoG0gYmnhur9uIHRoYW0gY2hp4bq/dSB24bubaSBSUj0xLCB0cm9uZyBraGkgdmnhu4djIGtow7RuZyB0aGFtIGdpYSBjw7RuZyDEkW/DoG5jb3MgUlIgPSAxLjY5ODYzIHThu6ljIGzDoCB04bu3IGzhu4cga2jDtG5nIHRoYW0gZ2lhIGPDtG5nIMSRw7JhIOG7nyBu4buvIGNhbyBoxqFuIDY5LDg2JSB04bu3IGzhu4cgdGhhbSBnaWEgY8O0bmcgxJFvw6BuIOG7nyBu4buvLiBLaG/huqNuZyB0aW4gY+G6rXkgOTUlIGPhu6dhIFJSIG7hurFtIHRyb25nIGtob+G6o25nIHThu6sgMS4yMjYgxJHhur9uIDIuMzUzLiBDw6FjIGtp4buDbSDEkeG7i25oIMSRaSBrw6htIG5oxrAgbWlkLXAgZXhhY3QsIEZpc2hlcuKAmXMgZXhhY3QgdsOgIENoaS1zcXVhcmUgxJHhu4F1IGNobyBnacOhIHRy4buLIHAgPCAwLjAwNSwgY+G7p25nIGPhu5EgYuG6sW5nIGNo4bupbmcgcuG6sW5nIHThu7cgbOG7hyBraMO0bmcgdGhhbSBnaWEgY8O0bmcgxJFvw6BuIOG7nyBu4buvIGdp4bubaSBjYW8gaMahbiByw7UgcuG7h3QuDQoNCiMjIyMgKiozLjEuNCBPZGQgcmF0aW8qKg0KDQpgYGB7cn0NCm9yMSA8LSBvZGRzcmF0aW8oYjEpDQpvcjENCmBgYA0KDQoqTmjhuq1uIHjDqXQqOiBL4bq/dCBxdeG6oyBwaMOibiB0w61jaCBjaG8gdGjhuqV5IGto4bqjIG7Eg25nIHRoYW0gZ2lhIGPDtG5nIMSRb8OgbiDhu58gbuG7ryB0aOG6pXAgaMahbiDEkcOhbmcga+G7gyBzbyB24bubaSBuYW0gZ2nhu5tpLiBU4bu3IHPhu5EgY2jDqm5oIChPZGRzIFJhdGlvIOKAkyBPUikgxJHGsOG7o2MgxrDhu5tjIGzGsOG7o25nIGzDoCAwLjQyMTMsIG5naMSpYSBsw6AgeMOhYyBzdeG6pXQgdGhhbSBnaWEgY8O0bmcgxJFvw6BuIOG7nyBu4buvIGdp4bubaSBjaOG7iSBi4bqxbmcga2hv4bqjbmcgNDIuMSUgc28gduG7m2kgeMOhYyBzdeG6pXQga2jDtG5nIHRoYW0gZ2lhIGPDtG5nIMSRb8OgbiDhu58gbuG7rywgaGF5IG7Ds2kgY8OhY2gga2jDoWMgbuG7ryBnaeG7m2kgw610IGPDsyBraOG6oyBuxINuZyB0aGFtIGdpYSBjw7RuZyDEkW/DoG4gaMahbi4gS2hv4bqjbmcgdGluIGPhuq15IDk1JSBj4bunYSBPUiBu4bqxbSB0cm9uZyBraG/huqNuZyBbMC4yNTczOyAwLjY3MzhdLGPDoWMga2nhu4NtIMSR4buLbmggxJFpIGvDqG0gbmjGsCBtaWQtcCBleGFjdCwgRmlzaGVy4oCZcyBleGFjdCB2w6AgQ2hpLXNxdWFyZSDEkeG7gXUgY2hvIHAtdmFsdWUgPCAwLjAwMSwgY2jhu6luZyBtaW5oIHLhurFuZyBz4buxIGtow6FjIGJp4buHdCBuw6B5IGzDoCBjw7Mgw70gbmdoxKlhIHRo4buRbmcga8OqLiANCg0KIyMjICoqMy4yIEJp4bq/biB1bmlvbiB2w6Agb2NjdXBhdGlvbioqDQoNCiMjIyMgKiozLjIuMSBC4bqjbmcgdOG6p24gc3XhuqV0IGNow6lvIHbDoCB0cuG7sWMgcXVhbiBow7NhKioNCg0KKkLhuqNuZyB04bqnbiBzdeG6pXQgY2jDqW8qDQoNCmBgYHtyfQ0KYjI8LSB0YWJsZShrX2NhdCR1bmlvbixrX2NhdCRvY2N1cGF0aW9uKQ0KYWRkbWFyZ2lucyhiMikgDQpgYGANCg0KKkLhuqNuZyB04bqnbiBzdeG6pXQgY2jDqW8gdGhlbyB04bu3IGzhu4cgaMOgbmcqDQoNCmBgYHtyfQ0KcHJvcC50YWJsZShiMiwgbWFyZ2luID0gMSkNCmBgYA0KDQoqVHLhu7FjIHF1YW4gaMOzYSoNCiANCmBgYHtyfQ0KIyBDaHV54buDbiBzYW5nIGRhdGEgZnJhbWUNCmIyX2RmIDwtIGFzLmRhdGEuZnJhbWUoYjIpDQpjb2xuYW1lcyhiMl9kZikgPC0gYygidW5pb24iLCAib2NjdXBhdGlvbiIsICJGcmVxdWVuY3kiKQ0KIyBW4bq9IGJp4buDdSDEkeG7kyB04burIGLhuqNuZyB04bqnbiBzdeG6pXQNCmdncGxvdChiMl9kZiwgYWVzKHggPSB1bmlvbiwgeSA9IEZyZXF1ZW5jeSwgZmlsbCA9IG9jY3VwYXRpb24pKSArDQogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLCBwb3NpdGlvbiA9ICJkb2RnZSIpICsNCiAgbGFicygNCiAgICB0aXRsZSA9ICJCaeG7g3UgxJHhu5MgdOG6p24gc3XhuqV0IGdp4buvYSB1bmlvbiB2w6Agb2NjdXBhdGlvbiIsDQogICAgeCA9ICJ1bmlvbiIsDQogICAgeSA9ICJU4bqnbiBzdeG6pXQiDQogICkgKw0KICB0aGVtZV9taW5pbWFsKCkNCg0KYGBgDQoNCipOaOG6rW4geMOpdDoqIEJp4buDdSDEkeG7kyB0aOG7gyBoaeG7h24gdOG6p24gc3XhuqV0IGdp4buvYSB2aeG7h2MgdGhhbSBnaWEgY8O0bmcgxJFvw6BuICh1bmlvbikgdsOgIGPDoWMgbmjDs20gbmdo4buBIG5naGnhu4dwIChvY2N1cGF0aW9uKSBjaG8gdGjhuqV5IHPhu7Ega2jDoWMgYmnhu4d0IHLDtSBy4buHdCBnaeG7r2EgY8OhYyBuaMOzbS4gTmjDrG4gY2h1bmcsIHThu7cgbOG7hyB0aGFtIGdpYSBjw7RuZyDEkW/DoG4gY2FvIG5o4bqldCB0aHXhu5ljIHbhu4EgbmjDs20gbGFvIMSR4buZbmcgcGjhu5UgdGjDtG5nICh3b3JrZXIpIHbhu5tpIGtob+G6o25nIDI4LDIlLCB0aeG6v3AgdGhlbyBsw6AgdGVjaG5pY2FsICgyMSw5JSkgdsOgIHNlcnZpY2VzICgyMCw1JSkuIE5nxrDhu6NjIGzhuqFpLCBjw6FjIG5ow7NtIG5oxrAgb2ZmaWNlLCBtYW5hZ2VtZW50IHbDoCBzYWxlcyBjw7MgdOG7tyBs4buHIHRoYW0gZ2lhIHLhuqV0IHRo4bqlcCwgbOG6p24gbMaw4bujdCBraG/huqNuZyA4LDIlLCA1LDUlIHbDoCBjaOG7iSAyLDYlLiDEkGnhu4F1IG7DoHkgcGjhuqNuIMOhbmggeHUgaMaw4bubbmcgbmjhu69uZyBuZ8aw4budaSBsw6BtIGPDoWMgY8O0bmcgdmnhu4djIHRheSBjaMOibiBob+G6t2Mga+G7uSB0aHXhuq10IHRoxrDhu51uZyDEkeG7kWkgbeG6t3QgduG7m2kgxJFp4buBdSBraeG7h24gbGFvIMSR4buZbmcga2jDsyBraMSDbiBoxqFuIG7Dqm4gY8OzIG5odSBj4bqndSB0aGFtIGdpYSBjw7RuZyDEkW/DoG4gxJHhu4MgYuG6o28gduG7hyBxdXnhu4FuIGzhu6NpLg0KDQojIyMjICoqMy4yLjIgS2nhu4NtIMSR4buLbmggdGjhu5FuZyBrw6ogKEtp4buDbSDEkeG7i25oIENoaS1iw6xuaCBwaMawxqFuZykqKg0KDQrEkOG7gyDEkcOhbmggZ2nDoSB4ZW0gY8OzIG3hu5FpIGxpw6puIGjhu4cgY8OzIMO9IG5naMSpYSB0aOG7kW5nIGvDqiBnaeG7r2EgaGFpIGJp4bq/biBwaMOibiBsb+G6oWkgbMOgIHVuaW9uIHbDoCBvY2N1cGF0aW9uIGhheSBraMO0bmcsIHPhur0gc+G7rSBk4bulbmcga2nhu4NtIMSR4buLbmggQ2hpLWLDrG5oIHBoxrDGoW5nIChDaGktc3F1YXJlIHRlc3QpLiANCg0KYGBge3J9DQojIEtp4buDbSDEkeG7i25oDQpjaGlzcV9yZXN1bHQgPC0gY2hpc3EudGVzdChiMikNCiMgSW4ga+G6v3QgcXXhuqMNCmNoaXNxX3Jlc3VsdA0KYGBgDQoNCkdp4bqjIHRodXnhur90Og0KDQokJA0KXGxlZnRcew0KXGJlZ2lue2FycmF5fXtsbH0NCkhfMDogJiBcdGV4dHtCaeG6v24gdW5pb24gdsOgIGJp4bq/biBvY2N1cGF0aW9uIGtow7RuZyBjw7MgbeG7kWkgcXVhbiBo4buHLn0gIFxcXFwNCkhfMTogJiBcdGV4dHtCaeG6v24gdW5pb24gdsOgIGJp4bq/biBvY2N1cGF0aW9uIGPDsyBt4buRaSBxdWFuIGjhu4cufSBcDQpcZW5ke2FycmF5fQ0KXHJpZ2h0Lg0KJCQNCg0KKk5o4bqtbiB4w6l0KjogS+G6v3QgcXXhuqMga2nhu4NtIMSR4buLbmg6IFbhu5tpIG3hu6ljIMO9IG5naMSpYSAwLjA1LCB2w6wgcC12YWx1ZSA9IDEuMDkxZS0wNSA8IDAuMDUsIGLDoWMgYuG7jyBnaeG6oyB0aHV54bq/dCAkSF8wJC4gVuG6rXkgIGdp4buvYSBiaeG6v24gdW5pb24gdsOgIGJp4bq/biBvY2N1cGF0aW9uIHThu5NuIHThuqFpIG3hu5FpIHF1YW4gaOG7hy4NCiANCiMjIyMgKiozLjIuMyBSZWxhdGl2ZSByaXNrKioNCg0KTmjhurFtIHBow6JuIHTDrWNoIG3hu5FpIHF1YW4gaOG7hyBnaeG7r2EgY8OhYyBiaeG6v24sIGNow7puZyB0YSBz4butIGThu6VuZyBjaOG7iSBz4buRIFJlbGF0aXZlIFJpc2sgKFJSKSDEkeG7gyDEkW8gbMaw4budbmcgbeG7qWMgxJHhu5kgcuG7p2kgcm8gaG/hurdjIGto4bqjIG7Eg25nIHjhuqN5IHJhIGPhu6dhIG3hu5l0IHPhu7Ega2nhu4duLg0KDQpgYGB7cn0NCnByb3AudGFibGUoYjIsIG1hcmdpbiA9IDEpDQpgYGANCg0KS+G6v3QgaOG7o3AgZOG7ryBsaeG7h3UgbmjDs20gbmfDoG5oIG5naOG7gSB0aMOgbmggaGFpIG5ow7NtIGNow61uaDogbmjDs20gY8O0bmcgbmjDom4gKHdvcmtlcikgdsOgIG5ow7NtIG90aGVyIGJhbyBn4buTbSB0ZWNobmljYWwsIHNlcnZpY2VzLCBvZmZpY2UgdsOgIG1hbmFnZW1lbnQuDQoNCmBgYHtyfQ0KYjJfbmV3IDwtIGNiaW5kKCAgICMga+G6v3QgaOG7o3AgaGFpIGPhu5l0IG7DoHkgdGjDoG5oIG3hu5l0IGLhuqNuZyBk4buvIGxp4buHdSBt4bubaSBn4buNaSBsw6AgazRfbmV3Lg0KICB3b3JrZXIgPSBiMlssICJ3b3JrZXIiXSwgICNs4bqleSBk4buvIGxp4buHdSBj4buZdCAiY2F1YyIgdOG7qyBi4bqjbmcgazQNCiAgb3RoZXIgPSBiMlssICJ0ZWNobmljYWwiXSArIGIyWywgInNlcnZpY2VzIl0rYjJbLCAib2ZmaWNlIl0gK2IyWywgInNhbGVzIl0gKyBiMlssICJtYW5hZ2VtZW50Il0jIGPhu5luZyBk4buvIGxp4buHdSBoYWkgY+G7mXQgImhpc3BhbmljIiB2w6AgIm90aGVyIiB04burIGLhuqNuZyBrNC4NCikNCmIyX25ldw0KYGBgDQoNCipUSDE6IEtow7RuZyB0aGFtIGdpYSBjw7RuZyDEkW/DoG4gbMOgIGJp4bq/biB0aGFtIGNoaeG6v3UqDQoNCmBgYHtyLCB3YXJuaW5nPUZBTFNFfQ0KcnIyPC0gcmlza3JhdGlvKGIyX25ldykNCnJyMg0KYGBgDQoNCipOaOG6rW4geMOpdDoqICBL4bq/dCBxdeG6oyBwaMOibiB0w61jaCBSZWxhdGl2ZSBSaXNrIChSUikgZ2nhu69hIHTDrG5oIHRy4bqhbmcgdGhhbSBnaWEgY8O0bmcgxJFvw6BuICh1bmlvbikgdsOgIG5ow7NtIG5nw6BuaCBuZ2jhu4EgY2jDrW5oICh3b3JrZXIpIGNobyB0aOG6pXkgc+G7sSBraMOhYyBiaeG7h3QgcsO1IHLhu4d0IGdp4buvYSB2aeG7h2MgdGhhbSBnaWEgdsOgIGtow7RuZyB0aGFtIGdpYSBjw7RuZyDEkW/DoG4uIEPhu6UgdGjhu4MsIGtow7RuZyB0aGFtIGdpYSBjw7RuZyDEkW/DoG4gxJHGsOG7o2MgY2jhu41uIGzDoG0gbmjDs20gdGhhbSBjaGnhur91IHbhu5tpIFJSID0gMS4wMCwgdHJvbmcga2hpIHZp4buHYyB0aGFtIGdpYSBjw7RuZyDEkW/DoG4gY8OzIFJSID0gMC43Mjc3IHThu6ljIGzDoCB04bu3IGzhu4cgdGhhbSBnaWEgY8O0bmcgxJFvw6BuIOG7nyBjw6FjIG5nw6BuaCBuZ2jhu4Ega2jDoWMgY2jhu4kgYuG6sW5nIGtob+G6o25nIDcyLjc3JSBzbyB04bu3IGzhu4cga2jDtG5nIHRoYW0gZ2lhIGPDtG5nIMSRb8Ogbi4gQ8OhYyBraeG7g20gxJHhu4tuaCDEkWkga8OobSBuaMawIGtp4buDbSDEkeG7i25oIG1pZC1wIGV4YWN0LCBGaXNoZXLigJlzIGV4YWN0IHbDoCBDaGktc3F1YXJlIMSR4buBdSBjaG8gZ2nDoSB0cuG7iyBwIHLhuqV0IG5o4buPIChwIDwgMC4wMDEpLCBj4bunbmcgY+G7kSB0aMOqbSBi4bqxbmcgY2jhu6luZyBy4bqxbmcgc+G7sSBraMOhYyBiaeG7h3QgduG7gSB04bu3IGzhu4cgdGhhbSBnaWEgY8O0bmcgxJFvw6BuIGdp4buvYSBuZ8OgbmggY8O0bmcgbmjDom4gdsOgIGPDoWMgbmfDoG5oIG5naOG7gSBraMOhYy4NCg0KDQoqVEgyOiBUaGFtIGdpYSBjw7RuZyDEkW/DoG4gbMOgIGJp4bq/biB0aGFtIGNoaeG6v3UqDQoNCmBgYHtyLCB3YXJuaW5nPUZBTFNFfQ0KcnIycjwtIHJpc2tyYXRpbyhiMl9uZXcsIHJldj0iYyIpDQpycjJyDQpgYGANCg0KKk5o4bqtbiB4w6l0OiogS+G6v3QgcXXhuqMgcGjDom4gdMOtY2ggUmVsYXRpdmUgUmlzayAoUlIpIGdp4buvYSB0w6xuaCB0cuG6oW5nIHRoYW0gZ2lhIGPDtG5nIMSRb8OgbiAodW5pb24pIHbDoCBuaMOzbSBuZ8Ogbmggbmdo4buBIGNow61uaCAod29ya2VyKSBjaG8gdGjhuqV5IHPhu7Ega2jDoWMgYmnhu4d0IHLDtSBy4buHdCBnaeG7r2Egdmnhu4djIHRoYW0gZ2lhIHbDoCBraMO0bmcgdGhhbSBnaWEgY8O0bmcgxJFvw6BuLiBD4bulIHRo4buDLCBraMO0bmcgdGhhbSBnaWEgY8O0bmcgxJFvw6BuIMSRxrDhu6NjIGNo4buNbiBsw6BtIG5ow7NtIHRoYW0gY2hp4bq/dSB24bubaSBSUiA9IDEuMDAsIHRyb25nIGtoaSB0aGFtIGdpYSBjw7RuZyDEkW/DoG4gY8OzIFJSID0gMS43OTI0IHThu6ljIGzDoCB04bu3IGzhu4cgdGhhbSBnaWEgY8O0bmcgxJFvw6BuIOG7nyBjw6FjIG5nw6BuaCBuZ2jhu4EgY8O0bmcgbmjDom4gY2FvIGjGoW4gNzkuMjQlIHNvIHThu7cgbOG7hyBraMO0bmcgdGhhbSBnaWEgY8O0bmcgxJFvw6BuIOG7nyBuZ8OgbmggY8O0bmcgbmjDom4uIEPDoWMga2nhu4NtIMSR4buLbmggxJFpIGvDqG0gbmjGsCBraeG7g20gxJHhu4tuaCBtaWQtcCBleGFjdCwgRmlzaGVy4oCZcyBleGFjdCB2w6AgQ2hpLXNxdWFyZSDEkeG7gXUgY2hvIGdpw6EgdHLhu4sgcCBy4bqldCBuaOG7jyAocCA8IDAuMDUpLCBj4bunbmcgY+G7kSB0aMOqbSBi4bqxbmcgY2jhu6luZyBy4bqxbmcgc+G7sSBraMOhYyBiaeG7h3QgduG7gSB04bu3IGzhu4cgdGhhbSBnaWEgY8O0bmcgxJFvw6BuIGdp4buvYSBuZ8OgbmggY8O0bmcgbmjDom4gdsOgIGPDoWMgbmfDoG5oIG5naOG7gSBraMOhYy4NCg0KIyMjIyAqKjMuMi40IE9kZCByYXRpbyoqDQoNCmBgYHtyfQ0Kb3IyIDwtIG9kZHNyYXRpbyhiMl9uZXcpDQpvcjINCmBgYA0KDQoqTmjhuq1uIHjDqXQ6KiBL4bq/dCBxdeG6oyBwaMOibiB0w61jaCBjaG8gdGjhuqV5IGto4bqjIG7Eg25nIHRoYW0gZ2lhIGPDtG5nIMSRb8OgbiDhu58gY8OhYyBuZ8Ogbmggbmdo4buBIGtow6FjIHRo4bqlcCBoxqFuIMSRw6FuZyBr4buDIHNvIHbhu5tpIG5nw6BuaCBjw7RuZyBuaMOibi4gVOG7tyBz4buRIGNow6puaCAoT2RkcyBSYXRpbyDigJMgT1IpIMSRxrDhu6NjIMaw4bubYyBsxrDhu6NuZyBsw6AgMC40MDY3LCBuZ2jEqWEgbMOgIHjDoWMgc3XhuqV0IHRoYW0gZ2lhIGPDtG5nIMSRb8OgbiDhu58gY8OhYyBuZ8Ogbmggbmdo4buBIGtow6FjIGLhurFuZyBraG/huqNuZyA0MC42NyUgc28gduG7m2kgdOG7tyBs4buHIGtow7RuZyB0aGFtIGdpYSBjw7RuZyDEkW/DoG4g4bufIG5nw6BuaCBraMOhYy4gS2hv4bqjbmcgdGluIGPhuq15IDk1JSBj4bunYSBPUiBu4bqxbSB0cm9uZyBraG/huqNuZyBbMC4yNTc2OyAwLjY0MzJdLGPDoWMga2nhu4NtIMSR4buLbmggxJFpIGvDqG0gbmjGsCBtaWQtcCBleGFjdCwgRmlzaGVy4oCZcyBleGFjdCB2w6AgQ2hpLXNxdWFyZSDEkeG7gXUgY2hvIHAtdmFsdWUgPCAwLjAwMSwgY2jhu6luZyBtaW5oIHLhurFuZyBz4buxIGtow6FjIGJp4buHdCBuw6B5IGzDoCBjw7Mgw70gbmdoxKlhIHRo4buRbmcga8OqLiANCg0KIyMjICoqMy4zIEJp4bq/biB1bmlvbiB2w6AgbWFycmllZCoqDQoNCiMjIyMgKiozLjMuMSBC4bqjbmcgdOG6p24gc3XhuqV0IGNow6lvIHbDoCB0cuG7sWMgcXVhbiBow7NhKioNCg0KKkLhuqNuZyB04bqnbiBzdeG6pXQgY2jDqW8qDQoNCmBgYHtyfQ0KYjM8LSB0YWJsZShrX2NhdCR1bmlvbixrX2NhdCRtYXJyaWVkKQ0KYWRkbWFyZ2lucyhiMykgDQpgYGANCg0KKkLhuqNuZyB04bqnbiBzdeG6pXQgY2jDqW8gdGhlbyB04bu3IGzhu4cgaMOgbmcqDQoNCmBgYHtyfQ0KcHJvcC50YWJsZShiMywgbWFyZ2luID0gMSkNCmBgYA0KDQoqVHLhu7FjIHF1YW4gaMOzYSoNCiANCmBgYHtyfQ0KIyBDaHV54buDbiBzYW5nIGRhdGEgZnJhbWUNCmIzX2RmIDwtIGFzLmRhdGEuZnJhbWUoYjMpDQpjb2xuYW1lcyhiM19kZikgPC0gYygidW5pb24iLCAibWFycmllZCIsICJGcmVxdWVuY3kiKQ0KIyBW4bq9IGJp4buDdSDEkeG7kyB04burIGLhuqNuZyB04bqnbiBzdeG6pXQNCmdncGxvdChiM19kZiwgYWVzKHggPSB1bmlvbiwgeSA9IEZyZXF1ZW5jeSwgZmlsbCA9IG1hcnJpZWQpKSArDQogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLCBwb3NpdGlvbiA9ICJkb2RnZSIpICsNCiAgbGFicygNCiAgICB0aXRsZSA9ICJCaeG7g3UgxJHhu5MgdOG6p24gc3XhuqV0IGdp4buvYSB1bmlvbiB2w6AgbWFycmllZCIsDQogICAgeCA9ICJ1bmlvbiIsDQogICAgeSA9ICJU4bqnbiBzdeG6pXQiDQogICkgKw0KICB0aGVtZV9taW5pbWFsKCkNCg0KYGBgDQoNCipOaOG6rW4geMOpdDoqIEJp4buDdSDEkeG7kyB0aOG7gyBoaeG7h24gdOG6p24gc3XhuqV0IGdp4buvYSB2aeG7h2MgdGhhbSBnaWEgY8O0bmcgxJFvw6BuICh1bmlvbikgdsOgIHTDrG5oIHRy4bqhbmcgaMO0biBuaMOibiAobWFycmllZCkgY2hvIHRo4bqleSBz4buxIGtow6FjIGJp4buHdCByw7UgcuG7h3QgZ2nhu69hIGhhaSBuaMOzbTogxJHhu5ljIHRow6JuIChTKSB2w6AgxJHDoyBr4bq/dCBow7RuIChNKS4gVHJvbmcgbmjDs20ga2jDtG5nIHRoYW0gZ2lhIGPDtG5nIMSRb8OgbiAodW5pb24gPSBubykgcGjhuqduIGzhu5tuIGzDoCBuZ8aw4budaSDEkcOjIGvhur90IGjDtG4gKDI3OCBuZ8aw4budaSwgY2hp4bq/bSBraG/huqNuZyA2Myw1JSkgdsOgIGPDsm4gbOG6oWkgbMOgIG5nxrDhu51pIMSR4buZYyB0aMOibiAoMTYwIG5nxrDhu51pLCBjaGnhur9tIGtob+G6o25nIDM2LDUlKS4gVHJvbmcga2hpIMSRw7MsIHRyb25nIG5ow7NtIGPDsyB0aGFtIGdpYSBjw7RuZyDEkW/DoG4gKHVuaW9uID0geWVzKSwgdOG7tyBs4buHIG5nxrDhu51pIMSRw6Mga+G6v3QgaMO0biBjw6BuZyBjaGnhur9tIMawdSB0aOG6vyByw7UgcuG7h3QgaMahbiAoNzIgbmfGsOG7nWksIGNoaeG6v20gNzUlKSwgY8OybiBuZ8aw4budaSDEkeG7mWMgdGjDom4gY2jhu4kgY8OzIDI0IG5nxrDhu51pICgyNSUpLiBRdWEgxJHDsyBjaG8gdGjhuqV5IG5nxrDhu51pIMSRw6Mga+G6v3QgaMO0biBjw7MgeHUgaMaw4bubbmcgdGhhbSBnaWEgY8O0bmcgxJFvw6BuIGNhbyBoxqFuIG5nxrDhu51pIMSR4buZYyB0aMOibiBwaOG6o24gw6FuaCBy4bqxbmcgbmfGsOG7nWkgxJHDoyBs4bqtcCBnaWEgxJHDrG5oIHRoxrDhu51uZyBjw7MgeHUgaMaw4bubbmcgcXVhbiB0w6JtIG5oaeG7gXUgaMahbiDEkeG6v24gc+G7sSDhu5VuIMSR4buLbmggdsOgIHF1eeG7gW4gbOG7o2kgdHJvbmcgY8O0bmcgdmnhu4djLCBuw6puIGjhu40gY2jhu6cgxJHhu5luZyBoxqFuIHRyb25nIHZp4buHYyB0aGFtIGdpYSBjw6FjIHThu5UgY2jhu6ljIMSR4bqhaSBkaeG7h24gbmjGsCBjw7RuZyDEkW/DoG4uDQoNCiMjIyMgKiozLjMuMiBLaeG7g20gxJHhu4tuaCB0aOG7kW5nIGvDqiAoS2nhu4NtIMSR4buLbmggQ2hpLWLDrG5oIHBoxrDGoW5nKSoqDQoNCsSQ4buDIMSRw6FuaCBnacOhIHhlbSBjw7MgbeG7kWkgbGnDqm4gaOG7hyBjw7Mgw70gbmdoxKlhIHRo4buRbmcga8OqIGdp4buvYSBoYWkgYmnhur9uIHBow6JuIGxv4bqhaSBsw6AgdW5pb24gdsOgIG1hcnJpZWQgaGF5IGtow7RuZywgc+G6vSBz4butIGThu6VuZyBraeG7g20gxJHhu4tuaCBDaGktYsOsbmggcGjGsMahbmcgKENoaS1zcXVhcmUgdGVzdCkuIA0KDQpgYGB7cn0NCiMgS2nhu4NtIMSR4buLbmgNCmNoaXNxX3Jlc3VsdCA8LSBjaGlzcS50ZXN0KGIzKQ0KIyBJbiBr4bq/dCBxdeG6ow0KY2hpc3FfcmVzdWx0DQpgYGANCg0KR2nhuqMgdGh1eeG6v3Q6DQoNCiQkDQpcbGVmdFx7DQpcYmVnaW57YXJyYXl9e2xsfQ0KSF8wOiAmIFx0ZXh0e0Jp4bq/biB1bmlvbiB2w6AgYmnhur9uIG1hcnJpZWQga2jDtG5nIGPDsyBt4buRaSBxdWFuIGjhu4cufSAgXFxcXA0KSF8xOiAmIFx0ZXh0e0Jp4bq/biB1bmlvbiB2w6AgYmnhur9uIG1hcnJpZWQgY8OzIG3hu5FpIHF1YW4gaOG7hy59IFwNClxlbmR7YXJyYXl9DQpccmlnaHQuDQokJA0KDQoqTmjhuq1uIHjDqXQqOiBL4bq/dCBxdeG6oyBraeG7g20gxJHhu4tuaDogVuG7m2kgbeG7qWMgw70gbmdoxKlhIDAuMDUsIHbDrCBwLXZhbHVlID0gMC4wNDE5MiA8IDAuMDUsIGLDoWMgYuG7jyBnaeG6oyB0aHV54bq/dCAkSF8wJC4gVuG6rXkgIGdp4buvYSBiaeG6v24gdW5pb24gdsOgIGJp4bq/biBtYXJyaWVkIHThu5NuIHThuqFpIG3hu5FpIHF1YW4gaOG7hy4NCiANCiMjIyMgKiozLjMuMyBSZWxhdGl2ZSByaXNrKioNCg0KTmjhurFtIHBow6JuIHTDrWNoIG3hu5FpIHF1YW4gaOG7hyBnaeG7r2EgY8OhYyBiaeG6v24sIGNow7puZyB0YSBz4butIGThu6VuZyBjaOG7iSBz4buRIFJlbGF0aXZlIFJpc2sgKFJSKSDEkeG7gyDEkW8gbMaw4budbmcgbeG7qWMgxJHhu5kgcuG7p2kgcm8gaG/hurdjIGto4bqjIG7Eg25nIHjhuqN5IHJhIGPhu6dhIG3hu5l0IHPhu7Ega2nhu4duLg0KDQpgYGB7cn0NCnByb3AudGFibGUoYjMsIG1hcmdpbiA9IDEpDQpgYGANCg0KDQoqVEgxOiBLaMO0bmcgdGhhbSBnaWEgY8O0bmcgxJFvw6BuIGzDoCBiaeG6v24gdGhhbSBjaGnhur91Kg0KDQpgYGB7ciwgd2FybmluZz1GQUxTRX0NCnJyMzwtIHJpc2tyYXRpbyhiMykNCnJyMw0KYGBgDQoNCipOaOG6rW4geMOpdDoqIEvhur90IHF14bqjIHBow6JuIHTDrWNoIFJlbGF0aXZlIFJpc2sgKFJSKSBnaeG7r2EgdMOsbmggdHLhuqFuZyB0aGFtIGdpYSBjw7RuZyDEkW/DoG4gKHVuaW9uKSB2w6AgdMOsbmggdHLhuqFuZyBow7RuIG5ow6JuIChtYXJyaWVkKSBjaG8gdGjhuqV5IHPhu7Ega2jDoWMgYmnhu4d0IHLDtSBy4buHdCBnaeG7r2Egdmnhu4djIHRoYW0gZ2lhIHbDoCBraMO0bmcgdGhhbSBnaWEgY8O0bmcgxJFvw6BuLiBD4bulIHRo4buDLCBraMO0bmcgdGhhbSBnaWEgY8O0bmcgxJFvw6BuIMSRxrDhu6NjIGNo4buNbiBsw6BtIG5ow7NtIHRoYW0gY2hp4bq/dSB24bubaSBSUiA9IDEuMDAsIHRyb25nIGtoaSB0aGFtIGdpYSBjw7RuZyDEkW/DoG4gY8OzIFJSID0gMS4xODE2IHThu6ljIGzDoCB04bu3IGzhu4cgdGhhbSBnaWEgY8O0bmcgxJFvw6BuIOG7nyBuZ8aw4budaSDEkcOjIGvhur90IGjDtG4gY2FvIGjGoW4gMTguMTYlIHNvIHThu7cgbOG7hyBraMO0bmcgdGhhbSBnaWEgY8O0bmcgxJFvw6BuIOG7nyBuZ8aw4budacSRw6Mga+G6v3QgaMO0bi4gQ8OhYyBraeG7g20gxJHhu4tuaCDEkWkga8OobSBuaMawIGtp4buDbSDEkeG7i25oIG1pZC1wIGV4YWN0LCBGaXNoZXLigJlzIGV4YWN0IHbDoCBDaGktc3F1YXJlIMSR4buBdSBjaG8gZ2nDoSB0cuG7iyBwIHLhuqV0IG5o4buPIChwIDwgMC4wNSksIGPhu6duZyBj4buRIHRow6ptIGLhurFuZyBjaOG7qW5nIHLhurFuZyBz4buxIGtow6FjIGJp4buHdCB24buBIHThu7cgbOG7hyB0aGFtIGdpYSBjw7RuZyDEkW/DoG4gZ2nhu69hIG5nw6BuaCBjw7RuZyBuaMOibiB2w6AgY8OhYyBuZ8Ogbmggbmdo4buBIGtow6FjLg0KDQoqVEgyOiBUaGFtIGdpYSBjw7RuZyDEkW/DoG4gbMOgIGJp4bq/biB0aGFtIGNoaeG6v3UqDQoNCmBgYHtyLCB3YXJuaW5nPUZBTFNFfQ0KcnJyM3I8LSByaXNrcmF0aW8oYjMsIHJldj0iYyIpDQpycnIzcg0KYGBgDQoNCipOaOG6rW4geMOpdDoqIEvhur90IHF14bqjIHBow6JuIHTDrWNoIFJlbGF0aXZlIFJpc2sgKFJSKSBnaeG7r2EgdMOsbmggdHLhuqFuZyB0aGFtIGdpYSBjw7RuZyDEkW/DoG4gKHVuaW9uKSB2w6AgdMOsbmggdHLhuqFuZyBow7RuIG5ow6JuIChtYXJyaWVkKSBjaG8gdGjhuqV5IHPhu7Ega2jDoWMgYmnhu4d0IHLDtSBy4buHdCBnaeG7r2Egdmnhu4djIHRoYW0gZ2lhIHbDoCBraMO0bmcgdGhhbSBnaWEgY8O0bmcgxJFvw6BuLiBD4bulIHRo4buDLCB0aGFtIGdpYSBjw7RuZyDEkW/DoG4gxJHGsOG7o2MgY2jhu41uIGzDoG0gbmjDs20gdGhhbSBjaGnhur91IHbhu5tpIFJSID0gMS4wMCwgdHJvbmcga2hpIGtow7RuZyB0aGFtIGdpYSBjw7RuZyDEkW/DoG4gY8OzIFJSID0gMC42ODQzIHThu6ljIGzDoCB04bu3IGzhu4cgdGhhbSBnaWEgY8O0bmcgxJFvw6BuIOG7nyBuZ8aw4budaSBjaMawYSBr4bq/dCBow7RuIGLhurFuZyBraG/huqNuZyA2OCw0MyUgc28gdOG7tyBs4buHIGtow7RuZyB0aGFtIGdpYSBjw7RuZyDEkW/DoG4g4bufIG5nxrDhu51pIGNoxrBhIGvhur90IGjDtG4uIEPDoWMga2nhu4NtIMSR4buLbmggxJFpIGvDqG0gbmjGsCBraeG7g20gxJHhu4tuaCBtaWQtcCBleGFjdCwgRmlzaGVy4oCZcyBleGFjdCB2w6AgQ2hpLXNxdWFyZSDEkeG7gXUgY2hvIGdpw6EgdHLhu4sgcCBy4bqldCBuaOG7jyAocCA8IDAuMDUpLCBj4bunbmcgY+G7kSB0aMOqbSBi4bqxbmcgY2jhu6luZyBy4bqxbmcgc+G7sSBraMOhYyBiaeG7h3QgduG7gSB04bu3IGzhu4cgdGhhbSBnaWEgY8O0bmcgxJFvw6BuIGdp4buvYSBuZ8OgbmggY8O0bmcgbmjDom4gdsOgIGPDoWMgbmfDoG5oIG5naOG7gSBraMOhYy4NCg0KIyMjIyAqKjMuMy40IE9kZCByYXRpbyoqDQoNCmBgYHtyfQ0Kb3IyIDwtIG9kZHNyYXRpbyhiMykNCm9yMg0KYGBgDQoNCipOaOG6rW4geMOpdCo6IEvhur90IHF14bqjIHBow6JuIHTDrWNoIGNobyB0aOG6pXkga2jhuqMgbsSDbmcgdGhhbSBnaWEgY8O0bmcgxJFvw6BuIOG7nyBuZ8aw4budaSDEkcOjIGvhur90IGjDtG4gY2FvIGjGoW4gxJHDoW5nIGvhu4Mgc28gduG7m2kga2jhuqMgbsSDbmcgdGhhbSBnaWEgY8O0bmcgxJFvw6BuIOG7nyBuZ8aw4budaSBjaMawYSBr4bq/dCBow7RuLiBU4bu3IHPhu5EgY2jDqm5oIChPZGRzIFJhdGlvIOKAkyBPUikgxJHGsOG7o2MgxrDhu5tjIGzGsOG7o25nIGzDoCAxLjcxODQsIG5naMSpYSBsw6AgeMOhYyBzdeG6pXQgdGhhbSBnaWEgY8O0bmcgxJFvw6BuIOG7nyBuZ8aw4budaSDEkcOjIGvhur90IGjDtG4gY2FvIGjGoW4gNzEuODQlIHNvIHbhu5tpIHjDoWMgc3XhuqV0IGtow7RuZyB0aGFtIGdpYSBjw7RuZyDEkW/DoG4g4bufIG5nxrDhu51pIMSRw6Mga+G6v3QgaMO0bi4gS2hv4bqjbmcgdGluIGPhuq15IDk1JSBj4bunYSBPUiBu4bqxbSB0cm9uZyBraG/huqNuZyBbMS4wNTMxOzIuODkwNF0sY8OhYyBraeG7g20gxJHhu4tuaCDEkWkga8OobSBuaMawIG1pZC1wIGV4YWN0LCBGaXNoZXLigJlzIGV4YWN0IHbDoCBDaGktc3F1YXJlIMSR4buBdSBjaG8gcC12YWx1ZSA8IDAuMDUsIGNo4bupbmcgbWluaCBy4bqxbmcgc+G7sSBraMOhYyBiaeG7h3QgbsOgeSBsw6AgY8OzIMO9IG5naMSpYSB0aOG7kW5nIGvDqi4gDQoNCiMjICoqUGjhuqduIDQ7IFBow6JuIHTDrWNoIHPhu7EgdMOhYyDEkeG7mW5nIGPhu6dhIGPDoWMgYmnhur9uIGzDqm4gYmnhur9uIGdp4bubaSB0w61uaCAoZ2VuZGVyKSoqDQoNCiMjIyAqKjQuMSBCaeG6v24gZ2VuZGVyIHbDoCBiaeG6v24gc2VjdG9yKioNCg0KIyMjIyAqKjQuMS4xIELhuqNuZyB04bqnbiBzdeG6pXQgY2jDqW8gdsOgIHRy4buxYyBxdWFuIGjDs2EqKg0KDQoqQuG6o25nIHThuqduIHN14bqldCBjaMOpbyoNCg0KYGBge3J9DQplMTwtIHRhYmxlKGtfY2F0JGdlbmRlciwga19jYXQkc2VjdG9yKQ0KYWRkbWFyZ2lucyhlMSkgDQpgYGANCg0KKkLhuqNuZyB04bqnbiBzdeG6pXQgY2jDqW8gdGhlbyB04bu3IGzhu4cgaMOgbmcqDQoNCmBgYHtyfQ0KcHJvcC50YWJsZShlMSwgbWFyZ2luID0gMSkNCmBgYA0KDQoqVHLhu7FjIHF1YW4gaMOzYSoNCiANCmBgYHtyfQ0KIyBDaHV54buDbiBzYW5nIGRhdGEgZnJhbWUNCmUxX2RmIDwtIGFzLmRhdGEuZnJhbWUoZTEpDQpjb2xuYW1lcyhlMV9kZikgPC0gYygiZ2VuZGVyIiwgInNlY3RvciIsICJGcmVxdWVuY3kiKQ0KIyBW4bq9IGJp4buDdSDEkeG7kyB04burIGLhuqNuZyB04bqnbiBzdeG6pXQNCmdncGxvdChlMV9kZiwgYWVzKHggPSBnZW5kZXIsIHkgPSBGcmVxdWVuY3ksIGZpbGwgPXNlY3RvciApKSArDQogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLCBwb3NpdGlvbiA9ICJkb2RnZSIpICsNCiAgbGFicygNCiAgICB0aXRsZSA9ICJCaeG7g3UgxJHhu5MgdOG6p24gc3XhuqV0IGdp4buvYSBzZWN0b3IgdsOgIGdlbmRlciIsDQogICAgeCA9ICJnZW5kZXIiLA0KICAgIHkgPSAiVOG6p24gc3XhuqV0Ig0KICApICsNCiAgdGhlbWVfbWluaW1hbCgpDQpgYGANCg0KKk5o4bqtbiB4w6l0KjogQmnhu4N1IMSR4buTIHRo4buDIGhp4buHbiBt4buRaSBxdWFuIGjhu4cgZ2nhu69hIG5nw6BuaCBuZ2jhu4EgKHNlY3RvcikgdsOgIGdp4bubaSB0w61uaCAoZ2VuZGVyKSBjaG8gdGjhuqV5IHPhu7EgcGjDom4gYuG7kSBraMO0bmcgxJHhu5NuZyDEkeG7gXUgZ2nhu69hIG5hbSB2w6AgbuG7ryB0cm9uZyBjw6FjIGzEqW5oIHbhu7FjLiBOZ8OgbmggeMOieSBk4buxbmcgY8OzIHThu7cgbOG7hyBuYW0gZ2nhu5tpIGNoaeG6v20gxrB1IHRo4bq/IHR1eeG7h3QgxJHhu5FpIHbhu5tpIDkxLDclLCB0cm9uZyBraGkgbuG7ryBnaeG7m2kgY2jhu4kgY2hp4bq/bSA4LDMlLiBOZ8Ogbmggc+G6o24geHXhuqV0IGPFqW5nIGPDsyBz4buxIGNow6puaCBs4buHY2gsIGtoaSBuYW0gZ2nhu5tpIGNoaeG6v20gNjAsNiUgdsOgIG7hu68gZ2nhu5tpIGzDoCAzOSw0JS4gTmfGsOG7o2MgbOG6oWksIG5ow7NtIG5nw6BuaCAib3RoZXIiIGzhuqFpIGPDsyBz4buxIHBow6JuIGLhu5EgZ2nhu5tpIHTDrW5oIGtow6EgY8OibiBi4bqxbmcsIHbhu5tpIGtob+G6o25nIDUwLDQlIG5hbSB2w6AgNDksNiUgbuG7ry4gxJBp4buBdSBuw6B5IHBo4bqjbiDDoW5oIHRo4buxYyB0cuG6oW5nIMSR4buLbmgga2nhur9uIGdp4bubaSB0cm9uZyBs4buxYSBjaOG7jW4gbmdo4buBIG5naGnhu4dwLCBraGkgY8OhYyBuZ8OgbmggxJHDsmkgaOG7j2kgbGFvIMSR4buZbmcgdGjhu4MgY2jhuqV0IG5oxrAgeMOieSBk4buxbmcgduG6q24gY2jhu6cgeeG6v3UgbMOgIG5hbSBnaeG7m2ksIGPDsm4gY8OhYyBuZ8Ogbmgga2jDoWMgY8OzIHh1IGjGsOG7m25nIG3hu58gcuG7mW5nIGjGoW4gY2hvIGPhuqMgbmFtIHbDoCBu4buvLg0KDQojIyMjICoqNC4xLjIgS2nhu4NtIMSR4buLbmggdGjhu5FuZyBrw6ogKEtp4buDbSDEkeG7i25oIENoaS1iw6xuaCBwaMawxqFuZykqKg0KDQrEkOG7gyDEkcOhbmggZ2nDoSB4ZW0gY8OzIG3hu5FpIGxpw6puIGjhu4cgY8OzIMO9IG5naMSpYSB0aOG7kW5nIGvDqiBnaeG7r2EgaGFpIGJp4bq/biBwaMOibiBsb+G6oWkgbMOgIHNlY3RvciB2w6AgZ2VuZGVyIGhheSBraMO0bmcsIHPhur0gc+G7rSBk4bulbmcga2nhu4NtIMSR4buLbmggQ2hpLWLDrG5oIHBoxrDGoW5nIChDaGktc3F1YXJlIHRlc3QpLiANCg0KYGBge3J9DQojIEtp4buDbSDEkeG7i25oDQpjaGlzcV9yZXN1bHQgPC0gY2hpc3EudGVzdChlMSkNCiMgSW4ga+G6v3QgcXXhuqMNCmNoaXNxX3Jlc3VsdA0KYGBgDQoNCkdp4bqjIHRodXnhur90Og0KDQokJA0KXGxlZnRcew0KXGJlZ2lue2FycmF5fXtsbH0NCkhfMDogJiBcdGV4dHtCaeG6v24gZ2VuZGVyIHbDoCBiaeG6v24gc2VjdG9yIGtow7RuZyBjw7MgbeG7kWkgcXVhbiBo4buHLn0gIFxcXFwNCkhfMTogJiBcdGV4dHtCaeG6v24gZ2VuZGVyIHbDoCBiaeG6v24gc2VjdG9yIGPDsyBt4buRaSBxdWFuIGjhu4cufSBcDQpcZW5ke2FycmF5fQ0KXHJpZ2h0Lg0KJCQNCg0KKk5o4bqtbiB4w6l0KjogS+G6v3QgcXXhuqMga2nhu4NtIMSR4buLbmg6IFbhu5tpIG3hu6ljIMO9IG5naMSpYSAwLjA1LCB2w6wgcC12YWx1ZSA9IDAuMDAwMTQ3OSA8IDAuMDUsIGLDoWMgYuG7jyBnaeG6oyB0aHV54bq/dCAkSF8wJC4gVuG6rXkgZ2nhu69hIEJp4bq/biBzZWN0b3IgdsOgIGJp4bq/biBnZW5kZXIgdOG7k24gdOG6oWkgbeG7kWkgcXVhbiBo4buHLg0KIA0KIyMjIyAqKjQuMS4zIFJlbGF0aXZlIHJpc2sqKg0KDQpgYGB7cn0NCmUxX25ldyA8LSBjYmluZCggICANCiAgY29uc3RydWN0aW9uPSBlMVssICJjb25zdHJ1Y3Rpb24iXSwgIA0KICBvdGhlciA9IGUxWywgIm1hbnVmYWN0dXJpbmciXSArIGUxWywgIm90aGVyIl0gDQopDQplMV9uZXcNCmBgYA0KDQpOaOG6sW0gcGjDom4gdMOtY2ggbeG7kWkgcXVhbiBo4buHIGdp4buvYSBjw6FjIGJp4bq/biwgY2jDum5nIHRhIHPhu60gZOG7pW5nIGNo4buJIHPhu5EgUmVsYXRpdmUgUmlzayAoUlIpIMSR4buDIMSRbyBsxrDhu51uZyBt4bupYyDEkeG7mSBy4bunaSBybyBob+G6t2Mga2jhuqMgbsSDbmcgeOG6o3kgcmEgY+G7p2EgbeG7mXQgc+G7sSBraeG7h24uDQoNCmBgYHtyLCB3YXJuaW5nPUZBTFNFfQ0KcnJzMTwtIHJpc2tyYXRpbyhlMV9uZXcsIHJldj0iYyIpDQpycnMxDQpgYGANCg0KKk5o4bqtbiB4w6l0OiogS+G6v3QgcXXhuqMgcGjDom4gdMOtY2ggUmVsYXRpdmUgUmlzayAoUlIpIGdp4buvYSBraHUgduG7sWMga2luaCB04bq/IChzZWN0b3IpIHbDoCBnaeG7m2kgdMOtbmggKGdlbmRlcikgY2hvIHRo4bqleSBz4buxIGtow6FjIGJp4buHdCByw7UgcuG7h3QgZ2nhu69hIGPDoWMga2h1IHbhu7FjIGtpbmggdOG6vy4gQ+G7pSB0aOG7gywgZ2nhu5tpIHTDrW5oIG5hbSDEkcaw4bujYyBjaOG7jW4gbMOgbSBuaMOzbSB0aGFtIGNoaeG6v3UgduG7m2kgUlIgPSAxLjAwLCB0cm9uZyBraGkgZ2nGsOG7m2kgdMOtbmggbuG7ryBjw7MgUlIgPSAwLjEwNzIgdOG7qWMgbMOgIHThu7cgbOG7hyBu4buvIOG7nyBjw6FjIG5nw6BuaCB4w6J5IGThu7FuZyBjaOG7iSBi4bqxbmcga2hv4bqjbmcgMTAuNzIlIHNvIHThu7cgbOG7hyBuYW0g4bufIGPDoWMgbmfDoG5oIHjDonkgZOG7sW5nLiBDw6FjIGtp4buDbSDEkeG7i25oIMSRaSBrw6htIG5oxrAga2nhu4NtIMSR4buLbmggbWlkLXAgZXhhY3QsIEZpc2hlcuKAmXMgZXhhY3QgdsOgIENoaS1zcXVhcmUgxJHhu4F1IGNobyBnacOhIHRy4buLIHAgcuG6pXQgbmjhu48gKHAgPCAwLjA1KSwgY+G7p25nIGPhu5EgdGjDqm0gYuG6sW5nIGNo4bupbmcgcuG6sW5nIHPhu7Ega2jDoWMgYmnhu4d0IHbhu4EgdOG7tyBs4buHIHRoYW0gZ2lhIGPDtG5nIMSRb8OgbiBnaeG7r2EgbmfDoG5oIGPDtG5nIG5ow6JuIHbDoCBjw6FjIG5nw6BuaCBuZ2jhu4Ega2jDoWMuDQoNCiMjIyMgKio0LjEuNCBPZGQgcmF0aW8qKg0KDQpgYGB7cn0NCm9yMXM8LW9kZHNyYXRpbyhlMV9uZXcpDQpvcjFzDQpgYGANCipOaOG6rW4geMOpdCoNCg0KROG7sWEgdHLDqm4ga+G6v3QgcXXhuqMgcGjDom4gdMOtY2ggT2RkcyBSYXRpbyAoT1IpIGdp4buvYSBiaeG6v24gc2VjdG9yIHbDoCBnZW5kZXIuIEdp4bubaSB0w61uaCBuYW0gxJHGsOG7o2MgY2jhu41uIGzDoG0gbmjDs20gdGhhbSBjaGnhur91IChPUiA9IDEuMDApLCBuw6puIGPDoWMgT2RkcyBSYXRpbyBj4bunYSBnacaw4bubaSB0w61uaCBu4buvIHPhur0gc28gc8OhbmguIFbhu5tpIGdp4bubaSB0w61uaCBu4buvLCBPZGRzIFJhdGlvID0gOS4zMzczOTEgIHbDoCBnacOhIHRy4buLIHAgxJHhu4F1IG5o4buPIGjGoW4gMC4wMSBjaG8gdOG6pXQgY+G6oyBjw6FjIHBoxrDGoW5nIHBow6FwIGtp4buDbSDEkeG7i25oLiBD4bulIHRo4buDLCB4w6FjIHN14bqldCBu4buvIGdp4bubaSBsw6BtIHZp4buHYyB0cm9uZyBuZ8Ogbmgga2jDoWMgY2FvIGjGoW4gOSBs4bqnbiBzbyB24bubaSBuYW0gdHJvbmcgbmjDs20gbmfDoG5oIGtow6FjDQoNCiMjIyAqKjQuMiBCaeG6v24gZ2VuZGVyIHbDoCBiaeG6v24gdW5pb24qKg0KDQrEkOG7gyBoaeG7g3UgcsO1IGjGoW4gbeG7kWkgcXVhbiBo4buHIGdp4buvYSBuaMOzbSBnaeG7m2kgdMOtbmggKGdlbmRlcikgdsOgIG5ow7NtIHTDrG5oIHRy4bqhbmcgdGhhbSBnaWEgY8O0bmcgxJFvw6BuICh1bmlvbiksIGNow7puZyB0YSBz4bq9IHjDonkgZOG7sW5nIGLhuqNuZyB04bqnbiBzdeG6pXQgY2jDqW8gdGjhu4MgaGnhu4duIHPhu5EgbMaw4bujbmcgdOG7q25nIGvhur90IGjhu6NwIGdp4buvYSBoYWkgYmnhur9uIG7DoHkuIFNhdSDEkcOzLCBiaeG7g3UgxJHhu5MgY+G7mXQgc+G6vSDEkcaw4bujYyBz4butIGThu6VuZyDEkeG7gyB0cuG7sWMgcXVhbiBow7NhIHPhu7EgcGjDom4gYuG7kSBj4bunYSBuaMOzbSB0w6xuaCB0cuG6oW5nIHRoYW0gZ2lhIGPDtG5nIMSRb8OgbiB0aGVvIHThu6tuZyBnaeG7m2kgdMOtbmgsIGdpw7pwIHF1YW4gc8OhdCBk4buFIGTDoG5nIHPhu7Ega2jDoWMgYmnhu4d0IHbDoCB4dSBoxrDhu5tuZyB0acOqdSBkw7luZyBnaeG7r2EgY8OhYyBuaMOzbS4NCg0KIyMjIyAqKjQuMi4xIELhuqNuZyB04bqnbiBzdeG6pXQgY2jDqW8gdsOgIHRy4buxYyBxdWFuIGjDs2EqKg0KDQoqQuG6o25nIHThuqduIHN14bqldCBjaMOpbyoNCg0KYGBge3J9DQplMiA8LSB0YWJsZShrX2NhdCRnZW5kZXIsa19jYXQkdW5pb24pDQphZGRtYXJnaW5zKGUyKSANCmBgYA0KDQoqQuG6o25nIHThuqduIHN14bqldCBjaMOpbyB0aGVvIHThu7cgbOG7hyBow6BuZyoNCg0KYGBge3J9DQpwcm9wLnRhYmxlKGUyLCBtYXJnaW4gPSAxKQ0KYGBgDQoNCipUcuG7sWMgcXVhbiBow7NhKg0KIA0KYGBge3J9DQojIENodXnhu4NuIHNhbmcgZGF0YSBmcmFtZQ0KZTJfZGYgPC0gYXMuZGF0YS5mcmFtZShlMikNCmNvbG5hbWVzKGUyX2RmKSA8LSBjKCJnZW5kZXIiLCAidW5pb24iLCAiRnJlcXVlbmN5IikNCiMgVuG6vSBiaeG7g3UgxJHhu5MgdOG7qyBi4bqjbmcgdOG6p24gc3XhuqV0DQpnZ3Bsb3QoZTJfZGYsIGFlcyh4ID0gZ2VuZGVyLCB5ID0gRnJlcXVlbmN5LCBmaWxsID0gdW5pb24pKSArDQogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLCBwb3NpdGlvbiA9ICJkb2RnZSIpICsNCiAgbGFicygNCiAgICB0aXRsZSA9ICJCaeG7g3UgxJHhu5MgdOG6p24gc+G7kSBnaeG7r2EgZ2VuZGVyIHbDoCB1bmlvbiIsDQogICAgeCA9ICJnZW5kZXIiLA0KICAgIHkgPSAiVOG6p24gc+G7kSINCiAgKSArDQogIHRoZW1lX21pbmltYWwoKQ0KDQpgYGANCg0KKk5o4bqtbiB4w6l0Kg0KDQpE4buxYSB2w6BvIGJp4buDdSDEkeG7kyB0csOqbiB0YSB0aOG6pXkgdOG7tyBs4buHIG5hbSBnaeG7m2kgdGhhbSBnaWEgY8O0bmcgxJFvw6BuIGNhbyBoxqFuIG7hu68gZ2nhu5tpLiBD4bulIHRo4buDLCB0cm9uZyB04buVbmcgc+G7kSAyODkgbmFtIHRow6wgY8OzIDY4IG5nxrDhu51pIHRoYW0gZ2lhIGPDtG5nIMSRb8OgbiBjaGnhur9tIGtob+G6o25nIDIzLDUlLCB0cm9uZyBraGkg4bufIG7hu68gZ2nhu5tpIGNo4buJIGPDsyAyOCB0csOqbiB04buVbmcgc+G7kSAyNDUgbmfGsOG7nWkgdGhhbSBnaWEgY2hp4bq/bSBraG/huqNuZyAxMSw0JS4gxJBp4buBdSBuw6B5IGNobyB0aOG6pXkgbmFtIGdp4bubaSBjw7MgeHUgaMaw4bubbmcgZ+G6r24ga+G6v3QgduG7m2kgY8O0bmcgxJFvw6BuIG5oaeG7gXUgaMahbiBzbyB24bubaSBu4buvIGdp4bubaSwgcGjhuqNuIMOhbmggc+G7sSBraMOhYyBiaeG7h3QgduG7gSBt4bupYyDEkeG7mSB0aGFtIGdpYSB04buVIGNo4bupYyBsYW8gxJHhu5luZyBnaeG7r2EgaGFpIGdp4bubaS4gVHV5IG5oacOqbiB04buVbmcgdGjhu4MgdGjDrCBuYW0gdsOgIG7hu68gxJFp4buBdSBraMO0bmcgY8OzIHh1IGjGsOG7m25nIHRoYW0gZ2lhIGPDtG5nIMSRb8OgbiBi4bufaSB04bu3IGzhu4cgbmFtIHbDoCBuxrAga2jDtG5nIHRoYW0gZ2lhIGNoaeG6v20gdOG7tyBs4buHIHLhuqV0IGzhu5tuLg0KDQojIyMjICoqNC4yLjIgS2nhu4NtIMSR4buLbmggdGjhu5FuZyBrw6ogKEtp4buDbSDEkeG7i25oIENoaS1iw6xuaCBwaMawxqFuZykqKg0KDQrEkOG7gyDEkcOhbmggZ2nDoSB4ZW0gY8OzIG3hu5FpIGxpw6puIGjhu4cgY8OzIMO9IG5naMSpYSB0aOG7kW5nIGvDqiBnaeG7r2EgaGFpIGJp4bq/biBwaMOibiBsb+G6oWkgbMOgIGdlbmRlciB2w6AgdW5pb24gaGF5IGtow7RuZywgc+G6vSBz4butIGThu6VuZyBraeG7g20gxJHhu4tuaCBDaGktYsOsbmggcGjGsMahbmcgKENoaS1zcXVhcmUgdGVzdCkuIA0KDQpgYGB7cn0NCiMgS2nhu4NtIMSR4buLbmgNCmNoaXNxX3Jlc3VsdCA8LSBjaGlzcS50ZXN0KGUyKQ0KDQojIEluIGvhur90IHF14bqjDQpjaGlzcV9yZXN1bHQNCmBgYA0KDQpHaeG6oyB0aHV54bq/dDoNCg0KJCQNClxsZWZ0XHsNClxiZWdpbnthcnJheX17bGx9DQpIXzA6ICYgXHRleHR7Qmnhur9uIGdlbmRlciB2w6AgYmnhur9uIHVuaW9uIGtow7RuZyBjw7MgbeG7kWkgcXVhbiBo4buHLn0gIFxcXFwNCkhfMTogJiBcdGV4dHtCaeG6v24gZ2VuZGVyIHbDoCBiaeG6v24gdW5pb24gY8OzIG3hu5FpIHF1YW4gaOG7hy59IFwNClxlbmR7YXJyYXl9DQpccmlnaHQuDQokJA0KDQoqTmjhuq1uIHjDqXQqOiBL4bq/dCBxdeG6oyBraeG7g20gxJHhu4tuaDogVuG7m2kgbeG7qWMgw70gbmdoxKlhIDAuMDUsIHbDrCBwLXZhbHVlID0gMC4wMDA0Mzg4IDwgMC4wNSwgYsOhYyBi4buPIGdp4bqjIHRodXnhur90ICRIXzAkLiBW4bqteSAgZ2nhu69hIGJp4bq/biBnZW5kZXIgdsOgIGJp4bq/biB1bmlvbiB04buTbiB04bqhaSBt4buRaSBxdWFuIGjhu4cuDQoNCiMjIyMgKio0LjIuMyBSZWxhdGl2ZSBSaXNrKioNCg0KKipUSDE6IE5hbSBsw6BtIGJp4bq/biB0aGFtIGNoaeG6v3UqKg0KDQpOaOG6sW0gcGjDom4gdMOtY2ggbeG7kWkgcXVhbiBo4buHIGdp4buvYSBjw6FjIGJp4bq/biwgY2jDum5nIHRhIHPhu60gZOG7pW5nIGNo4buJIHPhu5EgUmVsYXRpdmUgUmlzayAoUlIpIMSR4buDIMSRbyBsxrDhu51uZyBt4bupYyDEkeG7mSBy4bunaSBybyBob+G6t2Mga2jhuqMgbsSDbmcgeOG6o3kgcmEgY+G7p2EgbeG7mXQgc+G7sSBraeG7h24uDQoNCmBgYHtyLCB3YXJuaW5nPUZBTFNFfQ0KcnIyPC0gcmlza3JhdGlvKGUyKQ0KcnIyDQpgYGANCg0KKk5o4bqtbiB4w6l0OiogS+G6v3QgcXXhuqMgcGjDom4gdMOtY2ggUmVsYXRpdmUgUmlzayAoUlIpIGdp4buvYSBnaeG7m2kgdMOtbmggKGdlbmRlcikgdsOgIHTDrG5oIHRy4bqhbmcgdGhhbSBnaWEgY8O0bmcgxJFvw6BuICh1bmlvbikgY2hvIHRo4bqleSBz4buxIGtow6FjIGJp4buHdCByw7UgcuG7h3QgZ2nhu69hIG5hbSB2w6AgbuG7ry4gQ+G7pSB0aOG7gywgbmFtIGdp4bubaSDEkcaw4bujYyBjaOG7jW4gbMOgbSBuaMOzbSB0aGFtIGNoaeG6v3UgduG7m2kgUlIgPSAxLjAwLCB0cm9uZyBraGkgbuG7ryBnaeG7m2kgY8OzIFJSID0gMC40ODYgdOG7qWMgbMOgIGto4bqjIG7Eg25nICBu4buvIHRoYW0gZ2lhIGPDtG5nIMSRb8OgbiBjaGkgYuG6sW5nIGtob+G6o25nIDQ4LjYlIHNvIHbhu5tpIG5hbSB0aGFtIGdpYSBjw7RuZyDEkW/DoG4uIEtob+G6o25nIHRpbiBj4bqteSA5NSUgY2hvIFJSIGPhu6dhIG7hu68gbuG6sW0gdHJvbmcga2hv4bqjbmcgdOG7qyAwLjMyNCDEkeG6v24gMC43MjksIGNobyB0aOG6pXkga+G6v3QgcXXhuqMgbsOgeSBjw7MgxJHhu5kgdGluIGPhuq15IGNhby4gSMahbiBu4buvYSwgY8OhYyBraeG7g20gxJHhu4tuaCB0aOG7kW5nIGvDqiAobWlkcC5leGFjdCwgZmlzaGVyLmV4YWN0LCBjaGkuc3F1YXJlKSDEkeG7gXUgY2hvIGdpw6EgdHLhu4sgcCBy4bqldCBuaOG7jyAoPCAwLjA1KSwgY2jhu6luZyB04buPIHPhu7Ega2jDoWMgYmnhu4d0IG7DoHkgY8OzIMO9IG5naMSpYSB0aOG7kW5nIGvDqi4NCg0KKipUSDI6IE5hbSBsw6BtIGJp4bq/biB0aGFtIGNoaeG6v3UqKg0KDQpgYGB7ciwgd2FybmluZz1GQUxTRX0NCnJyMzwtIHJpc2tyYXRpbyhlMiwgcmV2ID0iYyIpDQpycjMNCmBgYA0KDQoqTmjhuq1uIHjDqXQ6KiBL4bq/dCBxdeG6oyBwaMOibiB0w61jaCBSZWxhdGl2ZSBSaXNrIChSUikgZ2nhu69hIGdp4bubaSB0w61uaCAoZ2VuZGVyKSB2w6AgdMOsbmggdHLhuqFuZyB0aGFtIGdpYSBjw7RuZyDEkW/DoG4gKHVuaW9uKSBjaG8gdGjhuqV5IHPhu7Ega2jDoWMgYmnhu4d0IHLDtSBy4buHdCBnaeG7r2EgbmFtIHbDoCBu4buvLiBD4bulIHRo4buDLCBuYW0gZ2nhu5tpIMSRxrDhu6NjIGNo4buNbiBsw6BtIG5ow7NtIHRoYW0gY2hp4bq/dSB24bubaSBSUiA9IDEuMDAsIHRyb25nIGtoaSBu4buvIGdp4bubaSBjw7MgUlIgPSAgMS4xNTggdOG7qWMgbMOgIGto4bqjIG7Eg25nICBu4buvIGtow7RuZyB0aGFtIGdpYSBjw7RuZyDEkW/DoG4gY2FvIGjGoW4gMTUuOCUgc28gduG7m2kgbmFtICBraMO0bmcgdGhhbSBnaWEgY8O0bmcgxJFvw6BuLiBLaG/huqNuZyB0aW4gY+G6rXkgOTUlIGNobyBSUiBj4bunYSBu4buvIG7hurFtIHRyb25nIGtob+G6o25nIHThu6sgMS4wNzExIMSR4bq/biAxLjI1MiwgY2hvIHRo4bqleSBr4bq/dCBxdeG6oyBuw6B5IGPDsyDEkeG7mSB0aW4gY+G6rXkgY2FvLiBIxqFuIG7hu69hLCBjw6FjIGtp4buDbSDEkeG7i25oIHRo4buRbmcga8OqIChtaWRwLmV4YWN0LCBmaXNoZXIuZXhhY3QsIGNoaS5zcXVhcmUpIMSR4buBdSBjaG8gZ2nDoSB0cuG7iyBwIHLhuqV0IG5o4buPICg8IDAuMDUpLCBjaOG7qW5nIHThu48gc+G7sSBraMOhYyBiaeG7h3QgbsOgeSBjw7Mgw70gbmdoxKlhIHRo4buRbmcga8OqLg0KDQoNCiMjIyMgKio0LjIuNCBPZGRzIHJhdGlvKioNCg0KYGBge3J9DQpvcmd1IDwtIG9kZHNyYXRpbyhlMikNCm9yZ3UNCmBgYA0KDQoqTmjhuq1uIHjDqXQqDQoNCkThu7FhIHRyw6puIGvhur90IHF14bqjIHBow6JuIHTDrWNoIE9kZHMgUmF0aW8gKE9SKSBnaeG7r2EgYmnhur9uIHNlY3RvciB2w6AgZ3VuaW9uLiBHaeG7m2kgdMOtbmggbmFtIMSRxrDhu6NjIGNo4buNbiBsw6BtIG5ow7NtIHRoYW0gY2hp4bq/dSAoT1IgPSAxLjAwKSwgbsOqbiBjw6FjIE9kZHMgUmF0aW8gY+G7p2EgZ2nGoWkgdMOtbmggbuG7ryBz4bq9IHNvIHPDoW5oLiBW4bubaSBnaeG7m2kgdMOtbmggbuG7rywgT2RkcyBSYXRpbyA9IDAuNDIxMjYgdsOgIGdpw6EgdHLhu4sgcCDEkeG7gXUgbmjhu48gaMahbiAwLjAxIGNobyB04bqldCBj4bqjIGPDoWMgcGjGsMahbmcgcGjDoXAga2nhu4NtIMSR4buLbmguIEPhu6UgdGjhu4MsIHjDoWMgc3XhuqV0IG7hu68gZ2nhu5tpIHRoYW0gZ2lhIGPDtG5nIMSRb8OgbiBjaOG7iSBi4bqxbmcgNDIuMTI2JSAgc28gduG7m2kgbmFtIHRoYW0gZ2lhIGPDtG5nIMSRb8Ogbi4NCg0KIyMgKirGr+G7m2MgbMaw4bujbmcgaOG7o3AgbMO9IHThu5FpIMSRYSAoTWF4aW11bSBMaWtlbGlob29kIEVzdGltYXRpb24gLSBNTEUpKioNCg0KVHJvbmcgdGjhu5FuZyBrw6ogdsOgIGjhu41jIG3DoXksIGThu68gbGnhu4d1IHRo4buxYyBuZ2hp4buHbSB0aMaw4budbmcgxJHGsOG7o2MgZ2nhuqMgxJHhu4tuaCBsw6AgcGjDoXQgc2luaCB04burIG3hu5l0IHBow6JuIHBo4buRaSB4w6FjIHN14bqldCBj4bulIHRo4buDLCB24bubaSBt4buZdCBz4buRIHRoYW0gc+G7kSBjaMawYSBiaeG6v3QuIE3hu6VjIHRpw6p1IGPhu6dhIG5nxrDhu51pIHBow6JuIHTDrWNoIGzDoCDGsOG7m2MgbMaw4bujbmcgbmjhu69uZyB0aGFtIHPhu5EgbsOgeSBzYW8gY2hvIHBow6JuIHBo4buRaSBtw7QgaMOsbmggcGjDuSBo4bujcCBuaOG6pXQgduG7m2kgZOG7ryBsaeG7h3UgdGjhu7FjIHThur8uDQoNCk3hu5l0IHRyb25nIG5o4buvbmcgcGjGsMahbmcgcGjDoXAgbuG7gW4gdOG6o25nIMSR4buDIGzDoG0gxJFp4buBdSDEkcOzIGzDoCAqKsaw4bubYyBsxrDhu6NuZyBo4bujcCBsw70gdOG7kWkgxJFhIChNYXhpbXVtIExpa2VsaWhvb2QgRXN0aW1hdGlvbiAtIE1MRSkqKi4gTUxFIHTDrG0gYuG7mSB0aGFtIHPhu5EgJFxtYXRoYmZ7d30kIHNhbyBjaG8geMOhYyBzdeG6pXQgcXVhbiBzw6F0IMSRxrDhu6NjIHThuq1wIGThu68gbGnhu4d1ICRcbWF0aGNhbHtEfSQgbMOgIGzhu5tuIG5o4bqldCBkxrDhu5tpIG3DtCBow6xuaCDEkcOjIGdp4bqjIMSR4buLbmguIEjDoG0gYmnhu4N1IGRp4buFbiB4w6FjIHN14bqldCBuw6B5IMSRxrDhu6NjIGfhu41pIGzDoCAqKmjDoG0gaOG7o3AgbMO9KiogdsOgIGvDvSBoaeG7h3UgbMOgOg0KDQokJA0KTChcbWF0aGJme3d9KSA9IFAoXG1hdGhjYWx7RH18XG1hdGhiZnt3fSkNCiQkDQoNCkdp4bqjIHPhu60gdOG6rXAgZOG7ryBsaeG7h3UgZ+G7k20gJE4kIHF1YW4gc8OhdCDEkeG7mWMgbOG6rXAgdsOgIMSR4buTbmcgcGjDom4gcGjhu5FpIChpLmkuZCkgbMOgICRce3hfMSwgeF8yLCBcbGRvdHMsIHhfTlx9JCwga2hpIMSRw7MgaMOgbSBo4bujcCBsw70gY8OzIHRo4buDIHZp4bq/dCBs4bqhaSBuaMawIHNhdToNCg0KJCQNCkwoXG1hdGhiZnt3fSkgPSBccHJvZF97aT0xfV57Tn0gUCh4X2l8XG1hdGhiZnt3fSkNCiQkDQoNCkRvIHTDrWNoIG5oaeG7gXUgeMOhYyBzdeG6pXQgbmjhu48gZOG7hSBnw6J5IHRyw6BuIHPhu5Ega2hpIHTDrW5oIHRvw6FuLCB0YSB0aMaw4budbmcgZMO5bmcgKipsb2dhcml0IGPhu6dhIGjDoG0gaOG7o3AgbMO9IChsb2ctbGlrZWxpaG9vZCkqKjoNCg0KJCQNClxlbGwoXG1hdGhiZnt3fSkgPSBcbG9nIEwoXG1hdGhiZnt3fSkgPSBcc3VtX3tpPTF9XntOfSBcbG9nIFAoeF9pfFxtYXRoYmZ7d30pDQokJA0KDQpCw6BpIHRvw6FuIE1MRSB0cuG7nyB0aMOgbmggYsOgaSB0b8OhbiB04buRaSDGsHUgaMOgbSBsb2ctbGlrZWxpaG9vZDoNCg0KJCQNClxoYXR7XG1hdGhiZnt3fX0gPSBcYXJnXG1heF97XG1hdGhiZnt3fX0gXGVsbChcbWF0aGJme3d9KSA9IFxhcmdcbWF4X3tcbWF0aGJme3d9fSBcc3VtX3tpPTF9XntOfSBcbG9nIFAoeF9pfFxtYXRoYmZ7d30pDQokJA0KDQpQaMawxqFuZyBwaMOhcCBNTEUgxJHGsOG7o2Mg4bupbmcgZOG7pW5nIHLhu5luZyByw6NpIHRyb25nIG5oaeG7gXUgbcO0IGjDrG5oIGjhu41jIG3DoXkgbmjGsCBOYWl2ZSBCYXllcywgaOG7k2kgcXV5IGxvZ2lzdGljLCB2w6AgY8OhYyBtw7QgaMOsbmggZOG7sWEgdHLDqm4gcGjDom4gcGjhu5FpIHjDoWMgc3XhuqV0IGtow6FjLiBN4buZdCB0cm9uZyBuaOG7r25nIMawdSDEkWnhu4NtIHF1YW4gdHLhu41uZyBj4bunYSBNTEUgbMOgIGto4bqjIG7Eg25nIGtow6FpIHF1w6F0IHbDoCDDoXAgZOG7pW5nIGxpbmggaG/huqF0IHRyw6puIG5oaeG7gXUgZOG6oW5nIHBow6JuIHBo4buRaS4NCg0KVMOzbSBs4bqhaSwgTUxFIGzDoCBt4buZdCBwaMawxqFuZyBwaMOhcCDGsOG7m2MgbMaw4bujbmcgbeG6oW5oIG3hur0sIMSRw7NuZyB2YWkgdHLDsiB0aGVuIGNo4buRdCB0cm9uZyB2aeG7h2MgdGhp4bq/dCBs4bqtcCB2w6AgaHXhuqVuIGx1eeG7h24gY8OhYyBtw7QgaMOsbmggaOG7jWMgbcOheSBk4buxYSB0csOqbiB4w6FjIHN14bqldC4NCg0KDQo=