Preparation

Packages Loading

#===============================
require(stm)
require(tm)
require(SnowballC)
require(LDAvis)
require(stmCorrViz)
require(stmBrowser)
require(ggplot2)
require(topicmodels)
require(wordcloud)   
require(reshape2) # melt()
require(grid) # arrow()
require(ggthemes)
require(lsa)
set.seed(1234)

Data loading

#===============================
# Data Loading
require(XLConnect)               # load XLConnect package 
wk <- loadWorkbook("../DATA/AERCDATA_.xlsx") 
data <- readWorksheet(wk, sheet="DATA") 
data$KeyYesNo<-as.factor(data$KeyYesNo)
data$AbsYesNo<-as.factor(data$AbsYesNo)
data$JournalFa<-as.factor(data$Journal)
dataID <- readWorksheet(wk, sheet="DATAID") 
load("../DATA/DATA.Rdata")

Basic Text Analysis

Text Cleaning

TEXTBASIC<- Corpus(VectorSource(data$TEXT))
CORPUS <- tm_map(TEXTBASIC, removePunctuation)   
as.character(inspect(CORPUS[2]))
CORPUS <- tm_map(CORPUS, removeNumbers)   
as.character(inspect(CORPUS[2]))
CORPUS <- tm_map(CORPUS, tolower)  
as.character(inspect(CORPUS[2]))
CORPUS <- tm_map(CORPUS, removeWords, stopwords("english"))  
as.character(inspect(CORPUS[2]))
CORPUS <- tm_map(CORPUS, removeWords, stopwords("SMART"))  
as.character(inspect(CORPUS[2]))
CORPUS <- tm_map(CORPUS, stemDocument)
as.character(inspect(CORPUS[2]))
CORPUS <- tm_map(CORPUS, stripWhitespace)  
as.character(inspect(CORPUS[2]))
CORPUS <- tm_map(CORPUS, PlainTextDocument) 
CORPUS <- tm_map(CORPUS, removeWords, c("and", "for", "that",
                                        "this", "are", "is", 
                                        "am","with","their","the","can",
                                        "from","article", "study","research","analysis"))

as.character(inspect(CORPUS[2]))

# 

Building Courps

tdm <- TermDocumentMatrix(CORPUS)
dtm <- DocumentTermMatrix(CORPUS)
dim(tdm)
[1] 7942  579
dim(dtm)
[1]  579 7942

Word Frequency

freq <- sort(colSums(as.matrix(dtm)), decreasing=TRUE)
wf <- data.frame(word=names(freq), freq=freq)
table(freq)
freq
   1    2    3    4    5    6    7    8    9   10   11   12   13   14   15 
3601 1233  631  394  308  206  193  153  124  115   98   57   62   57   40 
  16   17   18   19   20   21   22   23   24   25   26   27   28   29   30 
  40   34   36   44   24   20   21   26   22   22   14   11   14   17    8 
  31   32   33   34   35   36   37   38   39   40   41   42   43   44   45 
   6   11   13    8    6   11   10   10   11    8    9    3    4    4   10 
  46   47   48   49   50   51   52   53   54   55   56   57   58   59   60 
  13    5    2    8    5    6    3    3    6    6    1    3    4    1    6 
  61   62   63   65   66   67   68   69   70   71   72   73   74   75   76 
   4    1    3    3    1    5    1    3    4    1    1    5    4    4    3 
  77   79   82   83   84   85   86   87   88   89   90   91   92   93   94 
   2    2    2    3    1    1    3    2    1    3    1    2    1    1    3 
  98  101  102  104  106  107  108  112  114  116  117  118  119  126  128 
   1    1    1    2    3    1    1    1    1    1    1    1    1    1    1 
 138  142  144  147  148  152  153  155  156  161  166  174  182  184  187 
   1    1    1    1    1    1    1    1    1    1    1    1    1    1    1 
 201  203  208  214  217  218  227  289  302  306  478  507  787 1190 1716 
   1    1    1    1    1    2    2    1    1    1    1    1    1    1    1 
head(freq)
 learning education     adult  lifelong    social    taylor 
     1716      1190       787       507       478       306 
require(ggplot2)   
p <- ggplot(data=subset(wf, freq>200), aes(reorder(word, freq), freq))    
p <- p + geom_bar(stat="identity")   
p <- p + theme(axis.text.x=element_text(angle=45, hjust=1))   
p 

creating term matrix with TF-IDF weighting

terms_td_idf <-DocumentTermMatrix(CORPUS, control = list(weighting = function(x) weightTfIdf(x, normalize = FALSE)))
terms_td_idf
<<DocumentTermMatrix (documents: 579, terms: 7942)>>
Non-/sparse entries: 38415/4560003
Sparsity           : 99%
Maximal term length: 32
Weighting          : term frequency - inverse document frequency (tf-idf)

Text Network with tf-idf similarity

td.mat <- as.matrix(TermDocumentMatrix(CORPUS))
td.mat.lsa <- lw_bintf(td.mat) * gw_idf(td.mat) # weighting
lsaSpace <- lsa(td.mat.lsa) # create LSA space
dist.mat.lsa <- dist(t(as.textmatrix(lsaSpace))) # compute distance matrix

MDS

fit <- cmdscale(dist.mat.lsa, eig=TRUE, k=2)
points <- data.frame(x=fit$points[, 1], y=fit$points[, 2])
points$DocID<-dataID$NO
qplot(x, y, data = points, geom = "point", alpha = I(1/5))

plot(points$x,points$y)
text(points$x,points$y, points$DocID ,cex=0.6, pos=4, col="red")

library(scatterplot3d)
fit <- cmdscale(dist.mat.lsa, eig = TRUE, k = 3)
colors <- rep(c("blue", "green", "red"), each = 3)
scatterplot3d(fit$points[, 1], fit$points[, 2], fit$points[, 3],
              pch = 16, main = "Semantic Space Scaled to 3D", 
              xlab = "x", ylab = "y",
              zlab = "z", type = "h"
              )

LDA - STM Topic Modeling

stemming/stopword removal, etc.

data$TEXT <- gsub("[^[:alnum:]///' ]", "", data$TEXT)
processed <- textProcessor(data$TEXT, metadata = data)
Building corpus... 
Converting to Lower Case... 
Removing stopwords... 
Removing numbers... 
Removing punctuation... 
Stemming... 
Creating Output... 

structure and index for usage in the stm model. Verify no-missingness.

prep <- prepDocuments(processed$documents, processed$vocab, processed$meta)
Removing 2525 of 5120 terms (2525 of 40505 tokens) due to frequency 
Your corpus now has 579 documents, 2595 terms and 37980 tokens.

output will have object meta, documents, and vocab

docs <- out$documents
vocab <- out$vocab
meta  <-out$meta
plotRemoved(processed$documents, lower.thresh = seq(1, 1000, by = 10))

#prep <- prepDocuments(processed$documents, processed$vocab,processed$meta, 
#                      lower.thresh = 1, 
#                      upper.thresh= 400)
#plotRemoved(prep$documents, lower.thresh = seq(1, 1000, by = 10))

Topic Model Evaluation for search K

heldout <- make.heldout(prep$documents, prep$vocab)
documents <- heldout$documents
vocab <- heldout$voca
K<-c(2:50)
#MODELS <- searchK(documents, vocab, K, seed = 8458159)
plot.searchK(MODELS)
par(mfrow=c(2,2))

qplot(MODELS$results$K, MODELS$results$exclus, geom=c("point", "smooth"))

qplot(MODELS$results$K, MODELS$results$heldout, geom=c("point", "smooth"))

qplot(MODELS$results$K, MODELS$results$semcoh, geom=c("point", "smooth"))

qplot(MODELS$results$K, MODELS$results$em.its, geom=c("point", "smooth"))
par(mfrow=c(1,1))

KRANK_heldout<-as.data.frame(cbind(MODELS$results$K,MODELS$results$heldout))
KRANK_semcoh<-as.data.frame(cbind(MODELS$results$K,MODELS$results$semcoh))
KRANK_heldout
KRANK_semcoh
#SELMODEL <- selectModel(out$documents, out$vocab, K = 12,
#                        prevalence =~ JournalFa + s(Year),
#                        max.em.its = 100,
#                        data = out$meta, runs = 30, 
#                        seed = 8458159)
SELMODEL
$runout
$runout[[1]]
A topic model with 12 topics, 579 documents and a 2595 word dictionary.

$runout[[2]]
A topic model with 12 topics, 579 documents and a 2595 word dictionary.

$runout[[3]]
A topic model with 12 topics, 579 documents and a 2595 word dictionary.

$runout[[4]]
A topic model with 12 topics, 579 documents and a 2595 word dictionary.

$runout[[5]]
A topic model with 12 topics, 579 documents and a 2595 word dictionary.

$runout[[6]]
A topic model with 12 topics, 579 documents and a 2595 word dictionary.


$semcoh
$semcoh[[1]]
 [1]  -87.05865  -59.41714  -71.51104  -82.00782  -79.12326  -89.08245
 [7]  -76.97783 -103.77731  -74.29686  -99.87080  -66.11509  -88.56817

$semcoh[[2]]
 [1] -69.36360 -61.09197 -66.17118 -89.21036 -89.69092 -84.03244 -94.32758
 [8] -63.75269 -82.82261 -79.71068 -68.30266 -94.52467

$semcoh[[3]]
 [1] -66.81428 -87.83997 -75.82347 -73.57541 -67.08413 -83.33052 -92.32675
 [8] -70.32537 -95.09833 -78.20692 -92.40581 -90.20287

$semcoh[[4]]
 [1]  -80.99432  -68.41026 -113.10564  -80.90968  -85.88537  -79.88375
 [7]  -88.19470  -95.23561  -65.62718  -66.72911 -103.87772  -64.96218

$semcoh[[5]]
 [1] -59.10653 -81.88639 -69.66952 -76.12258 -82.46782 -79.90309 -83.49564
 [8] -57.07118 -93.04998 -84.03397 -86.52608 -74.52873

$semcoh[[6]]
 [1] -85.28665 -73.99364 -88.60246 -74.53001 -84.42852 -85.74578 -85.17334
 [8] -81.44334 -62.23362 -78.13769 -67.71376 -75.22818


$exclusivity
$exclusivity[[1]]
 [1] 9.421073 9.424345 9.419363 9.463894 9.515426 9.590383 9.300530 9.523173
 [9] 9.293934 9.539350 9.697545 9.441522

$exclusivity[[2]]
 [1] 9.585271 9.347450 9.176675 9.384348 9.401572 9.416052 9.725567 9.473182
 [9] 9.375482 9.494914 9.352378 9.224919

$exclusivity[[3]]
 [1] 9.298425 9.581715 9.245425 9.026269 9.490519 9.461665 9.390470 9.455644
 [9] 9.324836 9.559014 9.732288 9.613923

$exclusivity[[4]]
 [1] 9.240323 9.809413 9.496921 9.391125 9.511400 9.371661 9.620094 9.454076
 [9] 9.391193 9.508331 9.447692 8.949863

$exclusivity[[5]]
 [1] 9.658110 9.336212 9.332815 9.646949 9.429048 9.301979 9.506108 9.482788
 [9] 9.524420 9.535551 9.546149 9.334337

$exclusivity[[6]]
 [1] 9.611876 9.141486 9.541321 9.428722 9.531174 9.600376 9.384969 9.616844
 [9] 9.064353 9.419461 9.706312 9.524023


$sparsity
$sparsity[[1]]
[1] "Sparsity not calculated for models without content covariates"

$sparsity[[2]]
[1] "Sparsity not calculated for models without content covariates"

$sparsity[[3]]
[1] "Sparsity not calculated for models without content covariates"

$sparsity[[4]]
[1] "Sparsity not calculated for models without content covariates"

$sparsity[[5]]
[1] "Sparsity not calculated for models without content covariates"

$sparsity[[6]]
[1] "Sparsity not calculated for models without content covariates"
plotModels(SELMODEL)

MS1 <- SELMODEL$runout[[1]]
topicQuality(model=MS1, documents=docs)
 [1]  -87.05865  -59.41714  -71.51104  -82.00782  -79.12326  -89.08245
 [7]  -76.97783 -103.77731  -74.29686  -99.87080  -66.11509  -88.56817
 [1] 9.421073 9.424345 9.419363 9.463894 9.515426 9.590383 9.300530 9.523173
 [9] 9.293934 9.539350 9.697545 9.441522

MS1_evalheldout<-eval.heldout(MS1, heldout$missing)
hist(MS1_evalheldout$doc.heldout)

MS1_evalheldout
$expected.heldout
[1] -6.216431

$doc.heldout
 [1] -5.510584 -6.297617 -6.094396 -6.321044 -6.422858 -5.819358 -5.431193
 [8] -6.330077 -6.533379 -5.575992 -6.108958 -6.093024 -6.004971 -6.284460
[15] -6.637358 -6.084366 -6.034673 -6.360354 -6.330268 -6.101589 -5.959203
[22] -6.747699 -6.323365 -6.446081 -6.195463 -6.042336 -6.762732 -6.466730
[29] -6.453595 -6.511990 -6.276536 -6.595945 -6.522674 -5.234419 -6.178808
[36] -5.958154 -6.556319 -5.948685 -6.445488 -6.635783 -6.111792 -6.116628
[43] -6.069014 -6.452958 -5.769283 -6.383192 -6.881477 -6.725529 -6.301543
[50] -6.370689 -6.241868 -4.827986 -6.602414 -6.253014 -6.022395 -6.340751
[57] -6.227529

$index
 [1]   8  12  13  33  47  50  79  82  90 115 129 192 197 206 228 233 242 256
[19] 258 259 268 272 274 283 285 287 291 293 307 364 369 388 398 399 416 417
[37] 425 455 458 464 468 475 482 488 492 498 499 505 511 520 530 541 544 551
[55] 570 573 576

$ntokens
 [1] 39692 29431 47618 49993 37241 45658 35567 40651 42069  6058 29522 62122
[13] 43954 38718 46161 63665 68639 73326 66064  3911 62958 49676 48709 36935
[25] 65056 62553 35824 62778 61506 47434 55881 48757 55958  2454 48739 46668
[37] 41941 24024 37092 54404 37336 49020 70926 45106 37556 29399 62646 55569
[49] 50623 52877 50143  2769 63587 37863 48989 48783 45274
MS2 <- SELMODEL$runout[[2]]
topicQuality(model=MS2, documents=docs)
 [1] -69.36360 -61.09197 -66.17118 -89.21036 -89.69092 -84.03244 -94.32758
 [8] -63.75269 -82.82261 -79.71068 -68.30266 -94.52467
 [1] 9.585271 9.347450 9.176675 9.384348 9.401572 9.416052 9.725567 9.473182
 [9] 9.375482 9.494914 9.352378 9.224919

MS2_evalheldout<-eval.heldout(MS2, heldout$missing)
hist(MS2_evalheldout$doc.heldout)

MS2_evalheldout
$expected.heldout
[1] -6.206362

$doc.heldout
 [1] -5.558018 -6.068438 -6.031112 -6.332154 -6.209974 -5.766385 -5.272792
 [8] -6.677067 -6.393960 -5.742288 -6.248444 -5.985725 -5.809810 -6.288284
[15] -6.622955 -6.320996 -6.211804 -5.877751 -6.729948 -5.828985 -6.054075
[22] -6.810961 -5.992409 -6.511297 -6.020433 -6.026372 -7.093156 -6.427994
[29] -6.306674 -6.273594 -6.301394 -6.307391 -6.691068 -5.380955 -6.399464
[36] -5.908197 -6.501172 -6.015182 -6.591179 -6.701818 -6.235427 -6.236214
[43] -5.978396 -6.306692 -5.831889 -6.591092 -6.774888 -6.806098 -6.308495
[50] -6.224018 -6.174249 -5.044385 -6.463472 -6.275803 -5.795730 -6.164686
[57] -6.259439

$index
 [1]   8  12  13  33  47  50  79  82  90 115 129 192 197 206 228 233 242 256
[19] 258 259 268 272 274 283 285 287 291 293 307 364 369 388 398 399 416 417
[37] 425 455 458 464 468 475 482 488 492 498 499 505 511 520 530 541 544 551
[55] 570 573 576

$ntokens
 [1] 39692 29431 47618 49993 37241 45658 35567 40651 42069  6058 29522 62122
[13] 43954 38718 46161 63665 68639 73326 66064  3911 62958 49676 48709 36935
[25] 65056 62553 35824 62778 61506 47434 55881 48757 55958  2454 48739 46668
[37] 41941 24024 37092 54404 37336 49020 70926 45106 37556 29399 62646 55569
[49] 50623 52877 50143  2769 63587 37863 48989 48783 45274
MS3 <- SELMODEL$runout[[3]]
topicQuality(model=MS3, documents=docs)
 [1] -66.81428 -87.83997 -75.82347 -73.57541 -67.08413 -83.33052 -92.32675
 [8] -70.32537 -95.09833 -78.20692 -92.40581 -90.20287
 [1] 9.298425 9.581715 9.245425 9.026269 9.490519 9.461665 9.390470 9.455644
 [9] 9.324836 9.559014 9.732288 9.613923

MS3_evalheldout<-eval.heldout(MS3, heldout$missing)
hist(MS3_evalheldout$doc.heldout)

MS3_evalheldout
$expected.heldout
[1] -6.230347

$doc.heldout
 [1] -5.758863 -6.412433 -6.146154 -6.506155 -6.332347 -5.846908 -5.585128
 [8] -6.571328 -6.630524 -5.708825 -6.221821 -6.202242 -5.835826 -6.207740
[15] -6.618197 -6.400055 -6.080299 -6.184036 -6.348255 -5.512837 -6.077052
[22] -6.695002 -6.203615 -6.560065 -6.285772 -6.069436 -6.415121 -6.399297
[29] -6.593090 -6.539633 -6.216189 -6.553062 -6.726903 -5.549706 -6.565404
[36] -5.747515 -6.702733 -5.986811 -6.339109 -6.753834 -6.143416 -6.431250
[43] -5.861600 -6.232208 -5.726374 -6.568849 -6.723104 -6.925274 -6.726424
[50] -6.689944 -6.114311 -4.515218 -6.404106 -6.108860 -5.707322 -5.926182
[57] -6.236041

$index
 [1]   8  12  13  33  47  50  79  82  90 115 129 192 197 206 228 233 242 256
[19] 258 259 268 272 274 283 285 287 291 293 307 364 369 388 398 399 416 417
[37] 425 455 458 464 468 475 482 488 492 498 499 505 511 520 530 541 544 551
[55] 570 573 576

$ntokens
 [1] 39692 29431 47618 49993 37241 45658 35567 40651 42069  6058 29522 62122
[13] 43954 38718 46161 63665 68639 73326 66064  3911 62958 49676 48709 36935
[25] 65056 62553 35824 62778 61506 47434 55881 48757 55958  2454 48739 46668
[37] 41941 24024 37092 54404 37336 49020 70926 45106 37556 29399 62646 55569
[49] 50623 52877 50143  2769 63587 37863 48989 48783 45274
MS4 <- SELMODEL$runout[[4]]
topicQuality(model=MS4, documents=docs)
 [1]  -80.99432  -68.41026 -113.10564  -80.90968  -85.88537  -79.88375
 [7]  -88.19470  -95.23561  -65.62718  -66.72911 -103.87772  -64.96218
 [1] 9.240323 9.809413 9.496921 9.391125 9.511400 9.371661 9.620094 9.454076
 [9] 9.391193 9.508331 9.447692 8.949863

MS4_evalheldout<-eval.heldout(MS4, heldout$missing)
hist(MS4_evalheldout$doc.heldout)

MS4_evalheldout
$expected.heldout
[1] -6.253413

$doc.heldout
 [1] -5.547421 -6.348788 -5.951285 -6.398445 -6.382263 -6.175492 -5.565437
 [8] -6.500605 -6.716727 -5.816606 -6.068257 -6.232919 -5.948118 -6.115012
[15] -6.628463 -6.411683 -6.147219 -6.455168 -6.597230 -5.750289 -6.124651
[22] -6.703154 -6.177233 -6.435243 -6.546469 -6.145480 -6.544544 -6.561005
[29] -6.252882 -6.353591 -6.223679 -6.516577 -6.778583 -4.905190 -6.225448
[36] -5.832433 -6.493726 -5.929757 -6.242412 -6.791576 -6.315705 -6.566306
[43] -6.155195 -6.300366 -5.781876 -6.384809 -6.592244 -6.539541 -6.734000
[50] -6.561083 -6.548960 -5.252338 -6.479331 -6.183184 -6.077137 -6.200288
[57] -6.231136

$index
 [1]   8  12  13  33  47  50  79  82  90 115 129 192 197 206 228 233 242 256
[19] 258 259 268 272 274 283 285 287 291 293 307 364 369 388 398 399 416 417
[37] 425 455 458 464 468 475 482 488 492 498 499 505 511 520 530 541 544 551
[55] 570 573 576

$ntokens
 [1] 39692 29431 47618 49993 37241 45658 35567 40651 42069  6058 29522 62122
[13] 43954 38718 46161 63665 68639 73326 66064  3911 62958 49676 48709 36935
[25] 65056 62553 35824 62778 61506 47434 55881 48757 55958  2454 48739 46668
[37] 41941 24024 37092 54404 37336 49020 70926 45106 37556 29399 62646 55569
[49] 50623 52877 50143  2769 63587 37863 48989 48783 45274
MS5 <- SELMODEL$runout[[5]]
topicQuality(model=MS5, documents=docs)
 [1] -59.10653 -81.88639 -69.66952 -76.12258 -82.46782 -79.90309 -83.49564
 [8] -57.07118 -93.04998 -84.03397 -86.52608 -74.52873
 [1] 9.658110 9.336212 9.332815 9.646949 9.429048 9.301979 9.506108 9.482788
 [9] 9.524420 9.535551 9.546149 9.334337

MS5_evalheldout<-eval.heldout(MS5, heldout$missing)
hist(MS5_evalheldout$doc.heldout)

MS5_evalheldout
$expected.heldout
[1] -6.230668

$doc.heldout
 [1] -5.757784 -6.333322 -6.111657 -6.640060 -6.264930 -5.920986 -5.351880
 [8] -6.342519 -6.685615 -5.921120 -5.691588 -6.169200 -5.913724 -6.203328
[15] -6.515082 -6.396366 -5.883360 -6.409520 -6.128259 -5.936402 -6.046711
[22] -6.717631 -6.094611 -6.560396 -6.296929 -6.042945 -6.661286 -6.554439
[29] -6.351716 -6.442477 -6.351104 -6.478583 -6.260696 -5.729056 -6.648963
[36] -5.945381 -6.402547 -6.237331 -6.236717 -6.686005 -6.196169 -6.213280
[43] -6.086453 -6.383583 -5.549048 -6.212460 -7.019121 -6.701370 -6.823452
[50] -6.574287 -6.462147 -4.396197 -6.512477 -6.179842 -6.025346 -6.275679
[57] -6.214927

$index
 [1]   8  12  13  33  47  50  79  82  90 115 129 192 197 206 228 233 242 256
[19] 258 259 268 272 274 283 285 287 291 293 307 364 369 388 398 399 416 417
[37] 425 455 458 464 468 475 482 488 492 498 499 505 511 520 530 541 544 551
[55] 570 573 576

$ntokens
 [1] 39692 29431 47618 49993 37241 45658 35567 40651 42069  6058 29522 62122
[13] 43954 38718 46161 63665 68639 73326 66064  3911 62958 49676 48709 36935
[25] 65056 62553 35824 62778 61506 47434 55881 48757 55958  2454 48739 46668
[37] 41941 24024 37092 54404 37336 49020 70926 45106 37556 29399 62646 55569
[49] 50623 52877 50143  2769 63587 37863 48989 48783 45274
MS6 <- SELMODEL$runout[[6]]
topicQuality(model=MS6, documents=docs)
 [1] -85.28665 -73.99364 -88.60246 -74.53001 -84.42852 -85.74578 -85.17334
 [8] -81.44334 -62.23362 -78.13769 -67.71376 -75.22818
 [1] 9.611876 9.141486 9.541321 9.428722 9.531174 9.600376 9.384969 9.616844
 [9] 9.064353 9.419461 9.706312 9.524023

MS6_evalheldout<-eval.heldout(MS6, heldout$missing)
hist(MS6_evalheldout$doc.heldout)

MS6_evalheldout
$expected.heldout
[1] -6.224699

$doc.heldout
 [1] -5.619660 -6.492202 -6.178650 -6.542955 -6.193185 -6.203928 -5.292074
 [8] -6.370396 -6.790151 -5.639262 -5.762380 -6.256493 -5.820496 -6.280342
[15] -6.464707 -6.385618 -6.138104 -6.126241 -6.238390 -5.774594 -6.061625
[22] -6.884735 -6.219620 -6.491523 -6.309922 -6.059043 -6.589051 -6.283775
[29] -6.293354 -6.421719 -6.309560 -6.503018 -6.639418 -5.236308 -6.512360
[36] -5.839517 -6.637350 -6.076885 -6.214417 -6.685756 -6.027692 -6.211922
[43] -6.102389 -6.381138 -5.842324 -6.296652 -6.838409 -6.663369 -6.868292
[50] -6.379959 -6.136796 -4.936104 -6.521402 -6.173405 -6.253698 -6.134495
[57] -6.200994

$index
 [1]   8  12  13  33  47  50  79  82  90 115 129 192 197 206 228 233 242 256
[19] 258 259 268 272 274 283 285 287 291 293 307 364 369 388 398 399 416 417
[37] 425 455 458 464 468 475 482 488 492 498 499 505 511 520 530 541 544 551
[55] 570 573 576

$ntokens
 [1] 39692 29431 47618 49993 37241 45658 35567 40651 42069  6058 29522 62122
[13] 43954 38718 46161 63665 68639 73326 66064  3911 62958 49676 48709 36935
[25] 65056 62553 35824 62778 61506 47434 55881 48757 55958  2454 48739 46668
[37] 41941 24024 37092 54404 37336 49020 70926 45106 37556 29399 62646 55569
[49] 50623 52877 50143  2769 63587 37863 48989 48783 45274
FINALSELECTED <- SELMODEL$runout[[4]]
topicQuality(model=FINALSELECTED, documents=docs)
 [1]  -80.99432  -68.41026 -113.10564  -80.90968  -85.88537  -79.88375
 [7]  -88.19470  -95.23561  -65.62718  -66.72911 -103.87772  -64.96218
 [1] 9.240323 9.809413 9.496921 9.391125 9.511400 9.371661 9.620094 9.454076
 [9] 9.391193 9.508331 9.447692 8.949863

evalheldout<-eval.heldout(FINALSELECTED, heldout$missing)
hist(evalheldout$doc.heldout)

evalheldout
$expected.heldout
[1] -6.253413

$doc.heldout
 [1] -5.547421 -6.348788 -5.951285 -6.398445 -6.382263 -6.175492 -5.565437
 [8] -6.500605 -6.716727 -5.816606 -6.068257 -6.232919 -5.948118 -6.115012
[15] -6.628463 -6.411683 -6.147219 -6.455168 -6.597230 -5.750289 -6.124651
[22] -6.703154 -6.177233 -6.435243 -6.546469 -6.145480 -6.544544 -6.561005
[29] -6.252882 -6.353591 -6.223679 -6.516577 -6.778583 -4.905190 -6.225448
[36] -5.832433 -6.493726 -5.929757 -6.242412 -6.791576 -6.315705 -6.566306
[43] -6.155195 -6.300366 -5.781876 -6.384809 -6.592244 -6.539541 -6.734000
[50] -6.561083 -6.548960 -5.252338 -6.479331 -6.183184 -6.077137 -6.200288
[57] -6.231136

$index
 [1]   8  12  13  33  47  50  79  82  90 115 129 192 197 206 228 233 242 256
[19] 258 259 268 272 274 283 285 287 291 293 307 364 369 388 398 399 416 417
[37] 425 455 458 464 468 475 482 488 492 498 499 505 511 520 530 541 544 551
[55] 570 573 576

$ntokens
 [1] 39692 29431 47618 49993 37241 45658 35567 40651 42069  6058 29522 62122
[13] 43954 38718 46161 63665 68639 73326 66064  3911 62958 49676 48709 36935
[25] 65056 62553 35824 62778 61506 47434 55881 48757 55958  2454 48739 46668
[37] 41941 24024 37092 54404 37336 49020 70926 45106 37556 29399 62646 55569
[49] 50623 52877 50143  2769 63587 37863 48989 48783 45274
#save(MODELS, SELMODEL, FINALSELECTED, file = "./DATA/DATA.Rdata")

Topic Model Description

Basic Result

#==== Summary
## Label Topics
labelTopics(FINALSELECTED)
Topic 1 Top Words:
     Highest Prob: learn, space, inform, experi, group, peopl, way 
     FREX: everyday, mother, space, onlin, men, theatr, cancer 
     Lift: consumpt, fix, nonhuman, overlap, treatment, victori, wisdom 
     Score: mother, space, everyday, cancer, men, onlin, theatr 
Topic 2 Top Words:
     Highest Prob: research, practic, process, knowledg, chang, context, work 
     FREX: research, action, process, creativ, construct, know, chang 
     Lift: reciproc, recreat, merleauponti, piaget, pragmatist, reaction, proverb 
     Score: research, action, creativ, practic, know, knowledg, embodi 
Topic 3 Top Words:
     Highest Prob: learn, cultur, programm, languag, art, african, report 
     FREX: languag, art, museum, african, programm, english, cultur 
     Lift: ail, britain, confintea, correct, esol, prescrib, shortcom 
     Score: art, languag, african, museum, programm, cultur, visual 
Topic 4 Top Words:
     Highest Prob: learn, train, skill, develop, workplac, career, employ 
     FREX: employe, solv, cps, train, career, skill, workplac 
     Lift: assign, classif, colleagu, confirmatori, domainspecif, employe, financ 
     Score: cps, train, employe, solv, career, workplac, expertis 
Topic 5 Top Words:
     Highest Prob: learn, lifelong, social, capit, immigr, develop, also 
     FREX: lifelong, capit, immigr, vocat, wellb, elder, japan 
     Lift: ecosystem, endors, hivaid, singapor, thailand, devalu, further 
     Score: lifelong, learn, capit, japan, immigr, thailand, elder 
Topic 6 Top Words:
     Highest Prob: educ, adult, student, particip, learner, age, transit 
     FREX: age, transit, graduat, parttim, motiv, student, undergradu 
     Lift: insecur, postschool, workingclass, interviewe, leaver, midlif, multivari 
     Score: student, parttim, older, motiv, transit, age, undergradu 
Topic 7 Top Words:
     Highest Prob: experi, ident, learner, univers, engag, academ, prior 
     FREX: rpl, recognit, academ, interpret, prior, ident, subject 
     Lift: decid, habitus, postgradu, began, bourdieu, classifi, judi 
     Score: rpl, prior, recognit, ident, univers, habitus, academ 
Topic 8 Top Words:
     Highest Prob: educ, women, adult, social, pedagogi, articl, feminist 
     FREX: feminist, women, movement, american, pedagogi, popular, televis 
     Lift: antirac, arab, enforc, garment, husband, marxist, protest 
     Score: women, feminist, pedagogi, educ, adult, movement, american 
Topic 9 Top Words:
     Highest Prob: group, teacher, taylor, educ, franci, llc, copyright 
     FREX: copyright, teacher, llc, authent, apel, group, citizenship 
     Lift: apel, copyright, discrep, driver, eman, horizon, imper 
     Score: teacher, llc, copyright, authent, student, apel, citizenship 
Topic 10 Top Words:
     Highest Prob: learn, adult, educ, transform, theori, critic, reflect 
     FREX: spiritu, radic, transform, theori, critic, reflect, author 
     Lift: autobiographi, alleg, authoritarian, bias, confucian, erasur, haberma 
     Score: transform, theori, adult, learn, critic, spiritu, confucian 
Topic 11 Top Words:
     Highest Prob: communiti, literaci, program, develop, project, adult, health 
     FREX: literaci, communitybas, program, collabor, nonprofit, communiti, health 
     Lift: client, east, heroic, nonetheless, photovoic, sport, user 
     Score: communiti, literaci, program, health, nonprofit, local, sport 
Topic 12 Top Words:
     Highest Prob: educ, polici, higher, countri, adult, european, develop 
     FREX: european, europ, polici, countri, lll, portug, union 
     Lift: efa, export, harmon, latest, lll, shortag, uganda 
     Score: polici, european, countri, higher, bologna, europ, educ 
## Estimating Effect
prepeffect <- estimateEffect(1:12 ~ JournalFa + s(Year), FINALSELECTED, meta = out$meta, uncertainty = "Global")

Summary

#==== Summary
plot.STM(FINALSELECTED, type = "summary")

plot.STM(FINALSELECTED, type = "labels", topics = c(1,2,3))

plot.STM(FINALSELECTED, type = "labels", topics = c(4,5,6))

plot.STM(FINALSELECTED, type = "labels", topics = c(7,8,9))

plot.STM(FINALSELECTED, type = "labels", topics = c(10,11,12))

plot.STM(FINALSELECTED, type = "hist", topics = c(1,2,3,4))

plot.STM(FINALSELECTED, type = "hist", topics = c(5,6,7,8))

plot.STM(FINALSELECTED, type = "hist", topics = c(9,10,11,12))

Summary - Perspective

#==== Summary
plot.STM(FINALSELECTED, type = "perspectives", topics = c(10, 4))

plot.STM(FINALSELECTED, type = "perspectives", topics = c(10, 5))

plot.STM(FINALSELECTED, type = "perspectives", topics = c(10, 12))

plot.STM(FINALSELECTED, type = "perspectives", topics = c(10, 9))

Topic and Documents

thoughts1 <- findThoughts(FINALSELECTED, texts = meta$Title, n = 5, topics =1 )$docs[[1]]
thoughts1
[1] "Self-directed learning and prostate cancer: A thematic analysis of the experiences of twelve patients"
[2] "Talking up learning at work: Cautionary tales in co-opting everyday learning"                         
[3] "The in-between: Exposing everyday learning at work"                                                   
[4] "Invisible theatre, ethics, and the adult educator"                                                    
[5] "Popular education in solidarity economy"                                                              
thoughts2 <- findThoughts(FINALSELECTED, texts = meta$Title, n = 5, topics =2 )$docs[[1]]
thoughts2
[1] "The Manifestation and Integration of Embodied Knowing Into Social Work Practice"                                             
[2] "ing the complicated matter of what works: Evidence-based research and the problem of practice"                               
[3] "Action Research and Its History as an Adult Education Movement for Social Change"                                            
[4] "Creative Expression as a Way of Knowing in Diabetes Adult Health Education An Action Research "                              
[5] "From autonomy to reciprocity, or vice versa? French personalisms contribution to a new perspective on self-directed learning"
thoughts3 <- findThoughts(FINALSELECTED, texts = meta$Title, n = 5, topics =3 )$docs[[1]]
thoughts3
[1] "The universal basic education programme and female trafficking in South-South, Nigeria"
[2] "Response to learning through life: Thematic area of poverty reduction"                 
[3] "Generative Learning: Adults Learning Within Ambiguity"                                 
[4] "Learning in the circumstances of practice"                                             
[5] "The perils of confusing lifelong learning with lifelong education"                     
thoughts4 <- findThoughts(FINALSELECTED, texts = meta$Title, n = 5, topics =4 )$docs[[1]]
thoughts4
[1] "Linking complex problem solving and general mental ability to career advancement: Does a transversal skill reveal incremental predictive validity?"
[2] "Development of the self-directed learning skills scale"                                                                                            
[3] "Development of learning to learn skills in primary school"                                                                                         
[4] "Problem solving in everyday office work—a diary  on differences between experts and novices"                                                     
[5] "What do employers pay for employees’ complex problem solving skills?"                                                                            
thoughts5 <- findThoughts(FINALSELECTED, texts = meta$Title, n = 5, topics =5 )$docs[[1]]
thoughts5
[1] "Lifelong learning and the social integration of refugees in the UK: The significance of social capital"                                                                     
[2] "The lifelong learning ecosystem in Korea: Evolution of learning capitalism?"                                                                                                
[3] "Bringing learning closer to home: The value and impact of the Lisbon strategy for strengthening the role of local learning centres and partnerships in south-eastern Europe"
[4] "Lifelong learning and vocational training programmes in Northern Aegean (Greece): Weaknesses, possibilities and prospects"                                                  
[5] "An examination of lifelong learning policy rhetoric and practice in Singapore"                                                                                              
thoughts6 <- findThoughts(FINALSELECTED, texts = meta$Title, n = 5, topics =6 )$docs[[1]]
thoughts6
[1] "Math Anxiety, Math Self-Concept, and Math Self-Efficacy in Adult Learners Compared to Traditional Undergraduate Students"                                     
[2] "First- versus continuing-generation adult students on college perceptions: Are differences actually because of demographic variance?"                         
[3] "The young outsiders: The later life courses of dropout youths"                                                                                                
[4] "Motivation, interest, and positive affect in traditional and nontraditional undergraduate students"                                                           
[5] "Patterns and trends in part-time adult education participation in relation to UK nation, class, place of participation, gender, age and disability, 1998-2003"
thoughts7 <- findThoughts(FINALSELECTED, texts = meta$Title, n = 5, topics =7 )$docs[[1]]
thoughts7
[1] "Experiential learning in youth work in the UK: A return to Dewey"                                                                                               
[2] "Recognition of prior learning: exploring the knowledge question"                                                                                                
[3] "Outcasts on the inside: academics reinventing themselves online"                                                                                                
[4] "Activists Within the Academy: The Role of Prior Experience in Adult Learners Acquisition of Postgraduate Literacies in a Postapartheid South African University"
[5] "The knowledgeable parenting style: stance takings and subject positions in media encounters"                                                                    
thoughts8 <- findThoughts(FINALSELECTED, texts = meta$Title, n = 5, topics =8 )$docs[[1]]
thoughts8
[1] "More Important Than Guns: Chinese Adult Education After the Long March"                                                   
[2] "Quien Sabe Mas Lucha Mejor: Adult Educators Care of the Self Practices Within Social Movements in Buenos Aires, Argentina"
[3] "The untold story of foreign devil adult educators in shanghai silk factories (1920 to 1949)"                              
[4] "Adult learning in new social movements: Environmental protest and the struggle for the Clayoquot Sound rainforest"        
[5] "The gendered nature of education under siege: A Palestinian feminist perspective"                                         
thoughts9 <- findThoughts(FINALSELECTED, texts = meta$Title, n = 5, topics =9 )$docs[[1]]
thoughts9
[1] "Agreement in assessment of prior learning related to higher education: an examination of interrater and intrarater reliability"
[2] "The expanded developmental periphery: Framing the institutional role of university continuing education units"                 
[3] "Teacher professional development for the new school improvement: Botswana"                                                     
[4] "Students as learners through the eyes of their teachers in Rwandan higher education"                                           
[5] "Citizenship and belonging as a moral imperative for lifelong learning"                                                         
thoughts10 <- findThoughts(FINALSELECTED, texts = meta$Title, n = 5, topics =10 )$docs[[1]]
thoughts10
[1] "Critical Reflection as a Rationalistic Ideal"                                                                 
[2] "A Critical Realist Orientation to Learner Needs"                                                              
[3] "Radical questioning on The Long Walk to Freedom: Nelson Mandela and the practice of critical reflection"      
[4] "Critical Race Theory and Adult Education"                                                                     
[5] "An enabling framework for reflexive learning: Experiential learning and reflexivity in contemporary modernity"
thoughts11 <- findThoughts(FINALSELECTED, texts = meta$Title, n = 5, topics =11 )$docs[[1]]
thoughts11
[1] "Theyre a lot cleverer than i thought: Challenging perceptions of disability support staff as they tutor in an adult literacy program"
[2] "A framework for lifelong involvement in sport and physical activity: The Irish perspective"                                          
[3] "Are Low-Income Canadians Financially Literate? Placing Financial Literacy in the Context of Personal and Structural Constraints"     
[4] "Reconstructing literacy as an innovation for sustainable development: A policy advocacy for Bangladesh"                              
[5] "The pitfalls of a democracy promotion project for women of Iraq"                                                                     
thoughts12 <- findThoughts(FINALSELECTED, texts = meta$Title, n = 5, topics =12 )$docs[[1]]
thoughts12
[1] "Second chance routes into higher education: Sweden, Norway and Germany compared"               
[2] "The Bologna Process and higher education in Mercosur: regionalization or Europeanization?"     
[3] "Adult education in transition: Three cases and periods compared"                               
[4] "Does the Celtic Tiger society need to debate the role of higher education and the public good?"
[5] "The lost honour of the Social Dimension: Bologna, exports and the idea of the university"      

Pointestimate of mean of topic in four diffeent

par(mfrow=c(2,2))
plot.estimateEffect(prepeffect, covariate = "JournalFa", topics = 10,
                    model = FINALSELECTED, method = "pointestimate",
                    xlab = "Expected Proportion",
                    main = "TOPIC 10 (Adult Education)",
                    xlim = c(-.02, .3), 
                    labeltype = "custom",
                    custom.labels = c(
                      'AEQ', 'IJLE'))
plot.estimateEffect(prepeffect, covariate = "JournalFa", topics = 5,
                    model = FINALSELECTED, method = "pointestimate",
                    xlab = "Expected Proportion",
                    main = "TOPIC 5 (Lifelong Eduction)",
                    xlim = c(-.02, .18), 
                    labeltype = "custom",
                    custom.labels = c(
                      'AEQ', 'IJLE'))
plot.estimateEffect(prepeffect, covariate = "JournalFa", topics = 4,
                    model = FINALSELECTED, method = "pointestimate",
                    xlab = "Expected Proportion",
                    main = "TOPIC 4 (HRD, Workplace)",
                    xlim = c(-.02, .18), 
                    labeltype = "custom",
                    custom.labels = c(
                      'AEQ', 'IJLE'))
plot.estimateEffect(prepeffect, covariate = "JournalFa", topics = 6,
                    model = FINALSELECTED, method = "pointestimate",
                    xlab = "Expected Proportion",
                    main = "TOPIC 2 ()",
                    xlim = c(-.02, .18), 
                    labeltype = "custom",
                    custom.labels = c(
                      'AEQ', 'IJLE'))
par(mfrow=c(1,1))

Time Trend Plot with genuine plot

par(mfrow=c(3,2))
P1<-plot.estimateEffect(prepeffect, 
                        covariate = "Year",
                        topics = 1,
                        model = FINALSELECTED,
                        method = "continuous", 
                        ylim = c(0, .4),
                        linecol = "blue", 
                        printlegend = F, 
                        main = " Topic1  () \n learn, space, inform, experi, group, peopl, way ")
P2<-plot.estimateEffect(prepeffect, 
                        covariate = "Year",
                        topics = 2,
                        model = FINALSELECTED,
                        method = "continuous", 
                        ylim = c(0, .4),
                        linecol = "blue", 
                        printlegend = F, 
                        main = " Topic2  () \n research, practic, process, knowledg, chang, context, work ")
P3<-plot.estimateEffect(prepeffect, 
                        covariate = "Year",
                        topics = 3,
                        model = FINALSELECTED,
                        method = "continuous", 
                        ylim = c(0, .4),
                        linecol = "blue", 
                        printlegend = F, 
                        main = " Topic3  () \n learn, cultur, programm, languag, art, african, report ")
P4<-plot.estimateEffect(prepeffect, 
                        covariate = "Year",
                        topics = 4,
                        model = FINALSELECTED,
                        method = "continuous", 
                        ylim = c(0, .4),
                        linecol = "blue", 
                        printlegend = F, 
                        main = " Topic4  () \n learn, train, skill, develop, workplac, career, employ ")
P5<-plot.estimateEffect(prepeffect, 
                        covariate = "Year",
                        topics = 5,
                        model = FINALSELECTED,
                        method = "continuous", 
                        ylim = c(0, .4),
                        linecol = "blue", 
                        printlegend = F, 
                        main = " Topic5  () \n learn, lifelong, social, capit, immigr, develop")
P6<-plot.estimateEffect(prepeffect, 
                        covariate = "Year",
                        topics = 6,
                        model = FINALSELECTED,
                        method = "continuous", 
                        ylim = c(0, .4),
                        linecol = "blue", 
                        printlegend = F, 
                        main = " Topic6  () \n educ, adult, student, particip, learner, age, transit ")
par(mfrow=c(1,1))
par(mfrow=c(3,2))

P7<-plot.estimateEffect(prepeffect, 
                        covariate = "Year",
                        topics = 7,
                        model = FINALSELECTED,
                        method = "continuous", 
                        ylim = c(0, .4),
                        linecol = "blue", 
                        printlegend = F, 
                        main = " Topic7  () \n experi, ident, learner, univers, engag, academ, prior ")
P8<-plot.estimateEffect(prepeffect, 
                        covariate = "Year",
                        topics = 8,
                        model = FINALSELECTED,
                        method = "continuous", 
                        ylim = c(0, .4),
                        linecol = "blue", 
                        printlegend = F, 
                        main = " Topic8  () \n educ, women, adult, social, pedagogi, articl, feminist ")
P9<-plot.estimateEffect(prepeffect, 
                        covariate = "Year",
                        topics = 9,
                        model = FINALSELECTED,
                        method = "continuous", 
                        ylim = c(0, .4),
                        linecol = "blue", 
                        printlegend = F, 
                        main = " Topic9  () \n group, teacher, taylor, educ, franci, llc, copyright ")
P10<-plot.estimateEffect(prepeffect, 
                        covariate = "Year",
                        topics = 10,
                        model = FINALSELECTED,
                        method = "continuous", 
                        ylim = c(0, .4),
                        linecol = "blue", 
                        printlegend = F, 
                        main = " Topic10  () \n learn, adult, educ, transform, theori, critic, reflect ")
P11<-plot.estimateEffect(prepeffect, 
                        covariate = "Year",
                        topics = 11,
                        model = FINALSELECTED,
                        method = "continuous", 
                        ylim = c(0, .4),
                        linecol = "blue", 
                        printlegend = F, 
                        main = " Topic11  () \n communiti, literaci, program, develop, project, adult, health ")
P12<-plot.estimateEffect(prepeffect, 
                        covariate = "Year",
                        topics = 12,
                        model = FINALSELECTED,
                        method = "continuous", 
                        ylim = c(0, .4),
                        linecol = "blue", 
                        printlegend = F, 
                        main = " Topic12  () \n educ, polici, higher, countri, adult, european, develop ")
par(mfrow=c(1,1))

trend plot values

P1
$x
  [1] 2006.000 2006.091 2006.182 2006.273 2006.364 2006.455 2006.545 2006.636
  [9] 2006.727 2006.818 2006.909 2007.000 2007.091 2007.182 2007.273 2007.364
 [17] 2007.455 2007.545 2007.636 2007.727 2007.818 2007.909 2008.000 2008.091
 [25] 2008.182 2008.273 2008.364 2008.455 2008.545 2008.636 2008.727 2008.818
 [33] 2008.909 2009.000 2009.091 2009.182 2009.273 2009.364 2009.455 2009.545
 [41] 2009.636 2009.727 2009.818 2009.909 2010.000 2010.091 2010.182 2010.273
 [49] 2010.364 2010.455 2010.545 2010.636 2010.727 2010.818 2010.909 2011.000
 [57] 2011.091 2011.182 2011.273 2011.364 2011.455 2011.545 2011.636 2011.727
 [65] 2011.818 2011.909 2012.000 2012.091 2012.182 2012.273 2012.364 2012.455
 [73] 2012.545 2012.636 2012.727 2012.818 2012.909 2013.000 2013.091 2013.182
 [81] 2013.273 2013.364 2013.455 2013.545 2013.636 2013.727 2013.818 2013.909
 [89] 2014.000 2014.091 2014.182 2014.273 2014.364 2014.455 2014.545 2014.636
 [97] 2014.727 2014.818 2014.909 2015.000

$topics
[1] 1

$means
$means[[1]]
           1            2            3            4            5            6 
 0.121646610  0.112677540  0.104144860  0.096073307  0.088487620  0.081412536 
           7            8            9           10           11           12 
 0.074872793  0.068893131  0.063498286  0.058712997  0.054562002  0.051070040 
          13           14           15           16           17           18 
 0.048250592  0.046072120  0.044491829  0.043466925  0.042954614  0.042912100 
          19           20           21           22           23           24 
 0.043296591  0.044065290  0.045175404  0.046584139  0.048248699  0.050126290 
          25           26           27           28           29           30 
 0.052174119  0.054349390  0.056609309  0.058911082  0.061211914  0.063469011 
          31           32           33           34           35           36 
 0.065639578  0.067680820  0.069549945  0.071204156  0.072609079  0.073764012 
          37           38           39           40           41           42 
 0.074676674  0.075354783  0.075806057  0.076038214  0.076058972  0.075876050 
          43           44           45           46           47           48 
 0.075497166  0.074930037  0.074182382  0.073275072  0.072281590  0.071288571 
          49           50           51           52           53           54 
 0.070382653  0.069650470  0.069178658  0.069053854  0.069362693  0.070191812 
          55           56           57           58           59           60 
 0.071627846  0.073757431  0.076628549  0.080134567  0.084130196  0.088470151 
          61           62           63           64           65           66 
 0.093009142  0.097601884  0.102103087  0.106367465  0.110249731  0.113604596 
          67           68           69           70           71           72 
 0.116286774  0.118150976  0.119051916  0.118844305  0.117382857  0.114522284 
          73           74           75           76           77           78 
 0.110117299  0.104022613  0.096092940  0.086182993  0.074147482  0.059841122 
          79           80           81           82           83           84 
 0.043400786  0.026091997  0.009462439 -0.004940203 -0.015568247 -0.020874007 
          85           86           87           88           89           90 
-0.019309799 -0.009327939  0.010619256  0.042079472  0.086600392  0.144386346 
          91           92           93           94           95           96 
 0.210268243  0.277733637  0.340270085  0.391365140  0.424506357  0.433181292 
          97           98           99          100 
 0.410877497  0.351082529  0.247283943  0.092969292 


$ci
$ci[[1]]
               1          2           3           4           5           6
2.5%  0.06033089 0.04267653 0.007587055 -0.01993625 -0.03890143 -0.04855318
97.5% 0.18563893 0.18197166 0.198726058  0.21128683  0.21587495  0.21034397
                7           8           9          10          11
2.5%  -0.04941684 -0.04401991 -0.03213293 -0.02086282 -0.00743148
97.5%  0.19668025  0.17892837  0.15807455  0.13368483  0.11249565
                 12          13          14           15           16
2.5%  -0.0008126885 0.003827421 0.002946707 -0.001814473 -0.005471928
97.5%  0.0994601609 0.092417313 0.090738329  0.092046627  0.093386656
                17          18          19           20           21
2.5%  -0.008149204 -0.00829902 -0.00910302 -0.007144584 -0.003585944
97.5%  0.095848254  0.09653464  0.09777119  0.098200580  0.097474366
                 22          23          24          25         26         27
2.5%  -0.0006686304 0.002617926 0.006054669 0.009302451 0.01233992 0.01577919
97.5%  0.0969383961 0.095722812 0.095070783 0.095601111 0.09611446 0.09710053
             28         29         30         31         32         33
2.5%  0.0192271 0.02018445 0.02126717 0.02180828 0.02318449 0.02446694
97.5% 0.0991407 0.10333532 0.10576628 0.10952622 0.11316457 0.11580351
              34         35         36         37         38         39
2.5%  0.02656686 0.03028455 0.03283638 0.03574763 0.03666611 0.03628851
97.5% 0.11652293 0.11697075 0.11641039 0.11551631 0.11518645 0.11603864
              40         41         42         43         44         45
2.5%  0.03441166 0.03202334 0.02926826 0.02655131 0.02378485 0.02276384
97.5% 0.11724366 0.11869381 0.12133242 0.12329735 0.12464132 0.12426431
              46         47         48         49         50         51
2.5%  0.02325486 0.02392923 0.02496968 0.02711446 0.02835949 0.02906568
97.5% 0.12284124 0.12006666 0.11718050 0.11429871 0.11246196 0.11055312
              52         53         54         55         56         57
2.5%  0.02825738 0.02727746 0.02646149 0.02606116 0.02692052 0.02893666
97.5% 0.11080398 0.11213568 0.11338402 0.11622954 0.11889223 0.12162313
              58         59        60         61         62         63
2.5%  0.03403333 0.04031896 0.0466202 0.05235491 0.05848736 0.06442285
97.5% 0.12469454 0.12818195 0.1310538 0.13351312 0.13630548 0.14131187
              64         65         66         67         68         69
2.5%  0.06824009 0.07056416 0.07137705 0.07129732 0.07024584 0.06897428
97.5% 0.14672515 0.15350012 0.15988179 0.16488107 0.17002998 0.17326181
              70         71         72         73         74         75
2.5%  0.06639815 0.06367641 0.06131104 0.05786541 0.05485625 0.04998023
97.5% 0.17490467 0.17481189 0.17195540 0.16541005 0.15502764 0.14282326
              76         77         78          79          80         81
2.5%  0.04305602 0.03095661 0.01271678 -0.01517831 -0.05182833 -0.0872705
97.5% 0.13040367 0.11757329 0.10956937  0.10374215  0.10306541  0.1040658
              82         83         84         85         86          87
2.5%  -0.1205869 -0.1441183 -0.1564773 -0.1510826 -0.1295284 -0.08869126
97.5%  0.1048334  0.1073800  0.1083617  0.1110681  0.1087747  0.10693685
               88         89         90         91         92         93
2.5%  -0.02428702 0.03724353 0.05064816 0.03966253 0.02343571 0.01109009
97.5%  0.10941740 0.14067552 0.24952023 0.39479841 0.54944978 0.69240727
                94          95           96          97         98         99
2.5%  -0.002258241 -0.00992776 -0.008081124 0.001246342 0.01745422 0.04417109
97.5%  0.807250185  0.87913897  0.892233514 0.836660525 0.69926426 0.46058881
             100
2.5%  0.04628183
97.5% 0.14125111
#P2
#P3
#P4
#P5

Time Trend Plot with ggplot

TOPIC 1

P1_1<-P1$x
P1_2<-P1$topics
P1_3<-P1$means[[1]]
P1_4<-P1$ci[[1]]
P1_4<-t(P1_4)
P1C<-as.data.frame(cbind(P1_1,P1_3,P1_4))
colnames(P1C)<-c("YEAR","Trend","LOWCI","HIGHCI")
P1ANNO<-grobTree(
  textGrob(
    "Highest Probability Words: 
    Topic 1 Top Words: learn, space, inform, experi, group, peopl, way ",
    x=0.1,  
    y=0.9, 
    hjust=0, 
    gp=gpar(col="black", fontsize=8)))
P1GG<-ggplot(P1C) + geom_line(aes(x=P1C$YEAR, y=P1C$Trend), color="black", size=0.5) + labs(title="Topic 1: ") + annotation_custom(P1ANNO) + ylim(-0.2, 0.7) + xlab("") + ylab("Expected Topic Proportion") + theme_hc() + scale_x_continuous(breaks=c(2006,2007,2008,2009,2010,2011,2012,2013,2014,2015))
P1GG

Topic 2

P2_1<-P2$x
P2_2<-P2$topics
P2_3<-P2$means[[1]]
P2_4<-P2$ci[[1]]
P2_4<-t(P2_4)
P2C<-as.data.frame(cbind(P2_1,P2_3,P2_4))
colnames(P2C)<-c("YEAR","Trend","LOWCI","HIGHCI")
P2ANNO<-grobTree(
  textGrob(
    "Highest Probability Words: 
    Topic 2 Top Words: research, practic, process, knowledg, chang, context, work ",
    x=0.1,  
    y=0.9, 
    hjust=0, 
    gp=gpar(col="black", fontsize=8)))
P2GG<-ggplot(P2C) + geom_line(aes(x=P2C$YEAR, y=P2C$Trend), color="black", size=0.5) + labs(title="Topic 1: ") + annotation_custom(P2ANNO) + ylim(-0.2, 0.7) + xlab("") + ylab("Expected Topic Proportion") + theme_hc() + scale_x_continuous(breaks=c(2006,2007,2008,2009,2010,2011,2012,2013,2014,2015))
P2GG

Topic 3

P3_1<-P3$x
P3_2<-P3$topics
P3_3<-P3$means[[1]]
P3_4<-P3$ci[[1]]
P3_4<-t(P3_4)
P3C<-as.data.frame(cbind(P3_1,P3_3,P3_4))
colnames(P3C)<-c("YEAR","Trend","LOWCI","HIGHCI")
P3ANNO<-grobTree(
  textGrob(
    "Highest Probability Words: 
    Topic 3 Top Words: learn, cultur, programm, languag, art, african, report ",
    x=0.1,  
    y=0.9, 
    hjust=0, 
    gp=gpar(col="black", fontsize=8)))
P3GG<-ggplot(P3C) + geom_line(aes(x=P3C$YEAR, y=P3C$Trend), color="black", size=0.5) + labs(title="Topic 3: ") + annotation_custom(P3ANNO) + ylim(-0.2, 0.7) + xlab("") + ylab("Expected Topic Proportion") + theme_hc() + scale_x_continuous(breaks=c(2006,2007,2008,2009,2010,2011,2012,2013,2014,2015))
P3GG

Topic 4

P4_1<-P4$x
P4_2<-P4$topics
P4_3<-P4$means[[1]]
P4_4<-P4$ci[[1]]
P4_4<-t(P4_4)
P4C<-as.data.frame(cbind(P4_1,P4_3,P4_4))
colnames(P4C)<-c("YEAR","Trend","LOWCI","HIGHCI")
P4ANNO<-grobTree(
  textGrob(
    "Highest Probability Words: 
    Topic 4 Top Words: learn, train, skill, develop, workplac, career, employ ",
    x=0.1,  
    y=0.9, 
    hjust=0, 
    gp=gpar(col="black", fontsize=8)))
P4GG<-ggplot(P4C) + geom_line(aes(x=P4C$YEAR, y=P4C$Trend), color="black", size=0.5) + labs(title="Topic 4: ") + annotation_custom(P4ANNO) + ylim(-0.2, 0.7) + xlab("") + ylab("Expected Topic Proportion") + theme_hc() + scale_x_continuous(breaks=c(2006,2007,2008,2009,2010,2011,2012,2013,2014,2015))
P4GG

Topic 5

P5_1<-P5$x
P5_2<-P5$topics
P5_3<-P5$means[[1]]
P5_4<-P5$ci[[1]]
P5_4<-t(P5_4)
P5C<-as.data.frame(cbind(P5_1,P5_3,P5_4))
colnames(P5C)<-c("YEAR","Trend","LOWCI","HIGHCI")
P5ANNO<-grobTree(
  textGrob(
    "Highest Probability Words: 
    Topic 5 Top Words: learn, lifelong, social, capit, immigr, develop, also ",
    x=0.1,  
    y=0.9, 
    hjust=0, 
    gp=gpar(col="black", fontsize=8)))
P5GG<-ggplot(P5C) + geom_line(aes(x=P5C$YEAR, y=P5C$Trend), color="black", size=0.5) + labs(title="Topic 5: ") + annotation_custom(P5ANNO) + ylim(-0.2, 0.7) + xlab("") + ylab("Expected Topic Proportion") + theme_hc() + scale_x_continuous(breaks=c(2006,2007,2008,2009,2010,2011,2012,2013,2014,2015))
P5GG

Topic 6

P6_1<-P6$x
P6_2<-P6$topics
P6_3<-P6$means[[1]]
P6_4<-P6$ci[[1]]
P6_4<-t(P6_4)
P6C<-as.data.frame(cbind(P6_1,P6_3,P6_4))
colnames(P6C)<-c("YEAR","Trend","LOWCI","HIGHCI")
P6ANNO<-grobTree(
  textGrob(
    "Highest Probability Words: 
     Topic 6 Top Words: educ, adult, student, particip, learner, age, transit ",
    x=0.1,  
    y=0.9, 
    hjust=0, 
    gp=gpar(col="black", fontsize=8)))
P6GG<-ggplot(P6C) + geom_line(aes(x=P6C$YEAR, y=P6C$Trend), color="black", size=0.5) + labs(title="Topic 6: ") + annotation_custom(P6ANNO) + ylim(-0.2, 0.7) + xlab("") + ylab("Expected Topic Proportion") + theme_hc() + scale_x_continuous(breaks=c(2006,2007,2008,2009,2010,2011,2012,2013,2014,2015))
P6GG

Topic 7

P7_1<-P7$x
P7_2<-P7$topics
P7_3<-P7$means[[1]]
P7_4<-P7$ci[[1]]
P7_4<-t(P7_4)
P7C<-as.data.frame(cbind(P7_1,P7_3,P7_4))
colnames(P7C)<-c("YEAR","Trend","LOWCI","HIGHCI")
P7ANNO<-grobTree(
  textGrob(
    "Highest Probability Words: 
     Topic 7 Top Words: experi, ident, learner, univers, engag, academ, prior ",
    x=0.1,  
    y=0.9, 
    hjust=0, 
    gp=gpar(col="black", fontsize=8)))
P7GG<-ggplot(P7C) + geom_line(aes(x=P7C$YEAR, y=P7C$Trend), color="black", size=0.5) + labs(title="Topic 7: ") + annotation_custom(P7ANNO) + ylim(-0.2, 0.7) + xlab("") + ylab("Expected Topic Proportion") + theme_hc() + scale_x_continuous(breaks=c(2006,2007,2008,2009,2010,2011,2012,2013,2014,2015))
P7GG

Topic 8

P8_1<-P8$x
P8_2<-P8$topics
P8_3<-P8$means[[1]]
P8_4<-P8$ci[[1]]
P8_4<-t(P8_4)
P8C<-as.data.frame(cbind(P8_1,P8_3,P8_4))
colnames(P8C)<-c("YEAR","Trend","LOWCI","HIGHCI")
P8ANNO<-grobTree(
  textGrob(
    "Highest Probability Words: 
     Topic 8 Top Words: educ, women, adult, social, pedagogi, articl, feminist ",
    x=0.1,  
    y=0.9, 
    hjust=0, 
    gp=gpar(col="black", fontsize=8)))
P8GG<-ggplot(P8C) + geom_line(aes(x=P8C$YEAR, y=P8C$Trend), color="black", size=0.5) + labs(title="Topic 8: ") + annotation_custom(P8ANNO) + ylim(-0.2, 0.7) + xlab("") + ylab("Expected Topic Proportion") + theme_hc() + scale_x_continuous(breaks=c(2006,2007,2008,2009,2010,2011,2012,2013,2014,2015))
P8GG

Topic 9

P9_1<-P9$x
P9_2<-P9$topics
P9_3<-P9$means[[1]]
P9_4<-P9$ci[[1]]
P9_4<-t(P9_4)
P9C<-as.data.frame(cbind(P9_1,P9_3,P9_4))
colnames(P9C)<-c("YEAR","Trend","LOWCI","HIGHCI")
P9ANNO<-grobTree(
  textGrob(
    "Highest Probability Words: 
     Topic 9 Top Words: group, teacher, taylor, educ, franci, llc, copyright ",
    x=0.1,  
    y=0.9, 
    hjust=0, 
    gp=gpar(col="black", fontsize=8)))
P9GG<-ggplot(P9C) + geom_line(aes(x=P9C$YEAR, y=P9C$Trend), color="black", size=0.5) + labs(title="Topic 9: ") + annotation_custom(P9ANNO) + ylim(-0.2, 0.7) + xlab("") + ylab("Expected Topic Proportion") + theme_hc() + scale_x_continuous(breaks=c(2006,2007,2008,2009,2010,2011,2012,2013,2014,2015))
P9GG

Topic 10

P10_1<-P10$x
P10_2<-P10$topics
P10_3<-P10$means[[1]]
P10_4<-P10$ci[[1]]
P10_4<-t(P10_4)
P10C<-as.data.frame(cbind(P10_1,P10_3,P10_4))
colnames(P10C)<-c("YEAR","Trend","LOWCI","HIGHCI")
P10ANNO<-grobTree(
  textGrob(
    "Highest Probability Words: 
     Topic 10 Top Words: learn, adult, educ, transform, theori, critic, reflect ",
    x=0.1,  
    y=0.9, 
    hjust=0, 
    gp=gpar(col="black", fontsize=8)))
P10GG<-ggplot(P10C) + geom_line(aes(x=P10C$YEAR, y=P10C$Trend), color="black", size=0.5) + labs(title="Topic 10: ") + annotation_custom(P10ANNO) + ylim(-0.2, 0.7) + xlab("") + ylab("Expected Topic Proportion") + theme_hc() + scale_x_continuous(breaks=c(2006,2007,2008,2009,2010,2011,2012,2013,2014,2015))
P10GG

Topic 11

P11_1<-P11$x
P11_2<-P11$topics
P11_3<-P11$means[[1]]
P11_4<-P11$ci[[1]]
P11_4<-t(P11_4)
P11C<-as.data.frame(cbind(P11_1,P11_3,P11_4))
colnames(P11C)<-c("YEAR","Trend","LOWCI","HIGHCI")
P11ANNO<-grobTree(
  textGrob(
    "Highest Probability Words: 
     Topic 11 Top Words: communiti, literaci, program, develop, project, adult, health ",
    x=0.1,  
    y=0.9, 
    hjust=0, 
    gp=gpar(col="black", fontsize=8)))
P11GG<-ggplot(P11C) + geom_line(aes(x=P11C$YEAR, y=P11C$Trend), color="black", size=0.5) + labs(title="Topic 11: ") + annotation_custom(P11ANNO) + ylim(-0.2, 0.7) + xlab("") + ylab("Expected Topic Proportion") + theme_hc() + scale_x_continuous(breaks=c(2006,2007,2008,2009,2010,2011,2012,2013,2014,2015))
P11GG

Topic 12

P12_1<-P12$x
P12_2<-P12$topics
P12_3<-P12$means[[1]]
P12_4<-P12$ci[[1]]
P12_4<-t(P12_4)
P12C<-as.data.frame(cbind(P12_1,P12_3,P12_4))
colnames(P12C)<-c("YEAR","Trend","LOWCI","HIGHCI")
P12ANNO<-grobTree(
  textGrob(
    "Highest Probability Words: 
     Topic 12 Top Words: educ, polici, higher, countri, adult, european, develop ",
    x=0.1,  
    y=0.9, 
    hjust=0, 
    gp=gpar(col="black", fontsize=8)))
P12GG<-ggplot(P12C) + geom_line(aes(x=P12C$YEAR, y=P12C$Trend), color="black", size=0.5) + labs(title="Topic 12: ") + annotation_custom(P12ANNO) + ylim(-0.2, 0.7) + xlab("") + ylab("Expected Topic Proportion") + theme_hc() + scale_x_continuous(breaks=c(2006,2007,2008,2009,2010,2011,2012,2013,2014,2015))
P12GG

Time Serise bundle

require(gridExtra)
grid.arrange(P1GG, P2GG, P3GG, P4GG, ncol=2)

grid.arrange(P5GG, P6GG, P7GG, P8GG, ncol=2)

grid.arrange(P9GG, P10GG, P11GG, P12GG, ncol=2)

Additional Analysis

cloud(FINALSELECTED, topic = 1, scale = c(4,.75))

mod.out.corr <- topicCorr(FINALSELECTED)
plot.topicCorr(mod.out.corr)

mod.out.corr
$posadj
      [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12]
 [1,]    1    0    0    0    0    0    0    0    0     0     0     0
 [2,]    0    1    0    0    0    0    0    0    1     1     0     0
 [3,]    0    0    1    0    0    0    0    0    0     0     0     0
 [4,]    0    0    0    1    0    0    0    0    0     0     0     0
 [5,]    0    0    0    0    1    0    0    0    0     0     0     1
 [6,]    0    0    0    0    0    1    1    0    0     0     0     0
 [7,]    0    0    0    0    0    1    1    0    0     0     0     0
 [8,]    0    0    0    0    0    0    0    1    0     0     1     0
 [9,]    0    1    0    0    0    0    0    0    1     0     0     0
[10,]    0    1    0    0    0    0    0    0    0     1     0     0
[11,]    0    0    0    0    0    0    0    1    0     0     1     0
[12,]    0    0    0    0    1    0    0    0    0     0     0     1

$poscor
      [,1]       [,2] [,3] [,4]     [,5]       [,6]       [,7]       [,8]
 [1,]    1 0.00000000    0    0 0.000000 0.00000000 0.00000000 0.00000000
 [2,]    0 1.00000000    0    0 0.000000 0.00000000 0.00000000 0.00000000
 [3,]    0 0.00000000    1    0 0.000000 0.00000000 0.00000000 0.00000000
 [4,]    0 0.00000000    0    1 0.000000 0.00000000 0.00000000 0.00000000
 [5,]    0 0.00000000    0    0 1.000000 0.00000000 0.00000000 0.00000000
 [6,]    0 0.00000000    0    0 0.000000 1.00000000 0.02209542 0.00000000
 [7,]    0 0.00000000    0    0 0.000000 0.02209542 1.00000000 0.00000000
 [8,]    0 0.00000000    0    0 0.000000 0.00000000 0.00000000 1.00000000
 [9,]    0 0.04367957    0    0 0.000000 0.00000000 0.00000000 0.00000000
[10,]    0 0.04719925    0    0 0.000000 0.00000000 0.00000000 0.00000000
[11,]    0 0.00000000    0    0 0.000000 0.00000000 0.00000000 0.01451966
[12,]    0 0.00000000    0    0 0.108178 0.00000000 0.00000000 0.00000000
            [,9]      [,10]      [,11]    [,12]
 [1,] 0.00000000 0.00000000 0.00000000 0.000000
 [2,] 0.04367957 0.04719925 0.00000000 0.000000
 [3,] 0.00000000 0.00000000 0.00000000 0.000000
 [4,] 0.00000000 0.00000000 0.00000000 0.000000
 [5,] 0.00000000 0.00000000 0.00000000 0.108178
 [6,] 0.00000000 0.00000000 0.00000000 0.000000
 [7,] 0.00000000 0.00000000 0.00000000 0.000000
 [8,] 0.00000000 0.00000000 0.01451966 0.000000
 [9,] 1.00000000 0.00000000 0.00000000 0.000000
[10,] 0.00000000 1.00000000 0.00000000 0.000000
[11,] 0.00000000 0.00000000 1.00000000 0.000000
[12,] 0.00000000 0.00000000 0.00000000 1.000000

$cor
             [,1]        [,2]        [,3]        [,4]        [,5]        [,6]
 [1,]  1.00000000  0.00000000 -0.04569822 -0.10296952 -0.13983711 -0.11581072
 [2,]  0.00000000  1.00000000 -0.03949244 -0.09343405 -0.08683209 -0.21613649
 [3,] -0.04569822 -0.03949244  1.00000000 -0.08387502 -0.05657482 -0.14884807
 [4,] -0.10296952 -0.09343405 -0.08387502  1.00000000 -0.09694895  0.00000000
 [5,] -0.13983711 -0.08683209 -0.05657482 -0.09694895  1.00000000 -0.10263174
 [6,] -0.11581072 -0.21613649 -0.14884807  0.00000000 -0.10263174  1.00000000
 [7,] -0.04881684 -0.07639733 -0.05613178 -0.10657528 -0.04982322  0.02209542
 [8,] -0.01802237 -0.02284215 -0.04792164 -0.18325683 -0.16339644 -0.13941367
 [9,] -0.10864722  0.04367957 -0.09534453 -0.04761594 -0.04358786 -0.04554520
[10,] -0.09900642  0.04719925 -0.01330170 -0.13685564 -0.17454707 -0.21934259
[11,] -0.06154146  0.00000000  0.00000000 -0.13720859 -0.06073652 -0.16264728
[12,] -0.18693187 -0.23741965 -0.13296600 -0.07298667  0.10817795 -0.08677659
             [,7]        [,8]        [,9]       [,10]       [,11]       [,12]
 [1,] -0.04881684 -0.01802237 -0.10864722 -0.09900642 -0.06154146 -0.18693187
 [2,] -0.07639733 -0.02284215  0.04367957  0.04719925  0.00000000 -0.23741965
 [3,] -0.05613178 -0.04792164 -0.09534453 -0.01330170  0.00000000 -0.13296600
 [4,] -0.10657528 -0.18325683 -0.04761594 -0.13685564 -0.13720859 -0.07298667
 [5,] -0.04982322 -0.16339644 -0.04358786 -0.17454707 -0.06073652  0.10817795
 [6,]  0.02209542 -0.13941367 -0.04554520 -0.21934259 -0.16264728 -0.08677659
 [7,]  1.00000000 -0.14511482 -0.01628195 -0.08235365 -0.10982598 -0.12538456
 [8,] -0.14511482  1.00000000 -0.16849434 -0.05346941  0.01451966 -0.15039534
 [9,] -0.01628195 -0.16849434  1.00000000 -0.10048191 -0.13660523 -0.14584662
[10,] -0.08235365 -0.05346941 -0.10048191  1.00000000 -0.12926363 -0.19871650
[11,] -0.10982598  0.01451966 -0.13660523 -0.12926363  1.00000000 -0.09708651
[12,] -0.12538456 -0.15039534 -0.14584662 -0.19871650 -0.09708651  1.00000000

attr(,"class")
[1] "topicCorr"
LS0tCnRpdGxlOiAiRGF0YSBBbmFseXNpcyBmb3IgQUVSQyBwcm9wb3NhbCIKZGF0ZTogImByIFN5cy5EYXRlKClgIgphdXRob3I6IAogIC0gIkNodW5naWwgQ2hhZSIKICAtICJTb28gSnVuZyBIYW4iCiAgLSAiU2V1bmcgSGV1biBIYW4iCiNvdXRwdXQ6IAojICBybWRmb3JtYXRzOjpyZWFkdGhlZG93bjoKIyAgICBoaWdobGlnaHQ6IGthdGUKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKIyBQcmVwYXJhdGlvbgojIyBQYWNrYWdlcyBMb2FkaW5nCmBgYHtyfQojPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKcmVxdWlyZShzdG0pCnJlcXVpcmUodG0pCnJlcXVpcmUoU25vd2JhbGxDKQpyZXF1aXJlKExEQXZpcykKcmVxdWlyZShzdG1Db3JyVml6KQpyZXF1aXJlKHN0bUJyb3dzZXIpCnJlcXVpcmUoZ2dwbG90MikKcmVxdWlyZSh0b3BpY21vZGVscykKcmVxdWlyZSh3b3JkY2xvdWQpICAgCnJlcXVpcmUocmVzaGFwZTIpICMgbWVsdCgpCnJlcXVpcmUoZ3JpZCkgIyBhcnJvdygpCnJlcXVpcmUoZ2d0aGVtZXMpCnJlcXVpcmUobHNhKQpzZXQuc2VlZCgxMjM0KQpgYGAKCiMjIERhdGEgbG9hZGluZwpgYGB7cn0KIz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIyBEYXRhIExvYWRpbmcKcmVxdWlyZShYTENvbm5lY3QpICAgICAgICAgICAgICAgIyBsb2FkIFhMQ29ubmVjdCBwYWNrYWdlIAp3ayA8LSBsb2FkV29ya2Jvb2soIi4uL0RBVEEvQUVSQ0RBVEFfLnhsc3giKSAKZGF0YSA8LSByZWFkV29ya3NoZWV0KHdrLCBzaGVldD0iREFUQSIpIApkYXRhJEtleVllc05vPC1hcy5mYWN0b3IoZGF0YSRLZXlZZXNObykKZGF0YSRBYnNZZXNObzwtYXMuZmFjdG9yKGRhdGEkQWJzWWVzTm8pCmRhdGEkSm91cm5hbEZhPC1hcy5mYWN0b3IoZGF0YSRKb3VybmFsKQpkYXRhSUQgPC0gcmVhZFdvcmtzaGVldCh3aywgc2hlZXQ9IkRBVEFJRCIpIApsb2FkKCIuLi9EQVRBL0RBVEEuUmRhdGEiKQoKYGBgCgoKIyBCYXNpYyBUZXh0IEFuYWx5c2lzCiMjIFRleHQgQ2xlYW5pbmcKCmBgYHtyfQpURVhUQkFTSUM8LSBDb3JwdXMoVmVjdG9yU291cmNlKGRhdGEkVEVYVCkpCkNPUlBVUyA8LSB0bV9tYXAoVEVYVEJBU0lDLCByZW1vdmVQdW5jdHVhdGlvbikgICAKYXMuY2hhcmFjdGVyKGluc3BlY3QoQ09SUFVTWzJdKSkKQ09SUFVTIDwtIHRtX21hcChDT1JQVVMsIHJlbW92ZU51bWJlcnMpICAgCmFzLmNoYXJhY3RlcihpbnNwZWN0KENPUlBVU1syXSkpCkNPUlBVUyA8LSB0bV9tYXAoQ09SUFVTLCB0b2xvd2VyKSAgCmFzLmNoYXJhY3RlcihpbnNwZWN0KENPUlBVU1syXSkpCkNPUlBVUyA8LSB0bV9tYXAoQ09SUFVTLCByZW1vdmVXb3Jkcywgc3RvcHdvcmRzKCJlbmdsaXNoIikpICAKYXMuY2hhcmFjdGVyKGluc3BlY3QoQ09SUFVTWzJdKSkKQ09SUFVTIDwtIHRtX21hcChDT1JQVVMsIHJlbW92ZVdvcmRzLCBzdG9wd29yZHMoIlNNQVJUIikpICAKYXMuY2hhcmFjdGVyKGluc3BlY3QoQ09SUFVTWzJdKSkKQ09SUFVTIDwtIHRtX21hcChDT1JQVVMsIHN0ZW1Eb2N1bWVudCkKYXMuY2hhcmFjdGVyKGluc3BlY3QoQ09SUFVTWzJdKSkKQ09SUFVTIDwtIHRtX21hcChDT1JQVVMsIHN0cmlwV2hpdGVzcGFjZSkgIAphcy5jaGFyYWN0ZXIoaW5zcGVjdChDT1JQVVNbMl0pKQpDT1JQVVMgPC0gdG1fbWFwKENPUlBVUywgUGxhaW5UZXh0RG9jdW1lbnQpIApDT1JQVVMgPC0gdG1fbWFwKENPUlBVUywgcmVtb3ZlV29yZHMsIGMoImFuZCIsICJmb3IiLCAidGhhdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGhpcyIsICJhcmUiLCAiaXMiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhbSIsIndpdGgiLCJ0aGVpciIsInRoZSIsImNhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZnJvbSIsImFydGljbGUiLCAic3R1ZHkiLCJyZXNlYXJjaCIsImFuYWx5c2lzIikpCgphcy5jaGFyYWN0ZXIoaW5zcGVjdChDT1JQVVNbMl0pKQoKIyAKCmBgYAoKCiMjIEJ1aWxkaW5nIENvdXJwcwpgYGB7cn0KdGRtIDwtIFRlcm1Eb2N1bWVudE1hdHJpeChDT1JQVVMpCmR0bSA8LSBEb2N1bWVudFRlcm1NYXRyaXgoQ09SUFVTKQpkaW0odGRtKQpkaW0oZHRtKQoKYGBgCgoKIyMgV29yZCBGcmVxdWVuY3kKYGBge3J9CmZyZXEgPC0gc29ydChjb2xTdW1zKGFzLm1hdHJpeChkdG0pKSwgZGVjcmVhc2luZz1UUlVFKQp3ZiA8LSBkYXRhLmZyYW1lKHdvcmQ9bmFtZXMoZnJlcSksIGZyZXE9ZnJlcSkKdGFibGUoZnJlcSkKaGVhZChmcmVxKQoKcmVxdWlyZShnZ3Bsb3QyKSAgIApwIDwtIGdncGxvdChkYXRhPXN1YnNldCh3ZiwgZnJlcT4yMDApLCBhZXMocmVvcmRlcih3b3JkLCBmcmVxKSwgZnJlcSkpICAgIApwIDwtIHAgKyBnZW9tX2JhcihzdGF0PSJpZGVudGl0eSIpICAgCnAgPC0gcCArIHRoZW1lKGF4aXMudGV4dC54PWVsZW1lbnRfdGV4dChhbmdsZT00NSwgaGp1c3Q9MSkpICAgCnAgCgpgYGAKCgojIyBjcmVhdGluZyB0ZXJtIG1hdHJpeCB3aXRoIFRGLUlERiB3ZWlnaHRpbmcKYGBge3J9CnRlcm1zX3RkX2lkZiA8LURvY3VtZW50VGVybU1hdHJpeChDT1JQVVMsIGNvbnRyb2wgPSBsaXN0KHdlaWdodGluZyA9IGZ1bmN0aW9uKHgpIHdlaWdodFRmSWRmKHgsIG5vcm1hbGl6ZSA9IEZBTFNFKSkpCnRlcm1zX3RkX2lkZgoKYGBgCgoKCiMjIFRleHQgTmV0d29yayB3aXRoIHRmLWlkZiBzaW1pbGFyaXR5CmBgYHtyfQp0ZC5tYXQgPC0gYXMubWF0cml4KFRlcm1Eb2N1bWVudE1hdHJpeChDT1JQVVMpKQp0ZC5tYXQubHNhIDwtIGx3X2JpbnRmKHRkLm1hdCkgKiBnd19pZGYodGQubWF0KSAjIHdlaWdodGluZwpsc2FTcGFjZSA8LSBsc2EodGQubWF0LmxzYSkgIyBjcmVhdGUgTFNBIHNwYWNlCmRpc3QubWF0LmxzYSA8LSBkaXN0KHQoYXMudGV4dG1hdHJpeChsc2FTcGFjZSkpKSAjIGNvbXB1dGUgZGlzdGFuY2UgbWF0cml4CgpgYGAKCgojIE1EUwpgYGB7cn0KZml0IDwtIGNtZHNjYWxlKGRpc3QubWF0LmxzYSwgZWlnPVRSVUUsIGs9MikKcG9pbnRzIDwtIGRhdGEuZnJhbWUoeD1maXQkcG9pbnRzWywgMV0sIHk9Zml0JHBvaW50c1ssIDJdKQpwb2ludHMkRG9jSUQ8LWRhdGFJRCROTwpxcGxvdCh4LCB5LCBkYXRhID0gcG9pbnRzLCBnZW9tID0gInBvaW50IiwgYWxwaGEgPSBJKDEvNSkpCnBsb3QocG9pbnRzJHgscG9pbnRzJHkpCnRleHQocG9pbnRzJHgscG9pbnRzJHksIHBvaW50cyREb2NJRCAsY2V4PTAuNiwgcG9zPTQsIGNvbD0icmVkIikKCgpsaWJyYXJ5KHNjYXR0ZXJwbG90M2QpCmZpdCA8LSBjbWRzY2FsZShkaXN0Lm1hdC5sc2EsIGVpZyA9IFRSVUUsIGsgPSAzKQpjb2xvcnMgPC0gcmVwKGMoImJsdWUiLCAiZ3JlZW4iLCAicmVkIiksIGVhY2ggPSAzKQpzY2F0dGVycGxvdDNkKGZpdCRwb2ludHNbLCAxXSwgZml0JHBvaW50c1ssIDJdLCBmaXQkcG9pbnRzWywgM10sCiAgICAgICAgICAgICAgcGNoID0gMTYsIG1haW4gPSAiU2VtYW50aWMgU3BhY2UgU2NhbGVkIHRvIDNEIiwgCiAgICAgICAgICAgICAgeGxhYiA9ICJ4IiwgeWxhYiA9ICJ5IiwKICAgICAgICAgICAgICB6bGFiID0gInoiLCB0eXBlID0gImgiCiAgICAgICAgICAgICAgKQoKYGBgCgoKCgojIExEQSAtIFNUTSBUb3BpYyBNb2RlbGluZwojIyBzdGVtbWluZy9zdG9wd29yZCByZW1vdmFsLCBldGMuCmBgYHtyfQpkYXRhJFRFWFQgPC0gZ3N1YigiW15bOmFsbnVtOl0vLy8nIF0iLCAiIiwgZGF0YSRURVhUKQpwcm9jZXNzZWQgPC0gdGV4dFByb2Nlc3NvcihkYXRhJFRFWFQsIG1ldGFkYXRhID0gZGF0YSkKCmBgYAoKCgojIyBzdHJ1Y3R1cmUgYW5kIGluZGV4IGZvciB1c2FnZSBpbiB0aGUgc3RtIG1vZGVsLiBWZXJpZnkgbm8tbWlzc2luZ25lc3MuCmBgYHtyfQpwcmVwIDwtIHByZXBEb2N1bWVudHMocHJvY2Vzc2VkJGRvY3VtZW50cywgcHJvY2Vzc2VkJHZvY2FiLCBwcm9jZXNzZWQkbWV0YSkKCmBgYAoKCiMjIG91dHB1dCB3aWxsIGhhdmUgb2JqZWN0IG1ldGEsIGRvY3VtZW50cywgYW5kIHZvY2FiCmBgYHtyfQpkb2NzIDwtIG91dCRkb2N1bWVudHMKdm9jYWIgPC0gb3V0JHZvY2FiCm1ldGEgIDwtb3V0JG1ldGEKCnBsb3RSZW1vdmVkKHByb2Nlc3NlZCRkb2N1bWVudHMsIGxvd2VyLnRocmVzaCA9IHNlcSgxLCAxMDAwLCBieSA9IDEwKSkKCiNwcmVwIDwtIHByZXBEb2N1bWVudHMocHJvY2Vzc2VkJGRvY3VtZW50cywgcHJvY2Vzc2VkJHZvY2FiLHByb2Nlc3NlZCRtZXRhLCAKIyAgICAgICAgICAgICAgICAgICAgICBsb3dlci50aHJlc2ggPSAxLCAKIyAgICAgICAgICAgICAgICAgICAgICB1cHBlci50aHJlc2g9IDQwMCkKI3Bsb3RSZW1vdmVkKHByZXAkZG9jdW1lbnRzLCBsb3dlci50aHJlc2ggPSBzZXEoMSwgMTAwMCwgYnkgPSAxMCkpCmBgYAoKCiMjIFRvcGljIE1vZGVsIEV2YWx1YXRpb24gZm9yIHNlYXJjaCBLCmBgYHtyfQpoZWxkb3V0IDwtIG1ha2UuaGVsZG91dChwcmVwJGRvY3VtZW50cywgcHJlcCR2b2NhYikKZG9jdW1lbnRzIDwtIGhlbGRvdXQkZG9jdW1lbnRzCnZvY2FiIDwtIGhlbGRvdXQkdm9jYQoKSzwtYygyOjUwKQojTU9ERUxTIDwtIHNlYXJjaEsoZG9jdW1lbnRzLCB2b2NhYiwgSywgc2VlZCA9IDg0NTgxNTkpCgoKcGxvdC5zZWFyY2hLKE1PREVMUykKCnBhcihtZnJvdz1jKDIsMikpCnFwbG90KE1PREVMUyRyZXN1bHRzJEssIE1PREVMUyRyZXN1bHRzJGV4Y2x1cywgZ2VvbT1jKCJwb2ludCIsICJzbW9vdGgiKSkKcXBsb3QoTU9ERUxTJHJlc3VsdHMkSywgTU9ERUxTJHJlc3VsdHMkaGVsZG91dCwgZ2VvbT1jKCJwb2ludCIsICJzbW9vdGgiKSkKcXBsb3QoTU9ERUxTJHJlc3VsdHMkSywgTU9ERUxTJHJlc3VsdHMkc2VtY29oLCBnZW9tPWMoInBvaW50IiwgInNtb290aCIpKQpxcGxvdChNT0RFTFMkcmVzdWx0cyRLLCBNT0RFTFMkcmVzdWx0cyRlbS5pdHMsIGdlb209YygicG9pbnQiLCAic21vb3RoIikpCnBhcihtZnJvdz1jKDEsMSkpCgpLUkFOS19oZWxkb3V0PC1hcy5kYXRhLmZyYW1lKGNiaW5kKE1PREVMUyRyZXN1bHRzJEssTU9ERUxTJHJlc3VsdHMkaGVsZG91dCkpCktSQU5LX3NlbWNvaDwtYXMuZGF0YS5mcmFtZShjYmluZChNT0RFTFMkcmVzdWx0cyRLLE1PREVMUyRyZXN1bHRzJHNlbWNvaCkpCktSQU5LX2hlbGRvdXQKS1JBTktfc2VtY29oCgojU0VMTU9ERUwgPC0gc2VsZWN0TW9kZWwob3V0JGRvY3VtZW50cywgb3V0JHZvY2FiLCBLID0gMTIsCiMgICAgICAgICAgICAgICAgICAgICAgICBwcmV2YWxlbmNlID1+IEpvdXJuYWxGYSArIHMoWWVhciksCiMgICAgICAgICAgICAgICAgICAgICAgICBtYXguZW0uaXRzID0gMTAwLAojICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IG91dCRtZXRhLCBydW5zID0gMzAsIAojICAgICAgICAgICAgICAgICAgICAgICAgc2VlZCA9IDg0NTgxNTkpClNFTE1PREVMCnBsb3RNb2RlbHMoU0VMTU9ERUwpCgoKTVMxIDwtIFNFTE1PREVMJHJ1bm91dFtbMV1dCnRvcGljUXVhbGl0eShtb2RlbD1NUzEsIGRvY3VtZW50cz1kb2NzKQpNUzFfZXZhbGhlbGRvdXQ8LWV2YWwuaGVsZG91dChNUzEsIGhlbGRvdXQkbWlzc2luZykKaGlzdChNUzFfZXZhbGhlbGRvdXQkZG9jLmhlbGRvdXQpCk1TMV9ldmFsaGVsZG91dAoKTVMyIDwtIFNFTE1PREVMJHJ1bm91dFtbMl1dCnRvcGljUXVhbGl0eShtb2RlbD1NUzIsIGRvY3VtZW50cz1kb2NzKQpNUzJfZXZhbGhlbGRvdXQ8LWV2YWwuaGVsZG91dChNUzIsIGhlbGRvdXQkbWlzc2luZykKaGlzdChNUzJfZXZhbGhlbGRvdXQkZG9jLmhlbGRvdXQpCk1TMl9ldmFsaGVsZG91dAoKTVMzIDwtIFNFTE1PREVMJHJ1bm91dFtbM11dCnRvcGljUXVhbGl0eShtb2RlbD1NUzMsIGRvY3VtZW50cz1kb2NzKQpNUzNfZXZhbGhlbGRvdXQ8LWV2YWwuaGVsZG91dChNUzMsIGhlbGRvdXQkbWlzc2luZykKaGlzdChNUzNfZXZhbGhlbGRvdXQkZG9jLmhlbGRvdXQpCk1TM19ldmFsaGVsZG91dAoKTVM0IDwtIFNFTE1PREVMJHJ1bm91dFtbNF1dCnRvcGljUXVhbGl0eShtb2RlbD1NUzQsIGRvY3VtZW50cz1kb2NzKQpNUzRfZXZhbGhlbGRvdXQ8LWV2YWwuaGVsZG91dChNUzQsIGhlbGRvdXQkbWlzc2luZykKaGlzdChNUzRfZXZhbGhlbGRvdXQkZG9jLmhlbGRvdXQpCk1TNF9ldmFsaGVsZG91dAoKTVM1IDwtIFNFTE1PREVMJHJ1bm91dFtbNV1dCnRvcGljUXVhbGl0eShtb2RlbD1NUzUsIGRvY3VtZW50cz1kb2NzKQpNUzVfZXZhbGhlbGRvdXQ8LWV2YWwuaGVsZG91dChNUzUsIGhlbGRvdXQkbWlzc2luZykKaGlzdChNUzVfZXZhbGhlbGRvdXQkZG9jLmhlbGRvdXQpCk1TNV9ldmFsaGVsZG91dAoKTVM2IDwtIFNFTE1PREVMJHJ1bm91dFtbNl1dCnRvcGljUXVhbGl0eShtb2RlbD1NUzYsIGRvY3VtZW50cz1kb2NzKQpNUzZfZXZhbGhlbGRvdXQ8LWV2YWwuaGVsZG91dChNUzYsIGhlbGRvdXQkbWlzc2luZykKaGlzdChNUzZfZXZhbGhlbGRvdXQkZG9jLmhlbGRvdXQpCk1TNl9ldmFsaGVsZG91dAoKCkZJTkFMU0VMRUNURUQgPC0gU0VMTU9ERUwkcnVub3V0W1s0XV0KdG9waWNRdWFsaXR5KG1vZGVsPUZJTkFMU0VMRUNURUQsIGRvY3VtZW50cz1kb2NzKQpldmFsaGVsZG91dDwtZXZhbC5oZWxkb3V0KEZJTkFMU0VMRUNURUQsIGhlbGRvdXQkbWlzc2luZykKaGlzdChldmFsaGVsZG91dCRkb2MuaGVsZG91dCkKZXZhbGhlbGRvdXQKCiNzYXZlKE1PREVMUywgU0VMTU9ERUwsIEZJTkFMU0VMRUNURUQsIGZpbGUgPSAiLi9EQVRBL0RBVEEuUmRhdGEiKQoKYGBgCgoKCgojIFRvcGljIE1vZGVsIERlc2NyaXB0aW9uCiMjIEJhc2ljIFJlc3VsdApgYGB7cn0KIz09PT0gU3VtbWFyeQojIyBMYWJlbCBUb3BpY3MKbGFiZWxUb3BpY3MoRklOQUxTRUxFQ1RFRCkKCgojIyBFc3RpbWF0aW5nIEVmZmVjdApwcmVwZWZmZWN0IDwtIGVzdGltYXRlRWZmZWN0KDE6MTIgfiBKb3VybmFsRmEgKyBzKFllYXIpLCBGSU5BTFNFTEVDVEVELCBtZXRhID0gb3V0JG1ldGEsIHVuY2VydGFpbnR5ID0gIkdsb2JhbCIpCgpgYGAKCiMjIFN1bW1hcnkKYGBge3J9CiM9PT09IFN1bW1hcnkKcGxvdC5TVE0oRklOQUxTRUxFQ1RFRCwgdHlwZSA9ICJzdW1tYXJ5IikKcGxvdC5TVE0oRklOQUxTRUxFQ1RFRCwgdHlwZSA9ICJsYWJlbHMiLCB0b3BpY3MgPSBjKDEsMiwzKSkKcGxvdC5TVE0oRklOQUxTRUxFQ1RFRCwgdHlwZSA9ICJsYWJlbHMiLCB0b3BpY3MgPSBjKDQsNSw2KSkKcGxvdC5TVE0oRklOQUxTRUxFQ1RFRCwgdHlwZSA9ICJsYWJlbHMiLCB0b3BpY3MgPSBjKDcsOCw5KSkKcGxvdC5TVE0oRklOQUxTRUxFQ1RFRCwgdHlwZSA9ICJsYWJlbHMiLCB0b3BpY3MgPSBjKDEwLDExLDEyKSkKcGxvdC5TVE0oRklOQUxTRUxFQ1RFRCwgdHlwZSA9ICJoaXN0IiwgdG9waWNzID0gYygxLDIsMyw0KSkKcGxvdC5TVE0oRklOQUxTRUxFQ1RFRCwgdHlwZSA9ICJoaXN0IiwgdG9waWNzID0gYyg1LDYsNyw4KSkKcGxvdC5TVE0oRklOQUxTRUxFQ1RFRCwgdHlwZSA9ICJoaXN0IiwgdG9waWNzID0gYyg5LDEwLDExLDEyKSkKYGBgCgojIyBTdW1tYXJ5IC0gUGVyc3BlY3RpdmUKYGBge3J9CiM9PT09IFN1bW1hcnkKcGxvdC5TVE0oRklOQUxTRUxFQ1RFRCwgdHlwZSA9ICJwZXJzcGVjdGl2ZXMiLCB0b3BpY3MgPSBjKDEwLCA0KSkKcGxvdC5TVE0oRklOQUxTRUxFQ1RFRCwgdHlwZSA9ICJwZXJzcGVjdGl2ZXMiLCB0b3BpY3MgPSBjKDEwLCA1KSkKcGxvdC5TVE0oRklOQUxTRUxFQ1RFRCwgdHlwZSA9ICJwZXJzcGVjdGl2ZXMiLCB0b3BpY3MgPSBjKDEwLCAxMikpCnBsb3QuU1RNKEZJTkFMU0VMRUNURUQsIHR5cGUgPSAicGVyc3BlY3RpdmVzIiwgdG9waWNzID0gYygxMCwgOSkpCgpgYGAKCiMjIFRvcGljIGFuZCBEb2N1bWVudHMKYGBge3J9CnRob3VnaHRzMSA8LSBmaW5kVGhvdWdodHMoRklOQUxTRUxFQ1RFRCwgdGV4dHMgPSBtZXRhJFRpdGxlLCBuID0gNSwgdG9waWNzID0xICkkZG9jc1tbMV1dCnRob3VnaHRzMQoKdGhvdWdodHMyIDwtIGZpbmRUaG91Z2h0cyhGSU5BTFNFTEVDVEVELCB0ZXh0cyA9IG1ldGEkVGl0bGUsIG4gPSA1LCB0b3BpY3MgPTIgKSRkb2NzW1sxXV0KdGhvdWdodHMyCgp0aG91Z2h0czMgPC0gZmluZFRob3VnaHRzKEZJTkFMU0VMRUNURUQsIHRleHRzID0gbWV0YSRUaXRsZSwgbiA9IDUsIHRvcGljcyA9MyApJGRvY3NbWzFdXQp0aG91Z2h0czMKCnRob3VnaHRzNCA8LSBmaW5kVGhvdWdodHMoRklOQUxTRUxFQ1RFRCwgdGV4dHMgPSBtZXRhJFRpdGxlLCBuID0gNSwgdG9waWNzID00ICkkZG9jc1tbMV1dCnRob3VnaHRzNAoKdGhvdWdodHM1IDwtIGZpbmRUaG91Z2h0cyhGSU5BTFNFTEVDVEVELCB0ZXh0cyA9IG1ldGEkVGl0bGUsIG4gPSA1LCB0b3BpY3MgPTUgKSRkb2NzW1sxXV0KdGhvdWdodHM1Cgp0aG91Z2h0czYgPC0gZmluZFRob3VnaHRzKEZJTkFMU0VMRUNURUQsIHRleHRzID0gbWV0YSRUaXRsZSwgbiA9IDUsIHRvcGljcyA9NiApJGRvY3NbWzFdXQp0aG91Z2h0czYKCnRob3VnaHRzNyA8LSBmaW5kVGhvdWdodHMoRklOQUxTRUxFQ1RFRCwgdGV4dHMgPSBtZXRhJFRpdGxlLCBuID0gNSwgdG9waWNzID03ICkkZG9jc1tbMV1dCnRob3VnaHRzNwoKdGhvdWdodHM4IDwtIGZpbmRUaG91Z2h0cyhGSU5BTFNFTEVDVEVELCB0ZXh0cyA9IG1ldGEkVGl0bGUsIG4gPSA1LCB0b3BpY3MgPTggKSRkb2NzW1sxXV0KdGhvdWdodHM4Cgp0aG91Z2h0czkgPC0gZmluZFRob3VnaHRzKEZJTkFMU0VMRUNURUQsIHRleHRzID0gbWV0YSRUaXRsZSwgbiA9IDUsIHRvcGljcyA9OSApJGRvY3NbWzFdXQp0aG91Z2h0czkKCnRob3VnaHRzMTAgPC0gZmluZFRob3VnaHRzKEZJTkFMU0VMRUNURUQsIHRleHRzID0gbWV0YSRUaXRsZSwgbiA9IDUsIHRvcGljcyA9MTAgKSRkb2NzW1sxXV0KdGhvdWdodHMxMAoKdGhvdWdodHMxMSA8LSBmaW5kVGhvdWdodHMoRklOQUxTRUxFQ1RFRCwgdGV4dHMgPSBtZXRhJFRpdGxlLCBuID0gNSwgdG9waWNzID0xMSApJGRvY3NbWzFdXQp0aG91Z2h0czExCgp0aG91Z2h0czEyIDwtIGZpbmRUaG91Z2h0cyhGSU5BTFNFTEVDVEVELCB0ZXh0cyA9IG1ldGEkVGl0bGUsIG4gPSA1LCB0b3BpY3MgPTEyICkkZG9jc1tbMV1dCnRob3VnaHRzMTIKCmBgYAoKCgoKCgojIyBQb2ludGVzdGltYXRlIG9mIG1lYW4gb2YgdG9waWMgaW4gZm91ciBkaWZmZWVudApgYGB7cn0KcGFyKG1mcm93PWMoMiwyKSkKcGxvdC5lc3RpbWF0ZUVmZmVjdChwcmVwZWZmZWN0LCBjb3ZhcmlhdGUgPSAiSm91cm5hbEZhIiwgdG9waWNzID0gMTAsCiAgICAgICAgICAgICAgICAgICAgbW9kZWwgPSBGSU5BTFNFTEVDVEVELCBtZXRob2QgPSAicG9pbnRlc3RpbWF0ZSIsCiAgICAgICAgICAgICAgICAgICAgeGxhYiA9ICJFeHBlY3RlZCBQcm9wb3J0aW9uIiwKICAgICAgICAgICAgICAgICAgICBtYWluID0gIlRPUElDIDEwIChBZHVsdCBFZHVjYXRpb24pIiwKICAgICAgICAgICAgICAgICAgICB4bGltID0gYygtLjAyLCAuMyksIAogICAgICAgICAgICAgICAgICAgIGxhYmVsdHlwZSA9ICJjdXN0b20iLAogICAgICAgICAgICAgICAgICAgIGN1c3RvbS5sYWJlbHMgPSBjKAogICAgICAgICAgICAgICAgICAgICAgJ0FFUScsICdJSkxFJykpCgpwbG90LmVzdGltYXRlRWZmZWN0KHByZXBlZmZlY3QsIGNvdmFyaWF0ZSA9ICJKb3VybmFsRmEiLCB0b3BpY3MgPSA1LAogICAgICAgICAgICAgICAgICAgIG1vZGVsID0gRklOQUxTRUxFQ1RFRCwgbWV0aG9kID0gInBvaW50ZXN0aW1hdGUiLAogICAgICAgICAgICAgICAgICAgIHhsYWIgPSAiRXhwZWN0ZWQgUHJvcG9ydGlvbiIsCiAgICAgICAgICAgICAgICAgICAgbWFpbiA9ICJUT1BJQyA1IChMaWZlbG9uZyBFZHVjdGlvbikiLAogICAgICAgICAgICAgICAgICAgIHhsaW0gPSBjKC0uMDIsIC4xOCksIAogICAgICAgICAgICAgICAgICAgIGxhYmVsdHlwZSA9ICJjdXN0b20iLAogICAgICAgICAgICAgICAgICAgIGN1c3RvbS5sYWJlbHMgPSBjKAogICAgICAgICAgICAgICAgICAgICAgJ0FFUScsICdJSkxFJykpCgpwbG90LmVzdGltYXRlRWZmZWN0KHByZXBlZmZlY3QsIGNvdmFyaWF0ZSA9ICJKb3VybmFsRmEiLCB0b3BpY3MgPSA0LAogICAgICAgICAgICAgICAgICAgIG1vZGVsID0gRklOQUxTRUxFQ1RFRCwgbWV0aG9kID0gInBvaW50ZXN0aW1hdGUiLAogICAgICAgICAgICAgICAgICAgIHhsYWIgPSAiRXhwZWN0ZWQgUHJvcG9ydGlvbiIsCiAgICAgICAgICAgICAgICAgICAgbWFpbiA9ICJUT1BJQyA0IChIUkQsIFdvcmtwbGFjZSkiLAogICAgICAgICAgICAgICAgICAgIHhsaW0gPSBjKC0uMDIsIC4xOCksIAogICAgICAgICAgICAgICAgICAgIGxhYmVsdHlwZSA9ICJjdXN0b20iLAogICAgICAgICAgICAgICAgICAgIGN1c3RvbS5sYWJlbHMgPSBjKAogICAgICAgICAgICAgICAgICAgICAgJ0FFUScsICdJSkxFJykpCgoKcGxvdC5lc3RpbWF0ZUVmZmVjdChwcmVwZWZmZWN0LCBjb3ZhcmlhdGUgPSAiSm91cm5hbEZhIiwgdG9waWNzID0gNiwKICAgICAgICAgICAgICAgICAgICBtb2RlbCA9IEZJTkFMU0VMRUNURUQsIG1ldGhvZCA9ICJwb2ludGVzdGltYXRlIiwKICAgICAgICAgICAgICAgICAgICB4bGFiID0gIkV4cGVjdGVkIFByb3BvcnRpb24iLAogICAgICAgICAgICAgICAgICAgIG1haW4gPSAiVE9QSUMgMiAoKSIsCiAgICAgICAgICAgICAgICAgICAgeGxpbSA9IGMoLS4wMiwgLjE4KSwgCiAgICAgICAgICAgICAgICAgICAgbGFiZWx0eXBlID0gImN1c3RvbSIsCiAgICAgICAgICAgICAgICAgICAgY3VzdG9tLmxhYmVscyA9IGMoCiAgICAgICAgICAgICAgICAgICAgICAnQUVRJywgJ0lKTEUnKSkKCgpwYXIobWZyb3c9YygxLDEpKQpgYGAKCiMgVGltZSBUcmVuZCBQbG90IHdpdGggZ2VudWluZSBwbG90CmBgYHtyfQpwYXIobWZyb3c9YygzLDIpKQpQMTwtcGxvdC5lc3RpbWF0ZUVmZmVjdChwcmVwZWZmZWN0LCAKICAgICAgICAgICAgICAgICAgICAgICAgY292YXJpYXRlID0gIlllYXIiLAogICAgICAgICAgICAgICAgICAgICAgICB0b3BpY3MgPSAxLAogICAgICAgICAgICAgICAgICAgICAgICBtb2RlbCA9IEZJTkFMU0VMRUNURUQsCiAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZCA9ICJjb250aW51b3VzIiwgCiAgICAgICAgICAgICAgICAgICAgICAgIHlsaW0gPSBjKDAsIC40KSwKICAgICAgICAgICAgICAgICAgICAgICAgbGluZWNvbCA9ICJibHVlIiwgCiAgICAgICAgICAgICAgICAgICAgICAgIHByaW50bGVnZW5kID0gRiwgCiAgICAgICAgICAgICAgICAgICAgICAgIG1haW4gPSAiIFRvcGljMSAgKCkgXG4gbGVhcm4sIHNwYWNlLCBpbmZvcm0sIGV4cGVyaSwgZ3JvdXAsIHBlb3BsLCB3YXkgIikKClAyPC1wbG90LmVzdGltYXRlRWZmZWN0KHByZXBlZmZlY3QsIAogICAgICAgICAgICAgICAgICAgICAgICBjb3ZhcmlhdGUgPSAiWWVhciIsCiAgICAgICAgICAgICAgICAgICAgICAgIHRvcGljcyA9IDIsCiAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsID0gRklOQUxTRUxFQ1RFRCwKICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kID0gImNvbnRpbnVvdXMiLCAKICAgICAgICAgICAgICAgICAgICAgICAgeWxpbSA9IGMoMCwgLjQpLAogICAgICAgICAgICAgICAgICAgICAgICBsaW5lY29sID0gImJsdWUiLCAKICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRsZWdlbmQgPSBGLCAKICAgICAgICAgICAgICAgICAgICAgICAgbWFpbiA9ICIgVG9waWMyICAoKSBcbiByZXNlYXJjaCwgcHJhY3RpYywgcHJvY2Vzcywga25vd2xlZGcsIGNoYW5nLCBjb250ZXh0LCB3b3JrICIpCgpQMzwtcGxvdC5lc3RpbWF0ZUVmZmVjdChwcmVwZWZmZWN0LCAKICAgICAgICAgICAgICAgICAgICAgICAgY292YXJpYXRlID0gIlllYXIiLAogICAgICAgICAgICAgICAgICAgICAgICB0b3BpY3MgPSAzLAogICAgICAgICAgICAgICAgICAgICAgICBtb2RlbCA9IEZJTkFMU0VMRUNURUQsCiAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZCA9ICJjb250aW51b3VzIiwgCiAgICAgICAgICAgICAgICAgICAgICAgIHlsaW0gPSBjKDAsIC40KSwKICAgICAgICAgICAgICAgICAgICAgICAgbGluZWNvbCA9ICJibHVlIiwgCiAgICAgICAgICAgICAgICAgICAgICAgIHByaW50bGVnZW5kID0gRiwgCiAgICAgICAgICAgICAgICAgICAgICAgIG1haW4gPSAiIFRvcGljMyAgKCkgXG4gbGVhcm4sIGN1bHR1ciwgcHJvZ3JhbW0sIGxhbmd1YWcsIGFydCwgYWZyaWNhbiwgcmVwb3J0ICIpCgpQNDwtcGxvdC5lc3RpbWF0ZUVmZmVjdChwcmVwZWZmZWN0LCAKICAgICAgICAgICAgICAgICAgICAgICAgY292YXJpYXRlID0gIlllYXIiLAogICAgICAgICAgICAgICAgICAgICAgICB0b3BpY3MgPSA0LAogICAgICAgICAgICAgICAgICAgICAgICBtb2RlbCA9IEZJTkFMU0VMRUNURUQsCiAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZCA9ICJjb250aW51b3VzIiwgCiAgICAgICAgICAgICAgICAgICAgICAgIHlsaW0gPSBjKDAsIC40KSwKICAgICAgICAgICAgICAgICAgICAgICAgbGluZWNvbCA9ICJibHVlIiwgCiAgICAgICAgICAgICAgICAgICAgICAgIHByaW50bGVnZW5kID0gRiwgCiAgICAgICAgICAgICAgICAgICAgICAgIG1haW4gPSAiIFRvcGljNCAgKCkgXG4gbGVhcm4sIHRyYWluLCBza2lsbCwgZGV2ZWxvcCwgd29ya3BsYWMsIGNhcmVlciwgZW1wbG95ICIpCgpQNTwtcGxvdC5lc3RpbWF0ZUVmZmVjdChwcmVwZWZmZWN0LCAKICAgICAgICAgICAgICAgICAgICAgICAgY292YXJpYXRlID0gIlllYXIiLAogICAgICAgICAgICAgICAgICAgICAgICB0b3BpY3MgPSA1LAogICAgICAgICAgICAgICAgICAgICAgICBtb2RlbCA9IEZJTkFMU0VMRUNURUQsCiAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZCA9ICJjb250aW51b3VzIiwgCiAgICAgICAgICAgICAgICAgICAgICAgIHlsaW0gPSBjKDAsIC40KSwKICAgICAgICAgICAgICAgICAgICAgICAgbGluZWNvbCA9ICJibHVlIiwgCiAgICAgICAgICAgICAgICAgICAgICAgIHByaW50bGVnZW5kID0gRiwgCiAgICAgICAgICAgICAgICAgICAgICAgIG1haW4gPSAiIFRvcGljNSAgKCkgXG4gbGVhcm4sIGxpZmVsb25nLCBzb2NpYWwsIGNhcGl0LCBpbW1pZ3IsIGRldmVsb3AiKQoKUDY8LXBsb3QuZXN0aW1hdGVFZmZlY3QocHJlcGVmZmVjdCwgCiAgICAgICAgICAgICAgICAgICAgICAgIGNvdmFyaWF0ZSA9ICJZZWFyIiwKICAgICAgICAgICAgICAgICAgICAgICAgdG9waWNzID0gNiwKICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWwgPSBGSU5BTFNFTEVDVEVELAogICAgICAgICAgICAgICAgICAgICAgICBtZXRob2QgPSAiY29udGludW91cyIsIAogICAgICAgICAgICAgICAgICAgICAgICB5bGltID0gYygwLCAuNCksCiAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVjb2wgPSAiYmx1ZSIsIAogICAgICAgICAgICAgICAgICAgICAgICBwcmludGxlZ2VuZCA9IEYsIAogICAgICAgICAgICAgICAgICAgICAgICBtYWluID0gIiBUb3BpYzYgICgpIFxuIGVkdWMsIGFkdWx0LCBzdHVkZW50LCBwYXJ0aWNpcCwgbGVhcm5lciwgYWdlLCB0cmFuc2l0ICIpCgpwYXIobWZyb3c9YygxLDEpKQoKcGFyKG1mcm93PWMoMywyKSkKUDc8LXBsb3QuZXN0aW1hdGVFZmZlY3QocHJlcGVmZmVjdCwgCiAgICAgICAgICAgICAgICAgICAgICAgIGNvdmFyaWF0ZSA9ICJZZWFyIiwKICAgICAgICAgICAgICAgICAgICAgICAgdG9waWNzID0gNywKICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWwgPSBGSU5BTFNFTEVDVEVELAogICAgICAgICAgICAgICAgICAgICAgICBtZXRob2QgPSAiY29udGludW91cyIsIAogICAgICAgICAgICAgICAgICAgICAgICB5bGltID0gYygwLCAuNCksCiAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVjb2wgPSAiYmx1ZSIsIAogICAgICAgICAgICAgICAgICAgICAgICBwcmludGxlZ2VuZCA9IEYsIAogICAgICAgICAgICAgICAgICAgICAgICBtYWluID0gIiBUb3BpYzcgICgpIFxuIGV4cGVyaSwgaWRlbnQsIGxlYXJuZXIsIHVuaXZlcnMsIGVuZ2FnLCBhY2FkZW0sIHByaW9yICIpCgpQODwtcGxvdC5lc3RpbWF0ZUVmZmVjdChwcmVwZWZmZWN0LCAKICAgICAgICAgICAgICAgICAgICAgICAgY292YXJpYXRlID0gIlllYXIiLAogICAgICAgICAgICAgICAgICAgICAgICB0b3BpY3MgPSA4LAogICAgICAgICAgICAgICAgICAgICAgICBtb2RlbCA9IEZJTkFMU0VMRUNURUQsCiAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZCA9ICJjb250aW51b3VzIiwgCiAgICAgICAgICAgICAgICAgICAgICAgIHlsaW0gPSBjKDAsIC40KSwKICAgICAgICAgICAgICAgICAgICAgICAgbGluZWNvbCA9ICJibHVlIiwgCiAgICAgICAgICAgICAgICAgICAgICAgIHByaW50bGVnZW5kID0gRiwgCiAgICAgICAgICAgICAgICAgICAgICAgIG1haW4gPSAiIFRvcGljOCAgKCkgXG4gZWR1Yywgd29tZW4sIGFkdWx0LCBzb2NpYWwsIHBlZGFnb2dpLCBhcnRpY2wsIGZlbWluaXN0ICIpCgpQOTwtcGxvdC5lc3RpbWF0ZUVmZmVjdChwcmVwZWZmZWN0LCAKICAgICAgICAgICAgICAgICAgICAgICAgY292YXJpYXRlID0gIlllYXIiLAogICAgICAgICAgICAgICAgICAgICAgICB0b3BpY3MgPSA5LAogICAgICAgICAgICAgICAgICAgICAgICBtb2RlbCA9IEZJTkFMU0VMRUNURUQsCiAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZCA9ICJjb250aW51b3VzIiwgCiAgICAgICAgICAgICAgICAgICAgICAgIHlsaW0gPSBjKDAsIC40KSwKICAgICAgICAgICAgICAgICAgICAgICAgbGluZWNvbCA9ICJibHVlIiwgCiAgICAgICAgICAgICAgICAgICAgICAgIHByaW50bGVnZW5kID0gRiwgCiAgICAgICAgICAgICAgICAgICAgICAgIG1haW4gPSAiIFRvcGljOSAgKCkgXG4gZ3JvdXAsIHRlYWNoZXIsIHRheWxvciwgZWR1YywgZnJhbmNpLCBsbGMsIGNvcHlyaWdodCAiKQoKUDEwPC1wbG90LmVzdGltYXRlRWZmZWN0KHByZXBlZmZlY3QsIAogICAgICAgICAgICAgICAgICAgICAgICBjb3ZhcmlhdGUgPSAiWWVhciIsCiAgICAgICAgICAgICAgICAgICAgICAgIHRvcGljcyA9IDEwLAogICAgICAgICAgICAgICAgICAgICAgICBtb2RlbCA9IEZJTkFMU0VMRUNURUQsCiAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZCA9ICJjb250aW51b3VzIiwgCiAgICAgICAgICAgICAgICAgICAgICAgIHlsaW0gPSBjKDAsIC40KSwKICAgICAgICAgICAgICAgICAgICAgICAgbGluZWNvbCA9ICJibHVlIiwgCiAgICAgICAgICAgICAgICAgICAgICAgIHByaW50bGVnZW5kID0gRiwgCiAgICAgICAgICAgICAgICAgICAgICAgIG1haW4gPSAiIFRvcGljMTAgICgpIFxuIGxlYXJuLCBhZHVsdCwgZWR1YywgdHJhbnNmb3JtLCB0aGVvcmksIGNyaXRpYywgcmVmbGVjdCAiKQoKUDExPC1wbG90LmVzdGltYXRlRWZmZWN0KHByZXBlZmZlY3QsIAogICAgICAgICAgICAgICAgICAgICAgICBjb3ZhcmlhdGUgPSAiWWVhciIsCiAgICAgICAgICAgICAgICAgICAgICAgIHRvcGljcyA9IDExLAogICAgICAgICAgICAgICAgICAgICAgICBtb2RlbCA9IEZJTkFMU0VMRUNURUQsCiAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZCA9ICJjb250aW51b3VzIiwgCiAgICAgICAgICAgICAgICAgICAgICAgIHlsaW0gPSBjKDAsIC40KSwKICAgICAgICAgICAgICAgICAgICAgICAgbGluZWNvbCA9ICJibHVlIiwgCiAgICAgICAgICAgICAgICAgICAgICAgIHByaW50bGVnZW5kID0gRiwgCiAgICAgICAgICAgICAgICAgICAgICAgIG1haW4gPSAiIFRvcGljMTEgICgpIFxuIGNvbW11bml0aSwgbGl0ZXJhY2ksIHByb2dyYW0sIGRldmVsb3AsIHByb2plY3QsIGFkdWx0LCBoZWFsdGggIikKClAxMjwtcGxvdC5lc3RpbWF0ZUVmZmVjdChwcmVwZWZmZWN0LCAKICAgICAgICAgICAgICAgICAgICAgICAgY292YXJpYXRlID0gIlllYXIiLAogICAgICAgICAgICAgICAgICAgICAgICB0b3BpY3MgPSAxMiwKICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWwgPSBGSU5BTFNFTEVDVEVELAogICAgICAgICAgICAgICAgICAgICAgICBtZXRob2QgPSAiY29udGludW91cyIsIAogICAgICAgICAgICAgICAgICAgICAgICB5bGltID0gYygwLCAuNCksCiAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVjb2wgPSAiYmx1ZSIsIAogICAgICAgICAgICAgICAgICAgICAgICBwcmludGxlZ2VuZCA9IEYsIAogICAgICAgICAgICAgICAgICAgICAgICBtYWluID0gIiBUb3BpYzEyICAoKSBcbiBlZHVjLCBwb2xpY2ksIGhpZ2hlciwgY291bnRyaSwgYWR1bHQsIGV1cm9wZWFuLCBkZXZlbG9wICIpCgpwYXIobWZyb3c9YygxLDEpKQpgYGAKCgoKCgoKIyB0cmVuZCBwbG90IHZhbHVlcwpgYGB7cn0KUDEKI1AyCiNQMwojUDQKI1A1CmBgYAoKCiMjIFRpbWUgVHJlbmQgUGxvdCB3aXRoIGdncGxvdAojIyMgVE9QSUMgMQpgYGB7cn0KUDFfMTwtUDEkeApQMV8yPC1QMSR0b3BpY3MKUDFfMzwtUDEkbWVhbnNbWzFdXQpQMV80PC1QMSRjaVtbMV1dClAxXzQ8LXQoUDFfNCkKUDFDPC1hcy5kYXRhLmZyYW1lKGNiaW5kKFAxXzEsUDFfMyxQMV80KSkKY29sbmFtZXMoUDFDKTwtYygiWUVBUiIsIlRyZW5kIiwiTE9XQ0kiLCJISUdIQ0kiKQoKUDFBTk5PPC1ncm9iVHJlZSgKICB0ZXh0R3JvYigKICAgICJIaWdoZXN0IFByb2JhYmlsaXR5IFdvcmRzOiAKICAgIFRvcGljIDEgVG9wIFdvcmRzOiBsZWFybiwgc3BhY2UsIGluZm9ybSwgZXhwZXJpLCBncm91cCwgcGVvcGwsIHdheSAiLAogICAgeD0wLjEsICAKICAgIHk9MC45LCAKICAgIGhqdXN0PTAsIAogICAgZ3A9Z3Bhcihjb2w9ImJsYWNrIiwgZm9udHNpemU9OCkpKQoKUDFHRzwtZ2dwbG90KFAxQykgKyBnZW9tX2xpbmUoYWVzKHg9UDFDJFlFQVIsIHk9UDFDJFRyZW5kKSwgY29sb3I9ImJsYWNrIiwgc2l6ZT0wLjUpICsgbGFicyh0aXRsZT0iVG9waWMgMTogIikgKyBhbm5vdGF0aW9uX2N1c3RvbShQMUFOTk8pICsgeWxpbSgtMC4yLCAwLjcpICsgeGxhYigiIikgKyB5bGFiKCJFeHBlY3RlZCBUb3BpYyBQcm9wb3J0aW9uIikgKyB0aGVtZV9oYygpICsgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcz1jKDIwMDYsMjAwNywyMDA4LDIwMDksMjAxMCwyMDExLDIwMTIsMjAxMywyMDE0LDIwMTUpKQpQMUdHCmBgYAoKIyBUb3BpYyAyCmBgYHtyfQpQMl8xPC1QMiR4ClAyXzI8LVAyJHRvcGljcwpQMl8zPC1QMiRtZWFuc1tbMV1dClAyXzQ8LVAyJGNpW1sxXV0KUDJfNDwtdChQMl80KQpQMkM8LWFzLmRhdGEuZnJhbWUoY2JpbmQoUDJfMSxQMl8zLFAyXzQpKQpjb2xuYW1lcyhQMkMpPC1jKCJZRUFSIiwiVHJlbmQiLCJMT1dDSSIsIkhJR0hDSSIpCgpQMkFOTk88LWdyb2JUcmVlKAogIHRleHRHcm9iKAogICAgIkhpZ2hlc3QgUHJvYmFiaWxpdHkgV29yZHM6IAogICAgVG9waWMgMiBUb3AgV29yZHM6IHJlc2VhcmNoLCBwcmFjdGljLCBwcm9jZXNzLCBrbm93bGVkZywgY2hhbmcsIGNvbnRleHQsIHdvcmsgIiwKICAgIHg9MC4xLCAgCiAgICB5PTAuOSwgCiAgICBoanVzdD0wLCAKICAgIGdwPWdwYXIoY29sPSJibGFjayIsIGZvbnRzaXplPTgpKSkKClAyR0c8LWdncGxvdChQMkMpICsgZ2VvbV9saW5lKGFlcyh4PVAyQyRZRUFSLCB5PVAyQyRUcmVuZCksIGNvbG9yPSJibGFjayIsIHNpemU9MC41KSArIGxhYnModGl0bGU9IlRvcGljIDI6ICIpICsgYW5ub3RhdGlvbl9jdXN0b20oUDJBTk5PKSArIHlsaW0oLTAuMiwgMC43KSArIHhsYWIoIiIpICsgeWxhYigiRXhwZWN0ZWQgVG9waWMgUHJvcG9ydGlvbiIpICsgdGhlbWVfaGMoKSArIHNjYWxlX3hfY29udGludW91cyhicmVha3M9YygyMDA2LDIwMDcsMjAwOCwyMDA5LDIwMTAsMjAxMSwyMDEyLDIwMTMsMjAxNCwyMDE1KSkKUDJHRwpgYGAKCiMgVG9waWMgMwpgYGB7cn0KUDNfMTwtUDMkeApQM18yPC1QMyR0b3BpY3MKUDNfMzwtUDMkbWVhbnNbWzFdXQpQM180PC1QMyRjaVtbMV1dClAzXzQ8LXQoUDNfNCkKUDNDPC1hcy5kYXRhLmZyYW1lKGNiaW5kKFAzXzEsUDNfMyxQM180KSkKY29sbmFtZXMoUDNDKTwtYygiWUVBUiIsIlRyZW5kIiwiTE9XQ0kiLCJISUdIQ0kiKQoKUDNBTk5PPC1ncm9iVHJlZSgKICB0ZXh0R3JvYigKICAgICJIaWdoZXN0IFByb2JhYmlsaXR5IFdvcmRzOiAKICAgIFRvcGljIDMgVG9wIFdvcmRzOiBsZWFybiwgY3VsdHVyLCBwcm9ncmFtbSwgbGFuZ3VhZywgYXJ0LCBhZnJpY2FuLCByZXBvcnQgIiwKICAgIHg9MC4xLCAgCiAgICB5PTAuOSwgCiAgICBoanVzdD0wLCAKICAgIGdwPWdwYXIoY29sPSJibGFjayIsIGZvbnRzaXplPTgpKSkKClAzR0c8LWdncGxvdChQM0MpICsgZ2VvbV9saW5lKGFlcyh4PVAzQyRZRUFSLCB5PVAzQyRUcmVuZCksIGNvbG9yPSJibGFjayIsIHNpemU9MC41KSArIGxhYnModGl0bGU9IlRvcGljIDM6ICIpICsgYW5ub3RhdGlvbl9jdXN0b20oUDNBTk5PKSArIHlsaW0oLTAuMiwgMC43KSArIHhsYWIoIiIpICsgeWxhYigiRXhwZWN0ZWQgVG9waWMgUHJvcG9ydGlvbiIpICsgdGhlbWVfaGMoKSArIHNjYWxlX3hfY29udGludW91cyhicmVha3M9YygyMDA2LDIwMDcsMjAwOCwyMDA5LDIwMTAsMjAxMSwyMDEyLDIwMTMsMjAxNCwyMDE1KSkKUDNHRwpgYGAKCiMgVG9waWMgNApgYGB7cn0KUDRfMTwtUDQkeApQNF8yPC1QNCR0b3BpY3MKUDRfMzwtUDQkbWVhbnNbWzFdXQpQNF80PC1QNCRjaVtbMV1dClA0XzQ8LXQoUDRfNCkKUDRDPC1hcy5kYXRhLmZyYW1lKGNiaW5kKFA0XzEsUDRfMyxQNF80KSkKY29sbmFtZXMoUDRDKTwtYygiWUVBUiIsIlRyZW5kIiwiTE9XQ0kiLCJISUdIQ0kiKQoKUDRBTk5PPC1ncm9iVHJlZSgKICB0ZXh0R3JvYigKICAgICJIaWdoZXN0IFByb2JhYmlsaXR5IFdvcmRzOiAKICAgIFRvcGljIDQgVG9wIFdvcmRzOiBsZWFybiwgdHJhaW4sIHNraWxsLCBkZXZlbG9wLCB3b3JrcGxhYywgY2FyZWVyLCBlbXBsb3kgIiwKICAgIHg9MC4xLCAgCiAgICB5PTAuOSwgCiAgICBoanVzdD0wLCAKICAgIGdwPWdwYXIoY29sPSJibGFjayIsIGZvbnRzaXplPTgpKSkKClA0R0c8LWdncGxvdChQNEMpICsgZ2VvbV9saW5lKGFlcyh4PVA0QyRZRUFSLCB5PVA0QyRUcmVuZCksIGNvbG9yPSJibGFjayIsIHNpemU9MC41KSArIGxhYnModGl0bGU9IlRvcGljIDQ6ICIpICsgYW5ub3RhdGlvbl9jdXN0b20oUDRBTk5PKSArIHlsaW0oLTAuMiwgMC43KSArIHhsYWIoIiIpICsgeWxhYigiRXhwZWN0ZWQgVG9waWMgUHJvcG9ydGlvbiIpICsgdGhlbWVfaGMoKSArIHNjYWxlX3hfY29udGludW91cyhicmVha3M9YygyMDA2LDIwMDcsMjAwOCwyMDA5LDIwMTAsMjAxMSwyMDEyLDIwMTMsMjAxNCwyMDE1KSkKUDRHRwpgYGAKCiMgVG9waWMgNQpgYGB7cn0KUDVfMTwtUDUkeApQNV8yPC1QNSR0b3BpY3MKUDVfMzwtUDUkbWVhbnNbWzFdXQpQNV80PC1QNSRjaVtbMV1dClA1XzQ8LXQoUDVfNCkKUDVDPC1hcy5kYXRhLmZyYW1lKGNiaW5kKFA1XzEsUDVfMyxQNV80KSkKY29sbmFtZXMoUDVDKTwtYygiWUVBUiIsIlRyZW5kIiwiTE9XQ0kiLCJISUdIQ0kiKQoKUDVBTk5PPC1ncm9iVHJlZSgKICB0ZXh0R3JvYigKICAgICJIaWdoZXN0IFByb2JhYmlsaXR5IFdvcmRzOiAKICAgIFRvcGljIDUgVG9wIFdvcmRzOiBsZWFybiwgbGlmZWxvbmcsIHNvY2lhbCwgY2FwaXQsIGltbWlnciwgZGV2ZWxvcCwgYWxzbyAiLAogICAgeD0wLjEsICAKICAgIHk9MC45LCAKICAgIGhqdXN0PTAsIAogICAgZ3A9Z3Bhcihjb2w9ImJsYWNrIiwgZm9udHNpemU9OCkpKQoKUDVHRzwtZ2dwbG90KFA1QykgKyBnZW9tX2xpbmUoYWVzKHg9UDVDJFlFQVIsIHk9UDVDJFRyZW5kKSwgY29sb3I9ImJsYWNrIiwgc2l6ZT0wLjUpICsgbGFicyh0aXRsZT0iVG9waWMgNTogIikgKyBhbm5vdGF0aW9uX2N1c3RvbShQNUFOTk8pICsgeWxpbSgtMC4yLCAwLjcpICsgeGxhYigiIikgKyB5bGFiKCJFeHBlY3RlZCBUb3BpYyBQcm9wb3J0aW9uIikgKyB0aGVtZV9oYygpICsgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcz1jKDIwMDYsMjAwNywyMDA4LDIwMDksMjAxMCwyMDExLDIwMTIsMjAxMywyMDE0LDIwMTUpKQpQNUdHCmBgYAoKIyBUb3BpYyA2CmBgYHtyfQpQNl8xPC1QNiR4ClA2XzI8LVA2JHRvcGljcwpQNl8zPC1QNiRtZWFuc1tbMV1dClA2XzQ8LVA2JGNpW1sxXV0KUDZfNDwtdChQNl80KQpQNkM8LWFzLmRhdGEuZnJhbWUoY2JpbmQoUDZfMSxQNl8zLFA2XzQpKQpjb2xuYW1lcyhQNkMpPC1jKCJZRUFSIiwiVHJlbmQiLCJMT1dDSSIsIkhJR0hDSSIpCgpQNkFOTk88LWdyb2JUcmVlKAogIHRleHRHcm9iKAogICAgIkhpZ2hlc3QgUHJvYmFiaWxpdHkgV29yZHM6IAoJIFRvcGljIDYgVG9wIFdvcmRzOiBlZHVjLCBhZHVsdCwgc3R1ZGVudCwgcGFydGljaXAsIGxlYXJuZXIsIGFnZSwgdHJhbnNpdCAiLAogICAgeD0wLjEsICAKICAgIHk9MC45LCAKICAgIGhqdXN0PTAsIAogICAgZ3A9Z3Bhcihjb2w9ImJsYWNrIiwgZm9udHNpemU9OCkpKQoKUDZHRzwtZ2dwbG90KFA2QykgKyBnZW9tX2xpbmUoYWVzKHg9UDZDJFlFQVIsIHk9UDZDJFRyZW5kKSwgY29sb3I9ImJsYWNrIiwgc2l6ZT0wLjUpICsgbGFicyh0aXRsZT0iVG9waWMgNjogIikgKyBhbm5vdGF0aW9uX2N1c3RvbShQNkFOTk8pICsgeWxpbSgtMC4yLCAwLjcpICsgeGxhYigiIikgKyB5bGFiKCJFeHBlY3RlZCBUb3BpYyBQcm9wb3J0aW9uIikgKyB0aGVtZV9oYygpICsgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcz1jKDIwMDYsMjAwNywyMDA4LDIwMDksMjAxMCwyMDExLDIwMTIsMjAxMywyMDE0LDIwMTUpKQpQNkdHCmBgYAoKIyBUb3BpYyA3CmBgYHtyfQpQN18xPC1QNyR4ClA3XzI8LVA3JHRvcGljcwpQN18zPC1QNyRtZWFuc1tbMV1dClA3XzQ8LVA3JGNpW1sxXV0KUDdfNDwtdChQN180KQpQN0M8LWFzLmRhdGEuZnJhbWUoY2JpbmQoUDdfMSxQN18zLFA3XzQpKQpjb2xuYW1lcyhQN0MpPC1jKCJZRUFSIiwiVHJlbmQiLCJMT1dDSSIsIkhJR0hDSSIpCgpQN0FOTk88LWdyb2JUcmVlKAogIHRleHRHcm9iKAogICAgIkhpZ2hlc3QgUHJvYmFiaWxpdHkgV29yZHM6IAoJIFRvcGljIDcgVG9wIFdvcmRzOiBleHBlcmksIGlkZW50LCBsZWFybmVyLCB1bml2ZXJzLCBlbmdhZywgYWNhZGVtLCBwcmlvciAiLAogICAgeD0wLjEsICAKICAgIHk9MC45LCAKICAgIGhqdXN0PTAsIAogICAgZ3A9Z3Bhcihjb2w9ImJsYWNrIiwgZm9udHNpemU9OCkpKQoKUDdHRzwtZ2dwbG90KFA3QykgKyBnZW9tX2xpbmUoYWVzKHg9UDdDJFlFQVIsIHk9UDdDJFRyZW5kKSwgY29sb3I9ImJsYWNrIiwgc2l6ZT0wLjUpICsgbGFicyh0aXRsZT0iVG9waWMgNzogIikgKyBhbm5vdGF0aW9uX2N1c3RvbShQN0FOTk8pICsgeWxpbSgtMC4yLCAwLjcpICsgeGxhYigiIikgKyB5bGFiKCJFeHBlY3RlZCBUb3BpYyBQcm9wb3J0aW9uIikgKyB0aGVtZV9oYygpICsgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcz1jKDIwMDYsMjAwNywyMDA4LDIwMDksMjAxMCwyMDExLDIwMTIsMjAxMywyMDE0LDIwMTUpKQpQN0dHCmBgYAoKIyBUb3BpYyA4CmBgYHtyfQpQOF8xPC1QOCR4ClA4XzI8LVA4JHRvcGljcwpQOF8zPC1QOCRtZWFuc1tbMV1dClA4XzQ8LVA4JGNpW1sxXV0KUDhfNDwtdChQOF80KQpQOEM8LWFzLmRhdGEuZnJhbWUoY2JpbmQoUDhfMSxQOF8zLFA4XzQpKQpjb2xuYW1lcyhQOEMpPC1jKCJZRUFSIiwiVHJlbmQiLCJMT1dDSSIsIkhJR0hDSSIpCgpQOEFOTk88LWdyb2JUcmVlKAogIHRleHRHcm9iKAogICAgIkhpZ2hlc3QgUHJvYmFiaWxpdHkgV29yZHM6IAoJIFRvcGljIDggVG9wIFdvcmRzOiBlZHVjLCB3b21lbiwgYWR1bHQsIHNvY2lhbCwgcGVkYWdvZ2ksIGFydGljbCwgZmVtaW5pc3QgIiwKICAgIHg9MC4xLCAgCiAgICB5PTAuOSwgCiAgICBoanVzdD0wLCAKICAgIGdwPWdwYXIoY29sPSJibGFjayIsIGZvbnRzaXplPTgpKSkKClA4R0c8LWdncGxvdChQOEMpICsgZ2VvbV9saW5lKGFlcyh4PVA4QyRZRUFSLCB5PVA4QyRUcmVuZCksIGNvbG9yPSJibGFjayIsIHNpemU9MC41KSArIGxhYnModGl0bGU9IlRvcGljIDg6ICIpICsgYW5ub3RhdGlvbl9jdXN0b20oUDhBTk5PKSArIHlsaW0oLTAuMiwgMC43KSArIHhsYWIoIiIpICsgeWxhYigiRXhwZWN0ZWQgVG9waWMgUHJvcG9ydGlvbiIpICsgdGhlbWVfaGMoKSArIHNjYWxlX3hfY29udGludW91cyhicmVha3M9YygyMDA2LDIwMDcsMjAwOCwyMDA5LDIwMTAsMjAxMSwyMDEyLDIwMTMsMjAxNCwyMDE1KSkKUDhHRwpgYGAKCiMgVG9waWMgOQpgYGB7cn0KUDlfMTwtUDkkeApQOV8yPC1QOSR0b3BpY3MKUDlfMzwtUDkkbWVhbnNbWzFdXQpQOV80PC1QOSRjaVtbMV1dClA5XzQ8LXQoUDlfNCkKUDlDPC1hcy5kYXRhLmZyYW1lKGNiaW5kKFA5XzEsUDlfMyxQOV80KSkKY29sbmFtZXMoUDlDKTwtYygiWUVBUiIsIlRyZW5kIiwiTE9XQ0kiLCJISUdIQ0kiKQoKUDlBTk5PPC1ncm9iVHJlZSgKICB0ZXh0R3JvYigKICAgICJIaWdoZXN0IFByb2JhYmlsaXR5IFdvcmRzOiAKCSBUb3BpYyA5IFRvcCBXb3JkczogZ3JvdXAsIHRlYWNoZXIsIHRheWxvciwgZWR1YywgZnJhbmNpLCBsbGMsIGNvcHlyaWdodCAiLAogICAgeD0wLjEsICAKICAgIHk9MC45LCAKICAgIGhqdXN0PTAsIAogICAgZ3A9Z3Bhcihjb2w9ImJsYWNrIiwgZm9udHNpemU9OCkpKQoKUDlHRzwtZ2dwbG90KFA5QykgKyBnZW9tX2xpbmUoYWVzKHg9UDlDJFlFQVIsIHk9UDlDJFRyZW5kKSwgY29sb3I9ImJsYWNrIiwgc2l6ZT0wLjUpICsgbGFicyh0aXRsZT0iVG9waWMgOTogIikgKyBhbm5vdGF0aW9uX2N1c3RvbShQOUFOTk8pICsgeWxpbSgtMC4yLCAwLjcpICsgeGxhYigiIikgKyB5bGFiKCJFeHBlY3RlZCBUb3BpYyBQcm9wb3J0aW9uIikgKyB0aGVtZV9oYygpICsgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcz1jKDIwMDYsMjAwNywyMDA4LDIwMDksMjAxMCwyMDExLDIwMTIsMjAxMywyMDE0LDIwMTUpKQpQOUdHCmBgYAoKIyBUb3BpYyAxMApgYGB7cn0KUDEwXzE8LVAxMCR4ClAxMF8yPC1QMTAkdG9waWNzClAxMF8zPC1QMTAkbWVhbnNbWzFdXQpQMTBfNDwtUDEwJGNpW1sxXV0KUDEwXzQ8LXQoUDEwXzQpClAxMEM8LWFzLmRhdGEuZnJhbWUoY2JpbmQoUDEwXzEsUDEwXzMsUDEwXzQpKQpjb2xuYW1lcyhQMTBDKTwtYygiWUVBUiIsIlRyZW5kIiwiTE9XQ0kiLCJISUdIQ0kiKQoKUDEwQU5OTzwtZ3JvYlRyZWUoCiAgdGV4dEdyb2IoCiAgICAiSGlnaGVzdCBQcm9iYWJpbGl0eSBXb3JkczogCgkgVG9waWMgMTAgVG9wIFdvcmRzOiBsZWFybiwgYWR1bHQsIGVkdWMsIHRyYW5zZm9ybSwgdGhlb3JpLCBjcml0aWMsIHJlZmxlY3QgIiwKICAgIHg9MC4xLCAgCiAgICB5PTAuOSwgCiAgICBoanVzdD0wLCAKICAgIGdwPWdwYXIoY29sPSJibGFjayIsIGZvbnRzaXplPTgpKSkKClAxMEdHPC1nZ3Bsb3QoUDEwQykgKyBnZW9tX2xpbmUoYWVzKHg9UDEwQyRZRUFSLCB5PVAxMEMkVHJlbmQpLCBjb2xvcj0iYmxhY2siLCBzaXplPTAuNSkgKyBsYWJzKHRpdGxlPSJUb3BpYyAxMDogIikgKyBhbm5vdGF0aW9uX2N1c3RvbShQMTBBTk5PKSArIHlsaW0oLTAuMiwgMC43KSArIHhsYWIoIiIpICsgeWxhYigiRXhwZWN0ZWQgVG9waWMgUHJvcG9ydGlvbiIpICsgdGhlbWVfaGMoKSArIHNjYWxlX3hfY29udGludW91cyhicmVha3M9YygyMDA2LDIwMDcsMjAwOCwyMDA5LDIwMTAsMjAxMSwyMDEyLDIwMTMsMjAxNCwyMDE1KSkKUDEwR0cKYGBgCgojIFRvcGljIDExCmBgYHtyfQpQMTFfMTwtUDExJHgKUDExXzI8LVAxMSR0b3BpY3MKUDExXzM8LVAxMSRtZWFuc1tbMV1dClAxMV80PC1QMTEkY2lbWzFdXQpQMTFfNDwtdChQMTFfNCkKUDExQzwtYXMuZGF0YS5mcmFtZShjYmluZChQMTFfMSxQMTFfMyxQMTFfNCkpCmNvbG5hbWVzKFAxMUMpPC1jKCJZRUFSIiwiVHJlbmQiLCJMT1dDSSIsIkhJR0hDSSIpCgpQMTFBTk5PPC1ncm9iVHJlZSgKICB0ZXh0R3JvYigKICAgICJIaWdoZXN0IFByb2JhYmlsaXR5IFdvcmRzOiAKCSBUb3BpYyAxMSBUb3AgV29yZHM6IGNvbW11bml0aSwgbGl0ZXJhY2ksIHByb2dyYW0sIGRldmVsb3AsIHByb2plY3QsIGFkdWx0LCBoZWFsdGggIiwKICAgIHg9MC4xLCAgCiAgICB5PTAuOSwgCiAgICBoanVzdD0wLCAKICAgIGdwPWdwYXIoY29sPSJibGFjayIsIGZvbnRzaXplPTgpKSkKClAxMUdHPC1nZ3Bsb3QoUDExQykgKyBnZW9tX2xpbmUoYWVzKHg9UDExQyRZRUFSLCB5PVAxMUMkVHJlbmQpLCBjb2xvcj0iYmxhY2siLCBzaXplPTAuNSkgKyBsYWJzKHRpdGxlPSJUb3BpYyAxMTogIikgKyBhbm5vdGF0aW9uX2N1c3RvbShQMTFBTk5PKSArIHlsaW0oLTAuMiwgMC43KSArIHhsYWIoIiIpICsgeWxhYigiRXhwZWN0ZWQgVG9waWMgUHJvcG9ydGlvbiIpICsgdGhlbWVfaGMoKSArIHNjYWxlX3hfY29udGludW91cyhicmVha3M9YygyMDA2LDIwMDcsMjAwOCwyMDA5LDIwMTAsMjAxMSwyMDEyLDIwMTMsMjAxNCwyMDE1KSkKUDExR0cKYGBgCgojIFRvcGljIDEyCmBgYHtyfQpQMTJfMTwtUDEyJHgKUDEyXzI8LVAxMiR0b3BpY3MKUDEyXzM8LVAxMiRtZWFuc1tbMV1dClAxMl80PC1QMTIkY2lbWzFdXQpQMTJfNDwtdChQMTJfNCkKUDEyQzwtYXMuZGF0YS5mcmFtZShjYmluZChQMTJfMSxQMTJfMyxQMTJfNCkpCmNvbG5hbWVzKFAxMkMpPC1jKCJZRUFSIiwiVHJlbmQiLCJMT1dDSSIsIkhJR0hDSSIpCgpQMTJBTk5PPC1ncm9iVHJlZSgKICB0ZXh0R3JvYigKICAgICJIaWdoZXN0IFByb2JhYmlsaXR5IFdvcmRzOiAKCSBUb3BpYyAxMiBUb3AgV29yZHM6IGVkdWMsIHBvbGljaSwgaGlnaGVyLCBjb3VudHJpLCBhZHVsdCwgZXVyb3BlYW4sIGRldmVsb3AgIiwKICAgIHg9MC4xLCAgCiAgICB5PTAuOSwgCiAgICBoanVzdD0wLCAKICAgIGdwPWdwYXIoY29sPSJibGFjayIsIGZvbnRzaXplPTgpKSkKClAxMkdHPC1nZ3Bsb3QoUDEyQykgKyBnZW9tX2xpbmUoYWVzKHg9UDEyQyRZRUFSLCB5PVAxMkMkVHJlbmQpLCBjb2xvcj0iYmxhY2siLCBzaXplPTAuNSkgKyBsYWJzKHRpdGxlPSJUb3BpYyAxMjogIikgKyBhbm5vdGF0aW9uX2N1c3RvbShQMTJBTk5PKSArIHlsaW0oLTAuMiwgMC43KSArIHhsYWIoIiIpICsgeWxhYigiRXhwZWN0ZWQgVG9waWMgUHJvcG9ydGlvbiIpICsgdGhlbWVfaGMoKSArIHNjYWxlX3hfY29udGludW91cyhicmVha3M9YygyMDA2LDIwMDcsMjAwOCwyMDA5LDIwMTAsMjAxMSwyMDEyLDIwMTMsMjAxNCwyMDE1KSkKUDEyR0cKYGBgCgoKIyBUaW1lIFNlcmlzZSBidW5kbGUKYGBge3J9CnJlcXVpcmUoZ3JpZEV4dHJhKQpncmlkLmFycmFuZ2UoUDFHRywgUDJHRywgUDNHRywgUDRHRywgbmNvbD0yKQpncmlkLmFycmFuZ2UoUDVHRywgUDZHRywgUDdHRywgUDhHRywgbmNvbD0yKQpncmlkLmFycmFuZ2UoUDlHRywgUDEwR0csIFAxMUdHLCBQMTJHRywgbmNvbD0yKQpgYGAKCiMjIEFkZGl0aW9uYWwgQW5hbHlzaXMKYGBge3J9CmNsb3VkKEZJTkFMU0VMRUNURUQsIHRvcGljID0gMSwgc2NhbGUgPSBjKDQsLjc1KSkKbW9kLm91dC5jb3JyIDwtIHRvcGljQ29ycihGSU5BTFNFTEVDVEVEKQpwbG90LnRvcGljQ29ycihtb2Qub3V0LmNvcnIpCm1vZC5vdXQuY29ycgoKYGBgCgoKCg==