Introducción

La actividad corresponde en comparar dos guiones de película, uno es de Aladdin de 1992 y el otro es de Aladdin de 2019. El primero es una versión animada, por lo cual la tarea es analizar que tanto se ha modernizado el nuevo guión y si sigue siendo fiel a su antecesor.

library(tm)
## Loading required package: NLP
library(pdftools)
## Using poppler version 23.04.0
library(SnowballC)
library(NLP)
library(wordcloud)
## Loading required package: RColorBrewer
library(RColorBrewer)
library(syuzhet)

A. Depuración, Limpieza y estructura de Texto

  • Buscar
  • Limpiar
  • Estructurar

Aladdin 1992 (.txt)

Sys.setenv(LANG = "en")
#Let's start by importing the text to analyze
tex <- readLines(("Aladdin1992.txt"), warn = FALSE)
text <- iconv(tex, "WINDOWS-1252", "UTF-8")
#We need to convert the text to a corpus

docs <- Corpus(VectorSource(text))
#inspect(docs)
#General text cleaning

# Convert the text to lower case
docs <- tm_map(docs, content_transformer(tolower))
## Warning in tm_map.SimpleCorpus(docs, content_transformer(tolower)):
## transformation drops documents
# Remove numbers
docs <- tm_map(docs, removeNumbers)
## Warning in tm_map.SimpleCorpus(docs, removeNumbers): transformation drops
## documents
# Remove english common stopwords
docs <- tm_map(docs, removeWords, stopwords("english"))
## Warning in tm_map.SimpleCorpus(docs, removeWords, stopwords("english")):
## transformation drops documents
# Remove your own stop word
# specify your stopwords as a character vector
docs <- tm_map(docs, removeWords, c("blabla1", "blabla2")) 
## Warning in tm_map.SimpleCorpus(docs, removeWords, c("blabla1", "blabla2")):
## transformation drops documents
# Remove punctuations
docs <- tm_map(docs, removePunctuation)
## Warning in tm_map.SimpleCorpus(docs, removePunctuation): transformation drops
## documents
# Eliminate extra white spaces
docs <- tm_map(docs, stripWhitespace) 
## Warning in tm_map.SimpleCorpus(docs, stripWhitespace): transformation drops
## documents
#Term-document matrix. Document matrix is a table containing the frequency of the words.

dtm <- TermDocumentMatrix(docs)
m <- as.matrix(dtm)
v <- sort(rowSums(m),decreasing=TRUE)
d <- data.frame(word = names(v),freq=v)
head(d, 100)
##              word freq
## aladdin   aladdin  382
## jafar       jafar  200
## jasmine   jasmine  194
## abu           abu  168
## genie       genie  166
## sultan     sultan  111
## iago         iago   93
## carpet     carpet   89
## back         back   72
## prince     prince   63
## looks       looks   60
## lamp         lamp   57
## like         like   52
## one           one   48
## princess princess   46
## head         head   44
## just         just   44
## see           see   43
## turns       turns   42
## pulls       pulls   41
## ali           ali   40
## look         look   38
## now           now   38
## get           get   35
## got           got   35
## sees         sees   35
## right       right   32
## will         will   32
## man           man   32
## away         away   32
## can           can   31
## never       never   30
## wish         wish   30
## cave         cave   29
## guards     guards   29
## make         make   29
## cut           cut   28
## guard       guard   28
## grabs       grabs   28
## well         well   28
## boy           boy   27
## rajah       rajah   27
## hand         hand   26
## around     around   26
## come         come   25
## good         good   25
## comes       comes   25
## way           way   25
## yes           yes   24
## begins     begins   24
## aladdins aladdins   24
## palace     palace   24
## old           old   24
## hey           hey   23
## little     little   22
## two           two   22
## new           new   22
## top           top   21
## want         want   21
## face         face   20
## know         know   20
## hands       hands   20
## street     street   20
## time         time   20
## gotta       gotta   20
## think       think   19
## flies       flies   19
## goes         goes   19
## genies     genies   19
## world       world   19
## falls       falls   18
## normal     normal   18
## jumps       jumps   18
## free         free   18
## mouth       mouth   17
## gonna       gonna   17
## take         take   17
## takes       takes   17
## walks       walks   17
## staff       staff   17
## say           say   17
## whole       whole   17
## finally   finally   16
## jafars     jafars   16
## three       three   16
## tell         tell   16
## door         door   16
## appears   appears   16
## pile         pile   15
## turban     turban   15
## stop         stop   14
## another   another   14
## friend     friend   14
## find         find   14
## eyes         eyes   14
## rat           rat   14
## runs         runs   14
## love         love   14
## sorry       sorry   14
## floor       floor   14
findFreqTerms(dtm, lowfreq = 20)
##  [1] "aladdin"  "come"     "cut"      "face"     "like"     "hey"     
##  [7] "back"     "right"    "carpet"   "good"     "guard"    "little"  
## [13] "look"     "yes"      "will"     "pulls"    "never"    "one"     
## [19] "begins"   "can"      "see"      "lamp"     "man"      "hand"    
## [25] "iago"     "jafar"    "comes"    "get"      "grabs"    "two"     
## [31] "head"     "cave"     "now"      "away"     "know"     "turns"   
## [37] "just"     "got"      "hands"    "street"   "looks"    "around"  
## [43] "top"      "way"      "aladdins" "abu"      "time"     "guards"  
## [49] "gotta"    "make"     "wish"     "sees"     "prince"   "palace"  
## [55] "princess" "boy"      "sultan"   "jasmine"  "rajah"    "want"    
## [61] "well"     "old"      "genie"    "ali"      "new"
Sys.setenv(LANG = "en")

Aladdin 2019 (.txt)

#Let's start by importing the text to analyze
tex2 <- readLines(("Aladdin_2019.txt"), warn=FALSE)
text2 <- iconv(tex2,"WINDOWS-1252","UTF-8")
#We need to convert the text to a corpus

docs2 <- Corpus(VectorSource(text))
#inspect(docs)
#General text cleaning

# Convert the text to lower case
docs2 <- tm_map(docs, content_transformer(tolower))
## Warning in tm_map.SimpleCorpus(docs, content_transformer(tolower)):
## transformation drops documents
# Remove numbers
docs2 <- tm_map(docs, removeNumbers)
## Warning in tm_map.SimpleCorpus(docs, removeNumbers): transformation drops
## documents
# Remove english common stopwords
docs2 <- tm_map(docs, removeWords, stopwords("english"))
## Warning in tm_map.SimpleCorpus(docs, removeWords, stopwords("english")):
## transformation drops documents
# Remove your own stop word
# specify your stopwords as a character vector
docs2 <- tm_map(docs, removeWords, c("blabla1", "blabla2")) 
## Warning in tm_map.SimpleCorpus(docs, removeWords, c("blabla1", "blabla2")):
## transformation drops documents
# Remove punctuations
docs2 <- tm_map(docs, removePunctuation)
## Warning in tm_map.SimpleCorpus(docs, removePunctuation): transformation drops
## documents
# Eliminate extra white spaces
docs2 <- tm_map(docs, stripWhitespace) 
## Warning in tm_map.SimpleCorpus(docs, stripWhitespace): transformation drops
## documents
#Term-document matrix. Document matrix is a table containing the frequency of the words.

dtm2 <- TermDocumentMatrix(docs2)
m2 <- as.matrix(dtm2)
v2 <- sort(rowSums(m2),decreasing=TRUE)
d2 <- data.frame(word = names(v2),freq=v2)
head(d2, 100)
##              word freq
## aladdin   aladdin  382
## jafar       jafar  200
## jasmine   jasmine  194
## abu           abu  168
## genie       genie  166
## sultan     sultan  111
## iago         iago   93
## carpet     carpet   89
## back         back   72
## prince     prince   63
## looks       looks   60
## lamp         lamp   57
## like         like   52
## one           one   48
## princess princess   46
## head         head   44
## just         just   44
## see           see   43
## turns       turns   42
## pulls       pulls   41
## ali           ali   40
## look         look   38
## now           now   38
## get           get   35
## got           got   35
## sees         sees   35
## right       right   32
## will         will   32
## man           man   32
## away         away   32
## can           can   31
## never       never   30
## wish         wish   30
## cave         cave   29
## guards     guards   29
## make         make   29
## cut           cut   28
## guard       guard   28
## grabs       grabs   28
## well         well   28
## boy           boy   27
## rajah       rajah   27
## hand         hand   26
## around     around   26
## come         come   25
## good         good   25
## comes       comes   25
## way           way   25
## yes           yes   24
## begins     begins   24
## aladdins aladdins   24
## palace     palace   24
## old           old   24
## hey           hey   23
## little     little   22
## two           two   22
## new           new   22
## top           top   21
## want         want   21
## face         face   20
## know         know   20
## hands       hands   20
## street     street   20
## time         time   20
## gotta       gotta   20
## think       think   19
## flies       flies   19
## goes         goes   19
## genies     genies   19
## world       world   19
## falls       falls   18
## normal     normal   18
## jumps       jumps   18
## free         free   18
## mouth       mouth   17
## gonna       gonna   17
## take         take   17
## takes       takes   17
## walks       walks   17
## staff       staff   17
## say           say   17
## whole       whole   17
## finally   finally   16
## jafars     jafars   16
## three       three   16
## tell         tell   16
## door         door   16
## appears   appears   16
## pile         pile   15
## turban     turban   15
## stop         stop   14
## another   another   14
## friend     friend   14
## find         find   14
## eyes         eyes   14
## rat           rat   14
## runs         runs   14
## love         love   14
## sorry       sorry   14
## floor       floor   14
findFreqTerms(dtm, lowfreq = 20)
##  [1] "aladdin"  "come"     "cut"      "face"     "like"     "hey"     
##  [7] "back"     "right"    "carpet"   "good"     "guard"    "little"  
## [13] "look"     "yes"      "will"     "pulls"    "never"    "one"     
## [19] "begins"   "can"      "see"      "lamp"     "man"      "hand"    
## [25] "iago"     "jafar"    "comes"    "get"      "grabs"    "two"     
## [31] "head"     "cave"     "now"      "away"     "know"     "turns"   
## [37] "just"     "got"      "hands"    "street"   "looks"    "around"  
## [43] "top"      "way"      "aladdins" "abu"      "time"     "guards"  
## [49] "gotta"    "make"     "wish"     "sees"     "prince"   "palace"  
## [55] "princess" "boy"      "sultan"   "jasmine"  "rajah"    "want"    
## [61] "well"     "old"      "genie"    "ali"      "new"

B. Análisis del Texto

  • Frecuencias
  • Comparación
  • Asociaciones

Gráficas de barra

barplot(d[1:10,]$freq, las = 2, names.arg = d[1:10,]$word,
        col ="orange", main ="Palabras más frecuentes - Aladdin 1992",
        ylab = "Frecunecia de palabras")

head(d)
##            word freq
## aladdin aladdin  382
## jafar     jafar  200
## jasmine jasmine  194
## abu         abu  168
## genie     genie  166
## sultan   sultan  111
barplot(d2[1:10,]$freq, las = 2, names.arg = d2[1:10,]$word,
        col ="brown", main ="Palabras más frecuentes - Aladdin 2019",
        ylab = "Frecunecia de palabras")

head(d2)
##            word freq
## aladdin aladdin  382
## jafar     jafar  200
## jasmine jasmine  194
## abu         abu  168
## genie     genie  166
## sultan   sultan  111

Wordcloud

Aladdin 1992

set.seed(1234)
wordcloud(words = d$word, freq = d$freq, min.freq = 15,
          max.words=Inf, random.order=T, rot.per=0.5, 
          colors=brewer.pal(8, "Dark2"))

Aladdin 2019

wordcloud(words = d2$word, freq = d2$freq, min.freq = 15,
          max.words=Inf, random.order=T, rot.per=0.5, 
          colors=brewer.pal(8, "Dark2"))

Asociaciones

Aladdin 1992

findAssocs(dtm, terms = "aladdins", corlimit = 0.2)
## $aladdins
## shoulder  stopped    trips    bulge     name    tools   debris  diploma 
##     0.23     0.20     0.20     0.20     0.20     0.20     0.20     0.20 
##    slaps   arabic     list    hopin   widely 
##     0.20     0.20     0.20     0.20     0.20

Aladdin 2019

findAssocs(dtm2, terms = "aladdins", corlimit = 0.2)
## $aladdins
## shoulder  stopped    trips    bulge     name    tools   debris  diploma 
##     0.23     0.20     0.20     0.20     0.20     0.20     0.20     0.20 
##    slaps   arabic     list    hopin   widely 
##     0.20     0.20     0.20     0.20     0.20

C. Preguntas

1. Además de limpiar contesta a esta pregunta ¿Se tomará y analizará Todo lo que aparece en la página? ¿Que si y que no? ¿Por qué?

No se toma en cuenta todo el texto del archivo, aquelas secciones descriptivas, instrucciones de escenas o especificaciones técnicas quedan fuera del análisis.

2. Hacer una comparación de frecuencia y un análisis de asociasión muy básico.

El análisis de asociación para “aladdins” en ambos guiones de “Aladdin” muestra una notable consistencia, con términos como “shoulder”, “stopped”, y “arabic” asociados estrechamente. Esta similitud puede sugiere que ciertos aspectos del personaje y elementos culturales permanecen constantes entre las versiones de 1992 y 2019.

D. Funcion Nueva - Análisis de Sentimiento

Busca alguna función asociada al análisis de texto que no hayamos visto en clase, úsala y escribe lo que lograste (aquí hay muchas funciones posibles, con que sea algo no visto en clase está bien)

aladdin_1992 <- readLines("Aladdin1992.txt", warn = FALSE)
aladdin_1992 <- iconv(aladdin_1992, "WINDOWS-1252", "UTF-8")
aladdin_2019 <- readLines("Aladdin_2019.txt", warn = FALSE)
aladdin_2019 <- iconv(aladdin_2019, "WINDOWS-1252", "UTF-8")

# Create corpora
corpus_1992 <- Corpus(VectorSource(aladdin_1992))
corpus_2019 <- Corpus(VectorSource(aladdin_2019))

# Análisis de sentimientos para Aladdin 1992
sentiments_1992 <- get_sentiment(as.character(corpus_1992), method = "syuzhet")

# Análisis de sentimientos para Aladdin 2019
sentiments_2019 <- get_sentiment(as.character(corpus_2019), method = "syuzhet")

# Calculamos la media de sentimientos para obtener una visión general del tono de cada guion de Aladdin
mean_sentiment_1992 <- mean(sentiments_1992)
mean_sentiment_2019 <- mean(sentiments_2019)

# Mostramos los resultados
cat("Media de sentimientos para Aladdin 1992:", mean_sentiment_1992, "\n")
## Media de sentimientos para Aladdin 1992: -8.983333
cat("Media de sentimientos para Aladdin 2019:", mean_sentiment_2019)
## Media de sentimientos para Aladdin 2019: 12.31667

Resultados

  • Tono Más Positivo en 2019: La media positiva del guion de 2019 sugiere un enfoque más optimista en comparación con la versión de 1992, posiblemente destinado a hacer la historia más inspiradora, esperanzadora o alegre.

  • Adaptación a la Audiencia Actual: La variación en el tono refleja las preferencias cambiantes de la audiencia, que busca historias que transmitan mensajes positivos de esperanza y resiliencia.

  • Impacto de la Cultura Popular y Sensibilidades Modernas: La versión de 2019 puede estar influenciada por las sensibilidades actuales hacia la inclusión y el optimismo frente a la adversidad.

La diferencia entre los dos guiones representan sin duda alguna una evoluci´øn en la forma de contar historias, se puede intuir que el optimismo en el cine está en crecimiento en historias clásicas, cambiando su narrativa, personajes, tonos, etc.

LS0tCnRpdGxlOiAiQ29tcGFyYWNpw7NuIEd1aW9uIEFsYWRkaW4gMTk5Mi0yMDE5IgphdXRob3I6ICJHZW5hcm8gUm9kcsOtZ3VleiBBbGPDoW50YXJhIC0gQTAwODMzMTcyIgpkYXRlOiAiMjAyNC0wNC0wMiIKb3V0cHV0OgogIGh0bWxfZG9jdW1lbnQ6CiAgICB0b2M6IHllcwogICAgdG9jX2Zsb2F0OiB5ZXMKICAgIGNvZGVfZG93bmxvYWQ6IHllcwogICAgdGhlbWU6IGZsYXRseQogICAgaGlnaGxpZ2h0OiBweWdtZW50cwotLS0KCiMgSW50cm9kdWNjacOzbgpMYSBhY3RpdmlkYWQgY29ycmVzcG9uZGUgZW4gY29tcGFyYXIgZG9zIGd1aW9uZXMgZGUgcGVsw61jdWxhLCB1bm8gZXMgZGUgQWxhZGRpbiBkZSAxOTkyIHkgZWwgb3RybyBlcyBkZSBBbGFkZGluIGRlIDIwMTkuIEVsIHByaW1lcm8gZXMgdW5hIHZlcnNpw7NuIGFuaW1hZGEsIHBvciBsbyBjdWFsIGxhIHRhcmVhIGVzIGFuYWxpemFyIHF1ZSB0YW50byBzZSBoYSBtb2Rlcm5pemFkbyBlbCBudWV2byBndWnDs24geSBzaSBzaWd1ZSBzaWVuZG8gZmllbCBhIHN1IGFudGVjZXNvci4KCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IFRSVUUpCmBgYAoKYGBge3J9CmxpYnJhcnkodG0pCmxpYnJhcnkocGRmdG9vbHMpCmxpYnJhcnkoU25vd2JhbGxDKQpsaWJyYXJ5KE5MUCkKbGlicmFyeSh3b3JkY2xvdWQpCmxpYnJhcnkoUkNvbG9yQnJld2VyKQpsaWJyYXJ5KHN5dXpoZXQpCmBgYAoKIyBBLiBEZXB1cmFjacOzbiwgTGltcGllemEgeSBlc3RydWN0dXJhIGRlIFRleHRvCi0gQnVzY2FyCi0gTGltcGlhcgotIEVzdHJ1Y3R1cmFyCgojIyBBbGFkZGluIDE5OTIgKC50eHQpCmBgYHtyfQpTeXMuc2V0ZW52KExBTkcgPSAiZW4iKQpgYGAKCmBgYHtyfQojTGV0J3Mgc3RhcnQgYnkgaW1wb3J0aW5nIHRoZSB0ZXh0IHRvIGFuYWx5emUKdGV4IDwtIHJlYWRMaW5lcygoIkFsYWRkaW4xOTkyLnR4dCIpLCB3YXJuID0gRkFMU0UpCnRleHQgPC0gaWNvbnYodGV4LCAiV0lORE9XUy0xMjUyIiwgIlVURi04IikKYGBgCgpgYGB7cn0KI1dlIG5lZWQgdG8gY29udmVydCB0aGUgdGV4dCB0byBhIGNvcnB1cwoKZG9jcyA8LSBDb3JwdXMoVmVjdG9yU291cmNlKHRleHQpKQojaW5zcGVjdChkb2NzKQpgYGAKCmBgYHtyfQojR2VuZXJhbCB0ZXh0IGNsZWFuaW5nCgojIENvbnZlcnQgdGhlIHRleHQgdG8gbG93ZXIgY2FzZQpkb2NzIDwtIHRtX21hcChkb2NzLCBjb250ZW50X3RyYW5zZm9ybWVyKHRvbG93ZXIpKQojIFJlbW92ZSBudW1iZXJzCmRvY3MgPC0gdG1fbWFwKGRvY3MsIHJlbW92ZU51bWJlcnMpCiMgUmVtb3ZlIGVuZ2xpc2ggY29tbW9uIHN0b3B3b3Jkcwpkb2NzIDwtIHRtX21hcChkb2NzLCByZW1vdmVXb3Jkcywgc3RvcHdvcmRzKCJlbmdsaXNoIikpCiMgUmVtb3ZlIHlvdXIgb3duIHN0b3Agd29yZAojIHNwZWNpZnkgeW91ciBzdG9wd29yZHMgYXMgYSBjaGFyYWN0ZXIgdmVjdG9yCmRvY3MgPC0gdG1fbWFwKGRvY3MsIHJlbW92ZVdvcmRzLCBjKCJibGFibGExIiwgImJsYWJsYTIiKSkgCiMgUmVtb3ZlIHB1bmN0dWF0aW9ucwpkb2NzIDwtIHRtX21hcChkb2NzLCByZW1vdmVQdW5jdHVhdGlvbikKIyBFbGltaW5hdGUgZXh0cmEgd2hpdGUgc3BhY2VzCmRvY3MgPC0gdG1fbWFwKGRvY3MsIHN0cmlwV2hpdGVzcGFjZSkgCmBgYAoKYGBge3J9CiNUZXJtLWRvY3VtZW50IG1hdHJpeC4gRG9jdW1lbnQgbWF0cml4IGlzIGEgdGFibGUgY29udGFpbmluZyB0aGUgZnJlcXVlbmN5IG9mIHRoZSB3b3Jkcy4KCmR0bSA8LSBUZXJtRG9jdW1lbnRNYXRyaXgoZG9jcykKbSA8LSBhcy5tYXRyaXgoZHRtKQp2IDwtIHNvcnQocm93U3VtcyhtKSxkZWNyZWFzaW5nPVRSVUUpCmQgPC0gZGF0YS5mcmFtZSh3b3JkID0gbmFtZXModiksZnJlcT12KQpoZWFkKGQsIDEwMCkKYGBgCgpgYGB7cn0KZmluZEZyZXFUZXJtcyhkdG0sIGxvd2ZyZXEgPSAyMCkKYGBgCgpgYGB7cn0KU3lzLnNldGVudihMQU5HID0gImVuIikKYGBgCgojIyBBbGFkZGluIDIwMTkgKC50eHQpCmBgYHtyfQojTGV0J3Mgc3RhcnQgYnkgaW1wb3J0aW5nIHRoZSB0ZXh0IHRvIGFuYWx5emUKdGV4MiA8LSByZWFkTGluZXMoKCJBbGFkZGluXzIwMTkudHh0IiksIHdhcm49RkFMU0UpCnRleHQyIDwtIGljb252KHRleDIsIldJTkRPV1MtMTI1MiIsIlVURi04IikKYGBgCgpgYGB7cn0KI1dlIG5lZWQgdG8gY29udmVydCB0aGUgdGV4dCB0byBhIGNvcnB1cwoKZG9jczIgPC0gQ29ycHVzKFZlY3RvclNvdXJjZSh0ZXh0KSkKI2luc3BlY3QoZG9jcykKYGBgCgpgYGB7cn0KI0dlbmVyYWwgdGV4dCBjbGVhbmluZwoKIyBDb252ZXJ0IHRoZSB0ZXh0IHRvIGxvd2VyIGNhc2UKZG9jczIgPC0gdG1fbWFwKGRvY3MsIGNvbnRlbnRfdHJhbnNmb3JtZXIodG9sb3dlcikpCiMgUmVtb3ZlIG51bWJlcnMKZG9jczIgPC0gdG1fbWFwKGRvY3MsIHJlbW92ZU51bWJlcnMpCiMgUmVtb3ZlIGVuZ2xpc2ggY29tbW9uIHN0b3B3b3Jkcwpkb2NzMiA8LSB0bV9tYXAoZG9jcywgcmVtb3ZlV29yZHMsIHN0b3B3b3JkcygiZW5nbGlzaCIpKQojIFJlbW92ZSB5b3VyIG93biBzdG9wIHdvcmQKIyBzcGVjaWZ5IHlvdXIgc3RvcHdvcmRzIGFzIGEgY2hhcmFjdGVyIHZlY3Rvcgpkb2NzMiA8LSB0bV9tYXAoZG9jcywgcmVtb3ZlV29yZHMsIGMoImJsYWJsYTEiLCAiYmxhYmxhMiIpKSAKIyBSZW1vdmUgcHVuY3R1YXRpb25zCmRvY3MyIDwtIHRtX21hcChkb2NzLCByZW1vdmVQdW5jdHVhdGlvbikKIyBFbGltaW5hdGUgZXh0cmEgd2hpdGUgc3BhY2VzCmRvY3MyIDwtIHRtX21hcChkb2NzLCBzdHJpcFdoaXRlc3BhY2UpIApgYGAKCmBgYHtyfQojVGVybS1kb2N1bWVudCBtYXRyaXguIERvY3VtZW50IG1hdHJpeCBpcyBhIHRhYmxlIGNvbnRhaW5pbmcgdGhlIGZyZXF1ZW5jeSBvZiB0aGUgd29yZHMuCgpkdG0yIDwtIFRlcm1Eb2N1bWVudE1hdHJpeChkb2NzMikKbTIgPC0gYXMubWF0cml4KGR0bTIpCnYyIDwtIHNvcnQocm93U3VtcyhtMiksZGVjcmVhc2luZz1UUlVFKQpkMiA8LSBkYXRhLmZyYW1lKHdvcmQgPSBuYW1lcyh2MiksZnJlcT12MikKaGVhZChkMiwgMTAwKQpgYGAKCmBgYHtyfQpmaW5kRnJlcVRlcm1zKGR0bSwgbG93ZnJlcSA9IDIwKQpgYGAKCiMgQi4gQW7DoWxpc2lzIGRlbCBUZXh0bwotIEZyZWN1ZW5jaWFzCi0gQ29tcGFyYWNpw7NuCi0gQXNvY2lhY2lvbmVzCgojIyBHcsOhZmljYXMgZGUgYmFycmEKYGBge3J9CmJhcnBsb3QoZFsxOjEwLF0kZnJlcSwgbGFzID0gMiwgbmFtZXMuYXJnID0gZFsxOjEwLF0kd29yZCwKICAgICAgICBjb2wgPSJvcmFuZ2UiLCBtYWluID0iUGFsYWJyYXMgbcOhcyBmcmVjdWVudGVzIC0gQWxhZGRpbiAxOTkyIiwKICAgICAgICB5bGFiID0gIkZyZWN1bmVjaWEgZGUgcGFsYWJyYXMiKQoKaGVhZChkKQpgYGAKYGBge3J9CmJhcnBsb3QoZDJbMToxMCxdJGZyZXEsIGxhcyA9IDIsIG5hbWVzLmFyZyA9IGQyWzE6MTAsXSR3b3JkLAogICAgICAgIGNvbCA9ImJyb3duIiwgbWFpbiA9IlBhbGFicmFzIG3DoXMgZnJlY3VlbnRlcyAtIEFsYWRkaW4gMjAxOSIsCiAgICAgICAgeWxhYiA9ICJGcmVjdW5lY2lhIGRlIHBhbGFicmFzIikKCmhlYWQoZDIpCmBgYAoKIyMgV29yZGNsb3VkCiMjIyBBbGFkZGluIDE5OTIKYGBge3J9CnNldC5zZWVkKDEyMzQpCndvcmRjbG91ZCh3b3JkcyA9IGQkd29yZCwgZnJlcSA9IGQkZnJlcSwgbWluLmZyZXEgPSAxNSwKICAgICAgICAgIG1heC53b3Jkcz1JbmYsIHJhbmRvbS5vcmRlcj1ULCByb3QucGVyPTAuNSwgCiAgICAgICAgICBjb2xvcnM9YnJld2VyLnBhbCg4LCAiRGFyazIiKSkKYGBgCgojIyMgQWxhZGRpbiAyMDE5CmBgYHtyfQp3b3JkY2xvdWQod29yZHMgPSBkMiR3b3JkLCBmcmVxID0gZDIkZnJlcSwgbWluLmZyZXEgPSAxNSwKICAgICAgICAgIG1heC53b3Jkcz1JbmYsIHJhbmRvbS5vcmRlcj1ULCByb3QucGVyPTAuNSwgCiAgICAgICAgICBjb2xvcnM9YnJld2VyLnBhbCg4LCAiRGFyazIiKSkKYGBgCgojIyBBc29jaWFjaW9uZXMKIyMjIEFsYWRkaW4gMTk5MgpgYGB7cn0KZmluZEFzc29jcyhkdG0sIHRlcm1zID0gImFsYWRkaW5zIiwgY29ybGltaXQgPSAwLjIpCmBgYAoKIyMjIEFsYWRkaW4gMjAxOQpgYGB7cn0KZmluZEFzc29jcyhkdG0yLCB0ZXJtcyA9ICJhbGFkZGlucyIsIGNvcmxpbWl0ID0gMC4yKQpgYGAKIyBDLiBQcmVndW50YXMKIyMjIyAxLiBBZGVtw6FzIGRlIGxpbXBpYXIgY29udGVzdGEgYSBlc3RhIHByZWd1bnRhIMK/U2UgdG9tYXLDoSB5IGFuYWxpemFyw6EgVG9kbyBsbyBxdWUgYXBhcmVjZSBlbiBsYSBww6FnaW5hPyDCv1F1ZSBzaSB5IHF1ZSBubz8gwr9Qb3IgcXXDqT8KTm8gc2UgdG9tYSBlbiBjdWVudGEgdG9kbyBlbCB0ZXh0byBkZWwgYXJjaGl2bywgYXF1ZWxhcyBzZWNjaW9uZXMgZGVzY3JpcHRpdmFzLCBpbnN0cnVjY2lvbmVzIGRlIGVzY2VuYXMgbyBlc3BlY2lmaWNhY2lvbmVzIHTDqWNuaWNhcyBxdWVkYW4gZnVlcmEgZGVsIGFuw6FsaXNpcy4KCiMjIyMgMi4gSGFjZXIgdW5hIGNvbXBhcmFjacOzbiBkZSBmcmVjdWVuY2lhIHkgdW4gYW7DoWxpc2lzIGRlIGFzb2NpYXNpw7NuIG11eSBiw6FzaWNvLgpFbCBhbsOhbGlzaXMgZGUgYXNvY2lhY2nDs24gcGFyYSAiYWxhZGRpbnMiIGVuIGFtYm9zIGd1aW9uZXMgZGUgIkFsYWRkaW4iIG11ZXN0cmEgdW5hIG5vdGFibGUgY29uc2lzdGVuY2lhLCBjb24gdMOpcm1pbm9zIGNvbW8gInNob3VsZGVyIiwgInN0b3BwZWQiLCB5ICJhcmFiaWMiIGFzb2NpYWRvcyBlc3RyZWNoYW1lbnRlLiBFc3RhIHNpbWlsaXR1ZCBwdWVkZSBzdWdpZXJlIHF1ZSBjaWVydG9zIGFzcGVjdG9zIGRlbCBwZXJzb25hamUgeSBlbGVtZW50b3MgY3VsdHVyYWxlcyBwZXJtYW5lY2VuIGNvbnN0YW50ZXMgZW50cmUgbGFzIHZlcnNpb25lcyBkZSAxOTkyIHkgMjAxOS4KCiMgRC4gRnVuY2lvbiBOdWV2YSAtIEFuw6FsaXNpcyBkZSBTZW50aW1pZW50bwpCdXNjYSBhbGd1bmEgZnVuY2nDs24gYXNvY2lhZGEgYWwgYW7DoWxpc2lzIGRlIHRleHRvIHF1ZSBubyBoYXlhbW9zIHZpc3RvIGVuIGNsYXNlLCDDunNhbGEgeSBlc2NyaWJlIGxvIHF1ZSBsb2dyYXN0ZSAoYXF1w60gaGF5IG11Y2hhcyBmdW5jaW9uZXMgcG9zaWJsZXMsIGNvbiBxdWUgc2VhIGFsZ28gbm8gdmlzdG8gZW4gY2xhc2UgZXN0w6EgYmllbikKYGBge3J9CmFsYWRkaW5fMTk5MiA8LSByZWFkTGluZXMoIkFsYWRkaW4xOTkyLnR4dCIsIHdhcm4gPSBGQUxTRSkKYWxhZGRpbl8xOTkyIDwtIGljb252KGFsYWRkaW5fMTk5MiwgIldJTkRPV1MtMTI1MiIsICJVVEYtOCIpCmFsYWRkaW5fMjAxOSA8LSByZWFkTGluZXMoIkFsYWRkaW5fMjAxOS50eHQiLCB3YXJuID0gRkFMU0UpCmFsYWRkaW5fMjAxOSA8LSBpY29udihhbGFkZGluXzIwMTksICJXSU5ET1dTLTEyNTIiLCAiVVRGLTgiKQoKIyBDcmVhdGUgY29ycG9yYQpjb3JwdXNfMTk5MiA8LSBDb3JwdXMoVmVjdG9yU291cmNlKGFsYWRkaW5fMTk5MikpCmNvcnB1c18yMDE5IDwtIENvcnB1cyhWZWN0b3JTb3VyY2UoYWxhZGRpbl8yMDE5KSkKCiMgQW7DoWxpc2lzIGRlIHNlbnRpbWllbnRvcyBwYXJhIEFsYWRkaW4gMTk5MgpzZW50aW1lbnRzXzE5OTIgPC0gZ2V0X3NlbnRpbWVudChhcy5jaGFyYWN0ZXIoY29ycHVzXzE5OTIpLCBtZXRob2QgPSAic3l1emhldCIpCgojIEFuw6FsaXNpcyBkZSBzZW50aW1pZW50b3MgcGFyYSBBbGFkZGluIDIwMTkKc2VudGltZW50c18yMDE5IDwtIGdldF9zZW50aW1lbnQoYXMuY2hhcmFjdGVyKGNvcnB1c18yMDE5KSwgbWV0aG9kID0gInN5dXpoZXQiKQoKIyBDYWxjdWxhbW9zIGxhIG1lZGlhIGRlIHNlbnRpbWllbnRvcyBwYXJhIG9idGVuZXIgdW5hIHZpc2nDs24gZ2VuZXJhbCBkZWwgdG9ubyBkZSBjYWRhIGd1aW9uIGRlIEFsYWRkaW4KbWVhbl9zZW50aW1lbnRfMTk5MiA8LSBtZWFuKHNlbnRpbWVudHNfMTk5MikKbWVhbl9zZW50aW1lbnRfMjAxOSA8LSBtZWFuKHNlbnRpbWVudHNfMjAxOSkKCiMgTW9zdHJhbW9zIGxvcyByZXN1bHRhZG9zCmNhdCgiTWVkaWEgZGUgc2VudGltaWVudG9zIHBhcmEgQWxhZGRpbiAxOTkyOiIsIG1lYW5fc2VudGltZW50XzE5OTIsICJcbiIpCmNhdCgiTWVkaWEgZGUgc2VudGltaWVudG9zIHBhcmEgQWxhZGRpbiAyMDE5OiIsIG1lYW5fc2VudGltZW50XzIwMTkpCmBgYAoKIyMjIFJlc3VsdGFkb3MKLSAqVG9ubyBNw6FzIFBvc2l0aXZvIGVuIDIwMTk6KiBMYSBtZWRpYSBwb3NpdGl2YSBkZWwgZ3Vpb24gZGUgMjAxOSBzdWdpZXJlIHVuIGVuZm9xdWUgbcOhcyBvcHRpbWlzdGEgZW4gY29tcGFyYWNpw7NuIGNvbiBsYSB2ZXJzacOzbiBkZSAxOTkyLCBwb3NpYmxlbWVudGUgZGVzdGluYWRvIGEgaGFjZXIgbGEgaGlzdG9yaWEgbcOhcyBpbnNwaXJhZG9yYSwgZXNwZXJhbnphZG9yYSBvIGFsZWdyZS4KCi0gKkFkYXB0YWNpw7NuIGEgbGEgQXVkaWVuY2lhIEFjdHVhbDoqIExhIHZhcmlhY2nDs24gZW4gZWwgdG9ubyByZWZsZWphIGxhcyBwcmVmZXJlbmNpYXMgY2FtYmlhbnRlcyBkZSBsYSBhdWRpZW5jaWEsIHF1ZSBidXNjYSBoaXN0b3JpYXMgcXVlIHRyYW5zbWl0YW4gbWVuc2FqZXMgcG9zaXRpdm9zIGRlIGVzcGVyYW56YSB5IHJlc2lsaWVuY2lhLgoKLSAqSW1wYWN0byBkZSBsYSBDdWx0dXJhIFBvcHVsYXIgeSBTZW5zaWJpbGlkYWRlcyBNb2Rlcm5hcyo6IExhIHZlcnNpw7NuIGRlIDIwMTkgcHVlZGUgZXN0YXIgaW5mbHVlbmNpYWRhIHBvciBsYXMgc2Vuc2liaWxpZGFkZXMgYWN0dWFsZXMgaGFjaWEgbGEgaW5jbHVzacOzbiB5IGVsIG9wdGltaXNtbyBmcmVudGUgYSBsYSBhZHZlcnNpZGFkLgoKTGEgZGlmZXJlbmNpYSBlbnRyZSBsb3MgZG9zIGd1aW9uZXMgcmVwcmVzZW50YW4gc2luIGR1ZGEgYWxndW5hIHVuYSBldm9sdWNpwrTDuG4gZW4gbGEgZm9ybWEgZGUgY29udGFyIGhpc3Rvcmlhcywgc2UgcHVlZGUgaW50dWlyIHF1ZSBlbCBvcHRpbWlzbW8gZW4gZWwgY2luZSBlc3TDoSBlbiBjcmVjaW1pZW50byBlbiBoaXN0b3JpYXMgY2zDoXNpY2FzLCBjYW1iaWFuZG8gc3UgbmFycmF0aXZhLCBwZXJzb25hamVzLCB0b25vcywgZXRjLgo=