Introduction:

Dataset of “National Enrollment Data Set” is being used in this research. The entire dataset spans across 13 years (2005 to 2017), covers 41 Australian Universities, and has a total of 12896962 records, with a file size 6.4 GB. To make this usable, a stratified dataset with 1% records from each institution is created.

The objective of this research is to be able to gain useful predictions and insights, which includes:

  1. Popularity of universities and it’s relation to G8 status and Regions.
  2. Field of study that each university and region specializes (if any)
  3. Differences in the preferences of International Students and Domestic Students. (region and field of study)
  4. Indication of gender-segregation in Field of Study.
  5. Year trends of number of students enrolled in higher institutions.
  6. ATAR Distributions in different types of institutions.

We shall read the CSV (Comma Seperated Values) file into R with the data assigned to variable “natEnrol”.

#natEnrol <- read.csv(file="h:/Downloads/Intro to Data Science/Project 13th Sep/nat_enrol_1.csv", header=TRUE, sep=",")

library(readr)
natEnrol<- read_csv("nat_enrol_1.csv")

Firstly, we shall observe structure of data to have an overview of the data

str(natEnrol)

We can see that there 128967 students data in this file and there are 46 variables for each student.

From the name, type and example of the variables, we can understand some attributes of these 46 variables.

X(int) looks like an index for the students data. Only 1 variable looks like sensible numerical data, namely: noEnrol(int) which looks like number of enrolment of the student. Varible “id”(int) looks like student ID. Variable “updatewhen” (Factor) is the date and time of data updates. Variable “updatewho” (Factor) is just a record of the party who key in this data.

At this point, there are 4 variables that we can’t have good understanding yet, namely:

“mceetya_regional_remote_count”“,”asgs_regional_remote_count"" , “onshore_indicator”" and “regionalremote_value”

Others 37 variables(factor) looks like catogerial data with the number of levels specified.

The levels of the variables tell us varios important information. For example, the structure of varaibles “Institution” and “Institution_Type” show us that the are 41 Institution and these Institution are catogarized into 3 types.

It appears that there are some variables that might need some transformation later on to have more sensible levels. For example, having 18 levels for age are too much.

It appears that there are some data abnormalities and missing values as well. For example, having ATAR of 1 seems unsensible and a number of “NA”s have been detected for these 4 variables:

“mceetya_regional_remote_count”“,”asgs_regional_remote_count"" , “onshore_indicator”" and “regionalremote_value”

Now, we would like to see the summary of the data to gain further insight.

summary(natEnrol)

From the summary, we can gain various useful informations like number of international students, number of english speaking students and etc. We will come back to these later when we start to answer the questions related to our objectives.

Here, we would like to focus on highlighting data abnormalities, missing values and the link in between variables.

  1. “mceetya_regional_remote_count”“,”asgs_regional_remote_count"" , “onshore_indicator”" and “regionalremote_value” have way too many missing values. Might not be useful.

  2. “atar” have various data abnormalities, atar = 999,998 and 1 don’t make sense. Luckily, we have “ATAR_Group” that give similar information on student’s ATAR scores, we shall compare them later to see if it is possible to get sensible transformation of “atar”.

Now, we would like to see the example of the first 40 data to gain further insight.

head(natEnrol,n = 10)

X_Field_of_Education and X_Supp_field_of_education seems to be related to course name.

For example:

X_Field_of_Education X_Supp_field_of_education course_name 90900 100300 Bachelor of Laws (Honours)/B VisualArts 90900 91901 Bachelor of Laws (Honours)/B Economics 80000 91901 B Commerce/B Economics

From these 3 rows we can see that 90900 refers to Bachelor of Laws and 91901 refers to Bachelor of Economics.

X_Field_of_Education is the course code of the main course name.

X_Supp_field_of_education is the course code of the subsidary course name.

Since there are lots of missing values in “course name”, “X_Field_of_Education” and “X_Supp_field_of_education” shall give us more information about the courses enrolled by the students.

In fact, meaning of “X_Field_of_Education” and “X_Supp_field_of_education” can be found from the link below:

https://heimshelp.education.gov.au/resources/field-of-education-types

Or, if we are interested in a broader perspective, “broad_foe”" and “Narrow_FOE” can tell us the field studied by the students.

Next, we shall explore various relationships of these variables to gain meaningful insights

In this report, we will mainly use ggplot to visualize our data. Hence, we shall first import module ggplot2.

library(ggplot2)

载入程辑包:‘ggplot2’

The following object is masked _by_ ‘.GlobalEnv’:

    diamonds
library(gridExtra)

To simplify our ggplot code, we will assign variable “g”" as ggplot of data “natEnrol”.

g <- ggplot(natEnrol)

Now, we shall see if our data can provide clues for any answers related to our objectives.

Objective 1:

Popularity of universities and it’s relation to G8 status and it’s Regions.

# table() aggregates according the Institution, Institution Types and States
instSums <- table(natEnrol$Institution,natEnrol$Institution_Type,natEnrol$state )
# as.data.frame() converts table object into a data frame
instDf <- as.data.frame(instSums)
# taking only rows with non-zero frequency
instDf2 <- subset(instDf,instDf$Freq!=0)
# rename columns
colnames(instDf2)<-c("stu.Inst","inst.type","inst.state", "count")


ggplot(instDf2) + geom_bar(mapping= (aes(x= reorder(stu.Inst,count) , y = count , fill = inst.type )), stat = "identity") + coord_flip() + labs(title="Number of Students in each Institution", y ="Number of Students", x = "Institution", fill = "Types of Institution")



ggplot(instDf2) + geom_bar(mapping= (aes(x= reorder(stu.Inst,count) , y = count , fill = inst.state )), stat = "identity") + coord_flip()+ labs(title="Number of Students in each Institution", y ="Number of Students", x = "Institution", fill = "States of Institution")

Interpretions:

The Figures above shows the number of students of each institutions and their respective ranking according to the number of students.

Five out of eight G8 institutions are ranked at the top. Hinting that G8 status might be correlated with the number of students enrolled to the institution.

Interestingly, although University of Adelaide, University of Western Australia(UWA) and The Australian National University(ANU) are G8 institutions, they have relatively much less students compare to the others.

The second figure gave us some insight on this observation. It seems the top 10 institutions with the most students are from Victoria, New South Wales and Northern Territory. In fact, there are only three institutions not from these three regions in the top 20. Furthermore, all three G8 institutions with less students are from neither of these 3 regions as well.

This might indicates that the institution’s location (whether or not it is in VIC, NSW or NT) of the institution might be even more correlated with the number of students enrolled.

Data Transformation actions:

Form Table of Institution, Institution Types, State of Institution and the respective Counts. Assign new Data Frame of 4 columns to a new variable. Subsetting Datasets to omit irrevalent rows to get inner joint of 3 columns. Renaming Columns for easier handling of data.

Reason of Transformation:

To get a new Data Frame with only 4 variables that we need for these barcharts. To count number of students before geom_bar so that it is possible to arrange the barcharts according to the number of students .

Objective 2:

Field of study that each university and region specializes (if any)

sTheme <- c("#000000", "#E69F00", "#56B4E9", "#009E73", "#F0E442", "#0072B2", "#D55E00", "#CC79A7", "#999900", "#000569", "#E600E9", "#560009", "#035050")

summary(natEnrol[natEnrol$broad_foe == "" | is.na(natEnrol$broad_foe) == TRUE,"broad_foe"])
  broad_foe        
 Length:1528       
 Class :character  
 Mode  :character  
knownFoe <- natEnrol[natEnrol$broad_foe != "" & is.na(natEnrol$broad_foe) == FALSE,]

knownFoe[knownFoe$broad_foe == "Food, Hospitality And",]$broad_foe <- "Food, Hospitality And Personal Service" 

ggplot(knownFoe) + geom_bar(mapping = aes(x= Institution, fill=broad_foe), position ="fill") + coord_flip() + labs(title="Proportions of Field in each", y ="Proportion", x = "Institution", fill = "Field of Study") + scale_fill_manual(values=sTheme)

Interpretation:

“foe” refers to Field of Study mentioned in https://heimshelp.education.gov.au/resources/field-of-education-types.

From the figure above, it seems that most institutions have no obvious specialization in any field. However, it is worth to note that ANU has the highest proportion of students studying in society and culture.

Data Transformation actions:

Count and Proportion was results of data tranformation done by geom_bar Subsetting Datasets to omit rows with empty data or NA in broad_foe (Field) Assigning subseted Data Frame to a new variable (knowFoe) for conveniece to access later.

Change Column title “Food, Hospitality And” to “Food, Hospitality and Personal Service”

Reason of Transformation:

The figures here concerns on the proportions of field of study for each institution. There are only 1528 NA or empty data among 128967 datas. With such low % of missing values, it is safe to omit, since doing so won’t affect the proportions much.

Change Column title “Food, Hospitality And” to “Food, Hospitality and Personal Service” for easier understanding.

ggplot(knownFoe) + geom_count(mapping = aes(x = state, y = broad_foe, size = stat(prop), group = state, colour = state), show.legend = c(colour=FALSE)) + labs(size = "Proportions by States") + ggtitle("Proportions of Field in each States") + ylab("Field of study") + xlab("States")

Interpretation:

From the figure above, it seems that most states have no obvious specialization in any field.

ACT have the highest proportions in Society and Culture. From previous barcharts, we know that ANU is the institute with the most students in ACT. ANU being the institution with highest percentage of students studying Society and Culture might be a contributing factor.

MUL have the highest proportions in Health and Education. There are only very small proportions of students studying on Food, Hospitality and Personal Services Overall,the most popular field of studies are : “Society & Culture”, “Management & Commerce”, “Health” and “Education” These indicates the possibility of some form of specialization of instututions in certain states/region.

Data Transformation actions:

Count and Proportion was results of data tranformation done by geom_count.

Reason of Transformation:

The figure above concerns the proportions of field of study for each states

Objective 3:

Differences in the preferences of International Students and Domestic Students. (region and field of study)

g + geom_bar(mapping = aes(x="", fill=state), position ="fill") + coord_polar("y", start=0)  + facet_grid(facets= . ~ overseas, margins = TRUE) + labs (title = "Location of Studies of International and Domestic Students" , x = NULL , y = "Percentage of enrolment in different region" , fill = "States")

Interpretation:

From the figure above, it seems that most domestic and international have similar distributions across different states. There are slightly more percentage of International students studying in Victoria than Domestic students. Vice versa for New South Wales.

Data Transformation actions:

Count and Proportion was results of data tranformation done by geom_bar.

Reason of Transformation:

The figure above concerns the proportions of states where students studies among international & Domestice students.

ggplot(knownFoe) + geom_bar(mapping = aes(x=overseas, fill=broad_foe), position ="fill") + coord_polar("y", start=0) + ggtitle("Field of Study for Domestic vs Overseas Students") + xlab("") + ylab("Percentage of enrolment in different fields") + labs(fill="Field of Study")

Interpretation:

Among International Students, there are higher percentage of students studying in field of: “Management & Commerce” , “Information Technology” and “Engineering & Related Technology”.

As for Domestic Students, there are higher percentage of students studying in field of: “Society & Culture”, “Creative Arts” and “Education”

These difference might be due to differences in preference or mentality of International and Domestic Students. It is worth while to examine the causes of such differences.

Data Transformation actions:

Count and Proportion was results of data tranformation done by geom_bar.

Reason of Transformation:

The figure above concerns the proportions of field of study for International & Domestic Students.

Objective 4:

Indication of gender-segregation in Field of Study.

a <- ggplot(knownFoe) + geom_bar(mapping = aes(x= "", fill=gender), position ="fill") + coord_flip() + labs(title = "Proportion of Gender of All Students", y = "Percentage" , x = "" , fill = "Gender") 

b <- ggplot(knownFoe) + geom_bar(mapping = aes(x= broad_foe, fill=gender), position ="fill", show.legend = FALSE) + coord_flip() + labs(title = "Proportion of Gender in different Field of Studies", y = "Percentage" , x = "Field of Study") 

grid.arrange(a,b, heights=c(1/4, 3/4), nrow = 2)

Interpretation:

Overall, there are more females than male in our samples. Field of studies of “Information Technology” and “Engeneering & Related Technology” have much higher percentage of male than female. Field of studies of “Education” and “Health” have much higher percentage of females than males. This can be an indication that there are certain Field of Studies that society viewed as “for male” or “for female”.

Data Transformation actions:

Count and Proportion was results of data tranformation done by geom_bar.

Reason of Transformation:

The figure above concerns the proportions of field of study for male & female students.

Objective 5:

Year trends of number of students enrolled in higher institutions.

g + geom_bar(mapping = aes(x= as.numeric(as.character(Year)),fill = overseas)) + labs(title = "Number of Students from 2005~2017", y = "Total number of Students" , x = "Year", fill = "") + scale_fill_manual(values = c("#0072B2", "#D55E00"))

Interpretation:

Overall, there is an upward trend of number of students enrolled in higher institutions, which is a good sign. There is a slight drop in number of students in year 2017. However, at first glance, such small fluctuation in number of students seems natural throughout the years. This might be simply due to Natural Variations.

We can also see that number of domestic students are much higher than international students throughout the years. Number of domestic students increase faster as well. The increase in total number of students seems to come mostly from the increase of Domestic Students. This observation is quite expected since government must emphasize on providing higher educations to their citizens.

Data Transformation actions:

Count was results of data tranformation done by geom_bar.

Reason of Transformation:

The figure above concerns the number of male , female and all students enrolled in each year from 2015 to 2017.

# table() aggregates according the Institution
yearSums <- table(natEnrol$Year,natEnrol$gender)
# as.data.frame() converts table object into a data frame
yearDf <- as.data.frame(yearSums)
# taking only rows with non-zero frequency
yearDf2 <- subset(yearDf,yearDf$Freq!=0)
# rename columns
colnames(yearDf2)<-c("enrol.Year", "enrol.gender", "count")

ggplot(yearDf2, mapping = aes(x = enrol.Year, y = count, group = enrol.gender , color = enrol.gender)) + geom_point() + geom_line() + labs(title = "Number of Students from 2005~2017 - Segregated by gender", y = "Number of Students of each gender" , x = "Year", color = "Gender")

Interpretation:

Throughout the years, the number of female students are persistanly higher than male students. Throughout the years, number of male and female students seems to be move hand in hand and positively correlated. The only exception is in year 2017, where number of female students increase but number of male student drops. This also indicates that the fall in total of number of students are due to fall in number of male students. The fall in number of male students are greater than the increase of female students. It might be worth while to examine the cause of the fall of male students in 2017.

Data Transformation actions:

Form Table of Year, Gender and the respective Counts. Assign new Data Frame of 3 columns to a new variable. Subsetting Datasets to omit irrevalent rows to get inner joint of 3 columns. Renaming Columns for easier handling of data.

Reason of Transformation:

To get a new Data Frame with only 3 variables that we need for this line chart. To count number of students as geom_point and geom_line does not transform data to get count automatically like geom_bar.

Objective 6:

ATAR Distributions in different types of institutions.

#Omit data with "Unknown" ATAR_Group
knownATAR <- natEnrol[natEnrol$ATAR_Group != "Unknown", ]
#Convert "atar" to numeric variables
knownATAR$atar <- as.numeric(knownATAR$atar)
#Replace ATAR_Group data of ">=99" with "99=<"
knownATAR[knownATAR$ATAR_Group == ">=99",]$ATAR_Group <- "99=<"

c <- ggplot(knownATAR) + geom_boxplot(mapping = aes(x = "", y = atar),na.rm = TRUE) + labs(x= "", y = "Overall  ATAR  score")

d <- ggplot(knownATAR) + geom_boxplot(mapping = aes(x = Institution, y = atar, fill = Institution_Type),na.rm = TRUE, show.legend = FALSE) + coord_flip() + labs(x= "", y = "ATAR  score by Institutions", title = "Boxplot of ATAR Scores")

grid.arrange(d,c, widths=c(9/10, 1/10), ncol = 2)


ggplot(knownATAR) + geom_bar(mapping = aes(x= ATAR_Group, fill = Institution_Type), position ="identity", show.legend = TRUE) + coord_flip() + labs(title="Number of students in different ATAR score ranges", y ="Number of Students", x = "ATAR Range",fill = "Type of Institution") + facet_wrap(facets = (.~Institution_Type),scales="free")


ggplot(knownATAR) + geom_bar(mapping = aes(x= ATAR_Group, fill = Institution_Type), position ="fill", show.legend = FALSE) + coord_flip() + labs(title="Proportions of Institution Types among students in different ATAR range", y ="Proportions", x = "ATAR Range")

Interpretation:

Overall, most institution in group of 8 have students with higher ATAR scores and higher median of ATAR Scores. Dispersion of ATAR scores of students in group of 8 seems to be narrower as well. (referring to their respective interquatile range) This might be due to institution in group of 8 have higher ATAR requirement.

It is also worth to take note that the overall median ATAR score of all students is slighty above 80. However, six out of eight G8 universities’ students have median ATAR score at or above 90. Even the remaining two G8 universities’s students have ATAR score median greater than 85. Interestingly, both institutions that are considered a college have students with median ATAR score around 83, which are higher than many non-G8 univerisities.

We can see that the mode ATAR group of G8 is at 90-95 while non-G8’s mode is at 80-85. ATAR score of both G8 and non-G8 seems to be loosely normal. The mode of ATAR score of students in college is at range 85-90.

Non-G8 universities have much more students in total. Perhaps, simply due to the much higher number of institutions in non-G8 category.

Last but not least, it seems that G8 universities have positive correlations with good ATAR scores. Students in group with higher ATAR score have higher percentage of them enrolled in G8. This might indicate a strong preference for G8 universities among students with good results.

Data Transformation actions:

Omit data with “Unknown” ATAR_Group Convert “atar” to numeric variables Replace ATAR_Group data of “>=99” with “99=<”

Reason of Transformation:

Data with “Unknown” ATAR_Group also have adnormal/unsensible ATAR values. Hence, it is very hard to make use of these ATAR related data.

Converting “atar” from factor to numeric allow us to compute various statistics such as median , inter-quatile range and etc.

Replacing ATAR_Group data of “>=99” with “99=<” allow barplot of ATAR_Group to be arranged from group with highest ATAR score to the lowest.

LS0tCnRpdGxlOiAiUHJvamVjdCAxIC0gSW50cm9kdWN0aW9uIHRvIERhdGEgU2NpZW5jZSwgMjIxMjY5NTQgLSBZaXQgVHNpbiBDaG9vaSAiCm91dHB1dDogaHRtbF9ub3RlYm9vawotLS0KCgojI0ludHJvZHVjdGlvbjoKCkRhdGFzZXQgb2YgIk5hdGlvbmFsIEVucm9sbG1lbnQgRGF0YSBTZXQiIGlzIGJlaW5nIHVzZWQgaW4gdGhpcyByZXNlYXJjaC4gVGhlIGVudGlyZSBkYXRhc2V0IHNwYW5zIGFjcm9zcyAxMyB5ZWFycyAoMjAwNSB0byAyMDE3KSwgY292ZXJzIDQxIEF1c3RyYWxpYW4gVW5pdmVyc2l0aWVzLCBhbmQgaGFzIGEgdG90YWwgb2YgIDEyODk2OTYyIHJlY29yZHMsIHdpdGggYSBmaWxlIHNpemUgNi40IEdCLiBUbyBtYWtlIHRoaXMgdXNhYmxlLCBhIHN0cmF0aWZpZWQgZGF0YXNldCB3aXRoIDElIHJlY29yZHMgZnJvbSBlYWNoIGluc3RpdHV0aW9uIGlzIGNyZWF0ZWQuCgpUaGUgb2JqZWN0aXZlIG9mIHRoaXMgcmVzZWFyY2ggaXMgdG8gYmUgYWJsZSB0byBnYWluIHVzZWZ1bCBwcmVkaWN0aW9ucyBhbmQgaW5zaWdodHMsIHdoaWNoIGluY2x1ZGVzOgoKMSkgUG9wdWxhcml0eSBvZiB1bml2ZXJzaXRpZXMgYW5kIGl0J3MgcmVsYXRpb24gdG8gRzggc3RhdHVzIGFuZCBSZWdpb25zLgoyKSBGaWVsZCBvZiBzdHVkeSB0aGF0IGVhY2ggdW5pdmVyc2l0eSBhbmQgcmVnaW9uIHNwZWNpYWxpemVzIChpZiBhbnkpIAozKSBEaWZmZXJlbmNlcyBpbiB0aGUgcHJlZmVyZW5jZXMgb2YgSW50ZXJuYXRpb25hbCBTdHVkZW50cyBhbmQgRG9tZXN0aWMgU3R1ZGVudHMuIChyZWdpb24gYW5kIGZpZWxkIG9mIHN0dWR5KQo0KSBJbmRpY2F0aW9uIG9mIGdlbmRlci1zZWdyZWdhdGlvbiBpbiBGaWVsZCBvZiBTdHVkeS4KNSkgWWVhciB0cmVuZHMgb2YgbnVtYmVyIG9mIHN0dWRlbnRzIGVucm9sbGVkIGluIGhpZ2hlciBpbnN0aXR1dGlvbnMuCjYpIEFUQVIgRGlzdHJpYnV0aW9ucyBpbiBkaWZmZXJlbnQgdHlwZXMgb2YgaW5zdGl0dXRpb25zLiAKCldlIHNoYWxsIHJlYWQgdGhlIENTViAoQ29tbWEgU2VwZXJhdGVkIFZhbHVlcykgZmlsZSBpbnRvIFIgd2l0aCB0aGUgZGF0YSBhc3NpZ25lZCB0byB2YXJpYWJsZSAibmF0RW5yb2wiLgoKYGBge3IgcmVzdWx0cyA9J2hpZGUnfQojbmF0RW5yb2wgPC0gcmVhZC5jc3YoZmlsZT0iaDovRG93bmxvYWRzL0ludHJvIHRvIERhdGEgU2NpZW5jZS9Qcm9qZWN0IDEzdGggU2VwL25hdF9lbnJvbF8xLmNzdiIsIGhlYWRlcj1UUlVFLCBzZXA9IiwiKQoKbGlicmFyeShyZWFkcikKbmF0RW5yb2w8LSByZWFkX2NzdigibmF0X2Vucm9sXzEuY3N2IikKYGBgCgpGaXJzdGx5LCB3ZSBzaGFsbCBvYnNlcnZlIHN0cnVjdHVyZSBvZiBkYXRhIHRvIGhhdmUgYW4gb3ZlcnZpZXcgb2YgdGhlIGRhdGEKCmBgYHtyIHJlc3VsdHMgPSAnaGlkZSd9CnN0cihuYXRFbnJvbCkKYGBgCgpXZSBjYW4gc2VlIHRoYXQgdGhlcmUgMTI4OTY3IHN0dWRlbnRzIGRhdGEgaW4gdGhpcyBmaWxlIGFuZCB0aGVyZSBhcmUgNDYgdmFyaWFibGVzIGZvciBlYWNoIHN0dWRlbnQuCgpGcm9tIHRoZSBuYW1lLCB0eXBlIGFuZCBleGFtcGxlIG9mIHRoZSB2YXJpYWJsZXMsIHdlIGNhbiB1bmRlcnN0YW5kIHNvbWUgYXR0cmlidXRlcyBvZiB0aGVzZSA0NiB2YXJpYWJsZXMuCgpYKGludCkgbG9va3MgbGlrZSBhbiBpbmRleCBmb3IgdGhlIHN0dWRlbnRzIGRhdGEuCk9ubHkgMSB2YXJpYWJsZSBsb29rcyBsaWtlIHNlbnNpYmxlIG51bWVyaWNhbCBkYXRhLCBuYW1lbHk6IG5vRW5yb2woaW50KSB3aGljaCBsb29rcyBsaWtlIG51bWJlciBvZiBlbnJvbG1lbnQgb2YgdGhlIHN0dWRlbnQuClZhcmlibGUgImlkIihpbnQpIGxvb2tzIGxpa2Ugc3R1ZGVudCBJRC4KVmFyaWFibGUgInVwZGF0ZXdoZW4iIChGYWN0b3IpIGlzIHRoZSBkYXRlIGFuZCB0aW1lIG9mIGRhdGEgdXBkYXRlcy4KVmFyaWFibGUgInVwZGF0ZXdobyIgKEZhY3RvcikgaXMganVzdCBhIHJlY29yZCBvZiB0aGUgcGFydHkgd2hvIGtleSBpbiB0aGlzIGRhdGEuCgpBdCB0aGlzIHBvaW50LCB0aGVyZSBhcmUgNCB2YXJpYWJsZXMgdGhhdCB3ZSBjYW4ndCBoYXZlIGdvb2QgdW5kZXJzdGFuZGluZyB5ZXQsIG5hbWVseToKCiJtY2VldHlhX3JlZ2lvbmFsX3JlbW90ZV9jb3VudCIiLCAiYXNnc19yZWdpb25hbF9yZW1vdGVfY291bnQiIiAsICJvbnNob3JlX2luZGljYXRvciIiIGFuZCAicmVnaW9uYWxyZW1vdGVfdmFsdWUiIAoKT3RoZXJzIDM3IHZhcmlhYmxlcyhmYWN0b3IpIGxvb2tzIGxpa2UgY2F0b2dlcmlhbCBkYXRhIHdpdGggdGhlIG51bWJlciBvZiBsZXZlbHMgc3BlY2lmaWVkLgoKVGhlIGxldmVscyBvZiB0aGUgdmFyaWFibGVzIHRlbGwgdXMgdmFyaW9zIGltcG9ydGFudCBpbmZvcm1hdGlvbi4gCkZvciBleGFtcGxlLCB0aGUgc3RydWN0dXJlIG9mIHZhcmFpYmxlcyAiSW5zdGl0dXRpb24iIGFuZCAiSW5zdGl0dXRpb25fVHlwZSIgc2hvdyB1cyB0aGF0IHRoZSBhcmUgNDEgSW5zdGl0dXRpb24gYW5kIHRoZXNlIEluc3RpdHV0aW9uIGFyZSBjYXRvZ2FyaXplZCBpbnRvIDMgdHlwZXMuCgpJdCBhcHBlYXJzIHRoYXQgdGhlcmUgYXJlIHNvbWUgdmFyaWFibGVzIHRoYXQgbWlnaHQgbmVlZCBzb21lIHRyYW5zZm9ybWF0aW9uIGxhdGVyIG9uIHRvIGhhdmUgbW9yZSBzZW5zaWJsZSBsZXZlbHMuIApGb3IgZXhhbXBsZSwgaGF2aW5nIDE4IGxldmVscyBmb3IgYWdlIGFyZSB0b28gbXVjaC4KCkl0IGFwcGVhcnMgdGhhdCB0aGVyZSBhcmUgc29tZSBkYXRhIGFibm9ybWFsaXRpZXMgYW5kIG1pc3NpbmcgdmFsdWVzIGFzIHdlbGwuIApGb3IgZXhhbXBsZSwgaGF2aW5nIEFUQVIgb2YgMSBzZWVtcyB1bnNlbnNpYmxlIGFuZCBhIG51bWJlciBvZiAiTkEicyBoYXZlIGJlZW4gZGV0ZWN0ZWQgZm9yIHRoZXNlIDQgdmFyaWFibGVzOgoKIm1jZWV0eWFfcmVnaW9uYWxfcmVtb3RlX2NvdW50IiIsICJhc2dzX3JlZ2lvbmFsX3JlbW90ZV9jb3VudCIiICwgIm9uc2hvcmVfaW5kaWNhdG9yIiIgYW5kICJyZWdpb25hbHJlbW90ZV92YWx1ZSIgCgpOb3csIHdlIHdvdWxkIGxpa2UgdG8gc2VlIHRoZSBzdW1tYXJ5IG9mIHRoZSBkYXRhIHRvIGdhaW4gZnVydGhlciBpbnNpZ2h0LgoKYGBge3IgcmVzdWx0cyA9ICdoaWRlJ30Kc3VtbWFyeShuYXRFbnJvbCkKYGBgCgpGcm9tIHRoZSBzdW1tYXJ5LCB3ZSBjYW4gZ2FpbiB2YXJpb3VzIHVzZWZ1bCBpbmZvcm1hdGlvbnMgbGlrZSBudW1iZXIgb2YgaW50ZXJuYXRpb25hbCBzdHVkZW50cywgbnVtYmVyIG9mIGVuZ2xpc2ggc3BlYWtpbmcgc3R1ZGVudHMgYW5kIGV0Yy4KV2Ugd2lsbCBjb21lIGJhY2sgdG8gdGhlc2UgbGF0ZXIgd2hlbiB3ZSBzdGFydCB0byBhbnN3ZXIgdGhlIHF1ZXN0aW9ucyByZWxhdGVkIHRvIG91ciBvYmplY3RpdmVzLgoKSGVyZSwgd2Ugd291bGQgbGlrZSB0byBmb2N1cyBvbiBoaWdobGlnaHRpbmcgZGF0YSBhYm5vcm1hbGl0aWVzLCBtaXNzaW5nIHZhbHVlcyBhbmQgdGhlIGxpbmsgaW4gYmV0d2VlbiB2YXJpYWJsZXMuCgoxKSAibWNlZXR5YV9yZWdpb25hbF9yZW1vdGVfY291bnQiIiwgImFzZ3NfcmVnaW9uYWxfcmVtb3RlX2NvdW50IiIgLCAib25zaG9yZV9pbmRpY2F0b3IiIiBhbmQgInJlZ2lvbmFscmVtb3RlX3ZhbHVlIiBoYXZlIHdheSB0b28gbWFueSBtaXNzaW5nIHZhbHVlcy4gTWlnaHQgbm90IGJlIHVzZWZ1bC4KCjIpICJhdGFyIiBoYXZlIHZhcmlvdXMgZGF0YSBhYm5vcm1hbGl0aWVzLCBhdGFyID0gOTk5LDk5OCBhbmQgMSBkb24ndCBtYWtlIHNlbnNlLiAKTHVja2lseSwgd2UgaGF2ZSAiQVRBUl9Hcm91cCIgdGhhdCBnaXZlIHNpbWlsYXIgaW5mb3JtYXRpb24gb24gc3R1ZGVudCdzIEFUQVIgc2NvcmVzLCB3ZSBzaGFsbCBjb21wYXJlIHRoZW0gbGF0ZXIgdG8gc2VlIGlmIGl0IGlzIHBvc3NpYmxlIHRvIGdldCBzZW5zaWJsZSB0cmFuc2Zvcm1hdGlvbiBvZiAiYXRhciIuCgpOb3csIHdlIHdvdWxkIGxpa2UgdG8gc2VlIHRoZSBleGFtcGxlIG9mIHRoZSBmaXJzdCA0MCBkYXRhIHRvIGdhaW4gZnVydGhlciBpbnNpZ2h0LgoKYGBge3IgcmVzdWx0cyA9ICdoaWRlJ30KaGVhZChuYXRFbnJvbCxuID0gMTApCmBgYAoKWF9GaWVsZF9vZl9FZHVjYXRpb24gYW5kIFhfU3VwcF9maWVsZF9vZl9lZHVjYXRpb24gc2VlbXMgdG8gYmUgcmVsYXRlZCB0byBjb3Vyc2UgbmFtZS4KCkZvciBleGFtcGxlOgoKWF9GaWVsZF9vZl9FZHVjYXRpb24JICBYX1N1cHBfZmllbGRfb2ZfZWR1Y2F0aW9uCSAgICAgICAgY291cnNlX25hbWUKOTA5MDAJICAgICAgICAgICAgICAgICAgMTAwMzAwCSAgICAgICAgICAgICAgICAgICAgICAgICAgQmFjaGVsb3Igb2YgTGF3cyAoSG9ub3VycykvQiBWaXN1YWxBcnRzCjkwOTAwCSAgICAgICAgICAgICAgICAgIDkxOTAxCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBCYWNoZWxvciBvZiBMYXdzIChIb25vdXJzKS9CIEVjb25vbWljcwo4MDAwMAkgICAgICAgICAgICAgICAgICA5MTkwMQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgQiBDb21tZXJjZS9CIEVjb25vbWljcwoKRnJvbSB0aGVzZSAzIHJvd3Mgd2UgY2FuIHNlZSB0aGF0IDkwOTAwIHJlZmVycyB0byBCYWNoZWxvciBvZiBMYXdzIGFuZCA5MTkwMSByZWZlcnMgdG8gQmFjaGVsb3Igb2YgCkVjb25vbWljcy4KClhfRmllbGRfb2ZfRWR1Y2F0aW9uIGlzIHRoZSBjb3Vyc2UgY29kZSBvZiB0aGUgbWFpbiBjb3Vyc2UgbmFtZS4KClhfU3VwcF9maWVsZF9vZl9lZHVjYXRpb24gaXMgdGhlIGNvdXJzZSBjb2RlIG9mIHRoZSBzdWJzaWRhcnkgY291cnNlIG5hbWUuCgpTaW5jZSB0aGVyZSBhcmUgbG90cyBvZiBtaXNzaW5nIHZhbHVlcyBpbiAiY291cnNlIG5hbWUiLCAKIlhfRmllbGRfb2ZfRWR1Y2F0aW9uIiBhbmQgIlhfU3VwcF9maWVsZF9vZl9lZHVjYXRpb24iIHNoYWxsIGdpdmUgdXMgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY291cnNlcyBlbnJvbGxlZCBieSB0aGUgc3R1ZGVudHMuCgpJbiBmYWN0LCBtZWFuaW5nIG9mICJYX0ZpZWxkX29mX0VkdWNhdGlvbiIgYW5kICJYX1N1cHBfZmllbGRfb2ZfZWR1Y2F0aW9uIiBjYW4gYmUgZm91bmQgZnJvbSB0aGUgbGluayBiZWxvdzoKCmh0dHBzOi8vaGVpbXNoZWxwLmVkdWNhdGlvbi5nb3YuYXUvcmVzb3VyY2VzL2ZpZWxkLW9mLWVkdWNhdGlvbi10eXBlcwoKT3IsIGlmIHdlIGFyZSBpbnRlcmVzdGVkIGluIGEgYnJvYWRlciBwZXJzcGVjdGl2ZSwgImJyb2FkX2ZvZSIiIGFuZCAiTmFycm93X0ZPRSIgY2FuIHRlbGwgdXMgdGhlIGZpZWxkIHN0dWRpZWQgYnkgdGhlIHN0dWRlbnRzLgoKTmV4dCwgd2Ugc2hhbGwgZXhwbG9yZSB2YXJpb3VzIHJlbGF0aW9uc2hpcHMgb2YgdGhlc2UgdmFyaWFibGVzIHRvIGdhaW4gbWVhbmluZ2Z1bCBpbnNpZ2h0cwoKSW4gdGhpcyByZXBvcnQsIHdlIHdpbGwgbWFpbmx5IHVzZSBnZ3Bsb3QgdG8gdmlzdWFsaXplIG91ciBkYXRhLiBIZW5jZSwgd2Ugc2hhbGwgZmlyc3QgaW1wb3J0IG1vZHVsZSBnZ3Bsb3QyLgoKYGBge3J9CmxpYnJhcnkoZ2dwbG90MikKbGlicmFyeShncmlkRXh0cmEpCmBgYAoKVG8gc2ltcGxpZnkgb3VyIGdncGxvdCBjb2RlLCB3ZSB3aWxsIGFzc2lnbiB2YXJpYWJsZSAiZyIiIGFzIGdncGxvdCBvZiBkYXRhICJuYXRFbnJvbCIuCgpgYGB7cn0KZyA8LSBnZ3Bsb3QobmF0RW5yb2wpCmBgYAoKCk5vdywgd2Ugc2hhbGwgc2VlIGlmIG91ciBkYXRhIGNhbiBwcm92aWRlIGNsdWVzIGZvciBhbnkgYW5zd2VycyByZWxhdGVkIHRvIG91ciBvYmplY3RpdmVzLgoKIyNPYmplY3RpdmUgMTogCgpQb3B1bGFyaXR5IG9mIHVuaXZlcnNpdGllcyBhbmQgaXQncyByZWxhdGlvbiB0byBHOCBzdGF0dXMgYW5kIGl0J3MgUmVnaW9ucy4KCmBgYHtyfQojIHRhYmxlKCkgYWdncmVnYXRlcyBhY2NvcmRpbmcgdGhlIEluc3RpdHV0aW9uLCBJbnN0aXR1dGlvbiBUeXBlcyBhbmQgU3RhdGVzCmluc3RTdW1zIDwtIHRhYmxlKG5hdEVucm9sJEluc3RpdHV0aW9uLG5hdEVucm9sJEluc3RpdHV0aW9uX1R5cGUsbmF0RW5yb2wkc3RhdGUgKQojIGFzLmRhdGEuZnJhbWUoKSBjb252ZXJ0cyB0YWJsZSBvYmplY3QgaW50byBhIGRhdGEgZnJhbWUKaW5zdERmIDwtIGFzLmRhdGEuZnJhbWUoaW5zdFN1bXMpCiMgdGFraW5nIG9ubHkgcm93cyB3aXRoIG5vbi16ZXJvIGZyZXF1ZW5jeQppbnN0RGYyIDwtIHN1YnNldChpbnN0RGYsaW5zdERmJEZyZXEhPTApCiMgcmVuYW1lIGNvbHVtbnMKY29sbmFtZXMoaW5zdERmMik8LWMoInN0dS5JbnN0IiwiaW5zdC50eXBlIiwiaW5zdC5zdGF0ZSIsICJjb3VudCIpCgoKZ2dwbG90KGluc3REZjIpICsgZ2VvbV9iYXIobWFwcGluZz0gKGFlcyh4PSByZW9yZGVyKHN0dS5JbnN0LGNvdW50KSAsIHkgPSBjb3VudCAsIGZpbGwgPSBpbnN0LnR5cGUgKSksIHN0YXQgPSAiaWRlbnRpdHkiKSArIGNvb3JkX2ZsaXAoKSArIGxhYnModGl0bGU9Ik51bWJlciBvZiBTdHVkZW50cyBpbiBlYWNoIEluc3RpdHV0aW9uIiwgeSA9Ik51bWJlciBvZiBTdHVkZW50cyIsIHggPSAiSW5zdGl0dXRpb24iLCBmaWxsID0gIlR5cGVzIG9mIEluc3RpdHV0aW9uIikKCgpnZ3Bsb3QoaW5zdERmMikgKyBnZW9tX2JhcihtYXBwaW5nPSAoYWVzKHg9IHJlb3JkZXIoc3R1Lkluc3QsY291bnQpICwgeSA9IGNvdW50ICwgZmlsbCA9IGluc3Quc3RhdGUgKSksIHN0YXQgPSAiaWRlbnRpdHkiKSArIGNvb3JkX2ZsaXAoKSsgbGFicyh0aXRsZT0iTnVtYmVyIG9mIFN0dWRlbnRzIGluIGVhY2ggSW5zdGl0dXRpb24iLCB5ID0iTnVtYmVyIG9mIFN0dWRlbnRzIiwgeCA9ICJJbnN0aXR1dGlvbiIsIGZpbGwgPSAiU3RhdGVzIG9mIEluc3RpdHV0aW9uIikKCmBgYAoKI0ludGVycHJldGlvbnM6ClRoZSBGaWd1cmVzIGFib3ZlIHNob3dzIHRoZSBudW1iZXIgb2Ygc3R1ZGVudHMgb2YgZWFjaCBpbnN0aXR1dGlvbnMgYW5kIHRoZWlyIHJlc3BlY3RpdmUgcmFua2luZyBhY2NvcmRpbmcgdG8gdGhlIG51bWJlciBvZiBzdHVkZW50cy4KCkZpdmUgb3V0IG9mIGVpZ2h0IEc4IGluc3RpdHV0aW9ucyBhcmUgcmFua2VkIGF0IHRoZSB0b3AuIEhpbnRpbmcgdGhhdCBHOCBzdGF0dXMgbWlnaHQgYmUgY29ycmVsYXRlZCB3aXRoIHRoZSBudW1iZXIgb2Ygc3R1ZGVudHMgZW5yb2xsZWQgdG8gdGhlIGluc3RpdHV0aW9uLgoKSW50ZXJlc3RpbmdseSwgYWx0aG91Z2ggVW5pdmVyc2l0eSBvZiBBZGVsYWlkZSwgVW5pdmVyc2l0eSBvZiBXZXN0ZXJuIEF1c3RyYWxpYShVV0EpIGFuZCBUaGUgQXVzdHJhbGlhbiBOYXRpb25hbCBVbml2ZXJzaXR5KEFOVSkgYXJlIEc4IGluc3RpdHV0aW9ucywgdGhleSBoYXZlIHJlbGF0aXZlbHkgbXVjaCBsZXNzIHN0dWRlbnRzIGNvbXBhcmUgdG8gdGhlIG90aGVycy4KClRoZSBzZWNvbmQgZmlndXJlIGdhdmUgdXMgc29tZSBpbnNpZ2h0IG9uIHRoaXMgb2JzZXJ2YXRpb24uIEl0IHNlZW1zIHRoZSB0b3AgMTAgaW5zdGl0dXRpb25zIHdpdGggdGhlIG1vc3Qgc3R1ZGVudHMgYXJlIGZyb20gVmljdG9yaWEsIE5ldyBTb3V0aCBXYWxlcyBhbmQgTm9ydGhlcm4gVGVycml0b3J5LiBJbiBmYWN0LCB0aGVyZSBhcmUgb25seSB0aHJlZSBpbnN0aXR1dGlvbnMgbm90IGZyb20gdGhlc2UgdGhyZWUgcmVnaW9ucyBpbiB0aGUgdG9wIDIwLiBGdXJ0aGVybW9yZSwgYWxsIHRocmVlIEc4IGluc3RpdHV0aW9ucyB3aXRoIGxlc3Mgc3R1ZGVudHMgYXJlIGZyb20gbmVpdGhlciBvZiB0aGVzZSAzIHJlZ2lvbnMgYXMgd2VsbC4gCgpUaGlzIG1pZ2h0IGluZGljYXRlcyB0aGF0IHRoZSBpbnN0aXR1dGlvbidzIGxvY2F0aW9uICh3aGV0aGVyIG9yIG5vdCBpdCBpcyBpbiBWSUMsIE5TVyBvciBOVCkgb2YgdGhlIGluc3RpdHV0aW9uIG1pZ2h0IGJlIGV2ZW4gbW9yZSBjb3JyZWxhdGVkIHdpdGggdGhlIG51bWJlciBvZiBzdHVkZW50cyBlbnJvbGxlZC4KCiNEYXRhIFRyYW5zZm9ybWF0aW9uIGFjdGlvbnM6CkZvcm0gVGFibGUgb2YgSW5zdGl0dXRpb24sIEluc3RpdHV0aW9uIFR5cGVzLCBTdGF0ZSBvZiBJbnN0aXR1dGlvbiBhbmQgdGhlIHJlc3BlY3RpdmUgQ291bnRzLgpBc3NpZ24gbmV3IERhdGEgRnJhbWUgb2YgNCBjb2x1bW5zIHRvIGEgbmV3IHZhcmlhYmxlLgpTdWJzZXR0aW5nIERhdGFzZXRzIHRvIG9taXQgaXJyZXZhbGVudCByb3dzIHRvIGdldCBpbm5lciBqb2ludCBvZiAzIGNvbHVtbnMuClJlbmFtaW5nIENvbHVtbnMgZm9yIGVhc2llciBoYW5kbGluZyBvZiBkYXRhLgoKI1JlYXNvbiBvZiBUcmFuc2Zvcm1hdGlvbjogClRvIGdldCBhIG5ldyBEYXRhIEZyYW1lIHdpdGggb25seSA0IHZhcmlhYmxlcyB0aGF0IHdlIG5lZWQgZm9yIHRoZXNlIGJhcmNoYXJ0cy4KVG8gY291bnQgbnVtYmVyIG9mIHN0dWRlbnRzIGJlZm9yZSBnZW9tX2JhciBzbyB0aGF0IGl0IGlzIHBvc3NpYmxlIHRvIGFycmFuZ2UgdGhlIGJhcmNoYXJ0cyBhY2NvcmRpbmcgdG8gdGhlIG51bWJlciBvZiBzdHVkZW50cyAuCgoKIyNPYmplY3RpdmUgMjogCgpGaWVsZCBvZiBzdHVkeSB0aGF0IGVhY2ggdW5pdmVyc2l0eSBhbmQgcmVnaW9uIHNwZWNpYWxpemVzIChpZiBhbnkpIAoKYGBge3J9CnNUaGVtZSA8LSBjKCIjMDAwMDAwIiwgIiNFNjlGMDAiLCAiIzU2QjRFOSIsICIjMDA5RTczIiwgIiNGMEU0NDIiLCAiIzAwNzJCMiIsICIjRDU1RTAwIiwgIiNDQzc5QTciLCAiIzk5OTkwMCIsICIjMDAwNTY5IiwgIiNFNjAwRTkiLCAiIzU2MDAwOSIsICIjMDM1MDUwIikKCnN1bW1hcnkobmF0RW5yb2xbbmF0RW5yb2wkYnJvYWRfZm9lID09ICIiIHwgaXMubmEobmF0RW5yb2wkYnJvYWRfZm9lKSA9PSBUUlVFLCJicm9hZF9mb2UiXSkKCmtub3duRm9lIDwtIG5hdEVucm9sW25hdEVucm9sJGJyb2FkX2ZvZSAhPSAiIiAmIGlzLm5hKG5hdEVucm9sJGJyb2FkX2ZvZSkgPT0gRkFMU0UsXQoKa25vd25Gb2Vba25vd25Gb2UkYnJvYWRfZm9lID09ICJGb29kLCBIb3NwaXRhbGl0eSBBbmQiLF0kYnJvYWRfZm9lIDwtICJGb29kLCBIb3NwaXRhbGl0eSBBbmQgUGVyc29uYWwgU2VydmljZSIgCgpnZ3Bsb3Qoa25vd25Gb2UpICsgZ2VvbV9iYXIobWFwcGluZyA9IGFlcyh4PSBJbnN0aXR1dGlvbiwgZmlsbD1icm9hZF9mb2UpLCBwb3NpdGlvbiA9ImZpbGwiKSArIGNvb3JkX2ZsaXAoKSArIGxhYnModGl0bGU9IlByb3BvcnRpb25zIG9mIEZpZWxkIGluIGVhY2giLCB5ID0iUHJvcG9ydGlvbiIsIHggPSAiSW5zdGl0dXRpb24iLCBmaWxsID0gIkZpZWxkIG9mIFN0dWR5IikgKyBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXM9c1RoZW1lKQpgYGAKCiNJbnRlcnByZXRhdGlvbjoKImZvZSIgcmVmZXJzIHRvIEZpZWxkIG9mIFN0dWR5IG1lbnRpb25lZCBpbiBodHRwczovL2hlaW1zaGVscC5lZHVjYXRpb24uZ292LmF1L3Jlc291cmNlcy9maWVsZC1vZi1lZHVjYXRpb24tdHlwZXMuCgpGcm9tIHRoZSBmaWd1cmUgYWJvdmUsIGl0IHNlZW1zIHRoYXQgbW9zdCBpbnN0aXR1dGlvbnMgaGF2ZSBubyBvYnZpb3VzIHNwZWNpYWxpemF0aW9uIGluIGFueSBmaWVsZC4gSG93ZXZlciwgaXQgaXMgd29ydGggdG8gbm90ZSB0aGF0IEFOVSBoYXMgdGhlIGhpZ2hlc3QgcHJvcG9ydGlvbiBvZiBzdHVkZW50cyBzdHVkeWluZyBpbiBzb2NpZXR5IGFuZCBjdWx0dXJlLiAKCiMjRGF0YSBUcmFuc2Zvcm1hdGlvbiBhY3Rpb25zOgpDb3VudCBhbmQgUHJvcG9ydGlvbiB3YXMgcmVzdWx0cyBvZiBkYXRhIHRyYW5mb3JtYXRpb24gZG9uZSBieSBnZW9tX2JhcgpTdWJzZXR0aW5nIERhdGFzZXRzIHRvIG9taXQgcm93cyB3aXRoIGVtcHR5IGRhdGEgb3IgTkEgaW4gYnJvYWRfZm9lIChGaWVsZCkKQXNzaWduaW5nIHN1YnNldGVkIERhdGEgRnJhbWUgdG8gYSBuZXcgdmFyaWFibGUgKGtub3dGb2UpIGZvciBjb252ZW5pZWNlIHRvIGFjY2VzcyBsYXRlci4KCkNoYW5nZSBDb2x1bW4gdGl0bGUgIkZvb2QsIEhvc3BpdGFsaXR5IEFuZCIgdG8gIkZvb2QsIEhvc3BpdGFsaXR5IGFuZCBQZXJzb25hbCBTZXJ2aWNlIgoKI1JlYXNvbiBvZiBUcmFuc2Zvcm1hdGlvbjogClRoZSBmaWd1cmVzIGhlcmUgY29uY2VybnMgb24gdGhlIHByb3BvcnRpb25zIG9mIGZpZWxkIG9mIHN0dWR5IGZvciBlYWNoIGluc3RpdHV0aW9uLgpUaGVyZSBhcmUgb25seSAxNTI4IE5BIG9yIGVtcHR5IGRhdGEgYW1vbmcgMTI4OTY3IGRhdGFzLgpXaXRoIHN1Y2ggbG93ICUgb2YgbWlzc2luZyB2YWx1ZXMsIGl0IGlzIHNhZmUgdG8gb21pdCwgc2luY2UgZG9pbmcgc28gd29uJ3QgYWZmZWN0IHRoZSBwcm9wb3J0aW9ucyBtdWNoLgoKQ2hhbmdlIENvbHVtbiB0aXRsZSAiRm9vZCwgSG9zcGl0YWxpdHkgQW5kIiB0byAiRm9vZCwgSG9zcGl0YWxpdHkgYW5kIFBlcnNvbmFsIFNlcnZpY2UiIGZvciBlYXNpZXIgdW5kZXJzdGFuZGluZy4KCmBgYHtyfQpnZ3Bsb3Qoa25vd25Gb2UpICsgZ2VvbV9jb3VudChtYXBwaW5nID0gYWVzKHggPSBzdGF0ZSwgeSA9IGJyb2FkX2ZvZSwgc2l6ZSA9IHN0YXQocHJvcCksIGdyb3VwID0gc3RhdGUsIGNvbG91ciA9IHN0YXRlKSwgc2hvdy5sZWdlbmQgPSBjKGNvbG91cj1GQUxTRSkpICsgbGFicyhzaXplID0gIlByb3BvcnRpb25zIGJ5IFN0YXRlcyIpICsgZ2d0aXRsZSgiUHJvcG9ydGlvbnMgb2YgRmllbGQgaW4gZWFjaCBTdGF0ZXMiKSArIHlsYWIoIkZpZWxkIG9mIHN0dWR5IikgKyB4bGFiKCJTdGF0ZXMiKQpgYGAKI0ludGVycHJldGF0aW9uOgpGcm9tIHRoZSBmaWd1cmUgYWJvdmUsIGl0IHNlZW1zIHRoYXQgbW9zdCBzdGF0ZXMgaGF2ZSBubyBvYnZpb3VzIHNwZWNpYWxpemF0aW9uIGluIGFueSBmaWVsZC4KCkFDVCBoYXZlIHRoZSBoaWdoZXN0IHByb3BvcnRpb25zIGluIFNvY2lldHkgYW5kIEN1bHR1cmUuIApGcm9tIHByZXZpb3VzIGJhcmNoYXJ0cywgd2Uga25vdyB0aGF0IEFOVSBpcyB0aGUgaW5zdGl0dXRlIHdpdGggdGhlIG1vc3Qgc3R1ZGVudHMgaW4gQUNULgpBTlUgYmVpbmcgdGhlIGluc3RpdHV0aW9uIHdpdGggaGlnaGVzdCBwZXJjZW50YWdlIG9mIHN0dWRlbnRzIHN0dWR5aW5nIFNvY2lldHkgYW5kIEN1bHR1cmUgbWlnaHQgYmUgYSBjb250cmlidXRpbmcgZmFjdG9yLgoKTVVMIGhhdmUgdGhlIGhpZ2hlc3QgcHJvcG9ydGlvbnMgaW4gSGVhbHRoIGFuZCBFZHVjYXRpb24uClRoZXJlIGFyZSBvbmx5IHZlcnkgc21hbGwgcHJvcG9ydGlvbnMgb2Ygc3R1ZGVudHMgc3R1ZHlpbmcgb24gRm9vZCwgSG9zcGl0YWxpdHkgYW5kIFBlcnNvbmFsIFNlcnZpY2VzCk92ZXJhbGwsdGhlIG1vc3QgcG9wdWxhciBmaWVsZCBvZiBzdHVkaWVzIGFyZSA6ICJTb2NpZXR5ICYgQ3VsdHVyZSIsICJNYW5hZ2VtZW50ICYgQ29tbWVyY2UiLCAiSGVhbHRoIiBhbmQgIkVkdWNhdGlvbiIKVGhlc2UgaW5kaWNhdGVzIHRoZSBwb3NzaWJpbGl0eSBvZiBzb21lIGZvcm0gb2Ygc3BlY2lhbGl6YXRpb24gb2YgaW5zdHV0dXRpb25zIGluIGNlcnRhaW4gc3RhdGVzL3JlZ2lvbi4KCgojI0RhdGEgVHJhbnNmb3JtYXRpb24gYWN0aW9uczoKQ291bnQgYW5kIFByb3BvcnRpb24gd2FzIHJlc3VsdHMgb2YgZGF0YSB0cmFuZm9ybWF0aW9uIGRvbmUgYnkgZ2VvbV9jb3VudC4KCiNSZWFzb24gb2YgVHJhbnNmb3JtYXRpb246IApUaGUgZmlndXJlIGFib3ZlIGNvbmNlcm5zIHRoZSBwcm9wb3J0aW9ucyBvZiBmaWVsZCBvZiBzdHVkeSBmb3IgZWFjaCBzdGF0ZXMKCiMjT2JqZWN0aXZlIDM6IAoKRGlmZmVyZW5jZXMgaW4gdGhlIHByZWZlcmVuY2VzIG9mIEludGVybmF0aW9uYWwgU3R1ZGVudHMgYW5kIERvbWVzdGljIFN0dWRlbnRzLiAocmVnaW9uIGFuZCBmaWVsZCBvZiBzdHVkeSkKCgpgYGB7cn0KZyArIGdlb21fYmFyKG1hcHBpbmcgPSBhZXMoeD0iIiwgZmlsbD1zdGF0ZSksIHBvc2l0aW9uID0iZmlsbCIpICsgY29vcmRfcG9sYXIoInkiLCBzdGFydD0wKSAgKyBmYWNldF9ncmlkKGZhY2V0cz0gLiB+IG92ZXJzZWFzLCBtYXJnaW5zID0gVFJVRSkgKyBsYWJzICh0aXRsZSA9ICJMb2NhdGlvbiBvZiBTdHVkaWVzIG9mIEludGVybmF0aW9uYWwgYW5kIERvbWVzdGljIFN0dWRlbnRzIiAsIHggPSBOVUxMICwgeSA9ICJQZXJjZW50YWdlIG9mIGVucm9sbWVudCBpbiBkaWZmZXJlbnQgcmVnaW9uIiAsIGZpbGwgPSAiU3RhdGVzIikKCmBgYAojSW50ZXJwcmV0YXRpb246CkZyb20gdGhlIGZpZ3VyZSBhYm92ZSwgaXQgc2VlbXMgdGhhdCBtb3N0IGRvbWVzdGljIGFuZCBpbnRlcm5hdGlvbmFsIGhhdmUgc2ltaWxhciBkaXN0cmlidXRpb25zIGFjcm9zcyBkaWZmZXJlbnQgc3RhdGVzLgpUaGVyZSBhcmUgc2xpZ2h0bHkgbW9yZSBwZXJjZW50YWdlIG9mIEludGVybmF0aW9uYWwgc3R1ZGVudHMgc3R1ZHlpbmcgaW4gVmljdG9yaWEgdGhhbiBEb21lc3RpYyBzdHVkZW50cy4KVmljZSB2ZXJzYSBmb3IgTmV3IFNvdXRoIFdhbGVzLgoKIyNEYXRhIFRyYW5zZm9ybWF0aW9uIGFjdGlvbnM6CkNvdW50IGFuZCBQcm9wb3J0aW9uIHdhcyByZXN1bHRzIG9mIGRhdGEgdHJhbmZvcm1hdGlvbiBkb25lIGJ5IGdlb21fYmFyLgoKI1JlYXNvbiBvZiBUcmFuc2Zvcm1hdGlvbjogClRoZSBmaWd1cmUgYWJvdmUgY29uY2VybnMgdGhlIHByb3BvcnRpb25zIG9mIHN0YXRlcyB3aGVyZSBzdHVkZW50cyBzdHVkaWVzIGFtb25nIGludGVybmF0aW9uYWwgJiBEb21lc3RpY2Ugc3R1ZGVudHMuCgpgYGB7cn0KZ2dwbG90KGtub3duRm9lKSArIGdlb21fYmFyKG1hcHBpbmcgPSBhZXMoeD1vdmVyc2VhcywgZmlsbD1icm9hZF9mb2UpLCBwb3NpdGlvbiA9ImZpbGwiKSArIGNvb3JkX3BvbGFyKCJ5Iiwgc3RhcnQ9MCkgKyBnZ3RpdGxlKCJGaWVsZCBvZiBTdHVkeSBmb3IgRG9tZXN0aWMgdnMgT3ZlcnNlYXMgU3R1ZGVudHMiKSArIHhsYWIoIiIpICsgeWxhYigiUGVyY2VudGFnZSBvZiBlbnJvbG1lbnQgaW4gZGlmZmVyZW50IGZpZWxkcyIpICsgbGFicyhmaWxsPSJGaWVsZCBvZiBTdHVkeSIpCmBgYAojSW50ZXJwcmV0YXRpb246CkFtb25nIEludGVybmF0aW9uYWwgU3R1ZGVudHMsIHRoZXJlIGFyZSBoaWdoZXIgcGVyY2VudGFnZSBvZiBzdHVkZW50cyBzdHVkeWluZyBpbiBmaWVsZCBvZjoKIk1hbmFnZW1lbnQgJiBDb21tZXJjZSIgLCAiSW5mb3JtYXRpb24gVGVjaG5vbG9neSIgYW5kICJFbmdpbmVlcmluZyAmIFJlbGF0ZWQgVGVjaG5vbG9neSIuCgpBcyBmb3IgRG9tZXN0aWMgU3R1ZGVudHMsIHRoZXJlIGFyZSBoaWdoZXIgcGVyY2VudGFnZSBvZiBzdHVkZW50cyBzdHVkeWluZyBpbiBmaWVsZCBvZjoKIlNvY2lldHkgJiBDdWx0dXJlIiwgIkNyZWF0aXZlIEFydHMiIGFuZCAiRWR1Y2F0aW9uIgoKVGhlc2UgZGlmZmVyZW5jZSBtaWdodCBiZSBkdWUgdG8gZGlmZmVyZW5jZXMgaW4gcHJlZmVyZW5jZSBvciBtZW50YWxpdHkgb2YgSW50ZXJuYXRpb25hbCBhbmQgRG9tZXN0aWMgU3R1ZGVudHMuCkl0IGlzIHdvcnRoIHdoaWxlIHRvIGV4YW1pbmUgdGhlIGNhdXNlcyBvZiBzdWNoIGRpZmZlcmVuY2VzLiAgCgojRGF0YSBUcmFuc2Zvcm1hdGlvbiBhY3Rpb25zOgpDb3VudCBhbmQgUHJvcG9ydGlvbiB3YXMgcmVzdWx0cyBvZiBkYXRhIHRyYW5mb3JtYXRpb24gZG9uZSBieSBnZW9tX2Jhci4KCiNSZWFzb24gb2YgVHJhbnNmb3JtYXRpb246IApUaGUgZmlndXJlIGFib3ZlIGNvbmNlcm5zIHRoZSBwcm9wb3J0aW9ucyBvZiBmaWVsZCBvZiBzdHVkeSBmb3IgSW50ZXJuYXRpb25hbCAmIERvbWVzdGljIFN0dWRlbnRzLgoKIyNPYmplY3RpdmUgNDoKCkluZGljYXRpb24gb2YgZ2VuZGVyLXNlZ3JlZ2F0aW9uIGluIEZpZWxkIG9mIFN0dWR5LgoKYGBge3J9CmEgPC0gZ2dwbG90KGtub3duRm9lKSArIGdlb21fYmFyKG1hcHBpbmcgPSBhZXMoeD0gIiIsIGZpbGw9Z2VuZGVyKSwgcG9zaXRpb24gPSJmaWxsIikgKyBjb29yZF9mbGlwKCkgKyBsYWJzKHRpdGxlID0gIlByb3BvcnRpb24gb2YgR2VuZGVyIG9mIEFsbCBTdHVkZW50cyIsIHkgPSAiUGVyY2VudGFnZSIgLCB4ID0gIiIgLCBmaWxsID0gIkdlbmRlciIpIAoKYiA8LSBnZ3Bsb3Qoa25vd25Gb2UpICsgZ2VvbV9iYXIobWFwcGluZyA9IGFlcyh4PSBicm9hZF9mb2UsIGZpbGw9Z2VuZGVyKSwgcG9zaXRpb24gPSJmaWxsIiwgc2hvdy5sZWdlbmQgPSBGQUxTRSkgKyBjb29yZF9mbGlwKCkgKyBsYWJzKHRpdGxlID0gIlByb3BvcnRpb24gb2YgR2VuZGVyIGluIGRpZmZlcmVudCBGaWVsZCBvZiBTdHVkaWVzIiwgeSA9ICJQZXJjZW50YWdlIiAsIHggPSAiRmllbGQgb2YgU3R1ZHkiKSAKCmdyaWQuYXJyYW5nZShhLGIsIGhlaWdodHM9YygxLzQsIDMvNCksIG5yb3cgPSAyKQpgYGAKCiNJbnRlcnByZXRhdGlvbjoKT3ZlcmFsbCwgdGhlcmUgYXJlIG1vcmUgZmVtYWxlcyB0aGFuIG1hbGUgaW4gb3VyIHNhbXBsZXMuCkZpZWxkIG9mIHN0dWRpZXMgb2YgIkluZm9ybWF0aW9uIFRlY2hub2xvZ3kiIGFuZCAiRW5nZW5lZXJpbmcgJiBSZWxhdGVkIFRlY2hub2xvZ3kiIGhhdmUgbXVjaCBoaWdoZXIgcGVyY2VudGFnZSBvZiBtYWxlIHRoYW4gZmVtYWxlLgpGaWVsZCBvZiBzdHVkaWVzIG9mICJFZHVjYXRpb24iIGFuZCAiSGVhbHRoIiBoYXZlIG11Y2ggaGlnaGVyIHBlcmNlbnRhZ2Ugb2YgZmVtYWxlcyB0aGFuIG1hbGVzLgpUaGlzIGNhbiBiZSBhbiBpbmRpY2F0aW9uIHRoYXQgdGhlcmUgYXJlIGNlcnRhaW4gRmllbGQgb2YgU3R1ZGllcyB0aGF0IHNvY2lldHkgdmlld2VkIGFzICJmb3IgbWFsZSIgb3IgImZvciBmZW1hbGUiLgoKI0RhdGEgVHJhbnNmb3JtYXRpb24gYWN0aW9uczoKQ291bnQgYW5kIFByb3BvcnRpb24gd2FzIHJlc3VsdHMgb2YgZGF0YSB0cmFuZm9ybWF0aW9uIGRvbmUgYnkgZ2VvbV9iYXIuCgojUmVhc29uIG9mIFRyYW5zZm9ybWF0aW9uOiAKVGhlIGZpZ3VyZSBhYm92ZSBjb25jZXJucyB0aGUgcHJvcG9ydGlvbnMgb2YgZmllbGQgb2Ygc3R1ZHkgZm9yIG1hbGUgJiBmZW1hbGUgc3R1ZGVudHMuCgojI09iamVjdGl2ZSA1OgoKWWVhciB0cmVuZHMgb2YgbnVtYmVyIG9mIHN0dWRlbnRzIGVucm9sbGVkIGluIGhpZ2hlciBpbnN0aXR1dGlvbnMuIAoKYGBge3J9CmcgKyBnZW9tX2JhcihtYXBwaW5nID0gYWVzKHg9IGFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKFllYXIpKSxmaWxsID0gb3ZlcnNlYXMpKSArIGxhYnModGl0bGUgPSAiTnVtYmVyIG9mIFN0dWRlbnRzIGZyb20gMjAwNX4yMDE3IiwgeSA9ICJUb3RhbCBudW1iZXIgb2YgU3R1ZGVudHMiICwgeCA9ICJZZWFyIiwgZmlsbCA9ICIiKSArIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoIiMwMDcyQjIiLCAiI0Q1NUUwMCIpKQoKYGBgCiNJbnRlcnByZXRhdGlvbjoKT3ZlcmFsbCwgdGhlcmUgaXMgYW4gdXB3YXJkIHRyZW5kIG9mIG51bWJlciBvZiBzdHVkZW50cyBlbnJvbGxlZCBpbiBoaWdoZXIgaW5zdGl0dXRpb25zLCB3aGljaCBpcyBhIGdvb2Qgc2lnbi4KVGhlcmUgaXMgYSBzbGlnaHQgZHJvcCBpbiBudW1iZXIgb2Ygc3R1ZGVudHMgaW4geWVhciAyMDE3LgpIb3dldmVyLCBhdCBmaXJzdCBnbGFuY2UsIHN1Y2ggc21hbGwgZmx1Y3R1YXRpb24gaW4gbnVtYmVyIG9mIHN0dWRlbnRzIHNlZW1zIG5hdHVyYWwgdGhyb3VnaG91dCB0aGUgeWVhcnMuClRoaXMgbWlnaHQgYmUgc2ltcGx5IGR1ZSB0byBOYXR1cmFsIFZhcmlhdGlvbnMuCgpXZSBjYW4gYWxzbyBzZWUgdGhhdCBudW1iZXIgb2YgZG9tZXN0aWMgc3R1ZGVudHMgYXJlIG11Y2ggaGlnaGVyIHRoYW4gaW50ZXJuYXRpb25hbCBzdHVkZW50cyB0aHJvdWdob3V0IHRoZSB5ZWFycy4KTnVtYmVyIG9mIGRvbWVzdGljIHN0dWRlbnRzIGluY3JlYXNlIGZhc3RlciBhcyB3ZWxsLgpUaGUgaW5jcmVhc2UgaW4gdG90YWwgbnVtYmVyIG9mIHN0dWRlbnRzIHNlZW1zIHRvIGNvbWUgbW9zdGx5IGZyb20gdGhlIGluY3JlYXNlIG9mIERvbWVzdGljIFN0dWRlbnRzLgpUaGlzIG9ic2VydmF0aW9uIGlzIHF1aXRlIGV4cGVjdGVkIHNpbmNlIGdvdmVybm1lbnQgbXVzdCBlbXBoYXNpemUgb24gcHJvdmlkaW5nIGhpZ2hlciBlZHVjYXRpb25zIHRvIHRoZWlyIGNpdGl6ZW5zLgoKI0RhdGEgVHJhbnNmb3JtYXRpb24gYWN0aW9uczoKQ291bnQgd2FzIHJlc3VsdHMgb2YgZGF0YSB0cmFuZm9ybWF0aW9uIGRvbmUgYnkgZ2VvbV9iYXIuCgojUmVhc29uIG9mIFRyYW5zZm9ybWF0aW9uOiAKVGhlIGZpZ3VyZSBhYm92ZSBjb25jZXJucyB0aGUgbnVtYmVyIG9mIG1hbGUgLCBmZW1hbGUgYW5kIGFsbCBzdHVkZW50cyBlbnJvbGxlZCBpbiBlYWNoIHllYXIgZnJvbSAyMDE1IHRvIDIwMTcuCgoKYGBge3J9CiMgdGFibGUoKSBhZ2dyZWdhdGVzIGFjY29yZGluZyB0aGUgSW5zdGl0dXRpb24KeWVhclN1bXMgPC0gdGFibGUobmF0RW5yb2wkWWVhcixuYXRFbnJvbCRnZW5kZXIpCiMgYXMuZGF0YS5mcmFtZSgpIGNvbnZlcnRzIHRhYmxlIG9iamVjdCBpbnRvIGEgZGF0YSBmcmFtZQp5ZWFyRGYgPC0gYXMuZGF0YS5mcmFtZSh5ZWFyU3VtcykKIyB0YWtpbmcgb25seSByb3dzIHdpdGggbm9uLXplcm8gZnJlcXVlbmN5CnllYXJEZjIgPC0gc3Vic2V0KHllYXJEZix5ZWFyRGYkRnJlcSE9MCkKIyByZW5hbWUgY29sdW1ucwpjb2xuYW1lcyh5ZWFyRGYyKTwtYygiZW5yb2wuWWVhciIsICJlbnJvbC5nZW5kZXIiLCAiY291bnQiKQoKZ2dwbG90KHllYXJEZjIsIG1hcHBpbmcgPSBhZXMoeCA9IGVucm9sLlllYXIsIHkgPSBjb3VudCwgZ3JvdXAgPSBlbnJvbC5nZW5kZXIgLCBjb2xvciA9IGVucm9sLmdlbmRlcikpICsgZ2VvbV9wb2ludCgpICsgZ2VvbV9saW5lKCkgKyBsYWJzKHRpdGxlID0gIk51bWJlciBvZiBTdHVkZW50cyBmcm9tIDIwMDV+MjAxNyAtIFNlZ3JlZ2F0ZWQgYnkgZ2VuZGVyIiwgeSA9ICJOdW1iZXIgb2YgU3R1ZGVudHMgb2YgZWFjaCBnZW5kZXIiICwgeCA9ICJZZWFyIiwgY29sb3IgPSAiR2VuZGVyIikKYGBgCgojSW50ZXJwcmV0YXRpb246ClRocm91Z2hvdXQgdGhlIHllYXJzLCB0aGUgbnVtYmVyIG9mIGZlbWFsZSBzdHVkZW50cyBhcmUgcGVyc2lzdGFubHkgaGlnaGVyIHRoYW4gbWFsZSBzdHVkZW50cy4KVGhyb3VnaG91dCB0aGUgeWVhcnMsIG51bWJlciBvZiBtYWxlIGFuZCBmZW1hbGUgc3R1ZGVudHMgc2VlbXMgdG8gYmUgbW92ZSBoYW5kIGluIGhhbmQgYW5kIHBvc2l0aXZlbHkgY29ycmVsYXRlZC4KVGhlIG9ubHkgZXhjZXB0aW9uIGlzIGluIHllYXIgMjAxNywgd2hlcmUgbnVtYmVyIG9mIGZlbWFsZSBzdHVkZW50cyBpbmNyZWFzZSBidXQgbnVtYmVyIG9mIG1hbGUgc3R1ZGVudCBkcm9wcy4KVGhpcyBhbHNvIGluZGljYXRlcyB0aGF0IHRoZSBmYWxsIGluIHRvdGFsIG9mIG51bWJlciBvZiBzdHVkZW50cyBhcmUgZHVlIHRvIGZhbGwgaW4gbnVtYmVyIG9mIG1hbGUgc3R1ZGVudHMuClRoZSBmYWxsIGluIG51bWJlciBvZiBtYWxlIHN0dWRlbnRzIGFyZSBncmVhdGVyIHRoYW4gdGhlIGluY3JlYXNlIG9mIGZlbWFsZSBzdHVkZW50cy4KSXQgbWlnaHQgYmUgd29ydGggd2hpbGUgdG8gZXhhbWluZSB0aGUgY2F1c2Ugb2YgdGhlIGZhbGwgb2YgbWFsZSBzdHVkZW50cyBpbiAyMDE3LgoKI0RhdGEgVHJhbnNmb3JtYXRpb24gYWN0aW9uczoKRm9ybSBUYWJsZSBvZiBZZWFyLCBHZW5kZXIgYW5kIHRoZSByZXNwZWN0aXZlIENvdW50cy4KQXNzaWduIG5ldyBEYXRhIEZyYW1lIG9mIDMgY29sdW1ucyB0byBhIG5ldyB2YXJpYWJsZS4KU3Vic2V0dGluZyBEYXRhc2V0cyB0byBvbWl0IGlycmV2YWxlbnQgcm93cyB0byBnZXQgaW5uZXIgam9pbnQgb2YgMyBjb2x1bW5zLgpSZW5hbWluZyBDb2x1bW5zIGZvciBlYXNpZXIgaGFuZGxpbmcgb2YgZGF0YS4KCiNSZWFzb24gb2YgVHJhbnNmb3JtYXRpb246IApUbyBnZXQgYSBuZXcgRGF0YSBGcmFtZSB3aXRoIG9ubHkgMyB2YXJpYWJsZXMgdGhhdCB3ZSBuZWVkIGZvciB0aGlzIGxpbmUgY2hhcnQuClRvIGNvdW50IG51bWJlciBvZiBzdHVkZW50cyBhcyBnZW9tX3BvaW50IGFuZCBnZW9tX2xpbmUgZG9lcyBub3QgdHJhbnNmb3JtIGRhdGEgdG8gZ2V0IGNvdW50IGF1dG9tYXRpY2FsbHkgbGlrZSBnZW9tX2Jhci4KCiMjT2JqZWN0aXZlIDY6CgpBVEFSIERpc3RyaWJ1dGlvbnMgaW4gZGlmZmVyZW50IHR5cGVzIG9mIGluc3RpdHV0aW9ucy4gCgpgYGB7cn0KI09taXQgZGF0YSB3aXRoICJVbmtub3duIiBBVEFSX0dyb3VwCmtub3duQVRBUiA8LSBuYXRFbnJvbFtuYXRFbnJvbCRBVEFSX0dyb3VwICE9ICJVbmtub3duIiwgXQojQ29udmVydCAiYXRhciIgdG8gbnVtZXJpYyB2YXJpYWJsZXMKa25vd25BVEFSJGF0YXIgPC0gYXMubnVtZXJpYyhrbm93bkFUQVIkYXRhcikKI1JlcGxhY2UgQVRBUl9Hcm91cCBkYXRhIG9mICI+PTk5IiB3aXRoICI5OT08Igprbm93bkFUQVJba25vd25BVEFSJEFUQVJfR3JvdXAgPT0gIj49OTkiLF0kQVRBUl9Hcm91cCA8LSAiOTk9PCIKCmMgPC0gZ2dwbG90KGtub3duQVRBUikgKyBnZW9tX2JveHBsb3QobWFwcGluZyA9IGFlcyh4ID0gIiIsIHkgPSBhdGFyKSxuYS5ybSA9IFRSVUUpICsgbGFicyh4PSAiIiwgeSA9ICJPdmVyYWxsICBBVEFSICBzY29yZSIpCgpkIDwtIGdncGxvdChrbm93bkFUQVIpICsgZ2VvbV9ib3hwbG90KG1hcHBpbmcgPSBhZXMoeCA9IEluc3RpdHV0aW9uLCB5ID0gYXRhciwgZmlsbCA9IEluc3RpdHV0aW9uX1R5cGUpLG5hLnJtID0gVFJVRSwgc2hvdy5sZWdlbmQgPSBGQUxTRSkgKyBjb29yZF9mbGlwKCkgKyBsYWJzKHg9ICIiLCB5ID0gIkFUQVIgIHNjb3JlIGJ5IEluc3RpdHV0aW9ucyIsIHRpdGxlID0gIkJveHBsb3Qgb2YgQVRBUiBTY29yZXMiKQoKZ3JpZC5hcnJhbmdlKGQsYywgd2lkdGhzPWMoOS8xMCwgMS8xMCksIG5jb2wgPSAyKQoKZ2dwbG90KGtub3duQVRBUikgKyBnZW9tX2JhcihtYXBwaW5nID0gYWVzKHg9IEFUQVJfR3JvdXAsIGZpbGwgPSBJbnN0aXR1dGlvbl9UeXBlKSwgcG9zaXRpb24gPSJpZGVudGl0eSIsIHNob3cubGVnZW5kID0gVFJVRSkgKyBjb29yZF9mbGlwKCkgKyBsYWJzKHRpdGxlPSJOdW1iZXIgb2Ygc3R1ZGVudHMgaW4gZGlmZmVyZW50IEFUQVIgc2NvcmUgcmFuZ2VzIiwgeSA9Ik51bWJlciBvZiBTdHVkZW50cyIsIHggPSAiQVRBUiBSYW5nZSIsZmlsbCA9ICJUeXBlIG9mIEluc3RpdHV0aW9uIikgKyBmYWNldF93cmFwKGZhY2V0cyA9ICgufkluc3RpdHV0aW9uX1R5cGUpLHNjYWxlcz0iZnJlZSIpCgpnZ3Bsb3Qoa25vd25BVEFSKSArIGdlb21fYmFyKG1hcHBpbmcgPSBhZXMoeD0gQVRBUl9Hcm91cCwgZmlsbCA9IEluc3RpdHV0aW9uX1R5cGUpLCBwb3NpdGlvbiA9ImZpbGwiLCBzaG93LmxlZ2VuZCA9IEZBTFNFKSArIGNvb3JkX2ZsaXAoKSArIGxhYnModGl0bGU9IlByb3BvcnRpb25zIG9mIEluc3RpdHV0aW9uIFR5cGVzIGFtb25nIHN0dWRlbnRzIGluIGRpZmZlcmVudCBBVEFSIHJhbmdlIiwgeSA9IlByb3BvcnRpb25zIiwgeCA9ICJBVEFSIFJhbmdlIikKCmBgYAojSW50ZXJwcmV0YXRpb246Ck92ZXJhbGwsIG1vc3QgaW5zdGl0dXRpb24gaW4gZ3JvdXAgb2YgOCBoYXZlIHN0dWRlbnRzIHdpdGggaGlnaGVyIEFUQVIgc2NvcmVzIGFuZCBoaWdoZXIgbWVkaWFuIG9mIEFUQVIgU2NvcmVzLgpEaXNwZXJzaW9uIG9mIEFUQVIgc2NvcmVzIG9mIHN0dWRlbnRzIGluIGdyb3VwIG9mIDggc2VlbXMgdG8gYmUgbmFycm93ZXIgYXMgd2VsbC4gCihyZWZlcnJpbmcgdG8gdGhlaXIgcmVzcGVjdGl2ZSBpbnRlcnF1YXRpbGUgcmFuZ2UpClRoaXMgbWlnaHQgYmUgZHVlIHRvIGluc3RpdHV0aW9uIGluIGdyb3VwIG9mIDggaGF2ZSBoaWdoZXIgQVRBUiByZXF1aXJlbWVudC4KCkl0IGlzIGFsc28gd29ydGggdG8gdGFrZSBub3RlIHRoYXQgdGhlIG92ZXJhbGwgbWVkaWFuIEFUQVIgc2NvcmUgb2YgYWxsIHN0dWRlbnRzIGlzIHNsaWdodHkgYWJvdmUgODAuCkhvd2V2ZXIsIHNpeCBvdXQgb2YgZWlnaHQgRzggdW5pdmVyc2l0aWVzJyBzdHVkZW50cyBoYXZlIG1lZGlhbiBBVEFSIHNjb3JlIGF0IG9yIGFib3ZlIDkwLgpFdmVuIHRoZSByZW1haW5pbmcgdHdvIEc4IHVuaXZlcnNpdGllcydzIHN0dWRlbnRzIGhhdmUgQVRBUiBzY29yZSBtZWRpYW4gZ3JlYXRlciB0aGFuIDg1LgpJbnRlcmVzdGluZ2x5LCBib3RoIGluc3RpdHV0aW9ucyB0aGF0IGFyZSBjb25zaWRlcmVkIGEgY29sbGVnZSBoYXZlIHN0dWRlbnRzIHdpdGggbWVkaWFuIEFUQVIgc2NvcmUgYXJvdW5kIDgzLCB3aGljaCBhcmUgaGlnaGVyIHRoYW4gbWFueSBub24tRzggdW5pdmVyaXNpdGllcy4KCldlIGNhbiBzZWUgdGhhdCB0aGUgbW9kZSBBVEFSIGdyb3VwIG9mIEc4IGlzIGF0IDkwLTk1IHdoaWxlIG5vbi1HOCdzIG1vZGUgaXMgYXQgODAtODUuCkFUQVIgc2NvcmUgb2YgYm90aCBHOCBhbmQgbm9uLUc4IHNlZW1zIHRvIGJlIGxvb3NlbHkgbm9ybWFsLgpUaGUgbW9kZSBvZiBBVEFSIHNjb3JlIG9mIHN0dWRlbnRzIGluIGNvbGxlZ2UgaXMgYXQgcmFuZ2UgODUtOTAuCgpOb24tRzggdW5pdmVyc2l0aWVzIGhhdmUgbXVjaCBtb3JlIHN0dWRlbnRzIGluIHRvdGFsLiAKUGVyaGFwcywgc2ltcGx5IGR1ZSB0byB0aGUgbXVjaCBoaWdoZXIgbnVtYmVyIG9mIGluc3RpdHV0aW9ucyBpbiBub24tRzggY2F0ZWdvcnkuCgpMYXN0IGJ1dCBub3QgbGVhc3QsIGl0IHNlZW1zIHRoYXQgRzggdW5pdmVyc2l0aWVzIGhhdmUgcG9zaXRpdmUgY29ycmVsYXRpb25zIHdpdGggZ29vZCBBVEFSIHNjb3Jlcy4gClN0dWRlbnRzIGluIGdyb3VwIHdpdGggaGlnaGVyIEFUQVIgc2NvcmUgaGF2ZSBoaWdoZXIgcGVyY2VudGFnZSBvZiB0aGVtIGVucm9sbGVkIGluIEc4LgpUaGlzIG1pZ2h0IGluZGljYXRlIGEgc3Ryb25nIHByZWZlcmVuY2UgZm9yIEc4IHVuaXZlcnNpdGllcyBhbW9uZyBzdHVkZW50cyB3aXRoIGdvb2QgcmVzdWx0cy4KCgojRGF0YSBUcmFuc2Zvcm1hdGlvbiBhY3Rpb25zOgpPbWl0IGRhdGEgd2l0aCAiVW5rbm93biIgQVRBUl9Hcm91cApDb252ZXJ0ICJhdGFyIiB0byBudW1lcmljIHZhcmlhYmxlcwpSZXBsYWNlIEFUQVJfR3JvdXAgZGF0YSBvZiAiPj05OSIgd2l0aCAiOTk9PCIKCiNSZWFzb24gb2YgVHJhbnNmb3JtYXRpb246IApEYXRhIHdpdGggIlVua25vd24iIEFUQVJfR3JvdXAgYWxzbyBoYXZlIGFkbm9ybWFsL3Vuc2Vuc2libGUgQVRBUiB2YWx1ZXMuCkhlbmNlLCBpdCBpcyB2ZXJ5IGhhcmQgdG8gbWFrZSB1c2Ugb2YgdGhlc2UgQVRBUiByZWxhdGVkIGRhdGEuCgpDb252ZXJ0aW5nICJhdGFyIiBmcm9tIGZhY3RvciB0byBudW1lcmljIGFsbG93IHVzIHRvIGNvbXB1dGUgdmFyaW91cyBzdGF0aXN0aWNzIHN1Y2ggYXMgbWVkaWFuICwgaW50ZXItcXVhdGlsZSByYW5nZSBhbmQgZXRjLgoKUmVwbGFjaW5nIEFUQVJfR3JvdXAgZGF0YSBvZiAiPj05OSIgd2l0aCAiOTk9PCIgYWxsb3cgYmFycGxvdCBvZiBBVEFSX0dyb3VwIHRvIGJlIGFycmFuZ2VkIGZyb20gZ3JvdXAgd2l0aCBoaWdoZXN0IEFUQVIgc2NvcmUgdG8gdGhlIGxvd2VzdC4KCg==