1 .Nhiệm vụ 3.1

Bộ dữ liệu population-and-demography là file csv, nên ta đọc file csv

1.1 .Đọc dữ liệu từ file CSV

library(csv)
vy1 <- read.csv("/Users/xuyenchi/Downloads/R Code/population-and-demography.csv") #ta tạo 1 bản sao từ file dữ liệu population-and-demography.csv bằng cách gán vào object vy1

1.2 . Tóm Tắt

Nhiệm vụ 3.1 thao tác trên datasets “population-and-demography.csv” là datasets thống kê dân số và nhân khẩu học của các quốc gia trên thế giới giai đoạn 1925-2021.

Là 1 data frame

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

Datasets có 18288 quan sát và 24 biến như sau:

  • Country : Tên Quốc Gia

  • Year: Năm lấy số liệu

  • Population: Dân số

  • Population of children under the age of 1: Dân số trẻ em dưới 1 tuổi

  • Population of children under the age of 5: Dân số trẻ em dưới 5 tuổi

  • Population of children under the age of 15: Dân số trẻ em dưới 15 tuổi

  • Population under the age of 25: Dân số dưới 25 tuổi

  • Population aged 15 to 64 years: Dân số từ 15 đến 64 tuổi

  • Population older than 15 years: Dân số lớn hơn 15 tuổi

  • Population older than 18 years: Dân số lớn hơn 18 tuổi

  • Population at age 1: Dân số 1 tuổi

  • Population aged 1 to 4 years: Dân số từ 1 đến 4 tuổi

  • Population aged 5 to 9 years: Dân số từ 5 đến 9 tuổi

  • Population aged 10 to 14 years: Dân số từ 10 đến 14 tuổi

  • Population aged 15 to 19 years: Dân số từ 15 đến 19 tuổi

  • Population aged 20 to 29 years: Dân số từ 20 đến 29 tuổi

  • Population aged 30 to 39 years: Dân số từ 30 đến 39 tuổi

  • Population aged 40 to 49 years: Dân số từ 40 đến 49 tuổi

  • Population aged 50 to 59 years: Dân số từ 50 đến 59 tuổi

  • Population aged 60 to 69 years: Dân số từ 60 đến 69 tuổi

  • Population aged 70 to 79 years: Dân số từ 70 đến 79 tuổi

  • Population aged 80 to 89 years: Dân số từ 80 đến 89 tuổi

  • Population aged 90 to 99 years: Dân số từ 90 đến 99 tuổi

  • Population older than 100 years: Dân số lớn hơn 100 tuổi

#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(vy1)
Data summary
Name vy1
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 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 ▇▁▁▁▁

Thực hiện thao tác tao được kết quả như sau

Mô tả

  • n_missing: số ô dữ liệu trống (0 có dữ liệu trống)
  • complete_rate: tỷ lệ ô có dữ liệu ()
  • mean: trung bình
  • sd: độ lệch chuẩn
  • p0: giá trị min
  • p25: phân vị thứ nhất
  • p50: phân vị thứ hai(trung vị)
  • p75: phân vị thứ ba
  • p100: giá trị max
  • hist: biểu đồ Histogram

Từ bộ dữ liệu vy1 ta chọn ra 5 quan sát “VietNam”, “Singapore”, ” Thailand”, ” China “,” Brazil”, biến (Population) và 5 biến độ tuổi (Population at age 1 ,Population aged 1 to 4 years , Population aged 5 to 9 years, Population aged 10 to 14 years, Population aged 15 to 19 years)

1.3 .Giải thích cho dữ liệu đã chọn

#Trước tiên ta phải load gói "dplyr"
library(dplyr)

Từ dữ liệu của vy1, ta lọc ra 5 quan sát để phân tích bao gồm “VietNam”, “Singapore”, ” Thailand “,” China “,” Brazil ” Ta thực hiện thao tác gán 5 quan sát đã lọc trên vào object mới là vy2, ta được object là vy2 với 360 quan sát, 24 biến

## 'data.frame':    360 obs. of  24 variables:
##  $ Country                                   : chr  "Brazil" "Brazil" "Brazil" "Brazil" ...
##  $ Year                                      : int  1950 1951 1952 1953 1954 1955 1956 1957 1958 1959 ...
##  $ Population                                : num  53955360 55591060 57283340 59025680 60827596 ...
##  $ Population.of.children.under.the.age.of.1 : num  2202427 2262474 2330122 2397518 2466091 ...
##  $ Population.of.children.under.the.age.of.5 : int  9271135 9703721 10133673 10535649 10889066 11218493 11557159 11900893 12249583 12601124 ...
##  $ Population.of.children.under.the.age.of.15: int  22948400 23721236 24524590 25351908 26208452 27109490 28053348 29039014 30061448 31125664 ...
##  $ Population.under.the.age.of.25            : num  33842700 34814736 35821396 36855850 37933924 ...
##  $ Population.aged.15.to.64.years            : num  29715820 30529458 31364428 32223218 33109830 ...
##  $ Population.older.than.15.years            : num  31006680 31869536 32758456 33673476 34618850 ...
##  $ Population.older.than.18.years            : num  27505950 28319134 29136452 29959340 30800602 ...
##  $ Population.at.age.1                       : num  1968467 2061117 2120678 2187130 2253537 ...
##  $ Population.aged.1.to.4.years              : num  7068708 7441247 7803551 8138131 8422975 ...
##  $ Population.aged.5.to.9.years              : int  7282716 7453709 7657140 7920233 8266990 8675847 9104762 9533124 9932900 10287535 ...
##  $ Population.aged.10.to.14.years            : int  6394549 6563805 6733777 6896027 7052397 7215150 7391428 7604997 7878966 8237004 ...
##  $ Population.aged.15.to.19.years            : int  5744748 5827411 5925576 6041745 6183604 6346724 6518866 6695025 6865973 7033547 ...
##  $ Population.aged.20.to.29.years            : int  9416008 9688214 9945827 10183273 10399165 10599787 10799921 11005270 11218459 11447523 ...
##  $ Population.aged.30.to.39.years            : int  6467732 6632691 6814222 7015250 7234115 7468277 7718088 7984792 8262649 8543295 ...
##  $ Population.aged.40.to.49.years            : int  4484450 4633755 4785094 4939106 5095145 5250527 5402317 5550635 5697891 5846370 ...
##  $ Population.aged.50.to.59.years            : int  2735368 2846229 2960496 3078266 3199684 3321947 3442092 3560971 3683017 3811109 ...
##  $ Population.aged.60.to.69.years            : int  1420468 1487586 1555531 1623743 1690789 1756694 1824637 1898019 1976591 2059246 ...
##  $ Population.aged.70.to.79.years            : int  550169 569750 590962 613876 639875 671034 707399 746249 785794 826090 ...
##  $ Population.aged.80.to.89.years            : int  166642 163218 161024 159811 159436 160289 162668 166007 169892 174484 ...
##  $ Population.aged.90.to.99.years            : int  21095 20681 19724 18405 17036 15969 15252 14610 13916 13207 ...
##  $ Population.older.than.100.years           : num  280 289 293 295 296 298 299 300 297 291 ...

Từ bộ dữ liệu vy1 ta chọn ra 5 quan sát “VietNam”, “Singapore”, ” Thailand”, ” China “,” Brazil”, biến (Population) và 5 biến độ tuổi (Population at age 1 ,Population aged 1 to 4 years , Population aged 5 to 9 years, Population aged 10 to 14 years, Population aged 15 to 19 years) và gán vào object vy3 với 360 quan sát và 8 biến

 vy3 <- vy2 %>% select(Country,Year,Population,Population.at.age.1, Population.aged.1.to.4.years , Population.aged.5.to.9.years  , Population.aged.10.to.14.years , Population.aged.15.to.19.years )

str(vy3)
## 'data.frame':    360 obs. of  8 variables:
##  $ Country                       : chr  "Brazil" "Brazil" "Brazil" "Brazil" ...
##  $ Year                          : int  1950 1951 1952 1953 1954 1955 1956 1957 1958 1959 ...
##  $ Population                    : num  53955360 55591060 57283340 59025680 60827596 ...
##  $ Population.at.age.1           : num  1968467 2061117 2120678 2187130 2253537 ...
##  $ Population.aged.1.to.4.years  : num  7068708 7441247 7803551 8138131 8422975 ...
##  $ Population.aged.5.to.9.years  : int  7282716 7453709 7657140 7920233 8266990 8675847 9104762 9533124 9932900 10287535 ...
##  $ Population.aged.10.to.14.years: int  6394549 6563805 6733777 6896027 7052397 7215150 7391428 7604997 7878966 8237004 ...
##  $ Population.aged.15.to.19.years: int  5744748 5827411 5925576 6041745 6183604 6346724 6518866 6695025 6865973 7033547 ...

Ta thực hiện đổi tên để thao tác trở nên dễ dàng hơn:

  • Co: Country
  • Y: Year
  • Po: Population
  • Po1: Population at age 1
  • Po4: Population aged 1 to 4 years
  • Po9: Population aged 5 to 9 years
  • Po14: Population aged 10 to 14 years
  • Po19: Population aged 15 to 19 years

Thực hiện thao tác đổi tên, ta được object vy3 với tên được đổi ngắn gọn hơn như bảng sau

names(vy3) <- c ( "Co","Y","Po","Po1","Po4","Po9","Po14","Po19")

str(vy3)
## 'data.frame':    360 obs. of  8 variables:
##  $ Co  : chr  "Brazil" "Brazil" "Brazil" "Brazil" ...
##  $ Y   : int  1950 1951 1952 1953 1954 1955 1956 1957 1958 1959 ...
##  $ Po  : num  53955360 55591060 57283340 59025680 60827596 ...
##  $ Po1 : num  1968467 2061117 2120678 2187130 2253537 ...
##  $ Po4 : num  7068708 7441247 7803551 8138131 8422975 ...
##  $ Po9 : int  7282716 7453709 7657140 7920233 8266990 8675847 9104762 9533124 9932900 10287535 ...
##  $ Po14: int  6394549 6563805 6733777 6896027 7052397 7215150 7391428 7604997 7878966 8237004 ...
##  $ Po19: int  5744748 5827411 5925576 6041745 6183604 6346724 6518866 6695025 6865973 7033547 ...

Ta thực hiện xóa bỏ biến Y giữ lại 7 biến cần lấy dữ liệu để phân tích và gán vào object vy4 Ta được object mới là vy4 với 360 quan sát và 7 biến

vy4 <- select(vy3,-Y)

str(vy4)
## 'data.frame':    360 obs. of  7 variables:
##  $ Co  : chr  "Brazil" "Brazil" "Brazil" "Brazil" ...
##  $ Po  : num  53955360 55591060 57283340 59025680 60827596 ...
##  $ Po1 : num  1968467 2061117 2120678 2187130 2253537 ...
##  $ Po4 : num  7068708 7441247 7803551 8138131 8422975 ...
##  $ Po9 : int  7282716 7453709 7657140 7920233 8266990 8675847 9104762 9533124 9932900 10287535 ...
##  $ Po14: int  6394549 6563805 6733777 6896027 7052397 7215150 7391428 7604997 7878966 8237004 ...
##  $ Po19: int  5744748 5827411 5925576 6041745 6183604 6346724 6518866 6695025 6865973 7033547 ...

1.4 .Mã hóa dữ liệu

Để mã hóa dữ liệu ta gọi gói tidyverse ra

library(tidyverse)

Thực hiện thao tác nếu trẻ em 1 tuổi lớn hơn 19% dân số thì tỉ lệ trẻ em dưới 1 tuổi cao, ngược lại là thấp Ta gán kết quả cho ted1

vy4$ted1 <- ifelse(vy4$Po1 > 0.19*vy4$Po, 'trẻ em dưới 1t cao', 'trẻ em dưới 1t thấp')
str(vy4$ted1)
##  chr [1:360] "trẻ em dưới 1t thấp" "trẻ em dưới 1t thấp" ...

Thực hiện thao tác nếu như dân số của nước đó lớn hơn 1.000.000.000 dân thì được gọi là ” đông dân ” ngược lại nếu dân số nhỏ hơn “1.000.000.000” thì được gọi là ” thưa dân Gán kết quả cho dt

vy4$dt <- ifelse(vy4$Po>1000000000, 'đông dân', 'thưa dân' )
str(vy4$dt)
##  chr [1:360] "thưa dân" "thưa dân" "thưa dân" "thưa dân" "thưa dân" ...

Gán kết quả mới cho dt1 sử dụng hàm case_when hỗ trợ mã hóa dữ liệu nhiều hơn 2 nếu như dân số của các nước nhỏ hơn 100000 dân thì được gọi là “thưa” , từ 100000 dân đến 1000000000 dân được gọi là “vừa”, trên 1000000000 gọi là “đông”

vy4$dt1 <- case_when(vy4$Po < 100000 ~ 'thưa', vy4$Po >= 100000 & vy4$Po < 1000000000 ~ 'vừa ', vy4$Po > 1000000000 ~ 'đông' )
str(vy4$dt1)
##  chr [1:360] "vừa " "vừa " "vừa " "vừa " "vừa " "vừa " "vừa " "vừa " "vừa " ...

Sử dụng hàm cut dùng để chia dữ liệu của biến “Po14” từ “vy4” thành 3 tổ theo từng khoảng giá trị sau: từ 0 đến 1.000.000 là “kh1”, từ 1.000.000 đến 10.000.000 là “kh2”, từ 10.000.000 đến 100.000.000 là “kh3”.Gán kết quả cho cut1

vy4$cut1<- cut( vy4$Po14, breaks = c(0, 1000000,10000000, 100000000), labels= c ('kh1' , 'kh 2','kh3'))

str(vy4$cut1)
##  Factor w/ 3 levels "kh1","kh 2","kh3": 2 2 2 2 2 2 2 2 2 2 ...

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

Thực hiện gán bảng tần số tần số - số lần xuất hiện của dữ liệu trong data ta sử dụng câu lệnh table . Dưới đây là kiểu tra tần số của biến “Po1”

ts <- table(vy4$Po1)
str(ts)
##  'table' int [1:359(1d)] 1 1 1 1 1 1 1 1 1 1 ...
##  - attr(*, "dimnames")=List of 1
##   ..$ : chr [1:359] "33721" "37600" "37680" "38873" ...
  • Lập bảng tần số cho 2 biến là “Po4” và “Co” gán vào ts21
vy4$ts2 <- cut(vy4$Po4,3, labels = c('a','b','c'))
ts21 <- table(vy4$Co,vy4$ts2)
str(ts21)
##  'table' int [1:5, 1:3] 72 0 72 72 72 0 30 0 0 0 ...
##  - attr(*, "dimnames")=List of 2
##   ..$ : chr [1:5] "Brazil" "China" "Singapore" "Thailand" ...
##   ..$ : chr [1:3] "a" "b" "c"

Lập biểu đồ nhánh và lá cho biến Po19 thuộc object vy4

Giải thích kết quả: trọng số tập trung ở 0 và không thể hiện ở 2,3,4

stem(vy4$Po19)
## 
##   The decimal point is 7 digit(s) to the right of the |
## 
##    0 | 00000000000000000000000000000000000000000000000000000000000000000000+154
##    1 | 000111222333444444445555666666777777777777777888888888
##    2 | 
##    3 | 
##    4 | 
##    5 | 2333333344457
##    6 | 048
##    7 | 389
##    8 | 00011233357788
##    9 | 02344667789
##   10 | 00345789
##   11 | 003467
##   12 | 00134577799
##   13 | 122

1.6 Tính toán các đặc trưng đo lường

Lệnh Summary- một bản tóm tắt các giá trị đặc trưng đ 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

Thực hiện lệnh summary trên vy4 về biến Po14

summary(vy4$Po1)
##     Min.  1st Qu.   Median     Mean  3rd Qu.     Max. 
##    33721   817992  1444494  5237800  3479732 28592234

Giải thích kết quả : phân tích biến “Po1” từ dữ liệu của data “vy4” ta được

  • dân số nhỏ nhất của 1 tuổi :33721
  • phân vị thứ nhất : 17992 (25% số liệu dân số của độ tuối dưới 1 nhỏ hơn 17992 người , 75% còn lại lớn hơn 17992 người)
  • trung vị : 1444494 (50% số liệu dân số có độ tuổi dưới 1 nhỏ hơn 1444494 người, 50% còn lại lớn hơn 1444494 người )
  • trung bình : 5237800
  • phân vị thứ 3 : 3479732 ( 75% số liệu dân số có độ tuổi dưới 1 nhỏ hơn 3479732 người , 25% còn lại lớn hơn 3479732 người)
  • dân số lớn nhất của 1 tuổi là 28592234
sum(vy4$Po14)
## [1] 8626453280

Giải thích kết quả: Câu lệnh sum cho biết tổng dân số của biến dân số từ 10-14 tuổi từ dữ liệu “vy4” là 8626453280

mean(vy4$Po14,na.rm = T)
## [1] 23962370

Giải thích kết quả: Câu lệnh mean cho biết giá trị trung bình số dân của độ tuổi từ 10-14 tuổi là 23962370

length(vy4$Po14)
## [1] 360

Giải thích kết quả: câu lệnh lenghth cho biết độ dài biến Po14 là 360

var(vy4$Po14)
## [1] 1.381668e+15

Giải thích kết quả: câu lệnh var cho biết độ lệch hay còn gọi là phương sai của biến Po14 là 1.381668e+15

sd(vy4$Po14)
## [1] 37170792

Giải thích kết quả: câu lệnh sd cho biết độ lệch chuẩn của biến **Po14* là 37170792

median(vy4$Po14)
## [1] 6648791

Giải thích kết quả: Câu lệnh median cho biết trung vị dân số của 10-14 tuổi là 6648791 , nghĩa là 50% số liệu dân số của độ tuổi dưới 15 là nhỏ hơn 6648791 và 50% còn lại là lớn hơn 6648791

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

vy6 <- vy4 %>% group_by(Po1) %>% summarise(mean_of_Po14 = mean(Po14))
datatable(vy6)

Giải thích kết quả: gán kết quả cho vy6 về giá trị trung bình của dân số từ 10-14 tuổi dựa vào biến dân số 1 tuổi

vy7 <- vy3 %>% group_by(Y) %>% summarise(n = n(),mean_of_Po14 = mean(Po14))
datatable(vy7)

Giải thích kết quả: giá trị trung bình của tổng dân số từ 10-14 tuổi (biến Po14) theo năm (biến Y) trong đó n=n() cho biết số lần năm đó xuất hiện ( hay chính là tổng số quốc gia, khu vực )

vy8 <- vy3 %>% group_by(Y) %>% summarise(med_of_Po14= median(Po14))
datatable(vy8)                                                      

Giải thích kết quả:vy8 là kết quả của trung vị của tổng dân số từ 10-14 tuổi (biến Po14) theo năm (biến Y)

vy9 <- vy4 %>% group_by(Co) %>% summarise(mean_of_ = mean(Po))
vy9
Co mean_of_
Brazil 136542332
China 1035531645
Singapore 3141772
Thailand 48988953
Vietnam 60763252

Giải thích kết quả: vy9 là kết quả giá trị trung bình của tổng dân số được tính theo tên quốc gia

vy10 <- vy3 %>% group_by(Y,Co) %>% summarise(n = n(),mean_of_Po = mean(Po),.groups = 'drop')
datatable(vy10)

Giải thích kết quả : vy10 là giá trị trung bình của tổng dân số theo từng năm của từng quốc gia

2 NHIỆM VỤ 3.2


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

Nhiệm vụ 3.2 thực hiện thao tác trên datasets Financial Sample Excel, là 1 dataset thống kê tình hình tài chính nổi bật của một số thị trường trên thế giới giai đoạn 2013-2014.

2.2 . Mô tả cơ bản


Là 1 dataframe Không có dữ liệu trống Datasets có 1006 quan sát và 16 biến như sau:

  • Segment: thị trường
  • Country: quốc gia
  • Product: sản phẩm tài chính
  • Discount Band: đánh giá mức độ rủi ro
  • Units Sold: số lượng sản phẩm hoặc dịch vụ đã bán
  • Manufacturing Price: chi phí sản xuất của 1 sản phẩm dịch vụ -
  • Sale Price: giá bán
  • Gross Sales: tổng doanh thu
  • Discounts: chiết khấu
  • Sales: doanh số bán hàng
  • COGS: số tiền chi trả sản xuất hoặc mua hàng hóa dịch vụ ảnh hưởng trực tiếp đến hoạt động tổ chức ( Cost of goods sold)
  • Profit: lợi nhuận
  • Date: ngày giá trị
  • Month Number: số thứ tự tháng trong năm
  • Month Name: tên tháng trong năm
  • Year: năm thu thập số liệu

Đọc bộ dữ liệu

library(openxlsx)
 vyvy <- read.xlsx("/Users/xuyenchi/Downloads/R Code/Financial Sample.xlsx")
str(vyvy)
## 'data.frame':    1006 obs. of  16 variables:
##  $ Segment            : chr  "Government" "Government" "Midmarket" "Midmarket" ...
##  $ Country            : chr  "Canada" "Germany" "France" "Germany" ...
##  $ Product            : chr  "Carretera" "Carretera" "Carretera" "Carretera" ...
##  $ Discount.Band      : chr  "None" "None" "None" "None" ...
##  $ Units.Sold         : num  1618 1321 2178 888 2470 ...
##  $ Manufacturing.Price: num  3 3 3 3 3 3 5 5 5 5 ...
##  $ Sale.Price         : num  20 20 15 15 15 350 15 12 20 12 ...
##  $ Gross.Sales        : num  32370 26420 32670 13320 37050 ...
##  $ Discounts          : num  0 0 0 0 0 0 0 0 0 0 ...
##  $ Sales              : num  32370 26420 32670 13320 37050 ...
##  $ COGS               : num  16185 13210 21780 8880 24700 ...
##  $ Profit             : num  16185 13210 10890 4440 12350 ...
##  $ Date               : num  41640 41640 41791 41791 41791 ...
##  $ Month.Number       : num  1 1 6 6 6 12 3 6 6 6 ...
##  $ Month.Name         : chr  "January" "January" "June" "June" ...
##  $ Year               : chr  "2014" "2014" "2014" "2014" ...
is.data.frame(vyvy)
## [1] TRUE
library(skimr)
skim(vyvy)
Data summary
Name vyvy
Number of rows 1006
Number of columns 16
_______________________
Column type frequency:
character 6
numeric 10
________________________
Group variables None

Variable type: character

skim_variable n_missing complete_rate min max empty n_unique whitespace
Segment 0 1 9 16 0 5 0
Country 0 1 6 24 0 5 0
Product 0 1 3 9 0 6 0
Discount.Band 0 1 3 6 0 4 0
Month.Name 0 1 3 9 0 12 0
Year 0 1 4 4 0 2 0

Variable type: numeric

skim_variable n_missing complete_rate mean sd p0 p25 p50 p75 p100 hist
Units.Sold 0 1 1639.26 885.62 200.00 905.00 1566.00 2339.50 4492.5 ▇▇▇▂▁
Manufacturing.Price 0 1 101.69 110.35 3.00 5.00 10.00 250.00 260.0 ▇▁▂▁▅
Sale.Price 0 1 116.81 136.77 7.00 12.00 20.00 300.00 350.0 ▇▂▁▁▃
Gross.Sales 0 1 175936.31 245508.65 1799.00 18176.25 38592.50 269500.00 1207500.0 ▇▂▁▁▁
Discounts 0 1 14832.22 24110.38 0.00 1132.80 3559.05 19950.00 149677.5 ▇▁▁▁▁
Sales 0 1 161104.09 225860.91 1655.08 16748.55 35540.20 243346.88 1159200.0 ▇▂▁▁▁
COGS 0 1 139965.38 198115.49 918.00 8083.50 24490.00 236465.00 950625.0 ▇▂▁▁▁
Profit 0 1 21138.70 38428.09 -40617.50 2750.00 9242.60 21272.24 262200.0 ▇▂▁▁▁
Date 0 1 41756.63 149.55 41518.00 41640.00 41760.00 41913.00 41974.0 ▆▅▅▂▇
Month.Number 0 1 7.84 3.44 1.00 5.00 9.00 10.00 12.0 ▃▂▂▂▇
  • Thông tin mô tả bộ dữ kiệu có các cột sau và ý nghĩa các cột là:

skim_variable: tên biến

n_missing: số dữ liệu trống

complete_rate: tỉ lệ biến có dữ liệu

mean: giá trị trung bình

sd: độ lệch chuẩn

p0: giá trị nhỏ nhất

p25: phân vị thứ nhất

p50: trung vị

p75: phân vị thứ ba

p100: giá trị lớn nhất

his: biểu đồ histogram

**Để dễ dàng phân tích dữ liệu ta chỉ lấy 1 phần nhỏ dữ liệu từ i để phân tích

vyvy1 <- vyvy[1:200,1:5]
datatable(vyvy1)

2.3 Giải thích cho dữ liệu đã chọn

Ta đổi tên để dễ thao tác - S :*Segment: thị trường - Cou :Country: quốc gia - Pro: Product: sản phẩm tài chính - Dis: Discount Band: đánh giá mức độ rủi ro - Uni: Units Sold:** số lượng sản phẩm hoặc dịch vụ đã bán

names(vyvy1) <- c('S','Cou','Pro','Dis','Uni')
str(vyvy1)
## 'data.frame':    200 obs. of  5 variables:
##  $ S  : chr  "Government" "Government" "Midmarket" "Midmarket" ...
##  $ Cou: chr  "Canada" "Germany" "France" "Germany" ...
##  $ Pro: chr  "Carretera" "Carretera" "Carretera" "Carretera" ...
##  $ Dis: chr  "None" "None" "None" "None" ...
##  $ Uni: num  1618 1321 2178 888 2470 ...

2.4 Mã hóa dữ liệu

  • Gọi packages Tidyverse để sử dụng các lệnh tiếp theo
library(tidyverse)
  • Gán kết quả mới cho gt , nếu giá trị lớn hơn 1000 thì được mã hóa là “cao” và ngược lại nếu nhỏ hơn 1000 là ” thấp”
vyvy1$gt <- ifelse(vyvy1$Uni > 1000, 'cao', 'thấp')
  • Gán kết quả mới cho “sl” sử dụng hàm case_when hỗ trợ mã hóa dữ liệu nhiều hơn 2 nếu như giá trị nhỏ hơn 100 thì được gọi là “ít” , từ 100 dân đến 1000 được gọi là “vừa”, trên 1000 gọi là “nhiều”

  • Gán kết quả mới cho “sl0” sử dụng hàm cut dùng để chia dữ liệu của biến “V” từ “i1” thành 3 tổ theo từng khoảng giá trị sau: từ 0 đến 10 là “kho1”, từ 10 đến 50 là “kho2”, từ 50 đến 100 là “kho3”.

vyvy1$sl3 <- cut( vyvy1$Uni, breaks = c(0, 10,50,100), labels= c ('kho 1','kho 2','kho 3'))

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

  • Để biết tần số - số lần xuất hiện của dữ liệu trong data ta sử dụng câu lệnh table . Dưới đây là kiểu tra tần số của biến “V”
i2 <- table(vyvy1$Uni)
str(i2)
##  'table' int [1:152(1d)] 2 1 1 1 1 2 1 1 1 2 ...
##  - attr(*, "dimnames")=List of 1
##   ..$ : chr [1:152] "214" "218" "259" "263" ...
**Giải thích kết quả** : biến "Uni" của "vyvy1" được chia làm 3 nhóm (210,1.64e+03] 99 quan sát (1.64e+03,3.07e+03]93 quan sát  (3.07e+03,4.5e+03] 8 quan sát


- Lập biểu đồ nhánh và lá của biến "Uni"từ dữ liệu của data vyvy1 


```r
stem(vyvy1$Uni)
## 
##   The decimal point is 2 digit(s) to the right of the |
## 
##    2 | 112667779235567
##    4 | 99445
##    6 | 224666679993344577999
##    8 | 01138991122244679
##   10 | 11366688044444
##   12 | 1499002378
##   14 | 0015911113557777
##   16 | 246911334679
##   18 | 0022236670000222345555679
##   20 | 0111223379455555566688
##   22 | 168006
##   24 | 3777802238
##   26 | 77335
##   28 | 24455558812779
##   30 | 
##   32 | 
##   34 | 5
##   36 | 
##   38 | 565
##   40 | 
##   42 | 245
##   44 | 9

2.6 Tính toán các đặc trưng đo lường

mean(vyvy1$Uni,na.rm = T)
## [1] 1641.975

Giải thích kết quả: Câu lệnh mean cho biết giá trị trung bình của cột biến Uni là 1641.975

length(vyvy1$Uni)
## [1] 200

Giải thích kết quả: câu lệnh lenghth cho biết độ dài biến V là 200

var(vyvy1$Uni)
## [1] 793574.4

Giải thích kết quả: câu lệnh var cho biết độ lệch hay còn gọi là phương sai của biến Uni 793574.4

sd(vyvy1$Uni)
## [1] 890.8279

Giải thích kết quả: câu lệnh sd cho biết độ lệch chuẩn của biến Uni là 890.8279

median(vyvy1$Uni)
## [1] 1651

Giải thích kết quả: Câu lệnh median cho biết trung vị của Uni là 1651 , nghĩa là 50% số số quốc gia nhỏ hơn 1651 và 50% còn lại là lớn hơn 1651

LS0tCnRpdGxlOiAiTmhp4buHbSB24bulIDMiCmF1dGhvcjogImxudFZ5IgpkYXRlOiAiYHIgZm9ybWF0KFN5cy50aW1lKCksICclSDolTTolUywgJWQgLSAlbSAtICVZJylgIgpvdXRwdXQ6CiAgaHRtbF9kb2N1bWVudDoKICAgIGNvZGVfZG93bmxvYWQ6IHRydWUKICAgIGNvZGVfZm9sZGluZzogaGlkZQogICAgZGZfcHJpbnQ6IGthYmxlCiAgICBudW1iZXJfc2VjdGlvbnM6IHllcwogICAgdGhlbWU6ICJkZWZhdWx0IgogICAgdG9jX2RlcHRoOiAyCiAgICB0b2NfZmxvYXQ6IHRydWUKICAgIHRvYzogdHJ1ZQogIAotLS0KLS0tCgpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBUUlVFLCB3YXJuaW5nID0gRkFMU0UsIG1lc3NhZ2UgPSBGQUxTRSkKbGlicmFyeSh0aWR5dmVyc2UpCmxpYnJhcnkoRFQpCmxpYnJhcnkoZmxleHRhYmxlKQoKYGBgCiMgKiouTmhp4buHbSB24bulIDMuMSoqCgoKQuG7mSBk4buvIGxp4buHdSAqKnBvcHVsYXRpb24tYW5kLWRlbW9ncmFwaHkqKiBsw6AgZmlsZSBjc3YsIG7Dqm4gdGEgxJHhu41jIGZpbGUgY3N2CgojIyAqKi7EkOG7jWMgZOG7ryBsaeG7h3UgdOG7qyBmaWxlIENTVioqCmBgYHtyfQoKYGBgCgoKYGBge3J9CmxpYnJhcnkoY3N2KQp2eTEgPC0gcmVhZC5jc3YoIi9Vc2Vycy94dXllbmNoaS9Eb3dubG9hZHMvUiBDb2RlL3BvcHVsYXRpb24tYW5kLWRlbW9ncmFwaHkuY3N2IikgI3RhIHThuqFvIDEgYuG6o24gc2FvIHThu6sgZmlsZSBk4buvIGxp4buHdSBwb3B1bGF0aW9uLWFuZC1kZW1vZ3JhcGh5LmNzdiBi4bqxbmcgY8OhY2ggZ8OhbiB2w6BvIG9iamVjdCB2eTEKCgpgYGAKCgojIyAqKi4gVMOzbSBU4bqvdCoqCgpOaGnhu4dtIHbhu6UgMy4xIHRoYW8gdMOhYyB0csOqbiBkYXRhc2V0cyAiKipwb3B1bGF0aW9uLWFuZC1kZW1vZ3JhcGh5LmNzdioqIiBsw6AgZGF0YXNldHMgdGjhu5FuZyBrw6ogZMOibiBz4buRIHbDoCBuaMOibiBraOG6qXUgaOG7jWMgY+G7p2EgY8OhYyBxdeG7kWMgZ2lhIHRyw6puIHRo4bq/IGdp4bubaSBnaWFpIMSRb+G6oW4gMTkyNS0yMDIxLgoKCkzDoCAxIGRhdGEgZnJhbWUKCktow7RuZyBjw7MgZOG7ryBsaeG7h3UgdHLhu5FuZwoKRGF0YXNldHMgY8OzIDE4Mjg4IHF1YW4gc8OhdCB2w6AgMjQgYmnhur9uIG5oxrAgc2F1OgoKCgotIENvdW50cnkgOiBUw6puIFF14buRYyBHaWEKCi0gWWVhcjogTsSDbSBs4bqleSBz4buRIGxp4buHdSAKCi0gUG9wdWxhdGlvbjogRMOibiBz4buRCgotIFBvcHVsYXRpb24gb2YgY2hpbGRyZW4gdW5kZXIgdGhlIGFnZSBvZiAxOiBEw6JuIHPhu5EgdHLhursgZW0gZMaw4bubaSAxIHR14buVaQoKLSBQb3B1bGF0aW9uIG9mIGNoaWxkcmVuIHVuZGVyIHRoZSBhZ2Ugb2YgNTogRMOibiBz4buRIHRy4bq7IGVtIGTGsOG7m2kgNSB0deG7lWkKCi0gUG9wdWxhdGlvbiBvZiBjaGlsZHJlbiB1bmRlciB0aGUgYWdlIG9mIDE1OiBEw6JuIHPhu5EgdHLhursgZW0gZMaw4bubaSAxNSB0deG7lWkgCgotIFBvcHVsYXRpb24gdW5kZXIgdGhlIGFnZSBvZiAyNTogRMOibiBz4buRIGTGsOG7m2kgMjUgdHXhu5VpCQoKLSBQb3B1bGF0aW9uIGFnZWQgMTUgdG8gNjQgeWVhcnM6IETDom4gc+G7kSB04burIDE1IMSR4bq/biA2NCB0deG7lWkKCi0gUG9wdWxhdGlvbiBvbGRlciB0aGFuIDE1IHllYXJzOiBEw6JuIHPhu5EgbOG7m24gaMahbiAxNSB0deG7lWkgCQoKLSBQb3B1bGF0aW9uIG9sZGVyIHRoYW4gMTggeWVhcnM6IETDom4gc+G7kSBs4bubbiBoxqFuIDE4IHR14buVaSAKCi0gUG9wdWxhdGlvbiBhdCBhZ2UgMTogRMOibiBz4buRIDEgdHXhu5VpIAoKLSBQb3B1bGF0aW9uIGFnZWQgMSB0byA0IHllYXJzOiBEw6JuIHPhu5EgdOG7qyAxIMSR4bq/biA0IHR14buVaSAJCgotIFBvcHVsYXRpb24gYWdlZCA1IHRvIDkgeWVhcnM6IETDom4gc+G7kSB04burIDUgxJHhur9uIDkgdHXhu5VpCgotIFBvcHVsYXRpb24gYWdlZCAxMCB0byAxNCB5ZWFyczogRMOibiBz4buRIHThu6sgMTAgxJHhur9uIDE0IHR14buVaQoKLSBQb3B1bGF0aW9uIGFnZWQgMTUgdG8gMTkgeWVhcnM6IETDom4gc+G7kSB04burIDE1IMSR4bq/biAxOSB0deG7lWkgCQoKLSBQb3B1bGF0aW9uIGFnZWQgMjAgdG8gMjkgeWVhcnM6IETDom4gc+G7kSB04burIDIwIMSR4bq/biAyOSB0deG7lWkKCi0gUG9wdWxhdGlvbiBhZ2VkIDMwIHRvIDM5IHllYXJzOiBEw6JuIHPhu5EgdOG7qyAzMCDEkeG6v24gMzkgdHXhu5VpCQoKLSBQb3B1bGF0aW9uIGFnZWQgNDAgdG8gNDkgeWVhcnM6IETDom4gc+G7kSB04burIDQwIMSR4bq/biA0OSB0deG7lWkJCgotIFBvcHVsYXRpb24gYWdlZCA1MCB0byA1OSB5ZWFyczogRMOibiBz4buRIHThu6sgNTAgxJHhur9uIDU5IHR14buVaQoKLSBQb3B1bGF0aW9uIGFnZWQgNjAgdG8gNjkgeWVhcnM6IETDom4gc+G7kSB04burIDYwIMSR4bq/biA2OSB0deG7lWkKCi0gUG9wdWxhdGlvbiBhZ2VkIDcwIHRvIDc5IHllYXJzOiBEw6JuIHPhu5EgdOG7qyA3MCDEkeG6v24gNzkgdHXhu5VpCgotIFBvcHVsYXRpb24gYWdlZCA4MCB0byA4OSB5ZWFyczogRMOibiBz4buRIHThu6sgODAgxJHhur9uIDg5IHR14buVaQkKCi0gUG9wdWxhdGlvbiBhZ2VkIDkwIHRvIDk5IHllYXJzOiBEw6JuIHPhu5EgdOG7qyA5MCDEkeG6v24gOTkgdHXhu5VpCgotIFBvcHVsYXRpb24gb2xkZXIgdGhhbiAxMDAgeWVhcnM6IETDom4gc+G7kSBs4bubbiBoxqFuIDEwMCB0deG7lWkgCgoKCgpgYGB7cn0KI0PDoWMgdGjDtG5nIHRpbiDEkcaw4bujYyBiaeG6v3QgbmjGsCA6IHPhu5EgbOG7lyBo4buPbmcvIGLhu48gdHLhu5FuZyAobl9taXNzaW5nKSwgc+G7kSB0cnVuZyBiw6xuaCAobWVhbiksIMSR4buZIGzhu4djaCBjaHXhuqluIChzZCkgLOKApiBDw7MgdGjhu4MgeGVtIHRow6ptIGPDoWMgdGjDtG5nIHRpbiBraMOhYyBiw6puIGTGsOG7m2kgOgpsaWJyYXJ5KHNraW1yKQpza2ltKHZ5MSkKCgpgYGAKClRo4buxYyBoaeG7h24gdGhhbyB0w6FjIHRhbyDEkcaw4bujYyBr4bq/dCBxdeG6oyBuaMawIHNhdQoKKipNw7QgdOG6oyoqCgotIG5fbWlzc2luZzogc+G7kSDDtCBk4buvIGxp4buHdSB0cuG7kW5nICgwIGPDsyBk4buvIGxp4buHdSB0cuG7kW5nKQotIGNvbXBsZXRlX3JhdGU6IHThu7cgbOG7hyDDtCBjw7MgZOG7ryBsaeG7h3UgKCkKLSBtZWFuOiB0cnVuZyBiw6xuaAotIHNkOgnEkeG7mSBs4buHY2ggY2h14bqpbgotIHAwOglnacOhIHRy4buLIG1pbgotIHAyNTogcGjDom4gduG7iyB0aOG7qSBuaOG6pXQKLSBwNTA6IHBow6JuIHbhu4sgdGjhu6kgaGFpKHRydW5nIHbhu4spCQotIHA3NTogcGjDom4gduG7iyB0aOG7qSBiYQotIHAxMDA6CWdpw6EgdHLhu4sgbWF4Ci0gaGlzdDogYmnhu4N1IMSR4buTIEhpc3RvZ3JhbQoKCgoKKipU4burIGLhu5kgZOG7ryBsaeG7h3UgdnkxIHRhIGNo4buNbiByYSA1IHF1YW4gc8OhdCAgIlZpZXROYW0iLCAiU2luZ2Fwb3JlIiwgIiBUaGFpbGFuZCIsICIgQ2hpbmEgIiwgIiBCcmF6aWwiLCBiaeG6v24gKFBvcHVsYXRpb24pIHbDoCA1IGJp4bq/biDEkeG7mSB0deG7lWkgKFBvcHVsYXRpb24gYXQgYWdlIDEgLFBvcHVsYXRpb24gYWdlZCAxIHRvIDQgeWVhcnMgLCBQb3B1bGF0aW9uIGFnZWQgNSB0byA5IHllYXJzLCBQb3B1bGF0aW9uIGFnZWQgMTAgdG8gMTQgeWVhcnMsIFBvcHVsYXRpb24gYWdlZCAxNSB0byAxOSB5ZWFycykqKgoKIyMgKiouR2nhuqNpIHRow61jaCBjaG8gZOG7ryBsaeG7h3UgxJHDoyBjaOG7jW4qKgoKCgpgYGB7cn0KI1RyxrDhu5tjIHRpw6puIHRhIHBo4bqjaSBsb2FkIGfDs2kgImRwbHlyIgpsaWJyYXJ5KGRwbHlyKQoKYGBgCgoKClThu6sgZOG7ryBsaeG7h3UgY+G7p2EgdnkxLCB0YSBs4buNYyByYSA1IHF1YW4gc8OhdCDEkeG7gyBwaMOibiB0w61jaCBiYW8gZ+G7k20gIioqVmlldE5hbSoqIiwgIioqU2luZ2Fwb3JlKioiLCAiICoqVGhhaWxhbmQqKiAiLCAiICoqQ2hpbmEqKiAiLCAiICoqQnJhemlsKiogIgpUYSB0aOG7sWMgaGnhu4duIHRoYW8gdMOhYyBnw6FuIDUgcXVhbiBzw6F0IMSRw6MgbOG7jWMgdHLDqm4gdsOgbyBvYmplY3QgbeG7m2kgbMOgIHZ5MiwgdGEgxJHGsOG7o2Mgb2JqZWN0IGzDoCAqKnZ5MioqIHbhu5tpIDM2MCBxdWFuIHPDoXQsIDI0IGJp4bq/bgoKYGBge3IgZWNobz1GQUxTRX0KdnkyIDwtIHZ5MSAlPiUgZmlsdGVyKENvdW50cnkgJWluJSBjKCdWaWV0bmFtJywgJ1NpbmdhcG9yZScsICdUaGFpbGFuZCcsICdDaGluYScsICdCcmF6aWwnKSkKCnN0cih2eTIpCgpgYGAKCgpU4burIGLhu5kgZOG7ryBsaeG7h3UgdnkxIHRhIGNo4buNbiByYSA1IHF1YW4gc8OhdCAgIlZpZXROYW0iLCAiU2luZ2Fwb3JlIiwgIiBUaGFpbGFuZCIsICIgQ2hpbmEgIiwgIiBCcmF6aWwiLCBiaeG6v24gKFBvcHVsYXRpb24pIHbDoCA1IGJp4bq/biDEkeG7mSB0deG7lWkgKFBvcHVsYXRpb24gYXQgYWdlIDEgLFBvcHVsYXRpb24gYWdlZCAxIHRvIDQgeWVhcnMgLCBQb3B1bGF0aW9uIGFnZWQgNSB0byA5IHllYXJzLCBQb3B1bGF0aW9uIGFnZWQgMTAgdG8gMTQgeWVhcnMsIFBvcHVsYXRpb24gYWdlZCAxNSB0byAxOSB5ZWFycykgdsOgIGfDoW4gdsOgbyBvYmplY3QgKip2eTMqKiB24bubaSAzNjAgcXVhbiBzw6F0IHbDoCA4IGJp4bq/bgoKCmBgYHtyIGVjaG89VFJVRX0KCiB2eTMgPC0gdnkyICU+JSBzZWxlY3QoQ291bnRyeSxZZWFyLFBvcHVsYXRpb24sUG9wdWxhdGlvbi5hdC5hZ2UuMSwgUG9wdWxhdGlvbi5hZ2VkLjEudG8uNC55ZWFycyAsIFBvcHVsYXRpb24uYWdlZC41LnRvLjkueWVhcnMgICwgUG9wdWxhdGlvbi5hZ2VkLjEwLnRvLjE0LnllYXJzICwgUG9wdWxhdGlvbi5hZ2VkLjE1LnRvLjE5LnllYXJzICkKCnN0cih2eTMpCgoKCmBgYAoKCgoqKlRhIHRo4buxYyBoaeG7h24gxJHhu5VpIHTDqm4gxJHhu4MgdGhhbyB0w6FjIHRy4bufIG7Dqm4gZOG7hSBkw6BuZyBoxqFuOioqCgotIENvOiBDb3VudHJ5Ci0gWTogWWVhcgotIFBvOiBQb3B1bGF0aW9uCi0gUG8xOiBQb3B1bGF0aW9uIGF0IGFnZSAxIAotIFBvNDogUG9wdWxhdGlvbiBhZ2VkIDEgdG8gNCB5ZWFycyAKLSBQbzk6IFBvcHVsYXRpb24gYWdlZCA1IHRvIDkgeWVhcnMKLSBQbzE0OiBQb3B1bGF0aW9uIGFnZWQgMTAgdG8gMTQgeWVhcnMKLSBQbzE5OiBQb3B1bGF0aW9uIGFnZWQgMTUgdG8gMTkgeWVhcnMKClRo4buxYyBoaeG7h24gdGhhbyB0w6FjIMSR4buVaSB0w6puLCB0YSDEkcaw4bujYyBvYmplY3QgKip2eTMqKiB24bubaSB0w6puIMSRxrDhu6NjIMSR4buVaSBuZ+G6r24gZ+G7jW4gaMahbiBuaMawIGLhuqNuZyBzYXUKCmBgYHtyfQpuYW1lcyh2eTMpIDwtIGMgKCAiQ28iLCJZIiwiUG8iLCJQbzEiLCJQbzQiLCJQbzkiLCJQbzE0IiwiUG8xOSIpCgpzdHIodnkzKQpgYGAKCgpUYSB0aOG7sWMgaGnhu4duIHjDs2EgYuG7jyBiaeG6v24gWSBnaeG7ryBs4bqhaSA3IGJp4bq/biBj4bqnbiBs4bqleSBk4buvIGxp4buHdSDEkeG7gyBwaMOibiB0w61jaCB2w6AgZ8OhbiB2w6BvIG9iamVjdCAqKnZ5NCoqClRhIMSRxrDhu6NjIG9iamVjdCBt4bubaSBsw6AgKip2eTQqKiB24bubaSAzNjAgcXVhbiBzw6F0IHbDoCA3IGJp4bq/biAKCgpgYGB7cn0KCnZ5NCA8LSBzZWxlY3QodnkzLC1ZKQoKc3RyKHZ5NCkKYGBgCgoKIyMgKiouTcOjIGjDs2EgZOG7ryBsaeG7h3UqKgoKCsSQ4buDIG3DoyBow7NhIGThu68gbGnhu4d1IHRhIGfhu41pIGfDs2kgdGlkeXZlcnNlIHJhCgpgYGB7cn0KbGlicmFyeSh0aWR5dmVyc2UpCmBgYAoKCgpUaOG7sWMgaGnhu4duIHRoYW8gdMOhYyBu4bq/dSB0cuG6uyBlbSAxIHR14buVaSBs4bubbiBoxqFuIDE5JSBkw6JuIHPhu5EgdGjDrCB04buJIGzhu4cgdHLhursgZW0gZMaw4bubaSAxIHR14buVaSBjYW8sIG5nxrDhu6NjIGzhuqFpIGzDoCB0aOG6pXAKVGEgZ8OhbiBr4bq/dCBxdeG6oyBjaG8gKip0ZWQxKioKCgpgYGB7cn0Kdnk0JHRlZDEgPC0gaWZlbHNlKHZ5NCRQbzEgPiAwLjE5KnZ5NCRQbywgJ3Ry4bq7IGVtIGTGsOG7m2kgMXQgY2FvJywgJ3Ry4bq7IGVtIGTGsOG7m2kgMXQgdGjhuqVwJykKc3RyKHZ5NCR0ZWQxKQpgYGAKCgoKVGjhu7FjIGhp4buHbiB0aGFvIHTDoWMgbuG6v3UgbmjGsCBkw6JuIHPhu5EgY+G7p2Egbsaw4bubYyDEkcOzIGzhu5tuIGjGoW4gMS4wMDAuMDAwLjAwMCBkw6JuIHRow6wgxJHGsOG7o2MgZ+G7jWkgbMOgICIgxJHDtG5nIGTDom4gIiBuZ8aw4bujYyBs4bqhaSBu4bq/dSBkw6JuIHPhu5Egbmjhu48gaMahbiAiMS4wMDAuMDAwLjAwMCIgdGjDrCDEkcaw4bujYyBn4buNaSBsw6AgIiB0aMawYSBkw6JuIApHw6FuIGvhur90IHF14bqjIGNobyAqKmR0KioKCgpgYGB7cn0Kdnk0JGR0IDwtIGlmZWxzZSh2eTQkUG8+MTAwMDAwMDAwMCwgJ8SRw7RuZyBkw6JuJywgJ3RoxrBhIGTDom4nICkKc3RyKHZ5NCRkdCkKYGBgCgoKCkfDoW4ga+G6v3QgcXXhuqMgbeG7m2kgY2hvICoqZHQxKiogc+G7rSBk4bulbmcgaMOgbSBjYXNlX3doZW4gaOG7lyB0cuG7oyBtw6MgaMOzYSBk4buvIGxp4buHdSBuaGnhu4F1IGjGoW4gMiBu4bq/dSBuaMawIGTDom4gc+G7kSBj4bunYSBjw6FjIG7GsOG7m2Mgbmjhu48gaMahbiAxMDAwMDAgZMOibiB0aMOsIMSRxrDhu6NjIGfhu41pIGzDoCAidGjGsGEiICwgdOG7qyAxMDAwMDAgZMOibiDEkeG6v24gMTAwMDAwMDAwMCBkw6JuIMSRxrDhu6NjIGfhu41pIGzDoCAiduG7q2EiLCB0csOqbiAxMDAwMDAwMDAwIGfhu41pIGzDoCAixJHDtG5nIgoKYGBge3J9CnZ5NCRkdDEgPC0gY2FzZV93aGVuKHZ5NCRQbyA8IDEwMDAwMCB+ICd0aMawYScsIHZ5NCRQbyA+PSAxMDAwMDAgJiB2eTQkUG8gPCAxMDAwMDAwMDAwIH4gJ3bhu6thICcsIHZ5NCRQbyA+IDEwMDAwMDAwMDAgfiAnxJHDtG5nJyApCnN0cih2eTQkZHQxKQpgYGAKCgogU+G7rSBk4bulbmcgaMOgbSBjdXQgZMO5bmcgxJHhu4MgY2hpYSBk4buvIGxp4buHdSBj4bunYSBiaeG6v24gIlBvMTQiIHThu6sgInZ5NCIgdGjDoG5oIDMgdOG7lSB0aGVvIHThu6tuZyBraG/huqNuZyBnacOhIHRy4buLIHNhdTogdOG7qyAwIMSR4bq/biAxLjAwMC4wMDAgbMOgICJraDEiLCB04burIDEuMDAwLjAwMCDEkeG6v24gMTAuMDAwLjAwMCBsw6AgImtoMiIsIHThu6sgMTAuMDAwLjAwMCDEkeG6v24gMTAwLjAwMC4wMDAgbMOgICJraDMiLkfDoW4ga+G6v3QgcXXhuqMgY2hvICoqY3V0MSoqCgoKYGBge3J9Cgp2eTQkY3V0MTwtIGN1dCggdnk0JFBvMTQsIGJyZWFrcyA9IGMoMCwgMTAwMDAwMCwxMDAwMDAwMCwgMTAwMDAwMDAwKSwgbGFiZWxzPSBjICgna2gxJyAsICdraCAyJywna2gzJykpCgpzdHIodnk0JGN1dDEpCmBgYAoKCiMjICoqTOG6rXAgYuG6o25nIHThuqduIHPhu5EqKgoKVGjhu7FjIGhp4buHbiBnw6FuIGLhuqNuZyB04bqnbiBz4buRIHThuqduIHPhu5EgLSBz4buRIGzhuqduIHh14bqldCBoaeG7h24gY+G7p2EgZOG7ryBsaeG7h3UgdHJvbmcgZGF0YSB0YSBz4butIGThu6VuZyBjw6J1IGzhu4duaCB0YWJsZSAuIETGsOG7m2kgxJHDonkgbMOgIGtp4buDdSB0cmEgdOG6p24gc+G7kSBj4bunYSBiaeG6v24gIlBvMSIgCmBgYHtyfQp0cyA8LSB0YWJsZSh2eTQkUG8xKQpzdHIodHMpCmBgYAoKCi0gTOG6rXAgYuG6o25nIHThuqduIHPhu5EgY2hvIDIgYmnhur9uIGzDoCAiUG80IiB2w6AgIkNvIiBnw6FuIHbDoG8gdHMyMQoKCmBgYHtyfQp2eTQkdHMyIDwtIGN1dCh2eTQkUG80LDMsIGxhYmVscyA9IGMoJ2EnLCdiJywnYycpKQp0czIxIDwtIHRhYmxlKHZ5NCRDbyx2eTQkdHMyKQpzdHIodHMyMSkKCmBgYAoKCkzhuq1wIGJp4buDdSDEkeG7kyBuaMOhbmggdsOgIGzDoSBjaG8gYmnhur9uIFBvMTkgdGh14buZYyBvYmplY3QgKip2eTQqKgoKR2nhuqNpIHRow61jaCBr4bq/dCBxdeG6ozogdHLhu41uZyBz4buRIHThuq1wIHRydW5nIOG7nyAwIHbDoCBraMO0bmcgdGjhu4MgaGnhu4duIOG7nyAyLDMsNApgYGB7cn0Kc3RlbSh2eTQkUG8xOSkKYGBgCgoKIyMgKipUw61uaCB0b8OhbiBjw6FjIMSR4bq3YyB0csawbmcgxJFvIGzGsOG7nW5nKioKIApM4buHbmggU3VtbWFyeS0gbeG7mXQgYuG6o24gdMOzbSB04bqvdCBjw6FjIGdpw6EgdHLhu4sgxJHhurdjIHRyxrBuZyDEkSB24buBIG3hu5l0IMSR4buRaSB0xrDhu6NuZyBuw6BvIMSRw7MgbcOgIHRhIHnDqnUgY+G6p3UsIHRhIGPDsyB0aOG7gyB0w61uaCB04burbmcgxJHhurdjIHRyxrBuZyByacOqbmcgaG/hurdjIGPDsyB0aOG7gyB4ZW0gY2jhu4kgdHJvbmcgc3VtbWFyeQoKVGjhu7FjIGhp4buHbiBs4buHbmggc3VtbWFyeSB0csOqbiAqKnZ5NCoqIHbhu4EgYmnhur9uIFBvMTQKCiAKIApgYGB7cn0Kc3VtbWFyeSh2eTQkUG8xKQpgYGAKICoqR2nhuqNpIHRow61jaCBr4bq/dCBxdeG6oyoqIDogcGjDom4gdMOtY2ggYmnhur9uICJQbzEiIHThu6sgZOG7ryBsaeG7h3UgY+G7p2EgZGF0YSAidnk0IiB0YSDEkcaw4bujYyAKIAotIGTDom4gc+G7kSBuaOG7jyBuaOG6pXQgY+G7p2EgIDEgdHXhu5VpIDozMzcyMQotIHBow6JuIHbhu4sgdGjhu6kgbmjhuqV0IDogMTc5OTIgKDI1JSBz4buRIGxp4buHdSBkw6JuIHPhu5EgY+G7p2EgxJHhu5kgdHXhu5FpIGTGsOG7m2kgMSBuaOG7jyBoxqFuIDE3OTkyIG5nxrDhu51pICwgNzUlIGPDsm4gbOG6oWkgbOG7m24gaMahbiAxNzk5MiBuZ8aw4budaSkKLSB0cnVuZyB24buLIDogIDE0NDQ0OTQgKDUwJSBz4buRIGxp4buHdSBkw6JuIHPhu5EgY8OzIMSR4buZIHR14buVaSBkxrDhu5tpIDEgbmjhu48gaMahbiAxNDQ0NDk0IG5nxrDhu51pLCA1MCUgY8OybiBs4bqhaSBs4bubbiBoxqFuIDE0NDQ0OTQgbmfGsOG7nWkgKQotIHRydW5nIGLDrG5oIDogICA1MjM3ODAwIAotIHBow6JuIHbhu4sgdGjhu6kgMyA6ICAzNDc5NzMyICggNzUlIHPhu5EgbGnhu4d1IGTDom4gc+G7kSBjw7MgxJHhu5kgdHXhu5VpIGTGsOG7m2kgMSBuaOG7jyBoxqFuIDM0Nzk3MzIgbmfGsOG7nWkgLCAyNSUgY8OybiBs4bqhaSBs4bubbiBoxqFuIDM0Nzk3MzIgbmfGsOG7nWkpCi0gZMOibiBz4buRIGzhu5tuIG5o4bqldCBj4bunYSAgMSB0deG7lWkgbMOgICAyODU5MjIzNAoKCmBgYHtyfQpzdW0odnk0JFBvMTQpCmBgYAoqKkdp4bqjaSB0aMOtY2gga+G6v3QgcXXhuqMqKjogQ8OidSBs4buHbmggc3VtIGNobyBiaeG6v3QgdOG7lW5nIGTDom4gc+G7kSBj4bunYSBiaeG6v24gZMOibiBz4buRIHThu6sgMTAtMTQgdHXhu5VpIHThu6sgZOG7ryBsaeG7h3UgInZ5NCIgbMOgICA4NjI2NDUzMjgwCgpgYGB7cn0KbWVhbih2eTQkUG8xNCxuYS5ybSA9IFQpCmBgYAoqKkdp4bqjaSB0aMOtY2gga+G6v3QgcXXhuqMqKjogQ8OidSBs4buHbmggKiptZWFuKiogY2hvIGJp4bq/dCBnacOhIHRy4buLIHRydW5nIGLDrG5oIHPhu5EgZMOibiBj4bunYSDEkeG7mSB0deG7lWkgdOG7qyAxMC0xNCB0deG7lWkgbMOgIDIzOTYyMzcwCgpgYGB7cn0KbGVuZ3RoKHZ5NCRQbzE0KQpgYGAKKipHaeG6o2kgdGjDrWNoIGvhur90IHF14bqjKio6IGPDonUgbOG7h25oICoqbGVuZ2h0aCoqIGNobyBiaeG6v3QgxJHhu5kgZMOgaSBiaeG6v24gKipQbzE0KiogbMOgIDM2MApgYGB7cn0KdmFyKHZ5NCRQbzE0KQpgYGAKKipHaeG6o2kgdGjDrWNoIGvhur90IHF14bqjKio6IGPDonUgbOG7h25oICoqdmFyKiogY2hvIGJp4bq/dCDEkeG7mSBs4buHY2ggaGF5IGPDsm4gZ+G7jWkgbMOgIHBoxrDGoW5nIHNhaSBj4bunYSBiaeG6v24gKipQbzE0KiogbMOgICAxLjM4MTY2OGUrMTUKCmBgYHtyfQpzZCh2eTQkUG8xNCkKYGBgCioqR2nhuqNpIHRow61jaCBr4bq/dCBxdeG6oyoqOiBjw6J1IGzhu4duaCAqKnNkKiogY2hvIGJp4bq/dCDEkeG7mSBs4buHY2ggY2h14bqpbiBj4bunYSBiaeG6v24gKipQbzE0KiBsw6AgMzcxNzA3OTIKCmBgYHtyfQptZWRpYW4odnk0JFBvMTQpCmBgYAoqKkdp4bqjaSB0aMOtY2gga+G6v3QgcXXhuqMqKjogQ8OidSBs4buHbmggKiptZWRpYW4qKiBjaG8gYmnhur90IHRydW5nIHbhu4sgZMOibiBz4buRIGPhu6dhIDEwLTE0IHR14buVaSBsw6AgNjY0ODc5MSAsIG5naMSpYSBsw6AgNTAlIHPhu5EgbGnhu4d1IGTDom4gc+G7kSBj4bunYSDEkeG7mSB0deG7lWkgZMaw4bubaSAxNSBsw6Agbmjhu48gaMahbiA2NjQ4NzkxIHbDoCA1MCUgY8OybiBs4bqhaSBsw6AgbOG7m24gaMahbiA2NjQ4NzkxCgojIyAqKlTDrW5oIHRvw6FuIGPDoWMgxJHhurdjIHRyxrBuZyDEkW8gbMaw4budbmcgdGhlbyBuaMOzbSoqCgpgYGB7cn0Kdnk2IDwtIHZ5NCAlPiUgZ3JvdXBfYnkoUG8xKSAlPiUgc3VtbWFyaXNlKG1lYW5fb2ZfUG8xNCA9IG1lYW4oUG8xNCkpCmRhdGF0YWJsZSh2eTYpCmBgYAoKKipHaeG6o2kgdGjDrWNoIGvhur90IHF14bqjKio6IGfDoW4ga+G6v3QgcXXhuqMgY2hvIHZ5NiB24buBIGdpw6EgdHLhu4sgdHJ1bmcgYsOsbmggY+G7p2EgZMOibiBz4buRIHThu6sgMTAtMTQgdHXhu5VpIGThu7FhIHbDoG8gYmnhur9uIGTDom4gc+G7kSAgMSB0deG7lWkgCmBgYHtyfQp2eTcgPC0gdnkzICU+JSBncm91cF9ieShZKSAlPiUgc3VtbWFyaXNlKG4gPSBuKCksbWVhbl9vZl9QbzE0ID0gbWVhbihQbzE0KSkKZGF0YXRhYmxlKHZ5NykKYGBgCgoqKkdp4bqjaSB0aMOtY2gga+G6v3QgcXXhuqMqKjogZ2nDoSB0cuG7iyB0cnVuZyBiw6xuaCBj4bunYSB04buVbmcgZMOibiBz4buRIHThu6sgMTAtMTQgdHXhu5VpIChiaeG6v24gUG8xNCkgdGhlbyBuxINtIChiaeG6v24gWSkgdHJvbmcgxJHDsyBuPW4oKSBjaG8gYmnhur90IHPhu5EgbOG6p24gbsSDbSDEkcOzIHh14bqldCBoaeG7h24gKCBoYXkgY2jDrW5oIGzDoCB04buVbmcgc+G7kSBxdeG7kWMgZ2lhLCBraHUgduG7sWMgKQoKYGBge3J9CnZ5OCA8LSB2eTMgJT4lIGdyb3VwX2J5KFkpICU+JSBzdW1tYXJpc2UobWVkX29mX1BvMTQ9IG1lZGlhbihQbzE0KSkKZGF0YXRhYmxlKHZ5OCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKYGBgCgoqKkdp4bqjaSB0aMOtY2gga+G6v3QgcXXhuqMqKjp2eTggbMOgIGvhur90IHF14bqjIGPhu6dhIHRydW5nIHbhu4sgY+G7p2EgdOG7lW5nIGTDom4gc+G7kSB04burIDEwLTE0IHR14buVaSAoYmnhur9uIFBvMTQpIHRoZW8gbsSDbSAoYmnhur9uIFkpIApgYGB7cn0Kdnk5IDwtIHZ5NCAlPiUgZ3JvdXBfYnkoQ28pICU+JSBzdW1tYXJpc2UobWVhbl9vZl8gPSBtZWFuKFBvKSkKdnk5CmBgYAoKKipHaeG6o2kgdGjDrWNoIGvhur90IHF14bqjKio6IHZ5OSBsw6Aga+G6v3QgcXXhuqMgZ2nDoSB0cuG7iyB0cnVuZyBiw6xuaCBj4bunYSB04buVbmcgZMOibiBz4buRIMSRxrDhu6NjIHTDrW5oIHRoZW8gdMOqbiBxdeG7kWMgZ2lhIApgYGB7cn0KdnkxMCA8LSB2eTMgJT4lIGdyb3VwX2J5KFksQ28pICU+JSBzdW1tYXJpc2UobiA9IG4oKSxtZWFuX29mX1BvID0gbWVhbihQbyksLmdyb3VwcyA9ICdkcm9wJykKZGF0YXRhYmxlKHZ5MTApCmBgYAoKCioqR2nhuqNpIHRow61jaCBr4bq/dCBxdeG6oyoqIDogdnkxMCBsw6AgZ2nDoSB0cuG7iyB0cnVuZyBiw6xuaCBj4bunYSB04buVbmcgZMOibiBz4buRIHRoZW8gdOG7q25nIG7Eg20gY+G7p2EgdOG7q25nIHF14buRYyBnaWEgCgoKCiMgKipOSEnhu4ZNIFbhu6QgMy4yKioKKioqCiMjICoqR2nhuqNpIHRow61jaCBi4buZIGThu68gbGnhu4d1KioKCk5oaeG7h20gduG7pSAzLjIgdGjhu7FjIGhp4buHbiB0aGFvIHTDoWMgdHLDqm4gZGF0YXNldHMgKipGaW5hbmNpYWwgU2FtcGxlIEV4Y2VsKiosIGzDoCAxIGRhdGFzZXQgdGjhu5FuZyBrw6ogdMOsbmggaMOsbmggdMOgaSBjaMOtbmggbuG7lWkgYuG6rXQgY+G7p2EgbeG7mXQgc+G7kSB0aOG7iyB0csaw4budbmcgdHLDqm4gdGjhur8gZ2nhu5tpIGdpYWkgxJFv4bqhbiAyMDEzLTIwMTQuCgoKIyMgKiouIE3DtCB04bqjIGPGoSBi4bqjbioqCioqKgpMw6AgMSBkYXRhZnJhbWUKS2jDtG5nIGPDsyBk4buvIGxp4buHdSB0cuG7kW5nCkRhdGFzZXRzIGPDsyAxMDA2IHF1YW4gc8OhdCB2w6AgMTYgYmnhur9uIG5oxrAgc2F1OgoKCi0gKipTZWdtZW50OioqIHRo4buLIHRyxrDhu51uZwotICoqQ291bnRyeToqKiBxdeG7kWMgZ2lhCi0gKipQcm9kdWN0OioqIHPhuqNuIHBo4bqpbSB0w6BpIGNow61uaAotICoqRGlzY291bnQgQmFuZDoqKiDEkcOhbmggZ2nDoSBt4bupYyDEkeG7mSBy4bunaSBybwotICoqVW5pdHMgU29sZDoqKiBz4buRIGzGsOG7o25nIHPhuqNuIHBo4bqpbSBob+G6t2MgZOG7i2NoIHbhu6UgxJHDoyBiw6FuIAotICoqTWFudWZhY3R1cmluZyBQcmljZToqKiBjaGkgcGjDrSBz4bqjbiB4deG6pXQgY+G7p2EgMSBz4bqjbiBwaOG6qW0gZOG7i2NoIHbhu6UJIC0KLSAqKlNhbGUgUHJpY2U6KiogZ2nDoSBiw6FuCi0gKipHcm9zcyBTYWxlczoqKiB04buVbmcgZG9hbmggdGh1IAotICoqRGlzY291bnRzOioqIGNoaeG6v3Qga2jhuqV1CSAKLSAqKlNhbGVzOioqIGRvYW5oIHPhu5EgYsOhbiBow6BuZwkKLSAqKkNPR1M6Kiogc+G7kSB0aeG7gW4gY2hpIHRy4bqjIHPhuqNuIHh14bqldCBob+G6t2MgbXVhIGjDoG5nIGjDs2EgZOG7i2NoIHbhu6Ug4bqjbmggaMaw4bufbmcgdHLhu7FjIHRp4bq/cCDEkeG6v24gaG/huqF0IMSR4buZbmcgdOG7lSBjaOG7qWMgKCBDb3N0IG9mIGdvb2RzIHNvbGQpCi0gKipQcm9maXQ6KiogbOG7o2kgbmh14bqtbgkKLSAqKkRhdGU6KiogbmfDoHkgZ2nDoSB0cuG7iyAKLSAqKk1vbnRoIE51bWJlcjoqKiBz4buRIHRo4bupIHThu7EgdGjDoW5nIHRyb25nIG7Eg20KLSAqKk1vbnRoIE5hbWU6KiogdMOqbiB0aMOhbmcgdHJvbmcgbsSDbQkKLSAqKlllYXI6KiogbsSDbSB0aHUgdGjhuq1wIHPhu5EgbGnhu4d1CgoKYGBge3J9CgpgYGAKCgoqKsSQ4buNYyBi4buZIGThu68gbGnhu4d1KioKYGBge3J9CmxpYnJhcnkob3Blbnhsc3gpCiB2eXZ5IDwtIHJlYWQueGxzeCgiL1VzZXJzL3h1eWVuY2hpL0Rvd25sb2Fkcy9SIENvZGUvRmluYW5jaWFsIFNhbXBsZS54bHN4IikKc3RyKHZ5dnkpCmlzLmRhdGEuZnJhbWUodnl2eSkKICAgICAgICAgICAgICAKYGBgCgoKYGBge3J9CmxpYnJhcnkoc2tpbXIpCnNraW0odnl2eSkKYGBgCgoKCi0gVGjDtG5nIHRpbiBtw7QgdOG6oyBi4buZIGThu68ga2nhu4d1IGPDsyBjw6FjIGPhu5l0IHNhdSB2w6Agw70gbmdoxKlhIGPDoWMgY+G7mXQgbMOgOgoKc2tpbV92YXJpYWJsZTogdMOqbiBiaeG6v24KCm5fbWlzc2luZzogc+G7kSBk4buvIGxp4buHdSB0cuG7kW5nCgpjb21wbGV0ZV9yYXRlOiB04buJIGzhu4cgYmnhur9uIGPDsyBk4buvIGxp4buHdQoKbWVhbjogZ2nDoSB0cuG7iyB0cnVuZyBiw6xuaCAKCnNkOiDEkeG7mSBs4buHY2ggY2h14bqpbiAKCnAwOiBnacOhIHRy4buLIG5o4buPIG5o4bqldCAKCnAyNTogcGjDom4gduG7iyB0aOG7qSBuaOG6pXQKCnA1MDogdHJ1bmcgduG7iyAKCnA3NTogcGjDom4gduG7iyB0aOG7qSBiYQoKcDEwMDogZ2nDoSB0cuG7iyBs4bubbiBuaOG6pXQgCgpoaXM6IGJp4buDdSDEkeG7kyBoaXN0b2dyYW0KCgoqKsSQ4buDIGThu4UgZMOgbmcgcGjDom4gdMOtY2ggZOG7ryBsaeG7h3UgdGEgY2jhu4kgbOG6pXkgMSBwaOG6p24gbmjhu48gZOG7ryBsaeG7h3UgdOG7qyBpIMSR4buDIHBow6JuIHTDrWNoIApgYGB7cn0Kdnl2eTEgPC0gdnl2eVsxOjIwMCwxOjVdCmRhdGF0YWJsZSh2eXZ5MSkKCgpgYGAKIyMgKipHaeG6o2kgdGjDrWNoIGNobyBk4buvIGxp4buHdSDEkcOjIGNo4buNbiAqKgoKCgpUYSDEkeG7lWkgdMOqbiDEkeG7gyBk4buFIHRoYW8gdMOhYwotIFMgOipTZWdtZW50OioqIHRo4buLIHRyxrDhu51uZwotIENvdSA6KipDb3VudHJ5OioqIHF14buRYyBnaWEKLSBQcm86ICAqKlByb2R1Y3Q6Kiogc+G6o24gcGjhuqltIHTDoGkgY2jDrW5oCi0gRGlzOiAqKkRpc2NvdW50IEJhbmQ6KiogxJHDoW5oIGdpw6EgbeG7qWMgxJHhu5kgcuG7p2kgcm8KLSBVbmk6ICoqVW5pdHMgU29sZDoqKiBz4buRIGzGsOG7o25nIHPhuqNuIHBo4bqpbSBob+G6t2MgZOG7i2NoIHbhu6UgxJHDoyBiw6FuIAoKYGBge3J9Cm5hbWVzKHZ5dnkxKSA8LSBjKCdTJywnQ291JywnUHJvJywnRGlzJywnVW5pJykKc3RyKHZ5dnkxKQpgYGAKIyMgKipNw6MgaMOzYSBk4buvIGxp4buHdSoqCi0gR+G7jWkgcGFja2FnZXMgKipUaWR5dmVyc2UqKiDEkeG7gyBz4butIGThu6VuZyBjw6FjIGzhu4duaCB0aeG6v3AgdGhlbyAKYGBge3J9CmxpYnJhcnkodGlkeXZlcnNlKQpgYGAKLSBHw6FuIGvhur90IHF14bqjIG3hu5tpIGNobyAqKmd0KiogLCBu4bq/dSBnacOhIHRy4buLIGzhu5tuIGjGoW4gMTAwMCB0aMOsIMSRxrDhu6NjIG3DoyBow7NhIGzDoCAiY2FvIiB2w6AgbmfGsOG7o2MgbOG6oWkgbuG6v3Ugbmjhu48gaMahbiAxMDAwIGzDoCAiIHRo4bqlcCIKCmBgYHtyfQp2eXZ5MSRndCA8LSBpZmVsc2Uodnl2eTEkVW5pID4gMTAwMCwgJ2NhbycsICd0aOG6pXAnKQoKYGBgCgotIEfDoW4ga+G6v3QgcXXhuqMgbeG7m2kgY2hvICJzbCIgc+G7rSBk4bulbmcgaMOgbSBjYXNlX3doZW4gaOG7lyB0cuG7oyBtw6MgaMOzYSBk4buvIGxp4buHdSBuaGnhu4F1IGjGoW4gMiBu4bq/dSBuaMawIGdpw6EgdHLhu4sgbmjhu48gaMahbiAxMDAgdGjDrCDEkcaw4bujYyBn4buNaSBsw6AgIsOtdCIgLCB04burIDEwMCBkw6JuIMSR4bq/biAxMDAwIMSRxrDhu6NjIGfhu41pIGzDoCAiduG7q2EiLCB0csOqbiAxMDAwIGfhu41pIGzDoCAibmhp4buBdSAiCgpgYGB7cn0KCmBgYAoKLSBHw6FuIGvhur90IHF14bqjIG3hu5tpIGNobyAic2wwIiBz4butIGThu6VuZyBow6BtIGN1dCBkw7luZyDEkeG7gyBjaGlhIGThu68gbGnhu4d1IGPhu6dhIGJp4bq/biAiViIgdOG7qyAiaTEiIHRow6BuaCAzIHThu5UgdGhlbyB04burbmcga2hv4bqjbmcgZ2nDoSB0cuG7iyBzYXU6IHThu6sgMCDEkeG6v24gMTAgbMOgICJraG8xIiwgdOG7qyAxMCDEkeG6v24gNTAgbMOgICJraG8yIiwgdOG7qyA1MCDEkeG6v24gMTAwIGzDoCAia2hvMyIuCgpgYGB7cn0KCnZ5dnkxJHNsMyA8LSBjdXQoIHZ5dnkxJFVuaSwgYnJlYWtzID0gYygwLCAxMCw1MCwxMDApLCBsYWJlbHM9IGMgKCdraG8gMScsJ2tobyAyJywna2hvIDMnKSkKYGBgCgojIyAqKkzhuq1wIGLhuqNuZyB04bqnbiBz4buRKioKLSDEkOG7gyBiaeG6v3QgdOG6p24gc+G7kSAtIHPhu5EgbOG6p24geHXhuqV0IGhp4buHbiBj4bunYSBk4buvIGxp4buHdSB0cm9uZyBkYXRhIHRhIHPhu60gZOG7pW5nIGPDonUgbOG7h25oIHRhYmxlIC4gRMaw4bubaSDEkcOieSBsw6Aga2nhu4N1IHRyYSB04bqnbiBz4buRIGPhu6dhIGJp4bq/biAiViIgIApgYGB7cn0KaTIgPC0gdGFibGUodnl2eTEkVW5pKQpzdHIoaTIpCmBgYAoKCmBgYAoqKkdp4bqjaSB0aMOtY2gga+G6v3QgcXXhuqMqKiA6IGJp4bq/biAiVW5pIiBj4bunYSAidnl2eTEiIMSRxrDhu6NjIGNoaWEgbMOgbSAzIG5ow7NtICgyMTAsMS42NGUrMDNdIDk5IHF1YW4gc8OhdCAoMS42NGUrMDMsMy4wN2UrMDNdOTMgcXVhbiBzw6F0ICAoMy4wN2UrMDMsNC41ZSswM10gOCBxdWFuIHPDoXQKCgotIEzhuq1wIGJp4buDdSDEkeG7kyBuaMOhbmggdsOgIGzDoSBj4bunYSBiaeG6v24gIlVuaSJ04burIGThu68gbGnhu4d1IGPhu6dhIGRhdGEgdnl2eTEgCgpgYGB7cn0Kc3RlbSh2eXZ5MSRVbmkpCmBgYAojIyAqKlTDrW5oIHRvw6FuIGPDoWMgxJHhurdjIHRyxrBuZyDEkW8gbMaw4budbmcqKgoKYGBge3J9Cm1lYW4odnl2eTEkVW5pLG5hLnJtID0gVCkKYGBgCioqR2nhuqNpIHRow61jaCBr4bq/dCBxdeG6oyoqOiBDw6J1IGzhu4duaCAqKm1lYW4qKiBjaG8gYmnhur90IGdpw6EgdHLhu4sgdHJ1bmcgYsOsbmggY+G7p2EgY+G7mXQgYmnhur9uIFVuaSBsw6AgMTY0MS45NzUKCmBgYHtyfQpsZW5ndGgodnl2eTEkVW5pKQpgYGAKKipHaeG6o2kgdGjDrWNoIGvhur90IHF14bqjKio6IGPDonUgbOG7h25oICoqbGVuZ2h0aCoqIGNobyBiaeG6v3QgxJHhu5kgZMOgaSBiaeG6v24gKipWKiogbMOgIDIwMCAgCmBgYHtyfQp2YXIodnl2eTEkVW5pKQpgYGAKKipHaeG6o2kgdGjDrWNoIGvhur90IHF14bqjKio6IGPDonUgbOG7h25oICoqdmFyKiogY2hvIGJp4bq/dCDEkeG7mSBs4buHY2ggaGF5IGPDsm4gZ+G7jWkgbMOgIHBoxrDGoW5nIHNhaSBj4bunYSBiaeG6v24gKipVbmkqKiA3OTM1NzQuNAoKYGBge3J9CnNkKHZ5dnkxJFVuaSkKYGBgCioqR2nhuqNpIHRow61jaCBr4bq/dCBxdeG6oyoqOiBjw6J1IGzhu4duaCAqKnNkKiogY2hvIGJp4bq/dCDEkeG7mSBs4buHY2ggY2h14bqpbiBj4bunYSBiaeG6v24gKipVbmkqKiBsw6AgODkwLjgyNzkKCmBgYHtyfQptZWRpYW4odnl2eTEkVW5pKQpgYGAKKipHaeG6o2kgdGjDrWNoIGvhur90IHF14bqjKio6IEPDonUgbOG7h25oICoqbWVkaWFuKiogY2hvIGJp4bq/dCB0cnVuZyB24buLIGPhu6dhIFVuaSBsw6AgMTY1MSAsIG5naMSpYSBsw6AgNTAlIHPhu5Egc+G7kSBxdeG7kWMgZ2lhIG5o4buPIGjGoW4gMTY1MSB2w6AgNTAlIGPDsm4gbOG6oWkgbMOgIGzhu5tuIGjGoW4gMTY1MQoKCgoKCgoKCgoK