1 Introduction

Data was collected to observe which factors have the greatest impact on the area of land burned in a forest fire.

In the previous assignment, several regression models were created in order to determine which one provides the best quality of prediction and estimation for the area affected by a forest fire. For this project, we will look at the method of bootstrapping the multiple regression model. We will use the bootstrap method to find bootstrap confidence intervals of the variables in the regression model.

1.1 Data Description

I found this data set on kaggle.com on the following webpage: https://www.kaggle.com/datasets/elikplim/forest-fires-data-set. The data set is named as “forestfires.csv”.

This data set uses meteorological data to predict the approximated area which will be burned in forest fires based upon these various factors. This allows us to investigate the factors which have an impact on the area of land which is burned by a forest fire. Such data is incredibly useful in order to help know which factors have the greatest significance on the area affected by a forest fire, because this could help provide neccessary data to help minimize the area damaged by forest fires.

The data in this data set was collected around the Montesinho Natural Park which is located in Portugal. The data was collected from 517 observations of forest fires which occurred within this national park. To further enhance the data collection, researchers divided up the national park into a set of spatial coordinates to pinpoint the precise location of the forest fires within Montesinho Natural Park. The national park was divided into x-axis and y-axis spatial coordinates, with the x-axis coordinates ranging from 1 to 9, and the y-axis coordinates ranging from 2 to 9. Each observation was pinpointed to the coordinate location of where the forest fire began.

1.2 Variables

There are 13 variables in the forestfires data set.

  • X: The x-axis spatial coordinate of the forest fire’s location within Montesinho Natural Park. A numeric value ranging from 1 to 9.

  • Y: The y-axis spatial coordinate of the forest fire’s location within Montesinho Natural Park. A numeric value ranging from 2 to 9.

  • month: The month of the year in which the forest fire occurred. A categorical, character variable with the lowercase abbreviation of the first three letters of the month. (For example: feb, oct, dec)

  • day: The day of the week on which the forest fire occurred. A categorical, character variable with the lowercase abbreviation of the first three letters of the month. (For example: mon, tue, sat)

  • FFMC: FFMC index from the FWI System. A numeric, quantitative variable. The FWI System stands for the Fire Weather Index System and it is a system that provides a numeric rating on a scale for the intensity of a fire. FFMC stands for Fine Fuel Moisture Code and it is a measure of the moisture content of litter and other fuels for a fire that are present.

  • DMC: DMC index from the FWI System. A numeric, quantitative variable. DMC stands for Deep Moist Convection and it is a measure of decomposed organic material underneath the litter which fuels the fire.

  • DC: DC index from the FWI System. A numeric, quantitative variable. DC stands for Drought Code and is a measure of the moisture content of compact organic layers in the area affected by the fire.

  • ISI: ISI index from the FWI System. A numeric, quantitative variable. ISI stands for Initial Spread Index and is a measure of the expected rate of fire spread.

  • temp: The temperature given in degrees Celsius. A numeric, quantitative variable.

  • RH: The relative humidity given as a percentage. A numeric, quantitative variable.

  • wind: The speed of the wind given in kilometers per hour (km/h). A numeric, quantitative variable.

  • rain: The rain occurring outside given in a measurement of mm/m^2. A numeric, quantitative variable.

  • area: The area of the forest which was burned by the fire. Measured in units of hectares (ha). A numeric, quantitative variable. The response variable of this experimental study.

1.3 Research Questions

For this project, our main goal is to create a model which uses the various factors involved to provide significance for the prediction and estimation of the area burned by a forest fire.

Some further research questions which I came up with over the past few weeks of analyzing this data include:

  • Which factors have the greatest significance in predicting the area burned by a forest fire?

  • Which factors have the highest correlation with each other? And, what are some possible explanations for these factors have the greatest correlation?

  • Are there any major outliers in the data set which would prompt further examination to see what is going on in that occurrence?

  • Is this data set from Montesinho National Park applicable to the overall scope of forest fires around the world? Is our data set representative of forest fires of all locations?

  • How useful is the model we will create in predicting the area affected by a forest fire? And, how can this data help with predicting patterns of forest fires in order to minimize the damage they cause?

We will use these research questions as a starting point for our analysis of this experiment. We will come back to these questions in the conclusion to see which research questions we have concluded an answer to.

2 Data Preparation and Exploratory Analysis

To begin, let’s read in the data set from Github.

'data.frame':   517 obs. of  13 variables:
 $ X    : int  7 7 7 8 8 8 8 8 8 7 ...
 $ Y    : int  5 4 4 6 6 6 6 6 6 5 ...
 $ month: chr  "mar" "oct" "oct" "mar" ...
 $ day  : chr  "fri" "tue" "sat" "fri" ...
 $ FFMC : num  86.2 90.6 90.6 91.7 89.3 92.3 92.3 91.5 91 92.5 ...
 $ DMC  : num  26.2 35.4 43.7 33.3 51.3 ...
 $ DC   : num  94.3 669.1 686.9 77.5 102.2 ...
 $ ISI  : num  5.1 6.7 6.7 9 9.6 14.7 8.5 10.7 7 7.1 ...
 $ temp : num  8.2 18 14.6 8.3 11.4 22.2 24.1 8 13.1 22.8 ...
 $ RH   : int  51 33 33 97 99 29 27 86 63 40 ...
 $ wind : num  6.7 0.9 1.3 4 1.8 5.4 3.1 2.2 5.4 4 ...
 $ rain : num  0 0 0 0.2 0 0 0 0 0 0 ...
 $ area : num  0 0 0 0 0 0 0 0 0 0 ...

The data was collected by pinpointing the forest fire’s location of origin from a system of spatial coordinates around Montesinho Natural Park. So, we will create a graph to help visualize the locations of the occurrences.

As we can see, the forest fire occurrences are spread out throughout the park. It appears that more forest fires were observed in the lower half of the Y-coordinates, around 2-5, however the data still appears to be spread out enough to continue with our investigation of the model.

2.1 Refining the Data set

While looking at the data set, something I noticed is that many observations have an area of 0, meaning that none of the forest was burned by a forest fire for those observations. This could provide for some comparisons between what conditions caused a fire and what did not, or lead to questions of why a fire occurred on a certain day but not another. However, the purpose of this experiment is to see what factors have a significant impact on the area burned in a forest fire. If we were to include these observations with an area of 0 affected by the fires, then this may lead to our observations being skewed or separated into two groups: area of zero and area of nonzero, aka no fire damage and fire damage. This could have a negative affect on our final regression model, by clustering our data into two groups, zero and nonzero area, which would cause for notable inaccuracy. After some consideration, I believe it would be in the best interest of this experiment to create a new data frame, one which only includes the observations where there was in fact a forest fire which caused damage.

Let’s create a new data set called “forestfires1” that includes only the observations where the area affected is greater than 0.

  X Y month day FFMC   DMC    DC  ISI temp RH wind rain area
1 9 9   jul tue 85.8  48.3 313.4  3.9 18.0 42  2.7    0 0.36
2 1 4   sep tue 91.0 129.5 692.6  7.0 21.7 38  2.2    0 0.43
3 2 5   sep mon 90.9 126.5 686.5  7.0 21.9 39  1.8    0 0.47
4 1 2   aug wed 95.5  99.9 513.3 13.2 23.3 31  4.5    0 0.55
5 8 6   aug fri 90.1 108.0 529.8 12.5 21.2 51  8.9    0 0.61
6 1 2   jul sat 90.0  51.3 296.3  8.7 16.6 53  5.4    0 0.71
'data.frame':   270 obs. of  13 variables:
 $ X    : int  9 1 2 1 8 1 2 6 5 8 ...
 $ Y    : int  9 4 5 2 6 2 5 5 4 3 ...
 $ month: chr  "jul" "sep" "sep" "aug" ...
 $ day  : chr  "tue" "tue" "mon" "wed" ...
 $ FFMC : num  85.8 91 90.9 95.5 90.1 90 95.5 95.2 90.1 84.4 ...
 $ DMC  : num  48.3 129.5 126.5 99.9 108 ...
 $ DC   : num  313 693 686 513 530 ...
 $ ISI  : num  3.9 7 7 13.2 12.5 8.7 13.2 10.4 6.2 3.2 ...
 $ temp : num  18 21.7 21.9 23.3 21.2 16.6 23.8 27.4 13.2 24.2 ...
 $ RH   : int  42 38 39 31 51 53 32 22 40 28 ...
 $ wind : num  2.7 2.2 1.8 4.5 8.9 5.4 5.4 4 5.4 3.6 ...
 $ rain : num  0 0 0 0 0 0 0 0 0 0 ...
 $ area : num  0.36 0.43 0.47 0.55 0.61 0.71 0.77 0.9 0.95 0.96 ...

Let’s create another map for our refined data set to ensure everything still looks alright.

The map appears very similar to the one created for the forestfires data set, with the points spread out across the coordinates, so this is good. Once again, it appears that more forest fires were observed in the lower half of the Y-coordinates, around coordinates 2-5, but apart from this, the points are spread out across the coordinate system.

Having a refined data set which focuses on the observations in which forest fires did affect and cause damage to an area of the forest will provide better insight and power for our purpose of this experiment, which is to see which factors have significance in the amount of area damaged by forest fires. By focusing only on the observations which were affected by forest fires, this will be more useful for our goal and allowing us to create a model for prediction and estimation without the inclusion of redundant observations which do not help our model.

Let’s check for any imbalances in the categorical variable of “month”.


apr aug dec feb jul jun mar may oct sep 
  4  99   9  10  18   8  19   1   5  97 

It turns out that there is a very significant imbalance in the variable month. The number of observations in August and September, 99 and 97 respectively drastically outweigh all of the other months, with no other month having greater than 19 observations. This is a major cause for concern as this categorical variable is very severely imbalanced.

We will keep the month variable for now, as it seems like what month it is does have significance in predicting area affected by forest fires, but we will keep a close eye on it for the final model to determine if it should be removed due to its imbalance. We will address this variable later on to see if its removal will help improve our model. This month variable is one we will keep a close watch on due to this concern of imbalance.

Let’s check the other categorical variable “day” for potential imbalances.


fri mon sat sun thu tue wed 
 43  39  42  47  31  36  32 

The “day” variable does not show major imbalance, as all the days have a significant number of observations with the difference between the highest and lowest days being a total of 15 observations, Sunday with 47 and Wednesday with 32. However, the day of the week does not seem like it would have as major significance in predicting forest fire damage then some of the other factors in question. This can be seen as by how the days of the week are not very imbalanced in regards to their total observations. This is unlike the month variable where it was shown that the vast majority of the observations fall into either August or September, evidencing that the majority of forest fires occur within these warmer, end of summer months.

To avoid having too many or too redundant variables within our full model, the categorical variable for “day” will not be included.

X Y month FFMC DMC DC ISI temp RH wind rain area
9 9 jul 85.8 48.3 313.4 3.9 18.0 42 2.7 0 0.36
1 4 sep 91.0 129.5 692.6 7.0 21.7 38 2.2 0 0.43
2 5 sep 90.9 126.5 686.5 7.0 21.9 39 1.8 0 0.47
1 2 aug 95.5 99.9 513.3 13.2 23.3 31 4.5 0 0.55
8 6 aug 90.1 108.0 529.8 12.5 21.2 51 8.9 0 0.61
1 2 jul 90.0 51.3 296.3 8.7 16.6 53 5.4 0 0.71

3 Model Building

For this project, we want to create a multiple linear regression model that allows us to use the several factors in order to create a model for the prediction and estimation of the area affected by forest fires.

3.1 Full Model

We will begin with a full multiple linear regression model. We will observe how this full model turns out to help decide whether we need to apply any transformations to any of the variables.

Statistics of Regression Coefficients
Estimate Std. Error t value Pr(>|t|)
(Intercept) -74.4004408 224.5630059 -0.3313121 0.7406863
X 4.7819085 2.7221618 1.7566584 0.0802003
Y -2.2318912 5.4754358 -0.4076189 0.6839023
monthaug 119.6584526 78.0476359 1.5331464 0.1265043
monthdec 93.2179223 66.0743422 1.4108036 0.1595456
monthfeb 2.9241777 51.9041602 0.0563380 0.9551175
monthjul 66.9401095 66.5964018 1.0051611 0.3157912
monthjun 21.2886426 63.0498198 0.3376480 0.7359118
monthmar -12.1109924 48.6547436 -0.2489170 0.8036294
monthmay 7.9712044 98.5515997 0.0808836 0.9355993
monthoct 168.8733920 94.7483285 1.7823364 0.0759079
monthsep 174.9584210 87.6286192 1.9965900 0.0469541
FFMC 0.7443619 2.4705591 0.3012929 0.7634416
DMC 0.3982145 0.1627861 2.4462435 0.0151253
DC -0.3152171 0.1190645 -2.6474489 0.0086256
ISI -1.9149661 2.0946308 -0.9142261 0.3614790
temp 2.5843307 1.9331153 1.3368736 0.1824792
RH -0.2528721 0.5528720 -0.4573792 0.6477957
wind 3.3528858 3.3304720 1.0067299 0.3150380
rain -4.9594839 13.7861611 -0.3597436 0.7193425

3.2 Check for Violations

Now, we will check the residual plots to look for potential violations of our full model.

It appears that we do have some violations within our model. For instance, variance is not constant as shown by how there are a few very notable outliers to the right of the residual plot. Additionally, the Q-Q Plot shows some violations as well as the right side of the data appears to have some sort of curvature with these points not following a normal distribution. Furthermore, the Cooke’s Distance plot shows that we indeed do have some high leverage points in our model.

Let’s check the VIF for any potential multicollinearity issues in our model.

            GVIF Df GVIF^(1/(2*Df))
X       1.508460  1        1.228194
Y       1.472642  1        1.213525
month 117.881365  9        1.303408
FFMC    3.009177  1        1.734698
DMC     3.625445  1        1.904060
DC     26.871270  1        5.183751
ISI     2.704552  1        1.644552
temp    5.113912  1        2.261396
RH      2.491118  1        1.578327
wind    1.411811  1        1.188196
rain    1.081053  1        1.039737

It appears that we do have a few high VIF values present in our model which leads to the likelihood of a multicollinearity issue.

Let’s use a correlation matrix to check which variables are causing issues. We can only check the correlation of numeric variables so we will create a temporary data set “cor.data” which does not include the categorical variable of month.

         X     Y  FFMC   DMC    DC   ISI  temp    RH  wind  rain  area
X     1.00  0.50 -0.07 -0.10 -0.16 -0.05 -0.08  0.06  0.04  0.06  0.07
Y     0.50  1.00 -0.02  0.04 -0.03 -0.07  0.03 -0.04 -0.04  0.03  0.05
FFMC -0.07 -0.02  1.00  0.48  0.41  0.70  0.56 -0.29 -0.16  0.08  0.05
DMC  -0.10  0.04  0.48  1.00  0.67  0.33  0.50  0.03 -0.14  0.08  0.09
DC   -0.16 -0.03  0.41  0.67  1.00  0.26  0.50 -0.08 -0.24  0.04  0.05
ISI  -0.05 -0.07  0.70  0.33  0.26  1.00  0.47 -0.15  0.07  0.07  0.00
temp -0.08  0.03  0.56  0.50  0.50  0.47  1.00 -0.50 -0.32  0.08  0.11
RH    0.06 -0.04 -0.29  0.03 -0.08 -0.15 -0.50  1.00  0.14  0.10 -0.10
wind  0.04 -0.04 -0.16 -0.14 -0.24  0.07 -0.32  0.14  1.00  0.05  0.00
rain  0.06  0.03  0.08  0.08  0.04  0.07  0.08  0.10  0.05  1.00 -0.01
area  0.07  0.05  0.05  0.09  0.05  0.00  0.11 -0.10  0.00 -0.01  1.00

It appears that FFMC and ISI are highly correlated with a correlation of 0.70. We will remove one of these variables to help avoid this multicollinearity issue. We will keep FFMC, as it is the first variables alphabetically of these two. Additionally, it appears that DMC and DC are significantly correlated, with a correlation of 0.67. We will keep DC as it is the first variable alphabetically of these two.

Now, let’s revise our final.data model with the variables adjusted to address the multicollinearity issue that we encountered.

X Y month FFMC DC temp RH wind rain area
9 9 jul 85.8 313.4 18.0 42 2.7 0 0.36
1 4 sep 91.0 692.6 21.7 38 2.2 0 0.43
2 5 sep 90.9 686.5 21.9 39 1.8 0 0.47
1 2 aug 95.5 513.3 23.3 31 4.5 0 0.55
8 6 aug 90.1 529.8 21.2 51 8.9 0 0.61
1 2 jul 90.0 296.3 16.6 53 5.4 0 0.71

The adjusted final model is given as follows.

Statistics of Regression Coefficients
Estimate Std. Error t value Pr(>|t|)
(Intercept) -75.1321207 182.9397173 -0.4106933 0.6816464
X 3.8460358 2.7296652 1.4089772 0.1600746
Y 0.3730475 5.4471380 0.0684851 0.9454538
monthaug 43.5843177 73.6968537 0.5914000 0.5547826
monthdec 42.3450183 63.7861600 0.6638590 0.5073874
monthfeb 3.8319210 52.4571871 0.0730485 0.9418254
monthjul 17.3621272 64.7226016 0.2682545 0.7887229
monthjun -10.9919974 62.5858539 -0.1756307 0.8607251
monthmar -12.1725199 49.1748282 -0.2475356 0.8046953
monthmay 8.2755520 99.4698215 0.0831966 0.9337613
monthoct 50.2980046 84.5434955 0.5949364 0.5524198
monthsep 74.6973998 80.2226257 0.9311263 0.3526794
FFMC 0.4424613 1.9435330 0.2276582 0.8200965
DC -0.1180168 0.0944542 -1.2494614 0.2126556
temp 2.7700666 1.9310653 1.4344759 0.1526763
RH -0.0717121 0.5499241 -0.1304036 0.8963512
wind 2.7234690 3.2044010 0.8499152 0.3961790
rain -5.5042055 13.9136960 -0.3955962 0.6927376

It is important to note that our full multiple linear regression model has a p-value of p = 0.6816, which is greater than our alpha value of 0.05. This indicates that this full model will likely not be our best choice for prediction and estimation as this model was not statistically significant in predicting the area burned by a forest fire.

3.3 Box Cox Models

Due to the violations in the residual plots of the model, we will use the Box Cox transformations to adjust our data.

3.3.1 Box Cox Transformations

We will try out several transformations in order to choose the best one for our model.

The transformations which I tried used specific variables. The Box Cox transformations I performed are listed as follows:

  • Box Cox- Logarithmic transformation of wind.

  • Box Cox- wind.

  • Box Cox- Logarithmic transformation of temperature (temp).

  • Box Cox- Logarithmic transformations of wind and temperature (temp).

We can see the plots for the Box Cox transformations that were performed and these transformation plots indicate the optimal value of lamba for the different transformed predictor variables. Specifically, for this transformation we looked at transformations of the predictor variables wind and temp, as these two quantiative variables can help us see if we can improve our model for predicting the area based upon the predictors we have.

3.3.2 Square-Root Transformation

We will create a square-root transformation of our model with the log transformed temp variable.

To help improve the significance of the model, I decided to focus in the variables which provided the most statistical significance to our model. Variables such as FFMC and month greatly increased the p-value of the model, so I decided to improve the statistical significance of the multiple regression model by removing these variables from this square root transformation. However, while doing so did decrease the p-value, it still did not lower it enough to achieve a level of statistical significance for this square root transformation model.

Square Root Log-Transformed Model
Estimate Std. Error t value Pr(>|t|)
(Intercept) 2.9136841 2.5350136 1.1493761 0.2514491
X 0.1193862 0.1080509 1.1049065 0.2702137
Y -0.0681424 0.2169081 -0.3141534 0.7536545
DC 0.0003843 0.0011597 0.3314038 0.7406045
log(temp) 0.2345492 0.6913639 0.3392558 0.7346888
RH -0.0225197 0.0165198 -1.3631935 0.1739918
wind 0.0848477 0.1249625 0.6789852 0.4977466
rain -0.0815678 0.5583234 -0.1460942 0.8839594

The p-value of this model is p = 0.2514, which is greater than our alpha value of 0.05. This indicates that this square root transformation may not be our best option as it is not statistically significant for prediction and estimation of the area burned by a forest fire.

Let’s take a look at the residual plots for this transformation.

The residual plot appears to be mostly random except for a few outliers which appear like they are significant. Just like in the linear model, the Q-Q Plot appears to show a violation in that the right hand side of the plot shows the points diverging from a normal distribution. This is evidence of a violation of this transformed model. Furthermore, the Cooke’s Distance plot shows that there is a very high leverage point in the model along with several other outliers, indicating further violations still present within this square-root transformed model.

3.3.3 Logarithmic Transformation

We will create a logarithmic multiple regression model using the log transformation of the response variable area.

To help improve the significance of the model, I decided to focus in the variables which provided the most statistical significance to our model. Variables such as FFMC and month greatly increased the p-value of the model, so I decided to improve the statistical significance of the multiple regression model by removing these variables from this logarithmic transformation. Doing so greatly improved the p-value, with the much lower p-value indicating that this model now does have statistical significance for prediction and estimation of area.

log-transformed model
Estimate Std. Error t value Pr(>|t|)
(Intercept) 2.4834516 0.7666130 3.2395115 0.0013520
X 0.0211869 0.0462344 0.4582490 0.6471534
Y -0.0367580 0.0928944 -0.3956964 0.6926510
DC 0.0000890 0.0004891 0.1820437 0.8556892
temp -0.0181803 0.0213391 -0.8519727 0.3950073
RH -0.0098113 0.0074753 -1.3125061 0.1904980
wind 0.0356783 0.0530221 0.6728946 0.5016074
rain 0.0910809 0.2407878 0.3782623 0.7055421

Let’s take a look at the residual plots for this transformation.

With the logarithmic model, the residuals appear much better than they did for the linear model. The residual plot appears much more random. While the Q-Q Plot does appear to go slightly off of the line for a normal distribution on the right hand side, it is much less severe than how it was in the residual plot of the linear model. Additionally, we still do have some high leverage points as seen in the Cooke’s Distance plot which would definetly be worth investigating further in additional experiments to determine why we have these high leverage points and outliers. However, overall the logarithmic model has fewer violations and much less severe problems than the linear model had regarding its residuals.

Overall, this logarithmic transformed model appears to have the fewest violations and also is the only one with a statistically significant p-value, p = 0.0014.

3.3.4 Comparison of Q-Q Plots

Something which was made note of when performing the various transformations was that there appeared to be some violations when checking our residual conditions. One particular violation which appeared to be very severe in certain cases was the failure of the Q-Q Plot to indicate that the data appeared to follow a normal distribution. Both the original linear model and the square root transformation model especially had severe violations regarding their Q-Q Plots. However, the logarithmic transformation model appeared to have a Q-Q Plot which was much closer to indicting a normal distribution than the other two. While there was still some slight deviation on the right hand side of the Q-Q Plot for the logarithmic transformation, it was way less than either of the other two models. Additionally, the logarithmic transformation was the only Q-Q Plot which did not show blatant curvature in the right hand side of it.

By comparing the Q-Q Plots of these three potential models, we can see that the logarithmic model has the linear model and the square root transformation model have very severe violations of normality in their Q-Q Plot. While the logarthimic transformation model still does have some deviation from normality, it is by far the least severe violation of the three. This gives a strong point towards the logarithmic transformation model being the best one to use for the prediction and estimation of area.

3.3.5 Goodness of Fit

We will now look at other goodness of fit methods for the final three models of consideration. These methods for goodness of fit will include useful tools for statistical analysis such as R-squared value, AIC, and Mallow’s Cp.

We will create an output table to display the goodness of fit values for each of the three models.

Goodness-of-fit Measures for the Three Candidate Models
SSE R.sq R.adj Cp AIC
Linear Full Model 1932593.5973 0.0398488 -0.0249233 18 2432.5069
Sqrt Area Log Temp 3373.9333 0.0167906 -0.0094783 8 697.8614
Log Area 620.3287 0.0106382 -0.0157952 8 240.5934

Overall, it appears that unfortunately all three models have very low R squared values indicating low explained variance within their respective models. The Mallow’s Cp value for the last two models, the square root and logarithmic transformation models, is better than that of the full linear model. The logarithmic transformation model has the lowest AIC out of the three, which indicates that it is a better fit model for the data.

All in all, the best model of the three appears to be the logarithmic transformation. This has been shown by the goodness of fit measures that were performed as well as by that it was the only model with a statistically significant p-value, p = 0.0014, while the other two models both had p-values that were greater than our alpha value of 0.05 indicating that the other two models were not statistically significant in predicting area while the logarithmic model was.

So, we will select the logarithmic transformation model as our final model to use.

3.3.6 Final Model

After our analysis of the three potential choices for a final model, we decided that the best fit model to use is the logarithmic transformation model. This model had the best goodness of fit measures as well as it was the only one with a statistically significant p-value.

Inferential Statistics of Final Model- Log Area
Estimate Std. Error t value Pr(>|t|)
(Intercept) 2.4834516 0.7666130 3.2395115 0.0013520
X 0.0211869 0.0462344 0.4582490 0.6471534
Y -0.0367580 0.0928944 -0.3956964 0.6926510
DC 0.0000890 0.0004891 0.1820437 0.8556892
temp -0.0181803 0.0213391 -0.8519727 0.3950073
RH -0.0098113 0.0074753 -1.3125061 0.1904980
wind 0.0356783 0.0530221 0.6728946 0.5016074
rain 0.0910809 0.2407878 0.3782623 0.7055421

Our overall model appears to be statistically significant for the prediction and estimation of log(area). It appears that choosing the logarithmic transformation as our final model was the best choice after all.

The combined logarithmic model of X, Y, DC, temp, RH, wind, and rain, statistically significantly predicted the log of area, p = 0.0014.

The regression equation for our final choice of the model is given as follows:

log(area) = 2.4835 + 0.0212 * X - 0.0368 * Y + 0.0001 * DC - 0.0182 * temp - 0.0098 * RH + 0.0357 * wind + 0.0911 * rain.

Included below are the inferential statistics of the final model.

Inferential Statistics of Final Model
Estimate Std. Error t value Pr(>|t|)
(Intercept) 2.4834516 0.7666130 3.2395115 0.0013520
X 0.0211869 0.0462344 0.4582490 0.6471534
Y -0.0367580 0.0928944 -0.3956964 0.6926510
DC 0.0000890 0.0004891 0.1820437 0.8556892
temp -0.0181803 0.0213391 -0.8519727 0.3950073
RH -0.0098113 0.0074753 -1.3125061 0.1904980
wind 0.0356783 0.0530221 0.6728946 0.5016074
rain 0.0910809 0.2407878 0.3782623 0.7055421

3.3.6.1 Final Model Variable Interpretation

We will analyze the relationship of the independent variables in our final regression model with their affect on area. As states previously in the variable description section of this project, the measurements for area are given in hectares. Additionally, since our final model selected is a logarithmic transformation, these interpretations will be looking at the effects of these independent variables on the log of area.

  • X: For every additional 1 coordinate movement to the right, the logarithmic transformation of area burned by a forest fire increases by 0.0212 hectares.

  • Y: For every additional 1 coordinate movement upwards, logarithmic transformation of area burned by a forest fire decreases by 0.0368 hectare.

  • DC: For every additional 1 unit increase of DC, the measure of the moisture content of compact organic layers in the area affected by the fire, the logarithmic transformation of area burned by a forest fire increases by 0.0001 hectare.

  • temp: For every 1 degree Celsius increase in temperature, the logarithmic transformation of area burned by a forest fire decreases by 0.0182 hectare.

  • RH: For every 1 percentage increase in the relative humidity, the logarithmic transformation of area burned by a forest fire decreases by 0.0098 hectare.

  • wind: For every 1 kilometer per hour increase in the speed of the wind, the logarithmic transformation of area burned by a forest fire increases by 0.0357.

  • rain: For every 1 mm/m^2 increase in the rain occurring, the logarithmic transformation of area burned by a forest fire increases by 0.0911.

We can see that the variables that are positively associated with the logarithmic transformation of area burned by a forest fire are X, DC, wind, and rain. This indicates that as these variables increase, so does the area burned by a forest fire. On the other hand, the variables that are negatively associated with the logarithmic transformation of area burned by a forest fire are Y, temp, and RH. This indicates that as these variables increase, the area burned by a forest fire decreases.

4 Bootstrapping the Final Model

We chose the logarithmic transformation as our final model in the previous section due to it being the model which both shows the greatest statistical significance in the prediction of area, and has the fewest violations of a multiple regression model of the models we considered.

The equation of our final model is: log(area) = 2.4835 + 0.0212 * X - 0.0368 * Y + 0.0001 * DC - 0.0182 * temp - 0.0098 * RH + 0.0357 * wind + 0.0911 * rain.

Now, we will look at the process of bootstrapping this final model in order to find the bootstrap confidence intervals of the coefficients in our final model.

4.1 Bootstrap Cases

We will look at the bootstrap cases for our final model and use these to help build the bootstrap confidence intervals of the regression coefficients.

We will now use these bootstrap cases to create histograms of the bootstrap regression coefficients.

The histograms of the bootstrap coefficients for the variables in the model were created.

There are histograms for each of the independent variables in the model, along with the intercept, except for the variable “rain”. The variable “rain” contains several points with the value of zero. Since the final model we chose to use is a logarithmic model, this results in an error because log(0) is undefined. So, this variable was not included in the histograms of the bootstrap coefficients due to it resulting in this error. All of the other variables can be seen along with their histograms.

Within the histograms, there are two different normal density curves placed on them. The blue curve is a non-parametric density estimate of the bootstrap sampling distribution. The bootstrap confidence intervals we will calculate shortly are based upon this non-parametric bootstrap sampling distribution. The purple curve is a measure of the estimate of the regression coefficients and the corresponding value of their standard error. The p-values given in the regression output are taken from this curve.

Looking at the histograms of the regression coefficients, both the blue and purple curves appear to be close and consistent with each other. Additionally, the histograms of all of the regression coefficients appear to follow distributions that are approximately normal without any severe skew or outliers immediately noticeable.

4.1.1 Bootstrap Confidence Intervals Using Bootstrapping Cases

Next, we will create the 95% Bootstrap Confidence Intervals for the regression coefficients of the selected model.

Something to note is that as mentioned in the previous section, the variable “rain” includes several entries with a value of zero. Since our final model is a logarithmic transformation, we can not have a log of zero because log(0) is an undefined value, so this leads to the bootstrap method giving the variable rain a value of NA. However, the other independent variables do not have this issue of having several zero values in their entries, so we can observe their bootstrap confidence intervals below.

Regression Coefficient Matrix
Estimate Std. Error t value Pr(>|t|) bootc.ci.95
(Intercept) 2.4835 0.7666 3.2395 0.0014 [ 0.8029 , 4.0016 ]
X 0.0212 0.0462 0.4582 0.6472 [ -0.0619 , 0.1082 ]
Y -0.0368 0.0929 -0.3957 0.6927 [ -0.2263 , 0.1693 ]
DC 0.0001 0.0005 0.1820 0.8557 [ -7e-04 , 9e-04 ]
temp -0.0182 0.0213 -0.8520 0.3950 [ -0.0577 , 0.0195 ]
RH -0.0098 0.0075 -1.3125 0.1905 [ -0.0219 , 0.003 ]
wind 0.0357 0.0530 0.6729 0.5016 [ -0.0672 , 0.1367 ]
rain 0.0911 0.2408 0.3783 0.7055 [ -0.9978 , 0.2001 ]

We can see the bootstrap confidence intervals of the variables along with the intercept of the final logarithmic model of the data. These confidence intervals use bootstrapping cases in order to find the confidence intervals for the regression coefficients. In the above table, we can see the test statistics and the p-values for each of the regression coefficients. We can also see the 95% bootstrap confidence intervals for each of the variables along with the intercept from the use of bootstrapping cases.

Something interesting to note is that the variables X, Y, DC, temp, RH, wind, and rain all contain zero in their 95% bootstrap confidence intervals, meaning that on their own they are not statistically significant. However, the 95% bootstrap confidence interval for the intercept does contain zero, meaning that the combined logarithmic model of all these variables in statistically significant which matches up with what was shown earlier when constructing this final model. This statistical significance of the overall model can be seen by the p-value of p = 0.0014.

4.2 Bootstrap Residuals

In this section, we will use the bootstrap residual method to construct the bootstrap confidence intervals. We will first take a look at the histogram of the residuals that are obtained from the bootstrap method, and then we will construct the 95% bootstrap confidence intervals for the data.

4.2.1 Residual Histogram

Now let’s create a histogram to visualize the residuals obtained from the bootstrap method.

The above histogram shows that the residual histogram appears like it is close to being normally distributed, however it appears like there is an ever-so-slightly skew to the left, with more of the residuals seeming to occur on the left-side of the histogram. Additionally, there are some observations which are slightly off to the end, specifically the two observations to the right of x = 4 on the right-hand side and the one observation to the very left of x = -4 on the left-hand side which could be very slight potential outliers. However, these observations do not look too severe so it is not a major cause for concern. Overall, the residuals seems to fall close to that of a normal distribution,

In the following section, we will use these residuals to conduct the process of taking residual bootstrap samples. We will use these samples to estimate the bootstrap confidence intervals for the regression coefficients in our final model.

4.2.2 Residual Bootstrap Regression and Finding Bootstrap Confidence Intervals

Now, let’s create the 95% bootstrap confidence intervals of the bootstrap regression coefficients.

We will create histograms for each of our regression coefficients to help us visualize our bootstrap residuals for our model.

We will now create the residual bootstrap histograms for the regression coefficients of our model.

We can see that the histograms mostly follow a normal distribution for the regression coefficients of our model. Just like before when creating histograms for the regression coefficients in the bootstrap cases, there are two curves on these histograms, a blue and a purple curve. The blue curve is a non-parametric density estimate of the bootstrap sampling distribution. The bootstrap confidence intervals we will calculate shortly are based upon this non-parametric bootstrap sampling distribution. The purple curve is a measure of the estimate of the regression coefficients and the corresponding value of their standard error. The p-values given in the regression output are taken from this curve.

4.2.3 Bootstrap Confidence Intervals Using Bootstrap Residuals

Next, we will calculate the 95% bootstrap confidence intervals by the use of the bootstrap residuals.

Regression Coefficient Matrix of 95% Residual Bootstrap Confidence Intervals
Estimate Std. Error t value Pr(>|t|) bootr.ci.95
(Intercept) 2.4835 0.7666 3.2395 0.0014 [ 1.0459 , 4.0219 ]
X 0.0212 0.0462 0.4582 0.6472 [ -0.0702 , 0.1077 ]
Y -0.0368 0.0929 -0.3957 0.6927 [ -0.2172 , 0.1382 ]
DC 0.0001 0.0005 0.1820 0.8557 [ -8e-04 , 0.001 ]
temp -0.0182 0.0213 -0.8520 0.3950 [ -0.0628 , 0.0224 ]
RH -0.0098 0.0075 -1.3125 0.1905 [ -0.0246 , 0.004 ]
wind 0.0357 0.0530 0.6729 0.5016 [ -0.0687 , 0.1355 ]
rain 0.0911 0.2408 0.3783 0.7055 [ -0.339 , 0.5911 ]

Above we can see the output table for the 95% bootstrap confidence intervals by the use of the bootstrap residuals method. This table includes the 95% bootstrap confidence intervals for each of the regression coefficients in our final model. Once again we can see that all of the confidence intervals for the regression coefficients contain zero except for that of the intercept. This matches up with our previous analysis of the model that although the individual variables do not show statistical significant, their combination in the overall logarithmic model is statistically significant, which can be seen by the p-value of p = 0.0014.

5 Combining the Results of the Regular Model and the Bootstrap Results

Now that we have created both bootstrap confidence intervals using bootstrap cases and using bootstrap residuals, let’s combine these results into one table to show the combined inferential statistics.

Combined Inferential Statistics- Bootstrap Confidence Intervals (Bootstrap Cases and Residuals) and p-values
Estimate Std. Error Pr(>|t|) bootc.ci.95 bootr.ci.95
(Intercept) 2.4835 0.7666 0.0014 [ 0.8029 , 4.0016 ] [ 1.0459 , 4.0219 ]
X 0.0212 0.0462 0.6472 [ -0.0619 , 0.1082 ] [ -0.0702 , 0.1077 ]
Y -0.0368 0.0929 0.6927 [ -0.2263 , 0.1693 ] [ -0.2172 , 0.1382 ]
DC 0.0001 0.0005 0.8557 [ -7e-04 , 9e-04 ] [ -8e-04 , 0.001 ]
temp -0.0182 0.0213 0.3950 [ -0.0577 , 0.0195 ] [ -0.0628 , 0.0224 ]
RH -0.0098 0.0075 0.1905 [ -0.0219 , 0.003 ] [ -0.0246 , 0.004 ]
wind 0.0357 0.0530 0.5016 [ -0.0672 , 0.1367 ] [ -0.0687 , 0.1355 ]
rain 0.0911 0.2408 0.7055 [ -0.9978 , 0.2001 ] [ -0.339 , 0.5911 ]

The table above combines the results for the inferential statistics of the bootstrap method. The table includes the p-values of the regression coefficients and their bootstrap confidence intervals. This includes both the bootstrap confidence intervals using bootstrap cases (bootc.ci.95) and the bootstrap confidence intervals using bootstrap residuals (bootr.ci.95).

We can see in this output table that both methods of bootstrap confidence intervals yield the same results in regards to the statistical significance of the overall model. As was stated previously in the analysis of the log(area) model, although it seems that the individual variables do not show notable statistical significance, as all of their p-values are greater than our alpha of 0.05, their combined effect in the overall model does show statistical significance with a p-value of p = 0.0014. The bootstrap confidence intervals further strengthen this point as all of the regression coefficients for the variables include zero in their confidence intervals indicating that they are not statistically significant on their own. However, the confidence interval for the intercept does not include zero indicating that it is statistically significant which can be seen by its p-value of p = 0.0014. This validates our analysis of the final model and its statistical significance.

We can create a table to show the widths of the 95% bootstrap confidence intervals for both the bootstrap cases method and the bootstrap residuals method.

95% Bootstrap Confidence Intervals Width- Bootstrap Cases and Bootstrap Residuals
bootc.wd bootr.wd
3.1987 2.9760
0.1701 0.1779
0.3955 0.3555
0.0016 0.0019
0.0772 0.0852
0.0249 0.0286
0.2039 0.2043
1.1979 0.9301

The table above shows the width for both of the bootstrap confidence interval methods for the regression coefficients of the final model. For both of these two methods for bootstrap confidence intervals, we can see that the widths are similar for the two methods showing that they are consistent with one another.

5.1 Final Model Report

Now that we have looked at various methods of analyzing our final regression model, let’s create a final table of the inferential statistics.

Inferential Statistics of the Final Regression Model
Estimate Std. Error t value Pr(>|t|)
(Intercept) 2.4834516 0.7666130 3.2395115 0.0013520
X 0.0211869 0.0462344 0.4582490 0.6471534
Y -0.0367580 0.0928944 -0.3956964 0.6926510
DC 0.0000890 0.0004891 0.1820437 0.8556892
temp -0.0181803 0.0213391 -0.8519727 0.3950073
RH -0.0098113 0.0074753 -1.3125061 0.1904980
wind 0.0356783 0.0530221 0.6728946 0.5016074
rain 0.0910809 0.2407878 0.3782623 0.7055421

The table above shows the inferential statistics of our final model which allows us to verify the statistical significance of it one more time. Our model for the logarithmic transformation of area is statistically significant.

The equation of our final model is: log(area) = 2.4835 + 0.0212 * X - 0.0368 * Y + 0.0001 * DC - 0.0182 * temp - 0.0098 * RH + 0.0357 * wind + 0.0911 * rain.

The combination of X, Y, DC, temp, temp, RH, wind, and rain statistically significantly predicted the logarithmic transformation of area, p = 0.0014. This model has good utility for predicition and estimation.

5.2 Interpretations of the Regression Coefficients

Using the final inferential statistics, we can analyze the relationship of the independent variables in the final model with their affect on area. As was stated previously in the variable description section of this project, the measurements for area are given in hectares. Additionally, since our final model selected is a logarithmic transformation, these interpretations will be looking at the effects of these independent variables on the log of area.

  • X: For every additional 1 coordinate movement to the right, the logarithmic transformation of area burned by a forest fire increases by 0.0212 hectares.

  • Y: For every additional 1 coordinate movement upwards, logarithmic transformation of area burned by a forest fire decreases by 0.0368 hectare.

  • DC: For every additional 1 unit increase of DC, the measure of the moisture content of compact organic layers in the area affected by the fire, the logarithmic transformation of area burned by a forest fire increases by 0.0001 hectare.

  • temp: For every 1 degree Celsius increase in temperature, the logarithmic transformation of area burned by a forest fire decreases by 0.0182 hectare.

  • RH: For every 1 percentage increase in the relative humidity, the logarithmic transformation of area burned by a forest fire decreases by 0.0098 hectare.

  • wind: For every 1 kilometer per hour increase in the speed of the wind, the logarithmic transformation of area burned by a forest fire increases by 0.0357.

  • rain: For every 1 mm/m^2 increase in the rain occurring, the logarithmic transformation of area burned by a forest fire increases by 0.0911.

We can see that the variables that are positively associated with the logarithmic transformation of area burned by a forest fire are X, DC, wind, and rain. This indicates that as these variables increase, so does the area burned by a forest fire. On the other hand, the variables that are negatively associated with the logarithmic transformation of area burned by a forest fire are Y, temp, and RH. This indicates that as these variables increase, the area burned by a forest fire decreases.

6 Summary and Discussion

Overall, through the creation of our final model, and through the use of bootstrap confidence intervals, we were able to conclude the statistical significance of our overall final model. The log(area) model that was chosen showed itself to be statistically significant with a p-value of p = 0.0014. This was verified through the creation of bootstrap confidence intervals using both the methods of bootstrapping cases and bootstrap residuals.

The equation of our final model is given by: log(area) = 2.4835 + 0.0212 * X - 0.0368 * Y + 0.0001 * DC - 0.0182 * temp - 0.0098 * RH + 0.0357 * wind + 0.0911 * rain.

This model showed itself to be statistically significant for the prediction and estimation of the logarithmic transformation of the area affected by forest fires with a statistically significant p-valye of p = 0.0014.

6.1 Answering the Research Questions

Earlier in this report, some research questions were discussed and these were considered while analyzing the data and its results. Now that our model has been thoroughly analyzed, let’s go back and see if we can now answer these research questions for this project.

  • Which factors have the greatest significance in predicting the area burned by a forest fire?

As was found through the analysis of our final model, the regression coefficients themselves did not show statistical significance, but their combined effect did. Out of the independent variables, RH was the most significant with a p-value of 0.1905. However, this value is still above our alpha value of 0.05. So, although the individual variables did not show statistical significance in our final model, their combined effect did show statistical significance with a p-value of p = 0.0014.

  • Which factors have the highest correlation with each other? And, what are some possible explanations for these factors have the greatest correlation?

We did have some factors with notably high correlation with one another. This led to us having to address and fix multicollinearity issues within the original, full model. The variables FFMC and ISI were highly correlated with each other and so were the variables DMC and DC. These multicollinearity issues were addressed when creating our final model.

  • Are there any major outliers in the data set which would prompt further examination to see what is going on in that occurrence?

Yes, this data does have some outliers within it. Additionally, looking at the residual plots for our final model showed the presence of some high leverage points as well. This is something which would be worth looking into in further experimentation to see why there are these extreme observations within the data set.

  • Is this data set from Montesinho National Park applicable to the overall scope of forest fires around the world? Is our data set representative of forest fires of all locations?

This is a question which we do not have enough information to answer with perfect accuracy because this project only looked at the data for Montesinho National Park, not any other places affected by forest fires. However, the data set was sufficiently large suggesting that it serves significance in representing its population. We can not say with perfect accuracy whether this data set does or does not represent every single location affected by forest fires, but this data set provided great use in creating a model which considers various factors which can affect the area burned by a forest fire.

  • How useful is the model we will create in predicting the area affected by a forest fire? And, how can this data help with predicting patterns of forest fires in order to minimize the damage they cause?

Through the analysis and creation of the final model, we did find that our model showed statistical significance in the prediction and estimation of the area affected by forest fires with a p-value of p = 0.0014 in our final model, the logarithmic transformation of area.

6.2 Further Discussion

Some of the major findings of this project was that the final model that was created was in fact statistically significant. This indicates that this final model can be useful in predicting the area that will be affected by forest fires based upon the combined effect of the various variables in this model. This could be helpful for calculating in advance how much damage a forest fire could potentially cause based upon the conditions of the environment in which it will occur. This could be used to help minimize the damage by having knowledge in advance about the damages which could occur based upon the known conditions.

7 Conclusions and Recommendations

Overall, the final model of this project showed itself to be statistically significant in its prediction and estimation of the area of land affected by forest fires based upon a combination of factors. This could provide use in the prevention of the damages caused by forest fires if the conditions were known in advance. By having the knowledge of the area of land which could be impacted by a forest fire based upon the conditions at hand, this could provide rescuers with some knowledge in advance to help fight the forest fires and hopefully minimize the damage caused by having some knowledge in advance regarding the damage potential of the forest fire.

Some recommendations I would suggest for further experimentation are:

  • Since the data in this experiment was all collected within Montesinho Natural Park, consider expanding the data collection to include other places and others natural parks to determine whether the conclusions drawn from this data truly are applicable to all forest fires regardless of location.

  • Consider other factors which may have an impact on the area affected by forest fires. Some ideas which come to mind include time it takes to reach the nearest fire station, other weather conditions like snow or fog, or volume, density, and size of the trees or forest in the given area that is affected.

  • Due to the unpredictable nature of forest fires and other natural disasters, it can be hard to have perfect accuracy in the data collected, specifically the precise and exact area of forest that was affected, so further experiments could consider expanding the sample size to ensure the accuracy of the results and recordings in this experiment.

Altogether, the final model for the logarithmic transformation of area provides statistical significance in the prediction of the area affected by forest fires which could provide use by having knowledge in advance of which factors at hand could lead to more damage from the forest fires.

8 References

This data set was found on the website kaggle.com under the collection of data sets. Included below is the citation of the webpage on which the data set can be found as well as the webpage which I looked at to help me find a data set which caught my interest.

Darlington, A. (2017, September 4). Forest fires data set. Kaggle. https://www.kaggle.com/datasets/elikplim/forest-fires-data-set

Kumar A. (2023, November 10). Linear Regression Datasets: CSV, Excel. https://vitalflux.com/linear-regression-datasets-csv-excel/#google_vignette

LS0tDQp0aXRsZTogIkZhY3RvcnMgQWZmZWN0aW5nIEZvcmVzdCBGaXJlcyBNTFIgUHJvamVjdCBSZXBvcnQiDQphdXRob3I6ICJKb3NpZSBHYWxsb3AiDQpkYXRlOiAiMjAyNC0wOS0yMyINCm91dHB1dDoNCiAgaHRtbF9kb2N1bWVudDogDQogICAgdG9jOiB5ZXMNCiAgICB0b2NfZGVwdGg6IDQNCiAgICB0b2NfZmxvYXQ6IHllcw0KICAgIGZpZ193aWR0aDogNg0KICAgIGZpZ19jYXB0aW9uOiB5ZXMNCiAgICBudW1iZXJfc2VjdGlvbnM6IHllcw0KICAgIHRvY19jb2xsYXBzZWQ6IHllcw0KICAgIGNvZGVfZm9sZGluZzogaGlkZQ0KICAgIGNvZGVfZG93bmxvYWQ6IHllcw0KICAgIHNtb290aF9zY3JvbGw6IHllcw0KICAgIHRoZW1lOiBsdW1lbg0KICB3b3JkX2RvY3VtZW50OiANCiAgICB0b2M6IHllcw0KICAgIHRvY19kZXB0aDogNA0KICAgIGZpZ19jYXB0aW9uOiB5ZXMNCiAgICBrZWVwX21kOiB5ZXMNCiAgcGRmX2RvY3VtZW50OiANCiAgICB0b2M6IHllcw0KICAgIHRvY19kZXB0aDogNA0KICAgIGZpZ19jYXB0aW9uOiB5ZXMNCiAgICBudW1iZXJfc2VjdGlvbnM6IHllcw0KZWRpdG9yX29wdGlvbnM6IA0KICBjaHVua19vdXRwdXRfdHlwZTogY29uc29sZQ0KLS0tDQoNCmBgYHs9aHRtbH0NCg0KPHN0eWxlIHR5cGU9InRleHQvY3NzIj4NCg0KLyogQ2FzY2FkaW5nIFN0eWxlIFNoZWV0cyAoQ1NTKSBpcyBhIHN0eWxlc2hlZXQgbGFuZ3VhZ2UgdXNlZCB0byBkZXNjcmliZSB0aGUgcHJlc2VudGF0aW9uIG9mIGEgZG9jdW1lbnQgd3JpdHRlbiBpbiBIVE1MIG9yIFhNTC4gaXQgaXMgYSBzaW1wbGUgbWVjaGFuaXNtIGZvciBhZGRpbmcgc3R5bGUgKGUuZy4sIGZvbnRzLCBjb2xvcnMsIHNwYWNpbmcpIHRvIFdlYiBkb2N1bWVudHMuICovDQoNCmgxLnRpdGxlIHsgIC8qIFRpdGxlIC0gZm9udCBzcGVjaWZpY2F0aW9ucyBvZiB0aGUgcmVwb3J0IHRpdGxlICovDQogIGZvbnQtc2l6ZTogMjRweDsNCiAgY29sb3I6IERhcmtSZWQ7DQogIHRleHQtYWxpZ246IGNlbnRlcjsNCiAgZm9udC1mYW1pbHk6ICJHaWxsIFNhbnMiLCBzYW5zLXNlcmlmOw0KfQ0KaDQuYXV0aG9yIHsgLyogSGVhZGVyIDQgLSBmb250IHNwZWNpZmljYXRpb25zIGZvciBhdXRob3JzICAqLw0KICBmb250LXNpemU6IDIwcHg7DQogIGZvbnQtZmFtaWx5OiBzeXN0ZW0tdWk7DQogIGNvbG9yOiBEYXJrUmVkOw0KICB0ZXh0LWFsaWduOiBjZW50ZXI7DQp9DQpoNC5kYXRlIHsgLyogSGVhZGVyIDQgLSBmb250IHNwZWNpZmljYXRpb25zIGZvciB0aGUgZGF0ZSAgKi8NCiAgZm9udC1zaXplOiAxOHB4Ow0KICBmb250LWZhbWlseTogc3lzdGVtLXVpOw0KICBjb2xvcjogRGFya0JsdWU7DQogIHRleHQtYWxpZ246IGNlbnRlcjsNCn0NCmgxIHsgLyogSGVhZGVyIDEgLSBmb250IHNwZWNpZmljYXRpb25zIGZvciBsZXZlbCAxIHNlY3Rpb24gdGl0bGUgICovDQogICAgZm9udC1zaXplOiAyMnB4Ow0KICAgIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOw0KICAgIGNvbG9yOiBuYXZ5Ow0KICAgIHRleHQtYWxpZ246IGNlbnRlcjsNCn0NCmgyIHsgLyogSGVhZGVyIDIgLSBmb250IHNwZWNpZmljYXRpb25zIGZvciBsZXZlbCAyIHNlY3Rpb24gdGl0bGUgKi8NCiAgICBmb250LXNpemU6IDIwcHg7DQogICAgZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iLCBUaW1lcywgc2VyaWY7DQogICAgY29sb3I6IG5hdnk7DQogICAgdGV4dC1hbGlnbjogbGVmdDsNCn0NCg0KaDMgeyAvKiBIZWFkZXIgMyAtIGZvbnQgc3BlY2lmaWNhdGlvbnMgb2YgbGV2ZWwgMyBzZWN0aW9uIHRpdGxlICAqLw0KICAgIGZvbnQtc2l6ZTogMThweDsNCiAgICBmb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiIsIFRpbWVzLCBzZXJpZjsNCiAgICBjb2xvcjogbmF2eTsNCiAgICB0ZXh0LWFsaWduOiBsZWZ0Ow0KfQ0KDQpoNCB7IC8qIEhlYWRlciA0IC0gZm9udCBzcGVjaWZpY2F0aW9ucyBvZiBsZXZlbCA0IHNlY3Rpb24gdGl0bGUgICovDQogICAgZm9udC1zaXplOiAxOHB4Ow0KICAgIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOw0KICAgIGNvbG9yOiBkYXJrcmVkOw0KICAgIHRleHQtYWxpZ246IGxlZnQ7DQp9DQoNCmJvZHkgeyBiYWNrZ3JvdW5kLWNvbG9yOndoaXRlOyB9DQoNCi5oaWdobGlnaHRtZSB7IGJhY2tncm91bmQtY29sb3I6eWVsbG93OyB9DQoNCnAgeyBiYWNrZ3JvdW5kLWNvbG9yOndoaXRlOyB9DQoNCjwvc3R5bGU+DQpgYGANCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQ0KIyBEZXRlY3QsIGluc3RhbGwsIGFuZCBsb2FkIHBhY2thZ2VzIGlmIG5lZWRlZC4NCmlmICghcmVxdWlyZSgia25pdHIiKSkgew0KICAgaW5zdGFsbC5wYWNrYWdlcygia25pdHIiKQ0KICAgbGlicmFyeShrbml0cikNCn0NCmlmICghcmVxdWlyZSgibGVhZmxldCIpKSB7DQogICBpbnN0YWxsLnBhY2thZ2VzKCJsZWFmbGV0IikNCiAgIGxpYnJhcnkobGVhZmxldCkNCn0NCmlmICghcmVxdWlyZSgiRW52U3RhdHMiKSkgew0KICAgaW5zdGFsbC5wYWNrYWdlcygiRW52U3RhdHMiKQ0KICAgbGlicmFyeShFbnZTdGF0cykNCn0NCmlmICghcmVxdWlyZSgiTUFTUyIpKSB7DQogICBpbnN0YWxsLnBhY2thZ2VzKCJNQVNTIikNCiAgIGxpYnJhcnkoTUFTUykNCn0NCmlmICghcmVxdWlyZSgicGh5dG9vbHMiKSkgew0KICAgaW5zdGFsbC5wYWNrYWdlcygicGh5dG9vbHMiKQ0KICAgbGlicmFyeShwaHl0b29scykNCn0NCmlmKCFyZXF1aXJlKCJkcGx5ciIpKSB7DQogICBpbnN0YWxsLnBhY2thZ2VzKCJkcGx5ciIpDQogICBsaWJyYXJ5KGRwbHlyKQ0KfQ0KaWYoIXJlcXVpcmUoInRpZHl2ZXJzZSIpKSB7DQogICBpbnN0YWxsLnBhY2thZ2VzKCJ0aWR5dmVyc2UiKQ0KICAgbGlicmFyeSh0aWR5dmVyc2UpDQp9DQppZighcmVxdWlyZSgiR0dhbGx5IikpIHsNCiAgIGluc3RhbGwucGFja2FnZXMoIkdHYWxseSIpDQogICBsaWJyYXJ5KEdHYWxseSkNCn0NCmlmKCFyZXF1aXJlKCJ1c2RtIikpIHsNCiAgIGluc3RhbGwucGFja2FnZXMoInVzZG0iKQ0KICAgbGlicmFyeSh1c2RtKQ0KfQ0KaWYoIXJlcXVpcmUoImNhciIpKSB7DQogICBpbnN0YWxsLnBhY2thZ2VzKCJjYXIiKQ0KICAgbGlicmFyeShjYXIpDQp9DQppZiAoIXJlcXVpcmUoImJvb3QiKSkgew0KICAgaW5zdGFsbC5wYWNrYWdlcygiYm9vdCIpDQogICBsaWJyYXJ5KGJvb3QpDQp9DQppZighcmVxdWlyZSgicGFuZGVyIikpIHsNCiAgIGluc3RhbGwucGFja2FnZXMoInBhbmRlciIpDQogICBsaWJyYXJ5KHBhbmRlcikNCn0NCiMgU3BlY2lmaWNhdGlvbnMgb2Ygb3V0cHV0cyBvZiBjb2RlIGluIGNvZGUgY2h1bmtzDQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IEZBTFNFLCAgIyBpbmNsdWRlIGNvZGUgY2h1bmsgaW4gdGhlIG91dHB1dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlDQogICAgICAgICAgICAgICAgICAgd2FybmluZyA9IEZBTFNFLCAgIyBTb21ldGltZXMsIHlvdXIgY29kZSBtYXkgcHJvZHVjZSBhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YXJuaW5nDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBtZXNzYWdlcywgeW91IGNhbiBjaG9vc2UgdG8gaW5jbHVkZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHdhcm5pbmcgbWVzc2FnZXMgaW4gdGhlIG91dHB1dCBmaWxlLiANCiAgICAgICAgICAgICAgICAgICBtZXNzYWdlID0gRkFMU0UsICANCiAgICAgICAgICAgICAgICAgICByZXN1bHRzID0gVFJVRSwgICAjIHlvdSBjYW4gYWxzbyBkZWNpZGUgd2hldGhlciB0byAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluY2x1ZGUgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyB0aGUgb3V0cHV0IGluIHRoZSBvdXRwdXQgZmlsZS4NCiAgICAgICAgICAgICAgICAgICBjb21tZW50ID0gTkEgICAgICAjIFN1cHByZXNzIGhhc2gtdGFncyBpbiB0aGUgb3V0cHV0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdHMuDQogICAgICAgICAgICAgICAgICAgICAgKSAgIA0KYGBgDQoNCg0KIyBJbnRyb2R1Y3Rpb24NCg0KRGF0YSB3YXMgY29sbGVjdGVkIHRvIG9ic2VydmUgd2hpY2ggZmFjdG9ycyBoYXZlIHRoZSBncmVhdGVzdCBpbXBhY3Qgb24gdGhlIGFyZWEgb2YgbGFuZCBidXJuZWQgaW4gYSBmb3Jlc3QgZmlyZS4gDQoNCkluIHRoZSBwcmV2aW91cyBhc3NpZ25tZW50LCBzZXZlcmFsIHJlZ3Jlc3Npb24gbW9kZWxzIHdlcmUgY3JlYXRlZCBpbiBvcmRlciB0byBkZXRlcm1pbmUgd2hpY2ggb25lIHByb3ZpZGVzIHRoZSBiZXN0IHF1YWxpdHkgb2YgcHJlZGljdGlvbiBhbmQgZXN0aW1hdGlvbiBmb3IgdGhlIGFyZWEgYWZmZWN0ZWQgYnkgYSBmb3Jlc3QgZmlyZS4gRm9yIHRoaXMgcHJvamVjdCwgd2Ugd2lsbCBsb29rIGF0IHRoZSBtZXRob2Qgb2YgYm9vdHN0cmFwcGluZyB0aGUgbXVsdGlwbGUgcmVncmVzc2lvbiBtb2RlbC4gV2Ugd2lsbCB1c2UgdGhlIGJvb3RzdHJhcCBtZXRob2QgdG8gZmluZCBib290c3RyYXAgY29uZmlkZW5jZSBpbnRlcnZhbHMgb2YgdGhlIHZhcmlhYmxlcyBpbiB0aGUgcmVncmVzc2lvbiBtb2RlbC4gIA0KDQoNCiMjIERhdGEgRGVzY3JpcHRpb24NCg0KSSBmb3VuZCB0aGlzIGRhdGEgc2V0IG9uIGthZ2dsZS5jb20gb24gdGhlIGZvbGxvd2luZyB3ZWJwYWdlOiBodHRwczovL3d3dy5rYWdnbGUuY29tL2RhdGFzZXRzL2VsaWtwbGltL2ZvcmVzdC1maXJlcy1kYXRhLXNldC4gVGhlIGRhdGEgc2V0IGlzIG5hbWVkIGFzICJmb3Jlc3RmaXJlcy5jc3YiLg0KDQpUaGlzIGRhdGEgc2V0IHVzZXMgbWV0ZW9yb2xvZ2ljYWwgZGF0YSB0byBwcmVkaWN0IHRoZSBhcHByb3hpbWF0ZWQgYXJlYSB3aGljaCB3aWxsIGJlIGJ1cm5lZCBpbiBmb3Jlc3QgZmlyZXMgYmFzZWQgdXBvbiB0aGVzZSB2YXJpb3VzIGZhY3RvcnMuIFRoaXMgYWxsb3dzIHVzIHRvIGludmVzdGlnYXRlIHRoZSBmYWN0b3JzIHdoaWNoIGhhdmUgYW4gaW1wYWN0IG9uIHRoZSBhcmVhIG9mIGxhbmQgd2hpY2ggaXMgYnVybmVkIGJ5IGEgZm9yZXN0IGZpcmUuIFN1Y2ggZGF0YSBpcyBpbmNyZWRpYmx5IHVzZWZ1bCBpbiBvcmRlciB0byBoZWxwIGtub3cgd2hpY2ggZmFjdG9ycyBoYXZlIHRoZSBncmVhdGVzdCBzaWduaWZpY2FuY2Ugb24gdGhlIGFyZWEgYWZmZWN0ZWQgYnkgYSBmb3Jlc3QgZmlyZSwgYmVjYXVzZSB0aGlzIGNvdWxkIGhlbHAgcHJvdmlkZSBuZWNjZXNzYXJ5IGRhdGEgdG8gaGVscCBtaW5pbWl6ZSB0aGUgYXJlYSBkYW1hZ2VkIGJ5IGZvcmVzdCBmaXJlcy4gDQoNClRoZSBkYXRhIGluIHRoaXMgZGF0YSBzZXQgd2FzIGNvbGxlY3RlZCBhcm91bmQgdGhlIE1vbnRlc2luaG8gTmF0dXJhbCBQYXJrIHdoaWNoIGlzIGxvY2F0ZWQgaW4gUG9ydHVnYWwuIFRoZSBkYXRhIHdhcyBjb2xsZWN0ZWQgZnJvbSA1MTcgb2JzZXJ2YXRpb25zIG9mIGZvcmVzdCBmaXJlcyB3aGljaCBvY2N1cnJlZCB3aXRoaW4gdGhpcyBuYXRpb25hbCBwYXJrLiBUbyBmdXJ0aGVyIGVuaGFuY2UgdGhlIGRhdGEgY29sbGVjdGlvbiwgcmVzZWFyY2hlcnMgZGl2aWRlZCB1cCB0aGUgbmF0aW9uYWwgcGFyayBpbnRvIGEgc2V0IG9mIHNwYXRpYWwgY29vcmRpbmF0ZXMgdG8gcGlucG9pbnQgdGhlIHByZWNpc2UgbG9jYXRpb24gb2YgdGhlIGZvcmVzdCBmaXJlcyB3aXRoaW4gTW9udGVzaW5obyBOYXR1cmFsIFBhcmsuIFRoZSBuYXRpb25hbCBwYXJrIHdhcyBkaXZpZGVkIGludG8geC1heGlzIGFuZCB5LWF4aXMgc3BhdGlhbCBjb29yZGluYXRlcywgd2l0aCB0aGUgeC1heGlzIGNvb3JkaW5hdGVzIHJhbmdpbmcgZnJvbSAxIHRvIDksIGFuZCB0aGUgeS1heGlzIGNvb3JkaW5hdGVzIHJhbmdpbmcgZnJvbSAyIHRvIDkuIEVhY2ggb2JzZXJ2YXRpb24gd2FzIHBpbnBvaW50ZWQgdG8gdGhlIGNvb3JkaW5hdGUgbG9jYXRpb24gb2Ygd2hlcmUgdGhlIGZvcmVzdCBmaXJlIGJlZ2FuLiANCg0KDQojIyBWYXJpYWJsZXMgDQoNClRoZXJlIGFyZSAxMyB2YXJpYWJsZXMgaW4gdGhlIGZvcmVzdGZpcmVzIGRhdGEgc2V0Lg0KDQoqIFg6IFRoZSB4LWF4aXMgc3BhdGlhbCBjb29yZGluYXRlIG9mIHRoZSBmb3Jlc3QgZmlyZSdzIGxvY2F0aW9uIHdpdGhpbiAgICAgIE1vbnRlc2luaG8gTmF0dXJhbCBQYXJrLiBBIG51bWVyaWMgdmFsdWUgcmFuZ2luZyBmcm9tIDEgdG8gOS4NCg0KKiBZOiBUaGUgeS1heGlzIHNwYXRpYWwgY29vcmRpbmF0ZSBvZiB0aGUgZm9yZXN0IGZpcmUncyBsb2NhdGlvbiB3aXRoaW4gICAgICBNb250ZXNpbmhvIE5hdHVyYWwgUGFyay4gQSBudW1lcmljIHZhbHVlIHJhbmdpbmcgZnJvbSAyIHRvIDkuDQoNCiogbW9udGg6IFRoZSBtb250aCBvZiB0aGUgeWVhciBpbiB3aGljaCB0aGUgZm9yZXN0IGZpcmUgb2NjdXJyZWQuIEEgICAgICAgICAgY2F0ZWdvcmljYWwsIGNoYXJhY3RlciB2YXJpYWJsZSB3aXRoIHRoZSBsb3dlcmNhc2UgYWJicmV2aWF0aW9uIG9mIHRoZSAgICAgZmlyc3QgdGhyZWUgbGV0dGVycyBvZiB0aGUgbW9udGguIChGb3IgZXhhbXBsZTogZmViLCBvY3QsIGRlYykNCg0KKiBkYXk6IFRoZSBkYXkgb2YgdGhlIHdlZWsgb24gd2hpY2ggdGhlIGZvcmVzdCBmaXJlIG9jY3VycmVkLiBBICAgICAgICAgICAgICBjYXRlZ29yaWNhbCwgY2hhcmFjdGVyIHZhcmlhYmxlIHdpdGggdGhlIGxvd2VyY2FzZSBhYmJyZXZpYXRpb24gb2YgdGhlICAgICBmaXJzdCB0aHJlZSBsZXR0ZXJzIG9mIHRoZSBtb250aC4gKEZvciBleGFtcGxlOiBtb24sIHR1ZSwgc2F0KQ0KDQoqIEZGTUM6IEZGTUMgaW5kZXggZnJvbSB0aGUgRldJIFN5c3RlbS4gQSBudW1lcmljLCBxdWFudGl0YXRpdmUgdmFyaWFibGUuICAgIFRoZSBGV0kgU3lzdGVtIHN0YW5kcyBmb3IgdGhlIEZpcmUgV2VhdGhlciBJbmRleCBTeXN0ZW0gYW5kIGl0IGlzIGEgICAgICAgIHN5c3RlbSB0aGF0IHByb3ZpZGVzIGEgbnVtZXJpYyByYXRpbmcgb24gYSBzY2FsZSBmb3IgdGhlIGludGVuc2l0eSBvZiBhICAgIGZpcmUuIEZGTUMgc3RhbmRzIGZvciBGaW5lIEZ1ZWwgTW9pc3R1cmUgQ29kZSBhbmQgaXQgaXMgYSBtZWFzdXJlIG9mICAgICAgIHRoZSBtb2lzdHVyZSBjb250ZW50IG9mIGxpdHRlciBhbmQgb3RoZXIgZnVlbHMgZm9yIGEgZmlyZSB0aGF0IGFyZSAgICAgICAgIHByZXNlbnQuDQoNCiogRE1DOiBETUMgaW5kZXggZnJvbSB0aGUgRldJIFN5c3RlbS4gQSBudW1lcmljLCBxdWFudGl0YXRpdmUgdmFyaWFibGUuIERNQyAgIHN0YW5kcyBmb3IgRGVlcCBNb2lzdCBDb252ZWN0aW9uIGFuZCBpdCBpcyBhIG1lYXN1cmUgb2YgZGVjb21wb3NlZCAgICAgICAgIG9yZ2FuaWMgbWF0ZXJpYWwgdW5kZXJuZWF0aCB0aGUgbGl0dGVyIHdoaWNoIGZ1ZWxzIHRoZSBmaXJlLiANCg0KKiBEQzogREMgaW5kZXggZnJvbSB0aGUgRldJIFN5c3RlbS4gQSBudW1lcmljLCBxdWFudGl0YXRpdmUgdmFyaWFibGUuIERDICAgICBzdGFuZHMgZm9yIERyb3VnaHQgQ29kZSBhbmQgaXMgYSBtZWFzdXJlIG9mIHRoZSBtb2lzdHVyZSBjb250ZW50IG9mICAgICAgICBjb21wYWN0IG9yZ2FuaWMgbGF5ZXJzIGluIHRoZSBhcmVhIGFmZmVjdGVkIGJ5IHRoZSBmaXJlLiANCg0KKiBJU0k6IElTSSBpbmRleCBmcm9tIHRoZSBGV0kgU3lzdGVtLiBBIG51bWVyaWMsIHF1YW50aXRhdGl2ZSB2YXJpYWJsZS4gSVNJICAgc3RhbmRzIGZvciBJbml0aWFsIFNwcmVhZCBJbmRleCBhbmQgaXMgYSBtZWFzdXJlIG9mIHRoZSBleHBlY3RlZCByYXRlIG9mICAgZmlyZSBzcHJlYWQuIA0KDQoqIHRlbXA6IFRoZSB0ZW1wZXJhdHVyZSBnaXZlbiBpbiBkZWdyZWVzIENlbHNpdXMuIEEgbnVtZXJpYywgcXVhbnRpdGF0aXZlICAgIHZhcmlhYmxlLg0KDQoqIFJIOiBUaGUgcmVsYXRpdmUgaHVtaWRpdHkgZ2l2ZW4gYXMgYSBwZXJjZW50YWdlLiBBIG51bWVyaWMsIHF1YW50aXRhdGl2ZSAgICB2YXJpYWJsZS4NCg0KKiB3aW5kOiBUaGUgc3BlZWQgb2YgdGhlIHdpbmQgZ2l2ZW4gaW4ga2lsb21ldGVycyBwZXIgaG91ciAoa20vaCkuIEEgICAgICAgICBudW1lcmljLCBxdWFudGl0YXRpdmUgdmFyaWFibGUuDQoNCiogcmFpbjogVGhlIHJhaW4gb2NjdXJyaW5nIG91dHNpZGUgZ2l2ZW4gaW4gYSBtZWFzdXJlbWVudCBvZiBtbS9tXjIuIEEgICAgICAgbnVtZXJpYywgcXVhbnRpdGF0aXZlIHZhcmlhYmxlLiANCg0KKiBhcmVhOiBUaGUgYXJlYSBvZiB0aGUgZm9yZXN0IHdoaWNoIHdhcyBidXJuZWQgYnkgdGhlIGZpcmUuIE1lYXN1cmVkIGluICAgICB1bml0cyBvZiBoZWN0YXJlcyAoaGEpLiBBIG51bWVyaWMsIHF1YW50aXRhdGl2ZSB2YXJpYWJsZS4gVGhlIHJlc3BvbnNlICAgICB2YXJpYWJsZSBvZiB0aGlzIGV4cGVyaW1lbnRhbCBzdHVkeS4gDQoNCg0KIyMgUmVzZWFyY2ggUXVlc3Rpb25zIA0KDQpGb3IgdGhpcyBwcm9qZWN0LCBvdXIgbWFpbiBnb2FsIGlzIHRvIGNyZWF0ZSBhIG1vZGVsIHdoaWNoIHVzZXMgdGhlIHZhcmlvdXMgZmFjdG9ycyBpbnZvbHZlZCB0byBwcm92aWRlIHNpZ25pZmljYW5jZSBmb3IgdGhlIHByZWRpY3Rpb24gYW5kIGVzdGltYXRpb24gb2YgdGhlIGFyZWEgYnVybmVkIGJ5IGEgZm9yZXN0IGZpcmUuIA0KDQpTb21lIGZ1cnRoZXIgcmVzZWFyY2ggcXVlc3Rpb25zIHdoaWNoIEkgY2FtZSB1cCB3aXRoIG92ZXIgdGhlIHBhc3QgZmV3IHdlZWtzIG9mIGFuYWx5emluZyB0aGlzIGRhdGEgaW5jbHVkZToNCg0KKiBXaGljaCBmYWN0b3JzIGhhdmUgdGhlIGdyZWF0ZXN0IHNpZ25pZmljYW5jZSBpbiBwcmVkaWN0aW5nIHRoZSBhcmVhIGJ1cm5lZCBieSBhIGZvcmVzdCBmaXJlPw0KDQoqIFdoaWNoIGZhY3RvcnMgaGF2ZSB0aGUgaGlnaGVzdCBjb3JyZWxhdGlvbiB3aXRoIGVhY2ggb3RoZXI/IEFuZCwgd2hhdCBhcmUgc29tZSBwb3NzaWJsZSBleHBsYW5hdGlvbnMgZm9yIHRoZXNlIGZhY3RvcnMgaGF2ZSB0aGUgZ3JlYXRlc3QgY29ycmVsYXRpb24/IA0KDQoqIEFyZSB0aGVyZSBhbnkgbWFqb3Igb3V0bGllcnMgaW4gdGhlIGRhdGEgc2V0IHdoaWNoIHdvdWxkIHByb21wdCBmdXJ0aGVyIGV4YW1pbmF0aW9uIHRvIHNlZSB3aGF0IGlzIGdvaW5nIG9uIGluIHRoYXQgb2NjdXJyZW5jZT8gDQoNCiogSXMgdGhpcyBkYXRhIHNldCBmcm9tIE1vbnRlc2luaG8gTmF0aW9uYWwgUGFyayBhcHBsaWNhYmxlIHRvIHRoZSBvdmVyYWxsIHNjb3BlIG9mIGZvcmVzdCBmaXJlcyBhcm91bmQgdGhlIHdvcmxkPyBJcyBvdXIgZGF0YSBzZXQgcmVwcmVzZW50YXRpdmUgb2YgZm9yZXN0IGZpcmVzIG9mIGFsbCBsb2NhdGlvbnM/IA0KDQoqIEhvdyB1c2VmdWwgaXMgdGhlIG1vZGVsIHdlIHdpbGwgY3JlYXRlIGluIHByZWRpY3RpbmcgdGhlIGFyZWEgYWZmZWN0ZWQgYnkgYSBmb3Jlc3QgZmlyZT8gQW5kLCBob3cgY2FuIHRoaXMgZGF0YSBoZWxwIHdpdGggcHJlZGljdGluZyBwYXR0ZXJucyBvZiBmb3Jlc3QgZmlyZXMgaW4gb3JkZXIgdG8gbWluaW1pemUgdGhlIGRhbWFnZSB0aGV5IGNhdXNlPw0KDQpXZSB3aWxsIHVzZSB0aGVzZSByZXNlYXJjaCBxdWVzdGlvbnMgYXMgYSBzdGFydGluZyBwb2ludCBmb3Igb3VyIGFuYWx5c2lzIG9mIHRoaXMgZXhwZXJpbWVudC4gV2Ugd2lsbCBjb21lIGJhY2sgdG8gdGhlc2UgcXVlc3Rpb25zIGluIHRoZSBjb25jbHVzaW9uIHRvIHNlZSB3aGljaCByZXNlYXJjaCBxdWVzdGlvbnMgd2UgaGF2ZSBjb25jbHVkZWQgYW4gYW5zd2VyIHRvLiANCg0KDQoNCg0KIyBEYXRhIFByZXBhcmF0aW9uIGFuZCBFeHBsb3JhdG9yeSBBbmFseXNpcw0KDQpUbyBiZWdpbiwgbGV0J3MgcmVhZCBpbiB0aGUgZGF0YSBzZXQgZnJvbSBHaXRodWIuDQoNCmBgYHtyfQ0KZm9yZXN0ZmlyZXMgPC0gcmVhZC5jc3YoImh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9Kb3NpZUdhbGxvcC9TVEEzMjEvbWFpbi9kYXRhc2V0L2ZvcmVzdGZpcmVzLmNzdiIsIGhlYWRlcj1UUlVFKQ0KDQpzdHIoZm9yZXN0ZmlyZXMpDQpgYGANCg0KVGhlIGRhdGEgd2FzIGNvbGxlY3RlZCBieSBwaW5wb2ludGluZyB0aGUgZm9yZXN0IGZpcmUncyBsb2NhdGlvbiBvZiBvcmlnaW4gZnJvbSBhIHN5c3RlbSBvZiBzcGF0aWFsIGNvb3JkaW5hdGVzIGFyb3VuZCBNb250ZXNpbmhvIE5hdHVyYWwgUGFyay4gU28sIHdlIHdpbGwgY3JlYXRlIGEgZ3JhcGggdG8gaGVscCB2aXN1YWxpemUgdGhlIGxvY2F0aW9ucyBvZiB0aGUgb2NjdXJyZW5jZXMuIA0KDQpgYGB7cn0NClggPC0gZm9yZXN0ZmlyZXMkWA0KWSA8LSBmb3Jlc3RmaXJlcyRZDQpwbG90KFgsIFksIG1haW4gPSAiRm9yZXN0IEZpcmUgT2NjdXJlbmNlcyBieSBTcGF0aWFsIENvb3JkaW5hdGVzIikNCmFibGluZSh2PTUsIGg9NSwgY29sPSJyZWQiLCBsdHk9MikNCmBgYA0KDQpBcyB3ZSBjYW4gc2VlLCB0aGUgZm9yZXN0IGZpcmUgb2NjdXJyZW5jZXMgYXJlIHNwcmVhZCBvdXQgdGhyb3VnaG91dCB0aGUgcGFyay4gSXQgYXBwZWFycyB0aGF0IG1vcmUgZm9yZXN0IGZpcmVzIHdlcmUgb2JzZXJ2ZWQgaW4gdGhlIGxvd2VyIGhhbGYgb2YgdGhlIFktY29vcmRpbmF0ZXMsIGFyb3VuZCAyLTUsIGhvd2V2ZXIgdGhlIGRhdGEgc3RpbGwgYXBwZWFycyB0byBiZSBzcHJlYWQgb3V0IGVub3VnaCB0byBjb250aW51ZSB3aXRoIG91ciBpbnZlc3RpZ2F0aW9uIG9mIHRoZSBtb2RlbC4gDQoNCg0KIyMgUmVmaW5pbmcgdGhlIERhdGEgc2V0DQoNCldoaWxlIGxvb2tpbmcgYXQgdGhlIGRhdGEgc2V0LCBzb21ldGhpbmcgSSBub3RpY2VkIGlzIHRoYXQgbWFueSBvYnNlcnZhdGlvbnMgaGF2ZSBhbiBhcmVhIG9mIDAsIG1lYW5pbmcgdGhhdCBub25lIG9mIHRoZSBmb3Jlc3Qgd2FzIGJ1cm5lZCBieSBhIGZvcmVzdCBmaXJlIGZvciB0aG9zZSBvYnNlcnZhdGlvbnMuIFRoaXMgY291bGQgcHJvdmlkZSBmb3Igc29tZSBjb21wYXJpc29ucyBiZXR3ZWVuIHdoYXQgY29uZGl0aW9ucyBjYXVzZWQgYSBmaXJlIGFuZCB3aGF0IGRpZCBub3QsIG9yIGxlYWQgdG8gcXVlc3Rpb25zIG9mIHdoeSBhIGZpcmUgb2NjdXJyZWQgb24gYSBjZXJ0YWluIGRheSBidXQgbm90IGFub3RoZXIuIEhvd2V2ZXIsIHRoZSBwdXJwb3NlIG9mIHRoaXMgZXhwZXJpbWVudCBpcyB0byBzZWUgd2hhdCBmYWN0b3JzIGhhdmUgYSBzaWduaWZpY2FudCBpbXBhY3Qgb24gdGhlIGFyZWEgYnVybmVkIGluIGEgZm9yZXN0IGZpcmUuIElmIHdlIHdlcmUgdG8gaW5jbHVkZSB0aGVzZSBvYnNlcnZhdGlvbnMgd2l0aCBhbiBhcmVhIG9mIDAgYWZmZWN0ZWQgYnkgdGhlIGZpcmVzLCB0aGVuIHRoaXMgbWF5IGxlYWQgdG8gb3VyIG9ic2VydmF0aW9ucyBiZWluZyBza2V3ZWQgb3Igc2VwYXJhdGVkIGludG8gdHdvIGdyb3VwczogYXJlYSBvZiB6ZXJvIGFuZCBhcmVhIG9mIG5vbnplcm8sIGFrYSBubyBmaXJlIGRhbWFnZSBhbmQgZmlyZSBkYW1hZ2UuIFRoaXMgY291bGQgaGF2ZSBhIG5lZ2F0aXZlIGFmZmVjdCBvbiBvdXIgZmluYWwgcmVncmVzc2lvbiBtb2RlbCwgYnkgY2x1c3RlcmluZyBvdXIgZGF0YSBpbnRvIHR3byBncm91cHMsIHplcm8gYW5kIG5vbnplcm8gYXJlYSwgd2hpY2ggd291bGQgY2F1c2UgZm9yIG5vdGFibGUgaW5hY2N1cmFjeS4gQWZ0ZXIgc29tZSBjb25zaWRlcmF0aW9uLCBJIGJlbGlldmUgaXQgd291bGQgYmUgaW4gdGhlIGJlc3QgaW50ZXJlc3Qgb2YgdGhpcyBleHBlcmltZW50IHRvIGNyZWF0ZSBhIG5ldyBkYXRhIGZyYW1lLCBvbmUgd2hpY2ggb25seSBpbmNsdWRlcyB0aGUgb2JzZXJ2YXRpb25zIHdoZXJlIHRoZXJlIHdhcyBpbiBmYWN0IGEgZm9yZXN0IGZpcmUgd2hpY2ggY2F1c2VkIGRhbWFnZS4gDQoNCkxldCdzIGNyZWF0ZSBhIG5ldyBkYXRhIHNldCBjYWxsZWQgImZvcmVzdGZpcmVzMSIgdGhhdCBpbmNsdWRlcyBvbmx5IHRoZSBvYnNlcnZhdGlvbnMgd2hlcmUgdGhlIGFyZWEgYWZmZWN0ZWQgaXMgZ3JlYXRlciB0aGFuIDAuDQoNCmBgYHtyfQ0KIyBDcmVhdGUgYSBuZXcgZGF0YSBzZXQgY2FsbGVkICJmb3Jlc3RmaXJlczEiIHdoaWNoIGluY2x1ZGVzIG9ubHkgdGhlIG9ic2VydmF0aW9ucyB3aGVyZSB0aGUgYXJlYSBhZmZlY3RlZCBpcyBncmVhdGVyIHRoYW4gMC4NCmhlYWQoZmlsdGVyKGZvcmVzdGZpcmVzLCBhcmVhID4gMCkpDQpmb3Jlc3RmaXJlczEgPC0gZmlsdGVyKGZvcmVzdGZpcmVzLCBhcmVhID4gMCkNCnN0cihmb3Jlc3RmaXJlczEpDQpgYGANCg0KTGV0J3MgY3JlYXRlIGFub3RoZXIgbWFwIGZvciBvdXIgcmVmaW5lZCBkYXRhIHNldCB0byBlbnN1cmUgZXZlcnl0aGluZyBzdGlsbCBsb29rcyBhbHJpZ2h0Lg0KDQpgYGB7cn0NClggPC0gZm9yZXN0ZmlyZXMxJFgNClkgPC0gZm9yZXN0ZmlyZXMxJFkNCnBsb3QoWCwgWSwgbWFpbiA9ICJGb3Jlc3QgRmlyZSBPY2N1cmVuY2VzIGJ5IFNwYXRpYWwgQ29vcmRpbmF0ZXMgXG4gb2YgTW9kaWZpZWQgRGF0YSIpDQphYmxpbmUodj01LCBoPTUsIGNvbD0icmVkIiwgbHR5PTIpDQpgYGANCg0KVGhlIG1hcCBhcHBlYXJzIHZlcnkgc2ltaWxhciB0byB0aGUgb25lIGNyZWF0ZWQgZm9yIHRoZSBmb3Jlc3RmaXJlcyBkYXRhIHNldCwgd2l0aCB0aGUgcG9pbnRzIHNwcmVhZCBvdXQgYWNyb3NzIHRoZSBjb29yZGluYXRlcywgc28gdGhpcyBpcyBnb29kLiBPbmNlIGFnYWluLCBpdCBhcHBlYXJzIHRoYXQgbW9yZSBmb3Jlc3QgZmlyZXMgd2VyZSBvYnNlcnZlZCBpbiB0aGUgbG93ZXIgaGFsZiBvZiB0aGUgWS1jb29yZGluYXRlcywgYXJvdW5kIGNvb3JkaW5hdGVzIDItNSwgYnV0IGFwYXJ0IGZyb20gdGhpcywgdGhlIHBvaW50cyBhcmUgc3ByZWFkIG91dCBhY3Jvc3MgdGhlIGNvb3JkaW5hdGUgc3lzdGVtLg0KDQpIYXZpbmcgYSByZWZpbmVkIGRhdGEgc2V0IHdoaWNoIGZvY3VzZXMgb24gdGhlIG9ic2VydmF0aW9ucyBpbiB3aGljaCBmb3Jlc3QgZmlyZXMgZGlkIGFmZmVjdCBhbmQgY2F1c2UgZGFtYWdlIHRvIGFuIGFyZWEgb2YgdGhlIGZvcmVzdCB3aWxsIHByb3ZpZGUgYmV0dGVyIGluc2lnaHQgYW5kIHBvd2VyIGZvciBvdXIgcHVycG9zZSBvZiB0aGlzIGV4cGVyaW1lbnQsIHdoaWNoIGlzIHRvIHNlZSB3aGljaCBmYWN0b3JzIGhhdmUgc2lnbmlmaWNhbmNlIGluIHRoZSBhbW91bnQgb2YgYXJlYSBkYW1hZ2VkIGJ5IGZvcmVzdCBmaXJlcy4gQnkgZm9jdXNpbmcgb25seSBvbiB0aGUgb2JzZXJ2YXRpb25zIHdoaWNoIHdlcmUgYWZmZWN0ZWQgYnkgZm9yZXN0IGZpcmVzLCB0aGlzIHdpbGwgYmUgbW9yZSB1c2VmdWwgZm9yIG91ciBnb2FsIGFuZCBhbGxvd2luZyB1cyB0byBjcmVhdGUgYSBtb2RlbCBmb3IgcHJlZGljdGlvbiBhbmQgZXN0aW1hdGlvbiB3aXRob3V0IHRoZSBpbmNsdXNpb24gb2YgcmVkdW5kYW50IG9ic2VydmF0aW9ucyB3aGljaCBkbyBub3QgaGVscCBvdXIgbW9kZWwuDQoNCkxldCdzIGNoZWNrIGZvciBhbnkgaW1iYWxhbmNlcyBpbiB0aGUgY2F0ZWdvcmljYWwgdmFyaWFibGUgb2YgIm1vbnRoIi4NCg0KYGBge3J9DQp0YWJsZShmb3Jlc3RmaXJlczEkbW9udGgpDQpgYGANCg0KSXQgdHVybnMgb3V0IHRoYXQgdGhlcmUgaXMgYSB2ZXJ5IHNpZ25pZmljYW50IGltYmFsYW5jZSBpbiB0aGUgdmFyaWFibGUgbW9udGguIFRoZSBudW1iZXIgb2Ygb2JzZXJ2YXRpb25zIGluIEF1Z3VzdCBhbmQgU2VwdGVtYmVyLCA5OSBhbmQgOTcgcmVzcGVjdGl2ZWx5IGRyYXN0aWNhbGx5IG91dHdlaWdoIGFsbCBvZiB0aGUgb3RoZXIgbW9udGhzLCB3aXRoIG5vIG90aGVyIG1vbnRoIGhhdmluZyBncmVhdGVyIHRoYW4gMTkgb2JzZXJ2YXRpb25zLiBUaGlzIGlzIGEgbWFqb3IgY2F1c2UgZm9yIGNvbmNlcm4gYXMgdGhpcyBjYXRlZ29yaWNhbCB2YXJpYWJsZSBpcyB2ZXJ5IHNldmVyZWx5IGltYmFsYW5jZWQuDQoNCldlIHdpbGwga2VlcCB0aGUgbW9udGggdmFyaWFibGUgZm9yIG5vdywgYXMgaXQgc2VlbXMgbGlrZSB3aGF0IG1vbnRoIGl0IGlzIGRvZXMgaGF2ZSBzaWduaWZpY2FuY2UgaW4gcHJlZGljdGluZyBhcmVhIGFmZmVjdGVkIGJ5IGZvcmVzdCBmaXJlcywgYnV0IHdlIHdpbGwga2VlcCBhIGNsb3NlIGV5ZSBvbiBpdCBmb3IgdGhlIGZpbmFsIG1vZGVsIHRvIGRldGVybWluZSBpZiBpdCBzaG91bGQgYmUgcmVtb3ZlZCBkdWUgdG8gaXRzIGltYmFsYW5jZS4gV2Ugd2lsbCBhZGRyZXNzIHRoaXMgdmFyaWFibGUgbGF0ZXIgb24gdG8gc2VlIGlmIGl0cyByZW1vdmFsIHdpbGwgaGVscCBpbXByb3ZlIG91ciBtb2RlbC4gVGhpcyBtb250aCB2YXJpYWJsZSBpcyBvbmUgd2Ugd2lsbCBrZWVwIGEgY2xvc2Ugd2F0Y2ggb24gZHVlIHRvIHRoaXMgY29uY2VybiBvZiBpbWJhbGFuY2UuIA0KDQoNCkxldCdzIGNoZWNrIHRoZSBvdGhlciBjYXRlZ29yaWNhbCB2YXJpYWJsZSAiZGF5IiBmb3IgcG90ZW50aWFsIGltYmFsYW5jZXMuIA0KDQpgYGB7cn0NCnRhYmxlKGZvcmVzdGZpcmVzMSRkYXkpDQpgYGANCg0KVGhlICJkYXkiIHZhcmlhYmxlIGRvZXMgbm90IHNob3cgbWFqb3IgaW1iYWxhbmNlLCBhcyBhbGwgdGhlIGRheXMgaGF2ZSBhIHNpZ25pZmljYW50IG51bWJlciBvZiBvYnNlcnZhdGlvbnMgd2l0aCB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBoaWdoZXN0IGFuZCBsb3dlc3QgZGF5cyBiZWluZyBhIHRvdGFsIG9mIDE1IG9ic2VydmF0aW9ucywgU3VuZGF5IHdpdGggNDcgYW5kIFdlZG5lc2RheSB3aXRoIDMyLiBIb3dldmVyLCB0aGUgZGF5IG9mIHRoZSB3ZWVrIGRvZXMgbm90IHNlZW0gbGlrZSBpdCB3b3VsZCBoYXZlIGFzIG1ham9yIHNpZ25pZmljYW5jZSBpbiBwcmVkaWN0aW5nIGZvcmVzdCBmaXJlIGRhbWFnZSB0aGVuIHNvbWUgb2YgdGhlIG90aGVyIGZhY3RvcnMgaW4gcXVlc3Rpb24uIFRoaXMgY2FuIGJlIHNlZW4gYXMgYnkgaG93IHRoZSBkYXlzIG9mIHRoZSB3ZWVrIGFyZSBub3QgdmVyeSBpbWJhbGFuY2VkIGluIHJlZ2FyZHMgdG8gdGhlaXIgdG90YWwgb2JzZXJ2YXRpb25zLiBUaGlzIGlzIHVubGlrZSB0aGUgbW9udGggdmFyaWFibGUgd2hlcmUgaXQgd2FzIHNob3duIHRoYXQgdGhlIHZhc3QgbWFqb3JpdHkgb2YgdGhlIG9ic2VydmF0aW9ucyBmYWxsIGludG8gZWl0aGVyIEF1Z3VzdCBvciBTZXB0ZW1iZXIsIGV2aWRlbmNpbmcgdGhhdCB0aGUgbWFqb3JpdHkgb2YgZm9yZXN0IGZpcmVzIG9jY3VyIHdpdGhpbiB0aGVzZSB3YXJtZXIsIGVuZCBvZiBzdW1tZXIgbW9udGhzLiANCg0KVG8gYXZvaWQgaGF2aW5nIHRvbyBtYW55IG9yIHRvbyByZWR1bmRhbnQgdmFyaWFibGVzIHdpdGhpbiBvdXIgZnVsbCBtb2RlbCwgdGhlIGNhdGVnb3JpY2FsIHZhcmlhYmxlIGZvciAiZGF5IiB3aWxsIG5vdCBiZSBpbmNsdWRlZC4gDQoNCmBgYHtyfQ0KZmluYWwuZGF0YSA9IGZvcmVzdGZpcmVzMVssIC1jKDQpXSAgICAgICAgDQprYWJsZShoZWFkKGZpbmFsLmRhdGEpKQ0KYGBgDQoNCg0KDQoNCiMgTW9kZWwgQnVpbGRpbmcNCg0KRm9yIHRoaXMgcHJvamVjdCwgd2Ugd2FudCB0byBjcmVhdGUgYSBtdWx0aXBsZSBsaW5lYXIgcmVncmVzc2lvbiBtb2RlbCB0aGF0IGFsbG93cyB1cyB0byB1c2UgdGhlIHNldmVyYWwgZmFjdG9ycyBpbiBvcmRlciB0byBjcmVhdGUgYSBtb2RlbCBmb3IgdGhlIHByZWRpY3Rpb24gYW5kIGVzdGltYXRpb24gb2YgdGhlIGFyZWEgYWZmZWN0ZWQgYnkgZm9yZXN0IGZpcmVzLiANCg0KDQojIyBGdWxsIE1vZGVsIA0KDQpXZSB3aWxsIGJlZ2luIHdpdGggYSBmdWxsIG11bHRpcGxlIGxpbmVhciByZWdyZXNzaW9uIG1vZGVsLiBXZSB3aWxsIG9ic2VydmUgaG93IHRoaXMgZnVsbCBtb2RlbCB0dXJucyBvdXQgdG8gaGVscCBkZWNpZGUgd2hldGhlciB3ZSBuZWVkIHRvIGFwcGx5IGFueSB0cmFuc2Zvcm1hdGlvbnMgdG8gYW55IG9mIHRoZSB2YXJpYWJsZXMuIA0KDQpgYGB7ciBmaWcuYWxpZ249J2NlbnRlcid9DQpmdWxsLm1vZGVsID0gbG0oYXJlYSB+IC4sIGRhdGEgPSBmaW5hbC5kYXRhKQ0Ka2FibGUoc3VtbWFyeShmdWxsLm1vZGVsKSRjb2VmLCBjYXB0aW9uID0iU3RhdGlzdGljcyBvZiBSZWdyZXNzaW9uIENvZWZmaWNpZW50cyIpDQpgYGANCg0KDQojIyBDaGVjayBmb3IgVmlvbGF0aW9ucyANCg0KTm93LCB3ZSB3aWxsIGNoZWNrIHRoZSByZXNpZHVhbCBwbG90cyB0byBsb29rIGZvciBwb3RlbnRpYWwgdmlvbGF0aW9ucyBvZiBvdXIgZnVsbCBtb2RlbC4gDQoNCmBgYHtyfQ0KcGFyKG1mcm93PWMoMiwyKSkNCnBsb3QoZnVsbC5tb2RlbCkNCmBgYA0KDQpJdCBhcHBlYXJzIHRoYXQgd2UgZG8gaGF2ZSBzb21lIHZpb2xhdGlvbnMgd2l0aGluIG91ciBtb2RlbC4gRm9yIGluc3RhbmNlLCB2YXJpYW5jZSBpcyBub3QgY29uc3RhbnQgYXMgc2hvd24gYnkgaG93IHRoZXJlIGFyZSBhIGZldyB2ZXJ5IG5vdGFibGUgb3V0bGllcnMgdG8gdGhlIHJpZ2h0IG9mIHRoZSByZXNpZHVhbCBwbG90LiBBZGRpdGlvbmFsbHksIHRoZSBRLVEgUGxvdCBzaG93cyBzb21lIHZpb2xhdGlvbnMgYXMgd2VsbCBhcyB0aGUgcmlnaHQgc2lkZSBvZiB0aGUgZGF0YSBhcHBlYXJzIHRvIGhhdmUgc29tZSBzb3J0IG9mIGN1cnZhdHVyZSB3aXRoIHRoZXNlIHBvaW50cyBub3QgZm9sbG93aW5nIGEgbm9ybWFsIGRpc3RyaWJ1dGlvbi4gRnVydGhlcm1vcmUsIHRoZSBDb29rZSdzIERpc3RhbmNlIHBsb3Qgc2hvd3MgdGhhdCB3ZSBpbmRlZWQgZG8gaGF2ZSBzb21lIGhpZ2ggbGV2ZXJhZ2UgcG9pbnRzIGluIG91ciBtb2RlbC4gDQoNCkxldCdzIGNoZWNrIHRoZSBWSUYgZm9yIGFueSBwb3RlbnRpYWwgbXVsdGljb2xsaW5lYXJpdHkgaXNzdWVzIGluIG91ciBtb2RlbC4gDQpgYGB7cn0NCnZpZihmdWxsLm1vZGVsKQ0KYmFycGxvdCh2aWYoZnVsbC5tb2RlbCksIG1haW4gPSAiVklGIFZhbHVlcyIsIGhvcml6ID0gRkFMU0UsIGNvbCA9ICJzdGVlbGJsdWUiKQ0KYGBgDQoNCkl0IGFwcGVhcnMgdGhhdCB3ZSBkbyBoYXZlIGEgZmV3IGhpZ2ggVklGIHZhbHVlcyBwcmVzZW50IGluIG91ciBtb2RlbCB3aGljaCBsZWFkcyB0byB0aGUgbGlrZWxpaG9vZCBvZiBhIG11bHRpY29sbGluZWFyaXR5IGlzc3VlLg0KDQpMZXQncyB1c2UgYSBjb3JyZWxhdGlvbiBtYXRyaXggdG8gY2hlY2sgd2hpY2ggdmFyaWFibGVzIGFyZSBjYXVzaW5nIGlzc3Vlcy4gV2UgY2FuIG9ubHkgY2hlY2sgdGhlIGNvcnJlbGF0aW9uIG9mIG51bWVyaWMgdmFyaWFibGVzIHNvIHdlIHdpbGwgY3JlYXRlIGEgdGVtcG9yYXJ5IGRhdGEgc2V0ICJjb3IuZGF0YSIgd2hpY2ggZG9lcyBub3QgaW5jbHVkZSB0aGUgY2F0ZWdvcmljYWwgdmFyaWFibGUgb2YgbW9udGguDQoNCmBgYHtyfQ0KY29yLmRhdGEgPC0gZmluYWwuZGF0YVssIC1jKDMpXQ0KcmVzIDwtIGNvcihjb3IuZGF0YSkNCnJvdW5kKHJlcywgMikNCmBgYA0KDQpJdCBhcHBlYXJzIHRoYXQgRkZNQyBhbmQgSVNJIGFyZSBoaWdobHkgY29ycmVsYXRlZCB3aXRoIGEgY29ycmVsYXRpb24gb2YgMC43MC4gV2Ugd2lsbCByZW1vdmUgb25lIG9mIHRoZXNlIHZhcmlhYmxlcyB0byBoZWxwIGF2b2lkIHRoaXMgbXVsdGljb2xsaW5lYXJpdHkgaXNzdWUuIFdlIHdpbGwga2VlcCBGRk1DLCBhcyBpdCBpcyB0aGUgZmlyc3QgdmFyaWFibGVzIGFscGhhYmV0aWNhbGx5IG9mIHRoZXNlIHR3by4gQWRkaXRpb25hbGx5LCBpdCBhcHBlYXJzIHRoYXQgRE1DIGFuZCBEQyBhcmUgc2lnbmlmaWNhbnRseSBjb3JyZWxhdGVkLCB3aXRoIGEgY29ycmVsYXRpb24gb2YgMC42Ny4gV2Ugd2lsbCBrZWVwIERDIGFzIGl0IGlzIHRoZSBmaXJzdCB2YXJpYWJsZSBhbHBoYWJldGljYWxseSBvZiB0aGVzZSB0d28uDQoNCg0KTm93LCBsZXQncyByZXZpc2Ugb3VyIGZpbmFsLmRhdGEgbW9kZWwgd2l0aCB0aGUgdmFyaWFibGVzIGFkanVzdGVkIHRvIGFkZHJlc3MgdGhlIG11bHRpY29sbGluZWFyaXR5IGlzc3VlIHRoYXQgd2UgZW5jb3VudGVyZWQuDQoNCmBgYHtyfQ0KZmluYWwuZGF0YSA9IGZvcmVzdGZpcmVzMVssIC1jKDQsNiw4KV0gICAgICAgIA0Ka2FibGUoaGVhZChmaW5hbC5kYXRhKSkNCmBgYA0KDQpUaGUgYWRqdXN0ZWQgZmluYWwgbW9kZWwgaXMgZ2l2ZW4gYXMgZm9sbG93cy4NCg0KYGBge3IgZmlnLmFsaWduPSdjZW50ZXInfQ0KZnVsbC5tb2RlbCA9IGxtKGFyZWEgfiAuLCBkYXRhID0gZmluYWwuZGF0YSkNCmthYmxlKHN1bW1hcnkoZnVsbC5tb2RlbCkkY29lZiwgY2FwdGlvbiA9IlN0YXRpc3RpY3Mgb2YgUmVncmVzc2lvbiBDb2VmZmljaWVudHMiKQ0KYGBgDQoNCkl0IGlzIGltcG9ydGFudCB0byBub3RlIHRoYXQgb3VyIGZ1bGwgbXVsdGlwbGUgbGluZWFyIHJlZ3Jlc3Npb24gbW9kZWwgaGFzIGEgcC12YWx1ZSBvZiBwID0gMC42ODE2LCB3aGljaCBpcyBncmVhdGVyIHRoYW4gb3VyIGFscGhhIHZhbHVlIG9mIDAuMDUuIFRoaXMgaW5kaWNhdGVzIHRoYXQgdGhpcyBmdWxsIG1vZGVsIHdpbGwgbGlrZWx5IG5vdCBiZSBvdXIgYmVzdCBjaG9pY2UgZm9yIHByZWRpY3Rpb24gYW5kIGVzdGltYXRpb24gYXMgdGhpcyBtb2RlbCB3YXMgbm90IHN0YXRpc3RpY2FsbHkgc2lnbmlmaWNhbnQgaW4gcHJlZGljdGluZyB0aGUgYXJlYSBidXJuZWQgYnkgYSBmb3Jlc3QgZmlyZS4gDQoNCg0KIyMgQm94IENveCBNb2RlbHMNCg0KRHVlIHRvIHRoZSB2aW9sYXRpb25zIGluIHRoZSByZXNpZHVhbCBwbG90cyBvZiB0aGUgbW9kZWwsIHdlIHdpbGwgdXNlIHRoZSBCb3ggQ294IHRyYW5zZm9ybWF0aW9ucyB0byBhZGp1c3Qgb3VyIGRhdGEuDQoNCg0KIyMjIEJveCBDb3ggVHJhbnNmb3JtYXRpb25zDQoNCldlIHdpbGwgdHJ5IG91dCBzZXZlcmFsIHRyYW5zZm9ybWF0aW9ucyBpbiBvcmRlciB0byBjaG9vc2UgdGhlIGJlc3Qgb25lIGZvciBvdXIgbW9kZWwuDQoNClRoZSB0cmFuc2Zvcm1hdGlvbnMgd2hpY2ggSSB0cmllZCB1c2VkIHNwZWNpZmljIHZhcmlhYmxlcy4gVGhlIEJveCBDb3ggdHJhbnNmb3JtYXRpb25zIEkgcGVyZm9ybWVkIGFyZSBsaXN0ZWQgYXMgZm9sbG93czoNCg0KKiBCb3ggQ294LSBMb2dhcml0aG1pYyB0cmFuc2Zvcm1hdGlvbiBvZiB3aW5kLg0KDQoqIEJveCBDb3gtIHdpbmQuDQoNCiogQm94IENveC0gTG9nYXJpdGhtaWMgdHJhbnNmb3JtYXRpb24gb2YgdGVtcGVyYXR1cmUgKHRlbXApLg0KDQoqIEJveCBDb3gtIExvZ2FyaXRobWljIHRyYW5zZm9ybWF0aW9ucyBvZiB3aW5kIGFuZCB0ZW1wZXJhdHVyZSAodGVtcCkuDQoNCmBgYHtyIGZpZy5hbGlnbj0nY2VudGVyJywgZmlnLndpZHRoPTcsIGZpZy5oZWlnaHQ9Nn0NCnBhcihwdHkgPSAicyIsIG1mcm93ID0gYygyLCAyKSwgb21hPWMoLjEsLjEsLjEsLjEpLCBtYXI9Yyg0LCAwLCAyLCAwKSkNCg0KIyMgQm94IENveC0gTG9nYXJpdGhtaWMgdHJhbnNmb3JtYXRpb24gb2Ygd2luZCB2YXJpYWJsZS4NCmJveGNveChhcmVhIH4gWCArIFkgKyBmYWN0b3IobW9udGgpICsgRkZNQyArIERDICsgdGVtcCArIFJIICsgbG9nKHdpbmQpICsgcmFpbiAsIGRhdGEgPSBmaW5hbC5kYXRhLCBsYW1iZGEgPSBzZXEoLTAuNCwgMC40LCBsZW5ndGggPSAxMCksIA0KICAgICAgIHhsYWI9ZXhwcmVzc2lvbihwYXN0ZShsYW1iZGEsICI6IGxvZyB3aW5kIikpKQ0KDQojIyBCb3ggQ294LSB3aW5kLg0KYm94Y294KGFyZWEgfiBYICsgWSArIGZhY3Rvcihtb250aCkgKyBGRk1DICsgREMgKyB0ZW1wICsgIFJIICArIHdpbmQgKyByYWluDQogICAgICAgLCBkYXRhID0gZmluYWwuZGF0YSwgbGFtYmRhID0gc2VxKC0wLjQsIDAuNCwgbGVuZ3RoID0gMTApLCANCiAgICAgICB4bGFiPWV4cHJlc3Npb24ocGFzdGUobGFtYmRhLCAiOiB3aW5kIikpKQ0KDQojI0JveCBDb3gtIExvZ2FyaXRobWljIHRyYW5zZm9ybWF0aW9uIG9mIHRlbXBlcmF0dXJlICh0ZW1wKSB2YXJpYWJsZS4NCmJveGNveChhcmVhIH4gWCArIFkgKyBmYWN0b3IobW9udGgpICsgRkZNQyArIERDICsgbG9nKHRlbXApICsgUkggKyB3aW5kICsgcmFpbiwgZGF0YSA9IGZpbmFsLmRhdGEsIGxhbWJkYSA9IHNlcSgtMC40LCAwLjQsIGxlbmd0aCA9IDEwKSwgDQogICAgICAgeGxhYj1leHByZXNzaW9uKHBhc3RlKGxhbWJkYSwgIjogbG9nLXRlbXAiKSkpDQoNCiMjIEJveCBDb3gtIExvZ2FyaXRobWljIHRyYW5zZm9ybWF0aW9ucyBvZiB3aW5kIGFuZCB0ZW1wZXJhdHVyZSAodGVtcCkuDQpib3hjb3goYXJlYSB+IFggKyBZICsgZmFjdG9yKG1vbnRoKSArIEZGTUMgKyBEQyArIGxvZyh0ZW1wKSArIFJIICsgbG9nKHdpbmQpICsgcmFpbiwgZGF0YSA9IGZpbmFsLmRhdGEsIGxhbWJkYSA9IHNlcSgtMC40LCAwLjQsIGxlbmd0aCA9IDEwKSwgDQogICAgICB4bGFiPWV4cHJlc3Npb24ocGFzdGUobGFtYmRhLCAiOiBsb2ctd2luZCwgbG9nLXRlbXAiKSkpDQpgYGANCg0KV2UgY2FuIHNlZSB0aGUgcGxvdHMgZm9yIHRoZSBCb3ggQ294IHRyYW5zZm9ybWF0aW9ucyB0aGF0IHdlcmUgcGVyZm9ybWVkIGFuZCB0aGVzZSB0cmFuc2Zvcm1hdGlvbiBwbG90cyBpbmRpY2F0ZSB0aGUgb3B0aW1hbCB2YWx1ZSBvZiBsYW1iYSBmb3IgdGhlIGRpZmZlcmVudCB0cmFuc2Zvcm1lZCBwcmVkaWN0b3IgdmFyaWFibGVzLiBTcGVjaWZpY2FsbHksIGZvciB0aGlzIHRyYW5zZm9ybWF0aW9uIHdlIGxvb2tlZCBhdCB0cmFuc2Zvcm1hdGlvbnMgb2YgdGhlIHByZWRpY3RvciB2YXJpYWJsZXMgd2luZCBhbmQgdGVtcCwgYXMgdGhlc2UgdHdvIHF1YW50aWF0aXZlIHZhcmlhYmxlcyBjYW4gaGVscCB1cyBzZWUgaWYgd2UgY2FuIGltcHJvdmUgb3VyIG1vZGVsIGZvciBwcmVkaWN0aW5nIHRoZSBhcmVhIGJhc2VkIHVwb24gdGhlIHByZWRpY3RvcnMgd2UgaGF2ZS4NCg0KDQoNCiMjIyBTcXVhcmUtUm9vdCBUcmFuc2Zvcm1hdGlvbg0KDQpXZSB3aWxsIGNyZWF0ZSBhIHNxdWFyZS1yb290IHRyYW5zZm9ybWF0aW9uIG9mIG91ciBtb2RlbCB3aXRoIHRoZSBsb2cgdHJhbnNmb3JtZWQgdGVtcCB2YXJpYWJsZS4gDQoNClRvIGhlbHAgaW1wcm92ZSB0aGUgc2lnbmlmaWNhbmNlIG9mIHRoZSBtb2RlbCwgSSBkZWNpZGVkIHRvIGZvY3VzIGluIHRoZSB2YXJpYWJsZXMgd2hpY2ggcHJvdmlkZWQgdGhlIG1vc3Qgc3RhdGlzdGljYWwgc2lnbmlmaWNhbmNlIHRvIG91ciBtb2RlbC4gVmFyaWFibGVzIHN1Y2ggYXMgRkZNQyBhbmQgbW9udGggZ3JlYXRseSBpbmNyZWFzZWQgdGhlIHAtdmFsdWUgb2YgdGhlIG1vZGVsLCBzbyBJIGRlY2lkZWQgdG8gaW1wcm92ZSB0aGUgc3RhdGlzdGljYWwgc2lnbmlmaWNhbmNlIG9mIHRoZSBtdWx0aXBsZSByZWdyZXNzaW9uIG1vZGVsIGJ5IHJlbW92aW5nIHRoZXNlIHZhcmlhYmxlcyBmcm9tIHRoaXMgc3F1YXJlIHJvb3QgdHJhbnNmb3JtYXRpb24uIEhvd2V2ZXIsIHdoaWxlIGRvaW5nIHNvIGRpZCBkZWNyZWFzZSB0aGUgcC12YWx1ZSwgaXQgc3RpbGwgZGlkIG5vdCBsb3dlciBpdCBlbm91Z2ggdG8gYWNoaWV2ZSBhIGxldmVsIG9mIHN0YXRpc3RpY2FsIHNpZ25pZmljYW5jZSBmb3IgdGhpcyBzcXVhcmUgcm9vdCB0cmFuc2Zvcm1hdGlvbiBtb2RlbC4gDQoNCmBgYHtyfQ0Kc3FydC5hcmVhLmxvZy50ZW1wPSBsbSgoYXJlYSleMC41IH4gWCArIFkgKyBEQyArIGxvZyh0ZW1wKSArIFJIICsgd2luZCArIHJhaW4sIGRhdGEgPSBmaW5hbC5kYXRhKQ0Ka2FibGUoc3VtbWFyeShzcXJ0LmFyZWEubG9nLnRlbXApJGNvZWYsIGNhcHRpb24gPSAiU3F1YXJlIFJvb3QgTG9nLVRyYW5zZm9ybWVkIE1vZGVsIikNCmBgYA0KDQpUaGUgcC12YWx1ZSBvZiB0aGlzIG1vZGVsIGlzIHAgPSAwLjI1MTQsIHdoaWNoIGlzIGdyZWF0ZXIgdGhhbiBvdXIgYWxwaGEgdmFsdWUgb2YgMC4wNS4gVGhpcyBpbmRpY2F0ZXMgdGhhdCB0aGlzIHNxdWFyZSByb290IHRyYW5zZm9ybWF0aW9uIG1heSBub3QgYmUgb3VyIGJlc3Qgb3B0aW9uIGFzIGl0IGlzIG5vdCBzdGF0aXN0aWNhbGx5IHNpZ25pZmljYW50IGZvciBwcmVkaWN0aW9uIGFuZCBlc3RpbWF0aW9uIG9mIHRoZSBhcmVhIGJ1cm5lZCBieSBhIGZvcmVzdCBmaXJlLiANCg0KTGV0J3MgdGFrZSBhIGxvb2sgYXQgdGhlIHJlc2lkdWFsIHBsb3RzIGZvciB0aGlzIHRyYW5zZm9ybWF0aW9uLg0KDQpgYGB7cn0NCnBhcihtZnJvdyA9IGMoMiwyKSkNCnBsb3Qoc3FydC5hcmVhLmxvZy50ZW1wKQ0KYGBgDQoNClRoZSByZXNpZHVhbCBwbG90IGFwcGVhcnMgdG8gYmUgbW9zdGx5IHJhbmRvbSBleGNlcHQgZm9yIGEgZmV3IG91dGxpZXJzIHdoaWNoIGFwcGVhciBsaWtlIHRoZXkgYXJlIHNpZ25pZmljYW50LiBKdXN0IGxpa2UgaW4gdGhlIGxpbmVhciBtb2RlbCwgdGhlIFEtUSBQbG90IGFwcGVhcnMgdG8gc2hvdyBhIHZpb2xhdGlvbiBpbiB0aGF0IHRoZSByaWdodCBoYW5kIHNpZGUgb2YgdGhlIHBsb3Qgc2hvd3MgdGhlIHBvaW50cyBkaXZlcmdpbmcgZnJvbSBhIG5vcm1hbCBkaXN0cmlidXRpb24uIFRoaXMgaXMgZXZpZGVuY2Ugb2YgYSB2aW9sYXRpb24gb2YgdGhpcyB0cmFuc2Zvcm1lZCBtb2RlbC4gRnVydGhlcm1vcmUsIHRoZSBDb29rZSdzIERpc3RhbmNlIHBsb3Qgc2hvd3MgdGhhdCB0aGVyZSBpcyBhIHZlcnkgaGlnaCBsZXZlcmFnZSBwb2ludCBpbiB0aGUgbW9kZWwgYWxvbmcgd2l0aCBzZXZlcmFsIG90aGVyIG91dGxpZXJzLCBpbmRpY2F0aW5nIGZ1cnRoZXIgdmlvbGF0aW9ucyBzdGlsbCBwcmVzZW50IHdpdGhpbiB0aGlzIHNxdWFyZS1yb290IHRyYW5zZm9ybWVkIG1vZGVsLg0KDQoNCg0KIyMjIExvZ2FyaXRobWljIFRyYW5zZm9ybWF0aW9uDQoNCldlIHdpbGwgY3JlYXRlIGEgbG9nYXJpdGhtaWMgbXVsdGlwbGUgcmVncmVzc2lvbiBtb2RlbCB1c2luZyB0aGUgbG9nIHRyYW5zZm9ybWF0aW9uIG9mIHRoZSByZXNwb25zZSB2YXJpYWJsZSBhcmVhLiANCg0KVG8gaGVscCBpbXByb3ZlIHRoZSBzaWduaWZpY2FuY2Ugb2YgdGhlIG1vZGVsLCBJIGRlY2lkZWQgdG8gZm9jdXMgaW4gdGhlIHZhcmlhYmxlcyB3aGljaCBwcm92aWRlZCB0aGUgbW9zdCBzdGF0aXN0aWNhbCBzaWduaWZpY2FuY2UgdG8gb3VyIG1vZGVsLiBWYXJpYWJsZXMgc3VjaCBhcyBGRk1DIGFuZCBtb250aCBncmVhdGx5IGluY3JlYXNlZCB0aGUgcC12YWx1ZSBvZiB0aGUgbW9kZWwsIHNvIEkgZGVjaWRlZCB0byBpbXByb3ZlIHRoZSBzdGF0aXN0aWNhbCBzaWduaWZpY2FuY2Ugb2YgdGhlIG11bHRpcGxlIHJlZ3Jlc3Npb24gbW9kZWwgYnkgcmVtb3ZpbmcgdGhlc2UgdmFyaWFibGVzIGZyb20gdGhpcyBsb2dhcml0aG1pYyB0cmFuc2Zvcm1hdGlvbi4gRG9pbmcgc28gZ3JlYXRseSBpbXByb3ZlZCB0aGUgcC12YWx1ZSwgd2l0aCB0aGUgbXVjaCBsb3dlciBwLXZhbHVlIGluZGljYXRpbmcgdGhhdCB0aGlzIG1vZGVsIG5vdyBkb2VzIGhhdmUgc3RhdGlzdGljYWwgc2lnbmlmaWNhbmNlIGZvciBwcmVkaWN0aW9uIGFuZCBlc3RpbWF0aW9uIG9mIGFyZWEuIA0KDQpgYGB7cn0NCmxvZy5hcmVhID0gbG0obG9nKGFyZWEpIH4gWCArIFkgKyBEQyArIHRlbXAgKyBSSCArIHdpbmQgKyByYWluLCAgZGF0YSA9IGZpbmFsLmRhdGEpDQprYWJsZShzdW1tYXJ5KGxvZy5hcmVhKSRjb2VmLCBjYXB0aW9uID0gImxvZy10cmFuc2Zvcm1lZCBtb2RlbCIpDQpgYGANCg0KTGV0J3MgdGFrZSBhIGxvb2sgYXQgdGhlIHJlc2lkdWFsIHBsb3RzIGZvciB0aGlzIHRyYW5zZm9ybWF0aW9uLg0KDQpgYGB7cn0NCnBhcihtZnJvdyA9IGMoMiwyKSkNCnBsb3QobG9nLmFyZWEpDQpgYGANCg0KV2l0aCB0aGUgbG9nYXJpdGhtaWMgbW9kZWwsIHRoZSByZXNpZHVhbHMgYXBwZWFyIG11Y2ggYmV0dGVyIHRoYW4gdGhleSBkaWQgZm9yIHRoZSBsaW5lYXIgbW9kZWwuIFRoZSByZXNpZHVhbCBwbG90IGFwcGVhcnMgbXVjaCBtb3JlIHJhbmRvbS4gV2hpbGUgdGhlIFEtUSBQbG90IGRvZXMgYXBwZWFyIHRvIGdvIHNsaWdodGx5IG9mZiBvZiB0aGUgbGluZSBmb3IgYSBub3JtYWwgZGlzdHJpYnV0aW9uIG9uIHRoZSByaWdodCBoYW5kIHNpZGUsIGl0IGlzIG11Y2ggbGVzcyBzZXZlcmUgdGhhbiBob3cgaXQgd2FzIGluIHRoZSByZXNpZHVhbCBwbG90IG9mIHRoZSBsaW5lYXIgbW9kZWwuIEFkZGl0aW9uYWxseSwgd2Ugc3RpbGwgZG8gaGF2ZSBzb21lIGhpZ2ggbGV2ZXJhZ2UgcG9pbnRzIGFzIHNlZW4gaW4gdGhlIENvb2tlJ3MgRGlzdGFuY2UgcGxvdCB3aGljaCB3b3VsZCBkZWZpbmV0bHkgYmUgd29ydGggaW52ZXN0aWdhdGluZyBmdXJ0aGVyIGluIGFkZGl0aW9uYWwgZXhwZXJpbWVudHMgdG8gZGV0ZXJtaW5lIHdoeSB3ZSBoYXZlIHRoZXNlIGhpZ2ggbGV2ZXJhZ2UgcG9pbnRzIGFuZCBvdXRsaWVycy4gSG93ZXZlciwgb3ZlcmFsbCB0aGUgbG9nYXJpdGhtaWMgbW9kZWwgaGFzIGZld2VyIHZpb2xhdGlvbnMgYW5kIG11Y2ggbGVzcyBzZXZlcmUgcHJvYmxlbXMgdGhhbiB0aGUgbGluZWFyIG1vZGVsIGhhZCByZWdhcmRpbmcgaXRzIHJlc2lkdWFscy4gDQoNCk92ZXJhbGwsIHRoaXMgbG9nYXJpdGhtaWMgdHJhbnNmb3JtZWQgbW9kZWwgYXBwZWFycyB0byBoYXZlIHRoZSBmZXdlc3QgdmlvbGF0aW9ucyBhbmQgYWxzbyBpcyB0aGUgb25seSBvbmUgd2l0aCBhIHN0YXRpc3RpY2FsbHkgc2lnbmlmaWNhbnQgcC12YWx1ZSwgcCA9IDAuMDAxNC4gDQoNCg0KIyMjIENvbXBhcmlzb24gb2YgUS1RIFBsb3RzDQoNClNvbWV0aGluZyB3aGljaCB3YXMgbWFkZSBub3RlIG9mIHdoZW4gcGVyZm9ybWluZyB0aGUgdmFyaW91cyB0cmFuc2Zvcm1hdGlvbnMgd2FzIHRoYXQgdGhlcmUgYXBwZWFyZWQgdG8gYmUgc29tZSB2aW9sYXRpb25zIHdoZW4gY2hlY2tpbmcgb3VyIHJlc2lkdWFsIGNvbmRpdGlvbnMuIE9uZSBwYXJ0aWN1bGFyIHZpb2xhdGlvbiB3aGljaCBhcHBlYXJlZCB0byBiZSB2ZXJ5IHNldmVyZSBpbiBjZXJ0YWluIGNhc2VzIHdhcyB0aGUgZmFpbHVyZSBvZiB0aGUgUS1RIFBsb3QgdG8gaW5kaWNhdGUgdGhhdCB0aGUgZGF0YSBhcHBlYXJlZCB0byBmb2xsb3cgYSBub3JtYWwgZGlzdHJpYnV0aW9uLiBCb3RoIHRoZSBvcmlnaW5hbCBsaW5lYXIgbW9kZWwgYW5kIHRoZSBzcXVhcmUgcm9vdCB0cmFuc2Zvcm1hdGlvbiBtb2RlbCBlc3BlY2lhbGx5IGhhZCBzZXZlcmUgdmlvbGF0aW9ucyByZWdhcmRpbmcgdGhlaXIgUS1RIFBsb3RzLiBIb3dldmVyLCB0aGUgbG9nYXJpdGhtaWMgdHJhbnNmb3JtYXRpb24gbW9kZWwgYXBwZWFyZWQgdG8gaGF2ZSBhIFEtUSBQbG90IHdoaWNoIHdhcyBtdWNoIGNsb3NlciB0byBpbmRpY3RpbmcgYSBub3JtYWwgZGlzdHJpYnV0aW9uIHRoYW4gdGhlIG90aGVyIHR3by4gV2hpbGUgdGhlcmUgd2FzIHN0aWxsIHNvbWUgc2xpZ2h0IGRldmlhdGlvbiBvbiB0aGUgcmlnaHQgaGFuZCBzaWRlIG9mIHRoZSBRLVEgUGxvdCBmb3IgdGhlIGxvZ2FyaXRobWljIHRyYW5zZm9ybWF0aW9uLCBpdCB3YXMgd2F5IGxlc3MgdGhhbiBlaXRoZXIgb2YgdGhlIG90aGVyIHR3byBtb2RlbHMuIEFkZGl0aW9uYWxseSwgdGhlIGxvZ2FyaXRobWljIHRyYW5zZm9ybWF0aW9uIHdhcyB0aGUgb25seSBRLVEgUGxvdCB3aGljaCBkaWQgbm90IHNob3cgYmxhdGFudCBjdXJ2YXR1cmUgaW4gdGhlIHJpZ2h0IGhhbmQgc2lkZSBvZiBpdC4gDQoNCmBgYHtyfQ0KcGFyKHB0eSA9ICJzIiwgbWZyb3cgPSBjKDEsIDMpKQ0KI1EtUSBwbG90IGZvciBsaW5lYXIgZnVsbCBtb2RlbA0KcXFub3JtKGZ1bGwubW9kZWwkcmVzaWR1YWxzLCBtYWluID0gIkxpbmVhciBGdWxsIE1vZGVsIikNCnFxbGluZShmdWxsLm1vZGVsJHJlc2lkdWFscykNCg0KIyBRLVEgcGxvdCBmb3Igc3F1YXJlIHJvb3QgdHJhbnNmb3JtYXRpb24gbW9kZWwNCnFxbm9ybShzcXJ0LmFyZWEubG9nLnRlbXAkcmVzaWR1YWxzLCBtYWluID0gIlNxdWFyZS1Sb290IEFyZWEgTG9nIFRlbXAgXG4gTW9kZWwiKQ0KcXFsaW5lKHNxcnQuYXJlYS5sb2cudGVtcCRyZXNpZHVhbHMpDQoNCiNRLVEgcGxvdCBmb3IgbG9nYXJpdGhtaWMgdHJhbnNmb3JtYXRpb24gbW9kZWwgDQpxcW5vcm0obG9nLmFyZWEkcmVzaWR1YWxzLCBtYWluID0gIkxvZyBBcmVhIE1vZGVsIikNCnFxbGluZShsb2cuYXJlYSRyZXNpZHVhbHMpDQpgYGANCg0KQnkgY29tcGFyaW5nIHRoZSBRLVEgUGxvdHMgb2YgdGhlc2UgdGhyZWUgcG90ZW50aWFsIG1vZGVscywgd2UgY2FuIHNlZSB0aGF0IHRoZSBsb2dhcml0aG1pYyBtb2RlbCBoYXMgdGhlIGxpbmVhciBtb2RlbCBhbmQgdGhlIHNxdWFyZSByb290IHRyYW5zZm9ybWF0aW9uIG1vZGVsIGhhdmUgdmVyeSBzZXZlcmUgdmlvbGF0aW9ucyBvZiBub3JtYWxpdHkgaW4gdGhlaXIgUS1RIFBsb3QuIFdoaWxlIHRoZSBsb2dhcnRoaW1pYyB0cmFuc2Zvcm1hdGlvbiBtb2RlbCBzdGlsbCBkb2VzIGhhdmUgc29tZSBkZXZpYXRpb24gZnJvbSBub3JtYWxpdHksIGl0IGlzIGJ5IGZhciB0aGUgbGVhc3Qgc2V2ZXJlIHZpb2xhdGlvbiBvZiB0aGUgdGhyZWUuIFRoaXMgZ2l2ZXMgYSBzdHJvbmcgcG9pbnQgdG93YXJkcyB0aGUgbG9nYXJpdGhtaWMgdHJhbnNmb3JtYXRpb24gbW9kZWwgYmVpbmcgdGhlIGJlc3Qgb25lIHRvIHVzZSBmb3IgdGhlIHByZWRpY3Rpb24gYW5kIGVzdGltYXRpb24gb2YgYXJlYS4NCg0KDQojIyMgR29vZG5lc3Mgb2YgRml0IA0KDQpXZSB3aWxsIG5vdyBsb29rIGF0IG90aGVyIGdvb2RuZXNzIG9mIGZpdCBtZXRob2RzIGZvciB0aGUgZmluYWwgdGhyZWUgbW9kZWxzIG9mIGNvbnNpZGVyYXRpb24uIFRoZXNlIG1ldGhvZHMgZm9yIGdvb2RuZXNzIG9mIGZpdCB3aWxsIGluY2x1ZGUgdXNlZnVsIHRvb2xzIGZvciBzdGF0aXN0aWNhbCBhbmFseXNpcyBzdWNoIGFzIFItc3F1YXJlZCB2YWx1ZSwgQUlDLCBhbmQgTWFsbG93J3MgQ3AuIA0KDQpgYGB7cn0NCnNlbGVjdD1mdW5jdGlvbihtKXsgDQogZSA9IG0kcmVzaWQgICAgICAgICAgICAgICAgICAgICAgICAgIA0KIG4wID0gbGVuZ3RoKGUpICAgDQogIyMgU3VtIFNxdWFyZWQgb2YgRXJyb3JzDQogU1NFPShtJGRmKSooc3VtbWFyeShtKSRzaWdtYSleMiAgIA0KDQogIyMgTXVsdGlwbGUgUi1zcXVhcmVkIA0KIFIuc3E9c3VtbWFyeShtKSRyLnNxdWFyZWQgICAgDQogDQogIyMgQWRqdXN0ZWQgUi1zcXVhcmVkDQogUi5hZGo9c3VtbWFyeShtKSRhZGoucg0KIA0KICMjIE1lYW4gU3F1YXJlZCBFcnJvcnMNCiBNU0U9KHN1bW1hcnkobSkkc2lnbWEpXjIgICAgICAgICAgICAgDQogDQogIyMgTWFsbG93J3MgQ3ANCiBDcD0oU1NFL01TRSktKG4wLTIqKG4wLW0kZGYpKSANCiANCiAjIyBBSUMgDQogQUlDPW4wKmxvZyhTU0UpLW4wKmxvZyhuMCkrMioobjAtbSRkZikgIA0KIA0KICMjIFRhYmxlIG9mIHRoZSB2YWx1ZXMgDQogWD1tb2RlbC5tYXRyaXgobSkgICAgICAgICAgICAgICAgICAgICANCiBIPVglKiVzb2x2ZSh0KFgpJSolWCklKiV0KFgpICAgICAgICAgDQogdGJsID0gYXMuZGF0YS5mcmFtZShjYmluZChTU0U9U1NFLCBSLnNxPVIuc3EsIFIuYWRqID0gUi5hZGosIENwID0gQ3AsIEFJQyA9IEFJQykpDQogbmFtZXModGJsKT1jKCJTU0UiLCAiUi5zcSIsICJSLmFkaiIsICJDcCIsICJBSUMiKQ0KIHRibA0KfQ0KYGBgDQoNCldlIHdpbGwgY3JlYXRlIGFuIG91dHB1dCB0YWJsZSB0byBkaXNwbGF5IHRoZSBnb29kbmVzcyBvZiBmaXQgdmFsdWVzIGZvciBlYWNoIG9mIHRoZSB0aHJlZSBtb2RlbHMuDQoNCmBgYHtyfQ0Kb3V0cHV0LnN1bW1hcnkgPSByYmluZChzZWxlY3QoZnVsbC5tb2RlbCksIHNlbGVjdChzcXJ0LmFyZWEubG9nLnRlbXApLCBzZWxlY3QobG9nLmFyZWEpKQ0Kcm93Lm5hbWVzKG91dHB1dC5zdW1tYXJ5KSA9IGMoIkxpbmVhciBGdWxsIE1vZGVsIiwgIlNxcnQgQXJlYSBMb2cgVGVtcCIsICJMb2cgQXJlYSIpDQprYWJsZShvdXRwdXQuc3VtbWFyeSwgY2FwdGlvbiA9ICJHb29kbmVzcy1vZi1maXQgTWVhc3VyZXMgZm9yIHRoZSBUaHJlZSBDYW5kaWRhdGUgTW9kZWxzIikNCmBgYA0KDQpPdmVyYWxsLCBpdCBhcHBlYXJzIHRoYXQgdW5mb3J0dW5hdGVseSBhbGwgdGhyZWUgbW9kZWxzIGhhdmUgdmVyeSBsb3cgUiBzcXVhcmVkIHZhbHVlcyBpbmRpY2F0aW5nIGxvdyBleHBsYWluZWQgdmFyaWFuY2Ugd2l0aGluIHRoZWlyIHJlc3BlY3RpdmUgbW9kZWxzLiBUaGUgTWFsbG93J3MgQ3AgdmFsdWUgZm9yIHRoZSBsYXN0IHR3byBtb2RlbHMsIHRoZSBzcXVhcmUgcm9vdCBhbmQgbG9nYXJpdGhtaWMgdHJhbnNmb3JtYXRpb24gbW9kZWxzLCBpcyBiZXR0ZXIgdGhhbiB0aGF0IG9mIHRoZSBmdWxsIGxpbmVhciBtb2RlbC4gVGhlIGxvZ2FyaXRobWljIHRyYW5zZm9ybWF0aW9uIG1vZGVsIGhhcyB0aGUgbG93ZXN0IEFJQyBvdXQgb2YgdGhlIHRocmVlLCB3aGljaCBpbmRpY2F0ZXMgdGhhdCBpdCBpcyBhIGJldHRlciBmaXQgbW9kZWwgZm9yIHRoZSBkYXRhLg0KDQpBbGwgaW4gYWxsLCB0aGUgYmVzdCBtb2RlbCBvZiB0aGUgdGhyZWUgYXBwZWFycyB0byBiZSB0aGUgbG9nYXJpdGhtaWMgdHJhbnNmb3JtYXRpb24uIFRoaXMgaGFzIGJlZW4gc2hvd24gYnkgdGhlIGdvb2RuZXNzIG9mIGZpdCBtZWFzdXJlcyB0aGF0IHdlcmUgcGVyZm9ybWVkIGFzIHdlbGwgYXMgYnkgdGhhdCBpdCB3YXMgdGhlIG9ubHkgbW9kZWwgd2l0aCBhIHN0YXRpc3RpY2FsbHkgc2lnbmlmaWNhbnQgcC12YWx1ZSwgcCA9IDAuMDAxNCwgd2hpbGUgdGhlIG90aGVyIHR3byBtb2RlbHMgYm90aCBoYWQgcC12YWx1ZXMgdGhhdCB3ZXJlIGdyZWF0ZXIgdGhhbiBvdXIgYWxwaGEgdmFsdWUgb2YgMC4wNSBpbmRpY2F0aW5nIHRoYXQgdGhlIG90aGVyIHR3byBtb2RlbHMgd2VyZSBub3Qgc3RhdGlzdGljYWxseSBzaWduaWZpY2FudCBpbiBwcmVkaWN0aW5nIGFyZWEgd2hpbGUgdGhlIGxvZ2FyaXRobWljIG1vZGVsIHdhcy4gDQoNClNvLCB3ZSB3aWxsIHNlbGVjdCB0aGUgbG9nYXJpdGhtaWMgdHJhbnNmb3JtYXRpb24gbW9kZWwgYXMgb3VyIGZpbmFsIG1vZGVsIHRvIHVzZS4gDQoNCg0KIyMjIEZpbmFsIE1vZGVsDQoNCkFmdGVyIG91ciBhbmFseXNpcyBvZiB0aGUgdGhyZWUgcG90ZW50aWFsIGNob2ljZXMgZm9yIGEgZmluYWwgbW9kZWwsIHdlIGRlY2lkZWQgdGhhdCB0aGUgYmVzdCBmaXQgbW9kZWwgdG8gdXNlIGlzIHRoZSBsb2dhcml0aG1pYyB0cmFuc2Zvcm1hdGlvbiBtb2RlbC4gVGhpcyBtb2RlbCBoYWQgdGhlIGJlc3QgZ29vZG5lc3Mgb2YgZml0IG1lYXN1cmVzIGFzIHdlbGwgYXMgaXQgd2FzIHRoZSBvbmx5IG9uZSB3aXRoIGEgc3RhdGlzdGljYWxseSBzaWduaWZpY2FudCBwLXZhbHVlLg0KDQpgYGB7cn0NCmthYmxlKHN1bW1hcnkobG9nLmFyZWEpJGNvZWYsIGNhcHRpb24gPSAiSW5mZXJlbnRpYWwgU3RhdGlzdGljcyBvZiBGaW5hbCBNb2RlbC0gTG9nIEFyZWEiKQ0KYGBgDQoNCk91ciBvdmVyYWxsIG1vZGVsIGFwcGVhcnMgdG8gYmUgc3RhdGlzdGljYWxseSBzaWduaWZpY2FudCBmb3IgdGhlIHByZWRpY3Rpb24gYW5kIGVzdGltYXRpb24gb2YgbG9nKGFyZWEpLiBJdCBhcHBlYXJzIHRoYXQgY2hvb3NpbmcgdGhlIGxvZ2FyaXRobWljIHRyYW5zZm9ybWF0aW9uIGFzIG91ciBmaW5hbCBtb2RlbCB3YXMgdGhlIGJlc3QgY2hvaWNlIGFmdGVyIGFsbC4NCg0KVGhlIGNvbWJpbmVkIGxvZ2FyaXRobWljIG1vZGVsIG9mIFgsIFksIERDLCB0ZW1wLCBSSCwgd2luZCwgYW5kIHJhaW4sIHN0YXRpc3RpY2FsbHkgc2lnbmlmaWNhbnRseSBwcmVkaWN0ZWQgdGhlIGxvZyBvZiBhcmVhLCBwID0gMC4wMDE0Lg0KDQoNClRoZSByZWdyZXNzaW9uIGVxdWF0aW9uIGZvciBvdXIgZmluYWwgY2hvaWNlIG9mIHRoZSBtb2RlbCBpcyBnaXZlbiBhcyBmb2xsb3dzOg0KDQpsb2coYXJlYSkgPSAyLjQ4MzUgKyAwLjAyMTIgKiBYIC0gMC4wMzY4ICogWSArIDAuMDAwMSAqIERDIC0gMC4wMTgyICogdGVtcCAtIDAuMDA5OCAqIFJIICsgMC4wMzU3ICogd2luZCArIDAuMDkxMSAqIHJhaW4uDQoNCg0KSW5jbHVkZWQgYmVsb3cgYXJlIHRoZSBpbmZlcmVudGlhbCBzdGF0aXN0aWNzIG9mIHRoZSBmaW5hbCBtb2RlbC4NCg0KYGBge3J9DQpjbXRyeCA8LSBzdW1tYXJ5KGxvZy5hcmVhKSRjb2VmDQprYWJsZShjbXRyeCwgY2FwdGlvbiA9ICJJbmZlcmVudGlhbCBTdGF0aXN0aWNzIG9mIEZpbmFsIE1vZGVsIikNCmBgYA0KDQoNCiMjIyMgRmluYWwgTW9kZWwgVmFyaWFibGUgSW50ZXJwcmV0YXRpb24NCg0KV2Ugd2lsbCBhbmFseXplIHRoZSByZWxhdGlvbnNoaXAgb2YgdGhlIGluZGVwZW5kZW50IHZhcmlhYmxlcyBpbiBvdXIgZmluYWwgcmVncmVzc2lvbiBtb2RlbCB3aXRoIHRoZWlyIGFmZmVjdCBvbiBhcmVhLiBBcyBzdGF0ZXMgcHJldmlvdXNseSBpbiB0aGUgdmFyaWFibGUgZGVzY3JpcHRpb24gc2VjdGlvbiBvZiB0aGlzIHByb2plY3QsIHRoZSBtZWFzdXJlbWVudHMgZm9yIGFyZWEgYXJlIGdpdmVuIGluIGhlY3RhcmVzLiBBZGRpdGlvbmFsbHksIHNpbmNlIG91ciBmaW5hbCBtb2RlbCBzZWxlY3RlZCBpcyBhIGxvZ2FyaXRobWljIHRyYW5zZm9ybWF0aW9uLCB0aGVzZSBpbnRlcnByZXRhdGlvbnMgd2lsbCBiZSBsb29raW5nIGF0IHRoZSBlZmZlY3RzIG9mIHRoZXNlIGluZGVwZW5kZW50IHZhcmlhYmxlcyBvbiB0aGUgbG9nIG9mIGFyZWEuIA0KDQoqIFg6IEZvciBldmVyeSBhZGRpdGlvbmFsIDEgY29vcmRpbmF0ZSBtb3ZlbWVudCB0byB0aGUgcmlnaHQsIHRoZSBsb2dhcml0aG1pYyB0cmFuc2Zvcm1hdGlvbiBvZiBhcmVhIGJ1cm5lZCBieSBhIGZvcmVzdCBmaXJlIGluY3JlYXNlcyBieSAwLjAyMTIgaGVjdGFyZXMuDQoNCiogWTogRm9yIGV2ZXJ5IGFkZGl0aW9uYWwgMSBjb29yZGluYXRlIG1vdmVtZW50IHVwd2FyZHMsIGxvZ2FyaXRobWljIHRyYW5zZm9ybWF0aW9uIG9mIGFyZWEgYnVybmVkIGJ5IGEgZm9yZXN0IGZpcmUgZGVjcmVhc2VzIGJ5IDAuMDM2OCBoZWN0YXJlLg0KDQoqIERDOiBGb3IgZXZlcnkgYWRkaXRpb25hbCAxIHVuaXQgaW5jcmVhc2Ugb2YgREMsIHRoZSBtZWFzdXJlIG9mIHRoZSBtb2lzdHVyZSBjb250ZW50IG9mIGNvbXBhY3Qgb3JnYW5pYyBsYXllcnMgaW4gdGhlIGFyZWEgYWZmZWN0ZWQgYnkgdGhlIGZpcmUsIHRoZSBsb2dhcml0aG1pYyB0cmFuc2Zvcm1hdGlvbiBvZiBhcmVhIGJ1cm5lZCBieSBhIGZvcmVzdCBmaXJlIGluY3JlYXNlcyBieSAwLjAwMDEgaGVjdGFyZS4NCg0KKiB0ZW1wOiBGb3IgZXZlcnkgMSBkZWdyZWUgQ2Vsc2l1cyBpbmNyZWFzZSBpbiB0ZW1wZXJhdHVyZSwgdGhlIGxvZ2FyaXRobWljIHRyYW5zZm9ybWF0aW9uIG9mIGFyZWEgYnVybmVkIGJ5IGEgZm9yZXN0IGZpcmUgZGVjcmVhc2VzIGJ5IDAuMDE4MiBoZWN0YXJlLg0KDQoqIFJIOiBGb3IgZXZlcnkgMSBwZXJjZW50YWdlIGluY3JlYXNlIGluIHRoZSByZWxhdGl2ZSBodW1pZGl0eSwgdGhlIGxvZ2FyaXRobWljIHRyYW5zZm9ybWF0aW9uIG9mIGFyZWEgYnVybmVkIGJ5IGEgZm9yZXN0IGZpcmUgZGVjcmVhc2VzIGJ5IDAuMDA5OCBoZWN0YXJlLg0KDQoqIHdpbmQ6IEZvciBldmVyeSAxIGtpbG9tZXRlciBwZXIgaG91ciBpbmNyZWFzZSBpbiB0aGUgc3BlZWQgb2YgdGhlIHdpbmQsIHRoZSBsb2dhcml0aG1pYyB0cmFuc2Zvcm1hdGlvbiBvZiBhcmVhIGJ1cm5lZCBieSBhIGZvcmVzdCBmaXJlIGluY3JlYXNlcyBieSAwLjAzNTcuDQoNCiogcmFpbjogRm9yIGV2ZXJ5IDEgbW0vbV4yIGluY3JlYXNlIGluIHRoZSByYWluIG9jY3VycmluZywgdGhlIGxvZ2FyaXRobWljIHRyYW5zZm9ybWF0aW9uIG9mIGFyZWEgYnVybmVkIGJ5IGEgZm9yZXN0IGZpcmUgaW5jcmVhc2VzIGJ5IDAuMDkxMS4NCg0KV2UgY2FuIHNlZSB0aGF0IHRoZSB2YXJpYWJsZXMgdGhhdCBhcmUgcG9zaXRpdmVseSBhc3NvY2lhdGVkIHdpdGggdGhlIGxvZ2FyaXRobWljIHRyYW5zZm9ybWF0aW9uIG9mIGFyZWEgYnVybmVkIGJ5IGEgZm9yZXN0IGZpcmUgYXJlIFgsIERDLCB3aW5kLCBhbmQgcmFpbi4gVGhpcyBpbmRpY2F0ZXMgdGhhdCBhcyB0aGVzZSB2YXJpYWJsZXMgaW5jcmVhc2UsIHNvIGRvZXMgdGhlIGFyZWEgYnVybmVkIGJ5IGEgZm9yZXN0IGZpcmUuIE9uIHRoZSBvdGhlciBoYW5kLCB0aGUgdmFyaWFibGVzIHRoYXQgYXJlIG5lZ2F0aXZlbHkgYXNzb2NpYXRlZCB3aXRoIHRoZSBsb2dhcml0aG1pYyB0cmFuc2Zvcm1hdGlvbiBvZiBhcmVhIGJ1cm5lZCBieSBhIGZvcmVzdCBmaXJlIGFyZSBZLCB0ZW1wLCBhbmQgUkguIFRoaXMgaW5kaWNhdGVzIHRoYXQgYXMgdGhlc2UgdmFyaWFibGVzIGluY3JlYXNlLCB0aGUgYXJlYSBidXJuZWQgYnkgYSBmb3Jlc3QgZmlyZSBkZWNyZWFzZXMuDQoNCg0KDQoNCiMgQm9vdHN0cmFwcGluZyB0aGUgRmluYWwgTW9kZWwNCg0KV2UgY2hvc2UgdGhlIGxvZ2FyaXRobWljIHRyYW5zZm9ybWF0aW9uIGFzIG91ciBmaW5hbCBtb2RlbCBpbiB0aGUgcHJldmlvdXMgc2VjdGlvbiBkdWUgdG8gaXQgYmVpbmcgdGhlIG1vZGVsIHdoaWNoIGJvdGggc2hvd3MgdGhlIGdyZWF0ZXN0IHN0YXRpc3RpY2FsIHNpZ25pZmljYW5jZSBpbiB0aGUgcHJlZGljdGlvbiBvZiBhcmVhLCBhbmQgaGFzIHRoZSBmZXdlc3QgdmlvbGF0aW9ucyBvZiBhIG11bHRpcGxlIHJlZ3Jlc3Npb24gbW9kZWwgb2YgdGhlIG1vZGVscyB3ZSBjb25zaWRlcmVkLiANCg0KVGhlIGVxdWF0aW9uIG9mIG91ciBmaW5hbCBtb2RlbCBpczoNCmxvZyhhcmVhKSA9IDIuNDgzNSArIDAuMDIxMiAqIFggLSAwLjAzNjggKiBZICsgMC4wMDAxICogREMgLSAwLjAxODIgKiB0ZW1wIC0gMC4wMDk4ICogUkggKyAwLjAzNTcgKiB3aW5kICsgMC4wOTExICogcmFpbi4NCg0KTm93LCB3ZSB3aWxsIGxvb2sgYXQgdGhlIHByb2Nlc3Mgb2YgYm9vdHN0cmFwcGluZyB0aGlzIGZpbmFsIG1vZGVsIGluIG9yZGVyIHRvIGZpbmQgdGhlIGJvb3RzdHJhcCBjb25maWRlbmNlIGludGVydmFscyBvZiB0aGUgY29lZmZpY2llbnRzIGluIG91ciBmaW5hbCBtb2RlbC4gDQoNCg0KDQojIyBCb290c3RyYXAgQ2FzZXMNCg0KV2Ugd2lsbCBsb29rIGF0IHRoZSBib290c3RyYXAgY2FzZXMgZm9yIG91ciBmaW5hbCBtb2RlbCBhbmQgdXNlIHRoZXNlIHRvIGhlbHAgYnVpbGQgdGhlIGJvb3RzdHJhcCBjb25maWRlbmNlIGludGVydmFscyBvZiB0aGUgcmVncmVzc2lvbiBjb2VmZmljaWVudHMuIA0KDQpgYGB7cn0NCmxvZy5hcmVhID0gbG0obG9nKGFyZWEpIH4gWCArIFkgKyBEQyArIHRlbXAgKyBSSCArIHdpbmQgKyByYWluLCAgZGF0YSA9IGZpbmFsLmRhdGEpDQojIFdlIHdpbGwgdXNlIDEsMDAwIGJvb3RzdHJhcCBzYW1wbGVzLiANCkIgPSAxMDAwICAgICAgDQpudW0ucGFyYW0gPSBkaW0obW9kZWwuZnJhbWUobG9nLmFyZWEpKVsyXSAgDQpzYW1wbGUuc2l6ZSA9IGRpbShtb2RlbC5mcmFtZShsb2cuYXJlYSkpWzFdIA0KY29lZi5tYXRyaXggPSBtYXRyaXgocmVwKDAsIEIqbnVtLnBhcmFtKSwgbmNvbCA9IG51bS5wYXJhbSkgICAgICAgDQpmb3IgKGkgaW4gMTpCKXsNCiAgYm9vdGMuaWQgPSBzYW1wbGUoMTpzYW1wbGUuc2l6ZSwgc2FtcGxlLnNpemUsIHJlcGxhY2UgPSBUUlVFKSANCiMgRml0dGluZyB0aGUgZmluYWwgbG9nIGFyZWEgbW9kZWwgdG8gdGhlIGJvb3RzdHJhcCBjYXNlcy4gDQogIGxvZy5hcmVhLmJ0YyA9IGxtKGxvZyhhcmVhKSB+IFggKyBZICsgREMgKyB0ZW1wICsgUkggKyB3aW5kICsgcmFpbiwgIGRhdGEgPSBmaW5hbC5kYXRhW2Jvb3RjLmlkLF0pICAgICANCiAgY29lZi5tYXRyaXhbaSxdID0gY29lZihsb2cuYXJlYS5idGMpIA0KfQ0KYGBgDQoNCldlIHdpbGwgbm93IHVzZSB0aGVzZSBib290c3RyYXAgY2FzZXMgdG8gY3JlYXRlIGhpc3RvZ3JhbXMgb2YgdGhlIGJvb3RzdHJhcCByZWdyZXNzaW9uIGNvZWZmaWNpZW50cy4gDQoNCmBgYHtyfQ0KYm9vdC5oaXN0b2dyYW0gPSBmdW5jdGlvbihjbXRyeCwgYm9vdC5jb2VmLm1hdHJpeCwgdmFyLmlkLCB2YXIubmFtZSl7DQogIHgxLjEgPC0gc2VxKG1pbihib290LmNvZWYubWF0cml4Wyx2YXIuaWRdKSwgbWF4KGJvb3QuY29lZi5tYXRyaXhbLHZhci5pZF0pLCBsZW5ndGg9NTApDQogIHkxLjEgPC0gZG5vcm0oeDEuMSwgbWVhbihib290LmNvZWYubWF0cml4Wyx2YXIuaWRdKSwgc2QoYm9vdC5jb2VmLm1hdHJpeFssdmFyLmlkXSkpDQogIGhpZ2hlc3RiYXIgPSBtYXgoaGlzdChib290LmNvZWYubWF0cml4Wyx2YXIuaWRdLCBwbG90ID0gRkFMU0UpJGRlbnNpdHkpIA0KICB5bGltaXQgPC0gbWF4KGMoeTEuMSxoaWdoZXN0YmFyKSkNCiAgaGlzdChib290LmNvZWYubWF0cml4Wyx2YXIuaWRdLCBwcm9iYWJpbGl0eSA9IFRSVUUsIG1haW4gPSB2YXIubmFtZSwgeGxhYj0iIiwgY29sID0gImFsaWNlYmx1ZSIseWxpbT1jKDAseWxpbWl0KSwgYm9yZGVyPSJkZWVwcGluayIpDQogIGxpbmVzKHggPSB4MS4xLCB5ID0geTEuMSwgY29sID0gImRhcmtvcmNoaWQiKQ0KICBsaW5lcyhkZW5zaXR5KGJvb3QuY29lZi5tYXRyaXhbLHZhci5pZF0sIGFkanVzdD0yKSwgY29sPSJibHVlIikgDQp9DQpgYGANCg0KVGhlIGhpc3RvZ3JhbXMgb2YgdGhlIGJvb3RzdHJhcCBjb2VmZmljaWVudHMgZm9yIHRoZSB2YXJpYWJsZXMgaW4gdGhlIG1vZGVsIHdlcmUgY3JlYXRlZC4gDQoNClRoZXJlIGFyZSBoaXN0b2dyYW1zIGZvciBlYWNoIG9mIHRoZSBpbmRlcGVuZGVudCB2YXJpYWJsZXMgaW4gdGhlIG1vZGVsLCBhbG9uZyB3aXRoIHRoZSBpbnRlcmNlcHQsIGV4Y2VwdCBmb3IgdGhlIHZhcmlhYmxlICJyYWluIi4gVGhlIHZhcmlhYmxlICJyYWluIiBjb250YWlucyBzZXZlcmFsIHBvaW50cyB3aXRoIHRoZSB2YWx1ZSBvZiB6ZXJvLiBTaW5jZSB0aGUgZmluYWwgbW9kZWwgd2UgY2hvc2UgdG8gdXNlIGlzIGEgbG9nYXJpdGhtaWMgbW9kZWwsIHRoaXMgcmVzdWx0cyBpbiBhbiBlcnJvciBiZWNhdXNlIGxvZygwKSBpcyB1bmRlZmluZWQuIFNvLCB0aGlzIHZhcmlhYmxlIHdhcyBub3QgaW5jbHVkZWQgaW4gdGhlIGhpc3RvZ3JhbXMgb2YgdGhlIGJvb3RzdHJhcCBjb2VmZmljaWVudHMgZHVlIHRvIGl0IHJlc3VsdGluZyBpbiB0aGlzIGVycm9yLiBBbGwgb2YgdGhlIG90aGVyIHZhcmlhYmxlcyBjYW4gYmUgc2VlbiBhbG9uZyB3aXRoIHRoZWlyIGhpc3RvZ3JhbXMuDQoNCldpdGhpbiB0aGUgaGlzdG9ncmFtcywgdGhlcmUgYXJlIHR3byBkaWZmZXJlbnQgbm9ybWFsIGRlbnNpdHkgY3VydmVzIHBsYWNlZCBvbiB0aGVtLiBUaGUgYmx1ZSBjdXJ2ZSBpcyBhIG5vbi1wYXJhbWV0cmljIGRlbnNpdHkgZXN0aW1hdGUgb2YgdGhlIGJvb3RzdHJhcCBzYW1wbGluZyBkaXN0cmlidXRpb24uIFRoZSBib290c3RyYXAgY29uZmlkZW5jZSBpbnRlcnZhbHMgd2Ugd2lsbCBjYWxjdWxhdGUgc2hvcnRseSBhcmUgYmFzZWQgdXBvbiB0aGlzIG5vbi1wYXJhbWV0cmljIGJvb3RzdHJhcCBzYW1wbGluZyBkaXN0cmlidXRpb24uIFRoZSBwdXJwbGUgY3VydmUgaXMgYSBtZWFzdXJlIG9mIHRoZSBlc3RpbWF0ZSBvZiB0aGUgcmVncmVzc2lvbiBjb2VmZmljaWVudHMgYW5kIHRoZSBjb3JyZXNwb25kaW5nIHZhbHVlIG9mIHRoZWlyIHN0YW5kYXJkIGVycm9yLiBUaGUgcC12YWx1ZXMgZ2l2ZW4gaW4gdGhlIHJlZ3Jlc3Npb24gb3V0cHV0IGFyZSB0YWtlbiBmcm9tIHRoaXMgY3VydmUuICANCg0KYGBge3J9DQpwYXIobWZyb3c9YygyLDMpKSAgDQpib290Lmhpc3RvZ3JhbShib290LmNvZWYubWF0cml4PWNvZWYubWF0cml4LCB2YXIuaWQ9MSwgdmFyLm5hbWUgPSJJbnRlcmNlcHQiKQ0KYm9vdC5oaXN0b2dyYW0oYm9vdC5jb2VmLm1hdHJpeD1jb2VmLm1hdHJpeCwgdmFyLmlkPTIsIHZhci5uYW1lID0iWCIpDQpib290Lmhpc3RvZ3JhbShib290LmNvZWYubWF0cml4PWNvZWYubWF0cml4LCB2YXIuaWQ9MywgdmFyLm5hbWUgPSJZIikNCmJvb3QuaGlzdG9ncmFtKGJvb3QuY29lZi5tYXRyaXg9Y29lZi5tYXRyaXgsIHZhci5pZD00LCB2YXIubmFtZSA9IkRDIikNCmJvb3QuaGlzdG9ncmFtKGJvb3QuY29lZi5tYXRyaXg9Y29lZi5tYXRyaXgsIHZhci5pZD01LCB2YXIubmFtZSA9InRlbXAiKQ0KYm9vdC5oaXN0b2dyYW0oYm9vdC5jb2VmLm1hdHJpeD1jb2VmLm1hdHJpeCwgdmFyLmlkPTYsIHZhci5uYW1lID0iUkgiKQ0KYm9vdC5oaXN0b2dyYW0oYm9vdC5jb2VmLm1hdHJpeD1jb2VmLm1hdHJpeCwgdmFyLmlkPTcsIHZhci5uYW1lID0id2luZCIpDQojYm9vdC5oaXN0b2dyYW0oYm9vdC5jb2VmLm1hdHJpeD1jb2VmLm1hdHJpeCwgdmFyLmlkPTgsIHZhci5uYW1lID0icmFpbiIpDQpgYGANCg0KTG9va2luZyBhdCB0aGUgaGlzdG9ncmFtcyBvZiB0aGUgcmVncmVzc2lvbiBjb2VmZmljaWVudHMsIGJvdGggdGhlIGJsdWUgYW5kIHB1cnBsZSBjdXJ2ZXMgYXBwZWFyIHRvIGJlIGNsb3NlIGFuZCBjb25zaXN0ZW50IHdpdGggZWFjaCBvdGhlci4gQWRkaXRpb25hbGx5LCB0aGUgaGlzdG9ncmFtcyBvZiBhbGwgb2YgdGhlIHJlZ3Jlc3Npb24gY29lZmZpY2llbnRzIGFwcGVhciB0byBmb2xsb3cgZGlzdHJpYnV0aW9ucyB0aGF0IGFyZSBhcHByb3hpbWF0ZWx5IG5vcm1hbCB3aXRob3V0IGFueSBzZXZlcmUgc2tldyBvciBvdXRsaWVycyBpbW1lZGlhdGVseSBub3RpY2VhYmxlLiANCg0KDQoNCiMjIyBCb290c3RyYXAgQ29uZmlkZW5jZSBJbnRlcnZhbHMgVXNpbmcgQm9vdHN0cmFwcGluZyBDYXNlcyANCg0KTmV4dCwgd2Ugd2lsbCBjcmVhdGUgdGhlIDk1JSBCb290c3RyYXAgQ29uZmlkZW5jZSBJbnRlcnZhbHMgZm9yIHRoZSByZWdyZXNzaW9uIGNvZWZmaWNpZW50cyBvZiB0aGUgc2VsZWN0ZWQgbW9kZWwuIA0KDQpTb21ldGhpbmcgdG8gbm90ZSBpcyB0aGF0IGFzIG1lbnRpb25lZCBpbiB0aGUgcHJldmlvdXMgc2VjdGlvbiwgdGhlIHZhcmlhYmxlICJyYWluIiBpbmNsdWRlcyBzZXZlcmFsIGVudHJpZXMgd2l0aCBhIHZhbHVlIG9mIHplcm8uIFNpbmNlIG91ciBmaW5hbCBtb2RlbCBpcyBhIGxvZ2FyaXRobWljIHRyYW5zZm9ybWF0aW9uLCB3ZSBjYW4gbm90IGhhdmUgYSBsb2cgb2YgemVybyBiZWNhdXNlIGxvZygwKSBpcyBhbiB1bmRlZmluZWQgdmFsdWUsIHNvIHRoaXMgbGVhZHMgdG8gdGhlIGJvb3RzdHJhcCBtZXRob2QgZ2l2aW5nIHRoZSB2YXJpYWJsZSByYWluIGEgdmFsdWUgb2YgTkEuIEhvd2V2ZXIsIHRoZSBvdGhlciBpbmRlcGVuZGVudCB2YXJpYWJsZXMgZG8gbm90IGhhdmUgdGhpcyBpc3N1ZSBvZiBoYXZpbmcgc2V2ZXJhbCB6ZXJvIHZhbHVlcyBpbiB0aGVpciBlbnRyaWVzLCBzbyB3ZSBjYW4gb2JzZXJ2ZSB0aGVpciBib290c3RyYXAgY29uZmlkZW5jZSBpbnRlcnZhbHMgYmVsb3cuIA0KDQpgYGB7cn0NCm51bS5wYXJhbSA9IGRpbShjb2VmLm1hdHJpeClbMl0gDQpib290Yy5jaSA9IE5VTEwNCmJvb3RjLndkID0gTlVMTA0KZm9yIChpIGluIDE6bnVtLnBhcmFtKXsNCiAgbGNpLjAyNSA9IHJvdW5kKHF1YW50aWxlKGNvZWYubWF0cml4WywgaV0sIDAuMDI1LCB0eXBlID0gMiwgbmEucm0gPSBUUlVFKSw4KQ0KICB1Y2kuOTc1ID0gcm91bmQocXVhbnRpbGUoY29lZi5tYXRyaXhbLCBpXSwwLjk3NSwgdHlwZSA9IDIsIG5hLnJtID0gVFJVRSApLDgpDQogIGJvb3RjLndkW2ldID0gIHVjaS45NzUgLSBsY2kuMDI1DQogIGJvb3RjLmNpW2ldID0gcGFzdGUoIlsiLCByb3VuZChsY2kuMDI1LDQpLCIsICIsIHJvdW5kKHVjaS45NzUsNCksIl0iKQ0KIH0NCmthYmxlKGFzLmRhdGEuZnJhbWUoY2JpbmQoZm9ybWF0QyhjbXRyeCw0LGZvcm1hdD0iZiIpLCBib290Yy5jaS45NT1ib290Yy5jaSkpLA0KICAgICAgY2FwdGlvbiA9ICJSZWdyZXNzaW9uIENvZWZmaWNpZW50IE1hdHJpeCIpDQpgYGANCg0KV2UgY2FuIHNlZSB0aGUgYm9vdHN0cmFwIGNvbmZpZGVuY2UgaW50ZXJ2YWxzIG9mIHRoZSB2YXJpYWJsZXMgYWxvbmcgd2l0aCB0aGUgaW50ZXJjZXB0IG9mIHRoZSBmaW5hbCBsb2dhcml0aG1pYyBtb2RlbCBvZiB0aGUgZGF0YS4gVGhlc2UgY29uZmlkZW5jZSBpbnRlcnZhbHMgdXNlIGJvb3RzdHJhcHBpbmcgY2FzZXMgaW4gb3JkZXIgdG8gZmluZCB0aGUgY29uZmlkZW5jZSBpbnRlcnZhbHMgZm9yIHRoZSByZWdyZXNzaW9uIGNvZWZmaWNpZW50cy4gSW4gdGhlIGFib3ZlIHRhYmxlLCB3ZSBjYW4gc2VlIHRoZSB0ZXN0IHN0YXRpc3RpY3MgYW5kIHRoZSBwLXZhbHVlcyBmb3IgZWFjaCBvZiB0aGUgcmVncmVzc2lvbiBjb2VmZmljaWVudHMuIFdlIGNhbiBhbHNvIHNlZSB0aGUgOTUlIGJvb3RzdHJhcCBjb25maWRlbmNlIGludGVydmFscyBmb3IgZWFjaCBvZiB0aGUgdmFyaWFibGVzIGFsb25nIHdpdGggdGhlIGludGVyY2VwdCBmcm9tIHRoZSB1c2Ugb2YgYm9vdHN0cmFwcGluZyBjYXNlcy4gDQoNClNvbWV0aGluZyBpbnRlcmVzdGluZyB0byBub3RlIGlzIHRoYXQgdGhlIHZhcmlhYmxlcyBYLCBZLCBEQywgdGVtcCwgUkgsIHdpbmQsIGFuZCByYWluIGFsbCBjb250YWluIHplcm8gaW4gdGhlaXIgOTUlIGJvb3RzdHJhcCBjb25maWRlbmNlIGludGVydmFscywgbWVhbmluZyB0aGF0IG9uIHRoZWlyIG93biB0aGV5IGFyZSBub3Qgc3RhdGlzdGljYWxseSBzaWduaWZpY2FudC4gSG93ZXZlciwgdGhlIDk1JSBib290c3RyYXAgY29uZmlkZW5jZSBpbnRlcnZhbCBmb3IgdGhlIGludGVyY2VwdCBkb2VzIGNvbnRhaW4gemVybywgbWVhbmluZyB0aGF0IHRoZSBjb21iaW5lZCBsb2dhcml0aG1pYyBtb2RlbCBvZiBhbGwgdGhlc2UgdmFyaWFibGVzIGluIHN0YXRpc3RpY2FsbHkgc2lnbmlmaWNhbnQgd2hpY2ggbWF0Y2hlcyB1cCB3aXRoIHdoYXQgd2FzIHNob3duIGVhcmxpZXIgd2hlbiBjb25zdHJ1Y3RpbmcgdGhpcyBmaW5hbCBtb2RlbC4gVGhpcyBzdGF0aXN0aWNhbCBzaWduaWZpY2FuY2Ugb2YgdGhlIG92ZXJhbGwgbW9kZWwgY2FuIGJlIHNlZW4gYnkgdGhlIHAtdmFsdWUgb2YgcCA9IDAuMDAxNC4gDQoNCg0KDQojIyBCb290c3RyYXAgUmVzaWR1YWxzDQoNCkluIHRoaXMgc2VjdGlvbiwgd2Ugd2lsbCB1c2UgdGhlIGJvb3RzdHJhcCByZXNpZHVhbCBtZXRob2QgdG8gY29uc3RydWN0IHRoZSBib290c3RyYXAgY29uZmlkZW5jZSBpbnRlcnZhbHMuIFdlIHdpbGwgZmlyc3QgdGFrZSBhIGxvb2sgYXQgdGhlIGhpc3RvZ3JhbSBvZiB0aGUgcmVzaWR1YWxzIHRoYXQgYXJlIG9idGFpbmVkIGZyb20gdGhlIGJvb3RzdHJhcCBtZXRob2QsIGFuZCB0aGVuIHdlIHdpbGwgY29uc3RydWN0IHRoZSA5NSUgYm9vdHN0cmFwIGNvbmZpZGVuY2UgaW50ZXJ2YWxzIGZvciB0aGUgZGF0YS4gIA0KDQoNCiMjIyBSZXNpZHVhbCBIaXN0b2dyYW0NCg0KTm93IGxldCdzIGNyZWF0ZSBhIGhpc3RvZ3JhbSB0byB2aXN1YWxpemUgdGhlIHJlc2lkdWFscyBvYnRhaW5lZCBmcm9tIHRoZSBib290c3RyYXAgbWV0aG9kLiANCg0KYGBge3J9DQpoaXN0KHNvcnQobG9nLmFyZWEkcmVzaWR1YWxzKSwgbiA9IDUwLA0KICAgICB4bGFiPSJSZXNpZHVhbHMiLA0KICAgICBjb2wgPSAibGlnaHRibHVlIiwNCiAgICAgYm9yZGVyPSJkYXJrb3JjaGlkIiwNCiAgICAgbWFpbiA9ICJIaXN0b2dyYW0gb2YgdGhlIFJlc2lkdWFscyIpDQpgYGANCg0KVGhlIGFib3ZlIGhpc3RvZ3JhbSBzaG93cyB0aGF0IHRoZSByZXNpZHVhbCBoaXN0b2dyYW0gYXBwZWFycyBsaWtlIGl0IGlzIGNsb3NlIHRvIGJlaW5nIG5vcm1hbGx5IGRpc3RyaWJ1dGVkLCBob3dldmVyIGl0IGFwcGVhcnMgbGlrZSB0aGVyZSBpcyBhbiBldmVyLXNvLXNsaWdodGx5IHNrZXcgdG8gdGhlIGxlZnQsIHdpdGggbW9yZSBvZiB0aGUgcmVzaWR1YWxzIHNlZW1pbmcgdG8gb2NjdXIgb24gdGhlIGxlZnQtc2lkZSBvZiB0aGUgaGlzdG9ncmFtLiBBZGRpdGlvbmFsbHksIHRoZXJlIGFyZSBzb21lIG9ic2VydmF0aW9ucyB3aGljaCBhcmUgc2xpZ2h0bHkgb2ZmIHRvIHRoZSBlbmQsIHNwZWNpZmljYWxseSB0aGUgdHdvIG9ic2VydmF0aW9ucyB0byB0aGUgcmlnaHQgb2YgeCA9IDQgb24gdGhlIHJpZ2h0LWhhbmQgc2lkZSBhbmQgdGhlIG9uZSBvYnNlcnZhdGlvbiB0byB0aGUgdmVyeSBsZWZ0IG9mIHggPSAtNCBvbiB0aGUgbGVmdC1oYW5kIHNpZGUgd2hpY2ggY291bGQgYmUgdmVyeSBzbGlnaHQgcG90ZW50aWFsIG91dGxpZXJzLiBIb3dldmVyLCB0aGVzZSBvYnNlcnZhdGlvbnMgZG8gbm90IGxvb2sgdG9vIHNldmVyZSBzbyBpdCBpcyBub3QgYSBtYWpvciBjYXVzZSBmb3IgY29uY2Vybi4gT3ZlcmFsbCwgdGhlIHJlc2lkdWFscyBzZWVtcyB0byBmYWxsIGNsb3NlIHRvIHRoYXQgb2YgYSBub3JtYWwgZGlzdHJpYnV0aW9uLA0KDQpJbiB0aGUgZm9sbG93aW5nIHNlY3Rpb24sIHdlIHdpbGwgdXNlIHRoZXNlIHJlc2lkdWFscyB0byBjb25kdWN0IHRoZSBwcm9jZXNzIG9mIHRha2luZyByZXNpZHVhbCBib290c3RyYXAgc2FtcGxlcy4gV2Ugd2lsbCB1c2UgdGhlc2Ugc2FtcGxlcyB0byBlc3RpbWF0ZSB0aGUgYm9vdHN0cmFwIGNvbmZpZGVuY2UgaW50ZXJ2YWxzIGZvciB0aGUgcmVncmVzc2lvbiBjb2VmZmljaWVudHMgaW4gb3VyIGZpbmFsIG1vZGVsLiANCg0KDQojIyMgUmVzaWR1YWwgQm9vdHN0cmFwIFJlZ3Jlc3Npb24gYW5kIEZpbmRpbmcgQm9vdHN0cmFwIENvbmZpZGVuY2UgSW50ZXJ2YWxzDQoNCk5vdywgbGV0J3MgY3JlYXRlIHRoZSA5NSUgYm9vdHN0cmFwIGNvbmZpZGVuY2UgaW50ZXJ2YWxzIG9mIHRoZSBib290c3RyYXAgcmVncmVzc2lvbiBjb2VmZmljaWVudHMuIA0KDQpgYGB7cn0NCmxvZy5hcmVhID0gbG0obG9nKGFyZWEpIH4gWCArIFkgKyBEQyArIHRlbXAgKyBSSCArIHdpbmQgKyByYWluLCAgZGF0YSA9IGZpbmFsLmRhdGEpDQptb2RlbC5yZXNpZCA9IGxvZy5hcmVhJHJlc2lkdWFscw0KIyBXZSB3aWxsIHVzZSAxLDAwMCBib290c3RyYXAgc2FtcGxlcy4NCkI9MTAwMA0KbnVtLnBhcmFtID0gZGltKG1vZGVsLm1hdHJpeChsb2cuYXJlYSkpWzJdIA0Kc2FtcC5udW0gPSBkaW0obW9kZWwubWF0cml4KGxvZy5hcmVhKSlbMV0gIA0KYnRyLm10cnggPSBtYXRyaXgocmVwKDAsOCpCKSwgbmNvbD1udW0ucGFyYW0pDQpmb3IgKGkgaW4gMTpCKXsNCiAgYnQubG9nLmFyZWEgPSBsb2cuYXJlYSRmaXR0ZWQudmFsdWVzICsgDQogICAgICAgIHNhbXBsZShsb2cuYXJlYSRyZXNpZHVhbHMsIHNhbXAubnVtLCByZXBsYWNlID0gVFJVRSkgIA0KICBmaW5hbC5kYXRhJGJ0LmxvZy5hcmVhID0gIGJ0LmxvZy5hcmVhDQogIGJ0ci5tb2RlbCA9IGxtKGJ0LmxvZy5hcmVhIH4gWCArIFkgKyBEQyArIHRlbXAgKyBSSCArIHdpbmQgKyByYWluLCBkYXRhID0gZmluYWwuZGF0YSkNCiAgYnRyLm10cnhbaSxdPWJ0ci5tb2RlbCRjb2VmZmljaWVudHMNCn0NCmBgYA0KDQpXZSB3aWxsIGNyZWF0ZSBoaXN0b2dyYW1zIGZvciBlYWNoIG9mIG91ciByZWdyZXNzaW9uIGNvZWZmaWNpZW50cyB0byBoZWxwIHVzIHZpc3VhbGl6ZSBvdXIgYm9vdHN0cmFwIHJlc2lkdWFscyBmb3Igb3VyIG1vZGVsLiANCg0KYGBge3J9DQpib290Lmhpc3QgPSBmdW5jdGlvbihib290LmNvZWYubWF0cml4LCB2YXIuaWQsIHZhci5ubSl7DQogIHgxLjEgPC0gc2VxKG1pbihib290LmNvZWYubWF0cml4Wyx2YXIuaWRdKSwgICBtYXgoYm9vdC5jb2VmLm1hdHJpeFssdmFyLmlkXSksIGxlbmd0aD0zMDAgKQ0KICB5MS4xIDwtIGRub3JtKHgxLjEsIG1lYW4oYm9vdC5jb2VmLm1hdHJpeFssdmFyLmlkXSksIHNkKGJvb3QuY29lZi5tYXRyaXhbLHZhci5pZF0pKQ0KICBoaWdoZXN0YmFyID0gbWF4KGhpc3QoYm9vdC5jb2VmLm1hdHJpeFssdmFyLmlkXSwgcGxvdCA9IEZBTFNFKSRkZW5zaXR5KSANCiAgeWxpbWl0IDwtIG1heChjKHkxLjEsaGlnaGVzdGJhcikpDQogIGhpc3QoYm9vdC5jb2VmLm1hdHJpeFssdmFyLmlkXSwgcHJvYmFiaWxpdHkgPSBUUlVFLCBtYWluID0gdmFyLm5tLCB4bGFiPSIiLCANCiAgICAgICBjb2wgPSAiYWxpY2VibHVlIix5bGltPWMoMCx5bGltaXQpLCBib3JkZXI9ImRlZXBwaW5rIikNCiAgbGluZXMoeCA9IHgxLjEsIHkgPSB5MS4xLCBjb2wgPSAiZGFya29yY2hpZCIpDQogIGxpbmVzKGRlbnNpdHkoYm9vdC5jb2VmLm1hdHJpeFssdmFyLmlkXSwgYWRqdXN0PTIpLCBjb2w9ImJsdWUiKSAgIA0KfSANCmBgYA0KDQpXZSB3aWxsIG5vdyBjcmVhdGUgdGhlIHJlc2lkdWFsIGJvb3RzdHJhcCBoaXN0b2dyYW1zIGZvciB0aGUgcmVncmVzc2lvbiBjb2VmZmljaWVudHMgb2Ygb3VyIG1vZGVsLiANCg0KYGBge3J9DQpwYXIobWZyb3c9YygyLDMpKQ0KIyBCb290c3RyYXAgaGlzdG9ncmFtcw0KYm9vdC5oaXN0KGJvb3QuY29lZi5tYXRyaXg9YnRyLm10cngsIHZhci5pZD0xLCB2YXIubm0gPSJJbnRlcmNlcHQiKQ0KYm9vdC5oaXN0KGJvb3QuY29lZi5tYXRyaXg9YnRyLm10cngsIHZhci5pZD0yLCB2YXIubm0gPSJYIikNCmJvb3QuaGlzdChib290LmNvZWYubWF0cml4PWJ0ci5tdHJ4LCB2YXIuaWQ9MywgdmFyLm5tID0iWSIpDQpib290Lmhpc3QoYm9vdC5jb2VmLm1hdHJpeD1idHIubXRyeCwgdmFyLmlkPTQsIHZhci5ubSA9IkRDIikNCmJvb3QuaGlzdChib290LmNvZWYubWF0cml4PWJ0ci5tdHJ4LCB2YXIuaWQ9NSwgdmFyLm5tID0idGVtcCIpDQpib290Lmhpc3QoYm9vdC5jb2VmLm1hdHJpeD1idHIubXRyeCwgdmFyLmlkPTYsIHZhci5ubSA9IlJIIikNCmJvb3QuaGlzdChib290LmNvZWYubWF0cml4PWJ0ci5tdHJ4LCB2YXIuaWQ9NywgdmFyLm5tID0id2luZCIpDQpib290Lmhpc3QoYm9vdC5jb2VmLm1hdHJpeD1idHIubXRyeCwgdmFyLmlkPTgsIHZhci5ubSA9InJhaW4iKQ0KYGBgDQoNCldlIGNhbiBzZWUgdGhhdCB0aGUgaGlzdG9ncmFtcyBtb3N0bHkgZm9sbG93IGEgbm9ybWFsIGRpc3RyaWJ1dGlvbiBmb3IgdGhlIHJlZ3Jlc3Npb24gY29lZmZpY2llbnRzIG9mIG91ciBtb2RlbC4gSnVzdCBsaWtlIGJlZm9yZSB3aGVuIGNyZWF0aW5nIGhpc3RvZ3JhbXMgZm9yIHRoZSByZWdyZXNzaW9uIGNvZWZmaWNpZW50cyBpbiB0aGUgYm9vdHN0cmFwIGNhc2VzLCB0aGVyZSBhcmUgdHdvIGN1cnZlcyBvbiB0aGVzZSBoaXN0b2dyYW1zLCBhIGJsdWUgYW5kIGEgcHVycGxlIGN1cnZlLiBUaGUgYmx1ZSBjdXJ2ZSBpcyBhIG5vbi1wYXJhbWV0cmljIGRlbnNpdHkgZXN0aW1hdGUgb2YgdGhlIGJvb3RzdHJhcCBzYW1wbGluZyBkaXN0cmlidXRpb24uIFRoZSBib290c3RyYXAgY29uZmlkZW5jZSBpbnRlcnZhbHMgd2Ugd2lsbCBjYWxjdWxhdGUgc2hvcnRseSBhcmUgYmFzZWQgdXBvbiB0aGlzIG5vbi1wYXJhbWV0cmljIGJvb3RzdHJhcCBzYW1wbGluZyBkaXN0cmlidXRpb24uIFRoZSBwdXJwbGUgY3VydmUgaXMgYSBtZWFzdXJlIG9mIHRoZSBlc3RpbWF0ZSBvZiB0aGUgcmVncmVzc2lvbiBjb2VmZmljaWVudHMgYW5kIHRoZSBjb3JyZXNwb25kaW5nIHZhbHVlIG9mIHRoZWlyIHN0YW5kYXJkIGVycm9yLiBUaGUgcC12YWx1ZXMgZ2l2ZW4gaW4gdGhlIHJlZ3Jlc3Npb24gb3V0cHV0IGFyZSB0YWtlbiBmcm9tIHRoaXMgY3VydmUuDQoNCg0KIyMjIEJvb3RzdHJhcCBDb25maWRlbmNlIEludGVydmFscyBVc2luZyBCb290c3RyYXAgUmVzaWR1YWxzDQoNCk5leHQsIHdlIHdpbGwgY2FsY3VsYXRlIHRoZSA5NSUgYm9vdHN0cmFwIGNvbmZpZGVuY2UgaW50ZXJ2YWxzIGJ5IHRoZSB1c2Ugb2YgdGhlIGJvb3RzdHJhcCByZXNpZHVhbHMuIA0KDQpgYGB7cn0NCm51bS5wYXJhbSA9IGRpbShjb2VmLm1hdHJpeClbMl0gIA0KYm9vdHIuY2kgPSBOVUxMDQpib290ci53ZCA9IE5VTEwNCmZvciAoaSBpbiAxOm51bS5wYXJhbSl7DQogIGxjaS4wMjUgPSByb3VuZChxdWFudGlsZShidHIubXRyeFssIGldLCAwLjAyNSwgdHlwZSA9IDIpLDgpDQogIHVjaS45NzUgPSByb3VuZChxdWFudGlsZShidHIubXRyeFssIGldLDAuOTc1LCB0eXBlID0gMiApLDgpDQogIGJvb3RyLndkW2ldID0gdWNpLjk3NSAtIGxjaS4wMjUNCiAgYm9vdHIuY2lbaV0gPSBwYXN0ZSgiWyIsIHJvdW5kKGxjaS4wMjUsNCksIiwgIiwgcm91bmQodWNpLjk3NSw0KSwiXSIpDQp9DQprYWJsZShhcy5kYXRhLmZyYW1lKGNiaW5kKGZvcm1hdEMoY210cngsNCxmb3JtYXQ9ImYiKSwgYm9vdHIuY2kuOTU9Ym9vdHIuY2kpKSwgDQogICAgICBjYXB0aW9uID0gIlJlZ3Jlc3Npb24gQ29lZmZpY2llbnQgTWF0cml4IG9mIDk1JSBSZXNpZHVhbCBCb290c3RyYXAgQ29uZmlkZW5jZSBJbnRlcnZhbHMiKQ0KYGBgDQoNCkFib3ZlIHdlIGNhbiBzZWUgdGhlIG91dHB1dCB0YWJsZSBmb3IgdGhlIDk1JSBib290c3RyYXAgY29uZmlkZW5jZSBpbnRlcnZhbHMgYnkgdGhlIHVzZSBvZiB0aGUgYm9vdHN0cmFwIHJlc2lkdWFscyBtZXRob2QuIFRoaXMgdGFibGUgaW5jbHVkZXMgdGhlIDk1JSBib290c3RyYXAgY29uZmlkZW5jZSBpbnRlcnZhbHMgZm9yIGVhY2ggb2YgdGhlIHJlZ3Jlc3Npb24gY29lZmZpY2llbnRzIGluIG91ciBmaW5hbCBtb2RlbC4gT25jZSBhZ2FpbiB3ZSBjYW4gc2VlIHRoYXQgYWxsIG9mIHRoZSBjb25maWRlbmNlIGludGVydmFscyBmb3IgdGhlIHJlZ3Jlc3Npb24gY29lZmZpY2llbnRzIGNvbnRhaW4gemVybyBleGNlcHQgZm9yIHRoYXQgb2YgdGhlIGludGVyY2VwdC4gVGhpcyBtYXRjaGVzIHVwIHdpdGggb3VyIHByZXZpb3VzIGFuYWx5c2lzIG9mIHRoZSBtb2RlbCB0aGF0IGFsdGhvdWdoIHRoZSBpbmRpdmlkdWFsIHZhcmlhYmxlcyBkbyBub3Qgc2hvdyBzdGF0aXN0aWNhbCBzaWduaWZpY2FudCwgdGhlaXIgY29tYmluYXRpb24gaW4gdGhlIG92ZXJhbGwgbG9nYXJpdGhtaWMgbW9kZWwgaXMgc3RhdGlzdGljYWxseSBzaWduaWZpY2FudCwgd2hpY2ggY2FuIGJlIHNlZW4gYnkgdGhlIHAtdmFsdWUgb2YgcCA9IDAuMDAxNC4gDQoNCg0KDQoNCiMgQ29tYmluaW5nIHRoZSBSZXN1bHRzIG9mIHRoZSBSZWd1bGFyIE1vZGVsIGFuZCB0aGUgQm9vdHN0cmFwIFJlc3VsdHMNCg0KTm93IHRoYXQgd2UgaGF2ZSBjcmVhdGVkIGJvdGggYm9vdHN0cmFwIGNvbmZpZGVuY2UgaW50ZXJ2YWxzIHVzaW5nIGJvb3RzdHJhcCBjYXNlcyBhbmQgdXNpbmcgYm9vdHN0cmFwIHJlc2lkdWFscywgbGV0J3MgY29tYmluZSB0aGVzZSByZXN1bHRzIGludG8gb25lIHRhYmxlIHRvIHNob3cgdGhlIGNvbWJpbmVkIGluZmVyZW50aWFsIHN0YXRpc3RpY3MuIA0KDQpgYGB7cn0NCmthYmxlKGFzLmRhdGEuZnJhbWUoY2JpbmQoZm9ybWF0QyhjbXRyeFssLTNdLDQsZm9ybWF0PSJmIiksIGJvb3RjLmNpLjk1PWJvb3RjLmNpLGJvb3RyLmNpLjk1PWJvb3RyLmNpKSksIA0KICAgICAgY2FwdGlvbj0iQ29tYmluZWQgSW5mZXJlbnRpYWwgU3RhdGlzdGljcy0gQm9vdHN0cmFwIENvbmZpZGVuY2UgSW50ZXJ2YWxzIFxuIChCb290c3RyYXAgQ2FzZXMgYW5kIFJlc2lkdWFscykgYW5kIHAtdmFsdWVzIikNCmBgYA0KDQpUaGUgdGFibGUgYWJvdmUgY29tYmluZXMgdGhlIHJlc3VsdHMgZm9yIHRoZSBpbmZlcmVudGlhbCBzdGF0aXN0aWNzIG9mIHRoZSBib290c3RyYXAgbWV0aG9kLiBUaGUgdGFibGUgaW5jbHVkZXMgdGhlIHAtdmFsdWVzIG9mIHRoZSByZWdyZXNzaW9uIGNvZWZmaWNpZW50cyBhbmQgdGhlaXIgYm9vdHN0cmFwIGNvbmZpZGVuY2UgaW50ZXJ2YWxzLiBUaGlzIGluY2x1ZGVzIGJvdGggdGhlIGJvb3RzdHJhcCBjb25maWRlbmNlIGludGVydmFscyB1c2luZyBib290c3RyYXAgY2FzZXMgKGJvb3RjLmNpLjk1KSBhbmQgdGhlIGJvb3RzdHJhcCBjb25maWRlbmNlIGludGVydmFscyB1c2luZyBib290c3RyYXAgcmVzaWR1YWxzIChib290ci5jaS45NSkuIA0KDQpXZSBjYW4gc2VlIGluIHRoaXMgb3V0cHV0IHRhYmxlIHRoYXQgYm90aCBtZXRob2RzIG9mIGJvb3RzdHJhcCBjb25maWRlbmNlIGludGVydmFscyB5aWVsZCB0aGUgc2FtZSByZXN1bHRzIGluIHJlZ2FyZHMgdG8gdGhlIHN0YXRpc3RpY2FsIHNpZ25pZmljYW5jZSBvZiB0aGUgb3ZlcmFsbCBtb2RlbC4gQXMgd2FzIHN0YXRlZCBwcmV2aW91c2x5IGluIHRoZSBhbmFseXNpcyBvZiB0aGUgbG9nKGFyZWEpIG1vZGVsLCBhbHRob3VnaCBpdCBzZWVtcyB0aGF0IHRoZSBpbmRpdmlkdWFsIHZhcmlhYmxlcyBkbyBub3Qgc2hvdyBub3RhYmxlIHN0YXRpc3RpY2FsIHNpZ25pZmljYW5jZSwgYXMgYWxsIG9mIHRoZWlyIHAtdmFsdWVzIGFyZSBncmVhdGVyIHRoYW4gb3VyIGFscGhhIG9mIDAuMDUsIHRoZWlyIGNvbWJpbmVkIGVmZmVjdCBpbiB0aGUgb3ZlcmFsbCBtb2RlbCBkb2VzIHNob3cgc3RhdGlzdGljYWwgc2lnbmlmaWNhbmNlIHdpdGggYSBwLXZhbHVlIG9mIHAgPSAwLjAwMTQuIFRoZSBib290c3RyYXAgY29uZmlkZW5jZSBpbnRlcnZhbHMgZnVydGhlciBzdHJlbmd0aGVuIHRoaXMgcG9pbnQgYXMgYWxsIG9mIHRoZSByZWdyZXNzaW9uIGNvZWZmaWNpZW50cyBmb3IgdGhlIHZhcmlhYmxlcyBpbmNsdWRlIHplcm8gaW4gdGhlaXIgY29uZmlkZW5jZSBpbnRlcnZhbHMgaW5kaWNhdGluZyB0aGF0IHRoZXkgYXJlIG5vdCBzdGF0aXN0aWNhbGx5IHNpZ25pZmljYW50IG9uIHRoZWlyIG93bi4gSG93ZXZlciwgdGhlIGNvbmZpZGVuY2UgaW50ZXJ2YWwgZm9yIHRoZSBpbnRlcmNlcHQgZG9lcyBub3QgaW5jbHVkZSB6ZXJvIGluZGljYXRpbmcgdGhhdCBpdCBpcyBzdGF0aXN0aWNhbGx5IHNpZ25pZmljYW50IHdoaWNoIGNhbiBiZSBzZWVuIGJ5IGl0cyBwLXZhbHVlIG9mIHAgPSAwLjAwMTQuIFRoaXMgdmFsaWRhdGVzIG91ciBhbmFseXNpcyBvZiB0aGUgZmluYWwgbW9kZWwgYW5kIGl0cyBzdGF0aXN0aWNhbCBzaWduaWZpY2FuY2UuIA0KDQpXZSBjYW4gY3JlYXRlIGEgdGFibGUgdG8gc2hvdyB0aGUgd2lkdGhzIG9mIHRoZSA5NSUgYm9vdHN0cmFwIGNvbmZpZGVuY2UgaW50ZXJ2YWxzIGZvciBib3RoIHRoZSBib290c3RyYXAgY2FzZXMgbWV0aG9kIGFuZCB0aGUgYm9vdHN0cmFwIHJlc2lkdWFscyBtZXRob2QuDQoNCmBgYHtyfQ0Ka2FibGUocm91bmQoY2JpbmQoYm9vdGMud2QsIGJvb3RyLndkKSw0KSwgY2FwdGlvbj0iOTUlIEJvb3RzdHJhcCBDb25maWRlbmNlIEludGVydmFscyBXaWR0aC0gXG4gQm9vdHN0cmFwIENhc2VzIGFuZCBCb290c3RyYXAgUmVzaWR1YWxzIikNCmBgYA0KDQpUaGUgdGFibGUgYWJvdmUgc2hvd3MgdGhlIHdpZHRoIGZvciBib3RoIG9mIHRoZSBib290c3RyYXAgY29uZmlkZW5jZSBpbnRlcnZhbCBtZXRob2RzIGZvciB0aGUgcmVncmVzc2lvbiBjb2VmZmljaWVudHMgb2YgdGhlIGZpbmFsIG1vZGVsLiBGb3IgYm90aCBvZiB0aGVzZSB0d28gbWV0aG9kcyBmb3IgYm9vdHN0cmFwIGNvbmZpZGVuY2UgaW50ZXJ2YWxzLCB3ZSBjYW4gc2VlIHRoYXQgdGhlIHdpZHRocyBhcmUgc2ltaWxhciBmb3IgdGhlIHR3byBtZXRob2RzIHNob3dpbmcgdGhhdCB0aGV5IGFyZSBjb25zaXN0ZW50IHdpdGggb25lIGFub3RoZXIuIA0KDQoNCiMjIEZpbmFsIE1vZGVsIFJlcG9ydA0KDQpOb3cgdGhhdCB3ZSBoYXZlIGxvb2tlZCBhdCB2YXJpb3VzIG1ldGhvZHMgb2YgYW5hbHl6aW5nIG91ciBmaW5hbCByZWdyZXNzaW9uIG1vZGVsLCBsZXQncyBjcmVhdGUgYSBmaW5hbCB0YWJsZSBvZiB0aGUgaW5mZXJlbnRpYWwgc3RhdGlzdGljcy4gDQoNCmBgYHtyfQ0Ka2FibGUoY210cngsIGNhcHRpb24gPSAiSW5mZXJlbnRpYWwgU3RhdGlzdGljcyBvZiB0aGUgRmluYWwgUmVncmVzc2lvbiBNb2RlbCIpDQpgYGANCg0KVGhlIHRhYmxlIGFib3ZlIHNob3dzIHRoZSBpbmZlcmVudGlhbCBzdGF0aXN0aWNzIG9mIG91ciBmaW5hbCBtb2RlbCB3aGljaCBhbGxvd3MgdXMgdG8gdmVyaWZ5IHRoZSBzdGF0aXN0aWNhbCBzaWduaWZpY2FuY2Ugb2YgaXQgb25lIG1vcmUgdGltZS4gT3VyIG1vZGVsIGZvciB0aGUgbG9nYXJpdGhtaWMgdHJhbnNmb3JtYXRpb24gb2YgYXJlYSBpcyBzdGF0aXN0aWNhbGx5IHNpZ25pZmljYW50LiANCg0KVGhlIGVxdWF0aW9uIG9mIG91ciBmaW5hbCBtb2RlbCBpczoNCmxvZyhhcmVhKSA9IDIuNDgzNSArIDAuMDIxMiAqIFggLSAwLjAzNjggKiBZICsgMC4wMDAxICogREMgLSAwLjAxODIgKiB0ZW1wIC0gMC4wMDk4ICogUkggKyAwLjAzNTcgKiB3aW5kICsgMC4wOTExICogcmFpbi4NCg0KVGhlIGNvbWJpbmF0aW9uIG9mIFgsIFksIERDLCB0ZW1wLCB0ZW1wLCBSSCwgd2luZCwgYW5kIHJhaW4gc3RhdGlzdGljYWxseSBzaWduaWZpY2FudGx5IHByZWRpY3RlZCB0aGUgbG9nYXJpdGhtaWMgdHJhbnNmb3JtYXRpb24gb2YgYXJlYSwgcCA9IDAuMDAxNC4gVGhpcyBtb2RlbCBoYXMgZ29vZCB1dGlsaXR5IGZvciBwcmVkaWNpdGlvbiBhbmQgZXN0aW1hdGlvbi4gDQoNCg0KIyMgSW50ZXJwcmV0YXRpb25zIG9mIHRoZSBSZWdyZXNzaW9uIENvZWZmaWNpZW50cyANCg0KVXNpbmcgdGhlIGZpbmFsIGluZmVyZW50aWFsIHN0YXRpc3RpY3MsIHdlIGNhbiBhbmFseXplIHRoZSByZWxhdGlvbnNoaXAgb2YgdGhlIGluZGVwZW5kZW50IHZhcmlhYmxlcyBpbiB0aGUgZmluYWwgIG1vZGVsIHdpdGggdGhlaXIgYWZmZWN0IG9uIGFyZWEuIEFzIHdhcyBzdGF0ZWQgcHJldmlvdXNseSBpbiB0aGUgdmFyaWFibGUgZGVzY3JpcHRpb24gc2VjdGlvbiBvZiB0aGlzIHByb2plY3QsIHRoZSBtZWFzdXJlbWVudHMgZm9yIGFyZWEgYXJlIGdpdmVuIGluIGhlY3RhcmVzLiBBZGRpdGlvbmFsbHksIHNpbmNlIG91ciBmaW5hbCBtb2RlbCBzZWxlY3RlZCBpcyBhIGxvZ2FyaXRobWljIHRyYW5zZm9ybWF0aW9uLCB0aGVzZSBpbnRlcnByZXRhdGlvbnMgd2lsbCBiZSBsb29raW5nIGF0IHRoZSBlZmZlY3RzIG9mIHRoZXNlIGluZGVwZW5kZW50IHZhcmlhYmxlcyBvbiB0aGUgbG9nIG9mIGFyZWEuIA0KDQoqIFg6IEZvciBldmVyeSBhZGRpdGlvbmFsIDEgY29vcmRpbmF0ZSBtb3ZlbWVudCB0byB0aGUgcmlnaHQsIHRoZSBsb2dhcml0aG1pYyB0cmFuc2Zvcm1hdGlvbiBvZiBhcmVhIGJ1cm5lZCBieSBhIGZvcmVzdCBmaXJlIGluY3JlYXNlcyBieSAwLjAyMTIgaGVjdGFyZXMuDQoNCiogWTogRm9yIGV2ZXJ5IGFkZGl0aW9uYWwgMSBjb29yZGluYXRlIG1vdmVtZW50IHVwd2FyZHMsIGxvZ2FyaXRobWljIHRyYW5zZm9ybWF0aW9uIG9mIGFyZWEgYnVybmVkIGJ5IGEgZm9yZXN0IGZpcmUgZGVjcmVhc2VzIGJ5IDAuMDM2OCBoZWN0YXJlLg0KDQoqIERDOiBGb3IgZXZlcnkgYWRkaXRpb25hbCAxIHVuaXQgaW5jcmVhc2Ugb2YgREMsIHRoZSBtZWFzdXJlIG9mIHRoZSBtb2lzdHVyZSBjb250ZW50IG9mIGNvbXBhY3Qgb3JnYW5pYyBsYXllcnMgaW4gdGhlIGFyZWEgYWZmZWN0ZWQgYnkgdGhlIGZpcmUsIHRoZSBsb2dhcml0aG1pYyB0cmFuc2Zvcm1hdGlvbiBvZiBhcmVhIGJ1cm5lZCBieSBhIGZvcmVzdCBmaXJlIGluY3JlYXNlcyBieSAwLjAwMDEgaGVjdGFyZS4NCg0KKiB0ZW1wOiBGb3IgZXZlcnkgMSBkZWdyZWUgQ2Vsc2l1cyBpbmNyZWFzZSBpbiB0ZW1wZXJhdHVyZSwgdGhlIGxvZ2FyaXRobWljIHRyYW5zZm9ybWF0aW9uIG9mIGFyZWEgYnVybmVkIGJ5IGEgZm9yZXN0IGZpcmUgZGVjcmVhc2VzIGJ5IDAuMDE4MiBoZWN0YXJlLg0KDQoqIFJIOiBGb3IgZXZlcnkgMSBwZXJjZW50YWdlIGluY3JlYXNlIGluIHRoZSByZWxhdGl2ZSBodW1pZGl0eSwgdGhlIGxvZ2FyaXRobWljIHRyYW5zZm9ybWF0aW9uIG9mIGFyZWEgYnVybmVkIGJ5IGEgZm9yZXN0IGZpcmUgZGVjcmVhc2VzIGJ5IDAuMDA5OCBoZWN0YXJlLg0KDQoqIHdpbmQ6IEZvciBldmVyeSAxIGtpbG9tZXRlciBwZXIgaG91ciBpbmNyZWFzZSBpbiB0aGUgc3BlZWQgb2YgdGhlIHdpbmQsIHRoZSBsb2dhcml0aG1pYyB0cmFuc2Zvcm1hdGlvbiBvZiBhcmVhIGJ1cm5lZCBieSBhIGZvcmVzdCBmaXJlIGluY3JlYXNlcyBieSAwLjAzNTcuDQoNCiogcmFpbjogRm9yIGV2ZXJ5IDEgbW0vbV4yIGluY3JlYXNlIGluIHRoZSByYWluIG9jY3VycmluZywgdGhlIGxvZ2FyaXRobWljIHRyYW5zZm9ybWF0aW9uIG9mIGFyZWEgYnVybmVkIGJ5IGEgZm9yZXN0IGZpcmUgaW5jcmVhc2VzIGJ5IDAuMDkxMS4NCg0KV2UgY2FuIHNlZSB0aGF0IHRoZSB2YXJpYWJsZXMgdGhhdCBhcmUgcG9zaXRpdmVseSBhc3NvY2lhdGVkIHdpdGggdGhlIGxvZ2FyaXRobWljIHRyYW5zZm9ybWF0aW9uIG9mIGFyZWEgYnVybmVkIGJ5IGEgZm9yZXN0IGZpcmUgYXJlIFgsIERDLCB3aW5kLCBhbmQgcmFpbi4gVGhpcyBpbmRpY2F0ZXMgdGhhdCBhcyB0aGVzZSB2YXJpYWJsZXMgaW5jcmVhc2UsIHNvIGRvZXMgdGhlIGFyZWEgYnVybmVkIGJ5IGEgZm9yZXN0IGZpcmUuIE9uIHRoZSBvdGhlciBoYW5kLCB0aGUgdmFyaWFibGVzIHRoYXQgYXJlIG5lZ2F0aXZlbHkgYXNzb2NpYXRlZCB3aXRoIHRoZSBsb2dhcml0aG1pYyB0cmFuc2Zvcm1hdGlvbiBvZiBhcmVhIGJ1cm5lZCBieSBhIGZvcmVzdCBmaXJlIGFyZSBZLCB0ZW1wLCBhbmQgUkguIFRoaXMgaW5kaWNhdGVzIHRoYXQgYXMgdGhlc2UgdmFyaWFibGVzIGluY3JlYXNlLCB0aGUgYXJlYSBidXJuZWQgYnkgYSBmb3Jlc3QgZmlyZSBkZWNyZWFzZXMuDQoNCg0KDQoNCiMgU3VtbWFyeSBhbmQgRGlzY3Vzc2lvbg0KDQpPdmVyYWxsLCB0aHJvdWdoIHRoZSBjcmVhdGlvbiBvZiBvdXIgZmluYWwgbW9kZWwsIGFuZCB0aHJvdWdoIHRoZSB1c2Ugb2YgYm9vdHN0cmFwIGNvbmZpZGVuY2UgaW50ZXJ2YWxzLCB3ZSB3ZXJlIGFibGUgdG8gY29uY2x1ZGUgdGhlIHN0YXRpc3RpY2FsIHNpZ25pZmljYW5jZSBvZiBvdXIgb3ZlcmFsbCBmaW5hbCBtb2RlbC4gVGhlIGxvZyhhcmVhKSBtb2RlbCB0aGF0IHdhcyBjaG9zZW4gc2hvd2VkIGl0c2VsZiB0byBiZSBzdGF0aXN0aWNhbGx5IHNpZ25pZmljYW50IHdpdGggYSBwLXZhbHVlIG9mIHAgPSAwLjAwMTQuIFRoaXMgd2FzIHZlcmlmaWVkIHRocm91Z2ggdGhlIGNyZWF0aW9uIG9mIGJvb3RzdHJhcCBjb25maWRlbmNlIGludGVydmFscyB1c2luZyBib3RoIHRoZSBtZXRob2RzIG9mIGJvb3RzdHJhcHBpbmcgY2FzZXMgYW5kIGJvb3RzdHJhcCByZXNpZHVhbHMuIA0KDQpUaGUgZXF1YXRpb24gb2Ygb3VyIGZpbmFsIG1vZGVsIGlzIGdpdmVuIGJ5Og0KbG9nKGFyZWEpID0gMi40ODM1ICsgMC4wMjEyICogWCAtIDAuMDM2OCAqIFkgKyAwLjAwMDEgKiBEQyAtIDAuMDE4MiAqIHRlbXAgLSAwLjAwOTggKiBSSCArIDAuMDM1NyAqIHdpbmQgKyAwLjA5MTEgKiByYWluLg0KDQpUaGlzIG1vZGVsIHNob3dlZCBpdHNlbGYgdG8gYmUgc3RhdGlzdGljYWxseSBzaWduaWZpY2FudCBmb3IgdGhlIHByZWRpY3Rpb24gYW5kIGVzdGltYXRpb24gb2YgdGhlIGxvZ2FyaXRobWljIHRyYW5zZm9ybWF0aW9uIG9mIHRoZSBhcmVhIGFmZmVjdGVkIGJ5IGZvcmVzdCBmaXJlcyB3aXRoIGEgc3RhdGlzdGljYWxseSBzaWduaWZpY2FudCBwLXZhbHllIG9mIHAgPSAwLjAwMTQuDQoNCg0KDQojIyBBbnN3ZXJpbmcgdGhlIFJlc2VhcmNoIFF1ZXN0aW9ucw0KDQpFYXJsaWVyIGluIHRoaXMgcmVwb3J0LCBzb21lIHJlc2VhcmNoIHF1ZXN0aW9ucyB3ZXJlIGRpc2N1c3NlZCBhbmQgdGhlc2Ugd2VyZSBjb25zaWRlcmVkIHdoaWxlIGFuYWx5emluZyB0aGUgZGF0YSBhbmQgaXRzIHJlc3VsdHMuIE5vdyB0aGF0IG91ciBtb2RlbCBoYXMgYmVlbiB0aG9yb3VnaGx5IGFuYWx5emVkLCBsZXQncyBnbyBiYWNrIGFuZCBzZWUgaWYgd2UgY2FuIG5vdyBhbnN3ZXIgdGhlc2UgcmVzZWFyY2ggcXVlc3Rpb25zIGZvciB0aGlzIHByb2plY3QuIA0KDQoNCiogV2hpY2ggZmFjdG9ycyBoYXZlIHRoZSBncmVhdGVzdCBzaWduaWZpY2FuY2UgaW4gcHJlZGljdGluZyB0aGUgYXJlYSBidXJuZWQgYnkgYSBmb3Jlc3QgZmlyZT8NCg0KQXMgd2FzIGZvdW5kIHRocm91Z2ggdGhlIGFuYWx5c2lzIG9mIG91ciBmaW5hbCBtb2RlbCwgdGhlIHJlZ3Jlc3Npb24gY29lZmZpY2llbnRzIHRoZW1zZWx2ZXMgZGlkIG5vdCBzaG93IHN0YXRpc3RpY2FsIHNpZ25pZmljYW5jZSwgYnV0IHRoZWlyIGNvbWJpbmVkIGVmZmVjdCBkaWQuIE91dCBvZiB0aGUgaW5kZXBlbmRlbnQgdmFyaWFibGVzLCBSSCB3YXMgdGhlIG1vc3Qgc2lnbmlmaWNhbnQgd2l0aCBhIHAtdmFsdWUgb2YgMC4xOTA1LiBIb3dldmVyLCB0aGlzIHZhbHVlIGlzIHN0aWxsIGFib3ZlIG91ciBhbHBoYSB2YWx1ZSBvZiAwLjA1LiBTbywgYWx0aG91Z2ggdGhlIGluZGl2aWR1YWwgdmFyaWFibGVzIGRpZCBub3Qgc2hvdyBzdGF0aXN0aWNhbCBzaWduaWZpY2FuY2UgaW4gb3VyIGZpbmFsIG1vZGVsLCB0aGVpciBjb21iaW5lZCBlZmZlY3QgZGlkIHNob3cgc3RhdGlzdGljYWwgc2lnbmlmaWNhbmNlIHdpdGggYSBwLXZhbHVlIG9mIHAgPSAwLjAwMTQuDQoNCg0KKiBXaGljaCBmYWN0b3JzIGhhdmUgdGhlIGhpZ2hlc3QgY29ycmVsYXRpb24gd2l0aCBlYWNoIG90aGVyPyBBbmQsIHdoYXQgYXJlIHNvbWUgcG9zc2libGUgZXhwbGFuYXRpb25zIGZvciB0aGVzZSBmYWN0b3JzIGhhdmUgdGhlIGdyZWF0ZXN0IGNvcnJlbGF0aW9uPyANCg0KV2UgZGlkIGhhdmUgc29tZSBmYWN0b3JzIHdpdGggbm90YWJseSBoaWdoIGNvcnJlbGF0aW9uIHdpdGggb25lIGFub3RoZXIuIFRoaXMgbGVkIHRvIHVzIGhhdmluZyB0byBhZGRyZXNzIGFuZCBmaXggbXVsdGljb2xsaW5lYXJpdHkgaXNzdWVzIHdpdGhpbiB0aGUgb3JpZ2luYWwsIGZ1bGwgbW9kZWwuIFRoZSB2YXJpYWJsZXMgRkZNQyBhbmQgSVNJIHdlcmUgaGlnaGx5IGNvcnJlbGF0ZWQgd2l0aCBlYWNoIG90aGVyIGFuZCBzbyB3ZXJlIHRoZSB2YXJpYWJsZXMgRE1DIGFuZCBEQy4gVGhlc2UgbXVsdGljb2xsaW5lYXJpdHkgaXNzdWVzIHdlcmUgYWRkcmVzc2VkIHdoZW4gY3JlYXRpbmcgb3VyIGZpbmFsIG1vZGVsLg0KDQoNCiogQXJlIHRoZXJlIGFueSBtYWpvciBvdXRsaWVycyBpbiB0aGUgZGF0YSBzZXQgd2hpY2ggd291bGQgcHJvbXB0IGZ1cnRoZXIgZXhhbWluYXRpb24gdG8gc2VlIHdoYXQgaXMgZ29pbmcgb24gaW4gdGhhdCBvY2N1cnJlbmNlPyANCg0KWWVzLCB0aGlzIGRhdGEgZG9lcyBoYXZlIHNvbWUgb3V0bGllcnMgd2l0aGluIGl0LiBBZGRpdGlvbmFsbHksIGxvb2tpbmcgYXQgdGhlIHJlc2lkdWFsIHBsb3RzIGZvciBvdXIgZmluYWwgbW9kZWwgc2hvd2VkIHRoZSBwcmVzZW5jZSBvZiBzb21lIGhpZ2ggbGV2ZXJhZ2UgcG9pbnRzIGFzIHdlbGwuIFRoaXMgaXMgc29tZXRoaW5nIHdoaWNoIHdvdWxkIGJlIHdvcnRoIGxvb2tpbmcgaW50byBpbiBmdXJ0aGVyIGV4cGVyaW1lbnRhdGlvbiB0byBzZWUgd2h5IHRoZXJlIGFyZSB0aGVzZSBleHRyZW1lIG9ic2VydmF0aW9ucyB3aXRoaW4gdGhlIGRhdGEgc2V0LiANCg0KDQoqIElzIHRoaXMgZGF0YSBzZXQgZnJvbSBNb250ZXNpbmhvIE5hdGlvbmFsIFBhcmsgYXBwbGljYWJsZSB0byB0aGUgb3ZlcmFsbCBzY29wZSBvZiBmb3Jlc3QgZmlyZXMgYXJvdW5kIHRoZSB3b3JsZD8gSXMgb3VyIGRhdGEgc2V0IHJlcHJlc2VudGF0aXZlIG9mIGZvcmVzdCBmaXJlcyBvZiBhbGwgbG9jYXRpb25zPyANCg0KVGhpcyBpcyBhIHF1ZXN0aW9uIHdoaWNoIHdlIGRvIG5vdCBoYXZlIGVub3VnaCBpbmZvcm1hdGlvbiB0byBhbnN3ZXIgd2l0aCBwZXJmZWN0IGFjY3VyYWN5IGJlY2F1c2UgdGhpcyBwcm9qZWN0IG9ubHkgbG9va2VkIGF0IHRoZSBkYXRhIGZvciBNb250ZXNpbmhvIE5hdGlvbmFsIFBhcmssIG5vdCBhbnkgb3RoZXIgcGxhY2VzIGFmZmVjdGVkIGJ5IGZvcmVzdCBmaXJlcy4gSG93ZXZlciwgdGhlIGRhdGEgc2V0IHdhcyBzdWZmaWNpZW50bHkgbGFyZ2Ugc3VnZ2VzdGluZyB0aGF0IGl0IHNlcnZlcyBzaWduaWZpY2FuY2UgaW4gcmVwcmVzZW50aW5nIGl0cyBwb3B1bGF0aW9uLiBXZSBjYW4gbm90IHNheSB3aXRoIHBlcmZlY3QgYWNjdXJhY3kgd2hldGhlciB0aGlzIGRhdGEgc2V0IGRvZXMgb3IgZG9lcyBub3QgcmVwcmVzZW50IGV2ZXJ5IHNpbmdsZSBsb2NhdGlvbiBhZmZlY3RlZCBieSBmb3Jlc3QgZmlyZXMsIGJ1dCB0aGlzIGRhdGEgc2V0IHByb3ZpZGVkIGdyZWF0IHVzZSBpbiBjcmVhdGluZyBhIG1vZGVsIHdoaWNoIGNvbnNpZGVycyB2YXJpb3VzIGZhY3RvcnMgd2hpY2ggY2FuIGFmZmVjdCB0aGUgYXJlYSBidXJuZWQgYnkgYSBmb3Jlc3QgZmlyZS4NCg0KKiBIb3cgdXNlZnVsIGlzIHRoZSBtb2RlbCB3ZSB3aWxsIGNyZWF0ZSBpbiBwcmVkaWN0aW5nIHRoZSBhcmVhIGFmZmVjdGVkIGJ5IGEgZm9yZXN0IGZpcmU/IEFuZCwgaG93IGNhbiB0aGlzIGRhdGEgaGVscCB3aXRoIHByZWRpY3RpbmcgcGF0dGVybnMgb2YgZm9yZXN0IGZpcmVzIGluIG9yZGVyIHRvIG1pbmltaXplIHRoZSBkYW1hZ2UgdGhleSBjYXVzZT8NCg0KVGhyb3VnaCB0aGUgYW5hbHlzaXMgYW5kIGNyZWF0aW9uIG9mIHRoZSBmaW5hbCBtb2RlbCwgd2UgZGlkIGZpbmQgdGhhdCBvdXIgbW9kZWwgc2hvd2VkIHN0YXRpc3RpY2FsIHNpZ25pZmljYW5jZSBpbiB0aGUgcHJlZGljdGlvbiBhbmQgZXN0aW1hdGlvbiBvZiB0aGUgYXJlYSBhZmZlY3RlZCBieSBmb3Jlc3QgZmlyZXMgd2l0aCBhIHAtdmFsdWUgb2YgcCA9IDAuMDAxNCBpbiBvdXIgZmluYWwgbW9kZWwsIHRoZSBsb2dhcml0aG1pYyB0cmFuc2Zvcm1hdGlvbiBvZiBhcmVhLiANCg0KDQoNCiMjIEZ1cnRoZXIgRGlzY3Vzc2lvbg0KDQpTb21lIG9mIHRoZSBtYWpvciBmaW5kaW5ncyBvZiB0aGlzIHByb2plY3Qgd2FzIHRoYXQgdGhlIGZpbmFsIG1vZGVsIHRoYXQgd2FzIGNyZWF0ZWQgd2FzIGluIGZhY3Qgc3RhdGlzdGljYWxseSBzaWduaWZpY2FudC4gVGhpcyBpbmRpY2F0ZXMgdGhhdCB0aGlzIGZpbmFsIG1vZGVsIGNhbiBiZSB1c2VmdWwgaW4gcHJlZGljdGluZyB0aGUgYXJlYSB0aGF0IHdpbGwgYmUgYWZmZWN0ZWQgYnkgZm9yZXN0IGZpcmVzIGJhc2VkIHVwb24gdGhlIGNvbWJpbmVkIGVmZmVjdCBvZiB0aGUgdmFyaW91cyB2YXJpYWJsZXMgaW4gdGhpcyBtb2RlbC4gVGhpcyBjb3VsZCBiZSBoZWxwZnVsIGZvciBjYWxjdWxhdGluZyBpbiBhZHZhbmNlIGhvdyBtdWNoIGRhbWFnZSBhIGZvcmVzdCBmaXJlIGNvdWxkIHBvdGVudGlhbGx5IGNhdXNlIGJhc2VkIHVwb24gdGhlIGNvbmRpdGlvbnMgb2YgdGhlIGVudmlyb25tZW50IGluIHdoaWNoIGl0IHdpbGwgb2NjdXIuIFRoaXMgY291bGQgYmUgdXNlZCB0byBoZWxwIG1pbmltaXplIHRoZSBkYW1hZ2UgYnkgaGF2aW5nIGtub3dsZWRnZSBpbiBhZHZhbmNlIGFib3V0IHRoZSBkYW1hZ2VzIHdoaWNoIGNvdWxkIG9jY3VyIGJhc2VkIHVwb24gdGhlIGtub3duIGNvbmRpdGlvbnMuIA0KDQoNCg0KIyBDb25jbHVzaW9ucyBhbmQgUmVjb21tZW5kYXRpb25zDQoNCk92ZXJhbGwsIHRoZSBmaW5hbCBtb2RlbCBvZiB0aGlzIHByb2plY3Qgc2hvd2VkIGl0c2VsZiB0byBiZSBzdGF0aXN0aWNhbGx5IHNpZ25pZmljYW50IGluIGl0cyBwcmVkaWN0aW9uIGFuZCBlc3RpbWF0aW9uIG9mIHRoZSBhcmVhIG9mIGxhbmQgYWZmZWN0ZWQgYnkgZm9yZXN0IGZpcmVzIGJhc2VkIHVwb24gYSBjb21iaW5hdGlvbiBvZiBmYWN0b3JzLiBUaGlzIGNvdWxkIHByb3ZpZGUgdXNlIGluIHRoZSBwcmV2ZW50aW9uIG9mIHRoZSBkYW1hZ2VzIGNhdXNlZCBieSBmb3Jlc3QgZmlyZXMgaWYgdGhlIGNvbmRpdGlvbnMgd2VyZSBrbm93biBpbiBhZHZhbmNlLiBCeSBoYXZpbmcgdGhlIGtub3dsZWRnZSBvZiB0aGUgYXJlYSBvZiBsYW5kIHdoaWNoIGNvdWxkIGJlIGltcGFjdGVkIGJ5IGEgZm9yZXN0IGZpcmUgYmFzZWQgdXBvbiB0aGUgY29uZGl0aW9ucyBhdCBoYW5kLCB0aGlzIGNvdWxkIHByb3ZpZGUgcmVzY3VlcnMgd2l0aCBzb21lIGtub3dsZWRnZSBpbiBhZHZhbmNlIHRvIGhlbHAgZmlnaHQgdGhlIGZvcmVzdCBmaXJlcyBhbmQgaG9wZWZ1bGx5IG1pbmltaXplIHRoZSBkYW1hZ2UgY2F1c2VkIGJ5IGhhdmluZyBzb21lIGtub3dsZWRnZSBpbiBhZHZhbmNlIHJlZ2FyZGluZyB0aGUgZGFtYWdlIHBvdGVudGlhbCBvZiB0aGUgZm9yZXN0IGZpcmUuIA0KDQoNClNvbWUgcmVjb21tZW5kYXRpb25zIEkgd291bGQgc3VnZ2VzdCBmb3IgZnVydGhlciBleHBlcmltZW50YXRpb24gYXJlOg0KDQoqIFNpbmNlIHRoZSBkYXRhIGluIHRoaXMgZXhwZXJpbWVudCB3YXMgYWxsIGNvbGxlY3RlZCB3aXRoaW4gTW9udGVzaW5obyBOYXR1cmFsIFBhcmssIGNvbnNpZGVyIGV4cGFuZGluZyB0aGUgZGF0YSBjb2xsZWN0aW9uIHRvIGluY2x1ZGUgb3RoZXIgcGxhY2VzIGFuZCBvdGhlcnMgbmF0dXJhbCBwYXJrcyB0byBkZXRlcm1pbmUgd2hldGhlciB0aGUgY29uY2x1c2lvbnMgZHJhd24gZnJvbSB0aGlzIGRhdGEgdHJ1bHkgYXJlIGFwcGxpY2FibGUgdG8gYWxsIGZvcmVzdCBmaXJlcyByZWdhcmRsZXNzIG9mIGxvY2F0aW9uLg0KDQoqIENvbnNpZGVyIG90aGVyIGZhY3RvcnMgd2hpY2ggbWF5IGhhdmUgYW4gaW1wYWN0IG9uIHRoZSBhcmVhIGFmZmVjdGVkIGJ5IGZvcmVzdCBmaXJlcy4gU29tZSBpZGVhcyB3aGljaCBjb21lIHRvIG1pbmQgaW5jbHVkZSB0aW1lIGl0IHRha2VzIHRvIHJlYWNoIHRoZSBuZWFyZXN0IGZpcmUgc3RhdGlvbiwgb3RoZXIgd2VhdGhlciBjb25kaXRpb25zIGxpa2Ugc25vdyBvciBmb2csIG9yIHZvbHVtZSwgZGVuc2l0eSwgYW5kIHNpemUgb2YgdGhlIHRyZWVzIG9yIGZvcmVzdCBpbiB0aGUgZ2l2ZW4gYXJlYSB0aGF0IGlzIGFmZmVjdGVkLg0KDQoqIER1ZSB0byB0aGUgdW5wcmVkaWN0YWJsZSBuYXR1cmUgb2YgZm9yZXN0IGZpcmVzIGFuZCBvdGhlciBuYXR1cmFsIGRpc2FzdGVycywgaXQgY2FuIGJlIGhhcmQgdG8gaGF2ZSBwZXJmZWN0IGFjY3VyYWN5IGluIHRoZSBkYXRhIGNvbGxlY3RlZCwgc3BlY2lmaWNhbGx5IHRoZSBwcmVjaXNlIGFuZCBleGFjdCBhcmVhIG9mIGZvcmVzdCB0aGF0IHdhcyBhZmZlY3RlZCwgc28gZnVydGhlciBleHBlcmltZW50cyBjb3VsZCBjb25zaWRlciBleHBhbmRpbmcgdGhlIHNhbXBsZSBzaXplIHRvIGVuc3VyZSB0aGUgYWNjdXJhY3kgb2YgdGhlIHJlc3VsdHMgYW5kIHJlY29yZGluZ3MgaW4gdGhpcyBleHBlcmltZW50LiANCg0KDQpBbHRvZ2V0aGVyLCB0aGUgZmluYWwgbW9kZWwgZm9yIHRoZSBsb2dhcml0aG1pYyB0cmFuc2Zvcm1hdGlvbiBvZiBhcmVhIHByb3ZpZGVzIHN0YXRpc3RpY2FsIHNpZ25pZmljYW5jZSBpbiB0aGUgcHJlZGljdGlvbiBvZiB0aGUgYXJlYSBhZmZlY3RlZCBieSBmb3Jlc3QgZmlyZXMgd2hpY2ggY291bGQgcHJvdmlkZSB1c2UgYnkgaGF2aW5nIGtub3dsZWRnZSBpbiBhZHZhbmNlIG9mIHdoaWNoIGZhY3RvcnMgYXQgaGFuZCBjb3VsZCBsZWFkIHRvIG1vcmUgZGFtYWdlIGZyb20gdGhlIGZvcmVzdCBmaXJlcy4gDQoNCg0KIA0KIyBSZWZlcmVuY2VzDQoNClRoaXMgZGF0YSBzZXQgd2FzIGZvdW5kIG9uIHRoZSB3ZWJzaXRlIGthZ2dsZS5jb20gdW5kZXIgdGhlIGNvbGxlY3Rpb24gb2YgZGF0YSBzZXRzLiBJbmNsdWRlZCBiZWxvdyBpcyB0aGUgY2l0YXRpb24gb2YgdGhlIHdlYnBhZ2Ugb24gd2hpY2ggdGhlIGRhdGEgc2V0IGNhbiBiZSBmb3VuZCBhcyB3ZWxsIGFzIHRoZSB3ZWJwYWdlIHdoaWNoIEkgbG9va2VkIGF0IHRvIGhlbHAgbWUgZmluZCBhIGRhdGEgc2V0IHdoaWNoIGNhdWdodCBteSBpbnRlcmVzdC4NCg0KRGFybGluZ3RvbiwgQS4gKDIwMTcsIFNlcHRlbWJlciA0KS4gRm9yZXN0IGZpcmVzIGRhdGEgc2V0LiBLYWdnbGUuIGh0dHBzOi8vd3d3LmthZ2dsZS5jb20vZGF0YXNldHMvZWxpa3BsaW0vZm9yZXN0LWZpcmVzLWRhdGEtc2V0IA0KDQoNCkt1bWFyIEEuICgyMDIzLCBOb3ZlbWJlciAxMCkuIExpbmVhciBSZWdyZXNzaW9uIERhdGFzZXRzOiBDU1YsIEV4Y2VsLg0KaHR0cHM6Ly92aXRhbGZsdXguY29tL2xpbmVhci1yZWdyZXNzaW9uLWRhdGFzZXRzLWNzdi1leGNlbC8jZ29vZ2xlX3ZpZ25ldHRlDQo=