Sys.setlocale("LC_ALL","C")
[1] "C/C/C/C/C/en_US.UTF-8"
packages = c(
"dplyr","ggplot2","d3heatmap","googleVis","devtools","plotly", "xgboost",
"magrittr","caTools","ROCR","corrplot", "rpart", "rpart.plot",
"doParallel", "caret", "glmnet", "Matrix", "e1071", "randomForest",
"flexclust", "FactoMineR", "factoextra", "maps", "ggmap", "igraph", "rgl",
"tm", "SnowballC", "wordcloud", "slam", "Matrix", "RColorBrewer"
)
existing = as.character(installed.packages()[,1])
for(pkg in packages[!(packages %in% existing)]) install.packages(pkg)
rm(list=ls(all=T))
options(digits=4, scipen=12)
library(dplyr)
library(ggplot2)
library(maps)
library(ggmap)
7.1 ggplot2 繪圖套件
7.1.1 基本點狀圖
WHO <- read.csv("data/WHO.csv")
str(WHO)
'data.frame': 194 obs. of 13 variables:
$ Country : Factor w/ 194 levels "Afghanistan",..: 1 2 3 4 5 6 7 8 9 10 ...
$ Region : Factor w/ 6 levels "Africa","Americas",..: 3 4 1 4 1 2 2 4 6 4 ...
$ Population : int 29825 3162 38482 78 20821 89 41087 2969 23050 8464 ...
$ Under15 : num 47.4 21.3 27.4 15.2 47.6 ...
$ Over60 : num 3.82 14.93 7.17 22.86 3.84 ...
$ FertilityRate : num 5.4 1.75 2.83 NA 6.1 2.12 2.2 1.74 1.89 1.44 ...
$ LifeExpectancy : int 60 74 73 82 51 75 76 71 82 81 ...
$ ChildMortality : num 98.5 16.7 20 3.2 163.5 ...
$ CellularSubscribers : num 54.3 96.4 99 75.5 48.4 ...
$ LiteracyRate : num NA NA NA NA 70.1 99 97.8 99.6 NA NA ...
$ GNI : num 1140 8820 8310 NA 5230 ...
$ PrimarySchoolEnrollmentMale : num NA NA 98.2 78.4 93.1 91.1 NA NA 96.9 NA ...
$ PrimarySchoolEnrollmentFemale: num NA NA 96.4 79.4 78.2 84.5 NA NA 97.5 NA ...
# Basic Plot in R
plot(WHO$GNI, WHO$FertilityRate)

library(ggplot2)
# Create the ggplot object with the data and the aesthetic mapping:
scatterplot <- ggplot(WHO, aes(x = GNI, y = FertilityRate))
# ggplot2的建置方式:先建好原始模型,後續可疊加成不同類型的圖表
# Add the geom_point geometry
scatterplot + geom_point() # 點圖

# geopoint: 畫點圖的指令
# 底圖scatterplot都不要動
# Make a line graph instead:
scatterplot + geom_line() # 折線圖

# Switch back to our points:
scatterplot + geom_point() # 點圖

# Redo the plot with blue triangles instead of circles:
scatterplot + geom_point(color = "blue", size = 3, shape = 21)

# 點圖+顏色/大小/形狀
# Another option:
scatterplot + geom_point(color = "darkred", size = 3, shape = 8)

# 點圖+顏色(暗紅色)/大小/形狀
# Add a title to the plot:
scatterplot +
geom_point(colour = "blue", size = 3, shape = 17) +
ggtitle("Fertility Rate vs. Gross National Income")

7.1.2 儲存圖檔
# Save our plot:
fertilityGNIplot <- scatterplot +
geom_point(colour = "blue", size = 3, shape = 17) +
ggtitle("Fertility Rate vs. Gross National Income") # 加標題
# 儲存所做的圖片到fertilityGNIplot
pdf("MyPlot.pdf")
# 將圖片存成pdf
print(fertilityGNIplot)
dev.off()
null device
1
7.1.3 圖形元件屬性
# Color the points by region:
ggplot(WHO, aes(x = GNI, y = FertilityRate, color = Region)) +
geom_point()

# 點的「大小」、「形狀」...都可以當成一個繪圖的屬性
# Color the points according to life expectancy:
ggplot(WHO, aes(x = GNI, y = FertilityRate, color = LifeExpectancy)) +
geom_point()

# LifeExpectancy:連續變數,可用顏色深淺表示
# Is the fertility rate of a country was a good predictor of the
# percentage of the population under 15?
ggplot(WHO, aes(x = FertilityRate, y = Under15)) + geom_point()

7.1.4 數值尺度比例轉換
# Let's try a log transformation:
ggplot(WHO, aes(x = log(FertilityRate), y = Under15)) + geom_point()

# 有點歪、不是線性的圖形 >> 可以取log,這樣變數之間就會變成線性關係
7.1.5 回歸趨勢線
# Simple linear regression model to predict the percentage of the
# population under 15, using the log of the fertility rate:
mod <- lm(Under15 ~ log(FertilityRate), data = WHO)
summary(mod)
Call:
lm(formula = Under15 ~ log(FertilityRate), data = WHO)
Residuals:
Min 1Q Median 3Q Max
-10.313 -1.774 0.045 1.744 7.717
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 7.654 0.448 17.1 <2e-16 ***
log(FertilityRate) 22.055 0.418 52.8 <2e-16 ***
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Residual standard error: 2.65 on 181 degrees of freedom
(11 observations deleted due to missingness)
Multiple R-squared: 0.939, Adjusted R-squared: 0.939
F-statistic: 2.79e+03 on 1 and 181 DF, p-value: <2e-16
# Add this regression line to our plot:
ggplot(WHO, aes(x = log(FertilityRate), y = Under15)) +
geom_point() + stat_smooth(method = "lm")

# ggplot的原則:有一張底圖,想要什麼再加上去就可以了
7.1.6 趨勢線的信賴區間
# 99% confidence interval
ggplot(WHO, aes(x = log(FertilityRate), y = Under15)) +
geom_point() + stat_smooth(method = "lm", level = 0.99)

# Level:信賴區間(Confidence Interval)族群平均有99%會掉在CI」範圍內
# No confidence interval in the plot
ggplot(WHO, aes(x = log(FertilityRate), y = Under15)) +
geom_point() + stat_smooth(method = "lm", se = FALSE)

# Change the color of the regression line:
ggplot(WHO, aes(x = log(FertilityRate), y = Under15)) +
geom_point() + stat_smooth(method = "lm", colour = "orange")

7.1.7 分群點狀圖
# quiz-1:
ggplot(WHO, aes(x = FertilityRate, y = Under15, col=Region)) +
scale_color_brewer(palette="Accent") +
geom_point()

# 所有資料化成一張圖(藉由這樣的方式可以看出變數之間的關係)
7.1.8 分格點狀圖
# quiz-1:
ggplot(WHO, aes(x = log(Population), y = GNI, color=Region)) +
geom_point() +
stat_smooth(method='lm') +
facet_wrap(~Region) + theme_bw()

# facet_wrap(~Region):每個region各自畫成一張圖
# 資料視覺化:很精緻很厲害的瞭解變數之間的關聯性(不需要做其他分析也可以)
LS0tCnRpdGxlOiAiQVM3LTBBIGdncGxvdDIg57mq5ZyW5aWX5Lu2IgphdXRob3I6ICJNMDY0NjEwMDIxIOaliuWHseWAqywgMjAxOC8wNy8zMSIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKPGJyPgoKYGBge3J9ClN5cy5zZXRsb2NhbGUoIkxDX0FMTCIsIkMiKQpwYWNrYWdlcyA9IGMoCiAgImRwbHlyIiwiZ2dwbG90MiIsImQzaGVhdG1hcCIsImdvb2dsZVZpcyIsImRldnRvb2xzIiwicGxvdGx5IiwgInhnYm9vc3QiLAogICJtYWdyaXR0ciIsImNhVG9vbHMiLCJST0NSIiwiY29ycnBsb3QiLCAicnBhcnQiLCAicnBhcnQucGxvdCIsCiAgImRvUGFyYWxsZWwiLCAiY2FyZXQiLCAiZ2xtbmV0IiwgIk1hdHJpeCIsICJlMTA3MSIsICJyYW5kb21Gb3Jlc3QiLAogICJmbGV4Y2x1c3QiLCAiRmFjdG9NaW5lUiIsICJmYWN0b2V4dHJhIiwgIm1hcHMiLCAiZ2dtYXAiLCAiaWdyYXBoIiwgInJnbCIsCiAgInRtIiwgIlNub3diYWxsQyIsICJ3b3JkY2xvdWQiLCAic2xhbSIsICJNYXRyaXgiLCAiUkNvbG9yQnJld2VyIgogICkKZXhpc3RpbmcgPSBhcy5jaGFyYWN0ZXIoaW5zdGFsbGVkLnBhY2thZ2VzKClbLDFdKQpmb3IocGtnIGluIHBhY2thZ2VzWyEocGFja2FnZXMgJWluJSBleGlzdGluZyldKSBpbnN0YWxsLnBhY2thZ2VzKHBrZykKYGBgCgpgYGB7ciBlY2hvPVQsIG1lc3NhZ2U9RiwgY2FjaGU9Riwgd2FybmluZz1GfQpybShsaXN0PWxzKGFsbD1UKSkKb3B0aW9ucyhkaWdpdHM9NCwgc2NpcGVuPTEyKQpsaWJyYXJ5KGRwbHlyKQpsaWJyYXJ5KGdncGxvdDIpCmxpYnJhcnkobWFwcykKbGlicmFyeShnZ21hcCkKYGBgCgotIC0gLQoKIyMjIDcuMSBgZ2dwbG90MmAg57mq5ZyW5aWX5Lu2CgojIyMjIyA3LjEuMSDln7rmnKzpu57ni4DlnJYKYGBge3J9CldITyA8LSByZWFkLmNzdigiZGF0YS9XSE8uY3N2IikKc3RyKFdITykKYGBgCgpgYGB7cn0KIyBCYXNpYyBQbG90IGluIFIgCnBsb3QoV0hPJEdOSSwgV0hPJEZlcnRpbGl0eVJhdGUpCmBgYAoKYGBge3J9CmxpYnJhcnkoZ2dwbG90MikKIyBDcmVhdGUgdGhlIGdncGxvdCBvYmplY3Qgd2l0aCB0aGUgZGF0YSBhbmQgdGhlIGFlc3RoZXRpYyBtYXBwaW5nOgpzY2F0dGVycGxvdCA8LSBnZ3Bsb3QoV0hPLCBhZXMoeCA9IEdOSSwgeSA9IEZlcnRpbGl0eVJhdGUpKQojIGdncGxvdDLnmoTlu7rnva7mlrnlvI/vvJrlhYjlu7rlpb3ljp/lp4vmqKHlnovvvIzlvoznuozlj6/nlorliqDmiJDkuI3lkIzpoZ7lnovnmoTlnJbooagKYGBgCgpgYGB7cn0KIyBBZGQgdGhlIGdlb21fcG9pbnQgZ2VvbWV0cnkKc2NhdHRlcnBsb3QgKyBnZW9tX3BvaW50KCkgICAjIOm7nuWclgojIGdlb3BvaW50OiDnlavpu57lnJbnmoTmjIfku6QKIyDlupXlnJZzY2F0dGVycGxvdOmDveS4jeimgeWLlQpgYGAKCmBgYHtyfQojIE1ha2UgYSBsaW5lIGdyYXBoIGluc3RlYWQ6CnNjYXR0ZXJwbG90ICsgZ2VvbV9saW5lKCkgICAjIOaKmOe3muWclgpgYGAKCmBgYHtyfQojIFN3aXRjaCBiYWNrIHRvIG91ciBwb2ludHM6CnNjYXR0ZXJwbG90ICsgZ2VvbV9wb2ludCgpICAgIyDpu57lnJYKYGBgCgpgYGB7cn0KIyBSZWRvIHRoZSBwbG90IHdpdGggYmx1ZSB0cmlhbmdsZXMgaW5zdGVhZCBvZiBjaXJjbGVzOgpzY2F0dGVycGxvdCArIGdlb21fcG9pbnQoY29sb3IgPSAiYmx1ZSIsIHNpemUgPSAzLCBzaGFwZSA9IDIxKQojIOm7nuWclivpoY/oibIv5aSn5bCPL+W9oueLgApgYGAKCmBgYHtyfQojIEFub3RoZXIgb3B0aW9uOgpzY2F0dGVycGxvdCArIGdlb21fcG9pbnQoY29sb3IgPSAiZGFya3JlZCIsIHNpemUgPSAzLCBzaGFwZSA9IDgpCiMg6bue5ZyWK+mhj+iJsijmmpfntIXoibIpL+Wkp+Wwjy/lvaLni4AKYGBgCgpgYGB7cn0KIyBBZGQgYSB0aXRsZSB0byB0aGUgcGxvdDoKc2NhdHRlcnBsb3QgKyAKICBnZW9tX3BvaW50KGNvbG91ciA9ICJibHVlIiwgc2l6ZSA9IDMsIHNoYXBlID0gMTcpICsgCiAgZ2d0aXRsZSgiRmVydGlsaXR5IFJhdGUgdnMuIEdyb3NzIE5hdGlvbmFsIEluY29tZSIpCmBgYAoKCiMjIyMjIDcuMS4yIOWEsuWtmOWcluaqlApgYGB7cn0KIyBTYXZlIG91ciBwbG90OgpmZXJ0aWxpdHlHTklwbG90IDwtIHNjYXR0ZXJwbG90ICsgCiAgZ2VvbV9wb2ludChjb2xvdXIgPSAiYmx1ZSIsIHNpemUgPSAzLCBzaGFwZSA9IDE3KSArIAogIGdndGl0bGUoIkZlcnRpbGl0eSBSYXRlIHZzLiBHcm9zcyBOYXRpb25hbCBJbmNvbWUiKSAgICAgICMg5Yqg5qiZ6aGMCiMg5YSy5a2Y5omA5YGa55qE5ZyW54mH5YiwZmVydGlsaXR5R05JcGxvdApwZGYoIk15UGxvdC5wZGYiKQojIOWwh+WclueJh+WtmOaIkHBkZgpwcmludChmZXJ0aWxpdHlHTklwbG90KQpkZXYub2ZmKCkKCmBgYAoKIyMjIyMgNy4xLjMg5ZyW5b2i5YWD5Lu25bGs5oCnCmBgYHtyfQojIENvbG9yIHRoZSBwb2ludHMgYnkgcmVnaW9uOgpnZ3Bsb3QoV0hPLCBhZXMoeCA9IEdOSSwgeSA9IEZlcnRpbGl0eVJhdGUsIGNvbG9yID0gUmVnaW9uKSkgKyAKICBnZW9tX3BvaW50KCkKIyDpu57nmoTjgIzlpKflsI/jgI3jgIHjgIzlvaLni4DjgI0uLi7pg73lj6/ku6XnlbbmiJDkuIDlgIvnuarlnJbnmoTlsazmgKcKYGBgCgpgYGB7cn0KIyBDb2xvciB0aGUgcG9pbnRzIGFjY29yZGluZyB0byBsaWZlIGV4cGVjdGFuY3k6CmdncGxvdChXSE8sIGFlcyh4ID0gR05JLCB5ID0gRmVydGlsaXR5UmF0ZSwgY29sb3IgPSBMaWZlRXhwZWN0YW5jeSkpICsgCiAgZ2VvbV9wb2ludCgpCiMgTGlmZUV4cGVjdGFuY3nvvJrpgKPnuozorormlbjvvIzlj6/nlKjpoY/oibLmt7Hmt7rooajnpLoKYGBgCgpgYGB7cn0KIyBJcyB0aGUgZmVydGlsaXR5IHJhdGUgb2YgYSBjb3VudHJ5IHdhcyBhIGdvb2QgcHJlZGljdG9yIG9mIHRoZSAKIyBwZXJjZW50YWdlIG9mIHRoZSBwb3B1bGF0aW9uIHVuZGVyIDE1PwpnZ3Bsb3QoV0hPLCBhZXMoeCA9IEZlcnRpbGl0eVJhdGUsIHkgPSBVbmRlcjE1KSkgKyBnZW9tX3BvaW50KCkKYGBgCgojIyMjIyA3LjEuNCDmlbjlgLzlsLrluqbmr5TkvovovYnmj5sKYGBge3J9CiMgTGV0J3MgdHJ5IGEgbG9nIHRyYW5zZm9ybWF0aW9uOgpnZ3Bsb3QoV0hPLCBhZXMoeCA9IGxvZyhGZXJ0aWxpdHlSYXRlKSwgeSA9IFVuZGVyMTUpKSArIGdlb21fcG9pbnQoKQojIOaciem7nuatquOAgeS4jeaYr+e3muaAp+eahOWcluW9oiAgPj4gIOWPr+S7peWPlmxvZ++8jOmAmeaoo+iuiuaVuOS5i+mWk+Wwseacg+iuiuaIkOe3muaAp+mXnOS/ggpgYGAKCgojIyMjIyA3LjEuNSDlm57mrbjotqjli6Lnt5oKYGBge3J9CiMgU2ltcGxlIGxpbmVhciByZWdyZXNzaW9uIG1vZGVsIHRvIHByZWRpY3QgdGhlIHBlcmNlbnRhZ2Ugb2YgdGhlIAojIHBvcHVsYXRpb24gdW5kZXIgMTUsIHVzaW5nIHRoZSBsb2cgb2YgdGhlIGZlcnRpbGl0eSByYXRlOgptb2QgPC0gbG0oVW5kZXIxNSB+IGxvZyhGZXJ0aWxpdHlSYXRlKSwgZGF0YSA9IFdITykKc3VtbWFyeShtb2QpCmBgYAoKYGBge3J9CiMgQWRkIHRoaXMgcmVncmVzc2lvbiBsaW5lIHRvIG91ciBwbG90OgpnZ3Bsb3QoV0hPLCBhZXMoeCA9IGxvZyhGZXJ0aWxpdHlSYXRlKSwgeSA9IFVuZGVyMTUpKSArIAogIGdlb21fcG9pbnQoKSArIHN0YXRfc21vb3RoKG1ldGhvZCA9ICJsbSIpCiMgZ2dwbG9055qE5Y6f5YmH77ya5pyJ5LiA5by15bqV5ZyW77yM5oOz6KaB5LuA6bq85YaN5Yqg5LiK5Y675bCx5Y+v5Lul5LqGCmBgYAoKIyMjIyMgNy4xLjYg6Lao5Yui57ea55qE5L+h6LO05Y2A6ZaTCmBgYHtyfQojIDk5JSBjb25maWRlbmNlIGludGVydmFsCmdncGxvdChXSE8sIGFlcyh4ID0gbG9nKEZlcnRpbGl0eVJhdGUpLCB5ID0gVW5kZXIxNSkpICsgCiAgZ2VvbV9wb2ludCgpICsgc3RhdF9zbW9vdGgobWV0aG9kID0gImxtIiwgbGV2ZWwgPSAwLjk5KQojIExldmVsOuS/oeiztOWNgOmWk++8iENvbmZpZGVuY2UgSW50ZXJ2YWzvvInml4/nvqTlubPlnYfmnIk5Oe+8heacg+aOieWcqENJ44CN56+E5ZyN5YWnCmBgYAoKYGBge3J9CiMgTm8gY29uZmlkZW5jZSBpbnRlcnZhbCBpbiB0aGUgcGxvdApnZ3Bsb3QoV0hPLCBhZXMoeCA9IGxvZyhGZXJ0aWxpdHlSYXRlKSwgeSA9IFVuZGVyMTUpKSArIAogIGdlb21fcG9pbnQoKSArIHN0YXRfc21vb3RoKG1ldGhvZCA9ICJsbSIsIHNlID0gRkFMU0UpCmBgYAoKYGBge3J9CiMgQ2hhbmdlIHRoZSBjb2xvciBvZiB0aGUgcmVncmVzc2lvbiBsaW5lOgpnZ3Bsb3QoV0hPLCBhZXMoeCA9IGxvZyhGZXJ0aWxpdHlSYXRlKSwgeSA9IFVuZGVyMTUpKSArIAogIGdlb21fcG9pbnQoKSArIHN0YXRfc21vb3RoKG1ldGhvZCA9ICJsbSIsIGNvbG91ciA9ICJvcmFuZ2UiKQpgYGAKCiMjIyMjIDcuMS43IOWIhue+pOm7nueLgOWclgpgYGB7cn0KIyBxdWl6LTE6CmdncGxvdChXSE8sIGFlcyh4ID0gRmVydGlsaXR5UmF0ZSwgeSA9IFVuZGVyMTUsIGNvbD1SZWdpb24pKSArIAogIHNjYWxlX2NvbG9yX2JyZXdlcihwYWxldHRlPSJBY2NlbnQiKSArCiAgZ2VvbV9wb2ludCgpCiMg5omA5pyJ6LOH5paZ5YyW5oiQ5LiA5by15ZyW77yI6JeJ55Sx6YCZ5qij55qE5pa55byP5Y+v5Lul55yL5Ye66K6K5pW45LmL6ZaT55qE6Zec5L+C77yJCmBgYAoKIyMjIyMgNy4xLjgg5YiG5qC86bue54uA5ZyWCmBgYHtyfQojIHF1aXotMToKZ2dwbG90KFdITywgYWVzKHggPSBsb2coUG9wdWxhdGlvbiksIHkgPSBHTkksIGNvbG9yPVJlZ2lvbikpICsgCiAgZ2VvbV9wb2ludCgpICsgCiAgc3RhdF9zbW9vdGgobWV0aG9kPSdsbScpICsKICBmYWNldF93cmFwKH5SZWdpb24pICsgdGhlbWVfYncoKQojIGZhY2V0X3dyYXAoflJlZ2lvbinvvJrmr4/lgItyZWdpb27lkIToh6rnlavmiJDkuIDlvLXlnJYKIyDos4fmlpnoppboprrljJbvvJrlvojnsr7nt7vlvojljrLlrrPnmoTnnq3op6PorormlbjkuYvplpPnmoTpl5zoga/mgKfvvIjkuI3pnIDopoHlgZrlhbbku5bliIbmnpDkuZ/lj6/ku6XvvIkKYGBgCgo8YnI+CgotIC0gLQoKPGJyPjxicj48YnI+PGJyPjxicj4KCjxzdHlsZT4KLmNhcHRpb24gewogIGNvbG9yOiAjNzc3OwogIG1hcmdpbi10b3A6IDEwcHg7Cn0KcCBjb2RlIHsKICB3aGl0ZS1zcGFjZTogaW5oZXJpdDsKfQpwcmUgewogIHdvcmQtYnJlYWs6IG5vcm1hbDsKICB3b3JkLXdyYXA6IG5vcm1hbDsKICBsaW5lLWhlaWdodDogMTsKfQpwcmUgY29kZSB7CiAgd2hpdGUtc3BhY2U6IGluaGVyaXQ7Cn0KcCxsaSB7CiAgZm9udC1mYW1pbHk6ICJUcmVidWNoZXQgTVMiLCAi5b6u6Luf5q2j6buR6auUIiwgIk1pY3Jvc29mdCBKaGVuZ0hlaSI7Cn0KCi5yewogIGxpbmUtaGVpZ2h0OiAxLjI7Cn0KCnRpdGxlewogIGNvbG9yOiAjY2MwMDAwOwogIGZvbnQtZmFtaWx5OiAiVHJlYnVjaGV0IE1TIiwgIuW+rui7n+ato+m7kemrlCIsICJNaWNyb3NvZnQgSmhlbmdIZWkiOwp9Cgpib2R5ewogIGZvbnQtZmFtaWx5OiAiVHJlYnVjaGV0IE1TIiwgIuW+rui7n+ato+m7kemrlCIsICJNaWNyb3NvZnQgSmhlbmdIZWkiOwp9CgpoMSxoMixoMyxoNCxoNXsKICBjb2xvcjogIzAwODgwMDsKICBmb250LWZhbWlseTogIlRyZWJ1Y2hldCBNUyIsICLlvq7ou5/mraPpu5Hpq5QiLCAiTWljcm9zb2Z0IEpoZW5nSGVpIjsKfQoKaDN7CiAgY29sb3I6ICNiMzZiMDA7CiAgYmFja2dyb3VuZDogI2ZmZTBiMzsKICBsaW5lLWhlaWdodDogMjsKICBmb250LXdlaWdodDogYm9sZDsKfQoKaDV7CiAgY29sb3I6ICMwMDYwMDA7CiAgYmFja2dyb3VuZDogI2ZmZmZlMDsKICBsaW5lLWhlaWdodDogMjsKICBmb250LXdlaWdodDogYm9sZDsKfQoKZW17CiAgY29sb3I6ICMwMDAwYzA7CiAgYmFja2dyb3VuZDogI2YwZjBmMDsKICB9Cjwvc3R5bGU+Cgo=