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.2.2 Phương pháp nghiên cứu

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.

Một số giả thiết

Lý thuyết MPT (cũng tương như nhiều lý thuyết/mô hình ứng dụng trong kinh tế khác) chịu rất nhiều chỉ trích từ giới học thuật cũng như những người làm thực tiễn. Dưới đây là một số giả thiết quan trọng tiềm ẩn trong việc xây dựng mô hình – nguồn cơn của các phê phán.

  • Giả thuyết 1: Rủi ro được xác định bởi phương sai của danh mục.

Giả thiết này dựa trên giả định là tài sản biến động càng mạnh thì rủi ro càng cao. Tuy nhiên, phương sai là công cụ không tốt để đại diện cho rủi ro vì nó không phân biệt biến động tăng và giảm; một hệ quả vô lý là trường hợp tài sản tăng liên tục, mặc dù không có rủi ro khi đầu tư vào tài sản này nhưng phương sai thì vẫn dương. Để khắc phục nhược điểm này, một số mở rộng của mô hình MPT đã sử dụng các thước đo khác như nửa-phương sai, Value At Risk (VaR) hay Expected Shortfall (ES).

  • Giả thuyết 2: Bộ các biến lợi nhuận tuân theo phân phối chuẩn nhiều chiều (trường hợp mở rộng là phân phối elliptical).

Giả thiết này đảm bảo lý thuyết MPT thực sự là một “lý thuyết kinh tế”. Khi giả thiết này được thỏa mãn, danh mục hiệu quả được xây dựng từ lý thuyết MPT sẽ phù hợp với danh mục tối ưu được xây dựng từ lý thuyết tối đa hóa tiện ích (Maximizing Expected Utility); hơn nữa, khi đó giá trị danh mục được xác định hoàn toàn bởi kỳ vọng và phương sai, và phương sai cũng tương đương với VaR/ES. Tuy nhiên, các kết quả từ thực nghiệm cho thấy lợi nhuận của các cổ phiếu thường khác xa phân phối chuẩn: không đối xứng và có “đuôi dày”.

  • Giả thuyết 3: Chiến lược đầu tư chỉ gồm một chu kỳ.

Lý thuyết MPT chỉ áp dụng cho chiến lược đầu tư một chu kỳ (buy and hold). Tuy nhiên, trong thực tiễn các nhà đầu tư thường dùng những chiến lược nhiều chu kỳ; khi đó, một số các nhà đầu tư vẫn áp dụng mô hình MPT và “ngầm” đưa thêm một số giả thiết (không hợp lý) khác vào trong mô hình.

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:
##  Fri Aug 11 04:00:11 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:
##  Fri Aug 11 04:00:11 2023 by user: ASUS
LS0tDQp0aXRsZTogIlRJ4buCVSBMVeG6rE4gTcOUIFBI4buOTkcgTkfhuqpVIE5IScOKTiINCmF1dGhvcjogIk5HVVnhu4ROIFRIw5pZIE5Hw4JOIg0KZGF0ZTogIjIwMjMtMDgtMTAiDQpvdXRwdXQ6IA0KICBodG1sX2RvY3VtZW50Og0KICAgIGRmX3ByaW50OiBwYWdlZA0KICAgIHRoZW1lOiBjZXJ1bGVhbg0KICAgIHRvYzogdHJ1ZQ0KICAgIHRvY19mbG9hdDoNCiAgICAgIGNvbGxhcHNlZDogZmFsc2UNCiAgICAgIHNtb290aF9zY3JvbGw6IGZhbHNlDQogICAgbnVtYmVyX3NlY3Rpb25zOiB0cnVlDQogICAgY29kZV9mb2xkaW5nIDogaGlkZQ0KICAgIGNvZGVfZG93bmxvYWQ6IHRydWUNCi0tLQ0KPHN0eWxlPg0KYm9keSB7DQp0ZXh0LWFsaWduOiBqdXN0aWZ5fQ0KPC9zdHlsZT4NCg0KDQojIEzhu5xJIEPhuqJNIMagTg0KDQpM4budaSDEkeG6p3UgdGnDqm4sIGVtIHhpbiBn4butaSBs4budaSBj4bqjbSDGoW4gxJHhur9uIGPDoWMgdGjhuqd5IGPDtCBj4bunYSB0csaw4budbmcgxJDhuqFpIGjhu41jIFTDoGkgY2jDrW5oIOKAkyBNYXJrZXRpbmcsIMSR4bq3YyBiaeG7h3QgbMOgIGPDoWMgdGjhuqd5IGPDtCBi4buZIG3DtG4gS2hvYSBLaW5oIHThur8gLSBMdeG6rXQgxJHDoyB04bqtbiB0w6xuaCBnaeG6o25nIGThuqF5IHbDoCBjaOG7iSBk4bqrbiBlbSB0cm9uZyBxdcOhIHRyw6xuaCBo4buNYyB04bqtcCB24burYSBxdWEuIFbDoCBlbSB4aW4gY2jDom4gdGjDoG5oIGPhuqNtIMahbiB0aOG6p3kgVHLhuqduIE3huqFuaCBUxrDhu51uZyDEkcOjIGdpw7pwIMSR4buhLCBoxrDhu5tuZyBk4bqrbiBlbSBob8OgbiB0aMOgbmggYsOgaSB0aeG7g3UgbHXhuq1uIG3DtG4gTcO0IHBo4buPbmcgbmfhuqt1IG5oacOqbiBuw6B5IG3hu5l0IGPDoWNoIHThu5F0IG5o4bqldC4gRW0geGluIGNow7pjIHRo4bqneSBjw7QgY8OzIG5oaeG7gXUgc+G7qWMga2jhu49lLCBo4bqhbmggcGjDumMgdsOgIHRow6BuaCBjw7RuZyB0csOqbiBjb24gxJHGsOG7nW5nIHPhu7EgbmdoaeG7h3AgY+G7p2EgbcOsbmguDQoNClRyb25nIHF1w6EgdHLDrG5oIGhvw6BuIHRow6BuaCB0aeG7g3UgbHXhuq1uIGVtIGtow7MgdHLDoW5oIGto4buPaSBuaGnhu4F1IHRoaeG6v3Ugc8OzdCwgZW0gcuG6pXQgbW9uZyBuaOG6rW4gxJHGsOG7o2Mgbmjhu69uZyDDvSBraeG6v24gxJHDs25nIGfDs3AgdOG7qyB0aOG6p3kgY8O0LCB04burIMSRw7MgZ2nDunAgZW0gaG/DoG4gdGhp4buHbiwgaOG7jWMgaOG7j2kgdGjDqm0gxJHGsOG7o2Mgbmhp4buBdSBraW5oIG5naGnhu4dtIHbDoCBj4bunbmcgY+G7kSB0aMOqbSBraeG6v24gdGjhu6ljIGPhu6dhIG3DrG5oLiANCg0KTOG7nWkgY3Xhu5FpIGPDuW5nLCBlbSB4aW4ga8OtbmggY2jDumMgdGjhuqd5LCBjw7QgdGjhuq10IG5oaeG7gXUgc+G7qWMga2jhu49lLCDEkeG6oXQgxJHGsOG7o2Mgbmhp4buBdSB0aMOgbmggY8O0bmcgdsOgIHBow6F0IHRyaeG7g24uIA0KDQpFbSB4aW4gY2jDom4gdGjDoG5oIGPhuqNtIMahbiENCg0KDQojIENIxq/GoE5HIDE6IFBI4bqmTiBN4bueIMSQ4bqmVQ0KDQojIyBMw70gZG8gY2jhu41uIMSR4buBIHTDoGkNCg0KVHJvbmcgxJHhuqd1IHTGsCwgxJHhu4MgxJHGsGEgcmEgcXV54bq/dCDEkeG7i25oIMSR4bqndSB0xrAgdsOgbyBjw6FjIHTDoGkgc+G6o24sIGPDoWMgbmjDoCDEkeG6p3UgdMawIHRoxrDhu51uZyBxdWFuIHTDom0gxJHhur9uIGhhaSB54bq/dSB04buRIHF1YW4gdHLhu41uZzogbOG7o2kgbmh14bqtbiBk4buxIGtp4bq/biB0aHUgxJHGsOG7o2MgdsOgIG3hu6ljIMSR4buZIHLhu6dpIHJvLiBUaMO0bmcgdGjGsOG7nW5nLCBjw6FjIHTDoGkgc+G6o24gY8OzIGzhu6NpIG5odeG6rW4gY8OgbmcgY2FvIHRow6wgcuG7p2kgcm8gY8OgbmcgbOG7m24sIHbDoCBkxKkgbmhpw6puIGPDoWMgbmjDoCDEkeG6p3UgdMawIGx1w7RuIG114buRbiBo4bqhbiBjaOG6vyBjw6FjIHLhu6dpIHJvIOG6pXkuIOG7niBjw6FjIHF14buRYyBnaWEgY8OzIHRo4buLIHRyxrDhu51uZyBjaOG7qW5nIGtob8OhbiBwaMOhdCB0cmnhu4NuLCB04burIHLhuqV0IGzDonUgY8OhYyBuaMOgIMSR4bqndSB0xrAgxJHDoyBiaeG6v3Qgw6FwIGThu6VuZyBuZ3V5w6puIHThuq9jIOKAnGtow7RuZyDEkeG7gyB04bqldCBj4bqjIHRy4bupbmcgdsOgbyBjw7luZyBt4buZdCBnaeG7j+KAnSwgdGjDtG5nIHF1YSB2aeG7h2Mga+G6v3QgaOG7o3AgY8OhYyBsb+G6oWkgdMOgaSBz4bqjbiBraMOhYyBuaGF1IMSR4buDIGjhuqFuIGNo4bq/IHLhu6dpIHJvLiBEYW5oIG3hu6VjIMSR4bqndSB0xrAgY2jDrW5oIGzDoCBz4buxIGvhur90IGjhu6NwIG7huq9tIGdp4buvIGPDoWMgbG/huqFpIGNo4bupbmcga2hvw6FuLCBow6BuZyBow7NhLCBi4bqldCDEkeG7mW5nIHPhuqNuLCBjw6FjIGPDtG5nIGPhu6UgdMawxqFuZyDEkcawxqFuZyB0aeG7gW4gbeG6t3QgaGF5IGPDoWMgdMOgaSBz4bqjbiBraMOhYyBi4bufaSBt4buZdCBjw6EgbmjDom4gaGF5IG3hu5l0IHThu5UgY2jhu6ljIMSR4bqndSB0xrA7IG3hu6VjIMSRw61jaCBj4bunYSBkYW5oIG3hu6VjIMSR4bqndSB0xrAgbMOgIGzDoG0gZ2nhuqNtIHRoaeG7g3UgcuG7p2kgcm8gYuG6sW5nIHZp4buHYyDEkWEgZOG6oW5nIGjDs2EgxJHhuqd1IHTGsC4gDQoNCkLDoGkgdG/DoW4gdOG7kWkgxrB1IGRhbmggbeG7pWMgxJHhuqd1IHTGsCBsw6AgYsOgaSB0b8OhbiBjw7Mgw70gbmdoxKlhIHF1YW4gdHLhu41uZyB2w6Agbmjhuq1uIMSRxrDhu6NjIHPhu7EgcXVhbiB0w6JtIGPhu6dhIGPDoWMgbmjDoCDEkeG6p3UgdMawIHRyw6puIHRvw6BuIHRo4bq/IGdp4bubaS4gTMO9IHRodXnhur90IHThu5FpIMawdSBow7NhIGRhbmggbeG7pWMgxJHhuqd1IHTGsCDEkcaw4bujYyBraOG7n2kgbmd14buTbiB04burIG5o4buvbmcgbmdoacOqbiBj4bupdSDEkeG6p3UgdGnDqm4gY+G7p2EgSGFycnkgTWFya293aXR6IG7Eg20gMTk1Mi4gVOG7qyDEkcOzLCBy4bqldCBuaGnhu4F1IGPDoWMgbmdoacOqbiBj4bupdSB0aeG6v3AgdOG7pWMgxJHGsOG7o2MgxJHGsGEgcmEsIG5o4bqxbSBnaeG6o2kgcXV54bq/dCBoYWkgduG6pW4gxJHhu4EgY2jDrW5oOiBtw7QgaMOsbmggbeG7mXQgY8OhY2ggxJHhuqd5IMSR4bunIGLDoGkgdG/DoW4gbOG7sWEgY2jhu41uIGRhbmggbeG7pWMgxJHhuqd1IHTGsCB0cm9uZyB0aOG7sWMgdOG6vyB24bubaSBjw6FjIHLhu6dpIHJvIHbDoCBjw6FjIHLDoG5nIGJ14buZYzsgdMOtbmggaGnhu4d1IHF14bqjLCBj4bulIHRo4buDIGzDoCBraOG6oyBuxINuZyBnaeG6o2kgcXV54bq/dCBiw6BpIHRvw6FuIGPhu6EgbOG7m24sIGtoaSBz4buRIGzGsOG7o25nIHTDoGkgc+G6o24gdsOgIGvhu4tjaCBi4bqjbiDEkeG6p3UgdMawIGPhuqduIHhlbSB4w6l0IGzDoCBy4bqldCBuaGnhu4F1DQoNClbDrCB0aOG6vyBlbSBxdXnhur90IMSR4buLbmggY2jhu41uIMSR4buBIHTDoGkgKioiTcO0IHBo4buPbmcgZGFuaCBt4bulYyDEkeG6p3UgdMawIHThu5FpIMawdSBjaG8gbmjDs20gbmfDoG5oIGNo4bupbmcga2hvw6FuIioqLg0KDQojIyBN4bulYyB0acOqdSB2w6AgcGjGsMahbmcgcGjDoXAgbmdoacOqbiBj4bupdQ0KDQojIyMgTeG7pWMgdGnDqnUNCg0KTeG7pWMgdGnDqnUgxJHhuqd1IHRpw6puIHbDoCBxdWFuIHRy4buNbmcgbmjhuqV0IGPhu6dhIHZp4buHYyB04buRaSDGsHUgaMOzYSBkYW5oIG3hu6VjIMSR4bqndSB0xrAgbMOgIHThu5FpIMSRYSBow7NhIGzhu6NpIG5odeG6rW4gdHLDqm4gbeG7mXQgbeG7qWMgcuG7p2kgcm8gbmjhuqV0IMSR4buLbmguIMSQaeG7gXUgbsOgeSDEkcaw4bujYyB0aOG7gyBoaeG7h24gdGjDtG5nIHF1YSBiaeG7g3UgxJHhu5MgxJHGsOG7nW5nIGJpw6puIGhp4buHdSBxdeG6oy4gRGFuaCBt4bulYyDEkeG6p3UgdMawIHThu5F0IG5o4bqldCBz4bq9IGzDoCBkYW5oIG3hu6VjIG1hbmcgbOG6oWkgbOG7o2kgbmh14bqtbiBr4buzIHbhu41uZyBjYW8gbmjhuqV0IGNobyBt4buZdCBt4bupYyBy4bunaSBybyBob+G6t2MgY8OzIG3hu6ljIHLhu6dpIHJvIHRo4bqlcCBuaOG6pXQgY2hvIG3hu5l0IGtob+G6o24gbOG7o2kgbmh14bqtbiBj4buRIMSR4buLbmguIFbDrCB24bqteSBjw6FjIG5ow6AgxJHhuqd1IHTGsCB0aGVvIMSRdeG7lWkgcXXDoSB0csOsbmggdOG7kWkgxrB1IGjDs2EgZGFuaCBt4bulYyDEkeG6p3UgdMawIHRoxrDhu51uZyBjw7Mga2jhuqMgbsSDbmcgxJHhuqF0IMSRxrDhu6NjIGzhu6NpIG5odeG6rW4gY2FvIGNobyBjw6FjIG5ow6AgxJHhuqd1IHTGsC4NCg0KIyMjIFBoxrDGoW5nIHBow6FwIG5naGnDqm4gY+G7qXUNCg0KDQojIyDEkOG7kWkgdMaw4bujbmcgdsOgIHBo4bqhbSB2aSBuZ2hpw6puIGPhu6l1DQoNCkRhbmggbeG7pWMgxJHhuqd1IHTGsCBnacOhIGPhu5UgcGhp4bq/dSBj4bunYSBuaMOzbSBuZ8OgbmggY2jhu6luZyBraG/DoW4gYmFvIGfhu5NuIGPDoWMgbcOjOiBBR1IsIEFQRywgQlNJLCBDVFMsIEZUUywgSENNLCBTU0kuDQoNClRo4budaSBnaWFuIHRodSB0aOG6rXAgdOG7qyAxLzEvMjAyMiDEkeG6v24gMzEvNy8yMDIzDQoNCiMjIEvhur90IGPhuqV1IMSR4buBIHTDoGkgDQoNCk7hu5lpIGR1bmcgYsOgaSB0aeG7g3UgbHXhuq1uIGJhbyBn4buTbToNCg0KICogKkNoxrDGoW5nIDE6KiAgUGjhuqduIG3hu58gxJHhuqd1DQoNCiAqICpDaMawxqFuZyAyOiogIFThu5VuZyBxdWFuIGzDvSB0aHV54bq/dCANCg0KICogKkNoxrDGoW5nIDM6KiAgROG7ryBsaeG7h3UgbmdoacOqbiBj4bupdSB2w6AgbcO0IGjDrG5oIMSR4buBIHh14bqldA0KDQogKiAqQ2jGsMahbmcgNDoqICBL4bq/dCBxdeG6oyBuZ2hpw6puIGPhu6l1DQoNCiAqICpDaMawxqFuZyA1OiogIEvhur90IGx14bqtbiANCiANCg0KIyBDSMavxqBORyAyOiBU4buUTkcgUVVBTiBMw50gVEhVWeG6vlQNCg0KIyMgTMO9IHRodXnhur90IGRhbmggbeG7pWMgxJHhuqd1IHTGsCBoaeG7h24gxJHhuqFpIE1hcmtvd2l0eg0KDQpMw70gdGh1eeG6v3QgZGFuaCBt4bulYyDEkeG6p3UgdMawIGhp4buHbiDEkeG6oWkgKE1vZGVybiBwb3J0Zm9saW8gdGhlb3J5IC0gTVBUKSDEkcaw4bujYyBIYXJyeSBNYXJrb3dpdHogeMOieSBk4buxbmcgdsOgbyBuxINtIDE5NTIuIEzDvSB0aHV54bq/dCBNUFQgZ2nhuqNpIHF1eeG6v3QgduG6pW4gxJHhu4EgY8SDbiBi4bqjbiB0cm9uZyBsxKluaCB24buxYyBRdeG6o24gbMO9IGRhbmggbeG7pWMgxJHhuqd1IHTGsDogQ2hvIG3hu5l0IGRhbmggbeG7pWMgY8OhYyB0w6BpIHPhuqNuLCBj4bqnbiBwaOG6o2kgcGjDom4gYuG7lSBsw6BtIHNhbyDEkeG7gyDEkcaw4bujYyBt4buZdCBkYW5oIG3hu6VjIGzDoCB04buRaSDGsHUuIEzDvSB0aHV54bq/dCBuw6B5IHPhur0geGVtIHjDqXQgZGFuaCBt4bulYyBkxrDhu5tpIGhhaSBraMOtYSBj4bqhbmg6IGzhu6NpIG5odeG6rW4gdsOgIHLhu6dpIHJvICjEkcaw4bujYyDEkeG6oWkgZGnhu4duIGLhu59pIGdpw6EgdHLhu4sga+G7syB24buNbmcgdsOgIHBoxrDGoW5nIHNhaSBj4bunYSBkYW5oIG3hu6VjMikuIERhbmggbeG7pWMgxJHGsOG7o2MgeGVtIGzDoCBoaeG7h3UgcXXhuqMgaMahbiBu4bq/dSBjw7MgbOG7o2kgbmh14bqtbiBs4bubbiBoxqFuIHbDoCBy4bunaSBybyBuaOG7jyBoxqFuLg0KDQoqKkPGoSBz4bufIGzDvSB0aHV54bq/dCoqIA0KDQpHaeG6oyBz4butIGRhbmggbeG7pWMgZ+G7k20gY8OhYyB0w6BpIHPhuqNuIChjw7MgcuG7p2kgcm8pLiDhu6huZyB24bubaSBt4buZdCBi4buZIHRy4buNbmcgc+G7kSAoY8OybiBn4buNaSBsw6AgbeG7mXQgY2hp4bq/biBsxrDhu6NjIMSR4bqndSB0xrApIHRhIGPDsyBt4buZdCBj4bq3cCBnacOhIHRy4buLIChs4bujaSBuaHXhuq1uLCBy4bunaSBybyk7IGjDrG5oIGJp4buDdSBkaeG7hW4gY8OhYyBj4bq3cCBnacOhIHRy4buLIG7DoHkgbMOgIGjDrG5oIGzhu5NpIHbhu4EgYsOqbiB0csOhaToNCg0KYGBge3J9DQprbml0cjo6aW5jbHVkZV9ncmFwaGljcygiRDovTUFSS09XSVRaMS5wbmciKQ0KYGBgDQoNCg0KSMOsbmggdHLDqm4gbWluaCBo4buNYSBjaG8gdHLGsOG7nW5nIGjhu6NwIGRhbmggbeG7pWMgY8OzIDMgY+G7lSBwaGnhur91IEEsIEIsIEMuIFThuq1wIHThuqV0IGPhuqMgbmjhu69uZyDEkWnhu4NtIG7hurFtIHRyb25nIGjDrG5oIGzhu5NpIGfhu41pIGzDoCDEkWnhu4NtIGNo4bqlcCBuaOG6rW4gxJHGsOG7o2MgLSDhu6luZyB24bubaSBt4buZdCBkYW5oIG3hu6VjIMSRxrDhu6NjIHRow6BuaCBs4bqtcCB04burIDMgY+G7lSBwaGnhur91IEEsIEIsIEMuIMSQaeG7g20gUiDhu6luZyB24bubaSBkYW5oIG3hu6VjIGPDsyBy4bunaSBybyBuaOG7jyBuaOG6pXQuDQoNCiogQmnDqm4gaGnhu4d1IHF14bqjOiDEkMaw4budbmcgYmnDqm4gcGjDrWEgdHLDqm4gxJFp4buDbSBSIGPhu6dhIGjDrG5oIGzhu5NpIMSRxrDhu6NjIGfhu41pIGzDoCBiacOqbiBoaeG7h3UgcXXhuqMuIE3hu5dpIMSRaeG7g20gbuG6sW0gdHLDqm4gYmnDqm4gaGnhu4d1IHF14bqjIOG7qW5nIHbhu5tpIG3hu5l0IGRhbmggbeG7pWMgaGnhu4d1IHF14bqjLCBjaOG6s25nIGjhuqFuIGRhbmggbeG7pWMgUSAtIGtow7RuZyBjw7MgZGFuaCBt4bulYyBuw6BvIGzhu6NpIG5odeG6rW4gY2FvIGjGoW4gUSBtw6AgxJHhu5NuZyB0aOG7nWkgcuG7p2kgcm8gbmjhu48gaMahbiBRLg0KDQoqIEhp4buHdSDhu6luZyDEkWEgZOG6oW5nIGjDs2E6IEzDvSB0aHV54bq/dCBNUFQgY+G7lSBzw7p5IGNobyBjaGnhur9uIHRodeG6rXQgxJFhIGThuqFuZyBow7NhIHRyb25nIMSR4bqndSB0xrAgKGPDsm4gZ+G7jWkgbMOgIOKAnGtow7RuZyBuw6puIGLhu48gdOG6pXQgY+G6oyB0cuG7qW5nIHbDoG8gbeG7mXQgZ2nhu4/igJ0pLiBDaOG6s25nIGjhuqFuLCBi4bqxbmcgY8OhY2ggxJHhuqd1IHTGsCB2w6BvIGPhuqMgYmEgY+G7lSBwaGnhu4N1IEEsIEIsIEMgdGEgdGh1IMSRxrDhu6NjIGRhbmggbeG7pWMgUiBjw7MgcuG7p2kgcm8gbmjhu48gaMahbiBsw6AgxJHhuqd1IHTGsCB2w6BvIG3hu5l0IGPhu5UgcGhp4bq/dS4NCg0KKiBOZ3V5w6puIGzDvSDigJxObyBmcmVlIGx1bmNo4oCdOiBMw70gdGh1eeG6v3QgTVBUIGPFqW5nIGzDoCBt4buZdCBtaW5oIGjhu41hIHThu5F0IGNobyBraMOhaSBuaeG7h20g4oCcTm8gZnJlZSBsdW5jaOKAnSB0cm9uZyB0w6BpIGNow61uaC4gQ2jhurNuZyBo4bqhbiwgc28gduG7m2kgZGFuaCBt4bulYyBoaeG7h3UgcXXhuqMgUSwgdGEgY8OzIHRo4buDIHTDrG0gxJHGsOG7o2MgZGFuaCBt4bulYyBoaeG7h3UgcXXhuqMga2jDoWMgY8OzIHLhu6dpIHJvIHRo4bqlcCBoxqFuIG5oxrBuZyBs4bujaSBuaHXhuq1uIGzhuqFpIGdp4bqjbSDEkWk7IHbDoCBuZ8aw4bujYyBs4bqhaS4NCg0KKipN4buZdCBz4buRIGdp4bqjIHRoaeG6v3QqKg0KDQpMw70gdGh1eeG6v3QgTVBUIChjxaluZyB0xrDGoW5nIG5oxrAgbmhp4buBdSBsw70gdGh1eeG6v3QvbcO0IGjDrG5oIOG7qW5nIGThu6VuZyB0cm9uZyBraW5oIHThur8ga2jDoWMpIGNo4buLdSBy4bqldCBuaGnhu4F1IGNo4buJIHRyw61jaCB04burIGdp4bubaSBo4buNYyB0aHXhuq10IGPFqW5nIG5oxrAgbmjhu69uZyBuZ8aw4budaSBsw6BtIHRo4buxYyB0aeG7hW4uIETGsOG7m2kgxJHDonkgbMOgIG3hu5l0IHPhu5EgZ2nhuqMgdGhp4bq/dCBxdWFuIHRy4buNbmcgdGnhu4FtIOG6qW4gdHJvbmcgdmnhu4djIHjDonkgZOG7sW5nIG3DtCBow6xuaCDigJMgbmd14buTbiBjxqFuIGPhu6dhIGPDoWMgcGjDqiBwaMOhbi4NCg0KKiBHaeG6oyB0aHV54bq/dCAxOiBS4bunaSBybyDEkcaw4bujYyB4w6FjIMSR4buLbmggYuG7n2kgcGjGsMahbmcgc2FpIGPhu6dhIGRhbmggbeG7pWMuDQoNCkdp4bqjIHRoaeG6v3QgbsOgeSBk4buxYSB0csOqbiBnaeG6oyDEkeG7i25oIGzDoCB0w6BpIHPhuqNuIGJp4bq/biDEkeG7mW5nIGPDoG5nIG3huqFuaCB0aMOsIHLhu6dpIHJvIGPDoG5nIGNhby4gVHV5IG5oacOqbiwgcGjGsMahbmcgc2FpIGzDoCBjw7RuZyBj4bulIGtow7RuZyB04buRdCDEkeG7gyDEkeG6oWkgZGnhu4duIGNobyBy4bunaSBybyB2w6wgbsOzIGtow7RuZyBwaMOibiBiaeG7h3QgYmnhur9uIMSR4buZbmcgdMSDbmcgdsOgIGdp4bqjbTsgbeG7mXQgaOG7hyBxdeG6oyB2w7QgbMO9IGzDoCB0csaw4budbmcgaOG7o3AgdMOgaSBz4bqjbiB0xINuZyBsacOqbiB04bulYywgbeG6t2MgZMO5IGtow7RuZyBjw7MgcuG7p2kgcm8ga2hpIMSR4bqndSB0xrAgdsOgbyB0w6BpIHPhuqNuIG7DoHkgbmjGsG5nIHBoxrDGoW5nIHNhaSB0aMOsIHbhuqtuIGTGsMahbmcuIMSQ4buDIGto4bqvYyBwaOG7pWMgbmjGsOG7o2MgxJFp4buDbSBuw6B5LCBt4buZdCBz4buRIG3hu58gcuG7mW5nIGPhu6dhIG3DtCBow6xuaCBNUFQgxJHDoyBz4butIGThu6VuZyBjw6FjIHRoxrDhu5tjIMSRbyBraMOhYyBuaMawIG7hu61hLXBoxrDGoW5nIHNhaSwgVmFsdWUgQXQgUmlzayAoVmFSKSBoYXkgRXhwZWN0ZWQgU2hvcnRmYWxsIChFUykuDQoNCiogR2nhuqMgdGh1eeG6v3QgMjogQuG7mSBjw6FjIGJp4bq/biBs4bujaSBuaHXhuq1uIHR1w6JuIHRoZW8gcGjDom4gcGjhu5FpIGNodeG6qW4gbmhp4buBdSBjaGnhu4F1ICh0csaw4budbmcgaOG7o3AgbeG7nyBy4buZbmcgbMOgIHBow6JuIHBo4buRaSBlbGxpcHRpY2FsKS4NCg0KR2nhuqMgdGhp4bq/dCBuw6B5IMSR4bqjbSBi4bqjbyBsw70gdGh1eeG6v3QgTVBUIHRo4buxYyBz4buxIGzDoCBt4buZdCDigJxsw70gdGh1eeG6v3Qga2luaCB04bq/4oCdLiBLaGkgZ2nhuqMgdGhp4bq/dCBuw6B5IMSRxrDhu6NjIHRo4buPYSBtw6NuLCBkYW5oIG3hu6VjIGhp4buHdSBxdeG6oyDEkcaw4bujYyB4w6J5IGThu7FuZyB04burIGzDvSB0aHV54bq/dCBNUFQgc+G6vSBwaMO5IGjhu6NwIHbhu5tpIGRhbmggbeG7pWMgdOG7kWkgxrB1IMSRxrDhu6NjIHjDonkgZOG7sW5nIHThu6sgbMO9IHRodXnhur90IHThu5FpIMSRYSBow7NhIHRp4buHbiDDrWNoIChNYXhpbWl6aW5nIEV4cGVjdGVkIFV0aWxpdHkpOyBoxqFuIG7hu69hLCBraGkgxJHDsyBnacOhIHRy4buLIGRhbmggbeG7pWMgxJHGsOG7o2MgeMOhYyDEkeG7i25oIGhvw6BuIHRvw6BuIGLhu59pIGvhu7MgduG7jW5nIHbDoCBwaMawxqFuZyBzYWksIHbDoCBwaMawxqFuZyBzYWkgY8WpbmcgdMawxqFuZyDEkcawxqFuZyB24bubaSBWYVIvRVMuIFR1eSBuaGnDqm4sIGPDoWMga+G6v3QgcXXhuqMgdOG7qyB0aOG7sWMgbmdoaeG7h20gY2hvIHRo4bqleSBs4bujaSBuaHXhuq1uIGPhu6dhIGPDoWMgY+G7lSBwaGnhur91IHRoxrDhu51uZyBraMOhYyB4YSBwaMOibiBwaOG7kWkgY2h14bqpbjoga2jDtG5nIMSR4buRaSB44bupbmcgdsOgIGPDsyDigJzEkXXDtGkgZMOgeeKAnS4NCg0KKiBHaeG6oyB0aHV54bq/dCAzOiBDaGnhur9uIGzGsOG7o2MgxJHhuqd1IHTGsCBjaOG7iSBn4buTbSBt4buZdCBjaHUga+G7sy4NCg0KTMO9IHRodXnhur90IE1QVCBjaOG7iSDDoXAgZOG7pW5nIGNobyBjaGnhur9uIGzGsOG7o2MgxJHhuqd1IHTGsCBt4buZdCBjaHUga+G7syAoYnV5IGFuZCBob2xkKS4gVHV5IG5oacOqbiwgdHJvbmcgdGjhu7FjIHRp4buFbiBjw6FjIG5ow6AgxJHhuqd1IHTGsCB0aMaw4budbmcgZMO5bmcgbmjhu69uZyBjaGnhur9uIGzGsOG7o2Mgbmhp4buBdSBjaHUga+G7szsga2hpIMSRw7MsIG3hu5l0IHPhu5EgY8OhYyBuaMOgIMSR4bqndSB0xrAgduG6q24gw6FwIGThu6VuZyBtw7QgaMOsbmggTVBUDQp2w6Ag4oCcbmfhuqdt4oCdIMSRxrBhIHRow6ptIG3hu5l0IHPhu5EgZ2nhuqMgdGhp4bq/dCAoa2jDtG5nIGjhu6NwIGzDvSkga2jDoWMgdsOgbyB0cm9uZyBtw7QgaMOsbmguDQoNCg0KDQojIENIxq/GoE5HIDM6IEThu64gTEnhu4ZVIE5HSEnDik4gQ+G7qFUgVsOAIE3DlCBIw4xOSCDEkOG7gCBYVeG6pFQNCg0KIyMgROG7ryBsaeG7h3UgbmdoacOqbiBj4bupdQ0KDQoNCmBgYHtyfQ0KbGlicmFyeShyZWFkeGwpDQpsaWJyYXJ5KERUKQ0KZ2lhIDwtIHJlYWRfZXhjZWwoIkQ6L2RhdGFDSy54bHN4IikNCmdpYQ0KYGBgDQoNCg0KIyMgTcO0IHThuqMgZOG7ryBsaeG7h3UgbmdoacOqbiBj4bupdQ0KDQpC4buZIGThu68gbGnhu4d1IGJhbyBn4buTbSAzOTEgcXVhbiBzw6F0IHbDoCA3IGJp4bq/bi4gROG7ryBsaeG7h3UgxJHGsOG7o2MgdGh1IHRo4bqtcCB04burIG5nw6B5IDEvMS8yMDIyIMSR4bq/biAzMS83LzIwMjMuDQoNCsSQxqFuIHbhu4s6IG5nw6BuIMSR4buTbmcgDQoNCiogQmnhur9uIEFHUjogbMOgIG3DoyBjaOG7qW5nIGtob8OhbiBj4bunYSBDw7RuZyB0eSBD4buVIHBo4bqnbiBDaOG7qW5nIGtob8OhbiBBZ3JpYmFuayANCg0KKiBCaeG6v24gQVBHOiBsw6AgbcOjIGNo4bupbmcga2hvw6FuIGPhu6dhIEPDtG5nIHR5IEPhu5UgcGjhuqduIENo4bupbmcga2hvw6FuIEFQRw0KDQoqIEJp4bq/biBCU0k6IGzDoCBtw6MgY2jhu6luZyBraG/DoW4gY+G7p2EgQ8O0bmcgdHkgQ+G7lSBwaOG6p24gQ2jhu6luZyBraG/DoW4gTmfDom4gaMOgbmcgxJDhuqd1IHTGsCB2w6AgUGjDoXQgdHJp4buDbiBWaeG7h3QgTmFtDQoNCiogQmnhur9uIENUUzogbMOgIG3DoyBjaOG7qW5nIGtob8OhbiBj4bunYSBDw7RuZyB0eSBD4buVIHBo4bqnbiBDaOG7qW5nIGtob8OhbiBOZ8OibiBow6BuZyBDw7RuZyB0aMawxqFuZyBWaeG7h3QgTmFtDQoNCiogQmnhur9uIEZUUzogbMOgIG3DoyBjaOG7qW5nIGtob8OhbiBj4bunYSBDw7RuZyB0eSBD4buVIHBo4bqnbiBDaOG7qW5nIGtob8OhbiBGUFQNCg0KKiBCaeG6v24gSENNOiBsw6AgbcOjIGNo4bupbmcga2hvw6FuIGPhu6dhIEPDtG5nIHR5IEPhu5UgcGjhuqduIENo4bupbmcga2hvw6FuIFRow6BuaCBQaOG7kSBI4buTIENow60gTWluaA0KDQoqIEJp4bq/biBTU0k6IGzDoCBtw6MgY2jhu6luZyBraG/DoW4gY+G7p2EgQ8O0bmcgdHkgQ+G7lSBwaOG6p24gQ2jhu6luZyBraG/DoW4gU1NJIA0KDQojIyBCaeG7g3UgxJHhu5MgdMOsbmggaMOsbmggYmnhur9uIMSR4buZbmcgZ2nDoSBj4bunYSBjw6FjIGPhu5UgcGhp4bq/dQ0KDQpCaeG7g3UgxJHhu5MgdMOsbmggaMOsbmggYmnhur9uIMSR4buZbmcgZ2nDoSBj4bunYSBjw6FjIGPhu5UgcGhp4bq/dSBuaMOzbSBuZ8OgbmggY2jhu6luZyBraG/DoW4NCg0KYGBge3J9DQpsaWJyYXJ5KGdncGxvdDIpDQpnZ3Bsb3QoZ2lhKSArDQogIGdlb21fbGluZShhZXMoeCA9IGdpYSROZ8OgeSwgeSA9IGdpYSRBR1IsIGNvbG9yID0gIkFHUiIpKSArDQogIGdlb21fbGluZShhZXMoeCA9IGdpYSROZ8OgeSwgeSA9IGdpYSRBUEcsIGNvbG9yID0gIkFQRyIpKSArDQogIGdlb21fbGluZShhZXMoeCA9IGdpYSROZ8OgeSwgeSA9IGdpYSRCU0ksIGNvbG9yID0gIkJTSSIpKSArDQogIGdlb21fbGluZShhZXMoeCA9IGdpYSROZ8OgeSwgeSA9IGdpYSRDVFMsIGNvbG9yID0gIkNUUyIpKSArDQogIGdlb21fbGluZShhZXMoeCA9IGdpYSROZ8OgeSwgeSA9IGdpYSRGVFMsIGNvbG9yID0gIkZUUyIpKSArDQogIGdlb21fbGluZShhZXMoeCA9IGdpYSROZ8OgeSwgeSA9IGdpYSRIQ00sIGNvbG9yID0gIkhDTSIpKSArDQogIGdlb21fbGluZShhZXMoeCA9IGdpYSROZ8OgeSwgeSA9IGdpYSRTU0ksIGNvbG9yID0gIlNTSSIpKSArDQogIGxhYnMoeCA9ICJUaW1lIiwgeSA9ICJwcmljZSIsIHRpdGxlID0gInN0b2NrIHByaWNlIiwgY29sb3IgPSAic3RvY2sgcHJpY2UiKSArDQogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjKCJBR1IiID0gImRlZXBza3libHVlNCIsICJBUEciID0gImJyb3duIiwgIkJTSSIgPSAiZGFya3NlYWdyZWVuIiwgIkNUUyIgPSAiZ29sZGVucm9kNCIsICJGVFMiID0gImN5YW4iLCAiSENNIiA9ICJwaW5rIiwgIlNTSSIgPSAiZGFya2dyZWVuIikpDQpgYGANCg0KDQoNCiMjIE3DtCBow6xuaCDEkeG7gSB4deG6pXQNCg0KxJDhu4MgbcO0IHBo4buPbmcgxJHGsOG7o2MgZ2nDoSB0cuG7iyBj4bunYSBkYW5oIG3hu6VjIHThu5FpIMawdSDEkeG6p3UgdMawIDcgY+G7lSBwaGnhur91IGzhu5tuIHRodeG7mWMgbmjDs20gbmfDoG5oIGNo4bupbmcga2hvw6FuLCBlbSB4aW4gxJHhu4EgeHXhuqV0IG3DtCBow6xuaCBuaMawIHNhdTogDQoNCiRETURUID0gRV97MX1BR1IrRV97Mn1BUEcrRV97M31CU0krRV97NH1DVFMrRV97NX1GVFMrRV97Nn1IQ00rRV97N31TU0kkDQoNCg0KDQpUcm9uZyDEkcOzOiAkRV97MX0sRV97Mn0sRV97M30sRV97NH0sRV97NX0sRV97Nn0sRV97N30kIGzDoCB04bu3IHRy4buNbmcgZGFuaCBt4bulYyDEkeG6p3UgdMawIHThu5FpIMawdQ0KDQoqICoqQmnhur9uIHBo4bulIHRodeG7mWM6KioNCkRNRFQ6IEdpw6EgdHLhu4sgZGFuaCBt4bulYyDEkeG6p3UgdMawIHThu5FpIMawdSBj4bunYSA3IGPhu5UgcGhp4bq/dSBuaMOzbSBuZ8OgbmggY2jhu6luZyBraG/DoW4gDQoNCiogKipCaeG6v24gxJHhu5ljIGzhuq1wOioqIGPhu5UgcGhp4bq/dSBBR1IsIEFQRywgQlNJLCBDVFMsIEZUUywgSENNLCBTU0kuDQoNCg0KDQojIENIxq/GoE5HIDQ6IEvhur5UIFFV4bqiIE5HSEnDik4gQ+G7qFUNCg0KIyMgVGjhu5FuZyBrw6ogbcO0IHThuqMgZOG7ryBsaeG7h3UgDQoNCmBgYHtyfQ0Kc3VtbWFyeShnaWEpDQpgYGANCg0KIyMgWMOhYyDEkeG7i25oIHBow6JuIHBo4buRaSBjaG8gY8OhYyBiaeG6v24gxJHhuqd1IHbDoG8NCg0KIyMjIEJp4bq/biBBR1INCg0KKiAqKsSQ4buTIHRo4buLKioNCg0KYGBge3J9DQpoaXN0KGdpYSRBR1IsIG1haW4gPSAiQknhu4JVIMSQ4buSIEdJw4EgQ+G7lCBQSEnhur5VIEFHUiIseGxhYiA9ICJBR1IiLCB5bGFiID0gImZyZXF1ZW5jeSBwcmljZSIsY29sID0gIiM0NjgyQjQiKQ0KYGBgDQoNCiogKipLaeG7g20gxJHhu4tuaCBwaMOibiBwaOG7kWkgY2h14bqpbioqDQoNCiRIXzAkOiBCaeG6v24gQUdSIGPDsyBwaMOibiBwaOG7kWkgY2h14bqpbg0KDQokSF8xJDogQmnhur9uIEFHUiBraMO0bmcgY8OzIHBow6JuIHBo4buRaSBjaHXhuqluDQoNCg0KYGBge3J9DQpzaGFwaXJvLnRlc3QoZ2lhJEFHUikNCmBgYA0KDQpW4bubaSBwLXZhbHVlIDwgMC4wNSAsIGLDoWMgYuG7jyAkSF8wJCBuw6puIGTDo3kgc+G7kSBsaeG7h3UgbsOgeSBraMO0bmcgY8OzIHBow6JuIHBo4buRaSBjaHXhuqluDQoNCiogKipLaeG7g20gxJHhu4tuaCBwaMOibiBwaOG7kWkgbG9nYSBjaHXhuqluKioNCg0KJEhfMCQ6IEJp4bq/biBBR1IgY8OzIHBow6JuIHBo4buRaSBsb2dhIGNodeG6qW4NCg0KJEhfMSQ6IEJp4bq/biBBR1Iga2jDtG5nIGPDsyBwaMOibiBwaOG7kWkgbG9nYSBjaHXhuqluDQoNCmBgYHtyfQ0Ka3MudGVzdChnaWEkQUdSLHk9InBsbm9ybSIpDQpgYGANCg0KVuG7m2kgcC12YWx1ZSA8IDAuMDUgLCBiw6FjIGLhu48gJEhfMCQgbsOqbiBkw6N5IHPhu5EgbGnhu4d1IG7DoHkga2jDtG5nIGPDsyBwaMOibiBwaOG7kWkgbG9nYSBjaHXhuqluDQoNCiogKipLaeG7g20gxJHhu4tuaCBwaMOibiBwaOG7kWkgbcWpKioNCg0KJEhfMCQ6IEJp4bq/biBBR1IgY8OzIHBow6JuIHBo4buRaSBtxakNCg0KJEhfMSQ6IEJp4bq/biBBR1Iga2jDtG5nIGPDsyBwaMOibiBwaOG7kWkgbcWpDQoNCmBgYHtyfQ0Ka3MudGVzdChnaWEkQUdSLHk9InBleHAiKQ0KYGBgDQoNClbhu5tpIHAtdmFsdWUgPCAwLjA1ICwgYsOhYyBi4buPICRIXzAkIG7Dqm4gZMOjeSBz4buRIGxp4buHdSBuw6B5IGtow7RuZyBjw7MgcGjDom4gcGjhu5FpIG3FqQ0KDQoNCiMjIyBCaeG6v24gQVBHDQoNCiogKirEkOG7kyB0aOG7iyoqDQoNCmBgYHtyfQ0KaGlzdChnaWEkQVBHLCBtYWluID0gIkJJ4buCVSDEkOG7kiBHScOBIEPhu5QgUEhJ4bq+VSBBUEciLHhsYWIgPSAiQVBHIiwgeWxhYiA9ICJmcmVxdWVuY3kgcHJpY2UiLGNvbCA9ICIjNDY4MkI0IikNCmBgYA0KDQoqICoqS2nhu4NtIMSR4buLbmggcGjDom4gcGjhu5FpIGNodeG6qW4qKg0KDQokSF8wJDogQmnhur9uIEFQRyBjw7MgcGjDom4gcGjhu5FpIGNodeG6qW4NCg0KJEhfMSQ6IEJp4bq/biBBUEcga2jDtG5nIGPDsyBwaMOibiBwaOG7kWkgY2h14bqpbg0KDQoNCmBgYHtyfQ0Kc2hhcGlyby50ZXN0KGdpYSRBUEcpDQpgYGANCg0KVuG7m2kgcC12YWx1ZSA8IDAuMDUgLCBiw6FjIGLhu48gJEhfMCQgbsOqbiBkw6N5IHPhu5EgbGnhu4d1IG7DoHkga2jDtG5nIGPDsyBwaMOibiBwaOG7kWkgY2h14bqpbg0KDQoqICoqS2nhu4NtIMSR4buLbmggcGjDom4gcGjhu5FpIGxvZ2EgY2h14bqpbioqDQoNCiRIXzAkOiBCaeG6v24gQVBHIGPDsyBwaMOibiBwaOG7kWkgbG9nYSBjaHXhuqluDQoNCiRIXzEkOiBCaeG6v24gQVBHIGtow7RuZyBjw7MgcGjDom4gcGjhu5FpIGxvZ2EgY2h14bqpbg0KDQpgYGB7cn0NCmtzLnRlc3QoZ2lhJEFQRyx5PSJwbG5vcm0iKQ0KYGBgDQoNClbhu5tpIHAtdmFsdWUgPCAwLjA1ICwgYsOhYyBi4buPICRIXzAkIG7Dqm4gZMOjeSBz4buRIGxp4buHdSBuw6B5IGtow7RuZyBjw7MgcGjDom4gcGjhu5FpIGxvZ2EgY2h14bqpbg0KDQoqICoqS2nhu4NtIMSR4buLbmggcGjDom4gcGjhu5FpIG3FqSoqDQoNCiRIXzAkOiBCaeG6v24gQVBHIGPDsyBwaMOibiBwaOG7kWkgbcWpDQoNCiRIXzEkOiBCaeG6v24gQVBHIGtow7RuZyBjw7MgcGjDom4gcGjhu5FpIG3FqQ0KDQpgYGB7cn0NCmtzLnRlc3QoZ2lhJEFQRyx5PSJwZXhwIikNCmBgYA0KDQpW4bubaSBwLXZhbHVlIDwgMC4wNSAsIGLDoWMgYuG7jyAkSF8wJCBuw6puIGTDo3kgc+G7kSBsaeG7h3UgbsOgeSBraMO0bmcgY8OzIHBow6JuIHBo4buRaSBtxakNCg0KIyMjIEJp4bq/biBCU0kNCg0KKiAqKsSQ4buTIHRo4buLKioNCg0KYGBge3J9DQpoaXN0KGdpYSRCU0ksIG1haW4gPSAiQknhu4JVIMSQ4buSIEdJw4EgQ+G7lCBQSEnhur5VIEFQRyIseGxhYiA9ICJCU0kiLCB5bGFiID0gImZyZXF1ZW5jeSBwcmljZSIsY29sID0gIiM0NjgyQjQiKQ0KYGBgDQoNCiogKipLaeG7g20gxJHhu4tuaCBwaMOibiBwaOG7kWkgY2h14bqpbioqDQoNCiRIXzAkOiBCaeG6v24gQlNJIGPDsyBwaMOibiBwaOG7kWkgY2h14bqpbg0KDQokSF8xJDogQmnhur9uIEJTSSBraMO0bmcgY8OzIHBow6JuIHBo4buRaSBjaHXhuqluDQoNCg0KYGBge3J9DQpzaGFwaXJvLnRlc3QoZ2lhJEJTSSkNCmBgYA0KDQpW4bubaSBwLXZhbHVlIDwgMC4wNSAsIGLDoWMgYuG7jyAkSF8wJCBuw6puIGTDo3kgc+G7kSBsaeG7h3UgbsOgeSBraMO0bmcgY8OzIHBow6JuIHBo4buRaSBjaHXhuqluDQoNCiogKipLaeG7g20gxJHhu4tuaCBwaMOibiBwaOG7kWkgbG9nYSBjaHXhuqluKioNCg0KJEhfMCQ6IEJp4bq/biBCU0kgY8OzIHBow6JuIHBo4buRaSBsb2dhIGNodeG6qW4NCg0KJEhfMSQ6IEJp4bq/biBCU0kga2jDtG5nIGPDsyBwaMOibiBwaOG7kWkgbG9nYSBjaHXhuqluDQoNCmBgYHtyfQ0Ka3MudGVzdChnaWEkQlNJLHk9InBsbm9ybSIpDQpgYGANCg0KVuG7m2kgcC12YWx1ZSA8IDAuMDUgLCBiw6FjIGLhu48gJEhfMCQgbsOqbiBkw6N5IHPhu5EgbGnhu4d1IG7DoHkga2jDtG5nIGPDsyBwaMOibiBwaOG7kWkgbG9nYSBjaHXhuqluDQoNCiogKipLaeG7g20gxJHhu4tuaCBwaMOibiBwaOG7kWkgbcWpKioNCg0KJEhfMCQ6IEJp4bq/biBCU0kgY8OzIHBow6JuIHBo4buRaSBtxakNCg0KJEhfMSQ6IEJp4bq/biBCU0kga2jDtG5nIGPDsyBwaMOibiBwaOG7kWkgbcWpDQoNCmBgYHtyfQ0Ka3MudGVzdChnaWEkQlNJLHk9InBleHAiKQ0KYGBgDQoNClbhu5tpIHAtdmFsdWUgPCAwLjA1ICwgYsOhYyBi4buPICRIXzAkIG7Dqm4gZMOjeSBz4buRIGxp4buHdSBuw6B5IGtow7RuZyBjw7MgcGjDom4gcGjhu5FpIG3FqQ0KDQojIyMgQmnhur9uIENUUw0KDQoqICoqxJDhu5MgdGjhu4sqKg0KDQpgYGB7cn0NCmhpc3QoZ2lhJENUUywgbWFpbiA9ICJCSeG7glUgxJDhu5IgR0nDgSBD4buUIFBISeG6vlUgQ1RTIix4bGFiID0gIkNUUyIsIHlsYWIgPSAiZnJlcXVlbmN5IHByaWNlIixjb2wgPSAiIzQ2ODJCNCIpDQpgYGANCg0KKiAqKktp4buDbSDEkeG7i25oIHBow6JuIHBo4buRaSBjaHXhuqluKioNCg0KJEhfMCQ6IEJp4bq/biBDVFMgY8OzIHBow6JuIHBo4buRaSBjaHXhuqluDQoNCiRIXzEkOiBCaeG6v24gQ1RTIGtow7RuZyBjw7MgcGjDom4gcGjhu5FpIGNodeG6qW4NCg0KDQpgYGB7cn0NCnNoYXBpcm8udGVzdChnaWEkQ1RTKQ0KYGBgDQoNClbhu5tpIHAtdmFsdWUgPCAwLjA1ICwgYsOhYyBi4buPICRIXzAkIG7Dqm4gZMOjeSBz4buRIGxp4buHdSBuw6B5IGtow7RuZyBjw7MgcGjDom4gcGjhu5FpIGNodeG6qW4NCg0KKiAqKktp4buDbSDEkeG7i25oIHBow6JuIHBo4buRaSBsb2dhIGNodeG6qW4qKg0KDQokSF8wJDogQmnhur9uIENUUyBjw7MgcGjDom4gcGjhu5FpIGxvZ2EgY2h14bqpbg0KDQokSF8xJDogQmnhur9uIENUUyBraMO0bmcgY8OzIHBow6JuIHBo4buRaSBsb2dhIGNodeG6qW4NCg0KYGBge3J9DQprcy50ZXN0KGdpYSRDVFMseT0icGxub3JtIikNCmBgYA0KDQpW4bubaSBwLXZhbHVlIDwgMC4wNSAsIGLDoWMgYuG7jyAkSF8wJCBuw6puIGTDo3kgc+G7kSBsaeG7h3UgbsOgeSBraMO0bmcgY8OzIHBow6JuIHBo4buRaSBsb2dhIGNodeG6qW4NCg0KKiAqKktp4buDbSDEkeG7i25oIHBow6JuIHBo4buRaSBtxakqKg0KDQokSF8wJDogQmnhur9uIENUUyBjw7MgcGjDom4gcGjhu5FpIG3FqQ0KDQokSF8xJDogQmnhur9uIENUUyBraMO0bmcgY8OzIHBow6JuIHBo4buRaSBtxakNCg0KYGBge3J9DQprcy50ZXN0KGdpYSRDVFMseT0icGV4cCIpDQpgYGANCg0KVuG7m2kgcC12YWx1ZSA8IDAuMDUgLCBiw6FjIGLhu48gJEhfMCQgbsOqbiBkw6N5IHPhu5EgbGnhu4d1IG7DoHkga2jDtG5nIGPDsyBwaMOibiBwaOG7kWkgbcWpDQoNCiMjIyBCaeG6v24gRlRTDQoNCiogKirEkOG7kyB0aOG7iyoqDQoNCmBgYHtyfQ0KaGlzdChnaWEkRlRTLCBtYWluID0gIkJJ4buCVSDEkOG7kiBHScOBIEPhu5QgUEhJ4bq+VSBGVFMiLHhsYWIgPSAiRlRTIiwgeWxhYiA9ICJmcmVxdWVuY3kgcHJpY2UiLGNvbCA9ICIjNDY4MkI0IikNCmBgYA0KDQoqICoqS2nhu4NtIMSR4buLbmggcGjDom4gcGjhu5FpIGNodeG6qW4qKg0KDQokSF8wJDogQmnhur9uIEZUUyBjw7MgcGjDom4gcGjhu5FpIGNodeG6qW4NCg0KJEhfMSQ6IEJp4bq/biBGVFMga2jDtG5nIGPDsyBwaMOibiBwaOG7kWkgY2h14bqpbg0KDQoNCmBgYHtyfQ0Kc2hhcGlyby50ZXN0KGdpYSRGVFMpDQpgYGANCg0KVuG7m2kgcC12YWx1ZSA8IDAuMDUgLCBiw6FjIGLhu48gJEhfMCQgbsOqbiBkw6N5IHPhu5EgbGnhu4d1IG7DoHkga2jDtG5nIGPDsyBwaMOibiBwaOG7kWkgY2h14bqpbg0KDQoqICoqS2nhu4NtIMSR4buLbmggcGjDom4gcGjhu5FpIGxvZ2EgY2h14bqpbioqDQoNCiRIXzAkOiBCaeG6v24gRlRTIGPDsyBwaMOibiBwaOG7kWkgbG9nYSBjaHXhuqluDQoNCiRIXzEkOiBCaeG6v24gRlRTIGtow7RuZyBjw7MgcGjDom4gcGjhu5FpIGxvZ2EgY2h14bqpbg0KDQpgYGB7cn0NCmtzLnRlc3QoZ2lhJEZUUyx5PSJwbG5vcm0iKQ0KYGBgDQoNClbhu5tpIHAtdmFsdWUgPCAwLjA1ICwgYsOhYyBi4buPICRIXzAkIG7Dqm4gZMOjeSBz4buRIGxp4buHdSBuw6B5IGtow7RuZyBjw7MgcGjDom4gcGjhu5FpIGxvZ2EgY2h14bqpbg0KDQoqICoqS2nhu4NtIMSR4buLbmggcGjDom4gcGjhu5FpIG3FqSoqDQoNCiRIXzAkOiBCaeG6v24gRlRTIGPDsyBwaMOibiBwaOG7kWkgbcWpDQoNCiRIXzEkOiBCaeG6v24gRlRTIGtow7RuZyBjw7MgcGjDom4gcGjhu5FpIG3FqQ0KDQpgYGB7cn0NCmtzLnRlc3QoZ2lhJEZUUyx5PSJwZXhwIikNCmBgYA0KDQpW4bubaSBwLXZhbHVlIDwgMC4wNSAsIGLDoWMgYuG7jyAkSF8wJCBuw6puIGTDo3kgc+G7kSBsaeG7h3UgbsOgeSBraMO0bmcgY8OzIHBow6JuIHBo4buRaSBtxakNCg0KIyMjIEJp4bq/biBIQ00NCg0KKiAqKsSQ4buTIHRo4buLKioNCg0KYGBge3J9DQpoaXN0KGdpYSRIQ00sIG1haW4gPSAiQknhu4JVIMSQ4buSIEdJw4EgQ+G7lCBQSEnhur5VIEhDTSIseGxhYiA9ICJIQ00iLCB5bGFiID0gImZyZXF1ZW5jeSBwcmljZSIsY29sID0gIiM0NjgyQjQiKQ0KYGBgDQoNCiogKipLaeG7g20gxJHhu4tuaCBwaMOibiBwaOG7kWkgY2h14bqpbioqDQoNCiRIXzAkOiBCaeG6v24gSENNIGPDsyBwaMOibiBwaOG7kWkgY2h14bqpbg0KDQokSF8xJDogQmnhur9uIEhDTSBraMO0bmcgY8OzIHBow6JuIHBo4buRaSBjaHXhuqluDQoNCg0KYGBge3J9DQpzaGFwaXJvLnRlc3QoZ2lhJEhDTSkNCmBgYA0KDQpW4bubaSBwLXZhbHVlIDwgMC4wNSAsIGLDoWMgYuG7jyAkSF8wJCBuw6puIGTDo3kgc+G7kSBsaeG7h3UgbsOgeSBraMO0bmcgY8OzIHBow6JuIHBo4buRaSBjaHXhuqluDQoNCiogKipLaeG7g20gxJHhu4tuaCBwaMOibiBwaOG7kWkgbG9nYSBjaHXhuqluKioNCg0KJEhfMCQ6IEJp4bq/biBIQ00gY8OzIHBow6JuIHBo4buRaSBsb2dhIGNodeG6qW4NCg0KJEhfMSQ6IEJp4bq/biBIQ00ga2jDtG5nIGPDsyBwaMOibiBwaOG7kWkgbG9nYSBjaHXhuqluDQoNCmBgYHtyfQ0Ka3MudGVzdChnaWEkSENNLHk9InBsbm9ybSIpDQpgYGANCg0KVuG7m2kgcC12YWx1ZSA8IDAuMDUgLCBiw6FjIGLhu48gJEhfMCQgbsOqbiBkw6N5IHPhu5EgbGnhu4d1IG7DoHkga2jDtG5nIGPDsyBwaMOibiBwaOG7kWkgbG9nYSBjaHXhuqluDQoNCiogKipLaeG7g20gxJHhu4tuaCBwaMOibiBwaOG7kWkgbcWpKioNCg0KJEhfMCQ6IEJp4bq/biBIQ00gY8OzIHBow6JuIHBo4buRaSBtxakNCg0KJEhfMSQ6IEJp4bq/biBIQ00ga2jDtG5nIGPDsyBwaMOibiBwaOG7kWkgbcWpDQoNCmBgYHtyfQ0Ka3MudGVzdChnaWEkSENNLHk9InBleHAiKQ0KYGBgDQoNClbhu5tpIHAtdmFsdWUgPCAwLjA1ICwgYsOhYyBi4buPICRIXzAkIG7Dqm4gZMOjeSBz4buRIGxp4buHdSBuw6B5IGtow7RuZyBjw7MgcGjDom4gcGjhu5FpIG3FqQ0KDQojIyMgQmnhur9uIFNTSQ0KDQoqICoqxJDhu5MgdGjhu4sqKg0KDQpgYGB7cn0NCmhpc3QoZ2lhJFNTSSwgbWFpbiA9ICJCSeG7glUgxJDhu5IgR0nDgSBD4buUIFBISeG6vlUgU1NJIix4bGFiID0gIlNTSSIsIHlsYWIgPSAiZnJlcXVlbmN5IHByaWNlIixjb2wgPSAiIzQ2ODJCNCIpDQpgYGANCg0KKiAqKktp4buDbSDEkeG7i25oIHBow6JuIHBo4buRaSBjaHXhuqluKioNCg0KJEhfMCQ6IEJp4bq/biBTU0kgY8OzIHBow6JuIHBo4buRaSBjaHXhuqluDQoNCiRIXzEkOiBCaeG6v24gU1NJIGtow7RuZyBjw7MgcGjDom4gcGjhu5FpIGNodeG6qW4NCg0KDQpgYGB7cn0NCnNoYXBpcm8udGVzdChnaWEkU1NJKQ0KYGBgDQoNClbhu5tpIHAtdmFsdWUgPCAwLjA1ICwgYsOhYyBi4buPICRIXzAkIG7Dqm4gZMOjeSBz4buRIGxp4buHdSBuw6B5IGtow7RuZyBjw7MgcGjDom4gcGjhu5FpIGNodeG6qW4NCg0KKiAqKktp4buDbSDEkeG7i25oIHBow6JuIHBo4buRaSBsb2dhIGNodeG6qW4qKg0KDQokSF8wJDogQmnhur9uIEJTSSBjw7MgcGjDom4gcGjhu5FpIGxvZ2EgY2h14bqpbg0KDQokSF8xJDogQmnhur9uIEJTSSBraMO0bmcgY8OzIHBow6JuIHBo4buRaSBsb2dhIGNodeG6qW4NCg0KYGBge3J9DQprcy50ZXN0KGdpYSRTU0ksICJwbG5vcm0iKQ0KYGBgDQoNClbhu5tpIHAtdmFsdWUgPCAwLjA1ICwgYsOhYyBi4buPICRIXzAkIG7Dqm4gZMOjeSBz4buRIGxp4buHdSBuw6B5IGtow7RuZyBjw7MgcGjDom4gcGjhu5FpIGxvZ2EgY2h14bqpbg0KDQoqICoqS2nhu4NtIMSR4buLbmggcGjDom4gcGjhu5FpIG3FqSoqDQoNCiRIXzAkOiBCaeG6v24gQlNJIGPDsyBwaMOibiBwaOG7kWkgbcWpDQoNCiRIXzEkOiBCaeG6v24gQlNJIGtow7RuZyBjw7MgcGjDom4gcGjhu5FpIG3FqQ0KDQpgYGB7cn0NCmtzLnRlc3QoZ2lhJFNTSSx5PSJwZXhwIikNCmBgYA0KDQpW4bubaSBwLXZhbHVlIDwgMC4wNSAsIGLDoWMgYuG7jyAkSF8wJCBuw6puIGTDo3kgc+G7kSBsaeG7h3UgbsOgeSBraMO0bmcgY8OzIHBow6JuIHBo4buRaSBtxakNCg0KDQojIyBW4bqtbiBk4bulbmcgbcO0IGjDrG5oIG1hcmtvd2l0eg0KDQoNCmBgYHtyfQ0KbGlicmFyeShmUG9ydGZvbGlvKSANCiNRdXkgxJHhu4tuaCBk4buvIGxp4buHdSBsw6AgY2h14buXaSB0aOG7nWkgZ2lhbg0KZ2lhIDwtYXMudGltZVNlcmllcyhnaWEpIA0KI1TDrW5oIGNodeG7l2kgbOG7o2kgbmh14bqtbg0KbG9pbmh1YW48LWhlYWQoZ2lhLC0xKS90YWlsKGdpYSwtMSktMSANCmRhdGF0YWJsZShsb2luaHVhbikNCmBgYA0KDQoNCg0KKipNaW5oIGjhu41hIGJpw6puIGhp4buHdSBxdeG6oyoqDQoNCg0KYGBge3J9DQptb2hpbmggPSBwb3J0Zm9saW9TcGVjKCkNCmJpZW4gPC0gcG9ydGZvbGlvRnJvbnRpZXIobG9pbmh1YW4sIG1vaGluaCkNCmZyb250aWVyUGxvdChiaWVuLGNvbCA9IGMoJ2JsYWNrJywgJ2JsdWUnKSwgcGNoPTE5KQ0KI0dp4bqjIGzhuq1wIGPDoWMgZGFuaCBt4bulYyBraMOhYw0KbW9udGVDYXJsb1BvaW50cyhiaWVuLCBtY1N0ZXBzID0gMTAwMDAsIGNleCA9IDAuMjUscGNoID0gMTkpDQpgYGANCg0KKipEYW5oIG3hu6VjIGPDsyBwaMawxqFuZyBzYWkgbmjhu48gbmjhuqV0OioqDQoNCmBgYHtyfQ0KbWlucmlza1BvcnRmb2xpbyhsb2luaHVhbiwgbW9oaW5oKQ0KYGBgDQoNCiAqKkRhbmggbeG7pWMgY8OzIHBoxrDGoW5nIHNhaSBuaOG7jyBuaOG6pXQgdHJvbmcgY8OhYyBkYW5oIG3hu6VjIGPDsyBs4bujaSBuaHXhuq1uKioNCiANCmBgYHtyfQ0Kc2V0VGFyZ2V0UmV0dXJuKG1vaGluaCkgPC0gbWVhbihjb2xNZWFucyhsb2luaHVhbikpDQplZmZpY2llbnRQb3J0Zm9saW8obG9pbmh1YW4sIG1vaGluaCkNCmBgYA0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0K