rm(list=ls(all=T))
options(digits=4, scipen=12)
# 清除掉有的沒的資料
# 設定位數
library(dplyr)
library(ggplot2)
library(maps)
library(ggmap)

7.2 芝加哥汽車竊案、資料探索

7.2.1 讀進、轉換資料
# Load our data:
mvt = read.csv("data/mvt.csv", stringsAsFactors=FALSE)   # Since we have text field
str(mvt)
'data.frame':   191641 obs. of  3 variables:
 $ Date     : chr  "12/31/12 23:15" "12/31/12 22:00" "12/31/12 22:00" "12/31/12 22:00" ...
 $ Latitude : num  41.8 41.9 42 41.8 41.8 ...
 $ Longitude: num  -87.6 -87.7 -87.8 -87.7 -87.6 ...
# Convert the Date variable to a format that R will recognize:
mvt$Date = strptime(mvt$Date, format="%m/%d/%y %H:%M")
# 轉換 R 內建的日期/時間的最佳方式,接下來會比較好做~
7.2.2 星期換算
# Extract the hour and the day of the week:
mvt$Weekday = weekdays(mvt$Date)
# Weekday很麻煩,output的結果會是「依字母排列」(建議可以改成「1 ~ 6」)
# 可以做re-order(如下)
mvt$Hour = mvt$Date$hour
str(mvt)   # 增加2個variables: Var1(把週一到週日變成1-7)、Freq(週一到週日出現機車被偷的次數)
'data.frame':   191641 obs. of  5 variables:
 $ Date     : POSIXlt, format: "2012-12-31 23:15:00" "2012-12-31 22:00:00" ...
 $ Latitude : num  41.8 41.9 42 41.8 41.8 ...
 $ Longitude: num  -87.6 -87.7 -87.8 -87.7 -87.6 ...
 $ Weekday  : chr  "Monday" "Monday" "Monday" "Monday" ...
 $ Hour     : int  23 22 22 22 21 20 20 20 19 18 ...
# Create a simple line plot - need the total number of crimes on 
#each day of the week. We can get this information by creating a table:
table(mvt$Weekday)

   Friday    Monday  Saturday    Sunday  Thursday   Tuesday Wednesday 
    29284     27397     27118     26316     27319     26791     27416 
# Save this table as a data frame:
WeekdayCounts = as.data.frame(table(mvt$Weekday))
str(WeekdayCounts) 
'data.frame':   7 obs. of  2 variables:
 $ Var1: Factor w/ 7 levels "Friday","Monday",..: 1 2 3 4 5 6 7
 $ Freq: int  29284 27397 27118 26316 27319 26791 27416
# MIT所提供的做法:
mvt$Date <- strptime(mvt$Date, format = "%m/%d/%y %H:%M")   # 調整時間格式(與mvt.csv檔案的時間格式一致)
mvt$Weekday <- weekdays(mvt$Date)   # 增加 Weekday 這個variable
mvt$Hour <- mvt$Date$hour    # 增加 Hour 這個variable
str(mvt)
'data.frame':   191641 obs. of  5 variables:
 $ Date     : POSIXlt, format: NA NA ...
 $ Latitude : num  41.8 41.9 42 41.8 41.8 ...
 $ Longitude: num  -87.6 -87.7 -87.8 -87.7 -87.6 ...
 $ Weekday  : chr  NA NA NA NA ...
 $ Hour     : int  NA NA NA NA NA NA NA NA NA NA ...
table(mvt$Weekday)
< table of extent 0 >
weekdayCounts <- as.data.frame(table(mvt$Weekday))
str(weekdayCounts)
'data.frame':   0 obs. of  1 variable:
 $ Freq: int 
7.2.3 簡單線圖
# Load the ggplot2 library:
library(ggplot2)
ggplot(WeekdayCounts, aes(x=Var1, y=Freq)) + 
  geom_line(aes(group=1))  

7.2.4 星期類別順序
# Make the "Var1" variable an ORDERED factor variable
WeekdayCounts$Var1 = factor(WeekdayCounts$Var1, ordered=TRUE, 
  levels=c("Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", 
           "Friday","Saturday"))
# levels=c(...):做re-order改變次序,讓weekday可以照著我們想要的順序排(不會照著開頭字母),讓週一到週日可以依續排列
# Try again:
ggplot(WeekdayCounts, aes(x=Var1, y=Freq)) + 
  geom_line(aes(group=1))

7.2.5 改變X、Y軸標題
# Change our x and y labels:
ggplot(WeekdayCounts, aes(x=Var1, y=Freq)) + 
  geom_line(aes(group=1), alpha=0.3) + 
  xlab("Day of the Week") + ylab("Total Motor Vehicle Thefts")

# group = 1: 把所有資料聚集成折線圖上的一條線
# 增加x軸、y軸的名稱
# alpha: Makes the line lighter in color
7.2.5 七天、24小時
# VIDEO 4 - Adding the Hour of the Day
# Create a counts table for the weekday and hour:
table(mvt$Weekday, mvt$Hour)
< table of extent 0 x 0 >
# Save this to a data frame:
DayHourCounts = as.data.frame(table(mvt$Weekday, mvt$Hour))
str(DayHourCounts)
'data.frame':   0 obs. of  2 variables:
 $ Var2: NULL
 $ Freq: int 
# Convert the second variable, Var2, to numbers and call it Hour:
DayHourCounts$Hour = as.numeric(as.character(DayHourCounts$Var2))
7.2.6 畫出 7 x 24 趨勢線圖
# Create out plot:
ggplot(DayHourCounts, aes(x=Hour, y=Freq)) +
  geom_line(aes(group=Var1))
Error in FUN(X[[i]], ...) : object 'Var1' not found

# Change the colors
ggplot(DayHourCounts, aes(x=Hour, y=Freq)) + 
  geom_line(aes(group=Var1, color=Var1), size=2)
Error in FUN(X[[i]], ...) : object 'Var1' not found

# 區分周末、周間
DayHourCounts$Type = ifelse(
  (DayHourCounts$Var1 == "Sunday") | (DayHourCounts$Var1 == "Saturday"), 
  "Weekend", "Weekday")
# Redo our plot, this time coloring by Type:
ggplot(DayHourCounts, aes(x=Hour, y=Freq)) + 
  geom_line(aes(group=Var1, color=Type), size=2) 
Error in FUN(X[[i]], ...) : object 'Var1' not found

# Make the lines a little transparent:
ggplot(DayHourCounts, aes(x=Hour, y=Freq)) + 
  geom_line(aes(group=Var1, color=Type), size=2, alpha=0.5) 
Error in FUN(X[[i]], ...) : object 'Var1' not found

7.2.6 畫出 7 x 24 熱圖
# 星期類別順序重整
DayHourCounts$Var1 = factor(DayHourCounts$Var1, ordered=TRUE, 
  levels=c("Monday", "Tuesday", "Wednesday", "Thursday", "Friday", 
           "Saturday", "Sunday"))
# Make a heatmap:
ggplot(DayHourCounts, aes(x = Hour, y = Var1)) + 
  geom_tile(aes(fill = Freq))   # geom_tile: 畫熱圖(Heat Map)

# Change the label on the legend, and get rid of the y-label:
ggplot(DayHourCounts, aes(x = Hour, y = Var1)) + 
  geom_tile(aes(fill = Freq)) + 
  scale_fill_gradient(name="Total MV Thefts") + 
  theme(axis.title.y = element_blank())

# tile:ggplot2中畫「熱圖」的方式(tile, 磁磚)
# Change the color scheme
ggplot(DayHourCounts, aes(x = Hour, y = Var1)) + 
  geom_tile(aes(fill = Freq)) + 
  scale_fill_gradient(name="Total MV Thefts", low="white", high="red") + 
  theme(axis.title.y = element_blank())

# scale_fill_gradient(...):加漸層,讓Frequency的顏色從黃色到紅色
7.2.7 互動式熱圖
table(format(mvt$Date,'%H'), format(mvt$Date,'%w'))%>% t %>% 
  heatmap(NA,NA,scale='none',col=cm.colors(25))
Error in heatmap(., NA, NA, scale = "none", col = cm.colors(25)) : 
  'x' must have at least 2 rows and 2 columns



7.2 芝加哥汽車竊案、地圖套製

7.2.8 透過 mapsggmap 套件抓取地圖
library(maps)
library(ggmap)
# Load a map of Chicago into R:
chicago = get_map(location = "chicago", zoom = 11)
Map from URL : http://maps.googleapis.com/maps/api/staticmap?center=chicago&zoom=11&size=640x640&scale=2&maptype=terrain&language=en-EN&sensor=false
Information from URL : http://maps.googleapis.com/maps/api/geocode/json?address=chicago&sensor=false
# Look at the map
chicago = ggmap(chicago)
# ggmap:直接載入地圖物件(需先下載並放置於某一路徑)
chicago

# 可以畫高雄市嗎 ? 
ggmap(get_map(location = "kaohsiung", zoom = 12))
Map from URL : http://maps.googleapis.com/maps/api/staticmap?center=kaohsiung&zoom=12&size=640x640&scale=2&maptype=terrain&language=en-EN&sensor=false
Information from URL : http://maps.googleapis.com/maps/api/geocode/json?address=kaohsiung&sensor=false

7.2.9 標記單一事件
# Plot the first 100 motor vehicle thefts:
chicago + geom_point(
  data = mvt[1:100,], aes(x = Longitude, y = Latitude))

# 畫100點:因為原先資料集太大太龐雜,所以僅取100點
7.2.9 依座標集收事件
# Round our latitude and longitude to 2 digits of accuracy, 
# and create a crime counts data frame for each area:
LatLonCounts = as.data.frame(table(round(mvt$Longitude,2), 
                                   round(mvt$Latitude,2)))
str(LatLonCounts)
'data.frame':   1638 obs. of  3 variables:
 $ Var1: Factor w/ 42 levels "-87.93","-87.92",..: 1 2 3 4 5 6 7 8 9 10 ...
 $ Var2: Factor w/ 39 levels "41.64","41.65",..: 1 1 1 1 1 1 1 1 1 1 ...
 $ Freq: int  0 0 0 0 0 0 0 0 0 0 ...
# Convert our Longitude and Latitude variable to numbers:
LatLonCounts$Long = as.numeric(as.character(LatLonCounts$Var1))
LatLonCounts$Lat = as.numeric(as.character(LatLonCounts$Var2))
# Plot these points on our map:
chicago + geom_point(data = LatLonCounts, 
                     aes(x = Long, y = Lat, color = Freq, size=Freq))

# Change the color scheme:
chicago + geom_point(data = LatLonCounts, 
                     aes(x=Long, y=Lat, color=Freq, size=Freq)) + 
  scale_colour_gradient(low="yellow", high="red")

7.2.10 格狀圖
# We can also use the geom_tile geometry
chicago + geom_tile(data = LatLonCounts, 
                    aes(x = Long, y = Lat, alpha = Freq), 
                    fill="red")

# 格狀圖效果較前面的圖片更好~~~
# 移除沒有事件的區格
LatLonCounts2 = subset(LatLonCounts, Freq > 0)
chicago + geom_tile(data = LatLonCounts2, 
                    aes(x = Long, y = Lat, alpha = Freq), 
                    fill="red")

# Freq:把0以下濾掉,海就不會有顏色
7.2.11 事件密度圖
# density plot
chicago + stat_density_2d(data=mvt, 
    aes(x=Longitude, y=Latitude, alpha=..level..), 
    fill='orange', color='pink', size=0.01, bins=8, geom='polygon') +
  scale_alpha(range = c(0.05, 0.45))

# 更好畫
# 效果比格狀圖更好!



7.2 槍枝持有率與謀殺比率

# VIDEO 6 - Geographical Map on US
# Load our data:
murders = read.csv("data/murders.csv")
str(murders)
'data.frame':   51 obs. of  6 variables:
 $ State            : Factor w/ 51 levels "Alabama","Alaska",..: 1 2 3 4 5 6 7 8 9 10 ...
 $ Population       : int  4779736 710231 6392017 2915918 37253956 5029196 3574097 897934 601723 19687653 ...
 $ PopulationDensity: num  94.65 1.26 57.05 56.43 244.2 ...
 $ Murders          : int  199 31 352 130 1811 117 131 48 131 987 ...
 $ GunMurders       : int  135 19 232 93 1257 65 97 38 99 669 ...
 $ GunOwnership     : num  0.517 0.578 0.311 0.553 0.213 0.347 0.167 0.255 0.036 0.245 ...
7.2.12 Read and Plot US Map
# Load the map of the US
statesMap = map_data("state")
# map_data():內建地圖
str(statesMap)
'data.frame':   15537 obs. of  6 variables:
 $ long     : num  -87.5 -87.5 -87.5 -87.5 -87.6 ...
 $ lat      : num  30.4 30.4 30.4 30.3 30.3 ...
 $ group    : num  1 1 1 1 1 1 1 1 1 1 ...
 $ order    : int  1 2 3 4 5 6 7 8 9 10 ...
 $ region   : chr  "alabama" "alabama" "alabama" "alabama" ...
 $ subregion: chr  NA NA NA NA ...
# 周界複雜,所以總共會有15000多組多邊形
# Plot the map:
ggplot(statesMap, aes(x = long, y = lat, group = group)) + 
  geom_polygon(fill = "white", color = "black") 

7.2.13 Merge the Dataframes (stateMap and murders)
# Create a new variable called region with the lowercase names to 
# match the statesMap:
murders$region = tolower(murders$State)
# Join the statesMap data and the murders data into one dataframe:
murderMap = merge(statesMap, murders, by="region")   # 合併地圖
str(murderMap)
'data.frame':   15537 obs. of  12 variables:
 $ region           : chr  "alabama" "alabama" "alabama" "alabama" ...
 $ long             : num  -87.5 -87.5 -87.5 -87.5 -87.6 ...
 $ lat              : num  30.4 30.4 30.4 30.3 30.3 ...
 $ group            : num  1 1 1 1 1 1 1 1 1 1 ...
 $ order            : int  1 2 3 4 5 6 7 8 9 10 ...
 $ subregion        : chr  NA NA NA NA ...
 $ State            : Factor w/ 51 levels "Alabama","Alaska",..: 1 1 1 1 1 1 1 1 1 1 ...
 $ Population       : int  4779736 4779736 4779736 4779736 4779736 4779736 4779736 4779736 4779736 4779736 ...
 $ PopulationDensity: num  94.7 94.7 94.7 94.7 94.7 ...
 $ Murders          : int  199 199 199 199 199 199 199 199 199 199 ...
 $ GunMurders       : int  135 135 135 135 135 135 135 135 135 135 ...
 $ GunOwnership     : num  0.517 0.517 0.517 0.517 0.517 0.517 0.517 0.517 0.517 0.517 ...
7.2.14 Map-1: No. Murders per State
# Plot the number of murder on our map of the United States:
ggplot(murderMap, aes(x = long, y = lat, group = group, fill = Murders)) + 
  geom_polygon(color = "black") + 
  scale_fill_gradient(low = "black", high = "red", guide = "legend")

7.2.15 Map-2: Populations per State
# Plot a map of the population:
ggplot(murderMap, aes(x = long, y = lat, group = group, fill = Population)) + 
  geom_polygon(color = "black") + 
  scale_fill_gradient(low = "black", high = "red", guide = "legend")

7.2.16 Map-3: No. Murders per 100K Population
# Create a new variable that is the number of murders per 100,000 population:
murderMap$MurderRate = murderMap$Murders / murderMap$Population * 100000
# Redo our plot with murder rate:
ggplot(murderMap, aes(x = long, y = lat, group = group, fill = MurderRate)) + 
  geom_polygon(color = "black") + 
  scale_fill_gradient(low = "black", high = "red", guide = "legend")

7.2.17 Map-4: No. Murders per 100K Population with Filter
# Redo the plot, Cap the Murderrate at 10:
ggplot(murderMap, aes(x = long, y = lat, group = group, fill = MurderRate)) + 
  geom_polygon(color = "black") + 
  scale_fill_gradient(low = "black", high = "red", 
                      guide = "legend", limits = c(0,10))

7.2.18 Map-5: Gun Ownership (%) by States
ggplot(murderMap,aes(x=long,y=lat,group=group,fill=GunOwnership)) + 
  geom_polygon(color = "black") + 
  scale_fill_gradient(low = "black", high = "red", guide = "legend")

7.2.19 Gun Ownership (%) by States
tapply(murderMap$GunOwnership, murderMap$region, mean) %>% sort %>% 
  barplot(las=2, cex.names=0.6, main="Averge GunOwnerShip (%)")








LS0tCnRpdGxlOiAiQVM3LTBCIOWcsOeQhuizh+aWmeijveWcliIKYXV0aG9yOiAiTTA2NDYxMDAyMSDmpYrlh7HlgKssIDIwMTgvMDcvMzEiCm91dHB1dDogaHRtbF9ub3RlYm9vawotLS0KCjxicj4KCmBgYHtyIGVjaG89VCwgbWVzc2FnZT1GLCBjYWNoZT1GLCB3YXJuaW5nPUZ9CnJtKGxpc3Q9bHMoYWxsPVQpKQpvcHRpb25zKGRpZ2l0cz00LCBzY2lwZW49MTIpCiMg5riF6Zmk5o6J5pyJ55qE5rKS55qE6LOH5paZCiMg6Kit5a6a5L2N5pW4CmxpYnJhcnkoZHBseXIpCmxpYnJhcnkoZ2dwbG90MikKbGlicmFyeShtYXBzKQpsaWJyYXJ5KGdnbWFwKQpgYGAKCi0gLSAtCgojIyMgNy4yIOiKneWKoOWTpeaxvei7iueriuahiOOAgeizh+aWmeaOoue0ogoKIyMjIyMgNy4yLjEg6K6A6YCy44CB6L2J5o+b6LOH5paZCmBgYHtyfQojIExvYWQgb3VyIGRhdGE6Cm12dCA9IHJlYWQuY3N2KCJkYXRhL212dC5jc3YiLCBzdHJpbmdzQXNGYWN0b3JzPUZBTFNFKSAgICMgU2luY2Ugd2UgaGF2ZSB0ZXh0IGZpZWxkCnN0cihtdnQpCgojIENvbnZlcnQgdGhlIERhdGUgdmFyaWFibGUgdG8gYSBmb3JtYXQgdGhhdCBSIHdpbGwgcmVjb2duaXplOgptdnQkRGF0ZSA9IHN0cnB0aW1lKG12dCREYXRlLCBmb3JtYXQ9IiVtLyVkLyV5ICVIOiVNIikKIyDovYnmj5sgUiDlhaflu7rnmoTml6XmnJ8v5pmC6ZaT55qE5pyA5L2z5pa55byP77yM5o6l5LiL5L6G5pyD5q+U6LyD5aW95YGa772eCmBgYAoKIyMjIyMgNy4yLjIg5pif5pyf5o+b566XCmBgYHtyfQojIEV4dHJhY3QgdGhlIGhvdXIgYW5kIHRoZSBkYXkgb2YgdGhlIHdlZWs6Cm12dCRXZWVrZGF5ID0gd2Vla2RheXMobXZ0JERhdGUpCiMgV2Vla2RheeW+iOm6u+eFqe+8jG91dHB1dOeahOe1kOaenOacg+aYr+OAjOS+neWtl+avjeaOkuWIl+OAje+8iOW7uuitsOWPr+S7peaUueaIkOOAjDEgfiA244CN77yJCiMg5Y+v5Lul5YGacmUtb3JkZXIo5aaC5LiLKQptdnQkSG91ciA9IG12dCREYXRlJGhvdXIKc3RyKG12dCkgICAjIOWinuWKoDLlgIt2YXJpYWJsZXM6IFZhcjEo5oqK6YCx5LiA5Yiw6YCx5pel6K6K5oiQMS03KeOAgUZyZXEo6YCx5LiA5Yiw6YCx5pel5Ye654++5qmf6LuK6KKr5YG355qE5qyh5pW4KQoKCiMgQ3JlYXRlIGEgc2ltcGxlIGxpbmUgcGxvdCAtIG5lZWQgdGhlIHRvdGFsIG51bWJlciBvZiBjcmltZXMgb24gCiNlYWNoIGRheSBvZiB0aGUgd2Vlay4gV2UgY2FuIGdldCB0aGlzIGluZm9ybWF0aW9uIGJ5IGNyZWF0aW5nIGEgdGFibGU6CnRhYmxlKG12dCRXZWVrZGF5KQoKIyBTYXZlIHRoaXMgdGFibGUgYXMgYSBkYXRhIGZyYW1lOgpXZWVrZGF5Q291bnRzID0gYXMuZGF0YS5mcmFtZSh0YWJsZShtdnQkV2Vla2RheSkpCnN0cihXZWVrZGF5Q291bnRzKSAKYGBgCgpgYGB7cn0KIyBNSVTmiYDmj5DkvpvnmoTlgZrms5XvvJoKbXZ0JERhdGUgPC0gc3RycHRpbWUobXZ0JERhdGUsIGZvcm1hdCA9ICIlbS8lZC8leSAlSDolTSIpICAgIyDoqr/mlbTmmYLplpPmoLzlvI8o6IiHbXZ0LmNzduaqlOahiOeahOaZgumWk+agvOW8j+S4gOiHtCkKbXZ0JFdlZWtkYXkgPC0gd2Vla2RheXMobXZ0JERhdGUpICAgIyDlop7liqAgV2Vla2RheSDpgJnlgIt2YXJpYWJsZQptdnQkSG91ciA8LSBtdnQkRGF0ZSRob3VyICAgICMg5aKe5YqgIEhvdXIg6YCZ5YCLdmFyaWFibGUKc3RyKG12dCkKdGFibGUobXZ0JFdlZWtkYXkpCndlZWtkYXlDb3VudHMgPC0gYXMuZGF0YS5mcmFtZSh0YWJsZShtdnQkV2Vla2RheSkpCnN0cih3ZWVrZGF5Q291bnRzKQpgYGAKCiMjIyMjIDcuMi4zIOewoeWWrue3muWclgpgYGB7cn0KIyBMb2FkIHRoZSBnZ3Bsb3QyIGxpYnJhcnk6CmxpYnJhcnkoZ2dwbG90MikKZ2dwbG90KFdlZWtkYXlDb3VudHMsIGFlcyh4PVZhcjEsIHk9RnJlcSkpICsgCiAgZ2VvbV9saW5lKGFlcyhncm91cD0xKSkgIApgYGAKCiMjIyMjIDcuMi40IOaYn+acn+mhnuWIpemghuW6jwpgYGB7cn0KIyBNYWtlIHRoZSAiVmFyMSIgdmFyaWFibGUgYW4gT1JERVJFRCBmYWN0b3IgdmFyaWFibGUKV2Vla2RheUNvdW50cyRWYXIxID0gZmFjdG9yKFdlZWtkYXlDb3VudHMkVmFyMSwgb3JkZXJlZD1UUlVFLCAKICBsZXZlbHM9YygiU3VuZGF5IiwgIk1vbmRheSIsICJUdWVzZGF5IiwgIldlZG5lc2RheSIsICJUaHVyc2RheSIsIAogICAgICAgICAgICJGcmlkYXkiLCJTYXR1cmRheSIpKQojIGxldmVscz1jKC4uLu+8ie+8muWBmnJlLW9yZGVy5pS56K6K5qyh5bqP77yM6K6Td2Vla2RheeWPr+S7peeFp+iRl+aIkeWAkeaDs+imgeeahOmghuW6j+aOku+8iOS4jeacg+eFp+iRl+mWi+mgreWtl+avjSnvvIzorpPpgLHkuIDliLDpgLHml6Xlj6/ku6Xkvp3nuozmjpLliJcKIyBUcnkgYWdhaW46CmdncGxvdChXZWVrZGF5Q291bnRzLCBhZXMoeD1WYXIxLCB5PUZyZXEpKSArIAogIGdlb21fbGluZShhZXMoZ3JvdXA9MSkpCmBgYAoKIyMjIyMgNy4yLjUg5pS56K6KWOOAgVnou7jmqJnpoYwKYGBge3J9CiMgQ2hhbmdlIG91ciB4IGFuZCB5IGxhYmVsczoKZ2dwbG90KFdlZWtkYXlDb3VudHMsIGFlcyh4PVZhcjEsIHk9RnJlcSkpICsgCiAgZ2VvbV9saW5lKGFlcyhncm91cD0xKSwgYWxwaGE9MC4zKSArIAogIHhsYWIoIkRheSBvZiB0aGUgV2VlayIpICsgeWxhYigiVG90YWwgTW90b3IgVmVoaWNsZSBUaGVmdHMiKQojIGdyb3VwID0gMTog5oqK5omA5pyJ6LOH5paZ6IGa6ZuG5oiQ5oqY57ea5ZyW5LiK55qE5LiA5qKd57eaCiMg5aKe5YqgeOi7uOOAgXnou7jnmoTlkI3nqLEKIyBhbHBoYTogTWFrZXMgdGhlIGxpbmUgbGlnaHRlciBpbiBjb2xvcgpgYGAKCiMjIyMjIDcuMi41IOS4g+WkqeOAgTI05bCP5pmCCmBgYHtyfQojIFZJREVPIDQgLSBBZGRpbmcgdGhlIEhvdXIgb2YgdGhlIERheQojIENyZWF0ZSBhIGNvdW50cyB0YWJsZSBmb3IgdGhlIHdlZWtkYXkgYW5kIGhvdXI6CnRhYmxlKG12dCRXZWVrZGF5LCBtdnQkSG91cikKCiMgU2F2ZSB0aGlzIHRvIGEgZGF0YSBmcmFtZToKRGF5SG91ckNvdW50cyA9IGFzLmRhdGEuZnJhbWUodGFibGUobXZ0JFdlZWtkYXksIG12dCRIb3VyKSkKc3RyKERheUhvdXJDb3VudHMpCgojIENvbnZlcnQgdGhlIHNlY29uZCB2YXJpYWJsZSwgVmFyMiwgdG8gbnVtYmVycyBhbmQgY2FsbCBpdCBIb3VyOgpEYXlIb3VyQ291bnRzJEhvdXIgPSBhcy5udW1lcmljKGFzLmNoYXJhY3RlcihEYXlIb3VyQ291bnRzJFZhcjIpKQpgYGAKCiMjIyMjIDcuMi42IOeVq+WHuiA3IHggMjQg6Lao5Yui57ea5ZyWIApgYGB7cn0KIyBDcmVhdGUgb3V0IHBsb3Q6CmdncGxvdChEYXlIb3VyQ291bnRzLCBhZXMoeD1Ib3VyLCB5PUZyZXEpKSArCiAgZ2VvbV9saW5lKGFlcyhncm91cD1WYXIxKSkKIyMjIFZhcjE6IOS4gOmAsTflpKkKIyMjIFZhcjI6IOS4gOWkqTI05bCP5pmCCiMjIyBGcmVxOiBhY3R1YWwgbnVtYmVycyBvZiBjYWxsCmBgYAoKYGBge3J9CiMgQ2hhbmdlIHRoZSBjb2xvcnMKZ2dwbG90KERheUhvdXJDb3VudHMsIGFlcyh4PUhvdXIsIHk9RnJlcSkpICsgCiAgZ2VvbV9saW5lKGFlcyhncm91cD1WYXIxLCBjb2xvcj1WYXIxKSwgc2l6ZT0yKQpgYGAKCmBgYHtyfQojIOWNgOWIhuWRqOacq+OAgeWRqOmWkwpEYXlIb3VyQ291bnRzJFR5cGUgPSBpZmVsc2UoCiAgKERheUhvdXJDb3VudHMkVmFyMSA9PSAiU3VuZGF5IikgfCAoRGF5SG91ckNvdW50cyRWYXIxID09ICJTYXR1cmRheSIpLCAKICAiV2Vla2VuZCIsICJXZWVrZGF5IikKCiMgUmVkbyBvdXIgcGxvdCwgdGhpcyB0aW1lIGNvbG9yaW5nIGJ5IFR5cGU6CmdncGxvdChEYXlIb3VyQ291bnRzLCBhZXMoeD1Ib3VyLCB5PUZyZXEpKSArIAogIGdlb21fbGluZShhZXMoZ3JvdXA9VmFyMSwgY29sb3I9VHlwZSksIHNpemU9MikgCmBgYAoKYGBge3J9CiMgTWFrZSB0aGUgbGluZXMgYSBsaXR0bGUgdHJhbnNwYXJlbnQ6CmdncGxvdChEYXlIb3VyQ291bnRzLCBhZXMoeD1Ib3VyLCB5PUZyZXEpKSArIAogIGdlb21fbGluZShhZXMoZ3JvdXA9VmFyMSwgY29sb3I9VHlwZSksIHNpemU9MiwgYWxwaGE9MC41KSAKYGBgCgojIyMjIyA3LjIuNiDnlavlh7ogNyB4IDI0IOeGseWclgoKYGBge3J9CiMg5pif5pyf6aGe5Yil6aCG5bqP6YeN5pW0CkRheUhvdXJDb3VudHMkVmFyMSA9IGZhY3RvcihEYXlIb3VyQ291bnRzJFZhcjEsIG9yZGVyZWQ9VFJVRSwgCiAgbGV2ZWxzPWMoIk1vbmRheSIsICJUdWVzZGF5IiwgIldlZG5lc2RheSIsICJUaHVyc2RheSIsICJGcmlkYXkiLCAKICAgICAgICAgICAiU2F0dXJkYXkiLCAiU3VuZGF5IikpCgojIE1ha2UgYSBoZWF0bWFwOgpnZ3Bsb3QoRGF5SG91ckNvdW50cywgYWVzKHggPSBIb3VyLCB5ID0gVmFyMSkpICsgCiAgZ2VvbV90aWxlKGFlcyhmaWxsID0gRnJlcSkpICAgIyBnZW9tX3RpbGU6IOeVq+eGseWclihIZWF0IE1hcCkKYGBgCgpgYGB7cn0KIyBDaGFuZ2UgdGhlIGxhYmVsIG9uIHRoZSBsZWdlbmQsIGFuZCBnZXQgcmlkIG9mIHRoZSB5LWxhYmVsOgpnZ3Bsb3QoRGF5SG91ckNvdW50cywgYWVzKHggPSBIb3VyLCB5ID0gVmFyMSkpICsgCiAgZ2VvbV90aWxlKGFlcyhmaWxsID0gRnJlcSkpICsgCiAgc2NhbGVfZmlsbF9ncmFkaWVudChuYW1lPSJUb3RhbCBNViBUaGVmdHMiKSArIAogIHRoZW1lKGF4aXMudGl0bGUueSA9IGVsZW1lbnRfYmxhbmsoKSkKIyB0aWxl77yaZ2dwbG90MuS4reeVq+OAjOeGseWcluOAjeeahOaWueW8j++8iHRpbGUsIOejgeejmu+8iQpgYGAKCmBgYHtyfQojIENoYW5nZSB0aGUgY29sb3Igc2NoZW1lCmdncGxvdChEYXlIb3VyQ291bnRzLCBhZXMoeCA9IEhvdXIsIHkgPSBWYXIxKSkgKyAKICBnZW9tX3RpbGUoYWVzKGZpbGwgPSBGcmVxKSkgKyAKICBzY2FsZV9maWxsX2dyYWRpZW50KG5hbWU9IlRvdGFsIE1WIFRoZWZ0cyIsIGxvdz0id2hpdGUiLCBoaWdoPSJyZWQiKSArIAogIHRoZW1lKGF4aXMudGl0bGUueSA9IGVsZW1lbnRfYmxhbmsoKSkKIyBzY2FsZV9maWxsX2dyYWRpZW50KC4uLinvvJrliqDmvLjlsaTvvIzorpNGcmVxdWVuY3nnmoTpoY/oibLlvp7pu4PoibLliLDntIXoibIKYGBgCgojIyMjIyA3LjIuNyDkupLli5XlvI/nhrHlnJYKYGBge3J9CnRhYmxlKGZvcm1hdChtdnQkRGF0ZSwnJUgnKSwgZm9ybWF0KG12dCREYXRlLCcldycpKSU+JSB0ICU+JSAKICBoZWF0bWFwKE5BLE5BLHNjYWxlPSdub25lJyxjb2w9Y20uY29sb3JzKDI1KSkKYGBgCjxicj4KCi0gLSAtCgojIyMgNy4yIOiKneWKoOWTpeaxvei7iueriuahiOOAgeWcsOWcluWll+ijvQoKIyMjIyMgNy4yLjgg6YCP6YGOIGBtYXBzYCDlkowgYGdnbWFwYCDlpZfku7bmipPlj5blnLDlnJYKYGBge3J9CmxpYnJhcnkobWFwcykKbGlicmFyeShnZ21hcCkKCiMgTG9hZCBhIG1hcCBvZiBDaGljYWdvIGludG8gUjoKY2hpY2FnbyA9IGdldF9tYXAobG9jYXRpb24gPSAiY2hpY2FnbyIsIHpvb20gPSAxMSkKCiMgTG9vayBhdCB0aGUgbWFwCmNoaWNhZ28gPSBnZ21hcChjaGljYWdvKQojIGdnbWFw77ya55u05o6l6LyJ5YWl5Zyw5ZyW54mp5Lu277yI6ZyA5YWI5LiL6LyJ5Lim5pS+572u5pa85p+Q5LiA6Lev5b6R77yJCmNoaWNhZ28KYGBgCgpgYGB7cn0KIyDlj6/ku6Xnlavpq5jpm4TluILll44gPyAKZ2dtYXAoZ2V0X21hcChsb2NhdGlvbiA9ICJrYW9oc2l1bmciLCB6b29tID0gMTIpKQpgYGAKCiMjIyMjIDcuMi45IOaomeiomOWWruS4gOS6i+S7tgpgYGB7cn0KIyBQbG90IHRoZSBmaXJzdCAxMDAgbW90b3IgdmVoaWNsZSB0aGVmdHM6CmNoaWNhZ28gKyBnZW9tX3BvaW50KAogIGRhdGEgPSBtdnRbMToxMDAsXSwgYWVzKHggPSBMb25naXR1ZGUsIHkgPSBMYXRpdHVkZSkpCiMg55WrMTAw6bue77ya5Zug54K65Y6f5YWI6LOH5paZ6ZuG5aSq5aSn5aSq6b6Q6Zuc77yM5omA5Lul5YOF5Y+WMTAw6bueCmBgYAoKIyMjIyMgNy4yLjkg5L6d5bqn5qiZ6ZuG5pS25LqL5Lu2CmBgYHtyfQojIFJvdW5kIG91ciBsYXRpdHVkZSBhbmQgbG9uZ2l0dWRlIHRvIDIgZGlnaXRzIG9mIGFjY3VyYWN5LCAKIyBhbmQgY3JlYXRlIGEgY3JpbWUgY291bnRzIGRhdGEgZnJhbWUgZm9yIGVhY2ggYXJlYToKTGF0TG9uQ291bnRzID0gYXMuZGF0YS5mcmFtZSh0YWJsZShyb3VuZChtdnQkTG9uZ2l0dWRlLDIpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3VuZChtdnQkTGF0aXR1ZGUsMikpKQpzdHIoTGF0TG9uQ291bnRzKQoKIyBDb252ZXJ0IG91ciBMb25naXR1ZGUgYW5kIExhdGl0dWRlIHZhcmlhYmxlIHRvIG51bWJlcnM6CkxhdExvbkNvdW50cyRMb25nID0gYXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIoTGF0TG9uQ291bnRzJFZhcjEpKQpMYXRMb25Db3VudHMkTGF0ID0gYXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIoTGF0TG9uQ291bnRzJFZhcjIpKQoKIyBQbG90IHRoZXNlIHBvaW50cyBvbiBvdXIgbWFwOgpjaGljYWdvICsgZ2VvbV9wb2ludChkYXRhID0gTGF0TG9uQ291bnRzLCAKICAgICAgICAgICAgICAgICAgICAgYWVzKHggPSBMb25nLCB5ID0gTGF0LCBjb2xvciA9IEZyZXEsIHNpemU9RnJlcSkpCmBgYAoKYGBge3J9CiMgQ2hhbmdlIHRoZSBjb2xvciBzY2hlbWU6CmNoaWNhZ28gKyBnZW9tX3BvaW50KGRhdGEgPSBMYXRMb25Db3VudHMsIAogICAgICAgICAgICAgICAgICAgICBhZXMoeD1Mb25nLCB5PUxhdCwgY29sb3I9RnJlcSwgc2l6ZT1GcmVxKSkgKyAKICBzY2FsZV9jb2xvdXJfZ3JhZGllbnQobG93PSJ5ZWxsb3ciLCBoaWdoPSJyZWQiKQpgYGAKCiMjIyMjIDcuMi4xMCDmoLzni4DlnJYKYGBge3J9CiMgV2UgY2FuIGFsc28gdXNlIHRoZSBnZW9tX3RpbGUgZ2VvbWV0cnkKY2hpY2FnbyArIGdlb21fdGlsZShkYXRhID0gTGF0TG9uQ291bnRzLCAKICAgICAgICAgICAgICAgICAgICBhZXMoeCA9IExvbmcsIHkgPSBMYXQsIGFscGhhID0gRnJlcSksIAogICAgICAgICAgICAgICAgICAgIGZpbGw9InJlZCIpCiMg5qC854uA5ZyW5pWI5p6c6LyD5YmN6Z2i55qE5ZyW54mH5pu05aW9772e772e772eCmBgYAoKYGBge3J9CiMg56e76Zmk5rKS5pyJ5LqL5Lu255qE5Y2A5qC8CkxhdExvbkNvdW50czIgPSBzdWJzZXQoTGF0TG9uQ291bnRzLCBGcmVxID4gMCkKY2hpY2FnbyArIGdlb21fdGlsZShkYXRhID0gTGF0TG9uQ291bnRzMiwgCiAgICAgICAgICAgICAgICAgICAgYWVzKHggPSBMb25nLCB5ID0gTGF0LCBhbHBoYSA9IEZyZXEpLCAKICAgICAgICAgICAgICAgICAgICBmaWxsPSJyZWQiKQojIEZyZXHvvJrmioow5Lul5LiL5r++5o6J77yM5rW35bCx5LiN5pyD5pyJ6aGP6ImyCmBgYAoKIyMjIyMgNy4yLjExIOS6i+S7tuWvhuW6puWclgpgYGB7cn0KIyBkZW5zaXR5IHBsb3QKY2hpY2FnbyArIHN0YXRfZGVuc2l0eV8yZChkYXRhPW12dCwgCiAgICBhZXMoeD1Mb25naXR1ZGUsIHk9TGF0aXR1ZGUsIGFscGhhPS4ubGV2ZWwuLiksIAogICAgZmlsbD0nb3JhbmdlJywgY29sb3I9J3BpbmsnLCBzaXplPTAuMDEsIGJpbnM9OCwgZ2VvbT0ncG9seWdvbicpICsKICBzY2FsZV9hbHBoYShyYW5nZSA9IGMoMC4wNSwgMC40NSkpCiMg5pu05aW955WrCiMg5pWI5p6c5q+U5qC854uA5ZyW5pu05aW977yBCmBgYAo8YnI+CgotIC0gLQoKIyMjIDcuMiDmp43mnp3mjIHmnInnjofoiIforIDmrrrmr5TnjocKCmBgYHtyfQojIFZJREVPIDYgLSBHZW9ncmFwaGljYWwgTWFwIG9uIFVTCiMgTG9hZCBvdXIgZGF0YToKbXVyZGVycyA9IHJlYWQuY3N2KCJkYXRhL211cmRlcnMuY3N2IikKc3RyKG11cmRlcnMpCmBgYAoKIyMjIyMgNy4yLjEyIFJlYWQgYW5kIFBsb3QgVVMgTWFwCmBgYHtyfQojIExvYWQgdGhlIG1hcCBvZiB0aGUgVVMKc3RhdGVzTWFwID0gbWFwX2RhdGEoInN0YXRlIikKIyBtYXBfZGF0YSgp77ya5YWn5bu65Zyw5ZyWCnN0cihzdGF0ZXNNYXApCiMg5ZGo55WM6KSH6Zuc77yM5omA5Lul57i95YWx5pyD5pyJMTUwMDDlpJrntYTlpJrpgorlvaIKCiMgUGxvdCB0aGUgbWFwOgpnZ3Bsb3Qoc3RhdGVzTWFwLCBhZXMoeCA9IGxvbmcsIHkgPSBsYXQsIGdyb3VwID0gZ3JvdXApKSArIAogIGdlb21fcG9seWdvbihmaWxsID0gIndoaXRlIiwgY29sb3IgPSAiYmxhY2siKSAKCmBgYAoKIyMjIyMgNy4yLjEzIE1lcmdlIHRoZSBEYXRhZnJhbWVzIChgc3RhdGVNYXBgIGFuZCBgbXVyZGVyc2ApCmBgYHtyfQojIENyZWF0ZSBhIG5ldyB2YXJpYWJsZSBjYWxsZWQgcmVnaW9uIHdpdGggdGhlIGxvd2VyY2FzZSBuYW1lcyB0byAKIyBtYXRjaCB0aGUgc3RhdGVzTWFwOgptdXJkZXJzJHJlZ2lvbiA9IHRvbG93ZXIobXVyZGVycyRTdGF0ZSkKCiMgSm9pbiB0aGUgc3RhdGVzTWFwIGRhdGEgYW5kIHRoZSBtdXJkZXJzIGRhdGEgaW50byBvbmUgZGF0YWZyYW1lOgptdXJkZXJNYXAgPSBtZXJnZShzdGF0ZXNNYXAsIG11cmRlcnMsIGJ5PSJyZWdpb24iKSAgICMg5ZCI5L215Zyw5ZyWCnN0cihtdXJkZXJNYXApCmBgYAoKIyMjIyMgNy4yLjE0IE1hcC0xOiBOby4gTXVyZGVycyBwZXIgU3RhdGUKYGBge3J9CiMgUGxvdCB0aGUgbnVtYmVyIG9mIG11cmRlciBvbiBvdXIgbWFwIG9mIHRoZSBVbml0ZWQgU3RhdGVzOgpnZ3Bsb3QobXVyZGVyTWFwLCBhZXMoeCA9IGxvbmcsIHkgPSBsYXQsIGdyb3VwID0gZ3JvdXAsIGZpbGwgPSBNdXJkZXJzKSkgKyAKICBnZW9tX3BvbHlnb24oY29sb3IgPSAiYmxhY2siKSArIAogIHNjYWxlX2ZpbGxfZ3JhZGllbnQobG93ID0gImJsYWNrIiwgaGlnaCA9ICJyZWQiLCBndWlkZSA9ICJsZWdlbmQiKQpgYGAKCiMjIyMjIDcuMi4xNSBNYXAtMjogUG9wdWxhdGlvbnMgcGVyIFN0YXRlCmBgYHtyfQojIFBsb3QgYSBtYXAgb2YgdGhlIHBvcHVsYXRpb246CmdncGxvdChtdXJkZXJNYXAsIGFlcyh4ID0gbG9uZywgeSA9IGxhdCwgZ3JvdXAgPSBncm91cCwgZmlsbCA9IFBvcHVsYXRpb24pKSArIAogIGdlb21fcG9seWdvbihjb2xvciA9ICJibGFjayIpICsgCiAgc2NhbGVfZmlsbF9ncmFkaWVudChsb3cgPSAiYmxhY2siLCBoaWdoID0gInJlZCIsIGd1aWRlID0gImxlZ2VuZCIpCmBgYAoKIyMjIyMgNy4yLjE2IE1hcC0zOiBOby4gTXVyZGVycyBwZXIgMTAwSyBQb3B1bGF0aW9uCmBgYHtyfQojIENyZWF0ZSBhIG5ldyB2YXJpYWJsZSB0aGF0IGlzIHRoZSBudW1iZXIgb2YgbXVyZGVycyBwZXIgMTAwLDAwMCBwb3B1bGF0aW9uOgptdXJkZXJNYXAkTXVyZGVyUmF0ZSA9IG11cmRlck1hcCRNdXJkZXJzIC8gbXVyZGVyTWFwJFBvcHVsYXRpb24gKiAxMDAwMDAKCiMgUmVkbyBvdXIgcGxvdCB3aXRoIG11cmRlciByYXRlOgpnZ3Bsb3QobXVyZGVyTWFwLCBhZXMoeCA9IGxvbmcsIHkgPSBsYXQsIGdyb3VwID0gZ3JvdXAsIGZpbGwgPSBNdXJkZXJSYXRlKSkgKyAKICBnZW9tX3BvbHlnb24oY29sb3IgPSAiYmxhY2siKSArIAogIHNjYWxlX2ZpbGxfZ3JhZGllbnQobG93ID0gImJsYWNrIiwgaGlnaCA9ICJyZWQiLCBndWlkZSA9ICJsZWdlbmQiKQpgYGAKCiMjIyMjIDcuMi4xNyBNYXAtNDogTm8uIE11cmRlcnMgcGVyIDEwMEsgUG9wdWxhdGlvbiB3aXRoIEZpbHRlcgpgYGB7cn0KIyBSZWRvIHRoZSBwbG90LCBDYXAgdGhlIE11cmRlcnJhdGUgYXQgMTA6CmdncGxvdChtdXJkZXJNYXAsIGFlcyh4ID0gbG9uZywgeSA9IGxhdCwgZ3JvdXAgPSBncm91cCwgZmlsbCA9IE11cmRlclJhdGUpKSArIAogIGdlb21fcG9seWdvbihjb2xvciA9ICJibGFjayIpICsgCiAgc2NhbGVfZmlsbF9ncmFkaWVudChsb3cgPSAiYmxhY2siLCBoaWdoID0gInJlZCIsIAogICAgICAgICAgICAgICAgICAgICAgZ3VpZGUgPSAibGVnZW5kIiwgbGltaXRzID0gYygwLDEwKSkKYGBgCgojIyMjIyA3LjIuMTggTWFwLTU6IEd1biBPd25lcnNoaXAgKCUpIGJ5IFN0YXRlcwpgYGB7cn0KZ2dwbG90KG11cmRlck1hcCxhZXMoeD1sb25nLHk9bGF0LGdyb3VwPWdyb3VwLGZpbGw9R3VuT3duZXJzaGlwKSkgKyAKICBnZW9tX3BvbHlnb24oY29sb3IgPSAiYmxhY2siKSArIAogIHNjYWxlX2ZpbGxfZ3JhZGllbnQobG93ID0gImJsYWNrIiwgaGlnaCA9ICJyZWQiLCBndWlkZSA9ICJsZWdlbmQiKQpgYGAKCiMjIyMjIDcuMi4xOSBHdW4gT3duZXJzaGlwICglKSBieSBTdGF0ZXMKYGBge3IgZmlnLndpZHRoPTgsIGZpZy5oZWlnaHQ9My4yfQp0YXBwbHkobXVyZGVyTWFwJEd1bk93bmVyc2hpcCwgbXVyZGVyTWFwJHJlZ2lvbiwgbWVhbikgJT4lIHNvcnQgJT4lIAogIGJhcnBsb3QobGFzPTIsIGNleC5uYW1lcz0wLjYsIG1haW49IkF2ZXJnZSBHdW5Pd25lclNoaXAgKCUpIikKYGBgCjxicj4KCi0gLSAtCgo8YnI+PGJyPjxicj48YnI+PGJyPgoKPHN0eWxlPgouY2FwdGlvbiB7CiAgY29sb3I6ICM3Nzc7CiAgbWFyZ2luLXRvcDogMTBweDsKfQpwIGNvZGUgewogIHdoaXRlLXNwYWNlOiBpbmhlcml0Owp9CnByZSB7CiAgd29yZC1icmVhazogbm9ybWFsOwogIHdvcmQtd3JhcDogbm9ybWFsOwogIGxpbmUtaGVpZ2h0OiAxOwp9CnByZSBjb2RlIHsKICB3aGl0ZS1zcGFjZTogaW5oZXJpdDsKfQpwLGxpIHsKICBmb250LWZhbWlseTogIlRyZWJ1Y2hldCBNUyIsICLlvq7ou5/mraPpu5Hpq5QiLCAiTWljcm9zb2Z0IEpoZW5nSGVpIjsKfQoKLnJ7CiAgbGluZS1oZWlnaHQ6IDEuMjsKfQoKdGl0bGV7CiAgY29sb3I6ICNjYzAwMDA7CiAgZm9udC1mYW1pbHk6ICJUcmVidWNoZXQgTVMiLCAi5b6u6Luf5q2j6buR6auUIiwgIk1pY3Jvc29mdCBKaGVuZ0hlaSI7Cn0KCmJvZHl7CiAgZm9udC1mYW1pbHk6ICJUcmVidWNoZXQgTVMiLCAi5b6u6Luf5q2j6buR6auUIiwgIk1pY3Jvc29mdCBKaGVuZ0hlaSI7Cn0KCmgxLGgyLGgzLGg0LGg1ewogIGNvbG9yOiAjMDA4ODAwOwogIGZvbnQtZmFtaWx5OiAiVHJlYnVjaGV0IE1TIiwgIuW+rui7n+ato+m7kemrlCIsICJNaWNyb3NvZnQgSmhlbmdIZWkiOwp9CgpoM3sKICBjb2xvcjogI2IzNmIwMDsKICBiYWNrZ3JvdW5kOiAjZmZlMGIzOwogIGxpbmUtaGVpZ2h0OiAyOwogIGZvbnQtd2VpZ2h0OiBib2xkOwp9CgpoNXsKICBjb2xvcjogIzAwNjAwMDsKICBiYWNrZ3JvdW5kOiAjZmZmZmUwOwogIGxpbmUtaGVpZ2h0OiAyOwogIGZvbnQtd2VpZ2h0OiBib2xkOwp9CgplbXsKICBjb2xvcjogIzAwMDBjMDsKICBiYWNrZ3JvdW5kOiAjZjBmMGYwOwogIH0KPC9zdHlsZT4K