Group/Individual Details

Executive Statement

In this investigation, it will mainly focus on analysing if there is a statistically significant average price difference between coles and woolworths. The report will analyse the average price differece for all sample products of the two supermarkets, as well as the difference between the two supermakets in each category and if so which supermaket is cheaper.

The sample of the test includes information on 200 products observations with product name, product categories and product prices for both coles and woolworths supermarkets. The gorcerycop website was used to collect the data, which ensures and provide prices of same product from coles and woolworths (http://www.grocerycop.com.au/products/category/fridge?page=7).

For the categrorization, the 200 products are categorized into 5 categories with each category of 40 observations. The gorcery website basically categories all products in coles and woolworth into 10 categroies, fridge, bakery,fruit&vegetables, pantry, freezer, baby&health&beauty, meat&seafood,Entertainment & International Food, closing&household&pet and drinks&tobacco.This report combine these 10 listed on website into 5 catrgories, the fridge (fridge&freezer), food(fruit&vegetables,meat&seafood,bakery), household (Entertainment & International Food, closing&household&pet),baby health (baby&health&beauty,bakery) and pantry&drinks(pantry&drinks&tobacco). Each of the 5 categories contains 2 categrories of products listed on the gorcerycop websites and each of the 10 website categrories are selected 20 products to form the total 200 sample observations.

To ensure the data are collected randomly, researcher randomly select 1 to 3 products that contains prices information for both coles and woolworths on each page of websites to guarantee that sample could contains different products as possible and make the sample to be more representative.

After finishing the hypothsis test, the report has found that there is no significant difference in average price between coles and woolworths for both all sample products and the products in each of the 5 categories. And this analysis support that fact that the average price of cole and woolworths are not different in each categories and all products as a whole.

Load Packages and Data

# This is a chunk where you can load the necessary data and packages required to reproduce the report
price<-library(readr)
allprices <- read.csv("~/Desktop/allprices.csv")
install.packages("magrittr")
install.packages("dplyr")
install.packages("car")

library("magrittr", lib.loc="/Library/Frameworks/R.framework/Versions/3.4/Resources/library")
library("ggplot2", lib.loc="/Library/Frameworks/R.framework/Versions/3.4/Resources/library")
library("dplyr", lib.loc="/Library/Frameworks/R.framework/Versions/3.4/Resources/library")
library("car", lib.loc="/Library/Frameworks/R.framework/Versions/3.4/Resources/library")
# You should also include your code required to prepare your data for analysis. 

Summary Statistics

allprices %>% group_by(categories) %>% summarise(Min = min(coles,na.rm = TRUE),
                            Max=max(coles,na.rm=TRUE),
                            Q1 = quantile(coles,probs = .25,na.rm = TRUE),
                           Median = median(coles, na.rm = TRUE),
                           Q3 = quantile(coles,probs = .75,na.rm = TRUE),
                           Mean = mean(coles, na.rm = TRUE),
                           SD = sd(coles, na.rm = TRUE),
                           n = n(),
                           Missing = sum(is.na(coles)))
allprices %>% group_by(categories) %>% summarise(Min = min(woolworths,na.rm = TRUE),
                            Max=max(woolworths,na.rm=TRUE),
                            Q1 = quantile(woolworths,probs = .25,na.rm = TRUE),
                           Median = median(woolworths, na.rm = TRUE),
                           Q3 = quantile(woolworths,probs = .75,na.rm = TRUE),
                           Mean = mean(woolworths, na.rm = TRUE),
                           SD = sd(woolworths, na.rm = TRUE),
                           n = n(),
                           Missing = sum(is.na(coles)))
#create a variable of the difference between coles and woolworths
allprices<-allprices%>%mutate(differ=coles - woolworths)
#caculate the statistical summary of the differences between price of the same products of coles and woolworths in different categories.
allprices %>% group_by(categories) %>% summarise(Min = min(differ,na.rm = TRUE),
                            Max=max(differ,na.rm=TRUE),
                            Q1 = quantile(differ,probs = .25,na.rm = TRUE),
                           Median = median(differ, na.rm = TRUE),
                           Q3 = quantile(differ,probs = .75,na.rm = TRUE),
                           Mean = mean(differ, na.rm = TRUE),
                           SD = sd(differ, na.rm = TRUE),
                           n = n(),
                           Missing = sum(is.na(differ)))
# This is a chunk for your summary statistics and visualisation code
allprices %>% plot(differ ~ categories, data = .,ylab="difference between coles and woolworth", xlab="category of products",
                  col="blue",main="difference of price by categroies",ylim=c(-4,4))
grid()

#caculate the statistical summary of the differences between price of the same products of coles and woolworths across all products
allprices %>% group_by %>% summarise(Min = min(differ,na.rm = TRUE),
                            Max=max(differ,na.rm=TRUE),
                            Q1 = quantile(differ,probs = .25,na.rm = TRUE),
                           Median = median(differ, na.rm = TRUE),
                           Q3 = quantile(differ,probs = .75,na.rm = TRUE),
                           Mean = mean(differ, na.rm = TRUE),
                           SD = sd(differ, na.rm = TRUE),
                           n = n(),
                           Missing = sum(is.na(differ)))
# the boxplot of the difference of price between the same products in coles and woolworths
allprices$differ%>%boxplot(.,ylab="difference", 
                  col="blue",main="difference between the price of coles and woolworth",ylim=c(-4,4))
grid()

plot(differ ~ all_products, data = allprices, ylab="difference", xlab="Length (mm)",
     col="orangered",main="Length by Width")
grid()

From the boxplot and scatter plot of graphs, it can be seen that difference of price between coles and woolworth is slightly and postively above zero, which indicates that the price of the products in coles might be slightly higher than that of in woolworth. The mean of the differences of the 200 obervations for sample is 0.258 with standard deviation of 2.199. when it comes to different categories of these products, it has shown that the means of difference for baby&health, food, fridge and pantry&drinks ares greater than zero with 1.014, 0.133, 0.0803 and 0.250 with standard deviation of 2.723, 1.020, 0.775 3.027 respectivly, which indicates the average price of these products from coles in these categories trend to be greater than that of woolworths. While for the household categories, the average price of difference is negative, -0.185 with standard deviation of 2.374, indicates that price level of woolworths in this household categories might trend to be higher than that of products from coles.

Then the hypothesis test will be conducted to exam if these results are correct.

Hypothesis Test

The analysis conducted a hypothsis test to check if there is a price difference between coles and woolworths for all sample products. Also,the analysis has conducted a hypothsis test to check if there is average price differece of products between coles and woolworth for each of the 5 categories, and if so which supermarket is cheaper.

it test has conducted under the assumption that the variances of prices for coles and woolworths are unequal and the sample is approximately normally distributed.

# check the average price level of differeces bwtween coles and woolwhorths for all products
#we conduct the two-sample tt-tests to check if the average price level of coles is higher than that of woolworths.Cause the two-sample tt-test assume the data are drawn from a normal population distribution.we have a bref look at if the price of products from coles and woolworths are approximately normal. 
price_coles <- allprices$coles %>% qqPlot(dist="norm")

price_woolworths<- allprices$woolworths %>% qqPlot(dist="norm")

#we can see that the normality of the product prices of bothe coles and woolworth do not fit well. While, due to the central limits theory, sample size are 200, which is much larger than 30, so that the average price of the sample still approximately follows the normal distribution. then we can conduct the sample tt-test.
#
#1st step is to check if the variances of price of coles and woolworths are equal.
leveneTest(allprices$coles,allprices$woolworths)
allprices$woolworths coerced to factor.
Levene's Test for Homogeneity of Variance (center = median)
       Df F value   Pr(>F)   
group 107  1.7596 0.002884 **
       92                    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
#by conducting the levene test, the p-value is 0.00288, less than 0.05, the significant level, therefore, there is sufficient evidence to reject null hypothsis and say that the variances for the price of coles and woolworths products are unequal. 
#Null hypothsis HO:σcoles=σwoolworths
#alternative hypothsis: HA:σwoolworths < σcoles  
#based on unequal variance and the average price of woolworths is lower than that of coles, we conduct Welch two sample test with the null hypothsis that the average price level for woolworths is equal to that of coles with the alternative hypothsis that average price of woolworths is lower than that of coles. 
t.test(allprices$woolworths,allprices$coles, var.equal = FALSE, alternative = "less")

    Welch Two Sample t-test

data:  allprices$woolworths and allprices$coles
t = -0.24756, df = 396.56, p-value = 0.4023
alternative hypothesis: true difference in means is less than 0
95 percent confidence interval:
   -Inf 1.4619
sample estimates:
mean of x mean of y 
   7.3166    7.5749 
#it can be seen that p-value = 0.4023, which is greater than significant level of 0.05, therefore, it fails to reject the null hypothsis and concluded that there is insufficient evidence to say the average price of woolworths is less than that of coles.
#we can also check if the two sided hypothsis test to see if the average price of coles and woolworths are different or not.  
t.test(allprices$woolworths,allprices$coles, var.equal = FALSE, alternative = "two.sided")

    Welch Two Sample t-test

data:  allprices$woolworths and allprices$coles
t = -0.24756, df = 396.56, p-value = 0.8046
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 -2.309517  1.792917
sample estimates:
mean of x mean of y 
   7.3166    7.5749 
#then we can check if there is a difference for price of coles and woolworths in each of the five categories.
#check the price difference of coles and woolworths in fridge category
fridge<-allprices%>%filter(categories=="Fridge")
t.test(fridge$woolworths,fridge$coles, var.equal = FALSE, alternative = "two.sided")

    Welch Two Sample t-test

data:  fridge$woolworths and fridge$coles
t = -0.16323, df = 77.753, p-value = 0.8708
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 -1.0590721  0.8985721
sample estimates:
mean of x mean of y 
  5.09825   5.17850 
#check the price difference of coles and woolworths in food category
food<-allprices%>%filter(categories=="food")
t.test(food$woolworths,food$coles, var.equal = FALSE, alternative = "two.sided")

    Welch Two Sample t-test

data:  food$woolworths and food$coles
t = -0.1953, df = 77.996, p-value = 0.8457
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 -1.483186  1.218186
sample estimates:
mean of x mean of y 
  5.41775   5.55025 
#check the price difference of coles and woolworths in baby_health category
baby_health<-allprices%>%filter(categories=="baby_health")
t.test(baby_health$woolworths,baby_health$coles, var.equal = FALSE, alternative = "two.sided")

    Welch Two Sample t-test

data:  baby_health$woolworths and baby_health$coles
t = -0.69668, df = 76.338, p-value = 0.4881
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 -3.910678  1.883678
sample estimates:
mean of x mean of y 
  7.80925   8.82275 
#check the price difference of coles and woolworths in household category
household<-allprices%>%filter(categories=="household")
t.test(household$woolworths,household$coles, var.equal = FALSE, alternative = "two.sided")

    Welch Two Sample t-test

data:  household$woolworths and household$coles
t = 0.20475, df = 77.315, p-value = 0.8383
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 -1.609739  1.978739
sample estimates:
mean of x mean of y 
   6.8080    6.6235 
#check the price difference of coles and woolworths in pantry_drinks category
pantry_drinks<-allprices%>%filter(categories=="pantry_drinks")
t.test(pantry_drinks$woolworths,pantry_drinks$coles, var.equal = FALSE, alternative = "two.sided")

    Welch Two Sample t-test

data:  pantry_drinks$woolworths and pantry_drinks$coles
t = -0.052394, df = 77.728, p-value = 0.9583
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 -9.740156  9.240656
sample estimates:
mean of x mean of y 
 11.44975  11.69950 

Interpretation

it has been test the price difference between coles and woolworths for all sample products and products in each of the 5 catefories.

1.hypothsis test for price difference between coles and woolworths for all sample product prices. Based on unequal variance and the fact that average price of woolworths for all products is lower than that of coles, we conduct Welch two-sample test to check if average price of woolworths is lower than that of coles.

Null hypothsis HO:the average price of products in coles is equal to that of in woolworths Alternative hypothsis H1: the average price of products in woolworths is less than that of in coles. significant level, a = 0.05

p-value = 0.4023 > a=0.05, there is a probability of 40.23% that the null hypothsis is true when we reject null hypothisis.

95% confidence interval (-∞, 1.4619],it has probability of 95% to find the average price difference between coles and woolworths lies in the interval (-∞, 1.4619] which incluedes the sample mean of the difference, 0.2583.

Therefore, there is insufficient evidence to reject the null hypothsis, and it is reasonable to conclude that average price of all the products for coles is equal to the average price of woolworths.

2.hypothsis test for price difference between coles and woolworths for each of the 5 categories Conducting Welch Two Sample t-test to check if there is a difference for price of smaple products between coles and woolworths in each category.

(1)category of fridge, which include fridge&freezer products in the two supermarket. Null hypothsis HO: the average price of products in woolworhs for fridge category is equal to that of in coles Alternative hypothsis H1: the average price of products in woolworths in fridge category is unequal to that of in coles. significant level, a = 0.05

p-value = 0.8708 > a=0.05, there is a probability of 87.08% that the null hypothsis is true when we reject null hypothisis.

95% confidence interval [-1.059, 0.898],it has probability of 95% to find the average price difference for fridge category between coles and woolworths lies in the interval [-1.059, 0.898] which incluedes the sample mean of the difference, 0.08025.

Therefore, there is insufficient evidence to reject the null hypothsis, and it is reasonable to conclude that average product price of woolworths in fridge category is equal to average product price of coles.

(2)category of baby health, which include relative baby health care and adult skin care products in the two supermarket. Null hypothsis HO: the average price of products in woolworhs for baby health category is equal to that of in coles Alternative hypothsis H1: the average price of products in woolworths in baby health category is unequal to that of in coles. significant level, a = 0.05

p-value = 0.4881 > a=0.05, there is a probability of 48.81% that the null hypothsis is true when we reject null hypothisis.

95% confidence interval [-3.911, 1.884],it has probability of 95% to find the average price difference between coles and woolworths in baby health category lies in the interval [-3.911, 1.884], which incluedes the sample mean of the difference, 1.014.

Therefore, there is insufficient evidence to reject the null hypothsis, and it is reasonable to conclude that average product price of woolworths in baby health category is equal to average product price of coles.

(3)category of household, which include relative entertainment clothing, household and pet products in the two supermarket.

Null hypothsis HO: the average price of products in woolworhs for household category is equal to that of in coles Alternative hypothsis H1: the average price of products in woolworths in household category is unequal to that of in coles. significant level, a = 0.05

p-value = 0.8383 > a=0.05, there is a probability of 83.83% that the null hypothsis is true when we reject null hypothisis.

95% confidence interval [-1.610, 1.979],it has probability of 95% to find the average price difference between coles and woolworths in household category lies in the interval [-1.610, 1.979], which incluedes the sample mean of the difference, -0.18450.

Therefore, there is insufficient evidence to reject the null hypothsis, and it is reasonable to conclude that average product price of woolworths in household category is equal to average product price of coles.

(4)category of pantry and drinks, which include relative pantry_drinks products in the two supermarket. Null hypothsis HO: the average price of products in woolworhs for pantry and drinks category is equal to that of in coles Alternative hypothsis H1: the average price of products in woolworths in pantry and drinks category is unequal to that of in coles. significant level, a = 0.05

p-value =0.9583 > a=0.05, there is a probability of 95.83% that the null hypothsis is true when we reject null hypothisis.

95% confidence interval [-9.740, 9.241],it has probability of 95% to find the average price difference between coles and woolworths in pantry and drinks category lies in the interval [-9.740, 9.241], which incluedes the sample mean of the difference, 0.24975.

Therefore, there is insufficient evidence to reject the null hypothsis, and it is reasonable to conclude that average product price of woolworths in pantry and drinks category is equal to average product price of coles

(5)category of food, which include fruit, vegetables, bakery, meat and seafood in the two supermarket. Null hypothsis HO: the average price of products in woolworhs for food category is equal to that of in coles Alternative hypothsis H1: the average price of products in woolworths in foods category is unequal to that of in coles. significant level, a = 0.05

p-value =0.8457 > a=0.05, there is a probability of 84.57% that the null hypothsis is true when we reject null hypothisis.

95% confidence interval [-1.483, 1.218],it has probability of 95% to find the average price difference between coles and woolworths in food category lies in the interval [-1.483, 1.218], which incluedes the sample mean of the difference, 0.13250.

Therefore, there is insufficient evidence to reject the null hypothsis, and it is reasonable to conclude that average product price of woolworths in food category is equal to average product price of coles

In summary, there is no significant difference in average price between coles and woolworths for both all sample products and the products in each of the 5 categories. And this analysis support that fact that the average price of cole and woolworths are not different in each categories and all products as a whole.

Discussion

There are some limitations. First, for test the price difference for each sample, the sample size for each category is 40, which is just higher than 30 obeservations. The accuracy of the test could be improved by using larger sample size with more observations. Secondly,the classification of category could be more specific. In this analysis, the classfication are relatively rough that all the products for woolworths and coles are only categorised into 5 categories, actually products can be categorised into more explicit categories, which could help to have a more accuracy compare and overview the price levels in each categories between the two supermarket.
Thirdly,from the normality quality view in statistic summary in this report, it can be seen that there are some points outlying and deviate relatively far from the 95% of normality confident intervals, which might probably make the test to be less accuracy. These outlier is generated by some extreme high price differences. This could be reduced by properiate categoration, because the price difference in the same category are more likely to be in the same level of price difference.Like the price difference in bakery are relately small, however, price difference in alcohol products are relatively large.

LS0tCnRpdGxlOiAiTUFUSDEzMjQgQXNzaWdubWVudCAzIgpzdWJ0aXRsZTogIlN1cGVybWFya2V0IFByaWNlIFdhcnMiCm91dHB1dDogaHRtbF9ub3RlYm9vawotLS0KCiMjIEdyb3VwL0luZGl2aWR1YWwgRGV0YWlscwoKKiBTdHVkZW50IE5hbWU6RmFuZ3dlbiBEYW5nCiAgSUQ6MzY2NDc5MwoKIyMgRXhlY3V0aXZlIFN0YXRlbWVudApJbiB0aGlzIGludmVzdGlnYXRpb24sIGl0IHdpbGwgbWFpbmx5IGZvY3VzIG9uIGFuYWx5c2luZyBpZiB0aGVyZSBpcyBhIHN0YXRpc3RpY2FsbHkgc2lnbmlmaWNhbnQgYXZlcmFnZSBwcmljZSBkaWZmZXJlbmNlIGJldHdlZW4gY29sZXMgYW5kIHdvb2x3b3J0aHMuIFRoZSByZXBvcnQgd2lsbCBhbmFseXNlIHRoZSBhdmVyYWdlIHByaWNlIGRpZmZlcmVjZSBmb3IgYWxsIHNhbXBsZSBwcm9kdWN0cyBvZiB0aGUgdHdvIHN1cGVybWFya2V0cywgYXMgd2VsbCBhcyB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSB0d28gc3VwZXJtYWtldHMgaW4gZWFjaCBjYXRlZ29yeSBhbmQgaWYgc28gd2hpY2ggc3VwZXJtYWtldCBpcyBjaGVhcGVyLiAKClRoZSBzYW1wbGUgb2YgdGhlIHRlc3QgaW5jbHVkZXMgaW5mb3JtYXRpb24gb24gMjAwIHByb2R1Y3RzIG9ic2VydmF0aW9ucyB3aXRoIHByb2R1Y3QgbmFtZSwgcHJvZHVjdCBjYXRlZ29yaWVzIGFuZCBwcm9kdWN0IHByaWNlcyBmb3IgYm90aCBjb2xlcyBhbmQgd29vbHdvcnRocyBzdXBlcm1hcmtldHMuIFRoZSBnb3JjZXJ5Y29wIHdlYnNpdGUgd2FzIHVzZWQgdG8gY29sbGVjdCB0aGUgZGF0YSwgd2hpY2ggZW5zdXJlcyBhbmQgcHJvdmlkZSBwcmljZXMgb2Ygc2FtZSBwcm9kdWN0IGZyb20gY29sZXMgYW5kIHdvb2x3b3J0aHMgKGh0dHA6Ly93d3cuZ3JvY2VyeWNvcC5jb20uYXUvcHJvZHVjdHMvY2F0ZWdvcnkvZnJpZGdlP3BhZ2U9NykuCgpGb3IgdGhlIGNhdGVncm9yaXphdGlvbiwgdGhlIDIwMCBwcm9kdWN0cyBhcmUgY2F0ZWdvcml6ZWQgaW50byA1IGNhdGVnb3JpZXMgd2l0aCBlYWNoIGNhdGVnb3J5IG9mIDQwIG9ic2VydmF0aW9ucy4gVGhlIGdvcmNlcnkgd2Vic2l0ZSBiYXNpY2FsbHkgY2F0ZWdvcmllcyBhbGwgcHJvZHVjdHMgaW4gY29sZXMgYW5kIHdvb2x3b3J0aCBpbnRvIDEwIGNhdGVncm9pZXMsIGZyaWRnZSwgYmFrZXJ5LGZydWl0JnZlZ2V0YWJsZXMsIHBhbnRyeSwgZnJlZXplciwgYmFieSZoZWFsdGgmYmVhdXR5LCBtZWF0JnNlYWZvb2QsRW50ZXJ0YWlubWVudCAmIEludGVybmF0aW9uYWwgRm9vZCwgY2xvc2luZyZob3VzZWhvbGQmcGV0IGFuZCBkcmlua3MmdG9iYWNjby5UaGlzIHJlcG9ydCBjb21iaW5lIHRoZXNlIDEwIGxpc3RlZCBvbiB3ZWJzaXRlIGludG8gNSBjYXRyZ29yaWVzLCB0aGUgZnJpZGdlIChmcmlkZ2UmZnJlZXplciksIGZvb2QoZnJ1aXQmdmVnZXRhYmxlcyxtZWF0JnNlYWZvb2QsYmFrZXJ5KSwgaG91c2Vob2xkIChFbnRlcnRhaW5tZW50ICYgSW50ZXJuYXRpb25hbCBGb29kLCBjbG9zaW5nJmhvdXNlaG9sZCZwZXQpLGJhYnkgaGVhbHRoIChiYWJ5JmhlYWx0aCZiZWF1dHksYmFrZXJ5KSBhbmQgcGFudHJ5JmRyaW5rcyhwYW50cnkmZHJpbmtzJnRvYmFjY28pLiBFYWNoIG9mIHRoZSA1IGNhdGVnb3JpZXMgY29udGFpbnMgMiBjYXRlZ3JvcmllcyBvZiBwcm9kdWN0cyBsaXN0ZWQgb24gdGhlIGdvcmNlcnljb3Agd2Vic2l0ZXMgYW5kIGVhY2ggb2YgdGhlIDEwIHdlYnNpdGUgY2F0ZWdyb3JpZXMgYXJlIHNlbGVjdGVkIDIwIHByb2R1Y3RzIHRvIGZvcm0gdGhlIHRvdGFsIDIwMCBzYW1wbGUgb2JzZXJ2YXRpb25zLiAKClRvIGVuc3VyZSB0aGUgZGF0YSBhcmUgY29sbGVjdGVkIHJhbmRvbWx5LCByZXNlYXJjaGVyIHJhbmRvbWx5IHNlbGVjdCAxIHRvIDMgcHJvZHVjdHMgdGhhdCBjb250YWlucyBwcmljZXMgaW5mb3JtYXRpb24gZm9yIGJvdGggY29sZXMgYW5kIHdvb2x3b3J0aHMgb24gZWFjaCBwYWdlIG9mIHdlYnNpdGVzIHRvIGd1YXJhbnRlZSB0aGF0IHNhbXBsZSBjb3VsZCBjb250YWlucyBkaWZmZXJlbnQgcHJvZHVjdHMgYXMgcG9zc2libGUgYW5kIG1ha2UgdGhlIHNhbXBsZSB0byBiZSBtb3JlIHJlcHJlc2VudGF0aXZlLiAKCkFmdGVyIGZpbmlzaGluZyAgdGhlIGh5cG90aHNpcyB0ZXN0LCB0aGUgcmVwb3J0IGhhcyBmb3VuZCB0aGF0IHRoZXJlIGlzIG5vIHNpZ25pZmljYW50IGRpZmZlcmVuY2UgaW4gYXZlcmFnZSBwcmljZSBiZXR3ZWVuIGNvbGVzIGFuZCB3b29sd29ydGhzIGZvciBib3RoIGFsbCBzYW1wbGUgcHJvZHVjdHMgYW5kIHRoZSBwcm9kdWN0cyBpbiBlYWNoIG9mIHRoZSA1IGNhdGVnb3JpZXMuIEFuZCB0aGlzIGFuYWx5c2lzIHN1cHBvcnQgdGhhdCBmYWN0IHRoYXQgdGhlIGF2ZXJhZ2UgcHJpY2Ugb2YgY29sZSBhbmQgd29vbHdvcnRocyBhcmUgbm90IGRpZmZlcmVudCBpbiBlYWNoIGNhdGVnb3JpZXMgYW5kIGFsbCBwcm9kdWN0cyBhcyBhIHdob2xlLgogCgojIyBMb2FkIFBhY2thZ2VzIGFuZCBEYXRhCgpgYGB7cn0KIyBUaGlzIGlzIGEgY2h1bmsgd2hlcmUgeW91IGNhbiBsb2FkIHRoZSBuZWNlc3NhcnkgZGF0YSBhbmQgcGFja2FnZXMgcmVxdWlyZWQgdG8gcmVwcm9kdWNlIHRoZSByZXBvcnQKcHJpY2U8LWxpYnJhcnkocmVhZHIpCmFsbHByaWNlcyA8LSByZWFkLmNzdigifi9EZXNrdG9wL2FsbHByaWNlcy5jc3YiKQppbnN0YWxsLnBhY2thZ2VzKCJtYWdyaXR0ciIpCmluc3RhbGwucGFja2FnZXMoImRwbHlyIikKaW5zdGFsbC5wYWNrYWdlcygiY2FyIikKCmxpYnJhcnkoIm1hZ3JpdHRyIiwgbGliLmxvYz0iL0xpYnJhcnkvRnJhbWV3b3Jrcy9SLmZyYW1ld29yay9WZXJzaW9ucy8zLjQvUmVzb3VyY2VzL2xpYnJhcnkiKQpsaWJyYXJ5KCJnZ3Bsb3QyIiwgbGliLmxvYz0iL0xpYnJhcnkvRnJhbWV3b3Jrcy9SLmZyYW1ld29yay9WZXJzaW9ucy8zLjQvUmVzb3VyY2VzL2xpYnJhcnkiKQpsaWJyYXJ5KCJkcGx5ciIsIGxpYi5sb2M9Ii9MaWJyYXJ5L0ZyYW1ld29ya3MvUi5mcmFtZXdvcmsvVmVyc2lvbnMvMy40L1Jlc291cmNlcy9saWJyYXJ5IikKbGlicmFyeSgiY2FyIiwgbGliLmxvYz0iL0xpYnJhcnkvRnJhbWV3b3Jrcy9SLmZyYW1ld29yay9WZXJzaW9ucy8zLjQvUmVzb3VyY2VzL2xpYnJhcnkiKQojIFlvdSBzaG91bGQgYWxzbyBpbmNsdWRlIHlvdXIgY29kZSByZXF1aXJlZCB0byBwcmVwYXJlIHlvdXIgZGF0YSBmb3IgYW5hbHlzaXMuIApgYGAKCiMjIFN1bW1hcnkgU3RhdGlzdGljcwoKYGBge3J9CmFsbHByaWNlcyAlPiUgZ3JvdXBfYnkoY2F0ZWdvcmllcykgJT4lIHN1bW1hcmlzZShNaW4gPSBtaW4oY29sZXMsbmEucm0gPSBUUlVFKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1heD1tYXgoY29sZXMsbmEucm09VFJVRSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBRMSA9IHF1YW50aWxlKGNvbGVzLHByb2JzID0gLjI1LG5hLnJtID0gVFJVRSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhbiA9IG1lZGlhbihjb2xlcywgbmEucm0gPSBUUlVFKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgUTMgPSBxdWFudGlsZShjb2xlcyxwcm9icyA9IC43NSxuYS5ybSA9IFRSVUUpLAogICAgICAgICAgICAgICAgICAgICAgICAgICBNZWFuID0gbWVhbihjb2xlcywgbmEucm0gPSBUUlVFKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgU0QgPSBzZChjb2xlcywgbmEucm0gPSBUUlVFKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgbiA9IG4oKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgTWlzc2luZyA9IHN1bShpcy5uYShjb2xlcykpKQoKYWxscHJpY2VzICU+JSBncm91cF9ieShjYXRlZ29yaWVzKSAlPiUgc3VtbWFyaXNlKE1pbiA9IG1pbih3b29sd29ydGhzLG5hLnJtID0gVFJVRSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXg9bWF4KHdvb2x3b3J0aHMsbmEucm09VFJVRSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBRMSA9IHF1YW50aWxlKHdvb2x3b3J0aHMscHJvYnMgPSAuMjUsbmEucm0gPSBUUlVFKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFuID0gbWVkaWFuKHdvb2x3b3J0aHMsIG5hLnJtID0gVFJVRSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFEzID0gcXVhbnRpbGUod29vbHdvcnRocyxwcm9icyA9IC43NSxuYS5ybSA9IFRSVUUpLAogICAgICAgICAgICAgICAgICAgICAgICAgICBNZWFuID0gbWVhbih3b29sd29ydGhzLCBuYS5ybSA9IFRSVUUpLAogICAgICAgICAgICAgICAgICAgICAgICAgICBTRCA9IHNkKHdvb2x3b3J0aHMsIG5hLnJtID0gVFJVRSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgIG4gPSBuKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgIE1pc3NpbmcgPSBzdW0oaXMubmEoY29sZXMpKSkKCiNjcmVhdGUgYSB2YXJpYWJsZSBvZiB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIGNvbGVzIGFuZCB3b29sd29ydGhzCmFsbHByaWNlczwtYWxscHJpY2VzJT4lbXV0YXRlKGRpZmZlcj1jb2xlcyAtIHdvb2x3b3J0aHMpCgojY2FjdWxhdGUgdGhlIHN0YXRpc3RpY2FsIHN1bW1hcnkgb2YgdGhlIGRpZmZlcmVuY2VzIGJldHdlZW4gcHJpY2Ugb2YgdGhlIHNhbWUgcHJvZHVjdHMgb2YgY29sZXMgYW5kIHdvb2x3b3J0aHMgaW4gZGlmZmVyZW50IGNhdGVnb3JpZXMuCmFsbHByaWNlcyAlPiUgZ3JvdXBfYnkoY2F0ZWdvcmllcykgJT4lIHN1bW1hcmlzZShNaW4gPSBtaW4oZGlmZmVyLG5hLnJtID0gVFJVRSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXg9bWF4KGRpZmZlcixuYS5ybT1UUlVFKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFExID0gcXVhbnRpbGUoZGlmZmVyLHByb2JzID0gLjI1LG5hLnJtID0gVFJVRSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhbiA9IG1lZGlhbihkaWZmZXIsIG5hLnJtID0gVFJVRSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFEzID0gcXVhbnRpbGUoZGlmZmVyLHByb2JzID0gLjc1LG5hLnJtID0gVFJVRSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lYW4gPSBtZWFuKGRpZmZlciwgbmEucm0gPSBUUlVFKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgU0QgPSBzZChkaWZmZXIsIG5hLnJtID0gVFJVRSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgIG4gPSBuKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgIE1pc3NpbmcgPSBzdW0oaXMubmEoZGlmZmVyKSkpCiMgVGhpcyBpcyBhIGNodW5rIGZvciB5b3VyIHN1bW1hcnkgc3RhdGlzdGljcyBhbmQgdmlzdWFsaXNhdGlvbiBjb2RlCmFsbHByaWNlcyAlPiUgcGxvdChkaWZmZXIgfiBjYXRlZ29yaWVzLCBkYXRhID0gLix5bGFiPSJkaWZmZXJlbmNlIGJldHdlZW4gY29sZXMgYW5kIHdvb2x3b3J0aCIsIHhsYWI9ImNhdGVnb3J5IG9mIHByb2R1Y3RzIiwKICAgICAgICAgICAgICAgICAgY29sPSJibHVlIixtYWluPSJkaWZmZXJlbmNlIG9mIHByaWNlIGJ5IGNhdGVncm9pZXMiLHlsaW09YygtNCw0KSkKZ3JpZCgpCgojY2FjdWxhdGUgdGhlIHN0YXRpc3RpY2FsIHN1bW1hcnkgb2YgdGhlIGRpZmZlcmVuY2VzIGJldHdlZW4gcHJpY2Ugb2YgdGhlIHNhbWUgcHJvZHVjdHMgb2YgY29sZXMgYW5kIHdvb2x3b3J0aHMgYWNyb3NzIGFsbCBwcm9kdWN0cwphbGxwcmljZXMgJT4lIGdyb3VwX2J5ICU+JSBzdW1tYXJpc2UoTWluID0gbWluKGRpZmZlcixuYS5ybSA9IFRSVUUpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgTWF4PW1heChkaWZmZXIsbmEucm09VFJVRSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBRMSA9IHF1YW50aWxlKGRpZmZlcixwcm9icyA9IC4yNSxuYS5ybSA9IFRSVUUpLAogICAgICAgICAgICAgICAgICAgICAgICAgICBNZWRpYW4gPSBtZWRpYW4oZGlmZmVyLCBuYS5ybSA9IFRSVUUpLAogICAgICAgICAgICAgICAgICAgICAgICAgICBRMyA9IHF1YW50aWxlKGRpZmZlcixwcm9icyA9IC43NSxuYS5ybSA9IFRSVUUpLAogICAgICAgICAgICAgICAgICAgICAgICAgICBNZWFuID0gbWVhbihkaWZmZXIsIG5hLnJtID0gVFJVRSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFNEID0gc2QoZGlmZmVyLCBuYS5ybSA9IFRSVUUpLAogICAgICAgICAgICAgICAgICAgICAgICAgICBuID0gbigpLAogICAgICAgICAgICAgICAgICAgICAgICAgICBNaXNzaW5nID0gc3VtKGlzLm5hKGRpZmZlcikpKQoKIyB0aGUgYm94cGxvdCBvZiB0aGUgZGlmZmVyZW5jZSBvZiBwcmljZSBiZXR3ZWVuIHRoZSBzYW1lIHByb2R1Y3RzIGluIGNvbGVzIGFuZCB3b29sd29ydGhzCmFsbHByaWNlcyRkaWZmZXIlPiVib3hwbG90KC4seWxhYj0iZGlmZmVyZW5jZSIsIAogICAgICAgICAgICAgICAgICBjb2w9ImJsdWUiLG1haW49ImRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgcHJpY2Ugb2YgY29sZXMgYW5kIHdvb2x3b3J0aCIseWxpbT1jKC00LDQpKQpncmlkKCkKCgpwbG90KGRpZmZlciB+IGFsbF9wcm9kdWN0cywgZGF0YSA9IGFsbHByaWNlcywgeWxhYj0iZGlmZmVyZW5jZSIsIHhsYWI9Ikxlbmd0aCAobW0pIiwKICAgICBjb2w9Im9yYW5nZXJlZCIsbWFpbj0iTGVuZ3RoIGJ5IFdpZHRoIikKZ3JpZCgpCgoKYGBgCkZyb20gdGhlIGJveHBsb3QgYW5kIHNjYXR0ZXIgcGxvdCBvZiBncmFwaHMsIGl0IGNhbiBiZSBzZWVuIHRoYXQgZGlmZmVyZW5jZSBvZiBwcmljZSBiZXR3ZWVuIGNvbGVzIGFuZCB3b29sd29ydGggaXMgc2xpZ2h0bHkgYW5kIHBvc3RpdmVseSBhYm92ZSB6ZXJvLCB3aGljaCBpbmRpY2F0ZXMgdGhhdCB0aGUgcHJpY2Ugb2YgdGhlIHByb2R1Y3RzIGluIGNvbGVzIG1pZ2h0IGJlIHNsaWdodGx5IGhpZ2hlciB0aGFuIHRoYXQgb2YgaW4gd29vbHdvcnRoLiBUaGUgbWVhbiBvZiB0aGUgZGlmZmVyZW5jZXMgb2YgdGhlIDIwMCBvYmVydmF0aW9ucyBmb3Igc2FtcGxlIGlzIDAuMjU4IHdpdGggc3RhbmRhcmQgZGV2aWF0aW9uIG9mIDIuMTk5LiB3aGVuIGl0IGNvbWVzIHRvIGRpZmZlcmVudCBjYXRlZ29yaWVzIG9mIHRoZXNlIHByb2R1Y3RzLCBpdCBoYXMgc2hvd24gdGhhdCB0aGUgbWVhbnMgb2YgZGlmZmVyZW5jZSBmb3IgYmFieSZoZWFsdGgsIGZvb2QsIGZyaWRnZSBhbmQgcGFudHJ5JmRyaW5rcyBhcmVzIGdyZWF0ZXIgdGhhbiB6ZXJvIHdpdGggMS4wMTQsIDAuMTMzLCAwLjA4MDMgYW5kIDAuMjUwIHdpdGggc3RhbmRhcmQgZGV2aWF0aW9uIG9mIDIuNzIzLCAxLjAyMCwgMC43NzUgMy4wMjcgcmVzcGVjdGl2bHksIHdoaWNoIGluZGljYXRlcyB0aGUgYXZlcmFnZSBwcmljZSBvZiB0aGVzZSBwcm9kdWN0cyBmcm9tIGNvbGVzIGluIHRoZXNlIGNhdGVnb3JpZXMgdHJlbmQgdG8gYmUgZ3JlYXRlciB0aGFuIHRoYXQgb2Ygd29vbHdvcnRocy4gV2hpbGUgZm9yIHRoZSBob3VzZWhvbGQgY2F0ZWdvcmllcywgdGhlIGF2ZXJhZ2UgcHJpY2Ugb2YgZGlmZmVyZW5jZSBpcyBuZWdhdGl2ZSwgLTAuMTg1IHdpdGggc3RhbmRhcmQgZGV2aWF0aW9uIG9mIDIuMzc0LCBpbmRpY2F0ZXMgdGhhdCBwcmljZSBsZXZlbCBvZiB3b29sd29ydGhzIGluIHRoaXMgaG91c2Vob2xkIGNhdGVnb3JpZXMgbWlnaHQgdHJlbmQgdG8gYmUgaGlnaGVyIHRoYW4gdGhhdCBvZiBwcm9kdWN0cyBmcm9tIGNvbGVzLgoKVGhlbiB0aGUgaHlwb3RoZXNpcyB0ZXN0IHdpbGwgYmUgY29uZHVjdGVkIHRvIGV4YW0gaWYgdGhlc2UgcmVzdWx0cyBhcmUgY29ycmVjdC4gCgoKIyMgSHlwb3RoZXNpcyBUZXN0IAoKVGhlIGFuYWx5c2lzIGNvbmR1Y3RlZCBhIGh5cG90aHNpcyB0ZXN0IHRvIGNoZWNrIGlmIHRoZXJlIGlzIGEgcHJpY2UgZGlmZmVyZW5jZSBiZXR3ZWVuIGNvbGVzIGFuZCB3b29sd29ydGhzIGZvciBhbGwgc2FtcGxlIHByb2R1Y3RzLiAKQWxzbyx0aGUgYW5hbHlzaXMgaGFzIGNvbmR1Y3RlZCBhIGh5cG90aHNpcyB0ZXN0IHRvIGNoZWNrIGlmIHRoZXJlIGlzIGF2ZXJhZ2UgcHJpY2UgZGlmZmVyZWNlIG9mIHByb2R1Y3RzIGJldHdlZW4gY29sZXMgYW5kIHdvb2x3b3J0aCBmb3IgZWFjaCBvZiB0aGUgNSBjYXRlZ29yaWVzLCBhbmQgaWYgc28gd2hpY2ggc3VwZXJtYXJrZXQgaXMgY2hlYXBlci4gCgppdCB0ZXN0IGhhcyBjb25kdWN0ZWQgdW5kZXIgdGhlIGFzc3VtcHRpb24gdGhhdCB0aGUgdmFyaWFuY2VzIG9mIHByaWNlcyBmb3IgY29sZXMgYW5kIHdvb2x3b3J0aHMgYXJlIHVuZXF1YWwgYW5kIHRoZSBzYW1wbGUgaXMgYXBwcm94aW1hdGVseSBub3JtYWxseSBkaXN0cmlidXRlZC4gIAoKYGBge3J9CiMgY2hlY2sgdGhlIGF2ZXJhZ2UgcHJpY2UgbGV2ZWwgb2YgZGlmZmVyZWNlcyBid3R3ZWVuIGNvbGVzIGFuZCB3b29sd2hvcnRocyBmb3IgYWxsIHByb2R1Y3RzCiN3ZSBjb25kdWN0IHRoZSB0d28tc2FtcGxlIHR0LXRlc3RzIHRvIGNoZWNrIGlmIHRoZSBhdmVyYWdlIHByaWNlIGxldmVsIG9mIGNvbGVzIGlzIGhpZ2hlciB0aGFuIHRoYXQgb2Ygd29vbHdvcnRocy5DYXVzZSB0aGUgdHdvLXNhbXBsZSB0dC10ZXN0IGFzc3VtZSB0aGUgZGF0YSBhcmUgZHJhd24gZnJvbSBhIG5vcm1hbCBwb3B1bGF0aW9uIGRpc3RyaWJ1dGlvbi53ZSBoYXZlIGEgYnJlZiBsb29rIGF0IGlmIHRoZSBwcmljZSBvZiBwcm9kdWN0cyBmcm9tIGNvbGVzIGFuZCB3b29sd29ydGhzIGFyZSBhcHByb3hpbWF0ZWx5IG5vcm1hbC4gCnByaWNlX2NvbGVzIDwtIGFsbHByaWNlcyRjb2xlcyAlPiUgcXFQbG90KGRpc3Q9Im5vcm0iKQpwcmljZV93b29sd29ydGhzPC0gYWxscHJpY2VzJHdvb2x3b3J0aHMgJT4lIHFxUGxvdChkaXN0PSJub3JtIikKCiN3ZSBjYW4gc2VlIHRoYXQgdGhlIG5vcm1hbGl0eSBvZiB0aGUgcHJvZHVjdCBwcmljZXMgb2YgYm90aGUgY29sZXMgYW5kIHdvb2x3b3J0aCBkbyBub3QgZml0IHdlbGwuIFdoaWxlLCBkdWUgdG8gdGhlIGNlbnRyYWwgbGltaXRzIHRoZW9yeSwgc2FtcGxlIHNpemUgYXJlIDIwMCwgd2hpY2ggaXMgbXVjaCBsYXJnZXIgdGhhbiAzMCwgc28gdGhhdCB0aGUgYXZlcmFnZSBwcmljZSBvZiB0aGUgc2FtcGxlIHN0aWxsIGFwcHJveGltYXRlbHkgZm9sbG93cyB0aGUgbm9ybWFsIGRpc3RyaWJ1dGlvbi4gdGhlbiB3ZSBjYW4gY29uZHVjdCB0aGUgc2FtcGxlIHR0LXRlc3QuCgoKIwojMXN0IHN0ZXAgaXMgdG8gY2hlY2sgaWYgdGhlIHZhcmlhbmNlcyBvZiBwcmljZSBvZiBjb2xlcyBhbmQgd29vbHdvcnRocyBhcmUgZXF1YWwuCmxldmVuZVRlc3QoYWxscHJpY2VzJGNvbGVzLGFsbHByaWNlcyR3b29sd29ydGhzKQoKI2J5IGNvbmR1Y3RpbmcgdGhlIGxldmVuZSB0ZXN0LCB0aGUgcC12YWx1ZSBpcyAwLjAwMjg4LCBsZXNzIHRoYW4gMC4wNSwgdGhlIHNpZ25pZmljYW50IGxldmVsLCB0aGVyZWZvcmUsIHRoZXJlIGlzIHN1ZmZpY2llbnQgZXZpZGVuY2UgdG8gcmVqZWN0IG51bGwgaHlwb3Roc2lzIGFuZCBzYXkgdGhhdCB0aGUgdmFyaWFuY2VzIGZvciB0aGUgcHJpY2Ugb2YgY29sZXMgYW5kIHdvb2x3b3J0aHMgcHJvZHVjdHMgYXJlIHVuZXF1YWwuIAojTnVsbCBoeXBvdGhzaXMgSE86z4Njb2xlcz3Pg3dvb2x3b3J0aHMKI2FsdGVybmF0aXZlIGh5cG90aHNpczogSEE6z4N3b29sd29ydGhzIDwgz4Njb2xlcyAgCgojYmFzZWQgb24gdW5lcXVhbCB2YXJpYW5jZSBhbmQgdGhlIGF2ZXJhZ2UgcHJpY2Ugb2Ygd29vbHdvcnRocyBpcyBsb3dlciB0aGFuIHRoYXQgb2YgY29sZXMsIHdlIGNvbmR1Y3QgV2VsY2ggdHdvIHNhbXBsZSB0ZXN0IHdpdGggdGhlIG51bGwgaHlwb3Roc2lzIHRoYXQgdGhlIGF2ZXJhZ2UgcHJpY2UgbGV2ZWwgZm9yIHdvb2x3b3J0aHMgaXMgZXF1YWwgdG8gdGhhdCBvZiBjb2xlcyB3aXRoIHRoZSBhbHRlcm5hdGl2ZSBoeXBvdGhzaXMgdGhhdCBhdmVyYWdlIHByaWNlIG9mIHdvb2x3b3J0aHMgaXMgbG93ZXIgdGhhbiB0aGF0IG9mIGNvbGVzLiAKCgp0LnRlc3QoYWxscHJpY2VzJHdvb2x3b3J0aHMsYWxscHJpY2VzJGNvbGVzLCB2YXIuZXF1YWwgPSBGQUxTRSwgYWx0ZXJuYXRpdmUgPSAibGVzcyIpCgojaXQgY2FuIGJlIHNlZW4gdGhhdCBwLXZhbHVlID0gMC40MDIzLCB3aGljaCBpcyBncmVhdGVyIHRoYW4gc2lnbmlmaWNhbnQgbGV2ZWwgb2YgMC4wNSwgdGhlcmVmb3JlLCBpdCBmYWlscyB0byByZWplY3QgdGhlIG51bGwgaHlwb3Roc2lzIGFuZCBjb25jbHVkZWQgdGhhdCB0aGVyZSBpcyBpbnN1ZmZpY2llbnQgZXZpZGVuY2UgdG8gc2F5IHRoZSBhdmVyYWdlIHByaWNlIG9mIHdvb2x3b3J0aHMgaXMgbGVzcyB0aGFuIHRoYXQgb2YgY29sZXMuCgojd2UgY2FuIGFsc28gY2hlY2sgaWYgdGhlIHR3byBzaWRlZCBoeXBvdGhzaXMgdGVzdCB0byBzZWUgaWYgdGhlIGF2ZXJhZ2UgcHJpY2Ugb2YgY29sZXMgYW5kIHdvb2x3b3J0aHMgYXJlIGRpZmZlcmVudCBvciBub3QuICAKdC50ZXN0KGFsbHByaWNlcyR3b29sd29ydGhzLGFsbHByaWNlcyRjb2xlcywgdmFyLmVxdWFsID0gRkFMU0UsIGFsdGVybmF0aXZlID0gInR3by5zaWRlZCIpCgoKI3RoZW4gd2UgY2FuIGNoZWNrIGlmIHRoZXJlIGlzIGEgZGlmZmVyZW5jZSBmb3IgcHJpY2Ugb2YgY29sZXMgYW5kIHdvb2x3b3J0aHMgaW4gZWFjaCBvZiB0aGUgZml2ZSBjYXRlZ29yaWVzLgoKI2NoZWNrIHRoZSBwcmljZSBkaWZmZXJlbmNlIG9mIGNvbGVzIGFuZCB3b29sd29ydGhzIGluIGZyaWRnZSBjYXRlZ29yeQpmcmlkZ2U8LWFsbHByaWNlcyU+JWZpbHRlcihjYXRlZ29yaWVzPT0iRnJpZGdlIikKCnQudGVzdChmcmlkZ2Ukd29vbHdvcnRocyxmcmlkZ2UkY29sZXMsIHZhci5lcXVhbCA9IEZBTFNFLCBhbHRlcm5hdGl2ZSA9ICJ0d28uc2lkZWQiKQoKI2NoZWNrIHRoZSBwcmljZSBkaWZmZXJlbmNlIG9mIGNvbGVzIGFuZCB3b29sd29ydGhzIGluIGZvb2QgY2F0ZWdvcnkKZm9vZDwtYWxscHJpY2VzJT4lZmlsdGVyKGNhdGVnb3JpZXM9PSJmb29kIikKdC50ZXN0KGZvb2Qkd29vbHdvcnRocyxmb29kJGNvbGVzLCB2YXIuZXF1YWwgPSBGQUxTRSwgYWx0ZXJuYXRpdmUgPSAidHdvLnNpZGVkIikKCiNjaGVjayB0aGUgcHJpY2UgZGlmZmVyZW5jZSBvZiBjb2xlcyBhbmQgd29vbHdvcnRocyBpbiBiYWJ5X2hlYWx0aCBjYXRlZ29yeQpiYWJ5X2hlYWx0aDwtYWxscHJpY2VzJT4lZmlsdGVyKGNhdGVnb3JpZXM9PSJiYWJ5X2hlYWx0aCIpCnQudGVzdChiYWJ5X2hlYWx0aCR3b29sd29ydGhzLGJhYnlfaGVhbHRoJGNvbGVzLCB2YXIuZXF1YWwgPSBGQUxTRSwgYWx0ZXJuYXRpdmUgPSAidHdvLnNpZGVkIikKCiNjaGVjayB0aGUgcHJpY2UgZGlmZmVyZW5jZSBvZiBjb2xlcyBhbmQgd29vbHdvcnRocyBpbiBob3VzZWhvbGQgY2F0ZWdvcnkKaG91c2Vob2xkPC1hbGxwcmljZXMlPiVmaWx0ZXIoY2F0ZWdvcmllcz09ImhvdXNlaG9sZCIpCnQudGVzdChob3VzZWhvbGQkd29vbHdvcnRocyxob3VzZWhvbGQkY29sZXMsIHZhci5lcXVhbCA9IEZBTFNFLCBhbHRlcm5hdGl2ZSA9ICJ0d28uc2lkZWQiKQoKI2NoZWNrIHRoZSBwcmljZSBkaWZmZXJlbmNlIG9mIGNvbGVzIGFuZCB3b29sd29ydGhzIGluIHBhbnRyeV9kcmlua3MgY2F0ZWdvcnkKcGFudHJ5X2RyaW5rczwtYWxscHJpY2VzJT4lZmlsdGVyKGNhdGVnb3JpZXM9PSJwYW50cnlfZHJpbmtzIikKdC50ZXN0KHBhbnRyeV9kcmlua3Mkd29vbHdvcnRocyxwYW50cnlfZHJpbmtzJGNvbGVzLCB2YXIuZXF1YWwgPSBGQUxTRSwgYWx0ZXJuYXRpdmUgPSAidHdvLnNpZGVkIikKCmBgYAoKCiMjIEludGVycHJldGF0aW9uCml0IGhhcyBiZWVuIHRlc3QgdGhlIHByaWNlIGRpZmZlcmVuY2UgYmV0d2VlbiBjb2xlcyBhbmQgd29vbHdvcnRocyBmb3IgYWxsIHNhbXBsZSBwcm9kdWN0cyBhbmQgcHJvZHVjdHMgaW4gZWFjaCBvZiB0aGUgNSBjYXRlZm9yaWVzLiAKCjEuaHlwb3Roc2lzIHRlc3QgZm9yIHByaWNlIGRpZmZlcmVuY2UgYmV0d2VlbiBjb2xlcyBhbmQgd29vbHdvcnRocyBmb3IgYWxsIHNhbXBsZSBwcm9kdWN0IHByaWNlcy4KQmFzZWQgb24gdW5lcXVhbCB2YXJpYW5jZSBhbmQgdGhlIGZhY3QgdGhhdCBhdmVyYWdlIHByaWNlIG9mIHdvb2x3b3J0aHMgZm9yIGFsbCBwcm9kdWN0cyBpcyBsb3dlciB0aGFuIHRoYXQgb2YgY29sZXMsIHdlIGNvbmR1Y3QgV2VsY2ggdHdvLXNhbXBsZSB0ZXN0IHRvIGNoZWNrIGlmIGF2ZXJhZ2UgcHJpY2Ugb2Ygd29vbHdvcnRocyBpcyBsb3dlciB0aGFuIHRoYXQgb2YgY29sZXMuCgpOdWxsIGh5cG90aHNpcyBITzp0aGUgYXZlcmFnZSBwcmljZSBvZiBwcm9kdWN0cyBpbiBjb2xlcyBpcyBlcXVhbCB0byB0aGF0IG9mIGluIHdvb2x3b3J0aHMKQWx0ZXJuYXRpdmUgaHlwb3Roc2lzIEgxOiB0aGUgYXZlcmFnZSBwcmljZSBvZiBwcm9kdWN0cyBpbiB3b29sd29ydGhzIGlzIGxlc3MgdGhhbiB0aGF0IG9mIGluIGNvbGVzLgpzaWduaWZpY2FudCBsZXZlbCwgYSA9IDAuMDUKCnAtdmFsdWUgPSAwLjQwMjMgPiBhPTAuMDUsIHRoZXJlIGlzIGEgcHJvYmFiaWxpdHkgb2YgNDAuMjMlIHRoYXQgdGhlIG51bGwgaHlwb3Roc2lzIGlzIHRydWUgd2hlbiB3ZSByZWplY3QgbnVsbCBoeXBvdGhpc2lzLiAKCjk1JSBjb25maWRlbmNlIGludGVydmFsICgt4oieLCAxLjQ2MTldLGl0IGhhcyBwcm9iYWJpbGl0eSBvZiA5NSUgdG8gZmluZCB0aGUgYXZlcmFnZSBwcmljZSBkaWZmZXJlbmNlIGJldHdlZW4gY29sZXMgYW5kIHdvb2x3b3J0aHMgbGllcyBpbiB0aGUgaW50ZXJ2YWwgKC3iiJ4sIDEuNDYxOV0gd2hpY2ggaW5jbHVlZGVzIHRoZSBzYW1wbGUgbWVhbiBvZiB0aGUgZGlmZmVyZW5jZSwgMC4yNTgzLiAKClRoZXJlZm9yZSwgdGhlcmUgaXMgaW5zdWZmaWNpZW50IGV2aWRlbmNlIHRvIHJlamVjdCB0aGUgbnVsbCBoeXBvdGhzaXMsIGFuZCBpdCBpcyByZWFzb25hYmxlIHRvIGNvbmNsdWRlIHRoYXQgYXZlcmFnZSBwcmljZSBvZiBhbGwgdGhlIHByb2R1Y3RzIGZvciBjb2xlcyBpcyBlcXVhbCB0byB0aGUgYXZlcmFnZSBwcmljZSBvZiB3b29sd29ydGhzLiAKCgoyLmh5cG90aHNpcyB0ZXN0IGZvciBwcmljZSBkaWZmZXJlbmNlIGJldHdlZW4gY29sZXMgYW5kIHdvb2x3b3J0aHMgZm9yIGVhY2ggb2YgdGhlIDUgY2F0ZWdvcmllcwpDb25kdWN0aW5nIFdlbGNoIFR3byBTYW1wbGUgdC10ZXN0IHRvIGNoZWNrIGlmIHRoZXJlIGlzIGEgZGlmZmVyZW5jZSBmb3IgcHJpY2Ugb2Ygc21hcGxlIHByb2R1Y3RzIGJldHdlZW4gY29sZXMgYW5kIHdvb2x3b3J0aHMgaW4gZWFjaCBjYXRlZ29yeS4KCigxKWNhdGVnb3J5IG9mIGZyaWRnZSwgd2hpY2ggaW5jbHVkZSBmcmlkZ2UmZnJlZXplciBwcm9kdWN0cyBpbiB0aGUgdHdvIHN1cGVybWFya2V0LiAKTnVsbCBoeXBvdGhzaXMgSE86IHRoZSBhdmVyYWdlIHByaWNlIG9mIHByb2R1Y3RzIGluIHdvb2x3b3JocyBmb3IgZnJpZGdlIGNhdGVnb3J5IGlzIGVxdWFsIHRvIHRoYXQgb2YgaW4gY29sZXMKQWx0ZXJuYXRpdmUgaHlwb3Roc2lzIEgxOiB0aGUgYXZlcmFnZSBwcmljZSBvZiBwcm9kdWN0cyBpbiB3b29sd29ydGhzIGluIGZyaWRnZSBjYXRlZ29yeSBpcyAgdW5lcXVhbCB0byB0aGF0IG9mIGluIGNvbGVzLgpzaWduaWZpY2FudCBsZXZlbCwgYSA9IDAuMDUKCnAtdmFsdWUgPSAwLjg3MDggPiBhPTAuMDUsIHRoZXJlIGlzIGEgcHJvYmFiaWxpdHkgb2YgODcuMDglIHRoYXQgdGhlIG51bGwgaHlwb3Roc2lzIGlzIHRydWUgd2hlbiB3ZSByZWplY3QgbnVsbCBoeXBvdGhpc2lzLiAKCjk1JSBjb25maWRlbmNlIGludGVydmFsIFstMS4wNTksIDAuODk4XSxpdCBoYXMgcHJvYmFiaWxpdHkgb2YgOTUlIHRvIGZpbmQgdGhlIGF2ZXJhZ2UgcHJpY2UgZGlmZmVyZW5jZSBmb3IgZnJpZGdlIGNhdGVnb3J5IGJldHdlZW4gY29sZXMgYW5kIHdvb2x3b3J0aHMgbGllcyBpbiB0aGUgaW50ZXJ2YWwgWy0xLjA1OSwgMC44OThdIHdoaWNoIGluY2x1ZWRlcyB0aGUgc2FtcGxlIG1lYW4gb2YgdGhlIGRpZmZlcmVuY2UsIDAuMDgwMjUuIAoKVGhlcmVmb3JlLCB0aGVyZSBpcyBpbnN1ZmZpY2llbnQgZXZpZGVuY2UgdG8gcmVqZWN0IHRoZSBudWxsIGh5cG90aHNpcywgYW5kIGl0IGlzIHJlYXNvbmFibGUgdG8gY29uY2x1ZGUgdGhhdCBhdmVyYWdlIHByb2R1Y3QgcHJpY2Ugb2Ygd29vbHdvcnRocyBpbiBmcmlkZ2UgY2F0ZWdvcnkgaXMgZXF1YWwgdG8gYXZlcmFnZSBwcm9kdWN0IHByaWNlIG9mIGNvbGVzLgoKKDIpY2F0ZWdvcnkgb2YgYmFieSBoZWFsdGgsIHdoaWNoIGluY2x1ZGUgcmVsYXRpdmUgYmFieSBoZWFsdGggY2FyZSBhbmQgYWR1bHQgc2tpbiBjYXJlIHByb2R1Y3RzIGluIHRoZSB0d28gc3VwZXJtYXJrZXQuIApOdWxsIGh5cG90aHNpcyBITzogdGhlIGF2ZXJhZ2UgcHJpY2Ugb2YgcHJvZHVjdHMgaW4gd29vbHdvcmhzIGZvciAgYmFieSBoZWFsdGggY2F0ZWdvcnkgaXMgZXF1YWwgdG8gdGhhdCBvZiBpbiBjb2xlcwpBbHRlcm5hdGl2ZSBoeXBvdGhzaXMgSDE6IHRoZSBhdmVyYWdlIHByaWNlIG9mIHByb2R1Y3RzIGluIHdvb2x3b3J0aHMgaW4gIGJhYnkgaGVhbHRoIGNhdGVnb3J5IGlzICB1bmVxdWFsIHRvIHRoYXQgb2YgaW4gY29sZXMuCnNpZ25pZmljYW50IGxldmVsLCBhID0gMC4wNQoKcC12YWx1ZSA9IDAuNDg4MSA+IGE9MC4wNSwgdGhlcmUgaXMgYSBwcm9iYWJpbGl0eSBvZiA0OC44MSUgdGhhdCB0aGUgbnVsbCBoeXBvdGhzaXMgaXMgdHJ1ZSB3aGVuIHdlIHJlamVjdCBudWxsIGh5cG90aGlzaXMuIAoKOTUlIGNvbmZpZGVuY2UgaW50ZXJ2YWwgWy0zLjkxMSwgMS44ODRdLGl0IGhhcyBwcm9iYWJpbGl0eSBvZiA5NSUgdG8gZmluZCB0aGUgYXZlcmFnZSBwcmljZSBkaWZmZXJlbmNlIGJldHdlZW4gY29sZXMgYW5kIHdvb2x3b3J0aHMgaW4gIGJhYnkgaGVhbHRoIGNhdGVnb3J5IGxpZXMgaW4gdGhlIGludGVydmFsIFstMy45MTEsIDEuODg0XSwgd2hpY2ggaW5jbHVlZGVzIHRoZSBzYW1wbGUgbWVhbiBvZiB0aGUgZGlmZmVyZW5jZSwgMS4wMTQuIAoKVGhlcmVmb3JlLCB0aGVyZSBpcyBpbnN1ZmZpY2llbnQgZXZpZGVuY2UgdG8gcmVqZWN0IHRoZSBudWxsIGh5cG90aHNpcywgYW5kIGl0IGlzIHJlYXNvbmFibGUgdG8gY29uY2x1ZGUgdGhhdCBhdmVyYWdlIHByb2R1Y3QgcHJpY2Ugb2Ygd29vbHdvcnRocyBpbiBiYWJ5IGhlYWx0aCBjYXRlZ29yeSBpcyBlcXVhbCB0byBhdmVyYWdlIHByb2R1Y3QgcHJpY2Ugb2YgY29sZXMuCgoKKDMpY2F0ZWdvcnkgb2YgaG91c2Vob2xkLCB3aGljaCBpbmNsdWRlIHJlbGF0aXZlIGVudGVydGFpbm1lbnQgY2xvdGhpbmcsIGhvdXNlaG9sZCBhbmQgcGV0IHByb2R1Y3RzIGluIHRoZSB0d28gc3VwZXJtYXJrZXQuIAoKTnVsbCBoeXBvdGhzaXMgSE86IHRoZSBhdmVyYWdlIHByaWNlIG9mIHByb2R1Y3RzIGluIHdvb2x3b3JocyBmb3IgIGhvdXNlaG9sZCBjYXRlZ29yeSBpcyBlcXVhbCB0byB0aGF0IG9mIGluIGNvbGVzCkFsdGVybmF0aXZlIGh5cG90aHNpcyBIMTogdGhlIGF2ZXJhZ2UgcHJpY2Ugb2YgcHJvZHVjdHMgaW4gd29vbHdvcnRocyBpbiAgaG91c2Vob2xkIGNhdGVnb3J5IGlzICB1bmVxdWFsIHRvIHRoYXQgb2YgaW4gY29sZXMuCnNpZ25pZmljYW50IGxldmVsLCBhID0gMC4wNQoKcC12YWx1ZSA9IDAuODM4MyA+IGE9MC4wNSwgdGhlcmUgaXMgYSBwcm9iYWJpbGl0eSBvZiAgODMuODMlIHRoYXQgdGhlIG51bGwgaHlwb3Roc2lzIGlzIHRydWUgd2hlbiB3ZSByZWplY3QgbnVsbCBoeXBvdGhpc2lzLiAKCjk1JSBjb25maWRlbmNlIGludGVydmFsIFstMS42MTAsIDEuOTc5XSxpdCBoYXMgcHJvYmFiaWxpdHkgb2YgOTUlIHRvIGZpbmQgdGhlIGF2ZXJhZ2UgcHJpY2UgZGlmZmVyZW5jZSBiZXR3ZWVuIGNvbGVzIGFuZCB3b29sd29ydGhzIGluIGhvdXNlaG9sZCBjYXRlZ29yeSBsaWVzIGluIHRoZSBpbnRlcnZhbCBbLTEuNjEwLCAxLjk3OV0sIHdoaWNoIGluY2x1ZWRlcyB0aGUgc2FtcGxlIG1lYW4gb2YgdGhlIGRpZmZlcmVuY2UsIC0wLjE4NDUwLiAKClRoZXJlZm9yZSwgdGhlcmUgaXMgaW5zdWZmaWNpZW50IGV2aWRlbmNlIHRvIHJlamVjdCB0aGUgbnVsbCBoeXBvdGhzaXMsIGFuZCBpdCBpcyByZWFzb25hYmxlIHRvIGNvbmNsdWRlIHRoYXQgYXZlcmFnZSBwcm9kdWN0IHByaWNlIG9mIHdvb2x3b3J0aHMgaW4gaG91c2Vob2xkIGNhdGVnb3J5IGlzIGVxdWFsIHRvIGF2ZXJhZ2UgcHJvZHVjdCBwcmljZSBvZiBjb2xlcy4KCig0KWNhdGVnb3J5IG9mIHBhbnRyeSBhbmQgZHJpbmtzLCB3aGljaCBpbmNsdWRlIHJlbGF0aXZlIHBhbnRyeV9kcmlua3MgcHJvZHVjdHMgaW4gdGhlIHR3byBzdXBlcm1hcmtldC4gCk51bGwgaHlwb3Roc2lzIEhPOiB0aGUgYXZlcmFnZSBwcmljZSBvZiBwcm9kdWN0cyBpbiB3b29sd29yaHMgZm9yICBwYW50cnkgYW5kIGRyaW5rcyBjYXRlZ29yeSBpcyBlcXVhbCB0byB0aGF0IG9mIGluIGNvbGVzCkFsdGVybmF0aXZlIGh5cG90aHNpcyBIMTogdGhlIGF2ZXJhZ2UgcHJpY2Ugb2YgcHJvZHVjdHMgaW4gd29vbHdvcnRocyBpbiAgcGFudHJ5IGFuZCBkcmlua3MgY2F0ZWdvcnkgaXMgIHVuZXF1YWwgdG8gdGhhdCBvZiBpbiBjb2xlcy4Kc2lnbmlmaWNhbnQgbGV2ZWwsIGEgPSAwLjA1CgpwLXZhbHVlID0wLjk1ODMgPiBhPTAuMDUsIHRoZXJlIGlzIGEgcHJvYmFiaWxpdHkgb2YgOTUuODMlIHRoYXQgdGhlIG51bGwgaHlwb3Roc2lzIGlzIHRydWUgd2hlbiB3ZSByZWplY3QgbnVsbCBoeXBvdGhpc2lzLiAKCjk1JSBjb25maWRlbmNlIGludGVydmFsIFstOS43NDAsIDkuMjQxXSxpdCBoYXMgcHJvYmFiaWxpdHkgb2YgOTUlIHRvIGZpbmQgdGhlIGF2ZXJhZ2UgcHJpY2UgZGlmZmVyZW5jZSBiZXR3ZWVuIGNvbGVzIGFuZCB3b29sd29ydGhzIGluIHBhbnRyeSBhbmQgZHJpbmtzIGNhdGVnb3J5IGxpZXMgaW4gdGhlIGludGVydmFsIFstOS43NDAsIDkuMjQxXSwgd2hpY2ggaW5jbHVlZGVzIHRoZSBzYW1wbGUgbWVhbiBvZiB0aGUgZGlmZmVyZW5jZSwgMC4yNDk3NS4gCgpUaGVyZWZvcmUsIHRoZXJlIGlzIGluc3VmZmljaWVudCBldmlkZW5jZSB0byByZWplY3QgdGhlIG51bGwgaHlwb3Roc2lzLCBhbmQgaXQgaXMgcmVhc29uYWJsZSB0byBjb25jbHVkZSB0aGF0IGF2ZXJhZ2UgcHJvZHVjdCBwcmljZSBvZiB3b29sd29ydGhzIGluIHBhbnRyeSBhbmQgZHJpbmtzIGNhdGVnb3J5IGlzIGVxdWFsIHRvIGF2ZXJhZ2UgcHJvZHVjdCBwcmljZSBvZiBjb2xlcwoKKDUpY2F0ZWdvcnkgb2YgZm9vZCwgd2hpY2ggaW5jbHVkZSBmcnVpdCwgdmVnZXRhYmxlcywgYmFrZXJ5LCBtZWF0IGFuZCBzZWFmb29kIGluIHRoZSB0d28gc3VwZXJtYXJrZXQuIApOdWxsIGh5cG90aHNpcyBITzogdGhlIGF2ZXJhZ2UgcHJpY2Ugb2YgcHJvZHVjdHMgaW4gd29vbHdvcmhzIGZvciAgZm9vZCBjYXRlZ29yeSBpcyBlcXVhbCB0byB0aGF0IG9mIGluIGNvbGVzCkFsdGVybmF0aXZlIGh5cG90aHNpcyBIMTogdGhlIGF2ZXJhZ2UgcHJpY2Ugb2YgcHJvZHVjdHMgaW4gd29vbHdvcnRocyBpbiBmb29kcyBjYXRlZ29yeSBpcyAgdW5lcXVhbCB0byB0aGF0IG9mIGluIGNvbGVzLgpzaWduaWZpY2FudCBsZXZlbCwgYSA9IDAuMDUKCnAtdmFsdWUgPTAuODQ1NyA+IGE9MC4wNSwgdGhlcmUgaXMgYSBwcm9iYWJpbGl0eSBvZiA4NC41NyUgdGhhdCB0aGUgbnVsbCBoeXBvdGhzaXMgaXMgdHJ1ZSB3aGVuIHdlIHJlamVjdCBudWxsIGh5cG90aGlzaXMuIAoKOTUlIGNvbmZpZGVuY2UgaW50ZXJ2YWwgWy0xLjQ4MywgMS4yMThdLGl0IGhhcyBwcm9iYWJpbGl0eSBvZiA5NSUgdG8gZmluZCB0aGUgYXZlcmFnZSBwcmljZSBkaWZmZXJlbmNlIGJldHdlZW4gY29sZXMgYW5kIHdvb2x3b3J0aHMgaW4gZm9vZCBjYXRlZ29yeSBsaWVzIGluIHRoZSBpbnRlcnZhbCBbLTEuNDgzLCAxLjIxOF0sIHdoaWNoIGluY2x1ZWRlcyB0aGUgc2FtcGxlIG1lYW4gb2YgdGhlIGRpZmZlcmVuY2UsIDAuMTMyNTAuIAoKVGhlcmVmb3JlLCB0aGVyZSBpcyBpbnN1ZmZpY2llbnQgZXZpZGVuY2UgdG8gcmVqZWN0IHRoZSBudWxsIGh5cG90aHNpcywgYW5kIGl0IGlzIHJlYXNvbmFibGUgdG8gY29uY2x1ZGUgdGhhdCBhdmVyYWdlIHByb2R1Y3QgcHJpY2Ugb2Ygd29vbHdvcnRocyBpbiBmb29kIGNhdGVnb3J5IGlzIGVxdWFsIHRvIGF2ZXJhZ2UgcHJvZHVjdCBwcmljZSBvZiBjb2xlcwoKCkluIHN1bW1hcnksIHRoZXJlIGlzIG5vIHNpZ25pZmljYW50IGRpZmZlcmVuY2UgaW4gYXZlcmFnZSBwcmljZSBiZXR3ZWVuIGNvbGVzIGFuZCB3b29sd29ydGhzIGZvciBib3RoIGFsbCBzYW1wbGUgcHJvZHVjdHMgYW5kIHRoZSBwcm9kdWN0cyBpbiBlYWNoIG9mIHRoZSA1IGNhdGVnb3JpZXMuIEFuZCB0aGlzIGFuYWx5c2lzIHN1cHBvcnQgdGhhdCBmYWN0IHRoYXQgdGhlIGF2ZXJhZ2UgcHJpY2Ugb2YgY29sZSBhbmQgd29vbHdvcnRocyBhcmUgbm90IGRpZmZlcmVudCBpbiBlYWNoIGNhdGVnb3JpZXMgYW5kIGFsbCBwcm9kdWN0cyBhcyBhIHdob2xlLgoKIyMgRGlzY3Vzc2lvbiAKVGhlcmUgYXJlIHNvbWUgbGltaXRhdGlvbnMuIApGaXJzdCwgZm9yIHRlc3QgdGhlIHByaWNlIGRpZmZlcmVuY2UgZm9yIGVhY2ggc2FtcGxlLCB0aGUgc2FtcGxlIHNpemUgZm9yIGVhY2ggY2F0ZWdvcnkgaXMgNDAsIHdoaWNoIGlzIGp1c3QgaGlnaGVyIHRoYW4gMzAgb2Jlc2VydmF0aW9ucy4gVGhlIGFjY3VyYWN5IG9mIHRoZSB0ZXN0IGNvdWxkIGJlIGltcHJvdmVkIGJ5IHVzaW5nIGxhcmdlciBzYW1wbGUgc2l6ZSB3aXRoIG1vcmUgb2JzZXJ2YXRpb25zLiAKU2Vjb25kbHksdGhlIGNsYXNzaWZpY2F0aW9uIG9mIGNhdGVnb3J5IGNvdWxkIGJlIG1vcmUgc3BlY2lmaWMuIEluIHRoaXMgYW5hbHlzaXMsIHRoZSBjbGFzc2ZpY2F0aW9uIGFyZSByZWxhdGl2ZWx5IHJvdWdoIHRoYXQgYWxsIHRoZSBwcm9kdWN0cyBmb3Igd29vbHdvcnRocyBhbmQgY29sZXMgYXJlIG9ubHkgY2F0ZWdvcmlzZWQgaW50byA1IGNhdGVnb3JpZXMsIGFjdHVhbGx5IHByb2R1Y3RzIGNhbiBiZSBjYXRlZ29yaXNlZCBpbnRvIG1vcmUgZXhwbGljaXQgY2F0ZWdvcmllcywgd2hpY2ggY291bGQgaGVscCB0byBoYXZlIGEgbW9yZSBhY2N1cmFjeSBjb21wYXJlIGFuZCBvdmVydmlldyB0aGUgcHJpY2UgbGV2ZWxzIGluIGVhY2ggY2F0ZWdvcmllcyBiZXR3ZWVuIHRoZSB0d28gc3VwZXJtYXJrZXQuICAKVGhpcmRseSxmcm9tIHRoZSBub3JtYWxpdHkgcXVhbGl0eSB2aWV3IGluIHN0YXRpc3RpYyBzdW1tYXJ5IGluIHRoaXMgcmVwb3J0LCBpdCBjYW4gYmUgc2VlbiB0aGF0IHRoZXJlIGFyZSBzb21lIHBvaW50cyBvdXRseWluZyBhbmQgZGV2aWF0ZSByZWxhdGl2ZWx5IGZhciBmcm9tIHRoZSA5NSUgb2Ygbm9ybWFsaXR5IGNvbmZpZGVudCBpbnRlcnZhbHMsIHdoaWNoIG1pZ2h0IHByb2JhYmx5IG1ha2UgdGhlIHRlc3QgdG8gYmUgbGVzcyBhY2N1cmFjeS4gVGhlc2Ugb3V0bGllciBpcyBnZW5lcmF0ZWQgYnkgc29tZSBleHRyZW1lIGhpZ2ggcHJpY2UgZGlmZmVyZW5jZXMuIFRoaXMgY291bGQgYmUgcmVkdWNlZCBieSBwcm9wZXJpYXRlIGNhdGVnb3JhdGlvbiwgYmVjYXVzZSB0aGUgcHJpY2UgZGlmZmVyZW5jZSBpbiB0aGUgc2FtZSBjYXRlZ29yeSBhcmUgbW9yZSBsaWtlbHkgdG8gYmUgaW4gdGhlIHNhbWUgbGV2ZWwgb2YgcHJpY2UgZGlmZmVyZW5jZS5MaWtlIHRoZSBwcmljZSBkaWZmZXJlbmNlIGluIGJha2VyeSBhcmUgcmVsYXRlbHkgc21hbGwsIGhvd2V2ZXIsIHByaWNlIGRpZmZlcmVuY2UgaW4gYWxjb2hvbCBwcm9kdWN0cyBhcmUgcmVsYXRpdmVseSBsYXJnZS4gIAoKCgo=