1. Classical Test Theory

In this lecture I explain and illustrate concepts from measurement theory, with the focus being on reliability. Classical test theory (CTT) has been the foundation of psychological measurement for many years. Although measurement theory has evolved over the years to include Generalizability Theory and Item Response Theory, I will limit my discussion to CTT as it dovetails nicely with the basic concepts found in confirmatory factor analysis (CFA). Much of the introduction is borrowed from a paper I published in 2013. I will use the nouns instrument, measure, and scale interchangeably to refer to the means by which we obtain data from people. I created this document in R Markdown.

1.1 The Beginning

One of the most fundamental tenets of measurement theory was first proposed by Carl Spearman in 1904 when working to develop a means to measure individual differences in intelligence, a stable person characteristic, or trait. Spearman conceived of every measurement, or observed score, \(X_i\), as consisting of two components, a true score on the construct of interest, \(T_i\), and an error score, \(e_i\), so we can write:

\[ X_i = T_i + e_i \tag{1} \]

Because they contain error, observed values of \(X_i\) are considered fallible. The true score, \(T_i\), is the score that would be obtained under ideal or perfect conditions of measurement. Spearman’s formulation has become known as true-score theory or classic measurement theory (CTT). Because both \(T_i\) and \(e_i\) are unknowns, this formula cannot be used to estimate the measurement error in the observed scores without further assumptions.

Assumption 1: for an individual, the construct being measured is constant (over some specified time period) and the errors in measurement are random. This suggests that if an individual were to be measured an infinite number of times a series of X values would result, each consisting of the same true score but differing due to different error scores. Being random, the expected value of the error scores is zero, \(E(e_i) = 0\). Assumption 2: given assumption 1, the true score is equal to the expected value of the observed scores over an infinite number of repeated measurements (made under similar conditions), \(T_i = E(X_i)\). Assumption 3: observed differences among individuals may be due to differences in their true scores or due to differences in their error scores. This implies that the variance of observed scores is a composite of the variance of true scores and the variance of error scores:

\[ \sigma^2_X = \sigma^2_T + \sigma^2_e \tag{2} \] and a little algebra shows that \[ \frac{\sigma^2_T}{\sigma^2_X} = 1 - \frac{\sigma^2_e}{\sigma^2_X} \tag{3} \]

This last piece, the extent to which a set of measurements is free from random error variance is reliability. As a proportion, reliability can range from 0 to 1; it equals 1 when all the observed variance in a set of measurements is due only to true-score variance, that is, when there are no random errors of measurement, and it equals 0 when all the observed variance is due to random error variance. This definition implies that some measurement errors can be random while others are systematic. When measurement error is systematic, it is referred to as bias. In the remainder of this lecture we focus on random measurement error.

1.2 Covariance and Correlation

Variance is a summary statistic that indicates the variation in a set of scores from their mean (and standard deviation is the square root of variance). Covariance indicates the covariation of two sets of scores from their respective means. Covariance, and correlation have been, and continue to be extremely useful in measurement theory. To briefly illustrate covariance assume that we have measured three people on two variables x and y; their x scores are: 2, 4, and 6, and their y scores are: 7, 5, and 9. The means are readily calculated as 4 for x and 7 for y. If we express each person’s scores as a deviation from the respective means we get -2, 0, 2 for x and 0, -2, 2 for y, respectively. If we multiply the pairs of deviation scores, total them up (-2)(0) + (0)(-2) + (2)(2) = 4, and divide by the number of people contributing scores, 4/3, we obtain covariance, 1.33. Covariance can be either positive or negative, can range from negative to positive infinity, and its magnitude is dependent on the metric(s) of the two variables involved. Therefore it is difficult to know whether 1.33 represents a lot or a little covariation.

A more convenient metric for expressing covariation is the correlation coefficient \(r\). The correlation coefficient has the advantage that it is standardized; it is equal to 1.0 when there is perfect positive covariation between the two sets of scores, -1.0 when there is perfect negative covariation between the two sets of scores, and equal to 0.0 when there is no covariation. If a covariance is divided by the product of the standard deviations for x and y, we obtain \(r(x, y)\), the correlation between x and y. In the current example \(r(x, y) = 1.33/(1.63)(1.63) = .50\). For this reason, we often refer to a correlation as a standardized covariance. Another useful property of the correlation coefficient is that its square represents the proportion of variance shared between x and y. In this example \(r(x, y)^2 = .25\), so we may state that 25% of the variance in x is shared with y, and 25% of the variance in y is shared with x.

1.3 Reliability Defined

According to CTT, reliability is the proportion of variance in a set of measurements associated with true-score variance. In other words if we could correlate true scores with observed scores and square the result as, \(r(T_i, X_i)^2\), this would indicate the proportion of variance in the observed scores that is shared with the true scores. We can now write a formal definition:

\[ reliability = r(T_i, X_i)^2 = \frac{\sigma^2_T}{\sigma^2_X} = 1 - \frac{\sigma^2_e}{\sigma^2_X} \tag{4} \]

Recall that true scores are never known, and so we must derive a means of estimating \(r(T_i, X_i)^2\) from observable scores.

Measurement theorists (psychometricians) have studied random measurement error for a long time. In two seminal papers published in the same issue of the British Journal of Psychology in 1910, Carl Spearman and William Brown showed that when multiple measurements of a construct (e.g., intelligence, anxiety, emotional well-being, etc.) are obtained from the same individual and combined, the ratio of true-score variance to observed-score variance in the composite score increases. In other words, one way to reduce random measurement error is to create instruments that contain multiple measurements and to aggregate these measurements together when defining the observed score for an individual. Spearman and Brown also showed that as the number of similar measurements being combined increases, so does the reliability of the composite scores. In essence, this is why today most psychological scales are formed by aggregating responses to multiple items.

1.4 Cronbach’s Coefficient \(\alpha\)

One way of estimating reliability from observed scores on a multi-item scale is Cronbach’s \(\alpha\). Cronbach developed this coefficient in 1951 before CFA existed. If we consider a composite score made up of \(k\) items, then \(\alpha\) is defined as the ratio of inter-item covariance to composite-score variance weighted by \(k/(k - 1)\). The weight, \(k/(k - 1)\), corrects for the proportion of variance in any item which is due to the same elements as the covariance. In other words, \(\alpha\) is an estimate of the proportion of true-score variance in the multi-item scale scores. As a proportion it can range from 0.0 to 1.0, and will only be equal to 1.0 when all the variance in observed scores is true-score variance. Cronbach’s \(\alpha\) is easily calculated from the item covariance matrix \(\mathbf C\).

\[\mathbf C = \begin{bmatrix} \sigma^2_{1,1} & \sigma_{1,2} & \cdots & \sigma_{1,k} \\ \sigma_{2,1} & \sigma^2_{2,2} & \cdots & \sigma_{2,k} \\ \vdots & \vdots & \ddots & \vdots \\ \sigma_{k,1} & \sigma_{k,2} & \cdots & \sigma^2_{k,k} \end{bmatrix}\]

The diagonal elements are item variances and the off-diagonal elements are covariances. The ratio of inter-item covariance to composite-score variance is equal to 1 minus the ratio of the sum of the item variances (diagonal elements of \(\mathbf C\)) to the sum of all the elements in \(\mathbf C\). This ratio first is calculated, then subtracted from 1, and finally multiplied by \(k/(k - 1)\).

\[ \alpha =\frac{k}{k - 1} \left[1-\frac{\sum_{i=1}^k \sigma^2_{ii}} {\sum_{i=1}^k \sigma^2_{ii} + 2\sum_{i<j}^k\sigma_{ij}} \right] \tag{5} \] Although Cronbach’s \(\alpha\) is by far the most commonly reported coefficient of reliability, there are others. One of these is \(\omega\) which can be calculated from CFA parameter estimates. More on this below.

2. The CFA Model

CFA is a type of structural equation model (SEM) that focuses on the relations between observed variables and the latent variables (i.e., factors) hypothesized to underlie them. I will not go into the math here. CFA models can be used estimate reliability. When working with SEM we often rely on diagrams for presenting our hypothesized model and results. These path diagrams represent observed variables as squares, latent variables as circles, and causal influence with arrows. Figure 1 is a very basic path diagram illustrating CTT; the variance in the observed variable X is the sum of unobserved True-score variance and error variance.

lx<-matrix(1,1,1)
td<-diag(1,nrow(lx))
ph<-matrix(1,1,1)
mod0 <- lisrelModel(LX=lx, TD=td, PH=ph)
semPaths(mod0, as.expression=c("nodes","edges"), sizeMan = 8,
         sizeLat = 10, style="lisrel", rotation = 2,
         residScale=15, edge.color="black", 
         edge.label.cex = 1.5, label.cex=1.5, nodeLabels=c("X", "T"), edgeLabels=c("","e"))
Figure 1. Sources contributing to the variance of *X*. T refers to true-scores, e refers to measurement error.

Figure 1. Sources contributing to the variance of X. T refers to true-scores, e refers to measurement error.


Before we consider reliability and CFA models, we need a bit more theory for dealing with several correlations at the same time.

2.1 Path Analysis Theory

Path Analysis (PA) is a method for decomposing the correlation coefficients within a system of causally related variables. PA applies multiple linear regression and was developed by zoologist Sewall Wright in 1934. Path coefficients are standardized regression coefficients obtained from a set of inter-related linear regression models. PA allows/requires the investigator to theorize about the causal relations among a set of variables and apply his/her thinking to decompose the correlations among the variables.

To illustrate, consider two variables \(x\) and \(y\) that are correlated. We may theorize about why they are correlated using PA. They could correlate because \(x\) causes \(y\) \((x \rightarrow y)\), or because \(y\) causes \(x\) \((y \rightarrow x)\), or because \(x\) and \(y\) share a common cause, \(z\), \((x \leftarrow z \rightarrow y)\). The first two “theories” are referred to as direct effects, the third one is called a spurious effect.

PA makes certain assumptions:

1. the relations among the variables are linear, additive, and causal.
2. The residual terms are uncorrelated. That is, each residual is not correlated with the variables that precede it in the model.
3. There is a one-way causal flow in the system. Reciprocal causation between variables (i.e., feedback loops) is ruled out.
4. The variables are measured on an interval-level scale.
5. The variables are measured without random error.

These assumptions provide part of the framework for applying structural equation models. We should keep them in mind.

2.2 CTT & CFA

CFA estimates the correlations among observed variables in terms of underlying latent variables. This is convenient because we can now represent our CTT-based measurement model in mathematical terms (as a CFA model) and test it on data. Consider a generic case. We want to measure individual differences in some construct (anxiety for example). We know CTT and so we create multiple (three) statements (survey items) that on the face of it capture the construct of interest. Several individuals then read the the statements and indicate how much they agree, or disagree with each. The data can be summarized in a 3x3 covariance matrix.

CTT leads us to hypothesize that the variances of the three items are influenced by one underlying latent variable representing our construct, We can map this hypothesis into a CFA model where the three items \(x_1\), \(x_2\), and \(x_3\) are indicators of one underlying latent variable, \(\xi_1\). Our model is shown as a path diagram in Figure 2.

Specifying a generic CFA the model using LISREL notation.

# creating 1 factor w 3 indicators
# Lambda matrices:
lambdax <- matrix(0,3,1)
lambdax[1:3,1] <-1
# Phi matrix:
LatX <- matrix(1,1,1) #phi
# Theta matrix:
thd <- diag(1,nrow(lambdax))
# Combine matrices into a model:
mod1 <- lisrelModel(LX=lambdax, TD=thd, PH=LatX)

Plotting CFA path diagram:

# Plot path diagram using semPlot::semPaths sizelat=4, sizeman=3
#--making path diagram ---------------------mar(bot,lft,top,rgt) was M 6 L 8

semPaths(mod1, as.expression=c("nodes","edges"), sizeMan = 9,
         sizeLat = 12, style="lisrel", rotation = 3,
         residScale=14, edge.color="black", 
         edge.label.cex = 1.5, label.cex=1.5)
Figure 2. The LISREL model for a one factor model with three indicators.

Figure 2. The LISREL model for a one factor model with three indicators.

Figure 2 is the graphicical representation of our measurement model using LISREL notation. Squares denote observed variables (indicators) and the circle represents the latent variable or construct of interest. Each indicator has a coefficient \(\lambda_{i1}\) (lambda) linking it to the latent variable \(\xi_1\) representing our construct and a coefficient \(\theta_{ii}\) (theta) expressing its measurement error variance. PA tells us that two variables may be correlated because they share a common cause. For example, because \(x_1\) and \(x_2\) share a common cause \(\xi_1\), our model implies that \(r(x_1 x_2) = \lambda_{11}\lambda_{21}\). The same can be said about the other two correlations, \(r(x_1,x_3) = \lambda_{11}\lambda_{31}\) and \(r(x_2,x_3) = \lambda_{21}\lambda_{31}\). If the estimated correlations from our CFA model are consistent with the observed correlations, there is support for the hypothesis that the three items are measuring the same underlying construct.

2.3 Reliability Coefficient \(\omega\)

One way to interpret the \(\lambda_{ij}\) coefficients is to think of them as correlations between the indicator variables and the latent variable. Squaring them tells us the proportion of variance shared between the item and the latent construct it is hypothesized to measure. In the CTT framework this is the proportion of true-score variance in the observed variable, so larger values (approaching 1.0) are ideal. We can use the parameters from our CFA model to estimate the reliability of our multi-item scale using another index \(\omega\) (omega) which is defined as:

\[ \omega = \frac{\sum^k_{i=1}\lambda_i^2} {\sum^k_{i=1}\lambda_i^2 + \sum^k_{i=1}\theta_{ii}} \tag{6} \] The numerator represents true-score variance and the denominator represents observed variance. Equation 6 can be applied to standardized coefficients (as is done here) and to undstandardized coefficients.

2.4 CFA using lavaan

Specifying models in lavaan is pretty straightforward. There are different operators for specifying various relations among variables. Latent variables are defined using the =~ operator with the latent variable on the left and the indicator variables on the right. In the example below I show the R code for the how to specify and run a very simple CFA model in lavaan. One nice feature is that we don’t always need the raw data file; we can work from the covariance matrix, or correlation matrix plus a vector of standard deviations and the sample size.

3. An Example

This example involves three items hypothesized to measure anxiety related to COVID-19:

ax1: I am afraid of COVID-19.
ax2: Thinking about COVID-19 makes me feel threatened.
ax3: I am stressed around people because I worry I’ll catch COVID-19.

The response options were: 1 ‘Strongly Disagree’, 2 ‘Disagree’, 3 ‘Neither Agree nor Disagree’, 4 ‘Agree’, and 5 ‘Strongly Agree’. These items were included in a survey of faculty, staff, and students (N = 38,921) at a major university in the Southeast United States during the first few weeks of the pandemic in 2020.

Reading in the data:
# reading in corr matrix
corr <- '
1.000
.728 1.000
.714 .713 1.000 '
# add variable names and convert to full correlation matrix
corrfull <- lavaan::getCov(corr, names=c("ax1","ax2","ax3"))
# add SDs and convert to full covariance matrix
covfull <- lavaan::cor2cov(corrfull, sds=c(1.163, 1.127, 1.169))
# observed covariance matrix N=38921
# vector of means that may be needed (scores range from 1 to 5)
Mns<- c(3.26, 2.76, 3.00)

3.1 Correlation Table

Using sjPlot::tab_corr to create this nice table.

# Uses sjPlot to print a nice looking correlation table
sjPlot::tab_corr(corrfull, na.deletion = "listwise", digits = 3, triangle = "lower",
         title = "Correlations among observed variables (N =38,921)",
         string.diag=c('1.000','1.000','1.000'))
Correlations among observed variables (N =38,921)
  ax1 ax2 ax3
ax1 1.000    
ax2 0.728 1.000  
ax3 0.714 0.713 1.000
Computed correlation used pearson-method with listwise-deletion.
ax1: I am afraid of COVID-19.
ax2: Thinking about COVID-19 makes me feel threatened.
ax3: I am stressed around people because I worry I’ll catch COVID-19.


CCT posits that because these items are measurements of the same construct, responses to them should be correlated. Notice that the correlations range from .713 to .728. Consider the correlation between the first two items \(r(ax1, ax2) = .728\). If we square this correlation we get the proportion of variance that these two items share \(r^2(ax1, ax2) = .728^2 = 530\).

3.2 CFA of COVID Anxiety Scale

Specify the model:

# specify the CFA model
model1 <- ' COVID_Axty =~ ax1 + ax2 + ax3 '

Running the model:

# fit the path model
fit <- lavaan::cfa(model1, sample.cov=covfull, sample.nobs=38921, std.lv=T)

3.3 Results

Plotting results as path diagram:

# making path CFA diagram
fig3 <- semPlot::semPaths(fit, whatLabels = "std", layout = "tree2", 
         rotation = 1, style = "lisrel", optimizeLatRes = TRUE, nDigits=3,
         structural = FALSE, layoutSplit = FALSE,
         intercepts = FALSE, residuals = T, 
         curve = 3, curvature = 3, nCharNodes = 8, 
         sizeLat = 24, sizeLat2 = 12, sizeMan = 9,
         edge.label.cex = 1.5, label.cex=1.0, residScale=14, 
         edge.color = "black", edge.label.position = .40, DoNotPlot=T)
#--working with semptools to modify path diagrams
fig3_1 <- fig3  |> semptools::mark_sig(fit, alpha = c("(n.s.)" = 1.00, "*" = .05)) #adding *, ns
plot(fig3_1)
Figure 3. COVID Anxiety Scale measurement model

Figure 3. COVID Anxiety Scale measurement model

ax1: I am afraid of COVID-19.
ax2: Thinking about COVID-19 makes me feel threatened.
ax3: I am stressed around people because I worry I’ll catch COVID-19.


Let’s examine the parameter estimates from our model shown in Figure 3. The \(\lambda\) for ax1 is .854 and the \(\lambda\) for ax2 is .853. These are the estimated correlations of these items with the underlying construct COVID Anxiety. If we think about the notion of spurious effects from PA, we can say that the reason responses to these two items are so highly correlated is because they are both being strongly influenced by the same underlying construct, COVID-Anxiety. If we multiply these two \(\lambda\)s together we get .728 which is the observed correlation \(r(ax1,ax2)\) shown in the correlation table above. The same can be done to reproduce the other two correlations.

The three \(\theta\)s at the bottom of Figure 3 show the estimated proportion of measurement error variance in each item. If considered separately, rather than as a composite, roughly 28% of the variance in each item is measurement error. Squaring the \(\lambda\)s gives the proportion of true-score variance being “captured” by each item. Note that because all coefficients are standardized we have \(\lambda^2 + \theta = 1.0\) for each item


Full output:

I used the summary() function to write lavaan results to the console. There is a lot of output to review. The first bit is model fit statistics. Because this model is just-identified (there are as many parameters as there are data elements in the covariance matrix) the degrees of freedom are 0 and the model fit is perfect. Next we see Parameter Estimates beginning with the Latent Variables section that shows the factor loadings \(\lambda_{ij}\). The column labeled Estimate gives the unstandardized coefficients, and the column Std.all gives the completely standardized coefficients that are shown in Figure 3. Next come the Variances. Variables prefixed with a “.” indicate residual terms so these are the \(\theta_{ii}\) estimates. Finally, we see the \(R^2\) values indicating the proportion of variance that each item shares with the latent variable.
summary(fit, fit.measures=T, standardized=T, rsquare=T)
## lavaan 0.6.15 ended normally after 12 iterations
## 
##   Estimator                                         ML
##   Optimization method                           NLMINB
##   Number of model parameters                         6
## 
##   Number of observations                         38921
## 
## Model Test User Model:
##                                                       
##   Test statistic                                 0.000
##   Degrees of freedom                                 0
## 
## Model Test Baseline Model:
## 
##   Test statistic                             64012.579
##   Degrees of freedom                                 3
##   P-value                                        0.000
## 
## User Model versus Baseline Model:
## 
##   Comparative Fit Index (CFI)                    1.000
##   Tucker-Lewis Index (TLI)                       1.000
## 
## Loglikelihood and Information Criteria:
## 
##   Loglikelihood user model (H0)            -150279.741
##   Loglikelihood unrestricted model (H1)    -150279.741
##                                                       
##   Akaike (AIC)                              300571.482
##   Bayesian (BIC)                            300622.898
##   Sample-size adjusted Bayesian (SABIC)     300603.830
## 
## Root Mean Square Error of Approximation:
## 
##   RMSEA                                          0.000
##   90 Percent confidence interval - lower         0.000
##   90 Percent confidence interval - upper         0.000
##   P-value H_0: RMSEA <= 0.050                       NA
##   P-value H_0: RMSEA >= 0.080                       NA
## 
## Standardized Root Mean Square Residual:
## 
##   SRMR                                           0.000
## 
## Parameter Estimates:
## 
##   Standard errors                             Standard
##   Information                                 Expected
##   Information saturated (h1) model          Structured
## 
## Latent Variables:
##                    Estimate  Std.Err  z-value  P(>|z|)   Std.lv  Std.all
##   COVID_Axty =~                                                         
##     ax1               0.993    0.005  198.586    0.000    0.993    0.854
##     ax2               0.961    0.005  198.199    0.000    0.961    0.853
##     ax3               0.978    0.005  192.966    0.000    0.978    0.836
## 
## Variances:
##                    Estimate  Std.Err  z-value  P(>|z|)   Std.lv  Std.all
##    .ax1               0.367    0.004   85.404    0.000    0.367    0.271
##    .ax2               0.347    0.004   85.954    0.000    0.347    0.273
##    .ax3               0.411    0.004   93.077    0.000    0.411    0.301
##     COVID_Axty        1.000                               1.000    1.000
## 
## R-Square:
##                    Estimate
##     ax1               0.729
##     ax2               0.727
##     ax3               0.699

3.4 Reliability Analysis

The semTools package has a function compRelSEM that reads the lavaan output and returns the reliability estimates for each latent variable. Setting the options ‘tau.eq=T’ and ‘obs.var=T’ produces equivalent to Cronbach’s reliability coefficient \(\alpha\) (alpha). Setting ‘tau.eq=F’ produces the \(\omega\) (omega) coefficient of reliability. In this exmaple the two are quite similar.

relalpha<-semTools::compRelSEM(fit, tau.eq=T, obs.var=T)
The Cronbach’s \(\alpha\) reliability for COVID-Anxiety Scale (using eq. 5) is 0.8842327.
relomega<-semTools::compRelSEM(fit, tau.eq=F, obs.var=T)
The \(\omega\) reliability coefficient for COVID-Anxiety Scale (using eq. 6) is 0.8843122.

4. Concluding Remarks

Reliability of measurements is the extent to which they are free from random measurement error. The reliability of a set of measurements limits the degree to which they can correlate with measurements on other variables.

In this lecture we covered the basics of psychometric measurement theory and mapped key concepts onto the CFA model. We examined the reliability of data obtained using a three-item scale intended to measure anxiety related to COVID-19. CFA provided us with some psychometric information about these data. The correlations among the items are consistent with a single underlying latent variable representing our construct. Each item had about 28% measurement error variance. When treated as a composite scale the amount of measurement error variance decreased to about 12% because the true-score variance was estimated to be 88% (both \(\alpha\) and \(\omega\) were \(\approx .88\)).

Reliability is a property of data, not of the instruments used to obtain them; this means that it is more important to calculate and report the reliability of your own data, than it is to cite previously published values of reliability.

5. References

Beckstead, J.W. (2013). On measurements and their quality: Paper 1. Reliability - history, issues and procedures. International Journal of Nursing Studies, 50 (7), 968-973.

Brown, W., (1910). Some experimental results in the correlation of mental abilities. British Journal of Psychology 3, 296–322.

Cronbach, L. J. (1951). Coefficient alpha and the internal structure of tests. Psychometrika, 16 (3), 297–334.

Spearman, C., (1904). General intelligence: objectively determined and measured. American Journal of Psychology 15, 201–293.

Spearman, C., (1910). Correlation calculated with faulty data. British Journal of Psychology 3, 271–295.

I Wright, S. (1934). The method of path coefficients. Annals of Mathematical Statistics, 5, 161-215.
LS0tDQp0aXRsZTogIkFuIEludHJvZHVjdGlvbiB0byBQc3ljaG9tZXRyaWMgTWVhc3VyZW1lbnQgVGhlb3J5ICYgQ29uZmlybWF0b3J5IEZhY3RvciBBbmFseXNpcy4iDQphdXRob3I6ICJKYXNvbiBCZWNrc3RlYWQiDQpkYXRlOiAiYHIgU3lzLkRhdGUoKWAiDQpvdXRwdXQ6IA0KICBodG1sX2RvY3VtZW50Og0KICAgIHRvYzogdHJ1ZQ0KICAgIHRvY19mbG9hdDoNCiAgICAgIGNvbGxhcHNlZDogZmFsc2UNCiAgICB0b2NfZGVwdGg6IDMNCiAgICBjb2RlX2ZvbGRpbmc6IGhpZGUNCiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlDQplZGl0b3Jfb3B0aW9uczogDQogIGNodW5rX291dHB1dF90eXBlOiBjb25zb2xlDQotLS0NCg0KYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9DQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IFRSVUUpDQoNCmlmICghcmVxdWlyZSgicGFjbWFuIikpIGluc3RhbGwucGFja2FnZXMoInBhY21hbiIpDQpsaWJyYXJ5KHBhY21hbikNCiMgTG9hZCBpbnN0YWxsZWQgcGFja2FnZXMsIGluc3RhbGwgYW5kIGxvYWQgdGhlIHBhY2thZ2UgaWYgbm90IGluc3RhbGxlZA0KcGFjbWFuOjpwX2xvYWQoaGVyZSwgcmlvLCBjb25mbGljdGVkLCB0aWR5dmVyc2UsIA0KICAgICAgICAgICAgICAgamFuaXRvciwgc3VtbWFyeXRvb2xzLCBza2ltciwgRGF0YUV4cGxvcmVyLCBpbnNwZWN0ZGYsIEhtaXNjLA0KICAgICAgICAgICAgICAgbGF2YWFuLCBzZW1Ub29scywgc2Vtb3V0cHV0LCBzZW1QbG90LCBzalBsb3QsIHBzeWNoLCByZWFkciwgZHBseXIsDQogICAgICAgICAgICAgICBHUEFyb3RhdGlvbiwgcHN5Y2hUb29scywgc2VtcHRvb2xzLHRpbnl0ZXgpDQpgYGANCg0KIyMgMS4gQ2xhc3NpY2FsIFRlc3QgVGhlb3J5DQpJbiB0aGlzIGxlY3R1cmUgSSBleHBsYWluIGFuZCBpbGx1c3RyYXRlIGNvbmNlcHRzIGZyb20gbWVhc3VyZW1lbnQgdGhlb3J5LCB3aXRoIHRoZSBmb2N1cyBiZWluZyBvbiByZWxpYWJpbGl0eS4gQ2xhc3NpY2FsIHRlc3QgdGhlb3J5IChDVFQpIGhhcyBiZWVuIHRoZSBmb3VuZGF0aW9uIG9mIHBzeWNob2xvZ2ljYWwgbWVhc3VyZW1lbnQgZm9yIG1hbnkgeWVhcnMuIEFsdGhvdWdoIG1lYXN1cmVtZW50IHRoZW9yeSBoYXMgZXZvbHZlZCBvdmVyIHRoZSB5ZWFycyB0byBpbmNsdWRlIEdlbmVyYWxpemFiaWxpdHkgVGhlb3J5IGFuZCBJdGVtIFJlc3BvbnNlIFRoZW9yeSwgSSB3aWxsIGxpbWl0IG15IGRpc2N1c3Npb24gdG8gQ1RUIGFzIGl0IGRvdmV0YWlscyBuaWNlbHkgd2l0aCB0aGUgYmFzaWMgY29uY2VwdHMgZm91bmQgaW4gY29uZmlybWF0b3J5IGZhY3RvciBhbmFseXNpcyAoQ0ZBKS4gTXVjaCBvZiB0aGUgaW50cm9kdWN0aW9uIGlzIGJvcnJvd2VkIGZyb20gYSBwYXBlciBJIHB1Ymxpc2hlZCBpbiAyMDEzLiBJIHdpbGwgdXNlIHRoZSBub3VucyBpbnN0cnVtZW50LCBtZWFzdXJlLCBhbmQgc2NhbGUgaW50ZXJjaGFuZ2VhYmx5IHRvIHJlZmVyIHRvIHRoZSBtZWFucyBieSB3aGljaCB3ZSBvYnRhaW4gZGF0YSBmcm9tIHBlb3BsZS4gSSBjcmVhdGVkIHRoaXMgZG9jdW1lbnQgaW4gUiBNYXJrZG93bi4NCg0KDQojIyMgMS4xIFRoZSBCZWdpbm5pbmcNCnwgT25lIG9mIHRoZSBtb3N0IGZ1bmRhbWVudGFsIHRlbmV0cyBvZiBtZWFzdXJlbWVudCB0aGVvcnkgd2FzIGZpcnN0IHByb3Bvc2VkIGJ5IENhcmwgU3BlYXJtYW4gaW4gMTkwNCB3aGVuIHdvcmtpbmcgdG8gZGV2ZWxvcCBhIG1lYW5zIHRvIG1lYXN1cmUgaW5kaXZpZHVhbCBkaWZmZXJlbmNlcyBpbiBpbnRlbGxpZ2VuY2UsIGEgc3RhYmxlIHBlcnNvbiBjaGFyYWN0ZXJpc3RpYywgb3IgdHJhaXQuIFNwZWFybWFuIGNvbmNlaXZlZCBvZiBldmVyeSBtZWFzdXJlbWVudCwgb3Igb2JzZXJ2ZWQgc2NvcmUsICRYX2kkLCBhcyBjb25zaXN0aW5nIG9mIHR3byBjb21wb25lbnRzLCBhIHRydWUgc2NvcmUgb24gdGhlIGNvbnN0cnVjdCBvZiBpbnRlcmVzdCwgJFRfaSQsIGFuZCBhbiBlcnJvciBzY29yZSwgJGVfaSQsIHNvIHdlIGNhbiB3cml0ZToNCiQkDQpYX2kgPSBUX2kgKyBlX2kgXHRhZ3sxfQ0KJCQNCg0KQmVjYXVzZSB0aGV5IGNvbnRhaW4gZXJyb3IsIG9ic2VydmVkIHZhbHVlcyBvZiAkWF9pJCBhcmUgY29uc2lkZXJlZCBmYWxsaWJsZS4gVGhlIHRydWUgc2NvcmUsICRUX2kkLCBpcyB0aGUgc2NvcmUgdGhhdCB3b3VsZCBiZSBvYnRhaW5lZCB1bmRlciBpZGVhbCBvciBwZXJmZWN0IGNvbmRpdGlvbnMgb2YgbWVhc3VyZW1lbnQuIFNwZWFybWFu4oCZcyBmb3JtdWxhdGlvbiBoYXMgYmVjb21lIGtub3duIGFzIHRydWUtc2NvcmUgdGhlb3J5IG9yIGNsYXNzaWMgbWVhc3VyZW1lbnQgdGhlb3J5IChDVFQpLiBCZWNhdXNlIGJvdGggJFRfaSQgIGFuZCAkZV9pJCBhcmUgdW5rbm93bnMsIHRoaXMgZm9ybXVsYSBjYW5ub3QgYmUgdXNlZCB0byBlc3RpbWF0ZSB0aGUgbWVhc3VyZW1lbnQgZXJyb3IgaW4gdGhlIG9ic2VydmVkIHNjb3JlcyB3aXRob3V0IGZ1cnRoZXIgYXNzdW1wdGlvbnMuDQogDQp8ICpBc3N1bXB0aW9uIDE6KiBmb3IgYW4gaW5kaXZpZHVhbCwgdGhlIGNvbnN0cnVjdCBiZWluZyBtZWFzdXJlZCBpcyBjb25zdGFudCAob3ZlciBzb21lIHNwZWNpZmllZCB0aW1lIHBlcmlvZCkgYW5kIHRoZSBlcnJvcnMgaW4gbWVhc3VyZW1lbnQgYXJlIHJhbmRvbS4gVGhpcyBzdWdnZXN0cyB0aGF0IGlmIGFuIGluZGl2aWR1YWwgd2VyZSB0byBiZSBtZWFzdXJlZCBhbiBpbmZpbml0ZSBudW1iZXIgb2YgdGltZXMgYSBzZXJpZXMgb2YgKlgqIHZhbHVlcyB3b3VsZCByZXN1bHQsIGVhY2ggY29uc2lzdGluZyBvZiB0aGUgc2FtZSB0cnVlIHNjb3JlIGJ1dCBkaWZmZXJpbmcgZHVlIHRvIGRpZmZlcmVudCBlcnJvciBzY29yZXMuIEJlaW5nIHJhbmRvbSwgdGhlIGV4cGVjdGVkIHZhbHVlIG9mIHRoZSBlcnJvciBzY29yZXMgaXMgemVybywgJEUoZV9pKSA9IDAkLiAqQXNzdW1wdGlvbiAyOiogZ2l2ZW4gYXNzdW1wdGlvbiAxLCB0aGUgdHJ1ZSBzY29yZSBpcyBlcXVhbCB0byB0aGUgZXhwZWN0ZWQgdmFsdWUgb2YgdGhlIG9ic2VydmVkIHNjb3JlcyBvdmVyIGFuIGluZmluaXRlIG51bWJlciBvZiByZXBlYXRlZCBtZWFzdXJlbWVudHMgKG1hZGUgdW5kZXIgc2ltaWxhciBjb25kaXRpb25zKSwgJFRfaSA9IEUoWF9pKSQuICpBc3N1bXB0aW9uIDM6KiBvYnNlcnZlZCBkaWZmZXJlbmNlcyBhbW9uZyBpbmRpdmlkdWFscyBtYXkgYmUgZHVlIHRvIGRpZmZlcmVuY2VzIGluIHRoZWlyIHRydWUgc2NvcmVzIG9yIGR1ZSB0byBkaWZmZXJlbmNlcyBpbiB0aGVpciBlcnJvciBzY29yZXMuIFRoaXMgaW1wbGllcyB0aGF0IHRoZSB2YXJpYW5jZSBvZiBvYnNlcnZlZCBzY29yZXMgaXMgYSBjb21wb3NpdGUgb2YgdGhlIHZhcmlhbmNlIG9mIHRydWUgc2NvcmVzIGFuZCB0aGUgdmFyaWFuY2Ugb2YgZXJyb3Igc2NvcmVzOg0KJCQNClxzaWdtYV4yX1ggPSBcc2lnbWFeMl9UICsgXHNpZ21hXjJfZSBcdGFnezJ9IA0KJCQNCmFuZCBhIGxpdHRsZSBhbGdlYnJhIHNob3dzIHRoYXQNCiQkDQpcZnJhY3tcc2lnbWFeMl9UfXtcc2lnbWFeMl9YfSA9IDEgLSBcZnJhY3tcc2lnbWFeMl9lfXtcc2lnbWFeMl9YfSBcdGFnezN9DQokJA0KDQpUaGlzIGxhc3QgcGllY2UsIHRoZSBleHRlbnQgdG8gd2hpY2ggYSBzZXQgb2YgbWVhc3VyZW1lbnRzIGlzIGZyZWUgZnJvbSByYW5kb20gZXJyb3IgdmFyaWFuY2UgaXMgKipyZWxpYWJpbGl0eSoqLiBBcyBhIHByb3BvcnRpb24sIHJlbGlhYmlsaXR5IGNhbiByYW5nZSBmcm9tIDAgdG8gMTsgaXQgZXF1YWxzIDEgd2hlbiBhbGwgdGhlIG9ic2VydmVkIHZhcmlhbmNlIGluIGEgc2V0IG9mIG1lYXN1cmVtZW50cyBpcyBkdWUgb25seSB0byB0cnVlLXNjb3JlIHZhcmlhbmNlLCB0aGF0IGlzLCB3aGVuIHRoZXJlIGFyZSBubyByYW5kb20gZXJyb3JzIG9mIG1lYXN1cmVtZW50LCBhbmQgaXQgZXF1YWxzIDAgd2hlbiBhbGwgdGhlIG9ic2VydmVkIHZhcmlhbmNlIGlzIGR1ZSB0byByYW5kb20gZXJyb3IgdmFyaWFuY2UuIFRoaXMgZGVmaW5pdGlvbiBpbXBsaWVzIHRoYXQgc29tZSBtZWFzdXJlbWVudCBlcnJvcnMgY2FuIGJlIHJhbmRvbSB3aGlsZSBvdGhlcnMgYXJlIHN5c3RlbWF0aWMuIFdoZW4gbWVhc3VyZW1lbnQgZXJyb3IgaXMgc3lzdGVtYXRpYywgaXQgaXMgcmVmZXJyZWQgdG8gYXMgYmlhcy4gSW4gdGhlIHJlbWFpbmRlciBvZiB0aGlzIGxlY3R1cmUgd2UgZm9jdXMgb24gcmFuZG9tIG1lYXN1cmVtZW50DQplcnJvci4NCg0KDQojIyMgMS4yIENvdmFyaWFuY2UgYW5kIENvcnJlbGF0aW9uDQpWYXJpYW5jZSBpcyBhIHN1bW1hcnkgc3RhdGlzdGljIHRoYXQgaW5kaWNhdGVzIHRoZSB2YXJpYXRpb24gaW4gYSBzZXQgb2Ygc2NvcmVzIGZyb20gdGhlaXIgbWVhbiAoYW5kIHN0YW5kYXJkIGRldmlhdGlvbiBpcyB0aGUgc3F1YXJlIHJvb3Qgb2YgdmFyaWFuY2UpLiBDb3ZhcmlhbmNlIGluZGljYXRlcyB0aGUgY292YXJpYXRpb24gb2YgdHdvIHNldHMgb2Ygc2NvcmVzIGZyb20gdGhlaXIgcmVzcGVjdGl2ZSBtZWFucy4gQ292YXJpYW5jZSwgYW5kIGNvcnJlbGF0aW9uIGhhdmUgYmVlbiwgYW5kIGNvbnRpbnVlIHRvIGJlIGV4dHJlbWVseSB1c2VmdWwgaW4gbWVhc3VyZW1lbnQgdGhlb3J5LiBUbyBicmllZmx5IGlsbHVzdHJhdGUgY292YXJpYW5jZSBhc3N1bWUgdGhhdCB3ZSBoYXZlIG1lYXN1cmVkIHRocmVlIHBlb3BsZSBvbiB0d28gdmFyaWFibGVzICp4KiBhbmQgKnkqOyB0aGVpciAqeCogc2NvcmVzIGFyZTogMiwgNCwgYW5kIDYsIGFuZCB0aGVpciAqeSogc2NvcmVzIGFyZTogNywgNSwgYW5kIDkuIFRoZSBtZWFucyBhcmUgcmVhZGlseSBjYWxjdWxhdGVkIGFzIDQgZm9yICp4KiBhbmQgNyBmb3IgKnkqLiBJZiB3ZSBleHByZXNzIGVhY2ggcGVyc29u4oCZcyBzY29yZXMgYXMgYSBkZXZpYXRpb24gZnJvbSB0aGUgcmVzcGVjdGl2ZSBtZWFucyB3ZSBnZXQgLTIsIDAsIDIgZm9yICp4KiBhbmQgMCwgLTIsIDIgZm9yICp5KiwgcmVzcGVjdGl2ZWx5LiBJZiB3ZSBtdWx0aXBseSB0aGUgcGFpcnMgb2YgZGV2aWF0aW9uIHNjb3JlcywgdG90YWwgdGhlbSB1cCAoLTIpKDApICsgKDApKC0yKSArICgyKSgyKSA9IDQsIGFuZCBkaXZpZGUgYnkgdGhlIG51bWJlciBvZiBwZW9wbGUgY29udHJpYnV0aW5nIHNjb3JlcywgNC8zLCB3ZSBvYnRhaW4gY292YXJpYW5jZSwgMS4zMy4gQ292YXJpYW5jZSBjYW4gYmUgZWl0aGVyIHBvc2l0aXZlIG9yIG5lZ2F0aXZlLCBjYW4gcmFuZ2UgZnJvbSBuZWdhdGl2ZSB0byBwb3NpdGl2ZSBpbmZpbml0eSwgYW5kIGl0cyBtYWduaXR1ZGUgaXMgZGVwZW5kZW50IG9uIHRoZSBtZXRyaWMocykgb2YgdGhlIHR3byB2YXJpYWJsZXMgaW52b2x2ZWQuIFRoZXJlZm9yZSBpdCBpcyBkaWZmaWN1bHQgdG8ga25vdyB3aGV0aGVyIDEuMzMgcmVwcmVzZW50cyBhIGxvdCBvciBhIGxpdHRsZSBjb3ZhcmlhdGlvbi4gDQoNCnwgQSBtb3JlIGNvbnZlbmllbnQgbWV0cmljIGZvciBleHByZXNzaW5nIGNvdmFyaWF0aW9uIGlzIHRoZSBjb3JyZWxhdGlvbiBjb2VmZmljaWVudCAkciQuIFRoZSBjb3JyZWxhdGlvbiBjb2VmZmljaWVudCBoYXMgdGhlIGFkdmFudGFnZSB0aGF0IGl0IGlzIHN0YW5kYXJkaXplZDsgaXQgaXMgZXF1YWwgdG8gMS4wIHdoZW4gdGhlcmUgaXMgcGVyZmVjdCBwb3NpdGl2ZSBjb3ZhcmlhdGlvbiBiZXR3ZWVuIHRoZSB0d28gc2V0cyBvZiBzY29yZXMsIC0xLjAgd2hlbiB0aGVyZSBpcyBwZXJmZWN0IG5lZ2F0aXZlIGNvdmFyaWF0aW9uIGJldHdlZW4gdGhlIHR3byBzZXRzIG9mIHNjb3JlcywgYW5kIGVxdWFsIHRvIDAuMCB3aGVuIHRoZXJlIGlzIG5vIGNvdmFyaWF0aW9uLiBJZiBhIGNvdmFyaWFuY2UgaXMgZGl2aWRlZCBieSB0aGUgcHJvZHVjdCBvZiB0aGUgc3RhbmRhcmQgZGV2aWF0aW9ucyBmb3IgKngqIGFuZCAqeSosIHdlIG9idGFpbiAkcih4LCB5KSQsIHRoZSBjb3JyZWxhdGlvbiBiZXR3ZWVuICp4KiBhbmQgKnkqLiBJbiB0aGUgY3VycmVudCBleGFtcGxlICRyKHgsIHkpID0gMS4zMy8oMS42MykoMS42MykgPSAuNTAkLiBGb3IgdGhpcyByZWFzb24sIHdlIG9mdGVuIHJlZmVyIHRvIGEgY29ycmVsYXRpb24gYXMgYSAqc3RhbmRhcmRpemVkIGNvdmFyaWFuY2UqLiBBbm90aGVyIHVzZWZ1bCBwcm9wZXJ0eSBvZiB0aGUgY29ycmVsYXRpb24gY29lZmZpY2llbnQgaXMgdGhhdCBpdHMgc3F1YXJlIHJlcHJlc2VudHMgdGhlIHByb3BvcnRpb24gb2YgdmFyaWFuY2Ugc2hhcmVkIGJldHdlZW4gKngqIGFuZCAqeSouIEluIHRoaXMgZXhhbXBsZSAkcih4LCB5KV4yID0gLjI1JCwgc28gd2UgbWF5IHN0YXRlIHRoYXQgMjUlIG9mIHRoZSB2YXJpYW5jZSBpbiAqeCogaXMgc2hhcmVkIHdpdGggKnkqLCBhbmQgMjUlIG9mIHRoZSB2YXJpYW5jZSBpbiAqeSogaXMgc2hhcmVkIHdpdGggKngqLiANCg0KIyMjIDEuMyBSZWxpYWJpbGl0eSBEZWZpbmVkDQp8IEFjY29yZGluZyB0byBDVFQsIHJlbGlhYmlsaXR5IGlzIHRoZSBwcm9wb3J0aW9uIG9mIHZhcmlhbmNlIGluIGEgc2V0IG9mIG1lYXN1cmVtZW50cyBhc3NvY2lhdGVkIHdpdGggdHJ1ZS1zY29yZSB2YXJpYW5jZS4gSW4gb3RoZXIgd29yZHMgaWYgd2UgY291bGQgY29ycmVsYXRlIHRydWUgc2NvcmVzIHdpdGggb2JzZXJ2ZWQgc2NvcmVzIGFuZCBzcXVhcmUgdGhlIHJlc3VsdCBhcywgJHIoVF9pLCBYX2kpXjIkLCB0aGlzIHdvdWxkIGluZGljYXRlIHRoZSBwcm9wb3J0aW9uIG9mIHZhcmlhbmNlIGluIHRoZSBvYnNlcnZlZCBzY29yZXMgdGhhdCBpcyBzaGFyZWQgd2l0aCB0aGUgdHJ1ZSBzY29yZXMuIFdlIGNhbiBub3cgd3JpdGUgYSBmb3JtYWwgZGVmaW5pdGlvbjogDQokJA0KcmVsaWFiaWxpdHkgPSByKFRfaSwgWF9pKV4yID0gXGZyYWN7XHNpZ21hXjJfVH17XHNpZ21hXjJfWH0gPSAxIC0gXGZyYWN7XHNpZ21hXjJfZX17XHNpZ21hXjJfWH0gXHRhZ3s0fQ0KJCQNCg0KDQpSZWNhbGwgdGhhdCB0cnVlIHNjb3JlcyBhcmUgbmV2ZXIga25vd24sIGFuZCBzbyB3ZSBtdXN0IGRlcml2ZSBhIG1lYW5zIG9mIGVzdGltYXRpbmcgJHIoVF9pLCBYX2kpXjIkIGZyb20gb2JzZXJ2YWJsZSBzY29yZXMuDQoNCnwgTWVhc3VyZW1lbnQgdGhlb3Jpc3RzIChwc3ljaG9tZXRyaWNpYW5zKSBoYXZlIHN0dWRpZWQgcmFuZG9tIG1lYXN1cmVtZW50IGVycm9yIGZvciBhIGxvbmcgdGltZS4gSW4gdHdvIHNlbWluYWwgcGFwZXJzIHB1Ymxpc2hlZCBpbiB0aGUgc2FtZSBpc3N1ZSBvZiB0aGUgKkJyaXRpc2ggSm91cm5hbCBvZiBQc3ljaG9sb2d5KiBpbiAxOTEwLCBDYXJsIFNwZWFybWFuIGFuZCBXaWxsaWFtIEJyb3duIHNob3dlZCB0aGF0IHdoZW4gbXVsdGlwbGUgbWVhc3VyZW1lbnRzIG9mIGEgY29uc3RydWN0IChlLmcuLCBpbnRlbGxpZ2VuY2UsIGFueGlldHksIGVtb3Rpb25hbCB3ZWxsLWJlaW5nLCBldGMuKSBhcmUgb2J0YWluZWQgZnJvbSB0aGUgc2FtZSBpbmRpdmlkdWFsIGFuZCBjb21iaW5lZCwgdGhlIHJhdGlvIG9mIHRydWUtc2NvcmUgdmFyaWFuY2UgdG8gb2JzZXJ2ZWQtc2NvcmUgdmFyaWFuY2UgaW4gdGhlIGNvbXBvc2l0ZSBzY29yZSBpbmNyZWFzZXMuIEluIG90aGVyIHdvcmRzLCBvbmUgd2F5IHRvIHJlZHVjZSByYW5kb20gbWVhc3VyZW1lbnQgZXJyb3IgaXMgdG8gY3JlYXRlIGluc3RydW1lbnRzIHRoYXQgY29udGFpbiBtdWx0aXBsZSBtZWFzdXJlbWVudHMgYW5kIHRvIGFnZ3JlZ2F0ZSB0aGVzZSBtZWFzdXJlbWVudHMgdG9nZXRoZXIgd2hlbiBkZWZpbmluZyB0aGUgb2JzZXJ2ZWQgc2NvcmUgZm9yIGFuIGluZGl2aWR1YWwuIFNwZWFybWFuIGFuZCBCcm93biBhbHNvIHNob3dlZCB0aGF0IGFzIHRoZSBudW1iZXIgb2Ygc2ltaWxhciBtZWFzdXJlbWVudHMgYmVpbmcgY29tYmluZWQgaW5jcmVhc2VzLCBzbyBkb2VzIHRoZSByZWxpYWJpbGl0eSBvZiB0aGUgY29tcG9zaXRlIHNjb3Jlcy4gSW4gZXNzZW5jZSwgdGhpcyBpcyB3aHkgdG9kYXkgbW9zdCBwc3ljaG9sb2dpY2FsIHNjYWxlcyBhcmUgZm9ybWVkIGJ5IGFnZ3JlZ2F0aW5nIHJlc3BvbnNlcyB0byBtdWx0aXBsZSBpdGVtcy4NCg0KDQojIyMgMS40IENyb25iYWNoJ3MgQ29lZmZpY2llbnQgJFxhbHBoYSQNCk9uZSB3YXkgb2YgZXN0aW1hdGluZyByZWxpYWJpbGl0eSBmcm9tIG9ic2VydmVkIHNjb3JlcyBvbiBhIG11bHRpLWl0ZW0gc2NhbGUgaXMgQ3JvbmJhY2gncyAkXGFscGhhJC4gQ3JvbmJhY2ggZGV2ZWxvcGVkIHRoaXMgY29lZmZpY2llbnQgaW4gMTk1MSBiZWZvcmUgQ0ZBIGV4aXN0ZWQuIElmIHdlIGNvbnNpZGVyIGEgY29tcG9zaXRlIHNjb3JlIG1hZGUgdXAgb2YgJGskIGl0ZW1zLCB0aGVuICRcYWxwaGEkIGlzIGRlZmluZWQgYXMgdGhlIHJhdGlvIG9mIGludGVyLWl0ZW0gY292YXJpYW5jZSB0byBjb21wb3NpdGUtc2NvcmUgdmFyaWFuY2Ugd2VpZ2h0ZWQgYnkgJGsvKGsgLSAxKSQuIFRoZSB3ZWlnaHQsICRrLyhrIC0gMSkkLCBjb3JyZWN0cyBmb3IgdGhlIHByb3BvcnRpb24gb2YgdmFyaWFuY2UgaW4gYW55IGl0ZW0gd2hpY2ggaXMgZHVlIHRvIHRoZSBzYW1lIGVsZW1lbnRzIGFzIHRoZSBjb3ZhcmlhbmNlLiBJbiBvdGhlciB3b3JkcywgJFxhbHBoYSQgaXMgYW4gZXN0aW1hdGUgb2YgdGhlIHByb3BvcnRpb24gb2YgdHJ1ZS1zY29yZSB2YXJpYW5jZSBpbiB0aGUgbXVsdGktaXRlbSBzY2FsZSBzY29yZXMuIEFzIGEgcHJvcG9ydGlvbiBpdCBjYW4gcmFuZ2UgZnJvbSAwLjAgdG8gMS4wLCBhbmQgd2lsbCBvbmx5IGJlIGVxdWFsIHRvIDEuMCB3aGVuIGFsbCB0aGUgdmFyaWFuY2UgaW4gb2JzZXJ2ZWQgc2NvcmVzIGlzIHRydWUtc2NvcmUgdmFyaWFuY2UuIENyb25iYWNo4oCZcyAkXGFscGhhJCBpcyBlYXNpbHkgY2FsY3VsYXRlZCBmcm9tIHRoZSBpdGVtIGNvdmFyaWFuY2UgbWF0cml4ICRcbWF0aGJmIEMkLiANCg0KJCRcbWF0aGJmIEMgPQ0KIFxiZWdpbntibWF0cml4fQ0KICBcc2lnbWFeMl97MSwxfSAmIFxzaWdtYV97MSwyfSAmIFxjZG90cyAmIFxzaWdtYV97MSxrfSBcXA0KICBcc2lnbWFfezIsMX0gJiBcc2lnbWFeMl97MiwyfSAmIFxjZG90cyAmIFxzaWdtYV97MixrfSBcXA0KICBcdmRvdHMgICYgXHZkb3RzICAmIFxkZG90cyAmIFx2ZG90cyAgXFwNCiAgXHNpZ21hX3trLDF9ICYgXHNpZ21hX3trLDJ9ICYgXGNkb3RzICYgXHNpZ21hXjJfe2ssa30NCiBcZW5ke2JtYXRyaXh9JCQNCiANCg0KVGhlIGRpYWdvbmFsIGVsZW1lbnRzIGFyZSBpdGVtIHZhcmlhbmNlcyBhbmQgdGhlIG9mZi1kaWFnb25hbCBlbGVtZW50cyBhcmUgY292YXJpYW5jZXMuIFRoZSByYXRpbyBvZiBpbnRlci1pdGVtIGNvdmFyaWFuY2UgdG8gY29tcG9zaXRlLXNjb3JlIHZhcmlhbmNlIGlzIGVxdWFsIHRvIDEgbWludXMgdGhlIHJhdGlvIG9mIHRoZSBzdW0gb2YgdGhlIGl0ZW0gdmFyaWFuY2VzIChkaWFnb25hbCBlbGVtZW50cyBvZiAkXG1hdGhiZiBDJCkgdG8gdGhlIHN1bSBvZiBhbGwgdGhlIGVsZW1lbnRzIGluICRcbWF0aGJmIEMkLiBUaGlzIHJhdGlvIGZpcnN0IGlzIGNhbGN1bGF0ZWQsIHRoZW4gc3VidHJhY3RlZCBmcm9tIDEsIGFuZCBmaW5hbGx5IG11bHRpcGxpZWQgYnkgJGsvKGsgLSAxKSQuIA0KDQoNCiQkDQpcYWxwaGEgPVxmcmFje2t9e2sgLSAxfSBcbGVmdFsxLVxmcmFje1xzdW1fe2k9MX1eayBcc2lnbWFeMl97aWl9fSB7XHN1bV97aT0xfV5rIFxzaWdtYV4yX3tpaX0gKyAyXHN1bV97aTxqfV5rXHNpZ21hX3tpan19IFxyaWdodF0gXHRhZ3s1fQ0KJCQNCkFsdGhvdWdoIENyb25iYWNoJ3MgJFxhbHBoYSQgaXMgYnkgZmFyIHRoZSBtb3N0IGNvbW1vbmx5IHJlcG9ydGVkIGNvZWZmaWNpZW50IG9mIHJlbGlhYmlsaXR5LCB0aGVyZSBhcmUgb3RoZXJzLiBPbmUgb2YgdGhlc2UgaXMgJFxvbWVnYSQgd2hpY2ggY2FuIGJlIGNhbGN1bGF0ZWQgZnJvbSBDRkEgcGFyYW1ldGVyIGVzdGltYXRlcy4gTW9yZSBvbiB0aGlzIGJlbG93Lg0KDQoNCiMjIDIuIFRoZSBDRkEgTW9kZWwNCkNGQSBpcyBhIHR5cGUgb2Ygc3RydWN0dXJhbCBlcXVhdGlvbiBtb2RlbCAoU0VNKSB0aGF0IGZvY3VzZXMgb24gdGhlIHJlbGF0aW9ucyBiZXR3ZWVuIG9ic2VydmVkIHZhcmlhYmxlcyBhbmQgdGhlIGxhdGVudCB2YXJpYWJsZXMgKGkuZS4sIGZhY3RvcnMpIGh5cG90aGVzaXplZCB0byB1bmRlcmxpZSB0aGVtLiBJIHdpbGwgbm90IGdvIGludG8gdGhlIG1hdGggaGVyZS4gQ0ZBIG1vZGVscyBjYW4gYmUgdXNlZCBlc3RpbWF0ZSByZWxpYWJpbGl0eS4gV2hlbiB3b3JraW5nIHdpdGggU0VNIHdlIG9mdGVuIHJlbHkgb24gZGlhZ3JhbXMgZm9yIHByZXNlbnRpbmcgb3VyIGh5cG90aGVzaXplZCBtb2RlbCBhbmQgcmVzdWx0cy4gVGhlc2UgcGF0aCBkaWFncmFtcyByZXByZXNlbnQgb2JzZXJ2ZWQgdmFyaWFibGVzIGFzIHNxdWFyZXMsIGxhdGVudCB2YXJpYWJsZXMgYXMgY2lyY2xlcywgYW5kIGNhdXNhbCBpbmZsdWVuY2Ugd2l0aCBhcnJvd3MuIEZpZ3VyZSAxIGlzIGEgdmVyeSBiYXNpYyBwYXRoIGRpYWdyYW0gaWxsdXN0cmF0aW5nIENUVDsgdGhlIHZhcmlhbmNlIGluIHRoZSBvYnNlcnZlZCB2YXJpYWJsZSAqWCogaXMgdGhlIHN1bSBvZiB1bm9ic2VydmVkIFRydWUtc2NvcmUgdmFyaWFuY2UgYW5kIGVycm9yIHZhcmlhbmNlLg0KYGBge3IsIGZpZy53aWR0aD01LCBmaWcuaGVpZ2h0PTIsIGZpZy5hbGlnbj0nY2VudGVyJywgZmlnLmNhcD0nRmlndXJlIDEuIFNvdXJjZXMgY29udHJpYnV0aW5nIHRvIHRoZSB2YXJpYW5jZSBvZiAqWCouIFQgcmVmZXJzIHRvIHRydWUtc2NvcmVzLCBlIHJlZmVycyB0byBtZWFzdXJlbWVudCBlcnJvci4nfQ0KbHg8LW1hdHJpeCgxLDEsMSkNCnRkPC1kaWFnKDEsbnJvdyhseCkpDQpwaDwtbWF0cml4KDEsMSwxKQ0KbW9kMCA8LSBsaXNyZWxNb2RlbChMWD1seCwgVEQ9dGQsIFBIPXBoKQ0Kc2VtUGF0aHMobW9kMCwgYXMuZXhwcmVzc2lvbj1jKCJub2RlcyIsImVkZ2VzIiksIHNpemVNYW4gPSA4LA0KICAgICAgICAgc2l6ZUxhdCA9IDEwLCBzdHlsZT0ibGlzcmVsIiwgcm90YXRpb24gPSAyLA0KICAgICAgICAgcmVzaWRTY2FsZT0xNSwgZWRnZS5jb2xvcj0iYmxhY2siLCANCiAgICAgICAgIGVkZ2UubGFiZWwuY2V4ID0gMS41LCBsYWJlbC5jZXg9MS41LCBub2RlTGFiZWxzPWMoIlgiLCAiVCIpLCBlZGdlTGFiZWxzPWMoIiIsImUiKSkNCmBgYA0KfCANCnwgQmVmb3JlIHdlIGNvbnNpZGVyIHJlbGlhYmlsaXR5IGFuZCBDRkEgbW9kZWxzLCB3ZSBuZWVkIGEgYml0IG1vcmUgdGhlb3J5IGZvciBkZWFsaW5nIHdpdGggc2V2ZXJhbCBjb3JyZWxhdGlvbnMgYXQgdGhlIHNhbWUgdGltZS4NCg0KIyMjIDIuMSBQYXRoIEFuYWx5c2lzIFRoZW9yeQ0KUGF0aCBBbmFseXNpcyAoUEEpIGlzIGEgbWV0aG9kIGZvciBkZWNvbXBvc2luZyB0aGUgY29ycmVsYXRpb24gY29lZmZpY2llbnRzIHdpdGhpbiBhIHN5c3RlbSBvZiBjYXVzYWxseSByZWxhdGVkIHZhcmlhYmxlcy4gUEEgYXBwbGllcyBtdWx0aXBsZSBsaW5lYXIgcmVncmVzc2lvbiBhbmQgd2FzIGRldmVsb3BlZCBieSB6b29sb2dpc3QgU2V3YWxsIFdyaWdodCBpbiAxOTM0LiAqUGF0aCBjb2VmZmljaWVudHMgYXJlIHN0YW5kYXJkaXplZCByZWdyZXNzaW9uIGNvZWZmaWNpZW50cyBvYnRhaW5lZCBmcm9tIGEgc2V0IG9mIGludGVyLXJlbGF0ZWQgbGluZWFyIHJlZ3Jlc3Npb24gbW9kZWxzKi4gUEEgYWxsb3dzL3JlcXVpcmVzIHRoZSBpbnZlc3RpZ2F0b3IgdG8gdGhlb3JpemUgYWJvdXQgdGhlIGNhdXNhbCByZWxhdGlvbnMgYW1vbmcgYSBzZXQgb2YgdmFyaWFibGVzIGFuZCBhcHBseSBoaXMvaGVyIHRoaW5raW5nIHRvIGRlY29tcG9zZSB0aGUgY29ycmVsYXRpb25zIGFtb25nIHRoZSB2YXJpYWJsZXMuDQoNCg0KfCBUbyBpbGx1c3RyYXRlLCBjb25zaWRlciB0d28gdmFyaWFibGVzICR4JCBhbmQgJHkkIHRoYXQgYXJlIGNvcnJlbGF0ZWQuIFdlIG1heSB0aGVvcml6ZSBhYm91dCAqd2h5KiB0aGV5IGFyZSBjb3JyZWxhdGVkIHVzaW5nIFBBLiBUaGV5IGNvdWxkIGNvcnJlbGF0ZSBiZWNhdXNlICR4JCBjYXVzZXMgJHkkICQoeCBccmlnaHRhcnJvdyB5KSQsIG9yIGJlY2F1c2UgJHkkIGNhdXNlcyAkeCQgJCh5IFxyaWdodGFycm93IHgpJCwgb3IgYmVjYXVzZSAkeCQgYW5kICR5JCBzaGFyZSBhIGNvbW1vbiBjYXVzZSwgJHokLCAkKHggXGxlZnRhcnJvdyB6IFxyaWdodGFycm93IHkpJC4gVGhlIGZpcnN0IHR3byAidGhlb3JpZXMiIGFyZSByZWZlcnJlZCB0byBhcyBkaXJlY3QgZWZmZWN0cywgdGhlIHRoaXJkIG9uZSBpcyBjYWxsZWQgYSAqc3B1cmlvdXMgZWZmZWN0Ki4NCg0KfA0KfCANClBBIG1ha2VzIGNlcnRhaW4gYXNzdW1wdGlvbnM6DQoNCnwgMS4gdGhlIHJlbGF0aW9ucyBhbW9uZyB0aGUgdmFyaWFibGVzIGFyZSBsaW5lYXIsIGFkZGl0aXZlLCBhbmQgY2F1c2FsLg0KDQp8IDIuIFRoZSByZXNpZHVhbCB0ZXJtcyBhcmUgdW5jb3JyZWxhdGVkLiBUaGF0IGlzLCBlYWNoIHJlc2lkdWFsIGlzIG5vdCBjb3JyZWxhdGVkIHdpdGggdGhlIHZhcmlhYmxlcyB0aGF0IHByZWNlZGUgaXQgaW4gdGhlIG1vZGVsLiANCg0KfCAzLiBUaGVyZSBpcyBhIG9uZS13YXkgY2F1c2FsIGZsb3cgaW4gdGhlIHN5c3RlbS4gUmVjaXByb2NhbCBjYXVzYXRpb24gYmV0d2VlbiB2YXJpYWJsZXMgKGkuZS4sIGZlZWRiYWNrIGxvb3BzKSBpcyBydWxlZCBvdXQuDQoNCnwgNC4gVGhlIHZhcmlhYmxlcyBhcmUgbWVhc3VyZWQgb24gYW4gaW50ZXJ2YWwtbGV2ZWwgc2NhbGUuDQoNCnwgNS4gVGhlIHZhcmlhYmxlcyBhcmUgbWVhc3VyZWQgd2l0aG91dCByYW5kb20gZXJyb3IuDQpUaGVzZSBhc3N1bXB0aW9ucyBwcm92aWRlIHBhcnQgb2YgdGhlIGZyYW1ld29yayBmb3IgYXBwbHlpbmcgc3RydWN0dXJhbCBlcXVhdGlvbiBtb2RlbHMuIFdlIHNob3VsZCBrZWVwIHRoZW0gaW4gbWluZC4NCg0KDQojIyMgMi4yIENUVCAmIENGQQ0KQ0ZBIGVzdGltYXRlcyB0aGUgY29ycmVsYXRpb25zIGFtb25nIG9ic2VydmVkIHZhcmlhYmxlcyBpbiB0ZXJtcyBvZiB1bmRlcmx5aW5nIGxhdGVudCB2YXJpYWJsZXMuIFRoaXMgaXMgY29udmVuaWVudCBiZWNhdXNlIHdlIGNhbiBub3cgcmVwcmVzZW50IG91ciBDVFQtYmFzZWQgbWVhc3VyZW1lbnQgbW9kZWwgaW4gbWF0aGVtYXRpY2FsIHRlcm1zIChhcyBhIENGQSBtb2RlbCkgYW5kIHRlc3QgaXQgb24gZGF0YS4gQ29uc2lkZXIgYSBnZW5lcmljIGNhc2UuIFdlIHdhbnQgdG8gbWVhc3VyZSBpbmRpdmlkdWFsIGRpZmZlcmVuY2VzIGluIHNvbWUgY29uc3RydWN0IChhbnhpZXR5IGZvciBleGFtcGxlKS4gV2Uga25vdyBDVFQgYW5kIHNvIHdlIGNyZWF0ZSBtdWx0aXBsZSAodGhyZWUpIHN0YXRlbWVudHMgKHN1cnZleSBpdGVtcykgdGhhdCBvbiB0aGUgZmFjZSBvZiBpdCBjYXB0dXJlIHRoZSBjb25zdHJ1Y3Qgb2YgaW50ZXJlc3QuIFNldmVyYWwgaW5kaXZpZHVhbHMgdGhlbiByZWFkIHRoZSB0aGUgc3RhdGVtZW50cyBhbmQgaW5kaWNhdGUgaG93IG11Y2ggdGhleSBhZ3JlZSwgb3IgZGlzYWdyZWUgd2l0aCBlYWNoLiBUaGUgZGF0YSBjYW4gYmUgc3VtbWFyaXplZCBpbiBhIDN4MyBjb3ZhcmlhbmNlIG1hdHJpeC4NCg0KfCBDVFQgbGVhZHMgdXMgdG8gaHlwb3RoZXNpemUgdGhhdCB0aGUgdmFyaWFuY2VzIG9mIHRoZSB0aHJlZSBpdGVtcyBhcmUgaW5mbHVlbmNlZCBieSBvbmUgdW5kZXJseWluZyBsYXRlbnQgdmFyaWFibGUgcmVwcmVzZW50aW5nIG91ciBjb25zdHJ1Y3QsIFdlIGNhbiBtYXAgdGhpcyBoeXBvdGhlc2lzIGludG8gYSBDRkEgbW9kZWwgd2hlcmUgdGhlIHRocmVlIGl0ZW1zICR4XzEkLCAkeF8yJCwgYW5kICR4XzMkIGFyZSBpbmRpY2F0b3JzIG9mIG9uZSB1bmRlcmx5aW5nIGxhdGVudCB2YXJpYWJsZSwgJFx4aV8xJC4gT3VyIG1vZGVsIGlzIHNob3duIGFzIGEgcGF0aCBkaWFncmFtIGluIEZpZ3VyZSAyLiANCnwgDQp8IA0KDQpTcGVjaWZ5aW5nIGEgZ2VuZXJpYyBDRkEgdGhlIG1vZGVsIHVzaW5nIExJU1JFTCBub3RhdGlvbi4gDQpgYGB7ciBtb2RlbCwgZWNobz1UfQ0KIyBjcmVhdGluZyAxIGZhY3RvciB3IDMgaW5kaWNhdG9ycw0KIyBMYW1iZGEgbWF0cmljZXM6DQpsYW1iZGF4IDwtIG1hdHJpeCgwLDMsMSkNCmxhbWJkYXhbMTozLDFdIDwtMQ0KIyBQaGkgbWF0cml4Og0KTGF0WCA8LSBtYXRyaXgoMSwxLDEpICNwaGkNCiMgVGhldGEgbWF0cml4Og0KdGhkIDwtIGRpYWcoMSxucm93KGxhbWJkYXgpKQ0KIyBDb21iaW5lIG1hdHJpY2VzIGludG8gYSBtb2RlbDoNCm1vZDEgPC0gbGlzcmVsTW9kZWwoTFg9bGFtYmRheCwgVEQ9dGhkLCBQSD1MYXRYKQ0KYGBgDQoNClBsb3R0aW5nIENGQSBwYXRoIGRpYWdyYW06DQpgYGB7ciBwYXRoZGlhZ3JhbSwgZWNobz1ULCBmaWcud2lkdGg9NCxmaWcuaGVpZ2h0PTQsIGZpZy5hbGlnbj0nY2VudGVyJywgZmlnLmNhcD0iRmlndXJlIDIuIFRoZSBMSVNSRUwgbW9kZWwgZm9yIGEgb25lIGZhY3RvciBtb2RlbCB3aXRoIHRocmVlIGluZGljYXRvcnMuIn0NCiMgUGxvdCBwYXRoIGRpYWdyYW0gdXNpbmcgc2VtUGxvdDo6c2VtUGF0aHMgc2l6ZWxhdD00LCBzaXplbWFuPTMNCiMtLW1ha2luZyBwYXRoIGRpYWdyYW0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tbWFyKGJvdCxsZnQsdG9wLHJndCkgd2FzIE0gNiBMIDgNCg0Kc2VtUGF0aHMobW9kMSwgYXMuZXhwcmVzc2lvbj1jKCJub2RlcyIsImVkZ2VzIiksIHNpemVNYW4gPSA5LA0KICAgICAgICAgc2l6ZUxhdCA9IDEyLCBzdHlsZT0ibGlzcmVsIiwgcm90YXRpb24gPSAzLA0KICAgICAgICAgcmVzaWRTY2FsZT0xNCwgZWRnZS5jb2xvcj0iYmxhY2siLCANCiAgICAgICAgIGVkZ2UubGFiZWwuY2V4ID0gMS41LCBsYWJlbC5jZXg9MS41KQ0KYGBgDQp8IA0KDQp8IEZpZ3VyZSAyIGlzIHRoZSBncmFwaGljaWNhbCByZXByZXNlbnRhdGlvbiBvZiBvdXIgbWVhc3VyZW1lbnQgbW9kZWwgdXNpbmcgTElTUkVMIG5vdGF0aW9uLiBTcXVhcmVzIGRlbm90ZSBvYnNlcnZlZCB2YXJpYWJsZXMgKGluZGljYXRvcnMpIGFuZCB0aGUgY2lyY2xlIHJlcHJlc2VudHMgdGhlIGxhdGVudCB2YXJpYWJsZSBvciBjb25zdHJ1Y3Qgb2YgaW50ZXJlc3QuIEVhY2ggaW5kaWNhdG9yIGhhcyBhIGNvZWZmaWNpZW50ICRcbGFtYmRhX3tpMX0kIChsYW1iZGEpIGxpbmtpbmcgaXQgdG8gdGhlIGxhdGVudCB2YXJpYWJsZSAkXHhpXzEkIHJlcHJlc2VudGluZyBvdXIgY29uc3RydWN0IGFuZCBhIGNvZWZmaWNpZW50ICRcdGhldGFfe2lpfSQgKHRoZXRhKSBleHByZXNzaW5nIGl0cyBtZWFzdXJlbWVudCBlcnJvciB2YXJpYW5jZS4gUEEgdGVsbHMgdXMgdGhhdCB0d28gdmFyaWFibGVzIG1heSBiZSBjb3JyZWxhdGVkIGJlY2F1c2UgdGhleSBzaGFyZSBhIGNvbW1vbiBjYXVzZS4gRm9yIGV4YW1wbGUsIGJlY2F1c2UgJHhfMSQgYW5kICR4XzIkIHNoYXJlIGEgY29tbW9uIGNhdXNlICRceGlfMSQsIG91ciBtb2RlbCBpbXBsaWVzIHRoYXQgJHIoeF8xIHhfMikgPSBcbGFtYmRhX3sxMX1cbGFtYmRhX3syMX0kLiBUaGUgc2FtZSBjYW4gYmUgc2FpZCBhYm91dCB0aGUgb3RoZXIgdHdvIGNvcnJlbGF0aW9ucywgJHIoeF8xLHhfMykgPSBcbGFtYmRhX3sxMX1cbGFtYmRhX3szMX0kIGFuZCAkcih4XzIseF8zKSA9IFxsYW1iZGFfezIxfVxsYW1iZGFfezMxfSQuIElmIHRoZSBlc3RpbWF0ZWQgY29ycmVsYXRpb25zIGZyb20gb3VyIENGQSBtb2RlbCBhcmUgY29uc2lzdGVudCB3aXRoIHRoZSBvYnNlcnZlZCBjb3JyZWxhdGlvbnMsIHRoZXJlIGlzIHN1cHBvcnQgZm9yIHRoZSBoeXBvdGhlc2lzIHRoYXQgdGhlIHRocmVlIGl0ZW1zIGFyZSBtZWFzdXJpbmcgdGhlIHNhbWUgdW5kZXJseWluZyBjb25zdHJ1Y3QuDQoNCiMjIyAyLjMgUmVsaWFiaWxpdHkgQ29lZmZpY2llbnQgJFxvbWVnYSQNCnwgT25lIHdheSB0byBpbnRlcnByZXQgdGhlICRcbGFtYmRhX3tpan0kIGNvZWZmaWNpZW50cyBpcyB0byB0aGluayBvZiB0aGVtIGFzIGNvcnJlbGF0aW9ucyBiZXR3ZWVuIHRoZSBpbmRpY2F0b3IgdmFyaWFibGVzIGFuZCB0aGUgbGF0ZW50IHZhcmlhYmxlLiBTcXVhcmluZyB0aGVtIHRlbGxzIHVzIHRoZSBwcm9wb3J0aW9uIG9mIHZhcmlhbmNlIHNoYXJlZCBiZXR3ZWVuIHRoZSBpdGVtIGFuZCB0aGUgbGF0ZW50IGNvbnN0cnVjdCBpdCBpcyBoeXBvdGhlc2l6ZWQgdG8gbWVhc3VyZS4gSW4gdGhlIENUVCBmcmFtZXdvcmsgdGhpcyBpcyB0aGUgcHJvcG9ydGlvbiBvZiB0cnVlLXNjb3JlIHZhcmlhbmNlIGluIHRoZSBvYnNlcnZlZCB2YXJpYWJsZSwgc28gbGFyZ2VyIHZhbHVlcyAoYXBwcm9hY2hpbmcgMS4wKSBhcmUgaWRlYWwuIFdlIGNhbiB1c2UgdGhlIHBhcmFtZXRlcnMgZnJvbSBvdXIgQ0ZBIG1vZGVsIHRvIGVzdGltYXRlIHRoZSByZWxpYWJpbGl0eSBvZiBvdXIgbXVsdGktaXRlbSBzY2FsZSB1c2luZyBhbm90aGVyIGluZGV4ICRcb21lZ2EkIChvbWVnYSkgd2hpY2ggaXMgZGVmaW5lZCBhczoNCiQkDQpcb21lZ2EgPSBcZnJhY3tcc3VtXmtfe2k9MX1cbGFtYmRhX2leMn0gDQp7XHN1bV5rX3tpPTF9XGxhbWJkYV9pXjIgKyBcc3VtXmtfe2k9MX1cdGhldGFfe2lpfX0gICBcdGFnezZ9DQokJA0KVGhlIG51bWVyYXRvciByZXByZXNlbnRzIHRydWUtc2NvcmUgdmFyaWFuY2UgYW5kIHRoZSBkZW5vbWluYXRvciByZXByZXNlbnRzIG9ic2VydmVkIHZhcmlhbmNlLiBFcXVhdGlvbiA2IGNhbiBiZSBhcHBsaWVkIHRvIHN0YW5kYXJkaXplZCBjb2VmZmljaWVudHMgKGFzIGlzIGRvbmUgaGVyZSkgYW5kIHRvIHVuZHN0YW5kYXJkaXplZCBjb2VmZmljaWVudHMuDQoNCg0KIyMjIDIuNCBDRkEgdXNpbmcgbGF2YWFuDQpTcGVjaWZ5aW5nIG1vZGVscyBpbiBgbGF2YWFuYCBpcyBwcmV0dHkgc3RyYWlnaHRmb3J3YXJkLiBUaGVyZSBhcmUgZGlmZmVyZW50IG9wZXJhdG9ycyBmb3Igc3BlY2lmeWluZyB2YXJpb3VzIHJlbGF0aW9ucyBhbW9uZyB2YXJpYWJsZXMuIExhdGVudCB2YXJpYWJsZXMgYXJlIGRlZmluZWQgdXNpbmcgdGhlIGA9fmAgb3BlcmF0b3Igd2l0aCB0aGUgbGF0ZW50IHZhcmlhYmxlIG9uIHRoZSBsZWZ0IGFuZCB0aGUgaW5kaWNhdG9yIHZhcmlhYmxlcyBvbiB0aGUgcmlnaHQuIEluIHRoZSBleGFtcGxlIGJlbG93IEkgc2hvdyB0aGUgUiBjb2RlIGZvciB0aGUgaG93IHRvIHNwZWNpZnkgYW5kIHJ1biBhIHZlcnkgc2ltcGxlIENGQSBtb2RlbCBpbiBgbGF2YWFuYC4gT25lIG5pY2UgZmVhdHVyZSBpcyB0aGF0IHdlIGRvbid0IGFsd2F5cyBuZWVkIHRoZSByYXcgZGF0YSBmaWxlOyB3ZSBjYW4gd29yayBmcm9tIHRoZSBjb3ZhcmlhbmNlIG1hdHJpeCwgb3IgY29ycmVsYXRpb24gbWF0cml4IHBsdXMgYSB2ZWN0b3Igb2Ygc3RhbmRhcmQgZGV2aWF0aW9ucyBhbmQgdGhlIHNhbXBsZSBzaXplLiANCg0KDQojIyAzLiBBbiBFeGFtcGxlDQpUaGlzIGV4YW1wbGUgaW52b2x2ZXMgdGhyZWUgaXRlbXMgaHlwb3RoZXNpemVkIHRvIG1lYXN1cmUgYW54aWV0eSByZWxhdGVkIHRvIENPVklELTE5Og0KDQp8ICpheDE6KiBJIGFtIGFmcmFpZCBvZiBDT1ZJRC0xOS4NCnwgKmF4MjoqIFRoaW5raW5nIGFib3V0IENPVklELTE5IG1ha2VzIG1lIGZlZWwgdGhyZWF0ZW5lZC4NCnwgKmF4MzoqIEkgYW0gc3RyZXNzZWQgYXJvdW5kIHBlb3BsZSBiZWNhdXNlIEkgd29ycnkgSSdsbCBjYXRjaCBDT1ZJRC0xOS4NCnwgDQp8IFRoZSByZXNwb25zZSBvcHRpb25zIHdlcmU6IDEgJ1N0cm9uZ2x5IERpc2FncmVlJywgMiAnRGlzYWdyZWUnLCAzICdOZWl0aGVyIEFncmVlIG5vciBEaXNhZ3JlZScsICA0ICdBZ3JlZScsIGFuZCA1ICdTdHJvbmdseSBBZ3JlZScuIFRoZXNlIGl0ZW1zIHdlcmUgaW5jbHVkZWQgaW4gYSBzdXJ2ZXkgb2YgZmFjdWx0eSwgc3RhZmYsIGFuZCBzdHVkZW50cyAoKk4qID0gMzgsOTIxKSBhdCBhIG1ham9yIHVuaXZlcnNpdHkgaW4gdGhlIFNvdXRoZWFzdCBVbml0ZWQgU3RhdGVzIGR1cmluZyB0aGUgZmlyc3QgZmV3IHdlZWtzIG9mIHRoZSBwYW5kZW1pYyBpbiAyMDIwLg0KDQp8IA0KfCBSZWFkaW5nIGluIHRoZSBkYXRhOg0KYGBge3IsIGVjaG89VH0NCiMgcmVhZGluZyBpbiBjb3JyIG1hdHJpeA0KY29yciA8LSAnDQoxLjAwMA0KLjcyOCAxLjAwMA0KLjcxNCAuNzEzIDEuMDAwICcNCiMgYWRkIHZhcmlhYmxlIG5hbWVzIGFuZCBjb252ZXJ0IHRvIGZ1bGwgY29ycmVsYXRpb24gbWF0cml4DQpjb3JyZnVsbCA8LSBsYXZhYW46OmdldENvdihjb3JyLCBuYW1lcz1jKCJheDEiLCJheDIiLCJheDMiKSkNCiMgYWRkIFNEcyBhbmQgY29udmVydCB0byBmdWxsIGNvdmFyaWFuY2UgbWF0cml4DQpjb3ZmdWxsIDwtIGxhdmFhbjo6Y29yMmNvdihjb3JyZnVsbCwgc2RzPWMoMS4xNjMsIDEuMTI3LCAxLjE2OSkpDQojIG9ic2VydmVkIGNvdmFyaWFuY2UgbWF0cml4IE49Mzg5MjENCiMgdmVjdG9yIG9mIG1lYW5zIHRoYXQgbWF5IGJlIG5lZWRlZCAoc2NvcmVzIHJhbmdlIGZyb20gMSB0byA1KQ0KTW5zPC0gYygzLjI2LCAyLjc2LCAzLjAwKQ0KYGBgDQoNCiMjIyAzLjEgQ29ycmVsYXRpb24gVGFibGUNClVzaW5nIGBzalBsb3Q6OnRhYl9jb3JyYCB0byBjcmVhdGUgdGhpcyBuaWNlIHRhYmxlLg0KYGBge3J9DQojIFVzZXMgc2pQbG90IHRvIHByaW50IGEgbmljZSBsb29raW5nIGNvcnJlbGF0aW9uIHRhYmxlDQpzalBsb3Q6OnRhYl9jb3JyKGNvcnJmdWxsLCBuYS5kZWxldGlvbiA9ICJsaXN0d2lzZSIsIGRpZ2l0cyA9IDMsIHRyaWFuZ2xlID0gImxvd2VyIiwNCiAgICAgICAgIHRpdGxlID0gIkNvcnJlbGF0aW9ucyBhbW9uZyBvYnNlcnZlZCB2YXJpYWJsZXMgKE4gPTM4LDkyMSkiLA0KICAgICAgICAgc3RyaW5nLmRpYWc9YygnMS4wMDAnLCcxLjAwMCcsJzEuMDAwJykpDQpgYGANCnwgKmF4MToqIEkgYW0gYWZyYWlkIG9mIENPVklELTE5Lg0KfCAqYXgyOiogVGhpbmtpbmcgYWJvdXQgQ09WSUQtMTkgbWFrZXMgbWUgZmVlbCB0aHJlYXRlbmVkLg0KfCAqYXgzOiogSSBhbSBzdHJlc3NlZCBhcm91bmQgcGVvcGxlIGJlY2F1c2UgSSB3b3JyeSBJJ2xsIGNhdGNoIENPVklELTE5Lg0KfA0KfA0KfCBDQ1QgcG9zaXRzIHRoYXQgYmVjYXVzZSB0aGVzZSBpdGVtcyBhcmUgbWVhc3VyZW1lbnRzIG9mIHRoZSBzYW1lIGNvbnN0cnVjdCwgcmVzcG9uc2VzIHRvIHRoZW0gc2hvdWxkIGJlIGNvcnJlbGF0ZWQuIE5vdGljZSB0aGF0IHRoZSBjb3JyZWxhdGlvbnMgcmFuZ2UgZnJvbSAuNzEzIHRvIC43MjguIENvbnNpZGVyIHRoZSBjb3JyZWxhdGlvbiBiZXR3ZWVuIHRoZSBmaXJzdCB0d28gaXRlbXMgJHIoYXgxLCBheDIpID0gLjcyOCQuIElmIHdlIHNxdWFyZSB0aGlzIGNvcnJlbGF0aW9uIHdlIGdldCB0aGUgcHJvcG9ydGlvbiBvZiB2YXJpYW5jZSB0aGF0IHRoZXNlIHR3byBpdGVtcyBzaGFyZSAkcl4yKGF4MSwgYXgyKSA9IC43MjheMiA9IDUzMCQuDQoNCiMjIyAzLjIgQ0ZBIG9mIENPVklEIEFueGlldHkgU2NhbGUNCnwNClNwZWNpZnkgdGhlIG1vZGVsOg0KYGBge3IsIGVjaG89VH0NCiMgc3BlY2lmeSB0aGUgQ0ZBIG1vZGVsDQptb2RlbDEgPC0gJyBDT1ZJRF9BeHR5ID1+IGF4MSArIGF4MiArIGF4MyAnDQpgYGANCg0KUnVubmluZyB0aGUgbW9kZWw6DQpgYGB7ciwgZWNobz1UfQ0KIyBmaXQgdGhlIHBhdGggbW9kZWwNCmZpdCA8LSBsYXZhYW46OmNmYShtb2RlbDEsIHNhbXBsZS5jb3Y9Y292ZnVsbCwgc2FtcGxlLm5vYnM9Mzg5MjEsIHN0ZC5sdj1UKQ0KYGBgDQoNCiMjIyAzLjMgUmVzdWx0cw0KDQpQbG90dGluZyByZXN1bHRzIGFzIHBhdGggZGlhZ3JhbToNCmBgYHtyLCBmaWcud2lkdGg9NCxmaWcuaGVpZ2h0PTQsIGZpZy5jYXA9IkZpZ3VyZSAzLiBDT1ZJRCBBbnhpZXR5IFNjYWxlIG1lYXN1cmVtZW50IG1vZGVsIiwgZWNobz1ULCBmaWcuYWxpZ249J2NlbnRlcid9DQojIG1ha2luZyBwYXRoIENGQSBkaWFncmFtDQpmaWczIDwtIHNlbVBsb3Q6OnNlbVBhdGhzKGZpdCwgd2hhdExhYmVscyA9ICJzdGQiLCBsYXlvdXQgPSAidHJlZTIiLCANCiAgICAgICAgIHJvdGF0aW9uID0gMSwgc3R5bGUgPSAibGlzcmVsIiwgb3B0aW1pemVMYXRSZXMgPSBUUlVFLCBuRGlnaXRzPTMsDQogICAgICAgICBzdHJ1Y3R1cmFsID0gRkFMU0UsIGxheW91dFNwbGl0ID0gRkFMU0UsDQogICAgICAgICBpbnRlcmNlcHRzID0gRkFMU0UsIHJlc2lkdWFscyA9IFQsIA0KICAgICAgICAgY3VydmUgPSAzLCBjdXJ2YXR1cmUgPSAzLCBuQ2hhck5vZGVzID0gOCwgDQogICAgICAgICBzaXplTGF0ID0gMjQsIHNpemVMYXQyID0gMTIsIHNpemVNYW4gPSA5LA0KICAgICAgICAgZWRnZS5sYWJlbC5jZXggPSAxLjUsIGxhYmVsLmNleD0xLjAsIHJlc2lkU2NhbGU9MTQsIA0KICAgICAgICAgZWRnZS5jb2xvciA9ICJibGFjayIsIGVkZ2UubGFiZWwucG9zaXRpb24gPSAuNDAsIERvTm90UGxvdD1UKQ0KIy0td29ya2luZyB3aXRoIHNlbXB0b29scyB0byBtb2RpZnkgcGF0aCBkaWFncmFtcw0KZmlnM18xIDwtIGZpZzMgIHw+IHNlbXB0b29sczo6bWFya19zaWcoZml0LCBhbHBoYSA9IGMoIihuLnMuKSIgPSAxLjAwLCAiKiIgPSAuMDUpKSAjYWRkaW5nICosIG5zDQpwbG90KGZpZzNfMSkNCmBgYA0KfCAqYXgxOiogSSBhbSBhZnJhaWQgb2YgQ09WSUQtMTkuDQp8ICpheDI6KiBUaGlua2luZyBhYm91dCBDT1ZJRC0xOSBtYWtlcyBtZSBmZWVsIHRocmVhdGVuZWQuDQp8ICpheDM6KiBJIGFtIHN0cmVzc2VkIGFyb3VuZCBwZW9wbGUgYmVjYXVzZSBJIHdvcnJ5IEknbGwgY2F0Y2ggQ09WSUQtMTkuDQp8DQp8DQp8IExldCdzIGV4YW1pbmUgdGhlIHBhcmFtZXRlciBlc3RpbWF0ZXMgZnJvbSBvdXIgbW9kZWwgc2hvd24gaW4gRmlndXJlIDMuIFRoZSAkXGxhbWJkYSQgZm9yICpheDEqIGlzIC44NTQgYW5kIHRoZSAkXGxhbWJkYSQgZm9yICpheDIqIGlzIC44NTMuIFRoZXNlIGFyZSB0aGUgZXN0aW1hdGVkIGNvcnJlbGF0aW9ucyBvZiB0aGVzZSBpdGVtcyB3aXRoIHRoZSB1bmRlcmx5aW5nIGNvbnN0cnVjdCBDT1ZJRCBBbnhpZXR5LiBJZiB3ZSB0aGluayBhYm91dCB0aGUgbm90aW9uIG9mIHNwdXJpb3VzIGVmZmVjdHMgZnJvbSBQQSwgd2UgY2FuIHNheSB0aGF0IHRoZSByZWFzb24gcmVzcG9uc2VzIHRvIHRoZXNlIHR3byBpdGVtcyBhcmUgc28gaGlnaGx5IGNvcnJlbGF0ZWQgaXMgYmVjYXVzZSB0aGV5IGFyZSBib3RoIGJlaW5nIHN0cm9uZ2x5IGluZmx1ZW5jZWQgYnkgdGhlIHNhbWUgdW5kZXJseWluZyBjb25zdHJ1Y3QsIENPVklELUFueGlldHkuIElmIHdlIG11bHRpcGx5IHRoZXNlIHR3byAkXGxhbWJkYSRzIHRvZ2V0aGVyIHdlIGdldCAuNzI4IHdoaWNoIGlzIHRoZSBvYnNlcnZlZCBjb3JyZWxhdGlvbiAkcihheDEsYXgyKSQgc2hvd24gaW4gdGhlIGNvcnJlbGF0aW9uIHRhYmxlIGFib3ZlLiBUaGUgc2FtZSBjYW4gYmUgZG9uZSB0byByZXByb2R1Y2UgdGhlIG90aGVyIHR3byBjb3JyZWxhdGlvbnMuIA0KDQp8IA0KfCBUaGUgdGhyZWUgJFx0aGV0YSRzIGF0IHRoZSBib3R0b20gb2YgRmlndXJlIDMgc2hvdyB0aGUgZXN0aW1hdGVkIHByb3BvcnRpb24gb2YgbWVhc3VyZW1lbnQgZXJyb3IgdmFyaWFuY2UgaW4gZWFjaCBpdGVtLiBJZiBjb25zaWRlcmVkIHNlcGFyYXRlbHksIHJhdGhlciB0aGFuIGFzIGEgY29tcG9zaXRlLCByb3VnaGx5IDI4JSBvZiB0aGUgdmFyaWFuY2UgaW4gZWFjaCBpdGVtIGlzIG1lYXN1cmVtZW50IGVycm9yLiBTcXVhcmluZyB0aGUgJFxsYW1iZGEkcyBnaXZlcyB0aGUgcHJvcG9ydGlvbiBvZiB0cnVlLXNjb3JlIHZhcmlhbmNlIGJlaW5nICJjYXB0dXJlZCIgYnkgZWFjaCBpdGVtLiBOb3RlIHRoYXQgYmVjYXVzZSBhbGwgY29lZmZpY2llbnRzIGFyZSBzdGFuZGFyZGl6ZWQgd2UgaGF2ZSAkXGxhbWJkYV4yICsgXHRoZXRhID0gMS4wJCBmb3IgZWFjaCBpdGVtDQoNCg0KYGBge2NzcywgZWNobz1GQUxTRX0NCi5zY3JvbGwtNTAwIHsNCiAgbWF4LWhlaWdodDogNTAwcHg7DQogIG92ZXJmbG93LXk6IGF1dG87DQogIGJhY2tncm91bmQtY29sb3I6IGluaGVyaXQ7DQp9DQpgYGANCnwNCnwNCnwgDQpGdWxsIG91dHB1dDoNCg0KfCBJIHVzZWQgdGhlIGBzdW1tYXJ5KClgIGZ1bmN0aW9uIHRvIHdyaXRlIGBsYXZhYW5gIHJlc3VsdHMgdG8gdGhlIGNvbnNvbGUuIFRoZXJlIGlzIGEgbG90IG9mIG91dHB1dCB0byByZXZpZXcuIFRoZSBmaXJzdCBiaXQgaXMgbW9kZWwgZml0IHN0YXRpc3RpY3MuIEJlY2F1c2UgdGhpcyBtb2RlbCBpcyBqdXN0LWlkZW50aWZpZWQgKHRoZXJlIGFyZSBhcyBtYW55IHBhcmFtZXRlcnMgYXMgdGhlcmUgYXJlIGRhdGEgZWxlbWVudHMgaW4gdGhlIGNvdmFyaWFuY2UgbWF0cml4KSB0aGUgZGVncmVlcyBvZiBmcmVlZG9tIGFyZSAwIGFuZCB0aGUgbW9kZWwgZml0IGlzIHBlcmZlY3QuIE5leHQgd2Ugc2VlICoqUGFyYW1ldGVyIEVzdGltYXRlcyoqIGJlZ2lubmluZyB3aXRoIHRoZSBMYXRlbnQgVmFyaWFibGVzIHNlY3Rpb24gdGhhdCBzaG93cyB0aGUgZmFjdG9yIGxvYWRpbmdzICRcbGFtYmRhX3tpan0kLiBUaGUgY29sdW1uIGxhYmVsZWQgKkVzdGltYXRlKiBnaXZlcyB0aGUgdW5zdGFuZGFyZGl6ZWQgY29lZmZpY2llbnRzLCBhbmQgdGhlIGNvbHVtbiAqU3RkLmFsbCogZ2l2ZXMgdGhlIGNvbXBsZXRlbHkgc3RhbmRhcmRpemVkIGNvZWZmaWNpZW50cyB0aGF0IGFyZSBzaG93biBpbiBGaWd1cmUgMy4gTmV4dCBjb21lIHRoZSBWYXJpYW5jZXMuIFZhcmlhYmxlcyBwcmVmaXhlZCB3aXRoIGEgIi4iIGluZGljYXRlIHJlc2lkdWFsIHRlcm1zIHNvIHRoZXNlIGFyZSB0aGUgJFx0aGV0YV97aWl9JCBlc3RpbWF0ZXMuIEZpbmFsbHksIHdlIHNlZSB0aGUgJFJeMiQgdmFsdWVzIGluZGljYXRpbmcgdGhlIHByb3BvcnRpb24gb2YgdmFyaWFuY2UgdGhhdCBlYWNoIGl0ZW0gc2hhcmVzIHdpdGggdGhlIGxhdGVudCB2YXJpYWJsZS4gDQoNCmBgYHtyLCBjbGFzcy5vdXRwdXQ9InNjcm9sbC01MDAifQ0Kc3VtbWFyeShmaXQsIGZpdC5tZWFzdXJlcz1ULCBzdGFuZGFyZGl6ZWQ9VCwgcnNxdWFyZT1UKQ0KYGBgDQp8DQp8IA0KIyMjIDMuNCBSZWxpYWJpbGl0eSBBbmFseXNpcw0KVGhlIGBzZW1Ub29sc2AgcGFja2FnZSBoYXMgYSBmdW5jdGlvbiBgY29tcFJlbFNFTWAgdGhhdCByZWFkcyB0aGUgYGxhdmFhbmAgb3V0cHV0IGFuZCByZXR1cm5zIHRoZSByZWxpYWJpbGl0eSBlc3RpbWF0ZXMgZm9yIGVhY2ggbGF0ZW50IHZhcmlhYmxlLiBTZXR0aW5nIHRoZSBvcHRpb25zICd0YXUuZXE9VCcgYW5kICdvYnMudmFyPVQnIHByb2R1Y2VzIGVxdWl2YWxlbnQgdG8gQ3JvbmJhY2gncyByZWxpYWJpbGl0eSBjb2VmZmljaWVudCAkXGFscGhhJCAoYWxwaGEpLiBTZXR0aW5nICd0YXUuZXE9RicgcHJvZHVjZXMgdGhlICRcb21lZ2EkIChvbWVnYSkgY29lZmZpY2llbnQgb2YgcmVsaWFiaWxpdHkuIEluIHRoaXMgZXhtYXBsZSB0aGUgdHdvIGFyZSBxdWl0ZSBzaW1pbGFyLg0KYGBge3IsIHJlc3VsdHM9J2hvbGQnfQ0KcmVsYWxwaGE8LXNlbVRvb2xzOjpjb21wUmVsU0VNKGZpdCwgdGF1LmVxPVQsIG9icy52YXI9VCkNCmBgYA0KfCBUaGUgQ3JvbmJhY2gncyAkXGFscGhhJCByZWxpYWJpbGl0eSBmb3IgQ09WSUQtQW54aWV0eSBTY2FsZSAodXNpbmcgZXEuIDUpIGlzIGByIHJlbGFscGhhIFsxXWAuDQoNCmBgYHtyLCByZXN1bHRzPSdob2xkJ30NCnJlbG9tZWdhPC1zZW1Ub29sczo6Y29tcFJlbFNFTShmaXQsIHRhdS5lcT1GLCBvYnMudmFyPVQpDQpgYGANCnwgVGhlICRcb21lZ2EkIHJlbGlhYmlsaXR5IGNvZWZmaWNpZW50IGZvciBDT1ZJRC1BbnhpZXR5IFNjYWxlICh1c2luZyBlcS4gNikgaXMgYHIgcmVsb21lZ2EgWzFdYC4NCg0KIyMgNC4gQ29uY2x1ZGluZyBSZW1hcmtzDQoNClJlbGlhYmlsaXR5IG9mIG1lYXN1cmVtZW50cyBpcyB0aGUgZXh0ZW50IHRvIHdoaWNoIHRoZXkgYXJlIGZyZWUgZnJvbSByYW5kb20gbWVhc3VyZW1lbnQgZXJyb3IuIFRoZSByZWxpYWJpbGl0eSBvZiBhIHNldCBvZiBtZWFzdXJlbWVudHMgbGltaXRzIHRoZSBkZWdyZWUgdG8gd2hpY2ggdGhleSBjYW4gY29ycmVsYXRlIHdpdGggbWVhc3VyZW1lbnRzIG9uIG90aGVyIHZhcmlhYmxlcy4NCg0KfA0KDQp8IEluIHRoaXMgbGVjdHVyZSB3ZSBjb3ZlcmVkIHRoZSBiYXNpY3Mgb2YgcHN5Y2hvbWV0cmljIG1lYXN1cmVtZW50IHRoZW9yeSBhbmQgbWFwcGVkIGtleSBjb25jZXB0cyBvbnRvIHRoZSBDRkEgbW9kZWwuIFdlIGV4YW1pbmVkIHRoZSByZWxpYWJpbGl0eSBvZiBkYXRhIG9idGFpbmVkIHVzaW5nIGEgdGhyZWUtaXRlbSBzY2FsZSBpbnRlbmRlZCB0byBtZWFzdXJlIGFueGlldHkgcmVsYXRlZCB0byBDT1ZJRC0xOS4gQ0ZBIHByb3ZpZGVkIHVzIHdpdGggc29tZSBwc3ljaG9tZXRyaWMgaW5mb3JtYXRpb24gYWJvdXQgdGhlc2UgZGF0YS4gVGhlIGNvcnJlbGF0aW9ucyBhbW9uZyB0aGUgaXRlbXMgYXJlIGNvbnNpc3RlbnQgd2l0aCBhIHNpbmdsZSB1bmRlcmx5aW5nIGxhdGVudCB2YXJpYWJsZSByZXByZXNlbnRpbmcgb3VyIGNvbnN0cnVjdC4gRWFjaCBpdGVtIGhhZCBhYm91dCAyOCUgbWVhc3VyZW1lbnQgZXJyb3IgdmFyaWFuY2UuIFdoZW4gdHJlYXRlZCBhcyBhIGNvbXBvc2l0ZSBzY2FsZSB0aGUgYW1vdW50IG9mIG1lYXN1cmVtZW50IGVycm9yIHZhcmlhbmNlIGRlY3JlYXNlZCB0byBhYm91dCAxMiUgYmVjYXVzZSB0aGUgdHJ1ZS1zY29yZSB2YXJpYW5jZSB3YXMgZXN0aW1hdGVkIHRvIGJlIDg4JSAoYm90aCAkXGFscGhhJCBhbmQgJFxvbWVnYSQgd2VyZSAkXGFwcHJveCAuODgkKS4NCg0KfA0KfCBSZWxpYWJpbGl0eSBpcyBhIHByb3BlcnR5IG9mIGRhdGEsIG5vdCBvZiB0aGUgaW5zdHJ1bWVudHMgdXNlZCB0byBvYnRhaW4gdGhlbTsgdGhpcyBtZWFucyB0aGF0IGl0IGlzIG1vcmUgaW1wb3J0YW50IHRvIGNhbGN1bGF0ZSBhbmQgcmVwb3J0IHRoZSByZWxpYWJpbGl0eSBvZiB5b3VyIG93biBkYXRhLCB0aGFuIGl0IGlzIHRvIGNpdGUgcHJldmlvdXNseSBwdWJsaXNoZWQgdmFsdWVzIG9mIHJlbGlhYmlsaXR5Lg0KDQoNCiMjIDUuIFJlZmVyZW5jZXMNCg0KfCBCZWNrc3RlYWQsIEouVy4gKDIwMTMpLiBPbiBtZWFzdXJlbWVudHMgYW5kIHRoZWlyIHF1YWxpdHk6IFBhcGVyIDEuIFJlbGlhYmlsaXR5IC0gaGlzdG9yeSwgaXNzdWVzIGFuZCBwcm9jZWR1cmVzLiAqSW50ZXJuYXRpb25hbCBKb3VybmFsIG9mIE51cnNpbmcgU3R1ZGllcywgNTAqICg3KSwgOTY4LTk3My4NCg0KfCANCnwgQnJvd24sIFcuLCAoMTkxMCkuIFNvbWUgZXhwZXJpbWVudGFsIHJlc3VsdHMgaW4gdGhlIGNvcnJlbGF0aW9uIG9mIG1lbnRhbCBhYmlsaXRpZXMuICpCcml0aXNoIEpvdXJuYWwgb2YgUHN5Y2hvbG9neSAzKiwgMjk24oCTMzIyLg0KDQp8IA0KfCBDcm9uYmFjaCwgTC4gSi4gKDE5NTEpLiBDb2VmZmljaWVudCBhbHBoYSBhbmQgdGhlIGludGVybmFsIHN0cnVjdHVyZSBvZiB0ZXN0cy4gKlBzeWNob21ldHJpa2EsIDE2KiAoMyksIDI5N+KAkzMzNC4NCg0KfA0KfCBTcGVhcm1hbiwgQy4sICgxOTA0KS4gR2VuZXJhbCBpbnRlbGxpZ2VuY2U6IG9iamVjdGl2ZWx5IGRldGVybWluZWQgYW5kIG1lYXN1cmVkLiAqQW1lcmljYW4gSm91cm5hbCBvZiBQc3ljaG9sb2d5IDE1KiwgMjAx4oCTMjkzLg0KDQp8IA0KfCBTcGVhcm1hbiwgQy4sICgxOTEwKS4gQ29ycmVsYXRpb24gY2FsY3VsYXRlZCB3aXRoIGZhdWx0eSBkYXRhLiAqQnJpdGlzaCBKb3VybmFsIG9mIFBzeWNob2xvZ3kgMyosIDI3MeKAkzI5NS4NCiANCnwNCnwgSSBXcmlnaHQsIFMuICgxOTM0KS4gVGhlIG1ldGhvZCBvZiBwYXRoIGNvZWZmaWNpZW50cy4gKkFubmFscyBvZiBNYXRoZW1hdGljYWwgU3RhdGlzdGljcywgNSosIDE2MS0yMTUuDQo=