Executive Summary

This comprehensive statistical analysis investigates various aspects of gender and income dynamics in the United States spanning several decades. Four distinct parts explore different dimensions of the relationship between gender and income, utilizing different statistical tests to derive meaningful conclusions.

Part 2: Gender Income Disparity (1967 - 2021)

Research Question: Is there a significant difference in Median Male and Female Income from 1967 to 2021?

Statistical Test: T-Test for Independent Samples

Key Findings: The study uncovers a significant disparity in incomes between genders in the US, as the resultant p-value (< 0.05) and the median income for males has consistently been than that of females over the period examined. Despite legislative efforts such as the Equal Pay Act, a substantial gender pay gap persists, indicative of underlying structural and societal factors influencing income distribution.

Part 3: Gender, Income, and Degrees (1991 - 2021)

Research Question: Is there an interaction between Gender and Degree Type on Median Income Level from 1991 to 2021?

Statistical Test: Two-Way ANOVA

Key Findings: This analysis reveals a significant p-value (< 0.05) with regards to median income levels in both the main effects—gender and degree type—as well as their interactions. While educational attainment demonstrates a positive influence on income, significant gender disparities persist across degree types, suggesting the presence of complex factors beyond education contributing to income differentials.

Part 4: Employment Status and Gender (1991 - 2021)

Research Question: Is there an association between Gender and Employment Status for those with a Bachelor’s Degree or higher from 1991 to 2021?

Statistical Test: Chi-Square Test for Independence

Key Findings: The study identifies a significant p-value (< 0.05) indicating an association between gender and employment status, particularly in the context of unemployment. While gender alone may not determine employment outcomes, social factors and norms are likely to be contributing factors in the observed disparities. Which underscores the imperative for further exploration into the multifaceted determinants of workforce participation.

Overall Implications:

These findings collectively highlight the persistence of gender-based income disparities in the US despite legislative efforts and societal advancements. While educational attainment positively correlates with income, significant gender differences persist across educational levels and employment statuses. This emphasizes the necessity for ongoing endeavors aimed at address the underlying societal inequalities. Further research into external factors influencing income dynamics and workforce participation is imperative to elucidate the reasons behind the persistence of the wage gap in the United States. Such insights are essential for developing targeted interventions that promote gender equity in income distribution and economic opportunities.







Part 1 - Female Income in the US from 1967 - 2021.

Introduction

Since the early 1900s in the US women have gained more of an equal standing in society. 1920 was a major year for Woman’s rights, the nineteenth amendment to the U.S constitution was ratified (NWHP, 2023), this amendment gave women the right to vote. Further progress was made towards an equal society throughout the 1900s, for example in 1978 the court ruled into effect the Pregnancy Discrimination Act (NWHP, 2023). Which banned employment discrimination against pregnant women.

Women stormed through the 1960s as a part of the feminist movement. 1967 in particular was part of the second wave of feminism (Binghamton University, 2024). This movement was set out to fight for equal rights between genders as previously in history women have gone through much hardship.

Part one of this study is therefore set out to determine whether any progress has been made since the second wave of feminism in 1967. This will be done by analyzing whether there has been a significant increase in Median Female Income in the US from 1967 - 2021.

Therefore, the research question to be answered in this study is:

Has there been a significant increase in Median Female Income from 1967 - 2021?

Linear Regression:

The statistical test which will be used in this study is linear regression, as we are looking to determine whether there is a significant relationship between our two variables:

  • Time in Years

  • Median Female Income ($)

The formula for Linear regression is:

  • Y = β0 + β1X

Where:

  • Y is the dependent variable

  • X is the explanatory variable

  • β0 is the intercept, the value of Y when X = 0

  • β1 is the slope of the linear regression line

Our Formula:

  • Median Female Income = β0 + β1(Time in Years)

Hypothesis:

In order to answer this question we need to set our Null and Research Hypothesis, and level of significance.

Null Hypothesis:

  • H0: β1 = 0

β1 represents the slope coefficient associated with Y (Median Female Income).

Our Null Hypothesis is that the slop is equal to 0. Meaning that there is no relationship between X (Time in Years) and Y

Research Hypothesis:

  • H1: β1 > 0

Since we are testing whether there has been a significant increase in Median Female Income from 1967-2021. We are testing with our Research Hypothesis that the slope coefficient β1 is greater than 0.

For this study we set a significance level of 0.05, which means we are willing to say that the there is a 5% chance that the results will occur due to chance alone. Only when our p-value is lower than our significance level of 0.05 can we reject the Null Hypothesis and determine that the Research Hypothesis is more attractive.

Method

To start our analysis the relevant packages are loaded into R Studio.

#Packages
library(knitr)
library(kableExtra)
library(ggplot2)
library(dplyr)

Then the data is sourced and downloaded from www.census.gov. Table A-7: Number of Real Median Earnings of Total Workers and Full time, Year-Round Workers by Sex and Female-to-Male Earnings Ratio: 1960 - 2021.

For purpose of understanding: The word “Earnings” will be used interchangeably with “Income” as they are both used to describe the money earned from direct employment. Furthermore, the data used in this study is for Total Workers not Full-Time, Year-Round Workers.

The data was subsequently transformed in Excel for data cleaning purposes and ease of loading into R.

Rows for 2017 and 2013 have been repeated in the data set downloaded from US Census, so when imported into excel I have calculated the average of these rows instead of allowing two instances for the same year.

After further data cleaning in R, a number was given to each year value starting at 1967 as 1, 1968 as 2, and so on. In order to make more sense of the X value when conducting linear regression and not skew our analysis.

Table 1.1: US Census data regarding Median earnings for Total Female Workers from 1967 - 2021. The Years are numbered in order to not skew the analysis later. Median female Earnings in Dollars US ($).
Year Female.Earnings YearNum
1967 16721 1
1968 17192 2
1969 16799 3
1970 17046 4
1971 17862 5
1972 18481 6
... ... ...
2016 34867 50
2017 35091 51
2018 35232 52
2019 37967 53
2020 37527 54
2021 39201 55

From first glance of our data we can see that the Median Female Earnings is a lot higher in 2021 that in 1967, with values of $39,201 and $16,721 respectively.

In order to determine whether there has been a significant increase or not a linear regression model will be made and the assumptions will be tested to determine the fit of the model.

Model 1:

Our Linear Regression Model, follows our original formula of Y = β0 + β1X. Where Y is Median Female Income and X is Time in years.

The coefficients for Model 1 are as follows:

Table 1.2: Linear Regression Model 1. The intercept (constant) β0 and the slope (coefficient) β1, which are used with the predictor X to achieve the response variable Y.
β0 (Intercept) β1 (Slope)
15383.08 406.6405

For our Linear Regression Model 1 our constant β0 (Intercept) is 15383.08 and the slope (coefficient) β1 is 405.6405.

Making our Formula:

Predicted Y = 15383.08 + 405.6405(X)

Where:

  • Predicted Y is the Predicted Median Female Income Given X

  • X is the Year Number starting with 1967 as 1

This means that β1 is the amount in $ added to Median Female Income for each unit increase in Year from 1967, with the starting value equal to the (intercept) β0 value of 15383.03.

Visualizing model 1:

Figure 1.1: Scatter Plot of our US Census data regarding Median Earnings for Women plotted over Time in Years. With a Regression line or line of best fit. This graph shows a linear relationship between our X and Y variables.

In order to determine whether this model can be used for our data we must check whether the assumptions of linear regression are met.

From our graph we can determine that the relationship between our two variables is linear. Yet, we must further check for homoscedasticity (variance of residuals is constant) and normality of residuals (residuals follow a normal distribution). These checks can be done with diagnostic plots.

Diagnostic Plots

Figure 1.2: Diagnostic plots for our Linear Regression Model 1: With Y equal to Median Female Earnings and X equal to Time in Years. The plot is done to check for the assumptions of homoscedasticity and normality of residuals. The Residuals vs fitted shows a slight pattern, yet could be considered homoscedastic. Whereas the QQ Plot shows that the residuals are normally distributed.

The Residuals vs Fitted plot is used to visualize the homoscedasticity of our model, which we have described as the variance of our residuals, which we want to be constant. Our residuals are the Y value - the Predicted Y value. This plot shows our residuals as a function of the fitted values.

Here we want to see that the Residuals bounce randomly around the 0 line and should be roughly equally spaced around the regression line.

The QQ Plot is used to visualize the normality of the residuals, a straight line indicates that the residuals are normally distributed.

Here the Residuals vs Fitted plot shows somewhat of a pattern, but the QQ Plot shows us a normal distribution. We will transform the data the and create a new model to see if we can improve this before we continue with our analysis.

Model 2:

Our second Linear Regression Model, Model 2 follows a new formula of Y = β0 + β1(log10(X)). Where Y is Median Female Income and X is Time in years.

The coefficients for Model 2 are as follows:

Table 1.3: Linear Regression Model 2 with log10() transformation. The intercept (constant) β0 and the slope (coefficient) β1, which are used with the predictor X to achieve the response variable Y.
β0 (Intercept) β1 (Slope)
4.221912 0.0068563

For our Linear Regression Model 2 our constant β0 (Intercept) is 4.221912 and the slope (coefficient) β1 is 0.0068563.

Making our Formula:

log10(Predicted Y) = 4.221912 + 0.0068563(X)

Where:

  • log10(Predicted Y) is the logarithmic exponents of Predicted Median Female Income Given X

  • X is the Year Number starting with 1967 as 1

Using a log10 Transformation on our Y variable means that β1 is the percentage change to income with 1 unit increase in our scale, with the starting percentage increase equal to the (intercept) β0 value of 4.221912.

Diagnostic plots 2:

Figure 1.3: Diagnostic plots for our Linear Regression Model 2: With a logarithmic transformation of our Y variable equal to log10(Median Female Earnings) and X equal to Time in Years. The plot is done to check for the assumptions of homoscedasticity and normality of residuals.

The Residuals vs fitted shows the same pattern as before, yet again it could be considered homoscedastic. Whereas the QQ Plot shows that the residuals are normally distributed.

Since the same outcome or almost the same outcome has been shown with a logarithmic transformation. We will see if adding another variable will make any improvements our model.

Model 3:

Inflation is added to the model and the data is scaled before the model is created. This is done by subtracting the mean of each variable and dividing by the standard deviation for each observation.

The coefficients for Model 3 are as follows:

Table 1.4: Linear Regression Model 3 with new predictor Inflation (x2) . The intercept (constant) β0 and the slope (coefficient) β1 + β2, which are used with the scaled predictors x1 + x2 to achieve the response variable Y.
β0 (Intercept) β1 (Slope for x1) β2 (Slope for x2)
26769.02 6656.602 -230.7875

For our Linear Regression Model 3 our constant β0 (Intercept) is 26769.02 and the slope (coefficient for x1) β1 is 6656.602, and the slope (coefficient for x2) β2 is -230.7875.

Making our Formula:

Predicted Y = 26769.02 + 6656.602(X1) + -230.7875(X2)

Where:

  • Predicted Y Predicted Median Female Income Given X

  • X1 is the Scaled Transformation of Year Number starting with 1967 as 1

  • X2 is the Scaled Transformation of Inflation for each year

Diagnostic plots 3:

Figure 1.4: Diagnostic plots for our Linear Regression Model 3: With our Y variable equal to Median Female Earnings and X1 equal to Time in Years. An additional Predictor (X2) variable has been added to our model, inflation. Making our model multilinear. The plot is done to check for the assumptions of homoscedasticity and normality of residuals.

The Residuals vs fitted again shows the same pattern as before, yet again it could be considered homoscedastic, meaning there has not been improvements on homoscedasticity when adding the variable of inflation to our model. The QQ Plot shows that the residuals are normally distributed.

Since the same pattern has been visible the third time, we will determine which model to use by comparing the Multiple R squared and Adjusted R squared values.

R Squared Values

Table 1.5: Comparing the Multiple R Sqaured and Adjusted R Squared of Model 1 and 2 to determine whcih is best fit for our data.
Model 1 Model 2 Model 3
MultipleR^2 0.9697445 0.9639512 0.9705015
AdjustedR^2 0.9691736 0.9632710 0.9693669

Multiple R squared is used to determine how much variance in Y can be determined by X. Adjusted R squared is a modified version which takes into account the number of predictors in the model.

The R squared values are highest in Model 1 and 3. When adding Inflation to Model 1 (Model 3), we get an increase in both values.

To determine whether we will use this extra predictor in our model or not we will conduct an ANOVA.

ANOVA

Analysis of Variance Table

Model 1: Female.Earnings ~ YearNum
Model 2: Female.Earnings ~ YearScaled + InflationScaled
  Res.Df      RSS Df Sum of Sq      F Pr(>F)
1     53 71504295                           
2     52 69715240  1   1789056 1.3344 0.2533

The p-value of 0.2533 is greater than 0.05 our level of significance and we can determine that the variance of the two models is not significantly different.

Therefore, we will conduct our analysis with our linear regression Model 1.

Results

We have determined that we will be using our linear regression Model 1.

Model 1:

Predicted Y = 15383.08 + 405.6405(X)

Where:

Report: F(1,53) = 1699, P-Value < 0.05


Call:
lm(formula = Female.Earnings ~ YearNum, data = FemaleEarnings)

Residuals:
     Min       1Q   Median       3Q      Max 
-2385.19  -780.07   -40.66   753.00  2766.14 

Coefficients:
             Estimate Std. Error t value Pr(>|t|)    
(Intercept) 15383.085    317.560   48.44   <2e-16 ***
YearNum       406.640      9.866   41.22   <2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 1162 on 53 degrees of freedom
Multiple R-squared:  0.9697,    Adjusted R-squared:  0.9692 
F-statistic:  1699 on 1 and 53 DF,  p-value: < 2.2e-16

Residual Standard Error: 1162

Standard Error: 9.866

Multiple R-Squared: 0.9697 and Adjusted R-Squared: 0.9692

The output of the model shows us the p-value to be a very significant value lower than 0.05, with an F stat of 1699 on 1 and 53 Degrees of Freedom.

As we are looking at whether there has been a significant increase in Median Female Income from 1967 - 2021 this a is a one tailed test.

P-Value for this test is as follows:

[1] 3.035456e-42

Meaning we can determine that on any one test of the Null Hypothesis we can say that there is a less than 5% probability that the results will be due to chance alone. Therefore we can reject the Null Hypothesis and determine that the Research Hypothesis is more attractive.

Discussion

As we have rejected the Null Hypothesis, we can say that there has been a significant increase in Median Female Income in the US from 1967 - 2021.

With our new formula (Predicted Y = 15383.08 + 405.6405(X)) we can also predict the value of Y if we know the value of X. As we have used Year Number as a count starting from 1967, to predict Median Female Income in the US for 2024, we would simply have to replace X with 57 (for 2024).

Visualization:

Figure 1.5: Median Female Earnings plotted against time in Years, with line of best fit and Residuals plotted to the predicted values. With higher residual values shown with red and a larger circle and the smaller values shown with a smaller circle and blue.

The Multiple R squared value of 0.9697 for the regression Model 1 indicates that the predictor X (Time in Years) explains 97% of the variation in Median Female Income in the US. The Adjusted R squared value provides a more conservative value but still indicates a similar result of 0.9691.

The Residual Standard Error of 1162 means that there is a 95% the predicted value will fall between the mean of all Median Female Income and 1162

The Std.Error β1 of 9.866 shows the precision of the slope. The small value indicates less variability in the slope coefficient for this linear regression model.

As we have determined that Median Female Income has significantly increased over the years in the US from 1967-2021, we can say that things are going in the right direction as compared to how they were in the late 1800s. One can say that from this analysis he standard of living has increased for women in the US over these years.

However this study does not account for inflation, as this was determined to not be relevant enough for our regression model due to output of our anova test. Unemployment, and other socioeconomic factors have also not been accounted for.

This study has only analysed the total working population, so to analyse the standard of living for those without work could also be an interesting topic.

Further analysis and research should be conducted to get a better understanding of how equality is evolving in society and the effect is has on Female quality of life. Not simply through their economical gain but other factors such as education, life expectancy etc.







Part 2 - Gender and Income in the US from 1967 - 2021.

Introduction

Feminism can be defined as the advocacy of Woman’s rights on the basis of gender equality (Future Learn, 2021). To further understand the positive impact feminism has had on womens rights and on society in the US from 1967-2021, the difference of median incomes by gender will be an interesting topic to cover.

From Part 1 of this study we revealed that there had been a significant increase in Female Median Income in the US from 1967-2021. This is a step in the right direction, showing that women fighting for their rights has not gone unnoticed over the years. Yet, looking deeper into the equality between genders. How does this figure compare to what Men had earnt during the same time period?

In 1963, the Equal Pay Act was put in place, which was set out to protect against wage discrimination based on sex (DOL, 2024). With this act in place, women, by law should be paid the same as men for the same work. It is stated by the US Department of Labour website (2024) that employers must raise wages to equalize pay but may not reduce the wages of other individuals. Meaning two people working the same job should be paid the higher amount and not the lower.

Part two of this study is therefore set out to determine whether there is a significant difference in Male and Female Median Income from the years of 1967 - 2021.

Therefore, the research question to be answered in this study is as follows:

Is there a significant difference in Median Male and Female Income from 1967 - 2021?

If there is a significant difference in the Median Income by Gender from 1967 - 2021 in the US and men are earning more, then we can determine that there is a pay gap between the two genders during this time period.

Since the Equal Pay Act was put into place before the time period that the data was recorded (put into place in 1963). The reason for a pay gap would therefore not be due to the law itself but rather other outside factors at play which have had a negative effect on the Median Income of Females.

If there is not a significant difference in the Median Income between the two Genders or if there is but it shows that women are earning more, then we can say that the Equal Pay Act of 1963 solved the issues regarding equal pay based on sex in the US.

T-Test for Independent Samples

The statistical test which will be used in this study is a t-test for independent samples, as we are looking to compare the central tendencies of the two independent groups

  • Group 1: Median Male Income ($) 1967-2021

  • Group 2: Median Female Income ($) 1967-2021

Hypothesis:

In order to answer this question we need to set our Null and Research Hypothesis and level of significance.

As we are only interested to see if there is a difference this will be a two tailed test.

Null Hypothesis:

H0: Female Median Income US 1967-2021 (Central Tendency) = Female Median Income US 1967-2021 (Central Tendency)

Research Hypothesis:

H1: Female Median Income US 1967-2021 (Central Tendency) ≠ Male Median Income Us 1967-2021 (Central Tendency)

For this study we set a significance level of 0.05, which means we are willing to say that the there is a 5% chance that the results will occur due to chance alone. Only when our p-value is lower than our significance level of 0.05 can we reject the Null Hypothesis and determine that the Research Hypothesis is more attractive.

Method

To start our analysis the relevant packages are loaded into R Studio.

#Packages
library(ggplot2)
library(ggpubr)
library(knitr)
library(kableExtra)
library(Rcmdr)
RcmdrMsg: [1] NOTE: R Commander Version 2.9-0: Wed Feb 7 17:46:52 2024
RcmdrMsg: [2] NOTE: R Version 4.3.1
RcmdrMsg: [3] NOTE: Hello edren
library(dplyr)
library(rstatix)

Then the data is sourced and downloaded from www.census.gov. Table P-8. Age–All People, by Median Income and Sex: 1947 to 2022. The data used in this study are in 2022 dollars, so inflation is accounted for and the table used out of the multiple available in this data set (P-8) is for all people 15 years and older.

The data is then loaded and transformed into excel, only keeping the necessary values and columns along with the values for each year. As before, rows for 2017 and 2013 have been repeated in the data set downloaded from US Census, so when imported into excel I have calculated the average of these rows instead of allowing two instances for the same year.

Summary of the Data:

Table 2.1: Initial look at how our data is laid out. Providing the Median Income for both Genders 15 Years and Over in the US from 1967 - 2021. The Income in this dataset accounts for inflation and is in 2022 Dollars ($).
Year Gender Median.Income
1 2021 Male 49520
2 2020 Male 48130
3 2019 Male 50470
4 2018 Male 48100
5 2017 Male 47630
6 2016 Male 46640
7 ... ... ...
105 1972 Female 15320
106 1971 Female 14670
107 1970 Female 14210
108 1969 Female 14210
109 1968 Female 14020
110 1967 Female 13000

The data is laid out with the different genders in one columns and the “Median.Income” in its own column. This being the case the Year values will therefore be repeated going from 2021-1967 twice to match the two genders, making our n = 110, or 55 for each. Double what is was in the previous study. Degrees of freedom for this study is therefore, (n1 + n2) - 2 = 108.

Table 2.2: Summary Statistics for our data regarding Median Income for the seperate Genders 15 Years and Over in the US from 1967-2021. The count is the number of years in the study which is our n, median of the median income is provided for each, and the interquartile range.
Gender count median IQR
Female 55 21160 10785
Male 55 42510 3735

The Summary Statistics here confirm the n1 and n2 = 55. Therefore our DF is 108. The Median of Median Income is seen to be a lot higher for Males than Females in the US, it works out to be over double. For Females there is also a high Interquartile Range (IQR), which means that there is a high range where most of the values lie. As we are working with Yearly data we can only hope that this large Interquartile range is due to improvements over the years in Median Female Income which has caused this large spread.

In order to determine whether the difference between the two genders is significant a T Test for Independent samples will be conducted to measure whether there is statistical evidence that the central tendencies of our two groups are statistically different.

Assumptions Check:

Firstly, we must check that all the assumptions are met before we can continue with our analysis. For a T Test for Independent Samples, as stated by Amanda J. Shaker (2024) the assumptions required to conduct the parametric version of this test are that the data are independent (which they are), the data is normally distributed and that there are equal variances between groups.

Normality:

Using a Histogram, Density Plot, QQ-Plot we can determine whether the data is normally distributed or not. There should be equal distribution around the mean for the first two plots (Histogram and Density plot) and the QQ-Plot show should the data in a straight line.

[1] 110 109

Figure 2.1: Histogram, Density Plot and QQ-Plot combined to check the assumption of normal distribution for our data set. The histogram shows the median further to the right than the mean which suggests a negative skew. The Density plot also shows the that the data is more centered around the right hand side rather than the mean, again showing that the data is skewed and not normally distributed. The QQ-Plot does not follow a straight line and is therefore not showing normal distribution.

Shapiro-Wilk Test

Looking at the three different plots visualizing our data, we can determine that the data does not follow a normal distribution. One further can check this with the Shapiro Wilk Test which is a test of normality. The Null Hypothesis states that the data is not different (equal to) a normal distribution. Therefore if we reject the Null we must determine that the data is not normally distributed. For this test we will use a significance level of 0.05.


    Shapiro-Wilk normality test

data:  MaleFemaleEarnings$Median.Income
W = 0.89134, p-value = 0.0000001983

The output of this test is a p-value is extremely low and < 0.05. Therefore, we must conclude that our data is not normally distributed.

Equal Variances:

The next assumption for the parametric version of this test is Equal Variances between groups. We do not need to do this assumption check as we already know the data is not normally distributed, and will continue with the non-parametric version of the test the Mann-Whitney U Test.

Yet, we will do it anyway as it is very simple. Using the Levene Test for equal variances the output is similar, the Null Hypothesis for this test is that there is equal variances between groups. Therefore a p-value < 0.05 (our level of significance) means that we can determine that there is no equal variance between the groups in our sample.

Levene's Test for Homogeneity of Variance (center = median)
       Df F value         Pr(>F)    
group   1  42.683 0.000000002178 ***
      108                           
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

The p-value here is extremely low and < 0.05. Therefore, we can confirm that there is not equal variances between the two groups in our sample.

Mann-Whitney U test:

The Mann-Whitney U test is used as a non-parametric version of the T-test for Independent samples, it is also known as the Wilcoxon rank sum test. As we did not meet the assumptions needed for the parametric version of our test, we will continue with the non-parametric version of our test.

Results

Report: W = 0, P-Value < 0.05


    Wilcoxon rank sum test with continuity correction

data:  Median.Income by Gender
W = 0, p-value < 2.2e-16
alternative hypothesis: true location shift is not equal to 0

The output of our non parametric test does not include degrees of freedom as we are working with median values and the purpose of this test is to evaluate whether or not the median of the differences is equal to 0.

The P-Value for this test is < 0.05, which means we can reject the Null Hypothesis that there is no difference between the central tendencies of Median Income of Male and Females 15 years and Over in the US from 1967 - 2021, and determine that the Research Hypothesis that there is a significant difference is more attractive.

Discussion

The median value of the Median Income for 15 Years and Over in the US from 1967-2021 was $21,160 and $42,510 for Women and Men respectively. We previously determined that this was a large difference but now we can say the difference is significant as the P-Value < 0.05 and on any one test of the Null Hypothesis we can say that there is a less than 5% probability that the results will be due to chance alone.

Visualization

Figure 2.2: Box Plot for Median Income by Gender in the US between throughout the years of 1967-2021, for all people aged 15 years and Older in 2022 Dollars (Inflation accounted for). Interquartile range shown as the box and the whiskers are the total range. With the line through the middle as the median. Female plot shows a larger interquartile range, which shows a larger spread of values. Where as the Male plot does not.

Comparing both these both of these plots shows that Women have had a larger increase over the years, which is visualized by the greater overall range (minimum and maximum values). Also the interquartile range for Females is larger than that of the Males which shows a greater spread of values, which also indicate progressions over the years as there is more variability.

Yet, the plot for Males is much more clustered together showing less change but also more concentration around a higher value. The minimum value for Males is also higher than that of the Females maximum. Since we are looking at this data in 2022 Dollars, we see that Female Median Income is yet to catch up to the Males Minimum Income from 1967-2021.

Effect Size

The effects size tells us the magnitude of the difference between the two groups with regards to our y variable which is Median.Income in this case. With an r less than 0.3 there is a small effect, between 0.3 and 0.5 is a medium effect and greater than 0.5 shows a large effect (DATAtab, 2024).

The effect size for our test is r=0.862 meaning that there is a large magnitude of effect size. Which shows a substantial strength of difference between the two groups Male and Female by the variable Median Income. The difference we have already stated to be significant, and now the effect of which gender has on the difference in Median Income we can explain to be of a large magnitude.

The significant difference of Median Income between the two Genders can be concluded to show that there is still a pay gap even with the Equal Pay Act in place. Which we therefore determine to be due to other factors rather than law of equal pay itself.

One may consider that, women are likely to have a lower risk tolerance than men which may cause them to not take on higher paying jobs. Yet, with risk there is also failure and that should lead to greater variability in the median income for men.

Other factors which should be considered are segregation in the work place and work experience (Aragao, 2023). Since, the improvements regarding Woman’s rights are not super new (Equal Pay Act only happened 61 years ago in time of writing this paper), there may still be some prejudice in certain fields towards women which make it hard for them to find work. More research should be done to analyse this topic.

Educational attainment is another outside factor which will have an effect on the pay gap between Men and Women as stated by Carolina Aragao (2023). Socially-constructed norms that define the roles that Men and Women should play is a reason why girls are more likely to be out of school than boys across the world (Sida, 2017). Pressures of society and life outside of work have an effect on both men and women but could also be a reason why women have a lower Median Income than Men in the US during these years.

Further data collection and analysis regarding; educational attainment for both genders, differences in social pressures (both in and out of work) by gender, and the differences in risk tolerance for both genders, may help us further answer the “why?” to our pay gap question.







Part 3 - Gender, Income and Degrees in the US from 1991 - 2021.

Introduction

The previous studies in this project have provided us with more of an understanding about Feminism and its positive effect on the Female Median Income in the US. As shown in part one of this study, the improvements in society in the US regarding Woman’s rights have led to a significant increase in Median Female Income.

Part two of this study finished off with an analysis detailing that even though according to The U.S. Department of Labor (2024) the Equal pay act was put in place in 1963, there was still a significant difference between the median income between the two genders in the US.

Therefore, this study will look to delve deeper into the pay gap between genders in the US and analyse more of the factors that might have had an effect on the difference in median income in the US. One factor in particular being educational attainment, specifically that of a degree.

With more laws being put into place in the US to foster a better learning environment for women, such as The Women’s Educational Equity Act of 1974 (NWHP, 2023) which was set out to encourage full educational opportunities for girls and women, and the Gender Equity Act of 1994 (NWHP, 2023) which was created to promote gender equality and eliminate discrimination. One would suspect that more women are likely to take on a degree than before.

With data for both genders and the different degree types we will be able to uncover which degree type is the highest paying and whether there is still a difference in medium income between the genders when both gender have the same degree type.

Therefore, part three of this project will cover an analysis of the median income for men and women in the US from 1991-2021, across three different types of degrees; bachelors, masters and doctorate. Professional degree will not be included in this study as there was lacking data for 2007 and 2008.

Our research question for this study is as follows:

Is there an interaction between Gender and Degree Type on Median Income Level in the US from 1991-2021?

Two-Way ANOVA:

This research question will be answered with a Two-Way ANOVA. The Two-Way Analysis of Variance will be used as we are comparing the effect our two independent variables (Gender, Degree Type) have on a dependent variable (Median Income in the US).

Firstly, we will be able to analyse whether Median income is equal across the two genders, which we discovered in part 2 that is is not for the total population of men and women 15 years and over in the US. Yet, now we will be analyzing whether there is a difference in median income for those who specifically have a bachelors degree or over (not including professional degree).

With our Two-Way anova, we will also be able to analyse whether the median income is equal across the different degrees, or whether there is a significant difference.

Furthermore, we can do a cross treatment analysis to uncover the differences in median income between genders across the different degrees and also between the different degrees across the different genders

Hypothesis 1, 2 + 3:

1st Hypothesis and Research Question:

  • H0: Median Income is equal across genders with a bachelors or over.

  • H1: Median Income is different across genders with a bachelors or over

2nd Hypothesis and Research Question:

  • H0: Median Income is equal across the degree types

  • H1: Median Income is equal across the degree types

3rd Hypothesis and Research Question:

  • H0: All 6 groups created by cross treatment have equal means

  • H1: All 6 groups created by cross treatment do not have equal means

For this study we set a significance level of 0.05, which means we are willing to say that the there is a 5% chance that the results will occur due to chance alone. Only when our p-value is lower than our significance level of 0.05 can we reject the Null Hypothesis and determine that the Research Hypothesis is more attractive.

Method

To start our analysis the relevant packages are loaded into R Studio.

#Loading Packages
library(knitr)
library(kableExtra)
library(psych)
library(car)
library(ggplot2)
library(multcomp)
library(ggeffects)
library(phia)
library(effects)

Then the data is sourced and downloaded from www.census.gov. Table P-16. Educational Attainment–People 25 Years Old and Over by Median Income and Sex: 1991 to 2022. The data used in this study are in 2022 dollars, so that inflation is accounted for over the different years. The three tables used out of the multiple available in this data set (P-16) is for both genders, with a bachelors degree, masters degree and doctorate degree.

As previously stated the Professional Degree table will not be used as it was missing data for 2007 and 2008. The data is then loaded and transformed into excel, only keeping the necessary values and columns along with the values for each year.

As in both part one and two of this study, the rows for 2017 and 2013 have been repeated in the data set downloaded from US Census, so when imported into excel I have calculated the average of these rows instead of allowing two instances for the same year.

Lastly, further data cleaning was performed in R transforming the variables Gender and Degree to factors and Median.Income to integer.

Summary of the Data:

Table 3.1: Initial look at how our data is laid out. Providing Income data for both Genders and 3 different degree types in the US from 1991 - 2022. The Income in this dataset accounts for inflation and is in 2022 Dollars ($).
Year Gender Median.Income Degree
1 2021 Male 127500 Doctorate
2 2020 Male 127700 Doctorate
3 2019 Male 121300 Doctorate
4 2018 Male 116300 Doctorate
5 ... NA ... NA
63 2021 Male 101300 Masters
64 2020 Male 98350 Masters
123 1992 Female 58310 Masters
124 1991 Female 58950 Masters
10 ... NA ... NA
183 1994 Female 43200 Bachelors
184 1993 Female 42350 Bachelors
185 1992 Female 43260 Bachelors
186 1991 Female 41550 Bachelors

The data is separated into four columns, providing information for both Genders and their median income in the US from the years 1991-2021 with regards to the three Degree types we have selected for this study; Bachelors, Masters, Doctorate.

Again, as we are analyzing two Genders and three Degree types, the year values have been repeated six times as we are matching the Median Income data for each year to each Gender and each Degree type.

Table 3.2: Summary Statistics of the median income data for both Genders and 3 degree types in the US from 1991-2021.
n mean sd median min max range skew kurtosis se
F:Bachelors 31 47420.48 2849.075 47590 41550 52830 11280 -0.1154015 -0.4021528 511.7090
F:Doctorate 31 82704.84 6444.466 81910 71800 98010 26210 0.5315128 -0.4469547 1157.4603
F:Masters 31 63353.23 3061.564 63240 58310 69020 10710 0.1741897 -0.8611165 549.8731
M:Bachelors 31 74872.26 3286.385 75470 69610 80190 10580 -0.0434888 -1.5008370 590.2521
M:Doctorate 31 114628.71 7326.512 114500 99890 127700 27810 -0.1151121 -0.7865415 1315.8805
M:Masters 31 93255.48 4456.962 93810 85470 101300 15830 -0.1752641 -0.9594464 800.4940

The n values of each group show the total number of observations for each, which is 31 as this is the number of years of data we have for each pairing of group 1991-2021. The mean values for the Doctorate Degree type have shown to be the highest from our summary statistics for both males and females with values of 114628.71 and 82704.84 respectively and lowest for the Bachelors Degree type for both males and females with values of 74872.26 and 47420.48 respectively.

By comparing the means of each group pairing, we not only see that Bachelors is the lowest and Doctorate is the highest. We also can see that Males have a higher mean than Females for each Degree Type. Whether this difference is significant or not is what we will further analyse in this study.

The standard deviation (sd), is highest in Males meaning there is more variability around the mean of the data. When comparing the sd and range of both genders who have a Bachelors degree, you can see that Males have an sd value of 3286.385 and Females have a sd value of 2849.075 but the ranges are 10580 and 11280 respectively. Showing that Males who have a Bachelors Degree have an income less concentrated around the mean than Females with the same degree, but is less spread out.

The higher range for Females with a Bachelors degree shows that there is a larger gap between the highest and lowest values. Yet, the lower sd also indicates that most of the values are closer to the mean than that of Males.

When comparing the sd values and range for both Genders and for the Doctorate and Masters Degree, we can see that both the sd and range is higher for Males with regards to these pairings, showing that the data is concentrated for Females with Masters and Doctorate Degrees and less spread out.

Females have a positive skew for both Doctorate and Masters Degrees, whereas the rest of the pairings indicate a negative skew. A skew value from -0.5 to 0.5 indicates symmetry (Gawali, 2023). Most of the parings are therefore symmetrical except the Females with a Doctorate Degree group, which has slightly above 0.5 with a skew value of 0.5315, showing that the outliers are towards the upper quartile, meaning that there are a few higher incomes for this pairing which has skewed the data towards the right.

The kurtosis values < 3 indicate that the distribution is platykurtic which is less peaked when compared to a normal distribution, which is what we see for each pairing in this data set.

Lastly, the standard error (se) is larger in both groupings of the Doctorate Degree meaning the data here is less precise than that of the other groupings of Degree types.

Assumptions Check:

Firstly the model is created using R, with Median Income as our Independent variable and Gender and Degree as our Dependent variables. In order to continue with our Two-Way Anova model, we must check first that the required assumptions are met.

  • Independent observations (which we have)

  • Homoscedasticity - Residuals have equal variance

  • Normality of Residuals - Residuals follow a normal distribution

Homoscedasticity:

Figure 3.1: Diagnostic plot of our Two-Way ANOVA model. Residuals vs Fitted plot is used to check for the assumption of homoscedasticity. The Residuals should have an equal variance when plotted against the fitted values. The Q-Q Residuals plot is used to check for the normality of residuals, which is indicated by a straight line.

The Residuals vs Fitted plot here shows homoscedasticity of our Two-Way ANOVA model as the largest spread is not three times the size of the smallest. The Q-Q Residuals plot also shows that the Residuals are normally distributed.

Normality of residuals:

We can further check the normality of residuals with the Shapiro Wilk test, with the residuals taken from our Two-Way ANOVA test. The Null Hypothesis here is that the data follows a normal distribution. Therefore, a P-Value < 0.05 means that we reject the Null Hypothesis and determine that the data is not normally distributed.

Shapiro Wilk test


    Shapiro-Wilk normality test

data:  Res_Epsilon
W = 0.98875, p-value = 0.1488

The P-Value from the Shapiro-Wilk test is 0.1488, which is > 0.05. Therefore we do not reject the Null Hypothesis that the data is normally distributed.

Histogram

Figure 3.2: Histogram plot of the Residuals from our Two-Way ANOVA Model 1. A normal distribution shows symmetry around the mean, which is what we can see here.

Since checking that all assumptions have been met we do not need to transform our data or change our model and can therefore continue with our analysis.

Results

Analysis of Variance Table

Response: Median.Income
               Df      Sum Sq     Mean Sq   F value  Pr(>F)    
Gender          1 41181144023 41181144023 1723.4910 < 2e-16 ***
Degree          2 43747307275 21873653637  915.4444 < 2e-16 ***
Gender:Degree   2   155472437    77736219    3.2534 0.04093 *  
Residuals     180  4300925127    23894028                      
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Report 3: F(Gender:Degree, 2,180) = 3.2534, P-Value < 0.05

Firstly looking at the interaction, the significance level is 0.04. Meaning we can reject the 3rd Null Hypothesis that “all six groups created by cross treatment have equal means” and that they are all significantly different. The interaction being significant does not particularly mean that the main effects Gender and Degree will also be significant.

Report 1: F(Gender, 1,180) = 1723.4910, P-Value < 0.05

Report 2: F(Degree, 2,180) = 915.4444, P-Value < 0.05

In this case the P-Value < 0.05 for each Main Effect Gender and Degree. Meaning we can reject the 1st and the 2nd Null Hypothesis that “Median Income is equal across genders with a bachelors or over” and “Median Income is equal across the degree types”, and determine that the Research Hypothesis is the most attractive for all the Main Effects and the Interaction.

A P-Value lower than 0.05 allows us to determine that the differences we have seen in this data are statistically significant and that the probability that these results will occur due to chance alone is less than 5%.

Discussion

Post-Hoc Analysis

Table 3.3: Pairwise tests to test for interaction between Genders within Degree type (adjustment = Holms test).
Value Df Sum of Sq F Pr(>F)
Female-Male : Bachelors -27451.77 1 11680798549 488.8585 3.43e-53
Female-Male : Doctorate -31923.87 1 15796569832 661.1095 1.10e-61
Female-Male : Masters -29902.26 1 13859248079 580.0298 6.80e-58
Residuals NA 180 4300925127 NA NA

This Post-Hoc Analysis shows values for differences between Genders within the different Degree Types we have used in this study. We can say that there is a significant difference (P-Value < 0.05) in Median Income in the US for each Interaction.

Since the order goes Female - Male, the values in the “Value” column are relevant to Female as they come first. Meaning the negative value for each interaction shows that the difference lies with Men having a higher average with regards to Median Income in the US, for our three Degree Types.

Table 3.4: Pairwise tests to test for interaction between Degree type within Genders (adjustment = Holms test).
Value Df Sum of Sq F Pr(>F)
Bachelors-Doctorate : Female -35284.35 1 19297278294 807.6193 9.49e-68
Bachelors-Masters : Female -15932.74 1 3934710117 164.6734 3.46e-27
Doctorate-Masters : Female 19351.61 1 5804516290 242.9275 9.55e-35
Bachelors-Doctorate : Male -39756.45 1 24498919395 1025.3156 1.83e-75
Bachelors-Masters : Male -18383.23 1 5238116361 219.2228 1.17e-32
Doctorate-Masters : Male 21373.23 1 7080629111 296.3347 2.75e-39
Residuals NA 180 4300925127 NA NA

Furthermore, this Post-Hoc Analysis with regards to the differences between Degrees within Genders shows negative values for Bachelors-Doctorate and Bachelors-Masters within each Gender type. Since the rules regarding the order are the same this shows that for both Genders, the Median Income for those with a Bachelors Degree has a lower mean value than the mean value of Median Income for those with a Masters or Doctorate Degree (for the same Gender).

Doctorate-Masters shows a positive value, meaning that for both Genders, the Median Income for those with a Doctorate Degree has a higher mean value than the mean value of Median Income for those with a Masters Degree (for the same Gender).

As all of the interactions show a significance level where P-Value < 0.05, we determine them to all be statistically significant differences and with less than a 5% probability to occur due to chance alone.

Effect Plot

Figure 3.3: An Effect plot showing the mean values for each grouping of Median Income by two categorical variables, Gender and Degree. With the mean values for Females by Degree type as a red line and blue for Males. With points plotted for each value.

As stated by (Jawaid, Thariq and Saba, 2019) an Effect Plot shows the mean response values at each level of a design parameter or process variable. We can see from our Effect Plot that the mean values are higher for each individual Degree Type if the Gender is male. The difference between the median income of genders (with bachelors or over) is one of our main effects, which we have determined to be statistically significant and not due to chance alone.

For each Gender we can see that Bachelors Degree have the lowest values and Doctorate has the highest. Which would make sense as the level of difficulty and time required to get one of these Degrees goes in order from Bachelors, Masters and then Doctorate. The difference between the different levels of Degree is our second main effect which we again determined to be statistically significant and not due to chance alone.

We can also see from our Effect Plot that there is a cross over where Females who achieve a Doctorate Degree have a higher mean value than that of Males who have a Bachelors.

Predicted Values

Figure 3.4: Predicted values plot, showing the mean values for Median Income ($) for each Gender and Degree type. With Bachelors as red, Doctorate as blue and Masters as green.

If there is a significant interaction the predicted value is the value of the response variable (Median Income) which is equal to the mean of all observations having that combination of factor levels (Owens, 2022). Which means that since we have a significant interaction (P-Value < 0.05) the predicted value for each pairing is equal to the mean of each pairing of independent variables (Gender and Degree).

This plot allows us to see more of a clearer picture as to how the values only cross over at the lowest mean value for Males and the highest mean value for Females. As we can see where the point for the Female side overtakes the lowest on the Male side.

We can determine that there is a significant interaction between Gender and Degree Type on Median income in the US from 1991-2021, yet the results were not quite as expected as it has only uncovered more that needs to be answered with regards to the “why?”. The significance of the interaction mainly shows that men are earning more when comparing the central tendencies of our pairings of groups, with only one cross over (being that of Female:Doctorate - Male:Bachelors).

One would expect from that on average a Doctorate Degree meant that you would earn more than someone with a Bachelors, but the data is interesting in that this is the only time the mean of Median Female Income surpasses that of the mean of Median Male Income.

If this is the case for mean values for Females with Doctorate degrees compared to Males with Bachelors then why is mean of Median Income for Females with a Masters Degree not higher than that of the mean value of Males with a Bachelors degree? A significant difference between Degree type itself is one main effect, but since there is also a significant difference between gender and the interaction between both.

On one hand, one may conclude that when looking at the interaction of our two independent variables, there must be more factors at play which have an effect of Median Income in the US which cause women to earn less despite their degree level.

On the other hand, it may not be the degree level itself that affects the Median Income Level in the US, but rather the number of years in education as a Doctorate Degree can take a further 5-8 years to achieve after completing a Masters Degree. Yet, this would not explain why Females with a Doctorate Degree have only slightly higher mean values than the mean values of Males with a Bachelors.

Further research and analysis of other factors which have an effect on Median Income levels in the US will help us uncover our question for the “why?”. Since we have determined that education attainment does not guarantee equal pay for both Genders, as there is a significant difference between and within both combinations of our interactions (between Genders within Degree, between Degree Type within Genders).

Other factors which may affect Median Income in the US are for e.g. social pressures in and outside of the workplace and would be an interesting topic to uncover. Unemployment rate for those people with a bachelors degree or higher could as lead us into the right direction as to answering why the significant difference in Median Income occurs between Genders in the US.







Part 4 - Employment Status and Gender for those with a Degree in the US from 1991 - 2021.

Introduction

The final part of this project will be a continuation of what we have looked at so far. As we have discovered that there has been a significant rise in Median Female Income in the US, which has seen to be significantly different from that of Males.

During the previous part of this project we found a significant interaction between the Degree and Genders which has shown that Females earn less than Males for every Degree Type out of Bachelors, Masters and Doctorate, except for the one mean value for Females Median Income with a Doctorate which was a higher mean of Median Income that of a Male with Bachelors

We will look deeper into the numbers regarding Males and Females over the age of 25 in the US with a Bachelors Degree or higher (Including professional degree in this part of the study), and the counts of the population regarding their employment status for each of the years.

As stated by Carey and Hacket (2022). In 2021 in the US, the ratio by Gender was 98 males per 100 females. From this ratio, we would expect more Females 25 and over, who have a Bachelors or higher to be in employment in comparison to males.

The Research Question for this study is as follows:

Is there an association between Gender and Employment Status for those who are 25 and over, with a Bachelor’s Degree or higher in the US from 1991-2021?

To answer the question whether there is any significant association between the Gender of those who have a Bachelors Degree or higher and their Employment Status. A hypothesis will be made and analysed using the relevant test statistic

Chi-Square Test:

As we are working with population data, we will use the population as counts for each pairings of category. Our data consists of two categorical variables. Gender: Male, Female. Employment Status: Employed, Unemployed.

The Chi Square Test of Independence is a nonparametric test which determines whether there are associations or differences between two categorical or nominal variables. In this case of our data set, the expected counts are unknown and therefore a test of association will be done to determine whether the character frequencies of our two groups Gender and Employment Status, have a significant association with one another.

Hypothesis:

  • H0: There is no association between Gender and Employment Status for those 25 and over, with a Bachelor’s Degree or higher in the US.

  • H1: There is an association between Gender and Employment Status for those 25 and over, with a Bachelor’s Degree or higher in the US.

For this study we set a significance level of 0.05, which means we are willing to say that the there is a 5% chance that the results will occur due to chance alone. Only when our p-value is lower than our significance level of 0.05 can we reject the Null Hypothesis and determine that the Research Hypothesis is more attractive.

Method

To start our analysis the relevant packages are loaded into R Studio.

#Loading Packages
library(kableExtra)
library(dplyr)
library(knitr)
library(ggplot2)
library(corrplot)
library(vcd)

Then the data has been sourced from www.beta.bls.gov. Multiple tables have been downloaded for both Genders with the key words of “25 Years and Over”, “Bachelors Degree”, “Employed”, “Unemployed”. Since the tables were separated by Gender, Employment Status and for the Female Data by race. Once downloaded the data was transformed in Excel and loaded into R studio for analysis.

Data Set

Population Data

Table 4.1: BLS Beta Labs data regarding Total Employed/Unemployed from 2015-2021 (Q1-Q4) by Gender. The count of this data is in thousands
Year Q Emp.Status Gender Total.Count
2015 Q1 Unemployed Male 485
2015 Q2 Unemployed Male 78
2015 Q3 Unemployed Male 71
2015 Q4 Unemployed Male 71
2016 Q1 Unemployed Male 504
2016 Q2 Unemployed Male 70
... NA NA NA ...
2020 Q3 Employed Female 22868
2020 Q4 Employed Female 22886
2021 Q1 Employed Female 22932
2021 Q2 Employed Female 23380
2021 Q3 Employed Female 23579
2021 Q4 Employed Female 23746

This is how the data looked once it was transformed and loaded into R Studio. It provides count data of the total population in the US (in thousands), for those 25 Years and Over with a Bachelors Degree or higher. Separated into Q1-4 (quarter) for each year, and by Gender and Employment Status.

In order for keep our Chi-Square Test of Independence fair and since we are looking at population data throughout the different years, we will take a sample of this data set by looking specifically at one year and one quarter. This will be done by using R to filter the data by a random year and quarter

Sample Data

Table 4.2: Random Year and Q selected to generate a Sample from our original data from BLS Beta Labs data. Showing Total Employed/Unemployed by Gender. The count of this data is in thousands (K)
Year Q Emp.Status Gender Total.Count
2016 Q2 Unemployed Male 70
2016 Q2 Unemployed Female 106
2016 Q2 Employed Male 21386
2016 Q2 Employed Female 19867

Our sample data is for 2016 in Q2.

Contingency Table

Table 4.3: Contingency Table taken from our Random Sample, for the year 2016 and Q2, showing counts (in thousands) for the pair of our categorical vairables.
Female Male
Employed 19867 21386
Unemployed 106 70

From the initial look at our table we can that for the year 2016 Q2, there are more Males who are employed than Females, 21,386 for Employed males and 19867 for Employed Females (in thousands). More Females are seen to be Unemployed than Males for those 25 years and Over with a Bachelors Degree or higher, with values of 106 for Females and 70 for Males (in thousands).

Since this data is in thousands, when converting it back to real numbers the difference in Employment status can seem a lot more substantial. With the numbers of Employed 21,386,000 and 19,867,000 for Males and Females Respectively. Whether this difference of over 1,000,000 is a sign of a significant association or not is what we will determine in this study.

Observed Values

Yates Correction

Observed values are the values which are seen in our data within each category pair.

To determine whether we should use Yates Correction or not we need to determine if the total N of our population is lower than 40. As stated by (Giannini, 2005) Yates correction is used to compensated for deviation from the theoretical probability distribution when the total N for a 2x2 Chi-Square table is less than 40. When the sum of all our observed values is less than 40 Yates correction is used to make a more accurate analysis.

There is no need to calculate this number, as we can clearly see the N is larger than 40. Since each group is larger than 40. Therefore we can continue with the next stage of our analysis.

Expected Values

Fishers Exact Test

To determine whether we should use Fishers exact test or not we will check the Expected Values. Expected Values are the frequency that we would expect in a cell on average if the variables are independent (Minitab, 2023).

Fishers exact test is used when 20% or more of the Expected Values have a count of 5 or lower (Nowacki, 2017). Again, it is used to make a more statistically accurate analysis when comparing the Observed and Expected values.

Therefore, we run a Chi-Square Test with our contingency table and plot the expected values to determine whether we should use Fishers Exact Test or not.

Table 4.4: Expected Values of our random sample of the population data. The count of this data is in thousands (K)
Employment
Expected Values
Female Male
Employed 19888.15 21364.85
Unemployed 84.85 91.15

None of the Expected values are lower than 5 and all the assumptions of the Chi-Square Test of Independence are met, so we continue we will continue our analysis with the regular Chi-Square Test of Independence to analyse whether there is an association or not between our two categorical variables.

Results

Report: X-squared(1) = 10.223, P Value < 0.05


    Pearson's Chi-squared test

data:  ContingencyTable
X-squared = 10.223, df = 1, p-value = 0.001387

From our results of Pearson’s Chi-Sqaured Test of Independence we get the result of a P-Value < 0.05. Therefore we are able to reject the Null Hypothesis that there is a significant association between Gender and Employment Status for those 25 and over, with a Bachelors Degree or higher in the US from 1991-2021.

Discussion

Observed Values, Expected Values and Chi-Square Components

Table 4.5: Observed Values, Expected Values and the Chi-Square Components of our random sample of the population data. The count of this data is in thousands (K)
Observed Values
Expected Values
Chi-Squared Components
Female Male Female Male Female Male
Employed 19867 21386 19888.15 21364.85 0.0225 0.0209
Unemployed 106 70 84.85 91.15 5.2720 4.9076

When comparing the Values of our Chi-Square Test it is good to look first at the Chi-Squared Components. Chi Square Components are the residuals of our test squared. The residuals are how much the Observed Values differ from the Expected Values.

For Females a Chi-Squared Component value of 5.2720 in the Unemployed Row, shows that the Observed Values for Unemployed Females are very different from what is Expected Values. When looking at the same row but for Males, we see a Chi-Squared Component of 4.9, which provides the same explanation of a large difference between Observed and Expected Values for Males.

Since the Employed column shows Chi-Squared Values of 0.0225 and 0.0209 for Men and Women respectively, we will not worry about this column as this will not be where the significant association lies.

Although, Chi-Squared Components do not show the direction by which the difference occurs. This can simply be done by comparing the Observed and Expected values of each categorical variable.

Again just looking at Unemployed for both Gender, we can see that for Females the Observed Value is 106,000 (106, Translated to real world numbers) as compared to the Expected Value of 84,950 (or 84.85). Showing a Positive Correlation between Females and Unemployment.Since our P-Value < 0.05 this means that there are significantly more Unemployed Females than we would Expect and are due to factors other than chance alone.

The reverse is shown to be true for Males, with an Observed Value of 70,000 (70) and an Expected Value of 91,150 (91.15), this shows that there are significantly less Unemployed Males than we would Expect. A negative correlation. Which again we can conclude that these results are due to factors other than chance alone (P-Value < 0.05).

Visualization

Figure 4.1: Association Plot showing Pearson residuals for our Chi Squared test of the association between Gender and Employment Status. A positive association between Gender and Employment status is indicated with a bar above the dotted line, A negative association between Gender and Employment status is indicated with a bar below the dotted line. The strength of the association is indicated by the size of the bar.

This plot shows the Pearson Residuals for our Chi-Square Test for each pair of our two categorical variables Gender and Employment Status. It allows us to get more of a visual understanding as to where the association lies between Gender and Employment Status for our sample data set.

The line above the bar shows that more Females are Observed to be Unemployed than Expected, and the line below the bar shows that less Males are Observed to be Unemployed than expected.

The P-Value of 0.001387 shows a high significance in the correlation between Gender and Employment status. As highlighted by the blue and red bars, we can see that the the significance lies in Unemployment. The grey highlights than there is no significant association in these results with regards to those who are Employed.

The line above the bar shows that more Females are Observed to be Unemployed than Expected, and the line below the bar shows that less Males are Observed to be Unemployed than expected.

Conclusion

From our results we conclude that there is a significant association (P-Value < 0.05) between Gender and Employment Status in the US for those who are 25 and over, with a Bachelors Degree or higher.

Although, the significance of our association only shows on the Unemployed side. We will not use Gender as a determining factor which decides whether or whether gets gets a job (If they have a degree). Which is still a positive result from a societal point of view. Furthermore, there is still a significant positive correlation between Females and Unemployed.

Yet, we must realize that these results alone do not explain all the factors at play. Simply they show a correlation within our sample of the population data, rather than the cause of unemployment is due to the fact that they are Female

We conclude from this analysis that the reason “why?” this might occur would not be due to Gender alone, but due to more social factors and norms which Females face in society. Further analysis should be done to test these social factors on an index, determine if they have a significant association to Employment Status and make a comparison by Gender.

One must also consider our differences in nature, such as having a baby. Which may cause some more women to leave Employment. This can also be studied by comparing Unemployed Females to due to being fired/quit to those who have left for maternal reasons. If these studies prove that maternal reasons are why there is a correlation, then hopefully as time goes on and more people can work remotely, we won’t see a significant correlation anymore.

Also, from this study we have not concluded that one Gender is more likely to get a degree than the other gender. Our results could have possibly be skewed simply due to the fact that there a less Females with a Bachelors Degree or higher than Male. Therefore, further research could be done to test the significance of differences in educational attainment by gender.

Even though the Educational Equity Act was put in place in 1974, and Gender Equity Act in 1994 (NWHP, 2023), we still observed a lot more Males with a Bachelors than Females observed in our sample data set (Employed or Unemployed). More research could therefore be done to determine what social factors the different genders may face on an index and compare this number to their educational attainment.







References

LS0tDQp0aXRsZTogIkdlbmRlciBhbmQgSW5jb21lIGluIHRoZSBVUyINCm91dHB1dDogaHRtbF9ub3RlYm9vaw0KLS0tDQoNCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQ0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBUUlVFKQ0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KCkNCmBgYA0KDQpcDQoNCiMjIyBbKipFeGVjdXRpdmUgU3VtbWFyeSoqXXsudW5kZXJsaW5lfQ0KDQpUaGlzIGNvbXByZWhlbnNpdmUgc3RhdGlzdGljYWwgYW5hbHlzaXMgaW52ZXN0aWdhdGVzIHZhcmlvdXMgYXNwZWN0cyBvZiBnZW5kZXIgYW5kIGluY29tZSBkeW5hbWljcyBpbiB0aGUgVW5pdGVkIFN0YXRlcyBzcGFubmluZyBzZXZlcmFsIGRlY2FkZXMuIEZvdXIgZGlzdGluY3QgcGFydHMgZXhwbG9yZSBkaWZmZXJlbnQgZGltZW5zaW9ucyBvZiB0aGUgcmVsYXRpb25zaGlwIGJldHdlZW4gZ2VuZGVyIGFuZCBpbmNvbWUsIHV0aWxpemluZyBkaWZmZXJlbnQgc3RhdGlzdGljYWwgdGVzdHMgdG8gZGVyaXZlIG1lYW5pbmdmdWwgY29uY2x1c2lvbnMuXA0KXA0KDQojIyMjIFsqKlBhcnQgMTogRmVtYWxlIEluY29tZSBUcmVuZHMgKDE5NjcgLSAyMDIxKSoqXXsudW5kZXJsaW5lfSANCg0KKioqUmVzZWFyY2ggUXVlc3Rpb246KioqIEhhcyB0aGVyZSBiZWVuIGEgc2lnbmlmaWNhbnQgaW5jcmVhc2UgaW4gTWVkaWFuIEZlbWFsZSBJbmNvbWUgZnJvbSAxOTY3IHRvIDIwMjE/DQoNCioqKlN0YXRpc3RpY2FsIFRlc3Q6KioqIExpbmVhciBSZWdyZXNzaW9uDQoNCioqKktleSBGaW5kaW5nczoqKiogVGhlIGFuYWx5c2lzIHJldmVhbHMgYSBzaWduaWZpY2FudCBpbmNyZWFzZSBpbiBtZWRpYW4gZmVtYWxlIGluY29tZSBvdmVyIHRoZSBzcGVjaWZpZWQgcGVyaW9kLCBhcyBpbmRpY2F0ZWQgYnkgYSBoaWdobHkgc2lnbmlmaWNhbnQgcC12YWx1ZSAoXDwgMC4wNSkuIFRoaXMgc3VnZ2VzdHMgYSBwb3NpdGl2ZSB0cmVuZCBpbiBmZW1hbGUgaW5jb21lIG92ZXIgdGltZSwgY29udHJpYnV0aW5nIHRvIGFuIGVuaGFuY2VkIHN0YW5kYXJkIG9mIGxpdmluZyBmb3Igd29tZW4gaW4gdGhlIFVTLlwNClwNCg0KIyMjIyBbKipQYXJ0IDI6IEdlbmRlciBJbmNvbWUgRGlzcGFyaXR5ICgxOTY3IC0gMjAyMSkqKl17LnVuZGVybGluZX0gDQoNCioqKlJlc2VhcmNoIFF1ZXN0aW9uOioqKiBJcyB0aGVyZSBhIHNpZ25pZmljYW50IGRpZmZlcmVuY2UgaW4gTWVkaWFuIE1hbGUgYW5kIEZlbWFsZSBJbmNvbWUgZnJvbSAxOTY3IHRvIDIwMjE/DQoNCioqKlN0YXRpc3RpY2FsIFRlc3Q6KioqIFQtVGVzdCBmb3IgSW5kZXBlbmRlbnQgU2FtcGxlcw0KDQoqKipLZXkgRmluZGluZ3M6KioqIFRoZSBzdHVkeSB1bmNvdmVycyBhIHNpZ25pZmljYW50IGRpc3Bhcml0eSBpbiBpbmNvbWVzIGJldHdlZW4gZ2VuZGVycyBpbiB0aGUgVVMsIGFzIHRoZSByZXN1bHRhbnQgcC12YWx1ZSAoXDwgMC4wNSkgYW5kIHRoZSBtZWRpYW4gaW5jb21lIGZvciBtYWxlcyBoYXMgY29uc2lzdGVudGx5IGJlZW4gdGhhbiB0aGF0IG9mIGZlbWFsZXMgb3ZlciB0aGUgcGVyaW9kIGV4YW1pbmVkLiBEZXNwaXRlIGxlZ2lzbGF0aXZlIGVmZm9ydHMgc3VjaCBhcyB0aGUgRXF1YWwgUGF5IEFjdCwgYSBzdWJzdGFudGlhbCBnZW5kZXIgcGF5IGdhcCBwZXJzaXN0cywgaW5kaWNhdGl2ZSBvZiB1bmRlcmx5aW5nIHN0cnVjdHVyYWwgYW5kIHNvY2lldGFsIGZhY3RvcnMgaW5mbHVlbmNpbmcgaW5jb21lIGRpc3RyaWJ1dGlvbi5cDQpcDQoNCiMjIyMgWyoqUGFydCAzOiBHZW5kZXIsIEluY29tZSwgYW5kIERlZ3JlZXMgKDE5OTEgLSAyMDIxKSoqXXsudW5kZXJsaW5lfSANCg0KKioqUmVzZWFyY2ggUXVlc3Rpb246KioqIElzIHRoZXJlIGFuIGludGVyYWN0aW9uIGJldHdlZW4gR2VuZGVyIGFuZCBEZWdyZWUgVHlwZSBvbiBNZWRpYW4gSW5jb21lIExldmVsIGZyb20gMTk5MSB0byAyMDIxPw0KDQoqKipTdGF0aXN0aWNhbCBUZXN0OioqKiBUd28tV2F5IEFOT1ZBDQoNCioqKktleSBGaW5kaW5nczoqKiogVGhpcyBhbmFseXNpcyByZXZlYWxzIGEgc2lnbmlmaWNhbnQgcC12YWx1ZSAoXDwgMC4wNSkgd2l0aCByZWdhcmRzIHRvIG1lZGlhbiBpbmNvbWUgbGV2ZWxzIGluIGJvdGggdGhlIG1haW4gZWZmZWN0cy0tLWdlbmRlciBhbmQgZGVncmVlIHR5cGUtLS1hcyB3ZWxsIGFzIHRoZWlyIGludGVyYWN0aW9ucy4gV2hpbGUgZWR1Y2F0aW9uYWwgYXR0YWlubWVudCBkZW1vbnN0cmF0ZXMgYSBwb3NpdGl2ZSBpbmZsdWVuY2Ugb24gaW5jb21lLCBzaWduaWZpY2FudCBnZW5kZXIgZGlzcGFyaXRpZXMgcGVyc2lzdCBhY3Jvc3MgZGVncmVlIHR5cGVzLCBzdWdnZXN0aW5nIHRoZSBwcmVzZW5jZSBvZiBjb21wbGV4IGZhY3RvcnMgYmV5b25kIGVkdWNhdGlvbiBjb250cmlidXRpbmcgdG8gaW5jb21lIGRpZmZlcmVudGlhbHMuXA0KXA0KDQojIyMjIFsqKlBhcnQgNDogRW1wbG95bWVudCBTdGF0dXMgYW5kIEdlbmRlciAoMTk5MSAtIDIwMjEpKipdey51bmRlcmxpbmV9IA0KDQoqKipSZXNlYXJjaCBRdWVzdGlvbjoqKiogSXMgdGhlcmUgYW4gYXNzb2NpYXRpb24gYmV0d2VlbiBHZW5kZXIgYW5kIEVtcGxveW1lbnQgU3RhdHVzIGZvciB0aG9zZSB3aXRoIGEgQmFjaGVsb3IncyBEZWdyZWUgb3IgaGlnaGVyIGZyb20gMTk5MSB0byAyMDIxPw0KDQoqKipTdGF0aXN0aWNhbCBUZXN0OioqKiBDaGktU3F1YXJlIFRlc3QgZm9yIEluZGVwZW5kZW5jZQ0KDQoqKipLZXkgRmluZGluZ3M6KioqIFRoZSBzdHVkeSBpZGVudGlmaWVzIGEgc2lnbmlmaWNhbnQgcC12YWx1ZSAoXDwgMC4wNSkgaW5kaWNhdGluZyBhbiBhc3NvY2lhdGlvbiBiZXR3ZWVuIGdlbmRlciBhbmQgZW1wbG95bWVudCBzdGF0dXMsIHBhcnRpY3VsYXJseSBpbiB0aGUgY29udGV4dCBvZiB1bmVtcGxveW1lbnQuIFdoaWxlIGdlbmRlciBhbG9uZSBtYXkgbm90IGRldGVybWluZSBlbXBsb3ltZW50IG91dGNvbWVzLCBzb2NpYWwgZmFjdG9ycyBhbmQgbm9ybXMgYXJlIGxpa2VseSB0byBiZSBjb250cmlidXRpbmcgZmFjdG9ycyBpbiB0aGUgb2JzZXJ2ZWQgZGlzcGFyaXRpZXMuIFdoaWNoIHVuZGVyc2NvcmVzIHRoZSBpbXBlcmF0aXZlIGZvciBmdXJ0aGVyIGV4cGxvcmF0aW9uIGludG8gdGhlIG11bHRpZmFjZXRlZCBkZXRlcm1pbmFudHMgb2Ygd29ya2ZvcmNlIHBhcnRpY2lwYXRpb24uXA0KXA0KDQojIyMjIFsqKk92ZXJhbGwgSW1wbGljYXRpb25zOioqXXsudW5kZXJsaW5lfQ0KDQpUaGVzZSBmaW5kaW5ncyBjb2xsZWN0aXZlbHkgaGlnaGxpZ2h0IHRoZSBwZXJzaXN0ZW5jZSBvZiBnZW5kZXItYmFzZWQgaW5jb21lIGRpc3Bhcml0aWVzIGluIHRoZSBVUyBkZXNwaXRlIGxlZ2lzbGF0aXZlIGVmZm9ydHMgYW5kIHNvY2lldGFsIGFkdmFuY2VtZW50cy4gV2hpbGUgZWR1Y2F0aW9uYWwgYXR0YWlubWVudCBwb3NpdGl2ZWx5IGNvcnJlbGF0ZXMgd2l0aCBpbmNvbWUsIHNpZ25pZmljYW50IGdlbmRlciBkaWZmZXJlbmNlcyBwZXJzaXN0IGFjcm9zcyBlZHVjYXRpb25hbCBsZXZlbHMgYW5kIGVtcGxveW1lbnQgc3RhdHVzZXMuIFRoaXMgZW1waGFzaXplcyB0aGUgbmVjZXNzaXR5IGZvciBvbmdvaW5nIGVuZGVhdm9ycyBhaW1lZCBhdCBhZGRyZXNzIHRoZSB1bmRlcmx5aW5nIHNvY2lldGFsIGluZXF1YWxpdGllcy4gRnVydGhlciByZXNlYXJjaCBpbnRvIGV4dGVybmFsIGZhY3RvcnMgaW5mbHVlbmNpbmcgaW5jb21lIGR5bmFtaWNzIGFuZCB3b3JrZm9yY2UgcGFydGljaXBhdGlvbiBpcyBpbXBlcmF0aXZlIHRvIGVsdWNpZGF0ZSB0aGUgcmVhc29ucyBiZWhpbmQgdGhlIHBlcnNpc3RlbmNlIG9mIHRoZSB3YWdlIGdhcCBpbiB0aGUgVW5pdGVkIFN0YXRlcy4gU3VjaCBpbnNpZ2h0cyBhcmUgZXNzZW50aWFsIGZvciBkZXZlbG9waW5nIHRhcmdldGVkIGludGVydmVudGlvbnMgdGhhdCBwcm9tb3RlIGdlbmRlciBlcXVpdHkgaW4gaW5jb21lIGRpc3RyaWJ1dGlvbiBhbmQgZWNvbm9taWMgb3Bwb3J0dW5pdGllcy5cDQpcDQpcDQpcDQpcDQpcDQpcDQpcDQoNCiMjIyBbKipQYXJ0IDEgLSBGZW1hbGUgSW5jb21lIGluIHRoZSBVUyBmcm9tIDE5NjcgLSAyMDIxLioqXXsudW5kZXJsaW5lfQ0KDQojIyMgWyoqSW50cm9kdWN0aW9uKipdey51bmRlcmxpbmV9DQoNClNpbmNlIHRoZSBlYXJseSAxOTAwcyBpbiB0aGUgVVMgd29tZW4gaGF2ZSBnYWluZWQgbW9yZSBvZiBhbiBlcXVhbCBzdGFuZGluZyBpbiBzb2NpZXR5LiAxOTIwIHdhcyBhIG1ham9yIHllYXIgZm9yIFdvbWFuJ3MgcmlnaHRzLCB0aGUgbmluZXRlZW50aCBhbWVuZG1lbnQgdG8gdGhlIFUuUyBjb25zdGl0dXRpb24gd2FzIHJhdGlmaWVkIChOV0hQLCAyMDIzKSwgdGhpcyBhbWVuZG1lbnQgZ2F2ZSB3b21lbiB0aGUgcmlnaHQgdG8gdm90ZS4gRnVydGhlciBwcm9ncmVzcyB3YXMgbWFkZSB0b3dhcmRzIGFuIGVxdWFsIHNvY2lldHkgdGhyb3VnaG91dCB0aGUgMTkwMHMsIGZvciBleGFtcGxlIGluIDE5NzggdGhlIGNvdXJ0IHJ1bGVkIGludG8gZWZmZWN0IHRoZSBQcmVnbmFuY3kgRGlzY3JpbWluYXRpb24gQWN0IChOV0hQLCAyMDIzKS4gV2hpY2ggYmFubmVkIGVtcGxveW1lbnQgZGlzY3JpbWluYXRpb24gYWdhaW5zdCBwcmVnbmFudCB3b21lbi4NCg0KV29tZW4gc3Rvcm1lZCB0aHJvdWdoIHRoZSAxOTYwcyBhcyBhIHBhcnQgb2YgdGhlIGZlbWluaXN0IG1vdmVtZW50LiAxOTY3IGluIHBhcnRpY3VsYXIgd2FzIHBhcnQgb2YgdGhlIHNlY29uZCB3YXZlIG9mIGZlbWluaXNtIChCaW5naGFtdG9uIFVuaXZlcnNpdHksIDIwMjQpLiBUaGlzIG1vdmVtZW50IHdhcyBzZXQgb3V0IHRvIGZpZ2h0IGZvciBlcXVhbCByaWdodHMgYmV0d2VlbiBnZW5kZXJzIGFzIHByZXZpb3VzbHkgaW4gaGlzdG9yeSB3b21lbiBoYXZlIGdvbmUgdGhyb3VnaCBtdWNoIGhhcmRzaGlwLg0KDQpQYXJ0IG9uZSBvZiB0aGlzIHN0dWR5IGlzIHRoZXJlZm9yZSBzZXQgb3V0IHRvIGRldGVybWluZSB3aGV0aGVyIGFueSBwcm9ncmVzcyBoYXMgYmVlbiBtYWRlIHNpbmNlIHRoZSBzZWNvbmQgd2F2ZSBvZiBmZW1pbmlzbSBpbiAxOTY3LiBUaGlzIHdpbGwgYmUgZG9uZSBieSBhbmFseXppbmcgd2hldGhlciB0aGVyZSBoYXMgYmVlbiBhIHNpZ25pZmljYW50IGluY3JlYXNlIGluIE1lZGlhbiBGZW1hbGUgSW5jb21lIGluIHRoZSBVUyBmcm9tIDE5NjcgLSAyMDIxLlwNClwNClRoZXJlZm9yZSwgdGhlIHJlc2VhcmNoIHF1ZXN0aW9uIHRvIGJlIGFuc3dlcmVkIGluIHRoaXMgc3R1ZHkgaXM6XA0KXA0KKkhhcyB0aGVyZSBiZWVuIGEgc2lnbmlmaWNhbnQgaW5jcmVhc2UgaW4gTWVkaWFuIEZlbWFsZSBJbmNvbWUgZnJvbSAxOTY3IC0gMjAyMT8qXA0KXA0KDQojIyMjIFtMaW5lYXIgUmVncmVzc2lvbjpdey51bmRlcmxpbmV9DQoNClRoZSBzdGF0aXN0aWNhbCB0ZXN0IHdoaWNoIHdpbGwgYmUgdXNlZCBpbiB0aGlzIHN0dWR5IGlzIGxpbmVhciByZWdyZXNzaW9uLCBhcyB3ZSBhcmUgbG9va2luZyB0byBkZXRlcm1pbmUgd2hldGhlciB0aGVyZSBpcyBhIHNpZ25pZmljYW50IHJlbGF0aW9uc2hpcCBiZXR3ZWVuIG91ciB0d28gdmFyaWFibGVzOg0KDQotICAgVGltZSBpbiBZZWFycw0KDQotICAgTWVkaWFuIEZlbWFsZSBJbmNvbWUgKFwkKQ0KDQpUaGUgZm9ybXVsYSBmb3IgTGluZWFyIHJlZ3Jlc3Npb24gaXM6DQoNCi0gICBZID0gzrIwICsgzrIxWA0KDQpXaGVyZToNCg0KLSAgIFkgaXMgdGhlIGRlcGVuZGVudCB2YXJpYWJsZQ0KDQotICAgWCBpcyB0aGUgZXhwbGFuYXRvcnkgdmFyaWFibGUNCg0KLSAgIM6yMCBpcyB0aGUgaW50ZXJjZXB0LCB0aGUgdmFsdWUgb2YgWSB3aGVuIFggPSAwDQoNCi0gICDOsjEgaXMgdGhlIHNsb3BlIG9mIHRoZSBsaW5lYXIgcmVncmVzc2lvbiBsaW5lDQoNCk91ciBGb3JtdWxhOg0KDQotICAgTWVkaWFuIEZlbWFsZSBJbmNvbWUgPSDOsjAgKyDOsjEoVGltZSBpbiBZZWFycylcDQogICAgXA0KDQojIyMjIFtIeXBvdGhlc2lzOl17LnVuZGVybGluZX0NCg0KSW4gb3JkZXIgdG8gYW5zd2VyIHRoaXMgcXVlc3Rpb24gd2UgbmVlZCB0byBzZXQgb3VyIE51bGwgYW5kIFJlc2VhcmNoIEh5cG90aGVzaXMsIGFuZCBsZXZlbCBvZiBzaWduaWZpY2FuY2UuDQoNCk51bGwgSHlwb3RoZXNpczoNCg0KLSAgIEgwOiDOsjEgPSAwDQoNCs6yMSByZXByZXNlbnRzIHRoZSBzbG9wZSBjb2VmZmljaWVudCBhc3NvY2lhdGVkIHdpdGggWSAoTWVkaWFuIEZlbWFsZSBJbmNvbWUpLg0KDQpPdXIgTnVsbCBIeXBvdGhlc2lzIGlzIHRoYXQgdGhlIHNsb3AgaXMgZXF1YWwgdG8gMC4gTWVhbmluZyB0aGF0IHRoZXJlIGlzIG5vIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIFggKFRpbWUgaW4gWWVhcnMpIGFuZCBZDQoNClJlc2VhcmNoIEh5cG90aGVzaXM6DQoNCi0gICBIMTogzrIxIFw+IDANCg0KU2luY2Ugd2UgYXJlIHRlc3Rpbmcgd2hldGhlciB0aGVyZSBoYXMgYmVlbiBhIHNpZ25pZmljYW50IGluY3JlYXNlIGluIE1lZGlhbiBGZW1hbGUgSW5jb21lIGZyb20gMTk2Ny0yMDIxLiBXZSBhcmUgdGVzdGluZyB3aXRoIG91ciBSZXNlYXJjaCBIeXBvdGhlc2lzIHRoYXQgdGhlIHNsb3BlIGNvZWZmaWNpZW50IM6yMSBpcyAqZ3JlYXRlciB0aGFuKiAwLg0KDQpGb3IgdGhpcyBzdHVkeSB3ZSBzZXQgYSBzaWduaWZpY2FuY2UgbGV2ZWwgb2YgMC4wNSwgd2hpY2ggbWVhbnMgd2UgYXJlIHdpbGxpbmcgdG8gc2F5IHRoYXQgdGhlIHRoZXJlIGlzIGEgNSUgY2hhbmNlIHRoYXQgdGhlIHJlc3VsdHMgd2lsbCBvY2N1ciBkdWUgdG8gY2hhbmNlIGFsb25lLiBPbmx5IHdoZW4gb3VyIHAtdmFsdWUgaXMgbG93ZXIgdGhhbiBvdXIgc2lnbmlmaWNhbmNlIGxldmVsIG9mIDAuMDUgY2FuIHdlIHJlamVjdCB0aGUgTnVsbCBIeXBvdGhlc2lzIGFuZCBkZXRlcm1pbmUgdGhhdCB0aGUgUmVzZWFyY2ggSHlwb3RoZXNpcyBpcyBtb3JlIGF0dHJhY3RpdmUuXA0KXA0KDQojIyMgWyoqTWV0aG9kKipdey51bmRlcmxpbmV9DQoNClRvIHN0YXJ0IG91ciBhbmFseXNpcyB0aGUgcmVsZXZhbnQgcGFja2FnZXMgYXJlIGxvYWRlZCBpbnRvIFIgU3R1ZGlvLg0KDQpgYGB7ciBlY2hvPVRSVUUsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQojUGFja2FnZXMNCmxpYnJhcnkoa25pdHIpDQpsaWJyYXJ5KGthYmxlRXh0cmEpDQpsaWJyYXJ5KGdncGxvdDIpDQpsaWJyYXJ5KGRwbHlyKQ0KYGBgDQoNClRoZW4gdGhlIGRhdGEgaXMgc291cmNlZCBhbmQgZG93bmxvYWRlZCBmcm9tIHd3dy5jZW5zdXMuZ292LiBUYWJsZSBBLTc6IE51bWJlciBvZiBSZWFsIE1lZGlhbiBFYXJuaW5ncyBvZiBUb3RhbCBXb3JrZXJzIGFuZCBGdWxsIHRpbWUsIFllYXItUm91bmQgV29ya2VycyBieSBTZXggYW5kIEZlbWFsZS10by1NYWxlIEVhcm5pbmdzIFJhdGlvOiAxOTYwIC0gMjAyMS4NCg0KRm9yIHB1cnBvc2Ugb2YgdW5kZXJzdGFuZGluZzogVGhlIHdvcmQgIkVhcm5pbmdzIiB3aWxsIGJlIHVzZWQgaW50ZXJjaGFuZ2VhYmx5IHdpdGggIkluY29tZSIgYXMgdGhleSBhcmUgYm90aCB1c2VkIHRvIGRlc2NyaWJlIHRoZSBtb25leSBlYXJuZWQgZnJvbSBkaXJlY3QgZW1wbG95bWVudC4gRnVydGhlcm1vcmUsIHRoZSBkYXRhIHVzZWQgaW4gdGhpcyBzdHVkeSBpcyBmb3IgVG90YWwgV29ya2VycyBub3QgRnVsbC1UaW1lLCBZZWFyLVJvdW5kIFdvcmtlcnMuDQoNClRoZSBkYXRhIHdhcyBzdWJzZXF1ZW50bHkgdHJhbnNmb3JtZWQgaW4gRXhjZWwgZm9yIGRhdGEgY2xlYW5pbmcgcHVycG9zZXMgYW5kIGVhc2Ugb2YgbG9hZGluZyBpbnRvIFIuDQoNClJvd3MgZm9yIDIwMTcgYW5kIDIwMTMgaGF2ZSBiZWVuIHJlcGVhdGVkIGluIHRoZSBkYXRhIHNldCBkb3dubG9hZGVkIGZyb20gVVMgQ2Vuc3VzLCBzbyB3aGVuIGltcG9ydGVkIGludG8gZXhjZWwgSSBoYXZlIGNhbGN1bGF0ZWQgdGhlIGF2ZXJhZ2Ugb2YgdGhlc2Ugcm93cyBpbnN0ZWFkIG9mIGFsbG93aW5nIHR3byBpbnN0YW5jZXMgZm9yIHRoZSBzYW1lIHllYXIuDQoNCmBgYHtyIGluY2x1ZGU9RkFMU0V9DQpGZW1hbGVFYXJuaW5ncyA8LSByZWFkLmNzdigiQzovVXNlcnMvZWRyZW4vT25lRHJpdmUvRGVza3RvcC9EYXRhIEFuYWx5c2lzL1IgV29ya2luZyBEaXJlY3RvcnkvRmluYWwgUHJvamVjdCBBc3NpZ25tZW50L0RhdGFzZXRzL0RhdGFTZXRzL0ZlbWFsZSBFYXJuaW5ncyBUcmFuc2Zvcm1lZC5jc3YiKQ0KDQoNCiNDbGVhbiB1cA0KDQpuYW1lcyhGZW1hbGVFYXJuaW5ncykgPC0gYygiWWVhciIsICJGZW1hbGUuRWFybmluZ3MiKQ0KDQojQWRkaW5nIGEgTnVtYmVyIHRvIHllYXINCg0KRmVtYWxlRWFybmluZ3MgPC0gRmVtYWxlRWFybmluZ3MgJT4lDQogIGFycmFuZ2UoWWVhcikgJT4lDQogIG11dGF0ZShZZWFyTnVtID0gcm93X251bWJlcigpKQ0KYGBgDQoNCkFmdGVyIGZ1cnRoZXIgZGF0YSBjbGVhbmluZyBpbiBSLCBhIG51bWJlciB3YXMgZ2l2ZW4gdG8gZWFjaCB5ZWFyIHZhbHVlIHN0YXJ0aW5nIGF0IDE5NjcgYXMgMSwgMTk2OCBhcyAyLCBhbmQgc28gb24uIEluIG9yZGVyIHRvIG1ha2UgbW9yZSBzZW5zZSBvZiB0aGUgWCB2YWx1ZSB3aGVuIGNvbmR1Y3RpbmcgbGluZWFyIHJlZ3Jlc3Npb24gYW5kIG5vdCBza2V3IG91ciBhbmFseXNpcy4NCg0KYGBge3IgaW5jbHVkZT1GQUxTRX0NCiNJbml0aWFsIGxvb2sgYXQgdGhlIGRhdGENCg0KaGVhZChGZW1hbGVFYXJuaW5ncykNCg0KdGFpbChGZW1hbGVFYXJuaW5ncykNCg0KVGFibGVFYXJuaW5nczEgPC0gcmJpbmQoaGVhZChGZW1hbGVFYXJuaW5ncyksICIuLi4iLCB0YWlsKEZlbWFsZUVhcm5pbmdzKSkNCmBgYA0KDQpgYGB7ciBlY2hvPUZBTFNFfQ0Ka2FibGUoVGFibGVFYXJuaW5nczEsIHJvdy5uYW1lcyA9IEYsIGNhcHRpb24gPSAiVGFibGUgMS4xOiBVUyBDZW5zdXMgZGF0YSByZWdhcmRpbmcgTWVkaWFuIGVhcm5pbmdzIGZvciBUb3RhbCBGZW1hbGUgV29ya2VycyBmcm9tIDE5NjcgLSAyMDIxLiBUaGUgWWVhcnMgYXJlIG51bWJlcmVkIGluIG9yZGVyIHRvIG5vdCBza2V3IHRoZSBhbmFseXNpcyBsYXRlci4gTWVkaWFuIGZlbWFsZSBFYXJuaW5ncyBpbiBEb2xsYXJzIFVTICgkKS4iKSAlPiUNCiAga2FibGVfc3R5bGluZyhib290c3RyYXBfb3B0aW9ucyA9ICJzdHJpcGVkIikgJT4lDQogIHJvd19zcGVjKDAsIGJvbGQgPSBULCBmb250X3NpemUgPSAxNSkNCmBgYA0KDQpGcm9tIGZpcnN0IGdsYW5jZSBvZiBvdXIgZGF0YSB3ZSBjYW4gc2VlIHRoYXQgdGhlIE1lZGlhbiBGZW1hbGUgRWFybmluZ3MgaXMgYSBsb3QgaGlnaGVyIGluIDIwMjEgdGhhdCBpbiAxOTY3LCB3aXRoIHZhbHVlcyBvZiBcJDM5LDIwMSBhbmQgXCQxNiw3MjEgcmVzcGVjdGl2ZWx5Lg0KDQpJbiBvcmRlciB0byBkZXRlcm1pbmUgd2hldGhlciB0aGVyZSBoYXMgYmVlbiBhIHNpZ25pZmljYW50IGluY3JlYXNlIG9yIG5vdCBhIGxpbmVhciByZWdyZXNzaW9uIG1vZGVsIHdpbGwgYmUgbWFkZSBhbmQgdGhlIGFzc3VtcHRpb25zIHdpbGwgYmUgdGVzdGVkIHRvIGRldGVybWluZSB0aGUgZml0IG9mIHRoZSBtb2RlbC5cDQpcDQoNCiMjIyMgW01vZGVsIDE6XXsudW5kZXJsaW5lfQ0KDQpPdXIgTGluZWFyIFJlZ3Jlc3Npb24gTW9kZWwsIGZvbGxvd3Mgb3VyIG9yaWdpbmFsIGZvcm11bGEgb2YgWSA9IM6yMCArIM6yMVguIFdoZXJlIFkgaXMgTWVkaWFuIEZlbWFsZSBJbmNvbWUgYW5kIFggaXMgVGltZSBpbiB5ZWFycy4NCg0KYGBge3IgaW5jbHVkZT1GQUxTRX0NCiNDcmVhdGluZyB0aGUgaW5pdGlhbCByZWdyZXNzaW9uIG1vZGVsDQoNClJlZy5Nb2RlbDEgPC0gbG0oRmVtYWxlLkVhcm5pbmdzflllYXJOdW0sIGRhdGEgPSBGZW1hbGVFYXJuaW5ncykNCg0KI0NvZWZmaWNpZW50IFRhYmxlDQoNCk1vZGVsMVRhYmxlIDwtIFJlZy5Nb2RlbDEkY29lZmZpY2llbnRzDQoNCmBgYA0KDQoqKipUaGUgY29lZmZpY2llbnRzIGZvciBNb2RlbCAxIGFyZSBhcyBmb2xsb3dzOioqKg0KDQpgYGB7ciBlY2hvPUZBTFNFfQ0KDQprYWJsZSh0KE1vZGVsMVRhYmxlKSwgY2FwdGlvbiA9ICJUYWJsZSAxLjI6IExpbmVhciBSZWdyZXNzaW9uIE1vZGVsIDEuIFRoZSBpbnRlcmNlcHQgKGNvbnN0YW50KSDOsjAgYW5kIHRoZSBzbG9wZSAoY29lZmZpY2llbnQpIM6yMSwgd2hpY2ggYXJlIHVzZWQgd2l0aCB0aGUgcHJlZGljdG9yIFggdG8gYWNoaWV2ZSB0aGUgcmVzcG9uc2UgdmFyaWFibGUgWS4iLCBjb2wubmFtZXMgPSBjKCLOsjAgKEludGVyY2VwdCkiLCAizrIxIChTbG9wZSkiKSkgJT4lDQogIGthYmxlX3N0eWxpbmcoYm9vdHN0cmFwX29wdGlvbnMgPSAic3RyaXBlZCIpICU+JQ0KICByb3dfc3BlYygwLCBib2xkID0gVCwgZm9udF9zaXplID0gMTUpDQpgYGANCg0KRm9yIG91ciBMaW5lYXIgUmVncmVzc2lvbiBNb2RlbCAxIG91ciBjb25zdGFudCDOsjAgKEludGVyY2VwdCkgaXMgMTUzODMuMDggYW5kIHRoZSBzbG9wZSAoY29lZmZpY2llbnQpIM6yMSBpcyA0MDUuNjQwNS4NCg0KTWFraW5nIG91ciBGb3JtdWxhOg0KDQpQcmVkaWN0ZWQgWSA9IDE1MzgzLjA4ICsgNDA1LjY0MDUoWCkNCg0KV2hlcmU6DQoNCi0gICBQcmVkaWN0ZWQgWSBpcyB0aGUgUHJlZGljdGVkIE1lZGlhbiBGZW1hbGUgSW5jb21lIEdpdmVuIFgNCg0KLSAgIFggaXMgdGhlIFllYXIgTnVtYmVyIHN0YXJ0aW5nIHdpdGggMTk2NyBhcyAxDQoNClRoaXMgbWVhbnMgdGhhdCDOsjEgaXMgdGhlIGFtb3VudCBpbiBcJCBhZGRlZCB0byBNZWRpYW4gRmVtYWxlIEluY29tZSBmb3IgZWFjaCB1bml0IGluY3JlYXNlIGluIFllYXIgZnJvbSAxOTY3LCB3aXRoIHRoZSBzdGFydGluZyB2YWx1ZSBlcXVhbCB0byB0aGUgKGludGVyY2VwdCkgzrIwIHZhbHVlIG9mIDE1MzgzLjAzLlwNClwNCg0KKioqVmlzdWFsaXppbmcgbW9kZWwgMToqKioNCg0KYGBge3IgZWNobz1GQUxTRX0NCiNsaW5lYXJpdHkgY2hlY2sgMQ0KDQpnZ3Bsb3QoRmVtYWxlRWFybmluZ3MsIGFlcyh4ID0gWWVhciwgeSA9IEZlbWFsZS5FYXJuaW5ncykpICsNCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwgc2UgPSBGLCBjb2xvciA9ICJibHVlIikgKw0KICBnZW9tX3BvaW50KGNvbG9yPSJyZWQiKSsNCiAgdGhlbWVfbWluaW1hbChiYXNlX3NpemUgPSAxMikgKw0KICB0aGVtZShheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0LCAgdmp1c3QgPSAtNCwgaGp1c3QgPSAwLjQzKSwNCiAgICAgICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCwgdmp1c3QgPSA2LCBoanVzdCA9IDAuNiksDQogICAgICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE2LCB2anVzdCA9IDYpLA0KICAgICAgICBwbG90Lm1hcmdpbiA9IHVuaXQoYygxLDEsMSwxKSwgImNtIikpICsNCiAgbGFicyh0aXRsZSA9IGV4cHJlc3Npb24odW5kZXJsaW5lKCJNZWRpYW4gRmVtYWxlIEVhcm5pbmdzIGluIHRoZSBVUyBmcm9tIDE5NjctMjAyMSIpKSkgKw0KICB5bGFiKCJNZWRpYW4gRmVtYWxlIEVhcm5pbmdzICgkKSIpICsNCiAgeGxhYigiVGltZSBpbiBZZWFycyIpDQpgYGANCg0KRmlndXJlIDEuMTogU2NhdHRlciBQbG90IG9mIG91ciBVUyBDZW5zdXMgZGF0YSByZWdhcmRpbmcgTWVkaWFuIEVhcm5pbmdzIGZvciBXb21lbiBwbG90dGVkIG92ZXIgVGltZSBpbiBZZWFycy4gV2l0aCBhIFJlZ3Jlc3Npb24gbGluZSBvciBsaW5lIG9mIGJlc3QgZml0LiBUaGlzIGdyYXBoIHNob3dzIGEgbGluZWFyIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIG91ciBYIGFuZCBZIHZhcmlhYmxlcy5cDQpcDQoNCkluIG9yZGVyIHRvIGRldGVybWluZSB3aGV0aGVyIHRoaXMgbW9kZWwgY2FuIGJlIHVzZWQgZm9yIG91ciBkYXRhIHdlIG11c3QgY2hlY2sgd2hldGhlciB0aGUgYXNzdW1wdGlvbnMgb2YgbGluZWFyIHJlZ3Jlc3Npb24gYXJlIG1ldC4NCg0KRnJvbSBvdXIgZ3JhcGggd2UgY2FuIGRldGVybWluZSB0aGF0IHRoZSByZWxhdGlvbnNoaXAgYmV0d2VlbiBvdXIgdHdvIHZhcmlhYmxlcyBpcyBsaW5lYXIuIFlldCwgd2UgbXVzdCBmdXJ0aGVyIGNoZWNrIGZvciBob21vc2NlZGFzdGljaXR5ICh2YXJpYW5jZSBvZiByZXNpZHVhbHMgaXMgY29uc3RhbnQpIGFuZCBub3JtYWxpdHkgb2YgcmVzaWR1YWxzIChyZXNpZHVhbHMgZm9sbG93IGEgbm9ybWFsIGRpc3RyaWJ1dGlvbikuIFRoZXNlIGNoZWNrcyBjYW4gYmUgZG9uZSB3aXRoIGRpYWdub3N0aWMgcGxvdHMuXA0KXA0KDQoqKipEaWFnbm9zdGljIFBsb3RzKioqDQoNCmBgYHtyIGVjaG89RkFMU0V9DQpwYXIobWZyb3cgPSBjKDIsMikpDQoNCnBsb3QoUmVnLk1vZGVsMSkNCg0KcGFyKG1mcm93ID0gYygxLDEpKQ0KYGBgDQoNCkZpZ3VyZSAxLjI6IERpYWdub3N0aWMgcGxvdHMgZm9yIG91ciBMaW5lYXIgUmVncmVzc2lvbiBNb2RlbCAxOiBXaXRoIFkgZXF1YWwgdG8gTWVkaWFuIEZlbWFsZSBFYXJuaW5ncyBhbmQgWCBlcXVhbCB0byBUaW1lIGluIFllYXJzLiBUaGUgcGxvdCBpcyBkb25lIHRvIGNoZWNrIGZvciB0aGUgYXNzdW1wdGlvbnMgb2YgaG9tb3NjZWRhc3RpY2l0eSBhbmQgbm9ybWFsaXR5IG9mIHJlc2lkdWFscy4gVGhlIFJlc2lkdWFscyB2cyBmaXR0ZWQgc2hvd3MgYSBzbGlnaHQgcGF0dGVybiwgeWV0IGNvdWxkIGJlIGNvbnNpZGVyZWQgaG9tb3NjZWRhc3RpYy4gV2hlcmVhcyB0aGUgUVEgUGxvdCBzaG93cyB0aGF0IHRoZSByZXNpZHVhbHMgYXJlIG5vcm1hbGx5IGRpc3RyaWJ1dGVkLlwNClwNCg0KVGhlIFJlc2lkdWFscyB2cyBGaXR0ZWQgcGxvdCBpcyB1c2VkIHRvIHZpc3VhbGl6ZSB0aGUgaG9tb3NjZWRhc3RpY2l0eSBvZiBvdXIgbW9kZWwsIHdoaWNoIHdlIGhhdmUgZGVzY3JpYmVkIGFzIHRoZSB2YXJpYW5jZSBvZiBvdXIgcmVzaWR1YWxzLCB3aGljaCB3ZSB3YW50IHRvIGJlIGNvbnN0YW50LiBPdXIgcmVzaWR1YWxzIGFyZSB0aGUgWSB2YWx1ZSAtIHRoZSBQcmVkaWN0ZWQgWSB2YWx1ZS4gVGhpcyBwbG90IHNob3dzIG91ciByZXNpZHVhbHMgYXMgYSBmdW5jdGlvbiBvZiB0aGUgZml0dGVkIHZhbHVlcy4NCg0KSGVyZSB3ZSB3YW50IHRvIHNlZSB0aGF0IHRoZSBSZXNpZHVhbHMgYm91bmNlIHJhbmRvbWx5IGFyb3VuZCB0aGUgMCBsaW5lIGFuZCBzaG91bGQgYmUgcm91Z2hseSBlcXVhbGx5IHNwYWNlZCBhcm91bmQgdGhlIHJlZ3Jlc3Npb24gbGluZS4NCg0KVGhlIFFRIFBsb3QgaXMgdXNlZCB0byB2aXN1YWxpemUgdGhlIG5vcm1hbGl0eSBvZiB0aGUgcmVzaWR1YWxzLCBhIHN0cmFpZ2h0IGxpbmUgaW5kaWNhdGVzIHRoYXQgdGhlIHJlc2lkdWFscyBhcmUgbm9ybWFsbHkgZGlzdHJpYnV0ZWQuDQoNCkhlcmUgdGhlIFJlc2lkdWFscyB2cyBGaXR0ZWQgcGxvdCBzaG93cyBzb21ld2hhdCBvZiBhIHBhdHRlcm4sIGJ1dCB0aGUgUVEgUGxvdCBzaG93cyB1cyBhIG5vcm1hbCBkaXN0cmlidXRpb24uIFdlIHdpbGwgdHJhbnNmb3JtIHRoZSBkYXRhIHRoZSBhbmQgY3JlYXRlIGEgbmV3IG1vZGVsIHRvIHNlZSBpZiB3ZSBjYW4gaW1wcm92ZSB0aGlzIGJlZm9yZSB3ZSBjb250aW51ZSB3aXRoIG91ciBhbmFseXNpcy5cDQpcDQoNCiMjIyMgW01vZGVsIDI6XXsudW5kZXJsaW5lfQ0KDQpPdXIgc2Vjb25kIExpbmVhciBSZWdyZXNzaW9uIE1vZGVsLCBNb2RlbCAyIGZvbGxvd3MgYSBuZXcgZm9ybXVsYSBvZiBZID0gzrIwICsgzrIxKGxvZzEwKFgpKS4gV2hlcmUgWSBpcyBNZWRpYW4gRmVtYWxlIEluY29tZSBhbmQgWCBpcyBUaW1lIGluIHllYXJzLg0KDQpgYGB7ciBpbmNsdWRlPUZBTFNFfQ0KUmVnLk1vZGVsMiA8LSBsbShsb2cxMChGZW1hbGUuRWFybmluZ3MpflllYXJOdW0sIGRhdGEgPSBGZW1hbGVFYXJuaW5ncykNCiNUYWJsZSBGb3IgQ29lZmZpY2llbnRzDQoNCk1vZGVsMlRhYmxlIDwtIFJlZy5Nb2RlbDIkY29lZmZpY2llbnRzDQpgYGANCg0KKioqVGhlIGNvZWZmaWNpZW50cyBmb3IgTW9kZWwgMiBhcmUgYXMgZm9sbG93czoqKioNCg0KYGBge3IgZWNobz1GQUxTRX0NCmthYmxlKHQoTW9kZWwyVGFibGUpLCBjYXB0aW9uID0gIlRhYmxlIDEuMzogTGluZWFyIFJlZ3Jlc3Npb24gTW9kZWwgMiB3aXRoIGxvZzEwKCkgdHJhbnNmb3JtYXRpb24uIFRoZSBpbnRlcmNlcHQgKGNvbnN0YW50KSDOsjAgYW5kIHRoZSBzbG9wZSAoY29lZmZpY2llbnQpIM6yMSwgd2hpY2ggYXJlIHVzZWQgd2l0aCB0aGUgcHJlZGljdG9yIFggdG8gYWNoaWV2ZSB0aGUgcmVzcG9uc2UgdmFyaWFibGUgWS4iLCBjb2wubmFtZXMgPSBjKCLOsjAgKEludGVyY2VwdCkiLCAizrIxIChTbG9wZSkiKSkgJT4lDQogIGthYmxlX3N0eWxpbmcoYm9vdHN0cmFwX29wdGlvbnMgPSAic3RyaXBlZCIpICU+JQ0KICByb3dfc3BlYygwLCBib2xkID0gVCwgZm9udF9zaXplID0gMTUpDQpgYGANCg0KRm9yIG91ciBMaW5lYXIgUmVncmVzc2lvbiBNb2RlbCAyIG91ciBjb25zdGFudCDOsjAgKEludGVyY2VwdCkgaXMgNC4yMjE5MTIgYW5kIHRoZSBzbG9wZSAoY29lZmZpY2llbnQpIM6yMSBpcyAwLjAwNjg1NjMuDQoNCk1ha2luZyBvdXIgRm9ybXVsYToNCg0KbG9nMTAoUHJlZGljdGVkIFkpID0gNC4yMjE5MTIgKyAwLjAwNjg1NjMoWCkNCg0KV2hlcmU6DQoNCi0gICBsb2cxMChQcmVkaWN0ZWQgWSkgaXMgdGhlIGxvZ2FyaXRobWljIGV4cG9uZW50cyBvZiBQcmVkaWN0ZWQgTWVkaWFuIEZlbWFsZSBJbmNvbWUgR2l2ZW4gWA0KDQotICAgWCBpcyB0aGUgWWVhciBOdW1iZXIgc3RhcnRpbmcgd2l0aCAxOTY3IGFzIDENCg0KVXNpbmcgYSBsb2cxMCBUcmFuc2Zvcm1hdGlvbiBvbiBvdXIgWSB2YXJpYWJsZSBtZWFucyB0aGF0IM6yMSBpcyB0aGUgcGVyY2VudGFnZSBjaGFuZ2UgdG8gaW5jb21lIHdpdGggMSB1bml0IGluY3JlYXNlIGluIG91ciBzY2FsZSwgd2l0aCB0aGUgc3RhcnRpbmcgcGVyY2VudGFnZSBpbmNyZWFzZSBlcXVhbCB0byB0aGUgKGludGVyY2VwdCkgzrIwIHZhbHVlIG9mIDQuMjIxOTEyLlwNClwNCg0KKioqRGlhZ25vc3RpYyBwbG90cyAyOioqKg0KDQpgYGB7ciBlY2hvPUZBTFNFfQ0KcGFyKG1mcm93ID0gYygyLDIpKQ0KDQpwbG90KFJlZy5Nb2RlbDIpDQoNCnBhcihtZnJvdyA9IGMoMSwxKSkNCmBgYA0KDQpGaWd1cmUgMS4zOiBEaWFnbm9zdGljIHBsb3RzIGZvciBvdXIgTGluZWFyIFJlZ3Jlc3Npb24gTW9kZWwgMjogV2l0aCBhIGxvZ2FyaXRobWljIHRyYW5zZm9ybWF0aW9uIG9mIG91ciBZIHZhcmlhYmxlIGVxdWFsIHRvIGxvZzEwKE1lZGlhbiBGZW1hbGUgRWFybmluZ3MpIGFuZCBYIGVxdWFsIHRvIFRpbWUgaW4gWWVhcnMuIFRoZSBwbG90IGlzIGRvbmUgdG8gY2hlY2sgZm9yIHRoZSBhc3N1bXB0aW9ucyBvZiBob21vc2NlZGFzdGljaXR5IGFuZCBub3JtYWxpdHkgb2YgcmVzaWR1YWxzLlwNClwNCg0KVGhlIFJlc2lkdWFscyB2cyBmaXR0ZWQgc2hvd3MgdGhlIHNhbWUgcGF0dGVybiBhcyBiZWZvcmUsIHlldCBhZ2FpbiBpdCBjb3VsZCBiZSBjb25zaWRlcmVkIGhvbW9zY2VkYXN0aWMuIFdoZXJlYXMgdGhlIFFRIFBsb3Qgc2hvd3MgdGhhdCB0aGUgcmVzaWR1YWxzIGFyZSBub3JtYWxseSBkaXN0cmlidXRlZC4NCg0KU2luY2UgdGhlIHNhbWUgb3V0Y29tZSBvciBhbG1vc3QgdGhlIHNhbWUgb3V0Y29tZSBoYXMgYmVlbiBzaG93biB3aXRoIGEgbG9nYXJpdGhtaWMgdHJhbnNmb3JtYXRpb24uIFdlIHdpbGwgc2VlIGlmIGFkZGluZyBhbm90aGVyIHZhcmlhYmxlIHdpbGwgbWFrZSBhbnkgaW1wcm92ZW1lbnRzIG91ciBtb2RlbC5cDQpcDQoNCiMjIyMgW01vZGVsIDM6XXsudW5kZXJsaW5lfQ0KDQpJbmZsYXRpb24gaXMgYWRkZWQgdG8gdGhlIG1vZGVsIGFuZCB0aGUgZGF0YSBpcyBzY2FsZWQgYmVmb3JlIHRoZSBtb2RlbCBpcyBjcmVhdGVkLiBUaGlzIGlzIGRvbmUgYnkgc3VidHJhY3RpbmcgdGhlIG1lYW4gb2YgZWFjaCB2YXJpYWJsZSBhbmQgZGl2aWRpbmcgYnkgdGhlIHN0YW5kYXJkIGRldmlhdGlvbiBmb3IgZWFjaCBvYnNlcnZhdGlvbi4NCg0KYGBge3IgaW5jbHVkZT1GQUxTRX0NCiNTaW5jZSB3ZSBhcmUgbG9va2luZyBhdCBob3cgaW5jb21lIGhhcyBpbmNyZWFzZWQgb3ZlciB0aGUgeWVhcnMsIGluZmxhdGlvbiB3aWxsIGJlIGEgZ29vZCB2YXJpYWJsZSB0byBhZGQgdG8gb3VyIG1vZGVsIGFzIGl0IGRpcmVjdGx5IGhhcyBhbiBlZmZlY3Qgb24gaW5jb21lLg0KDQpJbmZsYXRpb25EYXRhIDwtIHJlYWQuY3N2KCJDOi9Vc2Vycy9lZHJlbi9PbmVEcml2ZS9EZXNrdG9wL0RhdGEgQW5hbHlzaXMvUiBXb3JraW5nIERpcmVjdG9yeS9GaW5hbCBQcm9qZWN0IEFzc2lnbm1lbnQvRGF0YXNldHMvRGF0YVNldHMvSW5mbGF0aW9uLmNzdiIpDQoNCkZlbWFsZUVhcm5pbmdzTmV3IDwtIGNiaW5kKEZlbWFsZUVhcm5pbmdzLCBJbmZsYXRpb25EYXRhJEluZmxhdGlvbikNCg0KbmFtZXMoRmVtYWxlRWFybmluZ3NOZXcpIDwtIGMoIlllYXIiLCAiRmVtYWxlLkVhcm5pbmdzIiwgIlllYXJOdW0iLCAiSW5mbGF0aW9uIikNCiANCg0KDQogDQoNCiNTY2FsZSBCb3RoIFllYXIgTnVtIGFuZCBJbmZsYXRpb24gaW4gb3JkZXIgdG8gY3JlYXRlIGEgbW9kZWwuDQoNClllYXJOdW1TY2FsZWQgPC0gc2NhbGUoRmVtYWxlRWFybmluZ3NOZXckWWVhck51bSwgY2VudGVyID0gVCwgc2NhbGUgPSBUKQ0KDQpJbmZsYXRpb25TY2FsZWQgPC0gc2NhbGUoRmVtYWxlRWFybmluZ3NOZXckSW5mbGF0aW9uLCBjZW50ZXIgPSBULCBzY2FsZSA9IFQpDQoNCkZlbWFsZUVhcm5pbmdzTmV3JFllYXJTY2FsZWQgPC0gc2NhbGUoRmVtYWxlRWFybmluZ3NOZXckWWVhck51bSwgY2VudGVyID0gVCwgc2NhbGUgPSBUKQ0KDQpGZW1hbGVFYXJuaW5nc05ldyRJbmZsYXRpb25TY2FsZWQgPC0gc2NhbGUoRmVtYWxlRWFybmluZ3NOZXckSW5mbGF0aW9uLCBjZW50ZXIgPSBULCBzY2FsZSA9IFQpDQoNClJlZy5Nb2RlbDMgPC0gbG0oRmVtYWxlLkVhcm5pbmdzIH4gWWVhclNjYWxlZCArIEluZmxhdGlvblNjYWxlZCwgZGF0YSA9IEZlbWFsZUVhcm5pbmdzTmV3KQ0KDQoNCk1vZGVsM1RhYmxlIDwtIFJlZy5Nb2RlbDMkY29lZmZpY2llbnRzDQpgYGANCg0KKioqVGhlIGNvZWZmaWNpZW50cyBmb3IgTW9kZWwgMyBhcmUgYXMgZm9sbG93czoqKioNCg0KYGBge3IgZWNobz1GQUxTRX0NCmthYmxlKHQoTW9kZWwzVGFibGUpLCBjYXB0aW9uID0gIlRhYmxlIDEuNDogTGluZWFyIFJlZ3Jlc3Npb24gTW9kZWwgMyB3aXRoIG5ldyBwcmVkaWN0b3IgSW5mbGF0aW9uICh4MikgLiBUaGUgaW50ZXJjZXB0IChjb25zdGFudCkgzrIwIGFuZCB0aGUgc2xvcGUgKGNvZWZmaWNpZW50KSDOsjEgKyDOsjIsIHdoaWNoIGFyZSB1c2VkIHdpdGggdGhlIHNjYWxlZCBwcmVkaWN0b3JzIHgxICsgeDIgdG8gYWNoaWV2ZSB0aGUgcmVzcG9uc2UgdmFyaWFibGUgWS4iLCBjb2wubmFtZXMgPSBjKCLOsjAgKEludGVyY2VwdCkiLCAizrIxIChTbG9wZSBmb3IgeDEpIiwgICLOsjIgKFNsb3BlIGZvciB4MikiKSkgJT4lDQogIGthYmxlX3N0eWxpbmcoYm9vdHN0cmFwX29wdGlvbnMgPSAic3RyaXBlZCIpICU+JQ0KICByb3dfc3BlYygwLCBib2xkID0gVCwgZm9udF9zaXplID0gMTUpDQpgYGANCg0KRm9yIG91ciBMaW5lYXIgUmVncmVzc2lvbiBNb2RlbCAzIG91ciBjb25zdGFudCDOsjAgKEludGVyY2VwdCkgaXMgMjY3NjkuMDIgYW5kIHRoZSBzbG9wZSAoY29lZmZpY2llbnQgZm9yIHgxKSDOsjEgaXMgNjY1Ni42MDIsIGFuZCB0aGUgc2xvcGUgKGNvZWZmaWNpZW50IGZvciB4MikgzrIyIGlzIC0yMzAuNzg3NS4NCg0KTWFraW5nIG91ciBGb3JtdWxhOg0KDQpQcmVkaWN0ZWQgWSA9IDI2NzY5LjAyICsgNjY1Ni42MDIoWDEpICsgLTIzMC43ODc1KFgyKQ0KDQpXaGVyZToNCg0KLSAgIFByZWRpY3RlZCBZIFByZWRpY3RlZCBNZWRpYW4gRmVtYWxlIEluY29tZSBHaXZlbiBYDQoNCi0gICBYMSBpcyB0aGUgU2NhbGVkIFRyYW5zZm9ybWF0aW9uIG9mIFllYXIgTnVtYmVyIHN0YXJ0aW5nIHdpdGggMTk2NyBhcyAxDQoNCi0gICBYMiBpcyB0aGUgU2NhbGVkIFRyYW5zZm9ybWF0aW9uIG9mIEluZmxhdGlvbiBmb3IgZWFjaCB5ZWFyXA0KICAgIFwNCg0KKioqRGlhZ25vc3RpYyBwbG90cyAzOioqKg0KDQpgYGB7ciBlY2hvPUZBTFNFfQ0KcGFyKG1mcm93ID0gYygyLDIpKQ0KDQpwbG90KFJlZy5Nb2RlbDMpDQoNCnBhcihtZnJvdyA9IGMoMSwxKSkNCmBgYA0KDQpGaWd1cmUgMS40OiBEaWFnbm9zdGljIHBsb3RzIGZvciBvdXIgTGluZWFyIFJlZ3Jlc3Npb24gTW9kZWwgMzogV2l0aCBvdXIgWSB2YXJpYWJsZSBlcXVhbCB0byBNZWRpYW4gRmVtYWxlIEVhcm5pbmdzIGFuZCBYMSBlcXVhbCB0byBUaW1lIGluIFllYXJzLiBBbiBhZGRpdGlvbmFsIFByZWRpY3RvciAoWDIpIHZhcmlhYmxlIGhhcyBiZWVuIGFkZGVkIHRvIG91ciBtb2RlbCwgaW5mbGF0aW9uLiBNYWtpbmcgb3VyIG1vZGVsIG11bHRpbGluZWFyLiBUaGUgcGxvdCBpcyBkb25lIHRvIGNoZWNrIGZvciB0aGUgYXNzdW1wdGlvbnMgb2YgaG9tb3NjZWRhc3RpY2l0eSBhbmQgbm9ybWFsaXR5IG9mIHJlc2lkdWFscy4NCg0KVGhlIFJlc2lkdWFscyB2cyBmaXR0ZWQgYWdhaW4gc2hvd3MgdGhlIHNhbWUgcGF0dGVybiBhcyBiZWZvcmUsIHlldCBhZ2FpbiBpdCBjb3VsZCBiZSBjb25zaWRlcmVkIGhvbW9zY2VkYXN0aWMsIG1lYW5pbmcgdGhlcmUgaGFzIG5vdCBiZWVuIGltcHJvdmVtZW50cyBvbiBob21vc2NlZGFzdGljaXR5IHdoZW4gYWRkaW5nIHRoZSB2YXJpYWJsZSBvZiBpbmZsYXRpb24gdG8gb3VyIG1vZGVsLiBUaGUgUVEgUGxvdCBzaG93cyB0aGF0IHRoZSByZXNpZHVhbHMgYXJlIG5vcm1hbGx5IGRpc3RyaWJ1dGVkLg0KDQpTaW5jZSB0aGUgc2FtZSBwYXR0ZXJuIGhhcyBiZWVuIHZpc2libGUgdGhlIHRoaXJkIHRpbWUsIHdlIHdpbGwgZGV0ZXJtaW5lIHdoaWNoIG1vZGVsIHRvIHVzZSBieSBjb21wYXJpbmcgdGhlIE11bHRpcGxlIFIgc3F1YXJlZCBhbmQgQWRqdXN0ZWQgUiBzcXVhcmVkIHZhbHVlcy5cDQpcDQoNCioqKlIgU3F1YXJlZCBWYWx1ZXMqKioNCg0KYGBge3IgaW5jbHVkZT1GQUxTRX0NCnN1bW1hcnkoUmVnLk1vZGVsMSkkci5zcXVhcmVkDQpzdW1tYXJ5KFJlZy5Nb2RlbDEpJGFkai5yLnNxdWFyZWQNCg0KTW9kZWwxclNxdWFyZWQ8LSBjYmluZC5kYXRhLmZyYW1lKHN1bW1hcnkoUmVnLk1vZGVsMSkkci5zcXVhcmVkLCBzdW1tYXJ5KFJlZy5Nb2RlbDEpJGFkai5yLnNxdWFyZWQpDQoNCm5hbWVzKE1vZGVsMXJTcXVhcmVkKSA8LSBjKCJNdWx0aXBsZVJeMiIsICJBZGp1c3RlZFJeMiIpDQoNCiMjDQoNCk1vZGVsMnJTcXVhcmVkPC0gY2JpbmQuZGF0YS5mcmFtZShzdW1tYXJ5KFJlZy5Nb2RlbDIpJHIuc3F1YXJlZCwgc3VtbWFyeShSZWcuTW9kZWwyKSRhZGouci5zcXVhcmVkKQ0KDQpuYW1lcyhNb2RlbDJyU3F1YXJlZCkgPC0gYygiTXVsdGlwbGVSXjIiLCAiQWRqdXN0ZWRSXjIiKQ0KDQojIw0KDQpNb2RlbDNyU3F1YXJlZDwtIGNiaW5kLmRhdGEuZnJhbWUoc3VtbWFyeShSZWcuTW9kZWwzKSRyLnNxdWFyZWQsIHN1bW1hcnkoUmVnLk1vZGVsMykkYWRqLnIuc3F1YXJlZCkNCg0KbmFtZXMoTW9kZWwzclNxdWFyZWQpIDwtIGMoIk11bHRpcGxlUl4yIiwgIkFkanVzdGVkUl4yIikNCg0KIyMNCg0KUlNxdWFyZWRUYWJsZSA8LXJiaW5kKE1vZGVsMXJTcXVhcmVkLCBNb2RlbDJyU3F1YXJlZCwgTW9kZWwzclNxdWFyZWQpDQpgYGANCg0KYGBge3IgZWNobz1GQUxTRX0NCmthYmxlKHQoUlNxdWFyZWRUYWJsZSksIGNhcHRpb24gPSAiVGFibGUgMS41OiBDb21wYXJpbmcgdGhlIE11bHRpcGxlIFIgU3FhdXJlZCBhbmQgQWRqdXN0ZWQgUiBTcXVhcmVkIG9mIE1vZGVsIDEgYW5kIDIgdG8gZGV0ZXJtaW5lIHdoY2loIGlzIGJlc3QgZml0IGZvciBvdXIgZGF0YS4iLCBjb2wubmFtZXMgPSBjKCJNb2RlbCAxIiwgIk1vZGVsIDIiLCAiTW9kZWwgMyIpLCAgdGFibGUuYXR0ciA9ICJzdHlsZT0nd2lkdGg6ODAlOyciKSAlPiUNCiAga2FibGVfc3R5bGluZyhib290c3RyYXBfb3B0aW9ucyA9ICJzdHJpcGVkIikgJT4lDQogIHJvd19zcGVjKDAsIGJvbGQgPSBULCBmb250X3NpemUgPSAxNSkNCmBgYA0KDQpNdWx0aXBsZSBSIHNxdWFyZWQgaXMgdXNlZCB0byBkZXRlcm1pbmUgaG93IG11Y2ggdmFyaWFuY2UgaW4gWSBjYW4gYmUgZGV0ZXJtaW5lZCBieSBYLiBBZGp1c3RlZCBSIHNxdWFyZWQgaXMgYSBtb2RpZmllZCB2ZXJzaW9uIHdoaWNoIHRha2VzIGludG8gYWNjb3VudCB0aGUgbnVtYmVyIG9mIHByZWRpY3RvcnMgaW4gdGhlIG1vZGVsLg0KDQpUaGUgUiBzcXVhcmVkIHZhbHVlcyBhcmUgaGlnaGVzdCBpbiBNb2RlbCAxIGFuZCAzLiBXaGVuIGFkZGluZyBJbmZsYXRpb24gdG8gTW9kZWwgMSAoTW9kZWwgMyksIHdlIGdldCBhbiBpbmNyZWFzZSBpbiBib3RoIHZhbHVlcy4NCg0KVG8gZGV0ZXJtaW5lIHdoZXRoZXIgd2Ugd2lsbCB1c2UgdGhpcyBleHRyYSBwcmVkaWN0b3IgaW4gb3VyIG1vZGVsIG9yIG5vdCB3ZSB3aWxsIGNvbmR1Y3QgYW4gQU5PVkEuXA0KXA0KDQoqKipBTk9WQSoqKg0KDQpgYGB7ciBlY2hvPUZBTFNFfQ0KYW5vdmEoUmVnLk1vZGVsMSwgUmVnLk1vZGVsMykNCmBgYA0KDQpUaGUgcC12YWx1ZSBvZiAwLjI1MzMgaXMgZ3JlYXRlciB0aGFuIDAuMDUgb3VyIGxldmVsIG9mIHNpZ25pZmljYW5jZSBhbmQgd2UgY2FuIGRldGVybWluZSB0aGF0IHRoZSB2YXJpYW5jZSBvZiB0aGUgdHdvIG1vZGVscyBpcyBub3Qgc2lnbmlmaWNhbnRseSBkaWZmZXJlbnQuDQoNClRoZXJlZm9yZSwgd2Ugd2lsbCBjb25kdWN0IG91ciBhbmFseXNpcyB3aXRoIG91ciBsaW5lYXIgcmVncmVzc2lvbiBNb2RlbCAxLlwNClwNCg0KIyMjIFsqKlJlc3VsdHMqKl17LnVuZGVybGluZX0NCg0KV2UgaGF2ZSBkZXRlcm1pbmVkIHRoYXQgd2Ugd2lsbCBiZSB1c2luZyBvdXIgbGluZWFyIHJlZ3Jlc3Npb24gTW9kZWwgMS4NCg0KTW9kZWwgMToNCg0KUHJlZGljdGVkIFkgPSAxNTM4My4wOCArIDQwNS42NDA1KFgpDQoNCldoZXJlOg0KDQotICAgWSBpcyBlcXVhbCB0byBNZWRpYW4gRmVtYWxlIEluY29tZQ0KDQotICAgWCBpcyBlcXVhbCB0byBZZWFyIE51bWJlciBzdGFydGluZyBhdCAxIGZvciAxOTY3IG9ud2FyZC5cDQogICAgXA0KDQojIyMjIFtSZXBvcnQ6IEYoMSw1MykgPSAxNjk5LCBQLVZhbHVlIFw8IDAuMDVdey51bmRlcmxpbmV9DQoNCmBgYHtyIGVjaG89RkFMU0V9DQpzdW1tYXJ5KFJlZy5Nb2RlbDEpDQpgYGANCg0KUmVzaWR1YWwgU3RhbmRhcmQgRXJyb3I6IDExNjINCg0KU3RhbmRhcmQgRXJyb3I6IDkuODY2DQoNCk11bHRpcGxlIFItU3F1YXJlZDogMC45Njk3IGFuZCBBZGp1c3RlZCBSLVNxdWFyZWQ6IDAuOTY5Mg0KDQpUaGUgb3V0cHV0IG9mIHRoZSBtb2RlbCBzaG93cyB1cyB0aGUgcC12YWx1ZSB0byBiZSBhIHZlcnkgc2lnbmlmaWNhbnQgdmFsdWUgbG93ZXIgdGhhbiAwLjA1LCB3aXRoIGFuIEYgc3RhdCBvZiAxNjk5IG9uIDEgYW5kIDUzIERlZ3JlZXMgb2YgRnJlZWRvbS4NCg0KQXMgd2UgYXJlIGxvb2tpbmcgYXQgd2hldGhlciB0aGVyZSBoYXMgYmVlbiBhIHNpZ25pZmljYW50IGluY3JlYXNlIGluIE1lZGlhbiBGZW1hbGUgSW5jb21lIGZyb20gMTk2NyAtIDIwMjEgdGhpcyBhIGlzIGEgb25lIHRhaWxlZCB0ZXN0LlwNClwNCg0KKioqUC1WYWx1ZSBmb3IgdGhpcyB0ZXN0IGlzIGFzIGZvbGxvd3M6KioqDQoNCmBgYHtyIGVjaG89RkFMU0V9DQojUCAtIFZhbHVlIC0gVXBwZXIgVGFpbCB0ZXN0DQoNCnBfdmFsdWUgPC0gcHQocSA9IDQxLjIyLCBkZiA9IDUzLCBsb3dlci50YWlsPUZBTFNFKQ0KDQpwX3ZhbHVlDQpgYGANCg0KTWVhbmluZyB3ZSBjYW4gZGV0ZXJtaW5lIHRoYXQgb24gYW55IG9uZSB0ZXN0IG9mIHRoZSBOdWxsIEh5cG90aGVzaXMgd2UgY2FuIHNheSB0aGF0IHRoZXJlIGlzIGEgbGVzcyB0aGFuIDUlIHByb2JhYmlsaXR5IHRoYXQgdGhlIHJlc3VsdHMgd2lsbCBiZSBkdWUgdG8gY2hhbmNlIGFsb25lLiBUaGVyZWZvcmUgd2UgY2FuIHJlamVjdCB0aGUgTnVsbCBIeXBvdGhlc2lzIGFuZCBkZXRlcm1pbmUgdGhhdCB0aGUgUmVzZWFyY2ggSHlwb3RoZXNpcyBpcyBtb3JlIGF0dHJhY3RpdmUuXA0KXA0KDQojIyMgWyoqRGlzY3Vzc2lvbioqXXsudW5kZXJsaW5lfQ0KDQpBcyB3ZSBoYXZlIHJlamVjdGVkIHRoZSBOdWxsIEh5cG90aGVzaXMsIHdlIGNhbiBzYXkgdGhhdCB0aGVyZSBoYXMgYmVlbiBhIHNpZ25pZmljYW50IGluY3JlYXNlIGluIE1lZGlhbiBGZW1hbGUgSW5jb21lIGluIHRoZSBVUyBmcm9tIDE5NjcgLSAyMDIxLg0KDQpXaXRoIG91ciBuZXcgZm9ybXVsYSAoUHJlZGljdGVkIFkgPSAxNTM4My4wOCArIDQwNS42NDA1KFgpKSB3ZSBjYW4gYWxzbyBwcmVkaWN0IHRoZSB2YWx1ZSBvZiBZIGlmIHdlIGtub3cgdGhlIHZhbHVlIG9mIFguIEFzIHdlIGhhdmUgdXNlZCBZZWFyIE51bWJlciBhcyBhIGNvdW50IHN0YXJ0aW5nIGZyb20gMTk2NywgdG8gcHJlZGljdCBNZWRpYW4gRmVtYWxlIEluY29tZSBpbiB0aGUgVVMgZm9yIDIwMjQsIHdlIHdvdWxkIHNpbXBseSBoYXZlIHRvIHJlcGxhY2UgWCB3aXRoIDU3IChmb3IgMjAyNCkuXA0KXA0KDQojIyMjIFtWaXN1YWxpemF0aW9uOl17LnVuZGVybGluZX0NCg0KYGBge3IgZWNobz1GQUxTRSwgd2FybmluZz1GQUxTRX0NCiNQbG90dGluZyBSZXNpZHVhbHMNCg0KRmVtYWxlRWFybmluZ3MkcHJlZGljdGVkIDwtIHByZWRpY3QoUmVnLk1vZGVsMSkNCg0KRmVtYWxlRWFybmluZ3MkcmVzaWR1YWxzIDwtIHJlc2lkdWFscyhSZWcuTW9kZWwxKQ0KDQpnZ3Bsb3QoRmVtYWxlRWFybmluZ3MsIGFlcyh4ID0gWWVhciwgeSA9IEZlbWFsZS5FYXJuaW5ncykpICsNCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwgc2UgPSBGLCBjb2xvciA9ICJibHVlIikgKw0KICBnZW9tX3BvaW50KGFlcyhjb2xvciA9IGFicyhyZXNpZHVhbHMpLCBzaXplID0gYWJzKHJlc2lkdWFscykpKSArDQogIHNjYWxlX2NvbG9yX2NvbnRpbnVvdXMobG93ID0gImJsdWUiLCBoaWdoID0gInJlZCIpICsNCiAgZ3VpZGVzKGNvbG9yID0gRiwgc2l6ZSA9IEYpICsNCiAgZ2VvbV9zZWdtZW50KGFlcyh4ZW5kID0gWWVhciwgeWVuZCA9IHByZWRpY3RlZCksIGFscGhhID0gLjIpICsNCiAgdGhlbWVfbWluaW1hbChiYXNlX3NpemUgPSAxMikgKw0KICB0aGVtZShheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0LCAgdmp1c3QgPSAtNCwgaGp1c3QgPSAwLjQzKSwNCiAgICAgICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCwgdmp1c3QgPSA2LCBoanVzdCA9IDAuNiksDQogICAgICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE2LCB2anVzdCA9IDYpLA0KICAgICAgICBwbG90Lm1hcmdpbiA9IHVuaXQoYygxLDEsMSwxKSwgImNtIikpICsNCiAgbGFicyh0aXRsZSA9IGV4cHJlc3Npb24odW5kZXJsaW5lKCJNZWRpYW4gRmVtYWxlIEVhcm5pbmdzICgkKSBpbiB0aGUgVVMgZnJvbSAxOTY3LTIwMjEiKSkpICsNCiAgeWxhYigiTWVkaWFuIEZlbWFsZSBFYXJuaW5ncyAoJCkiKSArDQogIHhsYWIoIlRpbWUgaW4gWWVhcnMiKQ0KI0ZpZ3VyZSAxLjI6IE1lZGlhbiBGZW1hbGUgRWFybmluZ3MgcGxvdHRlZCBhZ2FpbnN0IHRpbWUgaW4gWWVhcnMsIHdpdGggbGluZSBvZiBiZXN0IGZpdCBhbmQgUmVzaWR1YWxzIHBsb3R0ZWQgdG8gdGhlIHByZWRpY3RlZCB2YWx1ZXMuDQpgYGANCg0KRmlndXJlIDEuNTogTWVkaWFuIEZlbWFsZSBFYXJuaW5ncyBwbG90dGVkIGFnYWluc3QgdGltZSBpbiBZZWFycywgd2l0aCBsaW5lIG9mIGJlc3QgZml0IGFuZCBSZXNpZHVhbHMgcGxvdHRlZCB0byB0aGUgcHJlZGljdGVkIHZhbHVlcy4gV2l0aCBoaWdoZXIgcmVzaWR1YWwgdmFsdWVzIHNob3duIHdpdGggcmVkIGFuZCBhIGxhcmdlciBjaXJjbGUgYW5kIHRoZSBzbWFsbGVyIHZhbHVlcyBzaG93biB3aXRoIGEgc21hbGxlciBjaXJjbGUgYW5kIGJsdWUuXA0KXA0KDQpUaGUgTXVsdGlwbGUgUiBzcXVhcmVkIHZhbHVlIG9mIDAuOTY5NyBmb3IgdGhlIHJlZ3Jlc3Npb24gTW9kZWwgMSBpbmRpY2F0ZXMgdGhhdCB0aGUgcHJlZGljdG9yIFggKFRpbWUgaW4gWWVhcnMpIGV4cGxhaW5zIDk3JSBvZiB0aGUgdmFyaWF0aW9uIGluIE1lZGlhbiBGZW1hbGUgSW5jb21lIGluIHRoZSBVUy4gVGhlIEFkanVzdGVkIFIgc3F1YXJlZCB2YWx1ZSBwcm92aWRlcyBhIG1vcmUgY29uc2VydmF0aXZlIHZhbHVlIGJ1dCBzdGlsbCBpbmRpY2F0ZXMgYSBzaW1pbGFyIHJlc3VsdCBvZiAwLjk2OTEuDQoNClRoZSBSZXNpZHVhbCBTdGFuZGFyZCBFcnJvciBvZiAxMTYyIG1lYW5zIHRoYXQgdGhlcmUgaXMgYSA5NSUgdGhlIHByZWRpY3RlZCB2YWx1ZSB3aWxsIGZhbGwgYmV0d2VlbiB0aGUgbWVhbiBvZiBhbGwgTWVkaWFuIEZlbWFsZSBJbmNvbWUgYW5kIDExNjINCg0KVGhlIFN0ZC5FcnJvciDOsjEgb2YgOS44NjYgc2hvd3MgdGhlIHByZWNpc2lvbiBvZiB0aGUgc2xvcGUuIFRoZSBzbWFsbCB2YWx1ZSBpbmRpY2F0ZXMgbGVzcyB2YXJpYWJpbGl0eSBpbiB0aGUgc2xvcGUgY29lZmZpY2llbnQgZm9yIHRoaXMgbGluZWFyIHJlZ3Jlc3Npb24gbW9kZWwuDQoNCkFzIHdlIGhhdmUgZGV0ZXJtaW5lZCB0aGF0IE1lZGlhbiBGZW1hbGUgSW5jb21lIGhhcyBzaWduaWZpY2FudGx5IGluY3JlYXNlZCBvdmVyIHRoZSB5ZWFycyBpbiB0aGUgVVMgZnJvbSAxOTY3LTIwMjEsIHdlIGNhbiBzYXkgdGhhdCB0aGluZ3MgYXJlIGdvaW5nIGluIHRoZSByaWdodCBkaXJlY3Rpb24gYXMgY29tcGFyZWQgdG8gaG93IHRoZXkgd2VyZSBpbiB0aGUgbGF0ZSAxODAwcy4gT25lIGNhbiBzYXkgdGhhdCBmcm9tIHRoaXMgYW5hbHlzaXMgaGUgc3RhbmRhcmQgb2YgbGl2aW5nIGhhcyBpbmNyZWFzZWQgZm9yIHdvbWVuIGluIHRoZSBVUyBvdmVyIHRoZXNlIHllYXJzLg0KDQpIb3dldmVyIHRoaXMgc3R1ZHkgZG9lcyBub3QgYWNjb3VudCBmb3IgaW5mbGF0aW9uLCBhcyB0aGlzIHdhcyBkZXRlcm1pbmVkIHRvIG5vdCBiZSByZWxldmFudCBlbm91Z2ggZm9yIG91ciByZWdyZXNzaW9uIG1vZGVsIGR1ZSB0byBvdXRwdXQgb2Ygb3VyIGFub3ZhIHRlc3QuIFVuZW1wbG95bWVudCwgYW5kIG90aGVyIHNvY2lvZWNvbm9taWMgZmFjdG9ycyBoYXZlIGFsc28gbm90IGJlZW4gYWNjb3VudGVkIGZvci4NCg0KVGhpcyBzdHVkeSBoYXMgb25seSBhbmFseXNlZCB0aGUgdG90YWwgd29ya2luZyBwb3B1bGF0aW9uLCBzbyB0byBhbmFseXNlIHRoZSBzdGFuZGFyZCBvZiBsaXZpbmcgZm9yIHRob3NlIHdpdGhvdXQgd29yayBjb3VsZCBhbHNvIGJlIGFuIGludGVyZXN0aW5nIHRvcGljLg0KDQpGdXJ0aGVyIGFuYWx5c2lzIGFuZCByZXNlYXJjaCBzaG91bGQgYmUgY29uZHVjdGVkIHRvIGdldCBhIGJldHRlciB1bmRlcnN0YW5kaW5nIG9mIGhvdyBlcXVhbGl0eSBpcyBldm9sdmluZyBpbiBzb2NpZXR5IGFuZCB0aGUgZWZmZWN0IGlzIGhhcyBvbiBGZW1hbGUgcXVhbGl0eSBvZiBsaWZlLiBOb3Qgc2ltcGx5IHRocm91Z2ggdGhlaXIgZWNvbm9taWNhbCBnYWluIGJ1dCBvdGhlciBmYWN0b3JzIHN1Y2ggYXMgZWR1Y2F0aW9uLCBsaWZlIGV4cGVjdGFuY3kgZXRjLlwNClwNClwNClwNClwNClwNClwNClwNCg0KIyMjIFsqKlBhcnQgMiAtIEdlbmRlciBhbmQgSW5jb21lIGluIHRoZSBVUyBmcm9tIDE5NjcgLSAyMDIxLioqXXsudW5kZXJsaW5lfQ0KDQojIyMgWyoqSW50cm9kdWN0aW9uKipdey51bmRlcmxpbmV9DQoNCkZlbWluaXNtIGNhbiBiZSBkZWZpbmVkIGFzIHRoZSBhZHZvY2FjeSBvZiBXb21hbidzIHJpZ2h0cyBvbiB0aGUgYmFzaXMgb2YgZ2VuZGVyIGVxdWFsaXR5IChGdXR1cmUgTGVhcm4sIDIwMjEpLiBUbyBmdXJ0aGVyIHVuZGVyc3RhbmQgdGhlIHBvc2l0aXZlIGltcGFjdCBmZW1pbmlzbSBoYXMgaGFkIG9uIHdvbWVucyByaWdodHMgYW5kIG9uIHNvY2lldHkgaW4gdGhlIFVTIGZyb20gMTk2Ny0yMDIxLCB0aGUgZGlmZmVyZW5jZSBvZiBtZWRpYW4gaW5jb21lcyBieSBnZW5kZXIgd2lsbCBiZSBhbiBpbnRlcmVzdGluZyB0b3BpYyB0byBjb3Zlci4NCg0KRnJvbSBQYXJ0IDEgb2YgdGhpcyBzdHVkeSB3ZSByZXZlYWxlZCB0aGF0IHRoZXJlIGhhZCBiZWVuIGEgc2lnbmlmaWNhbnQgaW5jcmVhc2UgaW4gRmVtYWxlIE1lZGlhbiBJbmNvbWUgaW4gdGhlIFVTIGZyb20gMTk2Ny0yMDIxLiBUaGlzIGlzIGEgc3RlcCBpbiB0aGUgcmlnaHQgZGlyZWN0aW9uLCBzaG93aW5nIHRoYXQgd29tZW4gZmlnaHRpbmcgZm9yIHRoZWlyIHJpZ2h0cyBoYXMgbm90IGdvbmUgdW5ub3RpY2VkIG92ZXIgdGhlIHllYXJzLiBZZXQsIGxvb2tpbmcgZGVlcGVyIGludG8gdGhlIGVxdWFsaXR5IGJldHdlZW4gZ2VuZGVycy4gSG93IGRvZXMgdGhpcyBmaWd1cmUgY29tcGFyZSB0byB3aGF0IE1lbiBoYWQgZWFybnQgZHVyaW5nIHRoZSBzYW1lIHRpbWUgcGVyaW9kPw0KDQpJbiAxOTYzLCB0aGUgRXF1YWwgUGF5IEFjdCB3YXMgcHV0IGluIHBsYWNlLCB3aGljaCB3YXMgc2V0IG91dCB0byBwcm90ZWN0IGFnYWluc3Qgd2FnZSBkaXNjcmltaW5hdGlvbiBiYXNlZCBvbiBzZXggKERPTCwgMjAyNCkuIFdpdGggdGhpcyBhY3QgaW4gcGxhY2UsIHdvbWVuLCBieSBsYXcgc2hvdWxkIGJlIHBhaWQgdGhlIHNhbWUgYXMgbWVuIGZvciB0aGUgc2FtZSB3b3JrLiBJdCBpcyBzdGF0ZWQgYnkgdGhlIFVTIERlcGFydG1lbnQgb2YgTGFib3VyIHdlYnNpdGUgKDIwMjQpIHRoYXQgZW1wbG95ZXJzIG11c3QgcmFpc2Ugd2FnZXMgdG8gZXF1YWxpemUgcGF5IGJ1dCBtYXkgbm90IHJlZHVjZSB0aGUgd2FnZXMgb2Ygb3RoZXIgaW5kaXZpZHVhbHMuIE1lYW5pbmcgdHdvIHBlb3BsZSB3b3JraW5nIHRoZSBzYW1lIGpvYiBzaG91bGQgYmUgcGFpZCB0aGUgaGlnaGVyIGFtb3VudCBhbmQgbm90IHRoZSBsb3dlci4NCg0KUGFydCB0d28gb2YgdGhpcyBzdHVkeSBpcyB0aGVyZWZvcmUgc2V0IG91dCB0byBkZXRlcm1pbmUgd2hldGhlciB0aGVyZSBpcyBhIHNpZ25pZmljYW50IGRpZmZlcmVuY2UgaW4gTWFsZSBhbmQgRmVtYWxlIE1lZGlhbiBJbmNvbWUgZnJvbSB0aGUgeWVhcnMgb2YgMTk2NyAtIDIwMjEuXA0KXA0KDQpUaGVyZWZvcmUsIHRoZSByZXNlYXJjaCBxdWVzdGlvbiB0byBiZSBhbnN3ZXJlZCBpbiB0aGlzIHN0dWR5IGlzIGFzIGZvbGxvd3M6DQoNCipJcyB0aGVyZSBhIHNpZ25pZmljYW50IGRpZmZlcmVuY2UgaW4gTWVkaWFuIE1hbGUgYW5kIEZlbWFsZSBJbmNvbWUgZnJvbSAxOTY3IC0gMjAyMT8qXA0KXA0KDQpJZiAqdGhlcmUgaXMqIGEgc2lnbmlmaWNhbnQgZGlmZmVyZW5jZSBpbiB0aGUgTWVkaWFuIEluY29tZSBieSBHZW5kZXIgZnJvbSAxOTY3IC0gMjAyMSBpbiB0aGUgVVMgYW5kICptZW4gYXJlIGVhcm5pbmcgbW9yZSosIHRoZW4gd2UgY2FuIGRldGVybWluZSB0aGF0ICp0aGVyZSBpcyogYSBwYXkgZ2FwIGJldHdlZW4gdGhlIHR3byBnZW5kZXJzIGR1cmluZyB0aGlzIHRpbWUgcGVyaW9kLg0KDQpTaW5jZSB0aGUgRXF1YWwgUGF5IEFjdCB3YXMgcHV0IGludG8gcGxhY2UgYmVmb3JlIHRoZSB0aW1lIHBlcmlvZCB0aGF0IHRoZSBkYXRhIHdhcyByZWNvcmRlZCAocHV0IGludG8gcGxhY2UgaW4gMTk2MykuIFRoZSByZWFzb24gZm9yIGEgcGF5IGdhcCB3b3VsZCB0aGVyZWZvcmUgbm90IGJlIGR1ZSB0byB0aGUgbGF3IGl0c2VsZiBidXQgcmF0aGVyIG90aGVyIG91dHNpZGUgZmFjdG9ycyBhdCBwbGF5IHdoaWNoIGhhdmUgaGFkIGEgbmVnYXRpdmUgZWZmZWN0IG9uIHRoZSBNZWRpYW4gSW5jb21lIG9mIEZlbWFsZXMuDQoNCklmICp0aGVyZSBpcyBub3QqIGEgc2lnbmlmaWNhbnQgZGlmZmVyZW5jZSBpbiB0aGUgTWVkaWFuIEluY29tZSBiZXR3ZWVuIHRoZSB0d28gR2VuZGVycyBvciBpZiAqdGhlcmUgaXMqIGJ1dCBpdCBzaG93cyB0aGF0ICp3b21lbiBhcmUgZWFybmluZyBtb3JlLCogdGhlbiB3ZSBjYW4gc2F5IHRoYXQgdGhlIEVxdWFsIFBheSBBY3Qgb2YgMTk2MyBzb2x2ZWQgdGhlIGlzc3VlcyByZWdhcmRpbmcgZXF1YWwgcGF5IGJhc2VkIG9uIHNleCBpbiB0aGUgVVMuXA0KXA0KDQojIyMjIFtULVRlc3QgZm9yIEluZGVwZW5kZW50IFNhbXBsZXNdey51bmRlcmxpbmV9DQoNClRoZSBzdGF0aXN0aWNhbCB0ZXN0IHdoaWNoIHdpbGwgYmUgdXNlZCBpbiB0aGlzIHN0dWR5IGlzIGEgdC10ZXN0IGZvciBpbmRlcGVuZGVudCBzYW1wbGVzLCBhcyB3ZSBhcmUgbG9va2luZyB0byBjb21wYXJlIHRoZSBjZW50cmFsIHRlbmRlbmNpZXMgb2YgdGhlIHR3byBpbmRlcGVuZGVudCBncm91cHMNCg0KLSAgIEdyb3VwIDE6IE1lZGlhbiBNYWxlIEluY29tZSAoXCQpIDE5NjctMjAyMQ0KDQotICAgR3JvdXAgMjogTWVkaWFuIEZlbWFsZSBJbmNvbWUgKFwkKSAxOTY3LTIwMjFcDQogICAgXA0KDQojIyMjIFtIeXBvdGhlc2lzOl17LnVuZGVybGluZX0NCg0KSW4gb3JkZXIgdG8gYW5zd2VyIHRoaXMgcXVlc3Rpb24gd2UgbmVlZCB0byBzZXQgb3VyIE51bGwgYW5kIFJlc2VhcmNoIEh5cG90aGVzaXMgYW5kIGxldmVsIG9mIHNpZ25pZmljYW5jZS4NCg0KQXMgd2UgYXJlIG9ubHkgaW50ZXJlc3RlZCB0byBzZWUgaWYgdGhlcmUgaXMgYSBkaWZmZXJlbmNlIHRoaXMgd2lsbCBiZSBhIHR3byB0YWlsZWQgdGVzdC4NCg0KTnVsbCBIeXBvdGhlc2lzOg0KDQpIMDogRmVtYWxlIE1lZGlhbiBJbmNvbWUgVVMgMTk2Ny0yMDIxIChDZW50cmFsIFRlbmRlbmN5KSA9IEZlbWFsZSBNZWRpYW4gSW5jb21lIFVTIDE5NjctMjAyMSAoQ2VudHJhbCBUZW5kZW5jeSkNCg0KUmVzZWFyY2ggSHlwb3RoZXNpczoNCg0KSDE6IEZlbWFsZSBNZWRpYW4gSW5jb21lIFVTIDE5NjctMjAyMSAoQ2VudHJhbCBUZW5kZW5jeSkg4omgIE1hbGUgTWVkaWFuIEluY29tZSBVcyAxOTY3LTIwMjEgKENlbnRyYWwgVGVuZGVuY3kpDQoNCkZvciB0aGlzIHN0dWR5IHdlIHNldCBhIHNpZ25pZmljYW5jZSBsZXZlbCBvZiAwLjA1LCB3aGljaCBtZWFucyB3ZSBhcmUgd2lsbGluZyB0byBzYXkgdGhhdCB0aGUgdGhlcmUgaXMgYSA1JSBjaGFuY2UgdGhhdCB0aGUgcmVzdWx0cyB3aWxsIG9jY3VyIGR1ZSB0byBjaGFuY2UgYWxvbmUuIE9ubHkgd2hlbiBvdXIgcC12YWx1ZSBpcyBsb3dlciB0aGFuIG91ciBzaWduaWZpY2FuY2UgbGV2ZWwgb2YgMC4wNSBjYW4gd2UgcmVqZWN0IHRoZSBOdWxsIEh5cG90aGVzaXMgYW5kIGRldGVybWluZSB0aGF0IHRoZSBSZXNlYXJjaCBIeXBvdGhlc2lzIGlzIG1vcmUgYXR0cmFjdGl2ZS5cDQpcDQoNCiMjIyBbKipNZXRob2QqKl17LnVuZGVybGluZX0NCg0KVG8gc3RhcnQgb3VyIGFuYWx5c2lzIHRoZSByZWxldmFudCBwYWNrYWdlcyBhcmUgbG9hZGVkIGludG8gUiBTdHVkaW8uDQoNCmBgYHtyIGVjaG89VFJVRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCiNQYWNrYWdlcw0KbGlicmFyeShnZ3Bsb3QyKQ0KbGlicmFyeShnZ3B1YnIpDQpsaWJyYXJ5KGtuaXRyKQ0KbGlicmFyeShrYWJsZUV4dHJhKQ0KbGlicmFyeShSY21kcikNCmxpYnJhcnkoZHBseXIpDQpsaWJyYXJ5KHJzdGF0aXgpDQpgYGANCg0KVGhlbiB0aGUgZGF0YSBpcyBzb3VyY2VkIGFuZCBkb3dubG9hZGVkIGZyb20gd3d3LmNlbnN1cy5nb3YuIFRhYmxlIFAtOC4gQWdlLS1BbGwgUGVvcGxlLCBieSBNZWRpYW4gSW5jb21lIGFuZCBTZXg6IDE5NDcgdG8gMjAyMi4gVGhlIGRhdGEgdXNlZCBpbiB0aGlzIHN0dWR5IGFyZSBpbiAyMDIyIGRvbGxhcnMsIHNvIGluZmxhdGlvbiBpcyBhY2NvdW50ZWQgZm9yIGFuZCB0aGUgdGFibGUgdXNlZCBvdXQgb2YgdGhlIG11bHRpcGxlIGF2YWlsYWJsZSBpbiB0aGlzIGRhdGEgc2V0IChQLTgpIGlzIGZvciBhbGwgcGVvcGxlIDE1IHllYXJzIGFuZCBvbGRlci4NCg0KVGhlIGRhdGEgaXMgdGhlbiBsb2FkZWQgYW5kIHRyYW5zZm9ybWVkIGludG8gZXhjZWwsIG9ubHkga2VlcGluZyB0aGUgbmVjZXNzYXJ5IHZhbHVlcyBhbmQgY29sdW1ucyBhbG9uZyB3aXRoIHRoZSB2YWx1ZXMgZm9yIGVhY2ggeWVhci4gQXMgYmVmb3JlLCByb3dzIGZvciAyMDE3IGFuZCAyMDEzIGhhdmUgYmVlbiByZXBlYXRlZCBpbiB0aGUgZGF0YSBzZXQgZG93bmxvYWRlZCBmcm9tIFVTIENlbnN1cywgc28gd2hlbiBpbXBvcnRlZCBpbnRvIGV4Y2VsIEkgaGF2ZSBjYWxjdWxhdGVkIHRoZSBhdmVyYWdlIG9mIHRoZXNlIHJvd3MgaW5zdGVhZCBvZiBhbGxvd2luZyB0d28gaW5zdGFuY2VzIGZvciB0aGUgc2FtZSB5ZWFyLlwNClwNCg0KIyMjIyBbU3VtbWFyeSBvZiB0aGUgRGF0YTpdey51bmRlcmxpbmV9DQoNCmBgYHtyIGluY2x1ZGU9RkFMU0V9DQojSW1wb3J0DQpNYWxlRmVtYWxlRWFybmluZ3MgPC0gcmVhZC5jc3YoIkM6L1VzZXJzL2VkcmVuL09uZURyaXZlL0Rlc2t0b3AvRGF0YSBBbmFseXNpcy9SIFdvcmtpbmcgRGlyZWN0b3J5L0ZpbmFsIFByb2plY3QgQXNzaWdubWVudC9EYXRhc2V0cy9EYXRhU2V0cy9NRkVhcm5pbmdzLmNzdiIpDQoNCiNDbGVhbiBVcA0KbmFtZXMoTWFsZUZlbWFsZUVhcm5pbmdzKSA8LSBjKCJZZWFyIiwgIkdlbmRlciIsICJNZWRpYW4uSW5jb21lIikNCg0KI0luaXRpYWwgTG9vayBhdCBvdXIgZGF0YQ0KaGVhZChNYWxlRmVtYWxlRWFybmluZ3MpDQoNCnRhaWwoTWFsZUZlbWFsZUVhcm5pbmdzKQ0KDQpUYWJsZUVhcm5pbmdzMiA8LSByYmluZChoZWFkKE1hbGVGZW1hbGVFYXJuaW5ncyksICIuLi4iLCB0YWlsKE1hbGVGZW1hbGVFYXJuaW5ncykpDQoNCmBgYA0KDQpgYGB7ciBlY2hvPUZBTFNFfQ0Ka2FibGUoVGFibGVFYXJuaW5nczIsDQogICAgICBjYXB0aW9uID0gIlRhYmxlIDIuMTogSW5pdGlhbCBsb29rIGF0IGhvdyBvdXIgZGF0YSBpcyBsYWlkIG91dC4gUHJvdmlkaW5nIHRoZSBNZWRpYW4gSW5jb21lIGZvciBib3RoIEdlbmRlcnMgMTUgWWVhcnMgYW5kIE92ZXIgaW4gdGhlIFVTIGZyb20gMTk2NyAtIDIwMjEuIFRoZSBJbmNvbWUgaW4gdGhpcyBkYXRhc2V0IGFjY291bnRzIGZvciBpbmZsYXRpb24gYW5kIGlzIGluIDIwMjIgRG9sbGFycyAoJCkuIikgJT4lDQogIGthYmxlX3N0eWxpbmcoYm9vdHN0cmFwX29wdGlvbnMgPSAic3RyaXBlZCIpICU+JQ0KICByb3dfc3BlYygwLCBib2xkID0gVCwgZm9udF9zaXplID0gMTUpDQpgYGANCg0KVGhlIGRhdGEgaXMgbGFpZCBvdXQgd2l0aCB0aGUgZGlmZmVyZW50IGdlbmRlcnMgaW4gb25lIGNvbHVtbnMgYW5kIHRoZSAiTWVkaWFuLkluY29tZSIgaW4gaXRzIG93biBjb2x1bW4uIFRoaXMgYmVpbmcgdGhlIGNhc2UgdGhlIFllYXIgdmFsdWVzIHdpbGwgdGhlcmVmb3JlIGJlIHJlcGVhdGVkIGdvaW5nIGZyb20gMjAyMS0xOTY3IHR3aWNlIHRvIG1hdGNoIHRoZSB0d28gZ2VuZGVycywgbWFraW5nIG91ciBuID0gMTEwLCBvciA1NSBmb3IgZWFjaC4gRG91YmxlIHdoYXQgaXMgd2FzIGluIHRoZSBwcmV2aW91cyBzdHVkeS4gRGVncmVlcyBvZiBmcmVlZG9tIGZvciB0aGlzIHN0dWR5IGlzIHRoZXJlZm9yZSwgKG4xICsgbjIpIC0gMiA9IDEwOC5cDQpcDQoNCmBgYHtyIGVjaG89RkFMU0V9DQojU3VtbWFyeSBTdGF0aXN0aWNzIGJ5IEdlbmRlcg0KDQpCeUdlbmRlciA8LWdyb3VwX2J5KE1hbGVGZW1hbGVFYXJuaW5ncywgR2VuZGVyKSAlPiUNCiAgc3VtbWFyaXNlKA0KICAgIGNvdW50ID0gbigpLA0KICAgIG1lZGlhbiA9IG1lZGlhbihNZWRpYW4uSW5jb21lLCBuYS5ybSA9IFQpLA0KICAgIElRUiA9IElRUihNZWRpYW4uSW5jb21lLCBuYS5ybSA9IFQpDQogICkNCg0Ka2FibGUoQnlHZW5kZXIsY2FwdGlvbiA9ICAiVGFibGUgMi4yOiBTdW1tYXJ5IFN0YXRpc3RpY3MgZm9yIG91ciBkYXRhIHJlZ2FyZGluZyBNZWRpYW4gSW5jb21lIGZvciB0aGUgc2VwZXJhdGUgR2VuZGVycyAxNSBZZWFycyBhbmQgT3ZlciBpbiB0aGUgVVMgZnJvbSAxOTY3LTIwMjEuIFRoZSBjb3VudCBpcyB0aGUgbnVtYmVyIG9mIHllYXJzIGluIHRoZSBzdHVkeSB3aGljaCBpcyBvdXIgbiwgbWVkaWFuIG9mIHRoZSBtZWRpYW4gaW5jb21lIGlzIHByb3ZpZGVkIGZvciBlYWNoLCBhbmQgdGhlIGludGVycXVhcnRpbGUgcmFuZ2UuIikgJT4lDQogIGthYmxlX3N0eWxpbmcoYm9vdHN0cmFwX29wdGlvbnMgPSAic3RyaXBlZCIpICU+JQ0KICByb3dfc3BlYygwLCBib2xkID0gVCwgZm9udF9zaXplID0gMTUpDQpgYGANCg0KVGhlIFN1bW1hcnkgU3RhdGlzdGljcyBoZXJlIGNvbmZpcm0gdGhlIG4xIGFuZCBuMiA9IDU1LiBUaGVyZWZvcmUgb3VyIERGIGlzIDEwOC4gVGhlIE1lZGlhbiBvZiBNZWRpYW4gSW5jb21lIGlzIHNlZW4gdG8gYmUgYSBsb3QgaGlnaGVyIGZvciBNYWxlcyB0aGFuIEZlbWFsZXMgaW4gdGhlIFVTLCBpdCB3b3JrcyBvdXQgdG8gYmUgb3ZlciBkb3VibGUuIEZvciBGZW1hbGVzIHRoZXJlIGlzIGFsc28gYSBoaWdoIEludGVycXVhcnRpbGUgUmFuZ2UgKElRUiksIHdoaWNoIG1lYW5zIHRoYXQgdGhlcmUgaXMgYSBoaWdoIHJhbmdlIHdoZXJlIG1vc3Qgb2YgdGhlIHZhbHVlcyBsaWUuIEFzIHdlIGFyZSB3b3JraW5nIHdpdGggWWVhcmx5IGRhdGEgd2UgY2FuIG9ubHkgaG9wZSB0aGF0IHRoaXMgbGFyZ2UgSW50ZXJxdWFydGlsZSByYW5nZSBpcyBkdWUgdG8gaW1wcm92ZW1lbnRzIG92ZXIgdGhlIHllYXJzIGluIE1lZGlhbiBGZW1hbGUgSW5jb21lIHdoaWNoIGhhcyBjYXVzZWQgdGhpcyBsYXJnZSBzcHJlYWQuDQoNCkluIG9yZGVyIHRvIGRldGVybWluZSB3aGV0aGVyIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIHR3byBnZW5kZXJzIGlzIHNpZ25pZmljYW50IGEgVCBUZXN0IGZvciBJbmRlcGVuZGVudCBzYW1wbGVzIHdpbGwgYmUgY29uZHVjdGVkIHRvIG1lYXN1cmUgd2hldGhlciB0aGVyZSBpcyBzdGF0aXN0aWNhbCBldmlkZW5jZSB0aGF0IHRoZSBjZW50cmFsIHRlbmRlbmNpZXMgb2Ygb3VyIHR3byBncm91cHMgYXJlIHN0YXRpc3RpY2FsbHkgZGlmZmVyZW50LlwNClwNCg0KIyMjIyBbQXNzdW1wdGlvbnMgQ2hlY2s6XXsudW5kZXJsaW5lfQ0KDQpGaXJzdGx5LCB3ZSBtdXN0IGNoZWNrIHRoYXQgYWxsIHRoZSBhc3N1bXB0aW9ucyBhcmUgbWV0IGJlZm9yZSB3ZSBjYW4gY29udGludWUgd2l0aCBvdXIgYW5hbHlzaXMuIEZvciBhIFQgVGVzdCBmb3IgSW5kZXBlbmRlbnQgU2FtcGxlcywgYXMgc3RhdGVkIGJ5IEFtYW5kYSBKLiBTaGFrZXIgKDIwMjQpIHRoZSBhc3N1bXB0aW9ucyByZXF1aXJlZCB0byBjb25kdWN0IHRoZSBwYXJhbWV0cmljIHZlcnNpb24gb2YgdGhpcyB0ZXN0IGFyZSB0aGF0IHRoZSBkYXRhIGFyZSBpbmRlcGVuZGVudCAod2hpY2ggdGhleSBhcmUpLCB0aGUgZGF0YSBpcyBub3JtYWxseSBkaXN0cmlidXRlZCBhbmQgdGhhdCB0aGVyZSBhcmUgZXF1YWwgdmFyaWFuY2VzIGJldHdlZW4gZ3JvdXBzLlwNClwNCg0KKioqTm9ybWFsaXR5OioqKg0KDQpVc2luZyBhIEhpc3RvZ3JhbSwgRGVuc2l0eSBQbG90LCBRUS1QbG90IHdlIGNhbiBkZXRlcm1pbmUgd2hldGhlciB0aGUgZGF0YSBpcyBub3JtYWxseSBkaXN0cmlidXRlZCBvciBub3QuIFRoZXJlIHNob3VsZCBiZSBlcXVhbCBkaXN0cmlidXRpb24gYXJvdW5kIHRoZSBtZWFuIGZvciB0aGUgZmlyc3QgdHdvIHBsb3RzIChIaXN0b2dyYW0gYW5kIERlbnNpdHkgcGxvdCkgYW5kIHRoZSBRUS1QbG90IHNob3cgc2hvdWxkIHRoZSBkYXRhIGluIGEgc3RyYWlnaHQgbGluZS4NCg0KYGBge3IgZWNobz1GQUxTRX0NCg0KI1Bsb3RzIHRvIGNoZWNrIGZvciBub3JtYWwgZGlzdHJpYnV0aW9uLCBmb3IgYWxsIG1lZGlhbiBpbmNvbWUgZGF0YQ0KDQpwYXIobWZyb3c9YygxLDMpKQ0KDQp7d2l0aChNYWxlRmVtYWxlRWFybmluZ3MsIEhpc3QoTWVkaWFuLkluY29tZSwgc2NhbGU9InBlcmNlbnQiLCB5bGFiPSAiUGVyY2VudCIsIG1haW49ICJIaXN0b2dyYW0gZm9yIEluY29tZSIsIGJyZWFrcz0iU3R1cmdlcyIsY29sPSJsaWdodGdyYXkiKSkNCiAgYWJsaW5lKHYgPSBtZWFuKE1hbGVGZW1hbGVFYXJuaW5ncyRNZWRpYW4uSW5jb21lKSwgY29sID0gInJlZCIsIGx3ZCA9IDMpDQogIGFibGluZSh2ID0gbWVkaWFuKE1hbGVGZW1hbGVFYXJuaW5ncyRNZWRpYW4uSW5jb21lKSwgY29sID0gInllbGxvdyIsIGx3ZCA9IDMpDQogIGxlZ2VuZCgidG9wcmlnaHQiLCBjKCJNZWFuIiwgIk1lZGlhbiIpLCBjb2wgPSBjKCJyZWQiLCAieWVsbG93IiksIGx3ZCA9IDMpfQ0KDQpkZW5zaXR5UGxvdCggfiBNZWRpYW4uSW5jb21lLCBkYXRhID0gTWFsZUZlbWFsZUVhcm5pbmdzLCBtYWluID0gIkRlbnNpdHkgUGxvdCBmb3IgSW5jb21lIiwgYnc9YncuU0osIGFkanVzdD0xLCBrZXJuZWw9ZG5vcm0sIG1ldGhvZD0iYWRhcHRpdmUiKQ0KDQp3aXRoKE1hbGVGZW1hbGVFYXJuaW5ncywgcXFQbG90KE1lZGlhbi5JbmNvbWUsIGRpc3Q9Im5vcm0iLCBtYWluID0gIlFRIFBsb3QgZm9yIEluY29tZSIsIGlkPWxpc3QobWV0aG9kPSJ5Iiwgbj0yLCBsYWJlbHM9cm93bmFtZXMoTWFsZUZlbWFsZUVhcm5pbmdzKSkpKQ0KDQpwYXIobWZyb3c9YygxLDEpKQ0KDQojRmlndXJlIDIuMSAuLi5Qb3NpdGl2ZSBza2V3IGluIEhpc3RvZ3JhbSBhbmQgZGVuc2l0eSBwbG90LiANCmBgYA0KDQpGaWd1cmUgMi4xOiBIaXN0b2dyYW0sIERlbnNpdHkgUGxvdCBhbmQgUVEtUGxvdCBjb21iaW5lZCB0byBjaGVjayB0aGUgYXNzdW1wdGlvbiBvZiBub3JtYWwgZGlzdHJpYnV0aW9uIGZvciBvdXIgZGF0YSBzZXQuIFRoZSBoaXN0b2dyYW0gc2hvd3MgdGhlIG1lZGlhbiBmdXJ0aGVyIHRvIHRoZSByaWdodCB0aGFuIHRoZSBtZWFuIHdoaWNoIHN1Z2dlc3RzIGEgbmVnYXRpdmUgc2tldy4gVGhlIERlbnNpdHkgcGxvdCBhbHNvIHNob3dzIHRoZSB0aGF0IHRoZSBkYXRhIGlzIG1vcmUgY2VudGVyZWQgYXJvdW5kIHRoZSByaWdodCBoYW5kIHNpZGUgcmF0aGVyIHRoYW4gdGhlIG1lYW4sIGFnYWluIHNob3dpbmcgdGhhdCB0aGUgZGF0YSBpcyBza2V3ZWQgYW5kIG5vdCBub3JtYWxseSBkaXN0cmlidXRlZC4gVGhlIFFRLVBsb3QgZG9lcyBub3QgZm9sbG93IGEgc3RyYWlnaHQgbGluZSBhbmQgaXMgdGhlcmVmb3JlIG5vdCBzaG93aW5nIG5vcm1hbCBkaXN0cmlidXRpb24uXA0KXA0KDQoqKipTaGFwaXJvLVdpbGsgVGVzdCoqKg0KDQpMb29raW5nIGF0IHRoZSB0aHJlZSBkaWZmZXJlbnQgcGxvdHMgdmlzdWFsaXppbmcgb3VyIGRhdGEsIHdlIGNhbiBkZXRlcm1pbmUgdGhhdCB0aGUgZGF0YSBkb2VzIG5vdCBmb2xsb3cgYSBub3JtYWwgZGlzdHJpYnV0aW9uLiBPbmUgZnVydGhlciBjYW4gY2hlY2sgdGhpcyB3aXRoIHRoZSBTaGFwaXJvIFdpbGsgVGVzdCB3aGljaCBpcyBhIHRlc3Qgb2Ygbm9ybWFsaXR5LiBUaGUgTnVsbCBIeXBvdGhlc2lzIHN0YXRlcyB0aGF0IHRoZSBkYXRhIGlzIG5vdCBkaWZmZXJlbnQgKGVxdWFsIHRvKSBhIG5vcm1hbCBkaXN0cmlidXRpb24uIFRoZXJlZm9yZSBpZiB3ZSByZWplY3QgdGhlIE51bGwgd2UgbXVzdCBkZXRlcm1pbmUgdGhhdCB0aGUgZGF0YSBpcyBub3Qgbm9ybWFsbHkgZGlzdHJpYnV0ZWQuIEZvciB0aGlzIHRlc3Qgd2Ugd2lsbCB1c2UgYSBzaWduaWZpY2FuY2UgbGV2ZWwgb2YgMC4wNS4NCg0KYGBge3IgZWNobz1GQUxTRX0NCnNoYXBpcm8udGVzdChNYWxlRmVtYWxlRWFybmluZ3MkTWVkaWFuLkluY29tZSkNCmBgYA0KDQpUaGUgb3V0cHV0IG9mIHRoaXMgdGVzdCBpcyBhIHAtdmFsdWUgaXMgZXh0cmVtZWx5IGxvdyBhbmQgXDwgMC4wNS4gVGhlcmVmb3JlLCB3ZSBtdXN0IGNvbmNsdWRlIHRoYXQgb3VyIGRhdGEgaXMgbm90IG5vcm1hbGx5IGRpc3RyaWJ1dGVkLlwNClwNCg0KKioqRXF1YWwgVmFyaWFuY2VzOioqKg0KDQpUaGUgbmV4dCBhc3N1bXB0aW9uIGZvciB0aGUgcGFyYW1ldHJpYyB2ZXJzaW9uIG9mIHRoaXMgdGVzdCBpcyBFcXVhbCBWYXJpYW5jZXMgYmV0d2VlbiBncm91cHMuIFdlIGRvIG5vdCBuZWVkIHRvIGRvIHRoaXMgYXNzdW1wdGlvbiBjaGVjayBhcyB3ZSBhbHJlYWR5IGtub3cgdGhlIGRhdGEgaXMgbm90IG5vcm1hbGx5IGRpc3RyaWJ1dGVkLCBhbmQgd2lsbCBjb250aW51ZSB3aXRoIHRoZSBub24tcGFyYW1ldHJpYyB2ZXJzaW9uIG9mIHRoZSB0ZXN0IHRoZSBNYW5uLVdoaXRuZXkgVSBUZXN0Lg0KDQpZZXQsIHdlIHdpbGwgZG8gaXQgYW55d2F5IGFzIGl0IGlzIHZlcnkgc2ltcGxlLiBVc2luZyB0aGUgTGV2ZW5lIFRlc3QgZm9yIGVxdWFsIHZhcmlhbmNlcyB0aGUgb3V0cHV0IGlzIHNpbWlsYXIsIHRoZSBOdWxsIEh5cG90aGVzaXMgZm9yIHRoaXMgdGVzdCBpcyB0aGF0IHRoZXJlIGlzIGVxdWFsIHZhcmlhbmNlcyBiZXR3ZWVuIGdyb3Vwcy4gVGhlcmVmb3JlIGEgcC12YWx1ZSBcPCAwLjA1IChvdXIgbGV2ZWwgb2Ygc2lnbmlmaWNhbmNlKSBtZWFucyB0aGF0IHdlIGNhbiBkZXRlcm1pbmUgdGhhdCB0aGVyZSBpcyBubyBlcXVhbCB2YXJpYW5jZSBiZXR3ZWVuIHRoZSBncm91cHMgaW4gb3VyIHNhbXBsZS4NCg0KYGBge3IgZWNobz1GQUxTRSwgd2FybmluZz1GQUxTRX0NCiNMZXZlbmUgdGVzdCBmb3IgZXF1YWwgdmFyaWFuY2VzDQoNCmxldmVuZVRlc3QoTWVkaWFuLkluY29tZX5HZW5kZXIsIE1hbGVGZW1hbGVFYXJuaW5ncykNCg0KI0VxdWFsIHZhcmlhbmNlcyBub3Qgc2VlbiBoZXJlIGFzIHAtdmFsdWUgPCAwLjA1IC0gU2lnbmlmaWNhbnQgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSB2YXJpYW5jZXMNCmBgYA0KDQpUaGUgcC12YWx1ZSBoZXJlIGlzIGV4dHJlbWVseSBsb3cgYW5kIFw8IDAuMDUuIFRoZXJlZm9yZSwgd2UgY2FuIGNvbmZpcm0gdGhhdCB0aGVyZSBpcyBub3QgZXF1YWwgdmFyaWFuY2VzIGJldHdlZW4gdGhlIHR3byBncm91cHMgaW4gb3VyIHNhbXBsZS5cDQpcDQoNCiMjIyMgW01hbm4tV2hpdG5leSBVIHRlc3Q6XXsudW5kZXJsaW5lfQ0KDQpUaGUgTWFubi1XaGl0bmV5IFUgdGVzdCBpcyB1c2VkIGFzIGEgbm9uLXBhcmFtZXRyaWMgdmVyc2lvbiBvZiB0aGUgVC10ZXN0IGZvciBJbmRlcGVuZGVudCBzYW1wbGVzLCBpdCBpcyBhbHNvIGtub3duIGFzIHRoZSBXaWxjb3hvbiByYW5rIHN1bSB0ZXN0LiBBcyB3ZSBkaWQgbm90IG1lZXQgdGhlIGFzc3VtcHRpb25zIG5lZWRlZCBmb3IgdGhlIHBhcmFtZXRyaWMgdmVyc2lvbiBvZiBvdXIgdGVzdCwgd2Ugd2lsbCBjb250aW51ZSB3aXRoIHRoZSBub24tcGFyYW1ldHJpYyB2ZXJzaW9uIG9mIG91ciB0ZXN0LlwNClwNCg0KIyMjIFsqKlJlc3VsdHMqKl17LnVuZGVybGluZX0NCg0KIyMjIyBbUmVwb3J0OiBXID0gMCwgUC1WYWx1ZSBcPCAwLjA1XXsudW5kZXJsaW5lfQ0KDQpgYGB7ciBlY2hvPUZBTFNFfQ0KI0NvbnRpbnVlIHdpdGggbm9uLXBhcmFtZXRyaWMgdmVyc2lvbiBvZiB0aGUgdGVzdC4NCiNXaWxjb3hvbiB0ZXN0DQoNCndpbGNveC50ZXN0KE1lZGlhbi5JbmNvbWUgfiBHZW5kZXIsIGRhdGEgPSBNYWxlRmVtYWxlRWFybmluZ3MsIGFsdGVybmF0aXZlID0gInR3by5zaWRlZCIsIHBhaXJlZCA9IEYpDQoNCiNQLXZhbHVlIDwgMC4wNSByZWplY3QgdGhlIG51bGwgYW5kIHRoZXJlIGlzIGEgc2lnbmlmaWNhbnQgZGlmZmVyZW5jZSBpbiBtZWRpYW4gaW5jb21lDQoNCmBgYA0KDQpUaGUgb3V0cHV0IG9mIG91ciBub24gcGFyYW1ldHJpYyB0ZXN0IGRvZXMgbm90IGluY2x1ZGUgZGVncmVlcyBvZiBmcmVlZG9tIGFzIHdlIGFyZSB3b3JraW5nIHdpdGggbWVkaWFuIHZhbHVlcyBhbmQgdGhlIHB1cnBvc2Ugb2YgdGhpcyB0ZXN0IGlzIHRvIGV2YWx1YXRlIHdoZXRoZXIgb3Igbm90IHRoZSBtZWRpYW4gb2YgdGhlIGRpZmZlcmVuY2VzIGlzIGVxdWFsIHRvIDAuDQoNClRoZSBQLVZhbHVlIGZvciB0aGlzIHRlc3QgaXMgXDwgMC4wNSwgd2hpY2ggbWVhbnMgd2UgY2FuIHJlamVjdCB0aGUgTnVsbCBIeXBvdGhlc2lzIHRoYXQgdGhlcmUgaXMgbm8gZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBjZW50cmFsIHRlbmRlbmNpZXMgb2YgTWVkaWFuIEluY29tZSBvZiBNYWxlIGFuZCBGZW1hbGVzIDE1IHllYXJzIGFuZCBPdmVyIGluIHRoZSBVUyBmcm9tIDE5NjcgLSAyMDIxLCBhbmQgZGV0ZXJtaW5lIHRoYXQgdGhlIFJlc2VhcmNoIEh5cG90aGVzaXMgdGhhdCB0aGVyZSBpcyBhIHNpZ25pZmljYW50IGRpZmZlcmVuY2UgaXMgbW9yZSBhdHRyYWN0aXZlLlwNClwNCg0KIyMjIFsqKkRpc2N1c3Npb24qKl17LnVuZGVybGluZX0NCg0KVGhlIG1lZGlhbiB2YWx1ZSBvZiB0aGUgTWVkaWFuIEluY29tZSBmb3IgMTUgWWVhcnMgYW5kIE92ZXIgaW4gdGhlIFVTIGZyb20gMTk2Ny0yMDIxIHdhcyBcJDIxLDE2MCBhbmQgXCQ0Miw1MTAgZm9yIFdvbWVuIGFuZCBNZW4gcmVzcGVjdGl2ZWx5LiBXZSBwcmV2aW91c2x5IGRldGVybWluZWQgdGhhdCB0aGlzIHdhcyBhIGxhcmdlIGRpZmZlcmVuY2UgYnV0IG5vdyB3ZSBjYW4gc2F5IHRoZSBkaWZmZXJlbmNlIGlzIHNpZ25pZmljYW50IGFzIHRoZSBQLVZhbHVlIFw8IDAuMDUgYW5kIG9uIGFueSBvbmUgdGVzdCBvZiB0aGUgTnVsbCBIeXBvdGhlc2lzIHdlIGNhbiBzYXkgdGhhdCB0aGVyZSBpcyBhIGxlc3MgdGhhbiA1JSBwcm9iYWJpbGl0eSB0aGF0IHRoZSByZXN1bHRzIHdpbGwgYmUgZHVlIHRvIGNoYW5jZSBhbG9uZS5cDQpcDQoNCiMjIyMgW1Zpc3VhbGl6YXRpb25dey51bmRlcmxpbmV9DQoNCmBgYHtyIGVjaG89RkFMU0V9DQojdmlzdWFsaXNhdGlvbg0KZ2dwbG90KGRhdGEgPSBNYWxlRmVtYWxlRWFybmluZ3MsIGFlcyh4PUdlbmRlciwgeT1NZWRpYW4uSW5jb21lLCBjb2xvciA9IEdlbmRlcikpICsNCiAgZ2VvbV9ib3hwbG90KGxpbmV3aWR0aCA9IDAuOCwgd2lkdGggPSAwLjgpICsNCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYygiIzAwMDBGRiIsICIjRkYwMDAwIikpICsNCiAgdGhlbWVfbWluaW1hbChiYXNlX3NpemUgPSAxMikgKw0KICB0aGVtZShheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0LCAgdmp1c3QgPSAtNSksDQogICAgICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQsIHZqdXN0ID0gNSksDQogICAgICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE2LCB2anVzdCA9IDUpLA0KICAgICAgICBwbG90Lm1hcmdpbiA9IHVuaXQoYygxLDEsMSwxKSwgImNtIikpICsNCiAgeGxhYigiR2VuZGVyIikgKw0KICB5bGFiKCJNZWRpYW4gSW5jb21lICgkKSIpICsNCiAgbGFicyh0aXRsZSA9IGV4cHJlc3Npb24odW5kZXJsaW5lKCJNZWRpYW4gSW5jb21lKCQpIGJ5IEdlbmRlciBpbiB0aGUgVVMgMTk2NyAtIDIwMjEiKSkpDQojRmlndXJlIDIuMiAuLi4NCmBgYA0KDQpGaWd1cmUgMi4yOiBCb3ggUGxvdCBmb3IgTWVkaWFuIEluY29tZSBieSBHZW5kZXIgaW4gdGhlIFVTIGJldHdlZW4gdGhyb3VnaG91dCB0aGUgeWVhcnMgb2YgMTk2Ny0yMDIxLCBmb3IgYWxsIHBlb3BsZSBhZ2VkIDE1IHllYXJzIGFuZCBPbGRlciBpbiAyMDIyIERvbGxhcnMgKEluZmxhdGlvbiBhY2NvdW50ZWQgZm9yKS4gSW50ZXJxdWFydGlsZSByYW5nZSBzaG93biBhcyB0aGUgYm94IGFuZCB0aGUgd2hpc2tlcnMgYXJlIHRoZSB0b3RhbCByYW5nZS4gV2l0aCB0aGUgbGluZSB0aHJvdWdoIHRoZSBtaWRkbGUgYXMgdGhlIG1lZGlhbi4gRmVtYWxlIHBsb3Qgc2hvd3MgYSBsYXJnZXIgaW50ZXJxdWFydGlsZSByYW5nZSwgd2hpY2ggc2hvd3MgYSBsYXJnZXIgc3ByZWFkIG9mIHZhbHVlcy4gV2hlcmUgYXMgdGhlIE1hbGUgcGxvdCBkb2VzIG5vdC5cDQpcDQoNCkNvbXBhcmluZyBib3RoIHRoZXNlIGJvdGggb2YgdGhlc2UgcGxvdHMgc2hvd3MgdGhhdCBXb21lbiBoYXZlIGhhZCBhIGxhcmdlciBpbmNyZWFzZSBvdmVyIHRoZSB5ZWFycywgd2hpY2ggaXMgdmlzdWFsaXplZCBieSB0aGUgZ3JlYXRlciBvdmVyYWxsIHJhbmdlIChtaW5pbXVtIGFuZCBtYXhpbXVtIHZhbHVlcykuIEFsc28gdGhlIGludGVycXVhcnRpbGUgcmFuZ2UgZm9yIEZlbWFsZXMgaXMgbGFyZ2VyIHRoYW4gdGhhdCBvZiB0aGUgTWFsZXMgd2hpY2ggc2hvd3MgYSBncmVhdGVyIHNwcmVhZCBvZiB2YWx1ZXMsIHdoaWNoIGFsc28gaW5kaWNhdGUgcHJvZ3Jlc3Npb25zIG92ZXIgdGhlIHllYXJzIGFzIHRoZXJlIGlzIG1vcmUgdmFyaWFiaWxpdHkuDQoNCllldCwgdGhlIHBsb3QgZm9yIE1hbGVzIGlzIG11Y2ggbW9yZSBjbHVzdGVyZWQgdG9nZXRoZXIgc2hvd2luZyBsZXNzIGNoYW5nZSBidXQgYWxzbyBtb3JlIGNvbmNlbnRyYXRpb24gYXJvdW5kIGEgaGlnaGVyIHZhbHVlLiBUaGUgbWluaW11bSB2YWx1ZSBmb3IgTWFsZXMgaXMgYWxzbyBoaWdoZXIgdGhhbiB0aGF0IG9mIHRoZSBGZW1hbGVzIG1heGltdW0uIFNpbmNlIHdlIGFyZSBsb29raW5nIGF0IHRoaXMgZGF0YSBpbiAyMDIyIERvbGxhcnMsIHdlIHNlZSB0aGF0IEZlbWFsZSBNZWRpYW4gSW5jb21lIGlzIHlldCB0byBjYXRjaCB1cCB0byB0aGUgTWFsZXMgTWluaW11bSBJbmNvbWUgZnJvbSAxOTY3LTIwMjEuXA0KXA0KDQojIyMjIFtFZmZlY3QgU2l6ZV17LnVuZGVybGluZX0NCg0KVGhlIGVmZmVjdHMgc2l6ZSB0ZWxscyB1cyB0aGUgbWFnbml0dWRlIG9mIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIHR3byBncm91cHMgd2l0aCByZWdhcmRzIHRvIG91ciB5IHZhcmlhYmxlIHdoaWNoIGlzIE1lZGlhbi5JbmNvbWUgaW4gdGhpcyBjYXNlLiBXaXRoIGFuIHIgbGVzcyB0aGFuIDAuMyB0aGVyZSBpcyBhIHNtYWxsIGVmZmVjdCwgYmV0d2VlbiAwLjMgYW5kIDAuNSBpcyBhIG1lZGl1bSBlZmZlY3QgYW5kIGdyZWF0ZXIgdGhhbiAwLjUgc2hvd3MgYSBsYXJnZSBlZmZlY3QgKERBVEF0YWIsIDIwMjQpLg0KDQpgYGB7ciBlY2hvPUZBTFNFfQ0KI0VmZmVjdCBzaXplDQoNCndpbGNveF9lZmZzaXplKE1hbGVGZW1hbGVFYXJuaW5ncywgTWVkaWFuLkluY29tZSB+IEdlbmRlciwgcGFpcmVkID0gRikNCg0KI0xhcmdlIG1hZ25pdHVkZSwgZWZmc2l6ZSA9IDAuODYyLg0KYGBgDQoNClRoZSBlZmZlY3Qgc2l6ZSBmb3Igb3VyIHRlc3QgaXMgcj0wLjg2MiBtZWFuaW5nIHRoYXQgdGhlcmUgaXMgYSBsYXJnZSBtYWduaXR1ZGUgb2YgZWZmZWN0IHNpemUuIFdoaWNoIHNob3dzIGEgc3Vic3RhbnRpYWwgc3RyZW5ndGggb2YgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSB0d28gZ3JvdXBzIE1hbGUgYW5kIEZlbWFsZSBieSB0aGUgdmFyaWFibGUgTWVkaWFuIEluY29tZS4gVGhlIGRpZmZlcmVuY2Ugd2UgaGF2ZSBhbHJlYWR5IHN0YXRlZCB0byBiZSBzaWduaWZpY2FudCwgYW5kIG5vdyB0aGUgZWZmZWN0IG9mIHdoaWNoIGdlbmRlciBoYXMgb24gdGhlIGRpZmZlcmVuY2UgaW4gTWVkaWFuIEluY29tZSB3ZSBjYW4gZXhwbGFpbiB0byBiZSBvZiBhIGxhcmdlIG1hZ25pdHVkZS4NCg0KVGhlIHNpZ25pZmljYW50IGRpZmZlcmVuY2Ugb2YgTWVkaWFuIEluY29tZSBiZXR3ZWVuIHRoZSB0d28gR2VuZGVycyBjYW4gYmUgY29uY2x1ZGVkIHRvIHNob3cgdGhhdCB0aGVyZSBpcyBzdGlsbCBhIHBheSBnYXAgZXZlbiB3aXRoIHRoZSBFcXVhbCBQYXkgQWN0IGluIHBsYWNlLiBXaGljaCB3ZSB0aGVyZWZvcmUgZGV0ZXJtaW5lIHRvIGJlIGR1ZSB0byBvdGhlciBmYWN0b3JzIHJhdGhlciB0aGFuIGxhdyBvZiBlcXVhbCBwYXkgaXRzZWxmLg0KDQpPbmUgbWF5IGNvbnNpZGVyIHRoYXQsIHdvbWVuIGFyZSBsaWtlbHkgdG8gaGF2ZSBhIGxvd2VyIHJpc2sgdG9sZXJhbmNlIHRoYW4gbWVuIHdoaWNoIG1heSBjYXVzZSB0aGVtIHRvIG5vdCB0YWtlIG9uIGhpZ2hlciBwYXlpbmcgam9icy4gWWV0LCB3aXRoIHJpc2sgdGhlcmUgaXMgYWxzbyBmYWlsdXJlIGFuZCB0aGF0IHNob3VsZCBsZWFkIHRvIGdyZWF0ZXIgdmFyaWFiaWxpdHkgaW4gdGhlIG1lZGlhbiBpbmNvbWUgZm9yIG1lbi4NCg0KT3RoZXIgZmFjdG9ycyB3aGljaCBzaG91bGQgYmUgY29uc2lkZXJlZCBhcmUgc2VncmVnYXRpb24gaW4gdGhlIHdvcmsgcGxhY2UgYW5kIHdvcmsgZXhwZXJpZW5jZSAoQXJhZ2FvLCAyMDIzKS4gU2luY2UsIHRoZSBpbXByb3ZlbWVudHMgcmVnYXJkaW5nIFdvbWFuJ3MgcmlnaHRzIGFyZSBub3Qgc3VwZXIgbmV3IChFcXVhbCBQYXkgQWN0IG9ubHkgaGFwcGVuZWQgNjEgeWVhcnMgYWdvIGluIHRpbWUgb2Ygd3JpdGluZyB0aGlzIHBhcGVyKSwgdGhlcmUgbWF5IHN0aWxsIGJlIHNvbWUgcHJlanVkaWNlIGluIGNlcnRhaW4gZmllbGRzIHRvd2FyZHMgd29tZW4gd2hpY2ggbWFrZSBpdCBoYXJkIGZvciB0aGVtIHRvIGZpbmQgd29yay4gTW9yZSByZXNlYXJjaCBzaG91bGQgYmUgZG9uZSB0byBhbmFseXNlIHRoaXMgdG9waWMuDQoNCkVkdWNhdGlvbmFsIGF0dGFpbm1lbnQgaXMgYW5vdGhlciBvdXRzaWRlIGZhY3RvciB3aGljaCB3aWxsIGhhdmUgYW4gZWZmZWN0IG9uIHRoZSBwYXkgZ2FwIGJldHdlZW4gTWVuIGFuZCBXb21lbiBhcyBzdGF0ZWQgYnkgQ2Fyb2xpbmEgQXJhZ2FvICgyMDIzKS4gU29jaWFsbHktY29uc3RydWN0ZWQgbm9ybXMgdGhhdCBkZWZpbmUgdGhlIHJvbGVzIHRoYXQgTWVuIGFuZCBXb21lbiBzaG91bGQgcGxheSBpcyBhIHJlYXNvbiB3aHkgZ2lybHMgYXJlIG1vcmUgbGlrZWx5IHRvIGJlIG91dCBvZiBzY2hvb2wgdGhhbiBib3lzIGFjcm9zcyB0aGUgd29ybGQgKFNpZGEsIDIwMTcpLiBQcmVzc3VyZXMgb2Ygc29jaWV0eSBhbmQgbGlmZSBvdXRzaWRlIG9mIHdvcmsgaGF2ZSBhbiBlZmZlY3Qgb24gYm90aCBtZW4gYW5kIHdvbWVuIGJ1dCBjb3VsZCBhbHNvIGJlIGEgcmVhc29uIHdoeSB3b21lbiBoYXZlIGEgbG93ZXIgTWVkaWFuIEluY29tZSB0aGFuIE1lbiBpbiB0aGUgVVMgZHVyaW5nIHRoZXNlIHllYXJzLg0KDQpGdXJ0aGVyIGRhdGEgY29sbGVjdGlvbiBhbmQgYW5hbHlzaXMgcmVnYXJkaW5nOyBlZHVjYXRpb25hbCBhdHRhaW5tZW50IGZvciBib3RoIGdlbmRlcnMsIGRpZmZlcmVuY2VzIGluIHNvY2lhbCBwcmVzc3VyZXMgKGJvdGggaW4gYW5kIG91dCBvZiB3b3JrKSBieSBnZW5kZXIsIGFuZCB0aGUgZGlmZmVyZW5jZXMgaW4gcmlzayB0b2xlcmFuY2UgZm9yIGJvdGggZ2VuZGVycywgbWF5IGhlbHAgdXMgZnVydGhlciBhbnN3ZXIgdGhlICJ3aHk/IiB0byBvdXIgcGF5IGdhcCBxdWVzdGlvbi5cDQpcDQpcDQpcDQpcDQpcDQpcDQpcDQoNCiMjIyBbKipQYXJ0IDMgLSBHZW5kZXIsIEluY29tZSBhbmQgRGVncmVlcyBpbiB0aGUgVVMgZnJvbSAxOTkxIC0gMjAyMS4qKl17LnVuZGVybGluZX0NCg0KIyMjIFsqKkludHJvZHVjdGlvbioqXXsudW5kZXJsaW5lfQ0KDQpUaGUgcHJldmlvdXMgc3R1ZGllcyBpbiB0aGlzIHByb2plY3QgaGF2ZSBwcm92aWRlZCB1cyB3aXRoIG1vcmUgb2YgYW4gdW5kZXJzdGFuZGluZyBhYm91dCBGZW1pbmlzbSBhbmQgaXRzIHBvc2l0aXZlIGVmZmVjdCBvbiB0aGUgRmVtYWxlIE1lZGlhbiBJbmNvbWUgaW4gdGhlIFVTLiBBcyBzaG93biBpbiBwYXJ0IG9uZSBvZiB0aGlzIHN0dWR5LCB0aGUgaW1wcm92ZW1lbnRzIGluIHNvY2lldHkgaW4gdGhlIFVTIHJlZ2FyZGluZyBXb21hbidzIHJpZ2h0cyBoYXZlIGxlZCB0byBhIHNpZ25pZmljYW50IGluY3JlYXNlIGluIE1lZGlhbiBGZW1hbGUgSW5jb21lLg0KDQpQYXJ0IHR3byBvZiB0aGlzIHN0dWR5IGZpbmlzaGVkIG9mZiB3aXRoIGFuIGFuYWx5c2lzIGRldGFpbGluZyB0aGF0IGV2ZW4gdGhvdWdoIGFjY29yZGluZyB0byBUaGUgVS5TLiBEZXBhcnRtZW50IG9mIExhYm9yICgyMDI0KSB0aGUgRXF1YWwgcGF5IGFjdCB3YXMgcHV0IGluIHBsYWNlIGluIDE5NjMsIHRoZXJlIHdhcyBzdGlsbCBhIHNpZ25pZmljYW50IGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgbWVkaWFuIGluY29tZSBiZXR3ZWVuIHRoZSB0d28gZ2VuZGVycyBpbiB0aGUgVVMuDQoNClRoZXJlZm9yZSwgdGhpcyBzdHVkeSB3aWxsIGxvb2sgdG8gZGVsdmUgZGVlcGVyIGludG8gdGhlIHBheSBnYXAgYmV0d2VlbiBnZW5kZXJzIGluIHRoZSBVUyBhbmQgYW5hbHlzZSBtb3JlIG9mIHRoZSBmYWN0b3JzIHRoYXQgbWlnaHQgaGF2ZSBoYWQgYW4gZWZmZWN0IG9uIHRoZSBkaWZmZXJlbmNlIGluIG1lZGlhbiBpbmNvbWUgaW4gdGhlIFVTLiBPbmUgZmFjdG9yIGluIHBhcnRpY3VsYXIgYmVpbmcgZWR1Y2F0aW9uYWwgYXR0YWlubWVudCwgc3BlY2lmaWNhbGx5IHRoYXQgb2YgYSBkZWdyZWUuDQoNCldpdGggbW9yZSBsYXdzIGJlaW5nIHB1dCBpbnRvIHBsYWNlIGluIHRoZSBVUyB0byBmb3N0ZXIgYSBiZXR0ZXIgbGVhcm5pbmcgZW52aXJvbm1lbnQgZm9yIHdvbWVuLCBzdWNoIGFzIFRoZSBXb21lbidzIEVkdWNhdGlvbmFsIEVxdWl0eSBBY3Qgb2YgMTk3NCAoTldIUCwgMjAyMykgd2hpY2ggd2FzIHNldCBvdXQgdG8gZW5jb3VyYWdlIGZ1bGwgZWR1Y2F0aW9uYWwgb3Bwb3J0dW5pdGllcyBmb3IgZ2lybHMgYW5kIHdvbWVuLCBhbmQgdGhlIEdlbmRlciBFcXVpdHkgQWN0IG9mIDE5OTQgKE5XSFAsIDIwMjMpIHdoaWNoIHdhcyBjcmVhdGVkIHRvIHByb21vdGUgZ2VuZGVyIGVxdWFsaXR5IGFuZCBlbGltaW5hdGUgZGlzY3JpbWluYXRpb24uIE9uZSB3b3VsZCBzdXNwZWN0IHRoYXQgbW9yZSB3b21lbiBhcmUgbGlrZWx5IHRvIHRha2Ugb24gYSBkZWdyZWUgdGhhbiBiZWZvcmUuDQoNCldpdGggZGF0YSBmb3IgYm90aCBnZW5kZXJzIGFuZCB0aGUgZGlmZmVyZW50IGRlZ3JlZSB0eXBlcyB3ZSB3aWxsIGJlIGFibGUgdG8gdW5jb3ZlciB3aGljaCBkZWdyZWUgdHlwZSBpcyB0aGUgaGlnaGVzdCBwYXlpbmcgYW5kIHdoZXRoZXIgdGhlcmUgaXMgc3RpbGwgYSBkaWZmZXJlbmNlIGluIG1lZGl1bSBpbmNvbWUgYmV0d2VlbiB0aGUgZ2VuZGVycyB3aGVuIGJvdGggZ2VuZGVyIGhhdmUgdGhlIHNhbWUgZGVncmVlIHR5cGUuDQoNClRoZXJlZm9yZSwgcGFydCB0aHJlZSBvZiB0aGlzIHByb2plY3Qgd2lsbCBjb3ZlciBhbiBhbmFseXNpcyBvZiB0aGUgbWVkaWFuIGluY29tZSBmb3IgbWVuIGFuZCB3b21lbiBpbiB0aGUgVVMgZnJvbSAxOTkxLTIwMjEsIGFjcm9zcyB0aHJlZSBkaWZmZXJlbnQgdHlwZXMgb2YgZGVncmVlczsgYmFjaGVsb3JzLCBtYXN0ZXJzIGFuZCBkb2N0b3JhdGUuIFByb2Zlc3Npb25hbCBkZWdyZWUgd2lsbCBub3QgYmUgaW5jbHVkZWQgaW4gdGhpcyBzdHVkeSBhcyB0aGVyZSB3YXMgbGFja2luZyBkYXRhIGZvciAyMDA3IGFuZCAyMDA4LlwNClwNCg0KT3VyIHJlc2VhcmNoIHF1ZXN0aW9uIGZvciB0aGlzIHN0dWR5IGlzIGFzIGZvbGxvd3M6DQoNCipJcyB0aGVyZSBhbiBpbnRlcmFjdGlvbiBiZXR3ZWVuIEdlbmRlciBhbmQgRGVncmVlIFR5cGUgb24gTWVkaWFuIEluY29tZSBMZXZlbCBpbiB0aGUgVVMgZnJvbSAxOTkxLTIwMjE/KlwNClwNCg0KIyMjIyBbVHdvLVdheSBBTk9WQTpdey51bmRlcmxpbmV9DQoNClRoaXMgcmVzZWFyY2ggcXVlc3Rpb24gd2lsbCBiZSBhbnN3ZXJlZCB3aXRoIGEgVHdvLVdheSBBTk9WQS4gVGhlIFR3by1XYXkgQW5hbHlzaXMgb2YgVmFyaWFuY2Ugd2lsbCBiZSB1c2VkIGFzIHdlIGFyZSBjb21wYXJpbmcgdGhlIGVmZmVjdCBvdXIgdHdvIGluZGVwZW5kZW50IHZhcmlhYmxlcyAoR2VuZGVyLCBEZWdyZWUgVHlwZSkgaGF2ZSBvbiBhIGRlcGVuZGVudCB2YXJpYWJsZSAoTWVkaWFuIEluY29tZSBpbiB0aGUgVVMpLg0KDQpGaXJzdGx5LCB3ZSB3aWxsIGJlIGFibGUgdG8gYW5hbHlzZSB3aGV0aGVyIE1lZGlhbiBpbmNvbWUgaXMgZXF1YWwgYWNyb3NzIHRoZSB0d28gZ2VuZGVycywgd2hpY2ggd2UgZGlzY292ZXJlZCBpbiBwYXJ0IDIgdGhhdCBpcyBpcyBub3QgZm9yIHRoZSB0b3RhbCBwb3B1bGF0aW9uIG9mIG1lbiBhbmQgd29tZW4gMTUgeWVhcnMgYW5kIG92ZXIgaW4gdGhlIFVTLiBZZXQsIG5vdyB3ZSB3aWxsIGJlIGFuYWx5emluZyB3aGV0aGVyIHRoZXJlIGlzIGEgZGlmZmVyZW5jZSBpbiBtZWRpYW4gaW5jb21lIGZvciB0aG9zZSB3aG8gc3BlY2lmaWNhbGx5IGhhdmUgYSBiYWNoZWxvcnMgZGVncmVlIG9yIG92ZXIgKG5vdCBpbmNsdWRpbmcgcHJvZmVzc2lvbmFsIGRlZ3JlZSkuDQoNCldpdGggb3VyIFR3by1XYXkgYW5vdmEsIHdlIHdpbGwgYWxzbyBiZSBhYmxlIHRvIGFuYWx5c2Ugd2hldGhlciB0aGUgbWVkaWFuIGluY29tZSBpcyBlcXVhbCBhY3Jvc3MgdGhlIGRpZmZlcmVudCBkZWdyZWVzLCBvciB3aGV0aGVyIHRoZXJlIGlzIGEgc2lnbmlmaWNhbnQgZGlmZmVyZW5jZS4NCg0KRnVydGhlcm1vcmUsIHdlIGNhbiBkbyBhIGNyb3NzIHRyZWF0bWVudCBhbmFseXNpcyB0byB1bmNvdmVyIHRoZSBkaWZmZXJlbmNlcyBpbiBtZWRpYW4gaW5jb21lIGJldHdlZW4gZ2VuZGVycyBhY3Jvc3MgdGhlIGRpZmZlcmVudCBkZWdyZWVzIGFuZCBhbHNvIGJldHdlZW4gdGhlIGRpZmZlcmVudCBkZWdyZWVzIGFjcm9zcyB0aGUgZGlmZmVyZW50IGdlbmRlcnNcDQpcDQoNCiMjIyMgW0h5cG90aGVzaXMgMSwgMiArIDM6XXsudW5kZXJsaW5lfQ0KDQoxc3QgSHlwb3RoZXNpcyBhbmQgUmVzZWFyY2ggUXVlc3Rpb246DQoNCi0gICBIMDogTWVkaWFuIEluY29tZSBpcyBlcXVhbCBhY3Jvc3MgZ2VuZGVycyB3aXRoIGEgYmFjaGVsb3JzIG9yIG92ZXIuDQoNCi0gICBIMTogTWVkaWFuIEluY29tZSBpcyBkaWZmZXJlbnQgYWNyb3NzIGdlbmRlcnMgd2l0aCBhIGJhY2hlbG9ycyBvciBvdmVyDQoNCjJuZCBIeXBvdGhlc2lzIGFuZCBSZXNlYXJjaCBRdWVzdGlvbjoNCg0KLSAgIEgwOiBNZWRpYW4gSW5jb21lIGlzIGVxdWFsIGFjcm9zcyB0aGUgZGVncmVlIHR5cGVzDQoNCi0gICBIMTogTWVkaWFuIEluY29tZSBpcyBlcXVhbCBhY3Jvc3MgdGhlIGRlZ3JlZSB0eXBlcw0KDQozcmQgSHlwb3RoZXNpcyBhbmQgUmVzZWFyY2ggUXVlc3Rpb246DQoNCi0gICBIMDogQWxsIDYgZ3JvdXBzIGNyZWF0ZWQgYnkgY3Jvc3MgdHJlYXRtZW50IGhhdmUgZXF1YWwgbWVhbnMNCg0KLSAgIEgxOiBBbGwgNiBncm91cHMgY3JlYXRlZCBieSBjcm9zcyB0cmVhdG1lbnQgZG8gbm90IGhhdmUgZXF1YWwgbWVhbnMNCg0KRm9yIHRoaXMgc3R1ZHkgd2Ugc2V0IGEgc2lnbmlmaWNhbmNlIGxldmVsIG9mIDAuMDUsIHdoaWNoIG1lYW5zIHdlIGFyZSB3aWxsaW5nIHRvIHNheSB0aGF0IHRoZSB0aGVyZSBpcyBhIDUlIGNoYW5jZSB0aGF0IHRoZSByZXN1bHRzIHdpbGwgb2NjdXIgZHVlIHRvIGNoYW5jZSBhbG9uZS4gT25seSB3aGVuIG91ciBwLXZhbHVlIGlzIGxvd2VyIHRoYW4gb3VyIHNpZ25pZmljYW5jZSBsZXZlbCBvZiAwLjA1IGNhbiB3ZSByZWplY3QgdGhlIE51bGwgSHlwb3RoZXNpcyBhbmQgZGV0ZXJtaW5lIHRoYXQgdGhlIFJlc2VhcmNoIEh5cG90aGVzaXMgaXMgbW9yZSBhdHRyYWN0aXZlLlwNClwNCg0KIyMjIFsqKk1ldGhvZCoqXXsudW5kZXJsaW5lfQ0KDQpUbyBzdGFydCBvdXIgYW5hbHlzaXMgdGhlIHJlbGV2YW50IHBhY2thZ2VzIGFyZSBsb2FkZWQgaW50byBSIFN0dWRpby4NCg0KYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCiNMb2FkaW5nIFBhY2thZ2VzDQpsaWJyYXJ5KGtuaXRyKQ0KbGlicmFyeShrYWJsZUV4dHJhKQ0KbGlicmFyeShwc3ljaCkNCmxpYnJhcnkoY2FyKQ0KbGlicmFyeShnZ3Bsb3QyKQ0KbGlicmFyeShtdWx0Y29tcCkNCmxpYnJhcnkoZ2dlZmZlY3RzKQ0KbGlicmFyeShwaGlhKQ0KbGlicmFyeShlZmZlY3RzKQ0KYGBgDQoNClRoZW4gdGhlIGRhdGEgaXMgc291cmNlZCBhbmQgZG93bmxvYWRlZCBmcm9tIHd3dy5jZW5zdXMuZ292LiBUYWJsZSBQLTE2LiBFZHVjYXRpb25hbCBBdHRhaW5tZW50LS1QZW9wbGUgMjUgWWVhcnMgT2xkIGFuZCBPdmVyIGJ5IE1lZGlhbiBJbmNvbWUgYW5kIFNleDogMTk5MSB0byAyMDIyLiBUaGUgZGF0YSB1c2VkIGluIHRoaXMgc3R1ZHkgYXJlIGluIDIwMjIgZG9sbGFycywgc28gdGhhdCBpbmZsYXRpb24gaXMgYWNjb3VudGVkIGZvciBvdmVyIHRoZSBkaWZmZXJlbnQgeWVhcnMuIFRoZSB0aHJlZSB0YWJsZXMgdXNlZCBvdXQgb2YgdGhlIG11bHRpcGxlIGF2YWlsYWJsZSBpbiB0aGlzIGRhdGEgc2V0IChQLTE2KSBpcyBmb3IgYm90aCBnZW5kZXJzLCB3aXRoIGEgYmFjaGVsb3JzIGRlZ3JlZSwgbWFzdGVycyBkZWdyZWUgYW5kIGRvY3RvcmF0ZSBkZWdyZWUuDQoNCkFzIHByZXZpb3VzbHkgc3RhdGVkIHRoZSBQcm9mZXNzaW9uYWwgRGVncmVlIHRhYmxlIHdpbGwgbm90IGJlIHVzZWQgYXMgaXQgd2FzIG1pc3NpbmcgZGF0YSBmb3IgMjAwNyBhbmQgMjAwOC4gVGhlIGRhdGEgaXMgdGhlbiBsb2FkZWQgYW5kIHRyYW5zZm9ybWVkIGludG8gZXhjZWwsIG9ubHkga2VlcGluZyB0aGUgbmVjZXNzYXJ5IHZhbHVlcyBhbmQgY29sdW1ucyBhbG9uZyB3aXRoIHRoZSB2YWx1ZXMgZm9yIGVhY2ggeWVhci4NCg0KQXMgaW4gYm90aCBwYXJ0IG9uZSBhbmQgdHdvIG9mIHRoaXMgc3R1ZHksIHRoZSByb3dzIGZvciAyMDE3IGFuZCAyMDEzIGhhdmUgYmVlbiByZXBlYXRlZCBpbiB0aGUgZGF0YSBzZXQgZG93bmxvYWRlZCBmcm9tIFVTIENlbnN1cywgc28gd2hlbiBpbXBvcnRlZCBpbnRvIGV4Y2VsIEkgaGF2ZSBjYWxjdWxhdGVkIHRoZSBhdmVyYWdlIG9mIHRoZXNlIHJvd3MgaW5zdGVhZCBvZiBhbGxvd2luZyB0d28gaW5zdGFuY2VzIGZvciB0aGUgc2FtZSB5ZWFyLg0KDQpMYXN0bHksIGZ1cnRoZXIgZGF0YSBjbGVhbmluZyB3YXMgcGVyZm9ybWVkIGluIFIgdHJhbnNmb3JtaW5nIHRoZSB2YXJpYWJsZXMgR2VuZGVyIGFuZCBEZWdyZWUgdG8gZmFjdG9ycyBhbmQgTWVkaWFuLkluY29tZSB0byBpbnRlZ2VyLlwNClwNCg0KIyMjIyBbU3VtbWFyeSBvZiB0aGUgRGF0YTpdey51bmRlcmxpbmV9DQoNCmBgYHtyIGluY2x1ZGU9RkFMU0V9DQojSW1wb3J0aW5nIHRoZSBkYXRhDQpHZW5kZXJJbmNvbWVEZWdyZWUgPC0gcmVhZC5jc3YoIkM6L1VzZXJzL2VkcmVuL09uZURyaXZlL0Rlc2t0b3AvRGF0YSBBbmFseXNpcy9SIFdvcmtpbmcgRGlyZWN0b3J5L0ZpbmFsIFByb2plY3QgQXNzaWdubWVudC9EYXRhc2V0cy9EYXRhU2V0cy9HZW5kZXJJbmNvbWVEZWdyZWUuY3N2IikNCg0KbmFtZXMoR2VuZGVySW5jb21lRGVncmVlKSA8LSBjKCJZZWFyIiwgIkdlbmRlciIsICJNZWRpYW4uSW5jb21lIiwgIkRlZ3JlZSIpDQoNCiNjaGVja2luZyB0aGUgc3RydWN0dXJlIG9mIHRoZSBkYXRhDQoNCnN0cihHZW5kZXJJbmNvbWVEZWdyZWUpDQoNCkdlbmRlckluY29tZURlZ3JlZSRHZW5kZXIgPC0gYXMuZmFjdG9yKEdlbmRlckluY29tZURlZ3JlZSRHZW5kZXIpDQoNCkdlbmRlckluY29tZURlZ3JlZSREZWdyZWUgPC0gYXMuZmFjdG9yKEdlbmRlckluY29tZURlZ3JlZSREZWdyZWUpDQoNCkdlbmRlckluY29tZURlZ3JlZSRNZWRpYW4uSW5jb21lIDwtIGFzLmludGVnZXIoR2VuZGVySW5jb21lRGVncmVlJE1lZGlhbi5JbmNvbWUpDQoNCnN0cihHZW5kZXJJbmNvbWVEZWdyZWUpDQoNCiNJbml0aWFsIGxvb2sgYXQgdGhlIGRhdGENCg0KaGVhZChHZW5kZXJJbmNvbWVEZWdyZWUpDQoNCmhlYWQoR2VuZGVySW5jb21lRGVncmVlW0dlbmRlckluY29tZURlZ3JlZSREZWdyZWUgPT0gIk1hc3RlcnMiLF0pDQoNClRhYmxlSW5jb21lRGVncmVlIDwtIHJiaW5kKGhlYWQoR2VuZGVySW5jb21lRGVncmVlLDQpLCAiLi4uIiwgaGVhZChHZW5kZXJJbmNvbWVEZWdyZWVbR2VuZGVySW5jb21lRGVncmVlJERlZ3JlZSA9PSAiTWFzdGVycyIsXSwyKSwgdGFpbChHZW5kZXJJbmNvbWVEZWdyZWVbR2VuZGVySW5jb21lRGVncmVlJERlZ3JlZSA9PSAiTWFzdGVycyIsXSwyKSwgIi4uLiIsIHRhaWwoR2VuZGVySW5jb21lRGVncmVlLDQpKQ0KDQpgYGANCg0KYGBge3IgZWNobz1GQUxTRX0NCmthYmxlKFRhYmxlSW5jb21lRGVncmVlLA0KICAgICAgY2FwdGlvbiA9ICJUYWJsZSAzLjE6IEluaXRpYWwgbG9vayBhdCBob3cgb3VyIGRhdGEgaXMgbGFpZCBvdXQuIFByb3ZpZGluZyBJbmNvbWUgZGF0YSBmb3IgYm90aCBHZW5kZXJzIGFuZCAzIGRpZmZlcmVudCBkZWdyZWUgdHlwZXMgaW4gdGhlIFVTIGZyb20gMTk5MSAtIDIwMjIuIFRoZSBJbmNvbWUgaW4gdGhpcyBkYXRhc2V0IGFjY291bnRzIGZvciBpbmZsYXRpb24gYW5kIGlzIGluIDIwMjIgRG9sbGFycyAoJCkuIikgJT4lDQogIGthYmxlX3N0eWxpbmcoYm9vdHN0cmFwX29wdGlvbnMgPSAic3RyaXBlZCIpICU+JQ0KICByb3dfc3BlYygwLCBib2xkID0gVCwgZm9udF9zaXplID0gMTUpDQpgYGANCg0KVGhlIGRhdGEgaXMgc2VwYXJhdGVkIGludG8gZm91ciBjb2x1bW5zLCBwcm92aWRpbmcgaW5mb3JtYXRpb24gZm9yIGJvdGggR2VuZGVycyBhbmQgdGhlaXIgbWVkaWFuIGluY29tZSBpbiB0aGUgVVMgZnJvbSB0aGUgeWVhcnMgMTk5MS0yMDIxIHdpdGggcmVnYXJkcyB0byB0aGUgdGhyZWUgRGVncmVlIHR5cGVzIHdlIGhhdmUgc2VsZWN0ZWQgZm9yIHRoaXMgc3R1ZHk7IEJhY2hlbG9ycywgTWFzdGVycywgRG9jdG9yYXRlLg0KDQpBZ2FpbiwgYXMgd2UgYXJlIGFuYWx5emluZyB0d28gR2VuZGVycyBhbmQgdGhyZWUgRGVncmVlIHR5cGVzLCB0aGUgeWVhciB2YWx1ZXMgaGF2ZSBiZWVuIHJlcGVhdGVkIHNpeCB0aW1lcyBhcyB3ZSBhcmUgbWF0Y2hpbmcgdGhlIE1lZGlhbiBJbmNvbWUgZGF0YSBmb3IgZWFjaCB5ZWFyIHRvIGVhY2ggR2VuZGVyIGFuZCBlYWNoIERlZ3JlZSB0eXBlLlwNClwNCg0KYGBge3IgaW5jbHVkZT1GQUxTRX0NCiNTdW1tYXJ5IFN0YXRpc3RpY3MgVHdvIFdheQ0KDQpTdW1tYXJ5U3RhdHNUYWJsZSA8LSBkZXNjcmliZUJ5KEdlbmRlckluY29tZURlZ3JlZSRNZWRpYW4uSW5jb21lLCBncm91cCA9IEdlbmRlckluY29tZURlZ3JlZSRHZW5kZXIgOiBHZW5kZXJJbmNvbWVEZWdyZWUkRGVncmVlLCBtYXQgPSBUKQ0KDQpLYWJsZVN0YXRzVGFibGUgPC0gYXMuZGF0YS5mcmFtZShyYmluZCgoU3VtbWFyeVN0YXRzVGFibGUkZ3JvdXAxKSwoU3VtbWFyeVN0YXRzVGFibGUkbiksKFN1bW1hcnlTdGF0c1RhYmxlJG1lYW4pLChTdW1tYXJ5U3RhdHNUYWJsZSRzZCksKFN1bW1hcnlTdGF0c1RhYmxlJG1lZGlhbiksKFN1bW1hcnlTdGF0c1RhYmxlJG1pbiksKFN1bW1hcnlTdGF0c1RhYmxlJG1heCksKFN1bW1hcnlTdGF0c1RhYmxlJHJhbmdlKSwoU3VtbWFyeVN0YXRzVGFibGUkc2tldyksKFN1bW1hcnlTdGF0c1RhYmxlJGt1cnRvc2lzKSwoU3VtbWFyeVN0YXRzVGFibGUkc2UpKSkNCg0KbmFtZXMoS2FibGVTdGF0c1RhYmxlKSA8LSBjKCJGOkJhY2hlbG9ycyIsIkY6RG9jdG9yYXRlIiwiRjpNYXN0ZXJzIiwgIk06QmFjaGVsb3JzIiwiTTpEb2N0b3JhdGUiLCJNOk1hc3RlcnMiKQ0KDQpLYWJsZVN0YXRzVGFibGUgPC0gS2FibGVTdGF0c1RhYmxlWy0xLCBdDQoNCkthYmxlU3RhdHNUYWJsZTIgPC0gYXMuZGF0YS5mcmFtZSh0KEthYmxlU3RhdHNUYWJsZSkpDQoNCm5hbWVzKEthYmxlU3RhdHNUYWJsZTIpIDwtIGMoIm4iLCAibWVhbiIsICJzZCIsICJtZWRpYW4iLCAibWluIiwgIm1heCIsICJyYW5nZSIsICJza2V3IiwgImt1cnRvc2lzIiwgInNlIikNCg0KDQoNCiNjaGFuZ2luZyBzb21lIHR5cGVzDQoNCkthYmxlU3RhdHNUYWJsZTIkbiA8LSBhcy5pbnRlZ2VyKEthYmxlU3RhdHNUYWJsZTIkbikNCg0KS2FibGVTdGF0c1RhYmxlMiRtZWFuIDwtIGFzLm51bWVyaWMoS2FibGVTdGF0c1RhYmxlMiRtZWFuKQ0KDQpLYWJsZVN0YXRzVGFibGUyJHNkIDwtIGFzLm51bWVyaWMoS2FibGVTdGF0c1RhYmxlMiRzZCkNCg0KS2FibGVTdGF0c1RhYmxlMiRtZWRpYW4gPC0gYXMubnVtZXJpYyhLYWJsZVN0YXRzVGFibGUyJG1lZGlhbikNCg0KS2FibGVTdGF0c1RhYmxlMiRtaW4gPC0gYXMubnVtZXJpYyhLYWJsZVN0YXRzVGFibGUyJG1pbikNCg0KS2FibGVTdGF0c1RhYmxlMiRtYXggPC0gYXMubnVtZXJpYyhLYWJsZVN0YXRzVGFibGUyJG1heCkNCg0KS2FibGVTdGF0c1RhYmxlMiRyYW5nZSA8LSBhcy5udW1lcmljKEthYmxlU3RhdHNUYWJsZTIkcmFuZ2UpDQoNCkthYmxlU3RhdHNUYWJsZTIkc2tldyA8LSBhcy5udW1lcmljKEthYmxlU3RhdHNUYWJsZTIkc2tldykNCg0KS2FibGVTdGF0c1RhYmxlMiRrdXJ0b3NpcyA8LSBhcy5udW1lcmljKEthYmxlU3RhdHNUYWJsZTIka3VydG9zaXMpDQoNCkthYmxlU3RhdHNUYWJsZTIkc2UgPC0gYXMubnVtZXJpYyhLYWJsZVN0YXRzVGFibGUyJHNlKQ0KDQpgYGANCg0KYGBge3IgZWNobz1GQUxTRX0NCiNLYWJsZSBTdGF0aXN0aWNzIHRhYmxlDQoNCmthYmxlKEthYmxlU3RhdHNUYWJsZTIsIGNhcHRpb24gPSAiVGFibGUgMy4yOiBTdW1tYXJ5IFN0YXRpc3RpY3Mgb2YgdGhlIG1lZGlhbiBpbmNvbWUgZGF0YSBmb3IgYm90aCBHZW5kZXJzIGFuZCAzIGRlZ3JlZSB0eXBlcyBpbiB0aGUgVVMgZnJvbSAxOTkxLTIwMjEuIikgJT4lDQogIGthYmxlX3N0eWxpbmcoYm9vdHN0cmFwX29wdGlvbnMgPSAic3RyaXBlZCIsIGZ1bGxfd2lkdGggPSBGKSAlPiUNCiAgcm93X3NwZWMoMCwgYm9sZCA9IFQsIGZvbnRfc2l6ZSA9IDE1KQ0KYGBgDQoNClRoZSBuIHZhbHVlcyBvZiBlYWNoIGdyb3VwIHNob3cgdGhlIHRvdGFsIG51bWJlciBvZiBvYnNlcnZhdGlvbnMgZm9yIGVhY2gsIHdoaWNoIGlzIDMxIGFzIHRoaXMgaXMgdGhlIG51bWJlciBvZiB5ZWFycyBvZiBkYXRhIHdlIGhhdmUgZm9yIGVhY2ggcGFpcmluZyBvZiBncm91cCAxOTkxLTIwMjEuIFRoZSBtZWFuIHZhbHVlcyBmb3IgdGhlIERvY3RvcmF0ZSBEZWdyZWUgdHlwZSBoYXZlIHNob3duIHRvIGJlIHRoZSBoaWdoZXN0IGZyb20gb3VyIHN1bW1hcnkgc3RhdGlzdGljcyBmb3IgYm90aCBtYWxlcyBhbmQgZmVtYWxlcyB3aXRoIHZhbHVlcyBvZiAxMTQ2MjguNzEgYW5kIDgyNzA0Ljg0IHJlc3BlY3RpdmVseSBhbmQgbG93ZXN0IGZvciB0aGUgQmFjaGVsb3JzIERlZ3JlZSB0eXBlIGZvciBib3RoIG1hbGVzIGFuZCBmZW1hbGVzIHdpdGggdmFsdWVzIG9mIDc0ODcyLjI2IGFuZCA0NzQyMC40OCByZXNwZWN0aXZlbHkuDQoNCkJ5IGNvbXBhcmluZyB0aGUgbWVhbnMgb2YgZWFjaCBncm91cCBwYWlyaW5nLCB3ZSBub3Qgb25seSBzZWUgdGhhdCBCYWNoZWxvcnMgaXMgdGhlIGxvd2VzdCBhbmQgRG9jdG9yYXRlIGlzIHRoZSBoaWdoZXN0LiBXZSBhbHNvIGNhbiBzZWUgdGhhdCBNYWxlcyBoYXZlIGEgaGlnaGVyIG1lYW4gdGhhbiBGZW1hbGVzIGZvciBlYWNoIERlZ3JlZSBUeXBlLiBXaGV0aGVyIHRoaXMgZGlmZmVyZW5jZSBpcyBzaWduaWZpY2FudCBvciBub3QgaXMgd2hhdCB3ZSB3aWxsIGZ1cnRoZXIgYW5hbHlzZSBpbiB0aGlzIHN0dWR5Lg0KDQpUaGUgc3RhbmRhcmQgZGV2aWF0aW9uIChzZCksIGlzIGhpZ2hlc3QgaW4gTWFsZXMgbWVhbmluZyB0aGVyZSBpcyBtb3JlIHZhcmlhYmlsaXR5IGFyb3VuZCB0aGUgbWVhbiBvZiB0aGUgZGF0YS4gV2hlbiBjb21wYXJpbmcgdGhlIHNkIGFuZCByYW5nZSBvZiBib3RoIGdlbmRlcnMgd2hvIGhhdmUgYSBCYWNoZWxvcnMgZGVncmVlLCB5b3UgY2FuIHNlZSB0aGF0IE1hbGVzIGhhdmUgYW4gc2QgdmFsdWUgb2YgMzI4Ni4zODUgYW5kIEZlbWFsZXMgaGF2ZSBhIHNkIHZhbHVlIG9mIDI4NDkuMDc1IGJ1dCB0aGUgcmFuZ2VzIGFyZSAxMDU4MCBhbmQgMTEyODAgcmVzcGVjdGl2ZWx5LiBTaG93aW5nIHRoYXQgTWFsZXMgd2hvIGhhdmUgYSBCYWNoZWxvcnMgRGVncmVlIGhhdmUgYW4gaW5jb21lIGxlc3MgY29uY2VudHJhdGVkIGFyb3VuZCB0aGUgbWVhbiB0aGFuIEZlbWFsZXMgd2l0aCB0aGUgc2FtZSBkZWdyZWUsIGJ1dCBpcyBsZXNzIHNwcmVhZCBvdXQuDQoNClRoZSBoaWdoZXIgcmFuZ2UgZm9yIEZlbWFsZXMgd2l0aCBhIEJhY2hlbG9ycyBkZWdyZWUgc2hvd3MgdGhhdCB0aGVyZSBpcyBhIGxhcmdlciBnYXAgYmV0d2VlbiB0aGUgaGlnaGVzdCBhbmQgbG93ZXN0IHZhbHVlcy4gWWV0LCB0aGUgbG93ZXIgc2QgYWxzbyBpbmRpY2F0ZXMgdGhhdCBtb3N0IG9mIHRoZSB2YWx1ZXMgYXJlIGNsb3NlciB0byB0aGUgbWVhbiB0aGFuIHRoYXQgb2YgTWFsZXMuDQoNCldoZW4gY29tcGFyaW5nIHRoZSBzZCB2YWx1ZXMgYW5kIHJhbmdlIGZvciBib3RoIEdlbmRlcnMgYW5kIGZvciB0aGUgRG9jdG9yYXRlIGFuZCBNYXN0ZXJzIERlZ3JlZSwgd2UgY2FuIHNlZSB0aGF0IGJvdGggdGhlIHNkIGFuZCByYW5nZSBpcyBoaWdoZXIgZm9yIE1hbGVzIHdpdGggcmVnYXJkcyB0byB0aGVzZSBwYWlyaW5ncywgc2hvd2luZyB0aGF0IHRoZSBkYXRhIGlzIGNvbmNlbnRyYXRlZCBmb3IgRmVtYWxlcyB3aXRoIE1hc3RlcnMgYW5kIERvY3RvcmF0ZSBEZWdyZWVzIGFuZCBsZXNzIHNwcmVhZCBvdXQuDQoNCkZlbWFsZXMgaGF2ZSBhIHBvc2l0aXZlIHNrZXcgZm9yIGJvdGggRG9jdG9yYXRlIGFuZCBNYXN0ZXJzIERlZ3JlZXMsIHdoZXJlYXMgdGhlIHJlc3Qgb2YgdGhlIHBhaXJpbmdzIGluZGljYXRlIGEgbmVnYXRpdmUgc2tldy4gQSBza2V3IHZhbHVlIGZyb20gLTAuNSB0byAwLjUgaW5kaWNhdGVzIHN5bW1ldHJ5IChHYXdhbGksIDIwMjMpLiBNb3N0IG9mIHRoZSBwYXJpbmdzIGFyZSB0aGVyZWZvcmUgc3ltbWV0cmljYWwgZXhjZXB0IHRoZSBGZW1hbGVzIHdpdGggYSBEb2N0b3JhdGUgRGVncmVlIGdyb3VwLCB3aGljaCBoYXMgc2xpZ2h0bHkgYWJvdmUgMC41IHdpdGggYSBza2V3IHZhbHVlIG9mIDAuNTMxNSwgc2hvd2luZyB0aGF0IHRoZSBvdXRsaWVycyBhcmUgdG93YXJkcyB0aGUgdXBwZXIgcXVhcnRpbGUsIG1lYW5pbmcgdGhhdCB0aGVyZSBhcmUgYSBmZXcgaGlnaGVyIGluY29tZXMgZm9yIHRoaXMgcGFpcmluZyB3aGljaCBoYXMgc2tld2VkIHRoZSBkYXRhIHRvd2FyZHMgdGhlIHJpZ2h0Lg0KDQpUaGUga3VydG9zaXMgdmFsdWVzIFw8IDMgaW5kaWNhdGUgdGhhdCB0aGUgZGlzdHJpYnV0aW9uIGlzIHBsYXR5a3VydGljIHdoaWNoIGlzIGxlc3MgcGVha2VkIHdoZW4gY29tcGFyZWQgdG8gYSBub3JtYWwgZGlzdHJpYnV0aW9uLCB3aGljaCBpcyB3aGF0IHdlIHNlZSBmb3IgZWFjaCBwYWlyaW5nIGluIHRoaXMgZGF0YSBzZXQuDQoNCkxhc3RseSwgdGhlIHN0YW5kYXJkIGVycm9yIChzZSkgaXMgbGFyZ2VyIGluIGJvdGggZ3JvdXBpbmdzIG9mIHRoZSBEb2N0b3JhdGUgRGVncmVlIG1lYW5pbmcgdGhlIGRhdGEgaGVyZSBpcyBsZXNzIHByZWNpc2UgdGhhbiB0aGF0IG9mIHRoZSBvdGhlciBncm91cGluZ3Mgb2YgRGVncmVlIHR5cGVzLlwNClwNCg0KIyMjIyBbQXNzdW1wdGlvbnMgQ2hlY2s6XXsudW5kZXJsaW5lfQ0KDQpGaXJzdGx5IHRoZSBtb2RlbCBpcyBjcmVhdGVkIHVzaW5nIFIsIHdpdGggTWVkaWFuIEluY29tZSBhcyBvdXIgSW5kZXBlbmRlbnQgdmFyaWFibGUgYW5kIEdlbmRlciBhbmQgRGVncmVlIGFzIG91ciBEZXBlbmRlbnQgdmFyaWFibGVzLiBJbiBvcmRlciB0byBjb250aW51ZSB3aXRoIG91ciBUd28tV2F5IEFub3ZhIG1vZGVsLCB3ZSBtdXN0IGNoZWNrIGZpcnN0IHRoYXQgdGhlIHJlcXVpcmVkIGFzc3VtcHRpb25zIGFyZSBtZXQuDQoNCi0gICBJbmRlcGVuZGVudCBvYnNlcnZhdGlvbnMgKHdoaWNoIHdlIGhhdmUpDQoNCi0gICBIb21vc2NlZGFzdGljaXR5IC0gUmVzaWR1YWxzIGhhdmUgZXF1YWwgdmFyaWFuY2UNCg0KLSAgIE5vcm1hbGl0eSBvZiBSZXNpZHVhbHMgLSBSZXNpZHVhbHMgZm9sbG93IGEgbm9ybWFsIGRpc3RyaWJ1dGlvblwNCiAgICBcDQoNCmBgYHtyIGluY2x1ZGU9RkFMU0V9DQojQW5vdmEgTW9kZWwgLSBUd28gd2F5DQoNClR3b1dheU0xIDwtIGFvdihNZWRpYW4uSW5jb21lIH4gR2VuZGVyICogRGVncmVlLCBkYXRhID0gR2VuZGVySW5jb21lRGVncmVlKQ0KDQpUd29XYXlNMQ0KDQoNCmBgYA0KDQoqKipIb21vc2NlZGFzdGljaXR5OioqKg0KDQpgYGB7ciBlY2hvPUZBTFNFfQ0KI0RpYWdub3N0aWMgQ2hlY2tzDQoNCiNob21vc2NlZGFzdGljaXR5IA0KDQpwYXIobWZyb3cgPSBjKDIsMikpDQoNCnBsb3QoVHdvV2F5TTEpDQoNCnBhcihtZnJvdyA9IGMoMSwxKSkNCiNGaWd1cmUgMy4xOi4uLg0KDQoNCiNObyBtb3JlIHRoYW4gMyB0aW1lcyBzbWFsbGVzdCwgbG9va3MgZmluZSBoZXJlDQpgYGANCg0KRmlndXJlIDMuMTogRGlhZ25vc3RpYyBwbG90IG9mIG91ciBUd28tV2F5IEFOT1ZBIG1vZGVsLiBSZXNpZHVhbHMgdnMgRml0dGVkIHBsb3QgaXMgdXNlZCB0byBjaGVjayBmb3IgdGhlIGFzc3VtcHRpb24gb2YgaG9tb3NjZWRhc3RpY2l0eS4gVGhlIFJlc2lkdWFscyBzaG91bGQgaGF2ZSBhbiBlcXVhbCB2YXJpYW5jZSB3aGVuIHBsb3R0ZWQgYWdhaW5zdCB0aGUgZml0dGVkIHZhbHVlcy4gVGhlIFEtUSBSZXNpZHVhbHMgcGxvdCBpcyB1c2VkIHRvIGNoZWNrIGZvciB0aGUgbm9ybWFsaXR5IG9mIHJlc2lkdWFscywgd2hpY2ggaXMgaW5kaWNhdGVkIGJ5IGEgc3RyYWlnaHQgbGluZS5cDQpcDQoNClRoZSBSZXNpZHVhbHMgdnMgRml0dGVkIHBsb3QgaGVyZSBzaG93cyBob21vc2NlZGFzdGljaXR5IG9mIG91ciBUd28tV2F5IEFOT1ZBIG1vZGVsIGFzIHRoZSBsYXJnZXN0IHNwcmVhZCBpcyBub3QgdGhyZWUgdGltZXMgdGhlIHNpemUgb2YgdGhlIHNtYWxsZXN0LiBUaGUgUS1RIFJlc2lkdWFscyBwbG90IGFsc28gc2hvd3MgdGhhdCB0aGUgUmVzaWR1YWxzIGFyZSBub3JtYWxseSBkaXN0cmlidXRlZC5cDQpcDQoNCioqKk5vcm1hbGl0eSBvZiByZXNpZHVhbHM6KioqDQoNCldlIGNhbiBmdXJ0aGVyIGNoZWNrIHRoZSBub3JtYWxpdHkgb2YgcmVzaWR1YWxzIHdpdGggdGhlIFNoYXBpcm8gV2lsayB0ZXN0LCB3aXRoIHRoZSByZXNpZHVhbHMgdGFrZW4gZnJvbSBvdXIgVHdvLVdheSBBTk9WQSB0ZXN0LiBUaGUgTnVsbCBIeXBvdGhlc2lzIGhlcmUgaXMgdGhhdCB0aGUgZGF0YSBmb2xsb3dzIGEgbm9ybWFsIGRpc3RyaWJ1dGlvbi4gVGhlcmVmb3JlLCBhIFAtVmFsdWUgXDwgMC4wNSBtZWFucyB0aGF0IHdlIHJlamVjdCB0aGUgTnVsbCBIeXBvdGhlc2lzIGFuZCBkZXRlcm1pbmUgdGhhdCB0aGUgZGF0YSBpcyBub3Qgbm9ybWFsbHkgZGlzdHJpYnV0ZWQuXA0KXA0KDQoqKipTaGFwaXJvIFdpbGsgdGVzdCoqKg0KDQpgYGB7ciBlY2hvPUZBTFNFfQ0KUmVzX0Vwc2lsb24gPC0gVHdvV2F5TTEkcmVzaWR1YWxzDQoNCnNoYXBpcm8udGVzdChSZXNfRXBzaWxvbikNCmBgYA0KDQpUaGUgUC1WYWx1ZSBmcm9tIHRoZSBTaGFwaXJvLVdpbGsgdGVzdCBpcyAwLjE0ODgsIHdoaWNoIGlzIFw+IDAuMDUuIFRoZXJlZm9yZSB3ZSBkbyBub3QgcmVqZWN0IHRoZSBOdWxsIEh5cG90aGVzaXMgdGhhdCB0aGUgZGF0YSBpcyBub3JtYWxseSBkaXN0cmlidXRlZC5cDQpcDQoNCioqKkhpc3RvZ3JhbSoqKg0KDQpgYGB7ciBlY2hvPUZBTFNFfQ0KZ2dwbG90KEdlbmRlckluY29tZURlZ3JlZSwgYWVzKHggPSBSZXNfRXBzaWxvbikpICsNCiAgZ2VvbV9oaXN0b2dyYW0oYWVzKHk9Li5kZW5zaXR5Li4pLA0KICAgICAgICAgICAgICAgICBjb2xvdXIgPSAxLCBmaWxsID0gIndoaXRlIiwgYmlucyA9IDE0KSArDQogIGdlb21fZGVuc2l0eShsd2QgPSAxLCBjb2xvdXIgPSA0LCBmaWxsID0gNCwgYWxwaGEgPSAwLjI1KSArDQogIHRoZW1lX21pbmltYWwoYmFzZV9zaXplID0gMTIpICsNCiAgdGhlbWUoYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCwgIHZqdXN0ID0gLTUsIGhqdXN0ID0gMC40NyksDQogICAgICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQsIHZqdXN0ID0gNSksDQogICAgICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE2LCB2anVzdCA9IDUpLA0KICAgICAgICBwbG90Lm1hcmdpbiA9IHVuaXQoYygxLDEsMSwxKSwgImNtIikpICsNCiAgeGxhYigiUmVzaWR1YWxzIikgKw0KICB5bGFiKCJSZXNpZHVhbCBGcmVxdWVuY3kiKSArDQogIGxhYnModGl0bGUgPSBleHByZXNzaW9uKHVuZGVybGluZSgiSGlzdG9ncmFtIG9mIFJlc2lkdWFscyB8IFR3byBXYXkgQU5PVkEgTW9kZWwgMSIpKSkNCg0KI1Jlc2lkdWFscyBhcmUgbm9ybWFsbHkgZGlzdHJpYnV0ZWQNCg0KYGBgDQoNCkZpZ3VyZSAzLjI6IEhpc3RvZ3JhbSBwbG90IG9mIHRoZSBSZXNpZHVhbHMgZnJvbSBvdXIgVHdvLVdheSBBTk9WQSBNb2RlbCAxLiBBIG5vcm1hbCBkaXN0cmlidXRpb24gc2hvd3Mgc3ltbWV0cnkgYXJvdW5kIHRoZSBtZWFuLCB3aGljaCBpcyB3aGF0IHdlIGNhbiBzZWUgaGVyZS5cDQpcDQoNClNpbmNlIGNoZWNraW5nIHRoYXQgYWxsIGFzc3VtcHRpb25zIGhhdmUgYmVlbiBtZXQgd2UgZG8gbm90IG5lZWQgdG8gdHJhbnNmb3JtIG91ciBkYXRhIG9yIGNoYW5nZSBvdXIgbW9kZWwgYW5kIGNhbiB0aGVyZWZvcmUgY29udGludWUgd2l0aCBvdXIgYW5hbHlzaXMuXA0KXA0KDQojIyMgWyoqUmVzdWx0cyoqXXsudW5kZXJsaW5lfQ0KDQpgYGB7ciBlY2hvPUZBTFNFfQ0KYW5vdmEoVHdvV2F5TTEpDQpgYGANCg0KIyMjIyBbUmVwb3J0IDM6IEYoR2VuZGVyOkRlZ3JlZSwgMiwxODApID0gMy4yNTM0LCBQLVZhbHVlIFw8IDAuMDVdey51bmRlcmxpbmV9DQoNCkZpcnN0bHkgbG9va2luZyBhdCB0aGUgaW50ZXJhY3Rpb24sIHRoZSBzaWduaWZpY2FuY2UgbGV2ZWwgaXMgMC4wNC4gTWVhbmluZyB3ZSBjYW4gcmVqZWN0IHRoZSAzcmQgTnVsbCBIeXBvdGhlc2lzIHRoYXQgImFsbCBzaXggZ3JvdXBzIGNyZWF0ZWQgYnkgY3Jvc3MgdHJlYXRtZW50IGhhdmUgZXF1YWwgbWVhbnMiIGFuZCB0aGF0IHRoZXkgYXJlIGFsbCBzaWduaWZpY2FudGx5IGRpZmZlcmVudC4gVGhlIGludGVyYWN0aW9uIGJlaW5nIHNpZ25pZmljYW50IGRvZXMgbm90IHBhcnRpY3VsYXJseSBtZWFuIHRoYXQgdGhlIG1haW4gZWZmZWN0cyBHZW5kZXIgYW5kIERlZ3JlZSB3aWxsIGFsc28gYmUgc2lnbmlmaWNhbnQuXA0KXA0KDQojIyMjIFtSZXBvcnQgMTogRihHZW5kZXIsIDEsMTgwKSA9IDE3MjMuNDkxMCwgUC1WYWx1ZSBcPCAwLjA1XXsudW5kZXJsaW5lfQ0KDQojIyMjIFtSZXBvcnQgMjogRihEZWdyZWUsIDIsMTgwKSA9IDkxNS40NDQ0LCBQLVZhbHVlIFw8IDAuMDVdey51bmRlcmxpbmV9DQoNCkluIHRoaXMgY2FzZSB0aGUgUC1WYWx1ZSBcPCAwLjA1IGZvciBlYWNoIE1haW4gRWZmZWN0IEdlbmRlciBhbmQgRGVncmVlLiBNZWFuaW5nIHdlIGNhbiByZWplY3QgdGhlIDFzdCBhbmQgdGhlIDJuZCBOdWxsIEh5cG90aGVzaXMgdGhhdCAiTWVkaWFuIEluY29tZSBpcyBlcXVhbCBhY3Jvc3MgZ2VuZGVycyB3aXRoIGEgYmFjaGVsb3JzIG9yIG92ZXIiIGFuZCAiTWVkaWFuIEluY29tZSBpcyBlcXVhbCBhY3Jvc3MgdGhlIGRlZ3JlZSB0eXBlcyIsIGFuZCBkZXRlcm1pbmUgdGhhdCB0aGUgUmVzZWFyY2ggSHlwb3RoZXNpcyBpcyB0aGUgbW9zdCBhdHRyYWN0aXZlIGZvciBhbGwgdGhlIE1haW4gRWZmZWN0cyBhbmQgdGhlIEludGVyYWN0aW9uLg0KDQpBIFAtVmFsdWUgbG93ZXIgdGhhbiAwLjA1IGFsbG93cyB1cyB0byBkZXRlcm1pbmUgdGhhdCB0aGUgZGlmZmVyZW5jZXMgd2UgaGF2ZSBzZWVuIGluIHRoaXMgZGF0YSBhcmUgc3RhdGlzdGljYWxseSBzaWduaWZpY2FudCBhbmQgdGhhdCB0aGUgcHJvYmFiaWxpdHkgdGhhdCB0aGVzZSByZXN1bHRzIHdpbGwgb2NjdXIgZHVlIHRvIGNoYW5jZSBhbG9uZSBpcyBsZXNzIHRoYW4gNSUuXA0KXA0KDQojIyMgWyoqRGlzY3Vzc2lvbioqXXsudW5kZXJsaW5lfQ0KDQojIyMjIFtQb3N0LUhvYyBBbmFseXNpc117LnVuZGVybGluZX0NCg0KYGBge3IgZWNobz1GQUxTRX0NCiNUdWtleSBIU0QNCg0KI1Rlc3QgMSAtIFBvc3QgSG9jIHRlc3QgZm9yIGRpZmZlcmVuY2VzIGJldHdlZW4gR2VuZGVycyB3aXRoaW4gRGVncmVlcw0KDQp0MSA8LSB0ZXN0SW50ZXJhY3Rpb25zKFR3b1dheU0xLCBwYWlyd2lzZSA9ICJHZW5kZXIiLCBmaXhlZCA9ICJEZWdyZWUiLCBhZGp1c3RtZW50ID0gImhvbG0iKQ0KDQp0MSRgUHIoPkYpYCA8LSBhcy5udW1lcmljKHQxJGBQcig+RilgKQ0KDQp0MSRgUHIoPkYpYCA8LSBmb3JtYXRDKHQxJGBQcig+RilgLCBmb3JtYXQgPSAiZSIsIGRpZ2l0cyA9IDIpDQoNCmthYmxlKHQxLCBjYXB0aW9uID0gIlRhYmxlIDMuMzogUGFpcndpc2UgdGVzdHMgdG8gdGVzdCBmb3IgaW50ZXJhY3Rpb24gYmV0d2VlbiBHZW5kZXJzIHdpdGhpbiBEZWdyZWUgdHlwZSAoYWRqdXN0bWVudCA9IEhvbG1zIHRlc3QpLiIpICU+JQ0KICBrYWJsZV9zdHlsaW5nKGJvb3RzdHJhcF9vcHRpb25zID0gInN0cmlwZWQiLCBmdWxsX3dpZHRoID0gRikgJT4lDQogIHJvd19zcGVjKDAsIGJvbGQgPSBULCBmb250X3NpemUgPSAxNSkNCmBgYA0KDQpUaGlzIFBvc3QtSG9jIEFuYWx5c2lzIHNob3dzIHZhbHVlcyBmb3IgZGlmZmVyZW5jZXMgYmV0d2VlbiBHZW5kZXJzIHdpdGhpbiB0aGUgZGlmZmVyZW50IERlZ3JlZSBUeXBlcyB3ZSBoYXZlIHVzZWQgaW4gdGhpcyBzdHVkeS4gV2UgY2FuIHNheSB0aGF0IHRoZXJlIGlzIGEgc2lnbmlmaWNhbnQgZGlmZmVyZW5jZSAoUC1WYWx1ZSBcPCAwLjA1KSBpbiBNZWRpYW4gSW5jb21lIGluIHRoZSBVUyBmb3IgZWFjaCBJbnRlcmFjdGlvbi4NCg0KU2luY2UgdGhlIG9yZGVyIGdvZXMgRmVtYWxlIC0gTWFsZSwgdGhlIHZhbHVlcyBpbiB0aGUgIlZhbHVlIiBjb2x1bW4gYXJlIHJlbGV2YW50IHRvIEZlbWFsZSBhcyB0aGV5IGNvbWUgZmlyc3QuIE1lYW5pbmcgdGhlIG5lZ2F0aXZlIHZhbHVlIGZvciBlYWNoIGludGVyYWN0aW9uIHNob3dzIHRoYXQgdGhlIGRpZmZlcmVuY2UgbGllcyB3aXRoIE1lbiBoYXZpbmcgYSBoaWdoZXIgYXZlcmFnZSB3aXRoIHJlZ2FyZHMgdG8gTWVkaWFuIEluY29tZSBpbiB0aGUgVVMsIGZvciBvdXIgdGhyZWUgRGVncmVlIFR5cGVzLlwNClwNCg0KYGBge3IgZWNobz1GQUxTRX0NCiNUZXN0IDIgLSBQb3N0IEhvYyB0ZXN0IGZvciBkaWZmZXJlbmNlcyBiZXR3ZWVuIERlZ3JlZXMgd2l0aGluIEdlbmRlcnMNCg0KdDIgPC0gdGVzdEludGVyYWN0aW9ucyhUd29XYXlNMSwgcGFpcndpc2UgPSAiRGVncmVlIiwgZml4ZWQgPSAiR2VuZGVyIiwgYWRqdXN0bWVudCA9ICJob2xtIikNCg0KdDIkYFByKD5GKWAgPC0gYXMubnVtZXJpYyh0MiRgUHIoPkYpYCkNCg0KdDIkYFByKD5GKWAgPC0gZm9ybWF0Qyh0MiRgUHIoPkYpYCwgZm9ybWF0ID0gImUiLCBkaWdpdHMgPSAyKQ0KDQprYWJsZSh0MiwgY2FwdGlvbiA9ICJUYWJsZSAzLjQ6IFBhaXJ3aXNlIHRlc3RzIHRvIHRlc3QgZm9yIGludGVyYWN0aW9uIGJldHdlZW4gRGVncmVlIHR5cGUgd2l0aGluIEdlbmRlcnMgKGFkanVzdG1lbnQgPSBIb2xtcyB0ZXN0KS4iKSAlPiUNCiAga2FibGVfc3R5bGluZyhib290c3RyYXBfb3B0aW9ucyA9ICJzdHJpcGVkIiwgZnVsbF93aWR0aCA9IEYpICU+JQ0KICByb3dfc3BlYygwLCBib2xkID0gVCwgZm9udF9zaXplID0gMTUpDQpgYGANCg0KRnVydGhlcm1vcmUsIHRoaXMgUG9zdC1Ib2MgQW5hbHlzaXMgd2l0aCByZWdhcmRzIHRvIHRoZSBkaWZmZXJlbmNlcyBiZXR3ZWVuIERlZ3JlZXMgd2l0aGluIEdlbmRlcnMgc2hvd3MgbmVnYXRpdmUgdmFsdWVzIGZvciBCYWNoZWxvcnMtRG9jdG9yYXRlIGFuZCBCYWNoZWxvcnMtTWFzdGVycyB3aXRoaW4gZWFjaCBHZW5kZXIgdHlwZS4gU2luY2UgdGhlIHJ1bGVzIHJlZ2FyZGluZyB0aGUgb3JkZXIgYXJlIHRoZSBzYW1lIHRoaXMgc2hvd3MgdGhhdCBmb3IgYm90aCBHZW5kZXJzLCB0aGUgTWVkaWFuIEluY29tZSBmb3IgdGhvc2Ugd2l0aCBhIEJhY2hlbG9ycyBEZWdyZWUgaGFzIGEgbG93ZXIgbWVhbiB2YWx1ZSB0aGFuIHRoZSBtZWFuIHZhbHVlIG9mIE1lZGlhbiBJbmNvbWUgZm9yIHRob3NlIHdpdGggYSBNYXN0ZXJzIG9yIERvY3RvcmF0ZSBEZWdyZWUgKGZvciB0aGUgc2FtZSBHZW5kZXIpLg0KDQpEb2N0b3JhdGUtTWFzdGVycyBzaG93cyBhIHBvc2l0aXZlIHZhbHVlLCBtZWFuaW5nIHRoYXQgZm9yIGJvdGggR2VuZGVycywgdGhlIE1lZGlhbiBJbmNvbWUgZm9yIHRob3NlIHdpdGggYSBEb2N0b3JhdGUgRGVncmVlIGhhcyBhIGhpZ2hlciBtZWFuIHZhbHVlIHRoYW4gdGhlIG1lYW4gdmFsdWUgb2YgTWVkaWFuIEluY29tZSBmb3IgdGhvc2Ugd2l0aCBhIE1hc3RlcnMgRGVncmVlIChmb3IgdGhlIHNhbWUgR2VuZGVyKS4NCg0KQXMgYWxsIG9mIHRoZSBpbnRlcmFjdGlvbnMgc2hvdyBhIHNpZ25pZmljYW5jZSBsZXZlbCB3aGVyZSBQLVZhbHVlIFw8IDAuMDUsIHdlIGRldGVybWluZSB0aGVtIHRvIGFsbCBiZSBzdGF0aXN0aWNhbGx5IHNpZ25pZmljYW50IGRpZmZlcmVuY2VzIGFuZCB3aXRoIGxlc3MgdGhhbiBhIDUlIHByb2JhYmlsaXR5IHRvIG9jY3VyIGR1ZSB0byBjaGFuY2UgYWxvbmUuXA0KXA0KDQojIyMjIFtFZmZlY3QgUGxvdF17LnVuZGVybGluZX0NCg0KYGBge3IgZWNobz1GQUxTRX0NCiNJbnRlcmFjdGlvbiBiZXR3ZWVuIHZhcmlhYmxlcyAgDQojRWZmZWN0IFBsb3QgIA0KcGxvdChhbGxFZmZlY3RzKFR3b1dheU0xKSwgeWxhYj17Ik1lZGlhbiBJbmNvbWUgKCQpIn0sbWFpbj17IkVmZmVjdCBQbG90IG9mIE1lZGlhbiBJbmNvbWUgKCQpIHwgVVMgMTk5MS0yMDIxICJ9LCBsd2QgPSAyLCBsdHkgPSA1LCBtdWx0aWxpbmUgPSBULCBydWcgPSBULCBjb2xvcnMgPSBjKCJSZWQiLCAiRGVlcFNreUJsdWUiKSkNCmBgYA0KDQpGaWd1cmUgMy4zOiBBbiBFZmZlY3QgcGxvdCBzaG93aW5nIHRoZSBtZWFuIHZhbHVlcyBmb3IgZWFjaCBncm91cGluZyBvZiBNZWRpYW4gSW5jb21lIGJ5IHR3byBjYXRlZ29yaWNhbCB2YXJpYWJsZXMsIEdlbmRlciBhbmQgRGVncmVlLiBXaXRoIHRoZSBtZWFuIHZhbHVlcyBmb3IgRmVtYWxlcyBieSBEZWdyZWUgdHlwZSBhcyBhIHJlZCBsaW5lIGFuZCBibHVlIGZvciBNYWxlcy4gV2l0aCBwb2ludHMgcGxvdHRlZCBmb3IgZWFjaCB2YWx1ZS5cDQpcDQoNCkFzIHN0YXRlZCBieSAoSmF3YWlkLCBUaGFyaXEgYW5kIFNhYmEsIDIwMTkpIGFuIEVmZmVjdCBQbG90IHNob3dzIHRoZSBtZWFuIHJlc3BvbnNlIHZhbHVlcyBhdCBlYWNoIGxldmVsIG9mIGEgZGVzaWduIHBhcmFtZXRlciBvciBwcm9jZXNzIHZhcmlhYmxlLiBXZSBjYW4gc2VlIGZyb20gb3VyIEVmZmVjdCBQbG90IHRoYXQgdGhlIG1lYW4gdmFsdWVzIGFyZSBoaWdoZXIgZm9yIGVhY2ggaW5kaXZpZHVhbCBEZWdyZWUgVHlwZSBpZiB0aGUgR2VuZGVyIGlzIG1hbGUuIFRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIG1lZGlhbiBpbmNvbWUgb2YgZ2VuZGVycyAod2l0aCBiYWNoZWxvcnMgb3Igb3ZlcikgaXMgb25lIG9mIG91ciBtYWluIGVmZmVjdHMsIHdoaWNoIHdlIGhhdmUgZGV0ZXJtaW5lZCB0byBiZSBzdGF0aXN0aWNhbGx5IHNpZ25pZmljYW50IGFuZCBub3QgZHVlIHRvIGNoYW5jZSBhbG9uZS4NCg0KRm9yIGVhY2ggR2VuZGVyIHdlIGNhbiBzZWUgdGhhdCBCYWNoZWxvcnMgRGVncmVlIGhhdmUgdGhlIGxvd2VzdCB2YWx1ZXMgYW5kIERvY3RvcmF0ZSBoYXMgdGhlIGhpZ2hlc3QuIFdoaWNoIHdvdWxkIG1ha2Ugc2Vuc2UgYXMgdGhlIGxldmVsIG9mIGRpZmZpY3VsdHkgYW5kIHRpbWUgcmVxdWlyZWQgdG8gZ2V0IG9uZSBvZiB0aGVzZSBEZWdyZWVzIGdvZXMgaW4gb3JkZXIgZnJvbSBCYWNoZWxvcnMsIE1hc3RlcnMgYW5kIHRoZW4gRG9jdG9yYXRlLiBUaGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBkaWZmZXJlbnQgbGV2ZWxzIG9mIERlZ3JlZSBpcyBvdXIgc2Vjb25kIG1haW4gZWZmZWN0IHdoaWNoIHdlIGFnYWluIGRldGVybWluZWQgdG8gYmUgc3RhdGlzdGljYWxseSBzaWduaWZpY2FudCBhbmQgbm90IGR1ZSB0byBjaGFuY2UgYWxvbmUuDQoNCldlIGNhbiBhbHNvIHNlZSBmcm9tIG91ciBFZmZlY3QgUGxvdCB0aGF0IHRoZXJlIGlzIGEgY3Jvc3Mgb3ZlciB3aGVyZSBGZW1hbGVzIHdobyBhY2hpZXZlIGEgRG9jdG9yYXRlIERlZ3JlZSBoYXZlIGEgaGlnaGVyIG1lYW4gdmFsdWUgdGhhbiB0aGF0IG9mIE1hbGVzIHdobyBoYXZlIGEgQmFjaGVsb3JzLlwNClwNCg0KIyMjIyBbUHJlZGljdGVkIFZhbHVlc117LnVuZGVybGluZX0NCg0KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCg0KVHdvV2F5UGxvdCA8LSBnZ2VmZmVjdChUd29XYXlNMSwgdGVybXMgPSBjKCJHZW5kZXIiLCAiRGVncmVlIikpDQoNCnBsb3QoVHdvV2F5UGxvdCkgKw0KICBzY2FsZV94X2NvbnRpbnVvdXMobGFiZWxzID0gYygiRmVtYWxlIiwgIk1hbGUiKSwgYnJlYWtzID0gYygxLDIpKSArDQogIHRoZW1lX21pbmltYWwoYmFzZV9zaXplID0gMTIpICsNCiAgdGhlbWUoYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCwgIHZqdXN0ID0gLTQpLA0KICAgICAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0LCB2anVzdCA9IDYpLA0KICAgICAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNiwgdmp1c3QgPSA2KSwNCiAgICAgICAgcGxvdC5tYXJnaW4gPSB1bml0KGMoMSwxLDEsMSksICJjbSIpKSArDQogIGxhYnModGl0bGUgPSBleHByZXNzaW9uKHVuZGVybGluZSgiUHJlZGljdGVkIFZhbHVlcyBvZiBNZWRpYW4gSW5jb21lICgkKSIpKSkgKw0KICB5bGFiKCJNZWRpYW4gSW5jb21lICgkKSIpICsNCiAgeGxhYigiR2VuZGVyIikNCmBgYA0KDQpGaWd1cmUgMy40OiBQcmVkaWN0ZWQgdmFsdWVzIHBsb3QsIHNob3dpbmcgdGhlIG1lYW4gdmFsdWVzIGZvciBNZWRpYW4gSW5jb21lIChcJCkgZm9yIGVhY2ggR2VuZGVyIGFuZCBEZWdyZWUgdHlwZS4gV2l0aCBCYWNoZWxvcnMgYXMgcmVkLCBEb2N0b3JhdGUgYXMgYmx1ZSBhbmQgTWFzdGVycyBhcyBncmVlbi5cDQpcDQoNCklmIHRoZXJlIGlzIGEgc2lnbmlmaWNhbnQgaW50ZXJhY3Rpb24gdGhlIHByZWRpY3RlZCB2YWx1ZSBpcyB0aGUgdmFsdWUgb2YgdGhlIHJlc3BvbnNlIHZhcmlhYmxlIChNZWRpYW4gSW5jb21lKSB3aGljaCBpcyBlcXVhbCB0byB0aGUgbWVhbiBvZiBhbGwgb2JzZXJ2YXRpb25zIGhhdmluZyB0aGF0IGNvbWJpbmF0aW9uIG9mIGZhY3RvciBsZXZlbHMgKE93ZW5zLCAyMDIyKS4gV2hpY2ggbWVhbnMgdGhhdCBzaW5jZSB3ZSBoYXZlIGEgc2lnbmlmaWNhbnQgaW50ZXJhY3Rpb24gKFAtVmFsdWUgXDwgMC4wNSkgdGhlIHByZWRpY3RlZCB2YWx1ZSBmb3IgZWFjaCBwYWlyaW5nIGlzIGVxdWFsIHRvIHRoZSBtZWFuIG9mIGVhY2ggcGFpcmluZyBvZiBpbmRlcGVuZGVudCB2YXJpYWJsZXMgKEdlbmRlciBhbmQgRGVncmVlKS4NCg0KVGhpcyBwbG90IGFsbG93cyB1cyB0byBzZWUgbW9yZSBvZiBhIGNsZWFyZXIgcGljdHVyZSBhcyB0byBob3cgdGhlIHZhbHVlcyBvbmx5IGNyb3NzIG92ZXIgYXQgdGhlIGxvd2VzdCBtZWFuIHZhbHVlIGZvciBNYWxlcyBhbmQgdGhlIGhpZ2hlc3QgbWVhbiB2YWx1ZSBmb3IgRmVtYWxlcy4gQXMgd2UgY2FuIHNlZSB3aGVyZSB0aGUgcG9pbnQgZm9yIHRoZSBGZW1hbGUgc2lkZSBvdmVydGFrZXMgdGhlIGxvd2VzdCBvbiB0aGUgTWFsZSBzaWRlLg0KDQpXZSBjYW4gZGV0ZXJtaW5lIHRoYXQgdGhlcmUgaXMgYSBzaWduaWZpY2FudCBpbnRlcmFjdGlvbiBiZXR3ZWVuIEdlbmRlciBhbmQgRGVncmVlIFR5cGUgb24gTWVkaWFuIGluY29tZSBpbiB0aGUgVVMgZnJvbSAxOTkxLTIwMjEsIHlldCB0aGUgcmVzdWx0cyB3ZXJlIG5vdCBxdWl0ZSBhcyBleHBlY3RlZCBhcyBpdCBoYXMgb25seSB1bmNvdmVyZWQgbW9yZSB0aGF0IG5lZWRzIHRvIGJlIGFuc3dlcmVkIHdpdGggcmVnYXJkcyB0byB0aGUgIndoeT8iLiBUaGUgc2lnbmlmaWNhbmNlIG9mIHRoZSBpbnRlcmFjdGlvbiBtYWlubHkgc2hvd3MgdGhhdCBtZW4gYXJlIGVhcm5pbmcgbW9yZSB3aGVuIGNvbXBhcmluZyB0aGUgY2VudHJhbCB0ZW5kZW5jaWVzIG9mIG91ciBwYWlyaW5ncyBvZiBncm91cHMsIHdpdGggb25seSBvbmUgY3Jvc3Mgb3ZlciAoYmVpbmcgdGhhdCBvZiBGZW1hbGU6RG9jdG9yYXRlIC0gTWFsZTpCYWNoZWxvcnMpLg0KDQpPbmUgd291bGQgZXhwZWN0IGZyb20gdGhhdCBvbiBhdmVyYWdlIGEgRG9jdG9yYXRlIERlZ3JlZSBtZWFudCB0aGF0IHlvdSB3b3VsZCBlYXJuIG1vcmUgdGhhbiBzb21lb25lIHdpdGggYSBCYWNoZWxvcnMsIGJ1dCB0aGUgZGF0YSBpcyBpbnRlcmVzdGluZyBpbiB0aGF0IHRoaXMgaXMgdGhlIG9ubHkgdGltZSB0aGUgbWVhbiBvZiBNZWRpYW4gRmVtYWxlIEluY29tZSBzdXJwYXNzZXMgdGhhdCBvZiB0aGUgbWVhbiBvZiBNZWRpYW4gTWFsZSBJbmNvbWUuDQoNCklmIHRoaXMgaXMgdGhlIGNhc2UgZm9yIG1lYW4gdmFsdWVzIGZvciBGZW1hbGVzIHdpdGggRG9jdG9yYXRlIGRlZ3JlZXMgY29tcGFyZWQgdG8gTWFsZXMgd2l0aCBCYWNoZWxvcnMgdGhlbiB3aHkgaXMgbWVhbiBvZiBNZWRpYW4gSW5jb21lIGZvciBGZW1hbGVzIHdpdGggYSBNYXN0ZXJzIERlZ3JlZSBub3QgaGlnaGVyIHRoYW4gdGhhdCBvZiB0aGUgbWVhbiB2YWx1ZSBvZiBNYWxlcyB3aXRoIGEgQmFjaGVsb3JzIGRlZ3JlZT8gQSBzaWduaWZpY2FudCBkaWZmZXJlbmNlIGJldHdlZW4gRGVncmVlIHR5cGUgaXRzZWxmIGlzIG9uZSBtYWluIGVmZmVjdCwgYnV0IHNpbmNlIHRoZXJlIGlzIGFsc28gYSBzaWduaWZpY2FudCBkaWZmZXJlbmNlIGJldHdlZW4gZ2VuZGVyIGFuZCB0aGUgaW50ZXJhY3Rpb24gYmV0d2VlbiBib3RoLg0KDQpPbiBvbmUgaGFuZCwgb25lIG1heSBjb25jbHVkZSB0aGF0IHdoZW4gbG9va2luZyBhdCB0aGUgaW50ZXJhY3Rpb24gb2Ygb3VyIHR3byBpbmRlcGVuZGVudCB2YXJpYWJsZXMsIHRoZXJlIG11c3QgYmUgbW9yZSBmYWN0b3JzIGF0IHBsYXkgd2hpY2ggaGF2ZSBhbiBlZmZlY3Qgb2YgTWVkaWFuIEluY29tZSBpbiB0aGUgVVMgd2hpY2ggY2F1c2Ugd29tZW4gdG8gZWFybiBsZXNzIGRlc3BpdGUgdGhlaXIgZGVncmVlIGxldmVsLg0KDQpPbiB0aGUgb3RoZXIgaGFuZCwgaXQgbWF5IG5vdCBiZSB0aGUgZGVncmVlIGxldmVsIGl0c2VsZiB0aGF0IGFmZmVjdHMgdGhlIE1lZGlhbiBJbmNvbWUgTGV2ZWwgaW4gdGhlIFVTLCBidXQgcmF0aGVyIHRoZSBudW1iZXIgb2YgeWVhcnMgaW4gZWR1Y2F0aW9uIGFzIGEgRG9jdG9yYXRlIERlZ3JlZSBjYW4gdGFrZSBhIGZ1cnRoZXIgNS04IHllYXJzIHRvIGFjaGlldmUgYWZ0ZXIgY29tcGxldGluZyBhIE1hc3RlcnMgRGVncmVlLiBZZXQsIHRoaXMgd291bGQgbm90IGV4cGxhaW4gd2h5IEZlbWFsZXMgd2l0aCBhIERvY3RvcmF0ZSBEZWdyZWUgaGF2ZSBvbmx5IHNsaWdodGx5IGhpZ2hlciBtZWFuIHZhbHVlcyB0aGFuIHRoZSBtZWFuIHZhbHVlcyBvZiBNYWxlcyB3aXRoIGEgQmFjaGVsb3JzLg0KDQpGdXJ0aGVyIHJlc2VhcmNoIGFuZCBhbmFseXNpcyBvZiBvdGhlciBmYWN0b3JzIHdoaWNoIGhhdmUgYW4gZWZmZWN0IG9uIE1lZGlhbiBJbmNvbWUgbGV2ZWxzIGluIHRoZSBVUyB3aWxsIGhlbHAgdXMgdW5jb3ZlciBvdXIgcXVlc3Rpb24gZm9yIHRoZSAid2h5PyIuIFNpbmNlIHdlIGhhdmUgZGV0ZXJtaW5lZCB0aGF0IGVkdWNhdGlvbiBhdHRhaW5tZW50IGRvZXMgbm90IGd1YXJhbnRlZSBlcXVhbCBwYXkgZm9yIGJvdGggR2VuZGVycywgYXMgdGhlcmUgaXMgYSBzaWduaWZpY2FudCBkaWZmZXJlbmNlIGJldHdlZW4gYW5kIHdpdGhpbiBib3RoIGNvbWJpbmF0aW9ucyBvZiBvdXIgaW50ZXJhY3Rpb25zIChiZXR3ZWVuIEdlbmRlcnMgd2l0aGluIERlZ3JlZSwgYmV0d2VlbiBEZWdyZWUgVHlwZSB3aXRoaW4gR2VuZGVycykuDQoNCk90aGVyIGZhY3RvcnMgd2hpY2ggbWF5IGFmZmVjdCBNZWRpYW4gSW5jb21lIGluIHRoZSBVUyBhcmUgZm9yIGUuZy4gc29jaWFsIHByZXNzdXJlcyBpbiBhbmQgb3V0c2lkZSBvZiB0aGUgd29ya3BsYWNlIGFuZCB3b3VsZCBiZSBhbiBpbnRlcmVzdGluZyB0b3BpYyB0byB1bmNvdmVyLiBVbmVtcGxveW1lbnQgcmF0ZSBmb3IgdGhvc2UgcGVvcGxlIHdpdGggYSBiYWNoZWxvcnMgZGVncmVlIG9yIGhpZ2hlciBjb3VsZCBhcyBsZWFkIHVzIGludG8gdGhlIHJpZ2h0IGRpcmVjdGlvbiBhcyB0byBhbnN3ZXJpbmcgd2h5IHRoZSBzaWduaWZpY2FudCBkaWZmZXJlbmNlIGluIE1lZGlhbiBJbmNvbWUgb2NjdXJzIGJldHdlZW4gR2VuZGVycyBpbiB0aGUgVVMuXA0KXA0KXA0KXA0KXA0KXA0KXA0KXA0KDQojIyMgWyoqUGFydCA0IC0gRW1wbG95bWVudCBTdGF0dXMgYW5kIEdlbmRlciBmb3IgdGhvc2Ugd2l0aCBhIERlZ3JlZSBpbiB0aGUgVVMgZnJvbSAxOTkxIC0gMjAyMS4qKl17LnVuZGVybGluZX0NCg0KIyMjIFsqKkludHJvZHVjdGlvbioqXXsudW5kZXJsaW5lfQ0KDQpUaGUgZmluYWwgcGFydCBvZiB0aGlzIHByb2plY3Qgd2lsbCBiZSBhIGNvbnRpbnVhdGlvbiBvZiB3aGF0IHdlIGhhdmUgbG9va2VkIGF0IHNvIGZhci4gQXMgd2UgaGF2ZSBkaXNjb3ZlcmVkIHRoYXQgdGhlcmUgaGFzIGJlZW4gYSBzaWduaWZpY2FudCByaXNlIGluIE1lZGlhbiBGZW1hbGUgSW5jb21lIGluIHRoZSBVUywgd2hpY2ggaGFzIHNlZW4gdG8gYmUgc2lnbmlmaWNhbnRseSBkaWZmZXJlbnQgZnJvbSB0aGF0IG9mIE1hbGVzLg0KDQpEdXJpbmcgdGhlIHByZXZpb3VzIHBhcnQgb2YgdGhpcyBwcm9qZWN0IHdlIGZvdW5kIGEgc2lnbmlmaWNhbnQgaW50ZXJhY3Rpb24gYmV0d2VlbiB0aGUgRGVncmVlIGFuZCBHZW5kZXJzIHdoaWNoIGhhcyBzaG93biB0aGF0IEZlbWFsZXMgZWFybiBsZXNzIHRoYW4gTWFsZXMgZm9yIGV2ZXJ5IERlZ3JlZSBUeXBlIG91dCBvZiBCYWNoZWxvcnMsIE1hc3RlcnMgYW5kIERvY3RvcmF0ZSwgZXhjZXB0IGZvciB0aGUgb25lIG1lYW4gdmFsdWUgZm9yIEZlbWFsZXMgTWVkaWFuIEluY29tZSB3aXRoIGEgRG9jdG9yYXRlIHdoaWNoIHdhcyBhIGhpZ2hlciBtZWFuIG9mIE1lZGlhbiBJbmNvbWUgdGhhdCBvZiBhIE1hbGUgd2l0aCBCYWNoZWxvcnMNCg0KV2Ugd2lsbCBsb29rIGRlZXBlciBpbnRvIHRoZSBudW1iZXJzIHJlZ2FyZGluZyBNYWxlcyBhbmQgRmVtYWxlcyBvdmVyIHRoZSBhZ2Ugb2YgMjUgaW4gdGhlIFVTIHdpdGggYSBCYWNoZWxvcnMgRGVncmVlIG9yIGhpZ2hlciAoSW5jbHVkaW5nIHByb2Zlc3Npb25hbCBkZWdyZWUgaW4gdGhpcyBwYXJ0IG9mIHRoZSBzdHVkeSksIGFuZCB0aGUgY291bnRzIG9mIHRoZSBwb3B1bGF0aW9uIHJlZ2FyZGluZyB0aGVpciBlbXBsb3ltZW50IHN0YXR1cyBmb3IgZWFjaCBvZiB0aGUgeWVhcnMuDQoNCkFzIHN0YXRlZCBieSBDYXJleSBhbmQgSGFja2V0ICgyMDIyKS4gSW4gMjAyMSBpbiB0aGUgVVMsIHRoZSByYXRpbyBieSBHZW5kZXIgd2FzIDk4IG1hbGVzIHBlciAxMDAgZmVtYWxlcy4gRnJvbSB0aGlzIHJhdGlvLCB3ZSB3b3VsZCBleHBlY3QgbW9yZSBGZW1hbGVzIDI1IGFuZCBvdmVyLCB3aG8gaGF2ZSBhIEJhY2hlbG9ycyBvciBoaWdoZXIgdG8gYmUgaW4gZW1wbG95bWVudCBpbiBjb21wYXJpc29uIHRvIG1hbGVzLlwNClwNCg0KVGhlIFJlc2VhcmNoIFF1ZXN0aW9uIGZvciB0aGlzIHN0dWR5IGlzIGFzIGZvbGxvd3M6DQoNCipJcyB0aGVyZSBhbiBhc3NvY2lhdGlvbiBiZXR3ZWVuIEdlbmRlciBhbmQgRW1wbG95bWVudCBTdGF0dXMgZm9yIHRob3NlIHdobyBhcmUgMjUgYW5kIG92ZXIsIHdpdGggYSBCYWNoZWxvcidzIERlZ3JlZSBvciBoaWdoZXIgaW4gdGhlIFVTIGZyb20gMTk5MS0yMDIxPypcDQpcDQoNClRvIGFuc3dlciB0aGUgcXVlc3Rpb24gd2hldGhlciB0aGVyZSBpcyBhbnkgc2lnbmlmaWNhbnQgYXNzb2NpYXRpb24gYmV0d2VlbiB0aGUgR2VuZGVyIG9mIHRob3NlIHdobyBoYXZlIGEgQmFjaGVsb3JzIERlZ3JlZSBvciBoaWdoZXIgYW5kIHRoZWlyIEVtcGxveW1lbnQgU3RhdHVzLiBBIGh5cG90aGVzaXMgd2lsbCBiZSBtYWRlIGFuZCBhbmFseXNlZCB1c2luZyB0aGUgcmVsZXZhbnQgdGVzdCBzdGF0aXN0aWNcDQpcDQoNCiMjIyMgW0NoaS1TcXVhcmUgVGVzdDpdey51bmRlcmxpbmV9DQoNCkFzIHdlIGFyZSB3b3JraW5nIHdpdGggcG9wdWxhdGlvbiBkYXRhLCB3ZSB3aWxsIHVzZSB0aGUgcG9wdWxhdGlvbiBhcyBjb3VudHMgZm9yIGVhY2ggcGFpcmluZ3Mgb2YgY2F0ZWdvcnkuIE91ciBkYXRhIGNvbnNpc3RzIG9mIHR3byBjYXRlZ29yaWNhbCB2YXJpYWJsZXMuIEdlbmRlcjogTWFsZSwgRmVtYWxlLiBFbXBsb3ltZW50IFN0YXR1czogRW1wbG95ZWQsIFVuZW1wbG95ZWQuDQoNClRoZSBDaGkgU3F1YXJlIFRlc3Qgb2YgSW5kZXBlbmRlbmNlIGlzIGEgbm9ucGFyYW1ldHJpYyB0ZXN0IHdoaWNoIGRldGVybWluZXMgd2hldGhlciB0aGVyZSBhcmUgYXNzb2NpYXRpb25zIG9yIGRpZmZlcmVuY2VzIGJldHdlZW4gdHdvIGNhdGVnb3JpY2FsIG9yIG5vbWluYWwgdmFyaWFibGVzLiBJbiB0aGlzIGNhc2Ugb2Ygb3VyIGRhdGEgc2V0LCB0aGUgZXhwZWN0ZWQgY291bnRzIGFyZSB1bmtub3duIGFuZCB0aGVyZWZvcmUgYSB0ZXN0IG9mIGFzc29jaWF0aW9uIHdpbGwgYmUgZG9uZSB0byBkZXRlcm1pbmUgd2hldGhlciB0aGUgY2hhcmFjdGVyIGZyZXF1ZW5jaWVzIG9mIG91ciB0d28gZ3JvdXBzIEdlbmRlciBhbmQgRW1wbG95bWVudCBTdGF0dXMsIGhhdmUgYSBzaWduaWZpY2FudCBhc3NvY2lhdGlvbiB3aXRoIG9uZSBhbm90aGVyLlwNClwNCg0KIyMjIyBbSHlwb3RoZXNpczpdey51bmRlcmxpbmV9DQoNCi0gICBIMDogVGhlcmUgaXMgbm8gYXNzb2NpYXRpb24gYmV0d2VlbiBHZW5kZXIgYW5kIEVtcGxveW1lbnQgU3RhdHVzIGZvciB0aG9zZSAyNSBhbmQgb3Zlciwgd2l0aCBhIEJhY2hlbG9yJ3MgRGVncmVlIG9yIGhpZ2hlciBpbiB0aGUgVVMuDQoNCi0gICBIMTogVGhlcmUgaXMgYW4gYXNzb2NpYXRpb24gYmV0d2VlbiBHZW5kZXIgYW5kIEVtcGxveW1lbnQgU3RhdHVzIGZvciB0aG9zZSAyNSBhbmQgb3Zlciwgd2l0aCBhIEJhY2hlbG9yJ3MgRGVncmVlIG9yIGhpZ2hlciBpbiB0aGUgVVMuDQoNCkZvciB0aGlzIHN0dWR5IHdlIHNldCBhIHNpZ25pZmljYW5jZSBsZXZlbCBvZiAwLjA1LCB3aGljaCBtZWFucyB3ZSBhcmUgd2lsbGluZyB0byBzYXkgdGhhdCB0aGUgdGhlcmUgaXMgYSA1JSBjaGFuY2UgdGhhdCB0aGUgcmVzdWx0cyB3aWxsIG9jY3VyIGR1ZSB0byBjaGFuY2UgYWxvbmUuIE9ubHkgd2hlbiBvdXIgcC12YWx1ZSBpcyBsb3dlciB0aGFuIG91ciBzaWduaWZpY2FuY2UgbGV2ZWwgb2YgMC4wNSBjYW4gd2UgcmVqZWN0IHRoZSBOdWxsIEh5cG90aGVzaXMgYW5kIGRldGVybWluZSB0aGF0IHRoZSBSZXNlYXJjaCBIeXBvdGhlc2lzIGlzIG1vcmUgYXR0cmFjdGl2ZS5cDQpcDQoNCiMjIyBbKipNZXRob2QqKl17LnVuZGVybGluZX0NCg0KVG8gc3RhcnQgb3VyIGFuYWx5c2lzIHRoZSByZWxldmFudCBwYWNrYWdlcyBhcmUgbG9hZGVkIGludG8gUiBTdHVkaW8uDQoNCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQojTG9hZGluZyBQYWNrYWdlcw0KbGlicmFyeShrYWJsZUV4dHJhKQ0KbGlicmFyeShkcGx5cikNCmxpYnJhcnkoa25pdHIpDQpsaWJyYXJ5KGdncGxvdDIpDQpsaWJyYXJ5KGNvcnJwbG90KQ0KbGlicmFyeSh2Y2QpDQpgYGANCg0KVGhlbiB0aGUgZGF0YSBoYXMgYmVlbiBzb3VyY2VkIGZyb20gd3d3LmJldGEuYmxzLmdvdi4gTXVsdGlwbGUgdGFibGVzIGhhdmUgYmVlbiBkb3dubG9hZGVkIGZvciBib3RoIEdlbmRlcnMgd2l0aCB0aGUga2V5IHdvcmRzIG9mICIyNSBZZWFycyBhbmQgT3ZlciIsICJCYWNoZWxvcnMgRGVncmVlIiwgIkVtcGxveWVkIiwgIlVuZW1wbG95ZWQiLiBTaW5jZSB0aGUgdGFibGVzIHdlcmUgc2VwYXJhdGVkIGJ5IEdlbmRlciwgRW1wbG95bWVudCBTdGF0dXMgYW5kIGZvciB0aGUgRmVtYWxlIERhdGEgYnkgcmFjZS4gT25jZSBkb3dubG9hZGVkIHRoZSBkYXRhIHdhcyB0cmFuc2Zvcm1lZCBpbiBFeGNlbCBhbmQgbG9hZGVkIGludG8gUiBzdHVkaW8gZm9yIGFuYWx5c2lzLlwNClwNCg0KIyMjIyBbRGF0YSBTZXRdey51bmRlcmxpbmV9DQoNCioqKlBvcHVsYXRpb24gRGF0YSoqKg0KDQpgYGB7ciBpbmNsdWRlPUZBTFNFfQ0KI0RhdGENCkVtcFN0YXR1c0dlbmRlciA8LSByZWFkLmNzdigiQzovVXNlcnMvZWRyZW4vT25lRHJpdmUvRGVza3RvcC9EYXRhIEFuYWx5c2lzL1IgV29ya2luZyBEaXJlY3RvcnkvRmluYWwgUHJvamVjdCBBc3NpZ25tZW50L0RhdGFzZXRzL0RhdGFTZXRzL0VtcFN0YXR1c0dlbmRlcl8yNWFuZE92ZXJCYWNoZWxvcnNPckhpZ2hlci5jc3YiLCBzdHJpbmdzQXNGYWN0b3JzPVRSVUUpDQoNCg0KI0NsZWFuDQoNCm5hbWVzKEVtcFN0YXR1c0dlbmRlcikgPC0gYygiWWVhciIsICJRIiwgIkVtcC5TdGF0dXMiLCAiR2VuZGVyIiwgIlRvdGFsLkNvdW50IikNCg0KI0luaXRpYWwgTG9vayBhdCBvdXIgRGF0YQ0KDQpoZWFkKEVtcFN0YXR1c0dlbmRlcikNCg0KdGFpbChFbXBTdGF0dXNHZW5kZXIpDQoNClRhYmxlRW1wR2VuZGVyMSA8LSByYmluZChoZWFkKEVtcFN0YXR1c0dlbmRlciksICIuLi4iLCB0YWlsKEVtcFN0YXR1c0dlbmRlcikpDQoNClRhYmxlRW1wR2VuZGVyMQ0KYGBgDQoNCmBgYHtyIGVjaG89RkFMU0V9DQoNCmthYmxlKFRhYmxlRW1wR2VuZGVyMSwgcm93Lm5hbWVzID0gRiwgY2FwdGlvbiA9ICJUYWJsZSA0LjE6IEJMUyBCZXRhIExhYnMgZGF0YSByZWdhcmRpbmcgVG90YWwgRW1wbG95ZWQvVW5lbXBsb3llZCBmcm9tIDIwMTUtMjAyMSAoUTEtUTQpIGJ5IEdlbmRlci4gVGhlIGNvdW50IG9mIHRoaXMgZGF0YSBpcyBpbiB0aG91c2FuZHMiKSAlPiUNCiAga2FibGVfc3R5bGluZyhib290c3RyYXBfb3B0aW9ucyA9ICJzdHJpcGVkIikgJT4lDQogIHJvd19zcGVjKDAsIGJvbGQgPSBULCBmb250X3NpemUgPSAxNSkNCmBgYA0KDQpUaGlzIGlzIGhvdyB0aGUgZGF0YSBsb29rZWQgb25jZSBpdCB3YXMgdHJhbnNmb3JtZWQgYW5kIGxvYWRlZCBpbnRvIFIgU3R1ZGlvLiBJdCBwcm92aWRlcyBjb3VudCBkYXRhIG9mIHRoZSB0b3RhbCBwb3B1bGF0aW9uIGluIHRoZSBVUyAoaW4gdGhvdXNhbmRzKSwgZm9yIHRob3NlIDI1IFllYXJzIGFuZCBPdmVyIHdpdGggYSBCYWNoZWxvcnMgRGVncmVlIG9yIGhpZ2hlci4gU2VwYXJhdGVkIGludG8gUTEtNCAocXVhcnRlcikgZm9yIGVhY2ggeWVhciwgYW5kIGJ5IEdlbmRlciBhbmQgRW1wbG95bWVudCBTdGF0dXMuDQoNCkluIG9yZGVyIGZvciBrZWVwIG91ciBDaGktU3F1YXJlIFRlc3Qgb2YgSW5kZXBlbmRlbmNlIGZhaXIgYW5kIHNpbmNlIHdlIGFyZSBsb29raW5nIGF0IHBvcHVsYXRpb24gZGF0YSB0aHJvdWdob3V0IHRoZSBkaWZmZXJlbnQgeWVhcnMsIHdlIHdpbGwgdGFrZSBhIHNhbXBsZSBvZiB0aGlzIGRhdGEgc2V0IGJ5IGxvb2tpbmcgc3BlY2lmaWNhbGx5IGF0IG9uZSB5ZWFyIGFuZCBvbmUgcXVhcnRlci4gVGhpcyB3aWxsIGJlIGRvbmUgYnkgdXNpbmcgUiB0byBmaWx0ZXIgdGhlIGRhdGEgYnkgYSByYW5kb20geWVhciBhbmQgcXVhcnRlclwNClwNCg0KYGBge3IgaW5jbHVkZT1GQUxTRX0NCiNTZWxlY3QgUmFuZG9tIFllYXIgYW5kIFENCg0Kc2VsZWN0ZWRfeWVhciA8LSBzYW1wbGUodW5pcXVlKEVtcFN0YXR1c0dlbmRlciRZZWFyKSwgMSkNCg0Kc2VsZWN0ZWRfcXVhcnRlciA8LSBzYW1wbGUodW5pcXVlKEVtcFN0YXR1c0dlbmRlciRRKSwgMSkNCg0KUmFuZG9tU2FtcGxlIDwtIEVtcFN0YXR1c0dlbmRlciAlPiUNCiAgZmlsdGVyKFllYXIgPT0gIjIwMTYiLCBRID09ICJRMiIpDQpgYGANCg0KKioqU2FtcGxlIERhdGEqKioNCg0KYGBge3IgZWNobz1GQUxTRX0NCiNTYW1wbGUNCg0KI0xvb2tpbmcgYXQgb3VyIFNhbXBsZQ0KDQprYWJsZShSYW5kb21TYW1wbGUsIHJvdy5uYW1lcyA9IEYsIGNhcHRpb24gPSAiVGFibGUgNC4yOiBSYW5kb20gWWVhciBhbmQgUSBzZWxlY3RlZCB0byBnZW5lcmF0ZSBhIFNhbXBsZSBmcm9tIG91ciBvcmlnaW5hbCBkYXRhIGZyb20gQkxTIEJldGEgTGFicyBkYXRhLiBTaG93aW5nIFRvdGFsIEVtcGxveWVkL1VuZW1wbG95ZWQgYnkgR2VuZGVyLiBUaGUgY291bnQgb2YgdGhpcyBkYXRhIGlzIGluIHRob3VzYW5kcyAoSykiKSAlPiUNCiAga2FibGVfc3R5bGluZyhib290c3RyYXBfb3B0aW9ucyA9ICJzdHJpcGVkIiwgZnVsbF93aWR0aCA9IEYpICU+JQ0KICByb3dfc3BlYygwLCBib2xkID0gVCwgZm9udF9zaXplID0gMTUpDQpgYGANCg0KT3VyIHNhbXBsZSBkYXRhIGlzIGZvciAyMDE2IGluIFEyLlwNClwNCg0KIyMjIyBbQ29udGluZ2VuY3kgVGFibGVdey51bmRlcmxpbmV9DQoNCmBgYHtyIGVjaG89RkFMU0V9DQojQ29udGluZ2VuY3kgVGFibGUNCg0KR3JvdXBlZERhdGEgPC0geHRhYnMoVG90YWwuQ291bnQgfiBFbXAuU3RhdHVzICsgR2VuZGVyLCBkYXRhID0gUmFuZG9tU2FtcGxlKQ0KDQpDb250aW5nZW5jeVRhYmxlIDwtIGFzLmRhdGEuZnJhbWUubWF0cml4KEdyb3VwZWREYXRhKQ0KDQprYWJsZShDb250aW5nZW5jeVRhYmxlLCBjYXB0aW9uID0gIlRhYmxlIDQuMzogQ29udGluZ2VuY3kgVGFibGUgdGFrZW4gZnJvbSBvdXIgUmFuZG9tIFNhbXBsZSwgZm9yIHRoZSB5ZWFyIDIwMTYgYW5kIFEyLCBzaG93aW5nIGNvdW50cyAoaW4gdGhvdXNhbmRzKSBmb3IgdGhlIHBhaXIgb2Ygb3VyIGNhdGVnb3JpY2FsIHZhaXJhYmxlcy4iKSAlPiUNCiAgICAgICAga2FibGVfc3R5bGluZyhib290c3RyYXBfb3B0aW9ucyA9ICJzdHJpcGVkIiwgZnVsbF93aWR0aCA9IEYpICU+JQ0KICByb3dfc3BlYygwLCBib2xkID0gVCwgZm9udF9zaXplID0gMTUpDQoNCmBgYA0KDQpGcm9tIHRoZSBpbml0aWFsIGxvb2sgYXQgb3VyIHRhYmxlIHdlIGNhbiB0aGF0IGZvciB0aGUgeWVhciAyMDE2IFEyLCB0aGVyZSBhcmUgbW9yZSBNYWxlcyB3aG8gYXJlIGVtcGxveWVkIHRoYW4gRmVtYWxlcywgMjEsMzg2IGZvciBFbXBsb3llZCBtYWxlcyBhbmQgMTk4NjcgZm9yIEVtcGxveWVkIEZlbWFsZXMgKGluIHRob3VzYW5kcykuIE1vcmUgRmVtYWxlcyBhcmUgc2VlbiB0byBiZSBVbmVtcGxveWVkIHRoYW4gTWFsZXMgZm9yIHRob3NlIDI1IHllYXJzIGFuZCBPdmVyIHdpdGggYSBCYWNoZWxvcnMgRGVncmVlIG9yIGhpZ2hlciwgd2l0aCB2YWx1ZXMgb2YgMTA2IGZvciBGZW1hbGVzIGFuZCA3MCBmb3IgTWFsZXMgKGluIHRob3VzYW5kcykuDQoNClNpbmNlIHRoaXMgZGF0YSBpcyBpbiB0aG91c2FuZHMsIHdoZW4gY29udmVydGluZyBpdCBiYWNrIHRvIHJlYWwgbnVtYmVycyB0aGUgZGlmZmVyZW5jZSBpbiBFbXBsb3ltZW50IHN0YXR1cyBjYW4gc2VlbSBhIGxvdCBtb3JlIHN1YnN0YW50aWFsLiBXaXRoIHRoZSBudW1iZXJzIG9mIEVtcGxveWVkIDIxLDM4NiwwMDAgYW5kIDE5LDg2NywwMDAgZm9yIE1hbGVzIGFuZCBGZW1hbGVzIFJlc3BlY3RpdmVseS4gV2hldGhlciB0aGlzIGRpZmZlcmVuY2Ugb2Ygb3ZlciAxLDAwMCwwMDAgaXMgYSBzaWduIG9mIGEgc2lnbmlmaWNhbnQgYXNzb2NpYXRpb24gb3Igbm90IGlzIHdoYXQgd2Ugd2lsbCBkZXRlcm1pbmUgaW4gdGhpcyBzdHVkeS5cDQpcDQoNCiMjIyMgW09ic2VydmVkIFZhbHVlc117LnVuZGVybGluZX0NCg0KKioqWWF0ZXMgQ29ycmVjdGlvbioqKg0KDQpPYnNlcnZlZCB2YWx1ZXMgYXJlIHRoZSB2YWx1ZXMgd2hpY2ggYXJlIHNlZW4gaW4gb3VyIGRhdGEgd2l0aGluIGVhY2ggY2F0ZWdvcnkgcGFpci4NCg0KVG8gZGV0ZXJtaW5lIHdoZXRoZXIgd2Ugc2hvdWxkIHVzZSBZYXRlcyBDb3JyZWN0aW9uIG9yIG5vdCB3ZSBuZWVkIHRvIGRldGVybWluZSBpZiB0aGUgdG90YWwgTiBvZiBvdXIgcG9wdWxhdGlvbiBpcyBsb3dlciB0aGFuIDQwLiBBcyBzdGF0ZWQgYnkgKEdpYW5uaW5pLCAyMDA1KSBZYXRlcyBjb3JyZWN0aW9uIGlzIHVzZWQgdG8gY29tcGVuc2F0ZWQgZm9yIGRldmlhdGlvbiBmcm9tIHRoZSB0aGVvcmV0aWNhbCBwcm9iYWJpbGl0eSBkaXN0cmlidXRpb24gd2hlbiB0aGUgdG90YWwgTiBmb3IgYSAyeDIgQ2hpLVNxdWFyZSB0YWJsZSBpcyBsZXNzIHRoYW4gNDAuIFdoZW4gdGhlIHN1bSBvZiBhbGwgb3VyIG9ic2VydmVkIHZhbHVlcyBpcyBsZXNzIHRoYW4gNDAgWWF0ZXMgY29ycmVjdGlvbiBpcyB1c2VkIHRvIG1ha2UgYSBtb3JlIGFjY3VyYXRlIGFuYWx5c2lzLg0KDQpUaGVyZSBpcyBubyBuZWVkIHRvIGNhbGN1bGF0ZSB0aGlzIG51bWJlciwgYXMgd2UgY2FuIGNsZWFybHkgc2VlIHRoZSBOIGlzIGxhcmdlciB0aGFuIDQwLiBTaW5jZSBlYWNoIGdyb3VwIGlzIGxhcmdlciB0aGFuIDQwLiBUaGVyZWZvcmUgd2UgY2FuIGNvbnRpbnVlIHdpdGggdGhlIG5leHQgc3RhZ2Ugb2Ygb3VyIGFuYWx5c2lzLlwNClwNCg0KIyMjIyBbRXhwZWN0ZWQgVmFsdWVzXXsudW5kZXJsaW5lfQ0KDQoqKipGaXNoZXJzIEV4YWN0IFRlc3QqKioNCg0KVG8gZGV0ZXJtaW5lIHdoZXRoZXIgd2Ugc2hvdWxkIHVzZSBGaXNoZXJzIGV4YWN0IHRlc3Qgb3Igbm90IHdlIHdpbGwgY2hlY2sgdGhlIEV4cGVjdGVkIFZhbHVlcy4gRXhwZWN0ZWQgVmFsdWVzIGFyZSB0aGUgZnJlcXVlbmN5IHRoYXQgd2Ugd291bGQgZXhwZWN0IGluIGEgY2VsbCBvbiBhdmVyYWdlIGlmIHRoZSB2YXJpYWJsZXMgYXJlIGluZGVwZW5kZW50IChNaW5pdGFiLCAyMDIzKS4NCg0KRmlzaGVycyBleGFjdCB0ZXN0IGlzIHVzZWQgd2hlbiAyMCUgb3IgbW9yZSBvZiB0aGUgRXhwZWN0ZWQgVmFsdWVzIGhhdmUgYSBjb3VudCBvZiA1IG9yIGxvd2VyIChOb3dhY2tpLCAyMDE3KS4gQWdhaW4sIGl0IGlzIHVzZWQgdG8gbWFrZSBhIG1vcmUgc3RhdGlzdGljYWxseSBhY2N1cmF0ZSBhbmFseXNpcyB3aGVuIGNvbXBhcmluZyB0aGUgT2JzZXJ2ZWQgYW5kIEV4cGVjdGVkIHZhbHVlcy4NCg0KVGhlcmVmb3JlLCB3ZSBydW4gYSBDaGktU3F1YXJlIFRlc3Qgd2l0aCBvdXIgY29udGluZ2VuY3kgdGFibGUgYW5kIHBsb3QgdGhlIGV4cGVjdGVkIHZhbHVlcyB0byBkZXRlcm1pbmUgd2hldGhlciB3ZSBzaG91bGQgdXNlIEZpc2hlcnMgRXhhY3QgVGVzdCBvciBub3QuXA0KXA0KDQpgYGB7ciBpbmNsdWRlPUZBTFNFfQ0KI0Rvbid0IFNIb3cgb3V0cHV0IGZvciB0aGlzLg0KDQpUZXN0MSA8LSBjaGlzcS50ZXN0KENvbnRpbmdlbmN5VGFibGUsIGNvcnJlY3QgPSBGQUxTRSkNCg0KVGVzdDENCg0KI04gPiA0MCwgbm90IHVzaW5nIFlhdGVzIENvcnJlY3Rpb24NCmBgYA0KDQpgYGB7ciBlY2hvPUZBTFNFfQ0KIyNFeHBlY3RlZCBWYWx1ZXMNCg0Ka2FibGUocm91bmQoVGVzdDEkZXhwZWN0ZWQsMyksIGNhcHRpb24gPSAiVGFibGUgNC40OiBFeHBlY3RlZCBWYWx1ZXMgb2Ygb3VyIHJhbmRvbSBzYW1wbGUgb2YgdGhlIHBvcHVsYXRpb24gZGF0YS4gVGhlIGNvdW50IG9mIHRoaXMgZGF0YSBpcyBpbiB0aG91c2FuZHMgKEspIikgJT4lDQogIGthYmxlX3N0eWxpbmcoYm9vdHN0cmFwX29wdGlvbnMgPSAic3RyaXBlZCIsIGZ1bGxfd2lkdGggPSBGKSAlPiUNCiAgcm93X3NwZWMoMCwgYm9sZCA9IFQsIGZvbnRfc2l6ZSA9IDE1KSAlPiUNCiAgYWRkX2hlYWRlcl9hYm92ZShjKCJFbXBsb3ltZW50IiA9IDEsICJFeHBlY3RlZCBWYWx1ZXMiID0gMikpDQoNCiNNb3JlIHRoYW4gMjAlIG9mIGV4cGVjdGVkIHZhbHVlcyBhcmUgbm90IGxlc3MgdGhhbiA1LiB3b24ndCB1c2UgZmlzaGVyDQpgYGANCg0KTm9uZSBvZiB0aGUgRXhwZWN0ZWQgdmFsdWVzIGFyZSBsb3dlciB0aGFuIDUgYW5kIGFsbCB0aGUgYXNzdW1wdGlvbnMgb2YgdGhlIENoaS1TcXVhcmUgVGVzdCBvZiBJbmRlcGVuZGVuY2UgYXJlIG1ldCwgc28gd2UgY29udGludWUgd2Ugd2lsbCBjb250aW51ZSBvdXIgYW5hbHlzaXMgd2l0aCB0aGUgcmVndWxhciBDaGktU3F1YXJlIFRlc3Qgb2YgSW5kZXBlbmRlbmNlIHRvIGFuYWx5c2Ugd2hldGhlciB0aGVyZSBpcyBhbiBhc3NvY2lhdGlvbiBvciBub3QgYmV0d2VlbiBvdXIgdHdvIGNhdGVnb3JpY2FsIHZhcmlhYmxlcy5cDQpcDQoNCiMjIyBbUmVzdWx0c117LnVuZGVybGluZX0NCg0KIyMjIyBbUmVwb3J0OiBYLXNxdWFyZWQoMSkgPSAxMC4yMjMsIFAgVmFsdWUgXDwgMC4wNV17LnVuZGVybGluZX0NCg0KYGBge3IgZWNobz1GQUxTRX0NCiNUZXN0IG91dHB1dA0KDQpUZXN0MQ0KYGBgDQoNCkZyb20gb3VyIHJlc3VsdHMgb2YgUGVhcnNvbidzIENoaS1TcWF1cmVkIFRlc3Qgb2YgSW5kZXBlbmRlbmNlIHdlIGdldCB0aGUgcmVzdWx0IG9mIGEgUC1WYWx1ZSBcPCAwLjA1LiBUaGVyZWZvcmUgd2UgYXJlIGFibGUgdG8gcmVqZWN0IHRoZSBOdWxsIEh5cG90aGVzaXMgdGhhdCB0aGVyZSBpcyBhIHNpZ25pZmljYW50IGFzc29jaWF0aW9uIGJldHdlZW4gR2VuZGVyIGFuZCBFbXBsb3ltZW50IFN0YXR1cyBmb3IgdGhvc2UgMjUgYW5kIG92ZXIsIHdpdGggYSBCYWNoZWxvcnMgRGVncmVlIG9yIGhpZ2hlciBpbiB0aGUgVVMgZnJvbSAxOTkxLTIwMjEuXA0KXA0KDQojIyMgWyoqRGlzY3Vzc2lvbioqXXsudW5kZXJsaW5lfQ0KDQojIyMjIFtPYnNlcnZlZCBWYWx1ZXMsIEV4cGVjdGVkIFZhbHVlcyBhbmQgQ2hpLVNxdWFyZSBDb21wb25lbnRzXXsudW5kZXJsaW5lfQ0KDQpgYGB7ciBlY2hvPUZBTFNFfQ0KI1RhYmxlIGZvciBEaXNjdXNzaW9uDQoNCiNPYnNlcnZlZCBWYWx1ZXMsIEV4cGVjdGVkLCBDaGkgU3F1YXJlZCBDb21wb25lbnRzIGluIDEgdGFibGUNCg0KbWVyZ2VkX3RhYmxlcyA8LSBjYmluZChUZXN0MSRvYnNlcnZlZCwgcm91bmQoVGVzdDEkZXhwZWN0ZWQsMyksIHJvdW5kKFRlc3QxJHJlc2lkdWFsc14yLDQpKQ0KDQprYWJsZShtZXJnZWRfdGFibGVzLCBjYXB0aW9uID0gIlRhYmxlIDQuNTogT2JzZXJ2ZWQgVmFsdWVzLCBFeHBlY3RlZCBWYWx1ZXMgYW5kIHRoZSBDaGktU3F1YXJlIENvbXBvbmVudHMgb2Ygb3VyIHJhbmRvbSBzYW1wbGUgb2YgdGhlIHBvcHVsYXRpb24gZGF0YS4gVGhlIGNvdW50IG9mIHRoaXMgZGF0YSBpcyBpbiB0aG91c2FuZHMgKEspIikgJT4lDQogIGthYmxlX3N0eWxpbmcoYm9vdHN0cmFwX29wdGlvbnMgPSAic3RyaXBlZCIsIGZ1bGxfd2lkdGggPSBGKSAlPiUNCiAgcm93X3NwZWMoMCwgYm9sZCA9IFQsIGZvbnRfc2l6ZSA9IDE1KSAlPiUNCiAgYWRkX2hlYWRlcl9hYm92ZShjKCIgIiA9IDEsICJPYnNlcnZlZCBWYWx1ZXMiID0gMiwgIkV4cGVjdGVkIFZhbHVlcyIgPSAyLCAiQ2hpLVNxdWFyZWQgQ29tcG9uZW50cyIgPSAyKSkNCg0KDQpgYGANCg0KV2hlbiBjb21wYXJpbmcgdGhlIFZhbHVlcyBvZiBvdXIgQ2hpLVNxdWFyZSBUZXN0IGl0IGlzIGdvb2QgdG8gbG9vayBmaXJzdCBhdCB0aGUgQ2hpLVNxdWFyZWQgQ29tcG9uZW50cy4gQ2hpIFNxdWFyZSBDb21wb25lbnRzIGFyZSB0aGUgcmVzaWR1YWxzIG9mIG91ciB0ZXN0IHNxdWFyZWQuIFRoZSByZXNpZHVhbHMgYXJlIGhvdyBtdWNoIHRoZSBPYnNlcnZlZCBWYWx1ZXMgZGlmZmVyIGZyb20gdGhlIEV4cGVjdGVkIFZhbHVlcy4NCg0KRm9yIEZlbWFsZXMgYSBDaGktU3F1YXJlZCBDb21wb25lbnQgdmFsdWUgb2YgNS4yNzIwIGluIHRoZSBVbmVtcGxveWVkIFJvdywgc2hvd3MgdGhhdCB0aGUgT2JzZXJ2ZWQgVmFsdWVzIGZvciBVbmVtcGxveWVkIEZlbWFsZXMgYXJlIHZlcnkgZGlmZmVyZW50IGZyb20gd2hhdCBpcyBFeHBlY3RlZCBWYWx1ZXMuIFdoZW4gbG9va2luZyBhdCB0aGUgc2FtZSByb3cgYnV0IGZvciBNYWxlcywgd2Ugc2VlIGEgQ2hpLVNxdWFyZWQgQ29tcG9uZW50IG9mIDQuOSwgd2hpY2ggcHJvdmlkZXMgdGhlIHNhbWUgZXhwbGFuYXRpb24gb2YgYSBsYXJnZSBkaWZmZXJlbmNlIGJldHdlZW4gT2JzZXJ2ZWQgYW5kIEV4cGVjdGVkIFZhbHVlcyBmb3IgTWFsZXMuDQoNClNpbmNlIHRoZSBFbXBsb3llZCBjb2x1bW4gc2hvd3MgQ2hpLVNxdWFyZWQgVmFsdWVzIG9mIDAuMDIyNSBhbmQgMC4wMjA5IGZvciBNZW4gYW5kIFdvbWVuIHJlc3BlY3RpdmVseSwgd2Ugd2lsbCBub3Qgd29ycnkgYWJvdXQgdGhpcyBjb2x1bW4gYXMgdGhpcyB3aWxsIG5vdCBiZSB3aGVyZSB0aGUgc2lnbmlmaWNhbnQgYXNzb2NpYXRpb24gbGllcy4NCg0KQWx0aG91Z2gsIENoaS1TcXVhcmVkIENvbXBvbmVudHMgZG8gbm90IHNob3cgdGhlIGRpcmVjdGlvbiBieSB3aGljaCB0aGUgZGlmZmVyZW5jZSBvY2N1cnMuIFRoaXMgY2FuIHNpbXBseSBiZSBkb25lIGJ5IGNvbXBhcmluZyB0aGUgT2JzZXJ2ZWQgYW5kIEV4cGVjdGVkIHZhbHVlcyBvZiBlYWNoIGNhdGVnb3JpY2FsIHZhcmlhYmxlLg0KDQpBZ2FpbiBqdXN0IGxvb2tpbmcgYXQgVW5lbXBsb3llZCBmb3IgYm90aCBHZW5kZXIsIHdlIGNhbiBzZWUgdGhhdCBmb3IgRmVtYWxlcyB0aGUgT2JzZXJ2ZWQgVmFsdWUgaXMgMTA2LDAwMCAoMTA2LCBUcmFuc2xhdGVkIHRvIHJlYWwgd29ybGQgbnVtYmVycykgYXMgY29tcGFyZWQgdG8gdGhlIEV4cGVjdGVkIFZhbHVlIG9mIDg0LDk1MCAob3IgODQuODUpLiBTaG93aW5nIGEgUG9zaXRpdmUgQ29ycmVsYXRpb24gYmV0d2VlbiBGZW1hbGVzIGFuZCBVbmVtcGxveW1lbnQuU2luY2Ugb3VyIFAtVmFsdWUgXDwgMC4wNSB0aGlzIG1lYW5zIHRoYXQgdGhlcmUgYXJlIHNpZ25pZmljYW50bHkgbW9yZSBVbmVtcGxveWVkIEZlbWFsZXMgdGhhbiB3ZSB3b3VsZCBFeHBlY3QgYW5kIGFyZSBkdWUgdG8gZmFjdG9ycyBvdGhlciB0aGFuIGNoYW5jZSBhbG9uZS4NCg0KVGhlIHJldmVyc2UgaXMgc2hvd24gdG8gYmUgdHJ1ZSBmb3IgTWFsZXMsIHdpdGggYW4gT2JzZXJ2ZWQgVmFsdWUgb2YgNzAsMDAwICg3MCkgYW5kIGFuIEV4cGVjdGVkIFZhbHVlIG9mIDkxLDE1MCAoOTEuMTUpLCB0aGlzIHNob3dzIHRoYXQgdGhlcmUgYXJlIHNpZ25pZmljYW50bHkgbGVzcyBVbmVtcGxveWVkIE1hbGVzIHRoYW4gd2Ugd291bGQgRXhwZWN0LiBBIG5lZ2F0aXZlIGNvcnJlbGF0aW9uLiBXaGljaCBhZ2FpbiB3ZSBjYW4gY29uY2x1ZGUgdGhhdCB0aGVzZSByZXN1bHRzIGFyZSBkdWUgdG8gZmFjdG9ycyBvdGhlciB0aGFuIGNoYW5jZSBhbG9uZSAoUC1WYWx1ZSBcPCAwLjA1KS5cDQpcDQoNCiMjIyMgW1Zpc3VhbGl6YXRpb25dey51bmRlcmxpbmV9DQoNCmBgYHtyIGVjaG89RkFMU0V9DQphc3NvY2lhdGlvbl9wbG90IDwtIGFzc29jKEdyb3VwZWREYXRhLCBzaGFkZSA9IFQsIGxhcyA9IDMsIG1haW4gPSAiQXNzb2NpYXRpb24gUGxvdCBvZiBHZW5kZXIgYW5kIEVtcGxveW1lbnQgU3RhdHVzIikNCg0KDQojRmlndXJlOiA0LjE6IEFzc29jaWF0aW9uIFBsb3Qgc2hvd2luZyBQZWFyc29uIHJlc2lkdWFscyBmb3Igb3VyIENoaSBTcXVhcmVkIHRlc3Qgb2YgdGhlIGFzc29jaWF0aW9uIGJldHdlZW4gR2VuZGVyIGFuZCBFbXBsb3ltZW50IFN0YXR1cy4gDQojIEEgcG9zaXRpdmUgYXNzb2NpYXRpb24gYmV0d2VlbiBHZW5kZXIgYW5kIEVtcGxveW1lbnQgc3RhdHVzIGlzIGluZGljYXRlZCB3aXRoIGEgYmFyIGFib3ZlIHRoZSBkb3R0ZWQgbGluZSwgDQojIEEgbmVnYXRpdmUgYXNzb2NpYXRpb24gYmV0d2VlbiBHZW5kZXIgYW5kIEVtcGxveW1lbnQgc3RhdHVzIGlzIGluZGljYXRlZCB3aXRoIGEgYmFyIGJlbG93IHRoZSBkb3R0ZWQgbGluZS4NCiMgVGhlIHN0cmVuZ3RoIG9mIHRoZSBhc3NvY2lhdGlvbiBpcyBpbmRpY2F0ZWQgYnkgdGhlIHNpemUgb2YgdGhlIGJhci4NCmBgYA0KDQpGaWd1cmUgNC4xOiBBc3NvY2lhdGlvbiBQbG90IHNob3dpbmcgUGVhcnNvbiByZXNpZHVhbHMgZm9yIG91ciBDaGkgU3F1YXJlZCB0ZXN0IG9mIHRoZSBhc3NvY2lhdGlvbiBiZXR3ZWVuIEdlbmRlciBhbmQgRW1wbG95bWVudCBTdGF0dXMuIEEgcG9zaXRpdmUgYXNzb2NpYXRpb24gYmV0d2VlbiBHZW5kZXIgYW5kIEVtcGxveW1lbnQgc3RhdHVzIGlzIGluZGljYXRlZCB3aXRoIGEgYmFyIGFib3ZlIHRoZSBkb3R0ZWQgbGluZSwgQSBuZWdhdGl2ZSBhc3NvY2lhdGlvbiBiZXR3ZWVuIEdlbmRlciBhbmQgRW1wbG95bWVudCBzdGF0dXMgaXMgaW5kaWNhdGVkIHdpdGggYSBiYXIgYmVsb3cgdGhlIGRvdHRlZCBsaW5lLiBUaGUgc3RyZW5ndGggb2YgdGhlIGFzc29jaWF0aW9uIGlzIGluZGljYXRlZCBieSB0aGUgc2l6ZSBvZiB0aGUgYmFyLlwNClwNCg0KVGhpcyBwbG90IHNob3dzIHRoZSBQZWFyc29uIFJlc2lkdWFscyBmb3Igb3VyIENoaS1TcXVhcmUgVGVzdCBmb3IgZWFjaCBwYWlyIG9mIG91ciB0d28gY2F0ZWdvcmljYWwgdmFyaWFibGVzIEdlbmRlciBhbmQgRW1wbG95bWVudCBTdGF0dXMuIEl0IGFsbG93cyB1cyB0byBnZXQgbW9yZSBvZiBhIHZpc3VhbCB1bmRlcnN0YW5kaW5nIGFzIHRvIHdoZXJlIHRoZSBhc3NvY2lhdGlvbiBsaWVzIGJldHdlZW4gR2VuZGVyIGFuZCBFbXBsb3ltZW50IFN0YXR1cyBmb3Igb3VyIHNhbXBsZSBkYXRhIHNldC4NCg0KVGhlIGxpbmUgYWJvdmUgdGhlIGJhciBzaG93cyB0aGF0IG1vcmUgRmVtYWxlcyBhcmUgT2JzZXJ2ZWQgdG8gYmUgVW5lbXBsb3llZCB0aGFuIEV4cGVjdGVkLCBhbmQgdGhlIGxpbmUgYmVsb3cgdGhlIGJhciBzaG93cyB0aGF0IGxlc3MgTWFsZXMgYXJlIE9ic2VydmVkIHRvIGJlIFVuZW1wbG95ZWQgdGhhbiBleHBlY3RlZC4NCg0KVGhlIFAtVmFsdWUgb2YgMC4wMDEzODcgc2hvd3MgYSBoaWdoIHNpZ25pZmljYW5jZSBpbiB0aGUgY29ycmVsYXRpb24gYmV0d2VlbiBHZW5kZXIgYW5kIEVtcGxveW1lbnQgc3RhdHVzLiBBcyBoaWdobGlnaHRlZCBieSB0aGUgYmx1ZSBhbmQgcmVkIGJhcnMsIHdlIGNhbiBzZWUgdGhhdCB0aGUgdGhlIHNpZ25pZmljYW5jZSBsaWVzIGluIFVuZW1wbG95bWVudC4gVGhlIGdyZXkgaGlnaGxpZ2h0cyB0aGFuIHRoZXJlIGlzIG5vIHNpZ25pZmljYW50IGFzc29jaWF0aW9uIGluIHRoZXNlIHJlc3VsdHMgd2l0aCByZWdhcmRzIHRvIHRob3NlIHdobyBhcmUgRW1wbG95ZWQuDQoNClRoZSBsaW5lIGFib3ZlIHRoZSBiYXIgc2hvd3MgdGhhdCBtb3JlIEZlbWFsZXMgYXJlIE9ic2VydmVkIHRvIGJlIFVuZW1wbG95ZWQgdGhhbiBFeHBlY3RlZCwgYW5kIHRoZSBsaW5lIGJlbG93IHRoZSBiYXIgc2hvd3MgdGhhdCBsZXNzIE1hbGVzIGFyZSBPYnNlcnZlZCB0byBiZSBVbmVtcGxveWVkIHRoYW4gZXhwZWN0ZWQuXA0KXA0KDQojIyMjIFtDb25jbHVzaW9uXXsudW5kZXJsaW5lfQ0KDQpGcm9tIG91ciByZXN1bHRzIHdlIGNvbmNsdWRlIHRoYXQgdGhlcmUgaXMgYSBzaWduaWZpY2FudCBhc3NvY2lhdGlvbiAoUC1WYWx1ZSBcPCAwLjA1KSBiZXR3ZWVuIEdlbmRlciBhbmQgRW1wbG95bWVudCBTdGF0dXMgaW4gdGhlIFVTIGZvciB0aG9zZSB3aG8gYXJlIDI1IGFuZCBvdmVyLCB3aXRoIGEgQmFjaGVsb3JzIERlZ3JlZSBvciBoaWdoZXIuDQoNCkFsdGhvdWdoLCB0aGUgc2lnbmlmaWNhbmNlIG9mIG91ciBhc3NvY2lhdGlvbiBvbmx5IHNob3dzIG9uIHRoZSBVbmVtcGxveWVkIHNpZGUuIFdlIHdpbGwgbm90IHVzZSBHZW5kZXIgYXMgYSBkZXRlcm1pbmluZyBmYWN0b3Igd2hpY2ggZGVjaWRlcyB3aGV0aGVyIG9yIHdoZXRoZXIgZ2V0cyBnZXRzIGEgam9iIChJZiB0aGV5IGhhdmUgYSBkZWdyZWUpLiBXaGljaCBpcyBzdGlsbCBhIHBvc2l0aXZlIHJlc3VsdCBmcm9tIGEgc29jaWV0YWwgcG9pbnQgb2Ygdmlldy4gRnVydGhlcm1vcmUsIHRoZXJlIGlzIHN0aWxsIGEgc2lnbmlmaWNhbnQgcG9zaXRpdmUgY29ycmVsYXRpb24gYmV0d2VlbiBGZW1hbGVzIGFuZCBVbmVtcGxveWVkLg0KDQpZZXQsIHdlIG11c3QgcmVhbGl6ZSB0aGF0IHRoZXNlIHJlc3VsdHMgYWxvbmUgZG8gbm90IGV4cGxhaW4gYWxsIHRoZSBmYWN0b3JzIGF0IHBsYXkuIFNpbXBseSB0aGV5IHNob3cgYSBjb3JyZWxhdGlvbiB3aXRoaW4gb3VyIHNhbXBsZSBvZiB0aGUgcG9wdWxhdGlvbiBkYXRhLCByYXRoZXIgdGhhbiB0aGUgY2F1c2Ugb2YgdW5lbXBsb3ltZW50IGlzIGR1ZSB0byB0aGUgZmFjdCB0aGF0IHRoZXkgYXJlIEZlbWFsZQ0KDQpXZSBjb25jbHVkZSBmcm9tIHRoaXMgYW5hbHlzaXMgdGhhdCB0aGUgcmVhc29uICJ3aHk/IiB0aGlzIG1pZ2h0IG9jY3VyIHdvdWxkIG5vdCBiZSBkdWUgdG8gR2VuZGVyIGFsb25lLCBidXQgZHVlIHRvIG1vcmUgc29jaWFsIGZhY3RvcnMgYW5kIG5vcm1zIHdoaWNoIEZlbWFsZXMgZmFjZSBpbiBzb2NpZXR5LiBGdXJ0aGVyIGFuYWx5c2lzIHNob3VsZCBiZSBkb25lIHRvIHRlc3QgdGhlc2Ugc29jaWFsIGZhY3RvcnMgb24gYW4gaW5kZXgsIGRldGVybWluZSBpZiB0aGV5IGhhdmUgYSBzaWduaWZpY2FudCBhc3NvY2lhdGlvbiB0byBFbXBsb3ltZW50IFN0YXR1cyBhbmQgbWFrZSBhIGNvbXBhcmlzb24gYnkgR2VuZGVyLg0KDQpPbmUgbXVzdCBhbHNvIGNvbnNpZGVyIG91ciBkaWZmZXJlbmNlcyBpbiBuYXR1cmUsIHN1Y2ggYXMgaGF2aW5nIGEgYmFieS4gV2hpY2ggbWF5IGNhdXNlIHNvbWUgbW9yZSB3b21lbiB0byBsZWF2ZSBFbXBsb3ltZW50LiBUaGlzIGNhbiBhbHNvIGJlIHN0dWRpZWQgYnkgY29tcGFyaW5nIFVuZW1wbG95ZWQgRmVtYWxlcyB0byBkdWUgdG8gYmVpbmcgZmlyZWQvcXVpdCB0byB0aG9zZSB3aG8gaGF2ZSBsZWZ0IGZvciBtYXRlcm5hbCByZWFzb25zLiBJZiB0aGVzZSBzdHVkaWVzIHByb3ZlIHRoYXQgbWF0ZXJuYWwgcmVhc29ucyBhcmUgd2h5IHRoZXJlIGlzIGEgY29ycmVsYXRpb24sIHRoZW4gaG9wZWZ1bGx5IGFzIHRpbWUgZ29lcyBvbiBhbmQgbW9yZSBwZW9wbGUgY2FuIHdvcmsgcmVtb3RlbHksIHdlIHdvbid0IHNlZSBhIHNpZ25pZmljYW50IGNvcnJlbGF0aW9uIGFueW1vcmUuDQoNCkFsc28sIGZyb20gdGhpcyBzdHVkeSB3ZSBoYXZlICoqbm90KiogY29uY2x1ZGVkIHRoYXQgb25lIEdlbmRlciBpcyBtb3JlIGxpa2VseSB0byBnZXQgYSBkZWdyZWUgdGhhbiB0aGUgb3RoZXIgZ2VuZGVyLiBPdXIgcmVzdWx0cyBjb3VsZCBoYXZlIHBvc3NpYmx5IGJlIHNrZXdlZCBzaW1wbHkgZHVlIHRvIHRoZSBmYWN0IHRoYXQgdGhlcmUgYSBsZXNzIEZlbWFsZXMgd2l0aCBhIEJhY2hlbG9ycyBEZWdyZWUgb3IgaGlnaGVyIHRoYW4gTWFsZS4gVGhlcmVmb3JlLCBmdXJ0aGVyIHJlc2VhcmNoIGNvdWxkIGJlIGRvbmUgdG8gdGVzdCB0aGUgc2lnbmlmaWNhbmNlIG9mIGRpZmZlcmVuY2VzIGluIGVkdWNhdGlvbmFsIGF0dGFpbm1lbnQgYnkgZ2VuZGVyLg0KDQpFdmVuIHRob3VnaCB0aGUgRWR1Y2F0aW9uYWwgRXF1aXR5IEFjdCB3YXMgcHV0IGluIHBsYWNlIGluIDE5NzQsIGFuZCBHZW5kZXIgRXF1aXR5IEFjdCBpbiAxOTk0IChOV0hQLCAyMDIzKSwgd2Ugc3RpbGwgb2JzZXJ2ZWQgYSBsb3QgbW9yZSBNYWxlcyB3aXRoIGEgQmFjaGVsb3JzIHRoYW4gRmVtYWxlcyBvYnNlcnZlZCBpbiBvdXIgc2FtcGxlIGRhdGEgc2V0IChFbXBsb3llZCBvciBVbmVtcGxveWVkKS4gTW9yZSByZXNlYXJjaCBjb3VsZCB0aGVyZWZvcmUgYmUgZG9uZSB0byBkZXRlcm1pbmUgd2hhdCBzb2NpYWwgZmFjdG9ycyB0aGUgZGlmZmVyZW50IGdlbmRlcnMgbWF5IGZhY2Ugb24gYW4gaW5kZXggYW5kIGNvbXBhcmUgdGhpcyBudW1iZXIgdG8gdGhlaXIgZWR1Y2F0aW9uYWwgYXR0YWlubWVudC5cDQpcDQpcDQpcDQpcDQpcDQpcDQpcDQoNCiMjIyBbKipSZWZlcmVuY2VzKipdey51bmRlcmxpbmV9DQoNCi0gICBBcmFnYW8sIENhcm9saW5hLiAoMjAyMykuIEdlbmRlciBwYXkgZ2FwIGluIHRoZSBVLlMuIGhhc24ndCBjaGFuZ2VkIG11Y2ggaW4gdHdvIGRlY2FkZXMuIFBldyBSZXNlYXJjaCBDZW50ZXIuIFtXZWJzaXRlXSBbQXZhaWxhYmxlIG9ubGluZSBhdDogPGh0dHBzOi8vd3d3LnBld3Jlc2VhcmNoLm9yZy9zaG9ydC1yZWFkcy8yMDIzLzAzLzAxL2dlbmRlci1wYXktZ2FwLWZhY3RzLyM6fjp0ZXh0PUluJTIwMjAyMSUyQyUyMGZ1bGwlMkR0aW1lJTJDLG9jY3VwYXRpb25hbCUyMHNlZ3JlZ2F0aW9uJTIwYW5kJTIwd29yayUyMGV4cGVyaWVuY2U+XQ0KDQotICAgQW1hbmRhLCBKLiwgU2hha2VyLiAoMjAyNCkuIDEuMSBBc3N1bXB0aW9uczogSW5kZXBlbmRlbnQgc2FtcGxlcyB0LXRlc3QuIFNUTTEwMDEgVG9waWMgNjogdC10ZXN0cyBmb3IgdHdvLXNhbXBsZSBoeXBvdGhlc2lzIHRlc3RpbmcuIGJvb2tkb3duLiBbV2Vic2l0ZV0gW0F2YWlsYWJsZSBvbmxpbmUgYXQ6IDxodHRwczovL2Jvb2tkb3duLm9yZy9jb250ZW50L2Y5ZDAzNWVkLTg2ZWEtNDc3OS1hZDAxLTMxYWNjOTczZjBkZC8+XQ0KDQotICAgQmluZ2hhbXRvbiwgVW5pdmVyc2l0eS4gKDIwMjQpLiBXb21lbidzIFJpZ2h0czogVGhlbiBhbmQgbm93LiBTdW1tZXIgb2YgTG92ZSBFeGhpYml0OiBTb2NpYWwgbW92ZW1lbnRzIG9mIDE5NjcuIExpYnJhcnkgZ3VpZGVzLiBbV2Vic2l0ZV0gW0F2YWlsYWJsZSBvbmxpbmUgYXQ6IDxodHRwczovL2xpYnJhcnlndWlkZXMuYmluZ2hhbXRvbi5lZHUvZXhoaWJpdHN1bW1lcm9mbG92ZS9zb2NpZXR5I3RhYl9zLWxpYi1jdGFiLTE1NTcwODcxLTA+XQ0KDQotICAgQ2FyZXksIFcuLCBJc2FiZWwuIEhhY2tldCwgQ29ucmFkLiAoMjAyMikuIEdsb2JhbCBwb3B1bGF0aW9uIHNrZXdzIG1hbGUsIGJ1dCBVTiBwcm9qZWN0cyBwYXJpdHkgYmV0d2VlbiBzZXhlcyBieSAyMDUwLiBQZXdyZXNlYXJjaC4gW1dlYnNpdGVdIFtBdmFpbGFibGUgb25saW5lIGF0OiA8aHR0cHM6Ly93d3cucGV3cmVzZWFyY2gub3JnL3Nob3J0LXJlYWRzLzIwMjIvMDgvMzEvZ2xvYmFsLXBvcHVsYXRpb24tc2tld3MtbWFsZS1idXQtdW4tcHJvamVjdHMtcGFyaXR5LWJldHdlZW4tc2V4ZXMtYnktMjA1MC8jPjpcfjp0ZXh0PVRoZSUyMFVuaXRlZCUyMFN0YXRlcyUyMGhhcyUyMGhhZCxpcyUyMGV4cGVjdGVkJTIwdG8lMjBiZSUyMDk5XQ0KDQotICAgREFUQXRhYi4gKDIwMjQpLiBNYW5uLVdoaXRuZXkgVS1UZXN0LiBbV2Vic2l0ZV0gW0F2YWlsYWJsZSBvbmxpbmUgYXQ6IDxodHRwczovL2RhdGF0YWIubmV0L3R1dG9yaWFsL21hbm4td2hpdG5leS11LXRlc3Q+XQ0KDQotICAgRnV0dXJlLCBMZWFybi4gKDIwMjEpLiBFeHBsb3JpbmcgR2VuZGVyIEluZXF1YWxpdHk6IFdoYXQgaXMgRmVtaW5pc20/IFtCbG9nXSBbQXZhaWxhYmxlIG9ubGluZSBhdDogPGh0dHBzOi8vd3d3LmZ1dHVyZWxlYXJuLmNvbS9pbmZvL2Jsb2cvd2hhdC1pcy1mZW1pbmlzbSM6fjp0ZXh0PUZlbWluaXNtJTIwY2FuJTIwYmUlMjBkZWZpbmVkJTIwYXMsZXZlcnlvbmUlMkMlMjByZWdhcmRsZXNzJTIwb2YlMjBnZW5kZXIlMjBpZGVudGl0eT5dDQoNCi0gICBHYXdhbGksIFN1dmFybmEuICgyMDIzKS4gU2tld25lc3MgYW5kIEt1cnRvc2lzOiBRdWljayBHdWlkZSAoVXBkYXRlZCAyMDI0KS4gW1dlYnNpdGVdIFtBdmFpbGFibGUgb25saW5lIGF0OiA8aHR0cHM6Ly93d3cuYW5hbHl0aWNzdmlkaHlhLmNvbS9ibG9nLzIwMjEvMDUvc2hhcGUtb2YtZGF0YS1za2V3bmVzcy1hbmQta3VydG9zaXMvPl0NCg0KLSAgIEdpYW5uaSwgSCwuIEVkd2FyZC4gKDIwMDUpLiBUZXh0Ym9vayBvZiBQZWRpYXRyaWMgUmhldW1hdG9sb2d5LiBGaWZ0aCBFZGl0aW9uLiBbQm9va10NCg0KLSAgIEphd2FpZCwgTW9oYW1tYWQuIFRoYXJpcSwgTW9oYW1lZC4gU2FiYSwgTmFoZWVkLiAoMjAxOSkuIEZhaWx1cmUgQW5hbHlzaXMgaW4gQmlvY29tcG9zaXRlcywgRmlicmUtUmVpbmZvcmNlZCBDb21wb3NpdGVzIGFuZCBIeWJyaWQgQ29tcG9zaXRlcy4gQSB2b2x1bWUgaW4gV29vZGhlYWQgUHVibGlzaGluZyBTZXJpZXMgaW4gQ29tcG9zaXRlcyBTY2llbmNlIGFuZCBFbmdpbmVlcmluZy4gW0Jvb2tdDQoNCi0gICBOYXRpb25hbCwgV29tYW4ncywgSGlzdG9yeSwgUHJvamVjdCwgTldIUC4gKDIwMjMpLiBXb21lbidzIFJpZ2h0cyBIaXN0b3J5IGluIHRoZSBVUy4gWW91ciBEcmVhbSBibG9nLiBbV2Vic2l0ZV0gW0F2YWlsYWJsZSBvbmxpbmUgYXQ6IDxodHRwczovL3lvdXJkcmVhbS5saXZleW91cmRyZWFtLm9yZy8yMDIzLzAyL2hpc3Rvcnktb2Ytd29tZW5zLXJpZ2h0cy1pbi10aGUtdXMvP3V0bV90ZXJtPXdvbWVucyUyMHJpZ2h0cyZ1dG1fY2FtcGFpZ249JnV0bV9zb3VyY2U9YWR3b3JkcyZ1dG1fbWVkaXVtPXBwYyZoc2FfYWNjPTM0NjgyODY3NzcmaHNhX2NhbT0xNzQzMjc3NjM3JmhzYV9tdD1iJmhzYV9uZXQ9YWR3b3JkcyZoc2Ffc3JjPWcmaHNhX3Zlcj0zJmhzYV9hZD02Nzg3MTcyMzM3NTQmaHNhX3RndD1rd2QtMTAxMDY0NTAmaHNhX2dycD0xNTUyMzI2MjM4OTkmaHNhX2t3PXdvbWVucyUyMHJpZ2h0cyZnYWRfc291cmNlPTEmZ2NsaWQ9Q2p3S0NBaUFxWTZ0QmhBdEVpd0FIZVJvcGRjVURPQTB3YTZ6cXJQS0FZQVlKdzBtelhOQk5SeldKTlU2dG5QRFpwTDVLaWpzMHZmR3p4b0N0U29RQXZEX0J3RT5dDQoNCi0gICBOb3dhY2tpLCBBbXkgKDIwMTcpLiBDaGktc3F1YXJlIGFuZCBGaXNoZXIncyBleGFjdCB0ZXN0cy4gQ2xldmVsYW5kIENsaW5pYyBKb3VybmFsIG9mIE1lZGljaW5lLiBbV2Vic2l0ZV0gW0F2YWlsYWJsZSBvbmxpbmUgYXQ6IDxodHRwczovL3d3dy5jY2ptLm9yZy9jb250ZW50Lzg0Lzlfc3VwcGxfMi9lMjAjPjpcfjp0ZXh0PUZvciUyMHNpbXBsaWNpdHklMkMlMjBtb3N0JTIwcmVzZWFyY2hlcnMlMjBhZGhlcmUsdGhhdCUyMHRoZSUyMG9ic2VydmF0aW9ucyUyMGFyZSUyMGluZGVwZW5kZW50XQ0KDQotICAgTWluaXRhYiAoMjAyMykuIEludGVycHJldCBhbGwgc3RhdGlzdGljcyBmb3IgQ2hpLVNxdWFyZSBUZXN0IG9mIEFzc29jaWF0aW9uLiBDaGktU3F1YXJlIFRlc3QgZm9yIEFzc29jaWF0aW9uLiBbV2Vic2l0ZV0gW0F2YWlsYWJsZSBvbmxpbmUgYXQ6IDxodHRwczovL3N1cHBvcnQubWluaXRhYi5jb20vZW4tdXMvbWluaXRhYi8yMS9oZWxwLWFuZC1ob3ctdG8vc3RhdGlzdGljcy90YWJsZXMvaG93LXRvL2NoaS1zcXVhcmUtdGVzdC1mb3ItYXNzb2NpYXRpb24vaW50ZXJwcmV0LXRoZS1yZXN1bHRzL2FsbC1zdGF0aXN0aWNzLyM+Olx+OnRleHQ9VGhlJTIwZXhwZWN0ZWQlMjBjb3VudCUyMGlzJTIwdGhlLHRoZSUyMHRvdGFsJTIwbnVtYmVyJTIwb2YlMjBvYnNlcnZhdGlvbnNdDQoNCi0gICBPd2VucywgQW5pdGEuICgyMDIyKS4gSG93IHRvIGZvcmVjYXN0IHdpdGggdHdvLXdheSBBTk9WQSBpbiBSLiBbYmxvZ10gW0F2YWlsYWJsZSBvbmxpbmUgYXQ6IDxodHRwczovL21lZGl1bS5jb20vbWxlYXJuaW5nLWFpL2hvdy10by1mb3JlY2FzdC13aXRoLXR3by13YXktYW5vdmEtaW4tci0zM2QxYzA5NzkwYjM+XQ0KDQotICAgVGhlLCBTd2VkaXNoLCBJbnRlcm5hdGlvbmFsLCBEZXZlbG9wbWVudCwgQ29ycG9yYXRpb24sIEFnZW5jeS4gU2lkYS4gKDIwMTcpLiBHZW5kZXIgYW5kIEVkdWNhdGlvbmFsIEF0dGFpbm1lbnQuIFtXZWJzaXRlXSBbQXZhaWxhYmxlIG9ubGluZSBhdDogPGh0dHBzOi8vd3d3LnNpZGEuc2UvZW4vcHVibGljYXRpb25zL2dlbmRlci1hbmQtZWR1Y2F0aW9uYWwtYXR0YWlubWVudD5dDQoNCi0gICBVLlMuLCBEZXBhcnRtZW50LCBPRiwgTEFCT1IsLiBET0wgKDIwMjQpLiBFcXVhbCBQYXkgZm9yIEVxdWFsIFdvcmsuIFtXZWJzaXRlXSBbQXZhaWxhYmxlIG9ubGluZSBhdDogW1tbaHR0cHM6Ly93d3cuZG9sLmdvdi9hZ2VuY2llcy9vYXNhbS9jZW50ZXJzLW9mZmljZXMvY2l2aWwtcmlnaHRzLWNlbnRlci9pbnRlcm5hbC9wb2xpY2llcy9lcXVhbC1wYXktZm9yLWVxdWFsd29yayM6XFxcXF0oaHR0cHM6Ly93d3cuZG9sLmdvdi9hZ2VuY2llcy9vYXNhbS9jZW50ZXJzLW9mZmljZXMvY2l2aWwtcmlnaHRzLWNlbnRlci9pbnRlcm5hbC9wb2xpY2llcy9lcXVhbC1wYXktZm9yLWVxdWFsd29yayM6KXsudXJpfV0oJTVCaHR0cHM6Ly93d3cuZG9sLmdvdi9hZ2VuY2llcy9vYXNhbS9jZW50ZXJzLW9mZmljZXMvY2l2aWwtcmlnaHRzLWNlbnRlci9pbnRlcm5hbC9wb2xpY2llcy9lcXVhbC1wYXktZm9yLWVxdWFsd29yayM6JTVEKGh0dHBzOi8vd3d3LmRvbC5nb3YvYWdlbmNpZXMvb2FzYW0vY2VudGVycy1vZmZpY2VzL2NpdmlsLXJpZ2h0cy1jZW50ZXIvaW50ZXJuYWwvcG9saWNpZXMvZXF1YWwtcGF5LWZvci1lcXVhbHdvcmsjOiklN0IudXJpJTdEKXsudXJpfVx+OnRleHQ9VGhlJTIwRXF1YWwlMjBQYXklMjBBY3QlMjBvZix3YWdlJTIwZGlzY3JpbWluYXRpb24lMjBiYXNlZCUyMG9uJTIwc2V4LiZ0ZXh0PVRoZSUyMEVxdWFsJTIwUGF5JTIwQWN0JTIwKEVQQSklMjBwcm90ZWN0cyUyMGluZGl2aWR1YWxzJTIwb2YlMjBhbGwlMjBzZXhlc10NCg==