library(xlsx)
## Warning: package 'xlsx' was built under R version 4.3.3
library(quantmod)
## Warning: package 'quantmod' was built under R version 4.3.3
## Loading required package: xts
## Warning: package 'xts' was built under R version 4.3.3
## Loading required package: zoo
## Warning: package 'zoo' was built under R version 4.3.3
##
## Attaching package: 'zoo'
## The following objects are masked from 'package:base':
##
## as.Date, as.Date.numeric
## Loading required package: TTR
## Warning: package 'TTR' was built under R version 4.3.3
## Registered S3 method overwritten by 'quantmod':
## method from
## as.zoo.data.frame zoo
library(tidyverse)
## Warning: package 'ggplot2' was built under R version 4.3.3
## Warning: package 'tidyr' was built under R version 4.3.3
## Warning: package 'dplyr' was built under R version 4.3.3
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr 1.1.4 ✔ readr 2.1.5
## ✔ forcats 1.0.0 ✔ stringr 1.5.1
## ✔ ggplot2 3.5.0 ✔ tibble 3.2.1
## ✔ lubridate 1.9.3 ✔ tidyr 1.3.1
## ✔ purrr 1.0.2
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::first() masks xts::first()
## ✖ dplyr::lag() masks stats::lag()
## ✖ dplyr::last() masks xts::last()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
library(xts)
library(PerformanceAnalytics)
## Warning: package 'PerformanceAnalytics' was built under R version 4.3.3
##
## Attaching package: 'PerformanceAnalytics'
##
## The following object is masked from 'package:graphics':
##
## legend
library(forecast)
## Warning: package 'forecast' was built under R version 4.3.3
library(rugarch)
## Warning: package 'rugarch' was built under R version 4.3.3
## Loading required package: parallel
##
## Attaching package: 'rugarch'
##
## The following object is masked from 'package:purrr':
##
## reduce
##
## The following object is masked from 'package:stats':
##
## sigma
library(goftest)
library(VineCopula)
## Warning: package 'VineCopula' was built under R version 4.3.3
library(tseries)
## Warning: package 'tseries' was built under R version 4.3.3
library(FinTS)
## Warning: package 'FinTS' was built under R version 4.3.3
##
## Attaching package: 'FinTS'
##
## The following object is masked from 'package:forecast':
##
## Acf
library(ggplot2)
library(corrplot)
## Warning: package 'corrplot' was built under R version 4.3.3
## corrplot 0.92 loaded
library(ggcorrplot)
## Warning: package 'ggcorrplot' was built under R version 4.3.3
library(aTSA)
##
## Attaching package: 'aTSA'
##
## The following objects are masked from 'package:tseries':
##
## adf.test, kpss.test, pp.test
##
## The following object is masked from 'package:forecast':
##
## forecast
##
## The following object is masked from 'package:graphics':
##
## identify
library(ADGofTest)
##
## Attaching package: 'ADGofTest'
##
## The following object is masked from 'package:goftest':
##
## ad.test
library(kableExtra)
## Warning: package 'kableExtra' was built under R version 4.3.3
##
## Attaching package: 'kableExtra'
##
## The following object is masked from 'package:dplyr':
##
## group_rows
library(knitr)
#Nhập dữ liệu chỉ số giá VN Index của Việt Nam và chỉ số giá CSI300 của Trung Quốc vào lần lượt P1 và P2
P1 <- read.xlsx('C:/Users/HP/Downloads/VNIndexHistoricalData.xlsx', sheetIndex = 1, header = T)
P2 <- read.xlsx('C:/Users/HP/Downloads/ShanghaiCompositeHistoricalData1.xlsx', sheetIndex = 1, header = T)
##Khai báo dữ liệu chuỗi thời gian, sắp xếp theo thời gian thứ tự từ ngày 01/01/2018 đến ngày 01/01/2024
VNI <- xts(P1[,-1], order.by = P1$Date)
CSI300 <- xts(P2[,-1],order.by = P2$Date)
#Gộp hai chuỗi giá dựa trên những ngày trùng nhau
dt <- merge.xts(CSI300,VNI,join = 'inner')
#Tính tỷ suất lợi nhuận theo công thức logt - logt-1
rt <- CalculateReturns(dt,method = 'log')
rt <- rt[-1]
rt2 <- CalculateReturns(rt)
rt2 <- rt2[-1]
# ma hoa so lieu (an)
stt <- 1:nrow(dt)
dt <- data.frame(dt,stt)
stt.tsln <- 1:length(rt)
tsln.1 <- data.frame(rt,stt.tsln)
## Warning in data.frame(rt, stt.tsln): row names were found from a short variable
## and have been discarded
# Bieu do duong CSI300
dt %>% ggplot(aes(x=stt,y=CSI300)) + geom_line() + theme_bw()+
labs(x="Date",y="Price",title = "Biểu đồ đường chỉ số CSI300")

# Bieu do duong CSI300
dt %>% ggplot(aes(x=stt,y=VNI)) + geom_line() + theme_bw()+
labs(x="Date",y="Price",title = "Biểu đồ đường chỉ số VNI")

rt_df <- as.data.frame(rt)
a <- rt_df %>% summarise(Min = min(VNI),
Max = max(VNI),
Mean = mean(VNI),
StDev = sd(VNI),
Skewness = skewness(VNI),
Kurtosis = kurtosis(VNI))
b <- rt_df %>% summarise(Min = min(CSI300),
Max = max(CSI300),
Mean = mean(CSI300),
StDev = sd(CSI300),
Skewness = skewness(CSI300),
Kurtosis = kurtosis(CSI300))
m <- rbind(a,b)
rownames(m) <- c('VNI','CSI300')
kable(m, format = 'pandoc', caption = 'Bảng 1: Thống kê mô tả chuỗi TSLN', table.attr = "style='width:100%;'") %>% kable_styling(bootstrap_options = c("striped", "hover", "condensed"))
## Warning in kable_styling(., bootstrap_options = c("striped", "hover",
## "condensed")): Please specify format in kable. kableExtra can customize either
## HTML or LaTeX outputs. See https://haozhu233.github.io/kableExtra/ for details.
Bảng 1: Thống kê mô tả chuỗi TSLN
VNI |
-0.0690762 |
0.0486002 |
0.0000040 |
0.0127318 |
-0.9710012 |
3.891447 |
CSI300 |
-0.0820870 |
0.0577737 |
-0.0001202 |
0.0124147 |
-0.3262891 |
3.145251 |
pivot_longer(rt_df, cols = everything(), names_to = "TSLN", values_to = "Value") %>% ggplot(aes(x = TSLN, y = Value)) +
geom_boxplot(fill = "navy", color = "black") +
theme_minimal() +
labs(title = "Hình 7: Biểu đồ hộp của TSLN VNI và CSI300",
x = "Chỉ số",
y = "Tỷ suất sinh lợi")

# Bieu do duong rt
ggplot(tsln.1,aes(x=stt.tsln,y=CSI300)) + geom_line() + theme_bw()+
labs(x="Date",y="%",title = "Biểu đồ đường tỷ suât lợi nhuận chỉ số CSI300")

# Bieu do duong tsln_vni
ggplot(tsln.1,aes(x=stt.tsln,y=VNI)) + geom_line() + theme_bw()+
labs(x="Date",y="%",title = "Biểu đồ đường tỷ suât lợi nhuận chỉ số VNI")

#Kiểm định tính dừng
adf_vni <- adf.test(rt$VNI)
## Augmented Dickey-Fuller Test
## alternative: stationary
##
## Type 1: no drift no trend
## lag ADF p.value
## [1,] 0 36.1 0.99
## [2,] 1 49.9 0.99
## [3,] 2 60.7 0.99
## [4,] 3 69.9 0.99
## [5,] 4 77.4 0.99
## [6,] 5 83.9 0.99
## [7,] 6 89.6 0.99
## [8,] 7 94.8 0.99
## Type 2: with drift no trend
## lag ADF p.value
## [1,] 0 36.1 0.99
## [2,] 1 49.9 0.99
## [3,] 2 60.7 0.99
## [4,] 3 69.9 0.99
## [5,] 4 77.4 0.99
## [6,] 5 83.8 0.99
## [7,] 6 89.6 0.99
## [8,] 7 94.8 0.99
## Type 3: with drift and trend
## lag ADF p.value
## [1,] 0 36.0 0.99
## [2,] 1 49.9 0.99
## [3,] 2 60.7 0.99
## [4,] 3 69.9 0.99
## [5,] 4 77.3 0.99
## [6,] 5 83.8 0.99
## [7,] 6 89.6 0.99
## [8,] 7 94.8 0.99
## ----
## Note: in fact, p.value = 0.01 means p.value <= 0.01
adf_CSI300 <- adf.test(rt$CSI300)
## Augmented Dickey-Fuller Test
## alternative: stationary
##
## Type 1: no drift no trend
## lag ADF p.value
## [1,] 0 38.1 0.99
## [2,] 1 54.0 0.99
## [3,] 2 65.2 0.99
## [4,] 3 75.5 0.99
## [5,] 4 85.0 0.99
## [6,] 5 94.4 0.99
## [7,] 6 102.5 0.99
## [8,] 7 110.1 0.99
## Type 2: with drift no trend
## lag ADF p.value
## [1,] 0 38.1 0.99
## [2,] 1 53.9 0.99
## [3,] 2 65.2 0.99
## [4,] 3 75.5 0.99
## [5,] 4 85.0 0.99
## [6,] 5 94.4 0.99
## [7,] 6 102.5 0.99
## [8,] 7 110.1 0.99
## Type 3: with drift and trend
## lag ADF p.value
## [1,] 0 38.1 0.99
## [2,] 1 54.0 0.99
## [3,] 2 65.2 0.99
## [4,] 3 75.5 0.99
## [5,] 4 85.0 0.99
## [6,] 5 94.5 0.99
## [7,] 6 102.6 0.99
## [8,] 7 110.3 0.99
## ----
## Note: in fact, p.value = 0.01 means p.value <= 0.01
#Kiểm định phân phối chuẩn
jq_vni <- jarque.bera.test(rt$VNI)
jq_CSI300 <- jarque.bera.test(rt$CSI300)
# Ước lượng và trích xuất phần dư từ mô hình ARMA tối ưu
arima_VNI <- autoarfima(rt$VNI,ar.max = 2, ma.max = 2, criterion = 'AIC', method = "full")
arima_CSI300 <- autoarfima(rt$CSI300,ar.max = 2, ma.max = 2, criterion = 'AIC', method = "full")
re_VNI <- arima_VNI$fit@fit$residuals
re_CSI300 <- arima_CSI300$fit@fit$residuals
#Kiểm định tương quan chuỗi bậc 2 cho phần dư
lj_vni <- Box.test(re_VNI,type = 'Ljung-Box', lag = 2)
lj_CSI300 <- Box.test(re_CSI300,type = 'Ljung-Box', lag = 2)
#Kiểm định tương quan chuỗi bậc 2 cho phần dư bình phương
lj_vni.2 <- Box.test(re_VNI^2,type = 'Ljung-Box', lag = 2)
lj_CSI300.2 <- Box.test(re_CSI300^2,type = 'Ljung-Box', lag = 2)
#Kiểm định hiệu ứng ARCH
ar_vni <- ArchTest(re_VNI, lags = 2)
ar_CSI300 <- ArchTest(re_CSI300, lags = 2)
#Trình bày kết quả
test_result <- data.frame(Test = c("J-B","Q(2)","Q(2)^2", "ARCH(2)"),
P_value_VNI = c(jq_vni$p.value, lj_vni$p.value, lj_vni.2$p.value, ar_vni$p.value),
P_value_CSI300 = c(jq_CSI300$p.value, lj_CSI300$p.value, lj_CSI300.2$p.value, ar_CSI300$p.value))
kable(test_result,
caption = "Bảng 3: Kết quả các kiểm định",
label = 'Ghi chú: Q (2) and Q2 (2) lần lượt là kiểm định Ljung-Box Q2 cho tương quan chuỗi bậc 2 của phần dư và bình phương phần dư của lợi suất',
format = 'pandoc') %>% kable_styling(
bootstrap_options = c("striped", "hover", "condensed"),
full_width = F)
## Warning in kable_styling(., bootstrap_options = c("striped", "hover",
## "condensed"), : Please specify format in kable. kableExtra can customize either
## HTML or LaTeX outputs. See https://haozhu233.github.io/kableExtra/ for details.
Bảng 3: Kết quả các kiểm định
J-B |
0.0000000 |
0.0000000 |
Q(2) |
0.9998155 |
0.9997269 |
Q(2)^2 |
0.0000000 |
0.0000217 |
ARCH(2) |
0.0000000 |
0.0000534 |
pearson <- cor(rt$VNI,rt$CSI300, method="pearson")
spearman <- cor(rt$VNI,rt$CSI300, method="spearman")
kendall <- cor(rt$VNI,rt$CSI300, method="kendall")
#Trình bày kết quả
relat <- data.frame('Tương quan' = 'VNI-CSI300',
Pearson = pearson[1,1],
spearman = spearman[1,1],
Kendall = kendall[1,1])
kable(relat,
col.names = c("Phương pháp", "Pearson", "Spearman","Kendall"),
caption = "Bảng 4: Kết quả hệ số tương quan",
format = 'pandoc',
align = c("l", "c", "c")) %>%
kable_styling(bootstrap_options = c("striped", "hover", "condensed"), full_width = FALSE)
## Warning in kable_styling(., bootstrap_options = c("striped", "hover",
## "condensed"), : Please specify format in kable. kableExtra can customize either
## HTML or LaTeX outputs. See https://haozhu233.github.io/kableExtra/ for details.
Bảng 4: Kết quả hệ số tương quan
VNI-CSI300 |
0.0401281 |
0.042613 |
0.0286111 |
par(mfrow = c(1,2))
corr <- cor(rt)
ggcorrplot(corr, hc.order = TRUE,
outline.col = "white",
ggtheme = ggplot2::theme_gray,
colors = c("navy", "white", "gold"),
lab = TRUE, lab_col = 'black',title = 'Hình 8: Trực quan hóa hệ số tương quan với phương pháp Pearson')

chart.Correlation(rt, histogram=TRUE, pch=19)
## Warning in par(usr): argument 1 does not name a graphical parameter

rt %>% ggplot(aes(VNI, CSI300)) +
geom_point(col = 'gold',shape = TRUE) +
geom_smooth(method = 'lm',se = T, col = 'navy') + #thêm đường hồi quy với phương pháp hồi quy tuyến tính
labs(title = 'Hình 11: Biểu đồ Scatter TSLN của CSI300 và VNI', x = 'VNI', y = 'CSI300')
## `geom_smooth()` using formula = 'y ~ x'

#CSI300
arma_CSI300 <- autoarfima(rt$CSI300,ar.max = 2,ma.max = 2,
criterion = "AIC",
method = "full")
arma_CSI300$fit
##
## *----------------------------------*
## * ARFIMA Model Fit *
## *----------------------------------*
## Mean Model : ARFIMA(0,0,0)
## Distribution : norm
##
## Optimal Parameters
## ------------------------------------
## Estimate Std. Error t value Pr(>|t|)
## mu -0.00012 0.000325 -0.36937 0.71185
## sigma 0.01241 0.000230 53.96314 0.00000
##
## Robust Standard Errors:
## Estimate Std. Error t value Pr(>|t|)
## mu -0.00012 0.000314 -0.38319 0.70158
## sigma 0.01241 0.000512 24.23342 0.00000
##
## LogLikelihood : 4324.731
##
## Information Criteria
## ------------------------------------
##
## Akaike -5.9378
## Bayes -5.9306
## Shibata -5.9378
## Hannan-Quinn -5.9351
##
## Weighted Ljung-Box Test on Standardized Residuals
## ------------------------------------
## statistic p-value
## Lag[1] 5.778e-05 0.9939
## Lag[2*(p+q)+(p+q)-1][2] 3.020e-04 0.9996
## Lag[4*(p+q)+(p+q)-1][5] 2.806e+00 0.4436
##
## H0 : No serial correlation
##
## Weighted Ljung-Box Test on Standardized Squared Residuals
## ------------------------------------
## statistic p-value
## Lag[1] 16.46 4.979e-05
## Lag[2*(p+q)+(p+q)-1][2] 18.96 8.324e-06
## Lag[4*(p+q)+(p+q)-1][5] 28.52 8.241e-08
##
##
## ARCH LM Tests
## ------------------------------------
## Statistic DoF P-Value
## ARCH Lag[2] 19.67 2 5.344e-05
## ARCH Lag[5] 32.35 5 5.072e-06
## ARCH Lag[10] 51.43 10 1.452e-07
##
## Nyblom stability test
## ------------------------------------
## Joint Statistic: 1.9296
## Individual Statistics:
## mu 0.1506
## sigma 1.6347
##
## Asymptotic Critical Values (10% 5% 1%)
## Joint Statistic: 0.61 0.749 1.07
## Individual Statistic: 0.35 0.47 0.75
##
##
## Elapsed time : 0.03497815
plot(arma_CSI300[["fit"]]@fit[["residuals"]],type="l")

ggplot(tsln.1,aes(x=stt.tsln,y=CSI300)) + geom_line() + theme_bw()+
labs(x="Date",y="%",title = "Biểu đồ đường tỷ suât lợi nhuận chỉ số CSI300")

# vni
arma_vni <- autoarfima(rt$VNI,ar.max = 2,ma.max = 2,
criterion = "AIC",
method = "full")
arma_vni$fit
##
## *----------------------------------*
## * ARFIMA Model Fit *
## *----------------------------------*
## Mean Model : ARFIMA(0,0,2)
## Distribution : norm
##
## Optimal Parameters
## ------------------------------------
## Estimate Std. Error t value Pr(>|t|)
## ma1 0.053837 0.026176 2.0568 0.039710
## ma2 0.045130 0.026414 1.7085 0.087536
## sigma 0.012695 0.000235 53.9746 0.000000
##
## Robust Standard Errors:
## Estimate Std. Error t value Pr(>|t|)
## ma1 0.053837 0.031428 1.7130 0.086705
## ma2 0.045130 0.032955 1.3694 0.170860
## sigma 0.012695 0.000696 18.2503 0.000000
##
## LogLikelihood : 4291.54
##
## Information Criteria
## ------------------------------------
##
## Akaike -5.8909
## Bayes -5.8800
## Shibata -5.8909
## Hannan-Quinn -5.8868
##
## Weighted Ljung-Box Test on Standardized Residuals
## ------------------------------------
## statistic p-value
## Lag[1] 4.634e-05 0.9946
## Lag[2*(p+q)+(p+q)-1][5] 4.618e-01 1.0000
## Lag[4*(p+q)+(p+q)-1][9] 2.543e+00 0.9475
##
## H0 : No serial correlation
##
## Weighted Ljung-Box Test on Standardized Squared Residuals
## ------------------------------------
## statistic p-value
## Lag[1] 52.78 3.736e-13
## Lag[2*(p+q)+(p+q)-1][2] 82.04 0.000e+00
## Lag[4*(p+q)+(p+q)-1][5] 151.05 0.000e+00
##
##
## ARCH LM Tests
## ------------------------------------
## Statistic DoF P-Value
## ARCH Lag[2] 93.19 2 0
## ARCH Lag[5] 130.62 5 0
## ARCH Lag[10] 163.52 10 0
##
## Nyblom stability test
## ------------------------------------
## Joint Statistic: 0.9205
## Individual Statistics:
## ma1 0.05523
## ma2 0.42330
## sigma 0.46825
##
## Asymptotic Critical Values (10% 5% 1%)
## Joint Statistic: 0.846 1.01 1.35
## Individual Statistic: 0.35 0.47 0.75
##
##
## Elapsed time : 0.0324738
plot(arma_CSI300[["fit"]]@fit[["residuals"]],type="l")

ggplot(tsln.1,aes(x=stt.tsln,y=VNI)) + geom_line() + theme_bw()+
labs(x="Date",y="%",title = "Biểu đồ đường tỷ suât lợi nhuận chỉ số VNI")

# CSI300
# neu nhu arma co thanh phan nao = 0 thi se dung cau lenh nay de setup "fixed.pars = list(ar1 = 0, ma1 = 0)"
garch_CSI300norm <- ugarchspec(mean.model = list(armaOrder = c(2,0),include.mean = FALSE),
variance.model = list(model = "sGARCH",garchOrder = c(1,1)),
fixed.pars = list( ar1 = 0),
distribution.model = 'norm')
garch_CSI300std <- ugarchspec(mean.model = list(armaOrder = c(0,2),include.mean = TRUE),
variance.model = list(model = "sGARCH",garchOrder = c(1,1)),
fixed.pars = list(ar1 = 0, ma1 = 0),
distribution.model = 'std')
garch_CSI300sstd <- ugarchspec(mean.model = list(armaOrder = c(0,2),include.mean = TRUE),
variance.model = list(model = "sGARCH",garchOrder = c(1,1)),
fixed.pars = list(ar1 = 0, ma1 = 0),
distribution.model = 'sstd')
garch_CSI300ged <- ugarchspec(mean.model = list(armaOrder = c(0,2),include.mean = TRUE),
variance.model = list(model = "sGARCH",garchOrder = c(1,1)),
fixed.pars = list(ar1 = 0, ma1 = 0),
distribution.model = 'ged')
garch_CSI300sged <- ugarchspec(mean.model = list(armaOrder = c(3,3),include.mean = TRUE),
variance.model = list(model = "sGARCH",garchOrder = c(1,1)),
fixed.pars = list( ma1 = 0),
distribution.model = 'sged')
fCSI300norm <- ugarchfit(data = rt$CSI300, spec = garch_CSI300norm)
fCSI300norm
##
## *---------------------------------*
## * GARCH Model Fit *
## *---------------------------------*
##
## Conditional Variance Dynamics
## -----------------------------------
## GARCH Model : sGARCH(1,1)
## Mean Model : ARFIMA(2,0,0)
## Distribution : norm
##
## Optimal Parameters
## ------------------------------------
## Estimate Std. Error t value Pr(>|t|)
## ar1 0.000000 NA NA NA
## ar2 0.000511 0.028049 0.018222 0.985462
## omega 0.000006 0.000001 4.549101 0.000005
## alpha1 0.089938 0.009050 9.937701 0.000000
## beta1 0.876468 0.012060 72.675935 0.000000
##
## Robust Standard Errors:
## Estimate Std. Error t value Pr(>|t|)
## ar1 0.000000 NA NA NA
## ar2 0.000511 0.027906 0.018315 0.985388
## omega 0.000006 0.000002 2.806961 0.005001
## alpha1 0.089938 0.016603 5.416942 0.000000
## beta1 0.876468 0.017861 49.071045 0.000000
##
## LogLikelihood : 4391.963
##
## Information Criteria
## ------------------------------------
##
## Akaike -6.0274
## Bayes -6.0129
## Shibata -6.0274
## Hannan-Quinn -6.0220
##
## Weighted Ljung-Box Test on Standardized Residuals
## ------------------------------------
## statistic p-value
## Lag[1] 0.9293 0.33505
## Lag[2*(p+q)+(p+q)-1][5] 4.0869 0.05319
## Lag[4*(p+q)+(p+q)-1][9] 7.3210 0.10014
## d.o.f=2
## H0 : No serial correlation
##
## Weighted Ljung-Box Test on Standardized Squared Residuals
## ------------------------------------
## statistic p-value
## Lag[1] 1.523 0.2171
## Lag[2*(p+q)+(p+q)-1][5] 3.164 0.3779
## Lag[4*(p+q)+(p+q)-1][9] 3.797 0.6234
## d.o.f=2
##
## Weighted ARCH LM Tests
## ------------------------------------
## Statistic Shape Scale P-Value
## ARCH Lag[3] 0.2657 0.500 2.000 0.6062
## ARCH Lag[5] 0.6560 1.440 1.667 0.8368
## ARCH Lag[7] 1.0583 2.315 1.543 0.9039
##
## Nyblom stability test
## ------------------------------------
## Joint Statistic: 2.7422
## Individual Statistics:
## ar2 0.02704
## omega 1.20411
## alpha1 0.35941
## beta1 0.37964
##
## Asymptotic Critical Values (10% 5% 1%)
## Joint Statistic: 1.07 1.24 1.6
## Individual Statistic: 0.35 0.47 0.75
##
## Sign Bias Test
## ------------------------------------
## t-value prob sig
## Sign Bias 1.086 0.27746
## Negative Sign Bias 1.709 0.08771 *
## Positive Sign Bias 1.754 0.07961 *
## Joint Effect 7.092 0.06901 *
##
##
## Adjusted Pearson Goodness-of-Fit Test:
## ------------------------------------
## group statistic p-value(g-1)
## 1 20 40.87 0.002513
## 2 30 51.09 0.006877
## 3 40 62.41 0.010048
## 4 50 72.98 0.014733
##
##
## Elapsed time : 0.3173919
fCSI300std <- ugarchfit(data = rt$CSI300, spec = garch_CSI300std)
fCSI300std
##
## *---------------------------------*
## * GARCH Model Fit *
## *---------------------------------*
##
## Conditional Variance Dynamics
## -----------------------------------
## GARCH Model : sGARCH(1,1)
## Mean Model : ARFIMA(0,0,2)
## Distribution : std
##
## Optimal Parameters
## ------------------------------------
## Estimate Std. Error t value Pr(>|t|)
## mu -0.000036 0.000274 -0.13059 0.896102
## ma1 0.000000 NA NA NA
## ma2 -0.008914 0.026927 -0.33105 0.740608
## omega 0.000005 0.000002 1.87711 0.060503
## alpha1 0.058247 0.005326 10.93568 0.000000
## beta1 0.912778 0.011176 81.67083 0.000000
## shape 6.098477 0.958917 6.35975 0.000000
##
## Robust Standard Errors:
## Estimate Std. Error t value Pr(>|t|)
## mu -0.000036 0.000272 -0.13124 0.895588
## ma1 0.000000 NA NA NA
## ma2 -0.008914 0.027525 -0.32385 0.746049
## omega 0.000005 0.000006 0.72569 0.468027
## alpha1 0.058247 0.029641 1.96511 0.049401
## beta1 0.912778 0.012022 75.92457 0.000000
## shape 6.098477 1.007772 6.05145 0.000000
##
## LogLikelihood : 4427.999
##
## Information Criteria
## ------------------------------------
##
## Akaike -6.0742
## Bayes -6.0524
## Shibata -6.0742
## Hannan-Quinn -6.0661
##
## Weighted Ljung-Box Test on Standardized Residuals
## ------------------------------------
## statistic p-value
## Lag[1] 0.8627 0.35300
## Lag[2*(p+q)+(p+q)-1][5] 4.4370 0.02000
## Lag[4*(p+q)+(p+q)-1][9] 7.7042 0.07372
## d.o.f=2
## H0 : No serial correlation
##
## Weighted Ljung-Box Test on Standardized Squared Residuals
## ------------------------------------
## statistic p-value
## Lag[1] 4.815 0.02822
## Lag[2*(p+q)+(p+q)-1][5] 5.749 0.10302
## Lag[4*(p+q)+(p+q)-1][9] 6.392 0.25564
## d.o.f=2
##
## Weighted ARCH LM Tests
## ------------------------------------
## Statistic Shape Scale P-Value
## ARCH Lag[3] 1.030 0.500 2.000 0.3101
## ARCH Lag[5] 1.073 1.440 1.667 0.7114
## ARCH Lag[7] 1.518 2.315 1.543 0.8177
##
## Nyblom stability test
## ------------------------------------
## Joint Statistic: 1.3011
## Individual Statistics:
## mu 0.46747
## ma2 0.04994
## omega 0.19540
## alpha1 0.27554
## beta1 0.28594
## shape 0.10857
##
## Asymptotic Critical Values (10% 5% 1%)
## Joint Statistic: 1.49 1.68 2.12
## Individual Statistic: 0.35 0.47 0.75
##
## Sign Bias Test
## ------------------------------------
## t-value prob sig
## Sign Bias 1.046 0.29589
## Negative Sign Bias 2.562 0.01052 **
## Positive Sign Bias 1.104 0.26991
## Joint Effect 9.224 0.02645 **
##
##
## Adjusted Pearson Goodness-of-Fit Test:
## ------------------------------------
## group statistic p-value(g-1)
## 1 20 22.65 0.25293
## 2 30 24.67 0.69510
## 3 40 38.45 0.49475
## 4 50 62.06 0.09961
##
##
## Elapsed time : 0.5501051
fCSI300sstd <- ugarchfit(data = rt$CSI300, spec = garch_CSI300sstd)
fCSI300sstd
##
## *---------------------------------*
## * GARCH Model Fit *
## *---------------------------------*
##
## Conditional Variance Dynamics
## -----------------------------------
## GARCH Model : sGARCH(1,1)
## Mean Model : ARFIMA(0,0,2)
## Distribution : sstd
##
## Optimal Parameters
## ------------------------------------
## Estimate Std. Error t value Pr(>|t|)
## mu -0.000081 0.000291 -0.28014 0.779370
## ma1 0.000000 NA NA NA
## ma2 -0.009773 0.027041 -0.36143 0.717778
## omega 0.000005 0.000003 1.74394 0.081169
## alpha1 0.058285 0.006050 9.63397 0.000000
## beta1 0.912896 0.011116 82.12684 0.000000
## skew 0.983515 0.035662 27.57871 0.000000
## shape 6.143533 0.975268 6.29933 0.000000
##
## Robust Standard Errors:
## Estimate Std. Error t value Pr(>|t|)
## mu -0.000081 0.000287 -0.28391 0.776482
## ma1 0.000000 NA NA NA
## ma2 -0.009773 0.027733 -0.35241 0.724533
## omega 0.000005 0.000007 0.63218 0.527267
## alpha1 0.058285 0.032797 1.77715 0.075544
## beta1 0.912896 0.013238 68.95840 0.000000
## skew 0.983515 0.034492 28.51405 0.000000
## shape 6.143533 1.028746 5.97187 0.000000
##
## LogLikelihood : 4428.103
##
## Information Criteria
## ------------------------------------
##
## Akaike -6.0729
## Bayes -6.0475
## Shibata -6.0730
## Hannan-Quinn -6.0635
##
## Weighted Ljung-Box Test on Standardized Residuals
## ------------------------------------
## statistic p-value
## Lag[1] 0.865 0.35234
## Lag[2*(p+q)+(p+q)-1][5] 4.486 0.01728
## Lag[4*(p+q)+(p+q)-1][9] 7.756 0.07067
## d.o.f=2
## H0 : No serial correlation
##
## Weighted Ljung-Box Test on Standardized Squared Residuals
## ------------------------------------
## statistic p-value
## Lag[1] 4.793 0.02858
## Lag[2*(p+q)+(p+q)-1][5] 5.724 0.10440
## Lag[4*(p+q)+(p+q)-1][9] 6.356 0.25935
## d.o.f=2
##
## Weighted ARCH LM Tests
## ------------------------------------
## Statistic Shape Scale P-Value
## ARCH Lag[3] 1.014 0.500 2.000 0.3141
## ARCH Lag[5] 1.057 1.440 1.667 0.7161
## ARCH Lag[7] 1.494 2.315 1.543 0.8225
##
## Nyblom stability test
## ------------------------------------
## Joint Statistic: 1.5451
## Individual Statistics:
## mu 0.46441
## ma2 0.04753
## omega 0.18041
## alpha1 0.28017
## beta1 0.29102
## skew 0.47432
## shape 0.11022
##
## Asymptotic Critical Values (10% 5% 1%)
## Joint Statistic: 1.69 1.9 2.35
## Individual Statistic: 0.35 0.47 0.75
##
## Sign Bias Test
## ------------------------------------
## t-value prob sig
## Sign Bias 0.9462 0.34421
## Negative Sign Bias 2.5185 0.01189 **
## Positive Sign Bias 1.0512 0.29335
## Joint Effect 9.0812 0.02823 **
##
##
## Adjusted Pearson Goodness-of-Fit Test:
## ------------------------------------
## group statistic p-value(g-1)
## 1 20 23.73 0.2069
## 2 30 23.81 0.7384
## 3 40 37.96 0.5174
## 4 50 57.94 0.1788
##
##
## Elapsed time : 0.7603269
fCSI300ged <- ugarchfit(data = rt$CSI300, spec = garch_CSI300ged)
fCSI300ged
##
## *---------------------------------*
## * GARCH Model Fit *
## *---------------------------------*
##
## Conditional Variance Dynamics
## -----------------------------------
## GARCH Model : sGARCH(1,1)
## Mean Model : ARFIMA(0,0,2)
## Distribution : ged
##
## Optimal Parameters
## ------------------------------------
## Estimate Std. Error t value Pr(>|t|)
## mu -0.000086 0.000221 -0.39024 0.696361
## ma1 0.000000 NA NA NA
## ma2 -0.023492 0.026904 -0.87317 0.382571
## omega 0.000005 0.000002 3.20791 0.001337
## alpha1 0.068428 0.007209 9.49174 0.000000
## beta1 0.898666 0.012497 71.91135 0.000000
## shape 1.343409 0.067212 19.98752 0.000000
##
## Robust Standard Errors:
## Estimate Std. Error t value Pr(>|t|)
## mu -0.000086 0.000186 -0.46252 0.643710
## ma1 0.000000 NA NA NA
## ma2 -0.023492 0.028548 -0.82288 0.410574
## omega 0.000005 0.000002 2.10913 0.034933
## alpha1 0.068428 0.013557 5.04750 0.000000
## beta1 0.898666 0.010707 83.93632 0.000000
## shape 1.343409 0.078166 17.18653 0.000000
##
## LogLikelihood : 4424.856
##
## Information Criteria
## ------------------------------------
##
## Akaike -6.0699
## Bayes -6.0481
## Shibata -6.0699
## Hannan-Quinn -6.0617
##
## Weighted Ljung-Box Test on Standardized Residuals
## ------------------------------------
## statistic p-value
## Lag[1] 0.9497 0.329790
## Lag[2*(p+q)+(p+q)-1][5] 5.5571 0.000443
## Lag[4*(p+q)+(p+q)-1][9] 8.9475 0.025064
## d.o.f=2
## H0 : No serial correlation
##
## Weighted Ljung-Box Test on Standardized Squared Residuals
## ------------------------------------
## statistic p-value
## Lag[1] 3.322 0.06835
## Lag[2*(p+q)+(p+q)-1][5] 4.384 0.20989
## Lag[4*(p+q)+(p+q)-1][9] 4.951 0.43660
## d.o.f=2
##
## Weighted ARCH LM Tests
## ------------------------------------
## Statistic Shape Scale P-Value
## ARCH Lag[3] 0.6595 0.500 2.000 0.4167
## ARCH Lag[5] 0.7628 1.440 1.667 0.8044
## ARCH Lag[7] 1.1752 2.315 1.543 0.8835
##
## Nyblom stability test
## ------------------------------------
## Joint Statistic: 2.2522
## Individual Statistics:
## mu 0.49608
## ma2 0.02386
## omega 0.71209
## alpha1 0.32890
## beta1 0.34651
## shape 0.21824
##
## Asymptotic Critical Values (10% 5% 1%)
## Joint Statistic: 1.49 1.68 2.12
## Individual Statistic: 0.35 0.47 0.75
##
## Sign Bias Test
## ------------------------------------
## t-value prob sig
## Sign Bias 1.011 0.31220
## Negative Sign Bias 2.247 0.02476 **
## Positive Sign Bias 1.312 0.18958
## Joint Effect 8.185 0.04234 **
##
##
## Adjusted Pearson Goodness-of-Fit Test:
## ------------------------------------
## group statistic p-value(g-1)
## 1 20 16.58 0.6181
## 2 30 28.26 0.5041
## 3 40 30.65 0.8279
## 4 50 52.59 0.3370
##
##
## Elapsed time : 0.783998
fCSI300sged <- ugarchfit(data = rt$CSI300, spec = garch_CSI300sged)
## Warning in arima(data, order = c(modelinc[2], 0, modelinc[3]), include.mean =
## modelinc[1], : possible convergence problem: optim gave code = 1
fCSI300sged
##
## *---------------------------------*
## * GARCH Model Fit *
## *---------------------------------*
##
## Conditional Variance Dynamics
## -----------------------------------
## GARCH Model : sGARCH(1,1)
## Mean Model : ARFIMA(3,0,3)
## Distribution : sged
##
## Optimal Parameters
## ------------------------------------
## Estimate Std. Error t value Pr(>|t|)
## mu -0.000165 0.000324 -0.50788 0.611538
## ar1 -0.011627 0.028078 -0.41408 0.678816
## ar2 -0.924121 0.023691 -39.00738 0.000000
## ar3 -0.067023 0.189074 -0.35448 0.722981
## ma1 0.000000 NA NA NA
## ma2 0.914926 0.040845 22.40001 0.000000
## ma3 0.071187 0.210391 0.33836 0.735094
## omega 0.000005 0.000002 3.12513 0.001777
## alpha1 0.068340 0.007258 9.41570 0.000000
## beta1 0.898900 0.012508 71.86375 0.000000
## skew 0.984190 0.039129 25.15258 0.000000
## shape 1.356402 0.069037 19.64748 0.000000
##
## Robust Standard Errors:
## Estimate Std. Error t value Pr(>|t|)
## mu -0.000165 0.000511 -0.32239 0.747156
## ar1 -0.011627 0.051311 -0.22659 0.820741
## ar2 -0.924121 0.026718 -34.58819 0.000000
## ar3 -0.067023 0.577031 -0.11615 0.907533
## ma1 0.000000 NA NA NA
## ma2 0.914926 0.104017 8.79592 0.000000
## ma3 0.071187 0.652867 0.10904 0.913172
## omega 0.000005 0.000003 1.94617 0.051634
## alpha1 0.068340 0.014150 4.82965 0.000001
## beta1 0.898900 0.011239 79.98399 0.000000
## skew 0.984190 0.077503 12.69867 0.000000
## shape 1.356402 0.082990 16.34416 0.000000
##
## LogLikelihood : 4426.585
##
## Information Criteria
## ------------------------------------
##
## Akaike -6.0654
## Bayes -6.0254
## Shibata -6.0655
## Hannan-Quinn -6.0505
##
## Weighted Ljung-Box Test on Standardized Residuals
## ------------------------------------
## statistic p-value
## Lag[1] 1.799 0.17986
## Lag[2*(p+q)+(p+q)-1][17] 10.279 0.01877
## Lag[4*(p+q)+(p+q)-1][29] 13.942 0.62195
## d.o.f=6
## H0 : No serial correlation
##
## Weighted Ljung-Box Test on Standardized Squared Residuals
## ------------------------------------
## statistic p-value
## Lag[1] 3.590 0.05812
## Lag[2*(p+q)+(p+q)-1][5] 4.561 0.19194
## Lag[4*(p+q)+(p+q)-1][9] 5.101 0.41476
## d.o.f=2
##
## Weighted ARCH LM Tests
## ------------------------------------
## Statistic Shape Scale P-Value
## ARCH Lag[3] 0.5457 0.500 2.000 0.4601
## ARCH Lag[5] 0.6388 1.440 1.667 0.8420
## ARCH Lag[7] 1.0646 2.315 1.543 0.9028
##
## Nyblom stability test
## ------------------------------------
## Joint Statistic: 3.0517
## Individual Statistics:
## mu 0.43568
## ar1 0.04773
## ar2 0.22416
## ar3 0.06763
## ma2 0.18256
## ma3 0.06810
## omega 0.68783
## alpha1 0.32857
## beta1 0.36617
## skew 0.44371
## shape 0.23899
##
## Asymptotic Critical Values (10% 5% 1%)
## Joint Statistic: 2.49 2.75 3.27
## Individual Statistic: 0.35 0.47 0.75
##
## Sign Bias Test
## ------------------------------------
## t-value prob sig
## Sign Bias 1.213 0.22536
## Negative Sign Bias 2.423 0.01553 **
## Positive Sign Bias 1.347 0.17831
## Joint Effect 8.760 0.03267 **
##
##
## Adjusted Pearson Goodness-of-Fit Test:
## ------------------------------------
## group statistic p-value(g-1)
## 1 20 19.27 0.4393
## 2 30 27.64 0.5372
## 3 40 39.99 0.4260
## 4 50 45.30 0.6237
##
##
## Elapsed time : 2.990064
# vni
garch_vni <- ugarchspec(mean.model = list(armaOrder = c(0,0),include.mean = TRUE),
variance.model = list(model = "sGARCH",garchOrder = c(1,1)),
distribution.model = 'ged')
fvni <- ugarchfit(data = tsln.1$VNI, spec = garch_vni)
fvni
##
## *---------------------------------*
## * GARCH Model Fit *
## *---------------------------------*
##
## Conditional Variance Dynamics
## -----------------------------------
## GARCH Model : sGARCH(1,1)
## Mean Model : ARFIMA(0,0,0)
## Distribution : ged
##
## Optimal Parameters
## ------------------------------------
## Estimate Std. Error t value Pr(>|t|)
## mu 0.000397 0.000219 1.8174 0.069152
## omega 0.000005 0.000004 1.3272 0.184434
## alpha1 0.125209 0.002771 45.1776 0.000000
## beta1 0.844694 0.015303 55.1964 0.000000
## shape 1.080865 0.032809 32.9438 0.000000
##
## Robust Standard Errors:
## Estimate Std. Error t value Pr(>|t|)
## mu 0.000397 0.000522 0.76074 0.446813
## omega 0.000005 0.000019 0.29174 0.770486
## alpha1 0.125209 0.064761 1.93341 0.053186
## beta1 0.844694 0.092934 9.08917 0.000000
## shape 1.080865 0.095245 11.34831 0.000000
##
## LogLikelihood : 9084.779
##
## Information Criteria
## ------------------------------------
##
## Akaike -6.2361
## Bayes -6.2258
## Shibata -6.2361
## Hannan-Quinn -6.2324
##
## Weighted Ljung-Box Test on Standardized Residuals
## ------------------------------------
## statistic p-value
## Lag[1] 11.17 0.0008335
## Lag[2*(p+q)+(p+q)-1][2] 12.32 0.0004672
## Lag[4*(p+q)+(p+q)-1][5] 14.56 0.0005840
## d.o.f=0
## H0 : No serial correlation
##
## Weighted Ljung-Box Test on Standardized Squared Residuals
## ------------------------------------
## statistic p-value
## Lag[1] 0.004578 0.9461
## Lag[2*(p+q)+(p+q)-1][5] 0.208392 0.9919
## Lag[4*(p+q)+(p+q)-1][9] 0.398738 0.9993
## d.o.f=2
##
## Weighted ARCH LM Tests
## ------------------------------------
## Statistic Shape Scale P-Value
## ARCH Lag[3] 0.2128 0.500 2.000 0.6446
## ARCH Lag[5] 0.3622 1.440 1.667 0.9233
## ARCH Lag[7] 0.3832 2.315 1.543 0.9877
##
## Nyblom stability test
## ------------------------------------
## Joint Statistic: 9.32
## Individual Statistics:
## mu 5.45552
## omega 0.58299
## alpha1 0.04967
## beta1 0.05092
## shape 0.07576
##
## Asymptotic Critical Values (10% 5% 1%)
## Joint Statistic: 1.28 1.47 1.88
## Individual Statistic: 0.35 0.47 0.75
##
## Sign Bias Test
## ------------------------------------
## t-value prob sig
## Sign Bias 3.5976 3.266e-04 ***
## Negative Sign Bias 0.3066 7.592e-01
## Positive Sign Bias 1.6889 9.135e-02 *
## Joint Effect 38.8957 1.826e-08 ***
##
##
## Adjusted Pearson Goodness-of-Fit Test:
## ------------------------------------
## group statistic p-value(g-1)
## 1 20 125.4 1.075e-17
## 2 30 157.5 1.317e-19
## 3 40 183.0 1.593e-20
## 4 50 224.6 2.581e-24
##
##
## Elapsed time : 0.9870448
# Sau khi lựa chọn mô hình tốt thông qua AIC thì sẽ đặt tên chốt mô hình
# VD mô hình của CSI300 có phân phối sged là tốt nhất thì sẽ chốt mô hình
bfCSI300 <- fCSI300sged
bfvni <- fvni
# lay phan du của mô hình
rs_CSI300 <- residuals(bfCSI300)/sigma(bfCSI300)
rs_vni <- residuals(bfvni)/sigma(bfvni)
# bieu do histogram của phan du CSI300
ggplot(rs_CSI300, aes(x=rs_CSI300)) +
geom_histogram(aes(y = ..density..),binwidth = 0.05, fill = "navy", alpha = 0.5) +
geom_density(color = "red") +
labs(title = "Histogram with Density Plot", x = "Value", y = "Density") +
theme_minimal()
## Warning: The dot-dot notation (`..density..`) was deprecated in ggplot2 3.4.0.
## ℹ Please use `after_stat(density)` instead.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.
## Don't know how to automatically pick scale for object of type <xts/zoo>.
## Defaulting to continuous.

# bieu do histogram của phan du vni
ggplot(rs_vni, aes(x=rs_vni)) +
geom_histogram(aes(y = ..density..),binwidth = 0.05, fill = "navy", alpha = 0.5) +
geom_density(color = "red") +
labs(title = "Histogram with Density Plot", x = "Value", y = "Density") +
theme_minimal()
## Don't know how to automatically pick scale for object of type <xts/zoo>.
## Defaulting to continuous.

# kiểm định xem phân dư có phải là phân phối đó không(distribution)
# Nếu như mà pvalue lon hơn 0.05 thì đúng là phân phối đó
fitdist(distribution = "sged", rs_CSI300, control = list())
## $pars
## mu sigma skew shape
## -0.0051555 0.9971507 0.9818874 1.3585151
##
## $convergence
## [1] 0
##
## $values
## [1] 2067.993 2034.143 2034.143
##
## $lagrange
## [1] 0
##
## $hessian
## [,1] [,2] [,3] [,4]
## [1,] 1661.75486 157.83797 -450.98834 -20.36565
## [2,] 157.83797 1990.16671 -56.07376 154.84044
## [3,] -450.98834 -56.07376 979.81256 77.29642
## [4,] -20.36565 154.84044 77.29642 239.36588
##
## $ineqx0
## NULL
##
## $nfuneval
## [1] 90
##
## $outer.iter
## [1] 2
##
## $elapsed
## Time difference of 0.296145 secs
##
## $vscale
## [1] 1 1 1 1 1
ppCSI300 <- pdist(distribution = "sged", q = rs_CSI300, mu = -0.01939748 , sigma = 1.00046879,
skew =0.90303842,
shape = 1.32455112)
ad.test(ppCSI300,punif)
##
## Anderson-Darling GoF Test
##
## data: ppCSI300 and punif
## AD = 1.1851, p-value = 0.2733
## alternative hypothesis: NA
fitdist(distribution = "sged", rs_vni, control = list())
## $pars
## mu sigma skew shape
## -0.03945386 0.98548017 0.82952145 1.15719938
##
## $convergence
## [1] 0
##
## $values
## [1] 4159.575 3926.430 3926.430
##
## $lagrange
## [1] 0
##
## $hessian
## [,1] [,2] [,3] [,4]
## [1,] 6275.5848 1953.1649 -4675.3526 134.3469
## [2,] 1953.1649 3946.4692 -927.5763 551.7278
## [3,] -4675.3526 -927.5763 8339.2922 293.9490
## [4,] 134.3469 551.7278 293.9490 716.0586
##
## $ineqx0
## NULL
##
## $nfuneval
## [1] 103
##
## $outer.iter
## [1] 2
##
## $elapsed
## Time difference of 0.728766 secs
##
## $vscale
## [1] 1 1 1 1 1
ppvni <- pdist(distribution = "sged", q = rs_vni, mu = -0.09274464 , sigma = 0.98803583,
skew =0.84413499,
shape = 1.09437326)
ad.test(ppvni,punif)
##
## Anderson-Darling GoF Test
##
## data: ppvni and punif
## AD = 15.546, p-value = 2.06e-07
## alternative hypothesis: NA
# Giả sử u1 dài hơn u2, cắt u1 cho khớp với u2
if (length(ppCSI300) > length(ppvni)) {
ppCSI300 <- ppCSI300[1:length(ppvni)]
} else if (length(ppvni) > length(ppCSI300)) {
ppvni <- ppvni[1:length(ppCSI300)]
}
# ước lượng mô hình copula
BiCopSelect(ppCSI300, ppvni, familyset= 1:9, selectioncrit="AIC",indeptest = FALSE, level = 0.05)
## Bivariate copula: Gaussian (par = 0.05, tau = 0.03)
Stu <- BiCopEst(ppCSI300, ppvni, family = 14, method = "mle", se = T, max.df = 10)
summary(Stu)
## Family
## ------
## No: 14
## Name: Survival Gumbel
##
## Parameter(s)
## ------------
## par: 1.02 (SE = 0.01)
##
## Dependence measures
## -------------------
## Kendall's tau: 0.02 (empirical = 0.03, p value = 0.15)
## Upper TD: 0
## Lower TD: 0.02
##
## Fit statistics
## --------------
## logLik: 0.84
## AIC: 0.32
## BIC: 5.6
LS0tDQp0aXRsZTogJyoqVEnhu4JVIExV4bqsTiBNw5ROIEPDgUMgTcOUIEjDjE5IIE5H4bqqVSBOSEnDik4qKicNCmF1dGhvcjogIkhvw6BuZyBU4bqlbiBQaMOhdCwgMjIyMTAwMDMxNyAtIEdWIEjGsOG7m25nIGThuqtuOiBUaOG6p3kgTmd1eeG7hW4gVHXhuqVuIER1eSINCmRhdGU6ICJUcsaw4budbmcgxJDhuqFpIGjhu41jIFTDoGkgY2jDrW5oIC0gTWFya2V0aW5nLCB0aMOhbmcgMDggbsSDbSAyMDI0Ig0Kb3V0cHV0Og0KICBodG1sX2RvY3VtZW50Og0KICAgIHRvYzogdHJ1ZQ0KICAgIHRvY19mbG9hdDogdHJ1ZQ0KICAgIGNzczogc3R5bGVzLmNzcw0KICAgIGhpZ2h0bGlnaHQ6IGthdGUNCiAgICBjb2RlX2ZvbGRpbmc6IGhpZGUNCiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlDQogIHdvcmRfZG9jdW1lbnQ6DQogICAgdG9jOiB0cnVlDQotLS0NCg0KDQoqKioNCg0KDQoNCmBgYHtyfQ0KbGlicmFyeSh4bHN4KSANCmxpYnJhcnkocXVhbnRtb2QpDQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCmxpYnJhcnkoeHRzKQ0KbGlicmFyeShQZXJmb3JtYW5jZUFuYWx5dGljcykNCmxpYnJhcnkoZm9yZWNhc3QpDQpsaWJyYXJ5KHJ1Z2FyY2gpDQpsaWJyYXJ5KGdvZnRlc3QpDQpsaWJyYXJ5KFZpbmVDb3B1bGEpDQpsaWJyYXJ5KHRzZXJpZXMpDQpsaWJyYXJ5KEZpblRTKQ0KbGlicmFyeShnZ3Bsb3QyKQ0KbGlicmFyeShjb3JycGxvdCkNCmxpYnJhcnkoZ2djb3JycGxvdCkNCmxpYnJhcnkoYVRTQSkNCmxpYnJhcnkoQURHb2ZUZXN0KQ0KbGlicmFyeShrYWJsZUV4dHJhKQ0KbGlicmFyeShrbml0cikNCmBgYA0KDQpgYGB7cn0NCiNOaOG6rXAgZOG7ryBsaeG7h3UgY2jhu4kgc+G7kSBnacOhIFZOIEluZGV4IGPhu6dhIFZp4buHdCBOYW0gdsOgIGNo4buJIHPhu5EgZ2nDoSBDU0kzMDAgY+G7p2EgVHJ1bmcgUXXhu5FjIHbDoG8gbOG6p24gbMaw4bujdCBQMSB2w6AgUDINClAxIDwtIHJlYWQueGxzeCgnQzovVXNlcnMvSFAvRG93bmxvYWRzL1ZOSW5kZXhIaXN0b3JpY2FsRGF0YS54bHN4Jywgc2hlZXRJbmRleCA9IDEsIGhlYWRlciA9IFQpDQpQMiA8LSByZWFkLnhsc3goJ0M6L1VzZXJzL0hQL0Rvd25sb2Fkcy9TaGFuZ2hhaUNvbXBvc2l0ZUhpc3RvcmljYWxEYXRhMS54bHN4Jywgc2hlZXRJbmRleCA9IDEsIGhlYWRlciA9IFQpDQojI0toYWkgYsOhbyBk4buvIGxp4buHdSBjaHXhu5dpIHRo4budaSBnaWFuLCBz4bqvcCB44bq/cCB0aGVvIHRo4budaSBnaWFuIHRo4bupIHThu7EgdOG7qyBuZ8OgeSAwMS8wMS8yMDE4IMSR4bq/biBuZ8OgeSAwMS8wMS8yMDI0DQpWTkkgPC0geHRzKFAxWywtMV0sIG9yZGVyLmJ5ID0gUDEkRGF0ZSkNCkNTSTMwMCA8LSB4dHMoUDJbLC0xXSxvcmRlci5ieSA9IFAyJERhdGUpDQojR+G7mXAgaGFpIGNodeG7l2kgZ2nDoSBk4buxYSB0csOqbiBuaOG7r25nIG5nw6B5IHRyw7luZyBuaGF1DQpkdCA8LSBtZXJnZS54dHMoQ1NJMzAwLFZOSSxqb2luID0gJ2lubmVyJykNCiNUw61uaCB04bu3IHN14bqldCBs4bujaSBuaHXhuq1uIHRoZW8gY8O0bmcgdGjhu6ljIGxvZ3QgLSBsb2d0LTENCnJ0IDwtIENhbGN1bGF0ZVJldHVybnMoZHQsbWV0aG9kID0gJ2xvZycpDQpydCA8LSBydFstMV0NCnJ0MiA8LSBDYWxjdWxhdGVSZXR1cm5zKHJ0KQ0KcnQyIDwtIHJ0MlstMV0NCiMgbWEgaG9hIHNvIGxpZXUgKGFuKQ0Kc3R0IDwtIDE6bnJvdyhkdCkNCmR0IDwtIGRhdGEuZnJhbWUoZHQsc3R0KQ0Kc3R0LnRzbG4gPC0gMTpsZW5ndGgocnQpDQp0c2xuLjEgPC0gZGF0YS5mcmFtZShydCxzdHQudHNsbikNCmBgYA0KDQpgYGB7cn0NCiMgQmlldSBkbyBkdW9uZyBDU0kzMDANCmR0ICU+JSBnZ3Bsb3QoYWVzKHg9c3R0LHk9Q1NJMzAwKSkgKyBnZW9tX2xpbmUoKSArIHRoZW1lX2J3KCkrDQogICAgbGFicyh4PSJEYXRlIix5PSJQcmljZSIsdGl0bGUgPSAiQmnhu4N1IMSR4buTIMSRxrDhu51uZyBjaOG7iSBz4buRIENTSTMwMCIpDQpgYGANCg0KYGBge3J9DQojIEJpZXUgZG8gZHVvbmcgQ1NJMzAwDQpkdCAlPiUgZ2dwbG90KGFlcyh4PXN0dCx5PVZOSSkpICsgZ2VvbV9saW5lKCkgKyB0aGVtZV9idygpKw0KICAgIGxhYnMoeD0iRGF0ZSIseT0iUHJpY2UiLHRpdGxlID0gIkJp4buDdSDEkeG7kyDEkcaw4budbmcgY2jhu4kgc+G7kSBWTkkiKQ0KYGBgDQoNCg0KDQpgYGB7cn0NCnJ0X2RmIDwtIGFzLmRhdGEuZnJhbWUocnQpDQphIDwtIHJ0X2RmICU+JSBzdW1tYXJpc2UoTWluID0gbWluKFZOSSksDQogICAgICAgICAgICAgICAgICAgICAgTWF4ID0gbWF4KFZOSSksDQogICAgICAgICAgICAgICAgICAgICAgTWVhbiA9IG1lYW4oVk5JKSwNCiAgICAgICAgICAgICAgICAgICAgICBTdERldiA9IHNkKFZOSSksDQogICAgICAgICAgICAgICAgICAgICAgU2tld25lc3MgPSBza2V3bmVzcyhWTkkpLA0KICAgICAgICAgICAgICAgICAgICAgIEt1cnRvc2lzID0ga3VydG9zaXMoVk5JKSkNCmIgPC0gcnRfZGYgJT4lIHN1bW1hcmlzZShNaW4gPSBtaW4oQ1NJMzAwKSwNCiAgICAgICAgICAgICAgICAgICAgICBNYXggPSBtYXgoQ1NJMzAwKSwNCiAgICAgICAgICAgICAgICAgICAgICBNZWFuID0gbWVhbihDU0kzMDApLA0KICAgICAgICAgICAgICAgICAgICAgIFN0RGV2ID0gc2QoQ1NJMzAwKSwNCiAgICAgICAgICAgICAgICAgICAgICBTa2V3bmVzcyA9IHNrZXduZXNzKENTSTMwMCksDQogICAgICAgICAgICAgICAgICAgICAgS3VydG9zaXMgPSBrdXJ0b3NpcyhDU0kzMDApKQ0KbSA8LSByYmluZChhLGIpDQpyb3duYW1lcyhtKSA8LSBjKCdWTkknLCdDU0kzMDAnKQ0Ka2FibGUobSwgZm9ybWF0ID0gJ3BhbmRvYycsIGNhcHRpb24gPSAnQuG6o25nIDE6IFRo4buRbmcga8OqIG3DtCB04bqjIGNodeG7l2kgVFNMTicsIHRhYmxlLmF0dHIgPSAic3R5bGU9J3dpZHRoOjEwMCU7JyIpICU+JSBrYWJsZV9zdHlsaW5nKGJvb3RzdHJhcF9vcHRpb25zID0gYygic3RyaXBlZCIsICJob3ZlciIsICJjb25kZW5zZWQiKSkNCmBgYA0KDQpgYGB7cn0NCnBpdm90X2xvbmdlcihydF9kZiwgY29scyA9IGV2ZXJ5dGhpbmcoKSwgbmFtZXNfdG8gPSAiVFNMTiIsIHZhbHVlc190byA9ICJWYWx1ZSIpICU+JSBnZ3Bsb3QoYWVzKHggPSBUU0xOLCB5ID0gVmFsdWUpKSArDQogIGdlb21fYm94cGxvdChmaWxsID0gIm5hdnkiLCBjb2xvciA9ICJibGFjayIpICsNCiAgdGhlbWVfbWluaW1hbCgpICsNCiAgbGFicyh0aXRsZSA9ICJIw6xuaCA3OiBCaeG7g3UgxJHhu5MgaOG7mXAgY+G7p2EgVFNMTiBWTkkgdsOgIENTSTMwMCIsDQogICAgICAgeCA9ICJDaOG7iSBz4buRIiwNCiAgICAgICB5ID0gIlThu7cgc3XhuqV0IHNpbmggbOG7o2kiKQ0KYGBgDQoNCmBgYHtyfQ0KIyBCaWV1IGRvIGR1b25nIHJ0DQpnZ3Bsb3QodHNsbi4xLGFlcyh4PXN0dC50c2xuLHk9Q1NJMzAwKSkgKyBnZW9tX2xpbmUoKSArIHRoZW1lX2J3KCkrDQogICAgbGFicyh4PSJEYXRlIix5PSIlIix0aXRsZSA9ICJCaeG7g3UgxJHhu5MgxJHGsOG7nW5nIHThu7cgc3XDonQgbOG7o2kgbmh14bqtbiBjaOG7iSBz4buRIENTSTMwMCIpDQoNCiMgQmlldSBkbyBkdW9uZyB0c2xuX3ZuaQ0KZ2dwbG90KHRzbG4uMSxhZXMoeD1zdHQudHNsbix5PVZOSSkpICsgZ2VvbV9saW5lKCkgKyB0aGVtZV9idygpKw0KICAgIGxhYnMoeD0iRGF0ZSIseT0iJSIsdGl0bGUgPSAiQmnhu4N1IMSR4buTIMSRxrDhu51uZyB04bu3IHN1w6J0IGzhu6NpIG5odeG6rW4gY2jhu4kgc+G7kSBWTkkiKQ0KYGBgDQoNCmBgYHtyfQ0KI0tp4buDbSDEkeG7i25oIHTDrW5oIGThu6tuZw0KYWRmX3ZuaSA8LSBhZGYudGVzdChydCRWTkkpDQphZGZfQ1NJMzAwIDwtIGFkZi50ZXN0KHJ0JENTSTMwMCkNCiNLaeG7g20gxJHhu4tuaCBwaMOibiBwaOG7kWkgY2h14bqpbg0KanFfdm5pIDwtIGphcnF1ZS5iZXJhLnRlc3QocnQkVk5JKQ0KanFfQ1NJMzAwIDwtIGphcnF1ZS5iZXJhLnRlc3QocnQkQ1NJMzAwKQ0KIyDGr+G7m2MgbMaw4bujbmcgdsOgIHRyw61jaCB4deG6pXQgcGjhuqduIGTGsCB04burIG3DtCBow6xuaCBBUk1BIHThu5FpIMawdQ0KYXJpbWFfVk5JIDwtIGF1dG9hcmZpbWEocnQkVk5JLGFyLm1heCA9IDIsIG1hLm1heCA9IDIsIGNyaXRlcmlvbiA9ICdBSUMnLCBtZXRob2QgPSAiZnVsbCIpDQoNCmFyaW1hX0NTSTMwMCA8LSBhdXRvYXJmaW1hKHJ0JENTSTMwMCxhci5tYXggPSAyLCBtYS5tYXggPSAyLCBjcml0ZXJpb24gPSAnQUlDJywgbWV0aG9kID0gImZ1bGwiKQ0KDQpyZV9WTkkgPC0gYXJpbWFfVk5JJGZpdEBmaXQkcmVzaWR1YWxzDQpyZV9DU0kzMDAgPC0gYXJpbWFfQ1NJMzAwJGZpdEBmaXQkcmVzaWR1YWxzDQojS2nhu4NtIMSR4buLbmggdMawxqFuZyBxdWFuIGNodeG7l2kgYuG6rWMgMiBjaG8gcGjhuqduIGTGsA0KbGpfdm5pIDwtIEJveC50ZXN0KHJlX1ZOSSx0eXBlID0gJ0xqdW5nLUJveCcsIGxhZyA9IDIpDQpsal9DU0kzMDAgPC0gQm94LnRlc3QocmVfQ1NJMzAwLHR5cGUgPSAnTGp1bmctQm94JywgbGFnID0gMikNCg0KI0tp4buDbSDEkeG7i25oIHTGsMahbmcgcXVhbiBjaHXhu5dpIGLhuq1jIDIgY2hvIHBo4bqnbiBkxrAgYsOsbmggcGjGsMahbmcNCmxqX3ZuaS4yIDwtIEJveC50ZXN0KHJlX1ZOSV4yLHR5cGUgPSAnTGp1bmctQm94JywgbGFnID0gMikNCmxqX0NTSTMwMC4yIDwtIEJveC50ZXN0KHJlX0NTSTMwMF4yLHR5cGUgPSAnTGp1bmctQm94JywgbGFnID0gMikNCg0KI0tp4buDbSDEkeG7i25oIGhp4buHdSDhu6luZyBBUkNIDQphcl92bmkgPC0gQXJjaFRlc3QocmVfVk5JLCBsYWdzID0gMikNCmFyX0NTSTMwMCA8LSBBcmNoVGVzdChyZV9DU0kzMDAsIGxhZ3MgPSAyKQ0KDQoNCmBgYA0KDQpgYGB7cn0NCiNUcsOsbmggYsOgeSBr4bq/dCBxdeG6ow0KdGVzdF9yZXN1bHQgPC0gZGF0YS5mcmFtZShUZXN0ID0gYygiSi1CIiwiUSgyKSIsIlEoMileMiIsICJBUkNIKDIpIiksDQogICAgICAgICAgICAgICAgICAgICAgICAgIFBfdmFsdWVfVk5JID0gYyhqcV92bmkkcC52YWx1ZSwgbGpfdm5pJHAudmFsdWUsIGxqX3ZuaS4yJHAudmFsdWUsIGFyX3ZuaSRwLnZhbHVlKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgUF92YWx1ZV9DU0kzMDAgPSBjKGpxX0NTSTMwMCRwLnZhbHVlLCBsal9DU0kzMDAkcC52YWx1ZSwgbGpfQ1NJMzAwLjIkcC52YWx1ZSwgYXJfQ1NJMzAwJHAudmFsdWUpKQ0Ka2FibGUodGVzdF9yZXN1bHQsIA0KICBjYXB0aW9uID0gIkLhuqNuZyAzOiBL4bq/dCBxdeG6oyBjw6FjIGtp4buDbSDEkeG7i25oIiwgDQogIGxhYmVsID0gJ0doaSBjaMO6OiBRICgyKSBhbmQgUTIgKDIpIGzhuqduIGzGsOG7o3QgbMOgIGtp4buDbSDEkeG7i25oIExqdW5nLUJveCBRMiBjaG8gdMawxqFuZyBxdWFuIGNodeG7l2kgYuG6rWMgMiBj4bunYSBwaOG6p24gZMawIHbDoCBiw6xuaCBwaMawxqFuZyBwaOG6p24gZMawIGPhu6dhIGzhu6NpIHN14bqldCcsIA0KICBmb3JtYXQgPSAncGFuZG9jJykgJT4lIGthYmxlX3N0eWxpbmcoDQogICAgICAgICAgICBib290c3RyYXBfb3B0aW9ucyA9IGMoInN0cmlwZWQiLCAiaG92ZXIiLCAiY29uZGVuc2VkIiksIA0KICAgICAgICAgICAgZnVsbF93aWR0aCA9IEYpDQpgYGANCg0KDQpgYGB7cn0NCnBlYXJzb24gPC0gY29yKHJ0JFZOSSxydCRDU0kzMDAsIG1ldGhvZD0icGVhcnNvbiIpDQpzcGVhcm1hbiA8LSBjb3IocnQkVk5JLHJ0JENTSTMwMCwgbWV0aG9kPSJzcGVhcm1hbiIpDQprZW5kYWxsIDwtIGNvcihydCRWTkkscnQkQ1NJMzAwLCBtZXRob2Q9ImtlbmRhbGwiKQ0KDQojVHLDrG5oIGLDoHkga+G6v3QgcXXhuqMNCnJlbGF0IDwtIGRhdGEuZnJhbWUoJ1TGsMahbmcgcXVhbicgPSAnVk5JLUNTSTMwMCcsDQogICAgICAgICAgICAgICAgICAgIFBlYXJzb24gPSBwZWFyc29uWzEsMV0sDQogICAgICAgICAgICAgICAgICAgIHNwZWFybWFuID0gc3BlYXJtYW5bMSwxXSwNCiAgICAgICAgICAgICAgICAgICAgS2VuZGFsbCA9IGtlbmRhbGxbMSwxXSkNCmthYmxlKHJlbGF0LCANCiAgICAgIGNvbC5uYW1lcyA9IGMoIlBoxrDGoW5nIHBow6FwIiwgIlBlYXJzb24iLCAiU3BlYXJtYW4iLCJLZW5kYWxsIiksDQogICAgICBjYXB0aW9uID0gIkLhuqNuZyA0OiBL4bq/dCBxdeG6oyBo4buHIHPhu5EgdMawxqFuZyBxdWFuIiwNCiAgICAgIGZvcm1hdCA9ICdwYW5kb2MnLA0KICAgICAgYWxpZ24gPSBjKCJsIiwgImMiLCAiYyIpKSAlPiUNCiAga2FibGVfc3R5bGluZyhib290c3RyYXBfb3B0aW9ucyA9IGMoInN0cmlwZWQiLCAiaG92ZXIiLCAiY29uZGVuc2VkIiksIGZ1bGxfd2lkdGggPSBGQUxTRSkNCmBgYA0KDQpgYGB7cn0NCnBhcihtZnJvdyA9IGMoMSwyKSkNCg0KY29yciA8LSBjb3IocnQpDQpnZ2NvcnJwbG90KGNvcnIsIGhjLm9yZGVyID0gVFJVRSwNCiAgIG91dGxpbmUuY29sID0gIndoaXRlIiwNCiAgIGdndGhlbWUgPSBnZ3Bsb3QyOjp0aGVtZV9ncmF5LA0KICAgY29sb3JzID0gYygibmF2eSIsICJ3aGl0ZSIsICJnb2xkIiksDQogICBsYWIgPSBUUlVFLCBsYWJfY29sID0gJ2JsYWNrJyx0aXRsZSA9ICdIw6xuaCA4OiBUcuG7sWMgcXVhbiBow7NhIGjhu4cgc+G7kSB0xrDGoW5nIHF1YW4gduG7m2kgcGjGsMahbmcgcGjDoXAgUGVhcnNvbicpDQpgYGANCg0KYGBge3J9DQpjaGFydC5Db3JyZWxhdGlvbihydCwgaGlzdG9ncmFtPVRSVUUsIHBjaD0xOSkNCmBgYA0KDQpgYGB7cn0NCnJ0ICU+JSBnZ3Bsb3QoYWVzKFZOSSwgQ1NJMzAwKSkgKw0KICAgICAgICAgICAgICBnZW9tX3BvaW50KGNvbCA9ICdnb2xkJyxzaGFwZSA9IFRSVUUpICsgDQogICAgICAgICAgICAgIGdlb21fc21vb3RoKG1ldGhvZCA9ICdsbScsc2UgPSBULCBjb2wgPSAnbmF2eScpICsgI3Row6ptIMSRxrDhu51uZyBo4buTaSBxdXkgduG7m2kgcGjGsMahbmcgcGjDoXAgaOG7k2kgcXV5IHR1eeG6v24gdMOtbmggIA0KICAgICAgICAgICAgICBsYWJzKHRpdGxlID0gJ0jDrG5oIDExOiBCaeG7g3UgxJHhu5MgU2NhdHRlciBUU0xOIGPhu6dhIENTSTMwMCB2w6AgVk5JJywgeCA9ICdWTkknLCB5ID0gJ0NTSTMwMCcpDQpgYGANCg0KYGBge3J9DQojQ1NJMzAwDQoNCmFybWFfQ1NJMzAwIDwtIGF1dG9hcmZpbWEocnQkQ1NJMzAwLGFyLm1heCA9IDIsbWEubWF4ID0gMiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgY3JpdGVyaW9uID0gIkFJQyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZCA9ICJmdWxsIikNCmFybWFfQ1NJMzAwJGZpdA0KcGxvdChhcm1hX0NTSTMwMFtbImZpdCJdXUBmaXRbWyJyZXNpZHVhbHMiXV0sdHlwZT0ibCIpDQoNCmdncGxvdCh0c2xuLjEsYWVzKHg9c3R0LnRzbG4seT1DU0kzMDApKSArIGdlb21fbGluZSgpICsgdGhlbWVfYncoKSsNCiAgICBsYWJzKHg9IkRhdGUiLHk9IiUiLHRpdGxlID0gIkJp4buDdSDEkeG7kyDEkcaw4budbmcgdOG7tyBzdcOidCBs4bujaSBuaHXhuq1uIGNo4buJIHPhu5EgQ1NJMzAwIikNCg0KIyB2bmkNCg0KYXJtYV92bmkgPC0gYXV0b2FyZmltYShydCRWTkksYXIubWF4ID0gMixtYS5tYXggPSAyLA0KICAgICAgICAgICAgICAgICAgICAgICBjcml0ZXJpb24gPSAiQUlDIiwNCiAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kID0gImZ1bGwiKQ0KYXJtYV92bmkkZml0DQpwbG90KGFybWFfQ1NJMzAwW1siZml0Il1dQGZpdFtbInJlc2lkdWFscyJdXSx0eXBlPSJsIikNCg0KZ2dwbG90KHRzbG4uMSxhZXMoeD1zdHQudHNsbix5PVZOSSkpICsgZ2VvbV9saW5lKCkgKyB0aGVtZV9idygpKw0KICAgIGxhYnMoeD0iRGF0ZSIseT0iJSIsdGl0bGUgPSAiQmnhu4N1IMSR4buTIMSRxrDhu51uZyB04bu3IHN1w6J0IGzhu6NpIG5odeG6rW4gY2jhu4kgc+G7kSBWTkkiKQ0KDQpgYGANCg0KYGBge3J9DQojIENTSTMwMA0KDQojIG5ldSBuaHUgYXJtYSBjbyB0aGFuaCBwaGFuIG5hbyA9IDAgdGhpIHNlIGR1bmcgY2F1IGxlbmggbmF5IGRlIHNldHVwICJmaXhlZC5wYXJzID0gbGlzdChhcjEgPSAwLCBtYTEgPSAwKSINCmdhcmNoX0NTSTMwMG5vcm0gPC0gdWdhcmNoc3BlYyhtZWFuLm1vZGVsID0gbGlzdChhcm1hT3JkZXIgPSBjKDIsMCksaW5jbHVkZS5tZWFuID0gRkFMU0UpLA0KICAgICAgICAgICAgICAgICB2YXJpYW5jZS5tb2RlbCA9IGxpc3QobW9kZWwgPSAic0dBUkNIIixnYXJjaE9yZGVyID0gYygxLDEpKSwNCiAgICAgICAgICAgICAgICAgZml4ZWQucGFycyA9IGxpc3QoIGFyMSA9IDApLA0KICAgICAgICAgICAgICAgICBkaXN0cmlidXRpb24ubW9kZWwgPSAnbm9ybScpDQoNCmdhcmNoX0NTSTMwMHN0ZCA8LSB1Z2FyY2hzcGVjKG1lYW4ubW9kZWwgPSBsaXN0KGFybWFPcmRlciA9IGMoMCwyKSxpbmNsdWRlLm1lYW4gPSBUUlVFKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlhbmNlLm1vZGVsID0gbGlzdChtb2RlbCA9ICJzR0FSQ0giLGdhcmNoT3JkZXIgPSBjKDEsMSkpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgZml4ZWQucGFycyA9IGxpc3QoYXIxID0gMCwgbWExID0gMCksDQogICAgICAgICAgICAgICAgICAgICAgICAgICBkaXN0cmlidXRpb24ubW9kZWwgPSAnc3RkJykNCg0KZ2FyY2hfQ1NJMzAwc3N0ZCA8LSB1Z2FyY2hzcGVjKG1lYW4ubW9kZWwgPSBsaXN0KGFybWFPcmRlciA9IGMoMCwyKSxpbmNsdWRlLm1lYW4gPSBUUlVFKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlhbmNlLm1vZGVsID0gbGlzdChtb2RlbCA9ICJzR0FSQ0giLGdhcmNoT3JkZXIgPSBjKDEsMSkpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgZml4ZWQucGFycyA9IGxpc3QoYXIxID0gMCwgbWExID0gMCksDQogICAgICAgICAgICAgICAgICAgICAgICAgICBkaXN0cmlidXRpb24ubW9kZWwgPSAnc3N0ZCcpDQoNCmdhcmNoX0NTSTMwMGdlZCA8LSB1Z2FyY2hzcGVjKG1lYW4ubW9kZWwgPSBsaXN0KGFybWFPcmRlciA9IGMoMCwyKSxpbmNsdWRlLm1lYW4gPSBUUlVFKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlhbmNlLm1vZGVsID0gbGlzdChtb2RlbCA9ICJzR0FSQ0giLGdhcmNoT3JkZXIgPSBjKDEsMSkpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgZml4ZWQucGFycyA9IGxpc3QoYXIxID0gMCwgbWExID0gMCksDQogICAgICAgICAgICAgICAgICAgICAgICAgICBkaXN0cmlidXRpb24ubW9kZWwgPSAnZ2VkJykNCg0KZ2FyY2hfQ1NJMzAwc2dlZCA8LSB1Z2FyY2hzcGVjKG1lYW4ubW9kZWwgPSBsaXN0KGFybWFPcmRlciA9IGMoMywzKSxpbmNsdWRlLm1lYW4gPSBUUlVFKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlhbmNlLm1vZGVsID0gbGlzdChtb2RlbCA9ICJzR0FSQ0giLGdhcmNoT3JkZXIgPSBjKDEsMSkpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgZml4ZWQucGFycyA9IGxpc3QoIG1hMSA9IDApLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzdHJpYnV0aW9uLm1vZGVsID0gJ3NnZWQnKQ0KDQoNCmZDU0kzMDBub3JtIDwtIHVnYXJjaGZpdChkYXRhID0gcnQkQ1NJMzAwLCBzcGVjID0gZ2FyY2hfQ1NJMzAwbm9ybSkNCmZDU0kzMDBub3JtDQoNCmZDU0kzMDBzdGQgPC0gdWdhcmNoZml0KGRhdGEgPSBydCRDU0kzMDAsIHNwZWMgPSBnYXJjaF9DU0kzMDBzdGQpDQpmQ1NJMzAwc3RkDQoNCmZDU0kzMDBzc3RkIDwtIHVnYXJjaGZpdChkYXRhID0gcnQkQ1NJMzAwLCBzcGVjID0gZ2FyY2hfQ1NJMzAwc3N0ZCkNCmZDU0kzMDBzc3RkDQoNCmZDU0kzMDBnZWQgPC0gdWdhcmNoZml0KGRhdGEgPSBydCRDU0kzMDAsIHNwZWMgPSBnYXJjaF9DU0kzMDBnZWQpDQpmQ1NJMzAwZ2VkDQoNCmZDU0kzMDBzZ2VkIDwtIHVnYXJjaGZpdChkYXRhID0gcnQkQ1NJMzAwLCBzcGVjID0gZ2FyY2hfQ1NJMzAwc2dlZCkNCmZDU0kzMDBzZ2VkDQoNCiMgdm5pIA0KZ2FyY2hfdm5pIDwtIHVnYXJjaHNwZWMobWVhbi5tb2RlbCA9IGxpc3QoYXJtYU9yZGVyID0gYygwLDApLGluY2x1ZGUubWVhbiA9IFRSVUUpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFuY2UubW9kZWwgPSBsaXN0KG1vZGVsID0gInNHQVJDSCIsZ2FyY2hPcmRlciA9IGMoMSwxKSksDQogICAgICAgICAgICAgICAgICAgICAgICAgICBkaXN0cmlidXRpb24ubW9kZWwgPSAnZ2VkJykNCmZ2bmkgPC0gdWdhcmNoZml0KGRhdGEgPSB0c2xuLjEkVk5JLCBzcGVjID0gZ2FyY2hfdm5pKQ0KZnZuaQ0KYGBgDQoNCmBgYHtyfQ0KIyBTYXUga2hpIGzhu7FhIGNo4buNbiBtw7QgaMOsbmggdOG7kXQgdGjDtG5nIHF1YSBBSUMgdGjDrCBz4bq9IMSR4bq3dCB0w6puIGNo4buRdCBtw7QgaMOsbmgNCiMgVkQgbcO0IGjDrG5oIGPhu6dhIENTSTMwMCBjw7MgcGjDom4gcGjhu5FpIHNnZWQgbMOgIHThu5F0IG5o4bqldCB0aMOsIHPhur0gY2jhu5F0IG3DtCBow6xuaA0KDQpiZkNTSTMwMCA8LSBmQ1NJMzAwc2dlZA0KDQpiZnZuaSA8LSAgZnZuaQ0KYGBgDQoNCg0KYGBge3J9DQojIGxheSBwaGFuIGR1IGPhu6dhIG3DtCBow6xuaA0KcnNfQ1NJMzAwIDwtIHJlc2lkdWFscyhiZkNTSTMwMCkvc2lnbWEoYmZDU0kzMDApDQpyc192bmkgPC0gcmVzaWR1YWxzKGJmdm5pKS9zaWdtYShiZnZuaSkNCg0KYGBgDQoNCg0KYGBge3J9DQojIGJpZXUgZG8gaGlzdG9ncmFtIGPhu6dhIHBoYW4gZHUgQ1NJMzAwDQpnZ3Bsb3QocnNfQ1NJMzAwLCBhZXMoeD1yc19DU0kzMDApKSArDQogICAgZ2VvbV9oaXN0b2dyYW0oYWVzKHkgPSAuLmRlbnNpdHkuLiksYmlud2lkdGggPSAwLjA1LCBmaWxsID0gIm5hdnkiLCBhbHBoYSA9IDAuNSkgKw0KICAgIGdlb21fZGVuc2l0eShjb2xvciA9ICJyZWQiKSArDQogICAgbGFicyh0aXRsZSA9ICJIaXN0b2dyYW0gd2l0aCBEZW5zaXR5IFBsb3QiLCB4ID0gIlZhbHVlIiwgeSA9ICJEZW5zaXR5IikgKw0KICAgIHRoZW1lX21pbmltYWwoKQ0KIyBiaWV1IGRvIGhpc3RvZ3JhbSBj4bunYSBwaGFuIGR1IHZuaSANCmdncGxvdChyc192bmksIGFlcyh4PXJzX3ZuaSkpICsNCiAgICBnZW9tX2hpc3RvZ3JhbShhZXMoeSA9IC4uZGVuc2l0eS4uKSxiaW53aWR0aCA9IDAuMDUsIGZpbGwgPSAibmF2eSIsIGFscGhhID0gMC41KSArDQogICAgZ2VvbV9kZW5zaXR5KGNvbG9yID0gInJlZCIpICsNCiAgICBsYWJzKHRpdGxlID0gIkhpc3RvZ3JhbSB3aXRoIERlbnNpdHkgUGxvdCIsIHggPSAiVmFsdWUiLCB5ID0gIkRlbnNpdHkiKSArDQogICAgdGhlbWVfbWluaW1hbCgpDQpgYGANCg0KYGBge3J9DQojIGtp4buDbSDEkeG7i25oIHhlbSBwaMOibiBkxrAgY8OzIHBo4bqjaSBsw6AgcGjDom4gcGjhu5FpIMSRw7Mga2jDtG5nKGRpc3RyaWJ1dGlvbikNCiMgTuG6v3UgbmjGsCBtw6AgcHZhbHVlIGxvbiBoxqFuIDAuMDUgdGjDrCDEkcO6bmcgbMOgIHBow6JuIHBo4buRaSDEkcOzDQoNCmZpdGRpc3QoZGlzdHJpYnV0aW9uID0gInNnZWQiLCByc19DU0kzMDAsIGNvbnRyb2wgPSBsaXN0KCkpDQpwcENTSTMwMCA8LSBwZGlzdChkaXN0cmlidXRpb24gPSAic2dlZCIsIHEgPSByc19DU0kzMDAsIG11ID0gLTAuMDE5Mzk3NDggLCBzaWdtYSA9IDEuMDAwNDY4NzksDQogICAgICAgICAgIHNrZXcgPTAuOTAzMDM4NDIsDQogICAgICAgICAgIHNoYXBlID0gMS4zMjQ1NTExMikgDQphZC50ZXN0KHBwQ1NJMzAwLHB1bmlmKSANCg0KDQpmaXRkaXN0KGRpc3RyaWJ1dGlvbiA9ICJzZ2VkIiwgcnNfdm5pLCBjb250cm9sID0gbGlzdCgpKQ0KcHB2bmkgPC0gcGRpc3QoZGlzdHJpYnV0aW9uID0gInNnZWQiLCBxID0gcnNfdm5pLCBtdSA9IC0wLjA5Mjc0NDY0ICwgc2lnbWEgPSAwLjk4ODAzNTgzLA0KICAgICAgICAgICAgICAgc2tldyA9MC44NDQxMzQ5OSwNCiAgICAgICAgICAgICAgIHNoYXBlID0gMS4wOTQzNzMyNikNCmFkLnRlc3QocHB2bmkscHVuaWYpIA0KYGBgDQoNCmBgYHtyfQ0KIyBHaeG6oyBz4butIHUxIGTDoGkgaMahbiB1MiwgY+G6r3QgdTEgY2hvIGto4bubcCB24bubaSB1Mg0KaWYgKGxlbmd0aChwcENTSTMwMCkgPiBsZW5ndGgocHB2bmkpKSB7DQogICAgcHBDU0kzMDAgPC0gcHBDU0kzMDBbMTpsZW5ndGgocHB2bmkpXQ0KfSBlbHNlIGlmIChsZW5ndGgocHB2bmkpID4gbGVuZ3RoKHBwQ1NJMzAwKSkgew0KICAgIHBwdm5pIDwtIHBwdm5pWzE6bGVuZ3RoKHBwQ1NJMzAwKV0NCn0NCiMgxrDhu5tjIGzGsOG7o25nIG3DtCBow6xuaCBjb3B1bGENCg0KQmlDb3BTZWxlY3QocHBDU0kzMDAsIHBwdm5pLCBmYW1pbHlzZXQ9IDE6OSwgc2VsZWN0aW9uY3JpdD0iQUlDIixpbmRlcHRlc3QgPSBGQUxTRSwgbGV2ZWwgPSAwLjA1KQ0KU3R1IDwtIEJpQ29wRXN0KHBwQ1NJMzAwLCBwcHZuaSwgZmFtaWx5ID0gMTQsIG1ldGhvZCA9ICJtbGUiLCBzZSA9IFQsIG1heC5kZiA9IDEwKSANCnN1bW1hcnkoU3R1KSANCg0KYGBgDQoNCg==