Function for tokenization
Exploratory
Total words by target

Different words by target

Stop words manually
# List stop words
wordStop <- c('me', 'my', 'myself', 'we', 'our', 'ours', 'ourselves',
'you','your', 'yours', 'yourself', 'yourselves', 'he', 'him','his',
'himself', 'she', 'her', 'hers', 'herself', 'it', 'its', 'itself',
'they', 'them', 'their', 'theirs', 'themselves', 'what', 'which',
'who', 'whom', 'this', 'that', 'these', 'those', 'am', 'is', 'are',
'was', 'were', 'be', 'been', 'being', 'have', 'has', 'had',
'having', 'do', 'does', 'did', 'doing', 'a', 'an', 'the', 'and',
'but', 'if', 'or', 'because', 'as', 'until', 'while', 'of', 'at',
'by', 'for', 'with', 'about', 'against', 'between', 'into',
'through', 'during', 'before', 'after', 'above', 'below', 'to',
'from', 'up', 'down', 'in', 'out', 'on', 'off', 'over', 'under',
'again', 'further', 'then', 'once', 'here', 'there', 'when',
'where', 'why', 'how', 'all', 'any', 'both', 'each', 'few', 'more',
'most', 'other', 'some', 'such', 'no', 'nor', 'not', 'only', 'own',
'same', 'so', 'than', 'too', 'very', 's', 't', 'can', 'will',
'just', 'don', 'should', 'now', 'd', 'll', 'm', 'o', 're', 've',
'y', 'ain', 'aren', 'couldn', 'didn', 'doesn', 'hadn', 'hasn',
'haven', 'isn', 'ma', 'mightn', 'mustn', 'needn', 'shan',
'shouldn', 'wasn', 'weren', 'won', 'wouldn','i', "amp", "new",
"com", "one")
# Filtering stop words
tweetsTrainTidy2 <- tweetsTrainTidy %>%
filter(!(token %in% wordStop))
Most used words by target (top 50)

Wordcloud
wordcloudCustom <- function(target, data){
print(target)
wordcloud(words = data$token, freq = data$frequence,
max.words = 400, random.order = FALSE, rot.per = 0.35,
colors = jcolors(palette = "pal9"))
}
dfTarget <- tweetsTrainTidy2 %>%
group_by(target, token) %>%
count(token) %>%
group_by(target) %>%
mutate(frequence = n / n()) %>%
arrange(target, desc(frequence)) %>% nest()
walk2(.x = dfTarget$target, .y = dfTarget$data, .f = wordcloudCustom)
[1] 0
[1] 1


Correlation between words
# Data spread
tweetSpread <- tweetsTrainTidy2 %>%
group_by(target, token) %>%
count(token) %>%
spread(key = target, value = n, fill = NA, drop = TRUE)
names(tweetSpread) <- c("Token", "NoCovid", "YesCovid")
# Graphics
tweetSpread %>%
ggplot(data = ., aes(x = NoCovid, y = YesCovid)) +
geom_jitter(alpha = 0.1, size = 2.5, width = 0.25, height = 0.25) +
geom_text(aes(label = Token), check_overlap = TRUE, vjust = 1.5) +
scale_x_log10() +
scale_y_log10() +
geom_smooth(method = "lm", color = "darkred", se = FALSE)

Common words by target
The number of common words between YesCovid and NoCovid is 3209
\(n\)-gram
- Network graphics (package
igraph):

Modelling
Model SVM Lineal
Call:
svm.default(x = matrixTfidfTrain, y = as.factor(dataTrain$target), scale = TRUE,
type = "C-classification", kernel = "linear", cost = 1, probability = TRUE)
Parameters:
SVM-Type: C-classification
SVM-Kernel: linear
cost: 1
Number of Support Vectors: 2329
Model SVM Radial
Call:
svm.default(x = matrixTfidfTrain, y = as.factor(dataTrain$target), scale = TRUE,
type = "C-classification", kernel = "radial", cost = 1, probability = TRUE)
Parameters:
SVM-Type: C-classification
SVM-Kernel: radial
cost: 1
Number of Support Vectors: 5086
LS0tDQp0aXRsZTogIkNPVklELTE5IFR3ZWV0IENsYXNzaWZpY2F0aW9uIENoYWxsZW5nZSBieSAjWmluZGlXZWVrZW5keiINCmF1dGhvcjogIlNpZGVyZXVzIChMQiBQcml2YXRlOiAwLjMzMTkpIg0Kb3V0cHV0Og0KICBodG1sX25vdGVib29rOg0KICAgIHRvYzogdHJ1ZQ0KICAgIGhpZ2hsaWdodDogYnJlZXplZGFyaw0KICAgIHRoZW1lOiBmbGF0bHkNCiAgICB0b2NfZmxvYXQ6DQogICAgICBzbW9vdGhfc2Nyb2xsOiBmYWxzZQ0KICAgICAgY29sbGFwc2VkOiBmYWxzZQ0KLS0tDQoNCjxjZW50ZXI+DQo8aW1nIHNyYyA9ICJpbWcvaW1nMS5wbmciLz4NCjwvY2VudGVyPg0KDQojIFBhY2thZ2VzIG9mIFINCg0KYGBge3J9DQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCmxpYnJhcnkodGlkeXRleHQpDQpsaWJyYXJ5KHdvcmRjbG91ZCkNCmxpYnJhcnkoamNvbG9ycykNCmxpYnJhcnkoaWdyYXBoKQ0KbGlicmFyeShnZ3JhcGgpDQpsaWJyYXJ5KHF1YW50ZWRhKQ0KYGBgDQoNCiMgSW1wb3IgZGF0YQ0KDQpgYGB7cn0NCiMgSW1wb3J0IGRhdGEgdHJhaW4sIHRlc3QgYW5kIHN1Ym1pc3Npb24NCmRhdGFUcmFpbiA8LSByZWFkLmNzdigiZGF0YS91cGRhdGVkX3RyYWluLmNzdiIpDQpkYXRhVGVzdCA8LSByZWFkLmNzdigiZGF0YS91cGRhdGVkX3Rlc3QuY3N2IikNCmRhdGFTYW1wbGVTdWJtIDwtIHJlYWQuY3N2KCJkYXRhL3VwZGF0ZWRfc3MuY3N2IikNCmBgYA0KDQojIEZ1bmN0aW9uIGZvciB0b2tlbml6YXRpb24NCg0KYGBge3J9DQojIEZ1bmN0aW9uIGNsZWFuIHRleHQNCmNsZWFuVGV4dCA8LSBmdW5jdGlvbih0ZXh0KXsNCiAgDQogICMgTG9hZCBsaWJyYXJ5DQogIHN1cHByZXNzTWVzc2FnZXMoc3VwcHJlc3NXYXJuaW5ncyhsaWJyYXJ5KHRtKSkpDQogIA0KICAjIFRva2VuaXplIHRleHQNCiAgdGV4dCA9IGdzdWIoIltbOmNudHJsOl1dIiwgIiAiLCB0ZXh0KQ0KICB0ZXh0ID0gdG9sb3dlcih0ZXh0KQ0KICB0ZXh0ID0gcmVtb3ZlUHVuY3R1YXRpb24odGV4dCkNCiAgdGV4dCA9IHJlbW92ZU51bWJlcnModGV4dCkNCiAgdGV4dCA9IHN0cmlwV2hpdGVzcGFjZSh0ZXh0KQ0KICB0ZXh0ID0gcmVtb3ZlV29yZHModGV4dCwgd29yZHMgPSB0bTo6c3RvcHdvcmRzKGtpbmQgPSAiU01BUlQiKSkNCiAgdGV4dCA9IHN0cl9zcGxpdCh0ZXh0LCAiICIpW1sxXV0gIA0KICB0ZXh0ID0ga2VlcCgueCA9IHRleHQsIC5wID0gZnVuY3Rpb24oeCl7c3RyX2xlbmd0aCh4KSA+IDJ9KQ0KICANCiAgIyBSZXR1cm4NCiAgcmV0dXJuKHRleHQpDQp9DQoNCmBgYA0KDQojIFRva2VuaXphdGlvbg0KDQpgYGB7cn0NCiMgVG9rZW5pemF0aW9uDQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCmxpYnJhcnkodGlkeXRleHQpDQoNCiMgRnVuY3Rpb24gY2xlYW5UZXh0KCkgb3ZlciBkYXRhZnJhbWUNCnR3ZWV0c1RyYWluIDwtIGRhdGFUcmFpbiAlPiUgDQogIG11dGF0ZSh0ZXh0VG9rZW5pemUgPSBtYXAoLnggPSB0ZXh0LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5mID0gY2xlYW5UZXh0KSkNCmhlYWQodHdlZXRzVHJhaW4pDQpgYGANCg0KIyBUaWR5IGZvcm1hdA0KDQpgYGB7cn0NCnR3ZWV0c1RyYWluVGlkeSA8LSB0d2VldHNUcmFpbiAlPiUNCiAgc2VsZWN0KC10ZXh0KSAlPiUNCiAgdW5uZXN0KGNvbHMgPSB0ZXh0VG9rZW5pemUpICU+JSANCiAgcmVuYW1lKHRva2VuID0gdGV4dFRva2VuaXplKQ0KaGVhZCh0d2VldHNUcmFpblRpZHkpDQpgYGANCg0KIyBFeHBsb3JhdG9yeQ0KDQojIyBUb3RhbCB3b3JkcyBieSB0YXJnZXQNCg0KYGBge3J9DQp0d2VldHNUcmFpblRpZHkgJT4lIA0KICBncm91cF9ieSh0YXJnZXQpICU+JSANCiAgY291bnQoKSAlPiUgDQogIGdncGxvdChkYXRhID0gLiwgYWVzKHggPSBmYWN0b3IodGFyZ2V0KSwgeSA9IG4pKSArDQogIGdlb21fY29sKGNvbG9yID0gImJsYWNrIikgKw0KICBnZW9tX2xhYmVsKGFlcyhsYWJlbCA9IG4pKSArDQogIGxhYnMoeCA9ICJUYXJnZXQiKQ0KYGBgDQoNCiMjIERpZmZlcmVudCB3b3JkcyBieSB0YXJnZXQNCg0KYGBge3J9DQp0d2VldHNUcmFpblRpZHkgJT4lDQogIHNlbGVjdCh0YXJnZXQsIHRva2VuKSAlPiUNCiAgZGlzdGluY3QoKSAlPiUNCiAgZ3JvdXBfYnkodGFyZ2V0KSAlPiUNCiAgc3VtbWFyaXNlKHdvcmRzRGlmZmVyZW50cyA9IG4oKSkgJT4lIA0KICBnZ3Bsb3QoZGF0YSA9IC4sIGFlcyh4ID0gZmFjdG9yKHRhcmdldCksIHkgPSB3b3Jkc0RpZmZlcmVudHMpKSArDQogIGdlb21fY29sKGNvbG9yID0gImJsYWNrIikgKw0KICBnZW9tX2xhYmVsKGFlcyhsYWJlbCA9IHdvcmRzRGlmZmVyZW50cykpICsNCiAgbGFicyh4ID0gIlRhcmdldCIpDQpgYGANCg0KIyMgQXZlcmFnZSBsZW5ndGggb2YgdHdlZXRzIGJ5IHRhcmdldA0KDQpgYGB7cn0NCnR3ZWV0c1RyYWluVGlkeSU+JQ0KICBncm91cF9ieShJRCwgdGFyZ2V0KSAlPiUNCiAgc3VtbWFyaXNlKGxlbmd0aFR3ZWV0ID0gbigpKSAlPiUgDQogIGdyb3VwX2J5KHRhcmdldCkgJT4lDQogIHN1bW1hcmlzZShtZWFuTGVuZ3RoID0gbWVhbihsZW5ndGhUd2VldCksDQogICAgICAgICAgICBzZExlbmd0aCA9IHNkKGxlbmd0aFR3ZWV0KSkgJT4lIA0KICB1bmdyb3VwKCkgJT4lIA0KICBnZ3Bsb3QoZGF0YSA9IC4sIGFlcyh4ID0gZmFjdG9yKHRhcmdldCksIHkgPSBtZWFuTGVuZ3RoKSkgKw0KICBnZW9tX3BvaW50KHNpemUgPSAzKSArDQogIGdlb21fZXJyb3JiYXIoYWVzKHltaW4gPSBtZWFuTGVuZ3RoIC0gc2RMZW5ndGgsDQogICAgICAgICAgICAgICAgICAgICAgeW1heCA9IG1lYW5MZW5ndGggKyBzZExlbmd0aCksDQogICAgICAgICAgICAgICAgd2lkdGggPSAwLjEpICsNCiAgbGFicyh4ID0gIlRhcmdldCIsDQogICAgICAgeSA9ICJMZW5ndGgiKQ0KYGBgDQoNCiMjIFN0b3Agd29yZHMgbWFudWFsbHkNCg0KYGBge3J9DQojIExpc3Qgc3RvcCB3b3Jkcw0Kd29yZFN0b3AgPC0gYygnbWUnLCAnbXknLCAnbXlzZWxmJywgJ3dlJywgJ291cicsICdvdXJzJywgJ291cnNlbHZlcycsDQogICAgICAgICAgICAgICd5b3UnLCd5b3VyJywgJ3lvdXJzJywgJ3lvdXJzZWxmJywgJ3lvdXJzZWx2ZXMnLCAnaGUnLCAnaGltJywnaGlzJywNCiAgICAgICAgICAgICAgJ2hpbXNlbGYnLCAnc2hlJywgJ2hlcicsICdoZXJzJywgJ2hlcnNlbGYnLCAnaXQnLCAnaXRzJywgJ2l0c2VsZicsDQogICAgICAgICAgICAgICd0aGV5JywgJ3RoZW0nLCAndGhlaXInLCAndGhlaXJzJywgJ3RoZW1zZWx2ZXMnLCAnd2hhdCcsICd3aGljaCcsDQogICAgICAgICAgICAgICd3aG8nLCAnd2hvbScsICd0aGlzJywgJ3RoYXQnLCAndGhlc2UnLCAndGhvc2UnLCAnYW0nLCAnaXMnLCAnYXJlJywNCiAgICAgICAgICAgICAgJ3dhcycsICd3ZXJlJywgJ2JlJywgJ2JlZW4nLCAnYmVpbmcnLCAnaGF2ZScsICdoYXMnLCAnaGFkJywNCiAgICAgICAgICAgICAgJ2hhdmluZycsICdkbycsICdkb2VzJywgJ2RpZCcsICdkb2luZycsICdhJywgJ2FuJywgJ3RoZScsICdhbmQnLA0KICAgICAgICAgICAgICAnYnV0JywgJ2lmJywgJ29yJywgJ2JlY2F1c2UnLCAnYXMnLCAndW50aWwnLCAnd2hpbGUnLCAnb2YnLCAnYXQnLA0KICAgICAgICAgICAgICAnYnknLCAnZm9yJywgJ3dpdGgnLCAnYWJvdXQnLCAnYWdhaW5zdCcsICdiZXR3ZWVuJywgJ2ludG8nLA0KICAgICAgICAgICAgICAndGhyb3VnaCcsICdkdXJpbmcnLCAnYmVmb3JlJywgJ2FmdGVyJywgJ2Fib3ZlJywgJ2JlbG93JywgJ3RvJywNCiAgICAgICAgICAgICAgJ2Zyb20nLCAndXAnLCAnZG93bicsICdpbicsICdvdXQnLCAnb24nLCAnb2ZmJywgJ292ZXInLCAndW5kZXInLA0KICAgICAgICAgICAgICAnYWdhaW4nLCAnZnVydGhlcicsICd0aGVuJywgJ29uY2UnLCAnaGVyZScsICd0aGVyZScsICd3aGVuJywNCiAgICAgICAgICAgICAgJ3doZXJlJywgJ3doeScsICdob3cnLCAnYWxsJywgJ2FueScsICdib3RoJywgJ2VhY2gnLCAnZmV3JywgJ21vcmUnLA0KICAgICAgICAgICAgICAnbW9zdCcsICdvdGhlcicsICdzb21lJywgJ3N1Y2gnLCAnbm8nLCAnbm9yJywgJ25vdCcsICdvbmx5JywgJ293bicsDQogICAgICAgICAgICAgICdzYW1lJywgJ3NvJywgJ3RoYW4nLCAndG9vJywgJ3ZlcnknLCAncycsICd0JywgJ2NhbicsICd3aWxsJywNCiAgICAgICAgICAgICAgJ2p1c3QnLCAnZG9uJywgJ3Nob3VsZCcsICdub3cnLCAnZCcsICdsbCcsICdtJywgJ28nLCAncmUnLCAndmUnLA0KICAgICAgICAgICAgICAneScsICdhaW4nLCAnYXJlbicsICdjb3VsZG4nLCAnZGlkbicsICdkb2VzbicsICdoYWRuJywgJ2hhc24nLA0KICAgICAgICAgICAgICAnaGF2ZW4nLCAnaXNuJywgJ21hJywgJ21pZ2h0bicsICdtdXN0bicsICduZWVkbicsICdzaGFuJywNCiAgICAgICAgICAgICAgJ3Nob3VsZG4nLCAnd2FzbicsICd3ZXJlbicsICd3b24nLCAnd291bGRuJywnaScsICJhbXAiLCAibmV3IiwNCiAgICAgICAgICAgICAgImNvbSIsICJvbmUiKQ0KDQojIEZpbHRlcmluZyBzdG9wIHdvcmRzDQp0d2VldHNUcmFpblRpZHkyIDwtIHR3ZWV0c1RyYWluVGlkeSAlPiUNCiAgZmlsdGVyKCEodG9rZW4gJWluJSB3b3JkU3RvcCkpDQpgYGANCg0KIyMgTW9zdCB1c2VkIHdvcmRzIGJ5IHRhcmdldCAodG9wIDUwKQ0KDQpgYGB7ciwgZmlnLndpZHRoPTksIGZpZy5oZWlnaHQ9OH0NCnR3ZWV0c1RyYWluVGlkeTIgJT4lIA0KICBncm91cF9ieSh0YXJnZXQsIHRva2VuKSAlPiUgDQogIGNvdW50KHRva2VuKSAlPiUNCiAgZ3JvdXBfYnkodGFyZ2V0KSAlPiUNCiAgdG9wX24oNTAsIG4pICU+JSBhcnJhbmdlKHRhcmdldCwgZGVzYyhuKSkgJT4lDQogIGdncGxvdChhZXMoeCA9IHJlb3JkZXIodG9rZW4sIG4pLCB5ID0gbiwgZmlsbCA9IGZhY3Rvcih0YXJnZXQpKSkgKw0KICBmYWNldF93cmFwKH50YXJnZXQsc2NhbGVzID0gImZyZWUiLCBuY29sID0gMikgKw0KICBnZW9tX2NvbChjb2xvciA9ICJibGFjayIpICsNCiAgY29vcmRfZmxpcCgpICArDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikgKw0KICBsYWJzKHkgPSAiIiwgeCA9ICIiKSArDQogIHNjYWxlX2ZpbGxfamNvbG9ycyhwYWxldHRlID0gInBhbDQiKQ0KYGBgDQoNCiMjIFdvcmRjbG91ZA0KDQpgYGB7ciwgd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgZmlnLndpZHRoPTksIGZpZy5oZWlnaHQ9OX0NCndvcmRjbG91ZEN1c3RvbSA8LSBmdW5jdGlvbih0YXJnZXQsIGRhdGEpew0KICBwcmludCh0YXJnZXQpDQogIHdvcmRjbG91ZCh3b3JkcyA9IGRhdGEkdG9rZW4sIGZyZXEgPSBkYXRhJGZyZXF1ZW5jZSwNCiAgICAgICAgICAgIG1heC53b3JkcyA9IDQwMCwgcmFuZG9tLm9yZGVyID0gRkFMU0UsIHJvdC5wZXIgPSAwLjM1LA0KICAgICAgICAgICAgY29sb3JzID0gamNvbG9ycyhwYWxldHRlID0gInBhbDkiKSkNCn0NCg0KZGZUYXJnZXQgPC0gdHdlZXRzVHJhaW5UaWR5MiAlPiUNCiAgZ3JvdXBfYnkodGFyZ2V0LCB0b2tlbikgJT4lDQogIGNvdW50KHRva2VuKSAlPiUNCiAgZ3JvdXBfYnkodGFyZ2V0KSAlPiUNCiAgbXV0YXRlKGZyZXF1ZW5jZSA9IG4gLyBuKCkpICU+JQ0KICBhcnJhbmdlKHRhcmdldCwgZGVzYyhmcmVxdWVuY2UpKSAlPiUgbmVzdCgpIA0KDQp3YWxrMigueCA9IGRmVGFyZ2V0JHRhcmdldCwgLnkgPSBkZlRhcmdldCRkYXRhLCAuZiA9IHdvcmRjbG91ZEN1c3RvbSkNCmBgYA0KDQojIyBDb3JyZWxhdGlvbiBiZXR3ZWVuIHdvcmRzDQoNCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KIyBEYXRhIHNwcmVhZA0KdHdlZXRTcHJlYWQgPC0gdHdlZXRzVHJhaW5UaWR5MiAlPiUNCiAgZ3JvdXBfYnkodGFyZ2V0LCB0b2tlbikgJT4lDQogIGNvdW50KHRva2VuKSAlPiUNCiAgc3ByZWFkKGtleSA9IHRhcmdldCwgdmFsdWUgPSBuLCBmaWxsID0gTkEsIGRyb3AgPSBUUlVFKQ0KbmFtZXModHdlZXRTcHJlYWQpIDwtIGMoIlRva2VuIiwgIk5vQ292aWQiLCAiWWVzQ292aWQiKQ0KDQojIEdyYXBoaWNzDQp0d2VldFNwcmVhZCAlPiUgDQogIGdncGxvdChkYXRhID0gLiwgYWVzKHggPSBOb0NvdmlkLCB5ID0gWWVzQ292aWQpKSArDQogIGdlb21faml0dGVyKGFscGhhID0gMC4xLCBzaXplID0gMi41LCB3aWR0aCA9IDAuMjUsIGhlaWdodCA9IDAuMjUpICsNCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IFRva2VuKSwgY2hlY2tfb3ZlcmxhcCA9IFRSVUUsIHZqdXN0ID0gMS41KSArDQogIHNjYWxlX3hfbG9nMTAoKSArDQogIHNjYWxlX3lfbG9nMTAoKSArDQogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsIGNvbG9yID0gImRhcmtyZWQiLCBzZSA9IEZBTFNFKQ0KYGBgDQoNCiMjIENvbW1vbiB3b3JkcyBieSB0YXJnZXQNCg0KYGBge3J9DQp3b3Jkc0NvbW1vbiA8LSBpbnRlcnNlY3QodHdlZXRzVHJhaW5UaWR5MiAlPiUNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcih0YXJnZXQgPT0gMCkgJT4lDQogICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3QodG9rZW4pLCB0d2VldHNUcmFpblRpZHkyICU+JQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyKHRhcmdldCA9PSAxKSAlPiUNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdCh0b2tlbikpICU+JSBucm93KCkNCmNhdCgiVGhlIG51bWJlciBvZiBjb21tb24gd29yZHMgYmV0d2VlbiBZZXNDb3ZpZCBhbmQgTm9Db3ZpZCBpcyIsIHdvcmRzQ29tbW9uKQ0KYGBgDQoNCiMjICRuJC1ncmFtDQoNCmBgYHtyfQ0KIyBGdW5jdGlvbiBjbGVhblRleHQgd2l0aG91dCB0b2tlbml6ZQ0KY2xlYW5UZXh0MiA8LSBmdW5jdGlvbih0ZXh0KXsNCiAgDQogICMgTG9hZCBsaWJyYXJ5DQogIHN1cHByZXNzTWVzc2FnZXMoc3VwcHJlc3NXYXJuaW5ncyhsaWJyYXJ5KHRtKSkpDQogIA0KICAjIFRva2VuaXplIHRleHQNCiAgdGV4dCA9IGdzdWIoIltbOmNudHJsOl1dIiwgIiAiLCB0ZXh0KQ0KICB0ZXh0ID0gdG9sb3dlcih0ZXh0KQ0KICB0ZXh0ID0gcmVtb3ZlUHVuY3R1YXRpb24odGV4dCkNCiAgdGV4dCA9IHJlbW92ZU51bWJlcnModGV4dCkNCiAgdGV4dCA9IHN0cmlwV2hpdGVzcGFjZSh0ZXh0KQ0KICB0ZXh0ID0gcmVtb3ZlV29yZHModGV4dCwgd29yZHMgPSBzdG9wd29yZHMoa2luZCA9ICJTTUFSVCIpKQ0KICANCiAgIyBSZXR1cm4NCiAgcmV0dXJuKHRleHQpDQp9DQoNCiMgYmlncmFtcyAodHdvIHdvcmRzKQ0KYmlHcmFtcyA8LSBkYXRhVHJhaW4gJT4lDQogIG11dGF0ZSh0ZXh0Q2xlYW4gPSBjbGVhblRleHQyKHRleHQpKSAlPiUNCiAgc2VsZWN0KHRleHRDbGVhbikgJT4lDQogIHVubmVzdF90b2tlbnMoaW5wdXQgPSB0ZXh0Q2xlYW4sIG91dHB1dCA9ICJiaWdyYW0iLA0KICAgICAgICAgICAgICAgIHRva2VuID0gIm5ncmFtcyIsIG4gPSAyLCBkcm9wID0gVFJVRSkNCg0KIyBDb3VudA0KYmlHcmFtcyAgJT4lDQogIGNvdW50KGJpZ3JhbSwgc29ydCA9IFRSVUUpDQpgYGANCg0KLSAqKlNlcGFyYXRpb24gb2Ygd29yZHM6KioNCg0KYGBge3J9DQpiaWdyYW1TZXBhcmF0ZSA8LSBiaUdyYW1zICU+JQ0KICBzZXBhcmF0ZShiaWdyYW0sIGMoIndvcmQxIiwgIndvcmQyIiksDQogICAgICAgICAgIHNlcCA9ICIgIikNCmJpZ3JhbVNlcGFyYXRlDQpgYGANCg0KLSAqKk5ldyBjb3VudCBvZiB3b3JkczoqKg0KDQpgYGB7cn0NCiMgRmlsdGVyaW5nIGFueSB3b3JkIHdpdGhpbiBvZiBsaXN0IHN0b3Agd29yZHMgbWFtdWFsbHkNCmJpZ3JhbVNlcGFyYXRlMiA8LSBiaWdyYW1TZXBhcmF0ZSAgJT4lDQogIGZpbHRlcighd29yZDEgJWluJSB3b3JkU3RvcCkgJT4lDQogIGZpbHRlcighd29yZDIgJWluJSB3b3JkU3RvcCkNCg0KIyBKb2luIHdvcmRzDQpiaWdyYW1zSm9pbiA8LSBiaWdyYW1TZXBhcmF0ZTIgJT4lDQogICAgICAgICAgICB1bml0ZShiaWdyYW1zLCB3b3JkMSwgd29yZDIsIHNlcCA9ICIgIikNCg0KIyBOZXcgY291bnQNCmJpZ3JhbXNKb2luICU+JSANCiAgY291bnQoYmlncmFtcywgc29ydCA9IFRSVUUpICU+JSBwcmludChuID0gMjApDQpgYGANCg0KLSAqKk5ldHdvcmsgZ3JhcGhpY3MgKHBhY2thZ2UgYGlncmFwaGApOioqDQoNCmBgYHtyLCBmaWcud2lkdGg9OX0NCmdyYXBoIDwtIGJpZ3JhbXNKb2luICU+JQ0KICBzZXBhcmF0ZShiaWdyYW1zLCBjKCJ3b3JkMSIsICJ3b3JkMiIpLCBzZXAgPSAiICIpICU+JSANCiAgY291bnQod29yZDEsIHdvcmQyLCBzb3J0ID0gVFJVRSkgJT4lDQogIGZpbHRlcihuID49IDEwKSAlPiUgDQogIGdyYXBoX2Zyb21fZGF0YV9mcmFtZShkaXJlY3RlZCA9IEZBTFNFKQ0Kc2V0LnNlZWQoMTIzKQ0KcGxvdChncmFwaCwgdmVydGV4LmxhYmVsLmZvbnQgPSAyLA0KICAgICB2ZXJ0ZXgubGFiZWwuY29sb3IgPSAiYmxhY2siLA0KICAgICB2ZXJ0ZXgubGFiZWwuY2V4ID0gMC43LCBlZGdlLmNvbG9yID0gImdyYXk4NSIpDQpgYGANCg0KIyBNb2RlbGxpbmcNCg0KIyMgVmVjdG9yaXphdGlvbiAqdGYtaWRmKg0KDQotICoqVHdlZXRzIHRyYWluOioqDQoNCmBgYHtyfQ0KIyBDbGVhbiBhbmQgdG9rZW5pdHphdGlvbiB0d2VldHMgdHJhaW4NCmRhdGFUcmFpbiR0ZXh0IDwtIGRhdGFUcmFpbiR0ZXh0ICU+JQ0KICBtYXAoLmYgPSBjbGVhblRleHQpICU+JQ0KICBtYXAoLmYgPSBwYXN0ZSwgY29sbGFwc2UgPSAiICIpICU+JSB1bmxpc3QoKQ0KDQojIERvY3VtZW50LXRlcm0gbWF0cml4IA0KbWF0cml4VHJhaW4gPC0gZGZtKHggPSBkYXRhVHJhaW4kdGV4dCwgcmVtb3ZlID0gd29yZFN0b3ApDQoNCiMgRGVsZXRpbmcgdGVybXMgbGVzcyBvZnRlbiA1DQptYXRyaXhUcmFpbjIgPC0gZGZtX3RyaW0oeCA9IG1hdHJpeFRyYWluLCBtaW5fZG9jZnJlcSA9IDUpDQoNCiMgVmFsdWVzIGNvbnZlcnNpb24gdG8gdGZpZGYNCm1hdHJpeFRmaWRmVHJhaW4gPC0gZGZtX3RmaWRmKG1hdHJpeFRyYWluMiwgc2NoZW1lX3RmID0gInByb3AiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NoZW1lX2RmID0gImludmVyc2UiKQ0KYGBgDQoNCi0gKipUd2VldHMgdGVzdDoqKg0KDQpgYGB7cn0NCiMgVGVzdA0KZGF0YVRlc3QkdGV4dCA8LSBkYXRhVGVzdCR0ZXh0ICU+JQ0KICBtYXAoLmYgPSBjbGVhblRleHQpICU+JQ0KICBtYXAoLmYgPSBwYXN0ZSwgY29sbGFwc2UgPSAiICIpICU+JSB1bmxpc3QoKQ0KDQojIERpbWVuc2lvbnMNCmRpbVRyYWluIDwtIG1hdHJpeFRmaWRmVHJhaW5ARGltbmFtZXMkZmVhdHVyZXMNCg0KIyBEaWN0aW9uYXJ5IHRvIGxpc3QNCmRpbVRyYWluIDwtIGFzLmxpc3QoZGltVHJhaW4pDQpuYW1lcyhkaW1UcmFpbikgPC0gdW5saXN0KGRpbVRyYWluKQ0KZGltVHJhaW4gPC0gZGljdGlvbmFyeShkaW1UcmFpbikNCg0KIyBQcm95ZWN0aW9uIGRvY3VtZW50cw0KbWF0cml6X3RmaWRmX3Rlc3QgPC0gZGZtKHggPSBkYXRhVGVzdCR0ZXh0LA0KICAgICAgICAgICAgICAgICAgICAgICAgIGRpY3Rpb25hcnkgPSBkaW1UcmFpbikNCm1hdHJpeFRmaWRmVGVzdCA8LSBkZm1fdGZpZGYobWF0cml6X3RmaWRmX3Rlc3QsIHNjaGVtZV90ZiA9ICJwcm9wIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NoZW1lX2RmID0gImludmVyc2UiKQ0KYGBgDQoNCiMjIE1vZGVsIFNWTSBMaW5lYWwNCg0KYGBge3J9DQpsaWJyYXJ5KGUxMDcxKQ0KbW9kZWxTVk0gPC0gc3ZtKHggPSBtYXRyaXhUZmlkZlRyYWluLCB5ID0gYXMuZmFjdG9yKGRhdGFUcmFpbiR0YXJnZXQpLA0KICAgICAgICAgICAgICAgICAga2VybmVsID0gImxpbmVhciIsIGNvc3QgPSAxLCBzY2FsZSA9IFRSVUUsDQogICAgICAgICAgICAgICAgICB0eXBlID0gIkMtY2xhc3NpZmljYXRpb24iLCBwcm9iYWJpbGl0eSA9IFRSVUUpDQptb2RlbFNWTSANCmBgYA0KDQojIyBQcmVkaWN0aW9ucyB0ZXN0DQoNCmBgYHtyfQ0KIyBQcmVkaWN0aW9ucyB0ZXN0IGRhdGENCnByZWRpY3RUZXN0IDwtIHByZWRpY3Qob2JqZWN0ID0gbW9kZWxTVk0sDQogICAgICAgICAgICAgICAgICAgICAgIG5ld2RhdGEgPSBtYXRyaXhUZmlkZlRlc3QsDQogICAgICAgICAgICAgICAgICAgICAgIHByb2JhYmlsaXR5ID0gVFJVRSkNCnByb2JUZXN0IDwtIGFzLmRhdGEuZnJhbWUoYXR0cihwcmVkaWN0VGVzdCwgInByb2JhYmlsaXRpZXMiKSkNCmBgYA0KDQojIyBTdWJtaXNzaW9uDQoNCmBgYHtyfQ0KIyBTdWJtaXNzaW9uDQpkYXRhU2FtcGxlU3VibSA8LSBkYXRhU2FtcGxlU3VibSAlPiUgDQogIHNlbGVjdChJRCkgJT4lIA0KICBjYmluZChwcm9iVGVzdCkNCndyaXRlLmNzdih4ID0gZGF0YVNhbXBsZVN1Ym0sIGZpbGUgPSAiU3VibWlzc2lvbi9TdWJtNy5jc3YiLCByb3cubmFtZXMgPSBGQUxTRSkNCmBgYA0KDQojIyBNb2RlbCBTVk0gUmFkaWFsDQoNCmBgYHtyfQ0KbW9kZWxTVk0yIDwtIHN2bSh4ID0gbWF0cml4VGZpZGZUcmFpbiwgeSA9IGFzLmZhY3RvcihkYXRhVHJhaW4kdGFyZ2V0KSwNCiAgICAgICAgICAgICAgICAgIGtlcm5lbCA9ICJyYWRpYWwiLCBjb3N0ID0gMSwgc2NhbGUgPSBUUlVFLA0KICAgICAgICAgICAgICAgICAgdHlwZSA9ICJDLWNsYXNzaWZpY2F0aW9uIiwgcHJvYmFiaWxpdHkgPSBUUlVFKQ0KbW9kZWxTVk0yIA0KYGBgDQoNCiMjIFByZWRpY3Rpb25zIHRlc3QNCg0KYGBge3J9DQojIFByZWRpY3Rpb25zIHRlc3QgZGF0YQ0KcHJlZGljdFRlc3QyIDwtIHByZWRpY3Qob2JqZWN0ID0gbW9kZWxTVk0yLA0KICAgICAgICAgICAgICAgICAgICAgICBuZXdkYXRhID0gbWF0cml4VGZpZGZUZXN0LA0KICAgICAgICAgICAgICAgICAgICAgICBwcm9iYWJpbGl0eSA9IFRSVUUpDQpwcm9iVGVzdDIgPC0gYXMuZGF0YS5mcmFtZShhdHRyKHByZWRpY3RUZXN0MiwgInByb2JhYmlsaXRpZXMiKSkNCmBgYA0KDQojIyBTdWJtaXNzaW9uDQoNCmBgYHtyfQ0KIyBTdWJtaXNzaW9uDQpkYXRhU2FtcGxlU3VibTIgPC0gZGF0YVNhbXBsZVN1Ym0gJT4lIA0KICBzZWxlY3QoSUQpICU+JSANCiAgY2JpbmQocHJvYlRlc3QyKQ0Kd3JpdGUuY3N2KHggPSBkYXRhU2FtcGxlU3VibTIsIGZpbGUgPSAiU3VibWlzc2lvbi9TdWJtOC5jc3YiLCByb3cubmFtZXMgPSBGQUxTRSkNCmBgYA0KDQojIEFja25vd2xlZGdtZW50cw0KDQotIFRoZSBlbnRpcmUgZG9jdW1lbnQgd2FzIGJhc2VkIG9uIHRoZSB0ZXh0IG1pbmluZyB0dXRvcmlhbCBmcm9tIFtKb2FxdWluIEFtYXQgUm9kcmlnby5dKGh0dHBzOi8vam9hcXVpbmFtYXRyb2RyaWdvLmdpdGh1Yi5pby9kb2N1bWVudG9zLzM4X1RleHRfbWluaWdfY29uX1JfZWplbXBsb19wcmFjdGljb19Ud2l0dGVyLmh0bWwp