## start by coding in given values from instructions
  # DISCLAIMER: I am assuming there is a typo in the opening paragraph of the assignment. I am setting sample size to 50, not 5.
n = 50

# old_drug = what's currently on market
old_drug_xbar = 25 #mg/dl
old_drug_sd = 15 #mg/dl

# new_drug = CholestFix
new_drug_xbar = 29 #mg/dl
new_drug_sd = 15 #mg/dl

Intro and Setup

For today’s analysis we have been contacted by a pharmaceutical company who has developed a drug they are calling CholestFix, whose goal is to reduce LDL cholesterol. While we were not provided access to the dataset itself, we were still given enough valuable information to assess how effective CholestFix is in comparison to the current LDL-fighting drugs on the marketplace (what we will refer to as market-standard).

The market-standard sees an average LDL reduction of 25 mg/dL with a standard deviation of 15 mg/dL. However, the three-month study conducted by our pharma company, with a sample size of 50 patients, showed a mean LDL reduction in patients who took CholestFix of 29 mg/dL. The standard deviation for subjects given CholestFix was also 15 mg/dL though.

a.) Initial Hypothesis Test

Given this available information, the first step I performed was a one-sample t-test. This hypothesis test is relevant as we are comparing the mean of one test sample (the 50 patients who took CholestFix) to the mean of a more general or broadly accepted population parameter (the market-standard pharmaceutical option).

Technically speaking, calculations were performed via a custom-built R function and conducted with a confidence level of 95%. I chose to set \(\alpha\) = to 0.05 as that is generally considered industry standard. Results are below.

# will use a one-sample t test
  # only have one sample, the old_drug stats are the population (or baseline) for which we are comparing too

# need sample data to use R's t.test function, we don't have sample data so will be doing manual calculation
  # t value formula from Sec 3.1 step 3
alpha = 0.05


one_sample_t_no_data = function(n, xbar, pop_mean, pop_sd, alpha, tail_option){
  df = n - 1
  numerator = xbar - pop_mean
  denominator = pop_sd/sqrt(n)
  t = numerator/denominator
 #### now we have t value
  
  crit_value = qt(p = alpha, df = df, lower.tail = tail_option)
    # using quantile function with t distribution to get critical value
  results = rbind(t, crit_value)
  
  return(results)
}
help(qt)

t_test = one_sample_t_no_data(n = n, 
                     xbar = new_drug_xbar, 
                     pop_mean = old_drug_xbar,
                     pop_sd = old_drug_sd,
                     alpha = alpha,
                     tail_option = FALSE)
                      # tail option is FALSE as we are testing the "researchers' belief", which is specifically that new drug's mean is MORE than the current standard

rownames(t_test) = c("T Value", "Critical Value")
colnames(t_test) = NULL

kable(round(t_test,4),align = "c",
      caption = "<span style='color:##000000;'>
      T-Test Results </span>") %>%
  kable_styling(
    bootstrap_options = c("striped", "bordered"),
    full_width = FALSE,
    position = "center")
T-Test Results
T Value 1.8856
Critical Value 1.6766

Looking at our test output, we are lead to believe that there is significant reason to believe that CholestFix does reduce LDL cholesterol, and does so to a more effective degree than the current market-standard. Using a T distribution, our sample data’s standardized value is about 0.209 units greater than that of the market-standard. In other words, we reject the null hypothesis in this instance.

b.) Power Analysis (Current Conditions)

Now knowing that there appears to be statistical significance to our sample data’s greater reduction in LDL cholesterol, we assess the power of our findings. Statistical power can be defined as the probability of rejecting the null hypothesis (or default assumption) IF the alternative is actually true. To use criminal justice analogously, power is essentially the probability of convicting someone on trial who truly did commit the crime they are accused of. Power is bounded between (0 and 100)%, and generally it is the goal of a researcher to achieve power of at least 80%.

## reference section 6.5

effect_size = 4
# "probability we'd detect a true improvement" = Power

power_test = power.t.test(n = n,
             delta = effect_size,
              # delta argument within the function is the "true difference in means" which we belive to be 4
             sd = old_drug_sd,
             # sd argument is for the assumed POPULATION/baseline standard deviation
             sig.level = alpha,
             type ="one.sample",
             alternative = "one.sided"
             )

partb_power = power_test$power # = 0.5849737

There are numerous factors that go into the calculation of power, including what type of statistical test we are running, our sample size, sample statistics, population parameters and such. As previously noted, we have a sample size of 50, a population standard deviation of 15 mg/dL and are operating with a Type I error rate (\(\alpha\)) of 0.05. Additionally, the effect size of our experiment (often denoted as \(\delta\)) is equal to 4 as that is the difference between our sample mean of LDL reduction and what is market-standard.

Given these conditions, I used R’s power.t.test() function to calculate the power of this specific analysis (ie the probability that we would detect an improvement in LDL reduction if one genuinely existed). Unfortunately, our current power is only about 58.5%, a far cry from the 80% that is generally desired.

In the future, if our pharmaceutical partners wanted to conduct a similar experiment with a greater degree of power, they could achieve such by garnering a larger sample size and/or operating under a more liberal confidence level. In other words, sample size and power are positively correlated while confidence and power are inversely related.

c.) Sample Size Determination

As mentioned above, power, sample size, confidence and effect size are all interdependent. Below, I once again use R’s power.t.test() function, this time from the perspective of searching for a necessary sample size.

partc_power = 0.8

# same function as part b, this time replace input for n argument with input for power argument
sample_size_test = power.t.test(power = partc_power,
                                delta = effect_size,
                                sd = old_drug_sd,
                                sig.level = alpha,
                                type ="one.sample",
                                alternative = "one.sided"
                                )

desired_n = sample_size_test$n

In a theoretical future study of CholestFix, if we were to maintain a confidence level of 95% (ie \(\alpha\) = 0.05), still have our sample data show us an effect size of 4, a sample mean of 29 and a sample standard deviation of 15 we would need a sample size of at least 89 subjects.

Per our calculations, the required sample size is technically about 88.31, however we can obviously not have a proportion of an individual person participate in our study. In minimum-based calculations like these, we must always round up despite conventional mathematics rounding a value like this one down.

d.) Power Analysis W/ Theoretical Sample Sizes

To further analyze the relationship between sample size and power of experiment, I used a custom function in R to generate the power of a one-sample t-test (with the same characteristics of the experiment that our pharmaceutical partner previously did) with sample sizes iterating by 1, starting from 50 and ending at 200. A resulting plot of this data is below.

# let variable x denote the different sample sizes that we are testing for power results
x = seq(from = 50, to = 200, by = 1)

# START CUSTOM FUNCTION
find_power = function(x, effect_size, pop_sd, alpha, test_type, alt){
  power_results = numeric(length(x))
  
  # START FOR LOOP
  for (i in min(x):max(x)){
    power_sample = power.t.test(n = x,
             delta = effect_size,
             sd = pop_sd,
             sig.level = alpha,
             type = test_type,
             alternative = alt
             )
    
    ## will put results in data frame format for easier analysis
    power_results_n = cbind(power_sample$n)
    power_results_power = cbind(power_sample$power)
    results = cbind(power_results_n, power_results_power)
    colnames(results) = c("n", "power")
    
  } # END FOR LOOP
  
  return(results)
} # END CUSTOM FUNCTION

power_curve_data = find_power(x = x,
           effect_size = effect_size,
           pop_sd = old_drug_sd,
           alpha = alpha,
           test_type = "one.sample",
           alt = "one.sided")

power_curve_data = data.frame(power_curve_data)

lin_model = lm(power_curve_data$power ~ power_curve_data$n)

ggplot(data = power_curve_data) +
  geom_point(mapping = aes(x = n, y = power)) + 
  geom_hline(yintercept = 0.8, 
             color = "red", 
             linewidth = 1) + 
    # using geom_hline to point out the threshold between values that do and don't achieve ideal power
  
  geom_hline(yintercept = 0.9, 
             color = "blue", 
             linewidth = 1) + 
  labs(title = "Sample Size and Power Relationship",
       x = "Sample Size (n)",
       y = "Power (0 - 1 Scale)") 

As we can see, the benchmark threshold of 80% power is crossed once our sample size reaches just below 90 subjects. If we are to hold ourselves to an even stricter standard and attempt to achieve 90% power, while holding all other elements of our experiment (like confidence level for example) constant, then we would need at least 122 subjects to participate.

LS0tCnRpdGxlOiAiSHlwb3RoZXNpcyBUZXN0aW5nIGFuZCBQb3N0LUFuYWx5c2lzIFcvIFQtVGVzdCIKYXV0aG9yOiAiQ2hyaXMgQmFobSIKZGF0ZTogIkFwcmlsIDQsIDIwMjYiCm91dHB1dDoKICBodG1sX2RvY3VtZW50OgogICAgdG9jOiB0cnVlCiAgICB0b2NfZmxvYXQ6CiAgICAgIGNvbGxhcHNlZDogdHJ1ZQogICAgICBzbW9vdGhfc2Nyb2xsOiB0cnVlCiAgICB0b2NfZGVwdGg6IDQKICAgIGZpZ193aWR0aDogNgogICAgZmlnX2hlaWdodDogNAogICAgZmlnX2NhcHRpb246IHRydWUKICAgIG51bWJlcl9zZWN0aW9uczogZmFsc2UKICAgIGNvZGVfZm9sZGluZzogaGlkZQogICAgY29kZV9kb3dubG9hZDogdHJ1ZQogICAgdGhlbWU6IGx1bWVuCiAgICBoaWdobGlnaHQ6IHRhbmdvCiAgcGRmX2RvY3VtZW50OgogICAgdG9jOiB0cnVlCiAgICB0b2NfZGVwdGg6IDQKICAgIGZpZ19jYXB0aW9uOiB0cnVlCiAgICBudW1iZXJfc2VjdGlvbnM6IHRydWUKICB3b3JkX2RvY3VtZW50OgogICAgdG9jOiB0cnVlCiAgICB0b2NfZGVwdGg6IDQKLS0tCgpgYGB7Y3NzLCBlY2hvID0gRkFMU0V9CmRpdiNUT0MgbGkgeyAgICAgLyogdGFibGUgb2YgY29udGVudCAgKi8KICAgIGxpc3Qtc3R5bGU6dXBwZXItcm9tYW47CiAgICBiYWNrZ3JvdW5kLWltYWdlOm5vbmU7CiAgICBiYWNrZ3JvdW5kLXJlcGVhdDpub25lOwogICAgYmFja2dyb3VuZC1wb3NpdGlvbjowOwp9CgpoMS50aXRsZSB7ICAgIC8qIGxldmVsIDEgaGVhZGVyIG9mIHRpdGxlICAqLwogIGZvbnQtc2l6ZTogMjRweDsKICBmb250LXdlaWdodDogYm9sZDsKICBjb2xvcjogRGFya1JlZDsKICB0ZXh0LWFsaWduOiBjZW50ZXI7Cn0KCmg0LmF1dGhvciB7IC8qIEhlYWRlciA0IC0gYW5kIHRoZSBhdXRob3IgYW5kIGRhdGEgaGVhZGVycyB1c2UgdGhpcyB0b28gICovCiAgZm9udC1zaXplOiAxOHB4OwogIGZvbnQtd2VpZ2h0OiBib2xkOwogIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOwogIGNvbG9yOiBEYXJrUmVkOwogIHRleHQtYWxpZ246IGNlbnRlcjsKfQoKaDQuZGF0ZSB7IC8qIEhlYWRlciA0IC0gYW5kIHRoZSBhdXRob3IgYW5kIGRhdGEgaGVhZGVycyB1c2UgdGhpcyB0b28gICovCiAgZm9udC1zaXplOiAxOHB4OwogIGZvbnQtd2VpZ2h0OiBib2xkOwogIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOwogIGNvbG9yOiBEYXJrQmx1ZTsKICB0ZXh0LWFsaWduOiBjZW50ZXI7Cn0KCmgxIHsgLyogSGVhZGVyIDEgLSBhbmQgdGhlIGF1dGhvciBhbmQgZGF0YSBoZWFkZXJzIHVzZSB0aGlzIHRvbyAgKi8KICAgIGZvbnQtc2l6ZTogMjBweDsKICAgIGZvbnQtd2VpZ2h0OiBib2xkOwogICAgZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iLCBUaW1lcywgc2VyaWY7CiAgICBjb2xvcjogZGFya3JlZDsKICAgIHRleHQtYWxpZ246IGNlbnRlcjsKfQoKaDIgeyAvKiBIZWFkZXIgMiAtIGFuZCB0aGUgYXV0aG9yIGFuZCBkYXRhIGhlYWRlcnMgdXNlIHRoaXMgdG9vICAqLwogICAgZm9udC1zaXplOiAxOHB4OwogICAgZm9udC13ZWlnaHQ6IGJvbGQ7CiAgICBmb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiIsIFRpbWVzLCBzZXJpZjsKICAgIGNvbG9yOiBuYXZ5OwogICAgdGV4dC1hbGlnbjogbGVmdDsKfQoKaDMgeyAvKiBIZWFkZXIgMyAtIGFuZCB0aGUgYXV0aG9yIGFuZCBkYXRhIGhlYWRlcnMgdXNlIHRoaXMgdG9vICAqLwogICAgZm9udC1zaXplOiAxNnB4OwogICAgZm9udC13ZWlnaHQ6IGJvbGQ7CiAgICBmb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiIsIFRpbWVzLCBzZXJpZjsKICAgIGNvbG9yOiBuYXZ5OwogICAgdGV4dC1hbGlnbjogbGVmdDsKfQoKaDQgeyAvKiBIZWFkZXIgNCAtIGFuZCB0aGUgYXV0aG9yIGFuZCBkYXRhIGhlYWRlcnMgdXNlIHRoaXMgdG9vICAqLwogICAgZm9udC1zaXplOiAxNHB4OwogIGZvbnQtd2VpZ2h0OiBib2xkOwogICAgZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iLCBUaW1lcywgc2VyaWY7CiAgICBjb2xvcjogZGFya3JlZDsKICAgIHRleHQtYWxpZ246IGxlZnQ7Cn0KCi8qIEFkZCBkb3RzIGFmdGVyIG51bWJlcmVkIGhlYWRlcnMgKi8KLmhlYWRlci1zZWN0aW9uLW51bWJlcjo6YWZ0ZXIgewogIGNvbnRlbnQ6ICIuIjsKfQpgYGAKCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQojIGNvZGUgY2h1bmsgc3BlY2lmaWVzIHdoZXRoZXIgdGhlIFIgY29kZSwgd2FybmluZ3MsIGFuZCBvdXRwdXQgCiMgd2lsbCBiZSBpbmNsdWRlZCBpbiB0aGUgb3V0cHV0IGZpbGVzLgoKaWYgKCFyZXF1aXJlKCJrbml0ciIpKSB7ICAgICAgICAgICAgICAgICAgICAgICMgdXNlIGNvbmRpdGlvbmFsIHN0YXRlbWVudCB0byBkZXRlY3QKICAgaW5zdGFsbC5wYWNrYWdlcygia25pdHIiKSAgICAgICAgICAgICAgICAgICMgd2hldGhlciBhIHBhY2thZ2Ugd2FzIGluc3RhbGxlZCBpbgogICBsaWJyYXJ5KGtuaXRyKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyB5b3VyIG1hY2hpbmUuIElmIG5vdCwgaW5zdGFsbCBpdCBhbmQKfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgbG9hZCBpdCB0byB0aGUgd29ya2luZyBkaXJlY3RvcnkuCgppZiAoIXJlcXVpcmUodGlkeXZlcnNlKSkge2xpYnJhcnkodGlkeXZzZXJzZSl9IAoKaWYgKCFyZXF1aXJlKEdHYWxseSkpIHtsaWJyYXJ5KEdHYWxseSl9IAoKaWYgKCFyZXF1aXJlKGthYmxlRXh0cmEpKSB7bGlicmFyeShrYWJsZUV4dHJhKX0gCgppZiAoIXJlcXVpcmUoZ2dwbG90MikpIHtsaWJyYXJ5KGdncGxvdDIpfSAKCmlmICghcmVxdWlyZShjYXIpKSB7bGlicmFyeShjYXIpfSAKCmlmICghcmVxdWlyZShkcGx5cikpIHtsaWJyYXJ5KGRwbHlyKX0gCgppZiAoIXJlcXVpcmUocGFuZGVyKSkge2xpYnJhcnkocGFuZGVyKX0gCgppZiAoIXJlcXVpcmUoZm9yZWNhc3QpKSB7bGlicmFyeShmb3JlY2FzdCl9IAoKaWYgKCFyZXF1aXJlKGx1YnJpZGF0ZSkpIHtsaWJyYXJ5KGx1YnJpZGF0ZSl9IAoKaWYgKCFyZXF1aXJlKCJzY2FsZXMiKSkgewppbnN0YWxsLnBhY2thZ2VzKCJzY2FsZXMiKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKbGlicmFyeSgic2NhbGVzIikgCn0KCmtuaXRyOjpvcHRzX2NodW5rJHNldCgKCWVjaG8gPSBUUlVFLAoJbWVzc2FnZSA9IEZBTFNFLAoJd2FybmluZyA9IEZBTFNFLAoJY29tbWVudCA9IE5BLAoJcmVzdWx0cyA9IFRSVUUsCglmaWcuYWxpZ24gPSAiY2VudGVyIgopCmBgYAoKYGBge3J9CiMjIHN0YXJ0IGJ5IGNvZGluZyBpbiBnaXZlbiB2YWx1ZXMgZnJvbSBpbnN0cnVjdGlvbnMKICAjIERJU0NMQUlNRVI6IEkgYW0gYXNzdW1pbmcgdGhlcmUgaXMgYSB0eXBvIGluIHRoZSBvcGVuaW5nIHBhcmFncmFwaCBvZiB0aGUgYXNzaWdubWVudC4gSSBhbSBzZXR0aW5nIHNhbXBsZSBzaXplIHRvIDUwLCBub3QgNS4KbiA9IDUwCgojIG9sZF9kcnVnID0gd2hhdCdzIGN1cnJlbnRseSBvbiBtYXJrZXQKb2xkX2RydWdfeGJhciA9IDI1ICNtZy9kbApvbGRfZHJ1Z19zZCA9IDE1ICNtZy9kbAoKIyBuZXdfZHJ1ZyA9IENob2xlc3RGaXgKbmV3X2RydWdfeGJhciA9IDI5ICNtZy9kbApuZXdfZHJ1Z19zZCA9IDE1ICNtZy9kbApgYGAKCiMgSW50cm8gYW5kIFNldHVwCkZvciB0b2RheSdzIGFuYWx5c2lzIHdlIGhhdmUgYmVlbiBjb250YWN0ZWQgYnkgYSBwaGFybWFjZXV0aWNhbCBjb21wYW55IHdobyBoYXMgZGV2ZWxvcGVkIGEgZHJ1ZyB0aGV5IGFyZSBjYWxsaW5nICpDaG9sZXN0Rml4Kiwgd2hvc2UgZ29hbCBpcyB0byByZWR1Y2UgTERMIGNob2xlc3Rlcm9sLiBXaGlsZSB3ZSB3ZXJlIG5vdCBwcm92aWRlZCBhY2Nlc3MgdG8gdGhlIGRhdGFzZXQgaXRzZWxmLCB3ZSB3ZXJlIHN0aWxsIGdpdmVuIGVub3VnaCB2YWx1YWJsZSBpbmZvcm1hdGlvbiB0byBhc3Nlc3MgaG93IGVmZmVjdGl2ZSBDaG9sZXN0Rml4IGlzIGluIGNvbXBhcmlzb24gdG8gdGhlIGN1cnJlbnQgTERMLWZpZ2h0aW5nIGRydWdzIG9uIHRoZSBtYXJrZXRwbGFjZSAod2hhdCB3ZSB3aWxsIHJlZmVyIHRvIGFzIG1hcmtldC1zdGFuZGFyZCkuCgpUaGUgbWFya2V0LXN0YW5kYXJkIHNlZXMgYW4gYXZlcmFnZSBMREwgcmVkdWN0aW9uIG9mIGByIG9sZF9kcnVnX3hiYXJgIG1nL2RMIHdpdGggYSBzdGFuZGFyZCBkZXZpYXRpb24gb2YgYHIgb2xkX2RydWdfc2RgIG1nL2RMLiBIb3dldmVyLCB0aGUgdGhyZWUtbW9udGggc3R1ZHkgY29uZHVjdGVkIGJ5IG91ciBwaGFybWEgY29tcGFueSwgd2l0aCBhIHNhbXBsZSBzaXplIG9mIGByIG5gIHBhdGllbnRzLCBzaG93ZWQgYSBtZWFuIExETCByZWR1Y3Rpb24gaW4gcGF0aWVudHMgd2hvIHRvb2sgQ2hvbGVzdEZpeCBvZiBgciBuZXdfZHJ1Z194YmFyYCBtZy9kTC4gVGhlIHN0YW5kYXJkIGRldmlhdGlvbiBmb3Igc3ViamVjdHMgZ2l2ZW4gQ2hvbGVzdEZpeCB3YXMgYWxzbyBgciBuZXdfZHJ1Z19zZGAgbWcvZEwgdGhvdWdoLgoKIyBhLikgSW5pdGlhbCBIeXBvdGhlc2lzIFRlc3QKR2l2ZW4gdGhpcyBhdmFpbGFibGUgaW5mb3JtYXRpb24sIHRoZSBmaXJzdCBzdGVwIEkgcGVyZm9ybWVkIHdhcyBhIG9uZS1zYW1wbGUgdC10ZXN0LiBUaGlzIGh5cG90aGVzaXMgdGVzdCBpcyByZWxldmFudCBhcyB3ZSBhcmUgY29tcGFyaW5nIHRoZSBtZWFuIG9mIG9uZSB0ZXN0IHNhbXBsZSAodGhlIGByIG5gIHBhdGllbnRzIHdobyB0b29rIENob2xlc3RGaXgpIHRvIHRoZSBtZWFuIG9mIGEgbW9yZSBnZW5lcmFsIG9yIGJyb2FkbHkgYWNjZXB0ZWQgcG9wdWxhdGlvbiBwYXJhbWV0ZXIgKHRoZSBtYXJrZXQtc3RhbmRhcmQgcGhhcm1hY2V1dGljYWwgb3B0aW9uKS4KClRlY2huaWNhbGx5IHNwZWFraW5nLCBjYWxjdWxhdGlvbnMgd2VyZSBwZXJmb3JtZWQgdmlhIGEgY3VzdG9tLWJ1aWx0IFIgZnVuY3Rpb24gYW5kIGNvbmR1Y3RlZCB3aXRoIGEgY29uZmlkZW5jZSBsZXZlbCBvZiA5NSUuIEkgY2hvc2UgdG8gc2V0ICRcYWxwaGEkID0gdG8gMC4wNSBhcyB0aGF0IGlzIGdlbmVyYWxseSBjb25zaWRlcmVkIGluZHVzdHJ5IHN0YW5kYXJkLiBSZXN1bHRzIGFyZSBiZWxvdy4KYGBge3J9CiMgd2lsbCB1c2UgYSBvbmUtc2FtcGxlIHQgdGVzdAogICMgb25seSBoYXZlIG9uZSBzYW1wbGUsIHRoZSBvbGRfZHJ1ZyBzdGF0cyBhcmUgdGhlIHBvcHVsYXRpb24gKG9yIGJhc2VsaW5lKSBmb3Igd2hpY2ggd2UgYXJlIGNvbXBhcmluZyB0b28KCiMgbmVlZCBzYW1wbGUgZGF0YSB0byB1c2UgUidzIHQudGVzdCBmdW5jdGlvbiwgd2UgZG9uJ3QgaGF2ZSBzYW1wbGUgZGF0YSBzbyB3aWxsIGJlIGRvaW5nIG1hbnVhbCBjYWxjdWxhdGlvbgogICMgdCB2YWx1ZSBmb3JtdWxhIGZyb20gU2VjIDMuMSBzdGVwIDMKYWxwaGEgPSAwLjA1CgoKb25lX3NhbXBsZV90X25vX2RhdGEgPSBmdW5jdGlvbihuLCB4YmFyLCBwb3BfbWVhbiwgcG9wX3NkLCBhbHBoYSwgdGFpbF9vcHRpb24pewogIGRmID0gbiAtIDEKICBudW1lcmF0b3IgPSB4YmFyIC0gcG9wX21lYW4KICBkZW5vbWluYXRvciA9IHBvcF9zZC9zcXJ0KG4pCiAgdCA9IG51bWVyYXRvci9kZW5vbWluYXRvcgogIyMjIyBub3cgd2UgaGF2ZSB0IHZhbHVlCiAgCiAgY3JpdF92YWx1ZSA9IHF0KHAgPSBhbHBoYSwgZGYgPSBkZiwgbG93ZXIudGFpbCA9IHRhaWxfb3B0aW9uKQogICAgIyB1c2luZyBxdWFudGlsZSBmdW5jdGlvbiB3aXRoIHQgZGlzdHJpYnV0aW9uIHRvIGdldCBjcml0aWNhbCB2YWx1ZQogIHJlc3VsdHMgPSByYmluZCh0LCBjcml0X3ZhbHVlKQogIAogIHJldHVybihyZXN1bHRzKQp9CmhlbHAocXQpCgp0X3Rlc3QgPSBvbmVfc2FtcGxlX3Rfbm9fZGF0YShuID0gbiwgCiAgICAgICAgICAgICAgICAgICAgIHhiYXIgPSBuZXdfZHJ1Z194YmFyLCAKICAgICAgICAgICAgICAgICAgICAgcG9wX21lYW4gPSBvbGRfZHJ1Z194YmFyLAogICAgICAgICAgICAgICAgICAgICBwb3Bfc2QgPSBvbGRfZHJ1Z19zZCwKICAgICAgICAgICAgICAgICAgICAgYWxwaGEgPSBhbHBoYSwKICAgICAgICAgICAgICAgICAgICAgdGFpbF9vcHRpb24gPSBGQUxTRSkKICAgICAgICAgICAgICAgICAgICAgICMgdGFpbCBvcHRpb24gaXMgRkFMU0UgYXMgd2UgYXJlIHRlc3RpbmcgdGhlICJyZXNlYXJjaGVycycgYmVsaWVmIiwgd2hpY2ggaXMgc3BlY2lmaWNhbGx5IHRoYXQgbmV3IGRydWcncyBtZWFuIGlzIE1PUkUgdGhhbiB0aGUgY3VycmVudCBzdGFuZGFyZAoKcm93bmFtZXModF90ZXN0KSA9IGMoIlQgVmFsdWUiLCAiQ3JpdGljYWwgVmFsdWUiKQpjb2xuYW1lcyh0X3Rlc3QpID0gTlVMTAoKa2FibGUocm91bmQodF90ZXN0LDQpLGFsaWduID0gImMiLAogICAgICBjYXB0aW9uID0gIjxzcGFuIHN0eWxlPSdjb2xvcjojIzAwMDAwMDsnPgogICAgICBULVRlc3QgUmVzdWx0cyA8L3NwYW4+IikgJT4lCiAga2FibGVfc3R5bGluZygKICAgIGJvb3RzdHJhcF9vcHRpb25zID0gYygic3RyaXBlZCIsICJib3JkZXJlZCIpLAogICAgZnVsbF93aWR0aCA9IEZBTFNFLAogICAgcG9zaXRpb24gPSAiY2VudGVyIikKCmBgYAoKTG9va2luZyBhdCBvdXIgdGVzdCBvdXRwdXQsIHdlIGFyZSBsZWFkIHRvIGJlbGlldmUgdGhhdCB0aGVyZSBpcyAqc2lnbmlmaWNhbnQqIHJlYXNvbiB0byBiZWxpZXZlIHRoYXQgQ2hvbGVzdEZpeCBkb2VzIHJlZHVjZSBMREwgY2hvbGVzdGVyb2wsIGFuZCBkb2VzIHNvIHRvIGEgbW9yZSBlZmZlY3RpdmUgZGVncmVlIHRoYW4gdGhlIGN1cnJlbnQgbWFya2V0LXN0YW5kYXJkLiBVc2luZyBhIFQgZGlzdHJpYnV0aW9uLCBvdXIgc2FtcGxlIGRhdGEncyBzdGFuZGFyZGl6ZWQgdmFsdWUgaXMgYWJvdXQgYHIgcm91bmQodF90ZXN0WzFdLDQpIC0gcm91bmQodF90ZXN0WzJdLDQpYCB1bml0cyBncmVhdGVyIHRoYW4gdGhhdCBvZiB0aGUgbWFya2V0LXN0YW5kYXJkLiBJbiBvdGhlciB3b3Jkcywgd2UgKipyZWplY3QqKiB0aGUgbnVsbCBoeXBvdGhlc2lzIGluIHRoaXMgaW5zdGFuY2UuCgpgYGB7ciwgaW5jbHVkZT1GQUxTRX0KCiMjIFRlc3QgdXNpbmcgc2ltdWxhdGVkIGRhdGEgYW5kIGJ1aWx0LWluIFIgZnVuY3Rpb24Kc2V0LnNlZWQoMTIzKQpzaW1fZGF0YSA9IHJub3JtKG4gPSA1MCwgbWVhbiA9IG5ld19kcnVnX3hiYXIsIHNkID0gbmV3X2RydWdfc2QpCnNpbV9kYXRhX3Rlc3QgPSB0LnRlc3Qoc2ltX2RhdGEsIG11ID0gb2xkX2RydWdfeGJhciwgYWx0ZXJuYXRpdmUgPSAiZ3JlYXRlciIpCnNpbV9kYXRhX3Rlc3QKc2ltX2RhdGFfdGVzdCRzdGF0aXN0aWMKICAjIHQgdGVzdCByZXN1bHRzIHZhcnkgV0lMRExZLCB1c2UgYSBib290c3RyYXAKCmJvb3RzdHJhcF9zaW0gPSBmdW5jdGlvbihkYXRhLCBiLCBtdSwgbWV0aG9kKXsKICBuID0gbGVuZ3RoKGRhdGEpCiAgYm9vdHN0cmFwX3RfZXN0aW1hdGVzID0gbnVtZXJpYyhiKQogIAogICMgU1RBUlQgRk9SIExPT1AKICAgIGZvciAoaSBpbiAxOmIpewogICAgICBib290X3NhbXBsZSA9IHNhbXBsZShkYXRhLCBzaXplID0gbiwgcmVwbGFjZSA9IFRSVUUpCiAgICAgIAogICAgICB0X3Rlc3RzID0gdC50ZXN0KGJvb3Rfc2FtcGxlLCBtdSA9IG11LCBhbHRlcm5hdGl2ZSA9IG1ldGhvZCkKICAgICAgYm9vdHN0cmFwX3RfZXN0aW1hdGVzW2ldID0gdF90ZXN0cyRzdGF0aXN0aWMKICAgIH0gIyBFTkQgRk9SIExPT1AKICAKICByZXR1cm4oYm9vdHN0cmFwX3RfZXN0aW1hdGVzKQp9CgpzaW1fZGF0YV90ID0gYm9vdHN0cmFwX3NpbShkYXRhID0gc2ltX2RhdGEsIGIgPSA1MDAsIG11ID0gb2xkX2RydWdfeGJhciwgbWV0aG9kID0gImdyZWF0ZXIiKQoKbWVhbihzaW1fZGF0YV90KQoKYGBgCgojIGIuKSBQb3dlciBBbmFseXNpcyAoQ3VycmVudCBDb25kaXRpb25zKQpOb3cga25vd2luZyB0aGF0IHRoZXJlIGFwcGVhcnMgdG8gYmUgc3RhdGlzdGljYWwgc2lnbmlmaWNhbmNlIHRvIG91ciBzYW1wbGUgZGF0YSdzIGdyZWF0ZXIgcmVkdWN0aW9uIGluIExETCBjaG9sZXN0ZXJvbCwgd2UgYXNzZXNzIHRoZSBwb3dlciBvZiBvdXIgZmluZGluZ3MuIFN0YXRpc3RpY2FsIHBvd2VyIGNhbiBiZSBkZWZpbmVkIGFzIHRoZSBwcm9iYWJpbGl0eSBvZiByZWplY3RpbmcgdGhlIG51bGwgaHlwb3RoZXNpcyAob3IgZGVmYXVsdCBhc3N1bXB0aW9uKSBJRiB0aGUgYWx0ZXJuYXRpdmUgaXMgYWN0dWFsbHkgdHJ1ZS4gVG8gdXNlIGNyaW1pbmFsIGp1c3RpY2UgYW5hbG9nb3VzbHksIHBvd2VyIGlzIGVzc2VudGlhbGx5IHRoZSBwcm9iYWJpbGl0eSBvZiBjb252aWN0aW5nIHNvbWVvbmUgb24gdHJpYWwgd2hvIHRydWx5IGRpZCBjb21taXQgdGhlIGNyaW1lIHRoZXkgYXJlIGFjY3VzZWQgb2YuIFBvd2VyIGlzIGJvdW5kZWQgYmV0d2VlbiAoMCBhbmQgMTAwKSUsIGFuZCBnZW5lcmFsbHkgaXQgaXMgdGhlIGdvYWwgb2YgYSByZXNlYXJjaGVyIHRvIGFjaGlldmUgcG93ZXIgb2YgYXQgbGVhc3QgODAlLiAKCmBgYHtyfQojIyByZWZlcmVuY2Ugc2VjdGlvbiA2LjUKCmVmZmVjdF9zaXplID0gNAojICJwcm9iYWJpbGl0eSB3ZSdkIGRldGVjdCBhIHRydWUgaW1wcm92ZW1lbnQiID0gUG93ZXIKCnBvd2VyX3Rlc3QgPSBwb3dlci50LnRlc3QobiA9IG4sCiAgICAgICAgICAgICBkZWx0YSA9IGVmZmVjdF9zaXplLAogICAgICAgICAgICAgICMgZGVsdGEgYXJndW1lbnQgd2l0aGluIHRoZSBmdW5jdGlvbiBpcyB0aGUgInRydWUgZGlmZmVyZW5jZSBpbiBtZWFucyIgd2hpY2ggd2UgYmVsaXZlIHRvIGJlIDQKICAgICAgICAgICAgIHNkID0gb2xkX2RydWdfc2QsCiAgICAgICAgICAgICAjIHNkIGFyZ3VtZW50IGlzIGZvciB0aGUgYXNzdW1lZCBQT1BVTEFUSU9OL2Jhc2VsaW5lIHN0YW5kYXJkIGRldmlhdGlvbgogICAgICAgICAgICAgc2lnLmxldmVsID0gYWxwaGEsCiAgICAgICAgICAgICB0eXBlID0ib25lLnNhbXBsZSIsCiAgICAgICAgICAgICBhbHRlcm5hdGl2ZSA9ICJvbmUuc2lkZWQiCiAgICAgICAgICAgICApCgpwYXJ0Yl9wb3dlciA9IHBvd2VyX3Rlc3QkcG93ZXIgIyA9IDAuNTg0OTczNwpgYGAKVGhlcmUgYXJlIG51bWVyb3VzIGZhY3RvcnMgdGhhdCBnbyBpbnRvIHRoZSBjYWxjdWxhdGlvbiBvZiBwb3dlciwgaW5jbHVkaW5nIHdoYXQgdHlwZSBvZiBzdGF0aXN0aWNhbCB0ZXN0IHdlIGFyZSBydW5uaW5nLCBvdXIgc2FtcGxlIHNpemUsIHNhbXBsZSBzdGF0aXN0aWNzLCBwb3B1bGF0aW9uIHBhcmFtZXRlcnMgYW5kIHN1Y2guIEFzIHByZXZpb3VzbHkgbm90ZWQsIHdlIGhhdmUgYSBzYW1wbGUgc2l6ZSBvZiBgciBuYCwgYSBwb3B1bGF0aW9uIHN0YW5kYXJkIGRldmlhdGlvbiBvZiBgciBvbGRfZHJ1Z19zZGAgbWcvZEwgYW5kIGFyZSBvcGVyYXRpbmcgd2l0aCBhIFR5cGUgSSBlcnJvciByYXRlICgkXGFscGhhJCkgb2YgYHIgYWxwaGFgLiBBZGRpdGlvbmFsbHksIHRoZSBlZmZlY3Qgc2l6ZSBvZiBvdXIgZXhwZXJpbWVudCAob2Z0ZW4gZGVub3RlZCBhcyAkXGRlbHRhJCkgaXMgZXF1YWwgdG8gYHIgZWZmZWN0X3NpemVgIGFzIHRoYXQgaXMgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBvdXIgc2FtcGxlIG1lYW4gb2YgTERMIHJlZHVjdGlvbiBhbmQgd2hhdCBpcyBtYXJrZXQtc3RhbmRhcmQuCgpHaXZlbiB0aGVzZSBjb25kaXRpb25zLCBJIHVzZWQgUidzIDxzcGFuIHN0eWxlPSJjb2xvcjpibHVlOyI+cG93ZXIudC50ZXN0KCk8L3NwYW4+IGZ1bmN0aW9uIHRvIGNhbGN1bGF0ZSB0aGUgcG93ZXIgb2YgdGhpcyBzcGVjaWZpYyBhbmFseXNpcyAoaWUgdGhlIHByb2JhYmlsaXR5IHRoYXQgd2Ugd291bGQgZGV0ZWN0IGFuIGltcHJvdmVtZW50IGluIExETCByZWR1Y3Rpb24gaWYgb25lIGdlbnVpbmVseSBleGlzdGVkKS4gVW5mb3J0dW5hdGVseSwgb3VyIGN1cnJlbnQgcG93ZXIgaXMgb25seSBhYm91dCAqKmByIHJvdW5kKHBhcnRiX3Bvd2VyLDQpKjEwMGAlKiosIGEgZmFyIGNyeSBmcm9tIHRoZSA4MCUgdGhhdCBpcyBnZW5lcmFsbHkgZGVzaXJlZC4KCkluIHRoZSBmdXR1cmUsIGlmIG91ciBwaGFybWFjZXV0aWNhbCBwYXJ0bmVycyB3YW50ZWQgdG8gY29uZHVjdCBhIHNpbWlsYXIgZXhwZXJpbWVudCB3aXRoIGEgZ3JlYXRlciBkZWdyZWUgb2YgcG93ZXIsIHRoZXkgY291bGQgYWNoaWV2ZSBzdWNoIGJ5IGdhcm5lcmluZyBhIGxhcmdlciBzYW1wbGUgc2l6ZSBhbmQvb3Igb3BlcmF0aW5nIHVuZGVyIGEgbW9yZSBsaWJlcmFsIGNvbmZpZGVuY2UgbGV2ZWwuIEluIG90aGVyIHdvcmRzLCBzYW1wbGUgc2l6ZSBhbmQgcG93ZXIgYXJlIHBvc2l0aXZlbHkgY29ycmVsYXRlZCB3aGlsZSBjb25maWRlbmNlIGFuZCBwb3dlciBhcmUgaW52ZXJzZWx5IHJlbGF0ZWQuCgojIGMuKSBTYW1wbGUgU2l6ZSBEZXRlcm1pbmF0aW9uCkFzIG1lbnRpb25lZCBhYm92ZSwgcG93ZXIsIHNhbXBsZSBzaXplLCBjb25maWRlbmNlIGFuZCBlZmZlY3Qgc2l6ZSBhcmUgYWxsIGludGVyZGVwZW5kZW50LiBCZWxvdywgSSBvbmNlIGFnYWluIHVzZSBSJ3MgPHNwYW4gc3R5bGU9ImNvbG9yOmJsdWU7Ij5wb3dlci50LnRlc3QoKTwvc3Bhbj4gZnVuY3Rpb24sIHRoaXMgdGltZSBmcm9tIHRoZSBwZXJzcGVjdGl2ZSBvZiBzZWFyY2hpbmcgZm9yIGEgbmVjZXNzYXJ5IHNhbXBsZSBzaXplLgoKYGBge3J9CnBhcnRjX3Bvd2VyID0gMC44CgojIHNhbWUgZnVuY3Rpb24gYXMgcGFydCBiLCB0aGlzIHRpbWUgcmVwbGFjZSBpbnB1dCBmb3IgbiBhcmd1bWVudCB3aXRoIGlucHV0IGZvciBwb3dlciBhcmd1bWVudApzYW1wbGVfc2l6ZV90ZXN0ID0gcG93ZXIudC50ZXN0KHBvd2VyID0gcGFydGNfcG93ZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsdGEgPSBlZmZlY3Rfc2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZCA9IG9sZF9kcnVnX3NkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpZy5sZXZlbCA9IGFscGhhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgPSJvbmUuc2FtcGxlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHRlcm5hdGl2ZSA9ICJvbmUuc2lkZWQiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQoKZGVzaXJlZF9uID0gc2FtcGxlX3NpemVfdGVzdCRuCmBgYAoKSW4gYSB0aGVvcmV0aWNhbCBmdXR1cmUgc3R1ZHkgb2YgQ2hvbGVzdEZpeCwgaWYgd2Ugd2VyZSB0byBtYWludGFpbiBhIGNvbmZpZGVuY2UgbGV2ZWwgb2YgOTUlIChpZSAkXGFscGhhJCA9IGByIGFscGhhYCksIHN0aWxsIGhhdmUgb3VyIHNhbXBsZSBkYXRhIHNob3cgdXMgYW4gZWZmZWN0IHNpemUgb2YgYHIgZWZmZWN0X3NpemVgLCBhIHNhbXBsZSBtZWFuIG9mIGByIG5ld19kcnVnX3hiYXJgIGFuZCBhIHNhbXBsZSBzdGFuZGFyZCBkZXZpYXRpb24gb2YgYHIgbmV3X2RydWdfc2RgIHdlIHdvdWxkIG5lZWQgYSBzYW1wbGUgc2l6ZSBvZiBhdCBsZWFzdCAqKjg5IHN1YmplY3RzKiouCgpQZXIgb3VyIGNhbGN1bGF0aW9ucywgdGhlIHJlcXVpcmVkIHNhbXBsZSBzaXplIGlzIHRlY2huaWNhbGx5IGFib3V0IGByIHJvdW5kKGRlc2lyZWRfbiwyKWAsIGhvd2V2ZXIgd2UgY2FuIG9idmlvdXNseSBub3QgaGF2ZSBhIHByb3BvcnRpb24gb2YgYW4gaW5kaXZpZHVhbCBwZXJzb24gcGFydGljaXBhdGUgaW4gb3VyIHN0dWR5LiBJbiBtaW5pbXVtLWJhc2VkIGNhbGN1bGF0aW9ucyBsaWtlIHRoZXNlLCB3ZSBtdXN0IGFsd2F5cyByb3VuZCAqdXAqIGRlc3BpdGUgY29udmVudGlvbmFsIG1hdGhlbWF0aWNzIHJvdW5kaW5nIGEgdmFsdWUgbGlrZSB0aGlzIG9uZSBkb3duLgoKIyBkLikgUG93ZXIgQW5hbHlzaXMgVy8gVGhlb3JldGljYWwgU2FtcGxlIFNpemVzClRvIGZ1cnRoZXIgYW5hbHl6ZSB0aGUgcmVsYXRpb25zaGlwIGJldHdlZW4gc2FtcGxlIHNpemUgYW5kIHBvd2VyIG9mIGV4cGVyaW1lbnQsIEkgdXNlZCBhIGN1c3RvbSBmdW5jdGlvbiBpbiBSIHRvIGdlbmVyYXRlIHRoZSBwb3dlciBvZiBhIG9uZS1zYW1wbGUgdC10ZXN0ICh3aXRoIHRoZSBzYW1lIGNoYXJhY3RlcmlzdGljcyBvZiB0aGUgZXhwZXJpbWVudCB0aGF0IG91ciBwaGFybWFjZXV0aWNhbCBwYXJ0bmVyIHByZXZpb3VzbHkgZGlkKSB3aXRoIHNhbXBsZSBzaXplcyBpdGVyYXRpbmcgYnkgMSwgc3RhcnRpbmcgZnJvbSA1MCBhbmQgZW5kaW5nIGF0IDIwMC4gQSByZXN1bHRpbmcgcGxvdCBvZiB0aGlzIGRhdGEgaXMgYmVsb3cuCgpgYGB7cn0KIyBsZXQgdmFyaWFibGUgeCBkZW5vdGUgdGhlIGRpZmZlcmVudCBzYW1wbGUgc2l6ZXMgdGhhdCB3ZSBhcmUgdGVzdGluZyBmb3IgcG93ZXIgcmVzdWx0cwp4ID0gc2VxKGZyb20gPSA1MCwgdG8gPSAyMDAsIGJ5ID0gMSkKCiMgU1RBUlQgQ1VTVE9NIEZVTkNUSU9OCmZpbmRfcG93ZXIgPSBmdW5jdGlvbih4LCBlZmZlY3Rfc2l6ZSwgcG9wX3NkLCBhbHBoYSwgdGVzdF90eXBlLCBhbHQpewogIHBvd2VyX3Jlc3VsdHMgPSBudW1lcmljKGxlbmd0aCh4KSkKICAKICAjIFNUQVJUIEZPUiBMT09QCiAgZm9yIChpIGluIG1pbih4KTptYXgoeCkpewogICAgcG93ZXJfc2FtcGxlID0gcG93ZXIudC50ZXN0KG4gPSB4LAogICAgICAgICAgICAgZGVsdGEgPSBlZmZlY3Rfc2l6ZSwKICAgICAgICAgICAgIHNkID0gcG9wX3NkLAogICAgICAgICAgICAgc2lnLmxldmVsID0gYWxwaGEsCiAgICAgICAgICAgICB0eXBlID0gdGVzdF90eXBlLAogICAgICAgICAgICAgYWx0ZXJuYXRpdmUgPSBhbHQKICAgICAgICAgICAgICkKICAgIAogICAgIyMgd2lsbCBwdXQgcmVzdWx0cyBpbiBkYXRhIGZyYW1lIGZvcm1hdCBmb3IgZWFzaWVyIGFuYWx5c2lzCiAgICBwb3dlcl9yZXN1bHRzX24gPSBjYmluZChwb3dlcl9zYW1wbGUkbikKICAgIHBvd2VyX3Jlc3VsdHNfcG93ZXIgPSBjYmluZChwb3dlcl9zYW1wbGUkcG93ZXIpCiAgICByZXN1bHRzID0gY2JpbmQocG93ZXJfcmVzdWx0c19uLCBwb3dlcl9yZXN1bHRzX3Bvd2VyKQogICAgY29sbmFtZXMocmVzdWx0cykgPSBjKCJuIiwgInBvd2VyIikKICAgIAogIH0gIyBFTkQgRk9SIExPT1AKICAKICByZXR1cm4ocmVzdWx0cykKfSAjIEVORCBDVVNUT00gRlVOQ1RJT04KCnBvd2VyX2N1cnZlX2RhdGEgPSBmaW5kX3Bvd2VyKHggPSB4LAogICAgICAgICAgIGVmZmVjdF9zaXplID0gZWZmZWN0X3NpemUsCiAgICAgICAgICAgcG9wX3NkID0gb2xkX2RydWdfc2QsCiAgICAgICAgICAgYWxwaGEgPSBhbHBoYSwKICAgICAgICAgICB0ZXN0X3R5cGUgPSAib25lLnNhbXBsZSIsCiAgICAgICAgICAgYWx0ID0gIm9uZS5zaWRlZCIpCgpwb3dlcl9jdXJ2ZV9kYXRhID0gZGF0YS5mcmFtZShwb3dlcl9jdXJ2ZV9kYXRhKQoKbGluX21vZGVsID0gbG0ocG93ZXJfY3VydmVfZGF0YSRwb3dlciB+IHBvd2VyX2N1cnZlX2RhdGEkbikKCmdncGxvdChkYXRhID0gcG93ZXJfY3VydmVfZGF0YSkgKwogIGdlb21fcG9pbnQobWFwcGluZyA9IGFlcyh4ID0gbiwgeSA9IHBvd2VyKSkgKyAKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLjgsIAogICAgICAgICAgICAgY29sb3IgPSAicmVkIiwgCiAgICAgICAgICAgICBsaW5ld2lkdGggPSAxKSArIAogICAgIyB1c2luZyBnZW9tX2hsaW5lIHRvIHBvaW50IG91dCB0aGUgdGhyZXNob2xkIGJldHdlZW4gdmFsdWVzIHRoYXQgZG8gYW5kIGRvbid0IGFjaGlldmUgaWRlYWwgcG93ZXIKICAKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLjksIAogICAgICAgICAgICAgY29sb3IgPSAiYmx1ZSIsIAogICAgICAgICAgICAgbGluZXdpZHRoID0gMSkgKyAKICBsYWJzKHRpdGxlID0gIlNhbXBsZSBTaXplIGFuZCBQb3dlciBSZWxhdGlvbnNoaXAiLAogICAgICAgeCA9ICJTYW1wbGUgU2l6ZSAobikiLAogICAgICAgeSA9ICJQb3dlciAoMCAtIDEgU2NhbGUpIikgCmBgYAoKQXMgd2UgY2FuIHNlZSwgdGhlIGJlbmNobWFyayB0aHJlc2hvbGQgb2YgODAlIHBvd2VyIGlzIGNyb3NzZWQgb25jZSBvdXIgc2FtcGxlIHNpemUgcmVhY2hlcyBqdXN0IGJlbG93IDkwIHN1YmplY3RzLiBJZiB3ZSBhcmUgdG8gaG9sZCBvdXJzZWx2ZXMgdG8gYW4gZXZlbiBzdHJpY3RlciBzdGFuZGFyZCBhbmQgYXR0ZW1wdCB0byBhY2hpZXZlIDkwJSBwb3dlciwgd2hpbGUgaG9sZGluZyBhbGwgb3RoZXIgZWxlbWVudHMgb2Ygb3VyIGV4cGVyaW1lbnQgKGxpa2UgY29uZmlkZW5jZSBsZXZlbCBmb3IgZXhhbXBsZSkgY29uc3RhbnQsIHRoZW4gd2Ugd291bGQgbmVlZCBhdCBsZWFzdCAxMjIgc3ViamVjdHMgdG8gcGFydGljaXBhdGUuCg==