Student ID: 1A182901-2


  1. Set up environment
rm(list=ls(all=TRUE))
setwd("~/Desktop/R/polimetrics")
library(manifestoR)
library(quanteda)
library(ggplot2)
library(DT)
library(cowplot)
  1. Download Data
#Download Data
mp_setapikey(key.file = NULL, key = "e51dc314a21ce75bd8221fcb338e2ee5")
mp_use_corpus_version("2017-2")
cmp <- mp_maindataset()
cmp$vanilla_i <- vanilla(cmp,invert = TRUE)
sa <- mp_corpus(countryname=="South Africa" & date == 201405)
quanteda_sa <- corpus(sa)
  1. Construct dfm
dfm_sa <- dfm(quanteda_sa, stem = TRUE, tolower=TRUE, remove_punct = TRUE, remove = stopwords("english"),  remove_numbers=TRUE)
dfm_sa2 <- dfm_group(dfm_sa, "manifesto_id") 
  1. 5 most frequent words
ffc <- textstat_frequency(dfm_sa2, n = 5, group = "manifesto_id") 
sa_cmp <- cmp[ which(cmp $countryname=="South Africa"  & cmp $date == 201405),]
ffc <- mutate(ffc,manifesto_id = factor(group, labels = sa_cmp$partyname)) 
ffc$name <- paste(LETTERS[1:25],ffc$feature,sep="")
ggplot(ffc,aes(x = reorder(name,frequency), y = frequency, fill = manifesto_id)) +
  geom_col(width = 0.8, show.legend = FALSE) +
  theme_bw()+
  labs(x = NULL, y = "5 most frequent words for each party") +
  facet_wrap(vars(manifesto_id), ncol = 2, scales = "free") +
  scale_fill_brewer(palette = "Set1")+
  scale_x_discrete(labels = setNames(ffc$feature, ffc$name))+
  coord_flip()

  1. Wordfish
wfmsa <- textmodel_wordfish(dfm_sa2, dir = c(2, 3))
v_wf <- wfmsa$theta
df_wf <- as.data.frame(v_wf)
df_wf$min <- wfmsa$theta-wfmsa$se.theta
df_wf$max <- wfmsa$theta+wfmsa$se.theta
df_wf$title <- sa_cmp$partyname
##Graph
gr_wf <- ggplot(df_wf,aes(y=reorder(title,v_wf),x=v_wf,color=title))
gr_wf_res <- gr_wf + geom_point(size=3) +  ylab("") + xlab("") + theme_light() + theme(legend.position="none")
gr_wf_res

  1. Wordscore
ws <- textmodel_wordscores(dfm_sa2, c(NA,5.2,10.5,NA,NA))
pr_raw <- predict(ws, newdata = dfm_sa2)
df_raw <- as.data.frame(pr_raw)
df_raw$title <- sa_cmp$partyname
##Graph
gr_ws <- ggplot(df_raw,aes(y=reorder(title,pr_raw),x=pr_raw,color=title))
gr_ws_res <- gr_ws + geom_point(size=3) + ylab("") + xlab("")+theme_light() + theme(legend.position="none")
gr_ws_res

  1. CMP data
sa_cmp$right <- sa_cmp$per104+sa_cmp$per201+sa_cmp$per203+sa_cmp$per305+sa_cmp$per401+sa_cmp$per402+sa_cmp$per407+sa_cmp$per414+sa_cmp$per505+sa_cmp$per601+sa_cmp$per603+sa_cmp$per605+sa_cmp$per606
sa_cmp$left <- sa_cmp$per103+sa_cmp$per105+sa_cmp$per106+sa_cmp$per107+sa_cmp$per202+sa_cmp$per403+sa_cmp$per404+sa_cmp$per406+sa_cmp$per412+sa_cmp$per413+sa_cmp$per504+sa_cmp$per506+sa_cmp$per701
sa_cmp$RILE <- sa_cmp$right-sa_cmp$left
sa_cmp$RATIO <- (sa_cmp$right-sa_cmp$left)/(sa_cmp$right+sa_cmp$left)
sa_cmp$LOGIT <- mp_scale(sa_cmp, scalingfun = logit_rile)
  1. Graph CMP result
df_sa <- data.frame(party=sa_cmp$partyname,
                     rile=sa_cmp$RILE,
                     ratio=sa_cmp$RATIO,
                     logit=sa_cmp$LOGIT,
                     vanilla_i=sa_cmp$vanilla_i)
gr_rl <- ggplot(df_sa,aes(x=rile,y=reorder(party,rile),color=party))+
  geom_point(size=3)+
  theme_gray()+
  theme(legend.position="none")+
  theme(axis.ticks = element_blank(), axis.text.y = element_blank())+
  ylab("")
gr_rl_l <- ggplot(df_sa,aes(x=rile,y=reorder(party,rile),color=party))+
  geom_point()+
  theme(axis.ticks = element_blank(), axis.text.y = element_blank())+
  theme(legend.text = element_text(size = 14))+
  ylab("")
gr_ra <- ggplot(df_sa,aes(x=ratio,y=reorder(party,ratio),color=party))+
  geom_point(size=3)+
  theme_gray()+
  theme(legend.position="none")+
  theme(axis.ticks = element_blank(), axis.text.y = element_blank())+
  ylab("")
gr_lo <- ggplot(df_sa,aes(x=logit,y=reorder(party,logit),color=party))+
  geom_point(size=3)+
  theme_gray()+
  theme(legend.position="none")+
  theme(axis.ticks = element_blank(), axis.text.y = element_blank())+
  ylab("")
gr_va <- ggplot(df_sa,aes(x=vanilla_i,y=reorder(party,vanilla_i),color=party))+
  geom_point(size=3)+
  theme_gray()+
  theme(legend.position="none")+
  theme(axis.ticks = element_blank(), axis.text.y = element_blank())+
  xlab("vanilla(invert)")+
  ylab("")
gr_res <- plot_grid(gr_rl,gr_ra,gr_lo,gr_va,labels=colnames(df_sa)[2:5],label_size = 12, nrow = 4,ncol = 1)
legend <- get_legend(gr_rl_l)
gr_res2 <- plot_grid(gr_res,legend,rel_widths = c(1,.8))
gr_res2

  1. Combine Wordfish, Wordscore, and CMP
gr_wf_res2 <- gr_wf_res + theme(axis.ticks = element_blank(), axis.text.y = element_blank())
gr_ws_res2 <- gr_ws_res + theme(axis.ticks = element_blank(), axis.text.y = element_blank())
gr_right <- plot_grid(gr_wf_res2,gr_ws_res2,legend,nrow = 3,labels = c("Wordfish","Wordscore",""),label_size = 12)
gr_com <- plot_grid(gr_res,gr_right)
gr_com

  1. Discussion

LS0tCnRpdGxlOiAiSG9tZSBBc3NpZ25tZW50IDMiCm91dHB1dDogaHRtbF9ub3RlYm9vawphdXRob3I6IFllbiBDaGVuZyBIc3VhbgotLS0KIyMjI1N0dWRlbnQgSUQ6IDFBMTgyOTAxLTIKKioqCgo+MS4gU2V0IHVwIGVudmlyb25tZW50CgpgYGB7ciwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0Kcm0obGlzdD1scyhhbGw9VFJVRSkpCnNldHdkKCJ+L0Rlc2t0b3AvUi9wb2xpbWV0cmljcyIpCmxpYnJhcnkobWFuaWZlc3RvUikKbGlicmFyeShxdWFudGVkYSkKbGlicmFyeShnZ3Bsb3QyKQpsaWJyYXJ5KERUKQpsaWJyYXJ5KGNvd3Bsb3QpCmBgYAo+Mi4gRG93bmxvYWQgRGF0YQoKYGBge3IsIGVjaG89VFJVRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KI0Rvd25sb2FkIERhdGEKbXBfc2V0YXBpa2V5KGtleS5maWxlID0gTlVMTCwga2V5ID0gImU1MWRjMzE0YTIxY2U3NWJkODIyMWZjYjMzOGUyZWU1IikKbXBfdXNlX2NvcnB1c192ZXJzaW9uKCIyMDE3LTIiKQpjbXAgPC0gbXBfbWFpbmRhdGFzZXQoKQpjbXAkdmFuaWxsYV9pIDwtIHZhbmlsbGEoY21wLGludmVydCA9IFRSVUUpCnNhIDwtIG1wX2NvcnB1cyhjb3VudHJ5bmFtZT09IlNvdXRoIEFmcmljYSIgJiBkYXRlID09IDIwMTQwNSkKcXVhbnRlZGFfc2EgPC0gY29ycHVzKHNhKQpgYGAKPjMuIENvbnN0cnVjdCBkZm0KCmBgYHtyLCB3YXJuaW5nPUZBTFNFfQpkZm1fc2EgPC0gZGZtKHF1YW50ZWRhX3NhLCBzdGVtID0gVFJVRSwgdG9sb3dlcj1UUlVFLCByZW1vdmVfcHVuY3QgPSBUUlVFLCByZW1vdmUgPSBzdG9wd29yZHMoImVuZ2xpc2giKSwgIHJlbW92ZV9udW1iZXJzPVRSVUUpCgpkZm1fc2EyIDwtIGRmbV9ncm91cChkZm1fc2EsICJtYW5pZmVzdG9faWQiKSAKYGBgCj40LiA1IG1vc3QgZnJlcXVlbnQgd29yZHMKCmBgYHtyLCB3YXJuaW5nPUZBTFNFfQpmZmMgPC0gdGV4dHN0YXRfZnJlcXVlbmN5KGRmbV9zYTIsIG4gPSA1LCBncm91cCA9ICJtYW5pZmVzdG9faWQiKSAKc2FfY21wIDwtIGNtcFsgd2hpY2goY21wICRjb3VudHJ5bmFtZT09IlNvdXRoIEFmcmljYSIgICYgY21wICRkYXRlID09IDIwMTQwNSksXQpmZmMgPC0gbXV0YXRlKGZmYyxtYW5pZmVzdG9faWQgPSBmYWN0b3IoZ3JvdXAsIGxhYmVscyA9IHNhX2NtcCRwYXJ0eW5hbWUpKSAKZmZjJG5hbWUgPC0gcGFzdGUoTEVUVEVSU1sxOjI1XSxmZmMkZmVhdHVyZSxzZXA9IiIpCgpnZ3Bsb3QoZmZjLGFlcyh4ID0gcmVvcmRlcihuYW1lLGZyZXF1ZW5jeSksIHkgPSBmcmVxdWVuY3ksIGZpbGwgPSBtYW5pZmVzdG9faWQpKSArCiAgZ2VvbV9jb2wod2lkdGggPSAwLjgsIHNob3cubGVnZW5kID0gRkFMU0UpICsKICB0aGVtZV9idygpKwogIGxhYnMoeCA9IE5VTEwsIHkgPSAiNSBtb3N0IGZyZXF1ZW50IHdvcmRzIGZvciBlYWNoIHBhcnR5IikgKwogIGZhY2V0X3dyYXAodmFycyhtYW5pZmVzdG9faWQpLCBuY29sID0gMiwgc2NhbGVzID0gImZyZWUiKSArCiAgc2NhbGVfZmlsbF9icmV3ZXIocGFsZXR0ZSA9ICJTZXQxIikrCiAgc2NhbGVfeF9kaXNjcmV0ZShsYWJlbHMgPSBzZXROYW1lcyhmZmMkZmVhdHVyZSwgZmZjJG5hbWUpKSsKICBjb29yZF9mbGlwKCkKYGBgCj41LiBXb3JkZmlzaAoKYGBge3IsIHdhcm5pbmc9RkFMU0V9CndmbXNhIDwtIHRleHRtb2RlbF93b3JkZmlzaChkZm1fc2EyLCBkaXIgPSBjKDIsIDMpKQoKdl93ZiA8LSB3Zm1zYSR0aGV0YQpkZl93ZiA8LSBhcy5kYXRhLmZyYW1lKHZfd2YpCmRmX3dmJG1pbiA8LSB3Zm1zYSR0aGV0YS13Zm1zYSRzZS50aGV0YQpkZl93ZiRtYXggPC0gd2Ztc2EkdGhldGErd2Ztc2Ekc2UudGhldGEKZGZfd2YkdGl0bGUgPC0gc2FfY21wJHBhcnR5bmFtZQojI0dyYXBoCmdyX3dmIDwtIGdncGxvdChkZl93ZixhZXMoeT1yZW9yZGVyKHRpdGxlLHZfd2YpLHg9dl93Zixjb2xvcj10aXRsZSkpCmdyX3dmX3JlcyA8LSBncl93ZiArIGdlb21fcG9pbnQoc2l6ZT0zKSArICB5bGFiKCIiKSArIHhsYWIoIiIpICsgdGhlbWVfbGlnaHQoKSArIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIpCmdyX3dmX3JlcwpgYGAKPjYuIFdvcmRzY29yZQoKYGBge3IsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CndzIDwtIHRleHRtb2RlbF93b3Jkc2NvcmVzKGRmbV9zYTIsIGMoTkEsNS4yLDEwLjUsTkEsTkEpKQpwcl9yYXcgPC0gcHJlZGljdCh3cywgbmV3ZGF0YSA9IGRmbV9zYTIpCmRmX3JhdyA8LSBhcy5kYXRhLmZyYW1lKHByX3JhdykKZGZfcmF3JHRpdGxlIDwtIHNhX2NtcCRwYXJ0eW5hbWUKIyNHcmFwaApncl93cyA8LSBnZ3Bsb3QoZGZfcmF3LGFlcyh5PXJlb3JkZXIodGl0bGUscHJfcmF3KSx4PXByX3Jhdyxjb2xvcj10aXRsZSkpCmdyX3dzX3JlcyA8LSBncl93cyArIGdlb21fcG9pbnQoc2l6ZT0zKSArIHlsYWIoIiIpICsgeGxhYigiIikrdGhlbWVfbGlnaHQoKSArIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIpCmdyX3dzX3JlcwpgYGAKPjcuIENNUCBkYXRhCgpgYGB7ciwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0Kc2FfY21wJHJpZ2h0IDwtIHNhX2NtcCRwZXIxMDQrc2FfY21wJHBlcjIwMStzYV9jbXAkcGVyMjAzK3NhX2NtcCRwZXIzMDUrc2FfY21wJHBlcjQwMStzYV9jbXAkcGVyNDAyK3NhX2NtcCRwZXI0MDcrc2FfY21wJHBlcjQxNCtzYV9jbXAkcGVyNTA1K3NhX2NtcCRwZXI2MDErc2FfY21wJHBlcjYwMytzYV9jbXAkcGVyNjA1K3NhX2NtcCRwZXI2MDYKc2FfY21wJGxlZnQgPC0gc2FfY21wJHBlcjEwMytzYV9jbXAkcGVyMTA1K3NhX2NtcCRwZXIxMDYrc2FfY21wJHBlcjEwNytzYV9jbXAkcGVyMjAyK3NhX2NtcCRwZXI0MDMrc2FfY21wJHBlcjQwNCtzYV9jbXAkcGVyNDA2K3NhX2NtcCRwZXI0MTIrc2FfY21wJHBlcjQxMytzYV9jbXAkcGVyNTA0K3NhX2NtcCRwZXI1MDYrc2FfY21wJHBlcjcwMQpzYV9jbXAkUklMRSA8LSBzYV9jbXAkcmlnaHQtc2FfY21wJGxlZnQKc2FfY21wJFJBVElPIDwtIChzYV9jbXAkcmlnaHQtc2FfY21wJGxlZnQpLyhzYV9jbXAkcmlnaHQrc2FfY21wJGxlZnQpCnNhX2NtcCRMT0dJVCA8LSBtcF9zY2FsZShzYV9jbXAsIHNjYWxpbmdmdW4gPSBsb2dpdF9yaWxlKQpgYGAKPjguIEdyYXBoIENNUCByZXN1bHQKCmBgYHtyfQpkZl9zYSA8LSBkYXRhLmZyYW1lKHBhcnR5PXNhX2NtcCRwYXJ0eW5hbWUsCiAgICAgICAgICAgICAgICAgICAgIHJpbGU9c2FfY21wJFJJTEUsCiAgICAgICAgICAgICAgICAgICAgIHJhdGlvPXNhX2NtcCRSQVRJTywKICAgICAgICAgICAgICAgICAgICAgbG9naXQ9c2FfY21wJExPR0lULAogICAgICAgICAgICAgICAgICAgICB2YW5pbGxhX2k9c2FfY21wJHZhbmlsbGFfaSkKCmdyX3JsIDwtIGdncGxvdChkZl9zYSxhZXMoeD1yaWxlLHk9cmVvcmRlcihwYXJ0eSxyaWxlKSxjb2xvcj1wYXJ0eSkpKwogIGdlb21fcG9pbnQoc2l6ZT0zKSsKICB0aGVtZV9ncmF5KCkrCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uPSJub25lIikrCiAgdGhlbWUoYXhpcy50aWNrcyA9IGVsZW1lbnRfYmxhbmsoKSwgYXhpcy50ZXh0LnkgPSBlbGVtZW50X2JsYW5rKCkpKwogIHlsYWIoIiIpCmdyX3JsX2wgPC0gZ2dwbG90KGRmX3NhLGFlcyh4PXJpbGUseT1yZW9yZGVyKHBhcnR5LHJpbGUpLGNvbG9yPXBhcnR5KSkrCiAgZ2VvbV9wb2ludCgpKwogIHRoZW1lKGF4aXMudGlja3MgPSBlbGVtZW50X2JsYW5rKCksIGF4aXMudGV4dC55ID0gZWxlbWVudF9ibGFuaygpKSsKICB0aGVtZShsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQpKSsKICB5bGFiKCIiKQpncl9yYSA8LSBnZ3Bsb3QoZGZfc2EsYWVzKHg9cmF0aW8seT1yZW9yZGVyKHBhcnR5LHJhdGlvKSxjb2xvcj1wYXJ0eSkpKwogIGdlb21fcG9pbnQoc2l6ZT0zKSsKICB0aGVtZV9ncmF5KCkrCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uPSJub25lIikrCiAgdGhlbWUoYXhpcy50aWNrcyA9IGVsZW1lbnRfYmxhbmsoKSwgYXhpcy50ZXh0LnkgPSBlbGVtZW50X2JsYW5rKCkpKwogIHlsYWIoIiIpCmdyX2xvIDwtIGdncGxvdChkZl9zYSxhZXMoeD1sb2dpdCx5PXJlb3JkZXIocGFydHksbG9naXQpLGNvbG9yPXBhcnR5KSkrCiAgZ2VvbV9wb2ludChzaXplPTMpKwogIHRoZW1lX2dyYXkoKSsKICB0aGVtZShsZWdlbmQucG9zaXRpb249Im5vbmUiKSsKICB0aGVtZShheGlzLnRpY2tzID0gZWxlbWVudF9ibGFuaygpLCBheGlzLnRleHQueSA9IGVsZW1lbnRfYmxhbmsoKSkrCiAgeWxhYigiIikKZ3JfdmEgPC0gZ2dwbG90KGRmX3NhLGFlcyh4PXZhbmlsbGFfaSx5PXJlb3JkZXIocGFydHksdmFuaWxsYV9pKSxjb2xvcj1wYXJ0eSkpKwogIGdlb21fcG9pbnQoc2l6ZT0zKSsKICB0aGVtZV9ncmF5KCkrCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uPSJub25lIikrCiAgdGhlbWUoYXhpcy50aWNrcyA9IGVsZW1lbnRfYmxhbmsoKSwgYXhpcy50ZXh0LnkgPSBlbGVtZW50X2JsYW5rKCkpKwogIHhsYWIoInZhbmlsbGEoaW52ZXJ0KSIpKwogIHlsYWIoIiIpCmdyX3JlcyA8LSBwbG90X2dyaWQoZ3JfcmwsZ3JfcmEsZ3JfbG8sZ3JfdmEsbGFiZWxzPWNvbG5hbWVzKGRmX3NhKVsyOjVdLGxhYmVsX3NpemUgPSAxMiwgbnJvdyA9IDQsbmNvbCA9IDEpCmxlZ2VuZCA8LSBnZXRfbGVnZW5kKGdyX3JsX2wpCmdyX3JlczIgPC0gcGxvdF9ncmlkKGdyX3JlcyxsZWdlbmQscmVsX3dpZHRocyA9IGMoMSwuOCkpCmdyX3JlczIKYGBgCj45LiBDb21iaW5lIFdvcmRmaXNoLCBXb3Jkc2NvcmUsIGFuZCBDTVAKCmBgYHtyfQpncl93Zl9yZXMyIDwtIGdyX3dmX3JlcyArIHRoZW1lKGF4aXMudGlja3MgPSBlbGVtZW50X2JsYW5rKCksIGF4aXMudGV4dC55ID0gZWxlbWVudF9ibGFuaygpKQpncl93c19yZXMyIDwtIGdyX3dzX3JlcyArIHRoZW1lKGF4aXMudGlja3MgPSBlbGVtZW50X2JsYW5rKCksIGF4aXMudGV4dC55ID0gZWxlbWVudF9ibGFuaygpKQoKZ3JfcmlnaHQgPC0gcGxvdF9ncmlkKGdyX3dmX3JlczIsZ3Jfd3NfcmVzMixsZWdlbmQsbnJvdyA9IDMsbGFiZWxzID0gYygiV29yZGZpc2giLCJXb3Jkc2NvcmUiLCIiKSxsYWJlbF9zaXplID0gMTIpCmdyX2NvbSA8LSBwbG90X2dyaWQoZ3JfcmVzLGdyX3JpZ2h0KQpncl9jb20KYGBgCgo+MTAuIERpc2N1c3Npb24KCiogQWNjb3JkaW5nIHRvIHRoZSBncmFwaCBvZiBXb3JkZmlzaCwgV29yZHNjb3JlLCBDTVAgZGF0YSBvZiBTb3V0aCBBZnJpY2EgaW4gMjAxNCwgd2UgY291bGQgaGF2ZSBzZXZlcmFsIGNvbmNsdXNpb25zLgogICAgKyBEZXNwaXRlIHRoZSBvcmRlciBjaGFuZ2VkIHNvbWV0aW1lcywgQWZyaWNhbiBOYXRpb25hbCBDb25ncmVzcyhyZWQpLCBDb25ncmVzcyBvZiBwZW9wbGUoYnJvd24pLCBFY29ub21pYyBGcmVlZG9tIEZpZ3RlcnMoYmx1ZSkgd2VyZSBvbiB0aGUgbGVmdCBpbiBldmVyeSByZXN1bHQsIGNvbXBhcmluZyB0byBEZW1vY3JhdGljIEFsbGlhbmNlKGdyZWVuKSBhbmQgSW5rYXRoYSBGcmVlZG9tIFBhcnR5KHBpbmspLgogICAgKyBJbiB0aGUgbGVmdCBwYXJ0IG9mIHRoZSBncmFwaCwKICAgICAgICAxLiBUaGUgZGl2ZXJnZW5jZSBiZXR3ZWVuIFJJTEUgYW5kIFJBVElPIHJlc3VsdHMsIHJlcHJlc2VudGVkIHRoZSBlZmZlY3Qgb2YgY2hhbmdpbmcgYW5hbHl0aWNhbCB0b29scy4KICAgICAgICAyLiBUaGUgcmVzdWx0IG9mIHZhbmlsbGEoaW52ZXJ0ZWQpLCByZXZlYWxlZCB0aGUgZGlzdGluY3QgcGF0dGVybiwgd2hpY2ggbWVhbnQgdGhhdCB0aG9zZSBtYW5pZmVzdG9lcyBjb250YWluZWQgbW9yZSB0aGFuIGxlZnQtcmlnaHQgc2NhbGUuCiAgICArIENvbXBhcmluZyBDTVAgYW5kIFdvcmRmaXNoLCB3b3Jkc2NvcmUsCiAgICAgICAgMS4gVGhlIHJlc3VsdHMgb2YgUkFUSU8gYW5kIExPR0lUIHdlcmUgc2ltaWxhciB0byB0aGUgcmVzdWx0IG9mIHdvcmRzY29yZS4gVGhvc2UgdGhyZWUgbGVmdC1yaWdodCBzY2FsZSBhbmFseXNlcyByZXByZXNlbnRlZCBzb21lIHJvYnVzdG5lc3MsIHJlZ2FyZGxlc3MgdXNpbmcgc2VudGVuY2VzIG9mIHdob2xlIG1hbmlmZXN0b2VzLgogICAgICAgIDIuIFRoZSB0d28gYnJvYWQgbWV0aG9kcywgdmFuaWxsYSBhbmQgd29yZGZpc2gsIG5vdCBvbmx5IHByZXNlbnRlZCBkaWZmZXJlbnQgcGF0dGVybnMsIGJ1dCBhbHNvIHN1Z2dlc3RlZCB0aGUgZGlzdGluY3Qgb3V0Y29tZXMgZnJvbSBvdGhlciBsZWZ0LXJpZ2h0IGFuYWx5c2VzLiBUaGUgZnVydGhlciBpbXBsaWNhdGlvbnMgb3IgZGlzY3Vzc2lvbnMgcmVxdWlyZSBtb3JlIGluZm9ybWF0aW9uLCBzdWNoIGFzIHRoZSBwb2xpdGljYWwgY29hbGl0aW9ucyBvciBzZWF0cywgb3IgdGhlIGFuYWx5c2VzIG9mIG90aGVyIHNjYWxlcy4KCgoqKio=