Mục tiêu bài nghiên cứu:

  • Đánh giá 53940 viên kim cương trên dữ liệu Diamonds:

    • CLARITY (Độ tinh khiết của kim cương)
    • COLOR (Màu của kim cương)
    • CARAT (Trọng lượng của kim cương)
    • CUT (Vết cắt của kim cương )
  • Gồm có 10 biến, đó là:

    • Price: Giá của viên kim cương (USD)
    • Carat: Trọng lượng của viên kim cương (carat)
    • Cut: Chất lượng của vết cắt (Fair, Good, Very Good, Excellent, Ideal)
    • Color: Màu sắc của viên kim cương(D,E,I,F,G,H)
    • Clarity: Độ trong của viên kim cương(VS2,VVS2,SI1,SI2,VS1,VVS1)
    • X: Độ dài của viên kim cương (mm)
    • Y: Độ rộng của viên kim cương (mm)
    • Z: Độ sâu của viên kim cương (mm)
    • Table: Chiều rộng của đỉnh kim cương so với điểm rộng nhất
    • Depth: Tỷ lệ phần trăm độ sâu

Tiến hành nghiên cứu:

Trước hết, ta cần phải gọi dữ liệu diamonds lên

h <- diamonds
  • Đổi tên biến cut trong dữ liệu diamonds, thay bằng tên loại để tránh bị nhầm lẫn khi đánh giá giữa loại của kim cương và vết cắt của kim cương
h <- rename(h, loai = cut)
datatable(h)

COLOR - Cấp độ màu của kim cương:

  • Cấp độ màu của kim cương nói một cách cụ thể là ta phân loại độ trong là của màu sắc:
    • Màu loại D, E và F có độ trong suốt gần như là tuyệt đối (Nên thường được được gọi là kim cương không màu)
    • Màu loại G,H,I,J có độ trong suốt cũng tương đối cao, rất khó để phân biệt được với các loại kim cương màu D,E,F vì chúng cũng gần như là kim cương không màu
h %>% group_by(color) %>% summarise(n = n()) %>%
  ggplot(aes(color,n)) +
    geom_col(fill='red') +
    geom_text(aes(label = n),vjust = 2, color = 'black') +
    xlab('Color') +
    ylab('Số lượng') +
    labs(title = 'Hình 1: Cấp độ màu của kim cương')

  • Qua hình trên ta thấy được:
    • Tỉ trọng giữa các màu của kim cương không đồng đều
    • Cấp độ màu G có số lượng lớn nhất là 11292 viên gấp 4 lần so với cấp độ màu J bé nhất là 2808 viên
    • Cấp độ màu E có 9797 viên
    • Cấp độ màu F, H, D có lần lượt là 9542, 8304, 6775 viên
    • Cấp độ màu I có 5422 viên

Biểu đồ phân loại màu của kim cương

h %>% group_by(color) %>% summarise(n = n()) %>%
  ggplot(aes(color,n)) +
    geom_col(fill='blue') +
    geom_text(aes(label = n),vjust = 2, color = 'yellow') +
    labs(x = 'Màu', y = 'Số lượng')

    labs(title =' Hình 1: Biểu đồ phân loại màu của kim cương') +
    coord_flip()
## NULL
  • Quan sát biểu đồ ta thấy:
    • Màu sắc của các kim cương phân bố không đồng đều
    • Số kim cương không màu chiếm phần lớn số lượng gồm: D, E, F có lần lượt là 6775, 9797, 9542 viên
    • Số kim cương màu G chiếm số lượng lớn nhất với 11292 viên
    • Số kim cương có màu nhưng rất ít( gần như không màu) chiếm phần nhỏ số lượng gồm: H, I, J có lần lượt là 8304, 5422, 2808 viên.

Biểu đồ thể hiện số lượng kim cương theo màu

h %>% group_by(color) %>% summarise(n=n()) %>%
  ggplot(aes(x = color,y = n)) +
    geom_col(position = 'dodge') +
    facet_wrap(~color) +
    geom_text(aes(label = n),vjust = 2, color = 'blue') +
    labs(x = 'Màu sắc', y = 'Số lượng') +
    labs(title = 'Hình 1: Tập hợp các biểu đồ thể hiện số lượng kim cương theo màu')

  • Quan sát biểu đồ ta thấy:
    • Tỉ trọng giữa các màu của kim cương không đồng đều
    • Cấp độ màu G có số lượng lớn nhất là 11292 viên gấp 4 lần so với cấp độ màu J bé nhất là 2808 viên
    • Cấp độ màu E có 9797 viên
    • Cấp độ màu F, H, D có lần lượt là 9542, 8304, 6775 viên
    • Cấp độ màu I có 5422 viên

Biểu đồ phân bổ số lượng màu của các kim cương(Biểu đồ ngang)

h %>% ggplot(aes(x = color)) +
    geom_bar() +
    labs(x = 'Màu sắc', y = 'Số lượng') +
    coord_flip() +
    labs(title = 'Hình 1: Biểu đồ phân bổ số lượng màu của các kim cương(biểu đồ ngang)')

  • Quan sát biểu đồ ta thấy:
    • Màu sắc của các kim cương phân bố không đồng đều. Cho thấy mức độ khan hiếm của từng loại màu của kim cương
    • Số kim cương màu G chiếm số lượng lớn nhất với hơn 11000 viên
    • Số kim cương có màu nhưng rất ít( gần như không màu) chiếm phần nhỏ số lượng gồm: H, I, J có lần lượt là hơn 8000viên, gần 5500 viên, gần 3000 viên.
    • Số kim cương không màu chiếm phần lớn số lượng gồm: D, E, F có lần lượt là hơn 6500 viên, gần 10000 viên, xấp xỉ 9500 viên

Biểu đồ thể hiện giá trị trung bình của số kim cương phân theo màu

h %>% group_by(loai) %>% summarise(m= mean(carat)) %>%
  ggplot(aes(x = loai,y = m)) +
    geom_col(position = 'dodge') +
    geom_text(aes(label = round(m,2)), vjust = 2, color = 'red') +
    labs(x = 'Màu', y = 'Mean') +
    labs(title = 'Hình 1: Biểu đồ thể hiện trung bình số kim cương theo màu')

  • Quan sát biểu đồ ta thấy
    • Mức độ phân bố trung bình các màu của kim cương tương đối đồng đều
    • Màu Fair có mức độ phân bố trung bình cao nhất 1,05
    • Màu Good, Very Good, Premiumcó mức độ phân bố trung bình gần 0,8 cụ thể lần lượt là: 0,85; 0,81; 0,89
    • Màu Ideal có mức độ phân bố trung bình thấp nhất chỉ nằm ở 0,7

Biểu đồ thể hiện tỉ lệ kim cương theo loại và màu

k <- h %>% group_by(loai, color) %>% summarise(n = n())
## `summarise()` has grouped output by 'loai'. You can override using the
## `.groups` argument.
k %>% ggplot(aes(x = loai, y = n)) +
  geom_col(data = k %>% filter(color == 'G'), fill = 'red') +
  geom_col(data = k %>% filter(color == 'H'), fill = 'blue')

  • Quan sát biểu đồ ta thấy:
    • k là một tập hợp mới thống kê số lượng kim cương theo loại và màu
    • Ta thấy số lượng kim cương màu H chiếm phần lớn trong tổng, số lượng kim cương màu G chỉ chiếm số ít
  • Cụ thể:
    • SỐ lượng kim cương màu G loại Ideal nhiều nhất với hơn 3000 viên trong khi đó cùng loại màu H chỉ gần 2000 viên
    • Số lượng kim cương màu G loại Fair chiếm phần lớn với hơn 300 viên trong khi đó cùng loại màu H gần như không có
    • SỐ lượng kim cương màu G loại VeryGoodchiếm trung bình với gần 2000 viên trong khi đó cùng loại màu H chỉ gần 500 viên

CUT - Vết cắt của kim cương (bao gồm: depth và table):

  • Vết cắt của viên kim cương trong tiêu chuẩn 4C thường bị nhầm lẫn với hình dạng thực sự của viên kim cương: Vết cắt (CUT) được đánh giá bằng các tỷ lệ chứ không phải về hình dạng, bao gồm

    • Mặt Bàn (table): Mặt bàn có hình lục giác, là bề mặt lớn nhất trên đỉnh của viên kim cương. Đo bằng milimét và sau đó chia cho đường kính trung bình của viên kim cương để lấy phần trăm (% table).

      • Đối với một viên kim cương tròn, 60% là tiêu chuẩn để giúp bạn so sánh vì đây là một kích thước mặt bàn kim cương đẹp.

      • Khi mặt bàn kim cương lớn hơn 65% được coi là lớn, là không còn là chỉ số tối ưu. Kích thước bảng dưới 60% được coi là nhiều hơn trong phạm vi “lý tưởng”, giảm xuống khoảng 53%. Dưới đó, bảng có thể được coi là quá nhỏ.

    • Chiều sâu (depth): Chiều sâu của viên kim cương có thể được tính bằng cách chia tổng chiều sâu từ đỉnh đến đáy của viên kim cương cho đường kính trung bình. Một lần nữa, 60% là tiêu chuẩn để đánh giá. Nếu viên kim cương quá sâu, nó có thể xuất hiện màu tối. Nếu viên kim cương quá nông, nó có thể mất độ sáng khi ánh sáng lọt ra ngoài. Thông thường, đối với một viên kim cương tròn, 57,5% đến 63% là phạm vi ưa thích.

h %>% group_by(table) %>% filter(table >= 53 & table <= 65) %>% summarise(n = n()) %>% 
  ggplot(aes(table,n)) +
    geom_col(fill='green') +
    xlab('Table') +
    ylab('Số lượng') +
    labs(title = 'Hình 1: Vết cắt table của kim cương')

  • Quan sát biểu đồ trên ta thấy được:
    • Mức độ phân bổ của các vết cắt kim cương ko đồng đều
    • Các viên kim cương có vết cắt nằm trong khoảng từ 55 đến 60 chiếm số lượng lớn nhất với hơn 30000 viên. Cụ thể là: Vết cắt ở 55,75 và 56,6 chiếm số lượng lớn nhất với hơn 19000 viên
    • Các viên kim cương có vết cắt nằm trong khoảng từ 52,5 đến dưới 55 chiếm số lượng tương đối nhỏ với hơn 3000 viên.
    • Các viên kim cương có vết cắt nằm trong khoảng từ 60 đến dưới 65 chiếm số lượng nhỏ nhất với hơn 4000 viên. Cụ thể là: Vết cắt ở 65 chiếm số lượng nhỏ nhất với chỉ khoảng 200 viên

##Cut: Vết cắt của kim cương

h %>% ggplot(aes(x = loai)) +
    geom_bar() +
    labs(x = 'Loại', y = 'Số lượng') +
    coord_flip() +
    labs(title = 'Hình 1: Vết cắt của kim cương(biểu đồ ngang)')

  • Quan sát biểu đồ trên ta thấy được:
    • Mức độ phân bổ của các loại kim cương ko đồng đều
    • Các viên kim cương loại Ideal có số lượng lớn nhất với hơn 20000 viên.
    • Các viên kim cương loại Fair có số lượng ít nhất với hơn 2500 viên.
    • Các viên kim cương loại Good, Verygood, Premium có số lượng trung bình với lần lượt là 5000, 12500, 13000 viên

Biểu đồ phân loại kim cương

h %>% group_by(loai) %>% summarise(n = n()) %>%
  ggplot(aes(loai,n)) +
    geom_col(fill='grey') +
    geom_text(aes(label = n),vjust = 2, color = 'red') +
    labs(x = 'Loại', y = 'Số lượng') +
    labs(title =' Hình 1: Biểu đồ phân loại kim cương')

  • Quan sát biểu đồ ta thấy:
    • Mức độ phân bố kim cương theo các loại không đồng đều
    • Số lượng kim cương loại Ideal nhiều nhất với 21551 viên
    • Số lượng kim cương loại Fair ít nhất với 1610 viên ít hơn 13 lần so với loại Ideal
    • Số lượng kim cương loại Good, Verygood, Premium có số lượng tăng dần lần lượt là: 4906 viên, 12082 viên, 13791 viên

Biểu đồ thể hiện tỉ lệ kim cương theo loại và màu

k <- h %>% group_by(loai, color) %>% summarise(n = n())
## `summarise()` has grouped output by 'loai'. You can override using the
## `.groups` argument.
k %>% ggplot(aes(x = loai, y = n)) +
  geom_col(data = k %>% filter(color == 'G'), fill = 'green') +
  geom_col(data = k %>% filter(color == 'H'), fill = 'grey')

Biểu đồ tỉ số loại kim cương

h %>% group_by(loai) %>% summarise(n = n()) %>%
  ggplot(aes(loai,n)) +
    geom_col(fill='beige') +
    geom_text(aes(label = percent(n/length(h$carat))),vjust = 2, color = 'red') +
    labs(x = 'Loại', y = 'Số lượng') +
    labs(title =' Hình1: Biểu đồ tỉ số các loại kim cương')

  • Quan sát biểu đồ ta thấy:
    • Các loại kim cương phân bố không đồng đều
    • Số lượng kim cương loại Ideal nhiều nhất chiếm hơn 40%
    • Số lượng kim cương loại Fair ít nhất chiếm chỉ hơn 3% ít hơn 13 lần so với loại Ideal
    • Số lượng kim cương loại Good, Verygood, Premium có số lượng tăng dần lần lượt là: 9,1%, 22,4%; 25,6%

Biểu đồ thể hiện trung bình giá kim cương theo loại

h %>% group_by(loai,color) %>% summarise(m = mean(price)) %>%
  ggplot(aes(x = loai,y = m)) +
    geom_col(position = 'dodge') +
    facet_wrap(~color) +
    geom_text(aes(label = round(m))) +
    labs(x = 'Loại', y = 'Số lượng') +
    labs(title = 'Hình 1: Biểu đồ thể hiện trung bình giá kim cương theo loại')
## `summarise()` has grouped output by 'loai'. You can override using the
## `.groups` argument.

Tập hợp các biểu đồ thể hiện tỉ lệ kim cương theo loại

h %>% group_by(loai,color) %>% summarise(n=n()) %>%
  ggplot(aes(x = loai,y = n)) +
    geom_col(position = 'dodge') +
    facet_wrap(~color) +
    geom_text(aes(label = n),vjust = 2, color = 'blue') +
    labs(x = 'Loại', y = 'Số lượng') +
    labs(title = 'Hình 1: Tập hợp các biểu đồ thể hiện tỉ lệ kim cương theo loại')
## `summarise()` has grouped output by 'loai'. You can override using the
## `.groups` argument.

CLARITY - Đánh giá cấp độ tinh khiết của kim cương:

  • Trong tiêu chuẩn 4C, độ tinh khiết của kim cương là số lượng và khả năng hiển thị của các đặc điểm bên trong và bên ngoài của một viên kim cương.

    • Các đặc điểm bên trong được gọi là “Inclusions” hay dịch một cách tổng quát là các tỳ vết bao bên trong.

    • Các đặc điểm bên ngoài được giới hạn trên bề mặt của vết cắt của viên kim cương.

  • Cấp độ trong cao nhất là Hoàn mỹ, được ký hiệu là IF (Internal Flawless): Những viên kim cương này không có tạp chất tỳ vết nào được nhìn thấy dưới độ phóng đại 10 lần.

  • Hai lớp tiếp theo được nhóm lại với nhau là VVS1VVS2: Những viên kim cương này được định nghĩa là rất rất ít tỳ vết bên trong, gồm cấp độ thứ nhất (VVS1) hoặc thứ hai (VVS2).

  • Tiếp theo là các cấp độ tinh khiết VS1VS2: Các đầu kim (needle) và vết lông vũ nhỏ (small feather) có thể được tìm thấy trong các lớp VS1 và VS2 này nhưng chúng vẫn rất nhỏ so với kích thước của viên kim cương.

  • Cấp độ mà tỳ vết hoặc tạp chất có thể nhìn thấy rõ ràng là SI1SI2: Tạp chất dễ nhìn thấy dưới độ phóng đại ký loupe cầm tay nhưng thường không thể nhìn thấy bằng mắt thường.

  • Phạm vi cấp độ rõ ràng cuối cùng là I1: Các tạp chất có thể lớn hơn trong tự nhiên, có thể sẫm màu và có thể nhìn thấy bằng mắt trong số các thuộc tính có thể có khác.

h %>% group_by(clarity) %>% summarise(n = n()) %>%
  ggplot(aes(clarity,n)) +
    geom_col(fill='grey') +
    geom_text(aes(label = n),vjust = 2, color = 'white') +
    xlab('Độ tinh khiết') +
    ylab('Số lượng') +
    labs(title = 'Hình 1: Cấp độ tinh khiết của kim cương')

-Qua hình trên ta thấy được: - Cấp độ tinh khiết của kim cương có sự phân hoá không đồng đều (Cấp SI1=13065 lớn hơn nhiều so với cấp I1= 741) - Cấp độ tinh khiết của kim cương cao thứ 2 là VS2= 12258 - Cấp độ tinh khiết của kim cương cao thứ 3 là SI2= 9194 - Cấp độ tinh khiết của kim cương cao thứ 4,5,6,7 lần lượt là VS1= 8171, VVS2= 5066, VVS1= 3655, IF= 1790

Cấp độ tinh khiết của kim cương (biểu đồ ngang)

h %>% ggplot(aes(x = clarity)) +
    geom_bar() +
    labs(x = 'Cấp độ tinh khiết', y = 'Số lượng') +
    coord_flip() +
    labs(title = 'Hình 1: Cấp độ tinh khiết của kim cương (biểu đồ ngang)')

- Quan sát biểu đồ ta thấy: - Cấp độ tinh khiết của kim cương có sự phân hoá không đồng đều (Cấp SI1 lớn hơn nhiều so với cấp I1) - Cấp độ tinh khiết của kim cương cao thứ 2 là VS2 hơn 12000 viên - Cấp độ tinh khiết của kim cương cao thứ 3 là SI2 hơn 9000 viên - Cấp độ tinh khiết của kim cương cao thứ 4,5,6,7 lần lượt là VS1 hơn 8000 viên, VVS2 hơn 5000 viên, VVS1 hơn 3500 viên, IF hơn 1700 viên

Biểu đồ cấp độ tinh khiết của kim cương

h %>% group_by(clarity) %>% summarise(n = n()) %>%
  ggplot(aes(clarity,n)) +
    geom_col(fill='white') +
    geom_text(aes(label = n),vjust = 2, color = 'black') +
    labs(x = 'Cấp độ tinh khiết', y = 'Số lượng')

    labs(title =' Hình 1: Biểu đồ phân loại cấp độ tinh khiết của kim cương') +
    coord_flip()
## NULL

-Quan sát biểu đồ ta thấy được: - Cấp độ tinh khiết của kim cương có sự phân hoá không đồng đều (Cấp SI1=13065 lớn hơn nhiều so với cấp I1= 741) - Cấp độ tinh khiết của kim cương cao thứ 2 là VS2= 12258 - Cấp độ tinh khiết của kim cương cao thứ 3 là SI2= 9194 - Cấp độ tinh khiết của kim cương cao thứ 4,5,6,7 lần lượt là VS1= 8171, VVS2= 5066, VVS1= 3655, IF= 1790

Tập hợp các biểu đồ thể hiện số lượng kim cương theo cấp độ tinh khiết

h %>% group_by(clarity,color) %>% summarise(n=n()) %>%
  ggplot(aes(x = clarity,y = n)) +
    geom_col(position = 'dodge') +
    facet_wrap(~color) +
    labs(x = 'Độ tinh khiết', y = 'Số lượng') +
    labs(title = 'Hình 1: Tập hợp các biểu đồ thể hiện số lượng kim cương theo cấp độ tinh khiết')
## `summarise()` has grouped output by 'clarity'. You can override using the
## `.groups` argument.

Tập hợp các biểu đồ thể hiện tỉ lệ kim cương theo độ tinh khiết

h %>% group_by(clarity,color) %>% summarise(n=n()) %>%
  ggplot(aes(x = clarity,y = n)) +
    geom_col(position = 'dodge') +
    facet_wrap(~color) +
    geom_text(aes(label = n),vjust = 2, color = 'blue') +
    labs(x = 'Độ tinh khiết', y = 'Số lượng') +
    labs(title = 'Hình 1: Tập hợp các biểu đồ thể hiện số lượng kim cương theo độ tinh khiết')
## `summarise()` has grouped output by 'clarity'. You can override using the
## `.groups` argument.

Biểu đồ thể hiện trung bình giá kim cương theo độ tinh khiết

h %>% group_by(clarity,color) %>% summarise(m = mean(price)) %>%
  ggplot(aes(x = clarity,y = m)) +
    geom_col(position = 'dodge') +
    facet_wrap(~color) +
    geom_text(aes(label = round(m))) +
    labs(x = 'Loại', y = 'Số lượng') +
    labs(title = 'Hình 1: Biểu đồ thể hiện trung bình giá kim cương theo độ tinh khiết')
## `summarise()` has grouped output by 'clarity'. You can override using the
## `.groups` argument.

CARAT - Trọng lượng của kim cương:

  • Trọng lượng carat của viên kim cương được xác định bằng cách cân viên kim cương trên một chiếc cân điện tử chính xác. Một carat bằng 1/5 gam, vì vậy một gam sẽ bằng năm carat.

  • Số carat thường được giữ hai số thập phân cuối cùng, ví dụ như 1.53 , 1.00 , 2.93 carat. Vì vậy, một viên kim cương một nửa carat sẽ được biểu thị bằng 0,50 carat, một viên kim cương một carat sẽ được biểu thị bằng 1,00.

  • Trọng lượng chính xác là rất quan trọng vì việc định giá dựa trên trọng lượng này và có sự khác biệt đáng kể về giá cả đôi khi chỉ hơn một phần trăm carat. Một viên kim cương nặng 0,99 carat có giá thấp hơn một viên kim cương nặng 1,00 carat. Tuy nhiên nếu nhìn bằng mắt thường bạn sẽ không phân biệt được sự khác biệt này.

h %>% group_by(carat) %>% filter(carat >= 0.23 & carat <= 2.05) %>% summarise(n = n()) %>%
  ggplot(aes(carat,n)) +
    geom_col(fill='blue') +
    xlab('Carat') +
    ylab('Số lượng') +
    labs(title = 'Hình 1: Trọng lượng của kim cương')

Qua hình trên ta thấy được: - Ta thấy trọng lượng của kim cương phân bố không đồng đều. Đa số tập trung ở mức từ 0,3-1,6 carat - Các mức trọng lượng chiếm phần lớn là 0,3 ; 0,65 và 1 carat - Các mức trọng lượng chiếm số lượng ít nhất là từ 1,6- 1,9

LS0tCnRpdGxlOiAiTmhp4buHbSB24bulIDQiCmF1dGhvcjogIlBo4bqhbSBYdcOibiBIb2FuIgpkYXRlOiAiYHIgZm9ybWF0KFN5cy50aW1lKCksICclSDolTTolUywgJWQgLSAlbSAtICVZJylgIgpvdXRwdXQ6CiAgaHRtbF9kb2N1bWVudDoKICAgIGNvZGVfZG93bmxvYWQ6IHRydWUKICAgIGNvZGVfZm9sZGluZzogc2hvdwogICAgdGhlbWU6ICJkZWZhdWx0IgogICAgdG9jX2RlcHRoOiAzCiAgICB0b2NfZmxvYXQ6IHRydWUKICAgIHRvYzogdHJ1ZQotLS0KCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IFRSVUUpCmxpYnJhcnkoZHBseXIpCmxpYnJhcnkodGlkeXZlcnNlKQpsaWJyYXJ5KHNjYWxlcykKbGlicmFyeShEVCkKYGBgCgogCiMgTeG7pWMgdGnDqnUgYsOgaSBuZ2hpw6puIGPhu6l1OgotIMSQw6FuaCBnacOhIDUzOTQwIHZpw6puIGtpbSBjxrDGoW5nIHRyw6puIGThu68gbGnhu4d1IERpYW1vbmRzOgogIAogIC0gKipDTEFSSVRZKiogKMSQ4buZIHRpbmgga2hp4bq/dCBj4bunYSBraW0gY8awxqFuZykKICAtICoqQ09MT1IqKiAoTcOgdSBj4bunYSBraW0gY8awxqFuZykgIAogIC0gKipDQVJBVCoqIChUcuG7jW5nIGzGsOG7o25nIGPhu6dhIGtpbSBjxrDGoW5nKQogIC0gKipDVVQqKiAoVuG6v3QgY+G6r3QgY+G7p2Ega2ltIGPGsMahbmcgKQogIAotIEfhu5NtIGPDsyAxMCBiaeG6v24sIMSRw7MgbMOgOgogIC0gKipQcmljZSoqOiBHacOhIGPhu6dhIHZpw6puIGtpbSBjxrDGoW5nIChVU0QpCiAgLSAqKkNhcmF0Kio6IFRy4buNbmcgbMaw4bujbmcgY+G7p2EgdmnDqm4ga2ltIGPGsMahbmcgKGNhcmF0KQogIC0gKipDdXQqKjogQ2jhuqV0IGzGsOG7o25nIGPhu6dhIHbhur90IGPhuq90IChGYWlyLCBHb29kLCBWZXJ5IEdvb2QsIEV4Y2VsbGVudCwgSWRlYWwpCiAgLSAqKkNvbG9yKio6IE3DoHUgc+G6r2MgY+G7p2EgdmnDqm4ga2ltIGPGsMahbmcoRCxFLEksRixHLEgpCiAgLSAqKkNsYXJpdHkqKjogxJDhu5kgdHJvbmcgY+G7p2EgdmnDqm4ga2ltIGPGsMahbmcoVlMyLFZWUzIsU0kxLFNJMixWUzEsVlZTMSkKICAtICoqWCoqOiDEkOG7mSBkw6BpIGPhu6dhIHZpw6puIGtpbSBjxrDGoW5nIChtbSkKICAtICoqWSoqOiDEkOG7mSBy4buZbmcgY+G7p2EgdmnDqm4ga2ltIGPGsMahbmcgKG1tKQogIC0gKipaKio6IMSQ4buZIHPDonUgY+G7p2EgdmnDqm4ga2ltIGPGsMahbmcgKG1tKQogIC0gKipUYWJsZSoqOiBDaGnhu4F1IHLhu5luZyBj4bunYSDEkeG7iW5oIGtpbSBjxrDGoW5nIHNvIHbhu5tpIMSRaeG7g20gcuG7mW5nIG5o4bqldAogIC0gKipEZXB0aCoqOiBU4bu3IGzhu4cgcGjhuqduIHRyxINtIMSR4buZIHPDonUKCiMgVGnhur9uIGjDoG5oIG5naGnDqm4gY+G7qXU6ClRyxrDhu5tjIGjhur90LCB0YSBj4bqnbiBwaOG6o2kgZ+G7jWkgZOG7ryBsaeG7h3UgZGlhbW9uZHMgbMOqbiAKYGBge3IgZWNobz1UUlVFLCB3YXJuaW5nPUZBTFNFfQpoIDwtIGRpYW1vbmRzCmBgYAoKLSDEkOG7lWkgdMOqbiBiaeG6v24gKipjdXQqKiB0cm9uZyBk4buvIGxp4buHdSBkaWFtb25kcywgdGhheSBi4bqxbmcgdMOqbiAqKmxv4bqhaSoqIMSR4buDIHRyw6FuaCBi4buLIG5o4bqnbSBs4bqrbiBraGkgxJHDoW5oIGdpw6EgZ2nhu69hIGxv4bqhaSBj4bunYSBraW0gY8awxqFuZyB2w6AgduG6v3QgY+G6r3QgY+G7p2Ega2ltIGPGsMahbmcgCmBgYHtyIGVjaG89VFJVRSwgd2FybmluZz1GQUxTRX0KaCA8LSByZW5hbWUoaCwgbG9haSA9IGN1dCkKZGF0YXRhYmxlKGgpCmBgYAoKIyBDT0xPUiAtIEPhuqVwIMSR4buZIG3DoHUgY+G7p2Ega2ltIGPGsMahbmc6IAotIEPhuqVwIMSR4buZIG3DoHUgY+G7p2Ega2ltIGPGsMahbmcgbsOzaSBt4buZdCBjw6FjaCBj4bulIHRo4buDIGzDoCB0YSBwaMOibiBsb+G6oWkgxJHhu5kgdHJvbmcgbMOgIGPhu6dhIG3DoHUgc+G6r2M6CiAgLSBNw6B1IGxv4bqhaSAqKkQsIEUgdsOgIEYqKiBjw7MgxJHhu5kgdHJvbmcgc3Xhu5F0IGfhuqduIG5oxrAgbMOgIHR1eeG7h3QgxJHhu5FpIChOw6puIHRoxrDhu51uZyDEkcaw4bujYyDEkcaw4bujYyBn4buNaSBsw6Aga2ltIGPGsMahbmcga2jDtG5nIG3DoHUpCiAgLSBNw6B1IGxv4bqhaSAqKkcsSCxJLEoqKiBjw7MgxJHhu5kgdHJvbmcgc3Xhu5F0IGPFqW5nIHTGsMahbmcgxJHhu5FpIGNhbywgcuG6pXQga2jDsyDEkeG7gyBwaMOibiBiaeG7h3QgxJHGsOG7o2MgduG7m2kgY8OhYyBsb+G6oWkga2ltIGPGsMahbmcgbcOgdSAqKkQsRSxGKiogdsOsIGNow7puZyBjxaluZyBn4bqnbiBuaMawIGzDoCBraW0gY8awxqFuZyBraMO0bmcgbcOgdSAKICAKYGBge3IgZWNobz1UUlVFLCB3YXJuaW5nPUZBTFNFfQpoICU+JSBncm91cF9ieShjb2xvcikgJT4lIHN1bW1hcmlzZShuID0gbigpKSAlPiUKICBnZ3Bsb3QoYWVzKGNvbG9yLG4pKSArCiAgICBnZW9tX2NvbChmaWxsPSdyZWQnKSArCiAgICBnZW9tX3RleHQoYWVzKGxhYmVsID0gbiksdmp1c3QgPSAyLCBjb2xvciA9ICdibGFjaycpICsKICAgIHhsYWIoJ0NvbG9yJykgKwogICAgeWxhYignU+G7kSBsxrDhu6NuZycpICsKICAgIGxhYnModGl0bGUgPSAnSMOsbmggMTogQ+G6pXAgxJHhu5kgbcOgdSBj4bunYSBraW0gY8awxqFuZycpCmBgYAoKLSBRdWEgaMOsbmggdHLDqm4gdGEgdGjhuqV5IMSRxrDhu6NjOgogIC0gVOG7iSB0cuG7jW5nIGdp4buvYSBjw6FjIG3DoHUgY+G7p2Ega2ltIGPGsMahbmcga2jDtG5nIMSR4buTbmcgxJHhu4F1CiAgLSBD4bqlcCDEkeG7mSBtw6B1ICoqRyoqIGPDsyBz4buRIGzGsOG7o25nIGzhu5tuIG5o4bqldCBsw6AgMTEyOTIgdmnDqm4gZ+G6pXAgNCBs4bqnbiBzbyB24bubaSBj4bqlcCDEkeG7mSBtw6B1IEogYsOpIG5o4bqldCBsw6AgMjgwOCB2acOqbgogIC0gQ+G6pXAgxJHhu5kgbcOgdSAqKkUqKiBjw7MgOTc5NyB2acOqbiAKICAtIEPhuqVwIMSR4buZIG3DoHUgKipGKiosIEgsIEQgY8OzIGzhuqduIGzGsOG7o3QgbMOgIDk1NDIsIDgzMDQsIDY3NzUgdmnDqm4KICAtIEPhuqVwIMSR4buZIG3DoHUgKipJKiogY8OzIDU0MjIgdmnDqm4gCgojIyBCaeG7g3UgxJHhu5MgcGjDom4gbG/huqFpIG3DoHUgY+G7p2Ega2ltIGPGsMahbmcKYGBge3IgZWNobz1UUlVFLCB3YXJuaW5nPUZBTFNFfQpoICU+JSBncm91cF9ieShjb2xvcikgJT4lIHN1bW1hcmlzZShuID0gbigpKSAlPiUKICBnZ3Bsb3QoYWVzKGNvbG9yLG4pKSArCiAgICBnZW9tX2NvbChmaWxsPSdibHVlJykgKwogICAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IG4pLHZqdXN0ID0gMiwgY29sb3IgPSAneWVsbG93JykgKwogICAgbGFicyh4ID0gJ03DoHUnLCB5ID0gJ1Phu5EgbMaw4bujbmcnKQogICAgbGFicyh0aXRsZSA9JyBIw6xuaCAxOiBCaeG7g3UgxJHhu5MgcGjDom4gbG/huqFpIG3DoHUgY+G7p2Ega2ltIGPGsMahbmcnKSArCiAgICBjb29yZF9mbGlwKCkKYGBgCgotIFF1YW4gc8OhdCBiaeG7g3UgxJHhu5MgdGEgdGjhuqV5OgogIC0gTcOgdSBz4bqvYyBj4bunYSBjw6FjIGtpbSBjxrDGoW5nIHBow6JuIGLhu5Ega2jDtG5nIMSR4buTbmcgxJHhu4F1IAogIC0gU+G7kSBraW0gY8awxqFuZyBraMO0bmcgbcOgdSBjaGnhur9tIHBo4bqnbiBs4bubbiBz4buRIGzGsOG7o25nIGfhu5NtOiAqKkQsIEUsIEYqKiBjw7MgbOG6p24gbMaw4bujdCBsw6AgNjc3NSwgOTc5NywgOTU0MiB2acOqbiAKICAtIFPhu5Ega2ltIGPGsMahbmcgbcOgdSAqKkcqKiBjaGnhur9tIHPhu5EgbMaw4bujbmcgbOG7m24gbmjhuqV0IHbhu5tpIDExMjkyIHZpw6puIAogIC0gU+G7kSBraW0gY8awxqFuZyBjw7MgbcOgdSBuaMawbmcgcuG6pXQgw610KCBn4bqnbiBuaMawIGtow7RuZyBtw6B1KSBjaGnhur9tIHBo4bqnbiBuaOG7jyBz4buRIGzGsOG7o25nIGfhu5NtOiAqKkgsIEksIEoqKiBjw7MgbOG6p24gbMaw4bujdCBsw6AgODMwNCwgNTQyMiwgMjgwOCB2acOqbi4KCiMjIEJp4buDdSDEkeG7kyB0aOG7gyBoaeG7h24gc+G7kSBsxrDhu6NuZyBraW0gY8awxqFuZyB0aGVvIG3DoHUgCmBgYHtyIGVjaG89VFJVRSwgd2FybmluZz1GQUxTRX0KaCAlPiUgZ3JvdXBfYnkoY29sb3IpICU+JSBzdW1tYXJpc2Uobj1uKCkpICU+JQogIGdncGxvdChhZXMoeCA9IGNvbG9yLHkgPSBuKSkgKwogICAgZ2VvbV9jb2wocG9zaXRpb24gPSAnZG9kZ2UnKSArCiAgICBmYWNldF93cmFwKH5jb2xvcikgKwogICAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IG4pLHZqdXN0ID0gMiwgY29sb3IgPSAnYmx1ZScpICsKICAgIGxhYnMoeCA9ICdNw6B1IHPhuq9jJywgeSA9ICdT4buRIGzGsOG7o25nJykgKwogICAgbGFicyh0aXRsZSA9ICdIw6xuaCAxOiBU4bqtcCBo4bujcCBjw6FjIGJp4buDdSDEkeG7kyB0aOG7gyBoaeG7h24gc+G7kSBsxrDhu6NuZyBraW0gY8awxqFuZyB0aGVvIG3DoHUnKQpgYGAKCi0gUXVhbiBzw6F0IGJp4buDdSDEkeG7kyB0YSB0aOG6pXk6CiAgLSBU4buJIHRy4buNbmcgZ2nhu69hIGPDoWMgbcOgdSBj4bunYSBraW0gY8awxqFuZyBraMO0bmcgxJHhu5NuZyDEkeG7gXUKICAtIEPhuqVwIMSR4buZIG3DoHUgKipHKiogY8OzIHPhu5EgbMaw4bujbmcgbOG7m24gbmjhuqV0IGzDoCAxMTI5MiB2acOqbiBn4bqlcCA0IGzhuqduIHNvIHbhu5tpIGPhuqVwIMSR4buZIG3DoHUgSiBiw6kgbmjhuqV0IGzDoCAyODA4IHZpw6puCiAgLSBD4bqlcCDEkeG7mSBtw6B1ICoqRSoqIGPDsyA5Nzk3IHZpw6puIAogIC0gQ+G6pXAgxJHhu5kgbcOgdSAqKkYqKiwgSCwgRCBjw7MgbOG6p24gbMaw4bujdCBsw6AgOTU0MiwgODMwNCwgNjc3NSB2acOqbgogIC0gQ+G6pXAgxJHhu5kgbcOgdSAqKkkqKiBjw7MgNTQyMiB2acOqbiAKCiMjIEJp4buDdSDEkeG7kyBwaMOibiBi4buVIHPhu5EgbMaw4bujbmcgbcOgdSBj4bunYSBjw6FjIGtpbSBjxrDGoW5nKEJp4buDdSDEkeG7kyBuZ2FuZykKYGBge3IgZWNobz1UUlVFLCB3YXJuaW5nPUZBTFNFfQpoICU+JSBnZ3Bsb3QoYWVzKHggPSBjb2xvcikpICsKICAgIGdlb21fYmFyKCkgKwogICAgbGFicyh4ID0gJ03DoHUgc+G6r2MnLCB5ID0gJ1Phu5EgbMaw4bujbmcnKSArCiAgICBjb29yZF9mbGlwKCkgKwogICAgbGFicyh0aXRsZSA9ICdIw6xuaCAxOiBCaeG7g3UgxJHhu5MgcGjDom4gYuG7lSBz4buRIGzGsOG7o25nIG3DoHUgY+G7p2EgY8OhYyBraW0gY8awxqFuZyhiaeG7g3UgxJHhu5MgbmdhbmcpJykKYGBgCgotIFF1YW4gc8OhdCBiaeG7g3UgxJHhu5MgdGEgdGjhuqV5OgogIC0gTcOgdSBz4bqvYyBj4bunYSBjw6FjIGtpbSBjxrDGoW5nIHBow6JuIGLhu5Ega2jDtG5nIMSR4buTbmcgxJHhu4F1LiBDaG8gdGjhuqV5IG3hu6ljIMSR4buZIGtoYW4gaGnhur9tIGPhu6dhIHThu6tuZyBsb+G6oWkgbcOgdSBj4bunYSBraW0gY8awxqFuZyAKICAtIFPhu5Ega2ltIGPGsMahbmcgbcOgdSAqKkcqKiBjaGnhur9tIHPhu5EgbMaw4bujbmcgbOG7m24gbmjhuqV0IHbhu5tpIGjGoW4gMTEwMDAgdmnDqm4gCiAgLSBT4buRIGtpbSBjxrDGoW5nIGPDsyBtw6B1IG5oxrBuZyBy4bqldCDDrXQoIGfhuqduIG5oxrAga2jDtG5nIG3DoHUpIGNoaeG6v20gcGjhuqduIG5o4buPIHPhu5EgbMaw4bujbmcgZ+G7k206ICoqSCwgSSwgSioqIGPDsyBs4bqnbiBsxrDhu6N0IGzDoCBoxqFuIDgwMDB2acOqbiwgZ+G6p24gNTUwMCB2acOqbiwgZ+G6p24gMzAwMCB2acOqbi4KICAtIFPhu5Ega2ltIGPGsMahbmcga2jDtG5nIG3DoHUgY2hp4bq/bSBwaOG6p24gbOG7m24gc+G7kSBsxrDhu6NuZyBn4buTbTogKipELCBFLCBGKiogY8OzIGzhuqduIGzGsOG7o3QgbMOgIGjGoW4gNjUwMCB2acOqbiwgZ+G6p24gMTAwMDAgdmnDqm4sIHjhuqVwIHjhu4kgOTUwMCB2acOqbgoKIyMgQmnhu4N1IMSR4buTIHRo4buDIGhp4buHbiBnacOhIHRy4buLIHRydW5nIGLDrG5oIGPhu6dhIHPhu5Ega2ltIGPGsMahbmcgcGjDom4gdGhlbyBtw6B1CmBgYHtyIGVjaG89VFJVRSwgd2FybmluZz1GQUxTRX0KaCAlPiUgZ3JvdXBfYnkobG9haSkgJT4lIHN1bW1hcmlzZShtPSBtZWFuKGNhcmF0KSkgJT4lCiAgZ2dwbG90KGFlcyh4ID0gbG9haSx5ID0gbSkpICsKICAgIGdlb21fY29sKHBvc2l0aW9uID0gJ2RvZGdlJykgKwogICAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IHJvdW5kKG0sMikpLCB2anVzdCA9IDIsIGNvbG9yID0gJ3JlZCcpICsKICAgIGxhYnMoeCA9ICdNw6B1JywgeSA9ICdNZWFuJykgKwogICAgbGFicyh0aXRsZSA9ICdIw6xuaCAxOiBCaeG7g3UgxJHhu5MgdGjhu4MgaGnhu4duIHRydW5nIGLDrG5oIHPhu5Ega2ltIGPGsMahbmcgdGhlbyBtw6B1JykKYGBgCgotIFF1YW4gc8OhdCBiaeG7g3UgxJHhu5MgdGEgdGjhuqV5IAogIC0gTeG7qWMgxJHhu5kgcGjDom4gYuG7kSB0cnVuZyBiw6xuaCBjw6FjIG3DoHUgY+G7p2Ega2ltIGPGsMahbmcgdMawxqFuZyDEkeG7kWkgxJHhu5NuZyDEkeG7gXUgCiAgLSBNw6B1ICoqRmFpcioqIGPDsyBt4bupYyDEkeG7mSBwaMOibiBi4buRIHRydW5nIGLDrG5oIGNhbyBuaOG6pXQgMSwwNQogIC0gTcOgdSAqKkdvb2QqKiwgKipWZXJ5IEdvb2QqKiwgKipQcmVtaXVtKipjw7MgbeG7qWMgxJHhu5kgcGjDom4gYuG7kSB0cnVuZyBiw6xuaCBn4bqnbiAwLDggY+G7pSB0aOG7gyBs4bqnbiBsxrDhu6N0IGzDoDogMCw4NTsgMCw4MTsgMCw4OQogIC0gTcOgdSAqKklkZWFsKiogY8OzIG3hu6ljIMSR4buZIHBow6JuIGLhu5EgdHJ1bmcgYsOsbmggdGjhuqVwIG5o4bqldCBjaOG7iSBu4bqxbSDhu58gMCw3CiAgCiMjIEJp4buDdSDEkeG7kyB0aOG7gyBoaeG7h24gdOG7iSBs4buHIGtpbSBjxrDGoW5nIHRoZW8gbG/huqFpIHbDoCBtw6B1CmBgYHtyIGVjaG89VFJVRSwgd2FybmluZz1GQUxTRX0KayA8LSBoICU+JSBncm91cF9ieShsb2FpLCBjb2xvcikgJT4lIHN1bW1hcmlzZShuID0gbigpKQprICU+JSBnZ3Bsb3QoYWVzKHggPSBsb2FpLCB5ID0gbikpICsKICBnZW9tX2NvbChkYXRhID0gayAlPiUgZmlsdGVyKGNvbG9yID09ICdHJyksIGZpbGwgPSAncmVkJykgKwogIGdlb21fY29sKGRhdGEgPSBrICU+JSBmaWx0ZXIoY29sb3IgPT0gJ0gnKSwgZmlsbCA9ICdibHVlJykKYGBgCgotIFF1YW4gc8OhdCBiaeG7g3UgxJHhu5MgdGEgdGjhuqV5OgogIC0gayBsw6AgbeG7mXQgdOG6rXAgaOG7o3AgbeG7m2kgdGjhu5FuZyBrw6ogc+G7kSBsxrDhu6NuZyBraW0gY8awxqFuZyB0aGVvIGxv4bqhaSB2w6AgbcOgdSAKICAtIFRhIHRo4bqleSBz4buRIGzGsOG7o25nIGtpbSBjxrDGoW5nIG3DoHUgSCBjaGnhur9tIHBo4bqnbiBs4bubbiB0cm9uZyB04buVbmcsIHPhu5EgbMaw4bujbmcga2ltIGPGsMahbmcgbcOgdSBHIGNo4buJIGNoaeG6v20gc+G7kSDDrXQgCi0gQ+G7pSB0aOG7gzogCiAgLSBT4buQIGzGsOG7o25nIGtpbSBjxrDGoW5nIG3DoHUgRyBsb+G6oWkgKipJZGVhbCoqIG5oaeG7gXUgbmjhuqV0IHbhu5tpIGjGoW4gMzAwMCB2acOqbiB0cm9uZyBraGkgxJHDsyBjw7luZyBsb+G6oWkgbcOgdSBIIGNo4buJIGfhuqduIDIwMDAgdmnDqm4KICAtIFPhu5EgbMaw4bujbmcga2ltIGPGsMahbmcgbcOgdSBHIGxv4bqhaSAqKkZhaXIqKiBjaGnhur9tIHBo4bqnbiBs4bubbiB24bubaSBoxqFuIDMwMCB2acOqbiB0cm9uZyBraGkgxJHDsyBjw7luZyBsb+G6oWkgbcOgdSBIIGfhuqduIG5oxrAga2jDtG5nIGPDswogIC0gU+G7kCBsxrDhu6NuZyBraW0gY8awxqFuZyBtw6B1IEcgbG/huqFpICoqVmVyeUdvb2QqKmNoaeG6v20gdHJ1bmcgYsOsbmggduG7m2kgZ+G6p24gMjAwMCB2acOqbiB0cm9uZyBraGkgxJHDsyBjw7luZyBsb+G6oWkgbcOgdSBIIGNo4buJIGfhuqduIDUwMCB2acOqbgogIAojIENVVCAtIFbhur90IGPhuq90IGPhu6dhIGtpbSBjxrDGoW5nIChiYW8gZ+G7k206IGRlcHRoIHbDoCB0YWJsZSk6Ci0gVuG6v3QgY+G6r3QgY+G7p2EgdmnDqm4ga2ltIGPGsMahbmcgdHJvbmcgdGnDqnUgY2h14bqpbiA0QyB0aMaw4budbmcgYuG7iyBuaOG6p20gbOG6q24gduG7m2kgaMOsbmggZOG6oW5nIHRo4buxYyBz4buxIGPhu6dhIHZpw6puIGtpbSBjxrDGoW5nOiBW4bq/dCBj4bqvdCAoQ1VUKSDEkcaw4bujYyDEkcOhbmggZ2nDoSBi4bqxbmcgY8OhYyB04bu3IGzhu4cgY2jhu6kga2jDtG5nIHBo4bqjaSB24buBIGjDrG5oIGThuqFuZywgYmFvIGfhu5NtIAoKICAtIE3hurd0IELDoG4gKHRhYmxlKTogTeG6t3QgYsOgbiBjw7MgaMOsbmggbOG7pWMgZ2nDoWMsIGzDoCBi4buBIG3hurd0IGzhu5tuIG5o4bqldCB0csOqbiDEkeG7iW5oIGPhu6dhIHZpw6puIGtpbSBjxrDGoW5nLiDEkG8gYuG6sW5nIG1pbGltw6l0IHbDoCBzYXUgxJHDsyBjaGlhIGNobyDEkcaw4budbmcga8OtbmggdHJ1bmcgYsOsbmggY+G7p2EgdmnDqm4ga2ltIGPGsMahbmcgxJHhu4MgbOG6pXkgcGjhuqduIHRyxINtICglIHRhYmxlKS4gCiAgCiAgICAtIMSQ4buRaSB24bubaSBt4buZdCB2acOqbiBraW0gY8awxqFuZyB0csOybiwgNjAlIGzDoCB0acOqdSBjaHXhuqluIMSR4buDIGdpw7pwIGLhuqFuIHNvIHPDoW5oIHbDrCDEkcOieSBsw6AgbeG7mXQga8OtY2ggdGjGsOG7m2MgbeG6t3QgYsOgbiBraW0gY8awxqFuZyDEkeG6uXAuCiAgCiAgICAtIEtoaSBt4bq3dCBiw6BuIGtpbSBjxrDGoW5nIGzhu5tuIGjGoW4gNjUlIMSRxrDhu6NjIGNvaSBsw6AgbOG7m24sIGzDoCBraMO0bmcgY8OybiBsw6AgY2jhu4kgc+G7kSB04buRaSDGsHUuIEvDrWNoIHRoxrDhu5tjIGLhuqNuZyBkxrDhu5tpIDYwJSDEkcaw4bujYyBjb2kgbMOgIG5oaeG7gXUgaMahbiB0cm9uZyBwaOG6oW0gdmkg4oCcbMO9IHTGsOG7n25n4oCdLCBnaeG6o20geHXhu5FuZyBraG/huqNuZyA1MyUuIETGsOG7m2kgxJHDsywgYuG6o25nIGPDsyB0aOG7gyDEkcaw4bujYyBjb2kgbMOgIHF1w6Egbmjhu48uIAoKICAtIENoaeG7gXUgc8OidSAoZGVwdGgpOiBDaGnhu4F1IHPDonUgY+G7p2EgdmnDqm4ga2ltIGPGsMahbmcgY8OzIHRo4buDIMSRxrDhu6NjIHTDrW5oIGLhurFuZyBjw6FjaCBjaGlhIHThu5VuZyBjaGnhu4F1IHPDonUgdOG7qyDEkeG7iW5oIMSR4bq/biDEkcOheSBj4bunYSB2acOqbiBraW0gY8awxqFuZyBjaG8gxJHGsOG7nW5nIGvDrW5oIHRydW5nIGLDrG5oLiBN4buZdCBs4bqnbiBu4buvYSwgNjAlIGzDoCB0acOqdSBjaHXhuqluIMSR4buDIMSRw6FuaCBnacOhLiBO4bq/dSB2acOqbiBraW0gY8awxqFuZyBxdcOhIHPDonUsIG7DsyBjw7MgdGjhu4MgeHXhuqV0IGhp4buHbiBtw6B1IHThu5FpLiBO4bq/dSB2acOqbiBraW0gY8awxqFuZyBxdcOhIG7DtG5nLCBuw7MgY8OzIHRo4buDIG3huqV0IMSR4buZIHPDoW5nIGtoaSDDoW5oIHPDoW5nIGzhu410IHJhIG5nb8OgaS4gVGjDtG5nIHRoxrDhu51uZywgxJHhu5FpIHbhu5tpIG3hu5l0IHZpw6puIGtpbSBjxrDGoW5nIHRyw7JuLCA1Nyw1JSDEkeG6v24gNjMlIGzDoCBwaOG6oW0gdmkgxrBhIHRow61jaC4KICAKYGBge3IgZWNobz1UUlVFLCB3YXJuaW5nPUZBTFNFfQpoICU+JSBncm91cF9ieSh0YWJsZSkgJT4lIGZpbHRlcih0YWJsZSA+PSA1MyAmIHRhYmxlIDw9IDY1KSAlPiUgc3VtbWFyaXNlKG4gPSBuKCkpICU+JSAKICBnZ3Bsb3QoYWVzKHRhYmxlLG4pKSArCiAgICBnZW9tX2NvbChmaWxsPSdncmVlbicpICsKICAgIHhsYWIoJ1RhYmxlJykgKwogICAgeWxhYignU+G7kSBsxrDhu6NuZycpICsKICAgIGxhYnModGl0bGUgPSAnSMOsbmggMTogVuG6v3QgY+G6r3QgdGFibGUgY+G7p2Ega2ltIGPGsMahbmcnKQpgYGAKCi0gUXVhbiBzw6F0IGJp4buDdSDEkeG7kyB0csOqbiB0YSB0aOG6pXkgxJHGsOG7o2M6CiAgLSBN4bupYyDEkeG7mSBwaMOibiBi4buVIGPhu6dhIGPDoWMgduG6v3QgY+G6r3Qga2ltIGPGsMahbmcga28gxJHhu5NuZyDEkeG7gXUgCiAgLSBDw6FjIHZpw6puIGtpbSBjxrDGoW5nIGPDsyB24bq/dCBj4bqvdCBu4bqxbSB0cm9uZyBraG/huqNuZyB04burIDU1IMSR4bq/biA2MCBjaGnhur9tIHPhu5EgbMaw4bujbmcgbOG7m24gbmjhuqV0IHbhu5tpIGjGoW4gMzAwMDAgdmnDqm4uIEPhu6UgdGjhu4MgbMOgOiBW4bq/dCBj4bqvdCDhu58gNTUsNzUgdsOgIDU2LDYgY2hp4bq/bSBz4buRIGzGsOG7o25nIGzhu5tuIG5o4bqldCB24bubaSBoxqFuIDE5MDAwIHZpw6puIAogIC0gQ8OhYyB2acOqbiBraW0gY8awxqFuZyBjw7MgduG6v3QgY+G6r3QgbuG6sW0gdHJvbmcga2hv4bqjbmcgdOG7qyA1Miw1IMSR4bq/biBkxrDhu5tpIDU1IGNoaeG6v20gc+G7kSBsxrDhu6NuZyB0xrDGoW5nIMSR4buRaSBuaOG7jyB24bubaSBoxqFuIDMwMDAgdmnDqm4uIAogIC0gQ8OhYyB2acOqbiBraW0gY8awxqFuZyBjw7MgduG6v3QgY+G6r3QgbuG6sW0gdHJvbmcga2hv4bqjbmcgdOG7qyA2MCDEkeG6v24gZMaw4bubaSA2NSBjaGnhur9tIHPhu5EgbMaw4bujbmcgbmjhu48gbmjhuqV0IHbhu5tpIGjGoW4gNDAwMCB2acOqbi4gQ+G7pSB0aOG7gyBsw6A6IFbhur90IGPhuq90IOG7nyA2NSBjaGnhur9tIHPhu5EgbMaw4bujbmcgbmjhu48gbmjhuqV0IHbhu5tpIGNo4buJIGtob+G6o25nIDIwMCB2acOqbiAKCiMjQ3V0OiBW4bq/dCBj4bqvdCBj4bunYSBraW0gY8awxqFuZwpgYGB7ciBlY2hvPVRSVUUsIHdhcm5pbmc9RkFMU0V9CmggJT4lIGdncGxvdChhZXMoeCA9IGxvYWkpKSArCiAgICBnZW9tX2JhcigpICsKICAgIGxhYnMoeCA9ICdMb+G6oWknLCB5ID0gJ1Phu5EgbMaw4bujbmcnKSArCiAgICBjb29yZF9mbGlwKCkgKwogICAgbGFicyh0aXRsZSA9ICdIw6xuaCAxOiBW4bq/dCBj4bqvdCBj4bunYSBraW0gY8awxqFuZyhiaeG7g3UgxJHhu5MgbmdhbmcpJykKYGBgCgotIFF1YW4gc8OhdCBiaeG7g3UgxJHhu5MgdHLDqm4gdGEgdGjhuqV5IMSRxrDhu6NjOgogIC0gTeG7qWMgxJHhu5kgcGjDom4gYuG7lSBj4bunYSBjw6FjIGxv4bqhaSBraW0gY8awxqFuZyBrbyDEkeG7k25nIMSR4buBdSAKICAtIEPDoWMgdmnDqm4ga2ltIGPGsMahbmcgbG/huqFpICoqSWRlYWwqKiBjw7Mgc+G7kSBsxrDhu6NuZyBs4bubbiBuaOG6pXQgduG7m2kgaMahbiAyMDAwMCB2acOqbi4KICAtIEPDoWMgdmnDqm4ga2ltIGPGsMahbmcgbG/huqFpICoqRmFpcioqIGPDsyBz4buRIGzGsOG7o25nIMOtdCBuaOG6pXQgduG7m2kgaMahbiAyNTAwIHZpw6puLgogIC0gQ8OhYyB2acOqbiBraW0gY8awxqFuZyBsb+G6oWkgKipHb29kKiosICoqVmVyeWdvb2QqKiwgKipQcmVtaXVtKiogY8OzIHPhu5EgbMaw4bujbmcgdHJ1bmcgYsOsbmggduG7m2kgbOG6p24gbMaw4bujdCBsw6AgNTAwMCwgMTI1MDAsIDEzMDAwIHZpw6puCgojIyBCaeG7g3UgxJHhu5MgcGjDom4gbG/huqFpIGtpbSBjxrDGoW5nCgpgYGB7ciBlY2hvPVRSVUUsIHdhcm5pbmc9RkFMU0V9CmggJT4lIGdyb3VwX2J5KGxvYWkpICU+JSBzdW1tYXJpc2UobiA9IG4oKSkgJT4lCiAgZ2dwbG90KGFlcyhsb2FpLG4pKSArCiAgICBnZW9tX2NvbChmaWxsPSdncmV5JykgKwogICAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IG4pLHZqdXN0ID0gMiwgY29sb3IgPSAncmVkJykgKwogICAgbGFicyh4ID0gJ0xv4bqhaScsIHkgPSAnU+G7kSBsxrDhu6NuZycpICsKICAgIGxhYnModGl0bGUgPScgSMOsbmggMTogQmnhu4N1IMSR4buTIHBow6JuIGxv4bqhaSBraW0gY8awxqFuZycpCmBgYAoKLSBRdWFuIHPDoXQgYmnhu4N1IMSR4buTIHRhIHRo4bqleToKICAtIE3hu6ljIMSR4buZIHBow6JuIGLhu5Ega2ltIGPGsMahbmcgdGhlbyBjw6FjIGxv4bqhaSBraMO0bmcgxJHhu5NuZyDEkeG7gXUgCiAgLSBT4buRIGzGsOG7o25nIGtpbSBjxrDGoW5nIGxv4bqhaSAqKklkZWFsKiogbmhp4buBdSBuaOG6pXQgduG7m2kgMjE1NTEgdmnDqm4gCiAgLSBT4buRIGzGsOG7o25nIGtpbSBjxrDGoW5nIGxv4bqhaSAqKkZhaXIqKiDDrXQgbmjhuqV0IHbhu5tpIDE2MTAgdmnDqm4gw610IGjGoW4gMTMgbOG6p24gc28gduG7m2kgbG/huqFpICoqSWRlYWwqKgogIC0gU+G7kSBsxrDhu6NuZyBraW0gY8awxqFuZyBsb+G6oWkgKipHb29kKiosICoqVmVyeWdvb2QqKiwgKipQcmVtaXVtKiogY8OzIHPhu5EgbMaw4bujbmcgdMSDbmcgZOG6p24gbOG6p24gbMaw4bujdCBsw6A6IDQ5MDYgdmnDqm4sIDEyMDgyIHZpw6puLCAxMzc5MSB2acOqbgoKIyMgQmnhu4N1IMSR4buTIHRo4buDIGhp4buHbiB04buJIGzhu4cga2ltIGPGsMahbmcgdGhlbyBsb+G6oWkgdsOgIG3DoHUgCmBgYHtyIGVjaG89VFJVRSwgd2FybmluZz1GQUxTRX0KayA8LSBoICU+JSBncm91cF9ieShsb2FpLCBjb2xvcikgJT4lIHN1bW1hcmlzZShuID0gbigpKQprICU+JSBnZ3Bsb3QoYWVzKHggPSBsb2FpLCB5ID0gbikpICsKICBnZW9tX2NvbChkYXRhID0gayAlPiUgZmlsdGVyKGNvbG9yID09ICdHJyksIGZpbGwgPSAnZ3JlZW4nKSArCiAgZ2VvbV9jb2woZGF0YSA9IGsgJT4lIGZpbHRlcihjb2xvciA9PSAnSCcpLCBmaWxsID0gJ2dyZXknKQpgYGAKICAKIyMgQmnhu4N1IMSR4buTIHThu4kgc+G7kSBsb+G6oWkga2ltIGPGsMahbmcKCmBgYHtyIGVjaG89VFJVRSwgd2FybmluZz1GQUxTRX0KaCAlPiUgZ3JvdXBfYnkobG9haSkgJT4lIHN1bW1hcmlzZShuID0gbigpKSAlPiUKICBnZ3Bsb3QoYWVzKGxvYWksbikpICsKICAgIGdlb21fY29sKGZpbGw9J2JlaWdlJykgKwogICAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IHBlcmNlbnQobi9sZW5ndGgoaCRjYXJhdCkpKSx2anVzdCA9IDIsIGNvbG9yID0gJ3JlZCcpICsKICAgIGxhYnMoeCA9ICdMb+G6oWknLCB5ID0gJ1Phu5EgbMaw4bujbmcnKSArCiAgICBsYWJzKHRpdGxlID0nIEjDrG5oMTogQmnhu4N1IMSR4buTIHThu4kgc+G7kSBjw6FjIGxv4bqhaSBraW0gY8awxqFuZycpCiAgICAKYGBgCgotIFF1YW4gc8OhdCBiaeG7g3UgxJHhu5MgdGEgdGjhuqV5OgogIC0gQ8OhYyBsb+G6oWkga2ltIGPGsMahbmcgcGjDom4gYuG7kSBraMO0bmcgxJHhu5NuZyDEkeG7gXUKICAtIFPhu5EgbMaw4bujbmcga2ltIGPGsMahbmcgbG/huqFpICoqSWRlYWwqKiBuaGnhu4F1IG5o4bqldCBjaGnhur9tIGjGoW4gNDAlIAogIC0gU+G7kSBsxrDhu6NuZyBraW0gY8awxqFuZyBsb+G6oWkgKipGYWlyKiogw610IG5o4bqldCBjaGnhur9tIGNo4buJIGjGoW4gMyUgw610IGjGoW4gMTMgbOG6p24gc28gduG7m2kgbG/huqFpICoqSWRlYWwqKgogIC0gU+G7kSBsxrDhu6NuZyBraW0gY8awxqFuZyBsb+G6oWkgKipHb29kKiosICoqVmVyeWdvb2QqKiwgKipQcmVtaXVtKiogY8OzIHPhu5EgbMaw4bujbmcgdMSDbmcgZOG6p24gbOG6p24gbMaw4bujdCBsw6A6IDksMSUsIDIyLDQlOyAyNSw2JQoKIyMgQmnhu4N1IMSR4buTIHRo4buDIGhp4buHbiB0cnVuZyBiw6xuaCBnacOhIGtpbSBjxrDGoW5nIHRoZW8gbG/huqFpCmBgYHtyIGVjaG89VFJVRSwgd2FybmluZz1GQUxTRX0KaCAlPiUgZ3JvdXBfYnkobG9haSxjb2xvcikgJT4lIHN1bW1hcmlzZShtID0gbWVhbihwcmljZSkpICU+JQogIGdncGxvdChhZXMoeCA9IGxvYWkseSA9IG0pKSArCiAgICBnZW9tX2NvbChwb3NpdGlvbiA9ICdkb2RnZScpICsKICAgIGZhY2V0X3dyYXAofmNvbG9yKSArCiAgICBnZW9tX3RleHQoYWVzKGxhYmVsID0gcm91bmQobSkpKSArCiAgICBsYWJzKHggPSAnTG/huqFpJywgeSA9ICdT4buRIGzGsOG7o25nJykgKwogICAgbGFicyh0aXRsZSA9ICdIw6xuaCAxOiBCaeG7g3UgxJHhu5MgdGjhu4MgaGnhu4duIHRydW5nIGLDrG5oIGdpw6Ega2ltIGPGsMahbmcgdGhlbyBsb+G6oWknKQpgYGAKCiMjIFThuq1wIGjhu6NwIGPDoWMgYmnhu4N1IMSR4buTIHRo4buDIGhp4buHbiB04buJIGzhu4cga2ltIGPGsMahbmcgdGhlbyBsb+G6oWkKYGBge3IgZWNobz1UUlVFLCB3YXJuaW5nPUZBTFNFfQpoICU+JSBncm91cF9ieShsb2FpLGNvbG9yKSAlPiUgc3VtbWFyaXNlKG49bigpKSAlPiUKICBnZ3Bsb3QoYWVzKHggPSBsb2FpLHkgPSBuKSkgKwogICAgZ2VvbV9jb2wocG9zaXRpb24gPSAnZG9kZ2UnKSArCiAgICBmYWNldF93cmFwKH5jb2xvcikgKwogICAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IG4pLHZqdXN0ID0gMiwgY29sb3IgPSAnYmx1ZScpICsKICAgIGxhYnMoeCA9ICdMb+G6oWknLCB5ID0gJ1Phu5EgbMaw4bujbmcnKSArCiAgICBsYWJzKHRpdGxlID0gJ0jDrG5oIDE6IFThuq1wIGjhu6NwIGPDoWMgYmnhu4N1IMSR4buTIHRo4buDIGhp4buHbiB04buJIGzhu4cga2ltIGPGsMahbmcgdGhlbyBsb+G6oWknKQpgYGAKCiMgQ0xBUklUWSAtIMSQw6FuaCBnacOhIGPhuqVwIMSR4buZIHRpbmgga2hp4bq/dCBj4bunYSBraW0gY8awxqFuZzogCi0gVHJvbmcgdGnDqnUgY2h14bqpbiA0QywgxJHhu5kgdGluaCBraGnhur90IGPhu6dhIGtpbSBjxrDGoW5nIGzDoCBz4buRIGzGsOG7o25nIHbDoCBraOG6oyBuxINuZyBoaeG7g24gdGjhu4sgY+G7p2EgY8OhYyDEkeG6t2MgxJFp4buDbSBiw6puIHRyb25nIHbDoCBiw6puIG5nb8OgaSBj4bunYSBt4buZdCB2acOqbiBraW0gY8awxqFuZy4KCiAgLSBDw6FjIMSR4bq3YyDEkWnhu4NtIGLDqm4gdHJvbmcgxJHGsOG7o2MgZ+G7jWkgbMOgIOKAnEluY2x1c2lvbnPigJ0gaGF5IGThu4tjaCBt4buZdCBjw6FjaCB04buVbmcgcXXDoXQgbMOgIGPDoWMgdOG7syB24bq/dCBiYW8gYsOqbiB0cm9uZy4gCiAgCiAgLSBDw6FjIMSR4bq3YyDEkWnhu4NtIGLDqm4gbmdvw6BpIMSRxrDhu6NjIGdp4bubaSBo4bqhbiB0csOqbiBi4buBIG3hurd0IGPhu6dhIHbhur90IGPhuq90IGPhu6dhIHZpw6puIGtpbSBjxrDGoW5nLgoKLSBD4bqlcCDEkeG7mSB0cm9uZyBjYW8gbmjhuqV0IGzDoCBIb8OgbiBt4bu5LCDEkcaw4bujYyBrw70gaGnhu4d1IGzDoCAqKklGKiogKEludGVybmFsIEZsYXdsZXNzKTogTmjhu69uZyB2acOqbiBraW0gY8awxqFuZyBuw6B5IGtow7RuZyBjw7MgdOG6oXAgY2jhuqV0IHThu7MgduG6v3QgbsOgbyDEkcaw4bujYyBuaMOsbiB0aOG6pXkgZMaw4bubaSDEkeG7mSBwaMOzbmcgxJHhuqFpIDEwIGzhuqduLgoKLSBIYWkgbOG7m3AgdGnhur9wIHRoZW8gxJHGsOG7o2MgbmjDs20gbOG6oWkgduG7m2kgbmhhdSBsw6AgKipWVlMxKiogdsOgICoqVlZTMioqOiBOaOG7r25nIHZpw6puIGtpbSBjxrDGoW5nIG7DoHkgxJHGsOG7o2MgxJHhu4tuaCBuZ2jEqWEgbMOgIHLhuqV0IHLhuqV0IMOtdCB04buzIHbhur90IGLDqm4gdHJvbmcsIGfhu5NtIGPhuqVwIMSR4buZIHRo4bupIG5o4bqldCAoVlZTMSkgaG/hurdjIHRo4bupIGhhaSAoVlZTMikuCgotIFRp4bq/cCB0aGVvIGzDoCBjw6FjIGPhuqVwIMSR4buZIHRpbmgga2hp4bq/dCAqKlZTMSoqIHbDoCAqKlZTMioqOiBDw6FjIMSR4bqndSBraW0gKG5lZWRsZSkgdsOgIHbhur90IGzDtG5nIHbFqSBuaOG7jyAoc21hbGwgZmVhdGhlcikgY8OzIHRo4buDIMSRxrDhu6NjIHTDrG0gdGjhuqV5IHRyb25nIGPDoWMgbOG7m3AgVlMxIHbDoCBWUzIgbsOgeSBuaMawbmcgY2jDum5nIHbhuqtuIHLhuqV0IG5o4buPIHNvIHbhu5tpIGvDrWNoIHRoxrDhu5tjIGPhu6dhIHZpw6puIGtpbSBjxrDGoW5nLgoKLSBD4bqlcCDEkeG7mSBtw6AgdOG7syB24bq/dCBob+G6t2MgdOG6oXAgY2jhuqV0IGPDsyB0aOG7gyBuaMOsbiB0aOG6pXkgcsO1IHLDoG5nIGzDoCAqKlNJMSoqIHbDoCAqKlNJMioqOiBU4bqhcCBjaOG6pXQgZOG7hSBuaMOsbiB0aOG6pXkgZMaw4bubaSDEkeG7mSBwaMOzbmcgxJHhuqFpIGvDvSBsb3VwZSBj4bqnbSB0YXkgbmjGsG5nIHRoxrDhu51uZyBraMO0bmcgdGjhu4MgbmjDrG4gdGjhuqV5IGLhurFuZyBt4bqvdCB0aMaw4budbmcuCgotIFBo4bqhbSB2aSBj4bqlcCDEkeG7mSByw7UgcsOgbmcgY3Xhu5FpIGPDuW5nIGzDoCAqKkkxKio6IEPDoWMgdOG6oXAgY2jhuqV0IGPDsyB0aOG7gyBs4bubbiBoxqFuIHRyb25nIHThu7Egbmhpw6puLCBjw7MgdGjhu4Mgc+G6q20gbcOgdSB2w6AgY8OzIHRo4buDIG5ow6xuIHRo4bqleSBi4bqxbmcgbeG6r3QgdHJvbmcgc+G7kSBjw6FjIHRodeG7mWMgdMOtbmggY8OzIHRo4buDIGPDsyBraMOhYy4KYGBge3IgZWNobz1UUlVFLCB3YXJuaW5nPUZBTFNFfQpoICU+JSBncm91cF9ieShjbGFyaXR5KSAlPiUgc3VtbWFyaXNlKG4gPSBuKCkpICU+JQogIGdncGxvdChhZXMoY2xhcml0eSxuKSkgKwogICAgZ2VvbV9jb2woZmlsbD0nZ3JleScpICsKICAgIGdlb21fdGV4dChhZXMobGFiZWwgPSBuKSx2anVzdCA9IDIsIGNvbG9yID0gJ3doaXRlJykgKwogICAgeGxhYignxJDhu5kgdGluaCBraGnhur90JykgKwogICAgeWxhYignU+G7kSBsxrDhu6NuZycpICsKICAgIGxhYnModGl0bGUgPSAnSMOsbmggMTogQ+G6pXAgxJHhu5kgdGluaCBraGnhur90IGPhu6dhIGtpbSBjxrDGoW5nJykKYGBgCgotUXVhIGjDrG5oIHRyw6puIHRhIHRo4bqleSDEkcaw4bujYzoKICAtIEPhuqVwIMSR4buZIHRpbmgga2hp4bq/dCBj4bunYSBraW0gY8awxqFuZyBjw7Mgc+G7sSBwaMOibiBob8OhIGtow7RuZyDEkeG7k25nIMSR4buBdSAoQ+G6pXAgU0kxPTEzMDY1IGzhu5tuIGjGoW4gbmhp4buBdSBzbyB24bubaSBj4bqlcCBJMT0gNzQxKQogIC0gQ+G6pXAgxJHhu5kgdGluaCBraGnhur90IGPhu6dhIGtpbSBjxrDGoW5nIGNhbyB0aOG7qSAyIGzDoCBWUzI9IDEyMjU4CiAgLSBD4bqlcCDEkeG7mSB0aW5oIGtoaeG6v3QgY+G7p2Ega2ltIGPGsMahbmcgY2FvIHRo4bupIDMgbMOgIFNJMj0gOTE5NAogIC0gQ+G6pXAgxJHhu5kgdGluaCBraGnhur90IGPhu6dhIGtpbSBjxrDGoW5nIGNhbyB0aOG7qSA0LDUsNiw3IGzhuqduIGzGsOG7o3QgbMOgIFZTMT0gODE3MSwgVlZTMj0gNTA2NiwgVlZTMT0gMzY1NSwgSUY9IDE3OTAKICAKIyMgQ+G6pXAgxJHhu5kgdGluaCBraGnhur90IGPhu6dhIGtpbSBjxrDGoW5nIChiaeG7g3UgxJHhu5MgbmdhbmcpCmBgYHtyIGVjaG89VFJVRSwgd2FybmluZz1GQUxTRX0KaCAlPiUgZ2dwbG90KGFlcyh4ID0gY2xhcml0eSkpICsKICAgIGdlb21fYmFyKCkgKwogICAgbGFicyh4ID0gJ0PhuqVwIMSR4buZIHRpbmgga2hp4bq/dCcsIHkgPSAnU+G7kSBsxrDhu6NuZycpICsKICAgIGNvb3JkX2ZsaXAoKSArCiAgICBsYWJzKHRpdGxlID0gJ0jDrG5oIDE6IEPhuqVwIMSR4buZIHRpbmgga2hp4bq/dCBj4bunYSBraW0gY8awxqFuZyAoYmnhu4N1IMSR4buTIG5nYW5nKScpCmBgYAotIFF1YW4gc8OhdCBiaeG7g3UgxJHhu5MgdGEgdGjhuqV5OgogIC0gQ+G6pXAgxJHhu5kgdGluaCBraGnhur90IGPhu6dhIGtpbSBjxrDGoW5nIGPDsyBz4buxIHBow6JuIGhvw6Ega2jDtG5nIMSR4buTbmcgxJHhu4F1IChD4bqlcCAqKlNJMSoqIGzhu5tuIGjGoW4gbmhp4buBdSBzbyB24bubaSBj4bqlcCAqKkkxKiopCiAgLSBD4bqlcCDEkeG7mSB0aW5oIGtoaeG6v3QgY+G7p2Ega2ltIGPGsMahbmcgY2FvIHRo4bupIDIgbMOgICoqVlMyKiogaMahbiAxMjAwMCB2acOqbiAKICAtIEPhuqVwIMSR4buZIHRpbmgga2hp4bq/dCBj4bunYSBraW0gY8awxqFuZyBjYW8gdGjhu6kgMyBsw6AgKipTSTIqKiBoxqFuIDkwMDAgdmnDqm4gCiAgLSBD4bqlcCDEkeG7mSB0aW5oIGtoaeG6v3QgY+G7p2Ega2ltIGPGsMahbmcgY2FvIHRo4bupIDQsNSw2LDcgbOG6p24gbMaw4bujdCBsw6AgKipWUzEqKiBoxqFuIDgwMDAgdmnDqm4sICoqVlZTMioqIGjGoW4gNTAwMCB2acOqbiwgKipWVlMxKiogaMahbiAzNTAwIHZpw6puLCAqKklGKiogaMahbiAxNzAwIHZpw6puIAoKIyMgQmnhu4N1IMSR4buTIGPhuqVwIMSR4buZIHRpbmgga2hp4bq/dCBj4bunYSBraW0gY8awxqFuZyAKYGBge3IgZWNobz1UUlVFLCB3YXJuaW5nPUZBTFNFfQpoICU+JSBncm91cF9ieShjbGFyaXR5KSAlPiUgc3VtbWFyaXNlKG4gPSBuKCkpICU+JQogIGdncGxvdChhZXMoY2xhcml0eSxuKSkgKwogICAgZ2VvbV9jb2woZmlsbD0nd2hpdGUnKSArCiAgICBnZW9tX3RleHQoYWVzKGxhYmVsID0gbiksdmp1c3QgPSAyLCBjb2xvciA9ICdibGFjaycpICsKICAgIGxhYnMoeCA9ICdD4bqlcCDEkeG7mSB0aW5oIGtoaeG6v3QnLCB5ID0gJ1Phu5EgbMaw4bujbmcnKQogICAgbGFicyh0aXRsZSA9JyBIw6xuaCAxOiBCaeG7g3UgxJHhu5MgcGjDom4gbG/huqFpIGPhuqVwIMSR4buZIHRpbmgga2hp4bq/dCBj4bunYSBraW0gY8awxqFuZycpICsKICAgIGNvb3JkX2ZsaXAoKQpgYGAKLVF1YW4gc8OhdCBiaeG7g3UgxJHhu5MgdGEgdGjhuqV5IMSRxrDhu6NjOgogIC0gQ+G6pXAgxJHhu5kgdGluaCBraGnhur90IGPhu6dhIGtpbSBjxrDGoW5nIGPDsyBz4buxIHBow6JuIGhvw6Ega2jDtG5nIMSR4buTbmcgxJHhu4F1IChD4bqlcCBTSTE9MTMwNjUgbOG7m24gaMahbiBuaGnhu4F1IHNvIHbhu5tpIGPhuqVwIEkxPSA3NDEpCiAgLSBD4bqlcCDEkeG7mSB0aW5oIGtoaeG6v3QgY+G7p2Ega2ltIGPGsMahbmcgY2FvIHRo4bupIDIgbMOgIFZTMj0gMTIyNTgKICAtIEPhuqVwIMSR4buZIHRpbmgga2hp4bq/dCBj4bunYSBraW0gY8awxqFuZyBjYW8gdGjhu6kgMyBsw6AgU0kyPSA5MTk0CiAgLSBD4bqlcCDEkeG7mSB0aW5oIGtoaeG6v3QgY+G7p2Ega2ltIGPGsMahbmcgY2FvIHRo4bupIDQsNSw2LDcgbOG6p24gbMaw4bujdCBsw6AgVlMxPSA4MTcxLCBWVlMyPSA1MDY2LCBWVlMxPSAzNjU1LCBJRj0gMTc5MAoKIyMgVOG6rXAgaOG7o3AgY8OhYyBiaeG7g3UgxJHhu5MgdGjhu4MgaGnhu4duIHPhu5EgbMaw4bujbmcga2ltIGPGsMahbmcgdGhlbyBj4bqlcCDEkeG7mSB0aW5oIGtoaeG6v3QKYGBge3IgZWNobz1UUlVFLCB3YXJuaW5nPUZBTFNFfQpoICU+JSBncm91cF9ieShjbGFyaXR5LGNvbG9yKSAlPiUgc3VtbWFyaXNlKG49bigpKSAlPiUKICBnZ3Bsb3QoYWVzKHggPSBjbGFyaXR5LHkgPSBuKSkgKwogICAgZ2VvbV9jb2wocG9zaXRpb24gPSAnZG9kZ2UnKSArCiAgICBmYWNldF93cmFwKH5jb2xvcikgKwogICAgbGFicyh4ID0gJ8SQ4buZIHRpbmgga2hp4bq/dCcsIHkgPSAnU+G7kSBsxrDhu6NuZycpICsKICAgIGxhYnModGl0bGUgPSAnSMOsbmggMTogVOG6rXAgaOG7o3AgY8OhYyBiaeG7g3UgxJHhu5MgdGjhu4MgaGnhu4duIHPhu5EgbMaw4bujbmcga2ltIGPGsMahbmcgdGhlbyBj4bqlcCDEkeG7mSB0aW5oIGtoaeG6v3QnKQpgYGAKICAKIyMgVOG6rXAgaOG7o3AgY8OhYyBiaeG7g3UgxJHhu5MgdGjhu4MgaGnhu4duIHThu4kgbOG7hyBraW0gY8awxqFuZyB0aGVvIMSR4buZIHRpbmgga2hp4bq/dApgYGB7ciBlY2hvPVRSVUUsIHdhcm5pbmc9RkFMU0V9CmggJT4lIGdyb3VwX2J5KGNsYXJpdHksY29sb3IpICU+JSBzdW1tYXJpc2Uobj1uKCkpICU+JQogIGdncGxvdChhZXMoeCA9IGNsYXJpdHkseSA9IG4pKSArCiAgICBnZW9tX2NvbChwb3NpdGlvbiA9ICdkb2RnZScpICsKICAgIGZhY2V0X3dyYXAofmNvbG9yKSArCiAgICBnZW9tX3RleHQoYWVzKGxhYmVsID0gbiksdmp1c3QgPSAyLCBjb2xvciA9ICdibHVlJykgKwogICAgbGFicyh4ID0gJ8SQ4buZIHRpbmgga2hp4bq/dCcsIHkgPSAnU+G7kSBsxrDhu6NuZycpICsKICAgIGxhYnModGl0bGUgPSAnSMOsbmggMTogVOG6rXAgaOG7o3AgY8OhYyBiaeG7g3UgxJHhu5MgdGjhu4MgaGnhu4duIHPhu5EgbMaw4bujbmcga2ltIGPGsMahbmcgdGhlbyDEkeG7mSB0aW5oIGtoaeG6v3QnKQpgYGAKCiMjIEJp4buDdSDEkeG7kyB0aOG7gyBoaeG7h24gdHJ1bmcgYsOsbmggZ2nDoSBraW0gY8awxqFuZyB0aGVvIMSR4buZIHRpbmgga2hp4bq/dCAKYGBge3IgZWNobz1UUlVFLCB3YXJuaW5nPUZBTFNFfQpoICU+JSBncm91cF9ieShjbGFyaXR5LGNvbG9yKSAlPiUgc3VtbWFyaXNlKG0gPSBtZWFuKHByaWNlKSkgJT4lCiAgZ2dwbG90KGFlcyh4ID0gY2xhcml0eSx5ID0gbSkpICsKICAgIGdlb21fY29sKHBvc2l0aW9uID0gJ2RvZGdlJykgKwogICAgZmFjZXRfd3JhcCh+Y29sb3IpICsKICAgIGdlb21fdGV4dChhZXMobGFiZWwgPSByb3VuZChtKSkpICsKICAgIGxhYnMoeCA9ICdMb+G6oWknLCB5ID0gJ1Phu5EgbMaw4bujbmcnKSArCiAgICBsYWJzKHRpdGxlID0gJ0jDrG5oIDE6IEJp4buDdSDEkeG7kyB0aOG7gyBoaeG7h24gdHJ1bmcgYsOsbmggZ2nDoSBraW0gY8awxqFuZyB0aGVvIMSR4buZIHRpbmgga2hp4bq/dCcpCmBgYAoKIyBDQVJBVCAtIFRy4buNbmcgbMaw4bujbmcgY+G7p2Ega2ltIGPGsMahbmc6Ci0gVHLhu41uZyBsxrDhu6NuZyBjYXJhdCBj4bunYSB2acOqbiBraW0gY8awxqFuZyDEkcaw4bujYyB4w6FjIMSR4buLbmggYuG6sW5nIGPDoWNoIGPDom4gdmnDqm4ga2ltIGPGsMahbmcgdHLDqm4gbeG7mXQgY2hp4bq/YyBjw6JuIMSRaeG7h24gdOG7rSBjaMOtbmggeMOhYy4gTeG7mXQgY2FyYXQgYuG6sW5nIDEvNSBnYW0sIHbDrCB24bqteSBt4buZdCBnYW0gc+G6vSBi4bqxbmcgbsSDbSBjYXJhdC4gCgotIFPhu5EgY2FyYXQgdGjGsOG7nW5nIMSRxrDhu6NjIGdp4buvIGhhaSBz4buRIHRo4bqtcCBwaMOibiBjdeG7kWkgY8O5bmcsIHbDrSBk4bulIG5oxrAgMS41MyAsIDEuMDAgLCAyLjkzIGNhcmF0LiBWw6wgduG6rXksIG3hu5l0IHZpw6puIGtpbSBjxrDGoW5nIG3hu5l0IG7hu61hIGNhcmF0IHPhur0gxJHGsOG7o2MgYmnhu4N1IHRo4buLIGLhurFuZyAwLDUwIGNhcmF0LCBt4buZdCB2acOqbiBraW0gY8awxqFuZyBt4buZdCBjYXJhdCBz4bq9IMSRxrDhu6NjIGJp4buDdSB0aOG7iyBi4bqxbmcgMSwwMC4KCi0gVHLhu41uZyBsxrDhu6NuZyBjaMOtbmggeMOhYyBsw6AgcuG6pXQgcXVhbiB0cuG7jW5nIHbDrCB2aeG7h2MgxJHhu4tuaCBnacOhIGThu7FhIHRyw6puIHRy4buNbmcgbMaw4bujbmcgbsOgeSB2w6AgY8OzIHPhu7Ega2jDoWMgYmnhu4d0IMSRw6FuZyBr4buDIHbhu4EgZ2nDoSBj4bqjIMSRw7RpIGtoaSBjaOG7iSBoxqFuIG3hu5l0IHBo4bqnbiB0csSDbSBjYXJhdC4gTeG7mXQgdmnDqm4ga2ltIGPGsMahbmcgbuG6t25nIDAsOTkgY2FyYXQgY8OzIGdpw6EgdGjhuqVwIGjGoW4gbeG7mXQgdmnDqm4ga2ltIGPGsMahbmcgbuG6t25nIDEsMDAgY2FyYXQuIFR1eSBuaGnDqm4gbuG6v3UgbmjDrG4gYuG6sW5nIG3huq90IHRoxrDhu51uZyBi4bqhbiBz4bq9IGtow7RuZyBwaMOibiBiaeG7h3QgxJHGsOG7o2Mgc+G7sSBraMOhYyBiaeG7h3QgbsOgeS4KCmBgYHtyIGVjaG89VFJVRSwgd2FybmluZz1GQUxTRX0KaCAlPiUgZ3JvdXBfYnkoY2FyYXQpICU+JSBmaWx0ZXIoY2FyYXQgPj0gMC4yMyAmIGNhcmF0IDw9IDIuMDUpICU+JSBzdW1tYXJpc2UobiA9IG4oKSkgJT4lCiAgZ2dwbG90KGFlcyhjYXJhdCxuKSkgKwogICAgZ2VvbV9jb2woZmlsbD0nYmx1ZScpICsKICAgIHhsYWIoJ0NhcmF0JykgKwogICAgeWxhYignU+G7kSBsxrDhu6NuZycpICsKICAgIGxhYnModGl0bGUgPSAnSMOsbmggMTogVHLhu41uZyBsxrDhu6NuZyBj4bunYSBraW0gY8awxqFuZycpCmBgYAoKUXVhIGjDrG5oIHRyw6puIHRhIHRo4bqleSDEkcaw4bujYzoKLSBUYSB0aOG6pXkgdHLhu41uZyBsxrDhu6NuZyBj4bunYSBraW0gY8awxqFuZyBwaMOibiBi4buRIGtow7RuZyDEkeG7k25nIMSR4buBdS4gxJBhIHPhu5EgdOG6rXAgdHJ1bmcg4bufIG3hu6ljIHThu6sgMCwzLTEsNiBjYXJhdAotIEPDoWMgbeG7qWMgdHLhu41uZyBsxrDhu6NuZyBjaGnhur9tIHBo4bqnbiBs4bubbiBsw6AgMCwzIDsgMCw2NSB2w6AgMSBjYXJhdAotIEPDoWMgbeG7qWMgdHLhu41uZyBsxrDhu6NuZyBjaGnhur9tIHPhu5EgbMaw4bujbmcgw610IG5o4bqldCBsw6AgdOG7qyAxLDYtIDEsOSAKCgoK