# INFO 659 Introduction to Data Analytics
# Velena McHugh
# Assignment #1 on Problem Understanding and Data Exploration
# I. Think Business: Framing the business problem:
# Several authors highlighted insufficient evidence on women's health experiences in the midlife and their health-maintaining and health-seeking behavior (Woods, Johnson-Mallard, & Taylor, 2016). Woods et al. (2016) defined midlife women as women of 45-64 years of age and noted that midlife is an important period for health promotion activities in order to prevent or delay the onset of chronic and age-related diseases, such as cardiovascular conditions, cancer, depression, and others.
#To accelerate knowledge dissemination, the Institute of medicine (IOM) recommended the development of evidence-based strategies to market research findings directly to consumers. Thus, the implementation of new communication and social networking technologies and development of trusted sources with reliable information and decision assistance is a matter of great importance (IOM, 2010; Shaver et al, 2013).
#To address these needs, I decided to explore dissemination of health-related information on Internet, specifically on YouTube. YouTube has become a great platform for people to give tips and tricks for various things as well as living a healthy lifestyle and increasingly used as a source of health-related information that may influence health decision making. For this reason, I determine YouTube to be an adequate social media platform to conduct my research on dissemination of health-related information.
#The purpose of my project is to determine the best way to disseminate health information to middle-aged women within the YouTube video network. Through my research, I hope to uncover a deeper understanding on the potential influence of YouTube on women’s health. As women’s health is a very broad category that encompasses a multitude of different domains, I narrowed down my research to the information about menopause and other closely related topic.
# My research questions include:
#1. What factors determine success and popularity within the YouTube?
#2. Which menopause related topics are most popular?
#3. Who are the opinion leaders that could effectively disseminate health-related information on YouTube?
#4. What kind of video content attracts more users?
## Understand Data: Data source identification and understanding (2 points)
#Concept of learning:
#To get insight into what kind of videos attract more users and generate more responses, their ranks in popularity, and influence, I want to identify what factors determine the popularity of YouTube videos (number of views) based on other video attributes, such as favoring (likes/dislikes), number of comments, date of creation (age of the video), themes of content (i.e. wellness, nutrition, disease-focused, prevention, etc.), types of actors/channels (i.e. private individual, education, government, medical professional, non-medical professional, for-profit, non-profit, media, unable to determine, spam).
#Data attributes:
#I used the NodeXL plugin to import data from the YouTube video network. An extraction of a video network is based on the metadata used to label the video contents such as titles, tags, descriptions, and categories. As the YouTube search engine matches keywords against all types of video descriptors, I used the free keyword tool on wordstream.com for e-marketers to identify most popular keywords that are specific to menopause? Such as menopause, night sweats, perimenopause, hot flashes, hrt.
#Using a search function in the NodeXL, I collected the sample of 100 videos containing the identified keywords in their descriptors. The data set includes one worksheet in CVS format. The worksheet is populated with information about each of the individual videos attributes such as Title (categorical/character), Author (categorical/character), creation date (numeric), and a number of views, comments, likes, and dislikes (numeric/integer). The additional column of the table provides web-links to the analyzed videos (categorical).
#The Title may help to identify themes of content. The Author may help to identify types of actors/channels. However, there might be a need to watch the videos to identify themes, to develop codebook categories, and classify the authors with respect to their type. Creation data include date data regarding year, month, day, hour, minute, and second of video creation. These data will help to calculate the “age” of video by subtracting the date of video upload from current date. The longer the video is on YouTube, the more views it acquires over time. Therefore, it is important to adjust our model based on the variable “age if the video.” My hypothesis that the numbers of views, comments, likes, and dislikes have interdependent relationships. The number of views, comments, likes, and dislikes may promote the popularity of a video (a number of views) through some in-build YouTube algorithm.
# Data instances
# Why_ Cant_ You_ Lose_ Weight_ During_ Menopause (title), Dr_Eric_ Berg_ DC (author), 2017-10-04T10:49:25.000Z (created date(UTC)), 66,720 (views), 121 (comments), 1,418 (likes.count), 33 (dislikes count), https://www.youtube.com/watch?v=Tbb9yg_h9PU (custom.menu)
# Surviving_to_Thriving_Cynthia Thurlow_TEDxTrinityBellwoodsWomen (title), TEDx Talks (author), 2019-02-12T16:28:12.000Z, (created date(UTC)), 39,357 (views), 16 (comments), 463 (likes.count), 33 (dislikes count), https://www.youtube.com/watch?v=Tbb9yg_h9PU (custom.menu)
#3. Data in Action: Data preparation, visualization, and exploration
#3.A. Data preparation and loading:
setwd("~/drexel_masters/data/INFO659")
menopause <- read.table("women.csv", sep=",", header = TRUE, quote = "")
head(menopause, 5)
#3.B. Data distribution and anomalies
hist(menopause$Views, breaks=50, xlab="Views", main="Menopause Video Views") # producing histogram for the number of views
# The values of the variable ranged from 0 to more than 1,500,000. The histogram shape is skewed to the left. Near 80% of videos is in the group with less than 50, 000 views. Near 99% of videos has numbers of views under 500, 000. The accounts with values of more than 1,500,000 cannot be considered as outliers. These are expected values. Therefore, these accounts should be retained for further analyses.
hist(menopause$Comments, breaks=30, xlab="Comments", main="Menopause Video comments") # producing histogram for the number of comments
# The values of the variable “comments” ranged from 0 to more than 1,200. The histogram shape is skewed to the left. Near 70% of videos is in the group with less than 50 comments. Near 95% of videos has numbers of comments under 450. The accounts with values of more than 1,200 cannot be considered as outliers. These are expected values. Therefore, these accounts should be retained for further analysis.
hist(menopause$Likes.Count, breaks=30, xlab="Likes", main="Menopause Video likes") # producing histogram for the number of likes
# The values of the variable “likes” ranged from 0 to more than 25,000. The histogram shape is skewed to the left. Near 80% of videos is in the group with less than 1,000 likes. More than 95% of videos has numbers of comments under 6,000. The accounts with values of more than 25,000 cannot be considered as outliers. These are realistic values. Therefore, these accounts should be retained for further analysis.
hist(menopause$Dislikes.Count, breaks=30, xlab="Dislikes", main="Menopause Video dislikes") # producing histogram for the number of dislikes
# The values of the variable “dislikes” ranged from 0 to more than 1,200. The histogram shape is skewed to the left. More than 90% of videos are in the group with less than 50 dislikes. More than 90% of videos has numbers of dislikes under 200. The accounts with values of more than 1,200 cannot be considered as outliers. These are realistic values. Therefore, these accounts should be retained for further analysis.
#3.C. Data distribution with log transformation
# All above histograms ae skewed to the left side. The Dislikes histogram showed the most skewed distribution with more than 90% of videos is in first left column.
hist(log10(menopause$ Dislikes.Count), breaks=30, xlab="Dislikes", main="Menopause Video Dislikes: with log transformation")
# The shape of the log histogram is closer to normal distribution (a bell curve shape) with two unusual “spikes” between 0.0 and 0.1 values and between 0.6 and 0.7 values and a big depression between 2.5 and 3.1 values
#3.D. Examining multiple variables and regression
# The number of comments (attribute X) reflects the quality of video content through engagement of the audience. Thus, it can affect the popularity of the video that is determined by the numbers of views (attribute Y) through the action of the YouTube algorithm.
plot(menopause$Comments, menopause$Views, xlab="Comments", ylab="Views") # Producing a scatter plot between attributeX and the attributeY variables
myline <- lm(menopause$Views ~ menopause$Comments) # Conducting linear regression on attribute Y to be modeled by attribute X using the lm() function and assigning the result model to a variable
points(menopause$Comments, myline$coefficients[ 1 ] + myline$coefficients[ 2 ] * menopause$Comments, type="l", col="red") # Adding the regression line to the scatter plot
# The linear regression line captures some positive linear relations between the two variables. The points on the scatterplot follow a somewhat straight-line pattern. The points incline upwards to the right. As x values (the numbers of comments) increase, y values (the numbers of view) increase too. However, the visual analysis of residuals (the differences between the observed data value and the values on the straight line) suggests that this linear model has a tendency to over-predict the number of views for the range of 500-700 comments. Also, it may significantly under-predict the number of views or not be applicable at all for the number of comments above 1,200. There is no data available for the range of comments between 700 and 1,200.
#4. Discussion, understanding, and planning
# The exploratory analysis revealed that the data set has a good quality of data that do not require cleansing or corrections. All data are within the normal range.
# However, the visual analysis revealed that data distributions for numeric values such as the number of views, comments, likes, and dislikes are skewed to the left side and show big depressions between the maximum values and the rest of the values on the right side.
# Left-sided skewedness can be addressed with log transformation.
# The depressions on the right side may represent missing data. The possible “fix” is to obtain the larger sample that would give more data instances (rows).
# The number of views, comments, likes, and dislikes may promote the popularity of videos through the action of the YouTube algorithm. However, these attributes are insufficient to provide insight on what kind of video or what topics attract more viewers. The popularity of the video may also depend on reputability and trustfulness of the channel/author.
# The values of attributes “Title” and “Author” do not provide sufficient information to categorize topics of the videos and estimate the quality of videos and reputability and trustfulness of sources. Thus, the numeric analysis should be supplemented with the analysis of the video content.
# The analysis of the video content is a very time-consuming endeavor. The lack of time may impose some constraints to the sample size. Finding the “right” number of data instances that would ensure the development of the effective and reliable analytic model within a realistic timeline may determine success of this project.
# The analysis of relationships between the number of views and the number of comments showed that the linear model is suitable for the modeling. Similar relationships might be observed with other variables, such as likes, dislikes, and dates of creation.
#References
#Harris, J. K., Moreland-Russel, S., Tabak, R. G., Ruhr, L. R., & Maier, R. C. (2014). Communication about childhood obesity on Twitter. American Journal of Public Health, 104(7), e62–e69. doi:10.2105/AJPH.2013.301860)
#Institute of Medicine. (2010). Women’s Health Research: Progress, pitfalls, and promise. Washington (DC): The National Academies Press.
#Shaver, J., Olshansky, E., & Woods, N. F. (2013). Women’s health research agenda for the next decade. A report by the Women’s Health Expert Panel of the American Academy of Nursing. Nursing Outlook, 61(1), 16-24. doi: 10.1016/j.outlook.2012.05.009.
#Woods, N. F., Johnson-Mallard, W., & Taylor, D. (2016). Who cares for midlife women? Journal of Women’s Health, 25(12), 1195-1197. doi: 10.1089/jwh.2016.6168
LS0tDQp0aXRsZTogIklORk82NTlBMSINCm91dHB1dDogaHRtbF9ub3RlYm9vaw0KLS0tDQpgYGB7cn0NCiMgSU5GTyA2NTkgSW50cm9kdWN0aW9uIHRvIERhdGEgQW5hbHl0aWNzDQojIFZlbGVuYSBNY0h1Z2gNCiMgQXNzaWdubWVudCAjMSBvbiBQcm9ibGVtIFVuZGVyc3RhbmRpbmcgYW5kIERhdGEgRXhwbG9yYXRpb24NCg0KYGBgDQoNCmBgYHtyfQ0KIyBJLiBUaGluayBCdXNpbmVzczogRnJhbWluZyB0aGUgYnVzaW5lc3MgcHJvYmxlbToNCiMgU2V2ZXJhbCBhdXRob3JzIGhpZ2hsaWdodGVkIGluc3VmZmljaWVudCBldmlkZW5jZSBvbiB3b21lbidzIGhlYWx0aCBleHBlcmllbmNlcyBpbiB0aGUgbWlkbGlmZSBhbmQgdGhlaXIgaGVhbHRoLW1haW50YWluaW5nIGFuZCBoZWFsdGgtc2Vla2luZyBiZWhhdmlvciAoV29vZHMsIEpvaG5zb24tTWFsbGFyZCwgJiBUYXlsb3IsIDIwMTYpLiBXb29kcyBldCBhbC4gKDIwMTYpIGRlZmluZWQgbWlkbGlmZSB3b21lbiBhcyB3b21lbiBvZiA0NS02NCB5ZWFycyBvZiBhZ2UgYW5kIG5vdGVkIHRoYXQgbWlkbGlmZSBpcyBhbiBpbXBvcnRhbnQgcGVyaW9kIGZvciBoZWFsdGggcHJvbW90aW9uIGFjdGl2aXRpZXMgaW4gb3JkZXIgdG8gcHJldmVudCBvciBkZWxheSB0aGUgb25zZXQgb2YgY2hyb25pYyBhbmQgYWdlLXJlbGF0ZWQgZGlzZWFzZXMsIHN1Y2ggYXMgY2FyZGlvdmFzY3VsYXIgY29uZGl0aW9ucywgY2FuY2VyLCBkZXByZXNzaW9uLCBhbmQgb3RoZXJzLiANCg0KI1RvIGFjY2VsZXJhdGUga25vd2xlZGdlIGRpc3NlbWluYXRpb24sIHRoZSBJbnN0aXR1dGUgb2YgbWVkaWNpbmUgKElPTSkgcmVjb21tZW5kZWQgdGhlIGRldmVsb3BtZW50IG9mIGV2aWRlbmNlLWJhc2VkIHN0cmF0ZWdpZXMgdG8gbWFya2V0IHJlc2VhcmNoIGZpbmRpbmdzIGRpcmVjdGx5IHRvIGNvbnN1bWVycy4gVGh1cywgdGhlIGltcGxlbWVudGF0aW9uIG9mIG5ldyBjb21tdW5pY2F0aW9uIGFuZCBzb2NpYWwgbmV0d29ya2luZyB0ZWNobm9sb2dpZXMgYW5kIGRldmVsb3BtZW50IG9mIHRydXN0ZWQgc291cmNlcyB3aXRoIHJlbGlhYmxlIGluZm9ybWF0aW9uIGFuZCBkZWNpc2lvbiBhc3Npc3RhbmNlIGlzIGEgbWF0dGVyIG9mIGdyZWF0IGltcG9ydGFuY2UgKElPTSwgMjAxMDsgU2hhdmVyIGV0IGFsLCAyMDEzKS4gDQoNCiNUbyBhZGRyZXNzIHRoZXNlIG5lZWRzLCBJIGRlY2lkZWQgdG8gZXhwbG9yZSBkaXNzZW1pbmF0aW9uIG9mIGhlYWx0aC1yZWxhdGVkIGluZm9ybWF0aW9uIG9uIEludGVybmV0LCBzcGVjaWZpY2FsbHkgb24gWW91VHViZS4gWW91VHViZSBoYXMgYmVjb21lIGEgZ3JlYXQgcGxhdGZvcm0gZm9yIHBlb3BsZSB0byBnaXZlIHRpcHMgYW5kIHRyaWNrcyBmb3IgdmFyaW91cyB0aGluZ3MgYXMgd2VsbCBhcyBsaXZpbmcgYSBoZWFsdGh5IGxpZmVzdHlsZSBhbmQgIGluY3JlYXNpbmdseSB1c2VkIGFzIGEgc291cmNlIG9mIGhlYWx0aC1yZWxhdGVkIGluZm9ybWF0aW9uIHRoYXQgbWF5IGluZmx1ZW5jZSBoZWFsdGggZGVjaXNpb24gbWFraW5nLiAgRm9yIHRoaXMgcmVhc29uLCBJIGRldGVybWluZSBZb3VUdWJlIHRvIGJlIGFuIGFkZXF1YXRlIHNvY2lhbCBtZWRpYSBwbGF0Zm9ybSB0byBjb25kdWN0IG15IHJlc2VhcmNoIG9uIGRpc3NlbWluYXRpb24gb2YgaGVhbHRoLXJlbGF0ZWQgaW5mb3JtYXRpb24uIA0KDQojVGhlIHB1cnBvc2Ugb2YgbXkgcHJvamVjdCBpcyB0byBkZXRlcm1pbmUgdGhlIGJlc3Qgd2F5IHRvIGRpc3NlbWluYXRlIGhlYWx0aCBpbmZvcm1hdGlvbiB0byBtaWRkbGUtYWdlZCB3b21lbiB3aXRoaW4gdGhlIFlvdVR1YmUgdmlkZW8gbmV0d29yay4gIFRocm91Z2ggbXkgcmVzZWFyY2gsIEkgaG9wZSB0byB1bmNvdmVyIGEgZGVlcGVyIHVuZGVyc3RhbmRpbmcgb24gdGhlIHBvdGVudGlhbCBpbmZsdWVuY2Ugb2YgWW91VHViZSBvbiB3b21lbuKAmXMgaGVhbHRoLiAgQXMgd29tZW7igJlzIGhlYWx0aCBpcyBhIHZlcnkgYnJvYWQgY2F0ZWdvcnkgdGhhdCBlbmNvbXBhc3NlcyBhIG11bHRpdHVkZSBvZiBkaWZmZXJlbnQgZG9tYWlucywgSSBuYXJyb3dlZCBkb3duIG15IHJlc2VhcmNoIHRvIHRoZSBpbmZvcm1hdGlvbiBhYm91dCBtZW5vcGF1c2UgYW5kIG90aGVyIGNsb3NlbHkgcmVsYXRlZCB0b3BpYy4NCg0KIyBNeSByZXNlYXJjaCBxdWVzdGlvbnMgaW5jbHVkZToNCiMxLiAgICAgICAgICAgV2hhdCBmYWN0b3JzIGRldGVybWluZSBzdWNjZXNzIGFuZCBwb3B1bGFyaXR5IHdpdGhpbiB0aGUgWW91VHViZT8NCiMyLglXaGljaCBtZW5vcGF1c2UgcmVsYXRlZCB0b3BpY3MgYXJlIG1vc3QgcG9wdWxhcj8NCiMzLglXaG8gYXJlIHRoZSBvcGluaW9uIGxlYWRlcnMgdGhhdCBjb3VsZCBlZmZlY3RpdmVseSBkaXNzZW1pbmF0ZSBoZWFsdGgtcmVsYXRlZCBpbmZvcm1hdGlvbiBvbiBZb3VUdWJlPw0KIzQuCVdoYXQga2luZCBvZiB2aWRlbyBjb250ZW50IGF0dHJhY3RzIG1vcmUgdXNlcnM/IA0KDQpgYGANCg0KDQpgYGB7cn0NCiMjIFVuZGVyc3RhbmQgRGF0YTogRGF0YSBzb3VyY2UgaWRlbnRpZmljYXRpb24gYW5kIHVuZGVyc3RhbmRpbmcgKDIgcG9pbnRzKQ0KDQojQ29uY2VwdCBvZiBsZWFybmluZzogDQoNCiNUbyBnZXQgaW5zaWdodCBpbnRvIHdoYXQga2luZCBvZiB2aWRlb3MgYXR0cmFjdCBtb3JlIHVzZXJzIGFuZCBnZW5lcmF0ZSBtb3JlIHJlc3BvbnNlcywgdGhlaXIgcmFua3MgaW4gcG9wdWxhcml0eSwgYW5kIGluZmx1ZW5jZSwgSSB3YW50IHRvIGlkZW50aWZ5IHdoYXQgZmFjdG9ycyBkZXRlcm1pbmUgdGhlIHBvcHVsYXJpdHkgb2YgWW91VHViZSB2aWRlb3MgKG51bWJlciBvZiB2aWV3cykgYmFzZWQgb24gb3RoZXIgdmlkZW8gYXR0cmlidXRlcywgc3VjaCBhcyBmYXZvcmluZyAobGlrZXMvZGlzbGlrZXMpLCBudW1iZXIgb2YgY29tbWVudHMsIGRhdGUgb2YgY3JlYXRpb24gKGFnZSBvZiB0aGUgdmlkZW8pLCB0aGVtZXMgb2YgY29udGVudCAoaS5lLiB3ZWxsbmVzcywgbnV0cml0aW9uLCBkaXNlYXNlLWZvY3VzZWQsIHByZXZlbnRpb24sIGV0Yy4pLCB0eXBlcyBvZiBhY3RvcnMvY2hhbm5lbHMgKGkuZS4gcHJpdmF0ZSBpbmRpdmlkdWFsLCBlZHVjYXRpb24sIGdvdmVybm1lbnQsIG1lZGljYWwgcHJvZmVzc2lvbmFsLCBub24tbWVkaWNhbCBwcm9mZXNzaW9uYWwsIGZvci1wcm9maXQsIG5vbi1wcm9maXQsIG1lZGlhLCB1bmFibGUgdG8gZGV0ZXJtaW5lLCBzcGFtKS4gICANCg0KI0RhdGEgYXR0cmlidXRlczogDQoNCiNJIHVzZWQgdGhlIE5vZGVYTCBwbHVnaW4gdG8gaW1wb3J0IGRhdGEgZnJvbSB0aGUgWW91VHViZSB2aWRlbyBuZXR3b3JrLiBBbiBleHRyYWN0aW9uIG9mIGEgdmlkZW8gbmV0d29yayBpcyBiYXNlZCBvbiB0aGUgbWV0YWRhdGEgdXNlZCB0byBsYWJlbCB0aGUgdmlkZW8gY29udGVudHMgc3VjaCBhcyB0aXRsZXMsIHRhZ3MsIGRlc2NyaXB0aW9ucywgYW5kIGNhdGVnb3JpZXMuIEFzIHRoZSBZb3VUdWJlIHNlYXJjaCBlbmdpbmUgbWF0Y2hlcyBrZXl3b3JkcyBhZ2FpbnN0IGFsbCB0eXBlcyBvZiB2aWRlbyBkZXNjcmlwdG9ycywgSSB1c2VkIHRoZSBmcmVlIGtleXdvcmQgdG9vbCBvbiB3b3Jkc3RyZWFtLmNvbSAgZm9yIGUtbWFya2V0ZXJzIHRvIGlkZW50aWZ5IG1vc3QgcG9wdWxhciBrZXl3b3JkcyB0aGF0IGFyZSBzcGVjaWZpYyB0byBtZW5vcGF1c2U/IFN1Y2ggYXMgbWVub3BhdXNlLCBuaWdodCBzd2VhdHMsIHBlcmltZW5vcGF1c2UsIGhvdCBmbGFzaGVzLCBocnQuICANCg0KI1VzaW5nIGEgc2VhcmNoIGZ1bmN0aW9uIGluIHRoZSBOb2RlWEwsIEkgY29sbGVjdGVkIHRoZSBzYW1wbGUgb2YgMTAwIHZpZGVvcyBjb250YWluaW5nIHRoZSBpZGVudGlmaWVkIGtleXdvcmRzIGluIHRoZWlyIGRlc2NyaXB0b3JzLiBUaGUgZGF0YSBzZXQgaW5jbHVkZXMgb25lIHdvcmtzaGVldCBpbiBDVlMgZm9ybWF0LiBUaGUgd29ya3NoZWV0IGlzIHBvcHVsYXRlZCB3aXRoIGluZm9ybWF0aW9uIGFib3V0IGVhY2ggb2YgdGhlIGluZGl2aWR1YWwgdmlkZW9zIGF0dHJpYnV0ZXMgc3VjaCBhcyBUaXRsZSAoY2F0ZWdvcmljYWwvY2hhcmFjdGVyKSwgQXV0aG9yIChjYXRlZ29yaWNhbC9jaGFyYWN0ZXIpLCBjcmVhdGlvbiBkYXRlIChudW1lcmljKSwgYW5kIGEgbnVtYmVyIG9mIHZpZXdzLCBjb21tZW50cywgbGlrZXMsIGFuZCBkaXNsaWtlcyAobnVtZXJpYy9pbnRlZ2VyKS4gVGhlIGFkZGl0aW9uYWwgY29sdW1uIG9mIHRoZSB0YWJsZSBwcm92aWRlcyB3ZWItbGlua3MgdG8gdGhlIGFuYWx5emVkIHZpZGVvcyAoY2F0ZWdvcmljYWwpLg0KDQojVGhlIFRpdGxlIG1heSBoZWxwIHRvIGlkZW50aWZ5IHRoZW1lcyBvZiBjb250ZW50LiBUaGUgQXV0aG9yIG1heSBoZWxwIHRvIGlkZW50aWZ5IHR5cGVzIG9mIGFjdG9ycy9jaGFubmVscy4gSG93ZXZlciwgdGhlcmUgbWlnaHQgYmUgYSBuZWVkIHRvIHdhdGNoIHRoZSB2aWRlb3MgdG8gaWRlbnRpZnkgdGhlbWVzLCB0byBkZXZlbG9wIGNvZGVib29rIGNhdGVnb3JpZXMsIGFuZCBjbGFzc2lmeSB0aGUgYXV0aG9ycyB3aXRoIHJlc3BlY3QgdG8gdGhlaXIgdHlwZS4gQ3JlYXRpb24gZGF0YSBpbmNsdWRlIGRhdGUgZGF0YSByZWdhcmRpbmcgeWVhciwgbW9udGgsIGRheSwgaG91ciwgbWludXRlLCBhbmQgc2Vjb25kIG9mIHZpZGVvIGNyZWF0aW9uLiBUaGVzZSBkYXRhIHdpbGwgaGVscCB0byBjYWxjdWxhdGUgdGhlIOKAnGFnZeKAnSBvZiB2aWRlbyBieSBzdWJ0cmFjdGluZyB0aGUgZGF0ZSBvZiB2aWRlbyB1cGxvYWQgZnJvbSBjdXJyZW50IGRhdGUuIFRoZSBsb25nZXIgdGhlIHZpZGVvIGlzIG9uIFlvdVR1YmUsIHRoZSBtb3JlIHZpZXdzIGl0IGFjcXVpcmVzIG92ZXIgdGltZS4gVGhlcmVmb3JlLCBpdCBpcyBpbXBvcnRhbnQgdG8gYWRqdXN0IG91ciBtb2RlbCBiYXNlZCBvbiB0aGUgdmFyaWFibGUg4oCcYWdlIGlmIHRoZSB2aWRlby7igJ0gIE15IGh5cG90aGVzaXMgdGhhdCB0aGUgbnVtYmVycyBvZiB2aWV3cywgY29tbWVudHMsIGxpa2VzLCBhbmQgZGlzbGlrZXMgaGF2ZSBpbnRlcmRlcGVuZGVudCByZWxhdGlvbnNoaXBzLiAgVGhlIG51bWJlciBvZiB2aWV3cywgY29tbWVudHMsIGxpa2VzLCBhbmQgZGlzbGlrZXMgbWF5IHByb21vdGUgdGhlIHBvcHVsYXJpdHkgb2YgYSB2aWRlbyAoYSBudW1iZXIgb2Ygdmlld3MpIHRocm91Z2ggc29tZSBpbi1idWlsZCBZb3VUdWJlIGFsZ29yaXRobS4gICAgDQoNCiMgRGF0YSBpbnN0YW5jZXMNCg0KIyBXaHlfIENhbnRfIFlvdV8gTG9zZV8gV2VpZ2h0XyBEdXJpbmdfIE1lbm9wYXVzZSAodGl0bGUpLCBEcl9FcmljXyBCZXJnXyBEQyAoYXV0aG9yKSwgMjAxNy0xMC0wNFQxMDo0OToyNS4wMDBaIChjcmVhdGVkIGRhdGUoVVRDKSksIDY2LDcyMCAodmlld3MpLCAxMjEgKGNvbW1lbnRzKSwgMSw0MTggKGxpa2VzLmNvdW50KSwgMzMgKGRpc2xpa2VzIGNvdW50KSwgICBodHRwczovL3d3dy55b3V0dWJlLmNvbS93YXRjaD92PVRiYjl5Z19oOVBVIChjdXN0b20ubWVudSkNCg0KIyBTdXJ2aXZpbmdfdG9fVGhyaXZpbmdfQ3ludGhpYSBUaHVybG93X1RFRHhUcmluaXR5QmVsbHdvb2RzV29tZW4gKHRpdGxlKSwgVEVEeCBUYWxrcyAoYXV0aG9yKSwgMjAxOS0wMi0xMlQxNjoyODoxMi4wMDBaLCAoY3JlYXRlZCBkYXRlKFVUQykpLCAzOSwzNTcgKHZpZXdzKSwgMTYgKGNvbW1lbnRzKSwgNDYzIChsaWtlcy5jb3VudCksIDMzIChkaXNsaWtlcyBjb3VudCksIGh0dHBzOi8vd3d3LnlvdXR1YmUuY29tL3dhdGNoP3Y9VGJiOXlnX2g5UFUgKGN1c3RvbS5tZW51KQ0KDQoNCmBgYA0KDQpgYGB7cn0NCiMzLiBEYXRhIGluIEFjdGlvbjogRGF0YSBwcmVwYXJhdGlvbiwgdmlzdWFsaXphdGlvbiwgYW5kIGV4cGxvcmF0aW9uDQojMy5BLiBEYXRhIHByZXBhcmF0aW9uIGFuZCBsb2FkaW5nOg0Kc2V0d2QoIn4vZHJleGVsX21hc3RlcnMvZGF0YS9JTkZPNjU5IikNCm1lbm9wYXVzZSA8LSByZWFkLnRhYmxlKCJ3b21lbi5jc3YiLCBzZXA9IiwiLCBoZWFkZXIgPSBUUlVFLCBxdW90ZSA9ICIiKQ0KDQpgYGANCg0KDQpgYGB7cn0NCmhlYWQobWVub3BhdXNlLCA1KQ0KYGBgDQoNCg0KYGBge3J9DQojMy5CLiBEYXRhIGRpc3RyaWJ1dGlvbiBhbmQgYW5vbWFsaWVzDQpoaXN0KG1lbm9wYXVzZSRWaWV3cywgYnJlYWtzPTUwLCB4bGFiPSJWaWV3cyIsIG1haW49Ik1lbm9wYXVzZSBWaWRlbyBWaWV3cyIpICMgcHJvZHVjaW5nIGhpc3RvZ3JhbSBmb3IgdGhlIG51bWJlciBvZiB2aWV3cyANCg0KYGBgDQoNCmBgYHtyfQ0KIyBUaGUgdmFsdWVzIG9mIHRoZSB2YXJpYWJsZSByYW5nZWQgZnJvbSAwIHRvIG1vcmUgdGhhbiAxLDUwMCwwMDAuIFRoZSBoaXN0b2dyYW0gc2hhcGUgaXMgc2tld2VkIHRvIHRoZSBsZWZ0LiBOZWFyIDgwJSBvZiB2aWRlb3MgaXMgaW4gdGhlIGdyb3VwIHdpdGggbGVzcyB0aGFuIDUwLCAwMDAgdmlld3MuIE5lYXIgOTklIG9mIHZpZGVvcyBoYXMgbnVtYmVycyBvZiB2aWV3cyB1bmRlciA1MDAsIDAwMC4gVGhlIGFjY291bnRzIHdpdGggdmFsdWVzIG9mIG1vcmUgdGhhbiAxLDUwMCwwMDAgY2Fubm90IGJlIGNvbnNpZGVyZWQgYXMgb3V0bGllcnMuIFRoZXNlIGFyZSBleHBlY3RlZCB2YWx1ZXMuIFRoZXJlZm9yZSwgdGhlc2UgYWNjb3VudHMgc2hvdWxkIGJlIHJldGFpbmVkIGZvciBmdXJ0aGVyIGFuYWx5c2VzLiANCmBgYA0KDQpgYGB7cn0NCmhpc3QobWVub3BhdXNlJENvbW1lbnRzLCBicmVha3M9MzAsIHhsYWI9IkNvbW1lbnRzIiwgbWFpbj0iTWVub3BhdXNlIFZpZGVvIGNvbW1lbnRzIikgIyBwcm9kdWNpbmcgaGlzdG9ncmFtIGZvciB0aGUgbnVtYmVyIG9mIGNvbW1lbnRzDQpgYGANCg0KYGBge3J9DQojIFRoZSB2YWx1ZXMgb2YgdGhlIHZhcmlhYmxlIOKAnGNvbW1lbnRz4oCdIHJhbmdlZCBmcm9tIDAgdG8gbW9yZSB0aGFuIDEsMjAwLiBUaGUgaGlzdG9ncmFtIHNoYXBlIGlzIHNrZXdlZCB0byB0aGUgbGVmdC4gTmVhciA3MCUgb2YgdmlkZW9zIGlzIGluIHRoZSBncm91cCB3aXRoIGxlc3MgdGhhbiA1MCBjb21tZW50cy4gTmVhciA5NSUgb2YgdmlkZW9zIGhhcyBudW1iZXJzIG9mIGNvbW1lbnRzIHVuZGVyIDQ1MC4gVGhlIGFjY291bnRzIHdpdGggdmFsdWVzIG9mIG1vcmUgdGhhbiAxLDIwMCBjYW5ub3QgYmUgY29uc2lkZXJlZCBhcyBvdXRsaWVycy4gVGhlc2UgYXJlIGV4cGVjdGVkIHZhbHVlcy4gVGhlcmVmb3JlLCB0aGVzZSBhY2NvdW50cyBzaG91bGQgYmUgcmV0YWluZWQgZm9yIGZ1cnRoZXIgYW5hbHlzaXMuDQpgYGANCg0KDQpgYGB7cn0NCmhpc3QobWVub3BhdXNlJExpa2VzLkNvdW50LCBicmVha3M9MzAsIHhsYWI9Ikxpa2VzIiwgbWFpbj0iTWVub3BhdXNlIFZpZGVvIGxpa2VzIikgIyBwcm9kdWNpbmcgaGlzdG9ncmFtIGZvciB0aGUgbnVtYmVyIG9mIGxpa2VzDQpgYGANCg0KYGBge3J9DQojIFRoZSB2YWx1ZXMgb2YgdGhlIHZhcmlhYmxlIOKAnGxpa2Vz4oCdIHJhbmdlZCBmcm9tIDAgdG8gbW9yZSB0aGFuIDI1LDAwMC4gVGhlIGhpc3RvZ3JhbSBzaGFwZSBpcyBza2V3ZWQgdG8gdGhlIGxlZnQuIE5lYXIgODAlIG9mIHZpZGVvcyBpcyBpbiB0aGUgZ3JvdXAgd2l0aCBsZXNzIHRoYW4gMSwwMDAgbGlrZXMuIE1vcmUgdGhhbiA5NSUgb2YgdmlkZW9zIGhhcyBudW1iZXJzIG9mIGNvbW1lbnRzIHVuZGVyIDYsMDAwLiBUaGUgYWNjb3VudHMgd2l0aCB2YWx1ZXMgb2YgbW9yZSB0aGFuIDI1LDAwMCBjYW5ub3QgYmUgY29uc2lkZXJlZCBhcyBvdXRsaWVycy4gVGhlc2UgYXJlIHJlYWxpc3RpYyB2YWx1ZXMuIFRoZXJlZm9yZSwgdGhlc2UgYWNjb3VudHMgc2hvdWxkIGJlIHJldGFpbmVkIGZvciBmdXJ0aGVyIGFuYWx5c2lzLg0KYGBgDQoNCmBgYHtyfQ0KYGBgDQoNCg0KYGBge3J9DQpoaXN0KG1lbm9wYXVzZSREaXNsaWtlcy5Db3VudCwgYnJlYWtzPTMwLCB4bGFiPSJEaXNsaWtlcyIsIG1haW49Ik1lbm9wYXVzZSBWaWRlbyBkaXNsaWtlcyIpICMgcHJvZHVjaW5nIGhpc3RvZ3JhbSBmb3IgdGhlIG51bWJlciBvZiBkaXNsaWtlcw0KYGBgDQoNCg0KYGBge3J9DQojIFRoZSB2YWx1ZXMgb2YgdGhlIHZhcmlhYmxlIOKAnGRpc2xpa2Vz4oCdIHJhbmdlZCBmcm9tIDAgdG8gbW9yZSB0aGFuIDEsMjAwLiBUaGUgaGlzdG9ncmFtIHNoYXBlIGlzIHNrZXdlZCB0byB0aGUgbGVmdC4gTW9yZSB0aGFuIDkwJSBvZiB2aWRlb3MgYXJlIGluIHRoZSBncm91cCB3aXRoIGxlc3MgdGhhbiA1MCBkaXNsaWtlcy4gTW9yZSB0aGFuIDkwJSBvZiB2aWRlb3MgaGFzIG51bWJlcnMgb2YgZGlzbGlrZXMgdW5kZXIgMjAwLiBUaGUgYWNjb3VudHMgd2l0aCB2YWx1ZXMgb2YgbW9yZSB0aGFuIDEsMjAwIGNhbm5vdCBiZSBjb25zaWRlcmVkIGFzIG91dGxpZXJzLiBUaGVzZSBhcmUgcmVhbGlzdGljIHZhbHVlcy4gVGhlcmVmb3JlLCB0aGVzZSBhY2NvdW50cyBzaG91bGQgYmUgcmV0YWluZWQgZm9yIGZ1cnRoZXIgYW5hbHlzaXMuDQpgYGANCg0KYGBge3J9DQojMy5DLiBEYXRhIGRpc3RyaWJ1dGlvbiB3aXRoIGxvZyB0cmFuc2Zvcm1hdGlvbg0KIyBBbGwgYWJvdmUgaGlzdG9ncmFtcyBhZSBza2V3ZWQgdG8gdGhlIGxlZnQgc2lkZS4gVGhlIERpc2xpa2VzIGhpc3RvZ3JhbSBzaG93ZWQgdGhlIG1vc3Qgc2tld2VkIGRpc3RyaWJ1dGlvbiB3aXRoIG1vcmUgdGhhbiA5MCUgb2YgdmlkZW9zIGlzIGluIGZpcnN0IGxlZnQgY29sdW1uLiAgDQoNCmBgYA0KDQpgYGB7cn0NCmhpc3QobG9nMTAobWVub3BhdXNlJCBEaXNsaWtlcy5Db3VudCksIGJyZWFrcz0zMCwgeGxhYj0iRGlzbGlrZXMiLCBtYWluPSJNZW5vcGF1c2UgVmlkZW8gRGlzbGlrZXM6IHdpdGggbG9nIHRyYW5zZm9ybWF0aW9uIikNCmBgYA0KDQoNCmBgYHtyfQ0KIyBUaGUgc2hhcGUgb2YgdGhlIGxvZyBoaXN0b2dyYW0gaXMgY2xvc2VyIHRvIG5vcm1hbCBkaXN0cmlidXRpb24gKGEgYmVsbCBjdXJ2ZSBzaGFwZSkgIHdpdGggdHdvICB1bnVzdWFsIOKAnHNwaWtlc+KAnSBiZXR3ZWVuIDAuMCBhbmQgMC4xIHZhbHVlcyBhbmQgYmV0d2VlbiAwLjYgYW5kIDAuNyB2YWx1ZXMgYW5kIGEgYmlnIGRlcHJlc3Npb24gYmV0d2VlbiAyLjUgYW5kIDMuMSB2YWx1ZXMNCmBgYA0KDQpgYGB7cn0NCiMzLkQuIEV4YW1pbmluZyBtdWx0aXBsZSB2YXJpYWJsZXMgYW5kIHJlZ3Jlc3Npb24NCiMgVGhlIG51bWJlciBvZiBjb21tZW50cyAoYXR0cmlidXRlIFgpIHJlZmxlY3RzIHRoZSBxdWFsaXR5IG9mIHZpZGVvIGNvbnRlbnQgdGhyb3VnaCBlbmdhZ2VtZW50IG9mIHRoZSBhdWRpZW5jZS4gIFRodXMsIGl0IGNhbiBhZmZlY3QgdGhlIHBvcHVsYXJpdHkgb2YgdGhlIHZpZGVvIHRoYXQgaXMgZGV0ZXJtaW5lZCBieSB0aGUgbnVtYmVycyBvZiB2aWV3cyAoYXR0cmlidXRlIFkpIHRocm91Z2ggdGhlIGFjdGlvbiBvZiB0aGUgWW91VHViZSBhbGdvcml0aG0uICANCg0KYGBgDQoNCmBgYHtyfQ0KcGxvdChtZW5vcGF1c2UkQ29tbWVudHMsIG1lbm9wYXVzZSRWaWV3cywgeGxhYj0iQ29tbWVudHMiLCB5bGFiPSJWaWV3cyIpICAjIFByb2R1Y2luZyBhIHNjYXR0ZXIgcGxvdCBiZXR3ZWVuIGF0dHJpYnV0ZVggYW5kIHRoZSBhdHRyaWJ1dGVZIHZhcmlhYmxlcw0KbXlsaW5lIDwtIGxtKG1lbm9wYXVzZSRWaWV3cyB+IG1lbm9wYXVzZSRDb21tZW50cykgICMgQ29uZHVjdGluZyBsaW5lYXIgcmVncmVzc2lvbiBvbiBhdHRyaWJ1dGUgWSB0byBiZSBtb2RlbGVkIGJ5IGF0dHJpYnV0ZSBYIHVzaW5nIHRoZSBsbSgpIGZ1bmN0aW9uIGFuZCBhc3NpZ25pbmcgdGhlIHJlc3VsdCBtb2RlbCB0byBhIHZhcmlhYmxlDQpwb2ludHMobWVub3BhdXNlJENvbW1lbnRzLCBteWxpbmUkY29lZmZpY2llbnRzWyAxIF0gKyBteWxpbmUkY29lZmZpY2llbnRzWyAyIF0gKiAgICAgICAgICAgICAgICAgICAgICAgbWVub3BhdXNlJENvbW1lbnRzLCB0eXBlPSJsIiwgY29sPSJyZWQiKSAjIEFkZGluZyB0aGUgcmVncmVzc2lvbiBsaW5lIHRvIHRoZSBzY2F0dGVyIHBsb3QgDQoNCg0KYGBgDQoNCmBgYHtyfQ0KIyBUaGUgbGluZWFyIHJlZ3Jlc3Npb24gbGluZSBjYXB0dXJlcyBzb21lIHBvc2l0aXZlIGxpbmVhciByZWxhdGlvbnMgYmV0d2VlbiB0aGUgdHdvIHZhcmlhYmxlcy4gVGhlIHBvaW50cyBvbiB0aGUgc2NhdHRlcnBsb3QgZm9sbG93IGEgc29tZXdoYXQgc3RyYWlnaHQtbGluZSBwYXR0ZXJuLiBUaGUgcG9pbnRzIGluY2xpbmUgdXB3YXJkcyB0byB0aGUgcmlnaHQuIEFzIHggdmFsdWVzICh0aGUgbnVtYmVycyBvZiBjb21tZW50cykgaW5jcmVhc2UsIHkgdmFsdWVzICh0aGUgbnVtYmVycyBvZiB2aWV3KSBpbmNyZWFzZSB0b28uIEhvd2V2ZXIsIHRoZSB2aXN1YWwgYW5hbHlzaXMgb2YgcmVzaWR1YWxzICh0aGUgZGlmZmVyZW5jZXMgYmV0d2VlbiB0aGUgb2JzZXJ2ZWQgZGF0YSB2YWx1ZSBhbmQgdGhlIHZhbHVlcyBvbiB0aGUgc3RyYWlnaHQgbGluZSkgc3VnZ2VzdHMgdGhhdCB0aGlzIGxpbmVhciBtb2RlbCBoYXMgYSB0ZW5kZW5jeSB0byBvdmVyLXByZWRpY3QgdGhlIG51bWJlciBvZiB2aWV3cyBmb3IgdGhlIHJhbmdlIG9mIDUwMC03MDAgY29tbWVudHMuIEFsc28sIGl0IG1heSBzaWduaWZpY2FudGx5IHVuZGVyLXByZWRpY3QgdGhlIG51bWJlciBvZiB2aWV3cyBvciBub3QgYmUgYXBwbGljYWJsZSBhdCBhbGwgZm9yIHRoZSBudW1iZXIgb2YgY29tbWVudHMgYWJvdmUgMSwyMDAuIFRoZXJlIGlzIG5vIGRhdGEgYXZhaWxhYmxlIGZvciB0aGUgcmFuZ2Ugb2YgY29tbWVudHMgYmV0d2VlbiA3MDAgYW5kIDEsMjAwLiAgDQpgYGANCg0KDQpgYGB7cn0NCiM0LiBEaXNjdXNzaW9uLCB1bmRlcnN0YW5kaW5nLCBhbmQgcGxhbm5pbmcgDQoNCiMgVGhlIGV4cGxvcmF0b3J5IGFuYWx5c2lzIHJldmVhbGVkIHRoYXQgdGhlIGRhdGEgc2V0IGhhcyBhIGdvb2QgcXVhbGl0eSBvZiBkYXRhIHRoYXQgZG8gbm90IHJlcXVpcmUgY2xlYW5zaW5nIG9yIGNvcnJlY3Rpb25zLiBBbGwgZGF0YSBhcmUgd2l0aGluIHRoZSBub3JtYWwgcmFuZ2UuIA0KDQojIEhvd2V2ZXIsIHRoZSB2aXN1YWwgYW5hbHlzaXMgcmV2ZWFsZWQgdGhhdCBkYXRhIGRpc3RyaWJ1dGlvbnMgZm9yIG51bWVyaWMgdmFsdWVzIHN1Y2ggYXMgdGhlIG51bWJlciBvZiB2aWV3cywgY29tbWVudHMsIGxpa2VzLCBhbmQgZGlzbGlrZXMgYXJlIHNrZXdlZCB0byB0aGUgbGVmdCBzaWRlIGFuZCBzaG93IGJpZyBkZXByZXNzaW9ucyBiZXR3ZWVuIHRoZSBtYXhpbXVtIHZhbHVlcyBhbmQgdGhlIHJlc3Qgb2YgdGhlIHZhbHVlcyBvbiB0aGUgcmlnaHQgc2lkZS4gIA0KDQojIExlZnQtc2lkZWQgc2tld2VkbmVzcyBjYW4gYmUgYWRkcmVzc2VkIHdpdGggbG9nIHRyYW5zZm9ybWF0aW9uLiAgDQoNCiMgVGhlIGRlcHJlc3Npb25zIG9uIHRoZSByaWdodCBzaWRlIG1heSByZXByZXNlbnQgbWlzc2luZyBkYXRhLiBUaGUgcG9zc2libGUg4oCcZml44oCdIGlzIHRvIG9idGFpbiB0aGUgbGFyZ2VyIHNhbXBsZSB0aGF0IHdvdWxkIGdpdmUgbW9yZSBkYXRhIGluc3RhbmNlcyAocm93cykuDQoNCiMgVGhlIG51bWJlciBvZiB2aWV3cywgY29tbWVudHMsIGxpa2VzLCBhbmQgZGlzbGlrZXMgbWF5IHByb21vdGUgdGhlIHBvcHVsYXJpdHkgb2YgdmlkZW9zIHRocm91Z2ggdGhlIGFjdGlvbiBvZiB0aGUgWW91VHViZSBhbGdvcml0aG0uIEhvd2V2ZXIsIHRoZXNlIGF0dHJpYnV0ZXMgYXJlIGluc3VmZmljaWVudCB0byBwcm92aWRlIGluc2lnaHQgb24gd2hhdCBraW5kIG9mIHZpZGVvIG9yIHdoYXQgdG9waWNzIGF0dHJhY3QgbW9yZSB2aWV3ZXJzLiBUaGUgcG9wdWxhcml0eSBvZiB0aGUgdmlkZW8gbWF5IGFsc28gZGVwZW5kIG9uIHJlcHV0YWJpbGl0eSBhbmQgdHJ1c3RmdWxuZXNzIG9mIHRoZSBjaGFubmVsL2F1dGhvci4gDQoNCiMgVGhlIHZhbHVlcyBvZiBhdHRyaWJ1dGVzIOKAnFRpdGxl4oCdIGFuZCDigJxBdXRob3LigJ0gZG8gbm90IHByb3ZpZGUgc3VmZmljaWVudCBpbmZvcm1hdGlvbiB0byBjYXRlZ29yaXplIHRvcGljcyBvZiB0aGUgdmlkZW9zIGFuZCBlc3RpbWF0ZSB0aGUgcXVhbGl0eSBvZiB2aWRlb3MgYW5kIHJlcHV0YWJpbGl0eSBhbmQgdHJ1c3RmdWxuZXNzIG9mIHNvdXJjZXMuIFRodXMsIHRoZSBudW1lcmljIGFuYWx5c2lzIHNob3VsZCBiZSBzdXBwbGVtZW50ZWQgd2l0aCB0aGUgYW5hbHlzaXMgb2YgdGhlIHZpZGVvIGNvbnRlbnQuIA0KDQojIFRoZSBhbmFseXNpcyBvZiB0aGUgdmlkZW8gY29udGVudCBpcyBhIHZlcnkgdGltZS1jb25zdW1pbmcgZW5kZWF2b3IuIFRoZSBsYWNrIG9mIHRpbWUgbWF5IGltcG9zZSBzb21lIGNvbnN0cmFpbnRzIHRvIHRoZSBzYW1wbGUgc2l6ZS4gRmluZGluZyB0aGUg4oCccmlnaHTigJ0gbnVtYmVyIG9mIGRhdGEgaW5zdGFuY2VzIHRoYXQgd291bGQgZW5zdXJlIHRoZSBkZXZlbG9wbWVudCBvZiB0aGUgZWZmZWN0aXZlIGFuZCByZWxpYWJsZSBhbmFseXRpYyBtb2RlbCB3aXRoaW4gYSByZWFsaXN0aWMgdGltZWxpbmUgbWF5IGRldGVybWluZSBzdWNjZXNzIG9mIHRoaXMgcHJvamVjdC4gICAgICAgDQoNCiMgVGhlIGFuYWx5c2lzIG9mIHJlbGF0aW9uc2hpcHMgYmV0d2VlbiB0aGUgbnVtYmVyIG9mIHZpZXdzIGFuZCB0aGUgbnVtYmVyIG9mIGNvbW1lbnRzIHNob3dlZCB0aGF0IHRoZSBsaW5lYXIgbW9kZWwgaXMgc3VpdGFibGUgZm9yIHRoZSBtb2RlbGluZy4gU2ltaWxhciByZWxhdGlvbnNoaXBzIG1pZ2h0IGJlIG9ic2VydmVkIHdpdGggb3RoZXIgdmFyaWFibGVzLCBzdWNoIGFzIGxpa2VzLCBkaXNsaWtlcywgYW5kIGRhdGVzIG9mIGNyZWF0aW9uLiAgDQoNCmBgYA0KDQoNCmBgYHtyfQ0KI1JlZmVyZW5jZXMNCg0KI0hhcnJpcywgSi4gSy4sIE1vcmVsYW5kLVJ1c3NlbCwgUy4sIFRhYmFrLCBSLiBHLiwgUnVociwgTC4gUi4sICYgTWFpZXIsIFIuIEMuICgyMDE0KS4gQ29tbXVuaWNhdGlvbiBhYm91dCBjaGlsZGhvb2Qgb2Jlc2l0eSBvbiBUd2l0dGVyLiBBbWVyaWNhbiBKb3VybmFsIG9mIFB1YmxpYyBIZWFsdGgsIDEwNCg3KSwgZTYy4oCTZTY5LiBkb2k6MTAuMjEwNS9BSlBILjIwMTMuMzAxODYwKQ0KDQojSW5zdGl0dXRlIG9mIE1lZGljaW5lLiAoMjAxMCkuIFdvbWVu4oCZcyBIZWFsdGggUmVzZWFyY2g6IFByb2dyZXNzLCBwaXRmYWxscywgYW5kIHByb21pc2UuIFdhc2hpbmd0b24gKERDKTogVGhlIE5hdGlvbmFsIEFjYWRlbWllcyBQcmVzcy4NCg0KI1NoYXZlciwgSi4sIE9sc2hhbnNreSwgRS4sICYgV29vZHMsIE4uIEYuICgyMDEzKS4gV29tZW7igJlzIGhlYWx0aCByZXNlYXJjaCBhZ2VuZGEgZm9yIHRoZSBuZXh0IGRlY2FkZS4gQSByZXBvcnQgYnkgdGhlIFdvbWVu4oCZcyBIZWFsdGggRXhwZXJ0IFBhbmVsIG9mIHRoZSBBbWVyaWNhbiBBY2FkZW15IG9mIE51cnNpbmcuIE51cnNpbmcgT3V0bG9vaywgNjEoMSksIDE2LTI0LiBkb2k6IDEwLjEwMTYvai5vdXRsb29rLjIwMTIuMDUuMDA5Lg0KDQojV29vZHMsIE4uIEYuLCBKb2huc29uLU1hbGxhcmQsIFcuLCAmIFRheWxvciwgRC4gKDIwMTYpLiBXaG8gY2FyZXMgZm9yIG1pZGxpZmUgd29tZW4/IEpvdXJuYWwgb2YgV29tZW7igJlzIEhlYWx0aCwgMjUoMTIpLCAxMTk1LTExOTcuIGRvaTogMTAuMTA4OS9qd2guMjAxNi42MTY4DQoNCmBgYA0KDQo=