Nhiệm vụ 3.1

Nhiệm vụ 3.1 yêu cầu thực hiện các thao tác đã học trên bộ dữ liệu population-and-demography

1. Mô tả bộ dữ liệu population-and-demography

Các thông tin cơ bản về bộ dữ liệu

  • Bộ dư liệu cung cấp thông tin về Dân số và Nhân khẩu học của các quốc gia theo các năm và từng độ tuổi

  • Nguồn tham khảo của bộ dữ liệu : Data


Đọc bộ dữ liệu

  • population-and-demography là file csv, nên ta đọc từ file csv

  • Thao tác thực hiện : Ta gán bộ dữ liệu population-and-demography với tên là pp

library(csv)
pp <- read.csv("D:/UFM/2024- Kì 1/Ngôn Ngữ Lập Trình/population-and-demography.csv", header = T)

Các thông tin tổng quan về bộ dữ liệu

Số quan sát và số biến

  • Bộ dữ liệu pp bao gồm 18288 obs (quan sát) và 24 variables (biến)

  • Có thể biết được số quan sát và số biến thông qua lệnh dim*, kết quả trả về gồm 2 giá trị số

    • Số 18288 đại diện cho tổng số quan sát

    • Số 24 đại diện cho tống số biến

dim(pp)
## [1] 18288    24

Độ dài

  • Độ dài của bộ dữ liệu pp24

  • Có thể biết được độ dài hay cũng có thể là số biến thông qua lệnh length, kết quả trả về giá trị số

    • Với bộ dữ liệu, kết quả là 24 - nghĩa là bộ dữ liệu có 24 biến (cột)
length(pp)
## [1] 24

Một số thông tin khác của bộ dữ liệu pp

  • skim - cho biết thêm các thông tin khác về bộ dữ liệu

Các thông tin được biết như : số lỗ hỏng/ bỏ trống (n_missing), số trung bình (mean), độ lệch chuẩn (sd) ,… Có thể xem thêm các thông tin khác bên dưới :

library(skimr)
skim(pp)
Data summary
Name pp
Number of rows 18288
Number of columns 24
_______________________
Column type frequency:
character 1
numeric 23
________________________
Group variables None

Variable type: character

skim_variable n_missing complete_rate min max empty n_unique whitespace
Country.name 0 1 4 59 0 254 0

Variable type: numeric

skim_variable n_missing complete_rate mean sd p0 p25 p50 p75 p100 hist
Year 0 1 1985.50 20.78 1950 1967.75 1985.5 2003.25 2021 ▇▇▇▇▇
Population 0 1 126470436.62 588851230.77 1363 291591.50 3833997.5 16785463.50 7909295000 ▇▁▁▁▁
Population.of.children.under.the.age.of.1 0 1 3133496.86 14167006.03 25 6663.75 88352.0 463000.50 139783730 ▇▁▁▁▁
Population.of.children.under.the.age.of.5 0 1 14825709.57 67384368.62 136 31995.25 423784.5 2160046.50 690360700 ▇▁▁▁▁
Population.of.children.under.the.age.of.15 0 1 41095227.11 188416973.54 416 89541.50 1186121.5 5905944.75 2015023400 ▇▁▁▁▁
Population.under.the.age.of.25 0 1 63762600.31 294251869.66 623 139541.50 1843099.5 9025129.75 3239281000 ▇▁▁▁▁
Population.aged.15.to.64.years 0 1 77429505.08 367651914.71 748 170263.50 2246772.0 9641250.00 5132999000 ▇▁▁▁▁
Population.older.than.15.years 0 1 85372101.76 404866940.61 849 186716.00 2482104.0 10354345.50 5893678600 ▇▁▁▁▁
Population.older.than.18.years 0 1 78196242.04 372017010.49 752 166417.50 2238130.5 9239904.00 5516283000 ▇▁▁▁▁
Population.at.age.1 0 1 3011212.81 13661998.41 26 6473.75 85824.0 440787.50 138478740 ▇▁▁▁▁
Population.aged.1.to.4.years 0 1 11692212.72 53238243.89 101 25269.25 334454.0 1697850.75 550970400 ▇▁▁▁▁
Population.aged.5.to.9.years 0 1 13598575.21 62534310.11 138 29406.25 392220.5 1947260.75 683611800 ▇▁▁▁▁
Population.aged.10.to.14.years 0 1 12670942.28 58775457.46 73 27879.50 363895.5 1796754.00 659934300 ▇▁▁▁▁
Population.aged.15.to.19.years 0 1 11782258.92 55126036.18 110 26296.50 336969.5 1626210.75 623576060 ▇▁▁▁▁
Population.aged.20.to.29.years 0 1 20872880.04 98860990.50 158 45050.75 609723.5 2758738.50 1210493200 ▇▁▁▁▁
Population.aged.30.to.39.years 0 1 17158704.11 82404600.95 137 36608.25 486290.5 2113149.00 1165207300 ▇▁▁▁▁
Population.aged.40.to.49.years 0 1 13622138.99 66008221.21 119 27440.25 364712.5 1556334.00 976407200 ▇▁▁▁▁
Population.aged.50.to.59.years 0 1 10177069.11 49288480.77 95 19649.75 264781.5 1203386.00 851356900 ▇▁▁▁▁
Population.aged.60.to.69.years 0 1 6801756.84 32712918.99 64 12603.00 168417.5 845242.75 598067140 ▇▁▁▁▁
Population.aged.70.to.79.years 0 1 3618710.03 17491538.61 31 6221.00 81824.0 436710.00 330491170 ▇▁▁▁▁
Population.aged.80.to.89.years 0 1 1195799.30 6238308.33 6 1818.75 20269.5 133380.50 131835590 ▇▁▁▁▁
Population.aged.90.to.99.years 0 1 142784.38 853350.39 0 154.75 1468.5 12499.00 22223974 ▇▁▁▁▁
Population.older.than.100.years 0 1 3107.72 20951.57 0 0.00 13.0 163.00 593166 ▇▁▁▁▁

Tên cụ thể của các biến

  • Bộ dữ liệu pp24 biến và tên tương ứng

  • Có thể biết được tên của từng biến cụ thể thông qua lệnh names

    • Với bộ dữ liệu, kết quả có 24 biến với các tên tương ứng, cụ thể như sau :
names(pp)
##  [1] "Country.name"                              
##  [2] "Year"                                      
##  [3] "Population"                                
##  [4] "Population.of.children.under.the.age.of.1" 
##  [5] "Population.of.children.under.the.age.of.5" 
##  [6] "Population.of.children.under.the.age.of.15"
##  [7] "Population.under.the.age.of.25"            
##  [8] "Population.aged.15.to.64.years"            
##  [9] "Population.older.than.15.years"            
## [10] "Population.older.than.18.years"            
## [11] "Population.at.age.1"                       
## [12] "Population.aged.1.to.4.years"              
## [13] "Population.aged.5.to.9.years"              
## [14] "Population.aged.10.to.14.years"            
## [15] "Population.aged.15.to.19.years"            
## [16] "Population.aged.20.to.29.years"            
## [17] "Population.aged.30.to.39.years"            
## [18] "Population.aged.40.to.49.years"            
## [19] "Population.aged.50.to.59.years"            
## [20] "Population.aged.60.to.69.years"            
## [21] "Population.aged.70.to.79.years"            
## [22] "Population.aged.80.to.89.years"            
## [23] "Population.aged.90.to.99.years"            
## [24] "Population.older.than.100.years"

Đổi tên các biến

  • Với bộ dữ liệu pp, tên của các biến được đặt để người đọc của thể hiểu rõ về thông tin dân số cụ thể của từng độ tuổi, nhưng độ dài trong mỗi tên cũng gây khó khăn và mất thời gian trong việc rút trích dữ liệu

  • Thông qua lệnh names - giúp đổi tên các biến, từ đó dữ liệu trở nên ngắn gọn, dễ dàng thao tác và tiết kiệm thời gian

  • Với bộ dữ liệu pp ta tiến hành đổi :

names(pp) <- c('ten','year','popu','un1','un5','un15','un25','15to64','old15','old18','at1','a1to4','a5to9','a10to14','a15to19','a20to29','a30to39','a40to49','a50to59','a60to69','a70to79','a80to89','a90to99','old100')
names(pp)
##  [1] "ten"     "year"    "popu"    "un1"     "un5"     "un15"    "un25"   
##  [8] "15to64"  "old15"   "old18"   "at1"     "a1to4"   "a5to9"   "a10to14"
## [15] "a15to19" "a20to29" "a30to39" "a40to49" "a50to59" "a60to69" "a70to79"
## [22] "a80to89" "a90to99" "old100"

2. Phân tích các quốc gia, các độ tuổi và tổng dân số

Trong bộ dữ liệu pp, cung cấp rất nhiều thông tin của nhiều quốc gia và vùng lãnh thổ trên thế giới về dân số và nhân khẩu học của nước đó. Ta có thể tiến hành một trong số đó để tiến hành phân tích

  • Ta chọn 6 trong số các quốc gia và vùng lãnh thổ có trong bộ dữ liệu để phân tích, 6 quốc gia được chọn thuộc khu vực** East Asia - Đông Á ,trong đó gồm :

    1. China - Trung Quốc

    2. Hong Kong - Hồng Kong

    3. Taiwan - Đài Loan

    4. South Korea - Hàn Quốc

    5. North Korea - Triều Tiên

    6. Japan - Nhật Bản

Trong bộ dữ liệu pp cũng đã tổng hợp số liệu về tổng dân số cũng như số dân ở các độ tuổi khác nhau theo từng năm (bắt đầu từ năm 1950 - đến năm 2021) của các quốc gia và vùng lãnh thổ đã nêu trên

  • Ta tiến hành chọn 5 trong các mức độ tuổi đã có trong bộ dữ liệu, 5 mức độ tuổi gồm :

    1. Population of children under the age of 15 - Dân số về trẻ em dưới 15 tuổi

    2. Population aged 20 to 29 years - Dân số độ tuổi từ 20 - 29 tuổi

    3. Population aged 50 to 59 years - Dân số độ tuổi từ 50 - 59 tuổi

    4. Population aged 80 to 89 years - Dân số độ tuổi từ 80 - 89 tuổi

    5. Population older than 100 years - Dân số trên 100 tuổi

Trung Quốc

Trung Quốc - quốc hiệu là Cộng hòa Nhân dân Trung Hoa là một quốc gia nằm ở khu vực Đông Á. Là một trong hai quốc gia tỷ dân và là quốc gia có số dân đông thứ 2 thế giới, nên ta sẽ phân tích nó ở phần tổng dân số - population

Tổng dân số


  • Trước tiên trong 18,288 quan sát có trong bộ dữ liệu, sẽ có rất nhiều quốc gia và vùng lãnh thổ khác nhau, hiện tại ta đang muốn phân tích về dân số của Trung Quốc

  • Ta tiến hành kiểm tra trong 18288 quan sát, có bao nhiêu quan sát của của Trung Quốc

CN <- pp
CN$ten.Coded <- ifelse(CN$ten == 'China', 'Trung Quốc', 'Nước khác')
table(CN$ten.Coded)
## 
##  Nước khác Trung Quốc 
##      18216         72

Kết quả thu được có 72 quan sát là của Trung Quốc, 18,216 quan sát là của quốc gia khác trong bộ dữ liệu pp

Và không chỉ riêng Trung Quốc, mỗi quốc gia khác đều có số liệu tính trong 72 năm (1950-2021)


  • Thông tin cung cấp của bộ dữ liệu pp là của nhiều quốc gia, nên ta tiến hành lọc các thông tin/ quan sát của China - Trung Quốc để phân tích được thuận tiện hơn

  • Sau đó, ta tiếp tục tiến hành xem xét trong hơn 72 năm (1950-2021), với mệnh danh là đất nước tỷ dân - Trung Quốc đã có bao nhiêu năm có tổng số dân vượt quá 1 tỷ người

China <- CN[CN$ten == 'China',]
CN1 <- China

CN1$popu.Coded1 <- ifelse(CN1$popu >= 1000000000, 'More1B', 'Under1B')
table(CN1$popu.Coded1)
## 
##  More1B Under1B 
##      40      32

Với dữ liệu đã lọc/ rút tríc từ dữ liệu gốc, ta có 1 bộ dữ liệu mang tên China - bao gồm 72 obs quan sát, 26 variables biến

Và trong 72 năm (1950-2021), Trung Quốc đã có 40 năm hơn 1 tỷ dân - More1B32 năm dưới 1 tỷ dân - Under1B


Đài Loan Taiwan - Hong Kong

Đài Loan là đảo quốc và là một quốc gia có chủ quyền thuộc khu vực Đông Á

Hong Kong là một vùng đô thị đặc biệt, cũng như một trong hai đặc khu hành chính của Cộng hòa Nhân dân Trung Hoa (cùng với Ma Cao)

  • Dân số của Đài Loan - Taiwan và Hong Kong sẽ có phần khiêm tốn hơn so với đất nước tỷ dân Trung Quốc và cả trên thế giới. Mặc dù vậy, nhưng quốc gia và vùng lãnh thổ này lại có nền kinh tế không hề khiêm tốn như vậy

  • Với 2 quốc gia/vùng lãnh thổ đặc biệt này, ta sẽ tiến hành phân tích Dân số dưới 15 tuổi

Dân số dưới 15 tuổi - Population of children under the age of 15


  • Ta sẽ tiến hành phân tích dân số dưới 15 tuổi - Population of children under the age of 15 của Đài Loan và Hong Kong
TK <- pp
Taikong <- TK[TK$ten =='Taiwan' | TK$ten =='Hong Kong',]

table(cut(Taikong$un15,3))
## 
## (5.89e+05,2.48e+06] (2.48e+06,4.36e+06] (4.36e+06,6.25e+06] 
##                  72                  24                  48
Taikong$un15.c <- cut(Taikong$un15,3, labels = c('Ít','Vừa','Nhiều'))
  • Đầu tiên ta tiến hành rút dữ liệu chỉ còn có biến của Đài Loan và Hong Kong, dữ liệu đó mang tên TaiKong

  • Sau đó ta dùng lệnh cut để chia thông tin dân số dưới 15 tuổi thành 3 khoảng, bao gồm :

    • Khoảng thứ nhất được gọi là Ít với dân số khoảng 500 ngàn người - đến hơn 2 triệu người

    • Khoảng thứ hai được gọi là Vừa với dân số khoảng 2 triệu người - đến hơn 4 triệu người

    • Khoảng thứ ba được gọi là Nhiều với dân số khoảng 4 triệu người - đến hơn 6 triệu người

    • Người ở đây là tổng dân số dưới 15 tuổi ở Hong Kong và Taiwan

table(Taikong$un15.c)
## 
##    Ít   Vừa Nhiều 
##    72    24    48
table(Taikong$un15.c,Taikong$ten)
##        
##         Hong Kong Taiwan
##   Ít           72      0
##   Vừa           0     24
##   Nhiều         0     48
  • Sau đó ta tiến hành lập bảng tần số cho khoảng mà ta đã chia ở phía trên, và thu được kết quả :

    • Hong Kong có 72 năm có số dân dưới 15 tuổi rơi vào khoảng 500 ngàn người - đến hơn 2 triệu người

    • Đài Loan có 24 năm có số dân dưới 15 tuổi rơi vào khoảng 2 triệu người - đến hơn 4 triệu người48 năm có số dân dưới 15 tuổi rơi vào khoảng 4 triệu người - đến hơn 6 triệu người


Hàn Quốc và Triều Tiên

Hàn Quốc là một quốc gia ở Đông Á, cấu thành nửa phía nam của bán đảo Triều Tiên và ngăn cách với Triều Tiên qua Khu phi quân sự vĩ tuyến 38

Triều Tiên là một quốc gia cũng ở Đông Á trên nửa phía Bắc của Bán đảo Triều Tiên, tách biệt với Hàn Quốc ở miền Nam

  • Hàn Quốc và Triều Tiên luôn là 2 quốc gia làm tốn không ít giấy mực của các tờ báo quốc tế không chỉ về mặt kinh tế, quân sự, dân số,….

  • Với bài phân tích hiện tại, ta sẽ phân tích về dân số của 2 quốc gia này với 2 độ tuổi :

    • Dân số từ 20 - 29 tuổi (Population aged 20 to 29 years)

    • Dân số từ 50 - 59 tuổi (Population aged 50 to 59 years)


Dân số từ 20 - 29 tuổi - Population aged 20 to 29 years

KR <- pp
HanTrieu <- KR[KR$ten =='North Korea' | KR$ten =='South Korea',]
table(cut(HanTrieu$a20to29,3))
## 
##  (1.64e+06,4.1e+06]  (4.1e+06,6.56e+06] (6.56e+06,9.02e+06] 
##                  72                  28                  44
HanTrieu$a20to29.c <- cut(HanTrieu$a20to29,3, labels = c('Còn ít','Trung bình','Nhiều'))
  • Ta dùng lệnh cut để chia thông tin Dân số từ 20 - 29 tuổi thành 3 khoảng, bao gồm :

    • Khoảng thứ nhất được gọi là Còn ít với dân số khoảng hơn 1 triệu ngàn người - đến hơn 4 triệu người

    • Khoảng thứ hai được gọi là Trung bình với dân số khoảng hơn 4 triệu người - đến hơn 6 triệu người

    • Khoảng thứ ba được gọi là Nhiều với dân số khoảng hơn 4 triệu người - đến hơn 9 triệu người

table(HanTrieu$a20to29.c,HanTrieu$ten)
##             
##              North Korea South Korea
##   Còn ít              63           9
##   Trung bình           9          19
##   Nhiều                0          44
  • Sau đó ta tiến hành lập bảng tần số cho khoảng mà ta đã chia ở phía trên, và thu được kết quả :

  • Triều tiên - North Korea có :

    • 63 năm có số dân từ 20-29 tuổi rơi vào khoảng Còn ít

    • 9 năm có số dân từ 20-29 tuổi rơi vào khoảng Trung bình

  • Hàn Quốc - South Korea có :

    • 9 năm có số dân từ 20-29 tuổi rơi vào khoảng Còn ít

    • 19 năm có số dân từ 20-29 tuổi rơi vào khoảng Trung bình

    • 44 năm có số dân từ 20-29 tuổi rơi vào khoảng Nhiều

Từ đó, ta có thể so sánh dễ dàng, số người trẻ ở Hàn Quốc nhiều hơn hẳn so với Triều Tiên


Dân số từ 50 - 59 tuổi - Population aged 50 to 59 years

HanTrieu$a50to59.c <- cut(HanTrieu$a50to59,3)
table(cut(HanTrieu$a50to59,3))
## 
## (5.51e+05,3.24e+06] (3.24e+06,5.91e+06]  (5.91e+06,8.6e+06] 
##                 104                  27                  13
HanTrieu$a50to59.c <- cut(HanTrieu$a50to59,3, labels = c('Ít','Vừa','Đông'))

Với cách hiểu giống như độ tuổi 20-29, thì ở độ tuổi 50-59 cũng giống như vậy

Ta cũng dùng lệnh cut để chia thông tin Dân số từ 50 - 59 tuổi thành 3 khoảng Ít, Vừa, Đông

table(HanTrieu$a50to59.c,HanTrieu$ten)
##       
##        North Korea South Korea
##   Ít            66          38
##   Vừa            6          21
##   Đông           0          13

Kết Quả ta có thể thấy như phía trên - ta phân tích và đưa ra so sánh tương tự như ở độ tuổi 20-29


Nhật Bản

Nhật Bản là một quốc gia và đảo quốc có chủ quyền nằm ở khu vực Đông Á

  • Nhật Bản nổi tiếng với tuổi thọ cao nhất thế giới, vì họ có bí quyết và chế độ ăn rất lành mạnh

  • Nên ta sẽ tiến hành phân tích Dân số của Nhật Bản trên 100 tuổi - Population older than 100 years


Dân số trên 100 tuổi - Population older than 100 years

  • Ngoài ra ta cũng sẽ tiến hành so sánh Nhật Bản so với các nước trong khu vực Đông Á

  • Đấu tiên ta tiến hành rút dữ liệu của 6 quốc gia khu vực Đông Á đã nêu trên, với tên DongA gồm 432 quan sát và 24 biến

EA <- pp
DongA <- EA[EA$ten == 'China'| EA$ten == 'Hong Kong'| EA$ten == 'Taiwan'| EA$ten =='North Korea'| EA$ten =='South Korea'| EA$ten =='Japan',]
  • Sau đó ta lại tiến hành cut/chia số dân có tuổi trên 100 thành 4 khoảng

    • Khoảng thứ nhất : từ 0 - hơn 30 ngàn người

    • Khoảng thứ hai : từ 30 ngàn - hơn 60 ngàn người

    • Khoảng thứ ba : từ 60 ngàn - hơn 90 ngàn người

    • Khoảng thứ tư : từ 90 ngàn - 100 ngàn người

  • Khác với các bảng tần số phía trên, ta sẽ ghi số liệu người cụ thể thay vì là Ít Vừa Nhiều như các so sánh phía trên

DongA$old100.C <- cut(DongA$old100,4)
table(cut(DongA$old100,4))
## 
##     (-132,3.29e+04] (3.29e+04,6.59e+04] (6.59e+04,9.88e+04] (9.88e+04,1.32e+05] 
##                 411                   9                   6                   6
DongA$old100.c <- cut(DongA$old100,4, labels = c('ít hơn 30k người','Từ 30k-60k người','Từ 60k-90k người','Từ 90k-100k người'))
table(DongA$old100.c,DongA$ten)
##                    
##                     China Hong Kong Japan North Korea South Korea Taiwan
##   ít hơn 30k người     70        72    53          72          72     72
##   Từ 30k-60k người      2         0     7           0           0      0
##   Từ 60k-90k người      0         0     6           0           0      0
##   Từ 90k-100k người     0         0     6           0           0      0

Kết quả cho ta thấy được sự khác biệt rõ rệt của Nhật Bản so với các nước còn lại

  • Trong khi nhật bản có tới 12 năm có số dân trên 100 tuổi từ 60 ngàn tới 100 ngàn người, thì các nước khác lại số năm lại bằng 0

  • Các nước khác như Hàn Quốc, Triều Tiên,… thì 72 năm, số dân trên 100 tuổi chỉ ít hơn 30 ngàn người


3. Tính toán các đặc trưng đo lường theo nhóm

Tóm tắt các giá trị đo lường

1. Mean - số trung bình hay là một điểm giữa của một tập hợp/ đối tượng được yêu cầu

2. Median - sô trung vị hay là một điểm trung tâm trong một danh sách được sắp xếp tăng hoặc giảm dần (nó khác trung bình ở chỗ nó chia đối tượng ra làm đôi và chưa chắc 2 bên đó sẽ cân bằng nhau)

3. Variance - phương sai là phép đo mức chênh lệch giữa các số liệu trong một tập dữ liệu được yêu cầu so với giá trị trung bình

4. Standard deviation - Sd - độ lệch chuẩn là độ lệch so với tiêu chuẩn, dữ liệu nào cũng sẽ có sai số nhất định. Nên nếu sự chênh lệch không đáng kể thì độ lệch chuẩn cũng như tính biến động ở mức thấp và ngược lại

5. Ngoài ra còn có đặc trưng khác : Max - giá trị lớn nhất, Min - giá trị nhỏ nhất, 1st Qu.,3rd Qu. - phân vị thứ 1, thứ 3,….

Ta sẽ đa số tiến hành tính toán 2 trong số các giá trị phía trên là Mean và Med

Theo quốc gia

Ta tính các giá trị đặc trưng đo lường của tổng dân số của Trung Quốc trong 72 năm


Summary - Bản tóm tắt các đặc trưng

  • Lệnh summary() như một bản tóm tắt các giá trị đặc trưng đã nêu bên trên về một đối tượng nào đó mà ta yêu cầu, ta có thể tính từng đặc trưng riêng hoặc có thể xem chỉ trong summary

  • Với lệnh summary(China$popu) - biểu thị các đặc trưng về tổng dân số của Trung Quốc trong 72 năm, ta có thể xem :

summary(China$popu)
##      Min.   1st Qu.    Median      Mean   3rd Qu.      Max. 
## 5.440e+08 7.755e+08 1.069e+09 1.036e+09 1.291e+09 1.426e+09

Kết quả có ý nghĩa như sau :

  • Min - Giá trị nhỏ nhất : Tổng dân số ít nhất của Trung Quốc từng ghi nhận trong 72 năm là khoảng 543 triệu người

  • 1st Qu. - Phân vị thứ nhất :là con số chia tách dữ liệu thành 2 phần bằng nhau, trong đó 25% dữ liệu thấp hơn và 75% dữ liệu cao hơn số phân vị

    • Cụ thể - Số phân vị thứ nhất 775 triệu chia tách tổng dân số TQ lúc này làm 2, trong đó :

    • 25% tổng dân số sẽ thấp hơn 775 triệu người

    • 75% tổng dân số sẽ cao hơn 775 triệu

  • Median - Trung vị : là khoảng 1,06 tỷ, nó giống tứ phân vị thứ nhất nhưng khác ở chỗ chia tổng dân số làm 50%-50%

    • 50% tổng dân số sẽ thấp hơn 1,06 tỷ

    • 50% tổng dân số sẽ cao hơn 1,06 tỷ

  • Mean - Gía trị trung bình : là khoảng 1,03 tỷ, con số này là giá trị trung bình mỗi năm tổng dân số Trung Quốc là khoảng 1,03 tỷ người

  • 3rd Qu. - Phân vị thứ ba : là 1.03 tỷ, nó giống tứ phân vị thứ nhất nhưng khác ở chỗ chia tổng dân số làm 75%-25%

    • 75% tổng dân số sẽ thấp hơn 1.03 tỷ người

    • 25% tổng dân số sẽ cao hơn 1,03 tỷ người

  • Max - Gía trị lớn nhất : ổng dân số đông nhất của Trung Quốc từng ghi nhận trong 72 năm là khoảng 1,4 tỷ người


Mean - Số trung bình

  • Ta có thể xem tóm tắt trong bảng summary hoặc tính riêng bằng lệnh mean()

  • Lệnh mean() cho biết số trung bình của đối tượng được yêu cầu

    • Cụ thể tính trung bình tổng dân số của Trung Quốc trong 72 năm bằng lệnh mean(China$popu)

    • Kết quả thu được là : 1,035,531,645 người

    • Ý nghĩa : trung bình mỗi năm tổng dân số ghi nhận được của Trung Quốc là 1,035,531,645 người

mean(China$popu,na.rm = T)
## [1] 1035531645

Med - Số trung vị

  • Ta có thể xem tóm tắt trong bảng summary hoặc tính riêng bằng lệnh median()

  • Lệnh median() cho biết số trung vị của đối tượng được yêu cầu

    • Cụ thể tính trung vị của tổng dân số của Trung Quốc trong 72 năm bằng lệnh median(China$popu)

    • Kết quả thu được là : 1,069,005,250 người

    • Ý nghĩa : con số 1,069,005,250 chia tổng dân số Trung Quốc làm 2, một nửa sẽ trên 1 tỷ người và một nửa sẽ dưới 1 tỷ người đó

median(China$popu)
## [1] 1069005250

Theo nhóm quốc gia

Mean - Số trung bình

Ta sẽ tiến hành tính Tổng trung bình dân số của các quốc gia tại Đông Á đã nêu trên trong 72 năm

  • Cụ thể tính trung bình tổng dân số của 6 nước Đông Á trong 72 năm bằng lệnh mean(popu)

    • ten - là tên các quốc gia cụ thể

    • n - là số năm, kết quả của mỗi nước là 72, có nghĩa là tổng trung bình được tính trong 72 năm

    • meanofAE - là tên ta đặt cho lệnh mean(popu), có nghĩa là trung bình dân số của quốc gia Đông Á

library(dplyr)
## 
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
trungbinhpp <- DongA %>% group_by(ten) %>% summarise(n = n(),meanofAE = mean(popu))
trungbinhpp
ten n meanofAE
China 72 1035531645
Hong Kong 72 5244305
Japan 72 114649992
North Korea 72 18871336
South Korea 72 39063442
Taiwan 72 18042708

Med - Số trung vị

Ta sẽ tiến hành tính Trung vị của các quốc gia tại Đông Á đã nêu trên trong 72 năm

  • Cụ thể tính trung vị dân số dưới 1 tuổi của 6 nước Đông Á bằng lệnh mmedian(un1)

    • ten - là tên các quốc gia cụ thể

    • trungviQG - là tên ta đặt cho lệnh med(un1)

    • Kết quả trả về có ý nghĩa : Ví dụ về Trung Quốc Trong tổng dân số dưới 1 tuổi của Trung Quốc, số trung vị là 20,224,508, chính là số chính giữa/ chia làm đôi tổng dân số 1 tuổi đó, nó không phải là trung bình mà chỉ là số ngăn giữa các giá trị (Các nước còn lại tương tự như vậy)

trungviQG <- DongA %>% group_by(ten) %>% summarise(medTQ = median(un1))
trungviQG
ten medTQ
China 20224508.0
Hong Kong 74874.0
Japan 1384374.0
North Korea 377300.5
South Korea 706925.0
Taiwan 337925.5

Theo thời gian - năm

Ta sẽ tiến hành tính trung bình tổng dân số của các quốc gia tại Đông Á - cụ thể là 6 nước đã nêu trên tại năm 2020

  • Lệnh mean() cho biết số trung bình của đối tượng được yêu cầu, ngoài ra ta có yêu cầu cụ thể về năm cho lệnh group_by(year=2020) là năm 2020

  • Kết quả thu được tổng dân số trong năm 2020 của 6 quốc gia là 205,233,905 người

trungbinhtheonam <- DongA %>% group_by(year=2020) %>% summarise(meankhoang = mean(popu))
trungbinhtheonam
year meankhoang
2020 205233905

Theo khoảng thời gian

Ta sẽ tiến hành tính trung bình tổng dân số của 6 quốc gia đã nêu trên trong từ 1950-2021 :

  • Kết quả thu được bắt đầu từ năm 1950, meankhoang là biểu thị cho kết quả trung bình dân của mỗi năm
trungbinhtheokhoang <- DongA %>% group_by(year) %>% summarise(meankhoang = mean(popu))
trungbinhtheokhoang
year meankhoang
1950 111523889
1951 113330424
1952 115487059
1953 117882165
1954 120324402
1955 122927605
1956 125465595
1957 128129124
1958 130823203
1959 132630082
1960 133367761
1961 133948030
1962 135901298
1963 139525980
1964 143400374
1965 147045531
1966 150649717
1967 154096030
1968 157790397
1969 161761034
1970 165743713
1971 169677579
1972 173425295
1973 177048003
1974 180468460
1975 183532216
1976 186310668
1977 188886985
1978 191333705
1979 193864628
1980 196536614
1981 199348442
1982 202391107
1983 205345665
1984 208155882
1985 211140129
1986 214359524
1987 217834053
1988 221291835
1989 224650822
1990 228122472
1991 231166202
1992 233560285
1993 235759430
1994 237856521
1995 239842834
1996 241707585
1997 243470891
1998 245146352
1999 246735399
2000 248330759
2001 249919551
2002 251417565
2003 252862874
2004 254297235
2005 255734953
2006 257184909
2007 258673416
2008 260193585
2009 261758476
2010 263335304
2011 264895795
2012 266567429
2013 268251087
2014 269854200
2015 271355138
2016 272768927
2017 274182159
2018 275308012
2019 276081486
2020 276534858
2021 276610427

Nhiệm vụ 3.2

1. Chọn bộ dữ liệu : WHO-COVID-19-global-data

Mô tả bộ dữ liệu

  • Trang web tham khảo của bộ dữ liệu : WHO DATA

  • Bộ dữ liệu gồm có : 50,640 obs - quan sát8 variables - biến

  • Nội dung của bộ dữ liệu về :

    • Nghĩa tiếng Việt : Dữ liệu toàn cầu về COVID-19 của Tổ chức Y tế Thế giới WHO

    • Chuỗi dữ liệu này cho biết các trường hợp ghi nhận mắc COVID-19trường hợp ghi nhận đã tử vong vì COVID-19 của các quốc gia

    • Thời gian được tính từ tháng 1/2020 đến ngày cập nhật mới nhất là tháng 1/2024

    • Mỗi quốc gia và vùng lãnh thổ đều có văn phòng khu vực của WHO phụ trách, ngày ghi nhận, số trường hợp mắc và tử vong,….

  • Lưu ý về bộ dữ liệu : số liệu được ghi nhận được tính theo từng ngày nhưng sẽ không cách đều nhau và có tổng là 211 ngày cho mỗi quốc gia (tính từ tháng 1/2020 - tháng 1/2024)


Đọc bộ dữ liệu

  • WHO-COVID-19-global-data là file csv, nên ta đọc bộ dữ liệu từ file csv

  • Ta tiến hành gán bộ dữ liệu gốc với tên mới là covid

  • Thao tác thực hiện :

library(csv)
covid <- read.csv('D:/UFM/WHO-COVID-19-global-data.csv', header = T)

Một số thông tin bao quát/ mở rộng của bộ dữ liệu covid

Ta có thể biết thêm các thông tin bao quát của bộ dữ liệu covid phía dưới đây

library(skimr)
skim(covid)
Data summary
Name covid
Number of rows 50640
Number of columns 8
_______________________
Column type frequency:
character 4
numeric 4
________________________
Group variables None

Variable type: character

skim_variable n_missing complete_rate min max empty n_unique whitespace
Date_reported 0 1 10 10 0 211 0
Country_code 211 1 0 2 1266 234 0
Country 0 1 0 70 1266 235 0
WHO_region 0 1 0 5 5064 7 0

Variable type: numeric

skim_variable n_missing complete_rate mean sd p0 p25 p50 p75 p100 hist
New_cases 14112 0.72 21193.20 279846.40 -65079 51 468 4492.75 40475477 ▇▁▁▁▁
Cumulative_cases 0 1.00 1588261.25 7146834.64 0 2698 38084 462250.25 103436829 ▇▁▁▁▁
New_deaths 26479 0.48 290.27 1233.71 -3432 4 21 110.00 47687 ▇▁▁▁▁
Cumulative_deaths 0 1.00 18681.03 77848.56 0 20 410 6025.25 1161235 ▇▁▁▁▁

2. Phân tích dữ liệu

Trong bộ dữ liệu covid, cung cấp rất nhiều thông tin của nhiều quốc gia và vùng lãnh thổ trên thế giới về việc ghi nhận ca của đại dịch COVID-19. Ta có thể tiến hành một trong số đó để tiến hành phân tích

  • Ta chọn 5 quốc gia trong số các quốc gia và vùng lãnh thổ để phân tích, trong đó gồm :

    1. Viet Nam - Việt Nam

    2. Cambodia - Campuchia

    3. Thailand - Thái Lan

    4. China - Trung Quốc

    5. India - Ấn Dộ

Trong bộ dữ liệu covid, cũng đã tổng hợp số liệu về các ca mắc và tử vong ghi nhận theo ngày tháng năm của các quốc gia và vùng lãnh thổ

  • Ta tiến hành chọn trong các thông tin ghi nhận đó, bao gồm :

    1. New_cases - Số trường hợp ghi nhận mắc covid (theo từng ngày riêng biệt, không tích lũy/ cộng dồn)

    2. New_death - Sô trường hợp ghi nhận đã tử vong (theo từng ngày riêng biệt, không tích lũy/ cộng dồn)

    3. Cumulative_cases - Số ca ghi nhận tích lũy mắc covid (có cộng dồn từng ngày)

    4. Cumulative_deaths - Số trường hợp ghi nhận tích lũy đã tử vong vì covid (có cộng dồn từng ngày)


Các quốc gia cụ thể

New_cases - Trường hợp ghi nhận mắc covid (theo từng ngày riêng biệt, không tích lũy)

Trong bài phân tích về tình hình covid-19, ta sẽ phân tích trên 3 nước : Việt Nam - Thái Lan - Campuchia trước tiên

  • Ta tiến hành về Trường hợp ghi nhận mắc covid

  • Ta dùng lệnh cut để chia thông tin Trường hợp ghi nhận mắc covid thành 3 khoảng, bao gồm :

    • Khoảng thứ nhất với số trường hợp từ 0 ca mắc - đến 600 ngàn ca

    • Khoảng thứ hai với số trường hợp từ hơn 600 ngàn ca mắc - đến 1,2 triệu ca

    • Khoảng thứ ba với số trường hợp từ hơn 1,2 triệu ca mắc - đến hơn 1,8 triệu ca

CV <- covid
DD <- CV[CV$Country == 'Viet Nam' | CV$Country == 'Cambodia' | CV$Country == 'Thailand',]
table(cut(DD$New_cases,3))
## 
## (-1.85e+03,6.15e+05]  (6.15e+05,1.23e+06]  (1.23e+06,1.85e+06] 
##                  568                    3                    2
DD$New_cases.c <- cut(DD$New_cases,3, labels = c('0_600kcases','600k_1,2Mcases','1,2_1,8Mcases'))
table(DD$Country,DD$New_cases.c)
##           
##            0_600kcases 600k_1,2Mcases 1,2_1,8Mcases
##   Cambodia         172              0             0
##   Thailand         209              0             0
##   Viet Nam         187              3             2
  • Sau đó ta tiến hành lập bảng bằng lệnh table cho khoảng mà ta đã chia ở phía trên

  • Các số trong bảng biểu hiện cho số ngày ghi nhận các ca mắc theo khoảng đã chia, số ca ghi nhận mỗi ngày của mỗi quốc gia là khác nhau - kết quả từ bảng cho thấy :

    • Việt Nam là nước ghi nhận số ca mắc nhiều nhất :

      • 187 ngày ghi nhận từ 0 đến 600 ngàn ca

      • 3 ngày ghi nhận từ 600 ngàn đến 1,2 triệu ca

      • 2 ngày ghi nhận từ 1,2 triệu - 1,8 triệu ca

    • Thái Lan là nước đứng phía sau : 209 ngày ghi nhận với từ 0 - 600 ngàn ca mắc

    • Campuchia là nước có số ngày ghi nhận ca mắc covid ít nhất trong 3 nước - 172 ngày ghi nhận với từ 0 - 600 ngàn ca mắc


New_death - Trường hợp ghi nhận đã tử vong (theo từng ngày riêng biệt, không tích lũy)

Một trong những quốc gia ghi nhận có số ca tử vong vì covid đứng đầu Ở Châu Á là Ấn Độ

Một trong những quốc gia khởi đầu cho đại dịch này chính là Trung Quốc

  • Ta sẽ tiến hành so sánh 5 quốc gia đã nêu trên về Trường hợp ghi nhận đã tử vong vì covid, để thấy được sự khác biệt

  • Ta dùng lệnh cut để chia thông tin Trường hợp ghi nhận đã tư vong vì covid thành 3 khoảng, bao gồm :

    • Khoảng thứ nhất với số trường hợp từ 0 - đến 15 ngàn trường hợp

    • Khoảng thứ hai với số trường hợp từ hơn 15 ngàn - đến 31 ngàn trường hợp

    • Khoảng thứ ba với số trường hợp từ hơn 31 ngàn - đến hơn 47 ngàn trường hợp

DD1 <- CV[CV$Country == 'Viet Nam' | CV$Country == 'Cambodia' | CV$Country == 'Thailand' | CV$Country == 'India' | CV$Country == 'China',]
table(cut(DD1$New_deaths,3))
## 
##     (-108,1.59e+04] (1.59e+04,3.18e+04] (3.18e+04,4.77e+04] 
##                 677                   9                   1
DD1$New_deaths.c <- cut(DD1$New_deaths,3, labels = c('0_15k','15k_31k','31k_47k'))
table(DD1$New_deaths.c,DD1$Country)
##          
##           Cambodia China India Thailand Viet Nam
##   0_15k         52   166   191      172       96
##   15k_31k        0     1     8        0        0
##   31k_47k        0     1     0        0        0
  • Sau đó ta tiến hành lập bảng bằng lệnh table cho khoảng mà ta đã chia ở phía trên

  • Các số tronh bảng biểu hiện cho số ngày ghi nhận các ca mắc theo khoảng đã chia, kết quả cho thấy :

    • Ấn Độ đứng đầu về số ngày ghi nhận ca tử vong, 191 ngày ghi nhận từ 0 đến 15 ngàn ca tử vong, 8 ngày ghi nhận từ 15 ngàn đến 31 ngàn ca tử vong

    • Lần lượt còn lại có thể theo dõi trong bảng theo cảnh hiểu như bản Trường hợp ghi nhận mắc covid

3. Tính toán các đặc trưng

Kết quả của các phân tích về số ca ghi nhận / số ca tử vong đã giúp ta thấy được phần nào về đại dịch covid-19 của thế giới nói chung, và từng quốc gia nói riêng

Và tiếp theo, ta sẽ tính số trung bình, số trung vị, số phân vị… của các thông tin trên để có thể thấy được tổng quan hơn về các số liệu


Theo quốc gia - Việt Nam

Summary - Bản tóm tắt

Ta biểu thị các đặc trưng về số ca ghi nhận mắc covid ở Việt Nam trong bộ dữ liệu, ta có thể xem :

VN <- CV[CV$Country== 'Viet Nam',]
summary(VN$Cumulative_cases)
##     Min.  1st Qu.   Median     Mean  3rd Qu.     Max. 
##        0     1504  1899575  5388552 11525914 11624000

Kết quả có ý nghĩa như sau :

  • Min - Gía trị nhỏ nhất : Số ca ghi nhận mắc covid ít nhất từng ghi nhận là 0 có ca nào

  • 1st Qu. - Phân vị thứ nhất :là 1504 ca, số này chia tách tổng ca mắc lúc này làm 2, trong đó :

    • 25% tổng số ca sẽ thấp hơn 1504 ca

    • 75% tổng số ca sẽ cao hơn 1504 ca

  • Median - Trung vị : là 1,899,575 ca, nó giống tứ phân vị thứ nhất nhưng chia tổng số ca làm 50%-50%

    • 50% tổng số ca sẽ thấp hơn 1,899,575 ca

    • 50% tổng số ca sẽ cao hơn 1,899,575 ca

  • Mean - Gía trị trung bình : là 5,388,552 ca, con số có nghĩa số ca trung bình là 5,388,552 ca

  • 3rd Qu. - Phân vị thứ ba : là 11,525,914 ca, nó giống tứ phân vị thứ nhất nhưng chia tổng dân số làm 75%-25%

    • 75% tổng số ca sẽ thấp hơn 11,525,914 ca

    • 25% tổng số ca sẽ cao hơn 11,525,914 ca

  • Max - Gía trị lớn nhất : Số ca ghi nhận mắc covid nhiều nhất từng ghi nhận là 11,624,000 ca


Mean - Số trung bình

Ta tính trung bình số ca mắc/ tử vong covid-19 của Việt Nam

VN <- CV[CV$Country== 'Viet Nam',]
mean(VN$Cumulative_cases,na.rm = T)
## [1] 5388552
mean(VN$Cumulative_deaths,na.rm = T)
## [1] 23542.68

Kết quả thu được số trung bình như sau :

  • Trung bình Trường hợp ghi nhận tích lũy mắc covid là 5,388,552 người

  • Trung bình Trường hợp ghi nhận tích lũy tử vong mắc vì covid là 23,542 người


Med - Số trung vị

Ta tính số trung vị ca mắc/ tử vong covid-19 của Việt Nam

median(VN$Cumulative_cases)
## [1] 1899575
median(VN$Cumulative_deaths)
## [1] 34319

Kết quả thu được số trung vị như sau :

  • Trung vị Trường hợp ghi nhận tích lũy mắc covid là 1,899,575 người

  • Trung vị Trường hợp ghi nhận tích lũy tử vong mắc vì covid là 34,319 người


Theo nhóm quốc gia

Ở các nhóm quốc gia, ta sẽ tiến hành tính cả Số trung bìnhSô trung vị của Trường hợp ghi nhận tích lũy mắc/ tử vong vì covid của 5 quốc gia đã phân tích phía trên

trungviQGGcase <- DD1 %>% group_by(Country) %>% summarise(meanQGGcase = mean(Cumulative_cases))
trungviQGGcase
Country meanQGGcase
Cambodia 83315.3
China 27229276.3
India 29253586.2
Thailand 2429007.1
Viet Nam 5388552.1
trungviQGGdeath <- DD1 %>% group_by(Country) %>% summarise(medQGGdeath = median(Cumulative_deaths))
trungviQGGdeath
Country medQGGdeath
Cambodia 3015
China 5699
India 483790
Thailand 21825
Viet Nam 34319

Kết quả thu được số trung vị như sau :

  • meanQGGcase : cho thấy số trung bình ghi nhận ca mắc covid tích lũy

  • medofQGGdeath : cho thấy số trung vị tử vong vì covid tích lũy

LS0tDQp0aXRsZTogIlbDrSBk4bulIDMiDQphdXRob3I6ICJWxakgUXXhu7NuaCBUcsO6YyBWeSINCmRhdGU6ICJgciBmb3JtYXQoU3lzLnRpbWUoKSwgJyVIOiVNOiVTLCAlZCAtICVtIC0gJVknKWAiDQpvdXRwdXQ6DQogIGh0bWxfZG9jdW1lbnQ6DQogICAgY29kZV9kb3dubG9hZDogdHJ1ZQ0KICAgIGNvZGVfZm9sZGluZzogaGlkZQ0KICAgIHRvY19mbG9hdDogdHJ1ZQ0KICAgIHRvYzogdHJ1ZQ0KICAgIGRmX3ByaW50OiBrYWJsZQ0KLS0tDQoNCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQ0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBUUlVFKQ0KYGBgDQoNCg0KIyAqKk5oaeG7h20gduG7pSAzLjEqKg0KDQpOaGnhu4dtIHbhu6UgMy4xIHnDqnUgY+G6p3UgdGjhu7FjIGhp4buHbiBjw6FjIHRoYW8gdMOhYyDEkcOjIGjhu41jIHRyw6puIGLhu5kgZOG7ryBsaeG7h3UgKipwb3B1bGF0aW9uLWFuZC1kZW1vZ3JhcGh5KioNCg0KIyMgKioxLiBNw7QgdOG6oyBi4buZIGThu68gbGnhu4d1KiogKioqcG9wdWxhdGlvbi1hbmQtZGVtb2dyYXBoeSoqKg0KDQojIyMgKipDw6FjIHRow7RuZyB0aW4gY8ahIGLhuqNuIHbhu4EgYuG7mSBk4buvIGxp4buHdSoqDQoNCi0gQuG7mSBkxrAgbGnhu4d1IGN1bmcgY+G6pXAgdGjDtG5nIHRpbiB24buBICoqKkTDom4gc+G7kSB2w6AgTmjDom4ga2jhuql1IGjhu41jKioqIGPhu6dhIGPDoWMgcXXhu5FjIGdpYSB0aGVvIGPDoWMgbsSDbSB2w6AgdOG7q25nIMSR4buZIHR14buVaQ0KDQotIE5ndeG7k24gdGhhbSBraOG6o28gY+G7p2EgYuG7mSBk4buvIGxp4buHdSA6IFtEYXRhXShodHRwczovL2RyaXZlLmdvb2dsZS5jb20vZHJpdmUvZm9sZGVycy8xcWRYM1p4cS1hQmRLVlc1djRiaHRYM3pSbG5oeXp6QlU/dXNwPXNoYXJpbmcpDQoNCi0tLQ0KDQojIyMgKirEkOG7jWMgYuG7mSBk4buvIGxp4buHdSoqIA0KDQotICoqKnBvcHVsYXRpb24tYW5kLWRlbW9ncmFwaHkqKiogbMOgIGZpbGUgKipjc3YqKiwgbsOqbiB0YSDEkeG7jWMgdOG7qyBmaWxlIGNzdg0KDQotICoqVGhhbyB0w6FjIHRo4buxYyBoaeG7h24gOioqIFRhIGfDoW4gYuG7mSBk4buvIGxp4buHdSAqKipwb3B1bGF0aW9uLWFuZC1kZW1vZ3JhcGh5KioqIHbhu5tpIHTDqm4gbMOgICoqcHAqKg0KDQpgYGB7cn0NCmxpYnJhcnkoY3N2KQ0KcHAgPC0gcmVhZC5jc3YoIkQ6L1VGTS8yMDI0LSBLw6wgMS9OZ8O0biBOZ+G7ryBM4bqtcCBUcsOsbmgvcG9wdWxhdGlvbi1hbmQtZGVtb2dyYXBoeS5jc3YiLCBoZWFkZXIgPSBUKQ0KYGBgDQoNCi0tLQ0KDQojIyMgKipDw6FjIHRow7RuZyB0aW4gdOG7lW5nIHF1YW4gduG7gSBi4buZIGThu68gbGnhu4d1KioNCg0KIyMjIyAqKlPhu5EgcXVhbiBzw6F0IHbDoCBz4buRIGJp4bq/bioqDQoNCi0gQuG7mSBk4buvIGxp4buHdSAqKnBwKiogYmFvIGfhu5NtICoqMTgyODggb2JzIChxdWFuIHPDoXQpIHbDoCAyNCB2YXJpYWJsZXMgKGJp4bq/bikqKg0KDQotIEPDsyB0aOG7gyBiaeG6v3QgxJHGsOG7o2MgKipz4buRIHF1YW4gc8OhdCB2w6Agc+G7kSBiaeG6v24gdGjDtG5nIHF1YSBs4buHbmgqKiAqKmRpbSoqKiwga+G6v3QgcXXhuqMgdHLhuqMgduG7gSBn4buTbSAyIGdpw6EgdHLhu4sgc+G7kQ0KDQogICAtIFPhu5EgMTgyODggxJHhuqFpIGRp4buHbiBjaG8gdOG7lW5nIHPhu5EgcXVhbiBzw6F0DQoNCiAgIC0gU+G7kSAyNCDEkeG6oWkgZGnhu4duIGNobyB04buRbmcgc+G7kSBiaeG6v24NCg0KYGBge3J9DQpkaW0ocHApDQpgYGANCg0KLS0tDQoNCiMjIyMgKirEkOG7mSBkw6BpKioNCg0KLSAqKsSQ4buZIGTDoGkqKiBj4bunYSBi4buZIGThu68gbGnhu4d1ICoqcHAqKiBsw6AgKioyNCoqIA0KDQotIEPDsyB0aOG7gyBiaeG6v3QgxJHGsOG7o2MgKirEkeG7mSBkw6BpKiogaGF5IGPFqW5nIGPDsyB0aOG7gyBsw6AgKipz4buRICpiaeG6v24qKiB0aMO0bmcgcXVhIGzhu4duaCAqKipsZW5ndGgqKiwga+G6v3QgcXXhuqMgdHLhuqMgduG7gSBnacOhIHRy4buLIHPhu5ENCg0KICAgLSBW4bubaSBi4buZIGThu68gbGnhu4d1LCBr4bq/dCBxdeG6oyBsw6AgKioqMjQqKiogLSBuZ2jEqWEgbMOgIGLhu5kgZOG7ryBsaeG7h3UgY8OzICoqMjQgYmnhur9uIChj4buZdCkqKg0KDQpgYGB7cn0NCmxlbmd0aChwcCkNCmBgYA0KDQotLS0NCg0KIyMjIyAqKk3hu5l0IHPhu5EgdGjDtG5nIHRpbiBraMOhYyBj4bunYSBi4buZIGThu68gbGnhu4d1IHBwKioNCg0KLSAqKnNraW0qKiAtIGNobyBiaeG6v3QgdGjDqm0gY8OhYyB0aMO0bmcgdGluIGtow6FjIHbhu4EgYuG7mSBk4buvIGxp4buHdSAgDQoNCkPDoWMgdGjDtG5nIHRpbiDEkcaw4bujYyBiaeG6v3QgbmjGsCA6ICoqKnPhu5EgbOG7lyBo4buPbmcvIGLhu48gdHLhu5FuZyAobl9taXNzaW5nKSwgc+G7kSB0cnVuZyBiw6xuaCAobWVhbiksIMSR4buZIGzhu4djaCBjaHXhuqluIChzZCkgLC4uLioqKg0KQ8OzIHRo4buDIHhlbSB0aMOqbSBjw6FjIHRow7RuZyB0aW4ga2jDoWMgYsOqbiBkxrDhu5tpIDoNCg0KYGBge3J9DQpsaWJyYXJ5KHNraW1yKQ0Kc2tpbShwcCkNCmBgYA0KDQoNCi0tLQ0KDQojIyMjICoqVMOqbiBj4bulIHRo4buDIGPhu6dhIGPDoWMgYmnhur9uKioNCg0KLSBC4buZIGThu68gbGnhu4d1ICoqcHAqKiBjw7MgKioyNCBiaeG6v24gdsOgIHTDqm4gdMawxqFuZyDhu6luZyoqIA0KDQotIEPDsyB0aOG7gyBiaeG6v3QgxJHGsOG7o2MgdMOqbiBj4bunYSB04burbmcgYmnhur9uIGPhu6UgdGjhu4MgdGjDtG5nIHF1YSBs4buHbmggKipuYW1lcyoqICANCg0KICAgLSBW4bubaSBi4buZIGThu68gbGnhu4d1LCBr4bq/dCBxdeG6oyBjw7MgKioqMjQgYmnhur9uKioqIHbhu5tpIGPDoWMgdMOqbiB0xrDGoW5nIOG7qW5nLCBj4bulIHRo4buDIG5oxrAgc2F1IDoNCg0KYGBge3J9DQpuYW1lcyhwcCkNCmBgYA0KDQotLS0NCg0KIyMjIyAqKsSQ4buVaSB0w6puIGPDoWMgYmnhur9uKioNCg0KLSBW4bubaSBi4buZIGThu68gbGnhu4d1ICoqcHAqKiwgdMOqbiBj4bunYSBjw6FjIGJp4bq/biDEkcaw4bujYyDEkeG6t3QgxJHhu4MgbmfGsOG7nWkgxJHhu41jIGPhu6dhIHRo4buDIGhp4buDdSByw7UgduG7gSB0aMO0bmcgdGluIGTDom4gc+G7kSBj4bulIHRo4buDIGPhu6dhIHThu6tuZyDEkeG7mSB0deG7lWksIG5oxrBuZyDEkeG7mSBkw6BpIHRyb25nIG3hu5dpIHTDqm4gY8WpbmcgZ8OieSBraMOzIGtoxINuIHbDoCBt4bqldCB0aOG7nWkgZ2lhbiB0cm9uZyB2aeG7h2MgcsO6dCB0csOtY2ggZOG7ryBsaeG7h3UNCg0KLSBUaMO0bmcgcXVhIGzhu4duaCAqKm5hbWVzKiogLSBnacO6cCAqKsSR4buVaSB0w6puKiogY8OhYyBiaeG6v24sIHThu6sgxJHDsyBk4buvIGxp4buHdSB0cuG7nyBuw6puIG5n4bqvbiBn4buNbiwgZOG7hSBkw6BuZyB0aGFvIHTDoWMgdsOgIHRp4bq/dCBraeG7h20gdGjhu51pIGdpYW4NCg0KLSBW4bubaSBi4buZIGThu68gbGnhu4d1ICoqcHAqKiB0YSB0aeG6v24gaMOgbmggxJHhu5VpIDogIA0KDQoNCmBgYHtyfQ0KbmFtZXMocHApIDwtIGMoJ3RlbicsJ3llYXInLCdwb3B1JywndW4xJywndW41JywndW4xNScsJ3VuMjUnLCcxNXRvNjQnLCdvbGQxNScsJ29sZDE4JywnYXQxJywnYTF0bzQnLCdhNXRvOScsJ2ExMHRvMTQnLCdhMTV0bzE5JywnYTIwdG8yOScsJ2EzMHRvMzknLCdhNDB0bzQ5JywnYTUwdG81OScsJ2E2MHRvNjknLCdhNzB0bzc5JywnYTgwdG84OScsJ2E5MHRvOTknLCdvbGQxMDAnKQ0KbmFtZXMocHApDQpgYGANCg0KDQoNCiMjICoqMi4gUGjDom4gdMOtY2ggY8OhYyBxdeG7kWMgZ2lhLCBjw6FjIMSR4buZIHR14buVaSB2w6AgdOG7lW5nIGTDom4gc+G7kSoqIA0KDQpUcm9uZyBi4buZIGThu68gbGnhu4d1ICoqcHAqKiwgY3VuZyBj4bqlcCBy4bqldCBuaGnhu4F1IHRow7RuZyB0aW4gY+G7p2Egbmhp4buBdSBxdeG7kWMgZ2lhIHbDoCB2w7luZyBsw6NuaCB0aOG7lSB0csOqbiB0aOG6vyBnaeG7m2kgduG7gSBkw6JuIHPhu5EgdsOgIG5ow6JuIGto4bqpdSBo4buNYyBj4bunYSBuxrDhu5tjIMSRw7MuIFRhIGPDsyB0aOG7gyB0aeG6v24gaMOgbmggbeG7mXQgdHJvbmcgc+G7kSDEkcOzIMSR4buDIHRp4bq/biBow6BuaCBwaMOibiB0w61jaA0KDQotIFRhIGNo4buNbiA2IHRyb25nIHPhu5EgY8OhYyAqKnF14buRYyBnaWEgdsOgIHbDuW5nIGzDo25oIHRo4buVKiogY8OzIHRyb25nIGLhu5kgZOG7ryBsaeG7h3UgxJHhu4MgcGjDom4gdMOtY2gsIDYgcXXhu5FjIGdpYSDEkcaw4bujYyBjaOG7jW4gdGh14buZYyBraHUgduG7sWMqKiAqKipFYXN0IEFzaWEgLSDEkMO0bmcgw4EqKiogLHRyb25nIMSRw7MgZ+G7k20gOiANCg0KICAgKioxLiBDaGluYSoqIC0gVHJ1bmcgUXXhu5FjDQogICANCiAgICoqMi4gSG9uZyBLb25nKiogLSBI4buTbmcgS29uZw0KICAgDQogICAqKjMuIFRhaXdhbioqIC0gxJDDoGkgTG9hbg0KICAgDQogICAqKjQuIFNvdXRoIEtvcmVhKiogLSBIw6BuIFF14buRYw0KICAgDQogICAqKjUuIE5vcnRoIEtvcmVhKiogLSBUcmnhu4F1IFRpw6puDQogICANCiAgICoqNi4gSmFwYW4qKiAtIE5o4bqtdCBC4bqjbg0KDQoNClRyb25nIGLhu5kgZOG7ryBsaeG7h3UgKipwcCoqIGPFqW5nIMSRw6MgdOG7lW5nIGjhu6NwIHPhu5EgbGnhu4d1IHbhu4EgKip04buVbmcgZMOibiBz4buRIGPFqW5nIG5oxrAgc+G7kSBkw6JuIOG7nyBjw6FjIMSR4buZIHR14buVaSBraMOhYyBuaGF1IHRoZW8gdOG7q25nIG7Eg20qKiAoYuG6r3QgxJHhuqd1IHThu6sgbsSDbSAxOTUwIC0gxJHhur9uIG7Eg20gMjAyMSkgY+G7p2EgY8OhYyBxdeG7kWMgZ2lhIHbDoCB2w7luZyBsw6NuaCB0aOG7lSDEkcOjIG7DqnUgdHLDqm4NCg0KLSBUYSB0aeG6v24gaMOgbmggY2jhu41uIDUgdHJvbmcgY8OhYyBt4bupYyDEkeG7mSB0deG7lWkgxJHDoyBjw7MgdHJvbmcgYuG7mSBk4buvIGxp4buHdSwgKio1IG3hu6ljIMSR4buZIHR14buVaSoqIGfhu5NtIDogDQoNCiAgICoqMS4gUG9wdWxhdGlvbiBvZiBjaGlsZHJlbiB1bmRlciB0aGUgYWdlIG9mIDE1KiogLSBEw6JuIHPhu5EgduG7gSB0cuG6uyBlbSBkxrDhu5tpIDE1IHR14buVaQ0KICAgDQogICAqKjIuIFBvcHVsYXRpb24gYWdlZCAyMCB0byAyOSB5ZWFycyoqIC0gRMOibiBz4buRIMSR4buZIHR14buVaSB04burIDIwIC0gMjkgdHXhu5VpDQogICANCiAgICoqMy4gUG9wdWxhdGlvbiBhZ2VkIDUwIHRvIDU5IHllYXJzKiogLSBEw6JuIHPhu5EgxJHhu5kgdHXhu5VpIHThu6sgNTAgLSA1OSB0deG7lWkNCiAgIA0KICAgKio0LiBQb3B1bGF0aW9uIGFnZWQgODAgdG8gODkgeWVhcnMqKiAtIETDom4gc+G7kSDEkeG7mSB0deG7lWkgdOG7qyA4MCAtIDg5IHR14buVaQ0KICAgDQogICAqKjUuIFBvcHVsYXRpb24gb2xkZXIgdGhhbiAxMDAgeWVhcnMqKiAtIETDom4gc+G7kSB0csOqbiAxMDAgdHXhu5VpDQogICANCg0KIyMjICoqVHJ1bmcgUXXhu5FjKioNCg0KKioqVHJ1bmcgUXXhu5FjKioqIC0gcXXhu5FjIGhp4buHdSBsw6AgQ+G7mW5nIGjDsmEgTmjDom4gZMOibiBUcnVuZyBIb2EgbMOgIG3hu5l0IHF14buRYyBnaWEgbuG6sW0g4bufIGtodSB24buxYyDEkMO0bmcgw4EuIEzDoCBt4buZdCB0cm9uZyBoYWkgcXXhu5FjIGdpYSB04bu3IGTDom4gdsOgIGzDoCBxdeG7kWMgZ2lhIGPDsyBz4buRIGTDom4gxJHDtG5nIHRo4bupIDIgdGjhur8gZ2nhu5tpLCBuw6puIHRhIHPhur0gcGjDom4gdMOtY2ggbsOzIOG7nyBwaOG6p24gKip04buVbmcgZMOibiBz4buRIC0gcG9wdWxhdGlvbioqDQoNCiMjIyMgKipU4buVbmcgZMOibiBz4buRKioNCg0KLS0tDQoNCi0gVHLGsOG7m2MgdGnDqm4gdHJvbmcgMTgsMjg4IHF1YW4gc8OhdCBjw7MgdHJvbmcgYuG7mSBk4buvIGxp4buHdSwgc+G6vSBjw7MgcuG6pXQgbmhp4buBdSBxdeG7kWMgZ2lhIHbDoCB2w7luZyBsw6NuaCB0aOG7lSBraMOhYyBuaGF1LCBoaeG7h24gdOG6oWkgdGEgxJFhbmcgbXXhu5FuIHBow6JuIHTDrWNoIHbhu4EgZMOibiBz4buRIGPhu6dhIFRydW5nIFF14buRYw0KDQotIFRhIHRp4bq/biBow6BuaCBraeG7g20gdHJhIHRyb25nIDE4Mjg4IHF1YW4gc8OhdCwgKipjw7MgYmFvIG5oacOqdSBxdWFuIHPDoXQgY+G7p2EgY+G7p2EgVHJ1bmcgUXXhu5FjKiogDQoNCg0KYGBge3J9DQpDTiA8LSBwcA0KQ04kdGVuLkNvZGVkIDwtIGlmZWxzZShDTiR0ZW4gPT0gJ0NoaW5hJywgJ1RydW5nIFF14buRYycsICdOxrDhu5tjIGtow6FjJykNCnRhYmxlKENOJHRlbi5Db2RlZCkNCmBgYA0KDQpL4bq/dCBxdeG6oyB0aHUgxJHGsOG7o2MgY8OzICoqNzIgcXVhbiBzw6F0IGzDoCBj4bunYSBUcnVuZyBRdeG7kWMqKiwgKioxOCwyMTYgcXVhbiBzw6F0IGzDoCBj4bunYSBxdeG7kWMgZ2lhIGtow6FjKiogdHJvbmcgYuG7mSBk4buvIGxp4buHdSAqKnBwKioNCg0KVsOgIGtow7RuZyBjaOG7iSByacOqbmcgVHJ1bmcgUXXhu5FjLCBt4buXaSBxdeG7kWMgZ2lhIGtow6FjIMSR4buBdSBjw7Mgc+G7kSBsaeG7h3UgdMOtbmggdHJvbmcgNzIgbsSDbSAoMTk1MC0yMDIxKQ0KDQotLS0NCg0KLSBUaMO0bmcgdGluIGN1bmcgY+G6pXAgY+G7p2EgYuG7mSBk4buvIGxp4buHdSAqKnBwKiogbMOgIGPhu6dhIG5oaeG7gXUgcXXhu5FjIGdpYSwgbsOqbiB0YSB0aeG6v24gaMOgbmggbOG7jWMgY8OhYyB0aMO0bmcgdGluLyBxdWFuIHPDoXQgY+G7p2EgKipDaGluYSAtIFRydW5nIFF14buRYyoqIMSR4buDIHBow6JuIHTDrWNoIMSRxrDhu6NjIHRodeG6rW4gdGnhu4duIGjGoW4NCg0KLSBTYXUgxJHDsywgdGEgdGnhur9wIHThu6VjIHRp4bq/biBow6BuaCB4ZW0geMOpdCB0cm9uZyBoxqFuIDcyIG7Eg20gKDE5NTAtMjAyMSksIHbhu5tpIG3hu4duaCBkYW5oIGzDoCDEkeG6pXQgbsaw4bubYyB04bu3IGTDom4gLSAqKlRydW5nIFF14buRYyDEkcOjIGPDsyBiYW8gbmhpw6p1IG7Eg20gY8OzIHThu5VuZyBz4buRIGTDom4gdsaw4bujdCBxdcOhIDEgdOG7tyBuZ8aw4budaSoqDQoNCg0KYGBge3J9DQpDaGluYSA8LSBDTltDTiR0ZW4gPT0gJ0NoaW5hJyxdDQpDTjEgPC0gQ2hpbmENCg0KQ04xJHBvcHUuQ29kZWQxIDwtIGlmZWxzZShDTjEkcG9wdSA+PSAxMDAwMDAwMDAwLCAnTW9yZTFCJywgJ1VuZGVyMUInKQ0KdGFibGUoQ04xJHBvcHUuQ29kZWQxKQ0KYGBgDQoNClbhu5tpIGThu68gbGnhu4d1IMSRw6MgbOG7jWMvIHLDunQgdHLDrWMgdOG7qyBk4buvIGxp4buHdSBn4buRYywgdGEgY8OzIDEgYuG7mSBk4buvIGxp4buHdSBtYW5nIHTDqm4gKipDaGluYSoqIC0gYmFvIGfhu5NtICoqNzIgb2JzIHF1YW4gc8OhdCwgMjYgdmFyaWFibGVzIGJp4bq/bioqDQoNClbDoCB0cm9uZyA3MiBuxINtICgxOTUwLTIwMjEpLCBUcnVuZyBRdeG7kWMgxJHDoyBjw7MgKio0MCBuxINtIGjGoW4gMSB04bu3IGTDom4gLSBNb3JlMUIqKiB2w6AgKiozMiBuxINtIGTGsOG7m2kgMSB04bu3IGTDom4gLSBVbmRlcjFCKioNCg0KLS0tDQoNCiMjIyAqKsSQw6BpIExvYW4gVGFpd2FuIC0gSG9uZyBLb25nKioNCg0KKioqxJDDoGkgTG9hbioqKiBsw6AgxJHhuqNvIHF14buRYyB2w6AgbMOgIG3hu5l0IHF14buRYyBnaWEgY8OzIGNo4bunIHF1eeG7gW4gdGh14buZYyBraHUgduG7sWMgxJDDtG5nIMOBDQoNCioqKkhvbmcgS29uZyoqKiBsw6AgbeG7mXQgdsO5bmcgxJHDtCB0aOG7iyDEkeG6t2MgYmnhu4d0LCBjxaluZyBuaMawIG3hu5l0IHRyb25nIGhhaSDEkeG6t2Mga2h1IGjDoG5oIGNow61uaCBj4bunYSBD4buZbmcgaMOyYSBOaMOibiBkw6JuIFRydW5nIEhvYSAoY8O5bmcgduG7m2kgTWEgQ2FvKQ0KDQotIETDom4gc+G7kSBj4bunYSAqKsSQw6BpIExvYW4gLSBUYWl3YW4gdsOgIEhvbmcgS29uZyoqIHPhur0gY8OzIHBo4bqnbiBraGnDqm0gdOG7kW4gaMahbiBzbyB24bubaSDEkeG6pXQgbsaw4bubYyB04bu3IGTDom4gVHJ1bmcgUXXhu5FjIHbDoCBj4bqjIHRyw6puIHRo4bq/IGdp4bubaS4gTeG6t2MgZMO5IHbhuq15LCBuaMawbmcgcXXhu5FjIGdpYSB2w6AgdsO5bmcgbMOjbmggdGjhu5UgbsOgeSBs4bqhaSBjw7MgbuG7gW4ga2luaCB04bq/IGtow7RuZyBo4buBIGtoacOqbSB04buRbiBuaMawIHbhuq15DQoNCi0gVuG7m2kgMiBxdeG7kWMgZ2lhL3bDuW5nIGzDo25oIHRo4buVIMSR4bq3YyBiaeG7h3QgbsOgeSwgdGEgc+G6vSB0aeG6v24gaMOgbmggcGjDom4gdMOtY2ggKipEw6JuIHPhu5EgZMaw4bubaSAxNSB0deG7lWkqKg0KDQojIyMjICoqRMOibiBz4buRIGTGsOG7m2kgMTUgdHXhu5VpIC0gUG9wdWxhdGlvbiBvZiBjaGlsZHJlbiB1bmRlciB0aGUgYWdlIG9mIDE1KioNCg0KLS0tDQoNCi0gVGEgc+G6vSB0aeG6v24gaMOgbmggcGjDom4gdMOtY2ggKipkw6JuIHPhu5EgZMaw4bubaSAxNSB0deG7lWkgLSBQb3B1bGF0aW9uIG9mIGNoaWxkcmVuIHVuZGVyIHRoZSBhZ2Ugb2YgMTUqKiBj4bunYSDEkMOgaSBMb2FuIHbDoCBIb25nIEtvbmcgDQoNCg0KYGBge3J9DQpUSyA8LSBwcA0KVGFpa29uZyA8LSBUS1tUSyR0ZW4gPT0nVGFpd2FuJyB8IFRLJHRlbiA9PSdIb25nIEtvbmcnLF0NCg0KdGFibGUoY3V0KFRhaWtvbmckdW4xNSwzKSkNClRhaWtvbmckdW4xNS5jIDwtIGN1dChUYWlrb25nJHVuMTUsMywgbGFiZWxzID0gYygnw410JywnVuG7q2EnLCdOaGnhu4F1JykpDQoNCmBgYA0KDQoNCi0gxJDhuqd1IHRpw6puIHRhIHRp4bq/biBow6BuaCByw7p0IGThu68gbGnhu4d1IGNo4buJIGPDsm4gY8OzIGJp4bq/biBj4bunYSDEkMOgaSBMb2FuIHbDoCBIb25nIEtvbmcsIGThu68gbGnhu4d1IMSRw7MgbWFuZyB0w6puICoqVGFpS29uZyoqDQoNCi0gU2F1IMSRw7MgdGEgZMO5bmcgbOG7h25oICoqY3V0KiogxJHhu4MgY2hpYSB0aMO0bmcgdGluICoqZMOibiBz4buRIGTGsOG7m2kgMTUgdHXhu5VpKiogdGjDoG5oIDMga2hv4bqjbmcsIGJhbyBn4buTbSA6DQoNCiAgIC0gKipLaG/huqNuZyB0aOG7qSBuaOG6pXQqKiDEkcaw4bujYyBn4buNaSBsw6AgKirDjXQqKiB24bubaSBkw6JuIHPhu5Ega2hv4bqjbmcgKio1MDAgbmfDoG4gbmfGsOG7nWkgLSDEkeG6v24gaMahbiAyIHRyaeG7h3UgbmfGsOG7nWkqKg0KICAgDQogICAtICoqS2hv4bqjbmcgdGjhu6kgaGFpKiogxJHGsOG7o2MgZ+G7jWkgbMOgICoqVuG7q2EqKiB24bubaSBkw6JuIHPhu5Ega2hv4bqjbmcgKioyIHRyaeG7h3UgbmfGsOG7nWkgLSDEkeG6v24gaMahbiA0IHRyaeG7h3UgbmfGsOG7nWkqKg0KICAgDQogICAtICoqS2hv4bqjbmcgdGjhu6kgYmEqKiDEkcaw4bujYyBn4buNaSBsw6AgKipOaGnhu4F1KiogduG7m2kgZMOibiBz4buRIGtob+G6o25nICoqNCB0cmnhu4d1IG5nxrDhu51pIC0gxJHhur9uIGjGoW4gNiB0cmnhu4d1IG5nxrDhu51pKioNCiAgIA0KICAgLSBOZ8aw4budaSDhu58gxJHDonkgbMOgICoqdOG7lW5nIGTDom4gc+G7kSBkxrDhu5tpIDE1IHR14buVaSoqIOG7nyBIb25nIEtvbmcgdsOgIFRhaXdhbg0KDQoNCmBgYHtyfQ0KdGFibGUoVGFpa29uZyR1bjE1LmMpDQp0YWJsZShUYWlrb25nJHVuMTUuYyxUYWlrb25nJHRlbikNCmBgYA0KDQotIFNhdSDEkcOzIHRhIHRp4bq/biBow6BuaCAqKmzhuq1wIGLhuqNuZyB04bqnbiBz4buRKiogY2hvIGtob+G6o25nIG3DoCB0YSDEkcOjIGNoaWEg4bufIHBow61hIHRyw6puLCB2w6AgdGh1IMSRxrDhu6NjIGvhur90IHF14bqjIDoNCg0KICAgLSBIb25nIEtvbmcgY8OzICoqNzIgbsSDbSoqIGPDsyBz4buRIGTDom4gZMaw4bubaSAxNSB0deG7lWkgcsahaSB2w6BvIGtob+G6o25nICoqNTAwIG5nw6BuIG5nxrDhu51pIC0gxJHhur9uIGjGoW4gMiB0cmnhu4d1IG5nxrDhu51pKioNCiAgIA0KICAgLSDEkMOgaSBMb2FuIGPDsyAqKjI0IG7Eg20qKiBjw7Mgc+G7kSBkw6JuIGTGsOG7m2kgMTUgdHXhu5VpIHLGoWkgdsOgbyBraG/huqNuZyAqKjIgdHJp4buHdSBuZ8aw4budaSAtIMSR4bq/biBoxqFuIDQgdHJp4buHdSBuZ8aw4budaSoqIHbDoCAqKjQ4IG7Eg20qKiBjw7Mgc+G7kSBkw6JuIGTGsOG7m2kgMTUgdHXhu5VpIHLGoWkgdsOgbyBraG/huqNuZyAqKjQgdHJp4buHdSBuZ8aw4budaSAtIMSR4bq/biBoxqFuIDYgdHJp4buHdSBuZ8aw4budaSoqDQogICAgDQotLS0NCg0KIyMjICoqSMOgbiBRdeG7kWMgdsOgIFRyaeG7gXUgVGnDqm4qKg0KDQoqKipIw6BuIFF14buRYyoqKiBsw6AgbeG7mXQgcXXhu5FjIGdpYSDhu58gxJDDtG5nIMOBLCBj4bqldSB0aMOgbmggbuG7rWEgcGjDrWEgbmFtIGPhu6dhIGLDoW4gxJHhuqNvIFRyaeG7gXUgVGnDqm4gdsOgIG5nxINuIGPDoWNoIHbhu5tpIFRyaeG7gXUgVGnDqm4gcXVhIEtodSBwaGkgcXXDom4gc+G7sSB2xKkgdHV54bq/biAzOA0KDQoqKipUcmnhu4F1IFRpw6puKioqIGzDoCBt4buZdCBxdeG7kWMgZ2lhIGPFqW5nIOG7nyDEkMO0bmcgw4EgdHLDqm4gbuG7rWEgcGjDrWEgQuG6r2MgY+G7p2EgQsOhbiDEkeG6o28gVHJp4buBdSBUacOqbiwgdMOhY2ggYmnhu4d0IHbhu5tpIEjDoG4gUXXhu5FjIOG7nyBtaeG7gW4gTmFtDQoNCi0gSMOgbiBRdeG7kWMgdsOgIFRyaeG7gXUgVGnDqm4gbHXDtG4gbMOgIDIgcXXhu5FjIGdpYSBsw6BtIHThu5FuIGtow7RuZyDDrXQgZ2nhuqV5IG3hu7FjIGPhu6dhIGPDoWMgdOG7nSBiw6FvIHF14buRYyB04bq/IGtow7RuZyBjaOG7iSB24buBIG3hurd0IGtpbmggdOG6vywgcXXDom4gc+G7sSwgZMOibiBz4buRLC4uLi4gDQoNCi0gVuG7m2kgYsOgaSBwaMOibiB0w61jaCBoaeG7h24gdOG6oWksIHRhIHPhur0gcGjDom4gdMOtY2ggduG7gSBkw6JuIHPhu5EgY+G7p2EgMiBxdeG7kWMgZ2lhIG7DoHkgduG7m2kgKioyIMSR4buZIHR14buVaSoqIDogDQoNCiAgIC0gRMOibiBz4buRIHThu6sgKioyMCAtIDI5IHR14buVaSAoUG9wdWxhdGlvbiBhZ2VkIDIwIHRvIDI5IHllYXJzKSoqDQogICANCiAgIC0gRMOibiBz4buRIHThu6sgKio1MCAtIDU5IHR14buVaSAoUG9wdWxhdGlvbiBhZ2VkIDUwIHRvIDU5IHllYXJzKSoqDQogICANCi0tLQ0KDQojIyMjICoqRMOibiBz4buRIHThu6sgMjAgLSAyOSB0deG7lWkgLSBQb3B1bGF0aW9uIGFnZWQgMjAgdG8gMjkgeWVhcnMqKg0KDQpgYGB7cn0NCktSIDwtIHBwDQpIYW5UcmlldSA8LSBLUltLUiR0ZW4gPT0nTm9ydGggS29yZWEnIHwgS1IkdGVuID09J1NvdXRoIEtvcmVhJyxdDQp0YWJsZShjdXQoSGFuVHJpZXUkYTIwdG8yOSwzKSkNCkhhblRyaWV1JGEyMHRvMjkuYyA8LSBjdXQoSGFuVHJpZXUkYTIwdG8yOSwzLCBsYWJlbHMgPSBjKCdDw7JuIMOtdCcsJ1RydW5nIGLDrG5oJywnTmhp4buBdScpKQ0KDQpgYGANCg0KLSBUYSBkw7luZyBs4buHbmggKipjdXQqKiDEkeG7gyBjaGlhIHRow7RuZyB0aW4gKipEw6JuIHPhu5EgdOG7qyAyMCAtIDI5IHR14buVaSoqIHRow6BuaCAzIGtob+G6o25nLCBiYW8gZ+G7k20gOg0KDQogICAtICoqS2hv4bqjbmcgdGjhu6kgbmjhuqV0KiogxJHGsOG7o2MgZ+G7jWkgbMOgICoqQ8OybiDDrXQqKiB24bubaSBkw6JuIHPhu5Ega2hv4bqjbmcgKipoxqFuIDEgdHJp4buHdSBuZ8OgbiBuZ8aw4budaSAtIMSR4bq/biBoxqFuIDQgdHJp4buHdSBuZ8aw4budaSoqDQogICANCiAgIC0gKipLaG/huqNuZyB0aOG7qSBoYWkqKiDEkcaw4bujYyBn4buNaSBsw6AgKipUcnVuZyBiw6xuaCoqIHbhu5tpIGTDom4gc+G7kSBraG/huqNuZyAqKmjGoW4gNCB0cmnhu4d1IG5nxrDhu51pIC0gxJHhur9uIGjGoW4gNiB0cmnhu4d1IG5nxrDhu51pKioNCiAgIA0KICAgLSAqKktob+G6o25nIHRo4bupIGJhKiogxJHGsOG7o2MgZ+G7jWkgbMOgICoqTmhp4buBdSoqIHbhu5tpIGTDom4gc+G7kSBraG/huqNuZyAqKmjGoW4gNCB0cmnhu4d1IG5nxrDhu51pIC0gxJHhur9uIGjGoW4gOSB0cmnhu4d1IG5nxrDhu51pKioNCiAgIA0KDQpgYGB7cn0NCnRhYmxlKEhhblRyaWV1JGEyMHRvMjkuYyxIYW5UcmlldSR0ZW4pDQpgYGANCg0KLSBTYXUgxJHDsyB0YSB0aeG6v24gaMOgbmggKips4bqtcCBi4bqjbmcgdOG6p24gc+G7kSoqIGNobyBraG/huqNuZyBtw6AgdGEgxJHDoyBjaGlhIOG7nyBwaMOtYSB0csOqbiwgdsOgIHRodSDEkcaw4bujYyBr4bq/dCBxdeG6oyA6DQoNCi0gKipUcmnhu4F1IHRpw6puIC0gTm9ydGggS29yZWEqKiBjw7MgOiANCg0KICAgLSAqKjYzIG7Eg20qKiBjw7Mgc+G7kSBkw6JuIHThu6sgMjAtMjkgdHXhu5VpIHLGoWkgdsOgbyAqKmtob+G6o25nIEPDsm4gw610KioNCiAgIA0KICAgLSAqKjkgbsSDbSoqIGPDsyBz4buRIGTDom4gdOG7qyAyMC0yOSB0deG7lWkgcsahaSB2w6BvICoqa2hv4bqjbmcgVHJ1bmcgYsOsbmgqKg0KICAgDQotICoqSMOgbiBRdeG7kWMgLSBTb3V0aCBLb3JlYSoqIGPDsyA6IA0KDQogICAtICoqOSBuxINtKiogY8OzIHPhu5EgZMOibiB04burIDIwLTI5IHR14buVaSByxqFpIHbDoG8gKipraG/huqNuZyBDw7JuIMOtdCoqDQogICANCiAgIC0gKioxOSBuxINtKiogY8OzIHPhu5EgZMOibiB04burIDIwLTI5IHR14buVaSByxqFpIHbDoG8gKipraG/huqNuZyBUcnVuZyBiw6xuaCoqDQogICANCiAgIC0gKio0NCBuxINtKiogY8OzIHPhu5EgZMOibiB04burIDIwLTI5IHR14buVaSByxqFpIHbDoG8gKipraG/huqNuZyBOaGnhu4F1KioNCg0KVOG7qyDEkcOzLCB0YSBjw7MgdGjhu4Mgc28gc8OhbmggZOG7hSBkw6BuZywgc+G7kSBuZ8aw4budaSB0cuG6uyDhu58gSMOgbiBRdeG7kWMgbmhp4buBdSBoxqFuIGjhurNuIHNvIHbhu5tpIFRyaeG7gXUgVGnDqm4NCg0KLS0tDQoNCiMjIyMgKipEw6JuIHPhu5EgdOG7qyA1MCAtIDU5IHR14buVaSAtIFBvcHVsYXRpb24gYWdlZCA1MCB0byA1OSB5ZWFycyoqDQoNCg0KYGBge3J9DQpIYW5UcmlldSRhNTB0bzU5LmMgPC0gY3V0KEhhblRyaWV1JGE1MHRvNTksMykNCnRhYmxlKGN1dChIYW5UcmlldSRhNTB0bzU5LDMpKQ0KSGFuVHJpZXUkYTUwdG81OS5jIDwtIGN1dChIYW5UcmlldSRhNTB0bzU5LDMsIGxhYmVscyA9IGMoJ8ONdCcsJ1bhu6thJywnxJDDtG5nJykpDQoNCmBgYA0KDQpW4bubaSBjw6FjaCBoaeG7g3UgZ2nhu5FuZyBuaMawIMSR4buZIHR14buVaSAyMC0yOSwgdGjDrCDhu58gxJHhu5kgdHXhu5VpIDUwLTU5IGPFqW5nIGdp4buRbmcgbmjGsCB24bqteQ0KDQpUYSBjxaluZyBkw7luZyBs4buHbmggKipjdXQqKiDEkeG7gyBjaGlhIHRow7RuZyB0aW4gKipEw6JuIHPhu5EgdOG7qyA1MCAtIDU5IHR14buVaSoqIHRow6BuaCAzIGtob+G6o25nICoqw410LCBW4burYSwgxJDDtG5nKioNCg0KDQpgYGB7cn0NCnRhYmxlKEhhblRyaWV1JGE1MHRvNTkuYyxIYW5UcmlldSR0ZW4pDQpgYGANCg0KS+G6v3QgUXXhuqMgdGEgY8OzIHRo4buDIHRo4bqleSBuaMawIHBow61hIHRyw6puIC0gdGEgcGjDom4gdMOtY2ggdsOgIMSRxrBhIHJhIHNvIHPDoW5oIHTGsMahbmcgdOG7sSBuaMawIOG7nyDEkeG7mSB0deG7lWkgMjAtMjkNCg0KLS0tDQoNCg0KIyMjICoqTmjhuq10IELhuqNuKioNCg0KKioqTmjhuq10IELhuqNuKioqIGzDoCBt4buZdCBxdeG7kWMgZ2lhIHbDoCDEkeG6o28gcXXhu5FjIGPDsyBjaOG7pyBxdXnhu4FuIG7hurFtIOG7nyBraHUgduG7sWMgxJDDtG5nIMOBDQoNCi0gTmjhuq10IELhuqNuIG7hu5VpIHRp4bq/bmcgduG7m2kgdHXhu5VpIHRo4buNIGNhbyBuaOG6pXQgdGjhur8gZ2nhu5tpLCB2w6wgaOG7jSBjw7MgYsOtIHF1eeG6v3QgdsOgIGNo4bq/IMSR4buZIMSDbiBy4bqldCBsw6BuaCBt4bqhbmgNCg0KLSBOw6puIHRhIHPhur0gdGnhur9uIGjDoG5oIHBow6JuIHTDrWNoICoqRMOibiBz4buRIGPhu6dhIE5o4bqtdCBC4bqjbiB0csOqbiAxMDAgdHXhu5VpIC0gUG9wdWxhdGlvbiBvbGRlciB0aGFuIDEwMCB5ZWFycyoqDQoNCi0tLQ0KDQojIyMjICoqRMOibiBz4buRIHRyw6puIDEwMCB0deG7lWkgLSBQb3B1bGF0aW9uIG9sZGVyIHRoYW4gMTAwIHllYXJzKioNCg0KLSBOZ2/DoGkgcmEgdGEgY8Wpbmcgc+G6vSB0aeG6v24gaMOgbmggKipzbyBzw6FuaCBOaOG6rXQgQuG6o24gc28gduG7m2kgY8OhYyBuxrDhu5tjIHRyb25nIGtodSB24buxYyDEkMO0bmcgw4EqKg0KDQotIMSQ4bqldSB0acOqbiB0YSB0aeG6v24gaMOgbmggKipyw7p0IGThu68gbGnhu4d1IGPhu6dhIDYgcXXhu5FjIGdpYSoqIGtodSB24buxYyDEkMO0bmcgw4EgxJHDoyBuw6p1IHRyw6puLCB24bubaSB0w6puICoqRG9uZ0EqKiBn4buTbSAqKjQzMiBxdWFuIHPDoXQgdsOgIDI0IGJp4bq/bioqDQoNCmBgYHtyfQ0KRUEgPC0gcHANCkRvbmdBIDwtIEVBW0VBJHRlbiA9PSAnQ2hpbmEnfCBFQSR0ZW4gPT0gJ0hvbmcgS29uZyd8IEVBJHRlbiA9PSAnVGFpd2FuJ3wgRUEkdGVuID09J05vcnRoIEtvcmVhJ3wgRUEkdGVuID09J1NvdXRoIEtvcmVhJ3wgRUEkdGVuID09J0phcGFuJyxdDQpgYGANCg0KLSBTYXUgxJHDsyB0YSBs4bqhaSB0aeG6v24gaMOgbmggKipjdXQvY2hpYSoqIHPhu5EgZMOibiBjw7MgdHXhu5VpIHRyw6puIDEwMCB0aMOgbmggNCBraG/huqNuZw0KDQogICAtIEtob+G6o25nIHRo4bupIG5o4bqldCA6IHThu6sgKiowIC0gaMahbiAzMCBuZ8OgbiBuZ8aw4budaSoqDQogICANCiAgIC0gS2hv4bqjbmcgdGjhu6kgaGFpIDogdOG7qyAqKjMwIG5nw6BuIC0gaMahbiA2MCBuZ8OgbiBuZ8aw4budaSoqDQogICANCiAgIC0gS2hv4bqjbmcgdGjhu6kgYmEgOiB04burICoqNjAgbmfDoG4gLSBoxqFuIDkwIG5nw6BuIG5nxrDhu51pKioNCiAgIA0KICAgLSBLaG/huqNuZyB0aOG7qSB0xrAgOiB04burICoqOTAgbmfDoG4gLSAxMDAgbmfDoG4gbmfGsOG7nWkqKg0KDQotIEtow6FjIHbhu5tpIGPDoWMgYuG6o25nIHThuqduIHPhu5EgcGjDrWEgdHLDqm4sIHRhIHPhur0gZ2hpICoqc+G7kSBsaeG7h3UgbmfGsOG7nWkgY+G7pSB0aOG7gyoqIHRoYXkgdsOsIGzDoCAqKsONdCBW4burYSBOaGnhu4F1KiogbmjGsCBjw6FjIHNvIHPDoW5oIHBow61hIHRyw6puDQoNCg0KYGBge3J9DQpEb25nQSRvbGQxMDAuQyA8LSBjdXQoRG9uZ0Ekb2xkMTAwLDQpDQp0YWJsZShjdXQoRG9uZ0Ekb2xkMTAwLDQpKQ0KYGBgDQoNCmBgYHtyfQ0KRG9uZ0Ekb2xkMTAwLmMgPC0gY3V0KERvbmdBJG9sZDEwMCw0LCBsYWJlbHMgPSBjKCfDrXQgaMahbiAzMGsgbmfGsOG7nWknLCdU4burIDMway02MGsgbmfGsOG7nWknLCdU4burIDYway05MGsgbmfGsOG7nWknLCdU4burIDkway0xMDBrIG5nxrDhu51pJykpDQp0YWJsZShEb25nQSRvbGQxMDAuYyxEb25nQSR0ZW4pDQpgYGANCg0KS+G6v3QgcXXhuqMgY2hvIHRhIHRo4bqleSDEkcaw4bujYyBz4buxIGtow6FjIGJp4buHdCByw7UgcuG7h3QgY+G7p2EgTmjhuq10IELhuqNuIHNvIHbhu5tpIGPDoWMgbsaw4bubYyBjw7JuIGzhuqFpDQoNCi0gVHJvbmcga2hpIG5o4bqtdCBi4bqjbiBjw7MgdOG7m2kgKioxMiBuxINtKiogY8OzIHPhu5EgZMOibiB0csOqbiAxMDAgdHXhu5VpIHThu6sgKio2MCBuZ8OgbiB04bubaSAxMDAgbmfDoG4gbmfGsOG7nWkqKiwgdGjDrCBjw6FjIG7GsOG7m2Mga2jDoWMgbOG6oWkgc+G7kSBuxINtIGzhuqFpIGLhurFuZyAwIA0KDQotIEPDoWMgbsaw4bubYyBraMOhYyBuaMawIEjDoG4gUXXhu5FjLCBUcmnhu4F1IFRpw6puLC4uLiB0aMOsICoqNzIgbsSDbSoqLCBz4buRIGTDom4gdHLDqm4gMTAwIHR14buVaSBjaOG7iSDDrXQgaMahbiAzMCBuZ8OgbiBuZ8aw4budaQ0KDQotLS0NCg0KIyMgKiozLiBUw61uaCB0b8OhbiBjw6FjIMSR4bq3YyB0csawbmcgxJFvIGzGsOG7nW5nIHRoZW8gbmjDs20qKg0KDQojIyMgKipUw7NtIHThuq90IGPDoWMgZ2nDoSB0cuG7iyDEkW8gbMaw4budbmcqKg0KDQogICAqKjEuIE1lYW4gLSBz4buRIHRydW5nIGLDrG5oKiogaGF5IGzDoCBt4buZdCDEkWnhu4NtIGdp4buvYSBj4bunYSBt4buZdCB04bqtcCBo4bujcC8gxJHhu5FpIHTGsOG7o25nIMSRxrDhu6NjIHnDqnUgY+G6p3UNCg0KICAgKioyLiBNZWRpYW4gLSBzw7QgdHJ1bmcgduG7iyoqIGhheSBsw6AgbeG7mXQgxJFp4buDbSB0cnVuZyB0w6JtIHRyb25nIG3hu5l0IGRhbmggc8OhY2ggxJHGsOG7o2Mgc+G6r3AgeOG6v3AgdMSDbmcgaG/hurdjIGdp4bqjbSBk4bqnbiAobsOzIGtow6FjIHRydW5nIGLDrG5oIOG7nyBjaOG7lyBuw7MgY2hpYSDEkeG7kWkgdMaw4bujbmcgcmEgbMOgbSDEkcO0aSB2w6AgY2jGsGEgY2jhuq9jIDIgYsOqbiDEkcOzIHPhur0gY8OibiBi4bqxbmcgbmhhdSkNCg0KICAgKiozLiBWYXJpYW5jZSAtIHBoxrDGoW5nIHNhaSoqIGzDoCBwaMOpcCDEkW8gbeG7qWMgY2jDqm5oIGzhu4djaCBnaeG7r2EgY8OhYyBz4buRIGxp4buHdSB0cm9uZyBt4buZdCB04bqtcCBk4buvIGxp4buHdSDEkcaw4bujYyB5w6p1IGPhuqd1IHNvIHbhu5tpIGdpw6EgdHLhu4sgdHJ1bmcgYsOsbmgNCg0KICAgKio0LiBTdGFuZGFyZCBkZXZpYXRpb24gLSBTZCAtIMSR4buZIGzhu4djaCBjaHXhuqluKiogbMOgIMSR4buZIGzhu4djaCBzbyB24bubaSB0acOqdSBjaHXhuqluLCBk4buvIGxp4buHdSBuw6BvIGPFqW5nIHPhur0gY8OzIHNhaSBz4buRIG5o4bqldCDEkeG7i25oLiBOw6puIG7hur91IHPhu7EgY2jDqm5oIGzhu4djaCBraMO0bmcgxJHDoW5nIGvhu4MgdGjDrCDEkeG7mSBs4buHY2ggY2h14bqpbiBjxaluZyBuaMawIHTDrW5oIGJp4bq/biDEkeG7mW5nIOG7nyBt4bupYyB0aOG6pXAgdsOgIG5nxrDhu6NjIGzhuqFpDQogICANCiAgICoqNS4gTmdvw6BpIHJhKiogY8OybiBjw7MgxJHhurdjIHRyxrBuZyBraMOhYyA6ICoqTWF4IC0gZ2nDoSB0cuG7iyBs4bubbiBuaOG6pXQqKiwgKipNaW4gLSBnacOhIHRy4buLIG5o4buPIG5o4bqldCoqLCAqKjFzdCBRdS4sM3JkIFF1LiAtIHBow6JuIHbhu4sgdGjhu6kgMSwgdGjhu6kgMyoqLC4uLi4NCg0KVGEgc+G6vSDEkWEgc+G7kSB0aeG6v24gaMOgbmggdMOtbmggdG/DoW4gMiB0cm9uZyBz4buRIGPDoWMgZ2nDoSB0cuG7iyBwaMOtYSB0csOqbiBsw6AgKipNZWFuIHbDoCBNZWQqKg0KDQoNCiMjIyAqKlRoZW8gcXXhu5FjIGdpYSoqDQoNClRhIHTDrW5oIGPDoWMgZ2nDoSB0cuG7iyDEkeG6t2MgdHLGsG5nIMSRbyBsxrDhu51uZyBj4bunYSAqKnThu5VuZyBkw6JuIHPhu5EgY+G7p2EgVHJ1bmcgUXXhu5FjKiogdHJvbmcgNzIgbsSDbSANCg0KLS0tDQoNCiMjIyMgKipTdW1tYXJ5IC0gQuG6o24gdMOzbSB04bqvdCBjw6FjIMSR4bq3YyB0csawbmcqKg0KDQotIEzhu4duaCAqKnN1bW1hcnkoKSoqIG5oxrAgbeG7mXQgYuG6o24gdMOzbSB04bqvdCBjw6FjIGdpw6EgdHLhu4sgxJHhurdjIHRyxrBuZyDEkcOjIG7DqnUgYsOqbiB0csOqbiB24buBIG3hu5l0IMSR4buRaSB0xrDhu6NuZyBuw6BvIMSRw7MgbcOgIHRhIHnDqnUgY+G6p3UsIHRhIGPDsyB0aOG7gyB0w61uaCB04burbmcgxJHhurdjIHRyxrBuZyByacOqbmcgaG/hurdjIGPDsyB0aOG7gyB4ZW0gY2jhu4kgdHJvbmcgc3VtbWFyeQ0KDQotIFbhu5tpIGzhu4duaCAqKnN1bW1hcnkoQ2hpbmEkcG9wdSkqKiAtIGJp4buDdSB0aOG7iyBjw6FjIMSR4bq3YyB0csawbmcgduG7gSAqKnThu5VuZyBkw6JuIHPhu5EgY+G7p2EgVHJ1bmcgUXXhu5FjKiogdHJvbmcgNzIgbsSDbSwgdGEgY8OzIHRo4buDIHhlbSA6DQoNCg0KYGBge3J9DQpzdW1tYXJ5KENoaW5hJHBvcHUpDQpgYGANCg0KS+G6v3QgcXXhuqMgY8OzIMO9IG5naMSpYSBuaMawIHNhdSA6IA0KDQotICoqTWluIC0gR2nDoSB0cuG7iyBuaOG7jyBuaOG6pXQqKiA6IFThu5VuZyBkw6JuIHPhu5Egw610IG5o4bqldCBj4bunYSBUcnVuZyBRdeG7kWMgdOG7q25nIGdoaSBuaOG6rW4gdHJvbmcgNzIgbsSDbSBsw6Aga2hv4bqjbmcgKio1NDMgdHJp4buHdSBuZ8aw4budaSoqDQoNCi0gKioxc3QgUXUuIC0gUGjDom4gduG7iyB0aOG7qSBuaOG6pXQqKiA6bMOgIGNvbiBz4buRIGNoaWEgdMOhY2ggZOG7ryBsaeG7h3UgdGjDoG5oIDIgcGjhuqduIGLhurFuZyBuaGF1LCB0cm9uZyDEkcOzIDI1JSBk4buvIGxp4buHdSB0aOG6pXAgaMahbiB2w6AgNzUlIGThu68gbGnhu4d1IGNhbyBoxqFuIHPhu5EgcGjDom4gduG7iw0KICAgDQogICAtIEPhu6UgdGjhu4MgLSBT4buRIHBow6JuIHbhu4sgdGjhu6kgbmjhuqV0ICoqNzc1IHRyaeG7h3UqKiBjaGlhIHTDoWNoIHThu5VuZyBkw6JuIHPhu5EgVFEgbMO6YyBuw6B5IGzDoG0gMiwgdHJvbmcgxJHDsyA6IA0KICAgDQogICAtIDI1JSB04buVbmcgZMOibiBz4buRIHPhur0gdGjhuqVwIGjGoW4gNzc1IHRyaeG7h3UgbmfGsOG7nWkNCiAgIA0KICAgLSA3NSUgdOG7lW5nIGTDom4gc+G7kSBz4bq9IGNhbyBoxqFuIDc3NSB0cmnhu4d1DQoNCi0gKipNZWRpYW4gLSBUcnVuZyB24buLKiogOiBsw6Aga2hv4bqjbmcgKioxLDA2IHThu7cqKiwgbsOzIGdp4buRbmcgdOG7qSBwaMOibiB24buLIHRo4bupIG5o4bqldCBuaMawbmcga2jDoWMg4bufIGNo4buXICoqY2hpYSB04buVbmcgZMOibiBz4buRIGzDoG0gNTAlLTUwJSoqDQoNCiAgIC0gNTAlIHThu5VuZyBkw6JuIHPhu5Egc+G6vSB0aOG6pXAgaMahbiAxLDA2IHThu7cNCiAgIA0KICAgLSA1MCUgdOG7lW5nIGTDom4gc+G7kSBz4bq9IGNhbyBoxqFuIDEsMDYgdOG7tw0KDQotICoqTWVhbiAtIEfDrWEgdHLhu4sgdHJ1bmcgYsOsbmgqKiA6IGzDoCBraG/huqNuZyAqKjEsMDMgdOG7tyoqLCBjb24gc+G7kSBuw6B5IGzDoCBnacOhIHRy4buLIHRydW5nIGLDrG5oIG3hu5dpIG7Eg20gdOG7lW5nIGTDom4gc+G7kSBUcnVuZyBRdeG7kWMgbMOgIGtob+G6o25nIDEsMDMgdOG7tyBuZ8aw4budaQ0KDQotICoqM3JkIFF1LiAtIFBow6JuIHbhu4sgdGjhu6kgYmEqKiA6IGzDoCAqKjEuMDMgdOG7tyoqLCBuw7MgZ2nhu5FuZyB04bupIHBow6JuIHbhu4sgdGjhu6kgbmjhuqV0IG5oxrBuZyBraMOhYyDhu58gY2jhu5cgKipjaGlhIHThu5VuZyBkw6JuIHPhu5EgbMOgbSA3NSUtMjUlKioNCg0KICAgLSA3NSUgdOG7lW5nIGTDom4gc+G7kSBz4bq9IHRo4bqlcCBoxqFuIDEuMDMgdOG7tyBuZ8aw4budaQ0KICAgDQogICAtIDI1JSB04buVbmcgZMOibiBz4buRIHPhur0gY2FvIGjGoW4gMSwwMyB04bu3IG5nxrDhu51pDQoNCi0gKipNYXggLSBHw61hIHRy4buLIGzhu5tuIG5o4bqldCoqIDog4buVbmcgZMOibiBz4buRIMSRw7RuZyBuaOG6pXQgY+G7p2EgVHJ1bmcgUXXhu5FjIHThu6tuZyBnaGkgbmjhuq1uIHRyb25nIDcyIG7Eg20gbMOgIGtob+G6o25nICoqMSw0IHThu7cgbmfGsOG7nWkqKg0KDQoNCi0tLQ0KDQojIyMjICoqTWVhbiAtIFPhu5EgdHJ1bmcgYsOsbmgqKg0KDQotIFRhIGPDsyB0aOG7gyB4ZW0gdMOzbSB04bqvdCB0cm9uZyBi4bqjbmcgc3VtbWFyeSBob+G6t2MgdMOtbmggcmnDqm5nIGLhurFuZyBs4buHbmggKiptZWFuKCkqKg0KDQotIEzhu4duaCAqKiptZWFuKCkqKiogY2hvIGJp4bq/dCAqKnPhu5EgdHJ1bmcgYsOsbmgqKiBj4bunYSDEkeG7kWkgdMaw4bujbmcgxJHGsOG7o2MgecOqdSBj4bqndQ0KDQogICAtIEPhu6UgdGjhu4MgdMOtbmggdHJ1bmcgYsOsbmggdOG7lW5nIGTDom4gc+G7kSBj4bunYSBUcnVuZyBRdeG7kWMgdHJvbmcgNzIgbsSDbSBi4bqxbmcgbOG7h25oICoqKm1lYW4oQ2hpbmEkcG9wdSkqKioNCiAgIA0KICAgLSBL4bq/dCBxdeG6oyB0aHUgxJHGsOG7o2MgbMOgIDogKioxLDAzNSw1MzEsNjQ1IG5nxrDhu51pKioNCiAgIA0KICAgLSAqKsOdIG5naMSpYSoqIDogdHJ1bmcgYsOsbmggbeG7l2kgbsSDbSB04buVbmcgZMOibiBz4buRIGdoaSBuaOG6rW4gxJHGsOG7o2MgY+G7p2EgVHJ1bmcgUXXhu5FjIGzDoCAxLDAzNSw1MzEsNjQ1IG5nxrDhu51pDQogICANCg0KYGBge3J9DQoNCm1lYW4oQ2hpbmEkcG9wdSxuYS5ybSA9IFQpDQoNCmBgYA0KDQotLS0NCg0KIyMjIyAqKk1lZCAtIFPhu5EgdHJ1bmcgduG7iyoqDQoNCi0gVGEgY8OzIHRo4buDIHhlbSB0w7NtIHThuq90IHRyb25nIGLhuqNuZyBzdW1tYXJ5IGhv4bq3YyB0w61uaCByacOqbmcgYuG6sW5nIGzhu4duaCAqKm1lZGlhbigpKioNCg0KLSBM4buHbmggKioqbWVkaWFuKCkqKiogY2hvIGJp4bq/dCAqKnPhu5EgdHJ1bmcgduG7iyoqIGPhu6dhIMSR4buRaSB0xrDhu6NuZyDEkcaw4bujYyB5w6p1IGPhuqd1DQoNCiAgIC0gQ+G7pSB0aOG7gyB0w61uaCB0cnVuZyB24buLIGPhu6dhIHThu5VuZyBkw6JuIHPhu5EgY+G7p2EgVHJ1bmcgUXXhu5FjIHRyb25nIDcyIG7Eg20gYuG6sW5nIGzhu4duaCAqKiptZWRpYW4oQ2hpbmEkcG9wdSkqKioNCiAgIA0KICAgLSBL4bq/dCBxdeG6oyB0aHUgxJHGsOG7o2MgbMOgIDogKioxLDA2OSwwMDUsMjUwIG5nxrDhu51pKioNCiAgIA0KICAgLSAqKsOdIG5naMSpYSoqIDogY29uIHPhu5EgKioxLDA2OSwwMDUsMjUwKiogY2hpYSB04buVbmcgZMOibiBz4buRIFRydW5nIFF14buRYyBsw6BtIDIsIG3hu5l0IG7hu61hIHPhur0gdHLDqm4gMSB04bu3IG5nxrDhu51pIHbDoCBt4buZdCBu4butYSBz4bq9IGTGsOG7m2kgMSB04bu3IG5nxrDhu51pIMSRw7MNCg0KDQpgYGB7cn0NCm1lZGlhbihDaGluYSRwb3B1KQ0KYGBgDQoNCi0tLQ0KDQojIyMgKipUaGVvIG5ow7NtIHF14buRYyBnaWEqKg0KDQojIyMjICoqTWVhbiAtIFPhu5EgdHJ1bmcgYsOsbmgqKg0KDQpUYSBz4bq9IHRp4bq/biBow6BuaCB0w61uaCAqKlThu5VuZyB0cnVuZyBiw6xuaCBkw6JuIHPhu5EqKiBj4bunYSBjw6FjIHF14buRYyBnaWEgdOG6oWkgxJDDtG5nIMOBIMSRw6MgbsOqdSB0csOqbiB0cm9uZyA3MiBuxINtDQoNCi0gQ+G7pSB0aOG7gyB0w61uaCB0cnVuZyBiw6xuaCB04buVbmcgZMOibiBz4buRIGPhu6dhIDYgbsaw4bubYyDEkMO0bmcgw4EgdHJvbmcgNzIgbsSDbSBi4bqxbmcgbOG7h25oICoqKm1lYW4ocG9wdSkqKioNCg0KICAgLSAqKnRlbioqIC0gbMOgIHTDqm4gY8OhYyBxdeG7kWMgZ2lhIGPhu6UgdGjhu4MNCiAgIA0KICAgLSAqKm4qKiAtIGzDoCBz4buRIG7Eg20sIGvhur90IHF14bqjIGPhu6dhIG3hu5dpIG7GsOG7m2MgbMOgICoqNzIqKiwgY8OzIG5naMSpYSBsw6AgdOG7lW5nIHRydW5nIGLDrG5oIMSRxrDhu6NjIHTDrW5oICoqdHJvbmcgNzIgbsSDbSoqDQoNCiAgIC0gKiptZWFub2ZBRSoqIC0gbMOgIHTDqm4gdGEgxJHhurd0IGNobyBs4buHbmggKiptZWFuKHBvcHUpKiosIGPDsyBuZ2jEqWEgbMOgIHRydW5nIGLDrG5oIGTDom4gc+G7kSBj4bunYSBxdeG7kWMgZ2lhIMSQw7RuZyDDgQ0KDQoNCmBgYHtyfQ0KbGlicmFyeShkcGx5cikNCg0KdHJ1bmdiaW5ocHAgPC0gRG9uZ0EgJT4lIGdyb3VwX2J5KHRlbikgJT4lIHN1bW1hcmlzZShuID0gbigpLG1lYW5vZkFFID0gbWVhbihwb3B1KSkNCnRydW5nYmluaHBwDQpgYGANCg0KLS0tDQoNCiMjIyMgKipNZWQgLSBT4buRIHRydW5nIHbhu4sqKg0KDQpUYSBz4bq9IHRp4bq/biBow6BuaCB0w61uaCAqKlRydW5nIHbhu4sqKiBj4bunYSBjw6FjIHF14buRYyBnaWEgdOG6oWkgxJDDtG5nIMOBIMSRw6MgbsOqdSB0csOqbiB0cm9uZyA3MiBuxINtDQoNCi0gQ+G7pSB0aOG7gyB0w61uaCAqKnRydW5nIHbhu4sgZMOibiBz4buRIGTGsOG7m2kgMSB0deG7lWkgY+G7p2EgNiBuxrDhu5tjIMSQw7RuZyDDgSoqIGLhurFuZyBs4buHbmggKioqbW1lZGlhbih1bjEpKioqDQoNCiAgIC0gKip0ZW4qKiAtIGzDoCB0w6puIGPDoWMgcXXhu5FjIGdpYSBj4bulIHRo4buDDQoNCiAgIC0gKip0cnVuZ3ZpUUcqKiAtIGzDoCB0w6puIHRhIMSR4bq3dCBjaG8gbOG7h25oICoqbWVkKHVuMSkqKg0KICAgDQogICAtIEvhur90IHF14bqjIHRy4bqjIHbhu4EgY8OzIMO9IG5naMSpYSA6IFbDrSBk4bulIHbhu4EgVHJ1bmcgUXXhu5FjIFRyb25nIHThu5VuZyBkw6JuIHPhu5EgZMaw4bubaSAxIHR14buVaSBj4bunYSBUcnVuZyBRdeG7kWMsIHPhu5EgdHJ1bmcgduG7iyBsw6AgKioyMCwyMjQsNTA4KiosIGNow61uaCBsw6Agc+G7kSBjaMOtbmggZ2nhu69hLyBjaGlhIGzDoG0gxJHDtGkgdOG7lW5nIGTDom4gc+G7kSAxIHR14buVaSDEkcOzLCBuw7Mga2jDtG5nIHBo4bqjaSBsw6AgdHJ1bmcgYsOsbmggbcOgIGNo4buJIGzDoCBz4buRIG5nxINuIGdp4buvYSBjw6FjIGdpw6EgdHLhu4sgKEPDoWMgbsaw4bubYyBjw7JuIGzhuqFpIHTGsMahbmcgdOG7sSBuaMawIHbhuq15KQ0KDQoNCmBgYHtyfQ0KdHJ1bmd2aVFHIDwtIERvbmdBICU+JSBncm91cF9ieSh0ZW4pICU+JSBzdW1tYXJpc2UobWVkVFEgPSBtZWRpYW4odW4xKSkNCnRydW5ndmlRRw0KYGBgDQoNCg0KIyMjICoqVGhlbyB0aOG7nWkgZ2lhbiAtIG7Eg20qKg0KDQpUYSBz4bq9IHRp4bq/biBow6BuaCB0w61uaCB0cnVuZyBiw6xuaCAqKnThu5VuZyBkw6JuIHPhu5EqKiBj4bunYSBjw6FjIHF14buRYyBnaWEgdOG6oWkgxJDDtG5nIMOBIC0gY+G7pSB0aOG7gyBsw6AgNiBuxrDhu5tjIMSRw6MgbsOqdSB0csOqbiAqKnThuqFpIG7Eg20gMjAyMCoqDQoNCi0gTOG7h25oICoqKm1lYW4oKSoqKiBjaG8gYmnhur90ICoqc+G7kSB0cnVuZyBiw6xuaCoqIGPhu6dhIMSR4buRaSB0xrDhu6NuZyDEkcaw4bujYyB5w6p1IGPhuqd1LCBuZ2/DoGkgcmEgdGEgY8OzIHnDqnUgY+G6p3UgY+G7pSB0aOG7gyB24buBIG7Eg20gY2hvIGzhu4duaCAqKmdyb3VwX2J5KHllYXI9MjAyMCkqKiBsw6AgbsSDbSAyMDIwDQoNCi0gS+G6v3QgcXXhuqMgdGh1IMSRxrDhu6NjIHThu5VuZyBkw6JuIHPhu5EgdHJvbmcgbsSDbSAyMDIwIGPhu6dhIDYgcXXhu5FjIGdpYSBsw6AgKioyMDUsMjMzLDkwNSoqIG5nxrDhu51pDQoNCg0KYGBge3J9DQp0cnVuZ2Jpbmh0aGVvbmFtIDwtIERvbmdBICU+JSBncm91cF9ieSh5ZWFyPTIwMjApICU+JSBzdW1tYXJpc2UobWVhbmtob2FuZyA9IG1lYW4ocG9wdSkpDQp0cnVuZ2Jpbmh0aGVvbmFtDQpgYGANCg0KDQojIyMgKipUaGVvIGtob+G6o25nIHRo4budaSBnaWFuKioNCg0KVGEgc+G6vSB0aeG6v24gaMOgbmggdMOtbmggdHJ1bmcgYsOsbmggKip04buVbmcgZMOibiBz4buRKiogY+G7p2EgNiBxdeG7kWMgZ2lhIMSRw6MgbsOqdSB0csOqbiB0cm9uZyAqKnThu6sgMTk1MC0yMDIxKiogOg0KDQotIEvhur90IHF14bqjIHRodSDEkcaw4bujYyBi4bqvdCDEkeG6p3UgdOG7qyBuxINtIDE5NTAsICoqbWVhbmtob2FuZyoqIGzDoCBiaeG7g3UgdGjhu4sgY2hvIGvhur90IHF14bqjIHRydW5nIGLDrG5oIGTDom4gY+G7p2EgbeG7l2kgbsSDbQ0KDQpgYGB7cn0NCg0KdHJ1bmdiaW5odGhlb2tob2FuZyA8LSBEb25nQSAlPiUgZ3JvdXBfYnkoeWVhcikgJT4lIHN1bW1hcmlzZShtZWFua2hvYW5nID0gbWVhbihwb3B1KSkNCnRydW5nYmluaHRoZW9raG9hbmcNCg0KYGBgDQoNCg0KDQoNCiMgKipOaGnhu4dtIHbhu6UgMy4yKioNCg0KIyMgKioxLiBDaOG7jW4gYuG7mSBk4buvIGxp4buHdSoqIDogKioqV0hPLUNPVklELTE5LWdsb2JhbC1kYXRhKioqDQoNCiMjIyAqKk3DtCB04bqjIGLhu5kgZOG7ryBsaeG7h3UqKg0KDQotICoqVHJhbmcgd2ViKiogdGhhbSBraOG6o28gY+G7p2EgYuG7mSBk4buvIGxp4buHdSA6IFtXSE8gREFUQV0oaHR0cHM6Ly93d3cud2hvLmludC9kYXRhL2NvbGxlY3Rpb25zKQ0KDQotICoqQuG7mSBk4buvIGxp4buHdSBn4buTbSBjw7MqKiA6ICoqNTAsNjQwIG9icyAtIHF1YW4gc8OhdCoqIHbDoCAqKjggdmFyaWFibGVzIC0gYmnhur9uKioNCg0KLSAqKk7hu5lpIGR1bmcqKiBj4bunYSBi4buZIGThu68gbGnhu4d1IHbhu4EgOiANCg0KICAgLSBOZ2jEqWEgdGnhur9uZyBWaeG7h3QgOiAqKkThu68gbGnhu4d1IHRvw6BuIGPhuqd1IHbhu4EgQ09WSUQtMTkgY+G7p2EgVOG7lSBjaOG7qWMgWSB04bq/IFRo4bq/IGdp4bubaSBXSE8qKg0KICAgDQogICAtIENodeG7l2kgZOG7ryBsaeG7h3UgbsOgeSBjaG8gYmnhur90IGPDoWMgKip0csaw4budbmcgaOG7o3AgZ2hpIG5o4bqtbiBt4bqvYyBDT1ZJRC0xOSoqIHbDoCAqKnRyxrDhu51uZyBo4bujcCBnaGkgbmjhuq1uIMSRw6MgdOG7rSB2b25nIHbDrCBDT1ZJRC0xOSoqIGPhu6dhIGPDoWMgcXXhu5FjIGdpYSANCiAgIA0KICAgLSBUaOG7nWkgZ2lhbiDEkcaw4bujYyB0w61uaCB04burICoqdGjDoW5nIDEvMjAyMCoqIMSR4bq/biBuZ8OgeSBj4bqtcCBuaOG6rXQgbeG7m2kgbmjhuqV0IGzDoCAqKnRow6FuZyAxLzIwMjQqKg0KICAgDQogICAtIE3hu5dpIHF14buRYyBnaWEgdsOgIHbDuW5nIGzDo25oIHRo4buVIMSR4buBdSBjw7MgdsSDbiBwaMOybmcga2h1IHbhu7FjIGPhu6dhIFdITyBwaOG7pSB0csOhY2gsIG5nw6B5IGdoaSBuaOG6rW4sIHPhu5EgdHLGsOG7nW5nIGjhu6NwIG3huq9jIHbDoCB04butIHZvbmcsLi4uLg0KDQotICoqTMawdSDDvSoqIHbhu4EgYuG7mSBk4buvIGxp4buHdSA6IHPhu5EgbGnhu4d1IMSRxrDhu6NjIGdoaSBuaOG6rW4gxJHGsOG7o2MgKip0w61uaCB0aGVvIHThu6tuZyBuZ8OgeSoqIG5oxrBuZyBz4bq9IGtow7RuZyBjw6FjaCDEkeG7gXUgbmhhdSB2w6AgY8OzICoqdOG7lW5nIGzDoCAyMTEgbmfDoHkqKiBjaG8gbeG7l2kgcXXhu5FjIGdpYSAodMOtbmggdOG7qyB0aMOhbmcgMS8yMDIwIC0gdGjDoW5nIDEvMjAyNCkNCg0KLS0tDQoNCiMjIyAqKsSQ4buNYyBi4buZIGThu68gbGnhu4d1KioNCg0KLSAqKipXSE8tQ09WSUQtMTktZ2xvYmFsLWRhdGEqKiogbMOgIGZpbGUgY3N2LCBuw6puIHRhIMSR4buNYyBi4buZIGThu68gbGnhu4d1IHThu6sgZmlsZSBjc3YNCg0KLSBUYSB0aeG6v24gaMOgbmggZ8OhbiBi4buZIGThu68gbGnhu4d1IGfhu5FjIHbhu5tpIHTDqm4gbeG7m2kgbMOgICoqY292aWQqKg0KDQotICoqVGhhbyB0w6FjIHRo4buxYyBoaeG7h24gOioqDQoNCg0KYGBge3J9DQpsaWJyYXJ5KGNzdikNCmNvdmlkIDwtIHJlYWQuY3N2KCdEOi9VRk0vV0hPLUNPVklELTE5LWdsb2JhbC1kYXRhLmNzdicsIGhlYWRlciA9IFQpDQpgYGANCg0KLS0tDQoNCiMjIyAqKk3hu5l0IHPhu5EgdGjDtG5nIHRpbiBiYW8gcXXDoXQvIG3hu58gcuG7mW5nIGPhu6dhKiogKioqYuG7mSBk4buvIGxp4buHdSBjb3ZpZCoqKg0KDQpUYSBjw7MgdGjhu4MgYmnhur90IHRow6ptIGPDoWMgdGjDtG5nIHRpbiBiYW8gcXXDoXQgY+G7p2EgYuG7mSBk4buvIGxp4buHdSAqKmNvdmlkKiogcGjDrWEgZMaw4bubaSDEkcOieSANCg0KYGBge3J9DQpsaWJyYXJ5KHNraW1yKQ0Kc2tpbShjb3ZpZCkNCmBgYA0KDQoNCg0KIyMgKioyLiBQaMOibiB0w61jaCBk4buvIGxp4buHdSoqIA0KDQpUcm9uZyBi4buZIGThu68gbGnhu4d1ICoqY292aWQqKiwgY3VuZyBj4bqlcCBy4bqldCBuaGnhu4F1IHRow7RuZyB0aW4gY+G7p2Egbmhp4buBdSBxdeG7kWMgZ2lhIHbDoCB2w7luZyBsw6NuaCB0aOG7lSB0csOqbiB0aOG6vyBnaeG7m2kgduG7gSB2aeG7h2MgZ2hpIG5o4bqtbiBjYSBj4bunYSDEkeG6oWkgZOG7i2NoIENPVklELTE5LiBUYSBjw7MgdGjhu4MgdGnhur9uIGjDoG5oIG3hu5l0IHRyb25nIHPhu5EgxJHDsyDEkeG7gyB0aeG6v24gaMOgbmggcGjDom4gdMOtY2gNCg0KLSBUYSBjaOG7jW4gKio1IHF14buRYyBnaWEqKiB0cm9uZyBz4buRIGPDoWMgcXXhu5FjIGdpYSB2w6AgdsO5bmcgbMOjbmggdGjhu5UgxJHhu4MgcGjDom4gdMOtY2gsIHRyb25nIMSRw7MgZ+G7k20gOiANCg0KICAgKioxLiBWaWV0IE5hbSoqIC0gVmnhu4d0IE5hbQ0KICAgDQogICAqKjIuIENhbWJvZGlhKiogLSBDYW1wdWNoaWENCiAgIA0KICAgKiozLiBUaGFpbGFuZCoqIC0gVGjDoWkgTGFuDQogICANCiAgICoqNC4gQ2hpbmEqKiAtIFRydW5nIFF14buRYw0KICAgDQogICAqKjUuIEluZGlhKiogLSDhuqRuIEThu5kNCiAgIA0KVHJvbmcgYuG7mSBk4buvIGxp4buHdSAqKmNvdmlkKiosIGPFqW5nIMSRw6MgdOG7lW5nIGjhu6NwIHPhu5EgbGnhu4d1IHbhu4EgKipjw6FjIGNhIG3huq9jIHbDoCB04butIHZvbmcgZ2hpIG5o4bqtbiB0aGVvIG5nw6B5IHRow6FuZyBuxINtKiogY+G7p2EgY8OhYyBxdeG7kWMgZ2lhIHbDoCB2w7luZyBsw6NuaCB0aOG7lQ0KDQotIFRhIHRp4bq/biBow6BuaCBjaOG7jW4gdHJvbmcgY8OhYyB0aMO0bmcgdGluIGdoaSBuaOG6rW4gxJHDsywgYmFvIGfhu5NtIDogDQoNCiAgICoqMS4gTmV3X2Nhc2VzKiogLSBT4buRIHRyxrDhu51uZyBo4bujcCBnaGkgbmjhuq1uIG3huq9jIGNvdmlkICh0aGVvIHThu6tuZyBuZ8OgeSByacOqbmcgYmnhu4d0LCBraMO0bmcgdMOtY2ggbMWpeS8gY+G7mW5nIGThu5NuKQ0KICAgDQogICAqKjIuIE5ld19kZWF0aCoqIC0gU8O0IHRyxrDhu51uZyBo4bujcCBnaGkgbmjhuq1uIMSRw6MgdOG7rSB2b25nICh0aGVvIHThu6tuZyBuZ8OgeSByacOqbmcgYmnhu4d0LCBraMO0bmcgdMOtY2ggbMWpeS8gY+G7mW5nIGThu5NuKQ0KICAgDQogICAqKjMuIEN1bXVsYXRpdmVfY2FzZXMqKiAtIFPhu5EgY2EgZ2hpIG5o4bqtbiB0w61jaCBsxal5IG3huq9jIGNvdmlkIChjw7MgY+G7mW5nIGThu5NuIHThu6tuZyBuZ8OgeSkNCiAgIA0KICAgKio0LiBDdW11bGF0aXZlX2RlYXRocyoqIC0gU+G7kSB0csaw4budbmcgaOG7o3AgZ2hpIG5o4bqtbiB0w61jaCBsxal5IMSRw6MgdOG7rSB2b25nIHbDrCBjb3ZpZCAoY8OzIGPhu5luZyBk4buTbiB04burbmcgbmfDoHkpDQoNCi0tLQ0KDQojIyMgKipDw6FjIHF14buRYyBnaWEgY+G7pSB0aOG7gyoqDQoNCiMjIyMgKioqTmV3X2Nhc2VzKioqIC0gKipUcsaw4budbmcgaOG7o3AgZ2hpIG5o4bqtbiBt4bqvYyBjb3ZpZCAodGhlbyB04burbmcgbmfDoHkgcmnDqm5nIGJp4buHdCwga2jDtG5nIHTDrWNoIGzFqXkpKioNCg0KVHJvbmcgYsOgaSBwaMOibiB0w61jaCB24buBIHTDrG5oIGjDrG5oIGNvdmlkLTE5LCB0YSBz4bq9IHBow6JuIHTDrWNoIHRyw6puIDMgbsaw4bubYyA6ICoqVmnhu4d0IE5hbSAtIFRow6FpIExhbiAtIENhbXB1Y2hpYSoqIHRyxrDhu5tjIHRpw6puDQoNCi0gVGEgdGnhur9uIGjDoG5oIHbhu4EgKipUcsaw4budbmcgaOG7o3AgZ2hpIG5o4bqtbiBt4bqvYyBjb3ZpZCoqDQoNCi0gVGEgZMO5bmcgbOG7h25oICoqY3V0KiogxJHhu4MgY2hpYSB0aMO0bmcgdGluICoqVHLGsOG7nW5nIGjhu6NwIGdoaSBuaOG6rW4gbeG6r2MgY292aWQqKiB0aMOgbmggMyBraG/huqNuZywgYmFvIGfhu5NtIDoNCg0KICAgLSAqKktob+G6o25nIHRo4bupIG5o4bqldCoqIHbhu5tpIHPhu5EgdHLGsOG7nW5nIGjhu6NwIHThu6sgKiowIGNhIG3huq9jIC0gxJHhur9uIDYwMCBuZ8OgbiBjYSoqDQogICANCiAgIC0gKipLaG/huqNuZyB0aOG7qSBoYWkqKiB24bubaSBz4buRIHRyxrDhu51uZyBo4bujcCB04burICoqaMahbiA2MDAgbmfDoG4gY2EgbeG6r2MgLSDEkeG6v24gMSwyIHRyaeG7h3UgY2EqKg0KICAgDQogICAtICoqS2hv4bqjbmcgdGjhu6kgYmEqKiB24bubaSBz4buRIHRyxrDhu51uZyBo4bujcCB04burICoqaMahbiAxLDIgdHJp4buHdSBjYSBt4bqvYyAtIMSR4bq/biBoxqFuIDEsOCB0cmnhu4d1IGNhKioNCg0KDQpgYGB7cn0NCkNWIDwtIGNvdmlkDQpERCA8LSBDVltDViRDb3VudHJ5ID09ICdWaWV0IE5hbScgfCBDViRDb3VudHJ5ID09ICdDYW1ib2RpYScgfCBDViRDb3VudHJ5ID09ICdUaGFpbGFuZCcsXQ0KdGFibGUoY3V0KEREJE5ld19jYXNlcywzKSkNCg0KYGBgDQoNCg0KYGBge3J9DQpERCROZXdfY2FzZXMuYyA8LSBjdXQoREQkTmV3X2Nhc2VzLDMsIGxhYmVscyA9IGMoJzBfNjAwa2Nhc2VzJywnNjAwa18xLDJNY2FzZXMnLCcxLDJfMSw4TWNhc2VzJykpDQp0YWJsZShERCRDb3VudHJ5LEREJE5ld19jYXNlcy5jKQ0KYGBgDQoNCg0KLSBTYXUgxJHDsyB0YSB0aeG6v24gaMOgbmggKips4bqtcCBi4bqjbmcqKiBi4bqxbmcgKips4buHbmggdGFibGUqKiBjaG8ga2hv4bqjbmcgbcOgIHRhIMSRw6MgY2hpYSDhu58gcGjDrWEgdHLDqm4NCg0KLSBDw6FjIHPhu5EgdHJvbmcgYuG6o25nIGJp4buDdSBoaeG7h24gY2hvICoqc+G7kSBuZ8OgeSoqIGdoaSBuaOG6rW4gY8OhYyBjYSBt4bqvYyB0aGVvIGtob+G6o25nIMSRw6MgY2hpYSwgc+G7kSBjYSBnaGkgbmjhuq1uIG3hu5dpIG5nw6B5IGPhu6dhIG3hu5dpIHF14buRYyBnaWEgbMOgIGtow6FjIG5oYXUgLSBr4bq/dCBxdeG6oyB04burIGLhuqNuZyBjaG8gdGjhuqV5IDogDQoNCiAgIC0gVmnhu4d0IE5hbSBsw6Agbsaw4bubYyBnaGkgbmjhuq1uIHPhu5EgY2EgbeG6r2Mgbmhp4buBdSBuaOG6pXQgOiANCiAgIA0KICAgICAgLSAqKjE4NyBuZ8OgeSoqIGdoaSBuaOG6rW4gdOG7qyAwIMSR4bq/biA2MDAgbmfDoG4gY2ENCiAgICAgIA0KICAgICAgLSAqKjMgbmfDoHkqKiBnaGkgbmjhuq1uIHThu6sgNjAwIG5nw6BuIMSR4bq/biAxLDIgdHJp4buHdSBjYQ0KICAgICAgDQogICAgICAtICoqMiBuZ8OgeSoqIGdoaSBuaOG6rW4gdOG7qyAxLDIgdHJp4buHdSAtIDEsOCB0cmnhu4d1IGNhDQogICANCiAgIC0gVGjDoWkgTGFuIGzDoCBuxrDhu5tjIMSR4bupbmcgcGjDrWEgc2F1IDogKioyMDkqKiBuZ8OgeSBnaGkgbmjhuq1uIHbhu5tpIHThu6sgMCAtIDYwMCBuZ8OgbiBjYSBt4bqvYw0KICAgDQogICAtIENhbXB1Y2hpYSBsw6Agbsaw4bubYyBjw7Mgc+G7kSBuZ8OgeSBnaGkgbmjhuq1uIGNhIG3huq9jIGNvdmlkICoqw610IG5o4bqldCB0cm9uZyAzIG7GsOG7m2MqKiAtICoqMTcyKiogbmfDoHkgZ2hpIG5o4bqtbiB24bubaSB04burIDAgLSA2MDAgbmfDoG4gY2EgbeG6r2MNCiAgIA0KLS0tDQogICANCiMjIyMgKioqTmV3X2RlYXRoKioqIC0gKipUcsaw4budbmcgaOG7o3AgZ2hpIG5o4bqtbiDEkcOjIHThu60gdm9uZyAodGhlbyB04burbmcgbmfDoHkgcmnDqm5nIGJp4buHdCwga2jDtG5nIHTDrWNoIGzFqXkpKioNCg0KTeG7mXQgdHJvbmcgbmjhu69uZyBxdeG7kWMgZ2lhIGdoaSBuaOG6rW4gY8OzIHPhu5EgY2EgdOG7rSB2b25nIHbDrCBjb3ZpZCDEkeG7qW5nIMSR4bqndSDhu54gQ2jDonUgw4EgbMOgICoq4bqkbiDEkOG7mSoqDQoNCk3hu5l0IHRyb25nIG5o4buvbmcgcXXhu5FjIGdpYSBraOG7n2kgxJHhuqd1IGNobyDEkeG6oWkgZOG7i2NoIG7DoHkgY2jDrW5oIGzDoCAqKlRydW5nIFF14buRYyoqDQoNCi0gVGEgc+G6vSB0aeG6v24gaMOgbmggc28gc8OhbmggNSBxdeG7kWMgZ2lhIMSRw6MgbsOqdSB0csOqbiB24buBICoqVHLGsOG7nW5nIGjhu6NwIGdoaSBuaOG6rW4gxJHDoyB04butIHZvbmcgdsOsIGNvdmlkKiosIMSR4buDIHRo4bqleSDEkcaw4bujYyBz4buxIGtow6FjIGJp4buHdA0KDQotIFRhIGTDuW5nIGzhu4duaCAqKmN1dCoqIMSR4buDIGNoaWEgdGjDtG5nIHRpbiAqKlRyxrDhu51uZyBo4bujcCBnaGkgbmjhuq1uIMSRw6MgdMawIHZvbmcgdsOsIGNvdmlkKiogdGjDoG5oIDMga2hv4bqjbmcsIGJhbyBn4buTbSA6DQoNCiAgIC0gKipLaG/huqNuZyB0aOG7qSBuaOG6pXQqKiB24bubaSBz4buRIHRyxrDhu51uZyBo4bujcCB04burICoqMCAtIMSR4bq/biAxNSBuZ8OgbiB0csaw4budbmcgaOG7o3AqKg0KICAgDQogICAtICoqS2hv4bqjbmcgdGjhu6kgaGFpKiogduG7m2kgc+G7kSB0csaw4budbmcgaOG7o3AgdOG7qyAqKmjGoW4gMTUgbmfDoG4gLSDEkeG6v24gMzEgbmfDoG4gdHLGsOG7nW5nIGjhu6NwKioNCiAgIA0KICAgLSAqKktob+G6o25nIHRo4bupIGJhKiogduG7m2kgc+G7kSB0csaw4budbmcgaOG7o3AgdOG7qyAqKmjGoW4gMzEgbmfDoG4gLSDEkeG6v24gaMahbiA0NyBuZ8OgbiB0csaw4budbmcgaOG7o3AqKg0KDQoNCmBgYHtyfQ0KREQxIDwtIENWW0NWJENvdW50cnkgPT0gJ1ZpZXQgTmFtJyB8IENWJENvdW50cnkgPT0gJ0NhbWJvZGlhJyB8IENWJENvdW50cnkgPT0gJ1RoYWlsYW5kJyB8IENWJENvdW50cnkgPT0gJ0luZGlhJyB8IENWJENvdW50cnkgPT0gJ0NoaW5hJyxdDQp0YWJsZShjdXQoREQxJE5ld19kZWF0aHMsMykpDQpgYGANCg0KYGBge3J9DQpERDEkTmV3X2RlYXRocy5jIDwtIGN1dChERDEkTmV3X2RlYXRocywzLCBsYWJlbHMgPSBjKCcwXzE1aycsJzE1a18zMWsnLCczMWtfNDdrJykpDQp0YWJsZShERDEkTmV3X2RlYXRocy5jLEREMSRDb3VudHJ5KQ0KYGBgDQoNCi0gU2F1IMSRw7MgdGEgdGnhur9uIGjDoG5oICoqbOG6rXAgYuG6o25nKiogYuG6sW5nICoqbOG7h25oIHRhYmxlKiogY2hvIGtob+G6o25nIG3DoCB0YSDEkcOjIGNoaWEg4bufIHBow61hIHRyw6puDQoNCi0gQ8OhYyBz4buRIHRyb25oIGLhuqNuZyBiaeG7g3UgaGnhu4duIGNobyAqKnPhu5EgbmfDoHkqKiBnaGkgbmjhuq1uIGPDoWMgY2EgbeG6r2MgdGhlbyBraG/huqNuZyDEkcOjIGNoaWEsIGvhur90IHF14bqjIGNobyB0aOG6pXkgOg0KDQogICAtIOG6pG4gxJDhu5kgxJHhu6luZyDEkeG6p3UgduG7gSBz4buRIG5nw6B5IGdoaSBuaOG6rW4gY2EgdOG7rSB2b25nLCAqKjE5MSBuZ8OgeSoqIGdoaSBuaOG6rW4gdOG7qyAwIMSR4bq/biAxNSBuZ8OgbiBjYSB04butIHZvbmcsICoqOCBuZ8OgeSoqIGdoaSBuaOG6rW4gdOG7qyAxNSBuZ8OgbiDEkeG6v24gMzEgbmfDoG4gY2EgdOG7rSB2b25nDQogICANCiAgIC0gTOG6p24gbMaw4bujdCBjw7JuIGzhuqFpIGPDsyB0aOG7gyB0aGVvIGTDtWkgdHJvbmcgYuG6o25nIHRoZW8gY+G6o25oIGhp4buDdSBuaMawIGLhuqNuICoqVHLGsOG7nW5nIGjhu6NwIGdoaSBuaOG6rW4gbeG6r2MgY292aWQqKg0KDQoNCg0KIyMgKiozLiBUw61uaCB0b8OhbiBjw6FjIMSR4bq3YyB0csawbmcqKiANCg0KS+G6v3QgcXXhuqMgY+G7p2EgY8OhYyBwaMOibiB0w61jaCB24buBIHPhu5EgY2EgZ2hpIG5o4bqtbiAvIHPhu5EgY2EgdOG7rSB2b25nIMSRw6MgZ2nDunAgdGEgdGjhuqV5IMSRxrDhu6NjIHBo4bqnbiBuw6BvIHbhu4EgxJHhuqFpIGThu4tjaCBjb3ZpZC0xOSBj4bunYSB0aOG6vyBnaeG7m2kgbsOzaSBjaHVuZywgdsOgIHThu6tuZyBxdeG7kWMgZ2lhIG7Ds2kgcmnDqm5nDQoNClbDoCB0aeG6v3AgdGhlbywgdGEgc+G6vSB0w61uaCBz4buRIHRydW5nIGLDrG5oLCBz4buRIHRydW5nIHbhu4ssIHPhu5EgcGjDom4gduG7iy4uLiBj4bunYSBjw6FjIHRow7RuZyB0aW4gdHLDqm4gxJHhu4MgY8OzIHRo4buDIHRo4bqleSDEkcaw4bujYyB04buVbmcgcXVhbiBoxqFuIHbhu4EgY8OhYyBz4buRIGxp4buHdSANCg0KLS0tDQoNCiMjIyAqKlRoZW8gcXXhu5FjIGdpYSAtIFZp4buHdCBOYW0qKg0KDQojIyMjICoqU3VtbWFyeSAtIELhuqNuIHTDs20gdOG6r3QqKg0KDQpUYSBiaeG7g3UgdGjhu4sgY8OhYyDEkeG6t2MgdHLGsG5nIHbhu4EgKipz4buRIGNhIGdoaSBuaOG6rW4gbeG6r2MgY292aWQqKiDhu58gVmnhu4d0IE5hbSB0cm9uZyBi4buZIGThu68gbGnhu4d1LCB0YSBjw7MgdGjhu4MgeGVtIDoNCg0KYGBge3J9DQpWTiA8LSBDVltDViRDb3VudHJ5PT0gJ1ZpZXQgTmFtJyxdDQpzdW1tYXJ5KFZOJEN1bXVsYXRpdmVfY2FzZXMpDQpgYGANCg0KS+G6v3QgcXXhuqMgY8OzIMO9IG5naMSpYSBuaMawIHNhdSA6IA0KDQotICoqTWluIC0gR8OtYSB0cuG7iyBuaOG7jyBuaOG6pXQqKiA6IFPhu5EgY2EgZ2hpIG5o4bqtbiBt4bqvYyBjb3ZpZCDDrXQgbmjhuqV0IHThu6tuZyBnaGkgbmjhuq1uIGzDoCAqKjAgY8OzIGNhIG7DoG8qKg0KDQotICoqMXN0IFF1LiAtIFBow6JuIHbhu4sgdGjhu6kgbmjhuqV0KiogOmzDoCAqKjE1MDQgY2EqKiwgc+G7kSBuw6B5IGNoaWEgdMOhY2ggdOG7lW5nIGNhIG3huq9jIGzDumMgbsOgeSBsw6BtIDIsIHRyb25nIMSRw7MgOiANCiAgIA0KICAgLSAyNSUgdOG7lW5nIHPhu5EgY2Egc+G6vSB0aOG6pXAgaMahbiAxNTA0IGNhIA0KICAgDQogICAtIDc1JSB04buVbmcgc+G7kSBjYSBz4bq9IGNhbyBoxqFuIDE1MDQgY2ENCg0KLSAqKk1lZGlhbiAtIFRydW5nIHbhu4sqKiA6IGzDoCAqKjEsODk5LDU3NSBjYSoqLCBuw7MgZ2nhu5FuZyB04bupIHBow6JuIHbhu4sgdGjhu6kgbmjhuqV0IG5oxrBuZyAgKipjaGlhIHThu5VuZyBz4buRIGNhIGzDoG0gNTAlLTUwJSoqDQoNCiAgIC0gNTAlIHThu5VuZyBz4buRIGNhIHPhur0gdGjhuqVwIGjGoW4gMSw4OTksNTc1IGNhDQogICANCiAgIC0gNTAlIHThu5VuZyBz4buRIGNhIHPhur0gY2FvIGjGoW4gMSw4OTksNTc1IGNhDQoNCi0gKipNZWFuIC0gR8OtYSB0cuG7iyB0cnVuZyBiw6xuaCoqIDogbMOgICoqNSwzODgsNTUyIGNhKiosIGNvbiBz4buRIGPDsyBuZ2jEqWEgc+G7kSBjYSB0cnVuZyBiw6xuaCBsw6AgNSwzODgsNTUyIGNhDQoNCi0gKiozcmQgUXUuIC0gUGjDom4gduG7iyB0aOG7qSBiYSoqIDogbMOgICoqMTEsNTI1LDkxNCBjYSoqLCBuw7MgZ2nhu5FuZyB04bupIHBow6JuIHbhu4sgdGjhu6kgbmjhuqV0IG5oxrBuZyAqKmNoaWEgdOG7lW5nIGTDom4gc+G7kSBsw6BtIDc1JS0yNSUqKg0KDQogICAtIDc1JSB04buVbmcgc+G7kSBjYSBz4bq9IHRo4bqlcCBoxqFuIDExLDUyNSw5MTQgY2ENCiAgIA0KICAgLSAyNSUgdOG7lW5nIHPhu5EgY2Egc+G6vSBjYW8gaMahbiAxMSw1MjUsOTE0IGNhDQoNCi0gKipNYXggLSBHw61hIHRy4buLIGzhu5tuIG5o4bqldCoqIDogU+G7kSBjYSBnaGkgbmjhuq1uIG3huq9jIGNvdmlkIG5oaeG7gXUgbmjhuqV0IHThu6tuZyBnaGkgbmjhuq1uIGzDoCAqKjExLDYyNCwwMDAgY2EqKg0KDQoNCi0tLQ0KDQojIyMjICoqTWVhbiAtIFPhu5EgdHJ1bmcgYsOsbmgqKg0KDQpUYSB0w61uaCAqKnRydW5nIGLDrG5oIHPhu5EgY2EgbeG6r2MvIHThu60gdm9uZyBjb3ZpZC0xOSoqIGPhu6dhICoqVmnhu4d0IE5hbSoqDQoNCg0KYGBge3J9DQpWTiA8LSBDVltDViRDb3VudHJ5PT0gJ1ZpZXQgTmFtJyxdDQptZWFuKFZOJEN1bXVsYXRpdmVfY2FzZXMsbmEucm0gPSBUKQ0KYGBgDQoNCmBgYHtyfQ0KbWVhbihWTiRDdW11bGF0aXZlX2RlYXRocyxuYS5ybSA9IFQpDQpgYGANCg0KS+G6v3QgcXXhuqMgdGh1IMSRxrDhu6NjIHPhu5EgdHJ1bmcgYsOsbmggbmjGsCBzYXUgOiANCg0KLSAqKlRydW5nIGLDrG5oIFRyxrDhu51uZyBo4bujcCBnaGkgbmjhuq1uIHTDrWNoIGzFqXkgbeG6r2MgY292aWQqKiBsw6AgNSwzODgsNTUyIG5nxrDhu51pDQoNCi0gKipUcnVuZyBiw6xuaCBUcsaw4budbmcgaOG7o3AgZ2hpIG5o4bqtbiB0w61jaCBsxal5IHThu60gdm9uZyBt4bqvYyB2w6wgY292aWQqKiBsw6AgMjMsNTQyIG5nxrDhu51pDQoNCi0tLQ0KDQojIyMjICoqTWVkIC0gU+G7kSB0cnVuZyB24buLKioNCg0KVGEgdMOtbmggKipz4buRIHRydW5nIHbhu4sgY2EgbeG6r2MvIHThu60gdm9uZyBjb3ZpZC0xOSoqIGPhu6dhICoqVmnhu4d0IE5hbSoqDQoNCmBgYHtyfQ0KbWVkaWFuKFZOJEN1bXVsYXRpdmVfY2FzZXMpDQpgYGANCg0KYGBge3J9DQptZWRpYW4oVk4kQ3VtdWxhdGl2ZV9kZWF0aHMpDQpgYGANCg0KS+G6v3QgcXXhuqMgdGh1IMSRxrDhu6NjIHPhu5EgdHJ1bmcgduG7iyBuaMawIHNhdSA6IA0KDQotICoqVHJ1bmcgduG7iyBUcsaw4budbmcgaOG7o3AgZ2hpIG5o4bqtbiB0w61jaCBsxal5IG3huq9jIGNvdmlkKiogbMOgIDEsODk5LDU3NSBuZ8aw4budaQ0KDQotICoqVHJ1bmcgduG7iyBUcsaw4budbmcgaOG7o3AgZ2hpIG5o4bqtbiB0w61jaCBsxal5IHThu60gdm9uZyBt4bqvYyB2w6wgY292aWQqKiBsw6AgMzQsMzE5IG5nxrDhu51pDQoNCi0tLQ0KDQojIyMgKipUaGVvIG5ow7NtIHF14buRYyBnaWEqKg0KDQrhu54gY8OhYyBuaMOzbSBxdeG7kWMgZ2lhLCB0YSBz4bq9IHRp4bq/biBow6BuaCB0w61uaCBj4bqjICoqU+G7kSB0cnVuZyBiw6xuaCoqIHbDoCAqKlPDtCB0cnVuZyB24buLKiogY+G7p2EgKipUcsaw4budbmcgaOG7o3AgZ2hpIG5o4bqtbiB0w61jaCBsxal5IG3huq9jLyB04butIHZvbmcgdsOsIGNvdmlkKiogY+G7p2EgNSBxdeG7kWMgZ2lhIMSRw6MgcGjDom4gdMOtY2ggcGjDrWEgdHLDqm4NCiAgIA0KICAgDQpgYGB7cn0NCnRydW5ndmlRR0djYXNlIDwtIEREMSAlPiUgZ3JvdXBfYnkoQ291bnRyeSkgJT4lIHN1bW1hcmlzZShtZWFuUUdHY2FzZSA9IG1lYW4oQ3VtdWxhdGl2ZV9jYXNlcykpDQp0cnVuZ3ZpUUdHY2FzZQ0KYGBgDQogICANCiAgIA0KYGBge3J9DQp0cnVuZ3ZpUUdHZGVhdGggPC0gREQxICU+JSBncm91cF9ieShDb3VudHJ5KSAlPiUgc3VtbWFyaXNlKG1lZFFHR2RlYXRoID0gbWVkaWFuKEN1bXVsYXRpdmVfZGVhdGhzKSkNCnRydW5ndmlRR0dkZWF0aA0KYGBgDQoNCioqS+G6v3QgcXXhuqMqKiB0aHUgxJHGsOG7o2Mgc+G7kSB0cnVuZyB24buLIG5oxrAgc2F1IDogDQoNCi0gKiptZWFuUUdHY2FzZSoqIDogY2hvIHRo4bqleSAqKnPhu5EgdHJ1bmcgYsOsbmgqKiBnaGkgbmjhuq1uIGNhIG3huq9jIGNvdmlkIHTDrWNoIGzFqXkgDQoNCi0gKiptZWRvZlFHR2RlYXRoKiogOiBjaG8gdGjhuqV5ICoqc+G7kSB0cnVuZyB24buLKiogdOG7rSB2b25nIHbDrCBjb3ZpZCB0w61jaCBsxal5DQoNCg0KDQogICANCg0KDQoNCg0KDQo=