Tugas Week 11 ~ Probability Distribution

Nama: Adinda Adelia Futri

NIM: 52250055

Foto Adinda Adelia Futri

Student Profile

🎓 Student Majoring in Data Science at ITSB
📊 Data Science
📈 Statistics
💻 R Programming

Introduction to Probability Distributions of Continuous Variables

▶️ Watch: Introduction to Probability Distributions
Before exploring specific continuous probability distributions, it is important to understand the fundamental differences between discrete and continuous variables. Unlike discrete variables that take specific, countable values, continuous variables can assume any value within a given range or interval. This distinction fundamentally changes how we calculate and interpret probabilities. In continuous distributions, we focus on the probability of a variable falling within a certain range rather than taking exact values.

Comparison of Discrete and Continuous Distributions

Discrete Distribution

Continuous Distribution

Probability Density Function (PDF)

Probability Density Function (PDF):
The Probability Density Function describes the relative likelihood for a continuous random variable to take on a given value.

Mathematical Definition: \[ f(x)= \frac{d}{dx} F(x) \]
where: \(f(x)\) is the probability density function
\(F(x)\) is the cumulative distribution function
\(x\) is the value of the continuous random variable

Properties of PDF:
\(f(x) \geq 0\) for all \(x\) (Non-negativity)
\(\int_{-\infty}^{\infty} f(x) dx = 1\) (Normalization)
\(P(a \leq X \leq b) = \int_{a}^{b} f(x) dx\) (Area under curve)
\(f(x)=\frac{1}{\sigma \sqrt{2\pi}} e^{-\frac{1}{2}\left(\frac{x-\mu}{\sigma}\right)^2}\)

Introduction to Random Variables and Probability Distributions

What are Random Variables?
Random variables are functions that assign numerical values to outcomes of random experiments. They provide a mathematical framework for quantifying uncertainty and randomness in statistical analysis.

🔢 Discrete Random Variables

  • Definition: Variables with countable, finite outcomes
  • Examples: Number of heads in coin tosses, dice roll results
  • Probability Function: Probability Mass Function (PMF)
  • Key Properties: Sum of probabilities equals 1
  • R Functions: dbinom(), dpois(), dgeom()
PMF Formula: \[ P(X = x_i) = p_i \] Properties: \[ \sum_{i=1}^{\infty} p_i = 1 \]

📈 Continuous Random Variables

  • Definition: Variables with uncountable, infinite outcomes
  • Examples: Height, weight, temperature, time
  • Probability Function: Probability Density Function (PDF)
  • Key Properties: Area under curve equals 1
  • R Functions: dnorm(), dexp(), dunif()
PDF Formula: \[ f(x) \geq 0 \] Properties: \[ \int_{-\infty}^{\infty} f(x) dx = 1 \]

📊 Cumulative Distribution Function

  • Definition: Probability that X ≤ x
  • Universal: Works for both discrete and continuous
  • Properties: Non-decreasing, right-continuous
  • Range: 0 ≤ F(x) ≤ 1
  • R Functions: pbinom(), pnorm(), ppois()
CDF Formula: \[ F(x) = P(X \leq x) \] Discrete: \[ F(x) = \sum_{x_i \leq x} P(X = x_i) \] Continuous: \[ F(x) = \int_{-\infty}^{x} f(t) dt \]

🎯 Expectation and Variance

  • Expected Value (μ): Average/mean value
  • Variance (σ²): Measure of spread/dispersion
  • Standard Deviation: Square root of variance
  • Linearity: E[aX + b] = aE[X] + b
  • R Calculations: mean(), var(), sd()
Expectation: \[ E[X] = \sum x_i p_i \quad (\text{discrete}) \] \[ E[X] = \int x f(x) dx \quad (\text{continuous}) \] Variance: \[ Var(X) = E[(X - μ)^2] = E[X^2] - (E[X])^2 \]

Detailed Comparison: Discrete vs Continuous

Characteristic Discrete Random Variable Continuous Random Variable
Possible Values Countable, finite or countably infinite Uncountable, infinite within interval
Probability at Point P(X = x) can be positive P(X = x) = 0 for all x
Probability Function Probability Mass Function (PMF) Probability Density Function (PDF)
Total Probability ∑ P(X = x) = 1 ∫ f(x) dx = 1
Cumulative Distribution F(x) = ∑ P(X ≤ x) F(x) = ∫ f(t) dt from -∞ to x
Example Distributions Binomial, Poisson, Geometric Normal, Exponential, Uniform
Real-world Examples Number of customers, defect counts Height, temperature, waiting time

R Implementation of Random Variables

Cumulative Distribution Function (CDF)

Cumulative Distribution Function (CDF):
The CDF gives the probability that a random variable \(X\) will take a value less than or equal to \(x\).

Mathematical Definition: \[ F(x)=P(X≤x)=\int_{-\infty}^{x} f(t)dt \]
Properties of CDF:
\(F(x)\) is non-decreasing
\(\lim_{x \to -\infty} F(x) = 0\)
\(\lim_{x \to \infty} F(x) = 1\)
\(P(a < X \leq b) = F(b) - F(a)\)

Example Problem: Continuous Distribution

Problem: The time required to complete a standardized test follows a normal distribution with mean 120 minutes and standard deviation 15 minutes. What is the probability that a randomly selected student will complete the test in less than 100 minutes?

Solution Step by Step:

Step 1: Identify the parameters
\(\mu = 120\) minutes, \(\sigma = 15\) minutes, \(x = 100\) minutes
Step 2: Calculate the z-score
\(z = \frac{x - \mu}{\sigma} = \frac{100 - 120}{15} = \frac{-20}{15} = -1.33\)
Step 3: Find probability using standard normal distribution
\(P(X < 100) = P(Z < -1.33)\)
Step 4: Look up the value in z-table or use statistical software
\(P(Z < -1.33) = 0.0918\)
Step 5: Interpret the result
The probability that a student completes the test in less than 100 minutes is 9.18%.

Visual Representation:

Book Reference

Walpole, R.E., Myers, R.H., Myers, S.L., & Ye, K. (2012). Probability & Statistics for Engineers & Scientists. Pearson Education.
Chapter 4: Continuous Random Variables and Probability Distributions
Pages: 110-156
Relevance: This textbook provides comprehensive coverage of continuous probability distributions with engineering applications.

Sampling Distribution of the Sample Proportion

Video: Sampling Distribution of the Sample Proportion
In many practical applications, we are concerned with proportions rather than means. Whether studying voting patterns, quality control in manufacturing, medical treatment success rates, or customer satisfaction levels, proportions provide valuable insights about categorical data.

Sampling Distribution of \(\hat{p}\)

Sampling Distribution of Sample Proportion (\(\hat{p}\)):
\[ \hat{p} = \frac{X}{n} \]
where: \(X\) = number of successes in the sample
\(n\) = sample size

\(E(\hat{p}) = p\)

Explanation:
This formula states that the expected value of the sample proportion estimator \(\hat{p}\) is equal to the true population proportion \(p\). This means that \(\hat{p}\) is an unbiased estimator of the population proportion.

\(\hat{p}\) = sample proportion

\(p\) = population proportion

\(E(\hat{p})\) = expected value (mean) of the sample proportion, which equals the population proportion

Variance of Sampling Distribution: \(\mathrm{Var}(\hat{p}) = \frac{p(1-p)}{n}\)

Standard Error: \[ SE(\hat{p}) = \sqrt{\frac{p(1-p)}{n}} \]

Normal Approximation Conditions: For the sampling distribution to be approximately normal:

\(np \ge 10\)

\(n(1-p) \ge 10\)

Normal Approximation Formula: \[ \hat{p} \sim N\left(p,\; \frac{p(1-p)}{n}\right) \]

Z-score for Proportion: \[ z = \frac{\hat{p} - p}{\sqrt{\frac{p(1-p)}{n}}} \]

Understanding Sample Proportion Distribution

Why Sample Proportion Distribution Matters:

1. From Binomial to Normal:
The sample proportion \(\hat{p}\) is essentially a binomial random variable (X) divided by n. As n increases, the binomial distribution approaches a normal distribution.
2. Central Limit Theorem for Proportions:
For large sample sizes, the sampling distribution of \(\hat{p}\) is approximately normal, regardless of the shape of the population distribution (as long as np ≥ 10 and n(1-p) ≥ 10).
3. Practical Applications:
• Election polls and political surveys
• Quality control and defect rates
• Medical trial success rates
• Market research and customer satisfaction
• A/B testing in web development

Visualizing Sampling Distribution of Proportions

Effect of Sample Size on Proportion Distribution

Comparison: Sample Mean vs Sample Proportion

Aspect Sample Mean (\(\bar{X}\)) Sample Proportion (\(\hat{p}\))
Data Type Continuous numerical data Categorical/binary data
Formula \(\bar{X} = \frac{1}{n}\sum_{i=1}^n X_i\) \(\hat{p} = \frac{X}{n}\)
Expected Value \(E(\bar{X}) = \mu\) \(E(\hat{p}) = p\)
Standard Error \(SE(\bar{X}) = \frac{\sigma}{\sqrt{n}}\) \(SE(\hat{p}) = \sqrt{\frac{p(1-p)}{n}}\)
Distribution \(N(\mu, \frac{\sigma^2}{n})\) for large n \(N(p, \frac{p(1-p)}{n})\) when np≥10, n(1-p)≥10
Applications Average height, test scores, income Voting percentages, defect rates, success rates

Important Properties and Notes

Key Properties of Sample Proportion Distribution:

1. Bias and Consistency:
\(\hat{p}\) is an unbiased estimator of p: \(E(\hat{p}) = p\)
As n increases, \(\hat{p}\) converges to p (consistent estimator)
2. Maximum Variance:
The variance \(p(1-p)\) is maximized when p = 0.5
This means proportions near 0.5 have the largest standard errors
3. Finite Population Correction:
When sampling without replacement from a finite population of size N:
\[ SE(\hat{p}) = \sqrt{\frac{p(1-p)}{n} \times \frac{N-n}{N-1}} \]

Reference Books

1. Walpole, R.E., Myers, R.H., Myers, S.L., & Ye, K. (2012). Probability & Statistics for Engineers & Scientists. Pearson Education.
Chapter: 7 - Sampling Distributions
Pages: 245-280
Relevance: Comprehensive coverage of sampling distributions including proportion distributions.

2. Devore, J.L. (2015). Probability and Statistics for Engineering and the Sciences. Cengage Learning.

Chapter: 6 - Statistics and Sampling Distributions

Pages: 270-310

Relevance: Practical applications of sampling distributions in engineering contexts.

3. Montgomery, D.C., & Runger, G.C. (2018). Applied Statistics and Probability for Engineers. Wiley.

Chapter: 7 - Point Estimation of Parameters and Sampling Distributions

Pages: 255-290

Relevance: Engineering-focused approach to proportion estimation and sampling theory.

Central Limit Theorem - Complete Summary

Based on Video: The Central Limit Theorem Explained

Central Limit Theorem: Foundation of Statistical Inference

What is the Central Limit Theorem (CLT)?
The Central Limit Theorem is one of the most important concepts in statistics. It states that the sampling distribution of the sample mean approaches a normal distribution as the sample size increases, regardless of the shape of the population distribution. This theorem forms the foundation for statistical inference, allowing us to make probabilistic statements about population parameters.

🎯 Core Statement

  • Definition: Sample means approach normal distribution
  • Requirements: Independent, identically distributed samples
  • Sample Size: n ≥ 30 generally sufficient
  • Key Insight: Works for ANY population distribution
  • Mathematical Notation: \(\bar{X} \sim N(\mu, \frac{\sigma^2}{n})\)
CLT Formula:
\[ \bar{X} \xrightarrow{d} N\left(\mu, \frac{\sigma^2}{n}\right) \] \[ \text{As } n \to \infty, \quad \frac{\bar{X} - \mu}{\sigma/\sqrt{n}} \xrightarrow{d} N(0,1) \]

📊 Key Properties

  • Mean Preservation: \(E(\bar{X}) = \mu\)
  • Variance Reduction: \(Var(\bar{X}) = \frac{\sigma^2}{n}\)
  • Standard Error: \(SE = \frac{\sigma}{\sqrt{n}}\)
  • Sample Size Effect: Larger n → smaller SE
  • Distribution Shape: Becomes more normal with larger n
Important Relationships:
\[ E(\bar{X}) = \mu \] \[ Var(\bar{X}) = \frac{\sigma^2}{n} \] \[ SE(\bar{X}) = \frac{\sigma}{\sqrt{n}} \]

🔢 Conditions & Requirements

  • Independence: Samples must be independent
  • Random Sampling: Samples randomly selected
  • Sample Size: n ≥ 30 for most distributions
  • Finite Variance: Population variance must be finite
  • Identical Distribution: Samples from same population
Sample Size Guidelines:
• Normal population: Any n works
• Slightly skewed: n ≥ 15
• Moderately skewed: n ≥ 30
• Highly skewed: n ≥ 50+

📈 Practical Applications

  • Confidence Intervals: Estimating population parameters
  • Hypothesis Testing: Testing claims about means
  • Quality Control: Process monitoring and improvement
  • Survey Analysis: Polling and market research
  • Medical Research: Clinical trial analysis
Z-score Formula:
\[ Z = \frac{\bar{X} - \mu}{\sigma/\sqrt{n}} \] Confidence Interval:
\[ \bar{X} \pm z_{\alpha/2} \times \frac{\sigma}{\sqrt{n}} \]

R Implementation: CLT Demonstration

💻 Central Limit Theorem Simulation in R
## === CENTRAL LIMIT THEOREM DEMONSTRATION ===
## Creating population distributions...
## Running CLT simulations...
## 
## === SIMULATION RESULTS (n = 30 , samples = 1000 ) ===
## Exponential Distribution:
##   Population mean (μ): 1.004 
##   Population SD (σ): 1 
##   Theoretical SE: 0.183 
##   Empirical mean of sample means: 1.003 
##   Empirical SE: 0.18 
##   Difference in means: 0 
##   Ratio SE(empirical)/SE(theoretical): 0.984 
## 
## Uniform Distribution:
##   Population mean (μ): 4.998 
##   Population SD (σ): 2.894 
##   Theoretical SE: 0.528 
##   Empirical mean of sample means: 5 
##   Empirical SE: 0.514 
##   Difference in means: 0.002 
##   Ratio SE(empirical)/SE(theoretical): 0.973 
## 
## Bimodal Distribution:
##   Population mean (μ): 49.936 
##   Population SD (σ): 20.735 
##   Theoretical SE: 3.786 
##   Empirical mean of sample means: 49.836 
##   Empirical SE: 3.89 
##   Difference in means: 0.1 
##   Ratio SE(empirical)/SE(theoretical): 1.028
## Creating visualizations...

## TableGrob (5 x 2) "arrange": 8 grobs
##   z     cells    name                grob
## 1 1 (2-2,1-1) arrange      gtable[layout]
## 2 2 (2-2,2-2) arrange      gtable[layout]
## 3 3 (3-3,1-1) arrange      gtable[layout]
## 4 4 (3-3,2-2) arrange      gtable[layout]
## 5 5 (4-4,1-1) arrange      gtable[layout]
## 6 6 (4-4,2-2) arrange      gtable[layout]
## 7 7 (1-1,1-2) arrange text[GRID.text.480]
## 8 8 (5-5,1-2) arrange text[GRID.text.481]
## 
## === INTERPRETATION ===
## Berdasarkan simulasi Central Limit Theorem (CLT) di atas, dapat ditarik beberapa kesimpulan penting:
## 1. BENTUK DISTRIBUSI:
##    - Distribusi Eksponensial (kiri atas): Sangat miring ke kanan
##    - Distribusi Uniform (tengah kiri): Bentuk persegi yang datar
##    - Distribusi Bimodal (kiri bawah): Memiliki dua puncak yang berbeda
##    - Namun, distribusi rata-rata sampel untuk ketiganya (kolom kanan) mendekati bentuk normal
## 2. KONSISTENSI HASIL:
##    - Rata-rata empiris dari rata-rata sampel mendekati rata-rata populasi (μ)
##    - Standar Error empiris mendekati Standar Error teoritis (σ/√n)
##    - Rasio SE(empirical)/SE(theoretical) mendekati 1 untuk semua distribusi
## 3. IMPLIKASI PRAKTIS:
##    - CLT berlaku meskipun distribusi populasi tidak normal
##    - Dengan ukuran sampel n=30, distribusi rata-rata sampel sudah cukup mendekati normal
##    - Ini memungkinkan penggunaan inferensi statistik (uji hipotesis, interval kepercayaan)
##    - CLT adalah dasar untuk banyak metode statistik parametrik
## 4. PENTINGNYA UKURAN SAMPEL:
##    - Semakin besar n, distribusi rata-rata sampel semakin mendekati normal
##    - Untuk populasi yang sangat miring, mungkin diperlukan n yang lebih besar
##    - Aturan praktis: n ≥ 30 biasanya cukup untuk menerapkan CLT
## === SIMULATION COMPLETE ===
## 
## Plot telah disimpan sebagai 'clt_simulation_rpubs.png'
## 
## === INSTRUKSI UNTUK RPUBS ===
## 1. Install package jika belum: install.packages(c('ggplot2', 'gridExtra'))
## 2. Copy seluruh kode ini ke RStudio
## 3. Jalankan semua kode (Ctrl + A lalu Ctrl + Enter)
## 4. Plot akan muncul di panel Plot dan tersimpan sebagai file PNG
## 5. Untuk Rpubs: Upload file R ini atau publish langsung dari RStudio

Reference Books:

1. Montgomery, D.C., & Runger, G.C. (2018). Applied Statistics and Probability for Engineers. Wiley.

Chapter: 7 - Point Estimation and Sampling Distributions

Pages: 255-290

Relevance: Excellent engineering-focused explanation of CLT with practical examples.

2. Walpole, R.E., Myers, R.H., Myers, S.L., & Ye, K. (2012). Probability & Statistics for Engineers & Scientists. Pearson Education.

Chapter: 8 - Fundamental Sampling Distributions

Pages: 281-320

Relevance: Comprehensive coverage of sampling distributions including CLT proofs.

3. Devore, J.L. (2015). Probability and Statistics for Engineering and the Sciences. Cengage Learning.

Chapter: 6 - Statistics and Sampling Distributions

Pages: 270-310

Relevance: Practical applications of CLT in engineering and scientific contexts.

Central Limit Theorem Summary

Video: The Central Limit Theorem Explained

Central Limit Theorem: Key Concepts

What is CLT?
The Central Limit Theorem states that the sampling distribution of sample means approaches a normal distribution as sample size increases, regardless of population distribution shape. This enables statistical inference about population parameters.

🎯 Core Concept

  • Sample means approach normal distribution
  • Works for any population distribution
  • n ≥ 30 usually sufficient
  • Independent random samples required
  • $$ \bar{X} \sim N\left(\mu, \frac{\sigma^2}{n}\right) $$

    📊 Key Properties

    • Mean: \(E(\bar{X}) = \mu\)
    • Variance: \(Var(\bar{X}) = \frac{\sigma^2}{n}\)
    • Standard Error: \(SE = \frac{\sigma}{\sqrt{n}}\)
    • Larger n → smaller SE

    \[ SE = \frac{\sigma}{\sqrt{n}} \]

    CLT Simulation in R

    💻 CLT Demonstration
    library(ggplot2)
    set.seed(123)
    
    # Parameters
    pop_size <- 5000
    n <- 30
    samples <- 1000
    
    # Skewed population
    pop_skewed <- rexp(pop_size, rate = 1)
    sample_means <- numeric(samples)
    
    for(i in 1:samples) {
      sample_means[i] <- mean(sample(pop_skewed, n, replace = TRUE))
    }
    
    # Create plots
    p1 <- ggplot(data.frame(x = pop_skewed), aes(x = x)) +
      geom_histogram(aes(y = ..density..), bins = 40, 
                     fill = "#8D6E63", alpha = 0.6) +
      labs(title = "Population Distribution (Exponential)",
           x = "Value", y = "Density") +
      theme_minimal() +
      theme(
        plot.title = element_text(size = 12),
        plot.background = element_rect(fill = "#F5F1E8"),
        panel.background = element_rect(fill = "#F5F1E8")
      )
    
    p2 <- ggplot(data.frame(x = sample_means), aes(x = x)) +
      geom_histogram(aes(y = ..density..), bins = 40,
                     fill = "#A1887F", alpha = 0.6) +
      stat_function(fun = dnorm, 
                    args = list(mean = mean(sample_means), 
                              sd = sd(sample_means)),
                    color = "#5D4037", size = 0.8) +
      labs(title = paste("Sample Means (n =", n, ")"),
           x = "Sample Mean", y = "Density") +
      theme_minimal() +
      theme(
        plot.title = element_text(size = 12),
        plot.background = element_rect(fill = "#F5F1E8"),
        panel.background = element_rect(fill = "#F5F1E8")
      )
    
    library(gridExtra)
    grid.arrange(p1, p2, ncol = 2,
                 top = grid::textGrob(
                   "Central Limit Theorem Demonstration",
                   gp = grid::gpar(fontsize = 14, fontface = "bold", col = "#5D4037")
                 ))

    1. Standard Error:
    \(SE = \frac{2}{\sqrt{36}} = 0.333\) cm
    2. Probability mean < 99.5cm:
    \(Z = \frac{99.5-100}{0.333} = -1.5\)
    \(P = 0.0668\) (6.68%)
    3. 95% Confidence Interval:
    \(100 \pm 1.96 \times 0.333 = [99.35, 100.65]\) cm
    R Calculation
    mu <- 100
    sigma <- 2
    n <- 36
    
    # Calculations
    se <- sigma / sqrt(n)
    z <- (99.5 - mu) / se
    p_val <- pnorm(z)
    
    ci_lower <- mu - 1.96 * se
    ci_upper <- mu + 1.96 * se
    
    # Soft brown color
    color <- "#8B5E3C"
    
    output <- paste0(
      "<span style='color:", color, "; font-weight:600;'>Standard Error: ", round(se, 3), " cm</span><br>",
      "<span style='color:", color, "; font-weight:600;'>Z-score for 99.5 cm: ", round(z, 3), "</span><br>",
      "<span style='color:", color, "; font-weight:600;'>Probability: ", round(p_val, 4), "</span><br>",
      "<span style='color:", color, "; font-weight:600;'>95% CI: [", 
          round(ci_lower, 2), ", ", round(ci_upper, 2), "] cm</span>"
    )
    Sample Size Standard Error 95% CI Width
    n = 9 0.667 2.61 cm
    n = 36 0.333 1.31 cm
    n = 100 0.200 0.78 cm
    Key Points:

    1. Importance:
    Enables inference without knowing population distribution.
    2. Sample Size:
    Larger n → more normal distribution of means.
    3. Applications:
    Confidence intervals, hypothesis testing, quality control.

    Essential Formulas:

    ## Essential Formulas

    1 1. Standard Error (SE)

    \[ SE = \frac{\sigma}{\sqrt{n}} \]

    2 2. Z-Score

    \[ Z = \frac{\bar{X} - \mu}{SE} \]

    3 3. Confidence Interval (CI)

    \[ \bar{X} \pm z_{\alpha/2} \times SE \]

    Video Takeaways:
    1. CLT enables statistical inference
    2. Works for any population shape
    3. Larger samples give better approximations
    4. Foundation for confidence intervals and hypothesis tests

    Sampling Distribution of the Sample Proportion

    The sampling distribution of the sample proportion is a fundamental concept in inferential statistics that describes how sample proportions vary from sample to sample. It provides the foundation for constructing confidence intervals and conducting hypothesis tests about population proportions.

    Core Concepts of Sample Proportion Distribution

    Sample Proportion Formula:
    \[ \hat{p} = \frac{X}{n} \]
    Where:
    \(X\) = number of successes in the sample
    \(n\) = sample size
    \(\hat{p}\) = sample proportion (pronounced “p-hat”)

    Key Parameters of Sampling Distribution

    Mean of Sampling Distribution:
    \[ \mu_{\hat{p}} = E(\hat{p}) = p \]
    Explanation:
    The expected value of all possible sample proportions equals the population proportion
    This makes \(\hat{p}\) an unbiased estimator of \(p\)
    Variance and Standard Error:
    \[ \sigma^2_{\hat{p}} = \frac{p(1-p)}{n} \] \[ SE(\hat{p}) = \sqrt{\frac{p(1-p)}{n}} \]
    Important Notes:
    1. Standard error decreases as sample size increases
    2. Maximum variance occurs when \(p = 0.5\)
    3. Variance is smallest when \(p\) is near 0 or 1

    Normal Approximation Conditions

    Central Limit Theorem for Proportions:
    The sampling distribution of \(\hat{p}\) is approximately normal if:
    1. \(np \ge 10\)
      2. \(n(1-p) \ge 10\)
      (These are practical rules of thumb)
    When satisfied:
    \[ \hat{p} \sim N\left(p,\; \sqrt{\frac{p(1-p)}{n}}\right) \]
    Z-score Calculation for Proportions:
    \[ z = \frac{\hat{p} - p}{\sqrt{\frac{p(1-p)}{n}}} \]
    Used for:
    • Finding probabilities for sample proportions
    • Constructing confidence intervals
    • Hypothesis testing about proportions

    Practical Example from Video

    Video Example: Voter Support Survey
    Scenario:
    • Population proportion: \(p = 0.60\) (60% support candidate)
    • Sample size: \(n = 100\)
    • Question: What is \(P(\hat{p} > 0.65)\)?
    Solution Steps:
    1. Check normal approximation: \(np = 60\), \(n(1-p) = 40\)
    2. Calculate standard error: \(SE = \sqrt{\frac{0.6 \times 0.4}{100}} = 0.049\)
    3. Compute z-score: \(z = \frac{0.65 - 0.60}{0.049} = 1.02\)
    4. Find probability: \(P(Z > 1.02) = 0.1539\)
    Conclusion: There’s a 15.39% chance of getting a sample with over 65% support

    Visualizing the Sampling Distribution

    Characteristics of \(\hat{p}\) Distribution
    Shape Changes with Sample Size:
    • Small \(n\): Discrete distribution (binomial-like)
    • Large \(n\): Bell-shaped curve (normal approximation)
    • As \(n\) increases: Distribution becomes more concentrated around \(p\)
    Effect of \(p\) on Distribution:
    • When \(p = 0.5\): Symmetric distribution
    • When \(p\) near 0 or 1: Skewed distribution (needs larger \(n\) for normal approximation)

    Comparison: Mean vs Proportion Sampling

    Aspect Sample Mean (\(\bar{x}\)) Sample Proportion (\(\hat{p}\))
    Population Parameter \(\mu\) (population mean) \(p\) (population proportion)
    Sample Statistic \(\bar{x} = \frac{\sum x_i}{n}\) \(\hat{p} = \frac{X}{n}\)
    Sampling Distribution Mean \(\mu_{\bar{x}} = \mu\) \(\mu_{\hat{p}} = p\)
    Standard Error Formula \(SE = \frac{\sigma}{\sqrt{n}}\) \(SE = \sqrt{\frac{p(1-p)}{n}}\)
    Normality Conditions \(n \ge 30\) (CLT) \(np \ge 10\) and \(n(1-p) \ge 10\)
    Data Type Quantitative (continuous) Categorical (binary: success/failure)
    Distribution Shape Normal for large \(n\) Normal when conditions met

    R Implementation and Simulation

    📊 Simulating Sampling Distribution of \(\hat{p}\)
    ## === SAMPLING DISTRIBUTION SIMULATION RESULTS ===
    ## Population proportion (p): 0.6
    ## Sample size (n): 100
    ## Number of simulations: 10000
    ## Mean of simulated p̂: 0.6006
    ## Theoretical Standard Error: 0.049
    ## Empirical Standard Error: 0.049
    ## === NORMALITY CONDITIONS CHECK ===
    ## np = 60
    ## n(1-p) = 40
    ## ✓ Conditions met: Normal approximation is valid
    ## 
    ## === PROBABILITY CALCULATION ===
    ## P(p̂ > 0.65 ):
    ## Z-score: 1.021
    ## Probability: 0.1537
    ## Percentage: 15.37 %

    Interpretation of Results

    Key Insights from Simulation:
    1. Unbiasedness Confirmation:
    • Simulated mean of \(\hat{p}\) ≈ population \(p\) (0.60)
    • Empirical SE ≈ theoretical SE
    • Demonstrates \(\hat{p}\) is an unbiased estimator
    2. Practical Applications:
    • Quality control: Probability of defect rate exceeding threshold
    • Election forecasting: Chance of candidate getting certain vote percentage
    • Medical studies: Probability of treatment success rate
    3. Decision Making:
    • With 15.39% probability, a sample of 100 could show >65% support
    • Important for interpreting survey/margin of error

    Real-World Applications

    Common Applications in Various Fields:
    1. Political Polling:
      • Estimating candidate support
      • Calculating margin of error
      • Determining sample size needed for desired precision
    2. Quality Control:

      • Monitoring defect rates in manufacturing
      • Setting control limits for proportion defective
      • Determining acceptable quality levels

    3. Medical Research:

      • Estimating treatment success rates
      • Comparing proportions between treatment groups
      • Calculating required sample size for clinical trials

    4. Market Research:

      • Estimating market share
      • Calculating customer satisfaction rates
      • Determining brand preference proportions

    Statistical Formulas for Practice

    Confidence Interval for Proportion:
    \[ \hat{p} \pm z_{\alpha/2} \times \sqrt{\frac{\hat{p}(1-\hat{p})}{n}} \] Margin of Error Formula:

    \[ ME = z_{\alpha/2} \times \sqrt{\frac{p(1-p)}{n}} \]

    Sample Size Determination:

    \[ n = \left( \frac{z_{\alpha/2}}{ME} \right)^2 \, p(1-p) \]

    Note: When \(p\) is unknown, use \(p = 0.5\) for maximum sample size

    Important Considerations

    Critical Points to Remember:
    1. Independence Assumption: Samples must be independent (random sampling)
    2. 10% Condition: Sample should be ≤ 10% of population when sampling without replacement
    3. Success-Failure Condition: Must check \(np ≥ 10\) and \(n(1-p) ≥ 10\) for normal approximation
    4. Continuity Correction: For small samples, consider adding ±0.5/n to improve normal approximation
    When Normal Approximation Fails:
    Alternative Methods:
    1. Exact Binomial Test: Use when \(n\) is small or \(p\) is extreme
    2. Wilson Score Interval: Better for small samples or extreme proportions
    3. Clopper-Pearson Interval: Conservative exact method
    4. Simulation/Bootstrap: Resampling methods for any sample size

    Reference Books and Resources

    Recommended Textbooks:
    1. “Statistics for Business and Economics” by Anderson, Sweeney, and Williams
      • Chapter 7: Sampling and Sampling Distributions
      • Excellent practical examples with business applications
    2. “Introductory Statistics” by Prem S. Mann

      • Chapter 7: Sampling Distributions
      • Clear explanations with step-by-step solutions

    3. “The Practice of Statistics” by Starnes, Tabor, Yates, and Moore

      • Chapter 7: Sampling Distributions
      • Modern approach with emphasis on data analysis

    4. “Statistical Inference” by George Casella and Roger L. Berger

      • Chapter 5: Properties of a Random Sample
      • Theoretical foundation for sampling distributions

    5. “OpenIntro Statistics” by Diez, Barr, and Çetinkaya-Rundel

      • Free online textbook
      • Chapter 4: Foundations for Inference
      • Includes R examples and practice problems

    6. Binomial Distribution Review

      Introduction to Binomial Distribution

      The binomial distribution is one of the most fundamental discrete probability distributions in statistics. It models the number of successes in a fixed number of independent Bernoulli trials, where each trial has only two possible outcomes: success or failure.

      Binomial Distribution Formulas

      Binomial Probability Mass Function:
      \[ P(X = k) = \binom{n}{k} p^k (1-p)^{n-k} \]

      where: \(n\) = number of trials
      \(k\) = number of successes
      \(p\) = probability of success on each trial
      \(\binom{n}{k} = \frac{n!}{k!(n-k)!}\) = binomial coefficient

      \[ \text{Mean of Binomial Distribution:} \quad \mu = E(X) = n p \]

      Penjelasan singkat:
      \(\mu\) = mean / rata-rata distribusi
      \(E(X)\) = ekspektasi dari variabel acak \(X\)
      \(n\) = jumlah percobaan
      \(p\) = probabilitas sukses pada tiap percobaan

      Variance of Binomial Distribution: \[ \sigma^2 = \operatorname{Var}(X) = np(1-p) \]

      Standard Deviation: \[ \sigma = \sqrt{np(1-p)} \]

      Conditions for Binomial Distribution:
      Fixed number of trials \((n)\)
      Independent trials
      Two possible outcomes (success/failure)
      Constant probability of success \((p)\)

      Normal Approximation to the Binomial:

      Normal approximation is appropriate if:
      \(np \ge 10\)
      \(n(1-p) \ge 10\)

      \[ \text{Normal Approximation:} \quad X \sim N \big( n p, \, n p (1 - p) \big) \]

      Penjelasan singkat:
      \(X\) = variabel acak binomial
      \(N(\mu,\sigma^2)\) = distribusi normal dengan mean \(\mu\) dan varians \(\sigma^2\)
      \(\mu = np\) = mean dari distribusi binomial
      \(\sigma^2 = np(1-p)\) = varians dari distribusi binomial
      Digunakan ketika \(n\) besar dan \(p\) tidak terlalu dekat dengan 0 atau 1

      Example Problem: Binomial Distribution

      Problem: A multiple-choice test has 20 questions, each with 5 choices. A student guesses randomly on all questions. What is the probability that the student gets exactly 5 questions correct?

      Solution Step by Step:

      Step 1: Identify parameters
      \(n = 20\) (number of questions)
      \(p = \frac{1}{5} = 0.2\) (probability of guessing correctly)
      \(k = 5\) (number of correct answers wanted)

      Step 2: Calculate binomial coefficient
      \(\binom{20}{5} = \frac{20!}{5!15!} = \frac{20 \times 19 \times 18 \times 17 \times 16}{5 \times 4 \times 3 \times 2 \times 1} = 15504\)

      Step 3: Apply binomial formula
      \(P(X = 5) = \binom{20}{5} (0.2)^5 (0.8)^{15}\)

      Step 4: Calculate each component
      \((0.2)^5 = 0.00032\)
      \((0.8)^{15} = 0.03518\)

      Step 5: Multiply all components
      \(P(X = 5) = 15504 \times 0.00032 \times 0.03518 = 15504 \times 0.0000112576 = 0.1746\)


      Answer: The probability that the student gets exactly 5 questions correct is 17.46%.

      Book Reference

      Ross, S.M. (2014). A First Course in Probability. Pearson.
      Chapter 4: Discrete Random Variables
      Pages: 125-160
      Relevance: Excellent coverage of binomial distribution with numerous examples and applications.

      Summary and Conclusion

      Key Takeaways from Week 11:

      1. Continuous Probability Distributions:
      Understanding PDF and CDF is fundamental for working with continuous variables

      2. Sampling Distributions:
      The distribution of sample statistics forms the basis for statistical inference

      3. Central Limit Theorem:
      One of the most powerful results in statistics, enabling normal approximations

      4. Sampling Distribution of Proportions:
      Essential for categorical data analysis and proportion inference

      5. Binomial Distribution:
      Foundation for understanding proportions and binary outcomes

    LS0tDQp0aXRsZTogIlByb2JhYmlsaXR5IERpc3RyaWJ1dGlvbiIgDQpzdWJ0aXRsZTogIlR1Z2FzIFdlZWsgMTEiIA0KYXV0aG9yOiAiQWRpbmRhIEFkZWxpYSBGdXRyaSINCmRhdGU6ICJgciBmb3JtYXQoU3lzLkRhdGUoKSwgJyVCICVkLCAlWScpYCIgDQpvdXRwdXQ6DQogIGh0bWxfZG9jdW1lbnQ6DQogICAgdGhlbWU6IGNlcnVsZWFuDQogICAgaGlnaGxpZ2h0OiB0ZXh0bWF0ZQ0KICAgIHRvYzogZmFsc2UNCiAgICB0b2NfZmxvYXQ6IGZhbHNlDQogICAgbnVtYmVyX3NlY3Rpb25zOiB0cnVlDQogICAgY29kZV9mb2xkaW5nOiBzaG93DQogICAgY29kZV9kb3dubG9hZDogeWVzDQotLS0NCg0KPHN0eWxlPg0KLyogPT09PT09PT09PSBSRVNFVCBEQU4gR0xPQkFMIFNUWUxFUyA9PT09PT09PT09ICovDQoqIHsNCiAgbWFyZ2luOiAwOw0KICBwYWRkaW5nOiAwOw0KICBib3gtc2l6aW5nOiBib3JkZXItYm94Ow0KfQ0KDQpib2R5IHsNCiAgZm9udC1mYW1pbHk6ICdTZWdvZSBVSScsIFRhaG9tYSwgR2VuZXZhLCBWZXJkYW5hLCBzYW5zLXNlcmlmOw0KICBsaW5lLWhlaWdodDogMS42Ow0KICBjb2xvcjogIzVENDAzNzsNCiAgYmFja2dyb3VuZC1jb2xvcjogI0Y1RjFFODsNCiAgbWF4LXdpZHRoOiA4MDBweDsNCiAgbWFyZ2luOiAwIGF1dG87DQogIHBhZGRpbmc6IDE1cHg7DQogIHBvc2l0aW9uOiByZWxhdGl2ZTsNCn0NCg0KLyogPT09PT09PT09PSBUQUJMRSBPRiBDT05URU5UUyA9PT09PT09PT09ICovDQojdG9jLWNvbnRhaW5lciB7DQogIHBvc2l0aW9uOiBmaXhlZDsNCiAgbGVmdDogMjBweDsNCiAgdG9wOiA1MCU7DQogIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtNTAlKTsNCiAgd2lkdGg6IDIyMHB4Ow0KICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoMTM1ZGVnLCAjOEQ2RTYzIDAlLCAjQTE4ODdGIDEwMCUpOw0KICBib3JkZXItcmFkaXVzOiAxMHB4Ow0KICBwYWRkaW5nOiAxNXB4Ow0KICBib3gtc2hhZG93OiAwIDRweCAxMnB4IHJnYmEoMCwgMCwgMCwgMC4xNSk7DQogIHotaW5kZXg6IDEwMDA7DQogIGRpc3BsYXk6IG5vbmU7DQp9DQoNCiN0b2MtY29udGFpbmVyLnNob3cgew0KICBkaXNwbGF5OiBibG9jazsNCn0NCg0KI3RvYy10aXRsZSB7DQogIGNvbG9yOiAjRkZGOEUxOw0KICBmb250LXNpemU6IDEuMWVtOw0KICBtYXJnaW4tYm90dG9tOiAxMHB4Ow0KICB0ZXh0LWFsaWduOiBjZW50ZXI7DQogIGJvcmRlci1ib3R0b206IDJweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMik7DQogIHBhZGRpbmctYm90dG9tOiA4cHg7DQp9DQoNCiN0b2MtbGlzdCB7DQogIGxpc3Qtc3R5bGUtdHlwZTogbm9uZTsNCn0NCg0KI3RvYy1saXN0IGxpIHsNCiAgbWFyZ2luOiA2cHggMDsNCn0NCg0KI3RvYy1saXN0IGEgew0KICBjb2xvcjogI0ZGRjhFMTsNCiAgdGV4dC1kZWNvcmF0aW9uOiBub25lOw0KICBmb250LXNpemU6IDAuOWVtOw0KICBkaXNwbGF5OiBibG9jazsNCiAgcGFkZGluZzogNXB4IDhweDsNCiAgYm9yZGVyLXJhZGl1czogNHB4Ow0KICB0cmFuc2l0aW9uOiBhbGwgMC4zcyBlYXNlOw0KICBwb3NpdGlvbjogcmVsYXRpdmU7DQp9DQoNCiN0b2MtbGlzdCBhOmhvdmVyIHsNCiAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjE1KTsNCiAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKDVweCk7DQp9DQoNCiN0b2MtbGlzdCBhOmhvdmVyOjphZnRlciB7DQogIGNvbnRlbnQ6IGF0dHIoZGF0YS10b29sdGlwKTsNCiAgcG9zaXRpb246IGFic29sdXRlOw0KICBsZWZ0OiAxMDAlOw0KICB0b3A6IDUwJTsNCiAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC01MCUpOw0KICBiYWNrZ3JvdW5kLWNvbG9yOiAjNUQ0MDM3Ow0KICBjb2xvcjogI0ZGRjhFMTsNCiAgcGFkZGluZzogNnB4IDEwcHg7DQogIGJvcmRlci1yYWRpdXM6IDRweDsNCiAgZm9udC1zaXplOiAwLjhlbTsNCiAgd2hpdGUtc3BhY2U6IG5vd3JhcDsNCiAgbWFyZ2luLWxlZnQ6IDEwcHg7DQogIHotaW5kZXg6IDEwMDE7DQp9DQoNCi50b2MtdG9nZ2xlIHsNCiAgcG9zaXRpb246IGZpeGVkOw0KICBsZWZ0OiAyMHB4Ow0KICB0b3A6IDIwcHg7DQogIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgxMzVkZWcsICM4RDZFNjMgMCUsICNBMTg4N0YgMTAwJSk7DQogIGNvbG9yOiAjRkZGOEUxOw0KICBib3JkZXI6IG5vbmU7DQogIGJvcmRlci1yYWRpdXM6IDUwJTsNCiAgd2lkdGg6IDQwcHg7DQogIGhlaWdodDogNDBweDsNCiAgY3Vyc29yOiBwb2ludGVyOw0KICB6LWluZGV4OiA5OTk7DQogIGRpc3BsYXk6IGZsZXg7DQogIGFsaWduLWl0ZW1zOiBjZW50ZXI7DQogIGp1c3RpZnktY29udGVudDogY2VudGVyOw0KICBib3gtc2hhZG93OiAwIDNweCA4cHggcmdiYSgwLCAwLCAwLCAwLjIpOw0KICB0cmFuc2l0aW9uOiBhbGwgMC4zcyBlYXNlOw0KfQ0KDQoudG9jLXRvZ2dsZTpob3ZlciB7DQogIHRyYW5zZm9ybTogc2NhbGUoMS4xKTsNCiAgYm94LXNoYWRvdzogMCA1cHggMTVweCByZ2JhKDAsIDAsIDAsIDAuMyk7DQp9DQoNCi50b2MtdG9nZ2xlOmhvdmVyOjphZnRlciB7DQogIGNvbnRlbnQ6ICJTaG93IFRhYmxlIG9mIENvbnRlbnRzIjsNCiAgcG9zaXRpb246IGFic29sdXRlOw0KICBsZWZ0OiAxMDAlOw0KICB0b3A6IDUwJTsNCiAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC01MCUpOw0KICBiYWNrZ3JvdW5kLWNvbG9yOiAjNUQ0MDM3Ow0KICBjb2xvcjogI0ZGRjhFMTsNCiAgcGFkZGluZzogNnB4IDEwcHg7DQogIGJvcmRlci1yYWRpdXM6IDRweDsNCiAgZm9udC1zaXplOiAwLjhlbTsNCiAgd2hpdGUtc3BhY2U6IG5vd3JhcDsNCiAgbWFyZ2luLWxlZnQ6IDEwcHg7DQogIHotaW5kZXg6IDEwMDE7DQp9DQoNCi8qID09PT09PT09PT0gSEVBREVSIFNFQ1RJT04gPT09PT09PT09PSAqLw0KLmhlYWRlci1zZWN0aW9uIHsNCiAgdGV4dC1hbGlnbjogY2VudGVyOw0KICBtYXJnaW4tYm90dG9tOiAyMHB4Ow0KICBwYWRkaW5nOiAxNXB4Ow0KICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoMTM1ZGVnLCAjOEQ2RTYzIDAlLCAjQTE4ODdGIDEwMCUpOw0KICBjb2xvcjogI0ZGRjhFMTsNCiAgYm9yZGVyLXJhZGl1czogOHB4Ow0KICBib3gtc2hhZG93OiAwIDNweCA1cHggcmdiYSgwLCAwLCAwLCAwLjEpOw0KICBwb3NpdGlvbjogcmVsYXRpdmU7DQogIG92ZXJmbG93OiBoaWRkZW47DQogIHRyYW5zaXRpb246IHRyYW5zZm9ybSAwLjNzIGVhc2U7DQogIGN1cnNvcjogcG9pbnRlcjsNCn0NCg0KLmhlYWRlci1zZWN0aW9uOmhvdmVyIHsNCiAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC0zcHgpOw0KfQ0KDQouaGVhZGVyLXNlY3Rpb24gaDEgew0KICBmb250LXNpemU6IDJlbTsNCiAgbWFyZ2luLWJvdHRvbTogOHB4Ow0KICBmb250LXdlaWdodDogNzAwOw0KICBwb3NpdGlvbjogcmVsYXRpdmU7DQp9DQoNCi5oZWFkZXItc2VjdGlvbiBwIHsNCiAgZm9udC1zaXplOiAxZW07DQogIG1hcmdpbjogNHB4IDA7DQp9DQoNCi8qIFRvb2x0aXAgdW50dWsgaGVhZGVyIHNlY3Rpb24gKi8NCi5oZWFkZXItc2VjdGlvbjpob3Zlcjo6YWZ0ZXIgew0KICBjb250ZW50OiAiQ2xpY2sgdG8gY29weSBzdHVkZW50IGluZm8iOw0KICBwb3NpdGlvbjogYWJzb2x1dGU7DQogIGJvdHRvbTogLTMwcHg7DQogIGxlZnQ6IDUwJTsNCiAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKC01MCUpOw0KICBiYWNrZ3JvdW5kLWNvbG9yOiAjNUQ0MDM3Ow0KICBjb2xvcjogI0ZGRjhFMTsNCiAgcGFkZGluZzogNXB4IDEwcHg7DQogIGJvcmRlci1yYWRpdXM6IDRweDsNCiAgZm9udC1zaXplOiAwLjhlbTsNCiAgd2hpdGUtc3BhY2U6IG5vd3JhcDsNCiAgei1pbmRleDogMTAwMDsNCiAgb3BhY2l0eTogMC45Ow0KfQ0KDQovKiA9PT09PT09PT09IFZJREVPIENPTlRBSU5FUiA9PT09PT09PT09ICovDQoudmlkZW8tY29udGFpbmVyIHsNCiAgdGV4dC1hbGlnbjogY2VudGVyOw0KICBtYXJnaW46IDIwcHggMDsNCiAgcGFkZGluZzogMTVweDsNCiAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KHRvIHJpZ2h0LCAjOEQ2RTYzLCAjQTE4ODdGKTsNCiAgYm9yZGVyLXJhZGl1czogOHB4Ow0KICB0cmFuc2l0aW9uOiBhbGwgMC4zcyBlYXNlOw0KICBjdXJzb3I6IHBvaW50ZXI7DQogIHBvc2l0aW9uOiByZWxhdGl2ZTsNCn0NCg0KLnZpZGVvLWNvbnRhaW5lcjpob3ZlciB7DQogIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtM3B4KTsNCiAgYm94LXNoYWRvdzogMCA1cHggMTVweCByZ2JhKDAsIDAsIDAsIDAuMSk7DQp9DQoNCi52aWRlby1saW5rIHsNCiAgY29sb3I6ICNGRkY4RTE7DQogIHRleHQtZGVjb3JhdGlvbjogbm9uZTsNCiAgZm9udC13ZWlnaHQ6IGJvbGQ7DQogIGZvbnQtc2l6ZTogMWVtOw0KICBkaXNwbGF5OiBpbmxpbmUtZmxleDsNCiAgYWxpZ24taXRlbXM6IGNlbnRlcjsNCiAgZ2FwOiA4cHg7DQogIHBhZGRpbmc6IDEwcHggMjBweDsNCiAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEpOw0KICBib3JkZXItcmFkaXVzOiA1cHg7DQogIHRyYW5zaXRpb246IGJhY2tncm91bmQtY29sb3IgMC4zczsNCn0NCg0KLnZpZGVvLWxpbms6aG92ZXIgew0KICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMik7DQogIHRleHQtZGVjb3JhdGlvbjogbm9uZTsNCn0NCg0KLnZpZGVvLWxpbmsgaSB7DQogIGZvbnQtc2l6ZTogMS4yZW07DQp9DQoNCi8qIFRvb2x0aXAgdW50dWsgdmlkZW8gY29udGFpbmVyICovDQoudmlkZW8tY29udGFpbmVyOmhvdmVyOjphZnRlciB7DQogIGNvbnRlbnQ6ICJDbGljayB0byB3YXRjaCB2aWRlbyBhYm91dCBwcm9iYWJpbGl0eSBkaXN0cmlidXRpb25zIjsNCiAgcG9zaXRpb246IGFic29sdXRlOw0KICBib3R0b206IC0zNXB4Ow0KICBsZWZ0OiA1MCU7DQogIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgtNTAlKTsNCiAgYmFja2dyb3VuZC1jb2xvcjogIzVENDAzNzsNCiAgY29sb3I6ICNGRkY4RTE7DQogIHBhZGRpbmc6IDVweCAxMHB4Ow0KICBib3JkZXItcmFkaXVzOiA0cHg7DQogIGZvbnQtc2l6ZTogMC44ZW07DQogIHdoaXRlLXNwYWNlOiBub3dyYXA7DQogIHotaW5kZXg6IDEwMDA7DQogIG9wYWNpdHk6IDAuOTsNCn0NCg0KLyogPT09PT09PT09PSBQSE9UTyBDT05UQUlORVIgPT09PT09PT09PSAqLw0KLnBob3RvLWNvbnRhaW5lciB7DQogIHRleHQtYWxpZ246IGNlbnRlcjsNCiAgbWFyZ2luOiAyMHB4IDA7DQogIHBvc2l0aW9uOiByZWxhdGl2ZTsNCiAgY3Vyc29yOiBwb2ludGVyOw0KfQ0KDQouc3R1ZGVudC1waG90byB7DQogIHdpZHRoOiAxNTBweDsNCiAgaGVpZ2h0OiAxNTBweDsNCiAgYm9yZGVyLXJhZGl1czogNTAlOw0KICBvYmplY3QtZml0OiBjb3ZlcjsNCiAgYm9yZGVyOiA0cHggc29saWQgI0Q3Q0NDODsNCiAgYm94LXNoYWRvdzogMCAzcHggMTBweCByZ2JhKDAsIDAsIDAsIDAuMik7DQogIHRyYW5zaXRpb246IGFsbCAwLjNzIGVhc2U7DQp9DQoNCi5zdHVkZW50LXBob3RvOmhvdmVyIHsNCiAgdHJhbnNmb3JtOiBzY2FsZSgxLjA1KTsNCiAgYm9yZGVyLWNvbG9yOiAjOEQ2RTYzOw0KfQ0KDQovKiBUb29sdGlwIHVudHVrIHBob3RvICovDQoucGhvdG8tY29udGFpbmVyOmhvdmVyOjphZnRlciB7DQogIGNvbnRlbnQ6ICJTdHVkZW50IFBob3RvIC0gQWRpbmRhIEFkZWxpYSBGdXRyaSI7DQogIHBvc2l0aW9uOiBhYnNvbHV0ZTsNCiAgYm90dG9tOiAtMzBweDsNCiAgbGVmdDogNTAlOw0KICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLTUwJSk7DQogIGJhY2tncm91bmQtY29sb3I6ICM1RDQwMzc7DQogIGNvbG9yOiAjRkZGOEUxOw0KICBwYWRkaW5nOiA1cHggMTBweDsNCiAgYm9yZGVyLXJhZGl1czogNHB4Ow0KICBmb250LXNpemU6IDAuOGVtOw0KICB3aGl0ZS1zcGFjZTogbm93cmFwOw0KICB6LWluZGV4OiAxMDAwOw0KICBvcGFjaXR5OiAwLjk7DQp9DQoNCi8qID09PT09PT09PT0gVFlQT0dSQVBIWSA9PT09PT09PT09ICovDQpoMSwgaDIsIGgzLCBoNCB7DQogIGNvbG9yOiAjNEUzNDJFOw0KICBtYXJnaW4tdG9wOiAyMHB4Ow0KICBtYXJnaW4tYm90dG9tOiAxMHB4Ow0KICB0ZXh0LWFsaWduOiBjZW50ZXI7DQogIGN1cnNvcjogaGVscDsNCiAgcG9zaXRpb246IHJlbGF0aXZlOw0KICB0cmFuc2l0aW9uOiBjb2xvciAwLjNzIGVhc2U7DQp9DQoNCmgxIHsNCiAgZm9udC1zaXplOiAxLjhlbTsNCiAgYm9yZGVyLWJvdHRvbTogMnB4IHNvbGlkICNBMTg4N0Y7DQogIHBhZGRpbmctYm90dG9tOiA4cHg7DQogIG1hcmdpbi1ib3R0b206IDIwcHg7DQp9DQoNCmgxOmhvdmVyIHsNCiAgY29sb3I6ICM4RDZFNjM7DQp9DQoNCmgyIHsNCiAgZm9udC1zaXplOiAxLjVlbTsNCiAgcGFkZGluZy1ib3R0b206IDZweDsNCn0NCg0KaDMgew0KICBmb250LXNpemU6IDEuMmVtOw0KfQ0KDQovKiBUb29sdGlwIHVudHVrIGhlYWRpbmdzICovDQpoMTpob3Zlcjo6YWZ0ZXIsDQpoMjpob3Zlcjo6YWZ0ZXIsDQpoMzpob3Zlcjo6YWZ0ZXIsDQpoNDpob3Zlcjo6YWZ0ZXIgew0KICBjb250ZW50OiBhdHRyKHRpdGxlKTsNCiAgcG9zaXRpb246IGFic29sdXRlOw0KICBib3R0b206IDEwMCU7DQogIGxlZnQ6IDUwJTsNCiAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKC01MCUpOw0KICBiYWNrZ3JvdW5kLWNvbG9yOiAjNUQ0MDM3Ow0KICBjb2xvcjogI0ZGRjhFMTsNCiAgcGFkZGluZzogNXB4IDEwcHg7DQogIGJvcmRlci1yYWRpdXM6IDNweDsNCiAgZm9udC1zaXplOiAwLjc1ZW07DQogIHdoaXRlLXNwYWNlOiBub3dyYXA7DQogIHotaW5kZXg6IDEwMDA7DQogIG9wYWNpdHk6IDAuOTsNCn0NCg0KLyogPT09PT09PT09PSBVTklGT1JNIEJPWCBTVFlMRVMgPT09PT09PT09PSAqLw0KLmNvbmNlcHQtaW50cm8sDQouZm9ybXVsYS1ib3gsDQouZXhhbXBsZS1ib3gsDQoucmVmZXJlbmNlLWJveCwNCi5zdGVwLWJveCwNCi5kaXN0cmlidXRpb24tY2FyZCwNCi5yYW5kb20tdmFyaWFibGUtY2FyZCB7DQogIGJhY2tncm91bmQtY29sb3I6ICNFRkVCRTk7DQogIGJvcmRlcjogMXB4IHNvbGlkICNEN0NDQzg7DQogIGJvcmRlci1yYWRpdXM6IDZweDsNCiAgcGFkZGluZzogMTVweDsNCiAgbWFyZ2luOiAxNXB4IDA7DQogIHRyYW5zaXRpb246IGFsbCAwLjNzIGVhc2U7DQogIHBvc2l0aW9uOiByZWxhdGl2ZTsNCiAgY3Vyc29yOiBoZWxwOw0KfQ0KDQovKiBUb29sdGlwIHVudHVrIHNlbXVhIGJveCAqLw0KLmNvbmNlcHQtaW50cm86aG92ZXI6OmFmdGVyLA0KLmZvcm11bGEtYm94OmhvdmVyOjphZnRlciwNCi5leGFtcGxlLWJveDpob3Zlcjo6YWZ0ZXIsDQoucmVmZXJlbmNlLWJveDpob3Zlcjo6YWZ0ZXIsDQouc3RlcC1ib3g6aG92ZXI6OmFmdGVyLA0KLmRpc3RyaWJ1dGlvbi1jYXJkOmhvdmVyOjphZnRlciwNCi5yYW5kb20tdmFyaWFibGUtY2FyZDpob3Zlcjo6YWZ0ZXIgew0KICBjb250ZW50OiBhdHRyKGRhdGEtdG9vbHRpcCk7DQogIHBvc2l0aW9uOiBhYnNvbHV0ZTsNCiAgdG9wOiAtMTBweDsNCiAgbGVmdDogNTAlOw0KICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLTUwJSk7DQogIGJhY2tncm91bmQtY29sb3I6ICM1RDQwMzc7DQogIGNvbG9yOiAjRkZGOEUxOw0KICBwYWRkaW5nOiA1cHggMTBweDsNCiAgYm9yZGVyLXJhZGl1czogM3B4Ow0KICBmb250LXNpemU6IDAuNzVlbTsNCiAgd2hpdGUtc3BhY2U6IG5vd3JhcDsNCiAgei1pbmRleDogMTAwMDsNCiAgb3BhY2l0eTogMC45Ow0KfQ0KDQouY29uY2VwdC1pbnRybzpob3ZlciwNCi5mb3JtdWxhLWJveDpob3ZlciwNCi5leGFtcGxlLWJveDpob3ZlciwNCi5yZWZlcmVuY2UtYm94OmhvdmVyLA0KLnN0ZXAtYm94OmhvdmVyLA0KLmRpc3RyaWJ1dGlvbi1jYXJkOmhvdmVyLA0KLnJhbmRvbS12YXJpYWJsZS1jYXJkOmhvdmVyIHsNCiAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC0zcHgpOw0KICBib3gtc2hhZG93OiAwIDVweCAxNXB4IHJnYmEoMCwgMCwgMCwgMC4wNSk7DQogIGJvcmRlci1jb2xvcjogIzhENkU2MzsNCn0NCg0KLmNvbmNlcHQtaW50cm8gew0KICBib3JkZXItbGVmdDogM3B4IHNvbGlkICM4RDZFNjM7DQp9DQoNCi5mb3JtdWxhLWJveCB7DQogIGJhY2tncm91bmQtY29sb3I6ICNGNUVGRTY7DQogIHRleHQtYWxpZ246IGNlbnRlcjsNCn0NCg0KLmV4YW1wbGUtYm94IHsNCiAgYmFja2dyb3VuZC1jb2xvcjogI0Y1RURFMzsNCn0NCg0KLnN0ZXAtYm94IHsNCiAgYm9yZGVyLWxlZnQ6IDJweCBzb2xpZCAjOEQ2RTYzOw0KICBtYXJnaW46IDhweCAwOw0KfQ0KDQoucmVmZXJlbmNlLWJveCB7DQogIGJhY2tncm91bmQtY29sb3I6ICNFRkVCRTk7DQogIGJvcmRlcjogMXB4IHNvbGlkICNCQ0FBQTQ7DQp9DQoNCi8qID09PT09PT09PT0gRElTVFJJQlVUSU9OIENBUkRTID09PT09PT09PT0gKi8NCi5kaXN0cmlidXRpb24tdHlwZXMgew0KICBkaXNwbGF5OiBmbGV4Ow0KICBnYXA6IDE1cHg7DQogIG1hcmdpbjogMTVweCAwOw0KfQ0KDQouZGlzdHJpYnV0aW9uLWNhcmQgew0KICBmbGV4OiAxOw0KICBtaW4taGVpZ2h0OiAyMDBweDsNCn0NCg0KLmRpc3RyaWJ1dGlvbi1jYXJkIGgzIHsNCiAgY29sb3I6ICM1RDQwMzc7DQogIHRleHQtYWxpZ246IGNlbnRlcjsNCiAgbWFyZ2luLWJvdHRvbTogMTBweDsNCn0NCg0KLmRpc3RyaWJ1dGlvbi1wb2ludHMgew0KICBsaXN0LXN0eWxlLXR5cGU6IG5vbmU7DQogIHBhZGRpbmctbGVmdDogMTBweDsNCn0NCg0KLmRpc3RyaWJ1dGlvbi1wb2ludHMgbGkgew0KICBtYXJnaW46IDVweCAwOw0KICBwYWRkaW5nLWxlZnQ6IDE1cHg7DQogIHBvc2l0aW9uOiByZWxhdGl2ZTsNCn0NCg0KLmRpc3RyaWJ1dGlvbi1wb2ludHMgbGk6YmVmb3JlIHsNCiAgY29udGVudDogIuKAoiI7DQogIGNvbG9yOiAjOEQ2RTYzOw0KICBwb3NpdGlvbjogYWJzb2x1dGU7DQogIGxlZnQ6IDA7DQp9DQoNCi8qID09PT09PT09PT0gUkFORE9NIFZBUklBQkxFIENBUkRTID09PT09PT09PT0gKi8NCi5yYW5kb20tdmFyaWFibGUtZ3JpZCB7DQogIGRpc3BsYXk6IGdyaWQ7DQogIGdyaWQtdGVtcGxhdGUtY29sdW1uczogcmVwZWF0KGF1dG8tZml0LCBtaW5tYXgoMjUwcHgsIDFmcikpOw0KICBnYXA6IDE1cHg7DQogIG1hcmdpbjogMTVweCAwOw0KfQ0KDQoucmFuZG9tLXZhcmlhYmxlLWNhcmQgew0KICBtaW4taGVpZ2h0OiAyNTBweDsNCn0NCg0KLnJhbmRvbS12YXJpYWJsZS1jYXJkIGgzIHsNCiAgY29sb3I6ICM1RDQwMzc7DQogIHRleHQtYWxpZ246IGNlbnRlcjsNCiAgbWFyZ2luLWJvdHRvbTogMTBweDsNCiAgZGlzcGxheTogZmxleDsNCiAgYWxpZ24taXRlbXM6IGNlbnRlcjsNCiAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7DQogIGdhcDogOHB4Ow0KfQ0KDQouY2FyZC1wb2ludHMgew0KICBsaXN0LXN0eWxlLXR5cGU6IG5vbmU7DQogIG1hcmdpbi1ib3R0b206IDEwcHg7DQp9DQoNCi5jYXJkLXBvaW50cyBsaSB7DQogIG1hcmdpbjogNXB4IDA7DQogIHBhZGRpbmctbGVmdDogMTVweDsNCiAgcG9zaXRpb246IHJlbGF0aXZlOw0KfQ0KDQouY2FyZC1wb2ludHMgbGk6YmVmb3JlIHsNCiAgY29udGVudDogIuKAuiI7DQogIGNvbG9yOiAjOEQ2RTYzOw0KICBwb3NpdGlvbjogYWJzb2x1dGU7DQogIGxlZnQ6IDA7DQp9DQoNCi8qID09PT09PT09PT0gU1RVREVOVCBJTkZPIEJBREdFUyA9PT09PT09PT09ICovDQouaW5mby1iYWRnZXMgew0KICBkaXNwbGF5OiBmbGV4Ow0KICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsNCiAgZmxleC13cmFwOiB3cmFwOw0KICBnYXA6IDEwcHg7DQogIG1hcmdpbjogMjBweCAwOw0KfQ0KDQouYmFkZ2Ugew0KICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoMTM1ZGVnLCAjOEQ2RTYzIDAlLCAjQTE4ODdGIDEwMCUpOw0KICBjb2xvcjogI0ZGRjhFMTsNCiAgcGFkZGluZzogOHB4IDE1cHg7DQogIGJvcmRlci1yYWRpdXM6IDIwcHg7DQogIGZvbnQtc2l6ZTogMC45ZW07DQogIGRpc3BsYXk6IGZsZXg7DQogIGFsaWduLWl0ZW1zOiBjZW50ZXI7DQogIGdhcDogOHB4Ow0KICBjdXJzb3I6IGhlbHA7DQogIHBvc2l0aW9uOiByZWxhdGl2ZTsNCiAgdHJhbnNpdGlvbjogdHJhbnNmb3JtIDAuM3MgZWFzZTsNCn0NCg0KLmJhZGdlOmhvdmVyIHsNCiAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC0zcHgpOw0KfQ0KDQovKiBUb29sdGlwIHVudHVrIGJhZGdlcyAqLw0KLmJhZGdlOmhvdmVyOjphZnRlciB7DQogIGNvbnRlbnQ6IGF0dHIoZGF0YS10b29sdGlwKTsNCiAgcG9zaXRpb246IGFic29sdXRlOw0KICBib3R0b206IDEwMCU7DQogIGxlZnQ6IDUwJTsNCiAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKC01MCUpOw0KICBiYWNrZ3JvdW5kLWNvbG9yOiAjNUQ0MDM3Ow0KICBjb2xvcjogI0ZGRjhFMTsNCiAgcGFkZGluZzogNXB4IDEwcHg7DQogIGJvcmRlci1yYWRpdXM6IDNweDsNCiAgZm9udC1zaXplOiAwLjc1ZW07DQogIHdoaXRlLXNwYWNlOiBub3dyYXA7DQogIHotaW5kZXg6IDEwMDA7DQogIG9wYWNpdHk6IDAuOTsNCiAgbWFyZ2luLWJvdHRvbTogNXB4Ow0KfQ0KDQovKiA9PT09PT09PT09IFRBQkxFUyA9PT09PT09PT09ICovDQp0YWJsZSB7DQogIG1hcmdpbjogMTVweCAwOw0KICBib3gtc2hhZG93OiAwIDFweCAycHggcmdiYSgwLDAsMCwwLjEpOw0KICBib3JkZXItcmFkaXVzOiA2cHg7DQogIG92ZXJmbG93OiBoaWRkZW47DQogIGN1cnNvcjogaGVscDsNCiAgcG9zaXRpb246IHJlbGF0aXZlOw0KfQ0KDQp0YWJsZTpob3Zlcjo6YWZ0ZXIgew0KICBjb250ZW50OiAiQ29tcGFyaXNvbiB0YWJsZSBiZXR3ZWVuIGRpc2NyZXRlIGFuZCBjb250aW51b3VzIHZhcmlhYmxlcyI7DQogIHBvc2l0aW9uOiBhYnNvbHV0ZTsNCiAgdG9wOiAtMzBweDsNCiAgbGVmdDogNTAlOw0KICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLTUwJSk7DQogIGJhY2tncm91bmQtY29sb3I6ICM1RDQwMzc7DQogIGNvbG9yOiAjRkZGOEUxOw0KICBwYWRkaW5nOiA1cHggMTBweDsNCiAgYm9yZGVyLXJhZGl1czogM3B4Ow0KICBmb250LXNpemU6IDAuNzVlbTsNCiAgd2hpdGUtc3BhY2U6IG5vd3JhcDsNCiAgei1pbmRleDogMTAwMDsNCiAgb3BhY2l0eTogMC45Ow0KfQ0KDQp0aCwgdGQgew0KICBwYWRkaW5nOiA4cHggMTBweDsNCiAgdGV4dC1hbGlnbjogbGVmdDsNCn0NCg0KdGggew0KICBiYWNrZ3JvdW5kLWNvbG9yOiAjOEQ2RTYzOw0KICBjb2xvcjogI0ZGRjhFMTsNCiAgZm9udC13ZWlnaHQ6IGJvbGQ7DQp9DQoNCnRyOm50aC1jaGlsZChldmVuKSB7DQogIGJhY2tncm91bmQtY29sb3I6ICNFRkVCRTk7DQp9DQoNCnRyOmhvdmVyIHsNCiAgYmFja2dyb3VuZC1jb2xvcjogI0Y1RURFMzsNCn0NCg0KLyogPT09PT09PT09PSBGT09URVIgU0VDVElPTiA9PT09PT09PT09ICovDQouZm9vdGVyLXNlY3Rpb24gew0KICBtYXJnaW4tdG9wOiAzMHB4Ow0KICBwYWRkaW5nOiAxNXB4Ow0KICBiYWNrZ3JvdW5kLWNvbG9yOiAjNUQ0MDM3Ow0KICBjb2xvcjogI0ZGRjhFMTsNCiAgYm9yZGVyLXJhZGl1czogOHB4Ow0KICB0ZXh0LWFsaWduOiBjZW50ZXI7DQogIGN1cnNvcjogaGVscDsNCiAgcG9zaXRpb246IHJlbGF0aXZlOw0KfQ0KDQouZm9vdGVyLXNlY3Rpb246aG92ZXI6OmFmdGVyIHsNCiAgY29udGVudDogIkVuZCBvZiBkb2N1bWVudCAtIENyZWF0ZWQgZm9yIFdlZWsgMTEgQXNzaWdubWVudCI7DQogIHBvc2l0aW9uOiBhYnNvbHV0ZTsNCiAgdG9wOiAtMzBweDsNCiAgbGVmdDogNTAlOw0KICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLTUwJSk7DQogIGJhY2tncm91bmQtY29sb3I6ICM1RDQwMzc7DQogIGNvbG9yOiAjRkZGOEUxOw0KICBwYWRkaW5nOiA1cHggMTBweDsNCiAgYm9yZGVyLXJhZGl1czogM3B4Ow0KICBmb250LXNpemU6IDAuNzVlbTsNCiAgd2hpdGUtc3BhY2U6IG5vd3JhcDsNCiAgei1pbmRleDogMTAwMDsNCiAgb3BhY2l0eTogMC45Ow0KfQ0KDQovKiA9PT09PT09PT09IENPREUgQkxPQ0tTID09PT09PT09PT0gKi8NCnByZSB7DQogIHBhZGRpbmc6IDE1cHg7DQogIG1hcmdpbjogMTVweCAwOw0KICBmb250LXNpemU6IDAuOWVtOw0KICBiYWNrZ3JvdW5kLWNvbG9yOiAjM0UyNzIzOw0KICBjb2xvcjogI0Q3Q0NDODsNCiAgYm9yZGVyLXJhZGl1czogNnB4Ow0KICBib3JkZXItbGVmdDogM3B4IHNvbGlkICM4RDZFNjM7DQogIGN1cnNvcjogaGVscDsNCiAgcG9zaXRpb246IHJlbGF0aXZlOw0KfQ0KDQpwcmU6aG92ZXI6OmFmdGVyIHsNCiAgY29udGVudDogIlIgY29kZSBjaHVuayBmb3IgdmlzdWFsaXphdGlvbiI7DQogIHBvc2l0aW9uOiBhYnNvbHV0ZTsNCiAgdG9wOiAtMzBweDsNCiAgbGVmdDogNTAlOw0KICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLTUwJSk7DQogIGJhY2tncm91bmQtY29sb3I6ICM1RDQwMzc7DQogIGNvbG9yOiAjRkZGOEUxOw0KICBwYWRkaW5nOiA1cHggMTBweDsNCiAgYm9yZGVyLXJhZGl1czogM3B4Ow0KICBmb250LXNpemU6IDAuNzVlbTsNCiAgd2hpdGUtc3BhY2U6IG5vd3JhcDsNCiAgei1pbmRleDogMTAwMDsNCiAgb3BhY2l0eTogMC45Ow0KfQ0KDQovKiA9PT09PT09PT09IE1BVEggQ09OVEFJTkVSID09PT09PT09PT0gKi8NCi5tYXRoLWNvbnRhaW5lciB7DQogIG1hcmdpbjogMTVweCAwOw0KICBwYWRkaW5nOiAxMnB4Ow0KICBiYWNrZ3JvdW5kLWNvbG9yOiAjRjVFRkU2Ow0KICBib3JkZXItcmFkaXVzOiA2cHg7DQogIGJvcmRlcjogMXB4IHNvbGlkICNEN0NDQzg7DQogIHRleHQtYWxpZ246IGNlbnRlcjsNCn0NCg0KLyogPT09PT09PT09PSBSRVNQT05TSVZFIERFU0lHTiA9PT09PT09PT09ICovDQpAbWVkaWEgKG1heC13aWR0aDogMTEwMHB4KSB7DQogICN0b2MtY29udGFpbmVyIHsNCiAgICBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7DQogIH0NCiAgDQogIC50b2MtdG9nZ2xlIHsNCiAgICBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7DQogIH0NCn0NCg0KLyogVEFNQkFIS0FOIENTUyBJTkkgLSBUSURBSyBNRU5HVUJBSCBBUEFQVU4gWUFORyBMQUlOICovDQoNCi8qIFNjcm9sbGJhciB1bnR1ayAjdG9jLWxpc3QgKi8NCiN0b2MtbGlzdCB7DQogIG1heC1oZWlnaHQ6IDQwMHB4Ow0KICBvdmVyZmxvdy15OiBhdXRvOw0KfQ0KDQojdG9jLWxpc3Q6Oi13ZWJraXQtc2Nyb2xsYmFyIHsNCiAgd2lkdGg6IDZweDsNCn0NCg0KI3RvYy1saXN0Ojotd2Via2l0LXNjcm9sbGJhci10cmFjayB7DQogIGJhY2tncm91bmQ6ICNmMWYxZjE7DQp9DQoNCiN0b2MtbGlzdDo6LXdlYmtpdC1zY3JvbGxiYXItdGh1bWIgew0KICBiYWNrZ3JvdW5kOiAjODg4Ow0KICBib3JkZXItcmFkaXVzOiAzcHg7DQp9DQoNCiN0b2MtbGlzdDo6LXdlYmtpdC1zY3JvbGxiYXItdGh1bWI6aG92ZXIgew0KICBiYWNrZ3JvdW5kOiAjNTU1Ow0KfQ0KDQpAbWVkaWEgKG1heC13aWR0aDogNzY4cHgpIHsNCiAgYm9keSB7DQogICAgcGFkZGluZzogMTBweDsNCiAgfQ0KICANCiAgLmhlYWRlci1zZWN0aW9uIGgxIHsNCiAgICBmb250LXNpemU6IDEuNmVtOw0KICB9DQogIA0KICBoMSB7DQogICAgZm9udC1zaXplOiAxLjVlbTsNCiAgfQ0KICANCiAgaDIgew0KICAgIGZvbnQtc2l6ZTogMS4zZW07DQogIH0NCiAgDQogIC5jb25jZXB0LWludHJvLA0KICAuZm9ybXVsYS1ib3gsDQogIC5leGFtcGxlLWJveCwNCiAgLnJlZmVyZW5jZS1ib3gsDQogIC5kaXN0cmlidXRpb24tY2FyZCwNCiAgLnJhbmRvbS12YXJpYWJsZS1jYXJkIHsNCiAgICBwYWRkaW5nOiAxMnB4Ow0KICAgIG1hcmdpbjogMTBweCAwOw0KICB9DQogIA0KICAuZGlzdHJpYnV0aW9uLXR5cGVzIHsNCiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOw0KICB9DQogIA0KICAucmFuZG9tLXZhcmlhYmxlLWdyaWQgew0KICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogMWZyOw0KICB9DQogIA0KICAuaW5mby1iYWRnZXMgew0KICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47DQogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsNCiAgfQ0KICANCiAgLmJhZGdlIHsNCiAgICB3aWR0aDogMTAwJTsNCiAgICBtYXgtd2lkdGg6IDMwMHB4Ow0KICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOw0KICB9DQp9DQoNCi8qID09PT09PT09PT0gQU5JTUFUSU9OUyA9PT09PT09PT09ICovDQpAa2V5ZnJhbWVzIGZhZGVJbiB7DQogIGZyb20gew0KICAgIG9wYWNpdHk6IDA7DQogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDIwcHgpOw0KICB9DQogIHRvIHsNCiAgICBvcGFjaXR5OiAxOw0KICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgwKTsNCiAgfQ0KfQ0KDQouY29uY2VwdC1pbnRybywNCi5mb3JtdWxhLWJveCwNCi5leGFtcGxlLWJveCwNCi5yZWZlcmVuY2UtYm94LA0KLmRpc3RyaWJ1dGlvbi1jYXJkLA0KLnJhbmRvbS12YXJpYWJsZS1jYXJkIHsNCiAgYW5pbWF0aW9uOiBmYWRlSW4gMC42cyBlYXNlLW91dDsNCn0NCjwvc3R5bGU+DQoNCjxzY3JpcHQ+DQovLyBKYXZhU2NyaXB0IHVudHVrIFRPQw0KZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignRE9NQ29udGVudExvYWRlZCcsIGZ1bmN0aW9uKCkgew0KICAvLyBCdWF0IHRvbWJvbCB0b2dnbGUgVE9DDQogIGNvbnN0IHRvY1RvZ2dsZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2J1dHRvbicpOw0KICB0b2NUb2dnbGUuY2xhc3NOYW1lID0gJ3RvYy10b2dnbGUnOw0KICB0b2NUb2dnbGUuaW5uZXJIVE1MID0gJ/Cfk5YnOw0KICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRvY1RvZ2dsZSk7DQogIA0KICAvLyBCdWF0IGNvbnRhaW5lciBUT0MNCiAgY29uc3QgdG9jQ29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7DQogIHRvY0NvbnRhaW5lci5pZCA9ICd0b2MtY29udGFpbmVyJzsNCiAgDQogIGNvbnN0IHRvY1RpdGxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaDMnKTsNCiAgdG9jVGl0bGUuaWQgPSAndG9jLXRpdGxlJzsNCiAgdG9jVGl0bGUudGV4dENvbnRlbnQgPSAn8J+TmiBUYWJsZSBvZiBDb250ZW50cyc7DQogIA0KICBjb25zdCB0b2NMaXN0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndWwnKTsNCiAgdG9jTGlzdC5pZCA9ICd0b2MtbGlzdCc7DQogIA0KICAvLyBLdW1wdWxrYW4gc2VtdWEgaGVhZGluZw0KICBjb25zdCBoZWFkaW5ncyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ2gxLCBoMicpOw0KICBoZWFkaW5ncy5mb3JFYWNoKChoZWFkaW5nLCBpbmRleCkgPT4gew0KICAgIGlmIChoZWFkaW5nLmlkID09PSAnJyB8fCAhaGVhZGluZy5pZCkgew0KICAgICAgaGVhZGluZy5pZCA9ICdzZWN0aW9uLScgKyBpbmRleDsNCiAgICB9DQogICAgDQogICAgY29uc3QgbGlzdEl0ZW0gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdsaScpOw0KICAgIGNvbnN0IGxpbmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7DQogICAgbGluay5ocmVmID0gJyMnICsgaGVhZGluZy5pZDsNCiAgICBsaW5rLnRleHRDb250ZW50ID0gaGVhZGluZy50ZXh0Q29udGVudDsNCiAgICANCiAgICAvLyBUYW1iYWggdG9vbHRpcA0KICAgIGlmIChoZWFkaW5nLnRpdGxlKSB7DQogICAgICBsaW5rLnNldEF0dHJpYnV0ZSgnZGF0YS10b29sdGlwJywgaGVhZGluZy50aXRsZSk7DQogICAgfQ0KICAgIA0KICAgIGxpbmsuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoZSkgPT4gew0KICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOw0KICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaGVhZGluZy5pZCkuc2Nyb2xsSW50b1ZpZXcoew0KICAgICAgICBiZWhhdmlvcjogJ3Ntb290aCcNCiAgICAgIH0pOw0KICAgICAgdG9jQ29udGFpbmVyLmNsYXNzTGlzdC5yZW1vdmUoJ3Nob3cnKTsNCiAgICB9KTsNCiAgICANCiAgICBsaXN0SXRlbS5hcHBlbmRDaGlsZChsaW5rKTsNCiAgICB0b2NMaXN0LmFwcGVuZENoaWxkKGxpc3RJdGVtKTsNCiAgfSk7DQogIA0KICB0b2NDb250YWluZXIuYXBwZW5kQ2hpbGQodG9jVGl0bGUpOw0KICB0b2NDb250YWluZXIuYXBwZW5kQ2hpbGQodG9jTGlzdCk7DQogIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodG9jQ29udGFpbmVyKTsNCiAgDQogIC8vIFRvZ2dsZSBUT0MNCiAgdG9jVG9nZ2xlLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4gew0KICAgIHRvY0NvbnRhaW5lci5jbGFzc0xpc3QudG9nZ2xlKCdzaG93Jyk7DQogIH0pOw0KICANCiAgLy8gVHV0dXAgVE9DIGtldGlrYSBrbGlrIGRpIGx1YXINCiAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoZSkgPT4gew0KICAgIGlmICghdG9jQ29udGFpbmVyLmNvbnRhaW5zKGUudGFyZ2V0KSAmJiAhdG9jVG9nZ2xlLmNvbnRhaW5zKGUudGFyZ2V0KSkgew0KICAgICAgdG9jQ29udGFpbmVyLmNsYXNzTGlzdC5yZW1vdmUoJ3Nob3cnKTsNCiAgICB9DQogIH0pOw0KICANCiAgLy8gQ29weSBzdHVkZW50IGluZm8ga2V0aWthIGhlYWRlciBkaWtsaWsNCiAgY29uc3QgaGVhZGVyU2VjdGlvbiA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5oZWFkZXItc2VjdGlvbicpOw0KICBoZWFkZXJTZWN0aW9uLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4gew0KICAgIGNvbnN0IHN0dWRlbnRJbmZvID0gYE5hbWU6IEFkaW5kYSBBZGVsaWEgRnV0cmlcbk5JTTogMjAyMzMxMjQyXG5Bc3NpZ25tZW50OiBXZWVrIDExIFByb2JhYmlsaXR5IERpc3RyaWJ1dGlvbmA7DQogICAgbmF2aWdhdG9yLmNsaXBib2FyZC53cml0ZVRleHQoc3R1ZGVudEluZm8pDQogICAgICAudGhlbigoKSA9PiB7DQogICAgICAgIGNvbnN0IG9yaWdpbmFsVGl0bGUgPSBoZWFkZXJTZWN0aW9uLnF1ZXJ5U2VsZWN0b3IoJ2gxJykudGV4dENvbnRlbnQ7DQogICAgICAgIGhlYWRlclNlY3Rpb24ucXVlcnlTZWxlY3RvcignaDEnKS50ZXh0Q29udGVudCA9ICfinJMgQ29waWVkIHRvIGNsaXBib2FyZCEnOw0KICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHsNCiAgICAgICAgICBoZWFkZXJTZWN0aW9uLnF1ZXJ5U2VsZWN0b3IoJ2gxJykudGV4dENvbnRlbnQgPSBvcmlnaW5hbFRpdGxlOw0KICAgICAgICB9LCAyMDAwKTsNCiAgICAgIH0pOw0KICB9KTsNCn0pOw0KPC9zY3JpcHQ+DQoNCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQ0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KA0KICBlY2hvID0gRkFMU0UsDQogIHdhcm5pbmcgPSBGQUxTRSwNCiAgbWVzc2FnZSA9IEZBTFNFLA0KICBmaWcuYWxpZ24gPSAiY2VudGVyIiwNCiAgZmlnLndpZHRoID0gNywNCiAgZmlnLmhlaWdodCA9IDQsDQogIG91dC53aWR0aCA9ICI5MCUiDQopDQoNCiMgTG9hZCByZXF1aXJlZCBsaWJyYXJpZXMNCmxpYnJhcnkoZ2dwbG90MikNCmxpYnJhcnkoZHBseXIpDQpsaWJyYXJ5KGdyaWRFeHRyYSkNCmxpYnJhcnkoa25pdHIpDQpsaWJyYXJ5KGthYmxlRXh0cmEpDQpsaWJyYXJ5KHNjYWxlcykNCmxpYnJhcnkocm1hcmtkb3duKQ0KbGlicmFyeShwcmV0dHlkb2MpDQpgYGANCg0KPGRpdiBjbGFzcz0iaGVhZGVyLXNlY3Rpb24iIHRpdGxlPSJTdHVkZW50IEluZm9ybWF0aW9uIEhlYWRlciI+IDxoMT5UdWdhcyBXZWVrIDExIH4gUHJvYmFiaWxpdHkgRGlzdHJpYnV0aW9uPC9oMT4gPHA+PHN0cm9uZz5OYW1hOiBBZGluZGEgQWRlbGlhIEZ1dHJpPC9zdHJvbmc+PC9wPiA8cD48c3Ryb25nPk5JTTogNTIyNTAwNTU8L3N0cm9uZz48L3A+IDwvZGl2PjwvYT4gPC9kaXY+PGRpdiBjbGFzcz0icGhvdG8tY29udGFpbmVyIj4gPGltZyBzcmM9Imh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9hZGluZGFhZGVsaWFmdXRyaTYtZ2lmL2FkaW5kdXkvbWFpbi9ha3VkaW5kYS5qcGVnIiBhbHQ9IkZvdG8gQWRpbmRhIEFkZWxpYSBGdXRyaSIgY2xhc3M9InN0dWRlbnQtcGhvdG8iPiA8L2Rpdj48aDIgdGl0bGU9IlN0dWRlbnQgUHJvZmlsZSBJbmZvcm1hdGlvbiI+U3R1ZGVudCBQcm9maWxlPC9oMj48ZGl2IGNsYXNzPSJpbmZvLWJhZGdlcyI+IDxkaXYgY2xhc3M9ImJhZGdlIiBkYXRhLXRvb2x0aXA9Ikluc3RpdHV0IHRla25vbG9naSBzYWlucyBiYW5kdW5nIj4gPGk+8J+OkzwvaT4gPHNwYW4+U3R1ZGVudCBNYWpvcmluZyBpbiBEYXRhIFNjaWVuY2UgYXQgSVRTQjwvc3Bhbj4gPC9kaXY+IDxkaXYgY2xhc3M9ImJhZGdlIiBkYXRhLXRvb2x0aXA9IkRhdGEgU2NpZW5jZSAmIEFuYWx5dGljcyI+IDxpPvCfk4o8L2k+IDxzcGFuPkRhdGEgU2NpZW5jZTwvc3Bhbj4gPC9kaXY+IDxkaXYgY2xhc3M9ImJhZGdlIiBkYXRhLXRvb2x0aXA9IlN0YXRpc3RpY2FsIEFuYWx5c2lzIj4gPGk+8J+TiDwvaT4gPHNwYW4+U3RhdGlzdGljczwvc3Bhbj4gPC9kaXY+IDxkaXYgY2xhc3M9ImJhZGdlIiBkYXRhLXRvb2x0aXA9IlIgUHJvZ3JhbW1pbmcgTGFuZ3VhZ2UiPiA8aT7wn5K7PC9pPiA8c3Bhbj5SIFByb2dyYW1taW5nPC9zcGFuPiA8L2Rpdj4gPC9kaXY+PGgxIHRpdGxlPSJJbnRyb2R1Y3Rpb24gdG8gQ29udGludW91cyBQcm9iYWJpbGl0eSBEaXN0cmlidXRpb25zIj5JbnRyb2R1Y3Rpb24gdG8gUHJvYmFiaWxpdHkgRGlzdHJpYnV0aW9ucyBvZiBDb250aW51b3VzIFZhcmlhYmxlczwvaDE+PC9kaXY+PCEtLSBWSURFTyBMSU5LIERJQkFXQUggSlVEVUwgTUFURVJJIFBFUlRBTUEgLS0+PGRpdiBjbGFzcz0idmlkZW8tY29udGFpbmVyIiBkYXRhLXRvb2x0aXA9IlZpZGVvIGludHJvZHVjdGlvbiB0byBwcm9iYWJpbGl0eSBkaXN0cmlidXRpb25zIj4gPGEgaHJlZj0iaHR0cHM6Ly95b3V0dS5iZS9aeVV6UlZhNmhDTT9zaT1EMHA3NWN1eWJ2b3VKRS00IiBjbGFzcz0idmlkZW8tbGluayIgdGFyZ2V0PSJfYmxhbmsiPiA8aT7ilrbvuI88L2k+IFdhdGNoOiBJbnRyb2R1Y3Rpb24gdG8gUHJvYmFiaWxpdHkgRGlzdHJpYnV0aW9ucyA8L2E+IDwvZGl2PjxkaXYgY2xhc3M9ImNvbmNlcHQtaW50cm8iIGRhdGEtdG9vbHRpcD0iRnVuZGFtZW50YWwgY29uY2VwdHMgYWJvdXQgY29udGludW91cyB2YXJpYWJsZXMiPiBCZWZvcmUgZXhwbG9yaW5nIHNwZWNpZmljIGNvbnRpbnVvdXMgcHJvYmFiaWxpdHkgZGlzdHJpYnV0aW9ucywgaXQgaXMgaW1wb3J0YW50IHRvIHVuZGVyc3RhbmQgdGhlIGZ1bmRhbWVudGFsIGRpZmZlcmVuY2VzIGJldHdlZW4gZGlzY3JldGUgYW5kIGNvbnRpbnVvdXMgdmFyaWFibGVzLiBVbmxpa2UgZGlzY3JldGUgdmFyaWFibGVzIHRoYXQgdGFrZSBzcGVjaWZpYywgY291bnRhYmxlIHZhbHVlcywgY29udGludW91cyB2YXJpYWJsZXMgY2FuIGFzc3VtZSBhbnkgdmFsdWUgd2l0aGluIGEgZ2l2ZW4gcmFuZ2Ugb3IgaW50ZXJ2YWwuIFRoaXMgZGlzdGluY3Rpb24gZnVuZGFtZW50YWxseSBjaGFuZ2VzIGhvdyB3ZSBjYWxjdWxhdGUgYW5kIGludGVycHJldCBwcm9iYWJpbGl0aWVzLiBJbiBjb250aW51b3VzIGRpc3RyaWJ1dGlvbnMsIHdlIGZvY3VzIG9uIHRoZSBwcm9iYWJpbGl0eSBvZiBhIHZhcmlhYmxlIGZhbGxpbmcgd2l0aGluIGEgY2VydGFpbiByYW5nZSByYXRoZXIgdGhhbiB0YWtpbmcgZXhhY3QgdmFsdWVzLiA8L2Rpdj48aDEgdGl0bGU9IkNvbXBhcmlzb24gb2YgRGlzY3JldGUgYW5kIENvbnRpbnVvdXMgRGlzdHJpYnV0aW9ucyI+Q29tcGFyaXNvbiBvZiBEaXNjcmV0ZSBhbmQgQ29udGludW91cyBEaXN0cmlidXRpb25zPC9oMT48ZGl2IGNsYXNzPSJkaXN0cmlidXRpb24tdHlwZXMiPiA8ZGl2IGNsYXNzPSJkaXN0cmlidXRpb24tY2FyZCIgZGF0YS10b29sdGlwPSJDaGFyYWN0ZXJpc3RpY3Mgb2YgZGlzY3JldGUgZGlzdHJpYnV0aW9ucyI+IDxoMz5EaXNjcmV0ZSBEaXN0cmlidXRpb248L2gzPiA8dWwgY2xhc3M9ImRpc3RyaWJ1dGlvbi1wb2ludHMiPiA8bGk+VmFyaWFibGVzIGNhbiBvbmx5IHRha2UgY291bnRhYmxlLCBzcGVjaWZpYyB2YWx1ZXM8L2xpPiA8bGk+VXNlZCBmb3IgY291bnRhYmxlIGRhdGEgKG51bWJlciBvZiBldmVudHMpPC9saT4gPGxpPlByb2JhYmlsaXR5IGNhbGN1bGF0ZWQgYXQgc3BlY2lmaWMgcG9pbnRzPC9saT4gPGxpPlVzZXMgUHJvYmFiaWxpdHkgTWFzcyBGdW5jdGlvbiAoUE1GKTwvbGk+IDxsaT5FeGFtcGxlczogbnVtYmVyIG9mIGhlYWRzIGluIGNvaW4gdG9zcywgZGVmZWN0IGNvdW50czwvbGk+IDwvdWw+IDwvZGl2PiA8ZGl2IGNsYXNzPSJkaXN0cmlidXRpb24tY2FyZCIgZGF0YS10b29sdGlwPSJDaGFyYWN0ZXJpc3RpY3Mgb2YgY29udGludW91cyBkaXN0cmlidXRpb25zIj4gPGgzPkNvbnRpbnVvdXMgRGlzdHJpYnV0aW9uPC9oMz4gPHVsIGNsYXNzPSJkaXN0cmlidXRpb24tcG9pbnRzIj4gPGxpPlZhcmlhYmxlcyBjYW4gdGFrZSBhbnkgdmFsdWUgd2l0aGluIGFuIGludGVydmFsPC9saT4gPGxpPlVzZWQgZm9yIG1lYXN1cmVkIGRhdGEgKG1lYXN1cmVtZW50cyk8L2xpPiA8bGk+UHJvYmFiaWxpdHkgY2FsY3VsYXRlZCBhcyBhcmVhIHVuZGVyIHRoZSBjdXJ2ZTwvbGk+IDxsaT5Vc2VzIFByb2JhYmlsaXR5IERlbnNpdHkgRnVuY3Rpb24gKFBERik8L2xpPiA8bGk+RXhhbXBsZXM6IGhlaWdodCwgdGltZSwgdGVtcGVyYXR1cmUsIHdlaWdodDwvbGk+IDwvdWw+IDwvZGl2PiA8L2Rpdj48aDIgdGl0bGU9IlByb2JhYmlsaXR5IERlbnNpdHkgRnVuY3Rpb24iPlByb2JhYmlsaXR5IERlbnNpdHkgRnVuY3Rpb24gKFBERik8L2gyPjxkaXYgY2xhc3M9ImZvcm11bGEtYm94IiBkYXRhLXRvb2x0aXA9Ik1hdGhlbWF0aWNhbCBkZWZpbml0aW9uIG9mIFBERiI+IDxzdHJvbmc+UHJvYmFiaWxpdHkgRGVuc2l0eSBGdW5jdGlvbiAoUERGKTo8L3N0cm9uZz48YnI+IFRoZSBQcm9iYWJpbGl0eSBEZW5zaXR5IEZ1bmN0aW9uIGRlc2NyaWJlcyB0aGUgcmVsYXRpdmUgbGlrZWxpaG9vZCBmb3IgYSBjb250aW51b3VzIHJhbmRvbSB2YXJpYWJsZSB0byB0YWtlIG9uIGEgZ2l2ZW4gdmFsdWUuPGJyPjxicj4gPHN0cm9uZz5NYXRoZW1hdGljYWwgRGVmaW5pdGlvbjo8L3N0cm9uZz4gJCQgZih4KT0gXGZyYWN7ZH17ZHh9IEYoeCkgJCQ8YnI+IHdoZXJlOiAkZih4KSQgaXMgdGhlIHByb2JhYmlsaXR5IGRlbnNpdHkgZnVuY3Rpb248YnI+ICRGKHgpJCBpcyB0aGUgY3VtdWxhdGl2ZSBkaXN0cmlidXRpb24gZnVuY3Rpb248YnI+ICR4JCBpcyB0aGUgdmFsdWUgb2YgdGhlIGNvbnRpbnVvdXMgcmFuZG9tIHZhcmlhYmxlPGJyPjxicj4gPHN0cm9uZz5Qcm9wZXJ0aWVzIG9mIFBERjo8L3N0cm9uZz48YnI+ICRmKHgpIFxnZXEgMCQgZm9yIGFsbCAkeCQgKE5vbi1uZWdhdGl2aXR5KTxicj4gJFxpbnRfey1caW5mdHl9XntcaW5mdHl9IGYoeCkgZHggPSAxJCAoTm9ybWFsaXphdGlvbik8YnI+ICRQKGEgXGxlcSBYIFxsZXEgYikgPSBcaW50X3thfV57Yn0gZih4KSBkeCQgKEFyZWEgdW5kZXIgY3VydmUpPGJyPiAkZih4KT1cZnJhY3sxfXtcc2lnbWEgXHNxcnR7MlxwaX19IGVeey1cZnJhY3sxfXsyfVxsZWZ0KFxmcmFje3gtXG11fXtcc2lnbWF9XHJpZ2h0KV4yfSQgPC9kaXY+PGgyIHRpdGxlPSJSYW5kb20gVmFyaWFibGVzIj5JbnRyb2R1Y3Rpb24gdG8gUmFuZG9tIFZhcmlhYmxlcyBhbmQgUHJvYmFiaWxpdHkgRGlzdHJpYnV0aW9uczwvaDI+PGRpdiBjbGFzcz0iY29uY2VwdC1pbnRybyIgZGF0YS10b29sdGlwPSJCYXNpYyBjb25jZXB0cyBvZiByYW5kb20gdmFyaWFibGVzIj4gPHN0cm9uZz5XaGF0IGFyZSBSYW5kb20gVmFyaWFibGVzPzwvc3Ryb25nPjxicj4gUmFuZG9tIHZhcmlhYmxlcyBhcmUgZnVuY3Rpb25zIHRoYXQgYXNzaWduIG51bWVyaWNhbCB2YWx1ZXMgdG8gb3V0Y29tZXMgb2YgcmFuZG9tIGV4cGVyaW1lbnRzLiBUaGV5IHByb3ZpZGUgYSBtYXRoZW1hdGljYWwgZnJhbWV3b3JrIGZvciBxdWFudGlmeWluZyB1bmNlcnRhaW50eSBhbmQgcmFuZG9tbmVzcyBpbiBzdGF0aXN0aWNhbCBhbmFseXNpcy4gPC9kaXY+PGRpdiBjbGFzcz0icmFuZG9tLXZhcmlhYmxlLWdyaWQiPiA8ZGl2IGNsYXNzPSJyYW5kb20tdmFyaWFibGUtY2FyZCIgZGF0YS10b29sdGlwPSJEaXNjcmV0ZSByYW5kb20gdmFyaWFibGVzIGRlZmluaXRpb24gYW5kIHByb3BlcnRpZXMiPiA8aDM+PGk+8J+UojwvaT4gRGlzY3JldGUgUmFuZG9tIFZhcmlhYmxlczwvaDM+IDxkaXYgY2xhc3M9ImNhcmQtY29udGVudCI+IDx1bCBjbGFzcz0iY2FyZC1wb2ludHMiPiA8bGk+PHN0cm9uZz5EZWZpbml0aW9uOjwvc3Ryb25nPiBWYXJpYWJsZXMgd2l0aCBjb3VudGFibGUsIGZpbml0ZSBvdXRjb21lczwvbGk+IDxsaT48c3Ryb25nPkV4YW1wbGVzOjwvc3Ryb25nPiBOdW1iZXIgb2YgaGVhZHMgaW4gY29pbiB0b3NzZXMsIGRpY2Ugcm9sbCByZXN1bHRzPC9saT4gPGxpPjxzdHJvbmc+UHJvYmFiaWxpdHkgRnVuY3Rpb246PC9zdHJvbmc+IFByb2JhYmlsaXR5IE1hc3MgRnVuY3Rpb24gKFBNRik8L2xpPiA8bGk+PHN0cm9uZz5LZXkgUHJvcGVydGllczo8L3N0cm9uZz4gU3VtIG9mIHByb2JhYmlsaXRpZXMgZXF1YWxzIDE8L2xpPiA8bGk+PHN0cm9uZz5SIEZ1bmN0aW9uczo8L3N0cm9uZz4gZGJpbm9tKCksIGRwb2lzKCksIGRnZW9tKCk8L2xpPiA8L3VsPiA8ZGl2IGNsYXNzPSJmb3JtdWxhLWJveCI+IDxzdHJvbmc+UE1GIEZvcm11bGE6PC9zdHJvbmc+ICQkIFAoWCA9IHhfaSkgPSBwX2kgJCQgPHN0cm9uZz5Qcm9wZXJ0aWVzOjwvc3Ryb25nPiAkJCBcc3VtX3tpPTF9XntcaW5mdHl9IHBfaSA9IDEgJCQgPC9kaXY+IDwvZGl2PiA8L2Rpdj4gPGRpdiBjbGFzcz0icmFuZG9tLXZhcmlhYmxlLWNhcmQiIGRhdGEtdG9vbHRpcD0iQ29udGludW91cyByYW5kb20gdmFyaWFibGVzIGRlZmluaXRpb24gYW5kIHByb3BlcnRpZXMiPiA8aDM+PGk+8J+TiDwvaT4gQ29udGludW91cyBSYW5kb20gVmFyaWFibGVzPC9oMz4gPGRpdiBjbGFzcz0iY2FyZC1jb250ZW50Ij4gPHVsIGNsYXNzPSJjYXJkLXBvaW50cyI+IDxsaT48c3Ryb25nPkRlZmluaXRpb246PC9zdHJvbmc+IFZhcmlhYmxlcyB3aXRoIHVuY291bnRhYmxlLCBpbmZpbml0ZSBvdXRjb21lczwvbGk+IDxsaT48c3Ryb25nPkV4YW1wbGVzOjwvc3Ryb25nPiBIZWlnaHQsIHdlaWdodCwgdGVtcGVyYXR1cmUsIHRpbWU8L2xpPiA8bGk+PHN0cm9uZz5Qcm9iYWJpbGl0eSBGdW5jdGlvbjo8L3N0cm9uZz4gUHJvYmFiaWxpdHkgRGVuc2l0eSBGdW5jdGlvbiAoUERGKTwvbGk+IDxsaT48c3Ryb25nPktleSBQcm9wZXJ0aWVzOjwvc3Ryb25nPiBBcmVhIHVuZGVyIGN1cnZlIGVxdWFscyAxPC9saT4gPGxpPjxzdHJvbmc+UiBGdW5jdGlvbnM6PC9zdHJvbmc+IGRub3JtKCksIGRleHAoKSwgZHVuaWYoKTwvbGk+IDwvdWw+IDxkaXYgY2xhc3M9ImZvcm11bGEtYm94Ij4gPHN0cm9uZz5QREYgRm9ybXVsYTo8L3N0cm9uZz4gJCQgZih4KSBcZ2VxIDAgJCQgPHN0cm9uZz5Qcm9wZXJ0aWVzOjwvc3Ryb25nPiAkJCBcaW50X3stXGluZnR5fV57XGluZnR5fSBmKHgpIGR4ID0gMSAkJCA8L2Rpdj4gPC9kaXY+IDwvZGl2PiA8ZGl2IGNsYXNzPSJyYW5kb20tdmFyaWFibGUtY2FyZCIgZGF0YS10b29sdGlwPSJDdW11bGF0aXZlIGRpc3RyaWJ1dGlvbiBmdW5jdGlvbiBjb25jZXB0cyI+IDxoMz48aT7wn5OKPC9pPiBDdW11bGF0aXZlIERpc3RyaWJ1dGlvbiBGdW5jdGlvbjwvaDM+IDxkaXYgY2xhc3M9ImNhcmQtY29udGVudCI+IDx1bCBjbGFzcz0iY2FyZC1wb2ludHMiPiA8bGk+PHN0cm9uZz5EZWZpbml0aW9uOjwvc3Ryb25nPiBQcm9iYWJpbGl0eSB0aGF0IFgg4omkIHg8L2xpPiA8bGk+PHN0cm9uZz5Vbml2ZXJzYWw6PC9zdHJvbmc+IFdvcmtzIGZvciBib3RoIGRpc2NyZXRlIGFuZCBjb250aW51b3VzPC9saT4gPGxpPjxzdHJvbmc+UHJvcGVydGllczo8L3N0cm9uZz4gTm9uLWRlY3JlYXNpbmcsIHJpZ2h0LWNvbnRpbnVvdXM8L2xpPiA8bGk+PHN0cm9uZz5SYW5nZTo8L3N0cm9uZz4gMCDiiaQgRih4KSDiiaQgMTwvbGk+IDxsaT48c3Ryb25nPlIgRnVuY3Rpb25zOjwvc3Ryb25nPiBwYmlub20oKSwgcG5vcm0oKSwgcHBvaXMoKTwvbGk+IDwvdWw+IDxkaXYgY2xhc3M9ImZvcm11bGEtYm94Ij4gPHN0cm9uZz5DREYgRm9ybXVsYTo8L3N0cm9uZz4gJCQgRih4KSA9IFAoWCBcbGVxIHgpICQkIDxzdHJvbmc+RGlzY3JldGU6PC9zdHJvbmc+ICQkIEYoeCkgPSBcc3VtX3t4X2kgXGxlcSB4fSBQKFggPSB4X2kpICQkIDxzdHJvbmc+Q29udGludW91czo8L3N0cm9uZz4gJCQgRih4KSA9IFxpbnRfey1caW5mdHl9Xnt4fSBmKHQpIGR0ICQkIDwvZGl2PiA8L2Rpdj4gPC9kaXY+IDxkaXYgY2xhc3M9InJhbmRvbS12YXJpYWJsZS1jYXJkIiBkYXRhLXRvb2x0aXA9IkV4cGVjdGF0aW9uIGFuZCB2YXJpYW5jZSBjb25jZXB0cyI+IDxoMz48aT7wn46vPC9pPiBFeHBlY3RhdGlvbiBhbmQgVmFyaWFuY2U8L2gzPiA8ZGl2IGNsYXNzPSJjYXJkLWNvbnRlbnQiPiA8dWwgY2xhc3M9ImNhcmQtcG9pbnRzIj4gPGxpPjxzdHJvbmc+RXhwZWN0ZWQgVmFsdWUgKM68KTo8L3N0cm9uZz4gQXZlcmFnZS9tZWFuIHZhbHVlPC9saT4gPGxpPjxzdHJvbmc+VmFyaWFuY2UgKM+DwrIpOjwvc3Ryb25nPiBNZWFzdXJlIG9mIHNwcmVhZC9kaXNwZXJzaW9uPC9saT4gPGxpPjxzdHJvbmc+U3RhbmRhcmQgRGV2aWF0aW9uOjwvc3Ryb25nPiBTcXVhcmUgcm9vdCBvZiB2YXJpYW5jZTwvbGk+IDxsaT48c3Ryb25nPkxpbmVhcml0eTo8L3N0cm9uZz4gRVthWCArIGJdID0gYUVbWF0gKyBiPC9saT4gPGxpPjxzdHJvbmc+UiBDYWxjdWxhdGlvbnM6PC9zdHJvbmc+IG1lYW4oKSwgdmFyKCksIHNkKCk8L2xpPiA8L3VsPiA8ZGl2IGNsYXNzPSJmb3JtdWxhLWJveCI+IDxzdHJvbmc+RXhwZWN0YXRpb246PC9zdHJvbmc+ICQkIEVbWF0gPSBcc3VtIHhfaSBwX2kgXHF1YWQgKFx0ZXh0e2Rpc2NyZXRlfSkgJCQgJCQgRVtYXSA9IFxpbnQgeCBmKHgpIGR4IFxxdWFkIChcdGV4dHtjb250aW51b3VzfSkgJCQgPHN0cm9uZz5WYXJpYW5jZTo8L3N0cm9uZz4gJCQgVmFyKFgpID0gRVsoWCAtIM68KV4yXSA9IEVbWF4yXSAtIChFW1hdKV4yICQkIDwvZGl2PiA8L2Rpdj4gPC9kaXY+IDwvZGl2PjxoMyBjbGFzcz0icmFuZG9tLXZhcmlhYmxlLXN1YnRpdGxlIiB0aXRsZT0iRGV0YWlsZWQgQ29tcGFyaXNvbiI+RGV0YWlsZWQgQ29tcGFyaXNvbjogRGlzY3JldGUgdnMgQ29udGludW91czwvaDM+PHRhYmxlIGNsYXNzPSJjb21wYXJpc29uLXRhYmxlIj4gPHRoZWFkPiA8dHI+IDx0aD5DaGFyYWN0ZXJpc3RpYzwvdGg+IDx0aD5EaXNjcmV0ZSBSYW5kb20gVmFyaWFibGU8L3RoPiA8dGg+Q29udGludW91cyBSYW5kb20gVmFyaWFibGU8L3RoPiA8L3RyPiA8L3RoZWFkPiA8dGJvZHk+IDx0cj4gPHRkPjxzdHJvbmc+UG9zc2libGUgVmFsdWVzPC9zdHJvbmc+PC90ZD4gPHRkPkNvdW50YWJsZSwgZmluaXRlIG9yIGNvdW50YWJseSBpbmZpbml0ZTwvdGQ+IDx0ZD5VbmNvdW50YWJsZSwgaW5maW5pdGUgd2l0aGluIGludGVydmFsPC90ZD4gPC90cj4gPHRyPiA8dGQ+PHN0cm9uZz5Qcm9iYWJpbGl0eSBhdCBQb2ludDwvc3Ryb25nPjwvdGQ+IDx0ZD5QKFggPSB4KSBjYW4gYmUgcG9zaXRpdmU8L3RkPiA8dGQ+UChYID0geCkgPSAwIGZvciBhbGwgeDwvdGQ+IDwvdHI+IDx0cj4gPHRkPjxzdHJvbmc+UHJvYmFiaWxpdHkgRnVuY3Rpb248L3N0cm9uZz48L3RkPiA8dGQ+UHJvYmFiaWxpdHkgTWFzcyBGdW5jdGlvbiAoUE1GKTwvdGQ+IDx0ZD5Qcm9iYWJpbGl0eSBEZW5zaXR5IEZ1bmN0aW9uIChQREYpPC90ZD4gPC90cj4gPHRyPiA8dGQ+PHN0cm9uZz5Ub3RhbCBQcm9iYWJpbGl0eTwvc3Ryb25nPjwvdGQ+IDx0ZD7iiJEgUChYID0geCkgPSAxPC90ZD4gPHRkPuKIqyBmKHgpIGR4ID0gMTwvdGQ+IDwvdHI+IDx0cj4gPHRkPjxzdHJvbmc+Q3VtdWxhdGl2ZSBEaXN0cmlidXRpb248L3N0cm9uZz48L3RkPiA8dGQ+Rih4KSA9IOKIkSBQKFgg4omkIHgpPC90ZD4gPHRkPkYoeCkgPSDiiKsgZih0KSBkdCBmcm9tIC3iiJ4gdG8geDwvdGQ+IDwvdHI+IDx0cj4gPHRkPjxzdHJvbmc+RXhhbXBsZSBEaXN0cmlidXRpb25zPC9zdHJvbmc+PC90ZD4gPHRkPkJpbm9taWFsLCBQb2lzc29uLCBHZW9tZXRyaWM8L3RkPiA8dGQ+Tm9ybWFsLCBFeHBvbmVudGlhbCwgVW5pZm9ybTwvdGQ+IDwvdHI+IDx0cj4gPHRkPjxzdHJvbmc+UmVhbC13b3JsZCBFeGFtcGxlczwvc3Ryb25nPjwvdGQ+IDx0ZD5OdW1iZXIgb2YgY3VzdG9tZXJzLCBkZWZlY3QgY291bnRzPC90ZD4gPHRkPkhlaWdodCwgdGVtcGVyYXR1cmUsIHdhaXRpbmcgdGltZTwvdGQ+IDwvdHI+IDwvdGJvZHk+IDwvdGFibGU+PGgzIGNsYXNzPSJyYW5kb20tdmFyaWFibGUtc3VidGl0bGUiIHRpdGxlPSJSIEltcGxlbWVudGF0aW9uIj5SIEltcGxlbWVudGF0aW9uIG9mIFJhbmRvbSBWYXJpYWJsZXM8L2gzPjxoMyB0aXRsZT0iQ3VtdWxhdGl2ZSBEaXN0cmlidXRpb24gRnVuY3Rpb24iPkN1bXVsYXRpdmUgRGlzdHJpYnV0aW9uIEZ1bmN0aW9uIChDREYpPC9oMz48ZGl2IGNsYXNzPSJmb3JtdWxhLWJveCIgZGF0YS10b29sdGlwPSJNYXRoZW1hdGljYWwgZGVmaW5pdGlvbiBvZiBDREYiPiA8c3Ryb25nPkN1bXVsYXRpdmUgRGlzdHJpYnV0aW9uIEZ1bmN0aW9uIChDREYpOjwvc3Ryb25nPjxicj4gVGhlIENERiBnaXZlcyB0aGUgcHJvYmFiaWxpdHkgdGhhdCBhIHJhbmRvbSB2YXJpYWJsZSAkWCQgd2lsbCB0YWtlIGEgdmFsdWUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICR4JC48YnI+PGJyPiA8c3Ryb25nPk1hdGhlbWF0aWNhbCBEZWZpbml0aW9uOjwvc3Ryb25nPiAkJCBGKHgpPVAoWOKJpHgpPVxpbnRfey1caW5mdHl9Xnt4fSBmKHQpZHQgJCQ8YnI+IDxzdHJvbmc+UHJvcGVydGllcyBvZiBDREY6PC9zdHJvbmc+PGJyPiAkRih4KSQgaXMgbm9uLWRlY3JlYXNpbmc8YnI+ICRcbGltX3t4IFx0byAtXGluZnR5fSBGKHgpID0gMCQ8YnI+ICRcbGltX3t4IFx0byBcaW5mdHl9IEYoeCkgPSAxJDxicj4gJFAoYSA8IFggXGxlcSBiKSA9IEYoYikgLSBGKGEpJCA8L2Rpdj48aDIgdGl0bGU9IkV4YW1wbGUgUHJvYmxlbSI+RXhhbXBsZSBQcm9ibGVtOiBDb250aW51b3VzIERpc3RyaWJ1dGlvbjwvaDI+PGRpdiBjbGFzcz0iZXhhbXBsZS1ib3giIGRhdGEtdG9vbHRpcD0iU3RlcC1ieS1zdGVwIHNvbHV0aW9uIGZvciBub3JtYWwgZGlzdHJpYnV0aW9uIHByb2JsZW0iPiA8c3Ryb25nPlByb2JsZW06PC9zdHJvbmc+IFRoZSB0aW1lIHJlcXVpcmVkIHRvIGNvbXBsZXRlIGEgc3RhbmRhcmRpemVkIHRlc3QgZm9sbG93cyBhIG5vcm1hbCBkaXN0cmlidXRpb24gd2l0aCBtZWFuIDEyMCBtaW51dGVzIGFuZCBzdGFuZGFyZCBkZXZpYXRpb24gMTUgbWludXRlcy4gV2hhdCBpcyB0aGUgcHJvYmFiaWxpdHkgdGhhdCBhIHJhbmRvbWx5IHNlbGVjdGVkIHN0dWRlbnQgd2lsbCBjb21wbGV0ZSB0aGUgdGVzdCBpbiBsZXNzIHRoYW4gMTAwIG1pbnV0ZXM/PGJyPjxicj4NCjxzdHJvbmc+U29sdXRpb24gU3RlcCBieSBTdGVwOjwvc3Ryb25nPg0KDQo8ZGl2IGNsYXNzPSJzdGVwLWJveCIgZGF0YS10b29sdGlwPSJTdGVwIDE6IElkZW50aWZ5IHBhcmFtZXRlcnMiPiA8c3Ryb25nPlN0ZXAgMTo8L3N0cm9uZz4gSWRlbnRpZnkgdGhlIHBhcmFtZXRlcnM8YnI+ICRcbXUgPSAxMjAkIG1pbnV0ZXMsICRcc2lnbWEgPSAxNSQgbWludXRlcywgJHggPSAxMDAkIG1pbnV0ZXMgPC9kaXY+IDxkaXYgY2xhc3M9InN0ZXAtYm94IiBkYXRhLXRvb2x0aXA9IlN0ZXAgMjogQ2FsY3VsYXRlIHotc2NvcmUiPiA8c3Ryb25nPlN0ZXAgMjo8L3N0cm9uZz4gQ2FsY3VsYXRlIHRoZSB6LXNjb3JlPGJyPiAkeiA9IFxmcmFje3ggLSBcbXV9e1xzaWdtYX0gPSBcZnJhY3sxMDAgLSAxMjB9ezE1fSA9IFxmcmFjey0yMH17MTV9ID0gLTEuMzMkIDwvZGl2PiA8ZGl2IGNsYXNzPSJzdGVwLWJveCIgZGF0YS10b29sdGlwPSJTdGVwIDM6IEZpbmQgcHJvYmFiaWxpdHkgdXNpbmcgc3RhbmRhcmQgbm9ybWFsIj4gPHN0cm9uZz5TdGVwIDM6PC9zdHJvbmc+IEZpbmQgcHJvYmFiaWxpdHkgdXNpbmcgc3RhbmRhcmQgbm9ybWFsIGRpc3RyaWJ1dGlvbjxicj4gJFAoWCA8IDEwMCkgPSBQKFogPCAtMS4zMykkIDwvZGl2PiA8ZGl2IGNsYXNzPSJzdGVwLWJveCIgZGF0YS10b29sdGlwPSJTdGVwIDQ6IExvb2sgdXAgei10YWJsZSB2YWx1ZSI+IDxzdHJvbmc+U3RlcCA0Ojwvc3Ryb25nPiBMb29rIHVwIHRoZSB2YWx1ZSBpbiB6LXRhYmxlIG9yIHVzZSBzdGF0aXN0aWNhbCBzb2Z0d2FyZTxicj4gJFAoWiA8IC0xLjMzKSA9IDAuMDkxOCQgPC9kaXY+IDxkaXYgY2xhc3M9InN0ZXAtYm94IiBkYXRhLXRvb2x0aXA9IlN0ZXAgNTogSW50ZXJwcmV0IHRoZSByZXN1bHQiPiA8c3Ryb25nPlN0ZXAgNTo8L3N0cm9uZz4gSW50ZXJwcmV0IHRoZSByZXN1bHQ8YnI+IFRoZSBwcm9iYWJpbGl0eSB0aGF0IGEgc3R1ZGVudCBjb21wbGV0ZXMgdGhlIHRlc3QgaW4gbGVzcyB0aGFuIDEwMCBtaW51dGVzIGlzIDkuMTglLiA8L2Rpdj4gPC9kaXY+DQo8c3Ryb25nPlZpc3VhbCBSZXByZXNlbnRhdGlvbjo8L3N0cm9uZz4NCmBgYHtyfQ0KbGlicmFyeShnZ3Bsb3QyKQ0KDQp4IDwtIHNlcSg2MCwgMTgwLCBsZW5ndGgub3V0ID0gMTAwMCkNCnBkZiA8LSBkbm9ybSh4LCBtZWFuID0gMTIwLCBzZCA9IDE1KQ0KDQpkZiA8LSBkYXRhLmZyYW1lKHggPSB4LCBwZGYgPSBwZGYpDQoNCmdncGxvdChkZiwgYWVzKHggPSB4LCB5ID0gcGRmKSkgKw0KICBnZW9tX2xpbmUoY29sb3IgPSAiIzhENkU2MyIsIHNpemUgPSAxLjIpICsNCiAgZ2VvbV9hcmVhKGRhdGEgPSBzdWJzZXQoZGYsIHggPCAxMDApLCBhZXMoeCA9IHgsIHkgPSBwZGYpLCANCiAgICAgICAgICAgIGZpbGwgPSAiI0ExODg3RiIsIGFscGhhID0gMC41KSArDQogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDEwMCwgY29sb3IgPSAiIzVENDAzNyIsIGxpbmV0eXBlID0gImRhc2hlZCIsIHNpemUgPSAwLjgpICsNCiAgbGFicyh0aXRsZSA9ICJOb3JtYWwgRGlzdHJpYnV0aW9uOiBUZXN0IENvbXBsZXRpb24gVGltZSIsDQogICAgICAgc3VidGl0bGUgPSAizrwgPSAxMjAgbWludXRlcywgz4MgPSAxNSBtaW51dGVzIiwNCiAgICAgICB4ID0gIlRpbWUgKG1pbnV0ZXMpIiwNCiAgICAgICB5ID0gIlByb2JhYmlsaXR5IERlbnNpdHkiKSArDQogIHRoZW1lX21pbmltYWwoKSArDQogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUsIGZhY2UgPSAiYm9sZCIsIHNpemUgPSAxNCksDQogICAgICAgIHBsb3Quc3VidGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUsIHNpemUgPSAxMSksDQogICAgICAgIHBsb3QuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gIiNGNUYxRTgiKSwNCiAgICAgICAgcGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gIiNGNUYxRTgiKSwNCiAgICAgICAgYXhpcy50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTApKQ0KYGBgDQoNCjxoMiB0aXRsZT0iQm9vayBSZWZlcmVuY2UiPkJvb2sgUmVmZXJlbmNlPC9oMj48ZGl2IGNsYXNzPSJyZWZlcmVuY2UtYm94IiBkYXRhLXRvb2x0aXA9IlJlZmVyZW5jZSB0ZXh0Ym9vayBmb3IgY29udGludW91cyBwcm9iYWJpbGl0eSBkaXN0cmlidXRpb25zIj4gPHN0cm9uZz5XYWxwb2xlLCBSLkUuLCBNeWVycywgUi5ILiwgTXllcnMsIFMuTC4sICYgWWUsIEsuPC9zdHJvbmc+ICgyMDEyKS4gPGVtPlByb2JhYmlsaXR5ICYgU3RhdGlzdGljcyBmb3IgRW5naW5lZXJzICYgU2NpZW50aXN0czwvZW0+LiBQZWFyc29uIEVkdWNhdGlvbi48YnI+IDxzdHJvbmc+Q2hhcHRlciA0Ojwvc3Ryb25nPiBDb250aW51b3VzIFJhbmRvbSBWYXJpYWJsZXMgYW5kIFByb2JhYmlsaXR5IERpc3RyaWJ1dGlvbnM8YnI+IDxzdHJvbmc+UGFnZXM6PC9zdHJvbmc+IDExMC0xNTY8YnI+IDxzdHJvbmc+UmVsZXZhbmNlOjwvc3Ryb25nPiBUaGlzIHRleHRib29rIHByb3ZpZGVzIGNvbXByZWhlbnNpdmUgY292ZXJhZ2Ugb2YgY29udGludW91cyBwcm9iYWJpbGl0eSBkaXN0cmlidXRpb25zIHdpdGggZW5naW5lZXJpbmcgYXBwbGljYXRpb25zLg0KDQoNCjxoMSB0aXRsZT0iU2FtcGxpbmcgRGlzdHJpYnV0aW9uIG9mIFNhbXBsZSBQcm9wb3J0aW9uIj5TYW1wbGluZyBEaXN0cmlidXRpb24gb2YgdGhlIFNhbXBsZSBQcm9wb3J0aW9uPC9oMT48ZGl2IGNsYXNzPSJ2aWRlby1ib3giIGRhdGEtdG9vbHRpcD0iRWR1Y2F0aW9uYWwgdmlkZW8gYWJvdXQgcHJvcG9ydGlvbiBzYW1wbGluZyI+IDxzdHJvbmc+VmlkZW86PC9zdHJvbmc+IDxhIGhyZWY9Imh0dHBzOi8veW91dHUuYmUvcTJlNG1LMEZUYnc/c2k9d2plSnpYcmNUdFZ5U0FGVSIgdGFyZ2V0PSJfYmxhbmsiPiBTYW1wbGluZyBEaXN0cmlidXRpb24gb2YgdGhlIFNhbXBsZSBQcm9wb3J0aW9uIDwvYT4gPC9kaXY+PGRpdiBjbGFzcz0iY29uY2VwdC1pbnRybyIgZGF0YS10b29sdGlwPSJJbnRyb2R1Y3Rpb24gdG8gc2FtcGxlIHByb3BvcnRpb24gY29uY2VwdHMiPiBJbiBtYW55IHByYWN0aWNhbCBhcHBsaWNhdGlvbnMsIHdlIGFyZSBjb25jZXJuZWQgd2l0aCBwcm9wb3J0aW9ucyByYXRoZXIgdGhhbiBtZWFucy4gV2hldGhlciBzdHVkeWluZyB2b3RpbmcgcGF0dGVybnMsIHF1YWxpdHkgY29udHJvbCBpbiBtYW51ZmFjdHVyaW5nLCBtZWRpY2FsIHRyZWF0bWVudCBzdWNjZXNzIHJhdGVzLCBvciBjdXN0b21lciBzYXRpc2ZhY3Rpb24gbGV2ZWxzLCBwcm9wb3J0aW9ucyBwcm92aWRlIHZhbHVhYmxlIGluc2lnaHRzIGFib3V0IGNhdGVnb3JpY2FsIGRhdGEuIDwvZGl2PjxoMiB0aXRsZT0iU2FtcGxpbmcgRGlzdHJpYnV0aW9uIG9mIFNhbXBsZSBQcm9wb3J0aW9uIj5TYW1wbGluZyBEaXN0cmlidXRpb24gb2YgJFxoYXR7cH0kPC9oMj48ZGl2IGNsYXNzPSJmb3JtdWxhLWJveCIgZGF0YS10b29sdGlwPSJNYXRoZW1hdGljYWwgZm9ybXVsYXMgZm9yIHNhbXBsZSBwcm9wb3J0aW9uIGRpc3RyaWJ1dGlvbiI+IDxzdHJvbmc+U2FtcGxpbmcgRGlzdHJpYnV0aW9uIG9mIFNhbXBsZSBQcm9wb3J0aW9uICgkXGhhdHtwfSQpOjwvc3Ryb25nPjxicj4gJCQgXGhhdHtwfSA9IFxmcmFje1h9e259ICQkPGJyPiB3aGVyZTogJFgkID0gbnVtYmVyIG9mIHN1Y2Nlc3NlcyBpbiB0aGUgc2FtcGxlPGJyPiAkbiQgPSBzYW1wbGUgc2l6ZTxicj48YnI+DQokRShcaGF0e3B9KSA9IHAkDQoNCioqRXhwbGFuYXRpb246KiogIA0KVGhpcyBmb3JtdWxhIHN0YXRlcyB0aGF0IHRoZSBleHBlY3RlZCB2YWx1ZSBvZiB0aGUgc2FtcGxlIHByb3BvcnRpb24gZXN0aW1hdG9yICRcaGF0e3B9JCBpcyBlcXVhbCB0byB0aGUgdHJ1ZSBwb3B1bGF0aW9uIHByb3BvcnRpb24gJHAkLiBUaGlzIG1lYW5zIHRoYXQgJFxoYXR7cH0kIGlzIGFuICoqdW5iaWFzZWQgZXN0aW1hdG9yKiogb2YgdGhlIHBvcHVsYXRpb24gcHJvcG9ydGlvbi4NCg0KDQokXGhhdHtwfSQgPSBzYW1wbGUgcHJvcG9ydGlvbg0KDQokcCQgPSBwb3B1bGF0aW9uIHByb3BvcnRpb24NCg0KJEUoXGhhdHtwfSkkID0gZXhwZWN0ZWQgdmFsdWUgKG1lYW4pIG9mIHRoZSBzYW1wbGUgcHJvcG9ydGlvbiwgd2hpY2ggZXF1YWxzIHRoZSBwb3B1bGF0aW9uIHByb3BvcnRpb24NCg0KDQo8c3Ryb25nPlZhcmlhbmNlIG9mIFNhbXBsaW5nIERpc3RyaWJ1dGlvbjo8L3N0cm9uZz4NCiRcbWF0aHJte1Zhcn0oXGhhdHtwfSkgPSBcZnJhY3twKDEtcCl9e259JA0KDQoNCjxzdHJvbmc+U3RhbmRhcmQgRXJyb3I6PC9zdHJvbmc+DQokJA0KU0UoXGhhdHtwfSkgPSBcc3FydHtcZnJhY3twKDEtcCl9e259fQ0KJCQNCg0KIA0KDQo8c3Ryb25nPk5vcm1hbCBBcHByb3hpbWF0aW9uIENvbmRpdGlvbnM6PC9zdHJvbmc+DQpGb3IgdGhlIHNhbXBsaW5nIGRpc3RyaWJ1dGlvbiB0byBiZSBhcHByb3hpbWF0ZWx5IG5vcm1hbDoNCg0KJG5wIFxnZSAxMCQNCg0KJG4oMS1wKSBcZ2UgMTAkDQoNCg0KPHN0cm9uZz5Ob3JtYWwgQXBwcm94aW1hdGlvbiBGb3JtdWxhOjwvc3Ryb25nPg0KJCQNClxoYXR7cH0gXHNpbSBOXGxlZnQocCxcOyBcZnJhY3twKDEtcCl9e259XHJpZ2h0KQ0KJCQNCg0KDQo8c3Ryb25nPlotc2NvcmUgZm9yIFByb3BvcnRpb246PC9zdHJvbmc+DQokJA0KeiA9IFxmcmFje1xoYXR7cH0gLSBwfXtcc3FydHtcZnJhY3twKDEtcCl9e259fX0NCiQkDQoNCiANCg0KPC9kaXY+PGgyIHRpdGxlPSJVbmRlcnN0YW5kaW5nIHRoZSBDb25jZXB0cyI+VW5kZXJzdGFuZGluZyBTYW1wbGUgUHJvcG9ydGlvbiBEaXN0cmlidXRpb248L2gyPjxkaXYgY2xhc3M9ImNvbmNlcHQtaW50cm8iIGRhdGEtdG9vbHRpcD0iS2V5IGNvbmNlcHRzIGFuZCBpbXBvcnRhbmNlIG9mIHByb3BvcnRpb24gZGlzdHJpYnV0aW9uIj4gPHN0cm9uZz5XaHkgU2FtcGxlIFByb3BvcnRpb24gRGlzdHJpYnV0aW9uIE1hdHRlcnM6PC9zdHJvbmc+PGJyPjxicj4gPGRpdiBjbGFzcz0ic3RlcC1ib3giIGRhdGEtdG9vbHRpcD0iUmVsYXRpb25zaGlwIGJldHdlZW4gYmlub21pYWwgYW5kIG5vcm1hbCBkaXN0cmlidXRpb25zIj4gPHN0cm9uZz4xLiBGcm9tIEJpbm9taWFsIHRvIE5vcm1hbDo8L3N0cm9uZz48YnI+IFRoZSBzYW1wbGUgcHJvcG9ydGlvbiAkXGhhdHtwfSQgaXMgZXNzZW50aWFsbHkgYSBiaW5vbWlhbCByYW5kb20gdmFyaWFibGUgKFgpIGRpdmlkZWQgYnkgbi4gQXMgbiBpbmNyZWFzZXMsIHRoZSBiaW5vbWlhbCBkaXN0cmlidXRpb24gYXBwcm9hY2hlcyBhIG5vcm1hbCBkaXN0cmlidXRpb24uIDwvZGl2PiA8ZGl2IGNsYXNzPSJzdGVwLWJveCIgZGF0YS10b29sdGlwPSJDZW50cmFsIExpbWl0IFRoZW9yZW0gYXBwbGljYXRpb24gZm9yIHByb3BvcnRpb25zIj4gPHN0cm9uZz4yLiBDZW50cmFsIExpbWl0IFRoZW9yZW0gZm9yIFByb3BvcnRpb25zOjwvc3Ryb25nPjxicj4gRm9yIGxhcmdlIHNhbXBsZSBzaXplcywgdGhlIHNhbXBsaW5nIGRpc3RyaWJ1dGlvbiBvZiAkXGhhdHtwfSQgaXMgYXBwcm94aW1hdGVseSBub3JtYWwsIHJlZ2FyZGxlc3Mgb2YgdGhlIHNoYXBlIG9mIHRoZSBwb3B1bGF0aW9uIGRpc3RyaWJ1dGlvbiAoYXMgbG9uZyBhcyBucCDiiaUgMTAgYW5kIG4oMS1wKSDiiaUgMTApLiA8L2Rpdj4gPGRpdiBjbGFzcz0ic3RlcC1ib3giIGRhdGEtdG9vbHRpcD0iUmVhbC13b3JsZCBhcHBsaWNhdGlvbnMgb2YgcHJvcG9ydGlvbiBhbmFseXNpcyI+IDxzdHJvbmc+My4gUHJhY3RpY2FsIEFwcGxpY2F0aW9uczo8L3N0cm9uZz48YnI+IOKAoiBFbGVjdGlvbiBwb2xscyBhbmQgcG9saXRpY2FsIHN1cnZleXM8YnI+IOKAoiBRdWFsaXR5IGNvbnRyb2wgYW5kIGRlZmVjdCByYXRlczxicj4g4oCiIE1lZGljYWwgdHJpYWwgc3VjY2VzcyByYXRlczxicj4g4oCiIE1hcmtldCByZXNlYXJjaCBhbmQgY3VzdG9tZXIgc2F0aXNmYWN0aW9uPGJyPiDigKIgQS9CIHRlc3RpbmcgaW4gd2ViIGRldmVsb3BtZW50IDwvZGl2PiA8L2Rpdj48aDIgdGl0bGU9IlZpc3VhbGl6aW5nIFNhbXBsaW5nIERpc3RyaWJ1dGlvbiI+VmlzdWFsaXppbmcgU2FtcGxpbmcgRGlzdHJpYnV0aW9uIG9mIFByb3BvcnRpb25zPC9oMj48ZGl2IGNsYXNzPSJzYW1wbGluZy1wcm9wb3J0aW9uLXZpeiIgZGF0YS10b29sdGlwPSJWaXN1YWxpemF0aW9uIG9mIHByb3BvcnRpb24gZGlzdHJpYnV0aW9ucyB3aXRoIGRpZmZlcmVudCBzYW1wbGUgc2l6ZXMiPiA8aDMgY2xhc3M9InNhbXBsaW5nLXByb3BvcnRpb24tdGl0bGUiPkVmZmVjdCBvZiBTYW1wbGUgU2l6ZSBvbiBQcm9wb3J0aW9uIERpc3RyaWJ1dGlvbjwvaDM+DQoNCmBgYHtyfQ0KbGlicmFyeShnZ3Bsb3QyKQ0KbGlicmFyeShncmlkRXh0cmEpDQoNCiMgUGFyYW1ldGVycyBmb3IgdmlzdWFsaXphdGlvbg0KcCA8LSAwLjA1ICAjIFBvcHVsYXRpb24gcHJvcG9ydGlvbg0Kc2FtcGxlX3NpemVzIDwtIGMoNTAsIDEwMCwgMjAwLCA1MDApDQp4X2xpbWl0cyA8LSBjKDAsIDAuMTUpDQoNCiMgQ3JlYXRlIHBsb3RzIGZvciBkaWZmZXJlbnQgc2FtcGxlIHNpemVzDQpwbG90cyA8LSBsaXN0KCkNCg0KZm9yIChpIGluIHNlcV9hbG9uZyhzYW1wbGVfc2l6ZXMpKSB7DQogIG4gPC0gc2FtcGxlX3NpemVzW2ldDQogIA0KICAjIENhbGN1bGF0ZSBwYXJhbWV0ZXJzIGZvciBub3JtYWwgYXBwcm94aW1hdGlvbg0KICBtdSA8LSBwDQogIHNlIDwtIHNxcnQocCAqICgxIC0gcCkgLyBuKQ0KICANCiAgIyBDcmVhdGUgbm9ybWFsIGRpc3RyaWJ1dGlvbiBjdXJ2ZQ0KICB4X3ZhbHMgPC0gc2VxKHhfbGltaXRzWzFdLCB4X2xpbWl0c1syXSwgbGVuZ3RoLm91dCA9IDEwMDApDQogIHlfdmFscyA8LSBkbm9ybSh4X3ZhbHMsIG1lYW4gPSBtdSwgc2QgPSBzZSkNCiAgDQogIHBsb3RfZGF0YSA8LSBkYXRhLmZyYW1lKHggPSB4X3ZhbHMsIHkgPSB5X3ZhbHMpDQogIA0KICAjIENyZWF0ZSBwbG90DQogIHBfcGxvdCA8LSBnZ3Bsb3QocGxvdF9kYXRhLCBhZXMoeCA9IHgsIHkgPSB5KSkgKw0KICAgIGdlb21fbGluZShjb2xvciA9ICIjOEQ2RTYzIiwgc2l6ZSA9IDEuMikgKw0KICAgIGdlb21fYXJlYShmaWxsID0gIiNBMTg4N0YiLCBhbHBoYSA9IDAuMykgKw0KICAgIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IG11LCBjb2xvciA9ICIjNUQ0MDM3IiwgbGluZXR5cGUgPSAiZGFzaGVkIiwgc2l6ZSA9IDAuOCkgKw0KICAgIGxhYnModGl0bGUgPSBwYXN0ZTAoIm4gPSAiLCBuKSwNCiAgICAgICAgIHggPSAiU2FtcGxlIFByb3BvcnRpb24gKHDMgikiLA0KICAgICAgICAgeSA9ICJEZW5zaXR5IikgKw0KICAgIHhsaW0oeF9saW1pdHMpICsNCiAgICB0aGVtZV9taW5pbWFsKCkgKw0KICAgIHRoZW1lKA0KICAgICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSwgZmFjZSA9ICJib2xkIiwgc2l6ZSA9IDEyKSwNCiAgICAgIHBsb3QuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gIiNGNUYxRTgiKSwNCiAgICAgIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICIjRjVGMUU4IiksDQogICAgICBheGlzLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMCksDQogICAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDkpDQogICAgKQ0KICANCiAgIyBBZGQgc3RhbmRhcmQgZXJyb3IgYW5ub3RhdGlvbg0KICBwX3Bsb3QgPC0gcF9wbG90ICsgDQogICAgYW5ub3RhdGUoInRleHQiLCB4ID0gbXUgKyBzZSwgeSA9IG1heCh5X3ZhbHMpICogMC45LCANCiAgICAgICAgICAgICBsYWJlbCA9IHBhc3RlMCgiU0UgPSAiLCByb3VuZChzZSwgNCkpLCANCiAgICAgICAgICAgICBjb2xvciA9ICIjNzk1NTQ4Iiwgc2l6ZSA9IDMuNSwgZm9udGZhY2UgPSAiYm9sZCIpDQogIA0KICBwbG90c1tbaV1dIDwtIHBfcGxvdA0KfQ0KDQojIEFycmFuZ2UgYW5kIGRpc3BsYXkgdGhlIHBsb3RzDQpncmlkLmFycmFuZ2UoDQogIGdyb2JzID0gcGxvdHMsIA0KICBuY29sID0gMiwNCiAgdG9wID0gZ3JpZDo6dGV4dEdyb2IoDQogICAgIlNhbXBsaW5nIERpc3RyaWJ1dGlvbiBvZiBwzIIgZm9yIERpZmZlcmVudCBTYW1wbGUgU2l6ZXMgKHAgPSAwLjA1KSIsDQogICAgZ3AgPSBncmlkOjpncGFyKGZvbnRzaXplID0gMTQsIGZvbnRmYWNlID0gImJvbGQiLCBjb2wgPSAiIzVENDAzNyIpDQogICksDQogIGJvdHRvbSA9IGdyaWQ6OnRleHRHcm9iKA0KICAgICJBcyBzYW1wbGUgc2l6ZSBpbmNyZWFzZXMsIHN0YW5kYXJkIGVycm9yIGRlY3JlYXNlcyBhbmQgZGlzdHJpYnV0aW9uIGJlY29tZXMgbW9yZSBjb25jZW50cmF0ZWQgYXJvdW5kIHAiLA0KICAgIGdwID0gZ3JpZDo6Z3Bhcihmb250c2l6ZSA9IDExLCBjb2wgPSAiIzc5NTU0OCIpDQogICkNCikNCmBgYA0KDQo8aDIgdGl0bGU9IkNvbXBhcmlzb24gd2l0aCBTYW1wbGUgTWVhbiI+Q29tcGFyaXNvbjogU2FtcGxlIE1lYW4gdnMgU2FtcGxlIFByb3BvcnRpb248L2gyPjx0YWJsZSBjbGFzcz0iY29tcGFyaXNvbi10YWJsZSI+IDx0aGVhZD4gPHRyPiA8dGggZGF0YS10b29sdGlwPSJDb21wYXJpc29uIGFzcGVjdHMiPkFzcGVjdDwvdGg+IDx0aCBkYXRhLXRvb2x0aXA9IlNhbXBsZSBtZWFuIGNoYXJhY3RlcmlzdGljcyI+U2FtcGxlIE1lYW4gKCRcYmFye1h9JCk8L3RoPiA8dGggZGF0YS10b29sdGlwPSJTYW1wbGUgcHJvcG9ydGlvbiBjaGFyYWN0ZXJpc3RpY3MiPlNhbXBsZSBQcm9wb3J0aW9uICgkXGhhdHtwfSQpPC90aD4gPC90cj4gPC90aGVhZD4gPHRib2R5PiA8dHI+IDx0ZD48c3Ryb25nPkRhdGEgVHlwZTwvc3Ryb25nPjwvdGQ+IDx0ZD5Db250aW51b3VzIG51bWVyaWNhbCBkYXRhPC90ZD4gPHRkPkNhdGVnb3JpY2FsL2JpbmFyeSBkYXRhPC90ZD4gPC90cj4gPHRyPiA8dGQ+PHN0cm9uZz5Gb3JtdWxhPC9zdHJvbmc+PC90ZD4gPHRkPiRcYmFye1h9ID0gXGZyYWN7MX17bn1cc3VtX3tpPTF9Xm4gWF9pJDwvdGQ+IDx0ZD4kXGhhdHtwfSA9IFxmcmFje1h9e259JDwvdGQ+IDwvdHI+IDx0cj4gPHRkPjxzdHJvbmc+RXhwZWN0ZWQgVmFsdWU8L3N0cm9uZz48L3RkPiA8dGQ+JEUoXGJhcntYfSkgPSBcbXUkPC90ZD4gPHRkPiRFKFxoYXR7cH0pID0gcCQ8L3RkPiA8L3RyPiA8dHI+IDx0ZD48c3Ryb25nPlN0YW5kYXJkIEVycm9yPC9zdHJvbmc+PC90ZD4gPHRkPiRTRShcYmFye1h9KSA9IFxmcmFje1xzaWdtYX17XHNxcnR7bn19JDwvdGQ+IDx0ZD4kU0UoXGhhdHtwfSkgPSBcc3FydHtcZnJhY3twKDEtcCl9e259fSQ8L3RkPiA8L3RyPiA8dHI+IDx0ZD48c3Ryb25nPkRpc3RyaWJ1dGlvbjwvc3Ryb25nPjwvdGQ+IDx0ZD4kTihcbXUsIFxmcmFje1xzaWdtYV4yfXtufSkkIGZvciBsYXJnZSBuPC90ZD4gPHRkPiROKHAsIFxmcmFje3AoMS1wKX17bn0pJCB3aGVuIG5w4omlMTAsIG4oMS1wKeKJpTEwPC90ZD4gPC90cj4gPHRyPiA8dGQ+PHN0cm9uZz5BcHBsaWNhdGlvbnM8L3N0cm9uZz48L3RkPiA8dGQ+QXZlcmFnZSBoZWlnaHQsIHRlc3Qgc2NvcmVzLCBpbmNvbWU8L3RkPiA8dGQ+Vm90aW5nIHBlcmNlbnRhZ2VzLCBkZWZlY3QgcmF0ZXMsIHN1Y2Nlc3MgcmF0ZXM8L3RkPiA8L3RyPiA8L3Rib2R5PiA8L3RhYmxlPjxoMiB0aXRsZT0iSW1wb3J0YW50IFByb3BlcnRpZXMiPkltcG9ydGFudCBQcm9wZXJ0aWVzIGFuZCBOb3RlczwvaDI+PGRpdiBjbGFzcz0iY29uY2VwdC1pbnRybyIgZGF0YS10b29sdGlwPSJLZXkgc3RhdGlzdGljYWwgcHJvcGVydGllcyBvZiBwcm9wb3J0aW9uIGRpc3RyaWJ1dGlvbnMiPiA8c3Ryb25nPktleSBQcm9wZXJ0aWVzIG9mIFNhbXBsZSBQcm9wb3J0aW9uIERpc3RyaWJ1dGlvbjo8L3N0cm9uZz48YnI+PGJyPiA8ZGl2IGNsYXNzPSJzdGVwLWJveCIgZGF0YS10b29sdGlwPSJTdGF0aXN0aWNhbCBwcm9wZXJ0aWVzIG9mIGVzdGltYXRvcnMiPiA8c3Ryb25nPjEuIEJpYXMgYW5kIENvbnNpc3RlbmN5Ojwvc3Ryb25nPjxicj4gJFxoYXR7cH0kIGlzIGFuIHVuYmlhc2VkIGVzdGltYXRvciBvZiBwOiAkRShcaGF0e3B9KSA9IHAkPGJyPiBBcyBuIGluY3JlYXNlcywgJFxoYXR7cH0kIGNvbnZlcmdlcyB0byBwIChjb25zaXN0ZW50IGVzdGltYXRvcikgPC9kaXY+IDxkaXYgY2xhc3M9InN0ZXAtYm94IiBkYXRhLXRvb2x0aXA9IlZhcmlhbmNlIHByb3BlcnRpZXMgb2YgcHJvcG9ydGlvbnMiPiA8c3Ryb25nPjIuIE1heGltdW0gVmFyaWFuY2U6PC9zdHJvbmc+PGJyPiBUaGUgdmFyaWFuY2UgJHAoMS1wKSQgaXMgbWF4aW1pemVkIHdoZW4gcCA9IDAuNTxicj4gVGhpcyBtZWFucyBwcm9wb3J0aW9ucyBuZWFyIDAuNSBoYXZlIHRoZSBsYXJnZXN0IHN0YW5kYXJkIGVycm9ycyA8L2Rpdj4gPGRpdiBjbGFzcz0ic3RlcC1ib3giIGRhdGEtdG9vbHRpcD0iQ29ycmVjdGlvbiBmYWN0b3IgZm9yIGZpbml0ZSBwb3B1bGF0aW9ucyI+IDxzdHJvbmc+My4gRmluaXRlIFBvcHVsYXRpb24gQ29ycmVjdGlvbjo8L3N0cm9uZz48YnI+IFdoZW4gc2FtcGxpbmcgd2l0aG91dCByZXBsYWNlbWVudCBmcm9tIGEgZmluaXRlIHBvcHVsYXRpb24gb2Ygc2l6ZSBOOjxicj4gJCQgU0UoXGhhdHtwfSkgPSBcc3FydHtcZnJhY3twKDEtcCl9e259IFx0aW1lcyBcZnJhY3tOLW59e04tMX19ICQkIDwvZGl2PiA8L2Rpdj48aDIgdGl0bGU9IkJvb2sgUmVmZXJlbmNlcyI+UmVmZXJlbmNlIEJvb2tzPC9oMj48ZGl2IGNsYXNzPSJyZWZlcmVuY2UtYm94IiBkYXRhLXRvb2x0aXA9IlJlY29tbWVuZGVkIHRleHRib29rcyBmb3IgZnVydGhlciBzdHVkeSI+IDxzdHJvbmc+MS4gV2FscG9sZSwgUi5FLiwgTXllcnMsIFIuSC4sIE15ZXJzLCBTLkwuLCAmIFllLCBLLjwvc3Ryb25nPiAoMjAxMikuIDxlbT5Qcm9iYWJpbGl0eSAmIFN0YXRpc3RpY3MgZm9yIEVuZ2luZWVycyAmIFNjaWVudGlzdHM8L2VtPi4gUGVhcnNvbiBFZHVjYXRpb24uPGJyPiA8c3Ryb25nPkNoYXB0ZXI6PC9zdHJvbmc+IDcgLSBTYW1wbGluZyBEaXN0cmlidXRpb25zPGJyPiA8c3Ryb25nPlBhZ2VzOjwvc3Ryb25nPiAyNDUtMjgwPGJyPiA8c3Ryb25nPlJlbGV2YW5jZTo8L3N0cm9uZz4gQ29tcHJlaGVuc2l2ZSBjb3ZlcmFnZSBvZiBzYW1wbGluZyBkaXN0cmlidXRpb25zIGluY2x1ZGluZyBwcm9wb3J0aW9uIGRpc3RyaWJ1dGlvbnMuPGJyPjxicj4NCjxzdHJvbmc+Mi4gRGV2b3JlLCBKLkwuPC9zdHJvbmc+ICgyMDE1KS4gPGVtPlByb2JhYmlsaXR5IGFuZCBTdGF0aXN0aWNzIGZvciBFbmdpbmVlcmluZyBhbmQgdGhlIFNjaWVuY2VzPC9lbT4uIENlbmdhZ2UgTGVhcm5pbmcuDQoNCjxzdHJvbmc+Q2hhcHRlcjo8L3N0cm9uZz4gNiAtIFN0YXRpc3RpY3MgYW5kIFNhbXBsaW5nIERpc3RyaWJ1dGlvbnMNCg0KPHN0cm9uZz5QYWdlczo8L3N0cm9uZz4gMjcwLTMxMA0KDQo8c3Ryb25nPlJlbGV2YW5jZTo8L3N0cm9uZz4gUHJhY3RpY2FsIGFwcGxpY2F0aW9ucyBvZiBzYW1wbGluZyBkaXN0cmlidXRpb25zIGluIGVuZ2luZWVyaW5nIGNvbnRleHRzLg0KDQoNCjxzdHJvbmc+My4gTW9udGdvbWVyeSwgRC5DLiwgJiBSdW5nZXIsIEcuQy48L3N0cm9uZz4gKDIwMTgpLiA8ZW0+QXBwbGllZCBTdGF0aXN0aWNzIGFuZCBQcm9iYWJpbGl0eSBmb3IgRW5naW5lZXJzPC9lbT4uIFdpbGV5Lg0KDQo8c3Ryb25nPkNoYXB0ZXI6PC9zdHJvbmc+IDcgLSBQb2ludCBFc3RpbWF0aW9uIG9mIFBhcmFtZXRlcnMgYW5kIFNhbXBsaW5nIERpc3RyaWJ1dGlvbnMNCg0KPHN0cm9uZz5QYWdlczo8L3N0cm9uZz4gMjU1LTI5MA0KDQo8c3Ryb25nPlJlbGV2YW5jZTo8L3N0cm9uZz4gRW5naW5lZXJpbmctZm9jdXNlZCBhcHByb2FjaCB0byBwcm9wb3J0aW9uIGVzdGltYXRpb24gYW5kIHNhbXBsaW5nIHRoZW9yeS4NCg0KDQo8ZGl2IGNsYXNzPSJoZWFkZXItc2VjdGlvbiI+IDxoMT5DZW50cmFsIExpbWl0IFRoZW9yZW0gLSBDb21wbGV0ZSBTdW1tYXJ5PC9oMT4gPHA+PHN0cm9uZz5CYXNlZCBvbiBWaWRlbzogVGhlIENlbnRyYWwgTGltaXQgVGhlb3JlbSBFeHBsYWluZWQ8L3N0cm9uZz48L3A+IDwvZGl2PjwhLS0gVklERU8gTElOSyBESVRBUlVIIERJIEJBV0FIIEpVRFVMIEFXQUwgUEFEQSBCQUIgLS0+PGRpdiBjbGFzcz0idmlkZW8tYm94IiBkYXRhLXRvb2x0aXA9IldhdGNoIHRoZSBjb21wbGV0ZSBDZW50cmFsIExpbWl0IFRoZW9yZW0gZXhwbGFuYXRpb24iPiA8c3Ryb25nPlZpZGVvOjwvc3Ryb25nPiA8YSBocmVmPSJodHRwczovL3lvdXR1LmJlL2l2ZDh3RUhuTUNnP3NpPVMyaGxNZHUzN2NZVmwwa2EiIHRhcmdldD0iX2JsYW5rIj4gVGhlIENlbnRyYWwgTGltaXQgVGhlb3JlbSAtIFVuZGVyc3RhbmRpbmcgdGhlIE1vc3QgSW1wb3J0YW50IENvbmNlcHQgaW4gU3RhdGlzdGljcyA8L2E+IDwvZGl2PjxkaXYgY2xhc3M9ImNsdC1zdW1tYXJ5Ij4gPGgyIGNsYXNzPSJjbHQtdGl0bGUiIHRpdGxlPSJDZW50cmFsIExpbWl0IFRoZW9yZW0gQ29tcGxldGUgR3VpZGUiPkNlbnRyYWwgTGltaXQgVGhlb3JlbTogRm91bmRhdGlvbiBvZiBTdGF0aXN0aWNhbCBJbmZlcmVuY2U8L2gyPjxkaXYgY2xhc3M9ImNvbmNlcHQtaW50cm8iIGRhdGEtdG9vbHRpcD0iSW50cm9kdWN0aW9uIHRvIENlbnRyYWwgTGltaXQgVGhlb3JlbSBjb25jZXB0cyI+IDxzdHJvbmc+V2hhdCBpcyB0aGUgQ2VudHJhbCBMaW1pdCBUaGVvcmVtIChDTFQpPzwvc3Ryb25nPjxicj4gVGhlIENlbnRyYWwgTGltaXQgVGhlb3JlbSBpcyBvbmUgb2YgdGhlIG1vc3QgaW1wb3J0YW50IGNvbmNlcHRzIGluIHN0YXRpc3RpY3MuIEl0IHN0YXRlcyB0aGF0IHRoZSBzYW1wbGluZyBkaXN0cmlidXRpb24gb2YgdGhlIHNhbXBsZSBtZWFuIGFwcHJvYWNoZXMgYSBub3JtYWwgZGlzdHJpYnV0aW9uIGFzIHRoZSBzYW1wbGUgc2l6ZSBpbmNyZWFzZXMsIHJlZ2FyZGxlc3Mgb2YgdGhlIHNoYXBlIG9mIHRoZSBwb3B1bGF0aW9uIGRpc3RyaWJ1dGlvbi4gVGhpcyB0aGVvcmVtIGZvcm1zIHRoZSBmb3VuZGF0aW9uIGZvciBzdGF0aXN0aWNhbCBpbmZlcmVuY2UsIGFsbG93aW5nIHVzIHRvIG1ha2UgcHJvYmFiaWxpc3RpYyBzdGF0ZW1lbnRzIGFib3V0IHBvcHVsYXRpb24gcGFyYW1ldGVycy4gPC9kaXY+PGRpdiBjbGFzcz0iY2x0LWdyaWQiPjxkaXYgY2xhc3M9ImNsdC1jYXJkIiBkYXRhLXRvb2x0aXA9IkNvcmUgY29uY2VwdHMgYW5kIG1hdGhlbWF0aWNhbCBmb3JtdWxhdGlvbiI+IDxoMz48aT7wn46vPC9pPiBDb3JlIFN0YXRlbWVudDwvaDM+IDxkaXYgY2xhc3M9ImNhcmQtY29udGVudCI+IDx1bCBjbGFzcz0iY2FyZC1wb2ludHMiPiA8bGk+PHN0cm9uZz5EZWZpbml0aW9uOjwvc3Ryb25nPiBTYW1wbGUgbWVhbnMgYXBwcm9hY2ggbm9ybWFsIGRpc3RyaWJ1dGlvbjwvbGk+IDxsaT48c3Ryb25nPlJlcXVpcmVtZW50czo8L3N0cm9uZz4gSW5kZXBlbmRlbnQsIGlkZW50aWNhbGx5IGRpc3RyaWJ1dGVkIHNhbXBsZXM8L2xpPiA8bGk+PHN0cm9uZz5TYW1wbGUgU2l6ZTo8L3N0cm9uZz4gbiDiiaUgMzAgZ2VuZXJhbGx5IHN1ZmZpY2llbnQ8L2xpPiA8bGk+PHN0cm9uZz5LZXkgSW5zaWdodDo8L3N0cm9uZz4gV29ya3MgZm9yIEFOWSBwb3B1bGF0aW9uIGRpc3RyaWJ1dGlvbjwvbGk+IDxsaT48c3Ryb25nPk1hdGhlbWF0aWNhbCBOb3RhdGlvbjo8L3N0cm9uZz4gJFxiYXJ7WH0gXHNpbSBOKFxtdSwgXGZyYWN7XHNpZ21hXjJ9e259KSQ8L2xpPiA8L3VsPiA8ZGl2IGNsYXNzPSJmb3JtdWxhLWJveCI+IDxzdHJvbmc+Q0xUIEZvcm11bGE6PC9zdHJvbmc+PGJyPiAkJCBcYmFye1h9IFx4cmlnaHRhcnJvd3tkfSBOXGxlZnQoXG11LCBcZnJhY3tcc2lnbWFeMn17bn1ccmlnaHQpICQkICQkIFx0ZXh0e0FzIH0gbiBcdG8gXGluZnR5LCBccXVhZCBcZnJhY3tcYmFye1h9IC0gXG11fXtcc2lnbWEvXHNxcnR7bn19IFx4cmlnaHRhcnJvd3tkfSBOKDAsMSkgJCQgPC9kaXY+IDwvZGl2PiA8L2Rpdj48ZGl2IGNsYXNzPSJjbHQtY2FyZCIgZGF0YS10b29sdGlwPSJTdGF0aXN0aWNhbCBwcm9wZXJ0aWVzIGFuZCByZWxhdGlvbnNoaXBzIj4gPGgzPjxpPvCfk4o8L2k+IEtleSBQcm9wZXJ0aWVzPC9oMz4gPGRpdiBjbGFzcz0iY2FyZC1jb250ZW50Ij4gPHVsIGNsYXNzPSJjYXJkLXBvaW50cyI+IDxsaT48c3Ryb25nPk1lYW4gUHJlc2VydmF0aW9uOjwvc3Ryb25nPiAkRShcYmFye1h9KSA9IFxtdSQ8L2xpPiA8bGk+PHN0cm9uZz5WYXJpYW5jZSBSZWR1Y3Rpb246PC9zdHJvbmc+ICRWYXIoXGJhcntYfSkgPSBcZnJhY3tcc2lnbWFeMn17bn0kPC9saT4gPGxpPjxzdHJvbmc+U3RhbmRhcmQgRXJyb3I6PC9zdHJvbmc+ICRTRSA9IFxmcmFje1xzaWdtYX17XHNxcnR7bn19JDwvbGk+IDxsaT48c3Ryb25nPlNhbXBsZSBTaXplIEVmZmVjdDo8L3N0cm9uZz4gTGFyZ2VyIG4g4oaSIHNtYWxsZXIgU0U8L2xpPiA8bGk+PHN0cm9uZz5EaXN0cmlidXRpb24gU2hhcGU6PC9zdHJvbmc+IEJlY29tZXMgbW9yZSBub3JtYWwgd2l0aCBsYXJnZXIgbjwvbGk+IDwvdWw+IDxkaXYgY2xhc3M9ImZvcm11bGEtYm94Ij4gPHN0cm9uZz5JbXBvcnRhbnQgUmVsYXRpb25zaGlwczo8L3N0cm9uZz48YnI+ICQkIEUoXGJhcntYfSkgPSBcbXUgJCQgJCQgVmFyKFxiYXJ7WH0pID0gXGZyYWN7XHNpZ21hXjJ9e259ICQkICQkIFNFKFxiYXJ7WH0pID0gXGZyYWN7XHNpZ21hfXtcc3FydHtufX0gJCQgPC9kaXY+IDwvZGl2PiA8L2Rpdj48ZGl2IGNsYXNzPSJjbHQtY2FyZCIgZGF0YS10b29sdGlwPSJSZXF1aXJlbWVudHMgYW5kIGNvbmRpdGlvbnMgZm9yIENMVCBhcHBsaWNhdGlvbiI+IDxoMz48aT7wn5SiPC9pPiBDb25kaXRpb25zICYgUmVxdWlyZW1lbnRzPC9oMz4gPGRpdiBjbGFzcz0iY2FyZC1jb250ZW50Ij4gPHVsIGNsYXNzPSJjYXJkLXBvaW50cyI+IDxsaT48c3Ryb25nPkluZGVwZW5kZW5jZTo8L3N0cm9uZz4gU2FtcGxlcyBtdXN0IGJlIGluZGVwZW5kZW50PC9saT4gPGxpPjxzdHJvbmc+UmFuZG9tIFNhbXBsaW5nOjwvc3Ryb25nPiBTYW1wbGVzIHJhbmRvbWx5IHNlbGVjdGVkPC9saT4gPGxpPjxzdHJvbmc+U2FtcGxlIFNpemU6PC9zdHJvbmc+IG4g4omlIDMwIGZvciBtb3N0IGRpc3RyaWJ1dGlvbnM8L2xpPiA8bGk+PHN0cm9uZz5GaW5pdGUgVmFyaWFuY2U6PC9zdHJvbmc+IFBvcHVsYXRpb24gdmFyaWFuY2UgbXVzdCBiZSBmaW5pdGU8L2xpPiA8bGk+PHN0cm9uZz5JZGVudGljYWwgRGlzdHJpYnV0aW9uOjwvc3Ryb25nPiBTYW1wbGVzIGZyb20gc2FtZSBwb3B1bGF0aW9uPC9saT4gPC91bD4gPGRpdiBjbGFzcz0iZm9ybXVsYS1ib3giPiA8c3Ryb25nPlNhbXBsZSBTaXplIEd1aWRlbGluZXM6PC9zdHJvbmc+PGJyPiDigKIgTm9ybWFsIHBvcHVsYXRpb246IEFueSBuIHdvcmtzPGJyPiDigKIgU2xpZ2h0bHkgc2tld2VkOiBuIOKJpSAxNTxicj4g4oCiIE1vZGVyYXRlbHkgc2tld2VkOiBuIOKJpSAzMDxicj4g4oCiIEhpZ2hseSBza2V3ZWQ6IG4g4omlIDUwKzxicj4gPC9kaXY+IDwvZGl2PiA8L2Rpdj48ZGl2IGNsYXNzPSJjbHQtY2FyZCIgZGF0YS10b29sdGlwPSJSZWFsLXdvcmxkIGFwcGxpY2F0aW9ucyBhbmQgdXNlcyI+IDxoMz48aT7wn5OIPC9pPiBQcmFjdGljYWwgQXBwbGljYXRpb25zPC9oMz4gPGRpdiBjbGFzcz0iY2FyZC1jb250ZW50Ij4gPHVsIGNsYXNzPSJjYXJkLXBvaW50cyI+IDxsaT48c3Ryb25nPkNvbmZpZGVuY2UgSW50ZXJ2YWxzOjwvc3Ryb25nPiBFc3RpbWF0aW5nIHBvcHVsYXRpb24gcGFyYW1ldGVyczwvbGk+IDxsaT48c3Ryb25nPkh5cG90aGVzaXMgVGVzdGluZzo8L3N0cm9uZz4gVGVzdGluZyBjbGFpbXMgYWJvdXQgbWVhbnM8L2xpPiA8bGk+PHN0cm9uZz5RdWFsaXR5IENvbnRyb2w6PC9zdHJvbmc+IFByb2Nlc3MgbW9uaXRvcmluZyBhbmQgaW1wcm92ZW1lbnQ8L2xpPiA8bGk+PHN0cm9uZz5TdXJ2ZXkgQW5hbHlzaXM6PC9zdHJvbmc+IFBvbGxpbmcgYW5kIG1hcmtldCByZXNlYXJjaDwvbGk+IDxsaT48c3Ryb25nPk1lZGljYWwgUmVzZWFyY2g6PC9zdHJvbmc+IENsaW5pY2FsIHRyaWFsIGFuYWx5c2lzPC9saT4gPC91bD4gPGRpdiBjbGFzcz0iZm9ybXVsYS1ib3giPiA8c3Ryb25nPlotc2NvcmUgRm9ybXVsYTo8L3N0cm9uZz48YnI+ICQkIFogPSBcZnJhY3tcYmFye1h9IC0gXG11fXtcc2lnbWEvXHNxcnR7bn19ICQkIDxzdHJvbmc+Q29uZmlkZW5jZSBJbnRlcnZhbDo8L3N0cm9uZz48YnI+ICQkIFxiYXJ7WH0gXHBtIHpfe1xhbHBoYS8yfSBcdGltZXMgXGZyYWN7XHNpZ21hfXtcc3FydHtufX0gJCQgPC9kaXY+IDwvZGl2PiA8L2Rpdj48L2Rpdj48aDMgY2xhc3M9ImNsdC1zdWJ0aXRsZSIgdGl0bGU9IlIgSW1wbGVtZW50YXRpb24iPlIgSW1wbGVtZW50YXRpb246IENMVCBEZW1vbnN0cmF0aW9uPC9oMz48ZGl2IGNsYXNzPSJyLWNvZGUtYmxvY2siIGRhdGEtdG9vbHRpcD0iUiBjb2RlIGZvciBDZW50cmFsIExpbWl0IFRoZW9yZW0gc2ltdWxhdGlvbiI+IDxkaXYgY2xhc3M9InItY29kZS10aXRsZSI+PGk+8J+SuzwvaT4gQ2VudHJhbCBMaW1pdCBUaGVvcmVtIFNpbXVsYXRpb24gaW4gUjwvZGl2Pg0KYGBge3J9DQojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQojIENFTlRSQUwgTElNSVQgVEhFT1JFTSBTSU1VTEFUSU9OIC0gUnB1YnMgVmVyc2lvbg0KIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KDQpjYXQoIj09PSBDRU5UUkFMIExJTUlUIFRIRU9SRU0gREVNT05TVFJBVElPTiA9PT1cblxuIikNCg0KIyBNZW11YXQgbGlicmFyeQ0KbGlicmFyeShnZ3Bsb3QyKQ0KbGlicmFyeShncmlkRXh0cmEpDQoNCiMgU2V0IHBhcmFtZXRlciBzaW11bGFzaQ0Kc2V0LnNlZWQoMTIzKSAgIyBVbnR1ayByZXByb2R1a3RpYmlsaXRhcw0KcG9wdWxhdGlvbl9zaXplIDwtIDEwMDAwDQpzYW1wbGVfc2l6ZSA8LSAzMA0Kbl9zYW1wbGVzIDwtIDEwMDANCg0KIyBNZW1idWF0IGRpc3RyaWJ1c2kgcG9wdWxhc2kgeWFuZyBiZXJiZWRhDQpjYXQoIkNyZWF0aW5nIHBvcHVsYXRpb24gZGlzdHJpYnV0aW9ucy4uLlxuXG4iKQ0KDQojIDEuIERpc3RyaWJ1c2kgZWtzcG9uZW5zaWFsIChzYW5nYXQgbWlyaW5nKQ0KcG9wX2V4cG9uZW50aWFsIDwtIHJleHAocG9wdWxhdGlvbl9zaXplLCByYXRlID0gMSkNCm11X2V4cCA8LSBtZWFuKHBvcF9leHBvbmVudGlhbCkNCnNpZ21hX2V4cCA8LSBzZChwb3BfZXhwb25lbnRpYWwpDQoNCiMgMi4gRGlzdHJpYnVzaSB1bmlmb3JtDQpwb3BfdW5pZm9ybSA8LSBydW5pZihwb3B1bGF0aW9uX3NpemUsIG1pbiA9IDAsIG1heCA9IDEwKQ0KbXVfdW5pIDwtIG1lYW4ocG9wX3VuaWZvcm0pDQpzaWdtYV91bmkgPC0gc2QocG9wX3VuaWZvcm0pDQoNCiMgMy4gRGlzdHJpYnVzaSBiaW1vZGFsIChkdWEgcHVuY2FrKQ0KcG9wX2JpbW9kYWwgPC0gYyhybm9ybShwb3B1bGF0aW9uX3NpemUvMiwgbWVhbiA9IDMwLCBzZCA9IDUpLA0KICAgICAgICAgICAgICAgICBybm9ybShwb3B1bGF0aW9uX3NpemUvMiwgbWVhbiA9IDcwLCBzZCA9IDUpKQ0KbXVfYmltIDwtIG1lYW4ocG9wX2JpbW9kYWwpDQpzaWdtYV9iaW0gPC0gc2QocG9wX2JpbW9kYWwpDQoNCiMgRnVuZ3NpIHVudHVrIG1lbnNpbXVsYXNpa2FuIENMVA0Kc2ltdWxhdGVfY2x0IDwtIGZ1bmN0aW9uKHBvcHVsYXRpb24sIHBvcF9uYW1lLCBtdSwgc2lnbWEsIG4sIGspIHsNCiAgc2FtcGxlX21lYW5zIDwtIG51bWVyaWMoaykNCiAgDQogIGZvciAoaSBpbiAxOmspIHsNCiAgICBzYW1wbGVfZGF0YSA8LSBzYW1wbGUocG9wdWxhdGlvbiwgc2l6ZSA9IG4sIHJlcGxhY2UgPSBUUlVFKQ0KICAgIHNhbXBsZV9tZWFuc1tpXSA8LSBtZWFuKHNhbXBsZV9kYXRhKQ0KICB9DQogIA0KICAjIE1lbmdoaXR1bmcgbmlsYWkgdGVvcml0aXMNCiAgdGhlb3JldGljYWxfc2UgPC0gc2lnbWEgLyBzcXJ0KG4pDQogIA0KICAjIE1lbWJ1YXQgZGF0YSBmcmFtZSBoYXNpbA0KICByZXN1bHRzIDwtIGRhdGEuZnJhbWUoDQogICAgUG9wdWxhdGlvbiA9IHBvcF9uYW1lLA0KICAgIFNhbXBsZU1lYW5zID0gc2FtcGxlX21lYW5zLA0KICAgIFRoZW9yZXRpY2FsTWVhbiA9IG11LA0KICAgIFRoZW9yZXRpY2FsU0UgPSB0aGVvcmV0aWNhbF9zZSwNCiAgICBFbXBpcmljYWxNZWFuID0gbWVhbihzYW1wbGVfbWVhbnMpLA0KICAgIEVtcGlyaWNhbFNFID0gc2Qoc2FtcGxlX21lYW5zKQ0KICApDQogIA0KICByZXR1cm4ocmVzdWx0cykNCn0NCg0KIyBNZW5qYWxhbmthbiBzaW11bGFzaSB1bnR1ayBzZW11YSBkaXN0cmlidXNpDQpjYXQoIlJ1bm5pbmcgQ0xUIHNpbXVsYXRpb25zLi4uXG4iKQ0KDQpyZXN1bHRzX2V4cCA8LSBzaW11bGF0ZV9jbHQocG9wX2V4cG9uZW50aWFsLCAiRXhwb25lbnRpYWwiLCBtdV9leHAsIHNpZ21hX2V4cCwgc2FtcGxlX3NpemUsIG5fc2FtcGxlcykNCnJlc3VsdHNfdW5pIDwtIHNpbXVsYXRlX2NsdChwb3BfdW5pZm9ybSwgIlVuaWZvcm0iLCBtdV91bmksIHNpZ21hX3VuaSwgc2FtcGxlX3NpemUsIG5fc2FtcGxlcykNCnJlc3VsdHNfYmltIDwtIHNpbXVsYXRlX2NsdChwb3BfYmltb2RhbCwgIkJpbW9kYWwiLCBtdV9iaW0sIHNpZ21hX2JpbSwgc2FtcGxlX3NpemUsIG5fc2FtcGxlcykNCg0KIyBNZW5nZ2FidW5na2FuIGhhc2lsDQphbGxfcmVzdWx0cyA8LSByYmluZChyZXN1bHRzX2V4cCwgcmVzdWx0c191bmksIHJlc3VsdHNfYmltKQ0KDQojIE1lbmFtcGlsa2FuIHN0YXRpc3RpayByaW5na2FzYW4NCmNhdCgiXG49PT0gU0lNVUxBVElPTiBSRVNVTFRTIChuID0iLCBzYW1wbGVfc2l6ZSwgIiwgc2FtcGxlcyA9Iiwgbl9zYW1wbGVzLCAiKSA9PT1cblxuIikNCg0KZm9yIChkaXN0IGluIGMoIkV4cG9uZW50aWFsIiwgIlVuaWZvcm0iLCAiQmltb2RhbCIpKSB7DQogIHN1YnNldF9kYXRhIDwtIGFsbF9yZXN1bHRzW2FsbF9yZXN1bHRzJFBvcHVsYXRpb24gPT0gZGlzdCwgXQ0KICANCiAgY2F0KGRpc3QsICJEaXN0cmlidXRpb246XG4iKQ0KICBjYXQoIiAgUG9wdWxhdGlvbiBtZWFuICjOvCk6Iiwgcm91bmQodW5pcXVlKHN1YnNldF9kYXRhJFRoZW9yZXRpY2FsTWVhbiksIDMpLCAiXG4iKQ0KICBjYXQoIiAgUG9wdWxhdGlvbiBTRCAoz4MpOiIsIHJvdW5kKHVuaXF1ZShzdWJzZXRfZGF0YSRUaGVvcmV0aWNhbFNFICogc3FydChzYW1wbGVfc2l6ZSkpLCAzKSwgIlxuIikNCiAgY2F0KCIgIFRoZW9yZXRpY2FsIFNFOiIsIHJvdW5kKHVuaXF1ZShzdWJzZXRfZGF0YSRUaGVvcmV0aWNhbFNFKSwgMyksICJcbiIpDQogIGNhdCgiICBFbXBpcmljYWwgbWVhbiBvZiBzYW1wbGUgbWVhbnM6Iiwgcm91bmQobWVhbihzdWJzZXRfZGF0YSRTYW1wbGVNZWFucyksIDMpLCAiXG4iKQ0KICBjYXQoIiAgRW1waXJpY2FsIFNFOiIsIHJvdW5kKHNkKHN1YnNldF9kYXRhJFNhbXBsZU1lYW5zKSwgMyksICJcbiIpDQogIGNhdCgiICBEaWZmZXJlbmNlIGluIG1lYW5zOiIsIHJvdW5kKGFicyhtZWFuKHN1YnNldF9kYXRhJFNhbXBsZU1lYW5zKSAtIHVuaXF1ZShzdWJzZXRfZGF0YSRUaGVvcmV0aWNhbE1lYW4pKSwgMyksICJcbiIpDQogIGNhdCgiICBSYXRpbyBTRShlbXBpcmljYWwpL1NFKHRoZW9yZXRpY2FsKToiLCByb3VuZChzZChzdWJzZXRfZGF0YSRTYW1wbGVNZWFucykvdW5pcXVlKHN1YnNldF9kYXRhJFRoZW9yZXRpY2FsU0UpLCAzKSwgIlxuXG4iKQ0KfQ0KDQojIE1lbWJ1YXQgdmlzdWFsaXNhc2kgZGVuZ2FuIHRlbWEgY29rbGF0IHlhbmcgZGl0aW5na2F0a2FuDQpjYXQoIkNyZWF0aW5nIHZpc3VhbGl6YXRpb25zLi4uXG4iKQ0KDQojIEZ1bmdzaSB1bnR1ayBtZW1idWF0IHBsb3QgZGlzdHJpYnVzaSBkZW5nYW4gdGVtYSBjb2tsYXQNCmNyZWF0ZV9kaXN0cmlidXRpb25fcGxvdCA8LSBmdW5jdGlvbihwb3BfZGF0YSwgc2FtcGxlX21lYW5zX2RhdGEsIHRpdGxlLCBjb2xvcikgew0KICAjIFBsb3QgZGlzdHJpYnVzaSBwb3B1bGFzaQ0KICBwX3BvcCA8LSBnZ3Bsb3QoZGF0YS5mcmFtZSh4ID0gcG9wX2RhdGEpLCBhZXMoeCA9IHgpKSArDQogICAgZ2VvbV9oaXN0b2dyYW0oYWVzKHkgPSBhZnRlcl9zdGF0KGRlbnNpdHkpKSwgYmlucyA9IDUwLCBmaWxsID0gY29sb3IsIGFscGhhID0gMC43LCANCiAgICAgICAgICAgICAgICAgICBjb2xvciA9ICJ3aGl0ZSIsIGxpbmV3aWR0aCA9IDAuMikgKw0KICAgIGdlb21fZGVuc2l0eShjb2xvciA9ICIjM0UyNzIzIiwgc2l6ZSA9IDAuOCkgKw0KICAgIGxhYnModGl0bGUgPSBwYXN0ZSgiUG9wdWxhdGlvbjoiLCB0aXRsZSksDQogICAgICAgICB4ID0gIlZhbHVlIiwgeSA9ICJEZW5zaXR5IikgKw0KICAgIHRoZW1lX21pbmltYWwoKSArDQogICAgdGhlbWUoDQogICAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41LCBmYWNlID0gImJvbGQiLCBzaXplID0gMTEsIGNvbG9yID0gIiM1RDQwMzciKSwNCiAgICAgIHBsb3QuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gIiNFRkVCRTkiLCBjb2xvciA9ICIjOEQ2RTYzIiwgbGluZXdpZHRoID0gMSksDQogICAgICBwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAiI0Y1RjFFOCIpLA0KICAgICAgcGFuZWwuZ3JpZC5tYWpvciA9IGVsZW1lbnRfbGluZShjb2xvciA9ICIjRDdDQ0M4IiwgbGluZXdpZHRoID0gMC4zKSwNCiAgICAgIHBhbmVsLmdyaWQubWlub3IgPSBlbGVtZW50X2xpbmUoY29sb3IgPSAiI0Q3Q0NDOCIsIGxpbmV3aWR0aCA9IDAuMSksDQogICAgICBheGlzLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMCwgY29sb3IgPSAiIzVENDAzNyIpLA0KICAgICAgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSA5LCBjb2xvciA9ICIjNzk1NTQ4IiksDQogICAgICBwbG90Lm1hcmdpbiA9IG1hcmdpbigxNSwgMTUsIDE1LCAxNSkNCiAgICApDQogIA0KICAjIFBsb3QgZGlzdHJpYnVzaSByYXRhLXJhdGEgc2FtcGVsDQogIHBfbWVhbnMgPC0gZ2dwbG90KGRhdGEuZnJhbWUoeCA9IHNhbXBsZV9tZWFuc19kYXRhKSwgYWVzKHggPSB4KSkgKw0KICAgIGdlb21faGlzdG9ncmFtKGFlcyh5ID0gYWZ0ZXJfc3RhdChkZW5zaXR5KSksIGJpbnMgPSA0MCwgZmlsbCA9IGNvbG9yLCBhbHBoYSA9IDAuNywNCiAgICAgICAgICAgICAgICAgICBjb2xvciA9ICJ3aGl0ZSIsIGxpbmV3aWR0aCA9IDAuMikgKw0KICAgIGdlb21fZGVuc2l0eShjb2xvciA9ICIjM0UyNzIzIiwgc2l6ZSA9IDAuOCkgKw0KICAgIHN0YXRfZnVuY3Rpb24oZnVuID0gZG5vcm0sIA0KICAgICAgICAgICAgICAgICAgYXJncyA9IGxpc3QobWVhbiA9IG1lYW4oc2FtcGxlX21lYW5zX2RhdGEpLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZCA9IHNkKHNhbXBsZV9tZWFuc19kYXRhKSksDQogICAgICAgICAgICAgICAgICBjb2xvciA9ICIjNEUzNDJFIiwgc2l6ZSA9IDAuOCwgbGluZXR5cGUgPSAiZGFzaGVkIikgKw0KICAgIGxhYnModGl0bGUgPSBwYXN0ZSgiU2FtcGxlIE1lYW5zIChuID0iLCBzYW1wbGVfc2l6ZSwgIikiKSwNCiAgICAgICAgIHggPSAiU2FtcGxlIE1lYW4iLCB5ID0gIkRlbnNpdHkiKSArDQogICAgdGhlbWVfbWluaW1hbCgpICsNCiAgICB0aGVtZSgNCiAgICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUsIGZhY2UgPSAiYm9sZCIsIHNpemUgPSAxMSwgY29sb3IgPSAiIzVENDAzNyIpLA0KICAgICAgcGxvdC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAiI0VGRUJFOSIsIGNvbG9yID0gIiM4RDZFNjMiLCBsaW5ld2lkdGggPSAxKSwNCiAgICAgIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICIjRjVGMUU4IiksDQogICAgICBwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9saW5lKGNvbG9yID0gIiNEN0NDQzgiLCBsaW5ld2lkdGggPSAwLjMpLA0KICAgICAgcGFuZWwuZ3JpZC5taW5vciA9IGVsZW1lbnRfbGluZShjb2xvciA9ICIjRDdDQ0M4IiwgbGluZXdpZHRoID0gMC4xKSwNCiAgICAgIGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEwLCBjb2xvciA9ICIjNUQ0MDM3IiksDQogICAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDksIGNvbG9yID0gIiM3OTU1NDgiKSwNCiAgICAgIHBsb3QubWFyZ2luID0gbWFyZ2luKDE1LCAxNSwgMTUsIDE1KQ0KICAgICkNCiAgDQogIHJldHVybihsaXN0KHBvcCA9IHBfcG9wLCBtZWFucyA9IHBfbWVhbnMpKQ0KfQ0KDQojIFBhbGV0IHdhcm5hIGNva2xhdCB5YW5nIGxlYmloIHZhcmlhdGlmDQpjb2xvcnMgPC0gYygiIzhENkU2MyIsICIjQTE4ODdGIiwgIiNCQ0FBQTQiKSAgIyBXYXJuYSBjb2tsYXQgeWFuZyBiZXJiZWRhIHVudHVrIHNldGlhcCBkaXN0cmlidXNpDQoNCmRpc3RfbmFtZXMgPC0gYygiRXhwb25lbnRpYWwiLCAiVW5pZm9ybSIsICJCaW1vZGFsIikNCnBvcF9kYXRhX2xpc3QgPC0gbGlzdChwb3BfZXhwb25lbnRpYWwsIHBvcF91bmlmb3JtLCBwb3BfYmltb2RhbCkNCm1lYW5zX2RhdGFfbGlzdCA8LSBsaXN0KHJlc3VsdHNfZXhwJFNhbXBsZU1lYW5zLCByZXN1bHRzX3VuaSRTYW1wbGVNZWFucywgcmVzdWx0c19iaW0kU2FtcGxlTWVhbnMpDQoNCmFsbF9wbG90cyA8LSBsaXN0KCkNCg0KZm9yIChpIGluIDE6Mykgew0KICBwbG90cyA8LSBjcmVhdGVfZGlzdHJpYnV0aW9uX3Bsb3QocG9wX2RhdGFfbGlzdFtbaV1dLCBtZWFuc19kYXRhX2xpc3RbW2ldXSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3RfbmFtZXNbaV0sIGNvbG9yc1tpXSkNCiAgYWxsX3Bsb3RzW1syKmktMV1dIDwtIHBsb3RzJHBvcA0KICBhbGxfcGxvdHNbWzIqaV1dIDwtIHBsb3RzJG1lYW5zDQp9DQoNCiMgTWVuZ2F0dXIgc2VtdWEgcGxvdCBkYWxhbSBncmlkIGRlbmdhbiBib3JkZXIgY29rbGF0DQpncmlkX3Bsb3QgPC0gZ3JpZC5hcnJhbmdlKA0KICBncm9icyA9IGFsbF9wbG90cywNCiAgbmNvbCA9IDIsDQogIG5yb3cgPSAzLA0KICB0b3AgPSBncmlkOjp0ZXh0R3JvYigNCiAgICBwYXN0ZSgiQ0VOVFJBTCBMSU1JVCBUSEVPUkVNIERFTU9OU1RSQVRJT05cblNhbXBsZSBTaXplIG4gPSIsIHNhbXBsZV9zaXplLCAifCBOdW1iZXIgb2YgU2FtcGxlcyA9Iiwgbl9zYW1wbGVzKSwNCiAgICBncCA9IGdyaWQ6OmdwYXIoZm9udHNpemUgPSAxNiwgZm9udGZhY2UgPSAiYm9sZCIsIGNvbCA9ICIjNUQ0MDM3IiwgbGluZWhlaWdodCA9IDEuMikNCiAgKSwNCiAgYm90dG9tID0gZ3JpZDo6dGV4dEdyb2IoDQogICAgIkludGVycHJldGFzaTogRGlzdHJpYnVzaSByYXRhLXJhdGEgc2FtcGVsIChrb2xvbSBrYW5hbikgbWVuZGVrYXRpIGRpc3RyaWJ1c2kgbm9ybWFsIG1lc2tpcHVuIGRpc3RyaWJ1c2kgcG9wdWxhc2kgYXNsaSAoa29sb20ga2lyaSkgdGlkYWsgbm9ybWFsIiwNCiAgICBncCA9IGdyaWQ6OmdwYXIoZm9udHNpemUgPSAxMiwgY29sID0gIiM3OTU1NDgiLCBmb250ZmFjZSA9ICJpdGFsaWMiKSwNCiAgICB5ID0gdW5pdCgxLCAibnBjIikgLSB1bml0KDE1LCAibW0iKQ0KICApLA0KICBwYWRkaW5nID0gdW5pdCgwLjUsICJjbSIpDQopDQoNCiMgTWVuYW1waWxrYW4gcGxvdA0KcHJpbnQoZ3JpZF9wbG90KQ0KDQpjYXQoIlxuPT09IElOVEVSUFJFVEFUSU9OID09PVxuXG4iKQ0KY2F0KCJCZXJkYXNhcmthbiBzaW11bGFzaSBDZW50cmFsIExpbWl0IFRoZW9yZW0gKENMVCkgZGkgYXRhcywgZGFwYXQgZGl0YXJpayBiZWJlcmFwYSBrZXNpbXB1bGFuIHBlbnRpbmc6XG5cbiIpDQpjYXQoIjEuIEJFTlRVSyBESVNUUklCVVNJOlxuIikNCmNhdCgiICAgLSBEaXN0cmlidXNpIEVrc3BvbmVuc2lhbCAoa2lyaSBhdGFzKTogU2FuZ2F0IG1pcmluZyBrZSBrYW5hblxuIikNCmNhdCgiICAgLSBEaXN0cmlidXNpIFVuaWZvcm0gKHRlbmdhaCBraXJpKTogQmVudHVrIHBlcnNlZ2kgeWFuZyBkYXRhclxuIikNCmNhdCgiICAgLSBEaXN0cmlidXNpIEJpbW9kYWwgKGtpcmkgYmF3YWgpOiBNZW1pbGlraSBkdWEgcHVuY2FrIHlhbmcgYmVyYmVkYVxuIikNCmNhdCgiICAgLSBOYW11biwgZGlzdHJpYnVzaSByYXRhLXJhdGEgc2FtcGVsIHVudHVrIGtldGlnYW55YSAoa29sb20ga2FuYW4pIG1lbmRla2F0aSBiZW50dWsgbm9ybWFsXG5cbiIpDQoNCmNhdCgiMi4gS09OU0lTVEVOU0kgSEFTSUw6XG4iKQ0KY2F0KCIgICAtIFJhdGEtcmF0YSBlbXBpcmlzIGRhcmkgcmF0YS1yYXRhIHNhbXBlbCBtZW5kZWthdGkgcmF0YS1yYXRhIHBvcHVsYXNpICjOvClcbiIpDQpjYXQoIiAgIC0gU3RhbmRhciBFcnJvciBlbXBpcmlzIG1lbmRla2F0aSBTdGFuZGFyIEVycm9yIHRlb3JpdGlzICjPgy/iiJpuKVxuIikNCmNhdCgiICAgLSBSYXNpbyBTRShlbXBpcmljYWwpL1NFKHRoZW9yZXRpY2FsKSBtZW5kZWthdGkgMSB1bnR1ayBzZW11YSBkaXN0cmlidXNpXG5cbiIpDQoNCmNhdCgiMy4gSU1QTElLQVNJIFBSQUtUSVM6XG4iKQ0KY2F0KCIgICAtIENMVCBiZXJsYWt1IG1lc2tpcHVuIGRpc3RyaWJ1c2kgcG9wdWxhc2kgdGlkYWsgbm9ybWFsXG4iKQ0KY2F0KCIgICAtIERlbmdhbiB1a3VyYW4gc2FtcGVsIG49MzAsIGRpc3RyaWJ1c2kgcmF0YS1yYXRhIHNhbXBlbCBzdWRhaCBjdWt1cCBtZW5kZWthdGkgbm9ybWFsXG4iKQ0KY2F0KCIgICAtIEluaSBtZW11bmdraW5rYW4gcGVuZ2d1bmFhbiBpbmZlcmVuc2kgc3RhdGlzdGlrICh1amkgaGlwb3Rlc2lzLCBpbnRlcnZhbCBrZXBlcmNheWFhbilcbiIpDQpjYXQoIiAgIC0gQ0xUIGFkYWxhaCBkYXNhciB1bnR1ayBiYW55YWsgbWV0b2RlIHN0YXRpc3RpayBwYXJhbWV0cmlrXG5cbiIpDQoNCmNhdCgiNC4gUEVOVElOR05ZQSBVS1VSQU4gU0FNUEVMOlxuIikNCmNhdCgiICAgLSBTZW1ha2luIGJlc2FyIG4sIGRpc3RyaWJ1c2kgcmF0YS1yYXRhIHNhbXBlbCBzZW1ha2luIG1lbmRla2F0aSBub3JtYWxcbiIpDQpjYXQoIiAgIC0gVW50dWsgcG9wdWxhc2kgeWFuZyBzYW5nYXQgbWlyaW5nLCBtdW5na2luIGRpcGVybHVrYW4gbiB5YW5nIGxlYmloIGJlc2FyXG4iKQ0KY2F0KCIgICAtIEF0dXJhbiBwcmFrdGlzOiBuIOKJpSAzMCBiaWFzYW55YSBjdWt1cCB1bnR1ayBtZW5lcmFwa2FuIENMVFxuXG4iKQ0KDQpjYXQoIj09PSBTSU1VTEFUSU9OIENPTVBMRVRFID09PVxuIikNCg0KIyBNZW55aW1wYW4gcGxvdCBkZW5nYW4ga3VhbGl0YXMgdGluZ2dpDQpnZ3NhdmUoImNsdF9zaW11bGF0aW9uX3JwdWJzLnBuZyIsIGdyaWRfcGxvdCwgDQogICAgICAgd2lkdGggPSAxNCwgaGVpZ2h0ID0gMTAsIGRwaSA9IDMwMCwgYmcgPSAiI0VGRUJFOSIpDQoNCmNhdCgiXG5QbG90IHRlbGFoIGRpc2ltcGFuIHNlYmFnYWkgJ2NsdF9zaW11bGF0aW9uX3JwdWJzLnBuZydcbiIpDQoNCmNhdCgiXG49PT0gSU5TVFJVS1NJIFVOVFVLIFJQVUJTID09PVxuIikNCmNhdCgiMS4gSW5zdGFsbCBwYWNrYWdlIGppa2EgYmVsdW06IGluc3RhbGwucGFja2FnZXMoYygnZ2dwbG90MicsICdncmlkRXh0cmEnKSlcbiIpDQpjYXQoIjIuIENvcHkgc2VsdXJ1aCBrb2RlIGluaSBrZSBSU3R1ZGlvXG4iKQ0KY2F0KCIzLiBKYWxhbmthbiBzZW11YSBrb2RlIChDdHJsICsgQSBsYWx1IEN0cmwgKyBFbnRlcilcbiIpDQpjYXQoIjQuIFBsb3QgYWthbiBtdW5jdWwgZGkgcGFuZWwgUGxvdCBkYW4gdGVyc2ltcGFuIHNlYmFnYWkgZmlsZSBQTkdcbiIpDQpjYXQoIjUuIFVudHVrIFJwdWJzOiBVcGxvYWQgZmlsZSBSIGluaSBhdGF1IHB1Ymxpc2ggbGFuZ3N1bmcgZGFyaSBSU3R1ZGlvXG5cbiIpDQpgYGANCjwvZGl2PiA8L2Rpdj48ZGl2IGNsYXNzPSJyZWZlcmVuY2UtYm94IiBkYXRhLXRvb2x0aXA9IlJlY29tbWVuZGVkIHRleHRib29rcyBmb3IgZnVydGhlciBzdHVkeSI+IDxzdHJvbmc+UmVmZXJlbmNlIEJvb2tzOjwvc3Ryb25nPjxicj48YnI+DQo8c3Ryb25nPjEuIE1vbnRnb21lcnksIEQuQy4sICYgUnVuZ2VyLCBHLkMuPC9zdHJvbmc+ICgyMDE4KS4gPGVtPkFwcGxpZWQgU3RhdGlzdGljcyBhbmQgUHJvYmFiaWxpdHkgZm9yIEVuZ2luZWVyczwvZW0+LiBXaWxleS4NCg0KPHN0cm9uZz5DaGFwdGVyOjwvc3Ryb25nPiA3IC0gUG9pbnQgRXN0aW1hdGlvbiBhbmQgU2FtcGxpbmcgRGlzdHJpYnV0aW9ucw0KDQo8c3Ryb25nPlBhZ2VzOjwvc3Ryb25nPiAyNTUtMjkwDQoNCjxzdHJvbmc+UmVsZXZhbmNlOjwvc3Ryb25nPiBFeGNlbGxlbnQgZW5naW5lZXJpbmctZm9jdXNlZCBleHBsYW5hdGlvbiBvZiBDTFQgd2l0aCBwcmFjdGljYWwgZXhhbXBsZXMuDQoNCg0KPHN0cm9uZz4yLiBXYWxwb2xlLCBSLkUuLCBNeWVycywgUi5ILiwgTXllcnMsIFMuTC4sICYgWWUsIEsuPC9zdHJvbmc+ICgyMDEyKS4gPGVtPlByb2JhYmlsaXR5ICYgU3RhdGlzdGljcyBmb3IgRW5naW5lZXJzICYgU2NpZW50aXN0czwvZW0+LiBQZWFyc29uIEVkdWNhdGlvbi4NCg0KPHN0cm9uZz5DaGFwdGVyOjwvc3Ryb25nPiA4IC0gRnVuZGFtZW50YWwgU2FtcGxpbmcgRGlzdHJpYnV0aW9ucw0KDQo8c3Ryb25nPlBhZ2VzOjwvc3Ryb25nPiAyODEtMzIwDQoNCjxzdHJvbmc+UmVsZXZhbmNlOjwvc3Ryb25nPiBDb21wcmVoZW5zaXZlIGNvdmVyYWdlIG9mIHNhbXBsaW5nIGRpc3RyaWJ1dGlvbnMgaW5jbHVkaW5nIENMVCBwcm9vZnMuDQoNCg0KPHN0cm9uZz4zLiBEZXZvcmUsIEouTC48L3N0cm9uZz4gKDIwMTUpLiA8ZW0+UHJvYmFiaWxpdHkgYW5kIFN0YXRpc3RpY3MgZm9yIEVuZ2luZWVyaW5nIGFuZCB0aGUgU2NpZW5jZXM8L2VtPi4gQ2VuZ2FnZSBMZWFybmluZy4NCg0KPHN0cm9uZz5DaGFwdGVyOjwvc3Ryb25nPiA2IC0gU3RhdGlzdGljcyBhbmQgU2FtcGxpbmcgRGlzdHJpYnV0aW9ucw0KDQo8c3Ryb25nPlBhZ2VzOjwvc3Ryb25nPiAyNzAtMzEwDQoNCjxzdHJvbmc+UmVsZXZhbmNlOjwvc3Ryb25nPiBQcmFjdGljYWwgYXBwbGljYXRpb25zIG9mIENMVCBpbiBlbmdpbmVlcmluZyBhbmQgc2NpZW50aWZpYyBjb250ZXh0cy4NCg0KDQo8ZGl2IGNsYXNzPSJoZWFkZXItc2VjdGlvbiI+IA0KPGgxPkNlbnRyYWwgTGltaXQgVGhlb3JlbSBTdW1tYXJ5PC9oMT4gDQo8cD48c3Ryb25nPlZpZGVvOiBUaGUgQ2VudHJhbCBMaW1pdCBUaGVvcmVtIEV4cGxhaW5lZDwvc3Ryb25nPjwvcD4NCjwvZGl2Pg0KDQo8ZGl2IGNsYXNzPSJjbHQtc3VtbWFyeSI+DQo8aDIgY2xhc3M9ImNsdC10aXRsZSIgdGl0bGU9IkNlbnRyYWwgTGltaXQgVGhlb3JlbSBDb21wbGV0ZSBHdWlkZSI+Q2VudHJhbCBMaW1pdCBUaGVvcmVtOiBLZXkgQ29uY2VwdHM8L2gyPg0KICANCjwhLS0gVklERU8gTElOSyBESVRBUlVIIERJIEJBV0FIIEpVRFVMIEFXQUwgUEFEQSBCQUIgLS0+DQo8ZGl2IGNsYXNzPSJ2aWRlby1ib3giIGRhdGEtdG9vbHRpcD0iV2F0Y2ggQ2VudHJhbCBMaW1pdCBUaGVvcmVtIGV4cGxhbmF0aW9uIHZpZGVvIj4NCjxzdHJvbmc+VmlkZW86PC9zdHJvbmc+IA0KPGEgaHJlZj0iaHR0cHM6Ly95b3V0dS5iZS9pdmQ4d0VIbk1DZz9zaT1TMmhsTWR1MzdjWVZsMGthIiB0YXJnZXQ9Il9ibGFuayI+DQpUaGUgQ2VudHJhbCBMaW1pdCBUaGVvcmVtIC0gVW5kZXJzdGFuZGluZyB0aGUgTW9zdCBJbXBvcnRhbnQgQ29uY2VwdCBpbiBTdGF0aXN0aWNzDQo8L2E+DQo8L2Rpdj4NCiAgDQo8ZGl2IGNsYXNzPSJjb25jZXB0LWludHJvIiBkYXRhLXRvb2x0aXA9IkludHJvZHVjdGlvbiB0byBDZW50cmFsIExpbWl0IFRoZW9yZW0iPg0KPHN0cm9uZz5XaGF0IGlzIENMVD88L3N0cm9uZz48YnI+DQpUaGUgQ2VudHJhbCBMaW1pdCBUaGVvcmVtIHN0YXRlcyB0aGF0IHRoZSBzYW1wbGluZyBkaXN0cmlidXRpb24gb2Ygc2FtcGxlIG1lYW5zIGFwcHJvYWNoZXMgYSBub3JtYWwgZGlzdHJpYnV0aW9uIGFzIHNhbXBsZSBzaXplIGluY3JlYXNlcywgcmVnYXJkbGVzcyBvZiBwb3B1bGF0aW9uIGRpc3RyaWJ1dGlvbiBzaGFwZS4gVGhpcyBlbmFibGVzIHN0YXRpc3RpY2FsIGluZmVyZW5jZSBhYm91dCBwb3B1bGF0aW9uIHBhcmFtZXRlcnMuDQo8L2Rpdj4NCiAgDQo8ZGl2IGNsYXNzPSJjbHQtZ3JpZCI+DQogICAgDQo8ZGl2IGNsYXNzPSJjbHQtY2FyZCIgZGF0YS10b29sdGlwPSJDb3JlIGNvbmNlcHRzIG9mIENMVCI+DQo8aDM+PGk+8J+OrzwvaT4gQ29yZSBDb25jZXB0PC9oMz4NCjxkaXYgY2xhc3M9ImNhcmQtY29udGVudCIgICAgDQo8dWwgY2xhc3M9ImNhcmQtcG9pbnRzIj4NCjxsaT5TYW1wbGUgbWVhbnMgYXBwcm9hY2ggbm9ybWFsIGRpc3RyaWJ1dGlvbjwvbGk+DQo8bGk+V29ya3MgZm9yIGFueSBwb3B1bGF0aW9uIGRpc3RyaWJ1dGlvbjwvbGk+DQo8bGk+biDiiaUgMzAgdXN1YWxseSBzdWZmaWNpZW50PC9saT4NCjxsaT5JbmRlcGVuZGVudCByYW5kb20gc2FtcGxlcyByZXF1aXJlZDwvbGk+DQo8L3VsPg0KPGRpdiBjbGFzcz0iZm9ybXVsYS1ib3giIGRhdGEtdG9vbHRpcD0iQ0xUIG1hdGhlbWF0aWNhbCBmb3JtdWxhIj4NCiQkIFxiYXJ7WH0gXHNpbSBOXGxlZnQoXG11LCBcZnJhY3tcc2lnbWFeMn17bn1ccmlnaHQpICQkDQo8L2Rpdj4NCjwvZGl2Pg0KPC9kaXY+DQogIA0KPGRpdiBjbGFzcz0iY2x0LWNhcmQiIGRhdGEtdG9vbHRpcD0iS2V5IHN0YXRpc3RpY2FsIHByb3BlcnRpZXMiPg0KPGgzPjxpPvCfk4o8L2k+IEtleSBQcm9wZXJ0aWVzPC9oMz4NCjxkaXYgY2xhc3M9ImNhcmQtY29udGVudCI+DQo8dWwgY2xhc3M9ImNhcmQtcG9pbnRzIj4NCjxsaT5NZWFuOiAkRShcYmFye1h9KSA9IFxtdSQ8L2xpPg0KPGxpPlZhcmlhbmNlOiAkVmFyKFxiYXJ7WH0pID0gXGZyYWN7XHNpZ21hXjJ9e259JDwvbGk+DQo8bGk+U3RhbmRhcmQgRXJyb3I6ICRTRSA9IFxmcmFje1xzaWdtYX17XHNxcnR7bn19JDwvbGk+DQo8bGk+TGFyZ2VyIG4g4oaSIHNtYWxsZXIgU0U8L2xpPg0KPC91bD4NCjxkaXYgY2xhc3M9ImZvcm11bGEtYm94IiBkYXRhLXRvb2x0aXA9IlN0YW5kYXJkIGVycm9yIGZvcm11bGEiPg0KJCQgU0UgPSBcZnJhY3tcc2lnbWF9e1xzcXJ0e259fSAkJA0KPC9kaXY+DQo8L2Rpdj4NCjwvZGl2Pg0KICAgIA0KPC9kaXY+DQogIA0KPGgzIGNsYXNzPSJjbHQtc3VidGl0bGUiIHRpdGxlPSJSIEltcGxlbWVudGF0aW9uIj5DTFQgU2ltdWxhdGlvbiBpbiBSPC9oMz4NCiAgDQo8ZGl2IGNsYXNzPSJyLWNvZGUtYmxvY2siIGRhdGEtdG9vbHRpcD0iUiBjb2RlIGZvciBDTFQgZGVtb25zdHJhdGlvbiI+DQo8ZGl2IGNsYXNzPSJyLWNvZGUtdGl0bGUiPjxpPvCfkrs8L2k+IENMVCBEZW1vbnN0cmF0aW9uPC9kaXY+DQoNCmBgYHtyIGNsdC1kZW1vLCBlY2hvPVRSVUUsIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIGZpZy53aWR0aD03LCBmaWcuaGVpZ2h0PTV9DQpsaWJyYXJ5KGdncGxvdDIpDQpzZXQuc2VlZCgxMjMpDQoNCiMgUGFyYW1ldGVycw0KcG9wX3NpemUgPC0gNTAwMA0KbiA8LSAzMA0Kc2FtcGxlcyA8LSAxMDAwDQoNCiMgU2tld2VkIHBvcHVsYXRpb24NCnBvcF9za2V3ZWQgPC0gcmV4cChwb3Bfc2l6ZSwgcmF0ZSA9IDEpDQpzYW1wbGVfbWVhbnMgPC0gbnVtZXJpYyhzYW1wbGVzKQ0KDQpmb3IoaSBpbiAxOnNhbXBsZXMpIHsNCiAgc2FtcGxlX21lYW5zW2ldIDwtIG1lYW4oc2FtcGxlKHBvcF9za2V3ZWQsIG4sIHJlcGxhY2UgPSBUUlVFKSkNCn0NCg0KIyBDcmVhdGUgcGxvdHMNCnAxIDwtIGdncGxvdChkYXRhLmZyYW1lKHggPSBwb3Bfc2tld2VkKSwgYWVzKHggPSB4KSkgKw0KICBnZW9tX2hpc3RvZ3JhbShhZXMoeSA9IC4uZGVuc2l0eS4uKSwgYmlucyA9IDQwLCANCiAgICAgICAgICAgICAgICAgZmlsbCA9ICIjOEQ2RTYzIiwgYWxwaGEgPSAwLjYpICsNCiAgbGFicyh0aXRsZSA9ICJQb3B1bGF0aW9uIERpc3RyaWJ1dGlvbiAoRXhwb25lbnRpYWwpIiwNCiAgICAgICB4ID0gIlZhbHVlIiwgeSA9ICJEZW5zaXR5IikgKw0KICB0aGVtZV9taW5pbWFsKCkgKw0KICB0aGVtZSgNCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiksDQogICAgcGxvdC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAiI0Y1RjFFOCIpLA0KICAgIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICIjRjVGMUU4IikNCiAgKQ0KDQpwMiA8LSBnZ3Bsb3QoZGF0YS5mcmFtZSh4ID0gc2FtcGxlX21lYW5zKSwgYWVzKHggPSB4KSkgKw0KICBnZW9tX2hpc3RvZ3JhbShhZXMoeSA9IC4uZGVuc2l0eS4uKSwgYmlucyA9IDQwLA0KICAgICAgICAgICAgICAgICBmaWxsID0gIiNBMTg4N0YiLCBhbHBoYSA9IDAuNikgKw0KICBzdGF0X2Z1bmN0aW9uKGZ1biA9IGRub3JtLCANCiAgICAgICAgICAgICAgICBhcmdzID0gbGlzdChtZWFuID0gbWVhbihzYW1wbGVfbWVhbnMpLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgc2QgPSBzZChzYW1wbGVfbWVhbnMpKSwNCiAgICAgICAgICAgICAgICBjb2xvciA9ICIjNUQ0MDM3Iiwgc2l6ZSA9IDAuOCkgKw0KICBsYWJzKHRpdGxlID0gcGFzdGUoIlNhbXBsZSBNZWFucyAobiA9IiwgbiwgIikiKSwNCiAgICAgICB4ID0gIlNhbXBsZSBNZWFuIiwgeSA9ICJEZW5zaXR5IikgKw0KICB0aGVtZV9taW5pbWFsKCkgKw0KICB0aGVtZSgNCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiksDQogICAgcGxvdC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAiI0Y1RjFFOCIpLA0KICAgIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICIjRjVGMUU4IikNCiAgKQ0KDQpsaWJyYXJ5KGdyaWRFeHRyYSkNCmdyaWQuYXJyYW5nZShwMSwgcDIsIG5jb2wgPSAyLA0KICAgICAgICAgICAgIHRvcCA9IGdyaWQ6OnRleHRHcm9iKA0KICAgICAgICAgICAgICAgIkNlbnRyYWwgTGltaXQgVGhlb3JlbSBEZW1vbnN0cmF0aW9uIiwNCiAgICAgICAgICAgICAgIGdwID0gZ3JpZDo6Z3Bhcihmb250c2l6ZSA9IDE0LCBmb250ZmFjZSA9ICJib2xkIiwgY29sID0gIiM1RDQwMzciKQ0KICAgICAgICAgICAgICkpDQpgYGANCg0KPGRpdiBjbGFzcz0ic3RlcC1ib3giIGRhdGEtdG9vbHRpcD0iU3RhbmRhcmQgZXJyb3IgY2FsY3VsYXRpb24iPiA8c3Ryb25nPjEuIFN0YW5kYXJkIEVycm9yOjwvc3Ryb25nPjxicj4gJFNFID0gXGZyYWN7Mn17XHNxcnR7MzZ9fSA9IDAuMzMzJCBjbSA8L2Rpdj48ZGl2IGNsYXNzPSJzdGVwLWJveCIgZGF0YS10b29sdGlwPSJQcm9iYWJpbGl0eSBjYWxjdWxhdGlvbiI+IDxzdHJvbmc+Mi4gUHJvYmFiaWxpdHkgbWVhbiA8IDk5LjVjbTo8L3N0cm9uZz48YnI+ICRaID0gXGZyYWN7OTkuNS0xMDB9ezAuMzMzfSA9IC0xLjUkPGJyPiAkUCA9IDAuMDY2OCQgKDYuNjglKSA8L2Rpdj48ZGl2IGNsYXNzPSJzdGVwLWJveCIgZGF0YS10b29sdGlwPSJDb25maWRlbmNlIGludGVydmFsIGNhbGN1bGF0aW9uIj4gPHN0cm9uZz4zLiA5NSUgQ29uZmlkZW5jZSBJbnRlcnZhbDo8L3N0cm9uZz48YnI+ICQxMDAgXHBtIDEuOTYgXHRpbWVzIDAuMzMzID0gWzk5LjM1LCAxMDAuNjVdJCBjbSA8L2Rpdj48L2Rpdj4gPGRpdiBjbGFzcz0ici1jb2RlLWJsb2NrIiBkYXRhLXRvb2x0aXA9IlIgY2FsY3VsYXRpb25zIGZvciBDTFQgZXhhbXBsZSI+IDxkaXYgY2xhc3M9InItY29kZS10aXRsZSI+PGk+PC9pPlIgQ2FsY3VsYXRpb248L2Rpdj4NCg0KYGBge3IgZWNobz1UUlVFLCB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCByZXN1bHRzPSdhc2lzJ30NCm11IDwtIDEwMA0Kc2lnbWEgPC0gMg0KbiA8LSAzNg0KDQojIENhbGN1bGF0aW9ucw0Kc2UgPC0gc2lnbWEgLyBzcXJ0KG4pDQp6IDwtICg5OS41IC0gbXUpIC8gc2UNCnBfdmFsIDwtIHBub3JtKHopDQoNCmNpX2xvd2VyIDwtIG11IC0gMS45NiAqIHNlDQpjaV91cHBlciA8LSBtdSArIDEuOTYgKiBzZQ0KDQojIFNvZnQgYnJvd24gY29sb3INCmNvbG9yIDwtICIjOEI1RTNDIg0KDQpvdXRwdXQgPC0gcGFzdGUwKA0KICAiPHNwYW4gc3R5bGU9J2NvbG9yOiIsIGNvbG9yLCAiOyBmb250LXdlaWdodDo2MDA7Jz5TdGFuZGFyZCBFcnJvcjogIiwgcm91bmQoc2UsIDMpLCAiIGNtPC9zcGFuPjxicj4iLA0KICAiPHNwYW4gc3R5bGU9J2NvbG9yOiIsIGNvbG9yLCAiOyBmb250LXdlaWdodDo2MDA7Jz5aLXNjb3JlIGZvciA5OS41IGNtOiAiLCByb3VuZCh6LCAzKSwgIjwvc3Bhbj48YnI+IiwNCiAgIjxzcGFuIHN0eWxlPSdjb2xvcjoiLCBjb2xvciwgIjsgZm9udC13ZWlnaHQ6NjAwOyc+UHJvYmFiaWxpdHk6ICIsIHJvdW5kKHBfdmFsLCA0KSwgIjwvc3Bhbj48YnI+IiwNCiAgIjxzcGFuIHN0eWxlPSdjb2xvcjoiLCBjb2xvciwgIjsgZm9udC13ZWlnaHQ6NjAwOyc+OTUlIENJOiBbIiwgDQogICAgICByb3VuZChjaV9sb3dlciwgMiksICIsICIsIHJvdW5kKGNpX3VwcGVyLCAyKSwgIl0gY208L3NwYW4+Ig0KKQ0KDQpgYGANCg0KPC9kaXY+IDx0YWJsZSBjbGFzcz0iY29tcGFyaXNvbi10YWJsZSI+IDx0aGVhZD4gPHRyPiA8dGg+U2FtcGxlIFNpemU8L3RoPiA8dGg+U3RhbmRhcmQgRXJyb3I8L3RoPiA8dGg+OTUlIENJIFdpZHRoPC90aD4gPC90cj4gPC90aGVhZD4gPHRib2R5PiA8dHI+IDx0ZD5uID0gOTwvdGQ+IDx0ZD4wLjY2NzwvdGQ+IDx0ZD4yLjYxIGNtPC90ZD4gPC90cj4gPHRyPiA8dGQ+biA9IDM2PC90ZD4gPHRkPjAuMzMzPC90ZD4gPHRkPjEuMzEgY208L3RkPiA8L3RyPiA8dHI+IDx0ZD5uID0gMTAwPC90ZD4gPHRkPjAuMjAwPC90ZD4gPHRkPjAuNzggY208L3RkPiA8L3RyPiA8L3Rib2R5PiA8L3RhYmxlPiA8ZGl2IGNsYXNzPSJjb25jZXB0LWludHJvIiBkYXRhLXRvb2x0aXA9IktleSBwb2ludHMgYWJvdXQgQ0xUIj4gPHN0cm9uZz5LZXkgUG9pbnRzOjwvc3Ryb25nPjxicj48YnI+IDxkaXYgY2xhc3M9InN0ZXAtYm94IiBkYXRhLXRvb2x0aXA9IkltcG9ydGFuY2Ugb2YgQ0xUIj4gPHN0cm9uZz4xLiBJbXBvcnRhbmNlOjwvc3Ryb25nPjxicj4gRW5hYmxlcyBpbmZlcmVuY2Ugd2l0aG91dCBrbm93aW5nIHBvcHVsYXRpb24gZGlzdHJpYnV0aW9uLiA8L2Rpdj4gPGRpdiBjbGFzcz0ic3RlcC1ib3giIGRhdGEtdG9vbHRpcD0iRWZmZWN0IG9mIHNhbXBsZSBzaXplIj4gPHN0cm9uZz4yLiBTYW1wbGUgU2l6ZTo8L3N0cm9uZz48YnI+IExhcmdlciBuIOKGkiBtb3JlIG5vcm1hbCBkaXN0cmlidXRpb24gb2YgbWVhbnMuIDwvZGl2PiA8ZGl2IGNsYXNzPSJzdGVwLWJveCIgZGF0YS10b29sdGlwPSJBcHBsaWNhdGlvbnMgb2YgQ0xUIj4gPHN0cm9uZz4zLiBBcHBsaWNhdGlvbnM6PC9zdHJvbmc+PGJyPiBDb25maWRlbmNlIGludGVydmFscywgaHlwb3RoZXNpcyB0ZXN0aW5nLCBxdWFsaXR5IGNvbnRyb2wuIDwvZGl2PjwvZGl2PiA8ZGl2IGNsYXNzPSJmb3JtdWxhLWJveCIgZGF0YS10b29sdGlwPSJFc3NlbnRpYWwgc3RhdGlzdGljYWwgZm9ybXVsYXMiPiA8c3Ryb25nPkVzc2VudGlhbCBGb3JtdWxhczo8L3N0cm9uZz48YnI+PGJyPg0KIyMgRXNzZW50aWFsIEZvcm11bGFzDQoNCiMjIyAxLiBTdGFuZGFyZCBFcnJvciAoU0UpDQokJA0KU0UgPSBcZnJhY3tcc2lnbWF9e1xzcXJ0e259fQ0KJCQNCg0KIyMjIDIuIFotU2NvcmUNCiQkDQpaID0gXGZyYWN7XGJhcntYfSAtIFxtdX17U0V9DQokJA0KDQojIyMgMy4gQ29uZmlkZW5jZSBJbnRlcnZhbCAoQ0kpDQokJA0KXGJhcntYfSBccG0gel97XGFscGhhLzJ9IFx0aW1lcyBTRQ0KJCQNCg0KDQo8L2Rpdj4gPGRpdiBjbGFzcz0idmlkZW8tYm94IiBkYXRhLXRvb2x0aXA9IlZpZGVvIGtleSB0YWtlYXdheXMiPiA8c3Ryb25nPlZpZGVvIFRha2Vhd2F5czo8L3N0cm9uZz48YnI+IDEuIENMVCBlbmFibGVzIHN0YXRpc3RpY2FsIGluZmVyZW5jZTxicj4gMi4gV29ya3MgZm9yIGFueSBwb3B1bGF0aW9uIHNoYXBlPGJyPiAzLiBMYXJnZXIgc2FtcGxlcyBnaXZlIGJldHRlciBhcHByb3hpbWF0aW9uczxicj4gNC4gRm91bmRhdGlvbiBmb3IgY29uZmlkZW5jZSBpbnRlcnZhbHMgYW5kIGh5cG90aGVzaXMgdGVzdHMgPC9kaXY+IDwvZGl2PiA8aDEgdGl0bGU9IlNhbXBsaW5nIERpc3RyaWJ1dGlvbiBvZiB0aGUgU2FtcGxlIFByb3BvcnRpb24iPlNhbXBsaW5nIERpc3RyaWJ1dGlvbiBvZiB0aGUgU2FtcGxlIFByb3BvcnRpb248L2gxPjwhLS0gVklERU8gTElOSyBESVRBUlVIIERJIEJBV0FIIEpVRFVMIEJBQiAtLT48ZGl2IGNsYXNzPSJ2aWRlby1ib3giIGRhdGEtdG9vbHRpcD0iV2F0Y2ggY29tcGxldGUgdmlkZW8gYWJvdXQgc2FtcGxpbmcgZGlzdHJpYnV0aW9uIG9mIHByb3BvcnRpb25zIj4gPHN0cm9uZz5WaWRlbzo8L3N0cm9uZz4gPGEgaHJlZj0iaHR0cHM6Ly95b3V0dS5iZS9xMmU0bUswRlRidz9zaT13amVKelhyY1R0VnlTQUZVIiB0YXJnZXQ9Il9ibGFuayI+IFNhbXBsaW5nIERpc3RyaWJ1dGlvbiBvZiB0aGUgU2FtcGxlIFByb3BvcnRpb24gYnkgSm9zaHVhIEVtbWFudWVsIDwvYT4gPC9kaXY+PGRpdiBjbGFzcz0iY29uY2VwdC1pbnRybyIgZGF0YS10b29sdGlwPSJJbnRyb2R1Y3Rpb24gdG8gc2FtcGxlIHByb3BvcnRpb24gY29uY2VwdHMiPiBUaGUgc2FtcGxpbmcgZGlzdHJpYnV0aW9uIG9mIHRoZSBzYW1wbGUgcHJvcG9ydGlvbiBpcyBhIGZ1bmRhbWVudGFsIGNvbmNlcHQgaW4gaW5mZXJlbnRpYWwgc3RhdGlzdGljcyB0aGF0IGRlc2NyaWJlcyBob3cgc2FtcGxlIHByb3BvcnRpb25zIHZhcnkgZnJvbSBzYW1wbGUgdG8gc2FtcGxlLiBJdCBwcm92aWRlcyB0aGUgZm91bmRhdGlvbiBmb3IgY29uc3RydWN0aW5nIGNvbmZpZGVuY2UgaW50ZXJ2YWxzIGFuZCBjb25kdWN0aW5nIGh5cG90aGVzaXMgdGVzdHMgYWJvdXQgcG9wdWxhdGlvbiBwcm9wb3J0aW9ucy4gPC9kaXY+PGgyIHRpdGxlPSJDb3JlIENvbmNlcHRzIG9mIFNhbXBsZSBQcm9wb3J0aW9uIERpc3RyaWJ1dGlvbiI+Q29yZSBDb25jZXB0cyBvZiBTYW1wbGUgUHJvcG9ydGlvbiBEaXN0cmlidXRpb248L2gyPjxkaXYgY2xhc3M9ImZvcm11bGEtYm94IiBkYXRhLXRvb2x0aXA9IkJhc2ljIGZvcm11bGEgZm9yIHNhbXBsZSBwcm9wb3J0aW9uIj4gPHN0cm9uZz5TYW1wbGUgUHJvcG9ydGlvbiBGb3JtdWxhOjwvc3Ryb25nPjxicj4gJCQgXGhhdHtwfSA9IFxmcmFje1h9e259ICQkIDxkaXYgY2xhc3M9InN0ZXAtYm94IiBkYXRhLXRvb2x0aXA9IlZhcmlhYmxlIGRlZmluaXRpb25zIj4gPHN0cm9uZz5XaGVyZTo8L3N0cm9uZz48YnI+ICRYJCA9IG51bWJlciBvZiBzdWNjZXNzZXMgaW4gdGhlIHNhbXBsZTxicj4gJG4kID0gc2FtcGxlIHNpemU8YnI+ICRcaGF0e3B9JCA9IHNhbXBsZSBwcm9wb3J0aW9uIChwcm9ub3VuY2VkICJwLWhhdCIpIDwvZGl2PiA8L2Rpdj48aDMgdGl0bGU9IktleSBQYXJhbWV0ZXJzIG9mIFNhbXBsaW5nIERpc3RyaWJ1dGlvbiI+S2V5IFBhcmFtZXRlcnMgb2YgU2FtcGxpbmcgRGlzdHJpYnV0aW9uPC9oMz48ZGl2IGNsYXNzPSJtYXRoLWNvbnRhaW5lciIgZGF0YS10b29sdGlwPSJNZWFuIG9mIHNhbXBsaW5nIGRpc3RyaWJ1dGlvbiI+IDxkaXYgY2xhc3M9Im1hdGgiPiA8c3Ryb25nPk1lYW4gb2YgU2FtcGxpbmcgRGlzdHJpYnV0aW9uOjwvc3Ryb25nPjxicj4gJCQgXG11X3tcaGF0e3B9fSA9IEUoXGhhdHtwfSkgPSBwICQkIDwvZGl2PiA8ZGl2IGNsYXNzPSJzdGVwLWJveCIgZGF0YS10b29sdGlwPSJFeHBsYW5hdGlvbiBvZiB1bmJpYXNlZCBlc3RpbWF0b3IiPiA8c3Ryb25nPkV4cGxhbmF0aW9uOjwvc3Ryb25nPjxicj4gVGhlIGV4cGVjdGVkIHZhbHVlIG9mIGFsbCBwb3NzaWJsZSBzYW1wbGUgcHJvcG9ydGlvbnMgZXF1YWxzIHRoZSBwb3B1bGF0aW9uIHByb3BvcnRpb248YnI+IFRoaXMgbWFrZXMgJFxoYXR7cH0kIGFuIDxzdHJvbmc+dW5iaWFzZWQgZXN0aW1hdG9yPC9zdHJvbmc+IG9mICRwJCA8L2Rpdj4gPC9kaXY+PGRpdiBjbGFzcz0iZm9ybXVsYS1ib3giIGRhdGEtdG9vbHRpcD0iVmFyaWFuY2UgYW5kIHN0YW5kYXJkIGVycm9yIGZvcm11bGFzIj4gPHN0cm9uZz5WYXJpYW5jZSBhbmQgU3RhbmRhcmQgRXJyb3I6PC9zdHJvbmc+PGJyPiAkJCBcc2lnbWFeMl97XGhhdHtwfX0gPSBcZnJhY3twKDEtcCl9e259ICQkICQkIFNFKFxoYXR7cH0pID0gXHNxcnR7XGZyYWN7cCgxLXApfXtufX0gJCQgPGRpdiBjbGFzcz0ic3RlcC1ib3giIGRhdGEtdG9vbHRpcD0iSW1wb3J0YW50IG5vdGVzIGFib3V0IHZhcmlhbmNlIj4gPHN0cm9uZz5JbXBvcnRhbnQgTm90ZXM6PC9zdHJvbmc+PGJyPiAxLiBTdGFuZGFyZCBlcnJvciBkZWNyZWFzZXMgYXMgc2FtcGxlIHNpemUgaW5jcmVhc2VzPGJyPiAyLiBNYXhpbXVtIHZhcmlhbmNlIG9jY3VycyB3aGVuICRwID0gMC41JDxicj4gMy4gVmFyaWFuY2UgaXMgc21hbGxlc3Qgd2hlbiAkcCQgaXMgbmVhciAwIG9yIDEgPC9kaXY+IDwvZGl2PjxoMyB0aXRsZT0iTm9ybWFsIEFwcHJveGltYXRpb24gQ29uZGl0aW9ucyI+Tm9ybWFsIEFwcHJveGltYXRpb24gQ29uZGl0aW9uczwvaDM+PGRpdiBjbGFzcz0iZXhhbXBsZS1ib3giIGRhdGEtdG9vbHRpcD0iQ0xUIGNvbmRpdGlvbnMgZm9yIHByb3BvcnRpb25zIj4gPHN0cm9uZz5DZW50cmFsIExpbWl0IFRoZW9yZW0gZm9yIFByb3BvcnRpb25zOjwvc3Ryb25nPjxicj4gVGhlIHNhbXBsaW5nIGRpc3RyaWJ1dGlvbiBvZiAkXGhhdHtwfSQgaXMgYXBwcm94aW1hdGVseSBub3JtYWwgaWY6IDxkaXYgY2xhc3M9InN0ZXAtYm94IiBkYXRhLXRvb2x0aXA9IlByYWN0aWNhbCBjb25kaXRpb25zIj4gMS4gJG5wIFxnZSAxMCQ8YnI+IDIuICRuKDEtcCkgXGdlIDEwJDxicj4gPGVtPihUaGVzZSBhcmUgcHJhY3RpY2FsIHJ1bGVzIG9mIHRodW1iKTwvZW0+IDwvZGl2PiA8ZGl2IGNsYXNzPSJzdGVwLWJveCIgZGF0YS10b29sdGlwPSJOb3JtYWwgYXBwcm94aW1hdGlvbiBmb3JtdWxhIj4gPHN0cm9uZz5XaGVuIHNhdGlzZmllZDo8L3N0cm9uZz48YnI+ICQkIFxoYXR7cH0gXHNpbSBOXGxlZnQocCxcOyBcc3FydHtcZnJhY3twKDEtcCl9e259fVxyaWdodCkgJCQgPC9kaXY+IDwvZGl2PjxkaXYgY2xhc3M9ImZvcm11bGEtYm94IiBkYXRhLXRvb2x0aXA9Ilotc2NvcmUgY2FsY3VsYXRpb24gZm9yIHByb3BvcnRpb25zIj4gPHN0cm9uZz5aLXNjb3JlIENhbGN1bGF0aW9uIGZvciBQcm9wb3J0aW9uczo8L3N0cm9uZz48YnI+ICQkIHogPSBcZnJhY3tcaGF0e3B9IC0gcH17XHNxcnR7XGZyYWN7cCgxLXApfXtufX19ICQkIDxkaXYgY2xhc3M9InN0ZXAtYm94IiBkYXRhLXRvb2x0aXA9IkFwcGxpY2F0aW9ucyBvZiB6LXNjb3JlIj4gPHN0cm9uZz5Vc2VkIGZvcjo8L3N0cm9uZz48YnI+IOKAoiBGaW5kaW5nIHByb2JhYmlsaXRpZXMgZm9yIHNhbXBsZSBwcm9wb3J0aW9uczxicj4g4oCiIENvbnN0cnVjdGluZyBjb25maWRlbmNlIGludGVydmFsczxicj4g4oCiIEh5cG90aGVzaXMgdGVzdGluZyBhYm91dCBwcm9wb3J0aW9ucyA8L2Rpdj4gPC9kaXY+PGgyIHRpdGxlPSJQcmFjdGljYWwgRXhhbXBsZSBmcm9tIFZpZGVvIj5QcmFjdGljYWwgRXhhbXBsZSBmcm9tIFZpZGVvPC9oMj48ZGl2IGNsYXNzPSJleGFtcGxlLWJveCIgZGF0YS10b29sdGlwPSJFeGFtcGxlIHByb2JsZW0gZnJvbSB2aWRlbyI+IDxzdHJvbmc+VmlkZW8gRXhhbXBsZTogVm90ZXIgU3VwcG9ydCBTdXJ2ZXk8L3N0cm9uZz48YnI+IDxkaXYgY2xhc3M9InN0ZXAtYm94IiBkYXRhLXRvb2x0aXA9IlByb2JsZW0gc2NlbmFyaW8iPiA8c3Ryb25nPlNjZW5hcmlvOjwvc3Ryb25nPjxicj4g4oCiIFBvcHVsYXRpb24gcHJvcG9ydGlvbjogJHAgPSAwLjYwJCAoNjAlIHN1cHBvcnQgY2FuZGlkYXRlKTxicj4g4oCiIFNhbXBsZSBzaXplOiAkbiA9IDEwMCQ8YnI+IOKAoiBRdWVzdGlvbjogV2hhdCBpcyAkUChcaGF0e3B9ID4gMC42NSkkPyA8L2Rpdj4gPGRpdiBjbGFzcz0ic3RlcC1ib3giIGRhdGEtdG9vbHRpcD0iU3RlcC1ieS1zdGVwIHNvbHV0aW9uIj4gPHN0cm9uZz5Tb2x1dGlvbiBTdGVwczo8L3N0cm9uZz48YnI+IDEuIENoZWNrIG5vcm1hbCBhcHByb3hpbWF0aW9uOiAkbnAgPSA2MCQsICRuKDEtcCkgPSA0MCQg4pyTPGJyPiAyLiBDYWxjdWxhdGUgc3RhbmRhcmQgZXJyb3I6ICRTRSA9IFxzcXJ0e1xmcmFjezAuNiBcdGltZXMgMC40fXsxMDB9fSA9IDAuMDQ5JDxicj4gMy4gQ29tcHV0ZSB6LXNjb3JlOiAkeiA9IFxmcmFjezAuNjUgLSAwLjYwfXswLjA0OX0gPSAxLjAyJDxicj4gNC4gRmluZCBwcm9iYWJpbGl0eTogJFAoWiA+IDEuMDIpID0gMC4xNTM5JDxicj4gPGVtPkNvbmNsdXNpb246IFRoZXJlJ3MgYSAxNS4zOSUgY2hhbmNlIG9mIGdldHRpbmcgYSBzYW1wbGUgd2l0aCBvdmVyIDY1JSBzdXBwb3J0PC9lbT4gPC9kaXY+IDwvZGl2PjxoMyB0aXRsZT0iVmlzdWFsaXppbmcgdGhlIFNhbXBsaW5nIERpc3RyaWJ1dGlvbiI+VmlzdWFsaXppbmcgdGhlIFNhbXBsaW5nIERpc3RyaWJ1dGlvbjwvaDM+PGRpdiBjbGFzcz0ic2FtcGxpbmctcHJvcG9ydGlvbi12aXoiIGRhdGEtdG9vbHRpcD0iVmlzdWFsIGNoYXJhY3RlcmlzdGljcyBvZiBwcm9wb3J0aW9uIGRpc3RyaWJ1dGlvbiI+IDxkaXYgY2xhc3M9InNhbXBsaW5nLXByb3BvcnRpb24tdGl0bGUiPiBDaGFyYWN0ZXJpc3RpY3Mgb2YgJFxoYXR7cH0kIERpc3RyaWJ1dGlvbiA8L2Rpdj4gPGRpdiBjbGFzcz0ic3RlcC1ib3giIGRhdGEtdG9vbHRpcD0iRWZmZWN0IG9mIHNhbXBsZSBzaXplIG9uIHNoYXBlIj4gPHN0cm9uZz5TaGFwZSBDaGFuZ2VzIHdpdGggU2FtcGxlIFNpemU6PC9zdHJvbmc+PGJyPiDigKIgU21hbGwgJG4kOiBEaXNjcmV0ZSBkaXN0cmlidXRpb24gKGJpbm9taWFsLWxpa2UpPGJyPiDigKIgTGFyZ2UgJG4kOiBCZWxsLXNoYXBlZCBjdXJ2ZSAobm9ybWFsIGFwcHJveGltYXRpb24pPGJyPiDigKIgQXMgJG4kIGluY3JlYXNlczogRGlzdHJpYnV0aW9uIGJlY29tZXMgbW9yZSBjb25jZW50cmF0ZWQgYXJvdW5kICRwJCA8L2Rpdj4gPGRpdiBjbGFzcz0ic3RlcC1ib3giIGRhdGEtdG9vbHRpcD0iRWZmZWN0IG9mIHBvcHVsYXRpb24gcHJvcG9ydGlvbiI+IDxzdHJvbmc+RWZmZWN0IG9mICRwJCBvbiBEaXN0cmlidXRpb246PC9zdHJvbmc+PGJyPiDigKIgV2hlbiAkcCA9IDAuNSQ6IFN5bW1ldHJpYyBkaXN0cmlidXRpb248YnI+IOKAoiBXaGVuICRwJCBuZWFyIDAgb3IgMTogU2tld2VkIGRpc3RyaWJ1dGlvbiAobmVlZHMgbGFyZ2VyICRuJCBmb3Igbm9ybWFsIGFwcHJveGltYXRpb24pIDwvZGl2PiA8L2Rpdj48aDMgdGl0bGU9IkNvbXBhcmlzb246IE1lYW4gdnMgUHJvcG9ydGlvbiI+Q29tcGFyaXNvbjogTWVhbiB2cyBQcm9wb3J0aW9uIFNhbXBsaW5nPC9oMz48dGFibGUgY2xhc3M9ImNvbXBhcmlzb24tdGFibGUiPiA8dGhlYWQ+IDx0cj4gPHRoIGRhdGEtdG9vbHRpcD0iQ29tcGFyaXNvbiBhc3BlY3RzIj5Bc3BlY3Q8L3RoPiA8dGggZGF0YS10b29sdGlwPSJTYW1wbGUgbWVhbiBjaGFyYWN0ZXJpc3RpY3MiPlNhbXBsZSBNZWFuICgkXGJhcnt4fSQpPC90aD4gPHRoIGRhdGEtdG9vbHRpcD0iU2FtcGxlIHByb3BvcnRpb24gY2hhcmFjdGVyaXN0aWNzIj5TYW1wbGUgUHJvcG9ydGlvbiAoJFxoYXR7cH0kKTwvdGg+IDwvdHI+IDwvdGhlYWQ+IDx0Ym9keT4gPHRyPiA8dGQ+PHN0cm9uZz5Qb3B1bGF0aW9uIFBhcmFtZXRlcjwvc3Ryb25nPjwvdGQ+IDx0ZD4kXG11JCAocG9wdWxhdGlvbiBtZWFuKTwvdGQ+IDx0ZD4kcCQgKHBvcHVsYXRpb24gcHJvcG9ydGlvbik8L3RkPiA8L3RyPiA8dHI+IDx0ZD48c3Ryb25nPlNhbXBsZSBTdGF0aXN0aWM8L3N0cm9uZz48L3RkPiA8dGQ+JFxiYXJ7eH0gPSBcZnJhY3tcc3VtIHhfaX17bn0kPC90ZD4gPHRkPiRcaGF0e3B9ID0gXGZyYWN7WH17bn0kPC90ZD4gPC90cj4gPHRyPiA8dGQ+PHN0cm9uZz5TYW1wbGluZyBEaXN0cmlidXRpb24gTWVhbjwvc3Ryb25nPjwvdGQ+IDx0ZD4kXG11X3tcYmFye3h9fSA9IFxtdSQ8L3RkPiA8dGQ+JFxtdV97XGhhdHtwfX0gPSBwJDwvdGQ+IDwvdHI+IDx0cj4gPHRkPjxzdHJvbmc+U3RhbmRhcmQgRXJyb3IgRm9ybXVsYTwvc3Ryb25nPjwvdGQ+IDx0ZD4kU0UgPSBcZnJhY3tcc2lnbWF9e1xzcXJ0e259fSQ8L3RkPiA8dGQ+JFNFID0gXHNxcnR7XGZyYWN7cCgxLXApfXtufX0kPC90ZD4gPC90cj4gPHRyPiA8dGQ+PHN0cm9uZz5Ob3JtYWxpdHkgQ29uZGl0aW9uczwvc3Ryb25nPjwvdGQ+IDx0ZD4kbiBcZ2UgMzAkIChDTFQpPC90ZD4gPHRkPiRucCBcZ2UgMTAkIGFuZCAkbigxLXApIFxnZSAxMCQ8L3RkPiA8L3RyPiA8dHI+IDx0ZD48c3Ryb25nPkRhdGEgVHlwZTwvc3Ryb25nPjwvdGQ+IDx0ZD5RdWFudGl0YXRpdmUgKGNvbnRpbnVvdXMpPC90ZD4gPHRkPkNhdGVnb3JpY2FsIChiaW5hcnk6IHN1Y2Nlc3MvZmFpbHVyZSk8L3RkPiA8L3RyPiA8dHI+IDx0ZD48c3Ryb25nPkRpc3RyaWJ1dGlvbiBTaGFwZTwvc3Ryb25nPjwvdGQ+IDx0ZD5Ob3JtYWwgZm9yIGxhcmdlICRuJDwvdGQ+IDx0ZD5Ob3JtYWwgd2hlbiBjb25kaXRpb25zIG1ldDwvdGQ+IDwvdHI+IDwvdGJvZHk+IDwvdGFibGU+PGgzIHRpdGxlPSJSIEltcGxlbWVudGF0aW9uIGFuZCBTaW11bGF0aW9uIj5SIEltcGxlbWVudGF0aW9uIGFuZCBTaW11bGF0aW9uPC9oMz48ZGl2IGNsYXNzPSJyLWNvZGUtYmxvY2siIGRhdGEtdG9vbHRpcD0iUiBzaW11bGF0aW9uIG9mIHByb3BvcnRpb24gc2FtcGxpbmciPiA8ZGl2IGNsYXNzPSJyLWNvZGUtdGl0bGUiPiA8aT7wn5OKPC9pPiBTaW11bGF0aW5nIFNhbXBsaW5nIERpc3RyaWJ1dGlvbiBvZiAkXGhhdHtwfSQgPC9kaXY+DQoNCmBgYHtyfQ0KIyBTSU1VTEFUSU9OIE9GIFNBTVBMRSBQUk9QT1JUSU9OIERJU1RSSUJVVElPTg0KIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KDQojIFBvcHVsYXRpb24gcGFyYW1ldGVycw0KcF9wb3B1bGF0aW9uIDwtIDAuNjAgICAgICAjIFRydWUgcG9wdWxhdGlvbiBwcm9wb3J0aW9uDQpuX3NhbXBsZSA8LSAxMDAgICAgICAgICAgICMgU2FtcGxlIHNpemUNCm5fc2ltdWxhdGlvbnMgPC0gMTAwMDAgICAgIyBOdW1iZXIgb2Ygc2FtcGxlcyB0byBzaW11bGF0ZQ0KDQojIEZ1bmN0aW9uIHRvIGdlbmVyYXRlIG9uZSBzYW1wbGUgcHJvcG9ydGlvbg0KZ2VuZXJhdGVfc2FtcGxlX3Byb3BvcnRpb24gPC0gZnVuY3Rpb24ocCwgbikgew0KICAjIEdlbmVyYXRlIGJpbmFyeSBkYXRhIChCZXJub3VsbGkgdHJpYWxzKQ0KICBzYW1wbGVfZGF0YSA8LSByYmlub20obiwgMSwgcCkNCiAgIyBDYWxjdWxhdGUgc2FtcGxlIHByb3BvcnRpb24NCiAgcF9oYXQgPC0gbWVhbihzYW1wbGVfZGF0YSkNCiAgcmV0dXJuKHBfaGF0KQ0KfQ0KDQojIFJ1biBzaW11bGF0aW9uDQpzZXQuc2VlZCgxMjMpICAjIEZvciByZXByb2R1Y2liaWxpdHkNCnNhbXBsZV9wcm9wb3J0aW9ucyA8LSByZXBsaWNhdGUobl9zaW11bGF0aW9ucywgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbmVyYXRlX3NhbXBsZV9wcm9wb3J0aW9uKHBfcG9wdWxhdGlvbiwgbl9zYW1wbGUpKQ0KDQojIENhbGN1bGF0ZSBkZXNjcmlwdGl2ZSBzdGF0aXN0aWNzDQptZWFuX3NpbXVsYXRlZCA8LSBtZWFuKHNhbXBsZV9wcm9wb3J0aW9ucykNCnNlX3RoZW9yZXRpY2FsIDwtIHNxcnQocF9wb3B1bGF0aW9uICogKDEtcF9wb3B1bGF0aW9uKSAvIG5fc2FtcGxlKQ0Kc2VfZW1waXJpY2FsIDwtIHNkKHNhbXBsZV9wcm9wb3J0aW9ucykNCg0KIyBEaXNwbGF5IHJlc3VsdHMNCmNhdCgiPT09IFNBTVBMSU5HIERJU1RSSUJVVElPTiBTSU1VTEFUSU9OIFJFU1VMVFMgPT09XG4iKQ0KY2F0KCJQb3B1bGF0aW9uIHByb3BvcnRpb24gKHApOiIsIHBfcG9wdWxhdGlvbiwgIlxuIikNCmNhdCgiU2FtcGxlIHNpemUgKG4pOiIsIG5fc2FtcGxlLCAiXG4iKQ0KY2F0KCJOdW1iZXIgb2Ygc2ltdWxhdGlvbnM6Iiwgbl9zaW11bGF0aW9ucywgIlxuXG4iKQ0KY2F0KCJNZWFuIG9mIHNpbXVsYXRlZCBwzII6Iiwgcm91bmQobWVhbl9zaW11bGF0ZWQsIDQpLCAiXG4iKQ0KY2F0KCJUaGVvcmV0aWNhbCBTdGFuZGFyZCBFcnJvcjoiLCByb3VuZChzZV90aGVvcmV0aWNhbCwgNCksICJcbiIpDQpjYXQoIkVtcGlyaWNhbCBTdGFuZGFyZCBFcnJvcjoiLCByb3VuZChzZV9lbXBpcmljYWwsIDQpLCAiXG5cbiIpDQoNCiMgQ2hlY2sgbm9ybWFsaXR5IGNvbmRpdGlvbnMNCmNhdCgiPT09IE5PUk1BTElUWSBDT05ESVRJT05TIENIRUNLID09PVxuIikNCmNhdCgibnAgPSIsIG5fc2FtcGxlICogcF9wb3B1bGF0aW9uLCAiXG4iKQ0KY2F0KCJuKDEtcCkgPSIsIG5fc2FtcGxlICogKDEtcF9wb3B1bGF0aW9uKSwgIlxuIikNCmlmIChuX3NhbXBsZSAqIHBfcG9wdWxhdGlvbiA+PSAxMCAmJiBuX3NhbXBsZSAqICgxLXBfcG9wdWxhdGlvbikgPj0gMTApIHsNCiAgY2F0KCLinJMgQ29uZGl0aW9ucyBtZXQ6IE5vcm1hbCBhcHByb3hpbWF0aW9uIGlzIHZhbGlkXG4iKQ0KfSBlbHNlIHsNCiAgY2F0KCLinJcgQ29uZGl0aW9ucyBub3QgbWV0OiBDb25zaWRlciBhbHRlcm5hdGl2ZSBtZXRob2RzXG4iKQ0KfQ0KDQojIENhbGN1bGF0ZSBwcm9iYWJpbGl0eSBmb3Igc3BlY2lmaWMgdmFsdWUNCnRhcmdldF92YWx1ZSA8LSAwLjY1DQp6X2NhbGN1bGF0ZWQgPC0gKHRhcmdldF92YWx1ZSAtIHBfcG9wdWxhdGlvbikgLyBzZV90aGVvcmV0aWNhbA0KcHJvYmFiaWxpdHkgPC0gMSAtIHBub3JtKHpfY2FsY3VsYXRlZCkNCg0KY2F0KCJcbj09PSBQUk9CQUJJTElUWSBDQUxDVUxBVElPTiA9PT1cbiIpDQpjYXQoIlAocMyCID4iLCB0YXJnZXRfdmFsdWUsICIpOlxuIikNCmNhdCgiWi1zY29yZToiLCByb3VuZCh6X2NhbGN1bGF0ZWQsIDMpLCAiXG4iKQ0KY2F0KCJQcm9iYWJpbGl0eToiLCByb3VuZChwcm9iYWJpbGl0eSwgNCksICJcbiIpDQpjYXQoIlBlcmNlbnRhZ2U6Iiwgcm91bmQocHJvYmFiaWxpdHkgKiAxMDAsIDIpLCAiJVxuIikNCmBgYA0KDQo8L2Rpdj48aDMgdGl0bGU9IkludGVycHJldGF0aW9uIG9mIFJlc3VsdHMiPkludGVycHJldGF0aW9uIG9mIFJlc3VsdHM8L2gzPjxkaXYgY2xhc3M9ImV4YW1wbGUtYm94IiBkYXRhLXRvb2x0aXA9IkludGVycHJldGF0aW9uIG9mIHNpbXVsYXRpb24gcmVzdWx0cyI+IDxzdHJvbmc+S2V5IEluc2lnaHRzIGZyb20gU2ltdWxhdGlvbjo8L3N0cm9uZz4gPGRpdiBjbGFzcz0ic3RlcC1ib3giIGRhdGEtdG9vbHRpcD0iVW5iaWFzZWRuZXNzIGNvbmZpcm1hdGlvbiI+IDxzdHJvbmc+MS4gVW5iaWFzZWRuZXNzIENvbmZpcm1hdGlvbjo8L3N0cm9uZz48YnI+IOKAoiBTaW11bGF0ZWQgbWVhbiBvZiAkXGhhdHtwfSQg4omIIHBvcHVsYXRpb24gJHAkICgwLjYwKTxicj4g4oCiIEVtcGlyaWNhbCBTRSDiiYggdGhlb3JldGljYWwgU0U8YnI+IOKAoiBEZW1vbnN0cmF0ZXMgJFxoYXR7cH0kIGlzIGFuIHVuYmlhc2VkIGVzdGltYXRvciA8L2Rpdj4gPGRpdiBjbGFzcz0ic3RlcC1ib3giIGRhdGEtdG9vbHRpcD0iUHJhY3RpY2FsIGFwcGxpY2F0aW9ucyI+IDxzdHJvbmc+Mi4gUHJhY3RpY2FsIEFwcGxpY2F0aW9uczo8L3N0cm9uZz48YnI+IOKAoiBRdWFsaXR5IGNvbnRyb2w6IFByb2JhYmlsaXR5IG9mIGRlZmVjdCByYXRlIGV4Y2VlZGluZyB0aHJlc2hvbGQ8YnI+IOKAoiBFbGVjdGlvbiBmb3JlY2FzdGluZzogQ2hhbmNlIG9mIGNhbmRpZGF0ZSBnZXR0aW5nIGNlcnRhaW4gdm90ZSBwZXJjZW50YWdlPGJyPiDigKIgTWVkaWNhbCBzdHVkaWVzOiBQcm9iYWJpbGl0eSBvZiB0cmVhdG1lbnQgc3VjY2VzcyByYXRlIDwvZGl2PiA8ZGl2IGNsYXNzPSJzdGVwLWJveCIgZGF0YS10b29sdGlwPSJEZWNpc2lvbiBtYWtpbmcgaW1wbGljYXRpb25zIj4gPHN0cm9uZz4zLiBEZWNpc2lvbiBNYWtpbmc6PC9zdHJvbmc+PGJyPiDigKIgV2l0aCAxNS4zOSUgcHJvYmFiaWxpdHksIGEgc2FtcGxlIG9mIDEwMCBjb3VsZCBzaG93ID42NSUgc3VwcG9ydDxicj4g4oCiIEltcG9ydGFudCBmb3IgaW50ZXJwcmV0aW5nIHN1cnZleS9tYXJnaW4gb2YgZXJyb3IgPC9kaXY+IDwvZGl2PjxoMiB0aXRsZT0iUmVhbC1Xb3JsZCBBcHBsaWNhdGlvbnMiPlJlYWwtV29ybGQgQXBwbGljYXRpb25zPC9oMj48ZGl2IGNsYXNzPSJyZWZlcmVuY2UtYm94IiBkYXRhLXRvb2x0aXA9IlJlYWwtd29ybGQgYXBwbGljYXRpb25zIG9mIHByb3BvcnRpb24gYW5hbHlzaXMiPiA8c3Ryb25nPkNvbW1vbiBBcHBsaWNhdGlvbnMgaW4gVmFyaW91cyBGaWVsZHM6PC9zdHJvbmc+IDxvbD4gPGxpPjxzdHJvbmc+UG9saXRpY2FsIFBvbGxpbmc6PC9zdHJvbmc+IDxkaXYgY2xhc3M9InN0ZXAtYm94IiBkYXRhLXRvb2x0aXA9IlBvbGl0aWNhbCBwb2xsaW5nIGFwcGxpY2F0aW9ucyI+IOKAoiBFc3RpbWF0aW5nIGNhbmRpZGF0ZSBzdXBwb3J0PGJyPiDigKIgQ2FsY3VsYXRpbmcgbWFyZ2luIG9mIGVycm9yPGJyPiDigKIgRGV0ZXJtaW5pbmcgc2FtcGxlIHNpemUgbmVlZGVkIGZvciBkZXNpcmVkIHByZWNpc2lvbiA8L2Rpdj4gPC9saT4NCg0KPGxpPjxzdHJvbmc+UXVhbGl0eSBDb250cm9sOjwvc3Ryb25nPg0KPGRpdiBjbGFzcz0ic3RlcC1ib3giIGRhdGEtdG9vbHRpcD0iUXVhbGl0eSBjb250cm9sIGFwcGxpY2F0aW9ucyI+DQrigKIgTW9uaXRvcmluZyBkZWZlY3QgcmF0ZXMgaW4gbWFudWZhY3R1cmluZzxicj4NCuKAoiBTZXR0aW5nIGNvbnRyb2wgbGltaXRzIGZvciBwcm9wb3J0aW9uIGRlZmVjdGl2ZTxicj4NCuKAoiBEZXRlcm1pbmluZyBhY2NlcHRhYmxlIHF1YWxpdHkgbGV2ZWxzDQo8L2Rpdj4NCjwvbGk+DQoNCjxsaT48c3Ryb25nPk1lZGljYWwgUmVzZWFyY2g6PC9zdHJvbmc+DQo8ZGl2IGNsYXNzPSJzdGVwLWJveCIgZGF0YS10b29sdGlwPSJNZWRpY2FsIHJlc2VhcmNoIGFwcGxpY2F0aW9ucyI+DQrigKIgRXN0aW1hdGluZyB0cmVhdG1lbnQgc3VjY2VzcyByYXRlczxicj4NCuKAoiBDb21wYXJpbmcgcHJvcG9ydGlvbnMgYmV0d2VlbiB0cmVhdG1lbnQgZ3JvdXBzPGJyPg0K4oCiIENhbGN1bGF0aW5nIHJlcXVpcmVkIHNhbXBsZSBzaXplIGZvciBjbGluaWNhbCB0cmlhbHMNCjwvZGl2Pg0KPC9saT4NCg0KPGxpPjxzdHJvbmc+TWFya2V0IFJlc2VhcmNoOjwvc3Ryb25nPg0KPGRpdiBjbGFzcz0ic3RlcC1ib3giIGRhdGEtdG9vbHRpcD0iTWFya2V0IHJlc2VhcmNoIGFwcGxpY2F0aW9ucyI+DQrigKIgRXN0aW1hdGluZyBtYXJrZXQgc2hhcmU8YnI+DQrigKIgQ2FsY3VsYXRpbmcgY3VzdG9tZXIgc2F0aXNmYWN0aW9uIHJhdGVzPGJyPg0K4oCiIERldGVybWluaW5nIGJyYW5kIHByZWZlcmVuY2UgcHJvcG9ydGlvbnMNCjwvZGl2Pg0KPC9saT4NCjwvb2w+IDwvZGl2PjxoMyB0aXRsZT0iU3RhdGlzdGljYWwgRm9ybXVsYXMgZm9yIFByYWN0aWNlIj5TdGF0aXN0aWNhbCBGb3JtdWxhcyBmb3IgUHJhY3RpY2U8L2gzPjxkaXYgY2xhc3M9ImZvcm11bGEtYm94IiBkYXRhLXRvb2x0aXA9IkltcG9ydGFudCBzdGF0aXN0aWNhbCBmb3JtdWxhcyI+IDxzdHJvbmc+Q29uZmlkZW5jZSBJbnRlcnZhbCBmb3IgUHJvcG9ydGlvbjo8L3N0cm9uZz48YnI+ICQkIFxoYXR7cH0gXHBtIHpfe1xhbHBoYS8yfSBcdGltZXMgXHNxcnR7XGZyYWN7XGhhdHtwfSgxLVxoYXR7cH0pfXtufX0gJCQNCjxzdHJvbmc+TWFyZ2luIG9mIEVycm9yIEZvcm11bGE6PC9zdHJvbmc+DQoNCiQkDQpNRSA9IHpfe1xhbHBoYS8yfSBcdGltZXMgXHNxcnR7XGZyYWN7cCgxLXApfXtufX0NCiQkDQoNCg0KPHN0cm9uZz5TYW1wbGUgU2l6ZSBEZXRlcm1pbmF0aW9uOjwvc3Ryb25nPg0KDQokJA0KbiA9IFxsZWZ0KCBcZnJhY3t6X3tcYWxwaGEvMn19e01FfSBccmlnaHQpXjIgXCwgcCgxLXApDQokJA0KDQoNCjxkaXYgY2xhc3M9InN0ZXAtYm94IiBkYXRhLXRvb2x0aXA9Ik5vdGUgYWJvdXQgc2FtcGxlIHNpemUgY2FsY3VsYXRpb24iPiA8c3Ryb25nPk5vdGU6PC9zdHJvbmc+IFdoZW4gJHAkIGlzIHVua25vd24sIHVzZSAkcCA9IDAuNSQgZm9yIG1heGltdW0gc2FtcGxlIHNpemUgPC9kaXY+IDwvZGl2PjxoMiB0aXRsZT0iSW1wb3J0YW50IENvbnNpZGVyYXRpb25zIj5JbXBvcnRhbnQgQ29uc2lkZXJhdGlvbnM8L2gyPjxkaXYgY2xhc3M9ImNvbmNlcHQtaW50cm8iIGRhdGEtdG9vbHRpcD0iQ3JpdGljYWwgcG9pbnRzIHRvIHJlbWVtYmVyIj4gPHN0cm9uZz5Dcml0aWNhbCBQb2ludHMgdG8gUmVtZW1iZXI6PC9zdHJvbmc+IDxvbD4gPGxpPjxzdHJvbmc+SW5kZXBlbmRlbmNlIEFzc3VtcHRpb246PC9zdHJvbmc+IFNhbXBsZXMgbXVzdCBiZSBpbmRlcGVuZGVudCAocmFuZG9tIHNhbXBsaW5nKTwvbGk+IDxsaT48c3Ryb25nPjEwJSBDb25kaXRpb246PC9zdHJvbmc+IFNhbXBsZSBzaG91bGQgYmUg4omkIDEwJSBvZiBwb3B1bGF0aW9uIHdoZW4gc2FtcGxpbmcgd2l0aG91dCByZXBsYWNlbWVudDwvbGk+IDxsaT48c3Ryb25nPlN1Y2Nlc3MtRmFpbHVyZSBDb25kaXRpb246PC9zdHJvbmc+IE11c3QgY2hlY2sgJG5wIOKJpSAxMCQgYW5kICRuKDEtcCkg4omlIDEwJCBmb3Igbm9ybWFsIGFwcHJveGltYXRpb248L2xpPiA8bGk+PHN0cm9uZz5Db250aW51aXR5IENvcnJlY3Rpb246PC9zdHJvbmc+IEZvciBzbWFsbCBzYW1wbGVzLCBjb25zaWRlciBhZGRpbmcgwrEwLjUvbiB0byBpbXByb3ZlIG5vcm1hbCBhcHByb3hpbWF0aW9uPC9saT4gPC9vbD4gPC9kaXY+PGRpdiBjbGFzcz0iZXhhbXBsZS1ib3giIGRhdGEtdG9vbHRpcD0iQWx0ZXJuYXRpdmUgbWV0aG9kcyB3aGVuIG5vcm1hbCBhcHByb3hpbWF0aW9uIGZhaWxzIj4gPHN0cm9uZz5XaGVuIE5vcm1hbCBBcHByb3hpbWF0aW9uIEZhaWxzOjwvc3Ryb25nPiA8ZGl2IGNsYXNzPSJzdGVwLWJveCIgZGF0YS10b29sdGlwPSJBbHRlcm5hdGl2ZSBzdGF0aXN0aWNhbCBtZXRob2RzIj4gPHN0cm9uZz5BbHRlcm5hdGl2ZSBNZXRob2RzOjwvc3Ryb25nPjxicj4gMS4gPHN0cm9uZz5FeGFjdCBCaW5vbWlhbCBUZXN0Ojwvc3Ryb25nPiBVc2Ugd2hlbiAkbiQgaXMgc21hbGwgb3IgJHAkIGlzIGV4dHJlbWU8YnI+IDIuIDxzdHJvbmc+V2lsc29uIFNjb3JlIEludGVydmFsOjwvc3Ryb25nPiBCZXR0ZXIgZm9yIHNtYWxsIHNhbXBsZXMgb3IgZXh0cmVtZSBwcm9wb3J0aW9uczxicj4gMy4gPHN0cm9uZz5DbG9wcGVyLVBlYXJzb24gSW50ZXJ2YWw6PC9zdHJvbmc+IENvbnNlcnZhdGl2ZSBleGFjdCBtZXRob2Q8YnI+IDQuIDxzdHJvbmc+U2ltdWxhdGlvbi9Cb290c3RyYXA6PC9zdHJvbmc+IFJlc2FtcGxpbmcgbWV0aG9kcyBmb3IgYW55IHNhbXBsZSBzaXplIDwvZGl2PiA8L2Rpdj48aDMgdGl0bGU9IlJlZmVyZW5jZSBCb29rcyBhbmQgUmVzb3VyY2VzIj5SZWZlcmVuY2UgQm9va3MgYW5kIFJlc291cmNlczwvaDM+PGRpdiBjbGFzcz0icmVmZXJlbmNlLWJveCIgZGF0YS10b29sdGlwPSJSZWNvbW1lbmRlZCB0ZXh0Ym9va3MiPiA8c3Ryb25nPlJlY29tbWVuZGVkIFRleHRib29rczo8L3N0cm9uZz4gPG9sPiA8bGk+PHN0cm9uZz4iU3RhdGlzdGljcyBmb3IgQnVzaW5lc3MgYW5kIEVjb25vbWljcyI8L3N0cm9uZz4gYnkgQW5kZXJzb24sIFN3ZWVuZXksIGFuZCBXaWxsaWFtcyA8ZGl2IGNsYXNzPSJzdGVwLWJveCIgZGF0YS10b29sdGlwPSJCb29rIGRldGFpbHMiPiDigKIgQ2hhcHRlciA3OiBTYW1wbGluZyBhbmQgU2FtcGxpbmcgRGlzdHJpYnV0aW9uczxicj4g4oCiIEV4Y2VsbGVudCBwcmFjdGljYWwgZXhhbXBsZXMgd2l0aCBidXNpbmVzcyBhcHBsaWNhdGlvbnMgPC9kaXY+IDwvbGk+DQoNCjxsaT48c3Ryb25nPiJJbnRyb2R1Y3RvcnkgU3RhdGlzdGljcyI8L3N0cm9uZz4gYnkgUHJlbSBTLiBNYW5uDQo8ZGl2IGNsYXNzPSJzdGVwLWJveCIgZGF0YS10b29sdGlwPSJCb29rIGRldGFpbHMiPg0K4oCiIENoYXB0ZXIgNzogU2FtcGxpbmcgRGlzdHJpYnV0aW9uczxicj4NCuKAoiBDbGVhciBleHBsYW5hdGlvbnMgd2l0aCBzdGVwLWJ5LXN0ZXAgc29sdXRpb25zDQo8L2Rpdj4NCjwvbGk+DQoNCjxsaT48c3Ryb25nPiJUaGUgUHJhY3RpY2Ugb2YgU3RhdGlzdGljcyI8L3N0cm9uZz4gYnkgU3Rhcm5lcywgVGFib3IsIFlhdGVzLCBhbmQgTW9vcmUNCjxkaXYgY2xhc3M9InN0ZXAtYm94IiBkYXRhLXRvb2x0aXA9IkJvb2sgZGV0YWlscyI+DQrigKIgQ2hhcHRlciA3OiBTYW1wbGluZyBEaXN0cmlidXRpb25zPGJyPg0K4oCiIE1vZGVybiBhcHByb2FjaCB3aXRoIGVtcGhhc2lzIG9uIGRhdGEgYW5hbHlzaXMNCjwvZGl2Pg0KPC9saT4NCg0KPGxpPjxzdHJvbmc+IlN0YXRpc3RpY2FsIEluZmVyZW5jZSI8L3N0cm9uZz4gYnkgR2VvcmdlIENhc2VsbGEgYW5kIFJvZ2VyIEwuIEJlcmdlcg0KPGRpdiBjbGFzcz0ic3RlcC1ib3giIGRhdGEtdG9vbHRpcD0iQm9vayBkZXRhaWxzIj4NCuKAoiBDaGFwdGVyIDU6IFByb3BlcnRpZXMgb2YgYSBSYW5kb20gU2FtcGxlPGJyPg0K4oCiIFRoZW9yZXRpY2FsIGZvdW5kYXRpb24gZm9yIHNhbXBsaW5nIGRpc3RyaWJ1dGlvbnMNCjwvZGl2Pg0KPC9saT4NCg0KPGxpPjxzdHJvbmc+Ik9wZW5JbnRybyBTdGF0aXN0aWNzIjwvc3Ryb25nPiBieSBEaWV6LCBCYXJyLCBhbmQgw4dldGlua2F5YS1SdW5kZWwNCjxkaXYgY2xhc3M9InN0ZXAtYm94IiBkYXRhLXRvb2x0aXA9IkJvb2sgZGV0YWlscyI+DQrigKIgRnJlZSBvbmxpbmUgdGV4dGJvb2s8YnI+DQrigKIgQ2hhcHRlciA0OiBGb3VuZGF0aW9ucyBmb3IgSW5mZXJlbmNlPGJyPg0K4oCiIEluY2x1ZGVzIFIgZXhhbXBsZXMgYW5kIHByYWN0aWNlIHByb2JsZW1zDQo8L2Rpdj4NCjwvbGk+DQoNCg0KPGgxIHRpdGxlPSJCaW5vbWlhbCBEaXN0cmlidXRpb24gUmV2aWV3Ij5CaW5vbWlhbCBEaXN0cmlidXRpb24gUmV2aWV3PC9oMT4NCg0KPCEtLSBWSURFTyBMSU5LIERJVEFSVUggREkgQkFXQUggSlVEVUwgQkFCIC0tPg0KPGRpdiBjbGFzcz0idmlkZW8tYm94IiBkYXRhLXRvb2x0aXA9IldhdGNoIGNvbXByZWhlbnNpdmUgcmV2aWV3IG9mIHN0YXRpc3RpY2FsIGRpc3RyaWJ1dGlvbnMiPg0KPHN0cm9uZz5WaWRlbyBSZXZpZXc6PC9zdHJvbmc+DQo8YSBocmVmPSJodHRwczovL3lvdXR1LmJlL2MwbUZFTF9TV3pFP3NpPUxaZE9aWFNlUFpuX25JbGQiIHRhcmdldD0iX2JsYW5rIj4NClJldmlldzogU2FtcGxpbmcgRGlzdHJpYnV0aW9uIG9mIHRoZSBTYW1wbGUgUHJvcG9ydGlvbiwgQmlub21pYWwgRGlzdHJpYnV0aW9uLCBQcm9iYWJpbGl0eQ0KPC9hPg0KPC9kaXY+DQoNCjxoMiB0aXRsZT0iSW50cm9kdWN0aW9uIHRvIEJpbm9taWFsIERpc3RyaWJ1dGlvbiI+SW50cm9kdWN0aW9uIHRvIEJpbm9taWFsIERpc3RyaWJ1dGlvbjwvaDI+DQoNCjxkaXYgY2xhc3M9ImNvbmNlcHQtaW50cm8iIGRhdGEtdG9vbHRpcD0iQmFzaWMgY29uY2VwdHMgb2YgYmlub21pYWwgZGlzdHJpYnV0aW9uIj4NClRoZSBiaW5vbWlhbCBkaXN0cmlidXRpb24gaXMgb25lIG9mIHRoZSBtb3N0IGZ1bmRhbWVudGFsIGRpc2NyZXRlIHByb2JhYmlsaXR5IGRpc3RyaWJ1dGlvbnMgaW4gc3RhdGlzdGljcy4gSXQgbW9kZWxzIHRoZSBudW1iZXIgb2Ygc3VjY2Vzc2VzIGluIGEgZml4ZWQgbnVtYmVyIG9mIGluZGVwZW5kZW50IEJlcm5vdWxsaSB0cmlhbHMsIHdoZXJlIGVhY2ggdHJpYWwgaGFzIG9ubHkgdHdvIHBvc3NpYmxlIG91dGNvbWVzOiBzdWNjZXNzIG9yIGZhaWx1cmUuDQo8L2Rpdj4NCg0KPGgyIHRpdGxlPSJCaW5vbWlhbCBEaXN0cmlidXRpb24gRm9ybXVsYXMiPkJpbm9taWFsIERpc3RyaWJ1dGlvbiBGb3JtdWxhczwvaDI+DQoNCjxkaXYgY2xhc3M9ImZvcm11bGEtYm94IiBkYXRhLXRvb2x0aXA9Ik1hdGhlbWF0aWNhbCBmb3JtdWxhcyBmb3IgYmlub21pYWwgZGlzdHJpYnV0aW9uIj4NCjxzdHJvbmc+Qmlub21pYWwgUHJvYmFiaWxpdHkgTWFzcyBGdW5jdGlvbjo8L3N0cm9uZz48YnI+DQokJCBQKFggPSBrKSA9IFxiaW5vbXtufXtrfSBwXmsgKDEtcClee24ta30gJCQ8YnI+DQogIA0KICB3aGVyZToNCiAgJG4kID0gbnVtYmVyIG9mIHRyaWFsczxicj4NCiAgJGskID0gbnVtYmVyIG9mIHN1Y2Nlc3Nlczxicj4NCiAgJHAkID0gcHJvYmFiaWxpdHkgb2Ygc3VjY2VzcyBvbiBlYWNoIHRyaWFsPGJyPg0KICAkXGJpbm9te259e2t9ID0gXGZyYWN7biF9e2shKG4taykhfSQgPSBiaW5vbWlhbCBjb2VmZmljaWVudDxicj48YnI+DQogIA0KICBcWw0KICBcdGV4dHtNZWFuIG9mIEJpbm9taWFsIERpc3RyaWJ1dGlvbjp9IFxxdWFkIFxtdSA9IEUoWCkgPSBuIHANCiAgXF0NCiAgDQogIFBlbmplbGFzYW4gc2luZ2thdDo8YnI+DQogICRcbXUkID0gbWVhbiAvIHJhdGEtcmF0YSBkaXN0cmlidXNpPGJyPg0KICAkRShYKSQgPSBla3NwZWt0YXNpIGRhcmkgdmFyaWFiZWwgYWNhayAkWCQ8YnI+DQogICRuJCA9IGp1bWxhaCBwZXJjb2JhYW48YnI+DQogICRwJCA9IHByb2JhYmlsaXRhcyBzdWtzZXMgcGFkYSB0aWFwIHBlcmNvYmFhbjxicj48YnI+DQogIA0KICA8c3Ryb25nPioqVmFyaWFuY2Ugb2YgQmlub21pYWwgRGlzdHJpYnV0aW9uOioqPC9zdHJvbmc+DQogICQkIFxzaWdtYV4yID0gXG9wZXJhdG9ybmFtZXtWYXJ9KFgpID0gbnAoMS1wKSAkJDxicj4NCiAgDQogIDxzdHJvbmc+U3RhbmRhcmQgRGV2aWF0aW9uOjwvc3Ryb25nPg0KICAkJCBcc2lnbWEgPSBcc3FydHtucCgxLXApfSAkJDxicj4NCiAgDQogIDxzdHJvbmc+KipDb25kaXRpb25zIGZvciBCaW5vbWlhbCBEaXN0cmlidXRpb246Kio8L3N0cm9uZz48YnI+DQogIEZpeGVkIG51bWJlciBvZiB0cmlhbHMgJChuKSQ8YnI+DQogIEluZGVwZW5kZW50IHRyaWFsczxicj4NCiAgVHdvIHBvc3NpYmxlIG91dGNvbWVzIChzdWNjZXNzL2ZhaWx1cmUpPGJyPg0KICBDb25zdGFudCBwcm9iYWJpbGl0eSBvZiBzdWNjZXNzICQocCkkPGJyPjxicj4NCiAgDQogIDxzdHJvbmc+KipOb3JtYWwgQXBwcm94aW1hdGlvbiB0byB0aGUgQmlub21pYWw6Kio8L3N0cm9uZz48YnI+DQogIA0KICBOb3JtYWwgYXBwcm94aW1hdGlvbiBpcyBhcHByb3ByaWF0ZSBpZjo8YnI+DQogICRucCBcZ2UgMTAkPGJyPg0KICAkbigxLXApIFxnZSAxMCQ8YnI+PGJyPg0KICANCiAgXFsNCiAgXHRleHR7Tm9ybWFsIEFwcHJveGltYXRpb246fSBccXVhZCBYIFxzaW0gTiBcYmlnKCBuIHAsIFwsIG4gcCAoMSAtIHApIFxiaWcpDQogIFxdDQogIA0KICBQZW5qZWxhc2FuIHNpbmdrYXQ6PGJyPg0KICAkWCQgPSB2YXJpYWJlbCBhY2FrIGJpbm9taWFsPGJyPg0KICAkTihcbXUsXHNpZ21hXjIpJCA9IGRpc3RyaWJ1c2kgbm9ybWFsIGRlbmdhbiBtZWFuICRcbXUkIGRhbiB2YXJpYW5zICRcc2lnbWFeMiQ8YnI+DQogICRcbXUgPSBucCQgPSBtZWFuIGRhcmkgZGlzdHJpYnVzaSBiaW5vbWlhbDxicj4NCiAgJFxzaWdtYV4yID0gbnAoMS1wKSQgPSB2YXJpYW5zIGRhcmkgZGlzdHJpYnVzaSBiaW5vbWlhbDxicj4NCiAgRGlndW5ha2FuIGtldGlrYSAkbiQgYmVzYXIgZGFuICRwJCB0aWRhayB0ZXJsYWx1IGRla2F0IGRlbmdhbiAwIGF0YXUgMQ0KPC9kaXY+DQoNCjxoMiB0aXRsZT0iRXhhbXBsZSBQcm9ibGVtOiBCaW5vbWlhbCBEaXN0cmlidXRpb24iPkV4YW1wbGUgUHJvYmxlbTogQmlub21pYWwgRGlzdHJpYnV0aW9uPC9oMj4NCg0KPGRpdiBjbGFzcz0iZXhhbXBsZS1ib3giIGRhdGEtdG9vbHRpcD0iU3RlcC1ieS1zdGVwIGJpbm9taWFsIGRpc3RyaWJ1dGlvbiBwcm9ibGVtIj4NCjxzdHJvbmc+UHJvYmxlbTo8L3N0cm9uZz4gQSBtdWx0aXBsZS1jaG9pY2UgdGVzdCBoYXMgMjAgcXVlc3Rpb25zLCBlYWNoIHdpdGggNSBjaG9pY2VzLiBBIHN0dWRlbnQgZ3Vlc3NlcyByYW5kb21seSBvbiBhbGwgcXVlc3Rpb25zLiBXaGF0IGlzIHRoZSBwcm9iYWJpbGl0eSB0aGF0IHRoZSBzdHVkZW50IGdldHMgZXhhY3RseSA1IHF1ZXN0aW9ucyBjb3JyZWN0Pzxicj48YnI+DQoNCjxzdHJvbmc+KipTb2x1dGlvbiBTdGVwIGJ5IFN0ZXA6Kio8L3N0cm9uZz4NCiAgDQo8ZGl2IGNsYXNzPSJzdGVwLWJveCIgZGF0YS10b29sdGlwPSJTdGVwIDE6IElkZW50aWZ5IHBhcmFtZXRlcnMiPg0KPHN0cm9uZz5TdGVwIDE6PC9zdHJvbmc+IElkZW50aWZ5IHBhcmFtZXRlcnM8YnI+DQokbiA9IDIwJCAobnVtYmVyIG9mIHF1ZXN0aW9ucyk8YnI+DQokcCA9IFxmcmFjezF9ezV9ID0gMC4yJCAocHJvYmFiaWxpdHkgb2YgZ3Vlc3NpbmcgY29ycmVjdGx5KTxicj4NCiRrID0gNSQgKG51bWJlciBvZiBjb3JyZWN0IGFuc3dlcnMgd2FudGVkKQ0KPC9kaXY+DQogIA0KPGRpdiBjbGFzcz0ic3RlcC1ib3giIGRhdGEtdG9vbHRpcD0iU3RlcCAyOiBDYWxjdWxhdGUgYmlub21pYWwgY29lZmZpY2llbnQiPg0KPHN0cm9uZz5TdGVwIDI6PC9zdHJvbmc+IENhbGN1bGF0ZSBiaW5vbWlhbCBjb2VmZmljaWVudDxicj4NCiRcYmlub217MjB9ezV9ID0gXGZyYWN7MjAhfXs1ITE1IX0gPSBcZnJhY3syMCBcdGltZXMgMTkgXHRpbWVzIDE4IFx0aW1lcyAxNyBcdGltZXMgMTZ9ezUgXHRpbWVzIDQgXHRpbWVzIDMgXHRpbWVzIDIgXHRpbWVzIDF9ID0gMTU1MDQkDQo8L2Rpdj4NCiAgDQo8ZGl2IGNsYXNzPSJzdGVwLWJveCIgZGF0YS10b29sdGlwPSJTdGVwIDM6IEFwcGx5IGJpbm9taWFsIGZvcm11bGEiPg0KPHN0cm9uZz5TdGVwIDM6PC9zdHJvbmc+IEFwcGx5IGJpbm9taWFsIGZvcm11bGE8YnI+DQokUChYID0gNSkgPSBcYmlub217MjB9ezV9ICgwLjIpXjUgKDAuOCleezE1fSQNCjwvZGl2Pg0KICANCjxkaXYgY2xhc3M9InN0ZXAtYm94IiBkYXRhLXRvb2x0aXA9IlN0ZXAgNDogQ2FsY3VsYXRlIGVhY2ggY29tcG9uZW50Ij4NCjxzdHJvbmc+U3RlcCA0Ojwvc3Ryb25nPiBDYWxjdWxhdGUgZWFjaCBjb21wb25lbnQ8YnI+DQokKDAuMileNSA9IDAuMDAwMzIkPGJyPg0KJCgwLjgpXnsxNX0gPSAwLjAzNTE4JA0KPC9kaXY+DQogIA0KPGRpdiBjbGFzcz0ic3RlcC1ib3giIGRhdGEtdG9vbHRpcD0iU3RlcCA1OiBNdWx0aXBseSBhbGwgY29tcG9uZW50cyI+DQo8c3Ryb25nPlN0ZXAgNTo8L3N0cm9uZz4gTXVsdGlwbHkgYWxsIGNvbXBvbmVudHM8YnI+DQokUChYID0gNSkgPSAxNTUwNCBcdGltZXMgMC4wMDAzMiBcdGltZXMgMC4wMzUxOCA9IDE1NTA0IFx0aW1lcyAwLjAwMDAxMTI1NzYgPSAwLjE3NDYkDQo8L2Rpdj4NCiAgDQo8YnI+DQo8c3Ryb25nPioqQW5zd2VyOioqPC9zdHJvbmc+IFRoZSBwcm9iYWJpbGl0eSB0aGF0IHRoZSBzdHVkZW50IGdldHMgZXhhY3RseSA1IHF1ZXN0aW9ucyBjb3JyZWN0IGlzIDE3LjQ2JS4NCjwvZGl2Pg0KDQo8aDIgdGl0bGU9IkJvb2sgUmVmZXJlbmNlIGZvciBCaW5vbWlhbCBEaXN0cmlidXRpb24iPkJvb2sgUmVmZXJlbmNlPC9oMj4NCg0KPGRpdiBjbGFzcz0icmVmZXJlbmNlLWJveCIgZGF0YS10b29sdGlwPSJUZXh0Ym9vayByZWZlcmVuY2UgZm9yIGJpbm9taWFsIGRpc3RyaWJ1dGlvbiI+DQo8c3Ryb25nPlJvc3MsIFMuTS48L3N0cm9uZz4gKDIwMTQpLiA8ZW0+QSBGaXJzdCBDb3Vyc2UgaW4gUHJvYmFiaWxpdHk8L2VtPi4gUGVhcnNvbi48YnI+DQo8c3Ryb25nPkNoYXB0ZXIgNDo8L3N0cm9uZz4gRGlzY3JldGUgUmFuZG9tIFZhcmlhYmxlczxicj4NCjxzdHJvbmc+UGFnZXM6PC9zdHJvbmc+IDEyNS0xNjA8YnI+DQo8c3Ryb25nPlJlbGV2YW5jZTo8L3N0cm9uZz4gRXhjZWxsZW50IGNvdmVyYWdlIG9mIGJpbm9taWFsIGRpc3RyaWJ1dGlvbiB3aXRoIG51bWVyb3VzIGV4YW1wbGVzIGFuZCBhcHBsaWNhdGlvbnMuDQo8L2Rpdj4NCg0KPGgxIHRpdGxlPSJXZWVrIDExIFN1bW1hcnkgYW5kIENvbmNsdXNpb24iPlN1bW1hcnkgYW5kIENvbmNsdXNpb248L2gxPg0KDQo8ZGl2IGNsYXNzPSJzdW1tYXJ5LWNvbnRhaW5lciIgZGF0YS10b29sdGlwPSJXZWVrIDExIGtleSB0YWtlYXdheXMgc3VtbWFyeSI+DQo8ZGl2IGNsYXNzPSJjb25jZXB0LWludHJvIiBkYXRhLXRvb2x0aXA9Ik1haW4gY29uY2VwdHMgbGVhcm5lZCBpbiBXZWVrIDExIj4NCjxzdHJvbmc+KipLZXkgVGFrZWF3YXlzIGZyb20gV2VlayAxMToqKjwvc3Ryb25nPjxicj48YnI+DQogICAgDQo8ZGl2IGNsYXNzPSJzdW1tYXJ5LXBvaW50cyI+DQo8ZGl2IGNsYXNzPSJzdW1tYXJ5LXBvaW50IiBkYXRhLXRvb2x0aXA9IkNvbnRpbnVvdXMgZGlzdHJpYnV0aW9ucyBjb25jZXB0cyI+DQo8c3Ryb25nPjEuIENvbnRpbnVvdXMgUHJvYmFiaWxpdHkgRGlzdHJpYnV0aW9uczo8L3N0cm9uZz48YnI+DQpVbmRlcnN0YW5kaW5nIFBERiBhbmQgQ0RGIGlzIGZ1bmRhbWVudGFsIGZvciB3b3JraW5nIHdpdGggY29udGludW91cyB2YXJpYWJsZXMNCjwvZGl2Pg0KICAgICAgDQo8ZGl2IGNsYXNzPSJzdW1tYXJ5LXBvaW50IiBkYXRhLXRvb2x0aXA9IlNhbXBsaW5nIGRpc3RyaWJ1dGlvbnMgaW1wb3J0YW5jZSI+DQo8c3Ryb25nPjIuIFNhbXBsaW5nIERpc3RyaWJ1dGlvbnM6PC9zdHJvbmc+PGJyPg0KVGhlIGRpc3RyaWJ1dGlvbiBvZiBzYW1wbGUgc3RhdGlzdGljcyBmb3JtcyB0aGUgYmFzaXMgZm9yIHN0YXRpc3RpY2FsIGluZmVyZW5jZQ0KPC9kaXY+DQogICAgICANCjxkaXYgY2xhc3M9InN1bW1hcnktcG9pbnQiIGRhdGEtdG9vbHRpcD0iQ2VudHJhbCBMaW1pdCBUaGVvcmVtIHNpZ25pZmljYW5jZSI+DQo8c3Ryb25nPjMuIENlbnRyYWwgTGltaXQgVGhlb3JlbTo8L3N0cm9uZz48YnI+DQpPbmUgb2YgdGhlIG1vc3QgcG93ZXJmdWwgcmVzdWx0cyBpbiBzdGF0aXN0aWNzLCBlbmFibGluZyBub3JtYWwgYXBwcm94aW1hdGlvbnMNCjwvZGl2Pg0KICAgICAgDQo8ZGl2IGNsYXNzPSJzdW1tYXJ5LXBvaW50IiBkYXRhLXRvb2x0aXA9IlByb3BvcnRpb25zIHNhbXBsaW5nIGFwcGxpY2F0aW9ucyI+DQo8c3Ryb25nPjQuIFNhbXBsaW5nIERpc3RyaWJ1dGlvbiBvZiBQcm9wb3J0aW9uczo8L3N0cm9uZz48YnI+DQpFc3NlbnRpYWwgZm9yIGNhdGVnb3JpY2FsIGRhdGEgYW5hbHlzaXMgYW5kIHByb3BvcnRpb24gaW5mZXJlbmNlDQo8L2Rpdj4NCiAgICAgIA0KPGRpdiBjbGFzcz0ic3VtbWFyeS1wb2ludCIgZGF0YS10b29sdGlwPSJCaW5vbWlhbCBkaXN0cmlidXRpb24gZnVuZGFtZW50YWxzIj4NCjxzdHJvbmc+NS4gQmlub21pYWwgRGlzdHJpYnV0aW9uOjwvc3Ryb25nPjxicj4NCkZvdW5kYXRpb24gZm9yIHVuZGVyc3RhbmRpbmcgcHJvcG9ydGlvbnMgYW5kIGJpbmFyeSBvdXRjb21lcw0KPC9kaXY+DQo8L2Rpdj4NCjwvZGl2Pg0KPC9kaXY+DQoNCjxkaXYgY2xhc3M9ImZvb3Rlci1zZWN0aW9uIiBkYXRhLXRvb2x0aXA9IkFzc2lnbm1lbnQgY29tcGxldGlvbiBpbmZvcm1hdGlvbiI+DQo8cD48c3Ryb25nPldlZWsgMTEgLSBQcm9iYWJpbGl0eSBEaXN0cmlidXRpb248L3N0cm9uZz48L3A+DQo8cCBjbGFzcz0iZm9vdGVyLXRleHQiPmVuZCB8IFN0YXRpc3RpY3MgZm9yIERhdGEgU2NpZW5jZTwvcD4NCjwvZGl2Pg0KDQo=