library(data.table)
library(dplyr) #data manipulation
library(ggplot2) #visualizations
library(gridExtra) #viewing multiple plots together
library(tidytext) #text mining
#library(wordcloud2) #creative visualizations
load data
lyric_data=fread('../data/prince_raw_data.csv')

2.1 The sentiments dataset

library(tidytext)
sentiments  

The three general-purpose lexicons are

get_sentiments("afinn")
get_sentiments("bing")
get_sentiments("nrc")

2.2 Sentiment analysis with inner join

library(janeaustenr)
library(dplyr)
library(stringr)
original_songs <- lyric_data[,1:6] %>%
  group_by(album) %>%
  mutate(linenumber = row_number()) %>% 
  ungroup()
tidy_songs<-original_songs %>%
  unnest_tokens(word, text)
nrc_joy <- get_sentiments("nrc") %>% 
  filter(sentiment == "joy")
tidy_songs %>%
  inner_join(nrc_joy) %>%
  count(word, sort = TRUE)
Joining, by = "word"
tidy_songs %>% 
  group_by(.,album) %>%
  summarise(
    count=n()
  ) %>% .[order(.$count,decreasing = T),]
library(tidyr)
tidy_4albums<-tidy_songs %>%
  filter(.,album %in% 
           c('Other Songs',
             'Emancipation',
             'Crystal Ball',
             'Crystal Ball'))
song_lyric_sentiment <-tidy_4albums %>%
  inner_join(get_sentiments("bing")) %>%
  count(album, index = linenumber %/% 2, sentiment) %>%
  spread(sentiment, n, fill = 0) %>%
  mutate(sentiment = positive - negative)
Joining, by = "word"
library(ggplot2)
ggplot(song_lyric_sentiment, 
       aes(index, sentiment, fill = album)) +
  geom_col(show.legend = FALSE) +
  facet_wrap(~album, ncol = 2, scales = "free_x")

2.3 Comparing the three sentiment dictionaries

afinn <- tidy_4albums %>% 
  inner_join(get_sentiments("afinn")) %>% 
  group_by(index = linenumber %/% 2) %>% 
  summarise(sentiment = sum(score)) %>% 
  mutate(method = "AFINN")
Joining, by = "word"
bing_and_nrc <- bind_rows(tidy_4albums %>% 
                                        inner_join(get_sentiments("bing")) %>%
          mutate(method = "Bing et al."),
          tidy_4albums %>% 
          inner_join(get_sentiments("nrc") %>% 
          filter(sentiment %in% 
                   c("positive", 
                     "negative"))) %>%
                  mutate(method = "NRC")) %>%
  count(method, index = linenumber %/% 2, sentiment) %>%
  spread(sentiment, n, fill = 0) %>%
  mutate(sentiment = positive - negative)
Joining, by = "word"
Joining, by = "word"
bind_rows(afinn, 
          bing_and_nrc) %>%
  ggplot(aes(index, sentiment, fill = method)) +
  geom_col(show.legend = FALSE) +
  facet_wrap(~method, ncol = 1, scales = "free_y")

get_sentiments("nrc") %>% 
     filter(sentiment %in% c("positive", 
                             "negative")) %>% 
  count(sentiment)
get_sentiments("bing") %>% 
  count(sentiment)

2.4 Most common positive and negative words

bing_word_counts <- tidy_songs %>%
  inner_join(get_sentiments("bing")) %>%
  count(word, sentiment, sort = TRUE) %>%
  ungroup()
Joining, by = "word"
bing_word_counts
bing_word_counts %>%
  group_by(sentiment) %>%
  top_n(10) %>%
  ungroup() %>%
  mutate(word = reorder(word, n)) %>%
  ggplot(aes(word, n, fill = sentiment)) +
  geom_col(show.legend = FALSE) +
  facet_wrap(~sentiment, scales = "free_y") +
  labs(y = "Contribution to sentiment",
       x = NULL) +
  coord_flip()
Selecting by n

custom_stop_words <- bind_rows(tibble(word = c("miss"), 
                                          lexicon = c("custom")), 
                               stop_words)
custom_stop_words

2.5 Wordclouds

library(wordcloud)
Loading required package: RColorBrewer
tidy_songs %>%
  anti_join(stop_words) %>%
  count(word) %>%
  with(wordcloud(word, n, max.words = 100))
Joining, by = "word"

library(reshape2)
tidy_songs %>%
  inner_join(get_sentiments("bing")) %>%
  count(word, sentiment, sort = TRUE) %>%
  acast(word ~ sentiment, value.var = "n", fill = 0) %>%
  comparison.cloud(colors = c("gray20", "gray80"),
                   max.words = 100)
Joining, by = "word"

2.6 Looking at units beyond just words

斷句

對original_songs$text 斷句

PandP_sentences <- original_songs %>% 
  unnest_tokens(sentence, text, token = "sentences")
PandP_sentences$sentence[2]
[1] "was i the first?"
Regex斷句
austen_books() %>% head(20)
austen_chapters <- austen_books() %>%
  group_by(book) %>%
  unnest_tokens(chapter, text, token = "regex", 
                pattern = "Chapter|CHAPTER [\\dIVXLC]") %>%
  ungroup()
austen_chapters %>% 
  group_by(book) %>% 
  summarise(chapters = n())
bingnegative <- get_sentiments("bing") %>% 
  filter(sentiment == "negative")
wordcounts <- tidy_songs %>%
  group_by(album) %>%
  summarize(words = n())
tidy_songs %>%
  semi_join(bingnegative) %>%
  group_by(album) %>%
  summarize(negativewords = n()) %>%
  left_join(wordcounts, by = c('album')) %>%
  mutate(ratio = negativewords/words) %>%
 
  ungroup()
Joining, by = "word"
LS0tDQp0aXRsZTogIkNIMiBTZW50aW1lbnQgYW5hbHlzaXMgd2l0aCB0aWR5IGRhdGEiDQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sNCi0tLQ0KDQoNCmBgYHtyfQ0KbGlicmFyeShkYXRhLnRhYmxlKQ0KbGlicmFyeShkcGx5cikgI2RhdGEgbWFuaXB1bGF0aW9uDQpsaWJyYXJ5KGdncGxvdDIpICN2aXN1YWxpemF0aW9ucw0KbGlicmFyeShncmlkRXh0cmEpICN2aWV3aW5nIG11bHRpcGxlIHBsb3RzIHRvZ2V0aGVyDQpsaWJyYXJ5KHRpZHl0ZXh0KSAjdGV4dCBtaW5pbmcNCiNsaWJyYXJ5KHdvcmRjbG91ZDIpICNjcmVhdGl2ZSB2aXN1YWxpemF0aW9ucw0KYGBgDQoNCg0KIyMjIyNsb2FkIGRhdGENCg0KYGBge3J9DQpseXJpY19kYXRhPWZyZWFkKCcuLi9kYXRhL3ByaW5jZV9yYXdfZGF0YS5jc3YnKQ0KYGBgDQoNCg0KDQojIyMyLjEgVGhlIHNlbnRpbWVudHMgZGF0YXNldA0KYGBge3J9DQpsaWJyYXJ5KHRpZHl0ZXh0KQ0KDQpzZW50aW1lbnRzICANCmBgYA0KDQpUaGUgdGhyZWUgZ2VuZXJhbC1wdXJwb3NlIGxleGljb25zIGFyZQ0KDQorIEFGSU5OIGZyb20gRmlubiDDhXJ1cCBOaWVsc2VuLA0KKyBiaW5nIGZyb20gQmluZyBMaXUgYW5kIGNvbGxhYm9yYXRvcnMsIGFuZA0KKyBucmMgZnJvbSBTYWlmIE1vaGFtbWFkIGFuZCBQZXRlciBUdXJuZXkuDQoNCg0KYGBge3J9DQpnZXRfc2VudGltZW50cygiYWZpbm4iKQ0KYGBgDQoNCmBgYHtyfQ0KZ2V0X3NlbnRpbWVudHMoImJpbmciKQ0KYGBgDQoNCmBgYHtyfQ0KZ2V0X3NlbnRpbWVudHMoIm5yYyIpDQpgYGANCg0KDQojIyMyLjIgU2VudGltZW50IGFuYWx5c2lzIHdpdGggaW5uZXIgam9pbg0KDQpgYGB7cn0NCmxpYnJhcnkoamFuZWF1c3RlbnIpDQpsaWJyYXJ5KGRwbHlyKQ0KbGlicmFyeShzdHJpbmdyKQ0KDQpvcmlnaW5hbF9zb25ncyA8LSBseXJpY19kYXRhWywxOjZdICU+JQ0KICBncm91cF9ieShhbGJ1bSkgJT4lDQogIG11dGF0ZShsaW5lbnVtYmVyID0gcm93X251bWJlcigpKSAlPiUgDQogIHVuZ3JvdXAoKQ0KDQp0aWR5X3NvbmdzPC1vcmlnaW5hbF9zb25ncyAlPiUNCiAgdW5uZXN0X3Rva2Vucyh3b3JkLCB0ZXh0KQ0KYGBgDQoNCg0KYGBge3J9DQpucmNfam95IDwtIGdldF9zZW50aW1lbnRzKCJucmMiKSAlPiUgDQogIGZpbHRlcihzZW50aW1lbnQgPT0gImpveSIpDQoNCnRpZHlfc29uZ3MgJT4lDQogIGlubmVyX2pvaW4obnJjX2pveSkgJT4lDQogIGNvdW50KHdvcmQsIHNvcnQgPSBUUlVFKQ0KYGBgDQoNCg0KDQoNCmBgYHtyfQ0KdGlkeV9zb25ncyAlPiUgDQogIGdyb3VwX2J5KC4sYWxidW0pICU+JQ0KICBzdW1tYXJpc2UoDQogICAgY291bnQ9bigpDQogICkgJT4lIC5bb3JkZXIoLiRjb3VudCxkZWNyZWFzaW5nID0gVCksXQ0KDQoNCmBgYA0KDQoNCmBgYHtyfQ0KbGlicmFyeSh0aWR5cikNCg0KdGlkeV80YWxidW1zPC10aWR5X3NvbmdzICU+JQ0KICBmaWx0ZXIoLixhbGJ1bSAlaW4lIA0KICAgICAgICAgICBjKCdPdGhlciBTb25ncycsDQogICAgICAgICAgICAgJ0VtYW5jaXBhdGlvbicsDQogICAgICAgICAgICAgJ0NyeXN0YWwgQmFsbCcsDQogICAgICAgICAgICAgJ0NyeXN0YWwgQmFsbCcpKQ0KDQpzb25nX2x5cmljX3NlbnRpbWVudCA8LXRpZHlfNGFsYnVtcyAlPiUNCiAgaW5uZXJfam9pbihnZXRfc2VudGltZW50cygiYmluZyIpKSAlPiUNCiAgY291bnQoYWxidW0sIGluZGV4ID0gbGluZW51bWJlciAlLyUgMiwgc2VudGltZW50KSAlPiUNCiAgc3ByZWFkKHNlbnRpbWVudCwgbiwgZmlsbCA9IDApICU+JQ0KICBtdXRhdGUoc2VudGltZW50ID0gcG9zaXRpdmUgLSBuZWdhdGl2ZSkNCmBgYA0KDQoNCg0KYGBge3J9DQpsaWJyYXJ5KGdncGxvdDIpDQoNCmdncGxvdChzb25nX2x5cmljX3NlbnRpbWVudCwgDQogICAgICAgYWVzKGluZGV4LCBzZW50aW1lbnQsIGZpbGwgPSBhbGJ1bSkpICsNCiAgZ2VvbV9jb2woc2hvdy5sZWdlbmQgPSBGQUxTRSkgKw0KICBmYWNldF93cmFwKH5hbGJ1bSwgbmNvbCA9IDIsIHNjYWxlcyA9ICJmcmVlX3giKQ0KYGBgDQoNCg0KIyMjMi4zIENvbXBhcmluZyB0aGUgdGhyZWUgc2VudGltZW50IGRpY3Rpb25hcmllcw0KDQpgYGB7cn0NCmFmaW5uIDwtIHRpZHlfNGFsYnVtcyAlPiUgDQogIGlubmVyX2pvaW4oZ2V0X3NlbnRpbWVudHMoImFmaW5uIikpICU+JSANCiAgZ3JvdXBfYnkoaW5kZXggPSBsaW5lbnVtYmVyICUvJSAyKSAlPiUgDQogIHN1bW1hcmlzZShzZW50aW1lbnQgPSBzdW0oc2NvcmUpKSAlPiUgDQogIG11dGF0ZShtZXRob2QgPSAiQUZJTk4iKQ0KDQpiaW5nX2FuZF9ucmMgPC0gYmluZF9yb3dzKHRpZHlfNGFsYnVtcyAlPiUgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5uZXJfam9pbihnZXRfc2VudGltZW50cygiYmluZyIpKSAlPiUNCiAgICAgICAgICBtdXRhdGUobWV0aG9kID0gIkJpbmcgZXQgYWwuIiksDQogICAgICAgICAgdGlkeV80YWxidW1zICU+JSANCiAgICAgICAgICBpbm5lcl9qb2luKGdldF9zZW50aW1lbnRzKCJucmMiKSAlPiUgDQogICAgICAgICAgZmlsdGVyKHNlbnRpbWVudCAlaW4lIA0KICAgICAgICAgICAgICAgICAgIGMoInBvc2l0aXZlIiwgDQogICAgICAgICAgICAgICAgICAgICAibmVnYXRpdmUiKSkpICU+JQ0KICAgICAgICAgICAgICAgICAgbXV0YXRlKG1ldGhvZCA9ICJOUkMiKSkgJT4lDQogIGNvdW50KG1ldGhvZCwgaW5kZXggPSBsaW5lbnVtYmVyICUvJSAyLCBzZW50aW1lbnQpICU+JQ0KICBzcHJlYWQoc2VudGltZW50LCBuLCBmaWxsID0gMCkgJT4lDQogIG11dGF0ZShzZW50aW1lbnQgPSBwb3NpdGl2ZSAtIG5lZ2F0aXZlKQ0KYGBgDQoNCg0KYGBge3J9DQpiaW5kX3Jvd3MoYWZpbm4sIA0KICAgICAgICAgIGJpbmdfYW5kX25yYykgJT4lDQogIGdncGxvdChhZXMoaW5kZXgsIHNlbnRpbWVudCwgZmlsbCA9IG1ldGhvZCkpICsNCiAgZ2VvbV9jb2woc2hvdy5sZWdlbmQgPSBGQUxTRSkgKw0KICBmYWNldF93cmFwKH5tZXRob2QsIG5jb2wgPSAxLCBzY2FsZXMgPSAiZnJlZV95IikNCmBgYA0KDQoNCg0KYGBge3J9DQpnZXRfc2VudGltZW50cygibnJjIikgJT4lIA0KICAgICBmaWx0ZXIoc2VudGltZW50ICVpbiUgYygicG9zaXRpdmUiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5lZ2F0aXZlIikpICU+JSANCiAgY291bnQoc2VudGltZW50KQ0KYGBgDQoNCg0KYGBge3J9DQpnZXRfc2VudGltZW50cygiYmluZyIpICU+JSANCiAgY291bnQoc2VudGltZW50KQ0KYGBgDQoNCg0KIyMjMi40IE1vc3QgY29tbW9uIHBvc2l0aXZlIGFuZCBuZWdhdGl2ZSB3b3Jkcw0KDQpgYGB7cn0NCmJpbmdfd29yZF9jb3VudHMgPC0gdGlkeV9zb25ncyAlPiUNCiAgaW5uZXJfam9pbihnZXRfc2VudGltZW50cygiYmluZyIpKSAlPiUNCiAgY291bnQod29yZCwgc2VudGltZW50LCBzb3J0ID0gVFJVRSkgJT4lDQogIHVuZ3JvdXAoKQ0KDQpiaW5nX3dvcmRfY291bnRzDQpgYGANCg0KDQpgYGB7cn0NCmJpbmdfd29yZF9jb3VudHMgJT4lDQogIGdyb3VwX2J5KHNlbnRpbWVudCkgJT4lDQogIHRvcF9uKDEwKSAlPiUNCiAgdW5ncm91cCgpICU+JQ0KICBtdXRhdGUod29yZCA9IHJlb3JkZXIod29yZCwgbikpICU+JQ0KICBnZ3Bsb3QoYWVzKHdvcmQsIG4sIGZpbGwgPSBzZW50aW1lbnQpKSArDQogIGdlb21fY29sKHNob3cubGVnZW5kID0gRkFMU0UpICsNCiAgZmFjZXRfd3JhcCh+c2VudGltZW50LCBzY2FsZXMgPSAiZnJlZV95IikgKw0KICBsYWJzKHkgPSAiQ29udHJpYnV0aW9uIHRvIHNlbnRpbWVudCIsDQogICAgICAgeCA9IE5VTEwpICsNCiAgY29vcmRfZmxpcCgpDQpgYGANCg0KDQpgYGB7cn0NCmN1c3RvbV9zdG9wX3dvcmRzIDwtIGJpbmRfcm93cyh0aWJibGUod29yZCA9IGMoIm1pc3MiKSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXhpY29uID0gYygiY3VzdG9tIikpLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdG9wX3dvcmRzKQ0KDQpjdXN0b21fc3RvcF93b3Jkcw0KYGBgDQoNCiMjIzIuNSBXb3JkY2xvdWRzDQoNCmBgYHtyfQ0KbGlicmFyeSh3b3JkY2xvdWQpDQoNCnRpZHlfc29uZ3MgJT4lDQogIGFudGlfam9pbihzdG9wX3dvcmRzKSAlPiUNCiAgY291bnQod29yZCkgJT4lDQogIHdpdGgod29yZGNsb3VkKHdvcmQsIG4sIG1heC53b3JkcyA9IDEwMCkpDQpgYGANCg0KDQpgYGB7cn0NCmxpYnJhcnkocmVzaGFwZTIpDQoNCnRpZHlfc29uZ3MgJT4lDQogIGlubmVyX2pvaW4oZ2V0X3NlbnRpbWVudHMoImJpbmciKSkgJT4lDQogIGNvdW50KHdvcmQsIHNlbnRpbWVudCwgc29ydCA9IFRSVUUpICU+JQ0KICBhY2FzdCh3b3JkIH4gc2VudGltZW50LCB2YWx1ZS52YXIgPSAibiIsIGZpbGwgPSAwKSAlPiUNCiAgY29tcGFyaXNvbi5jbG91ZChjb2xvcnMgPSBjKCJncmF5MjAiLCAiZ3JheTgwIiksDQogICAgICAgICAgICAgICAgICAgbWF4LndvcmRzID0gMTAwKQ0KDQpgYGANCg0KDQojIyMgMi42IExvb2tpbmcgYXQgdW5pdHMgYmV5b25kIGp1c3Qgd29yZHMNCg0KDQojIyMjI+aWt+WPpQ0KDQoNCuWwjW9yaWdpbmFsX3NvbmdzJHRleHQg5pa35Y+lDQoNCmBgYHtyfQ0KUGFuZFBfc2VudGVuY2VzIDwtIG9yaWdpbmFsX3NvbmdzICU+JSANCiAgdW5uZXN0X3Rva2VucyhzZW50ZW5jZSwgdGV4dCwgdG9rZW4gPSAic2VudGVuY2VzIikNCg0KUGFuZFBfc2VudGVuY2VzJHNlbnRlbmNlWzJdDQpgYGANCg0KDQojIyMjI1JlZ2V45pa35Y+lDQoNCmBgYHtyfQ0KYXVzdGVuX2Jvb2tzKCkgJT4lIGhlYWQoMjApDQpgYGANCg0KDQoNCmBgYHtyfQ0KYXVzdGVuX2NoYXB0ZXJzIDwtIGF1c3Rlbl9ib29rcygpICU+JQ0KICBncm91cF9ieShib29rKSAlPiUNCiAgdW5uZXN0X3Rva2VucyhjaGFwdGVyLCB0ZXh0LCB0b2tlbiA9ICJyZWdleCIsIA0KICAgICAgICAgICAgICAgIHBhdHRlcm4gPSAiQ2hhcHRlcnxDSEFQVEVSIFtcXGRJVlhMQ10iKSAlPiUNCiAgdW5ncm91cCgpDQoNCmF1c3Rlbl9jaGFwdGVycyAlPiUgDQogIGdyb3VwX2J5KGJvb2spICU+JSANCiAgc3VtbWFyaXNlKGNoYXB0ZXJzID0gbigpKQ0KYGBgDQoNCg0KDQoNCg0KYGBge3J9DQpiaW5nbmVnYXRpdmUgPC0gZ2V0X3NlbnRpbWVudHMoImJpbmciKSAlPiUgDQogIGZpbHRlcihzZW50aW1lbnQgPT0gIm5lZ2F0aXZlIikNCg0Kd29yZGNvdW50cyA8LSB0aWR5X3NvbmdzICU+JQ0KICBncm91cF9ieShhbGJ1bSkgJT4lDQogIHN1bW1hcml6ZSh3b3JkcyA9IG4oKSkNCg0KdGlkeV9zb25ncyAlPiUNCiAgc2VtaV9qb2luKGJpbmduZWdhdGl2ZSkgJT4lDQogIGdyb3VwX2J5KGFsYnVtKSAlPiUNCiAgc3VtbWFyaXplKG5lZ2F0aXZld29yZHMgPSBuKCkpICU+JQ0KICBsZWZ0X2pvaW4od29yZGNvdW50cywgYnkgPSBjKCdhbGJ1bScpKSAlPiUNCiAgbXV0YXRlKHJhdGlvID0gbmVnYXRpdmV3b3Jkcy93b3JkcykgJT4lDQogIHVuZ3JvdXAoKQ0KYGBgDQoNCg0KDQoNCjxzdHlsZT4NCg0KZW0gew0KICAgIGNvbG9yOiAjRkZFQTZDOw0KICAgIGJhY2tncm91bmQ6ICM3RDdEN0Q7DQp9DQoNCi5jYXB0aW9uIHsNCiAgY29sb3I6ICM3Nzc7DQogIG1hcmdpbi10b3A6IDEwcHg7DQp9DQpwIGNvZGUgew0KICB3aGl0ZS1zcGFjZTogaW5oZXJpdDsNCn0NCnByZSB7DQogIHdvcmQtYnJlYWs6IG5vcm1hbDsNCiAgd29yZC13cmFwOiBub3JtYWw7DQogIGxpbmUtaGVpZ2h0OiAxOw0KfQ0KcHJlIGNvZGUgew0KICB3aGl0ZS1zcGFjZTogaW5oZXJpdDsNCn0NCnAsbGkgew0KICBmb250LWZhbWlseTogIlRyZWJ1Y2hldCBNUyIsICLlvq7ou5/mraPpu5Hpq5QiLCAiTWljcm9zb2Z0IEpoZW5nSGVpIjsNCn0NCg0KLnJ7DQogIGxpbmUtaGVpZ2h0OiAxLjI7DQp9DQoNCi5xaXogew0KICBsaW5lLWhlaWdodDogMS43NTsNCiAgYmFja2dyb3VuZDogI2YwZjBmMDsNCiAgYm9yZGVyLWxlZnQ6IDEycHggc29saWQgI2NjZmZjYzsNCiAgcGFkZGluZzogNHB4Ow0KICBwYWRkaW5nLWxlZnQ6IDEwcHg7DQogIGNvbG9yOiAjMDA5OTAwOw0KfQ0KDQp0aXRsZXsNCiAgY29sb3I6ICNjYzAwMDA7DQogIGZvbnQtZmFtaWx5OiAiVHJlYnVjaGV0IE1TIiwgIuW+rui7n+ato+m7kemrlCIsICJNaWNyb3NvZnQgSmhlbmdIZWkiOw0KfQ0KDQpib2R5ew0KICBmb250LWZhbWlseTogIlRyZWJ1Y2hldCBNUyIsICLlvq7ou5/mraPpu5Hpq5QiLCAiTWljcm9zb2Z0IEpoZW5nSGVpIjsNCn0NCg0KaDEsaDIsaDMsaDQsaDV7DQogIGNvbG9yOiAjMDA2NmZmOw0KICBmb250LWZhbWlseTogIlRyZWJ1Y2hldCBNUyIsICLlvq7ou5/mraPpu5Hpq5QiLCAiTWljcm9zb2Z0IEpoZW5nSGVpIjsNCn0NCg0KDQpoM3sNCiAgY29sb3I6ICNiMzZiMDA7DQogIGJhY2tncm91bmQ6ICNmZmUwYjM7DQogIGxpbmUtaGVpZ2h0OiAyOw0KICBmb250LXdlaWdodDogYm9sZDsNCn0NCg0KaDV7DQogIGNvbG9yOiAjMDA2MDAwOw0KICBiYWNrZ3JvdW5kOiAjZjhmOGY4Ow0KICBsaW5lLWhlaWdodDogMS41Ow0KICBmb250LXdlaWdodDogYm9sZDsNCn0NCg0KaDYgew0KICAgIGNvbG9yOiAjMDA2MDAwOw0KICAgIGJhY2tncm91bmQ6ICMwMGZmZmY7DQogICAgbGluZS1oZWlnaHQ6IDI7DQogICAgZm9udC13ZWlnaHQ6IGJvbGQ7DQp9DQoNCjwvc3R5bGU+DQo=