Basic Concepts of
Sampling Design
This section introduces the basic concepts of sampling design and
analysis.
Population: Total of items about which information
is desired. It can be classified into two categories - finite and
infinite.
Finite Population - The population is said to be finite if
it consists of a fixed number of elements so that it is possible to
enumerate in its totality.
Infinite population - The number of items is infinite.
From practical consideration, we use the term infinite population for
a population that cannot be enumerated in a reasonable period of
time.
Sample: It is part of the population that represents
the characteristics of the population.
Sampling: It is the process of selecting the sample
for estimating the population characteristics. In other words, it is the
process of obtaining information about an entire population by examining
only a part of it.
Sampling Unit: A sampling unit is the basic unit or
individual element selected from a population for inclusion in a sample
during the process of sampling. It is the smallest entity that can be
chosen or measured in a study. The choice of sampling unit depends on
the research objective and the population being studied. Some examples
ob sampling units are given below
- If we are studying the average income of households in a city, the
sampling unit could be a single household.
- If we are studying the yield of wheat in a region, the sampling unit
could be a single plot of land where wheat is grown.
- If we are inspecting the quality of light bulbs produced in a
factory, the sampling unit could be a single light bulb.
- If we are studying the performance of students in a school district,
the sampling unit could be a single student.
- If we are researching the prevalence of a disease in a community,
the sampling unit could be a single individual or patient.
- If we are studying the diversity of plant species in a forest, the
sampling unit could be a quadrat (a small, defined area of land).
- If we are analyzing consumer preferences for a product, the sampling
unit could be a single consumer or household.
Sampling Frame: A sampling frame is a list or
representation of all the elements or units in a population from which a
sample is drawn for research or analysis. It serves as the foundation
for selecting a sample and ensures that every member of the population
has a known, non-zero chance of being included in the sample. A
well-defined sampling frame is crucial for achieving accurate and
unbiased results in research. Some examples about sampling frame are
given below:
- If a researcher is studying the opinions of residents in a city,
they might use a telephone directory as the sampling frame to randomly
select participants.
- For a political survey, the voter registration list can serve as the
sampling frame to ensure that all eligible voters are included.
- In a company, the HR department’s employee database can be used as a
sampling frame to select employees for a workplace satisfaction
survey.
- A researcher studying student performance might use school
enrollment records as the sampling frame to select students for their
study.
- A business conducting market research might use its customer
database as the sampling frame to select participants for a survey.
- In ecological studies, a map of a region can serve as the sampling
frame to select specific locations or plots for data collection.
Sample Survey: An investigation in which elaborate
information is collected on a sample basis is known as a sample
survey.
Statistic: Characteristics of the sample. For
example, sample Mean, proportion, etc.
Parameter: Characteristics of the population. For
example, population Mean, proportion, etc.
Target Population: A target population is the entire
group about which information is desired and conclusions are made.
Sampled Population: The population, that we actually
sample, is the sampled population. It is also called the survey
population.
Purples of
Sampling
The basic purpose of sampling is to provide an estimate of the
population parameter and to test the hypothesis. The advantages of
sampling are -
Save time and money.
Enable collection of comprehensive data.
Enable more accurate measurement as it is conducted by trained
and experienced investigators.
Sampling remains the only way when the population contains
infinitely many members.
In certain situations, sampling is the only way of data
collection. For example, in testing the pathological status of blood,
boiling status of rice, etc.
It provides a valid estimation of sampling error.
Sampling Process
The sampling process comprises several stages
Define the population.
Specifying the sampling frame.
Specifying the sampling unit.
Selection of the sampling method.
Determination of sample size.
Specify the sampling plan.
Selecting the sample.
Defining the
Population
The population must be defined in terms of elements, sampling units,
extent, and time. Because there is very rarely enough time or money to
gather information from everyone or everything in a population, the goal
becomes finding a representative sample (or subset) of that
population.
Specifying Sampling
Frame
As a remedy, we seek a sampling frame that has the property that we
can identify every single element and include any in our sample. The
most straightforward type of frame is a list of elements of the
population (preferably the entire population) with appropriate contact
information.
A sampling frame may be a telephone book, a city directory, an
employee roster, a listing of all students attending a university, or a
list of all possible phone numbers.
Specifying Sampling
Unit
A sampling unit is a basic unit that contains a single element or a
group of elements of the population to be sampled. The sampling unit
selected is often dependent upon the sampling frame. If a relatively
complete and accurate listing of elements is available (e.g. register of
purchasing agents) one may well want to sample them directly. If no such
register is available, one may need to sample companies as the basic
sampling unit.
Selecting Sampling
Method
The sampling method outlines the way in which the sample units are to
be selected. The choice of the sampling method is influenced by the
objectives of the research, availability of financial resources, time
constraints, and the nature of the problem to be investigated. All
sampling methods can be grouped under two distinct heads, that is,
probability and non-probability sampling.
Determining Sample
Size
The sample size calculation depends primarily on the type of sampling
design used. However, for all sampling designs, the estimates for the
expected sample characteristics (e.g. mean, proportion, or total)
desired level of certainty, and the level of precision must be clearly
specified in advance. The statement of the precision desired might be
made by giving the amount of error that we are willing to tolerate in
the resulting estimates. Common levels of precision are 5% and 10%.
Specifying Sampling
Plan
In this step, the specifications and decisions regarding the
implementation of the research process are outlined. As the interviewers
and their co-workers will be on field duty most of the time, a proper
specification of the sampling plans would make their work easy, and they
would not have to revert to operational problems.
Selecting the
Sample
The final step in the sampling process is the actual selection of the
sample elements. This requires a substantial amount of office and
fieldwork, particularly if personal interviews are involved.
Sampling Methods
There are two basic approaches to sampling: Probability Sampling and
Non-probability Sampling. We only focus on methods of probability
sampling plans.
Probability sampling is also known as random sampling or chance
sampling. In this, sample is taken in such a manner that each and
every unit of the population has an equal and positive chance of being
selected. In this way, it is ensured that the sample would truly
represent the overall population. Probability sampling can be achieved
by random selection of the sample among all the units of the population.
Major random sampling procedures are
- Simple Random Sample
- Systematic Random Sample
- Stratified Random Sample, and
- Cluster/ Multistage Sample.
Simple Random
Sample
In a simple random variable (SRS), each member of the population is
numbered. Then, a given size of the sample is drawn with the help of a
random number generator (chart). It is relatively simple to implement
but the final sample may miss out on small subgroups.
Advantages: The sample will be free from Bias (i.e. it’s
random!).
Disadvantages: SRS is difficult to obtain due to its
randomness. If the sample size is small, it could generate a result that
is completely off the true value of the parameter and is also difficult
to spot. Increasing the sample size is the best way to eradicate this
problem.
Systematic Random
Sample
It also requires numbering the entire population. Then every nth
number (say every 5th or 10th number, as the case may be) is selected to
constitute the sample. It is easier and more likely to represent
different subgroups.
Advantages: Can eliminate other sources of bias.
Disadvantages: This can introduce bias where the pattern
used for the samples coincides with a pattern in the population.
Stratified Random
Sample
At first, the population is divided into groups or strata each of
which is homogeneous with respect to the given characteristic feature.
From each stratum, then, samples are drawn at random. This is called
stratified random sampling. For example, with respect to the level of
socio-economic status, the population may first be grouped in such
strata as high, middle, low, and very low socio-economic levels as per
pre-determined criteria, and a random sample drawn from each group.
The sample size for each sub-group can be fixed to get a
representative sample. This way, it is possible that different
categories in the population are fairly represented in the sample, which
could have been left out otherwise in a simple random sample.
Advantages: Yields more accurate results than simple random
sampling.
Can show different tendencies within each category (e.g. men and
women).
Disadvantages: Nothing major, hence it’s used a lot.
As with stratified samples, the population is broken down into
different categories. However, the size of the sample of each category
does not reflect the population as a whole. The Quota sampling technique
can be used where an unrepresentative sample is desirable (e.g. you
might want to interview more children than adults for a survey on
computer games), or where it would be too difficult to undertake a
stratified sample
Cluster/ Multistage
Sample
In some cases, the selection of units may pass through various
stages, before you finally reach your sample of study. For this, a
State, for example, may be divided into districts, districts into
blocks, blocks into villages, and villages into identifiable groups of
people, and then the random or quota sample from each group.
For example, taking a random selection of 3 out of 15 districts of a
State, 6 blocks from each selected district, 10 villages from each
selected block, and 20 households from each selected village, totaling
3600 respondents. This design is used for large-scale surveys spread
over large areas.
The advantage is that it needs a detailed sampling frame for selected
clusters only rather than for the entire target area. There are savings
in travel costs and time as well.
However, there is a risk of missing important sub-groups and not
having a complete representation of the target population.
Advantages: Less expensive and time-consuming than a fully
random sample. Can show ‘regional’ variations.
Disadvantages: Not a genuine random sample. Likely to yield
a biased result (especially if only a few clusters are sampled).
Sampling Error and
Survey Bias
Survey results are typically subject to some error. Total errors can
be classified into sampling errors and non-sampling errors. The term
‘error’ here includes systematic biases as well as random errors.
Sampling errors and
biases:
Sampling errors and biases are induced by the sample design. They
include
Selection bias: When the true selection probabilities differ from
those assumed in calculating the results.
Random sampling error: Random variation in the results due to the
elements in the sample being selected at random.
Non-sampling error Non-sampling errors are other
errors that can impact the final survey estimates, caused by problems in
data collection, processing, or sample design. They include
Over-coverage: Inclusion of data from outside of the
population.
Under-coverage: Occurs when some members of the population
are inadequately represented in the sample. Under-coverage is often a
problem with convenience samples.
Measurement error: When respondents misunderstand a
question or find it difficult to answer.
Processing error: Mistakes in data coding.
Non-response: Failure to obtain complete data from
all selected individuals.
After sampling, a review should be held of the exact process followed
in sampling, rather than that intended, in order to study any effects
that any divergences might have on subsequent analysis.
Bias Due to
Measurement Error
A poor measurement process can also lead to bias. In survey research,
the measurement process includes the environment in which the survey is
conducted, the way that questions are asked, and the state of the survey
respondent.
Response bias refers to the bias that results from
problems in the measurement process. For example, a satisfaction survey
may ask the respondent to indicate where she is satisfied, dissatisfied,
or very dissatisfied. By giving the respondent one response option to
express satisfaction and two response options to express
dissatisfaction, this survey question is biased toward getting a
dissatisfied response. This becomes more serious if the survey response
is socially sensitive.
Increasing the sample size tends to reduce the sampling error; that
is, it makes the sample statistic less variable. However, increasing the
sample size does not affect survey bias. A large sample size cannot
correct the methodological problems (under-coverage, non-response bias,
etc.) that produce survey bias.
Sample Size
Determination
Determination of sample size is probably one of the most important
phases in the sampling process.
From a theoretical perspective, the larger the sample size, the
better the estimation. However, as the sample size reaches a certain
size, the impact on the estimate will become negligible. On the other
hand, sampling can be expensive. If the sampling precision is
pre-specified, we only choose the appropriate size to meet the precision
without wasting resources.
For example, if the estimate of the mean of the
population is required to be within \(\pm
3\) of the true mean with 95% confidence. That is, if the true
mean is 100, the estimated value of the mean will be no less than 97 and
no more than 103. In other words, all this means that the acceptable
error, e, is equal to 3.
The methods of determining the sample size are dependent on the
specific estimation tasks such as population means, variance,
correlations, etc. In other words, there is no single algorithm that
fits all sample size determination problems because it is one type of
statistics problem just like the problems of statistical hypothesis.
Problems of
Estimating Mean and Proportion
The above example explained the idea of estimating the population
mean with a pre-specified estimation error (\(\pm 3\)). The acceptable estimation error
is, in fact, the margin of error in the confidence interval which is
given by
\[
\bar{x} \pm \text{CV}_{\alpha/2}\frac{\sigma}{\sqrt{n}}
\]
where \(E =
\text{CV}_{\alpha/2}\sigma/\sqrt{n}\) is the margin error (i.e.,
pre-specified estimation error).
In other words, if estimation error \(E\) and confidence level \(100(1-\alpha)\%\) is given, we can then
solve for the desired sample size \(n\)
by the following formula
\[
n = \left[ \frac{\sigma}{\text{CV}_{\alpha/2}}\right]^2
\]
The formula for determining the sample size of estimating a
population proportion with a given estimation error and confidence level
is given by
\[
n = \left[
\frac{\sqrt{\hat{p}(1-\hat{p})}}{\text{CV}_{\alpha/2}}\right]^2
\]
Estimating Variance
and Other Characteristics
The derivation of formulas for calculating sample size for estimating
variance or other population characteristics is not straightforward.
Since this is not the focus of this course, we will not expand the
discussion in any direction.
Sample Size
Determination and Power Calculation
Sample size determination in power analysis is another very important
procedure in clinical studies. It is a required component in the
statistical analysis plan (SAP) for intervention and
non-intervention observational studies. We will also not expand the
discussion from this direction.
LS0tDQp0aXRsZTogIkRlc2NyaXB0aXZlIEFuYWx5c2lzIG9mIEJhbmsgTG9hbiBEYXRhIg0KYXV0aG9yOiAiQ2hlbmcgUGVuZyINCmRhdGU6ICIiDQpvdXRwdXQ6DQogIGh0bWxfZG9jdW1lbnQ6IA0KICAgIHRvYzogeWVzDQogICAgdG9jX2RlcHRoOiA0DQogICAgdG9jX2Zsb2F0OiB5ZXMNCiAgICBmaWdfd2lkdGg6IDYNCiAgICBudW1iZXJfc2VjdGlvbnM6IHllcw0KICAgIHRvY19jb2xsYXBzZWQ6IHllcw0KICAgIGNvZGVfZm9sZGluZzogaGlkZQ0KICAgIGNvZGVfZG93bmxvYWQ6IHllcw0KICAgIHNtb290aF9zY3JvbGw6IHRydWUNCiAgICB0aGVtZTogcmVhZGFibGUNCiAgICBmaWdfaGVpZ2h0OiA0DQogIHBkZl9kb2N1bWVudDogDQogICAgdG9jOiB5ZXMNCiAgICB0b2NfZGVwdGg6IDQNCiAgICBmaWdfY2FwdGlvbjogeWVzDQogICAgbnVtYmVyX3NlY3Rpb25zOiB5ZXMNCiAgICBmaWdfd2lkdGg6IDUNCiAgICBmaWdfaGVpZ2h0OiA0DQogIHdvcmRfZG9jdW1lbnQ6IA0KICAgIHRvYzogeWVzDQogICAgdG9jX2RlcHRoOiA0DQogICAgZmlnX2NhcHRpb246IHllcw0KICAgIGtlZXBfbWQ6IHllcw0KLS0tDQoNCg0KYGBgez1odG1sfQ0KPHN0eWxlIHR5cGU9InRleHQvY3NzIj4NCmgxLnRpdGxlIHsNCiAgZm9udC1zaXplOiAyNHB4Ow0KICBjb2xvcjogRGFya1JlZDsNCiAgdGV4dC1hbGlnbjogY2VudGVyOw0KfQ0KaDQuYXV0aG9yIHsgLyogSGVhZGVyIDQgLSBhbmQgdGhlIGF1dGhvciBhbmQgZGF0YSBoZWFkZXJzIHVzZSB0aGlzIHRvbyAgKi8NCiAgICBmb250LXNpemU6IDE4cHg7DQogIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOw0KICBjb2xvcjogRGFya1JlZDsNCiAgdGV4dC1hbGlnbjogY2VudGVyOw0KfQ0KaDQuZGF0ZSB7IC8qIEhlYWRlciA0IC0gYW5kIHRoZSBhdXRob3IgYW5kIGRhdGEgaGVhZGVycyB1c2UgdGhpcyB0b28gICovDQogIGZvbnQtc2l6ZTogMThweDsNCiAgZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iLCBUaW1lcywgc2VyaWY7DQogIGNvbG9yOiBEYXJrQmx1ZTsNCiAgdGV4dC1hbGlnbjogY2VudGVyOw0KfQ0KaDEgeyAvKiBIZWFkZXIgMyAtIGFuZCB0aGUgYXV0aG9yIGFuZCBkYXRhIGhlYWRlcnMgdXNlIHRoaXMgdG9vICAqLw0KICAgIGZvbnQtc2l6ZTogMjJweDsNCiAgICBmb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiIsIFRpbWVzLCBzZXJpZjsNCiAgICBjb2xvcjogZGFya3JlZDsNCiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7DQp9DQpoMiB7IC8qIEhlYWRlciAzIC0gYW5kIHRoZSBhdXRob3IgYW5kIGRhdGEgaGVhZGVycyB1c2UgdGhpcyB0b28gICovDQogICAgZm9udC1zaXplOiAxOHB4Ow0KICAgIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOw0KICAgIGNvbG9yOiBuYXZ5Ow0KICAgIHRleHQtYWxpZ246IGxlZnQ7DQp9DQoNCmgzIHsgLyogSGVhZGVyIDMgLSBhbmQgdGhlIGF1dGhvciBhbmQgZGF0YSBoZWFkZXJzIHVzZSB0aGlzIHRvbyAgKi8NCiAgICBmb250LXNpemU6IDE1cHg7DQogICAgZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iLCBUaW1lcywgc2VyaWY7DQogICAgY29sb3I6IG5hdnk7DQogICAgdGV4dC1hbGlnbjogbGVmdDsNCn0NCg0KaDQgeyAvKiBIZWFkZXIgNCAtIGFuZCB0aGUgYXV0aG9yIGFuZCBkYXRhIGhlYWRlcnMgdXNlIHRoaXMgdG9vICAqLw0KICAgIGZvbnQtc2l6ZTogMThweDsNCiAgICBmb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiIsIFRpbWVzLCBzZXJpZjsNCiAgICBjb2xvcjogZGFya3JlZDsNCiAgICB0ZXh0LWFsaWduOiBsZWZ0Ow0KfQ0KPC9zdHlsZT4NCmBgYA0KDQoNCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQ0KIyBjb2RlIGNodW5rIHNwZWNpZmllcyB3aGV0aGVyIHRoZSBSIGNvZGUsIHdhcm5pbmdzLCBhbmQgb3V0cHV0IA0KIyB3aWxsIGJlIGluY2x1ZGVkIGluIHRoZSBvdXRwdXQgZmlsZXMuDQppZiAoIXJlcXVpcmUoImtuaXRyIikpIHsNCiAgIGluc3RhbGwucGFja2FnZXMoImtuaXRyIikNCiAgIGxpYnJhcnkoa25pdHIpDQp9DQppZiAoIXJlcXVpcmUoImxlc3NSIikpIHsNCiAgIGluc3RhbGwucGFja2FnZXMoImxlc3NSIikNCiAgIGxpYnJhcnkobGVzc1IpDQp9DQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IFRSVUUsIA0KICAgICAgICAgICAgICAgICAgICAgIHdhcm5pbmcgPSBGQUxTRSwgIA0KICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IFRSVUUsDQogICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSA9IEZBTFNFLA0KICAgICAgICAgICAgICAgICAgICAgIGNvbW1lbnQgPSBOQQ0KICAgICAgICAgICAgICAgICAgICAgICkgICANCmBgYA0KDQoNCiMJQmFzaWMgQ29uY2VwdHMgb2YgU2FtcGxpbmcgRGVzaWduDQoNCmBgYHtyIGVjaG8gPSBGQUxTRSwgZmlnLmFsaWduPSdjZW50ZXInLCBvdXQud2lkdGg9IjUwJSIsIGZpZy5jYXA9IlNhbXBsaW5nIHBvcHVsYXRpb24uIn0NCmluY2x1ZGVfZ3JhcGhpY3MoImltZy9SYW5kb21TYW1wbGluZy5wbmciKQ0KYGBgDQoNClRoaXMgc2VjdGlvbiBpbnRyb2R1Y2VzIHRoZSBiYXNpYyBjb25jZXB0cyBvZiBzYW1wbGluZyBkZXNpZ24gYW5kIGFuYWx5c2lzLg0KDQoqKlBvcHVsYXRpb24qKjogIFRvdGFsIG9mIGl0ZW1zIGFib3V0IHdoaWNoIGluZm9ybWF0aW9uIGlzIGRlc2lyZWQuIEl0IGNhbiBiZSBjbGFzc2lmaWVkIGludG8gdHdvIGNhdGVnb3JpZXMgLSBmaW5pdGUgYW5kIGluZmluaXRlLiANCg0KKkZpbml0ZSBQb3B1bGF0aW9uKiAtIFRoZSBwb3B1bGF0aW9uIGlzIHNhaWQgdG8gYmUgZmluaXRlIGlmIGl0IGNvbnNpc3RzIG9mIGEgZml4ZWQgbnVtYmVyIG9mIGVsZW1lbnRzIHNvIHRoYXQgaXQgaXMgcG9zc2libGUgdG8gZW51bWVyYXRlIGluIGl0cyB0b3RhbGl0eS4gIA0KDQoqSW5maW5pdGUgcG9wdWxhdGlvbiogLSBUaGUgbnVtYmVyIG9mIGl0ZW1zIGlzIGluZmluaXRlLiANCg0KRnJvbSBwcmFjdGljYWwgY29uc2lkZXJhdGlvbiwgd2UgdXNlIHRoZSB0ZXJtIGluZmluaXRlIHBvcHVsYXRpb24gZm9yIGEgcG9wdWxhdGlvbiB0aGF0IGNhbm5vdCBiZSBlbnVtZXJhdGVkIGluIGEgcmVhc29uYWJsZSBwZXJpb2Qgb2YgdGltZS4gDQogDQogDQoqKlNhbXBsZSoqOiBJdCBpcyBwYXJ0IG9mIHRoZSBwb3B1bGF0aW9uIHRoYXQgcmVwcmVzZW50cyB0aGUgY2hhcmFjdGVyaXN0aWNzIG9mIHRoZSBwb3B1bGF0aW9uLg0KICANCioqU2FtcGxpbmcqKjogSXQgaXMgdGhlIHByb2Nlc3Mgb2Ygc2VsZWN0aW5nIHRoZSBzYW1wbGUgZm9yIGVzdGltYXRpbmcgdGhlIHBvcHVsYXRpb24gY2hhcmFjdGVyaXN0aWNzLiBJbiBvdGhlciB3b3JkcywgaXQgaXMgdGhlIHByb2Nlc3Mgb2Ygb2J0YWluaW5nIGluZm9ybWF0aW9uIGFib3V0IGFuIGVudGlyZSBwb3B1bGF0aW9uIGJ5IGV4YW1pbmluZyBvbmx5IGEgcGFydCBvZiBpdC4gDQogIA0KKipTYW1wbGluZyAgVW5pdCoqOiBBIHNhbXBsaW5nIHVuaXQgaXMgdGhlIGJhc2ljIHVuaXQgb3IgaW5kaXZpZHVhbCBlbGVtZW50IHNlbGVjdGVkIGZyb20gYSBwb3B1bGF0aW9uIGZvciBpbmNsdXNpb24gaW4gYSBzYW1wbGUgZHVyaW5nIHRoZSBwcm9jZXNzIG9mIHNhbXBsaW5nLiBJdCBpcyB0aGUgc21hbGxlc3QgZW50aXR5IHRoYXQgY2FuIGJlIGNob3NlbiBvciBtZWFzdXJlZCBpbiBhIHN0dWR5LiBUaGUgY2hvaWNlIG9mIHNhbXBsaW5nIHVuaXQgZGVwZW5kcyBvbiB0aGUgcmVzZWFyY2ggb2JqZWN0aXZlIGFuZCB0aGUgcG9wdWxhdGlvbiBiZWluZyBzdHVkaWVkLiBTb21lIGV4YW1wbGVzIG9iIHNhbXBsaW5nIHVuaXRzIGFyZSBnaXZlbiBiZWxvdw0KDQoqIElmIHdlIGFyZSBzdHVkeWluZyB0aGUgYXZlcmFnZSBpbmNvbWUgb2YgaG91c2Vob2xkcyBpbiBhIGNpdHksIHRoZSBzYW1wbGluZyB1bml0IGNvdWxkIGJlIGEgc2luZ2xlIGhvdXNlaG9sZC4NCiogSWYgd2UgYXJlIHN0dWR5aW5nIHRoZSB5aWVsZCBvZiB3aGVhdCBpbiBhIHJlZ2lvbiwgdGhlIHNhbXBsaW5nIHVuaXQgY291bGQgYmUgYSBzaW5nbGUgcGxvdCBvZiBsYW5kIHdoZXJlIHdoZWF0IGlzIGdyb3duLg0KKiBJZiB3ZSBhcmUgaW5zcGVjdGluZyB0aGUgcXVhbGl0eSBvZiBsaWdodCBidWxicyBwcm9kdWNlZCBpbiBhIGZhY3RvcnksIHRoZSBzYW1wbGluZyB1bml0IGNvdWxkIGJlIGEgc2luZ2xlIGxpZ2h0IGJ1bGIuDQoqIElmIHdlIGFyZSBzdHVkeWluZyB0aGUgcGVyZm9ybWFuY2Ugb2Ygc3R1ZGVudHMgaW4gYSBzY2hvb2wgZGlzdHJpY3QsIHRoZSBzYW1wbGluZyB1bml0IGNvdWxkIGJlIGEgc2luZ2xlIHN0dWRlbnQuDQoqIElmIHdlIGFyZSByZXNlYXJjaGluZyB0aGUgcHJldmFsZW5jZSBvZiBhIGRpc2Vhc2UgaW4gYSBjb21tdW5pdHksIHRoZSBzYW1wbGluZyB1bml0IGNvdWxkIGJlIGEgc2luZ2xlIGluZGl2aWR1YWwgb3IgcGF0aWVudC4NCiogSWYgd2UgYXJlIHN0dWR5aW5nIHRoZSBkaXZlcnNpdHkgb2YgcGxhbnQgc3BlY2llcyBpbiBhIGZvcmVzdCwgdGhlIHNhbXBsaW5nIHVuaXQgY291bGQgYmUgYSBxdWFkcmF0IChhIHNtYWxsLCBkZWZpbmVkIGFyZWEgb2YgbGFuZCkuDQoqIElmIHdlIGFyZSBhbmFseXppbmcgY29uc3VtZXIgcHJlZmVyZW5jZXMgZm9yIGEgcHJvZHVjdCwgdGhlIHNhbXBsaW5nIHVuaXQgY291bGQgYmUgYSBzaW5nbGUgY29uc3VtZXIgb3IgaG91c2Vob2xkLg0KICANCiAgDQogIA0KKipTYW1wbGluZyBGcmFtZSoqOiAgQSBzYW1wbGluZyBmcmFtZSBpcyBhIGxpc3Qgb3IgcmVwcmVzZW50YXRpb24gb2YgYWxsIHRoZSBlbGVtZW50cyBvciB1bml0cyBpbiBhIHBvcHVsYXRpb24gZnJvbSB3aGljaCBhIHNhbXBsZSBpcyBkcmF3biBmb3IgcmVzZWFyY2ggb3IgYW5hbHlzaXMuIEl0IHNlcnZlcyBhcyB0aGUgZm91bmRhdGlvbiBmb3Igc2VsZWN0aW5nIGEgc2FtcGxlIGFuZCBlbnN1cmVzIHRoYXQgZXZlcnkgbWVtYmVyIG9mIHRoZSBwb3B1bGF0aW9uIGhhcyBhIGtub3duLCBub24temVybyBjaGFuY2Ugb2YgYmVpbmcgaW5jbHVkZWQgaW4gdGhlIHNhbXBsZS4gQSB3ZWxsLWRlZmluZWQgc2FtcGxpbmcgZnJhbWUgaXMgY3J1Y2lhbCBmb3IgYWNoaWV2aW5nIGFjY3VyYXRlIGFuZCB1bmJpYXNlZCByZXN1bHRzIGluIHJlc2VhcmNoLiBTb21lIGV4YW1wbGVzIGFib3V0IHNhbXBsaW5nIGZyYW1lIGFyZSBnaXZlbiBiZWxvdzoNCg0KKiBJZiBhIHJlc2VhcmNoZXIgaXMgc3R1ZHlpbmcgdGhlIG9waW5pb25zIG9mIHJlc2lkZW50cyBpbiBhIGNpdHksIHRoZXkgbWlnaHQgdXNlIGEgdGVsZXBob25lIGRpcmVjdG9yeSBhcyB0aGUgc2FtcGxpbmcgZnJhbWUgdG8gcmFuZG9tbHkgc2VsZWN0IHBhcnRpY2lwYW50cy4NCiogRm9yIGEgcG9saXRpY2FsIHN1cnZleSwgdGhlIHZvdGVyIHJlZ2lzdHJhdGlvbiBsaXN0IGNhbiBzZXJ2ZSBhcyB0aGUgc2FtcGxpbmcgZnJhbWUgdG8gZW5zdXJlIHRoYXQgYWxsIGVsaWdpYmxlIHZvdGVycyBhcmUgaW5jbHVkZWQuDQoqIEluIGEgY29tcGFueSwgdGhlIEhSIGRlcGFydG1lbnQncyBlbXBsb3llZSBkYXRhYmFzZSBjYW4gYmUgdXNlZCBhcyBhIHNhbXBsaW5nIGZyYW1lIHRvIHNlbGVjdCBlbXBsb3llZXMgZm9yIGEgd29ya3BsYWNlIHNhdGlzZmFjdGlvbiBzdXJ2ZXkuDQoqIEEgcmVzZWFyY2hlciBzdHVkeWluZyBzdHVkZW50IHBlcmZvcm1hbmNlIG1pZ2h0IHVzZSBzY2hvb2wgZW5yb2xsbWVudCByZWNvcmRzIGFzIHRoZSBzYW1wbGluZyBmcmFtZSB0byBzZWxlY3Qgc3R1ZGVudHMgZm9yIHRoZWlyIHN0dWR5Lg0KKiBBIGJ1c2luZXNzIGNvbmR1Y3RpbmcgbWFya2V0IHJlc2VhcmNoIG1pZ2h0IHVzZSBpdHMgY3VzdG9tZXIgZGF0YWJhc2UgYXMgdGhlIHNhbXBsaW5nIGZyYW1lIHRvIHNlbGVjdCBwYXJ0aWNpcGFudHMgZm9yIGEgc3VydmV5Lg0KKiBJbiBlY29sb2dpY2FsIHN0dWRpZXMsIGEgbWFwIG9mIGEgcmVnaW9uIGNhbiBzZXJ2ZSBhcyB0aGUgc2FtcGxpbmcgZnJhbWUgdG8gc2VsZWN0IHNwZWNpZmljIGxvY2F0aW9ucyBvciBwbG90cyBmb3IgZGF0YSBjb2xsZWN0aW9uLg0KDQoNCiAgDQoqKlNhbXBsZSBTdXJ2ZXkqKjogIEFuIGludmVzdGlnYXRpb24gaW4gd2hpY2ggZWxhYm9yYXRlIGluZm9ybWF0aW9uIGlzIGNvbGxlY3RlZCBvbiBhIHNhbXBsZSBiYXNpcyBpcyBrbm93biBhcyBhIHNhbXBsZSBzdXJ2ZXkuIA0KICANCioqU3RhdGlzdGljKio6IENoYXJhY3RlcmlzdGljcyBvZiB0aGUgc2FtcGxlLiBGb3IgZXhhbXBsZSwgc2FtcGxlIE1lYW4sIHByb3BvcnRpb24sIGV0Yy4gDQogIA0KKipQYXJhbWV0ZXIqKjogQ2hhcmFjdGVyaXN0aWNzIG9mIHRoZSBwb3B1bGF0aW9uLiBGb3IgZXhhbXBsZSwgcG9wdWxhdGlvbiBNZWFuLCBwcm9wb3J0aW9uLCBldGMuIA0KICANCioqVGFyZ2V0IFBvcHVsYXRpb24qKjogIEEgdGFyZ2V0IHBvcHVsYXRpb24gaXMgdGhlIGVudGlyZSBncm91cCBhYm91dCB3aGljaCBpbmZvcm1hdGlvbiBpcyBkZXNpcmVkIGFuZCBjb25jbHVzaW9ucyBhcmUgbWFkZS4gDQogIA0KKipTYW1wbGVkIFBvcHVsYXRpb24qKjogIFRoZSBwb3B1bGF0aW9uLCB0aGF0IHdlIGFjdHVhbGx5IHNhbXBsZSwgaXMgdGhlIA0Kc2FtcGxlZCBwb3B1bGF0aW9uLiBJdCBpcyBhbHNvIGNhbGxlZCB0aGUgc3VydmV5IHBvcHVsYXRpb24uDQoNCiMgUHVycGxlcyBvZiBTYW1wbGluZw0KVGhlIGJhc2ljIHB1cnBvc2Ugb2Ygc2FtcGxpbmcgaXMgdG8gcHJvdmlkZSBhbiBlc3RpbWF0ZSBvZiB0aGUgcG9wdWxhdGlvbiBwYXJhbWV0ZXIgYW5kIHRvIHRlc3QgdGhlIGh5cG90aGVzaXMuIFRoZSBhZHZhbnRhZ2VzIG9mIHNhbXBsaW5nIGFyZSAtIA0KIA0KKglTYXZlIHRpbWUgYW5kIG1vbmV5LiAgDQoNCioJRW5hYmxlIGNvbGxlY3Rpb24gb2YgY29tcHJlaGVuc2l2ZSBkYXRhLiAgDQogDQoqCUVuYWJsZSBtb3JlIGFjY3VyYXRlIG1lYXN1cmVtZW50IGFzIGl0IGlzIGNvbmR1Y3RlZCBieSB0cmFpbmVkIGFuZCBleHBlcmllbmNlZCBpbnZlc3RpZ2F0b3JzLiAgDQogDQoqIFNhbXBsaW5nIHJlbWFpbnMgdGhlIG9ubHkgd2F5IHdoZW4gdGhlIHBvcHVsYXRpb24gY29udGFpbnMgaW5maW5pdGVseSBtYW55IG1lbWJlcnMuIA0KDQoqCUluIGNlcnRhaW4gc2l0dWF0aW9ucywgc2FtcGxpbmcgaXMgdGhlIG9ubHkgd2F5IG9mIGRhdGEgY29sbGVjdGlvbi4gRm9yIGV4YW1wbGUsIGluIHRlc3RpbmcgdGhlIHBhdGhvbG9naWNhbCBzdGF0dXMgb2YgYmxvb2QsIGJvaWxpbmcgc3RhdHVzIG9mIHJpY2UsIGV0Yy4gDQogDQoqCUl0IHByb3ZpZGVzIGEgdmFsaWQgZXN0aW1hdGlvbiBvZiBzYW1wbGluZyBlcnJvci4NCg0KIyBTYW1wbGluZyBQcm9jZXNzDQoNClRoZSBzYW1wbGluZyBwcm9jZXNzIGNvbXByaXNlcyBzZXZlcmFsIHN0YWdlcw0KDQoxLiBEZWZpbmUgdGhlIHBvcHVsYXRpb24uIA0KDQoyLiBTcGVjaWZ5aW5nIHRoZSBzYW1wbGluZyBmcmFtZS4gDQoNCjMuIFNwZWNpZnlpbmcgdGhlIHNhbXBsaW5nIHVuaXQuIA0KDQo0LiBTZWxlY3Rpb24gb2YgdGhlIHNhbXBsaW5nIG1ldGhvZC4gDQoNCjUuIERldGVybWluYXRpb24gb2Ygc2FtcGxlIHNpemUuIA0KDQo2LiBTcGVjaWZ5IHRoZSBzYW1wbGluZyBwbGFuLiANCg0KNy4gU2VsZWN0aW5nIHRoZSBzYW1wbGUuIA0KIA0KIyMgRGVmaW5pbmcgdGhlIFBvcHVsYXRpb24gDQoNClRoZSBwb3B1bGF0aW9uIG11c3QgYmUgZGVmaW5lZCBpbiB0ZXJtcyBvZiBlbGVtZW50cywgc2FtcGxpbmcgdW5pdHMsIGV4dGVudCwgYW5kIHRpbWUuIEJlY2F1c2UgdGhlcmUgaXMgdmVyeSByYXJlbHkgZW5vdWdoIHRpbWUgb3IgbW9uZXkgdG8gZ2F0aGVyIGluZm9ybWF0aW9uIGZyb20gZXZlcnlvbmUgb3IgZXZlcnl0aGluZyBpbiBhIHBvcHVsYXRpb24sIHRoZSBnb2FsIGJlY29tZXMgZmluZGluZyBhIHJlcHJlc2VudGF0aXZlIHNhbXBsZSAob3Igc3Vic2V0KSBvZiB0aGF0IHBvcHVsYXRpb24uIA0KIA0KIyMgU3BlY2lmeWluZyBTYW1wbGluZyBGcmFtZQ0KDQpBcyBhIHJlbWVkeSwgd2Ugc2VlayBhIHNhbXBsaW5nIGZyYW1lIHRoYXQgaGFzIHRoZSBwcm9wZXJ0eSB0aGF0IHdlIGNhbiBpZGVudGlmeSBldmVyeSBzaW5nbGUgZWxlbWVudCBhbmQgaW5jbHVkZSBhbnkgaW4gb3VyIHNhbXBsZS4gVGhlIG1vc3Qgc3RyYWlnaHRmb3J3YXJkIHR5cGUgb2YgZnJhbWUgaXMgYSBsaXN0IG9mIGVsZW1lbnRzIG9mIHRoZSBwb3B1bGF0aW9uICAocHJlZmVyYWJseSB0aGUgZW50aXJlIHBvcHVsYXRpb24pIHdpdGggYXBwcm9wcmlhdGUgY29udGFjdCBpbmZvcm1hdGlvbi4NCg0KQSBzYW1wbGluZyBmcmFtZSBtYXkgYmUgYSB0ZWxlcGhvbmUgYm9vaywgYSBjaXR5IGRpcmVjdG9yeSwgYW4gZW1wbG95ZWUgcm9zdGVyLCBhIGxpc3Rpbmcgb2YgYWxsIHN0dWRlbnRzIGF0dGVuZGluZyBhIHVuaXZlcnNpdHksIG9yIGEgbGlzdCBvZiBhbGwgcG9zc2libGUgcGhvbmUgbnVtYmVycy4gDQogDQojIyBTcGVjaWZ5aW5nIFNhbXBsaW5nIFVuaXQNCg0KQSBzYW1wbGluZyB1bml0IGlzIGEgYmFzaWMgdW5pdCB0aGF0IGNvbnRhaW5zIGEgc2luZ2xlIGVsZW1lbnQgb3IgYSBncm91cCBvZiBlbGVtZW50cyBvZiB0aGUgcG9wdWxhdGlvbiB0byBiZSBzYW1wbGVkLiBUaGUgc2FtcGxpbmcgdW5pdCBzZWxlY3RlZCBpcyBvZnRlbiBkZXBlbmRlbnQgdXBvbiB0aGUgc2FtcGxpbmcgZnJhbWUuIElmIGEgcmVsYXRpdmVseSBjb21wbGV0ZSBhbmQgYWNjdXJhdGUgbGlzdGluZyBvZiBlbGVtZW50cyBpcyBhdmFpbGFibGUgKGUuZy4gcmVnaXN0ZXIgb2YgcHVyY2hhc2luZyBhZ2VudHMpIG9uZSBtYXkgd2VsbCB3YW50IHRvIHNhbXBsZSB0aGVtIGRpcmVjdGx5LiBJZiBubyBzdWNoIHJlZ2lzdGVyIGlzIGF2YWlsYWJsZSwgb25lIG1heSBuZWVkIHRvIHNhbXBsZSBjb21wYW5pZXMgYXMgdGhlIGJhc2ljIHNhbXBsaW5nIHVuaXQuICANCiAgDQojIyBTZWxlY3RpbmcgU2FtcGxpbmcgTWV0aG9kDQoNClRoZSBzYW1wbGluZyBtZXRob2Qgb3V0bGluZXMgdGhlIHdheSBpbiB3aGljaCB0aGUgc2FtcGxlIHVuaXRzIGFyZSB0byBiZSANCnNlbGVjdGVkLiBUaGUgY2hvaWNlIG9mIHRoZSBzYW1wbGluZyBtZXRob2QgaXMgaW5mbHVlbmNlZCBieSB0aGUgb2JqZWN0aXZlcyBvZiB0aGUgcmVzZWFyY2gsIGF2YWlsYWJpbGl0eSBvZiBmaW5hbmNpYWwgcmVzb3VyY2VzLCB0aW1lIGNvbnN0cmFpbnRzLCBhbmQgdGhlIG5hdHVyZSBvZiB0aGUgcHJvYmxlbSB0byBiZSBpbnZlc3RpZ2F0ZWQuIEFsbCBzYW1wbGluZyBtZXRob2RzIGNhbiBiZSBncm91cGVkIHVuZGVyIHR3byBkaXN0aW5jdCBoZWFkcywgdGhhdCBpcywgcHJvYmFiaWxpdHkgYW5kIG5vbi1wcm9iYWJpbGl0eSBzYW1wbGluZy4gDQogDQojIyBEZXRlcm1pbmluZyBTYW1wbGUgU2l6ZSANCg0KVGhlIHNhbXBsZSBzaXplIGNhbGN1bGF0aW9uIGRlcGVuZHMgcHJpbWFyaWx5IG9uIHRoZSB0eXBlIG9mIHNhbXBsaW5nIGRlc2lnbiB1c2VkLiBIb3dldmVyLCBmb3IgYWxsIHNhbXBsaW5nIGRlc2lnbnMsIHRoZSBlc3RpbWF0ZXMgZm9yIHRoZSBleHBlY3RlZCBzYW1wbGUgY2hhcmFjdGVyaXN0aWNzIChlLmcuIG1lYW4sIHByb3BvcnRpb24sIG9yIHRvdGFsKSBkZXNpcmVkIGxldmVsIG9mIGNlcnRhaW50eSwgYW5kIHRoZSBsZXZlbCBvZiBwcmVjaXNpb24gbXVzdCBiZSBjbGVhcmx5IHNwZWNpZmllZCBpbiBhZHZhbmNlLiBUaGUgc3RhdGVtZW50IG9mIHRoZSBwcmVjaXNpb24gZGVzaXJlZCBtaWdodCBiZSBtYWRlIGJ5IGdpdmluZyB0aGUgYW1vdW50IG9mIGVycm9yIHRoYXQgd2UgYXJlIHdpbGxpbmcgdG8gdG9sZXJhdGUgaW4gdGhlIHJlc3VsdGluZyBlc3RpbWF0ZXMuIENvbW1vbiBsZXZlbHMgb2YgcHJlY2lzaW9uIGFyZSA1JSBhbmQgMTAlLiANCiANCiMjIFNwZWNpZnlpbmcgU2FtcGxpbmcgUGxhbg0KDQpJbiB0aGlzIHN0ZXAsIHRoZSBzcGVjaWZpY2F0aW9ucyBhbmQgZGVjaXNpb25zIHJlZ2FyZGluZyB0aGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIHJlc2VhcmNoIHByb2Nlc3MgYXJlIG91dGxpbmVkLiBBcyB0aGUgaW50ZXJ2aWV3ZXJzIGFuZCB0aGVpciBjby13b3JrZXJzIHdpbGwgYmUgb24gZmllbGQgZHV0eSBtb3N0IG9mIHRoZSB0aW1lLCBhIHByb3BlciBzcGVjaWZpY2F0aW9uIG9mIHRoZSBzYW1wbGluZyBwbGFucyB3b3VsZCBtYWtlIHRoZWlyIHdvcmsgZWFzeSwgYW5kIHRoZXkgd291bGQgbm90IGhhdmUgdG8gcmV2ZXJ0IHRvIG9wZXJhdGlvbmFsIHByb2JsZW1zLg0KDQojIyBTZWxlY3RpbmcgdGhlIFNhbXBsZQ0KDQpUaGUgZmluYWwgc3RlcCBpbiB0aGUgc2FtcGxpbmcgcHJvY2VzcyBpcyB0aGUgYWN0dWFsIHNlbGVjdGlvbiBvZiB0aGUgc2FtcGxlIGVsZW1lbnRzLiBUaGlzIHJlcXVpcmVzIGEgc3Vic3RhbnRpYWwgYW1vdW50IG9mIG9mZmljZSBhbmQgZmllbGR3b3JrLCBwYXJ0aWN1bGFybHkgaWYgcGVyc29uYWwgaW50ZXJ2aWV3cyBhcmUgaW52b2x2ZWQuIA0KDQojIFNhbXBsaW5nIE1ldGhvZHMNCg0KVGhlcmUgYXJlIHR3byBiYXNpYyBhcHByb2FjaGVzIHRvIHNhbXBsaW5nOiBQcm9iYWJpbGl0eSBTYW1wbGluZyBhbmQgTm9uLXByb2JhYmlsaXR5IFNhbXBsaW5nLiBXZSBvbmx5IGZvY3VzIG9uIG1ldGhvZHMgb2YgcHJvYmFiaWxpdHkgc2FtcGxpbmcgcGxhbnMuICANCg0KUHJvYmFiaWxpdHkgc2FtcGxpbmcgaXMgYWxzbyBrbm93biBhcyByYW5kb20gc2FtcGxpbmcgb3IgY2hhbmNlIHNhbXBsaW5nLiBJbiB0aGlzLCAqc2FtcGxlIGlzIHRha2VuIGluIHN1Y2ggYSBtYW5uZXIgdGhhdCBlYWNoIGFuZCBldmVyeSB1bml0IG9mIHRoZSBwb3B1bGF0aW9uIGhhcyBhbiBlcXVhbCBhbmQgcG9zaXRpdmUgY2hhbmNlIG9mIGJlaW5nIHNlbGVjdGVkKi4gSW4gdGhpcyB3YXksIGl0IGlzIGVuc3VyZWQgdGhhdCB0aGUgc2FtcGxlIHdvdWxkIHRydWx5IHJlcHJlc2VudCB0aGUgb3ZlcmFsbCBwb3B1bGF0aW9uLiBQcm9iYWJpbGl0eSBzYW1wbGluZyBjYW4gYmUgYWNoaWV2ZWQgYnkgcmFuZG9tIHNlbGVjdGlvbiBvZiB0aGUgc2FtcGxlIGFtb25nIGFsbCB0aGUgdW5pdHMgb2YgdGhlIHBvcHVsYXRpb24uIE1ham9yIHJhbmRvbSBzYW1wbGluZyBwcm9jZWR1cmVzIGFyZSAgIA0KDQoqCVNpbXBsZSBSYW5kb20gU2FtcGxlICAgDQoqCVN5c3RlbWF0aWMgUmFuZG9tIFNhbXBsZSAgIA0KKglTdHJhdGlmaWVkIFJhbmRvbSBTYW1wbGUsIGFuZCAgIA0KKglDbHVzdGVyLyBNdWx0aXN0YWdlIFNhbXBsZS4gIA0KDQojIyBTaW1wbGUgUmFuZG9tIFNhbXBsZQ0KIA0KSW4gYSBzaW1wbGUgcmFuZG9tIHZhcmlhYmxlIChTUlMpLCBlYWNoIG1lbWJlciBvZiB0aGUgcG9wdWxhdGlvbiBpcyBudW1iZXJlZC4gVGhlbiwgYSBnaXZlbiBzaXplIG9mIHRoZSBzYW1wbGUgaXMgZHJhd24gd2l0aCB0aGUgaGVscCBvZiBhIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yIChjaGFydCkuIEl0IGlzIHJlbGF0aXZlbHkgc2ltcGxlIHRvIGltcGxlbWVudCBidXQgdGhlIGZpbmFsIHNhbXBsZSBtYXkgbWlzcyBvdXQgb24gc21hbGwgc3ViZ3JvdXBzLiAgDQoNCiAqQWR2YW50YWdlcyo6IFRoZSBzYW1wbGUgd2lsbCBiZSBmcmVlIGZyb20gQmlhcyAoaS5lLiBpdOKAmXMgcmFuZG9tISkuDQogDQoqRGlzYWR2YW50YWdlcyo6IFNSUyBpcyBkaWZmaWN1bHQgdG8gb2J0YWluIGR1ZSB0byBpdHMgcmFuZG9tbmVzcy4gSWYgdGhlIHNhbXBsZSBzaXplIGlzIHNtYWxsLCBpdCBjb3VsZCBnZW5lcmF0ZSBhIHJlc3VsdCB0aGF0IGlzIGNvbXBsZXRlbHkgb2ZmIHRoZSB0cnVlIHZhbHVlIG9mIHRoZSBwYXJhbWV0ZXIgYW5kIGlzIGFsc28gZGlmZmljdWx0IHRvIHNwb3QuIEluY3JlYXNpbmcgdGhlIHNhbXBsZSBzaXplIGlzIHRoZSBiZXN0IHdheSB0byBlcmFkaWNhdGUgdGhpcyBwcm9ibGVtLiAgDQoNCiMjIFN5c3RlbWF0aWMgIFJhbmRvbSAgU2FtcGxlICANCg0KSXQgYWxzbyByZXF1aXJlcyBudW1iZXJpbmcgdGhlIGVudGlyZSBwb3B1bGF0aW9uLiBUaGVuIGV2ZXJ5IG50aCBudW1iZXIgKHNheSBldmVyeSA1dGggb3IgMTB0aCBudW1iZXIsIGFzIHRoZSBjYXNlIG1heSBiZSkgaXMgc2VsZWN0ZWQgdG8gY29uc3RpdHV0ZSB0aGUgc2FtcGxlLiBJdCBpcyBlYXNpZXIgYW5kIG1vcmUgbGlrZWx5IHRvIHJlcHJlc2VudCBkaWZmZXJlbnQgc3ViZ3JvdXBzLiAgDQoNCiAqQWR2YW50YWdlcyo6IENhbiBlbGltaW5hdGUgb3RoZXIgc291cmNlcyBvZiBiaWFzLiANCiANCipEaXNhZHZhbnRhZ2VzKjogVGhpcyBjYW4gaW50cm9kdWNlIGJpYXMgd2hlcmUgdGhlIHBhdHRlcm4gdXNlZCBmb3IgdGhlIHNhbXBsZXMgY29pbmNpZGVzIHdpdGggYSBwYXR0ZXJuIGluIHRoZSBwb3B1bGF0aW9uLiANCg0KIyMgU3RyYXRpZmllZCBSYW5kb20gU2FtcGxlIA0KDQpBdCBmaXJzdCwgdGhlIHBvcHVsYXRpb24gaXMgZGl2aWRlZCBpbnRvIGdyb3VwcyBvciBzdHJhdGEgZWFjaCBvZiB3aGljaCBpcyBob21vZ2VuZW91cyB3aXRoIHJlc3BlY3QgdG8gdGhlIGdpdmVuIGNoYXJhY3RlcmlzdGljIGZlYXR1cmUuICBGcm9tIGVhY2ggc3RyYXR1bSwgdGhlbiwgc2FtcGxlcyBhcmUgZHJhd24gYXQgcmFuZG9tLiBUaGlzIGlzIGNhbGxlZCBzdHJhdGlmaWVkIHJhbmRvbSBzYW1wbGluZy4gRm9yIGV4YW1wbGUsIHdpdGggcmVzcGVjdCB0byB0aGUgbGV2ZWwgb2Ygc29jaW8tZWNvbm9taWMgc3RhdHVzLCB0aGUgcG9wdWxhdGlvbiBtYXkgZmlyc3QgYmUgZ3JvdXBlZCBpbiBzdWNoIHN0cmF0YSBhcyBoaWdoLCBtaWRkbGUsIGxvdywgYW5kIHZlcnkgbG93IHNvY2lvLWVjb25vbWljIGxldmVscyBhcyBwZXIgcHJlLWRldGVybWluZWQgY3JpdGVyaWEsIGFuZCBhIHJhbmRvbSBzYW1wbGUgZHJhd24gZnJvbSBlYWNoIGdyb3VwLg0KDQogVGhlIHNhbXBsZSBzaXplIGZvciBlYWNoIHN1Yi1ncm91cCBjYW4gYmUgZml4ZWQgdG8gZ2V0IGEgcmVwcmVzZW50YXRpdmUgc2FtcGxlLiBUaGlzIHdheSwgaXQgaXMgcG9zc2libGUgdGhhdCBkaWZmZXJlbnQgY2F0ZWdvcmllcyBpbiB0aGUgcG9wdWxhdGlvbiBhcmUgZmFpcmx5IHJlcHJlc2VudGVkIGluIHRoZSBzYW1wbGUsICB3aGljaCBjb3VsZCBoYXZlIGJlZW4gbGVmdCBvdXQgb3RoZXJ3aXNlIGluIGEgc2ltcGxlIHJhbmRvbSBzYW1wbGUuIA0KIA0KICpBZHZhbnRhZ2VzKjogICBZaWVsZHMgbW9yZSBhY2N1cmF0ZSByZXN1bHRzIHRoYW4gc2ltcGxlIHJhbmRvbSBzYW1wbGluZy4gIA0KQ2FuIHNob3cgZGlmZmVyZW50IHRlbmRlbmNpZXMgd2l0aGluIGVhY2ggY2F0ZWdvcnkgKGUuZy4gbWVuIGFuZCB3b21lbikuICANCipEaXNhZHZhbnRhZ2VzKjogICBOb3RoaW5nIG1ham9yLCBoZW5jZSBpdOKAmXMgdXNlZCBhIGxvdC4gIA0KIA0KQXMgd2l0aCBzdHJhdGlmaWVkIHNhbXBsZXMsIHRoZSBwb3B1bGF0aW9uIGlzIGJyb2tlbiBkb3duIGludG8gZGlmZmVyZW50IGNhdGVnb3JpZXMuIEhvd2V2ZXIsIHRoZSBzaXplIG9mIHRoZSBzYW1wbGUgb2YgZWFjaCBjYXRlZ29yeSBkb2VzIG5vdCByZWZsZWN0IHRoZSBwb3B1bGF0aW9uIGFzIGEgd2hvbGUuIFRoZSBRdW90YSBzYW1wbGluZyB0ZWNobmlxdWUgY2FuIGJlICB1c2VkIHdoZXJlIGFuIHVucmVwcmVzZW50YXRpdmUgc2FtcGxlIGlzIGRlc2lyYWJsZSAoZS5nLiB5b3UgbWlnaHQgd2FudCAgdG8gaW50ZXJ2aWV3IG1vcmUgY2hpbGRyZW4gdGhhbiBhZHVsdHMgZm9yIGEgc3VydmV5IG9uIGNvbXB1dGVyIGdhbWVzKSwgIG9yIHdoZXJlIGl0IHdvdWxkIGJlIHRvbyBkaWZmaWN1bHQgdG8gdW5kZXJ0YWtlIGEgc3RyYXRpZmllZCBzYW1wbGUNCg0KIyMgQ2x1c3Rlci8gTXVsdGlzdGFnZSBTYW1wbGUNCg0KSW4gc29tZSBjYXNlcywgdGhlIHNlbGVjdGlvbiBvZiB1bml0cyBtYXkgcGFzcyB0aHJvdWdoIHZhcmlvdXMgc3RhZ2VzLCBiZWZvcmUgeW91IGZpbmFsbHkgcmVhY2ggeW91ciBzYW1wbGUgb2Ygc3R1ZHkuIEZvciB0aGlzLCBhIFN0YXRlLCBmb3IgZXhhbXBsZSwgbWF5IGJlIGRpdmlkZWQgaW50byBkaXN0cmljdHMsIGRpc3RyaWN0cyBpbnRvIGJsb2NrcywgYmxvY2tzIGludG8gdmlsbGFnZXMsIGFuZCB2aWxsYWdlcyBpbnRvIGlkZW50aWZpYWJsZSBncm91cHMgb2YgcGVvcGxlLCBhbmQgdGhlbiB0aGUgcmFuZG9tIG9yIHF1b3RhIHNhbXBsZSBmcm9tIGVhY2ggZ3JvdXAuIA0KDQpGb3IgZXhhbXBsZSwgdGFraW5nIGEgcmFuZG9tIHNlbGVjdGlvbiBvZiAzIG91dCBvZiAxNSBkaXN0cmljdHMgb2YgYSBTdGF0ZSwgNiBibG9ja3MgZnJvbSBlYWNoIHNlbGVjdGVkIGRpc3RyaWN0LCAxMCB2aWxsYWdlcyBmcm9tIGVhY2ggc2VsZWN0ZWQgYmxvY2ssIGFuZCAyMCBob3VzZWhvbGRzIGZyb20gZWFjaCBzZWxlY3RlZCB2aWxsYWdlLCB0b3RhbGluZyAzNjAwIHJlc3BvbmRlbnRzLiBUaGlzIGRlc2lnbiBpcyB1c2VkIGZvciBsYXJnZS1zY2FsZSBzdXJ2ZXlzIHNwcmVhZCBvdmVyIGxhcmdlIGFyZWFzLg0KDQpUaGUgYWR2YW50YWdlIGlzIHRoYXQgaXQgbmVlZHMgYSBkZXRhaWxlZCBzYW1wbGluZyBmcmFtZSBmb3Igc2VsZWN0ZWQgY2x1c3RlcnMgb25seSByYXRoZXIgdGhhbiBmb3IgdGhlIGVudGlyZSB0YXJnZXQgYXJlYS4gVGhlcmUgYXJlIHNhdmluZ3MgaW4gdHJhdmVsIGNvc3RzIGFuZCB0aW1lIGFzIHdlbGwuIA0KDQpIb3dldmVyLCB0aGVyZSBpcyBhIHJpc2sgb2YgbWlzc2luZyBpbXBvcnRhbnQgc3ViLWdyb3VwcyBhbmQgbm90IGhhdmluZyBhIGNvbXBsZXRlIHJlcHJlc2VudGF0aW9uIG9mIHRoZSB0YXJnZXQgcG9wdWxhdGlvbi4gDQoNCipBZHZhbnRhZ2VzKjogIExlc3MgZXhwZW5zaXZlIGFuZCB0aW1lLWNvbnN1bWluZyB0aGFuIGEgZnVsbHkgcmFuZG9tIHNhbXBsZS4gQ2FuIHNob3cg4oCYcmVnaW9uYWzigJkgdmFyaWF0aW9ucy4gIA0KDQoqRGlzYWR2YW50YWdlcyo6ICBOb3QgYSBnZW51aW5lIHJhbmRvbSBzYW1wbGUuIExpa2VseSB0byB5aWVsZCBhIGJpYXNlZCByZXN1bHQgKGVzcGVjaWFsbHkgaWYgb25seSBhIGZldyBjbHVzdGVycyBhcmUgc2FtcGxlZCkuIA0KDQojIFNhbXBsaW5nIEVycm9yIGFuZCBTdXJ2ZXkgQmlhcw0KDQpTdXJ2ZXkgcmVzdWx0cyBhcmUgdHlwaWNhbGx5IHN1YmplY3QgdG8gc29tZSBlcnJvci4gVG90YWwgZXJyb3JzIGNhbiBiZSBjbGFzc2lmaWVkIGludG8gc2FtcGxpbmcgZXJyb3JzIGFuZCBub24tc2FtcGxpbmcgZXJyb3JzLiBUaGUgdGVybSDigJhlcnJvcuKAmSBoZXJlIGluY2x1ZGVzIHN5c3RlbWF0aWMgYmlhc2VzIGFzIHdlbGwgYXMgcmFuZG9tIGVycm9ycy4gDQoNCiMjIFNhbXBsaW5nIGVycm9ycyBhbmQgYmlhc2VzOiANCg0KU2FtcGxpbmcgZXJyb3JzIGFuZCBiaWFzZXMgYXJlIGluZHVjZWQgYnkgdGhlIHNhbXBsZSBkZXNpZ24uICBUaGV5IGluY2x1ZGUNCg0KKiBTZWxlY3Rpb24gYmlhczogV2hlbiB0aGUgdHJ1ZSBzZWxlY3Rpb24gcHJvYmFiaWxpdGllcyBkaWZmZXIgZnJvbSB0aG9zZSBhc3N1bWVkIGluIGNhbGN1bGF0aW5nIHRoZSByZXN1bHRzLiANCiANCioJUmFuZG9tIHNhbXBsaW5nIGVycm9yOiBSYW5kb20gdmFyaWF0aW9uIGluIHRoZSByZXN1bHRzIGR1ZSB0byB0aGUgZWxlbWVudHMgaW4gdGhlIHNhbXBsZSBiZWluZyBzZWxlY3RlZCBhdCByYW5kb20uIA0KDQoqKk5vbi1zYW1wbGluZyBlcnJvcioqICBOb24tc2FtcGxpbmcgZXJyb3JzIGFyZSBvdGhlciBlcnJvcnMgdGhhdCBjYW4gaW1wYWN0IHRoZSBmaW5hbCBzdXJ2ZXkgZXN0aW1hdGVzLCBjYXVzZWQgYnkgcHJvYmxlbXMgaW4gZGF0YSBjb2xsZWN0aW9uLCBwcm9jZXNzaW5nLCBvciBzYW1wbGUgZGVzaWduLiBUaGV5IGluY2x1ZGUNCiANCiAqT3Zlci1jb3ZlcmFnZSo6IEluY2x1c2lvbiBvZiBkYXRhIGZyb20gb3V0c2lkZSBvZiB0aGUgcG9wdWxhdGlvbi4gDQogDQogKlVuZGVyLWNvdmVyYWdlKjogT2NjdXJzIHdoZW4gc29tZSBtZW1iZXJzIG9mIHRoZSBwb3B1bGF0aW9uIGFyZSBpbmFkZXF1YXRlbHkgcmVwcmVzZW50ZWQgaW4gdGhlIHNhbXBsZS4gVW5kZXItY292ZXJhZ2UgaXMgb2Z0ZW4gYSBwcm9ibGVtIHdpdGggY29udmVuaWVuY2Ugc2FtcGxlcy4gDQoNCioqTWVhc3VyZW1lbnQgZXJyb3IqKjogV2hlbiByZXNwb25kZW50cyBtaXN1bmRlcnN0YW5kIGEgcXVlc3Rpb24gb3IgZmluZCBpdCBkaWZmaWN1bHQgdG8gYW5zd2VyLg0KDQoqKlByb2Nlc3NpbmcgZXJyb3IqKjogTWlzdGFrZXMgaW4gZGF0YSBjb2RpbmcuDQoNCioqTm9uLXJlc3BvbnNlKio6IEZhaWx1cmUgdG8gb2J0YWluIGNvbXBsZXRlIGRhdGEgZnJvbSBhbGwgc2VsZWN0ZWQgaW5kaXZpZHVhbHMuIA0KDQpBZnRlciBzYW1wbGluZywgYSByZXZpZXcgc2hvdWxkIGJlIGhlbGQgb2YgdGhlIGV4YWN0IHByb2Nlc3MgZm9sbG93ZWQgaW4gc2FtcGxpbmcsIHJhdGhlciB0aGFuIHRoYXQgaW50ZW5kZWQsIGluIG9yZGVyIHRvIHN0dWR5IGFueSBlZmZlY3RzIHRoYXQgYW55IGRpdmVyZ2VuY2VzIG1pZ2h0IGhhdmUgb24gc3Vic2VxdWVudCBhbmFseXNpcy4gDQogDQojIyBCaWFzIER1ZSB0byBNZWFzdXJlbWVudCBFcnJvciANCg0KQSBwb29yIG1lYXN1cmVtZW50IHByb2Nlc3MgY2FuIGFsc28gbGVhZCB0byBiaWFzLiBJbiBzdXJ2ZXkgcmVzZWFyY2gsIHRoZSBtZWFzdXJlbWVudCBwcm9jZXNzIGluY2x1ZGVzIHRoZSBlbnZpcm9ubWVudCBpbiB3aGljaCB0aGUgc3VydmV5IGlzIGNvbmR1Y3RlZCwgdGhlIHdheSB0aGF0IHF1ZXN0aW9ucyBhcmUgYXNrZWQsIGFuZCB0aGUgc3RhdGUgb2YgdGhlIHN1cnZleSByZXNwb25kZW50LiANCg0KKipSZXNwb25zZSBiaWFzKiogcmVmZXJzIHRvIHRoZSBiaWFzIHRoYXQgcmVzdWx0cyBmcm9tIHByb2JsZW1zIGluIHRoZSBtZWFzdXJlbWVudCBwcm9jZXNzLiBGb3IgZXhhbXBsZSwgYSBzYXRpc2ZhY3Rpb24gc3VydmV5IG1heSBhc2sgdGhlIHJlc3BvbmRlbnQgdG8gaW5kaWNhdGUgd2hlcmUgc2hlIGlzIHNhdGlzZmllZCwgZGlzc2F0aXNmaWVkLCBvciB2ZXJ5IGRpc3NhdGlzZmllZC4gQnkgZ2l2aW5nIHRoZSByZXNwb25kZW50IG9uZSByZXNwb25zZSBvcHRpb24gdG8gZXhwcmVzcyBzYXRpc2ZhY3Rpb24gYW5kIHR3byByZXNwb25zZSBvcHRpb25zIHRvIGV4cHJlc3MgZGlzc2F0aXNmYWN0aW9uLCB0aGlzIHN1cnZleSBxdWVzdGlvbiBpcyBiaWFzZWQgdG93YXJkIGdldHRpbmcgYSBkaXNzYXRpc2ZpZWQgcmVzcG9uc2UuIFRoaXMgYmVjb21lcyBtb3JlIHNlcmlvdXMgaWYgdGhlIHN1cnZleSByZXNwb25zZSBpcyBzb2NpYWxseSBzZW5zaXRpdmUuDQoNCiBJbmNyZWFzaW5nIHRoZSBzYW1wbGUgc2l6ZSB0ZW5kcyB0byByZWR1Y2UgdGhlIHNhbXBsaW5nIGVycm9yOyB0aGF0IGlzLCBpdCBtYWtlcyB0aGUgc2FtcGxlIHN0YXRpc3RpYyBsZXNzIHZhcmlhYmxlLiBIb3dldmVyLCBpbmNyZWFzaW5nIHRoZSBzYW1wbGUgc2l6ZSBkb2VzIG5vdCBhZmZlY3Qgc3VydmV5IGJpYXMuIEEgbGFyZ2Ugc2FtcGxlIHNpemUgY2Fubm90IGNvcnJlY3QgdGhlIG1ldGhvZG9sb2dpY2FsIHByb2JsZW1zICh1bmRlci1jb3ZlcmFnZSwgbm9uLXJlc3BvbnNlIGJpYXMsIGV0Yy4pIHRoYXQgcHJvZHVjZSBzdXJ2ZXkgYmlhcy4gDQoNCg0KIyBTYW1wbGUgU2l6ZSBEZXRlcm1pbmF0aW9uDQoNCkRldGVybWluYXRpb24gb2Ygc2FtcGxlIHNpemUgaXMgcHJvYmFibHkgb25lIG9mIHRoZSBtb3N0IGltcG9ydGFudCBwaGFzZXMgaW4gdGhlIHNhbXBsaW5nIHByb2Nlc3MuIA0KDQpGcm9tIGEgdGhlb3JldGljYWwgcGVyc3BlY3RpdmUsIHRoZSBsYXJnZXIgdGhlIHNhbXBsZSBzaXplLCB0aGUgYmV0dGVyIHRoZSBlc3RpbWF0aW9uLiBIb3dldmVyLCBhcyB0aGUgc2FtcGxlIHNpemUgcmVhY2hlcyBhIGNlcnRhaW4gc2l6ZSwgdGhlIGltcGFjdCBvbiB0aGUgZXN0aW1hdGUgd2lsbCBiZWNvbWUgbmVnbGlnaWJsZS4gT24gdGhlIG90aGVyIGhhbmQsIHNhbXBsaW5nIGNhbiBiZSBleHBlbnNpdmUuIElmIHRoZSBzYW1wbGluZyBwcmVjaXNpb24gaXMgcHJlLXNwZWNpZmllZCwgd2Ugb25seSBjaG9vc2UgdGhlIGFwcHJvcHJpYXRlIHNpemUgdG8gbWVldCB0aGUgcHJlY2lzaW9uIHdpdGhvdXQgd2FzdGluZyByZXNvdXJjZXMuDQoNCkZvciBleGFtcGxlLCBpZiB0aGUgZXN0aW1hdGUgb2YgdGhlICoqbWVhbioqIG9mIHRoZSBwb3B1bGF0aW9uIGlzIHJlcXVpcmVkIHRvIGJlIHdpdGhpbiAkXHBtIDMkIG9mIHRoZSB0cnVlIG1lYW4gd2l0aCA5NSUgY29uZmlkZW5jZS4gVGhhdCBpcywgaWYgdGhlIHRydWUgbWVhbiBpcyAxMDAsIHRoZSBlc3RpbWF0ZWQgdmFsdWUgb2YgdGhlIG1lYW4gd2lsbCBiZSBubyBsZXNzIHRoYW4gOTcgYW5kIG5vIG1vcmUgdGhhbiAxMDMuIEluIG90aGVyIHdvcmRzLCBhbGwgdGhpcyBtZWFucyB0aGF0IHRoZSBhY2NlcHRhYmxlIGVycm9yLCBlLCBpcyBlcXVhbCB0byAzLiANCg0KVGhlIG1ldGhvZHMgb2YgZGV0ZXJtaW5pbmcgdGhlIHNhbXBsZSBzaXplIGFyZSBkZXBlbmRlbnQgb24gdGhlIHNwZWNpZmljIGVzdGltYXRpb24gdGFza3Mgc3VjaCBhcyBwb3B1bGF0aW9uIG1lYW5zLCB2YXJpYW5jZSwgY29ycmVsYXRpb25zLCBldGMuICBJbiBvdGhlciB3b3JkcywgdGhlcmUgaXMgbm8gc2luZ2xlIGFsZ29yaXRobSB0aGF0IGZpdHMgYWxsIHNhbXBsZSBzaXplIGRldGVybWluYXRpb24gcHJvYmxlbXMgYmVjYXVzZSBpdCBpcyBvbmUgdHlwZSBvZiBzdGF0aXN0aWNzIHByb2JsZW0ganVzdCBsaWtlIHRoZSBwcm9ibGVtcyBvZiBzdGF0aXN0aWNhbCBoeXBvdGhlc2lzLiANCg0KDQojIyBQcm9ibGVtcyBvZiBFc3RpbWF0aW5nIE1lYW4gYW5kIFByb3BvcnRpb24NCg0KVGhlIGFib3ZlIGV4YW1wbGUgZXhwbGFpbmVkIHRoZSBpZGVhIG9mIGVzdGltYXRpbmcgdGhlIHBvcHVsYXRpb24gbWVhbiB3aXRoIGEgcHJlLXNwZWNpZmllZCBlc3RpbWF0aW9uIGVycm9yICgkXHBtIDMkKS4gVGhlIGFjY2VwdGFibGUgZXN0aW1hdGlvbiBlcnJvciBpcywgaW4gZmFjdCwgdGhlIG1hcmdpbiBvZiBlcnJvciBpbiB0aGUgY29uZmlkZW5jZSBpbnRlcnZhbCB3aGljaCBpcyBnaXZlbiBieQ0KDQokJA0KXGJhcnt4fSBccG0gXHRleHR7Q1Z9X3tcYWxwaGEvMn1cZnJhY3tcc2lnbWF9e1xzcXJ0e259fQ0KJCQNCg0Kd2hlcmUgJEUgPSAgXHRleHR7Q1Z9X3tcYWxwaGEvMn1cc2lnbWEvXHNxcnR7bn0kIGlzIHRoZSBtYXJnaW4gZXJyb3IgKGkuZS4sIHByZS1zcGVjaWZpZWQgZXN0aW1hdGlvbiBlcnJvcikuDQoNCkluIG90aGVyIHdvcmRzLCBpZiBlc3RpbWF0aW9uIGVycm9yICRFJCBhbmQgY29uZmlkZW5jZSBsZXZlbCAkMTAwKDEtXGFscGhhKVwlJCBpcyBnaXZlbiwgd2UgY2FuIHRoZW4gc29sdmUgZm9yIHRoZSBkZXNpcmVkIHNhbXBsZSBzaXplICRuJCBieSB0aGUgZm9sbG93aW5nIGZvcm11bGENCg0KJCQNCm4gPSBcbGVmdFsgXGZyYWN7XHNpZ21hfXtcdGV4dHtDVn1fe1xhbHBoYS8yfX1ccmlnaHRdXjINCiQkDQoNClRoZSBmb3JtdWxhIGZvciBkZXRlcm1pbmluZyB0aGUgc2FtcGxlIHNpemUgb2YgZXN0aW1hdGluZyBhIHBvcHVsYXRpb24gcHJvcG9ydGlvbiB3aXRoIGEgZ2l2ZW4gZXN0aW1hdGlvbiBlcnJvciBhbmQgY29uZmlkZW5jZSBsZXZlbCBpcyBnaXZlbiBieQ0KDQokJA0KbiA9IFxsZWZ0WyBcZnJhY3tcc3FydHtcaGF0e3B9KDEtXGhhdHtwfSl9fXtcdGV4dHtDVn1fe1xhbHBoYS8yfX1ccmlnaHRdXjINCiQkDQoNCiMjIEVzdGltYXRpbmcgVmFyaWFuY2UgYW5kIE90aGVyIENoYXJhY3RlcmlzdGljcw0KDQpUaGUgZGVyaXZhdGlvbiBvZiBmb3JtdWxhcyBmb3IgY2FsY3VsYXRpbmcgc2FtcGxlIHNpemUgZm9yIGVzdGltYXRpbmcgdmFyaWFuY2Ugb3Igb3RoZXIgcG9wdWxhdGlvbiBjaGFyYWN0ZXJpc3RpY3MgaXMgbm90IHN0cmFpZ2h0Zm9yd2FyZC4gU2luY2UgdGhpcyBpcyBub3QgdGhlIGZvY3VzIG9mIHRoaXMgY291cnNlLCB3ZSB3aWxsIG5vdCBleHBhbmQgdGhlIGRpc2N1c3Npb24gaW4gYW55IGRpcmVjdGlvbi4gDQoNCiMjIFNhbXBsZSBTaXplIERldGVybWluYXRpb24gYW5kIFBvd2VyIENhbGN1bGF0aW9uDQoNClNhbXBsZSBzaXplIGRldGVybWluYXRpb24gaW4gcG93ZXIgYW5hbHlzaXMgaXMgYW5vdGhlciB2ZXJ5IGltcG9ydGFudCBwcm9jZWR1cmUgaW4gY2xpbmljYWwgc3R1ZGllcy4gSXQgaXMgYSByZXF1aXJlZCBjb21wb25lbnQgaW4gdGhlICpzdGF0aXN0aWNhbCBhbmFseXNpcyBwbGFuKiAoU0FQKSBmb3IgaW50ZXJ2ZW50aW9uIGFuZCBub24taW50ZXJ2ZW50aW9uIG9ic2VydmF0aW9uYWwgc3R1ZGllcy4gV2Ugd2lsbCBhbHNvIG5vdCBleHBhbmQgdGhlIGRpc2N1c3Npb24gZnJvbSB0aGlzIGRpcmVjdGlvbi4NCg0KDQoNCg0K