I. Data

There are two main data types: qualitative and quantitative. Quantitative data sets are comprised of lists of numbers and often referred to as numeric data. Qualitative data sets refer to lists of categorizations, like class rank in college. If we think of CLASS as a qualitative variable, it has four levels: freshman, sophomore, junior and senior. We tend to use single-letter codes when possible, so we might describe CLASS as having the four levels F, S, J and R (with R for senior since S is already used).

The Lady Tasting Tea example was an experiment with qualitative data. The outcomes of the test taste were 8 reports of either success or failure. For example, the data from Muriel’s attempts might have been \[\{S,F,S,S,S,F,S,S\}\] were she to have successfully identified 6 of the 8 cups of tea.

Initializing RStudio

The data set we will use primarily is Data3350 which was produced in 2015 during an undergraduate research project about personality and humor. The VarsData3350 PDF file has descriptions of each variable in the Data3350 file. Both are available for download in D2L. Be sure to put the Data3350 in your R folder in Documents, and make sure your working directory is set the same way (Session menu). The code block below uses the library function to ensure that the Mosaic package is loaded and will import the data frame used in this module: Data3350 and Dolphin.

library(mosaic)
library(readxl)
Dolphin = read_excel("Dolphin.xlsx")
Data3350 = read_excel("Data3350.xlsx")

II. Proportion Tests

When working with qualitative or category data, we can’t calculate means and standard deviations. Instead, we tally up the counts of each outcome and calculate percentages or proportions.

We have two main proportion tests, one based on the \(z\) distribution, one based on the \(\chi^2\) distribution. The \(z\)-proportion test can only handle one or two samples. We use \(\chi^2\) for category variables with more than two levels. Because \(\chi^2\) is a more robust statistic, we sometimes use it for small sample experiments in the two sample case.

Case Study: Swimming with dolphins

Let’s discuss an experiment that produced category data. A group of 30 patients experiencing chronic depression were invited to a Caribean island to take part in therapy. The researchers randomly split the group in two. Half of them received clinical treatment for their depression only (along with a huge dose of beach therapy, one presumes). The other half received the same clinical treatment (and beach therapy) plus they went swimming with dolphins.

Results

Let’s scan the data frame which summarizes the results of the experiment.

Dolphin

Setting up the Hypothesis Test

The researchers want to know whether there is enough evidence to show that the dolphin therapy is significantly better than the clinical and beach therapy option. What null hypothesis will test their claim?

\[H_0 : \text{ Results are independent of treatment}\] How could we test it? We can randomly assign the outcomes of Improved or Did Not to the dolphin group. We then check to see the percentage of times that 10 or more successes land in the randomized dolphin group.

Let’s tally the data to show the researcher’s experimental data:

tally(Result ~ Treatment, data = Dolphin)
          Treatment
Result     Control Dolphins
  Did Not       12        5
  Improved       3       10

Mosaic’s Randomization Options

  1. Shuffle. Permutes the values in the sample data.
  2. Sample. Draws a sub-sample from the sample data
    without replacement.
  3. Resample. Draws a sub-sample from the sample data
    with replacement.

Randomization for Dolphins Case Study

What if we randomly shuffled the Result variable entries? We would create random treatment vs. control group samples which could be use to estimate the probability of having at least 10 “Improved” Results in the Dolphin group. Here’s a look using Mosaic’s shuffle command.

tally(shuffle(Result) ~ Treatment, data = Dolphin)
               Treatment
shuffle(Result) Control Dolphins
       Did Not        8        9
       Improved       7        6

Run the code block above several times, and you will notice how rare it is to have 10 “Improved” results in the Dolphins group.

To create several hundred random samples and be able to count them up, we’ll use the sample function to draw samples of the Result observations of size \(n=15\). Why? This approach simulates randomly picking 15 “Improved” and “Did Not Improve” for the dolphin group. We don’t need to create the Control group since all remaining results will end up there. The dollar sign in Dolphin$Result is an operator that chooses a specific column from a data frame, in this case, the Result.

dolph = sample(Dolphin$Result, size = 15)
tally(dolph)
X
 Did Not Improved 
       9        6 

Since tally creates a vector of results, we can just grab the number of patients who improved by referencing the 2nd vector component with the square brackets: [2].

tally(dolph)[2]
Improved 
       6 

This randomization can be repeated dozens, hundreds or even thousands of times. In this way, we can determine the empirical probability that the experimental results were random noise rather than evidence that dolphin therapy works better.

Rossman & Chance

The dolphin study is a teaching approach pioneered
by Alan Rossman and Beth Chance who have created
web apps to simulate data for their own statistics
courses. You should definitely spend some time
experimenting with their Dolphin Study App.

Below, we are combining the code snips from above into one line that will do the following:

  1. Collect random samples of size \(n=15\) from the results column.
  2. Determine how many patients in this random group “Improved”
  3. Tally the number vector listing the number that improved in each of 50 randomized groups.
  4. Assign the result to the variable randDolph so we can create a histogram from the table of results.
randDolph = do(50) * tally(sample(Dolphin$Result, size = 15))[2]
randDolph

Create a histogram to clarify the picture.

histogram(~ Improved, data = randDolph,
          width = 1,
          center = 10,
          type = "count",
          main = "Histogram: Random Improvements",
          xlab = "Improvements for Dolphin Group: 50 Samples of 15 Results")

Empirical \(p\)-values using RStudio

We’re going to need lots more samples to determine this probability. Let’s jump up to 2,000 samples and see what the probability is that at least 10 of the “Improved” outcomes appear at random in a sample of 15.

Don’t push the number of trials too high. Executing the code block below will probably take at least 10 seconds, depending upon the speed of the processor used to run it.

randDolph = do(2000) * tally(sample(Dolphin$Result, 15))[2]
histogram( ~Improved, data = randDolph, 
          width = 1,
          center = 10,
          type = "count",
          main = "Histogram: Random Improvements",
          xlab = "Improvements for Dolphin Group: 2000 Samples of 15 Results")

We would like to know how many of these two thousand random samples ended up with 10 more “Improved” outcomes. That’s the probability we’re estimating. That’s our \(p\)-value.

sum(randDolph >= 10)
[1] 12

Rossman & Chance online app

App Setup

Dolphin App: Left Panel Dolphin App: Right Panel

So the \(p\)-value is \[p=\frac{12 }{2000}= 0.006\]

The R Studio simulation shows that, by random chance, 10 or more improvements in the Dolphin group would occur only about 1% of the time. Since the \(p\)-value is low, our randomized simulation suggests the null hypothesis is false.

If the improvements are not due to random chance, the researchers have evidence for the claim that the Dolphin therapy seemed to help these clinical patients.

Emprical \(p\)-values from Rossman-Chance app

You can – and should!! – perform the same simulations much more efficiently on the Rossman-Chance Dolphin applet. When you do, make sure to set the randomization \(\fbox{statistic}\) to “Cell 1 Count” in the bottom-left corner of your screen (see figure). when you click the link, the right panel will not show up. To make it appear, check the “Show Shuffle Options” box. To generate a \(p\)-value, set “Count Samples” to \(\fbox{> = 10}\). (See figure showing Right Panel.)

I ran 10,000 trials in about one second on the Rossman Chance Dolphin applet and found an empirical estimate of \[p=\frac{126}{10000} = 0.0126\] which matches pretty well to what we did earlier in RStudio. You should run both the code in RStudio as well as in the app to best understand what’s going on. The screen shot below shows the results when I used the web app for 10,000 trials.

Dolphin App

III. Modern Statistical Hypothesis Testing

Hypothesis Testing Steps

  1. Identify correct procedure
  2. Setup null \((H_0)\) and
    alternate \((H_a)\) hypotheses
  3. Verification: are data appropriate
    for procedure?
  4. Set \(\alpha\) (\(\alpha = .05\) is default value)
  5. Run Stats App to determine \(p\)-value
  6. Statistical Conclusion: “Reject \(H_0\)” or
    “Fail to reject \(H_0\)
  7. Research conclusion

Let’s perform the same analysis but with the theoretical approach to determining the \(p\)-value. I will also conduct the entire process using the hypothesis testing steps shown to the right.

Verification Procedures.

Before we begin, I should specifically discuss Step 3: Verification. We will end up using the \(\chi^2\) distribution for our theoretical estimation of the \(p\)-value mainly because the \(z\)-proportion test would fail its verification procedure due to small sample size.

Verification Procedure: \(z\)-proportion Tests

To use the \(z\)-statistic to produce estimated \(p\)-values for the binomial distribution, we must have at least 10 successes and 10 failures in all our samples. For the Dolphin study, we have only 30 observations total, so there is no possible way to have at least 10 observations in each of the four cells in the cross-tabulation table.

tally(Result ~ Treatment, data = Dolphin)
          Treatment
Result     Control Dolphins
  Did Not       12        5
  Improved       3       10

We see that the successes count is only 3 for the Control group, and failures count is only 5 for the Treatment group.

Verification Procedure: \(\chi^2\) Two-Way Tests

\(\chi^2\) in R

The Mosaic version of the \(\chi^2\) test is xchisq.test
which uses a Yates correction. To match graphing
calculator or by-hand results, turn off the Yates
correction by using argument \(\fbox{correct = TRUE}\).

To use the \(\chi^2\)-statistic to produce estimated \(p\)-values for the independence of two categorical variables, low cell counts are the problem children we must avoid, just like with the \(z\)-proportion tests. However, the \(\chi^2\) statistic is more robust (less breakable) than \(z\).

For all \(\chi^2\) statistical testing, we require that there be no more than 20% low Expected cell counts where a “low cell count” is defined to be strictly less than 5.

xchisq.test(Result ~ Treatment, data = Dolphin, correct = FALSE)

    Pearson's Chi-squared test

data:  x
X-squared = 6.6516, df = 1, p-value = 0.009907

   12        5   
 (8.50)   (8.50) 
 [1.44]   [1.44] 
< 1.20>  <-1.20> 
   
    3       10   
 (6.50)   (6.50) 
 [1.88]   [1.88] 
<-1.37>  < 1.37> 
   
key:
    observed
    (expected)
    [contribution to X-squared]
    <Pearson residual>

We ignore the \(p\)-value and other output, initially. For the verification procedure, we see that all the expected cell counts are least 5, and these data are appropriate for \(\chi^2\) procedures.

How is the Expected Matrix calculated?

The null hypothesis for \(\chi^2\) Two Way Test is that the two category variables are independent of one another. In this case, we’re saying that the results would be the same in both the Dolphin group and the Control group. Since 13 out of 30 study participants improved, we have an overall Improved Rate of \(\frac{13}{30} = 0.433\). Applying the \(43.3\%\) success rate to the 15 participants in the Dolphin group, we expect \(0.4\overline{33}*15 = 6.5\) of them to Improve.

Hypothesis Testing: Dolphin Study

while different textbooks and teachers may chunk the process differently, a scientific report of statistical conclusions requires all of the elements shown below. In scientific presentation of results, we tend to use paragraph, not bullet-point, format. The bullet points below are simply there to highlight each required portion of the statistical hypothesis test.

1. Procedure

For the study design, we are comparing the proportion of successes in two samples to one another, and generally we would use a 2-sample \(z\)-proportion test for this purpose. However, as shown above, the sample size is too small to expect accurate \(p\)-values from the \(z\)-proportion approach, so we will use a \(\chi^2\) Two Way Test, sometimes called a \(\chi^2\) Test of Independence.

2. Hypothesis

Our null hypothesis is that the results of the experimental treatment are completely independent of which group the participants were assigned to. We use the symbols \(H_0\) to indicate the null and \(H_a\) to indicate the alternate hypothesis.

\[\begin{align*} H_0 &: \text{RESULT is independent of TREATMENT}\\ H_a &: \text{RESULT is dependent upon TREATMENT} \end{align*}\]

In statistics, we often indicate variables by using words or abbreviations in uppercase letters.

3. Verification

As shown above, all four expected cell counts are at least 6.5, so we have 0% low expected cells. The data are appropriate for using \(\chi^2\) procedures.

4. Alpha

We will discuss the nuances of the level of significance later in the course. For now, we will use the default setting of \(\alpha = 0.05\).

5. Run Stats App

We can use a graphing calculator or statistics software like JMP, SPSS or RStudio to run this procedure. We can even be the app ourselves and run the procedure by-hand using statistical tables.

xchisq.test(Result ~ Treatment, data = Dolphin, correct = FALSE)

    Pearson's Chi-squared test

data:  x
X-squared = 6.6516, df = 1, p-value = 0.009907

   12        5   
 (8.50)   (8.50) 
 [1.44]   [1.44] 
< 1.20>  <-1.20> 
   
    3       10   
 (6.50)   (6.50) 
 [1.88]   [1.88] 
<-1.37>  < 1.37> 
   
key:
    observed
    (expected)
    [contribution to X-squared]
    <Pearson residual>

The calculated \(\chi^2\) statistic was 4.8869, and \(p\)-value was 0.02706 indidicating an approximately 3% probability that the null hypothesis is true.

6. Statistical Conclusion

When the probability of the null being true is small, we have evidence that it is likely false. Therefore, our criteria for rejecting the null hypothesis is \[\text{If}\hspace{3mm}p<\alpha\hspace{3mm} \rightarrow \hspace{3mm}\text{Reject } H_0\]

Our statistical conclusion for the Dolphin study is to reject the null because \[p\approx 0.027<0.05 = \alpha\] For any \(p\)-value greater than or equal to \(\alpha\), we would “fail to reject \(H_0\)”. Since we’re math geeks, we use the symbol \(H_0\) and the words “null hypothesis” interchangeably.

7. Research Conclusion

The research conclusion is a statement using real-world terms that describe the results of the entire process. For this hypothesis test, consider the following statement. \[\text{Evidence suggests that RESULT depends upon TREATMENT }(p=0.027)\text{.}\]

IV. Examples

Let’s load our big data set for this class and work out some examples. You can use “File: Import Dataset” or the code block below if the file is in your working directory.

Data3350 = read_excel("Data3350.xlsx")

Dating Example: Do you Accept?

From the “VarsData3350” PDF file we find the following description of the ACCEPTDATE variable.

Dating Question

“At a time in your life when you are not involved with anyone, a person asks you out. This person has a great personality, but you do not find this person physically attractive. Do you accept the date?”

Responses: Y = “Yes,” N, = “No”

Suppose that we investigate whether this category variable is completely independent of another category variable: biological sex where “F” indicates female and “M” indicates male.

tally(AccDate ~ Sex , data = Data3350)
       Sex
AccDate  F  M
      N 36 36
      Y 60 33

A visualization of the data where proportions are shown as areas is called a mosaic plot.

mosaicplot(AccDate ~ Sex , data = Data3350, 
           color = TRUE,
           main = "Mosaic Plot: AcceptDate by Sex")

Note how the “No” row is narrower: overall more participants said “Yes.” Note the total dark gray area is much larger than the light gray: females make up almost 60% of the subjects. The shading also highlights how the females responded “Yes” almost twice as often they responded “No” while the males split about 50-50 Yes vs. No.

While the mosaic plot does indicate a sex-based difference seems to exist, the question is whether or not that difference is statistically significant. That’s why we run a hypothesis test.

Using the \(\chi^2\) default, we would have the following output.

xchisq.test(AccDate ~ Sex , data = Data3350, correct = FALSE)

    Pearson's Chi-squared test

data:  x
X-squared = 3.5146, df = 1, p-value = 0.06083

   36       36   
(41.89)  (30.11) 
 [0.83]   [1.15] 
<-0.91>  < 1.07> 
   
   60       33   
(54.11)  (38.89) 
 [0.64]   [0.89] 
< 0.80>  <-0.94> 
   
key:
    observed
    (expected)
    [contribution to X-squared]
    <Pearson residual>

The downside of the xchsqr.test function (from the Mosaic package) is it’s lack of 1-tailed testing options. There is a stereotype that women evaluate potential dates more holostically while men evaluate potential dates mostly on appearance. We can test the stereotype by using the following 1-tailed hypothesis test.

Hypothesis Test: Do you Accept?

Hypothesis Testing Style

This example is written up in paragraph form,
but note how the details from each of the seven
steps listed before are discussed. You can use
bullet-point format if you’d like. Most
researchers do not.

We will use a 1-tailed, 2-proportion test which, in RStudio, will mean a \(\chi^2\) Test of Independence.

Let “Yes” responses to the dating question be considered successes. Let \(p_F\) represent the percentage of successes in the female sub-population, and \(p_M\) represent the percentage of successes for the male sub-population. \[\begin{align*}H_0 &: p_F = p_M\\ \\ H_a &: p_F > p_M\end{align*}\]

For verification, note that the xchisq.test function generates the Expected matrix.

chi = xchisq.test(AccDate ~ Sex , data = Data3350, correct = FALSE)

    Pearson's Chi-squared test

data:  x
X-squared = 3.5146, df = 1, p-value = 0.06083

   36       36   
(41.89)  (30.11) 
 [0.83]   [1.15] 
<-0.91>  < 1.07> 
   
   60       33   
(54.11)  (38.89) 
 [0.64]   [0.89] 
< 0.80>  <-0.94> 
   
key:
    observed
    (expected)
    [contribution to X-squared]
    <Pearson residual>

The key at the bottom indicates the values in parentheses are the cells of the expected matrix. All four expected cell counts are far greater than 5, so these data are appropriate for \(\chi^2\) procedures. Remember, even though we would run this as a 2-proportion \(z\)-test on the graphing calculator, RStudio always defaults to \(\chi^2\) for proportion tests, even the 1-proportion variety.

One-tailed proportion testing in RStudio

With the default level of significance, we want to run a 1-tailed test using a “less than” alternative hypothesis. Why “less than”? Because “Females” and “No” were listed first for SEX and ACCEPT DATE respectively, so R interprets the alternative hypothesis as comparing the percentage of “No” responses for females (left-hand side) vs. the percentage of “No” responses for males (right-hand side). Confusing? Don’t worry, I had to figure it out by trial and error, too.

prop.test(AccDate ~ Sex , data = Data3350,
          alternative = "less"
          , correct = FALSE
          )

    2-sample test for equality of proportions without continuity correction

data:  tally(AccDate ~ Sex)
X-squared = 3.5146, df = 1, p-value = 0.03041
alternative hypothesis: less
95 percent confidence interval:
 -1.00000000 -0.01871767
sample estimates:
   prop 1    prop 2 
0.3750000 0.5217391 

Because \[p = 0.0304 < .05 =\alpha\] we reject the null. The evidence from this proportion test suggests that the pattern of Yes/No responses to the “Accept Date” question depends upon gender (p = .0304).

Example: Lady Tasting Tea

Suppose that Dr. Muriel Bristol had identified 8 of 8 cups of tea correctly. How can we quickly generate a theoretical probability in RStudio? The proportion statistic is \[\hat{p} = \frac{x}{n}\] where \(x\) is the number of successes out of \(n\) total observations. We can use the function \(\fbox{prop.test}\) and specify \(x\) and \(n\). We are testing the hypothesis \[\begin{align*}H_0 &: \text{prop} = 0.5\\H_a &: \text{prop} > 0.5 \end{align*}\] which is why we include the \(\fbox{alternative = greater}\) option in the function call.

prop.test(x = 8, n = 8, p = .5,
          alternative = "greater",
          correct = FALSE)
Chi-squared approximation may be incorrect

    1-sample proportions test without continuity correction

data:  8 out of 8
X-squared = 8, df = 1, p-value = 0.002339
alternative hypothesis: true p is greater than 0.5
95 percent confidence interval:
 0.7472764 1.0000000
sample estimates:
p 
1 

Notice that the output has thrown an error code which prints out in red type at the top. Why? Well, the expected matrix has only 4 successes and 4 failures, so the sample size is too small. The error code is R’s message to double check the verification.

Suppose Bristol tasted more tea, and that she identified 12 of 14 successfully: \[\hat p =\frac{12}{14}\]

For verification of a 1-proportion test, we use the proportion \(p_0\) from the hypothesis along with the sample size \(n\) to generate the Expected cell counts: \(n*p_0 = 14 * 0.5 = 7\) for the successes, and \(n*(1-p_0) = 14 * 0.5 = 7\) for the failures. The test now runs without any error codes thrown because the cell counts are all greater than 5.

prop.test(x = 12, n = 14, p = 0.5,
          alternative = "greater",
          correct = FALSE)

    1-sample proportions test without continuity correction

data:  12 out of 14
X-squared = 7.1429, df = 1, p-value = 0.003763
alternative hypothesis: true p is greater than 0.5
95 percent confidence interval:
 0.6470626 1.0000000
sample estimates:
        p 
0.8571429 

The \(p\)-value is 0.0081 which is far less than \(\alpha = 0.05\), so we reject the null (e.g. guessing at random). Our research conclusion is that we have strong evidence that Bristol can actually taste the difference in the tea.

V. Proportion Testing for Qualitative Variables with more than 2 Levels

Consider our Data3350 data frame. We have two straightforward variables.

  1. SitClass is seating preference in class: front, middle or back.
  2. VarsAth is aks if one is a varsity athlete: response is Yes/No.

Let’s use a \(\chi^2\) Test of Independence with the following hypothesis:

\[\begin{align*}H_0 &: \text{Class seating prefence is independent of varsity althlete status}\\H_a &: \text{Class seating prefence depends upon varsity althlete status} \end{align*}\]

Let’s present the data using \(\fbox{tally}\).

tally(SitClass ~ VarsAth, data = Data3350)
        VarsAth
SitClass  N  Y
       B 27  8
       F 56  2
       M 65  7

While not a necessary hypothesis testing step, the mosaic plot tells a nice visual story and should be including in any proportion testing.

mosaicplot(SitClass ~ VarsAth, data = Data3350,
           color = TRUE,
           main = "Class seating preference vs. Varsity Athlete status")

Notice the strong preference for seating in the back by varsity athletes, perhaps a function of many athletes being taller than average.The areas are more difficult to compare between front and middle for non-athletes, but it’s clear non-athletes prefer seats in the back far less than either of the other options.

We will need to be careful about verification as there are several low cell counts in the observed data. Let’s run the procedure, then hit the pause button while check on the Expected cell counts.

xchisq.test(SitClass ~ VarsAth, data = Data3350,
            correct = FALSE)
Chi-squared approximation may be incorrect

    Pearson's Chi-squared test

data:  x
X-squared = 8.9442, df = 2, p-value = 0.01142

   27        8   
(31.39)  ( 3.61) 
[0.6150] [5.3540]
<-0.784> < 2.314>
   
   56        2   
(52.02)  ( 5.98) 
[0.3038] [2.6451]
< 0.551> <-1.626>
   
   65        7   
(64.58)  ( 7.42) 
[0.0027] [0.0236]
< 0.052> <-0.154>
   
key:
    observed
    (expected)
    [contribution to X-squared]
    <Pearson residual>

R throws a red error line at the top of the output, but our requirement was that there be no more than 20% low Expected cell counts. We have only 1 of 6 low expected cells, so about 17%. We use a slightly more liberal verification procedure than R which flags any expected cell counts less than 5.

Since the data do pass verification and appear to be appropriate for \(\chi^2\) procedures, we find that \[p = 0.01142 < 0.05 =\alpha\] (again using our default level of significance). Thus, we reject the null. There is strong evidence that class seating preferences depend upon whether one is a varsity athlete.

VI. Supplementary Material: 1- and 2-Proportion Tests with Summary Stats Only

We can run both 1-proportion \(z\)-tests and 2-proportion \(z\)-tests even if we only know the summary statistics but don’t have a data frame.

Example: 1-Proportion \(z\)-test

A recent study in Pakistan estimated that approximately 11% of all undergraduate students in that country had Type A personalities. A recent survey at the University of North Georgia showed a sample of 155 North Georgia students contained 22 students with Type A personalities. Is there evidence at the 0.05 level that a higher proportion of students at UNG have Type A personalities?

For this 1-proportion \(z\)-test, our hypotheses are: \[H_0 : \text{prop} = .11\\H_a : \text{prop} > .11\] The data pass verification as \(np_0 = 155(.11) = 17.05\geq 10\), and clearly \(n(1-p_0)\) is even larger. To run the test, we can specify \(x,n,p_0\) as parameters along with the alternative hypothesis. Note that we can type out the whole word “greater” in the alternative hypothesis parameter, or we can abbreviate it is “g.” We can also abbreviate TRUE and FALSE as shown.

prop.test( x = 22 , n = 155 , p = .11 , 
           alternative = "g" ,
           correct = F)

    1-sample proportions test without continuity correction

data:  22 out of 155
X-squared = 1.6147, df = 1, p-value = 0.1019
alternative hypothesis: true p is greater than 0.11
95 percent confidence interval:
 0.1019576 1.0000000
sample estimates:
        p 
0.1419355 

We fail to reject the null and have no evidence at the 0.05 level that the Type A personality rates are significantly higher (or different) at North Georgia than at universities in Pakistan.

Example: 2-Proportion \(z\)-test

Are young men more likely to experience ADD/ADHD symptoms than young women? A recent survey found 22 of 78 females had experienced significant ADD/ADHD symptoms while 12 of 40 males had experienced them. Test for a difference at the .1 level.

For this 1-proportion \(z\)-test, our hypotheses are: \[H_0 : p_F = p_M\\H_a : p_F < p_M\] The data pass verification because the number of successes are 22 and 12 in the female and male samples respectively, and both samples have more failures than successes. Thus, the number of successes and failures in both samples is greater than or equal to 10, as required.

We use concatenate function c to provide the numerator and denominator of two different \(\hat p\) fractions, one for females and one for males.

prop.test( x = c(22,12), n = c(78,40), 
           alternative = "less",
           correct = FALSE)

    2-sample test for equality of proportions without continuity correction

data:  c out of c22 out of 7812 out of 40
X-squared = 0.041528, df = 1, p-value = 0.4193
alternative hypothesis: less
95 percent confidence interval:
 -1.0000000  0.1277498
sample estimates:
   prop 1    prop 2 
0.2820513 0.3000000 

We fail to reject the null and have no evidence for a different rate of ADD/ADHD symptoms based on biological sex.

Example: \(\chi^2\) Test of Independence

Does level of smoking affect level of exercise? Test at the 0.05 level. The smokers were categorized as heavy smokers, occasional smokers or had never smoked. They were also categorized according to level of exercise: frequent, some, and none.

Frequency of Exercise vs. Smoking Level \[\begin{array}{l|ccc}&\textbf{Frequent} &\textbf{Some} & \textbf{None}\\ \hline \textbf{Heavy} & 7 & 3 & 1\\ \textbf{Occasional} & 21 & 11 & 4\\ \textbf{Never} & 87 & 84 & 18\\ \end{array}\]

We need to create the observed matrix which I will call tab. We can then run the Chi-squared test.

tab = (matrix(c(7, 3, 1, 21, 11, 4, 87 , 84 , 18),nrow=3))
xchisq.test(tab)
Chi-squared approximation may be incorrect

    Pearson's Chi-squared test

data:  x
X-squared = 3.5177, df = 4, p-value = 0.4752

  7.00    21.00    87.00  
( 5.36)  (17.54)  (92.10) 
[0.5017] [0.6815] [0.2821]
< 0.708> < 0.826> <-0.531>
     
  3.00    11.00    84.00  
( 4.57)  (14.95)  (78.48) 
[0.5381] [1.0433] [0.3878]
<-0.734> <-1.021> < 0.623>
     
  1.00     4.00    18.00  
( 1.07)  ( 3.51)  (18.42) 
[0.0048] [0.0689] [0.0096]
<-0.070> < 0.262> <-0.098>
     
key:
    observed
    (expected)
    [contribution to X-squared]
    <Pearson residual>

Note that three of the nine expected cells are less than 5, so the data are not appropriate for Chi-Squared procedures since 33% of the expected cells have low cell counts. We cannot use these data for Chi-Squared – do not proceed.

However, we can still illustrate how to create a mosaic plot from summary statistics.I am also creating column names and row names so the Mosaic plot is easier to interpret.

colnames(tab) = c("Frequent","Some","None")
rownames(tab) = c("Heavy","Occasional","Never")
mosaicplot(tab)

Special Note: For tests, quizzes and projects in this course, we will not be be using the Agresti Plus 4 Method, nor will use the Yates correction for \(\chi^2\) or the continuity correction in the prop.test.

VII. Exercises

  1. Using the SitClass variable from the Data3350 data frame, test the hypothesis that classroom seating preference depends upon membership in the corps of cadets (variable Corps) at the \(\alpha = 0.05\) level. Include a Mosaic plot and describe it’s relationship to your \(p\)-value and conclusions.

  2. Using the SitClass variable from the Data3350 data frame, test the hypothesis that classroom seating preference depends upon biological Sex at the \(\alpha = 0.05\) level. Include a Mosaic plot and describe it’s relationship to your \(p\)-value and conclusions.

  3. Using the AccDate variable from the Data3350 data frame, test the hypothesis that the Yes responses to the dating question are more likely for those in social Greek fraternities and sororities at the \(\alpha = 0.1\) level. Include a Mosaic plot with a description about it’s relationship to your \(p\)-value and conclusions.

  4. A strong sense of Coping Humor indicates a person who uses humor to relieve stress and deal with the struggles of life. Test at the .05 level whether more than 10% of North Georgia students exhibit strong Coping Humor. A recent study used a criteria of scoring 30 or higher on the Coping Humor Scale to evaluate this criteria, and found that 21 of 175 North Georgia students did so.

  5. A recent study asked UNG students whether they frequently texted at work about things unrelated to work. For younger students, 25 of 103 said they frequently did so while 15 of 46 students who 21 or older reported doing so. Test for an age-difference for Texting Frequently at Work at the .05 level.

LS0tDQp0aXRsZTogIkh5cG90aGVzaXMgVGVzdGluZzogUHJvcG9ydGlvbnMiDQpzdWJ0aXRsZTogVU5HIE1BVEggMzM1MCAob25saW5lKQ0KYXV0aG9yOiBSb2JiIFNpbm4NCmRhdGU6IEp1bHkgMjAyMA0Kb3V0cHV0OiBodG1sX25vdGVib29rDQotLS0NCiMgPHNwYW4gc3R5bGU9ImNvbG9yOiBibHVlOyI+SS4gRGF0YTwvc3Bhbj4NClRoZXJlIGFyZSB0d28gbWFpbiBkYXRhIHR5cGVzOiBxdWFsaXRhdGl2ZSBhbmQgcXVhbnRpdGF0aXZlLiAqKlF1YW50aXRhdGl2ZSoqIGRhdGEgc2V0cyBhcmUgY29tcHJpc2VkIG9mIGxpc3RzIG9mIG51bWJlcnMgYW5kIG9mdGVuIHJlZmVycmVkIHRvIGFzIG51bWVyaWMgZGF0YS4gKipRdWFsaXRhdGl2ZSoqIGRhdGEgc2V0cyByZWZlciB0byBsaXN0cyBvZiBjYXRlZ29yaXphdGlvbnMsIGxpa2UgY2xhc3MgcmFuayBpbiBjb2xsZWdlLiBJZiB3ZSB0aGluayBvZiBDTEFTUyBhcyBhIHF1YWxpdGF0aXZlIHZhcmlhYmxlLCBpdCBoYXMgZm91ciAqbGV2ZWxzKjogZnJlc2htYW4sIHNvcGhvbW9yZSwganVuaW9yIGFuZCBzZW5pb3IuIFdlIHRlbmQgdG8gdXNlIHNpbmdsZS1sZXR0ZXIgY29kZXMgd2hlbiBwb3NzaWJsZSwgc28gd2UgbWlnaHQgZGVzY3JpYmUgQ0xBU1MgYXMgaGF2aW5nIHRoZSBmb3VyIGxldmVscyBGLCBTLCBKIGFuZCBSICh3aXRoIFIgZm9yIHNlbmlvciBzaW5jZSBTIGlzIGFscmVhZHkgdXNlZCkuDQoNClRoZSA8YSBocmVmID1ycHVicy5jb20vcm9iYnNpbm4vczI+TGFkeSBUYXN0aW5nIFRlYTwvYT4gZXhhbXBsZSB3YXMgYW4gZXhwZXJpbWVudCB3aXRoIHF1YWxpdGF0aXZlIGRhdGEuIFRoZSBvdXRjb21lcyBvZiB0aGUgdGVzdCB0YXN0ZSB3ZXJlIDggcmVwb3J0cyBvZiBlaXRoZXIgc3VjY2VzcyBvciBmYWlsdXJlLiBGb3IgZXhhbXBsZSwgdGhlIGRhdGEgZnJvbSBNdXJpZWwncyBhdHRlbXB0cyBtaWdodCBoYXZlIGJlZW4NCiQkXHtTLEYsUyxTLFMsRixTLFNcfSQkDQp3ZXJlIHNoZSB0byBoYXZlIHN1Y2Nlc3NmdWxseSBpZGVudGlmaWVkIDYgb2YgdGhlIDggY3VwcyBvZiB0ZWEuDQoNCjxkaXYgc3R5bGU9ImZsb2F0OnJpZ2h0OyBtYXJnaW46IDhweDsgYm9yZGVyOjJweCBibGFjayBzb2xpZDsgcGFkZGluZzogMHB4IDEwcHggNXB4Ij4NCiMjIyA8c3BhbiBzdHlsZT0iY29sb3I6IHJlZDsiPkluaXRpYWxpemluZyBSU3R1ZGlvPC9zcGFuPg0KVGhlIGRhdGEgc2V0IHdlIHdpbGwgdXNlIHByaW1hcmlseSBpcyAqKkRhdGEzMzUwKiogd2hpY2ggd2FzIHByb2R1Y2VkIGluIDIwMTUgZHVyaW5nIGFuIHVuZGVyZ3JhZHVhdGUgcmVzZWFyY2ggcHJvamVjdCBhYm91dCBwZXJzb25hbGl0eSBhbmQgaHVtb3IuIFRoZSAqKlZhcnNEYXRhMzM1MCoqIFBERiBmaWxlIGhhcyBkZXNjcmlwdGlvbnMgb2YgZWFjaCB2YXJpYWJsZSBpbiB0aGUgRGF0YTMzNTAgZmlsZS4gQm90aCBhcmUgYXZhaWxhYmxlIGZvciBkb3dubG9hZCBpbiBEMkwuIEJlIHN1cmUgdG8gcHV0IHRoZSBEYXRhMzM1MCBpbiB5b3VyIFIgZm9sZGVyIGluIERvY3VtZW50cywgYW5kIG1ha2Ugc3VyZSB5b3VyIHdvcmtpbmcgZGlyZWN0b3J5IGlzIHNldCB0aGUgc2FtZSB3YXkgKFNlc3Npb24gbWVudSkuIFRoZSBjb2RlIGJsb2NrIGJlbG93IHVzZXMgdGhlICoqbGlicmFyeSoqIGZ1bmN0aW9uIHRvIGVuc3VyZSB0aGF0IHRoZSAqKk1vc2FpYyoqIHBhY2thZ2UgaXMgbG9hZGVkIGFuZCB3aWxsIGltcG9ydCB0aGUgZGF0YSBmcmFtZSB1c2VkIGluIHRoaXMgbW9kdWxlOiAqKkRhdGEzMzUwKiogYW5kICoqRG9scGhpbioqLg0KYGBge3J9DQpsaWJyYXJ5KG1vc2FpYykNCmxpYnJhcnkocmVhZHhsKQ0KRG9scGhpbiA9IHJlYWRfZXhjZWwoIkRvbHBoaW4ueGxzeCIpDQpEYXRhMzM1MCA9IHJlYWRfZXhjZWwoIkRhdGEzMzUwLnhsc3giKQ0KYGBgDQo8L2Rpdj4NCg0KIyA8c3BhbiBzdHlsZT0iY29sb3I6IGJsdWU7Ij5JSS4gUHJvcG9ydGlvbiBUZXN0czwvc3Bhbj4NCg0KV2hlbiB3b3JraW5nIHdpdGggcXVhbGl0YXRpdmUgb3IgY2F0ZWdvcnkgZGF0YSwgd2UgY2FuJ3QgY2FsY3VsYXRlIG1lYW5zIGFuZCBzdGFuZGFyZCBkZXZpYXRpb25zLiBJbnN0ZWFkLCB3ZSB0YWxseSB1cCB0aGUgY291bnRzIG9mIGVhY2ggb3V0Y29tZSBhbmQgY2FsY3VsYXRlIHBlcmNlbnRhZ2VzIG9yIHByb3BvcnRpb25zLg0KDQpXZSBoYXZlIHR3byBtYWluIHByb3BvcnRpb24gdGVzdHMsIG9uZSBiYXNlZCBvbiB0aGUgJHokIGRpc3RyaWJ1dGlvbiwgb25lIGJhc2VkIG9uIHRoZSAkXGNoaV4yJCBkaXN0cmlidXRpb24uIFRoZSAkeiQtcHJvcG9ydGlvbiB0ZXN0IGNhbiBvbmx5IGhhbmRsZSBvbmUgb3IgdHdvIHNhbXBsZXMuIFdlIHVzZSAkXGNoaV4yJCBmb3IgY2F0ZWdvcnkgdmFyaWFibGVzIHdpdGggbW9yZSB0aGFuIHR3byBsZXZlbHMuIEJlY2F1c2UgJFxjaGleMiQgaXMgYSBtb3JlIHJvYnVzdCBzdGF0aXN0aWMsIHdlIHNvbWV0aW1lcyB1c2UgaXQgZm9yIHNtYWxsIHNhbXBsZSBleHBlcmltZW50cyBpbiB0aGUgdHdvIHNhbXBsZSBjYXNlLg0KDQojIyBDYXNlIFN0dWR5OiBTd2ltbWluZyB3aXRoIGRvbHBoaW5zDQoNCkxldCdzIGRpc2N1c3MgYW4gZXhwZXJpbWVudCB0aGF0IHByb2R1Y2VkIGNhdGVnb3J5IGRhdGEuIEEgZ3JvdXAgb2YgMzAgcGF0aWVudHMgZXhwZXJpZW5jaW5nIGNocm9uaWMgZGVwcmVzc2lvbiB3ZXJlIGludml0ZWQgdG8gYSBDYXJpYmVhbiBpc2xhbmQgdG8gdGFrZSBwYXJ0IGluIHRoZXJhcHkuIFRoZSByZXNlYXJjaGVycyByYW5kb21seSBzcGxpdCB0aGUgZ3JvdXAgaW4gdHdvLiBIYWxmIG9mIHRoZW0gcmVjZWl2ZWQgY2xpbmljYWwgdHJlYXRtZW50IGZvciB0aGVpciBkZXByZXNzaW9uIG9ubHkgKGFsb25nIHdpdGggYSBodWdlIGRvc2Ugb2YgYmVhY2ggdGhlcmFweSwgb25lIHByZXN1bWVzKS4gVGhlIG90aGVyIGhhbGYgcmVjZWl2ZWQgdGhlIHNhbWUgY2xpbmljYWwgdHJlYXRtZW50IChhbmQgYmVhY2ggdGhlcmFweSkgcGx1cyB0aGV5IHdlbnQgc3dpbW1pbmcgd2l0aCBkb2xwaGlucy4NCg0KIyMjIFJlc3VsdHMNCg0KTGV0J3Mgc2NhbiB0aGUgZGF0YSBmcmFtZSB3aGljaCBzdW1tYXJpemVzIHRoZSByZXN1bHRzIG9mIHRoZSBleHBlcmltZW50Lg0KDQpgYGB7cn0NCkRvbHBoaW4NCmBgYA0KDQojIyMgU2V0dGluZyB1cCB0aGUgSHlwb3RoZXNpcyBUZXN0DQoNClRoZSByZXNlYXJjaGVycyB3YW50IHRvIGtub3cgd2hldGhlciB0aGVyZSBpcyBlbm91Z2ggZXZpZGVuY2UgdG8gc2hvdyB0aGF0IHRoZSBkb2xwaGluIHRoZXJhcHkgaXMgc2lnbmlmaWNhbnRseSBiZXR0ZXIgdGhhbiB0aGUgY2xpbmljYWwgYW5kIGJlYWNoIHRoZXJhcHkgb3B0aW9uLiBXaGF0IG51bGwgaHlwb3RoZXNpcyB3aWxsIHRlc3QgdGhlaXIgY2xhaW0/DQoNCiQkSF8wIDogXHRleHR7IFJlc3VsdHMgYXJlIGluZGVwZW5kZW50IG9mIHRyZWF0bWVudH0kJA0KSG93IGNvdWxkIHdlIHRlc3QgaXQ/IFdlIGNhbiByYW5kb21seSBhc3NpZ24gdGhlIG91dGNvbWVzIG9mIEltcHJvdmVkIG9yIERpZCBOb3QgdG8gdGhlIGRvbHBoaW4gZ3JvdXAuIFdlIHRoZW4gY2hlY2sgdG8gc2VlIHRoZSBwZXJjZW50YWdlIG9mIHRpbWVzIHRoYXQgMTAgb3IgbW9yZSBzdWNjZXNzZXMgbGFuZCBpbiB0aGUgcmFuZG9taXplZCBkb2xwaGluIGdyb3VwLg0KDQpMZXQncyB0YWxseSB0aGUgZGF0YSB0byBzaG93IHRoZSByZXNlYXJjaGVyJ3MgZXhwZXJpbWVudGFsIGRhdGE6DQoNCmBgYHtyfQ0KdGFsbHkoUmVzdWx0IH4gVHJlYXRtZW50LCBkYXRhID0gRG9scGhpbikNCmBgYA0KDQo8ZGl2IHN0eWxlPSJmbG9hdDpyaWdodDsgbWFyZ2luOiA4cHg7IGJvcmRlcjoycHggYmxhY2sgc29saWQ7IHBhZGRpbmc6IDEwcHggMTVweCAxMHB4Ij4NCiMjIyA8c3BhbiBzdHlsZT0iY29sb3I6IHJlZDsiPk1vc2FpYydzIDxhIGhyZWYgPSBodHRwczovL3JwdWJzLmNvbS9yb2Jic2lubi9zMTE+UmFuZG9taXphdGlvbiBPcHRpb25zPC9hPjwvc3Bhbj4NCjEuICoqU2h1ZmZsZS4qKiBQZXJtdXRlcyB0aGUgdmFsdWVzIGluIHRoZSBzYW1wbGUgZGF0YS4NCjIuICoqU2FtcGxlLioqIERyYXdzIGEgc3ViLXNhbXBsZSBmcm9tIHRoZSBzYW1wbGUgZGF0YTwvYnI+KndpdGhvdXQgcmVwbGFjZW1lbnQqLg0KMy4gKipSZXNhbXBsZS4qKiBEcmF3cyBhIHN1Yi1zYW1wbGUgZnJvbSB0aGUgc2FtcGxlIGRhdGE8L2JyPip3aXRoIHJlcGxhY2VtZW50Ki48L2JyPg0KPC9kaXY+DQoNCiMjIFJhbmRvbWl6YXRpb24gZm9yIERvbHBoaW5zIENhc2UgU3R1ZHkNCg0KV2hhdCBpZiB3ZSByYW5kb21seSBzaHVmZmxlZCB0aGUgKipSZXN1bHQqKiB2YXJpYWJsZSBlbnRyaWVzPyBXZSB3b3VsZCBjcmVhdGUgcmFuZG9tIHRyZWF0bWVudCB2cy4gY29udHJvbCBncm91cCBzYW1wbGVzIHdoaWNoIGNvdWxkIGJlIHVzZSB0byBlc3RpbWF0ZSB0aGUgcHJvYmFiaWxpdHkgb2YgaGF2aW5nIGF0IGxlYXN0IDEwICJJbXByb3ZlZCIgUmVzdWx0cyBpbiB0aGUgRG9scGhpbiBncm91cC4gSGVyZSdzIGEgbG9vayB1c2luZyBNb3NhaWMncyAqKnNodWZmbGUqKiBjb21tYW5kLg0KDQpgYGB7cn0NCnRhbGx5KHNodWZmbGUoUmVzdWx0KSB+IFRyZWF0bWVudCwgZGF0YSA9IERvbHBoaW4pDQpgYGANClJ1biB0aGUgY29kZSBibG9jayBhYm92ZSBzZXZlcmFsIHRpbWVzLCBhbmQgeW91IHdpbGwgbm90aWNlIGhvdyByYXJlIGl0IGlzIHRvIGhhdmUgMTAgIkltcHJvdmVkIiByZXN1bHRzIGluIHRoZSBEb2xwaGlucyBncm91cC4NCg0KVG8gY3JlYXRlIHNldmVyYWwgaHVuZHJlZCByYW5kb20gc2FtcGxlcyBhbmQgYmUgYWJsZSB0byBjb3VudCB0aGVtIHVwLCB3ZSdsbCB1c2UgdGhlICoqc2FtcGxlKiogZnVuY3Rpb24gdG8gZHJhdyBzYW1wbGVzIG9mIHRoZSBSZXN1bHQgb2JzZXJ2YXRpb25zIG9mIHNpemUgJG49MTUkLiBXaHk/IFRoaXMgYXBwcm9hY2ggc2ltdWxhdGVzIHJhbmRvbWx5IHBpY2tpbmcgMTUgIkltcHJvdmVkIiBhbmQgIkRpZCBOb3QgSW1wcm92ZSIgZm9yIHRoZSBkb2xwaGluIGdyb3VwLiBXZSBkb24ndCBuZWVkIHRvIGNyZWF0ZSB0aGUgQ29udHJvbCBncm91cCBzaW5jZSBhbGwgcmVtYWluaW5nIHJlc3VsdHMgd2lsbCBlbmQgdXAgdGhlcmUuIFRoZSBkb2xsYXIgc2lnbiBpbiAgICoqRG9scGhpbiRSZXN1bHQqKiBpcyBhbiBvcGVyYXRvciB0aGF0IGNob29zZXMgYSBzcGVjaWZpYyBjb2x1bW4gZnJvbSBhIGRhdGEgZnJhbWUsIGluIHRoaXMgY2FzZSwgdGhlIFJlc3VsdC4NCg0KYGBge3J9DQpkb2xwaCA9IHNhbXBsZShEb2xwaGluJFJlc3VsdCwgc2l6ZSA9IDE1KQ0KdGFsbHkoZG9scGgpDQpgYGANCg0KU2luY2UgKip0YWxseSoqIGNyZWF0ZXMgYSB2ZWN0b3Igb2YgcmVzdWx0cywgd2UgY2FuIGp1c3QgZ3JhYiB0aGUgbnVtYmVyIG9mIHBhdGllbnRzIHdobyBpbXByb3ZlZCBieSByZWZlcmVuY2luZyB0aGUgMm5kIHZlY3RvciBjb21wb25lbnQgd2l0aCB0aGUgc3F1YXJlIGJyYWNrZXRzOiAqWzJdKi4NCg0KYGBge3J9DQp0YWxseShkb2xwaClbMl0NCmBgYA0KDQpUaGlzIHJhbmRvbWl6YXRpb24gY2FuIGJlIHJlcGVhdGVkIGRvemVucywgaHVuZHJlZHMgb3IgZXZlbiB0aG91c2FuZHMgb2YgdGltZXMuIEluIHRoaXMgd2F5LCB3ZSBjYW4gZGV0ZXJtaW5lIHRoZSBlbXBpcmljYWwgcHJvYmFiaWxpdHkgdGhhdCB0aGUgZXhwZXJpbWVudGFsIHJlc3VsdHMgd2VyZSByYW5kb20gbm9pc2UgcmF0aGVyIHRoYW4gZXZpZGVuY2UgdGhhdCBkb2xwaGluIHRoZXJhcHkgd29ya3MgYmV0dGVyLg0KDQo8ZGl2IHN0eWxlPSJmbG9hdDpyaWdodDsgbWFyZ2luOiA4cHg7IGJvcmRlcjoycHggYmxhY2sgc29saWQ7IHBhZGRpbmc6IDBweCAxMHB4IDVweCI+DQojIyMgUm9zc21hbiAmIENoYW5jZQ0KVGhlIGRvbHBoaW4gc3R1ZHkgaXMgYSB0ZWFjaGluZyBhcHByb2FjaCBwaW9uZWVyZWQ8L2JyPg0KYnkgPGEgaHJlZiA9IGh0dHA6Ly93d3cucm9zc21hbmNoYW5jZS5jb20+DQpBbGFuIFJvc3NtYW4gYW5kIEJldGggQ2hhbmNlPC9hPiB3aG8gaGF2ZSBjcmVhdGVkPC9icj4NCjxhIGhyZWYgPSBodHRwOi8vd3d3LnJvc3NtYW5jaGFuY2UuY29tL2FwcGxldHM+d2ViDQphcHBzPC9hPiB0byBzaW11bGF0ZSBkYXRhIGZvciB0aGVpciBvd24gc3RhdGlzdGljczwvYnI+DQpjb3Vyc2VzLiBZb3Ugc2hvdWxkIGRlZmluaXRlbHkgc3BlbmQgc29tZSB0aW1lPC9icj4NCmV4cGVyaW1lbnRpbmcgd2l0aCB0aGVpciA8YSBocmVmPSAiaHR0cDovL3d3dy5yb3NzbWFuY2hhbmNlLmNvbS9hcHBsZXRzL0NoaVNxU2h1ZmZsZS5odG1sP2RvbHBoaW5zPTEiPiBEb2xwaGluIFN0dWR5IEFwcDwvYT4uDQo8L2Rpdj4NCg0KQmVsb3csIHdlIGFyZSBjb21iaW5pbmcgdGhlIGNvZGUgc25pcHMgZnJvbSBhYm92ZSBpbnRvIG9uZSBsaW5lIHRoYXQgd2lsbCBkbyB0aGUgZm9sbG93aW5nOg0KDQoxLiBDb2xsZWN0IHJhbmRvbSBzYW1wbGVzIG9mIHNpemUgJG49MTUkIGZyb20gdGhlIHJlc3VsdHMgY29sdW1uLg0KMi4gRGV0ZXJtaW5lIGhvdyBtYW55IHBhdGllbnRzIGluIHRoaXMgcmFuZG9tIGdyb3VwICJJbXByb3ZlZCINCjMuIFRhbGx5IHRoZSBudW1iZXIgdmVjdG9yIGxpc3RpbmcgdGhlIG51bWJlciB0aGF0IGltcHJvdmVkIGluIGVhY2ggb2YgNTAgcmFuZG9taXplZCBncm91cHMuDQo0LiBBc3NpZ24gdGhlIHJlc3VsdCB0byB0aGUgdmFyaWFibGUgKipyYW5kRG9scGgqKiBzbyB3ZSBjYW4gY3JlYXRlIGEgaGlzdG9ncmFtIGZyb20gdGhlIHRhYmxlIG9mIHJlc3VsdHMuDQoNCmBgYHtyfQ0KcmFuZERvbHBoID0gZG8oNTApICogdGFsbHkoc2FtcGxlKERvbHBoaW4kUmVzdWx0LCBzaXplID0gMTUpKVsyXQ0KcmFuZERvbHBoDQpgYGANCg0KQ3JlYXRlIGEgaGlzdG9ncmFtIHRvIGNsYXJpZnkgdGhlIHBpY3R1cmUuDQoNCmBgYHtyfQ0KaGlzdG9ncmFtKH4gSW1wcm92ZWQsIGRhdGEgPSByYW5kRG9scGgsDQogICAgICAgICAgd2lkdGggPSAxLA0KICAgICAgICAgIGNlbnRlciA9IDEwLA0KICAgICAgICAgIHR5cGUgPSAiY291bnQiLA0KICAgICAgICAgIG1haW4gPSAiSGlzdG9ncmFtOiBSYW5kb20gSW1wcm92ZW1lbnRzIiwNCiAgICAgICAgICB4bGFiID0gIkltcHJvdmVtZW50cyBmb3IgRG9scGhpbiBHcm91cDogNTAgU2FtcGxlcyBvZiAxNSBSZXN1bHRzIikNCmBgYA0KDQojIyMgRW1waXJpY2FsICRwJC12YWx1ZXMgdXNpbmcgUlN0dWRpbw0KDQpXZSdyZSBnb2luZyB0byBuZWVkIGxvdHMgbW9yZSBzYW1wbGVzIHRvIGRldGVybWluZSB0aGlzIHByb2JhYmlsaXR5LiBMZXQncyBqdW1wIHVwIHRvIDIsMDAwIHNhbXBsZXMgYW5kIHNlZSB3aGF0IHRoZSBwcm9iYWJpbGl0eSBpcyB0aGF0IGF0IGxlYXN0IDEwIG9mIHRoZSAiSW1wcm92ZWQiIG91dGNvbWVzIGFwcGVhciBhdCByYW5kb20gaW4gYSBzYW1wbGUgb2YgMTUuDQoNCkRvbid0IHB1c2ggdGhlIG51bWJlciBvZiB0cmlhbHMgdG9vIGhpZ2guIEV4ZWN1dGluZyB0aGUgY29kZSBibG9jayBiZWxvdyB3aWxsIHByb2JhYmx5IHRha2UgYXQgbGVhc3QgMTAgc2Vjb25kcywgZGVwZW5kaW5nIHVwb24gdGhlIHNwZWVkIG9mIHRoZSBwcm9jZXNzb3IgdXNlZCB0byBydW4gaXQuDQoNCmBgYHtyfQ0KcmFuZERvbHBoID0gZG8oMjAwMCkgKiB0YWxseShzYW1wbGUoRG9scGhpbiRSZXN1bHQsIDE1KSlbMl0NCmhpc3RvZ3JhbSggfkltcHJvdmVkLCBkYXRhID0gcmFuZERvbHBoLCANCiAgICAgICAgICB3aWR0aCA9IDEsDQogICAgICAgICAgY2VudGVyID0gMTAsDQogICAgICAgICAgdHlwZSA9ICJjb3VudCIsDQogICAgICAgICAgbWFpbiA9ICJIaXN0b2dyYW06IFJhbmRvbSBJbXByb3ZlbWVudHMiLA0KICAgICAgICAgIHhsYWIgPSAiSW1wcm92ZW1lbnRzIGZvciBEb2xwaGluIEdyb3VwOiAyMDAwIFNhbXBsZXMgb2YgMTUgUmVzdWx0cyIpDQpgYGANCldlIHdvdWxkIGxpa2UgdG8ga25vdyBob3cgbWFueSBvZiB0aGVzZSB0d28gdGhvdXNhbmQgcmFuZG9tIHNhbXBsZXMgZW5kZWQgdXAgd2l0aCAxMCBtb3JlICJJbXByb3ZlZCIgb3V0Y29tZXMuIFRoYXQncyB0aGUgcHJvYmFiaWxpdHkgd2UncmUgZXN0aW1hdGluZy4gVGhhdCdzIG91ciAkcCQtdmFsdWUuDQoNCmBgYHtyfQ0Kc3VtKHJhbmREb2xwaCA+PSAxMCkNCmBgYA0KPGRpdiBzdHlsZT0iZmxvYXQ6cmlnaHQ7IG1hcmdpbjogOHB4OyBib3JkZXI6MnB4IGJsYWNrIHNvbGlkOyBwYWRkaW5nOiAwcHggMTBweCA1cHgiPg0KIyMjIyBSb3NzbWFuICYgQ2hhbmNlIG9ubGluZSBhcHANCioqQXBwIFNldHVwKiogDQoNCiFbRG9scGhpbiBBcHA6IExlZnQgUGFuZWxdKGltYWdlc1xSQ0RvbHBoTGVmdC5QTkcpICFbRG9scGhpbiBBcHA6IFJpZ2h0IFBhbmVsXShpbWFnZXNcUkNEb2xwaFJpZ2h0LlBORykNCjwvZGl2Pg0KDQpTbyB0aGUgJHAkLXZhbHVlIGlzICQkcD1cZnJhY3tgciBwYXN0ZShzdW0ocmFuZERvbHBoID49IDEwKSlgDQp9ezIwMDB9PSBgciBwYXN0ZShzdW0ocmFuZERvbHBoID49IDEwKS8yMDAwKSBgJCQNCg0KVGhlIFIgU3R1ZGlvIHNpbXVsYXRpb24gc2hvd3MgdGhhdCwgYnkgcmFuZG9tIGNoYW5jZSwgMTAgb3IgbW9yZSBpbXByb3ZlbWVudHMgaW4gdGhlIERvbHBoaW4gZ3JvdXAgd291bGQgb2NjdXIgb25seSBhYm91dCAxJSBvZiB0aGUgdGltZS4gU2luY2UgdGhlICRwJC12YWx1ZSBpcyBsb3csIG91ciByYW5kb21pemVkIHNpbXVsYXRpb24gc3VnZ2VzdHMgdGhlIG51bGwgaHlwb3RoZXNpcyBpcyBmYWxzZS4NCg0KSWYgdGhlIGltcHJvdmVtZW50cyBhcmUgKm5vdCogZHVlIHRvIHJhbmRvbSBjaGFuY2UsIHRoZSByZXNlYXJjaGVycyBoYXZlIGV2aWRlbmNlIGZvciB0aGUgY2xhaW0gdGhhdCB0aGUgRG9scGhpbiB0aGVyYXB5IHNlZW1lZCB0byBoZWxwIHRoZXNlIGNsaW5pY2FsIHBhdGllbnRzLg0KDQojIyMgRW1wcmljYWwgJHAkLXZhbHVlcyBmcm9tIFJvc3NtYW4tQ2hhbmNlIGFwcA0KWW91IGNhbiAtLSBhbmQgc2hvdWxkISEgLS0gcGVyZm9ybSB0aGUgc2FtZSBzaW11bGF0aW9ucyBtdWNoIG1vcmUgZWZmaWNpZW50bHkgb24gdGhlIDxhIGhyZWYgPSAiaHR0cDovL3d3dy5yb3NzbWFuY2hhbmNlLmNvbS9hcHBsZXRzL0NoaVNxU2h1ZmZsZS5odG1sP2RvbHBoaW5zPTEiPlJvc3NtYW4tQ2hhbmNlIERvbHBoaW4gYXBwbGV0PC9hPi4gV2hlbiB5b3UgZG8sIG1ha2Ugc3VyZSB0byBzZXQgdGhlIHJhbmRvbWl6YXRpb24gJFxmYm94e3N0YXRpc3RpY30kIHRvICJDZWxsIDEgQ291bnQiIGluIHRoZSBib3R0b20tbGVmdCBjb3JuZXIgb2YgeW91ciBzY3JlZW4gKHNlZSBmaWd1cmUpLiB3aGVuIHlvdSBjbGljayB0aGUgbGluaywgdGhlIHJpZ2h0IHBhbmVsIHdpbGwgbm90IHNob3cgdXAuIFRvIG1ha2UgaXQgYXBwZWFyLCBjaGVjayB0aGUgIlNob3cgU2h1ZmZsZSBPcHRpb25zIiBib3guIFRvIGdlbmVyYXRlIGEgJHAkLXZhbHVlLCBzZXQgIkNvdW50IFNhbXBsZXMiIHRvICRcZmJveHs+ID0gMTB9JC4gKFNlZSBmaWd1cmUgc2hvd2luZyBSaWdodCBQYW5lbC4pDQoNCkkgcmFuIDEwLDAwMCB0cmlhbHMgaW4gYWJvdXQgb25lIHNlY29uZCBvbiB0aGUgUm9zc21hbiBDaGFuY2UgRG9scGhpbiBhcHBsZXQgYW5kIGZvdW5kIGFuIGVtcGlyaWNhbCBlc3RpbWF0ZSBvZg0KJCRwPVxmcmFjezEyNn17MTAwMDB9ID0gYHIgcGFzdGUoMTI2LzEwMDAwKWAkJA0Kd2hpY2ggbWF0Y2hlcyBwcmV0dHkgd2VsbCB0byB3aGF0IHdlIGRpZCBlYXJsaWVyIGluIFJTdHVkaW8uIFlvdSBzaG91bGQgcnVuIGJvdGggdGhlIGNvZGUgaW4gUlN0dWRpbyBhcyB3ZWxsIGFzIGluIHRoZSBhcHAgdG8gYmVzdCB1bmRlcnN0YW5kIHdoYXQncyBnb2luZyBvbi4gVGhlIHNjcmVlbiBzaG90IGJlbG93IHNob3dzIHRoZSByZXN1bHRzIHdoZW4gSSB1c2VkIHRoZSB3ZWIgYXBwIGZvciAxMCwwMDAgdHJpYWxzLg0KDQo8ZGl2IHN0eWxlPSJmbG9hdDpjZW50ZXI7IG1hcmdpbjogOHB4OyBib3JkZXI6MnB4IGJsYWNrIHNvbGlkOyBwYWRkaW5nOiAwcHggMTBweCA1cHgiPg0KIVtEb2xwaGluIEFwcF0oaW1hZ2VzXFJDRG9scGguUE5HKQ0KPC9kaXY+DQoNCiMgPHNwYW4gc3R5bGU9ImNvbG9yOiBibHVlOyI+SUlJLiBNb2Rlcm4gU3RhdGlzdGljYWwgSHlwb3RoZXNpcyBUZXN0aW5nPC9zcGFuPg0KDQo8ZGl2IHN0eWxlPSJmbG9hdDpyaWdodDsgbWFyZ2luOiA4cHg7IGJvcmRlcjoycHggYmxhY2sgc29saWQ7IHBhZGRpbmc6IDBweCAxMHB4IDVweCI+DQojIyMgPHNwYW4gc3R5bGU9ImNvbG9yOiByZWQ7Ij5IeXBvdGhlc2lzIFRlc3RpbmcgU3RlcHM8L3NwYW4+DQoxLiBJZGVudGlmeSBjb3JyZWN0IHByb2NlZHVyZQ0KMi4gU2V0dXAgbnVsbCAkKEhfMCkkIGFuZDwvYnI+IGFsdGVybmF0ZSAkKEhfYSkkIGh5cG90aGVzZXMNCjMuIFZlcmlmaWNhdGlvbjogYXJlIGRhdGEgYXBwcm9wcmlhdGU8L2JyPiBmb3IgcHJvY2VkdXJlPw0KNC4gU2V0ICRcYWxwaGEkICgkXGFscGhhID0gLjA1JCBpcyBkZWZhdWx0IHZhbHVlKQ0KNS4gKipSdW4gU3RhdHMgQXBwKiogdG8gZGV0ZXJtaW5lICRwJC12YWx1ZQ0KNi4gU3RhdGlzdGljYWwgQ29uY2x1c2lvbjogIlJlamVjdCAkSF8wJCIgb3I8L2JyPiJGYWlsIHRvIHJlamVjdCAkSF8wJCINCjcuIFJlc2VhcmNoIGNvbmNsdXNpb24NCjwvZGl2Pg0KTGV0J3MgcGVyZm9ybSB0aGUgc2FtZSBhbmFseXNpcyBidXQgd2l0aCB0aGUgdGhlb3JldGljYWwgYXBwcm9hY2ggdG8gZGV0ZXJtaW5pbmcgdGhlICRwJC12YWx1ZS4gSSB3aWxsIGFsc28gY29uZHVjdCB0aGUgZW50aXJlIHByb2Nlc3MgdXNpbmcgdGhlIGh5cG90aGVzaXMgdGVzdGluZyBzdGVwcyBzaG93biB0byB0aGUgcmlnaHQuDQoNCiMjIFZlcmlmaWNhdGlvbiBQcm9jZWR1cmVzLg0KDQpCZWZvcmUgd2UgYmVnaW4sIEkgc2hvdWxkIHNwZWNpZmljYWxseSBkaXNjdXNzICoqU3RlcCAzOiBWZXJpZmljYXRpb24qKi4gV2Ugd2lsbCBlbmQgdXAgdXNpbmcgdGhlICRcY2hpXjIkIGRpc3RyaWJ1dGlvbiBmb3Igb3VyIHRoZW9yZXRpY2FsIGVzdGltYXRpb24gb2YgdGhlICRwJC12YWx1ZSBtYWlubHkgYmVjYXVzZSB0aGUgJHokLXByb3BvcnRpb24gdGVzdCB3b3VsZCBmYWlsIGl0cyB2ZXJpZmljYXRpb24gcHJvY2VkdXJlIGR1ZSB0byBzbWFsbCBzYW1wbGUgc2l6ZS4NCg0KIyMjIFZlcmlmaWNhdGlvbiBQcm9jZWR1cmU6ICR6JC1wcm9wb3J0aW9uIFRlc3RzDQoNClRvIHVzZSB0aGUgJHokLXN0YXRpc3RpYyB0byBwcm9kdWNlIGVzdGltYXRlZCAkcCQtdmFsdWVzIGZvciB0aGUgYmlub21pYWwgZGlzdHJpYnV0aW9uLCB3ZSBtdXN0IGhhdmUgYXQgbGVhc3QgMTAgc3VjY2Vzc2VzIGFuZCAxMCBmYWlsdXJlcyBpbiBhbGwgb3VyIHNhbXBsZXMuIEZvciB0aGUgRG9scGhpbiBzdHVkeSwgd2UgaGF2ZSBvbmx5IDMwIG9ic2VydmF0aW9ucyB0b3RhbCwgc28gdGhlcmUgaXMgbm8gcG9zc2libGUgd2F5IHRvIGhhdmUgYXQgbGVhc3QgMTAgb2JzZXJ2YXRpb25zIGluIGVhY2ggb2YgdGhlIGZvdXIgY2VsbHMgaW4gdGhlIGNyb3NzLXRhYnVsYXRpb24gdGFibGUuDQoNCmBgYHtyfQ0KdGFsbHkoUmVzdWx0IH4gVHJlYXRtZW50LCBkYXRhID0gRG9scGhpbikNCmBgYA0KV2Ugc2VlIHRoYXQgdGhlIHN1Y2Nlc3NlcyBjb3VudCBpcyBvbmx5IDMgZm9yIHRoZSBDb250cm9sIGdyb3VwLCBhbmQgZmFpbHVyZXMgY291bnQgaXMgb25seSA1IGZvciB0aGUgVHJlYXRtZW50IGdyb3VwLg0KDQojIyMgVmVyaWZpY2F0aW9uIFByb2NlZHVyZTogJFxjaGleMiQgVHdvLVdheSBUZXN0cw0KDQo8ZGl2IHN0eWxlPSJmbG9hdDpyaWdodDsgbWFyZ2luOiA4cHg7IGJvcmRlcjoycHggYmxhY2sgc29saWQ7IHBhZGRpbmc6IDBweCAxMHB4IDVweCI+DQojIyMgPHNwYW4gc3R5bGU9ImNvbG9yOiByZWQ7Ij4kXGNoaV4yJCBpbiBSPC9zcGFuPg0KVGhlIE1vc2FpYyB2ZXJzaW9uIG9mIHRoZSAkXGNoaV4yJCB0ZXN0IGlzICoqeGNoaXNxLnRlc3QqKjwvYnI+DQp3aGljaCB1c2VzIGEgWWF0ZXMgY29ycmVjdGlvbi4gVG8gbWF0Y2ggZ3JhcGhpbmcgPC9icj4gDQpjYWxjdWxhdG9yIG9yIGJ5LWhhbmQgcmVzdWx0cywgdHVybiBvZmYgdGhlIFlhdGVzPC9icj4NCmNvcnJlY3Rpb24gYnkgdXNpbmcgYXJndW1lbnQgJFxmYm94e2NvcnJlY3QgPSBUUlVFfSQuDQo8L2Rpdj4NCg0KVG8gdXNlIHRoZSAkXGNoaV4yJC1zdGF0aXN0aWMgdG8gcHJvZHVjZSBlc3RpbWF0ZWQgJHAkLXZhbHVlcyBmb3IgdGhlIGluZGVwZW5kZW5jZSBvZiB0d28gY2F0ZWdvcmljYWwgdmFyaWFibGVzLCBsb3cgY2VsbCBjb3VudHMgYXJlIHRoZSBwcm9ibGVtIGNoaWxkcmVuIHdlIG11c3QgYXZvaWQsIGp1c3QgbGlrZSB3aXRoIHRoZSAkeiQtcHJvcG9ydGlvbiB0ZXN0cy4gSG93ZXZlciwgdGhlICRcY2hpXjIkIHN0YXRpc3RpYyBpcyBtb3JlIHJvYnVzdCAobGVzcyBicmVha2FibGUpIHRoYW4gJHokLg0KDQpGb3IgYWxsICRcY2hpXjIkIHN0YXRpc3RpY2FsIHRlc3RpbmcsIHdlIHJlcXVpcmUgdGhhdCB0aGVyZSBiZSBubyBtb3JlIHRoYW4gMjAlIGxvdyAqKkV4cGVjdGVkKiogY2VsbCBjb3VudHMgd2hlcmUgYSAibG93IGNlbGwgY291bnQiIGlzIGRlZmluZWQgdG8gYmUgc3RyaWN0bHkgbGVzcyB0aGFuIDUuIA0KDQpgYGB7cn0NCnhjaGlzcS50ZXN0KFJlc3VsdCB+IFRyZWF0bWVudCwgZGF0YSA9IERvbHBoaW4sIGNvcnJlY3QgPSBGQUxTRSkNCmBgYA0KDQpXZSBpZ25vcmUgdGhlICRwJC12YWx1ZSBhbmQgb3RoZXIgb3V0cHV0LCBpbml0aWFsbHkuIEZvciB0aGUgdmVyaWZpY2F0aW9uIHByb2NlZHVyZSwgd2Ugc2VlIHRoYXQgYWxsIHRoZSBleHBlY3RlZCBjZWxsIGNvdW50cyBhcmUgbGVhc3QgNSwgYW5kIHRoZXNlIGRhdGEgYXJlIGFwcHJvcHJpYXRlIGZvciAkXGNoaV4yJCBwcm9jZWR1cmVzLg0KDQojIyMgSG93IGlzIHRoZSBFeHBlY3RlZCBNYXRyaXggY2FsY3VsYXRlZD8gDQoNClRoZSBudWxsIGh5cG90aGVzaXMgZm9yICRcY2hpXjIkIFR3byBXYXkgVGVzdCBpcyB0aGF0IHRoZSB0d28gY2F0ZWdvcnkgdmFyaWFibGVzIGFyZSBpbmRlcGVuZGVudCBvZiBvbmUgYW5vdGhlci4gSW4gdGhpcyBjYXNlLCB3ZSdyZSBzYXlpbmcgdGhhdCB0aGUgcmVzdWx0cyB3b3VsZCBiZSB0aGUgc2FtZSBpbiBib3RoIHRoZSBEb2xwaGluIGdyb3VwIGFuZCB0aGUgQ29udHJvbCBncm91cC4gU2luY2UgMTMgb3V0IG9mIDMwIHN0dWR5IHBhcnRpY2lwYW50cyBpbXByb3ZlZCwgd2UgaGF2ZSBhbiBvdmVyYWxsIEltcHJvdmVkIFJhdGUgb2YgJFxmcmFjezEzfXszMH0gPSBgciBwYXN0ZShyb3VuZCgxMy8zMCwzKSlgJC4gQXBwbHlpbmcgdGhlICQ0My4zXCUkIHN1Y2Nlc3MgcmF0ZSB0byB0aGUgMTUgcGFydGljaXBhbnRzIGluIHRoZSBEb2xwaGluIGdyb3VwLCB3ZSAqKmV4cGVjdCoqICQwLjRcb3ZlcmxpbmV7MzN9KjE1ID0gNi41JCBvZiB0aGVtIHRvIEltcHJvdmUuDQoNCiMjIEh5cG90aGVzaXMgVGVzdGluZzogRG9scGhpbiBTdHVkeQ0KDQp3aGlsZSBkaWZmZXJlbnQgdGV4dGJvb2tzIGFuZCB0ZWFjaGVycyBtYXkgY2h1bmsgdGhlIHByb2Nlc3MgZGlmZmVyZW50bHksIGEgc2NpZW50aWZpYyByZXBvcnQgb2Ygc3RhdGlzdGljYWwgY29uY2x1c2lvbnMgcmVxdWlyZXMgYWxsIG9mIHRoZSBlbGVtZW50cyBzaG93biBiZWxvdy4gSW4gc2NpZW50aWZpYyBwcmVzZW50YXRpb24gb2YgcmVzdWx0cywgd2UgdGVuZCB0byB1c2UgcGFyYWdyYXBoLCBub3QgYnVsbGV0LXBvaW50LCBmb3JtYXQuIFRoZSBidWxsZXQgcG9pbnRzIGJlbG93IGFyZSBzaW1wbHkgdGhlcmUgdG8gaGlnaGxpZ2h0IGVhY2ggcmVxdWlyZWQgcG9ydGlvbiBvZiB0aGUgc3RhdGlzdGljYWwgaHlwb3RoZXNpcyB0ZXN0Lg0KDQojIyMgMS4gUHJvY2VkdXJlDQpGb3IgdGhlIHN0dWR5IGRlc2lnbiwgd2UgYXJlIGNvbXBhcmluZyB0aGUgcHJvcG9ydGlvbiBvZiBzdWNjZXNzZXMgaW4gdHdvIHNhbXBsZXMgdG8gb25lIGFub3RoZXIsIGFuZCBnZW5lcmFsbHkgd2Ugd291bGQgdXNlIGEgMi1zYW1wbGUgJHokLXByb3BvcnRpb24gdGVzdCBmb3IgdGhpcyBwdXJwb3NlLiBIb3dldmVyLCBhcyBzaG93biBhYm92ZSwgdGhlIHNhbXBsZSBzaXplIGlzIHRvbyBzbWFsbCB0byBleHBlY3QgYWNjdXJhdGUgJHAkLXZhbHVlcyBmcm9tIHRoZSAkeiQtcHJvcG9ydGlvbiBhcHByb2FjaCwgc28gd2Ugd2lsbCB1c2UgYSAkXGNoaV4yJCBUd28gV2F5IFRlc3QsIHNvbWV0aW1lcyBjYWxsZWQgYSAkXGNoaV4yJCBUZXN0IG9mIEluZGVwZW5kZW5jZS4NCg0KIyMjIDIuIEh5cG90aGVzaXMNCk91ciBudWxsIGh5cG90aGVzaXMgaXMgdGhhdCB0aGUgcmVzdWx0cyBvZiB0aGUgZXhwZXJpbWVudGFsIHRyZWF0bWVudCBhcmUgY29tcGxldGVseSBpbmRlcGVuZGVudCBvZiB3aGljaCBncm91cCB0aGUgcGFydGljaXBhbnRzIHdlcmUgYXNzaWduZWQgdG8uIFdlIHVzZSB0aGUgc3ltYm9scyAkSF8wJCB0byBpbmRpY2F0ZSB0aGUgbnVsbCBhbmQgJEhfYSQgdG8gaW5kaWNhdGUgdGhlIGFsdGVybmF0ZSBoeXBvdGhlc2lzLg0KDQokJFxiZWdpbnthbGlnbip9IEhfMCAmOiBcdGV4dHtSRVNVTFQgaXMgaW5kZXBlbmRlbnQgb2YgVFJFQVRNRU5UfVxcICAgSF9hICY6IFx0ZXh0e1JFU1VMVCBpcyBkZXBlbmRlbnQgdXBvbiBUUkVBVE1FTlR9IFxlbmR7YWxpZ24qfSQkDQoNCkluIHN0YXRpc3RpY3MsIHdlIG9mdGVuIGluZGljYXRlIHZhcmlhYmxlcyBieSB1c2luZyB3b3JkcyBvciBhYmJyZXZpYXRpb25zIGluIHVwcGVyY2FzZSBsZXR0ZXJzLg0KDQojIyMgMy4gVmVyaWZpY2F0aW9uDQpBcyBzaG93biBhYm92ZSwgYWxsIGZvdXIgKipleHBlY3RlZCoqIGNlbGwgY291bnRzIGFyZSBhdCBsZWFzdCA2LjUsIHNvIHdlIGhhdmUgMCUgbG93IGV4cGVjdGVkIGNlbGxzLiBUaGUgZGF0YSBhcmUgYXBwcm9wcmlhdGUgZm9yIHVzaW5nICRcY2hpXjIkIHByb2NlZHVyZXMuDQoNCiMjIyA0LiBBbHBoYQ0KV2Ugd2lsbCBkaXNjdXNzIHRoZSBudWFuY2VzIG9mIHRoZSBsZXZlbCBvZiBzaWduaWZpY2FuY2UgbGF0ZXIgaW4gdGhlIGNvdXJzZS4gRm9yIG5vdywgd2Ugd2lsbCB1c2UgdGhlIGRlZmF1bHQgc2V0dGluZyBvZiAkXGFscGhhID0gMC4wNSQuDQoNCiMjIyA1LiBSdW4gU3RhdHMgQXBwDQpXZSBjYW4gdXNlIGEgZ3JhcGhpbmcgY2FsY3VsYXRvciBvciBzdGF0aXN0aWNzIHNvZnR3YXJlIGxpa2UgSk1QLCBTUFNTIG9yIFJTdHVkaW8gdG8gcnVuIHRoaXMgcHJvY2VkdXJlLiBXZSBjYW4gZXZlbiBiZSB0aGUgYXBwIG91cnNlbHZlcyBhbmQgcnVuIHRoZSBwcm9jZWR1cmUgYnktaGFuZCB1c2luZyBzdGF0aXN0aWNhbCB0YWJsZXMuDQoNCmBgYHtyfQ0KeGNoaXNxLnRlc3QoUmVzdWx0IH4gVHJlYXRtZW50LCBkYXRhID0gRG9scGhpbiwgY29ycmVjdCA9IEZBTFNFKQ0KYGBgDQoNClRoZSBjYWxjdWxhdGVkICRcY2hpXjIkIHN0YXRpc3RpYyB3YXMgNC44ODY5LCBhbmQgJHAkLXZhbHVlIHdhcyAwLjAyNzA2IGluZGlkaWNhdGluZyBhbiBhcHByb3hpbWF0ZWx5IDMlIHByb2JhYmlsaXR5IHRoYXQgdGhlIG51bGwgaHlwb3RoZXNpcyBpcyB0cnVlLg0KDQojIyMgNi4gU3RhdGlzdGljYWwgQ29uY2x1c2lvbg0KDQpXaGVuIHRoZSBwcm9iYWJpbGl0eSBvZiB0aGUgbnVsbCBiZWluZyB0cnVlIGlzIHNtYWxsLCB3ZSBoYXZlIGV2aWRlbmNlIHRoYXQgaXQgaXMgbGlrZWx5IGZhbHNlLiBUaGVyZWZvcmUsIG91ciBjcml0ZXJpYSBmb3IgcmVqZWN0aW5nIHRoZSBudWxsIGh5cG90aGVzaXMgaXMgJCRcdGV4dHtJZn1caHNwYWNlezNtbX1wPFxhbHBoYVxoc3BhY2V7M21tfSBccmlnaHRhcnJvdyBcaHNwYWNlezNtbX1cdGV4dHtSZWplY3QgfSBIXzAkJA0KDQpPdXIgc3RhdGlzdGljYWwgY29uY2x1c2lvbiBmb3IgdGhlIERvbHBoaW4gc3R1ZHkgaXMgdG8gKipyZWplY3QgdGhlIG51bGwqKiBiZWNhdXNlICQkcFxhcHByb3ggMC4wMjc8MC4wNSA9IFxhbHBoYSQkDQpGb3IgYW55ICRwJC12YWx1ZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJFxhbHBoYSQsIHdlIHdvdWxkICJmYWlsIHRvIHJlamVjdCAkSF8wJCIuIFNpbmNlIHdlJ3JlIG1hdGggZ2Vla3MsIHdlIHVzZSB0aGUgc3ltYm9sICRIXzAkIGFuZCB0aGUgd29yZHMgIm51bGwgaHlwb3RoZXNpcyIgaW50ZXJjaGFuZ2VhYmx5Lg0KDQojIyMgNy4gUmVzZWFyY2ggQ29uY2x1c2lvbg0KDQpUaGUgcmVzZWFyY2ggY29uY2x1c2lvbiBpcyBhIHN0YXRlbWVudCB1c2luZyByZWFsLXdvcmxkIHRlcm1zIHRoYXQgZGVzY3JpYmUgdGhlIHJlc3VsdHMgb2YgdGhlIGVudGlyZSBwcm9jZXNzLiBGb3IgdGhpcyBoeXBvdGhlc2lzIHRlc3QsIGNvbnNpZGVyIHRoZSBmb2xsb3dpbmcgc3RhdGVtZW50Lg0KJCRcdGV4dHtFdmlkZW5jZSBzdWdnZXN0cyB0aGF0IFJFU1VMVCBkZXBlbmRzIHVwb24gVFJFQVRNRU5UIH0ocD0wLjAyNylcdGV4dHsufSQkDQoNCiMgPHNwYW4gc3R5bGU9ImNvbG9yOiBibHVlOyI+SVYuIEV4YW1wbGVzPC9zcGFuPg0KDQpMZXQncyBsb2FkIG91ciBiaWcgZGF0YSBzZXQgZm9yIHRoaXMgY2xhc3MgYW5kIHdvcmsgb3V0IHNvbWUgZXhhbXBsZXMuIFlvdSBjYW4gdXNlICJGaWxlOiBJbXBvcnQgRGF0YXNldCIgb3IgdGhlIGNvZGUgYmxvY2sgYmVsb3cgaWYgdGhlIGZpbGUgaXMgaW4geW91ciB3b3JraW5nIGRpcmVjdG9yeS4NCg0KYGBge3J9DQpEYXRhMzM1MCA9IHJlYWRfZXhjZWwoIkRhdGEzMzUwLnhsc3giKQ0KYGBgDQoNCiMjIERhdGluZyBFeGFtcGxlOiBEbyB5b3UgQWNjZXB0Pw0KDQpGcm9tIHRoZSAiVmFyc0RhdGEzMzUwIiBQREYgZmlsZSB3ZSBmaW5kIHRoZSBmb2xsb3dpbmcgZGVzY3JpcHRpb24gb2YgdGhlIEFDQ0VQVERBVEUgdmFyaWFibGUuDQoNCjxkaXYgc3R5bGU9ImZsb2F0OmNlbnRlcjsgbWFyZ2luOiA4cHg7IGJvcmRlcjoycHggYmxhY2sgc29saWQ7IHBhZGRpbmc6IDBweCAxMHB4IDVweCI+DQojIyMgRGF0aW5nIFF1ZXN0aW9uDQrigJxBdCBhIHRpbWUgaW4geW91ciBsaWZlIHdoZW4geW91IGFyZSBub3QgaW52b2x2ZWQgd2l0aCBhbnlvbmUsIGEgcGVyc29uIGFza3MgeW91IG91dC4gVGhpcyBwZXJzb24gaGFzIGEgZ3JlYXQgcGVyc29uYWxpdHksIGJ1dCB5b3UgZG8gbm90IGZpbmQgdGhpcyBwZXJzb24gcGh5c2ljYWxseSBhdHRyYWN0aXZlLiBEbyB5b3UgYWNjZXB0IHRoZSBkYXRlP+KAnQ0KDQpSZXNwb25zZXM6IFkgPSDigJxZZXMs4oCdIE4sID0g4oCcTm/igJ0NCjwvZGl2Pg0KDQpTdXBwb3NlIHRoYXQgd2UgaW52ZXN0aWdhdGUgd2hldGhlciB0aGlzIGNhdGVnb3J5IHZhcmlhYmxlIGlzIGNvbXBsZXRlbHkgaW5kZXBlbmRlbnQgb2YgYW5vdGhlciBjYXRlZ29yeSB2YXJpYWJsZTogYmlvbG9naWNhbCBzZXggd2hlcmUgIkYiIGluZGljYXRlcyBmZW1hbGUgYW5kICJNIiBpbmRpY2F0ZXMgbWFsZS4NCg0KYGBge3J9DQp0YWxseShBY2NEYXRlIH4gU2V4ICwgZGF0YSA9IERhdGEzMzUwKQ0KYGBgDQpBIHZpc3VhbGl6YXRpb24gb2YgdGhlIGRhdGEgd2hlcmUgcHJvcG9ydGlvbnMgYXJlIHNob3duIGFzIGFyZWFzIGlzIGNhbGxlZCBhIG1vc2FpYyBwbG90Lg0KDQpgYGB7cn0NCm1vc2FpY3Bsb3QoQWNjRGF0ZSB+IFNleCAsIGRhdGEgPSBEYXRhMzM1MCwgDQogICAgICAgICAgIGNvbG9yID0gVFJVRSwNCiAgICAgICAgICAgbWFpbiA9ICJNb3NhaWMgUGxvdDogQWNjZXB0RGF0ZSBieSBTZXgiKQ0KYGBgICAgICAgICAgICAgICANCg0KTm90ZSBob3cgdGhlICJObyIgcm93IGlzIG5hcnJvd2VyOiBvdmVyYWxsIG1vcmUgcGFydGljaXBhbnRzIHNhaWQgIlllcy4iIE5vdGUgdGhlIHRvdGFsIGRhcmsgZ3JheSBhcmVhIGlzIG11Y2ggbGFyZ2VyIHRoYW4gdGhlIGxpZ2h0IGdyYXk6IGZlbWFsZXMgbWFrZSB1cCBhbG1vc3QgNjAlIG9mIHRoZSBzdWJqZWN0cy4gVGhlIHNoYWRpbmcgYWxzbyBoaWdobGlnaHRzIGhvdyB0aGUgZmVtYWxlcyByZXNwb25kZWQgIlllcyIgYWxtb3N0IHR3aWNlIGFzIG9mdGVuIHRoZXkgcmVzcG9uZGVkICJObyIgd2hpbGUgdGhlIG1hbGVzIHNwbGl0IGFib3V0IDUwLTUwIFllcyB2cy4gTm8uDQoNCldoaWxlIHRoZSBtb3NhaWMgcGxvdCBkb2VzIGluZGljYXRlIGEgc2V4LWJhc2VkIGRpZmZlcmVuY2Ugc2VlbXMgdG8gZXhpc3QsIHRoZSBxdWVzdGlvbiBpcyB3aGV0aGVyIG9yIG5vdCB0aGF0IGRpZmZlcmVuY2UgaXMgc3RhdGlzdGljYWxseSBzaWduaWZpY2FudC4gVGhhdCdzIHdoeSB3ZSBydW4gYSBoeXBvdGhlc2lzIHRlc3QuDQoNClVzaW5nIHRoZSAkXGNoaV4yJCBkZWZhdWx0LCB3ZSB3b3VsZCBoYXZlIHRoZSBmb2xsb3dpbmcgb3V0cHV0Lg0KDQpgYGB7cn0NCnhjaGlzcS50ZXN0KEFjY0RhdGUgfiBTZXggLCBkYXRhID0gRGF0YTMzNTAsIGNvcnJlY3QgPSBGQUxTRSkNCmBgYCAgIA0KDQpUaGUgZG93bnNpZGUgb2YgdGhlICoqeGNoc3FyLnRlc3QqKiBmdW5jdGlvbiAoZnJvbSB0aGUgKipNb3NhaWMqKiBwYWNrYWdlKSBpcyBpdCdzIGxhY2sgb2YgMS10YWlsZWQgdGVzdGluZyBvcHRpb25zLiBUaGVyZSBpcyBhIHN0ZXJlb3R5cGUgdGhhdCB3b21lbiBldmFsdWF0ZSBwb3RlbnRpYWwgZGF0ZXMgbW9yZSBob2xvc3RpY2FsbHkgd2hpbGUgbWVuIGV2YWx1YXRlIHBvdGVudGlhbCBkYXRlcyBtb3N0bHkgb24gYXBwZWFyYW5jZS4gV2UgY2FuIHRlc3QgdGhlIHN0ZXJlb3R5cGUgYnkgdXNpbmcgdGhlIGZvbGxvd2luZyAxLXRhaWxlZCBoeXBvdGhlc2lzIHRlc3QuDQoNCiMjIyBIeXBvdGhlc2lzIFRlc3Q6IERvIHlvdSBBY2NlcHQ/DQoNCjxkaXYgc3R5bGU9ImZsb2F0OnJpZ2h0OyBtYXJnaW46IDhweDsgYm9yZGVyOjJweCBibGFjayBzb2xpZDsgcGFkZGluZzogMHB4IDEwcHggNXB4Ij4NCiMjIyBIeXBvdGhlc2lzIFRlc3RpbmcgU3R5bGUNClRoaXMgZXhhbXBsZSBpcyB3cml0dGVuIHVwIGluIHBhcmFncmFwaCBmb3JtLDwvYnI+DQpidXQgbm90ZSBob3cgdGhlIGRldGFpbHMgZnJvbSBlYWNoIG9mIHRoZSBzZXZlbjwvYnI+DQpzdGVwcyBsaXN0ZWQgYmVmb3JlIGFyZSBkaXNjdXNzZWQuIFlvdSBjYW4gdXNlPC9icj4NCmJ1bGxldC1wb2ludCBmb3JtYXQgaWYgeW91J2QgbGlrZS4gTW9zdDwvYnI+DQpyZXNlYXJjaGVycyBkbyBub3QuDQo8L2Rpdj4NCldlIHdpbGwgdXNlIGEgMS10YWlsZWQsIDItcHJvcG9ydGlvbiB0ZXN0IHdoaWNoLCBpbiBSU3R1ZGlvLCB3aWxsIG1lYW4gYSAkXGNoaV4yJCBUZXN0IG9mIEluZGVwZW5kZW5jZS4NCg0KTGV0ICJZZXMiIHJlc3BvbnNlcyB0byB0aGUgZGF0aW5nIHF1ZXN0aW9uIGJlIGNvbnNpZGVyZWQgc3VjY2Vzc2VzLiBMZXQgJHBfRiQgcmVwcmVzZW50IHRoZSBwZXJjZW50YWdlIG9mIHN1Y2Nlc3NlcyBpbiB0aGUgZmVtYWxlIHN1Yi1wb3B1bGF0aW9uLCBhbmQgJHBfTSQgcmVwcmVzZW50IHRoZSBwZXJjZW50YWdlIG9mIHN1Y2Nlc3NlcyBmb3IgdGhlIG1hbGUgc3ViLXBvcHVsYXRpb24uDQokJFxiZWdpbnthbGlnbip9SF8wICY6IHBfRiA9IHBfTVxcDQpcXCBIX2EgJjogcF9GID4gcF9NXGVuZHthbGlnbip9JCQNCg0KRm9yIHZlcmlmaWNhdGlvbiwgbm90ZSB0aGF0IHRoZSAqKnhjaGlzcS50ZXN0KiogZnVuY3Rpb24gZ2VuZXJhdGVzIHRoZSBFeHBlY3RlZCBtYXRyaXguDQoNCmBgYHtyfQ0KY2hpID0geGNoaXNxLnRlc3QoQWNjRGF0ZSB+IFNleCAsIGRhdGEgPSBEYXRhMzM1MCwgY29ycmVjdCA9IEZBTFNFKQ0KYGBgDQoNClRoZSBrZXkgYXQgdGhlIGJvdHRvbSBpbmRpY2F0ZXMgdGhlIHZhbHVlcyBpbiBwYXJlbnRoZXNlcyBhcmUgdGhlIGNlbGxzIG9mIHRoZSBleHBlY3RlZCBtYXRyaXguIEFsbCBmb3VyIGV4cGVjdGVkIGNlbGwgY291bnRzIGFyZSBmYXIgZ3JlYXRlciB0aGFuIDUsIHNvIHRoZXNlIGRhdGEgYXJlIGFwcHJvcHJpYXRlIGZvciAkXGNoaV4yJCBwcm9jZWR1cmVzLiBSZW1lbWJlciwgZXZlbiB0aG91Z2ggd2Ugd291bGQgcnVuIHRoaXMgYXMgYSAyLXByb3BvcnRpb24gJHokLXRlc3Qgb24gdGhlIGdyYXBoaW5nIGNhbGN1bGF0b3IsIFJTdHVkaW8gYWx3YXlzIGRlZmF1bHRzIHRvICRcY2hpXjIkIGZvciBwcm9wb3J0aW9uIHRlc3RzLCBldmVuIHRoZSAxLXByb3BvcnRpb24gdmFyaWV0eS4NCg0KIyMjIE9uZS10YWlsZWQgcHJvcG9ydGlvbiB0ZXN0aW5nIGluIFJTdHVkaW8NCg0KV2l0aCB0aGUgZGVmYXVsdCBsZXZlbCBvZiBzaWduaWZpY2FuY2UsIHdlIHdhbnQgdG8gcnVuIGEgMS10YWlsZWQgdGVzdCB1c2luZyBhICJsZXNzIHRoYW4iIGFsdGVybmF0aXZlIGh5cG90aGVzaXMuIFdoeSAibGVzcyB0aGFuIj8gQmVjYXVzZSAiRmVtYWxlcyIgYW5kICJObyIgd2VyZSBsaXN0ZWQgZmlyc3QgZm9yIFNFWCBhbmQgQUNDRVBUIERBVEUgcmVzcGVjdGl2ZWx5LCBzbyBSIGludGVycHJldHMgdGhlIGFsdGVybmF0aXZlIGh5cG90aGVzaXMgYXMgY29tcGFyaW5nIHRoZSBwZXJjZW50YWdlIG9mICJObyIgcmVzcG9uc2VzIGZvciBmZW1hbGVzIChsZWZ0LWhhbmQgc2lkZSkgdnMuIHRoZSBwZXJjZW50YWdlIG9mICJObyIgcmVzcG9uc2VzIGZvciBtYWxlcyAocmlnaHQtaGFuZCBzaWRlKS4gQ29uZnVzaW5nPyBEb24ndCB3b3JyeSwgSSBoYWQgdG8gZmlndXJlIGl0IG91dCBieSB0cmlhbCBhbmQgZXJyb3IsIHRvby4NCg0KYGBge3J9DQpwcm9wLnRlc3QoQWNjRGF0ZSB+IFNleCAsIGRhdGEgPSBEYXRhMzM1MCwNCiAgICAgICAgICBhbHRlcm5hdGl2ZSA9ICJsZXNzIg0KICAgICAgICAgICwgY29ycmVjdCA9IEZBTFNFDQogICAgICAgICAgKQ0KYGBgIA0KQmVjYXVzZSAkJHAgPSAwLjAzMDQgPCAuMDUgPVxhbHBoYSQkIHdlIHJlamVjdCB0aGUgbnVsbC4gVGhlIGV2aWRlbmNlIGZyb20gdGhpcyBwcm9wb3J0aW9uIHRlc3Qgc3VnZ2VzdHMgdGhhdCB0aGUgcGF0dGVybiBvZiBZZXMvTm8gcmVzcG9uc2VzIHRvIHRoZSAiQWNjZXB0IERhdGUiIHF1ZXN0aW9uIGRlcGVuZHMgdXBvbiBnZW5kZXIgKHAgPSAuMDMwNCkuDQoNCiMjIEV4YW1wbGU6IExhZHkgVGFzdGluZyBUZWENCg0KU3VwcG9zZSB0aGF0IERyLiBNdXJpZWwgQnJpc3RvbCBoYWQgaWRlbnRpZmllZCA4IG9mIDggY3VwcyBvZiB0ZWEgY29ycmVjdGx5LiBIb3cgY2FuIHdlIHF1aWNrbHkgZ2VuZXJhdGUgYSB0aGVvcmV0aWNhbCBwcm9iYWJpbGl0eSBpbiBSU3R1ZGlvPyBUaGUgcHJvcG9ydGlvbiBzdGF0aXN0aWMgaXMgJCRcaGF0e3B9ID0gXGZyYWN7eH17bn0kJCB3aGVyZSAkeCQgaXMgdGhlIG51bWJlciBvZiBzdWNjZXNzZXMgb3V0IG9mICRuJCB0b3RhbCBvYnNlcnZhdGlvbnMuIFdlIGNhbiB1c2UgdGhlIGZ1bmN0aW9uICRcZmJveHtwcm9wLnRlc3R9JCBhbmQgc3BlY2lmeSAkeCQgYW5kICRuJC4gV2UgYXJlIHRlc3RpbmcgdGhlIGh5cG90aGVzaXMNCiQkXGJlZ2lue2FsaWduKn1IXzAgJjogXHRleHR7cHJvcH0gPSAwLjVcXEhfYSAmOiBcdGV4dHtwcm9wfSA+IDAuNSBcZW5ke2FsaWduKn0kJA0Kd2hpY2ggaXMgd2h5IHdlIGluY2x1ZGUgdGhlICRcZmJveHthbHRlcm5hdGl2ZSA9IGdyZWF0ZXJ9JCBvcHRpb24gaW4gdGhlIGZ1bmN0aW9uIGNhbGwuDQpgYGB7cn0NCnByb3AudGVzdCh4ID0gOCwgbiA9IDgsIHAgPSAuNSwNCiAgICAgICAgICBhbHRlcm5hdGl2ZSA9ICJncmVhdGVyIiwNCiAgICAgICAgICBjb3JyZWN0ID0gRkFMU0UpDQpgYGANCg0KTm90aWNlIHRoYXQgdGhlIG91dHB1dCBoYXMgdGhyb3duIGFuIGVycm9yIGNvZGUgd2hpY2ggcHJpbnRzIG91dCBpbiByZWQgdHlwZSBhdCB0aGUgdG9wLiBXaHk/IFdlbGwsIHRoZSBleHBlY3RlZCBtYXRyaXggaGFzIG9ubHkgNCBzdWNjZXNzZXMgYW5kIDQgZmFpbHVyZXMsIHNvIHRoZSBzYW1wbGUgc2l6ZSBpcyB0b28gc21hbGwuIFRoZSBlcnJvciBjb2RlIGlzIFIncyBtZXNzYWdlIHRvIGRvdWJsZSBjaGVjayB0aGUgdmVyaWZpY2F0aW9uLg0KDQpTdXBwb3NlIEJyaXN0b2wgdGFzdGVkIG1vcmUgdGVhLCBhbmQgdGhhdCBzaGUgaWRlbnRpZmllZCAxMiBvZiAxNCBzdWNjZXNzZnVsbHk6ICQkXGhhdCBwID1cZnJhY3sxMn17MTR9JCQgDQoNCkZvciB2ZXJpZmljYXRpb24gb2YgYSAxLXByb3BvcnRpb24gdGVzdCwgd2UgdXNlIHRoZSBwcm9wb3J0aW9uICRwXzAkIGZyb20gdGhlIGh5cG90aGVzaXMgYWxvbmcgd2l0aCB0aGUgc2FtcGxlIHNpemUgJG4kIHRvIGdlbmVyYXRlIHRoZSBFeHBlY3RlZCBjZWxsIGNvdW50czogJG4qcF8wID0gMTQgKiAwLjUgPSA3JCBmb3IgdGhlIHN1Y2Nlc3NlcywgYW5kICRuKigxLXBfMCkgPSAxNCAqIDAuNSA9IDckIGZvciB0aGUgZmFpbHVyZXMuIFRoZSB0ZXN0IG5vdyBydW5zIHdpdGhvdXQgYW55IGVycm9yIGNvZGVzIHRocm93biBiZWNhdXNlIHRoZSBjZWxsIGNvdW50cyBhcmUgYWxsIGdyZWF0ZXIgdGhhbiA1LiANCg0KYGBge3J9DQpwcm9wLnRlc3QoeCA9IDEyLCBuID0gMTQsIHAgPSAwLjUsDQogICAgICAgICAgYWx0ZXJuYXRpdmUgPSAiZ3JlYXRlciIsDQogICAgICAgICAgY29ycmVjdCA9IEZBTFNFKQ0KYGBgDQoNClRoZSAkcCQtdmFsdWUgaXMgMC4wMDgxIHdoaWNoIGlzIGZhciBsZXNzIHRoYW4gJFxhbHBoYSA9IDAuMDUkLCBzbyB3ZSByZWplY3QgdGhlIG51bGwgKGUuZy4gZ3Vlc3NpbmcgYXQgcmFuZG9tKS4gT3VyIHJlc2VhcmNoIGNvbmNsdXNpb24gaXMgdGhhdCB3ZSBoYXZlIHN0cm9uZyBldmlkZW5jZSB0aGF0IEJyaXN0b2wgY2FuIGFjdHVhbGx5IHRhc3RlIHRoZSBkaWZmZXJlbmNlIGluIHRoZSB0ZWEuDQoNCiMgPHNwYW4gc3R5bGU9ImNvbG9yOiBibHVlOyI+Vi4gUHJvcG9ydGlvbiBUZXN0aW5nIGZvciBRdWFsaXRhdGl2ZSBWYXJpYWJsZXMgd2l0aCBtb3JlIHRoYW4gMiBMZXZlbHM8L3NwYW4+DQoNCkNvbnNpZGVyIG91ciBEYXRhMzM1MCBkYXRhIGZyYW1lLiBXZSBoYXZlIHR3byBzdHJhaWdodGZvcndhcmQgdmFyaWFibGVzLg0KDQoxLiBTaXRDbGFzcyBpcyBzZWF0aW5nIHByZWZlcmVuY2UgaW4gY2xhc3M6IGZyb250LCBtaWRkbGUgb3IgYmFjay4NCjIuIFZhcnNBdGggaXMgYWtzIGlmIG9uZSBpcyBhIHZhcnNpdHkgYXRobGV0ZTogcmVzcG9uc2UgaXMgWWVzL05vLg0KDQpMZXQncyB1c2UgYSAkXGNoaV4yJCBUZXN0IG9mIEluZGVwZW5kZW5jZSB3aXRoIHRoZSBmb2xsb3dpbmcgaHlwb3RoZXNpczoNCg0KJCRcYmVnaW57YWxpZ24qfUhfMCAmOiBcdGV4dHtDbGFzcyBzZWF0aW5nIHByZWZlbmNlIGlzIGluZGVwZW5kZW50IG9mIHZhcnNpdHkgYWx0aGxldGUgc3RhdHVzfVxcSF9hICY6IFx0ZXh0e0NsYXNzIHNlYXRpbmcgcHJlZmVuY2UgZGVwZW5kcyB1cG9uIHZhcnNpdHkgYWx0aGxldGUgc3RhdHVzfQ0KXGVuZHthbGlnbip9JCQNCg0KTGV0J3MgcHJlc2VudCB0aGUgZGF0YSB1c2luZyAkXGZib3h7dGFsbHl9JC4NCmBgYHtyfQ0KdGFsbHkoU2l0Q2xhc3MgfiBWYXJzQXRoLCBkYXRhID0gRGF0YTMzNTApDQpgYGANCg0KV2hpbGUgbm90IGEgbmVjZXNzYXJ5IGh5cG90aGVzaXMgdGVzdGluZyBzdGVwLCB0aGUgKiptb3NhaWMgcGxvdCoqIHRlbGxzIGEgbmljZSB2aXN1YWwgc3RvcnkgYW5kIHNob3VsZCBiZSBpbmNsdWRpbmcgaW4gYW55IHByb3BvcnRpb24gdGVzdGluZy4NCg0KYGBge3J9DQptb3NhaWNwbG90KFNpdENsYXNzIH4gVmFyc0F0aCwgZGF0YSA9IERhdGEzMzUwLA0KICAgICAgICAgICBjb2xvciA9IFRSVUUsDQogICAgICAgICAgIG1haW4gPSAiQ2xhc3Mgc2VhdGluZyBwcmVmZXJlbmNlIHZzLiBWYXJzaXR5IEF0aGxldGUgc3RhdHVzIikNCmBgYA0KTm90aWNlIHRoZSBzdHJvbmcgcHJlZmVyZW5jZSBmb3Igc2VhdGluZyBpbiB0aGUgYmFjayBieSB2YXJzaXR5IGF0aGxldGVzLCBwZXJoYXBzIGEgZnVuY3Rpb24gb2YgbWFueSBhdGhsZXRlcyBiZWluZyB0YWxsZXIgdGhhbiBhdmVyYWdlLlRoZSBhcmVhcyBhcmUgbW9yZSBkaWZmaWN1bHQgdG8gY29tcGFyZSBiZXR3ZWVuIGZyb250IGFuZCBtaWRkbGUgZm9yIG5vbi1hdGhsZXRlcywgYnV0IGl0J3MgY2xlYXIgbm9uLWF0aGxldGVzIHByZWZlciBzZWF0cyBpbiB0aGUgYmFjayBmYXIgbGVzcyB0aGFuIGVpdGhlciBvZiB0aGUgb3RoZXIgb3B0aW9ucy4NCg0KV2Ugd2lsbCBuZWVkIHRvIGJlIGNhcmVmdWwgYWJvdXQgdmVyaWZpY2F0aW9uIGFzIHRoZXJlIGFyZSBzZXZlcmFsIGxvdyBjZWxsIGNvdW50cyBpbiB0aGUgb2JzZXJ2ZWQgZGF0YS4gTGV0J3MgcnVuIHRoZSBwcm9jZWR1cmUsIHRoZW4gaGl0IHRoZSBwYXVzZSBidXR0b24gd2hpbGUgY2hlY2sgb24gdGhlIEV4cGVjdGVkIGNlbGwgY291bnRzLg0KDQpgYGB7cn0NCnhjaGlzcS50ZXN0KFNpdENsYXNzIH4gVmFyc0F0aCwgZGF0YSA9IERhdGEzMzUwLA0KICAgICAgICAgICAgY29ycmVjdCA9IEZBTFNFKQ0KYGBgDQpSIHRocm93cyBhIHJlZCBlcnJvciBsaW5lIGF0IHRoZSB0b3Agb2YgdGhlIG91dHB1dCwgYnV0IG91ciByZXF1aXJlbWVudCB3YXMgdGhhdCB0aGVyZSBiZSBubyBtb3JlIHRoYW4gMjAlIGxvdyAqKkV4cGVjdGVkKiogY2VsbCBjb3VudHMuIFdlIGhhdmUgb25seSAxIG9mIDYgbG93IGV4cGVjdGVkIGNlbGxzLCBzbyBhYm91dCAxNyUuIFdlIHVzZSBhIHNsaWdodGx5IG1vcmUgbGliZXJhbCB2ZXJpZmljYXRpb24gcHJvY2VkdXJlIHRoYW4gUiB3aGljaCBmbGFncyBhbnkgZXhwZWN0ZWQgY2VsbCBjb3VudHMgbGVzcyB0aGFuIDUuDQoNClNpbmNlIHRoZSBkYXRhIGRvIHBhc3MgdmVyaWZpY2F0aW9uIGFuZCBhcHBlYXIgdG8gYmUgYXBwcm9wcmlhdGUgZm9yICRcY2hpXjIkIHByb2NlZHVyZXMsIHdlIGZpbmQgdGhhdCAkJHAgPSAwLjAxMTQyIDwgMC4wNSA9XGFscGhhJCQgKGFnYWluIHVzaW5nIG91ciBkZWZhdWx0IGxldmVsIG9mIHNpZ25pZmljYW5jZSkuIFRodXMsIHdlIHJlamVjdCB0aGUgbnVsbC4gVGhlcmUgaXMgc3Ryb25nIGV2aWRlbmNlIHRoYXQgY2xhc3Mgc2VhdGluZyBwcmVmZXJlbmNlcyBkZXBlbmQgdXBvbiB3aGV0aGVyIG9uZSBpcyBhIHZhcnNpdHkgYXRobGV0ZS4NCg0KIyA8c3BhbiBzdHlsZT0iY29sb3I6IGJsdWU7Ij5WSS4gU3VwcGxlbWVudGFyeSBNYXRlcmlhbDogMS0gYW5kIDItUHJvcG9ydGlvbiBUZXN0cyB3aXRoIFN1bW1hcnkgU3RhdHMgT25seTwvc3Bhbj4NCg0KV2UgY2FuIHJ1biBib3RoIDEtcHJvcG9ydGlvbiAkeiQtdGVzdHMgYW5kIDItcHJvcG9ydGlvbiAkeiQtdGVzdHMgZXZlbiBpZiB3ZSBvbmx5IGtub3cgdGhlIHN1bW1hcnkgc3RhdGlzdGljcyBidXQgZG9uJ3QgaGF2ZSBhIGRhdGEgZnJhbWUuDQoNCiMjIyMgRXhhbXBsZTogMS1Qcm9wb3J0aW9uICR6JC10ZXN0DQoNCkEgcmVjZW50IDxhIGhyZWYgPSBodHRwczovL3d3dy5uY2JpLm5sbS5uaWguZ292L3BtYy9hcnRpY2xlcy9QTUM0MzIwNzIwLyM6fjp0ZXh0PUFtb25nJTIwYWxsJTIwdGhlJTIwc3R1ZHklMjBwYXJ0aWNpcGFudHMsc3R1ZGVudHMlMjAobiUzRDI1MCkuPnN0dWR5IGluIFBha2lzdGFuPC9hPiBlc3RpbWF0ZWQgdGhhdCBhcHByb3hpbWF0ZWx5IDExJSBvZiBhbGwgdW5kZXJncmFkdWF0ZSBzdHVkZW50cyBpbiB0aGF0IGNvdW50cnkgaGFkIFR5cGUgQSBwZXJzb25hbGl0aWVzLiBBIHJlY2VudCBzdXJ2ZXkgYXQgdGhlIFVuaXZlcnNpdHkgb2YgTm9ydGggR2VvcmdpYSBzaG93ZWQgYSBzYW1wbGUgb2YgMTU1IE5vcnRoIEdlb3JnaWEgc3R1ZGVudHMgY29udGFpbmVkIDIyIHN0dWRlbnRzIHdpdGggVHlwZSBBIHBlcnNvbmFsaXRpZXMuIElzIHRoZXJlIGV2aWRlbmNlIGF0IHRoZSAwLjA1IGxldmVsIHRoYXQgYSBoaWdoZXIgcHJvcG9ydGlvbiBvZiBzdHVkZW50cyBhdCBVTkcgaGF2ZSBUeXBlIEEgcGVyc29uYWxpdGllcz8NCg0KRm9yIHRoaXMgMS1wcm9wb3J0aW9uICR6JC10ZXN0LCBvdXIgaHlwb3RoZXNlcyBhcmU6DQokJEhfMCA6IFx0ZXh0e3Byb3B9ID0gLjExXFxIX2EgOiBcdGV4dHtwcm9wfSA+IC4xMSQkDQpUaGUgZGF0YSBwYXNzIHZlcmlmaWNhdGlvbiBhcyAkbnBfMCA9IDE1NSguMTEpID0gYHIgcGFzdGUoMTU1Ki4xMSlgXGdlcSAxMCQsIGFuZCBjbGVhcmx5ICRuKDEtcF8wKSQgaXMgZXZlbiBsYXJnZXIuIFRvIHJ1biB0aGUgdGVzdCwgd2UgY2FuIHNwZWNpZnkgJHgsbixwXzAkIGFzIHBhcmFtZXRlcnMgYWxvbmcgd2l0aCB0aGUgYWx0ZXJuYXRpdmUgaHlwb3RoZXNpcy4gTm90ZSB0aGF0IHdlIGNhbiB0eXBlIG91dCB0aGUgd2hvbGUgd29yZCAiZ3JlYXRlciIgaW4gdGhlIGFsdGVybmF0aXZlIGh5cG90aGVzaXMgcGFyYW1ldGVyLCBvciB3ZSBjYW4gYWJicmV2aWF0ZSBpdCBpcyAiZy4iIFdlIGNhbiBhbHNvIGFiYnJldmlhdGUgVFJVRSBhbmQgRkFMU0UgYXMgc2hvd24uDQoNCmBgYHtyfQ0KcHJvcC50ZXN0KCB4ID0gMjIgLCBuID0gMTU1ICwgcCA9IC4xMSAsIA0KICAgICAgICAgICBhbHRlcm5hdGl2ZSA9ICJnIiAsDQogICAgICAgICAgIGNvcnJlY3QgPSBGKQ0KYGBgDQpXZSBmYWlsIHRvIHJlamVjdCB0aGUgbnVsbCBhbmQgaGF2ZSBubyBldmlkZW5jZSBhdCB0aGUgMC4wNSBsZXZlbCB0aGF0IHRoZSBUeXBlIEEgcGVyc29uYWxpdHkgcmF0ZXMgYXJlIHNpZ25pZmljYW50bHkgaGlnaGVyIChvciBkaWZmZXJlbnQpIGF0IE5vcnRoIEdlb3JnaWEgdGhhbiBhdCB1bml2ZXJzaXRpZXMgaW4gUGFraXN0YW4uDQoNCiMjIyMgRXhhbXBsZTogMi1Qcm9wb3J0aW9uICR6JC10ZXN0DQoNCkFyZSB5b3VuZyBtZW4gbW9yZSBsaWtlbHkgdG8gZXhwZXJpZW5jZSBBREQvQURIRCBzeW1wdG9tcyB0aGFuIHlvdW5nIHdvbWVuPyBBIHJlY2VudCBzdXJ2ZXkgZm91bmQgMjIgb2YgNzggZmVtYWxlcyBoYWQgZXhwZXJpZW5jZWQgc2lnbmlmaWNhbnQgQUREL0FESEQgc3ltcHRvbXMgd2hpbGUgMTIgb2YgNDAgbWFsZXMgaGFkIGV4cGVyaWVuY2VkIHRoZW0uIFRlc3QgZm9yIGEgZGlmZmVyZW5jZSBhdCB0aGUgLjEgbGV2ZWwuDQoNCkZvciB0aGlzIDEtcHJvcG9ydGlvbiAkeiQtdGVzdCwgb3VyIGh5cG90aGVzZXMgYXJlOg0KJCRIXzAgOiBwX0YgPSBwX01cXEhfYSA6IHBfRiA8IHBfTSQkDQpUaGUgZGF0YSBwYXNzIHZlcmlmaWNhdGlvbiBiZWNhdXNlIHRoZSBudW1iZXIgb2Ygc3VjY2Vzc2VzIGFyZSAyMiBhbmQgMTIgaW4gdGhlIGZlbWFsZSBhbmQgbWFsZSBzYW1wbGVzIHJlc3BlY3RpdmVseSwgYW5kIGJvdGggc2FtcGxlcyBoYXZlIG1vcmUgZmFpbHVyZXMgdGhhbiBzdWNjZXNzZXMuIFRodXMsIHRoZSBudW1iZXIgb2Ygc3VjY2Vzc2VzIGFuZCBmYWlsdXJlcyBpbiBib3RoIHNhbXBsZXMgaXMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIDEwLCBhcyByZXF1aXJlZC4NCg0KV2UgdXNlIGNvbmNhdGVuYXRlIGZ1bmN0aW9uICoqYyoqIHRvIHByb3ZpZGUgdGhlIG51bWVyYXRvciBhbmQgZGVub21pbmF0b3Igb2YgdHdvIGRpZmZlcmVudCAkXGhhdCBwJCBmcmFjdGlvbnMsIG9uZSBmb3IgZmVtYWxlcyBhbmQgb25lIGZvciBtYWxlcy4NCg0KYGBge3J9DQpwcm9wLnRlc3QoIHggPSBjKDIyLDEyKSwgbiA9IGMoNzgsNDApLCANCiAgICAgICAgICAgYWx0ZXJuYXRpdmUgPSAibGVzcyIsDQogICAgICAgICAgIGNvcnJlY3QgPSBGQUxTRSkNCmBgYA0KV2UgZmFpbCB0byByZWplY3QgdGhlIG51bGwgYW5kIGhhdmUgbm8gZXZpZGVuY2UgZm9yIGEgZGlmZmVyZW50IHJhdGUgb2YgQUREL0FESEQgc3ltcHRvbXMgYmFzZWQgb24gYmlvbG9naWNhbCBzZXguDQoNCiMjIyMgRXhhbXBsZTogJFxjaGleMiQgVGVzdCBvZiBJbmRlcGVuZGVuY2UNCkRvZXMgbGV2ZWwgb2Ygc21va2luZyBhZmZlY3QgbGV2ZWwgb2YgZXhlcmNpc2U/IFRlc3QgYXQgdGhlIDAuMDUgbGV2ZWwuIFRoZSBzbW9rZXJzIHdlcmUgY2F0ZWdvcml6ZWQgYXMgaGVhdnkgc21va2Vycywgb2NjYXNpb25hbCBzbW9rZXJzIG9yIGhhZCBuZXZlciBzbW9rZWQuIFRoZXkgd2VyZSBhbHNvIGNhdGVnb3JpemVkIGFjY29yZGluZyB0byBsZXZlbCBvZiBleGVyY2lzZTogZnJlcXVlbnQsIHNvbWUsIGFuZCBub25lLg0KDQoqKkZyZXF1ZW5jeSBvZiBFeGVyY2lzZSB2cy4gU21va2luZyBMZXZlbCoqDQokJFxiZWdpbnthcnJheX17bHxjY2N9Jlx0ZXh0YmZ7RnJlcXVlbnR9ICZcdGV4dGJme1NvbWV9ICYgXHRleHRiZntOb25lfVxcIFxobGluZQ0KXHRleHRiZntIZWF2eX0gJiA3ICAmIDMgJiAxXFwNClx0ZXh0YmZ7T2NjYXNpb25hbH0gJiAyMSAmIDExICYgNFxcDQpcdGV4dGJme05ldmVyfSAmIDg3ICYgODQgJiAxOFxcDQpcZW5ke2FycmF5fSQkDQoNCldlIG5lZWQgdG8gY3JlYXRlIHRoZSBvYnNlcnZlZCBtYXRyaXggd2hpY2ggSSB3aWxsIGNhbGwgKip0YWIqKi4gV2UgY2FuIHRoZW4gcnVuIHRoZSBDaGktc3F1YXJlZCB0ZXN0Lg0KDQpgYGB7cn0NCnRhYiA9IChtYXRyaXgoYyg3LCAzLCAxLCAyMSwgMTEsIDQsIDg3ICwgODQgLCAxOCksbnJvdz0zKSkNCnhjaGlzcS50ZXN0KHRhYikNCmBgYA0KTm90ZSB0aGF0IHRocmVlIG9mIHRoZSBuaW5lIGV4cGVjdGVkIGNlbGxzIGFyZSBsZXNzIHRoYW4gNSwgc28gdGhlIGRhdGEgYXJlICpub3QqIGFwcHJvcHJpYXRlIGZvciBDaGktU3F1YXJlZCBwcm9jZWR1cmVzIHNpbmNlIDMzJSBvZiB0aGUgZXhwZWN0ZWQgY2VsbHMgaGF2ZSBsb3cgY2VsbCBjb3VudHMuIFdlIGNhbm5vdCB1c2UgdGhlc2UgZGF0YSBmb3IgQ2hpLVNxdWFyZWQgLS0gZG8gbm90IHByb2NlZWQuDQoNCkhvd2V2ZXIsIHdlIGNhbiBzdGlsbCBpbGx1c3RyYXRlIGhvdyB0byBjcmVhdGUgYSBtb3NhaWMgcGxvdCBmcm9tIHN1bW1hcnkgc3RhdGlzdGljcy5JIGFtIGFsc28gY3JlYXRpbmcgY29sdW1uIG5hbWVzIGFuZCByb3cgbmFtZXMgc28gdGhlIE1vc2FpYyBwbG90IGlzIGVhc2llciB0byBpbnRlcnByZXQuDQoNCmBgYHtyfQ0KY29sbmFtZXModGFiKSA9IGMoIkZyZXF1ZW50IiwiU29tZSIsIk5vbmUiKQ0Kcm93bmFtZXModGFiKSA9IGMoIkhlYXZ5IiwiT2NjYXNpb25hbCIsIk5ldmVyIikNCm1vc2FpY3Bsb3QodGFiKQ0KYGBgDQoNCg0KDQojIyMjIDxzcGFuIHN0eWxlPSJjb2xvcjogcmVkOyI+U3BlY2lhbCBOb3RlOiBGb3IgdGVzdHMsIHF1aXp6ZXMgYW5kIHByb2plY3RzIGluIHRoaXMgY291cnNlLCB3ZSB3aWxsICoqbm90KiogYmUgYmUgdXNpbmcgdGhlIEFncmVzdGkgUGx1cyA0IE1ldGhvZCwgbm9yIHdpbGwgdXNlIHRoZSBZYXRlcyBjb3JyZWN0aW9uIGZvciAkXGNoaV4yJCBvciB0aGUgY29udGludWl0eSBjb3JyZWN0aW9uIGluIHRoZSAqKnByb3AudGVzdCoqLjwvc3Bhbj4NCg0KIyA8c3BhbiBzdHlsZT0iY29sb3I6IGJsdWU7Ij5WSUkuIEV4ZXJjaXNlczwvc3Bhbj4NCg0KMS4gVXNpbmcgdGhlICoqU2l0Q2xhc3MqKiB2YXJpYWJsZSBmcm9tIHRoZSAqKkRhdGEzMzUwKiogZGF0YSBmcmFtZSwgdGVzdCB0aGUgaHlwb3RoZXNpcyB0aGF0IGNsYXNzcm9vbSBzZWF0aW5nIHByZWZlcmVuY2UgZGVwZW5kcyB1cG9uIG1lbWJlcnNoaXAgaW4gdGhlIGNvcnBzIG9mIGNhZGV0cyAodmFyaWFibGUgKipDb3JwcyoqKSBhdCB0aGUgJFxhbHBoYSA9IDAuMDUkIGxldmVsLiBJbmNsdWRlIGEgTW9zYWljIHBsb3QgYW5kIGRlc2NyaWJlIGl0J3MgcmVsYXRpb25zaGlwIHRvIHlvdXIgJHAkLXZhbHVlIGFuZCBjb25jbHVzaW9ucy4NCg0KMi4gVXNpbmcgdGhlICoqU2l0Q2xhc3MqKiB2YXJpYWJsZSBmcm9tIHRoZSAqKkRhdGEzMzUwKiogZGF0YSBmcmFtZSwgdGVzdCB0aGUgaHlwb3RoZXNpcyB0aGF0IGNsYXNzcm9vbSBzZWF0aW5nIHByZWZlcmVuY2UgZGVwZW5kcyB1cG9uIGJpb2xvZ2ljYWwgKipTZXgqKiBhdCB0aGUgJFxhbHBoYSA9IDAuMDUkIGxldmVsLiBJbmNsdWRlIGEgTW9zYWljIHBsb3QgYW5kIGRlc2NyaWJlIGl0J3MgcmVsYXRpb25zaGlwIHRvIHlvdXIgJHAkLXZhbHVlIGFuZCBjb25jbHVzaW9ucy4NCg0KMy4gVXNpbmcgdGhlICoqQWNjRGF0ZSoqIHZhcmlhYmxlIGZyb20gdGhlICoqRGF0YTMzNTAqKiBkYXRhIGZyYW1lLCB0ZXN0IHRoZSBoeXBvdGhlc2lzIHRoYXQgdGhlIFllcyByZXNwb25zZXMgdG8gdGhlIGRhdGluZyBxdWVzdGlvbiBhcmUgbW9yZSBsaWtlbHkgZm9yIHRob3NlIGluIHNvY2lhbCAqKkdyZWVrKiogZnJhdGVybml0aWVzIGFuZCBzb3Jvcml0aWVzIGF0IHRoZSAkXGFscGhhID0gMC4xJCBsZXZlbC4gSW5jbHVkZSBhIE1vc2FpYyBwbG90IHdpdGggYSBkZXNjcmlwdGlvbiBhYm91dCBpdCdzIHJlbGF0aW9uc2hpcCB0byB5b3VyICRwJC12YWx1ZSBhbmQgY29uY2x1c2lvbnMuDQoNCjQuIEEgc3Ryb25nIHNlbnNlIG9mIENvcGluZyBIdW1vciBpbmRpY2F0ZXMgYSBwZXJzb24gd2hvIHVzZXMgaHVtb3IgdG8gcmVsaWV2ZSBzdHJlc3MgYW5kIGRlYWwgd2l0aCB0aGUgc3RydWdnbGVzIG9mIGxpZmUuIFRlc3QgYXQgdGhlIC4wNSBsZXZlbCB3aGV0aGVyIG1vcmUgdGhhbiAxMCUgb2YgTm9ydGggR2VvcmdpYSBzdHVkZW50cyBleGhpYml0IHN0cm9uZyBDb3BpbmcgSHVtb3IuIEEgcmVjZW50IHN0dWR5IHVzZWQgYSBjcml0ZXJpYSBvZiBzY29yaW5nIDMwIG9yIGhpZ2hlciBvbiB0aGUgQ29waW5nIEh1bW9yIFNjYWxlIHRvIGV2YWx1YXRlIHRoaXMgY3JpdGVyaWEsIGFuZCBmb3VuZCB0aGF0IDIxIG9mIDE3NSBOb3J0aCBHZW9yZ2lhIHN0dWRlbnRzIGRpZCBzby4gDQoNCjUuIEEgcmVjZW50IHN0dWR5IGFza2VkIFVORyBzdHVkZW50cyB3aGV0aGVyIHRoZXkgZnJlcXVlbnRseSB0ZXh0ZWQgYXQgd29yayBhYm91dCB0aGluZ3MgdW5yZWxhdGVkIHRvIHdvcmsuIEZvciB5b3VuZ2VyIHN0dWRlbnRzLCAyNSBvZiAxMDMgc2FpZCB0aGV5IGZyZXF1ZW50bHkgZGlkIHNvIHdoaWxlIDE1IG9mIDQ2IHN0dWRlbnRzIHdobyAyMSBvciBvbGRlciByZXBvcnRlZCBkb2luZyBzby4gVGVzdCBmb3IgYW4gYWdlLWRpZmZlcmVuY2UgZm9yIFRleHRpbmcgRnJlcXVlbnRseSBhdCBXb3JrIGF0IHRoZSAuMDUgbGV2ZWwuDQoNCg0KDQoNCg==