Tugas Week 11 ~ Probability Distribution

1 . Introduction

This introduction serves as the definitive gateway to one of the most foundational and transformative concepts in statistical analysis: Probability Distributions.

Statistics is fundamentally the science of making confident decisions amid uncertainty. When we encounter variable outcomes such as the number of “Heads” we get after tossing a coin \(N\) times we cannot rely on a single, isolated value. This is where the Probability Distribution steps in as the primary analytical tool. A Probability Distribution is the “master map” that precisely describes the likelihood for every possible outcome. The Coin Toss Example: If you toss a coin 10 times, the possible outcomes (Random Variable \(X\) = Number of Heads) range from 0 to 10. The Probability Distribution tells you:

• What is the chance of getting exactly 5 Heads?

• What is the chance of getting at least 8 Heads? (\(P(X \ge 8)\))

Its function goes far beyond simple prediction. Crucially, it forms the core analytical basis for virtually all inferential statistical methods we use to:

  1. Quantify Risk and Uncertainty: It measures the expected variation or spread of results around the most likely value (e.g., the expected average of 5 Heads).

  2. Drive Inference: It allows us to draw valid, responsible conclusions from sample data such as determining if a deviation (like getting 9 Heads) is unusual enough to conclude the coin is biased. The central concept is the Random Variable (\(X\)), which numerically represents the experimental outcome. The Distribution then maps the probability onto each possible value.

The Critical Insight: Understanding Distribution Properties To make accurate and robust predictions, it is absolutely mandatory that we grasp the characteristics of the distribution we are dealing with:

• Shape: Is the distribution symmetric (like a fair coin’s outcome), skewed, or uniform?

• Spread (Variability): How far are the values likely to scatter from the mean?

• Center (Location): What is the most expected or average value? Without this deep understanding of a distribution’s properties, our probability calculations will be flawed, and our predictive models will be fundamentally unreliable. In essence, Probability Distributions are the universal language that translates raw data into quantifiable, actionable probabilities.

The Four Pillars of Statistical Inference Having established the indispensable role of Probability Distributions, this report will guide you through four essential topics that constitute the building blocks of inferential statistics the field that allows us to move from simply describing data to drawing powerful, general conclusions:

  1. Continuous Random Variables

We shift our focus to outcomes that can take any value within a given range (e.g., the time it takes to get a Head, weight, or temperature). This necessitates moving from calculating the probability of a specific point to calculating the probability as the area under a curve, with special emphasis on the paramount Normal Distribution.

  1. Sampling Distributions

This is the hinge concept, explaining how sample statistics behave (e.g., the average proportion of Heads \(\hat{p}\) across many different sets of 10 coin tosses). This distribution is the critical link that connects the small sample we observe to the large population we seek to understand.

  1. The Central Limit Theorem (CLT)

The CLT is often called the “Gold Standard” or the most crucial result in statistics. Its magical power states that, regardless of the original population distribution’s shape, the distribution of sample averages (the Sampling Distribution) will tend toward a Normal Distribution provided the sample size (\(n\)) is large enough. This allows us to leverage the power of Normal probability for almost any real-world analysis.

  1. Sample Proportion Distributions

This topic specifically addresses categorical or binary outcomes (Heads/Tails, Yes/No, Success/Failure). We will study the probability distribution of the proportion of successes (\(\hat{p}\)) found in a sample, a vital skill for survey data analysis and percentage-based hypothesis testing. The Introductory Takeaway

Mastering these four concepts from continuous variables to the revolutionary power of the CLT will equip you with the critical capability to analyze data deeply, construct sound statistical models, and ultimately draw robust, solid conclusions grounded in strong probabilistic principles. This foundation will transform you from a simple data consumer into a sophisticated, data-driven decision-maker.

2 . Countinuous Random

2.1 . Summary of the video:

2.1.1 . Discrete Variables: Data Obtained by Counting

A discrete variable represents data whose values are countable and limited to a finite number of possibilities. The key characteristic of this type of data is that it is generated through the process of counting. Consequently, discrete variables can only take on certain, isolated values, leaving no possibility for any value in between the defined steps.

For example, when considering the number of children in a family, the outcomes are restricted to integers like 0, 1, 2, or 3. The video emphasizes that asking for a fraction of a child is nonsensical in this context. Similarly, the score on a test is discrete because the possible outcomes are limited to a finite set of numbers. Even in cases involving currency, where decimals (cents) are present, the variable remains discrete because the precision is limited to a countable number of decimal places, making the set of values finite.

In terms of visualization, discrete data is represented by a Bar Chart, where the gaps between the bars clearly signify the separation between the countable values.

2.1.2 . Continuous Variables: Data Obtained by Measuring

In contrast, a continuous variable is data that can take on any numerical value within a given range. The fundamental source of continuous data is measurement (measuring), not counting.

This reliance on measurement means the number of possible outcomes within any range is infinite and uncountable. The defining trait of continuous data is that you can always achieve greater precision by adding more decimal places.

The video uses age as a prime example. While one might state an age of 23 years, precise measurement can extend this value to 23 years, 6 months, 2 days, 3 seconds, and down to milliseconds or nanoseconds, theoretically without end. The same concept applies to weight. Since measurement can be refined infinitely, all values within the range are theoretically possible.

Continuous variables are typically visualized using a Histogram or a Density Curve. The absence of gaps between the bars in a histogram illustrates the continuity of the data, reflecting the infinite possibilities of measurement within the observed range.

2.1.3 . Probability Formulas and Concepts

The difference between counting and measuring fundamentally changes how we calculate probability:

For Discrete Variables Focus: Finding the probability of a single, exact value (\(P(X = x)\)).

Calculation: Probability is found by Summation (adding up) the probabilities of all relevant outcomes.

For Continuous Variables Focus: Probability is calculated for a range of values (\(P(a < X < b)\)), not a single point.Calculation: Probability is equal to the Area Under the Density Curve (which involves integration, or calculus).

Key Fact: The probability of a single, exact value in a continuous distribution (e.g., \(P(X = 170.000...)\)) is always zero.

Major Example: The Normal Distribution is the most common example of a density curve used for continuous variables.

2.1.4 . Visualization

A. Discrete Data Visualization (Bar Chart with Gaps)

This code demonstrates a discrete variable (e.g., the probability of getting a certain number of heads from four coin flips), emphasizing the gaps between bars.

B. Continuous Data Visualization (Density Curve/Histogram)

This code demonstrates a continuous variable (like height, following a Normal Distribution), showing the smooth curve and connected histogram bars.

C. Conceptual Formula in R (Area Under the Curve)

The norm() function in R calculates the area under the Normal Distribution curve (cumulative probability), which is the method used for continuous variables.Scenario:

If height (\(X\)) is normally distributed with a mean (\(\mu\)) of \(170\) cm and a standard deviation (\(\sigma\)) of \(10\) cm, what is the probability that a person’s height is less than \(180\) cm? (\(P(X < 180)\))

The relationship between the Continuous Random Variable (RV), the Probability Density Function (PDF), and the Cumulative Distribution Function (CDF) is the fundamental bridge connecting the field of statistics with the powerful tools of integral and differential calculus.

  1. The Continuous Random VariableA random variable (\(X\)) is classified as continuous if it can assume any value within a given interval on the real number line, such as \([a, b]\) or \((-\infty, \infty)\). Examples include measured quantities like height, time, temperature, and velocity.

Zero Point Probability: Since there is an infinite number of possible values within any interval, the probability of the variable landing exactly on any single point is always zero:\[P(X = x) = 0\]

Interval-Based Probability: Probabilities are meaningful only when measured over an interval:\[P(a \le X \le b) = \int_{a}^{b} f(x) dx\]

  1. The Probability Density Function (PDF), \(f(x)\)The PDF, denoted \(f(x)\), is the descriptive function that illustrates the density of probability around each value \(x\). The PDF is the operational heart of any continuous distribution.

Interpretation Caveat: A crucial distinction is that the value of \(f(x)\) itself is not a probability.

Density Indicator: Larger values of \(f(x)\) merely indicate a higher probability density around that specific value.

Validation Requirements: A function \(f(x)\) is a valid PDF only if it satisfies two essential rules:

  1. Non-negativity: \(f(x) \ge 0\) for all \(x\).Total Area Equals 1:

  2. The total area under the PDF curve must integrate to 1:\[\int_{-\infty}^{\infty} f(x) dx = 1\]

Probability Calculation: The probability for an interval (\(P(a \le X \le b)\)) is computed as the area under the PDF curve between \(a\) and \(b\):\[P(a \le X \le b) = \int_{a}^{b} f(x) dx\]Example PDF: \(f(x) = 3x^2\) on \([0, 1]\).

  1. The Cumulative Distribution Function (CDF), \(F(x)\)The CDF, denoted \(F(x)\), is defined as the probability that the Random Variable \(X\) takes a value less than or equal to \(x\) (\(P(X \le x)\)). The CDF is an inherently cumulative measure.

Integral Relationship: The CDF is the integral of the PDF from the lower bound of the distribution up to the point \(x\):\[F(x) = P(X \le x) = \int_{low}^{x} f(t) dt\]Example CDF: For the PDF \(f(x) = 3x^2\) on \([0, 1]\), the CDF is calculated as \(F(x) = \int_{0}^{x} 3t^2 dt = x^3\).

The Reciprocal Relationship: PDF vs. CDF

The relationship between \(f(x)\) and \(F(x)\) is the backbone of the Fundamental Theorem of Calculus. They are an integral/derivative pair:\[\text{PDF } f(x) = \frac{d}{dx} F(x) = F'(x)\]This means the PDF is simply the rate of change of the CDF. You can obtain the PDF by differentiating the CDF, and you can obtain the CDF by integrating the PDF.

3 . Sampling Distribuition

This summary, based on the video “Sampling Distributions (7.2)”, unlocks one of the most vital concepts in inferential statistics: understanding not just single data points, but the behavior of averages drawn repeatedly from a population.

3.1 . Summary of the video:

The video starts by resolving a major source of confusion: differentiating between three types of statistical distributions:

  1. The Population Distribution: this is the complete data set from every individual in the entire population, characterized by its mean (\(\mu\)) and standard deviation (\(\sigma\)).

  2. The Sample Distribution: this is merely the data collected from one single random sample. It’s highly variable and often fails to perfectly mirror the population.

  3. The Sampling Distribution: this is our central focus. It is a distribution built not from individual scores, but from the statistic (like the mean, \(\bar{x}\)) calculated from hundreds or thousands of random samples taken from the same population. It’s essentially a “stack of sample means” that tells us the probability of observing a specific sample average.

The power of the Sampling Distribution lies in its predictability, which allows us to generalize results from a small group to a large population:

Stable Mean: the mean of the Sampling Distribution (\(\mu_{\bar{x}}\)) will always equal the population mean (\(\mu\)).Reduced Variability (The Standard Error): Crucially, sample means are less variable than individual observations. Therefore, the spread of the Sampling Distribution is much narrower and taller than the original population curve. This measure of spread is called the Standard Error (\(\sigma_{\bar{x}}\)).A Move Toward Normality: Even if the original Population Distribution is strangely shaped, the Sampling Distribution will tend toward a Normal (bell-shaped) distribution as the sample size increases. This principle is the cornerstone of the Central Limit Theorem.

The relationship between the population and the sampling distribution is governed by these two fundamental formulas:

Mean of the Sampling Distribution:\[\mu_{\bar{x}} = \mu\]Standard Error (Standard Deviation of the Sampling Distribution): This formula shows that as the sample size (\(n\)) increases, the Standard Error decreases, making the distribution tighter.\[\sigma_{\bar{x}} = \frac{\sigma}{\sqrt{n}}\]These are used to standardize a sample mean (\(\bar{x}\)) into a Z-score:\[Z = \frac{\bar{x} - \mu}{\sigma/\sqrt{n}}\]For example, using these formulas, the video calculates that the probability that the average height (\(\bar{x}\)) of a random sample of 10 Canadians is less than 157 cm (given \(\mu = 160 \text{ cm}, \sigma = 7 \text{ cm}\)) is only 8.69%.

4 . Central Limit Theorem

The video “The Central Limit Theorem (7.3)” dives into what is arguably the most fundamental and revolutionary principle in all of modern statistics. The CLT isn’t just a formula; it’s the mathematical magic that allows data scientists to trust their inferential conclusions.

4.1 . Summary of the video:

Before the CLT, statisticians struggled with population data that came in all shapes and sizes skewed, flat, or wildly irregular. The CLT offered a stunning solution, essentially providing a predictive guarantee:

  1. The CLT Statement: If you take simple random samples (\(n\)) that are large enough (typically \(n \ge 30\)) from any population (regardless of its original distribution shape)

  2. Guaranteed Normality: The Sampling Distribution of the sample means (\(\bar{x}\)) will tend toward a Normal Distribution (the bell curve).

  3. Centralized Mean: The mean of the Sampling Distribution (\(\mu_{\bar{x}}\)) will be equal to the true population mean (\(\mu\)).

  4. Standard Error: The spread of this new, normal distribution (the Standard Error, \(\sigma_{\bar{x}}\)) is perfectly predictable by the formula \(\sigma / \sqrt{n}\).

  5. The Simple Power: The CLT essentially normalizes the chaos of the real world. It guarantees that we can use the simple, powerful tools of the Normal Distribution (like Z-scores) to calculate probabilities and test hypotheses on our sample means—a feat impossible on the messy original population data.

If the Population is Normal: If the original population is already Normal, the Sampling Distribution is always Normal, even if the sample size (\(n\)) is small.If the Population is NOT Normal: We must rely on the large sample size condition. The general consensus is that \(n\) must be at least 30 (\(n \ge 30\)) to assume the Sampling Distribution is Normal.

Using the CLT guarantee of normality, we rely on the Z-score formula to find the probability of observing a specific sample mean (\(\bar{x}\)).

5 . Sample Proportion

These two videos—“The Central Limit Theorem (7.3)” and “Sampling Distribution of the Sample Proportion (7.4)”—represent the ultimate transition from descriptive analysis to actionable inferential statistics. Their essential message is that, under the right conditions, the chaotic results of sampling can be reliably transformed into a predictable Normal Distribution.

5.1 . Summary of the video:

5.1.1 . The Central Limit Theorem (CLT) for the Mean (\(\bar{x}\))

The CLT is often called the “magic of statistics” because it provides an incredible guarantee it ensures that the sampling distribution of the mean will be normal, regardless of the original population’s bizarre shape.

5.1.2 . The CLT Mechani

When we take multiple samples, the average of those sample means (\(\mu_{\bar{x}}\)) will precisely equal the true population mean (\(\mu\)). More importantly, the spread of this new distribution known as the Standard Error (\(\sigma_{\bar{x}}\)) is drastically reduced compared to the original population’s standard deviation (\(\sigma\)). This relationship is defined as \(\sigma_{\bar{x}} = \frac{\sigma}{\sqrt{n}}\).

5.1.3 . The Normal Condition (The Rule of 30)

For the CLT to kick in and ensure normality when the population is not normal, the sample size (\(n\)) must be large enough, with the common threshold being \(n \ge 30\).

5.1.4 . The Sampling Distribution of the Proportion (\(\hat{p}\))

When dealing with categorical data (like “yes/no,” “success/failure”), we use the proportion (\(\hat{p}\)) instead of the mean (\(\bar{x}\)). Just like the mean, if we repeatedly sample and plot the resulting proportions, they also form a Sampling Distribution.

5.1.5 . The Proportion Rules

The mean of the sample proportions (\(\mu_{\hat{p}}\)) will equal the true population proportion (\(p\)). The Standard Error for the proportion is calculated using the formula \(\sigma_{\hat{p}} = \sqrt{\frac{p(1-p)}{n}}\).

5.1.6 . The Normal Condition (The Rule of Successes and Failures)

For the sampling distribution of the proportion to be considered normal, the CLT applies differently. Instead of relying only on \(n \ge 30\), we must verify that there are enough expected successes and enough expected failures: both \(n \cdot p\) and \(n \cdot (1-p)\) must be greater than or equal to 10. Meeting these two simple conditions guarantees that the distribution is sufficiently symmetric to use the Z-score table.

6 . Review Sampling Distribuition

These three videos covering the Central Limit Theorem (CLT), the Sampling Distribution of the Proportion, and Binomial Approximation represent the ultimate transition from analyzing messy sample data to making confident predictions about a large population. Their essential teaching is how we leverage the laws of probability to turn chaotic sample results into a reliable Normal Distribution.

6.1 . Summary of the video:

6.1.1 . The Central Promise

The core idea shifts our focus.Instead of worrying about a single sample’s outcome, we consider the distribution of a statistic (like the mean \(\bar{x}\) or the proportion \(\hat{p}\)) if we were to draw thousands of random samples from the same population. This distribution is called the Sampling Distribution.This shift is crucial because while individual data points can be highly erratic, the averages and proportions of multiple samples follow highly predictable rules dictated by the CLT.

6.1.2 . The Central Limit Theorem (CLT) for the Sample Mean (\(\bar{x}\))

The CLT is statistics’ “magic spell,” guaranteeing that the sampling distribution of the mean will take on the familiar Normal (bell-shaped) Distribution, regardless of how weirdly shaped the original population data is.

Key Principles for \(\bar{x}\):

  1. Stable Center: The average of all sample means (\(\mu_{\bar{x}}\)) will equal the true population mean (\(\mu\)).

  2. Reduced Spread: The variability of this new distribution is drastically smaller than the population’s. This controlled spread is the Standard Error (\(\sigma_{\bar{x}}\)), calculated as \(\sigma / \sqrt{n}\). The bigger the sample size (\(n\)), the smaller and taller the resulting curve is.

  3. The Rule of 30: To ensure this normality takes effect when the population is non-normal, the sample size (\(n\)) must be at least 30 (\(n \ge 30\)).

6.1.3 . The Sampling Distribution of the Sample Proportion (\(\hat{p}\))

When analyzing categorical or binary data (e.g., success/failure, yes/no), we use the sample proportion (\(\hat{p}\)). Similar to the mean, if we repeatedly calculate \(\hat{p}\), its distribution will also approach normality.

Key Principles for \(\hat{p}\):

  1. Stable Center: The mean of the sample proportions (\(\mu_{\hat{p}}\)) equals the true population proportion (\(p\)).

  2. Standard Error: The variability is calculated as \(\sigma_{\hat{p}} = \sqrt{\frac{p(1-p)}{n}}\).

  3. The Rule of Successes and Failures: the condition for normality here is stricter: we must ensure that the number of expected successes (\(n \cdot p\)) and expected failures (\(n \cdot (1-p)\)) are both greater than or equal to 10. Meeting these two conditions guarantees the distribution is symmetric enough for normal approximation.

6.1.4 . Why CLT is Essential (The Binomial Bridge)

One of the most practical applications of the CLT for proportions is solving complicated problems involving the Binomial Distribution.Calculating the exact probability of, say, at least 35 successes out of 100 trials using the traditional Binomial formula is tedious, requiring the calculation and summing of many probabilities. Thanks to the CLT, once the \(n p \ge 10\) and \(n (1-p) \ge 10\) conditions are met, we can approximate that complex probability easily using a single Z-score calculation, saving immense time and effort.

7 . Referensi

  1. “The Basic Practice of Statistics” (Edisi Pertama: 1995)

  2. “Introductory Statistics with R” (Edisi Pertama: 2008)

  3. ”Foundations of Statistical Inference and Data Science”

  4. Elementary Statistics: Picturing the World by Ron Larson and Betsy Farber, 7th Edition, published in 2018.

  5. Statistics by James T. McClave, P. George Benson, and Terry Sincich, 13th Edition, published in 2018.

LS0tDQp0aXRsZTogIlR1Z2FzIFdlZWsgMTEgfiBQcm9iYWJpbGl0eSBEaXN0cmlidXRpb24iDQphdXRob3I6ICJDaHJpY3llc2lhIFdpbm5lcmxhZHkgRnJleGlzb3ZhcmEgVXZhcyINCmRhdGU6ICIyMDI1LTEyLTAzIg0Kb3V0cHV0Og0KICBybWRmb3JtYXRzOjpyZWFkdGhlZG93bjoNCiAgICBzZWxmX2NvbnRhaW5lZDogdHJ1ZQ0KICAgIHRodW1ibmFpbHM6IHRydWUNCiAgICBsaWdodGJveDogdHJ1ZQ0KICAgIGdhbGxlcnk6IHRydWUNCiAgICBudW1iZXJfc2VjdGlvbnM6IHRydWUNCiAgICBsaWJfZGlyOiBsaWJzDQogICAgZGZfcHJpbnQ6ICJwYWdlZCINCiAgICBjb2RlX2ZvbGRpbmc6ICJzaG93Ig0KICAgIGNvZGVfZG93bmxvYWQ6IHllcw0KICAgIGNzczogInN0eWxlLmNzcyIgICAgIA0KLS0tDQoNCmBgYHtyLCBlY2hvPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCBvdXQuZXh0cmE9J3N0eWxlPSJkaXNwbGF5OmJsb2NrOyBtYXJnaW4tbGVmdDphdXRvOyBtYXJnaW4tcmlnaHQ6YXV0bzsiJ30NCmxpYnJhcnkobWFnaWNrKQ0KZ2FtYmFyIDwtIGltYWdlX3JlYWQoIn4vVHVnYXMgZXN0YXRpc3Rpa2Egd2luZXIvdHVnYXMgd2VlayAxMSB+IHByb2JhYmlsaXR5IGRpc3RyaWJ1aXRpb24vZm90b18xX2pwZy5qcGciKQ0KZ2FtYmFyDQpgYGANCg0KDQojIC4gSW50cm9kdWN0aW9uDQpUaGlzIGludHJvZHVjdGlvbiBzZXJ2ZXMgYXMgdGhlIGRlZmluaXRpdmUgZ2F0ZXdheSB0byBvbmUgb2YgdGhlIG1vc3QgZm91bmRhdGlvbmFsIGFuZCB0cmFuc2Zvcm1hdGl2ZSBjb25jZXB0cyBpbiBzdGF0aXN0aWNhbCBhbmFseXNpczogUHJvYmFiaWxpdHkgRGlzdHJpYnV0aW9ucy4NCg0KU3RhdGlzdGljcyBpcyBmdW5kYW1lbnRhbGx5IHRoZSBzY2llbmNlIG9mIG1ha2luZyBjb25maWRlbnQgZGVjaXNpb25zIGFtaWQgdW5jZXJ0YWludHkuIFdoZW4gd2UgZW5jb3VudGVyIHZhcmlhYmxlIG91dGNvbWVzIHN1Y2ggYXMgdGhlIG51bWJlciBvZiAiSGVhZHMiIHdlIGdldCBhZnRlciB0b3NzaW5nIGEgY29pbiAkTiQgdGltZXMgd2UgY2Fubm90IHJlbHkgb24gYSBzaW5nbGUsIGlzb2xhdGVkIHZhbHVlLiBUaGlzIGlzIHdoZXJlIHRoZSBQcm9iYWJpbGl0eSBEaXN0cmlidXRpb24gc3RlcHMgaW4gYXMgdGhlIHByaW1hcnkgYW5hbHl0aWNhbCB0b29sLg0KQSBQcm9iYWJpbGl0eSBEaXN0cmlidXRpb24gaXMgdGhlICJtYXN0ZXIgbWFwIiB0aGF0IHByZWNpc2VseSBkZXNjcmliZXMgdGhlIGxpa2VsaWhvb2QgZm9yIGV2ZXJ5IHBvc3NpYmxlIG91dGNvbWUuDQpUaGUgQ29pbiBUb3NzIEV4YW1wbGU6DQpJZiB5b3UgdG9zcyBhIGNvaW4gMTAgdGltZXMsIHRoZSBwb3NzaWJsZSBvdXRjb21lcyAoUmFuZG9tIFZhcmlhYmxlICRYJCA9IE51bWJlciBvZiBIZWFkcykgcmFuZ2UgZnJvbSAwIHRvIDEwLiBUaGUgUHJvYmFiaWxpdHkgRGlzdHJpYnV0aW9uIHRlbGxzIHlvdToNCg0K4oCiCVdoYXQgaXMgdGhlIGNoYW5jZSBvZiBnZXR0aW5nIGV4YWN0bHkgNSBIZWFkcz8gDQogDQoNCuKAoglXaGF0IGlzIHRoZSBjaGFuY2Ugb2YgZ2V0dGluZyBhdCBsZWFzdCA4IEhlYWRzPyANCigkUChYIFxnZSA4KSQpDQoNCkl0cyBmdW5jdGlvbiBnb2VzIGZhciBiZXlvbmQgc2ltcGxlIHByZWRpY3Rpb24uIENydWNpYWxseSwgaXQgZm9ybXMgdGhlIGNvcmUgYW5hbHl0aWNhbCBiYXNpcyBmb3IgdmlydHVhbGx5IGFsbCBpbmZlcmVudGlhbCBzdGF0aXN0aWNhbCBtZXRob2RzIHdlIHVzZSB0bzoNCg0KMS4JUXVhbnRpZnkgUmlzayBhbmQgVW5jZXJ0YWludHk6IEl0IG1lYXN1cmVzIHRoZSBleHBlY3RlZCB2YXJpYXRpb24gb3Igc3ByZWFkIG9mIHJlc3VsdHMgYXJvdW5kIHRoZSBtb3N0IGxpa2VseSB2YWx1ZSAoZS5nLiwgdGhlIGV4cGVjdGVkIGF2ZXJhZ2Ugb2YgNSBIZWFkcykuDQoNCjIuCURyaXZlIEluZmVyZW5jZTogSXQgYWxsb3dzIHVzIHRvIGRyYXcgdmFsaWQsIHJlc3BvbnNpYmxlIGNvbmNsdXNpb25zIGZyb20gc2FtcGxlIGRhdGEgc3VjaCBhcyBkZXRlcm1pbmluZyBpZiBhIGRldmlhdGlvbiAobGlrZSBnZXR0aW5nIDkgSGVhZHMpIGlzIHVudXN1YWwgZW5vdWdoIHRvIGNvbmNsdWRlIHRoZSBjb2luIGlzIGJpYXNlZC4NClRoZSBjZW50cmFsIGNvbmNlcHQgaXMgdGhlIFJhbmRvbSBWYXJpYWJsZSAoJFgkKSwgd2hpY2ggbnVtZXJpY2FsbHkgcmVwcmVzZW50cyB0aGUgZXhwZXJpbWVudGFsIG91dGNvbWUuIFRoZSBEaXN0cmlidXRpb24gdGhlbiBtYXBzIHRoZSBwcm9iYWJpbGl0eSBvbnRvIGVhY2ggcG9zc2libGUgdmFsdWUuIA0KDQpUaGUgQ3JpdGljYWwgSW5zaWdodDogVW5kZXJzdGFuZGluZyBEaXN0cmlidXRpb24gUHJvcGVydGllcw0KVG8gbWFrZSBhY2N1cmF0ZSBhbmQgcm9idXN0IHByZWRpY3Rpb25zLCBpdCBpcyBhYnNvbHV0ZWx5IG1hbmRhdG9yeSB0aGF0IHdlIGdyYXNwIHRoZSBjaGFyYWN0ZXJpc3RpY3Mgb2YgdGhlIGRpc3RyaWJ1dGlvbiB3ZSBhcmUgZGVhbGluZyB3aXRoOg0KDQrigKIJU2hhcGU6IElzIHRoZSBkaXN0cmlidXRpb24gc3ltbWV0cmljIChsaWtlIGEgZmFpciBjb2luJ3Mgb3V0Y29tZSksIHNrZXdlZCwgb3IgdW5pZm9ybT8NCg0K4oCiCVNwcmVhZCAoVmFyaWFiaWxpdHkpOiBIb3cgZmFyIGFyZSB0aGUgdmFsdWVzIGxpa2VseSB0byBzY2F0dGVyIGZyb20gdGhlIG1lYW4/DQoNCuKAoglDZW50ZXIgKExvY2F0aW9uKTogV2hhdCBpcyB0aGUgbW9zdCBleHBlY3RlZCBvciBhdmVyYWdlIHZhbHVlPw0KV2l0aG91dCB0aGlzIGRlZXAgdW5kZXJzdGFuZGluZyBvZiBhIGRpc3RyaWJ1dGlvbuKAmXMgcHJvcGVydGllcywgb3VyIHByb2JhYmlsaXR5IGNhbGN1bGF0aW9ucyB3aWxsIGJlIGZsYXdlZCwgYW5kIG91ciBwcmVkaWN0aXZlIG1vZGVscyB3aWxsIGJlIGZ1bmRhbWVudGFsbHkgdW5yZWxpYWJsZS4gSW4gZXNzZW5jZSwgUHJvYmFiaWxpdHkgRGlzdHJpYnV0aW9ucyBhcmUgdGhlIHVuaXZlcnNhbCBsYW5ndWFnZSB0aGF0IHRyYW5zbGF0ZXMgcmF3IGRhdGEgaW50byBxdWFudGlmaWFibGUsIGFjdGlvbmFibGUgcHJvYmFiaWxpdGllcy4NCg0KVGhlIEZvdXIgUGlsbGFycyBvZiBTdGF0aXN0aWNhbCBJbmZlcmVuY2UNCkhhdmluZyBlc3RhYmxpc2hlZCB0aGUgaW5kaXNwZW5zYWJsZSByb2xlIG9mIFByb2JhYmlsaXR5IERpc3RyaWJ1dGlvbnMsIHRoaXMgcmVwb3J0IHdpbGwgZ3VpZGUgeW91IHRocm91Z2ggZm91ciBlc3NlbnRpYWwgdG9waWNzIHRoYXQgY29uc3RpdHV0ZSB0aGUgYnVpbGRpbmcgYmxvY2tzIG9mIGluZmVyZW50aWFsIHN0YXRpc3RpY3MgdGhlIGZpZWxkIHRoYXQgYWxsb3dzIHVzIHRvIG1vdmUgZnJvbSBzaW1wbHkgZGVzY3JpYmluZyBkYXRhIHRvIGRyYXdpbmcgcG93ZXJmdWwsIGdlbmVyYWwgY29uY2x1c2lvbnM6DQoNCjEuIENvbnRpbnVvdXMgUmFuZG9tIFZhcmlhYmxlcw0KDQpXZSBzaGlmdCBvdXIgZm9jdXMgdG8gb3V0Y29tZXMgdGhhdCBjYW4gdGFrZSBhbnkgdmFsdWUgd2l0aGluIGEgZ2l2ZW4gcmFuZ2UgKGUuZy4sIHRoZSB0aW1lIGl0IHRha2VzIHRvIGdldCBhIEhlYWQsIHdlaWdodCwgb3IgdGVtcGVyYXR1cmUpLiBUaGlzIG5lY2Vzc2l0YXRlcyBtb3ZpbmcgZnJvbSBjYWxjdWxhdGluZyB0aGUgcHJvYmFiaWxpdHkgb2YgYSBzcGVjaWZpYyBwb2ludCB0byBjYWxjdWxhdGluZyB0aGUgcHJvYmFiaWxpdHkgYXMgdGhlIGFyZWEgdW5kZXIgYSBjdXJ2ZSwgd2l0aCBzcGVjaWFsIGVtcGhhc2lzIG9uIHRoZSBwYXJhbW91bnQgTm9ybWFsIERpc3RyaWJ1dGlvbi4NCg0KMi4gU2FtcGxpbmcgRGlzdHJpYnV0aW9ucw0KDQpUaGlzIGlzIHRoZSBoaW5nZSBjb25jZXB0LCBleHBsYWluaW5nIGhvdyBzYW1wbGUgc3RhdGlzdGljcyBiZWhhdmUgKGUuZy4sIHRoZSBhdmVyYWdlIHByb3BvcnRpb24gb2YgSGVhZHMgJFxoYXR7cH0kIGFjcm9zcyBtYW55IGRpZmZlcmVudCBzZXRzIG9mIDEwIGNvaW4gdG9zc2VzKS4gVGhpcyBkaXN0cmlidXRpb24gaXMgdGhlIGNyaXRpY2FsIGxpbmsgdGhhdCBjb25uZWN0cyB0aGUgc21hbGwgc2FtcGxlIHdlIG9ic2VydmUgdG8gdGhlIGxhcmdlIHBvcHVsYXRpb24gd2Ugc2VlayB0byB1bmRlcnN0YW5kLg0KDQozLiBUaGUgQ2VudHJhbCBMaW1pdCBUaGVvcmVtIChDTFQpDQoNClRoZSBDTFQgaXMgb2Z0ZW4gY2FsbGVkIHRoZSAiR29sZCBTdGFuZGFyZCIgb3IgdGhlIG1vc3QgY3J1Y2lhbCByZXN1bHQgaW4gc3RhdGlzdGljcy4gSXRzIG1hZ2ljYWwgcG93ZXIgc3RhdGVzIHRoYXQsIHJlZ2FyZGxlc3Mgb2YgdGhlIG9yaWdpbmFsIHBvcHVsYXRpb24gZGlzdHJpYnV0aW9uJ3Mgc2hhcGUsIHRoZSBkaXN0cmlidXRpb24gb2Ygc2FtcGxlIGF2ZXJhZ2VzICh0aGUgU2FtcGxpbmcgRGlzdHJpYnV0aW9uKSB3aWxsIHRlbmQgdG93YXJkIGEgTm9ybWFsIERpc3RyaWJ1dGlvbiBwcm92aWRlZCB0aGUgc2FtcGxlIHNpemUgKCRuJCkgaXMgbGFyZ2UgZW5vdWdoLiBUaGlzIGFsbG93cyB1cyB0byBsZXZlcmFnZSB0aGUgcG93ZXIgb2YgTm9ybWFsIHByb2JhYmlsaXR5IGZvciBhbG1vc3QgYW55IHJlYWwtd29ybGQgYW5hbHlzaXMuDQoNCjQuIFNhbXBsZSBQcm9wb3J0aW9uIERpc3RyaWJ1dGlvbnMNCg0KVGhpcyB0b3BpYyBzcGVjaWZpY2FsbHkgYWRkcmVzc2VzIGNhdGVnb3JpY2FsIG9yIGJpbmFyeSBvdXRjb21lcyAoSGVhZHMvVGFpbHMsIFllcy9ObywgU3VjY2Vzcy9GYWlsdXJlKS4gV2Ugd2lsbCBzdHVkeSB0aGUgcHJvYmFiaWxpdHkgZGlzdHJpYnV0aW9uIG9mIHRoZSBwcm9wb3J0aW9uIG9mIHN1Y2Nlc3NlcyAoJFxoYXR7cH0kKSBmb3VuZCBpbiBhIHNhbXBsZSwgYSB2aXRhbCBza2lsbCBmb3Igc3VydmV5IGRhdGEgYW5hbHlzaXMgYW5kIHBlcmNlbnRhZ2UtYmFzZWQgaHlwb3RoZXNpcyB0ZXN0aW5nLg0KVGhlIEludHJvZHVjdG9yeSBUYWtlYXdheQ0KDQpNYXN0ZXJpbmcgdGhlc2UgZm91ciBjb25jZXB0cyBmcm9tIGNvbnRpbnVvdXMgdmFyaWFibGVzIHRvIHRoZSByZXZvbHV0aW9uYXJ5IHBvd2VyIG9mIHRoZSBDTFQgd2lsbCBlcXVpcCB5b3Ugd2l0aCB0aGUgY3JpdGljYWwgY2FwYWJpbGl0eSB0byBhbmFseXplIGRhdGEgZGVlcGx5LCBjb25zdHJ1Y3Qgc291bmQgc3RhdGlzdGljYWwgbW9kZWxzLCBhbmQgdWx0aW1hdGVseSBkcmF3IHJvYnVzdCwgc29saWQgY29uY2x1c2lvbnMgZ3JvdW5kZWQgaW4gc3Ryb25nIHByb2JhYmlsaXN0aWMgcHJpbmNpcGxlcy4gVGhpcyBmb3VuZGF0aW9uIHdpbGwgdHJhbnNmb3JtIHlvdSBmcm9tIGEgc2ltcGxlIGRhdGEgY29uc3VtZXIgaW50byBhIHNvcGhpc3RpY2F0ZWQsIGRhdGEtZHJpdmVuIGRlY2lzaW9uLW1ha2VyLg0KDQoNCiMgLiBDb3VudGludW91cyBSYW5kb20NCg0KPGNlbnRlcj4NCjxpZnJhbWUgc3JjPSJodHRwczovL3d3dy55b3V0dWJlLmNvbS9lbWJlZC9aeVV6UlZhNmhDTSIgd2lkdGg9IjY4MCIgaGVpZ2h0PSI0MDAiIGRhdGEtZXh0ZXJuYWw9IjEiIGZyYW1lYm9yZGVyPSIwIiBhbGxvd2Z1bGxzY3JlZW4+IDwvaWZyYW1lPg0KPC9jZW50ZXI+DQoNCiMjIC4gU3VtbWFyeSBvZiB0aGUgdmlkZW86DQojIyMgLiBEaXNjcmV0ZSBWYXJpYWJsZXM6IERhdGEgT2J0YWluZWQgYnkgQ291bnRpbmcgDQpBIGRpc2NyZXRlIHZhcmlhYmxlIHJlcHJlc2VudHMgZGF0YSB3aG9zZSB2YWx1ZXMgYXJlIGNvdW50YWJsZSBhbmQgbGltaXRlZCB0byBhIGZpbml0ZSBudW1iZXIgb2YgcG9zc2liaWxpdGllcy4gVGhlIGtleSBjaGFyYWN0ZXJpc3RpYyBvZiB0aGlzIHR5cGUgb2YgZGF0YSBpcyB0aGF0IGl0IGlzIGdlbmVyYXRlZCB0aHJvdWdoIHRoZSBwcm9jZXNzIG9mIGNvdW50aW5nLiBDb25zZXF1ZW50bHksIGRpc2NyZXRlIHZhcmlhYmxlcyBjYW4gb25seSB0YWtlIG9uIGNlcnRhaW4sIGlzb2xhdGVkIHZhbHVlcywgbGVhdmluZyBubyBwb3NzaWJpbGl0eSBmb3IgYW55IHZhbHVlIGluIGJldHdlZW4gdGhlIGRlZmluZWQgc3RlcHMuDQoNCkZvciBleGFtcGxlLCB3aGVuIGNvbnNpZGVyaW5nIHRoZSBudW1iZXIgb2YgY2hpbGRyZW4gaW4gYSBmYW1pbHksIHRoZSBvdXRjb21lcyBhcmUgcmVzdHJpY3RlZCB0byBpbnRlZ2VycyBsaWtlIDAsIDEsIDIsIG9yIDMuIFRoZSB2aWRlbyBlbXBoYXNpemVzIHRoYXQgYXNraW5nIGZvciBhIGZyYWN0aW9uIG9mIGEgY2hpbGQgIGlzIG5vbnNlbnNpY2FsIGluIHRoaXMgY29udGV4dC4gU2ltaWxhcmx5LCB0aGUgc2NvcmUgb24gYSB0ZXN0IGlzIGRpc2NyZXRlIGJlY2F1c2UgdGhlIHBvc3NpYmxlIG91dGNvbWVzIGFyZSBsaW1pdGVkIHRvIGEgZmluaXRlIHNldCBvZiBudW1iZXJzLiBFdmVuIGluIGNhc2VzIGludm9sdmluZyBjdXJyZW5jeSwgd2hlcmUgZGVjaW1hbHMgKGNlbnRzKSBhcmUgcHJlc2VudCwgdGhlIHZhcmlhYmxlIHJlbWFpbnMgZGlzY3JldGUgYmVjYXVzZSB0aGUgcHJlY2lzaW9uIGlzIGxpbWl0ZWQgdG8gYSBjb3VudGFibGUgbnVtYmVyIG9mIGRlY2ltYWwgcGxhY2VzLCBtYWtpbmcgdGhlIHNldCBvZiB2YWx1ZXMgZmluaXRlLg0KDQpJbiB0ZXJtcyBvZiB2aXN1YWxpemF0aW9uLCBkaXNjcmV0ZSBkYXRhIGlzIHJlcHJlc2VudGVkIGJ5IGEgQmFyIENoYXJ0LCB3aGVyZSB0aGUgZ2FwcyBiZXR3ZWVuIHRoZSBiYXJzIGNsZWFybHkgc2lnbmlmeSB0aGUgc2VwYXJhdGlvbiBiZXR3ZWVuIHRoZSBjb3VudGFibGUgdmFsdWVzLg0KDQojIyMgLiBDb250aW51b3VzIFZhcmlhYmxlczogRGF0YSBPYnRhaW5lZCBieSBNZWFzdXJpbmcgDQpJbiBjb250cmFzdCwgYSBjb250aW51b3VzIHZhcmlhYmxlIGlzIGRhdGEgdGhhdCBjYW4gdGFrZSBvbiBhbnkgbnVtZXJpY2FsIHZhbHVlIHdpdGhpbiBhIGdpdmVuIHJhbmdlLiBUaGUgZnVuZGFtZW50YWwgc291cmNlIG9mIGNvbnRpbnVvdXMgZGF0YSBpcyBtZWFzdXJlbWVudCAobWVhc3VyaW5nKSwgbm90IGNvdW50aW5nLg0KDQpUaGlzIHJlbGlhbmNlIG9uIG1lYXN1cmVtZW50IG1lYW5zIHRoZSBudW1iZXIgb2YgcG9zc2libGUgb3V0Y29tZXMgd2l0aGluIGFueSByYW5nZSBpcyBpbmZpbml0ZSBhbmQgdW5jb3VudGFibGUuIFRoZSBkZWZpbmluZyB0cmFpdCBvZiBjb250aW51b3VzIGRhdGEgaXMgdGhhdCB5b3UgY2FuIGFsd2F5cyBhY2hpZXZlIGdyZWF0ZXIgcHJlY2lzaW9uIGJ5IGFkZGluZyBtb3JlIGRlY2ltYWwgcGxhY2VzLg0KDQpUaGUgdmlkZW8gdXNlcyBhZ2UgYXMgYSBwcmltZSBleGFtcGxlLiBXaGlsZSBvbmUgbWlnaHQgc3RhdGUgYW4gYWdlIG9mIDIzIHllYXJzLCBwcmVjaXNlIG1lYXN1cmVtZW50IGNhbiBleHRlbmQgdGhpcyB2YWx1ZSB0byAyMyB5ZWFycywgNiBtb250aHMsIDIgZGF5cywgMyBzZWNvbmRzLCBhbmQgZG93biB0byBtaWxsaXNlY29uZHMgb3IgbmFub3NlY29uZHMsIHRoZW9yZXRpY2FsbHkgd2l0aG91dCBlbmQuIFRoZSBzYW1lIGNvbmNlcHQgYXBwbGllcyB0byB3ZWlnaHQuIFNpbmNlIG1lYXN1cmVtZW50IGNhbiBiZSByZWZpbmVkIGluZmluaXRlbHksIGFsbCB2YWx1ZXMgd2l0aGluIHRoZSByYW5nZSBhcmUgdGhlb3JldGljYWxseSBwb3NzaWJsZS4NCg0KQ29udGludW91cyB2YXJpYWJsZXMgYXJlIHR5cGljYWxseSB2aXN1YWxpemVkIHVzaW5nIGEgSGlzdG9ncmFtIG9yIGEgRGVuc2l0eSBDdXJ2ZS4gVGhlIGFic2VuY2Ugb2YgZ2FwcyBiZXR3ZWVuIHRoZSBiYXJzIGluIGEgaGlzdG9ncmFtIGlsbHVzdHJhdGVzIHRoZSBjb250aW51aXR5IG9mIHRoZSBkYXRhLCByZWZsZWN0aW5nIHRoZSBpbmZpbml0ZSBwb3NzaWJpbGl0aWVzIG9mIG1lYXN1cmVtZW50IHdpdGhpbiB0aGUgb2JzZXJ2ZWQgcmFuZ2UuDQoNCiMjIyAuIFByb2JhYmlsaXR5IEZvcm11bGFzIGFuZCBDb25jZXB0cyANClRoZSBkaWZmZXJlbmNlIGJldHdlZW4gY291bnRpbmcgYW5kIG1lYXN1cmluZyBmdW5kYW1lbnRhbGx5IGNoYW5nZXMgaG93IHdlIGNhbGN1bGF0ZSBwcm9iYWJpbGl0eToNCg0KRm9yIERpc2NyZXRlIFZhcmlhYmxlcyBGb2N1czogRmluZGluZyB0aGUgcHJvYmFiaWxpdHkgb2YgYSBzaW5nbGUsIGV4YWN0IHZhbHVlICgkUChYID0geCkkKS4NCg0KQ2FsY3VsYXRpb246IFByb2JhYmlsaXR5IGlzIGZvdW5kIGJ5IFN1bW1hdGlvbiAoYWRkaW5nIHVwKSB0aGUgcHJvYmFiaWxpdGllcyBvZiBhbGwgcmVsZXZhbnQgb3V0Y29tZXMuDQoNCg0KRm9yIENvbnRpbnVvdXMgVmFyaWFibGVzIEZvY3VzOiBQcm9iYWJpbGl0eSBpcyBjYWxjdWxhdGVkIGZvciBhIHJhbmdlIG9mIHZhbHVlcyAoJFAoYSA8IFggPCBiKSQpLCBub3QgYSBzaW5nbGUgcG9pbnQuQ2FsY3VsYXRpb246IFByb2JhYmlsaXR5IGlzIGVxdWFsIHRvIHRoZSBBcmVhIFVuZGVyIHRoZSBEZW5zaXR5IEN1cnZlICh3aGljaCBpbnZvbHZlcyBpbnRlZ3JhdGlvbiwgb3IgY2FsY3VsdXMpLg0KDQpLZXkgRmFjdDogVGhlIHByb2JhYmlsaXR5IG9mIGEgc2luZ2xlLCBleGFjdCB2YWx1ZSBpbiBhIGNvbnRpbnVvdXMgZGlzdHJpYnV0aW9uIChlLmcuLCAkUChYID0gMTcwLjAwMC4uLikkKSBpcyBhbHdheXMgemVyby4NCg0KTWFqb3IgRXhhbXBsZTogVGhlIE5vcm1hbCBEaXN0cmlidXRpb24gaXMgdGhlIG1vc3QgY29tbW9uIGV4YW1wbGUgb2YgYSBkZW5zaXR5IGN1cnZlIHVzZWQgZm9yIGNvbnRpbnVvdXMgdmFyaWFibGVzLg0KDQojIyMgLiAgVmlzdWFsaXphdGlvbiAgDQpBLiBEaXNjcmV0ZSBEYXRhIFZpc3VhbGl6YXRpb24gKEJhciBDaGFydCB3aXRoIEdhcHMpDQoNClRoaXMgY29kZSBkZW1vbnN0cmF0ZXMgYSBkaXNjcmV0ZSB2YXJpYWJsZSAoZS5nLiwgdGhlIHByb2JhYmlsaXR5IG9mIGdldHRpbmcgYSBjZXJ0YWluIG51bWJlciBvZiBoZWFkcyBmcm9tIGZvdXIgY29pbiBmbGlwcyksIGVtcGhhc2l6aW5nIHRoZSBnYXBzIGJldHdlZW4gYmFycy4NCmBgYHtyLCxlY2hvPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCBiaWcgPVRSVUUsIG91dC5leHRyYT0nc3R5bGU9ImRpc3BsYXk6YmxvY2s7IG1hcmdpbi1sZWZ0OmF1dG87IG1hcmdpbi1yaWdodDphdXRvOyInfQ0KDQpsaWJyYXJ5KGdncGxvdDIpDQoNCiMgLS0tIERhdGFmcmFtZSB1bnR1ayBEYXRhIERpc2tyaXQgLS0tDQpkYXRhX2Rpc2NyZXRlX2hlYWRzIDwtIGRhdGEuZnJhbWUoDQogIEhlYWRzID0gZmFjdG9yKDA6NCksICMgVWJhaCBtZW5qYWRpICdmYWN0b3InIGFnYXIgZGlwZXJsYWt1a2FuIHNlYmFnYWkga2F0ZWdvcmkgZGlza3JpdA0KICBQcm9iYWJpbGl0eSA9IGMoMS8xNiwgNC8xNiwgNi8xNiwgNC8xNiwgMS8xNikNCikNCg0KIyAtLS0gUGxvdHRpbmcgRGlhZ3JhbSBCYXRhbmcgLS0tDQpnZ3Bsb3QoZGF0YV9kaXNjcmV0ZV9oZWFkcywgYWVzKHg9SGVhZHMsIHk9UHJvYmFiaWxpdHkpKSArDQogICMgRGlhZ3JhbSBCYXRhbmc6IHN0YXQ9ImlkZW50aXR5IiBtZW5nZ3VuYWthbiBuaWxhaSBZIHNlY2FyYSBsYW5nc3VuZw0KICBnZW9tX2JhcihzdGF0PSJpZGVudGl0eSIsIA0KICAgICAgICAgICBmaWxsPSIjMWY3OGI0IiwgIyBXYXJuYSBiaXJ1IHlhbmcgbWVuYXJpaw0KICAgICAgICAgICBjb2xvcj0iYmxhY2siLCANCiAgICAgICAgICAgd2lkdGg9MC44KSArICMgTGViYXIgYmF0YW5nIGRpYXR1ciB1bnR1ayBtZW5jaXB0YWthbiBjZWxhaCAoZ2FwcykNCiAgDQogICMgVGFtYmFoa2FuIGxhYmVsIHByb2JhYmlsaXRhcyBkaSBhdGFzIHNldGlhcCBiYXRhbmcNCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IHJvdW5kKFByb2JhYmlsaXR5LCAzKSksIA0KICAgICAgICAgICAgdmp1c3QgPSAtMC4xLCANCiAgICAgICAgICAgIHNpemUgPSA0LA0KICAgICAgICAgICAgZm9udGZhY2UgPSAiYm9sZCIpICsNCiAgDQogICMgSnVkdWwgZGFuIExhYmVsIFN1bWJ1DQogIGxhYnMoDQogICAgdGl0bGUgPSAiUHJvYmFiaWxpdGFzIFZhcmlhYmVsIERpc2tyaXQ6IEp1bWxhaCBIZWFkcyBkYXJpIDQgTGVtcGFyYW4gS29pbiIsDQogICAgc3VidGl0bGUgPSAiTWVudW5qdWtrYW4gQ2VsYWggQW50YXIgQmF0YW5nIChEYXRhIEhhbnlhIEFkYSBQYWRhIE5pbGFpIFNwZXNpZmlrKSIsDQogICAgeCA9ICJKdW1sYWggSGVhZHMgKHgpIiwNCiAgICB5ID0gIlByb2JhYmlsaXRhcyBQKFg9eCkiDQogICkgKw0KICANCiAgIyBUZW1hIGRhbiBQZW5nYXR1cmFuIFRhbXBpbGFuICh1bnR1ayB0YW1waWxhbiBtYWtzaW1hbC9iZXNhcikNCiAgdGhlbWVfbWluaW1hbCgpICsgDQogIHRoZW1lKA0KICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEwLCBmYWNlID0gImJvbGQiLCBoanVzdCA9IDAuNCksDQogICAgcGxvdC5zdWJ0aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTAsIGhqdXN0ID0gMC40KSwNCiAgICBheGlzLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCksDQogICAgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMCkNCiAgKQ0KYGBgDQoNCg0KQi4gQ29udGludW91cyBEYXRhIFZpc3VhbGl6YXRpb24gKERlbnNpdHkgQ3VydmUvSGlzdG9ncmFtKQ0KDQpUaGlzIGNvZGUgZGVtb25zdHJhdGVzIGEgY29udGludW91cyB2YXJpYWJsZSAobGlrZSBoZWlnaHQsIGZvbGxvd2luZyBhIE5vcm1hbCBEaXN0cmlidXRpb24pLCBzaG93aW5nIHRoZSBzbW9vdGggY3VydmUgYW5kIGNvbm5lY3RlZCBoaXN0b2dyYW0gYmFycy4NCg0KYGBge3IsZWNobz1GQUxTRSwgd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgYmlnID1UUlVFLCBvdXQuZXh0cmE9J3N0eWxlPSJkaXNwbGF5OmJsb2NrOyBtYXJnaW4tbGVmdDphdXRvOyBtYXJnaW4tcmlnaHQ6YXV0bzsiJ30NCg0KbGlicmFyeShnZ3Bsb3QyKQ0KDQojIEdlbmVyYXRlIDEwMDAgcmFuZG9tIGRhdGEgcG9pbnRzIGZvbGxvd2luZyBhIE5vcm1hbCBEaXN0cmlidXRpb24gKENvbnRpbnVvdXMgVmFyaWFibGUpDQojIEV4YW1wbGU6IEhlaWdodCB3aXRoIGEgbWVhbiBvZiAxNzAgYW5kIHN0YW5kYXJkIGRldmlhdGlvbiBvZiAxMA0Kc2V0LnNlZWQoNDIpDQpkYXRhX2NvbnRpbnVvdXMgPC0gZGF0YS5mcmFtZSgNCiAgSGVpZ2h0ID0gcm5vcm0oMTAwMCwgbWVhbiA9IDE3MCwgc2QgPSAxMCkNCikNCg0KIyBQbG90dGluZyB0aGUgRGVuc2l0eSBDdXJ2ZSBhbmQgSGlzdG9ncmFtDQpnZ3Bsb3QoZGF0YV9jb250aW51b3VzLCBhZXMoeD1IZWlnaHQpKSArDQogICMgMS4gSGlzdG9ncmFtIChiYXJzIGFyZSBjb25uZWN0ZWQvbm8gZ2FwcykNCiAgZ2VvbV9oaXN0b2dyYW0oYWVzKHk9YWZ0ZXJfc3RhdChkZW5zaXR5KSksIGJpbndpZHRoID0gMywgZmlsbD0ibGlnaHRjb3JhbCIsIGNvbG9yPSJibGFjayIsIGFscGhhPTAuNykgKw0KICAjIDIuIERlbnNpdHkgQ3VydmUgKHNtb290aCBsaW5lKQ0KICBnZW9tX2RlbnNpdHkoY29sb3I9ImJsdWUiLCBsaW5ld2lkdGg9MS41KSArDQogIGxhYnMoDQogICAgdGl0bGUgPSAiVmlzdWFsaXphdGlvbiBvZiBDb250aW51b3VzIFZhcmlhYmxlIChEZW5zaXR5IEN1cnZlKSIsDQogICAgeCA9ICJIZWlnaHQgKGNtKSIsDQogICAgeSA9ICJEZW5zaXR5Ig0KICApICsNCiAgdGhlbWVfbWluaW1hbCgpDQpgYGANCg0KDQpDLiBDb25jZXB0dWFsIEZvcm11bGEgaW4gUiAoQXJlYSBVbmRlciB0aGUgQ3VydmUpDQoNClRoZSBub3JtKCkgZnVuY3Rpb24gaW4gUiBjYWxjdWxhdGVzIHRoZSBhcmVhIHVuZGVyIHRoZSBOb3JtYWwgRGlzdHJpYnV0aW9uIGN1cnZlIChjdW11bGF0aXZlIHByb2JhYmlsaXR5KSwgd2hpY2ggaXMgdGhlIG1ldGhvZCB1c2VkIGZvciBjb250aW51b3VzIHZhcmlhYmxlcy5TY2VuYXJpbzogDQoNCklmIGhlaWdodCAoJFgkKSBpcyBub3JtYWxseSBkaXN0cmlidXRlZCB3aXRoIGEgbWVhbiAoJFxtdSQpIG9mICQxNzAkIGNtIGFuZCBhIHN0YW5kYXJkIGRldmlhdGlvbiAoJFxzaWdtYSQpIG9mICQxMCQgY20sIHdoYXQgaXMgdGhlIHByb2JhYmlsaXR5IHRoYXQgYSBwZXJzb24ncyBoZWlnaHQgaXMgbGVzcyB0aGFuICQxODAkIGNtPyAoJFAoWCA8IDE4MCkkKQ0KDQpgYGB7cixlY2hvPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCBiaWcgPVRSVUUsIG91dC5leHRyYT0nc3R5bGU9ImRpc3BsYXk6YmxvY2s7IG1hcmdpbi1sZWZ0OmF1dG87IG1hcmdpbi1yaWdodDphdXRvOyInfQ0KDQojIFBhcmFtZXRlciBEaXN0cmlidXNpIE5vcm1hbA0KbWVhbl92YWwgPC0gMTcwICAjIFJhdGEtcmF0YSAowrUpDQpzdGRldiA8LSAxMCAgICAgICMgU3RhbmRhciBEZXZpYXNpICjPgykNCnhfdmFsdWUgPC0gMTgwICAgIyBCYXRhcyBuaWxhaSB5YW5nIGRpY2FyaQ0KDQojIDEuIFRlbnR1a2FuIHJlbnRhbmcgc3VtYnUgWCAoNCBrYWxpIHN0ZGV2IGRhcmkgbWVhbikNCnhfcmFuZ2UgPC0gc2VxKG1lYW5fdmFsIC0gNCAqIHN0ZGV2LCBtZWFuX3ZhbCArIDQgKiBzdGRldiwgbGVuZ3RoLm91dCA9IDEwMDApDQoNCiMgMi4gSGl0dW5nIG5pbGFpIGtlcmFwYXRhbiAodGluZ2dpIGt1cnZhKSB1bnR1ayBzZXRpYXAgWA0KeV9yYW5nZSA8LSBkbm9ybSh4X3JhbmdlLCBtZWFuID0gbWVhbl92YWwsIHNkID0gc3RkZXYpDQoNCiMgMy4gQnVhdCBwbG90IGRhc2FyIGt1cnZhIGxvbmNlbmcNCnBsb3QoeF9yYW5nZSwgeV9yYW5nZSwgDQogICAgIHR5cGUgPSAibCIsIA0KICAgICBtYWluID0gIlZpc3VhbGlzYXNpIFByb2JhYmlsaXRhcyBQKFggPCAxODApIiwNCiAgICAgeGxhYiA9ICJOaWxhaSBYIiwgDQogICAgIHlsYWIgPSAiS2VyYXBhdGFuIFByb2JhYmlsaXRhcyIsDQogICAgIGNvbCA9ICJkYXJrYmx1ZSIsICMgV2FybmEgZ2FyaXMga3VydmE6IEJpcnUgZ2VsYXANCiAgICAgbHdkID0gMykgIyBLZXRlYmFsYW4gZ2FyaXMga3VydmE6IDMNCg0KIyA0LiBUZW50dWthbiBiYXRhcyB1bnR1ayBwZW5nYXJzaXJhbg0KeF9zaGFkZSA8LSBzZXEobWluKHhfcmFuZ2UpLCB4X3ZhbHVlLCBsZW5ndGgub3V0ID0gMTAwMCkNCnlfc2hhZGUgPC0gZG5vcm0oeF9zaGFkZSwgbWVhbiA9IG1lYW5fdmFsLCBzZCA9IHN0ZGV2KQ0KDQojIDUuIEFyc2lyIGFyZWEgUChYIDwgMTgwKSBkZW5nYW4gd2FybmEgQmlydSBMYW5naXQNCnBvbHlnb24oYyh4X3NoYWRlLCByZXYoeF9zaGFkZSkpLCBjKHlfc2hhZGUsIHJlcCgwLCBsZW5ndGgoeV9zaGFkZSkpKSwgDQogICAgICAgIGNvbCA9ICJza3libHVlIiwgIyBHYW50aSB3YXJuYSBhcnNpcmFuIG1lbmphZGkgQmlydSBMYW5naXQNCiAgICAgICAgYm9yZGVyID0gTkEpIA0KDQojIDYuIFRhbWJhaGthbiBnYXJpcyB2ZXJ0aWthbCBwYWRhIE1lYW4gKMK1KSBkYW4gWA0KYWJsaW5lKHYgPSBtZWFuX3ZhbCwgY29sID0gInJlZCIsIGx0eSA9IDIpICMgR2FyaXMgcHV0dXMtcHV0dXMgdW50dWsgUmF0YS1yYXRhDQphYmxpbmUodiA9IHhfdmFsdWUsIGNvbCA9ICJkYXJrZ3JlZW4iLCBsdHkgPSAxLCBsd2QgPSAyKSAjIEdhcmlzIHRlYmFsIHVudHVrIFg9MTgwDQoNCiMgNy4gVGFtYmFoa2FuIHRla3MgcGVuamVsYXNhbg0KcHJvYmFiaWxpdHkgPC0gcG5vcm0ocSA9IHhfdmFsdWUsIG1lYW4gPSBtZWFuX3ZhbCwgc2QgPSBzdGRldikNCnByb2JfdGV4dCA8LSBwYXN0ZSgiUChYIDwgMTgwKSA9Iiwgcm91bmQocHJvYmFiaWxpdHkgKiAxMDAsIDIpLCAiJSIpDQp0ZXh0KG1lYW5fdmFsIC0gc3RkZXYsIG1heCh5X3JhbmdlKSAqIDAuNSwgDQogICAgIHByb2JfdGV4dCwgDQogICAgIGNvbCA9ICJibGFjayIsIA0KICAgICBmb250ID0gMiwgDQogICAgIGNleCA9IDEuMikgIyBQZXJiZXNhciB1a3VyYW4gdGVrcw0KDQpgYGANCg0KVGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHRoZSBDb250aW51b3VzIFJhbmRvbSBWYXJpYWJsZSAoUlYpLCB0aGUgUHJvYmFiaWxpdHkgRGVuc2l0eSBGdW5jdGlvbiAoUERGKSwgYW5kIHRoZSBDdW11bGF0aXZlIERpc3RyaWJ1dGlvbiBGdW5jdGlvbiAoQ0RGKSBpcyB0aGUgZnVuZGFtZW50YWwgYnJpZGdlIGNvbm5lY3RpbmcgdGhlIGZpZWxkIG9mIHN0YXRpc3RpY3Mgd2l0aCB0aGUgcG93ZXJmdWwgdG9vbHMgb2YgaW50ZWdyYWwgYW5kIGRpZmZlcmVudGlhbCBjYWxjdWx1cy4NCg0KMS4gVGhlIENvbnRpbnVvdXMgUmFuZG9tIFZhcmlhYmxlQSByYW5kb20gdmFyaWFibGUgKCRYJCkgaXMgY2xhc3NpZmllZCBhcyBjb250aW51b3VzIGlmIGl0IGNhbiBhc3N1bWUgYW55IHZhbHVlIHdpdGhpbiBhIGdpdmVuIGludGVydmFsIG9uIHRoZSByZWFsIG51bWJlciBsaW5lLCBzdWNoIGFzICRbYSwgYl0kIG9yICQoLVxpbmZ0eSwgXGluZnR5KSQuIEV4YW1wbGVzIGluY2x1ZGUgbWVhc3VyZWQgcXVhbnRpdGllcyBsaWtlIGhlaWdodCwgdGltZSwgdGVtcGVyYXR1cmUsIGFuZCB2ZWxvY2l0eS4NCg0KWmVybyBQb2ludCBQcm9iYWJpbGl0eTogU2luY2UgdGhlcmUgaXMgYW4gaW5maW5pdGUgbnVtYmVyIG9mIHBvc3NpYmxlIHZhbHVlcyB3aXRoaW4gYW55IGludGVydmFsLCB0aGUgcHJvYmFiaWxpdHkgb2YgdGhlIHZhcmlhYmxlIGxhbmRpbmcgZXhhY3RseSBvbiBhbnkgc2luZ2xlIHBvaW50IGlzIGFsd2F5cyB6ZXJvOiQkUChYID0geCkgPSAwJCQNCg0KSW50ZXJ2YWwtQmFzZWQgUHJvYmFiaWxpdHk6IFByb2JhYmlsaXRpZXMgYXJlIG1lYW5pbmdmdWwgb25seSB3aGVuIG1lYXN1cmVkIG92ZXIgYW4gaW50ZXJ2YWw6JCRQKGEgXGxlIFggXGxlIGIpID0gXGludF97YX1ee2J9IGYoeCkgZHgkJA0KDQoyLiBUaGUgUHJvYmFiaWxpdHkgRGVuc2l0eSBGdW5jdGlvbiAoUERGKSwgJGYoeCkkVGhlIFBERiwgZGVub3RlZCAkZih4KSQsIGlzIHRoZSBkZXNjcmlwdGl2ZSBmdW5jdGlvbiB0aGF0IGlsbHVzdHJhdGVzIHRoZSBkZW5zaXR5IG9mIHByb2JhYmlsaXR5IGFyb3VuZCBlYWNoIHZhbHVlICR4JC4gVGhlIFBERiBpcyB0aGUgb3BlcmF0aW9uYWwgaGVhcnQgb2YgYW55IGNvbnRpbnVvdXMgZGlzdHJpYnV0aW9uLg0KDQpJbnRlcnByZXRhdGlvbiBDYXZlYXQ6IEEgY3J1Y2lhbCBkaXN0aW5jdGlvbiBpcyB0aGF0IHRoZSB2YWx1ZSBvZiAkZih4KSQgaXRzZWxmIGlzIG5vdCBhIHByb2JhYmlsaXR5Lg0KDQpEZW5zaXR5IEluZGljYXRvcjogTGFyZ2VyIHZhbHVlcyBvZiAkZih4KSQgbWVyZWx5IGluZGljYXRlIGEgaGlnaGVyIHByb2JhYmlsaXR5IGRlbnNpdHkgYXJvdW5kIHRoYXQgc3BlY2lmaWMgdmFsdWUuDQoNClZhbGlkYXRpb24gUmVxdWlyZW1lbnRzOiBBIGZ1bmN0aW9uICRmKHgpJCBpcyBhIHZhbGlkIFBERiBvbmx5IGlmIGl0IHNhdGlzZmllcyB0d28gZXNzZW50aWFsIHJ1bGVzOg0KDQoxLiBOb24tbmVnYXRpdml0eTogJGYoeCkgXGdlIDAkIGZvciBhbGwgJHgkLlRvdGFsIEFyZWEgRXF1YWxzIDE6IA0KDQoyLiBUaGUgdG90YWwgYXJlYSB1bmRlciB0aGUgUERGIGN1cnZlIG11c3QgaW50ZWdyYXRlIHRvIDE6JCRcaW50X3stXGluZnR5fV57XGluZnR5fSBmKHgpIGR4ID0gMSQkDQoNClByb2JhYmlsaXR5IENhbGN1bGF0aW9uOiBUaGUgcHJvYmFiaWxpdHkgZm9yIGFuIGludGVydmFsICgkUChhIFxsZSBYIFxsZSBiKSQpIGlzIGNvbXB1dGVkIGFzIHRoZSBhcmVhIHVuZGVyIHRoZSBQREYgY3VydmUgYmV0d2VlbiAkYSQgYW5kICRiJDokJFAoYSBcbGUgWCBcbGUgYikgPSBcaW50X3thfV57Yn0gZih4KSBkeCQkRXhhbXBsZSBQREY6ICRmKHgpID0gM3heMiQgb24gJFswLCAxXSQuDQoNCjMuIFRoZSBDdW11bGF0aXZlIERpc3RyaWJ1dGlvbiBGdW5jdGlvbiAoQ0RGKSwgJEYoeCkkVGhlIENERiwgZGVub3RlZCAkRih4KSQsIGlzIGRlZmluZWQgYXMgdGhlIHByb2JhYmlsaXR5IHRoYXQgdGhlIFJhbmRvbSBWYXJpYWJsZSAkWCQgdGFrZXMgYSB2YWx1ZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJHgkICgkUChYIFxsZSB4KSQpLiBUaGUgQ0RGIGlzIGFuIGluaGVyZW50bHkgY3VtdWxhdGl2ZSBtZWFzdXJlLg0KDQpJbnRlZ3JhbCBSZWxhdGlvbnNoaXA6IFRoZSBDREYgaXMgdGhlIGludGVncmFsIG9mIHRoZSBQREYgZnJvbSB0aGUgbG93ZXIgYm91bmQgb2YgdGhlIGRpc3RyaWJ1dGlvbiB1cCB0byB0aGUgcG9pbnQgJHgkOiQkRih4KSA9IFAoWCBcbGUgeCkgPSBcaW50X3tsb3d9Xnt4fSBmKHQpIGR0JCRFeGFtcGxlIENERjogRm9yIHRoZSBQREYgJGYoeCkgPSAzeF4yJCBvbiAkWzAsIDFdJCwgdGhlIENERiBpcyBjYWxjdWxhdGVkIGFzICRGKHgpID0gXGludF97MH1ee3h9IDN0XjIgZHQgPSB4XjMkLg0KDQpUaGUgUmVjaXByb2NhbCBSZWxhdGlvbnNoaXA6IFBERiB2cy4gQ0RGDQoNClRoZSByZWxhdGlvbnNoaXAgYmV0d2VlbiAkZih4KSQgYW5kICRGKHgpJCBpcyB0aGUgYmFja2JvbmUgb2YgdGhlIEZ1bmRhbWVudGFsIFRoZW9yZW0gb2YgQ2FsY3VsdXMuIFRoZXkgYXJlIGFuIGludGVncmFsL2Rlcml2YXRpdmUgcGFpcjokJFx0ZXh0e1BERiB9IGYoeCkgPSBcZnJhY3tkfXtkeH0gRih4KSA9IEYnKHgpJCRUaGlzIG1lYW5zIHRoZSBQREYgaXMgc2ltcGx5IHRoZSByYXRlIG9mIGNoYW5nZSBvZiB0aGUgQ0RGLiBZb3UgY2FuIG9idGFpbiB0aGUgUERGIGJ5IGRpZmZlcmVudGlhdGluZyB0aGUgQ0RGLCBhbmQgeW91IGNhbiBvYnRhaW4gdGhlIENERiBieSBpbnRlZ3JhdGluZyB0aGUgUERGLg0KDQpgYGB7cixlY2hvPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCBiaWcgPVRSVUUsIG91dC5leHRyYT0nc3R5bGU9ImRpc3BsYXk6YmxvY2s7IG1hcmdpbi1sZWZ0OmF1dG87IG1hcmdpbi1yaWdodDphdXRvOyInfQ0KDQojIDEuIERlZmluZSB0aGUgUERGIGFuZCBDREYgRnVuY3Rpb25zDQojIFBERjogZih4KSA9IDN4XjIsIGZvciAwIDw9IHggPD0gMQ0KZl9wZGYgPC0gZnVuY3Rpb24oeCkgew0KICAjIFRoZSBpZmVsc2Ugc3RhdGVtZW50IGNvcnJlY3RseSBoYW5kbGVzIHRoZSByYW5nZSBbMCwgMV0NCiAgaWZlbHNlKHggPj0gMCAmIHggPD0gMSwgMyAqIHheMiwgMCkNCn0NCg0KIyBDREY6IEYoeCkgPSB4XjMsIGZvciAwIDw9IHggPD0gMQ0KZl9jZGYgPC0gZnVuY3Rpb24oeCkgew0KICAjIFRoaXMgc2V0cyB0aGUgQ0RGIHRvIDAgYmVmb3JlIDAsIHheMyBvbiBbMCwgMV0sIGFuZCAxIGFmdGVyIDEuDQogIGlmZWxzZSh4IDwgMCwgMCwgaWZlbHNlKHggPiAxLCAxLCB4XjMpKQ0KfQ0KDQojIDIuIFZhbGlkYXRpb24gQ2hlY2sgKFRvdGFsIEFyZWEgbXVzdCBlcXVhbCAxKQ0KIyBVc2UgdGhlIGludGVncmF0ZSBmdW5jdGlvbiB0byBudW1lcmljYWxseSBjaGVjayB0aGUgdG90YWwgYXJlYQ0KdmFsaWRhdGlvbl9jaGVjayA8LSBpbnRlZ3JhdGUoZl9wZGYsIGxvd2VyID0gMCwgdXBwZXIgPSAxKQ0KDQoNCiMgMy4gUHJvYmFiaWxpdHkgQ2FsY3VsYXRpb246IFAoMC41IDw9IFggPD0gMSkNCiMgVXNpbmcgdGhlIEludGVncmFsIChBcmVhIHVuZGVyIHRoZSBQREYpDQpwcm9iX2ludGVncmFsIDwtIGludGVncmF0ZShmX3BkZiwgbG93ZXIgPSAwLjUsIHVwcGVyID0gMSkNCg0KDQojIFVzaW5nIHRoZSBDREY6IEYoMSkgLSBGKDAuNSkNCnByb2JfY2RmIDwtIGZfY2RmKDEpIC0gZl9jZGYoMC41KQ0KDQoNCiMgNC4gQ29tcGVsbGluZyBWaXN1YWxpemF0aW9ucw0KDQojIFBsb3QgdGhlIFBERg0KY3VydmUoZl9wZGYsIGZyb20gPSAtMC41LCB0byA9IDEuNSwgbiA9IDIwMCwgY29sID0gIiNGRjU3MzMiLCBsd2QgPSAyLA0KICAgICAgeWxhYiA9ICJmKHgpIC0gUHJvYmFiaWxpdHkgRGVuc2l0eSBGdW5jdGlvbiIsIHhsYWIgPSAiWCIsDQogICAgICBtYWluID0gIlRoZSBTaGFwZSBvZiBQcm9iYWJpbGl0eSBEZW5zaXR5OiBmKHgpID0gM3heMiIpDQoNCiMgUGxvdCB0aGUgQ0RGDQpwbG90KGZfY2RmLCBmcm9tID0gLTAuNSwgdG8gPSAxLjUsIG4gPSAyMDAsIHR5cGUgPSAibCIsIGNvbCA9ICIjMzM3MUZGIiwgbHdkID0gMiwNCiAgICAgeWxhYiA9ICJGKHgpIC0gQ3VtdWxhdGl2ZSBEaXN0cmlidXRpb24gRnVuY3Rpb24iLCB4bGFiID0gIlgiLA0KICAgICBtYWluID0gIlRoZSBBY2N1bXVsYXRpb24gb2YgUHJvYmFiaWxpdHk6IEYoeCkgPSB4XjMiKQ0KYGBgDQoNCiMgLiBTYW1wbGluZyBEaXN0cmlidWl0aW9uDQoNClRoaXMgc3VtbWFyeSwgYmFzZWQgb24gdGhlIHZpZGVvICJTYW1wbGluZyBEaXN0cmlidXRpb25zICg3LjIpIiwgdW5sb2NrcyBvbmUgb2YgdGhlIG1vc3Qgdml0YWwgY29uY2VwdHMgaW4gaW5mZXJlbnRpYWwgc3RhdGlzdGljczogdW5kZXJzdGFuZGluZyBub3QganVzdCBzaW5nbGUgZGF0YSBwb2ludHMsIGJ1dCB0aGUgYmVoYXZpb3Igb2YgYXZlcmFnZXMgZHJhd24gcmVwZWF0ZWRseSBmcm9tIGEgcG9wdWxhdGlvbi4NCg0KPGNlbnRlcj4NCjxpZnJhbWUgc3JjPSJodHRwczovL3d3dy55b3V0dWJlLmNvbS9lbWJlZC83UzdqNzVkM0dNNCIgd2lkdGg9IjY4MCIgaGVpZ2h0PSI0MDAiIGRhdGEtZXh0ZXJuYWw9IjEiIGZyYW1lYm9yZGVyPSIwIiBhbGxvd2Z1bGxzY3JlZW4+IDwvaWZyYW1lPg0KPC9jZW50ZXI+DQoNCiMjIC4gU3VtbWFyeSBvZiB0aGUgdmlkZW86DQoNClRoZSB2aWRlbyBzdGFydHMgYnkgcmVzb2x2aW5nIGEgbWFqb3Igc291cmNlIG9mIGNvbmZ1c2lvbjogZGlmZmVyZW50aWF0aW5nIGJldHdlZW4gdGhyZWUgdHlwZXMgb2Ygc3RhdGlzdGljYWwgZGlzdHJpYnV0aW9uczoNCg0KMS4gVGhlIFBvcHVsYXRpb24gRGlzdHJpYnV0aW9uOiB0aGlzIGlzIHRoZSBjb21wbGV0ZSBkYXRhIHNldCBmcm9tIGV2ZXJ5IGluZGl2aWR1YWwgaW4gdGhlIGVudGlyZSBwb3B1bGF0aW9uLCBjaGFyYWN0ZXJpemVkIGJ5IGl0cyBtZWFuICgkXG11JCkgYW5kIHN0YW5kYXJkIGRldmlhdGlvbiAoJFxzaWdtYSQpLg0KDQoyLiBUaGUgU2FtcGxlIERpc3RyaWJ1dGlvbjogdGhpcyBpcyBtZXJlbHkgdGhlIGRhdGEgY29sbGVjdGVkIGZyb20gb25lIHNpbmdsZSByYW5kb20gc2FtcGxlLiBJdOKAmXMgaGlnaGx5IHZhcmlhYmxlIGFuZCBvZnRlbiBmYWlscyB0byBwZXJmZWN0bHkgbWlycm9yIHRoZSBwb3B1bGF0aW9uLg0KDQozLiBUaGUgU2FtcGxpbmcgRGlzdHJpYnV0aW9uOiB0aGlzIGlzIG91ciBjZW50cmFsIGZvY3VzLiBJdCBpcyBhIGRpc3RyaWJ1dGlvbiBidWlsdCBub3QgZnJvbSBpbmRpdmlkdWFsIHNjb3JlcywgYnV0IGZyb20gdGhlIHN0YXRpc3RpYyAobGlrZSB0aGUgbWVhbiwgJFxiYXJ7eH0kKSBjYWxjdWxhdGVkIGZyb20gaHVuZHJlZHMgb3IgdGhvdXNhbmRzIG9mIHJhbmRvbSBzYW1wbGVzIHRha2VuIGZyb20gdGhlIHNhbWUgcG9wdWxhdGlvbi4gSXTigJlzIGVzc2VudGlhbGx5IGEgInN0YWNrIG9mIHNhbXBsZSBtZWFucyIgdGhhdCB0ZWxscyB1cyB0aGUgcHJvYmFiaWxpdHkgb2Ygb2JzZXJ2aW5nIGEgc3BlY2lmaWMgc2FtcGxlIGF2ZXJhZ2UuDQoNClRoZSBwb3dlciBvZiB0aGUgU2FtcGxpbmcgRGlzdHJpYnV0aW9uIGxpZXMgaW4gaXRzIHByZWRpY3RhYmlsaXR5LCB3aGljaCBhbGxvd3MgdXMgdG8gZ2VuZXJhbGl6ZSByZXN1bHRzIGZyb20gYSBzbWFsbCBncm91cCB0byBhIGxhcmdlIHBvcHVsYXRpb246DQoNClN0YWJsZSBNZWFuOiB0aGUgbWVhbiBvZiB0aGUgU2FtcGxpbmcgRGlzdHJpYnV0aW9uICgkXG11X3tcYmFye3h9fSQpIHdpbGwgYWx3YXlzIGVxdWFsIHRoZSBwb3B1bGF0aW9uIG1lYW4gKCRcbXUkKS5SZWR1Y2VkIFZhcmlhYmlsaXR5IChUaGUgU3RhbmRhcmQgRXJyb3IpOiBDcnVjaWFsbHksIHNhbXBsZSBtZWFucyBhcmUgbGVzcyB2YXJpYWJsZSB0aGFuIGluZGl2aWR1YWwgb2JzZXJ2YXRpb25zLiBUaGVyZWZvcmUsIHRoZSBzcHJlYWQgb2YgdGhlIFNhbXBsaW5nIERpc3RyaWJ1dGlvbiBpcyBtdWNoIG5hcnJvd2VyIGFuZCB0YWxsZXIgdGhhbiB0aGUgb3JpZ2luYWwgcG9wdWxhdGlvbiBjdXJ2ZS4gVGhpcyBtZWFzdXJlIG9mIHNwcmVhZCBpcyBjYWxsZWQgdGhlIFN0YW5kYXJkIEVycm9yICgkXHNpZ21hX3tcYmFye3h9fSQpLkEgTW92ZSBUb3dhcmQgTm9ybWFsaXR5OiBFdmVuIGlmIHRoZSBvcmlnaW5hbCBQb3B1bGF0aW9uIERpc3RyaWJ1dGlvbiBpcyBzdHJhbmdlbHkgc2hhcGVkLCB0aGUgU2FtcGxpbmcgRGlzdHJpYnV0aW9uIHdpbGwgdGVuZCB0b3dhcmQgYSBOb3JtYWwgKGJlbGwtc2hhcGVkKSBkaXN0cmlidXRpb24gYXMgdGhlIHNhbXBsZSBzaXplIGluY3JlYXNlcy4gVGhpcyBwcmluY2lwbGUgaXMgdGhlIGNvcm5lcnN0b25lIG9mIHRoZSBDZW50cmFsIExpbWl0IFRoZW9yZW0uDQoNClRoZSByZWxhdGlvbnNoaXAgYmV0d2VlbiB0aGUgcG9wdWxhdGlvbiBhbmQgdGhlIHNhbXBsaW5nIGRpc3RyaWJ1dGlvbiBpcyBnb3Zlcm5lZCBieSB0aGVzZSB0d28gZnVuZGFtZW50YWwgZm9ybXVsYXM6DQoNCk1lYW4gb2YgdGhlIFNhbXBsaW5nIERpc3RyaWJ1dGlvbjokJFxtdV97XGJhcnt4fX0gPSBcbXUkJFN0YW5kYXJkIEVycm9yIChTdGFuZGFyZCBEZXZpYXRpb24gb2YgdGhlIFNhbXBsaW5nIERpc3RyaWJ1dGlvbik6IFRoaXMgZm9ybXVsYSBzaG93cyB0aGF0IGFzIHRoZSBzYW1wbGUgc2l6ZSAoJG4kKSBpbmNyZWFzZXMsIHRoZSBTdGFuZGFyZCBFcnJvciBkZWNyZWFzZXMsIG1ha2luZyB0aGUgZGlzdHJpYnV0aW9uIHRpZ2h0ZXIuJCRcc2lnbWFfe1xiYXJ7eH19ID0gXGZyYWN7XHNpZ21hfXtcc3FydHtufX0kJFRoZXNlIGFyZSB1c2VkIHRvIHN0YW5kYXJkaXplIGEgc2FtcGxlIG1lYW4gKCRcYmFye3h9JCkgaW50byBhIFotc2NvcmU6JCRaID0gXGZyYWN7XGJhcnt4fSAtIFxtdX17XHNpZ21hL1xzcXJ0e259fSQkRm9yIGV4YW1wbGUsIHVzaW5nIHRoZXNlIGZvcm11bGFzLCB0aGUgdmlkZW8gY2FsY3VsYXRlcyB0aGF0IHRoZSBwcm9iYWJpbGl0eSB0aGF0IHRoZSBhdmVyYWdlIGhlaWdodCAoJFxiYXJ7eH0kKSBvZiBhIHJhbmRvbSBzYW1wbGUgb2YgMTAgQ2FuYWRpYW5zIGlzIGxlc3MgdGhhbiAxNTcgY20gKGdpdmVuICRcbXUgPSAxNjAgXHRleHR7IGNtfSwgXHNpZ21hID0gNyBcdGV4dHsgY219JCkgaXMgb25seSA4LjY5JS4NCg0KYGBge3IsZWNobz1GQUxTRSwgd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgYmlnID1UUlVFLCBvdXQuZXh0cmE9J3N0eWxlPSJkaXNwbGF5OmJsb2NrOyBtYXJnaW4tbGVmdDphdXRvOyBtYXJnaW4tcmlnaHQ6YXV0bzsiJ30NCg0KIyBSZXF1aXJlZCBMaWJyYXJpZXMNCmxpYnJhcnkoZ2dwbG90MikNCmxpYnJhcnkoZHBseXIpDQoNCiMgRGF0YSBmcm9tIHRoZSBWaWRlbyBFeGFtcGxlOiBDYW5hZGlhbiBIZWlnaHRzDQptdSA8LSAxNjAgICAgICMgUG9wdWxhdGlvbiBNZWFuIChtdSkNCnNpZ21hIDwtIDcgICAgIyBQb3B1bGF0aW9uIFN0YW5kYXJkIERldmlhdGlvbiAoc2lnbWEpDQpuIDwtIDEwICAgICAgICMgU2FtcGxlIFNpemUgKG4pDQoNCiMgQ2FsY3VsYXRlIHRoZSBTdGFuZGFyZCBFcnJvciAoU3RhbmRhcmQgRGV2aWF0aW9uIG9mIHRoZSBTYW1wbGluZyBEaXN0cmlidXRpb24pDQpzaWdtYV94YmFyIDwtIHNpZ21hIC8gc3FydChuKQ0KDQojIENyZWF0ZSBkYXRhIHBvaW50cyBmb3IgcGxvdHRpbmcgdGhlIE5vcm1hbCBjdXJ2ZXMNCmRhdGFfcG9pbnRzIDwtIGRhdGEuZnJhbWUoeCA9IHNlcSgxMzAsIDE5MCwgbGVuZ3RoLm91dCA9IDUwMCkpDQoNCiMgQ2FsY3VsYXRlIERlbnNpdHkgZm9yIFBvcHVsYXRpb24gYW5kIFNhbXBsaW5nDQpkYXRhX3BvaW50cyA8LSBkYXRhX3BvaW50cyAlPiUNCiAgbXV0YXRlKA0KICAgICMgUG9wdWxhdGlvbiBEaXN0cmlidXRpb246IFggfiBOKDE2MCwgNykNCiAgICBkZW5zaXR5X3BvcCA9IGRub3JtKHgsIG1lYW4gPSBtdSwgc2QgPSBzaWdtYSksDQogICAgIyBTYW1wbGluZyBEaXN0cmlidXRpb246IFhiYXIgfiBOKDE2MCwgMi4yMSkNCiAgICBkZW5zaXR5X3NhbXBsaW5nID0gZG5vcm0oeCwgbWVhbiA9IG11LCBzZCA9IHNpZ21hX3hiYXIpDQogICkNCg0KIyBSZXNoYXBlIGRhdGEgdG8gImxvbmciIGZvcm1hdCBmb3IgZ2dwbG90DQpkYXRhX2xvbmcgPC0gZGF0YV9wb2ludHMgJT4lDQogIHRpZHlyOjpwaXZvdF9sb25nZXIoDQogICAgY29scyA9IHN0YXJ0c193aXRoKCJkZW5zaXR5IiksDQogICAgbmFtZXNfdG8gPSAiRGlzdHJpYnV0aW9uX1R5cGUiLA0KICAgIHZhbHVlc190byA9ICJEZW5zaXR5Ig0KICApDQoNCiMgUGxvdCB1c2luZyBnZ3Bsb3QyDQpnZ3Bsb3QoZGF0YV9sb25nLCBhZXMoeCA9IHgsIHkgPSBEZW5zaXR5LCBjb2xvciA9IERpc3RyaWJ1dGlvbl9UeXBlKSkgKw0KICBnZW9tX2xpbmUobHdkID0gMS4yKSArDQogICMgQWRkIHZlcnRpY2FsIGxpbmUgYXQgdGhlIHRlc3RlZCBzYW1wbGUgbWVhbiAoeGJhciA9IDE1NykNCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMTU3LCBsaW5ldHlwZSA9ICJkYXNoZWQiLCBjb2xvciA9ICJncmF5NTAiKSArDQogIGdlb21fdGV4dChhZXMoeCA9IDE1NywgeSA9IDAuMTUsIGxhYmVsID0gIlNhbXBsZSBNZWFuICgxNTdjbSkiKSwgDQogICAgICAgICAgICBjb2xvciA9ICJncmF5MzAiLCBhbmdsZSA9IDkwLCBzaXplID0gMywgaGp1c3QgPSAwKSArDQogIA0KICAjIEN1c3RvbWl6YXRpb24NCiAgc2NhbGVfY29sb3JfbWFudWFsKA0KICAgIHZhbHVlcyA9IGMoImRlbnNpdHlfcG9wIiA9ICIjMDA3MkIyIiwgImRlbnNpdHlfc2FtcGxpbmciID0gIiNENTVFMDAiKSwNCiAgICBsYWJlbHMgPSBjKCJQb3B1bGF0aW9uIERpc3RyaWJ1dGlvbiAoz4M9NykiLCAiU2FtcGxpbmcgRGlzdHJpYnV0aW9uICjPgy/iiJpuIOKJiCAyLjIxKSIpDQogICkgKw0KICBsYWJzKA0KICAgIHRpdGxlID0gIkRpc3RyaWJ1dGlvbiBDb21wYXJpc29uOiBQb3B1bGF0aW9uIHZzLiBTYW1wbGUgTWVhbiIsDQogICAgc3VidGl0bGUgPSBwYXN0ZTAoIkNhbmFkaWFuIEhlaWdodHM6IM68PSIsIG11LCAiY20sIG49IiwgbiksDQogICAgeCA9ICJIZWlnaHQgKGNtKSIsDQogICAgeSA9ICJQcm9iYWJpbGl0eSBEZW5zaXR5IiwNCiAgICBjb2xvciA9ICJEaXN0cmlidXRpb24gVHlwZSINCiAgKSArDQogIHRoZW1lX21pbmltYWwoYmFzZV9zaXplID0gMTQpICsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIsIA0KICAgICAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGZhY2UgPSAiYm9sZCIpKQ0KYGBgDQoNCg0KIyAuIENlbnRyYWwgTGltaXQgVGhlb3JlbQ0KVGhlIHZpZGVvICJUaGUgQ2VudHJhbCBMaW1pdCBUaGVvcmVtICg3LjMpIiBkaXZlcyBpbnRvIHdoYXQgaXMgYXJndWFibHkgdGhlIG1vc3QgZnVuZGFtZW50YWwgYW5kIHJldm9sdXRpb25hcnkgcHJpbmNpcGxlIGluIGFsbCBvZiBtb2Rlcm4gc3RhdGlzdGljcy4gVGhlIENMVCBpc24ndCBqdXN0IGEgZm9ybXVsYTsgaXQncyB0aGUgbWF0aGVtYXRpY2FsIG1hZ2ljIHRoYXQgYWxsb3dzIGRhdGEgc2NpZW50aXN0cyB0byB0cnVzdCB0aGVpciBpbmZlcmVudGlhbCBjb25jbHVzaW9ucy4NCg0KPGNlbnRlcj4NCjxpZnJhbWUgc3JjPSJodHRwczovL3d3dy55b3V0dWJlLmNvbS9lbWJlZC9pdmQ4d0VIbk1DZyIgd2lkdGg9IjY4MCIgaGVpZ2h0PSI0MDAiIGRhdGEtZXh0ZXJuYWw9IjEiIGZyYW1lYm9yZGVyPSIwIiBhbGxvd2Z1bGxzY3JlZW4+IDwvaWZyYW1lPg0KPC9jZW50ZXI+DQoNCiMjIC4gU3VtbWFyeSBvZiB0aGUgdmlkZW86DQpCZWZvcmUgdGhlIENMVCwgc3RhdGlzdGljaWFucyBzdHJ1Z2dsZWQgd2l0aCBwb3B1bGF0aW9uIGRhdGEgdGhhdCBjYW1lIGluIGFsbCBzaGFwZXMgYW5kIHNpemVzIHNrZXdlZCwgZmxhdCwgb3Igd2lsZGx5IGlycmVndWxhci4gVGhlIENMVCBvZmZlcmVkIGEgc3R1bm5pbmcgc29sdXRpb24sIGVzc2VudGlhbGx5IHByb3ZpZGluZyBhIHByZWRpY3RpdmUgZ3VhcmFudGVlOg0KDQoxLiBUaGUgQ0xUIFN0YXRlbWVudDogSWYgeW91IHRha2Ugc2ltcGxlIHJhbmRvbSBzYW1wbGVzICgkbiQpIHRoYXQgYXJlIGxhcmdlIGVub3VnaCAodHlwaWNhbGx5ICRuIFxnZSAzMCQpIGZyb20gYW55IHBvcHVsYXRpb24gKHJlZ2FyZGxlc3Mgb2YgaXRzIG9yaWdpbmFsIGRpc3RyaWJ1dGlvbiBzaGFwZSkNCg0KMi4gR3VhcmFudGVlZCBOb3JtYWxpdHk6IFRoZSBTYW1wbGluZyBEaXN0cmlidXRpb24gb2YgdGhlIHNhbXBsZSBtZWFucyAoJFxiYXJ7eH0kKSB3aWxsIHRlbmQgdG93YXJkIGEgTm9ybWFsIERpc3RyaWJ1dGlvbiAodGhlIGJlbGwgY3VydmUpLg0KDQozLiBDZW50cmFsaXplZCBNZWFuOiBUaGUgbWVhbiBvZiB0aGUgU2FtcGxpbmcgRGlzdHJpYnV0aW9uICgkXG11X3tcYmFye3h9fSQpIHdpbGwgYmUgZXF1YWwgdG8gdGhlIHRydWUgcG9wdWxhdGlvbiBtZWFuICgkXG11JCkuDQoNCjQuIFN0YW5kYXJkIEVycm9yOiBUaGUgc3ByZWFkIG9mIHRoaXMgbmV3LCBub3JtYWwgZGlzdHJpYnV0aW9uICh0aGUgU3RhbmRhcmQgRXJyb3IsICRcc2lnbWFfe1xiYXJ7eH19JCkgaXMgcGVyZmVjdGx5IHByZWRpY3RhYmxlIGJ5IHRoZSBmb3JtdWxhICRcc2lnbWEgLyBcc3FydHtufSQuDQoNCjUuIFRoZSBTaW1wbGUgUG93ZXI6IFRoZSBDTFQgZXNzZW50aWFsbHkgbm9ybWFsaXplcyB0aGUgY2hhb3Mgb2YgdGhlIHJlYWwgd29ybGQuIEl0IGd1YXJhbnRlZXMgdGhhdCB3ZSBjYW4gdXNlIHRoZSBzaW1wbGUsIHBvd2VyZnVsIHRvb2xzIG9mIHRoZSBOb3JtYWwgRGlzdHJpYnV0aW9uIChsaWtlIFotc2NvcmVzKSB0byBjYWxjdWxhdGUgcHJvYmFiaWxpdGllcyBhbmQgdGVzdCBoeXBvdGhlc2VzIG9uIG91ciBzYW1wbGUgbWVhbnPigJRhIGZlYXQgaW1wb3NzaWJsZSBvbiB0aGUgbWVzc3kgb3JpZ2luYWwgcG9wdWxhdGlvbiBkYXRhLg0KDQpJZiB0aGUgUG9wdWxhdGlvbiBpcyBOb3JtYWw6IElmIHRoZSBvcmlnaW5hbCBwb3B1bGF0aW9uIGlzIGFscmVhZHkgTm9ybWFsLCB0aGUgU2FtcGxpbmcgRGlzdHJpYnV0aW9uIGlzIGFsd2F5cyBOb3JtYWwsIGV2ZW4gaWYgdGhlIHNhbXBsZSBzaXplICgkbiQpIGlzIHNtYWxsLklmIHRoZSBQb3B1bGF0aW9uIGlzIE5PVCBOb3JtYWw6IFdlIG11c3QgcmVseSBvbiB0aGUgbGFyZ2Ugc2FtcGxlIHNpemUgY29uZGl0aW9uLiBUaGUgZ2VuZXJhbCBjb25zZW5zdXMgaXMgdGhhdCAkbiQgbXVzdCBiZSBhdCBsZWFzdCAzMCAoJG4gXGdlIDMwJCkgdG8gYXNzdW1lIHRoZSBTYW1wbGluZyBEaXN0cmlidXRpb24gaXMgTm9ybWFsLg0KDQpVc2luZyB0aGUgQ0xUIGd1YXJhbnRlZSBvZiBub3JtYWxpdHksIHdlIHJlbHkgb24gdGhlIFotc2NvcmUgZm9ybXVsYSB0byBmaW5kIHRoZSBwcm9iYWJpbGl0eSBvZiBvYnNlcnZpbmcgYSBzcGVjaWZpYyBzYW1wbGUgbWVhbiAoJFxiYXJ7eH0kKS4NCg0KYGBge3IsZWNobz1GQUxTRSwgd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgYmlnID1UUlVFLCBvdXQuZXh0cmE9J3N0eWxlPSJkaXNwbGF5OmJsb2NrOyBtYXJnaW4tbGVmdDphdXRvOyBtYXJnaW4tcmlnaHQ6YXV0bzsiJ30NCg0KIyBSZXF1aXJlZCBMaWJyYXJpZXMNCmxpYnJhcnkoZ2dwbG90MikNCmxpYnJhcnkoZHBseXIpDQpsaWJyYXJ5KHBhdGNod29yaykgIyBGb3IgY29tYmluaW5nIHBsb3RzIGludG8gYW4gYXR0cmFjdGl2ZSBsYXlvdXQNCg0KIyBTaW11bGF0aW9uIFBhcmFtZXRlcnMNCm51bV9zYW1wbGVzIDwtIDEwMDAwICMgTnVtYmVyIG9mIHNhbXBsZXMgdGFrZW4gZm9yIGVhY2ggY2FzZQ0KbGFtYmRhIDwtIDAuNSAgICAgICAjIFBhcmFtZXRlciBmb3IgdGhlIEV4cG9uZW50aWFsIERpc3RyaWJ1dGlvbiAoT3VyIFNrZXdlZCBQb3B1bGF0aW9uKQ0KDQojIC0tLSAxLiBTYW1wbGUgU2ltdWxhdGlvbnMgLS0tDQoNCiMgbj0xOiBUaGUgT3JpZ2luYWwgUG9wdWxhdGlvbiBEaXN0cmlidXRpb24gKEhpZ2hseSBTa2V3ZWQpDQpzZXQuc2VlZCg0MikgDQpzYW1wbGVfbjEgPC0gZGF0YS5mcmFtZSgNCiAgbWVhbiA9IHJleHAobnVtX3NhbXBsZXMsIHJhdGUgPSBsYW1iZGEpLA0KICBncm91cCA9ICJTYW1wbGUgU2l6ZSBuID0gMSAoT3JpZ2luYWwgUG9wdWxhdGlvbikiDQopDQoNCiMgbj01OiBUaGUgU2FtcGxpbmcgRGlzdHJpYnV0aW9uIChTdGFydGluZyB0byBMb29rIE5vcm1hbCkNCnNhbXBsZV9uNSA8LSBkYXRhLmZyYW1lKA0KICBtZWFuID0gcmVwbGljYXRlKG51bV9zYW1wbGVzLCBtZWFuKHJleHAoNSwgcmF0ZSA9IGxhbWJkYSkpKSwNCiAgZ3JvdXAgPSAiU2FtcGxlIFNpemUgbiA9IDUgKFNsaWdodGx5IE5vcm1hbCkiDQopDQoNCiMgbj0zMDogVGhlIFNhbXBsaW5nIERpc3RyaWJ1dGlvbiAoUGVyZmVjdGx5IE5vcm1hbCAtIENMVCBBcHBsaWVzKQ0Kc2FtcGxlX24zMCA8LSBkYXRhLmZyYW1lKA0KICBtZWFuID0gcmVwbGljYXRlKG51bV9zYW1wbGVzLCBtZWFuKHJleHAoMzAsIHJhdGUgPSBsYW1iZGEpKSksDQogIGdyb3VwID0gIlNhbXBsZSBTaXplIG4gPSAzMCAoQ0xUIEFwcGxpZXMpIg0KKQ0KDQojIENvbWJpbmUgZGF0YSBmb3IgcGxvdHRpbmcNCmNsdF9kYXRhIDwtIGJpbmRfcm93cyhzYW1wbGVfbjEsIHNhbXBsZV9uNSwgc2FtcGxlX24zMCkNCmNsdF9kYXRhJGdyb3VwIDwtIGZhY3RvcihjbHRfZGF0YSRncm91cCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gYygiU2FtcGxlIFNpemUgbiA9IDEgKE9yaWdpbmFsIFBvcHVsYXRpb24pIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU2FtcGxlIFNpemUgbiA9IDUgKFNsaWdodGx5IE5vcm1hbCkiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTYW1wbGUgU2l6ZSBuID0gMzAgKENMVCBBcHBsaWVzKSIpKQ0KDQojIC0tLSAyLiBQbG90dGluZyBGdW5jdGlvbiAtLS0NCg0KIyBGdW5jdGlvbiB0byBjcmVhdGUgY29uc2lzdGVudCBoaXN0b2dyYW0vZGVuc2l0eSBwbG90cw0KY3JlYXRlX3Bsb3QgPC0gZnVuY3Rpb24oZGF0YSwgdGl0bGUsIGZpbGxfY29sb3IpIHsNCiAgZ2dwbG90KGRhdGEsIGFlcyh4ID0gbWVhbikpICsNCiAgICAjIEhpc3RvZ3JhbSBzaG93aW5nIGZyZXF1ZW5jeQ0KICAgIGdlb21faGlzdG9ncmFtKGFlcyh5ID0gYWZ0ZXJfc3RhdChkZW5zaXR5KSksIGJpbnMgPSA1MCwgZmlsbCA9IGZpbGxfY29sb3IsIGNvbG9yID0gIndoaXRlIiwgYWxwaGEgPSAwLjcpICsNCiAgICAjIERlbnNpdHkgbGluZSBzaG93aW5nIHRoZSBjdXJ2ZSBzaGFwZQ0KICAgIGdlb21fZGVuc2l0eShjb2xvciA9ICJibGFjayIsIGx3ZCA9IDEpICsNCiAgICBsYWJzKHRpdGxlID0gdGl0bGUsIHggPSAiU2FtcGxlIE1lYW4gVmFsdWUiLCB5ID0gIlByb2JhYmlsaXR5IERlbnNpdHkiKSArDQogICAgdGhlbWVfbWluaW1hbChiYXNlX3NpemUgPSAxMikgKw0KICAgIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoZmFjZSA9ICJib2xkIiwgY29sb3IgPSAiIzM2NDU0RiIpKQ0KfQ0KDQojIC0tLSAzLiBDcmVhdGUgSW5kaXZpZHVhbCBQbG90cyB3aXRoIENvbnRyYXN0aW5nIENvbG9ycyAtLS0NCg0KcDEgPC0gY3JlYXRlX3Bsb3QoZmlsdGVyKGNsdF9kYXRhLCBncm91cCA9PSAiU2FtcGxlIFNpemUgbiA9IDEgKE9yaWdpbmFsIFBvcHVsYXRpb24pIiksIA0KICAgICAgICAgICAgICAgICAgIjEuIEV4cG9uZW50aWFsIERpc3RyaWJ1dGlvbiAoSGlnaGx5IFNrZXdlZCkiLCAiI0Q1NUUwMCIpDQpwMiA8LSBjcmVhdGVfcGxvdChmaWx0ZXIoY2x0X2RhdGEsIGdyb3VwID09ICJTYW1wbGUgU2l6ZSBuID0gNSAoU2xpZ2h0bHkgTm9ybWFsKSIpLCANCiAgICAgICAgICAgICAgICAgICIyLiBNZWFuIG9mIG49NTogU3RhcnRpbmcgdGhlIEJlbGwgQ3VydmUiLCAiIzAwNzJCMiIpDQpwMyA8LSBjcmVhdGVfcGxvdChmaWx0ZXIoY2x0X2RhdGEsIGdyb3VwID09ICJTYW1wbGUgU2l6ZSBuID0gMzAgKENMVCBBcHBsaWVzKSIpLCANCiAgICAgICAgICAgICAgICAgICIzLiBNZWFuIG9mIG49MzA6IFBlcmZlY3RseSBOb3JtYWwiLCAiIzAwOUU3MyIpDQoNCiMgLS0tIDQuIENvbWJpbmUgUGxvdHMgaW50byBhbiBBdHRyYWN0aXZlIExheW91dCAtLS0NCg0KIyBVc2luZyBwYXRjaHdvcmsgZm9yIGEgM3gxIHZlcnRpY2FsIGxheW91dA0KcDEgLyBwMiAvIHAzICsgDQogIHBsb3RfYW5ub3RhdGlvbigNCiAgICB0aXRsZSA9ICJDZW50cmFsIExpbWl0IFRoZW9yZW0gKENMVCkgU2ltdWxhdGlvbjogVGhlIEV2b2x1dGlvbiBvZiBOb3JtYWxpdHkiLA0KICAgIHN1YnRpdGxlID0gIlN0YXJ0aW5nIFBvcHVsYXRpb246IEhpZ2hseSBTa2V3ZWQgRXhwb25lbnRpYWwgRGlzdHJpYnV0aW9uIiwNCiAgICBjYXB0aW9uID0gIlNvdXJjZTogU2ltdWxhdGlvbiBiYXNlZCBvbiBDTFQgcHJpbmNpcGxlcyAobj0zMCBpcyB0aGUgY29tbW9uIHRocmVzaG9sZCkuIiwNCiAgICB0aGVtZSA9IHRoZW1lX21pbmltYWwoYmFzZV9zaXplID0gMTYpDQogICkNCg0KYGBgDQoNCiMgLiBTYW1wbGUgUHJvcG9ydGlvbg0KVGhlc2UgdHdvIHZpZGVvc+KAlCJUaGUgQ2VudHJhbCBMaW1pdCBUaGVvcmVtICg3LjMpIiBhbmQgIlNhbXBsaW5nIERpc3RyaWJ1dGlvbiBvZiB0aGUgU2FtcGxlIFByb3BvcnRpb24gKDcuNCki4oCUcmVwcmVzZW50IHRoZSB1bHRpbWF0ZSB0cmFuc2l0aW9uIGZyb20gZGVzY3JpcHRpdmUgYW5hbHlzaXMgdG8gYWN0aW9uYWJsZSBpbmZlcmVudGlhbCBzdGF0aXN0aWNzLiBUaGVpciBlc3NlbnRpYWwgbWVzc2FnZSBpcyB0aGF0LCB1bmRlciB0aGUgcmlnaHQgY29uZGl0aW9ucywgdGhlIGNoYW90aWMgcmVzdWx0cyBvZiBzYW1wbGluZyBjYW4gYmUgcmVsaWFibHkgdHJhbnNmb3JtZWQgaW50byBhIHByZWRpY3RhYmxlIE5vcm1hbCBEaXN0cmlidXRpb24uDQoNCjxjZW50ZXI+DQo8aWZyYW1lIHNyYz0iaHR0cHM6Ly93d3cueW91dHViZS5jb20vZW1iZWQvcTJlNG1LMEZUYnciIHdpZHRoPSI2ODAiIGhlaWdodD0iNDAwIiBkYXRhLWV4dGVybmFsPSIxIiBmcmFtZWJvcmRlcj0iMCIgYWxsb3dmdWxsc2NyZWVuPiA8L2lmcmFtZT4NCjwvY2VudGVyPg0KDQojIyAuIFN1bW1hcnkgb2YgdGhlIHZpZGVvOg0KDQojIyMgLiBUaGUgQ2VudHJhbCBMaW1pdCBUaGVvcmVtIChDTFQpIGZvciB0aGUgTWVhbiAoJFxiYXJ7eH0kKQ0KVGhlIENMVCBpcyBvZnRlbiBjYWxsZWQgdGhlICJtYWdpYyBvZiBzdGF0aXN0aWNzIiBiZWNhdXNlIGl0IHByb3ZpZGVzIGFuIGluY3JlZGlibGUgZ3VhcmFudGVlIGl0IGVuc3VyZXMgdGhhdCB0aGUgc2FtcGxpbmcgZGlzdHJpYnV0aW9uIG9mIHRoZSBtZWFuIHdpbGwgYmUgbm9ybWFsLCByZWdhcmRsZXNzIG9mIHRoZSBvcmlnaW5hbCBwb3B1bGF0aW9uJ3MgYml6YXJyZSBzaGFwZS4NCg0KIyMjIC4gVGhlIENMVCBNZWNoYW5pDQpXaGVuIHdlIHRha2UgbXVsdGlwbGUgc2FtcGxlcywgdGhlIGF2ZXJhZ2Ugb2YgdGhvc2Ugc2FtcGxlIG1lYW5zICgkXG11X3tcYmFye3h9fSQpIHdpbGwgcHJlY2lzZWx5IGVxdWFsIHRoZSB0cnVlIHBvcHVsYXRpb24gbWVhbiAoJFxtdSQpLiBNb3JlIGltcG9ydGFudGx5LCB0aGUgc3ByZWFkIG9mIHRoaXMgbmV3IGRpc3RyaWJ1dGlvbiBrbm93biBhcyB0aGUgU3RhbmRhcmQgRXJyb3IgKCRcc2lnbWFfe1xiYXJ7eH19JCkgaXMgZHJhc3RpY2FsbHkgcmVkdWNlZCBjb21wYXJlZCB0byB0aGUgb3JpZ2luYWwgcG9wdWxhdGlvbidzIHN0YW5kYXJkIGRldmlhdGlvbiAoJFxzaWdtYSQpLiBUaGlzIHJlbGF0aW9uc2hpcCBpcyBkZWZpbmVkIGFzICRcc2lnbWFfe1xiYXJ7eH19ID0gXGZyYWN7XHNpZ21hfXtcc3FydHtufX0kLg0KDQojIyMgLiBUaGUgTm9ybWFsIENvbmRpdGlvbiAoVGhlIFJ1bGUgb2YgMzApDQpGb3IgdGhlIENMVCB0byBraWNrIGluIGFuZCBlbnN1cmUgbm9ybWFsaXR5IHdoZW4gdGhlIHBvcHVsYXRpb24gaXMgbm90IG5vcm1hbCwgdGhlIHNhbXBsZSBzaXplICgkbiQpIG11c3QgYmUgbGFyZ2UgZW5vdWdoLCB3aXRoIHRoZSBjb21tb24gdGhyZXNob2xkIGJlaW5nICRuIFxnZSAzMCQuDQoNCiMjIyAuIFRoZSBTYW1wbGluZyBEaXN0cmlidXRpb24gb2YgdGhlIFByb3BvcnRpb24gKCRcaGF0e3B9JCkNCldoZW4gZGVhbGluZyB3aXRoIGNhdGVnb3JpY2FsIGRhdGEgKGxpa2UgInllcy9ubywiICJzdWNjZXNzL2ZhaWx1cmUiKSwgd2UgdXNlIHRoZSBwcm9wb3J0aW9uICgkXGhhdHtwfSQpIGluc3RlYWQgb2YgdGhlIG1lYW4gKCRcYmFye3h9JCkuIEp1c3QgbGlrZSB0aGUgbWVhbiwgaWYgd2UgcmVwZWF0ZWRseSBzYW1wbGUgYW5kIHBsb3QgdGhlIHJlc3VsdGluZyBwcm9wb3J0aW9ucywgdGhleSBhbHNvIGZvcm0gYSBTYW1wbGluZyBEaXN0cmlidXRpb24uDQoNCiMjIyAuIFRoZSBQcm9wb3J0aW9uIFJ1bGVzDQpUaGUgbWVhbiBvZiB0aGUgc2FtcGxlIHByb3BvcnRpb25zICgkXG11X3tcaGF0e3B9fSQpIHdpbGwgZXF1YWwgdGhlIHRydWUgcG9wdWxhdGlvbiBwcm9wb3J0aW9uICgkcCQpLiBUaGUgU3RhbmRhcmQgRXJyb3IgZm9yIHRoZSBwcm9wb3J0aW9uIGlzIGNhbGN1bGF0ZWQgdXNpbmcgdGhlIGZvcm11bGEgJFxzaWdtYV97XGhhdHtwfX0gPSBcc3FydHtcZnJhY3twKDEtcCl9e259fSQuDQoNCiMjIyAuIFRoZSBOb3JtYWwgQ29uZGl0aW9uIChUaGUgUnVsZSBvZiBTdWNjZXNzZXMgYW5kIEZhaWx1cmVzKQ0KRm9yIHRoZSBzYW1wbGluZyBkaXN0cmlidXRpb24gb2YgdGhlIHByb3BvcnRpb24gdG8gYmUgY29uc2lkZXJlZCBub3JtYWwsIHRoZSBDTFQgYXBwbGllcyBkaWZmZXJlbnRseS4gSW5zdGVhZCBvZiByZWx5aW5nIG9ubHkgb24gJG4gXGdlIDMwJCwgd2UgbXVzdCB2ZXJpZnkgdGhhdCB0aGVyZSBhcmUgZW5vdWdoIGV4cGVjdGVkIHN1Y2Nlc3NlcyBhbmQgZW5vdWdoIGV4cGVjdGVkIGZhaWx1cmVzOiBib3RoICRuIFxjZG90IHAkIGFuZCAkbiBcY2RvdCAoMS1wKSQgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gMTAuIE1lZXRpbmcgdGhlc2UgdHdvIHNpbXBsZSBjb25kaXRpb25zIGd1YXJhbnRlZXMgdGhhdCB0aGUgZGlzdHJpYnV0aW9uIGlzIHN1ZmZpY2llbnRseSBzeW1tZXRyaWMgdG8gdXNlIHRoZSBaLXNjb3JlIHRhYmxlLg0KDQpgYGB7cixlY2hvPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCBiaWcgPVRSVUUsIG91dC5leHRyYT0nc3R5bGU9ImRpc3BsYXk6YmxvY2s7IG1hcmdpbi1sZWZ0OmF1dG87IG1hcmdpbi1yaWdodDphdXRvOyInfQ0KbGlicmFyeShnZ3Bsb3QyKQ0KbGlicmFyeShkcGx5cikNCmxpYnJhcnkodGlkeXIpDQpsaWJyYXJ5KGdncmlkZ2VzKQ0KbGlicmFyeShwYXRjaHdvcmspDQoNCiMgLS0tIFBhcmFtZXRlciBTaW11bGFzaSAtLS0NCm51bV9zYW1wbGVzIDwtIDEwMDAwICMgSnVtbGFoIHJhdGEtcmF0YSBzYW1wZWwgdW50dWsgc2ltdWxhc2kNCmxhbWJkYSA8LSAwLjUgICAgICAgIyBQYXJhbWV0ZXIgdW50dWsgRGlzdHJpYnVzaSBFa3Nwb25lbnNpYWwgKFBvcHVsYXNpIE1pcmluZykNCm11X3BvcCA8LSAxL2xhbWJkYSAgIyBSYXRhLXJhdGEgUG9wdWxhc2kgKM68ID0gMikNCg0KIyAtLS0gMi4gU2ltdWxhc2kgRGF0YSB1bnR1ayBCZXJiYWdhaSBVa3VyYW4gU2FtcGVsIChuKSAtLS0NCg0KIyBCdWF0IGZ1bmdzaSB1bnR1ayBtZW5zaW11bGFzaWthbiByYXRhLXJhdGEgc2FtcGVsDQpzaW11bGF0ZV9tZWFucyA8LSBmdW5jdGlvbihuX3NpemUsIG51bV9ydW5zLCBsYW1iZGFfcmF0ZSkgew0KICAjIE1lbmdhbWJpbCByYXRhLXJhdGEgZGFyaSBuX3NpemUgb2JzZXJ2YXNpLCBkaXVsYW5nIG51bV9ydW5zIGthbGkNCiAgcmVwbGljYXRlKG51bV9ydW5zLCBtZWFuKHJleHAobl9zaXplLCByYXRlID0gbGFtYmRhX3JhdGUpKSkNCn0NCg0KIyBVa3VyYW4gc2FtcGVsIHlhbmcgYWthbiBkaXVqaQ0Kbl9zaXplcyA8LSBjKDEsIDIsIDUsIDEwLCAxNSwgMjAsIDMwKSANCg0KIyBKYWxhbmthbiBzaW11bGFzaSBkYW4gZ2FidW5na2FuIGhhc2lsbnlhDQpjbHRfZGF0YV9yaWRnZXMgPC0gZGF0YS5mcmFtZSgNCiAgbWVhbiA9IGMoDQogICAgc2ltdWxhdGVfbWVhbnMobl9zaXplc1sxXSwgbnVtX3NhbXBsZXMsIGxhbWJkYSksDQogICAgc2ltdWxhdGVfbWVhbnMobl9zaXplc1syXSwgbnVtX3NhbXBsZXMsIGxhbWJkYSksDQogICAgc2ltdWxhdGVfbWVhbnMobl9zaXplc1szXSwgbnVtX3NhbXBsZXMsIGxhbWJkYSksDQogICAgc2ltdWxhdGVfbWVhbnMobl9zaXplc1s0XSwgbnVtX3NhbXBsZXMsIGxhbWJkYSksDQogICAgc2ltdWxhdGVfbWVhbnMobl9zaXplc1s1XSwgbnVtX3NhbXBsZXMsIGxhbWJkYSksDQogICAgc2ltdWxhdGVfbWVhbnMobl9zaXplc1s2XSwgbnVtX3NhbXBsZXMsIGxhbWJkYSksDQogICAgc2ltdWxhdGVfbWVhbnMobl9zaXplc1s3XSwgbnVtX3NhbXBsZXMsIGxhbWJkYSkNCiAgKSwNCiAgIyBCdWF0IGtvbG9tIGdydXAgYmVyZGFzYXJrYW4gdWt1cmFuIHNhbXBlbCAobikNCiAgbl9ncm91cCA9IGZhY3RvcihyZXAobl9zaXplcywgZWFjaCA9IG51bV9zYW1wbGVzKSwgDQogICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gcmV2KG5fc2l6ZXMpKSAjIEJhbGlrIHVydXRhbiBhZ2FyIG4gdGVyYmVzYXIgZGkgYXRhcw0KKQ0KDQojIC0tLSAzLiBWaXN1YWxpc2FzaSBEZW5zaXR5IFJpZGdlcyAoUGxvdCBVdGFtYSkgLS0tDQoNCnBfcmlkZ2VzIDwtIGdncGxvdChjbHRfZGF0YV9yaWRnZXMsIGFlcyh4ID0gbWVhbiwgeSA9IG5fZ3JvdXAsIGZpbGwgPSBmYWN0b3Iobl9ncm91cCkpKSArDQogICMgR3VuYWthbiBnZW9tX2RlbnNpdHlfcmlkZ2VzIHVudHVrIGVmZWsgdmlzdWFsIHlhbmcgdHVtcGFuZyB0aW5kaWgNCiAgZ2VvbV9kZW5zaXR5X3JpZGdlcyhzY2FsZSA9IDMsIGFscGhhID0gMC44LCByZWxfbWluX2hlaWdodCA9IDAuMDEpICsNCiAgDQogICMgVGFtYmFoa2FuIGdhcmlzIHZlcnRpa2FsIHBhZGEgUmF0YS1yYXRhIFBvcHVsYXNpDQogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IG11X3BvcCwgbGluZXR5cGUgPSAiZGFzaGVkIiwgY29sb3IgPSAiYmxhY2siLCBsd2QgPSAxLjIpICsNCiAgDQogICMgS3VzdG9taXNhc2kgVGVtYSBkYW4gTGFiZWwNCiAgc2NhbGVfZmlsbF92aXJpZGlzX2Qob3B0aW9uID0gInBsYXNtYSIsIGRpcmVjdGlvbiA9IC0xKSArICMgUGFsZXQgd2FybmEgeWFuZyBtZW5hcmlrDQogIGxhYnMoDQogICAgdGl0bGUgPSAiRXZvbHVzaSBEaXN0cmlidXNpIFNhbXBsaW5nOiBWaXN1YWxpc2FzaSBEZW5zaXR5IFJpZGdlcyIsDQogICAgc3VidGl0bGUgPSBwYXN0ZTAoIlBvcHVsYXNpIEF3YWwgTWlyaW5nIChFa3Nwb25lbnNpYWwpLiBHYXJpcyBoaXRhbSA9IM68ID0iLCBtdV9wb3ApLA0KICAgIHggPSAiUmF0YS1yYXRhIFNhbXBlbCAoeMyEKSIsDQogICAgeSA9ICJVa3VyYW4gU2FtcGVsIChuKSINCiAgKSArDQogIHRoZW1lX21pbmltYWwoYmFzZV9zaXplID0gMTQpICsNCiAgdGhlbWUoDQogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChmYWNlID0gImJvbGQiLCBjb2xvciA9ICIjMzY0NTRGIiwgc2l6ZSA9IDE4KSwNCiAgICBsZWdlbmQucG9zaXRpb24gPSAibm9uZSIsICMgSGlsYW5na2FuIGxlZ2VuZGEga2FyZW5hIG5fZ3JvdXAgc3VkYWggbWVuamFkaSBZLWF4aXMNCiAgICBwYW5lbC5ncmlkLm1ham9yLnkgPSBlbGVtZW50X2JsYW5rKCksICMgQmVyc2loa2FuIGdhcmlzIGdyaWQgWQ0KICAgIHBhbmVsLmdyaWQubWlub3IueSA9IGVsZW1lbnRfYmxhbmsoKQ0KICApICsNCiAgIyBQYXN0aWthbiBsaW1pdCBYLWF4aXMgbWVuY2FrdXAgc2VtdWEgZGF0YSBzZWNhcmEgd2FqYXINCiAgY29vcmRfY2FydGVzaWFuKHhsaW0gPSBjKDAsIDEwKSkgDQoNCiMgVGFtcGlsa2FuIFBsb3QNCnBfcmlkZ2VzDQoNCg0KYGBgDQoNCiMgLiBSZXZpZXcgU2FtcGxpbmcgRGlzdHJpYnVpdGlvbg0KVGhlc2UgdGhyZWUgdmlkZW9zIGNvdmVyaW5nIHRoZSBDZW50cmFsIExpbWl0IFRoZW9yZW0gKENMVCksIHRoZSBTYW1wbGluZyBEaXN0cmlidXRpb24gb2YgdGhlIFByb3BvcnRpb24sIGFuZCBCaW5vbWlhbCBBcHByb3hpbWF0aW9uIHJlcHJlc2VudCB0aGUgdWx0aW1hdGUgdHJhbnNpdGlvbiBmcm9tIGFuYWx5emluZyBtZXNzeSBzYW1wbGUgZGF0YSB0byBtYWtpbmcgY29uZmlkZW50IHByZWRpY3Rpb25zIGFib3V0IGEgbGFyZ2UgcG9wdWxhdGlvbi4gVGhlaXIgZXNzZW50aWFsIHRlYWNoaW5nIGlzIGhvdyB3ZSBsZXZlcmFnZSB0aGUgbGF3cyBvZiBwcm9iYWJpbGl0eSB0byB0dXJuIGNoYW90aWMgc2FtcGxlIHJlc3VsdHMgaW50byBhIHJlbGlhYmxlIE5vcm1hbCBEaXN0cmlidXRpb24uDQoNCjxjZW50ZXI+DQo8aWZyYW1lIHNyYz0iaHR0cHM6Ly93d3cueW91dHViZS5jb20vZW1iZWQvYzBtRkVMX1NXekUiIHdpZHRoPSI2ODAiIGhlaWdodD0iNDAwIiBkYXRhLWV4dGVybmFsPSIxIiBmcmFtZWJvcmRlcj0iMCIgYWxsb3dmdWxsc2NyZWVuPiA8L2lmcmFtZT4NCjwvY2VudGVyPg0KDQojIyAuIFN1bW1hcnkgb2YgdGhlIHZpZGVvOg0KIyMjIC4gVGhlIENlbnRyYWwgUHJvbWlzZQ0KVGhlIGNvcmUgaWRlYSBzaGlmdHMgb3VyIGZvY3VzLkluc3RlYWQgb2Ygd29ycnlpbmcgYWJvdXQgYSBzaW5nbGUgc2FtcGxlJ3Mgb3V0Y29tZSwgd2UgY29uc2lkZXIgdGhlIGRpc3RyaWJ1dGlvbiBvZiBhIHN0YXRpc3RpYyAobGlrZSB0aGUgbWVhbiAkXGJhcnt4fSQgb3IgdGhlIHByb3BvcnRpb24gJFxoYXR7cH0kKSBpZiB3ZSB3ZXJlIHRvIGRyYXcgdGhvdXNhbmRzIG9mIHJhbmRvbSBzYW1wbGVzIGZyb20gdGhlIHNhbWUgcG9wdWxhdGlvbi4gVGhpcyBkaXN0cmlidXRpb24gaXMgY2FsbGVkIHRoZSBTYW1wbGluZyBEaXN0cmlidXRpb24uVGhpcyBzaGlmdCBpcyBjcnVjaWFsIGJlY2F1c2Ugd2hpbGUgaW5kaXZpZHVhbCBkYXRhIHBvaW50cyBjYW4gYmUgaGlnaGx5IGVycmF0aWMsIHRoZSBhdmVyYWdlcyBhbmQgcHJvcG9ydGlvbnMgb2YgbXVsdGlwbGUgc2FtcGxlcyBmb2xsb3cgaGlnaGx5IHByZWRpY3RhYmxlIHJ1bGVzIGRpY3RhdGVkIGJ5IHRoZSBDTFQuDQoNCiMjIyAuIFRoZSBDZW50cmFsIExpbWl0IFRoZW9yZW0gKENMVCkgZm9yIHRoZSBTYW1wbGUgTWVhbiAoJFxiYXJ7eH0kKQ0KVGhlIENMVCBpcyBzdGF0aXN0aWNzJyAibWFnaWMgc3BlbGwsIiBndWFyYW50ZWVpbmcgdGhhdCB0aGUgc2FtcGxpbmcgZGlzdHJpYnV0aW9uIG9mIHRoZSBtZWFuIHdpbGwgdGFrZSBvbiB0aGUgZmFtaWxpYXIgTm9ybWFsIChiZWxsLXNoYXBlZCkgRGlzdHJpYnV0aW9uLCByZWdhcmRsZXNzIG9mIGhvdyB3ZWlyZGx5IHNoYXBlZCB0aGUgb3JpZ2luYWwgcG9wdWxhdGlvbiBkYXRhIGlzLg0KDQpLZXkgUHJpbmNpcGxlcyBmb3IgJFxiYXJ7eH0kOg0KDQoxLiBTdGFibGUgQ2VudGVyOiBUaGUgYXZlcmFnZSBvZiBhbGwgc2FtcGxlIG1lYW5zICgkXG11X3tcYmFye3h9fSQpIHdpbGwgZXF1YWwgdGhlIHRydWUgcG9wdWxhdGlvbiBtZWFuICgkXG11JCkuDQoNCjIuIFJlZHVjZWQgU3ByZWFkOiBUaGUgdmFyaWFiaWxpdHkgb2YgdGhpcyBuZXcgZGlzdHJpYnV0aW9uIGlzIGRyYXN0aWNhbGx5IHNtYWxsZXIgdGhhbiB0aGUgcG9wdWxhdGlvbidzLiBUaGlzIGNvbnRyb2xsZWQgc3ByZWFkIGlzIHRoZSBTdGFuZGFyZCBFcnJvciAoJFxzaWdtYV97XGJhcnt4fX0kKSwgY2FsY3VsYXRlZCBhcyAkXHNpZ21hIC8gXHNxcnR7bn0kLiBUaGUgYmlnZ2VyIHRoZSBzYW1wbGUgc2l6ZSAoJG4kKSwgdGhlIHNtYWxsZXIgYW5kIHRhbGxlciB0aGUgcmVzdWx0aW5nIGN1cnZlIGlzLg0KDQozLiBUaGUgUnVsZSBvZiAzMDogVG8gZW5zdXJlIHRoaXMgbm9ybWFsaXR5IHRha2VzIGVmZmVjdCB3aGVuIHRoZSBwb3B1bGF0aW9uIGlzIG5vbi1ub3JtYWwsIHRoZSBzYW1wbGUgc2l6ZSAoJG4kKSBtdXN0IGJlIGF0IGxlYXN0IDMwICgkbiBcZ2UgMzAkKS4NCg0KIyMjIC4gVGhlIFNhbXBsaW5nIERpc3RyaWJ1dGlvbiBvZiB0aGUgU2FtcGxlIFByb3BvcnRpb24gKCRcaGF0e3B9JCkNCldoZW4gYW5hbHl6aW5nIGNhdGVnb3JpY2FsIG9yIGJpbmFyeSBkYXRhIChlLmcuLCBzdWNjZXNzL2ZhaWx1cmUsIHllcy9ubyksIHdlIHVzZSB0aGUgc2FtcGxlIHByb3BvcnRpb24gKCRcaGF0e3B9JCkuIFNpbWlsYXIgdG8gdGhlIG1lYW4sIGlmIHdlIHJlcGVhdGVkbHkgY2FsY3VsYXRlICRcaGF0e3B9JCwgaXRzIGRpc3RyaWJ1dGlvbiB3aWxsIGFsc28gYXBwcm9hY2ggbm9ybWFsaXR5Lg0KDQpLZXkgUHJpbmNpcGxlcyBmb3IgJFxoYXR7cH0kOg0KDQoxLiBTdGFibGUgQ2VudGVyOiBUaGUgbWVhbiBvZiB0aGUgc2FtcGxlIHByb3BvcnRpb25zICgkXG11X3tcaGF0e3B9fSQpIGVxdWFscyB0aGUgdHJ1ZSBwb3B1bGF0aW9uIHByb3BvcnRpb24gKCRwJCkuDQoNCjIuIFN0YW5kYXJkIEVycm9yOiBUaGUgdmFyaWFiaWxpdHkgaXMgY2FsY3VsYXRlZCBhcyAkXHNpZ21hX3tcaGF0e3B9fSA9IFxzcXJ0e1xmcmFje3AoMS1wKX17bn19JC4NCg0KMy4gVGhlIFJ1bGUgb2YgU3VjY2Vzc2VzIGFuZCBGYWlsdXJlczogdGhlIGNvbmRpdGlvbiBmb3Igbm9ybWFsaXR5IGhlcmUgaXMgc3RyaWN0ZXI6IHdlIG11c3QgZW5zdXJlIHRoYXQgdGhlIG51bWJlciBvZiBleHBlY3RlZCBzdWNjZXNzZXMgKCRuIFxjZG90IHAkKSBhbmQgZXhwZWN0ZWQgZmFpbHVyZXMgKCRuIFxjZG90ICgxLXApJCkgYXJlIGJvdGggZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIDEwLiBNZWV0aW5nIHRoZXNlIHR3byBjb25kaXRpb25zIGd1YXJhbnRlZXMgdGhlIGRpc3RyaWJ1dGlvbiBpcyBzeW1tZXRyaWMgZW5vdWdoIGZvciBub3JtYWwgYXBwcm94aW1hdGlvbi4NCg0KIyMjIC4gV2h5IENMVCBpcyBFc3NlbnRpYWwgKFRoZSBCaW5vbWlhbCBCcmlkZ2UpDQpPbmUgb2YgdGhlIG1vc3QgcHJhY3RpY2FsIGFwcGxpY2F0aW9ucyBvZiB0aGUgQ0xUIGZvciBwcm9wb3J0aW9ucyBpcyBzb2x2aW5nIGNvbXBsaWNhdGVkIHByb2JsZW1zIGludm9sdmluZyB0aGUgQmlub21pYWwgRGlzdHJpYnV0aW9uLkNhbGN1bGF0aW5nIHRoZSBleGFjdCBwcm9iYWJpbGl0eSBvZiwgc2F5LCBhdCBsZWFzdCAzNSBzdWNjZXNzZXMgb3V0IG9mIDEwMCB0cmlhbHMgdXNpbmcgdGhlIHRyYWRpdGlvbmFsIEJpbm9taWFsIGZvcm11bGEgaXMgdGVkaW91cywgcmVxdWlyaW5nIHRoZSBjYWxjdWxhdGlvbiBhbmQgc3VtbWluZyBvZiBtYW55IHByb2JhYmlsaXRpZXMuIFRoYW5rcyB0byB0aGUgQ0xULCBvbmNlIHRoZSAkbiBwIFxnZSAxMCQgYW5kICRuICgxLXApIFxnZSAxMCQgY29uZGl0aW9ucyBhcmUgbWV0LCB3ZSBjYW4gYXBwcm94aW1hdGUgdGhhdCBjb21wbGV4IHByb2JhYmlsaXR5IGVhc2lseSB1c2luZyBhIHNpbmdsZSBaLXNjb3JlIGNhbGN1bGF0aW9uLCBzYXZpbmcgaW1tZW5zZSB0aW1lIGFuZCBlZmZvcnQuDQoNCmBgYHtyLGVjaG89RkFMU0UsIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIGJpZyA9VFJVRSwgb3V0LmV4dHJhPSdzdHlsZT0iZGlzcGxheTpibG9jazsgbWFyZ2luLWxlZnQ6YXV0bzsgbWFyZ2luLXJpZ2h0OmF1dG87Iid9DQpsaWJyYXJ5KGdncGxvdDIpDQpsaWJyYXJ5KGRwbHlyKQ0KbGlicmFyeSh0aWR5cikNCmxpYnJhcnkoZ2dyaWRnZXMpDQpsaWJyYXJ5KHBhdGNod29yaykNCg0KIyAtLS0gU2ltdWxhdGlvbiBQYXJhbWV0ZXJzIC0tLQ0KbnVtX3NhbXBsZXMgPC0gMTAwMDAgDQpsYW1iZGEgPC0gMC41ICAgICAgICMgUGFyYW1ldGVyIGZvciB0aGUgRXhwb25lbnRpYWwgRGlzdHJpYnV0aW9uIChPdXIgU2tld2VkIFBvcHVsYXRpb24pDQptdV9wb3AgPC0gMS9sYW1iZGEgICMgUG9wdWxhdGlvbiBNZWFuICjOvCA9IDIpDQoNCiMgLS0tIFNhbXBsZSBTaW11bGF0aW9uIEZ1bmN0aW9uIC0tLQ0Kc2ltdWxhdGVfbWVhbnMgPC0gZnVuY3Rpb24obl9zaXplLCBudW1fcnVucywgbGFtYmRhX3JhdGUpIHsNCiAgcmVwbGljYXRlKG51bV9ydW5zLCBtZWFuKHJleHAobl9zaXplLCByYXRlID0gbGFtYmRhX3JhdGUpKSkNCn0NCg0KIyBTYW1wbGUgc2l6ZXMgdG8gdGVzdCAoZGVtb25zdHJhdGluZyB0aGUgdHJhbnNmb3JtYXRpb24gZnJvbSAxIHRvIDMwKQ0Kbl9zaXplcyA8LSBjKDEsIDIsIDUsIDEwLCAxNSwgMjAsIDMwKSANCg0KIyBSdW4gc2ltdWxhdGlvbiBhbmQgY29tYmluZSByZXN1bHRzDQpjbHRfZGF0YV9yaWRnZXMgPC0gZGF0YS5mcmFtZSgNCiAgbWVhbiA9IGMoDQogICAgc2ltdWxhdGVfbWVhbnMobl9zaXplc1sxXSwgbnVtX3NhbXBsZXMsIGxhbWJkYSksDQogICAgc2ltdWxhdGVfbWVhbnMobl9zaXplc1syXSwgbnVtX3NhbXBsZXMsIGxhbWJkYSksDQogICAgc2ltdWxhdGVfbWVhbnMobl9zaXplc1szXSwgbnVtX3NhbXBsZXMsIGxhbWJkYSksDQogICAgc2ltdWxhdGVfbWVhbnMobl9zaXplc1s0XSwgbnVtX3NhbXBsZXMsIGxhbWJkYSksDQogICAgc2ltdWxhdGVfbWVhbnMobl9zaXplc1s1XSwgbnVtX3NhbXBsZXMsIGxhbWJkYSksDQogICAgc2ltdWxhdGVfbWVhbnMobl9zaXplc1s2XSwgbnVtX3NhbXBsZXMsIGxhbWJkYSksDQogICAgc2ltdWxhdGVfbWVhbnMobl9zaXplc1s3XSwgbnVtX3NhbXBsZXMsIGxhbWJkYSkNCiAgKSwNCiAgIyBHcm91cGluZyBmYWN0b3IgYmFzZWQgb24gc2FtcGxlIHNpemUgKG4pDQogIG5fZ3JvdXAgPSBmYWN0b3IocmVwKG5fc2l6ZXMsIGVhY2ggPSBudW1fc2FtcGxlcyksIA0KICAgICAgICAgICAgICAgICAgIGxldmVscyA9IHJldihuX3NpemVzKSkgIyBSZXZlcnNlIG9yZGVyIGZvciBuPTMwIGF0IHRoZSB0b3ANCikNCg0KIyAtLS0gRGVuc2l0eSBSaWRnZXMgVmlzdWFsaXphdGlvbiAtLS0NCnBfcmlkZ2VzIDwtIGdncGxvdChjbHRfZGF0YV9yaWRnZXMsIGFlcyh4ID0gbWVhbiwgeSA9IG5fZ3JvdXAsIGZpbGwgPSBmYWN0b3Iobl9ncm91cCkpKSArDQogICMgVXNlIGdlb21fZGVuc2l0eV9yaWRnZXMgZm9yIHRoZSBiZWF1dGlmdWwgb3ZlcmxhcHBpbmcgZWZmZWN0DQogIGdlb21fZGVuc2l0eV9yaWRnZXMoc2NhbGUgPSAzLCBhbHBoYSA9IDAuOCwgcmVsX21pbl9oZWlnaHQgPSAwLjAxKSArDQogIA0KICAjIEFkZCB2ZXJ0aWNhbCBsaW5lIGZvciB0aGUgdHJ1ZSBwb3B1bGF0aW9uIG1lYW4gKHRoZSBjZW50ZXIgcG9pbnQpDQogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IG11X3BvcCwgbGluZXR5cGUgPSAiZGFzaGVkIiwgY29sb3IgPSAiYmxhY2siLCBsd2QgPSAxLjIpICsNCiAgDQogICMgQ3VzdG9taXphdGlvbg0KICBzY2FsZV9maWxsX3ZpcmlkaXNfZChvcHRpb24gPSAicGxhc21hIiwgZGlyZWN0aW9uID0gLTEpICsgDQogIGxhYnMoDQogICAgdGl0bGUgPSAiQ0xUIFNpbXVsYXRpb246IFRoZSBFdm9sdXRpb24gb2YgTm9ybWFsaXR5IHVzaW5nIERlbnNpdHkgUmlkZ2VzIiwNCiAgICBzdWJ0aXRsZSA9IHBhc3RlMCgiU3RhcnRpbmcgd2l0aCBhIFNrZXdlZCAoRXhwb25lbnRpYWwpIFBvcHVsYXRpb24uIEJsYWNrIGxpbmUgPSDOvCA9IiwgbXVfcG9wKSwNCiAgICB4ID0gIlNhbXBsZSBNZWFuICh4zIQpIiwNCiAgICB5ID0gIlNhbXBsZSBTaXplIChuKSINCiAgKSArDQogIHRoZW1lX21pbmltYWwoYmFzZV9zaXplID0gMTQpICsNCiAgdGhlbWUoDQogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChmYWNlID0gImJvbGQiLCBjb2xvciA9ICIjMzY0NTRGIiwgc2l6ZSA9IDE4KSwNCiAgICBsZWdlbmQucG9zaXRpb24gPSAibm9uZSIsIA0KICAgIHBhbmVsLmdyaWQubWFqb3IueSA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICBwYW5lbC5ncmlkLm1pbm9yLnkgPSBlbGVtZW50X2JsYW5rKCkNCiAgKSArDQogICMgUmVzdHJpY3QgWC1heGlzIGZvciBhIGZvY3VzZWQgdmlldyBvbiB0aGUgY2VudGVyDQogIGNvb3JkX2NhcnRlc2lhbih4bGltID0gYygwLCA4KSkgDQoNCiMgRGlzcGxheSBQbG90DQpwX3JpZGdlcw0KYGBgDQoNCiMgLiBSZWZlcmVuc2kNCg0KDQoxLiAiVGhlIEJhc2ljIFByYWN0aWNlIG9mIFN0YXRpc3RpY3MiIChFZGlzaSBQZXJ0YW1hOiAxOTk1KQ0KDQoyLiAiSW50cm9kdWN0b3J5IFN0YXRpc3RpY3Mgd2l0aCBSIiAoRWRpc2kgUGVydGFtYTogMjAwOCkNCg0KMy4g4oCdRm91bmRhdGlvbnMgb2YgU3RhdGlzdGljYWwgSW5mZXJlbmNlIGFuZCBEYXRhIFNjaWVuY2XigJ0NCg0KNC4gRWxlbWVudGFyeSBTdGF0aXN0aWNzOiBQaWN0dXJpbmcgdGhlIFdvcmxkIGJ5IFJvbiBMYXJzb24gYW5kIEJldHN5IEZhcmJlciwgN3RoIEVkaXRpb24sIHB1Ymxpc2hlZCBpbiAyMDE4Lg0KDQo1LiBTdGF0aXN0aWNzIGJ5IEphbWVzIFQuIE1jQ2xhdmUsIFAuIEdlb3JnZSBCZW5zb24sIGFuZCBUZXJyeSBTaW5jaWNoLCAxM3RoIEVkaXRpb24sIHB1Ymxpc2hlZCBpbiAyMDE4Lg0K