1 Phân tích Indicator NV.IND.MANF.CD từ bộ dữ liệu WDI

1.1 Giới thiệu về indicator: NV.IND.MANF.CD

Indicator NV.IND.MANF.CD, hay còn gọi là Giá trị gia tăng của ngành sản xuất (Manufacturing Value Added), đo lường giá trị tăng thêm trong quá trình sản xuất của một quốc gia, được tính bằng đơn vị tiền tệ USD hiện tại.

  • Định nghĩa:

NV.IND.MANF.CD là một chỉ số kinh tế quan trọng trong việc đo lường hoạt động sản xuất của một quốc gia. Nó đại diện cho giá trị gia tăng từ các quy trình sản xuất trong lĩnh vực công nghiệp.

  • Ý nghĩa:

Chỉ số này cung cấp thông tin về mức độ đóng góp của ngành công nghiệp sản xuất vào tổng sản phẩm nội địa, giúp đánh giá sức mạnh cạnh tranh và tính cách mạng của nền kinh tế. NV.IND.MANF.CD cũng là một trong những chỉ số quan trọng để đo lường sự phát triển kinh tế của một quốc gia. Sự gia tăng trong giá trị này thường được coi là một dấu hiệu tích cực về sự phát triển kinh tế bền vững.

  • Ứng dụng:

Chính phủ và các nhà quản lý kinh tế sử dụng NV.IND.MANF.CD để theo dõi hiệu suất của ngành công nghiệp sản xuất trong nước và so sánh với các quốc gia khác. Doanh nghiệp sử dụng chỉ số này để đánh giá cơ hội kinh doanh và đầu tư trong ngành sản xuất của một quốc gia cụ thể. Các nhà đầu tư sử dụng thông tin từ NV.IND.MANF.CD để đưa ra các quyết định đầu tư có kiến thức về hoạt động kinh doanh và triển vọng của các doanh nghiệp trong lĩnh vực sản xuất.

  • Ví dụ:

Giả sử giá trị sản xuất của một quốc gia là 100 triệu USD và chi phí đầu vào trung gian là 50 triệu USD. Giá trị gia tăng của ngành sản xuất (NV.IND.MANF.CD) sẽ là 50 triệu USD.

Chỉ số này có thể được sử dụng để so sánh mức độ phát triển của ngành sản xuất giữa các quốc gia.ví dụ, nếu giá trị gia tăng của ngành sản xuất của quốc gia A là 70 triệu USD và của quốc gia B là 60 triệu USD, chúng ta có thể kết luận rằng ngành sản xuất của quốc gia A phát triển hơn so với quốc gia B vì giá trị gia tăng của nó cao hơn. Điều này có thể chỉ ra rằng quốc gia A có khả năng sử dụng nguồn lực và công nghệ hiệu quả hơn để tạo ra giá trị trong quá trình sản xuất.

1.2 Mục tiêu báo cáo

  • Phân tích biến động của NV.IND.MANF.CD theo thời gian.
  • So sánh NV.IND.MANF.CD giữa các quốc gia.
  • Xác định các yếu tố ảnh hưởng đến NV.IND.MANF.CD.

1.3 Phạm vi nghiên cứu

  • Chỉ số NV.IND.MANF.CD của Việt Nam trong giai đoạn 2005-2022.
  • So sánh với các quốc gia trong khu vực ASEAN. ## Phân tích indicator: NV.IND.MANF.CD

1.3.1 Thu thập dữ liệu

  • Thu thập dữ liệu về Giá trị gia tăng của ngành sản xuất (Manufacturing Value Added) ở Việt Nam ( đơn vị tính USD)
library(tidyverse)
## Warning: package 'tidyverse' was built under R version 4.3.3
## Warning: package 'ggplot2' was built under R version 4.3.3
## Warning: package 'tidyr' was built under R version 4.3.3
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr     1.1.4     ✔ readr     2.1.5
## ✔ forcats   1.0.0     ✔ stringr   1.5.1
## ✔ ggplot2   3.5.0     ✔ tibble    3.2.1
## ✔ lubridate 1.9.3     ✔ tidyr     1.3.1
## ✔ purrr     1.0.2     
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag()    masks stats::lag()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
library(WDI)
## Warning: package 'WDI' was built under R version 4.3.3
a <- WDI(indicator = 'NV.IND.MANF.CD', country = c('VNM'))
  • Loại bỏ các hàng hoặc cột chứa giá trị thiếu (NA) từ một khung dữ liệu (data frame) có tên là “a”.
a <- na.omit(a)

1.3.2 Phân tích giá trị gia tăng sản xuất theo thời gian

library(ggplot2)

ggplot(a, aes(x = year, y = NV.IND.MANF.CD)) + 
  geom_line() +              
  geom_point(color = "red") +  
  labs(title = "Biểu đồ giá trị gia tăng ngành sản xuất theo thời gian", x = "Năm", y = "NV.IND.MANF.CD") +  
  theme_minimal()

Giải thích câu lệnh:

ggplot(a, aes(x = year, y = NV.IND.MANF.CD)):

- ggplot: Hàm khởi tạo một biểu đồ ggplot2.
- a: Tên của data frame chứa dữ liệu.
- aes: Hàm dùng để xác định các biến được sử dụng trong biểu đồ.
  x = year: Biến year được sử dụng cho trục x.
  y = NV.IND.MANF.CD: Biến NV.IND.MANF.CD được sử dụng cho trục y.

geom_line():

- geom_line: Hàm dùng để vẽ đường thẳng trong biểu đồ.

geom_point(color = “red”):

- geom_point: Hàm dùng để vẽ các điểm trong biểu đồ.
- color = "red": Màu của các điểm được đặt là đỏ.

labs(title = “Biểu đồ giá trị gia tăng ngành sản xuất theo thời gian”, x = “Năm”, y = “NV.IND.MANF.CD”):

- labs: Hàm dùng để thêm tiêu đề và nhãn cho các trục.
- title: Tiêu đề của biểu đồ là "Biểu đồ giá trị gia tăng ngành sản xuất theo thời gian".
- x: Nhãn cho trục x là "Năm".
- y: Nhãn cho trục y là "NV.IND.MANF.CD".

theme_minimal: Hàm dùng để áp dụng chủ đề tối giản cho biểu đồ. - Kết hợp tất cả các phần lại, câu lệnh R này sẽ tạo ra một biểu đồ ggplot2 với các đặc điểm sau:

Nhận xét: - Ngành sản xuất Việt Nam có xu hướng tăng trưởng trong giai đoạn 2005-2023. Tuy nhiên, tốc độ tăng trưởng không đồng đều qua các năm và chịu ảnh hưởng của nhiều yếu tố.

1.3.3 Phân tích NV.IND.MANF.CD biến động trong giai đoạn trước, trong và sau Covid- 19

a$Period <- ifelse(a$year < 2020, "Before COVID-19",
                      ifelse(a$year >= 2020 & a$year <= 2021 , "During COVID-19",
                             ifelse(a$year > 2021, "After COVID-19", NA)))

ggplot(a, aes(x = year, y = NV.IND.MANF.CD, color = Period)) +
  geom_point() +           
  labs(title = "Sự thay đổi của NV.IND.MANF.CD trước, trong và sau COVID-19",
       x = "Năm", y = "NV.IND.MANF.CD") +  
  scale_color_manual(values = c("Before COVID-19" = "yellow", "During COVID-19" = "red", "After COVID-19" = "black")) + 
  theme_minimal()

Giải thích câu lênh: Thêm cột Period: - a\(Period <- ...: Thêm một cột mới tên Period vào data frame a. - ifelse: Hàm kiểm tra điều kiện và trả về giá trị tương ứng. - Kiểm tra điều kiện đầu tiên: a\)year < 2020 (năm nhỏ hơn 2020). Nếu đúng, gán giá trị “Before COVID-19” cho cột Period. Nếu điều kiện đầu không đúng, kiểm tra điều kiện thứ hai: a\(year >= 2020 & a\)year <= 2021 (năm từ 2020 đến 2021). Nếu đúng, gán giá trị “During COVID-19” cho cột Period. Nếu cả hai điều kiện trên đều không đúng, kiểm tra điều kiện thứ ba: a$year > 2021 (năm lớn hơn 2021). Nếu đúng, gán giá trị “After COVID-19” cho cột Period. Nếu tất cả điều kiện đều không đúng, gán giá trị NA (giá trị thiếu). Tạo biểu đồ: - ggplot(a, aes(…)): Khởi tạo biểu đồ ggplot2 từ data frame a. - aes(x = year, y = NV.IND.MANF.CD, color = Period): Thiết lập thẩm mỹ (aes) cho biểu đồ. x = year: Trục x sử dụng biến year. y = NV.IND.MANF.CD: Trục y sử dụng biến NV.IND.MANF.CD. color = Period: Màu của các điểm được xác định bởi giá trị trong cột Period. - geom_point(): Thêm các điểm dữ liệu vào biểu đồ. - labs(…): Thêm tiêu đề và nhãn cho biểu đồ. title: Tiêu đề là “Sự thay đổi của NV.IND.MANF.CD trước, trong và sau COVID-19”. x: Nhãn trục x là “Năm”. y: Nhãn trục y là “NV.IND.MANF.CD”. - scale_color_manual(…): Thiết lập màu sắc cho các điểm theo giá trị trong cột Period. values: Bảng tra cứu màu. “Before COVID-19” - màu vàng (“yellow”). “During COVID-19” - màu đỏ (“red”). “After COVID-19” - màu đen (“black”). - theme_minimal(): Áp dụng chủ đề tối giản cho biểu đồ.

Nhận xét biểu đồ: - Trước COVID-19: Chỉ số NV.IND.MANF.CD có xu hướng tăng liên tục từ năm 2005 đến năm 2019.

Tốc độ tăng trưởng nhanh trong giai đoạn đầu (2005-2010) và chậm dần trong giai đoạn sau (2011-2019).

  • Trong COVID-19: Chỉ số NV.IND.MANF.CD giảm mạnh vào năm 2020, có thể do ảnh hưởng của đại dịch COVID-19.

Tuy nhiên, chỉ số NV.IND.MANF.CD có dấu hiệu phục hồi vào năm 2021.

  • Sau COVID-19: Chỉ số NV.IND.MANF.CD tiếp tục tăng trong giai đoạn 2022-2024.

Tuy nhiên, tốc độ tăng trưởng chậm hơn so với giai đoạn trước COVID-19.

  • Kết luận:

Biểu đồ cho thấy sự biến động của Chỉ số sản xuất công nghiệp (NV.IND.MANF.CD) theo thời gian, đặc biệt là sự ảnh hưởng của đại dịch COVID-19.

Biểu đồ cũng cho thấy dấu hiệu phục hồi của ngành sản xuất sau đại dịch.

1.3.4 Tỷ lệ tăng trưởng ngành sản xuất theo thời gian

library(dplyr)

# Tính toán tỷ lệ tăng trưởng trong từng giai đoạn
growth_rate_a <- a %>%
  mutate(growth = (NV.IND.MANF.CD - lag(NV.IND.MANF.CD)) / lag(NV.IND.MANF.CD) * 100)

# Xem kết quả

ggplot(growth_rate_a, aes(x = year, y = growth)) + 
  geom_line() +              
  geom_point(color = "red") +  
  labs(title = "Biểu đồ tỷ lệ tăng trưởng ngành sản xuất theo thời gian", x = "Năm", y = "Tỷ lệ tăng trưởng ngành sản xuất") +  
  theme_minimal()
## Warning: Removed 1 row containing missing values or values outside the scale range
## (`geom_line()`).
## Warning: Removed 1 row containing missing values or values outside the scale range
## (`geom_point()`).

Giải thích câu lênh:

  1. Tính toán tỷ lệ tăng trưởng trong từng giai đoạn:
  • Sử dụng hàm mutate để thêm một cột mới tên growth vào data frame a.
  • Cột growth chứa tỷ lệ tăng trưởng của NV.IND.MANF.CD cho từng năm.
  • Tỷ lệ tăng trưởng được tính toán bằng cách sử dụng công thức sau: (NV.IND.MANF.CD - lag(NV.IND.MANF.CD)) / lag(NV.IND.MANF.CD) * 100 lag(NV.IND.MANF.CD) lấy giá trị của NV.IND.MANF.CD ở năm trước.
  • Công thức này tính toán sự thay đổi phần trăm của NV.IND.MANF.CD so với năm trước.
  1. Vẽ biểu đồ tỷ lệ tăng trưởng:
  • Sử dụng ggplot2 để tạo biểu đồ đường thẳng hiển thị tỷ lệ tăng trưởng theo thời gian.
  • Trục x hiển thị năm.
  • Trục y hiển thị tỷ lệ tăng trưởng.
  • Các điểm được tô màu đỏ để dễ dàng phân biệt.
  • Tiêu đề và nhãn trục được thêm vào để làm rõ thông tin biểu đồ.
  • Chủ đề tối giản được áp dụng để tăng tính thẩm mỹ.

Nhận xét biểu đồ:

  1. Biểu đồ thể hiện:
  • Tỷ lệ tăng trưởng trả về giá trị âm trong giai đoạn 2008-2009, 2011-2012, và 2020.
  • Tỷ lệ tăng trưởng đạt đỉnh vào năm 2010, 2017, và 2023.
  • Biểu đồ có xu hướng biến động mạnh theo thời gian.
  1. Phân tích theo giai đoạn:

Trước COVID-19: - Tỷ lệ tăng trưởng biến động mạnh từ năm 2005 đến năm 2019. - Có hai giai đoạn suy thoái vào năm 2008-2009 và 2011-2012. - Tỷ lệ tăng trưởng đạt đỉnh vào năm 2010 và 2017. Trong COVID-19: - Tỷ lệ tăng trưởng giảm mạnh vào năm 2020, có thể do ảnh hưởng của đại dịch COVID-19. Sau COVID-19: - Tỷ lệ tăng trưởng phục hồi vào năm 2021 và đạt đỉnh vào năm 2023.

  1. So sánh với biểu đồ NV.IND.MANF.CD:
  • Biểu đồ tỷ lệ tăng trưởng thể hiện sự biến động mạnh hơn so với biểu đồ NV.IND.MANF.CD.
  • Điều này cho thấy sự nhạy cảm của tỷ lệ tăng trưởng đối với các biến động kinh tế.

1.3.5 So sánh chỉ số NV.IND.MANF.CD giữa Việt Nam, Trung Quốc và Malaysia

library(WDI)
ss <- WDI(indicator = "NV.IND.MANF.CD", country = c("MY", "SG", "VN"), start = 2005, end = 2022)
ss <- na.omit(ss)

library(ggplot2)
ggplot(ss, aes(x = year, y = NV.IND.MANF.CD, color = country)) +
  geom_line() +
  labs(title = "Biểu đồ so sánh Giá trị gia tăng ngành sản xuất",
       x = "Năm",
       y = "Giá trị gia tăng ngành sản xuất (Manufacturing Value Added)(current US$)") +
  scale_color_manual(values = c("blue", "red", "green")) +  
  theme_minimal()

Giải thích câu lệnh: ss <- WDI(indicator = “NV.IND.MANF.CD”, country = c(“MY”, “SG”, “VN”), start = 2005, end = 2022):

ss <- WDI(…) dùng để truy xuất dữ liệu từ Ngân hàng Thế giới. indicator = “NV.IND.MANF.CD”: Chỉ số cần truy xuất là “Giá trị gia tăng ngành sản xuất (constant 2010 US$)”. country = c(“MY”, “SG”, “VN”): Lấy dữ liệu của ba nước: Malaysia (“MY”), Singapore (“SG”), và Việt Nam (“VN”). start = 2005, end = 2022: Khoảng thời gian lấy dữ liệu từ năm 2005 đến năm 2022. Kết quả được lưu vào data frame ss.

  1. ss <- na.omit(ss):

ss <- na.omit(ss) loại bỏ các dòng trong data frame ss có chứa giá trị thiếu (NA).

  1. Thư viện ggplot2 và tạo biểu đồ:

Phần còn lại của đoạn code sử dụng thư viện ggplot2 để tạo biểu đồ. Biểu đồ này hiển thị sự so sánh Giá trị gia tăng ngành sản xuất (trục y) theo thời gian (trục x) giữa ba nước Malaysia (xanh dương), Singapore (đỏ), và Việt Nam (xanh lá).

Nhận xét:

  1. Biểu đồ thể hiện:

Giá trị gia tăng ngành sản xuất của Malaysia cao hơn Singapore và Việt Nam trong suốt giai đoạn 2005-2022. Giá trị gia tăng ngành sản xuất của Singapore tăng trưởng nhanh hơn Việt Nam trong giai đoạn 2005-2022. Giá trị gia tăng ngành sản xuất của Việt Nam tăng trưởng mạnh trong giai đoạn 2015-2022.

  1. Phân tích theo từng nước:

Malaysia: - Giá trị gia tăng ngành sản xuất tăng liên tục từ năm 2005 đến năm 2022. - Tốc độ tăng trưởng giảm dần trong giai đoạn 2015-2022. Singapore: - Giá trị gia tăng ngành sản xuất tăng liên tục từ năm 2005 đến năm 2022. - Tốc độ tăng trưởng nhanh hơn Việt Nam. Việt Nam: - Giá trị gia tăng ngành sản xuất tăng liên tục từ năm 2005 đến năm 2022. - Tốc độ tăng trưởng chậm hơn Malaysia và Singapore trong giai đoạn 2005-2015. - Tuy nhiên, tốc độ tăng trưởng tăng mạnh trong giai đoạn 2015-2022.

1.3.6 Các yếu tố ảnh hưởng đến NV.IND.MANF.CD

Các yếu tố ảnh hưởng đến NV.IND.MANF.CD (Giá trị gia tăng của ngành sản xuất (USD hiện tại))

Có nhiều yếu tố ảnh hưởng đến NV.IND.MANF.CD, bao gồm:

1.3.6.1 Yếu tố vĩ mô:

  • Tăng trưởng kinh tế: Nền kinh tế tăng trưởng sẽ thúc đẩy nhu cầu cho các sản phẩm công nghiệp, dẫn đến tăng giá trị gia tăng.
  • Lãi suất ngân hàng: Lãi suất cao sẽ khiến doanh nghiệp khó tiếp cận vốn vay, ảnh hưởng đến hoạt động sản xuất và giá trị gia tăng.
  • Tỷ giá hối đoái: Tỷ giá hối đoái biến động ảnh hưởng đến giá cả hàng hóa xuất khẩu và nhập khẩu, tác động đến giá trị gia tăng.
  • Cán cân thương mại: Cán cân thương mại thâm hụt sẽ ảnh hưởng tiêu cực đến giá trị gia tăng.
  • Chính sách của chính phủ: Chính sách hỗ trợ doanh nghiệp, đầu tư vào cơ sở hạ tầng, v.v. sẽ thúc đẩy giá trị gia tăng.

1.3.6.2 Yếu tố ngành:

  • Năng suất lao động: Năng suất lao động cao sẽ giúp doanh nghiệp sản xuất nhiều sản phẩm hơn với cùng một lượng lao động, dẫn đến tăng giá trị gia tăng.
  • Công nghệ: Việc áp dụng công nghệ tiên tiến sẽ giúp doanh nghiệp nâng cao hiệu quả sản xuất, giảm chi phí, và tăng giá trị gia tăng.
  • Cạnh tranh: Cạnh tranh gay gắt sẽ buộc doanh nghiệp phải nâng cao chất lượng sản phẩm, giảm chi phí, và đổi mới sáng tạo để duy trì thị phần, dẫn đến tăng giá trị gia tăng.
  • Giá nguyên vật liệu: Giá nguyên vật liệu tăng cao sẽ ảnh hưởng đến chi phí sản xuất và giá trị gia tăng.

1.3.6.3 Yếu tố doanh nghiệp:

  • Khả năng quản lý: Khả năng quản lý tốt sẽ giúp doanh nghiệp sử dụng hiệu quả nguồn lực, giảm chi phí, và tăng giá trị gia tăng. Chiến lược kinh doanh: Chiến lược kinh doanh hiệu quả sẽ giúp doanh nghiệp khai thác thị trường tiềm năng, tăng doanh thu, và giá trị gia tăng.
  • Nguồn vốn: Doanh nghiệp có nguồn vốn đủ sẽ có điều kiện đầu tư vào công nghệ, mở rộng sản xuất, và tăng giá trị gia tăng.

Ngoài ra, còn có một số yếu tố khác như:

  • Thiên tai, dịch bệnh.
  • Biến đổi khí hậu.
  • Căng thẳng chính trị, chiến tranh thương mại.

1.3.6.4 Phân tích ảnh hưởng của GDP đối với giá trị gia tăng của ngành sản xuất (Manufacturing Value Added)

# Tải dữ liệu NV.IND.MANF.CD của Việt Nam từ 2005-2022
a <- WDI(indicator = "NV.IND.MANF.CD", country = "VNM", start = 2005, end = 2022)

# Chọn chỉ các cột cần thiết từ dữ liệu NV.IND.MANF.CD
a <- subset(a, select = c("year", "NV.IND.MANF.CD"))

# Tải dữ liệu GDP của Việt Nam từ 2005-2022
gdp <- WDI(indicator = "NY.GDP.MKTP.CD", country = "VNM", start = 2005, end = 2022)

# Chọn chỉ các cột cần thiết từ dữ liệu GDP
gdp <- subset(gdp, select = c("year", "NY.GDP.MKTP.CD"))

# Đổi tên cột để phù hợp với dataframe của bạn
names(gdp) <- c("year", "GDP")

# Chắc chắn rằng cột 'year' là duy nhất trong mỗi dataframe
a$year <- as.character(a$year)  # Chuyển đổi cột 'year' sang kiểu character để tránh lỗi
gdp$year <- as.character(gdp$year)  # Chuyển đổi cột 'year' sang kiểu character để tránh lỗi

# Gộp dữ liệu theo cột 'year' bằng hàm left_join() từ gói dplyr
library(dplyr)
a_gdp <- left_join(a, gdp, by = "year")

# Loại bỏ các hàng có dữ liệu GDP bị thiếu
a_gdp <- na.omit(a_gdp)

# Tạo mô hình hồi quy tuyến tính
model <- lm(NV.IND.MANF.CD ~ GDP, data = a_gdp)

# Xem tóm tắt của mô hình
summary(model)
## 
## Call:
## lm(formula = NV.IND.MANF.CD ~ GDP, data = a_gdp)
## 
## Residuals:
##        Min         1Q     Median         3Q        Max 
## -4.438e+09 -2.813e+09  5.207e+08  2.993e+09  4.386e+09 
## 
## Coefficients:
##               Estimate Std. Error t value Pr(>|t|)    
## (Intercept) -8.460e+09  1.753e+09  -4.826 0.000186 ***
## GDP          2.589e-01  7.236e-03  35.783  < 2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 3.283e+09 on 16 degrees of freedom
## Multiple R-squared:  0.9877, Adjusted R-squared:  0.9869 
## F-statistic:  1280 on 1 and 16 DF,  p-value: < 2.2e-16
# Create a column chart combining GDP and NV.IND.MANF.CD
ggplot(a_gdp, aes(x = year)) +
  geom_col(aes(y = GDP, fill = "GDP"), position = "dodge", width = 0.4) +
  geom_col(aes(y = NV.IND.MANF.CD, fill = "NV.IND.MANF.CD"), position = "dodge", width = 0.4) +
  scale_fill_manual(values = c("GDP" = "lightblue", "NV.IND.MANF.CD" = "lightgreen")) +
  labs(title = "Biểu đồ cột ghép giữa GDP và NV.IND.MANF.CD",
       x = "Năm",
       y = "Giá trị",
       fill = "Biến") +
  theme_minimal()

Giải thích câu lệnh:

  1. Tải dữ liệu:

a <- WDI(…): Lấy dữ liệu về Chỉ số sản xuất công nghiệp (NV.IND.MANF.CD) của Việt Nam (“VNM”) từ năm 2005 đến năm 2022. a <- subset(a, select = c(“year”, “NV.IND.MANF.CD”)): Chọn hai cột year và NV.IND.MANF.CD từ data frame a. gdp <- WDI(…): Lấy dữ liệu về GDP (NY.GDP.MKTP.CD) của Việt Nam (“VNM”) từ năm 2005 đến năm 2022. gdp <- subset(gdp, select = c(“year”, “NY.GDP.MKTP.CD”)): Chọn hai cột year và NY.GDP.MKTP.CD từ data frame gdp.

  1. Chuyển đổi và gộp dữ liệu:

names(gdp) <- c(“year”, “GDP”): Đổi tên cột NY.GDP.MKTP.CD thành GDP trong data frame gdp. a\(year <- as.character(a\)year): Chuyển đổi cột year trong data frame a sang kiểu character. gdp\(year <- as.character(gdp\)year): Chuyển đổi cột year trong data frame gdp sang kiểu character. library(dplyr): Tải thư viện dplyr để sử dụng hàm left_join. a_gdp <- left_join(a, gdp, by = “year”): Gộp hai data frame a và gdp theo cột year. a_gdp <- na.omit(a_gdp): Loại bỏ các hàng có dữ liệu GDP bị thiếu trong data frame a_gdp.

  1. Phân tích hồi quy:

model <- lm(NV.IND.MANF.CD ~ GDP, data = a_gdp): Tạo mô hình hồi quy tuyến tính với NV.IND.MANF.CD là biến phụ thuộc và GDP là biến độc lập. summary(model): Xem tóm tắt mô hình, bao gồm hệ số hồi quy, giá trị p, và R-squared.

  1. Biểu đồ:

ggplot(a_gdp, aes(x = year)): Khởi tạo biểu đồ ggplot2 với data frame a_gdp. geom_col(aes(y = GDP, fill = “GDP”), position = “dodge”, width = 0.4): Thêm cột cho GDP với màu “lightblue”. geom_col(aes(y = NV.IND.MANF.CD, fill = “NV.IND.MANF.CD”), position = “dodge”, width = 0.4): Thêm cột cho NV.IND.MANF.CD với màu “lightgreen”. scale_fill_manual(values = c(“GDP” = “lightblue”, “NV.IND.MANF.CD” = “lightgreen”)): Thiết lập màu cho các cột. labs(…): Thêm tiêu đề, nhãn trục, và chú thích cho biểu đồ. theme_minimal(): Áp dụng chủ đề tối giản cho biểu đồ.

Kết hợp tất cả các phần:

Đoạn code này sẽ:

Tải dữ liệu về NV.IND.MANF.CD và GDP của Việt Nam. Chọn các cột cần thiết và chuyển đổi dữ liệu. Gộp hai data frame theo cột year. Loại bỏ các hàng có dữ liệu GDP bị thiếu. Tạo mô hình hồi quy tuyến tính để phân tích mối quan hệ giữa NV.IND.MANF.CD và GDP. Vẽ biểu đồ cột để so sánh GDP và NV.IND.MANF.CD theo thời gian.

Nhận xét:

  1. Biểu đồ thể hiện:

Sự thay đổi của GDP và NV.IND.MANF.CD của Việt Nam từ năm 2005 đến năm 2022. GDP tăng trưởng liên tục trong giai đoạn này. NV.IND.MANF.CD tăng trưởng liên tục trong giai đoạn này, nhưng tốc độ tăng trưởng chậm hơn GDP. GDP có xu hướng biến động mạnh hơn NV.IND.MANF.CD.

  1. So sánh GDP và NV.IND.MANF.CD:

GDP cao hơn NV.IND.MANF.CD trong suốt giai đoạn 2005-2022. Khoảng cách giữa GDP và NV.IND.MANF.CD có xu hướng tăng dần.

  1. Phân tích theo giai đoạn:

2005-2010: - GDP và NV.IND.MANF.CD đều tăng trưởng nhưng tốc độ tăng trưởng của GDP cao hơn. 2011-2020: - GDP và NV.IND.MANF.CD đều tăng trưởng nhưng tốc độ tăng trưởng của NV.IND.MANF.CD giảm dần. 2021-2022: - GDP tăng trưởng mạnh. - NV.IND.MANF.CD tăng trưởng nhưng tốc độ tăng trưởng chậm hơn so với giai đoạn 2005-2010.

2 Phân tích Indicator: AIP_PC_PP_PT từ bộ dữ liệu imf

2.1 Giới thiệu về indicator: AIP_PC_PP_PT

AIP_PC_PP_PT là mã được sử dụng để biểu diễn Tài sản Ròng của Quỹ Đầu tư Bảo hiểm (FIP) - Chính sách Công cộng - Hưu trí - Lợi ích được Hứa hẹn trong Bộ Quỹ Tiền tệ Quốc tế (IMF). Nó là một phần của Tài khoản Vốn và Tài khoản Tài chính (CAFA), được sử dụng để theo dõi dòng vốn chảy vào và ra khỏi một quốc gia.

Giải thích cho từ cụm trong AIP_PC_PP_PT: AIP: - A: Tài khoản - IP: Quỹ Đầu tư Bảo hiểm

PC: - P: Chính sách - C: Công cộng

PP: - P: Hưu trí - P: Lợi ích được hứa hẹn

PT: - P: Thống kê

Do đó, AIP_PC_PP_PT có nghĩa là:

Tài khoản Quỹ Đầu tư Bảo hiểm - Chính sách Công cộng - Hưu trí - Lợi ích được Hứa hẹn - Thống kê

Từ cụm này cho biết:

- Loại tài khoản (Tài khoản Quỹ Đầu tư Bảo hiểm)
- Lĩnh vực đầu tư (Chính sách Công cộng, Hưu trí, Lợi ích được Hứa hẹn)
- Loại dữ liệu (Thống kê)

2.2 Mục tiêu báo cáo

Phân tích xu hướng, so sánh quốc tế, đánh giá rủi ro và đề xuất khuyến nghị cho AIP_PC_PP_PT của Việt Nam.

2.3 Phạm vi nghiên cứu

  • Chỉ số AIP_PC_PP_PT của Việt Nam trong giai đoạn 2009-2022.
  • So sánh với các quốc gia trong khu vực ASEAN.

2.3.1 Thu thập dữ liệu

  • Thu thập dữ liệu về AIP_PC_PP_PT ở Việt Nam ( đơn vị tính USD)
library(imf.data)
## Warning: package 'imf.data' was built under R version 4.3.3
library(DT)
## Warning: package 'DT' was built under R version 4.3.3
imf <- list_datasets()
k <- load_datasets('IFS')
k1 <- k$get_series(freq= 'A', ref_area = 'VN', indicator = 'AIP_PC_PP_PT' )
hq <- na.omit(k1)
datatable(hq)

Giải thích ý nghĩa câu lênh:

  1. Tải thư viện và danh sách dữ liệu:

library(imf.data): Tải thư viện imf.data để truy cập và sử dụng các dữ liệu của Quỹ Tiền tệ Quốc tế (IMF). imf <- list_datasets(): Lấy danh sách các bộ dữ liệu có sẵn từ IMF và lưu vào biến imf.

  1. Tải bộ dữ liệu IFS:

k <- load_datasets(‘IFS’): Tải bộ dữ liệu IFS (International Financial Statistics) của IMF và lưu vào biến k. k\(dimensions\)indicator: Xem danh sách các chỉ báo (indicator) có trong bộ dữ liệu IFS.

  1. Lấy dữ liệu về chỉ báo AIP_PC_PP_PT của Việt Nam:

kk <- k$get_series(freq = ‘A’, ref_area = ‘VN’, indicator = ‘AIP_PC_PP_PT’): Lấy dữ liệu về chỉ báo “AIP_PC_PP_PT” của Việt Nam (“VN”) với tần suất hàng năm (“A”) và lưu vào biến kk. - freq = ‘A’: Tần suất dữ liệu là hàng năm (Annual). - ref_area = ‘VN’: Khu vực tham chiếu là Việt Nam (“VN”). - indicator = ‘AIP_PC_PP_PT’: Chỉ báo cần lấy dữ liệu.

  1. Loại bỏ các giá trị thiếu và chuyển đổi thành data table:

hq <- na.omit(kk): Loại bỏ các hàng có dữ liệu thiếu (NA) trong biến kk và lưu vào biến hq. data.table(hq): Chuyển đổi dữ liệu trong biến hq thành một data table để tiện cho việc phân tích và xử lý

2.3.2 Phân tích AIP_PC_PP_PT biến động theo thời gian

library(ggplot2)
ggplot(hq, aes(x = TIME_PERIOD, y = A.VN.AIP_PC_PP_PT)) +
  geom_col(position = 'dodge', fill= 'navy')

  labs(title = 'Biểu đồ biến động Tài sản Ròng của Quỹ Đầu tư Bảo hiểm (FIP) - Chính sách Công cộng - Hưu trí - Lợi ích được Hứa hẹn ở Việt Nam theo thời gian', x= "Năm", y= "AIP_PC_PP_PT ")
## $x
## [1] "Năm"
## 
## $y
## [1] "AIP_PC_PP_PT "
## 
## $title
## [1] "Biểu đồ biến động Tài sản Ròng của Quỹ Đầu tư Bảo hiểm (FIP) - Chính sách Công cộng - Hưu trí - Lợi ích được Hứa hẹn ở Việt Nam theo thời gian"
## 
## attr(,"class")
## [1] "labels"
  theme_minimal()
## List of 136
##  $ line                            :List of 6
##   ..$ colour       : chr "black"
##   ..$ linewidth    : num 0.5
##   ..$ linetype     : num 1
##   ..$ lineend      : chr "butt"
##   ..$ arrow        : logi FALSE
##   ..$ inherit.blank: logi TRUE
##   ..- attr(*, "class")= chr [1:2] "element_line" "element"
##  $ rect                            :List of 5
##   ..$ fill         : chr "white"
##   ..$ colour       : chr "black"
##   ..$ linewidth    : num 0.5
##   ..$ linetype     : num 1
##   ..$ inherit.blank: logi TRUE
##   ..- attr(*, "class")= chr [1:2] "element_rect" "element"
##  $ text                            :List of 11
##   ..$ family       : chr ""
##   ..$ face         : chr "plain"
##   ..$ colour       : chr "black"
##   ..$ size         : num 11
##   ..$ hjust        : num 0.5
##   ..$ vjust        : num 0.5
##   ..$ angle        : num 0
##   ..$ lineheight   : num 0.9
##   ..$ margin       : 'margin' num [1:4] 0points 0points 0points 0points
##   .. ..- attr(*, "unit")= int 8
##   ..$ debug        : logi FALSE
##   ..$ inherit.blank: logi TRUE
##   ..- attr(*, "class")= chr [1:2] "element_text" "element"
##  $ title                           : NULL
##  $ aspect.ratio                    : NULL
##  $ axis.title                      : NULL
##  $ axis.title.x                    :List of 11
##   ..$ family       : NULL
##   ..$ face         : NULL
##   ..$ colour       : NULL
##   ..$ size         : NULL
##   ..$ hjust        : NULL
##   ..$ vjust        : num 1
##   ..$ angle        : NULL
##   ..$ lineheight   : NULL
##   ..$ margin       : 'margin' num [1:4] 2.75points 0points 0points 0points
##   .. ..- attr(*, "unit")= int 8
##   ..$ debug        : NULL
##   ..$ inherit.blank: logi TRUE
##   ..- attr(*, "class")= chr [1:2] "element_text" "element"
##  $ axis.title.x.top                :List of 11
##   ..$ family       : NULL
##   ..$ face         : NULL
##   ..$ colour       : NULL
##   ..$ size         : NULL
##   ..$ hjust        : NULL
##   ..$ vjust        : num 0
##   ..$ angle        : NULL
##   ..$ lineheight   : NULL
##   ..$ margin       : 'margin' num [1:4] 0points 0points 2.75points 0points
##   .. ..- attr(*, "unit")= int 8
##   ..$ debug        : NULL
##   ..$ inherit.blank: logi TRUE
##   ..- attr(*, "class")= chr [1:2] "element_text" "element"
##  $ axis.title.x.bottom             : NULL
##  $ axis.title.y                    :List of 11
##   ..$ family       : NULL
##   ..$ face         : NULL
##   ..$ colour       : NULL
##   ..$ size         : NULL
##   ..$ hjust        : NULL
##   ..$ vjust        : num 1
##   ..$ angle        : num 90
##   ..$ lineheight   : NULL
##   ..$ margin       : 'margin' num [1:4] 0points 2.75points 0points 0points
##   .. ..- attr(*, "unit")= int 8
##   ..$ debug        : NULL
##   ..$ inherit.blank: logi TRUE
##   ..- attr(*, "class")= chr [1:2] "element_text" "element"
##  $ axis.title.y.left               : NULL
##  $ axis.title.y.right              :List of 11
##   ..$ family       : NULL
##   ..$ face         : NULL
##   ..$ colour       : NULL
##   ..$ size         : NULL
##   ..$ hjust        : NULL
##   ..$ vjust        : num 1
##   ..$ angle        : num -90
##   ..$ lineheight   : NULL
##   ..$ margin       : 'margin' num [1:4] 0points 0points 0points 2.75points
##   .. ..- attr(*, "unit")= int 8
##   ..$ debug        : NULL
##   ..$ inherit.blank: logi TRUE
##   ..- attr(*, "class")= chr [1:2] "element_text" "element"
##  $ axis.text                       :List of 11
##   ..$ family       : NULL
##   ..$ face         : NULL
##   ..$ colour       : chr "grey30"
##   ..$ size         : 'rel' num 0.8
##   ..$ hjust        : NULL
##   ..$ vjust        : NULL
##   ..$ angle        : NULL
##   ..$ lineheight   : NULL
##   ..$ margin       : NULL
##   ..$ debug        : NULL
##   ..$ inherit.blank: logi TRUE
##   ..- attr(*, "class")= chr [1:2] "element_text" "element"
##  $ axis.text.x                     :List of 11
##   ..$ family       : NULL
##   ..$ face         : NULL
##   ..$ colour       : NULL
##   ..$ size         : NULL
##   ..$ hjust        : NULL
##   ..$ vjust        : num 1
##   ..$ angle        : NULL
##   ..$ lineheight   : NULL
##   ..$ margin       : 'margin' num [1:4] 2.2points 0points 0points 0points
##   .. ..- attr(*, "unit")= int 8
##   ..$ debug        : NULL
##   ..$ inherit.blank: logi TRUE
##   ..- attr(*, "class")= chr [1:2] "element_text" "element"
##  $ axis.text.x.top                 :List of 11
##   ..$ family       : NULL
##   ..$ face         : NULL
##   ..$ colour       : NULL
##   ..$ size         : NULL
##   ..$ hjust        : NULL
##   ..$ vjust        : num 0
##   ..$ angle        : NULL
##   ..$ lineheight   : NULL
##   ..$ margin       : 'margin' num [1:4] 0points 0points 2.2points 0points
##   .. ..- attr(*, "unit")= int 8
##   ..$ debug        : NULL
##   ..$ inherit.blank: logi TRUE
##   ..- attr(*, "class")= chr [1:2] "element_text" "element"
##  $ axis.text.x.bottom              : NULL
##  $ axis.text.y                     :List of 11
##   ..$ family       : NULL
##   ..$ face         : NULL
##   ..$ colour       : NULL
##   ..$ size         : NULL
##   ..$ hjust        : num 1
##   ..$ vjust        : NULL
##   ..$ angle        : NULL
##   ..$ lineheight   : NULL
##   ..$ margin       : 'margin' num [1:4] 0points 2.2points 0points 0points
##   .. ..- attr(*, "unit")= int 8
##   ..$ debug        : NULL
##   ..$ inherit.blank: logi TRUE
##   ..- attr(*, "class")= chr [1:2] "element_text" "element"
##  $ axis.text.y.left                : NULL
##  $ axis.text.y.right               :List of 11
##   ..$ family       : NULL
##   ..$ face         : NULL
##   ..$ colour       : NULL
##   ..$ size         : NULL
##   ..$ hjust        : num 0
##   ..$ vjust        : NULL
##   ..$ angle        : NULL
##   ..$ lineheight   : NULL
##   ..$ margin       : 'margin' num [1:4] 0points 0points 0points 2.2points
##   .. ..- attr(*, "unit")= int 8
##   ..$ debug        : NULL
##   ..$ inherit.blank: logi TRUE
##   ..- attr(*, "class")= chr [1:2] "element_text" "element"
##  $ axis.text.theta                 : NULL
##  $ axis.text.r                     :List of 11
##   ..$ family       : NULL
##   ..$ face         : NULL
##   ..$ colour       : NULL
##   ..$ size         : NULL
##   ..$ hjust        : num 0.5
##   ..$ vjust        : NULL
##   ..$ angle        : NULL
##   ..$ lineheight   : NULL
##   ..$ margin       : 'margin' num [1:4] 0points 2.2points 0points 2.2points
##   .. ..- attr(*, "unit")= int 8
##   ..$ debug        : NULL
##   ..$ inherit.blank: logi TRUE
##   ..- attr(*, "class")= chr [1:2] "element_text" "element"
##  $ axis.ticks                      : list()
##   ..- attr(*, "class")= chr [1:2] "element_blank" "element"
##  $ axis.ticks.x                    : NULL
##  $ axis.ticks.x.top                : NULL
##  $ axis.ticks.x.bottom             : NULL
##  $ axis.ticks.y                    : NULL
##  $ axis.ticks.y.left               : NULL
##  $ axis.ticks.y.right              : NULL
##  $ axis.ticks.theta                : NULL
##  $ axis.ticks.r                    : NULL
##  $ axis.minor.ticks.x.top          : NULL
##  $ axis.minor.ticks.x.bottom       : NULL
##  $ axis.minor.ticks.y.left         : NULL
##  $ axis.minor.ticks.y.right        : NULL
##  $ axis.minor.ticks.theta          : NULL
##  $ axis.minor.ticks.r              : NULL
##  $ axis.ticks.length               : 'simpleUnit' num 2.75points
##   ..- attr(*, "unit")= int 8
##  $ axis.ticks.length.x             : NULL
##  $ axis.ticks.length.x.top         : NULL
##  $ axis.ticks.length.x.bottom      : NULL
##  $ axis.ticks.length.y             : NULL
##  $ axis.ticks.length.y.left        : NULL
##  $ axis.ticks.length.y.right       : NULL
##  $ axis.ticks.length.theta         : NULL
##  $ axis.ticks.length.r             : NULL
##  $ axis.minor.ticks.length         : 'rel' num 0.75
##  $ axis.minor.ticks.length.x       : NULL
##  $ axis.minor.ticks.length.x.top   : NULL
##  $ axis.minor.ticks.length.x.bottom: NULL
##  $ axis.minor.ticks.length.y       : NULL
##  $ axis.minor.ticks.length.y.left  : NULL
##  $ axis.minor.ticks.length.y.right : NULL
##  $ axis.minor.ticks.length.theta   : NULL
##  $ axis.minor.ticks.length.r       : NULL
##  $ axis.line                       : list()
##   ..- attr(*, "class")= chr [1:2] "element_blank" "element"
##  $ axis.line.x                     : NULL
##  $ axis.line.x.top                 : NULL
##  $ axis.line.x.bottom              : NULL
##  $ axis.line.y                     : NULL
##  $ axis.line.y.left                : NULL
##  $ axis.line.y.right               : NULL
##  $ axis.line.theta                 : NULL
##  $ axis.line.r                     : NULL
##  $ legend.background               : list()
##   ..- attr(*, "class")= chr [1:2] "element_blank" "element"
##  $ legend.margin                   : 'margin' num [1:4] 5.5points 5.5points 5.5points 5.5points
##   ..- attr(*, "unit")= int 8
##  $ legend.spacing                  : 'simpleUnit' num 11points
##   ..- attr(*, "unit")= int 8
##  $ legend.spacing.x                : NULL
##  $ legend.spacing.y                : NULL
##  $ legend.key                      : list()
##   ..- attr(*, "class")= chr [1:2] "element_blank" "element"
##  $ legend.key.size                 : 'simpleUnit' num 1.2lines
##   ..- attr(*, "unit")= int 3
##  $ legend.key.height               : NULL
##  $ legend.key.width                : NULL
##  $ legend.key.spacing              : 'simpleUnit' num 5.5points
##   ..- attr(*, "unit")= int 8
##  $ legend.key.spacing.x            : NULL
##  $ legend.key.spacing.y            : NULL
##  $ legend.frame                    : NULL
##  $ legend.ticks                    : NULL
##  $ legend.ticks.length             : 'rel' num 0.2
##  $ legend.axis.line                : NULL
##  $ legend.text                     :List of 11
##   ..$ family       : NULL
##   ..$ face         : NULL
##   ..$ colour       : NULL
##   ..$ size         : 'rel' num 0.8
##   ..$ hjust        : NULL
##   ..$ vjust        : NULL
##   ..$ angle        : NULL
##   ..$ lineheight   : NULL
##   ..$ margin       : NULL
##   ..$ debug        : NULL
##   ..$ inherit.blank: logi TRUE
##   ..- attr(*, "class")= chr [1:2] "element_text" "element"
##  $ legend.text.position            : NULL
##  $ legend.title                    :List of 11
##   ..$ family       : NULL
##   ..$ face         : NULL
##   ..$ colour       : NULL
##   ..$ size         : NULL
##   ..$ hjust        : num 0
##   ..$ vjust        : NULL
##   ..$ angle        : NULL
##   ..$ lineheight   : NULL
##   ..$ margin       : NULL
##   ..$ debug        : NULL
##   ..$ inherit.blank: logi TRUE
##   ..- attr(*, "class")= chr [1:2] "element_text" "element"
##  $ legend.title.position           : NULL
##  $ legend.position                 : chr "right"
##  $ legend.position.inside          : NULL
##  $ legend.direction                : NULL
##  $ legend.byrow                    : NULL
##  $ legend.justification            : chr "center"
##  $ legend.justification.top        : NULL
##  $ legend.justification.bottom     : NULL
##  $ legend.justification.left       : NULL
##  $ legend.justification.right      : NULL
##  $ legend.justification.inside     : NULL
##  $ legend.location                 : NULL
##  $ legend.box                      : NULL
##  $ legend.box.just                 : NULL
##  $ legend.box.margin               : 'margin' num [1:4] 0cm 0cm 0cm 0cm
##   ..- attr(*, "unit")= int 1
##  $ legend.box.background           : list()
##   ..- attr(*, "class")= chr [1:2] "element_blank" "element"
##  $ legend.box.spacing              : 'simpleUnit' num 11points
##   ..- attr(*, "unit")= int 8
##   [list output truncated]
##  - attr(*, "class")= chr [1:2] "theme" "gg"
##  - attr(*, "complete")= logi TRUE
##  - attr(*, "validate")= logi TRUE

Giải thích ý nghĩa câu lệnh:

  1. Tạo biểu đồ:

ggplot(hq, aes(x = TIME_PERIOD, y = A.VN.AIP_PC_PP_PT)): Khởi tạo biểu đồ ggplot2 với data table hq. - aes(x = TIME_PERIOD, y = A.VN.AIP_PC_PP_PT): Thiết lập trục x là TIME_PERIOD và trục y là A.VN.AIP_PC_PP_PT.

  1. Thêm hình dạng:

geom_col(position = ‘dodge’, fill= ‘navy’): Thêm hình dạng cột vào biểu đồ với màu xanh navy (navy). - position = ‘dodge’: Sắp xếp các cột cạnh nhau.

  1. Thêm nhãn và tiêu đề:

labs(title = ‘Biểu đồ biến động Tài sản Ròng của Quỹ Đầu tư Bảo hiểm (FIP) - Chính sách Công cộng - Hưu trí - Lợi ích được Hứa hẹn ở Việt Nam theo thời gian’, x= “Năm”, y= “AIP_PC_PP_PT”): Thêm tiêu đề, nhãn trục x và y cho biểu đồ.

  1. Áp dụng chủ đề:

theme_minimal(): Áp dụng chủ đề tối giản cho biểu đồ.

Nhận xét Biểu đồ:

2009-2015: - Tài sản Ròng FIP tăng nhẹ. - Tốc độ tăng trưởng ổn định. 2016-2020: - Tài sản Ròng FIP tăng mạnh. - Tốc độ tăng trưởng tăng cao. 2021-2022: - Tài sản Ròng FIP biến động mạnh. - Tốc độ tăng trưởng không ổn định

2.3.3 Xu hướng AIP_PC_PP_PT của Việt Nam

ggplot(hq, aes(x = TIME_PERIOD, y = A.VN.AIP_PC_PP_PT, group= 1)) +
  geom_line() +
  labs(title = "Xu hướng AIP_PC_PP_PT của Việt Nam",
       x = "Năm",
       y = "AIP_PC_PP_PT") +
  theme_minimal()

Giải thích ý nghĩa câu lệnh:

ggplot(hq, aes(x = TIME_PERIOD, y = A.VN.AIP_PC_PP_PT, group = 1)): Khởi tạo biểu đồ ggplot2 với dữ liệu trong hq. - aes(x = TIME_PERIOD, y = A.VN.AIP_PC_PP_PT, group = 1): Thiết lập trục x là TIME_PERIOD, trục y là A.VN.AIP_PC_PP_PT, và nhóm dữ liệu là 1 (g mặc định cho một nhóm).

geom_line(): Thêm các đường line vào biểu đồ để thể hiện sự thay đổi của dữ liệu theo thời gian. Không cần thiết phải khai báo thêm về màu sắc vì mặc định geom_line sẽ tự chọn màu.

labs(title = “Xu hướng AIP_PC_PP_PT của Việt Nam”, x = “Năm”, y = “AIP_PC_PP_PT”): Thêm tiêu đề, nhãn trục x và y cho biểu đồ.

theme_minimal(): Áp dụng chủ đề tối giản cho biểu đồ, giúp biểu đồ trông sạch sẽ và dễ nhìn.

Nhận xét Biểu đồ:

  1. Biểu đồ thể hiện:

Xu hướng thay đổi của chỉ số AIP_PC_PP_PT của Việt Nam từ năm 2009 đến năm 2022. Chỉ số AIP_PC_PP_PT tăng liên tục trong giai đoạn này. Tốc độ tăng trưởng của chỉ số AIP_PC_PP_PT có xu hướng tăng dần từ năm 2009 đến năm 2022. Chỉ số AIP_PC_PP_PT biến động mạnh trong giai đoạn 2021-2022.

  1. Phân tích theo giai đoạn:

2009-2015: - Chỉ số AIP_PC_PP_PT tăng nhẹ. - Tốc độ tăng trưởng ổn định. 2016-2020: - Chỉ số AIP_PC_PP_PT tăng mạnh. - Tốc độ tăng trưởng tăng cao. 2021-2022: - Chỉ số AIP_PC_PP_PT biến động mạnh. - Tốc độ tăng trưởng không ổn định.

2.3.4 So sánh chỉ số AIP_PC_PP_PT giữa Việt Nam,và Malaysia giai đoạn 2009-2018

library(ggplot2)
library(imf.data)

# Lấy dữ liệu cho các quốc gia VN (Việt Nam) và MY (Malaysia)
vn <- k$get_series(freq = 'A', ref_area = 'VN', indicator = 'AIP_PC_PP_PT')
my <- k$get_series(freq = 'A', ref_area = 'MY', indicator = 'AIP_PC_PP_PT')
my <- subset(my, TIME_PERIOD >= 2009 & TIME_PERIOD <= 2022)
# Xóa các hàng chứa giá trị NA (nếu có)
vn1 <- na.omit(vn)

my1 <- na.omit(my)


# Tạo dataframe tổng hợp
library(dplyr)
gop2 <- full_join(vn1, my1, by = "TIME_PERIOD")
gop2 <- na.omit(gop2)


ggplot(gop2, aes(x = TIME_PERIOD)) +
  geom_line(aes(y = A.VN.AIP_PC_PP_PT, color = "Viet Nam", group = 1)) +
  geom_line(aes(y = A.MY.AIP_PC_PP_PT, color = "Malaysia", group = 1)) +
  labs(title = "So sánh chỉ số AIP_PC_PP_PT giữa Việt Nam và Malaysia (2009-2018)",
       x = "Năm",
       y = "AIP_PC_PP_PT") +
  scale_color_manual(values = c("Viet Nam" = "blue", "Malaysia" = "red")) +
  theme_minimal()

Giải thích ý nghĩa câu lệnh:

  1. Lấy dữ liệu cho Việt Nam (VN) và Malaysia (MY):

vn <- k\(get_series(freq = 'A', ref_area = 'VN', indicator = 'AIP_PC_PP_PT'): Lấy dữ liệu về chỉ số AIP_PC_PP_PT của Việt Nam ("VN") với tần suất hàng năm ("A") và lưu vào biến vn. my <- k\)get_series(freq = ‘A’, ref_area = ‘MY’, indicator = ‘AIP_PC_PP_PT’): Lấy dữ liệu về chỉ số AIP_PC_PP_PT của Malaysia (“MY”) với tần suất hàng năm (“A”) và lưu vào biến my.

  1. Xử lý dữ liệu:

my <- subset(my, TIME_PERIOD >= 2009 & TIME_PERIOD <= 2022): Giữ lại dữ liệu của Malaysia từ năm 2009 đến năm 2022 trong biến my. vn1 <- na.omit(vn): Xóa các hàng chứa giá trị NA trong biến vn và lưu vào biến vn1. my1 <- na.omit(my): Xóa các hàng chứa giá trị NA trong biến my và lưu vào biến my1.

  1. Tạo dataframe tổng hợp:

library(dplyr): Tải thư viện dplyr để sử dụng các hàm thao tác với dataframe. gop2 <- full_join(vn1, my1, by = “TIME_PERIOD”): Kết hợp hai dataframe vn1 và my1 dựa trên cột TIME_PERIOD và lưu vào dataframe gop2. gop2 <- na.omit(gop2): Xóa các hàng chứa giá trị NA trong dataframe gop2.

  1. Tạo biểu đồ:

ggplot(gop2, aes(x = TIME_PERIOD)): Khởi tạo biểu đồ ggplot2 với dataframe gop2 và trục x là TIME_PERIOD. geom_line(aes(y = A.VN.AIP_PC_PP_PT, color = “Viet Nam”, group = 1)): Thêm đường line cho dữ liệu của Việt Nam với màu xanh (“blue”) và nhóm 1. - geom_line(aes(y = A.MY.AIP_PC_PP_PT, color = “Malaysia”, group = 1)): Thêm đường line cho dữ liệu của Malaysia với màu đỏ (“red”) và nhóm 1. - labs(title = “So sánh chỉ số AIP_PC_PP_PT giữa Việt Nam và Malaysia (2009-2018)”, x = “Năm”, y = “AIP_PC_PP_PT”): Thêm tiêu đề, nhãn trục x và y cho biểu đồ. scale_color_manual(values = c(“Viet Nam” = “blue”, “Malaysia” = “red”)): Chọn màu cho các đường line. theme_minimal(): Áp dụng chủ đề tối giản cho biểu đồ.

Nhận xét Biểu đồ:

  1. Biểu đồ thể hiện:

Sự thay đổi của chỉ số AIP_PC_PP_PT của Việt Nam và Malaysia từ năm 2009 đến năm 2022. Chỉ số AIP_PC_PP_PT của Việt Nam tăng liên tục trong giai đoạn này. Chỉ số AIP_PC_PP_PT của Malaysia tăng từ năm 2009 đến năm 2014, sau đó giảm đến năm 2022. Chỉ số AIP_PC_PP_PT của Việt Nam cao hơn so với Malaysia trong phần lớn giai đoạn từ 2009 đến 2022.

  1. Phân tích theo giai đoạn:

2009-2014: - Chỉ số AIP_PC_PP_PT của cả hai quốc gia đều tăng. - Chỉ số AIP_PC_PP_PT của Việt Nam tăng cao hơn so với Malaysia. 2015-2022: - Chỉ số AIP_PC_PP_PT của Việt Nam tiếp tục tăng. - Chỉ số AIP_PC_PP_PT của Malaysia giảm.

2.3.5 Các yếu tố ảnh hưởng đến AIP_PC_PP_PT

Có nhiều yếu tố ảnh hưởng đến AIP_PC_PP_PT, bao gồm:

  1. Nhu cầu chi trả:

Nhu cầu chi trả cho các chương trình chính sách công cộng, hưu trí và lợi ích được hứa hẹn là yếu tố quan trọng nhất ảnh hưởng đến AIP_PC_PP_PT. Nhu cầu chi trả này sẽ tăng lên khi: - Số lượng người hưởng lợi ích từ các chương trình này tăng lên. - Mức chi trả cho mỗi người hưởng lợi ích tăng lên.

  1. Doanh thu:

Doanh thu của Quỹ Hỗ trợ Bảo hiểm đến từ nhiều nguồn khác nhau, bao gồm:

- Phí bảo hiểm
- Lãi suất đầu tư
- Chuyển giao từ ngân sách nhà nước
- Doanh thu sẽ ảnh hưởng trực tiếp đến AIP_PC_PP_PT. Doanh thu cao sẽ giúp AIP_PC_PP_PT tăng lên, và ngược lại.
  1. Lãi suất:

Lãi suất ảnh hưởng đến AIP_PC_PP_PT theo hai cách: Lãi suất cao sẽ giúp Quỹ Hỗ trợ Bảo hiểm kiếm được nhiều tiền hơn từ đầu tư. Lãi suất cao cũng sẽ làm tăng chi phí trả nợ của Quỹ Hỗ trợ Bảo hiểm.

  1. Tỷ giá hối đoái:

Quỹ Hỗ trợ Bảo hiểm có thể đầu tư vào tài sản nước ngoài. Do đó, tỷ giá hối đoái sẽ ảnh hưởng đến giá trị tài sản của Quỹ và AIP_PC_PP_PT.

  1. Chính sách của chính phủ:

Chính sách của chính phủ có thể ảnh hưởng đến AIP_PC_PP_PT theo nhiều cách khác nhau, chẳng hạn như: - Thay đổi mức phí bảo hiểm - Thay đổi mức chi trả cho người hưởng lợi ích - Thay đổi quy định về đầu tư của Quỹ Hỗ trợ Bảo hiểm

Ngoài các yếu tố trên, AIP_PC_PP_PT cũng có thể bị ảnh hưởng bởi các yếu tố khác như:

- Rủi ro thị trường
- Rủi ro thanh khoản
- Chất lượng quản lý của Quỹ Hỗ trợ Bảo hiểm
LS0tDQp0aXRsZTogIk5oaeG7h20gduG7pSA2Ig0KYXV0aG9yOiAiSG9hbmcgUXV5ZW4iDQpkYXRlOiAiYHIgZm9ybWF0KFN5cy50aW1lKCksICclSDolTTolUywgJWQgLSAlbSAtICVZJylgIg0Kb3V0cHV0OiANCiAgaHRtbF9kb2N1bWVudDogDQogICAgZGZfcHJpbnQ6IGthYmxlDQogICAgdG9jOiB0cnVlDQogICAgdG9jX2Zsb2F0OiB0cnVlDQogICAgdG9jX2RlcHRoOiAyDQogICAgbnVtYmVyX3NlY3Rpb25zOiB0cnVlDQogICAgY29kZV9kb3dubG9hZDogdHJ1ZQ0KICAgIGNvZGVfZm9sZGluZzogaGlkZQ0KICB3b3JkX2RvY3VtZW50Og0KICAgIHRvYzogdHJ1ZQ0KICAgIHRvY19kZXB0aDogJzInDQogIHBkZl9kb2N1bWVudDoNCiAgICBsYXRleF9lbmdpbmU6IHhlbGF0ZXgNCi0tLQ0KDQpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0NCmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gVFJVRSkNCmBgYA0KDQojICpQaMOibiB0w61jaCBJbmRpY2F0b3IgTlYuSU5ELk1BTkYuQ0QgdOG7qyBi4buZIGThu68gbGnhu4d1IFdESSoNCg0KIyMgICpHaeG7m2kgdGhp4buHdSB24buBIGluZGljYXRvcjogTlYuSU5ELk1BTkYuQ0QqDQoNCiAgSW5kaWNhdG9yICpOVi5JTkQuTUFORi5DRCosIGhheSBjw7JuIGfhu41pIGzDoCAqR2nDoSB0cuG7iyBnaWEgdMSDbmcgY+G7p2EgbmfDoG5oIHPhuqNuIHh14bqldCAoTWFudWZhY3R1cmluZyBWYWx1ZSBBZGRlZCkqLCDEkW8gbMaw4budbmcgZ2nDoSB0cuG7iyB0xINuZyB0aMOqbSB0cm9uZyBxdcOhIHRyw6xuaCBz4bqjbiB4deG6pXQgY+G7p2EgbeG7mXQgcXXhu5FjIGdpYSwgxJHGsOG7o2MgdMOtbmggYuG6sW5nIMSRxqFuIHbhu4sgdGnhu4FuIHThu4cgVVNEIGhp4buHbiB04bqhaS4NCg0KICAtIMSQ4buLbmggbmdoxKlhOg0KDQogIE5WLklORC5NQU5GLkNEIGzDoCBt4buZdCBjaOG7iSBz4buRIGtpbmggdOG6vyBxdWFuIHRy4buNbmcgdHJvbmcgdmnhu4djIMSRbyBsxrDhu51uZyBob+G6oXQgxJHhu5luZyBz4bqjbiB4deG6pXQgY+G7p2EgbeG7mXQgcXXhu5FjIGdpYS4gTsOzIMSR4bqhaSBkaeG7h24gY2hvIGdpw6EgdHLhu4sgZ2lhIHTEg25nIHThu6sgY8OhYyBxdXkgdHLDrG5oIHPhuqNuIHh14bqldCB0cm9uZyBsxKluaCB24buxYyBjw7RuZyBuZ2hp4buHcC4NCg0KICAtIMOdIG5naMSpYToNCg0KICBDaOG7iSBz4buRIG7DoHkgY3VuZyBj4bqlcCB0aMO0bmcgdGluIHbhu4EgbeG7qWMgxJHhu5kgxJHDs25nIGfDs3AgY+G7p2EgbmfDoG5oIGPDtG5nIG5naGnhu4dwIHPhuqNuIHh14bqldCB2w6BvIHThu5VuZyBz4bqjbiBwaOG6qW0gbuG7mWkgxJHhu4thLCBnacO6cCDEkcOhbmggZ2nDoSBz4bupYyBt4bqhbmggY+G6oW5oIHRyYW5oIHbDoCB0w61uaCBjw6FjaCBt4bqhbmcgY+G7p2EgbuG7gW4ga2luaCB04bq/Lg0KICBOVi5JTkQuTUFORi5DRCBjxaluZyBsw6AgbeG7mXQgdHJvbmcgbmjhu69uZyBjaOG7iSBz4buRIHF1YW4gdHLhu41uZyDEkeG7gyDEkW8gbMaw4budbmcgc+G7sSBwaMOhdCB0cmnhu4NuIGtpbmggdOG6vyBj4bunYSBt4buZdCBxdeG7kWMgZ2lhLiBT4buxIGdpYSB0xINuZyB0cm9uZyBnacOhIHRy4buLIG7DoHkgdGjGsOG7nW5nIMSRxrDhu6NjIGNvaSBsw6AgbeG7mXQgZOG6pXUgaGnhu4d1IHTDrWNoIGPhu7FjIHbhu4Egc+G7sSBwaMOhdCB0cmnhu4NuIGtpbmggdOG6vyBi4buBbiB24buvbmcuDQoNCiAgLSDhu6huZyBk4bulbmc6DQoNCiAgQ2jDrW5oIHBo4bunIHbDoCBjw6FjIG5ow6AgcXXhuqNuIGzDvSBraW5oIHThur8gc+G7rSBk4bulbmcgTlYuSU5ELk1BTkYuQ0QgxJHhu4MgdGhlbyBkw7VpIGhp4buHdSBzdeG6pXQgY+G7p2EgbmfDoG5oIGPDtG5nIG5naGnhu4dwIHPhuqNuIHh14bqldCB0cm9uZyBuxrDhu5tjIHbDoCBzbyBzw6FuaCB24bubaSBjw6FjIHF14buRYyBnaWEga2jDoWMuDQogIERvYW5oIG5naGnhu4dwIHPhu60gZOG7pW5nIGNo4buJIHPhu5EgbsOgeSDEkeG7gyDEkcOhbmggZ2nDoSBjxqEgaOG7mWkga2luaCBkb2FuaCB2w6AgxJHhuqd1IHTGsCB0cm9uZyBuZ8Ogbmggc+G6o24geHXhuqV0IGPhu6dhIG3hu5l0IHF14buRYyBnaWEgY+G7pSB0aOG7gy4NCiAgQ8OhYyBuaMOgIMSR4bqndSB0xrAgc+G7rSBk4bulbmcgdGjDtG5nIHRpbiB04burIE5WLklORC5NQU5GLkNEIMSR4buDIMSRxrBhIHJhIGPDoWMgcXV54bq/dCDEkeG7i25oIMSR4bqndSB0xrAgY8OzIGtp4bq/biB0aOG7qWMgduG7gSBob+G6oXQgxJHhu5luZyBraW5oIGRvYW5oIHbDoCB0cmnhu4NuIHbhu41uZyBj4bunYSBjw6FjIGRvYW5oIG5naGnhu4dwIHRyb25nIGzEqW5oIHbhu7FjIHPhuqNuIHh14bqldC4NCiAgDQogIC0gVsOtIGThu6U6DQogIA0KICBHaeG6oyBz4butIGdpw6EgdHLhu4sgc+G6o24geHXhuqV0IGPhu6dhIG3hu5l0IHF14buRYyBnaWEgbMOgIDEwMCB0cmnhu4d1IFVTRCB2w6AgY2hpIHBow60gxJHhuqd1IHbDoG8gdHJ1bmcgZ2lhbiBsw6AgNTAgdHJp4buHdSBVU0QuIEdpw6EgdHLhu4sgZ2lhIHTEg25nIGPhu6dhIG5nw6BuaCBz4bqjbiB4deG6pXQgKE5WLklORC5NQU5GLkNEKSBz4bq9IGzDoCA1MCB0cmnhu4d1IFVTRC4NCiAgDQogIENo4buJIHPhu5EgbsOgeSBjw7MgdGjhu4MgxJHGsOG7o2Mgc+G7rSBk4bulbmcgxJHhu4Mgc28gc8OhbmggbeG7qWMgxJHhu5kgcGjDoXQgdHJp4buDbiBj4bunYSBuZ8Ogbmggc+G6o24geHXhuqV0IGdp4buvYSBjw6FjIHF14buRYyBnaWEudsOtIGThu6UsIG7hur91IGdpw6EgdHLhu4sgZ2lhIHTEg25nIGPhu6dhIG5nw6BuaCBz4bqjbiB4deG6pXQgY+G7p2EgcXXhu5FjIGdpYSBBIGzDoCA3MCB0cmnhu4d1IFVTRCB2w6AgY+G7p2EgcXXhu5FjIGdpYSBCIGzDoCA2MCB0cmnhu4d1IFVTRCwgY2jDum5nIHRhIGPDsyB0aOG7gyBr4bq/dCBsdeG6rW4gcuG6sW5nIG5nw6BuaCBz4bqjbiB4deG6pXQgY+G7p2EgcXXhu5FjIGdpYSBBIHBow6F0IHRyaeG7g24gaMahbiBzbyB24bubaSBxdeG7kWMgZ2lhIEIgdsOsIGdpw6EgdHLhu4sgZ2lhIHTEg25nIGPhu6dhIG7DsyBjYW8gaMahbi4gxJBp4buBdSBuw6B5IGPDsyB0aOG7gyBjaOG7iSByYSBy4bqxbmcgcXXhu5FjIGdpYSBBIGPDsyBraOG6oyBuxINuZyBz4butIGThu6VuZyBuZ3Xhu5NuIGzhu7FjIHbDoCBjw7RuZyBuZ2jhu4cgaGnhu4d1IHF14bqjIGjGoW4gxJHhu4MgdOG6oW8gcmEgZ2nDoSB0cuG7iyB0cm9uZyBxdcOhIHRyw6xuaCBz4bqjbiB4deG6pXQuDQoNCiMjICpN4bulYyB0acOqdSBiw6FvIGPDoW8qDQogIC0gUGjDom4gdMOtY2ggYmnhur9uIMSR4buZbmcgY+G7p2EgTlYuSU5ELk1BTkYuQ0QgdGhlbyB0aOG7nWkgZ2lhbi4NCiAgLSBTbyBzw6FuaCBOVi5JTkQuTUFORi5DRCBnaeG7r2EgY8OhYyBxdeG7kWMgZ2lhLg0KICAtIFjDoWMgxJHhu4tuaCBjw6FjIHnhur91IHThu5Eg4bqjbmggaMaw4bufbmcgxJHhur9uIE5WLklORC5NQU5GLkNELg0KDQojIyAqUGjhuqFtIHZpIG5naGnDqm4gY+G7qXUqDQogIC0gQ2jhu4kgc+G7kSBOVi5JTkQuTUFORi5DRCBj4bunYSBWaeG7h3QgTmFtIHRyb25nIGdpYWkgxJFv4bqhbiAyMDA1LTIwMjIuDQogIC0gU28gc8OhbmggduG7m2kgY8OhYyBxdeG7kWMgZ2lhIHRyb25nIGtodSB24buxYyBBU0VBTi4NCiMjICpQaMOibiB0w61jaCBpbmRpY2F0b3I6IE5WLklORC5NQU5GLkNEKg0KDQojIyMgKlRodSB0aOG6rXAgZOG7ryBsaeG7h3UqDQogDQogLSBUaHUgdGjhuq1wIGThu68gbGnhu4d1IHbhu4EgKkdpw6EgdHLhu4sgZ2lhIHTEg25nIGPhu6dhIG5nw6BuaCBz4bqjbiB4deG6pXQgKE1hbnVmYWN0dXJpbmcgVmFsdWUgQWRkZWQpKiDhu58gVmnhu4d0IE5hbSAoIMSRxqFuIHbhu4sgdMOtbmggVVNEKQ0KDQpgYGB7cn0NCmxpYnJhcnkodGlkeXZlcnNlKQ0KbGlicmFyeShXREkpDQphIDwtIFdESShpbmRpY2F0b3IgPSAnTlYuSU5ELk1BTkYuQ0QnLCBjb3VudHJ5ID0gYygnVk5NJykpDQoNCmBgYA0KDQotIExv4bqhaSBi4buPIGPDoWMgaMOgbmcgaG/hurdjIGPhu5l0IGNo4bupYSBnacOhIHRy4buLIHRoaeG6v3UgKE5BKSB04burIG3hu5l0IGtodW5nIGThu68gbGnhu4d1IChkYXRhIGZyYW1lKSBjw7MgdMOqbiBsw6AgImEiLg0KDQpgYGB7cn0NCmEgPC0gbmEub21pdChhKQ0KYGBgDQojIyMgKlBow6JuIHTDrWNoIGdpw6EgdHLhu4sgZ2lhIHTEg25nIHPhuqNuIHh14bqldCB0aGVvIHRo4budaSBnaWFuKg0KYGBge3J9DQpsaWJyYXJ5KGdncGxvdDIpDQoNCmdncGxvdChhLCBhZXMoeCA9IHllYXIsIHkgPSBOVi5JTkQuTUFORi5DRCkpICsgDQogIGdlb21fbGluZSgpICsgICAgICAgICAgICAgIA0KICBnZW9tX3BvaW50KGNvbG9yID0gInJlZCIpICsgIA0KICBsYWJzKHRpdGxlID0gIkJp4buDdSDEkeG7kyBnacOhIHRy4buLIGdpYSB0xINuZyBuZ8Ogbmggc+G6o24geHXhuqV0IHRoZW8gdGjhu51pIGdpYW4iLCB4ID0gIk7Eg20iLCB5ID0gIk5WLklORC5NQU5GLkNEIikgKyAgDQogIHRoZW1lX21pbmltYWwoKQ0KYGBgDQoNCipHaeG6o2kgdGjDrWNoIGPDonUgbOG7h25oOioNCiAgDQogIGdncGxvdChhLCBhZXMoeCA9IHllYXIsIHkgPSBOVi5JTkQuTUFORi5DRCkpOg0KDQogICAgLSBnZ3Bsb3Q6IEjDoG0ga2jhu59pIHThuqFvIG3hu5l0IGJp4buDdSDEkeG7kyBnZ3Bsb3QyLg0KICAgIC0gYTogVMOqbiBj4bunYSBkYXRhIGZyYW1lIGNo4bupYSBk4buvIGxp4buHdS4NCiAgICAtIGFlczogSMOgbSBkw7luZyDEkeG7gyB4w6FjIMSR4buLbmggY8OhYyBiaeG6v24gxJHGsOG7o2Mgc+G7rSBk4bulbmcgdHJvbmcgYmnhu4N1IMSR4buTLg0KICAgICAgeCA9IHllYXI6IEJp4bq/biB5ZWFyIMSRxrDhu6NjIHPhu60gZOG7pW5nIGNobyB0cuG7pWMgeC4NCiAgICAgIHkgPSBOVi5JTkQuTUFORi5DRDogQmnhur9uIE5WLklORC5NQU5GLkNEIMSRxrDhu6NjIHPhu60gZOG7pW5nIGNobyB0cuG7pWMgeS4NCiAgZ2VvbV9saW5lKCk6DQoNCiAgICAtIGdlb21fbGluZTogSMOgbSBkw7luZyDEkeG7gyB24bq9IMSRxrDhu51uZyB0aOG6s25nIHRyb25nIGJp4buDdSDEkeG7ky4NCiAgZ2VvbV9wb2ludChjb2xvciA9ICJyZWQiKToNCg0KICAgIC0gZ2VvbV9wb2ludDogSMOgbSBkw7luZyDEkeG7gyB24bq9IGPDoWMgxJFp4buDbSB0cm9uZyBiaeG7g3UgxJHhu5MuDQogICAgLSBjb2xvciA9ICJyZWQiOiBNw6B1IGPhu6dhIGPDoWMgxJFp4buDbSDEkcaw4bujYyDEkeG6t3QgbMOgIMSR4buPLg0KICBsYWJzKHRpdGxlID0gIkJp4buDdSDEkeG7kyBnacOhIHRy4buLIGdpYSB0xINuZyBuZ8Ogbmggc+G6o24geHXhuqV0IHRoZW8gdGjhu51pIGdpYW4iLCB4ID0gIk7Eg20iLCB5ID0gIk5WLklORC5NQU5GLkNEIik6DQoNCiAgICAtIGxhYnM6IEjDoG0gZMO5bmcgxJHhu4MgdGjDqm0gdGnDqnUgxJHhu4EgdsOgIG5ow6NuIGNobyBjw6FjIHRy4bulYy4NCiAgICAtIHRpdGxlOiBUacOqdSDEkeG7gSBj4bunYSBiaeG7g3UgxJHhu5MgbMOgICJCaeG7g3UgxJHhu5MgZ2nDoSB0cuG7iyBnaWEgdMSDbmcgbmfDoG5oIHPhuqNuIHh14bqldCB0aGVvIHRo4budaSBnaWFuIi4NCiAgICAtIHg6IE5ow6NuIGNobyB0cuG7pWMgeCBsw6AgIk7Eg20iLg0KICAgIC0geTogTmjDo24gY2hvIHRy4bulYyB5IGzDoCAiTlYuSU5ELk1BTkYuQ0QiLg0KICB0aGVtZV9taW5pbWFsOiBIw6BtIGTDuW5nIMSR4buDIMOhcCBk4bulbmcgY2jhu6cgxJHhu4EgdOG7kWkgZ2nhuqNuIGNobyBiaeG7g3UgxJHhu5MuDQogICAgLSBL4bq/dCBo4bujcCB04bqldCBj4bqjIGPDoWMgcGjhuqduIGzhuqFpLCBjw6J1IGzhu4duaCBSIG7DoHkgc+G6vSB04bqhbyByYSBt4buZdCBiaeG7g3UgxJHhu5MgZ2dwbG90MiB24bubaSBjw6FjIMSR4bq3YyDEkWnhu4NtIHNhdToNCg0KDQogICpOaOG6rW4geMOpdDoqIA0KICAtIE5nw6BuaCBz4bqjbiB4deG6pXQgVmnhu4d0IE5hbSBjw7MgeHUgaMaw4bubbmcgdMSDbmcgdHLGsOG7n25nIHRyb25nIGdpYWkgxJFv4bqhbiAyMDA1LTIwMjMuIFR1eSBuaGnDqm4sIHThu5FjIMSR4buZIHTEg25nIHRyxrDhu59uZyBraMO0bmcgxJHhu5NuZyDEkeG7gXUgcXVhIGPDoWMgbsSDbSB2w6AgY2jhu4t1IOG6o25oIGjGsOG7n25nIGPhu6dhIG5oaeG7gXUgeeG6v3UgdOG7kS4NCg0KDQojIyMgKlBow6JuIHTDrWNoIE5WLklORC5NQU5GLkNEIGJp4bq/biDEkeG7mW5nIHRyb25nIGdpYWkgxJFv4bqhbiB0csaw4bubYywgdHJvbmcgdsOgIHNhdSBDb3ZpZC0gMTkqDQoNCmBgYHtyfQ0KYSRQZXJpb2QgPC0gaWZlbHNlKGEkeWVhciA8IDIwMjAsICJCZWZvcmUgQ09WSUQtMTkiLA0KICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShhJHllYXIgPj0gMjAyMCAmIGEkeWVhciA8PSAyMDIxICwgIkR1cmluZyBDT1ZJRC0xOSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShhJHllYXIgPiAyMDIxLCAiQWZ0ZXIgQ09WSUQtMTkiLCBOQSkpKQ0KDQpnZ3Bsb3QoYSwgYWVzKHggPSB5ZWFyLCB5ID0gTlYuSU5ELk1BTkYuQ0QsIGNvbG9yID0gUGVyaW9kKSkgKw0KICBnZW9tX3BvaW50KCkgKyAgICAgICAgICAgDQogIGxhYnModGl0bGUgPSAiU+G7sSB0aGF5IMSR4buVaSBj4bunYSBOVi5JTkQuTUFORi5DRCB0csaw4bubYywgdHJvbmcgdsOgIHNhdSBDT1ZJRC0xOSIsDQogICAgICAgeCA9ICJOxINtIiwgeSA9ICJOVi5JTkQuTUFORi5DRCIpICsgIA0KICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYygiQmVmb3JlIENPVklELTE5IiA9ICJ5ZWxsb3ciLCAiRHVyaW5nIENPVklELTE5IiA9ICJyZWQiLCAiQWZ0ZXIgQ09WSUQtMTkiID0gImJsYWNrIikpICsgDQogIHRoZW1lX21pbmltYWwoKQ0KYGBgDQoNCg0KDQoNCipHaeG6o2kgdGjDrWNoIGPDonUgbMOqbmg6Kg0KICBUaMOqbSBj4buZdCBQZXJpb2Q6DQogICAgLSBhJFBlcmlvZCA8LSAuLi46IFRow6ptIG3hu5l0IGPhu5l0IG3hu5tpIHTDqm4gUGVyaW9kIHbDoG8gZGF0YSBmcmFtZSBhLg0KICAgIC0gaWZlbHNlOiBIw6BtIGtp4buDbSB0cmEgxJFp4buBdSBraeG7h24gdsOgIHRy4bqjIHbhu4EgZ2nDoSB0cuG7iyB0xrDGoW5nIOG7qW5nLg0KICAgIC0gS2nhu4NtIHRyYSDEkWnhu4F1IGtp4buHbiDEkeG6p3UgdGnDqm46IGEkeWVhciA8IDIwMjAgKG7Eg20gbmjhu48gaMahbiAyMDIwKS4NCiAgICAgICAgTuG6v3UgxJHDum5nLCBnw6FuIGdpw6EgdHLhu4sgIkJlZm9yZSBDT1ZJRC0xOSIgY2hvIGPhu5l0IFBlcmlvZC4NCiAgICAgICAgTuG6v3UgxJFp4buBdSBraeG7h24gxJHhuqd1IGtow7RuZyDEkcO6bmcsIGtp4buDbSB0cmEgxJFp4buBdSBraeG7h24gdGjhu6kgaGFpOiBhJHllYXIgPj0gMjAyMCAmIGEkeWVhciA8PSAyMDIxIChuxINtIHThu6sgMjAyMCDEkeG6v24gMjAyMSkuDQogICAgICAgIE7hur91IMSRw7puZywgZ8OhbiBnacOhIHRy4buLICJEdXJpbmcgQ09WSUQtMTkiIGNobyBj4buZdCBQZXJpb2QuDQogICAgICAgIE7hur91IGPhuqMgaGFpIMSRaeG7gXUga2nhu4duIHRyw6puIMSR4buBdSBraMO0bmcgxJHDum5nLCBraeG7g20gdHJhIMSRaeG7gXUga2nhu4duIHRo4bupIGJhOiBhJHllYXIgPiAyMDIxIChuxINtIGzhu5tuIGjGoW4gMjAyMSkuDQogICAgICAgIE7hur91IMSRw7puZywgZ8OhbiBnacOhIHRy4buLICJBZnRlciBDT1ZJRC0xOSIgY2hvIGPhu5l0IFBlcmlvZC4NCiAgICAgICAgTuG6v3UgdOG6pXQgY+G6oyDEkWnhu4F1IGtp4buHbiDEkeG7gXUga2jDtG5nIMSRw7puZywgZ8OhbiBnacOhIHRy4buLIE5BIChnacOhIHRy4buLIHRoaeG6v3UpLg0KICBU4bqhbyBiaeG7g3UgxJHhu5M6DQogICAgLSBnZ3Bsb3QoYSwgYWVzKC4uLikpOiBLaOG7n2kgdOG6oW8gYmnhu4N1IMSR4buTIGdncGxvdDIgdOG7qyBkYXRhIGZyYW1lIGEuDQogICAgLSBhZXMoeCA9IHllYXIsIHkgPSBOVi5JTkQuTUFORi5DRCwgY29sb3IgPSBQZXJpb2QpOiBUaGnhur90IGzhuq1wIHRo4bqpbSBt4bu5IChhZXMpIGNobyBiaeG7g3UgxJHhu5MuDQogICAgICB4ID0geWVhcjogVHLhu6VjIHggc+G7rSBk4bulbmcgYmnhur9uIHllYXIuDQogICAgICB5ID0gTlYuSU5ELk1BTkYuQ0Q6IFRy4bulYyB5IHPhu60gZOG7pW5nIGJp4bq/biBOVi5JTkQuTUFORi5DRC4NCiAgICAgIGNvbG9yID0gUGVyaW9kOiBNw6B1IGPhu6dhIGPDoWMgxJFp4buDbSDEkcaw4bujYyB4w6FjIMSR4buLbmggYuG7n2kgZ2nDoSB0cuG7iyB0cm9uZyBj4buZdCBQZXJpb2QuDQogICAgLSBnZW9tX3BvaW50KCk6IFRow6ptIGPDoWMgxJFp4buDbSBk4buvIGxp4buHdSB2w6BvIGJp4buDdSDEkeG7ky4NCiAgICAtIGxhYnMoLi4uKTogVGjDqm0gdGnDqnUgxJHhu4EgdsOgIG5ow6NuIGNobyBiaeG7g3UgxJHhu5MuDQogICAgICB0aXRsZTogVGnDqnUgxJHhu4EgbMOgICJT4buxIHRoYXkgxJHhu5VpIGPhu6dhIE5WLklORC5NQU5GLkNEIHRyxrDhu5tjLCB0cm9uZyB2w6Agc2F1IENPVklELTE5Ii4NCiAgICAgIHg6IE5ow6NuIHRy4bulYyB4IGzDoCAiTsSDbSIuDQogICAgICB5OiBOaMOjbiB0cuG7pWMgeSBsw6AgIk5WLklORC5NQU5GLkNEIi4NCiAgICAtIHNjYWxlX2NvbG9yX21hbnVhbCguLi4pOiBUaGnhur90IGzhuq1wIG3DoHUgc+G6r2MgY2hvIGPDoWMgxJFp4buDbSB0aGVvIGdpw6EgdHLhu4sgdHJvbmcgY+G7mXQgUGVyaW9kLg0KICAgICAgdmFsdWVzOiBC4bqjbmcgdHJhIGPhu6l1IG3DoHUuDQogICAgICAiQmVmb3JlIENPVklELTE5IiAtIG3DoHUgdsOgbmcgKCJ5ZWxsb3ciKS4NCiAgICAgICJEdXJpbmcgQ09WSUQtMTkiIC0gbcOgdSDEkeG7jyAoInJlZCIpLg0KICAgICAgIkFmdGVyIENPVklELTE5IiAtIG3DoHUgxJFlbiAoImJsYWNrIikuDQogICAgLSB0aGVtZV9taW5pbWFsKCk6IMOBcCBk4bulbmcgY2jhu6cgxJHhu4EgdOG7kWkgZ2nhuqNuIGNobyBiaeG7g3UgxJHhu5MuDQoNCipOaOG6rW4geMOpdCBiaeG7g3UgxJHhu5M6Kg0KLSBUcsaw4bubYyBDT1ZJRC0xOToNCkNo4buJIHPhu5EgTlYuSU5ELk1BTkYuQ0QgY8OzIHh1IGjGsOG7m25nIHTEg25nIGxpw6puIHThu6VjIHThu6sgbsSDbSAyMDA1IMSR4bq/biBuxINtIDIwMTkuIA0KDQpU4buRYyDEkeG7mSB0xINuZyB0csaw4bufbmcgbmhhbmggdHJvbmcgZ2lhaSDEkW/huqFuIMSR4bqndSAoMjAwNS0yMDEwKSB2w6AgY2jhuq1tIGThuqduIHRyb25nIGdpYWkgxJFv4bqhbiBzYXUgKDIwMTEtMjAxOSkuDQoNCiAgLSBUcm9uZyBDT1ZJRC0xOToNCkNo4buJIHPhu5EgTlYuSU5ELk1BTkYuQ0QgZ2nhuqNtIG3huqFuaCB2w6BvIG7Eg20gMjAyMCwgY8OzIHRo4buDIGRvIOG6o25oIGjGsOG7n25nIGPhu6dhIMSR4bqhaSBk4buLY2ggQ09WSUQtMTkuIA0KDQpUdXkgbmhpw6puLCBjaOG7iSBz4buRIE5WLklORC5NQU5GLkNEIGPDsyBk4bqldSBoaeG7h3UgcGjhu6VjIGjhu5NpIHbDoG8gbsSDbSAyMDIxLiANCg0KLSBTYXUgQ09WSUQtMTk6DQpDaOG7iSBz4buRIE5WLklORC5NQU5GLkNEIHRp4bq/cCB04bulYyB0xINuZyB0cm9uZyBnaWFpIMSRb+G6oW4gMjAyMi0yMDI0LiANCg0KVHV5IG5oacOqbiwgdOG7kWMgxJHhu5kgdMSDbmcgdHLGsOG7n25nIGNo4bqtbSBoxqFuIHNvIHbhu5tpIGdpYWkgxJFv4bqhbiB0csaw4bubYyBDT1ZJRC0xOS4NCg0KLSBL4bq/dCBsdeG6rW46DQoNCkJp4buDdSDEkeG7kyBjaG8gdGjhuqV5IHPhu7EgYmnhur9uIMSR4buZbmcgY+G7p2EgQ2jhu4kgc+G7kSBz4bqjbiB4deG6pXQgY8O0bmcgbmdoaeG7h3AgKE5WLklORC5NQU5GLkNEKSB0aGVvIHRo4budaSBnaWFuLCDEkeG6t2MgYmnhu4d0IGzDoCBz4buxIOG6o25oIGjGsOG7n25nIGPhu6dhIMSR4bqhaSBk4buLY2ggQ09WSUQtMTkuIA0KDQpCaeG7g3UgxJHhu5MgY8WpbmcgY2hvIHRo4bqleSBk4bqldSBoaeG7h3UgcGjhu6VjIGjhu5NpIGPhu6dhIG5nw6BuaCBz4bqjbiB4deG6pXQgc2F1IMSR4bqhaSBk4buLY2guDQoNCiMjIyAqVOG7tyBs4buHIHTEg25nIHRyxrDhu59uZyBuZ8Ogbmggc+G6o24geHXhuqV0IHRoZW8gdGjhu51pIGdpYW4qDQoNCmBgYHtyfQ0KbGlicmFyeShkcGx5cikNCg0KIyBUw61uaCB0b8OhbiB04bu3IGzhu4cgdMSDbmcgdHLGsOG7n25nIHRyb25nIHThu6tuZyBnaWFpIMSRb+G6oW4NCmdyb3d0aF9yYXRlX2EgPC0gYSAlPiUNCiAgbXV0YXRlKGdyb3d0aCA9IChOVi5JTkQuTUFORi5DRCAtIGxhZyhOVi5JTkQuTUFORi5DRCkpIC8gbGFnKE5WLklORC5NQU5GLkNEKSAqIDEwMCkNCg0KIyBYZW0ga+G6v3QgcXXhuqMNCg0KZ2dwbG90KGdyb3d0aF9yYXRlX2EsIGFlcyh4ID0geWVhciwgeSA9IGdyb3d0aCkpICsgDQogIGdlb21fbGluZSgpICsgICAgICAgICAgICAgIA0KICBnZW9tX3BvaW50KGNvbG9yID0gInJlZCIpICsgIA0KICBsYWJzKHRpdGxlID0gIkJp4buDdSDEkeG7kyB04bu3IGzhu4cgdMSDbmcgdHLGsOG7n25nIG5nw6BuaCBz4bqjbiB4deG6pXQgdGhlbyB0aOG7nWkgZ2lhbiIsIHggPSAiTsSDbSIsIHkgPSAiVOG7tyBs4buHIHTEg25nIHRyxrDhu59uZyBuZ8Ogbmggc+G6o24geHXhuqV0IikgKyAgDQogIHRoZW1lX21pbmltYWwoKQ0KYGBgDQoNCg0KKkdp4bqjaSB0aMOtY2ggY8OidSBsw6puaDoqIA0KDQoxLiBUw61uaCB0b8OhbiB04bu3IGzhu4cgdMSDbmcgdHLGsOG7n25nIHRyb25nIHThu6tuZyBnaWFpIMSRb+G6oW46DQoNCi0gU+G7rSBk4bulbmcgaMOgbSBtdXRhdGUgxJHhu4MgdGjDqm0gbeG7mXQgY+G7mXQgbeG7m2kgdMOqbiBncm93dGggdsOgbyBkYXRhIGZyYW1lIGEuDQotIEPhu5l0IGdyb3d0aCBjaOG7qWEgdOG7tyBs4buHIHTEg25nIHRyxrDhu59uZyBj4bunYSBOVi5JTkQuTUFORi5DRCBjaG8gdOG7q25nIG7Eg20uDQotIFThu7cgbOG7hyB0xINuZyB0csaw4bufbmcgxJHGsOG7o2MgdMOtbmggdG/DoW4gYuG6sW5nIGPDoWNoIHPhu60gZOG7pW5nIGPDtG5nIHRo4bupYyBzYXU6DQooTlYuSU5ELk1BTkYuQ0QgLSBsYWcoTlYuSU5ELk1BTkYuQ0QpKSAvIGxhZyhOVi5JTkQuTUFORi5DRCkgKiAxMDANCmxhZyhOVi5JTkQuTUFORi5DRCkgbOG6pXkgZ2nDoSB0cuG7iyBj4bunYSBOVi5JTkQuTUFORi5DRCDhu58gbsSDbSB0csaw4bubYy4NCi0gQ8O0bmcgdGjhu6ljIG7DoHkgdMOtbmggdG/DoW4gc+G7sSB0aGF5IMSR4buVaSBwaOG6p24gdHLEg20gY+G7p2EgTlYuSU5ELk1BTkYuQ0Qgc28gduG7m2kgbsSDbSB0csaw4bubYy4NCg0KMi4gVuG6vSBiaeG7g3UgxJHhu5MgdOG7tyBs4buHIHTEg25nIHRyxrDhu59uZzoNCg0KLSBT4butIGThu6VuZyBnZ3Bsb3QyIMSR4buDIHThuqFvIGJp4buDdSDEkeG7kyDEkcaw4budbmcgdGjhurNuZyBoaeG7g24gdGjhu4sgdOG7tyBs4buHIHTEg25nIHRyxrDhu59uZyB0aGVvIHRo4budaSBnaWFuLg0KLSBUcuG7pWMgeCBoaeG7g24gdGjhu4sgbsSDbS4NCi0gVHLhu6VjIHkgaGnhu4NuIHRo4buLIHThu7cgbOG7hyB0xINuZyB0csaw4bufbmcuDQotIEPDoWMgxJFp4buDbSDEkcaw4bujYyB0w7QgbcOgdSDEkeG7jyDEkeG7gyBk4buFIGTDoG5nIHBow6JuIGJp4buHdC4NCi0gVGnDqnUgxJHhu4EgdsOgIG5ow6NuIHRy4bulYyDEkcaw4bujYyB0aMOqbSB2w6BvIMSR4buDIGzDoG0gcsO1IHRow7RuZyB0aW4gYmnhu4N1IMSR4buTLg0KLSBDaOG7pyDEkeG7gSB04buRaSBnaeG6o24gxJHGsOG7o2Mgw6FwIGThu6VuZyDEkeG7gyB0xINuZyB0w61uaCB0aOG6qW0gbeG7uS4NCg0KKk5o4bqtbiB4w6l0IGJp4buDdSDEkeG7kzoqDQoNCg0KMS4gQmnhu4N1IMSR4buTIHRo4buDIGhp4buHbjoNCg0KLSBU4bu3IGzhu4cgdMSDbmcgdHLGsOG7n25nIHRy4bqjIHbhu4EgZ2nDoSB0cuG7iyDDom0gdHJvbmcgZ2lhaSDEkW/huqFuIDIwMDgtMjAwOSwgMjAxMS0yMDEyLCB2w6AgMjAyMC4NCi0gVOG7tyBs4buHIHTEg25nIHRyxrDhu59uZyDEkeG6oXQgxJHhu4luaCB2w6BvIG7Eg20gMjAxMCwgMjAxNywgdsOgIDIwMjMuDQotIEJp4buDdSDEkeG7kyBjw7MgeHUgaMaw4bubbmcgYmnhur9uIMSR4buZbmcgbeG6oW5oIHRoZW8gdGjhu51pIGdpYW4uDQoNCjIuIFBow6JuIHTDrWNoIHRoZW8gZ2lhaSDEkW/huqFuOg0KDQogIFRyxrDhu5tjIENPVklELTE5Og0KICAtIFThu7cgbOG7hyB0xINuZyB0csaw4bufbmcgYmnhur9uIMSR4buZbmcgbeG6oW5oIHThu6sgbsSDbSAyMDA1IMSR4bq/biBuxINtIDIwMTkuDQogIC0gQ8OzIGhhaSBnaWFpIMSRb+G6oW4gc3V5IHRob8OhaSB2w6BvIG7Eg20gMjAwOC0yMDA5IHbDoCAyMDExLTIwMTIuDQogIC0gVOG7tyBs4buHIHTEg25nIHRyxrDhu59uZyDEkeG6oXQgxJHhu4luaCB2w6BvIG7Eg20gMjAxMCB2w6AgMjAxNy4NCiAgVHJvbmcgQ09WSUQtMTk6DQogIC0gVOG7tyBs4buHIHTEg25nIHRyxrDhu59uZyBnaeG6o20gbeG6oW5oIHbDoG8gbsSDbSAyMDIwLCBjw7MgdGjhu4MgZG8g4bqjbmggaMaw4bufbmcgY+G7p2EgxJHhuqFpIGThu4tjaCBDT1ZJRC0xOS4NCiAgU2F1IENPVklELTE5Og0KICAtIFThu7cgbOG7hyB0xINuZyB0csaw4bufbmcgcGjhu6VjIGjhu5NpIHbDoG8gbsSDbSAyMDIxIHbDoCDEkeG6oXQgxJHhu4luaCB2w6BvIG7Eg20gMjAyMy4NCiAgDQozLiBTbyBzw6FuaCB24bubaSBiaeG7g3UgxJHhu5MgTlYuSU5ELk1BTkYuQ0Q6DQoNCi0gQmnhu4N1IMSR4buTIHThu7cgbOG7hyB0xINuZyB0csaw4bufbmcgdGjhu4MgaGnhu4duIHPhu7EgYmnhur9uIMSR4buZbmcgbeG6oW5oIGjGoW4gc28gduG7m2kgYmnhu4N1IMSR4buTIE5WLklORC5NQU5GLkNELg0KLSDEkGnhu4F1IG7DoHkgY2hvIHRo4bqleSBz4buxIG5o4bqheSBj4bqjbSBj4bunYSB04bu3IGzhu4cgdMSDbmcgdHLGsOG7n25nIMSR4buRaSB24bubaSBjw6FjIGJp4bq/biDEkeG7mW5nIGtpbmggdOG6vy4NCg0KDQoNCiMjIyAqU28gc8OhbmggY2jhu4kgc+G7kSBOVi5JTkQuTUFORi5DRCBnaeG7r2EgVmnhu4d0IE5hbSwgVHJ1bmcgUXXhu5FjIHbDoCBNYWxheXNpYSoNCiANCmBgYHtyfQ0KbGlicmFyeShXREkpDQpzcyA8LSBXREkoaW5kaWNhdG9yID0gIk5WLklORC5NQU5GLkNEIiwgY291bnRyeSA9IGMoIk1ZIiwgIlNHIiwgIlZOIiksIHN0YXJ0ID0gMjAwNSwgZW5kID0gMjAyMikNCnNzIDwtIG5hLm9taXQoc3MpDQoNCmxpYnJhcnkoZ2dwbG90MikNCmdncGxvdChzcywgYWVzKHggPSB5ZWFyLCB5ID0gTlYuSU5ELk1BTkYuQ0QsIGNvbG9yID0gY291bnRyeSkpICsNCiAgZ2VvbV9saW5lKCkgKw0KICBsYWJzKHRpdGxlID0gIkJp4buDdSDEkeG7kyBzbyBzw6FuaCBHacOhIHRy4buLIGdpYSB0xINuZyBuZ8Ogbmggc+G6o24geHXhuqV0IiwNCiAgICAgICB4ID0gIk7Eg20iLA0KICAgICAgIHkgPSAiR2nDoSB0cuG7iyBnaWEgdMSDbmcgbmfDoG5oIHPhuqNuIHh14bqldCAoTWFudWZhY3R1cmluZyBWYWx1ZSBBZGRlZCkoY3VycmVudCBVUyQpIikgKw0KICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYygiYmx1ZSIsICJyZWQiLCAiZ3JlZW4iKSkgKyAgDQogIHRoZW1lX21pbmltYWwoKQ0KYGBgDQoNCg0KKkdp4bqjaSB0aMOtY2ggY8OidSBs4buHbmg6Kg0KICBzcyA8LSBXREkoaW5kaWNhdG9yID0gIk5WLklORC5NQU5GLkNEIiwgY291bnRyeSA9IGMoIk1ZIiwgIlNHIiwgIlZOIiksIHN0YXJ0ID0gMjAwNSwgZW5kID0gMjAyMik6DQoNCiAgc3MgPC0gV0RJKC4uLikgZMO5bmcgxJHhu4MgdHJ1eSB4deG6pXQgZOG7ryBsaeG7h3UgdOG7qyBOZ8OibiBow6BuZyBUaOG6vyBnaeG7m2kuDQogIGluZGljYXRvciA9ICJOVi5JTkQuTUFORi5DRCI6IENo4buJIHPhu5EgY+G6p24gdHJ1eSB4deG6pXQgbMOgICJHacOhIHRy4buLIGdpYSB0xINuZyBuZ8Ogbmggc+G6o24geHXhuqV0IChjb25zdGFudCAyMDEwIFVTJCkiLg0KICBjb3VudHJ5ID0gYygiTVkiLCAiU0ciLCAiVk4iKTogTOG6pXkgZOG7ryBsaeG7h3UgY+G7p2EgYmEgbsaw4bubYzogTWFsYXlzaWEgKCJNWSIpLCBTaW5nYXBvcmUgKCJTRyIpLCB2w6AgVmnhu4d0IE5hbSAoIlZOIikuDQogICAgc3RhcnQgPSAyMDA1LCBlbmQgPSAyMDIyOiBLaG/huqNuZyB0aOG7nWkgZ2lhbiBs4bqleSBk4buvIGxp4buHdSB04burIG7Eg20gMjAwNSDEkeG6v24gbsSDbSAyMDIyLg0KICBL4bq/dCBxdeG6oyDEkcaw4bujYyBsxrB1IHbDoG8gZGF0YSBmcmFtZSBzcy4NCg0KMy4gc3MgPC0gbmEub21pdChzcyk6DQoNCiAgc3MgPC0gbmEub21pdChzcykgbG/huqFpIGLhu48gY8OhYyBkw7JuZyB0cm9uZyBkYXRhIGZyYW1lIHNzIGPDsyBjaOG7qWEgZ2nDoSB0cuG7iyB0aGnhur91IChOQSkuDQoNCjQuIFRoxrAgdmnhu4duIGdncGxvdDIgdsOgIHThuqFvIGJp4buDdSDEkeG7kzoNCg0KICBQaOG6p24gY8OybiBs4bqhaSBj4bunYSDEkW/huqFuIGNvZGUgc+G7rSBk4bulbmcgdGjGsCB2aeG7h24gZ2dwbG90MiDEkeG7gyB04bqhbyBiaeG7g3UgxJHhu5MuDQogIEJp4buDdSDEkeG7kyBuw6B5IGhp4buDbiB0aOG7iyBz4buxIHNvIHPDoW5oIEdpw6EgdHLhu4sgZ2lhIHTEg25nIG5nw6BuaCBz4bqjbiB4deG6pXQgKHRy4bulYyB5KSB0aGVvIHRo4budaSBnaWFuICh0cuG7pWMgeCkgZ2nhu69hIGJhIG7GsOG7m2MgTWFsYXlzaWEgKHhhbmggZMawxqFuZyksIFNpbmdhcG9yZSAoxJHhu48pLCB2w6AgVmnhu4d0IE5hbSAoeGFuaCBsw6EpLg0KDQoqTmjhuq1uIHjDqXQ6Kg0KDQoxLiBCaeG7g3UgxJHhu5MgdGjhu4MgaGnhu4duOg0KDQogIEdpw6EgdHLhu4sgZ2lhIHTEg25nIG5nw6BuaCBz4bqjbiB4deG6pXQgY+G7p2EgTWFsYXlzaWEgY2FvIGjGoW4gU2luZ2Fwb3JlIHbDoCBWaeG7h3QgTmFtIHRyb25nIHN14buRdCBnaWFpIMSRb+G6oW4gMjAwNS0yMDIyLg0KICBHacOhIHRy4buLIGdpYSB0xINuZyBuZ8Ogbmggc+G6o24geHXhuqV0IGPhu6dhIFNpbmdhcG9yZSB0xINuZyB0csaw4bufbmcgbmhhbmggaMahbiBWaeG7h3QgTmFtIHRyb25nIGdpYWkgxJFv4bqhbiAyMDA1LTIwMjIuDQogIEdpw6EgdHLhu4sgZ2lhIHTEg25nIG5nw6BuaCBz4bqjbiB4deG6pXQgY+G7p2EgVmnhu4d0IE5hbSB0xINuZyB0csaw4bufbmcgbeG6oW5oIHRyb25nIGdpYWkgxJFv4bqhbiAyMDE1LTIwMjIuDQoNCjIuIFBow6JuIHTDrWNoIHRoZW8gdOG7q25nIG7GsOG7m2M6DQoNCiAgTWFsYXlzaWE6DQogICAgLSBHacOhIHRy4buLIGdpYSB0xINuZyBuZ8Ogbmggc+G6o24geHXhuqV0IHTEg25nIGxpw6puIHThu6VjIHThu6sgbsSDbSAyMDA1IMSR4bq/biBuxINtIDIwMjIuDQogICAgLSBU4buRYyDEkeG7mSB0xINuZyB0csaw4bufbmcgZ2nhuqNtIGThuqduIHRyb25nIGdpYWkgxJFv4bqhbiAyMDE1LTIwMjIuDQogIFNpbmdhcG9yZToNCiAgICAtIEdpw6EgdHLhu4sgZ2lhIHTEg25nIG5nw6BuaCBz4bqjbiB4deG6pXQgdMSDbmcgbGnDqm4gdOG7pWMgdOG7qyBuxINtIDIwMDUgxJHhur9uIG7Eg20gMjAyMi4NCiAgICAtIFThu5FjIMSR4buZIHTEg25nIHRyxrDhu59uZyBuaGFuaCBoxqFuIFZp4buHdCBOYW0uDQogIFZp4buHdCBOYW06DQogICAgLSBHacOhIHRy4buLIGdpYSB0xINuZyBuZ8Ogbmggc+G6o24geHXhuqV0IHTEg25nIGxpw6puIHThu6VjIHThu6sgbsSDbSAyMDA1IMSR4bq/biBuxINtIDIwMjIuDQogICAgLSBU4buRYyDEkeG7mSB0xINuZyB0csaw4bufbmcgY2jhuq1tIGjGoW4gTWFsYXlzaWEgdsOgIFNpbmdhcG9yZSB0cm9uZyBnaWFpIMSRb+G6oW4gMjAwNS0yMDE1Lg0KICAgIC0gVHV5IG5oacOqbiwgdOG7kWMgxJHhu5kgdMSDbmcgdHLGsOG7n25nIHTEg25nIG3huqFuaCB0cm9uZyBnaWFpIMSRb+G6oW4gMjAxNS0yMDIyLg0KIA0KDQojIyMgKkPDoWMgeeG6v3UgdOG7kSDhuqNuaCBoxrDhu59uZyDEkeG6v24gTlYuSU5ELk1BTkYuQ0QqDQoNCiAgQ8OhYyB54bq/dSB04buRIOG6o25oIGjGsOG7n25nIMSR4bq/biBOVi5JTkQuTUFORi5DRCAoR2nDoSB0cuG7iyBnaWEgdMSDbmcgY+G7p2EgbmfDoG5oIHPhuqNuIHh14bqldCAoVVNEIGhp4buHbiB04bqhaSkpDQoNCiAgQ8OzIG5oaeG7gXUgeeG6v3UgdOG7kSDhuqNuaCBoxrDhu59uZyDEkeG6v24gTlYuSU5ELk1BTkYuQ0QsIGJhbyBn4buTbToNCg0KIyMjIyBZ4bq/dSB04buRIHbEqSBtw7Q6DQoNCiAgLSBUxINuZyB0csaw4bufbmcga2luaCB04bq/OiBO4buBbiBraW5oIHThur8gdMSDbmcgdHLGsOG7n25nIHPhur0gdGjDumMgxJHhuql5IG5odSBj4bqndSBjaG8gY8OhYyBz4bqjbiBwaOG6qW0gY8O0bmcgbmdoaeG7h3AsIGThuqtuIMSR4bq/biB0xINuZyBnacOhIHRy4buLIGdpYSB0xINuZy4NCiAgLSBMw6NpIHN14bqldCBuZ8OibiBow6BuZzogTMOjaSBzdeG6pXQgY2FvIHPhur0ga2hp4bq/biBkb2FuaCBuZ2hp4buHcCBraMOzIHRp4bq/cCBj4bqtbiB24buRbiB2YXksIOG6o25oIGjGsOG7n25nIMSR4bq/biBob+G6oXQgxJHhu5luZyBz4bqjbiB4deG6pXQgdsOgIGdpw6EgdHLhu4sgZ2lhIHTEg25nLg0KICAtIFThu7cgZ2nDoSBo4buRaSDEkW/DoWk6IFThu7cgZ2nDoSBo4buRaSDEkW/DoWkgYmnhur9uIMSR4buZbmcg4bqjbmggaMaw4bufbmcgxJHhur9uIGdpw6EgY+G6oyBow6BuZyBow7NhIHh14bqldCBraOG6qXUgdsOgIG5o4bqtcCBraOG6qXUsIHTDoWMgxJHhu5luZyDEkeG6v24gZ2nDoSB0cuG7iyBnaWEgdMSDbmcuDQogIC0gQ8OhbiBjw6JuIHRoxrDGoW5nIG3huqFpOiBDw6FuIGPDom4gdGjGsMahbmcgbeG6oWkgdGjDom0gaOG7pXQgc+G6vSDhuqNuaCBoxrDhu59uZyB0acOqdSBj4buxYyDEkeG6v24gZ2nDoSB0cuG7iyBnaWEgdMSDbmcuDQogIC0gQ2jDrW5oIHPDoWNoIGPhu6dhIGNow61uaCBwaOG7pzogQ2jDrW5oIHPDoWNoIGjhu5cgdHLhu6MgZG9hbmggbmdoaeG7h3AsIMSR4bqndSB0xrAgdsOgbyBjxqEgc+G7nyBo4bqhIHThuqduZywgdi52LiBz4bq9IHRow7pjIMSR4bqpeSBnacOhIHRy4buLIGdpYSB0xINuZy4NCg0KIyMjIyBZ4bq/dSB04buRIG5nw6BuaDoNCg0KICAtIE7Eg25nIHN14bqldCBsYW8gxJHhu5luZzogTsSDbmcgc3XhuqV0IGxhbyDEkeG7mW5nIGNhbyBz4bq9IGdpw7pwIGRvYW5oIG5naGnhu4dwIHPhuqNuIHh14bqldCBuaGnhu4F1IHPhuqNuIHBo4bqpbSBoxqFuIHbhu5tpIGPDuW5nIG3hu5l0IGzGsOG7o25nIGxhbyDEkeG7mW5nLCBk4bqrbiDEkeG6v24gdMSDbmcgZ2nDoSB0cuG7iyBnaWEgdMSDbmcuDQogIC0gQ8O0bmcgbmdo4buHOiBWaeG7h2Mgw6FwIGThu6VuZyBjw7RuZyBuZ2jhu4cgdGnDqm4gdGnhur9uIHPhur0gZ2nDunAgZG9hbmggbmdoaeG7h3AgbsOibmcgY2FvIGhp4buHdSBxdeG6oyBz4bqjbiB4deG6pXQsIGdp4bqjbSBjaGkgcGjDrSwgdsOgIHTEg25nIGdpw6EgdHLhu4sgZ2lhIHTEg25nLg0KICAtIEPhuqFuaCB0cmFuaDogQ+G6oW5oIHRyYW5oIGdheSBn4bqvdCBz4bq9IGJ14buZYyBkb2FuaCBuZ2hp4buHcCBwaOG6o2kgbsOibmcgY2FvIGNo4bqldCBsxrDhu6NuZyBz4bqjbiBwaOG6qW0sIGdp4bqjbSBjaGkgcGjDrSwgdsOgIMSR4buVaSBt4bubaSBzw6FuZyB04bqhbyDEkeG7gyBkdXkgdHLDrCB0aOG7iyBwaOG6p24sIGThuqtuIMSR4bq/biB0xINuZyBnacOhIHRy4buLIGdpYSB0xINuZy4NCiAgLSBHacOhIG5ndXnDqm4gduG6rXQgbGnhu4d1OiBHacOhIG5ndXnDqm4gduG6rXQgbGnhu4d1IHTEg25nIGNhbyBz4bq9IOG6o25oIGjGsOG7n25nIMSR4bq/biBjaGkgcGjDrSBz4bqjbiB4deG6pXQgdsOgIGdpw6EgdHLhu4sgZ2lhIHTEg25nLg0KDQojIyMjIFnhur91IHThu5EgZG9hbmggbmdoaeG7h3A6DQoNCiAgLSBLaOG6oyBuxINuZyBxdeG6o24gbMO9OiBLaOG6oyBuxINuZyBxdeG6o24gbMO9IHThu5F0IHPhur0gZ2nDunAgZG9hbmggbmdoaeG7h3Agc+G7rSBk4bulbmcgaGnhu4d1IHF14bqjIG5ndeG7k24gbOG7sWMsIGdp4bqjbSBjaGkgcGjDrSwgdsOgIHTEg25nIGdpw6EgdHLhu4sgZ2lhIHTEg25nLg0KQ2hp4bq/biBsxrDhu6NjIGtpbmggZG9hbmg6IENoaeG6v24gbMaw4bujYyBraW5oIGRvYW5oIGhp4buHdSBxdeG6oyBz4bq9IGdpw7pwIGRvYW5oIG5naGnhu4dwIGtoYWkgdGjDoWMgdGjhu4sgdHLGsOG7nW5nIHRp4buBbSBuxINuZywgdMSDbmcgZG9hbmggdGh1LCB2w6AgZ2nDoSB0cuG7iyBnaWEgdMSDbmcuDQogIC0gTmd14buTbiB24buRbjogRG9hbmggbmdoaeG7h3AgY8OzIG5ndeG7k24gduG7kW4gxJHhu6cgc+G6vSBjw7MgxJFp4buBdSBraeG7h24gxJHhuqd1IHTGsCB2w6BvIGPDtG5nIG5naOG7hywgbeG7nyBy4buZbmcgc+G6o24geHXhuqV0LCB2w6AgdMSDbmcgZ2nDoSB0cuG7iyBnaWEgdMSDbmcuDQogIA0KICBOZ2/DoGkgcmEsIGPDsm4gY8OzIG3hu5l0IHPhu5EgeeG6v3UgdOG7kSBraMOhYyBuaMawOg0KDQogIC0gVGhpw6puIHRhaSwgZOG7i2NoIGLhu4duaC4NCiAgLSBCaeG6v24gxJHhu5VpIGtow60gaOG6rXUuDQogIC0gQ8SDbmcgdGjhurNuZyBjaMOtbmggdHLhu4ssIGNoaeG6v24gdHJhbmggdGjGsMahbmcgbeG6oWkuDQoNCiMjIyMgUGjDom4gdMOtY2gg4bqjbmggaMaw4bufbmcgY+G7p2EgR0RQIMSR4buRaSB24bubaSBnacOhIHRy4buLIGdpYSB0xINuZyBj4bunYSBuZ8Ogbmggc+G6o24geHXhuqV0IChNYW51ZmFjdHVyaW5nIFZhbHVlIEFkZGVkKQ0KDQpgYGB7cn0NCiMgVOG6o2kgZOG7ryBsaeG7h3UgTlYuSU5ELk1BTkYuQ0QgY+G7p2EgVmnhu4d0IE5hbSB04burIDIwMDUtMjAyMg0KYSA8LSBXREkoaW5kaWNhdG9yID0gIk5WLklORC5NQU5GLkNEIiwgY291bnRyeSA9ICJWTk0iLCBzdGFydCA9IDIwMDUsIGVuZCA9IDIwMjIpDQoNCiMgQ2jhu41uIGNo4buJIGPDoWMgY+G7mXQgY+G6p24gdGhp4bq/dCB04burIGThu68gbGnhu4d1IE5WLklORC5NQU5GLkNEDQphIDwtIHN1YnNldChhLCBzZWxlY3QgPSBjKCJ5ZWFyIiwgIk5WLklORC5NQU5GLkNEIikpDQoNCiMgVOG6o2kgZOG7ryBsaeG7h3UgR0RQIGPhu6dhIFZp4buHdCBOYW0gdOG7qyAyMDA1LTIwMjINCmdkcCA8LSBXREkoaW5kaWNhdG9yID0gIk5ZLkdEUC5NS1RQLkNEIiwgY291bnRyeSA9ICJWTk0iLCBzdGFydCA9IDIwMDUsIGVuZCA9IDIwMjIpDQoNCiMgQ2jhu41uIGNo4buJIGPDoWMgY+G7mXQgY+G6p24gdGhp4bq/dCB04burIGThu68gbGnhu4d1IEdEUA0KZ2RwIDwtIHN1YnNldChnZHAsIHNlbGVjdCA9IGMoInllYXIiLCAiTlkuR0RQLk1LVFAuQ0QiKSkNCg0KIyDEkOG7lWkgdMOqbiBj4buZdCDEkeG7gyBwaMO5IGjhu6NwIHbhu5tpIGRhdGFmcmFtZSBj4bunYSBi4bqhbg0KbmFtZXMoZ2RwKSA8LSBjKCJ5ZWFyIiwgIkdEUCIpDQoNCiMgQ2jhuq9jIGNo4bqvbiBy4bqxbmcgY+G7mXQgJ3llYXInIGzDoCBkdXkgbmjhuqV0IHRyb25nIG3hu5dpIGRhdGFmcmFtZQ0KYSR5ZWFyIDwtIGFzLmNoYXJhY3RlcihhJHllYXIpICAjIENodXnhu4NuIMSR4buVaSBj4buZdCAneWVhcicgc2FuZyBraeG7g3UgY2hhcmFjdGVyIMSR4buDIHRyw6FuaCBs4buXaQ0KZ2RwJHllYXIgPC0gYXMuY2hhcmFjdGVyKGdkcCR5ZWFyKSAgIyBDaHV54buDbiDEkeG7lWkgY+G7mXQgJ3llYXInIHNhbmcga2nhu4N1IGNoYXJhY3RlciDEkeG7gyB0csOhbmggbOG7l2kNCg0KIyBH4buZcCBk4buvIGxp4buHdSB0aGVvIGPhu5l0ICd5ZWFyJyBi4bqxbmcgaMOgbSBsZWZ0X2pvaW4oKSB04burIGfDs2kgZHBseXINCmxpYnJhcnkoZHBseXIpDQphX2dkcCA8LSBsZWZ0X2pvaW4oYSwgZ2RwLCBieSA9ICJ5ZWFyIikNCg0KIyBMb+G6oWkgYuG7jyBjw6FjIGjDoG5nIGPDsyBk4buvIGxp4buHdSBHRFAgYuG7iyB0aGnhur91DQphX2dkcCA8LSBuYS5vbWl0KGFfZ2RwKQ0KDQojIFThuqFvIG3DtCBow6xuaCBo4buTaSBxdXkgdHV54bq/biB0w61uaA0KbW9kZWwgPC0gbG0oTlYuSU5ELk1BTkYuQ0QgfiBHRFAsIGRhdGEgPSBhX2dkcCkNCg0KIyBYZW0gdMOzbSB04bqvdCBj4bunYSBtw7QgaMOsbmgNCnN1bW1hcnkobW9kZWwpDQojIENyZWF0ZSBhIGNvbHVtbiBjaGFydCBjb21iaW5pbmcgR0RQIGFuZCBOVi5JTkQuTUFORi5DRA0KZ2dwbG90KGFfZ2RwLCBhZXMoeCA9IHllYXIpKSArDQogIGdlb21fY29sKGFlcyh5ID0gR0RQLCBmaWxsID0gIkdEUCIpLCBwb3NpdGlvbiA9ICJkb2RnZSIsIHdpZHRoID0gMC40KSArDQogIGdlb21fY29sKGFlcyh5ID0gTlYuSU5ELk1BTkYuQ0QsIGZpbGwgPSAiTlYuSU5ELk1BTkYuQ0QiKSwgcG9zaXRpb24gPSAiZG9kZ2UiLCB3aWR0aCA9IDAuNCkgKw0KICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKCJHRFAiID0gImxpZ2h0Ymx1ZSIsICJOVi5JTkQuTUFORi5DRCIgPSAibGlnaHRncmVlbiIpKSArDQogIGxhYnModGl0bGUgPSAiQmnhu4N1IMSR4buTIGPhu5l0IGdow6lwIGdp4buvYSBHRFAgdsOgIE5WLklORC5NQU5GLkNEIiwNCiAgICAgICB4ID0gIk7Eg20iLA0KICAgICAgIHkgPSAiR2nDoSB0cuG7iyIsDQogICAgICAgZmlsbCA9ICJCaeG6v24iKSArDQogIHRoZW1lX21pbmltYWwoKQ0KYGBgDQoNCipHaeG6o2kgdGjDrWNoIGPDonUgbOG7h25oOioNCg0KMS4gVOG6o2kgZOG7ryBsaeG7h3U6DQoNCiAgYSA8LSBXREkoLi4uKTogTOG6pXkgZOG7ryBsaeG7h3UgduG7gSBDaOG7iSBz4buRIHPhuqNuIHh14bqldCBjw7RuZyBuZ2hp4buHcCAoTlYuSU5ELk1BTkYuQ0QpIGPhu6dhIFZp4buHdCBOYW0gKCJWTk0iKSB04burIG7Eg20gMjAwNSDEkeG6v24gbsSDbSAyMDIyLg0KICBhIDwtIHN1YnNldChhLCBzZWxlY3QgPSBjKCJ5ZWFyIiwgIk5WLklORC5NQU5GLkNEIikpOiBDaOG7jW4gaGFpIGPhu5l0IHllYXIgdsOgIE5WLklORC5NQU5GLkNEIHThu6sgZGF0YSBmcmFtZSBhLg0KICBnZHAgPC0gV0RJKC4uLik6IEzhuqV5IGThu68gbGnhu4d1IHbhu4EgR0RQIChOWS5HRFAuTUtUUC5DRCkgY+G7p2EgVmnhu4d0IE5hbSAoIlZOTSIpIHThu6sgbsSDbSAyMDA1IMSR4bq/biBuxINtIDIwMjIuDQogIGdkcCA8LSBzdWJzZXQoZ2RwLCBzZWxlY3QgPSBjKCJ5ZWFyIiwgIk5ZLkdEUC5NS1RQLkNEIikpOiBDaOG7jW4gaGFpIGPhu5l0IHllYXIgdsOgIE5ZLkdEUC5NS1RQLkNEIHThu6sgZGF0YSBmcmFtZSBnZHAuDQoNCjIuIENodXnhu4NuIMSR4buVaSB2w6AgZ+G7mXAgZOG7ryBsaeG7h3U6DQoNCiAgbmFtZXMoZ2RwKSA8LSBjKCJ5ZWFyIiwgIkdEUCIpOiDEkOG7lWkgdMOqbiBj4buZdCBOWS5HRFAuTUtUUC5DRCB0aMOgbmggR0RQIHRyb25nIGRhdGEgZnJhbWUgZ2RwLg0KICBhJHllYXIgPC0gYXMuY2hhcmFjdGVyKGEkeWVhcik6IENodXnhu4NuIMSR4buVaSBj4buZdCB5ZWFyIHRyb25nIGRhdGEgZnJhbWUgYSBzYW5nIGtp4buDdSBjaGFyYWN0ZXIuDQogIGdkcCR5ZWFyIDwtIGFzLmNoYXJhY3RlcihnZHAkeWVhcik6IENodXnhu4NuIMSR4buVaSBj4buZdCB5ZWFyIHRyb25nIGRhdGEgZnJhbWUgZ2RwIHNhbmcga2nhu4N1IGNoYXJhY3Rlci4NCiAgbGlicmFyeShkcGx5cik6IFThuqNpIHRoxrAgdmnhu4duIGRwbHlyIMSR4buDIHPhu60gZOG7pW5nIGjDoG0gbGVmdF9qb2luLg0KICBhX2dkcCA8LSBsZWZ0X2pvaW4oYSwgZ2RwLCBieSA9ICJ5ZWFyIik6IEfhu5lwIGhhaSBkYXRhIGZyYW1lIGEgdsOgIGdkcCB0aGVvIGPhu5l0IHllYXIuDQogIGFfZ2RwIDwtIG5hLm9taXQoYV9nZHApOiBMb+G6oWkgYuG7jyBjw6FjIGjDoG5nIGPDsyBk4buvIGxp4buHdSBHRFAgYuG7iyB0aGnhur91IHRyb25nIGRhdGEgZnJhbWUgYV9nZHAuDQoNCjMuIFBow6JuIHTDrWNoIGjhu5NpIHF1eToNCg0KICBtb2RlbCA8LSBsbShOVi5JTkQuTUFORi5DRCB+IEdEUCwgZGF0YSA9IGFfZ2RwKTogVOG6oW8gbcO0IGjDrG5oIGjhu5NpIHF1eSB0dXnhur9uIHTDrW5oIHbhu5tpIE5WLklORC5NQU5GLkNEIGzDoCBiaeG6v24gcGjhu6UgdGh14buZYyB2w6AgR0RQIGzDoCBiaeG6v24gxJHhu5ljIGzhuq1wLg0KICBzdW1tYXJ5KG1vZGVsKTogWGVtIHTDs20gdOG6r3QgbcO0IGjDrG5oLCBiYW8gZ+G7k20gaOG7hyBz4buRIGjhu5NpIHF1eSwgZ2nDoSB0cuG7iyBwLCB2w6AgUi1zcXVhcmVkLg0KDQo0LiBCaeG7g3UgxJHhu5M6DQoNCiAgZ2dwbG90KGFfZ2RwLCBhZXMoeCA9IHllYXIpKTogS2jhu59pIHThuqFvIGJp4buDdSDEkeG7kyBnZ3Bsb3QyIHbhu5tpIGRhdGEgZnJhbWUgYV9nZHAuDQogIGdlb21fY29sKGFlcyh5ID0gR0RQLCBmaWxsID0gIkdEUCIpLCBwb3NpdGlvbiA9ICJkb2RnZSIsIHdpZHRoID0gMC40KTogVGjDqm0gY+G7mXQgY2hvIEdEUCB24bubaSBtw6B1ICJsaWdodGJsdWUiLg0KICBnZW9tX2NvbChhZXMoeSA9IE5WLklORC5NQU5GLkNELCBmaWxsID0gIk5WLklORC5NQU5GLkNEIiksIHBvc2l0aW9uID0gImRvZGdlIiwgd2lkdGggPSAwLjQpOiBUaMOqbSBj4buZdCBjaG8gTlYuSU5ELk1BTkYuQ0QgduG7m2kgbcOgdSAibGlnaHRncmVlbiIuDQpzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKCJHRFAiID0gImxpZ2h0Ymx1ZSIsICJOVi5JTkQuTUFORi5DRCIgPSAibGlnaHRncmVlbiIpKTogVGhp4bq/dCBs4bqtcCBtw6B1IGNobyBjw6FjIGPhu5l0Lg0KICBsYWJzKC4uLik6IFRow6ptIHRpw6p1IMSR4buBLCBuaMOjbiB0cuG7pWMsIHbDoCBjaMO6IHRow61jaCBjaG8gYmnhu4N1IMSR4buTLg0KICB0aGVtZV9taW5pbWFsKCk6IMOBcCBk4bulbmcgY2jhu6cgxJHhu4EgdOG7kWkgZ2nhuqNuIGNobyBiaeG7g3UgxJHhu5MuDQoNCkvhur90IGjhu6NwIHThuqV0IGPhuqMgY8OhYyBwaOG6p246DQoNCsSQb+G6oW4gY29kZSBuw6B5IHPhur06DQoNCiAgVOG6o2kgZOG7ryBsaeG7h3UgduG7gSBOVi5JTkQuTUFORi5DRCB2w6AgR0RQIGPhu6dhIFZp4buHdCBOYW0uDQogIENo4buNbiBjw6FjIGPhu5l0IGPhuqduIHRoaeG6v3QgdsOgIGNodXnhu4NuIMSR4buVaSBk4buvIGxp4buHdS4NCiAgR+G7mXAgaGFpIGRhdGEgZnJhbWUgdGhlbyBj4buZdCB5ZWFyLg0KICBMb+G6oWkgYuG7jyBjw6FjIGjDoG5nIGPDsyBk4buvIGxp4buHdSBHRFAgYuG7iyB0aGnhur91Lg0KICBU4bqhbyBtw7QgaMOsbmggaOG7k2kgcXV5IHR1eeG6v24gdMOtbmggxJHhu4MgcGjDom4gdMOtY2ggbeG7kWkgcXVhbiBo4buHIGdp4buvYSBOVi5JTkQuTUFORi5DRCB2w6AgR0RQLg0KICBW4bq9IGJp4buDdSDEkeG7kyBj4buZdCDEkeG7gyBzbyBzw6FuaCBHRFAgdsOgIE5WLklORC5NQU5GLkNEIHRoZW8gdGjhu51pIGdpYW4uDQoNCipOaOG6rW4geMOpdDoqIA0KDQoxLiBCaeG7g3UgxJHhu5MgdGjhu4MgaGnhu4duOg0KDQogIFPhu7EgdGhheSDEkeG7lWkgY+G7p2EgR0RQIHbDoCBOVi5JTkQuTUFORi5DRCBj4bunYSBWaeG7h3QgTmFtIHThu6sgbsSDbSAyMDA1IMSR4bq/biBuxINtIDIwMjIuDQogIEdEUCB0xINuZyB0csaw4bufbmcgbGnDqm4gdOG7pWMgdHJvbmcgZ2lhaSDEkW/huqFuIG7DoHkuDQogIE5WLklORC5NQU5GLkNEIHTEg25nIHRyxrDhu59uZyBsacOqbiB04bulYyB0cm9uZyBnaWFpIMSRb+G6oW4gbsOgeSwgbmjGsG5nIHThu5FjIMSR4buZIHTEg25nIHRyxrDhu59uZyBjaOG6rW0gaMahbiBHRFAuDQogIEdEUCBjw7MgeHUgaMaw4bubbmcgYmnhur9uIMSR4buZbmcgbeG6oW5oIGjGoW4gTlYuSU5ELk1BTkYuQ0QuDQoNCjIuIFNvIHPDoW5oIEdEUCB2w6AgTlYuSU5ELk1BTkYuQ0Q6DQoNCiAgR0RQIGNhbyBoxqFuIE5WLklORC5NQU5GLkNEIHRyb25nIHN14buRdCBnaWFpIMSRb+G6oW4gMjAwNS0yMDIyLg0KICBLaG/huqNuZyBjw6FjaCBnaeG7r2EgR0RQIHbDoCBOVi5JTkQuTUFORi5DRCBjw7MgeHUgaMaw4bubbmcgdMSDbmcgZOG6p24uDQoNCjMuIFBow6JuIHTDrWNoIHRoZW8gZ2lhaSDEkW/huqFuOg0KDQogIDIwMDUtMjAxMDoNCiAgICAtIEdEUCB2w6AgTlYuSU5ELk1BTkYuQ0QgxJHhu4F1IHTEg25nIHRyxrDhu59uZyBuaMawbmcgdOG7kWMgxJHhu5kgdMSDbmcgdHLGsOG7n25nIGPhu6dhIEdEUCBjYW8gaMahbi4NCiAgMjAxMS0yMDIwOg0KICAgIC0gR0RQIHbDoCBOVi5JTkQuTUFORi5DRCDEkeG7gXUgdMSDbmcgdHLGsOG7n25nIG5oxrBuZyB04buRYyDEkeG7mSB0xINuZyB0csaw4bufbmcgY+G7p2EgTlYuSU5ELk1BTkYuQ0QgZ2nhuqNtIGThuqduLg0KICAyMDIxLTIwMjI6DQogICAgLSBHRFAgdMSDbmcgdHLGsOG7n25nIG3huqFuaC4NCiAgICAtIE5WLklORC5NQU5GLkNEIHTEg25nIHRyxrDhu59uZyBuaMawbmcgdOG7kWMgxJHhu5kgdMSDbmcgdHLGsOG7n25nIGNo4bqtbSBoxqFuIHNvIHbhu5tpIGdpYWkgxJFv4bqhbiAyMDA1LTIwMTAuDQoNCg0KDQoNCg0KDQojICpQaMOibiB0w61jaCBJbmRpY2F0b3I6IEFJUF9QQ19QUF9QVCB04burIGLhu5kgZOG7ryBsaeG7h3UgaW1mKg0KDQoNCiMjICAqR2nhu5tpIHRoaeG7h3UgduG7gSBpbmRpY2F0b3I6IEFJUF9QQ19QUF9QVCoNCiAgQUlQX1BDX1BQX1BUIGzDoCBtw6MgxJHGsOG7o2Mgc+G7rSBk4bulbmcgxJHhu4MgYmnhu4N1IGRp4buFbiBUw6BpIHPhuqNuIFLDsm5nIGPhu6dhIFF14bu5IMSQ4bqndSB0xrAgQuG6o28gaGnhu4NtIChGSVApIC0gQ2jDrW5oIHPDoWNoIEPDtG5nIGPhu5luZyAtIEjGsHUgdHLDrSAtIEzhu6NpIMOtY2ggxJHGsOG7o2MgSOG7qWEgaOG6uW4gdHJvbmcgQuG7mSBRdeG7uSBUaeG7gW4gdOG7hyBRdeG7kWMgdOG6vyAoSU1GKS4gTsOzIGzDoCBt4buZdCBwaOG6p24gY+G7p2EgVMOgaSBraG/huqNuIFbhu5FuIHbDoCBUw6BpIGtob+G6o24gVMOgaSBjaMOtbmggKENBRkEpLCDEkcaw4bujYyBz4butIGThu6VuZyDEkeG7gyB0aGVvIGTDtWkgZMOybmcgduG7kW4gY2jhuqN5IHbDoG8gdsOgIHJhIGto4buPaSBt4buZdCBxdeG7kWMgZ2lhLg0KDQogIEdp4bqjaSB0aMOtY2ggY2hvIHThu6sgY+G7pW0gdHJvbmcgQUlQX1BDX1BQX1BUOg0KQUlQOg0KICAtIEE6IFTDoGkga2hv4bqjbg0KICAtIElQOiBRdeG7uSDEkOG6p3UgdMawIELhuqNvIGhp4buDbQ0KDQpQQzoNCiAgLSBQOiBDaMOtbmggc8OhY2gNCiAgLSBDOiBDw7RuZyBj4buZbmcNCg0KUFA6DQogIC0gUDogSMawdSB0csOtDQogIC0gUDogTOG7o2kgw61jaCDEkcaw4bujYyBo4bupYSBo4bq5bg0KDQpQVDoNCiAgLSBQOiBUaOG7kW5nIGvDqg0KDQpEbyDEkcOzLCBBSVBfUENfUFBfUFQgY8OzIG5naMSpYSBsw6A6DQoNCiAgVMOgaSBraG/huqNuIFF14bu5IMSQ4bqndSB0xrAgQuG6o28gaGnhu4NtIC0gQ2jDrW5oIHPDoWNoIEPDtG5nIGPhu5luZyAtIEjGsHUgdHLDrSAtIEzhu6NpIMOtY2ggxJHGsOG7o2MgSOG7qWEgaOG6uW4gLSBUaOG7kW5nIGvDqg0KDQogIFThu6sgY+G7pW0gbsOgeSBjaG8gYmnhur90Og0KDQogICAgLSBMb+G6oWkgdMOgaSBraG/huqNuIChUw6BpIGtob+G6o24gUXXhu7kgxJDhuqd1IHTGsCBC4bqjbyBoaeG7g20pDQogICAgLSBMxKluaCB24buxYyDEkeG6p3UgdMawIChDaMOtbmggc8OhY2ggQ8O0bmcgY+G7mW5nLCBIxrB1IHRyw60sIEzhu6NpIMOtY2ggxJHGsOG7o2MgSOG7qWEgaOG6uW4pDQogICAgLSBMb+G6oWkgZOG7ryBsaeG7h3UgKFRo4buRbmcga8OqKQ0KDQojIyAqTeG7pWMgdGnDqnUgYsOhbyBjw6FvKg0KDQogIFBow6JuIHTDrWNoIHh1IGjGsOG7m25nLCBzbyBzw6FuaCBxdeG7kWMgdOG6vywgxJHDoW5oIGdpw6EgcuG7p2kgcm8gdsOgIMSR4buBIHh14bqldCBraHV54bq/biBuZ2jhu4sgY2hvIEFJUF9QQ19QUF9QVCBj4bunYSBWaeG7h3QgTmFtLg0KDQoNCiMjICpQaOG6oW0gdmkgbmdoacOqbiBj4bupdSoNCiAgDQogIC0gQ2jhu4kgc+G7kSBBSVBfUENfUFBfUFQgY+G7p2EgVmnhu4d0IE5hbSB0cm9uZyBnaWFpIMSRb+G6oW4gMjAwOS0yMDIyLg0KICAtIFNvIHPDoW5oIHbhu5tpIGPDoWMgcXXhu5FjIGdpYSB0cm9uZyBraHUgduG7sWMgQVNFQU4uDQoNCiMjIyAqVGh1IHRo4bqtcCBk4buvIGxp4buHdSoNCg0KLSBUaHUgdGjhuq1wIGThu68gbGnhu4d1IHbhu4EgKkFJUF9QQ19QUF9QVCog4bufIFZp4buHdCBOYW0gKCDEkcahbiB24buLIHTDrW5oIFVTRCkNCg0KYGBge3J9IA0KbGlicmFyeShpbWYuZGF0YSkNCmxpYnJhcnkoRFQpDQppbWYgPC0gbGlzdF9kYXRhc2V0cygpDQprIDwtIGxvYWRfZGF0YXNldHMoJ0lGUycpDQprMSA8LSBrJGdldF9zZXJpZXMoZnJlcT0gJ0EnLCByZWZfYXJlYSA9ICdWTicsIGluZGljYXRvciA9ICdBSVBfUENfUFBfUFQnICkNCmhxIDwtIG5hLm9taXQoazEpDQpkYXRhdGFibGUoaHEpDQoNCmBgYA0KDQoqR2nhuqNpIHRow61jaCDDvSBuZ2jEqWEgY8OidSBsw6puaDoqDQoNCjEuIFThuqNpIHRoxrAgdmnhu4duIHbDoCBkYW5oIHPDoWNoIGThu68gbGnhu4d1Og0KDQogIGxpYnJhcnkoaW1mLmRhdGEpOiBU4bqjaSB0aMawIHZp4buHbiBpbWYuZGF0YSDEkeG7gyB0cnV5IGPhuq1wIHbDoCBz4butIGThu6VuZyBjw6FjIGThu68gbGnhu4d1IGPhu6dhIFF14bu5IFRp4buBbiB04buHIFF14buRYyB04bq/IChJTUYpLg0KICBpbWYgPC0gbGlzdF9kYXRhc2V0cygpOiBM4bqleSBkYW5oIHPDoWNoIGPDoWMgYuG7mSBk4buvIGxp4buHdSBjw7Mgc+G6tW4gdOG7qyBJTUYgdsOgIGzGsHUgdsOgbyANCmJp4bq/biBpbWYuDQoNCjIuIFThuqNpIGLhu5kgZOG7ryBsaeG7h3UgSUZTOg0KDQogIGsgPC0gbG9hZF9kYXRhc2V0cygnSUZTJyk6IFThuqNpIGLhu5kgZOG7ryBsaeG7h3UgSUZTIChJbnRlcm5hdGlvbmFsIEZpbmFuY2lhbCBTdGF0aXN0aWNzKSBj4bunYSBJTUYgdsOgIGzGsHUgdsOgbyBiaeG6v24gay4NCiAgayRkaW1lbnNpb25zJGluZGljYXRvcjogWGVtIGRhbmggc8OhY2ggY8OhYyBjaOG7iSBiw6FvIChpbmRpY2F0b3IpIGPDsyB0cm9uZyBi4buZIGThu68gbGnhu4d1IElGUy4NCg0KMy4gTOG6pXkgZOG7ryBsaeG7h3UgduG7gSBjaOG7iSBiw6FvIEFJUF9QQ19QUF9QVCBj4bunYSBWaeG7h3QgTmFtOg0KDQogIGtrIDwtIGskZ2V0X3NlcmllcyhmcmVxID0gJ0EnLCByZWZfYXJlYSA9ICdWTicsIGluZGljYXRvciA9ICdBSVBfUENfUFBfUFQnKTogTOG6pXkgZOG7ryBsaeG7h3UgduG7gSBjaOG7iSBiw6FvICJBSVBfUENfUFBfUFQiIGPhu6dhIFZp4buHdCBOYW0gKCJWTiIpIHbhu5tpIHThuqduIHN14bqldCBow6BuZyBuxINtICgiQSIpIHbDoCBsxrB1IHbDoG8gYmnhur9uIGtrLg0KICAgIC0gZnJlcSA9ICdBJzogVOG6p24gc3XhuqV0IGThu68gbGnhu4d1IGzDoCBow6BuZyBuxINtIChBbm51YWwpLg0KICAgIC0gcmVmX2FyZWEgPSAnVk4nOiBLaHUgduG7sWMgdGhhbSBjaGnhur91IGzDoCBWaeG7h3QgTmFtICgiVk4iKS4NCiAgICAtIGluZGljYXRvciA9ICdBSVBfUENfUFBfUFQnOiBDaOG7iSBiw6FvIGPhuqduIGzhuqV5IGThu68gbGnhu4d1Lg0KDQo0LiBMb+G6oWkgYuG7jyBjw6FjIGdpw6EgdHLhu4sgdGhp4bq/dSB2w6AgY2h1eeG7g24gxJHhu5VpIHRow6BuaCBkYXRhIHRhYmxlOg0KDQogIGhxIDwtIG5hLm9taXQoa2spOiBMb+G6oWkgYuG7jyBjw6FjIGjDoG5nIGPDsyBk4buvIGxp4buHdSB0aGnhur91IChOQSkgdHJvbmcgYmnhur9uIGtrIHbDoCBsxrB1IHbDoG8gYmnhur9uIGhxLg0KICBkYXRhLnRhYmxlKGhxKTogQ2h1eeG7g24gxJHhu5VpIGThu68gbGnhu4d1IHRyb25nIGJp4bq/biBocSB0aMOgbmggbeG7mXQgZGF0YSB0YWJsZSDEkeG7gyB0aeG7h24gY2hvIHZp4buHYyBwaMOibiB0w61jaCB2w6AgeOG7rSBsw70NCg0KIyMjICpQaMOibiB0w61jaCBBSVBfUENfUFBfUFQgYmnhur9uIMSR4buZbmcgdGhlbyB0aOG7nWkgZ2lhbioNCg0KYGBge3J9DQpsaWJyYXJ5KGdncGxvdDIpDQpnZ3Bsb3QoaHEsIGFlcyh4ID0gVElNRV9QRVJJT0QsIHkgPSBBLlZOLkFJUF9QQ19QUF9QVCkpICsNCiAgZ2VvbV9jb2wocG9zaXRpb24gPSAnZG9kZ2UnLCBmaWxsPSAnbmF2eScpDQogIGxhYnModGl0bGUgPSAnQmnhu4N1IMSR4buTIGJp4bq/biDEkeG7mW5nIFTDoGkgc+G6o24gUsOybmcgY+G7p2EgUXXhu7kgxJDhuqd1IHTGsCBC4bqjbyBoaeG7g20gKEZJUCkgLSBDaMOtbmggc8OhY2ggQ8O0bmcgY+G7mW5nIC0gSMawdSB0csOtIC0gTOG7o2kgw61jaCDEkcaw4bujYyBI4bupYSBo4bq5biDhu58gVmnhu4d0IE5hbSB0aGVvIHRo4budaSBnaWFuJywgeD0gIk7Eg20iLCB5PSAiQUlQX1BDX1BQX1BUICIpDQogIHRoZW1lX21pbmltYWwoKQ0KDQpgYGANCg0KKkdp4bqjaSB0aMOtY2ggw70gbmdoxKlhIGPDonUgbOG7h25oOioNCg0KMS4gVOG6oW8gYmnhu4N1IMSR4buTOg0KDQogIGdncGxvdChocSwgYWVzKHggPSBUSU1FX1BFUklPRCwgeSA9IEEuVk4uQUlQX1BDX1BQX1BUKSk6IEto4bufaSB04bqhbyBiaeG7g3UgxJHhu5MgICAgIGdncGxvdDIgduG7m2kgZGF0YSB0YWJsZSBocS4NCiAgICAtIGFlcyh4ID0gVElNRV9QRVJJT0QsIHkgPSBBLlZOLkFJUF9QQ19QUF9QVCk6IFRoaeG6v3QgbOG6rXAgdHLhu6VjIHggbMOgIFRJTUVfUEVSSU9EIHbDoCB0cuG7pWMgeSBsw6AgQS5WTi5BSVBfUENfUFBfUFQuDQoNCjIuIFRow6ptIGjDrG5oIGThuqFuZzoNCg0KICBnZW9tX2NvbChwb3NpdGlvbiA9ICdkb2RnZScsIGZpbGw9ICduYXZ5Jyk6IFRow6ptIGjDrG5oIGThuqFuZyBj4buZdCB2w6BvIGJp4buDdSDEkeG7kyB24bubaSBtw6B1IHhhbmggbmF2eSAobmF2eSkuDQogICAgLSBwb3NpdGlvbiA9ICdkb2RnZSc6IFPhuq9wIHjhur9wIGPDoWMgY+G7mXQgY+G6oW5oIG5oYXUuDQoNCjMuIFRow6ptIG5ow6NuIHbDoCB0acOqdSDEkeG7gToNCg0KICBsYWJzKHRpdGxlID0gJ0Jp4buDdSDEkeG7kyBiaeG6v24gxJHhu5luZyBUw6BpIHPhuqNuIFLDsm5nIGPhu6dhIFF14bu5IMSQ4bqndSB0xrAgQuG6o28gaGnhu4NtIChGSVApIC0gQ2jDrW5oIHPDoWNoIEPDtG5nIGPhu5luZyAtIEjGsHUgdHLDrSAtIEzhu6NpIMOtY2ggxJHGsOG7o2MgSOG7qWEgaOG6uW4g4bufIFZp4buHdCBOYW0gdGhlbyB0aOG7nWkgZ2lhbicsIHg9ICJOxINtIiwgeT0gIkFJUF9QQ19QUF9QVCAiKTogVGjDqm0gdGnDqnUgxJHhu4EsIG5ow6NuIHRy4bulYyB4IHbDoCB5IGNobyBiaeG7g3UgxJHhu5MuDQoNCjQuIMOBcCBk4bulbmcgY2jhu6cgxJHhu4E6DQoNCiAgdGhlbWVfbWluaW1hbCgpOiDDgXAgZOG7pW5nIGNo4bunIMSR4buBIHThu5FpIGdp4bqjbiBjaG8gYmnhu4N1IMSR4buTLg0KDQoqTmjhuq1uIHjDqXQgQmnhu4N1IMSR4buTOioNCg0KICAyMDA5LTIwMTU6DQogICAgLSBUw6BpIHPhuqNuIFLDsm5nIEZJUCB0xINuZyBuaOG6uS4NCiAgICAtIFThu5FjIMSR4buZIHTEg25nIHRyxrDhu59uZyDhu5VuIMSR4buLbmguDQogIDIwMTYtMjAyMDoNCiAgICAtIFTDoGkgc+G6o24gUsOybmcgRklQIHTEg25nIG3huqFuaC4NCiAgICAtIFThu5FjIMSR4buZIHTEg25nIHRyxrDhu59uZyB0xINuZyBjYW8uDQogIDIwMjEtMjAyMjoNCiAgICAtIFTDoGkgc+G6o24gUsOybmcgRklQIGJp4bq/biDEkeG7mW5nIG3huqFuaC4NCiAgICAtIFThu5FjIMSR4buZIHTEg25nIHRyxrDhu59uZyBraMO0bmcg4buVbiDEkeG7i25oDQoNCiMjIyAqWHUgaMaw4bubbmcgQUlQX1BDX1BQX1BUIGPhu6dhIFZp4buHdCBOYW0qDQoNCmBgYHtyfQ0KZ2dwbG90KGhxLCBhZXMoeCA9IFRJTUVfUEVSSU9ELCB5ID0gQS5WTi5BSVBfUENfUFBfUFQsIGdyb3VwPSAxKSkgKw0KICBnZW9tX2xpbmUoKSArDQogIGxhYnModGl0bGUgPSAiWHUgaMaw4bubbmcgQUlQX1BDX1BQX1BUIGPhu6dhIFZp4buHdCBOYW0iLA0KICAgICAgIHggPSAiTsSDbSIsDQogICAgICAgeSA9ICJBSVBfUENfUFBfUFQiKSArDQogIHRoZW1lX21pbmltYWwoKQ0KYGBgDQoNCg0KKkdp4bqjaSB0aMOtY2ggw70gbmdoxKlhIGPDonUgbOG7h25oOioNCg0KICBnZ3Bsb3QoaHEsIGFlcyh4ID0gVElNRV9QRVJJT0QsIHkgPSBBLlZOLkFJUF9QQ19QUF9QVCwgZ3JvdXAgPSAxKSk6IEto4bufaSB04bqhbyBiaeG7g3UgxJHhu5MgZ2dwbG90MiB24bubaSBk4buvIGxp4buHdSB0cm9uZyBocS4NCiAgICAtIGFlcyh4ID0gVElNRV9QRVJJT0QsIHkgPSBBLlZOLkFJUF9QQ19QUF9QVCwgZ3JvdXAgPSAxKTogVGhp4bq/dCBs4bqtcCB0cuG7pWMgeCBsw6AgVElNRV9QRVJJT0QsIHRy4bulYyB5IGzDoCBBLlZOLkFJUF9QQ19QUF9QVCwgdsOgIG5ow7NtIGThu68gbGnhu4d1IGzDoCAxIChnIG3hurdjIMSR4buLbmggY2hvIG3hu5l0IG5ow7NtKS4NCg0KICBnZW9tX2xpbmUoKTogVGjDqm0gY8OhYyDEkcaw4budbmcgbGluZSB2w6BvIGJp4buDdSDEkeG7kyDEkeG7gyB0aOG7gyBoaeG7h24gc+G7sSB0aGF5IMSR4buVaSBj4bunYSBk4buvIGxp4buHdSB0aGVvIHRo4budaSBnaWFuLiBLaMO0bmcgY+G6p24gdGhp4bq/dCBwaOG6o2kga2hhaSBiw6FvIHRow6ptIHbhu4EgbcOgdSBz4bqvYyB2w6wgbeG6t2MgxJHhu4tuaCBnZW9tX2xpbmUgc+G6vSB04buxIGNo4buNbiBtw6B1Lg0KDQogIGxhYnModGl0bGUgPSAiWHUgaMaw4bubbmcgQUlQX1BDX1BQX1BUIGPhu6dhIFZp4buHdCBOYW0iLCB4ID0gIk7Eg20iLCB5ID0gIkFJUF9QQ19QUF9QVCIpOiBUaMOqbSB0acOqdSDEkeG7gSwgbmjDo24gdHLhu6VjIHggdsOgIHkgY2hvIGJp4buDdSDEkeG7ky4NCg0KICB0aGVtZV9taW5pbWFsKCk6IMOBcCBk4bulbmcgY2jhu6cgxJHhu4EgdOG7kWkgZ2nhuqNuIGNobyBiaeG7g3UgxJHhu5MsIGdpw7pwIGJp4buDdSDEkeG7kyB0csO0bmcgc+G6oWNoIHPhur0gdsOgIGThu4UgbmjDrG4uDQoNCg0KKk5o4bqtbiB4w6l0IEJp4buDdSDEkeG7kzoqDQoNCjEuIEJp4buDdSDEkeG7kyB0aOG7gyBoaeG7h246DQoNCiAgWHUgaMaw4bubbmcgdGhheSDEkeG7lWkgY+G7p2EgY2jhu4kgc+G7kSBBSVBfUENfUFBfUFQgY+G7p2EgVmnhu4d0IE5hbSB04burIG7Eg20gMjAwOSDEkeG6v24gbsSDbSAyMDIyLg0KICBDaOG7iSBz4buRIEFJUF9QQ19QUF9QVCB0xINuZyBsacOqbiB04bulYyB0cm9uZyBnaWFpIMSRb+G6oW4gbsOgeS4NCiAgVOG7kWMgxJHhu5kgdMSDbmcgdHLGsOG7n25nIGPhu6dhIGNo4buJIHPhu5EgQUlQX1BDX1BQX1BUIGPDsyB4dSBoxrDhu5tuZyB0xINuZyBk4bqnbiB04burIG7Eg20gMjAwOSDEkeG6v24gbsSDbSAyMDIyLg0KICBDaOG7iSBz4buRIEFJUF9QQ19QUF9QVCBiaeG6v24gxJHhu5luZyBt4bqhbmggdHJvbmcgZ2lhaSDEkW/huqFuIDIwMjEtMjAyMi4NCg0KMi4gUGjDom4gdMOtY2ggdGhlbyBnaWFpIMSRb+G6oW46DQoNCiAgMjAwOS0yMDE1Og0KICAgIC0gQ2jhu4kgc+G7kSBBSVBfUENfUFBfUFQgdMSDbmcgbmjhurkuDQogICAgLSBU4buRYyDEkeG7mSB0xINuZyB0csaw4bufbmcg4buVbiDEkeG7i25oLg0KICAyMDE2LTIwMjA6DQogICAgLSBDaOG7iSBz4buRIEFJUF9QQ19QUF9QVCB0xINuZyBt4bqhbmguDQogICAgLSBU4buRYyDEkeG7mSB0xINuZyB0csaw4bufbmcgdMSDbmcgY2FvLg0KICAyMDIxLTIwMjI6DQogICAgLSBDaOG7iSBz4buRIEFJUF9QQ19QUF9QVCBiaeG6v24gxJHhu5luZyBt4bqhbmguDQogICAgLSBU4buRYyDEkeG7mSB0xINuZyB0csaw4bufbmcga2jDtG5nIOG7lW4gxJHhu4tuaC4NCg0KIyMjICpTbyBzw6FuaCBjaOG7iSBz4buRIEFJUF9QQ19QUF9QVCBnaeG7r2EgVmnhu4d0IE5hbSx2w6AgTWFsYXlzaWEgZ2lhaSDEkW/huqFuIDIwMDktMjAxOCoNCmBgYHtyfQ0KbGlicmFyeShnZ3Bsb3QyKQ0KbGlicmFyeShpbWYuZGF0YSkNCg0KIyBM4bqleSBk4buvIGxp4buHdSBjaG8gY8OhYyBxdeG7kWMgZ2lhIFZOIChWaeG7h3QgTmFtKSB2w6AgTVkgKE1hbGF5c2lhKQ0Kdm4gPC0gayRnZXRfc2VyaWVzKGZyZXEgPSAnQScsIHJlZl9hcmVhID0gJ1ZOJywgaW5kaWNhdG9yID0gJ0FJUF9QQ19QUF9QVCcpDQpteSA8LSBrJGdldF9zZXJpZXMoZnJlcSA9ICdBJywgcmVmX2FyZWEgPSAnTVknLCBpbmRpY2F0b3IgPSAnQUlQX1BDX1BQX1BUJykNCm15IDwtIHN1YnNldChteSwgVElNRV9QRVJJT0QgPj0gMjAwOSAmIFRJTUVfUEVSSU9EIDw9IDIwMjIpDQojIFjDs2EgY8OhYyBow6BuZyBjaOG7qWEgZ2nDoSB0cuG7iyBOQSAobuG6v3UgY8OzKQ0Kdm4xIDwtIG5hLm9taXQodm4pDQoNCm15MSA8LSBuYS5vbWl0KG15KQ0KDQoNCiMgVOG6oW8gZGF0YWZyYW1lIHThu5VuZyBo4bujcA0KbGlicmFyeShkcGx5cikNCmdvcDIgPC0gZnVsbF9qb2luKHZuMSwgbXkxLCBieSA9ICJUSU1FX1BFUklPRCIpDQpnb3AyIDwtIG5hLm9taXQoZ29wMikNCg0KDQpnZ3Bsb3QoZ29wMiwgYWVzKHggPSBUSU1FX1BFUklPRCkpICsNCiAgZ2VvbV9saW5lKGFlcyh5ID0gQS5WTi5BSVBfUENfUFBfUFQsIGNvbG9yID0gIlZpZXQgTmFtIiwgZ3JvdXAgPSAxKSkgKw0KICBnZW9tX2xpbmUoYWVzKHkgPSBBLk1ZLkFJUF9QQ19QUF9QVCwgY29sb3IgPSAiTWFsYXlzaWEiLCBncm91cCA9IDEpKSArDQogIGxhYnModGl0bGUgPSAiU28gc8OhbmggY2jhu4kgc+G7kSBBSVBfUENfUFBfUFQgZ2nhu69hIFZp4buHdCBOYW0gdsOgIE1hbGF5c2lhICgyMDA5LTIwMTgpIiwNCiAgICAgICB4ID0gIk7Eg20iLA0KICAgICAgIHkgPSAiQUlQX1BDX1BQX1BUIikgKw0KICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYygiVmlldCBOYW0iID0gImJsdWUiLCAiTWFsYXlzaWEiID0gInJlZCIpKSArDQogIHRoZW1lX21pbmltYWwoKQ0KDQpgYGANCg0KDQoqR2nhuqNpIHRow61jaCDDvSBuZ2jEqWEgY8OidSBs4buHbmg6Kg0KDQoxLiBM4bqleSBk4buvIGxp4buHdSBjaG8gVmnhu4d0IE5hbSAoVk4pIHbDoCBNYWxheXNpYSAoTVkpOg0KDQogIHZuIDwtIGskZ2V0X3NlcmllcyhmcmVxID0gJ0EnLCByZWZfYXJlYSA9ICdWTicsIGluZGljYXRvciA9ICdBSVBfUENfUFBfUFQnKTogTOG6pXkgZOG7ryBsaeG7h3UgduG7gSBjaOG7iSBz4buRIEFJUF9QQ19QUF9QVCBj4bunYSBWaeG7h3QgTmFtICgiVk4iKSB24bubaSB04bqnbiBzdeG6pXQgaMOgbmcgbsSDbSAoIkEiKSB2w6AgbMawdSB2w6BvIGJp4bq/biB2bi4NCiAgbXkgPC0gayRnZXRfc2VyaWVzKGZyZXEgPSAnQScsIHJlZl9hcmVhID0gJ01ZJywgaW5kaWNhdG9yID0gJ0FJUF9QQ19QUF9QVCcpOiBM4bqleSBk4buvIGxp4buHdSB24buBIGNo4buJIHPhu5EgQUlQX1BDX1BQX1BUIGPhu6dhIE1hbGF5c2lhICgiTVkiKSB24bubaSB04bqnbiBzdeG6pXQgaMOgbmcgbsSDbSAoIkEiKSB2w6AgbMawdSB2w6BvIGJp4bq/biBteS4NCg0KMi4gWOG7rSBsw70gZOG7ryBsaeG7h3U6DQoNCiAgbXkgPC0gc3Vic2V0KG15LCBUSU1FX1BFUklPRCA+PSAyMDA5ICYgVElNRV9QRVJJT0QgPD0gMjAyMik6IEdp4buvIGzhuqFpIGThu68gbGnhu4d1IGPhu6dhIE1hbGF5c2lhIHThu6sgbsSDbSAyMDA5IMSR4bq/biBuxINtIDIwMjIgdHJvbmcgYmnhur9uIG15Lg0KICB2bjEgPC0gbmEub21pdCh2bik6IFjDs2EgY8OhYyBow6BuZyBjaOG7qWEgZ2nDoSB0cuG7iyBOQSB0cm9uZyBiaeG6v24gdm4gdsOgIGzGsHUgdsOgbyBiaeG6v24gdm4xLg0KICBteTEgPC0gbmEub21pdChteSk6IFjDs2EgY8OhYyBow6BuZyBjaOG7qWEgZ2nDoSB0cuG7iyBOQSB0cm9uZyBiaeG6v24gbXkgdsOgIGzGsHUgdsOgbyBiaeG6v24gbXkxLg0KDQozLiBU4bqhbyBkYXRhZnJhbWUgdOG7lW5nIGjhu6NwOg0KDQogIGxpYnJhcnkoZHBseXIpOiBU4bqjaSB0aMawIHZp4buHbiBkcGx5ciDEkeG7gyBz4butIGThu6VuZyBjw6FjIGjDoG0gdGhhbyB0w6FjIHbhu5tpIGRhdGFmcmFtZS4NCiAgZ29wMiA8LSBmdWxsX2pvaW4odm4xLCBteTEsIGJ5ID0gIlRJTUVfUEVSSU9EIik6IEvhur90IGjhu6NwIGhhaSBkYXRhZnJhbWUgdm4xIHbDoCAgIG15MSBk4buxYSB0csOqbiBj4buZdCBUSU1FX1BFUklPRCB2w6AgbMawdSB2w6BvIGRhdGFmcmFtZSBnb3AyLg0KICBnb3AyIDwtIG5hLm9taXQoZ29wMik6IFjDs2EgY8OhYyBow6BuZyBjaOG7qWEgZ2nDoSB0cuG7iyBOQSB0cm9uZyBkYXRhZnJhbWUgZ29wMi4NCg0KNC4gVOG6oW8gYmnhu4N1IMSR4buTOg0KDQogIGdncGxvdChnb3AyLCBhZXMoeCA9IFRJTUVfUEVSSU9EKSk6IEto4bufaSB04bqhbyBiaeG7g3UgxJHhu5MgZ2dwbG90MiB24bubaSBkYXRhZnJhbWUgZ29wMiB2w6AgdHLhu6VjIHggbMOgIFRJTUVfUEVSSU9ELg0KICBnZW9tX2xpbmUoYWVzKHkgPSBBLlZOLkFJUF9QQ19QUF9QVCwgY29sb3IgPSAiVmlldCBOYW0iLCBncm91cCA9IDEpKTogVGjDqm0gxJHGsOG7nW5nIGxpbmUgY2hvIGThu68gbGnhu4d1IGPhu6dhIFZp4buHdCBOYW0gduG7m2kgbcOgdSB4YW5oICgiYmx1ZSIpIHbDoCBuaMOzbSAxLg0KICAgIC0gZ2VvbV9saW5lKGFlcyh5ID0gQS5NWS5BSVBfUENfUFBfUFQsIGNvbG9yID0gIk1hbGF5c2lhIiwgZ3JvdXAgPSAxKSk6IFRow6ptIMSRxrDhu51uZyBsaW5lIGNobyBk4buvIGxp4buHdSBj4bunYSBNYWxheXNpYSB24bubaSBtw6B1IMSR4buPICgicmVkIikgdsOgIG5ow7NtIDEuDQogICAgLSBsYWJzKHRpdGxlID0gIlNvIHPDoW5oIGNo4buJIHPhu5EgQUlQX1BDX1BQX1BUIGdp4buvYSBWaeG7h3QgTmFtIHbDoCBNYWxheXNpYSAoMjAwOS0yMDE4KSIsIHggPSAiTsSDbSIsIHkgPSAiQUlQX1BDX1BQX1BUIik6IFRow6ptIHRpw6p1IMSR4buBLCBuaMOjbiB0cuG7pWMgeCB2w6AgeSBjaG8gYmnhu4N1IMSR4buTLg0KICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYygiVmlldCBOYW0iID0gImJsdWUiLCAiTWFsYXlzaWEiID0gInJlZCIpKTogQ2jhu41uIG3DoHUgY2hvIGPDoWMgxJHGsOG7nW5nIGxpbmUuDQogIHRoZW1lX21pbmltYWwoKTogw4FwIGThu6VuZyBjaOG7pyDEkeG7gSB04buRaSBnaeG6o24gY2hvIGJp4buDdSDEkeG7ky4NCg0KKk5o4bqtbiB4w6l0IEJp4buDdSDEkeG7kzoqDQoNCjEuIEJp4buDdSDEkeG7kyB0aOG7gyBoaeG7h246DQoNCiAgU+G7sSB0aGF5IMSR4buVaSBj4bunYSBjaOG7iSBz4buRIEFJUF9QQ19QUF9QVCBj4bunYSBWaeG7h3QgTmFtIHbDoCBNYWxheXNpYSB04burIG7Eg20gMjAwOSDEkeG6v24gbsSDbSAyMDIyLg0KICBDaOG7iSBz4buRIEFJUF9QQ19QUF9QVCBj4bunYSBWaeG7h3QgTmFtIHTEg25nIGxpw6puIHThu6VjIHRyb25nIGdpYWkgxJFv4bqhbiBuw6B5Lg0KICBDaOG7iSBz4buRIEFJUF9QQ19QUF9QVCBj4bunYSBNYWxheXNpYSB0xINuZyB04burIG7Eg20gMjAwOSDEkeG6v24gbsSDbSAyMDE0LCBzYXUgxJHDsyBnaeG6o20gxJHhur9uIG7Eg20gMjAyMi4NCiAgQ2jhu4kgc+G7kSBBSVBfUENfUFBfUFQgY+G7p2EgVmnhu4d0IE5hbSBjYW8gaMahbiBzbyB24bubaSBNYWxheXNpYSB0cm9uZyBwaOG6p24gbOG7m24gZ2lhaSDEkW/huqFuIHThu6sgMjAwOSDEkeG6v24gMjAyMi4NCg0KMi4gUGjDom4gdMOtY2ggdGhlbyBnaWFpIMSRb+G6oW46DQoNCiAgMjAwOS0yMDE0Og0KICAgIC0gQ2jhu4kgc+G7kSBBSVBfUENfUFBfUFQgY+G7p2EgY+G6oyBoYWkgcXXhu5FjIGdpYSDEkeG7gXUgdMSDbmcuDQogICAgLSBDaOG7iSBz4buRIEFJUF9QQ19QUF9QVCBj4bunYSBWaeG7h3QgTmFtIHTEg25nIGNhbyBoxqFuIHNvIHbhu5tpIE1hbGF5c2lhLg0KICAyMDE1LTIwMjI6DQogICAgLSBDaOG7iSBz4buRIEFJUF9QQ19QUF9QVCBj4bunYSBWaeG7h3QgTmFtIHRp4bq/cCB04bulYyB0xINuZy4NCiAgICAtIENo4buJIHPhu5EgQUlQX1BDX1BQX1BUIGPhu6dhIE1hbGF5c2lhIGdp4bqjbS4NCg0KIyMjICpDw6FjIHnhur91IHThu5Eg4bqjbmggaMaw4bufbmcgxJHhur9uIEFJUF9QQ19QUF9QVCoNCg0KQ8OzIG5oaeG7gXUgeeG6v3UgdOG7kSDhuqNuaCBoxrDhu59uZyDEkeG6v24gQUlQX1BDX1BQX1BULCBiYW8gZ+G7k206DQoNCjEuIE5odSBj4bqndSBjaGkgdHLhuqM6DQoNCiAgTmh1IGPhuqd1IGNoaSB0cuG6oyBjaG8gY8OhYyBjaMawxqFuZyB0csOsbmggY2jDrW5oIHPDoWNoIGPDtG5nIGPhu5luZywgaMawdSB0csOtIHbDoCBs4bujaSDDrWNoIMSRxrDhu6NjIGjhu6lhIGjhurluIGzDoCB54bq/dSB04buRIHF1YW4gdHLhu41uZyBuaOG6pXQg4bqjbmggaMaw4bufbmcgxJHhur9uIEFJUF9QQ19QUF9QVC4NCiAgTmh1IGPhuqd1IGNoaSB0cuG6oyBuw6B5IHPhur0gdMSDbmcgbMOqbiBraGk6DQogICAgLSBT4buRIGzGsOG7o25nIG5nxrDhu51pIGjGsOG7n25nIGzhu6NpIMOtY2ggdOG7qyBjw6FjIGNoxrDGoW5nIHRyw6xuaCBuw6B5IHTEg25nIGzDqm4uDQogICAgLSBN4bupYyBjaGkgdHLhuqMgY2hvIG3hu5dpIG5nxrDhu51pIGjGsOG7n25nIGzhu6NpIMOtY2ggdMSDbmcgbMOqbi4NCg0KMi4gRG9hbmggdGh1Og0KDQogIERvYW5oIHRodSBj4bunYSBRdeG7uSBI4buXIHRy4bujIELhuqNvIGhp4buDbSDEkeG6v24gdOG7qyBuaGnhu4F1IG5ndeG7k24ga2jDoWMgbmhhdSwgYmFvIGfhu5NtOg0KDQogICAgLSBQaMOtIGLhuqNvIGhp4buDbQ0KICAgIC0gTMOjaSBzdeG6pXQgxJHhuqd1IHTGsA0KICAgIC0gQ2h1eeG7g24gZ2lhbyB04burIG5nw6JuIHPDoWNoIG5ow6Agbsaw4bubYw0KICAgIC0gRG9hbmggdGh1IHPhur0g4bqjbmggaMaw4bufbmcgdHLhu7FjIHRp4bq/cCDEkeG6v24gQUlQX1BDX1BQX1BULiBEb2FuaCB0aHUgY2FvIHPhur0gZ2nDunAgQUlQX1BDX1BQX1BUIHTEg25nIGzDqm4sIHbDoCBuZ8aw4bujYyBs4bqhaS4NCg0KDQozLiBMw6NpIHN14bqldDoNCg0KICBMw6NpIHN14bqldCDhuqNuaCBoxrDhu59uZyDEkeG6v24gQUlQX1BDX1BQX1BUIHRoZW8gaGFpIGPDoWNoOg0KICBMw6NpIHN14bqldCBjYW8gc+G6vSBnacO6cCBRdeG7uSBI4buXIHRy4bujIELhuqNvIGhp4buDbSBraeG6v20gxJHGsOG7o2Mgbmhp4buBdSB0aeG7gW4gaMahbiB04burIMSR4bqndSB0xrAuDQogIEzDo2kgc3XhuqV0IGNhbyBjxaluZyBz4bq9IGzDoG0gdMSDbmcgY2hpIHBow60gdHLhuqMgbuG7oyBj4bunYSBRdeG7uSBI4buXIHRy4bujIELhuqNvIGhp4buDbS4NCg0KNC4gVOG7tyBnacOhIGjhu5FpIMSRb8OhaToNCg0KICBRdeG7uSBI4buXIHRy4bujIELhuqNvIGhp4buDbSBjw7MgdGjhu4MgxJHhuqd1IHTGsCB2w6BvIHTDoGkgc+G6o24gbsaw4bubYyBuZ2/DoGkuIERvIMSRw7MsIHThu7cgZ2nDoSBo4buRaSDEkW/DoWkgc+G6vSDhuqNuaCBoxrDhu59uZyDEkeG6v24gZ2nDoSB0cuG7iyB0w6BpIHPhuqNuIGPhu6dhIFF14bu5IHbDoCBBSVBfUENfUFBfUFQuDQoNCjUuIENow61uaCBzw6FjaCBj4bunYSBjaMOtbmggcGjhu6c6DQoNCiAgQ2jDrW5oIHPDoWNoIGPhu6dhIGNow61uaCBwaOG7pyBjw7MgdGjhu4Mg4bqjbmggaMaw4bufbmcgxJHhur9uIEFJUF9QQ19QUF9QVCB0aGVvIG5oaeG7gXUgY8OhY2gga2jDoWMgbmhhdSwgY2jhurNuZyBo4bqhbiBuaMawOg0KICAgIC0gVGhheSDEkeG7lWkgbeG7qWMgcGjDrSBi4bqjbyBoaeG7g20NCiAgICAtIFRoYXkgxJHhu5VpIG3hu6ljIGNoaSB0cuG6oyBjaG8gbmfGsOG7nWkgaMaw4bufbmcgbOG7o2kgw61jaA0KICAgIC0gVGhheSDEkeG7lWkgcXV5IMSR4buLbmggduG7gSDEkeG6p3UgdMawIGPhu6dhIFF14bu5IEjhu5cgdHLhu6MgQuG6o28gaGnhu4NtDQogIA0KICBOZ2/DoGkgY8OhYyB54bq/dSB04buRIHRyw6puLCBBSVBfUENfUFBfUFQgY8WpbmcgY8OzIHRo4buDIGLhu4sg4bqjbmggaMaw4bufbmcgYuG7n2kgY8OhYyB54bq/dSB04buRIGtow6FjIG5oxrA6DQoNCiAgICAtIFLhu6dpIHJvIHRo4buLIHRyxrDhu51uZw0KICAgIC0gUuG7p2kgcm8gdGhhbmgga2hv4bqjbg0KICAgIC0gQ2jhuqV0IGzGsOG7o25nIHF14bqjbiBsw70gY+G7p2EgUXXhu7kgSOG7lyB0cuG7oyBC4bqjbyBoaeG7g20NCg0KDQoNCg==