Introduction

The MeToo movement is a movement against sexual harassment and sexual assault. The phrase originated with activist and community organizer Tarana Burke in 2006; after allegations against Harvey Weinstein unfolded publicly, the phrase was popularized and went viral in October 2017 when actor Alyssa Milano shared her experiences with sexual assault and harassment with the hastag #MeToo. Milano encouraged other victims of sexual harassment to to tweet about and demonstrate the widespread prevalence of sexual assault and harassment, especially in the workplace. Researchers[1][2][3][4] have identified over 8.1 million tweets containing the hashtag, and have demonstrated that the most prevalent topics of conversation have been about the movement and activism, sexual abuse and assault, harassment, and politics. More than 100 occupations have been mentioned at least 100 times[2], and there are many retweets and @ mentions of politicians and other high-profile individuals. Some top associated hashtags include #TimesUp, #WithYou, #Resist and other political hashtags. Many researchers have explored the early #MeToo tweets to determine whether this movement is a leading indicator of societal change, and to identify the demographics of individuals using the hashtag to see how different communities may be participating in the disussion. However, #MeToo has popped back into the news over the past few months as different individuals (e.g., Louis CK, Charlie Rose) have attempted to re-enter the public eye and resume their careers[6], and news outlets’ focus has shifted to whether there is a significant backlash to the movement [5][7][8].

Now that it is a year later, how has the overall tone and content of #MeToo tweets shifted? By comparing a cache of tweets from the early part of the #MeToo movement to more recent tweets, we can analyze:

To answer these questions, #MeToo tweets will be analyzed through an archive of tweets coded with the #MeToo hashtag downloaded from Twitter. This investigation uses a dataset of 390,000 #MeToo tweets dated from November 29th to December 25th, 2017, downloaded from https://data.world/balexturner/390-000-metoo-tweets. It also relies on recent data I pulled from the Twitter API using my own account to retrieve the most recent 10,000 tweets with the hashtag #MeToo (see Code Appendix).

Data Preparation

2017 sample tweets

#read in the 2017 datafile
metootweets <- read.csv("/Users/meredithpowers/Desktop/metoo.csv", stringsAsFactors=FALSE)
head(metootweets$text)
[1] "American Harem.. #MeToo https://t.co/HjExLJdGuF"                                                                                              
[2] "@johnconyersjr  @alfranken  why have you guys not resigned yet? Liberal hypocrisy! #MeToo"                                                    
[3] "Watched Megan Kelly ask Joe Keery this A.M. if she can \"rub my fingers through your hair\", and refer to his body be https://t.co/Q86wfW7DeJ"
[4] "Women have been talking about this crap the entire time, finally someone listened. #metoo https://t.co/JlK11yhFXc"                            
[5] ".@BetteMidler please speak to this sexual assault by @GeraldoRivera during the interview. #MeToo  https://t.co/1iuafGaOmv"                    
[6] "We can't keep turning a blind eye and pretend this isn't real. #metoo https://t.co/1dLZcftbSs"                                                

2018 sample tweets

#read in the 2018 datafile
tweets2 <- read.csv("/Users/meredithpowers/Desktop/me2.csv", stringsAsFactors=FALSE)
head(tweets2$x)
[1] "RT @Youneedtowork: Why don't feminists &amp; co. not get annoyed about this treatment of a female protestor in France today standing for her ri…"
[2] "@Keith_Murray_ #metoo"                                                                                                                           
[3] "RT @FarrahTomazin: Shame, secrecy and a disparity of power could mean the number of women sexually abused by clergy is four times the figur…"    
[4] "RT @SwampysGhost: #MeToo That's why we have to arrest cabal on other charges. Child rape sentences are PATHETICALLY WEAK!! Sheeple may neve…"    
[5] "Poem from a survivor: TRIGGER WARNING sexual assault\n\n#ngocswny #16daysofactivism #hearmetoo #orangetheworld… https://t.co/nRY0QO5ZWj"         
[6] "RT @bud_cann: Seriously?...a professor and proponent of the #MeToo movement critiqued the story of the Virgin Mary suggesting that she did…"     

Text Analysis

What words were most associated with the MeToo movement on Twitter in late 2017?

Who gets the most @ mentions or retweets with #MeToo?

library(tm)
library(wordcloud)
library(stringi)
library(wesanderson)
#clean up the data and create a corpus
metootweets$text <- sapply(metootweets$text,function(row) iconv(row, "latin1", "ASCII", sub=""))
cloud <- Corpus(VectorSource(metootweets$text))
cloud <- cloud %>%
  tm_map(removePunctuation) %>%
  tm_map(stripWhitespace) %>%
  tm_map(removeNumbers)%>%
  tm_map(content_transformer(tolower)) %>%
  tm_map(removeWords, stopwords('english')) %>%
  tm_map(removeWords, c('amp','metoo'))
#create wordcloud
wordcloud(cloud, max.words = 50, scale = c(3, 1),colors=brewer.pal(4, "Dark2"), random.color = TRUE, random.order = FALSE)

What about late 2018?

Are the most common words, @ mentions, and retweeted people the same or different?

#clean up the data and create a corpus
tweets2$x <- sapply(tweets2$x,function(row) iconv(row, "latin1", "ASCII", sub=""))
cloud2 <- Corpus(VectorSource(tweets2$x))
cloud2 <- cloud2 %>%
  tm_map(removePunctuation) %>%
  tm_map(stripWhitespace) %>%
  tm_map(removeNumbers)%>%
  tm_map(content_transformer(tolower)) %>%
  tm_map(removeWords, stopwords('english')) %>%
  tm_map(removeWords, c('amp','metoo'))
#create wordcloud
wordcloud(cloud2, max.words = 50, scale = c(3, 1),colors=brewer.pal(4, "Paired"), random.color = TRUE, random.order = FALSE)

One of the more striking differences between 2017 and 2018 is the frequency of retweeting or tweeting @ specific usernames. In late 2017, an overwhelming number of tweets were directed at or about activist Tarana Burke, actor Alyssa Milano, songwriter/activist Lauren Jauregui, Senator Kristin Gillibrand, and President Donald Trump. The tweets including Burke and Milano were probably part of the initial onslaught of responses; a little digging indicates that Jauregi has been an outspoken feminist activist; and Senator Gillibrand served as the political face of the #MeToo movement for a time. The inclusion of “realdonaldtrump”, “trump”, “trumps”, and “president” in the commonly-tweeted words likely stems from the allegations of sexual harassment and assault against Trump. Notably, most of the early individual mentions are fully absent from the late 2018 text analysis. The conversation seems to have become more general, with words like “colleagues” and “dinners”. The increase in the word “female” is also indicative of a subtle shift in how Twitter users refer to women. It’s interesting that there are no direct mentions of Justice Brett Kavanaugh in the top 50 words, although words like “congress” and “talbertswan” may be related. (Bishop Talbert Swan, aka @talbertswan, was a vocal critic of Trump and Republican Christians who support Trump for political reasons; he was permanently banned from Twitter in late August 2018 for offensive language [9]). Other words, like “avoid” and “fake” indicate potential #MeToo backlash.

Sentiment Analysis

To perform an analysis of the overall tone and content of the #MeToo tweets, each tweet’s word is separated into its own row and joined with a sentiment library. The NRC Emotion Lexicon is a list of English words and their associations with eight basic emotions (anger, fear, anticipation, trust, surprise, sadness, joy, and disgust) and two sentiments (negative and positive). The annotations were manually done by crowdsourcing. (See https://saifmohammad.com/WebPages/NRC-Emotion-Lexicon.htm for more.)

Late 2017 #MeToo Sentiment

library(tidyverse)
library(tidytext)
library(glue)
library(stringr)
library(viridis)
library(dplyr)
metootweets$text <-  sapply(metootweets$text, function(row) iconv(row, 'latin1','ASCII',sub=""))
metoo_sentiment <- metootweets %>%
  unnest_tokens(word, text)
metoo_sentiment_freq <- metoo_sentiment %>%
  inner_join(get_sentiments("nrc")) %>% 
  dplyr::count(sentiment, sort = TRUE) %>% 
  mutate(sentiment = reorder(sentiment, n)) %>% 
  ggplot(aes(sentiment,n, fill=sentiment)) + 
  geom_col(color='white', stat='identity') + 
  theme(axis.text.y=element_blank()) + 
  labs(x='Sentiment', y='Frequency') + 
  scale_fill_viridis(discrete=TRUE, option = "C") + 
  theme(text = element_text(size = 15))
metoo_sentiment_freq

Late 2018 #MeToo Sentiment

tweets2$x <- sapply(tweets2$x, function(row) iconv(row, 'latin1','ASCII',sub=""))
tweets2_sentiment <- tweets2 %>%
  unnest_tokens(word, x)
tweets2_sentiment_freq <- tweets2_sentiment %>%
  inner_join(get_sentiments("nrc")) %>% 
  dplyr::count(sentiment, sort = TRUE) %>% 
  mutate(sentiment = reorder(sentiment, n)) %>% 
  ggplot(aes(sentiment,n, fill=sentiment)) + 
  geom_col(color='white', stat='identity') + 
  theme(axis.text.y=element_blank()) + 
  labs(x='Sentiment', y='Frequency') + 
  scale_fill_viridis(discrete=TRUE, option = "magma") + 
  theme(text = element_text(size = 15))
tweets2_sentiment_freq

The clearest shift in sentiment from 2017 and 2018 seems to be the stark decrease in surprise. While disgust, sadness, anticipation, and trust seem to hold steady in their proportional share of the overall sentiment, the feelings of fear and anger seem to switch places.

Frequency of 2017 Most-Tweeted #MeToo Words by Sentiment

metoo_sentiment_freq2 <- metoo_sentiment %>%
  inner_join(get_sentiments("nrc")) %>%
  dplyr::count(word, sentiment, sort = TRUE) %>%
  group_by(sentiment) %>%
  top_n(10) %>%
  ungroup() %>%
  mutate(word = reorder(word, n)) %>%
  ggplot(aes(word, n, fill = sentiment)) + 
  geom_col(show.legend=FALSE, stat='identity') + 
  facet_wrap(~sentiment, scales='free_y', nrow=3) + 
  labs(y = NULL, x = NULL) + 
  coord_flip() + 
  theme_calc() + 
  scale_fill_viridis(discrete=TRUE, option = "C") + 
  theme(text = element_text(size=10))
metoo_sentiment_freq2

Frequency of 2018 Most-Tweeted #MeToo Words by Sentiment

tweets2_sentiment_freq2 <- tweets2_sentiment %>%
  inner_join(get_sentiments("nrc")) %>%
  dplyr::count(word, sentiment, sort = TRUE) %>%
  group_by(sentiment) %>%
  top_n(10) %>%
  ungroup() %>%
  mutate(word = reorder(word, n)) %>%
  ggplot(aes(word, n, fill = sentiment)) + 
  geom_col(show.legend=FALSE, stat='identity') + 
  facet_wrap(~sentiment, scales='free_y', nrow=3) + 
  labs(y = NULL, x = NULL) + 
  coord_flip() + 
  theme_calc() + 
  scale_fill_viridis(discrete=TRUE, option = "magma") + 
  theme(text = element_text(size=10))
tweets2_sentiment_freq2

The proportion of positively related words is a little surprising, although it could be explained by the overall tone of #MeToo, which has been one of empowerment for victims of sexual assault. However, after seeing the break down in words under each sentiment category, the overall validity of using the sentiment library is somewhat undermined.

Discussion

It is possible to study societal shifts in how we discuss sexual assault and harassment using publicly archived or harvested Twitter data; likewise it is possbible to analysze the overall tone and content of tweets using the tidytext ecosystem.

Comparing some of #MeToo’s more common associated words in 2017 versus 2018 suggest that the initial outpouring of personal tweets at high-profile individuals has subsided and the Twitter conversation about sexual harassment has shifted to more general discussions. The emotional sentiment of the language in 2017 and 2018 is similar, although feelings of anger and surprise seem to have receded somewhat, while fear seems to have increased over the past year.

On the other hand, sentiment libraries have some fundamental drawbacks, and individual judgement is needed to provide context when interpreting results. Words like “sex” and “female” are coded positively in the NRC sentiment library (and further exploration of the Bing and AFINN libraries suggest they have similar classifications), although both of these words may not actually have positive connotations in the context of sexual harassment against women. Another example is the word “professor” appearing in the trust category – given the nature of some tweets about experience sexual assault by professors points more to an abuse or lack of trust rather than an overall feeling of trust. Furthermore, the words “black” and “white” appear in the negative and positive categories respectively; without knowing why the sentiment classed these words this way, it’s probably best to consider these words neutrally in an overall sentiment analysis. In the context of the #MeToo tweets, “black” and “white” could refer to race or a common phrase like “black and white thinking”, but I’m not sure what it means in the context of the original NRC sentiment crowdsourcing.

Future Directions

Tweets are one way to understand the international conversation about sexual harassment; scholarly journals are another way to study the way we view the phenonemom. The following data is an initial exploration of when and how sexual harassment is studied.

PLoS Textual Analysis of Sexual Harassment

library(rplos)
library(ggplot2)
plot_throughtime(terms = '"sexual harassment"', limit = 800) + geom_line(size=2, color='#cc0066')

aRxiv Textual Analysis of Sexual Harassment

When were papers related to sexual harassment submitted to aRxiv?

#retrieve articles
library(aRxiv)
metoo_articles <- arxiv_search(query = '"sexual harassment"', limit = 800)
#clean up dates
library(lubridate)
metoo_articles <- metoo_articles %>%
  mutate(submitted = ymd_hms(submitted), updated = ymd_hms(updated))
#when were these submitted?
xtabs(~ year(submitted), data = metoo_articles)
year(submitted)
2013 2017 2018 
   1    1    4 

When fields were they published under?

#what fields were they submitted in?
metoo_articles  %>%
  mutate(field = str_extract(primary_category, "^[a-z,-]+"))  %>%
  mosaic::tally(x = ~field)  %>%
  sort()
cs 
 6 

Given that there are only 6 published articles, what are their titles?

#since there are only six in total, let's look at each title to determine the specific focus of each
head(metoo_articles$title)
[1] "Online Social Networks: Threats and Solutions"                                                                                                                     
[2] "Forensic Investigation of Social Media and Instant Messaging Services in\n  Firefox OS: Facebook, Twitter, Google+, Telegram, OpenWapp and Line as Case\n  Studies"
[3] "A Quality Type-aware Annotated Corpus and Lexicon for Harassment\n  Research"                                                                                      
[4] "It Takes Two to #MeToo - Using Enclaves to Build Autonomous Trusted\n  Systems"                                                                                    
[5] "SafeCity: Understanding Diverse Forms of Sexual Harassment Personal\n  Stories"                                                                                    
[6] "SATE: Robust and Private Allegation Escrows"                                                                                                                       

While both of these datasets are too small to be particularly valuable, they do point to trends. The PLoS timeline indicates very little interest in sexual harassment as a topic of study prior to 2012; the number of articles is still small in 2018 but it a steady increase. Likewise, the aRxiv data points to a potentially open and burgeoning area of research in Computer Science: studying harassment by analyzing textual data.

References

[1] Anderson, M., & Toor, S. (2018, October 11). How social media users have discussed sexual harassment since #MeToo went viral. Retrieved from http://www.pewresearch.org/fact-tank/2018/10/11/how-social-media-users-have-discussed-sexual-harassment-since-metoo-went-viral/

[2] Georgetown University. (2018, September 10). #MeToo Movement Twitter Data Mined by Computer Science Professor. Retrieved from https://www.georgetown.edu/news/metoo-movement-twitter-data-mined-by-computer-science-professor

[3] Kunst, J. R., Bailey, A., Prendergast, C., & Gundersen, A. (2018). Sexism, rape myths and feminist identification explain gender differences in attitudes toward the# metoo social media campaign in two countries. Media Psychology, 1-26.

[4] Manikonda, L., Beigi, G., Liu, H., & Kambhampati, S. (2018). Twitter for Sparking a Movement, Reddit for Sharing the Moment:# metoo through the Lens of Social Media. arXiv preprint arXiv:1803.08022.

[5] Parker, K. (2018, December 6). Women starting to suffer the #MeToo backlash. Retrieved from https://www.postandcourier.com/opinion/commentary/women-starting-to-suffer-the-metoo-backlash/article_fc981576-f97d-11e8-8207-97a4ed0ae3d3.html

[6]Roberts, D. (2018, September 12). What so many men are missing about #MeToo. Retrieved from https://www.vox.com/2018/9/10/17826168/me-too-louis-ck-men-comeback

[7] Tan, G., & Porzecanski, K. (2018, December 3). Wall Street Rule for the #MeToo Era: Avoid Women at All Cost. Retrieved from https://www.bloomberg.com/news/articles/2018-12-03/a-wall-street-rule-for-the-metoo-era-avoid-women-at-all-cost

[8] The Economist. (2018, October 20). Measuring the #MeToo backlash. Retrieved from https://www.economist.com/united-states/2018/10/20/measuring-the-metoo-backlash

[9] Banks, A. (2018, August 28). Black bishop says Twitter suspended him for “hateful conduct.” Retrieved from https://religionnews.com/2018/08/28/black-bishop-and-trump-critic-says-twitter-suspended-account-for-hateful-conduct/

LS0tCnRpdGxlOiAiQW5hbHl6aW5nICNNZVRvbyBUd2VldHMiCm91dHB1dDogCiAgaHRtbF9ub3RlYm9vazogCiAgICBjb2RlX2ZvbGRpbmc6IGhpZGUKICAgIHRoZW1lOiBsdW1lbgotLS0KCiMgSW50cm9kdWN0aW9uCgpUaGUgTWVUb28gbW92ZW1lbnQgaXMgYSBtb3ZlbWVudCBhZ2FpbnN0IHNleHVhbCBoYXJhc3NtZW50IGFuZCBzZXh1YWwgYXNzYXVsdC4gVGhlIHBocmFzZSBvcmlnaW5hdGVkIHdpdGggYWN0aXZpc3QgYW5kIGNvbW11bml0eSBvcmdhbml6ZXIgVGFyYW5hIEJ1cmtlIGluIDIwMDY7IGFmdGVyIGFsbGVnYXRpb25zIGFnYWluc3QgSGFydmV5IFdlaW5zdGVpbiB1bmZvbGRlZCBwdWJsaWNseSwgdGhlIHBocmFzZSB3YXMgcG9wdWxhcml6ZWQgYW5kIHdlbnQgdmlyYWwgaW4gT2N0b2JlciAyMDE3IHdoZW4gYWN0b3IgQWx5c3NhIE1pbGFubyBzaGFyZWQgaGVyIGV4cGVyaWVuY2VzIHdpdGggc2V4dWFsIGFzc2F1bHQgYW5kIGhhcmFzc21lbnQgd2l0aCB0aGUgaGFzdGFnICNNZVRvby4gTWlsYW5vIGVuY291cmFnZWQgb3RoZXIgdmljdGltcyBvZiBzZXh1YWwgaGFyYXNzbWVudCB0byB0byB0d2VldCBhYm91dCBhbmQgZGVtb25zdHJhdGUgdGhlIHdpZGVzcHJlYWQgcHJldmFsZW5jZSBvZiBzZXh1YWwgYXNzYXVsdCBhbmQgaGFyYXNzbWVudCwgZXNwZWNpYWxseSBpbiB0aGUgd29ya3BsYWNlLiBSZXNlYXJjaGVyc1sxXVsyXVszXVs0XSBoYXZlIGlkZW50aWZpZWQgb3ZlciA4LjEgbWlsbGlvbiB0d2VldHMgY29udGFpbmluZyB0aGUgaGFzaHRhZywgYW5kIGhhdmUgZGVtb25zdHJhdGVkIHRoYXQgdGhlIG1vc3QgcHJldmFsZW50IHRvcGljcyBvZiBjb252ZXJzYXRpb24gaGF2ZSBiZWVuIGFib3V0IHRoZSBtb3ZlbWVudCBhbmQgYWN0aXZpc20sIHNleHVhbCBhYnVzZSBhbmQgYXNzYXVsdCwgaGFyYXNzbWVudCwgYW5kIHBvbGl0aWNzLiBNb3JlIHRoYW4gMTAwIG9jY3VwYXRpb25zIGhhdmUgYmVlbiBtZW50aW9uZWQgYXQgbGVhc3QgMTAwIHRpbWVzWzJdLCBhbmQgdGhlcmUgYXJlIG1hbnkgcmV0d2VldHMgYW5kIEAgbWVudGlvbnMgb2YgcG9saXRpY2lhbnMgYW5kIG90aGVyIGhpZ2gtcHJvZmlsZSBpbmRpdmlkdWFscy4gU29tZSB0b3AgYXNzb2NpYXRlZCBoYXNodGFncyBpbmNsdWRlICNUaW1lc1VwLCAjV2l0aFlvdSwgI1Jlc2lzdCBhbmQgb3RoZXIgcG9saXRpY2FsIGhhc2h0YWdzLiBNYW55IHJlc2VhcmNoZXJzIGhhdmUgZXhwbG9yZWQgdGhlIGVhcmx5ICNNZVRvbyB0d2VldHMgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdGhpcyBtb3ZlbWVudCBpcyBhIGxlYWRpbmcgaW5kaWNhdG9yIG9mIHNvY2lldGFsIGNoYW5nZSwgYW5kIHRvIGlkZW50aWZ5IHRoZSBkZW1vZ3JhcGhpY3Mgb2YgaW5kaXZpZHVhbHMgdXNpbmcgdGhlIGhhc2h0YWcgdG8gc2VlIGhvdyBkaWZmZXJlbnQgY29tbXVuaXRpZXMgbWF5IGJlIHBhcnRpY2lwYXRpbmcgaW4gdGhlIGRpc3Vzc2lvbi4gSG93ZXZlciwgI01lVG9vIGhhcyBwb3BwZWQgYmFjayBpbnRvIHRoZSBuZXdzIG92ZXIgdGhlIHBhc3QgZmV3IG1vbnRocyBhcyBkaWZmZXJlbnQgaW5kaXZpZHVhbHMgKGUuZy4sIExvdWlzIENLLCBDaGFybGllIFJvc2UpIGhhdmUgYXR0ZW1wdGVkIHRvIHJlLWVudGVyIHRoZSBwdWJsaWMgZXllIGFuZCByZXN1bWUgdGhlaXIgY2FyZWVyc1s2XSwgYW5kIG5ld3Mgb3V0bGV0cycgZm9jdXMgaGFzIHNoaWZ0ZWQgdG8gd2hldGhlciB0aGVyZSBpcyBhIHNpZ25pZmljYW50IGJhY2tsYXNoIHRvIHRoZSBtb3ZlbWVudCBbNV1bN11bOF0uCgpOb3cgdGhhdCBpdCBpcyBhIHllYXIgbGF0ZXIsIGhvdyBoYXMgdGhlIG92ZXJhbGwgdG9uZSBhbmQgY29udGVudCBvZiAjTWVUb28gdHdlZXRzIHNoaWZ0ZWQ/IEJ5IGNvbXBhcmluZyBhIGNhY2hlIG9mIHR3ZWV0cyBmcm9tIHRoZSBlYXJseSBwYXJ0IG9mIHRoZSAjTWVUb28gbW92ZW1lbnQgdG8gbW9yZSByZWNlbnQgdHdlZXRzLCB3ZSBjYW4gYW5hbHl6ZToKCi0gV2hhdCBhcmUgc29tZSBvZiAjTWVUb28ncyBtb3JlIGNvbW1vbiBhc3NvY2lhdGVkIHdvcmRzPwotIElzIHRoZSBsYW5ndWFnZSBtb3JlIHBvc2l0aXZlIG9yIG5lZ2F0aXZlPyAKLSBPdmVyYWxsLCB3aGF0IHR5cGUgb2YgbWVzc2FnaW5nIGlzIGNvbWluZyB0aHJvdWdoIHRoZSAjTWVUb28gdHdlZXRzIGluIERlY2VtYmVyIDIwMTcgdmVyc3VzIERlY2VtYmVyIDIwMTggLS0gaGFzIHRoZSB5ZWFyIHNpbmNlIHRoZSBpbml0aWFsICNNZVRvbyBvdXRwb3VyaW5nIGNoYW5nZWQgdGhlIHR3ZWV0cyBzaWduaWZpY2FudGx5PwoKVG8gYW5zd2VyIHRoZXNlIHF1ZXN0aW9ucywgI01lVG9vIHR3ZWV0cyB3aWxsIGJlIGFuYWx5emVkIHRocm91Z2ggYW4gYXJjaGl2ZSBvZiB0d2VldHMgY29kZWQgd2l0aCB0aGUgI01lVG9vIGhhc2h0YWcgZG93bmxvYWRlZCBmcm9tIFR3aXR0ZXIuICBUaGlzIGludmVzdGlnYXRpb24gdXNlcyBhIGRhdGFzZXQgb2YgMzkwLDAwMCAjTWVUb28gdHdlZXRzIGRhdGVkIGZyb20gTm92ZW1iZXIgMjl0aCB0byBEZWNlbWJlciAyNXRoLCAyMDE3LCBkb3dubG9hZGVkIGZyb20gaHR0cHM6Ly9kYXRhLndvcmxkL2JhbGV4dHVybmVyLzM5MC0wMDAtbWV0b28tdHdlZXRzLiBJdCBhbHNvIHJlbGllcyBvbiByZWNlbnQgZGF0YSBJIHB1bGxlZCBmcm9tIHRoZSBUd2l0dGVyIEFQSSB1c2luZyBteSBvd24gYWNjb3VudCB0byByZXRyaWV2ZSB0aGUgbW9zdCByZWNlbnQgMTAsMDAwIHR3ZWV0cyB3aXRoIHRoZSBoYXNodGFnICNNZVRvbyAoc2VlIENvZGUgQXBwZW5kaXgpLgoKI0RhdGEgUHJlcGFyYXRpb24KCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGluY2x1ZGU9RkFMU0V9CmxpYnJhcnkoZ2dwbG90MikKbGlicmFyeShyZWFkcikKbGlicmFyeShkcGx5cikKbGlicmFyeShST0F1dGgpCmxpYnJhcnkodG0pCmxpYnJhcnkoc3RtKQpsaWJyYXJ5KHN0cmluZ3IpCmxpYnJhcnkodGlkeXZlcnNlKQpsaWJyYXJ5KGx1YnJpZGF0ZSkKbGlicmFyeSh3b3JkY2xvdWQpCmxpYnJhcnkoZ2d0aGVtZXMpCmxpYnJhcnkodGlkeXRleHQpCmxpYnJhcnkoZ2dzY2kpCmxpYnJhcnkoWmVsaWcpCmxpYnJhcnkobHVicmlkYXRlKQpsaWJyYXJ5KHN0cmluZ3IpCmxpYnJhcnkodGlkeXZlcnNlKQpsaWJyYXJ5KHN0bSkKbGlicmFyeSh3b3JkY2xvdWQpCmxpYnJhcnkoU25vd2JhbGxDKQpsaWJyYXJ5KFJDb2xvckJyZXdlcikKYGBgCgojIzIwMTcgc2FtcGxlIHR3ZWV0cwpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQojcmVhZCBpbiB0aGUgMjAxNyBkYXRhZmlsZQptZXRvb3R3ZWV0cyA8LSByZWFkLmNzdigiL1VzZXJzL21lcmVkaXRocG93ZXJzL0Rlc2t0b3AvbWV0b28uY3N2Iiwgc3RyaW5nc0FzRmFjdG9ycz1GQUxTRSkKaGVhZChtZXRvb3R3ZWV0cyR0ZXh0KQpgYGAKCiMjMjAxOCBzYW1wbGUgdHdlZXRzCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CiNyZWFkIGluIHRoZSAyMDE4IGRhdGFmaWxlCnR3ZWV0czIgPC0gcmVhZC5jc3YoIi9Vc2Vycy9tZXJlZGl0aHBvd2Vycy9EZXNrdG9wL21lMi5jc3YiLCBzdHJpbmdzQXNGYWN0b3JzPUZBTFNFKQpoZWFkKHR3ZWV0czIkeCkKYGBgCgojIFRleHQgQW5hbHlzaXMKIyMgV2hhdCB3b3JkcyB3ZXJlIG1vc3QgYXNzb2NpYXRlZCB3aXRoIHRoZSBNZVRvbyBtb3ZlbWVudCBvbiBUd2l0dGVyIGluIGxhdGUgMjAxNz8gCiMjIyBXaG8gZ2V0cyB0aGUgbW9zdCBAIG1lbnRpb25zIG9yIHJldHdlZXRzIHdpdGggI01lVG9vPwoKYGBge3IgZmlnLndpZHRoPTEwLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpsaWJyYXJ5KHRtKQpsaWJyYXJ5KHdvcmRjbG91ZCkKbGlicmFyeShzdHJpbmdpKQpsaWJyYXJ5KHdlc2FuZGVyc29uKQojY2xlYW4gdXAgdGhlIGRhdGEgYW5kIGNyZWF0ZSBhIGNvcnB1cwptZXRvb3R3ZWV0cyR0ZXh0IDwtIHNhcHBseShtZXRvb3R3ZWV0cyR0ZXh0LGZ1bmN0aW9uKHJvdykgaWNvbnYocm93LCAibGF0aW4xIiwgIkFTQ0lJIiwgc3ViPSIiKSkKY2xvdWQgPC0gQ29ycHVzKFZlY3RvclNvdXJjZShtZXRvb3R3ZWV0cyR0ZXh0KSkKY2xvdWQgPC0gY2xvdWQgJT4lCiAgdG1fbWFwKHJlbW92ZVB1bmN0dWF0aW9uKSAlPiUKICB0bV9tYXAoc3RyaXBXaGl0ZXNwYWNlKSAlPiUKICB0bV9tYXAocmVtb3ZlTnVtYmVycyklPiUKICB0bV9tYXAoY29udGVudF90cmFuc2Zvcm1lcih0b2xvd2VyKSkgJT4lCiAgdG1fbWFwKHJlbW92ZVdvcmRzLCBzdG9wd29yZHMoJ2VuZ2xpc2gnKSkgJT4lCiAgdG1fbWFwKHJlbW92ZVdvcmRzLCBjKCdhbXAnLCdtZXRvbycpKQojY3JlYXRlIHdvcmRjbG91ZAp3b3JkY2xvdWQoY2xvdWQsIG1heC53b3JkcyA9IDUwLCBzY2FsZSA9IGMoMywgMSksY29sb3JzPWJyZXdlci5wYWwoNCwgIkRhcmsyIiksIHJhbmRvbS5jb2xvciA9IFRSVUUsIHJhbmRvbS5vcmRlciA9IEZBTFNFKQpgYGAKCgoKCiMjV2hhdCBhYm91dCBsYXRlIDIwMTg/CiMjI0FyZSB0aGUgbW9zdCBjb21tb24gd29yZHMsIEAgbWVudGlvbnMsIGFuZCByZXR3ZWV0ZWQgcGVvcGxlIHRoZSBzYW1lIG9yIGRpZmZlcmVudD8KYGBge3IgZmlnLndpZHRoPTEwLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQojY2xlYW4gdXAgdGhlIGRhdGEgYW5kIGNyZWF0ZSBhIGNvcnB1cwp0d2VldHMyJHggPC0gc2FwcGx5KHR3ZWV0czIkeCxmdW5jdGlvbihyb3cpIGljb252KHJvdywgImxhdGluMSIsICJBU0NJSSIsIHN1Yj0iIikpCmNsb3VkMiA8LSBDb3JwdXMoVmVjdG9yU291cmNlKHR3ZWV0czIkeCkpCmNsb3VkMiA8LSBjbG91ZDIgJT4lCiAgdG1fbWFwKHJlbW92ZVB1bmN0dWF0aW9uKSAlPiUKICB0bV9tYXAoc3RyaXBXaGl0ZXNwYWNlKSAlPiUKICB0bV9tYXAocmVtb3ZlTnVtYmVycyklPiUKICB0bV9tYXAoY29udGVudF90cmFuc2Zvcm1lcih0b2xvd2VyKSkgJT4lCiAgdG1fbWFwKHJlbW92ZVdvcmRzLCBzdG9wd29yZHMoJ2VuZ2xpc2gnKSkgJT4lCiAgdG1fbWFwKHJlbW92ZVdvcmRzLCBjKCdhbXAnLCdtZXRvbycpKQojY3JlYXRlIHdvcmRjbG91ZAp3b3JkY2xvdWQoY2xvdWQyLCBtYXgud29yZHMgPSA1MCwgc2NhbGUgPSBjKDMsIDEpLGNvbG9ycz1icmV3ZXIucGFsKDQsICJQYWlyZWQiKSwgcmFuZG9tLmNvbG9yID0gVFJVRSwgcmFuZG9tLm9yZGVyID0gRkFMU0UpCmBgYAoKT25lIG9mIHRoZSBtb3JlIHN0cmlraW5nIGRpZmZlcmVuY2VzIGJldHdlZW4gMjAxNyBhbmQgMjAxOCBpcyB0aGUgZnJlcXVlbmN5IG9mIHJldHdlZXRpbmcgb3IgdHdlZXRpbmcgQCBzcGVjaWZpYyB1c2VybmFtZXMuIEluIGxhdGUgMjAxNywgYW4gb3ZlcndoZWxtaW5nIG51bWJlciBvZiB0d2VldHMgd2VyZSBkaXJlY3RlZCBhdCBvciBhYm91dCBhY3RpdmlzdCBUYXJhbmEgQnVya2UsIGFjdG9yIEFseXNzYSBNaWxhbm8sIHNvbmd3cml0ZXIvYWN0aXZpc3QgTGF1cmVuIEphdXJlZ3VpLCBTZW5hdG9yIEtyaXN0aW4gR2lsbGlicmFuZCwgYW5kIFByZXNpZGVudCBEb25hbGQgVHJ1bXAuIFRoZSB0d2VldHMgaW5jbHVkaW5nIEJ1cmtlIGFuZCBNaWxhbm8gd2VyZSBwcm9iYWJseSBwYXJ0IG9mIHRoZSBpbml0aWFsIG9uc2xhdWdodCBvZiByZXNwb25zZXM7IGEgbGl0dGxlIGRpZ2dpbmcgaW5kaWNhdGVzIHRoYXQgSmF1cmVnaSBoYXMgYmVlbiBhbiBvdXRzcG9rZW4gZmVtaW5pc3QgYWN0aXZpc3Q7IGFuZCBTZW5hdG9yIEdpbGxpYnJhbmQgc2VydmVkIGFzIHRoZSBwb2xpdGljYWwgZmFjZSBvZiB0aGUgI01lVG9vIG1vdmVtZW50IGZvciBhIHRpbWUuIFRoZSBpbmNsdXNpb24gb2YgInJlYWxkb25hbGR0cnVtcCIsICJ0cnVtcCIsICJ0cnVtcHMiLCBhbmQgInByZXNpZGVudCIgaW4gdGhlIGNvbW1vbmx5LXR3ZWV0ZWQgd29yZHMgbGlrZWx5IHN0ZW1zIGZyb20gdGhlIGFsbGVnYXRpb25zIG9mIHNleHVhbCBoYXJhc3NtZW50IGFuZCBhc3NhdWx0IGFnYWluc3QgVHJ1bXAuIE5vdGFibHksIG1vc3Qgb2YgdGhlIGVhcmx5IGluZGl2aWR1YWwgbWVudGlvbnMgYXJlIGZ1bGx5IGFic2VudCBmcm9tIHRoZSBsYXRlIDIwMTggdGV4dCBhbmFseXNpcy4gVGhlIGNvbnZlcnNhdGlvbiBzZWVtcyB0byBoYXZlIGJlY29tZSBtb3JlIGdlbmVyYWwsIHdpdGggd29yZHMgbGlrZSAiY29sbGVhZ3VlcyIgYW5kICJkaW5uZXJzIi4gVGhlIGluY3JlYXNlIGluIHRoZSB3b3JkICJmZW1hbGUiIGlzIGFsc28gaW5kaWNhdGl2ZSBvZiBhIHN1YnRsZSBzaGlmdCBpbiBob3cgVHdpdHRlciB1c2VycyByZWZlciB0byB3b21lbi4gSXQncyBpbnRlcmVzdGluZyB0aGF0IHRoZXJlIGFyZSBubyBkaXJlY3QgbWVudGlvbnMgb2YgSnVzdGljZSBCcmV0dCBLYXZhbmF1Z2ggaW4gdGhlIHRvcCA1MCB3b3JkcywgYWx0aG91Z2ggd29yZHMgbGlrZSAiY29uZ3Jlc3MiIGFuZCAidGFsYmVydHN3YW4iIG1heSBiZSByZWxhdGVkLiAoQmlzaG9wIFRhbGJlcnQgU3dhbiwgYWthIEB0YWxiZXJ0c3dhbiwgd2FzIGEgdm9jYWwgY3JpdGljIG9mIFRydW1wIGFuZCBSZXB1YmxpY2FuIENocmlzdGlhbnMgd2hvIHN1cHBvcnQgVHJ1bXAgZm9yIHBvbGl0aWNhbCByZWFzb25zOyBoZSB3YXMgcGVybWFuZW50bHkgYmFubmVkIGZyb20gVHdpdHRlciBpbiBsYXRlIEF1Z3VzdCAyMDE4IGZvciBvZmZlbnNpdmUgbGFuZ3VhZ2UgWzldKS4gT3RoZXIgd29yZHMsIGxpa2UgImF2b2lkIiBhbmQgImZha2UiIGluZGljYXRlIHBvdGVudGlhbCAjTWVUb28gYmFja2xhc2guIAoKI1NlbnRpbWVudCBBbmFseXNpcwpUbyBwZXJmb3JtIGFuIGFuYWx5c2lzIG9mIHRoZSBvdmVyYWxsIHRvbmUgYW5kIGNvbnRlbnQgb2YgdGhlICNNZVRvbyB0d2VldHMsIGVhY2ggdHdlZXTigJlzIHdvcmQgaXMgc2VwYXJhdGVkIGludG8gaXRzIG93biByb3cgYW5kIGpvaW5lZCB3aXRoIGEgc2VudGltZW50IGxpYnJhcnkuIFRoZSBOUkMgRW1vdGlvbiBMZXhpY29uIGlzIGEgbGlzdCBvZiBFbmdsaXNoIHdvcmRzIGFuZCB0aGVpciBhc3NvY2lhdGlvbnMgd2l0aCBlaWdodCBiYXNpYyBlbW90aW9ucyAoYW5nZXIsIGZlYXIsIGFudGljaXBhdGlvbiwgdHJ1c3QsIHN1cnByaXNlLCBzYWRuZXNzLCBqb3ksIGFuZCBkaXNndXN0KSBhbmQgdHdvIHNlbnRpbWVudHMgKG5lZ2F0aXZlIGFuZCBwb3NpdGl2ZSkuIFRoZSBhbm5vdGF0aW9ucyB3ZXJlIG1hbnVhbGx5IGRvbmUgYnkgY3Jvd2Rzb3VyY2luZy4gKFNlZSBodHRwczovL3NhaWZtb2hhbW1hZC5jb20vV2ViUGFnZXMvTlJDLUVtb3Rpb24tTGV4aWNvbi5odG0gZm9yIG1vcmUuKQoKIyNMYXRlIDIwMTcgI01lVG9vIFNlbnRpbWVudAoKYGBge3IgZmlnLndpZHRoPTEwLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpsaWJyYXJ5KHRpZHl2ZXJzZSkKbGlicmFyeSh0aWR5dGV4dCkKbGlicmFyeShnbHVlKQpsaWJyYXJ5KHN0cmluZ3IpCmxpYnJhcnkodmlyaWRpcykKbGlicmFyeShkcGx5cikKbWV0b290d2VldHMkdGV4dCA8LSAgc2FwcGx5KG1ldG9vdHdlZXRzJHRleHQsIGZ1bmN0aW9uKHJvdykgaWNvbnYocm93LCAnbGF0aW4xJywnQVNDSUknLHN1Yj0iIikpCm1ldG9vX3NlbnRpbWVudCA8LSBtZXRvb3R3ZWV0cyAlPiUKICB1bm5lc3RfdG9rZW5zKHdvcmQsIHRleHQpCgptZXRvb19zZW50aW1lbnRfZnJlcSA8LSBtZXRvb19zZW50aW1lbnQgJT4lCiAgaW5uZXJfam9pbihnZXRfc2VudGltZW50cygibnJjIikpICU+JSAKICBkcGx5cjo6Y291bnQoc2VudGltZW50LCBzb3J0ID0gVFJVRSkgJT4lIAogIG11dGF0ZShzZW50aW1lbnQgPSByZW9yZGVyKHNlbnRpbWVudCwgbikpICU+JSAKICBnZ3Bsb3QoYWVzKHNlbnRpbWVudCxuLCBmaWxsPXNlbnRpbWVudCkpICsgCiAgZ2VvbV9jb2woY29sb3I9J3doaXRlJywgc3RhdD0naWRlbnRpdHknKSArIAogIHRoZW1lKGF4aXMudGV4dC55PWVsZW1lbnRfYmxhbmsoKSkgKyAKICBsYWJzKHg9J1NlbnRpbWVudCcsIHk9J0ZyZXF1ZW5jeScpICsgCiAgc2NhbGVfZmlsbF92aXJpZGlzKGRpc2NyZXRlPVRSVUUsIG9wdGlvbiA9ICJDIikgKyAKICB0aGVtZSh0ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNSkpCgoKbWV0b29fc2VudGltZW50X2ZyZXEKYGBgCgojI0xhdGUgMjAxOCAjTWVUb28gU2VudGltZW50CgpgYGB7ciBmaWcud2lkdGg9MTAsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CnR3ZWV0czIkeCA8LSBzYXBwbHkodHdlZXRzMiR4LCBmdW5jdGlvbihyb3cpIGljb252KHJvdywgJ2xhdGluMScsJ0FTQ0lJJyxzdWI9IiIpKQp0d2VldHMyX3NlbnRpbWVudCA8LSB0d2VldHMyICU+JQogIHVubmVzdF90b2tlbnMod29yZCwgeCkKCnR3ZWV0czJfc2VudGltZW50X2ZyZXEgPC0gdHdlZXRzMl9zZW50aW1lbnQgJT4lCiAgaW5uZXJfam9pbihnZXRfc2VudGltZW50cygibnJjIikpICU+JSAKICBkcGx5cjo6Y291bnQoc2VudGltZW50LCBzb3J0ID0gVFJVRSkgJT4lIAogIG11dGF0ZShzZW50aW1lbnQgPSByZW9yZGVyKHNlbnRpbWVudCwgbikpICU+JSAKICBnZ3Bsb3QoYWVzKHNlbnRpbWVudCxuLCBmaWxsPXNlbnRpbWVudCkpICsgCiAgZ2VvbV9jb2woY29sb3I9J3doaXRlJywgc3RhdD0naWRlbnRpdHknKSArIAogIHRoZW1lKGF4aXMudGV4dC55PWVsZW1lbnRfYmxhbmsoKSkgKyAKICBsYWJzKHg9J1NlbnRpbWVudCcsIHk9J0ZyZXF1ZW5jeScpICsgCiAgc2NhbGVfZmlsbF92aXJpZGlzKGRpc2NyZXRlPVRSVUUsIG9wdGlvbiA9ICJtYWdtYSIpICsgCiAgdGhlbWUodGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTUpKQoKCnR3ZWV0czJfc2VudGltZW50X2ZyZXEKYGBgCgpUaGUgY2xlYXJlc3Qgc2hpZnQgaW4gc2VudGltZW50IGZyb20gMjAxNyBhbmQgMjAxOCBzZWVtcyB0byBiZSB0aGUgc3RhcmsgZGVjcmVhc2UgaW4gKnN1cnByaXNlKi4gV2hpbGUgKmRpc2d1c3QqLCAqc2FkbmVzcyosICphbnRpY2lwYXRpb24qLCBhbmQgKnRydXN0KiBzZWVtIHRvIGhvbGQgc3RlYWR5IGluIHRoZWlyIHByb3BvcnRpb25hbCBzaGFyZSBvZiB0aGUgb3ZlcmFsbCBzZW50aW1lbnQsIHRoZSBmZWVsaW5ncyBvZiAqZmVhciogYW5kICphbmdlciogc2VlbSB0byBzd2l0Y2ggcGxhY2VzLgoKCiMgRnJlcXVlbmN5IG9mIDIwMTcgTW9zdC1Ud2VldGVkICNNZVRvbyBXb3JkcyBieSBTZW50aW1lbnQKYGBge3IgZmlnLndpZHRoPTEwLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQptZXRvb19zZW50aW1lbnRfZnJlcTIgPC0gbWV0b29fc2VudGltZW50ICU+JQogIGlubmVyX2pvaW4oZ2V0X3NlbnRpbWVudHMoIm5yYyIpKSAlPiUKICBkcGx5cjo6Y291bnQod29yZCwgc2VudGltZW50LCBzb3J0ID0gVFJVRSkgJT4lCiAgZ3JvdXBfYnkoc2VudGltZW50KSAlPiUKICB0b3BfbigxMCkgJT4lCiAgdW5ncm91cCgpICU+JQogIG11dGF0ZSh3b3JkID0gcmVvcmRlcih3b3JkLCBuKSkgJT4lCiAgZ2dwbG90KGFlcyh3b3JkLCBuLCBmaWxsID0gc2VudGltZW50KSkgKyAKICBnZW9tX2NvbChzaG93LmxlZ2VuZD1GQUxTRSwgc3RhdD0naWRlbnRpdHknKSArIAogIGZhY2V0X3dyYXAofnNlbnRpbWVudCwgc2NhbGVzPSdmcmVlX3knLCBucm93PTMpICsgCiAgbGFicyh5ID0gTlVMTCwgeCA9IE5VTEwpICsgCiAgY29vcmRfZmxpcCgpICsgCiAgdGhlbWVfY2FsYygpICsgCiAgc2NhbGVfZmlsbF92aXJpZGlzKGRpc2NyZXRlPVRSVUUsIG9wdGlvbiA9ICJDIikgKyAKICB0aGVtZSh0ZXh0ID0gZWxlbWVudF90ZXh0KHNpemU9MTApKQoKCm1ldG9vX3NlbnRpbWVudF9mcmVxMgpgYGAKCgojIEZyZXF1ZW5jeSBvZiAyMDE4IE1vc3QtVHdlZXRlZCAjTWVUb28gV29yZHMgYnkgU2VudGltZW50CgpgYGB7ciBmaWcud2lkdGg9MTAsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CnR3ZWV0czJfc2VudGltZW50X2ZyZXEyIDwtIHR3ZWV0czJfc2VudGltZW50ICU+JQogIGlubmVyX2pvaW4oZ2V0X3NlbnRpbWVudHMoIm5yYyIpKSAlPiUKICBkcGx5cjo6Y291bnQod29yZCwgc2VudGltZW50LCBzb3J0ID0gVFJVRSkgJT4lCiAgZ3JvdXBfYnkoc2VudGltZW50KSAlPiUKICB0b3BfbigxMCkgJT4lCiAgdW5ncm91cCgpICU+JQogIG11dGF0ZSh3b3JkID0gcmVvcmRlcih3b3JkLCBuKSkgJT4lCiAgZ2dwbG90KGFlcyh3b3JkLCBuLCBmaWxsID0gc2VudGltZW50KSkgKyAKICBnZW9tX2NvbChzaG93LmxlZ2VuZD1GQUxTRSwgc3RhdD0naWRlbnRpdHknKSArIAogIGZhY2V0X3dyYXAofnNlbnRpbWVudCwgc2NhbGVzPSdmcmVlX3knLCBucm93PTMpICsgCiAgbGFicyh5ID0gTlVMTCwgeCA9IE5VTEwpICsgCiAgY29vcmRfZmxpcCgpICsgCiAgdGhlbWVfY2FsYygpICsgCiAgc2NhbGVfZmlsbF92aXJpZGlzKGRpc2NyZXRlPVRSVUUsIG9wdGlvbiA9ICJtYWdtYSIpICsgCiAgdGhlbWUodGV4dCA9IGVsZW1lbnRfdGV4dChzaXplPTEwKSkKCgp0d2VldHMyX3NlbnRpbWVudF9mcmVxMgpgYGAKClRoZSBwcm9wb3J0aW9uIG9mIHBvc2l0aXZlbHkgcmVsYXRlZCB3b3JkcyBpcyBhIGxpdHRsZSBzdXJwcmlzaW5nLCBhbHRob3VnaCBpdCBjb3VsZCBiZSBleHBsYWluZWQgYnkgdGhlIG92ZXJhbGwgdG9uZSBvZiAjTWVUb28sIHdoaWNoIGhhcyBiZWVuIG9uZSBvZiBlbXBvd2VybWVudCBmb3IgdmljdGltcyBvZiBzZXh1YWwgYXNzYXVsdC4gSG93ZXZlciwgYWZ0ZXIgc2VlaW5nIHRoZSBicmVhayBkb3duIGluIHdvcmRzIHVuZGVyIGVhY2ggc2VudGltZW50IGNhdGVnb3J5LCB0aGUgb3ZlcmFsbCB2YWxpZGl0eSBvZiB1c2luZyB0aGUgc2VudGltZW50IGxpYnJhcnkgaXMgc29tZXdoYXQgdW5kZXJtaW5lZC4KCiNEaXNjdXNzaW9uCgpJdCBpcyBwb3NzaWJsZSB0byBzdHVkeSBzb2NpZXRhbCBzaGlmdHMgaW4gaG93IHdlIGRpc2N1c3Mgc2V4dWFsIGFzc2F1bHQgYW5kIGhhcmFzc21lbnQgdXNpbmcgcHVibGljbHkgYXJjaGl2ZWQgb3IgaGFydmVzdGVkIFR3aXR0ZXIgZGF0YTsgbGlrZXdpc2UgaXQgaXMgcG9zc2JpYmxlIHRvIGFuYWx5c3plIHRoZSBvdmVyYWxsIHRvbmUgYW5kIGNvbnRlbnQgb2YgdHdlZXRzIHVzaW5nIHRoZSAqdGlkeXRleHQqIGVjb3N5c3RlbS4gCgpDb21wYXJpbmcgc29tZSBvZiAjTWVUb28ncyBtb3JlIGNvbW1vbiBhc3NvY2lhdGVkIHdvcmRzIGluIDIwMTcgdmVyc3VzIDIwMTggc3VnZ2VzdCB0aGF0IHRoZSBpbml0aWFsIG91dHBvdXJpbmcgb2YgcGVyc29uYWwgdHdlZXRzIGF0IGhpZ2gtcHJvZmlsZSBpbmRpdmlkdWFscyBoYXMgc3Vic2lkZWQgYW5kIHRoZSBUd2l0dGVyIGNvbnZlcnNhdGlvbiBhYm91dCBzZXh1YWwgaGFyYXNzbWVudCBoYXMgc2hpZnRlZCB0byBtb3JlIGdlbmVyYWwgZGlzY3Vzc2lvbnMuIFRoZSBlbW90aW9uYWwgc2VudGltZW50IG9mIHRoZSBsYW5ndWFnZSBpbiAyMDE3IGFuZCAyMDE4IGlzIHNpbWlsYXIsIGFsdGhvdWdoIGZlZWxpbmdzIG9mICphbmdlciogYW5kICpzdXJwcmlzZSogc2VlbSB0byBoYXZlIHJlY2VkZWQgc29tZXdoYXQsIHdoaWxlICpmZWFyKiBzZWVtcyB0byBoYXZlIGluY3JlYXNlZCBvdmVyIHRoZSBwYXN0IHllYXIuICAKCk9uIHRoZSBvdGhlciBoYW5kLCBzZW50aW1lbnQgbGlicmFyaWVzIGhhdmUgc29tZSBmdW5kYW1lbnRhbCBkcmF3YmFja3MsIGFuZCBpbmRpdmlkdWFsIGp1ZGdlbWVudCBpcyBuZWVkZWQgdG8gcHJvdmlkZSBjb250ZXh0IHdoZW4gaW50ZXJwcmV0aW5nIHJlc3VsdHMuIFdvcmRzIGxpa2UgInNleCIgYW5kICJmZW1hbGUiIGFyZSBjb2RlZCBwb3NpdGl2ZWx5IGluIHRoZSBOUkMgc2VudGltZW50IGxpYnJhcnkgKGFuZCBmdXJ0aGVyIGV4cGxvcmF0aW9uIG9mIHRoZSBCaW5nIGFuZCBBRklOTiBsaWJyYXJpZXMgc3VnZ2VzdCB0aGV5IGhhdmUgc2ltaWxhciBjbGFzc2lmaWNhdGlvbnMpLCBhbHRob3VnaCBib3RoIG9mIHRoZXNlIHdvcmRzIG1heSBub3QgYWN0dWFsbHkgaGF2ZSBwb3NpdGl2ZSBjb25ub3RhdGlvbnMgaW4gdGhlIGNvbnRleHQgb2Ygc2V4dWFsIGhhcmFzc21lbnQgYWdhaW5zdCB3b21lbi4gQW5vdGhlciBleGFtcGxlIGlzIHRoZSB3b3JkICJwcm9mZXNzb3IiIGFwcGVhcmluZyBpbiB0aGUgKnRydXN0KiBjYXRlZ29yeSAtLSBnaXZlbiB0aGUgbmF0dXJlIG9mIHNvbWUgdHdlZXRzIGFib3V0IGV4cGVyaWVuY2Ugc2V4dWFsIGFzc2F1bHQgKmJ5KiBwcm9mZXNzb3JzIHBvaW50cyBtb3JlIHRvIGFuIGFidXNlIG9yIGxhY2sgb2YgdHJ1c3QgcmF0aGVyIHRoYW4gYW4gb3ZlcmFsbCBmZWVsaW5nIG9mIHRydXN0LiBGdXJ0aGVybW9yZSwgdGhlIHdvcmRzICJibGFjayIgYW5kICJ3aGl0ZSIgYXBwZWFyIGluIHRoZSBuZWdhdGl2ZSBhbmQgcG9zaXRpdmUgY2F0ZWdvcmllcyByZXNwZWN0aXZlbHk7IHdpdGhvdXQga25vd2luZyB3aHkgdGhlIHNlbnRpbWVudCBjbGFzc2VkIHRoZXNlIHdvcmRzIHRoaXMgd2F5LCBpdCdzIHByb2JhYmx5IGJlc3QgdG8gY29uc2lkZXIgdGhlc2Ugd29yZHMgbmV1dHJhbGx5IGluIGFuIG92ZXJhbGwgc2VudGltZW50IGFuYWx5c2lzLiBJbiB0aGUgY29udGV4dCBvZiB0aGUgI01lVG9vIHR3ZWV0cywgImJsYWNrIiBhbmQgIndoaXRlIiBjb3VsZCByZWZlciB0byByYWNlIG9yIGEgY29tbW9uIHBocmFzZSBsaWtlICJibGFjayBhbmQgd2hpdGUgdGhpbmtpbmciLCBidXQgSSdtIG5vdCBzdXJlIHdoYXQgaXQgbWVhbnMgaW4gdGhlIGNvbnRleHQgb2YgdGhlIG9yaWdpbmFsIE5SQyBzZW50aW1lbnQgY3Jvd2Rzb3VyY2luZy4KCgojIEZ1dHVyZSBEaXJlY3Rpb25zClR3ZWV0cyBhcmUgb25lIHdheSB0byB1bmRlcnN0YW5kIHRoZSBpbnRlcm5hdGlvbmFsIGNvbnZlcnNhdGlvbiBhYm91dCBzZXh1YWwgaGFyYXNzbWVudDsgc2Nob2xhcmx5IGpvdXJuYWxzIGFyZSBhbm90aGVyIHdheSB0byBzdHVkeSB0aGUgd2F5IHdlIHZpZXcgdGhlIHBoZW5vbmVtb20uIFRoZSBmb2xsb3dpbmcgZGF0YSBpcyBhbiBpbml0aWFsIGV4cGxvcmF0aW9uIG9mIHdoZW4gYW5kIGhvdyBzZXh1YWwgaGFyYXNzbWVudCBpcyBzdHVkaWVkLgoKIyNQTG9TIFRleHR1YWwgQW5hbHlzaXMgb2YgU2V4dWFsIEhhcmFzc21lbnQKCmBgYHtyIGZpZy53aWR0aD0xMCwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KbGlicmFyeShycGxvcykKbGlicmFyeShnZ3Bsb3QyKQpwbG90X3Rocm91Z2h0aW1lKHRlcm1zID0gJyJzZXh1YWwgaGFyYXNzbWVudCInLCBsaW1pdCA9IDgwMCkgKyBnZW9tX2xpbmUoc2l6ZT0yLCBjb2xvcj0nI2NjMDA2NicpCmBgYAoKIyNhUnhpdiBUZXh0dWFsIEFuYWx5c2lzIG9mIFNleHVhbCBIYXJhc3NtZW50CgpXaGVuIHdlcmUgcGFwZXJzIHJlbGF0ZWQgdG8gc2V4dWFsIGhhcmFzc21lbnQgc3VibWl0dGVkIHRvIGFSeGl2PwpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQojcmV0cmlldmUgYXJ0aWNsZXMKbGlicmFyeShhUnhpdikKbWV0b29fYXJ0aWNsZXMgPC0gYXJ4aXZfc2VhcmNoKHF1ZXJ5ID0gJyJzZXh1YWwgaGFyYXNzbWVudCInLCBsaW1pdCA9IDgwMCkKI2NsZWFuIHVwIGRhdGVzCmxpYnJhcnkobHVicmlkYXRlKQptZXRvb19hcnRpY2xlcyA8LSBtZXRvb19hcnRpY2xlcyAlPiUKICBtdXRhdGUoc3VibWl0dGVkID0geW1kX2htcyhzdWJtaXR0ZWQpLCB1cGRhdGVkID0geW1kX2htcyh1cGRhdGVkKSkKIyBXaGVuIHdlcmUgdGhlc2Ugc3VibWl0dGVkPwp4dGFicyh+IHllYXIoc3VibWl0dGVkKSwgZGF0YSA9IG1ldG9vX2FydGljbGVzKQpgYGAKCldoZW4gZmllbGRzIHdlcmUgdGhleSBwdWJsaXNoZWQgdW5kZXI/CmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CiN3aGF0IGZpZWxkcyB3ZXJlIHRoZXkgc3VibWl0dGVkIGluPwptZXRvb19hcnRpY2xlcyAgJT4lCiAgbXV0YXRlKGZpZWxkID0gc3RyX2V4dHJhY3QocHJpbWFyeV9jYXRlZ29yeSwgIl5bYS16LC1dKyIpKSAgJT4lCiAgbW9zYWljOjp0YWxseSh4ID0gfmZpZWxkKSAgJT4lCiAgc29ydCgpCmBgYAoKR2l2ZW4gdGhhdCB0aGVyZSBhcmUgb25seSA2IHB1Ymxpc2hlZCBhcnRpY2xlcywgd2hhdCBhcmUgdGhlaXIgdGl0bGVzPwpgYGB7cn0KIyBTaW5jZSB0aGVyZSBhcmUgb25seSBzaXggaW4gdG90YWwsIGxldCdzIGxvb2sgYXQgZWFjaCB0aXRsZSB0byBkZXRlcm1pbmUgdGhlIHNwZWNpZmljIGZvY3VzIG9mIGVhY2gKaGVhZChtZXRvb19hcnRpY2xlcyR0aXRsZSkKYGBgCgpXaGlsZSBib3RoIG9mIHRoZXNlIGRhdGFzZXRzIGFyZSB0b28gc21hbGwgdG8gYmUgcGFydGljdWxhcmx5IHZhbHVhYmxlLCB0aGV5IGRvIHBvaW50IHRvIHRyZW5kcy4gVGhlIFBMb1MgdGltZWxpbmUgaW5kaWNhdGVzIHZlcnkgbGl0dGxlIGludGVyZXN0IGluIHNleHVhbCBoYXJhc3NtZW50IGFzIGEgdG9waWMgb2Ygc3R1ZHkgcHJpb3IgdG8gMjAxMjsgdGhlIG51bWJlciBvZiBhcnRpY2xlcyBpcyBzdGlsbCBzbWFsbCBpbiAyMDE4IGJ1dCBpdCBhIHN0ZWFkeSBpbmNyZWFzZS4gTGlrZXdpc2UsIHRoZSAqYVJ4aXYqIGRhdGEgcG9pbnRzIHRvIGEgcG90ZW50aWFsbHkgb3BlbiBhbmQgYnVyZ2VvbmluZyBhcmVhIG9mIHJlc2VhcmNoIGluIENvbXB1dGVyIFNjaWVuY2U6IHN0dWR5aW5nIGhhcmFzc21lbnQgYnkgYW5hbHl6aW5nIHRleHR1YWwgZGF0YS4gCgojUmVmZXJlbmNlcwpbMV0gQW5kZXJzb24sIE0uLCAmIFRvb3IsIFMuICgyMDE4LCBPY3RvYmVyIDExKS4gSG93IHNvY2lhbCBtZWRpYSB1c2VycyBoYXZlIGRpc2N1c3NlZCBzZXh1YWwgaGFyYXNzbWVudCBzaW5jZSAjTWVUb28gd2VudCB2aXJhbC4gUmV0cmlldmVkIGZyb20gaHR0cDovL3d3dy5wZXdyZXNlYXJjaC5vcmcvZmFjdC10YW5rLzIwMTgvMTAvMTEvaG93LXNvY2lhbC1tZWRpYS11c2Vycy1oYXZlLWRpc2N1c3NlZC1zZXh1YWwtaGFyYXNzbWVudC1zaW5jZS1tZXRvby13ZW50LXZpcmFsLwoKWzJdIEdlb3JnZXRvd24gVW5pdmVyc2l0eS4gKDIwMTgsIFNlcHRlbWJlciAxMCkuICNNZVRvbyBNb3ZlbWVudCBUd2l0dGVyIERhdGEgTWluZWQgYnkgQ29tcHV0ZXIgU2NpZW5jZSBQcm9mZXNzb3IuIFJldHJpZXZlZCBmcm9tIGh0dHBzOi8vd3d3Lmdlb3JnZXRvd24uZWR1L25ld3MvbWV0b28tbW92ZW1lbnQtdHdpdHRlci1kYXRhLW1pbmVkLWJ5LWNvbXB1dGVyLXNjaWVuY2UtcHJvZmVzc29yCgpbM10gS3Vuc3QsIEouIFIuLCBCYWlsZXksIEEuLCBQcmVuZGVyZ2FzdCwgQy4sICYgR3VuZGVyc2VuLCBBLiAoMjAxOCkuIFNleGlzbSwgcmFwZSBteXRocyBhbmQgZmVtaW5pc3QgaWRlbnRpZmljYXRpb24gZXhwbGFpbiBnZW5kZXIgZGlmZmVyZW5jZXMgaW4gYXR0aXR1ZGVzIHRvd2FyZCB0aGUjIG1ldG9vIHNvY2lhbCBtZWRpYSBjYW1wYWlnbiBpbiB0d28gY291bnRyaWVzLiBNZWRpYSBQc3ljaG9sb2d5LCAxLTI2LgoKWzRdIE1hbmlrb25kYSwgTC4sIEJlaWdpLCBHLiwgTGl1LCBILiwgJiBLYW1iaGFtcGF0aSwgUy4gKDIwMTgpLiBUd2l0dGVyIGZvciBTcGFya2luZyBhIE1vdmVtZW50LCBSZWRkaXQgZm9yIFNoYXJpbmcgdGhlIE1vbWVudDojIG1ldG9vIHRocm91Z2ggdGhlIExlbnMgb2YgU29jaWFsIE1lZGlhLiBhclhpdiBwcmVwcmludCBhclhpdjoxODAzLjA4MDIyLgoKWzVdIFBhcmtlciwgSy4gKDIwMTgsIERlY2VtYmVyIDYpLiBXb21lbiBzdGFydGluZyB0byBzdWZmZXIgdGhlICNNZVRvbyBiYWNrbGFzaC4gUmV0cmlldmVkIGZyb20gaHR0cHM6Ly93d3cucG9zdGFuZGNvdXJpZXIuY29tL29waW5pb24vY29tbWVudGFyeS93b21lbi1zdGFydGluZy10by1zdWZmZXItdGhlLW1ldG9vLWJhY2tsYXNoL2FydGljbGVfZmM5ODE1NzYtZjk3ZC0xMWU4LTgyMDctOTdhNGVkMGFlM2QzLmh0bWwKCls2XVJvYmVydHMsIEQuICgyMDE4LCBTZXB0ZW1iZXIgMTIpLiBXaGF0IHNvIG1hbnkgbWVuIGFyZSBtaXNzaW5nIGFib3V0ICNNZVRvby4gUmV0cmlldmVkIGZyb20gaHR0cHM6Ly93d3cudm94LmNvbS8yMDE4LzkvMTAvMTc4MjYxNjgvbWUtdG9vLWxvdWlzLWNrLW1lbi1jb21lYmFjawoKWzddIFRhbiwgRy4sICYgUG9yemVjYW5za2ksIEsuICgyMDE4LCBEZWNlbWJlciAzKS4gV2FsbCBTdHJlZXQgUnVsZSBmb3IgdGhlICNNZVRvbyBFcmE6IEF2b2lkIFdvbWVuIGF0IEFsbCBDb3N0LiBSZXRyaWV2ZWQgZnJvbSBodHRwczovL3d3dy5ibG9vbWJlcmcuY29tL25ld3MvYXJ0aWNsZXMvMjAxOC0xMi0wMy9hLXdhbGwtc3RyZWV0LXJ1bGUtZm9yLXRoZS1tZXRvby1lcmEtYXZvaWQtd29tZW4tYXQtYWxsLWNvc3QKCls4XSBUaGUgRWNvbm9taXN0LiAoMjAxOCwgT2N0b2JlciAyMCkuIE1lYXN1cmluZyB0aGUgI01lVG9vIGJhY2tsYXNoLiBSZXRyaWV2ZWQgZnJvbSBodHRwczovL3d3dy5lY29ub21pc3QuY29tL3VuaXRlZC1zdGF0ZXMvMjAxOC8xMC8yMC9tZWFzdXJpbmctdGhlLW1ldG9vLWJhY2tsYXNoCgpbOV0gQmFua3MsIEEuICgyMDE4LCBBdWd1c3QgMjgpLiBCbGFjayBiaXNob3Agc2F5cyBUd2l0dGVyIHN1c3BlbmRlZCBoaW0gZm9yIOKAnGhhdGVmdWwgY29uZHVjdC7igJ0gUmV0cmlldmVkIGZyb20gaHR0cHM6Ly9yZWxpZ2lvbm5ld3MuY29tLzIwMTgvMDgvMjgvYmxhY2stYmlzaG9wLWFuZC10cnVtcC1jcml0aWMtc2F5cy10d2l0dGVyLXN1c3BlbmRlZC1hY2NvdW50LWZvci1oYXRlZnVsLWNvbmR1Y3Qv