1 LỜI CẢM ƠN

Lời đầu tiên, em xin gửi lời cảm ơn đến các thầy cô của trường Đại học Tài chính – Marketing, đặc biệt là các thầy cô bộ môn Khoa Kinh tế - Luật đã tận tình giảng dạy và chỉ dẫn em trong quá trình học tập vừa qua. Và em xin chân thành cảm ơn thầy Trần Mạnh Tường đã giúp đỡ, hướng dẫn em hoàn thành bài tiểu luận môn Mô phỏng ngẫu nhiên này một cách tốt nhất. Em xin chúc thầy cô có nhiều sức khỏe, hạnh phúc và thành công trên con đường sự nghiệp của mình.

Trong quá trình hoàn thành tiểu luận em khó tránh khỏi nhiều thiếu sót, em rất mong nhận được những ý kiến đóng góp từ thầy cô, từ đó giúp em hoàn thiện, học hỏi thêm được nhiều kinh nghiệm và củng cố thêm kiến thức của mình.

Lời cuối cùng, em xin kính chúc thầy, cô thật nhiều sức khỏe, đạt được nhiều thành công và phát triển.

Em xin chân thành cảm ơn!

2 CHƯƠNG 1: PHẦN MỞ ĐẦU

2.1 Lý do chọn đề tài

Trong đầu tư, để đưa ra quyết định đầu tư vào các tài sản, các nhà đầu tư thường quan tâm đến hai yếu tố quan trọng: lợi nhuận dự kiến thu được và mức độ rủi ro. Thông thường, các tài sản có lợi nhuận càng cao thì rủi ro càng lớn, và dĩ nhiên các nhà đầu tư luôn muốn hạn chế các rủi ro ấy. Ở các quốc gia có thị trường chứng khoán phát triển, từ rất lâu các nhà đầu tư đã biết áp dụng nguyên tắc “không để tất cả trứng vào cùng một giỏ”, thông qua việc kết hợp các loại tài sản khác nhau để hạn chế rủi ro. Danh mục đầu tư chính là sự kết hợp nắm giữ các loại chứng khoán, hàng hóa, bất động sản, các công cụ tương đương tiền mặt hay các tài sản khác bởi một cá nhân hay một tổ chức đầu tư; mục đích của danh mục đầu tư là làm giảm thiểu rủi ro bằng việc đa dạng hóa đầu tư.

Bài toán tối ưu danh mục đầu tư là bài toán có ý nghĩa quan trọng và nhận được sự quan tâm của các nhà đầu tư trên toàn thế giới. Lý thuyết tối ưu hóa danh mục đầu tư được khởi nguồn từ những nghiên cứu đầu tiên của Harry Markowitz năm 1952. Từ đó, rất nhiều các nghiên cứu tiếp tục được đưa ra, nhằm giải quyết hai vấn đề chính: mô hình một cách đầy đủ bài toán lựa chọn danh mục đầu tư trong thực tế với các rủi ro và các ràng buộc; tính hiệu quả, cụ thể là khả năng giải quyết bài toán cỡ lớn, khi số lượng tài sản và kịch bản đầu tư cần xem xét là rất nhiều

Vì thế em quyết định chọn đề tài “Mô phỏng danh mục đầu tư tối ưu cho nhóm ngành chứng khoán”.

2.2 Mục tiêu và phương pháp nghiên cứu

2.2.1 Mục tiêu

Mục tiêu đầu tiên và quan trọng nhất của việc tối ưu hóa danh mục đầu tư là tối đa hóa lợi nhuận trên một mức rủi ro nhất định. Điều này được thể hiện thông qua biểu đồ đường biên hiệu quả. Danh mục đầu tư tốt nhất sẽ là danh mục mang lại lợi nhuận kỳ vọng cao nhất cho một mức rủi ro hoặc có mức rủi ro thấp nhất cho một khoản lợi nhuận cố định. Vì vậy các nhà đầu tư theo đuổi quá trình tối ưu hóa danh mục đầu tư thường có khả năng đạt được lợi nhuận cao cho các nhà đầu tư.

2.3 Đối tượng và phạm vi nghiên cứu

Danh mục đầu tư giá cổ phiếu của nhóm ngành chứng khoán bao gồn các mã: AGR, APG, BSI, CTS, FTS, HCM, SSI.

Thời gian thu thập từ 1/1/2022 đến 31/7/2023

2.4 Kết cấu đề tài

Nội dung bài tiểu luận bao gồm:

  • Chương 1: Phần mở đầu

  • Chương 2: Tổng quan lý thuyết

  • Chương 3: Dữ liệu nghiên cứu và mô hình đề xuất

  • Chương 4: Kết quả nghiên cứu

  • Chương 5: Kết luận

3 CHƯƠNG 2: TỔNG QUAN LÝ THUYẾT

3.1 Lý thuyết danh mục đầu tư hiện đại Markowitz

Lý thuyết danh mục đầu tư hiện đại (Modern portfolio theory - MPT) được Harry Markowitz xây dựng vào năm 1952. Lý thuyết MPT giải quyết vấn đề căn bản trong lĩnh vực Quản lý danh mục đầu tư: Cho một danh mục các tài sản, cần phải phân bổ làm sao để được một danh mục là tối ưu. Lý thuyết này sẽ xem xét danh mục dưới hai khía cạnh: lợi nhuận và rủi ro (được đại diện bởi giá trị kỳ vọng và phương sai của danh mục2). Danh mục được xem là hiệu quả hơn nếu có lợi nhuận lớn hơn và rủi ro nhỏ hơn.

Cơ sở lý thuyết

Giả sử danh mục gồm các tài sản (có rủi ro). Ứng với một bộ trọng số (còn gọi là một chiến lược đầu tư) ta có một cặp giá trị (lợi nhuận, rủi ro); hình biểu diễn các cặp giá trị này là hình lồi về bên trái:

knitr::include_graphics("D:/MARKOWITZ1.png")

Hình trên minh họa cho trường hợp danh mục có 3 cổ phiếu A, B, C. Tập tất cả những điểm nằm trong hình lồi gọi là điểm chấp nhận được - ứng với một danh mục được thành lập từ 3 cổ phiếu A, B, C. Điểm R ứng với danh mục có rủi ro nhỏ nhất.

  • Biên hiệu quả: Đường biên phía trên điểm R của hình lồi được gọi là biên hiệu quả. Mỗi điểm nằm trên biên hiệu quả ứng với một danh mục hiệu quả, chẳng hạn danh mục Q - không có danh mục nào lợi nhuận cao hơn Q mà đồng thời rủi ro nhỏ hơn Q.

  • Hiệu ứng đa dạng hóa: Lý thuyết MPT cổ súy cho chiến thuật đa dạng hóa trong đầu tư (còn gọi là “không nên bỏ tất cả trứng vào một giỏ”). Chẳng hạn, bằng cách đầu tư vào cả ba cổ phiểu A, B, C ta thu được danh mục R có rủi ro nhỏ hơn là đầu tư vào một cổ phiếu.

  • Nguyên lý “No free lunch”: Lý thuyết MPT cũng là một minh họa tốt cho khái niệm “No free lunch” trong tài chính. Chẳng hạn, so với danh mục hiệu quả Q, ta có thể tìm được danh mục hiệu quả khác có rủi ro thấp hơn nhưng lợi nhuận lại giảm đi; và ngược lại.

3.2 Lựa chọn danh mục đầu tư tối ưu

4 CHƯƠNG 3: DỮ LIỆU NGHIÊN CỨU VÀ MÔ HÌNH ĐỀ XUẤT

4.1 Dữ liệu nghiên cứu

library(readxl)
library(DT)
## Warning: package 'DT' was built under R version 4.3.1
gia <- read_excel("D:/dataCK.xlsx")
gia

4.2 Mô tả dữ liệu nghiên cứu

Bộ dữ liệu bao gồm 391 quan sát và 7 biến. Dữ liệu được thu thập từ ngày 1/1/2022 đến 31/7/2023.

Đơn vị: ngàn đồng

  • Biến AGR: là mã chứng khoán của Công ty Cổ phần Chứng khoán Agribank

  • Biến APG: là mã chứng khoán của Công ty Cổ phần Chứng khoán APG

  • Biến BSI: là mã chứng khoán của Công ty Cổ phần Chứng khoán Ngân hàng Đầu tư và Phát triển Việt Nam

  • Biến CTS: là mã chứng khoán của Công ty Cổ phần Chứng khoán Ngân hàng Công thương Việt Nam

  • Biến FTS: là mã chứng khoán của Công ty Cổ phần Chứng khoán FPT

  • Biến HCM: là mã chứng khoán của Công ty Cổ phần Chứng khoán Thành Phố Hồ Chí Minh

  • Biến SSI: là mã chứng khoán của Công ty Cổ phần Chứng khoán SSI

4.3 Biểu đồ tình hình biến động giá của các cổ phiếu

Biểu đồ tình hình biến động giá của các cổ phiếu nhóm ngành chứng khoán

library(ggplot2)
## Warning: package 'ggplot2' was built under R version 4.3.1
ggplot(gia) +
  geom_line(aes(x = gia$Ngày, y = gia$AGR, color = "AGR")) +
  geom_line(aes(x = gia$Ngày, y = gia$APG, color = "APG")) +
  geom_line(aes(x = gia$Ngày, y = gia$BSI, color = "BSI")) +
  geom_line(aes(x = gia$Ngày, y = gia$CTS, color = "CTS")) +
  geom_line(aes(x = gia$Ngày, y = gia$FTS, color = "FTS")) +
  geom_line(aes(x = gia$Ngày, y = gia$HCM, color = "HCM")) +
  geom_line(aes(x = gia$Ngày, y = gia$SSI, color = "SSI")) +
  labs(x = "Time", y = "price", title = "stock price", color = "stock price") +
  scale_color_manual(values = c("AGR" = "deepskyblue4", "APG" = "brown", "BSI" = "darkseagreen", "CTS" = "goldenrod4", "FTS" = "cyan", "HCM" = "pink", "SSI" = "darkgreen"))
## Warning: Use of `gia$Ngày` is discouraged.
## ℹ Use `Ngày` instead.
## Warning: Use of `gia$AGR` is discouraged.
## ℹ Use `AGR` instead.
## Warning: Use of `gia$Ngày` is discouraged.
## ℹ Use `Ngày` instead.
## Warning: Use of `gia$APG` is discouraged.
## ℹ Use `APG` instead.
## Warning: Use of `gia$Ngày` is discouraged.
## ℹ Use `Ngày` instead.
## Warning: Use of `gia$BSI` is discouraged.
## ℹ Use `BSI` instead.
## Warning: Use of `gia$Ngày` is discouraged.
## ℹ Use `Ngày` instead.
## Warning: Use of `gia$CTS` is discouraged.
## ℹ Use `CTS` instead.
## Warning: Use of `gia$Ngày` is discouraged.
## ℹ Use `Ngày` instead.
## Warning: Use of `gia$FTS` is discouraged.
## ℹ Use `FTS` instead.
## Warning: Use of `gia$Ngày` is discouraged.
## ℹ Use `Ngày` instead.
## Warning: Use of `gia$HCM` is discouraged.
## ℹ Use `HCM` instead.
## Warning: Use of `gia$Ngày` is discouraged.
## ℹ Use `Ngày` instead.
## Warning: Use of `gia$SSI` is discouraged.
## ℹ Use `SSI` instead.

4.4 Mô hình đề xuất

Để mô phỏng được giá trị của danh mục tối ưu đầu tư 7 cổ phiếu lớn thuộc nhóm ngành chứng khoán, em xin đề xuất mô hình như sau:

\(DMDT = E_{1}AGR+E_{2}APG+E_{3}BSI+E_{4}CTS+E_{5}FTS+E_{6}HCM+E_{7}SSI\)

Trong đó: \(E_{1},E_{2},E_{3},E_{4},E_{5},E_{6},E_{7}\) là tỷ trọng danh mục đầu tư tối ưu

  • Biến phụ thuộc: DMDT: Giá trị danh mục đầu tư tối ưu của 7 cổ phiếu nhóm ngành chứng khoán

  • Biến độc lập: cổ phiếu AGR, APG, BSI, CTS, FTS, HCM, SSI.

5 CHƯƠNG 4: KẾT QUẢ NGHIÊN CỨU

5.1 Thống kê mô tả dữ liệu

summary(gia)
##       Ngày                             AGR             APG       
##  Min.   :2022-01-04 00:00:00.00   Min.   : 5669   Min.   : 2520  
##  1st Qu.:2022-05-31 12:00:00.00   1st Qu.: 8263   1st Qu.: 6285  
##  Median :2022-10-18 00:00:00.00   Median :11700   Median : 7270  
##  Mean   :2022-10-18 18:50:38.35   Mean   :12285   Mean   : 8871  
##  3rd Qu.:2023-03-11 12:00:00.00   3rd Qu.:14732   3rd Qu.: 9195  
##  Max.   :2023-07-31 00:00:00.00   Max.   :25098   Max.   :20700  
##       BSI             CTS             FTS             HCM       
##  Min.   :12050   Min.   : 7540   Min.   :11827   Min.   :15073  
##  1st Qu.:19600   1st Qu.:13600   1st Qu.:19755   1st Qu.:22390  
##  Median :27509   Median :16867   Median :26563   Median :25200  
##  Mean   :26987   Mean   :18062   Mean   :27000   Mean   :26147  
##  3rd Qu.:32350   3rd Qu.:21322   3rd Qu.:32150   3rd Qu.:27945  
##  Max.   :43645   Max.   :36760   Max.   :43530   Max.   :44878  
##       SSI       
##  Min.   :13900  
##  1st Qu.:19575  
##  Median :22400  
##  Mean   :24979  
##  3rd Qu.:26567  
##  Max.   :47092

5.2 Xác định phân phối cho các biến đầu vào

5.2.1 Biến AGR

  • Đồ thị
hist(gia$AGR, main = "BIỂU ĐỒ GIÁ CỔ PHIẾU AGR",xlab = "AGR", ylab = "frequency price",col = "#4682B4")

  • Kiểm định phân phối chuẩn

\(H_0\): Biến AGR có phân phối chuẩn

\(H_1\): Biến AGR không có phân phối chuẩn

shapiro.test(gia$AGR)
## 
##  Shapiro-Wilk normality test
## 
## data:  gia$AGR
## W = 0.89837, p-value = 1.772e-15

Với p-value < 0.05 , bác bỏ \(H_0\) nên dãy số liệu này không có phân phối chuẩn

  • Kiểm định phân phối loga chuẩn

\(H_0\): Biến AGR có phân phối loga chuẩn

\(H_1\): Biến AGR không có phân phối loga chuẩn

ks.test(gia$AGR,y="plnorm")
## Warning in ks.test.default(gia$AGR, y = "plnorm"): ties should not be present
## for the Kolmogorov-Smirnov test
## 
##  Asymptotic one-sample Kolmogorov-Smirnov test
## 
## data:  gia$AGR
## D = 1, p-value < 2.2e-16
## alternative hypothesis: two-sided

Với p-value < 0.05 , bác bỏ \(H_0\) nên dãy số liệu này không có phân phối loga chuẩn

  • Kiểm định phân phối mũ

\(H_0\): Biến AGR có phân phối mũ

\(H_1\): Biến AGR không có phân phối mũ

ks.test(gia$AGR,y="pexp")
## Warning in ks.test.default(gia$AGR, y = "pexp"): ties should not be present for
## the Kolmogorov-Smirnov test
## 
##  Asymptotic one-sample Kolmogorov-Smirnov test
## 
## data:  gia$AGR
## D = 1, p-value < 2.2e-16
## alternative hypothesis: two-sided

Với p-value < 0.05 , bác bỏ \(H_0\) nên dãy số liệu này không có phân phối mũ

5.2.2 Biến APG

  • Đồ thị
hist(gia$APG, main = "BIỂU ĐỒ GIÁ CỔ PHIẾU APG",xlab = "APG", ylab = "frequency price",col = "#4682B4")

  • Kiểm định phân phối chuẩn

\(H_0\): Biến APG có phân phối chuẩn

\(H_1\): Biến APG không có phân phối chuẩn

shapiro.test(gia$APG)
## 
##  Shapiro-Wilk normality test
## 
## data:  gia$APG
## W = 0.79233, p-value < 2.2e-16

Với p-value < 0.05 , bác bỏ \(H_0\) nên dãy số liệu này không có phân phối chuẩn

  • Kiểm định phân phối loga chuẩn

\(H_0\): Biến APG có phân phối loga chuẩn

\(H_1\): Biến APG không có phân phối loga chuẩn

ks.test(gia$APG,y="plnorm")
## Warning in ks.test.default(gia$APG, y = "plnorm"): ties should not be present
## for the Kolmogorov-Smirnov test
## 
##  Asymptotic one-sample Kolmogorov-Smirnov test
## 
## data:  gia$APG
## D = 1, p-value < 2.2e-16
## alternative hypothesis: two-sided

Với p-value < 0.05 , bác bỏ \(H_0\) nên dãy số liệu này không có phân phối loga chuẩn

  • Kiểm định phân phối mũ

\(H_0\): Biến APG có phân phối mũ

\(H_1\): Biến APG không có phân phối mũ

ks.test(gia$APG,y="pexp")
## Warning in ks.test.default(gia$APG, y = "pexp"): ties should not be present for
## the Kolmogorov-Smirnov test
## 
##  Asymptotic one-sample Kolmogorov-Smirnov test
## 
## data:  gia$APG
## D = 1, p-value < 2.2e-16
## alternative hypothesis: two-sided

Với p-value < 0.05 , bác bỏ \(H_0\) nên dãy số liệu này không có phân phối mũ

5.2.3 Biến BSI

  • Đồ thị
hist(gia$BSI, main = "BIỂU ĐỒ GIÁ CỔ PHIẾU APG",xlab = "BSI", ylab = "frequency price",col = "#4682B4")

  • Kiểm định phân phối chuẩn

\(H_0\): Biến BSI có phân phối chuẩn

\(H_1\): Biến BSI không có phân phối chuẩn

shapiro.test(gia$BSI)
## 
##  Shapiro-Wilk normality test
## 
## data:  gia$BSI
## W = 0.9632, p-value = 2.438e-08

Với p-value < 0.05 , bác bỏ \(H_0\) nên dãy số liệu này không có phân phối chuẩn

  • Kiểm định phân phối loga chuẩn

\(H_0\): Biến BSI có phân phối loga chuẩn

\(H_1\): Biến BSI không có phân phối loga chuẩn

ks.test(gia$BSI,y="plnorm")
## Warning in ks.test.default(gia$BSI, y = "plnorm"): ties should not be present
## for the Kolmogorov-Smirnov test
## 
##  Asymptotic one-sample Kolmogorov-Smirnov test
## 
## data:  gia$BSI
## D = 1, p-value < 2.2e-16
## alternative hypothesis: two-sided

Với p-value < 0.05 , bác bỏ \(H_0\) nên dãy số liệu này không có phân phối loga chuẩn

  • Kiểm định phân phối mũ

\(H_0\): Biến BSI có phân phối mũ

\(H_1\): Biến BSI không có phân phối mũ

ks.test(gia$BSI,y="pexp")
## Warning in ks.test.default(gia$BSI, y = "pexp"): ties should not be present for
## the Kolmogorov-Smirnov test
## 
##  Asymptotic one-sample Kolmogorov-Smirnov test
## 
## data:  gia$BSI
## D = 1, p-value < 2.2e-16
## alternative hypothesis: two-sided

Với p-value < 0.05 , bác bỏ \(H_0\) nên dãy số liệu này không có phân phối mũ

5.2.4 Biến CTS

  • Đồ thị
hist(gia$CTS, main = "BIỂU ĐỒ GIÁ CỔ PHIẾU CTS",xlab = "CTS", ylab = "frequency price",col = "#4682B4")

  • Kiểm định phân phối chuẩn

\(H_0\): Biến CTS có phân phối chuẩn

\(H_1\): Biến CTS không có phân phối chuẩn

shapiro.test(gia$CTS)
## 
##  Shapiro-Wilk normality test
## 
## data:  gia$CTS
## W = 0.92937, p-value = 1.231e-12

Với p-value < 0.05 , bác bỏ \(H_0\) nên dãy số liệu này không có phân phối chuẩn

  • Kiểm định phân phối loga chuẩn

\(H_0\): Biến CTS có phân phối loga chuẩn

\(H_1\): Biến CTS không có phân phối loga chuẩn

ks.test(gia$CTS,y="plnorm")
## Warning in ks.test.default(gia$CTS, y = "plnorm"): ties should not be present
## for the Kolmogorov-Smirnov test
## 
##  Asymptotic one-sample Kolmogorov-Smirnov test
## 
## data:  gia$CTS
## D = 1, p-value < 2.2e-16
## alternative hypothesis: two-sided

Với p-value < 0.05 , bác bỏ \(H_0\) nên dãy số liệu này không có phân phối loga chuẩn

  • Kiểm định phân phối mũ

\(H_0\): Biến CTS có phân phối mũ

\(H_1\): Biến CTS không có phân phối mũ

ks.test(gia$CTS,y="pexp")
## Warning in ks.test.default(gia$CTS, y = "pexp"): ties should not be present for
## the Kolmogorov-Smirnov test
## 
##  Asymptotic one-sample Kolmogorov-Smirnov test
## 
## data:  gia$CTS
## D = 1, p-value < 2.2e-16
## alternative hypothesis: two-sided

Với p-value < 0.05 , bác bỏ \(H_0\) nên dãy số liệu này không có phân phối mũ

5.2.5 Biến FTS

  • Đồ thị
hist(gia$FTS, main = "BIỂU ĐỒ GIÁ CỔ PHIẾU FTS",xlab = "FTS", ylab = "frequency price",col = "#4682B4")

  • Kiểm định phân phối chuẩn

\(H_0\): Biến FTS có phân phối chuẩn

\(H_1\): Biến FTS không có phân phối chuẩn

shapiro.test(gia$FTS)
## 
##  Shapiro-Wilk normality test
## 
## data:  gia$FTS
## W = 0.97261, p-value = 9.994e-07

Với p-value < 0.05 , bác bỏ \(H_0\) nên dãy số liệu này không có phân phối chuẩn

  • Kiểm định phân phối loga chuẩn

\(H_0\): Biến FTS có phân phối loga chuẩn

\(H_1\): Biến FTS không có phân phối loga chuẩn

ks.test(gia$FTS,y="plnorm")
## Warning in ks.test.default(gia$FTS, y = "plnorm"): ties should not be present
## for the Kolmogorov-Smirnov test
## 
##  Asymptotic one-sample Kolmogorov-Smirnov test
## 
## data:  gia$FTS
## D = 1, p-value < 2.2e-16
## alternative hypothesis: two-sided

Với p-value < 0.05 , bác bỏ \(H_0\) nên dãy số liệu này không có phân phối loga chuẩn

  • Kiểm định phân phối mũ

\(H_0\): Biến FTS có phân phối mũ

\(H_1\): Biến FTS không có phân phối mũ

ks.test(gia$FTS,y="pexp")
## Warning in ks.test.default(gia$FTS, y = "pexp"): ties should not be present for
## the Kolmogorov-Smirnov test
## 
##  Asymptotic one-sample Kolmogorov-Smirnov test
## 
## data:  gia$FTS
## D = 1, p-value < 2.2e-16
## alternative hypothesis: two-sided

Với p-value < 0.05 , bác bỏ \(H_0\) nên dãy số liệu này không có phân phối mũ

5.2.6 Biến HCM

  • Đồ thị
hist(gia$HCM, main = "BIỂU ĐỒ GIÁ CỔ PHIẾU HCM",xlab = "HCM", ylab = "frequency price",col = "#4682B4")

  • Kiểm định phân phối chuẩn

\(H_0\): Biến HCM có phân phối chuẩn

\(H_1\): Biến HCM không có phân phối chuẩn

shapiro.test(gia$HCM)
## 
##  Shapiro-Wilk normality test
## 
## data:  gia$HCM
## W = 0.92774, p-value = 8.361e-13

Với p-value < 0.05 , bác bỏ \(H_0\) nên dãy số liệu này không có phân phối chuẩn

  • Kiểm định phân phối loga chuẩn

\(H_0\): Biến HCM có phân phối loga chuẩn

\(H_1\): Biến HCM không có phân phối loga chuẩn

ks.test(gia$HCM,y="plnorm")
## Warning in ks.test.default(gia$HCM, y = "plnorm"): ties should not be present
## for the Kolmogorov-Smirnov test
## 
##  Asymptotic one-sample Kolmogorov-Smirnov test
## 
## data:  gia$HCM
## D = 1, p-value < 2.2e-16
## alternative hypothesis: two-sided

Với p-value < 0.05 , bác bỏ \(H_0\) nên dãy số liệu này không có phân phối loga chuẩn

  • Kiểm định phân phối mũ

\(H_0\): Biến HCM có phân phối mũ

\(H_1\): Biến HCM không có phân phối mũ

ks.test(gia$HCM,y="pexp")
## Warning in ks.test.default(gia$HCM, y = "pexp"): ties should not be present for
## the Kolmogorov-Smirnov test
## 
##  Asymptotic one-sample Kolmogorov-Smirnov test
## 
## data:  gia$HCM
## D = 1, p-value < 2.2e-16
## alternative hypothesis: two-sided

Với p-value < 0.05 , bác bỏ \(H_0\) nên dãy số liệu này không có phân phối mũ

5.2.7 Biến SSI

  • Đồ thị
hist(gia$SSI, main = "BIỂU ĐỒ GIÁ CỔ PHIẾU SSI",xlab = "SSI", ylab = "frequency price",col = "#4682B4")

  • Kiểm định phân phối chuẩn

\(H_0\): Biến SSI có phân phối chuẩn

\(H_1\): Biến SSI không có phân phối chuẩn

shapiro.test(gia$SSI)
## 
##  Shapiro-Wilk normality test
## 
## data:  gia$SSI
## W = 0.85647, p-value < 2.2e-16

Với p-value < 0.05 , bác bỏ \(H_0\) nên dãy số liệu này không có phân phối chuẩn

  • Kiểm định phân phối loga chuẩn

\(H_0\): Biến BSI có phân phối loga chuẩn

\(H_1\): Biến BSI không có phân phối loga chuẩn

ks.test(gia$SSI, "plnorm")
## Warning in ks.test.default(gia$SSI, "plnorm"): ties should not be present for
## the Kolmogorov-Smirnov test
## 
##  Asymptotic one-sample Kolmogorov-Smirnov test
## 
## data:  gia$SSI
## D = 1, p-value < 2.2e-16
## alternative hypothesis: two-sided

Với p-value < 0.05 , bác bỏ \(H_0\) nên dãy số liệu này không có phân phối loga chuẩn

  • Kiểm định phân phối mũ

\(H_0\): Biến BSI có phân phối mũ

\(H_1\): Biến BSI không có phân phối mũ

ks.test(gia$SSI,y="pexp")
## Warning in ks.test.default(gia$SSI, y = "pexp"): ties should not be present for
## the Kolmogorov-Smirnov test
## 
##  Asymptotic one-sample Kolmogorov-Smirnov test
## 
## data:  gia$SSI
## D = 1, p-value < 2.2e-16
## alternative hypothesis: two-sided

Với p-value < 0.05 , bác bỏ \(H_0\) nên dãy số liệu này không có phân phối mũ

5.3 Vận dụng mô hình markowitz

library(fPortfolio) 
## Warning: package 'fPortfolio' was built under R version 4.3.1
## Loading required package: timeDate
## Loading required package: timeSeries
## Warning: package 'timeSeries' was built under R version 4.3.1
## Loading required package: fBasics
## Warning: package 'fBasics' was built under R version 4.3.1
## Loading required package: fAssets
## Warning: package 'fAssets' was built under R version 4.3.1
#Quy định dữ liệu là chuỗi thời gian
gia <-as.timeSeries(gia) 
#Tính chuỗi lợi nhuận
loinhuan<-head(gia,-1)/tail(gia,-1)-1 
datatable(loinhuan)

Minh họa biên hiệu quả

mohinh = portfolioSpec()
bien <- portfolioFrontier(loinhuan, mohinh)
frontierPlot(bien,col = c('black', 'blue'), pch=19)
#Giả lập các danh mục khác
monteCarloPoints(bien, mcSteps = 10000, cex = 0.25,pch = 19)

Danh mục có phương sai nhỏ nhất:

minriskPortfolio(loinhuan, mohinh)
## 
## Title:
##  MV Minimum Risk Portfolio 
##  Estimator:         covEstimator 
##  Solver:            solveRquadprog 
##  Optimize:          minRisk 
##  Constraints:       LongOnly 
## 
## Portfolio Weights:
##    AGR    APG    BSI    CTS    FTS    HCM    SSI 
## 0.3017 0.1989 0.0441 0.0000 0.0000 0.0666 0.3886 
## 
## Covariance Risk Budgets:
##    AGR    APG    BSI    CTS    FTS    HCM    SSI 
## 0.3017 0.1989 0.0441 0.0000 0.0000 0.0666 0.3886 
## 
## Target Returns and Risks:
##    mean     Cov    CVaR     VaR 
## -0.0008  0.0297  0.0681  0.0632 
## 
## Description:
##  Mon Aug 14 02:59:15 2023 by user: ASUS

Danh mục có phương sai nhỏ nhất trong các danh mục có lợi nhuận

setTargetReturn(mohinh) <- mean(colMeans(loinhuan))
efficientPortfolio(loinhuan, mohinh)
## 
## Title:
##  MV Efficient Portfolio 
##  Estimator:         covEstimator 
##  Solver:            solveRquadprog 
##  Optimize:          minRisk 
##  Constraints:       LongOnly 
## 
## Portfolio Weights:
##    AGR    APG    BSI    CTS    FTS    HCM    SSI 
## 0.2229 0.0292 0.2297 0.0000 0.0777 0.1234 0.3171 
## 
## Covariance Risk Budgets:
##    AGR    APG    BSI    CTS    FTS    HCM    SSI 
## 0.2143 0.0258 0.2474 0.0000 0.0830 0.1238 0.3057 
## 
## Target Returns and Risks:
##    mean     Cov    CVaR     VaR 
## -0.0004  0.0304  0.0678  0.0634 
## 
## Description:
##  Mon Aug 14 02:59:15 2023 by user: ASUS
  • Tỷ trọng đầu tư cổ phiếu trong danh mục tối ưu

  • Cổ phiếu AGR: 0.2143 => đầu tư: 214 cổ phiếu

  • Cổ phiếu APG: 0.0258 => đầu tư: 26 cổ phiếu

  • Cổ phiếu BSI: 0.2474 => đầu tư: 247 cổ phiếu

  • Cổ phiếu CTS: 0.0000 => đầu tư: 0 cổ phiếu

  • Cổ phiếu FTS: 0.0830 => đầu tư: 83 cổ phiếu

  • Cổ phiếu HCM: 0.1238 => đầu tư: 124 cổ phiếu

  • Cổ phiếu SSI: 0.3057 => đầu tư: 306 cổ phiếu

5.4 Mô phỏng các biến độc lập

Khi các biến không có theo phân phối nào và ta muốn mô phỏng dữ liệu ta có thể thực hiện các bước sau đây:

  • Cắt dữ liệu: ta sẽ cắt dãy số liệu ban đầu thành các đoạn có cùng độ rộng hoặc có cùng số lượng quan sát trong mỗi đoạn.

  • Tạo bảng tần suất: Sau khi đã cắt dữ liệu thành các đoạn, ta tính số lượng quan sát nằm trong mỗi đoạn để tạo bảng tần suất.

  • Mô phỏng dữ liệu từ bảng tần suất: Dựa trên bảng tần suất đã tính, ta sẽ mô phỏng dữ liệu mới bằng cách lấy ngẫu nhiên các giá trị từ mỗi đoạn với xác suất phù hợp.

5.4.1 Mô phỏng biến AGR

  • Cắt dữ liệu và tạo bảng tần suất
library(dplyr)
## Warning: package 'dplyr' was built under R version 4.3.1
## 
## Attaching package: 'dplyr'
## The following objects are masked from 'package:timeSeries':
## 
##     filter, lag
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
a <- 10
breaks <- quantile(gia$AGR, probs = seq(0, 1, length.out = a + 1), type = 1, na.rm = TRUE)

agr <- sapply(2:length(breaks), function(i) sample(gia$AGR[gia$AGR >= breaks[i-1] & gia$AGR <= breaks[i]], 10, replace = TRUE))


A <- table(agr)

AA <- as.data.frame(A) %>%
  mutate(Tansuat = Freq / sum(Freq))
AA
  • Mô phỏng theo bảng tần suất
prob1 <- AA$Tansuat
AR1 <- sample(AA$agr, 10000, replace = TRUE, prob = prob1)
AR2 <- as.character(AR1)
ar <- as.numeric(AR2)
hist(ar)

5.4.2 Mô phỏng biến APR

  • Cắt dữ liệu và tạo bảng tần suất
library(dplyr)
b <- 10
breaks <- quantile(gia$APG, probs = seq(0, 1, length.out = b + 1), type = 1, na.rm = TRUE)

apr <- sapply(2:length(breaks), function(i) sample(gia$APG[gia$APG >= breaks[i-1] & gia$APG <= breaks[i]], 10, replace = TRUE))


B <- table(apr)

BB <- as.data.frame(B) %>%
  mutate(Tansuat = Freq / sum(Freq))
BB
  • Mô phỏng theo bảng tần suất
prob2 <- BB$Tansuat
AP1 <- sample(BB$apr, 10000, replace = TRUE, prob = prob2)
AP2 <- as.character(AP1)
ap <- as.numeric(AP2)
hist(ap)

5.4.3 Mô phỏng biến BSI

  • Cắt dữ liệu và tạo bảng tần suất
library(dplyr)
c <- 10
breaks <- quantile(gia$BSI, probs = seq(0, 1, length.out = c + 1), type = 1, na.rm = TRUE)

bsi <- sapply(2:length(breaks), function(i) sample(gia$BSI[gia$BSI >= breaks[i-1] & gia$BSI <= breaks[i]], 10, replace = TRUE))


C <- table(bsi)

CC <- as.data.frame(C) %>%
  mutate(Tansuat = Freq / sum(Freq))
CC
  • Mô phỏng theo bảng tần suất
prob3 <- CC$Tansuat
BS1 <- sample(CC$bsi, 10000, replace = TRUE, prob = prob3)
BS2 <- as.character(BS1)
bs <- as.numeric(BS2)
hist(bs)

5.4.4 Mô phỏng biến CTS

  • Cắt dữ liệu và tạo bảng tần suất
library(dplyr)
d <- 10
breaks <- quantile(gia$CTS, probs = seq(0, 1, length.out = d + 1), type = 1, na.rm = TRUE)

cts <- sapply(2:length(breaks), function(i) sample(gia$CTS[gia$CTS >= breaks[i-1] & gia$CTS <= breaks[i]], 10, replace = TRUE))


D <- table(cts)

DD <- as.data.frame(D) %>%
  mutate(Tansuat = Freq / sum(Freq))
DD
  • Mô phỏng theo bảng tần suất
prob4 <- DD$Tansuat
CT1 <- sample(DD$cts, 10000, replace = TRUE, prob = prob4)
CT2 <- as.character(CT1)
ct <- as.numeric(CT2)
hist(ct)

5.4.5 Mô phỏng biến FTS

  • Cắt dữ liệu và tạo bảng tần suất
library(dplyr)
e <- 10
breaks <- quantile(gia$FTS, probs = seq(0, 1, length.out = e + 1), type = 1, na.rm = TRUE)

fts <- sapply(2:length(breaks), function(i) sample(gia$FTS[gia$FTS >= breaks[i-1] & gia$FTS <= breaks[i]], 10, replace = TRUE))


E <- table(fts)

EE <- as.data.frame(E) %>%
  mutate(Tansuat = Freq / sum(Freq))
EE
  • Mô phỏng theo bảng tần suất
prob5 <- EE$Tansuat
FT1 <- sample(EE$fts, 10000, replace = TRUE, prob = prob5)
FT2 <- as.character(FT1)
ft <- as.numeric(FT2)
hist(ft)

5.4.6 Mô phỏng biến HCM

  • Cắt dữ liệu và tạo bảng tần suất
library(dplyr)
h <- 10
breaks <- quantile(gia$HCM, probs = seq(0, 1, length.out = h + 1), type = 1, na.rm = TRUE)

hcm <- sapply(2:length(breaks), function(i) sample(gia$HCM[gia$HCM >= breaks[i-1] & gia$HCM <= breaks[i]], 10, replace = TRUE))


H <- table(hcm)

HH <- as.data.frame(H) %>%
  mutate(Tansuat = Freq / sum(Freq))
HH
  • Mô phỏng theo bảng tần suất
prob6 <- HH$Tansuat
HC1 <- sample(HH$hcm, 10000, replace = TRUE, prob = prob6)
HC2 <- as.character(HC1)
hc <- as.numeric(HC2)
hist(hc)

5.4.7 Mô phỏng biến SSI

  • Cắt dữ liệu và tạo bảng tần suất
library(dplyr)
s <- 10
breaks <- quantile(gia$SSI, probs = seq(0, 1, length.out = s + 1), type = 1, na.rm = TRUE)

ssi <- sapply(2:length(breaks), function(i) sample(gia$SSI[gia$SSI >= breaks[i-1] & gia$HCM <= breaks[i]], 10, replace = TRUE))


S <- table(ssi)

SS <- as.data.frame(S) %>%
  mutate(Tansuat = Freq / sum(Freq))
SS
  • Mô phỏng theo bảng tần suất
prob7 <- SS$Tansuat
SS1 <- sample(SS$ssi, 10000, replace = TRUE, prob = prob7)
SS2 <- as.character(SS1)
ss <- as.numeric(SS2)
hist(ss)

5.5 Mô phỏng giá trị của danh mục tối ưu

  • Cổ phiếu AGR: 0.2143 => đầu tư: 214 cổ phiếu

  • Cổ phiếu APG: 0.0258 => đầu tư: 26 cổ phiếu

  • Cổ phiếu BSI: 0.2474 => đầu tư: 247 cổ phiếu

  • Cổ phiếu CTS: 0.0000 => đầu tư: 0 cổ phiếu

  • Cổ phiếu FTS: 0.0830 => đầu tư: 83 cổ phiếu

  • Cổ phiếu HCM: 0.1238 => đầu tư: 124 cổ phiếu

  • Cổ phiếu SSI: 0.3057 => đầu tư: 306 cổ phiếu

  • Kết quả mô hình đề xuất

DMDT <- 214*ar + 26*ap + 247*bs + 0*ct + 83*ft + 124*hc + 306*ss
  • Biểu đồ histogram mô phỏng mô hình
hist(DMDT)

  • Biểu đồ
plot(DMDT, type = 'l', col = '#4682B4', main = "Tổng giá trị danh mục đầu tư 6 cổ phiếu trong rổ VN30", ylab = "VNĐ", xlab = "Ngày")

summary(DMDT)
##     Min.  1st Qu.   Median     Mean  3rd Qu.     Max. 
## 14072588 20514621 22642348 22924284 25053529 34585340

Sau khi mô phỏng tổng giá trị danh mục đầu tư tối ưu, ta thấy rằng trong 10000 ngày tới trung bình giá trị danh mục đầu tư tối ưu là 22.641.329 đồng, lớn nhất là 35.489.460 đồng

LS0tDQp0aXRsZTogIlRJ4buCVSBMVeG6rE4gTcOUIFBI4buOTkcgTkfhuqpVIE5IScOKTiINCmF1dGhvcjogIk5HVVnhu4ROIFRIw5pZIE5Hw4JOIg0KZGF0ZTogIjIwMjMtMDgtMTAiDQpvdXRwdXQ6IA0KICBodG1sX2RvY3VtZW50Og0KICAgIGRmX3ByaW50OiBwYWdlZA0KICAgIHRoZW1lOiBjZXJ1bGVhbg0KICAgIHRvYzogdHJ1ZQ0KICAgIHRvY19mbG9hdDoNCiAgICAgIGNvbGxhcHNlZDogZmFsc2UNCiAgICAgIHNtb290aF9zY3JvbGw6IGZhbHNlDQogICAgbnVtYmVyX3NlY3Rpb25zOiB0cnVlDQogICAgY29kZV9mb2xkaW5nIDogaGlkZQ0KICAgIGNvZGVfZG93bmxvYWQ6IHRydWUNCi0tLQ0KDQo8c3R5bGU+DQpib2R5IHsNCnRleHQtYWxpZ246IGp1c3RpZnl9DQo8L3N0eWxlPg0KDQoNCiMgTOG7nEkgQ+G6ok0gxqBODQoNCkzhu51pIMSR4bqndSB0acOqbiwgZW0geGluIGfhu61pIGzhu51pIGPhuqNtIMahbiDEkeG6v24gY8OhYyB0aOG6p3kgY8O0IGPhu6dhIHRyxrDhu51uZyDEkOG6oWkgaOG7jWMgVMOgaSBjaMOtbmgg4oCTIE1hcmtldGluZywgxJHhurdjIGJp4buHdCBsw6AgY8OhYyB0aOG6p3kgY8O0IGLhu5kgbcO0biBLaG9hIEtpbmggdOG6vyAtIEx14bqtdCDEkcOjIHThuq1uIHTDrG5oIGdp4bqjbmcgZOG6oXkgdsOgIGNo4buJIGThuqtuIGVtIHRyb25nIHF1w6EgdHLDrG5oIGjhu41jIHThuq1wIHbhu6thIHF1YS4gVsOgIGVtIHhpbiBjaMOibiB0aMOgbmggY+G6o20gxqFuIHRo4bqneSBUcuG6p24gTeG6oW5oIFTGsOG7nW5nIMSRw6MgZ2nDunAgxJHhu6EsIGjGsOG7m25nIGThuqtuIGVtIGhvw6BuIHRow6BuaCBiw6BpIHRp4buDdSBsdeG6rW4gbcO0biBNw7QgcGjhu49uZyBuZ+G6q3Ugbmhpw6puIG7DoHkgbeG7mXQgY8OhY2ggdOG7kXQgbmjhuqV0LiBFbSB4aW4gY2jDumMgdGjhuqd5IGPDtCBjw7Mgbmhp4buBdSBz4bupYyBraOG7j2UsIGjhuqFuaCBwaMO6YyB2w6AgdGjDoG5oIGPDtG5nIHRyw6puIGNvbiDEkcaw4budbmcgc+G7sSBuZ2hp4buHcCBj4bunYSBtw6xuaC4NCg0KVHJvbmcgcXXDoSB0csOsbmggaG/DoG4gdGjDoG5oIHRp4buDdSBsdeG6rW4gZW0ga2jDsyB0csOhbmgga2jhu49pIG5oaeG7gXUgdGhp4bq/dSBzw7N0LCBlbSBy4bqldCBtb25nIG5o4bqtbiDEkcaw4bujYyBuaOG7r25nIMO9IGtp4bq/biDEkcOzbmcgZ8OzcCB04burIHRo4bqneSBjw7QsIHThu6sgxJHDsyBnacO6cCBlbSBob8OgbiB0aGnhu4duLCBo4buNYyBo4buPaSB0aMOqbSDEkcaw4bujYyBuaGnhu4F1IGtpbmggbmdoaeG7h20gdsOgIGPhu6duZyBj4buRIHRow6ptIGtp4bq/biB0aOG7qWMgY+G7p2EgbcOsbmguIA0KDQpM4budaSBjdeG7kWkgY8O5bmcsIGVtIHhpbiBrw61uaCBjaMO6YyB0aOG6p3ksIGPDtCB0aOG6rXQgbmhp4buBdSBz4bupYyBraOG7j2UsIMSR4bqhdCDEkcaw4bujYyBuaGnhu4F1IHRow6BuaCBjw7RuZyB2w6AgcGjDoXQgdHJp4buDbi4gDQoNCkVtIHhpbiBjaMOibiB0aMOgbmggY+G6o20gxqFuIQ0KDQoNCiMgQ0jGr8agTkcgMTogUEjhuqZOIE3hu54gxJDhuqZVDQoNCiMjIEzDvSBkbyBjaOG7jW4gxJHhu4EgdMOgaQ0KDQpUcm9uZyDEkeG6p3UgdMawLCDEkeG7gyDEkcawYSByYSBxdXnhur90IMSR4buLbmggxJHhuqd1IHTGsCB2w6BvIGPDoWMgdMOgaSBz4bqjbiwgY8OhYyBuaMOgIMSR4bqndSB0xrAgdGjGsOG7nW5nIHF1YW4gdMOibSDEkeG6v24gaGFpIHnhur91IHThu5EgcXVhbiB0cuG7jW5nOiBs4bujaSBuaHXhuq1uIGThu7Ega2nhur9uIHRodSDEkcaw4bujYyB2w6AgbeG7qWMgxJHhu5kgcuG7p2kgcm8uIFRow7RuZyB0aMaw4budbmcsIGPDoWMgdMOgaSBz4bqjbiBjw7MgbOG7o2kgbmh14bqtbiBjw6BuZyBjYW8gdGjDrCBy4bunaSBybyBjw6BuZyBs4bubbiwgdsOgIGTEqSBuaGnDqm4gY8OhYyBuaMOgIMSR4bqndSB0xrAgbHXDtG4gbXXhu5FuIGjhuqFuIGNo4bq/IGPDoWMgcuG7p2kgcm8g4bqleS4g4bueIGPDoWMgcXXhu5FjIGdpYSBjw7MgdGjhu4sgdHLGsOG7nW5nIGNo4bupbmcga2hvw6FuIHBow6F0IHRyaeG7g24sIHThu6sgcuG6pXQgbMOidSBjw6FjIG5ow6AgxJHhuqd1IHTGsCDEkcOjIGJp4bq/dCDDoXAgZOG7pW5nIG5ndXnDqm4gdOG6r2Mg4oCca2jDtG5nIMSR4buDIHThuqV0IGPhuqMgdHLhu6luZyB2w6BvIGPDuW5nIG3hu5l0IGdp4buP4oCdLCB0aMO0bmcgcXVhIHZp4buHYyBr4bq/dCBo4bujcCBjw6FjIGxv4bqhaSB0w6BpIHPhuqNuIGtow6FjIG5oYXUgxJHhu4MgaOG6oW4gY2jhur8gcuG7p2kgcm8uIERhbmggbeG7pWMgxJHhuqd1IHTGsCBjaMOtbmggbMOgIHPhu7Ega+G6v3QgaOG7o3AgbuG6r20gZ2nhu68gY8OhYyBsb+G6oWkgY2jhu6luZyBraG/DoW4sIGjDoG5nIGjDs2EsIGLhuqV0IMSR4buZbmcgc+G6o24sIGPDoWMgY8O0bmcgY+G7pSB0xrDGoW5nIMSRxrDGoW5nIHRp4buBbiBt4bq3dCBoYXkgY8OhYyB0w6BpIHPhuqNuIGtow6FjIGLhu59pIG3hu5l0IGPDoSBuaMOibiBoYXkgbeG7mXQgdOG7lSBjaOG7qWMgxJHhuqd1IHTGsDsgbeG7pWMgxJHDrWNoIGPhu6dhIGRhbmggbeG7pWMgxJHhuqd1IHTGsCBsw6AgbMOgbSBnaeG6o20gdGhp4buDdSBy4bunaSBybyBi4bqxbmcgdmnhu4djIMSRYSBk4bqhbmcgaMOzYSDEkeG6p3UgdMawLiANCg0KQsOgaSB0b8OhbiB04buRaSDGsHUgZGFuaCBt4bulYyDEkeG6p3UgdMawIGzDoCBiw6BpIHRvw6FuIGPDsyDDvSBuZ2jEqWEgcXVhbiB0cuG7jW5nIHbDoCBuaOG6rW4gxJHGsOG7o2Mgc+G7sSBxdWFuIHTDom0gY+G7p2EgY8OhYyBuaMOgIMSR4bqndSB0xrAgdHLDqm4gdG/DoG4gdGjhur8gZ2nhu5tpLiBMw70gdGh1eeG6v3QgdOG7kWkgxrB1IGjDs2EgZGFuaCBt4bulYyDEkeG6p3UgdMawIMSRxrDhu6NjIGto4bufaSBuZ3Xhu5NuIHThu6sgbmjhu69uZyBuZ2hpw6puIGPhu6l1IMSR4bqndSB0acOqbiBj4bunYSBIYXJyeSBNYXJrb3dpdHogbsSDbSAxOTUyLiBU4burIMSRw7MsIHLhuqV0IG5oaeG7gXUgY8OhYyBuZ2hpw6puIGPhu6l1IHRp4bq/cCB04bulYyDEkcaw4bujYyDEkcawYSByYSwgbmjhurFtIGdp4bqjaSBxdXnhur90IGhhaSB24bqlbiDEkeG7gSBjaMOtbmg6IG3DtCBow6xuaCBt4buZdCBjw6FjaCDEkeG6p3kgxJHhu6cgYsOgaSB0b8OhbiBs4buxYSBjaOG7jW4gZGFuaCBt4bulYyDEkeG6p3UgdMawIHRyb25nIHRo4buxYyB04bq/IHbhu5tpIGPDoWMgcuG7p2kgcm8gdsOgIGPDoWMgcsOgbmcgYnXhu5ljOyB0w61uaCBoaeG7h3UgcXXhuqMsIGPhu6UgdGjhu4MgbMOgIGto4bqjIG7Eg25nIGdp4bqjaSBxdXnhur90IGLDoGkgdG/DoW4gY+G7oSBs4bubbiwga2hpIHPhu5EgbMaw4bujbmcgdMOgaSBz4bqjbiB2w6Aga+G7i2NoIGLhuqNuIMSR4bqndSB0xrAgY+G6p24geGVtIHjDqXQgbMOgIHLhuqV0IG5oaeG7gXUNCg0KVsOsIHRo4bq/IGVtIHF1eeG6v3QgxJHhu4tuaCBjaOG7jW4gxJHhu4EgdMOgaSAqKiJNw7QgcGjhu49uZyBkYW5oIG3hu6VjIMSR4bqndSB0xrAgdOG7kWkgxrB1IGNobyBuaMOzbSBuZ8OgbmggY2jhu6luZyBraG/DoW4iKiouDQoNCiMjIE3hu6VjIHRpw6p1IHbDoCBwaMawxqFuZyBwaMOhcCBuZ2hpw6puIGPhu6l1DQoNCiMjIyBN4bulYyB0acOqdQ0KDQpN4bulYyB0acOqdSDEkeG6p3UgdGnDqm4gdsOgIHF1YW4gdHLhu41uZyBuaOG6pXQgY+G7p2Egdmnhu4djIHThu5FpIMawdSBow7NhIGRhbmggbeG7pWMgxJHhuqd1IHTGsCBsw6AgdOG7kWkgxJFhIGjDs2EgbOG7o2kgbmh14bqtbiB0csOqbiBt4buZdCBt4bupYyBy4bunaSBybyBuaOG6pXQgxJHhu4tuaC4gxJBp4buBdSBuw6B5IMSRxrDhu6NjIHRo4buDIGhp4buHbiB0aMO0bmcgcXVhIGJp4buDdSDEkeG7kyDEkcaw4budbmcgYmnDqm4gaGnhu4d1IHF14bqjLiBEYW5oIG3hu6VjIMSR4bqndSB0xrAgdOG7kXQgbmjhuqV0IHPhur0gbMOgIGRhbmggbeG7pWMgbWFuZyBs4bqhaSBs4bujaSBuaHXhuq1uIGvhu7MgduG7jW5nIGNhbyBuaOG6pXQgY2hvIG3hu5l0IG3hu6ljIHLhu6dpIHJvIGhv4bq3YyBjw7MgbeG7qWMgcuG7p2kgcm8gdGjhuqVwIG5o4bqldCBjaG8gbeG7mXQga2hv4bqjbiBs4bujaSBuaHXhuq1uIGPhu5EgxJHhu4tuaC4gVsOsIHbhuq15IGPDoWMgbmjDoCDEkeG6p3UgdMawIHRoZW8gxJF14buVaSBxdcOhIHRyw6xuaCB04buRaSDGsHUgaMOzYSBkYW5oIG3hu6VjIMSR4bqndSB0xrAgdGjGsOG7nW5nIGPDsyBraOG6oyBuxINuZyDEkeG6oXQgxJHGsOG7o2MgbOG7o2kgbmh14bqtbiBjYW8gY2hvIGPDoWMgbmjDoCDEkeG6p3UgdMawLg0KDQoNCiMjIMSQ4buRaSB0xrDhu6NuZyB2w6AgcGjhuqFtIHZpIG5naGnDqm4gY+G7qXUNCg0KRGFuaCBt4bulYyDEkeG6p3UgdMawIGdpw6EgY+G7lSBwaGnhur91IGPhu6dhIG5ow7NtIG5nw6BuaCBjaOG7qW5nIGtob8OhbiBiYW8gZ+G7k24gY8OhYyBtw6M6IEFHUiwgQVBHLCBCU0ksIENUUywgRlRTLCBIQ00sIFNTSS4NCg0KVGjhu51pIGdpYW4gdGh1IHRo4bqtcCB04burIDEvMS8yMDIyIMSR4bq/biAzMS83LzIwMjMNCg0KIyMgS+G6v3QgY+G6pXUgxJHhu4EgdMOgaSANCg0KTuG7mWkgZHVuZyBiw6BpIHRp4buDdSBsdeG6rW4gYmFvIGfhu5NtOg0KDQogKiAqQ2jGsMahbmcgMToqICBQaOG6p24gbeG7nyDEkeG6p3UNCg0KICogKkNoxrDGoW5nIDI6KiAgVOG7lW5nIHF1YW4gbMO9IHRodXnhur90IA0KDQogKiAqQ2jGsMahbmcgMzoqICBE4buvIGxp4buHdSBuZ2hpw6puIGPhu6l1IHbDoCBtw7QgaMOsbmggxJHhu4EgeHXhuqV0DQoNCiAqICpDaMawxqFuZyA0OiogIEvhur90IHF14bqjIG5naGnDqm4gY+G7qXUNCg0KICogKkNoxrDGoW5nIDU6KiAgS+G6v3QgbHXhuq1uIA0KIA0KDQojIENIxq/GoE5HIDI6IFThu5RORyBRVUFOIEzDnSBUSFVZ4bq+VA0KDQojIyBMw70gdGh1eeG6v3QgZGFuaCBt4bulYyDEkeG6p3UgdMawIGhp4buHbiDEkeG6oWkgTWFya293aXR6DQoNCkzDvSB0aHV54bq/dCBkYW5oIG3hu6VjIMSR4bqndSB0xrAgaGnhu4duIMSR4bqhaSAoTW9kZXJuIHBvcnRmb2xpbyB0aGVvcnkgLSBNUFQpIMSRxrDhu6NjIEhhcnJ5IE1hcmtvd2l0eiB4w6J5IGThu7FuZyB2w6BvIG7Eg20gMTk1Mi4gTMO9IHRodXnhur90IE1QVCBnaeG6o2kgcXV54bq/dCB24bqlbiDEkeG7gSBjxINuIGLhuqNuIHRyb25nIGzEqW5oIHbhu7FjIFF14bqjbiBsw70gZGFuaCBt4bulYyDEkeG6p3UgdMawOiBDaG8gbeG7mXQgZGFuaCBt4bulYyBjw6FjIHTDoGkgc+G6o24sIGPhuqduIHBo4bqjaSBwaMOibiBi4buVIGzDoG0gc2FvIMSR4buDIMSRxrDhu6NjIG3hu5l0IGRhbmggbeG7pWMgbMOgIHThu5FpIMawdS4gTMO9IHRodXnhur90IG7DoHkgc+G6vSB4ZW0geMOpdCBkYW5oIG3hu6VjIGTGsOG7m2kgaGFpIGtow61hIGPhuqFuaDogbOG7o2kgbmh14bqtbiB2w6AgcuG7p2kgcm8gKMSRxrDhu6NjIMSR4bqhaSBkaeG7h24gYuG7n2kgZ2nDoSB0cuG7iyBr4buzIHbhu41uZyB2w6AgcGjGsMahbmcgc2FpIGPhu6dhIGRhbmggbeG7pWMyKS4gRGFuaCBt4bulYyDEkcaw4bujYyB4ZW0gbMOgIGhp4buHdSBxdeG6oyBoxqFuIG7hur91IGPDsyBs4bujaSBuaHXhuq1uIGzhu5tuIGjGoW4gdsOgIHLhu6dpIHJvIG5o4buPIGjGoW4uDQoNCioqQ8ahIHPhu58gbMO9IHRodXnhur90KiogDQoNCkdp4bqjIHPhu60gZGFuaCBt4bulYyBn4buTbSBjw6FjIHTDoGkgc+G6o24gKGPDsyBy4bunaSBybykuIOG7qG5nIHbhu5tpIG3hu5l0IGLhu5kgdHLhu41uZyBz4buRIChjw7JuIGfhu41pIGzDoCBt4buZdCBjaGnhur9uIGzGsOG7o2MgxJHhuqd1IHTGsCkgdGEgY8OzIG3hu5l0IGPhurdwIGdpw6EgdHLhu4sgKGzhu6NpIG5odeG6rW4sIHLhu6dpIHJvKTsgaMOsbmggYmnhu4N1IGRp4buFbiBjw6FjIGPhurdwIGdpw6EgdHLhu4sgbsOgeSBsw6AgaMOsbmggbOG7k2kgduG7gSBiw6puIHRyw6FpOg0KDQpgYGB7cn0NCmtuaXRyOjppbmNsdWRlX2dyYXBoaWNzKCJEOi9NQVJLT1dJVFoxLnBuZyIpDQpgYGANCg0KDQpIw6xuaCB0csOqbiBtaW5oIGjhu41hIGNobyB0csaw4budbmcgaOG7o3AgZGFuaCBt4bulYyBjw7MgMyBj4buVIHBoaeG6v3UgQSwgQiwgQy4gVOG6rXAgdOG6pXQgY+G6oyBuaOG7r25nIMSRaeG7g20gbuG6sW0gdHJvbmcgaMOsbmggbOG7k2kgZ+G7jWkgbMOgIMSRaeG7g20gY2jhuqVwIG5o4bqtbiDEkcaw4bujYyAtIOG7qW5nIHbhu5tpIG3hu5l0IGRhbmggbeG7pWMgxJHGsOG7o2MgdGjDoG5oIGzhuq1wIHThu6sgMyBj4buVIHBoaeG6v3UgQSwgQiwgQy4gxJBp4buDbSBSIOG7qW5nIHbhu5tpIGRhbmggbeG7pWMgY8OzIHLhu6dpIHJvIG5o4buPIG5o4bqldC4NCg0KKiBCacOqbiBoaeG7h3UgcXXhuqM6IMSQxrDhu51uZyBiacOqbiBwaMOtYSB0csOqbiDEkWnhu4NtIFIgY+G7p2EgaMOsbmggbOG7k2kgxJHGsOG7o2MgZ+G7jWkgbMOgIGJpw6puIGhp4buHdSBxdeG6oy4gTeG7l2kgxJFp4buDbSBu4bqxbSB0csOqbiBiacOqbiBoaeG7h3UgcXXhuqMg4bupbmcgduG7m2kgbeG7mXQgZGFuaCBt4bulYyBoaeG7h3UgcXXhuqMsIGNo4bqzbmcgaOG6oW4gZGFuaCBt4bulYyBRIC0ga2jDtG5nIGPDsyBkYW5oIG3hu6VjIG7DoG8gbOG7o2kgbmh14bqtbiBjYW8gaMahbiBRIG3DoCDEkeG7k25nIHRo4budaSBy4bunaSBybyBuaOG7jyBoxqFuIFEuDQoNCiogSGnhu4d1IOG7qW5nIMSRYSBk4bqhbmcgaMOzYTogTMO9IHRodXnhur90IE1QVCBj4buVIHPDunkgY2hvIGNoaeG6v24gdGh14bqtdCDEkWEgZOG6oW5nIGjDs2EgdHJvbmcgxJHhuqd1IHTGsCAoY8OybiBn4buNaSBsw6Ag4oCca2jDtG5nIG7Dqm4gYuG7jyB04bqldCBj4bqjIHRy4bupbmcgdsOgbyBt4buZdCBnaeG7j+KAnSkuIENo4bqzbmcgaOG6oW4sIGLhurFuZyBjw6FjaCDEkeG6p3UgdMawIHbDoG8gY+G6oyBiYSBj4buVIHBoaeG7g3UgQSwgQiwgQyB0YSB0aHUgxJHGsOG7o2MgZGFuaCBt4bulYyBSIGPDsyBy4bunaSBybyBuaOG7jyBoxqFuIGzDoCDEkeG6p3UgdMawIHbDoG8gbeG7mXQgY+G7lSBwaGnhur91Lg0KDQoqIE5ndXnDqm4gbMO9IOKAnE5vIGZyZWUgbHVuY2jigJ06IEzDvSB0aHV54bq/dCBNUFQgY8WpbmcgbMOgIG3hu5l0IG1pbmggaOG7jWEgdOG7kXQgY2hvIGtow6FpIG5p4buHbSDigJxObyBmcmVlIGx1bmNo4oCdIHRyb25nIHTDoGkgY2jDrW5oLiBDaOG6s25nIGjhuqFuLCBzbyB24bubaSBkYW5oIG3hu6VjIGhp4buHdSBxdeG6oyBRLCB0YSBjw7MgdGjhu4MgdMOsbSDEkcaw4bujYyBkYW5oIG3hu6VjIGhp4buHdSBxdeG6oyBraMOhYyBjw7MgcuG7p2kgcm8gdGjhuqVwIGjGoW4gbmjGsG5nIGzhu6NpIG5odeG6rW4gbOG6oWkgZ2nhuqNtIMSRaTsgdsOgIG5nxrDhu6NjIGzhuqFpLg0KDQojIyBM4buxYSBjaOG7jW4gZGFuaCBt4bulYyDEkeG6p3UgdMawIHThu5FpIMawdQ0KDQoNCiMgQ0jGr8agTkcgMzogROG7riBMSeG7hlUgTkdIScOKTiBD4buoVSBWw4AgTcOUIEjDjE5IIMSQ4buAIFhV4bqkVA0KDQojIyBE4buvIGxp4buHdSBuZ2hpw6puIGPhu6l1DQoNCg0KYGBge3J9DQpsaWJyYXJ5KHJlYWR4bCkNCmxpYnJhcnkoRFQpDQpnaWEgPC0gcmVhZF9leGNlbCgiRDovZGF0YUNLLnhsc3giKQ0KZ2lhDQpgYGANCg0KDQojIyBNw7QgdOG6oyBk4buvIGxp4buHdSBuZ2hpw6puIGPhu6l1DQoNCkLhu5kgZOG7ryBsaeG7h3UgYmFvIGfhu5NtIDM5MSBxdWFuIHPDoXQgdsOgIDcgYmnhur9uLiBE4buvIGxp4buHdSDEkcaw4bujYyB0aHUgdGjhuq1wIHThu6sgbmfDoHkgMS8xLzIwMjIgxJHhur9uIDMxLzcvMjAyMy4NCg0KxJDGoW4gduG7izogbmfDoG4gxJHhu5NuZyANCg0KKiBCaeG6v24gQUdSOiBsw6AgbcOjIGNo4bupbmcga2hvw6FuIGPhu6dhIEPDtG5nIHR5IEPhu5UgcGjhuqduIENo4bupbmcga2hvw6FuIEFncmliYW5rIA0KDQoqIEJp4bq/biBBUEc6IGzDoCBtw6MgY2jhu6luZyBraG/DoW4gY+G7p2EgQ8O0bmcgdHkgQ+G7lSBwaOG6p24gQ2jhu6luZyBraG/DoW4gQVBHDQoNCiogQmnhur9uIEJTSTogbMOgIG3DoyBjaOG7qW5nIGtob8OhbiBj4bunYSBDw7RuZyB0eSBD4buVIHBo4bqnbiBDaOG7qW5nIGtob8OhbiBOZ8OibiBow6BuZyDEkOG6p3UgdMawIHbDoCBQaMOhdCB0cmnhu4NuIFZp4buHdCBOYW0NCg0KKiBCaeG6v24gQ1RTOiBsw6AgbcOjIGNo4bupbmcga2hvw6FuIGPhu6dhIEPDtG5nIHR5IEPhu5UgcGjhuqduIENo4bupbmcga2hvw6FuIE5nw6JuIGjDoG5nIEPDtG5nIHRoxrDGoW5nIFZp4buHdCBOYW0NCg0KKiBCaeG6v24gRlRTOiBsw6AgbcOjIGNo4bupbmcga2hvw6FuIGPhu6dhIEPDtG5nIHR5IEPhu5UgcGjhuqduIENo4bupbmcga2hvw6FuIEZQVA0KDQoqIEJp4bq/biBIQ006IGzDoCBtw6MgY2jhu6luZyBraG/DoW4gY+G7p2EgQ8O0bmcgdHkgQ+G7lSBwaOG6p24gQ2jhu6luZyBraG/DoW4gVGjDoG5oIFBo4buRIEjhu5MgQ2jDrSBNaW5oDQoNCiogQmnhur9uIFNTSTogbMOgIG3DoyBjaOG7qW5nIGtob8OhbiBj4bunYSBDw7RuZyB0eSBD4buVIHBo4bqnbiBDaOG7qW5nIGtob8OhbiBTU0kgDQoNCiMjIEJp4buDdSDEkeG7kyB0w6xuaCBow6xuaCBiaeG6v24gxJHhu5luZyBnacOhIGPhu6dhIGPDoWMgY+G7lSBwaGnhur91DQoNCkJp4buDdSDEkeG7kyB0w6xuaCBow6xuaCBiaeG6v24gxJHhu5luZyBnacOhIGPhu6dhIGPDoWMgY+G7lSBwaGnhur91IG5ow7NtIG5nw6BuaCBjaOG7qW5nIGtob8Ohbg0KDQpgYGB7cn0NCmxpYnJhcnkoZ2dwbG90MikNCmdncGxvdChnaWEpICsNCiAgZ2VvbV9saW5lKGFlcyh4ID0gZ2lhJE5nw6B5LCB5ID0gZ2lhJEFHUiwgY29sb3IgPSAiQUdSIikpICsNCiAgZ2VvbV9saW5lKGFlcyh4ID0gZ2lhJE5nw6B5LCB5ID0gZ2lhJEFQRywgY29sb3IgPSAiQVBHIikpICsNCiAgZ2VvbV9saW5lKGFlcyh4ID0gZ2lhJE5nw6B5LCB5ID0gZ2lhJEJTSSwgY29sb3IgPSAiQlNJIikpICsNCiAgZ2VvbV9saW5lKGFlcyh4ID0gZ2lhJE5nw6B5LCB5ID0gZ2lhJENUUywgY29sb3IgPSAiQ1RTIikpICsNCiAgZ2VvbV9saW5lKGFlcyh4ID0gZ2lhJE5nw6B5LCB5ID0gZ2lhJEZUUywgY29sb3IgPSAiRlRTIikpICsNCiAgZ2VvbV9saW5lKGFlcyh4ID0gZ2lhJE5nw6B5LCB5ID0gZ2lhJEhDTSwgY29sb3IgPSAiSENNIikpICsNCiAgZ2VvbV9saW5lKGFlcyh4ID0gZ2lhJE5nw6B5LCB5ID0gZ2lhJFNTSSwgY29sb3IgPSAiU1NJIikpICsNCiAgbGFicyh4ID0gIlRpbWUiLCB5ID0gInByaWNlIiwgdGl0bGUgPSAic3RvY2sgcHJpY2UiLCBjb2xvciA9ICJzdG9jayBwcmljZSIpICsNCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGMoIkFHUiIgPSAiZGVlcHNreWJsdWU0IiwgIkFQRyIgPSAiYnJvd24iLCAiQlNJIiA9ICJkYXJrc2VhZ3JlZW4iLCAiQ1RTIiA9ICJnb2xkZW5yb2Q0IiwgIkZUUyIgPSAiY3lhbiIsICJIQ00iID0gInBpbmsiLCAiU1NJIiA9ICJkYXJrZ3JlZW4iKSkNCmBgYA0KDQoNCg0KIyMgTcO0IGjDrG5oIMSR4buBIHh14bqldA0KDQrEkOG7gyBtw7QgcGjhu49uZyDEkcaw4bujYyBnacOhIHRy4buLIGPhu6dhIGRhbmggbeG7pWMgdOG7kWkgxrB1IMSR4bqndSB0xrAgNyBj4buVIHBoaeG6v3UgbOG7m24gdGh14buZYyBuaMOzbSBuZ8OgbmggY2jhu6luZyBraG/DoW4sIGVtIHhpbiDEkeG7gSB4deG6pXQgbcO0IGjDrG5oIG5oxrAgc2F1OiANCg0KJERNRFQgPSBFX3sxfUFHUitFX3syfUFQRytFX3szfUJTSStFX3s0fUNUUytFX3s1fUZUUytFX3s2fUhDTStFX3s3fVNTSSQNCg0KDQoNClRyb25nIMSRw7M6ICRFX3sxfSxFX3syfSxFX3szfSxFX3s0fSxFX3s1fSxFX3s2fSxFX3s3fSQgbMOgIHThu7cgdHLhu41uZyBkYW5oIG3hu6VjIMSR4bqndSB0xrAgdOG7kWkgxrB1DQoNCiogKipCaeG6v24gcGjhu6UgdGh14buZYzoqKg0KRE1EVDogR2nDoSB0cuG7iyBkYW5oIG3hu6VjIMSR4bqndSB0xrAgdOG7kWkgxrB1IGPhu6dhIDcgY+G7lSBwaGnhur91IG5ow7NtIG5nw6BuaCBjaOG7qW5nIGtob8OhbiANCg0KKiAqKkJp4bq/biDEkeG7mWMgbOG6rXA6KiogY+G7lSBwaGnhur91IEFHUiwgQVBHLCBCU0ksIENUUywgRlRTLCBIQ00sIFNTSS4NCg0KDQoNCiMgQ0jGr8agTkcgNDogS+G6vlQgUVXhuqIgTkdIScOKTiBD4buoVQ0KDQojIyBUaOG7kW5nIGvDqiBtw7QgdOG6oyBk4buvIGxp4buHdSANCg0KYGBge3J9DQpzdW1tYXJ5KGdpYSkNCmBgYA0KDQojIyBYw6FjIMSR4buLbmggcGjDom4gcGjhu5FpIGNobyBjw6FjIGJp4bq/biDEkeG6p3UgdsOgbw0KDQojIyMgQmnhur9uIEFHUg0KDQoqICoqxJDhu5MgdGjhu4sqKg0KDQpgYGB7cn0NCmhpc3QoZ2lhJEFHUiwgbWFpbiA9ICJCSeG7glUgxJDhu5IgR0nDgSBD4buUIFBISeG6vlUgQUdSIix4bGFiID0gIkFHUiIsIHlsYWIgPSAiZnJlcXVlbmN5IHByaWNlIixjb2wgPSAiIzQ2ODJCNCIpDQpgYGANCg0KKiAqKktp4buDbSDEkeG7i25oIHBow6JuIHBo4buRaSBjaHXhuqluKioNCg0KJEhfMCQ6IEJp4bq/biBBR1IgY8OzIHBow6JuIHBo4buRaSBjaHXhuqluDQoNCiRIXzEkOiBCaeG6v24gQUdSIGtow7RuZyBjw7MgcGjDom4gcGjhu5FpIGNodeG6qW4NCg0KDQpgYGB7cn0NCnNoYXBpcm8udGVzdChnaWEkQUdSKQ0KYGBgDQoNClbhu5tpIHAtdmFsdWUgPCAwLjA1ICwgYsOhYyBi4buPICRIXzAkIG7Dqm4gZMOjeSBz4buRIGxp4buHdSBuw6B5IGtow7RuZyBjw7MgcGjDom4gcGjhu5FpIGNodeG6qW4NCg0KKiAqKktp4buDbSDEkeG7i25oIHBow6JuIHBo4buRaSBsb2dhIGNodeG6qW4qKg0KDQokSF8wJDogQmnhur9uIEFHUiBjw7MgcGjDom4gcGjhu5FpIGxvZ2EgY2h14bqpbg0KDQokSF8xJDogQmnhur9uIEFHUiBraMO0bmcgY8OzIHBow6JuIHBo4buRaSBsb2dhIGNodeG6qW4NCg0KYGBge3J9DQprcy50ZXN0KGdpYSRBR1IseT0icGxub3JtIikNCmBgYA0KDQpW4bubaSBwLXZhbHVlIDwgMC4wNSAsIGLDoWMgYuG7jyAkSF8wJCBuw6puIGTDo3kgc+G7kSBsaeG7h3UgbsOgeSBraMO0bmcgY8OzIHBow6JuIHBo4buRaSBsb2dhIGNodeG6qW4NCg0KKiAqKktp4buDbSDEkeG7i25oIHBow6JuIHBo4buRaSBtxakqKg0KDQokSF8wJDogQmnhur9uIEFHUiBjw7MgcGjDom4gcGjhu5FpIG3FqQ0KDQokSF8xJDogQmnhur9uIEFHUiBraMO0bmcgY8OzIHBow6JuIHBo4buRaSBtxakNCg0KYGBge3J9DQprcy50ZXN0KGdpYSRBR1IseT0icGV4cCIpDQpgYGANCg0KVuG7m2kgcC12YWx1ZSA8IDAuMDUgLCBiw6FjIGLhu48gJEhfMCQgbsOqbiBkw6N5IHPhu5EgbGnhu4d1IG7DoHkga2jDtG5nIGPDsyBwaMOibiBwaOG7kWkgbcWpDQoNCg0KIyMjIEJp4bq/biBBUEcNCg0KKiAqKsSQ4buTIHRo4buLKioNCg0KYGBge3J9DQpoaXN0KGdpYSRBUEcsIG1haW4gPSAiQknhu4JVIMSQ4buSIEdJw4EgQ+G7lCBQSEnhur5VIEFQRyIseGxhYiA9ICJBUEciLCB5bGFiID0gImZyZXF1ZW5jeSBwcmljZSIsY29sID0gIiM0NjgyQjQiKQ0KYGBgDQoNCiogKipLaeG7g20gxJHhu4tuaCBwaMOibiBwaOG7kWkgY2h14bqpbioqDQoNCiRIXzAkOiBCaeG6v24gQVBHIGPDsyBwaMOibiBwaOG7kWkgY2h14bqpbg0KDQokSF8xJDogQmnhur9uIEFQRyBraMO0bmcgY8OzIHBow6JuIHBo4buRaSBjaHXhuqluDQoNCg0KYGBge3J9DQpzaGFwaXJvLnRlc3QoZ2lhJEFQRykNCmBgYA0KDQpW4bubaSBwLXZhbHVlIDwgMC4wNSAsIGLDoWMgYuG7jyAkSF8wJCBuw6puIGTDo3kgc+G7kSBsaeG7h3UgbsOgeSBraMO0bmcgY8OzIHBow6JuIHBo4buRaSBjaHXhuqluDQoNCiogKipLaeG7g20gxJHhu4tuaCBwaMOibiBwaOG7kWkgbG9nYSBjaHXhuqluKioNCg0KJEhfMCQ6IEJp4bq/biBBUEcgY8OzIHBow6JuIHBo4buRaSBsb2dhIGNodeG6qW4NCg0KJEhfMSQ6IEJp4bq/biBBUEcga2jDtG5nIGPDsyBwaMOibiBwaOG7kWkgbG9nYSBjaHXhuqluDQoNCmBgYHtyfQ0Ka3MudGVzdChnaWEkQVBHLHk9InBsbm9ybSIpDQpgYGANCg0KVuG7m2kgcC12YWx1ZSA8IDAuMDUgLCBiw6FjIGLhu48gJEhfMCQgbsOqbiBkw6N5IHPhu5EgbGnhu4d1IG7DoHkga2jDtG5nIGPDsyBwaMOibiBwaOG7kWkgbG9nYSBjaHXhuqluDQoNCiogKipLaeG7g20gxJHhu4tuaCBwaMOibiBwaOG7kWkgbcWpKioNCg0KJEhfMCQ6IEJp4bq/biBBUEcgY8OzIHBow6JuIHBo4buRaSBtxakNCg0KJEhfMSQ6IEJp4bq/biBBUEcga2jDtG5nIGPDsyBwaMOibiBwaOG7kWkgbcWpDQoNCmBgYHtyfQ0Ka3MudGVzdChnaWEkQVBHLHk9InBleHAiKQ0KYGBgDQoNClbhu5tpIHAtdmFsdWUgPCAwLjA1ICwgYsOhYyBi4buPICRIXzAkIG7Dqm4gZMOjeSBz4buRIGxp4buHdSBuw6B5IGtow7RuZyBjw7MgcGjDom4gcGjhu5FpIG3FqQ0KDQojIyMgQmnhur9uIEJTSQ0KDQoqICoqxJDhu5MgdGjhu4sqKg0KDQpgYGB7cn0NCmhpc3QoZ2lhJEJTSSwgbWFpbiA9ICJCSeG7glUgxJDhu5IgR0nDgSBD4buUIFBISeG6vlUgQVBHIix4bGFiID0gIkJTSSIsIHlsYWIgPSAiZnJlcXVlbmN5IHByaWNlIixjb2wgPSAiIzQ2ODJCNCIpDQpgYGANCg0KKiAqKktp4buDbSDEkeG7i25oIHBow6JuIHBo4buRaSBjaHXhuqluKioNCg0KJEhfMCQ6IEJp4bq/biBCU0kgY8OzIHBow6JuIHBo4buRaSBjaHXhuqluDQoNCiRIXzEkOiBCaeG6v24gQlNJIGtow7RuZyBjw7MgcGjDom4gcGjhu5FpIGNodeG6qW4NCg0KDQpgYGB7cn0NCnNoYXBpcm8udGVzdChnaWEkQlNJKQ0KYGBgDQoNClbhu5tpIHAtdmFsdWUgPCAwLjA1ICwgYsOhYyBi4buPICRIXzAkIG7Dqm4gZMOjeSBz4buRIGxp4buHdSBuw6B5IGtow7RuZyBjw7MgcGjDom4gcGjhu5FpIGNodeG6qW4NCg0KKiAqKktp4buDbSDEkeG7i25oIHBow6JuIHBo4buRaSBsb2dhIGNodeG6qW4qKg0KDQokSF8wJDogQmnhur9uIEJTSSBjw7MgcGjDom4gcGjhu5FpIGxvZ2EgY2h14bqpbg0KDQokSF8xJDogQmnhur9uIEJTSSBraMO0bmcgY8OzIHBow6JuIHBo4buRaSBsb2dhIGNodeG6qW4NCg0KYGBge3J9DQprcy50ZXN0KGdpYSRCU0kseT0icGxub3JtIikNCmBgYA0KDQpW4bubaSBwLXZhbHVlIDwgMC4wNSAsIGLDoWMgYuG7jyAkSF8wJCBuw6puIGTDo3kgc+G7kSBsaeG7h3UgbsOgeSBraMO0bmcgY8OzIHBow6JuIHBo4buRaSBsb2dhIGNodeG6qW4NCg0KKiAqKktp4buDbSDEkeG7i25oIHBow6JuIHBo4buRaSBtxakqKg0KDQokSF8wJDogQmnhur9uIEJTSSBjw7MgcGjDom4gcGjhu5FpIG3FqQ0KDQokSF8xJDogQmnhur9uIEJTSSBraMO0bmcgY8OzIHBow6JuIHBo4buRaSBtxakNCg0KYGBge3J9DQprcy50ZXN0KGdpYSRCU0kseT0icGV4cCIpDQpgYGANCg0KVuG7m2kgcC12YWx1ZSA8IDAuMDUgLCBiw6FjIGLhu48gJEhfMCQgbsOqbiBkw6N5IHPhu5EgbGnhu4d1IG7DoHkga2jDtG5nIGPDsyBwaMOibiBwaOG7kWkgbcWpDQoNCiMjIyBCaeG6v24gQ1RTDQoNCiogKirEkOG7kyB0aOG7iyoqDQoNCmBgYHtyfQ0KaGlzdChnaWEkQ1RTLCBtYWluID0gIkJJ4buCVSDEkOG7kiBHScOBIEPhu5QgUEhJ4bq+VSBDVFMiLHhsYWIgPSAiQ1RTIiwgeWxhYiA9ICJmcmVxdWVuY3kgcHJpY2UiLGNvbCA9ICIjNDY4MkI0IikNCmBgYA0KDQoqICoqS2nhu4NtIMSR4buLbmggcGjDom4gcGjhu5FpIGNodeG6qW4qKg0KDQokSF8wJDogQmnhur9uIENUUyBjw7MgcGjDom4gcGjhu5FpIGNodeG6qW4NCg0KJEhfMSQ6IEJp4bq/biBDVFMga2jDtG5nIGPDsyBwaMOibiBwaOG7kWkgY2h14bqpbg0KDQoNCmBgYHtyfQ0Kc2hhcGlyby50ZXN0KGdpYSRDVFMpDQpgYGANCg0KVuG7m2kgcC12YWx1ZSA8IDAuMDUgLCBiw6FjIGLhu48gJEhfMCQgbsOqbiBkw6N5IHPhu5EgbGnhu4d1IG7DoHkga2jDtG5nIGPDsyBwaMOibiBwaOG7kWkgY2h14bqpbg0KDQoqICoqS2nhu4NtIMSR4buLbmggcGjDom4gcGjhu5FpIGxvZ2EgY2h14bqpbioqDQoNCiRIXzAkOiBCaeG6v24gQ1RTIGPDsyBwaMOibiBwaOG7kWkgbG9nYSBjaHXhuqluDQoNCiRIXzEkOiBCaeG6v24gQ1RTIGtow7RuZyBjw7MgcGjDom4gcGjhu5FpIGxvZ2EgY2h14bqpbg0KDQpgYGB7cn0NCmtzLnRlc3QoZ2lhJENUUyx5PSJwbG5vcm0iKQ0KYGBgDQoNClbhu5tpIHAtdmFsdWUgPCAwLjA1ICwgYsOhYyBi4buPICRIXzAkIG7Dqm4gZMOjeSBz4buRIGxp4buHdSBuw6B5IGtow7RuZyBjw7MgcGjDom4gcGjhu5FpIGxvZ2EgY2h14bqpbg0KDQoqICoqS2nhu4NtIMSR4buLbmggcGjDom4gcGjhu5FpIG3FqSoqDQoNCiRIXzAkOiBCaeG6v24gQ1RTIGPDsyBwaMOibiBwaOG7kWkgbcWpDQoNCiRIXzEkOiBCaeG6v24gQ1RTIGtow7RuZyBjw7MgcGjDom4gcGjhu5FpIG3FqQ0KDQpgYGB7cn0NCmtzLnRlc3QoZ2lhJENUUyx5PSJwZXhwIikNCmBgYA0KDQpW4bubaSBwLXZhbHVlIDwgMC4wNSAsIGLDoWMgYuG7jyAkSF8wJCBuw6puIGTDo3kgc+G7kSBsaeG7h3UgbsOgeSBraMO0bmcgY8OzIHBow6JuIHBo4buRaSBtxakNCg0KIyMjIEJp4bq/biBGVFMNCg0KKiAqKsSQ4buTIHRo4buLKioNCg0KYGBge3J9DQpoaXN0KGdpYSRGVFMsIG1haW4gPSAiQknhu4JVIMSQ4buSIEdJw4EgQ+G7lCBQSEnhur5VIEZUUyIseGxhYiA9ICJGVFMiLCB5bGFiID0gImZyZXF1ZW5jeSBwcmljZSIsY29sID0gIiM0NjgyQjQiKQ0KYGBgDQoNCiogKipLaeG7g20gxJHhu4tuaCBwaMOibiBwaOG7kWkgY2h14bqpbioqDQoNCiRIXzAkOiBCaeG6v24gRlRTIGPDsyBwaMOibiBwaOG7kWkgY2h14bqpbg0KDQokSF8xJDogQmnhur9uIEZUUyBraMO0bmcgY8OzIHBow6JuIHBo4buRaSBjaHXhuqluDQoNCg0KYGBge3J9DQpzaGFwaXJvLnRlc3QoZ2lhJEZUUykNCmBgYA0KDQpW4bubaSBwLXZhbHVlIDwgMC4wNSAsIGLDoWMgYuG7jyAkSF8wJCBuw6puIGTDo3kgc+G7kSBsaeG7h3UgbsOgeSBraMO0bmcgY8OzIHBow6JuIHBo4buRaSBjaHXhuqluDQoNCiogKipLaeG7g20gxJHhu4tuaCBwaMOibiBwaOG7kWkgbG9nYSBjaHXhuqluKioNCg0KJEhfMCQ6IEJp4bq/biBGVFMgY8OzIHBow6JuIHBo4buRaSBsb2dhIGNodeG6qW4NCg0KJEhfMSQ6IEJp4bq/biBGVFMga2jDtG5nIGPDsyBwaMOibiBwaOG7kWkgbG9nYSBjaHXhuqluDQoNCmBgYHtyfQ0Ka3MudGVzdChnaWEkRlRTLHk9InBsbm9ybSIpDQpgYGANCg0KVuG7m2kgcC12YWx1ZSA8IDAuMDUgLCBiw6FjIGLhu48gJEhfMCQgbsOqbiBkw6N5IHPhu5EgbGnhu4d1IG7DoHkga2jDtG5nIGPDsyBwaMOibiBwaOG7kWkgbG9nYSBjaHXhuqluDQoNCiogKipLaeG7g20gxJHhu4tuaCBwaMOibiBwaOG7kWkgbcWpKioNCg0KJEhfMCQ6IEJp4bq/biBGVFMgY8OzIHBow6JuIHBo4buRaSBtxakNCg0KJEhfMSQ6IEJp4bq/biBGVFMga2jDtG5nIGPDsyBwaMOibiBwaOG7kWkgbcWpDQoNCmBgYHtyfQ0Ka3MudGVzdChnaWEkRlRTLHk9InBleHAiKQ0KYGBgDQoNClbhu5tpIHAtdmFsdWUgPCAwLjA1ICwgYsOhYyBi4buPICRIXzAkIG7Dqm4gZMOjeSBz4buRIGxp4buHdSBuw6B5IGtow7RuZyBjw7MgcGjDom4gcGjhu5FpIG3FqQ0KDQojIyMgQmnhur9uIEhDTQ0KDQoqICoqxJDhu5MgdGjhu4sqKg0KDQpgYGB7cn0NCmhpc3QoZ2lhJEhDTSwgbWFpbiA9ICJCSeG7glUgxJDhu5IgR0nDgSBD4buUIFBISeG6vlUgSENNIix4bGFiID0gIkhDTSIsIHlsYWIgPSAiZnJlcXVlbmN5IHByaWNlIixjb2wgPSAiIzQ2ODJCNCIpDQpgYGANCg0KKiAqKktp4buDbSDEkeG7i25oIHBow6JuIHBo4buRaSBjaHXhuqluKioNCg0KJEhfMCQ6IEJp4bq/biBIQ00gY8OzIHBow6JuIHBo4buRaSBjaHXhuqluDQoNCiRIXzEkOiBCaeG6v24gSENNIGtow7RuZyBjw7MgcGjDom4gcGjhu5FpIGNodeG6qW4NCg0KDQpgYGB7cn0NCnNoYXBpcm8udGVzdChnaWEkSENNKQ0KYGBgDQoNClbhu5tpIHAtdmFsdWUgPCAwLjA1ICwgYsOhYyBi4buPICRIXzAkIG7Dqm4gZMOjeSBz4buRIGxp4buHdSBuw6B5IGtow7RuZyBjw7MgcGjDom4gcGjhu5FpIGNodeG6qW4NCg0KKiAqKktp4buDbSDEkeG7i25oIHBow6JuIHBo4buRaSBsb2dhIGNodeG6qW4qKg0KDQokSF8wJDogQmnhur9uIEhDTSBjw7MgcGjDom4gcGjhu5FpIGxvZ2EgY2h14bqpbg0KDQokSF8xJDogQmnhur9uIEhDTSBraMO0bmcgY8OzIHBow6JuIHBo4buRaSBsb2dhIGNodeG6qW4NCg0KYGBge3J9DQprcy50ZXN0KGdpYSRIQ00seT0icGxub3JtIikNCmBgYA0KDQpW4bubaSBwLXZhbHVlIDwgMC4wNSAsIGLDoWMgYuG7jyAkSF8wJCBuw6puIGTDo3kgc+G7kSBsaeG7h3UgbsOgeSBraMO0bmcgY8OzIHBow6JuIHBo4buRaSBsb2dhIGNodeG6qW4NCg0KKiAqKktp4buDbSDEkeG7i25oIHBow6JuIHBo4buRaSBtxakqKg0KDQokSF8wJDogQmnhur9uIEhDTSBjw7MgcGjDom4gcGjhu5FpIG3FqQ0KDQokSF8xJDogQmnhur9uIEhDTSBraMO0bmcgY8OzIHBow6JuIHBo4buRaSBtxakNCg0KYGBge3J9DQprcy50ZXN0KGdpYSRIQ00seT0icGV4cCIpDQpgYGANCg0KVuG7m2kgcC12YWx1ZSA8IDAuMDUgLCBiw6FjIGLhu48gJEhfMCQgbsOqbiBkw6N5IHPhu5EgbGnhu4d1IG7DoHkga2jDtG5nIGPDsyBwaMOibiBwaOG7kWkgbcWpDQoNCiMjIyBCaeG6v24gU1NJDQoNCiogKirEkOG7kyB0aOG7iyoqDQoNCmBgYHtyfQ0KaGlzdChnaWEkU1NJLCBtYWluID0gIkJJ4buCVSDEkOG7kiBHScOBIEPhu5QgUEhJ4bq+VSBTU0kiLHhsYWIgPSAiU1NJIiwgeWxhYiA9ICJmcmVxdWVuY3kgcHJpY2UiLGNvbCA9ICIjNDY4MkI0IikNCmBgYA0KDQoqICoqS2nhu4NtIMSR4buLbmggcGjDom4gcGjhu5FpIGNodeG6qW4qKg0KDQokSF8wJDogQmnhur9uIFNTSSBjw7MgcGjDom4gcGjhu5FpIGNodeG6qW4NCg0KJEhfMSQ6IEJp4bq/biBTU0kga2jDtG5nIGPDsyBwaMOibiBwaOG7kWkgY2h14bqpbg0KDQoNCmBgYHtyfQ0Kc2hhcGlyby50ZXN0KGdpYSRTU0kpDQpgYGANCg0KVuG7m2kgcC12YWx1ZSA8IDAuMDUgLCBiw6FjIGLhu48gJEhfMCQgbsOqbiBkw6N5IHPhu5EgbGnhu4d1IG7DoHkga2jDtG5nIGPDsyBwaMOibiBwaOG7kWkgY2h14bqpbg0KDQoqICoqS2nhu4NtIMSR4buLbmggcGjDom4gcGjhu5FpIGxvZ2EgY2h14bqpbioqDQoNCiRIXzAkOiBCaeG6v24gQlNJIGPDsyBwaMOibiBwaOG7kWkgbG9nYSBjaHXhuqluDQoNCiRIXzEkOiBCaeG6v24gQlNJIGtow7RuZyBjw7MgcGjDom4gcGjhu5FpIGxvZ2EgY2h14bqpbg0KDQpgYGB7cn0NCmtzLnRlc3QoZ2lhJFNTSSwgInBsbm9ybSIpDQpgYGANCg0KVuG7m2kgcC12YWx1ZSA8IDAuMDUgLCBiw6FjIGLhu48gJEhfMCQgbsOqbiBkw6N5IHPhu5EgbGnhu4d1IG7DoHkga2jDtG5nIGPDsyBwaMOibiBwaOG7kWkgbG9nYSBjaHXhuqluDQoNCiogKipLaeG7g20gxJHhu4tuaCBwaMOibiBwaOG7kWkgbcWpKioNCg0KJEhfMCQ6IEJp4bq/biBCU0kgY8OzIHBow6JuIHBo4buRaSBtxakNCg0KJEhfMSQ6IEJp4bq/biBCU0kga2jDtG5nIGPDsyBwaMOibiBwaOG7kWkgbcWpDQoNCmBgYHtyfQ0Ka3MudGVzdChnaWEkU1NJLHk9InBleHAiKQ0KYGBgDQoNClbhu5tpIHAtdmFsdWUgPCAwLjA1ICwgYsOhYyBi4buPICRIXzAkIG7Dqm4gZMOjeSBz4buRIGxp4buHdSBuw6B5IGtow7RuZyBjw7MgcGjDom4gcGjhu5FpIG3FqQ0KDQoNCiMjIFbhuq1uIGThu6VuZyBtw7QgaMOsbmggbWFya293aXR6DQoNCg0KYGBge3J9DQpsaWJyYXJ5KGZQb3J0Zm9saW8pIA0KI1F1eSDEkeG7i25oIGThu68gbGnhu4d1IGzDoCBjaHXhu5dpIHRo4budaSBnaWFuDQpnaWEgPC1hcy50aW1lU2VyaWVzKGdpYSkgDQojVMOtbmggY2h14buXaSBs4bujaSBuaHXhuq1uDQpsb2luaHVhbjwtaGVhZChnaWEsLTEpL3RhaWwoZ2lhLC0xKS0xIA0KZGF0YXRhYmxlKGxvaW5odWFuKQ0KYGBgDQoNCg0KDQoNCg0KKipNaW5oIGjhu41hIGJpw6puIGhp4buHdSBxdeG6oyoqDQoNCg0KYGBge3J9DQptb2hpbmggPSBwb3J0Zm9saW9TcGVjKCkNCmJpZW4gPC0gcG9ydGZvbGlvRnJvbnRpZXIobG9pbmh1YW4sIG1vaGluaCkNCmZyb250aWVyUGxvdChiaWVuLGNvbCA9IGMoJ2JsYWNrJywgJ2JsdWUnKSwgcGNoPTE5KQ0KI0dp4bqjIGzhuq1wIGPDoWMgZGFuaCBt4bulYyBraMOhYw0KbW9udGVDYXJsb1BvaW50cyhiaWVuLCBtY1N0ZXBzID0gMTAwMDAsIGNleCA9IDAuMjUscGNoID0gMTkpDQpgYGANCg0KKipEYW5oIG3hu6VjIGPDsyBwaMawxqFuZyBzYWkgbmjhu48gbmjhuqV0OioqDQoNCmBgYHtyfQ0KbWlucmlza1BvcnRmb2xpbyhsb2luaHVhbiwgbW9oaW5oKQ0KYGBgDQoNCiAqKkRhbmggbeG7pWMgY8OzIHBoxrDGoW5nIHNhaSBuaOG7jyBuaOG6pXQgdHJvbmcgY8OhYyBkYW5oIG3hu6VjIGPDsyBs4bujaSBuaHXhuq1uKioNCiANCmBgYHtyfQ0Kc2V0VGFyZ2V0UmV0dXJuKG1vaGluaCkgPC0gbWVhbihjb2xNZWFucyhsb2luaHVhbikpDQplZmZpY2llbnRQb3J0Zm9saW8obG9pbmh1YW4sIG1vaGluaCkNCg0KYGBgDQoNCg0KDQoqICoqVOG7tyB0cuG7jW5nIMSR4bqndSB0xrAgY+G7lSBwaGnhur91IHRyb25nIGRhbmggbeG7pWMgdOG7kWkgxrB1KioNCg0KLSBD4buVIHBoaeG6v3UgQUdSOiAwLjIxNDMgPT4gxJHhuqd1IHTGsDogMjE0IGPhu5UgcGhp4bq/dSANCg0KLSBD4buVIHBoaeG6v3UgQVBHOiAwLjAyNTggPT4gxJHhuqd1IHTGsDogMjYgY+G7lSBwaGnhur91DQoNCi0gQ+G7lSBwaGnhur91IEJTSTogMC4yNDc0ID0+IMSR4bqndSB0xrA6IDI0NyBj4buVIHBoaeG6v3UNCg0KLSBD4buVIHBoaeG6v3UgQ1RTOiAwLjAwMDAgPT4gxJHhuqd1IHTGsDogMCBj4buVIHBoaeG6v3UNCg0KLSBD4buVIHBoaeG6v3UgRlRTOiAwLjA4MzAgPT4gxJHhuqd1IHTGsDogODMgY+G7lSBwaGnhur91DQoNCi0gQ+G7lSBwaGnhur91IEhDTTogMC4xMjM4ID0+IMSR4bqndSB0xrA6IDEyNCBj4buVIHBoaeG6v3UNCg0KLSBD4buVIHBoaeG6v3UgU1NJOiAwLjMwNTcgPT4gxJHhuqd1IHTGsDogMzA2IGPhu5UgcGhp4bq/dQ0KDQoNCiMjIE3DtCBwaOG7j25nIGPDoWMgYmnhur9uIMSR4buZYyBs4bqtcA0KDQpLaGkgY8OhYyBiaeG6v24ga2jDtG5nIGPDsyB0aGVvIHBow6JuIHBo4buRaSBuw6BvIHbDoCB0YSBtdeG7kW4gbcO0IHBo4buPbmcgZOG7ryBsaeG7h3UgdGEgY8OzIHRo4buDIHRo4buxYyBoaeG7h24gY8OhYyBixrDhu5tjIHNhdSDEkcOieToNCg0KKiBD4bqvdCBk4buvIGxp4buHdTogdGEgc+G6vSBj4bqvdCBkw6N5IHPhu5EgbGnhu4d1IGJhbiDEkeG6p3UgdGjDoG5oIGPDoWMgxJFv4bqhbiBjw7MgY8O5bmcgxJHhu5kgcuG7mW5nIGhv4bq3YyBjw7MgY8O5bmcgc+G7kSBsxrDhu6NuZyBxdWFuIHPDoXQgdHJvbmcgbeG7l2kgxJFv4bqhbi4gDQoNCiogVOG6oW8gYuG6o25nIHThuqduIHN14bqldDogU2F1IGtoaSDEkcOjIGPhuq90IGThu68gbGnhu4d1IHRow6BuaCBjw6FjIMSRb+G6oW4sIHRhIHTDrW5oIHPhu5EgbMaw4bujbmcgcXVhbiBzw6F0IG7hurFtIHRyb25nIG3hu5dpIMSRb+G6oW4gxJHhu4MgdOG6oW8gYuG6o25nIHThuqduIHN14bqldC4NCg0KKiBNw7QgcGjhu49uZyBk4buvIGxp4buHdSB04burIGLhuqNuZyB04bqnbiBzdeG6pXQ6IEThu7FhIHRyw6puIGLhuqNuZyB04bqnbiBzdeG6pXQgxJHDoyB0w61uaCwgdGEgc+G6vSBtw7QgcGjhu49uZyBk4buvIGxp4buHdSBt4bubaSBi4bqxbmcgY8OhY2ggbOG6pXkgbmfhuqt1IG5oacOqbiBjw6FjIGdpw6EgdHLhu4sgdOG7qyBt4buXaSDEkW/huqFuIHbhu5tpIHjDoWMgc3XhuqV0IHBow7kgaOG7o3AuDQoNCiMjIyBNw7QgcGjhu49uZyBiaeG6v24gQUdSDQoNCiogKipD4bqvdCBk4buvIGxp4buHdSB2w6AgdOG6oW8gYuG6o25nIHThuqduIHN14bqldCoqDQoNCmBgYHtyfQ0KbGlicmFyeShkcGx5cikNCmEgPC0gMTANCmJyZWFrcyA8LSBxdWFudGlsZShnaWEkQUdSLCBwcm9icyA9IHNlcSgwLCAxLCBsZW5ndGgub3V0ID0gYSArIDEpLCB0eXBlID0gMSwgbmEucm0gPSBUUlVFKQ0KDQphZ3IgPC0gc2FwcGx5KDI6bGVuZ3RoKGJyZWFrcyksIGZ1bmN0aW9uKGkpIHNhbXBsZShnaWEkQUdSW2dpYSRBR1IgPj0gYnJlYWtzW2ktMV0gJiBnaWEkQUdSIDw9IGJyZWFrc1tpXV0sIDEwLCByZXBsYWNlID0gVFJVRSkpDQoNCg0KQSA8LSB0YWJsZShhZ3IpDQoNCkFBIDwtIGFzLmRhdGEuZnJhbWUoQSkgJT4lDQogIG11dGF0ZShUYW5zdWF0ID0gRnJlcSAvIHN1bShGcmVxKSkNCkFBDQoNCmBgYA0KDQoqICoqTcO0IHBo4buPbmcgdGhlbyBi4bqjbmcgdOG6p24gc3XhuqV0KioNCg0KYGBge3J9DQpwcm9iMSA8LSBBQSRUYW5zdWF0DQpBUjEgPC0gc2FtcGxlKEFBJGFnciwgMTAwMDAsIHJlcGxhY2UgPSBUUlVFLCBwcm9iID0gcHJvYjEpDQpBUjIgPC0gYXMuY2hhcmFjdGVyKEFSMSkNCmFyIDwtIGFzLm51bWVyaWMoQVIyKQ0KaGlzdChhcikNCmBgYA0KDQojIyMgTcO0IHBo4buPbmcgYmnhur9uIEFQUg0KDQoqICoqQ+G6r3QgZOG7ryBsaeG7h3UgdsOgIHThuqFvIGLhuqNuZyB04bqnbiBzdeG6pXQqKg0KDQpgYGB7cn0NCmxpYnJhcnkoZHBseXIpDQpiIDwtIDEwDQpicmVha3MgPC0gcXVhbnRpbGUoZ2lhJEFQRywgcHJvYnMgPSBzZXEoMCwgMSwgbGVuZ3RoLm91dCA9IGIgKyAxKSwgdHlwZSA9IDEsIG5hLnJtID0gVFJVRSkNCg0KYXByIDwtIHNhcHBseSgyOmxlbmd0aChicmVha3MpLCBmdW5jdGlvbihpKSBzYW1wbGUoZ2lhJEFQR1tnaWEkQVBHID49IGJyZWFrc1tpLTFdICYgZ2lhJEFQRyA8PSBicmVha3NbaV1dLCAxMCwgcmVwbGFjZSA9IFRSVUUpKQ0KDQoNCkIgPC0gdGFibGUoYXByKQ0KDQpCQiA8LSBhcy5kYXRhLmZyYW1lKEIpICU+JQ0KICBtdXRhdGUoVGFuc3VhdCA9IEZyZXEgLyBzdW0oRnJlcSkpDQpCQg0KDQpgYGANCg0KKiAqKk3DtCBwaOG7j25nIHRoZW8gYuG6o25nIHThuqduIHN14bqldCoqDQoNCmBgYHtyfQ0KcHJvYjIgPC0gQkIkVGFuc3VhdA0KQVAxIDwtIHNhbXBsZShCQiRhcHIsIDEwMDAwLCByZXBsYWNlID0gVFJVRSwgcHJvYiA9IHByb2IyKQ0KQVAyIDwtIGFzLmNoYXJhY3RlcihBUDEpDQphcCA8LSBhcy5udW1lcmljKEFQMikNCmhpc3QoYXApDQpgYGANCg0KIyMjIE3DtCBwaOG7j25nIGJp4bq/biBCU0kNCg0KKiAqKkPhuq90IGThu68gbGnhu4d1IHbDoCB04bqhbyBi4bqjbmcgdOG6p24gc3XhuqV0KioNCg0KYGBge3J9DQpsaWJyYXJ5KGRwbHlyKQ0KYyA8LSAxMA0KYnJlYWtzIDwtIHF1YW50aWxlKGdpYSRCU0ksIHByb2JzID0gc2VxKDAsIDEsIGxlbmd0aC5vdXQgPSBjICsgMSksIHR5cGUgPSAxLCBuYS5ybSA9IFRSVUUpDQoNCmJzaSA8LSBzYXBwbHkoMjpsZW5ndGgoYnJlYWtzKSwgZnVuY3Rpb24oaSkgc2FtcGxlKGdpYSRCU0lbZ2lhJEJTSSA+PSBicmVha3NbaS0xXSAmIGdpYSRCU0kgPD0gYnJlYWtzW2ldXSwgMTAsIHJlcGxhY2UgPSBUUlVFKSkNCg0KDQpDIDwtIHRhYmxlKGJzaSkNCg0KQ0MgPC0gYXMuZGF0YS5mcmFtZShDKSAlPiUNCiAgbXV0YXRlKFRhbnN1YXQgPSBGcmVxIC8gc3VtKEZyZXEpKQ0KQ0MNCg0KYGBgDQoNCiogKipNw7QgcGjhu49uZyB0aGVvIGLhuqNuZyB04bqnbiBzdeG6pXQqKg0KDQpgYGB7cn0NCnByb2IzIDwtIENDJFRhbnN1YXQNCkJTMSA8LSBzYW1wbGUoQ0MkYnNpLCAxMDAwMCwgcmVwbGFjZSA9IFRSVUUsIHByb2IgPSBwcm9iMykNCkJTMiA8LSBhcy5jaGFyYWN0ZXIoQlMxKQ0KYnMgPC0gYXMubnVtZXJpYyhCUzIpDQpoaXN0KGJzKQ0KYGBgDQoNCg0KIyMjIE3DtCBwaOG7j25nIGJp4bq/biBDVFMNCg0KKiAqKkPhuq90IGThu68gbGnhu4d1IHbDoCB04bqhbyBi4bqjbmcgdOG6p24gc3XhuqV0KioNCg0KYGBge3J9DQpsaWJyYXJ5KGRwbHlyKQ0KZCA8LSAxMA0KYnJlYWtzIDwtIHF1YW50aWxlKGdpYSRDVFMsIHByb2JzID0gc2VxKDAsIDEsIGxlbmd0aC5vdXQgPSBkICsgMSksIHR5cGUgPSAxLCBuYS5ybSA9IFRSVUUpDQoNCmN0cyA8LSBzYXBwbHkoMjpsZW5ndGgoYnJlYWtzKSwgZnVuY3Rpb24oaSkgc2FtcGxlKGdpYSRDVFNbZ2lhJENUUyA+PSBicmVha3NbaS0xXSAmIGdpYSRDVFMgPD0gYnJlYWtzW2ldXSwgMTAsIHJlcGxhY2UgPSBUUlVFKSkNCg0KDQpEIDwtIHRhYmxlKGN0cykNCg0KREQgPC0gYXMuZGF0YS5mcmFtZShEKSAlPiUNCiAgbXV0YXRlKFRhbnN1YXQgPSBGcmVxIC8gc3VtKEZyZXEpKQ0KREQNCg0KYGBgDQoNCiogKipNw7QgcGjhu49uZyB0aGVvIGLhuqNuZyB04bqnbiBzdeG6pXQqKg0KDQpgYGB7cn0NCnByb2I0IDwtIEREJFRhbnN1YXQNCkNUMSA8LSBzYW1wbGUoREQkY3RzLCAxMDAwMCwgcmVwbGFjZSA9IFRSVUUsIHByb2IgPSBwcm9iNCkNCkNUMiA8LSBhcy5jaGFyYWN0ZXIoQ1QxKQ0KY3QgPC0gYXMubnVtZXJpYyhDVDIpDQpoaXN0KGN0KQ0KYGBgDQoNCiMjIyBNw7QgcGjhu49uZyBiaeG6v24gRlRTDQoNCiogKipD4bqvdCBk4buvIGxp4buHdSB2w6AgdOG6oW8gYuG6o25nIHThuqduIHN14bqldCoqDQoNCmBgYHtyfQ0KbGlicmFyeShkcGx5cikNCmUgPC0gMTANCmJyZWFrcyA8LSBxdWFudGlsZShnaWEkRlRTLCBwcm9icyA9IHNlcSgwLCAxLCBsZW5ndGgub3V0ID0gZSArIDEpLCB0eXBlID0gMSwgbmEucm0gPSBUUlVFKQ0KDQpmdHMgPC0gc2FwcGx5KDI6bGVuZ3RoKGJyZWFrcyksIGZ1bmN0aW9uKGkpIHNhbXBsZShnaWEkRlRTW2dpYSRGVFMgPj0gYnJlYWtzW2ktMV0gJiBnaWEkRlRTIDw9IGJyZWFrc1tpXV0sIDEwLCByZXBsYWNlID0gVFJVRSkpDQoNCg0KRSA8LSB0YWJsZShmdHMpDQoNCkVFIDwtIGFzLmRhdGEuZnJhbWUoRSkgJT4lDQogIG11dGF0ZShUYW5zdWF0ID0gRnJlcSAvIHN1bShGcmVxKSkNCkVFDQoNCmBgYA0KDQoqICoqTcO0IHBo4buPbmcgdGhlbyBi4bqjbmcgdOG6p24gc3XhuqV0KioNCg0KYGBge3J9DQpwcm9iNSA8LSBFRSRUYW5zdWF0DQpGVDEgPC0gc2FtcGxlKEVFJGZ0cywgMTAwMDAsIHJlcGxhY2UgPSBUUlVFLCBwcm9iID0gcHJvYjUpDQpGVDIgPC0gYXMuY2hhcmFjdGVyKEZUMSkNCmZ0IDwtIGFzLm51bWVyaWMoRlQyKQ0KaGlzdChmdCkNCmBgYA0KDQoNCiMjIyBNw7QgcGjhu49uZyBiaeG6v24gSENNDQoNCiogKipD4bqvdCBk4buvIGxp4buHdSB2w6AgdOG6oW8gYuG6o25nIHThuqduIHN14bqldCoqDQoNCmBgYHtyfQ0KbGlicmFyeShkcGx5cikNCmggPC0gMTANCmJyZWFrcyA8LSBxdWFudGlsZShnaWEkSENNLCBwcm9icyA9IHNlcSgwLCAxLCBsZW5ndGgub3V0ID0gaCArIDEpLCB0eXBlID0gMSwgbmEucm0gPSBUUlVFKQ0KDQpoY20gPC0gc2FwcGx5KDI6bGVuZ3RoKGJyZWFrcyksIGZ1bmN0aW9uKGkpIHNhbXBsZShnaWEkSENNW2dpYSRIQ00gPj0gYnJlYWtzW2ktMV0gJiBnaWEkSENNIDw9IGJyZWFrc1tpXV0sIDEwLCByZXBsYWNlID0gVFJVRSkpDQoNCg0KSCA8LSB0YWJsZShoY20pDQoNCkhIIDwtIGFzLmRhdGEuZnJhbWUoSCkgJT4lDQogIG11dGF0ZShUYW5zdWF0ID0gRnJlcSAvIHN1bShGcmVxKSkNCkhIDQoNCmBgYA0KDQoqICoqTcO0IHBo4buPbmcgdGhlbyBi4bqjbmcgdOG6p24gc3XhuqV0KioNCg0KYGBge3J9DQpwcm9iNiA8LSBISCRUYW5zdWF0DQpIQzEgPC0gc2FtcGxlKEhIJGhjbSwgMTAwMDAsIHJlcGxhY2UgPSBUUlVFLCBwcm9iID0gcHJvYjYpDQpIQzIgPC0gYXMuY2hhcmFjdGVyKEhDMSkNCmhjIDwtIGFzLm51bWVyaWMoSEMyKQ0KaGlzdChoYykNCmBgYA0KDQoNCiMjIyBNw7QgcGjhu49uZyBiaeG6v24gU1NJDQoNCiogKipD4bqvdCBk4buvIGxp4buHdSB2w6AgdOG6oW8gYuG6o25nIHThuqduIHN14bqldCoqDQoNCmBgYHtyfQ0KbGlicmFyeShkcGx5cikNCnMgPC0gMTANCmJyZWFrcyA8LSBxdWFudGlsZShnaWEkU1NJLCBwcm9icyA9IHNlcSgwLCAxLCBsZW5ndGgub3V0ID0gcyArIDEpLCB0eXBlID0gMSwgbmEucm0gPSBUUlVFKQ0KDQpzc2kgPC0gc2FwcGx5KDI6bGVuZ3RoKGJyZWFrcyksIGZ1bmN0aW9uKGkpIHNhbXBsZShnaWEkU1NJW2dpYSRTU0kgPj0gYnJlYWtzW2ktMV0gJiBnaWEkSENNIDw9IGJyZWFrc1tpXV0sIDEwLCByZXBsYWNlID0gVFJVRSkpDQoNCg0KUyA8LSB0YWJsZShzc2kpDQoNClNTIDwtIGFzLmRhdGEuZnJhbWUoUykgJT4lDQogIG11dGF0ZShUYW5zdWF0ID0gRnJlcSAvIHN1bShGcmVxKSkNClNTDQoNCmBgYA0KDQoqICoqTcO0IHBo4buPbmcgdGhlbyBi4bqjbmcgdOG6p24gc3XhuqV0KioNCg0KYGBge3J9DQpwcm9iNyA8LSBTUyRUYW5zdWF0DQpTUzEgPC0gc2FtcGxlKFNTJHNzaSwgMTAwMDAsIHJlcGxhY2UgPSBUUlVFLCBwcm9iID0gcHJvYjcpDQpTUzIgPC0gYXMuY2hhcmFjdGVyKFNTMSkNCnNzIDwtIGFzLm51bWVyaWMoU1MyKQ0KaGlzdChzcykNCmBgYA0KDQoNCiMjIE3DtCBwaOG7j25nIGdpw6EgdHLhu4sgY+G7p2EgZGFuaCBt4bulYyB04buRaSDGsHUNCg0KLSBD4buVIHBoaeG6v3UgQUdSOiAwLjIxNDMgPT4gxJHhuqd1IHTGsDogMjE0IGPhu5UgcGhp4bq/dSANCg0KLSBD4buVIHBoaeG6v3UgQVBHOiAwLjAyNTggPT4gxJHhuqd1IHTGsDogMjYgY+G7lSBwaGnhur91DQoNCi0gQ+G7lSBwaGnhur91IEJTSTogMC4yNDc0ID0+IMSR4bqndSB0xrA6IDI0NyBj4buVIHBoaeG6v3UNCg0KLSBD4buVIHBoaeG6v3UgQ1RTOiAwLjAwMDAgPT4gxJHhuqd1IHTGsDogMCBj4buVIHBoaeG6v3UNCg0KLSBD4buVIHBoaeG6v3UgRlRTOiAwLjA4MzAgPT4gxJHhuqd1IHTGsDogODMgY+G7lSBwaGnhur91DQoNCi0gQ+G7lSBwaGnhur91IEhDTTogMC4xMjM4ID0+IMSR4bqndSB0xrA6IDEyNCBj4buVIHBoaeG6v3UNCg0KLSBD4buVIHBoaeG6v3UgU1NJOiAwLjMwNTcgPT4gxJHhuqd1IHTGsDogMzA2IGPhu5UgcGhp4bq/dQ0KDQoqICoqS+G6v3QgcXXhuqMgbcO0IGjDrG5oIMSR4buBIHh14bqldCoqDQoNCmBgYHtyfQ0KRE1EVCA8LSAyMTQqYXIgKyAyNiphcCArIDI0NypicyArIDAqY3QgKyA4MypmdCArIDEyNCpoYyArIDMwNipzcw0KYGBgDQoNCiogKipCaeG7g3UgxJHhu5MgaGlzdG9ncmFtIG3DtCBwaOG7j25nIG3DtCBow6xuaCoqDQoNCmBgYHtyfQ0KaGlzdChETURUKQ0KYGBgDQoNCiogKipCaeG7g3UgxJHhu5MqKg0KDQpgYGB7cn0NCnBsb3QoRE1EVCwgdHlwZSA9ICdsJywgY29sID0gJyM0NjgyQjQnLCBtYWluID0gIlThu5VuZyBnacOhIHRy4buLIGRhbmggbeG7pWMgxJHhuqd1IHTGsCA2IGPhu5UgcGhp4bq/dSB0cm9uZyBy4buVIFZOMzAiLCB5bGFiID0gIlZOxJAiLCB4bGFiID0gIk5nw6B5IikNCmBgYA0KDQoNCg0KYGBge3J9DQpzdW1tYXJ5KERNRFQpDQpgYGANCg0KU2F1IGtoaSBtw7QgcGjhu49uZyB04buVbmcgZ2nDoSB0cuG7iyBkYW5oIG3hu6VjIMSR4bqndSB0xrAgdOG7kWkgxrB1LCB0YSB0aOG6pXkgcuG6sW5nIHRyb25nIDEwMDAwIG5nw6B5IHThu5tpIHRydW5nIGLDrG5oIGdpw6EgdHLhu4sgZGFuaCBt4bulYyDEkeG6p3UgdMawIHThu5FpIMawdSBsw6AgMjIuNjQxLjMyOSDEkeG7k25nLCBs4bubbiBuaOG6pXQgbMOgIDM1LjQ4OS40NjAgxJHhu5NuZw0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQo=