Start Using the neg.paired() Function

From the negligible R package


Introduction

What is the purpose/goal of neg.paired()?

The purpose of the neg.paired function is to test whether the difference between the means of two dependent populations is negligibly different (i.e., practically equivalent), where negligible represents the smallest meaningful effect size (MMES) determined a priori by a researcher via an equivalence interval (EI). For example, if a researcher wanted to test whether the GPA of students before vs after a year of implementing a novel note-taking method are approximately equivalent (e.g., paired group mean similarity), they could use the neg.paired function.

What is the theory behind neg.paired()?

The user specifies either the data associated with the first and second groups/populations (var1, var2, both should be continuous) or specifies the Independent Variable/Predictor (group, should be a factor) and the Dependent Variable (outcome, should be continuous). A ‘data’ statement can be used if the variables are stored in an R dataset.

The user must also specify the lower and upper bounds of the negligible effect (equivalence) interval. These are specified in the original units of the outcome variable.

Null and Alternate Hypotheses of the Procedure

\(H_{01}\): \(\mu_{1}\)- \(\mu_{2}\) \(\geqslant\) \(\delta\); \(H_{02}\): \(\mu_{1}\)- \(\mu_{2}\) \(\leqslant\) -\(\delta\) (The pair of null hypotheses specify that the difference between the dependent means in the population exceed the equivalence interval; i.e., that the effect is nonnegligible, either at the upper bound or the lower bound).

\(H_{a1}\): \(\mu_{1}\)- \(\mu_{2}\) \(<\) \(\delta\); \(H_{a2}\): \(\mu_{1}\)- \(\mu_{2}\) \(>\) -\(\delta\) (the pair of alternative hypotheses specifies that the difference between the dependent means in the population does not exceed the equivalence interval; i.e., it is negligible at either the upper or lower bound. In other words, that the effect is completely contained within the equivalence interval).

Using neg.paired()

neg.paired(var1 = NULL, var2 = NULL, outcome = NULL, group = NULL, ID = NULL, eil, eiu, normality = TRUE, nboot = 10000, alpha = 0.05, plot = TRUE, saveplot = FALSE, data = NULL, seed = NA, …)

Function Set-up:

Required arguments (no default)

eil: the lower bound of the equivalence interval

eiu: the upper bound of the equivalence interval

Optional arguments (has a default)

var1: data for Group 1 (if this is the outcome variable, group and ID are omitted)

var2: data for Group 2 (if this is the outcome, group and ID are omitted)

outcome: the dependent Variable (if var1 and var2 are omitted)

group: dichotomous predictor/independent Variable (if var1 and var2 are omitted)

ID: participant ID (if var1 and var2 are omitted)

data: the dataset containing var1/var2 or outcome/group/ID

normality: are the population variances (and hence the residuals) assumed to be normally distributed?

nboot: the number of bootstrap samples for calculating CIs

alpha: Nominal Type I Error rate

plot: should a plot of the results be produced?

saveplot: should the plot be saved?

seed: seed number for reproducing results from simulated data

Examples

Example 1

This example uses simulated wide-form data. We want to know whether the mean GPA (GPApre) at the beginning of the academic year is equivalent to the mean GPA at the end of the academic year (GPApost).

library(negligible)
#simulate data
ID<-rep(1:20) # create identifiers ranging from 1 to 20 and store in a vector ID
GPApre<-rnorm(20) # simulate 20 cases that are random normally distributed to represent GPA at time 1 and store in a vector GPApre
GPApost<-rnorm(20) # simulate 20 cases that are random normally distributed to represent GPA at time 2 and store in a vector GPApost
d<-data.frame(ID, GPApre, GPApost) # save ID, GPApre, and GPApost in a data frame, d
head(d) # examine the first 6 rows of the dataframe
  ID     GPApre    GPApost
1  1 -0.1034926  1.8015927
2  2  1.2810380  0.7529291
3  3  0.4379488  1.1174428
4  4 -1.9598908  0.5866857
5  5 -0.8127425 -1.4895469
6  6  1.9666859 -0.1400081

Now, let’s apply the neg.paired function to see if we can reject the null hypothesis that the two dependent sample means are non-negligibly different.

neg.paired(var1=GPApre,var2=GPApost,eil=-1,eiu=1,plot=TRUE,
           data=d) # run neg.paired using the vectors GPApre and GPApost for the var1 and var2 arguments, respectively
---- Evaluating the Equivalence of the Central Tendencies of Paired Samples----

Random Seed = 7590 
Test Statistic: 
 Two One-Sided Test of Equivalence for Paired-Samples (TOST-P) 

**********************

Means: 0.05362021, 0.1658774
Medians: 0.2013027, 0.2912124
SDs: 1.09474, 1.087204
MADs: 0.5959531, 1.042148

**********************

Equivalence Interval: Lower = -1 , Upper = 1 

**********************

Effect Sizes: Effect Size Measures use the Ordinary Mean and Standard Deviation 
Standardized Mean Difference (SMD): -0.0948182 
90% CI for SMD:(-0.6445298, 0.4246743)

Raw Mean Difference (MD): -0.1122571 
90% CI for MD:(-0.6617145, 0.4407505)
95% CI for MD:(-0.7707042, 0.5488483)

**********************

Proportional Distance (PD): -0.1122571 
95% CI for PD:(-0.7707042, 0.5488483)

**********************

TOST Test Statistics:

Ho: μ1 - μ2 ≥ eiu:
t = -4.095055 (df = 19), p = 0.00031

Ho: μ1 - μ2 ≤ eil:
t = 3.268449 (df = 19), p = 0.00202

**********************

NHST Decision:
The null hypothesis that the difference between the means exceeds the equivalence interval can be rejected. Be sure to interpret the magnitude of the effect size.

**********************

Example 2

In the next example, we are calling the variables from the dataframe d. 

neg.paired(var1=d$GPApre,var2=d$GPApost,eil=-1,eiu=1,plot=TRUE) # run neg.paired omitting the data= argumetn and instead calling the dataframe$variable as the arguments for var1 and var2 (e.g., var1=d$GPApre, var2=d$GPApost)
---- Evaluating the Equivalence of the Central Tendencies of Paired Samples----

Random Seed = 5694 
Test Statistic: 
 Two One-Sided Test of Equivalence for Paired-Samples (TOST-P) 

**********************

Means: 0.05362021, 0.1658774
Medians: 0.2013027, 0.2912124
SDs: 1.09474, 1.087204
MADs: 0.5959531, 1.042148

**********************

Equivalence Interval: Lower = -1 , Upper = 1 

**********************

Effect Sizes: Effect Size Measures use the Ordinary Mean and Standard Deviation 
Standardized Mean Difference (SMD): -0.0948182 
90% CI for SMD:(-0.6562735, 0.4282284)

Raw Mean Difference (MD): -0.1122571 
90% CI for MD:(-0.6726862, 0.4475355)
95% CI for MD:(-0.7755828, 0.5496184)

**********************

Proportional Distance (PD): -0.1122571 
95% CI for PD:(-0.7755828, 0.5496184)

**********************

TOST Test Statistics:

Ho: μ1 - μ2 ≥ eiu:
t = -4.095055 (df = 19), p = 0.00031

Ho: μ1 - μ2 ≤ eil:
t = 3.268449 (df = 19), p = 0.00202

**********************

NHST Decision:
The null hypothesis that the difference between the means exceeds the equivalence interval can be rejected. Be sure to interpret the magnitude of the effect size.

**********************

Extractable Elements

A number of elements of the output can be extracted, including:

meanx: Sample mean of the first population/group.

meany: Sample mean of the second population/group.

medx: Sample median of the first population/group.

medy: Sample median second population/group.

sdx: Sample standard deviation of the first population/group.

sdy: Sample standard deviation of the second population/group.

madx: Sample median absolute deviation of the first population/group.

mady: Sample median absolute deviation of the second population/group.

eil: Lower bound of the negligible effect (equivalence) interval.

eiu: Upper bound of the negligible effect (equivalence) interval.

effsizeraw: Simple difference in the means (or medians if normality = FALSE)

cilraw2: Lower bound of the 1-alpha CI for the raw mean difference.

ciuraw2: Upper bound of the 1-alpha CI for the raw mean difference.

cilraw: Lower bound of the 1-2*alpha CI for the raw mean difference.

ciuraw: Upper bound of the 1-2*alpha CI for the raw mean difference.

effsized: Standardized mean (or median if normality = FALSE) difference.

cild: Lower bound of the 1-alpha CI for the standardized mean (or median if normality = FALSE) difference.

ciud: Upper bound of the 1-alpha CI for the standardized mean (or median if normality = FALSE) difference.

effsizepd: Proportional distance statistic.

cilpd: Lower bound of the 1-alpha CI for the proportional distance statistic.

ciupd: Upper bound of the 1-alpha CI for the proportional distance statistic.

t1: First t-statistic from the TOST procedure.

t1: Second t-statistic from the TOST procedure.

df1: Degrees of freedom for the first t-statistic from the TOST procedure.

df2: Degrees of freedom for the second t-statistic from the TOST procedure.

pval1: p value associated with the first t-statistic from the TOST procedure.

pval2: p value associated with the second t-statistic from the TOST procedure.

alpha: Nominal Type I error rate

seed: Seed number

LS0tDQp0aXRsZTogIlN0YXJ0IFVzaW5nIHRoZSBgbmVnLnBhaXJlZCgpYCBGdW5jdGlvbiINCnN1YnRpdGxlOiB8IA0KICAgIEZyb20gdGhlIFtgbmVnbGlnaWJsZWBdKGh0dHBzOi8vY3Jhbi5yLXByb2plY3Qub3JnL3dlYi9wYWNrYWdlcy9uZWdsaWdpYmxlL2luZGV4Lmh0bWwpIFIgcGFja2FnZSFbXShHOi9NeSBEcml2ZS9SZXNlYXJjaC9DcmliYmllIExhYi9uZWdsaWdpYmxlIFZpZ25ldHRlcy9UZW1wbGF0ZS9uZWcubG9nby5wbmcpe3dpZHRoPTEwJX0gIA0KYXV0aG9yOiAiW0xpbmRhIEZhcm11cyAmIFJvYiBDcmliYmllXShodHRwczovL2NyaWJiaWUuaW5mby55b3JrdS5jYS8pIg0KZGF0ZTogImByIGZvcm1hdChTeXMudGltZSgpKWAiDQpvdXRwdXQ6DQogIHJtZGZvcm1hdHM6OnJvYm9ib29rOg0KICAgIGNvZGVfZG93bmxvYWQ6IHllcw0KICAgIGhpZ2hsaWdodDogdGFuZ28NCi0tLQ0KDQpgYGB7ciBzZXR1cCwgZWNobz1GQUxTRSwgY2FjaGU9RkFMU0UsIG1lc3NhZ2VzPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KI2luc3RhbGwucGFja2FnZXMoInJtZGZvcm1hdHMiKQ0Kc3VwcHJlc3NQYWNrYWdlU3RhcnR1cE1lc3NhZ2VzKGxpYnJhcnkocm1kZm9ybWF0cywgd2Fybi5jb25mbGljdHM9RkFMU0UpKQ0Kc3VwcHJlc3NQYWNrYWdlU3RhcnR1cE1lc3NhZ2VzKGxpYnJhcnkoa25pdHIsIHdhcm4uY29uZmxpY3RzPUZBTFNFKSkNCnN1cHByZXNzUGFja2FnZVN0YXJ0dXBNZXNzYWdlcyhsaWJyYXJ5KHRpZHl2ZXJzZSwgd2Fybi5jb25mbGljdHM9RkFMU0UpKQ0Kc3VwcHJlc3NQYWNrYWdlU3RhcnR1cE1lc3NhZ2VzKGxpYnJhcnkocGxvdGx5LCB3YXJuLmNvbmZsaWN0cz1GQUxTRSkpDQpzdXBwcmVzc1BhY2thZ2VTdGFydHVwTWVzc2FnZXMobGlicmFyeShyZWFkeGwsIHdhcm4uY29uZmxpY3RzPUZBTFNFKSkNCnN1cHByZXNzUGFja2FnZVN0YXJ0dXBNZXNzYWdlcyhsaWJyYXJ5KHBsb3RseSwgd2Fybi5jb25mbGljdHM9RkFMU0UpKQ0Kc3VwcHJlc3NQYWNrYWdlU3RhcnR1cE1lc3NhZ2VzKGxpYnJhcnkoTWV0QnJld2VyLCB3YXJuLmNvbmZsaWN0cz1GQUxTRSkpDQpzdXBwcmVzc1BhY2thZ2VTdGFydHVwTWVzc2FnZXMobGlicmFyeShnZ2FuaW1hdGUsIHdhcm4uY29uZmxpY3RzPUZBTFNFKSkNCnN1cHByZXNzUGFja2FnZVN0YXJ0dXBNZXNzYWdlcyhsaWJyYXJ5KGRwbHlyLCB3YXJuLmNvbmZsaWN0cz1GQUxTRSkpDQoNCiMjIEdsb2JhbCBvcHRpb25zDQpvcHRpb25zKG1heC5wcmludD0iNzUiKQ0Kb3B0c19jaHVuayRzZXQoZWNobz1UUlVFLA0KCSAgICAgICAgICAgICBjYWNoZT1UUlVFLA0KICAgICAgICAgICAgICAgcHJvbXB0PUZBTFNFLA0KICAgICAgICAgICAgICAgY29tbWVudD1OQSwNCiAgICAgICAgICAgICAgIG1lc3NhZ2U9RkFMU0UsDQogICAgICAgICAgICAgICB3YXJuaW5nPUZBTFNFKQ0Kb3B0c19rbml0JHNldCh3aWR0aD03NSkNCmBgYA0KDQo8YnIvPg0KDQoNCiMjICoqSW50cm9kdWN0aW9uKioNCg0KIyMjICoqV2hhdCBpcyB0aGUgcHVycG9zZS9nb2FsIG9mIGBuZWcucGFpcmVkKClgPyoqDQoNClRoZSBwdXJwb3NlIG9mIHRoZSBuZWcucGFpcmVkIGZ1bmN0aW9uIGlzIHRvIHRlc3Qgd2hldGhlciB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBtZWFucyBvZiB0d28gZGVwZW5kZW50IHBvcHVsYXRpb25zIGlzICpuZWdsaWdpYmx5KiBkaWZmZXJlbnQgKGkuZS4sIHByYWN0aWNhbGx5IGVxdWl2YWxlbnQpLCB3aGVyZSBuZWdsaWdpYmxlIHJlcHJlc2VudHMgdGhlIHNtYWxsZXN0IG1lYW5pbmdmdWwgZWZmZWN0IHNpemUgKE1NRVMpIGRldGVybWluZWQgYSBwcmlvcmkgYnkgYSByZXNlYXJjaGVyIHZpYSBhbiBlcXVpdmFsZW5jZSBpbnRlcnZhbCAoRUkpLiBGb3IgZXhhbXBsZSwgaWYgYSByZXNlYXJjaGVyIHdhbnRlZCB0byB0ZXN0IHdoZXRoZXIgdGhlIEdQQSBvZiBzdHVkZW50cyBiZWZvcmUgdnMgYWZ0ZXIgYSB5ZWFyIG9mIGltcGxlbWVudGluZyBhIG5vdmVsIG5vdGUtdGFraW5nIG1ldGhvZCBhcmUgYXBwcm94aW1hdGVseSBlcXVpdmFsZW50IChlLmcuLCBwYWlyZWQgZ3JvdXAgbWVhbiBzaW1pbGFyaXR5KSwgdGhleSBjb3VsZCB1c2UgdGhlIG5lZy5wYWlyZWQgZnVuY3Rpb24uIA0KDQojIyMgKipXaGF0IGlzIHRoZSB0aGVvcnkgYmVoaW5kIGBuZWcucGFpcmVkKClgPyoqDQoNClRoZSB1c2VyIHNwZWNpZmllcyBlaXRoZXIgdGhlIGRhdGEgYXNzb2NpYXRlZCB3aXRoIHRoZSBmaXJzdCBhbmQgc2Vjb25kIGdyb3Vwcy9wb3B1bGF0aW9ucyAodmFyMSwgdmFyMiwgYm90aCBzaG91bGQgYmUgY29udGludW91cykgb3Igc3BlY2lmaWVzIHRoZSBJbmRlcGVuZGVudCBWYXJpYWJsZS9QcmVkaWN0b3IgKGdyb3VwLCBzaG91bGQgYmUgYSBmYWN0b3IpIGFuZCB0aGUgRGVwZW5kZW50IFZhcmlhYmxlIChvdXRjb21lLCBzaG91bGQgYmUgY29udGludW91cykuIEEgJ2RhdGEnIHN0YXRlbWVudCBjYW4gYmUgdXNlZCBpZiB0aGUgdmFyaWFibGVzIGFyZSBzdG9yZWQgaW4gYW4gUiBkYXRhc2V0Lg0KDQpUaGUgdXNlciBtdXN0IGFsc28gc3BlY2lmeSB0aGUgbG93ZXIgYW5kIHVwcGVyIGJvdW5kcyBvZiB0aGUgbmVnbGlnaWJsZSBlZmZlY3QgKGVxdWl2YWxlbmNlKSBpbnRlcnZhbC4gVGhlc2UgYXJlIHNwZWNpZmllZCBpbiB0aGUgb3JpZ2luYWwgdW5pdHMgb2YgdGhlIG91dGNvbWUgdmFyaWFibGUuDQoNCiMjIyMgKk51bGwgYW5kIEFsdGVybmF0ZSBIeXBvdGhlc2VzIG9mIHRoZSBQcm9jZWR1cmUqDQoNCiRIX3swMX0kOiAkXG11X3sxfSQtICRcbXVfezJ9JCAkXGdlcXNsYW50JCAkXGRlbHRhJDsgJEhfezAyfSQ6ICRcbXVfezF9JC0gJFxtdV97Mn0kICRcbGVxc2xhbnQkIC0kXGRlbHRhJCAoVGhlIHBhaXIgb2YgbnVsbCBoeXBvdGhlc2VzIHNwZWNpZnkgdGhhdCB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBkZXBlbmRlbnQgbWVhbnMgaW4gdGhlIHBvcHVsYXRpb24gZXhjZWVkIHRoZSBlcXVpdmFsZW5jZSBpbnRlcnZhbDsgaS5lLiwgdGhhdCB0aGUgZWZmZWN0IGlzIG5vbm5lZ2xpZ2libGUsIGVpdGhlciBhdCB0aGUgdXBwZXIgYm91bmQgb3IgdGhlIGxvd2VyIGJvdW5kKS4NCg0KJEhfe2ExfSQ6ICRcbXVfezF9JC0gJFxtdV97Mn0kICQ8JCAkXGRlbHRhJDsgJEhfe2EyfSQ6ICRcbXVfezF9JC0gJFxtdV97Mn0kICQ+JCAtJFxkZWx0YSQgKHRoZSBwYWlyIG9mIGFsdGVybmF0aXZlIGh5cG90aGVzZXMgc3BlY2lmaWVzIHRoYXQgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgZGVwZW5kZW50IG1lYW5zIGluIHRoZSBwb3B1bGF0aW9uIGRvZXMgbm90IGV4Y2VlZCB0aGUgZXF1aXZhbGVuY2UgaW50ZXJ2YWw7IGkuZS4sIGl0IGlzIG5lZ2xpZ2libGUgYXQgZWl0aGVyIHRoZSB1cHBlciBvciBsb3dlciBib3VuZC4gSW4gb3RoZXIgd29yZHMsIHRoYXQgdGhlIGVmZmVjdCBpcyBjb21wbGV0ZWx5IGNvbnRhaW5lZCB3aXRoaW4gdGhlIGVxdWl2YWxlbmNlIGludGVydmFsKS4gDQoNCiMjIyAqKlVzaW5nIGBuZWcucGFpcmVkKClgKioNCg0KbmVnLnBhaXJlZCh2YXIxID0gTlVMTCwgdmFyMiA9IE5VTEwsIG91dGNvbWUgPSBOVUxMLCBncm91cCA9IE5VTEwsIElEID0gTlVMTCwgZWlsLCBlaXUsIG5vcm1hbGl0eSA9IFRSVUUsIG5ib290ID0gMTAwMDAsIGFscGhhID0gMC4wNSwgcGxvdCA9IFRSVUUsIHNhdmVwbG90ID0gRkFMU0UsIGRhdGEgPSBOVUxMLCBzZWVkID0gTkEsIC4uLikNCg0KIyMjIEZ1bmN0aW9uIFNldC11cDoNCg0KDQojIyMjICpSZXF1aXJlZCBhcmd1bWVudHMgKG5vIGRlZmF1bHQpKg0KKmVpbCo6IHRoZSBsb3dlciBib3VuZCBvZiB0aGUgZXF1aXZhbGVuY2UgaW50ZXJ2YWwNCg0KKmVpdSo6IHRoZSB1cHBlciBib3VuZCBvZiB0aGUgZXF1aXZhbGVuY2UgaW50ZXJ2YWwgDQoNCiMjIyMgKk9wdGlvbmFsIGFyZ3VtZW50cyAoaGFzIGEgZGVmYXVsdCkqDQoqdmFyMSo6IGRhdGEgZm9yIEdyb3VwIDEgKGlmIHRoaXMgaXMgdGhlIG91dGNvbWUgdmFyaWFibGUsIGdyb3VwIGFuZCBJRCBhcmUgb21pdHRlZCkNCg0KKnZhcjIqOiBkYXRhIGZvciBHcm91cCAyIChpZiB0aGlzIGlzIHRoZSBvdXRjb21lLCBncm91cCBhbmQgSUQgYXJlIG9taXR0ZWQpDQoNCipvdXRjb21lKjogdGhlIGRlcGVuZGVudCBWYXJpYWJsZSAoaWYgdmFyMSBhbmQgdmFyMiBhcmUgb21pdHRlZCkNCg0KKmdyb3VwKjogZGljaG90b21vdXMgcHJlZGljdG9yL2luZGVwZW5kZW50IFZhcmlhYmxlIChpZiB2YXIxIGFuZCB2YXIyIGFyZSBvbWl0dGVkKQ0KDQoqSUQqOiBwYXJ0aWNpcGFudCBJRCAoaWYgdmFyMSBhbmQgdmFyMiBhcmUgb21pdHRlZCkNCg0KKmRhdGEqOiB0aGUgZGF0YXNldCBjb250YWluaW5nIHZhcjEvdmFyMiBvciBvdXRjb21lL2dyb3VwL0lEDQoNCipub3JtYWxpdHkqOiBhcmUgdGhlIHBvcHVsYXRpb24gdmFyaWFuY2VzIChhbmQgaGVuY2UgdGhlIHJlc2lkdWFscykgYXNzdW1lZCB0byBiZSBub3JtYWxseSBkaXN0cmlidXRlZD8NCg0KKm5ib290KjogdGhlIG51bWJlciBvZiBib290c3RyYXAgc2FtcGxlcyBmb3IgY2FsY3VsYXRpbmcgQ0lzDQoNCiphbHBoYSo6IE5vbWluYWwgVHlwZSBJIEVycm9yIHJhdGUNCg0KKnBsb3QqOiBzaG91bGQgYSBwbG90IG9mIHRoZSByZXN1bHRzIGJlIHByb2R1Y2VkPw0KDQoqc2F2ZXBsb3QqOiBzaG91bGQgdGhlIHBsb3QgYmUgc2F2ZWQ/DQoNCipzZWVkKjogc2VlZCBudW1iZXIgZm9yIHJlcHJvZHVjaW5nIHJlc3VsdHMgZnJvbSBzaW11bGF0ZWQgZGF0YSANCg0KIyMgKipFeGFtcGxlcyoqDQoNCiMjIyAqKkV4YW1wbGUgMSoqDQpUaGlzIGV4YW1wbGUgdXNlcyBzaW11bGF0ZWQgd2lkZS1mb3JtIGRhdGEuIFdlIHdhbnQgdG8ga25vdyB3aGV0aGVyIHRoZSBtZWFuIEdQQSAoR1BBcHJlKSBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBhY2FkZW1pYyB5ZWFyIGlzIGVxdWl2YWxlbnQgdG8gdGhlIG1lYW4gR1BBIGF0IHRoZSBlbmQgb2YgdGhlIGFjYWRlbWljIHllYXIgKEdQQXBvc3QpLg0KDQpgYGB7cn0NCmxpYnJhcnkobmVnbGlnaWJsZSkNCiNzaW11bGF0ZSBkYXRhDQpJRDwtcmVwKDE6MjApICMgY3JlYXRlIGlkZW50aWZpZXJzIHJhbmdpbmcgZnJvbSAxIHRvIDIwIGFuZCBzdG9yZSBpbiBhIHZlY3RvciBJRA0KR1BBcHJlPC1ybm9ybSgyMCkgIyBzaW11bGF0ZSAyMCBjYXNlcyB0aGF0IGFyZSByYW5kb20gbm9ybWFsbHkgZGlzdHJpYnV0ZWQgdG8gcmVwcmVzZW50IEdQQSBhdCB0aW1lIDEgYW5kIHN0b3JlIGluIGEgdmVjdG9yIEdQQXByZQ0KR1BBcG9zdDwtcm5vcm0oMjApICMgc2ltdWxhdGUgMjAgY2FzZXMgdGhhdCBhcmUgcmFuZG9tIG5vcm1hbGx5IGRpc3RyaWJ1dGVkIHRvIHJlcHJlc2VudCBHUEEgYXQgdGltZSAyIGFuZCBzdG9yZSBpbiBhIHZlY3RvciBHUEFwb3N0DQpkPC1kYXRhLmZyYW1lKElELCBHUEFwcmUsIEdQQXBvc3QpICMgc2F2ZSBJRCwgR1BBcHJlLCBhbmQgR1BBcG9zdCBpbiBhIGRhdGEgZnJhbWUsIGQNCmhlYWQoZCkgIyBleGFtaW5lIHRoZSBmaXJzdCA2IHJvd3Mgb2YgdGhlIGRhdGFmcmFtZQ0KYGBgDQoNCk5vdywgbGV0J3MgYXBwbHkgdGhlIG5lZy5wYWlyZWQgZnVuY3Rpb24gdG8gc2VlIGlmIHdlIGNhbiByZWplY3QgdGhlIG51bGwgaHlwb3RoZXNpcyB0aGF0IHRoZSB0d28gZGVwZW5kZW50IHNhbXBsZSBtZWFucyBhcmUgbm9uLW5lZ2xpZ2libHkgZGlmZmVyZW50LiANCg0KYGBge3J9DQpuZWcucGFpcmVkKHZhcjE9R1BBcHJlLHZhcjI9R1BBcG9zdCxlaWw9LTEsZWl1PTEscGxvdD1UUlVFLA0KICAgICAgICAgICBkYXRhPWQpICMgcnVuIG5lZy5wYWlyZWQgdXNpbmcgdGhlIHZlY3RvcnMgR1BBcHJlIGFuZCBHUEFwb3N0IGZvciB0aGUgdmFyMSBhbmQgdmFyMiBhcmd1bWVudHMsIHJlc3BlY3RpdmVseQ0KYGBgDQoNCiMjIyAqKkV4YW1wbGUgMioqDQoNCkluIHRoZSBuZXh0IGV4YW1wbGUsIHdlIGFyZSBjYWxsaW5nIHRoZSB2YXJpYWJsZXMgZnJvbSB0aGUgZGF0YWZyYW1lIGQuIA0KYGBge3J9DQpuZWcucGFpcmVkKHZhcjE9ZCRHUEFwcmUsdmFyMj1kJEdQQXBvc3QsZWlsPS0xLGVpdT0xLHBsb3Q9VFJVRSkgIyBydW4gbmVnLnBhaXJlZCBvbWl0dGluZyB0aGUgZGF0YT0gYXJndW1ldG4gYW5kIGluc3RlYWQgY2FsbGluZyB0aGUgZGF0YWZyYW1lJHZhcmlhYmxlIGFzIHRoZSBhcmd1bWVudHMgZm9yIHZhcjEgYW5kIHZhcjIgKGUuZy4sIHZhcjE9ZCRHUEFwcmUsIHZhcjI9ZCRHUEFwb3N0KQ0KYGBgDQoNCiMjICoqRXh0cmFjdGFibGUgRWxlbWVudHMqKg0KDQojIyMgKipBIG51bWJlciBvZiBlbGVtZW50cyBvZiB0aGUgb3V0cHV0IGNhbiBiZSBleHRyYWN0ZWQsIGluY2x1ZGluZzoqKg0KDQoqbWVhbngqOiBTYW1wbGUgbWVhbiBvZiB0aGUgZmlyc3QgcG9wdWxhdGlvbi9ncm91cC4NCg0KKm1lYW55KjogU2FtcGxlIG1lYW4gb2YgdGhlIHNlY29uZCBwb3B1bGF0aW9uL2dyb3VwLg0KDQoqbWVkeCo6IFNhbXBsZSBtZWRpYW4gb2YgdGhlIGZpcnN0IHBvcHVsYXRpb24vZ3JvdXAuDQoNCiptZWR5KjogU2FtcGxlIG1lZGlhbiBzZWNvbmQgcG9wdWxhdGlvbi9ncm91cC4NCg0KKnNkeCo6IFNhbXBsZSBzdGFuZGFyZCBkZXZpYXRpb24gb2YgdGhlIGZpcnN0IHBvcHVsYXRpb24vZ3JvdXAuDQoNCipzZHkqOiBTYW1wbGUgc3RhbmRhcmQgZGV2aWF0aW9uIG9mIHRoZSBzZWNvbmQgcG9wdWxhdGlvbi9ncm91cC4NCg0KKm1hZHgqOiBTYW1wbGUgbWVkaWFuIGFic29sdXRlIGRldmlhdGlvbiBvZiB0aGUgZmlyc3QgcG9wdWxhdGlvbi9ncm91cC4NCg0KKm1hZHkqOiBTYW1wbGUgbWVkaWFuIGFic29sdXRlIGRldmlhdGlvbiBvZiB0aGUgc2Vjb25kIHBvcHVsYXRpb24vZ3JvdXAuDQoNCiplaWwqOiBMb3dlciBib3VuZCBvZiB0aGUgbmVnbGlnaWJsZSBlZmZlY3QgKGVxdWl2YWxlbmNlKSBpbnRlcnZhbC4NCg0KKmVpdSo6IFVwcGVyIGJvdW5kIG9mIHRoZSBuZWdsaWdpYmxlIGVmZmVjdCAoZXF1aXZhbGVuY2UpIGludGVydmFsLg0KDQoqZWZmc2l6ZXJhdyo6IFNpbXBsZSBkaWZmZXJlbmNlIGluIHRoZSBtZWFucyAob3IgbWVkaWFucyBpZiBub3JtYWxpdHkgPSBGQUxTRSkNCg0KKmNpbHJhdzIqOiBMb3dlciBib3VuZCBvZiB0aGUgMS1hbHBoYSBDSSBmb3IgdGhlIHJhdyBtZWFuIGRpZmZlcmVuY2UuDQoNCipjaXVyYXcyKjogVXBwZXIgYm91bmQgb2YgdGhlIDEtYWxwaGEgQ0kgZm9yIHRoZSByYXcgbWVhbiBkaWZmZXJlbmNlLg0KDQoqY2lscmF3KjogTG93ZXIgYm91bmQgb2YgdGhlIDEtMiphbHBoYSBDSSBmb3IgdGhlIHJhdyBtZWFuIGRpZmZlcmVuY2UuDQoNCipjaXVyYXcqOiBVcHBlciBib3VuZCBvZiB0aGUgMS0yKmFscGhhIENJIGZvciB0aGUgcmF3IG1lYW4gZGlmZmVyZW5jZS4NCg0KKmVmZnNpemVkKjogU3RhbmRhcmRpemVkIG1lYW4gKG9yIG1lZGlhbiBpZiBub3JtYWxpdHkgPSBGQUxTRSkgZGlmZmVyZW5jZS4NCg0KKmNpbGQqOiBMb3dlciBib3VuZCBvZiB0aGUgMS1hbHBoYSBDSSBmb3IgdGhlIHN0YW5kYXJkaXplZCBtZWFuIChvciBtZWRpYW4gaWYgbm9ybWFsaXR5ID0gRkFMU0UpIGRpZmZlcmVuY2UuDQoNCipjaXVkKjogVXBwZXIgYm91bmQgb2YgdGhlIDEtYWxwaGEgQ0kgZm9yIHRoZSBzdGFuZGFyZGl6ZWQgbWVhbiAob3IgbWVkaWFuIGlmIG5vcm1hbGl0eSA9IEZBTFNFKSBkaWZmZXJlbmNlLg0KDQoqZWZmc2l6ZXBkKjogUHJvcG9ydGlvbmFsIGRpc3RhbmNlIHN0YXRpc3RpYy4NCg0KKmNpbHBkKjogTG93ZXIgYm91bmQgb2YgdGhlIDEtYWxwaGEgQ0kgZm9yIHRoZSBwcm9wb3J0aW9uYWwgZGlzdGFuY2Ugc3RhdGlzdGljLg0KDQoqY2l1cGQqOiBVcHBlciBib3VuZCBvZiB0aGUgMS1hbHBoYSBDSSBmb3IgdGhlIHByb3BvcnRpb25hbCBkaXN0YW5jZSBzdGF0aXN0aWMuDQoNCip0MSo6IEZpcnN0IHQtc3RhdGlzdGljIGZyb20gdGhlIFRPU1QgcHJvY2VkdXJlLg0KDQoqdDEqOiBTZWNvbmQgdC1zdGF0aXN0aWMgZnJvbSB0aGUgVE9TVCBwcm9jZWR1cmUuDQoNCipkZjEqOiBEZWdyZWVzIG9mIGZyZWVkb20gZm9yIHRoZSBmaXJzdCB0LXN0YXRpc3RpYyBmcm9tIHRoZSBUT1NUIHByb2NlZHVyZS4NCg0KKmRmMio6IERlZ3JlZXMgb2YgZnJlZWRvbSBmb3IgdGhlIHNlY29uZCB0LXN0YXRpc3RpYyBmcm9tIHRoZSBUT1NUIHByb2NlZHVyZS4NCg0KKnB2YWwxKjogcCB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggdGhlIGZpcnN0IHQtc3RhdGlzdGljIGZyb20gdGhlIFRPU1QgcHJvY2VkdXJlLg0KDQoqcHZhbDIqOiBwIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCB0aGUgc2Vjb25kIHQtc3RhdGlzdGljIGZyb20gdGhlIFRPU1QgcHJvY2VkdXJlLg0KDQoqYWxwaGEqOiBOb21pbmFsIFR5cGUgSSBlcnJvciByYXRlDQoNCipzZWVkKjogU2VlZCBudW1iZXI=