1 Introduction

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

2 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.

2.1 Variables Descriptions

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.

2.2 Practical and Analytical Questions

The main question of this project is to investigate which factors have the greatest correlation and significance in predicting forest fires. Additionally, we would like to see if we can create a multiple linear regression model that significantly predicts the area burned within a forest fire based on the several factors that will be included within this model.

Some further, more specific questions which I thought of in regards to this data are given as follows:

  • What 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?

2.3 Exploratory Data 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.4 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 zero area observations left in, so this is good.

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 redudent 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 Multiple Linear Regression

The goal of this experiment is 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 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 definelty 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 of 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 unfortuantley 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 statistcially 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.

4 Summary of the Model

The regression equation for our final choice of a regression 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.

Let’s interpret the coefficients of some of the variables in our final model. Also, as a reminder of the variable section of this report, the response variable area is given in units of hectares.

  • 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.

5 Results and Discussion

Overall, it was the logarithmic transformation model which turned out to provide the most statistical significance for the prediction and estimation of the area burned by a forest fire. This was the final model that was chosen after the analysis of each of the potential final models.

This logarithmic model stood out for being the only model out of the final three options with a statistically significant p-value. Additionally, while this model still had some violations such as a slight deviation of normality in its Q-Q Plot and some high leverage points along with some potential outliers, it had much fewer violations than either of the other two models. These observations made it clear that this model was the best choice amongst the options that we had.

Out of all of the variables in our final model, the logarithmic transformation model, RH has the highest level of statistical significance. However, even this variable with the highest statistical significance had a p-value of 0.1905, which is greater than our value of alpha, 0.05. This indicates that while our model as a whole provides significant statistical significance with an overall p-value of 0.0014, the individual variables appear to have less notable significance than the overall model as a whole.

Overall, the logarithmic model was statistically significant in its prediction of the area burned by a forest fire, and this is the model which was chosen for prediction and estimation.

6 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

LS0tDQp0aXRsZTogIkZhY3RvcnMgQWZmZWN0aW5nIEZvcmVzdCBGaXJlcy0gTXVsdGlwbGUgTGluZWFyIFJlZ3Jlc3Npb24iDQphdXRob3I6ICJKb3NpZSBHYWxsb3AiDQpkYXRlOiAiMjAyNC0wOS0xNyINCm91dHB1dDoNCiAgaHRtbF9kb2N1bWVudDogDQogICAgdG9jOiB5ZXMNCiAgICB0b2NfZGVwdGg6IDQNCiAgICB0b2NfZmxvYXQ6IHllcw0KICAgIGZpZ193aWR0aDogNg0KICAgIGZpZ19jYXB0aW9uOiB5ZXMNCiAgICBudW1iZXJfc2VjdGlvbnM6IHllcw0KICAgIHRvY19jb2xsYXBzZWQ6IHllcw0KICAgIGNvZGVfZm9sZGluZzogaGlkZQ0KICAgIGNvZGVfZG93bmxvYWQ6IHllcw0KICAgIHNtb290aF9zY3JvbGw6IHllcw0KICAgIHRoZW1lOiBsdW1lbg0KICB3b3JkX2RvY3VtZW50OiANCiAgICB0b2M6IHllcw0KICAgIHRvY19kZXB0aDogNA0KICAgIGZpZ19jYXB0aW9uOiB5ZXMNCiAgICBrZWVwX21kOiB5ZXMNCiAgcGRmX2RvY3VtZW50OiANCiAgICB0b2M6IHllcw0KICAgIHRvY19kZXB0aDogNA0KICAgIGZpZ19jYXB0aW9uOiB5ZXMNCiAgICBudW1iZXJfc2VjdGlvbnM6IHllcw0KZWRpdG9yX29wdGlvbnM6IA0KICBjaHVua19vdXRwdXRfdHlwZTogY29uc29sZQ0KLS0tDQoNCmBgYHs9aHRtbH0NCg0KPHN0eWxlIHR5cGU9InRleHQvY3NzIj4NCg0KLyogQ2FzY2FkaW5nIFN0eWxlIFNoZWV0cyAoQ1NTKSBpcyBhIHN0eWxlc2hlZXQgbGFuZ3VhZ2UgdXNlZCB0byBkZXNjcmliZSB0aGUgcHJlc2VudGF0aW9uIG9mIGEgZG9jdW1lbnQgd3JpdHRlbiBpbiBIVE1MIG9yIFhNTC4gaXQgaXMgYSBzaW1wbGUgbWVjaGFuaXNtIGZvciBhZGRpbmcgc3R5bGUgKGUuZy4sIGZvbnRzLCBjb2xvcnMsIHNwYWNpbmcpIHRvIFdlYiBkb2N1bWVudHMuICovDQoNCmgxLnRpdGxlIHsgIC8qIFRpdGxlIC0gZm9udCBzcGVjaWZpY2F0aW9ucyBvZiB0aGUgcmVwb3J0IHRpdGxlICovDQogIGZvbnQtc2l6ZTogMjRweDsNCiAgY29sb3I6IERhcmtSZWQ7DQogIHRleHQtYWxpZ246IGNlbnRlcjsNCiAgZm9udC1mYW1pbHk6ICJHaWxsIFNhbnMiLCBzYW5zLXNlcmlmOw0KfQ0KaDQuYXV0aG9yIHsgLyogSGVhZGVyIDQgLSBmb250IHNwZWNpZmljYXRpb25zIGZvciBhdXRob3JzICAqLw0KICBmb250LXNpemU6IDIwcHg7DQogIGZvbnQtZmFtaWx5OiBzeXN0ZW0tdWk7DQogIGNvbG9yOiBEYXJrUmVkOw0KICB0ZXh0LWFsaWduOiBjZW50ZXI7DQp9DQpoNC5kYXRlIHsgLyogSGVhZGVyIDQgLSBmb250IHNwZWNpZmljYXRpb25zIGZvciB0aGUgZGF0ZSAgKi8NCiAgZm9udC1zaXplOiAxOHB4Ow0KICBmb250LWZhbWlseTogc3lzdGVtLXVpOw0KICBjb2xvcjogRGFya0JsdWU7DQogIHRleHQtYWxpZ246IGNlbnRlcjsNCn0NCmgxIHsgLyogSGVhZGVyIDEgLSBmb250IHNwZWNpZmljYXRpb25zIGZvciBsZXZlbCAxIHNlY3Rpb24gdGl0bGUgICovDQogICAgZm9udC1zaXplOiAyMnB4Ow0KICAgIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOw0KICAgIGNvbG9yOiBuYXZ5Ow0KICAgIHRleHQtYWxpZ246IGNlbnRlcjsNCn0NCmgyIHsgLyogSGVhZGVyIDIgLSBmb250IHNwZWNpZmljYXRpb25zIGZvciBsZXZlbCAyIHNlY3Rpb24gdGl0bGUgKi8NCiAgICBmb250LXNpemU6IDIwcHg7DQogICAgZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iLCBUaW1lcywgc2VyaWY7DQogICAgY29sb3I6IG5hdnk7DQogICAgdGV4dC1hbGlnbjogbGVmdDsNCn0NCg0KaDMgeyAvKiBIZWFkZXIgMyAtIGZvbnQgc3BlY2lmaWNhdGlvbnMgb2YgbGV2ZWwgMyBzZWN0aW9uIHRpdGxlICAqLw0KICAgIGZvbnQtc2l6ZTogMThweDsNCiAgICBmb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiIsIFRpbWVzLCBzZXJpZjsNCiAgICBjb2xvcjogbmF2eTsNCiAgICB0ZXh0LWFsaWduOiBsZWZ0Ow0KfQ0KDQpoNCB7IC8qIEhlYWRlciA0IC0gZm9udCBzcGVjaWZpY2F0aW9ucyBvZiBsZXZlbCA0IHNlY3Rpb24gdGl0bGUgICovDQogICAgZm9udC1zaXplOiAxOHB4Ow0KICAgIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOw0KICAgIGNvbG9yOiBkYXJrcmVkOw0KICAgIHRleHQtYWxpZ246IGxlZnQ7DQp9DQoNCmJvZHkgeyBiYWNrZ3JvdW5kLWNvbG9yOndoaXRlOyB9DQoNCi5oaWdobGlnaHRtZSB7IGJhY2tncm91bmQtY29sb3I6eWVsbG93OyB9DQoNCnAgeyBiYWNrZ3JvdW5kLWNvbG9yOndoaXRlOyB9DQoNCjwvc3R5bGU+DQpgYGANCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQ0KIyBEZXRlY3QsIGluc3RhbGwsIGFuZCBsb2FkIHBhY2thZ2VzIGlmIG5lZWRlZC4NCmlmICghcmVxdWlyZSgia25pdHIiKSkgew0KICAgaW5zdGFsbC5wYWNrYWdlcygia25pdHIiKQ0KICAgbGlicmFyeShrbml0cikNCn0NCmlmICghcmVxdWlyZSgibGVhZmxldCIpKSB7DQogICBpbnN0YWxsLnBhY2thZ2VzKCJsZWFmbGV0IikNCiAgIGxpYnJhcnkobGVhZmxldCkNCn0NCmlmICghcmVxdWlyZSgiRW52U3RhdHMiKSkgew0KICAgaW5zdGFsbC5wYWNrYWdlcygiRW52U3RhdHMiKQ0KICAgbGlicmFyeShFbnZTdGF0cykNCn0NCmlmICghcmVxdWlyZSgiTUFTUyIpKSB7DQogICBpbnN0YWxsLnBhY2thZ2VzKCJNQVNTIikNCiAgIGxpYnJhcnkoTUFTUykNCn0NCmlmICghcmVxdWlyZSgicGh5dG9vbHMiKSkgew0KICAgaW5zdGFsbC5wYWNrYWdlcygicGh5dG9vbHMiKQ0KICAgbGlicmFyeShwaHl0b29scykNCn0NCmlmKCFyZXF1aXJlKCJkcGx5ciIpKSB7DQogICBpbnN0YWxsLnBhY2thZ2VzKCJkcGx5ciIpDQogICBsaWJyYXJ5KGRwbHlyKQ0KfQ0KaWYoIXJlcXVpcmUoInRpZHl2ZXJzZSIpKSB7DQogICBpbnN0YWxsLnBhY2thZ2VzKCJ0aWR5dmVyc2UiKQ0KICAgbGlicmFyeSh0aWR5dmVyc2UpDQp9DQppZighcmVxdWlyZSgiR0dhbGx5IikpIHsNCiAgIGluc3RhbGwucGFja2FnZXMoIkdHYWxseSIpDQogICBsaWJyYXJ5KEdHYWxseSkNCn0NCmlmKCFyZXF1aXJlKCJ1c2RtIikpIHsNCiAgIGluc3RhbGwucGFja2FnZXMoInVzZG0iKQ0KICAgbGlicmFyeSh1c2RtKQ0KfQ0KaWYoIXJlcXVpcmUoImNhciIpKSB7DQogICBpbnN0YWxsLnBhY2thZ2VzKCJjYXIiKQ0KICAgbGlicmFyeShjYXIpDQp9DQoNCiMgU3BlY2lmaWNhdGlvbnMgb2Ygb3V0cHV0cyBvZiBjb2RlIGluIGNvZGUgY2h1bmtzDQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IEZBTFNFLCAgIyBpbmNsdWRlIGNvZGUgY2h1bmsgaW4gdGhlIG91dHB1dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlDQogICAgICAgICAgICAgICAgICAgd2FybmluZyA9IEZBTFNFLCAgIyBTb21ldGltZXMsIHlvdXIgY29kZSBtYXkgcHJvZHVjZSBhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YXJuaW5nDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBtZXNzYWdlcywgeW91IGNhbiBjaG9vc2UgdG8gaW5jbHVkZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHdhcm5pbmcgbWVzc2FnZXMgaW4gdGhlIG91dHB1dCBmaWxlLiANCiAgICAgICAgICAgICAgICAgICBtZXNzYWdlID0gRkFMU0UsICANCiAgICAgICAgICAgICAgICAgICByZXN1bHRzID0gVFJVRSwgICAjIHlvdSBjYW4gYWxzbyBkZWNpZGUgd2hldGhlciB0byAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluY2x1ZGUgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyB0aGUgb3V0cHV0IGluIHRoZSBvdXRwdXQgZmlsZS4NCiAgICAgICAgICAgICAgICAgICBjb21tZW50ID0gTkEgICAgICAjIFN1cHByZXNzIGhhc2gtdGFncyBpbiB0aGUgb3V0cHV0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdHMuDQogICAgICAgICAgICAgICAgICAgICAgKSAgIA0KYGBgDQoNCg0KIyBJbnRyb2R1Y3Rpb24NCg0KRGF0YSB3YXMgY29sbGVjdGVkIHRvIG9ic2VydmUgd2hpY2ggZmFjdG9ycyBoYXZlIHRoZSBncmVhdGVzdCBpbXBhY3Qgb24gdGhlIGFyZWEgb2YgbGFuZCBidXJuZWQgaW4gYSBmb3Jlc3QgZmlyZS4gDQoNCg0KIyBEYXRhIERlc2NyaXB0aW9uDQoNCkkgZm91bmQgdGhpcyBkYXRhIHNldCBvbiBrYWdnbGUuY29tIG9uIHRoZSBmb2xsb3dpbmcgd2VicGFnZTogaHR0cHM6Ly93d3cua2FnZ2xlLmNvbS9kYXRhc2V0cy9lbGlrcGxpbS9mb3Jlc3QtZmlyZXMtZGF0YS1zZXQuIFRoZSBkYXRhIHNldCBpcyBuYW1lZCBhcyAiZm9yZXN0ZmlyZXMuY3N2Ii4NCg0KVGhpcyBkYXRhIHNldCB1c2VzIG1ldGVvcm9sb2dpY2FsIGRhdGEgdG8gcHJlZGljdCB0aGUgYXBwcm94aW1hdGVkIGFyZWEgd2hpY2ggd2lsbCBiZSBidXJuZWQgaW4gZm9yZXN0IGZpcmVzIGJhc2VkIHVwb24gdGhlc2UgdmFyaW91cyBmYWN0b3JzLiBUaGlzIGFsbG93cyB1cyB0byBpbnZlc3RpZ2F0ZSB0aGUgZmFjdG9ycyB3aGljaCBoYXZlIGFuIGltcGFjdCBvbiB0aGUgYXJlYSBvZiBsYW5kIHdoaWNoIGlzIGJ1cm5lZCBieSBhIGZvcmVzdCBmaXJlLiBTdWNoIGRhdGEgaXMgaW5jcmVkaWJseSB1c2VmdWwgaW4gb3JkZXIgdG8gaGVscCBrbm93IHdoaWNoIGZhY3RvcnMgaGF2ZSB0aGUgZ3JlYXRlc3Qgc2lnbmlmaWNhbmNlIG9uIHRoZSBhcmVhIGFmZmVjdGVkIGJ5IGEgZm9yZXN0IGZpcmUsIGJlY2F1c2UgdGhpcyBjb3VsZCBoZWxwIHByb3ZpZGUgbmVjY2Vzc2FyeSBkYXRhIHRvIGhlbHAgbWluaW1pemUgdGhlIGFyZWEgZGFtYWdlZCBieSBmb3Jlc3QgZmlyZXMuIA0KDQpUaGUgZGF0YSBpbiB0aGlzIGRhdGEgc2V0IHdhcyBjb2xsZWN0ZWQgYXJvdW5kIHRoZSBNb250ZXNpbmhvIE5hdHVyYWwgUGFyayB3aGljaCBpcyBsb2NhdGVkIGluIFBvcnR1Z2FsLiBUaGUgZGF0YSB3YXMgY29sbGVjdGVkIGZyb20gNTE3IG9ic2VydmF0aW9ucyBvZiBmb3Jlc3QgZmlyZXMgd2hpY2ggb2NjdXJyZWQgd2l0aGluIHRoaXMgbmF0aW9uYWwgcGFyay4gVG8gZnVydGhlciBlbmhhbmNlIHRoZSBkYXRhIGNvbGxlY3Rpb24sIHJlc2VhcmNoZXJzIGRpdmlkZWQgdXAgdGhlIG5hdGlvbmFsIHBhcmsgaW50byBhIHNldCBvZiBzcGF0aWFsIGNvb3JkaW5hdGVzIHRvIHBpbnBvaW50IHRoZSBwcmVjaXNlIGxvY2F0aW9uIG9mIHRoZSBmb3Jlc3QgZmlyZXMgd2l0aGluIE1vbnRlc2luaG8gTmF0dXJhbCBQYXJrLiBUaGUgbmF0aW9uYWwgcGFyayB3YXMgZGl2aWRlZCBpbnRvIHgtYXhpcyBhbmQgeS1heGlzIHNwYXRpYWwgY29vcmRpbmF0ZXMsIHdpdGggdGhlIHgtYXhpcyBjb29yZGluYXRlcyByYW5naW5nIGZyb20gMSB0byA5LCBhbmQgdGhlIHktYXhpcyBjb29yZGluYXRlcyByYW5naW5nIGZyb20gMiB0byA5LiBFYWNoIG9ic2VydmF0aW9uIHdhcyBwaW5wb2ludGVkIHRvIHRoZSBjb29yZGluYXRlIGxvY2F0aW9uIG9mIHdoZXJlIHRoZSBmb3Jlc3QgZmlyZSBiZWdhbi4gDQoNCg0KIyMgVmFyaWFibGVzIERlc2NyaXB0aW9ucw0KDQpUaGVyZSBhcmUgMTMgdmFyaWFibGVzIGluIHRoZSBmb3Jlc3RmaXJlcyBkYXRhIHNldC4NCg0KKiBYOiBUaGUgeC1heGlzIHNwYXRpYWwgY29vcmRpbmF0ZSBvZiB0aGUgZm9yZXN0IGZpcmUncyBsb2NhdGlvbiB3aXRoaW4gICAgICBNb250ZXNpbmhvIE5hdHVyYWwgUGFyay4gQSBudW1lcmljIHZhbHVlIHJhbmdpbmcgZnJvbSAxIHRvIDkuDQoNCiogWTogVGhlIHktYXhpcyBzcGF0aWFsIGNvb3JkaW5hdGUgb2YgdGhlIGZvcmVzdCBmaXJlJ3MgbG9jYXRpb24gd2l0aGluICAgICAgTW9udGVzaW5obyBOYXR1cmFsIFBhcmsuIEEgbnVtZXJpYyB2YWx1ZSByYW5naW5nIGZyb20gMiB0byA5Lg0KDQoqIG1vbnRoOiBUaGUgbW9udGggb2YgdGhlIHllYXIgaW4gd2hpY2ggdGhlIGZvcmVzdCBmaXJlIG9jY3VycmVkLiBBICAgICAgICAgIGNhdGVnb3JpY2FsLCBjaGFyYWN0ZXIgdmFyaWFibGUgd2l0aCB0aGUgbG93ZXJjYXNlIGFiYnJldmlhdGlvbiBvZiB0aGUgICAgIGZpcnN0IHRocmVlIGxldHRlcnMgb2YgdGhlIG1vbnRoLiAoRm9yIGV4YW1wbGU6IGZlYiwgb2N0LCBkZWMpDQoNCiogZGF5OiBUaGUgZGF5IG9mIHRoZSB3ZWVrIG9uIHdoaWNoIHRoZSBmb3Jlc3QgZmlyZSBvY2N1cnJlZC4gQSAgICAgICAgICAgICAgY2F0ZWdvcmljYWwsIGNoYXJhY3RlciB2YXJpYWJsZSB3aXRoIHRoZSBsb3dlcmNhc2UgYWJicmV2aWF0aW9uIG9mIHRoZSAgICAgZmlyc3QgdGhyZWUgbGV0dGVycyBvZiB0aGUgbW9udGguIChGb3IgZXhhbXBsZTogbW9uLCB0dWUsIHNhdCkNCg0KKiBGRk1DOiBGRk1DIGluZGV4IGZyb20gdGhlIEZXSSBTeXN0ZW0uIEEgbnVtZXJpYywgcXVhbnRpdGF0aXZlIHZhcmlhYmxlLiAgICBUaGUgRldJIFN5c3RlbSBzdGFuZHMgZm9yIHRoZSBGaXJlIFdlYXRoZXIgSW5kZXggU3lzdGVtIGFuZCBpdCBpcyBhICAgICAgICBzeXN0ZW0gdGhhdCBwcm92aWRlcyBhIG51bWVyaWMgcmF0aW5nIG9uIGEgc2NhbGUgZm9yIHRoZSBpbnRlbnNpdHkgb2YgYSAgICBmaXJlLiBGRk1DIHN0YW5kcyBmb3IgRmluZSBGdWVsIE1vaXN0dXJlIENvZGUgYW5kIGl0IGlzIGEgbWVhc3VyZSBvZiAgICAgICB0aGUgbW9pc3R1cmUgY29udGVudCBvZiBsaXR0ZXIgYW5kIG90aGVyIGZ1ZWxzIGZvciBhIGZpcmUgdGhhdCBhcmUgICAgICAgICBwcmVzZW50Lg0KDQoqIERNQzogRE1DIGluZGV4IGZyb20gdGhlIEZXSSBTeXN0ZW0uIEEgbnVtZXJpYywgcXVhbnRpdGF0aXZlIHZhcmlhYmxlLiBETUMgICBzdGFuZHMgZm9yIERlZXAgTW9pc3QgQ29udmVjdGlvbiBhbmQgaXQgaXMgYSBtZWFzdXJlIG9mIGRlY29tcG9zZWQgICAgICAgICBvcmdhbmljIG1hdGVyaWFsIHVuZGVybmVhdGggdGhlIGxpdHRlciB3aGljaCBmdWVscyB0aGUgZmlyZS4gDQoNCiogREM6IERDIGluZGV4IGZyb20gdGhlIEZXSSBTeXN0ZW0uIEEgbnVtZXJpYywgcXVhbnRpdGF0aXZlIHZhcmlhYmxlLiBEQyAgICAgc3RhbmRzIGZvciBEcm91Z2h0IENvZGUgYW5kIGlzIGEgbWVhc3VyZSBvZiB0aGUgbW9pc3R1cmUgY29udGVudCBvZiAgICAgICAgY29tcGFjdCBvcmdhbmljIGxheWVycyBpbiB0aGUgYXJlYSBhZmZlY3RlZCBieSB0aGUgZmlyZS4gDQoNCiogSVNJOiBJU0kgaW5kZXggZnJvbSB0aGUgRldJIFN5c3RlbS4gQSBudW1lcmljLCBxdWFudGl0YXRpdmUgdmFyaWFibGUuIElTSSAgIHN0YW5kcyBmb3IgSW5pdGlhbCBTcHJlYWQgSW5kZXggYW5kIGlzIGEgbWVhc3VyZSBvZiB0aGUgZXhwZWN0ZWQgcmF0ZSBvZiAgIGZpcmUgc3ByZWFkLiANCg0KKiB0ZW1wOiBUaGUgdGVtcGVyYXR1cmUgZ2l2ZW4gaW4gZGVncmVlcyBDZWxzaXVzLiBBIG51bWVyaWMsIHF1YW50aXRhdGl2ZSAgICB2YXJpYWJsZS4NCg0KKiBSSDogVGhlIHJlbGF0aXZlIGh1bWlkaXR5IGdpdmVuIGFzIGEgcGVyY2VudGFnZS4gQSBudW1lcmljLCBxdWFudGl0YXRpdmUgICAgdmFyaWFibGUuDQoNCiogd2luZDogVGhlIHNwZWVkIG9mIHRoZSB3aW5kIGdpdmVuIGluIGtpbG9tZXRlcnMgcGVyIGhvdXIgKGttL2gpLiBBICAgICAgICAgbnVtZXJpYywgcXVhbnRpdGF0aXZlIHZhcmlhYmxlLg0KDQoqIHJhaW46IFRoZSByYWluIG9jY3VycmluZyBvdXRzaWRlIGdpdmVuIGluIGEgbWVhc3VyZW1lbnQgb2YgbW0vbV4yLiBBICAgICAgIG51bWVyaWMsIHF1YW50aXRhdGl2ZSB2YXJpYWJsZS4gDQoNCiogYXJlYTogVGhlIGFyZWEgb2YgdGhlIGZvcmVzdCB3aGljaCB3YXMgYnVybmVkIGJ5IHRoZSBmaXJlLiBNZWFzdXJlZCBpbiAgICAgdW5pdHMgb2YgaGVjdGFyZXMgKGhhKS4gQSBudW1lcmljLCBxdWFudGl0YXRpdmUgdmFyaWFibGUuIFRoZSByZXNwb25zZSAgICAgdmFyaWFibGUgb2YgdGhpcyBleHBlcmltZW50YWwgc3R1ZHkuIA0KDQoNCiMjIFByYWN0aWNhbCBhbmQgQW5hbHl0aWNhbCBRdWVzdGlvbnMNCg0KVGhlIG1haW4gcXVlc3Rpb24gb2YgdGhpcyBwcm9qZWN0IGlzIHRvIGludmVzdGlnYXRlIHdoaWNoIGZhY3RvcnMgaGF2ZSB0aGUgZ3JlYXRlc3QgY29ycmVsYXRpb24gYW5kIHNpZ25pZmljYW5jZSBpbiBwcmVkaWN0aW5nIGZvcmVzdCBmaXJlcy4gQWRkaXRpb25hbGx5LCB3ZSB3b3VsZCBsaWtlIHRvIHNlZSBpZiB3ZSBjYW4gY3JlYXRlIGEgbXVsdGlwbGUgbGluZWFyIHJlZ3Jlc3Npb24gbW9kZWwgdGhhdCBzaWduaWZpY2FudGx5IHByZWRpY3RzIHRoZSBhcmVhIGJ1cm5lZCB3aXRoaW4gYSBmb3Jlc3QgZmlyZSBiYXNlZCBvbiB0aGUgc2V2ZXJhbCBmYWN0b3JzIHRoYXQgd2lsbCBiZSBpbmNsdWRlZCB3aXRoaW4gdGhpcyBtb2RlbC4NCg0KU29tZSBmdXJ0aGVyLCBtb3JlIHNwZWNpZmljIHF1ZXN0aW9ucyB3aGljaCBJIHRob3VnaHQgb2YgaW4gcmVnYXJkcyB0byB0aGlzIGRhdGEgYXJlIGdpdmVuIGFzIGZvbGxvd3M6DQoNCiogV2hhdCBmYWN0b3JzIGhhdmUgdGhlIGdyZWF0ZXN0IHNpZ25pZmljYW5jZSBpbiBwcmVkaWN0aW5nIHRoZSBhcmVhIGJ1cm5lZCBieSBhIGZvcmVzdCBmaXJlPw0KDQoqIFdoaWNoIGZhY3RvcnMgaGF2ZSB0aGUgaGlnaGVzdCBjb3JyZWxhdGlvbiB3aXRoIGVhY2ggb3RoZXI/IEFuZCwgd2hhdCBhcmUgc29tZSBwb3NzaWJsZSBleHBsYW5hdGlvbnMgZm9yIHRoZXNlIGZhY3RvcnMgaGF2ZSB0aGUgZ3JlYXRlc3QgY29ycmVsYXRpb24/IA0KKiBBcmUgdGhlcmUgYW55IG1ham9yIG91dGxpZXJzIGluIHRoZSBkYXRhIHNldCB3aGljaCB3b3VsZCBwcm9tcHQgZnVydGhlciBleGFtaW5hdGlvbiB0byBzZWUgd2hhdCBpcyBnb2luZyBvbiBpbiB0aGF0IG9jY3VycmVuY2U/IA0KDQoqIElzIHRoaXMgZGF0YSBzZXQgZnJvbSBNb250ZXNpbmhvIE5hdGlvbmFsIFBhcmsgYXBwbGljYWJsZSB0byB0aGUgb3ZlcmFsbCBzY29wZSBvZiBmb3Jlc3QgZmlyZXMgYXJvdW5kIHRoZSB3b3JsZD8gSXMgb3VyIGRhdGEgc2V0IHJlcHJlc2VudGF0aXZlIG9mIGZvcmVzdCBmaXJlcyBvZiBhbGwgbG9jYXRpb25zPyANCg0KKiBIb3cgdXNlZnVsIGlzIHRoZSBtb2RlbCB3ZSB3aWxsIGNyZWF0ZSBpbiBwcmVkaWN0aW5nIHRoZSBhcmVhIGFmZmVjdGVkIGJ5IGEgZm9yZXN0IGZpcmU/IEFuZCwgaG93IGNhbiB0aGlzIGRhdGEgaGVscCB3aXRoIHByZWRpY3RpbmcgcGF0dGVybnMgb2YgZm9yZXN0IGZpcmVzIGluIG9yZGVyIHRvIG1pbmltaXplIHRoZSBkYW1hZ2UgdGhleSBjYXVzZT8NCg0KDQoNCiMjIEV4cGxvcmF0b3J5IERhdGEgQW5hbHlzaXMNCg0KVG8gYmVnaW4sIGxldCdzIHJlYWQgaW4gdGhlIGRhdGEgc2V0IGZyb20gR2l0aHViLg0KYGBge3J9DQpmb3Jlc3RmaXJlcyA8LSByZWFkLmNzdigiaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL0pvc2llR2FsbG9wL1NUQTMyMS9tYWluL2RhdGFzZXQvZm9yZXN0ZmlyZXMuY3N2IiwgaGVhZGVyPVRSVUUpDQoNCnN0cihmb3Jlc3RmaXJlcykNCmBgYA0KDQoNClRoZSBkYXRhIHdhcyBjb2xsZWN0ZWQgYnkgcGlucG9pbnRpbmcgdGhlIGZvcmVzdCBmaXJlJ3MgbG9jYXRpb24gb2Ygb3JpZ2luIGZyb20gYSBzeXN0ZW0gb2Ygc3BhdGlhbCBjb29yZGluYXRlcyBhcm91bmQgTW9udGVzaW5obyBOYXR1cmFsIFBhcmsuIFNvLCB3ZSB3aWxsIGNyZWF0ZSBhIGdyYXBoIHRvIGhlbHAgdmlzdWFsaXplIHRoZSBsb2NhdGlvbnMgb2YgdGhlIG9jY3VycmVuY2VzLiANCg0KYGBge3J9DQpYIDwtIGZvcmVzdGZpcmVzJFgNClkgPC0gZm9yZXN0ZmlyZXMkWQ0KcGxvdChYLCBZLCBtYWluID0gIkZvcmVzdCBGaXJlIE9jY3VyZW5jZXMgYnkgU3BhdGlhbCBDb29yZGluYXRlcyIpDQphYmxpbmUodj01LCBoPTUsIGNvbD0icmVkIiwgbHR5PTIpDQpgYGANCg0KQXMgd2UgY2FuIHNlZSwgdGhlIGZvcmVzdCBmaXJlIG9jY3VycmVuY2VzIGFyZSBzcHJlYWQgb3V0IHRocm91Z2hvdXQgdGhlIHBhcmsuIEl0IGFwcGVhcnMgdGhhdCBtb3JlIGZvcmVzdCBmaXJlcyB3ZXJlIG9ic2VydmVkIGluIHRoZSBsb3dlciBoYWxmIG9mIHRoZSBZLWNvb3JkaW5hdGVzLCBhcm91bmQgMi01LCBob3dldmVyIHRoZSBkYXRhIHN0aWxsIGFwcGVhcnMgdG8gYmUgc3ByZWFkIG91dCBlbm91Z2ggdG8gY29udGludWUgd2l0aCBvdXIgaW52ZXN0aWdhdGlvbiBvZiB0aGUgbW9kZWwuIA0KDQoNCg0KIyMgUmVmaW5pbmcgdGhlIERhdGEgc2V0IA0KDQpXaGlsZSBsb29raW5nIGF0IHRoZSBkYXRhIHNldCwgc29tZXRoaW5nIEkgbm90aWNlZCBpcyB0aGF0IG1hbnkgb2JzZXJ2YXRpb25zIGhhdmUgYW4gYXJlYSBvZiAwLCBtZWFuaW5nIHRoYXQgbm9uZSBvZiB0aGUgZm9yZXN0IHdhcyBidXJuZWQgYnkgYSBmb3Jlc3QgZmlyZSBmb3IgdGhvc2Ugb2JzZXJ2YXRpb25zLiBUaGlzIGNvdWxkIHByb3ZpZGUgZm9yIHNvbWUgY29tcGFyaXNvbnMgYmV0d2VlbiB3aGF0IGNvbmRpdGlvbnMgY2F1c2VkIGEgZmlyZSBhbmQgd2hhdCBkaWQgbm90LCBvciBsZWFkIHRvIHF1ZXN0aW9ucyBvZiB3aHkgYSBmaXJlIG9jY3VycmVkIG9uIGEgY2VydGFpbiBkYXkgYnV0IG5vdCBhbm90aGVyLiBIb3dldmVyLCB0aGUgcHVycG9zZSBvZiB0aGlzIGV4cGVyaW1lbnQgaXMgdG8gc2VlIHdoYXQgZmFjdG9ycyBoYXZlIGEgc2lnbmlmaWNhbnQgaW1wYWN0IG9uIHRoZSBhcmVhIGJ1cm5lZCBpbiBhIGZvcmVzdCBmaXJlLiBJZiB3ZSB3ZXJlIHRvIGluY2x1ZGUgdGhlc2Ugb2JzZXJ2YXRpb25zIHdpdGggYW4gYXJlYSBvZiAwIGFmZmVjdGVkIGJ5IHRoZSBmaXJlcywgdGhlbiB0aGlzIG1heSBsZWFkIHRvIG91ciBvYnNlcnZhdGlvbnMgYmVpbmcgc2tld2VkIG9yIHNlcGFyYXRlZCBpbnRvIHR3byBncm91cHM6IGFyZWEgb2YgemVybyBhbmQgYXJlYSBvZiBub256ZXJvLCBha2Egbm8gZmlyZSBkYW1hZ2UgYW5kIGZpcmUgZGFtYWdlLiBUaGlzIGNvdWxkIGhhdmUgYSBuZWdhdGl2ZSBhZmZlY3Qgb24gb3VyIGZpbmFsIHJlZ3Jlc3Npb24gbW9kZWwsIGJ5IGNsdXN0ZXJpbmcgb3VyIGRhdGEgaW50byB0d28gZ3JvdXBzLCB6ZXJvIGFuZCBub256ZXJvIGFyZWEsIHdoaWNoIHdvdWxkIGNhdXNlIGZvciBub3RhYmxlIGluYWNjdXJhY3kuIEFmdGVyIHNvbWUgY29uc2lkZXJhdGlvbiwgSSBiZWxpZXZlIGl0IHdvdWxkIGJlIGluIHRoZSBiZXN0IGludGVyZXN0IG9mIHRoaXMgZXhwZXJpbWVudCB0byBjcmVhdGUgYSBuZXcgZGF0YSBmcmFtZSwgb25lIHdoaWNoIG9ubHkgaW5jbHVkZXMgdGhlIG9ic2VydmF0aW9ucyB3aGVyZSB0aGVyZSB3YXMgaW4gZmFjdCBhIGZvcmVzdCBmaXJlIHdoaWNoIGNhdXNlZCBkYW1hZ2UuIA0KDQpMZXQncyBjcmVhdGUgYSBuZXcgZGF0YSBzZXQgY2FsbGVkICJmb3Jlc3RmaXJlczEiIHRoYXQgaW5jbHVkZXMgb25seSB0aGUgb2JzZXJ2YXRpb25zIHdoZXJlIHRoZSBhcmVhIGFmZmVjdGVkIGlzIGdyZWF0ZXIgdGhhbiAwLg0KDQpgYGB7cn0NCiMgQ3JlYXRlIGEgbmV3IGRhdGEgc2V0IGNhbGxlZCAiZm9yZXN0ZmlyZXMxIiB3aGljaCBpbmNsdWRlcyBvbmx5IHRoZSBvYnNlcnZhdGlvbnMgd2hlcmUgdGhlIGFyZWEgYWZmZWN0ZWQgaXMgZ3JlYXRlciB0aGFuIDAuDQpoZWFkKGZpbHRlcihmb3Jlc3RmaXJlcywgYXJlYSA+IDApKQ0KZm9yZXN0ZmlyZXMxIDwtIGZpbHRlcihmb3Jlc3RmaXJlcywgYXJlYSA+IDApDQoNCnN0cihmb3Jlc3RmaXJlczEpDQpgYGANCg0KTGV0J3MgY3JlYXRlIGFub3RoZXIgbWFwIGZvciBvdXIgcmVmaW5lZCBkYXRhIHNldCB0byBlbnN1cmUgZXZlcnl0aGluZyBzdGlsbCBsb29rcyBhbHJpZ2h0Lg0KDQpgYGB7cn0NClggPC0gZm9yZXN0ZmlyZXMxJFgNClkgPC0gZm9yZXN0ZmlyZXMxJFkNCnBsb3QoWCwgWSwgbWFpbiA9ICJGb3Jlc3QgRmlyZSBPY2N1cmVuY2VzIGJ5IFNwYXRpYWwgQ29vcmRpbmF0ZXMgXG4gb2YgTW9kaWZpZWQgRGF0YSIpDQphYmxpbmUodj01LCBoPTUsIGNvbD0icmVkIiwgbHR5PTIpDQpgYGANCg0KVGhlIG1hcCBhcHBlYXJzIHZlcnkgc2ltaWxhciB0byB0aGUgb25lIGNyZWF0ZWQgZm9yIHRoZSBmb3Jlc3RmaXJlcyBkYXRhIHNldCB3aXRoIHRoZSB6ZXJvIGFyZWEgb2JzZXJ2YXRpb25zIGxlZnQgaW4sIHNvIHRoaXMgaXMgZ29vZC4gDQoNCkhhdmluZyBhIHJlZmluZWQgZGF0YSBzZXQgd2hpY2ggZm9jdXNlcyBvbiB0aGUgb2JzZXJ2YXRpb25zIGluIHdoaWNoIGZvcmVzdCBmaXJlcyBkaWQgYWZmZWN0IGFuZCBjYXVzZSBkYW1hZ2UgdG8gYW4gYXJlYSBvZiB0aGUgZm9yZXN0IHdpbGwgcHJvdmlkZSBiZXR0ZXIgaW5zaWdodCBhbmQgcG93ZXIgZm9yIG91ciBwdXJwb3NlIG9mIHRoaXMgZXhwZXJpbWVudCwgd2hpY2ggaXMgdG8gc2VlIHdoaWNoIGZhY3RvcnMgaGF2ZSBzaWduaWZpY2FuY2UgaW4gdGhlIGFtb3VudCBvZiBhcmVhIGRhbWFnZWQgYnkgZm9yZXN0IGZpcmVzLiBCeSBmb2N1c2luZyBvbmx5IG9uIHRoZSBvYnNlcnZhdGlvbnMgd2hpY2ggd2VyZSBhZmZlY3RlZCBieSBmb3Jlc3QgZmlyZXMsIHRoaXMgd2lsbCBiZSBtb3JlIHVzZWZ1bCBmb3Igb3VyIGdvYWwgYW5kIGFsbG93aW5nIHVzIHRvIGNyZWF0ZSBhIG1vZGVsIGZvciBwcmVkaWN0aW9uIGFuZCBlc3RpbWF0aW9uIHdpdGhvdXQgdGhlIGluY2x1c2lvbiBvZiByZWR1bmRhbnQgb2JzZXJ2YXRpb25zIHdoaWNoIGRvIG5vdCBoZWxwIG91ciBtb2RlbC4NCg0KDQpMZXQncyBjaGVjayBmb3IgYW55IGltYmFsYW5jZXMgaW4gdGhlIGNhdGVnb3JpY2FsIHZhcmlhYmxlIG9mICJtb250aCIuDQoNCmBgYHtyfQ0KdGFibGUoZm9yZXN0ZmlyZXMxJG1vbnRoKQ0KYGBgDQoNCkl0IHR1cm5zIG91dCB0aGF0IHRoZXJlIGlzIGEgdmVyeSBzaWduaWZpY2FudCBpbWJhbGFuY2UgaW4gdGhlIHZhcmlhYmxlIG1vbnRoLiBUaGUgbnVtYmVyIG9mIG9ic2VydmF0aW9ucyBpbiBBdWd1c3QgYW5kIFNlcHRlbWJlciwgOTkgYW5kIDk3IHJlc3BlY3RpdmVseSBkcmFzdGljYWxseSBvdXR3ZWlnaCBhbGwgb2YgdGhlIG90aGVyIG1vbnRocywgd2l0aCBubyBvdGhlciBtb250aCBoYXZpbmcgZ3JlYXRlciB0aGFuIDE5IG9ic2VydmF0aW9ucy4gVGhpcyBpcyBhIG1ham9yIGNhdXNlIGZvciBjb25jZXJuIGFzIHRoaXMgY2F0ZWdvcmljYWwgdmFyaWFibGUgaXMgdmVyeSBzZXZlcmVseSBpbWJhbGFuY2VkLg0KDQpXZSB3aWxsIGtlZXAgdGhlIG1vbnRoIHZhcmlhYmxlIGZvciBub3csIGFzIGl0IHNlZW1zIGxpa2Ugd2hhdCBtb250aCBpdCBpcyBkb2VzIGhhdmUgc2lnbmlmaWNhbmNlIGluIHByZWRpY3RpbmcgYXJlYSBhZmZlY3RlZCBieSBmb3Jlc3QgZmlyZXMsIGJ1dCB3ZSB3aWxsIGtlZXAgYSBjbG9zZSBleWUgb24gaXQgZm9yIHRoZSBmaW5hbCBtb2RlbCB0byBkZXRlcm1pbmUgaWYgaXQgc2hvdWxkIGJlIHJlbW92ZWQgZHVlIHRvIGl0cyBpbWJhbGFuY2UuIFdlIHdpbGwgYWRkcmVzcyB0aGlzIHZhcmlhYmxlIGxhdGVyIG9uIHRvIHNlZSBpZiBpdHMgcmVtb3ZhbCB3aWxsIGhlbHAgaW1wcm92ZSBvdXIgbW9kZWwuIFRoaXMgbW9udGggdmFyaWFibGUgaXMgb25lIHdlIHdpbGwga2VlcCBhIGNsb3NlIHdhdGNoIG9uIGR1ZSB0byB0aGlzIGNvbmNlcm4gb2YgaW1iYWxhbmNlLiANCg0KDQpMZXQncyBjaGVjayB0aGUgb3RoZXIgY2F0ZWdvcmljYWwgdmFyaWFibGUgImRheSIgZm9yIHBvdGVudGlhbCBpbWJhbGFuY2VzLiANCg0KYGBge3J9DQp0YWJsZShmb3Jlc3RmaXJlczEkZGF5KQ0KYGBgDQoNClRoZSAiZGF5IiB2YXJpYWJsZSBkb2VzIG5vdCBzaG93IG1ham9yIGltYmFsYW5jZSwgYXMgYWxsIHRoZSBkYXlzIGhhdmUgYSBzaWduaWZpY2FudCBudW1iZXIgb2Ygb2JzZXJ2YXRpb25zIHdpdGggdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgaGlnaGVzdCBhbmQgbG93ZXN0IGRheXMgYmVpbmcgYSB0b3RhbCBvZiAxNSBvYnNlcnZhdGlvbnMsIFN1bmRheSB3aXRoIDQ3IGFuZCBXZWRuZXNkYXkgd2l0aCAzMi4gSG93ZXZlciwgdGhlIGRheSBvZiB0aGUgd2VlayBkb2VzIG5vdCBzZWVtIGxpa2UgaXQgd291bGQgaGF2ZSBhcyBtYWpvciBzaWduaWZpY2FuY2UgaW4gcHJlZGljdGluZyBmb3Jlc3QgZmlyZSBkYW1hZ2UgdGhlbiBzb21lIG9mIHRoZSBvdGhlciBmYWN0b3JzIGluIHF1ZXN0aW9uLiBUaGlzIGNhbiBiZSBzZWVuIGFzIGJ5IGhvdyB0aGUgZGF5cyBvZiB0aGUgd2VlayBhcmUgbm90IHZlcnkgaW1iYWxhbmNlZCBpbiByZWdhcmRzIHRvIHRoZWlyIHRvdGFsIG9ic2VydmF0aW9ucy4gVGhpcyBpcyB1bmxpa2UgdGhlIG1vbnRoIHZhcmlhYmxlIHdoZXJlIGl0IHdhcyBzaG93biB0aGF0IHRoZSB2YXN0IG1ham9yaXR5IG9mIHRoZSBvYnNlcnZhdGlvbnMgZmFsbCBpbnRvIGVpdGhlciBBdWd1c3Qgb3IgU2VwdGVtYmVyLCBldmlkZW5jaW5nIHRoYXQgdGhlIG1ham9yaXR5IG9mIGZvcmVzdCBmaXJlcyBvY2N1ciB3aXRoaW4gdGhlc2Ugd2FybWVyLCBlbmQgb2Ygc3VtbWVyIG1vbnRocy4gDQoNClRvIGF2b2lkIGhhdmluZyB0b28gbWFueSBvciB0b28gcmVkdWRlbnQgdmFyaWFibGVzIHdpdGhpbiBvdXIgZnVsbCBtb2RlbCwgdGhlIGNhdGVnb3JpY2FsIHZhcmlhYmxlIGZvciAiZGF5IiB3aWxsIG5vdCBiZSBpbmNsdWRlZC4gDQoNCmBgYHtyfQ0KZmluYWwuZGF0YSA9IGZvcmVzdGZpcmVzMVssIC1jKDQpXSAgICAgICAgDQprYWJsZShoZWFkKGZpbmFsLmRhdGEpKQ0KYGBgDQoNCg0KDQojIE11bHRpcGxlIExpbmVhciBSZWdyZXNzaW9uDQoNClRoZSBnb2FsIG9mIHRoaXMgZXhwZXJpbWVudCBpcyB0byBjcmVhdGUgYSBtdWx0aXBsZSBsaW5lYXIgcmVncmVzc2lvbiBtb2RlbCB0aGF0IGFsbG93cyB1cyB0byB1c2UgdGhlIHNldmVyYWwgZmFjdG9ycyBpbiBvcmRlciB0byBjcmVhdGUgYSBtb2RlbCBmb3IgdGhlIHByZWRpY3Rpb24gYW5kIGVzdGltYXRpb24gb2YgdGhlIGFyZWEgYWZmZWN0ZWQgYnkgZm9yZXN0IGZpcmVzLiANCg0KDQojIyBGdWxsIE1vZGVsIA0KDQpXZSB3aWxsIGJlZ2luIHdpdGggYSBmdWxsIG11bHRpcGxlIGxpbmVhciByZWdyZXNzaW9uIG1vZGVsLiBXZSB3aWxsIG9ic2VydmUgaG93IHRoaXMgZnVsbCBtb2RlbCB0dXJucyBvdXQgdG8gaGVscCBkZWNpZGUgd2hldGhlciB3ZSBuZWVkIHRvIGFwcGx5IGFueSB0cmFuc2Zvcm1hdGlvbnMgdG8gYW55IG9mIHRoZSB2YXJpYWJsZXMuIA0KDQpgYGB7ciBmaWcuYWxpZ249J2NlbnRlcid9DQpmdWxsLm1vZGVsID0gbG0oYXJlYSB+IC4sIGRhdGEgPSBmaW5hbC5kYXRhKQ0Ka2FibGUoc3VtbWFyeShmdWxsLm1vZGVsKSRjb2VmLCBjYXB0aW9uID0iU3RhdGlzdGljcyBvZiBSZWdyZXNzaW9uIENvZWZmaWNpZW50cyIpDQpgYGANCg0KDQojIyBDaGVjayBmb3IgVmlvbGF0aW9ucyANCg0KTm93LCB3ZSB3aWxsIGNoZWNrIHRoZSByZXNpZHVhbCBwbG90cyB0byBsb29rIGZvciBwb3RlbnRpYWwgdmlvbGF0aW9ucyBvZiBvdXIgbW9kZWwuIA0KDQpgYGB7cn0NCnBhcihtZnJvdz1jKDIsMikpDQpwbG90KGZ1bGwubW9kZWwpDQpgYGANCg0KSXQgYXBwZWFycyB0aGF0IHdlIGRvIGhhdmUgc29tZSB2aW9sYXRpb25zIHdpdGhpbiBvdXIgbW9kZWwuIEZvciBpbnN0YW5jZSwgdmFyaWFuY2UgaXMgbm90IGNvbnN0YW50IGFzIHNob3duIGJ5IGhvdyB0aGVyZSBhcmUgYSBmZXcgdmVyeSBub3RhYmxlIG91dGxpZXJzIHRvIHRoZSByaWdodCBvZiB0aGUgcmVzaWR1YWwgcGxvdC4gQWRkaXRpb25hbGx5LCB0aGUgUS1RIFBsb3Qgc2hvd3Mgc29tZSB2aW9sYXRpb25zIGFzIHdlbGwgYXMgdGhlIHJpZ2h0IHNpZGUgb2YgdGhlIGRhdGEgYXBwZWFycyB0byBoYXZlIHNvbWUgc29ydCBvZiBjdXJ2YXR1cmUgd2l0aCB0aGVzZSBwb2ludHMgbm90IGZvbGxvd2luZyBhIG5vcm1hbCBkaXN0cmlidXRpb24uIEZ1cnRoZXJtb3JlLCB0aGUgQ29va2UncyBEaXN0YW5jZSBwbG90IHNob3dzIHRoYXQgd2UgaW5kZWVkIGRvIGhhdmUgc29tZSBoaWdoIGxldmVyYWdlIHBvaW50cyBpbiBvdXIgbW9kZWwuIA0KDQpMZXQncyBjaGVjayB0aGUgVklGIGZvciBhbnkgcG90ZW50aWFsIG11bHRpY29sbGluZWFyaXR5IGlzc3VlcyBpbiBvdXIgbW9kZWwuIA0KDQpgYGB7cn0NCnZpZihmdWxsLm1vZGVsKQ0KDQpiYXJwbG90KHZpZihmdWxsLm1vZGVsKSwgbWFpbiA9ICJWSUYgVmFsdWVzIiwgaG9yaXogPSBGQUxTRSwgY29sID0gInN0ZWVsYmx1ZSIpDQpgYGANCg0KSXQgYXBwZWFycyB0aGF0IHdlIGRvIGhhdmUgYSBmZXcgaGlnaCBWSUYgdmFsdWVzIHByZXNlbnQgaW4gb3VyIG1vZGVsIHdoaWNoIGxlYWRzIHRvIHRoZSBsaWtlbGlob29kIG9mIGEgbXVsdGljb2xsaW5lYXJpdHkgaXNzdWUuDQoNCkxldCdzIHVzZSBhIGNvcnJlbGF0aW9uIG1hdHJpeCB0byBjaGVjayB3aGljaCB2YXJpYWJsZXMgYXJlIGNhdXNpbmcgaXNzdWVzLiBXZSBjYW4gb25seSBjaGVjayB0aGUgY29ycmVsYXRpb24gb2YgbnVtZXJpYyB2YXJpYWJsZXMgc28gd2Ugd2lsbCBjcmVhdGUgYSB0ZW1wb3JhcnkgZGF0YSBzZXQgImNvci5kYXRhIiB3aGljaCBkb2VzIG5vdCBpbmNsdWRlIHRoZSBjYXRlZ29yaWNhbCB2YXJpYWJsZSBvZiBtb250aC4NCg0KYGBge3J9DQpjb3IuZGF0YSA8LSBmaW5hbC5kYXRhWywgLWMoMyldDQpyZXMgPC0gY29yKGNvci5kYXRhKQ0Kcm91bmQocmVzLCAyKQ0KYGBgDQoNCkl0IGFwcGVhcnMgdGhhdCBGRk1DIGFuZCBJU0kgYXJlIGhpZ2hseSBjb3JyZWxhdGVkIHdpdGggYSBjb3JyZWxhdGlvbiBvZiAwLjcwLiBXZSB3aWxsIHJlbW92ZSBvbmUgb2YgdGhlc2UgdmFyaWFibGVzIHRvIGhlbHAgYXZvaWQgdGhpcyBtdWx0aWNvbGxpbmVhcml0eSBpc3N1ZS4gV2Ugd2lsbCBrZWVwIEZGTUMsIGFzIGl0IGlzIHRoZSBmaXJzdCB2YXJpYWJsZXMgYWxwaGFiZXRpY2FsbHkgb2YgdGhlc2UgdHdvLiBBZGRpdGlvbmFsbHksIGl0IGFwcGVhcnMgdGhhdCBETUMgYW5kIERDIGFyZSBzaWduaWZpY2FudGx5IGNvcnJlbGF0ZWQsIHdpdGggYSBjb3JyZWxhdGlvbiBvZiAwLjY3LiBXZSB3aWxsIGtlZXAgREMgYXMgaXQgaXMgdGhlIGZpcnN0IHZhcmlhYmxlIGFscGhhYmV0aWNhbGx5IG9mIHRoZXNlIHR3by4NCg0KDQpOb3csIGxldCdzIHJldmlzZSBvdXIgZmluYWwuZGF0YSBtb2RlbCB3aXRoIHRoZSB2YXJpYWJsZXMgYWRqdXN0ZWQgdG8gYWRkcmVzcyB0aGUgbXVsdGljb2xsaW5lYXJpdHkgaXNzdWUgdGhhdCB3ZSBlbmNvdW50ZXJlZC4NCg0KYGBge3J9DQpmaW5hbC5kYXRhID0gZm9yZXN0ZmlyZXMxWywgLWMoNCw2LDgpXSAgICAgICAgDQprYWJsZShoZWFkKGZpbmFsLmRhdGEpKQ0KYGBgDQoNClRoZSBhZGp1c3RlZCBmaW5hbCBtb2RlbCBpcyBnaXZlbiBhcyBmb2xsb3dzLg0KDQpgYGB7ciBmaWcuYWxpZ249J2NlbnRlcid9DQpmdWxsLm1vZGVsID0gbG0oYXJlYSB+IC4sIGRhdGEgPSBmaW5hbC5kYXRhKQ0Ka2FibGUoc3VtbWFyeShmdWxsLm1vZGVsKSRjb2VmLCBjYXB0aW9uID0iU3RhdGlzdGljcyBvZiBSZWdyZXNzaW9uIENvZWZmaWNpZW50cyIpDQpgYGANCg0KSXQgaXMgaW1wb3J0YW50IHRvIG5vdGUgdGhhdCBvdXIgZnVsbCBtdWx0aXBsZSBsaW5lYXIgcmVncmVzc2lvbiBtb2RlbCBoYXMgYSBwLXZhbHVlIG9mIHAgPSAwLjY4MTYsIHdoaWNoIGlzIGdyZWF0ZXIgdGhhbiBvdXIgYWxwaGEgdmFsdWUgb2YgMC4wNS4gVGhpcyBpbmRpY2F0ZXMgdGhhdCB0aGlzIGZ1bGwgbW9kZWwgd2lsbCBsaWtlbHkgbm90IGJlIG91ciBiZXN0IGNob2ljZSBmb3IgcHJlZGljdGlvbiBhbmQgZXN0aW1hdGlvbiBhcyB0aGlzIG1vZGVsIHdhcyBub3Qgc3RhdGlzdGljYWxseSBzaWduaWZpY2FudCBpbiBwcmVkaWN0aW5nIHRoZSBhcmVhIGJ1cm5lZCBieSBhIGZvcmVzdCBmaXJlLiANCg0KDQojIyBCb3ggQ294IE1vZGVscw0KDQpEdWUgdG8gdGhlIHZpb2xhdGlvbnMgaW4gdGhlIHJlc2lkdWFsIHBsb3RzIG9mIHRoZSBtb2RlbCwgd2Ugd2lsbCB1c2UgdGhlIEJveCBDb3ggdHJhbnNmb3JtYXRpb25zIHRvIGFkanVzdCBvdXIgZGF0YS4NCg0KDQojIyMgQm94IENveCBUcmFuc2Zvcm1hdGlvbnMNCg0KV2Ugd2lsbCB0cnkgb3V0IHNldmVyYWwgdHJhbnNmb3JtYXRpb25zIGluIG9yZGVyIHRvIGNob29zZSB0aGUgYmVzdCBvbmUgZm9yIG91ciBtb2RlbC4NCg0KVGhlIHRyYW5zZm9ybWF0aW9ucyB3aGljaCBJIHRyaWVkIHVzZWQgc3BlY2lmaWMgdmFyaWFibGVzLiBUaGUgQm94IENveCB0cmFuc2Zvcm1hdGlvbnMgSSBwZXJmb3JtZWQgYXJlIGxpc3RlZCBhcyBmb2xsb3dzOg0KDQoqIEJveCBDb3gtIExvZ2FyaXRobWljIHRyYW5zZm9ybWF0aW9uIG9mIHdpbmQuDQoNCiogQm94IENveC0gd2luZC4NCg0KKiBCb3ggQ294LSBMb2dhcml0aG1pYyB0cmFuc2Zvcm1hdGlvbiBvZiB0ZW1wZXJhdHVyZSAodGVtcCkuDQoNCiogQm94IENveC0gTG9nYXJpdGhtaWMgdHJhbnNmb3JtYXRpb25zIG9mIHdpbmQgYW5kIHRlbXBlcmF0dXJlICh0ZW1wKS4NCg0KYGBge3IgZmlnLmFsaWduPSdjZW50ZXInLCBmaWcud2lkdGg9NywgZmlnLmhlaWdodD02fQ0KcGFyKHB0eSA9ICJzIiwgbWZyb3cgPSBjKDIsIDIpLCBvbWE9YyguMSwuMSwuMSwuMSksIG1hcj1jKDQsIDAsIDIsIDApKQ0KDQojIyBCb3ggQ294LSBMb2dhcml0aG1pYyB0cmFuc2Zvcm1hdGlvbiBvZiB3aW5kIHZhcmlhYmxlLg0KYm94Y294KGFyZWEgfiBYICsgWSArIGZhY3Rvcihtb250aCkgKyBGRk1DICsgREMgKyB0ZW1wICsgUkggKyBsb2cod2luZCkgKyByYWluICwgZGF0YSA9IGZpbmFsLmRhdGEsIGxhbWJkYSA9IHNlcSgwLCAxLCBsZW5ndGggPSAxMCksIA0KICAgICAgIHhsYWI9ZXhwcmVzc2lvbihwYXN0ZShsYW1iZGEsICI6IGxvZyB3aW5kIikpKQ0KDQojIyBCb3ggQ294LSB3aW5kLg0KYm94Y294KGFyZWEgfiBYICsgWSArIGZhY3Rvcihtb250aCkgKyBGRk1DICsgREMgKyB0ZW1wICsgIFJIICArIHdpbmQgKyByYWluDQogICAgICAgLCBkYXRhID0gZmluYWwuZGF0YSwgbGFtYmRhID0gc2VxKC0wLjUsIDEsIGxlbmd0aCA9IDEwKSwgDQogICAgICAgeGxhYj1leHByZXNzaW9uKHBhc3RlKGxhbWJkYSwgIjogd2luZCIpKSkNCg0KIyNCb3ggQ294LSBMb2dhcml0aG1pYyB0cmFuc2Zvcm1hdGlvbiBvZiB0ZW1wZXJhdHVyZSAodGVtcCkgdmFyaWFibGUuDQpib3hjb3goYXJlYSB+IFggKyBZICsgZmFjdG9yKG1vbnRoKSArIEZGTUMgKyBEQyArIGxvZyh0ZW1wKSArIFJIICsgd2luZCArIHJhaW4sIGRhdGEgPSBmaW5hbC5kYXRhLCBsYW1iZGEgPSBzZXEoLTAuNSwgMSwgbGVuZ3RoID0gMTApLCANCiAgICAgICB4bGFiPWV4cHJlc3Npb24ocGFzdGUobGFtYmRhLCAiOiBsb2ctdGVtcCIpKSkNCg0KIyMgQm94IENveC0gTG9nYXJpdGhtaWMgdHJhbnNmb3JtYXRpb25zIG9mIHdpbmQgYW5kIHRlbXBlcmF0dXJlICh0ZW1wKS4NCmJveGNveChhcmVhIH4gWCArIFkgKyBmYWN0b3IobW9udGgpICsgRkZNQyArIERDICsgbG9nKHRlbXApICsgUkggKyBsb2cod2luZCkgKyByYWluLCBkYXRhID0gZmluYWwuZGF0YSwgbGFtYmRhID0gc2VxKC0wLjUsIDEsIGxlbmd0aCA9IDEwKSwgDQogICAgICB4bGFiPWV4cHJlc3Npb24ocGFzdGUobGFtYmRhLCAiOiBsb2ctd2luZCwgbG9nLXRlbXAiKSkpDQpgYGANCg0KV2UgY2FuIHNlZSB0aGUgcGxvdHMgZm9yIHRoZSBCb3ggQ294IHRyYW5zZm9ybWF0aW9ucyB0aGF0IHdlcmUgcGVyZm9ybWVkIGFuZCB0aGVzZSB0cmFuc2Zvcm1hdGlvbiBwbG90cyBpbmRpY2F0ZSB0aGUgb3B0aW1hbCB2YWx1ZSBvZiBsYW1iYSBmb3IgdGhlIGRpZmZlcmVudCB0cmFuc2Zvcm1lZCBwcmVkaWN0b3IgdmFyaWFibGVzLiBTcGVjaWZpY2FsbHksIGZvciB0aGlzIHRyYW5zZm9ybWF0aW9uIHdlIGxvb2tlZCBhdCB0cmFuc2Zvcm1hdGlvbnMgb2YgdGhlIHByZWRpY3RvciB2YXJpYWJsZXMgd2luZCBhbmQgdGVtcCwgYXMgdGhlc2UgdHdvIHF1YW50aWF0aXZlIHZhcmlhYmxlcyBjYW4gaGVscCB1cyBzZWUgaWYgd2UgY2FuIGltcHJvdmUgb3VyIG1vZGVsIGZvciBwcmVkaWN0aW5nIHRoZSBhcmVhIGJhc2VkIHVwb24gdGhlIHByZWRpY3RvcnMgd2UgaGF2ZS4NCg0KDQoNCiMjIyBTcXVhcmUtUm9vdCBUcmFuc2Zvcm1hdGlvbg0KDQpXZSB3aWxsIGNyZWF0ZSBhIHNxdWFyZS1yb290IHRyYW5zZm9ybWF0aW9uIG9mIG91ciBtb2RlbCB3aXRoIHRoZSBsb2cgdHJhbnNmb3JtZWQgdGVtcCB2YXJpYWJsZS4gDQoNClRvIGhlbHAgaW1wcm92ZSB0aGUgc2lnbmlmaWNhbmNlIG9mIHRoZSBtb2RlbCwgSSBkZWNpZGVkIHRvIGZvY3VzIGluIHRoZSB2YXJpYWJsZXMgd2hpY2ggcHJvdmlkZWQgdGhlIG1vc3Qgc3RhdGlzdGljYWwgc2lnbmlmaWNhbmNlIHRvIG91ciBtb2RlbC4gVmFyaWFibGVzIHN1Y2ggYXMgRkZNQyBhbmQgbW9udGggZ3JlYXRseSBpbmNyZWFzZWQgdGhlIHAtdmFsdWUgb2YgdGhlIG1vZGVsLCBzbyBJIGRlY2lkZWQgdG8gaW1wcm92ZSB0aGUgc3RhdGlzdGljYWwgc2lnbmlmaWNhbmNlIG9mIHRoZSBtdWx0aXBsZSByZWdyZXNzaW9uIG1vZGVsIGJ5IHJlbW92aW5nIHRoZXNlIHZhcmlhYmxlcyBmcm9tIHRoaXMgc3F1YXJlIHJvb3QgdHJhbnNmb3JtYXRpb24uIEhvd2V2ZXIsIHdoaWxlIGRvaW5nIHNvIGRpZCBkZWNyZWFzZSB0aGUgcC12YWx1ZSwgaXQgc3RpbGwgZGlkIG5vdCBsb3dlciBpdCBlbm91Z2ggdG8gYWNoaWV2ZSBhIGxldmVsIG9mIHN0YXRpc3RpY2FsIHNpZ25pZmljYW5jZSBmb3IgdGhpcyBzcXVhcmUgcm9vdCB0cmFuc2Zvcm1hdGlvbiBtb2RlbC4gDQoNCmBgYHtyfQ0Kc3FydC5hcmVhLmxvZy50ZW1wPSBsbSgoYXJlYSleMC41IH4gWCArIFkgKyBEQyArIGxvZyh0ZW1wKSArIFJIICsgd2luZCArIHJhaW4sIGRhdGEgPSBmaW5hbC5kYXRhKQ0Ka2FibGUoc3VtbWFyeShzcXJ0LmFyZWEubG9nLnRlbXApJGNvZWYsIGNhcHRpb24gPSAic3F1YXJlIHJvb3QgbG9nLXRyYW5zZm9ybWVkIG1vZGVsIikNCmBgYA0KDQpUaGUgcC12YWx1ZSBvZiB0aGlzIG1vZGVsIGlzIHAgPSAwLjI1MTQsIHdoaWNoIGlzIGdyZWF0ZXIgdGhhbiBvdXIgYWxwaGEgdmFsdWUgb2YgMC4wNS4gVGhpcyBpbmRpY2F0ZXMgdGhhdCB0aGlzIHNxdWFyZSByb290IHRyYW5zZm9ybWF0aW9uIG1heSBub3QgYmUgb3VyIGJlc3Qgb3B0aW9uIGFzIGl0IGlzIG5vdCBzdGF0aXN0aWNhbGx5IHNpZ25pZmljYW50IGZvciBwcmVkaWN0aW9uIGFuZCBlc3RpbWF0aW9uIG9mIHRoZSBhcmVhIGJ1cm5lZCBieSBhIGZvcmVzdCBmaXJlLiANCg0KTGV0J3MgdGFrZSBhIGxvb2sgYXQgdGhlIHJlc2lkdWFsIHBsb3RzIGZvciB0aGlzIHRyYW5zZm9ybWF0aW9uLg0KDQpgYGB7cn0NCnBhcihtZnJvdyA9IGMoMiwyKSkNCnBsb3Qoc3FydC5hcmVhLmxvZy50ZW1wKQ0KYGBgDQoNClRoZSByZXNpZHVhbCBwbG90IGFwcGVhcnMgdG8gYmUgbW9zdGx5IHJhbmRvbSBleGNlcHQgZm9yIGEgZmV3IG91dGxpZXJzIHdoaWNoIGFwcGVhciBsaWtlIHRoZXkgYXJlIHNpZ25pZmljYW50LiBKdXN0IGxpa2UgaW4gdGhlIGxpbmVhciBtb2RlbCwgdGhlIFEtUSBQbG90IGFwcGVhcnMgdG8gc2hvdyBhIHZpb2xhdGlvbiBpbiB0aGF0IHRoZSByaWdodCBoYW5kIHNpZGUgb2YgdGhlIHBsb3Qgc2hvd3MgdGhlIHBvaW50cyBkaXZlcmdpbmcgZnJvbSBhIG5vcm1hbCBkaXN0cmlidXRpb24uIFRoaXMgaXMgZXZpZGVuY2Ugb2YgYSB2aW9sYXRpb24gb2YgdGhpcyB0cmFuc2Zvcm1lZCBtb2RlbC4gRnVydGhlcm1vcmUsIHRoZSBDb29rZSdzIERpc3RhbmNlIHBsb3Qgc2hvd3MgdGhhdCB0aGVyZSBpcyBhIHZlcnkgaGlnaCBsZXZlcmFnZSBwb2ludCBpbiB0aGUgbW9kZWwgYWxvbmcgd2l0aCBzZXZlcmFsIG90aGVyIG91dGxpZXJzLCBpbmRpY2F0aW5nIGZ1cnRoZXIgdmlvbGF0aW9ucyBzdGlsbCBwcmVzZW50IHdpdGhpbiB0aGlzIHNxdWFyZS1yb290IHRyYW5zZm9ybWVkIG1vZGVsLg0KDQoNCg0KIyMjIExvZ2FyaXRobWljIFRyYW5zZm9ybWF0aW9uDQoNCldlIHdpbGwgY3JlYXRlIGEgbG9nYXJpdGhtaWMgbXVsdGlwbGUgcmVncmVzc2lvbiBtb2RlbCB1c2luZyB0aGUgbG9nIHRyYW5zZm9ybWF0aW9uIG9mIHRoZSByZXNwb25zZSB2YXJpYWJsZSBhcmVhLiANCg0KVG8gaGVscCBpbXByb3ZlIHRoZSBzaWduaWZpY2FuY2Ugb2YgdGhlIG1vZGVsLCBJIGRlY2lkZWQgdG8gZm9jdXMgaW4gdGhlIHZhcmlhYmxlcyB3aGljaCBwcm92aWRlZCB0aGUgbW9zdCBzdGF0aXN0aWNhbCBzaWduaWZpY2FuY2UgdG8gb3VyIG1vZGVsLiBWYXJpYWJsZXMgc3VjaCBhcyBGRk1DIGFuZCBtb250aCBncmVhdGx5IGluY3JlYXNlZCB0aGUgcC12YWx1ZSBvZiB0aGUgbW9kZWwsIHNvIEkgZGVjaWRlZCB0byBpbXByb3ZlIHRoZSBzdGF0aXN0aWNhbCBzaWduaWZpY2FuY2Ugb2YgdGhlIG11bHRpcGxlIHJlZ3Jlc3Npb24gbW9kZWwgYnkgcmVtb3ZpbmcgdGhlc2UgdmFyaWFibGVzIGZyb20gdGhpcyBsb2dhcml0aG1pYyB0cmFuc2Zvcm1hdGlvbi4gRG9pbmcgc28gZ3JlYXRseSBpbXByb3ZlZCB0aGUgcC12YWx1ZSwgd2l0aCB0aGUgbXVjaCBsb3dlciBwLXZhbHVlIGluZGljYXRpbmcgdGhhdCB0aGlzIG1vZGVsIG5vdyBkb2VzIGhhdmUgc3RhdGlzdGljYWwgc2lnbmlmaWNhbmNlIGZvciBwcmVkaWN0aW9uIGFuZCBlc3RpbWF0aW9uIG9mIGFyZWEuIA0KDQpgYGB7cn0NCmxvZy5hcmVhID0gbG0obG9nKGFyZWEpIH4gWCArIFkgKyBEQyArIHRlbXAgKyBSSCArIHdpbmQgKyByYWluLCAgZGF0YSA9IGZpbmFsLmRhdGEpDQprYWJsZShzdW1tYXJ5KGxvZy5hcmVhKSRjb2VmLCBjYXB0aW9uID0gImxvZy10cmFuc2Zvcm1lZCBtb2RlbCIpDQpgYGANCg0KTGV0J3MgdGFrZSBhIGxvb2sgYXQgdGhlIHJlc2lkdWFsIHBsb3RzIGZvciB0aGlzIHRyYW5zZm9ybWF0aW9uLg0KDQpgYGB7cn0NCnBhcihtZnJvdyA9IGMoMiwyKSkNCnBsb3QobG9nLmFyZWEpDQpgYGANCg0KV2l0aCB0aGUgbG9nYXJpdGhtaWMgbW9kZWwsIHRoZSByZXNpZHVhbHMgYXBwZWFyIG11Y2ggYmV0dGVyIHRoYW4gdGhleSBkaWQgZm9yIHRoZSBsaW5lYXIgbW9kZWwuIFRoZSByZXNpZHVhbCBwbG90IGFwcGVhcnMgbXVjaCBtb3JlIHJhbmRvbS4gV2hpbGUgdGhlIFEtUSBQbG90IGRvZXMgYXBwZWFyIHRvIGdvIHNsaWdodGx5IG9mZiBvZiB0aGUgbGluZSBmb3IgYSBub3JtYWwgZGlzdHJpYnV0aW9uIG9uIHRoZSByaWdodCBoYW5kIHNpZGUsIGl0IGlzIG11Y2ggbGVzcyBzZXZlcmUgdGhhbiBob3cgaXQgd2FzIGluIHRoZSByZXNpZHVhbCBwbG90IG9mIHRoZSBsaW5lYXIgbW9kZWwuIEFkZGl0aW9uYWxseSwgd2Ugc3RpbGwgZG8gaGF2ZSBzb21lIGhpZ2ggbGV2ZXJhZ2UgcG9pbnRzIGFzIHNlZW4gaW4gdGhlIENvb2tlJ3MgRGlzdGFuY2UgcGxvdCB3aGljaCB3b3VsZCBkZWZpbmVsdHkgYmUgd29ydGggaW52ZXN0aWdhdGluZyBmdXJ0aGVyIGluIGFkZGl0aW9uYWwgZXhwZXJpbWVudHMgdG8gZGV0ZXJtaW5lIHdoeSB3ZSBoYXZlIHRoZXNlIGhpZ2ggbGV2ZXJhZ2UgcG9pbnRzIGFuZCBvdXRsaWVycy4gSG93ZXZlciwgb3ZlcmFsbCB0aGUgbG9nYXJpdGhtaWMgbW9kZWwgaGFzIGZld2VyIHZpb2xhdGlvbnMgYW5kIG11Y2ggbGVzcyBzZXZlcmUgcHJvYmxlbXMgdGhhbiB0aGUgbGluZWFyIG1vZGVsIGhhZCByZWdhcmRpbmcgaXRzIHJlc2lkdWFscy4gDQoNCk92ZXJhbGwsIHRoaXMgbG9nYXJpdGhtaWMgdHJhbnNmb3JtZWQgbW9kZWwgYXBwZWFycyB0byBoYXZlIHRoZSBmZXdlc3QgdmlvbGF0aW9ucyBhbmQgYWxzbyBpcyB0aGUgb25seSBvbmUgd2l0aCBhIHN0YXRpc3RpY2FsbHkgc2lnbmlmaWNhbnQgcC12YWx1ZSwgcCA9IDAuMDAxNC4gDQoNCg0KIyMjIENvbXBhcmlzb24gb2YgUS1RIFBsb3RzDQoNClNvbWV0aGluZyB3aGljaCB3YXMgbWFkZSBub3RlIG9mIHdoZW4gcGVyZm9ybWluZyB0aGUgdmFyaW91cyB0cmFuc2Zvcm1hdGlvbnMgd2FzIHRoYXQgdGhlcmUgYXBwZWFyZWQgdG8gYmUgc29tZSB2aW9sYXRpb25zIHdoZW4gY2hlY2tpbmcgb3VyIHJlc2lkdWFsIGNvbmRpdGlvbnMuIE9uZSBwYXJ0aWN1bGFyIHZpb2xhdGlvbiB3aGljaCBhcHBlYXJlZCB0byBiZSB2ZXJ5IHNldmVyZSBpbiBjZXJ0YWluIGNhc2VzIHdhcyB0aGUgZmFpbHVyZSBvZiB0aGUgUS1RIFBsb3QgdG8gaW5kaWNhdGUgdGhhdCB0aGUgZGF0YSBhcHBlYXJlZCB0byBmb2xsb3cgYSBub3JtYWwgZGlzdHJpYnV0aW9uLiBCb3RoIHRoZSBvcmlnaW5hbCBsaW5lYXIgbW9kZWwgYW5kIHRoZSBzcXVhcmUgcm9vdCB0cmFuc2Zvcm1hdGlvbiBtb2RlbCBlc3BlY2lhbGx5IGhhZCBzZXZlcmUgdmlvbGF0aW9ucyByZWdhcmRpbmcgdGhlaXIgUS1RIFBsb3RzLiBIb3dldmVyLCB0aGUgbG9nYXJpdGhtaWMgdHJhbnNmb3JtYXRpb24gbW9kZWwgYXBwZWFyZWQgdG8gaGF2ZSBhIFEtUSBQbG90IHdoaWNoIHdhcyBtdWNoIGNsb3NlciB0byBpbmRpY3RpbmcgYSBub3JtYWwgZGlzdHJpYnV0aW9uIHRoYW4gdGhlIG90aGVyIHR3by4gV2hpbGUgdGhlcmUgd2FzIHN0aWxsIHNvbWUgc2xpZ2h0IGRldmlhdGlvbiBvbiB0aGUgcmlnaHQgaGFuZCBzaWRlIG9mIHRoZSBRLVEgUGxvdCBmb3IgdGhlIGxvZ2FyaXRobWljIHRyYW5zZm9ybWF0aW9uLCBpdCB3YXMgd2F5IGxlc3MgdGhhbiBlaXRoZXIgb2YgdGhlIG90aGVyIHR3byBtb2RlbHMuIEFkZGl0aW9uYWxseSwgdGhlIGxvZ2FyaXRobWljIHRyYW5zZm9ybWF0aW9uIHdhcyB0aGUgb25seSBRLVEgUGxvdCB3aGljaCBkaWQgbm90IHNob3cgYmxhdGFudCBjdXJ2YXR1cmUgaW4gdGhlIHJpZ2h0IGhhbmQgc2lkZSBvZiBpdC4gDQoNCmBgYHtyfQ0KcGFyKHB0eSA9ICJzIiwgbWZyb3cgPSBjKDEsIDMpKQ0KI1EtUSBwbG90IGZvciBsaW5lYXIgZnVsbCBtb2RlbA0KcXFub3JtKGZ1bGwubW9kZWwkcmVzaWR1YWxzLCBtYWluID0gIkxpbmVhciBGdWxsIE1vZGVsIikNCnFxbGluZShmdWxsLm1vZGVsJHJlc2lkdWFscykNCg0KIyBRLVEgcGxvdCBmb3Igc3F1YXJlIHJvb3QgdHJhbnNmb3JtYXRpb24gbW9kZWwNCnFxbm9ybShzcXJ0LmFyZWEubG9nLnRlbXAkcmVzaWR1YWxzLCBtYWluID0gIlNxYXVyZS1yb290IEFyZWEgbG9nIHRlbXAiKQ0KcXFsaW5lKHNxcnQuYXJlYS5sb2cudGVtcCRyZXNpZHVhbHMpDQoNCiNRLVEgcGxvdCBmb3IgbG9nYXJpdGhtaWMgdHJhbnNmb3JtYXRpb24gbW9kZWwgDQpxcW5vcm0obG9nLmFyZWEkcmVzaWR1YWxzLCBtYWluID0gIkxvZyBBcmVhIikNCnFxbGluZShsb2cuYXJlYSRyZXNpZHVhbHMpDQpgYGANCg0KQnkgY29tcGFyaW5nIHRoZSBRLVEgUGxvdHMgb2YgdGhlc2UgdGhyZWUgcG90ZW50aWFsIG1vZGVscywgd2UgY2FuIHNlZSB0aGF0IHRoZSBsb2dhcml0aG1pYyBtb2RlbCBoYXMgdGhlIGxpbmVhciBtb2RlbCBhbmQgdGhlIHNxdWFyZSByb290IHRyYW5zZm9ybWF0aW9uIG1vZGVsIGhhdmUgdmVyeSBzZXZlcmUgdmlvbGF0aW9ucyBvZiBub3JtYWxpdHkgaW4gdGhlaXIgUS1RIFBsb3QuIFdoaWxlIHRoZSBsb2dhcnRoaW1pYyB0cmFuc2Zvcm1hdGlvbiBtb2RlbCBzdGlsbCBkb2VzIGhhdmUgc29tZSBkZXZpYXRpb24gZnJvbSBub3JtYWxpdHksIGl0IGlzIGJ5IGZhciB0aGUgbGVhc3Qgc2V2ZXJlIHZpb2xhdGlvbiBvZiB0aGUgdGhyZWUuIFRoaXMgZ2l2ZXMgYSBzdHJvbmcgcG9pbnQgdG93YXJkcyB0aGUgbG9nYXJpdGhtaWMgdHJhbnNmb3JtYXRpb24gbW9kZWwgYmVpbmcgdGhlIGJlc3Qgb25lIHRvIHVzZSBmb3IgdGhlIHByZWRpY3Rpb24gYW5kIGVzdGltYXRpb24gb2YgYXJlYS4NCg0KDQojIyMgR29vZG5lc3Mgb2YgRml0IA0KDQpXZSB3aWxsIG5vdyBsb29rIGF0IG90aGVyIGdvb2RuZXNzIG9mIGZpdCBtZXRob2RzIGZvciB0aGUgZmluYWwgdGhyZWUgbW9kZWxzIG9mIGNvbnNpZGVyYXRpb24uIFRoZXNlIG1ldGhvZHMgZm9yIGdvb2RuZXNzIG9mIGZpdCB3aWxsIGluY2x1ZGUgdXNlZnVsIHRvb2xzIGZvciBzdGF0aXN0aWNhbCBhbmFseXNpcyBzdWNoIGFzIFItc3F1YXJlZCB2YWx1ZSwgQUlDLCBhbmQgTWFsbG93J3MgQ3AuIA0KDQpgYGB7cn0NCnNlbGVjdD1mdW5jdGlvbihtKXsgDQogZSA9IG0kcmVzaWQgICAgICAgICAgICAgICAgICAgICAgICAgIA0KIG4wID0gbGVuZ3RoKGUpICAgDQogIyMgU3VtIFNxdWFyZWQgb2YgRXJyb3JzDQogU1NFPShtJGRmKSooc3VtbWFyeShtKSRzaWdtYSleMiAgIA0KDQogIyMgTXVsdGlwbGUgUi1zcXVhcmVkIA0KIFIuc3E9c3VtbWFyeShtKSRyLnNxdWFyZWQgICAgDQogDQogIyMgQWRqdXN0ZWQgUi1zcXVhcmVkDQogUi5hZGo9c3VtbWFyeShtKSRhZGoucg0KIA0KICMjIE1lYW4gU3F1YXJlZCBFcnJvcnMNCiBNU0U9KHN1bW1hcnkobSkkc2lnbWEpXjIgICAgICAgICAgICAgDQogDQogIyMgTWFsbG93J3MgQ3ANCiBDcD0oU1NFL01TRSktKG4wLTIqKG4wLW0kZGYpKSANCiANCiAjIyBBSUMgDQogQUlDPW4wKmxvZyhTU0UpLW4wKmxvZyhuMCkrMioobjAtbSRkZikgIA0KIA0KICMjIFRhYmxlIG9mIHRoZSB2YWx1ZXMgDQogWD1tb2RlbC5tYXRyaXgobSkgICAgICAgICAgICAgICAgICAgICANCiBIPVglKiVzb2x2ZSh0KFgpJSolWCklKiV0KFgpICAgICAgICAgDQogdGJsID0gYXMuZGF0YS5mcmFtZShjYmluZChTU0U9U1NFLCBSLnNxPVIuc3EsIFIuYWRqID0gUi5hZGosIENwID0gQ3AsIEFJQyA9IEFJQykpDQogbmFtZXModGJsKT1jKCJTU0UiLCAiUi5zcSIsICJSLmFkaiIsICJDcCIsICJBSUMiKQ0KIHRibA0KfQ0KYGBgDQoNCldlIHdpbGwgY3JlYXRlIGFuIG91dHB1dCB0YWJsZSB0byBkaXNwbGF5IHRoZSBnb29kbmVzcyBvZiBmaXQgdmFsdWVzIGZvciBlYWNoIG9mIHRoZSB0aHJlZSBtb2RlbHMuDQoNCmBgYHtyfQ0Kb3V0cHV0LnN1bW1hcnkgPSByYmluZChzZWxlY3QoZnVsbC5tb2RlbCksIHNlbGVjdChzcXJ0LmFyZWEubG9nLnRlbXApLCBzZWxlY3QobG9nLmFyZWEpKQ0Kcm93Lm5hbWVzKG91dHB1dC5zdW1tYXJ5KSA9IGMoImxpbmVhciBmdWxsIG1vZGVsIiwgInNxcnQuYXJlYS5sb2cudGVtcCIsICJsb2cuYXJlYSIpDQprYWJsZShvdXRwdXQuc3VtbWFyeSwgY2FwdGlvbiA9ICJHb29kbmVzcy1vZi1maXQgTWVhc3VyZXMgb2YgQ2FuZGlkYXRlIE1vZGVscyIpDQpgYGANCg0KT3ZlcmFsbCwgaXQgYXBwZWFycyB0aGF0IHVuZm9ydHVhbnRsZXkgYWxsIHRocmVlIG1vZGVscyBoYXZlIHZlcnkgbG93IFIgc3F1YXJlZCB2YWx1ZXMgaW5kaWNhdGluZyBsb3cgZXhwbGFpbmVkIHZhcmlhbmNlIHdpdGhpbiB0aGVpciByZXNwZWN0aXZlIG1vZGVscy4gVGhlIE1hbGxvdydzIENwIHZhbHVlIGZvciB0aGUgbGFzdCB0d28gbW9kZWxzLCB0aGUgc3F1YXJlIHJvb3QgYW5kIGxvZ2FyaXRobWljIHRyYW5zZm9ybWF0aW9uIG1vZGVscywgaXMgYmV0dGVyIHRoYW4gdGhhdCBvZiB0aGUgZnVsbCBsaW5lYXIgbW9kZWwuIFRoZSBsb2dhcml0aG1pYyB0cmFuc2Zvcm1hdGlvbiBtb2RlbCBoYXMgdGhlIGxvd2VzdCBBSUMgb3V0IG9mIHRoZSB0aHJlZSwgd2hpY2ggaW5kaWNhdGVzIHRoYXQgaXQgaXMgYSBiZXR0ZXIgZml0IG1vZGVsIGZvciB0aGUgZGF0YS4NCg0KQWxsIGluIGFsbCwgdGhlIGJlc3QgbW9kZWwgb2YgdGhlIHRocmVlIGFwcGVhcnMgdG8gYmUgdGhlIGxvZ2FyaXRobWljIHRyYW5zZm9ybWF0aW9uLiBUaGlzIGhhcyBiZWVuIHNob3duIGJ5IHRoZSBnb29kbmVzcyBvZiBmaXQgbWVhc3VyZXMgdGhhdCB3ZXJlIHBlcmZvcm1lZCBhcyB3ZWxsIGFzIGJ5IHRoYXQgaXQgd2FzIHRoZSBvbmx5IG1vZGVsIHdpdGggYSBzdGF0aXN0aWNhbGx5IHNpZ25pZmljYW50IHAtdmFsdWUsIHAgPSAwLjAwMTQsIHdoaWxlIHRoZSBvdGhlciB0d28gbW9kZWxzIGJvdGggaGFkIHAtdmFsdWVzIHRoYXQgd2VyZSBncmVhdGVyIHRoYW4gb3VyIGFscGhhIHZhbHVlIG9mIDAuMDUgaW5kaWNhdGluZyB0aGF0IHRoZSBvdGhlciB0d28gbW9kZWxzIHdlcmUgbm90IHN0YXRpc3RjaWFsbHkgc2lnbmlmaWNhbnQgaW4gcHJlZGljdGluZyBhcmVhIHdoaWxlIHRoZSBsb2dhcml0aG1pYyBtb2RlbCB3YXMuIA0KDQpTbywgd2Ugd2lsbCBzZWxlY3QgdGhlIGxvZ2FyaXRobWljIHRyYW5zZm9ybWF0aW9uIG1vZGVsIGFzIG91ciBmaW5hbCBtb2RlbCB0byB1c2UuIA0KDQoNCiMjIyBGaW5hbCBNb2RlbA0KDQpBZnRlciBvdXIgYW5hbHlzaXMgb2YgdGhlIHRocmVlIHBvdGVudGlhbCBjaG9pY2VzIGZvciBhIGZpbmFsIG1vZGVsLCB3ZSBkZWNpZGVkIHRoYXQgdGhlIGJlc3QgZml0IG1vZGVsIHRvIHVzZSBpcyB0aGUgbG9nYXJpdGhtaWMgdHJhbnNmb3JtYXRpb24gbW9kZWwuIFRoaXMgbW9kZWwgaGFkIHRoZSBiZXN0IGdvb2RuZXNzIG9mIGZpdCBtZWFzdXJlcyBhcyB3ZWxsIGFzIGl0IHdhcyB0aGUgb25seSBvbmUgd2l0aCBhIHN0YXRpc3RpY2FsbHkgc2lnbmlmaWNhbnQgcC12YWx1ZS4NCg0KYGBge3J9DQprYWJsZShzdW1tYXJ5KGxvZy5hcmVhKSRjb2VmLCBjYXB0aW9uID0gIkluZmVyZW50aWFsIFN0YXRpc3RpY3Mgb2YgRmluYWwgTW9kZWwtIExvZyBBcmVhIikNCmBgYA0KDQpPdXIgb3ZlcmFsbCBtb2RlbCBhcHBlYXJzIHRvIGJlIHN0YXRpc3RpY2FsbHkgc2lnbmlmaWNhbnQgZm9yIHRoZSBwcmVkaWN0aW9uIGFuZCBlc3RpbWF0aW9uIG9mIGxvZyhhcmVhKS4gSXQgYXBwZWFycyB0aGF0IGNob29zaW5nIHRoZSBsb2dhcml0aG1pYyB0cmFuc2Zvcm1hdGlvbiBhcyBvdXIgZmluYWwgbW9kZWwgd2FzIHRoZSBiZXN0IGNob2ljZSBhZnRlciBhbGwuDQoNClRoZSBjb21iaW5lZCBsb2dhcml0aG1pYyBtb2RlbCBvZiBYLCBZLCBEQywgdGVtcCwgUkgsIHdpbmQsIGFuZCByYWluLCBzdGF0aXN0aWNhbGx5IHNpZ25pZmljYW50bHkgcHJlZGljdGVkIHRoZSBsb2cgb2YgYXJlYSwgcCA9IDAuMDAxNC4NCg0KDQoNCiMgU3VtbWFyeSBvZiB0aGUgTW9kZWwNCg0KVGhlIHJlZ3Jlc3Npb24gZXF1YXRpb24gZm9yIG91ciBmaW5hbCBjaG9pY2Ugb2YgYSByZWdyZXNzaW9uIG1vZGVsIGlzIGdpdmVuIGFzIGZvbGxvd3M6DQoNCmxvZyhhcmVhKSA9IDIuNDgzNSArIDAuMDIxMiAqIFggLSAwLjAzNjggKiBZICsgMC4wMDAxICogREMgLSAwLjAxODIgKiB0ZW1wIC0gMC4wMDk4ICogUkggKyAwLjAzNTcgKiB3aW5kICsgMC4wOTExICogcmFpbi4NCg0KDQpMZXQncyBpbnRlcnByZXQgdGhlIGNvZWZmaWNpZW50cyBvZiBzb21lIG9mIHRoZSB2YXJpYWJsZXMgaW4gb3VyIGZpbmFsIG1vZGVsLiBBbHNvLCBhcyBhIHJlbWluZGVyIG9mIHRoZSB2YXJpYWJsZSBzZWN0aW9uIG9mIHRoaXMgcmVwb3J0LCB0aGUgcmVzcG9uc2UgdmFyaWFibGUgYXJlYSBpcyBnaXZlbiBpbiB1bml0cyBvZiBoZWN0YXJlcy4gDQoNCiogREM6IEZvciBldmVyeSBhZGRpdGlvbmFsIDEgdW5pdCBpbmNyZWFzZSBvZiBEQywgdGhlIG1lYXN1cmUgb2YgdGhlIG1vaXN0dXJlIGNvbnRlbnQgb2YgY29tcGFjdCBvcmdhbmljIGxheWVycyBpbiB0aGUgYXJlYSBhZmZlY3RlZCBieSB0aGUgZmlyZSwgdGhlIGxvZ2FyaXRobWljIHRyYW5zZm9ybWF0aW9uIG9mIGFyZWEgYnVybmVkIGJ5IGEgZm9yZXN0IGZpcmUgaW5jcmVhc2VzIGJ5IDAuMDAwMSBoZWN0YXJlLg0KDQoqIHRlbXA6IEZvciBldmVyeSAxIGRlZ3JlZSBDZWxzaXVzIGluY3JlYXNlIGluIHRlbXBlcmF0dXJlLCB0aGUgbG9nYXJpdGhtaWMgdHJhbnNmb3JtYXRpb24gb2YgYXJlYSBidXJuZWQgYnkgYSBmb3Jlc3QgZmlyZSBkZWNyZWFzZXMgYnkgMC4wMTgyIGhlY3RhcmUuDQoNCiogUkg6IEZvciBldmVyeSAxIHBlcmNlbnRhZ2UgaW5jcmVhc2UgaW4gdGhlIHJlbGF0aXZlIGh1bWlkaXR5LCB0aGUgbG9nYXJpdGhtaWMgdHJhbnNmb3JtYXRpb24gb2YgYXJlYSBidXJuZWQgYnkgYSBmb3Jlc3QgZmlyZSBkZWNyZWFzZXMgYnkgMC4wMDk4IGhlY3RhcmUuDQoNCiogd2luZDogRm9yIGV2ZXJ5IDEga2lsb21ldGVyIHBlciBob3VyIGluY3JlYXNlIGluIHRoZSBzcGVlZCBvZiB0aGUgd2luZCwgdGhlIGxvZ2FyaXRobWljIHRyYW5zZm9ybWF0aW9uIG9mIGFyZWEgYnVybmVkIGJ5IGEgZm9yZXN0IGZpcmUgaW5jcmVhc2VzIGJ5IDAuMDM1Ny4NCg0KKiByYWluOiBGb3IgZXZlcnkgMSBtbS9tXjIgaW5jcmVhc2UgaW4gdGhlIHJhaW4gb2NjdXJyaW5nLCB0aGUgbG9nYXJpdGhtaWMgdHJhbnNmb3JtYXRpb24gb2YgYXJlYSBidXJuZWQgYnkgYSBmb3Jlc3QgZmlyZSBpbmNyZWFzZXMgYnkgMC4wOTExLg0KDQpXZSBjYW4gc2VlIHRoYXQgdGhlIHZhcmlhYmxlcyB0aGF0IGFyZSBwb3NpdGl2ZWx5IGFzc29jaWF0ZWQgd2l0aCB0aGUgbG9nYXJpdGhtaWMgdHJhbnNmb3JtYXRpb24gb2YgYXJlYSBidXJuZWQgYnkgYSBmb3Jlc3QgZmlyZSBhcmUgWCwgREMsIHdpbmQsIGFuZCByYWluLiBUaGlzIGluZGljYXRlcyB0aGF0IGFzIHRoZXNlIHZhcmlhYmxlcyBpbmNyZWFzZSwgc28gZG9lcyB0aGUgYXJlYSBidXJuZWQgYnkgYSBmb3Jlc3QgZmlyZS4gDQoNCk9uIHRoZSBvdGhlciBoYW5kLCB0aGUgdmFyaWFibGVzIHRoYXQgYXJlIG5lZ2F0aXZlbHkgYXNzb2NpYXRlZCB3aXRoIHRoZSBsb2dhcml0aG1pYyB0cmFuc2Zvcm1hdGlvbiBvZiBhcmVhIGJ1cm5lZCBieSBhIGZvcmVzdCBmaXJlIGFyZSBZLCB0ZW1wLCBhbmQgUkguIFRoaXMgaW5kaWNhdGVzIHRoYXQgYXMgdGhlc2UgdmFyaWFibGVzIGluY3JlYXNlLCB0aGUgYXJlYSBidXJuZWQgYnkgYSBmb3Jlc3QgZmlyZSBkZWNyZWFzZXMuIA0KDQoNCg0KIyBSZXN1bHRzIGFuZCBEaXNjdXNzaW9uDQoNCk92ZXJhbGwsIGl0IHdhcyB0aGUgbG9nYXJpdGhtaWMgdHJhbnNmb3JtYXRpb24gbW9kZWwgd2hpY2ggdHVybmVkIG91dCB0byBwcm92aWRlIHRoZSBtb3N0IHN0YXRpc3RpY2FsIHNpZ25pZmljYW5jZSBmb3IgdGhlIHByZWRpY3Rpb24gYW5kIGVzdGltYXRpb24gb2YgdGhlIGFyZWEgYnVybmVkIGJ5IGEgZm9yZXN0IGZpcmUuIFRoaXMgd2FzIHRoZSBmaW5hbCBtb2RlbCB0aGF0IHdhcyBjaG9zZW4gYWZ0ZXIgdGhlIGFuYWx5c2lzIG9mIGVhY2ggb2YgdGhlIHBvdGVudGlhbCBmaW5hbCBtb2RlbHMuDQoNClRoaXMgbG9nYXJpdGhtaWMgbW9kZWwgc3Rvb2Qgb3V0IGZvciBiZWluZyB0aGUgb25seSBtb2RlbCBvdXQgb2YgdGhlIGZpbmFsIHRocmVlIG9wdGlvbnMgd2l0aCBhIHN0YXRpc3RpY2FsbHkgc2lnbmlmaWNhbnQgcC12YWx1ZS4gQWRkaXRpb25hbGx5LCB3aGlsZSB0aGlzIG1vZGVsIHN0aWxsIGhhZCBzb21lIHZpb2xhdGlvbnMgc3VjaCBhcyBhIHNsaWdodCBkZXZpYXRpb24gb2Ygbm9ybWFsaXR5IGluIGl0cyBRLVEgUGxvdCBhbmQgc29tZSBoaWdoIGxldmVyYWdlIHBvaW50cyBhbG9uZyB3aXRoIHNvbWUgcG90ZW50aWFsIG91dGxpZXJzLCBpdCBoYWQgbXVjaCBmZXdlciB2aW9sYXRpb25zIHRoYW4gZWl0aGVyIG9mIHRoZSBvdGhlciB0d28gbW9kZWxzLiBUaGVzZSBvYnNlcnZhdGlvbnMgbWFkZSBpdCBjbGVhciB0aGF0IHRoaXMgbW9kZWwgd2FzIHRoZSBiZXN0IGNob2ljZSBhbW9uZ3N0IHRoZSBvcHRpb25zIHRoYXQgd2UgaGFkLiANCg0KT3V0IG9mIGFsbCBvZiB0aGUgdmFyaWFibGVzIGluIG91ciBmaW5hbCBtb2RlbCwgdGhlIGxvZ2FyaXRobWljIHRyYW5zZm9ybWF0aW9uIG1vZGVsLCBSSCBoYXMgdGhlIGhpZ2hlc3QgbGV2ZWwgb2Ygc3RhdGlzdGljYWwgc2lnbmlmaWNhbmNlLiBIb3dldmVyLCBldmVuIHRoaXMgdmFyaWFibGUgd2l0aCB0aGUgaGlnaGVzdCBzdGF0aXN0aWNhbCBzaWduaWZpY2FuY2UgaGFkIGEgcC12YWx1ZSBvZiAwLjE5MDUsIHdoaWNoIGlzIGdyZWF0ZXIgdGhhbiBvdXIgdmFsdWUgb2YgYWxwaGEsIDAuMDUuIFRoaXMgaW5kaWNhdGVzIHRoYXQgd2hpbGUgb3VyIG1vZGVsIGFzIGEgd2hvbGUgcHJvdmlkZXMgc2lnbmlmaWNhbnQgc3RhdGlzdGljYWwgc2lnbmlmaWNhbmNlIHdpdGggYW4gb3ZlcmFsbCBwLXZhbHVlIG9mIDAuMDAxNCwgdGhlIGluZGl2aWR1YWwgdmFyaWFibGVzIGFwcGVhciB0byBoYXZlIGxlc3Mgbm90YWJsZSBzaWduaWZpY2FuY2UgdGhhbiB0aGUgb3ZlcmFsbCBtb2RlbCBhcyBhIHdob2xlLg0KDQpPdmVyYWxsLCB0aGUgbG9nYXJpdGhtaWMgbW9kZWwgd2FzIHN0YXRpc3RpY2FsbHkgc2lnbmlmaWNhbnQgaW4gaXRzIHByZWRpY3Rpb24gb2YgdGhlIGFyZWEgYnVybmVkIGJ5IGEgZm9yZXN0IGZpcmUsIGFuZCB0aGlzIGlzIHRoZSBtb2RlbCB3aGljaCB3YXMgY2hvc2VuIGZvciBwcmVkaWN0aW9uIGFuZCBlc3RpbWF0aW9uLg0KDQoNCg0KIyBSZWZlcmVuY2VzDQoNClRoaXMgZGF0YSBzZXQgd2FzIGZvdW5kIG9uIHRoZSB3ZWJzaXRlIGthZ2dsZS5jb20gdW5kZXIgdGhlIGNvbGxlY3Rpb24gb2YgZGF0YSBzZXRzLiBJbmNsdWRlZCBiZWxvdyBpcyB0aGUgY2l0YXRpb24gb2YgdGhlIHdlYnBhZ2Ugb24gd2hpY2ggdGhlIGRhdGEgc2V0IGNhbiBiZSBmb3VuZCBhcyB3ZWxsIGFzIHRoZSB3ZWJwYWdlIHdoaWNoIEkgbG9va2VkIGF0IHRvIGhlbHAgbWUgZmluZCBhIGRhdGEgc2V0IHdoaWNoIGNhdWdodCBteSBpbnRlcmVzdC4NCg0KRGFybGluZ3RvbiwgQS4gKDIwMTcsIFNlcHRlbWJlciA0KS4gRm9yZXN0IGZpcmVzIGRhdGEgc2V0LiBLYWdnbGUuIGh0dHBzOi8vd3d3LmthZ2dsZS5jb20vZGF0YXNldHMvZWxpa3BsaW0vZm9yZXN0LWZpcmVzLWRhdGEtc2V0IA0KDQoNCkt1bWFyIEEuICgyMDIzLCBOb3ZlbWJlciAxMCkuIExpbmVhciBSZWdyZXNzaW9uIERhdGFzZXRzOiBDU1YsIEV4Y2VsLg0KaHR0cHM6Ly92aXRhbGZsdXguY29tL2xpbmVhci1yZWdyZXNzaW9uLWRhdGFzZXRzLWNzdi1leGNlbC8jZ29vZ2xlX3ZpZ25ldHRlDQo=