Welcome to your first R Notebook! We will use notebooks throughout
the class because they make it easy to organize your code. When you
submit problem sets, R Notebooks are ideal because you can publish this
entire file as PDF or html file, complete with your code in R code
chunks (in gray) and the output of your code below it. This way, I can
see your answers and the code you used to calculate them - if your
answer is incorrect, I can still award partial credit based on your
code.
You’ll notice that right now this document is functioning like any
word processing software - we are currently not using R. We will begin
to use R once we start typing in one of the gray code blocks below. You
can insert a new code block by going to insert > R in the top
right-hand side.
#Now, we are working in R
#Note that if you want to annotate your code or leave comments, you need to use the '#' symbol
#Otherwise, R thinks that you are typing a command and your code will return an error
######You can use as many '#'s as you like#########
#To begin typing R code, simply press enter
#To improve readability, I like to keep one line of space between comments and code
#Get into the habit of annotating code now!
#Annotating your code will help you to remember the steps in your analysis, and it will help others (like me) better understand what you are doing
#let's try typing our first command into R
10 + 30
#Once you have typed the command (or commands) you would like to run, press the play icon at the top of the code block to run the code
#if you have multiple lines of code in a chunk and only want to run one, you can highlight that line and press ctrl+enter to run a single line
10*5
#note that "*" symbolizes multiplication in R
#The output of your code appears below the code block
#spacing doesn't really matter too much for most R commands, as long as everything is on the same line
10 * 5
#Importantly, R has no spell check - you need to make sure you type everything out correctly
#R cannot correct your code if you make a mistake, it will just report an error
#R will usually give you an explanation for the error, but it is not always easy to understand
#If you get an error and you're not sure what it means, google it! Someone else has probably had the same error before and asked about it online
10 + 5
#What happens if I accidentally run a line of code before I'm finished?
#In an R notebook, it'll tell you when your expression is incomplete (if R can tell - sometimes, you'll forget something but your line of code will still be a complete command, which is a trickier situation to be in - always double check your code!)
10 +
#Sometimes, you might want to use a function on a group of numbers
#(I'll explain more about functions later)
#Here, sum is telling R to add the numbers in ()
1+2+3
sum(1,2,3)
#what happens if I leave this function blank?
sum()
#what if I forget the ()?
sum
#What's going on? R is telling me what is going on underneath the function, which, for right now, I don't need to really know. If I want to read more about what the function is doing, I can use a "?" in front of the function to pull up its help page. This is much more helpful!
?sum
#Let's learn some basic arithmetic operators! You've already seen '+' and '*' to add and multiply, respectively
#We can easily subtract numbers
10 - 5
#And divide them
10/5
#Raise a number to a power of x
10 ^ 3
#recall that 10^3 is also equivalent to:
10 * 10 * 10
#Unlike a cheap calculator, R also uses the order of operations (think PEMDAS from HS algebra class) to calculate more complex operations
3 + 4 * 10
#Here, R multiplied 4*10 first, and then added 3
#If we wanted it to run the calculation from left to right, we need to add () like so:
(3 + 4) * 10
#Remember, the order of operations is 1) Parentheses, 2) Exponents, 3) Multiplication and Division, and 4) Addition and Subtraction. When you calculate complex formulas in R, you need to be very careful where you put your () . I will show more examples of this later.
#What happens when you try to use two operations that have the same level of priority in PEMDAS? R will calculate from left to right in this case, for example:
4 / 2 * 3
#Note that, in this case, reversing the order yields the same answer.
What else can R do that a calculator cannot?
#One of the most useful things about R is the ability to store objects and perform operations on them
#In the text, these are referred to as variables in Chapter 3.4 - I am calling them objects because that is a more general term - an object can consist of one variable, but it can also contain multiple variables, so I find the term "variable" somewhat confusing here
#The simplest object that you can create is a single value. We'll learn about other objects later
#let's say I want to remember the number of birds outside of my window today - maybe there are 5 birds
#I can store that value in a meaningful way so I can use it later, like so:
birds <- 5
#Note that the '<-' symbol indicates that something (e.g. a number) is being stored under the name that we've chosen. Here, we've created a new object (variable) called birds.
#Run this block of code! Does anything happen?
On the right-hand side of R Studio you will see the “Environment”
tab. This tells us all of the objects that we have stored in our current
R Session (our environment). You’ll notice that birds appears there
under “values”.
#Let's use R to print out birds
birds
print(birds)
#Maybe I want to track how many birds there are on different days of the week
#Let's say there were 5 birds on Monday and 7 birds on Tuesday
#We can store both of those values as variables (there are more efficient ways to do this, but we'll get to that later)
birds_mon <- 5
birds_tues <- 7
#Now, we can perform operations using these variables!
#How many birds were there on both days?
birds_mon + birds_tues
#What is the average number of birds for the two days?
(birds_mon + birds_tues)/2
#Wait, I miscounted the number of birds on Tuesday! Can I update the variable?
#Let's say there were actually 10 birds. We can update it like so:
birds_tues <- birds_tues + 3
#You can also redefine the object to overwrite the incorrect variable:
birds_tues <- 10
Clearly, objects are very helpful. They are, however, only helpful to
you if they are meaningful - creating objects with confusing or overly
complicated names might make your life more difficult! Here are some
tips and conventions for naming objects in R:
- Object names are case sensitive - Birds and birds can be two
separate objects
- In general, don’t make your object names so similar that you can’t
tell them apart!
- You cannot use spaces in object names (i.e. “birds_mon” works, but
“birds mon” does not)
- You can use some special characters in names - you will commonly see
“_” and “.” in place of a space, as I have used in the example. Most
special characters will not work, particularly if they mean something
else in the R language (e.g. you cannot put a “*” in a name for obvious
reasons; you also wouldn’t put quotes around a name in practice)
- You can use a combination of characters and numbers, but you cannot
just use numbers as object names (e.g. “birds1” works, but you can’t
just name an object “1”)
- Try to be as specific as possible - “birds” is a lot more helpful
than just “value” or “example”
- You will often find yourself typing out object names more than once
- shorter names are much more convenient (but again, don’t make them so
short that you don’t know what they mean - it might be tempting to name
an object “a” or “b”, but if you have many objects in your environment,
you may forget what they are later)
Returning to Functions
#I told you we'd come back to this! Functions are a really important component of R
#When we use a function, this is often referred to as "calling a function"
#The content inside of the () are called the arguments of the function
#recall the function:
sum(1,2,3)
#we can use our objects as arguments inside of the function call like so:
sum(birds_mon, birds_tues)
#so far, using functions hasn't really been any easier than typing out the operations manually
#Often, functions will perform operations that we can't easily type out in R
#For example, what if we want to get the absolute value of a number? Typing out |x| doesn't work in R
#Recall that the absolute value of any number is the positive (non-negative) version of it
#We can use a function as follows:
abs(-56)
#That was easy! We can also use multiple functions to perform some complex operations:
sum(26, abs(-56))
#Here, I've used the function that calculates the square root of a value
sum(2,4,6) - sqrt(64)
#Don't worry, you won't have to guess the names of functions! I'll tell you which functions to use in my tutorials. If you're ever really stumped, you can always google the name of a function too!
#Sometimes, functions will have multiple arguments. You can check all of the arguments that a function takes by visiting its help page. Let's use the round() function
?round
#based on this, we can see that the round function looks like this:
#round(x, digits = 0)
#There are two arguments here: the first is the value to be rounded (x) and the second tells the function how many digits to include after the decimal point. The default value of digits is shown, and it looks like it is set at 0. Let's test this:
round(5.66678)
#what if we change the digits argument? Let's round our value to two digits after the decimal place. We can do this in two ways:
round(5.66678, digits = 2)
#Or, we can simplify the argument:
round(5.66678, 2)
#You often won't have to use the name of the argument in the call to the function, but it can be helpful to use it so that you know what is happening inside the function. If you do not use the name of the argument, order matters! For example, I can change the order of the arguments if I use the names:
round(digits = 2, x = 5.66678)
#But I must use the arguments in the order specified by the help file if I do not use the argument names. So, this doesn't give me the same result that I was looking for:
round(2, 5.66678)
#In general, I would use the arguments in the specified order to avoid any confusion!
What if you don’t know what function to use? For the most part, I
will give you the functions that you will need in my tutorials each
week. You shouldn’t need to look up anything else. When you start doing
your own programming projects, however, you may find that you need
additional functions. Often, the best way to find other functions is to
simply search google; most of the time, someone else has already created
a package that contains the function you will need. If you think you
know the name of a function, but aren’t sure, you can start typing a
function in R and press Tab: this will bring up a list of functions to
choose from.
Next, we will move on to another useful object type. So far, I have
shown you how to store a single value. Often, you will need to perform
calculations on multiple values. How can we store multiple values at
once? The simplest way to do this is using an object called a
Vector.
#Let's say I have bird data for an entire week. How can I store that data as a vector? I can use the Combine function, or c(), with a comma after each value I want to store in my vector. Here's what it looks like:
birds_week <- c(5, 7, 8, 4, 5, 3, 9)
birds_week
#What if I want to inspect one element of the vector? An index would come in handy here! An index tells R which element number to print out; the first element is element 1 and the last is element 5. We can see the number of birds on Wednesday (element 3) like so:
birds_week[3]
#That was easy! What if I want to see the birds on Tuesday through Thursday? I can use a ":" like so to print those elements:
birds_week[2:4]
#Note that, in R, indexing in this way is inclusive: we've selected all elements between 2 and 4, including elements 2 and 4. Not all programming languages function this way.
#What if we wanted to change one of the elements of the vector?
#That's easy too! We can tell R to change just one element like so:
birds_week[2] <- 10
#We have just assigned the number 10 to element 2.
#What if my vector is very long? I can check the number of elements like so:
length(birds_week)
#This tells me that there are 5 elements in the vector (I can also see that by looking at the Global Environment pane)
#Can we perform computations on the elements of a vector? We sure can! Let's say bird food costs $0.50/bird, and I want to know how much it would cost for me to feed each bird. I can multiply each element by 0.5 like so:
birds_cost <- birds_week*0.50
birds_cost
#Note that, if you perform a calculation on the vector (as above) it will alter each element in the vector. If we wanted to just perform the computation on one element, we could have done the following:
cost_tues <- birds_week[2]*0.50
cost_tues
#What if the cost of feeding the birds changes during the week? Here's a new vector of bird food prices:
price <- c(0.50, 0.40, 1.00, 0.65, 0.30, 0.5, 0.7)
#We can multiply a vector by a vector! Can you tell what R did here?
birds_cost1 <- birds_week*price
birds_cost1
#Finally, we can also use functions on our vector. I'll get into this in more depth later, but here is an example:
mean(birds_week)
#This tells us the average number of birds per day
#Note that, if you don't store the value as an object, R will just print it out (as below).
#So far, we have been working with numeric data! But there are a number of different data types that R will allow you to work with. You can find out what type of data you are working with by typing the following:
str(birds_week)
#str gives us a lot of information! If you only want to know the object type, you can use:
class(birds_week)
#This tells us that our vector is numeric! What if we wanted to work with another data type? For example, what if I want to know the type of the birds in the lot? I can store the names as a Character String. If I have five birds, it might look like this:
bird_type <- c("robin", "cardinal", "blue jay", "crow", "warbler")
bird_type
#The quotations tell us that each make is a character string; trying to create a character vector without the quotes will throw an error:
bird_type1 <- c(robin, cardinal)
#Why? Because without quotes, R is looking for an object that matches the names robin and cardinal. There are no such objects. This is very important to remember when working with characters. You can also use single quotes interchangeably:
bird_type1 <- c('cardinal', 'robin')
#I can select elements of a character vector in the same way I did for numeric vectors:
bird_type[3]
#If I check the structure of the vector, R will tell me that it is a character this time:
str(bird_type)
#What kinds of functions can we use on character vectors? Most of the functions we will be using are only for numeric data. There are a few functions that work for character data. For example, what if we wanted to know how many letters were in each element of the vector? We can use the function nchar() to find out:
nchar(bird_type)
Next, we’ll take a look at a third type of data: logical data. Before
we store any logical data, I will first introduce what I mean by this
data type. Logical data consists of True and False. We will rarely ever
work with this data on its own: usually we use this data to index a
vector based on a condition (I’ll explain this further in a minute). We
can see how logical data is collected by using logical operations.
#For example, let's test a statement that we know is true.
2+2 == 4
#Note that you must use the "==" when you are using a logical operation
#What happens if we input a logical operation that isn't true?
2+2 == 5
#We can do more than test equality. Here are some additional examples:
#Greater than:
2+2 > 4
#Less than:
2+2 < 5
#Less than or equal to:
2 + 2 <= 5
#Greater than or equal to:
2 + 2 >= 5
#We can also ask R if a value is simply not equal to another value, using a "!":
2 + 2 != 5
#There are two more important operations you should know using symbols
#Let's say we want to know if two conditions are true - if they both need to be true, we can use &:
4 > 5 & 4 < 6
#If we just want at least one condition to be true, we can use or, which is symbolized using a "|" symbol:
4 > 5 | 4 < 6
#As you can see, the first statement (using &) was false, but if we substitute an | instead, it becomes true. This is because only one of the logical conditions (4<6) was true.
#We can also store TRUE and FALSE as logical data, as a value or vector like so:
answer <- 2+2 == 4
#What happens if I display the object, answer?
answer
#I can also store logical data by inputting directly, like this:
#Note that I can use an uppercase T or F as shorthand for TRUE and FALSE
log1 <- T
log2 <- c(T, F, T)
log2
#I can also perform logical operations on a vector, like the birds_week vector we created earlier
#Let's find out which days there were more than 6 birds in my yard:
birds_week > 6
#If we wanted to, we could also store that as a vector
#Finally, you can use logical operations on text, for example:
"cat" == "cat"
"cat" == "dog"
#So, what do we actually do with logical data?
#In this next section, I will show you why logical data is so useful
#We typically use logical data to index vectors
#But before we do that, a few additional notes on indexing vectors:
#So far, we've indexed vector as follows:
birds_week[2]
#And we know that we can select multiple elements of a vector like this:
#Note that we need to use the c() when we specify individual elements in this way:
birds_week[c(2,3,4)]
#Order matters! Notice that this does not return the same result:
birds_week[c(3,2,4)]
#Remember that we can also tell R that we want to select elements 2 through 4, using "2:4"
#If we do it this way, we do not need the c()
birds_week[2:4]
#We will primarily use logical data to index vectors
#Say we want to select only the days of the week where there were more than 6 birds in my yard
#We can do that easily like this:
birds_week[birds_week > 6]
#Why did that work? Recall that "birds_week > 6" produced a vector of logical data, where days > 6 returned TRUE and days < 6 returned FALSE
#When we index a numeric vector by a logical vector in this way, it tells R to only return the numeric vector elements that correspond to TRUE in the logical vector - in this case, the entries for Tuesday, Wednesday, and Sunday are TRUE because they are >6
#We can also index character vectors
#Let's say I have the days of the week in a vector:
week <- c("Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday")
#If I want to know what weekdays there were more than 6 birds in the parking lot, I can also index the character vector like this:
week[birds_week > 6]
#Here, R matches the elements of each vector by their element number (e.g. Monday and 5 are element 1, Tuesday and 10 are element 2, etc.) and selects the elements in week that correspond with the element numbers in birds_week that are greater than 6
#Note that order matters here! If my days of the week were out of order, then I would not get the correct answers:
week1 <- c("Tuesday", "Monday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday")
week1[birds_week > 6]
#If I want to know what days of the week there were either greater than 8 birds or less than 5 birds, I can found out like so:
week[birds_week > 8 | birds_week < 5]
Resources Navarro, D. (2019). Learning Statistics with R. Retrieved
from: https://learningstatisticswithr.com/book/index.html.
LS0tDQp0aXRsZTogIkhhcnAgMzI1IFRvcGljIDE6IEludHJvIHRvIFIiDQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sNCi0tLQ0KV2VsY29tZSB0byB5b3VyIGZpcnN0IFIgTm90ZWJvb2shIFdlIHdpbGwgdXNlIG5vdGVib29rcyB0aHJvdWdob3V0IHRoZSBjbGFzcyBiZWNhdXNlIHRoZXkgbWFrZSBpdCBlYXN5IHRvIG9yZ2FuaXplIHlvdXIgY29kZS4gV2hlbiB5b3Ugc3VibWl0IHByb2JsZW0gc2V0cywgUiBOb3RlYm9va3MgYXJlIGlkZWFsIGJlY2F1c2UgeW91IGNhbiBwdWJsaXNoIHRoaXMgZW50aXJlIGZpbGUgYXMgIFBERiBvciBodG1sIGZpbGUsIGNvbXBsZXRlIHdpdGggeW91ciBjb2RlIGluIFIgY29kZSBjaHVua3MgKGluIGdyYXkpIGFuZCB0aGUgb3V0cHV0IG9mIHlvdXIgY29kZSBiZWxvdyBpdC4gVGhpcyB3YXksIEkgY2FuIHNlZSB5b3VyIGFuc3dlcnMgYW5kIHRoZSBjb2RlIHlvdSB1c2VkIHRvIGNhbGN1bGF0ZSB0aGVtIC0gaWYgeW91ciBhbnN3ZXIgaXMgaW5jb3JyZWN0LCBJIGNhbiBzdGlsbCBhd2FyZCBwYXJ0aWFsIGNyZWRpdCBiYXNlZCBvbiB5b3VyIGNvZGUuIA0KDQpZb3UnbGwgbm90aWNlIHRoYXQgcmlnaHQgbm93IHRoaXMgZG9jdW1lbnQgaXMgZnVuY3Rpb25pbmcgbGlrZSBhbnkgd29yZCBwcm9jZXNzaW5nICBzb2Z0d2FyZSAtIHdlIGFyZSBjdXJyZW50bHkgbm90IHVzaW5nIFIuIFdlIHdpbGwgYmVnaW4gdG8gdXNlIFIgb25jZSB3ZSBzdGFydCB0eXBpbmcgaW4gb25lIG9mIHRoZSBncmF5IGNvZGUgYmxvY2tzIGJlbG93LiBZb3UgY2FuIGluc2VydCBhIG5ldyBjb2RlIGJsb2NrIGJ5IGdvaW5nIHRvIGluc2VydCA+IFIgaW4gdGhlIHRvcCByaWdodC1oYW5kIHNpZGUuIA0KDQoNCmBgYHtyfQ0KI05vdywgd2UgYXJlIHdvcmtpbmcgaW4gUg0KI05vdGUgdGhhdCBpZiB5b3Ugd2FudCB0byBhbm5vdGF0ZSB5b3VyIGNvZGUgb3IgbGVhdmUgY29tbWVudHMsIHlvdSBuZWVkIHRvIHVzZSB0aGUgJyMnIHN5bWJvbA0KI090aGVyd2lzZSwgUiB0aGlua3MgdGhhdCB5b3UgYXJlIHR5cGluZyBhIGNvbW1hbmQgYW5kIHlvdXIgY29kZSB3aWxsIHJldHVybiBhbiBlcnJvcg0KIyMjIyMjWW91IGNhbiB1c2UgYXMgbWFueSAnIydzIGFzIHlvdSBsaWtlIyMjIyMjIyMjDQojVG8gYmVnaW4gdHlwaW5nIFIgY29kZSwgc2ltcGx5IHByZXNzIGVudGVyDQojVG8gaW1wcm92ZSByZWFkYWJpbGl0eSwgSSBsaWtlIHRvIGtlZXAgb25lIGxpbmUgb2Ygc3BhY2UgYmV0d2VlbiBjb21tZW50cyBhbmQgY29kZQ0KI0dldCBpbnRvIHRoZSBoYWJpdCBvZiBhbm5vdGF0aW5nIGNvZGUgbm93IQ0KI0Fubm90YXRpbmcgeW91ciBjb2RlIHdpbGwgaGVscCB5b3UgdG8gcmVtZW1iZXIgdGhlIHN0ZXBzIGluIHlvdXIgYW5hbHlzaXMsIGFuZCBpdCB3aWxsIGhlbHAgb3RoZXJzIChsaWtlIG1lKSBiZXR0ZXIgdW5kZXJzdGFuZCB3aGF0IHlvdSBhcmUgZG9pbmcNCg0KI2xldCdzIHRyeSB0eXBpbmcgb3VyIGZpcnN0IGNvbW1hbmQgaW50byBSDQoNCjEwICsgMzANCg0KI09uY2UgeW91IGhhdmUgdHlwZWQgdGhlIGNvbW1hbmQgKG9yIGNvbW1hbmRzKSB5b3Ugd291bGQgbGlrZSB0byBydW4sIHByZXNzIHRoZSBwbGF5IGljb24gYXQgdGhlIHRvcCBvZiB0aGUgY29kZSBibG9jayB0byBydW4gdGhlIGNvZGUNCiNpZiB5b3UgaGF2ZSBtdWx0aXBsZSBsaW5lcyBvZiBjb2RlIGluIGEgY2h1bmsgYW5kIG9ubHkgd2FudCB0byBydW4gb25lLCB5b3UgY2FuIGhpZ2hsaWdodCB0aGF0IGxpbmUgYW5kIHByZXNzIGN0cmwrZW50ZXIgdG8gcnVuIGEgc2luZ2xlIGxpbmUNCg0KMTAqNQ0KDQojbm90ZSB0aGF0ICIqIiBzeW1ib2xpemVzIG11bHRpcGxpY2F0aW9uIGluIFINCiNUaGUgb3V0cHV0IG9mIHlvdXIgY29kZSBhcHBlYXJzIGJlbG93IHRoZSBjb2RlIGJsb2NrIA0KDQoNCmBgYA0KDQoNCg0KDQoNCmBgYHtyfQ0KI3NwYWNpbmcgZG9lc24ndCByZWFsbHkgbWF0dGVyIHRvbyBtdWNoIGZvciBtb3N0IFIgY29tbWFuZHMsIGFzIGxvbmcgYXMgZXZlcnl0aGluZyBpcyBvbiB0aGUgc2FtZSBsaW5lDQoxMCAgICogICAgNQ0KYGBgDQoNCg0KDQoNCmBgYHtyfQ0KI0ltcG9ydGFudGx5LCBSIGhhcyBubyBzcGVsbCBjaGVjayAtIHlvdSBuZWVkIHRvIG1ha2Ugc3VyZSB5b3UgdHlwZSBldmVyeXRoaW5nIG91dCBjb3JyZWN0bHkNCiNSIGNhbm5vdCBjb3JyZWN0IHlvdXIgY29kZSBpZiB5b3UgbWFrZSBhIG1pc3Rha2UsIGl0IHdpbGwganVzdCByZXBvcnQgYW4gZXJyb3INCiNSIHdpbGwgdXN1YWxseSBnaXZlIHlvdSBhbiBleHBsYW5hdGlvbiBmb3IgdGhlIGVycm9yLCBidXQgaXQgaXMgbm90IGFsd2F5cyBlYXN5IHRvIHVuZGVyc3RhbmQNCiNJZiB5b3UgZ2V0IGFuIGVycm9yIGFuZCB5b3UncmUgbm90IHN1cmUgd2hhdCBpdCBtZWFucywgZ29vZ2xlIGl0ISBTb21lb25lIGVsc2UgaGFzIHByb2JhYmx5IGhhZCB0aGUgc2FtZSBlcnJvciBiZWZvcmUgYW5kIGFza2VkIGFib3V0IGl0IG9ubGluZQ0KMTAgKyA1DQpgYGANCg0KDQoNCmBgYHtyfQ0KI1doYXQgaGFwcGVucyBpZiBJIGFjY2lkZW50YWxseSBydW4gYSBsaW5lIG9mIGNvZGUgYmVmb3JlIEknbSBmaW5pc2hlZD8NCiNJbiBhbiBSIG5vdGVib29rLCBpdCdsbCB0ZWxsIHlvdSB3aGVuIHlvdXIgZXhwcmVzc2lvbiBpcyBpbmNvbXBsZXRlIChpZiBSIGNhbiB0ZWxsIC0gc29tZXRpbWVzLCB5b3UnbGwgZm9yZ2V0IHNvbWV0aGluZyBidXQgeW91ciBsaW5lIG9mIGNvZGUgd2lsbCBzdGlsbCBiZSBhIGNvbXBsZXRlIGNvbW1hbmQsIHdoaWNoIGlzIGEgdHJpY2tpZXIgc2l0dWF0aW9uIHRvIGJlIGluIC0gYWx3YXlzIGRvdWJsZSBjaGVjayB5b3VyIGNvZGUhKQ0KMTAgKyAgDQpgYGANCg0KYGBge3J9DQojU29tZXRpbWVzLCB5b3UgbWlnaHQgd2FudCB0byB1c2UgYSBmdW5jdGlvbiBvbiBhIGdyb3VwIG9mIG51bWJlcnMNCiMoSSdsbCBleHBsYWluIG1vcmUgYWJvdXQgZnVuY3Rpb25zIGxhdGVyKQ0KI0hlcmUsIHN1bSBpcyB0ZWxsaW5nIFIgdG8gYWRkIHRoZSBudW1iZXJzIGluICgpDQoxKzIrMw0Kc3VtKDEsMiwzKQ0KDQojd2hhdCBoYXBwZW5zIGlmIEkgbGVhdmUgdGhpcyBmdW5jdGlvbiBibGFuaz8NCnN1bSgpDQoNCiN3aGF0IGlmIEkgZm9yZ2V0IHRoZSAoKT8NCnN1bQ0KI1doYXQncyBnb2luZyBvbj8gUiBpcyB0ZWxsaW5nIG1lIHdoYXQgaXMgZ29pbmcgb24gdW5kZXJuZWF0aCB0aGUgZnVuY3Rpb24sIHdoaWNoLCBmb3IgcmlnaHQgbm93LCBJIGRvbid0IG5lZWQgdG8gcmVhbGx5IGtub3cuIElmIEkgd2FudCB0byByZWFkIG1vcmUgYWJvdXQgd2hhdCB0aGUgZnVuY3Rpb24gaXMgZG9pbmcsIEkgY2FuIHVzZSBhICI/IiBpbiBmcm9udCBvZiB0aGUgZnVuY3Rpb24gdG8gcHVsbCB1cCBpdHMgaGVscCBwYWdlLiBUaGlzIGlzIG11Y2ggbW9yZSBoZWxwZnVsIQ0KP3N1bQ0KYGBgDQoNCmBgYHtyfQ0KI0xldCdzIGxlYXJuIHNvbWUgYmFzaWMgYXJpdGhtZXRpYyBvcGVyYXRvcnMhIFlvdSd2ZSBhbHJlYWR5IHNlZW4gJysnIGFuZCAnKicgdG8gYWRkIGFuZCBtdWx0aXBseSwgcmVzcGVjdGl2ZWx5DQoNCiNXZSBjYW4gZWFzaWx5IHN1YnRyYWN0IG51bWJlcnMNCjEwIC0gNQ0KDQojQW5kIGRpdmlkZSB0aGVtDQoxMC81DQoNCiNSYWlzZSBhIG51bWJlciB0byBhIHBvd2VyIG9mIHgNCjEwIF4gMw0KDQojcmVjYWxsIHRoYXQgMTBeMyBpcyBhbHNvIGVxdWl2YWxlbnQgdG86DQoxMCAqIDEwICogMTANCmBgYA0KYGBge3J9DQojVW5saWtlIGEgY2hlYXAgY2FsY3VsYXRvciwgUiBhbHNvIHVzZXMgdGhlIG9yZGVyIG9mIG9wZXJhdGlvbnMgKHRoaW5rIFBFTURBUyBmcm9tIEhTIGFsZ2VicmEgY2xhc3MpIHRvIGNhbGN1bGF0ZSBtb3JlIGNvbXBsZXggb3BlcmF0aW9ucw0KDQozICsgNCAqIDEwDQoNCiNIZXJlLCBSIG11bHRpcGxpZWQgNCoxMCBmaXJzdCwgYW5kIHRoZW4gYWRkZWQgMw0KI0lmIHdlIHdhbnRlZCBpdCB0byBydW4gdGhlIGNhbGN1bGF0aW9uIGZyb20gbGVmdCB0byByaWdodCwgd2UgbmVlZCB0byBhZGQgKCkgbGlrZSBzbzoNCg0KKDMgKyA0KSAqIDEwDQoNCiNSZW1lbWJlciwgdGhlIG9yZGVyIG9mIG9wZXJhdGlvbnMgaXMgMSkgUGFyZW50aGVzZXMsIDIpIEV4cG9uZW50cywgMykgTXVsdGlwbGljYXRpb24gYW5kIERpdmlzaW9uLCBhbmQgNCkgQWRkaXRpb24gYW5kIFN1YnRyYWN0aW9uLiBXaGVuIHlvdSBjYWxjdWxhdGUgY29tcGxleCBmb3JtdWxhcyBpbiBSLCB5b3UgbmVlZCB0byBiZSB2ZXJ5IGNhcmVmdWwgd2hlcmUgeW91IHB1dCB5b3VyICgpIC4gSSB3aWxsIHNob3cgbW9yZSBleGFtcGxlcyBvZiB0aGlzIGxhdGVyLiANCg0KI1doYXQgaGFwcGVucyB3aGVuIHlvdSB0cnkgdG8gdXNlIHR3byBvcGVyYXRpb25zIHRoYXQgaGF2ZSB0aGUgc2FtZSBsZXZlbCBvZiBwcmlvcml0eSBpbiBQRU1EQVM/IFIgd2lsbCBjYWxjdWxhdGUgZnJvbSBsZWZ0IHRvIHJpZ2h0IGluIHRoaXMgY2FzZSwgZm9yIGV4YW1wbGU6DQoNCjQgLyAyICogMw0KDQojTm90ZSB0aGF0LCBpbiB0aGlzIGNhc2UsIHJldmVyc2luZyB0aGUgb3JkZXIgeWllbGRzIHRoZSBzYW1lIGFuc3dlci4NCg0KYGBgDQpXaGF0IGVsc2UgY2FuIFIgZG8gdGhhdCBhIGNhbGN1bGF0b3IgY2Fubm90Pw0KDQpgYGB7cn0NCiNPbmUgb2YgdGhlIG1vc3QgdXNlZnVsIHRoaW5ncyBhYm91dCBSIGlzIHRoZSBhYmlsaXR5IHRvIHN0b3JlIG9iamVjdHMgYW5kIHBlcmZvcm0gb3BlcmF0aW9ucyBvbiB0aGVtDQojSW4gdGhlIHRleHQsIHRoZXNlIGFyZSByZWZlcnJlZCB0byBhcyB2YXJpYWJsZXMgaW4gQ2hhcHRlciAzLjQgLSBJIGFtIGNhbGxpbmcgdGhlbSBvYmplY3RzIGJlY2F1c2UgdGhhdCBpcyBhIG1vcmUgZ2VuZXJhbCB0ZXJtIC0gYW4gb2JqZWN0IGNhbiBjb25zaXN0IG9mIG9uZSB2YXJpYWJsZSwgYnV0IGl0IGNhbiBhbHNvIGNvbnRhaW4gbXVsdGlwbGUgdmFyaWFibGVzLCBzbyBJIGZpbmQgdGhlIHRlcm0gInZhcmlhYmxlIiBzb21ld2hhdCBjb25mdXNpbmcgaGVyZQ0KI1RoZSBzaW1wbGVzdCBvYmplY3QgdGhhdCB5b3UgY2FuIGNyZWF0ZSBpcyBhIHNpbmdsZSB2YWx1ZS4gV2UnbGwgbGVhcm4gYWJvdXQgb3RoZXIgb2JqZWN0cyBsYXRlcg0KI2xldCdzIHNheSBJIHdhbnQgdG8gcmVtZW1iZXIgdGhlIG51bWJlciBvZiBiaXJkcyBvdXRzaWRlIG9mIG15IHdpbmRvdyB0b2RheSAtIG1heWJlIHRoZXJlIGFyZSA1IGJpcmRzDQojSSBjYW4gc3RvcmUgdGhhdCB2YWx1ZSBpbiBhIG1lYW5pbmdmdWwgd2F5IHNvIEkgY2FuIHVzZSBpdCBsYXRlciwgbGlrZSBzbzoNCg0KYmlyZHMgPC0gNQ0KDQojTm90ZSB0aGF0IHRoZSAnPC0nIHN5bWJvbCBpbmRpY2F0ZXMgdGhhdCBzb21ldGhpbmcgKGUuZy4gYSBudW1iZXIpIGlzIGJlaW5nIHN0b3JlZCB1bmRlciB0aGUgbmFtZSB0aGF0IHdlJ3ZlIGNob3Nlbi4gSGVyZSwgd2UndmUgY3JlYXRlZCBhIG5ldyBvYmplY3QgKHZhcmlhYmxlKSBjYWxsZWQgYmlyZHMuDQoNCiNSdW4gdGhpcyBibG9jayBvZiBjb2RlISBEb2VzIGFueXRoaW5nIGhhcHBlbj8NCmBgYA0KDQpPbiB0aGUgcmlnaHQtaGFuZCBzaWRlIG9mIFIgU3R1ZGlvIHlvdSB3aWxsIHNlZSB0aGUgIkVudmlyb25tZW50IiB0YWIuIFRoaXMgdGVsbHMgdXMgYWxsIG9mIHRoZSBvYmplY3RzIHRoYXQgd2UgaGF2ZSBzdG9yZWQgaW4gb3VyIGN1cnJlbnQgUiBTZXNzaW9uIChvdXIgZW52aXJvbm1lbnQpLiBZb3UnbGwgbm90aWNlIHRoYXQgYmlyZHMgYXBwZWFycyB0aGVyZSB1bmRlciAidmFsdWVzIi4NCg0KYGBge3J9DQojTGV0J3MgdXNlIFIgdG8gcHJpbnQgb3V0IGJpcmRzDQoNCmJpcmRzDQpwcmludChiaXJkcykNCmBgYA0KDQoNCmBgYHtyfQ0KI01heWJlIEkgd2FudCB0byB0cmFjayBob3cgbWFueSBiaXJkcyB0aGVyZSBhcmUgb24gZGlmZmVyZW50IGRheXMgb2YgdGhlIHdlZWsgDQojTGV0J3Mgc2F5IHRoZXJlIHdlcmUgNSBiaXJkcyBvbiBNb25kYXkgYW5kIDcgYmlyZHMgb24gVHVlc2RheQ0KI1dlIGNhbiBzdG9yZSBib3RoIG9mIHRob3NlIHZhbHVlcyBhcyB2YXJpYWJsZXMgKHRoZXJlIGFyZSBtb3JlIGVmZmljaWVudCB3YXlzIHRvIGRvIHRoaXMsIGJ1dCB3ZSdsbCBnZXQgdG8gdGhhdCBsYXRlcikNCg0KYmlyZHNfbW9uIDwtIDUNCmJpcmRzX3R1ZXMgPC0gNw0KDQojTm93LCB3ZSBjYW4gcGVyZm9ybSBvcGVyYXRpb25zIHVzaW5nIHRoZXNlIHZhcmlhYmxlcyENCiNIb3cgbWFueSBiaXJkcyB3ZXJlIHRoZXJlIG9uIGJvdGggZGF5cz8NCg0KYmlyZHNfbW9uICsgYmlyZHNfdHVlcw0KDQojV2hhdCBpcyB0aGUgYXZlcmFnZSBudW1iZXIgb2YgYmlyZHMgZm9yIHRoZSB0d28gZGF5cz8NCg0KKGJpcmRzX21vbiArIGJpcmRzX3R1ZXMpLzINCmBgYA0KYGBge3J9DQojV2FpdCwgSSBtaXNjb3VudGVkIHRoZSBudW1iZXIgb2YgYmlyZHMgb24gVHVlc2RheSEgQ2FuIEkgdXBkYXRlIHRoZSB2YXJpYWJsZT8NCiNMZXQncyBzYXkgdGhlcmUgd2VyZSBhY3R1YWxseSAxMCBiaXJkcy4gV2UgY2FuIHVwZGF0ZSBpdCBsaWtlIHNvOg0KDQpiaXJkc190dWVzIDwtIGJpcmRzX3R1ZXMgKyAzDQoNCiNZb3UgY2FuIGFsc28gcmVkZWZpbmUgdGhlIG9iamVjdCB0byBvdmVyd3JpdGUgdGhlIGluY29ycmVjdCB2YXJpYWJsZToNCmJpcmRzX3R1ZXMgPC0gMTANCmBgYA0KDQpDbGVhcmx5LCBvYmplY3RzIGFyZSB2ZXJ5IGhlbHBmdWwuIFRoZXkgYXJlLCBob3dldmVyLCBvbmx5IGhlbHBmdWwgdG8geW91IGlmIHRoZXkgYXJlIG1lYW5pbmdmdWwgLSBjcmVhdGluZyBvYmplY3RzIHdpdGggY29uZnVzaW5nIG9yIG92ZXJseSBjb21wbGljYXRlZCBuYW1lcyBtaWdodCBtYWtlIHlvdXIgbGlmZSBtb3JlIGRpZmZpY3VsdCEgSGVyZSBhcmUgc29tZSB0aXBzIGFuZCBjb252ZW50aW9ucyBmb3IgbmFtaW5nIG9iamVjdHMgaW4gUjoNCg0KLSBPYmplY3QgbmFtZXMgYXJlIGNhc2Ugc2Vuc2l0aXZlIC0gQmlyZHMgYW5kIGJpcmRzIGNhbiBiZSB0d28gc2VwYXJhdGUgb2JqZWN0cw0KLSBJbiBnZW5lcmFsLCBkb24ndCBtYWtlIHlvdXIgb2JqZWN0IG5hbWVzIHNvIHNpbWlsYXIgdGhhdCB5b3UgY2FuJ3QgdGVsbCB0aGVtIGFwYXJ0IQ0KLSBZb3UgY2Fubm90IHVzZSBzcGFjZXMgaW4gb2JqZWN0IG5hbWVzIChpLmUuICJiaXJkc19tb24iIHdvcmtzLCBidXQgImJpcmRzIG1vbiIgZG9lcyBub3QpDQotIFlvdSBjYW4gdXNlIHNvbWUgc3BlY2lhbCBjaGFyYWN0ZXJzIGluIG5hbWVzIC0geW91IHdpbGwgY29tbW9ubHkgc2VlICJfIiBhbmQgIi4iIGluIHBsYWNlIG9mIGEgc3BhY2UsIGFzIEkgaGF2ZSB1c2VkIGluIHRoZSBleGFtcGxlLiBNb3N0IHNwZWNpYWwgY2hhcmFjdGVycyB3aWxsIG5vdCB3b3JrLCBwYXJ0aWN1bGFybHkgaWYgdGhleSBtZWFuIHNvbWV0aGluZyBlbHNlIGluIHRoZSBSIGxhbmd1YWdlIChlLmcuIHlvdSBjYW5ub3QgcHV0IGEgIioiIGluIGEgICBuYW1lIGZvciBvYnZpb3VzIHJlYXNvbnM7IHlvdSBhbHNvIHdvdWxkbid0IHB1dCBxdW90ZXMgYXJvdW5kIGEgbmFtZSBpbiBwcmFjdGljZSkNCi0gWW91IGNhbiB1c2UgYSBjb21iaW5hdGlvbiBvZiBjaGFyYWN0ZXJzIGFuZCBudW1iZXJzLCBidXQgeW91IGNhbm5vdCBqdXN0IHVzZSBudW1iZXJzIGFzIG9iamVjdCBuYW1lcyAoZS5nLiAiYmlyZHMxIiB3b3JrcywgYnV0IHlvdSBjYW4ndCBqdXN0IG5hbWUgYW4gb2JqZWN0ICIxIikNCi0gVHJ5IHRvIGJlIGFzIHNwZWNpZmljIGFzIHBvc3NpYmxlIC0gImJpcmRzIiBpcyBhIGxvdCBtb3JlIGhlbHBmdWwgdGhhbiBqdXN0ICJ2YWx1ZSIgb3IgImV4YW1wbGUiDQotIFlvdSB3aWxsIG9mdGVuIGZpbmQgeW91cnNlbGYgdHlwaW5nIG91dCBvYmplY3QgbmFtZXMgbW9yZSB0aGFuIG9uY2UgLSBzaG9ydGVyIG5hbWVzIGFyZSBtdWNoIG1vcmUgY29udmVuaWVudCAoYnV0IGFnYWluLCBkb24ndCBtYWtlIHRoZW0gc28gc2hvcnQgdGhhdCB5b3UgZG9uJ3Qga25vdyB3aGF0IHRoZXkgbWVhbiAtIGl0IG1pZ2h0IGJlIHRlbXB0aW5nIHRvIG5hbWUgYW4gb2JqZWN0ICJhIiBvciAiYiIsIGJ1dCBpZiB5b3UgaGF2ZSBtYW55IG9iamVjdHMgaW4gICAgeW91ciBlbnZpcm9ubWVudCwgeW91IG1heSBmb3JnZXQgd2hhdCB0aGV5IGFyZSBsYXRlcikNCg0KDQpSZXR1cm5pbmcgdG8gRnVuY3Rpb25zDQpgYGB7cn0NCg0KI0kgdG9sZCB5b3Ugd2UnZCBjb21lIGJhY2sgdG8gdGhpcyEgRnVuY3Rpb25zIGFyZSBhIHJlYWxseSBpbXBvcnRhbnQgY29tcG9uZW50IG9mIFINCiNXaGVuIHdlIHVzZSBhIGZ1bmN0aW9uLCB0aGlzIGlzIG9mdGVuIHJlZmVycmVkIHRvIGFzICJjYWxsaW5nIGEgZnVuY3Rpb24iDQojVGhlIGNvbnRlbnQgaW5zaWRlIG9mIHRoZSAoKSBhcmUgY2FsbGVkIHRoZSBhcmd1bWVudHMgb2YgdGhlIGZ1bmN0aW9uDQojcmVjYWxsIHRoZSBmdW5jdGlvbjoNCg0Kc3VtKDEsMiwzKQ0KDQojd2UgY2FuIHVzZSBvdXIgb2JqZWN0cyBhcyBhcmd1bWVudHMgaW5zaWRlIG9mIHRoZSBmdW5jdGlvbiBjYWxsIGxpa2Ugc286DQpzdW0oYmlyZHNfbW9uLCBiaXJkc190dWVzKQ0KDQoNCiNzbyBmYXIsIHVzaW5nIGZ1bmN0aW9ucyBoYXNuJ3QgcmVhbGx5IGJlZW4gYW55IGVhc2llciB0aGFuIHR5cGluZyBvdXQgdGhlIG9wZXJhdGlvbnMgbWFudWFsbHkNCiNPZnRlbiwgZnVuY3Rpb25zIHdpbGwgcGVyZm9ybSBvcGVyYXRpb25zIHRoYXQgd2UgY2FuJ3QgZWFzaWx5IHR5cGUgb3V0IGluIFINCiNGb3IgZXhhbXBsZSwgd2hhdCBpZiB3ZSB3YW50IHRvIGdldCB0aGUgYWJzb2x1dGUgdmFsdWUgb2YgYSBudW1iZXI/IFR5cGluZyBvdXQgfHh8IGRvZXNuJ3Qgd29yayBpbiBSDQojUmVjYWxsIHRoYXQgdGhlIGFic29sdXRlIHZhbHVlIG9mIGFueSBudW1iZXIgaXMgdGhlIHBvc2l0aXZlIChub24tbmVnYXRpdmUpIHZlcnNpb24gb2YgaXQNCiNXZSBjYW4gdXNlIGEgZnVuY3Rpb24gYXMgZm9sbG93czoNCg0KYWJzKC01NikNCg0KI1RoYXQgd2FzIGVhc3khIFdlIGNhbiBhbHNvIHVzZSBtdWx0aXBsZSBmdW5jdGlvbnMgdG8gcGVyZm9ybSBzb21lIGNvbXBsZXggb3BlcmF0aW9uczoNCg0Kc3VtKDI2LCBhYnMoLTU2KSkNCg0KI0hlcmUsIEkndmUgdXNlZCB0aGUgZnVuY3Rpb24gdGhhdCBjYWxjdWxhdGVzIHRoZSBzcXVhcmUgcm9vdCBvZiBhIHZhbHVlDQpzdW0oMiw0LDYpIC0gc3FydCg2NCkNCg0KI0Rvbid0IHdvcnJ5LCB5b3Ugd29uJ3QgaGF2ZSB0byBndWVzcyB0aGUgbmFtZXMgb2YgZnVuY3Rpb25zISBJJ2xsIHRlbGwgeW91IHdoaWNoIGZ1bmN0aW9ucyB0byB1c2UgaW4gbXkgdHV0b3JpYWxzLiBJZiB5b3UncmUgZXZlciByZWFsbHkgc3R1bXBlZCwgeW91IGNhbiBhbHdheXMgZ29vZ2xlIHRoZSBuYW1lIG9mIGEgZnVuY3Rpb24gdG9vIQ0KDQpgYGANCmBgYHtyfQ0KI1NvbWV0aW1lcywgZnVuY3Rpb25zIHdpbGwgaGF2ZSBtdWx0aXBsZSBhcmd1bWVudHMuIFlvdSBjYW4gY2hlY2sgYWxsIG9mIHRoZSBhcmd1bWVudHMgdGhhdCBhIGZ1bmN0aW9uIHRha2VzIGJ5IHZpc2l0aW5nIGl0cyBoZWxwIHBhZ2UuIExldCdzIHVzZSB0aGUgcm91bmQoKSBmdW5jdGlvbg0KDQo/cm91bmQNCg0KI2Jhc2VkIG9uIHRoaXMsIHdlIGNhbiBzZWUgdGhhdCB0aGUgcm91bmQgZnVuY3Rpb24gbG9va3MgbGlrZSB0aGlzOg0KI3JvdW5kKHgsIGRpZ2l0cyA9IDApDQojVGhlcmUgYXJlIHR3byBhcmd1bWVudHMgaGVyZTogdGhlIGZpcnN0IGlzIHRoZSB2YWx1ZSB0byBiZSByb3VuZGVkICh4KSBhbmQgdGhlIHNlY29uZCB0ZWxscyB0aGUgZnVuY3Rpb24gaG93IG1hbnkgZGlnaXRzIHRvIGluY2x1ZGUgYWZ0ZXIgdGhlIGRlY2ltYWwgcG9pbnQuIFRoZSBkZWZhdWx0IHZhbHVlIG9mIGRpZ2l0cyBpcyBzaG93biwgYW5kIGl0IGxvb2tzIGxpa2UgaXQgaXMgc2V0IGF0IDAuIExldCdzIHRlc3QgdGhpczoNCg0Kcm91bmQoNS42NjY3OCkNCg0KI3doYXQgaWYgd2UgY2hhbmdlIHRoZSBkaWdpdHMgYXJndW1lbnQ/IExldCdzIHJvdW5kIG91ciB2YWx1ZSB0byB0d28gZGlnaXRzIGFmdGVyIHRoZSBkZWNpbWFsIHBsYWNlLiBXZSBjYW4gZG8gdGhpcyBpbiB0d28gd2F5czoNCg0Kcm91bmQoNS42NjY3OCwgZGlnaXRzID0gMikNCg0KI09yLCB3ZSBjYW4gc2ltcGxpZnkgdGhlIGFyZ3VtZW50Og0Kcm91bmQoNS42NjY3OCwgMikNCg0KI1lvdSBvZnRlbiB3b24ndCBoYXZlIHRvIHVzZSB0aGUgbmFtZSBvZiB0aGUgYXJndW1lbnQgaW4gdGhlIGNhbGwgdG8gdGhlIGZ1bmN0aW9uLCBidXQgaXQgY2FuIGJlIGhlbHBmdWwgdG8gdXNlIGl0IHNvIHRoYXQgeW91IGtub3cgd2hhdCBpcyBoYXBwZW5pbmcgaW5zaWRlIHRoZSBmdW5jdGlvbi4gSWYgeW91IGRvIG5vdCB1c2UgdGhlIG5hbWUgb2YgdGhlIGFyZ3VtZW50LCBvcmRlciBtYXR0ZXJzISBGb3IgZXhhbXBsZSwgSSBjYW4gY2hhbmdlIHRoZSBvcmRlciBvZiB0aGUgYXJndW1lbnRzIGlmIEkgdXNlIHRoZSBuYW1lczoNCg0Kcm91bmQoZGlnaXRzID0gMiwgeCA9IDUuNjY2NzgpDQoNCiNCdXQgSSBtdXN0IHVzZSB0aGUgYXJndW1lbnRzIGluIHRoZSBvcmRlciBzcGVjaWZpZWQgYnkgdGhlIGhlbHAgZmlsZSBpZiBJIGRvIG5vdCB1c2UgdGhlIGFyZ3VtZW50IG5hbWVzLiBTbywgdGhpcyBkb2Vzbid0IGdpdmUgbWUgdGhlIHNhbWUgcmVzdWx0IHRoYXQgSSB3YXMgbG9va2luZyBmb3I6DQoNCnJvdW5kKDIsIDUuNjY2NzgpDQoNCiNJbiBnZW5lcmFsLCBJIHdvdWxkIHVzZSB0aGUgYXJndW1lbnRzIGluIHRoZSBzcGVjaWZpZWQgb3JkZXIgdG8gYXZvaWQgYW55IGNvbmZ1c2lvbiENCmBgYA0KV2hhdCBpZiB5b3UgZG9uJ3Qga25vdyB3aGF0IGZ1bmN0aW9uIHRvIHVzZT8gRm9yIHRoZSBtb3N0IHBhcnQsIEkgd2lsbCBnaXZlIHlvdSB0aGUgZnVuY3Rpb25zIHRoYXQgeW91IHdpbGwgbmVlZCBpbiBteSB0dXRvcmlhbHMgZWFjaCB3ZWVrLiBZb3Ugc2hvdWxkbid0IG5lZWQgdG8gbG9vayB1cCBhbnl0aGluZyBlbHNlLiBXaGVuIHlvdSBzdGFydCBkb2luZyB5b3VyIG93biBwcm9ncmFtbWluZyBwcm9qZWN0cywgaG93ZXZlciwgeW91IG1heSBmaW5kIHRoYXQgeW91IG5lZWQgYWRkaXRpb25hbCBmdW5jdGlvbnMuIE9mdGVuLCB0aGUgYmVzdCB3YXkgdG8gZmluZCBvdGhlciBmdW5jdGlvbnMgaXMgdG8gc2ltcGx5IHNlYXJjaCBnb29nbGU7IG1vc3Qgb2YgdGhlIHRpbWUsIHNvbWVvbmUgZWxzZSBoYXMgYWxyZWFkeSBjcmVhdGVkIGEgcGFja2FnZSB0aGF0IGNvbnRhaW5zIHRoZSBmdW5jdGlvbiB5b3Ugd2lsbCBuZWVkLiBJZiB5b3UgdGhpbmsgeW91IGtub3cgdGhlIG5hbWUgb2YgYSBmdW5jdGlvbiwgYnV0IGFyZW4ndCBzdXJlLCB5b3UgY2FuIHN0YXJ0IHR5cGluZyBhIGZ1bmN0aW9uIGluIFIgYW5kIHByZXNzIFRhYjogdGhpcyB3aWxsIGJyaW5nIHVwIGEgbGlzdCBvZiBmdW5jdGlvbnMgdG8gY2hvb3NlIGZyb20uDQoNCk5leHQsIHdlIHdpbGwgbW92ZSBvbiB0byBhbm90aGVyIHVzZWZ1bCBvYmplY3QgdHlwZS4gU28gZmFyLCBJIGhhdmUgc2hvd24geW91IGhvdyB0byBzdG9yZSBhIHNpbmdsZSB2YWx1ZS4gT2Z0ZW4sIHlvdSB3aWxsIG5lZWQgdG8gcGVyZm9ybSBjYWxjdWxhdGlvbnMgb24gbXVsdGlwbGUgdmFsdWVzLiBIb3cgY2FuIHdlIHN0b3JlIG11bHRpcGxlIHZhbHVlcyBhdCBvbmNlPyBUaGUgc2ltcGxlc3Qgd2F5IHRvIGRvIHRoaXMgaXMgdXNpbmcgYW4gb2JqZWN0IGNhbGxlZCBhIFZlY3Rvci4gDQoNCmBgYHtyfQ0KI0xldCdzIHNheSBJIGhhdmUgYmlyZCBkYXRhIGZvciBhbiBlbnRpcmUgd2Vlay4gSG93IGNhbiBJIHN0b3JlIHRoYXQgZGF0YSBhcyBhIHZlY3Rvcj8gSSBjYW4gdXNlIHRoZSBDb21iaW5lIGZ1bmN0aW9uLCBvciBjKCksIHdpdGggYSBjb21tYSBhZnRlciBlYWNoIHZhbHVlIEkgd2FudCB0byBzdG9yZSBpbiBteSB2ZWN0b3IuIEhlcmUncyB3aGF0IGl0IGxvb2tzIGxpa2U6DQoNCmJpcmRzX3dlZWsgPC0gYyg1LCA3LCA4LCA0LCA1LCAzLCA5KQ0KYmlyZHNfd2Vlaw0KDQojV2hhdCBpZiBJIHdhbnQgdG8gaW5zcGVjdCBvbmUgZWxlbWVudCBvZiB0aGUgdmVjdG9yPyBBbiBpbmRleCB3b3VsZCBjb21lIGluIGhhbmR5IGhlcmUhIEFuIGluZGV4IHRlbGxzIFIgd2hpY2ggZWxlbWVudCBudW1iZXIgdG8gcHJpbnQgb3V0OyB0aGUgZmlyc3QgZWxlbWVudCBpcyBlbGVtZW50IDEgYW5kIHRoZSBsYXN0IGlzIGVsZW1lbnQgNS4gV2UgY2FuIHNlZSB0aGUgbnVtYmVyIG9mIGJpcmRzIG9uIFdlZG5lc2RheSAoZWxlbWVudCAzKSBsaWtlIHNvOg0KDQpiaXJkc193ZWVrWzNdDQoNCiNUaGF0IHdhcyBlYXN5ISBXaGF0IGlmIEkgd2FudCB0byBzZWUgdGhlIGJpcmRzIG9uIFR1ZXNkYXkgdGhyb3VnaCBUaHVyc2RheT8gSSBjYW4gdXNlIGEgIjoiIGxpa2Ugc28gdG8gcHJpbnQgdGhvc2UgZWxlbWVudHM6DQoNCmJpcmRzX3dlZWtbMjo0XQ0KDQojTm90ZSB0aGF0LCBpbiBSLCBpbmRleGluZyBpbiB0aGlzIHdheSBpcyBpbmNsdXNpdmU6IHdlJ3ZlIHNlbGVjdGVkIGFsbCBlbGVtZW50cyBiZXR3ZWVuIDIgYW5kIDQsIGluY2x1ZGluZyBlbGVtZW50cyAyIGFuZCA0LiBOb3QgYWxsIHByb2dyYW1taW5nIGxhbmd1YWdlcyBmdW5jdGlvbiB0aGlzIHdheS4NCmBgYA0KYGBge3J9DQojV2hhdCBpZiB3ZSB3YW50ZWQgdG8gY2hhbmdlIG9uZSBvZiB0aGUgZWxlbWVudHMgb2YgdGhlIHZlY3Rvcj8NCiNUaGF0J3MgZWFzeSB0b28hIFdlIGNhbiB0ZWxsIFIgdG8gY2hhbmdlIGp1c3Qgb25lIGVsZW1lbnQgbGlrZSBzbzoNCg0KYmlyZHNfd2Vla1syXSA8LSAxMA0KDQojV2UgaGF2ZSBqdXN0IGFzc2lnbmVkIHRoZSBudW1iZXIgMTAgdG8gZWxlbWVudCAyLiANCiNXaGF0IGlmIG15IHZlY3RvciBpcyB2ZXJ5IGxvbmc/IEkgY2FuIGNoZWNrIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgbGlrZSBzbzoNCg0KbGVuZ3RoKGJpcmRzX3dlZWspDQoNCiNUaGlzIHRlbGxzIG1lIHRoYXQgdGhlcmUgYXJlIDUgZWxlbWVudHMgaW4gdGhlIHZlY3RvciAoSSBjYW4gYWxzbyBzZWUgdGhhdCBieSBsb29raW5nIGF0IHRoZSBHbG9iYWwgRW52aXJvbm1lbnQgcGFuZSkNCmBgYA0KYGBge3J9DQojQ2FuIHdlIHBlcmZvcm0gY29tcHV0YXRpb25zIG9uIHRoZSBlbGVtZW50cyBvZiBhIHZlY3Rvcj8gV2Ugc3VyZSBjYW4hIExldCdzIHNheSBiaXJkIGZvb2QgY29zdHMgJDAuNTAvYmlyZCwgYW5kIEkgd2FudCB0byBrbm93IGhvdyBtdWNoIGl0IHdvdWxkIGNvc3QgZm9yIG1lIHRvIGZlZWQgZWFjaCBiaXJkLiBJIGNhbiBtdWx0aXBseSBlYWNoIGVsZW1lbnQgYnkgMC41IGxpa2Ugc286DQoNCmJpcmRzX2Nvc3QgPC0gYmlyZHNfd2VlayowLjUwDQpiaXJkc19jb3N0DQoNCiNOb3RlIHRoYXQsIGlmIHlvdSBwZXJmb3JtIGEgY2FsY3VsYXRpb24gb24gdGhlIHZlY3RvciAoYXMgYWJvdmUpIGl0IHdpbGwgYWx0ZXIgZWFjaCBlbGVtZW50IGluIHRoZSB2ZWN0b3IuIElmIHdlIHdhbnRlZCB0byBqdXN0IHBlcmZvcm0gdGhlIGNvbXB1dGF0aW9uIG9uIG9uZSBlbGVtZW50LCB3ZSBjb3VsZCBoYXZlIGRvbmUgdGhlIGZvbGxvd2luZzoNCg0KY29zdF90dWVzIDwtIGJpcmRzX3dlZWtbMl0qMC41MA0KY29zdF90dWVzDQoNCiNXaGF0IGlmIHRoZSBjb3N0IG9mIGZlZWRpbmcgdGhlIGJpcmRzIGNoYW5nZXMgZHVyaW5nIHRoZSB3ZWVrPyBIZXJlJ3MgYSBuZXcgdmVjdG9yIG9mIGJpcmQgZm9vZCBwcmljZXM6DQoNCnByaWNlIDwtIGMoMC41MCwgMC40MCwgMS4wMCwgMC42NSwgMC4zMCwgMC41LCAwLjcpDQoNCiNXZSBjYW4gbXVsdGlwbHkgYSB2ZWN0b3IgYnkgYSB2ZWN0b3IhIENhbiB5b3UgdGVsbCB3aGF0IFIgZGlkIGhlcmU/DQoNCmJpcmRzX2Nvc3QxIDwtIGJpcmRzX3dlZWsqcHJpY2UNCmJpcmRzX2Nvc3QxDQpgYGANCg0KYGBge3J9DQojRmluYWxseSwgd2UgY2FuIGFsc28gdXNlIGZ1bmN0aW9ucyBvbiBvdXIgdmVjdG9yLiBJJ2xsIGdldCBpbnRvIHRoaXMgaW4gbW9yZSBkZXB0aCBsYXRlciwgYnV0IGhlcmUgaXMgYW4gZXhhbXBsZToNCg0KbWVhbihiaXJkc193ZWVrKQ0KDQojVGhpcyB0ZWxscyB1cyB0aGUgYXZlcmFnZSBudW1iZXIgb2YgYmlyZHMgcGVyIGRheQ0KI05vdGUgdGhhdCwgaWYgeW91IGRvbid0IHN0b3JlIHRoZSB2YWx1ZSBhcyBhbiBvYmplY3QsIFIgd2lsbCBqdXN0IHByaW50IGl0IG91dCAoYXMgYmVsb3cpLiANCmBgYA0KYGBge3J9DQojU28gZmFyLCB3ZSBoYXZlIGJlZW4gd29ya2luZyB3aXRoIG51bWVyaWMgZGF0YSEgQnV0IHRoZXJlIGFyZSBhIG51bWJlciBvZiBkaWZmZXJlbnQgZGF0YSB0eXBlcyB0aGF0IFIgd2lsbCBhbGxvdyB5b3UgdG8gd29yayB3aXRoLiBZb3UgY2FuIGZpbmQgb3V0IHdoYXQgdHlwZSBvZiBkYXRhIHlvdSBhcmUgd29ya2luZyB3aXRoIGJ5IHR5cGluZyB0aGUgZm9sbG93aW5nOg0KDQpzdHIoYmlyZHNfd2VlaykNCg0KI3N0ciBnaXZlcyB1cyBhIGxvdCBvZiBpbmZvcm1hdGlvbiEgSWYgeW91IG9ubHkgd2FudCB0byBrbm93IHRoZSBvYmplY3QgdHlwZSwgeW91IGNhbiB1c2U6DQoNCmNsYXNzKGJpcmRzX3dlZWspDQoNCiNUaGlzIHRlbGxzIHVzIHRoYXQgb3VyIHZlY3RvciBpcyBudW1lcmljISBXaGF0IGlmIHdlIHdhbnRlZCB0byB3b3JrIHdpdGggYW5vdGhlciBkYXRhIHR5cGU/IEZvciBleGFtcGxlLCB3aGF0IGlmIEkgd2FudCB0byBrbm93IHRoZSB0eXBlIG9mIHRoZSBiaXJkcyBpbiB0aGUgbG90PyBJIGNhbiBzdG9yZSB0aGUgbmFtZXMgYXMgYSBDaGFyYWN0ZXIgU3RyaW5nLiBJZiBJIGhhdmUgZml2ZSBiaXJkcywgaXQgbWlnaHQgbG9vayBsaWtlIHRoaXM6DQoNCmJpcmRfdHlwZSA8LSBjKCJyb2JpbiIsICJjYXJkaW5hbCIsICJibHVlIGpheSIsICJjcm93IiwgIndhcmJsZXIiKQ0KYmlyZF90eXBlDQoNCiNUaGUgcXVvdGF0aW9ucyB0ZWxsIHVzIHRoYXQgZWFjaCBtYWtlIGlzIGEgY2hhcmFjdGVyIHN0cmluZzsgdHJ5aW5nIHRvIGNyZWF0ZSBhIGNoYXJhY3RlciB2ZWN0b3Igd2l0aG91dCB0aGUgcXVvdGVzIHdpbGwgdGhyb3cgYW4gZXJyb3I6DQoNCmJpcmRfdHlwZTEgPC0gYyhyb2JpbiwgY2FyZGluYWwpDQoNCmBgYA0KYGBge3J9DQojV2h5PyBCZWNhdXNlIHdpdGhvdXQgcXVvdGVzLCBSIGlzIGxvb2tpbmcgZm9yIGFuIG9iamVjdCB0aGF0IG1hdGNoZXMgdGhlIG5hbWVzIHJvYmluIGFuZCBjYXJkaW5hbC4gVGhlcmUgYXJlIG5vIHN1Y2ggb2JqZWN0cy4gVGhpcyBpcyB2ZXJ5IGltcG9ydGFudCB0byByZW1lbWJlciB3aGVuIHdvcmtpbmcgd2l0aCBjaGFyYWN0ZXJzLiBZb3UgY2FuIGFsc28gdXNlIHNpbmdsZSBxdW90ZXMgaW50ZXJjaGFuZ2VhYmx5Og0KDQpiaXJkX3R5cGUxIDwtIGMoJ2NhcmRpbmFsJywgJ3JvYmluJykNCg0KI0kgY2FuIHNlbGVjdCBlbGVtZW50cyBvZiBhIGNoYXJhY3RlciB2ZWN0b3IgaW4gdGhlIHNhbWUgd2F5IEkgZGlkIGZvciBudW1lcmljIHZlY3RvcnM6DQoNCmJpcmRfdHlwZVszXQ0KDQojSWYgSSBjaGVjayB0aGUgc3RydWN0dXJlIG9mIHRoZSB2ZWN0b3IsIFIgd2lsbCB0ZWxsIG1lIHRoYXQgaXQgaXMgYSBjaGFyYWN0ZXIgdGhpcyB0aW1lOg0KDQpzdHIoYmlyZF90eXBlKQ0KYGBgDQoNCg0KDQpgYGB7cn0NCiNXaGF0IGtpbmRzIG9mIGZ1bmN0aW9ucyBjYW4gd2UgdXNlIG9uIGNoYXJhY3RlciB2ZWN0b3JzPyBNb3N0IG9mIHRoZSBmdW5jdGlvbnMgd2Ugd2lsbCBiZSB1c2luZyBhcmUgb25seSBmb3IgbnVtZXJpYyBkYXRhLiBUaGVyZSBhcmUgYSBmZXcgZnVuY3Rpb25zIHRoYXQgd29yayBmb3IgY2hhcmFjdGVyIGRhdGEuIEZvciBleGFtcGxlLCB3aGF0IGlmIHdlIHdhbnRlZCB0byBrbm93IGhvdyBtYW55IGxldHRlcnMgd2VyZSBpbiBlYWNoIGVsZW1lbnQgb2YgdGhlIHZlY3Rvcj8gV2UgY2FuIHVzZSB0aGUgZnVuY3Rpb24gbmNoYXIoKSB0byBmaW5kIG91dDoNCg0KbmNoYXIoYmlyZF90eXBlKQ0KYGBgDQpOZXh0LCB3ZSdsbCB0YWtlIGEgbG9vayBhdCBhIHRoaXJkIHR5cGUgb2YgZGF0YTogbG9naWNhbCBkYXRhLiBCZWZvcmUgd2Ugc3RvcmUgYW55IGxvZ2ljYWwgZGF0YSwgSSB3aWxsIGZpcnN0IGludHJvZHVjZSB3aGF0IEkgbWVhbiBieSB0aGlzIGRhdGEgdHlwZS4gTG9naWNhbCBkYXRhIGNvbnNpc3RzIG9mIFRydWUgYW5kIEZhbHNlLiBXZSB3aWxsIHJhcmVseSBldmVyIHdvcmsgd2l0aCB0aGlzIGRhdGEgb24gaXRzIG93bjogdXN1YWxseSB3ZSB1c2UgdGhpcyBkYXRhIHRvIGluZGV4IGEgdmVjdG9yIGJhc2VkIG9uIGEgY29uZGl0aW9uIChJJ2xsIGV4cGxhaW4gdGhpcyBmdXJ0aGVyIGluIGEgbWludXRlKS4gV2UgY2FuIHNlZSBob3cgbG9naWNhbCBkYXRhIGlzIGNvbGxlY3RlZCBieSB1c2luZyBsb2dpY2FsIG9wZXJhdGlvbnMuIA0KDQpgYGB7cn0NCiNGb3IgZXhhbXBsZSwgbGV0J3MgdGVzdCBhIHN0YXRlbWVudCB0aGF0IHdlIGtub3cgaXMgdHJ1ZS4gDQoNCjIrMiA9PSA0DQoNCiNOb3RlIHRoYXQgeW91IG11c3QgdXNlIHRoZSAiPT0iIHdoZW4geW91IGFyZSB1c2luZyBhIGxvZ2ljYWwgb3BlcmF0aW9uDQojV2hhdCBoYXBwZW5zIGlmIHdlIGlucHV0IGEgbG9naWNhbCBvcGVyYXRpb24gdGhhdCBpc24ndCB0cnVlPw0KDQoyKzIgPT0gNQ0KDQojV2UgY2FuIGRvIG1vcmUgdGhhbiB0ZXN0IGVxdWFsaXR5LiBIZXJlIGFyZSBzb21lIGFkZGl0aW9uYWwgZXhhbXBsZXM6DQoNCiNHcmVhdGVyIHRoYW46DQoNCjIrMiA+IDQNCg0KI0xlc3MgdGhhbjoNCg0KMisyIDwgNQ0KYGBgDQpgYGB7cn0NCiNMZXNzIHRoYW4gb3IgZXF1YWwgdG86DQoNCjIgKyAyIDw9IDUNCg0KI0dyZWF0ZXIgdGhhbiBvciBlcXVhbCB0bzoNCg0KMiArIDIgPj0gNQ0KDQojV2UgY2FuIGFsc28gYXNrIFIgaWYgYSB2YWx1ZSBpcyBzaW1wbHkgbm90IGVxdWFsIHRvIGFub3RoZXIgdmFsdWUsIHVzaW5nIGEgIiEiOg0KDQoyICsgMiAhPSA1DQpgYGANCmBgYHtyfQ0KI1RoZXJlIGFyZSB0d28gbW9yZSBpbXBvcnRhbnQgb3BlcmF0aW9ucyB5b3Ugc2hvdWxkIGtub3cgdXNpbmcgc3ltYm9scw0KI0xldCdzIHNheSB3ZSB3YW50IHRvIGtub3cgaWYgdHdvIGNvbmRpdGlvbnMgYXJlIHRydWUgLSBpZiB0aGV5IGJvdGggbmVlZCB0byBiZSB0cnVlLCB3ZSBjYW4gdXNlICY6DQoNCjQgPiA1ICYgNCA8IDYNCg0KI0lmIHdlIGp1c3Qgd2FudCBhdCBsZWFzdCBvbmUgY29uZGl0aW9uIHRvIGJlIHRydWUsIHdlIGNhbiB1c2Ugb3IsIHdoaWNoIGlzIHN5bWJvbGl6ZWQgdXNpbmcgYSAifCIgc3ltYm9sOg0KDQo0ID4gNSB8IDQgPCA2DQoNCiNBcyB5b3UgY2FuIHNlZSwgdGhlIGZpcnN0IHN0YXRlbWVudCAodXNpbmcgJikgd2FzIGZhbHNlLCBidXQgaWYgd2Ugc3Vic3RpdHV0ZSBhbiB8IGluc3RlYWQsIGl0IGJlY29tZXMgdHJ1ZS4gVGhpcyBpcyBiZWNhdXNlIG9ubHkgb25lIG9mIHRoZSBsb2dpY2FsIGNvbmRpdGlvbnMgKDQ8Nikgd2FzIHRydWUuIA0KYGBgDQpgYGB7cn0NCiNXZSBjYW4gYWxzbyBzdG9yZSBUUlVFIGFuZCBGQUxTRSBhcyBsb2dpY2FsIGRhdGEsIGFzIGEgdmFsdWUgb3IgdmVjdG9yIGxpa2Ugc286DQoNCmFuc3dlciA8LSAyKzIgPT0gNA0KDQojV2hhdCBoYXBwZW5zIGlmIEkgZGlzcGxheSB0aGUgb2JqZWN0LCBhbnN3ZXI/DQoNCmFuc3dlcg0KDQojSSBjYW4gYWxzbyBzdG9yZSBsb2dpY2FsIGRhdGEgYnkgaW5wdXR0aW5nIGRpcmVjdGx5LCBsaWtlIHRoaXM6DQojTm90ZSB0aGF0IEkgY2FuIHVzZSBhbiB1cHBlcmNhc2UgVCBvciBGIGFzIHNob3J0aGFuZCBmb3IgVFJVRSBhbmQgRkFMU0UgDQoNCmxvZzEgPC0gVA0KDQpsb2cyIDwtIGMoVCwgRiwgVCkNCg0KbG9nMg0KDQojSSBjYW4gYWxzbyBwZXJmb3JtIGxvZ2ljYWwgb3BlcmF0aW9ucyBvbiBhIHZlY3RvciwgbGlrZSB0aGUgYmlyZHNfd2VlayB2ZWN0b3Igd2UgY3JlYXRlZCBlYXJsaWVyDQojTGV0J3MgZmluZCBvdXQgd2hpY2ggZGF5cyB0aGVyZSB3ZXJlIG1vcmUgdGhhbiA2IGJpcmRzIGluIG15IHlhcmQ6DQoNCmJpcmRzX3dlZWsgPiA2DQoNCiNJZiB3ZSB3YW50ZWQgdG8sIHdlIGNvdWxkIGFsc28gc3RvcmUgdGhhdCBhcyBhIHZlY3Rvcg0KDQojRmluYWxseSwgeW91IGNhbiB1c2UgbG9naWNhbCBvcGVyYXRpb25zIG9uIHRleHQsIGZvciBleGFtcGxlOg0KDQoiY2F0IiA9PSAiY2F0Ig0KImNhdCIgPT0gImRvZyINCg0KYGBgDQpgYGB7cn0NCiNTbywgd2hhdCBkbyB3ZSBhY3R1YWxseSBkbyB3aXRoIGxvZ2ljYWwgZGF0YT8NCiNJbiB0aGlzIG5leHQgc2VjdGlvbiwgSSB3aWxsIHNob3cgeW91IHdoeSBsb2dpY2FsIGRhdGEgaXMgc28gdXNlZnVsDQojV2UgdHlwaWNhbGx5IHVzZSBsb2dpY2FsIGRhdGEgdG8gaW5kZXggdmVjdG9ycw0KI0J1dCBiZWZvcmUgd2UgZG8gdGhhdCwgYSBmZXcgYWRkaXRpb25hbCBub3RlcyBvbiBpbmRleGluZyB2ZWN0b3JzOg0KDQojU28gZmFyLCB3ZSd2ZSBpbmRleGVkIHZlY3RvciBhcyBmb2xsb3dzOg0KYmlyZHNfd2Vla1syXQ0KDQojQW5kIHdlIGtub3cgdGhhdCB3ZSBjYW4gc2VsZWN0IG11bHRpcGxlIGVsZW1lbnRzIG9mIGEgdmVjdG9yIGxpa2UgdGhpczoNCiNOb3RlIHRoYXQgd2UgbmVlZCB0byB1c2UgdGhlIGMoKSB3aGVuIHdlIHNwZWNpZnkgaW5kaXZpZHVhbCBlbGVtZW50cyBpbiB0aGlzIHdheToNCg0KYmlyZHNfd2Vla1tjKDIsMyw0KV0NCg0KI09yZGVyIG1hdHRlcnMhIE5vdGljZSB0aGF0IHRoaXMgZG9lcyBub3QgcmV0dXJuIHRoZSBzYW1lIHJlc3VsdDoNCg0KYmlyZHNfd2Vla1tjKDMsMiw0KV0NCg0KI1JlbWVtYmVyIHRoYXQgd2UgY2FuIGFsc28gdGVsbCBSIHRoYXQgd2Ugd2FudCB0byBzZWxlY3QgZWxlbWVudHMgMiB0aHJvdWdoIDQsIHVzaW5nICIyOjQiDQojSWYgd2UgZG8gaXQgdGhpcyB3YXksIHdlIGRvIG5vdCBuZWVkIHRoZSBjKCkNCg0KYmlyZHNfd2Vla1syOjRdDQpgYGANCmBgYHtyfQ0KI1dlIHdpbGwgcHJpbWFyaWx5IHVzZSBsb2dpY2FsIGRhdGEgdG8gaW5kZXggdmVjdG9ycw0KI1NheSB3ZSB3YW50IHRvIHNlbGVjdCBvbmx5IHRoZSBkYXlzIG9mIHRoZSB3ZWVrIHdoZXJlIHRoZXJlIHdlcmUgbW9yZSB0aGFuIDYgYmlyZHMgaW4gbXkgeWFyZA0KI1dlIGNhbiBkbyB0aGF0IGVhc2lseSBsaWtlIHRoaXM6DQoNCmJpcmRzX3dlZWtbYmlyZHNfd2VlayA+IDZdDQoNCiNXaHkgZGlkIHRoYXQgd29yaz8gUmVjYWxsIHRoYXQgImJpcmRzX3dlZWsgPiA2IiBwcm9kdWNlZCBhIHZlY3RvciBvZiBsb2dpY2FsIGRhdGEsIHdoZXJlIGRheXMgPiA2IHJldHVybmVkIFRSVUUgYW5kIGRheXMgPCA2IHJldHVybmVkIEZBTFNFDQojV2hlbiB3ZSBpbmRleCBhIG51bWVyaWMgdmVjdG9yIGJ5IGEgbG9naWNhbCB2ZWN0b3IgaW4gdGhpcyB3YXksIGl0IHRlbGxzIFIgdG8gb25seSByZXR1cm4gdGhlIG51bWVyaWMgdmVjdG9yIGVsZW1lbnRzIHRoYXQgY29ycmVzcG9uZCB0byBUUlVFIGluIHRoZSBsb2dpY2FsIHZlY3RvciAtIGluIHRoaXMgY2FzZSwgdGhlIGVudHJpZXMgZm9yIFR1ZXNkYXksIFdlZG5lc2RheSwgYW5kIFN1bmRheSBhcmUgVFJVRSBiZWNhdXNlIHRoZXkgYXJlID42DQpgYGANCg0KYGBge3J9DQojV2UgY2FuIGFsc28gaW5kZXggY2hhcmFjdGVyIHZlY3RvcnMNCiNMZXQncyBzYXkgSSBoYXZlIHRoZSBkYXlzIG9mIHRoZSB3ZWVrIGluIGEgdmVjdG9yOg0KDQp3ZWVrIDwtIGMoIk1vbmRheSIsICJUdWVzZGF5IiwgIldlZG5lc2RheSIsICJUaHVyc2RheSIsICJGcmlkYXkiLCAiU2F0dXJkYXkiLCAiU3VuZGF5IikNCg0KI0lmIEkgd2FudCB0byBrbm93IHdoYXQgd2Vla2RheXMgdGhlcmUgd2VyZSBtb3JlIHRoYW4gNiBiaXJkcyBpbiB0aGUgcGFya2luZyBsb3QsIEkgY2FuIGFsc28gaW5kZXggdGhlIGNoYXJhY3RlciB2ZWN0b3IgbGlrZSB0aGlzOg0KDQp3ZWVrW2JpcmRzX3dlZWsgPiA2XQ0KDQojSGVyZSwgUiBtYXRjaGVzIHRoZSBlbGVtZW50cyBvZiBlYWNoIHZlY3RvciBieSB0aGVpciBlbGVtZW50IG51bWJlciAoZS5nLiBNb25kYXkgYW5kIDUgYXJlIGVsZW1lbnQgMSwgVHVlc2RheSBhbmQgMTAgYXJlIGVsZW1lbnQgMiwgZXRjLikgYW5kIHNlbGVjdHMgdGhlIGVsZW1lbnRzIGluIHdlZWsgdGhhdCBjb3JyZXNwb25kIHdpdGggdGhlIGVsZW1lbnQgbnVtYmVycyBpbiBiaXJkc193ZWVrIHRoYXQgYXJlIGdyZWF0ZXIgdGhhbiA2DQojTm90ZSB0aGF0IG9yZGVyIG1hdHRlcnMgaGVyZSEgSWYgbXkgZGF5cyBvZiB0aGUgd2VlayB3ZXJlIG91dCBvZiBvcmRlciwgdGhlbiBJIHdvdWxkIG5vdCBnZXQgdGhlIGNvcnJlY3QgYW5zd2VyczoNCg0Kd2VlazEgPC0gYygiVHVlc2RheSIsICJNb25kYXkiLCAiV2VkbmVzZGF5IiwgIlRodXJzZGF5IiwgIkZyaWRheSIsICJTYXR1cmRheSIsICJTdW5kYXkiKQ0KDQp3ZWVrMVtiaXJkc193ZWVrID4gNl0NCg0KI0lmIEkgd2FudCB0byBrbm93IHdoYXQgZGF5cyBvZiB0aGUgd2VlayB0aGVyZSB3ZXJlIGVpdGhlciBncmVhdGVyIHRoYW4gOCBiaXJkcyBvciBsZXNzIHRoYW4gNSBiaXJkcywgSSBjYW4gZm91bmQgb3V0IGxpa2Ugc286DQoNCndlZWtbYmlyZHNfd2VlayA+IDggfCBiaXJkc193ZWVrIDwgNV0NCg0KYGBgDQoNClJlc291cmNlcw0KTmF2YXJybywgRC4gKDIwMTkpLiBMZWFybmluZyBTdGF0aXN0aWNzIHdpdGggUi4gUmV0cmlldmVkIGZyb206DQpodHRwczovL2xlYXJuaW5nc3RhdGlzdGljc3dpdGhyLmNvbS9ib29rL2luZGV4Lmh0bWwuIA==