1 NHIỆM VỤ 3.1

1.1 Đọc bộ dữ liệu từ file CVS

data <- read.csv(file.choose(), header = T)
data

1.2 Giải thích bộ dữ liệu

  • Là một dataframe

  • Không có dữ liệu trống

  • Không có dữ liệu trùng lắp

  • Dữ liệu về dân số của các quốc gia trên thế giới được phân tích theo các năm và các độ tuổi

  • Dữ liệu gồm 18288 quan sát và 24 biến

    • Counry.name: tên của các quốc gia

    • Year: năm thông kê

    • Population: dân số của quốc gia trong một năm

    • Population.of.children.under.the.age.of.1: dân số trẻ em có độ tuổi dưới 1

    • Population.of.children.under.the.age.of.5: dân số trẻ em có độ tuổi dưới 5

    • Population.of.children.under.the.age.of.15: dân số trẻ em có độ tuổi dưới 15

    • Population.under.the.age.of.25: dân số người có độ tuổi dưới 25

    • Population.aged.15.to.64.year: dân số người có độ tuổi từ 15 đến 64

    • Population.older.than.15.years: dấn số người có độ tuổi lớn hơn 15

    • Population.older.than.18.years: dân số người có độ tuổi lớn hơn 18

    • Population.at.age.1: dân số người có độ tuổi là 1

    • Population.aged.1.to.4.years: dân số người có độ tuổi từ 1 đến 4

    • Population.aged.5.to.9.years: dân số người có độ tuổi từ 5 đến 9

    • Population.aged.10.to.14.years: dân số người có độ tuổi từ 10 đến 14

    • Population.aged.15.to.19.years: dân số người có độ tuổi từ 15 đến 19

    • Population.aged.20.to.29.years: dân số người có độ tuổi từ 20 đến 29

    • Population.aged.30.to.39.years: dân số người có độ tuổi từ 30 đến 39

    • Population.aged.40.to.49.years: dân số người có độ tuổi từ 40 đến 49

    • Population.aged.50.to.59.years: dân số người có độ tuổi từ 50 đến 59

    • Population.aged.60.to.69.years: dân số người có độ tuổi từ 60 đến 69

    • Population.aged.70.to.79.years: dân số người có độ tuổi từ 70 đến 79

    • Population.aged.80.to.89.years: dân số người có độ tuổi từ 80 đến 89

    • Population.aged.90.to.99.years: dân số người có độ tuổi từ 90 đến 99

    • Population.older.than.100.years: dân số người có độ tuổi lớn hơn 100

str(data)
## 'data.frame':    18288 obs. of  24 variables:
##  $ Country.name                              : chr  "Afghanistan" "Afghanistan" "Afghanistan" "Afghanistan" ...
##  $ Year                                      : int  1950 1951 1952 1953 1954 1955 1956 1957 1958 1959 ...
##  $ Population                                : num  7480464 7571542 7667534 7764549 7864289 ...
##  $ Population.of.children.under.the.age.of.1 : num  301735 299368 305393 311574 317584 ...
##  $ Population.of.children.under.the.age.of.5 : int  1248282 1246857 1248220 1254725 1267817 1291129 1322342 1354752 1387274 1421808 ...
##  $ Population.of.children.under.the.age.of.15: int  3068855 3105444 3145070 3186382 3231060 3281470 3337026 3396048 3455343 3518528 ...
##  $ Population.under.the.age.of.25            : num  4494349 4552138 4613604 4676232 4741371 ...
##  $ Population.aged.15.to.64.years            : num  4198587 4250002 4303436 4356242 4408474 ...
##  $ Population.older.than.15.years            : num  4411609 4466098 4522464 4578167 4633229 ...
##  $ Population.older.than.18.years            : num  3946595 3993640 4041439 4088379 4136116 ...
##  $ Population.at.age.1                       : num  258652 254304 252906 258717 264765 ...
##  $ Population.aged.1.to.4.years              : num  946547 947489 942827 943151 950233 ...
##  $ Population.aged.5.to.9.years              : int  966210 991791 1017993 1039950 1055592 1062420 1063212 1065357 1071666 1084972 ...
##  $ Population.aged.10.to.14.years            : int  854363 866796 878857 891707 907651 927921 951472 975939 996403 1011748 ...
##  $ Population.aged.15.to.19.years            : int  757113 768616 781411 794308 806216 817550 828600 839588 851433 867048 ...
##  $ Population.aged.20.to.29.years            : int  1241348 1260904 1280288 1298803 1316768 1334989 1353958 1374043 1393789 1414034 ...
##  $ Population.aged.30.to.39.years            : int  909953 922765 935638 948321 961484 975801 991166 1007440 1023595 1040441 ...
##  $ Population.aged.40.to.49.years            : int  661807 667015 672491 678064 684153 691279 699431 708537 717938 728233 ...
##  $ Population.aged.50.to.59.years            : int  467170 468881 470898 472969 475117 477664 480665 484018 487393 491447 ...
##  $ Population.aged.60.to.69.years            : int  271905 273286 274852 276577 278210 279789 281376 282918 284592 286551 ...
##  $ Population.aged.70.to.79.years            : int  92691 94358 96026 97705 99298 100839 102385 103932 105508 107136 ...
##  $ Population.aged.80.to.89.years            : int  9499 10155 10721 11254 11793 12342 12890 13428 13959 14495 ...
##  $ Population.aged.90.to.99.years            : int  123 118 139 166 190 210 233 255 277 307 ...
##  $ Population.older.than.100.years           : num  0 0 0 0 0 0 0 0 0 0 ...

18288 observations tương ứng với 18288 quan sát (là các hàng).

24 variables tương ứng với 24 biến (là các cột).

is.na(data) # Sử dụng is.na để kiểm tra NA. Giá trị 'TRUE' phần tử tương ứng là NA và 'FALSE' là không phải NA. 

‘NA’ là một giá trị đặc biệt, đại diện cho “Not Available” dữ liệu hoặc giá trị không xác định hoặc không có sẵn.

sum(is.na(data)) # Được sử dụng để đếm số lượng giá trị NA trong một đối tượng dữ liệu. 
## [1] 0

Kết quả 0 có nghĩa bộ dữ liệu không có NA.

duplicated(data) # Dùng xác định xem có sự trùng lặp nào trong data frame hay không. 

Giá trị TRUE tương ứng với các hàng trong data frame là trùng lặp và FALSE nếu không trùng lặp.

sum(duplicated(data)) # Đếm số lượng trùng lặp
## [1] 0

Kết quả 0 có nghĩa bộ dữ liệu không trùng lặp.

1.3 Tạo dataframe mới để phân tích

  • Đổi tên các biến
names(data) <- c('ct', 'y', 'p','under.1', 'under.5', 'under.15','under.25','from.15.to.64','above.15', 'above.18','one.year.old','from.1.to.4','from.5.to.9','from.10.to.14','from.15.to.19','from.20.to.29','from.30.to.39','from.40.to.49','from.50.to.59','from.60.to.69','from.70.to.79','from.80.to.89','from.90.to.99','above.100') # Việc đổi tên các biến giúp dữ liệu được ngắn gọn hơn, tránh được các nhầm lẫn.
names(data) 
##  [1] "ct"            "y"             "p"             "under.1"      
##  [5] "under.5"       "under.15"      "under.25"      "from.15.to.64"
##  [9] "above.15"      "above.18"      "one.year.old"  "from.1.to.4"  
## [13] "from.5.to.9"   "from.10.to.14" "from.15.to.19" "from.20.to.29"
## [17] "from.30.to.39" "from.40.to.49" "from.50.to.59" "from.60.to.69"
## [21] "from.70.to.79" "from.80.to.89" "from.90.to.99" "above.100"

Việc đổi tên còn được thực hiện bởi lệnh rename() trong packages tidyverse. Điểm khác nhau giữa hai lệnh này là names() thực hiện đổi tên cho tất cả các biến và rename() dành cho việc đặt tên bất kì biến nào.

  • Chọn dữ liệu để phân tích
library(tidyverse) # rút trích dữ liệu thông qua package 'tydyverse' để dùng 'select' và 'filter'
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr     1.1.4     ✔ readr     2.1.5
## ✔ forcats   1.0.0     ✔ stringr   1.5.1
## ✔ ggplot2   3.4.4     ✔ tibble    3.2.1
## ✔ lubridate 1.9.3     ✔ tidyr     1.3.0
## ✔ purrr     1.0.2     
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag()    masks stats::lag()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
d <- filter(data,ct %in% c('Vietnam','Thailand','China', 'South Korea', 'Japan')) # 'filter' được sử dụng để chọn các quan sát trong dataframe. 
d <- select(d,ct,y,p,under.1,under.5,from.15.to.64,one.year.old,above.100) # Sử dụng 'select' để chọn ra các biến. 
d

Kết quả trong câu lệnh ‘filter’ nghĩa là chọn các quan sát trong biến ‘ct’ có giá trị tương ứng là ‘Vietnam’, ‘Thailand’, ‘China’, ‘South Korea’, ‘Japan’.

Ở câu lệnh ‘select’ sẽ trả về một dataframe mới chỉ chứa biến ‘under.1’, ‘under.5’, ‘from.15.to.64’, ‘one.year.old’, ‘above.10’ từ dataframe vừa tạo ở trên.

Với lệnh ‘filter’ ta lấy ra được 360 quan sát dựa trên dataframe gốc là ‘data’ và lệnh ‘select’ lấy ra được 8 biến trong datafram mới. Từ đó ta được một dataframe mới hơn là ‘d’ với 360 quan sát và tương ứng 8 biến.

1.4 Mã hóa dữ liệu

  • Mã hóa dữu liệu dựa vào tên quốc gia
d$ct.Coded <- ifelse(d$ct == 'Vietnam','Vietnam','Not Vietnam') 

‘ifelse’ sẽ kiểm tra điều kiện trong biến ct, nếu trong ct có phần tử là ‘Vietnam’ thì sẽ trả về ‘Vietnam’, nếu sai điều kiện thì sẽ trả về ‘Not Vietnam’.

  • Mã hóa dữ liệu dựa vào số lượng dân số của một nước trong các năm
d$p.Coded <- case_when(d$p < 70000000 ~ 'Ít',d$p >= 70000000 & d$p <=1000000000 ~ 'Vừa',d$p >1000000000 ~ 'Nhiều') # 'case_when' dùng để thực hiện một loạt các điều kiện và trả về giá trị tương ứng của các điều kiện.

Một cột mới có tên là ‘p.coded’ sẽ được tạo tương ứng với các điều kiện. Phần tử trong biến sẽ có giá trị là ‘Ít’ nếu quan sát trong biến ‘p’ có giá trị nhỏ hơn 70000000, ‘Vừa’ nếu quan sát trong ‘p’ lớn hơn bằng 70000000 và nhỏ hơn bằng 1000000000, khi lớn hơn 1000000000 thì phần tử có giá trị là ‘Nhiều’.

  • Phân chia dữ liệu
d$under1.Coded <- cut(d$under.1,3,labels = c('Nhóm 1','Nhóm 2','Nhóm 3')) 
# Hàm 'cut' được sử dụng để chia dữ liệu thành các khoảng (bins) rồi gán tên cho từng khoảng dựa trên giá trị.

Dữ liệu trong biến ‘under.1’ được chia thành 3 khoảng, và các tên ‘Nhóm 1’, ‘Nhóm 2’, ‘Nhóm 3’ được gán tương ứng với các khoảng đó.

  • Mã hóa dữ liệu bằng cách đưa tên các nước về tiếng Việt
d$ct.Coded1 <- recode(d$ct,China ='Trung Quốc', Japan ='Nhật Bản', Vietnam ='Việt Nam', Thailand ='Thái Lan', South.Korea ='Hàn Quốc')
# Hàm 'recode' cho phép thay đổi giá trị của một biến thành giá trị mới dựa trên các quy tắc xác định. 

Ở mổi phần tử thuộc biến ‘ct’ có giá trị là ‘China’ thì sẽ được mã hóa thành ‘Trung Quốc’, tương tự ‘Japan’ sẽ được mã hóa thành ‘Nhật Bản’,…

d 

Qua 4 lệnh mã hóa trên, data frame ‘d’ có tổng cộng là 12 biến và số quan sát là không đổi với 360 hàng.

1.5 Lập bảng tần số

  • Xem số lần, số tần suất lặp lại trong một dữ liệu
table(d$ct) # Hàm 'table' được sử dụng để tạo bảng tần suất của các giá trị trong một dữ liệu. Bảng tần suất này cho phép xem xét phân phối của các giá trị và biết được số lần xuất hiện của mỗi giá trị.
## 
##       China       Japan South Korea    Thailand     Vietnam 
##          72          72          72          72          72

Số ‘72’ xuất hiện trong bảng kết quả cho thấy giá trị ‘China’, ‘Japan’, ‘South Korea’, ‘Thailand’ và ‘Vietnam’ được lặp lại hoặc được xuất hiện 72 lần, tương ứng với 72 năm trong tổng số năm phân tích.

  • Lập biểu đồ nhánh và lá
d1 <- filter(d,ct == 'Vietnam') # Dùng lệnh filter để chọn ra các quan sát, để phân tích riêng nước Việt Nam
stem(d1$above.100) # Biểu đồ nhánh và lá là một biểu đồ thường được sử dụng để hiển thị cấu trúc phân cấp của một tập hợp các đối tượng hoặc mẫu. 
## 
##   The decimal point is 3 digit(s) to the right of the |
## 
##   0 | 1111111111111111111111122222222233334445566789
##   1 | 012357
##   2 | 02478
##   3 | 01358
##   4 | 1479
##   5 | 1247
##   6 | 04

Lệnh sẽ được phân tích dựa vào điều kiện dấu thập phân là 3 chữ số ở bên phải. Tương ứng với nhánh là phần số hàng nghìn và lá là phần số hàng trăm.

Nhánh là gồm các số bên trái dấu ‘|’ và bên phải là lá. Gồm 7 nhánh là các nhánh các số hàng trăm, 1 nghìn, 2 nghìn,… đến 6 nghìn.

Dễ dàng thấy được ở hàng cuối cùng, có 2 lá nằm trong nhánh 6, nghĩa là có 2 năm, Việt Nam có dân số ở độ tuổi trên 100 là khoảng 6000 người và con số tương ứng là 6000 và 6400 (con số đã bao gồm việc làm tròn).

1.6 Tính toán các đặc trưng đo lường của 5 quốc gia ở độ tuổi từ 15 đến 64

  • Mô tả giá trị nhỏ nhất
min <- d %>% group_by(ct) %>% summarise(min = min(from.15.to.64), n = n())
min

Trong 72 năm phân tích, dân số thấp nhất trong độ tuổi từ 15 đến 64 lần lượt theo các quốc gia Trung Quốc, Nhật Bản, Hàn Quốc, Thái Lan và Việt Nam là 327285950, 50380868, 10919575, 11150405 và 15836825.

  • Mô tả tứ phân vị

Tứ phân vị là một khái niệm trong thống kê mô tả để phân chia một tập dữ liệu thành bốn phần bằng nhau, mỗi phần chiếm 25% tổng số quan sát.

  • Điểm phân vị thứ nhất
Q1 <- d %>% group_by(ct) %>% reframe(quantile_1st = quantile(from.15.to.64, probs = c(.25)), n = n())
Q1

Tại điểm này, giá trị chia tập dữ liệu thành 25% giảm dần, nghĩa là có 25% số liệu bé hơn hoặc bằng Q1 và 75% số liệu lớn hơn Q1.

Nghĩa là tại Trung Quốc, ở độ tuổi này trong các năm, dân số ít hơn hoặc bằng 427719163 là 25%. Tương tự các nước còn lại.

  • Điểm phân vị thứ hai - Trung vị
Q2 <- d %>% group_by(ct) %>% reframe(quantile_2nd = quantile(from.15.to.64, probs = c(.5)), n = n())
Q2

Tứ phân vị thứ hai chính là giá trị trung bình, hoặc median (trung vị). Là giá trị chia tập dữ liệu thành hai phần bằng nhau, 50% số liệu bé hơn Q2 và 50% số liệu lớn hơn Q2.

Ở Trung Quốc, qua các năm, một nửa giá trị nhỏ hơn hoặc bằng 686696600 và một nửa giá trị lớn hơn hoặc bằng 686696600. Các nước còn lại tương tự.

  • Điểm phân vị thứ 3
Q3 <- d %>% group_by(ct) %>% reframe(quantile_3rd = quantile(from.15.to.64, probs = c(.75)), n = n())
Q3

Tứ phân vị thứ ba là giá trị chia tập dữ liệu thành 75% giảm dần, nghĩa là có 75% số liệu bé hơn hoặc bằng Q3 và 25% số liệu lớn hơn Q3.

Trong độ tuổi từ 15 đến 64, tại Trung Quốc, có 75% dân số bé hơn hoặc bằng 912309775 hoặc có 25% dân số lớn hơn 912309775. Các nước còn lại tương tự.

  • Mô tả giá trị trung bình
mean <- d %>% group_by(ct) %>% summarise(mean = mean(from.15.to.64), n= n())
mean

Như vậy, trung bình một năm dân số Trung Quốc sẽ có 672094697 người trong độ tuổi từ 15 đến 64.

Tương tự, trong 72 năm trung bình một năm dân số từ 15 đến 64 tuổi ở Nhật Bản là 75434732, Hàn Quốc là 25757425, Thái Lan có 31642004 và Việt Nam có 37136547.

  • Mô tả giá trị lớn nhất
max <- d %>% group_by(ct) %>% summarise(max = max(from.15.to.64), n = n())
max

Trong 72 năm phân tích, dân số cao nhất trong độ tuổi từ 15 đến 64 lần lượt theo các quốc gia Trung Quốc, Nhật Bản, Hàn Quốc, Thái Lan và Việt Nam là 998226100, 87116616, 37643056, 50431860 và 66962210.

2 NHIỆM VỤ 3.2

2.1 Đọc bộ dữ liệu

nv3 <- read.csv(file.choose(), header = T)
nv3

2.2 Giải thích bộ dữ liệu

  • Dữ liệu về việc dự báo dân số Hoa Kỳ theo từng độ tuổi từ 2016-2060.

  • Gồm 2835 quan sát và 106 biến:

    • Sex: giới tính đang quan sát

    • Origin: đến từ nơi nào đó

    • Race: các nhóm chủng tộc và dân tộc

    • Year: năm dự đoán, từ năm 2016 đến 2060

    • Total Population: tổng cộng các dân số dự đoán được

    • Và 101 biến tương ứng với 101 cột với độ tuổi từ 0 đến 100

  • Là dataframe.

  • Không có giá trị NA.

  • Không có dữ liệu bị trùng lắp.

dim(nv3) # Xem tổng số quan sát và tổng số biến
## [1] 2835  106

2835 ứng với 2835 quan sát

106 ứng với 106 biến

is.data.frame(nv3) #Kiểm tra bộ dữ liệu
## [1] TRUE

Kết quả TRUE thể hiện bộ dữ liệu là một dataframe.

is.na(nv3) # Xem bộ dữ liệu có giá trị trống hay không

Kết quả TRUE chỉ tại phần tử đó là một giá trị trống và FALSE khi không phải giá trị trống.

sum(is.na(nv3)) # Kiểm tra tổng số phần tử có giá trị trống
## [1] 0

Bộ dữ liệu không có giá trị NA.

duplicated(nv3) # Kiểm tra xem sự trùng lặp của dữ liệu

Giá trị TRUE tương ứng với các hàng trong data frame là trùng lặp và FALSE nếu không trùng lặp.

sum(duplicated(nv3))
## [1] 0

Kết quả trả về 0, bộ dữ liệu không trùng lặp.

2.3 Mã hóa dữ liệu

  • Mã hóa dữ liệu dựa vào giới tính
nv3$Sex.Coded <- ifelse(nv3$Sex == 'Female','Female','Not Female')

Điều kiện lệnh ở đây là nếu trong biến S có giá trị là ‘Female’ thì sẽ được mã hóa thành ‘Female’, nếu giá trị khác ‘Female’ (Both hoặc Male) thì sẽ được mã hóa thành ‘Not Female’.

  • Mã hóa giới tính thành các con số
nv3$Sex.Coded1 <- recode(nv3$Sex,Male = '1', Female = '2', Both = '3')

Giới tính sẽ được mã hóa dưới dạng các con số, ở phần tử có giá trị là ‘Male’ sẽ được mã hóa thành số ‘1’, ‘Female’ thành số ‘2; và ’Both’ là số 3.

  • Mã hóa dữ liệu dựa vào số liệu dân số trong độ tuổi 18
nv3$Age.18.Coded <- case_when(nv3$Age.18 < 5000 ~ 'Rất it',nv3$Age.18 >= 5000 & nv3$Age.18 < 10000 ~ 'It',nv3$Age.18 >= 10000 & nv3$Age.18 < 500000 ~ 'Vừa',nv3$Age.18 >= 500000 & nv3$Age.18 <  2000000 ~ 'Nhiều ',nv3$Age.18 >= 2000000 ~ 'Rất nhiều')

Các dân số dự đoán sẽ được mã hóa thành dạng chữ với các điều kiện.

Bé hơn 5000 -> Rất ít

Từ 5000 đến 10000 -> Ít

Từ 10000 đến 500000 -> Vừa

Từ 500000 đến 2000000 -> Nhiều

Nhiều hơn 2000000 -> Rất nhiều

  • Mã hóa dữ liệu theo nhóm dựa vào độ tuổi 20
nv3$Age.20.Coded <- cut(nv3$Age.20,3,labels = c('Nhóm 1','Nhóm 2','Nhóm 3')) 

Dữ liệu trong biến ‘Age.20’ được chia thành 3 khoảng, và các tên ‘Nhóm 1’, ‘Nhóm 2’, ‘Nhóm 3’ được gán tương ứng với các khoảng đó.

nv3 

Qua 4 lệnh mã hóa trên, data frame ‘nv3’ có tổng cộng là 110 biến và số quan sát là không đổi với 2835 hàng.

2.4 Lập bảng tần số

  • Tần số phân tích về giới tính
table(nv3$Sex)
## 
##   Both Female   Male 
##    945    945    945

Giới tính nam, nữ và cả hai giới tính đều được dự đoán 945 lần.

  • Rút trích dữ liệu
nv3.a <- filter(nv3,Race == 'Asian' & Origin == 'Hispanic') 
nv3.a

Dùng lệnh filter để chọn ra các quan sát trong biến Race có giá trị là ‘Asian’ và các giá trị là ‘Hispanic’ trong biến Origin.

  • Lập biểu đồ nhánh và lá
stem(nv3.a$Age.60,scale = .5)
## 
##   The decimal point is 3 digit(s) to the right of the |
## 
##    1 | 99
##    2 | 001113334556677788889
##    3 | 0000222333555666677889
##    4 | 00011111112233344444555667777899999
##    5 | 00001111222223334456779
##    6 | 278889
##    7 | 45888
##    8 | 4445568
##    9 | 02778999
##   10 | 123456

Lệnh sẽ được phân tích dựa vào điều kiện dấu thập phân là 3 chữ số ở bên phải. Tương ứng với nhánh là phần số hàng nghìn và lá là phần số hàng trăm.

Nhánh là gồm các số bên trái dấu ‘|’ và bên phải là lá. Gồm 10 nhánh là các nhánh các số hàng 1 nghìn, 2 nghìn,… đến 10 nghìn.

Ở hàng 1 nghìn ta thấy có 2 số, tương ứng có 2 số thuộc hàng 1 nghìn. Các con số là 1900 và 1900 (các số đã được làm tròn đến hàng đơn vị)

Tương tự ở hàng 6, có 6 số thuộc nhánh 6 nghìn, là các số 6200,6700,6800,6800,6800 và 6900.

2.5 Tính toán các đặc trưng đo lường ở độ tuổi 100 ở Asian qua các năm thuộc giới tính nữ

  • Rút trích dữ liệu
nv3.b <- filter(nv3.a,Sex %in% c('Female'))
nv3.b

Rút trích dữ liệu để lấy ra dữ liệu chỉ có giới tính nữ.

  • Mô tả giá trị nhỏ nhất
min1 <- nv3.b %>% group_by(Sex) %>% summarise(min = min(Age.100), n = n())
min1

Trong 45 năm dự đoán, dân số người Asian thuộc giới tính nữ được dự đoán thấp nhất trong độ tuổi 100 là 27 người.

  • Mô tả điểm phân vị thứ nhất
Quantile1 <- nv3.b %>% group_by(Sex) %>% summarise(quantile_1st = quantile(Age.100, probs = c(.25)), n = n())
Quantile1

Tại điểm phân vị thứ nhất thể hiện có 25% thuộc độ tuổi 100 có ít hơn hoặc bằng 42 người. Hoặc 75% ở tuổi 100 có nhiều hơn 42 người.

  • Mô tả điểm phân vị thứ 2 - Trung vị
Quantile2 <- nv3.b %>% group_by(Sex) %>% reframe(quantile_2nd = quantile(Age.100, probs = c(.5)), n = n())
Quantile2

Tại điểm phân vị thứ hai thể hiện một nửa giá trị nhỏ hơn hoặc bằng 85 và một nửa giá trị lớn hơn hoặc bằng 85.

  • Mô tả điểm phân vị thứ 3
Quantile3 <- nv3.b %>% group_by(Sex) %>% reframe(quantile_3rd = quantile(Age.100, probs = c(.75)), n = n())
Quantile3

Tại điểm phân vị thứ ba thể hiện có 75% thuộc độ tuổi 100 có ít hơn hoặc bằng 211 người. Hoặc 25% ở tuổi 100 có nhiều hơn 211 người.

  • Mô tả giá trị trung bình
mean1 <- nv3.b %>% group_by(Sex) %>% summarise(mean = mean(Age.100), n= n())
mean1

Trung bình trong 45 năm, dân số ở độ tuổi 100 của giới nữ là 143 người.

  • Mô tả giá trị lớn nhất
max1 <- nv3.b %>% group_by(Sex) %>% summarise(max = max(Age.100), n = n())
max1

Trong 45 năm dự đoán, dân số được dự đoán cao nhất nằm trong tuổi 100 ở giới nữ là 477 người.

LS0tDQp0aXRsZTogIk5oaeG7h20gduG7pSAzIg0KYXV0aG9yOiAiTmd1eeG7hW4gVGjDunkgVnkiDQpkYXRlOiAiYHIgZm9ybWF0KFN5cy50aW1lKCksICclSDolTTolUywgJWQgLSAlbSAtICVZJylgIg0Kb3V0cHV0Og0KICBodG1sX2RvY3VtZW50OiANCiAgICB0b2M6IHRydWUNCiAgICB0aGVtZTogdW5pdGVkDQogICAgbnVtYmVyX3NlY3Rpb25zOiB0cnVlDQogICAgY29kZV9kb3dubG9hZDogdHJ1ZQ0KICAgIGNvZGVfZm9sZGluZzogc2hvdyANCiAgICBkZl9wcmludDogcGFnZWQNCmVkaXRvcl9vcHRpb25zOg0KICBjaHVua19vdXRwdXRfdHlwZTogY29uc29sZQ0KLS0tDQoNCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQ0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBUUlVFKQ0KYGBgDQoNCiMgTkhJ4buGTSBW4bukIDMuMQ0KDQojIyDEkOG7jWMgYuG7mSBk4buvIGxp4buHdSB04burIGZpbGUgQ1ZTDQoNCmBgYHtyfQ0KZGF0YSA8LSByZWFkLmNzdihmaWxlLmNob29zZSgpLCBoZWFkZXIgPSBUKQ0KZGF0YQ0KYGBgDQoNCiMjIEdp4bqjaSB0aMOtY2ggYuG7mSBk4buvIGxp4buHdSANCg0KLSBMw6AgbeG7mXQgZGF0YWZyYW1lDQoNCi0gS2jDtG5nIGPDsyBk4buvIGxp4buHdSB0cuG7kW5nDQoNCi0gS2jDtG5nIGPDsyBk4buvIGxp4buHdSB0csO5bmcgbOG6r3ANCg0KLSBE4buvIGxp4buHdSB24buBIGTDom4gc+G7kSBj4bunYSBjw6FjIHF14buRYyBnaWEgdHLDqm4gdGjhur8gZ2nhu5tpIMSRxrDhu6NjIHBow6JuIHTDrWNoIHRoZW8gY8OhYyBuxINtIHbDoCBjw6FjIMSR4buZIHR14buVaQ0KDQotIEThu68gbGnhu4d1IGfhu5NtIDE4Mjg4IHF1YW4gc8OhdCB2w6AgMjQgYmnhur9uDQoNCiAgLSBDb3VucnkubmFtZTogdMOqbiBj4bunYSBjw6FjIHF14buRYyBnaWENCg0KICAtIFllYXI6IG7Eg20gdGjDtG5nIGvDqg0KDQogIC0gUG9wdWxhdGlvbjogZMOibiBz4buRIGPhu6dhIHF14buRYyBnaWEgdHJvbmcgbeG7mXQgbsSDbQ0KDQogIC0gUG9wdWxhdGlvbi5vZi5jaGlsZHJlbi51bmRlci50aGUuYWdlLm9mLjE6IGTDom4gc+G7kSB0cuG6uyBlbSBjw7MgxJHhu5kgdHXhu5VpIGTGsOG7m2kgMQ0KDQogIC0gUG9wdWxhdGlvbi5vZi5jaGlsZHJlbi51bmRlci50aGUuYWdlLm9mLjU6IGTDom4gc+G7kSB0cuG6uyBlbSBjw7MgxJHhu5kgdHXhu5VpIGTGsOG7m2kgNQ0KDQogIC0gUG9wdWxhdGlvbi5vZi5jaGlsZHJlbi51bmRlci50aGUuYWdlLm9mLjE1OiBkw6JuIHPhu5EgdHLhursgZW0gY8OzIMSR4buZIHR14buVaSBkxrDhu5tpIDE1DQoNCiAgLSBQb3B1bGF0aW9uLnVuZGVyLnRoZS5hZ2Uub2YuMjU6IGTDom4gc+G7kSBuZ8aw4budaSBjw7MgxJHhu5kgdHXhu5VpIGTGsOG7m2kgMjUNCg0KICAtIFBvcHVsYXRpb24uYWdlZC4xNS50by42NC55ZWFyOiBkw6JuIHPhu5EgbmfGsOG7nWkgY8OzIMSR4buZIHR14buVaSB04burIDE1IMSR4bq/biA2NA0KDQogIC0gUG9wdWxhdGlvbi5vbGRlci50aGFuLjE1LnllYXJzOiBk4bqlbiBz4buRIG5nxrDhu51pIGPDsyDEkeG7mSB0deG7lWkgbOG7m24gaMahbiAxNQ0KDQogIC0gUG9wdWxhdGlvbi5vbGRlci50aGFuLjE4LnllYXJzOiBkw6JuIHPhu5EgbmfGsOG7nWkgY8OzIMSR4buZIHR14buVaSBs4bubbiBoxqFuIDE4DQoNCiAgLSBQb3B1bGF0aW9uLmF0LmFnZS4xOiBkw6JuIHPhu5EgbmfGsOG7nWkgY8OzIMSR4buZIHR14buVaSBsw6AgMQ0KDQogIC0gUG9wdWxhdGlvbi5hZ2VkLjEudG8uNC55ZWFyczogZMOibiBz4buRIG5nxrDhu51pIGPDsyDEkeG7mSB0deG7lWkgdOG7qyAxIMSR4bq/biA0DQoNCiAgLSBQb3B1bGF0aW9uLmFnZWQuNS50by45LnllYXJzOiBkw6JuIHPhu5EgbmfGsOG7nWkgY8OzIMSR4buZIHR14buVaSB04burIDUgxJHhur9uIDkNCg0KICAtIFBvcHVsYXRpb24uYWdlZC4xMC50by4xNC55ZWFyczogZMOibiBz4buRIG5nxrDhu51pIGPDsyDEkeG7mSB0deG7lWkgdOG7qyAxMCDEkeG6v24gMTQNCg0KICAtIFBvcHVsYXRpb24uYWdlZC4xNS50by4xOS55ZWFyczogZMOibiBz4buRIG5nxrDhu51pIGPDsyDEkeG7mSB0deG7lWkgdOG7qyAxNSDEkeG6v24gMTkNCg0KICAtIFBvcHVsYXRpb24uYWdlZC4yMC50by4yOS55ZWFyczogZMOibiBz4buRIG5nxrDhu51pIGPDsyDEkeG7mSB0deG7lWkgdOG7qyAyMCDEkeG6v24gMjkNCg0KICAtIFBvcHVsYXRpb24uYWdlZC4zMC50by4zOS55ZWFyczogZMOibiBz4buRIG5nxrDhu51pIGPDsyDEkeG7mSB0deG7lWkgdOG7qyAzMCDEkeG6v24gMzkNCg0KICAtIFBvcHVsYXRpb24uYWdlZC40MC50by40OS55ZWFyczogZMOibiBz4buRIG5nxrDhu51pIGPDsyDEkeG7mSB0deG7lWkgdOG7qyA0MCDEkeG6v24gNDkNCg0KICAtIFBvcHVsYXRpb24uYWdlZC41MC50by41OS55ZWFyczogZMOibiBz4buRIG5nxrDhu51pIGPDsyDEkeG7mSB0deG7lWkgdOG7qyA1MCDEkeG6v24gNTkNCg0KICAtIFBvcHVsYXRpb24uYWdlZC42MC50by42OS55ZWFyczogZMOibiBz4buRIG5nxrDhu51pIGPDsyDEkeG7mSB0deG7lWkgdOG7qyA2MCDEkeG6v24gNjkNCg0KICAtIFBvcHVsYXRpb24uYWdlZC43MC50by43OS55ZWFyczogZMOibiBz4buRIG5nxrDhu51pIGPDsyDEkeG7mSB0deG7lWkgdOG7qyA3MCDEkeG6v24gNzkNCg0KICAtIFBvcHVsYXRpb24uYWdlZC44MC50by44OS55ZWFyczogZMOibiBz4buRIG5nxrDhu51pIGPDsyDEkeG7mSB0deG7lWkgdOG7qyA4MCDEkeG6v24gODkNCg0KICAtIFBvcHVsYXRpb24uYWdlZC45MC50by45OS55ZWFyczogZMOibiBz4buRIG5nxrDhu51pIGPDsyDEkeG7mSB0deG7lWkgdOG7qyA5MCDEkeG6v24gOTkNCg0KICAtIFBvcHVsYXRpb24ub2xkZXIudGhhbi4xMDAueWVhcnM6IGTDom4gc+G7kSBuZ8aw4budaSBjw7MgxJHhu5kgdHXhu5VpIGzhu5tuIGjGoW4gMTAwDQoNCg0KYGBge3J9DQpzdHIoZGF0YSkNCmBgYA0KDQoxODI4OCBvYnNlcnZhdGlvbnMgdMawxqFuZyDhu6luZyB24bubaSAxODI4OCBxdWFuIHPDoXQgKGzDoCBjw6FjIGjDoG5nKS4NCg0KMjQgdmFyaWFibGVzIHTGsMahbmcg4bupbmcgduG7m2kgMjQgYmnhur9uIChsw6AgY8OhYyBj4buZdCkuDQoNCmBgYHtyLGVjaG89VFJVRSwgcmVzdWx0cz0naGlkZSd9DQppcy5uYShkYXRhKSAjIFPhu60gZOG7pW5nIGlzLm5hIMSR4buDIGtp4buDbSB0cmEgTkEuIEdpw6EgdHLhu4sgJ1RSVUUnIHBo4bqnbiB04butIHTGsMahbmcg4bupbmcgbMOgIE5BIHbDoCAnRkFMU0UnIGzDoCBraMO0bmcgcGjhuqNpIE5BLiANCmBgYA0KDQonTkEnIGzDoCBt4buZdCBnacOhIHRy4buLIMSR4bq3YyBiaeG7h3QsIMSR4bqhaSBkaeG7h24gY2hvICJOb3QgQXZhaWxhYmxlIiBk4buvIGxp4buHdSBob+G6t2MgZ2nDoSB0cuG7iyBraMO0bmcgeMOhYyDEkeG7i25oIGhv4bq3YyBraMO0bmcgY8OzIHPhurVuLg0KDQpgYGB7cn0NCnN1bShpcy5uYShkYXRhKSkgIyDEkMaw4bujYyBz4butIGThu6VuZyDEkeG7gyDEkeG6v20gc+G7kSBsxrDhu6NuZyBnacOhIHRy4buLIE5BIHRyb25nIG3hu5l0IMSR4buRaSB0xrDhu6NuZyBk4buvIGxp4buHdS4gDQpgYGANCg0KS+G6v3QgcXXhuqMgMCBjw7MgbmdoxKlhIGLhu5kgZOG7ryBsaeG7h3Uga2jDtG5nIGPDsyBOQS4NCg0KYGBge3IsIGVjaG89VFJVRSwgcmVzdWx0cz0naGlkZSd9DQpkdXBsaWNhdGVkKGRhdGEpICMgRMO5bmcgeMOhYyDEkeG7i25oIHhlbSBjw7Mgc+G7sSB0csO5bmcgbOG6t3AgbsOgbyB0cm9uZyBkYXRhIGZyYW1lIGhheSBraMO0bmcuIA0KYGBgDQoNCkdpw6EgdHLhu4sgVFJVRSB0xrDGoW5nIOG7qW5nIHbhu5tpIGPDoWMgaMOgbmcgdHJvbmcgZGF0YSBmcmFtZSBsw6AgdHLDuW5nIGzhurdwIHbDoCBGQUxTRSBu4bq/dSBraMO0bmcgdHLDuW5nIGzhurdwLg0KDQpgYGB7cn0NCnN1bShkdXBsaWNhdGVkKGRhdGEpKSAjIMSQ4bq/bSBz4buRIGzGsOG7o25nIHRyw7luZyBs4bq3cA0KYGBgDQoNCkvhur90IHF14bqjIDAgY8OzIG5naMSpYSBi4buZIGThu68gbGnhu4d1IGtow7RuZyB0csO5bmcgbOG6t3AuDQoNCiMjIFThuqFvIGRhdGFmcmFtZSBt4bubaSDEkeG7gyBwaMOibiB0w61jaA0KDQoqIMSQ4buVaSB0w6puIGPDoWMgYmnhur9uDQoNCmBgYHtyfQ0KbmFtZXMoZGF0YSkgPC0gYygnY3QnLCAneScsICdwJywndW5kZXIuMScsICd1bmRlci41JywgJ3VuZGVyLjE1JywndW5kZXIuMjUnLCdmcm9tLjE1LnRvLjY0JywnYWJvdmUuMTUnLCAnYWJvdmUuMTgnLCdvbmUueWVhci5vbGQnLCdmcm9tLjEudG8uNCcsJ2Zyb20uNS50by45JywnZnJvbS4xMC50by4xNCcsJ2Zyb20uMTUudG8uMTknLCdmcm9tLjIwLnRvLjI5JywnZnJvbS4zMC50by4zOScsJ2Zyb20uNDAudG8uNDknLCdmcm9tLjUwLnRvLjU5JywnZnJvbS42MC50by42OScsJ2Zyb20uNzAudG8uNzknLCdmcm9tLjgwLnRvLjg5JywnZnJvbS45MC50by45OScsJ2Fib3ZlLjEwMCcpICMgVmnhu4djIMSR4buVaSB0w6puIGPDoWMgYmnhur9uIGdpw7pwIGThu68gbGnhu4d1IMSRxrDhu6NjIG5n4bqvbiBn4buNbiBoxqFuLCB0csOhbmggxJHGsOG7o2MgY8OhYyBuaOG6p20gbOG6q24uDQpuYW1lcyhkYXRhKSANCmBgYA0KDQpWaeG7h2MgxJHhu5VpIHTDqm4gY8OybiDEkcaw4bujYyB0aOG7sWMgaGnhu4duIGLhu59pIGzhu4duaCByZW5hbWUoKSB0cm9uZyBwYWNrYWdlcyB0aWR5dmVyc2UuIMSQaeG7g20ga2jDoWMgbmhhdSBnaeG7r2EgaGFpIGzhu4duaCBuw6B5IGzDoCBuYW1lcygpIHRo4buxYyBoaeG7h24gxJHhu5VpIHTDqm4gY2hvIHThuqV0IGPhuqMgY8OhYyBiaeG6v24gdsOgIHJlbmFtZSgpIGTDoG5oIGNobyB2aeG7h2MgxJHhurd0IHTDqm4gYuG6pXQga8OsIGJp4bq/biBuw6BvLg0KDQoqIENo4buNbiBk4buvIGxp4buHdSDEkeG7gyBwaMOibiB0w61jaA0KDQpgYGB7cn0NCmxpYnJhcnkodGlkeXZlcnNlKSAjIHLDunQgdHLDrWNoIGThu68gbGnhu4d1IHRow7RuZyBxdWEgcGFja2FnZSAndHlkeXZlcnNlJyDEkeG7gyBkw7luZyAnc2VsZWN0JyB2w6AgJ2ZpbHRlcicNCmQgPC0gZmlsdGVyKGRhdGEsY3QgJWluJSBjKCdWaWV0bmFtJywnVGhhaWxhbmQnLCdDaGluYScsICdTb3V0aCBLb3JlYScsICdKYXBhbicpKSAjICdmaWx0ZXInIMSRxrDhu6NjIHPhu60gZOG7pW5nIMSR4buDIGNo4buNbiBjw6FjIHF1YW4gc8OhdCB0cm9uZyBkYXRhZnJhbWUuIA0KZCA8LSBzZWxlY3QoZCxjdCx5LHAsdW5kZXIuMSx1bmRlci41LGZyb20uMTUudG8uNjQsb25lLnllYXIub2xkLGFib3ZlLjEwMCkgIyBT4butIGThu6VuZyAnc2VsZWN0JyDEkeG7gyBjaOG7jW4gcmEgY8OhYyBiaeG6v24uIA0KZA0KYGBgIA0KDQpL4bq/dCBxdeG6oyB0cm9uZyBjw6J1IGzhu4duaCAnZmlsdGVyJyBuZ2jEqWEgbMOgIGNo4buNbiBjw6FjIHF1YW4gc8OhdCB0cm9uZyBiaeG6v24gJ2N0JyBjw7MgZ2nDoSB0cuG7iyB0xrDGoW5nIOG7qW5nIGzDoCAnVmlldG5hbScsICdUaGFpbGFuZCcsICdDaGluYScsICAnU291dGggS29yZWEnLCAnSmFwYW4nLg0KDQrhu54gY8OidSBs4buHbmggJ3NlbGVjdCcgc+G6vSB0cuG6oyB24buBIG3hu5l0IGRhdGFmcmFtZSBt4bubaSBjaOG7iSBjaOG7qWEgYmnhur9uICd1bmRlci4xJywgJ3VuZGVyLjUnLCAnZnJvbS4xNS50by42NCcsICdvbmUueWVhci5vbGQnLCAnYWJvdmUuMTAnIHThu6sgZGF0YWZyYW1lIHbhu6thIHThuqFvIOG7nyB0csOqbi4NCg0KVuG7m2kgbOG7h25oICdmaWx0ZXInIHRhIGzhuqV5IHJhIMSRxrDhu6NjIDM2MCBxdWFuIHPDoXQgZOG7sWEgdHLDqm4gZGF0YWZyYW1lIGfhu5FjIGzDoCAnZGF0YScgdsOgIGzhu4duaCAnc2VsZWN0JyBs4bqleSByYSDEkcaw4bujYyA4IGJp4bq/biB0cm9uZyBkYXRhZnJhbSBt4bubaS4gVOG7qyDEkcOzIHRhIMSRxrDhu6NjIG3hu5l0IGRhdGFmcmFtZSBt4bubaSBoxqFuIGzDoCAnZCcgduG7m2kgMzYwIHF1YW4gc8OhdCB2w6AgdMawxqFuZyDhu6luZyA4IGJp4bq/bi4NCg0KIyMgTcOjIGjDs2EgZOG7ryBsaeG7h3UgDQoNCiogTcOjIGjDs2EgZOG7r3UgbGnhu4d1IGThu7FhIHbDoG8gdMOqbiBxdeG7kWMgZ2lhDQoNCmBgYHtyfQ0KZCRjdC5Db2RlZCA8LSBpZmVsc2UoZCRjdCA9PSAnVmlldG5hbScsJ1ZpZXRuYW0nLCdOb3QgVmlldG5hbScpIA0KYGBgDQoNCidpZmVsc2UnIHPhur0ga2nhu4NtIHRyYSDEkWnhu4F1IGtp4buHbiB0cm9uZyBiaeG6v24gY3QsIG7hur91IHRyb25nIGN0IGPDsyBwaOG6p24gdOG7rSBsw6AgJ1ZpZXRuYW0nIHRow6wgc+G6vSB0cuG6oyB24buBICdWaWV0bmFtJywgbuG6v3Ugc2FpIMSRaeG7gXUga2nhu4duIHRow6wgc+G6vSB0cuG6oyB24buBICdOb3QgVmlldG5hbScuDQoNCiogTcOjIGjDs2EgZOG7ryBsaeG7h3UgZOG7sWEgdsOgbyBz4buRIGzGsOG7o25nIGTDom4gc+G7kSBj4bunYSBt4buZdCBuxrDhu5tjIHRyb25nIGPDoWMgbsSDbSANCg0KYGBge3J9DQpkJHAuQ29kZWQgPC0gY2FzZV93aGVuKGQkcCA8IDcwMDAwMDAwIH4gJ8ONdCcsZCRwID49IDcwMDAwMDAwICYgZCRwIDw9MTAwMDAwMDAwMCB+ICdW4burYScsZCRwID4xMDAwMDAwMDAwIH4gJ05oaeG7gXUnKSAjICdjYXNlX3doZW4nIGTDuW5nIMSR4buDIHRo4buxYyBoaeG7h24gbeG7mXQgbG/huqF0IGPDoWMgxJFp4buBdSBraeG7h24gdsOgIHRy4bqjIHbhu4EgZ2nDoSB0cuG7iyB0xrDGoW5nIOG7qW5nIGPhu6dhIGPDoWMgxJFp4buBdSBraeG7h24uDQpgYGANCg0KTeG7mXQgY+G7mXQgbeG7m2kgY8OzIHTDqm4gbMOgICdwLmNvZGVkJyBz4bq9IMSRxrDhu6NjIHThuqFvIHTGsMahbmcg4bupbmcgduG7m2kgY8OhYyDEkWnhu4F1IGtp4buHbi4gUGjhuqduIHThu60gdHJvbmcgYmnhur9uIHPhur0gY8OzIGdpw6EgdHLhu4sgbMOgICfDjXQnIG7hur91IHF1YW4gc8OhdCB0cm9uZyBiaeG6v24gJ3AnIGPDsyBnacOhIHRy4buLIG5o4buPIGjGoW4gNzAwMDAwMDAsICdW4burYScgbuG6v3UgcXVhbiBzw6F0IHRyb25nICdwJyBs4bubbiBoxqFuIGLhurFuZyA3MDAwMDAwMCB2w6Agbmjhu48gaMahbiBi4bqxbmcgMTAwMDAwMDAwMCwga2hpIGzhu5tuIGjGoW4gMTAwMDAwMDAwMCB0aMOsIHBo4bqnbiB04butIGPDsyBnacOhIHRy4buLIGzDoCAnTmhp4buBdScuDQogDQoqIFBow6JuIGNoaWEgZOG7ryBsaeG7h3UNCg0KYGBge3J9DQpkJHVuZGVyMS5Db2RlZCA8LSBjdXQoZCR1bmRlci4xLDMsbGFiZWxzID0gYygnTmjDs20gMScsJ05ow7NtIDInLCdOaMOzbSAzJykpIA0KIyBIw6BtICdjdXQnIMSRxrDhu6NjIHPhu60gZOG7pW5nIMSR4buDIGNoaWEgZOG7ryBsaeG7h3UgdGjDoG5oIGPDoWMga2hv4bqjbmcgKGJpbnMpIHLhu5NpIGfDoW4gdMOqbiBjaG8gdOG7q25nIGtob+G6o25nIGThu7FhIHRyw6puIGdpw6EgdHLhu4suDQpgYGANCg0KROG7ryBsaeG7h3UgdHJvbmcgYmnhur9uICd1bmRlci4xJyDEkcaw4bujYyBjaGlhIHRow6BuaCAzIGtob+G6o25nLCB2w6AgY8OhYyB0w6puICdOaMOzbSAxJywgJ05ow7NtIDInLCAnTmjDs20gMycgxJHGsOG7o2MgZ8OhbiB0xrDGoW5nIOG7qW5nIHbhu5tpIGPDoWMga2hv4bqjbmcgxJHDsy4NCiANCiogTcOjIGjDs2EgZOG7ryBsaeG7h3UgYuG6sW5nIGPDoWNoIMSRxrBhIHTDqm4gY8OhYyBuxrDhu5tjIHbhu4EgdGnhur9uZyBWaeG7h3QNCg0KYGBge3J9DQpkJGN0LkNvZGVkMSA8LSByZWNvZGUoZCRjdCxDaGluYSA9J1RydW5nIFF14buRYycsIEphcGFuID0nTmjhuq10IELhuqNuJywgVmlldG5hbSA9J1Zp4buHdCBOYW0nLCBUaGFpbGFuZCA9J1Row6FpIExhbicsIFNvdXRoLktvcmVhID0nSMOgbiBRdeG7kWMnKQ0KIyBIw6BtICdyZWNvZGUnIGNobyBwaMOpcCB0aGF5IMSR4buVaSBnacOhIHRy4buLIGPhu6dhIG3hu5l0IGJp4bq/biB0aMOgbmggZ2nDoSB0cuG7iyBt4bubaSBk4buxYSB0csOqbiBjw6FjIHF1eSB04bqvYyB4w6FjIMSR4buLbmguIA0KYGBgDQoNCuG7niBt4buVaSBwaOG6p24gdOG7rSB0aHXhu5ljIGJp4bq/biAnY3QnIGPDsyBnacOhIHRy4buLIGzDoCAnQ2hpbmEnIHRow6wgc+G6vSDEkcaw4bujYyBtw6MgaMOzYSB0aMOgbmggJ1RydW5nIFF14buRYycsIHTGsMahbmcgdOG7sSAnSmFwYW4nIHPhur0gxJHGsOG7o2MgbcOjIGjDs2EgdGjDoG5oICdOaOG6rXQgQuG6o24nLC4uLiANCg0KYGBge3J9DQpkIA0KYGBgDQoNClF1YSA0IGzhu4duaCBtw6MgaMOzYSB0csOqbiwgZGF0YSBmcmFtZSAnZCcgY8OzIHThu5VuZyBj4buZbmcgbMOgIDEyIGJp4bq/biB2w6Agc+G7kSBxdWFuIHPDoXQgbMOgIGtow7RuZyDEkeG7lWkgduG7m2kgMzYwIGjDoG5nLg0KDQojIyBM4bqtcCBi4bqjbmcgdOG6p24gc+G7kQ0KDQoqIFhlbSBz4buRIGzhuqduLCBz4buRIHThuqduIHN14bqldCBs4bq3cCBs4bqhaSB0cm9uZyBt4buZdCBk4buvIGxp4buHdSANCg0KYGBge3J9DQp0YWJsZShkJGN0KSAjIEjDoG0gJ3RhYmxlJyDEkcaw4bujYyBz4butIGThu6VuZyDEkeG7gyB04bqhbyBi4bqjbmcgdOG6p24gc3XhuqV0IGPhu6dhIGPDoWMgZ2nDoSB0cuG7iyB0cm9uZyBt4buZdCBk4buvIGxp4buHdS4gQuG6o25nIHThuqduIHN14bqldCBuw6B5IGNobyBwaMOpcCB4ZW0geMOpdCBwaMOibiBwaOG7kWkgY+G7p2EgY8OhYyBnacOhIHRy4buLIHbDoCBiaeG6v3QgxJHGsOG7o2Mgc+G7kSBs4bqnbiB4deG6pXQgaGnhu4duIGPhu6dhIG3hu5dpIGdpw6EgdHLhu4suDQpgYGANCg0KU+G7kSAnNzInIHh14bqldCBoaeG7h24gdHJvbmcgYuG6o25nIGvhur90IHF14bqjIGNobyB0aOG6pXkgZ2nDoSB0cuG7iyAnQ2hpbmEnLCAnSmFwYW4nLCAnU291dGggS29yZWEnLCAnVGhhaWxhbmQnIHbDoCAnVmlldG5hbScgxJHGsOG7o2MgbOG6t3AgbOG6oWkgaG/hurdjIMSRxrDhu6NjIHh14bqldCBoaeG7h24gNzIgbOG6p24sIHTGsMahbmcg4bupbmcgduG7m2kgNzIgbsSDbSB0cm9uZyB04buVbmcgc+G7kSBuxINtIHBow6JuIHTDrWNoLg0KDQoqIEzhuq1wIGJp4buDdSDEkeG7kyBuaMOhbmggdsOgIGzDoQ0KDQpgYGB7cn0NCmQxIDwtIGZpbHRlcihkLGN0ID09ICdWaWV0bmFtJykgIyBEw7luZyBs4buHbmggZmlsdGVyIMSR4buDIGNo4buNbiByYSBjw6FjIHF1YW4gc8OhdCwgxJHhu4MgcGjDom4gdMOtY2ggcmnDqm5nIG7GsOG7m2MgVmnhu4d0IE5hbQ0Kc3RlbShkMSRhYm92ZS4xMDApICMgQmnhu4N1IMSR4buTIG5ow6FuaCB2w6AgbMOhIGzDoCBt4buZdCBiaeG7g3UgxJHhu5MgdGjGsOG7nW5nIMSRxrDhu6NjIHPhu60gZOG7pW5nIMSR4buDIGhp4buDbiB0aOG7iyBj4bqldSB0csO6YyBwaMOibiBj4bqlcCBj4bunYSBt4buZdCB04bqtcCBo4bujcCBjw6FjIMSR4buRaSB0xrDhu6NuZyBob+G6t2MgbeG6q3UuIA0KYGBgDQoNCkzhu4duaCBz4bq9IMSRxrDhu6NjIHBow6JuIHTDrWNoIGThu7FhIHbDoG8gxJFp4buBdSBraeG7h24gZOG6pXUgdGjhuq1wIHBow6JuIGzDoCAzIGNo4buvIHPhu5Eg4bufIGLDqm4gcGjhuqNpLiBUxrDGoW5nIOG7qW5nIHbhu5tpIG5ow6FuaCBsw6AgcGjhuqduIHPhu5EgaMOgbmcgbmdow6xuIHbDoCBsw6EgbMOgIHBo4bqnbiBz4buRIGjDoG5nIHRyxINtLg0KDQpOaMOhbmggbMOgIGfhu5NtIGPDoWMgc+G7kSBiw6puIHRyw6FpIGThuqV1ICd8JyB2w6AgYsOqbiBwaOG6o2kgbMOgIGzDoS4gR+G7k20gNyBuaMOhbmggbMOgIGPDoWMgbmjDoW5oIGPDoWMgc+G7kSBow6BuZyB0csSDbSwgMSBuZ2jDrG4sIDIgbmdow6xuLC4uLiDEkeG6v24gNiBuZ2jDrG4uDQoNCkThu4UgZMOgbmcgdGjhuqV5IMSRxrDhu6NjIOG7nyBow6BuZyBjdeG7kWkgY8O5bmcsIGPDsyAyIGzDoSBu4bqxbSB0cm9uZyBuaMOhbmggNiwgbmdoxKlhIGzDoCBjw7MgMiBuxINtLCBWaeG7h3QgTmFtIGPDsyBkw6JuIHPhu5Eg4bufIMSR4buZIHR14buVaSB0csOqbiAxMDAgbMOgIGtob+G6o25nIDYwMDAgbmfGsOG7nWkgdsOgIGNvbiBz4buRIHTGsMahbmcg4bupbmcgbMOgIDYwMDAgdsOgIDY0MDAgKGNvbiBz4buRIMSRw6MgYmFvIGfhu5NtICB2aeG7h2MgbMOgbSB0csOybikuIA0KDQojIyBUw61uaCB0b8OhbiBjw6FjIMSR4bq3YyB0csawbmcgxJFvIGzGsOG7nW5nIGPhu6dhIDUgcXXhu5FjIGdpYSDhu58gxJHhu5kgdHXhu5VpIHThu6sgMTUgxJHhur9uIDY0DQoNCiogTcO0IHThuqMgZ2nDoSB0cuG7iyBuaOG7jyBuaOG6pXQgDQoNCmBgYHtyfQ0KbWluIDwtIGQgJT4lIGdyb3VwX2J5KGN0KSAlPiUgc3VtbWFyaXNlKG1pbiA9IG1pbihmcm9tLjE1LnRvLjY0KSwgbiA9IG4oKSkNCm1pbg0KYGBgDQoNClRyb25nIDcyIG7Eg20gcGjDom4gdMOtY2gsIGTDom4gc+G7kSB0aOG6pXAgbmjhuqV0IHRyb25nIMSR4buZIHR14buVaSB04burIDE1IMSR4bq/biA2NCBs4bqnbiBsxrDhu6N0IHRoZW8gY8OhYyBxdeG7kWMgZ2lhIFRydW5nIFF14buRYywgTmjhuq10IELhuqNuLCBIw6BuIFF14buRYywgVGjDoWkgTGFuIHbDoCBWaeG7h3QgTmFtIGzDoCAzMjcyODU5NTAsIDUwMzgwODY4LCAxMDkxOTU3NSwgMTExNTA0MDUgdsOgIDE1ODM2ODI1Lg0KDQoqIE3DtCB04bqjIHThu6kgcGjDom4gduG7iyANCg0KVOG7qSBwaMOibiB24buLIGzDoCBt4buZdCBraMOhaSBuaeG7h20gdHJvbmcgdGjhu5FuZyBrw6ogbcO0IHThuqMgxJHhu4MgcGjDom4gY2hpYSBt4buZdCB04bqtcCBk4buvIGxp4buHdSB0aMOgbmggYuG7kW4gcGjhuqduIGLhurFuZyBuaGF1LCBt4buXaSBwaOG6p24gY2hp4bq/bSAyNSUgdOG7lW5nIHPhu5EgcXVhbiBzw6F0LiANCg0KICAqIMSQaeG7g20gcGjDom4gduG7iyB0aOG7qSBuaOG6pXQNCiAgDQpgYGB7cn0NClExIDwtIGQgJT4lIGdyb3VwX2J5KGN0KSAlPiUgcmVmcmFtZShxdWFudGlsZV8xc3QgPSBxdWFudGlsZShmcm9tLjE1LnRvLjY0LCBwcm9icyA9IGMoLjI1KSksIG4gPSBuKCkpDQpRMQ0KYGBgDQoNClThuqFpIMSRaeG7g20gbsOgeSwgZ2nDoSB0cuG7iyBjaGlhIHThuq1wIGThu68gbGnhu4d1IHRow6BuaCAyNSUgZ2nhuqNtIGThuqduLCBuZ2jEqWEgbMOgIGPDsyAyNSUgc+G7kSBsaeG7h3UgYsOpIGjGoW4gaG/hurdjIGLhurFuZyBRMSB2w6AgNzUlIHPhu5EgbGnhu4d1IGzhu5tuIGjGoW4gUTEuDQoNCk5naMSpYSBsw6AgdOG6oWkgVHJ1bmcgUXXhu5FjLCDhu58gxJHhu5kgdHXhu5VpIG7DoHkgdHJvbmcgY8OhYyBuxINtLCBkw6JuIHPhu5Egw610IGjGoW4gaG/hurdjIGLhurFuZyA0Mjc3MTkxNjMgbMOgIDI1JS4gVMawxqFuZyB04buxIGPDoWMgbsaw4bubYyBjw7JuIGzhuqFpLg0KDQogICAqIMSQaeG7g20gcGjDom4gduG7iyB0aOG7qSBoYWkgLSBUcnVuZyB24buLIA0KDQpgYGB7cn0NClEyIDwtIGQgJT4lIGdyb3VwX2J5KGN0KSAlPiUgcmVmcmFtZShxdWFudGlsZV8ybmQgPSBxdWFudGlsZShmcm9tLjE1LnRvLjY0LCBwcm9icyA9IGMoLjUpKSwgbiA9IG4oKSkNClEyDQpgYGANCg0KVOG7qSBwaMOibiB24buLIHRo4bupIGhhaSBjaMOtbmggbMOgIGdpw6EgdHLhu4sgdHJ1bmcgYsOsbmgsIGhv4bq3YyBtZWRpYW4gKHRydW5nIHbhu4spLiBMw6AgZ2nDoSB0cuG7iyBjaGlhIHThuq1wIGThu68gbGnhu4d1IHRow6BuaCBoYWkgcGjhuqduIGLhurFuZyBuaGF1LCA1MCUgc+G7kSBsaeG7h3UgYsOpIGjGoW4gUTIgdsOgIDUwJSBz4buRIGxp4buHdSBs4bubbiBoxqFuIFEyLg0KDQrhu54gVHJ1bmcgUXXhu5FjLCBxdWEgY8OhYyBuxINtLCBt4buZdCBu4butYSBnacOhIHRy4buLIG5o4buPIGjGoW4gaG/hurdjIGLhurFuZyA2ODY2OTY2MDAgdsOgIG3hu5l0IG7hu61hIGdpw6EgdHLhu4sgbOG7m24gaMahbiBob+G6t2MgYuG6sW5nIDY4NjY5NjYwMC4gQ8OhYyBuxrDhu5tjIGPDsm4gbOG6oWkgdMawxqFuZyB04buxLg0KDQogICogxJBp4buDbSBwaMOibiB24buLIHRo4bupIDMNCg0KYGBge3J9DQpRMyA8LSBkICU+JSBncm91cF9ieShjdCkgJT4lIHJlZnJhbWUocXVhbnRpbGVfM3JkID0gcXVhbnRpbGUoZnJvbS4xNS50by42NCwgcHJvYnMgPSBjKC43NSkpLCBuID0gbigpKQ0KUTMNCmBgYA0KDQpU4bupIHBow6JuIHbhu4sgdGjhu6kgYmEgbMOgIGdpw6EgdHLhu4sgY2hpYSB04bqtcCBk4buvIGxp4buHdSB0aMOgbmggNzUlIGdp4bqjbSBk4bqnbiwgbmdoxKlhIGzDoCBjw7MgNzUlIHPhu5EgbGnhu4d1IGLDqSBoxqFuIGhv4bq3YyBi4bqxbmcgUTMgdsOgIDI1JSBz4buRIGxp4buHdSBs4bubbiBoxqFuIFEzLg0KDQpUcm9uZyDEkeG7mSB0deG7lWkgdOG7qyAxNSDEkeG6v24gNjQsIHThuqFpIFRydW5nIFF14buRYywgY8OzIDc1JSBkw6JuIHPhu5EgYsOpIGjGoW4gaG/hurdjIGLhurFuZyA5MTIzMDk3NzUgaG/hurdjIGPDsyAyNSUgZMOibiBz4buRIGzhu5tuIGjGoW4gOTEyMzA5Nzc1LiBDw6FjIG7GsOG7m2MgY8OybiBs4bqhaSB0xrDGoW5nIHThu7EuDQoNCiogTcO0IHThuqMgZ2nDoSB0cuG7iyB0cnVuZyBiw6xuaA0KDQpgYGB7cn0NCm1lYW4gPC0gZCAlPiUgZ3JvdXBfYnkoY3QpICU+JSBzdW1tYXJpc2UobWVhbiA9IG1lYW4oZnJvbS4xNS50by42NCksIG49IG4oKSkNCm1lYW4NCmBgYA0KIA0KTmjGsCB24bqteSwgdHJ1bmcgYsOsbmggbeG7mXQgbsSDbSBkw6JuIHPhu5EgVHJ1bmcgUXXhu5FjIHPhur0gY8OzIDY3MjA5NDY5NyBuZ8aw4budaSB0cm9uZyDEkeG7mSB0deG7lWkgdOG7qyAxNSDEkeG6v24gNjQuDQoNClTGsMahbmcgdOG7sSwgdHJvbmcgNzIgbsSDbSB0cnVuZyBiw6xuaCBt4buZdCBuxINtIGTDom4gc+G7kSB04burIDE1IMSR4bq/biA2NCB0deG7lWkg4bufIE5o4bqtdCBC4bqjbiBsw6AgNzU0MzQ3MzIsIEjDoG4gUXXhu5FjIGzDoCAyNTc1NzQyNSwgVGjDoWkgTGFuIGPDsyAzMTY0MjAwNCB2w6AgVmnhu4d0IE5hbSBjw7MgMzcxMzY1NDcuDQoNCiogTcO0IHThuqMgZ2nDoSB0cuG7iyBs4bubbiBuaOG6pXQNCg0KYGBge3J9DQptYXggPC0gZCAlPiUgZ3JvdXBfYnkoY3QpICU+JSBzdW1tYXJpc2UobWF4ID0gbWF4KGZyb20uMTUudG8uNjQpLCBuID0gbigpKQ0KbWF4DQpgYGANCg0KVHJvbmcgNzIgbsSDbSBwaMOibiB0w61jaCwgZMOibiBz4buRIGNhbyBuaOG6pXQgdHJvbmcgxJHhu5kgdHXhu5VpIHThu6sgMTUgxJHhur9uIDY0IGzhuqduIGzGsOG7o3QgdGhlbyBjw6FjIHF14buRYyBnaWEgVHJ1bmcgUXXhu5FjLCBOaOG6rXQgQuG6o24sIEjDoG4gUXXhu5FjLCBUaMOhaSBMYW4gdsOgIFZp4buHdCBOYW0gbMOgIDk5ODIyNjEwMCwgODcxMTY2MTYsIDM3NjQzMDU2LCA1MDQzMTg2MCB2w6AgNjY5NjIyMTAuDQoNCiMgTkhJ4buGTSBW4bukIDMuMg0KDQojIyDEkOG7jWMgYuG7mSBk4buvIGxp4buHdQ0KDQpgYGB7cn0NCm52MyA8LSByZWFkLmNzdihmaWxlLmNob29zZSgpLCBoZWFkZXIgPSBUKQ0KbnYzDQpgYGANCg0KIyMgR2nhuqNpIHRow61jaCBi4buZIGThu68gbGnhu4d1DQoNCi0gROG7ryBsaeG7h3UgduG7gSB2aeG7h2MgZOG7sSBiw6FvIGTDom4gc+G7kSBIb2EgS+G7syB0aGVvIHThu6tuZyDEkeG7mSB0deG7lWkgdOG7qyAyMDE2LTIwNjAuDQoNCi0gR+G7k20gMjgzNSBxdWFuIHPDoXQgdsOgIDEwNiBiaeG6v246DQoNCiAgLSBTZXg6IGdp4bubaSB0w61uaCDEkWFuZyBxdWFuIHPDoXQNCiAgDQogIC0gT3JpZ2luOiDEkeG6v24gdOG7qyBuxqFpIG7DoG8gxJHDsw0KICANCiAgLSBSYWNlOiAgY8OhYyBuaMOzbSBjaOG7p25nIHThu5ljIHbDoCBkw6JuIHThu5ljIA0KICANCiAgLSBZZWFyOiBuxINtIGThu7EgxJFvw6FuLCB04burIG7Eg20gMjAxNiDEkeG6v24gMjA2MA0KICANCiAgLSBUb3RhbCBQb3B1bGF0aW9uOiB04buVbmcgY+G7mW5nIGPDoWMgZMOibiBz4buRIGThu7EgxJFvw6FuIMSRxrDhu6NjDQogIA0KICAtIFbDoCAxMDEgYmnhur9uIHTGsMahbmcg4bupbmcgduG7m2kgMTAxIGPhu5l0IHbhu5tpIMSR4buZIHR14buVaSB04burIDAgxJHhur9uIDEwMA0KICANCi0gTMOgIGRhdGFmcmFtZS4NCg0KLSBLaMO0bmcgY8OzIGdpw6EgdHLhu4sgTkEuDQoNCi0gS2jDtG5nIGPDsyBk4buvIGxp4buHdSBi4buLIHRyw7luZyBs4bqvcC4NCg0KYGBge3J9DQpkaW0obnYzKSAjIFhlbSB04buVbmcgc+G7kSBxdWFuIHPDoXQgdsOgIHThu5VuZyBz4buRIGJp4bq/bg0KYGBgDQoNCjI4MzUg4bupbmcgduG7m2kgMjgzNSBxdWFuIHPDoXQNCg0KMTA2IOG7qW5nIHbhu5tpIDEwNiBiaeG6v24NCg0KYGBge3J9DQppcy5kYXRhLmZyYW1lKG52MykgI0tp4buDbSB0cmEgYuG7mSBk4buvIGxp4buHdQ0KYGBgDQoNCkvhur90IHF14bqjIFRSVUUgdGjhu4MgaGnhu4duIGLhu5kgZOG7ryBsaeG7h3UgbMOgIG3hu5l0IGRhdGFmcmFtZS4NCg0KYGBge3IgZWNobz1UUlVFLCByZXN1bHRzPSdoaWRlJ30NCmlzLm5hKG52MykgIyBYZW0gYuG7mSBk4buvIGxp4buHdSBjw7MgZ2nDoSB0cuG7iyB0cuG7kW5nIGhheSBraMO0bmcNCmBgYA0KDQpL4bq/dCBxdeG6oyBUUlVFIGNo4buJIHThuqFpIHBo4bqnbiB04butIMSRw7MgbMOgIG3hu5l0IGdpw6EgdHLhu4sgdHLhu5FuZyB2w6AgRkFMU0Uga2hpIGtow7RuZyBwaOG6o2kgZ2nDoSB0cuG7iyB0cuG7kW5nLg0KDQpgYGB7cn0NCnN1bShpcy5uYShudjMpKSAjIEtp4buDbSB0cmEgdOG7lW5nIHPhu5EgcGjhuqduIHThu60gY8OzIGdpw6EgdHLhu4sgdHLhu5FuZw0KYGBgDQoNCkLhu5kgZOG7ryBsaeG7h3Uga2jDtG5nIGPDsyBnacOhIHRy4buLIE5BLg0KDQpgYGB7ciwgZWNobz1UUlVFLCByZXN1bHRzPSdoaWRlJ30NCmR1cGxpY2F0ZWQobnYzKSAjIEtp4buDbSB0cmEgeGVtIHPhu7EgdHLDuW5nIGzhurdwIGPhu6dhIGThu68gbGnhu4d1DQpgYGANCg0KR2nDoSB0cuG7iyBUUlVFIHTGsMahbmcg4bupbmcgduG7m2kgY8OhYyBow6BuZyB0cm9uZyBkYXRhIGZyYW1lIGzDoCB0csO5bmcgbOG6t3AgdsOgIEZBTFNFIG7hur91IGtow7RuZyB0csO5bmcgbOG6t3AuDQoNCmBgYHtyfQ0Kc3VtKGR1cGxpY2F0ZWQobnYzKSkNCmBgYA0KDQpL4bq/dCBxdeG6oyB0cuG6oyB24buBIDAsIGLhu5kgZOG7ryBsaeG7h3Uga2jDtG5nIHRyw7luZyBs4bq3cC4NCg0KIyMgTcOjIGjDs2EgZOG7ryBsaeG7h3UNCg0KKiBNw6MgaMOzYSBk4buvIGxp4buHdSBk4buxYSB2w6BvIGdp4bubaSB0w61uaA0KDQpgYGB7cn0NCm52MyRTZXguQ29kZWQgPC0gaWZlbHNlKG52MyRTZXggPT0gJ0ZlbWFsZScsJ0ZlbWFsZScsJ05vdCBGZW1hbGUnKQ0KYGBgDQoNCsSQaeG7gXUga2nhu4duIGzhu4duaCDhu58gxJHDonkgbMOgIG7hur91IHRyb25nIGJp4bq/biBTIGPDsyBnacOhIHRy4buLIGzDoCAnRmVtYWxlJyB0aMOsIHPhur0gxJHGsOG7o2MgbcOjIGjDs2EgdGjDoG5oICdGZW1hbGUnLCBu4bq/dSBnacOhIHRy4buLIGtow6FjICdGZW1hbGUnIChCb3RoIGhv4bq3YyBNYWxlKSB0aMOsIHPhur0gxJHGsOG7o2MgbcOjIGjDs2EgdGjDoG5oICdOb3QgRmVtYWxlJy4NCg0KKiBNw6MgaMOzYSBnaeG7m2kgdMOtbmggdGjDoG5oIGPDoWMgY29uIHPhu5ENCg0KYGBge3J9DQpudjMkU2V4LkNvZGVkMSA8LSByZWNvZGUobnYzJFNleCxNYWxlID0gJzEnLCBGZW1hbGUgPSAnMicsIEJvdGggPSAnMycpDQpgYGANCg0KR2nhu5tpIHTDrW5oIHPhur0gxJHGsOG7o2MgbcOjIGjDs2EgZMaw4bubaSBk4bqhbmcgY8OhYyBjb24gc+G7kSwg4bufIHBo4bqnbiB04butIGPDsyBnacOhIHRy4buLIGzDoCAnTWFsZScgc+G6vSDEkcaw4bujYyBtw6MgaMOzYSB0aMOgbmggc+G7kSAnMScsICdGZW1hbGUnIHRow6BuaCBz4buRICcyOyB2w6AgJ0JvdGgnIGzDoCBz4buRIDMuDQoNCiogTcOjIGjDs2EgZOG7ryBsaeG7h3UgZOG7sWEgdsOgbyBz4buRIGxp4buHdSBkw6JuIHPhu5EgdHJvbmcgxJHhu5kgdHXhu5VpIDE4DQoNCmBgYHtyfQ0KbnYzJEFnZS4xOC5Db2RlZCA8LSBjYXNlX3doZW4obnYzJEFnZS4xOCA8IDUwMDAgfiAnUuG6pXQgaXQnLG52MyRBZ2UuMTggPj0gNTAwMCAmIG52MyRBZ2UuMTggPCAxMDAwMCB+ICdJdCcsbnYzJEFnZS4xOCA+PSAxMDAwMCAmIG52MyRBZ2UuMTggPCA1MDAwMDAgfiAnVuG7q2EnLG52MyRBZ2UuMTggPj0gNTAwMDAwICYgbnYzJEFnZS4xOCA8ICAyMDAwMDAwIH4gJ05oaeG7gXUgJyxudjMkQWdlLjE4ID49IDIwMDAwMDAgfiAnUuG6pXQgbmhp4buBdScpDQpgYGANCg0KQ8OhYyBkw6JuIHPhu5EgZOG7sSDEkW/DoW4gc+G6vSDEkcaw4bujYyBtw6MgaMOzYSB0aMOgbmggZOG6oW5nIGNo4buvIHbhu5tpIGPDoWMgxJFp4buBdSBraeG7h24uIA0KDQpCw6kgaMahbiA1MDAwIC0+IFLhuqV0IMOtdA0KDQpU4burIDUwMDAgxJHhur9uIDEwMDAwIC0+IMONdA0KDQpU4burIDEwMDAwIMSR4bq/biA1MDAwMDAgLT4gVuG7q2ENCg0KVOG7qyA1MDAwMDAgxJHhur9uIDIwMDAwMDAgLT4gTmhp4buBdSANCg0KTmhp4buBdSBoxqFuIDIwMDAwMDAgLT4gUuG6pXQgbmhp4buBdQ0KDQoqIE3DoyBow7NhIGThu68gbGnhu4d1IHRoZW8gbmjDs20gZOG7sWEgdsOgbyDEkeG7mSB0deG7lWkgMjANCg0KYGBge3J9DQpudjMkQWdlLjIwLkNvZGVkIDwtIGN1dChudjMkQWdlLjIwLDMsbGFiZWxzID0gYygnTmjDs20gMScsJ05ow7NtIDInLCdOaMOzbSAzJykpIA0KYGBgDQoNCkThu68gbGnhu4d1IHRyb25nIGJp4bq/biDigJhBZ2UuMjDigJkgxJHGsOG7o2MgY2hpYSB0aMOgbmggMyBraG/huqNuZywgdsOgIGPDoWMgdMOqbiDigJhOaMOzbSAx4oCZLCDigJhOaMOzbSAy4oCZLCDigJhOaMOzbSAz4oCZIMSRxrDhu6NjIGfDoW4gdMawxqFuZyDhu6luZyB24bubaSBjw6FjIGtob+G6o25nIMSRw7MuDQoNCmBgYHtyfQ0KbnYzIA0KYGBgDQoNClF1YSA0IGzhu4duaCBtw6MgaMOzYSB0csOqbiwgZGF0YSBmcmFtZSAnbnYzJyBjw7MgdOG7lW5nIGPhu5luZyBsw6AgMTEwIGJp4bq/biB2w6Agc+G7kSBxdWFuIHPDoXQgbMOgIGtow7RuZyDEkeG7lWkgduG7m2kgMjgzNSBow6BuZy4NCg0KIyMgTOG6rXAgYuG6o25nIHThuqduIHPhu5EgDQoNCiogVOG6p24gc+G7kSBwaMOibiB0w61jaCB24buBIGdp4bubaSB0w61uaA0KDQpgYGB7cn0NCnRhYmxlKG52MyRTZXgpDQpgYGANCg0KR2nhu5tpIHTDrW5oIG5hbSwgbuG7ryB2w6AgY+G6oyBoYWkgZ2nhu5tpIHTDrW5oIMSR4buBdSDEkcaw4bujYyBk4buxIMSRb8OhbiA5NDUgbOG6p24uDQoNCiogUsO6dCB0csOtY2ggZOG7ryBsaeG7h3UgDQoNCmBgYHtyfQ0KbnYzLmEgPC0gZmlsdGVyKG52MyxSYWNlID09ICdBc2lhbicgJiBPcmlnaW4gPT0gJ0hpc3BhbmljJykgDQpudjMuYQ0KYGBgDQoNCkTDuW5nIGzhu4duaCBmaWx0ZXIgxJHhu4MgY2jhu41uIHJhIGPDoWMgcXVhbiBzw6F0IHRyb25nIGJp4bq/biBSYWNlIGPDsyBnacOhIHRy4buLIGzDoCAnQXNpYW4nIHbDoCBjw6FjIGdpw6EgdHLhu4sgbMOgICdIaXNwYW5pYycgdHJvbmcgYmnhur9uIE9yaWdpbi4NCg0KKiBM4bqtcCBiaeG7g3UgxJHhu5MgbmjDoW5oIHbDoCBsw6ENCg0KYGBge3J9DQpzdGVtKG52My5hJEFnZS42MCxzY2FsZSA9IC41KQ0KYGBgDQoNCkzhu4duaCBz4bq9IMSRxrDhu6NjIHBow6JuIHTDrWNoIGThu7FhIHbDoG8gxJFp4buBdSBraeG7h24gZOG6pXUgdGjhuq1wIHBow6JuIGzDoCAzIGNo4buvIHPhu5Eg4bufIGLDqm4gcGjhuqNpLiBUxrDGoW5nIOG7qW5nIHbhu5tpIG5ow6FuaCBsw6AgcGjhuqduIHPhu5EgaMOgbmcgbmdow6xuIHbDoCBsw6EgbMOgIHBo4bqnbiBz4buRIGjDoG5nIHRyxINtLg0KDQpOaMOhbmggbMOgIGfhu5NtIGPDoWMgc+G7kSBiw6puIHRyw6FpIGThuqV1IOKAmHzigJkgdsOgIGLDqm4gcGjhuqNpIGzDoCBsw6EuIEfhu5NtIDEwIG5ow6FuaCBsw6AgY8OhYyBuaMOhbmggY8OhYyBz4buRIGjDoG5nIDEgbmdow6xuLCAyIG5naMOsbizigKYgxJHhur9uIDEwIG5naMOsbi4NCg0K4bueIGjDoG5nIDEgbmdow6xuIHRhIHRo4bqleSBjw7MgMiBz4buRLCB0xrDGoW5nIOG7qW5nIGPDsyAyIHPhu5EgdGh14buZYyBow6BuZyAxIG5naMOsbi4gQ8OhYyBjb24gc+G7kSBsw6AgMTkwMCB2w6AgMTkwMCAoY8OhYyBz4buRIMSRw6MgxJHGsOG7o2MgbMOgbSB0csOybiDEkeG6v24gaMOgbmcgxJHGoW4gduG7iykNCg0KVMawxqFuZyB04buxIOG7nyBow6BuZyA2LCBjw7MgNiBz4buRIHRodeG7mWMgbmjDoW5oIDYgbmdow6xuLCBsw6AgY8OhYyBz4buRIDYyMDAsNjcwMCw2ODAwLDY4MDAsNjgwMCB2w6AgNjkwMC4NCg0KIyMgVMOtbmggdG/DoW4gY8OhYyDEkeG6t2MgdHLGsG5nIMSRbyBsxrDhu51uZyDhu58gxJHhu5kgdHXhu5VpIDEwMCDhu58gQXNpYW4gcXVhIGPDoWMgbsSDbSB0aHXhu5ljIGdp4bubaSB0w61uaCBu4buvDQoNCiogUsO6dCB0csOtY2ggZOG7ryBsaeG7h3UgDQoNCmBgYHtyfQ0KbnYzLmIgPC0gZmlsdGVyKG52My5hLFNleCAlaW4lIGMoJ0ZlbWFsZScpKQ0KbnYzLmINCmBgYA0KDQpSw7p0IHRyw61jaCBk4buvIGxp4buHdSDEkeG7gyBs4bqleSByYSBk4buvIGxp4buHdSBjaOG7iSBjw7MgZ2nhu5tpIHTDrW5oIG7hu68uDQoNCiogTcO0IHThuqMgZ2nDoSB0cuG7iyBuaOG7jyBuaOG6pXQNCg0KYGBge3J9DQptaW4xIDwtIG52My5iICU+JSBncm91cF9ieShTZXgpICU+JSBzdW1tYXJpc2UobWluID0gbWluKEFnZS4xMDApLCBuID0gbigpKQ0KbWluMQ0KYGBgDQoNClRyb25nIDQ1IG7Eg20gZOG7sSDEkW/DoW4sIGTDom4gc+G7kSBuZ8aw4budaSBBc2lhbiB0aHXhu5ljIGdp4bubaSB0w61uaCBu4buvIMSRxrDhu6NjIGThu7EgxJFvw6FuIHRo4bqlcCBuaOG6pXQgdHJvbmcgxJHhu5kgdHXhu5VpIDEwMCBsw6AgMjcgbmfGsOG7nWkuDQoNCiogTcO0IHThuqMgxJFp4buDbSBwaMOibiB24buLIHRo4bupIG5o4bqldA0KDQpgYGB7cn0NClF1YW50aWxlMSA8LSBudjMuYiAlPiUgZ3JvdXBfYnkoU2V4KSAlPiUgc3VtbWFyaXNlKHF1YW50aWxlXzFzdCA9IHF1YW50aWxlKEFnZS4xMDAsIHByb2JzID0gYyguMjUpKSwgbiA9IG4oKSkNClF1YW50aWxlMQ0KYGBgDQoNClThuqFpIMSRaeG7g20gcGjDom4gduG7iyB0aOG7qSBuaOG6pXQgdGjhu4MgaGnhu4duIGPDsyAyNSUgdGh14buZYyDEkeG7mSB0deG7lWkgMTAwIGPDsyDDrXQgaMahbiBob+G6t2MgYuG6sW5nIDQyIG5nxrDhu51pLiBIb+G6t2MgNzUlIOG7nyB0deG7lWkgMTAwIGPDsyBuaGnhu4F1IGjGoW4gNDIgbmfGsOG7nWkuDQoNCiogTcO0IHThuqMgxJFp4buDbSBwaMOibiB24buLIHRo4bupIDIgLSBUcnVuZyB24buLDQoNCmBgYHtyfQ0KUXVhbnRpbGUyIDwtIG52My5iICU+JSBncm91cF9ieShTZXgpICU+JSByZWZyYW1lKHF1YW50aWxlXzJuZCA9IHF1YW50aWxlKEFnZS4xMDAsIHByb2JzID0gYyguNSkpLCBuID0gbigpKQ0KUXVhbnRpbGUyDQpgYGANCg0KVOG6oWkgxJFp4buDbSBwaMOibiB24buLIHRo4bupIGhhaSB0aOG7gyBoaeG7h24gbeG7mXQgbuG7rWEgZ2nDoSB0cuG7iyBuaOG7jyBoxqFuIGhv4bq3YyBi4bqxbmcgODUgdsOgIG3hu5l0IG7hu61hIGdpw6EgdHLhu4sgbOG7m24gaMahbiBob+G6t2MgYuG6sW5nIDg1LiANCg0KKiBNw7QgdOG6oyDEkWnhu4NtIHBow6JuIHbhu4sgdGjhu6kgMw0KDQpgYGB7cn0NClF1YW50aWxlMyA8LSBudjMuYiAlPiUgZ3JvdXBfYnkoU2V4KSAlPiUgcmVmcmFtZShxdWFudGlsZV8zcmQgPSBxdWFudGlsZShBZ2UuMTAwLCBwcm9icyA9IGMoLjc1KSksIG4gPSBuKCkpDQpRdWFudGlsZTMNCmBgYA0KDQpU4bqhaSDEkWnhu4NtIHBow6JuIHbhu4sgdGjhu6kgYmEgdGjhu4MgaGnhu4duIGPDsyA3NSUgdGh14buZYyDEkeG7mSB0deG7lWkgMTAwIGPDsyDDrXQgaMahbiBob+G6t2MgYuG6sW5nIDIxMSBuZ8aw4budaS4gSG/hurdjIDI1JSDhu58gdHXhu5VpIDEwMCBjw7Mgbmhp4buBdSBoxqFuIDIxMSBuZ8aw4budaS4NCg0KKiBNw7QgdOG6oyBnacOhIHRy4buLIHRydW5nIGLDrG5oDQoNCmBgYHtyfQ0KbWVhbjEgPC0gbnYzLmIgJT4lIGdyb3VwX2J5KFNleCkgJT4lIHN1bW1hcmlzZShtZWFuID0gbWVhbihBZ2UuMTAwKSwgbj0gbigpKQ0KbWVhbjENCmBgYA0KDQpUcnVuZyBiw6xuaCB0cm9uZyA0NSBuxINtLCBkw6JuIHPhu5Eg4bufIMSR4buZIHR14buVaSAxMDAgY+G7p2EgZ2nhu5tpIG7hu68gbMOgIDE0MyBuZ8aw4budaS4NCg0KKiBNw7QgdOG6oyBnacOhIHRy4buLIGzhu5tuIG5o4bqldA0KDQpgYGB7cn0NCm1heDEgPC0gbnYzLmIgJT4lIGdyb3VwX2J5KFNleCkgJT4lIHN1bW1hcmlzZShtYXggPSBtYXgoQWdlLjEwMCksIG4gPSBuKCkpDQptYXgxDQpgYGANCg0KVHJvbmcgNDUgbsSDbSBk4buxIMSRb8OhbiwgZMOibiBz4buRIMSRxrDhu6NjIGThu7EgxJFvw6FuIGNhbyBuaOG6pXQgbuG6sW0gdHJvbmcgdHXhu5VpIDEwMCDhu58gZ2nhu5tpIG7hu68gbMOgIDQ3NyBuZ8aw4budaS4=