Published: 2024-12-29
About This Report
This report provides analyses of inflation rates, and growth rates
across financial indexes, with the flexibility to explore publicly
traded stocks and ETFs. It evaluates their historical performance over
time, refining for accuracy of probable growth rates and inflation
trends. In this report, the term “index” is used broadly and may
interchangeably refer to a benchmark index (e.g., SPX), ETFs, mutual
funds, or even collections of individual publicly traded stocks, such as
Apple or Microsoft, representing specific market segments or investment
strategies.
Indexes serve as benchmarks for a variety of purposes, such as
investment comparisons, policy valuation, and strategic financial
planning. The report aims to assess the long-term viability and
comparative performance of these indexes in the context of value
generation, like variable annuities, mutual funds, exchange-traded funds
(ETFs), structured notes, target-date funds, retirement savings plans
(e.g., 401(k)s), and endowment policies. The SPX, QQQ, and BlackRock
Endura is utilized as external indexes for an Indexed Universal Life
(IUL) Insurance Policy product that’s been under review. I won’t delve
into the origins of that decision or about the policy here; the product
has its pros and cons—it is, after all, designed to be sold.
Difference in Data Accuracy Data is extracted from
difference sources before calculations are applied, therefore price and
rates may differ between this report and those presented from extracted
sources. For example, VGT historical data from Yahoo (https://finance.yahoo.com/quote/VGT/history/) contains
the open, high, low, close, and the adjusted close price for the daily,
monthly and yearly date frames. The Performance section (https://finance.yahoo.com/quote/VGT/performance/)
provides a YTD Trailing Return of +29.27% from 01/01/2024 thru
12/20/2024. This return rate is calculated from the 01/02/2024 Open
(477.67) and 12/20/2024 Open (617.37). This report utilizes the Close
when computing Return Rates, giving a +27.88% for YTD.
Additionally the filtered Historical Data between Daily and Monthly
do not equate. The filtered Monthly historical data (https://finance.yahoo.com/quote/VGT/history/?frequency=1mo)
by Yahoo gives a 03/01/2024 Closing Price (524.34), different from the
the Daily historical data (https://finance.yahoo.com/quote/VGT/history/) 03/01/2024
Closing Price (527.39). The Monthly Yahoo Data of 03/01/2024 Closing
Price (524.34) is equal to the Daily Yahoo Data of 03/28/2024 Closing
Price (524.34), which is the last Closing Price of that month. Yahoo
does not provide a disclaimer or notice regarding this issue.
Other databases will utilize the Average of All Closing Prices of the
Month, when providing Monthly Closing Prices. This is one of the issues
facing data accuracy.
Takeaway
This report would benefit from cleaning and further refinement; as of
12/29/2024 there’re a lot of content that makes the important data
difficult to find. For the time being, use the search / find section for
the “Takeaway”.
CPI
The CPI (Consumer Price Index) measures average change in prices over
time for a basket of goods and services commonly purchased by
households, such as food, clothing, and transportation. CPI is often
used to indicate inflation, reflecting how much the cost of living has
increased or decreased.
Inflation Targets
The historical inflation targets in the U.S. reflect the evolving
priorities of monetary policy. From 1913 to the 1970s, the Federal
Reserve did not have an explicit inflation target, focusing instead on
financial stability and economic growth. In the 1979–1980s, under Paul
Volcker, the Fed shifted to controlling inflation without a formal
target, implicitly aiming for low inflation. During the 1990s–2011,
global trends influenced the Fed to align informally with a 2% inflation
target, though it remained unofficial. Finally, in 2012, the Federal
Reserve formally adopted a 2% target, prioritizing price stability and
maximum employment as part of its dual mandate. This evolution
highlights the transition from reactive to proactive inflation
management.
Sources:
Historical Inflation Targets in the United States
Period
|
Inflation_Target
|
Policy_Focus
|
Source
|
1913–1970s
|
None
|
Financial stability and economic growth.
|
Federal Reserve Historical Overview
|
1979–1980s
|
Implicit (low inflation)
|
Price stability (Volcker’s anti-inflation focus).
|
Federal Reserve Monetary Policy History
|
1990s–2011
|
Implicit (~2%)
|
Informal alignment with global 2% targets.
|
Implicit trend in global monetary policy
|
2012–Present
|
Formal 2% Target
|
Price stability with a dual mandate.
|
Federal Reserve (2012 announcement)
|
Glossary
Name
|
Definition
|
Annual Inflation Rate
|
Also referred as “1-Year CAIR” for analytical purposes, this shows the
inflation rate for each “1-Year” or “YoY” as a percentage, based on the
Consumer Price Index (CPI) for All Urban Consumers in the United States.
It reflects the percentage change in CPI from December of the previous
year to December of the indicated year. A positive rate indicates an
increase in prices, while a negative rate (e.g., in 2009) shows
deflation.
|
CAIR
|
Compound Average Inflation Rate. The average yearly inflation rate over
the period, calculated as a mean inflation rate over a period if it had
compounded anually. It provides an idea of the typical inflation rate
experienced each year, smoothing out annual fluctuations and making it
more accurate for comparisons across time periods. A 5-Year CAIR
represents the annualized average rate of inflation over a five-year
period, accounting for compounding; it reflects the inflation rate as if
it were compounded each year over five years.
|
CIR
|
Cumulative Inflation Rate. The cumulative inflation rate over multiple
periods, accounting for compounding. It measures the total percentage
inflation from the initial to the final year in the series. It is the
total increase in prices over a given period without averaging it
annually. It’s the straightforward cumulative effect of inflation over
the specified time. A 5-Year CIR represents the total percentage
increase in an index or prices over a five-year period without averaging
or compounding on an annual basis. it shows the cumulative inflation
over the entire five years.
|
Close
|
The closing value of the Index on the Close Date. This represents the
value of the index at the end of that specific period, giving a snapshot
of the market’s performance.
|
Date
|
Specific Date when the Index is measured. Date varies by sources. Annual
inflation rate data presented in this dataframe is the average
percentage change in the Consumer Price Index (CPI) for all months
within that specified year.
|
Target Inflation Rate
|
The Federal Reserve aims for a 2% inflation rate over the longer run, as
measured by the annual change in the price index for personal
consumption expenditures. This target is considered most consistent with
the Federal Reserve’s mandate for maximum employment and price
stability. For more see https://www.federalreserve.gov/faqs/economy_14400.htm.
The 2% inflation rate became official target rate in 2012, but will be
used as the target rate across all years in this report.
|
CPI IR
Data
The CPI Inflation Rate (IR) is extracted from the Bureau of Labor
Statistics (BLS) website. The Annual Inflation Rate herein this report
represents the 12-month average percent changes from January to
December.
Data Source: Consumer Price Index for All Urban Consumers (CPI-U) via
CPI BLS at https://data.bls.gov/timeseries/CUUR0000SA0?years_option=all_years,
filtered to 12-Month Percent Change > Annual Averages.
Annual Inflation Rates (1913-2023)
Date
|
1-Year CAIR
|
Date
|
1-Year CAIR
|
2023
|
4.10%
|
1967
|
3.10%
|
2022
|
8.00%
|
1966
|
2.90%
|
2021
|
4.70%
|
1965
|
1.60%
|
2020
|
1.20%
|
1964
|
1.30%
|
2019
|
1.80%
|
1963
|
1.30%
|
2018
|
2.40%
|
1962
|
1.00%
|
2017
|
2.10%
|
1961
|
1.00%
|
2016
|
1.30%
|
1960
|
1.70%
|
2015
|
0.10%
|
1959
|
0.70%
|
2014
|
1.60%
|
1958
|
2.80%
|
2013
|
1.50%
|
1957
|
3.30%
|
2012
|
2.10%
|
1956
|
1.50%
|
2011
|
3.20%
|
1955
|
-0.40%
|
2010
|
1.60%
|
1954
|
0.70%
|
2009
|
-0.40%
|
1953
|
0.80%
|
2008
|
3.80%
|
1952
|
1.90%
|
2007
|
2.80%
|
1951
|
7.90%
|
2006
|
3.20%
|
1950
|
1.30%
|
2005
|
3.40%
|
1949
|
-1.20%
|
2004
|
2.70%
|
1948
|
8.10%
|
2003
|
2.30%
|
1947
|
14.40%
|
2002
|
1.60%
|
1946
|
8.30%
|
2001
|
2.80%
|
1945
|
2.30%
|
2000
|
3.40%
|
1944
|
1.70%
|
1999
|
2.20%
|
1943
|
6.10%
|
1998
|
1.60%
|
1942
|
10.90%
|
1997
|
2.30%
|
1941
|
5.00%
|
1996
|
3.00%
|
1940
|
0.70%
|
1995
|
2.80%
|
1939
|
-1.40%
|
1994
|
2.60%
|
1938
|
-2.10%
|
1993
|
3.00%
|
1937
|
3.60%
|
1992
|
3.00%
|
1936
|
1.50%
|
1991
|
4.20%
|
1935
|
2.20%
|
1990
|
5.40%
|
1934
|
3.10%
|
1989
|
4.80%
|
1933
|
-5.10%
|
1988
|
4.10%
|
1932
|
-9.90%
|
1987
|
3.60%
|
1931
|
-9.00%
|
1986
|
1.90%
|
1930
|
-2.30%
|
1985
|
3.60%
|
1929
|
0.00%
|
1984
|
4.30%
|
1928
|
-1.70%
|
1983
|
3.20%
|
1927
|
-1.70%
|
1982
|
6.20%
|
1926
|
1.10%
|
1981
|
10.30%
|
1925
|
2.30%
|
1980
|
13.50%
|
1924
|
0.00%
|
1979
|
11.30%
|
1923
|
1.80%
|
1978
|
7.60%
|
1922
|
-6.10%
|
1977
|
6.50%
|
1921
|
-10.50%
|
1976
|
5.80%
|
1920
|
15.60%
|
1975
|
9.10%
|
1919
|
14.60%
|
1974
|
11.00%
|
1918
|
18.00%
|
1973
|
6.20%
|
1917
|
17.40%
|
1972
|
3.20%
|
1916
|
7.90%
|
1971
|
4.40%
|
1915
|
1.00%
|
1970
|
5.70%
|
1914
|
1.00%
|
1969
|
5.50%
|
1913
|
NA
|
1968
|
4.20%
|
NA
|
NA
|
Summary
Annual Inflation Rate Summary (1913-2023)
Statistic
|
Value
|
Definition
|
Count of Observations
|
110
|
Total number of data points collected over the specific period.
|
CAIR
|
3.16%
|
Compound Average Inflation Rate; mean inflation rate over a period if it
had compounded anually.
|
Mean
|
3.27%
|
Reflects the general price level and overall inflation rate.
|
Median
|
2.75%
|
Middle value of the data when ordered chronologically; central tendency
measure less affected by extreme values.
|
Standard Deviation (Volatility)
|
4.69%
|
The dispersion of values from the mean, indicating the volatility of
price changes and economic stability.
|
Min CAIR Range (CAIR - SD)
|
-1.53%
|
Lower boundary of expected CPI range; lowest estimate of typical
inflation rate considering normal fluctuations.
|
Max CAIR Range (CAIR + SD)
|
7.85%
|
Upper boundary of expected CPI range; highest estimate of typical
inflation rate considering normal fluctuations.
|
Minimum
|
-10.5%
|
Lowest value; highlights periods of minimal inflation or deflationary
trends.
|
Maximum
|
18%
|
Highest value; highlights periods of peak inflationary pressures.
|
Above 2.0 Target
|
60%
|
Percentage of periods where inflation exceeded the 2.0% target,
indicating higher-than-desired inflation.
|
Below 2.0 Target
|
40%
|
Percentage of periods where inflation was below the 2.0% target,
suggesting potential deflationary pressures or insufficient inflation.
|
The annual inflation rate (3.16%) is lower than mean inflation rate
(3.27%), reflecting short-term volatility and inflation spikes. The
annual inflation rate (3.16%) is higher than mean inflation rate
(2.75%), indicating that sustained periods of below-median inflation
exerted cumulative upward pressure on price levels. This relationship
signals a distribution with notable extremes on the higher end (positive
skewness) while emphasizing that the long-term compounded effect is more
representative of the overall economic trend than either the mean or the
median alone. The standard deviation of 4.69% reflects significant
volatility, with inflation rates ranging from a deflationary low of
-10.5% to a peak of18%, and an expected range of -1.53% to 7.85% when
accounting for typical fluctuations. Notably, inflation exceeded the 2%
target in 60% of the years, indicating inflationary pressures, while
remaining below the target in 40% of the observations, signaling
deflationary trends or weaker inflation.
The 3.16% CAIR from 1913 to 2023 reflects the influence of major
historical events that caused significant inflation, including World
Wars, the Great Depression, and the 1970s oil crises. In contrast, the
2.76% CAIR, measured since the 1990 enactment of the Implicit 2% Target,
is notably lower. With the exception of the 2022 inflation rate of 8.0%,
rates after 1990 have stayed within the expected range of -1.53% to
7.85%.
Graph

Over the past century, the U.S. Consumer Price Index (CPI) has
exhibited significant fluctuations, with notable peaks during the
post-World War I era and the 1970s. The U.S. Consumer Price Index (CPI)
has experienced significant peaks due to various major events:
- World War I (1914–1918): The CPI surged to approximately 18% in
1918, driven by increased government spending and supply constraints
during the war.
- World War II (1939–1945): Inflation rose due to heightened demand
and production limitations, leading to price controls and rationing to
manage the economy.
- 1970s Oil Crises: The 1973 and 1979 oil embargoes led to energy
shortages and skyrocketing oil prices, causing inflation to peak around
14% in 1980.
- Early 1980s Recession: In response to high inflation, the Federal
Reserve increased interest rates, leading to a recession but eventually
stabilizing prices.
- COVID-19 Pandemic (2020–2021): Supply chain disruptions and economic
stimulus measures contributed to a significant rise in inflation, with
the CPI reaching levels not seen in decades.
However, in recent decades, these inflationary peaks have become less
pronounced, indicating a trend toward more stable inflation rates,
showing a narrowing of CPI volatility.
CPI CAIR
Data
You’ve probably seen or heard the phrase, “If you had invested $1,000
in [Company/Stock Name] back in [Year], your investment would be worth
[Current Value] today.” Or perhaps you’ve thought to yourself, “If I
had… I would have…” This is the result of cumulative growth captured in
a snapshot. The Cumulative Inflation Rate (CIR) represents the total
percentage increase in prices over time horizons of 5, 10, 20, and 30
years, reflecting the long-term cumulative impact of inflation (e.g., a
30-year CIR of 110.76% in 2023). Back-testing the data table with the
CPI Inflation Calculator (https://www.bls.gov/data/inflation_calculator.htm) gives
a +/- 1% margin of error.
In contrast, the Compound Average Inflation Rate (CAIR) represents
the average annualized inflation rate over the same periods, smoothing
short-term fluctuations (e.g., a 5-year CAIR of 3.93% in 2023). Compound
averages allow us to study the annualized rate required to achieve the
same total cumulative growth, providing a basis for making future
projections grounded in past performance.
Cumulative Inflation Rates (1913-2023)
Date
|
1-Year CAIR
|
5-Year CIR
|
10-Year CIR
|
20-Year CIR
|
30-Year CIR
|
2023
|
4.10%
|
21.27%
|
30.62%
|
65.31%
|
110.76%
|
2022
|
8.00%
|
19.29%
|
27.36%
|
62.45%
|
108.53%
|
2021
|
4.70%
|
12.77%
|
20.40%
|
52.82%
|
98.87%
|
2020
|
1.20%
|
9.11%
|
18.68%
|
50.05%
|
97.92%
|
2019
|
1.80%
|
7.92%
|
19.15%
|
53.31%
|
106.14%
|
2018
|
2.40%
|
7.71%
|
16.57%
|
53.92%
|
112.21%
|
2017
|
2.10%
|
6.77%
|
18.16%
|
52.71%
|
115.74%
|
2016
|
1.30%
|
6.77%
|
18.97%
|
53.01%
|
118.91%
|
2015
|
0.10%
|
8.77%
|
21.21%
|
55.58%
|
120.20%
|
2014
|
1.60%
|
10.40%
|
25.20%
|
59.78%
|
127.90%
|
2013
|
1.50%
|
8.22%
|
26.56%
|
61.35%
|
133.96%
|
2012
|
2.10%
|
10.68%
|
27.55%
|
63.73%
|
137.88%
|
2011
|
3.20%
|
11.44%
|
26.93%
|
65.18%
|
147.43%
|
2010
|
1.60%
|
11.44%
|
26.44%
|
66.78%
|
164.45%
|
2009
|
-0.40%
|
13.41%
|
28.68%
|
73.02%
|
195.43%
|
2008
|
3.80%
|
16.94%
|
32.04%
|
82.05%
|
230.13%
|
2007
|
2.80%
|
15.25%
|
29.24%
|
82.57%
|
242.22%
|
2006
|
3.20%
|
13.90%
|
28.61%
|
84.00%
|
254.53%
|
2005
|
3.40%
|
13.46%
|
28.36%
|
81.68%
|
263.47%
|
2004
|
2.70%
|
13.46%
|
27.62%
|
82.03%
|
283.50%
|
2003
|
2.30%
|
12.91%
|
27.49%
|
84.86%
|
314.50%
|
2002
|
1.60%
|
12.14%
|
28.36%
|
86.49%
|
330.30%
|
2001
|
2.80%
|
12.91%
|
30.13%
|
94.93%
|
337.07%
|
2000
|
3.40%
|
13.13%
|
31.90%
|
109.16%
|
343.88%
|
1999
|
2.20%
|
12.47%
|
34.46%
|
129.59%
|
353.75%
|
1998
|
1.60%
|
12.91%
|
37.88%
|
150.03%
|
368.40%
|
1997
|
2.30%
|
14.47%
|
41.27%
|
164.79%
|
380.39%
|
1996
|
3.00%
|
15.25%
|
43.06%
|
175.67%
|
384.14%
|
1995
|
2.80%
|
16.60%
|
41.54%
|
183.16%
|
383.67%
|
1994
|
2.60%
|
19.54%
|
42.64%
|
200.51%
|
378.03%
|
1993
|
3.00%
|
22.11%
|
45.00%
|
225.12%
|
371.97%
|
1992
|
3.00%
|
23.41%
|
45.28%
|
235.22%
|
364.18%
|
1991
|
4.20%
|
24.13%
|
49.80%
|
235.87%
|
355.17%
|
1990
|
5.40%
|
21.39%
|
58.57%
|
236.51%
|
341.19%
|
1989
|
4.80%
|
19.32%
|
70.75%
|
237.47%
|
325.70%
|
1988
|
4.10%
|
18.75%
|
81.34%
|
239.72%
|
309.05%
|
1987
|
3.60%
|
17.72%
|
87.44%
|
240.05%
|
303.94%
|
1986
|
1.90%
|
20.68%
|
92.69%
|
238.41%
|
302.77%
|
1985
|
3.60%
|
30.62%
|
100.06%
|
241.73%
|
301.19%
|
1984
|
4.30%
|
43.11%
|
110.68%
|
235.13%
|
285.70%
|
1983
|
3.20%
|
52.71%
|
124.22%
|
225.49%
|
272.39%
|
1982
|
6.20%
|
59.22%
|
130.73%
|
219.50%
|
263.73%
|
1981
|
10.30%
|
59.67%
|
124.22%
|
203.86%
|
249.00%
|
1980
|
13.50%
|
53.16%
|
112.22%
|
178.24%
|
241.41%
|
1979
|
11.30%
|
47.22%
|
97.64%
|
149.31%
|
204.71%
|
1978
|
7.60%
|
46.82%
|
87.34%
|
125.57%
|
170.49%
|
1977
|
6.50%
|
44.91%
|
81.42%
|
115.50%
|
171.74%
|
1976
|
5.80%
|
40.42%
|
75.63%
|
109.03%
|
191.90%
|
1975
|
9.10%
|
38.56%
|
70.81%
|
100.53%
|
198.80%
|
1974
|
11.00%
|
34.25%
|
59.07%
|
83.07%
|
180.17%
|
1973
|
6.20%
|
27.59%
|
45.17%
|
66.08%
|
156.70%
|
1972
|
3.20%
|
25.19%
|
38.47%
|
57.64%
|
156.46%
|
1971
|
4.40%
|
25.07%
|
35.52%
|
55.65%
|
175.59%
|
1970
|
5.70%
|
23.27%
|
31.11%
|
60.87%
|
177.18%
|
1969
|
5.50%
|
18.49%
|
26.15%
|
54.17%
|
164.07%
|
1968
|
4.20%
|
13.77%
|
20.41%
|
44.38%
|
146.80%
|
1967
|
3.10%
|
10.61%
|
18.79%
|
49.79%
|
131.87%
|
1966
|
2.90%
|
8.36%
|
19.02%
|
66.20%
|
133.00%
|
1965
|
1.60%
|
6.35%
|
17.40%
|
74.93%
|
129.83%
|
1964
|
1.30%
|
6.46%
|
15.09%
|
76.13%
|
131.19%
|
1963
|
1.30%
|
5.83%
|
14.41%
|
76.83%
|
135.29%
|
1962
|
1.00%
|
7.40%
|
13.84%
|
85.21%
|
120.43%
|
1961
|
1.00%
|
9.84%
|
14.86%
|
103.36%
|
96.64%
|
1960
|
1.70%
|
10.38%
|
22.70%
|
111.41%
|
77.17%
|
1959
|
0.70%
|
8.11%
|
22.22%
|
109.34%
|
70.20%
|
1958
|
2.80%
|
8.11%
|
19.91%
|
104.97%
|
69.02%
|
1957
|
3.30%
|
6.00%
|
26.10%
|
95.20%
|
61.62%
|
1956
|
1.50%
|
4.57%
|
39.65%
|
95.77%
|
53.80%
|
1955
|
-0.40%
|
11.16%
|
49.00%
|
95.77%
|
53.19%
|
1954
|
0.70%
|
13.06%
|
53.04%
|
100.88%
|
57.34%
|
1953
|
0.80%
|
10.92%
|
54.56%
|
105.66%
|
56.25%
|
1952
|
1.90%
|
18.96%
|
62.69%
|
93.63%
|
57.80%
|
1951
|
7.90%
|
33.55%
|
77.06%
|
71.20%
|
45.41%
|
1950
|
1.30%
|
34.04%
|
72.30%
|
44.39%
|
20.61%
|
1949
|
-1.20%
|
35.37%
|
71.28%
|
39.26%
|
37.64%
|
1948
|
8.10%
|
39.34%
|
70.93%
|
40.95%
|
59.65%
|
1947
|
14.40%
|
36.76%
|
54.80%
|
28.17%
|
74.27%
|
1946
|
8.30%
|
32.58%
|
40.19%
|
10.13%
|
78.84%
|
1945
|
2.30%
|
28.54%
|
31.39%
|
2.81%
|
78.18%
|
1944
|
1.70%
|
26.53%
|
31.26%
|
2.81%
|
75.92%
|
1943
|
6.10%
|
22.67%
|
33.06%
|
1.09%
|
74.71%
|
1942
|
10.90%
|
13.19%
|
19.02%
|
-3.00%
|
NA
|
1941
|
5.00%
|
5.74%
|
-3.30%
|
-17.87%
|
NA
|
1940
|
0.70%
|
2.22%
|
-16.20%
|
-30.00%
|
NA
|
1939
|
-1.40%
|
3.74%
|
-18.69%
|
-19.64%
|
NA
|
1938
|
-2.10%
|
8.47%
|
-17.54%
|
-6.60%
|
NA
|
1937
|
3.60%
|
5.15%
|
-17.20%
|
12.58%
|
NA
|
1936
|
1.50%
|
-8.55%
|
-21.44%
|
27.57%
|
NA
|
1935
|
2.20%
|
-18.01%
|
-21.75%
|
35.62%
|
NA
|
1934
|
3.10%
|
-21.62%
|
-21.67%
|
34.03%
|
NA
|
1933
|
-5.10%
|
-23.98%
|
-24.03%
|
31.30%
|
NA
|
1932
|
-9.90%
|
-21.26%
|
-18.50%
|
NA
|
NA
|
1931
|
-9.00%
|
-14.09%
|
-15.07%
|
NA
|
NA
|
1930
|
-2.30%
|
-4.56%
|
-16.47%
|
NA
|
NA
|
1929
|
0.00%
|
-0.06%
|
-1.16%
|
NA
|
NA
|
1928
|
-1.70%
|
-0.06%
|
13.27%
|
NA
|
NA
|
1927
|
-1.70%
|
3.50%
|
35.97%
|
NA
|
NA
|
1926
|
1.10%
|
-1.14%
|
62.39%
|
NA
|
NA
|
1925
|
2.30%
|
-12.48%
|
73.31%
|
NA
|
NA
|
1924
|
0.00%
|
-1.10%
|
71.11%
|
NA
|
NA
|
1923
|
1.80%
|
13.34%
|
72.82%
|
NA
|
NA
|
1922
|
-6.10%
|
31.38%
|
NA
|
NA
|
NA
|
1921
|
-10.50%
|
64.25%
|
NA
|
NA
|
NA
|
1920
|
15.60%
|
98.02%
|
NA
|
NA
|
NA
|
1919
|
14.60%
|
73.01%
|
NA
|
NA
|
NA
|
1918
|
18.00%
|
52.48%
|
NA
|
NA
|
NA
|
1917
|
17.40%
|
NA
|
NA
|
NA
|
NA
|
1916
|
7.90%
|
NA
|
NA
|
NA
|
NA
|
1915
|
1.00%
|
NA
|
NA
|
NA
|
NA
|
1914
|
1.00%
|
NA
|
NA
|
NA
|
NA
|
1913
|
NA
|
NA
|
NA
|
NA
|
NA
|
Compound Average Inflation Rates (1913-2023)
Date
|
1-Year CAIR
|
5-Year CAIR
|
10-Year CAIR
|
20-Year CAIR
|
30-Year CAIR
|
2023
|
4.10%
|
3.93%
|
2.71%
|
2.55%
|
2.52%
|
2022
|
8.00%
|
3.59%
|
2.45%
|
2.46%
|
2.48%
|
2021
|
4.70%
|
2.43%
|
1.87%
|
2.14%
|
2.32%
|
2020
|
1.20%
|
1.76%
|
1.73%
|
2.05%
|
2.30%
|
2019
|
1.80%
|
1.54%
|
1.77%
|
2.16%
|
2.44%
|
2018
|
2.40%
|
1.50%
|
1.55%
|
2.18%
|
2.54%
|
2017
|
2.10%
|
1.32%
|
1.68%
|
2.14%
|
2.60%
|
2016
|
1.30%
|
1.32%
|
1.75%
|
2.15%
|
2.65%
|
2015
|
0.10%
|
1.70%
|
1.94%
|
2.23%
|
2.67%
|
2014
|
1.60%
|
2.00%
|
2.27%
|
2.37%
|
2.78%
|
2013
|
1.50%
|
1.59%
|
2.38%
|
2.42%
|
2.87%
|
2012
|
2.10%
|
2.05%
|
2.46%
|
2.50%
|
2.93%
|
2011
|
3.20%
|
2.19%
|
2.41%
|
2.54%
|
3.07%
|
2010
|
1.60%
|
2.19%
|
2.37%
|
2.59%
|
3.29%
|
2009
|
-0.40%
|
2.55%
|
2.55%
|
2.78%
|
3.68%
|
2008
|
3.80%
|
3.18%
|
2.82%
|
3.04%
|
4.06%
|
2007
|
2.80%
|
2.88%
|
2.60%
|
3.06%
|
4.19%
|
2006
|
3.20%
|
2.64%
|
2.55%
|
3.10%
|
4.31%
|
2005
|
3.40%
|
2.56%
|
2.53%
|
3.03%
|
4.40%
|
2004
|
2.70%
|
2.56%
|
2.47%
|
3.04%
|
4.58%
|
2003
|
2.30%
|
2.46%
|
2.46%
|
3.12%
|
4.85%
|
2002
|
1.60%
|
2.32%
|
2.53%
|
3.17%
|
4.98%
|
2001
|
2.80%
|
2.46%
|
2.67%
|
3.39%
|
5.04%
|
2000
|
3.40%
|
2.50%
|
2.81%
|
3.76%
|
5.09%
|
1999
|
2.20%
|
2.38%
|
3.00%
|
4.24%
|
5.17%
|
1998
|
1.60%
|
2.46%
|
3.26%
|
4.69%
|
5.28%
|
1997
|
2.30%
|
2.74%
|
3.52%
|
4.99%
|
5.37%
|
1996
|
3.00%
|
2.88%
|
3.65%
|
5.20%
|
5.40%
|
1995
|
2.80%
|
3.12%
|
3.53%
|
5.34%
|
5.39%
|
1994
|
2.60%
|
3.63%
|
3.62%
|
5.66%
|
5.35%
|
1993
|
3.00%
|
4.08%
|
3.79%
|
6.07%
|
5.31%
|
1992
|
3.00%
|
4.30%
|
3.81%
|
6.23%
|
5.25%
|
1991
|
4.20%
|
4.42%
|
4.12%
|
6.24%
|
5.18%
|
1990
|
5.40%
|
3.95%
|
4.72%
|
6.26%
|
5.07%
|
1989
|
4.80%
|
3.60%
|
5.50%
|
6.27%
|
4.95%
|
1988
|
4.10%
|
3.50%
|
6.13%
|
6.31%
|
4.81%
|
1987
|
3.60%
|
3.32%
|
6.48%
|
6.31%
|
4.76%
|
1986
|
1.90%
|
3.83%
|
6.78%
|
6.29%
|
4.75%
|
1985
|
3.60%
|
5.49%
|
7.18%
|
6.34%
|
4.74%
|
1984
|
4.30%
|
7.43%
|
7.74%
|
6.23%
|
4.60%
|
1983
|
3.20%
|
8.84%
|
8.41%
|
6.08%
|
4.48%
|
1982
|
6.20%
|
9.75%
|
8.72%
|
5.98%
|
4.40%
|
1981
|
10.30%
|
9.81%
|
8.41%
|
5.71%
|
4.25%
|
1980
|
13.50%
|
8.90%
|
7.81%
|
5.25%
|
4.18%
|
1979
|
11.30%
|
8.04%
|
7.05%
|
4.67%
|
3.78%
|
1978
|
7.60%
|
7.98%
|
6.48%
|
4.15%
|
3.37%
|
1977
|
6.50%
|
7.70%
|
6.14%
|
3.91%
|
3.39%
|
1976
|
5.80%
|
7.03%
|
5.79%
|
3.76%
|
3.64%
|
1975
|
9.10%
|
6.74%
|
5.50%
|
3.54%
|
3.72%
|
1974
|
11.00%
|
6.07%
|
4.75%
|
3.07%
|
3.49%
|
1973
|
6.20%
|
4.99%
|
3.80%
|
2.57%
|
3.19%
|
1972
|
3.20%
|
4.60%
|
3.31%
|
2.30%
|
3.19%
|
1971
|
4.40%
|
4.58%
|
3.09%
|
2.24%
|
3.44%
|
1970
|
5.70%
|
4.27%
|
2.75%
|
2.41%
|
3.46%
|
1969
|
5.50%
|
3.45%
|
2.35%
|
2.19%
|
3.29%
|
1968
|
4.20%
|
2.61%
|
1.87%
|
1.85%
|
3.06%
|
1967
|
3.10%
|
2.04%
|
1.74%
|
2.04%
|
2.84%
|
1966
|
2.90%
|
1.62%
|
1.76%
|
2.57%
|
2.86%
|
1965
|
1.60%
|
1.24%
|
1.62%
|
2.84%
|
2.81%
|
1964
|
1.30%
|
1.26%
|
1.42%
|
2.87%
|
2.83%
|
1963
|
1.30%
|
1.14%
|
1.35%
|
2.89%
|
2.89%
|
1962
|
1.00%
|
1.44%
|
1.30%
|
3.13%
|
2.67%
|
1961
|
1.00%
|
1.90%
|
1.39%
|
3.61%
|
2.28%
|
1960
|
1.70%
|
2.00%
|
2.07%
|
3.81%
|
1.92%
|
1959
|
0.70%
|
1.57%
|
2.03%
|
3.76%
|
1.79%
|
1958
|
2.80%
|
1.57%
|
1.83%
|
3.65%
|
1.76%
|
1957
|
3.30%
|
1.17%
|
2.35%
|
3.40%
|
1.61%
|
1956
|
1.50%
|
0.90%
|
3.40%
|
3.42%
|
1.45%
|
1955
|
-0.40%
|
2.14%
|
4.07%
|
3.42%
|
1.43%
|
1954
|
0.70%
|
2.48%
|
4.35%
|
3.55%
|
1.52%
|
1953
|
0.80%
|
2.10%
|
4.45%
|
3.67%
|
1.50%
|
1952
|
1.90%
|
3.53%
|
4.99%
|
3.36%
|
1.53%
|
1951
|
7.90%
|
5.96%
|
5.88%
|
2.72%
|
1.26%
|
1950
|
1.30%
|
6.04%
|
5.59%
|
1.85%
|
0.63%
|
1949
|
-1.20%
|
6.24%
|
5.53%
|
1.67%
|
1.07%
|
1948
|
8.10%
|
6.86%
|
5.51%
|
1.73%
|
1.57%
|
1947
|
14.40%
|
6.46%
|
4.47%
|
1.25%
|
1.87%
|
1946
|
8.30%
|
5.80%
|
3.44%
|
0.48%
|
1.96%
|
1945
|
2.30%
|
5.15%
|
2.77%
|
0.14%
|
1.94%
|
1944
|
1.70%
|
4.82%
|
2.76%
|
0.14%
|
1.90%
|
1943
|
6.10%
|
4.17%
|
2.90%
|
0.05%
|
1.88%
|
1942
|
10.90%
|
2.51%
|
1.76%
|
-0.15%
|
NA
|
1941
|
5.00%
|
1.12%
|
-0.34%
|
-0.98%
|
NA
|
1940
|
0.70%
|
0.44%
|
-1.75%
|
-1.77%
|
NA
|
1939
|
-1.40%
|
0.74%
|
-2.05%
|
-1.09%
|
NA
|
1938
|
-2.10%
|
1.64%
|
-1.91%
|
-0.34%
|
NA
|
1937
|
3.60%
|
1.01%
|
-1.87%
|
0.59%
|
NA
|
1936
|
1.50%
|
-1.77%
|
-2.38%
|
1.23%
|
NA
|
1935
|
2.20%
|
-3.89%
|
-2.42%
|
1.54%
|
NA
|
1934
|
3.10%
|
-4.76%
|
-2.41%
|
1.48%
|
NA
|
1933
|
-5.10%
|
-5.34%
|
-2.71%
|
1.37%
|
NA
|
1932
|
-9.90%
|
-4.67%
|
-2.03%
|
NA
|
NA
|
1931
|
-9.00%
|
-2.99%
|
-1.62%
|
NA
|
NA
|
1930
|
-2.30%
|
-0.93%
|
-1.78%
|
NA
|
NA
|
1929
|
0.00%
|
-0.01%
|
-0.12%
|
NA
|
NA
|
1928
|
-1.70%
|
-0.01%
|
1.25%
|
NA
|
NA
|
1927
|
-1.70%
|
0.69%
|
3.12%
|
NA
|
NA
|
1926
|
1.10%
|
-0.23%
|
4.97%
|
NA
|
NA
|
1925
|
2.30%
|
-2.63%
|
5.65%
|
NA
|
NA
|
1924
|
0.00%
|
-0.22%
|
5.52%
|
NA
|
NA
|
1923
|
1.80%
|
2.54%
|
5.62%
|
NA
|
NA
|
1922
|
-6.10%
|
5.61%
|
NA
|
NA
|
NA
|
1921
|
-10.50%
|
10.43%
|
NA
|
NA
|
NA
|
1920
|
15.60%
|
14.64%
|
NA
|
NA
|
NA
|
1919
|
14.60%
|
11.59%
|
NA
|
NA
|
NA
|
1918
|
18.00%
|
8.80%
|
NA
|
NA
|
NA
|
1917
|
17.40%
|
NA
|
NA
|
NA
|
NA
|
1916
|
7.90%
|
NA
|
NA
|
NA
|
NA
|
1915
|
1.00%
|
NA
|
NA
|
NA
|
NA
|
1914
|
1.00%
|
NA
|
NA
|
NA
|
NA
|
1913
|
NA
|
NA
|
NA
|
NA
|
NA
|
Values “NA” exists for years where there is insufficient amount of
data. For example, since the dataset starts in 1913, there is not enough
years in 1930 to calculate for a 30-Year CAIR.
Summary
Compound Average Summary (1913-2023)
Statistic
|
1-Year CAIR
|
5-Year CAIR
|
10-Year CAIR
|
20-Year CAIR
|
30-Year CAIR
|
Overall
|
Count of Observations
|
110
|
106
|
101
|
91
|
81
|
489
|
Mean
|
3.27%
|
3.17%
|
2.99%
|
3.08%
|
3.33%
|
3.16%
|
Median
|
2.75%
|
2.54%
|
2.75%
|
3.03%
|
3.19%
|
2.81%
|
Standard Deviation (Volatility)
|
4.69%
|
3.31%
|
2.59%
|
1.87%
|
1.31%
|
3.1%
|
Min CAIR Range (CAIR - SD)
|
-1.53%
|
-0.15%
|
0.57%
|
1.29%
|
1.85%
|
0.06%
|
Max CAIR Range (CAIR + SD)
|
7.85%
|
6.47%
|
5.75%
|
5.03%
|
4.47%
|
6.26%
|
Minimum
|
-10.5%
|
-5.34%
|
-2.71%
|
-1.77%
|
0.63%
|
-10.5%
|
Maximum
|
18%
|
14.64%
|
8.72%
|
6.34%
|
5.4%
|
18%
|
Above 2.0 Target
|
60%
|
65.09%
|
69.31%
|
79.12%
|
77.78%
|
69.53%
|
Below 2.0 Target
|
40%
|
33.02%
|
30.69%
|
20.88%
|
22.22%
|
30.06%
|
The overall mean annual inflation rate stands at 3.16%, with a
standard deviation of 3.1%, indicating moderate volatility over the full
dataset from 1913 thru 2023. Shorter periods, such as the 1-Year and
5-Year CAIRs, exhibit greater variability, with standard deviations of
4.69% and 3.31%, respectively, reflecting sensitivity to short-term
economic fluctuations. Conversely, longer periods like the 20-Year and
30-Year CAIRs demonstrate significantly reduced volatility, with
standard deviations of 1.87% and 1.31%, respectively, highlighting that
extended durations offer a more stable and consistent view of inflation
trends.
Overall values are calculated from all numerical data across the CAIR
periods, providing a comprehensive representation of historical
inflation trends. We can, therefore, use the Overall CAIR Mean (3.16%)
as a baseline to evaluate inflationary pressures relative to historical
norms. The overall standard deviation quantifies the typical range of
inflation variability over time, providing a singular CAIR range
(0.06%-6.26)% that capture the bounds of typical historical
fluctuations.
Graph
These graphs illustrate the Rolling CAIR across varying time horizons
(1, 5, 10, 20, and 30 years) over different historical periods, with a
focus on the standard 2% inflation target. The green band represents
overall range where inflation rates align with historical norms, while
the red zones indicate periods of significant deviation. Shorter-term
CAIRs (e.g., 1-Year) display higher volatility, often exceeding the
target range, whereas longer-term CAIRs (e.g., 30-Year) are smoother and
remain more stable within the green band, reflecting cumulative
inflation effects and long-term stability.
All Periods
Short-Term
Compound Average Inflation Rates Across Short-Term Rolling
Periods

Long-Term
Compound Average Inflation Rates Across Long-Term Rolling
Periods

INDEXES
General Portfolio Types
Conservative Portfolios
Conservative investment strategies focus on capital preservation with
annual growth targets of 3%-5%. Typically, these portfolios consist of
20%-40% equities, with the majority allocated to bonds or other
income-generating assets. They are characterized by reduced volatility
and limited drawdowns (~10%-20%), making them suitable for risk-averse
individuals or those nearing retirement. For more on constructing
conservative portfolios, see Vanguard’s Asset Allocation Guide (https://investor.vanguard.com/investor-resources-education/education/model-portfolio-allocation).
Moderate Portfolios
Moderate portfolios typically target annual growth rates of 5%-7%,
balancing risk and return. These portfolios often allocate 60% to
stocks, such as SPX, and 40% to fixed-income assets like bonds. The
historical performance of moderate portfolios provides stable,
inflation-beating returns with lower volatility than aggressive
strategies, making them ideal for investors seeking steady growth
without high exposure to market swings. The concept aligns with insights
provided by Morningstar’s Portfolio Analysis (https://www.morningstar.com/products/portfolio-analysis).
Aggressive Portfolios
Aggressive portfolios aim for annual growth rates of 10%-12% and are
heavily weighted in equities, such as growth stocks, small-cap stocks,
and emerging markets. While these portfolios often outperform benchmarks
like SPX during bull markets, they carry significant volatility, with
potential drawdowns of ~50% during downturns. These strategies are ideal
for long-term investors willing to withstand fluctuations. Learn more
about growth-focused investing through Investopedia’s Aggressive Growth
Strategies (https://www.investopedia.com/terms/a/aggressiveinvestmentstrategy.asp).
Inflation to SPX
The SPX does not adjust for inflation, meaning its performance
reflects nominal returns. Inflation-adjusted (real) returns, which
subtract inflation rates (e.g., ~2%-3%), provide a clearer picture of
purchasing power. On average, SPX is widely accepted to deliver ~6%-7%
real annual returns after accounting for inflation. For historical
insights on inflation-adjusted returns, the Shiller CAPE Ratio dataset
(https://shillerdata.com/) is a valuable resource. This
dataset aligns SPX’s nominal prices with their real, inflation-adjusted
counterparts, offering insights into long-term market valuations.
Additionally, the U.S. Bureau of Labor Statistics provides a CPI
Inflation Calculator (https://www.bls.gov/data/inflation_calculator.htm),
which allows users to calculate the buying power of the dollar between
different dates, facilitating a better understanding of inflation’s
impact over time.
Conclusion
Investment strategies are aligned to each individual goals and risk
tolerances. Moderate portfolios balance growth and risk, conservative
strategies prioritize stability, and aggressive approaches focus on high
growth. Understanding inflation’s impact on nominal returns is critical
for evaluating real investment performance. For additional analysis
tools and historical data, consider reviewing Morningstar, Vanguard, and
the Shiller CAPE Ratio.
Preferred Targets
To effectively compare indexes over time, it’s essential to account
for inflation rates. I’ve set Subjective Target rates using the
calculated overall inflation rate (3.16%) and the assumed portfolio
growth rates. A higher inflation rate as a target serves as a
conservative buffer against inflationary volatility, aiding in the
selection of stocks or indexes that perform well in preserving
purchasing power during periods of elevated inflation. Monitoring
performance against these benchmarks helps narrow down which investment
or index provides better inflation-adjusted outcomes. To Ekko words once
said, “It’s not enough to give people what they need to survive; you
have to give them what they need to live.”
Growth Rate Targets
Target Type
|
Target Rate
|
Definition
|
Inflation
|
3.16%
|
Overall, Average Inflation Rate to stay afloat.
|
Conservative
|
6.16%
|
3% Growth Rate minimum, including inflation.
|
Moderate
|
8.16%
|
5% Growth Rate minimum, including inflation
|
Aggressive
|
13.16%
|
10% Growth Rate minimum, including inflation.
|
Glossary
Name
|
Definition
|
CAGR
|
Compound Average Growth Rate. The average yearly growth rate over the
period, calculated as a mean growth rate over a period if it had
compounded anually. It provides an idea of the typical growth rate
experienced each year, smoothing out annual fluctuations and making it
more accurate for comparisons across time periods. A 5-Year CAGR
represents the annualized average rate of growth over a five-year
period, accounting for compounding; it reflects the growth rate as if it
were compounded each year over five years.
|
CGR
|
Cumulative Growth Rate. The cumulative growth rate over multiple
periods, accounting for compounding. It measures the total percentage
growth from the initial to the final year in the series. It is the total
increase in prices over a given period without averaging it annually.
It’s the straightforward cumulative effect of growth over the specified
time. A 5-Year CGR represents the total percentage increase in an index
or prices over a five-year period without averaging or compounding on an
annual basis. it shows the cumulative growth over the entire five years.
|
Close
|
The closing value of the Index on the Close Date. This represents the
value of the index at the end of that specific period, giving a snapshot
of the market’s performance.
|
Date
|
Specific Date when the Index is measured. Date varies by sources.
|
SPX
The S&P 500, short for the Standard & Poor’s 500 Index and
commonly known by its ticker symbol SPX, is a widely recognized
benchmark that tracks the performance of 500 of the largest publicly
traded companies in the United States. It represents a broad spectrum of
industries, including technology, healthcare, finance, and energy, and
is often used as a gauge of overall market health and economic
performance. The index is weighted by market capitalization, meaning
companies with larger market values have a greater impact on its
performance. As a key indicator for investors, it reflects the growth
and volatility of the U.S. stock market and serves as a baseline for
measuring investment returns across a variety of portfolios.
SPX GR
Data
The SPX data presented here, sourced from Multpl, spans from the year
1900 onward. Multpl is a financial data platform that provides
historical and current metrics for SPX, including prices,
price-to-earnings ratios, and inflation-adjusted values, offering
investors insights into market trends over time. Each “Close” (Closing
Price) represents the average of each month’s closing prices; for
example, the price for January 1, 2024, reflects the average of all
January closing prices. By cross-referencing the January 1, 2024,
monthly close from Multpl with the average of all January 2024 closing
prices from Webull Trading Platform (an unrelated platform), we can
assume these databases are accurate and consistent with other major
financial data sources.
Data Source: S&P 500 Index - SPX Historical Chart | Multpl via https://www.multpl.com/s-p-500-historical-prices/table/by-month
Summary
Annual Growth Rate Summary (1900-2024)
Statistic
|
Value
|
Definition
|
Count of Observations
|
124
|
Total number of data points collected over the specific period.
|
CAGR
|
5.53%
|
Compound Average Growth Rate; mean growth rate over a period if it had
compounded anually.
|
Mean
|
7.17%
|
Reflects the general price level and overall growth rate.
|
Median
|
9.39%
|
Middle value of the data when ordered chronologically; central tendency
measure less affected by extreme values.
|
Standard Deviation (Volatility)
|
18.13%
|
The dispersion of values from the mean, indicating the volatility of
price changes and economic stability.
|
Min CAGR Range (CAGR - SD)
|
-12.6%
|
Lower boundary of expected SPX range; lowest estimate of typical growth
rate considering normal fluctuations.
|
Max CAGR Range (CAGR + SD)
|
23.66%
|
Upper boundary of expected SPX range; highest estimate of typical growth
rate considering normal fluctuations.
|
Minimum
|
-48.06%
|
Lowest growth rate.
|
Maximum
|
48.66%
|
Highest growth rate.
|
Percent Above Inflation Target
|
61.29%
|
Percentage of values above the inflation target specified in Preferred
Targets section.
|
Percent Above Conservative Target
|
55.65%
|
Percentage of values above the conservative target specified in
Preferred Targets section.
|
Percent Above Moderate Target
|
54.03%
|
Percentage of values above the moderate target specified in Preferred
Targets section.
|
Percent Above Aggressive Target
|
40.32%
|
Percentage of values above the aggressive target specified in Preferred
Targets section.
|
SPX’s Index exhibits a baseline CAGR at 5.53%, lower than the mean
growth rate of 7.17%, reflecting the impact of short-term volatility and
growth spikes. The median return of 9.39% indicates that more than half
of the observed years experienced returns above the mean. The
relationship between the CAGR and the median growth rate suggests that
sustained periods of above-median growth have exerted cumulative upward
pressure on overall price levels. This relationship highlights a
distribution with notable extremes on the higher end, reflecting
positive skewness. This positive skewness implies that while more than
half of the observed years experienced returns above the mean, downturns
can be severe. However, the market has historically provided substantial
upside potential. Additionally, the fact that 61.29% of the years
exceeded the inflation target reinforces SPX’s effectiveness as a
long-term hedge against inflation.
The standard deviation of 18.13% underscores significant volatility,
a common feature of equity markets. The highly volatile range of annual
returns, spanning from -48.06% to 48.66%, illustrates a highly volatile
market environment, partly due to its composition, with the potential
for both extreme gains and losses.
For SPX to be considered a high-performing and resilient long-term
investment, it would be ideal to exceed the aggressive target (e.g., 10%
annualized returns, accounting for higher inflation-adjusted performance
expectations) in at least 40%-50% of the years. This range reflects the
potential for strong upside in many years while balancing the
understanding that markets do experience downturns. The fact that 40.32%
of the years exceeded the aggressive target suggests that while not
consistent, SPX has historically provided robust growth over the long
term, making it a viable investment for those with a higher risk
tolerance.
SPX CAGR
Data
Compound Average Growth Rates (1900-2024)
Date
|
Close
|
1-Year CAGR
|
5-Year CAGR
|
10-Year CAGR
|
20-Year CAGR
|
30-Year CAGR
|
2024-12-17
|
6,070.23
|
26.34%
|
13.11%
|
11.59%
|
8.53%
|
8.94%
|
2024-01-01
|
4,804.49
|
21.31%
|
13.00%
|
10.18%
|
7.49%
|
8.03%
|
2023-01-01
|
3,960.66
|
-13.41%
|
7.26%
|
10.34%
|
7.72%
|
7.64%
|
2022-01-01
|
4,573.82
|
20.56%
|
14.99%
|
13.40%
|
7.19%
|
8.32%
|
2021-01-01
|
3,793.75
|
15.73%
|
14.61%
|
11.45%
|
5.36%
|
8.53%
|
2020-01-01
|
3,278.20
|
25.73%
|
10.08%
|
11.30%
|
4.25%
|
7.85%
|
2019-01-01
|
2,607.39
|
-6.54%
|
7.43%
|
11.66%
|
3.75%
|
7.65%
|
2018-01-01
|
2,789.80
|
22.62%
|
13.51%
|
7.30%
|
5.46%
|
8.37%
|
2017-01-01
|
2,275.12
|
18.58%
|
11.83%
|
4.80%
|
5.59%
|
7.44%
|
2016-01-01
|
1,918.60
|
-5.40%
|
8.39%
|
4.14%
|
5.86%
|
7.68%
|
2015-01-01
|
2,028.18
|
11.29%
|
12.54%
|
5.55%
|
7.64%
|
8.58%
|
2014-01-01
|
1,822.36
|
23.10%
|
16.06%
|
4.87%
|
6.98%
|
8.31%
|
2013-01-01
|
1,480.40
|
13.83%
|
1.43%
|
5.15%
|
6.31%
|
8.07%
|
2012-01-01
|
1,300.58
|
1.40%
|
-1.80%
|
1.32%
|
5.86%
|
8.35%
|
2011-01-01
|
1,282.62
|
14.15%
|
0.06%
|
-0.40%
|
7.10%
|
7.85%
|
2010-01-01
|
1,123.58
|
29.81%
|
-1.00%
|
-2.35%
|
6.16%
|
8.02%
|
2009-01-01
|
865.58
|
-37.22%
|
-5.23%
|
-3.60%
|
5.70%
|
7.47%
|
2008-01-01
|
1,378.76
|
-3.19%
|
9.01%
|
3.65%
|
8.90%
|
9.51%
|
2007-01-01
|
1,424.16
|
11.37%
|
4.55%
|
6.39%
|
8.78%
|
9.12%
|
2006-01-01
|
1,278.73
|
8.24%
|
-0.87%
|
7.60%
|
9.50%
|
8.98%
|
2005-01-01
|
1,181.41
|
4.32%
|
-3.69%
|
9.77%
|
10.13%
|
9.75%
|
2004-01-01
|
1,132.52
|
26.42%
|
-1.94%
|
9.12%
|
10.06%
|
8.57%
|
2003-01-01
|
895.84
|
-21.43%
|
-1.44%
|
7.49%
|
9.56%
|
6.98%
|
2002-01-01
|
1,140.21
|
-14.63%
|
8.27%
|
10.61%
|
12.04%
|
8.33%
|
2001-01-01
|
1,335.63
|
-6.31%
|
16.80%
|
15.16%
|
12.23%
|
9.27%
|
2000-01-01
|
1,425.59
|
14.16%
|
25.10%
|
15.41%
|
13.62%
|
9.63%
|
1999-01-01
|
1,248.77
|
29.63%
|
21.43%
|
15.91%
|
13.47%
|
8.71%
|
1998-01-01
|
963.36
|
25.73%
|
17.22%
|
14.42%
|
12.57%
|
8.03%
|
1997-01-01
|
766.22
|
24.71%
|
12.99%
|
11.22%
|
10.51%
|
7.63%
|
1996-01-01
|
614.42
|
32.06%
|
13.55%
|
11.43%
|
9.68%
|
6.48%
|
1995-01-01
|
465.25
|
-1.64%
|
6.48%
|
10.49%
|
9.74%
|
5.78%
|
1994-01-01
|
472.99
|
8.68%
|
10.63%
|
11.01%
|
8.29%
|
6.26%
|
1993-01-01
|
435.23
|
4.60%
|
11.68%
|
11.67%
|
6.73%
|
6.54%
|
1992-01-01
|
416.08
|
27.83%
|
9.48%
|
13.50%
|
7.21%
|
6.17%
|
1991-01-01
|
325.49
|
-4.26%
|
9.35%
|
9.36%
|
6.44%
|
5.82%
|
1990-01-01
|
339.97
|
19.12%
|
14.65%
|
11.85%
|
6.85%
|
6.07%
|
1989-01-01
|
285.40
|
13.93%
|
11.39%
|
11.09%
|
5.28%
|
5.60%
|
1988-01-01
|
250.50
|
-5.29%
|
11.66%
|
10.75%
|
4.97%
|
6.21%
|
1987-01-01
|
264.50
|
27.04%
|
17.66%
|
9.81%
|
5.87%
|
6.05%
|
1986-01-01
|
208.20
|
21.33%
|
9.38%
|
7.95%
|
4.09%
|
5.31%
|
1985-01-01
|
171.60
|
3.12%
|
9.12%
|
8.99%
|
3.51%
|
5.38%
|
1984-01-01
|
166.40
|
15.32%
|
10.79%
|
5.64%
|
3.97%
|
6.46%
|
1983-01-01
|
144.30
|
23.02%
|
9.84%
|
2.00%
|
4.06%
|
5.85%
|
1982-01-01
|
117.30
|
-11.80%
|
2.48%
|
1.28%
|
2.68%
|
5.40%
|
1981-01-01
|
133.00
|
19.93%
|
6.55%
|
3.59%
|
4.08%
|
6.31%
|
1980-01-01
|
110.90
|
11.22%
|
8.85%
|
2.08%
|
3.29%
|
6.48%
|
1979-01-01
|
99.71
|
10.48%
|
0.74%
|
-0.23%
|
2.96%
|
6.43%
|
1978-01-01
|
90.25
|
-13.05%
|
-5.28%
|
-0.52%
|
4.01%
|
6.20%
|
1977-01-01
|
103.80
|
7.16%
|
0.10%
|
2.08%
|
4.22%
|
6.61%
|
1976-01-01
|
96.86
|
33.49%
|
0.71%
|
0.37%
|
4.01%
|
5.77%
|
1975-01-01
|
72.56
|
-24.50%
|
-4.28%
|
-1.70%
|
3.62%
|
5.77%
|
1974-01-01
|
96.11
|
-18.83%
|
-1.18%
|
2.31%
|
6.87%
|
7.23%
|
1973-01-01
|
118.40
|
14.62%
|
4.49%
|
6.17%
|
7.84%
|
8.55%
|
1972-01-01
|
103.30
|
10.49%
|
4.11%
|
4.11%
|
7.53%
|
8.50%
|
1971-01-01
|
93.49
|
3.52%
|
0.04%
|
4.58%
|
7.70%
|
7.54%
|
1970-01-01
|
90.31
|
-11.46%
|
0.95%
|
4.52%
|
8.75%
|
6.87%
|
1969-01-01
|
102.00
|
7.32%
|
5.94%
|
6.25%
|
9.93%
|
7.25%
|
1968-01-01
|
95.04
|
12.54%
|
7.87%
|
8.74%
|
9.73%
|
7.35%
|
1967-01-01
|
84.45
|
-9.50%
|
4.10%
|
6.40%
|
8.95%
|
5.37%
|
1966-01-01
|
93.32
|
8.36%
|
9.34%
|
7.77%
|
8.57%
|
6.59%
|
1965-01-01
|
86.12
|
12.65%
|
8.22%
|
9.24%
|
9.71%
|
7.72%
|
1964-01-01
|
76.45
|
17.51%
|
6.57%
|
11.62%
|
9.77%
|
6.83%
|
1963-01-01
|
65.06
|
-5.81%
|
9.61%
|
9.53%
|
9.77%
|
7.67%
|
1962-01-01
|
69.07
|
15.66%
|
8.74%
|
11.06%
|
10.77%
|
7.32%
|
1961-01-01
|
59.72
|
2.91%
|
6.23%
|
10.91%
|
9.05%
|
4.49%
|
1960-01-01
|
58.03
|
4.33%
|
10.27%
|
13.14%
|
8.07%
|
3.33%
|
1959-01-01
|
55.62
|
35.26%
|
16.92%
|
13.73%
|
7.75%
|
2.72%
|
1958-01-01
|
41.12
|
-9.49%
|
9.45%
|
10.74%
|
6.67%
|
2.88%
|
1957-01-01
|
45.43
|
2.90%
|
13.43%
|
11.56%
|
4.86%
|
4.15%
|
1956-01-01
|
44.15
|
24.02%
|
15.79%
|
9.37%
|
6.00%
|
4.25%
|
1955-01-01
|
35.60
|
39.83%
|
16.10%
|
10.19%
|
6.97%
|
4.13%
|
1954-01-01
|
25.46
|
-2.75%
|
10.64%
|
7.95%
|
4.51%
|
3.59%
|
1953-01-01
|
26.18
|
8.23%
|
12.04%
|
10.00%
|
6.75%
|
3.66%
|
1952-01-01
|
24.19
|
14.05%
|
9.72%
|
10.48%
|
5.49%
|
4.07%
|
1951-01-01
|
21.21
|
25.65%
|
3.31%
|
7.23%
|
1.43%
|
3.71%
|
1950-01-01
|
16.88
|
9.90%
|
4.59%
|
3.22%
|
-1.25%
|
2.18%
|
1949-01-01
|
15.36
|
3.57%
|
5.33%
|
2.08%
|
-2.38%
|
2.26%
|
1948-01-01
|
14.83
|
-2.50%
|
8.01%
|
2.75%
|
-0.83%
|
2.43%
|
1947-01-01
|
15.21
|
-15.59%
|
11.24%
|
-1.44%
|
0.64%
|
1.56%
|
1946-01-01
|
18.02
|
33.58%
|
11.30%
|
2.73%
|
1.78%
|
2.22%
|
1945-01-01
|
13.49
|
13.84%
|
1.86%
|
3.83%
|
1.22%
|
1.99%
|
1944-01-01
|
11.85
|
17.44%
|
-1.06%
|
1.18%
|
1.48%
|
1.17%
|
1943-01-01
|
10.09
|
12.99%
|
-2.26%
|
3.59%
|
0.63%
|
0.27%
|
1942-01-01
|
8.93
|
-15.36%
|
-12.68%
|
0.73%
|
1.01%
|
-0.07%
|
1941-01-01
|
10.55
|
-14.23%
|
-5.17%
|
-4.07%
|
1.99%
|
0.43%
|
1940-01-01
|
12.30
|
-1.60%
|
5.84%
|
-5.52%
|
1.67%
|
0.67%
|
1939-01-01
|
12.50
|
10.52%
|
3.47%
|
-6.64%
|
2.35%
|
1.08%
|
1938-01-01
|
11.31
|
-35.70%
|
9.79%
|
-4.29%
|
2.28%
|
1.69%
|
1937-01-01
|
17.59
|
27.83%
|
16.21%
|
2.76%
|
3.09%
|
2.05%
|
1936-01-01
|
13.76
|
48.60%
|
-2.95%
|
0.84%
|
1.96%
|
1.11%
|
1935-01-01
|
9.26
|
-12.14%
|
-15.67%
|
-1.32%
|
1.07%
|
0.31%
|
1934-01-01
|
10.54
|
48.66%
|
-15.77%
|
1.79%
|
1.16%
|
1.53%
|
1933-01-01
|
7.09
|
-14.58%
|
-16.56%
|
-2.25%
|
-1.35%
|
-0.59%
|
1932-01-01
|
8.30
|
-48.06%
|
-9.14%
|
1.29%
|
-0.47%
|
0.07%
|
1931-01-01
|
15.98
|
-26.39%
|
4.78%
|
8.44%
|
2.76%
|
2.76%
|
1930-01-01
|
21.71
|
-12.67%
|
15.46%
|
9.41%
|
3.91%
|
4.32%
|
1929-01-01
|
24.86
|
41.81%
|
23.00%
|
12.22%
|
5.18%
|
NA
|
1928-01-01
|
17.53
|
30.82%
|
14.52%
|
9.29%
|
4.81%
|
NA
|
1927-01-01
|
13.40
|
5.93%
|
12.92%
|
3.42%
|
1.70%
|
NA
|
1926-01-01
|
12.65
|
19.57%
|
12.21%
|
3.09%
|
1.25%
|
NA
|
1925-01-01
|
10.58
|
19.82%
|
3.68%
|
3.53%
|
1.14%
|
NA
|
1924-01-01
|
8.83
|
-0.79%
|
2.38%
|
0.54%
|
1.40%
|
NA
|
1923-01-01
|
8.90
|
21.92%
|
4.30%
|
-0.44%
|
0.25%
|
NA
|
1922-01-01
|
7.30
|
2.67%
|
-5.27%
|
-2.20%
|
-0.53%
|
NA
|
1921-01-01
|
7.11
|
-19.48%
|
-5.29%
|
-2.62%
|
0.03%
|
NA
|
1920-01-01
|
8.83
|
12.48%
|
3.37%
|
-1.32%
|
1.87%
|
NA
|
1919-01-01
|
7.85
|
8.88%
|
-1.27%
|
-1.42%
|
NA
|
NA
|
1918-01-01
|
7.21
|
-24.66%
|
-4.96%
|
0.51%
|
NA
|
NA
|
1917-01-01
|
9.57
|
2.57%
|
0.97%
|
0.01%
|
NA
|
NA
|
1916-01-01
|
9.33
|
24.73%
|
0.13%
|
-0.56%
|
NA
|
NA
|
1915-01-01
|
7.48
|
-10.63%
|
-5.79%
|
-1.19%
|
NA
|
NA
|
1914-01-01
|
8.37
|
-10.00%
|
-1.57%
|
2.28%
|
NA
|
NA
|
1913-01-01
|
9.30
|
1.97%
|
6.31%
|
0.95%
|
NA
|
NA
|
1912-01-01
|
9.12
|
-1.62%
|
-0.94%
|
1.17%
|
NA
|
NA
|
1911-01-01
|
9.27
|
-8.04%
|
-1.25%
|
2.75%
|
NA
|
NA
|
1910-01-01
|
10.08
|
11.26%
|
3.64%
|
5.15%
|
NA
|
NA
|
1909-01-01
|
9.06
|
32.26%
|
6.28%
|
NA
|
NA
|
NA
|
1908-01-01
|
6.85
|
-28.35%
|
-4.13%
|
NA
|
NA
|
NA
|
1907-01-01
|
9.56
|
-3.14%
|
3.32%
|
NA
|
NA
|
NA
|
1906-01-01
|
9.87
|
17.08%
|
6.90%
|
NA
|
NA
|
NA
|
1905-01-01
|
8.43
|
26.20%
|
6.68%
|
NA
|
NA
|
NA
|
1904-01-01
|
6.68
|
-21.04%
|
NA
|
NA
|
NA
|
NA
|
1903-01-01
|
8.46
|
4.19%
|
NA
|
NA
|
NA
|
NA
|
1902-01-01
|
8.12
|
14.85%
|
NA
|
NA
|
NA
|
NA
|
1901-01-01
|
7.07
|
15.90%
|
NA
|
NA
|
NA
|
NA
|
1900-01-01
|
6.10
|
NA
|
NA
|
NA
|
NA
|
NA
|
Summary
Compound Average Growth Rates (1900-2024)
Statistic
|
1-Year CAGR
|
5-Year CAGR
|
10-Year CAGR
|
20-Year CAGR
|
30-Year CAGR
|
Overall
|
Count of Observations
|
124
|
120
|
115
|
105
|
95
|
559
|
Mean
|
7.17%
|
5.71%
|
5.45%
|
5.42%
|
5.59%
|
5.9%
|
Median
|
9.39%
|
6.52%
|
5.15%
|
5.49%
|
6.26%
|
6.21%
|
Standard Deviation (Volatility)
|
18.13%
|
7.88%
|
5.31%
|
3.62%
|
2.75%
|
9.78%
|
Min CAGR Range (CAGR - SD)
|
-12.6%
|
-2.35%
|
0.22%
|
1.91%
|
2.78%
|
-4.25%
|
Max CAGR Range (CAGR + SD)
|
23.66%
|
13.41%
|
10.84%
|
9.15%
|
8.28%
|
15.31%
|
Minimum
|
-48.06%
|
-16.56%
|
-6.64%
|
-2.38%
|
-0.59%
|
-48.06%
|
Maximum
|
48.66%
|
25.1%
|
15.91%
|
13.62%
|
9.75%
|
48.66%
|
Percent Above Inflation Target
|
65.32%
|
68.33%
|
71.3%
|
76.19%
|
85.26%
|
66.91%
|
Percent Above Conservative Target
|
56.45%
|
55.83%
|
50.43%
|
54.29%
|
66.32%
|
50.81%
|
Percent Above Moderate Target
|
55.65%
|
46.67%
|
43.48%
|
34.29%
|
37.89%
|
36.49%
|
Percent Above Aggressive Target
|
43.55%
|
20.83%
|
7.83%
|
4.76%
|
0%
|
13.95%
|
1900-2024 Summary: The 1-Year CAGR exhibits the
highest mean return at 7.17%, and the greatest volatility with a a
standard deviation of 18.13%. As the investment horizon extends to 5,
10, 20, and 30 years, the mean returns decrease, ranging from 5.71% to
5.59%, while volatility diminishes, with standard deviations dropping
from 7.88% to 2.75%. This trend indicates that longer investment periods
tend to offer more stable returns. Furthermore, the percentage of
periods exceeding the inflation target increases with longer durations,
from 65.32% in the 1-Year CAGR to 85.26% in the 30-Year CAGR,
underscoring SPX’s effectiveness as a hedge against inflation over
extended timeframes. With an overall percentage of 13.95% exceeding the
aggressive target (13.16% annualized returns with 3.16% inflation), SPX
appears, over this time period, to be a less suitable option for a
high-returning long-term investment.
Graph
All Periods
Short-Term
Compound Average Growth Rates Across Short-Term Rolling Periods


Long-Term
Compound Average Growth Rates Across Long-Term Rolling Periods


QQQ
The Invesco QQQ Trust, commonly known by its ticker symbol QQQ, is an
exchange-traded fund (ETF) that tracks the Nasdaq-100 Index. This index
comprises 100 of the largest non-financial companies listed on the
Nasdaq Stock Market, predominantly featuring firms in the technology
sector, but also including companies from consumer services, healthcare,
and industrials. Due to its focus on high-growth industries, QQQ is
often used by investors to gain exposure to leading tech companies and
to capitalize on the performance of the broader technology market.
Invesco Ltd. is a global independent investment management firm
headquartered in Atlanta, Georgia. Established in 1978, the company
offers a diverse range of investment products and services, including
mutual funds, exchange-traded funds (ETFs), and retirement plans,
catering to individual investors, financial professionals, and
institutions. Operating under brand names such as Invesco, Invesco
Perpetual, and PowerShares, Invesco manages assets across various asset
classes, investment styles, and geographies. Visit Invesco at https://www.invesco.com/qqq-etf/en/about-invesco.html.
QQQ GR
Data
The QQQ data presented here, sourced from Investing.com, spans from
December 31, 1999, onward. Investing.com is a comprehensive financial
platform that offers real-time data, quotes, charts, and financial news
across global markets. Each “Close” represents the closing price for the
day prior, or the end of the prior year. For example, the price for
January 1, 2024, reflects the December 31, 2023, end-of-year closing
price.
Data Source: Invesco QQQ Index - QQQ Historical Chart | Via https://www.investing.com/etfs/powershares-qqqq-historical-data.
The Actual Close Price is the day prior Close Date of the preceding
month (if Date is 11/01/2024, QQQ Data represents 10/31/2024 Close).
Price on date may differ between databases by +/-1%.
Summary
Annual Growth Rate Summary (2000-2024)
Statistic
|
Value
|
Definition
|
Count of Observations
|
24
|
Total number of data points collected over the specific period.
|
CAGR
|
6.47%
|
Compound Average Growth Rate; mean growth rate over a period if it had
compounded anually.
|
Mean
|
10.82%
|
Reflects the general price level and overall growth rate.
|
Median
|
13.07%
|
Middle value of the data when ordered chronologically; central tendency
measure less affected by extreme values.
|
Standard Deviation (Volatility)
|
29.71%
|
The dispersion of values from the mean, indicating the volatility of
price changes and economic stability.
|
Min CAGR Range (CAGR - SD)
|
-23.24%
|
Lower boundary of expected QQQ range; lowest estimate of typical growth
rate considering normal fluctuations.
|
Max CAGR Range (CAGR + SD)
|
36.18%
|
Upper boundary of expected QQQ range; highest estimate of typical growth
rate considering normal fluctuations.
|
Minimum
|
-41.94%
|
Lowest growth rate.
|
Maximum
|
53.87%
|
Highest growth rate.
|
Percent Above Inflation Target
|
66.67%
|
Percentage of values above the inflation target specified in Preferred
Targets section.
|
Percent Above Conservative Target
|
62.5%
|
Percentage of values above the conservative target specified in
Preferred Targets section.
|
Percent Above Moderate Target
|
58.33%
|
Percentage of values above the moderate target specified in Preferred
Targets section.
|
Percent Above Aggressive Target
|
50%
|
Percentage of values above the aggressive target specified in Preferred
Targets section.
|
QQQ’s Index exhibits a conservative CAGR at 6.47%, lower than the
mean growth rate of 10.82%, reflecting the impact of short-term
volatility and growth spikes. The median return of 13.07% indicates that
more than half of the observed years experienced returns above the mean.
The relationship between the CAGR and the median growth rate suggests
that sustained periods of above-median growth have exerted cumulative
upward pressure on overall price levels. This relationship highlights a
distribution with notable extremes on the higher end, reflecting
positive skewness. This positive skewness implies that while more than
half of the observed years experienced returns above the mean, downturns
can be severe. However, the market has historically provided substantial
upside potential. Additionally, the fact that 66.67% of the years
exceeded the inflation target reinforces QQQ’s effectiveness as a
long-term hedge against inflation.
The standard deviation of 29.71% indicates extreme volatility,
reflecting substantial fluctuations in equity markets. The notable range
of annual returns, spanning from -41.94% to 53.87%, highlights notable
market variability, partly due to its composition, reflecting both
opportunities and risks.
For QQQ to be considered a high-performing and resilient long-term
investment, it would be ideal to exceed the aggressive target (e.g., 10%
annualized returns, accounting for higher inflation-adjusted performance
expectations) in at least 40%-50% of the years. This range reflects the
potential for strong upside in many years while balancing the
understanding that markets do experience downturns. The fact that 50% of
the years exceeded the aggressive target suggests that while not
consistent, QQQ has historically provided robust growth over the long
term, making it a viable investment for those with a higher risk
tolerance.
Graph


QQQ CAGR
Data
Due to QQQ’s inception in March 1999, there is insufficient data to
calculate the 30-year CAGRs.
Compound Average Growth Rates (2000-2024)
Date
|
Close
|
1-Year CAGR
|
5-Year CAGR
|
10-Year CAGR
|
20-Year CAGR
|
30-Year CAGR
|
2024-12-11
|
529.92
|
29.40%
|
20.05%
|
17.77%
|
13.83%
|
NA
|
2024-01-01
|
409.52
|
53.87%
|
21.58%
|
16.68%
|
12.88%
|
NA
|
2023-01-01
|
266.14
|
-33.07%
|
11.32%
|
15.17%
|
12.72%
|
NA
|
2022-01-01
|
397.64
|
26.81%
|
27.41%
|
21.75%
|
12.35%
|
NA
|
2021-01-01
|
313.58
|
47.57%
|
22.91%
|
19.19%
|
8.79%
|
NA
|
2020-01-01
|
212.50
|
37.83%
|
15.54%
|
16.65%
|
4.33%
|
NA
|
2019-01-01
|
154.18
|
-0.96%
|
11.98%
|
17.94%
|
NA
|
NA
|
2018-01-01
|
155.68
|
31.46%
|
19.15%
|
11.81%
|
NA
|
NA
|
2017-01-01
|
118.42
|
5.92%
|
16.34%
|
10.67%
|
NA
|
NA
|
2016-01-01
|
111.80
|
8.33%
|
15.58%
|
10.76%
|
NA
|
NA
|
2015-01-01
|
103.20
|
17.88%
|
17.78%
|
10.02%
|
NA
|
NA
|
2014-01-01
|
87.55
|
35.05%
|
24.22%
|
9.21%
|
NA
|
NA
|
2013-01-01
|
64.83
|
16.66%
|
4.92%
|
10.33%
|
NA
|
NA
|
2012-01-01
|
55.57
|
2.51%
|
5.28%
|
3.68%
|
NA
|
NA
|
2011-01-01
|
54.21
|
19.04%
|
6.15%
|
-0.69%
|
NA
|
NA
|
2010-01-01
|
45.54
|
53.85%
|
2.77%
|
-6.68%
|
NA
|
NA
|
2009-01-01
|
29.60
|
-41.94%
|
-3.99%
|
NA
|
NA
|
NA
|
2008-01-01
|
50.98
|
18.67%
|
16.01%
|
NA
|
NA
|
NA
|
2007-01-01
|
42.96
|
6.81%
|
2.09%
|
NA
|
NA
|
NA
|
2006-01-01
|
40.22
|
1.23%
|
-7.09%
|
NA
|
NA
|
NA
|
2005-01-01
|
39.73
|
9.48%
|
-15.26%
|
NA
|
NA
|
NA
|
2004-01-01
|
36.29
|
49.59%
|
NA
|
NA
|
NA
|
NA
|
2003-01-01
|
24.26
|
-37.36%
|
NA
|
NA
|
NA
|
NA
|
2002-01-01
|
38.73
|
-33.34%
|
NA
|
NA
|
NA
|
NA
|
2001-01-01
|
58.10
|
-36.12%
|
NA
|
NA
|
NA
|
NA
|
2000-01-01
|
90.95
|
NA
|
NA
|
NA
|
NA
|
NA
|
Summary
Compound Average Growth Rates (2000-2024)
Statistic
|
1-Year CAGR
|
5-Year CAGR
|
10-Year CAGR
|
20-Year CAGR
|
30-Year CAGR
|
Overall
|
Count of Observations
|
24
|
20
|
15
|
5
|
NA
|
64
|
Mean
|
10.82%
|
10.73%
|
11.1%
|
10.21%
|
NA
|
10.81%
|
Median
|
13.07%
|
13.76%
|
10.76%
|
12.35%
|
NA
|
11.89%
|
Standard Deviation (Volatility)
|
29.71%
|
11.21%
|
7.66%
|
3.69%
|
NA
|
19.34%
|
Min CAGR Range (CAGR - SD)
|
-23.24%
|
-4.74%
|
-1.19%
|
2.78%
|
NA
|
-12.87%
|
Max CAGR Range (CAGR + SD)
|
36.18%
|
17.68%
|
14.13%
|
10.16%
|
NA
|
25.81%
|
Minimum
|
-41.94%
|
-15.26%
|
-6.68%
|
4.33%
|
NA
|
-41.94%
|
Maximum
|
53.87%
|
27.41%
|
21.75%
|
12.88%
|
NA
|
53.87%
|
Percent Above Inflation Target
|
70.83%
|
85%
|
86.67%
|
100%
|
NA
|
76.56%
|
Percent Above Conservative Target
|
66.67%
|
70%
|
80%
|
80%
|
NA
|
67.19%
|
Percent Above Moderate Target
|
58.33%
|
60%
|
80%
|
80%
|
NA
|
65.62%
|
Percent Above Aggressive Target
|
50%
|
50%
|
40%
|
60%
|
NA
|
43.75%
|
2000-2024 Summary: The 1-Year CAGR exhibits the mean
return at 10.82%, and the greatest volatility with a standard deviation
of 29.71%. As the investment horizon extends to 5, 10, and 20 years, the
mean returns decrease, ranging from 10.73% to 10.21%, while volatility
diminishes, with standard deviations dropping from 11.21% to 3.69%. This
trend indicates that longer investment periods tend to offer more stable
returns. Furthermore, the percentage of periods exceeding the inflation
target increases with longer durations, from 70.83% in the 1-Year CAGR
to 100% in the 20-Year CAGR, underscoring QQQ’s effectiveness as a hedge
against inflation over extended timeframes. With an overall percentage
of 43.75% exceeding the aggressive target (13.16% annualized returns
with 3.16% inflation), QQQ has, over this time period, demonstrated
itself as a viable option for a high-returning long-term investment.
Graph
All Periods
Compound Average Growth Rates Across Periods


Short-Term
Compound Average Growth Rates Across Short-Term Rolling Periods

Long-Term
Compound Average Growth Rates Across Long-Term Rolling Periods

BLACKROCK
BlackRock, Inc. is an American multinational investment management
corporation headquartered in New York City. Founded in 1988, it has
grown to become the world’s largest asset manager, with approximately
$11.5 trillion in assets under management as of October 2024. BlackRock
offers a diverse range of investment products, including mutual funds,
exchange-traded funds (ETFs) under the iShares brand, and alternative
investments. The firm serves a broad clientele, encompassing
institutional investors, financial professionals, and individual
investors worldwide. BlackRock is also known for its Aladdin platform, a
comprehensive risk management and portfolio management system utilized
both internally and by external clients. The company emphasizes
sustainable investing, integrating environmental, social, and governance
(ESG) factors into its investment processes. With a global presence
spanning over 30 countries, BlackRock plays a significant role in the
global financial system, influencing market trends and investment
practices.
BlackRock GR
Data
The BlackRock iBLD Endura® VC 5.5 ER Index, commonly referred to as
the BlackRock Endura® Index with ticker symbol IBLDE55E, is designed to
provide more consistent returns compared to traditional stock indices.
It aims to reduce losses during market downturns while capturing gains
in rising markets. The index primarily comprises U.S. equities and
employs a daily volatility control mechanism to mitigate downside risk.
This mechanism adjusts allocations between U.S. equities and short-term
U.S. Treasury bonds based on market volatility. The index’s constituents
include iShares® ETFs, and it tracks the excess return of these selected
ETFs over the return on cash. This structure seeks to balance growth
potential with risk management, making it a strategic option for
investors seeking stable returns across varying market conditions.
BlackRock Endura Index was officially launched on June 14, 2016 and
therefore has accumulated less data over time when compared to the other
indexes and ETFs.
Short-term Treasury bonds, often referred to as Treasury notes
(T-notes), and represented by the ETF ticker symbol SHY, are U.S.
government debt securities with maturities typically ranging from 1 to 3
years (rather than the 2 to 10 years characteristic of traditional
T-notes). These securities pay a fixed interest rate every six months
and are considered low-risk investments due to being backed by the full
faith and credit of the U.S. government. Investors often use short-term
Treasury bonds like SHY to achieve stability in their portfolios, earn
modest interest income, and minimize exposure to interest rate
fluctuations, making them an ideal choice in uncertain economic
environments.
The iShares MSCI USA Minimum Volatility Factor ETF (USMV) is an
exchange-traded fund designed to provide exposure to U.S. stocks with
lower volatility compared to the broader market. It tracks the MSCI USA
Minimum Volatility Index, focusing on companies that exhibit stable
price movements, making it a popular choice for risk-averse investors.
USMV typically includes large-cap stocks from defensive sectors like
healthcare, utilities, and consumer staples, aiming to reduce portfolio
risk while maintaining equity market exposure. With a low expense ratio,
it offers a cost-efficient way to achieve steady returns, though it may
underperform in bull markets due to its defensive nature. This ETF is
ideal for investors seeking to weather market fluctuations while
maintaining consistent performance over time.
Data Source: BlackRock iBLD Endura® VC 5.5 ER Index (hereinafter, the
“BlackRock Endura® Index”) at https://www.blackrock.com/us/individual/products/284053/blackrock-ibld-endura-vc5-5-er-index#/
Summary
Annual Growth Rate Summary (2017-2024)
Statistic
|
Value
|
Definition
|
Count of Observations
|
7
|
Total number of data points collected over the specific period.
|
CAGR
|
3.55%
|
Compound Average Growth Rate; mean growth rate over a period if it had
compounded anually.
|
Mean
|
3.82%
|
Reflects the general price level and overall growth rate.
|
Median
|
2.42%
|
Middle value of the data when ordered chronologically; central tendency
measure less affected by extreme values.
|
Standard Deviation (Volatility)
|
8.13%
|
The dispersion of values from the mean, indicating the volatility of
price changes and economic stability.
|
Min CAGR Range (CAGR - SD)
|
-4.58%
|
Lower boundary of expected BlackRock range; lowest estimate of typical
growth rate considering normal fluctuations.
|
Max CAGR Range (CAGR + SD)
|
11.68%
|
Upper boundary of expected BlackRock range; highest estimate of typical
growth rate considering normal fluctuations.
|
Minimum
|
-9.24%
|
Lowest growth rate.
|
Maximum
|
14.99%
|
Highest growth rate.
|
Percent Above Inflation Target
|
42.86%
|
Percentage of values above the inflation target specified in Preferred
Targets section.
|
Percent Above Conservative Target
|
42.86%
|
Percentage of values above the conservative target specified in
Preferred Targets section.
|
Percent Above Moderate Target
|
28.57%
|
Percentage of values above the moderate target specified in Preferred
Targets section.
|
Percent Above Aggressive Target
|
14.29%
|
Percentage of values above the aggressive target specified in Preferred
Targets section.
|
BlackRock Endura’s Index exhibits a baseline CAGR at 3.55%, lower
than the mean growth rate of 3.82%, reflecting the impact of short-term
volatility and growth spikes. The median return of 2.42% indicates that
more than half of the observed years experienced returns below the mean.
The relationship between the CAGR and the median growth rate suggests
that sustained periods of above-median growth have exerted cumulative
downward pressure on overall price levels. This relationship highlights
a distribution with notable extremes on the higher end, reflecting
positive skewness. This negative skewness implies that while more than
half of the observed years experienced returns below the mean, upturns
can be significant. However, the market has historically provided
substantial downside risk. Additionally, the fact that 42.86% of the
years exceeded the inflation target undermines BlackRock Endura’s
effectiveness as a long-term hedge against inflation.
The standard deviation of 8.13% suggests moderate volatility, typical
of relatively stable markets. The comparatively stable range of annual
returns, spanning from -9.24% to 14.99%, indicates a comparatively
stable market, partly due to its composition, with less extreme annual
fluctuations.
For BlackRock Endura to be considered a high-performing and resilient
long-term investment, it would be ideal to exceed the aggressive target
(e.g., 10% annualized returns, accounting for higher inflation-adjusted
performance expectations) in at least 40%-50% of the years. This range
reflects the potential for strong upside in many years while balancing
the understanding that markets do experience downturns. The fact that
14.29% of the years exceeded the aggressive target raises concerns about
BlackRock Endura’s ability to meet aggressive growth targets, making it
less suitable for investors with higher risk tolerance.
Graph

BlackRock CAGR
Data
Due to BlackRock Endura’s inception in 2016, there is insufficient
data to calculate the 10-year, 20-year and 30-year CAGRs.
Compound Average Growth Rates (2017-2024)
Date
|
Close
|
1-Year CAGR
|
5-Year CAGR
|
10-Year CAGR
|
20-Year CAGR
|
30-Year CAGR
|
2024-12-11
|
137.27
|
7.04%
|
1.73%
|
NA
|
NA
|
NA
|
2024-01-01
|
128.24
|
1.59%
|
2.44%
|
NA
|
NA
|
NA
|
2023-01-01
|
126.23
|
-9.24%
|
1.79%
|
NA
|
NA
|
NA
|
2022-01-01
|
139.08
|
7.78%
|
6.72%
|
NA
|
NA
|
NA
|
2021-01-01
|
129.04
|
2.42%
|
NA
|
NA
|
NA
|
NA
|
2020-01-01
|
125.99
|
10.84%
|
NA
|
NA
|
NA
|
NA
|
2019-01-01
|
113.66
|
-1.61%
|
NA
|
NA
|
NA
|
NA
|
2018-01-01
|
115.52
|
14.99%
|
NA
|
NA
|
NA
|
NA
|
2017-01-01
|
100.46
|
NA
|
NA
|
NA
|
NA
|
NA
|
Summary
Compound Average Growth Rates (2017-2024)
Statistic
|
1-Year CAGR
|
5-Year CAGR
|
10-Year CAGR
|
20-Year CAGR
|
30-Year CAGR
|
Overall
|
Count of Observations
|
7
|
3
|
NA
|
NA
|
NA
|
10
|
Mean
|
3.82%
|
3.65%
|
NA
|
NA
|
NA
|
3.77%
|
Median
|
2.42%
|
2.44%
|
NA
|
NA
|
NA
|
2.43%
|
Standard Deviation (Volatility)
|
8.13%
|
2.68%
|
NA
|
NA
|
NA
|
6.76%
|
Min CAGR Range (CAGR - SD)
|
-4.58%
|
0.87%
|
NA
|
NA
|
NA
|
-3.21%
|
Max CAGR Range (CAGR + SD)
|
11.68%
|
6.23%
|
NA
|
NA
|
NA
|
10.31%
|
Minimum
|
-9.24%
|
1.79%
|
NA
|
NA
|
NA
|
-9.24%
|
Maximum
|
14.99%
|
6.72%
|
NA
|
NA
|
NA
|
14.99%
|
Percent Above Inflation Target
|
57.14%
|
66.67%
|
NA
|
NA
|
NA
|
40%
|
Percent Above Conservative Target
|
42.86%
|
33.33%
|
NA
|
NA
|
NA
|
40%
|
Percent Above Moderate Target
|
42.86%
|
0%
|
NA
|
NA
|
NA
|
20%
|
Percent Above Aggressive Target
|
14.29%
|
0%
|
NA
|
NA
|
NA
|
10%
|
2017-2024 Summary: The 1-Year CAGR exhibits the
highest mean return at 3.82%, and the greatest volatility with a
standard deviation of 8.13%. As the investment horizon extends to 5
years, the mean returns decrease, to 3.65%, while volatility diminishes,
with standard deviations at 2.68%. This trend indicates that longer
investment periods tend to offer more stable returns. Furthermore, the
percentage of periods exceeding the inflation target increases with
longer durations, from 57.14% in the 1-Year CAGR to 66.67% in the 5-Year
CAGR, underscoring BlackRock’s effectiveness as a hedge against
inflation over extended timeframes. With an overall percentage of 10%
exceeding the aggressive target (13.16% annualized returns with 3.16%
inflation), BlackRock appears, over this time period, to be a less
suitable option for a high-returning long-term investment.
Graph
All Periods
Compound Average Growth Rates Across Periods

AAPL
Apple Inc. (AAPL) is considered a technology company headquartered in
Cupertino, California. Established in 1976 by Steve Jobs, Steve Wozniak,
and Ronald Wayne, Apple is best known for its innovative consumer
electronics, software, and services, including the iPhone, iPad, Mac
computers, Apple Watch, and Apple TV. The company also offers popular
software ecosystems like iOS, macOS, and iCloud, as well as subscription
services such as Apple Music, Apple TV+, and Apple Pay.
AAPL GR
Data
The AAPL Data presented here is sourced from Yahoo Finance, filtered
to display Monthly Historical Data (e.g., 03/01/2024). This data
represents the closing price of the last trading day of each month
(e.g., 03/28/2024). Please note that the statistics presented here may
differ from those in Yahoo Finance’s Performance section due to
differences in data aggregation and calculation methods.
Data Source: Apple Inc. (AAPL) Index - AAPL Historical Chart | Via https://finance.yahoo.com/quote/AAPL/history/?frequency=1mo&period1=345479400&period2=1734898883.
Excludes Quarterly Dividends and Stock Splits. Price on date may differ
between databases by +/-1%.
Summary
Annual Growth Rate Summary (1985-2024)
Statistic
|
Value
|
Definition
|
Count of Observations
|
39
|
Total number of data points collected over the specific period.
|
CAGR
|
20.45%
|
Compound Average Growth Rate; mean growth rate over a period if it had
compounded anually.
|
Mean
|
33.69%
|
Reflects the general price level and overall growth rate.
|
Median
|
24.14%
|
Middle value of the data when ordered chronologically; central tendency
measure less affected by extreme values.
|
Standard Deviation (Volatility)
|
63.5%
|
The dispersion of values from the mean, indicating the volatility of
price changes and economic stability.
|
Min CAGR Range (CAGR - SD)
|
-43.05%
|
Lower boundary of expected AAPL range; lowest estimate of typical growth
rate considering normal fluctuations.
|
Max CAGR Range (CAGR + SD)
|
83.95%
|
Upper boundary of expected AAPL range; highest estimate of typical
growth rate considering normal fluctuations.
|
Minimum
|
-58.06%
|
Lowest growth rate.
|
Maximum
|
242.5%
|
Highest growth rate.
|
Percent Above Inflation Target
|
64.1%
|
Percentage of values above the inflation target specified in Preferred
Targets section.
|
Percent Above Conservative Target
|
64.1%
|
Percentage of values above the conservative target specified in
Preferred Targets section.
|
Percent Above Moderate Target
|
61.54%
|
Percentage of values above the moderate target specified in Preferred
Targets section.
|
Percent Above Aggressive Target
|
56.41%
|
Percentage of values above the aggressive target specified in Preferred
Targets section.
|
AAPL’s Index exhibits a aggressive CAGR at 20.45%, lower than the
mean growth rate of 33.69%, reflecting the impact of short-term
volatility and growth spikes. The median return of 24.14% indicates that
more than half of the observed years experienced returns above the mean.
The relationship between the CAGR and the median growth rate suggests
that sustained periods of above-median growth have exerted cumulative
upward pressure on overall price levels. This relationship highlights a
distribution with notable extremes on the higher end, reflecting
positive skewness. This positive skewness implies that while more than
half of the observed years experienced returns above the mean, downturns
can be severe. However, the market has historically provided substantial
upside potential. Additionally, the fact that 64.1% of the years
exceeded the inflation target reinforces AAPL’s effectiveness as a
long-term hedge against inflation.
The standard deviation of 63.5% indicates extreme volatility,
reflecting substantial fluctuations in equity markets. The notable range
of annual returns, spanning from -58.06% to 242.5%, highlights notable
market variability, partly due to its composition, reflecting both
opportunities and risks.
For AAPL to be considered a high-performing and resilient long-term
investment, it would be ideal to exceed the aggressive target (e.g., 10%
annualized returns, accounting for higher inflation-adjusted performance
expectations) in at least 40%-50% of the years. This range reflects the
potential for strong upside in many years while balancing the
understanding that markets do experience downturns. The fact that 56.41%
of the years exceeded the aggressive target indicates consistent and
robust growth, making AAPL a strong option for those seeking aggressive
investments.
Graph


AAPL CAGR
Data
Compound Average Growth Rates (1985-2024)
Date
|
Close
|
1-Year CAGR
|
5-Year CAGR
|
10-Year CAGR
|
20-Year CAGR
|
30-Year CAGR
|
2024-12-20
|
254.49
|
38.01%
|
26.88%
|
24.14%
|
29.85%
|
24.45%
|
2024-01-01
|
184.40
|
27.80%
|
34.68%
|
26.28%
|
35.89%
|
24.01%
|
2023-01-01
|
144.29
|
-17.44%
|
28.08%
|
24.39%
|
37.16%
|
20.55%
|
2022-01-01
|
174.78
|
32.45%
|
41.94%
|
26.77%
|
34.88%
|
20.96%
|
2021-01-01
|
131.96
|
70.54%
|
40.24%
|
26.97%
|
33.80%
|
20.42%
|
2020-01-01
|
77.38
|
85.96%
|
21.45%
|
27.42%
|
24.74%
|
20.33%
|
2019-01-01
|
41.61
|
-0.60%
|
18.40%
|
29.16%
|
26.63%
|
17.38%
|
2018-01-01
|
41.86
|
37.97%
|
20.80%
|
24.10%
|
32.09%
|
17.07%
|
2017-01-01
|
30.34
|
24.70%
|
13.23%
|
25.79%
|
30.41%
|
17.35%
|
2016-01-01
|
24.33
|
-16.93%
|
14.96%
|
24.59%
|
25.72%
|
20.10%
|
2015-01-01
|
29.29
|
63.81%
|
33.68%
|
35.83%
|
24.60%
|
19.79%
|
2014-01-01
|
17.88
|
9.90%
|
40.90%
|
46.23%
|
22.88%
|
NA
|
2013-01-01
|
16.27
|
-0.18%
|
27.49%
|
51.23%
|
18.67%
|
NA
|
2012-01-01
|
16.30
|
34.49%
|
39.73%
|
43.51%
|
18.15%
|
NA
|
2011-01-01
|
12.12
|
76.68%
|
35.03%
|
41.01%
|
17.28%
|
NA
|
2010-01-01
|
6.86
|
113.04%
|
38.01%
|
22.12%
|
16.94%
|
NA
|
2009-01-01
|
3.22
|
-33.33%
|
51.76%
|
24.16%
|
11.90%
|
NA
|
2008-01-01
|
4.83
|
57.84%
|
79.39%
|
40.60%
|
13.71%
|
NA
|
2007-01-01
|
3.06
|
13.33%
|
47.39%
|
35.20%
|
13.34%
|
NA
|
2006-01-01
|
2.70
|
97.08%
|
47.25%
|
26.87%
|
17.91%
|
NA
|
2005-01-01
|
1.37
|
242.50%
|
8.06%
|
14.30%
|
12.50%
|
NA
|
2004-01-01
|
0.40
|
53.85%
|
1.57%
|
3.27%
|
NA
|
NA
|
2003-01-01
|
0.26
|
-40.91%
|
10.20%
|
-6.87%
|
NA
|
NA
|
2002-01-01
|
0.44
|
12.82%
|
24.01%
|
-2.72%
|
NA
|
NA
|
2001-01-01
|
0.39
|
-58.06%
|
9.30%
|
-2.45%
|
NA
|
NA
|
2000-01-01
|
0.93
|
151.35%
|
20.90%
|
11.98%
|
NA
|
NA
|
1999-01-01
|
0.37
|
131.25%
|
4.99%
|
0.85%
|
NA
|
NA
|
1998-01-01
|
0.16
|
6.67%
|
-21.30%
|
-8.04%
|
NA
|
NA
|
1997-01-01
|
0.15
|
-40.00%
|
-23.70%
|
-4.98%
|
NA
|
NA
|
1996-01-01
|
0.25
|
-30.56%
|
-12.94%
|
9.60%
|
NA
|
NA
|
1995-01-01
|
0.36
|
24.14%
|
3.71%
|
10.72%
|
NA
|
NA
|
1994-01-01
|
0.29
|
-45.28%
|
-3.13%
|
NA
|
NA
|
NA
|
1993-01-01
|
0.53
|
-8.62%
|
7.45%
|
NA
|
NA
|
NA
|
1992-01-01
|
0.58
|
16.00%
|
18.33%
|
NA
|
NA
|
NA
|
1991-01-01
|
0.50
|
66.67%
|
37.97%
|
NA
|
NA
|
NA
|
1990-01-01
|
0.30
|
-11.76%
|
18.20%
|
NA
|
NA
|
NA
|
1989-01-01
|
0.34
|
-8.11%
|
NA
|
NA
|
NA
|
NA
|
1988-01-01
|
0.37
|
48.00%
|
NA
|
NA
|
NA
|
NA
|
1987-01-01
|
0.25
|
150.00%
|
NA
|
NA
|
NA
|
NA
|
1986-01-01
|
0.10
|
-23.08%
|
NA
|
NA
|
NA
|
NA
|
1985-01-01
|
0.13
|
NA
|
NA
|
NA
|
NA
|
NA
|
Summary
Compound Average Growth Rates (1985-2024)
Statistic
|
1-Year CAGR
|
5-Year CAGR
|
10-Year CAGR
|
20-Year CAGR
|
30-Year CAGR
|
Overall
|
Count of Observations
|
39
|
35
|
30
|
20
|
10
|
134
|
Mean
|
33.69%
|
22.23%
|
20.93%
|
23.46%
|
19.8%
|
25.28%
|
Median
|
24.14%
|
20.9%
|
24.49%
|
23.74%
|
20.22%
|
21.78%
|
Standard Deviation (Volatility)
|
63.5%
|
21.45%
|
16.67%
|
8.38%
|
2.1%
|
37.02%
|
Min CAGR Range (CAGR - SD)
|
-43.05%
|
-1%
|
3.78%
|
12.07%
|
18.35%
|
-16.57%
|
Max CAGR Range (CAGR + SD)
|
83.95%
|
41.9%
|
37.12%
|
28.83%
|
22.55%
|
57.47%
|
Minimum
|
-58.06%
|
-23.7%
|
-8.04%
|
11.9%
|
17.07%
|
-58.06%
|
Maximum
|
242.5%
|
79.39%
|
51.23%
|
37.16%
|
24.01%
|
242.5%
|
Percent Above Inflation Target
|
64.1%
|
85.71%
|
80%
|
100%
|
100%
|
81.34%
|
Percent Above Conservative Target
|
64.1%
|
80%
|
76.67%
|
100%
|
100%
|
79.1%
|
Percent Above Moderate Target
|
61.54%
|
80%
|
76.67%
|
100%
|
100%
|
76.87%
|
Percent Above Aggressive Target
|
58.97%
|
68.57%
|
66.67%
|
95%
|
100%
|
70.15%
|
1985-2024 Summary: The 1-Year CAGR exhibits the
highest mean return at 33.69%, and the greatest volatility with a
standard deviation of 63.5%. As the investment horizon extends to 5, 10,
20, and 30 years, the mean returns decrease, ranging from 22.23% to
19.8%, while volatility diminishes, with standard deviations dropping
from 21.45% to 2.1%. This trend indicates that longer investment periods
tend to offer more stable returns. Furthermore, the percentage of
periods exceeding the inflation target increases with longer durations,
from 64.1% in the 1-Year CAGR to 100% in the 30-Year CAGR, underscoring
AAPL’s effectiveness as a hedge against inflation over extended
timeframes. With an overall percentage of 70.15% exceeding the
aggressive target (13.16% annualized returns with 3.16% inflation), AAPL
has, over this time period, proven to be a strong option for a
high-returning long-term investment.
Graph
All Periods
Compound Average Growth Rates Across Periods


Short-Term
Compound Average Growth Rates Across Short-Term Rolling Periods

Long-Term
Compound Average Growth Rates Across Long-Term Rolling Periods

NVDA
NVIDIA Corporation (NVDA) is considered a technology company
headquartered in Santa Clara, California. Established in 1993 by Jensen
Huang, Chris Malachowsky, and Curtis Priem, NVIDIA is best known for its
cutting-edge graphics processing units (GPUs), which revolutionized
computer gaming and visual computing. The company also excels in
artificial intelligence (AI), data center technologies, autonomous
vehicles, and high-performance computing, making it a leader in
innovation across multiple industries.
NVDA GR
Data
The NVDA Data presented here is sourced from Yahoo Finance, filtered
to display Monthly Historical Data (e.g., 03/01/2024). This data
represents the closing price of the last trading day of each month
(e.g., 03/28/2024). Please note that the statistics presented here may
differ from those in Yahoo Finance’s Performance section due to
differences in data aggregation and calculation methods.
Data Source: NVIDIA Corporation (NVDA) Index - NVDA Historical Chart
| Via https://finance.yahoo.com/quote/NVDA/history/?frequency=1mo&period1=917015400&period2=1734900956.
Excludes Quarterly Dividends and Stock Splits. Price on date may differ
between databases by +/-1%.
Summary
Annual Growth Rate Summary (2000-2024)
Statistic
|
Value
|
Definition
|
Count of Observations
|
24
|
Total number of data points collected over the specific period.
|
CAGR
|
31.9%
|
Compound Average Growth Rate; mean growth rate over a period if it had
compounded anually.
|
Mean
|
60.7%
|
Reflects the general price level and overall growth rate.
|
Median
|
54.98%
|
Middle value of the data when ordered chronologically; central tendency
measure less affected by extreme values.
|
Standard Deviation (Volatility)
|
88.9%
|
The dispersion of values from the mean, indicating the volatility of
price changes and economic stability.
|
Min CAGR Range (CAGR - SD)
|
-57%
|
Lower boundary of expected NVDA range; lowest estimate of typical growth
rate considering normal fluctuations.
|
Max CAGR Range (CAGR + SD)
|
120.8%
|
Upper boundary of expected NVDA range; highest estimate of typical
growth rate considering normal fluctuations.
|
Minimum
|
-83.64%
|
Lowest growth rate.
|
Maximum
|
273.97%
|
Highest growth rate.
|
Percent Above Inflation Target
|
70.83%
|
Percentage of values above the inflation target specified in Preferred
Targets section.
|
Percent Above Conservative Target
|
70.83%
|
Percentage of values above the conservative target specified in
Preferred Targets section.
|
Percent Above Moderate Target
|
70.83%
|
Percentage of values above the moderate target specified in Preferred
Targets section.
|
Percent Above Aggressive Target
|
70.83%
|
Percentage of values above the aggressive target specified in Preferred
Targets section.
|
NVDA’s Index exhibits a aggressive CAGR at 31.9%, lower than the mean
growth rate of 60.7%, reflecting the impact of short-term volatility and
growth spikes. The median return of 54.98% indicates that more than half
of the observed years experienced returns above the mean. The
relationship between the CAGR and the median growth rate suggests that
sustained periods of above-median growth have exerted cumulative upward
pressure on overall price levels. This relationship highlights a
distribution with notable extremes on the higher end, reflecting
positive skewness. This positive skewness implies that while more than
half of the observed years experienced returns above the mean, downturns
can be severe. However, the market has historically provided substantial
upside potential. Additionally, the fact that 70.83% of the years
exceeded the inflation target reinforces NVDA’s effectiveness as a
strong long-term hedge against inflation.
The standard deviation of 88.9% indicates extreme volatility,
reflecting substantial fluctuations in equity markets. The notable range
of annual returns, spanning from -83.64% to 273.97%, highlights notable
market variability, partly due to its composition, reflecting both
opportunities and risks.
For NVDA to be considered a high-performing and resilient long-term
investment, it would be ideal to exceed the aggressive target (e.g., 10%
annualized returns, accounting for higher inflation-adjusted performance
expectations) in at least 40%-50% of the years. This range reflects the
potential for strong upside in many years while balancing the
understanding that markets do experience downturns. The fact that 70.83%
of the years exceeded the aggressive target indicates consistent and
robust growth, making NVDA a strong option for those seeking aggressive
investments.
Graph


NVDA CAGR
Data
Compound Average Growth Rates (2000-2024)
Date
|
Close
|
1-Year CAGR
|
5-Year CAGR
|
10-Year CAGR
|
20-Year CAGR
|
30-Year CAGR
|
2024-12-20
|
134.70
|
118.92%
|
86.88%
|
75.72%
|
38.85%
|
NA
|
2024-01-01
|
61.53
|
214.89%
|
76.52%
|
65.88%
|
33.51%
|
NA
|
2023-01-01
|
19.54
|
-20.21%
|
26.05%
|
51.34%
|
30.87%
|
NA
|
2022-01-01
|
24.49
|
88.53%
|
55.08%
|
52.08%
|
20.90%
|
NA
|
2021-01-01
|
12.99
|
119.80%
|
77.85%
|
36.00%
|
22.62%
|
NA
|
2020-01-01
|
5.91
|
64.62%
|
65.22%
|
31.58%
|
24.00%
|
NA
|
2019-01-01
|
3.59
|
-41.53%
|
55.89%
|
33.48%
|
NA
|
NA
|
2018-01-01
|
6.14
|
124.91%
|
81.70%
|
25.97%
|
NA
|
NA
|
2017-01-01
|
2.73
|
273.97%
|
49.14%
|
18.27%
|
NA
|
NA
|
2016-01-01
|
0.73
|
52.08%
|
4.00%
|
7.03%
|
NA
|
NA
|
2015-01-01
|
0.48
|
23.08%
|
4.78%
|
9.71%
|
NA
|
NA
|
2014-01-01
|
0.39
|
25.81%
|
14.29%
|
7.46%
|
NA
|
NA
|
2013-01-01
|
0.31
|
-16.22%
|
-12.66%
|
13.16%
|
NA
|
NA
|
2012-01-01
|
0.37
|
-38.33%
|
-6.22%
|
-3.89%
|
NA
|
NA
|
2011-01-01
|
0.60
|
57.89%
|
10.15%
|
10.55%
|
NA
|
NA
|
2010-01-01
|
0.38
|
90.00%
|
14.87%
|
16.86%
|
NA
|
NA
|
2009-01-01
|
0.20
|
-67.21%
|
1.03%
|
NA
|
NA
|
NA
|
2008-01-01
|
0.61
|
19.61%
|
46.63%
|
NA
|
NA
|
NA
|
2007-01-01
|
0.51
|
37.84%
|
-1.50%
|
NA
|
NA
|
NA
|
2006-01-01
|
0.37
|
94.74%
|
10.96%
|
NA
|
NA
|
NA
|
2005-01-01
|
0.19
|
0.00%
|
18.89%
|
NA
|
NA
|
NA
|
2004-01-01
|
0.19
|
111.11%
|
NA
|
NA
|
NA
|
NA
|
2003-01-01
|
0.09
|
-83.64%
|
NA
|
NA
|
NA
|
NA
|
2002-01-01
|
0.55
|
150.00%
|
NA
|
NA
|
NA
|
NA
|
2001-01-01
|
0.22
|
175.00%
|
NA
|
NA
|
NA
|
NA
|
2000-01-01
|
0.08
|
NA
|
NA
|
NA
|
NA
|
NA
|
Summary
Compound Average Growth Rates (2000-2024)
Statistic
|
1-Year CAGR
|
5-Year CAGR
|
10-Year CAGR
|
20-Year CAGR
|
30-Year CAGR
|
Overall
|
Count of Observations
|
24
|
20
|
15
|
5
|
NA
|
64
|
Mean
|
60.7%
|
29.63%
|
25.03%
|
26.38%
|
NA
|
39.95%
|
Median
|
54.98%
|
16.88%
|
18.27%
|
24%
|
NA
|
25.89%
|
Standard Deviation (Volatility)
|
88.9%
|
30.74%
|
19.81%
|
5.5%
|
NA
|
59.37%
|
Min CAGR Range (CAGR - SD)
|
-57%
|
1.16%
|
12.09%
|
26.4%
|
NA
|
-27.47%
|
Max CAGR Range (CAGR + SD)
|
120.8%
|
62.64%
|
51.71%
|
37.4%
|
NA
|
91.27%
|
Minimum
|
-83.64%
|
-12.66%
|
-3.89%
|
20.9%
|
NA
|
-83.64%
|
Maximum
|
273.97%
|
81.7%
|
65.88%
|
33.51%
|
NA
|
273.97%
|
Percent Above Inflation Target
|
70.83%
|
80%
|
93.33%
|
100%
|
NA
|
81.25%
|
Percent Above Conservative Target
|
70.83%
|
70%
|
93.33%
|
100%
|
NA
|
78.12%
|
Percent Above Moderate Target
|
70.83%
|
70%
|
93.33%
|
100%
|
NA
|
75%
|
Percent Above Aggressive Target
|
70.83%
|
60%
|
66.67%
|
100%
|
NA
|
68.75%
|
2000-2024 Summary: The 1-Year CAGR exhibits the
highest mean return at 60.7%, and the greatest volatility with a
standard deviation of 88.9%. As the investment horizon extends to 5, 10,
and 20 years, the mean returns decrease, ranging from 29.63% to 26.38%,
while volatility diminishes, with standard deviations dropping from
30.74% to 5.5%. This trend indicates that longer investment periods tend
to offer more stable returns. Furthermore, the percentage of periods
exceeding the inflation target increases with longer durations, from
70.83% in the 1-Year CAGR to 100% in the 20-Year CAGR, underscoring
NVDA’s effectiveness as a hedge against inflation over extended
timeframes. With an overall percentage of 68.75% exceeding the
aggressive target (13.16% annualized returns with 3.16% inflation), NVDA
has, over this time period, proven to be a strong option for a
high-returning long-term investment.
Graph
All Periods
Compound Average Growth Rates Across Periods

Short-Term
Compound Average Growth Rates Across Short-Term Rolling Periods

Long-Term
Compound Average Growth Rates Across Long-Term Rolling Periods

MSFT
Microsoft Corporation (MSFT) is considered a leading technology
company headquartered in Redmond, Washington. Established in 1975 by
Bill Gates and Paul Allen, Microsoft is best known for its Windows
operating system, the Microsoft Office Suite, and its Azure cloud
computing platform. The company also develops innovative hardware such
as the Surface line of devices and the Xbox gaming console, alongside
software and services in areas like artificial intelligence (AI),
cybersecurity, and enterprise solutions.
MSFT GR
Data
The MSFT Data presented here is sourced from Yahoo Finance, filtered
to display Monthly Historical Data (e.g., 03/01/2024). This data
represents the closing price of the last trading day of each month
(e.g., 03/28/2024). Please note that the statistics presented here may
differ from those in Yahoo Finance’s Performance section due to
differences in data aggregation and calculation methods.
Data Source: Microsoft Corporation (MSFT) Index - MSFT Historical
Chart | Via https://finance.yahoo.com/quote/MSFT/history/?frequency=1mo&period1=511108200&period2=1734900409.
Excludes Quarterly Dividends and Stock Splits. Price on date may differ
between databases by +/-1%.
Summary
Annual Growth Rate Summary (1987-2024)
Statistic
|
Value
|
Definition
|
Count of Observations
|
37
|
Total number of data points collected over the specific period.
|
CAGR
|
22.05%
|
Compound Average Growth Rate; mean growth rate over a period if it had
compounded anually.
|
Mean
|
28.32%
|
Reflects the general price level and overall growth rate.
|
Median
|
16.52%
|
Middle value of the data when ordered chronologically; central tendency
measure less affected by extreme values.
|
Standard Deviation (Volatility)
|
41.21%
|
The dispersion of values from the mean, indicating the volatility of
price changes and economic stability.
|
Min CAGR Range (CAGR - SD)
|
-19.16%
|
Lower boundary of expected MSFT range; lowest estimate of typical growth
rate considering normal fluctuations.
|
Max CAGR Range (CAGR + SD)
|
63.26%
|
Upper boundary of expected MSFT range; highest estimate of typical
growth rate considering normal fluctuations.
|
Minimum
|
-47.55%
|
Lowest growth rate.
|
Maximum
|
134.58%
|
Highest growth rate.
|
Percent Above Inflation Target
|
78.38%
|
Percentage of values above the inflation target specified in Preferred
Targets section.
|
Percent Above Conservative Target
|
70.27%
|
Percentage of values above the conservative target specified in
Preferred Targets section.
|
Percent Above Moderate Target
|
59.46%
|
Percentage of values above the moderate target specified in Preferred
Targets section.
|
Percent Above Aggressive Target
|
51.35%
|
Percentage of values above the aggressive target specified in Preferred
Targets section.
|
MSFT’s Index exhibits a aggressive CAGR at 22.05%, lower than the
mean growth rate of 28.32%, reflecting the impact of short-term
volatility and growth spikes. The median return of 16.52% indicates that
more than half of the observed years experienced returns below the mean.
The relationship between the CAGR and the median growth rate suggests
that sustained periods of above-median growth have exerted cumulative
downward pressure on overall price levels. This relationship highlights
a distribution with notable extremes on the higher end, reflecting
positive skewness. This negative skewness implies that while more than
half of the observed years experienced returns below the mean, upturns
can be significant. However, the market has historically provided
substantial downside risk. Additionally, the fact that 78.38% of the
years exceeded the inflation target reinforces MSFT’s effectiveness as a
strong long-term hedge against inflation.
The standard deviation of 41.21% indicates extreme volatility,
reflecting substantial fluctuations in equity markets. The notable range
of annual returns, spanning from -47.55% to 134.58%, highlights notable
market variability, partly due to its composition, reflecting both
opportunities and risks.
For MSFT to be considered a high-performing and resilient long-term
investment, it would be ideal to exceed the aggressive target (e.g., 10%
annualized returns, accounting for higher inflation-adjusted performance
expectations) in at least 40%-50% of the years. This range reflects the
potential for strong upside in many years while balancing the
understanding that markets do experience downturns. The fact that 51.35%
of the years exceeded the aggressive target indicates consistent and
robust growth, making MSFT a strong option for those seeking aggressive
investments.
Graph


MSFT CAGR
Data
Compound Average Growth Rates (1987-2024)
Date
|
Close
|
1-Year CAGR
|
5-Year CAGR
|
10-Year CAGR
|
20-Year CAGR
|
30-Year CAGR
|
2024-12-20
|
436.60
|
9.81%
|
20.73%
|
26.87%
|
15.09%
|
17.23%
|
2024-01-01
|
397.58
|
60.44%
|
30.65%
|
26.52%
|
14.26%
|
18.16%
|
2023-01-01
|
247.81
|
-20.31%
|
21.14%
|
24.61%
|
12.45%
|
16.26%
|
2022-01-01
|
310.98
|
34.07%
|
36.91%
|
26.55%
|
12.07%
|
17.43%
|
2021-01-01
|
231.96
|
36.26%
|
33.31%
|
23.66%
|
10.67%
|
18.68%
|
2020-01-01
|
170.23
|
63.01%
|
33.33%
|
19.70%
|
6.43%
|
20.46%
|
2019-01-01
|
104.43
|
9.91%
|
22.51%
|
19.83%
|
4.45%
|
20.28%
|
2018-01-01
|
95.01
|
46.96%
|
28.19%
|
11.29%
|
8.48%
|
20.10%
|
2017-01-01
|
64.65
|
17.35%
|
16.97%
|
7.68%
|
8.46%
|
20.34%
|
2016-01-01
|
55.09
|
36.36%
|
14.72%
|
6.94%
|
11.93%
|
NA
|
2015-01-01
|
40.40
|
6.77%
|
7.47%
|
4.39%
|
12.68%
|
NA
|
2014-01-01
|
37.84
|
37.85%
|
17.22%
|
3.19%
|
14.20%
|
NA
|
2013-01-01
|
27.45
|
-7.04%
|
-3.38%
|
1.47%
|
12.29%
|
NA
|
2012-01-01
|
29.53
|
6.49%
|
-0.88%
|
-0.75%
|
13.12%
|
NA
|
2011-01-01
|
27.73
|
-1.60%
|
-0.30%
|
-0.96%
|
16.27%
|
NA
|
2010-01-01
|
28.18
|
64.80%
|
1.41%
|
-5.37%
|
20.83%
|
NA
|
2009-01-01
|
17.10
|
-47.55%
|
-9.16%
|
-8.97%
|
20.51%
|
NA
|
2008-01-01
|
32.60
|
5.64%
|
6.56%
|
5.74%
|
24.77%
|
NA
|
2007-01-01
|
30.86
|
9.63%
|
-0.63%
|
9.24%
|
27.23%
|
NA
|
2006-01-01
|
28.15
|
7.12%
|
-1.61%
|
17.15%
|
NA
|
NA
|
2005-01-01
|
26.28
|
-4.95%
|
-11.69%
|
21.63%
|
NA
|
NA
|
2004-01-01
|
27.65
|
16.52%
|
-8.77%
|
26.38%
|
NA
|
NA
|
2003-01-01
|
23.73
|
-25.49%
|
4.94%
|
24.28%
|
NA
|
NA
|
2002-01-01
|
31.85
|
4.32%
|
20.09%
|
28.93%
|
NA
|
NA
|
2001-01-01
|
30.53
|
-37.62%
|
39.50%
|
36.50%
|
NA
|
NA
|
2000-01-01
|
48.94
|
11.86%
|
67.52%
|
54.29%
|
NA
|
NA
|
1999-01-01
|
43.75
|
134.58%
|
75.07%
|
59.52%
|
NA
|
NA
|
1998-01-01
|
18.65
|
46.27%
|
47.18%
|
47.22%
|
NA
|
NA
|
1997-01-01
|
12.75
|
120.59%
|
38.41%
|
48.17%
|
NA
|
NA
|
1996-01-01
|
5.78
|
55.80%
|
33.56%
|
NA
|
NA
|
NA
|
1995-01-01
|
3.71
|
39.47%
|
42.11%
|
NA
|
NA
|
NA
|
1994-01-01
|
2.66
|
-1.48%
|
45.35%
|
NA
|
NA
|
NA
|
1993-01-01
|
2.70
|
7.57%
|
47.25%
|
NA
|
NA
|
NA
|
1992-01-01
|
2.51
|
84.56%
|
58.62%
|
NA
|
NA
|
NA
|
1991-01-01
|
1.36
|
112.50%
|
NA
|
NA
|
NA
|
NA
|
1990-01-01
|
0.64
|
56.10%
|
NA
|
NA
|
NA
|
NA
|
1989-01-01
|
0.41
|
5.13%
|
NA
|
NA
|
NA
|
NA
|
1988-01-01
|
0.39
|
56.00%
|
NA
|
NA
|
NA
|
NA
|
1987-01-01
|
0.25
|
NA
|
NA
|
NA
|
NA
|
NA
|
Summary
Compound Average Growth Rates (1987-2024)
Statistic
|
1-Year CAGR
|
5-Year CAGR
|
10-Year CAGR
|
20-Year CAGR
|
30-Year CAGR
|
Overall
|
Count of Observations
|
37
|
33
|
28
|
18
|
8
|
124
|
Mean
|
28.32%
|
22.84%
|
19.24%
|
13.95%
|
18.96%
|
22.12%
|
Median
|
16.52%
|
21.14%
|
19.76%
|
12.56%
|
19.39%
|
17.28%
|
Standard Deviation (Volatility)
|
41.21%
|
22.9%
|
17.99%
|
6.05%
|
1.58%
|
27.09%
|
Min CAGR Range (CAGR - SD)
|
-19.16%
|
-0.85%
|
4.06%
|
16%
|
20.47%
|
-5.04%
|
Max CAGR Range (CAGR + SD)
|
63.26%
|
44.95%
|
40.04%
|
28.1%
|
23.63%
|
49.14%
|
Minimum
|
-47.55%
|
-11.69%
|
-8.97%
|
4.45%
|
16.26%
|
-47.55%
|
Maximum
|
134.58%
|
75.07%
|
59.52%
|
27.23%
|
20.46%
|
134.58%
|
Percent Above Inflation Target
|
78.38%
|
72.73%
|
82.14%
|
100%
|
100%
|
82.26%
|
Percent Above Conservative Target
|
75.68%
|
69.7%
|
75%
|
94.44%
|
100%
|
75.81%
|
Percent Above Moderate Target
|
64.86%
|
66.67%
|
67.86%
|
88.89%
|
100%
|
68.55%
|
Percent Above Aggressive Target
|
51.35%
|
63.64%
|
57.14%
|
66.67%
|
100%
|
57.26%
|
1987-2024 Summary: The 1-Year CAGR exhibits the
highest mean return at 28.32%, and the greatest volatility with a
standard deviation of 41.21%. As the investment horizon extends to 5,
10, 20, and 30 years, the mean returns decrease, ranging from 22.84% to
18.96%, while volatility diminishes, with standard deviations dropping
from 22.9% to 1.58%. This trend indicates that longer investment periods
tend to offer more stable returns. Furthermore, the percentage of
periods exceeding the inflation target increases with longer durations,
from 78.38% in the 1-Year CAGR to 100% in the 30-Year CAGR, underscoring
MSFT’s effectiveness as a hedge against inflation over extended
timeframes. With an overall percentage of 57.26% exceeding the
aggressive target (13.16% annualized returns with 3.16% inflation), MSFT
has, over this time period, proven to be a strong option for a
high-returning long-term investment.
Graph
All Periods
Compound Average Growth Rates Across Periods


Short-Term
Compound Average Growth Rates Across Short-Term Rolling Periods

Long-Term
Compound Average Growth Rates Across Long-Term Rolling Periods

AMZN
Amazon.com, Inc. (AMZN) is considered a leading technology and
e-commerce company headquartered in Seattle, Washington. Established in
1994 by Jeff Bezos, Amazon is best known for its global online
marketplace, which revolutionized the retail industry. The company also
excels in cloud computing through its Amazon Web Services (AWS)
platform, artificial intelligence (AI) with Alexa-enabled devices, and
digital streaming services like Amazon Prime Video and Amazon Music.
AMZN GR
Data
The AMZN Data presented here is sourced from Yahoo Finance, filtered
to display Monthly Historical Data (e.g., 03/01/2024). This data
represents the closing price of the last trading day of each month
(e.g., 03/28/2024). Please note that the statistics presented here may
differ from those in Yahoo Finance’s Performance section due to
differences in data aggregation and calculation methods.
Data Source: Amazon.com, Inc. (AMZN) Index - AMZN Historical Chart |
Via https://finance.yahoo.com/quote/AMZN/history/?frequency=1mo&period1=863703000&period2=1734901838.
Excludes Quarterly Dividends and Stock Splits. Price on date may differ
between databases by +/-1%.
Summary
Annual Growth Rate Summary (1998-2024)
Statistic
|
Value
|
Definition
|
Count of Observations
|
26
|
Total number of data points collected over the specific period.
|
CAGR
|
28.06%
|
Compound Average Growth Rate; mean growth rate over a period if it had
compounded anually.
|
Mean
|
67.34%
|
Reflects the general price level and overall growth rate.
|
Median
|
26.79%
|
Middle value of the data when ordered chronologically; central tendency
measure less affected by extreme values.
|
Standard Deviation (Volatility)
|
209.5%
|
The dispersion of values from the mean, indicating the volatility of
price changes and economic stability.
|
Min CAGR Range (CAGR - SD)
|
-181.44%
|
Lower boundary of expected AMZN range; lowest estimate of typical growth
rate considering normal fluctuations.
|
Max CAGR Range (CAGR + SD)
|
237.56%
|
Upper boundary of expected AMZN range; highest estimate of typical
growth rate considering normal fluctuations.
|
Minimum
|
-73.07%
|
Lowest growth rate.
|
Maximum
|
1068%
|
Highest growth rate.
|
Percent Above Inflation Target
|
69.23%
|
Percentage of values above the inflation target specified in Preferred
Targets section.
|
Percent Above Conservative Target
|
65.38%
|
Percentage of values above the conservative target specified in
Preferred Targets section.
|
Percent Above Moderate Target
|
65.38%
|
Percentage of values above the moderate target specified in Preferred
Targets section.
|
Percent Above Aggressive Target
|
61.54%
|
Percentage of values above the aggressive target specified in Preferred
Targets section.
|
AMZN’s Index exhibits a aggressive CAGR at 28.06%, lower than the
mean growth rate of 67.34%, reflecting the impact of short-term
volatility and growth spikes. The median return of 26.79% indicates that
more than half of the observed years experienced returns below the mean.
The relationship between the CAGR and the median growth rate suggests
that sustained periods of above-median growth have exerted cumulative
downward pressure on overall price levels. This relationship highlights
a distribution with notable extremes on the higher end, reflecting
positive skewness. This negative skewness implies that while more than
half of the observed years experienced returns below the mean, upturns
can be significant. However, the market has historically provided
substantial downside risk. Additionally, the fact that 69.23% of the
years exceeded the inflation target reinforces AMZN’s effectiveness as a
long-term hedge against inflation.
The standard deviation of 209.5% indicates extreme volatility,
reflecting substantial fluctuations in equity markets. The highly
volatile range of annual returns, spanning from -73.07% to 1068%,
illustrates a highly volatile market environment, partly due to its
composition, with the potential for both extreme gains and losses.
For AMZN to be considered a high-performing and resilient long-term
investment, it would be ideal to exceed the aggressive target (e.g., 10%
annualized returns, accounting for higher inflation-adjusted performance
expectations) in at least 40%-50% of the years. This range reflects the
potential for strong upside in many years while balancing the
understanding that markets do experience downturns. The fact that 61.54%
of the years exceeded the aggressive target indicates consistent and
robust growth, making AMZN a strong option for those seeking aggressive
investments.
Graph


AMZN CAGR
Data
Compound Average Growth Rates (1998-2024)
Date
|
Close
|
1-Year CAGR
|
5-Year CAGR
|
10-Year CAGR
|
20-Year CAGR
|
30-Year CAGR
|
2024-12-20
|
224.92
|
44.92%
|
17.50%
|
28.92%
|
26.15%
|
NA
|
2024-01-01
|
155.20
|
50.49%
|
12.55%
|
24.09%
|
22.88%
|
NA
|
2023-01-01
|
103.13
|
-31.05%
|
7.29%
|
22.76%
|
25.54%
|
NA
|
2022-01-01
|
149.57
|
-6.70%
|
29.44%
|
31.44%
|
30.67%
|
NA
|
2021-01-01
|
160.31
|
59.61%
|
40.43%
|
34.17%
|
29.80%
|
NA
|
2020-01-01
|
100.44
|
16.87%
|
41.46%
|
31.97%
|
18.75%
|
NA
|
2019-01-01
|
85.94
|
18.47%
|
36.81%
|
40.15%
|
18.42%
|
NA
|
2018-01-01
|
72.54
|
76.20%
|
40.46%
|
34.02%
|
32.78%
|
NA
|
2017-01-01
|
41.17
|
40.27%
|
33.47%
|
36.16%
|
NA
|
NA
|
2016-01-01
|
29.35
|
65.54%
|
28.19%
|
29.34%
|
NA
|
NA
|
2015-01-01
|
17.73
|
-1.12%
|
23.11%
|
23.43%
|
NA
|
NA
|
2014-01-01
|
17.93
|
35.12%
|
43.56%
|
21.68%
|
NA
|
NA
|
2013-01-01
|
13.27
|
36.52%
|
27.88%
|
28.39%
|
NA
|
NA
|
2012-01-01
|
9.72
|
14.62%
|
38.90%
|
29.91%
|
NA
|
NA
|
2011-01-01
|
8.48
|
35.25%
|
30.51%
|
25.57%
|
NA
|
NA
|
2010-01-01
|
6.27
|
113.27%
|
23.76%
|
6.86%
|
NA
|
NA
|
2009-01-01
|
2.94
|
-24.23%
|
3.13%
|
0.07%
|
NA
|
NA
|
2008-01-01
|
3.88
|
106.38%
|
28.91%
|
31.55%
|
NA
|
NA
|
2007-01-01
|
1.88
|
-16.07%
|
21.50%
|
NA
|
NA
|
NA
|
2006-01-01
|
2.24
|
3.70%
|
20.82%
|
NA
|
NA
|
NA
|
2005-01-01
|
2.16
|
-14.29%
|
-7.73%
|
NA
|
NA
|
NA
|
2004-01-01
|
2.52
|
131.19%
|
-2.90%
|
NA
|
NA
|
NA
|
2003-01-01
|
1.09
|
53.52%
|
34.24%
|
NA
|
NA
|
NA
|
2002-01-01
|
0.71
|
-18.39%
|
NA
|
NA
|
NA
|
NA
|
2001-01-01
|
0.87
|
-73.07%
|
NA
|
NA
|
NA
|
NA
|
2000-01-01
|
3.23
|
10.62%
|
NA
|
NA
|
NA
|
NA
|
1999-01-01
|
2.92
|
1,068.00%
|
NA
|
NA
|
NA
|
NA
|
1998-01-01
|
0.25
|
NA
|
NA
|
NA
|
NA
|
NA
|
Summary
Compound Average Growth Rates (1998-2024)
Statistic
|
1-Year CAGR
|
5-Year CAGR
|
10-Year CAGR
|
20-Year CAGR
|
30-Year CAGR
|
Overall
|
Count of Observations
|
25
|
22
|
17
|
7
|
NA
|
71
|
Mean
|
27.31%
|
25.26%
|
26.56%
|
25.55%
|
NA
|
26.32%
|
Median
|
18.47%
|
28.55%
|
29.34%
|
25.54%
|
NA
|
28.39%
|
Standard Deviation (Volatility)
|
48.27%
|
14.63%
|
10.11%
|
5.78%
|
NA
|
29.83%
|
Min CAGR Range (CAGR - SD)
|
-20.21%
|
13.43%
|
17.95%
|
22.28%
|
NA
|
-1.77%
|
Max CAGR Range (CAGR + SD)
|
76.33%
|
42.69%
|
38.17%
|
33.84%
|
NA
|
57.89%
|
Minimum
|
-73.07%
|
-7.73%
|
0.07%
|
18.42%
|
NA
|
-73.07%
|
Maximum
|
131.19%
|
43.56%
|
40.15%
|
32.78%
|
NA
|
131.19%
|
Percent Above Inflation Target
|
68%
|
90.91%
|
94.12%
|
100%
|
NA
|
83.1%
|
Percent Above Conservative Target
|
64%
|
86.36%
|
94.12%
|
100%
|
NA
|
81.69%
|
Percent Above Moderate Target
|
64%
|
86.36%
|
88.24%
|
100%
|
NA
|
78.87%
|
Percent Above Aggressive Target
|
60%
|
81.82%
|
88.24%
|
100%
|
NA
|
76.06%
|
1998-2024 Summary: The 1-Year CAGR exhibits the
highest mean return at 27.31%, and the greatest volatility with a
standard deviation of 48.27%. As the investment horizon extends to 5,
10, and 20 years, the mean returns decrease, ranging from 25.26% to
25.55%, while volatility diminishes, with standard deviations dropping
from 14.63% to 5.78%. This trend indicates that longer investment
periods tend to offer more stable returns. Furthermore, the percentage
of periods exceeding the inflation target increases with longer
durations, from 68% in the 1-Year CAGR to 100% in the 20-Year CAGR,
underscoring AMZN’s effectiveness as a hedge against inflation over
extended timeframes. With an overall percentage of 76.06% exceeding the
aggressive target (13.16% annualized returns with 3.16% inflation), AMZN
has, over this time period, proven to be a strong option for a
high-returning long-term investment.
Graph
All Periods
Compound Average Growth Rates Across Periods


Short-Term
Compound Average Growth Rates Across Short-Term Rolling Periods

Long-Term
Compound Average Growth Rates Across Long-Term Rolling Periods

TSLA
Tesla, Inc. (TSLA) is considered a leading technology and automotive
company headquartered in Palo Alto, California (now officially in
Austin, Texas). Established in 2003 by Martin Eberhard and Marc
Tarpenning, with early contributions from Elon Musk, JB Straubel, and
Ian Wright, Tesla is best known for its electric vehicles (EVs) such as
the Model S, Model 3, Model X, and Model Y. The company also excels in
clean energy solutions, including solar panels, solar roofs, and energy
storage products like the Powerwall and Megapack. Tesla has been a
pioneer in autonomous driving technologies and artificial intelligence
(AI), developing cutting-edge software and hardware for Full
Self-Driving (FSD) capabilities.
TSLA GR
Data
The TSLA Data presented here is sourced from Yahoo Finance, filtered
to display Monthly Historical Data (e.g., 03/01/2024). This data
represents the closing price of the last trading day of each month
(e.g., 03/28/2024). Please note that the statistics presented here may
differ from those in Yahoo Finance’s Performance section due to
differences in data aggregation and calculation methods.
Data Source: Tesla, Inc. (TSLA) Index - TSLA Historical Chart | Via
https://finance.yahoo.com/quote/TSLA/history/?frequency=1mo&period1=1277818200&period2=1734901990.
Excludes Quarterly Dividends and Stock Splits. Price on date may differ
between databases by +/-1%.
Summary
Annual Growth Rate Summary (2011-2024)
Statistic
|
Value
|
Definition
|
Count of Observations
|
13
|
Total number of data points collected over the specific period.
|
CAGR
|
44.18%
|
Compound Average Growth Rate; mean growth rate over a period if it had
compounded anually.
|
Mean
|
84.74%
|
Reflects the general price level and overall growth rate.
|
Median
|
20.5%
|
Middle value of the data when ordered chronologically; central tendency
measure less affected by extreme values.
|
Standard Deviation (Volatility)
|
166.57%
|
The dispersion of values from the mean, indicating the volatility of
price changes and economic stability.
|
Min CAGR Range (CAGR - SD)
|
-122.39%
|
Lower boundary of expected TSLA range; lowest estimate of typical growth
rate considering normal fluctuations.
|
Max CAGR Range (CAGR + SD)
|
210.75%
|
Upper boundary of expected TSLA range; highest estimate of typical
growth rate considering normal fluctuations.
|
Minimum
|
-44.52%
|
Lowest growth rate.
|
Maximum
|
509.89%
|
Highest growth rate.
|
Percent Above Inflation Target
|
76.92%
|
Percentage of values above the inflation target specified in Preferred
Targets section.
|
Percent Above Conservative Target
|
76.92%
|
Percentage of values above the conservative target specified in
Preferred Targets section.
|
Percent Above Moderate Target
|
69.23%
|
Percentage of values above the moderate target specified in Preferred
Targets section.
|
Percent Above Aggressive Target
|
61.54%
|
Percentage of values above the aggressive target specified in Preferred
Targets section.
|
TSLA’s Index exhibits a aggressive CAGR at 44.18%, lower than the
mean growth rate of 84.74%, reflecting the impact of short-term
volatility and growth spikes. The median return of 20.5% indicates that
more than half of the observed years experienced returns below the mean.
The relationship between the CAGR and the median growth rate suggests
that sustained periods of above-median growth have exerted cumulative
downward pressure on overall price levels. This relationship highlights
a distribution with notable extremes on the higher end, reflecting
positive skewness. This negative skewness implies that while more than
half of the observed years experienced returns below the mean, upturns
can be significant. However, the market has historically provided
substantial downside risk. Additionally, the fact that 76.92% of the
years exceeded the inflation target reinforces TSLA’s effectiveness as a
strong long-term hedge against inflation.
The standard deviation of 166.57% indicates extreme volatility,
reflecting substantial fluctuations in equity markets. The notable range
of annual returns, spanning from -44.52% to 509.89%, highlights notable
market variability, partly due to its composition, reflecting both
opportunities and risks.
For TSLA to be considered a high-performing and resilient long-term
investment, it would be ideal to exceed the aggressive target (e.g., 10%
annualized returns, accounting for higher inflation-adjusted performance
expectations) in at least 40%-50% of the years. This range reflects the
potential for strong upside in many years while balancing the
understanding that markets do experience downturns. The fact that 61.54%
of the years exceeded the aggressive target indicates consistent and
robust growth, making TSLA a strong option for those seeking aggressive
investments.
Graph

TSLA CAGR
Data
Compound Average Growth Rates (2011-2024)
Date
|
Close
|
1-Year CAGR
|
5-Year CAGR
|
10-Year CAGR
|
20-Year CAGR
|
30-Year CAGR
|
2024-12-20
|
421.06
|
124.82%
|
57.55%
|
40.99%
|
NA
|
NA
|
2024-01-01
|
187.29
|
8.12%
|
55.70%
|
31.53%
|
NA
|
NA
|
2023-01-01
|
173.22
|
-44.52%
|
48.96%
|
52.78%
|
NA
|
NA
|
2022-01-01
|
312.24
|
18.04%
|
79.41%
|
66.21%
|
NA
|
NA
|
2021-01-01
|
264.51
|
509.89%
|
83.39%
|
66.56%
|
NA
|
NA
|
2020-01-01
|
43.37
|
111.87%
|
26.16%
|
NA
|
NA
|
NA
|
2019-01-01
|
20.47
|
-13.34%
|
11.11%
|
NA
|
NA
|
NA
|
2018-01-01
|
23.62
|
40.60%
|
56.70%
|
NA
|
NA
|
NA
|
2017-01-01
|
16.80
|
31.76%
|
53.99%
|
NA
|
NA
|
NA
|
2016-01-01
|
12.75
|
-6.04%
|
51.26%
|
NA
|
NA
|
NA
|
2015-01-01
|
13.57
|
12.24%
|
NA
|
NA
|
NA
|
NA
|
2014-01-01
|
12.09
|
383.60%
|
NA
|
NA
|
NA
|
NA
|
2013-01-01
|
2.50
|
28.87%
|
NA
|
NA
|
NA
|
NA
|
2012-01-01
|
1.94
|
20.50%
|
NA
|
NA
|
NA
|
NA
|
2011-01-01
|
1.61
|
NA
|
NA
|
NA
|
NA
|
NA
|
Summary
Compound Average Growth Rates (2011-2024)
Statistic
|
1-Year CAGR
|
5-Year CAGR
|
10-Year CAGR
|
20-Year CAGR
|
30-Year CAGR
|
Overall
|
Count of Observations
|
13
|
9
|
4
|
NA
|
NA
|
26
|
Mean
|
84.74%
|
51.85%
|
54.27%
|
NA
|
NA
|
68.67%
|
Median
|
20.5%
|
53.99%
|
59.49%
|
NA
|
NA
|
44.78%
|
Standard Deviation (Volatility)
|
166.57%
|
22.71%
|
16.46%
|
NA
|
NA
|
117.41%
|
Min CAGR Range (CAGR - SD)
|
-122.39%
|
21.47%
|
27.72%
|
NA
|
NA
|
-73.23%
|
Max CAGR Range (CAGR + SD)
|
210.75%
|
66.89%
|
60.64%
|
NA
|
NA
|
161.59%
|
Minimum
|
-44.52%
|
11.11%
|
31.53%
|
NA
|
NA
|
-44.52%
|
Maximum
|
509.89%
|
83.39%
|
66.56%
|
NA
|
NA
|
509.89%
|
Percent Above Inflation Target
|
76.92%
|
100%
|
100%
|
NA
|
NA
|
88.46%
|
Percent Above Conservative Target
|
76.92%
|
100%
|
100%
|
NA
|
NA
|
88.46%
|
Percent Above Moderate Target
|
76.92%
|
100%
|
100%
|
NA
|
NA
|
84.62%
|
Percent Above Aggressive Target
|
69.23%
|
88.89%
|
100%
|
NA
|
NA
|
76.92%
|
2011-2024 Summary: The 1-Year CAGR exhibits the
highest mean return at 84.74%, and the greatest volatility with a
standard deviation of 166.57%. As the investment horizon extends to 5,
and 10 years, the mean returns decrease, ranging from 51.85% to 54.27%,
while volatility diminishes, with standard deviations dropping from
22.71% to 16.46%. This trend indicates that longer investment periods
tend to offer more stable returns. Furthermore, the percentage of
periods exceeding the inflation target increases with longer durations,
from 76.92% in the 1-Year CAGR to 100% in the 10-Year CAGR, underscoring
TSLA’s effectiveness as a hedge against inflation over extended
timeframes. With an overall percentage of 76.92% exceeding the
aggressive target (13.16% annualized returns with 3.16% inflation), TSLA
has, over this time period, proven to be a strong option for a
high-returning long-term investment.
Graph
All Periods
Compound Average Growth Rates Across Periods


Short-Term
Compound Average Growth Rates Across Short-Term Rolling Periods

COST
Costco Wholesale Corporation (COST) is considered a leading retail
company headquartered in Issaquah, Washington. Established in 1983 by
James Sinegal and Jeffrey Brotman, Costco is best known for its
membership-based warehouse stores that offer a wide range of products,
including groceries, electronics, household goods, and apparel, at
competitive prices. Costco is also recognized for its Kirkland Signature
private-label brand, which spans various product categories. In addition
to retail, Costco operates in e-commerce and logistics, providing online
shopping and efficient supply chain management to enhance customer
convenience.
COST GR
Data
The COST Data presented here is sourced from Yahoo Finance, filtered
to display Monthly Historical Data (e.g., 03/01/2024). This data
represents the closing price of the last trading day of each month
(e.g., 03/28/2024). Please note that the statistics presented here may
differ from those in Yahoo Finance’s Performance section due to
differences in data aggregation and calculation methods.
Data Source: Costco Wholesale Corporation (COST) Index - COST
Historical Chart | Via https://finance.yahoo.com/quote/COST/history/?frequency=1mo&period1=521299800&period2=1734902045.
Excludes Quarterly Dividends and Stock Splits. Price on date may differ
between databases by +/-1%.
Summary
Annual Growth Rate Summary (1987-2024)
Statistic
|
Value
|
Definition
|
Count of Observations
|
37
|
Total number of data points collected over the specific period.
|
CAGR
|
12.23%
|
Compound Average Growth Rate; mean growth rate over a period if it had
compounded anually.
|
Mean
|
15.02%
|
Reflects the general price level and overall growth rate.
|
Median
|
13.11%
|
Middle value of the data when ordered chronologically; central tendency
measure less affected by extreme values.
|
Standard Deviation (Volatility)
|
25.86%
|
The dispersion of values from the mean, indicating the volatility of
price changes and economic stability.
|
Min CAGR Range (CAGR - SD)
|
-13.63%
|
Lower boundary of expected COST range; lowest estimate of typical growth
rate considering normal fluctuations.
|
Max CAGR Range (CAGR + SD)
|
38.09%
|
Upper boundary of expected COST range; highest estimate of typical
growth rate considering normal fluctuations.
|
Minimum
|
-37.24%
|
Lowest growth rate.
|
Maximum
|
91.06%
|
Highest growth rate.
|
Percent Above Inflation Target
|
72.97%
|
Percentage of values above the inflation target specified in Preferred
Targets section.
|
Percent Above Conservative Target
|
62.16%
|
Percentage of values above the conservative target specified in
Preferred Targets section.
|
Percent Above Moderate Target
|
62.16%
|
Percentage of values above the moderate target specified in Preferred
Targets section.
|
Percent Above Aggressive Target
|
48.65%
|
Percentage of values above the aggressive target specified in Preferred
Targets section.
|
COST’s Index exhibits a moderate CAGR at 12.23%, lower than the mean
growth rate of 15.02%, reflecting the impact of short-term volatility
and growth spikes. The median return of 13.11% indicates that more than
half of the observed years experienced returns above the mean. The
relationship between the CAGR and the median growth rate suggests that
sustained periods of above-median growth have exerted cumulative upward
pressure on overall price levels. This relationship highlights a
distribution with notable extremes on the higher end, reflecting
positive skewness. This positive skewness implies that while more than
half of the observed years experienced returns above the mean, downturns
can be severe. However, the market has historically provided substantial
upside potential. Additionally, the fact that 72.97% of the years
exceeded the inflation target reinforces COST’s effectiveness as a
strong long-term hedge against inflation.
The standard deviation of 25.86% indicates extreme volatility,
reflecting substantial fluctuations in equity markets. The notable range
of annual returns, spanning from -37.24% to 91.06%, highlights notable
market variability, partly due to its composition, reflecting both
opportunities and risks.
For COST to be considered a high-performing and resilient long-term
investment, it would be ideal to exceed the aggressive target (e.g., 10%
annualized returns, accounting for higher inflation-adjusted performance
expectations) in at least 40%-50% of the years. This range reflects the
potential for strong upside in many years while balancing the
understanding that markets do experience downturns. The fact that 48.65%
of the years exceeded the aggressive target suggests that while not
consistent, COST has historically provided robust growth over the long
term, making it a viable investment for those with a higher risk
tolerance.
Graph


COST CAGR
Data
Compound Average Growth Rates (1987-2024)
Date
|
Close
|
1-Year CAGR
|
5-Year CAGR
|
10-Year CAGR
|
20-Year CAGR
|
30-Year CAGR
|
2024-12-20
|
954.07
|
37.30%
|
25.58%
|
20.90%
|
16.21%
|
17.87%
|
2024-01-01
|
694.88
|
35.95%
|
26.49%
|
19.99%
|
15.80%
|
15.64%
|
2023-01-01
|
511.14
|
1.19%
|
21.27%
|
17.45%
|
15.45%
|
14.26%
|
2022-01-01
|
505.13
|
43.33%
|
25.24%
|
19.90%
|
12.73%
|
13.46%
|
2021-01-01
|
352.43
|
15.35%
|
18.45%
|
17.24%
|
10.69%
|
12.21%
|
2020-01-01
|
305.52
|
42.35%
|
16.40%
|
18.19%
|
9.59%
|
12.13%
|
2019-01-01
|
214.63
|
10.14%
|
13.82%
|
16.90%
|
8.57%
|
11.00%
|
2018-01-01
|
194.87
|
18.86%
|
13.75%
|
11.11%
|
11.60%
|
10.83%
|
2017-01-01
|
163.95
|
8.49%
|
14.79%
|
11.31%
|
13.38%
|
9.88%
|
2016-01-01
|
151.12
|
5.69%
|
16.04%
|
11.72%
|
15.97%
|
NA
|
2015-01-01
|
142.99
|
27.26%
|
20.01%
|
11.70%
|
16.38%
|
NA
|
2014-01-01
|
112.36
|
9.79%
|
20.07%
|
11.77%
|
13.53%
|
NA
|
2013-01-01
|
102.34
|
24.40%
|
8.54%
|
13.49%
|
12.69%
|
NA
|
2012-01-01
|
82.27
|
14.52%
|
7.94%
|
5.99%
|
10.37%
|
NA
|
2011-01-01
|
71.84
|
25.09%
|
7.56%
|
4.50%
|
9.77%
|
NA
|
2010-01-01
|
57.43
|
27.54%
|
3.97%
|
1.61%
|
9.22%
|
NA
|
2009-01-01
|
45.03
|
-33.72%
|
4.04%
|
0.83%
|
8.16%
|
NA
|
2008-01-01
|
67.94
|
20.98%
|
18.67%
|
12.10%
|
10.69%
|
NA
|
2007-01-01
|
56.16
|
12.57%
|
4.07%
|
15.48%
|
9.17%
|
NA
|
2006-01-01
|
49.89
|
5.54%
|
1.53%
|
20.37%
|
NA
|
NA
|
2005-01-01
|
47.27
|
27.96%
|
-0.69%
|
21.26%
|
NA
|
NA
|
2004-01-01
|
36.94
|
27.95%
|
-2.27%
|
15.32%
|
NA
|
NA
|
2003-01-01
|
28.87
|
-37.24%
|
5.89%
|
11.90%
|
NA
|
NA
|
2002-01-01
|
46.00
|
-0.54%
|
28.15%
|
14.93%
|
NA
|
NA
|
2001-01-01
|
46.25
|
-5.50%
|
42.72%
|
15.31%
|
NA
|
NA
|
2000-01-01
|
48.94
|
18.10%
|
48.05%
|
17.40%
|
NA
|
NA
|
1999-01-01
|
41.44
|
91.06%
|
36.08%
|
16.02%
|
NA
|
NA
|
1998-01-01
|
21.69
|
62.96%
|
18.25%
|
9.30%
|
NA
|
NA
|
1997-01-01
|
13.31
|
70.42%
|
3.07%
|
3.19%
|
NA
|
NA
|
1996-01-01
|
7.81
|
13.52%
|
-6.84%
|
NA
|
NA
|
NA
|
1995-01-01
|
6.88
|
-22.52%
|
-6.91%
|
NA
|
NA
|
NA
|
1994-01-01
|
8.88
|
-5.33%
|
-1.09%
|
NA
|
NA
|
NA
|
1993-01-01
|
9.38
|
-18.01%
|
1.03%
|
NA
|
NA
|
NA
|
1992-01-01
|
11.44
|
2.79%
|
3.31%
|
NA
|
NA
|
NA
|
1991-01-01
|
11.13
|
13.11%
|
NA
|
NA
|
NA
|
NA
|
1990-01-01
|
9.84
|
4.90%
|
NA
|
NA
|
NA
|
NA
|
1989-01-01
|
9.38
|
5.27%
|
NA
|
NA
|
NA
|
NA
|
1988-01-01
|
8.91
|
-8.33%
|
NA
|
NA
|
NA
|
NA
|
1987-01-01
|
9.72
|
NA
|
NA
|
NA
|
NA
|
NA
|
Summary
Compound Average Growth Rates (1987-2024)
Statistic
|
1-Year CAGR
|
5-Year CAGR
|
10-Year CAGR
|
20-Year CAGR
|
30-Year CAGR
|
Overall
|
Count of Observations
|
37
|
33
|
28
|
18
|
8
|
124
|
Mean
|
15.02%
|
13.07%
|
13.08%
|
11.88%
|
12.43%
|
13.44%
|
Median
|
13.11%
|
13.75%
|
14.21%
|
11.14%
|
12.17%
|
12.63%
|
Standard Deviation (Volatility)
|
25.86%
|
13.38%
|
5.68%
|
2.72%
|
1.93%
|
15.87%
|
Min CAGR Range (CAGR - SD)
|
-13.63%
|
-1.15%
|
6.55%
|
9.51%
|
10.3%
|
-3.64%
|
Max CAGR Range (CAGR + SD)
|
38.09%
|
25.61%
|
17.91%
|
14.95%
|
14.16%
|
28.1%
|
Minimum
|
-37.24%
|
-6.91%
|
0.83%
|
8.16%
|
9.88%
|
-37.24%
|
Maximum
|
91.06%
|
48.05%
|
21.26%
|
16.38%
|
15.64%
|
91.06%
|
Percent Above Inflation Target
|
75.68%
|
78.79%
|
92.86%
|
100%
|
100%
|
83.87%
|
Percent Above Conservative Target
|
70.27%
|
63.64%
|
85.71%
|
100%
|
100%
|
74.19%
|
Percent Above Moderate Target
|
62.16%
|
60.61%
|
82.14%
|
100%
|
100%
|
72.58%
|
Percent Above Aggressive Target
|
54.05%
|
51.52%
|
57.14%
|
44.44%
|
62.5%
|
47.58%
|
1987-2024 Summary: The 1-Year CAGR exhibits the
highest mean return at 15.02%, and the greatest volatility with a
standard deviation of 25.86%. As the investment horizon extends to 5,
10, and 20 years, the mean returns decrease, ranging from 13.07% to
11.88%, while volatility diminishes, with standard deviations dropping
from 13.38% to 2.72%. This trend indicates that longer investment
periods tend to offer more stable returns. Furthermore, the percentage
of periods exceeding the inflation target increases with longer
durations, from 75.68% in the 1-Year CAGR to 100% in the 20-Year CAGR,
underscoring COST’s effectiveness as a hedge against inflation over
extended timeframes. With an overall percentage of 47.58% exceeding the
aggressive target (13.16% annualized returns with 3.16% inflation), COST
has, over this time period, demonstrated itself as a viable option for a
high-returning long-term investment.
Graph
All Periods
Compound Average Growth Rates Across Periods


Short-Term
Compound Average Growth Rates Across Short-Term Rolling Periods

Long-Term
Compound Average Growth Rates Across Long-Term Rolling Periods

VTI
The Vanguard Total Stock Market ETF (VTI) is an exchange-traded fund
(ETF) that aims to track the performance of the CRSP US Total Market
Index, representing the entire U.S. stock market. Established and
managed by Vanguard, VTI provides broad exposure to large-cap, mid-cap,
small-cap, and micro-cap stocks, spanning various sectors, including
technology, healthcare, financials, and consumer goods.
VTI is one of the most popular ETFs among investors due to its low
expense ratio, high diversification, and tax efficiency. It includes
thousands of publicly traded companies, offering a comprehensive way to
invest in the overall U.S. equity market. Vanguard is favored for its
cost-effective investment options and passive management
VTI GR
Data
The VTI Data presented here is sourced from Yahoo Finance, filtered
to display Monthly Historical Data (e.g., 03/01/2024). This data
represents the closing price of the last trading day of each month
(e.g., 03/28/2024). Please note that the statistics presented here may
differ from those in Yahoo Finance’s Performance section due to
differences in data aggregation and calculation methods.
Data Source: Vanguard Total Stock Market Index Fund ETF Shares (VTI)
Index - VTI Historical Chart | Via https://finance.yahoo.com/quote/VTI/history/?frequency=1mo&period1=992611800&period2=1734304278.
Excludes Quarterly Dividends and Stock Splits. Price on date may differ
between databases by +/-1%.
Summary
Annual Growth Rate Summary (2002-2024)
Statistic
|
Value
|
Definition
|
Count of Observations
|
22
|
Total number of data points collected over the specific period.
|
CAGR
|
7.17%
|
Compound Average Growth Rate; mean growth rate over a period if it had
compounded anually.
|
Mean
|
8.78%
|
Reflects the general price level and overall growth rate.
|
Median
|
13.27%
|
Middle value of the data when ordered chronologically; central tendency
measure less affected by extreme values.
|
Standard Deviation (Volatility)
|
17.68%
|
The dispersion of values from the mean, indicating the volatility of
price changes and economic stability.
|
Min CAGR Range (CAGR - SD)
|
-10.51%
|
Lower boundary of expected VTI range; lowest estimate of typical growth
rate considering normal fluctuations.
|
Max CAGR Range (CAGR + SD)
|
24.85%
|
Upper boundary of expected VTI range; highest estimate of typical growth
rate considering normal fluctuations.
|
Minimum
|
-39.59%
|
Lowest growth rate.
|
Maximum
|
35.97%
|
Highest growth rate.
|
Percent Above Inflation Target
|
68.18%
|
Percentage of values above the inflation target specified in Preferred
Targets section.
|
Percent Above Conservative Target
|
63.64%
|
Percentage of values above the conservative target specified in
Preferred Targets section.
|
Percent Above Moderate Target
|
63.64%
|
Percentage of values above the moderate target specified in Preferred
Targets section.
|
Percent Above Aggressive Target
|
50%
|
Percentage of values above the aggressive target specified in Preferred
Targets section.
|
VTI’s Index exhibits a conservative CAGR at 7.17%, lower than the
mean growth rate of 8.78%, reflecting the impact of short-term
volatility and growth spikes. The median return of 13.27% indicates that
more than half of the observed years experienced returns above the mean.
The relationship between the CAGR and the median growth rate suggests
that sustained periods of above-median growth have exerted cumulative
upward pressure on overall price levels. This relationship highlights a
distribution with notable extremes on the higher end, reflecting
positive skewness. This positive skewness implies that while more than
half of the observed years experienced returns above the mean, downturns
can be severe. However, the market has historically provided substantial
upside potential. Additionally, the fact that 68.18% of the years
exceeded the inflation target reinforces VTI’s effectiveness as a
long-term hedge against inflation.
The standard deviation of 17.68% underscores significant volatility,
a common feature of equity markets. The notable range of annual returns,
spanning from -39.59% to 35.97%, highlights notable market variability,
partly due to its composition, reflecting both opportunities and
risks.
For VTI to be considered a high-performing and resilient long-term
investment, it would be ideal to exceed the aggressive target (e.g., 10%
annualized returns, accounting for higher inflation-adjusted performance
expectations) in at least 40%-50% of the years. This range reflects the
potential for strong upside in many years while balancing the
understanding that markets do experience downturns. The fact that 50% of
the years exceeded the aggressive target suggests that while not
consistent, VTI has historically provided robust growth over the long
term, making it a viable investment for those with a higher risk
tolerance.
Graph

VTI CAGR
Data
Compound Average Growth Rates (2002-2024)
Date
|
Close
|
1-Year CAGR
|
5-Year CAGR
|
10-Year CAGR
|
20-Year CAGR
|
30-Year CAGR
|
2024-12-13
|
299.93
|
25.04%
|
12.90%
|
11.27%
|
8.60%
|
NA
|
2024-01-01
|
239.87
|
17.34%
|
11.61%
|
9.95%
|
7.68%
|
NA
|
2023-01-01
|
204.43
|
-9.87%
|
7.20%
|
10.22%
|
8.48%
|
NA
|
2022-01-01
|
226.81
|
16.92%
|
14.07%
|
12.87%
|
7.62%
|
NA
|
2021-01-01
|
193.99
|
18.63%
|
14.56%
|
11.34%
|
NA
|
NA
|
2020-01-01
|
163.52
|
18.04%
|
9.66%
|
11.64%
|
NA
|
NA
|
2019-01-01
|
138.53
|
-4.09%
|
8.32%
|
12.91%
|
NA
|
NA
|
2018-01-01
|
144.43
|
22.96%
|
13.33%
|
7.81%
|
NA
|
NA
|
2017-01-01
|
117.46
|
19.45%
|
11.70%
|
5.10%
|
NA
|
NA
|
2016-01-01
|
98.33
|
-4.63%
|
8.21%
|
4.45%
|
NA
|
NA
|
2015-01-01
|
103.10
|
11.00%
|
13.66%
|
6.00%
|
NA
|
NA
|
2014-01-01
|
92.88
|
20.23%
|
17.69%
|
5.45%
|
NA
|
NA
|
2013-01-01
|
77.25
|
14.34%
|
2.55%
|
6.76%
|
NA
|
NA
|
2012-01-01
|
67.56
|
1.96%
|
-1.10%
|
2.61%
|
NA
|
NA
|
2011-01-01
|
66.26
|
21.89%
|
0.81%
|
NA
|
NA
|
NA
|
2010-01-01
|
54.36
|
32.13%
|
-1.13%
|
NA
|
NA
|
NA
|
2009-01-01
|
41.14
|
-39.59%
|
-5.51%
|
NA
|
NA
|
NA
|
2008-01-01
|
68.10
|
-4.64%
|
11.13%
|
NA
|
NA
|
NA
|
2007-01-01
|
71.41
|
12.19%
|
6.45%
|
NA
|
NA
|
NA
|
2006-01-01
|
63.65
|
10.60%
|
NA
|
NA
|
NA
|
NA
|
2005-01-01
|
57.55
|
5.36%
|
NA
|
NA
|
NA
|
NA
|
2004-01-01
|
54.62
|
35.97%
|
NA
|
NA
|
NA
|
NA
|
2003-01-01
|
40.17
|
-23.10%
|
NA
|
NA
|
NA
|
NA
|
2002-01-01
|
52.24
|
NA
|
NA
|
NA
|
NA
|
NA
|
Summary
Compound Average Growth Rates (2002-2024)
Statistic
|
1-Year CAGR
|
5-Year CAGR
|
10-Year CAGR
|
20-Year CAGR
|
30-Year CAGR
|
Overall
|
Count of Observations
|
22
|
18
|
13
|
3
|
NA
|
56
|
Mean
|
8.78%
|
7.96%
|
8.24%
|
7.93%
|
NA
|
8.34%
|
Median
|
13.27%
|
8.99%
|
7.81%
|
7.68%
|
NA
|
9.8%
|
Standard Deviation (Volatility)
|
17.68%
|
6.45%
|
3.44%
|
0.48%
|
NA
|
11.62%
|
Min CAGR Range (CAGR - SD)
|
-10.51%
|
0.72%
|
3.73%
|
6.69%
|
NA
|
-4.45%
|
Max CAGR Range (CAGR + SD)
|
24.85%
|
13.62%
|
10.61%
|
7.65%
|
NA
|
18.79%
|
Minimum
|
-39.59%
|
-5.51%
|
2.61%
|
7.62%
|
NA
|
-39.59%
|
Maximum
|
35.97%
|
17.69%
|
12.91%
|
8.48%
|
NA
|
35.97%
|
Percent Above Inflation Target
|
68.18%
|
77.78%
|
100%
|
100%
|
NA
|
76.79%
|
Percent Above Conservative Target
|
68.18%
|
72.22%
|
84.62%
|
100%
|
NA
|
67.86%
|
Percent Above Moderate Target
|
63.64%
|
66.67%
|
53.85%
|
100%
|
NA
|
57.14%
|
Percent Above Aggressive Target
|
54.55%
|
27.78%
|
15.38%
|
0%
|
NA
|
28.57%
|
2002-2024 Summary: The 1-Year CAGR exhibits the
highest mean return at 8.78%, and the greatest volatility with a
standard deviation of 17.68%. As the investment horizon extends to 5,
10, and 20 years, the mean returns decrease, ranging from 7.96% to
7.93%, while volatility diminishes, with standard deviations dropping
from 6.45% to 0.48%. This trend indicates that longer investment periods
tend to offer more stable returns. Furthermore, the percentage of
periods exceeding the inflation target increases with longer durations,
from 68.18% in the 1-Year CAGR to 100% in the 20-Year CAGR, underscoring
VTI’s effectiveness as a hedge against inflation over extended
timeframes. With an overall percentage of 28.57% exceeding the
aggressive target (13.16% annualized returns with 3.16% inflation), VTI
appears, over this time period, to be a less suitable option for a
high-returning long-term investment.
Graph
All Periods
Compound Average Growth Rates Across Periods

Short-Term
Compound Average Growth Rates Across Short-Term Rolling Periods

VOO
The Vanguard S&P 500 ETF (VOO) is an exchange-traded fund (ETF)
designed to track the performance of the S&P 500 Index, which
comprises 500 of the largest publicly traded companies in the United
States. Managed by Vanguard, VOO provides investors with exposure to a
diverse range of sectors, including technology, healthcare, consumer
goods, and financials.
VOO is known for its low expense ratio, making it a cost-effective
option for investors seeking to mirror the performance of the U.S. stock
market’s large-cap segment. As one of the largest and most liquid ETFs,
VOO offers a straightforward and efficient way to invest in the overall
U.S. economy. It is particularly popular for diversification and steady
growth.
VOO GR
Data
The VOO Data presented here is sourced from Yahoo Finance, filtered
to display Monthly Historical Data (e.g., 03/01/2024). This data
represents the closing price of the last trading day of each month
(e.g., 03/28/2024). Please note that the statistics presented here may
differ from those in Yahoo Finance’s Performance section due to
differences in data aggregation and calculation methods.
Data Source: Vanguard S&P 500 ETF (VOO) Index - VOO Historical
Chart | Via https://finance.yahoo.com/quote/VOO/history/?frequency=1mo&period1=1284039000&period2=1734578519.
Excludes Quarterly Dividends and Stock Splits. Price on date may differ
between databases by +/-1%.
Summary
Annual Growth Rate Summary (2011-2024)
Statistic
|
Value
|
Definition
|
Count of Observations
|
13
|
Total number of data points collected over the specific period.
|
CAGR
|
10.75%
|
Compound Average Growth Rate; mean growth rate over a period if it had
compounded anually.
|
Mean
|
11.29%
|
Reflects the general price level and overall growth rate.
|
Median
|
15.05%
|
Middle value of the data when ordered chronologically; central tendency
measure less affected by extreme values.
|
Standard Deviation (Volatility)
|
11.1%
|
The dispersion of values from the mean, indicating the volatility of
price changes and economic stability.
|
Min CAGR Range (CAGR - SD)
|
-0.35%
|
Lower boundary of expected VOO range; lowest estimate of typical growth
rate considering normal fluctuations.
|
Max CAGR Range (CAGR + SD)
|
21.85%
|
Upper boundary of expected VOO range; highest estimate of typical growth
rate considering normal fluctuations.
|
Minimum
|
-9.73%
|
Lowest growth rate.
|
Maximum
|
23.94%
|
Highest growth rate.
|
Percent Above Inflation Target
|
69.23%
|
Percentage of values above the inflation target specified in Preferred
Targets section.
|
Percent Above Conservative Target
|
69.23%
|
Percentage of values above the conservative target specified in
Preferred Targets section.
|
Percent Above Moderate Target
|
69.23%
|
Percentage of values above the moderate target specified in Preferred
Targets section.
|
Percent Above Aggressive Target
|
61.54%
|
Percentage of values above the aggressive target specified in Preferred
Targets section.
|
VOO’s Index exhibits a moderate CAGR at 10.75%, lower than the mean
growth rate of 11.29%, reflecting the impact of short-term volatility
and growth spikes. The median return of 15.05% indicates that more than
half of the observed years experienced returns above the mean. The
relationship between the CAGR and the median growth rate suggests that
sustained periods of above-median growth have exerted cumulative upward
pressure on overall price levels. This relationship highlights a
distribution with notable extremes on the higher end, reflecting
positive skewness. This positive skewness implies that while more than
half of the observed years experienced returns above the mean, downturns
can be severe. However, the market has historically provided substantial
upside potential. Additionally, the fact that 69.23% of the years
exceeded the inflation target reinforces VOO’s effectiveness as a
long-term hedge against inflation.
The standard deviation of 11.1% suggests moderate volatility, typical
of relatively stable markets. The notable range of annual returns,
spanning from -9.73% to 23.94%, highlights notable market variability,
partly due to its composition, reflecting both opportunities and
risks.
For VOO to be considered a high-performing and resilient long-term
investment, it would be ideal to exceed the aggressive target (e.g., 10%
annualized returns, accounting for higher inflation-adjusted performance
expectations) in at least 40%-50% of the years. This range reflects the
potential for strong upside in many years while balancing the
understanding that markets do experience downturns. The fact that 61.54%
of the years exceeded the aggressive target indicates consistent and
robust growth, making VOO a strong option for those seeking aggressive
investments.
Graph

VOO CAGR
Data
Compound Average Growth Rates (2011-2024)
Date
|
Close
|
1-Year CAGR
|
5-Year CAGR
|
10-Year CAGR
|
20-Year CAGR
|
30-Year CAGR
|
2024-12-18
|
539.14
|
21.48%
|
12.76%
|
11.41%
|
NA
|
NA
|
2024-01-01
|
443.82
|
18.85%
|
12.34%
|
10.52%
|
NA
|
NA
|
2023-01-01
|
373.44
|
-9.73%
|
7.59%
|
10.54%
|
NA
|
NA
|
2022-01-01
|
413.69
|
21.61%
|
14.64%
|
13.17%
|
NA
|
NA
|
2021-01-01
|
340.18
|
15.05%
|
13.86%
|
11.20%
|
NA
|
NA
|
2020-01-01
|
295.69
|
19.23%
|
10.07%
|
NA
|
NA
|
NA
|
2019-01-01
|
248.01
|
-4.24%
|
8.73%
|
NA
|
NA
|
NA
|
2018-01-01
|
258.99
|
23.94%
|
13.56%
|
NA
|
NA
|
NA
|
2017-01-01
|
208.97
|
17.56%
|
11.73%
|
NA
|
NA
|
NA
|
2016-01-01
|
177.75
|
-2.86%
|
8.59%
|
NA
|
NA
|
NA
|
2015-01-01
|
182.99
|
12.14%
|
NA
|
NA
|
NA
|
NA
|
2014-01-01
|
163.18
|
19.01%
|
NA
|
NA
|
NA
|
NA
|
2013-01-01
|
137.12
|
14.23%
|
NA
|
NA
|
NA
|
NA
|
2012-01-01
|
120.04
|
1.99%
|
NA
|
NA
|
NA
|
NA
|
2011-01-01
|
117.70
|
NA
|
NA
|
NA
|
NA
|
NA
|
Summary
Compound Average Growth Rates (2011-2024)
Statistic
|
1-Year CAGR
|
5-Year CAGR
|
10-Year CAGR
|
20-Year CAGR
|
30-Year CAGR
|
Overall
|
Count of Observations
|
13
|
9
|
4
|
NA
|
NA
|
26
|
Mean
|
11.29%
|
11.23%
|
11.36%
|
NA
|
NA
|
11.28%
|
Median
|
15.05%
|
11.73%
|
10.87%
|
NA
|
NA
|
12.24%
|
Standard Deviation (Volatility)
|
11.1%
|
2.58%
|
1.25%
|
NA
|
NA
|
7.84%
|
Min CAGR Range (CAGR - SD)
|
-0.35%
|
8.17%
|
9.5%
|
NA
|
NA
|
2.91%
|
Max CAGR Range (CAGR + SD)
|
21.85%
|
13.33%
|
12%
|
NA
|
NA
|
18.59%
|
Minimum
|
-9.73%
|
7.59%
|
10.52%
|
NA
|
NA
|
-9.73%
|
Maximum
|
23.94%
|
14.64%
|
13.17%
|
NA
|
NA
|
23.94%
|
Percent Above Inflation Target
|
69.23%
|
100%
|
100%
|
NA
|
NA
|
84.62%
|
Percent Above Conservative Target
|
69.23%
|
100%
|
100%
|
NA
|
NA
|
84.62%
|
Percent Above Moderate Target
|
69.23%
|
100%
|
100%
|
NA
|
NA
|
80.77%
|
Percent Above Aggressive Target
|
69.23%
|
44.44%
|
25%
|
NA
|
NA
|
46.15%
|
2011-2024 Summary: The 1-Year CAGR exhibits the mean
return at 11.29%, and the greatest volatility with a standard deviation
of 11.1%. As the investment horizon extends to 5, and 10 years, the mean
returns increase, ranging from 11.23% to 11.36%, while volatility
diminishes, with standard deviations dropping from 2.58% to 1.25%. This
trend indicates that longer investment periods tend to offer more stable
returns. Furthermore, the percentage of periods exceeding the inflation
target increases with longer durations, from 69.23% in the 1-Year CAGR
to 100% in the 10-Year CAGR, underscoring VOO’s effectiveness as a hedge
against inflation over extended timeframes. With an overall percentage
of 46.15% exceeding the aggressive target (13.16% annualized returns
with 3.16% inflation), VOO has, over this time period, demonstrated
itself as a viable option for a high-returning long-term investment.
Graph
All Periods
Compound Average Growth Rates Across Periods


Short-Term
Compound Average Growth Rates Across Short-Term Rolling Periods

VGT
The Vanguard Information Technology ETF (VGT) is an exchange-traded
fund (ETF) that provides targeted exposure to the information technology
sector of the U.S. stock market. Managed by Vanguard, VGT seeks to track
the performance of the MSCI US Investable Market Information Technology
25/50 Index, which includes companies involved in software development,
hardware manufacturing, semiconductors, IT services, and other
tech-related industries.
VGT is popular among investors looking to capitalize on the growth
potential of the technology sector. Its holdings include some of the
largest and most innovative companies, such as Apple, Microsoft, and
NVIDIA. The ETF offers a cost-effective way to gain diversified exposure
to this high-growth sector.
VGT GR
Data
The VGT Data presented here is sourced from Yahoo Finance, filtered
to display Monthly Historical Data (e.g., 03/01/2024). This data
represents the closing price of the last trading day of each month
(e.g., 03/28/2024). Please note that the statistics presented here may
differ from those in Yahoo Finance’s Performance section due to
differences in data aggregation and calculation methods.
Data Source: Vanguard Information Technology ETF (VGT) Index - VGT
Historical Chart | Via https://finance.yahoo.com/quote/VGT/history/?frequency=1mo&period1=1075473000&period2=1734894185
since Vanguard does not provide full historical performance on its
website https://investor.vanguard.com/investment-products/etfs/profile/vgt.
Excludes Quarterly Dividends and Stock Splits. Price on date may differ
between databases by +/-1%.
Summary
Annual Growth Rate Summary (2005-2024)
Statistic
|
Value
|
Definition
|
Count of Observations
|
19
|
Total number of data points collected over the specific period.
|
CAGR
|
13.54%
|
Compound Average Growth Rate; mean growth rate over a period if it had
compounded anually.
|
Mean
|
15.81%
|
Reflects the general price level and overall growth rate.
|
Median
|
15.29%
|
Middle value of the data when ordered chronologically; central tendency
measure less affected by extreme values.
|
Standard Deviation (Volatility)
|
22.31%
|
The dispersion of values from the mean, indicating the volatility of
price changes and economic stability.
|
Min CAGR Range (CAGR - SD)
|
-8.77%
|
Lower boundary of expected VGT range; lowest estimate of typical growth
rate considering normal fluctuations.
|
Max CAGR Range (CAGR + SD)
|
35.85%
|
Upper boundary of expected VGT range; highest estimate of typical growth
rate considering normal fluctuations.
|
Minimum
|
-36.96%
|
Lowest growth rate.
|
Maximum
|
53.13%
|
Highest growth rate.
|
Percent Above Inflation Target
|
73.68%
|
Percentage of values above the inflation target specified in Preferred
Targets section.
|
Percent Above Conservative Target
|
63.16%
|
Percentage of values above the conservative target specified in
Preferred Targets section.
|
Percent Above Moderate Target
|
57.89%
|
Percentage of values above the moderate target specified in Preferred
Targets section.
|
Percent Above Aggressive Target
|
57.89%
|
Percentage of values above the aggressive target specified in Preferred
Targets section.
|
VGT’s Index exhibits a aggressive CAGR at 13.54%, lower than the mean
growth rate of 15.81%, reflecting the impact of short-term volatility
and growth spikes. The median return of 15.29% indicates that more than
half of the observed years experienced returns above the mean. The
relationship between the CAGR and the median growth rate suggests that
sustained periods of above-median growth have exerted cumulative upward
pressure on overall price levels. This relationship highlights a
distribution with notable extremes on the higher end, reflecting
positive skewness. This positive skewness implies that while more than
half of the observed years experienced returns above the mean, downturns
can be severe. However, the market has historically provided substantial
upside potential. Additionally, the fact that 73.68% of the years
exceeded the inflation target reinforces VGT’s effectiveness as a strong
long-term hedge against inflation.
The standard deviation of 22.31% indicates extreme volatility,
reflecting substantial fluctuations in equity markets. The notable range
of annual returns, spanning from -36.96% to 53.13%, highlights notable
market variability, partly due to its composition, reflecting both
opportunities and risks.
For VGT to be considered a high-performing and resilient long-term
investment, it would be ideal to exceed the aggressive target (e.g., 10%
annualized returns, accounting for higher inflation-adjusted performance
expectations) in at least 40%-50% of the years. This range reflects the
potential for strong upside in many years while balancing the
understanding that markets do experience downturns. The fact that 57.89%
of the years exceeded the aggressive target indicates consistent and
robust growth, making VGT a strong option for those seeking aggressive
investments.
Graph

VGT CAGR
Data
Compound Average Growth Rates (2005-2024)
Date
|
Close
|
1-Year CAGR
|
5-Year CAGR
|
10-Year CAGR
|
20-Year CAGR
|
30-Year CAGR
|
2024-12-20
|
631.61
|
27.88%
|
19.97%
|
20.14%
|
14.22%
|
NA
|
2024-01-01
|
493.91
|
40.96%
|
22.35%
|
18.90%
|
NA
|
NA
|
2023-01-01
|
350.38
|
-17.02%
|
14.61%
|
17.37%
|
NA
|
NA
|
2022-01-01
|
422.26
|
20.20%
|
27.21%
|
20.35%
|
NA
|
NA
|
2021-01-01
|
351.30
|
38.21%
|
28.08%
|
18.57%
|
NA
|
NA
|
2020-01-01
|
254.18
|
41.09%
|
20.32%
|
17.57%
|
NA
|
NA
|
2019-01-01
|
180.16
|
1.69%
|
15.56%
|
18.53%
|
NA
|
NA
|
2018-01-01
|
177.17
|
39.79%
|
20.19%
|
13.00%
|
NA
|
NA
|
2017-01-01
|
126.74
|
24.34%
|
13.86%
|
9.04%
|
NA
|
NA
|
2016-01-01
|
101.93
|
1.11%
|
9.78%
|
7.31%
|
NA
|
NA
|
2015-01-01
|
100.81
|
15.29%
|
14.88%
|
8.58%
|
NA
|
NA
|
2014-01-01
|
87.44
|
23.78%
|
21.59%
|
NA
|
NA
|
NA
|
2013-01-01
|
70.64
|
6.66%
|
6.24%
|
NA
|
NA
|
NA
|
2012-01-01
|
66.23
|
3.58%
|
4.42%
|
NA
|
NA
|
NA
|
2011-01-01
|
63.94
|
26.92%
|
4.90%
|
NA
|
NA
|
NA
|
2010-01-01
|
50.38
|
53.13%
|
2.63%
|
NA
|
NA
|
NA
|
2009-01-01
|
32.90
|
-36.96%
|
NA
|
NA
|
NA
|
NA
|
2008-01-01
|
52.19
|
-2.16%
|
NA
|
NA
|
NA
|
NA
|
2007-01-01
|
53.34
|
5.98%
|
NA
|
NA
|
NA
|
NA
|
2006-01-01
|
50.33
|
13.77%
|
NA
|
NA
|
NA
|
NA
|
2005-01-01
|
44.24
|
NA
|
NA
|
NA
|
NA
|
NA
|
Summary
Compound Average Growth Rates (2005-2024)
Statistic
|
1-Year CAGR
|
5-Year CAGR
|
10-Year CAGR
|
20-Year CAGR
|
30-Year CAGR
|
Overall
|
Count of Observations
|
19
|
15
|
10
|
NA
|
NA
|
44
|
Mean
|
15.81%
|
15.11%
|
14.92%
|
NA
|
NA
|
15.37%
|
Median
|
15.29%
|
14.88%
|
17.47%
|
NA
|
NA
|
15.43%
|
Standard Deviation (Volatility)
|
22.31%
|
8.22%
|
4.96%
|
NA
|
NA
|
15.35%
|
Min CAGR Range (CAGR - SD)
|
-8.77%
|
5.32%
|
8.58%
|
NA
|
NA
|
-1.81%
|
Max CAGR Range (CAGR + SD)
|
35.85%
|
21.76%
|
18.5%
|
NA
|
NA
|
28.89%
|
Minimum
|
-36.96%
|
2.63%
|
7.31%
|
NA
|
NA
|
-36.96%
|
Maximum
|
53.13%
|
28.08%
|
20.35%
|
NA
|
NA
|
53.13%
|
Percent Above Inflation Target
|
73.68%
|
100%
|
100%
|
NA
|
NA
|
86.36%
|
Percent Above Conservative Target
|
68.42%
|
80%
|
100%
|
NA
|
NA
|
77.27%
|
Percent Above Moderate Target
|
57.89%
|
73.33%
|
100%
|
NA
|
NA
|
70.45%
|
Percent Above Aggressive Target
|
57.89%
|
66.67%
|
70%
|
NA
|
NA
|
61.36%
|
2005-2024 Summary: The 1-Year CAGR exhibits the
highest mean return at 15.81%, and the greatest volatility with a
standard deviation of 22.31%. As the investment horizon extends to 5,
and 10 years, the mean returns decrease, ranging from 15.11% to 14.92%,
while volatility diminishes, with standard deviations dropping from
8.22% to 4.96%. This trend indicates that longer investment periods tend
to offer more stable returns. Furthermore, the percentage of periods
exceeding the inflation target increases with longer durations, from
73.68% in the 1-Year CAGR to 100% in the 10-Year CAGR, underscoring
VGT’s effectiveness as a hedge against inflation over extended
timeframes. With an overall percentage of 61.36% exceeding the
aggressive target (13.16% annualized returns with 3.16% inflation), VGT
has, over this time period, proven to be a strong option for a
high-returning long-term investment.
Graph
All Periods
Compound Average Growth Rates Across Periods


Short-Term
Compound Average Growth Rates Across Short-Term Rolling Periods

SPX-QQQ-BLACKROCK
Annual GR
Data
Annual Growth Rates By Index (2018-2024)
Date
|
SPX
|
QQQ
|
BlackRock
|
2024
|
21.31%
|
53.87%
|
1.59%
|
2023
|
-13.41%
|
-33.07%
|
-9.24%
|
2022
|
20.56%
|
26.81%
|
7.78%
|
2021
|
15.73%
|
47.57%
|
2.42%
|
2020
|
25.73%
|
37.83%
|
10.84%
|
2019
|
-6.54%
|
-0.96%
|
-1.61%
|
2018
|
22.62%
|
31.46%
|
14.99%
|
Data begins with 2018, determined by the index with the least
historical data for consistent comparison across all indexes.
Summary
Annual Growth Rates Summary By Index (2018-2024)
Metric
|
SPX
|
QQQ
|
BlackRock
|
CAGR
|
11.27%
|
19.39%
|
3.55%
|
Mean
|
12.29%
|
23.36%
|
3.82%
|
Median
|
20.56%
|
31.46%
|
2.42%
|
Standard Deviation (Volatility)
|
15.62%
|
30.50%
|
8.13%
|
Min CAGR Range (CAGR - SD)
|
-3.33%
|
-7.14%
|
-4.31%
|
Max CAGR Range (CAGR + SD)
|
27.91%
|
53.85%
|
11.96%
|
Min
|
-13.41%
|
-33.07%
|
-9.24%
|
Max
|
25.73%
|
53.87%
|
14.99%
|
Percent Above Inflation Target
|
71.43%
|
71.43%
|
42.86%
|
Percent Above Conservative Target
|
71.43%
|
71.43%
|
42.86%
|
Percent Above Moderate Target
|
71.43%
|
71.43%
|
28.57%
|
Percent Above Aggressive Target
|
71.43%
|
71.43%
|
14.29%
|
Comparison in Annual Growth Rates Over 7 Years
(2018-2024): The summary reflects data over a Intermediate-Term
Period (5-10 years). The performance and relative strength between
indexes are likely to shift when measured across different time frames,
particularly in response to major historical events, and particularly
for Short-Term and Long-Term Periods. While a short- or
intermediate-term analysis can provide insights, it may not fully
represent performance over extended, long-term periods. Nevertheless,
these statistics can serve as a benchmark for evaluating future market
trends.
Comparative Analysis of Index Performance: QQQ
exhibits the highest mean return at 23.36%, surpassing SPX’s 12.29% and
BlackRock’s 3.82%, reflecting its aggressive, tech-focused composition.
Its CAGR of 19.39% significantly outpaces SPX’s 11.27% and BlackRock’s
3.55%, further emphasizing QQQ’s strong growth potential. While both SPX
and QQQ have consistently surpassed inflation, conservative, and
moderate targets 71.43% of the time, BlackRock lags significantly,
meeting these thresholds only 42.86% and 71.43% of the time,
respectively. Additionally, BlackRock’s performance in exceeding the
aggressive benchmark stands at just 14.29%, compared to 71.43% for both
SPX and QQQ.
However, QQQ also demonstrates the highest volatility, with a
standard deviation of 30.5%%, compared to 15.62% for SPX and 8.13% for
BlackRock, underscoring its greater risk. The range of expected returns
(CAGR ± SD) is widest for QQQ (-7.14% to 53.85%) and narrowest for
BlackRock (-4.31% to 11.96%), emphasizing BlackRock’s stability but
significantly lower growth potential. Median returns further highlight
QQQ’s dominance (31.46%) over SPX (20.56%) and BlackRock (2.42%).
BlackRock, though less volatile, lags in performance with the lowest
maximum return. Both SPX and QQQ have near- or at-equal percentage of
years above each target, (14.99%) and the highest percentage of years
below inflation and conservative targets. This comparison underscores
QQQ’s appeal for growth-oriented investors seeking higher returns
despite increased risk.
Long-Term Investment Viability: For any of these
Indexes to be considered a high-performing and resilient long-term
investment, it would be ideal to exceed the aggressive target (e.g., 10%
annualized returns, accounting for higher inflation-adjusted performance
expectations) in at least 40%-50% of the years. This range reflects the
potential for strong upside in many years while balancing the
understanding that markets do experience downturns.
SPX: 71.43% of the years exceeded the aggressive target
indicating consistent and robust growth, making it a strong option for
those seeking aggressive investments.
QQQ: 71.43% of the years exceeded the aggressive target
indicating consistent and robust growth, making it a strong option for
those seeking aggressive investments.
BlackRock: 14.29% of the years exceeded the aggressive target
raising concerns about its ability to meet aggressive growth targets,
making it less suitable for investors with higher risk
tolerance.
Graph
Annual Growth Rates By Index

There are years when QQQ’s annual growth rate underperformed the
other indexes, particularly during declines such as in 2023, but those
years are overshadowed by its overall strength. In hindsight, periods
when strong, volatile indexes have performed the worst may actually
represent the best opportunities to invest.
Cumulative Growth
Data
Cumulative Growth (2018-2024)
Date
|
SPX
|
QQQ
|
BlackRock
|
2024
|
211.17
|
345.84
|
127.64
|
2023
|
174.08
|
224.76
|
125.64
|
2022
|
201.04
|
335.81
|
138.43
|
2021
|
166.75
|
264.82
|
128.44
|
2020
|
144.09
|
179.45
|
125.40
|
2019
|
114.60
|
130.20
|
113.14
|
2018
|
122.62
|
131.46
|
114.99
|
2017
|
100.00
|
100.00
|
100.00
|
The table and graph below show the impact of the annual growth rates,
comparing the cumulative growth of SPX, QQQ, and BlackRock indexes over
a 7-year period from 2017 to 2024, starting with an initial value of
$100 per 100%.
Graph
Cumulative Growth By Index

QQQ demonstrates the highest cumulative growth, reflecting its
tech-heavy composition and higher risk-reward profile, while SPX shows
steady, moderate growth, consistent with its broader market
representation. In contrast, BlackRock exhibits the most conservative
growth, likely due to its focus on lower-risk strategies or diversified
portfolios. Since 2017, QQQ has maintained dominance on a cumulative
basis. This comparison highlights the varying risk-return dynamics of
the indexes, with QQQ offering aggressive growth potential and BlackRock
catering to stability-focused investors.
SPX VS QQQ
Annual GR
Data
Annual Growth Rates By Index (2001-2024)
Date
|
SPX
|
QQQ
|
2024
|
21.31%
|
53.87%
|
2023
|
-13.41%
|
-33.07%
|
2022
|
20.56%
|
26.81%
|
2021
|
15.73%
|
47.57%
|
2020
|
25.73%
|
37.83%
|
2019
|
-6.54%
|
-0.96%
|
2018
|
22.62%
|
31.46%
|
2017
|
18.58%
|
5.92%
|
2016
|
-5.40%
|
8.33%
|
2015
|
11.29%
|
17.88%
|
2014
|
23.10%
|
35.05%
|
2013
|
13.83%
|
16.66%
|
2012
|
1.40%
|
2.51%
|
2011
|
14.15%
|
19.04%
|
2010
|
29.81%
|
53.85%
|
2009
|
-37.22%
|
-41.94%
|
2008
|
-3.19%
|
18.67%
|
2007
|
11.37%
|
6.81%
|
2006
|
8.24%
|
1.23%
|
2005
|
4.32%
|
9.48%
|
2004
|
26.42%
|
49.59%
|
2003
|
-21.43%
|
-37.36%
|
2002
|
-14.63%
|
-33.34%
|
2001
|
-6.31%
|
-36.12%
|
Data begins with 2001, determined by the index with the least
historical data for consistent comparison across all indexes.
Summary
Annual Growth Rates Summary By Index (2001-2024)
Metric
|
SPX
|
QQQ
|
CAGR
|
5.19%
|
6.47%
|
Mean
|
6.68%
|
10.82%
|
Median
|
11.33%
|
13.07%
|
Standard Deviation (Volatility)
|
17.18%
|
29.71%
|
Min CAGR Range (CAGR - SD)
|
-10.50%
|
-18.89%
|
Max CAGR Range (CAGR + SD)
|
23.86%
|
40.53%
|
Min
|
-37.22%
|
-41.94%
|
Max
|
29.81%
|
53.87%
|
Percent Above Inflation Target
|
62.50%
|
66.67%
|
Percent Above Conservative Target
|
58.33%
|
62.50%
|
Percent Above Moderate Target
|
58.33%
|
58.33%
|
Percent Above Aggressive Target
|
45.83%
|
50.00%
|
Comparison in Annual Growth Rates of Indexes (SPX and QQQ)
Over 24 Years (2001-2024): QQQ exhibits the highest mean return
at 10.82%, surpassing SPX’s 6.68%, reflecting its aggressive,
tech-focused composition. Its CAGR of 6.47% significantly outpaces SPX’s
5.19%, further emphasizing QQQ’s strong growth potential. However, QQQ
also demonstrates the highest volatility with a standard deviation of
29.71%, compared to 17.18% for SPX, underscoring greater risk. The range
of expected returns (Mean ± SD) is widest for QQQ (-18.89% to 40.53%).
Median returns further showcase QQQ’s dominance (13.07%) over SPX
(11.33%). SPX, though less volatile, lags in performance with the lowest
maximum return (29.81%) and the highest percentage of years below
inflation and conservative targets, meeting the aggressive benchmark
only 45.83% of the time compared to 50% for QQQ. This comparison
underscores QQQ’s appeal for growth-oriented investors despite higher
risk, while SPX suits those prioritizing stability.
Graph
AGR
Annual Growth Rates By Index

Cumulative Growth
Data
Cumulative Growth Rates (2001-2024)
Date
|
SPX
|
QQQ
|
2024
|
337.03
|
450.27
|
2023
|
277.83
|
292.63
|
2022
|
320.85
|
437.22
|
2021
|
266.14
|
344.78
|
2020
|
229.96
|
233.64
|
2019
|
182.90
|
169.51
|
2018
|
195.70
|
171.16
|
2017
|
159.60
|
130.20
|
2016
|
134.59
|
122.92
|
2015
|
142.28
|
113.47
|
2014
|
127.84
|
96.26
|
2013
|
103.85
|
71.27
|
2012
|
91.23
|
61.10
|
2011
|
89.97
|
59.60
|
2010
|
78.82
|
50.07
|
2009
|
60.72
|
32.54
|
2008
|
96.72
|
56.05
|
2007
|
99.91
|
47.23
|
2006
|
89.71
|
44.22
|
2005
|
82.88
|
43.68
|
2004
|
79.45
|
39.90
|
2003
|
62.84
|
26.67
|
2002
|
79.98
|
42.58
|
2001
|
93.69
|
63.88
|
2000
|
100.00
|
100.00
|
The table and graph below show the impact of the annual growth rates,
comparing the cumulative growth of SPX and QQQ indexes over a 24-year
period from 2000 to 2024, starting with an initial value of $100 per
100%.
Graph
Cumulative Growth By Index

This graph depicts the cumulative growth of SPX (SPX) and QQQ over a
24-year period (2000 – 2024). Initially, QQQ underperformed on a
cumulative basis, particularly during the dot-com bubble burst in the
early 2000s and the 2008 financial crisis, which significantly impacted
its tech-heavy composition. Despite these setbacks, as time progressed,
QQQ outperformed SPX, reflecting its strong recovery and dominance
during the tech boom of the 2010s and beyond. This graph exemplifies how
timing impacts performance, highlighting the importance of analyzing
growth over short-term, intermediate, and long-term periods to
understand the varying risk-return dynamics and the influence of major
economic events.
VANGUARD-SPX-QQQ
Annual GR
Data
Annual Growth Rates By Index (2012-2024)
Date
|
VTI
|
VOO
|
VGT
|
SPX
|
QQQ
|
2024
|
17.34%
|
18.85%
|
40.96%
|
21.31%
|
53.87%
|
2023
|
-9.87%
|
-9.73%
|
-17.02%
|
-13.41%
|
-33.07%
|
2022
|
16.92%
|
21.61%
|
20.20%
|
20.56%
|
26.81%
|
2021
|
18.63%
|
15.05%
|
38.21%
|
15.73%
|
47.57%
|
2020
|
18.04%
|
19.23%
|
41.09%
|
25.73%
|
37.83%
|
2019
|
-4.09%
|
-4.24%
|
1.69%
|
-6.54%
|
-0.96%
|
2018
|
22.96%
|
23.94%
|
39.79%
|
22.62%
|
31.46%
|
2017
|
19.45%
|
17.56%
|
24.34%
|
18.58%
|
5.92%
|
2016
|
-4.63%
|
-2.86%
|
1.11%
|
-5.40%
|
8.33%
|
2015
|
11.00%
|
12.14%
|
15.29%
|
11.29%
|
17.88%
|
2014
|
20.23%
|
19.01%
|
23.78%
|
23.10%
|
35.05%
|
2013
|
14.34%
|
14.23%
|
6.66%
|
13.83%
|
16.66%
|
2012
|
1.96%
|
1.99%
|
3.58%
|
1.40%
|
2.51%
|
Data begins with 2012, determined by the index with the least
historical data for consistent comparison across all indexes.
Summary
Annual Growth Rates Summary By Index (2012-2024)
Metric
|
VTI
|
VOO
|
VGT
|
SPX
|
QQQ
|
CAGR
|
10.40%
|
10.75%
|
17.03%
|
10.69%
|
16.83%
|
Mean
|
10.94%
|
11.29%
|
18.44%
|
11.45%
|
19.22%
|
Median
|
16.92%
|
15.05%
|
20.20%
|
15.73%
|
17.88%
|
Standard Deviation (Volatility)
|
11.12%
|
11.10%
|
18.58%
|
13.06%
|
23.33%
|
Min CAGR Range (CAGR - SD)
|
-0.17%
|
0.19%
|
-0.14%
|
-1.61%
|
-4.11%
|
Max CAGR Range (CAGR + SD)
|
22.06%
|
22.39%
|
37.01%
|
24.50%
|
42.55%
|
Min
|
-9.87%
|
-9.73%
|
-17.02%
|
-13.41%
|
-33.07%
|
Max
|
22.96%
|
23.94%
|
41.09%
|
25.73%
|
53.87%
|
Percent Above Inflation Target
|
69.23%
|
69.23%
|
76.92%
|
69.23%
|
76.92%
|
Percent Above Conservative Target
|
69.23%
|
69.23%
|
69.23%
|
69.23%
|
69.23%
|
Percent Above Moderate Target
|
69.23%
|
69.23%
|
61.54%
|
69.23%
|
69.23%
|
Percent Above Aggressive Target
|
61.54%
|
61.54%
|
61.54%
|
61.54%
|
61.54%
|
UPDATE EXPLANATION
Comparison in Annual Growth Rates Over 13 Years
(2012-2024): The summary reflects data over a Long-Term Period
(over 10 years). The performance and relative strength between indexes
shifts when measured across different time frames, particularly in
response to major company events, and particularly for Short-Term and
Long-Term Periods. While a short- or intermediate-term analysis can
provide insights, it may not fully represent performance over extended,
long-term periods.
Long-Term Investment Viability: For any of these
Indexes to be considered a high-performing and resilient long-term
investment, it would be ideal to exceed the aggressive target (e.g., 10%
annualized returns, accounting for higher inflation-adjusted performance
expectations) in at least 40%-50% of the years. This range reflects the
potential for strong upside in many years while balancing the
understanding that markets do experience downturns.
VTI: 61.54% of the years exceeded the aggressive target
indicating consistent and robust growth, making it a strong option for
those seeking aggressive investments.
VOO: 61.54% of the years exceeded the aggressive target
indicating consistent and robust growth, making it a strong option for
those seeking aggressive investments.
VGT: 61.54% of the years exceeded the aggressive target
indicating consistent and robust growth, making it a strong option for
those seeking aggressive investments.
SPX: 61.54% of the years exceeded the aggressive target
indicating consistent and robust growth, making it a strong option for
those seeking aggressive investments.
QQQ: 61.54% of the years exceeded the aggressive target
indicating consistent and robust growth, making it a strong option for
those seeking aggressive investments.
Cumulative Growth
Data
Cumulative Growth (2012-2024)
Date
|
VTI
|
VOO
|
VGT
|
SPX
|
QQQ
|
2024
|
361.92
|
377.15
|
772.48
|
374.59
|
755.48
|
2023
|
308.44
|
317.34
|
548.02
|
308.78
|
490.99
|
2022
|
342.22
|
351.54
|
660.42
|
356.60
|
733.58
|
2021
|
292.69
|
289.07
|
549.43
|
295.79
|
578.49
|
2020
|
246.73
|
251.26
|
397.53
|
255.59
|
392.01
|
2019
|
209.02
|
210.73
|
281.76
|
203.28
|
284.42
|
2018
|
217.93
|
220.06
|
277.08
|
217.51
|
287.17
|
2017
|
177.24
|
177.56
|
198.21
|
177.38
|
218.45
|
2016
|
148.38
|
151.04
|
159.41
|
149.59
|
206.24
|
2015
|
155.58
|
155.48
|
157.66
|
158.13
|
190.38
|
2014
|
140.17
|
138.65
|
136.75
|
142.09
|
161.50
|
2013
|
116.58
|
116.50
|
110.48
|
115.42
|
119.59
|
2012
|
101.96
|
101.99
|
103.58
|
101.40
|
102.51
|
2011
|
100.00
|
100.00
|
100.00
|
100.00
|
100.00
|
The table and graph below show the impact of the annual growth rates,
comparing the cumulative growth of the indexes over a 13-year period
from 2011 to 2024, starting with an initial value of $100 per 100%.
Graph
Cumulative Growth By Index

QQQ-COMPOSITS
Annual GR
Data
Annual Growth Rates By Index (2014-2024)
Date
|
QQQ
|
AAPL
|
NVDA
|
MSFT
|
AMZN
|
META
|
TSLA
|
COST
|
2024
|
53.87%
|
27.80%
|
214.89%
|
60.44%
|
50.49%
|
161.89%
|
8.12%
|
35.95%
|
2023
|
-33.07%
|
-17.44%
|
-20.21%
|
-20.31%
|
-31.05%
|
-52.45%
|
-44.52%
|
1.19%
|
2022
|
26.81%
|
32.45%
|
88.53%
|
34.07%
|
-6.70%
|
21.26%
|
18.04%
|
43.33%
|
2021
|
47.57%
|
70.54%
|
119.80%
|
36.26%
|
59.61%
|
27.94%
|
509.89%
|
15.35%
|
2020
|
37.83%
|
85.96%
|
64.62%
|
63.01%
|
16.87%
|
21.13%
|
111.87%
|
42.35%
|
2019
|
-0.96%
|
-0.60%
|
-41.53%
|
9.91%
|
18.47%
|
-10.81%
|
-13.34%
|
10.14%
|
2018
|
31.46%
|
37.97%
|
124.91%
|
46.96%
|
76.20%
|
43.41%
|
40.60%
|
18.86%
|
2017
|
5.92%
|
24.70%
|
273.97%
|
17.35%
|
40.27%
|
16.14%
|
31.76%
|
8.49%
|
2016
|
8.33%
|
-16.93%
|
52.08%
|
36.36%
|
65.54%
|
47.82%
|
-6.04%
|
5.69%
|
2015
|
17.88%
|
63.81%
|
23.08%
|
6.77%
|
-1.12%
|
21.32%
|
12.24%
|
27.26%
|
2014
|
35.05%
|
9.90%
|
25.81%
|
37.85%
|
35.12%
|
101.97%
|
383.60%
|
9.79%
|
Data begins with 2014, determined by the index with the least
historical data for consistent comparison across all indexes.
Summary
Annual Growth Rates Summary By Index (2014-2024)
Metric
|
QQQ
|
AAPL
|
NVDA
|
MSFT
|
AMZN
|
META
|
TSLA
|
COST
|
CAGR
|
18.24%
|
24.70%
|
61.77%
|
27.51%
|
25.05%
|
25.89%
|
48.05%
|
19.02%
|
Mean
|
20.97%
|
28.92%
|
84.18%
|
29.88%
|
29.43%
|
36.33%
|
95.66%
|
19.85%
|
Median
|
26.81%
|
27.80%
|
64.62%
|
36.26%
|
35.12%
|
21.32%
|
18.04%
|
15.35%
|
Standard Deviation (Volatility)
|
24.93%
|
34.35%
|
95.55%
|
24.69%
|
33.42%
|
56.14%
|
180.11%
|
15.05%
|
Min CAGR Range (CAGR - SD)
|
-3.96%
|
-5.43%
|
-11.38%
|
5.19%
|
-3.99%
|
-19.82%
|
-84.45%
|
4.80%
|
Max CAGR Range (CAGR + SD)
|
45.90%
|
63.28%
|
179.73%
|
54.57%
|
62.85%
|
92.47%
|
275.77%
|
34.91%
|
Min
|
-33.07%
|
-17.44%
|
-41.53%
|
-20.31%
|
-31.05%
|
-52.45%
|
-44.52%
|
1.19%
|
Max
|
53.87%
|
85.96%
|
273.97%
|
63.01%
|
76.20%
|
161.89%
|
509.89%
|
43.33%
|
Percent Above Inflation Target
|
81.82%
|
72.73%
|
81.82%
|
90.91%
|
72.73%
|
81.82%
|
72.73%
|
90.91%
|
Percent Above Conservative Target
|
72.73%
|
72.73%
|
81.82%
|
90.91%
|
72.73%
|
81.82%
|
72.73%
|
81.82%
|
Percent Above Moderate Target
|
72.73%
|
72.73%
|
81.82%
|
81.82%
|
72.73%
|
81.82%
|
63.64%
|
81.82%
|
Percent Above Aggressive Target
|
63.64%
|
63.64%
|
81.82%
|
72.73%
|
72.73%
|
81.82%
|
54.55%
|
54.55%
|
UPDATE EXPLANATION
Comparison in Annual Growth Rates Over 11 Years
(2014-2024): The summary reflects data over a Intermediate-Term
Period (5-10 years). The performance and relative strength between
indexes shifts when measured across different time frames, particularly
in response to major company events, and particularly for Short-Term and
Long-Term Periods. While a short- or intermediate-term analysis can
provide insights, it may not fully represent performance over extended,
long-term periods.
Long-Term Investment Viability: For any of these
Indexes to be considered a high-performing and resilient long-term
investment, it would be ideal to exceed the aggressive target (e.g., 10%
annualized returns, accounting for higher inflation-adjusted performance
expectations) in at least 40%-50% of the years. This range reflects the
potential for strong upside in many years while balancing the
understanding that markets do experience downturns.
QQQ: 63.64% of the years exceeded the aggressive target
indicating consistent and robust growth, making it a strong option for
those seeking aggressive investments.
AAPL: 63.64% of the years exceeded the aggressive target
indicating consistent and robust growth, making it a strong option for
those seeking aggressive investments.
NVDA: 81.82% of the years exceeded the aggressive target
indicating consistent and robust growth, making it a strong option for
those seeking aggressive investments.
MSFT: 72.73% of the years exceeded the aggressive target
indicating consistent and robust growth, making it a strong option for
those seeking aggressive investments.
AMZN: 72.73% of the years exceeded the aggressive target
indicating consistent and robust growth, making it a strong option for
those seeking aggressive investments.
META: 81.82% of the years exceeded the aggressive target
indicating consistent and robust growth, making it a strong option for
those seeking aggressive investments.
TSLA: 54.55% of the years exceeded the aggressive target
indicating consistent and robust growth, making it a strong option for
those seeking aggressive investments.
COST: 54.55% of the years exceeded the aggressive target
indicating consistent and robust growth, making it a strong option for
those seeking aggressive investments.
Graph
Annual Growth Rates By Index


Cumulative Growth
Data
Cumulative Growth (2014-2024)
Date
|
QQQ
|
AAPL
|
NVDA
|
MSFT
|
AMZN
|
META
|
TSLA
|
COST
|
2024
|
631.74
|
1133.49
|
19849.59
|
1448.42
|
1169.49
|
1259.14
|
7491.30
|
679.03
|
2023
|
410.56
|
886.93
|
6303.66
|
902.78
|
777.12
|
480.79
|
6928.69
|
499.47
|
2022
|
613.42
|
1074.28
|
7900.31
|
1132.86
|
1127.08
|
1011.13
|
12488.63
|
493.60
|
2021
|
483.74
|
811.08
|
4190.48
|
844.98
|
1208.02
|
833.85
|
10580.00
|
344.38
|
2020
|
327.80
|
475.60
|
1906.50
|
620.12
|
756.86
|
651.75
|
1734.74
|
298.55
|
2019
|
237.83
|
255.75
|
1158.12
|
380.42
|
647.60
|
538.06
|
818.77
|
209.73
|
2018
|
240.13
|
257.30
|
1980.71
|
346.12
|
546.64
|
603.27
|
944.81
|
190.42
|
2017
|
182.67
|
186.49
|
880.67
|
235.52
|
310.24
|
420.66
|
671.99
|
160.21
|
2016
|
172.46
|
149.55
|
235.49
|
200.70
|
221.17
|
362.20
|
510.01
|
147.67
|
2015
|
159.20
|
180.03
|
154.85
|
147.18
|
133.61
|
245.03
|
542.79
|
139.72
|
2014
|
135.05
|
109.90
|
125.81
|
137.85
|
135.12
|
201.97
|
483.60
|
109.79
|
2013
|
100.00
|
100.00
|
100.00
|
100.00
|
100.00
|
100.00
|
100.00
|
100.00
|
The table and graph below show the impact of the annual growth rates,
comparing the cumulative growth of the indexes over a 11-year period
from 2013 to 2024, starting with an initial value of $100 per 100%.
Graph
Cumulative Growth By Index


END
LS0tDQp0aXRsZTogIk1hcmtldCBJbmRleGVzOiBDb21wYXJpbmcgUmF0ZXMiDQpzdWJ0aXRsZTogIkNvbXBhcmlzb24gb2YgUGVyZm9ybWFuY2UgUmF0ZXMgYmV0d2VlbiBJbmRleGVzIg0KYXV0aG9yOiAiQXV0aG9yOiBLZW5kcmljayBUaGFtIg0Kb3V0cHV0OiANCiAgaHRtbF9kb2N1bWVudDoNCiAgICB0b2M6IHllcw0KICAgIHRvY19kZXB0aDogMw0KICAgIHRvY19mbG9hdDoNCiAgICAgIGNvbGxhcHNlZDogeWVzICAjIFRoaXMgbWFrZXMgdGhlIHN1Yi1zZWN0aW9ucyBhcHBlYXIgb25seSB3aGVuIHRoZSBwcmltYXJ5IHNlY3Rpb24gaXMgZXhwYW5kZWQNCiAgICAgIHNtb290aF9zY3JvbGw6IHllcw0KICAgICAgcGxhY2VtZW50OiB0b3ANCiAgICAgIHRvY19zdWJ0cmVlOiB5ZXMgICMgRW5zdXJlcyB0aGF0IHN1Yi1zZWN0aW9ucyBhcmUgaGlkZGVuIHVudGlsIHRoZSBwcmltYXJ5IHNlY3Rpb24gaXMgY2xpY2tlZA0KICAgICAgIyBudW1iZXJfc2VjdGlvbnM6IHRydWUgICMgVGhpcyBlbmFibGVzIG51bWJlcmVkIHNlY3Rpb25zICMgRklHVVJFIE9VVCBBIE1PUkUgQVBQRUFMSU5HIE9VVFBVVA0KICAgIGZpZ19jYXB0aW9uOiB0cnVlDQogICAgIyBjb2RlX2ZvbGRpbmc6IGhpZGUgICAjIEhpZGUgdGhlIGNvZGUgYnkgZGVmYXVsdA0KICAgIGNvZGVfZG93bmxvYWQ6IHRydWUgICMgQWRkIGEgYnV0dG9uIHRvIGRvd25sb2FkIHRoZSBSIGNvZGUNCiAgICAjIGRldjogIkNhaXJvUE5HIiAgIyBTd2l0Y2ggdG8gdGhlIENhaXJvIGdyYXBoaWNzIGRldmljZSBmb3IgUE5HIG91dHB1dDsgYXZvaWRzIHBuZygpIGVycm9yOyBlbnN1cmUgdG8gaW5zdGFsbC5wYWNrYWdlcygiQ2Fpcm8iKQ0KICAgIGRldjogInBuZyINCiAgICBmaWdfcGF0aDogImZpZ3VyZS8iICAjIERpcmVjdG9yeSBmb3IgZmlndXJlcyAjV09SSyBJTiBQUk9HUkVTU2hlYWRlci1pbmNsdWRlczoNCiAgICBjc3M6IGN1c3RvbS5jc3MgICMgRGVmaW5lIGEgY3VzdG9tIENTUyBmaWxlDQogICAgIyBydW50aW1lOiBzaGlueQ0KLS0tDQoNCmBgYHs9aHRtbH0NCjwhLS0gDQpTdGFydCBEYXRlOiAyMDI0LTExLTA4DQotLT4NCmBgYA0KDQpQdWJsaXNoZWQ6IGByIFN5cy5EYXRlKClgDQoNCjwhLS0gIyBSTUQgSFRNTCBDU1MgU0VUVVAgLS0+DQoNCmBgYHs9aHRtbH0NCjxzdHlsZT4NCg0KLyogQXZvaWQgcGFnZSBicmVha3MgaW5zaWRlIGNvZGUgY2h1bmtzIGluIEhUTUwgb3V0cHV0ICovDQpwcmUgew0KICBwYWdlLWJyZWFrLWluc2lkZTogYXZvaWQ7DQp9DQoNCi5rYWJsZV90YWJsZSB7DQogIHBhZ2UtYnJlYWstaW5zaWRlOiBhdm9pZDsNCn0NCg0KLyogUmVkdWNlIHRoZSBmb250IHNpemUgb2YgdGhlIFRPQyAqLw0Kew0KICBmb250LXNpemU6IDAuOTBlbTsgLyogQWRqdXN0IHRoZSBzaXplIGFzIG5lZWRlZCAqLw0KfQ0KDQovKiBBZGQgYm9yZGVycyBhbmQgc3BhY2luZyB0byBhbGwgZmlndXJlcyAqLw0KaW1nIHsNCiAgYm9yZGVyOiAxcHggc29saWQgI2RkZDsgLyogU3BlY2lmeSBib3JkZXIgc3R5bGUgKi8NCiAgcGFkZGluZzogNXB4OyAvKiBBZGQgcGFkZGluZyBhcm91bmQgdGhlIGZpZ3VyZXMgKi8NCiAgYm9yZGVyLXJhZGl1czogNXB4OyAvKiBBZGQgcm91bmRlZCBjb3JuZXJzIHRvIHRoZSBib3JkZXIgKi8NCiAgZGlzcGxheTogYmxvY2s7IC8qIEVuc3VyZSB0aGUgaW1hZ2UgaXMgdHJlYXRlZCBhcyBhIGJsb2NrIGVsZW1lbnQgdG8gcmVzcGVjdCBtYXJnaW4gKi8NCiAgbWFyZ2luLWJvdHRvbTogMjBweDsgLyogQWRkIGJvdHRvbSBtYXJnaW4gdG8gZWFjaCBpbWFnZSBmb3Igc3BhY2luZyAqLw0KfQ0KDQovKiBBZGQgYm9yZGVycyB0byBhbGwgdGFibGVzICovDQp0YWJsZSB7DQogIGJvcmRlci1jb2xsYXBzZTogY29sbGFwc2U7IC8qIENvbGxhcHNlIGJvcmRlcnMgaW50byBhIHNpbmdsZSBib3JkZXIgKi8NCiAgYm9yZGVyOiAxcHggc29saWQgI2RkZDsgLyogU3BlY2lmeSBib3JkZXIgc3R5bGUgKi8NCiAgbWFyZ2luLWJvdHRvbTogMjBweDsgLyogQWRkIGJvdHRvbSBtYXJnaW4gdG8gZWFjaCB0YWJsZSBmb3Igc3BhY2luZyAqLw0KfQ0KDQovKiBBZGQgYm9yZGVycyB0byB0YWJsZSBjZWxscyAqLw0KdGgsIHRkIHsNCiAgYm9yZGVyOiAxcHggc29saWQgI2RkZDsgLyogU3BlY2lmeSBib3JkZXIgc3R5bGUgZm9yIHRhYmxlIGNlbGxzICovDQogIHBhZGRpbmc6IDhweDsgLyogQWRkIHBhZGRpbmcgaW5zaWRlIHRoZSB0YWJsZSBjZWxscyAqLw0KICB0ZXh0LWFsaWduOiBsZWZ0OyAvKiBBbGlnbiB0ZXh0IHRvIHRoZSBsZWZ0IHdpdGhpbiB0YWJsZSBjZWxscyAqLw0KfQ0KDQoNCi8qIEVuc3VyaW5nIGFsbCBjb2x1bW4gaGVhZGVycyBhcmUgYWxpZ25lZCB0byB0aGUgbGVmdCAqLw0KdGFibGUua2FibGUtdGFibGUgdGgsIHRhYmxlLmthYmxlLXRhYmxlIHRkIHsNCiAgIHRleHQtYWxpZ246IGxlZnQgIWltcG9ydGFudDsNCn0NCg0KDQovKiBBcHBseSBzdHlsZXMgdG8gYWxsIGhlYWRlcnMgKi8NCnRoIHsNCiAgcG9zaXRpb246IHN0aWNreTsgLyogRW5zdXJlIGhlYWRlcnMgc3RpY2sgd2hlbiBzY3JvbGxpbmcgKi8NCiAgdG9wOiAwOyAvKiBQb3NpdGlvbiBoZWFkZXJzIGF0IHRoZSB0b3AgKi8NCiAgYmFja2dyb3VuZC1jb2xvcjogI2YyZjJmMjsgLyogQmFja2dyb3VuZCBjb2xvciBmb3IgaGVhZGVycyAqLw0KICB6LWluZGV4OiA5OTk7IC8qIEVuc3VyZSBoZWFkZXJzIHN0YXkgb24gdG9wIG9mIG90aGVyIGVsZW1lbnRzICovDQp9DQoNCi8qIEFwcGx5IHN0eWxlcyB0byBhbGwgdGFibGVzICovDQp0YWJsZSB7DQogIGJvcmRlci1jb2xsYXBzZTogY29sbGFwc2U7IC8qIENvbGxhcHNlIGJvcmRlcnMgaW50byBhIHNpbmdsZSBib3JkZXIgKi8NCiAgYm9yZGVyOiAxcHggc29saWQgI2RkZDsgLyogU3BlY2lmeSBib3JkZXIgc3R5bGUgKi8NCn0NCg0KLyogQXBwbHkgc3R5bGVzIHRvIHRhYmxlIGNlbGxzICovDQp0aCwgdGQgew0KICBib3JkZXI6IDFweCBzb2xpZCAjZGRkOyAvKiBTcGVjaWZ5IGJvcmRlciBzdHlsZSBmb3IgdGFibGUgY2VsbHMgKi8NCiAgcGFkZGluZzogOHB4OyAvKiBBZGQgcGFkZGluZyBpbnNpZGUgdGhlIHRhYmxlIGNlbGxzICovDQogIHRleHQtYWxpZ246IGxlZnQ7IC8qIEFsaWduIHRleHQgdG8gdGhlIGxlZnQgd2l0aGluIHRhYmxlIGNlbGxzICovDQp9DQoNCi8qIFN0eWxlIHRhYmxlcyB3aXRoIGFsdGVybmF0aW5nIHN0cmlwZWQgcm93cyAqLw0KdGFibGUgew0KICBib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOw0KICB3aWR0aDogMTAwJTsNCn0NCg0KdGgsIHRkIHsNCiAgYm9yZGVyOiAxcHggc29saWQgI2RkZGRkZDsNCiAgdGV4dC1hbGlnbjogbGVmdDsNCiAgcGFkZGluZzogOHB4Ow0KfQ0KDQovKiBBZGQgYWx0ZXJuYXRpbmcgYmFja2dyb3VuZCBjb2xvcnMgdG8gdGFibGUgcm93cyAqLw0KdHI6bnRoLWNoaWxkKGV2ZW4pIHsNCiAgYmFja2dyb3VuZC1jb2xvcjogI2YyZjJmMjsNCn0NCg0KdHI6bnRoLWNoaWxkKG9kZCkgew0KICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmZmZmOyAvKiBXaGl0ZSBiYWNrZ3JvdW5kIGZvciBvZGQgcm93cyAqLw0KfQ0KDQovKiBjdXN0b20tc3R5bGVzLmNzcyAqLw0KYmxvY2txdW90ZSB7DQogIGZvbnQtc2l6ZTogMWVtOyAgLyogU2V0IHRoZSBmb250IHNpemUgdG8gYmUgdGhlIHNhbWUgYXMgdGhlIHJlZ3VsYXIgdGV4dCAqLw0KICBtYXJnaW46IDA7ICAgICAgLyogQWRqdXN0IG1hcmdpbnMgdG8gYWxpZ24gd2l0aCB0aGUgcmVndWxhciB0ZXh0ICovDQogIHBhZGRpbmctbGVmdDogMWVtOyAgLyogQWRkIHNvbWUgcGFkZGluZyBmb3IgaW5kZW50YXRpb24gKi8NCiAgYm9yZGVyLWxlZnQ6IDAuMjVlbSBzb2xpZCAjY2NjOyAgLyogT3B0aW9uYWw6IGFkZCBhIGxlZnQgYm9yZGVyIGZvciBibG9ja3F1b3RlICovDQogIGNvbG9yOiBpbmhlcml0OyAgLyogSW5oZXJpdCBjb2xvciBmcm9tIHRoZSBzdXJyb3VuZGluZyB0ZXh0ICovDQp9DQoNCjwvc3R5bGU+DQpgYGANCg0KPCEtLSANCiMgVEFCTEUgT0YgQ09OVEVOVFMNCg0KLSBUaGUgVGFibGUgb2YgQ29udGVudHMgaXMgYXZhaWxhYmxlIGluIHRoZSBsZWZ0IG1lbnUgZm9yIGVhc3kgbmF2aWdhdGlvbi4NCi0gVGhlIGZ1bGwgUk1EIGZpbGUgY29kZSBpcyBhdmFpbGFibGUgZm9yIGRvd25sb2FkIGluIHRoZSB0b3AtcmlnaHQgY29ybmVyLg0KLSBBIHNpZ25pZmljYW50IGFtb3VudCBvZiB0aW1lIGlzIG9mdGVuIHNwZW50IGNyZWF0aW5nIHRoZSBzdHJ1Y3R1cmUgYW5kIGFlc3RoZXRpY3Mgb2YgYSByZXBvcnQuIEkgY2FuIGF0dGVzdCB0byB0aGUgcmVjb21tZW5kYXRpb24gb2Ygc2VwYXJhdGluZyB0YXNrczogdXNpbmcgUiBmb3IgZGF0YSBhbmFseXNpcyAoRVRMLCBFREEsIGFuZCBzdGF0aXN0aWNhbCBtb2RlbGluZykgYW5kIGxldmVyYWdpbmcgdmlzdWFsaXphdGlvbiBwcm9ncmFtcyBsaWtlIFRhYmxlYXUgb3IgUG93ZXIgQkkgZm9yIGludGVyYWN0aXZlIGludGVyZmFjZXMgYW5kIHN0b3J5dGVsbGluZy4NCg0KIyMgQ2h1bmsgT3B0aW9ucyBTZXR0aW5ncw0KDQpUaGlzIHNlY3Rpb24gZGVmaW5lcyB0aGUgZGVmYXVsdCBiZWhhdmlvciBmb3IgYWxsIGNvZGUgY2h1bmtzIGluIHRoZSBkb2N1bWVudCB1c2luZyBrbml0cjo6b3B0c19jaHVua1wkc2V0KCkuIEl0IGNvbnRyb2xzIHdoZXRoZXIgY29kZSBpcyBzaG93biAoZWNobyksIGV2YWx1YXRlZCAoZXZhbCksIHdoZXRoZXIgd2FybmluZ3MgYW5kIG1lc3NhZ2VzIGFyZSBzdXBwcmVzc2VkICh3YXJuaW5nLCBtZXNzYWdlKSwgYW5kIHdoZXRoZXIgcmVzdWx0cyBhcmUgc2hvd24gKHJlc3VsdHMpLiBJdCBhbHNvIGNoZWNrcyBpZiByZXF1aXJlZCBSIGxpYnJhcmllcyBhcmUgaW5zdGFsbGVkIGFuZCBpbnN0YWxscyBhbnkgbWlzc2luZyBvbmVzLCBlbnN1cmluZyB0aGF0IGFsbCBuZWNlc3NhcnkgcGFja2FnZXMgYXJlIGxvYWRlZC4NCg0KT3B0aW9ucyBzdWNoIGFzIGVjaG8sIG1lc3NhZ2UsIHdhcm5pbmcsIHJlc3VsdHMsIGluY2x1ZGUsIGV2YWwsIGNhY2hlLCBhbmQgbW9yZS4gDQoNCi0gZWNobzogU2hvdyBvciBoaWRlIGNvZGUgaW4gdGhlIG91dHB1dCAoZWNobyA9IEZBTFNFIGhpZGVzIHRoZSBjb2RlKS4NCi0gbWVzc2FnZTogU2hvdyBvciBoaWRlIG1lc3NhZ2VzIGluIHRoZSBvdXRwdXQgKG1lc3NhZ2UgPSBGQUxTRSBzdXBwcmVzc2VzIG1lc3NhZ2VzKS4NCi0gd2FybmluZzogU2hvdyBvciBoaWRlIHdhcm5pbmdzIGluIHRoZSBvdXRwdXQgKHdhcm5pbmcgPSBGQUxTRSBzdXBwcmVzc2VzIHdhcm5pbmdzKS4NCi0gcmVzdWx0czogQ29udHJvbCBob3cgcmVzdWx0cyBhcmUgc2hvd246DQogIC0gJ21hcmt1cCc6IERpc3BsYXkgcmVzdWx0cyBhcyB0aGV5IGFyZS4NCiAgLSAnYXNpcyc6IEluY2x1ZGUgcmVzdWx0cyBhcyByYXcgSFRNTCBvciBMYVRlWC4NCiAgLSAnaGlkZSc6IEhpZGUgcmVzdWx0cyBmcm9tIG91dHB1dC4NCi0gaW5jbHVkZTogSW5jbHVkZSBvciBleGNsdWRlIGJvdGggY29kZSBhbmQgcmVzdWx0cyBmcm9tIHRoZSBvdXRwdXQgKGluY2x1ZGUgPSBGQUxTRSBleGNsdWRlcyBldmVyeXRoaW5nKS4NCi0gZXZhbDogRXZhbHVhdGUgdGhlIGNvZGUgY2h1bmsgb3Igbm90IChldmFsID0gRkFMU0UgcHJldmVudHMgY29kZSBleGVjdXRpb24pLg0KLSBjYWNoZTogQ2FjaGUgdGhlIHJlc3VsdHMgb2YgdGhlIGNodW5rIHRvIHNwZWVkIHVwIHJlbmRlcmluZyAoY2FjaGUgPSBUUlVFIGVuYWJsZXMgY2FjaGluZykuDQotIGZpZy5jYXA6IEFkZCBhIGNhcHRpb24gdG8gZ3JhcGhpY2FsIG91dHB1dHMuDQotIG91dC53aWR0aC9vdXQuaGVpZ2h0OiBTZXQgdGhlIG91dHB1dCBzaXplIG9mIHBsb3RzLg0KLSBjb2xsYXBzZTogQ29uY2F0ZW5hdGUgdGV4dHVhbCBvdXRwdXQgaW50byBhIHNpbmdsZSBibG9jay4NCi0gdGlkeTogVGlkeSB1cCB0aGUgZGlzcGxheSBvZiBjb2RlIG9yIHJlc3VsdHMgKHRpZHkgPSBUUlVFIHRpZGllcyB0aGUgb3V0cHV0KS4NCg0KLS0+DQoNCmBgYHtyIHNldHVwX29wdGlvbnMsIGluY2x1ZGU9RkFMU0UsIGVjaG89RkFMU0V9DQoNCiMgRW5zdXJlIHRoYXQgYW55IGZpbGUgcGF0aHMgYXJlIGNvcnJlY3RseSBzZXQgcmVsYXRpdmUgdG8gdGhlIHJvb3QgZGlyZWN0b3J5LiBUbyBhdm9pZCBzdWNoIGlzc3Vlcywgc2V0IHRoZSByb290IGRpcmVjdG9yeSBleHBsaWNpdGx5IGF0IHRoZSBzdGFydCBvZiB5b3VyIGRvY3VtZW50Og0Ka25pdHI6Om9wdHNfa25pdCRzZXQocm9vdC5kaXIgPSBnZXR3ZCgpKQ0KDQojIyBERUZBVUxUIENIVU5LIE9QVElPTlMNCg0KIyBTZXQgcmVwb3NpdG9yeSBhbmQgZGVmYXVsdCBjaHVuayBvcHRpb25zDQpvcHRpb25zKHJlcG9zID0gYyhDUkFOID0gImh0dHBzOi8vY2xvdWQuci1wcm9qZWN0Lm9yZyIpKQ0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG89RkFMU0UsIGV2YWw9VFJVRSwgcmVzdWx0cz0nYXNpcycsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UpDQoNCg0KIyBSIFBBQ0tBR0VTIEFORCBMSUJSQVJJRVMgDQoNCiMgTGlzdCBvZiByZXF1aXJlZCBsaWJyYXJpZXMgKG1heSBiZSBtaXNzaW5nIHNvbWUpDQpyZXF1aXJlZF9saWJyYXJpZXMgPC0gYygiZ2dwbG90MiIsICJzdHJpbmdyIiwgInJlYWR4bCIsICJkcGx5ciIsICJsdWJyaWRhdGUiLCAiaG1zIiwgIm9wZW54bHN4IiwgIndyaXRleGwiLCAicm1hcmtkb3duIiwgImtuaXRyIiwgImthYmxlRXh0cmEiLCAiZ2duZXdzY2FsZSIsICJncmlkRXh0cmEiLCAidGlkeXIiLCAic2NhbGVzIiwgImdnYnJlYWsiLCAiZTEwNzEiLCAiZ2dyZXBlbCIsICJyZXNoYXBlMiIpDQoNCiMgZ2dwbG90MiAgICAgZm9yICdkZWNsYXJhdGl2ZWx5JyBjcmVhdGluZyBncmFwaGljcywgYmFzZWQgb24gIlRoZSBHcmFtbWFyIG9mIEdyYXBoaWNzIi4gDQojIHN0cmluZ3IgICAgIGZvciB3b3JraW5nIHdpdGggc3RyaW5ncywgaS5lLiwgY2hhcmFjdGVyIGRhdGEuDQojIHJlYWR4bCAgICAgIGZvciByZWFkaW5nIEV4Y2VsIGZpbGVzIGJ5IHByb3ZpZGluZyBhIHdheSB0byByZWFkIHhscyBhbmQgeGxzeCBmaWxlcyBpbnRvIFIgd2l0aG91dCBkZXBlbmRlbmNpZXMgb24gZXh0ZXJuYWwgc29mdHdhcmUuDQojIGRwbHlyICAgICAgIGZvciBkYXRhIG1hbmlwdWxhdGlvbiwgcHJvdmlkaW5nIGEgY29uc2lzdGVudCBzZXQgb2YgdmVyYnMgdGhhdCBoZWxwIHlvdSBzb2x2ZSB0aGUgbW9zdCBjb21tb24gZGF0YSBtYW5pcHVsYXRpb24gY2hhbGxlbmdlcy4NCiMgbHVicmlkYXRlICAgZm9yIHdvcmtpbmcgd2l0aCBkYXRlcyBhbmQgdGltZXMgaW4gUi4NCiMgaG1zICAgICAgICAgZm9yIHN0b3JpbmcgdGltZS1vZi1kYXkgdmFsdWVzIGFuZCBpbnRlcmZhY2luZyB0aGVzZSB2YWx1ZXMgd2l0aCBiYXNlIFIncyBkYXRlLXRpbWUgY2xhc3Nlcy4NCiMgb3Blbnhsc3ggICAgZm9yIHJlYWRpbmcgZnJvbSBhbmQgd3JpdGluZyB0byBNaWNyb3NvZnQgRXhjZWwgLnhsc3ggZmlsZXMuIEl0IHByb3ZpZGVzIG1vcmUgZnVuY3Rpb25hbGl0eSB0aGFuIGp1c3QgaGFuZGxpbmcgZGF0YTsgaXQgYWxzbyBhbGxvd3MgeW91IHRvIG1vZGlmeSB2YXJpb3VzIGFzcGVjdHMgb2YgdGhlIEV4Y2VsIGZpbGUgaXRzZWxmLg0KIyB3cml0ZXhsICAgICBmb3IgYSBmYXN0IGFuZCBwb3J0YWJsZSB3YXkgdG8gd3JpdGUgZGF0YSBmcmFtZXMgdG8gRXhjZWwgLnhsc3ggZmlsZXMsIGZvY3VzaW5nIHNvbGVseSBvbiB3cml0aW5nIGRhdGEgd2l0aG91dCBhbnkgZGVwZW5kZW5jaWVzLg0KIyBybWFya2Rvd24gICBmb3IgZHluYW1pYyByZXBvcnQgZ2VuZXJhdGlvbiBmcm9tIFIuIEl0IGludGVncmF0ZXMgdGhlIGNvcmUgc3ludGF4IG9mIG1hcmtkb3duIChhIHNpbXBsZSBtYXJrdXAgbGFuZ3VhZ2UpIHdpdGggUiBjb2RlLCBhbGxvd2luZyBmb3IgdGhlIGF1dG9tYXRpYyB1cGRhdGUgb2YgcmVwb3J0cyB0byByZWZsZWN0IGRhdGEgY2hhbmdlcyBhbmQgYW5hbHlzaXMgdXBkYXRlcy4NCiMga25pdHIgICAgICAgZm9yIHVzaW5nIGZ1bmN0aW9ucyBzdWNoIGFzIGthYmxlKCkgdG8gZm9ybWF0IGRhdGFmcmFtZXMgYXMgbWFya2Rvd24gdGFibGVzLiANCiMga2FibGVFeHRyYSAgZm9yIGVuaGFuY2VkIGZ1bmN0aW9uYWxpdHkgZm9yIHN0eWxpbmcgdGFibGVzIHN1Y2ggYXMgZGlzcGxheWluZyBjb2x1bW5zIGV2ZW5seQ0KIyBnZ25ld3NjYWxlICBmb3IgY3JlYXRpbmcgbmV3IGNvbG9yIHBhbGV0dGVzIGFuZCBtb3JlDQojIGdyaWRFeHRyYQ0KIyBDYWlybyAgICAgICBmb3Igc3dpdGNoaW5nIHRvIHRoZSBDYWlybyBncmFwaGljcyBkZXZpY2UgZm9yIFBORyBvdXRwdXQ7IGF2b2lkcyBwbmcoKSBlcnJvcg0KIyB0aWR5cg0KIyBzY2FsZXMNCiMgZ2dicmVhayAgDQojIGUxMDcxICAgICAgIGZvciBza2V3bmVzcyBhbmQga3VydG9zaXMNCiMgZ2dyZXBlbCAgICAgZm9yIHZpc3VhbGl6YXRpb24sIGluY2x1ZGVzIGdlb21fdGV4dF9yZXBlbCgpIHdoaWNoIG1pbmltaXplcyBvdmVybGFwcGluZyB0ZXh0IGxhYmVscw0KIyByZXNoYXBlMiAgICBmb3IgZm9ybWF0dGluZyBpbnRvIGxvbmcgZm9ybWF0IHN1Y2ggYXMgcmVzaGFwZTI6Om1lbHQNCg0KDQojIENoZWNrIHdoaWNoIGxpYnJhcmllcyBhcmUgbm90IGluc3RhbGxlZA0KaW5zdGFsbGVkX2xpYnMgPC0gcm93bmFtZXMoaW5zdGFsbGVkLnBhY2thZ2VzKCkpDQpsaWJyYXJpZXNfdG9faW5zdGFsbCA8LSByZXF1aXJlZF9saWJyYXJpZXNbIXJlcXVpcmVkX2xpYnJhcmllcyAlaW4lIGluc3RhbGxlZF9saWJzXQ0KDQojIEluc3RhbGwgbWlzc2luZyBsaWJyYXJpZXMNCmlmKGxlbmd0aChsaWJyYXJpZXNfdG9faW5zdGFsbCkgPiAwKSB7DQogIGluc3RhbGwucGFja2FnZXMobGlicmFyaWVzX3RvX2luc3RhbGwpDQp9DQoNCiMgTG9hZCBhbGwgcmVxdWlyZWQgbGlicmFyaWVzDQpsYXBwbHkocmVxdWlyZWRfbGlicmFyaWVzLCBsaWJyYXJ5LCBjaGFyYWN0ZXIub25seSA9IFRSVUUpDQoNCmlmICghZGlyLmV4aXN0cygiZmlndXJlLyIpKSB7DQogIGRpci5jcmVhdGUoImZpZ3VyZS8iKQ0KfQ0KDQpgYGANCg0KPCEtLQ0KIyMgSW50ZXJhY3RpdmUoKSBGdW5jdGlvbg0KDQpUaGlzIGZ1bmN0aW9uIHByb3ZpZGVzIHJlYWwtdGltZSBmZWVkYmFjayBkdXJpbmcgdGhlIFIgTWFya2Rvd24gcHJvY2VzcywgdHlwaWNhbGx5IHVzaW5nIHByaW50KCkgb3IgY2F0KCkgdG8gZGlzcGxheSBrZXkgaW5mb3JtYXRpb24gbGlrZSBjb2x1bW4gbmFtZXMgb3IgZGF0YSBzdHJ1Y3R1cmUgYXMgdGhlIGRvY3VtZW50IHJlbmRlcnMuIFRoaXMgaGVscHMgdXNlcnMgdmVyaWZ5IHRoZSBpbnRlcm1lZGlhdGUgc3RlcHMgaW4gZGF0YSBhbmFseXNpcyBvciBmb3JtYXR0aW5nIHdoaWxlIHJ1bm5pbmcgdGhlIHJlcG9ydCwgYWlkaW5nIGRlYnVnZ2luZyBhbmQgZXhwbG9yYXRpbyB3aXRob3V0IGFwcGVhcmluZyBpbiB0aGUgZmluYWwgcmVuZGVyZWQgZG9jdW1lbnQuDQotLT4NCg0KYGBge3IgaW50ZXJhY3RpdmUgZnVuY3Rpb25zLCBldmFsPVRSVUUsIGVjaG89RkFMU0V9DQoNCiMgRGVmaW5lIHRoZSBpbnRlcmFjdGl2ZV9wcmludCBmdW5jdGlvbg0KaW50ZXJhY3RpdmVfcHJpbnQgPC0gZnVuY3Rpb24ob2JqKSB7DQogIGlmIChpbnRlcmFjdGl2ZSgpKSB7DQogICAgcHJpbnQob2JqKQ0KICB9DQogIGludmlzaWJsZShOVUxMKSAgIyBUaGlzIGVuc3VyZXMgdGhlIGZ1bmN0aW9uIGRvZXNuJ3QgcmV0dXJuIGFueXRoaW5nIGluIHRoZSBrbml0IG91dHB1dA0KfQ0KDQojIERlZmluZSB0aGUgaW50ZXJhY3RpdmVfc3RyIGZ1bmN0aW9uDQppbnRlcmFjdGl2ZV9zdHIgPC0gZnVuY3Rpb24ob2JqKSB7DQogIGlmIChpbnRlcmFjdGl2ZSgpKSB7DQogICAgc3RyKG9iaikNCiAgfQ0KICBpbnZpc2libGUoTlVMTCkgICMgRW5zdXJlIHRoZSBmdW5jdGlvbiBkb2Vzbid0IHJldHVybiBhbnl0aGluZyBpbiB0aGUga25pdCBvdXRwdXQNCn0NCg0KIyBEZWZpbmUgdGhlIGludGVyYWN0aXZlX3Bhc3RlIGZ1bmN0aW9uDQppbnRlcmFjdGl2ZV9wYXN0ZSA8LSBmdW5jdGlvbiguLi4pIHsNCiAgaWYgKGludGVyYWN0aXZlKCkpIHsNCiAgICBtZXNzYWdlKHBhc3RlKC4uLikpDQogIH0NCiAgaW52aXNpYmxlKE5VTEwpICAjIEVuc3VyZSB0aGUgZnVuY3Rpb24gZG9lc24ndCByZXR1cm4gYW55dGhpbmcgaW4gdGhlIGtuaXQgb3V0cHV0DQp9DQoNCg0KIyBEZWZpbmUgdGhlIGludGVyYWN0aXZlX2NhdCBmdW5jdGlvbg0KaW50ZXJhY3RpdmVfY2F0IDwtIGZ1bmN0aW9uKC4uLikgew0KICAjIENvbWJpbmUgYWxsIGFyZ3VtZW50cyBpbnRvIGEgc2luZ2xlIHN0cmluZw0KICBtZXNzYWdlIDwtIHBhc3RlKC4uLikNCiAgDQogICMgUHJpbnQgb25seSBpbiBpbnRlcmFjdGl2ZSBtb2RlDQogIGlmIChpbnRlcmFjdGl2ZSgpKSB7DQogICAgY2F0KG1lc3NhZ2UsICJcbiIpICAjIEFkZCBhIG5ld2xpbmUgZm9yIHJlYWRhYmlsaXR5DQogIH0NCiAgDQogIGludmlzaWJsZShOVUxMKSAgIyBFbnN1cmUgbm8gb3V0cHV0IGlzIHJldHVybmVkIGluIG5vbi1pbnRlcmFjdGl2ZSBtb2RlDQp9DQoNCmBgYA0KDQo8IS0tDQojIyBEYXRhIFR5cGVzDQoNCmBgYHtyIGRhdGFfdHlwZXMsIGluY2x1ZGU9RkFMU0UsIGV2YWw9VFJVRSwgZWNobz1GQUxTRX0NCiMgTG9hZCByZXF1aXJlZCBsaWJyYXJpZXMNCmxpYnJhcnkoa25pdHIpDQpsaWJyYXJ5KGthYmxlRXh0cmEpDQoNCiMgQ3JlYXRlIGEgZGF0YSBmcmFtZSB3aXRoIHRoZSBkYXRhIHR5cGUgdGFibGUNCmRhdGFfdHlwZXMgPC0gZGF0YS5mcmFtZSgNCiAgIkRhdGEgVHlwZSIgPSBjKCJOdW1lcmljIiwgIkNoYXJhY3RlciIsICJEYXRlIiwgIkRhdGVUaW1lIiwgIkxvZ2ljYWwiLCAiRmFjdG9yIiwgIkludGVnZXIiLCAiQ29tcGxleCIsICJMaXN0IiksDQogICJEZXNjcmlwdGlvbiIgPSBjKA0KICAgICJDb250aW51b3VzIG9yIGRpc2NyZXRlIG51bWJlcnMsIG9mdGVuIHVzZWQgZm9yIGNhbGN1bGF0aW9ucyIsDQogICAgIlRleHQgZGF0YSwgdXNlZCBmb3IgbmFtZXMsIGxhYmVscywgb3IgY2F0ZWdvcmljYWwgaW5mbyIsDQogICAgIkRhdGVzIHdpdGhvdXQgdGltZSwgdXNlZnVsIGZvciBkYXlzLCBtb250aHMsIHllYXJzIiwNCiAgICAiRGF0ZSBhbmQgdGltZSBkYXRhLCBpbmNsdWRlcyBib3RoIGRhdGUgYW5kIHRpbWUgY29tcG9uZW50cyIsDQogICAgIkJvb2xlYW4gdmFsdWVzIChUUlVFL0ZBTFNFKSwgb2Z0ZW4gZm9yIGNvbmRpdGlvbmFscyIsDQogICAgIkNhdGVnb3JpY2FsIGRhdGEgd2l0aCBkaXN0aW5jdCBsZXZlbHMgb3IgY2F0ZWdvcmllcyIsDQogICAgIldob2xlIG51bWJlcnMsIHR5cGljYWxseSBmb3IgY291bnRzIG9yIElEcyIsDQogICAgIk51bWJlcnMgd2l0aCByZWFsIGFuZCBpbWFnaW5hcnkgcGFydHMiLA0KICAgICJDb2xsZWN0aW9uIG9mIG1peGVkIGRhdGEgdHlwZXMsIGVhY2ggZWxlbWVudCBjYW4gZGlmZmVyIg0KICApLA0KICAiQ2hlY2sgVHlwZSBGdW5jdGlvbiIgPSBjKA0KICAgICJgaXMubnVtZXJpYygpYCIsDQogICAgImBpcy5jaGFyYWN0ZXIoKWAiLA0KICAgICJgaW5oZXJpdHMoLiwgJ0RhdGUnKWAiLA0KICAgICJgaW5oZXJpdHMoLiwgJ1BPU0lYdCcpYCIsDQogICAgImBpcy5sb2dpY2FsKClgIiwNCiAgICAiYGlzLmZhY3RvcigpYCIsDQogICAgImBpcy5pbnRlZ2VyKClgIiwNCiAgICAiYGlzLmNvbXBsZXgoKWAiLA0KICAgICJgaXMubGlzdCgpYCINCiAgKSwNCiAgIkV4YW1wbGUgVHJhbnNmb3JtYXRpb24gRnVuY3Rpb25zIiA9IGMoDQogICAgImByb3VuZCgpYCwgYGZsb29yKClgLCBgY2VpbGluZygpYCwgYGFicygpYCwgYGNvbW1hKClgIChzY2FsZXMpLCBgcGVyY2VudCgpYCAoc2NhbGVzKSIsDQogICAgImB0b3VwcGVyKClgLCBgdG9sb3dlcigpYCwgYHN0cl9yZXBsYWNlKClgIChzdHJpbmdyKSwgYHBhc3RlKClgLCBgc3RyX3RyaW0oKWAiLA0KICAgICJgYXMuRGF0ZSgpYCwgYGZvcm1hdCgpYCwgYHllYXIoKWAsIGBtb250aCgpYCwgYGRheSgpYCAobHVicmlkYXRlKSIsDQogICAgImBhcy5QT1NJWGN0KClgLCBgYXMuUE9TSVhsdCgpYCwgYGhvdXIoKWAsIGBtaW51dGUoKWAgKGx1YnJpZGF0ZSksIGBmb3JtYXQoKWAiLA0KICAgICJgaWZlbHNlKClgLCBgY2FzZV93aGVuKClgLCBgIWAgKE5PVCksIGBhcy5udW1lcmljKClgIChjb252ZXJ0IHRvIDAgYW5kIDEpIiwNCiAgICAiYGFzLmZhY3RvcigpYCwgYGZjdF9yZW9yZGVyKClgLCBgZmN0X3JlbGV2ZWwoKWAgKGZvcmNhdHMpLCBgcmVjb2RlKClgIiwNCiAgICAiYGFzLmludGVnZXIoKWAsIGBmbG9vcigpYCwgYGNlaWxpbmcoKWAiLA0KICAgICJgUmUoKWAsIGBJbSgpYCwgYE1vZCgpYCwgYEFyZygpYCIsDQogICAgImBtYXAoKWAgKHB1cnJyKSwgYHVubGlzdCgpYCwgYGxhcHBseSgpYCwgYHNhcHBseSgpYCINCiAgKQ0KKQ0KDQojIERpc3BsYXkgdGhlIHRhYmxlIGluIG1hcmtkb3duIGZvcm1hdA0Ka2FibGUoZGF0YV90eXBlcywgZm9ybWF0ID0gIm1hcmtkb3duIiwgY29sLm5hbWVzID0gYygiRGF0YSBUeXBlIiwgIkRlc2NyaXB0aW9uIiwgIkNoZWNrIFR5cGUgRnVuY3Rpb24iLCAiRXhhbXBsZSBUcmFuc2Zvcm1hdGlvbiBGdW5jdGlvbnMiKSkgJT4lDQogIGthYmxlX3N0eWxpbmcoZnVsbF93aWR0aCA9IFRSVUUpDQpgYGANCg0KIyMgT3RoZXIgRnVuY3Rpb24NCg0KIyMjIENsZWFuIE51bWVyaWMgU3RyaW5ncw0KLS0+DQoNCmBgYHtyIGNsZWFuX251bWVyaWN9DQoNCiMgRGVmaW5lIGEgY3VzdG9tIGZ1bmN0aW9uIHRvIGNsZWFuIG51bWVyaWMgc3RyaW5ncyB3aXRoIHBlcmNlbnRhZ2Ugc2lnbnMNCmNsZWFuX251bWVyaWMgPC0gZnVuY3Rpb24oeCkgew0KICBhcy5udW1lcmljKGdzdWIoIiUiLCAiIiwgeCkpICAjIFJlbW92ZSB0aGUgIiUiIHNpZ24gYW5kIGNvbnZlcnQgdG8gbnVtZXJpYw0KfQ0KDQpgYGANCg0KPCEtLQ0KIyMgU2F2ZSBWYXJpYWJsZXMgRnVuY3Rpb24NCg0KRnVuY3Rpb24gdG8gc2F2ZSBkYXRhZnJhbWVzLCB2YWx1ZXMsIGxpc3RzIGFzIHZhcmlhYmxlcy4NCi0tPiANCg0KYGBge3Igc2F2ZV92YXJpYWJsZXMsIGV2YWw9VFJVRSwgZWNobz1GQUxTRX0NCg0KIyMjIERBVEFGUkFNRQ0KDQojIyBEYXRhZnJhbWUgKyBJbmRleCAxICsgSW5kZXggMiArIFllYXIgDQojIEZ1bmN0aW9uIHRvIGR5bmFtaWNhbGx5IHNhdmUgdGhlIGRhdGFmcmFtZSBhcyBhIHZhcmlhYmxlDQpzYXZlX2RhdGFmcmFtZV9pbmRleF8xX2luZGV4XzJfc3RhcnRfeWVhcl9lbmRfeWVhciA8LSBmdW5jdGlvbihkYXRhZnJhbWUsIGluZGV4XzEsIGluZGV4XzIsIHN0YXJ0X3llYXIsIGVuZF95ZWFyKSB7DQogICMgQ3JlYXRlIHRoZSB2YXJpYWJsZSBuYW1lIGR5bmFtaWNhbGx5DQogIHZhcmlhYmxlX25hbWUgPC0gcGFzdGUwKGRlcGFyc2Uoc3Vic3RpdHV0ZShkYXRhZnJhbWUpKSwgIl8iLCBpbmRleF8xLCAiXyIsIGluZGV4XzIsICJfcyIsIHN0YXJ0X3llYXIsICJfZSIsIGVuZF95ZWFyKQ0KICANCiAgIyBBc3NpZ24gdGhlIGRhdGFmcmFtZSB0byB0aGUgZHluYW1pY2FsbHkgY3JlYXRlZCB2YXJpYWJsZQ0KICBhc3NpZ24odmFyaWFibGVfbmFtZSwgZGF0YWZyYW1lLCBlbnZpciA9IC5HbG9iYWxFbnYpDQp9DQoNCiMgRGVmaW5lIHBhcmFtZXRlcnMNCmRmMSA8LSBkYXRhLmZyYW1lKA0KICBEYXRlID0gYXMuRGF0ZShjKCIyMDIyLTAxLTAxIiwgIjIwMjItMDEtMDIiKSksDQogIFZhbHVlID0gYygxMDAsIDIwMCkNCikNCmluZGV4XzEgPC0gImJ0Y3VzZCINCmluZGV4XzIgPC0gImRvZ2V1c2QiDQpzdGFydF95ZWFyIDwtIDIwMDUgIyBPciBtaW5feWVhciwgZXRjDQplbmRfeWVhciA8LSAyMDI0ICMgT3IgcHJlc2VudF9kYXRlLCBtYXhfeWVhciwgZXRjDQojIGVuZF95ZWFyIDwtIGFzLm51bWVyaWMoZm9ybWF0KFN5cy5EYXRlKCksICIlWSIpKQ0KDQojIFVzZSB0aGUgZnVuY3Rpb24gdG8gc2F2ZSB0aGUgZGF0YWZyYW1lDQpzYXZlX2RhdGFmcmFtZV9pbmRleF8xX2luZGV4XzJfc3RhcnRfeWVhcl9lbmRfeWVhcihkZjEsIGluZGV4XzEsIGluZGV4XzIsIHN0YXJ0X3llYXIsIGVuZF95ZWFyKQ0KDQojIEFjY2VzcyB0aGUgc2F2ZWQgdmFyaWFibGUgZGlyZWN0bHkNCmludGVyYWN0aXZlX2NhdCgiRGF0YWZyYW1lIHNhdmVkIGFzIHZhcmlhYmxlOiIsIHBhc3RlMCgiZGYxXyIsIGluZGV4XzEsICJfIiwgaW5kZXhfMiwgIl9zIiwgc3RhcnRfeWVhciwgIl9lIiwgZW5kX3llYXIpLCAiXG4iKQ0KDQoNCg0KIyMgRGF0YWZyYW1lICsgSW5kZXggMSArIEluZGV4IDI7IEdlbmVyYWwgTm9uLVNwZWNpZmljIFllYXIgIA0KIyBGdW5jdGlvbiB0byBkeW5hbWljYWxseSBzYXZlIHRoZSBkYXRhZnJhbWUgYXMgYSB2YXJpYWJsZQ0Kc2F2ZV9kYXRhZnJhbWVfaW5kZXhfMV9pbmRleF8yIDwtIGZ1bmN0aW9uKGRhdGFmcmFtZSwgaW5kZXhfMSwgaW5kZXhfMikgew0KICAjIENyZWF0ZSB0aGUgdmFyaWFibGUgbmFtZSBkeW5hbWljYWxseQ0KICB2YXJpYWJsZV9uYW1lIDwtIHBhc3RlMChkZXBhcnNlKHN1YnN0aXR1dGUoZGF0YWZyYW1lKSksICJfIiwgaW5kZXhfMSwgIl8iLCBpbmRleF8yKQ0KICANCiAgIyBBc3NpZ24gdGhlIGRhdGFmcmFtZSB0byB0aGUgZHluYW1pY2FsbHkgY3JlYXRlZCB2YXJpYWJsZQ0KICBhc3NpZ24odmFyaWFibGVfbmFtZSwgZGF0YWZyYW1lLCBlbnZpciA9IC5HbG9iYWxFbnYpDQp9DQoNCiMgRGVmaW5lIHBhcmFtZXRlcnMNCmRmMSA8LSBkYXRhLmZyYW1lKA0KICBEYXRlID0gYXMuRGF0ZShjKCIyMDIyLTAxLTAxIiwgIjIwMjItMDEtMDIiKSksDQogIFZhbHVlID0gYygxMDAsIDIwMCkNCikNCmluZGV4XzEgPC0gImJ0Y3VzZCINCmluZGV4XzIgPC0gImRvZ2V1c2QiDQoNCiMgVXNlIHRoZSBmdW5jdGlvbiB0byBzYXZlIHRoZSBkYXRhZnJhbWUNCnNhdmVfZGF0YWZyYW1lX2luZGV4XzFfaW5kZXhfMihkZjEsIGluZGV4XzEsIGluZGV4XzIpDQoNCiMgQWNjZXNzIHRoZSBzYXZlZCB2YXJpYWJsZSBkaXJlY3RseQ0KaW50ZXJhY3RpdmVfY2F0KCJEYXRhZnJhbWUgc2F2ZWQgYXMgdmFyaWFibGU6IiwgcGFzdGUwKCJkZjFfIiwgaW5kZXhfMSwgIl8iLCBpbmRleF8yKSkNCg0KDQoNCmBgYA0KDQoNCjwhLS0NCiMjIEZvcm1hdCBDb2x1bW4gRnVuY3Rpb24gKFJlZDwwPEdyZWVuKSANCg0KRnVuY3Rpb25zIGZvciBwcmUtZGVmaW5lZCBjb2x1bW4gd2lkdGhzLiBOdW1iZXJzIGFuZCBQZXJjZW50YWdlcyBrbml0IHdpdGggY29tbWFzLg0KLS0+DQoNCmBgYHtyIHByZV9kZWZpbmVkX2NvbHVtbl93aWR0aHMsIGV2YWw9VFJVRSwgZWNobz1GQUxTRX0NCg0KIyBMb2FkIHJlcXVpcmVkIGxpYnJhcmllcw0KbGlicmFyeShrbml0cikNCmxpYnJhcnkoa2FibGVFeHRyYSkNCmxpYnJhcnkoc2NhbGVzKQ0KDQojIEZ1bmN0aW9uIHRvIGVzY2FwZSBzcGVjaWFsIGNoYXJhY3RlcnMgdW5pdmVyc2FsbHkgaW4gc3RyaW5ncyAoZm9yIGNhcHRpb25zIG9yIG5ydCRtZXRhZGF0YSkNCmVzY2FwZV9zcGVjaWFsX2NoYXJzIDwtIGZ1bmN0aW9uKHRleHQpIHsNCiAgdGV4dCA8LSBnc3ViKCImYW1wOyIsICImIiwgdGV4dCkNCiAgdGV4dCA8LSBnc3ViKCImIzEyNDsiLCAiIHwgIiwgdGV4dCkNCiAgdGV4dCA8LSBnc3ViKCImbHQiLCAiPDsiLCB0ZXh0KQ0KICB0ZXh0IDwtIGdzdWIoIiZndDsiLCAiPiIsIHRleHQpDQogIHJldHVybih0ZXh0KQ0KfQ0KDQojIyMgTElORSBCUkVBS1MgDQojIEZ1bmN0aW9uIHRvIGhhbmRsZSBsaW5lIGJyZWFrcyBpbiBjaGFyYWN0ZXIgY29sdW1ucw0KcHJlc2VydmVfbGluZV9icmVha3MgPC0gZnVuY3Rpb24odGV4dCkgew0KICBnc3ViKCJcbiIsICI8YnI+IiwgdGV4dCkgICMgUmVwbGFjZSBuZXdsaW5lIGNoYXJhY3RlcnMgd2l0aCA8YnI+IGZvciBIVE1MDQp9DQoNCiMjIyBDT05ESVRJT05BTCBGT1JNQVRUSU5HIChSRUQ8MDxHUkVFTikNCiMgVW5pdmVyc2FsIGNvbmRpdGlvbmFsIGNvbG9yaW5nIGZ1bmN0aW9uDQphcHBseV9jb25kaXRpb25hbF9jb2xvcmluZyA8LSBmdW5jdGlvbihkYXRhKSB7DQogICMgRGVmaW5lIHRhcmdldCBjb2x1bW4gcGF0dGVybnMgZm9yIGNvbmRpdGlvbmFsIGNvbG9yaW5nDQogIHRhcmdldF9wYXR0ZXJucyA8LSBjKCJDQUdSIiwgIkNHUiIsICJDSVIiLCAiQ0FJUiIsICIoJSkiLCAiVmFsdWUiLCAiUmF0ZSIsICJPdmVyYWxsIiwgIlNQWCIsICJRUVEiLCAiQmxhY2tSb2NrIiwgIkFBUEwiLCAiTlZEQSIsICJNU0ZUIiwgIkFNWk4iLCAiTUVUQSIsICJUU0xBIiwgIkNPU1QiLCAiVlRJIiwgIlZPTyIsICJWR1QiLCAiU2xvcGUiKQ0KICANCiAgIyBBcHBseSBjb25kaXRpb25hbCBmb3JtYXR0aW5nIGJhc2VkIG9uIHBhdHRlcm4gbWF0Y2ggaW4gY29sdW1uIG5hbWVzDQogIGRhdGEgPC0gZGF0YSAlPiUNCiAgICBtdXRhdGUoYWNyb3NzKGV2ZXJ5dGhpbmcoKSwgfiB7DQogICAgICBjb2x1bW5fbmFtZSA8LSBjdXJfY29sdW1uKCkNCiAgICAgIGlmIChhbnkoc3RyX2RldGVjdChjb2x1bW5fbmFtZSwgdGFyZ2V0X3BhdHRlcm5zKSkpIHsNCiAgICAgICAgIyBBcHBseSBjb2xvciBmb3JtYXR0aW5nIGJhc2VkIG9uIHZhbHVlLCBhc3N1bWluZyBwZXJjZW50YWdlIGZvcm1hdCB3aXRoICIlIg0KICAgICAgICBjZWxsX3NwZWMoDQogICAgICAgICAgLiwgDQogICAgICAgICAgY29sb3IgPSBpZmVsc2UoDQogICAgICAgICAgICAhaXMubmEoYXMubnVtZXJpYyhnc3ViKCJbLCVdIiwgIiIsIC4pKSkgJiBhcy5udW1lcmljKGdzdWIoIlssJV0iLCAiIiwgLikpIDwgMCwgDQogICAgICAgICAgICAiZGFya3JlZCIsIA0KICAgICAgICAgICAgaWZlbHNlKCFpcy5uYShhcy5udW1lcmljKGdzdWIoIlssJV0iLCAiIiwgLikpKSAmIGFzLm51bWVyaWMoZ3N1YigiWywlXSIsICIiLCAuKSkgPiAwLCANCiAgICAgICAgICAgICAgICAgICAiZGFya2dyZWVuIiwgDQogICAgICAgICAgICAgICAgICAgImJsYWNrIikgICMgRGVmYXVsdCBjb2xvciBpZiBOQSBvciBub24tbnVtZXJpYw0KICAgICAgICAgICkNCiAgICAgICAgKQ0KICAgICAgfSBlbHNlIHsNCiAgICAgICAgLg0KICAgICAgfQ0KICAgIH0sIC5uYW1lcyA9ICJ7LmNvbH0iKSkNCiAgDQogIHJldHVybihkYXRhKQ0KfQ0KDQoNCg0KIyMjIFRFWFQgQ0VMTFMgRk9STUFUUyAoQ09NTUEsICYgTkEnUyBSRU1PVkVELCAmIE9USEVSKQ0KIyBNYWluIGZvcm1hdHRpbmcgZnVuY3Rpb24gdG8gaGFuZGxlIHNwZWNpYWwgY2hhcmFjdGVycywgbGluZSBicmVha3MsIGNvbW1hcywgYW5kIGNvbmRpdGlvbmFsIGNvbG9yaW5nDQpmb3JtYXRfZGF0YSA8LSBmdW5jdGlvbihkYXRhKSB7DQogIA0KICAjIFJlbW92ZSByb3dzIHdoZXJlIGFsbCB2YWx1ZXMgYXJlIE5BDQogIGRhdGEgPC0gZGF0YSAlPiUgZmlsdGVyKHJvd1N1bXMoaXMubmEoLikpIDwgbmNvbCguKSkNCg0KICAjIEZvcm1hdCBkYXRhIHdpdGggc3BlY2lhbCBjaGFyYWN0ZXIgZXNjYXBpbmcsIGxpbmUgYnJlYWsgcHJlc2VydmF0aW9uLCBhbmQgbnVtYmVyIGZvcm1hdHRpbmcNCiAgZGF0YSA8LSBkYXRhICU+JQ0KICAgIG11dGF0ZShhY3Jvc3Mod2hlcmUoaXMuY2hhcmFjdGVyKSwgfiBwcmVzZXJ2ZV9saW5lX2JyZWFrcyhlc2NhcGVfc3BlY2lhbF9jaGFycyguKSkpKSAlPiUgICAgIyBFc2NhcGUgc3BlY2lhbCBjaGFyYWN0ZXJzIGFuZCBwcmVzZXJ2ZSBsaW5lIGJyZWFrcw0KICAgIG11dGF0ZShhY3Jvc3Mod2hlcmUoaXMubnVtZXJpYyksIH4gaWZlbHNlKC4gJSUgMSA9PSAwLCAuLCByb3VuZCguLCAyKSkpKSAlPiUgIyBSb3VuZCBudW1lcmljIHZhbHVlcyB0byAyIGRlY2ltYWwgcGxhY2VzIGlmIGRlY2ltYWxzIGV4aXN0DQogICAgbXV0YXRlKGFjcm9zcyh3aGVyZShpcy5udW1lcmljKSwgY29tbWEpKSAlPiUgIyBGb3JtYXQgYWxsIG51bWVyaWMgY29sdW1ucyB3aXRoIGNvbW1hcw0KICAgIG11dGF0ZShhY3Jvc3MoY29udGFpbnMoIlBlcmNlbnQiKSwgfiBwYXN0ZTAoY29tbWEoLiAqIDEwMCwgYWNjdXJhY3kgPSAwLjEpLCAiJSIpKSkgJT4lICMgQWRkIGNvbW1hcyB0byBwZXJjZW50YWdlcw0KICAgIG11dGF0ZShhY3Jvc3MoY29udGFpbnMoIkRvbGxhciIpIHwgY29udGFpbnMoIkN1cnJlbmN5IiksIGRvbGxhcikpICMgQWRkIGNvbW1hcyB0byBjdXJyZW5jeQ0KICANCiAgIyBBcHBseSBjb25kaXRpb25hbCBjb2xvcmluZw0KICBkYXRhIDwtIGFwcGx5X2NvbmRpdGlvbmFsX2NvbG9yaW5nKGRhdGEpDQoNCiAgcmV0dXJuKGRhdGEpDQp9DQoNCg0KIyMjIFJFU0hBUEUgR1JPVVBFRCBDT0xVTU5TIA0KIyBGdW5jdGlvbiB0byByZXNoYXBlIGRhdGEgZnJhbWUgYnkgc3RhY2tpbmcgY29sdW1ucyB2ZXJ0aWNhbGx5IHdpdGhpbiBlYWNoIGdyb3VwDQpyZXNoYXBlX2dyb3VwZWRfY29sdW1ucyA8LSBmdW5jdGlvbihkYXRhLCBncm91cGluZ19mYWN0b3IgPSAyKSB7DQogIG9yaWdpbmFsX3Jvd3MgPC0gbnJvdyhkYXRhKQ0KICBvcmlnaW5hbF9jb2x1bW5zIDwtIG5jb2woZGF0YSkNCiAgDQogICMgQ2FsY3VsYXRlIHRoZSByZXF1aXJlZCBudW1iZXIgb2Ygcm93cyBiYXNlZCBvbiB0aGUgZ3JvdXBpbmcgZmFjdG9yDQogIG5ld19yb3dfY291bnQgPC0gY2VpbGluZyhvcmlnaW5hbF9yb3dzIC8gZ3JvdXBpbmdfZmFjdG9yKQ0KICANCiAgIyBJbml0aWFsaXplIGFuIGVtcHR5IGRhdGEgZnJhbWUgZm9yIHRoZSByZXNoYXBlZCBkYXRhDQogIHJlc2hhcGVkX2RhdGEgPC0gZGF0YS5mcmFtZShtYXRyaXgoTkEsIG5yb3cgPSBuZXdfcm93X2NvdW50LCBuY29sID0gb3JpZ2luYWxfY29sdW1ucyAqIGdyb3VwaW5nX2ZhY3RvcikpDQogIA0KICAjIFN0YWNrIGVhY2ggZ3JvdXAgZG93biB0aGUgY29sdW1uDQogIGZvciAoaSBpbiAxOmdyb3VwaW5nX2ZhY3Rvcikgew0KICAgICMgQ2FsY3VsYXRlIHRoZSByb3cgaW5kaWNlcyBmb3IgdGhlIGN1cnJlbnQgZ3JvdXANCiAgICByb3dfaW5kaWNlcyA8LSAoKGkgLSAxKSAqIG5ld19yb3dfY291bnQgKyAxKTptaW4oaSAqIG5ld19yb3dfY291bnQsIG9yaWdpbmFsX3Jvd3MpDQogICAgY29sX2luZGljZXMgPC0gKChpIC0gMSkgKiBvcmlnaW5hbF9jb2x1bW5zICsgMSk6KGkgKiBvcmlnaW5hbF9jb2x1bW5zKQ0KICAgIA0KICAgICMgQXNzaWduIHRoZSBkYXRhIGZvciB0aGUgY3VycmVudCBncm91cA0KICAgIHJlc2hhcGVkX2RhdGFbMTpsZW5ndGgocm93X2luZGljZXMpLCBjb2xfaW5kaWNlc10gPC0gZGF0YVtyb3dfaW5kaWNlcywgXQ0KICB9DQogIA0KICAjIFNldCBjb2x1bW4gbmFtZXMgdG8gcmVwZWF0IG9yaWdpbmFsIG5hbWVzIHdpdGhvdXQgc3VmZml4ZXMNCiAgY29sX25hbWVzIDwtIHJlcChjb2xuYW1lcyhkYXRhKSwgZ3JvdXBpbmdfZmFjdG9yKQ0KICBjb2xuYW1lcyhyZXNoYXBlZF9kYXRhKSA8LSBjb2xfbmFtZXMNCiAgDQogIHJldHVybihyZXNoYXBlZF9kYXRhKQ0KfQ0KDQoNCg0KDQojIyMgV0lEVEhTDQojIyBVbnNwZWNpZmllZCB3aWR0aHMNCg0KIyBGdW5jdGlvbiB0byBmb3JtYXQgdGFibGUgd2l0aCB1bnNwZWNpZmllZCwgYXV0b21hdGljIGNvbHVtbiB3aWR0aHMNCmZvcm1hdF91bnNwZWNpZmllZF93aWR0aCA8LSBmdW5jdGlvbihkYXRhLCBjYXB0aW9uID0gTlVMTCkgew0KICBkYXRhIDwtIGZvcm1hdF9kYXRhKGRhdGEpICMgQXBwbHkgZm9ybWF0dGluZw0KICBudW1fY29sdW1ucyA8LSBuY29sKGRhdGEpICMgQ2hlY2sgdGhlIG51bWJlciBvZiBjb2x1bW5zIGluIHRoZSBkYXRhIGZyYW1lDQogICAga25pdHI6OmthYmxlKGRhdGEsIGZvcm1hdCA9ICJodG1sIiwgY2FwdGlvbiA9IGNhcHRpb24sIGVzY2FwZSA9IEZBTFNFKSAlPiUgIyBEaXNwbGF5IHRoZSB0YWJsZSB3aXRoIGF1dG9tYXRpYyB3aWR0aHMNCiAgICBrYWJsZV9zdHlsaW5nKGZ1bGxfd2lkdGggPSBUUlVFKSAgIyBMZXQgY29sdW1ucyBhZGFwdCBhdXRvbWF0aWNhbGx5DQp9DQoNCiMjIFVuc3BlY2lmaWVkIFdpZHRocyBHcm91cGVkDQojIEZ1bmN0aW9uIHRvIGZvcm1hdCB0YWJsZSB3aXRoIGR5bmFtaWNhbGx5IHJlc2hhcGVkIGNvbHVtbnMgYW5kIHVuc3BlY2lmaWVkIHdpZHRoDQpmb3JtYXRfdW5zcGVjaWZpZWRfd2lkdGhfZ3JvdXBlZCA8LSBmdW5jdGlvbihkYXRhLCBjYXB0aW9uID0gTlVMTCwgZ3JvdXBpbmdfZmFjdG9yID0gMikgew0KICBkYXRhIDwtIGZvcm1hdF9kYXRhKGRhdGEpICAjIEFwcGx5IGRhdGEgZm9ybWF0dGluZw0KICBkYXRhIDwtIHJlc2hhcGVfZ3JvdXBlZF9jb2x1bW5zKGRhdGEsIGdyb3VwaW5nX2ZhY3RvcikgICMgUmVzaGFwZSBkYXRhIHdpdGggZ3JvdXBlZCBjb2x1bW5zDQogIA0KICAjIFVzZSBrbml0cjo6a2FibGUgYW5kIGthYmxlRXh0cmEgdG8gc3R5bGUgdGhlIHRhYmxlDQogIGthYmxlX291dHB1dCA8LSBrbml0cjo6a2FibGUoZGF0YSwgZm9ybWF0ID0gImh0bWwiLCBjYXB0aW9uID0gY2FwdGlvbiwgZXNjYXBlID0gRkFMU0UpICU+JQ0KICAgIGthYmxlX3N0eWxpbmcoZnVsbF93aWR0aCA9IFRSVUUpICAjIExldCBjb2x1bW5zIGFkYXB0IGF1dG9tYXRpY2FsbHkNCiAgDQogIHJldHVybihrYWJsZV9vdXRwdXQpDQp9DQoNCiMgRXhhbXBsZSB1c2FnZQ0KIyBmb3JtYXRfdW5zcGVjaWZpZWRfd2lkdGhfZ3JvdXBlZChucnQkY3BpX3JhdywgY2FwdGlvbiA9ICJDb25zdW1lciBQcmljZSBJbmRleCAoMTkxMy0yMDI0KSIsIGdyb3VwaW5nX2ZhY3RvciA9IDMpDQoNCg0KDQojIyBFcXVhbCBXaWR0aHMNCg0KIyBGdW5jdGlvbiB0byBmb3JtYXQgdGFibGUgd2l0aCBlcXVhbCB3aWR0aCBjb2x1bW5zDQpmb3JtYXRfZXF1YWxfd2lkdGggPC0gZnVuY3Rpb24oZGF0YSwgY2FwdGlvbiA9IE5VTEwpIHsNCiAgZGF0YSA8LSBmb3JtYXRfZGF0YShkYXRhKSAjIEFwcGx5IGZvcm1hdHRpbmcNCiAgbnVtX2NvbHVtbnMgPC0gbmNvbChkYXRhKSAjIEdldCB0aGUgbnVtYmVyIG9mIGNvbHVtbnMgaW4gdGhlIGRhdGEgZnJhbWUNCiAgY29sdW1uX3dpZHRoIDwtIDEwMCAvIG51bV9jb2x1bW5zICMgQ2FsY3VsYXRlIGVxdWFsIHdpZHRoIGFzIGEgcGVyY2VudGFnZQ0KICANCiAgIyBVc2Uga25pdHI6OmthYmxlIGFuZCBrYWJsZUV4dHJhIHRvIHN0eWxlIHRoZSB0YWJsZQ0KICBrYWJsZV9vdXRwdXQgPC0ga25pdHI6OmthYmxlKGRhdGEsIGZvcm1hdCA9ICJodG1sIiwgY2FwdGlvbiA9IGNhcHRpb24sIGVzY2FwZSA9IEZBTFNFKSAlPiUNCiAgICBrYWJsZV9zdHlsaW5nKGZ1bGxfd2lkdGggPSBUUlVFKQ0KICANCiAgIyBBcHBseSBlcXVhbCB3aWR0aCB0byBlYWNoIGNvbHVtbiB1c2luZyBjb2x1bW5fc3BlYw0KICBmb3IgKGkgaW4gMTpudW1fY29sdW1ucykgew0KICAgIGthYmxlX291dHB1dCA8LSBrYWJsZV9vdXRwdXQgJT4lDQogICAgICBjb2x1bW5fc3BlYyhpLCB3aWR0aCA9IHBhc3RlMChjb2x1bW5fd2lkdGgsICIlIikpDQogIH0NCiAgDQogIHJldHVybihrYWJsZV9vdXRwdXQpDQp9DQoNCiMjIEVxdWFsIFdpZHRocyBHcm91cGVkICANCg0KIyBGdW5jdGlvbiB0byBmb3JtYXQgdGFibGUgd2l0aCBkeW5hbWljYWxseSByZXNoYXBlZCBjb2x1bW5zIGFuZCBlcXVhbCB3aWR0aA0KZm9ybWF0X2VxdWFsX3dpZHRoX2dyb3VwZWQgPC0gZnVuY3Rpb24oZGF0YSwgY2FwdGlvbiA9IE5VTEwsIGdyb3VwaW5nX2ZhY3RvciA9IDIpIHsNCiAgZGF0YSA8LSBmb3JtYXRfZGF0YShkYXRhKSAgIyBBcHBseSBkYXRhIGZvcm1hdHRpbmcNCiAgZGF0YSA8LSByZXNoYXBlX2dyb3VwZWRfY29sdW1ucyhkYXRhLCBncm91cGluZ19mYWN0b3IpICAjIFJlc2hhcGUgZGF0YSB3aXRoIGdyb3VwZWQgY29sdW1ucw0KICANCiAgIyBDYWxjdWxhdGUgZXF1YWwgd2lkdGggYXMgYSBwZXJjZW50YWdlDQogIG51bV9jb2x1bW5zIDwtIG5jb2woZGF0YSkNCiAgY29sdW1uX3dpZHRoIDwtIDEwMCAvIG51bV9jb2x1bW5zDQogIA0KICAjIFVzZSBrbml0cjo6a2FibGUgYW5kIGthYmxlRXh0cmEgdG8gc3R5bGUgdGhlIHRhYmxlDQogIGthYmxlX291dHB1dCA8LSBrbml0cjo6a2FibGUoZGF0YSwgZm9ybWF0ID0gImh0bWwiLCBjYXB0aW9uID0gY2FwdGlvbiwgZXNjYXBlID0gRkFMU0UpICU+JQ0KICAgIGthYmxlX3N0eWxpbmcoZnVsbF93aWR0aCA9IFRSVUUpDQogIA0KICAjIEFwcGx5IGVxdWFsIHdpZHRoIHRvIGVhY2ggY29sdW1uIHVzaW5nIGNvbHVtbl9zcGVjDQogIGZvciAoaSBpbiAxOm51bV9jb2x1bW5zKSB7DQogICAga2FibGVfb3V0cHV0IDwtIGthYmxlX291dHB1dCAlPiUNCiAgICAgIGNvbHVtbl9zcGVjKGksIHdpZHRoID0gcGFzdGUwKGNvbHVtbl93aWR0aCwgIiUiKSkNCiAgfQ0KICANCiAgcmV0dXJuKGthYmxlX291dHB1dCkNCn0NCg0KDQoNCiMjIFByZWRlZmluZWQgZnVuY3Rpb24gZm9yIDItY29sdW1uIHRhYmxlcw0KDQojIEZ1bmN0aW9uIGZvciAyLWNvbHVtbiB0YWJsZTogQ29sdW1uIDEgPSAxLzQsIENvbHVtbiAyID0gMy80DQpmb3JtYXRfMmNvbF8xXzRfM180IDwtIGZ1bmN0aW9uKGRhdGEsIGNhcHRpb24gPSBOVUxMKSB7DQogIGRhdGEgPC0gZm9ybWF0X2RhdGEoZGF0YSkgIyBBcHBseSBmb3JtYXR0aW5nDQogIGtuaXRyOjprYWJsZShkYXRhLCBmb3JtYXQgPSAiaHRtbCIsIGNhcHRpb24gPSBjYXB0aW9uLCBlc2NhcGUgPSBGQUxTRSkgJT4lDQogICAga2FibGVfc3R5bGluZyhmdWxsX3dpZHRoID0gVFJVRSkgJT4lDQogICAgY29sdW1uX3NwZWMoMSwgd2lkdGggPSAiMjUlIikgJT4lDQogICAgY29sdW1uX3NwZWMoMiwgd2lkdGggPSAiNzUlIikNCn0NCg0KIyBGdW5jdGlvbiBmb3IgMi1jb2x1bW4gdGFibGU6IENvbHVtbiAxID0gMy80LCBDb2x1bW4gMiA9IDEvNA0KZm9ybWF0XzJjb2xfM180XzFfNCA8LSBmdW5jdGlvbihkYXRhLCBjYXB0aW9uID0gTlVMTCkgew0KICBkYXRhIDwtIGZvcm1hdF9kYXRhKGRhdGEpICMgQXBwbHkgZm9ybWF0dGluZw0KICBrbml0cjo6a2FibGUoZGF0YSwgZm9ybWF0ID0gImh0bWwiLCBjYXB0aW9uID0gY2FwdGlvbiwgZXNjYXBlID0gRkFMU0UpICU+JQ0KICAgIGthYmxlX3N0eWxpbmcoZnVsbF93aWR0aCA9IFRSVUUpICU+JQ0KICAgIGNvbHVtbl9zcGVjKDEsIHdpZHRoID0gIjc1JSIpICU+JQ0KICAgIGNvbHVtbl9zcGVjKDIsIHdpZHRoID0gIjI1JSIpDQp9DQoNCiMgRnVuY3Rpb24gZm9yIDItY29sdW1uIHRhYmxlOiBDb2x1bW4gMSA9IDEvMywgQ29sdW1uIDIgPSAyLzMNCmZvcm1hdF8yY29sXzFfM18yXzMgPC0gZnVuY3Rpb24oZGF0YSwgY2FwdGlvbiA9IE5VTEwpIHsNCiAgZGF0YSA8LSBmb3JtYXRfZGF0YShkYXRhKSAjIEFwcGx5IGZvcm1hdHRpbmcNCiAga25pdHI6OmthYmxlKGRhdGEsIGZvcm1hdCA9ICJodG1sIiwgY2FwdGlvbiA9IGNhcHRpb24sIGVzY2FwZSA9IEZBTFNFKSAlPiUNCiAgICBrYWJsZV9zdHlsaW5nKGZ1bGxfd2lkdGggPSBUUlVFKSAlPiUNCiAgICBjb2x1bW5fc3BlYygxLCB3aWR0aCA9ICIzMy4zMyUiKSAlPiUNCiAgICBjb2x1bW5fc3BlYygyLCB3aWR0aCA9ICI2Ni42NyUiKQ0KfQ0KDQojIEZ1bmN0aW9uIGZvciAyLWNvbHVtbiB0YWJsZTogQ29sdW1uIDEgPSAyLzMsIENvbHVtbiAyID0gMS8zDQpmb3JtYXRfMmNvbF8yXzNfMV8zIDwtIGZ1bmN0aW9uKGRhdGEsIGNhcHRpb24gPSBOVUxMKSB7DQogIGRhdGEgPC0gZm9ybWF0X2RhdGEoZGF0YSkgIyBBcHBseSBmb3JtYXR0aW5nDQogIGtuaXRyOjprYWJsZShkYXRhLCBmb3JtYXQgPSAiaHRtbCIsIGNhcHRpb24gPSBjYXB0aW9uLCBlc2NhcGUgPSBGQUxTRSkgJT4lDQogICAga2FibGVfc3R5bGluZyhmdWxsX3dpZHRoID0gVFJVRSkgJT4lDQogICAgY29sdW1uX3NwZWMoMSwgd2lkdGggPSAiNjYuNjclIikgJT4lDQogICAgY29sdW1uX3NwZWMoMiwgd2lkdGggPSAiMzMuMzMlIikNCn0NCiMgRnVuY3Rpb24gZm9yIDItY29sdW1uIHRhYmxlIHdpdGggZXF1YWwgd2lkdGggKDUwJSBlYWNoKQ0KZm9ybWF0XzJjb2xfZXF1YWwgPC0gZnVuY3Rpb24oZGF0YSwgY2FwdGlvbiA9IE5VTEwpIHsNCiAgZGF0YSA8LSBmb3JtYXRfZGF0YShkYXRhKSAjIEFwcGx5IGZvcm1hdHRpbmcNCiAga25pdHI6OmthYmxlKGRhdGEsIGZvcm1hdCA9ICJodG1sIiwgY2FwdGlvbiA9IGNhcHRpb24sIGVzY2FwZSA9IEZBTFNFKSAlPiUNCiAgICBrYWJsZV9zdHlsaW5nKGZ1bGxfd2lkdGggPSBUUlVFKSAlPiUNCiAgICBjb2x1bW5fc3BlYygxLCB3aWR0aCA9ICI1MCUiKSAlPiUNCiAgICBjb2x1bW5fc3BlYygyLCB3aWR0aCA9ICI1MCUiKQ0KfQ0KDQojIyBQcmVkZWZpbmVkIGZ1bmN0aW9uIGZvciAzLWNvbHVtbiB0YWJsZXMNCg0KIyBGdW5jdGlvbiBmb3IgMy1jb2x1bW4gdGFibGU6IENvbHVtbiAxID0gMi80LCBDb2x1bW5zIDIgYW5kIDMgPSAxLzQgZWFjaA0KZm9ybWF0XzNjb2xfMl80XzFfNF8xXzQgPC0gZnVuY3Rpb24oZGF0YSwgY2FwdGlvbiA9IE5VTEwpIHsNCiAgZGF0YSA8LSBmb3JtYXRfZGF0YShkYXRhKSAjIEFwcGx5IGZvcm1hdHRpbmcNCiAga25pdHI6OmthYmxlKGRhdGEsIGZvcm1hdCA9ICJodG1sIiwgY2FwdGlvbiA9IGNhcHRpb24sIGVzY2FwZSA9IEZBTFNFKSAlPiUNCiAgICBrYWJsZV9zdHlsaW5nKGZ1bGxfd2lkdGggPSBUUlVFKSAlPiUNCiAgICBjb2x1bW5fc3BlYygxLCB3aWR0aCA9ICI1MCUiKSAlPiUNCiAgICBjb2x1bW5fc3BlYygyLCB3aWR0aCA9ICIyNSUiKSAlPiUNCiAgICBjb2x1bW5fc3BlYygzLCB3aWR0aCA9ICIyNSUiKQ0KfQ0KDQojIEZ1bmN0aW9uIGZvciAzLWNvbHVtbiB0YWJsZTogQ29sdW1uIDIgPSAyLzQsIENvbHVtbnMgMSBhbmQgMyA9IDEvNCBlYWNoDQpmb3JtYXRfM2NvbF8xXzRfMl80XzFfNCA8LSBmdW5jdGlvbihkYXRhLCBjYXB0aW9uID0gTlVMTCkgew0KICBkYXRhIDwtIGZvcm1hdF9kYXRhKGRhdGEpICMgQXBwbHkgZm9ybWF0dGluZw0KICBrbml0cjo6a2FibGUoZGF0YSwgZm9ybWF0ID0gImh0bWwiLCBjYXB0aW9uID0gY2FwdGlvbiwgZXNjYXBlID0gRkFMU0UpICU+JQ0KICAgIGthYmxlX3N0eWxpbmcoZnVsbF93aWR0aCA9IFRSVUUpICU+JQ0KICAgIGNvbHVtbl9zcGVjKDEsIHdpZHRoID0gIjI1JSIpICU+JQ0KICAgIGNvbHVtbl9zcGVjKDIsIHdpZHRoID0gIjUwJSIpICU+JQ0KICAgIGNvbHVtbl9zcGVjKDMsIHdpZHRoID0gIjI1JSIpDQp9DQoNCiMgRnVuY3Rpb24gZm9yIDMtY29sdW1uIHRhYmxlOiBDb2x1bW4gMyA9IDIvNCwgQ29sdW1ucyAxIGFuZCAyID0gMS80IGVhY2gNCmZvcm1hdF8zY29sXzFfNF8xXzRfMl80IDwtIGZ1bmN0aW9uKGRhdGEsIGNhcHRpb24gPSBOVUxMKSB7DQogIGRhdGEgPC0gZm9ybWF0X2RhdGEoZGF0YSkgIyBBcHBseSBmb3JtYXR0aW5nDQogIGtuaXRyOjprYWJsZShkYXRhLCBmb3JtYXQgPSAiaHRtbCIsIGNhcHRpb24gPSBjYXB0aW9uLCBlc2NhcGUgPSBGQUxTRSkgJT4lDQogICAga2FibGVfc3R5bGluZyhmdWxsX3dpZHRoID0gVFJVRSkgJT4lDQogICAgY29sdW1uX3NwZWMoMSwgd2lkdGggPSAiMjUlIikgJT4lDQogICAgY29sdW1uX3NwZWMoMiwgd2lkdGggPSAiMjUlIikgJT4lDQogICAgY29sdW1uX3NwZWMoMywgd2lkdGggPSAiNTAlIikNCn0NCg0KIyBGdW5jdGlvbiBmb3IgMy1jb2x1bW4gdGFibGU6IENvbHVtbiAxID0gMS83LCBDb2x1bW5zIDIgYW5kIDMgPSAzLzcgZWFjaA0KZm9ybWF0XzNjb2xfMV83XzNfN18zXzcgPC0gZnVuY3Rpb24oZGF0YSwgY2FwdGlvbiA9IE5VTEwpIHsNCiAgZGF0YSA8LSBmb3JtYXRfZGF0YShkYXRhKSAjIEFwcGx5IGZvcm1hdHRpbmcNCiAga25pdHI6OmthYmxlKGRhdGEsIGZvcm1hdCA9ICJodG1sIiwgY2FwdGlvbiA9IGNhcHRpb24sIGVzY2FwZSA9IEZBTFNFKSAlPiUNCiAgICBrYWJsZV9zdHlsaW5nKGZ1bGxfd2lkdGggPSBUUlVFKSAlPiUNCiAgICBjb2x1bW5fc3BlYygxLCB3aWR0aCA9IDEvNykgJT4lDQogICAgY29sdW1uX3NwZWMoMiwgd2lkdGggPSAzLzcpICU+JQ0KICAgIGNvbHVtbl9zcGVjKDMsIHdpZHRoID0gMy83KQ0KfQ0KDQoNCiMgRnVuY3Rpb24gZm9yIDMtY29sdW1uIHRhYmxlOiBDb2x1bW4gMiA9IDEvNywgQ29sdW1ucyAxIGFuZCAzID0gMy83IGVhY2gNCmZvcm1hdF8zY29sXzNfN18xXzdfM183IDwtIGZ1bmN0aW9uKGRhdGEsIGNhcHRpb24gPSBOVUxMKSB7DQogIGRhdGEgPC0gZm9ybWF0X2RhdGEoZGF0YSkgIyBBcHBseSBmb3JtYXR0aW5nDQogIGtuaXRyOjprYWJsZShkYXRhLCBmb3JtYXQgPSAiaHRtbCIsIGNhcHRpb24gPSBjYXB0aW9uLCBlc2NhcGUgPSBGQUxTRSkgJT4lDQogICAga2FibGVfc3R5bGluZyhmdWxsX3dpZHRoID0gVFJVRSkgJT4lDQogICAgY29sdW1uX3NwZWMoMSwgd2lkdGggPSAzLzcpICU+JQ0KICAgIGNvbHVtbl9zcGVjKDIsIHdpZHRoID0gMS83KSAlPiUNCiAgICBjb2x1bW5fc3BlYygzLCB3aWR0aCA9IDMvNykNCn0NCg0KDQojIEZ1bmN0aW9uIGZvciAzLWNvbHVtbiB0YWJsZTogQ29sdW1uIDMgPSAxLzcsIENvbHVtbnMgMSBhbmQgMiA9IDMvNyBlYWNoDQpmb3JtYXRfM2NvbF8zXzdfM183XzFfNyA8LSBmdW5jdGlvbihkYXRhLCBjYXB0aW9uID0gTlVMTCkgew0KICBkYXRhIDwtIGZvcm1hdF9kYXRhKGRhdGEpICMgQXBwbHkgZm9ybWF0dGluZw0KICBrbml0cjo6a2FibGUoZGF0YSwgZm9ybWF0ID0gImh0bWwiLCBjYXB0aW9uID0gY2FwdGlvbiwgZXNjYXBlID0gRkFMU0UpICU+JQ0KICAgIGthYmxlX3N0eWxpbmcoZnVsbF93aWR0aCA9IFRSVUUpICU+JQ0KICAgIGNvbHVtbl9zcGVjKDEsIHdpZHRoID0gMy83KSAlPiUNCiAgICBjb2x1bW5fc3BlYygyLCB3aWR0aCA9IDMvNykgJT4lDQogICAgY29sdW1uX3NwZWMoMywgd2lkdGggPSAxLzcpDQp9DQoNCg0KIyBGdW5jdGlvbiBmb3IgMy1jb2x1bW4gdGFibGUgd2l0aCBlcXVhbCB3aWR0aCAoMzMuMzMlIGVhY2gpDQpmb3JtYXRfM2NvbF9lcXVhbCA8LSBmdW5jdGlvbihkYXRhLCBjYXB0aW9uID0gTlVMTCkgew0KICBkYXRhIDwtIGZvcm1hdF9kYXRhKGRhdGEpICMgQXBwbHkgZm9ybWF0dGluZw0KICBrbml0cjo6a2FibGUoZGF0YSwgZm9ybWF0ID0gImh0bWwiLCBjYXB0aW9uID0gY2FwdGlvbiwgZXNjYXBlID0gRkFMU0UpICU+JQ0KICAgIGthYmxlX3N0eWxpbmcoZnVsbF93aWR0aCA9IFRSVUUpICU+JQ0KICAgIGNvbHVtbl9zcGVjKDEsIHdpZHRoID0gIjMzLjMzJSIpICU+JQ0KICAgIGNvbHVtbl9zcGVjKDIsIHdpZHRoID0gIjMzLjMzJSIpICU+JQ0KICAgIGNvbHVtbl9zcGVjKDMsIHdpZHRoID0gIjMzLjMzJSIpDQp9DQoNCg0KIyMgTWFudWFsbHkgU3BlY2lmaWVkIFdpZHRocyANCg0KIyBGdW5jdGlvbiBmb3IgNC1jb2x1bW4gdGFibGUgd2l0aCBjdXN0b21pemFibGUgY29sdW1uIHdpZHRocyANCmZvcm1hdF80Y29sX2N1c3RvbV93aWR0aHMgPC0gZnVuY3Rpb24oZGF0YSwgY29sMV93aWR0aCA9ICIzMGVtIiwgY29sMl93aWR0aCA9ICIxMGVtIiwgY29sM193aWR0aCA9ICIzMGVtIiwgY29sNF93aWR0aCA9ICIzMGVtIiwgY2FwdGlvbiA9IE5VTEwpIHsNCiAgZGF0YSA8LSBmb3JtYXRfZGF0YShkYXRhKSAjIEFwcGx5IGZvcm1hdHRpbmcNCiAga25pdHI6OmthYmxlKGRhdGEsIGZvcm1hdCA9ICJodG1sIiwgY2FwdGlvbiA9IGNhcHRpb24sIGVzY2FwZSA9IEZBTFNFKSAlPiUNCiAgICBrYWJsZV9zdHlsaW5nKGZ1bGxfd2lkdGggPSBUUlVFKSAlPiUNCiAgICBjb2x1bW5fc3BlYygxLCB3aWR0aCA9IGNvbDFfd2lkdGgpICU+JQ0KICAgIGNvbHVtbl9zcGVjKDIsIHdpZHRoID0gY29sMl93aWR0aCkgJT4lDQogICAgY29sdW1uX3NwZWMoMywgd2lkdGggPSBjb2wzX3dpZHRoKSAlPiUNCiAgICBjb2x1bW5fc3BlYygzLCB3aWR0aCA9IGNvbDRfd2lkdGgpDQp9DQoNCiMgRnVuY3Rpb24gZm9yIDMtY29sdW1uIHRhYmxlIHdpdGggY3VzdG9taXphYmxlIGNvbHVtbiB3aWR0aHMgDQpmb3JtYXRfM2NvbF9jdXN0b21fd2lkdGhzIDwtIGZ1bmN0aW9uKGRhdGEsIGNvbDFfd2lkdGggPSAiMzBlbSIsIGNvbDJfd2lkdGggPSAiMTBlbSIsIGNvbDNfd2lkdGggPSAiMzBlbSIsIGNhcHRpb24gPSBOVUxMKSB7DQogIGRhdGEgPC0gZm9ybWF0X2RhdGEoZGF0YSkgIyBBcHBseSBmb3JtYXR0aW5nDQogIGtuaXRyOjprYWJsZShkYXRhLCBmb3JtYXQgPSAiaHRtbCIsIGNhcHRpb24gPSBjYXB0aW9uLCBlc2NhcGUgPSBGQUxTRSkgJT4lDQogICAga2FibGVfc3R5bGluZyhmdWxsX3dpZHRoID0gVFJVRSkgJT4lDQogICAgY29sdW1uX3NwZWMoMSwgd2lkdGggPSBjb2wxX3dpZHRoKSAlPiUNCiAgICBjb2x1bW5fc3BlYygyLCB3aWR0aCA9IGNvbDJfd2lkdGgpICU+JQ0KICAgIGNvbHVtbl9zcGVjKDMsIHdpZHRoID0gY29sM193aWR0aCkNCn0NCg0KIyBGdW5jdGlvbiBmb3IgMi1jb2x1bW4gdGFibGUgd2l0aCBjdXN0b21pemFibGUgY29sdW1uIHdpZHRocw0KZm9ybWF0XzJjb2xfY3VzdG9tX3dpZHRocyA8LSBmdW5jdGlvbihkYXRhLCBjb2wxX3dpZHRoID0gIjMwZW0iLCBjb2wyX3dpZHRoID0gIjEwZW0iLCBjYXB0aW9uID0gTlVMTCkgew0KICBkYXRhIDwtIGZvcm1hdF9kYXRhKGRhdGEpICMgQXBwbHkgZm9ybWF0dGluZw0KICBrbml0cjo6a2FibGUoZGF0YSwgZm9ybWF0ID0gImh0bWwiLCBjYXB0aW9uID0gY2FwdGlvbiwgZXNjYXBlID0gRkFMU0UpICU+JQ0KICAgIGthYmxlX3N0eWxpbmcoZnVsbF93aWR0aCA9IFRSVUUpICU+JQ0KICAgIGNvbHVtbl9zcGVjKDEsIHdpZHRoID0gY29sMV93aWR0aCkgJT4lDQogICAgY29sdW1uX3NwZWMoMiwgd2lkdGggPSBjb2wyX3dpZHRoKQ0KfQ0KDQoNCiMjIEVYQU1QTEUgVVNBR0VTIA0KDQojIEV4YW1wbGUgdXNhZ2Ugd2l0aCBzcGVjaWZpYyB3aWR0aHMNCiMgZm9ybWF0XzNjb2xfY3VzdG9tX3dpZHRocyhjcGlfcmF3X3N1bW1hcnksIGNvbDFfd2lkdGggPSAiMjVlbSIsIGNvbDJfd2lkdGggPSAiMTVlbSIsIGNvbDNfd2lkdGggPSAiMjVlbSIpDQoNCg0KIyBFeGFtcGxlIHVzYWdlOg0KIyBBc3N1bWluZyBgbXlfZGF0YWAgaXMgeW91ciBkYXRhIGZyYW1lDQoNCiMgVXNlIGVxdWFsIHdpZHRoIGZvcm1hdCANCiMgZm9ybWF0X2VxdWFsX3dpZHRoKG15X2RhdGEpDQoNCiMgQXNzdW1pbmcgYG5ydCRjcGlfcmF3YCBpcyB5b3VyIGRhdGEgZnJhbWUNCiMgVXNlIGVxdWFsIHdpZHRoIGZvcm1hdCB3aXRoIG11bHRpcGxlIHNldHMgb2YgYSBncm91cGVkIGNvbHVtbnMgIA0KIyBmb3JtYXRfZXF1YWxfd2lkdGhfZ3JvdXBlZChucnQkY3BpX3JhdywgY2FwdGlvbiA9ICJDb25zdW1lciBQcmljZSBJbmRleCAoMTkxMy0yMDI0KSIsIGdyb3VwaW5nX2ZhY3RvciA9IDIpICAjIERvdWJsZXMgY29sdW1ucw0KIyBmb3JtYXRfZXF1YWxfd2lkdGhfZ3JvdXBlZChucnQkY3BpX3JhdywgY2FwdGlvbiA9ICJDb25zdW1lciBQcmljZSBJbmRleCAoMTkxMy0yMDI0KSIsIGdyb3VwaW5nX2ZhY3RvciA9IDMpICAjIFRyaXBsZXMgY29sdW1ucw0KDQojIEFzc3VtaW5nIGBucnQkY3BpX3Jhd2AgaXMgeW91ciBkYXRhIGZyYW1lDQojIFVzZSBVbnNwZWNpZmllZCBmb3JtYXQgd2l0aCBtdWx0aXBsZSBzZXRzIG9mIGEgZ3JvdXBlZCBjb2x1bW5zICANCiMgZm9ybWF0X3Vuc3BlY2lmaWVkX3dpZHRoX2dyb3VwZWQobnJ0JGNwaV9yYXcsIGNhcHRpb24gPSAiQ29uc3VtZXIgUHJpY2UgSW5kZXggKDE5MTMtMjAyNCkiLCBncm91cGluZ19mYWN0b3IgPSAzKQ0KDQoNCiMgVXNlIDItY29sdW1uIGZvcm1hdCB3aXRoIENvbHVtbiAxIGFzIDEvNCBhbmQgQ29sdW1uIDIgYXMgMy80DQojIGZvcm1hdF8yY29sXzFfNF8zXzQobXlfZGF0YSkNCg0KIyBVc2UgMi1jb2x1bW4gZm9ybWF0IHdpdGggZXF1YWwgd2lkdGgNCiMgZm9ybWF0XzJjb2xfZXF1YWwobXlfZGF0YSkNCg0KIyBVc2UgMy1jb2x1bW4gZm9ybWF0IHdpdGggZXF1YWwgd2lkdGgNCiMgZm9ybWF0XzNjb2xfZXF1YWwobXlfZGF0YSkNCg0KDQojIEFkZCBhZGRpdGlvbmFsIGZ1bmN0aW9ucyBhcyBuZWVkZWQgZm9yIG90aGVyIGNvbmZpZ3VyYXRpb25zDQpgYGANCg0KDQo8IS0tDQpSRVFVSVJFUyBVUERBVElORyBDT0RFIENIVU5LIERVRSBUTyBFUlJPUjogDQpJRSANCiMjIyMgQW5udWFsIEluZmxhdGlvbiBSYXRlcyAoMTkxMy0yMDIzKQ0KPiBmb3JtYXRfeW95Y29sb3JfZXF1YWxfd2lkdGhfZ3JvdXBlZChucnQkY3BpX3JhdywgZ3JvdXBpbmdfZmFjdG9yID0gMikNCkVycm9yIGluIGBtdXRhdGUoKWA6DQrihLkgSW4gYXJndW1lbnQ6IGBhY3Jvc3MoLi4uKWAuDQpDYXVzZWQgYnkgZXJyb3IgaW4gYGFjcm9zcygpYDoNCiEgQ2FuJ3QgY29tcHV0ZSBjb2x1bW4gYDEtWWVhciBDQUlSYC4NCkNhdXNlZCBieSBlcnJvciBpbiBgaWYgKCFpcy5uYShudW1lcmljX3ZhbHVlKSkgLi4uYDoNCiEgdGhlIGNvbmRpdGlvbiBoYXMgbGVuZ3RoID4gMQ0KQmFja3RyYWNlOg0KICAxLiBnbG9iYWwgZm9ybWF0X3lveWNvbG9yX2VxdWFsX3dpZHRoX2dyb3VwZWQobnJ0JGNwaV9yYXcsIGdyb3VwaW5nX2ZhY3RvciA9IDIpDQogIDYuIGRwbHlyOjo6bXV0YXRlLmRhdGEuZnJhbWUoLi4uKQ0KICA3LiBkcGx5cjo6Om11dGF0ZV9jb2xzKC5kYXRhLCBkcGx5cl9xdW9zdXJlcyguLi4pLCBieSkNCiAgOS4gZHBseXI6OjptdXRhdGVfY29sKGRvdHNbW2ldXSwgZGF0YSwgbWFzaywgbmV3X2NvbHVtbnMpDQogMTEuIG1hc2skZXZhbF9hbGxfbXV0YXRlKHF1bykNCiAxMi4gZHBseXIgKGxvY2FsKSBldmFsKCkNCg0KIyMgRm9ybWF0IENvbHVtbiBGdW5jdGlvbiAoWW9ZIENvbXBhcmlzb24pDQoNCkZ1bmN0aW9ucyBmb3IgcHJlLWRlZmluZWQgY29sdW1uIHdpZHRocy4gTnVtYmVycyBhbmQgUGVyY2VudGFnZXMga25pdCB3aXRoIGNvbW1hcy4NCi0tPg0KDQpgYGB7ciBwcmVfZGVmaW5lZF9jb2x1bW5fd2lkdGhzX3lveWNvbG9yLCBldmFsPVRSVUUsIGVjaG89RkFMU0V9DQoNCiMgTG9hZCByZXF1aXJlZCBsaWJyYXJpZXMNCmxpYnJhcnkoa25pdHIpDQpsaWJyYXJ5KGthYmxlRXh0cmEpDQpsaWJyYXJ5KHNjYWxlcykNCg0KIyBGdW5jdGlvbiB0byBlc2NhcGUgc3BlY2lhbCBjaGFyYWN0ZXJzIHVuaXZlcnNhbGx5IGluIHN0cmluZ3MgKGZvciBjYXB0aW9ucyBvciBucnQkbWV0YWRhdGEpDQplc2NhcGVfc3BlY2lhbF9jaGFycyA8LSBmdW5jdGlvbih0ZXh0KSB7DQogIHRleHQgPC0gZ3N1YigiJmFtcDsiLCAiJiIsIHRleHQpDQogIHRleHQgPC0gZ3N1YigiJiMxMjQ7IiwgIiB8ICIsIHRleHQpDQogIHRleHQgPC0gZ3N1YigiJmx0IiwgIjw7IiwgdGV4dCkNCiAgdGV4dCA8LSBnc3ViKCImZ3Q7IiwgIj4iLCB0ZXh0KQ0KICByZXR1cm4odGV4dCkNCn0NCg0KIyMjIExJTkUgQlJFQUtTIA0KIyBGdW5jdGlvbiB0byBoYW5kbGUgbGluZSBicmVha3MgaW4gY2hhcmFjdGVyIGNvbHVtbnMNCnByZXNlcnZlX2xpbmVfYnJlYWtzIDwtIGZ1bmN0aW9uKHRleHQpIHsNCiAgZ3N1YigiXG4iLCAiPGJyPiIsIHRleHQpICAjIFJlcGxhY2UgbmV3bGluZSBjaGFyYWN0ZXJzIHdpdGggPGJyPiBmb3IgSFRNTA0KfQ0KDQojIyMgQ09ORElUSU9OQUwgRk9STUFUVElORyBGT1IgWU9ZIENPTVBBUklTT04NCiMgWW9ZIENvbmRpdGlvbmFsIENvbG9yaW5nIEZ1bmN0aW9uDQphcHBseV95b3lfY29uZGl0aW9uYWxfY29sb3JpbmcgPC0gZnVuY3Rpb24oZGF0YSkgew0KICAjIERlZmluZSB0YXJnZXQgY29sdW1uIHBhdHRlcm5zIGZvciBjb25kaXRpb25hbCBjb2xvcmluZw0KICB0YXJnZXRfcGF0dGVybnMgPC0gYygiQ0FHUiIsICJDR1IiLCAiQ0lSIiwgIkNBSVIiLCAiKCUpIiwgIlZhbHVlIiwgIlJhdGUiLCAiT3ZlcmFsbCIsICJTUFgiLCAiUVFRIiwgIkJsYWNrUm9jayIsICJBQVBMIiwgIk5WREEiLCAiTVNGVCIsICJBTVpOIiwgIk1FVEEiLCAiVFNMQSIsICJDT1NUIiwgIlZUSSIsICJWT08iLCAiVkdUIiwgIlNsb3BlIikNCiAgDQogICMgQXBwbHkgY29uZGl0aW9uYWwgZm9ybWF0dGluZyBzcGVjaWZpY2FsbHkgZm9yIFlvWSBjb21wYXJpc29uDQogIGRhdGEgPC0gZGF0YSAlPiUNCiAgICBtdXRhdGUoYWNyb3NzKGV2ZXJ5dGhpbmcoKSwgfiB7DQogICAgICBjb2x1bW5fbmFtZSA8LSBjdXJfY29sdW1uKCkNCiAgICAgIA0KICAgICAgIyBBcHBseSBvbmx5IGlmIHRoZSBjb2x1bW4gbmFtZSBtYXRjaGVzIHRoZSB0YXJnZXQgcGF0dGVybnMNCiAgICAgIGlmIChhbnkoc3RyX2RldGVjdChjb2x1bW5fbmFtZSwgdGFyZ2V0X3BhdHRlcm5zKSkpIHsNCiAgICAgICAgIyBDb252ZXJ0IGNvbHVtbiB2YWx1ZXMgdG8gbnVtZXJpYyBmb3IgY29tcGFyaXNvbiAoaGFuZGxlcyBwZXJjZW50YWdlcyBvciBzeW1ib2xzKQ0KICAgICAgICBudW1lcmljX3ZhbHVlIDwtIHN1cHByZXNzV2FybmluZ3MoYXMubnVtZXJpYyhnc3ViKCJbLCVdIiwgIiIsIC4pKSkNCiAgICAgICAgDQogICAgICAgIGlmICghaXMubmEobnVtZXJpY192YWx1ZSkpIHsNCiAgICAgICAgICAjIEFwcGx5IFlvWSBjb2xvciBmb3JtYXR0aW5nIGJhc2VkIG9uIGNvbXBhcmlzb24gd2l0aCB0aGUgcHJldmlvdXMgcm93DQogICAgICAgICAgY2VsbF9zcGVjKA0KICAgICAgICAgICAgLiwgDQogICAgICAgICAgICBjb2xvciA9IGlmZWxzZSgNCiAgICAgICAgICAgICAgIWlzLm5hKGxhZyhudW1lcmljX3ZhbHVlKSkgJiBudW1lcmljX3ZhbHVlID4gbGFnKG51bWVyaWNfdmFsdWUpLCANCiAgICAgICAgICAgICAgImRhcmtncmVlbiIsIA0KICAgICAgICAgICAgICBpZmVsc2UoIWlzLm5hKGxhZyhudW1lcmljX3ZhbHVlKSkgJiBudW1lcmljX3ZhbHVlIDwgbGFnKG51bWVyaWNfdmFsdWUpLCANCiAgICAgICAgICAgICAgICAgICAgICJkYXJrcmVkIiwgDQogICAgICAgICAgICAgICAgICAgICAiYmxhY2siKSAgIyBEZWZhdWx0IGNvbG9yIGZvciBlcXVhbCBvciBOQSB2YWx1ZXMNCiAgICAgICAgICAgICkNCiAgICAgICAgICApDQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgLg0KICAgICAgICB9DQogICAgICB9IGVsc2Ugew0KICAgICAgICAuICAjIFJldHVybiB0aGUgb3JpZ2luYWwgdmFsdWUgaWYgdGhlIGNvbHVtbiBkb2Vzbid0IG1hdGNoIHRoZSB0YXJnZXQgcGF0dGVybnMNCiAgICAgIH0NCiAgICB9LCAubmFtZXMgPSAiey5jb2x9IikpDQogIA0KICByZXR1cm4oZGF0YSkNCn0NCg0KIyBGb3JtYXR0aW5nIEZ1bmN0aW9uIGZvciBZb1kgQ29sb3JpbmcNCmZvcm1hdF95b3ljb2xvcl9kYXRhIDwtIGZ1bmN0aW9uKGRhdGEpIHsNCiAgIyBGaWx0ZXIgb3V0IHJvd3Mgd2hlcmUgYWxsIHZhbHVlcyBhcmUgTkENCiAgZGF0YSA8LSBkYXRhICU+JSBmaWx0ZXIocm93U3Vtcyhpcy5uYSguKSkgPCBuY29sKC4pKQ0KICANCiAgIyBGb3JtYXQgZGF0YSAoZXNjYXBlIGNoYXJhY3RlcnMsIGxpbmUgYnJlYWtzLCBhbmQgbnVtZXJpYyByb3VuZGluZykNCiAgZGF0YSA8LSBkYXRhICU+JQ0KICAgIG11dGF0ZShhY3Jvc3Mod2hlcmUoaXMuY2hhcmFjdGVyKSwgfiBwcmVzZXJ2ZV9saW5lX2JyZWFrcyhlc2NhcGVfc3BlY2lhbF9jaGFycyguKSkpKSAlPiUgICMgRXNjYXBlIGFuZCBwcmVzZXJ2ZSBzcGVjaWFsIGNoYXJhY3RlcnMNCiAgICBtdXRhdGUoYWNyb3NzKHdoZXJlKGlzLm51bWVyaWMpLCB+IGlmZWxzZSguICUlIDEgPT0gMCwgLiwgcm91bmQoLiwgMikpKSkgJT4lICAgICAgICAgICAgIyBSb3VuZCBudW1lcmljIHZhbHVlcw0KICAgIG11dGF0ZShhY3Jvc3Mod2hlcmUoaXMubnVtZXJpYyksIGNvbW1hKSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgRm9ybWF0IG51bWVyaWMgdmFsdWVzIHdpdGggY29tbWFzDQogIA0KICAjIEFwcGx5IFlvWS1zcGVjaWZpYyBjb25kaXRpb25hbCBjb2xvcmluZw0KICBkYXRhIDwtIGFwcGx5X3lveV9jb25kaXRpb25hbF9jb2xvcmluZyhkYXRhKQ0KICANCiAgcmV0dXJuKGRhdGEpDQp9DQoNCiMgRXhhbXBsZSBVc2FnZQ0KIyBBc3N1bWluZyBgbnJ0JGNwaV9yYXdgIGlzIHlvdXIgZGF0YSBmcmFtZSBmb3IgWW9ZIGNvbXBhcmlzb24NCiMgZm9ybWF0X3lveWNvbG9yX2VxdWFsX3dpZHRoX2dyb3VwZWQobnJ0JGNwaV9yYXcsIGNhcHRpb24gPSAiQ29uc3VtZXIgUHJpY2UgSW5kZXggWW9ZIENoYW5nZXMgKDE5MTMtMjAyNCkiLCBncm91cGluZ19mYWN0b3IgPSAyKQ0KDQoNCg0KIyMjIFJFU0hBUEUgR1JPVVBFRCBDT0xVTU5TIA0KIyBGdW5jdGlvbiB0byByZXNoYXBlIGRhdGEgZnJhbWUgYnkgc3RhY2tpbmcgY29sdW1ucyB2ZXJ0aWNhbGx5IHdpdGhpbiBlYWNoIGdyb3VwDQpyZXNoYXBlX2dyb3VwZWRfY29sdW1ucyA8LSBmdW5jdGlvbihkYXRhLCBncm91cGluZ19mYWN0b3IgPSAyKSB7DQogIG9yaWdpbmFsX3Jvd3MgPC0gbnJvdyhkYXRhKQ0KICBvcmlnaW5hbF9jb2x1bW5zIDwtIG5jb2woZGF0YSkNCiAgDQogICMgQ2FsY3VsYXRlIHRoZSByZXF1aXJlZCBudW1iZXIgb2Ygcm93cyBiYXNlZCBvbiB0aGUgZ3JvdXBpbmcgZmFjdG9yDQogIG5ld19yb3dfY291bnQgPC0gY2VpbGluZyhvcmlnaW5hbF9yb3dzIC8gZ3JvdXBpbmdfZmFjdG9yKQ0KICANCiAgIyBJbml0aWFsaXplIGFuIGVtcHR5IGRhdGEgZnJhbWUgZm9yIHRoZSByZXNoYXBlZCBkYXRhDQogIHJlc2hhcGVkX2RhdGEgPC0gZGF0YS5mcmFtZShtYXRyaXgoTkEsIG5yb3cgPSBuZXdfcm93X2NvdW50LCBuY29sID0gb3JpZ2luYWxfY29sdW1ucyAqIGdyb3VwaW5nX2ZhY3RvcikpDQogIA0KICAjIFN0YWNrIGVhY2ggZ3JvdXAgZG93biB0aGUgY29sdW1uDQogIGZvciAoaSBpbiAxOmdyb3VwaW5nX2ZhY3Rvcikgew0KICAgICMgQ2FsY3VsYXRlIHRoZSByb3cgaW5kaWNlcyBmb3IgdGhlIGN1cnJlbnQgZ3JvdXANCiAgICByb3dfaW5kaWNlcyA8LSAoKGkgLSAxKSAqIG5ld19yb3dfY291bnQgKyAxKTptaW4oaSAqIG5ld19yb3dfY291bnQsIG9yaWdpbmFsX3Jvd3MpDQogICAgY29sX2luZGljZXMgPC0gKChpIC0gMSkgKiBvcmlnaW5hbF9jb2x1bW5zICsgMSk6KGkgKiBvcmlnaW5hbF9jb2x1bW5zKQ0KICAgIA0KICAgICMgQXNzaWduIHRoZSBkYXRhIGZvciB0aGUgY3VycmVudCBncm91cA0KICAgIHJlc2hhcGVkX2RhdGFbMTpsZW5ndGgocm93X2luZGljZXMpLCBjb2xfaW5kaWNlc10gPC0gZGF0YVtyb3dfaW5kaWNlcywgXQ0KICB9DQogIA0KICAjIFNldCBjb2x1bW4gbmFtZXMgdG8gcmVwZWF0IG9yaWdpbmFsIG5hbWVzIHdpdGhvdXQgc3VmZml4ZXMNCiAgY29sX25hbWVzIDwtIHJlcChjb2xuYW1lcyhkYXRhKSwgZ3JvdXBpbmdfZmFjdG9yKQ0KICBjb2xuYW1lcyhyZXNoYXBlZF9kYXRhKSA8LSBjb2xfbmFtZXMNCiAgDQogIHJldHVybihyZXNoYXBlZF9kYXRhKQ0KfQ0KDQoNCg0KDQojIyMgV0lEVEhTDQojIyBVbnNwZWNpZmllZCB3aWR0aHMNCg0KIyBGdW5jdGlvbiB0byBmb3JtYXQgdGFibGUgd2l0aCB1bnNwZWNpZmllZCwgYXV0b21hdGljIGNvbHVtbiB3aWR0aHMNCmZvcm1hdF95b3ljb2xvcl91bnNwZWNpZmllZF93aWR0aCA8LSBmdW5jdGlvbihkYXRhLCBjYXB0aW9uID0gTlVMTCkgew0KICBkYXRhIDwtIGZvcm1hdF95b3ljb2xvcl9kYXRhKGRhdGEpICMgQXBwbHkgZm9ybWF0dGluZw0KICBudW1fY29sdW1ucyA8LSBuY29sKGRhdGEpICMgQ2hlY2sgdGhlIG51bWJlciBvZiBjb2x1bW5zIGluIHRoZSBkYXRhIGZyYW1lDQogICAga25pdHI6OmthYmxlKGRhdGEsIGZvcm1hdCA9ICJodG1sIiwgY2FwdGlvbiA9IGNhcHRpb24sIGVzY2FwZSA9IEZBTFNFKSAlPiUgIyBEaXNwbGF5IHRoZSB0YWJsZSB3aXRoIGF1dG9tYXRpYyB3aWR0aHMNCiAgICBrYWJsZV9zdHlsaW5nKGZ1bGxfd2lkdGggPSBUUlVFKSAgIyBMZXQgY29sdW1ucyBhZGFwdCBhdXRvbWF0aWNhbGx5DQp9DQoNCiMjIFVuc3BlY2lmaWVkIFdpZHRocyBHcm91cGVkDQojIEZ1bmN0aW9uIHRvIGZvcm1hdCB0YWJsZSB3aXRoIGR5bmFtaWNhbGx5IHJlc2hhcGVkIGNvbHVtbnMgYW5kIHVuc3BlY2lmaWVkIHdpZHRoDQpmb3JtYXRfeW95Y29sb3JfdW5zcGVjaWZpZWRfd2lkdGhfZ3JvdXBlZCA8LSBmdW5jdGlvbihkYXRhLCBjYXB0aW9uID0gTlVMTCwgZ3JvdXBpbmdfZmFjdG9yID0gMikgew0KICBkYXRhIDwtIGZvcm1hdF95b3ljb2xvcl9kYXRhKGRhdGEpICAjIEFwcGx5IGRhdGEgZm9ybWF0dGluZw0KICBkYXRhIDwtIHJlc2hhcGVfZ3JvdXBlZF9jb2x1bW5zKGRhdGEsIGdyb3VwaW5nX2ZhY3RvcikgICMgUmVzaGFwZSBkYXRhIHdpdGggZ3JvdXBlZCBjb2x1bW5zDQogIA0KICAjIFVzZSBrbml0cjo6a2FibGUgYW5kIGthYmxlRXh0cmEgdG8gc3R5bGUgdGhlIHRhYmxlDQogIGthYmxlX291dHB1dCA8LSBrbml0cjo6a2FibGUoZGF0YSwgZm9ybWF0ID0gImh0bWwiLCBjYXB0aW9uID0gY2FwdGlvbiwgZXNjYXBlID0gRkFMU0UpICU+JQ0KICAgIGthYmxlX3N0eWxpbmcoZnVsbF93aWR0aCA9IFRSVUUpICAjIExldCBjb2x1bW5zIGFkYXB0IGF1dG9tYXRpY2FsbHkNCiAgDQogIHJldHVybihrYWJsZV9vdXRwdXQpDQp9DQoNCiMgRXhhbXBsZSB1c2FnZQ0KIyBmb3JtYXRfeW95Y29sb3JfdW5zcGVjaWZpZWRfd2lkdGhfZ3JvdXBlZChucnQkY3BpX3JhdywgY2FwdGlvbiA9ICJDb25zdW1lciBQcmljZSBJbmRleCAoMTkxMy0yMDI0KSIsIGdyb3VwaW5nX2ZhY3RvciA9IDMpDQoNCg0KDQojIyBFcXVhbCBXaWR0aHMNCg0KIyBGdW5jdGlvbiB0byBmb3JtYXQgdGFibGUgd2l0aCBlcXVhbCB3aWR0aCBjb2x1bW5zDQpmb3JtYXRfeW95Y29sb3JfZXF1YWxfd2lkdGggPC0gZnVuY3Rpb24oZGF0YSwgY2FwdGlvbiA9IE5VTEwpIHsNCiAgZGF0YSA8LSBmb3JtYXRfeW95Y29sb3JfZGF0YShkYXRhKSAjIEFwcGx5IGZvcm1hdHRpbmcNCiAgbnVtX2NvbHVtbnMgPC0gbmNvbChkYXRhKSAjIEdldCB0aGUgbnVtYmVyIG9mIGNvbHVtbnMgaW4gdGhlIGRhdGEgZnJhbWUNCiAgY29sdW1uX3dpZHRoIDwtIDEwMCAvIG51bV9jb2x1bW5zICMgQ2FsY3VsYXRlIGVxdWFsIHdpZHRoIGFzIGEgcGVyY2VudGFnZQ0KICANCiAgIyBVc2Uga25pdHI6OmthYmxlIGFuZCBrYWJsZUV4dHJhIHRvIHN0eWxlIHRoZSB0YWJsZQ0KICBrYWJsZV9vdXRwdXQgPC0ga25pdHI6OmthYmxlKGRhdGEsIGZvcm1hdCA9ICJodG1sIiwgY2FwdGlvbiA9IGNhcHRpb24sIGVzY2FwZSA9IEZBTFNFKSAlPiUNCiAgICBrYWJsZV9zdHlsaW5nKGZ1bGxfd2lkdGggPSBUUlVFKQ0KICANCiAgIyBBcHBseSBlcXVhbCB3aWR0aCB0byBlYWNoIGNvbHVtbiB1c2luZyBjb2x1bW5fc3BlYw0KICBmb3IgKGkgaW4gMTpudW1fY29sdW1ucykgew0KICAgIGthYmxlX291dHB1dCA8LSBrYWJsZV9vdXRwdXQgJT4lDQogICAgICBjb2x1bW5fc3BlYyhpLCB3aWR0aCA9IHBhc3RlMChjb2x1bW5fd2lkdGgsICIlIikpDQogIH0NCiAgDQogIHJldHVybihrYWJsZV9vdXRwdXQpDQp9DQoNCiMjIEVxdWFsIFdpZHRocyBHcm91cGVkICANCg0KIyBGdW5jdGlvbiB0byBmb3JtYXQgdGFibGUgd2l0aCBkeW5hbWljYWxseSByZXNoYXBlZCBjb2x1bW5zIGFuZCBlcXVhbCB3aWR0aA0KZm9ybWF0X3lveWNvbG9yX2VxdWFsX3dpZHRoX2dyb3VwZWQgPC0gZnVuY3Rpb24oZGF0YSwgY2FwdGlvbiA9IE5VTEwsIGdyb3VwaW5nX2ZhY3RvciA9IDIpIHsNCiAgZGF0YSA8LSBmb3JtYXRfeW95Y29sb3JfZGF0YShkYXRhKSAgIyBBcHBseSBkYXRhIGZvcm1hdHRpbmcNCiAgZGF0YSA8LSByZXNoYXBlX2dyb3VwZWRfY29sdW1ucyhkYXRhLCBncm91cGluZ19mYWN0b3IpICAjIFJlc2hhcGUgZGF0YSB3aXRoIGdyb3VwZWQgY29sdW1ucw0KICANCiAgIyBDYWxjdWxhdGUgZXF1YWwgd2lkdGggYXMgYSBwZXJjZW50YWdlDQogIG51bV9jb2x1bW5zIDwtIG5jb2woZGF0YSkNCiAgY29sdW1uX3dpZHRoIDwtIDEwMCAvIG51bV9jb2x1bW5zDQogIA0KICAjIFVzZSBrbml0cjo6a2FibGUgYW5kIGthYmxlRXh0cmEgdG8gc3R5bGUgdGhlIHRhYmxlDQogIGthYmxlX291dHB1dCA8LSBrbml0cjo6a2FibGUoZGF0YSwgZm9ybWF0ID0gImh0bWwiLCBjYXB0aW9uID0gY2FwdGlvbiwgZXNjYXBlID0gRkFMU0UpICU+JQ0KICAgIGthYmxlX3N0eWxpbmcoZnVsbF93aWR0aCA9IFRSVUUpDQogIA0KICAjIEFwcGx5IGVxdWFsIHdpZHRoIHRvIGVhY2ggY29sdW1uIHVzaW5nIGNvbHVtbl9zcGVjDQogIGZvciAoaSBpbiAxOm51bV9jb2x1bW5zKSB7DQogICAga2FibGVfb3V0cHV0IDwtIGthYmxlX291dHB1dCAlPiUNCiAgICAgIGNvbHVtbl9zcGVjKGksIHdpZHRoID0gcGFzdGUwKGNvbHVtbl93aWR0aCwgIiUiKSkNCiAgfQ0KICANCiAgcmV0dXJuKGthYmxlX291dHB1dCkNCn0NCg0KDQoNCiMjIFByZWRlZmluZWQgZnVuY3Rpb24gZm9yIDItY29sdW1uIHRhYmxlcw0KDQojIEZ1bmN0aW9uIGZvciAyLWNvbHVtbiB0YWJsZTogQ29sdW1uIDEgPSAxLzQsIENvbHVtbiAyID0gMy80DQpmb3JtYXRfeW95Y29sb3JfMmNvbF8xXzRfM180IDwtIGZ1bmN0aW9uKGRhdGEsIGNhcHRpb24gPSBOVUxMKSB7DQogIGRhdGEgPC0gZm9ybWF0X3lveWNvbG9yX2RhdGEoZGF0YSkgIyBBcHBseSBmb3JtYXR0aW5nDQogIGtuaXRyOjprYWJsZShkYXRhLCBmb3JtYXQgPSAiaHRtbCIsIGNhcHRpb24gPSBjYXB0aW9uLCBlc2NhcGUgPSBGQUxTRSkgJT4lDQogICAga2FibGVfc3R5bGluZyhmdWxsX3dpZHRoID0gVFJVRSkgJT4lDQogICAgY29sdW1uX3NwZWMoMSwgd2lkdGggPSAiMjUlIikgJT4lDQogICAgY29sdW1uX3NwZWMoMiwgd2lkdGggPSAiNzUlIikNCn0NCg0KIyBGdW5jdGlvbiBmb3IgMi1jb2x1bW4gdGFibGU6IENvbHVtbiAxID0gMy80LCBDb2x1bW4gMiA9IDEvNA0KZm9ybWF0X3lveWNvbG9yXzJjb2xfM180XzFfNCA8LSBmdW5jdGlvbihkYXRhLCBjYXB0aW9uID0gTlVMTCkgew0KICBkYXRhIDwtIGZvcm1hdF95b3ljb2xvcl9kYXRhKGRhdGEpICMgQXBwbHkgZm9ybWF0dGluZw0KICBrbml0cjo6a2FibGUoZGF0YSwgZm9ybWF0ID0gImh0bWwiLCBjYXB0aW9uID0gY2FwdGlvbiwgZXNjYXBlID0gRkFMU0UpICU+JQ0KICAgIGthYmxlX3N0eWxpbmcoZnVsbF93aWR0aCA9IFRSVUUpICU+JQ0KICAgIGNvbHVtbl9zcGVjKDEsIHdpZHRoID0gIjc1JSIpICU+JQ0KICAgIGNvbHVtbl9zcGVjKDIsIHdpZHRoID0gIjI1JSIpDQp9DQoNCiMgRnVuY3Rpb24gZm9yIDItY29sdW1uIHRhYmxlOiBDb2x1bW4gMSA9IDEvMywgQ29sdW1uIDIgPSAyLzMNCmZvcm1hdF95b3ljb2xvcl8yY29sXzFfM18yXzMgPC0gZnVuY3Rpb24oZGF0YSwgY2FwdGlvbiA9IE5VTEwpIHsNCiAgZGF0YSA8LSBmb3JtYXRfeW95Y29sb3JfZGF0YShkYXRhKSAjIEFwcGx5IGZvcm1hdHRpbmcNCiAga25pdHI6OmthYmxlKGRhdGEsIGZvcm1hdCA9ICJodG1sIiwgY2FwdGlvbiA9IGNhcHRpb24sIGVzY2FwZSA9IEZBTFNFKSAlPiUNCiAgICBrYWJsZV9zdHlsaW5nKGZ1bGxfd2lkdGggPSBUUlVFKSAlPiUNCiAgICBjb2x1bW5fc3BlYygxLCB3aWR0aCA9ICIzMy4zMyUiKSAlPiUNCiAgICBjb2x1bW5fc3BlYygyLCB3aWR0aCA9ICI2Ni42NyUiKQ0KfQ0KDQojIEZ1bmN0aW9uIGZvciAyLWNvbHVtbiB0YWJsZTogQ29sdW1uIDEgPSAyLzMsIENvbHVtbiAyID0gMS8zDQpmb3JtYXRfeW95Y29sb3JfMmNvbF8yXzNfMV8zIDwtIGZ1bmN0aW9uKGRhdGEsIGNhcHRpb24gPSBOVUxMKSB7DQogIGRhdGEgPC0gZm9ybWF0X3lveWNvbG9yX2RhdGEoZGF0YSkgIyBBcHBseSBmb3JtYXR0aW5nDQogIGtuaXRyOjprYWJsZShkYXRhLCBmb3JtYXQgPSAiaHRtbCIsIGNhcHRpb24gPSBjYXB0aW9uLCBlc2NhcGUgPSBGQUxTRSkgJT4lDQogICAga2FibGVfc3R5bGluZyhmdWxsX3dpZHRoID0gVFJVRSkgJT4lDQogICAgY29sdW1uX3NwZWMoMSwgd2lkdGggPSAiNjYuNjclIikgJT4lDQogICAgY29sdW1uX3NwZWMoMiwgd2lkdGggPSAiMzMuMzMlIikNCn0NCiMgRnVuY3Rpb24gZm9yIDItY29sdW1uIHRhYmxlIHdpdGggZXF1YWwgd2lkdGggKDUwJSBlYWNoKQ0KZm9ybWF0X3lveWNvbG9yXzJjb2xfZXF1YWwgPC0gZnVuY3Rpb24oZGF0YSwgY2FwdGlvbiA9IE5VTEwpIHsNCiAgZGF0YSA8LSBmb3JtYXRfeW95Y29sb3JfZGF0YShkYXRhKSAjIEFwcGx5IGZvcm1hdHRpbmcNCiAga25pdHI6OmthYmxlKGRhdGEsIGZvcm1hdCA9ICJodG1sIiwgY2FwdGlvbiA9IGNhcHRpb24sIGVzY2FwZSA9IEZBTFNFKSAlPiUNCiAgICBrYWJsZV9zdHlsaW5nKGZ1bGxfd2lkdGggPSBUUlVFKSAlPiUNCiAgICBjb2x1bW5fc3BlYygxLCB3aWR0aCA9ICI1MCUiKSAlPiUNCiAgICBjb2x1bW5fc3BlYygyLCB3aWR0aCA9ICI1MCUiKQ0KfQ0KDQojIyBQcmVkZWZpbmVkIGZ1bmN0aW9uIGZvciAzLWNvbHVtbiB0YWJsZXMNCg0KIyBGdW5jdGlvbiBmb3IgMy1jb2x1bW4gdGFibGU6IENvbHVtbiAxID0gMi80LCBDb2x1bW5zIDIgYW5kIDMgPSAxLzQgZWFjaA0KZm9ybWF0X3lveWNvbG9yXzNjb2xfMl80XzFfNF8xXzQgPC0gZnVuY3Rpb24oZGF0YSwgY2FwdGlvbiA9IE5VTEwpIHsNCiAgZGF0YSA8LSBmb3JtYXRfeW95Y29sb3JfZGF0YShkYXRhKSAjIEFwcGx5IGZvcm1hdHRpbmcNCiAga25pdHI6OmthYmxlKGRhdGEsIGZvcm1hdCA9ICJodG1sIiwgY2FwdGlvbiA9IGNhcHRpb24sIGVzY2FwZSA9IEZBTFNFKSAlPiUNCiAgICBrYWJsZV9zdHlsaW5nKGZ1bGxfd2lkdGggPSBUUlVFKSAlPiUNCiAgICBjb2x1bW5fc3BlYygxLCB3aWR0aCA9ICI1MCUiKSAlPiUNCiAgICBjb2x1bW5fc3BlYygyLCB3aWR0aCA9ICIyNSUiKSAlPiUNCiAgICBjb2x1bW5fc3BlYygzLCB3aWR0aCA9ICIyNSUiKQ0KfQ0KDQojIEZ1bmN0aW9uIGZvciAzLWNvbHVtbiB0YWJsZTogQ29sdW1uIDIgPSAyLzQsIENvbHVtbnMgMSBhbmQgMyA9IDEvNCBlYWNoDQpmb3JtYXRfeW95Y29sb3JfM2NvbF8xXzRfMl80XzFfNCA8LSBmdW5jdGlvbihkYXRhLCBjYXB0aW9uID0gTlVMTCkgew0KICBkYXRhIDwtIGZvcm1hdF95b3ljb2xvcl9kYXRhKGRhdGEpICMgQXBwbHkgZm9ybWF0dGluZw0KICBrbml0cjo6a2FibGUoZGF0YSwgZm9ybWF0ID0gImh0bWwiLCBjYXB0aW9uID0gY2FwdGlvbiwgZXNjYXBlID0gRkFMU0UpICU+JQ0KICAgIGthYmxlX3N0eWxpbmcoZnVsbF93aWR0aCA9IFRSVUUpICU+JQ0KICAgIGNvbHVtbl9zcGVjKDEsIHdpZHRoID0gIjI1JSIpICU+JQ0KICAgIGNvbHVtbl9zcGVjKDIsIHdpZHRoID0gIjUwJSIpICU+JQ0KICAgIGNvbHVtbl9zcGVjKDMsIHdpZHRoID0gIjI1JSIpDQp9DQoNCiMgRnVuY3Rpb24gZm9yIDMtY29sdW1uIHRhYmxlOiBDb2x1bW4gMyA9IDIvNCwgQ29sdW1ucyAxIGFuZCAyID0gMS80IGVhY2gNCmZvcm1hdF95b3ljb2xvcl8zY29sXzFfNF8xXzRfMl80IDwtIGZ1bmN0aW9uKGRhdGEsIGNhcHRpb24gPSBOVUxMKSB7DQogIGRhdGEgPC0gZm9ybWF0X3lveWNvbG9yX2RhdGEoZGF0YSkgIyBBcHBseSBmb3JtYXR0aW5nDQogIGtuaXRyOjprYWJsZShkYXRhLCBmb3JtYXQgPSAiaHRtbCIsIGNhcHRpb24gPSBjYXB0aW9uLCBlc2NhcGUgPSBGQUxTRSkgJT4lDQogICAga2FibGVfc3R5bGluZyhmdWxsX3dpZHRoID0gVFJVRSkgJT4lDQogICAgY29sdW1uX3NwZWMoMSwgd2lkdGggPSAiMjUlIikgJT4lDQogICAgY29sdW1uX3NwZWMoMiwgd2lkdGggPSAiMjUlIikgJT4lDQogICAgY29sdW1uX3NwZWMoMywgd2lkdGggPSAiNTAlIikNCn0NCg0KIyBGdW5jdGlvbiBmb3IgMy1jb2x1bW4gdGFibGU6IENvbHVtbiAxID0gMS83LCBDb2x1bW5zIDIgYW5kIDMgPSAzLzcgZWFjaA0KZm9ybWF0X3lveWNvbG9yXzNjb2xfMV83XzNfN18zXzcgPC0gZnVuY3Rpb24oZGF0YSwgY2FwdGlvbiA9IE5VTEwpIHsNCiAgZGF0YSA8LSBmb3JtYXRfeW95Y29sb3JfZGF0YShkYXRhKSAjIEFwcGx5IGZvcm1hdHRpbmcNCiAga25pdHI6OmthYmxlKGRhdGEsIGZvcm1hdCA9ICJodG1sIiwgY2FwdGlvbiA9IGNhcHRpb24sIGVzY2FwZSA9IEZBTFNFKSAlPiUNCiAgICBrYWJsZV9zdHlsaW5nKGZ1bGxfd2lkdGggPSBUUlVFKSAlPiUNCiAgICBjb2x1bW5fc3BlYygxLCB3aWR0aCA9IDEvNykgJT4lDQogICAgY29sdW1uX3NwZWMoMiwgd2lkdGggPSAzLzcpICU+JQ0KICAgIGNvbHVtbl9zcGVjKDMsIHdpZHRoID0gMy83KQ0KfQ0KDQoNCiMgRnVuY3Rpb24gZm9yIDMtY29sdW1uIHRhYmxlOiBDb2x1bW4gMiA9IDEvNywgQ29sdW1ucyAxIGFuZCAzID0gMy83IGVhY2gNCmZvcm1hdF95b3ljb2xvcl8zY29sXzNfN18xXzdfM183IDwtIGZ1bmN0aW9uKGRhdGEsIGNhcHRpb24gPSBOVUxMKSB7DQogIGRhdGEgPC0gZm9ybWF0X3lveWNvbG9yX2RhdGEoZGF0YSkgIyBBcHBseSBmb3JtYXR0aW5nDQogIGtuaXRyOjprYWJsZShkYXRhLCBmb3JtYXQgPSAiaHRtbCIsIGNhcHRpb24gPSBjYXB0aW9uLCBlc2NhcGUgPSBGQUxTRSkgJT4lDQogICAga2FibGVfc3R5bGluZyhmdWxsX3dpZHRoID0gVFJVRSkgJT4lDQogICAgY29sdW1uX3NwZWMoMSwgd2lkdGggPSAzLzcpICU+JQ0KICAgIGNvbHVtbl9zcGVjKDIsIHdpZHRoID0gMS83KSAlPiUNCiAgICBjb2x1bW5fc3BlYygzLCB3aWR0aCA9IDMvNykNCn0NCg0KDQojIEZ1bmN0aW9uIGZvciAzLWNvbHVtbiB0YWJsZTogQ29sdW1uIDMgPSAxLzcsIENvbHVtbnMgMSBhbmQgMiA9IDMvNyBlYWNoDQpmb3JtYXRfeW95Y29sb3JfM2NvbF8zXzdfM183XzFfNyA8LSBmdW5jdGlvbihkYXRhLCBjYXB0aW9uID0gTlVMTCkgew0KICBkYXRhIDwtIGZvcm1hdF95b3ljb2xvcl9kYXRhKGRhdGEpICMgQXBwbHkgZm9ybWF0dGluZw0KICBrbml0cjo6a2FibGUoZGF0YSwgZm9ybWF0ID0gImh0bWwiLCBjYXB0aW9uID0gY2FwdGlvbiwgZXNjYXBlID0gRkFMU0UpICU+JQ0KICAgIGthYmxlX3N0eWxpbmcoZnVsbF93aWR0aCA9IFRSVUUpICU+JQ0KICAgIGNvbHVtbl9zcGVjKDEsIHdpZHRoID0gMy83KSAlPiUNCiAgICBjb2x1bW5fc3BlYygyLCB3aWR0aCA9IDMvNykgJT4lDQogICAgY29sdW1uX3NwZWMoMywgd2lkdGggPSAxLzcpDQp9DQoNCg0KIyBGdW5jdGlvbiBmb3IgMy1jb2x1bW4gdGFibGUgd2l0aCBlcXVhbCB3aWR0aCAoMzMuMzMlIGVhY2gpDQpmb3JtYXRfeW95Y29sb3JfM2NvbF9lcXVhbCA8LSBmdW5jdGlvbihkYXRhLCBjYXB0aW9uID0gTlVMTCkgew0KICBkYXRhIDwtIGZvcm1hdF95b3ljb2xvcl9kYXRhKGRhdGEpICMgQXBwbHkgZm9ybWF0dGluZw0KICBrbml0cjo6a2FibGUoZGF0YSwgZm9ybWF0ID0gImh0bWwiLCBjYXB0aW9uID0gY2FwdGlvbiwgZXNjYXBlID0gRkFMU0UpICU+JQ0KICAgIGthYmxlX3N0eWxpbmcoZnVsbF93aWR0aCA9IFRSVUUpICU+JQ0KICAgIGNvbHVtbl9zcGVjKDEsIHdpZHRoID0gIjMzLjMzJSIpICU+JQ0KICAgIGNvbHVtbl9zcGVjKDIsIHdpZHRoID0gIjMzLjMzJSIpICU+JQ0KICAgIGNvbHVtbl9zcGVjKDMsIHdpZHRoID0gIjMzLjMzJSIpDQp9DQoNCg0KIyMgTWFudWFsbHkgU3BlY2lmaWVkIFdpZHRocyANCg0KIyBGdW5jdGlvbiBmb3IgNC1jb2x1bW4gdGFibGUgd2l0aCBjdXN0b21pemFibGUgY29sdW1uIHdpZHRocyANCmZvcm1hdF95b3ljb2xvcl80Y29sX2N1c3RvbV93aWR0aHMgPC0gZnVuY3Rpb24oZGF0YSwgY29sMV93aWR0aCA9ICIzMGVtIiwgY29sMl93aWR0aCA9ICIxMGVtIiwgY29sM193aWR0aCA9ICIzMGVtIiwgY29sNF93aWR0aCA9ICIzMGVtIiwgY2FwdGlvbiA9IE5VTEwpIHsNCiAgZGF0YSA8LSBmb3JtYXRfeW95Y29sb3JfZGF0YShkYXRhKSAjIEFwcGx5IGZvcm1hdHRpbmcNCiAga25pdHI6OmthYmxlKGRhdGEsIGZvcm1hdCA9ICJodG1sIiwgY2FwdGlvbiA9IGNhcHRpb24sIGVzY2FwZSA9IEZBTFNFKSAlPiUNCiAgICBrYWJsZV9zdHlsaW5nKGZ1bGxfd2lkdGggPSBUUlVFKSAlPiUNCiAgICBjb2x1bW5fc3BlYygxLCB3aWR0aCA9IGNvbDFfd2lkdGgpICU+JQ0KICAgIGNvbHVtbl9zcGVjKDIsIHdpZHRoID0gY29sMl93aWR0aCkgJT4lDQogICAgY29sdW1uX3NwZWMoMywgd2lkdGggPSBjb2wzX3dpZHRoKSAlPiUNCiAgICBjb2x1bW5fc3BlYygzLCB3aWR0aCA9IGNvbDRfd2lkdGgpDQp9DQoNCiMgRnVuY3Rpb24gZm9yIDMtY29sdW1uIHRhYmxlIHdpdGggY3VzdG9taXphYmxlIGNvbHVtbiB3aWR0aHMgDQpmb3JtYXRfeW95Y29sb3JfM2NvbF9jdXN0b21fd2lkdGhzIDwtIGZ1bmN0aW9uKGRhdGEsIGNvbDFfd2lkdGggPSAiMzBlbSIsIGNvbDJfd2lkdGggPSAiMTBlbSIsIGNvbDNfd2lkdGggPSAiMzBlbSIsIGNhcHRpb24gPSBOVUxMKSB7DQogIGRhdGEgPC0gZm9ybWF0X3lveWNvbG9yX2RhdGEoZGF0YSkgIyBBcHBseSBmb3JtYXR0aW5nDQogIGtuaXRyOjprYWJsZShkYXRhLCBmb3JtYXQgPSAiaHRtbCIsIGNhcHRpb24gPSBjYXB0aW9uLCBlc2NhcGUgPSBGQUxTRSkgJT4lDQogICAga2FibGVfc3R5bGluZyhmdWxsX3dpZHRoID0gVFJVRSkgJT4lDQogICAgY29sdW1uX3NwZWMoMSwgd2lkdGggPSBjb2wxX3dpZHRoKSAlPiUNCiAgICBjb2x1bW5fc3BlYygyLCB3aWR0aCA9IGNvbDJfd2lkdGgpICU+JQ0KICAgIGNvbHVtbl9zcGVjKDMsIHdpZHRoID0gY29sM193aWR0aCkNCn0NCg0KIyBGdW5jdGlvbiBmb3IgMi1jb2x1bW4gdGFibGUgd2l0aCBjdXN0b21pemFibGUgY29sdW1uIHdpZHRocw0KZm9ybWF0X3lveWNvbG9yXzJjb2xfY3VzdG9tX3dpZHRocyA8LSBmdW5jdGlvbihkYXRhLCBjb2wxX3dpZHRoID0gIjMwZW0iLCBjb2wyX3dpZHRoID0gIjEwZW0iLCBjYXB0aW9uID0gTlVMTCkgew0KICBkYXRhIDwtIGZvcm1hdF95b3ljb2xvcl9kYXRhKGRhdGEpICMgQXBwbHkgZm9ybWF0dGluZw0KICBrbml0cjo6a2FibGUoZGF0YSwgZm9ybWF0ID0gImh0bWwiLCBjYXB0aW9uID0gY2FwdGlvbiwgZXNjYXBlID0gRkFMU0UpICU+JQ0KICAgIGthYmxlX3N0eWxpbmcoZnVsbF93aWR0aCA9IFRSVUUpICU+JQ0KICAgIGNvbHVtbl9zcGVjKDEsIHdpZHRoID0gY29sMV93aWR0aCkgJT4lDQogICAgY29sdW1uX3NwZWMoMiwgd2lkdGggPSBjb2wyX3dpZHRoKQ0KfQ0KDQoNCiMjIEVYQU1QTEUgVVNBR0VTIA0KDQojIEV4YW1wbGUgdXNhZ2Ugd2l0aCBzcGVjaWZpYyB3aWR0aHMNCiMgZm9ybWF0X3lveWNvbG9yXzNjb2xfY3VzdG9tX3dpZHRocyhjcGlfcmF3X3N1bW1hcnksIGNvbDFfd2lkdGggPSAiMjVlbSIsIGNvbDJfd2lkdGggPSAiMTVlbSIsIGNvbDNfd2lkdGggPSAiMjVlbSIpDQoNCg0KIyBFeGFtcGxlIHVzYWdlOg0KIyBBc3N1bWluZyBgbXlfZGF0YWAgaXMgeW91ciBkYXRhIGZyYW1lDQoNCiMgVXNlIGVxdWFsIHdpZHRoIGZvcm1hdCANCiMgZm9ybWF0X3lveWNvbG9yX2VxdWFsX3dpZHRoKG15X2RhdGEpDQoNCiMgQXNzdW1pbmcgYG5ydCRjcGlfcmF3YCBpcyB5b3VyIGRhdGEgZnJhbWUNCiMgVXNlIGVxdWFsIHdpZHRoIGZvcm1hdCB3aXRoIG11bHRpcGxlIHNldHMgb2YgYSBncm91cGVkIGNvbHVtbnMgIA0KIyBmb3JtYXRfeW95Y29sb3JfZXF1YWxfd2lkdGhfZ3JvdXBlZChucnQkY3BpX3JhdywgY2FwdGlvbiA9ICJDb25zdW1lciBQcmljZSBJbmRleCAoMTkxMy0yMDI0KSIsIGdyb3VwaW5nX2ZhY3RvciA9IDIpICAjIERvdWJsZXMgY29sdW1ucw0KIyBmb3JtYXRfeW95Y29sb3JfZXF1YWxfd2lkdGhfZ3JvdXBlZChucnQkY3BpX3JhdywgY2FwdGlvbiA9ICJDb25zdW1lciBQcmljZSBJbmRleCAoMTkxMy0yMDI0KSIsIGdyb3VwaW5nX2ZhY3RvciA9IDMpICAjIFRyaXBsZXMgY29sdW1ucw0KDQojIEFzc3VtaW5nIGBucnQkY3BpX3Jhd2AgaXMgeW91ciBkYXRhIGZyYW1lDQojIFVzZSBVbnNwZWNpZmllZCBmb3JtYXQgd2l0aCBtdWx0aXBsZSBzZXRzIG9mIGEgZ3JvdXBlZCBjb2x1bW5zICANCiMgZm9ybWF0X3lveWNvbG9yX3Vuc3BlY2lmaWVkX3dpZHRoX2dyb3VwZWQobnJ0JGNwaV9yYXcsIGNhcHRpb24gPSAiQ29uc3VtZXIgUHJpY2UgSW5kZXggKDE5MTMtMjAyNCkiLCBncm91cGluZ19mYWN0b3IgPSAzKQ0KDQoNCiMgVXNlIDItY29sdW1uIGZvcm1hdCB3aXRoIENvbHVtbiAxIGFzIDEvNCBhbmQgQ29sdW1uIDIgYXMgMy80DQojIGZvcm1hdF95b3ljb2xvcl8yY29sXzFfNF8zXzQobXlfZGF0YSkNCg0KIyBVc2UgMi1jb2x1bW4gZm9ybWF0IHdpdGggZXF1YWwgd2lkdGgNCiMgZm9ybWF0X3lveWNvbG9yXzJjb2xfZXF1YWwobXlfZGF0YSkNCg0KIyBVc2UgMy1jb2x1bW4gZm9ybWF0IHdpdGggZXF1YWwgd2lkdGgNCiMgZm9ybWF0X3lveWNvbG9yXzNjb2xfZXF1YWwobXlfZGF0YSkNCg0KDQojIEFkZCBhZGRpdGlvbmFsIGZ1bmN0aW9ucyBhcyBuZWVkZWQgZm9yIG90aGVyIGNvbmZpZ3VyYXRpb25zDQpgYGANCg0KDQoNCjwhLS0NCiMjIENvbG9ycyAoVW5pdmVyc2FsKQ0KDQpUaGlzIHNlY3Rpb24gZGVmaW5lcyBhIHVuaXZlcnNhbCBjb2xvciBwYWxldHRlIHRoYXQgd2lsbCBiZSB1c2VkIHRocm91Z2hvdXQgdGhlIGRvY3VtZW50IGZvciBjb25zaXN0ZW50IHN0eWxpbmcgYWNyb3NzIHBsb3RzIGFuZCB0YWJsZXMuIEJ5IGRlZmluaW5nIGNvbG9ycyBhdCBhIGdsb2JhbCBsZXZlbCwgaXQgZW5zdXJlcyB1bmlmb3JtIGFlc3RoZXRpY3MgYWNyb3NzIHZpc3VhbGl6YXRpb25zLCBpbXByb3ZpbmcgdGhlIG92ZXJhbGwgY29oZXJlbmNlIGFuZCByZWFkYWJpbGl0eSBvZiB0aGUgcmVwb3J0LiBUaGUgY29sb3JzIGFyZSBvZnRlbiBhc3NpZ25lZCB0byBzcGVjaWZpYyBjYXRlZ29yaWVzIG9yIHZhcmlhYmxlcyBpbiBwbG90cy4NCi0tPg0KDQpgYGB7ciBjb2xvcnNfZ2VuZXJhbCwgZXZhbD1UUlVFLCBlY2hvPUZBTFNFfQ0KDQojIyBHRU5FUkFMIENPTE9SUyBMSVNUDQojIENyZWF0ZSBhIGxpc3Qgb2YgYm9sZCwgZGlzdGluY3QgY29sb3JzDQojIFVuaXZlcnNhbCBzZXR0aW5nIG9mIGNvbG9ycyBsaXN0IHRvIGFzc2lnbiB2YWx1ZXMgZm9yIHBsb3RzIGFuZCBncmFwaHMNCg0KY29sb3JzX2dlbmVyYWwgPC0gYygNCiAgIiMxZjc3YjQiLCAgIyBCb2xkIEJsdWUNCiAgIiNmZjdmMGUiLCAgIyBCb2xkIE9yYW5nZQ0KICAiIzJjYTAyYyIsICAjIEJvbGQgR3JlZW4NCiAgIiNkNjI3MjgiLCAgIyBCb2xkIFJlZA0KICAiIzk0NjdiZCIsICAjIEJvbGQgUHVycGxlDQogICIjYmNiZDIyIiwgICMgQm9sZCBZZWxsb3ctR3JlZW4NCiAgIiMxN2JlY2YiLCAgIyBCb2xkIEN5YW4NCiAgIiNlMzc3YzIiLCAgIyBCb2xkIFBpbmsNCiAgIiM4YzU2NGIiLCAgIyBCb2xkIEJyb3duDQogICIjYzViMGQ1IiwgICMgU29mdCBMYXZlbmRlcg0KICAiI2Y3YjZkMiIsICAjIFNvZnQgUGluaw0KICAiI2ZmYmI3OCIsICAjIFNvZnQgUGVhY2gNCiAgIiM5OGRmOGEiLCAgIyBTb2Z0IEdyZWVuDQogICIjZmY5ODk2IiwgICMgU29mdCBSZWQNCiAgIiNhZWM3ZTgiLCAgIyBTb2Z0IEJsdWUNCiAgIiNjNDljOTQiLCAgIyBTb2Z0IEJyb3duDQogICIjZGJkYjhkIiwgICMgU29mdCBZZWxsb3cNCiAgIiM5ZWRhZTUiICAgIyBTb2Z0IEN5YW4NCiAgKQ0KDQpjb2xvcnNfZ2VuZXJhbF9kYXJrIDwtIGMoDQogICIjMWE1YjhhIiwgICMgRGFyayBCbHVlDQogICIjY2M2NjAwIiwgICMgRGFyayBPcmFuZ2UNCiAgIiMyMzdiMjMiLCAgIyBEYXJrIEdyZWVuDQogICIjYTYyMDIwIiwgICMgRGFyayBSZWQNCiAgIiM2ZDRiOGMiLCAgIyBEYXJrIFB1cnBsZQ0KICAiIzlhOWIxYiIsICAjIERhcmsgWWVsbG93LUdyZWVuDQogICIjMTM5YjlmIiwgICMgRGFyayBDeWFuDQogICIjYjM2MTlhIiwgICMgRGFyayBQaW5rDQogICIjNmI0NDM4IiwgICMgRGFyayBCcm93bg0KICAiIzlhODdhNSIsICAjIERhcmsgTGF2ZW5kZXINCiAgIiNiODcyOTYiLCAgIyBEYXJrIFBpbmsNCiAgIiNjYzkxNWMiLCAgIyBEYXJrIFBlYWNoDQogICIjNmE4YjVhIiwgICMgRGFyayBHcmVlbg0KICAiI2NjNjY2NCIsICAjIERhcmsgUmVkDQogICIjNzE4NWE4IiwgICMgRGFyayBCbHVlDQogICIjOGI2ZTZkIiwgICMgRGFyayBCcm93bg0KICAiI2ExOWE1OSIsICAjIERhcmsgWWVsbG93DQogICIjNmI5NjliIiAgICMgRGFyayBDeWFuDQopDQoNCmNvbG9yc19yZWZlcmVuY2UgPC0gYygNCiAgDQogICMgTGlnaHQgR3JlZW4gVmFyaWFudHMNCiAgIm1lZGl1bXNwcmluZ2dyZWVuIiwgIyAtICMwMEZBOUEgKFJHQigwLCAyNTAsIDE1NCkpDQogICJzcHJpbmdncmVlbiIsICMgLSAjMDBGRjdGIChSR0IoMCwgMjU1LCAxMjcpKQ0KICAiY2hhcnRyZXVzZSIsICMgLSAjN0ZGRjAwIChSR0IoMTI3LCAyNTUsIDApKQ0KICAiZ3JlZW55ZWxsb3ciLCAjIC0gI0FERkYyRiAoUkdCKDE3MywgMjU1LCA0NykpDQogICJwYWxlZ3JlZW4iLCAjIC0gIzk4RkI5OCAoUkdCKDE1MiwgMjUxLCAxNTIpKQ0KICAibGlnaHRncmVlbiIsICMgLSAjOTBFRTkwIChSR0IoMTQ0LCAyMzgsIDE0NCkpDQogICJob25leWRldyIsICMgLSAjRjBGRkYwIChSR0IoMjQwLCAyNTUsIDI0MCkpDQogICJtaW50Y3JlYW0iLCAjIC0gI0Y1RkZGQSAoUkdCKDI0NSwgMjU1LCAyNTApKQ0KDQogICMgTGlnaHQgWWVsbG93IFZhcmlhbnRzICANCiAgImxpZ2h0Z29sZGVucm9keWVsbG93IiwgIyAtICNGQUZBRDIgKFJHQigyNTAsIDI1MCwgMjEwKSkNCiAgImxlbW9uY2hpZmZvbiIsICMgLSAjRkZGQUNEIChSR0IoMjU1LCAyNTAsIDIwNSkpDQogICJsaWdodHllbGxvdyIsICMgLSAjRkZGRkUwIChSR0IoMjU1LCAyNTUsIDIyNCkpDQogICJwYXBheWF3aGlwIiwgIyAtICNGRkVGRDUgKFJHQigyNTUsIDIzOSwgMjEzKSkNCiAgImJsYW5jaGVkYWxtb25kIiwgIyAtICNGRkVCQ0QgKFJHQigyNTUsIDIzNSwgMjA1KSkNCiAgIm1vY2Nhc2luIiwgIyAtICNGRkU0QjUgKFJHQigyNTUsIDIyOCwgMTgxKSkNCiAgImNvcm5zaWxrIiwgIyAtICNGRkY4REMgKFJHQigyNTUsIDI0OCwgMjIwKSkNCiAgImJlaWdlIiwgIyAtICNGNUY1REMgKFJHQigyNDUsIDI0NSwgMjIwKSkNCiAgDQogICMgTGlnaHQgUmVkIEdyZWVuIFZhcmlhbnRzDQogICJtaXN0eXJvc2UiLCAjIC0gI0ZGRTRFMSAoUkdCKDI1NSwgMjI4LCAyMjUpKQ0KICAicGluayIsICMgLSAjRkZDMENCIChSR0IoMjU1LCAxOTIsIDIwMykpDQogICJsaWdodHBpbmsiLCAjIC0gI0ZGQjZDMSAoUkdCKDI1NSwgMTgyLCAxOTMpKQ0KICAibGlnaHRjb3JhbCIsICMgLSAjRjA4MDgwIChSR0IoMjQwLCAxMjgsIDEyOCkpDQogICJpbmRpYW5yZWQiLCAjIC0gI0NENUM1QyAoUkdCKDIwNSwgOTIsIDkyKSkNCiAgInJvc3licm93biIsICMgLSAjQkM4RjhGIChSR0IoMTg4LCAxNDMsIDE0MykpDQogICJkYXJrc2FsbW9uIiwgIyAtICNFOTk2N0EgKFJHQigyMzMsIDE1MCwgMTIyKSkNCiAgInNhbG1vbiIgIyAtICNGQTgwNzIgKFJHQigyNTAsIDEyOCwgMTE0KSkNCiAgICApDQoNCiMgU2V0IHNlZWQgZm9yIHJlcHJvZHVjaWJpbGl0eQ0Kc2V0LnNlZWQoMTIzKQ0KDQoNCmBgYA0KDQojIEFib3V0IFRoaXMgUmVwb3J0DQoNClRoaXMgcmVwb3J0IHByb3ZpZGVzIGFuYWx5c2VzIG9mIGluZmxhdGlvbiByYXRlcywgYW5kIGdyb3d0aCByYXRlcyBhY3Jvc3MgZmluYW5jaWFsIGluZGV4ZXMsIHdpdGggdGhlIGZsZXhpYmlsaXR5IHRvIGV4cGxvcmUgcHVibGljbHkgdHJhZGVkIHN0b2NrcyBhbmQgRVRGcy4gSXQgZXZhbHVhdGVzIHRoZWlyIGhpc3RvcmljYWwgcGVyZm9ybWFuY2Ugb3ZlciB0aW1lLCByZWZpbmluZyBmb3IgYWNjdXJhY3kgb2YgcHJvYmFibGUgZ3Jvd3RoIHJhdGVzIGFuZCBpbmZsYXRpb24gdHJlbmRzLiBJbiB0aGlzIHJlcG9ydCwgdGhlIHRlcm0gImluZGV4IiBpcyB1c2VkIGJyb2FkbHkgYW5kIG1heSBpbnRlcmNoYW5nZWFibHkgcmVmZXIgdG8gYSBiZW5jaG1hcmsgaW5kZXggKGUuZy4sIFNQWCksIEVURnMsIG11dHVhbCBmdW5kcywgb3IgZXZlbiBjb2xsZWN0aW9ucyBvZiBpbmRpdmlkdWFsIHB1YmxpY2x5IHRyYWRlZCBzdG9ja3MsIHN1Y2ggYXMgQXBwbGUgb3IgTWljcm9zb2Z0LCByZXByZXNlbnRpbmcgc3BlY2lmaWMgbWFya2V0IHNlZ21lbnRzIG9yIGludmVzdG1lbnQgc3RyYXRlZ2llcy4gDQoNCkluZGV4ZXMgc2VydmUgYXMgYmVuY2htYXJrcyBmb3IgYSB2YXJpZXR5IG9mIHB1cnBvc2VzLCBzdWNoIGFzIGludmVzdG1lbnQgY29tcGFyaXNvbnMsIHBvbGljeSB2YWx1YXRpb24sIGFuZCBzdHJhdGVnaWMgZmluYW5jaWFsIHBsYW5uaW5nLiBUaGUgcmVwb3J0IGFpbXMgdG8gYXNzZXNzIHRoZSBsb25nLXRlcm0gdmlhYmlsaXR5IGFuZCBjb21wYXJhdGl2ZSBwZXJmb3JtYW5jZSBvZiB0aGVzZSBpbmRleGVzIGluIHRoZSBjb250ZXh0IG9mIHZhbHVlIGdlbmVyYXRpb24sIGxpa2UgdmFyaWFibGUgYW5udWl0aWVzLCBtdXR1YWwgZnVuZHMsIGV4Y2hhbmdlLXRyYWRlZCBmdW5kcyAoRVRGcyksIHN0cnVjdHVyZWQgbm90ZXMsIHRhcmdldC1kYXRlIGZ1bmRzLCByZXRpcmVtZW50IHNhdmluZ3MgcGxhbnMgKGUuZy4sIDQwMShrKXMpLCBhbmQgZW5kb3dtZW50IHBvbGljaWVzLiBUaGUgU1BYLCBRUVEsIGFuZCBCbGFja1JvY2sgRW5kdXJhIGlzIHV0aWxpemVkIGFzIGV4dGVybmFsIGluZGV4ZXMgZm9yIGFuIEluZGV4ZWQgVW5pdmVyc2FsIExpZmUgKElVTCkgSW5zdXJhbmNlIFBvbGljeSBwcm9kdWN0IHRoYXQncyBiZWVuIHVuZGVyIHJldmlldy4gSSB3b27igJl0IGRlbHZlIGludG8gdGhlIG9yaWdpbnMgb2YgdGhhdCBkZWNpc2lvbiBvciBhYm91dCB0aGUgcG9saWN5IGhlcmU7IHRoZSBwcm9kdWN0IGhhcyBpdHMgcHJvcyBhbmQgY29uc+KAlGl0IGlzLCBhZnRlciBhbGwsIGRlc2lnbmVkIHRvIGJlIHNvbGQuIA0KDQoNCioqRGlmZmVyZW5jZSBpbiBEYXRhIEFjY3VyYWN5KioNCkRhdGEgaXMgZXh0cmFjdGVkIGZyb20gZGlmZmVyZW5jZSBzb3VyY2VzIGJlZm9yZSBjYWxjdWxhdGlvbnMgYXJlIGFwcGxpZWQsIHRoZXJlZm9yZSBwcmljZSBhbmQgcmF0ZXMgbWF5IGRpZmZlciBiZXR3ZWVuIHRoaXMgcmVwb3J0IGFuZCB0aG9zZSBwcmVzZW50ZWQgZnJvbSBleHRyYWN0ZWQgc291cmNlcy4gRm9yIGV4YW1wbGUsIFZHVCBoaXN0b3JpY2FsIGRhdGEgZnJvbSBZYWhvbyAoaHR0cHM6Ly9maW5hbmNlLnlhaG9vLmNvbS9xdW90ZS9WR1QvaGlzdG9yeS8pIGNvbnRhaW5zIHRoZSBvcGVuLCBoaWdoLCBsb3csIGNsb3NlLCBhbmQgdGhlIGFkanVzdGVkIGNsb3NlIHByaWNlIGZvciB0aGUgZGFpbHksIG1vbnRobHkgYW5kIHllYXJseSBkYXRlIGZyYW1lcy4gVGhlIFBlcmZvcm1hbmNlIHNlY3Rpb24gKGh0dHBzOi8vZmluYW5jZS55YWhvby5jb20vcXVvdGUvVkdUL3BlcmZvcm1hbmNlLykgcHJvdmlkZXMgYSBZVEQgVHJhaWxpbmcgUmV0dXJuIG9mICsyOS4yNyUgZnJvbSAwMS8wMS8yMDI0IHRocnUgMTIvMjAvMjAyNC4gVGhpcyByZXR1cm4gcmF0ZSBpcyBjYWxjdWxhdGVkIGZyb20gdGhlIDAxLzAyLzIwMjQgT3BlbiAoNDc3LjY3KSBhbmQgMTIvMjAvMjAyNCBPcGVuICg2MTcuMzcpLiBUaGlzIHJlcG9ydCB1dGlsaXplcyB0aGUgQ2xvc2Ugd2hlbiBjb21wdXRpbmcgUmV0dXJuIFJhdGVzLCBnaXZpbmcgYSArMjcuODglIGZvciBZVEQuIA0KDQpBZGRpdGlvbmFsbHkgdGhlIGZpbHRlcmVkIEhpc3RvcmljYWwgRGF0YSBiZXR3ZWVuIERhaWx5IGFuZCBNb250aGx5IGRvIG5vdCBlcXVhdGUuIFRoZSBmaWx0ZXJlZCBNb250aGx5IGhpc3RvcmljYWwgZGF0YSAgKGh0dHBzOi8vZmluYW5jZS55YWhvby5jb20vcXVvdGUvVkdUL2hpc3RvcnkvP2ZyZXF1ZW5jeT0xbW8pIGJ5IFlhaG9vIGdpdmVzIGEgMDMvMDEvMjAyNCBDbG9zaW5nIFByaWNlICg1MjQuMzQpLCBkaWZmZXJlbnQgZnJvbSB0aGUgdGhlIERhaWx5IGhpc3RvcmljYWwgZGF0YSAoaHR0cHM6Ly9maW5hbmNlLnlhaG9vLmNvbS9xdW90ZS9WR1QvaGlzdG9yeS8pIDAzLzAxLzIwMjQgQ2xvc2luZyBQcmljZSAoNTI3LjM5KS4gVGhlIE1vbnRobHkgWWFob28gRGF0YSBvZiAwMy8wMS8yMDI0IENsb3NpbmcgUHJpY2UgKDUyNC4zNCkgaXMgZXF1YWwgdG8gdGhlIERhaWx5IFlhaG9vIERhdGEgb2YgMDMvMjgvMjAyNCBDbG9zaW5nIFByaWNlICg1MjQuMzQpLCB3aGljaCBpcyB0aGUgbGFzdCBDbG9zaW5nIFByaWNlIG9mIHRoYXQgbW9udGguIFlhaG9vIGRvZXMgbm90IHByb3ZpZGUgYSBkaXNjbGFpbWVyIG9yIG5vdGljZSByZWdhcmRpbmcgdGhpcyBpc3N1ZS4gDQoNCk90aGVyIGRhdGFiYXNlcyB3aWxsIHV0aWxpemUgdGhlIEF2ZXJhZ2Ugb2YgQWxsIENsb3NpbmcgUHJpY2VzIG9mIHRoZSBNb250aCwgd2hlbiBwcm92aWRpbmcgTW9udGhseSBDbG9zaW5nIFByaWNlcy4gVGhpcyBpcyBvbmUgb2YgdGhlIGlzc3VlcyBmYWNpbmcgZGF0YSBhY2N1cmFjeS4gDQoNCiMjIFRha2Vhd2F5DQoNClRoaXMgcmVwb3J0IHdvdWxkIGJlbmVmaXQgZnJvbSBjbGVhbmluZyBhbmQgZnVydGhlciByZWZpbmVtZW50OyBhcyBvZiAxMi8yOS8yMDI0IHRoZXJlJ3JlIGEgbG90IG9mIGNvbnRlbnQgdGhhdCBtYWtlcyB0aGUgaW1wb3J0YW50IGRhdGEgZGlmZmljdWx0IHRvIGZpbmQuIEZvciB0aGUgdGltZSBiZWluZywgdXNlIHRoZSBzZWFyY2ggLyBmaW5kIHNlY3Rpb24gZm9yIHRoZSAiVGFrZWF3YXkiLiANCg0KPCEtLQ0KIyBQRFggSVVMIFdvcmtib29rDQpGb3IgVmlldzogaHR0cHM6Ly8xZHJ2Lm1zL3gvcyFBc1lZWkE5bkw4bGZnY1p1QU5WUmxjQXZCZDI1amc/ZT1iVU1BUm8NCg0KIyMgTmFtZWQgUmFuZ2VzDQotLT4NCg0KYGBge3IgcmVhZF9uYW1lZF9yYW5nZXMsIGV2YWw9VFJVRSwgZWNobz1GQUxTRX0NCg0KbGlicmFyeShyZWFkeGwpDQpsaWJyYXJ5KGRwbHlyKQ0KDQojIERlZmluZSBmaWxlIHBhdGgNCmZpbGVfcGF0aF9pdWx3YiA8LSAiQzovL1VzZXJzLy9rZW5kci8vT25lRHJpdmUvL0RvY3VtZW50cy8vRGF0YSBBbmFseXRpY3MvL01yLiBNYXJrZXQvL1BEWCBJVUwgUmV2aWV3Lnhsc20iDQoNCiMgUmVhZCB0aGUgIk5hbWVkIFJhbmdlcyIgc2hlZXQgaW50byBhIGRhdGEgZnJhbWUNCm5hbWVkX3Jhbmdlc19pdWx3YiA8LSByZWFkX2V4Y2VsKGZpbGVfcGF0aF9pdWx3Yiwgc2hlZXQgPSAiTmFtZWQgUmFuZ2VzIikNCg0KIyBJbml0aWFsaXplIGxpc3RzIGZvciBkaWZmZXJlbnQgdHlwZXMgb2YgbmFtZWQgcmFuZ2VzDQpucnQgPC0gbGlzdCgpICAjIE5hbWVkIFJhbmdlcyBEYXRhRnJhbWVzIChUYWJsZXMpDQpucmwgPC0gbGlzdCgpICAgIyBOYW1lZCBSYW5nZXMgTGlzdHMNCm5ydiA8LSBsaXN0KCkgICAjIE5hbWVkIFJhbmdlcyBTaW5nbGUgVmFsdWVzIChWYWx1ZXMpDQoNCiMgTG9vcCB0aHJvdWdoIGVhY2ggcm93IGluIHRoZSBuYW1lZCByYW5nZXMgdGFibGUNCmZvciAoaSBpbiAxOm5yb3cobmFtZWRfcmFuZ2VzX2l1bHdiKSkgew0KICBuYW1lIDwtIHRvbG93ZXIobmFtZWRfcmFuZ2VzX2l1bHdiJE5hbWVbaV0pDQogIHJhbmdlIDwtIG5hbWVkX3Jhbmdlc19pdWx3YiRSYW5nZVtpXQ0KICB0eXBlIDwtIG5hbWVkX3Jhbmdlc19pdWx3YiRUeXBlW2ldDQogIA0KICAjIENoZWNrIHRoZSB0eXBlIG9mIG5hbWVkIHJhbmdlIGFuZCBoYW5kbGUgYWNjb3JkaW5nbHkNCiAgaWYgKHR5cGUgPT0gIlZhbHVlIikgew0KICAgICMgUmVhZCB0aGUgc2luZ2xlIHZhbHVlIGZyb20gdGhlIHNwZWNpZmllZCByYW5nZQ0KICAgIHNpbmdsZV92YWx1ZSA8LSB0cnlDYXRjaCh7DQogICAgICByZWFkX2V4Y2VsKGZpbGVfcGF0aF9pdWx3YiwgcmFuZ2UgPSByYW5nZSwgY29sX25hbWVzID0gRkFMU0UpICU+JSANCiAgICAgICAgcHVsbCgxKSAlPiUgICMgQXNzdW1pbmcgdGhlIHNpbmdsZSB2YWx1ZSBpcyBpbiB0aGUgZmlyc3QgY2VsbCBvZiB0aGUgcmFuZ2UNCiAgICAgICAgYXMuY2hhcmFjdGVyKCkNCiAgICB9LCBlcnJvciA9IGZ1bmN0aW9uKGUpIHsNCiAgICAgIG1lc3NhZ2UocGFzdGUoIkVycm9yIHJlYWRpbmcgc2luZ2xlIHZhbHVlIGZyb20gcmFuZ2U6IiwgcmFuZ2UpKQ0KICAgICAgTkENCiAgICB9KQ0KICAgIA0KICAgICMgU3RvcmUgYXMgYSBjaGFyYWN0ZXIgdmFsdWUgaW4gbnJ2IGZvciB2YWx1ZXMNCiAgICBucnZbW25hbWVdXSA8LSBzaW5nbGVfdmFsdWUNCg0KICB9IGVsc2UgaWYgKHR5cGUgPT0gIkxpc3QiKSB7DQogICAgIyBSZWFkIHRoZSBkYXRhIGFzIGEgbGlzdCBmcm9tIHRoZSBzcGVjaWZpZWQgcmFuZ2UNCiAgICBsaXN0X2RhdGEgPC0gdHJ5Q2F0Y2goew0KICAgICAgcmVhZF9leGNlbChmaWxlX3BhdGhfaXVsd2IsIHJhbmdlID0gcmFuZ2UsIGNvbF9uYW1lcyA9IEZBTFNFKSAlPiUNCiAgICAgICAgcHVsbCgxKSAgIyBBc3N1bWluZyBhIHNpbmdsZS1jb2x1bW4gcmFuZ2UgZm9yIGxpc3RzDQogICAgfSwgZXJyb3IgPSBmdW5jdGlvbihlKSB7DQogICAgICBtZXNzYWdlKHBhc3RlKCJFcnJvciByZWFkaW5nIGxpc3QgZnJvbSByYW5nZToiLCByYW5nZSkpDQogICAgICBOVUxMDQogICAgfSkNCiAgICANCiAgICAjIFN0b3JlIGFzIGEgdmVjdG9yIGluIG5ybCBmb3IgbGlzdHMNCiAgICBpZiAoIWlzLm51bGwobGlzdF9kYXRhKSkgew0KICAgICAgbnJsW1tuYW1lXV0gPC0gbGlzdF9kYXRhDQogICAgfQ0KDQogIH0gZWxzZSBpZiAodHlwZSA9PSAiVGFibGUiKSB7DQogICAgIyBSZWFkIHRoZSBkYXRhIGFzIGEgdGFibGUgZnJvbSB0aGUgc3BlY2lmaWVkIHJhbmdlDQogICAgdGFibGVfZGF0YSA8LSB0cnlDYXRjaCh7DQogICAgICByZWFkX2V4Y2VsKGZpbGVfcGF0aF9pdWx3YiwgcmFuZ2UgPSByYW5nZSkNCiAgICB9LCBlcnJvciA9IGZ1bmN0aW9uKGUpIHsNCiAgICAgIG1lc3NhZ2UocGFzdGUoIkVycm9yIHJlYWRpbmcgdGFibGUgZnJvbSByYW5nZToiLCByYW5nZSkpDQogICAgICBOVUxMDQogICAgfSkNCiAgICANCiAgICAjIFN0b3JlIGFzIGEgZGF0YSBmcmFtZSBpbiBucnQgZm9yIHRhYmxlcw0KICAgIGlmICghaXMubnVsbCh0YWJsZV9kYXRhKSkgew0KICAgICAgbnJ0W1tuYW1lXV0gPC0gdGFibGVfZGF0YQ0KICAgIH0NCiAgfQ0KfQ0KDQojIFVzYWdlIGV4YW1wbGVzOg0KIyBGb3IgYSAiVmFsdWUiIHR5cGUgbmFtZWQgcmFuZ2UsIGFjY2VzcyB0aGUgdmFsdWUgdXNpbmcgYG5ydiR5b3VyX3ZhbHVlX25hbWVgDQojIEZvciBhICJMaXN0IiB0eXBlIG5hbWVkIHJhbmdlLCBhY2Nlc3MgdGhlIGxpc3QgdXNpbmcgYG5ybCR5b3VyX2xpc3RfbmFtZWANCiMgRm9yIGEgIlRhYmxlIiB0eXBlIG5hbWVkIHJhbmdlLCBhY2Nlc3MgdGhlIGRhdGEgZnJhbWUgdXNpbmcgYG5ydCR5b3VyX3RhYmxlX25hbWVgDQoNCmBgYA0KDQo8IS0tDQojIyBXb3Jrc2hlZXRzDQoNCmBgYHtyIG5ydCR0YWJsZV9vZl9jb250ZW50c19uciAsIGV2YWw9VFJVRSwgcmVzdWx0cz0nbWFya3VwJywgZXZhbD1UUlVFLCBlY2hvPUZBTFNFfQ0KDQpjb2xuYW1lcyhucnQkdGFibGVfb2ZfY29udGVudHNfbnIpWzJdIDwtICJFWFBMQU5BVElPTiIgDQppbnRlcmFjdGl2ZV9wcmludChucnQkdGFibGVfb2ZfY29udGVudHNfbnIpDQojIFZpZXcobnJ0JHRhYmxlX29mX2NvbnRlbnRzX25yKQ0KaW50ZXJhY3RpdmVfc3RyKG5ydCR0YWJsZV9vZl9jb250ZW50c19ucikNCg0KIyBGaWx0ZXIgVE9DIGZvciBkaXNwbGF5IGJ5IGZpbHRlcmluZyB0byB0aGUgc3BlY2lmaWMgcm93cy4NCm5ydCR0YWJsZV9vZl9jb250ZW50c19ucl9kaXNwbGF5IDwtIG5ydCR0YWJsZV9vZl9jb250ZW50c19uclsxOjE4LCBdDQoNCiMgRGlzcGxheSBUYWJsZQ0KZm9ybWF0X3Vuc3BlY2lmaWVkX3dpZHRoKG5ydCR0YWJsZV9vZl9jb250ZW50c19ucl9kaXNwbGF5KQ0KDQpgYGANCi0tPg0KDQojIENQSQ0KDQpUaGUgQ1BJIChDb25zdW1lciBQcmljZSBJbmRleCkgbWVhc3VyZXMgYXZlcmFnZSBjaGFuZ2UgaW4gcHJpY2VzIG92ZXIgdGltZSBmb3IgYSBiYXNrZXQgb2YgZ29vZHMgYW5kIHNlcnZpY2VzIGNvbW1vbmx5IHB1cmNoYXNlZCBieSBob3VzZWhvbGRzLCBzdWNoIGFzIGZvb2QsIGNsb3RoaW5nLCBhbmQgdHJhbnNwb3J0YXRpb24uIENQSSBpcyBvZnRlbiB1c2VkIHRvIGluZGljYXRlIGluZmxhdGlvbiwgcmVmbGVjdGluZyBob3cgbXVjaCB0aGUgY29zdCBvZiBsaXZpbmcgaGFzIGluY3JlYXNlZCBvciBkZWNyZWFzZWQuIA0KDQojIyBJbmZsYXRpb24gVGFyZ2V0cyANCg0KVGhlIGhpc3RvcmljYWwgaW5mbGF0aW9uIHRhcmdldHMgaW4gdGhlIFUuUy4gcmVmbGVjdCB0aGUgZXZvbHZpbmcgcHJpb3JpdGllcyBvZiBtb25ldGFyeSBwb2xpY3kuIEZyb20gMTkxMyB0byB0aGUgMTk3MHMsIHRoZSBGZWRlcmFsIFJlc2VydmUgZGlkIG5vdCBoYXZlIGFuIGV4cGxpY2l0IGluZmxhdGlvbiB0YXJnZXQsIGZvY3VzaW5nIGluc3RlYWQgb24gZmluYW5jaWFsIHN0YWJpbGl0eSBhbmQgZWNvbm9taWMgZ3Jvd3RoLiBJbiB0aGUgMTk3OeKAkzE5ODBzLCB1bmRlciBQYXVsIFZvbGNrZXIsIHRoZSBGZWQgc2hpZnRlZCB0byBjb250cm9sbGluZyBpbmZsYXRpb24gd2l0aG91dCBhIGZvcm1hbCB0YXJnZXQsIGltcGxpY2l0bHkgYWltaW5nIGZvciBsb3cgaW5mbGF0aW9uLiBEdXJpbmcgdGhlIDE5OTBz4oCTMjAxMSwgZ2xvYmFsIHRyZW5kcyBpbmZsdWVuY2VkIHRoZSBGZWQgdG8gYWxpZ24gaW5mb3JtYWxseSB3aXRoIGEgMiUgaW5mbGF0aW9uIHRhcmdldCwgdGhvdWdoIGl0IHJlbWFpbmVkIHVub2ZmaWNpYWwuIEZpbmFsbHksIGluIDIwMTIsIHRoZSBGZWRlcmFsIFJlc2VydmUgZm9ybWFsbHkgYWRvcHRlZCBhIDIlIHRhcmdldCwgcHJpb3JpdGl6aW5nIHByaWNlIHN0YWJpbGl0eSBhbmQgbWF4aW11bSBlbXBsb3ltZW50IGFzIHBhcnQgb2YgaXRzIGR1YWwgbWFuZGF0ZS4gVGhpcyBldm9sdXRpb24gaGlnaGxpZ2h0cyB0aGUgdHJhbnNpdGlvbiBmcm9tIHJlYWN0aXZlIHRvIHByb2FjdGl2ZSBpbmZsYXRpb24gbWFuYWdlbWVudC4NCg0KU291cmNlczogDQoNCi0gTWF0dGhldyBXZWxscyAoMjAwNCkuICJUaGUgT3JpZ2lucyBvZiB0aGUgMiBQZXJjZW50IEluZmxhdGlvbiBUYXJnZXQiLiBGZWRlcmFsIFJlc2VydmUgQmFuayBvZiBSaWNobW9uZC4gaHR0cHM6Ly93d3cucmljaG1vbmRmZWQub3JnL3B1YmxpY2F0aW9ucy9yZXNlYXJjaC9lY29uX2ZvY3VzLzIwMjQvcTFfcTJfZmVkZXJhbF9yZXNlcnZlP3V0bV9zb3VyY2U9Y2hhdGdwdC5jb20NCi0gQWRhbSBTaGFwaXJvIGFuZCBEYW5pZWwgSi4gV2lsc29uLiAgIlRoZSBFdm9sdXRpb24gb2YgdGhlIEZPTUPigJlzIEV4cGxpY2l0IEluZmxhdGlvbiBUYXJnZXQiLiBGUkJTRiBFY29ub21pYyBMZXR0ZXIgMjAxOS0xMiAoQXByaWwgMTUsIDIwMTkpLiBodHRwczovL3d3dy5mcmJzZi5vcmcvcmVzZWFyY2gtYW5kLWluc2lnaHRzL3B1YmxpY2F0aW9ucy9lY29ub21pYy1sZXR0ZXIvMjAxOS8wNC9ldm9sdXRpb24tb2YtZm9tYy1leHBsaWNpdC1pbmZsYXRpb24tdGFyZ2V0Lz91dG1fc291cmNlPWNoYXRncHQuY29tDQoNCmBgYHtyIGhpc3RvcmljYWxfaW5mbGF0aW9uX3RhcmdldHMsIGZpZy53aWR0aD0xMCwgZmlnLmhlaWdodD03fQ0KDQojIExvYWQgbmVjZXNzYXJ5IGxpYnJhcnkNCmxpYnJhcnkoa25pdHIpDQoNCiMgQ3JlYXRlIHRoZSBkYXRhIGZyYW1lIGZvciB0aGUgaGlzdG9yaWNhbCBpbmZsYXRpb24gdGFyZ2V0DQppbmZsYXRpb25fdGFyZ2V0IDwtIGRhdGEuZnJhbWUoDQogIFBlcmlvZCA9IGMoIjE5MTPigJMxOTcwcyIsICIxOTc54oCTMTk4MHMiLCAiMTk5MHPigJMyMDExIiwgIjIwMTLigJNQcmVzZW50IiksDQogIEluZmxhdGlvbl9UYXJnZXQgPSBjKCJOb25lIiwgIkltcGxpY2l0IChsb3cgaW5mbGF0aW9uKSIsICJJbXBsaWNpdCAofjIlKSIsICJGb3JtYWwgMiUgVGFyZ2V0IiksDQogIFBvbGljeV9Gb2N1cyA9IGMoDQogICAgIkZpbmFuY2lhbCBzdGFiaWxpdHkgYW5kIGVjb25vbWljIGdyb3d0aC4iLA0KICAgICJQcmljZSBzdGFiaWxpdHkgKFZvbGNrZXIncyBhbnRpLWluZmxhdGlvbiBmb2N1cykuIiwNCiAgICAiSW5mb3JtYWwgYWxpZ25tZW50IHdpdGggZ2xvYmFsIDIlIHRhcmdldHMuIiwNCiAgICAiUHJpY2Ugc3RhYmlsaXR5IHdpdGggYSBkdWFsIG1hbmRhdGUuIg0KICApLA0KICBTb3VyY2UgPSBjKA0KICAgICJGZWRlcmFsIFJlc2VydmUgSGlzdG9yaWNhbCBPdmVydmlldyIsDQogICAgIkZlZGVyYWwgUmVzZXJ2ZSBNb25ldGFyeSBQb2xpY3kgSGlzdG9yeSIsDQogICAgIkltcGxpY2l0IHRyZW5kIGluIGdsb2JhbCBtb25ldGFyeSBwb2xpY3kiLA0KICAgICJGZWRlcmFsIFJlc2VydmUgKDIwMTIgYW5ub3VuY2VtZW50KSINCiAgKQ0KKQ0KDQojIFByaW50IHRoZSB0YWJsZQ0KZm9ybWF0X3Vuc3BlY2lmaWVkX3dpZHRoKGluZmxhdGlvbl90YXJnZXQsIGNhcHRpb24gPSAiSGlzdG9yaWNhbCBJbmZsYXRpb24gVGFyZ2V0cyBpbiB0aGUgVW5pdGVkIFN0YXRlcyIpDQoNCg0KYGBgDQoNCiMjIEdsb3NzYXJ5IA0KDQpgYGB7ciBucnQkY3BpX21ldGF9DQoNCmZvcm1hdF8yY29sX2N1c3RvbV93aWR0aHMobnJ0JGNwaV9tZXRhLCBjb2wxX3dpZHRoID0gIjEwZW0iLCBjb2wyX3dpZHRoID0gIjUwZW0iKQ0KDQpgYGANCg0KDQojIyBDUEkgSVINCg0KIyMjIERhdGENCg0KVGhlIENQSSBJbmZsYXRpb24gUmF0ZSAoSVIpIGlzIGV4dHJhY3RlZCBmcm9tIHRoZSBCdXJlYXUgb2YgTGFib3IgU3RhdGlzdGljcyAoQkxTKSB3ZWJzaXRlLiBUaGUgQW5udWFsIEluZmxhdGlvbiBSYXRlIGhlcmVpbiB0aGlzIHJlcG9ydCByZXByZXNlbnRzIHRoZSAxMi1tb250aCBhdmVyYWdlIHBlcmNlbnQgY2hhbmdlcyBmcm9tIEphbnVhcnkgdG8gRGVjZW1iZXIuDQoNCg0KRGF0YSBTb3VyY2U6IGByIG5ydiRzb3VyY2VfY3BpX2Jsc2ANCg0KYGBge3IgbnJ0JGNwaV9yYXcsIGV2YWw9VFJVRSwgZWNobz1GQUxTRX0NCg0KbGlicmFyeShkcGx5cikNCmxpYnJhcnkobHVicmlkYXRlKSAgIyBGb3IgZGF0ZSBtYW5pcHVsYXRpb24NCmxpYnJhcnkoc2NhbGVzKSAgICAgIyBGb3IgcGVyY2VudGFnZSBmb3JtYXR0aW5nDQoNCiMgQ29udmVydCBEYXRlIHRvIFlZWVkgZm9ybWF0LCBjaGVjayBpZiBgMS1ZZWFyIENBSVJgIGlzIGFscmVhZHkgYSBwZXJjZW50YWdlLA0KIyBhbmQgc29ydCBEYXRlIGZyb20gbmV3ZXN0IHRvIG9sZGVzdA0KbnJ0JGNwaV9yYXcgPC0gbnJ0JGNwaV9yYXcgJT4lDQogIG11dGF0ZSgNCiAgICBEYXRlID0gYXMuRGF0ZShhcy5jaGFyYWN0ZXIoRGF0ZSksIGZvcm1hdCA9ICIlWSIpLCAgIyBDb252ZXJ0IERhdGUgdG8gRGF0ZSBmb3JtYXQNCiAgICBgMS1ZZWFyIENBSVJgID0gaWZlbHNlKA0KICAgICAgZ3JlcGwoIiUiLCBgMS1ZZWFyIENBSVJgKSwgICMgQ2hlY2sgaWYgYWxyZWFkeSBmb3JtYXR0ZWQgYXMgYSBwZXJjZW50YWdlDQogICAgICBgMS1ZZWFyIENBSVJgLCAgIyBLZWVwIGFzLWlzIGlmIGFscmVhZHkgYSBwZXJjZW50YWdlDQogICAgICBwZXJjZW50KGFzLm51bWVyaWMoYDEtWWVhciBDQUlSYCksIGFjY3VyYWN5ID0gMC4wMSkgICMgRm9ybWF0IGFzIHBlcmNlbnRhZ2UgaWYgbm90DQogICAgKQ0KICApICU+JQ0KICBhcnJhbmdlKGRlc2MoRGF0ZSkpICU+JSAgIyBTb3J0IGJ5IERhdGUgZnJvbSBuZXdlc3QgdG8gb2xkZXN0DQogIG11dGF0ZSgNCiAgICBEYXRlID0gZm9ybWF0KERhdGUsICIlWSIpICAjIENvbnZlcnQgRGF0ZSBiYWNrIHRvICJZWVlZIiBjaGFyYWN0ZXIgZm9ybWF0IGZvciBkaXNwbGF5DQogICkNCg0KIyBGaW5kIHRoZSBtaW5pbXVtIGFuZCBtYXhpbXVtIHllYXINCm1pbl95ZWFyIDwtIG1pbihucnQkY3BpX3JhdyREYXRlLCBuYS5ybSA9IFRSVUUpDQptYXhfeWVhciA8LSBtYXgobnJ0JGNwaV9yYXckRGF0ZSwgbmEucm0gPSBUUlVFKQ0KaW50ZXJhY3RpdmVfcHJpbnQobWluX3llYXIpDQppbnRlcmFjdGl2ZV9wcmludChtYXhfeWVhcikNCg0KIyBEaXNwbGF5IHRoZSBmb3JtYXR0ZWQgZGF0YQ0KaW50ZXJhY3RpdmVfc3RyKG5ydCRjcGlfcmF3KQ0KaW50ZXJhY3RpdmVfcHJpbnQobnJ0JGNwaV9yYXcpDQppbnRlcmFjdGl2ZV9wcmludChucnQkY3BpX21ldGEpDQoNCiMgRGlzcGxheSB0aGUgdGFibGUgd2l0aCBjYXB0aW9uDQpjYXQoIlxuXG4jIyMjIEFubnVhbCBJbmZsYXRpb24gUmF0ZXMgKCIsIG1pbl95ZWFyLCAiLSIsIG1heF95ZWFyLCAiKVxuIiwgc2VwID0gIiIpDQpmb3JtYXRfZXF1YWxfd2lkdGhfZ3JvdXBlZChucnQkY3BpX3JhdywgZ3JvdXBpbmdfZmFjdG9yID0gMikNCiMgY2F0KCJcblxuIFNvdXJjZTogIiwgbnJ2JHNvdXJjZV9jcGlfYmxzLCAiXG4iKQ0KDQpgYGANCg0KIyMjIFN1bW1hcnkNCg0KYGBge3IgY3BpX3Jhd19zdW1tYXJ5LCBldmFsPVRSVUUsIGVjaG89RkFMU0V9DQoNCiMgTG9hZCBuZWNlc3NhcnkgbGlicmFyaWVzDQpsaWJyYXJ5KGRwbHlyKQ0KbGlicmFyeSh0aWJibGUpDQpsaWJyYXJ5KGtuaXRyKQ0KbGlicmFyeShrYWJsZUV4dHJhKQ0KDQojIEFzc3VtaW5nIHlvdXIgZGF0YSBmcmFtZSBpcyBuYW1lZCAnbnJ0JGNwaV9yYXcnIGFuZCBoYXMgY29sdW1ucyAnRGF0ZScgYW5kICcxLVllYXIgQ0FJUicNCiMgQ29udmVydCAnRGF0ZScgdG8gbnVtZXJpYyBhbmQgJzEtWWVhciBDQUlSJyB0byBudW1lcmljLCByZW1vdmluZyBhbnkgbm9uLW51bWVyaWMgY2hhcmFjdGVycw0KbnJ0JGNwaV9yYXcgPC0gbnJ0JGNwaV9yYXcgJT4lDQogIG11dGF0ZSgNCiAgICBEYXRlID0gYXMubnVtZXJpYyhEYXRlKSwNCiAgICBgMS1ZZWFyIENBSVJgID0gYXMubnVtZXJpYyhnc3ViKCJbXjAtOS4tXSIsICIiLCBgMS1ZZWFyIENBSVJgKSkNCiAgKQ0KDQojIFNvcnQgZGF0YSBieSBEYXRlIGluIGFzY2VuZGluZyBvcmRlcg0KbnJ0JGNwaV9yYXcgPC0gbnJ0JGNwaV9yYXcgJT4lDQogIGFycmFuZ2UoRGF0ZSkNCg0KIyBDYWxjdWxhdGUgdGhlIENBSVIgdmFsdWUgYW5kIGR5bmFtaWNhbGx5IGNyZWF0ZSBhIHZhcmlhYmxlIG5hbWUgd2l0aCB0aGUgZm9ybWF0IGNwaV9jYWlyX3ZhbHVlX3M8bWluX3llYXI+X2U8bWF4X3llYXI+DQppbml0aWFsX3ZhbHVlIDwtIDEwMCAgIyBBc3N1bWluZyBhbiBpbml0aWFsIGluZGV4IHZhbHVlIG9mIDEwMA0KZmluYWxfdmFsdWUgPC0gaW5pdGlhbF92YWx1ZSAqIHByb2QoMSArIG5ydCRjcGlfcmF3JGAxLVllYXIgQ0FJUmAgLyAxMDAsIG5hLnJtID0gVFJVRSkNCm1pbl95ZWFyIDwtIG1pbihucnQkY3BpX3JhdyREYXRlLCBuYS5ybSA9IFRSVUUpDQptYXhfeWVhciA8LSBtYXgobnJ0JGNwaV9yYXckRGF0ZSwgbmEucm0gPSBUUlVFKQ0KbnVtX3llYXJzIDwtIG1heF95ZWFyIC0gbWluX3llYXINCmNhaXJfdmFsdWUgPC0gcm91bmQoKChmaW5hbF92YWx1ZSAvIGluaXRpYWxfdmFsdWUpXigxIC8gbnVtX3llYXJzKSAtIDEpICogMTAwLCAyKQ0KdmFyX25hbWUgPC0gcGFzdGUwKCJjcGlfY2Fpcl92YWx1ZV9zIiwgbWluX3llYXIsICJfZSIsIG1heF95ZWFyKQ0KYXNzaWduKHZhcl9uYW1lLCBjYWlyX3ZhbHVlKQ0KDQojIEV4YW1wbGUgQ1BJIGRhdGEgKHJlcGxhY2Ugd2l0aCB5b3VyIGRhdGEgZnJhbWUpDQojIG5ydCRjcGlfcmF3IDwtIGRhdGEuZnJhbWUoYEFubnVhbCBJbmZsYXRpb24gUmF0ZXNgID0gYygxLjUsIDIuMSwgMy4wLCAuLi4pKQ0KdGFyZ2V0X3ZhbHVlIDwtIDIgICMgU2V0IHRoZSB0YXJnZXQgcmF0ZSwgZS5nLiwgMiUNCg0KIyBDb252ZXJ0IENQSSBkYXRhIHRvIG51bWVyaWMsIHJlbW92aW5nIGFueSBwZXJjZW50YWdlIHNpZ25zDQpkYXRhIDwtIGFzLm51bWVyaWMoZ3N1YigiJSIsICIiLCBucnQkY3BpX3JhdyRgMS1ZZWFyIENBSVJgKSkNCg0KIyBDYWxjdWxhdGUgc3RhdGlzdGljcw0KY291bnRfb2JzZXJ2YXRpb25zIDwtIHN1bSghaXMubmEoZGF0YSkpDQptZWFuX3ZhbHVlIDwtIHJvdW5kKG1lYW4oZGF0YSwgbmEucm0gPSBUUlVFKSwgMikNCm1lZGlhbl92YWx1ZSA8LSByb3VuZChtZWRpYW4oZGF0YSwgbmEucm0gPSBUUlVFKSwgMikNCnNkX3ZhbHVlIDwtIHJvdW5kKHNkKGRhdGEsIG5hLnJtID0gVFJVRSksIDIpDQptaW5fY2Fpcl9yYW5nZSA8LSByb3VuZChjYWlyX3ZhbHVlIC0gc2RfdmFsdWUsIDIpDQptYXhfY2Fpcl9yYW5nZSA8LSByb3VuZChjYWlyX3ZhbHVlICsgc2RfdmFsdWUsIDIpDQptaW5fdmFsdWUgPC0gcm91bmQobWluKGRhdGEsIG5hLnJtID0gVFJVRSksIDIpDQptYXhfdmFsdWUgPC0gcm91bmQobWF4KGRhdGEsIG5hLnJtID0gVFJVRSksIDIpDQoNCiMgVGFyZ2V0IFJhdGUgQW5hbHlzaXMNCnllYXJzX2Fib3ZlX3RhcmdldCA8LSBzdW0oZGF0YSA+IHRhcmdldF92YWx1ZSwgbmEucm0gPSBUUlVFKQ0KeWVhcnNfYmVsb3dfdGFyZ2V0IDwtIHN1bShkYXRhIDwgdGFyZ2V0X3ZhbHVlLCBuYS5ybSA9IFRSVUUpDQpwZXJjZW50X2Fib3ZlX3RhcmdldCA8LSByb3VuZCgoeWVhcnNfYWJvdmVfdGFyZ2V0IC8gY291bnRfb2JzZXJ2YXRpb25zKSAqIDEwMCwgMikNCnBlcmNlbnRfYmVsb3dfdGFyZ2V0IDwtIHJvdW5kKCh5ZWFyc19iZWxvd190YXJnZXQgLyBjb3VudF9vYnNlcnZhdGlvbnMpICogMTAwLCAyKQ0KDQojIENvbXBpbGUgc3RhdGlzdGljcyBpbnRvIGEgbGlzdCBmb3IgZWFzeSBjb252ZXJzaW9uIHRvIGEgZGF0YSBmcmFtZSB3aXRoIGRlZmluaXRpb25zDQpjcGlfcmF3X3N1bW1hcnkgPC0gdHJpYmJsZSgNCiAgflN0YXRpc3RpYywgflZhbHVlLCB+RGVmaW5pdGlvbiwNCiAgIkNvdW50IG9mIE9ic2VydmF0aW9ucyIsIGFzLmNoYXJhY3Rlcihjb3VudF9vYnNlcnZhdGlvbnMpLCAiVG90YWwgbnVtYmVyIG9mIGRhdGEgcG9pbnRzIGNvbGxlY3RlZCBvdmVyIHRoZSBzcGVjaWZpYyBwZXJpb2QuIiwNCiAgIkNBSVIiLCBwYXN0ZTAoY2Fpcl92YWx1ZSwgIiUiKSwgIkNvbXBvdW5kIEF2ZXJhZ2UgSW5mbGF0aW9uIFJhdGU7IG1lYW4gaW5mbGF0aW9uIHJhdGUgb3ZlciBhIHBlcmlvZCBpZiBpdCBoYWQgY29tcG91bmRlZCBhbnVhbGx5LiIsDQogICJNZWFuIiwgcGFzdGUwKG1lYW5fdmFsdWUsICIlIiksICJSZWZsZWN0cyB0aGUgZ2VuZXJhbCBwcmljZSBsZXZlbCBhbmQgb3ZlcmFsbCBpbmZsYXRpb24gcmF0ZS4iLA0KICAiTWVkaWFuIiwgcGFzdGUwKG1lZGlhbl92YWx1ZSwgIiUiKSwgIk1pZGRsZSB2YWx1ZSBvZiB0aGUgZGF0YSB3aGVuIG9yZGVyZWQgY2hyb25vbG9naWNhbGx5OyBjZW50cmFsIHRlbmRlbmN5IG1lYXN1cmUgbGVzcyBhZmZlY3RlZCBieSBleHRyZW1lIHZhbHVlcy4iLA0KICAiU3RhbmRhcmQgRGV2aWF0aW9uIChWb2xhdGlsaXR5KSIsIHBhc3RlMChzZF92YWx1ZSwgIiUiKSwgIlRoZSBkaXNwZXJzaW9uIG9mIHZhbHVlcyBmcm9tIHRoZSBtZWFuLCBpbmRpY2F0aW5nIHRoZSB2b2xhdGlsaXR5IG9mIHByaWNlIGNoYW5nZXMgYW5kIGVjb25vbWljIHN0YWJpbGl0eS4iLA0KICAiTWluIENBSVIgUmFuZ2UgKENBSVIgLSBTRCkiLCBwYXN0ZTAobWluX2NhaXJfcmFuZ2UsICIlIiksICJMb3dlciBib3VuZGFyeSBvZiBleHBlY3RlZCBDUEkgcmFuZ2U7IGxvd2VzdCBlc3RpbWF0ZSBvZiB0eXBpY2FsIGluZmxhdGlvbiByYXRlIGNvbnNpZGVyaW5nIG5vcm1hbCBmbHVjdHVhdGlvbnMuIiwNCiAgIk1heCBDQUlSIFJhbmdlIChDQUlSICsgU0QpIiwgcGFzdGUwKG1heF9jYWlyX3JhbmdlLCAiJSIpLCAiVXBwZXIgYm91bmRhcnkgb2YgZXhwZWN0ZWQgQ1BJIHJhbmdlOyBoaWdoZXN0IGVzdGltYXRlIG9mIHR5cGljYWwgaW5mbGF0aW9uIHJhdGUgY29uc2lkZXJpbmcgbm9ybWFsIGZsdWN0dWF0aW9ucy4iLA0KICAiTWluaW11bSIsIHBhc3RlMChtaW5fdmFsdWUsICIlIiksICJMb3dlc3QgdmFsdWU7IGhpZ2hsaWdodHMgcGVyaW9kcyBvZiBtaW5pbWFsIGluZmxhdGlvbiBvciBkZWZsYXRpb25hcnkgdHJlbmRzLiIsDQogICJNYXhpbXVtIiwgcGFzdGUwKG1heF92YWx1ZSwgIiUiKSwgIkhpZ2hlc3QgdmFsdWU7IGhpZ2hsaWdodHMgcGVyaW9kcyBvZiBwZWFrIGluZmxhdGlvbmFyeSBwcmVzc3VyZXMuIiwNCiAgIkFib3ZlIDIuMCBUYXJnZXQiLCBwYXN0ZTAocGVyY2VudF9hYm92ZV90YXJnZXQsICIlIiksICJQZXJjZW50YWdlIG9mIHBlcmlvZHMgd2hlcmUgaW5mbGF0aW9uIGV4Y2VlZGVkIHRoZSAyLjAlIHRhcmdldCwgaW5kaWNhdGluZyBoaWdoZXItdGhhbi1kZXNpcmVkIGluZmxhdGlvbi4iLA0KICAiQmVsb3cgMi4wIFRhcmdldCIsIHBhc3RlMChwZXJjZW50X2JlbG93X3RhcmdldCwgIiUiKSwgIlBlcmNlbnRhZ2Ugb2YgcGVyaW9kcyB3aGVyZSBpbmZsYXRpb24gd2FzIGJlbG93IHRoZSAyLjAlIHRhcmdldCwgc3VnZ2VzdGluZyBwb3RlbnRpYWwgZGVmbGF0aW9uYXJ5IHByZXNzdXJlcyBvciBpbnN1ZmZpY2llbnQgaW5mbGF0aW9uLiINCikNCg0KIyBDb252ZXJ0IHRvIGNoYXJhY3RlciB0byBhdm9pZCBhdXRvbWF0aWMgZGVjaW1hbCBwb2ludHMgb24gd2hvbGUgbnVtYmVycw0KY3BpX3Jhd19zdW1tYXJ5IDwtIGNwaV9yYXdfc3VtbWFyeSAlPiUNCiAgbXV0YXRlKGFjcm9zcyhldmVyeXRoaW5nKCksIGFzLmNoYXJhY3RlcikpDQoNCiMgRGlzcGxheSBmb3JtYXR0ZWQgdGFibGUNCiMgVXNlIGNhdCgpIHdpdGggc2VwID0gIiIgdG8gYXZvaWQgc3BhY2VzIGJldHdlZW4gZWxlbWVudHMNCmNhdCgiXG5cbiMjIyMgQW5udWFsIEluZmxhdGlvbiBSYXRlIFN1bW1hcnkgKCIsIG1pbl95ZWFyLCAiLSIsIG1heF95ZWFyLCAiKVxuIiwgc2VwID0gIiIpDQpmb3JtYXRfM2NvbF9jdXN0b21fd2lkdGhzKGNwaV9yYXdfc3VtbWFyeSwgY29sMV93aWR0aCA9ICIyMGVtIiwgY29sMl93aWR0aCA9ICIxMGVtIiwgY29sM193aWR0aCA9ICI0MGVtIikgDQoNCiMgVmlldyhjcGlfcmF3X3N1bW1hcnkpDQppbnRlcmFjdGl2ZV9zdHIoY3BpX3Jhd19zdW1tYXJ5KQ0KDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KIyMgQ0FJUiBWYWx1ZSBTaW5jZSBJbXBsaWNpdCAyJSBUYXJnZXQNCg0KIyBDYWxjdWxhdGUgdGhlIENBSVIgdmFsdWUgZnJvbSBzcGVjaWZpYyBzdGFydC1kYXRlLCBhbmQgZHluYW1pY2FsbHkgY3JlYXRlIGEgdmFyaWFibGUgbmFtZSB3aXRoIHRoZSBmb3JtYXQgY3BpX2NhaXJfdmFsdWVfczxtaW5feWVhcl9zcGVjaWZpYz5fZTxtYXhfeWVhcl9zcGVjaWZpYz4NCiMgRGVmaW5lIHRoZSBzcGVjaWZpYyBzdGFydCB5ZWFyIGZvciB0aGUgaW1wbGljaXQgMiUgdGFyZ2V0DQptaW5feWVhcl9zcGVjaWZpYyA8LSAxOTkwDQptYXhfeWVhcl9zcGVjaWZpYyA8LSBtYXgobnJ0JGNwaV9yYXckRGF0ZSwgbmEucm0gPSBUUlVFKQ0KDQojIEZpbHRlciB0aGUgZGF0YSB0byBpbmNsdWRlIG9ubHkgZGF0ZXMgZnJvbSBtaW5feWVhcl9zcGVjaWZpYyBvbndhcmQNCmZpbHRlcmVkX2RhdGEgPC0gbnJ0JGNwaV9yYXdbbnJ0JGNwaV9yYXckRGF0ZSA+PSBtaW5feWVhcl9zcGVjaWZpYywgXQ0KDQojIENhbGN1bGF0ZSB0aGUgQ0FJUiB1c2luZyB0aGUgZmlsdGVyZWQgZGF0YQ0KaW5pdGlhbF92YWx1ZSA8LSAxMDAgICMgQXNzdW1pbmcgYW4gaW5pdGlhbCBpbmRleCB2YWx1ZSBvZiAxMDANCmZpbmFsX3ZhbHVlIDwtIGluaXRpYWxfdmFsdWUgKiBwcm9kKDEgKyBmaWx0ZXJlZF9kYXRhJGAxLVllYXIgQ0FJUmAgLyAxMDAsIG5hLnJtID0gVFJVRSkNCm51bV95ZWFycyA8LSBtYXhfeWVhcl9zcGVjaWZpYyAtIG1pbl95ZWFyX3NwZWNpZmljDQpjYWlyX3ZhbHVlX3NwZWNpZmljIDwtIHJvdW5kKCgoZmluYWxfdmFsdWUgLyBpbml0aWFsX3ZhbHVlKV4oMSAvIG51bV95ZWFycykgLSAxKSAqIDEwMCwgMikNCg0KIyBEeW5hbWljYWxseSBjcmVhdGUgdGhlIHZhcmlhYmxlIG5hbWUNCnZhcl9uYW1lIDwtIHBhc3RlMCgiY3BpX2NhaXJfdmFsdWVfcyIsIG1pbl95ZWFyX3NwZWNpZmljLCAiX2UiLCBtYXhfeWVhcl9zcGVjaWZpYykNCg0KIyBBc3NpZ24gdGhlIGNhbGN1bGF0ZWQgQ0FJUiB2YWx1ZSB0byB0aGUgZHluYW1pY2FsbHkgY3JlYXRlZCB2YXJpYWJsZQ0KYXNzaWduKHZhcl9uYW1lLCBjYWlyX3ZhbHVlX3NwZWNpZmljKQ0KDQojIERpc3BsYXkgdGhlIGNhbGN1bGF0ZWQgQ0FJUiB2YWx1ZQ0KaW50ZXJhY3RpdmVfcHJpbnQoY2Fpcl92YWx1ZV9zcGVjaWZpYykNCg0KIyBDUEkgQ0FJUiBTcGVjaWZpYyBWYWx1ZXMNCiMgY3BpX2NhaXJfdmFsdWVfczE5MTNfZTIwMjMNCiMgY3BpX2NhaXJfdmFsdWVfczE5OTBfZTIwMjMNCg0KYGBgDQoNClRoZSBhbm51YWwgaW5mbGF0aW9uIHJhdGUgKGByIGNwaV9jYWlyX3ZhbHVlX3MxOTEzX2UyMDIzYCUpIGlzIGByIGlmKGNwaV9jYWlyX3ZhbHVlX3MxOTEzX2UyMDIzIDwgbWVhbl92YWx1ZSkgImxvd2VyIHRoYW4iIGVsc2UgaWYoY3BpX2NhaXJfdmFsdWVfczE5MTNfZTIwMjMgPiBtZWFuX3ZhbHVlKSAiaGlnaGVyIHRoYW4iIGVsc2UgImVxdWFsIHRvImAgbWVhbiBpbmZsYXRpb24gcmF0ZSAoYHIgbWVhbl92YWx1ZWAlKSwgcmVmbGVjdGluZyBgciBpZihjcGlfY2Fpcl92YWx1ZV9zMTkxM19lMjAyMyA8IG1lYW5fdmFsdWUpICJzaG9ydC10ZXJtIHZvbGF0aWxpdHkgYW5kIGluZmxhdGlvbiBzcGlrZXMiIGVsc2UgaWYoY3BpX2NhaXJfdmFsdWVfczE5MTNfZTIwMjMgPiBtZWFuX3ZhbHVlKSAic2hvcnQtdGVybSB2b2xhdGlsaXR5IGFuZCBkZWZsYXRpb24gZHJvcHMiIGVsc2UgImFic2VuY2Ugb2Ygbm90aWNlYWJsZSBzcGlrZXMgYXQgZmlyc3QgZ2xhbmNlImAuIFRoZSBhbm51YWwgaW5mbGF0aW9uIHJhdGUgKGByIGNwaV9jYWlyX3ZhbHVlX3MxOTEzX2UyMDIzYCUpIGlzIGByIGlmKGNwaV9jYWlyX3ZhbHVlX3MxOTEzX2UyMDIzIDwgbWVkaWFuX3ZhbHVlKSAibG93ZXIgdGhhbiIgZWxzZSBpZihjcGlfY2Fpcl92YWx1ZV9zMTkxM19lMjAyMyA+IG1lZGlhbl92YWx1ZSkgImhpZ2hlciB0aGFuIiBlbHNlICJlcXVhbCB0byJgIG1lYW4gaW5mbGF0aW9uIHJhdGUgKGByIG1lZGlhbl92YWx1ZWAlKSwgaW5kaWNhdGluZyB0aGF0IHN1c3RhaW5lZCBwZXJpb2RzIGByIGlmKGNwaV9jYWlyX3ZhbHVlX3MxOTEzX2UyMDIzIDwgbWVkaWFuX3ZhbHVlKSAib2YgYWJvdmUtbWVkaWFuIGluZmxhdGlvbiBleGVydGVkIGN1bXVsYXRpdmUgZG93bmFyZCIgZWxzZSBpZihjcGlfY2Fpcl92YWx1ZV9zMTkxM19lMjAyMyA+IG1lZGlhbl92YWx1ZSkgIm9mIGJlbG93LW1lZGlhbiBpbmZsYXRpb24gZXhlcnRlZCBjdW11bGF0aXZlIHVwd2FyZCIgZWxzZSAib2YgaW5mbGF0aW9uIGRvZXNuJ3QgaW5pdGlhbGx5IGFwcGVhciB0byBoYXZlIGFueSJgIHByZXNzdXJlIG9uIHByaWNlIGxldmVscy4gVGhpcyByZWxhdGlvbnNoaXAgc2lnbmFscyBhIGRpc3RyaWJ1dGlvbiB3aXRoIG5vdGFibGUgZXh0cmVtZXMgb24gdGhlIGhpZ2hlciBlbmQgKHBvc2l0aXZlIHNrZXduZXNzKSB3aGlsZSBlbXBoYXNpemluZyB0aGF0IHRoZSBsb25nLXRlcm0gY29tcG91bmRlZCBlZmZlY3QgaXMgbW9yZSByZXByZXNlbnRhdGl2ZSBvZiB0aGUgb3ZlcmFsbCBlY29ub21pYyB0cmVuZCB0aGFuIGVpdGhlciB0aGUgbWVhbiBvciB0aGUgbWVkaWFuIGFsb25lLiBUaGUgc3RhbmRhcmQgZGV2aWF0aW9uIG9mIGByIHNkX3ZhbHVlYCUgcmVmbGVjdHMgc2lnbmlmaWNhbnQgdm9sYXRpbGl0eSwgd2l0aCBpbmZsYXRpb24gcmF0ZXMgcmFuZ2luZyBmcm9tIGEgZGVmbGF0aW9uYXJ5IGxvdyBvZiBgciBtaW5fdmFsdWVgJSB0byBhIHBlYWsgb2ZgciBtYXhfdmFsdWVgJSwgYW5kIGFuIGV4cGVjdGVkIHJhbmdlIG9mIGByIG1pbl9jYWlyX3JhbmdlYCUgdG8gYHIgbWF4X2NhaXJfcmFuZ2VgJSB3aGVuIGFjY291bnRpbmcgZm9yIHR5cGljYWwgZmx1Y3R1YXRpb25zLiBOb3RhYmx5LCBpbmZsYXRpb24gZXhjZWVkZWQgdGhlIDIlIHRhcmdldCBpbiBgciBwZXJjZW50X2Fib3ZlX3RhcmdldGAlIG9mIHRoZSB5ZWFycywgaW5kaWNhdGluZyBpbmZsYXRpb25hcnkgcHJlc3N1cmVzLCB3aGlsZSByZW1haW5pbmcgYmVsb3cgdGhlIHRhcmdldCBpbiBgciBwZXJjZW50X2JlbG93X3RhcmdldGAlIG9mIHRoZSBvYnNlcnZhdGlvbnMsIHNpZ25hbGluZyBkZWZsYXRpb25hcnkgdHJlbmRzIG9yIHdlYWtlciBpbmZsYXRpb24uDQoNClRoZSBgciBjcGlfY2Fpcl92YWx1ZV9zMTkxM19lMjAyM2AlIENBSVIgZnJvbSBgciBtaW5feWVhcmAgdG8gYHIgbWF4X3llYXJgIHJlZmxlY3RzIHRoZSBpbmZsdWVuY2Ugb2YgbWFqb3IgaGlzdG9yaWNhbCBldmVudHMgdGhhdCBjYXVzZWQgc2lnbmlmaWNhbnQgaW5mbGF0aW9uLCBpbmNsdWRpbmcgV29ybGQgV2FycywgdGhlIEdyZWF0IERlcHJlc3Npb24sIGFuZCB0aGUgMTk3MHMgb2lsIGNyaXNlcy4gSW4gY29udHJhc3QsIHRoZSBgciBjcGlfY2Fpcl92YWx1ZV9zMTk5MF9lMjAyM2AlIENBSVIsIG1lYXN1cmVkIHNpbmNlIHRoZSAxOTkwIGVuYWN0bWVudCBvZiB0aGUgSW1wbGljaXQgMiUgVGFyZ2V0LCBpcyBub3RhYmx5IGxvd2VyLiBXaXRoIHRoZSBleGNlcHRpb24gb2YgdGhlIDIwMjIgaW5mbGF0aW9uIHJhdGUgb2YgOC4wJSwgcmF0ZXMgYWZ0ZXIgMTk5MCBoYXZlIHN0YXllZCB3aXRoaW4gdGhlIGV4cGVjdGVkIHJhbmdlIG9mIGByIG1pbl9jYWlyX3JhbmdlYCUgdG8gYHIgbWF4X2NhaXJfcmFuZ2VgJS4gDQoNCiMjIyBHcmFwaA0KDQpgYGB7ciBucnQkY3BpX3Jhd19ncmFwaCwgZmlnLndpZHRoPTEwLCBmaWcuaGVpZ2h0PTcsIGV2YWw9VFJVRSwgZWNobz1GQUxTRX0NCg0KIyBMb2FkIG5lY2Vzc2FyeSBsaWJyYXJpZXMNCmxpYnJhcnkoZ2dwbG90MikNCmxpYnJhcnkoZHBseXIpDQoNCmludGVyYWN0aXZlX3N0cihucnQkY3BpX3JhdykNCiMgRW5zdXJlIGAxLVllYXIgQ0FJUmAgaXMgbnVtZXJpYw0KbnJ0JGNwaV9yYXcgPC0gbnJ0JGNwaV9yYXcgJT4lDQogIG11dGF0ZShgMS1ZZWFyIENBSVJgID0gYXMubnVtZXJpYyhnc3ViKCIlIiwgIiIsIGAxLVllYXIgQ0FJUmApKSkNCg0KIyBEZWZpbmUgYG5ydF9sb25nYCBpZiBuZWNlc3NhcnkgKHVzZSBvcmlnaW5hbCBgbnJ0JGNwaV9yYXdgIGZvciBzaW1wbGljaXR5IGhlcmUpDQpucnRfbG9uZyA8LSBucnQkY3BpX3JhdyAgIyBJZiByZXNoYXBpbmcgaXMgdW5uZWNlc3NhcnksIHRoaXMgbWFrZXMgaXQgZXF1aXZhbGVudCB0byBucnQkY3BpX3Jhdw0KDQojIEZpbmQgdGhlIG1pbmltdW0gYW5kIG1heGltdW0geC12YWx1ZSBpbiB5b3VyIGRhdGENCm1heF94IDwtIG1heChhcy5pbnRlZ2VyKG5ydCRjcGlfcmF3JERhdGUpLCBuYS5ybSA9IFRSVUUpDQptaW5feCA8LSBtaW4oYXMuaW50ZWdlcihucnQkY3BpX3JhdyREYXRlKSwgbmEucm0gPSBUUlVFKQ0KaW50ZXJhY3RpdmVfcHJpbnQobWF4X3gpICAjIFRlc3QNCmludGVyYWN0aXZlX3ByaW50KG1pbl94KSAgIyBUZXN0DQoNCiMgRmluZCB0aGUgbWluaW11bSBhbmQgbWF4aW11bSB5ZWFyDQptaW5feWVhciA8LSBtaW4obnJ0JGNwaV9yYXckRGF0ZSwgbmEucm0gPSBUUlVFKQ0KbWF4X3llYXIgPC0gbWF4KG5ydCRjcGlfcmF3JERhdGUsIG5hLnJtID0gVFJVRSkNCmludGVyYWN0aXZlX3ByaW50KG1pbl95ZWFyKQ0KaW50ZXJhY3RpdmVfcHJpbnQobWF4X3llYXIpDQoNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQojIyBQTE9UIEZVTEwgV0lUSE9VVCBMSU1JVFMNCg0KIyBEZWZpbmUgc3RhcnQgYW5kIGVuZCB5ZWFycw0Kc3RhcnRfeWVhciA8LSBhcy5udW1lcmljKG1pbl95ZWFyKQ0KZW5kX3llYXIgPC0gMjAyMw0KeWVhcl9yYW5nZSA8LSBlbmRfeWVhciAtIHN0YXJ0X3llYXIgKyAxICAjIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIHllYXJzDQoNCiMgRGVmaW5lIGJyZWFrcyByb3VuZGVkIGFwcHJvcHJpYXRlbHkNCmxpbWl0c19zdGFydF95ZWFyIDwtIGZsb29yKHN0YXJ0X3llYXIgLyA1KSAqIDUgICMgUm91bmQgZG93biB0byB0aGUgbmVhcmVzdCBtdWx0aXBsZSBvZiA1DQpsaW1pdHNfZW5kX3llYXIgPC0gY2VpbGluZyhlbmRfeWVhciAvIDUpICogNSAgICMgUm91bmQgdXAgdG8gdGhlIG5lYXJlc3QgbXVsdGlwbGUgb2YgNQ0KDQojIENyZWF0ZSBkeW5hbWljIHRpdGxlIGFuZCBjYXB0aW9uDQpkeW5hbWljX3RpdGxlIDwtIHBhc3RlMCgiQW5udWFsIEluZmxhdGlvbiBSYXRlcyBPdmVyICIseWVhcl9yYW5nZSwgIiBZZWFycyAoIiwgc3RhcnRfeWVhciwgIi0iLCBlbmRfeWVhciwgIikiKQ0KZHluYW1pY19jYXB0aW9uIDwtIHBhc3RlMCgiQ1BJIEFubnVhbCBJbmZsYXRpb24gUmF0ZXMgZm9yIEFsbCBVcmJhbiBDb25zdW1lcnMsIERhdGEgUGVyaW9kICgiLCBtaW5feWVhciwgIuKAkyIsIG1heF95ZWFyLCAiKSIpDQoNCiMgQ3JlYXRlIHRoZSBmdWxsLCBub24tZmlsdGVyZWQgeC1heGlzIHBsb3Qgd2l0aCBkeW5hbWljIHggcGxhY2VtZW50IGZvciBhbm5vdGF0aW9ucw0KcDEgPC0gZ2dwbG90KG5ydCRjcGlfcmF3LCBhZXMoeCA9IGFzLmludGVnZXIoRGF0ZSksIHkgPSBgMS1ZZWFyIENBSVJgKSkgKw0KICANCiAgIyBBZGQgc2hhZGVkIGFyZWFzIGZvciBiYWNrZ3JvdW5kIGVmZmVjdA0KICBnZW9tX3JlY3QoYWVzKHhtaW4gPSAtSW5mLCB4bWF4ID0gSW5mLCB5bWluID0gbWluX2NhaXJfcmFuZ2UsIHltYXggPSBtYXhfY2Fpcl9yYW5nZSksIGZpbGwgPSAibGlnaHRncmVlbiIsIGFscGhhID0gMC4wMTApICsNCiAgZ2VvbV9yZWN0KGFlcyh4bWluID0gLUluZiwgeG1heCA9IEluZiwgeW1pbiA9IC1JbmYsIHltYXggPSBtaW5fY2Fpcl9yYW5nZSksIGZpbGwgPSAibGlnaHRjb3JhbCIsIGFscGhhID0gMC4wMTApICsNCiAgZ2VvbV9yZWN0KGFlcyh4bWluID0gLUluZiwgeG1heCA9IEluZiwgeW1pbiA9IG1heF9jYWlyX3JhbmdlLCB5bWF4ID0gSW5mKSwgZmlsbCA9ICJsaWdodGNvcmFsIiwgYWxwaGEgPSAwLjAxMCkgKw0KICANCiAgIyBQbG90IGxpbmVzLCBwb2ludHMsIGFuZCBhbm5vdGF0aW9ucyBvbiB0b3Agb2Ygc2hhZGVkIGFyZWFzDQogIGdlb21fbGluZShjb2xvciA9ICIjNEIwMDgyIiwgc2l6ZSA9IDEuMCkgKyAgICAgICAjIERhcmsgcHVycGxlIGxpbmUgDQogIGdlb21fcG9pbnQoY29sb3IgPSAiIzRCMDA4MiIsIHNpemUgPSAxLjUpICsgICAgICAgICMgRGFyayBwdXJwbGUgcG9pbnRzIA0KICANCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gdGFyZ2V0X3ZhbHVlLCBjb2xvciA9ICJkYXJrYmx1ZSIsIGxpbmV0eXBlID0gImRhc2hlZCIpICsNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gbWluX2NhaXJfcmFuZ2UsIGNvbG9yID0gImRhcmtncmVlbiIsIGxpbmV0eXBlID0gInNvbGlkIikgKw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSBtYXhfY2Fpcl9yYW5nZSwgY29sb3IgPSAiZGFya2dyZWVuIiwgbGluZXR5cGUgPSAic29saWQiKSArDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IGNhaXJfdmFsdWUsIGNvbG9yID0gImRhcmtyZWQiLCBsaW5ldHlwZSA9ICJkYXNoZWQiKSArDQogIA0KICAjIER5bmFtaWMgcmlnaHQtYWxpZ25lZCBwbGFjZW1lbnQgZm9yIGFubm90YXRpb25zDQogIGFubm90YXRlKCJ0ZXh0IiwgeCA9IEluZiwgeSA9IHRhcmdldF92YWx1ZSwgbGFiZWwgPSAiVGFyZ2V0IiwgDQogICAgICAgICAgIGhqdXN0ID0gMSwgdmp1c3QgPSAtMC41LCBjb2xvciA9ICJkYXJrYmx1ZSIsIHNpemUgPSA0KSArDQogIGFubm90YXRlKCJ0ZXh0IiwgeCA9IEluZiwgeSA9IG1pbl9jYWlyX3JhbmdlLCBsYWJlbCA9ICJNaW4gQ0FJUiIsIA0KICAgICAgICAgICBoanVzdCA9IDEsIHZqdXN0ID0gLTAuNSwgY29sb3IgPSAiZGFya2dyZWVuIiwgc2l6ZSA9IDQpICsNCiAgYW5ub3RhdGUoInRleHQiLCB4ID0gSW5mLCB5ID0gbWF4X2NhaXJfcmFuZ2UsIGxhYmVsID0gIk1heCBDQUlSIiwgDQogICAgICAgICAgIGhqdXN0ID0gMSwgdmp1c3QgPSAtMC41LCBjb2xvciA9ICJkYXJrZ3JlZW4iLCBzaXplID0gNCkgKw0KICBhbm5vdGF0ZSgidGV4dCIsIHggPSBJbmYsIHkgPSBjYWlyX3ZhbHVlLCBsYWJlbCA9ICJDQUlSIiwgDQogICAgICAgICAgIGhqdXN0ID0gMSwgdmp1c3QgPSAtMC41LCBjb2xvciA9ICJkYXJrcmVkIiwgc2l6ZSA9IDQpICsNCiAgDQogIGxhYnMoDQogICAgdGl0bGUgPSBkeW5hbWljX3RpdGxlLA0KICAgIHggPSAiWWVhciIsDQogICAgeSA9ICJJbmZsYXRpb24gUmF0ZSAoJSkiLA0KICAgIGNhcHRpb24gPSBkeW5hbWljX2NhcHRpb24NCiAgKSArDQogIA0KICBzY2FsZV94X2NvbnRpbnVvdXMoDQogICAgbGltaXRzID0gYyhzdGFydF95ZWFyLCBlbmRfeWVhciksICMgUmVzdHJpY3RzIHgtYXhpcyBkYXRhIA0KICAgIGJyZWFrcyA9IHNlcShsaW1pdHNfc3RhcnRfeWVhciwgbGltaXRzX2VuZF95ZWFyLCA1KSAjIFNldHMgTWFqb3IgeC1heGlzICANCiAgKSArICAjIFJlc3RyaWN0ICYgU2V0IE1ham9yIHgtYXhpcyBsaW5lcyANCg0KICB0aGVtZV9taW5pbWFsKCkgKw0KICB0aGVtZSgNCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41LCBzaXplID0gMjApLCAgICAgICAgICMgTGFyZ2VyIHRpdGxlIGZvbnQNCiAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0KSwgICAgICAgICAgICAgICAgICAgICMgTGFyZ2VyIHgtYXhpcyBsYWJlbCBmb250DQogICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCksICAgICAgICAgICAgICAgICAgICAjIExhcmdlciB5LWF4aXMgbGFiZWwgZm9udA0KICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSwgc2l6ZSA9IDE0KSwgICMgTGFyZ2VyIHgtYXhpcyB0ZXh0DQogICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0KSwgICAgICAgICAgICAgICAgICAgICAjIExhcmdlciB5LWF4aXMgdGV4dA0KICAgIHBhbmVsLmdyaWQubWFqb3IgPSBlbGVtZW50X2xpbmUobGluZXR5cGUgPSAiZG90dGVkIiwgY29sb3IgPSAiYmxhY2siKSwgICAgICAgICAjIE1ham9yIGdyaWQgbGluZXMNCiAgICBwYW5lbC5ncmlkLm1pbm9yLnggPSBlbGVtZW50X2JsYW5rKCksICMgZWxlbWVudF9saW5lKGNvbG9yID0gImdyZXk4MCIpICAjIE1pbm9yIHggZ3JpZCBsaW5lcyBmb3IgZWFjaCB5ZWFyDQogICAgIyBwYW5lbC5ib3JkZXIgPSBlbGVtZW50X3JlY3QoY29sb3IgPSAiZGFya2dyZXkiLCBmaWxsID0gTkEsIHNpemUgPSAxLjApICAjIERhcmsgYm9yZGVyIGFyb3VuZCB0aGUgcGxvdA0KICAgIGF4aXMudGlja3MubGVuZ3RoID0gdW5pdCgtMC4yNSwgImNtIiksICAgICAgICAgICAgICAgICAgICAgICMgSW5jcmVhc2UgdGljayBsZW5ndGgNCiAgICBheGlzLnRpY2tzID0gZWxlbWVudF9saW5lKGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDAuNTApLCAjIERhcmtlciB0aWNrcw0KICAgIGF4aXMubGluZS54ID0gZWxlbWVudF9saW5lKGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDAuNzUpLCAgIyBEYXJrIGJvdHRvbSBib3JkZXINCiAgICBheGlzLmxpbmUueSA9IGVsZW1lbnRfbGluZShjb2xvciA9ICJibGFjayIsIHNpemUgPSAwLjc1KSAgICMgRGFyayBsZWZ0IGJvcmRlcg0KICApDQoNCiMjIFBSSU5UIFcvIFktQVhJUyBBTk5PVEFUSU9OUw0KIyBEZWZpbmUgdGhlIHktcG9zaXRpb24gZm9yIGFubm90YXRpb25zIHNsaWdodGx5IGJlbG93IHRoZSBtaW5pbXVtIHktYXhpcyBsaW1pdA0KYW5ub3RhdGlvbl95X3Bvc2l0aW9uIDwtIG1pbihucnQkY3BpX3JhdyRgMS1ZZWFyIENBSVJgLCBuYS5ybSA9IFRSVUUpIC0gMQ0KDQojIERlZmluZSBtaWxlc3RvbmUgeWVhcnMNCm1pbGVzdG9uZV95ZWFycyA8LSBjKDE5MTMsIDE5NzksIDE5OTAsIDIwMTIpDQoNCiMgQWRkIHZlcnRpY2FsIGxpbmVzIGF0IG1pbGVzdG9uZSB5ZWFycw0KcDEgKw0KICAjIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IG1pbGVzdG9uZV95ZWFycywgY29sb3IgPSAiZGFya2dyZXkiLCBsaW5ldHlwZSA9ICJkYXNoZWQiLCBzaXplID0gMC41KSArDQogIGFubm90YXRlKCJ0ZXh0IiwgeCA9IDE5MTMsIHkgPSBhbm5vdGF0aW9uX3lfcG9zaXRpb24sIGxhYmVsID0gIjE5MTMgTm8gVGFyZ2V0IiwgDQogICAgICAgICAgIGhqdXN0ID0gMC4xMCwgdmp1c3QgPSAwLjUwLCBhbmdsZSA9IDkwLCBjb2xvciA9ICJibGFjayIsIHNpemUgPSAzKSArDQogIGFubm90YXRlKCJ0ZXh0IiwgeCA9IDE5MTgsIHkgPSBhbm5vdGF0aW9uX3lfcG9zaXRpb24sIGxhYmVsID0gIjE5MTggUG9zdC1Xb3JsZCBXYXIgSSIsIA0KICAgICAgICAgICBoanVzdCA9IDAuMTAsIHZqdXN0ID0gMC41MCwgYW5nbGUgPSA5MCwgY29sb3IgPSAiYmxhY2siLCBzaXplID0gMykgKw0KICBhbm5vdGF0ZSgidGV4dCIsIHggPSAxOTMyLCB5ID0gYW5ub3RhdGlvbl95X3Bvc2l0aW9uLCBsYWJlbCA9ICIxOTMyXG5HcmVhdCBEZXByZXNzaW9uIiwgDQogICAgICAgICAgIGhqdXN0ID0gMC4xMCwgdmp1c3QgPSAwLjUwLCBhbmdsZSA9IDkwLCBjb2xvciA9ICJibGFjayIsIHNpemUgPSAzKSArDQogIGFubm90YXRlKCJ0ZXh0IiwgeCA9IDE5MzksIHkgPSBhbm5vdGF0aW9uX3lfcG9zaXRpb24sIGxhYmVsID0gIjE5MzkgV29ybGQgV2FyIElJIiwgDQogICAgICAgICAgIGhqdXN0ID0gMC4xMCwgdmp1c3QgPSAwLjUwLCBhbmdsZSA9IDkwLCBjb2xvciA9ICJibGFjayIsIHNpemUgPSAzKSArDQogIGFubm90YXRlKCJ0ZXh0IiwgeCA9IDE5NzMsIHkgPSBhbm5vdGF0aW9uX3lfcG9zaXRpb24sIGxhYmVsID0gIjE5NzBzIE9pbCBDcmlzZXMiLCANCiAgICAgICAgICAgaGp1c3QgPSAwLjEwLCB2anVzdCA9IDAuNTAsIGFuZ2xlID0gOTAsIGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDMpICsNCiAgYW5ub3RhdGUoInRleHQiLCB4ID0gMTk3OSwgeSA9IGFubm90YXRpb25feV9wb3NpdGlvbiwgbGFiZWwgPSAiMTk3OSBJbXBsaWNpdCBMb3cgVGFyZ2V0IiwgDQogICAgICAgICAgIGhqdXN0ID0gMC4xMCwgdmp1c3QgPSAwLjUwLCBhbmdsZSA9IDkwLCBjb2xvciA9ICJibGFjayIsIHNpemUgPSAzKSArDQogIGFubm90YXRlKCJ0ZXh0IiwgeCA9IDE5ODEsIHkgPSBhbm5vdGF0aW9uX3lfcG9zaXRpb24sIGxhYmVsID0gIjE5ODBzIFJlY2Vzc2lvbiIsIA0KICAgICAgICAgICBoanVzdCA9IDAuMTAsIHZqdXN0ID0gMC41MCwgYW5nbGUgPSA5MCwgY29sb3IgPSAiYmxhY2siLCBzaXplID0gMykgKw0KICBhbm5vdGF0ZSgidGV4dCIsIHggPSAxOTkwLCB5ID0gYW5ub3RhdGlvbl95X3Bvc2l0aW9uLCBsYWJlbCA9ICIxOTkwIEltcGxpY2l0IDIlIFRhcmdldCIsIA0KICAgICAgICAgICBoanVzdCA9IDAuMTAsIHZqdXN0ID0gMC41MCwgYW5nbGUgPSA5MCwgY29sb3IgPSAiYmxhY2siLCBzaXplID0gMykgKw0KICBhbm5vdGF0ZSgidGV4dCIsIHggPSAyMDEyLCB5ID0gYW5ub3RhdGlvbl95X3Bvc2l0aW9uLCBsYWJlbCA9ICIyMDEyIEZvcm1hbCAyJSBUYXJnZXQiLCANCiAgICAgICAgICAgaGp1c3QgPSAwLjEwLCB2anVzdCA9IDAuNTAsIGFuZ2xlID0gOTAsIGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDMpICsgDQogIGFubm90YXRlKCJ0ZXh0IiwgeCA9IDIwMjAsIHkgPSBhbm5vdGF0aW9uX3lfcG9zaXRpb24sIGxhYmVsID0gIjIwMjAgQ09WSUQtMTlcblBhbmRlbWljIiwgDQogICAgICAgICAgIGhqdXN0ID0gMC4xMCwgdmp1c3QgPSAwLjUwLCBhbmdsZSA9IDkwLCBjb2xvciA9ICJibGFjayIsIHNpemUgPSAzKSANCiAgDQoNCmBgYA0KDQpPdmVyIHRoZSBwYXN0IGNlbnR1cnksIHRoZSBVLlMuIENvbnN1bWVyIFByaWNlIEluZGV4IChDUEkpIGhhcyBleGhpYml0ZWQgc2lnbmlmaWNhbnQgZmx1Y3R1YXRpb25zLCB3aXRoIG5vdGFibGUgcGVha3MgZHVyaW5nIHRoZSBwb3N0LVdvcmxkIFdhciBJIGVyYSBhbmQgdGhlIDE5NzBzLiBUaGUgVS5TLiBDb25zdW1lciBQcmljZSBJbmRleCAoQ1BJKSBoYXMgZXhwZXJpZW5jZWQgc2lnbmlmaWNhbnQgcGVha3MgZHVlIHRvIHZhcmlvdXMgbWFqb3IgZXZlbnRzOg0KDQotIFdvcmxkIFdhciBJICgxOTE04oCTMTkxOCk6IFRoZSBDUEkgc3VyZ2VkIHRvIGFwcHJveGltYXRlbHkgMTglIGluIDE5MTgsIGRyaXZlbiBieSBpbmNyZWFzZWQgZ292ZXJubWVudCBzcGVuZGluZyBhbmQgc3VwcGx5IGNvbnN0cmFpbnRzIGR1cmluZyB0aGUgd2FyLg0KLSBXb3JsZCBXYXIgSUkgKDE5MznigJMxOTQ1KTogSW5mbGF0aW9uIHJvc2UgZHVlIHRvIGhlaWdodGVuZWQgZGVtYW5kIGFuZCBwcm9kdWN0aW9uIGxpbWl0YXRpb25zLCBsZWFkaW5nIHRvIHByaWNlIGNvbnRyb2xzIGFuZCByYXRpb25pbmcgdG8gbWFuYWdlIHRoZSBlY29ub215Lg0KLSAxOTcwcyBPaWwgQ3Jpc2VzOiBUaGUgMTk3MyBhbmQgMTk3OSBvaWwgZW1iYXJnb2VzIGxlZCB0byBlbmVyZ3kgc2hvcnRhZ2VzIGFuZCBza3lyb2NrZXRpbmcgb2lsIHByaWNlcywgY2F1c2luZyBpbmZsYXRpb24gdG8gcGVhayBhcm91bmQgMTQlIGluIDE5ODAuDQotIEVhcmx5IDE5ODBzIFJlY2Vzc2lvbjogSW4gcmVzcG9uc2UgdG8gaGlnaCBpbmZsYXRpb24sIHRoZSBGZWRlcmFsIFJlc2VydmUgaW5jcmVhc2VkIGludGVyZXN0IHJhdGVzLCBsZWFkaW5nIHRvIGEgcmVjZXNzaW9uIGJ1dCBldmVudHVhbGx5IHN0YWJpbGl6aW5nIHByaWNlcy4NCi0gQ09WSUQtMTkgUGFuZGVtaWMgKDIwMjDigJMyMDIxKTogU3VwcGx5IGNoYWluIGRpc3J1cHRpb25zIGFuZCBlY29ub21pYyBzdGltdWx1cyBtZWFzdXJlcyBjb250cmlidXRlZCB0byBhIHNpZ25pZmljYW50IHJpc2UgaW4gaW5mbGF0aW9uLCB3aXRoIHRoZSBDUEkgcmVhY2hpbmcgbGV2ZWxzIG5vdCBzZWVuIGluIGRlY2FkZXMuDQoNCkhvd2V2ZXIsIGluIHJlY2VudCBkZWNhZGVzLCB0aGVzZSBpbmZsYXRpb25hcnkgcGVha3MgaGF2ZSBiZWNvbWUgbGVzcyBwcm9ub3VuY2VkLCBpbmRpY2F0aW5nIGEgdHJlbmQgdG93YXJkIG1vcmUgc3RhYmxlIGluZmxhdGlvbiByYXRlcywgc2hvd2luZyBhIG5hcnJvd2luZyBvZiBDUEkgdm9sYXRpbGl0eS4gDQoNCiMjIENQSSBDQUlSDQoNCiMjIyBEYXRhDQoNCllvdSd2ZSBwcm9iYWJseSBzZWVuIG9yIGhlYXJkIHRoZSBwaHJhc2UsICJJZiB5b3UgaGFkIGludmVzdGVkICQxLDAwMCBpbiBbQ29tcGFueS9TdG9jayBOYW1lXSBiYWNrIGluIFtZZWFyXSwgeW91ciBpbnZlc3RtZW50IHdvdWxkIGJlIHdvcnRoIFtDdXJyZW50IFZhbHVlXSB0b2RheS4iIE9yIHBlcmhhcHMgeW91J3ZlIHRob3VnaHQgdG8geW91cnNlbGYsICJJZiBJIGhhZC4uLiBJIHdvdWxkIGhhdmUuLi4iIFRoaXMgaXMgdGhlIHJlc3VsdCBvZiBjdW11bGF0aXZlIGdyb3d0aCBjYXB0dXJlZCBpbiBhIHNuYXBzaG90LiBUaGUgQ3VtdWxhdGl2ZSBJbmZsYXRpb24gUmF0ZSAoQ0lSKSByZXByZXNlbnRzIHRoZSB0b3RhbCBwZXJjZW50YWdlIGluY3JlYXNlIGluIHByaWNlcyBvdmVyIHRpbWUgaG9yaXpvbnMgb2YgNSwgMTAsIDIwLCBhbmQgMzAgeWVhcnMsIHJlZmxlY3RpbmcgdGhlIGxvbmctdGVybSBjdW11bGF0aXZlIGltcGFjdCBvZiBpbmZsYXRpb24gKGUuZy4sIGEgMzAteWVhciBDSVIgb2YgMTEwLjc2JSBpbiAyMDIzKS4gQmFjay10ZXN0aW5nIHRoZSBkYXRhIHRhYmxlIHdpdGggdGhlIENQSSBJbmZsYXRpb24gQ2FsY3VsYXRvciAoaHR0cHM6Ly93d3cuYmxzLmdvdi9kYXRhL2luZmxhdGlvbl9jYWxjdWxhdG9yLmh0bSkgZ2l2ZXMgYSArLy0gMSUgbWFyZ2luIG9mIGVycm9yLg0KDQpJbiBjb250cmFzdCwgdGhlIENvbXBvdW5kIEF2ZXJhZ2UgSW5mbGF0aW9uIFJhdGUgKENBSVIpIHJlcHJlc2VudHMgdGhlIGF2ZXJhZ2UgYW5udWFsaXplZCBpbmZsYXRpb24gcmF0ZSBvdmVyIHRoZSBzYW1lIHBlcmlvZHMsIHNtb290aGluZyBzaG9ydC10ZXJtIGZsdWN0dWF0aW9ucyAoZS5nLiwgYSA1LXllYXIgQ0FJUiBvZiAzLjkzJSBpbiAyMDIzKS4gQ29tcG91bmQgYXZlcmFnZXMgYWxsb3cgdXMgdG8gc3R1ZHkgdGhlIGFubnVhbGl6ZWQgcmF0ZSByZXF1aXJlZCB0byBhY2hpZXZlIHRoZSBzYW1lIHRvdGFsIGN1bXVsYXRpdmUgZ3Jvd3RoLCBwcm92aWRpbmcgYSBiYXNpcyBmb3IgbWFraW5nIGZ1dHVyZSBwcm9qZWN0aW9ucyBncm91bmRlZCBpbiBwYXN0IHBlcmZvcm1hbmNlLg0KDQpgYGB7ciBucnQkY3BpX3Jhd19pciwgZXZhbD1UUlVFLCBlY2hvPUZBTFNFfQ0KDQpsaWJyYXJ5KGRwbHlyKQ0KbGlicmFyeShsdWJyaWRhdGUpICAjIEZvciBkYXRlIG1hbmlwdWxhdGlvbg0KDQojIFVwZGF0ZSBkYXRhIGZyYW1lIHdpdGggcHJvcGVyIGRhdGUgYW5kIHBlcmNlbnRhZ2UgaGFuZGxpbmcNCm5ydCRjcGlfcmF3X2lyIDwtIG5ydCRjcGlfcmF3X2lyICU+JQ0KICBtdXRhdGUoDQogICAgRGF0ZSA9IGZvcm1hdChhcy5EYXRlKGFzLmNoYXJhY3RlcihEYXRlKSwgZm9ybWF0ID0gIiVZIiksICIlWSIpLCAgIyBDb252ZXJ0IHRvICJZWVlZIiBjaGFyYWN0ZXIgZm9ybWF0DQogICAgYWNyb3NzKDI6MTAsIH4gaWZlbHNlKA0KICAgICAgZ3JlcGwoIiUiLCAuKSwgICMgQ2hlY2sgaWYgdGhlIHZhbHVlIGFscmVhZHkgY29udGFpbnMgYSAiJSIgc3ltYm9sDQogICAgICAuLCAgIyBLZWVwIGFzLWlzIGlmIGl0J3MgYWxyZWFkeSBhIHBlcmNlbnRhZ2UNCiAgICAgIHBlcmNlbnQoYXMubnVtZXJpYyguKSwgYWNjdXJhY3kgPSAwLjAxKSAgIyBDb252ZXJ0IHRvIHBlcmNlbnRhZ2UgaWYgbm90DQogICAgKSkNCiAgKSAlPiUNCiAgYXJyYW5nZShkZXNjKERhdGUpKSAgIyBTb3J0IGJ5IERhdGUgZnJvbSBuZXdlc3QgdG8gb2xkZXN0DQoNCiMgQ3JlYXRlIG5ydCRjcGlfcmF3X2lyOiBDSVINCm5ydCRjcGlfcmF3X2NpciA8LSBucnQkY3BpX3Jhd19pciAlPiUNCiAgc2VsZWN0KGBEYXRlYCwgYDEtWWVhciBDQUlSYCwgY29udGFpbnMgKCJDSVIiKSkNCg0KIyBDcmVhdGUgbnJ0JGNwaV9yYXdfaXI6IENBSVINCm5ydCRjcGlfcmF3X2NhaXIgPC0gbnJ0JGNwaV9yYXdfaXIgJT4lDQogIHNlbGVjdChgRGF0ZWAsIGAxLVllYXIgQ0FJUmAsIGNvbnRhaW5zICgiQ0FJUiIpKQ0KDQojIERpc3BsYXkgYm90aCB0YWJsZXMgZm9yIGNvbmZpcm1hdGlvbg0KaW50ZXJhY3RpdmVfcHJpbnQobnJ0JGNwaV9yYXdfY2lyKQ0KaW50ZXJhY3RpdmVfcHJpbnQobnJ0JGNwaV9yYXdfY2FpcikNCg0KIyBPcHRpb25hbDogUHJpbnQgdGFibGUgc3VtbWFyaWVzDQppbnRlcmFjdGl2ZV9zdHIobnJ0JGNwaV9yYXdfY2lyKQ0KaW50ZXJhY3RpdmVfc3RyKG5ydCRjcGlfcmF3X2NhaXIpDQoNCiMgRGlzcGxheSBjYXB0aW9ucyBmb3IgZWFjaCB0YWJsZQ0KY2F0KCJcblxuIyMjIyBDdW11bGF0aXZlIEluZmxhdGlvbiBSYXRlcyAoIiwgbWluX3llYXIsICItIiwgbWF4X3llYXIsICIpXG4iLCBzZXAgPSAiIikNCmZvcm1hdF9lcXVhbF93aWR0aChucnQkY3BpX3Jhd19jaXIpDQoNCmNhdCgiXG5cbiMjIyMgQ29tcG91bmQgQXZlcmFnZSBJbmZsYXRpb24gUmF0ZXMgKCIsIG1pbl95ZWFyLCAiLSIsIG1heF95ZWFyLCAiKVxuIiwgc2VwID0gIiIpDQpmb3JtYXRfZXF1YWxfd2lkdGgobnJ0JGNwaV9yYXdfY2FpcikNCg0KIyBWaWV3KG5ydCRjcGlfcmF3X2NhaXIpDQojIGNvbG5hbWVzKG5ydCRjcGlfcmF3X2NhaXIpDQppbnRlcmFjdGl2ZV9zdHIobnJ0JGNwaV9yYXdfY2FpcikNCg0KDQpgYGANCg0KVmFsdWVzICJOQSIgZXhpc3RzIGZvciB5ZWFycyB3aGVyZSB0aGVyZSBpcyBpbnN1ZmZpY2llbnQgYW1vdW50IG9mIGRhdGEuIEZvciBleGFtcGxlLCBzaW5jZSB0aGUgZGF0YXNldCBzdGFydHMgaW4gMTkxMywgdGhlcmUgaXMgbm90IGVub3VnaCB5ZWFycyBpbiAxOTMwIHRvIGNhbGN1bGF0ZSBmb3IgYSAzMC1ZZWFyIENBSVIuIA0KDQojIyMgU3VtbWFyeQ0KDQpgYGB7ciBjcGlfcmF3X2NhaXJfc3VtbWFyeSwgZXZhbD1UUlVFLCBlY2hvPUZBTFNFfQ0KDQojIExvYWQgbmVjZXNzYXJ5IGxpYnJhcmllcw0KbGlicmFyeShkcGx5cikNCmxpYnJhcnkodGliYmxlKQ0KbGlicmFyeShrbml0cikNCmxpYnJhcnkoa2FibGVFeHRyYSkNCmxpYnJhcnkoZTEwNzEpICAjIGZvciBza2V3bmVzcyBhbmQga3VydG9zaXMNCg0KIyBEZWZpbmUgYSBoZWxwZXIgZnVuY3Rpb24gdG8gcmVtb3ZlICIlIiBhbmQgY29udmVydCB0byBudW1lcmljDQpjbGVhbl9wZXJjZW50YWdlIDwtIGZ1bmN0aW9uKGNvbHVtbikgew0KICBhcy5udW1lcmljKGdzdWIoIiUiLCAiIiwgY29sdW1uKSkNCn0NCg0KIyBGaW5kIHRoZSBtaW5pbXVtIGFuZCBtYXhpbXVtIHllYXINCm1pbl95ZWFyIDwtIG1pbihucnQkY3BpX3JhdyREYXRlLCBuYS5ybSA9IFRSVUUpDQptYXhfeWVhciA8LSBtYXgobnJ0JGNwaV9yYXckRGF0ZSwgbmEucm0gPSBUUlVFKQ0KDQojIENsZWFuIGFuZCBjb252ZXJ0IENBSVIgY29sdW1ucyBhbmQgMS1ZZWFyIENBSVIgdG8gbnVtZXJpYw0KbnJ0JGNwaV9yYXdfY2FpciA8LSBucnQkY3BpX3Jhd19jYWlyICU+JQ0KICBtdXRhdGUoDQogICAgYDEtWWVhciBDQUlSYCA9IGNsZWFuX3BlcmNlbnRhZ2UoYDEtWWVhciBDQUlSYCksDQogICAgYDUtWWVhciBDQUlSYCA9IGNsZWFuX3BlcmNlbnRhZ2UoYDUtWWVhciBDQUlSYCksDQogICAgYDEwLVllYXIgQ0FJUmAgPSBjbGVhbl9wZXJjZW50YWdlKGAxMC1ZZWFyIENBSVJgKSwNCiAgICBgMjAtWWVhciBDQUlSYCA9IGNsZWFuX3BlcmNlbnRhZ2UoYDIwLVllYXIgQ0FJUmApLA0KICAgIGAzMC1ZZWFyIENBSVJgID0gY2xlYW5fcGVyY2VudGFnZShgMzAtWWVhciBDQUlSYCkNCiAgKQ0KDQojIERlZmluZSBzdGF0aXN0aWMgbmFtZXMgZXhwbGljaXRseQ0Kc3RhdGlzdGljX25hbWVzIDwtIGMoDQogICJDb3VudCBvZiBPYnNlcnZhdGlvbnMiLA0KICAiTWVhbiIsDQogICJNZWRpYW4iLA0KICAiU3RhbmRhcmQgRGV2aWF0aW9uIChWb2xhdGlsaXR5KSIsDQogICJNaW4gQ0FJUiBSYW5nZSAoQ0FJUiAtIFNEKSIsDQogICJNYXggQ0FJUiBSYW5nZSAoQ0FJUiArIFNEKSIsDQogICJNaW5pbXVtIiwNCiAgIk1heGltdW0iLA0KICAiQWJvdmUgMi4wIFRhcmdldCIsDQogICJCZWxvdyAyLjAgVGFyZ2V0Ig0KKQ0KDQoNCiMjIENBTENVTEFUSU9OUw0KIyBEZWZpbmUgYSBmdW5jdGlvbiB0byBjYWxjdWxhdGUgc3VtbWFyeSBzdGF0aXN0aWNzIGFuZCBoYW5kbGUgY2FzZXMgd2l0aCBpbnN1ZmZpY2llbnQgZGF0YQ0KY2FsY19zdGF0cyA8LSBmdW5jdGlvbihkYXRhKSB7DQogIGlmIChzdW0oIWlzLm5hKGRhdGEpKSA8IDIpIHJldHVybihyZXAoTkEsIGxlbmd0aChzdGF0aXN0aWNfbmFtZXMpKSkgICMgUmV0dXJuIE5BcyBpZiBpbnN1ZmZpY2llbnQgZGF0YQ0KDQogIGNvdW50X29ic2VydmF0aW9ucyA8LSBzdW0oIWlzLm5hKGRhdGEpKQ0KICBtZWFuX3ZhbHVlIDwtIHJvdW5kKG1lYW4oZGF0YSwgbmEucm0gPSBUUlVFKSwgMikNCiAgbWVkaWFuX3ZhbHVlIDwtIHJvdW5kKG1lZGlhbihkYXRhLCBuYS5ybSA9IFRSVUUpLCAyKQ0KICBzZF92YWx1ZSA8LSByb3VuZChzZChkYXRhLCBuYS5ybSA9IFRSVUUpLCAyKQ0KICBtaW5fY2Fpcl9yYW5nZSA8LSByb3VuZChjYWlyX3ZhbHVlIC0gc2RfdmFsdWUsIDIpDQogIG1heF9jYWlyX3JhbmdlIDwtIHJvdW5kKGNhaXJfdmFsdWUgKyBzZF92YWx1ZSwgMikNCiAgbWluX3ZhbHVlIDwtIHJvdW5kKG1pbihkYXRhLCBuYS5ybSA9IFRSVUUpLCAyKQ0KICBtYXhfdmFsdWUgPC0gcm91bmQobWF4KGRhdGEsIG5hLnJtID0gVFJVRSksIDIpDQogIA0KICAjIFRhcmdldCBSYXRlIEFuYWx5c2lzDQogIHRhcmdldF92YWx1ZSA8LSAyICAjIFNldCB0aGUgdGFyZ2V0IHJhdGUsIGUuZy4sIDIlDQogIHllYXJzX2Fib3ZlX3RhcmdldCA8LSBzdW0oZGF0YSA+IHRhcmdldF92YWx1ZSwgbmEucm0gPSBUUlVFKQ0KICB5ZWFyc19iZWxvd190YXJnZXQgPC0gc3VtKGRhdGEgPCB0YXJnZXRfdmFsdWUsIG5hLnJtID0gVFJVRSkNCiAgcGVyY2VudF9hYm92ZV90YXJnZXQgPC0gcm91bmQoKHllYXJzX2Fib3ZlX3RhcmdldCAvIGNvdW50X29ic2VydmF0aW9ucykgKiAxMDAsIDIpDQogIHBlcmNlbnRfYmVsb3dfdGFyZ2V0IDwtIHJvdW5kKCh5ZWFyc19iZWxvd190YXJnZXQgLyBjb3VudF9vYnNlcnZhdGlvbnMpICogMTAwLCAyKQ0KDQogIGMoDQogICAgY291bnRfb2JzZXJ2YXRpb25zLCANCiAgICBwYXN0ZTAobWVhbl92YWx1ZSwgIiUiKSwNCiAgICBwYXN0ZTAobWVkaWFuX3ZhbHVlLCAiJSIpLA0KICAgIHBhc3RlMChzZF92YWx1ZSwgIiUiKSwNCiAgICBwYXN0ZTAobWluX2NhaXJfcmFuZ2UsICIlIiksDQogICAgcGFzdGUwKG1heF9jYWlyX3JhbmdlLCAiJSIpLA0KICAgIHBhc3RlMChtaW5fdmFsdWUsICIlIiksDQogICAgcGFzdGUwKG1heF92YWx1ZSwgIiUiKSwNCiAgICBwYXN0ZTAocGVyY2VudF9hYm92ZV90YXJnZXQsICIlIiksDQogICAgcGFzdGUwKHBlcmNlbnRfYmVsb3dfdGFyZ2V0LCAiJSIpDQogICkNCn0NCg0KIyBTcGVjaWZ5IENBSVIgY29sdW1ucyBmb3IgY2FsY3VsYXRpb24sIGluY2x1ZGluZyAiMS1ZZWFyIENBSVIiDQpjYWlyX2NvbHVtbnMgPC0gYygiMS1ZZWFyIENBSVIiLCAiNS1ZZWFyIENBSVIiLCAiMTAtWWVhciBDQUlSIiwgIjIwLVllYXIgQ0FJUiIsICIzMC1ZZWFyIENBSVIiKQ0KZXhpc3RpbmdfY2Fpcl9jb2x1bW5zIDwtIGludGVyc2VjdChjYWlyX2NvbHVtbnMsIG5hbWVzKG5ydCRjcGlfcmF3X2NhaXIpKQ0KDQojIEFwcGx5IHRoZSBjYWxjX3N0YXRzIGZ1bmN0aW9uIHRvIGVhY2ggQ0FJUiBjb2x1bW4gYW5kIGNvbXBpbGUgcmVzdWx0cw0KY2Fpcl9zdGF0c19saXN0IDwtIGxhcHBseShucnQkY3BpX3Jhd19jYWlyW2V4aXN0aW5nX2NhaXJfY29sdW1uc10sIGNhbGNfc3RhdHMpDQoNCiMgQ29tYmluZSByZXN1bHRzIGludG8gYSBkYXRhIGZyYW1lIGFuZCBzZXQgcm93IG5hbWVzIGFzIFN0YXRpc3RpYyBuYW1lcw0KY3BpX3Jhd19jYWlyX3N1bW1hcnkgPC0gYXMuZGF0YS5mcmFtZShkby5jYWxsKGNiaW5kLCBjYWlyX3N0YXRzX2xpc3QpKQ0Kcm93bmFtZXMoY3BpX3Jhd19jYWlyX3N1bW1hcnkpIDwtIHN0YXRpc3RpY19uYW1lcyAgIyBBc3NpZ24gdGhlIHJvdyBuYW1lcw0KDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KIyMgU0FWRSBWQUxVRVMgRk9SIElOLUxJTkUgQ09ERQ0KDQojIERlZmluZSB0aGUgbWFwcGluZyBvZiByb3cgbmFtZXMgdG8gdmFyaWFibGUgbmFtZXMNCnJvd190b192YXJfbmFtZSA8LSBjKA0KICAiQ291bnQgb2YgT2JzZXJ2YXRpb25zIiA9ICJjb3VudF9vYnNlcnZhdGlvbnMiLA0KICAiTWVhbiIgPSAibWVhbl92YWx1ZSIsDQogICJNZWRpYW4iID0gIm1lZGlhbl92YWx1ZSIsDQogICJTdGFuZGFyZCBEZXZpYXRpb24gKFZvbGF0aWxpdHkpIiA9ICJzZF92YWx1ZSIsDQogICJNaW4gQ0FJUiBSYW5nZSAoQ0FJUiAtIFNEKSIgPSAibWluX2NhaXJfcmFuZ2UiLA0KICAiTWF4IENBSVIgUmFuZ2UgKENBSVIgKyBTRCkiID0gIm1heF9jYWlyX3JhbmdlIiwNCiAgIk1pbmltdW0iID0gIm1pbl92YWx1ZSIsDQogICJNYXhpbXVtIiA9ICJtYXhfdmFsdWUiLA0KICAiQWJvdmUgMi4wIFRhcmdldCIgPSAicGVyY2VudF9hYm92ZV90YXJnZXQiLA0KICAiQmVsb3cgMi4wIFRhcmdldCIgPSAicGVyY2VudF9iZWxvd190YXJnZXQiDQopDQoNCiMgRnVuY3Rpb24gdG8gc2F2ZSBzdW1tYXJ5IHZhbHVlcyBkeW5hbWljYWxseQ0Kc2F2ZV9jb2x1bW5fdmFsdWVzIDwtIGZ1bmN0aW9uKHN1bW1hcnlfZGYpIHsNCiAgIyBFeGNsdWRlIHRoZSAiU3RhdGlzdGljIiBhbmQgIk92ZXJhbGwiIGNvbHVtbnMNCiAgY29sdW1uc190b19zYXZlIDwtIHNldGRpZmYobmFtZXMoc3VtbWFyeV9kZiksIGMoIlN0YXRpc3RpYyIsICJPdmVyYWxsIikpDQogIA0KICAjIEl0ZXJhdGUgb3ZlciBlYWNoIGNvbHVtbg0KICBmb3IgKGNvbCBpbiBjb2x1bW5zX3RvX3NhdmUpIHsNCiAgICAjIEZvcm1hdCBjb2x1bW4gbmFtZSB0byBsb3dlcmNhc2UgYW5kIHJlcGxhY2UgaW52YWxpZCBjaGFyYWN0ZXJzDQogICAgY29sX25hbWUgPC0gdG9sb3dlcihnc3ViKCJbXmEtekEtWjAtOV0iLCAiXyIsIGNvbCkpDQogICAgDQogICAgIyBFeHRyYWN0IHZhbHVlcyBmb3IgdGhlIGN1cnJlbnQgY29sdW1uDQogICAgY29sX3ZhbHVlcyA8LSBzdW1tYXJ5X2RmW1tjb2xdXQ0KICAgIA0KICAgICMgU2F2ZSBlYWNoIHZhbHVlIGR5bmFtaWNhbGx5IHVzaW5nIHRoZSBtYXBwaW5nIGZvciByb3cgbmFtZXMNCiAgICBmb3IgKGkgaW4gc2VxX2Fsb25nKGNvbF92YWx1ZXMpKSB7DQogICAgICAjIEdldCB0aGUgY29ycmVzcG9uZGluZyB2YXJpYWJsZSBuYW1lIGZyb20gdGhlIG1hcHBpbmcNCiAgICAgIHN0YXRfbmFtZSA8LSByb3dfdG9fdmFyX25hbWVbcm93bmFtZXMoc3VtbWFyeV9kZilbaV1dDQogICAgICANCiAgICAgIGlmICghaXMubmEoc3RhdF9uYW1lKSkgeyAgIyBTa2lwIGlmIG5vIG1hcHBpbmcgaXMgZGVmaW5lZA0KICAgICAgICAjIENyZWF0ZSB0aGUgdmFyaWFibGUgbmFtZQ0KICAgICAgICB2YXJfbmFtZSA8LSBwYXN0ZTAoc3RhdF9uYW1lLCAiXyIsIGNvbF9uYW1lKQ0KICAgICAgICANCiAgICAgICAgIyBBdHRlbXB0IG51bWVyaWMgY29udmVyc2lvbiBmb3IgZG93bnN0cmVhbSB1c2UNCiAgICAgICAgdmFsdWUgPC0gc3VwcHJlc3NXYXJuaW5ncyhhcy5udW1lcmljKGdzdWIoIiUiLCAiIiwgY29sX3ZhbHVlc1tpXSkpKQ0KICAgICAgICANCiAgICAgICAgIyBBc3NpZ24gdGhlIHZhbHVlIHRvIHRoZSBnbG9iYWwgZW52aXJvbm1lbnQNCiAgICAgICAgYXNzaWduKHZhcl9uYW1lLCB2YWx1ZSwgZW52aXIgPSAuR2xvYmFsRW52KQ0KICAgICAgfQ0KICAgIH0NCiAgfQ0KfQ0KDQojIEFwcGx5IHRoZSBmdW5jdGlvbiB0byBzYXZlIHZhbHVlcyBmb3IgYWxsIGNvbHVtbnMgZXhjZXB0ICJPdmVyYWxsIg0Kc2F2ZV9jb2x1bW5fdmFsdWVzKGNwaV9yYXdfY2Fpcl9zdW1tYXJ5KQ0KDQojIEV4YW1wbGU6IEFjY2Vzc2luZyBkeW5hbWljYWxseSBjcmVhdGVkIHZhcmlhYmxlcw0KaW50ZXJhY3RpdmVfcHJpbnQobWVhbl92YWx1ZV8xX3llYXJfY2FpcikgICMgU2hvdWxkIHByaW50IHRoZSBtZWFuIHZhbHVlIGZvciAxLVllYXIgQ0FJUg0KaW50ZXJhY3RpdmVfcHJpbnQocGVyY2VudF9hYm92ZV90YXJnZXRfNV95ZWFyX2NhaXIpICAjIFNob3VsZCBwcmludCB0aGUgcGVyY2VudCBhYm92ZSBpbmZsYXRpb24gZm9yIDUtWWVhciBDQUlSDQppbnRlcmFjdGl2ZV9wcmludChzZF92YWx1ZV8xMF95ZWFyX2NhaXIpICAjIFNob3VsZCBwcmludCB0aGUgc3RhbmRhcmQgZGV2aWF0aW9uIGZvciAxMC1ZZWFyIENBSVINCg0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiMjIyBPVkVSQUxMIENPTFVNTlMgDQppbnRlcmFjdGl2ZV9zdHIoY3BpX3Jhd19jYWlyX3N1bW1hcnkpDQoNCiMgQ29tYmluZSBhbGwgQ0FJUiBjb2x1bW5zIGludG8gYSBzaW5nbGUgbnVtZXJpYyB2ZWN0b3IsIGV4Y2x1ZGluZyBOQXMNCm51bWVyaWNfdmFsdWVzX2FsbCA8LSBhcy5udW1lcmljKHVubGlzdChucnQkY3BpX3Jhd19jYWlyW2V4aXN0aW5nX2NhaXJfY29sdW1uc10sIHVzZS5uYW1lcyA9IEZBTFNFKSkNCm51bWVyaWNfdmFsdWVzX2FsbCA8LSBudW1lcmljX3ZhbHVlc19hbGxbIWlzLm5hKG51bWVyaWNfdmFsdWVzX2FsbCldICAjIEV4Y2x1ZGUgTkEgdmFsdWVzDQoNCiMgQ2FsY3VsYXRlIG92ZXJhbGwgc3RhdGlzdGljcw0Kb3ZlcmFsbF9jb3VudF9vYnNlcnZhdGlvbnMgPC0gbGVuZ3RoKG51bWVyaWNfdmFsdWVzX2FsbCkNCm92ZXJhbGxfbWVhbl92YWx1ZSA8LSByb3VuZChtZWFuKG51bWVyaWNfdmFsdWVzX2FsbCksIDIpDQpvdmVyYWxsX21lZGlhbl92YWx1ZSA8LSByb3VuZChtZWRpYW4obnVtZXJpY192YWx1ZXNfYWxsKSwgMikNCm92ZXJhbGxfc2RfdmFsdWUgPC0gcm91bmQoc2QobnVtZXJpY192YWx1ZXNfYWxsKSwgMikNCm92ZXJhbGxfbWluX2NhaXJfcmFuZ2UgPC0gcm91bmQoY2Fpcl92YWx1ZSAtIG92ZXJhbGxfc2RfdmFsdWUsIDIpDQpvdmVyYWxsX21heF9jYWlyX3JhbmdlIDwtIHJvdW5kKGNhaXJfdmFsdWUgKyBvdmVyYWxsX3NkX3ZhbHVlLCAyKQ0Kb3ZlcmFsbF9taW5fdmFsdWUgPC0gcm91bmQobWluKG51bWVyaWNfdmFsdWVzX2FsbCksIDIpDQpvdmVyYWxsX21heF92YWx1ZSA8LSByb3VuZChtYXgobnVtZXJpY192YWx1ZXNfYWxsKSwgMikNCg0KIyBUYXJnZXQgUmF0ZSBBbmFseXNpcyBmb3Igb3ZlcmFsbCBkYXRhDQp0YXJnZXRfdmFsdWUgPC0gMiAgIyBTZXQgdGhlIHRhcmdldCByYXRlLCBlLmcuLCAyJQ0Kb3ZlcmFsbF95ZWFyc19hYm92ZV90YXJnZXQgPC0gc3VtKG51bWVyaWNfdmFsdWVzX2FsbCA+IHRhcmdldF92YWx1ZSkNCm92ZXJhbGxfeWVhcnNfYmVsb3dfdGFyZ2V0IDwtIHN1bShudW1lcmljX3ZhbHVlc19hbGwgPCB0YXJnZXRfdmFsdWUpDQpvdmVyYWxsX3BlcmNlbnRfYWJvdmVfdGFyZ2V0IDwtIHJvdW5kKChvdmVyYWxsX3llYXJzX2Fib3ZlX3RhcmdldCAvIG92ZXJhbGxfY291bnRfb2JzZXJ2YXRpb25zKSAqIDEwMCwgMikNCm92ZXJhbGxfcGVyY2VudF9iZWxvd190YXJnZXQgPC0gcm91bmQoKG92ZXJhbGxfeWVhcnNfYmVsb3dfdGFyZ2V0IC8gb3ZlcmFsbF9jb3VudF9vYnNlcnZhdGlvbnMpICogMTAwLCAyKQ0KDQojIEFkZCB0aGUgb3ZlcmFsbCBzdGF0aXN0aWNzIHRvIHRoZSBzdW1tYXJ5IGRhdGEgZnJhbWUNCmNwaV9yYXdfY2Fpcl9zdW1tYXJ5JE92ZXJhbGwgPC0gYygNCiAgb3ZlcmFsbF9jb3VudF9vYnNlcnZhdGlvbnMsDQogIHBhc3RlMChvdmVyYWxsX21lYW5fdmFsdWUsICIlIiksDQogIHBhc3RlMChvdmVyYWxsX21lZGlhbl92YWx1ZSwgIiUiKSwNCiAgcGFzdGUwKG92ZXJhbGxfc2RfdmFsdWUsICIlIiksDQogIHBhc3RlMChvdmVyYWxsX21pbl9jYWlyX3JhbmdlLCAiJSIpLA0KICBwYXN0ZTAob3ZlcmFsbF9tYXhfY2Fpcl9yYW5nZSwgIiUiKSwNCiAgcGFzdGUwKG92ZXJhbGxfbWluX3ZhbHVlLCAiJSIpLA0KICBwYXN0ZTAob3ZlcmFsbF9tYXhfdmFsdWUsICIlIiksDQogIHBhc3RlMChvdmVyYWxsX3BlcmNlbnRfYWJvdmVfdGFyZ2V0LCAiJSIpLA0KICBwYXN0ZTAob3ZlcmFsbF9wZXJjZW50X2JlbG93X3RhcmdldCwgIiUiKQ0KKQ0KDQojIENvbnZlcnQgcm93IG5hbWVzIHRvIGEgY29sdW1uIGZvciBlYXNpZXIgbWFuaXB1bGF0aW9uIGFuZCBkaXNwbGF5DQpjcGlfcmF3X2NhaXJfc3VtbWFyeSA8LSB0aWJibGU6OnJvd25hbWVzX3RvX2NvbHVtbihjcGlfcmF3X2NhaXJfc3VtbWFyeSwgdmFyID0gIlN0YXRpc3RpYyIpDQoNCiMgQ29udmVydCBhbGwgY29sdW1ucyB0byBjaGFyYWN0ZXIgdG8gZW5zdXJlIGNvbnNpc3RlbnQgZm9ybWF0dGluZw0KY3BpX3Jhd19jYWlyX3N1bW1hcnkgPC0gY3BpX3Jhd19jYWlyX3N1bW1hcnkgJT4lDQogIG11dGF0ZShhY3Jvc3MoZXZlcnl0aGluZygpLCBhcy5jaGFyYWN0ZXIpKQ0KDQojIERpc3BsYXkgZm9ybWF0dGVkIHRhYmxlIHdpdGggdW5zcGVjaWZpZWQgY29sdW1uIHdpZHRocw0KY2F0KCJcblxuIyMjIyBDb21wb3VuZCBBdmVyYWdlIFN1bW1hcnkgKCIsIG1pbl95ZWFyLCAiLSIsIG1heF95ZWFyLCAiKVxuIiwgc2VwID0gIiIpDQpmb3JtYXRfdW5zcGVjaWZpZWRfd2lkdGgoY3BpX3Jhd19jYWlyX3N1bW1hcnkpDQoNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQojIyBTQVZFIFZBTFVFUzsgDQoNCiMgQXNzaWduIHRoZSBjYWxjdWxhdGVkIENBSVIgdmFsdWUgdG8gdGhlIGR5bmFtaWNhbGx5IGNyZWF0ZWQgdmFyaWFibGUNCnZhcl9uYW1lIDwtIHBhc3RlMCgiY3BpX2NhaXJfc3VtbWFyeV9vdmVyYWxsX21lYW5fcyIsIG1pbl95ZWFyLCAiX2UiLCBtYXhfeWVhciwgIl9heWQiKQ0KYXNzaWduKHZhcl9uYW1lLCBvdmVyYWxsX21lYW5fdmFsdWUpDQppbnRlcmFjdGl2ZV9wcmludChvdmVyYWxsX21lYW5fdmFsdWUpDQoNCnZhcl9uYW1lIDwtIHBhc3RlMCgiY3BpX2NhaXJfc3VtbWFyeV9vdmVyYWxsX21pbl9jYWlyX3JhbmdlX3MiLCBtaW5feWVhciwgIl9lIiwgbWF4X3llYXIsICJfYXlkIikNCmFzc2lnbih2YXJfbmFtZSwgb3ZlcmFsbF9taW5fY2Fpcl9yYW5nZSkNCmludGVyYWN0aXZlX3ByaW50KG92ZXJhbGxfbWluX2NhaXJfcmFuZ2UpDQoNCnZhcl9uYW1lIDwtIHBhc3RlMCgiY3BpX2NhaXJfc3VtbWFyeV9vdmVyYWxsX21heF9jYWlyX3JhbmdlX3MiLCBtaW5feWVhciwgIl9lIiwgbWF4X3llYXIsICJfYXlkIikNCmFzc2lnbih2YXJfbmFtZSwgb3ZlcmFsbF9tYXhfY2Fpcl9yYW5nZSkNCmludGVyYWN0aXZlX3ByaW50KG92ZXJhbGxfbWF4X2NhaXJfcmFuZ2UpDQoNCg0KaW50ZXJhY3RpdmVfcHJpbnQoY3BpX2NhaXJfc3VtbWFyeV9vdmVyYWxsX21lYW5fczE5MTNfZTIwMjNfYXlkKQ0KaW50ZXJhY3RpdmVfcHJpbnQoY3BpX2NhaXJfc3VtbWFyeV9vdmVyYWxsX21pbl9jYWlyX3JhbmdlX3MxOTEzX2UyMDIzX2F5ZCkNCmludGVyYWN0aXZlX3ByaW50KGNwaV9jYWlyX3N1bW1hcnlfb3ZlcmFsbF9tYXhfY2Fpcl9yYW5nZV9zMTkxM19lMjAyM19heWQpDQoNCiMgQ29uZmlybSBtaW4gYW5kIG1heCB5ZWFycw0KaW50ZXJhY3RpdmVfcHJpbnQobWluX3llYXIpDQppbnRlcmFjdGl2ZV9wcmludChtYXhfeWVhcikNCg0KYGBgDQoNCg0KVGhlIG92ZXJhbGwgbWVhbiBhbm51YWwgaW5mbGF0aW9uIHJhdGUgc3RhbmRzIGF0IGByIGNwaV9jYWlyX3N1bW1hcnlfb3ZlcmFsbF9tZWFuX3MxOTEzX2UyMDIzX2F5ZGAlLCB3aXRoIGEgc3RhbmRhcmQgZGV2aWF0aW9uIG9mIGByIG92ZXJhbGxfc2RfdmFsdWVgJSwgaW5kaWNhdGluZyBtb2RlcmF0ZSB2b2xhdGlsaXR5IG92ZXIgdGhlIGZ1bGwgZGF0YXNldCBmcm9tIGByIG1pbl95ZWFyYCB0aHJ1IGByIG1heF95ZWFyYC4gU2hvcnRlciBwZXJpb2RzLCBzdWNoIGFzIHRoZSAxLVllYXIgYW5kIDUtWWVhciBDQUlScywgZXhoaWJpdCBncmVhdGVyIHZhcmlhYmlsaXR5LCB3aXRoIHN0YW5kYXJkIGRldmlhdGlvbnMgb2YgYHIgc2RfdmFsdWVfMV95ZWFyX2NhaXJgJSBhbmQgYHIgc2RfdmFsdWVfNV95ZWFyX2NhaXJgJSwgcmVzcGVjdGl2ZWx5LCByZWZsZWN0aW5nIHNlbnNpdGl2aXR5IHRvIHNob3J0LXRlcm0gZWNvbm9taWMgZmx1Y3R1YXRpb25zLiBDb252ZXJzZWx5LCBsb25nZXIgcGVyaW9kcyBsaWtlIHRoZSAyMC1ZZWFyIGFuZCAzMC1ZZWFyIENBSVJzIGRlbW9uc3RyYXRlIHNpZ25pZmljYW50bHkgcmVkdWNlZCB2b2xhdGlsaXR5LCB3aXRoIHN0YW5kYXJkIGRldmlhdGlvbnMgb2YgYHIgc2RfdmFsdWVfMjBfeWVhcl9jYWlyYCUgYW5kIGByIHNkX3ZhbHVlXzMwX3llYXJfY2FpcmAlLCByZXNwZWN0aXZlbHksIGhpZ2hsaWdodGluZyB0aGF0IGV4dGVuZGVkIGR1cmF0aW9ucyBvZmZlciBhIG1vcmUgc3RhYmxlIGFuZCBjb25zaXN0ZW50IHZpZXcgb2YgaW5mbGF0aW9uIHRyZW5kcy4NCg0KT3ZlcmFsbCB2YWx1ZXMgYXJlIGNhbGN1bGF0ZWQgZnJvbSBhbGwgbnVtZXJpY2FsIGRhdGEgYWNyb3NzIHRoZSBDQUlSIHBlcmlvZHMsIHByb3ZpZGluZyBhIGNvbXByZWhlbnNpdmUgcmVwcmVzZW50YXRpb24gb2YgaGlzdG9yaWNhbCBpbmZsYXRpb24gdHJlbmRzLiBXZSBjYW4sIHRoZXJlZm9yZSwgdXNlIHRoZSBPdmVyYWxsIENBSVIgTWVhbiAoYHIgY3BpX2NhaXJfc3VtbWFyeV9vdmVyYWxsX21lYW5fczE5MTNfZTIwMjNfYXlkYCUpIGFzIGEgYmFzZWxpbmUgdG8gZXZhbHVhdGUgaW5mbGF0aW9uYXJ5IHByZXNzdXJlcyByZWxhdGl2ZSB0byBoaXN0b3JpY2FsIG5vcm1zLiBUaGUgb3ZlcmFsbCBzdGFuZGFyZCBkZXZpYXRpb24gcXVhbnRpZmllcyB0aGUgdHlwaWNhbCByYW5nZSBvZiBpbmZsYXRpb24gdmFyaWFiaWxpdHkgb3ZlciB0aW1lLCBwcm92aWRpbmcgYSBzaW5ndWxhciBDQUlSIHJhbmdlIChgciBjcGlfY2Fpcl9zdW1tYXJ5X292ZXJhbGxfbWluX2NhaXJfcmFuZ2VfczE5MTNfZTIwMjNfYXlkYCUtYHIgY3BpX2NhaXJfc3VtbWFyeV9vdmVyYWxsX21heF9jYWlyX3JhbmdlX3MxOTEzX2UyMDIzX2F5ZGApJSB0aGF0IGNhcHR1cmUgdGhlIGJvdW5kcyBvZiB0eXBpY2FsIGhpc3RvcmljYWwgZmx1Y3R1YXRpb25zLg0KDQojIyMgR3JhcGgNCg0KVGhlc2UgZ3JhcGhzIGlsbHVzdHJhdGUgdGhlIFJvbGxpbmcgQ0FJUiBhY3Jvc3MgdmFyeWluZyB0aW1lIGhvcml6b25zICgxLCA1LCAxMCwgMjAsIGFuZCAzMCB5ZWFycykgb3ZlciBkaWZmZXJlbnQgaGlzdG9yaWNhbCBwZXJpb2RzLCB3aXRoIGEgZm9jdXMgb24gdGhlIHN0YW5kYXJkIDIlIGluZmxhdGlvbiB0YXJnZXQuIFRoZSBncmVlbiBiYW5kIHJlcHJlc2VudHMgb3ZlcmFsbCByYW5nZSB3aGVyZSBpbmZsYXRpb24gcmF0ZXMgYWxpZ24gd2l0aCBoaXN0b3JpY2FsIG5vcm1zLCB3aGlsZSB0aGUgcmVkIHpvbmVzIGluZGljYXRlIHBlcmlvZHMgb2Ygc2lnbmlmaWNhbnQgZGV2aWF0aW9uLiBTaG9ydGVyLXRlcm0gQ0FJUnMgKGUuZy4sIDEtWWVhcikgZGlzcGxheSBoaWdoZXIgdm9sYXRpbGl0eSwgb2Z0ZW4gZXhjZWVkaW5nIHRoZSB0YXJnZXQgcmFuZ2UsIHdoZXJlYXMgbG9uZ2VyLXRlcm0gQ0FJUnMgKGUuZy4sIDMwLVllYXIpIGFyZSBzbW9vdGhlciBhbmQgcmVtYWluIG1vcmUgc3RhYmxlIHdpdGhpbiB0aGUgZ3JlZW4gYmFuZCwgcmVmbGVjdGluZyBjdW11bGF0aXZlIGluZmxhdGlvbiBlZmZlY3RzIGFuZCBsb25nLXRlcm0gc3RhYmlsaXR5Lg0KDQojIyMjIEFsbCBQZXJpb2RzDQoNCmBgYHtyIG5ydCRjcGlfcmF3X2NhaXJfZ3JhcGhzLCBmaWcud2lkdGg9MTAsIGZpZy5oZWlnaHQ9NywgZXZhbD1UUlVFLCBlY2hvPUZBTFNFfQ0KDQpjYXQoIlxuXG4jIyMjIENvbXBvdW5kIEF2ZXJhZ2UgSW5mbGF0aW9uIFJhdGVzIEFjcm9zcyBQZXJpb2RzIFxuIikNCg0KIyBMb2FkIG5lY2Vzc2FyeSBsaWJyYXJpZXMNCmxpYnJhcnkoZ2dwbG90MikNCmxpYnJhcnkoZHBseXIpDQoNCiMgQ29udmVydCBjb2x1bW5zIHRvIG51bWVyaWMgZm9yIHBsb3R0aW5nIGlmIG5lZWRlZA0KbnJ0JGNwaV9yYXdfY2FpciA8LSBucnQkY3BpX3Jhd19jYWlyICU+JQ0KICBtdXRhdGUoDQogICAgYDEtWWVhciBDQUlSYCA9IGFzLm51bWVyaWMoZ3N1YigiJSIsICIiLCBgMS1ZZWFyIENBSVJgKSksDQogICAgYDUtWWVhciBDQUlSYCA9IGFzLm51bWVyaWMoZ3N1YigiJSIsICIiLCBgNS1ZZWFyIENBSVJgKSksDQogICAgYDEwLVllYXIgQ0FJUmAgPSBhcy5udW1lcmljKGdzdWIoIiUiLCAiIiwgYDEwLVllYXIgQ0FJUmApKSwNCiAgICBgMjAtWWVhciBDQUlSYCA9IGFzLm51bWVyaWMoZ3N1YigiJSIsICIiLCBgMjAtWWVhciBDQUlSYCkpLA0KICAgIGAzMC1ZZWFyIENBSVJgID0gYXMubnVtZXJpYyhnc3ViKCIlIiwgIiIsIGAzMC1ZZWFyIENBSVJgKSkNCiAgKQ0KDQojIFJlc2hhcGUgdGhlIGRhdGEgaW50byBsb25nIGZvcm1hdCBmb3IgZWFzeSBwbG90dGluZyBvZiBtdWx0aXBsZSBsaW5lcyBhbmQgc2V0IHRoZSBmYWN0b3Igb3JkZXINCm5ydF9sb25nIDwtIG5ydCRjcGlfcmF3X2NhaXIgJT4lDQogIHBpdm90X2xvbmdlcihjb2xzID0gYyhgMS1ZZWFyIENBSVJgLCBgNS1ZZWFyIENBSVJgLCBgMTAtWWVhciBDQUlSYCwgYDIwLVllYXIgQ0FJUmAsIGAzMC1ZZWFyIENBSVJgKSwNCiAgICAgICAgICAgICAgIG5hbWVzX3RvID0gIkNBSVJfUGVyaW9kIiwNCiAgICAgICAgICAgICAgIHZhbHVlc190byA9ICJDQUlSX1ZhbHVlIikgJT4lDQogIG11dGF0ZShDQUlSX1BlcmlvZCA9IGZhY3RvcihDQUlSX1BlcmlvZCwgbGV2ZWxzID0gYygiMS1ZZWFyIENBSVIiLCAiNS1ZZWFyIENBSVIiLCAiMTAtWWVhciBDQUlSIiwgIjIwLVllYXIgQ0FJUiIsICIzMC1ZZWFyIENBSVIiKSkpDQoNCiMgQXNzaWduIGNvbG9ycyBkeW5hbWljYWxseSBiYXNlZCBvbiB0aGUgb3JkZXIgb2YgQ0FJUl9QZXJpb2QgaW4gdGhlIGRhdGENCiMgTWF0Y2ggdGhlIHVuaXF1ZSBsZXZlbHMgb2YgQ0FJUl9QZXJpb2Qgd2l0aCBjb2xvcnMgZnJvbSBjb2xvcnNfZ2VuZXJhbF9kYXJrDQp1bmlxdWVfdHlwZXMgPC0gdW5pcXVlKG5ydF9sb25nJENBSVJfUGVyaW9kKQ0KY3VzdG9tX2NvbG9ycyA8LSBzZXROYW1lcyhjb2xvcnNfZ2VuZXJhbF9kYXJrWzE6bGVuZ3RoKHVuaXF1ZV90eXBlcyldLCB1bmlxdWVfdHlwZXMpDQoNCiMgRmluZCB0aGUgbWluaW11bSBhbmQgbWF4aW11bSB4LXZhbHVlIGluIHlvdXIgZGF0YQ0KbWF4X3ggPC0gbWF4KGFzLmludGVnZXIobnJ0JGNwaV9yYXdfY2FpciREYXRlKSwgbmEucm0gPSBUUlVFKQ0KbWluX3ggPC0gbWluKGFzLmludGVnZXIobnJ0JGNwaV9yYXdfY2FpciREYXRlKSwgbmEucm0gPSBUUlVFKQ0KaW50ZXJhY3RpdmVfcHJpbnQobWF4X3gpICAjIFRlc3QNCmludGVyYWN0aXZlX3ByaW50KG1pbl94KSAgIyBUZXN0DQoNCiMgRmluZCB0aGUgbWluaW11bSBhbmQgbWF4aW11bSB5ZWFyDQptaW5feWVhciA8LSBtaW4obnJ0JGNwaV9yYXdfY2FpciREYXRlLCBuYS5ybSA9IFRSVUUpDQptYXhfeWVhciA8LSBtYXgobnJ0JGNwaV9yYXdfY2FpciREYXRlLCBuYS5ybSA9IFRSVUUpDQppbnRlcmFjdGl2ZV9wcmludChtaW5feWVhcikNCmludGVyYWN0aXZlX3ByaW50KG1heF95ZWFyKQ0KDQojIFJlLURlZmluZSB0aGUgdGFyZ2V0IHJhdGUgYXMgbmVlZGVkLg0KdGFyZ2V0X3ZhbHVlIDwtIDIuMCAgIyBSZXBsYWNlIHdpdGggeW91ciBzcGVjaWZpYyB0YXJnZXQgcmF0ZSBpZiBuZWVkZWQNCg0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiMjIFBMT1QgRlVMTCBXSVRIT1VUIExJTUlUUw0KDQojIERlZmluZSBzdGFydCBhbmQgZW5kIHllYXJzDQpzdGFydF95ZWFyIDwtIGFzLm51bWVyaWMobWluX3llYXIpDQplbmRfeWVhciA8LSAyMDIzDQp5ZWFyX3JhbmdlIDwtIGVuZF95ZWFyIC0gc3RhcnRfeWVhciArIDEgICMgQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgeWVhcnMNCg0KIyBEZWZpbmUgYnJlYWtzIHJvdW5kZWQgYXBwcm9wcmlhdGVseQ0KbGltaXRzX3N0YXJ0X3llYXIgPC0gZmxvb3Ioc3RhcnRfeWVhciAvIDUpICogNSAgIyBSb3VuZCBkb3duIHRvIHRoZSBuZWFyZXN0IG11bHRpcGxlIG9mIDUNCmxpbWl0c19lbmRfeWVhciA8LSBjZWlsaW5nKGVuZF95ZWFyIC8gNSkgKiA1ICAgIyBSb3VuZCB1cCB0byB0aGUgbmVhcmVzdCBtdWx0aXBsZSBvZiA1DQoNCiMgQ3JlYXRlIGR5bmFtaWMgdGl0bGUgYW5kIGNhcHRpb24NCmR5bmFtaWNfdGl0bGUgPC0gcGFzdGUwKCJSb2xsaW5nIENBSVJzIEFjcm9zcyBQZXJpb2RzIE92ZXIgIix5ZWFyX3JhbmdlLCAiIFllYXJzICgiLCBzdGFydF95ZWFyLCAiLSIsIGVuZF95ZWFyLCAiKSIpDQpkeW5hbWljX2NhcHRpb24gPC0gcGFzdGUwKCJDUEkgQ29tcG91bmQgQXZlcmFnZSBJbmZsYXRpb24gUmF0ZXMgZm9yIEFsbCBVcmJhbiBDb25zdW1lcnMsIERhdGFzZXQgKCIsIG1pbl95ZWFyLCAiLSIsIG1heF95ZWFyLCAiKSIpDQoNCg0KIyBDcmVhdGUgdGhlIGZ1bGwsIG5vbi1maWx0ZXJlZCB4LWF4aXMgcGxvdCB3aXRoIGR5bmFtaWMgeCBwbGFjZW1lbnQgZm9yIGFubm90YXRpb25zDQpwMSA8LSBnZ3Bsb3QobnJ0X2xvbmcsIGFlcyh4ID0gYXMuaW50ZWdlcihEYXRlKSwgeSA9IENBSVJfVmFsdWUsIGNvbG9yID0gQ0FJUl9QZXJpb2QpKSArDQoNCiAgIyBBZGQgc2hhZGVkIGFyZWFzIGZvciBiYWNrZ3JvdW5kIGVmZmVjdA0KICBnZW9tX3JlY3QoYWVzKHhtaW4gPSAtSW5mLCB4bWF4ID0gSW5mLCB5bWluID0gb3ZlcmFsbF9taW5fY2Fpcl9yYW5nZSwgeW1heCA9IG92ZXJhbGxfbWF4X2NhaXJfcmFuZ2UpLCBmaWxsID0gImxpZ2h0Z3JlZW4iLCBhbHBoYSA9IDAuMDA3NSkgKw0KICBnZW9tX3JlY3QoYWVzKHhtaW4gPSAtSW5mLCB4bWF4ID0gSW5mLCB5bWluID0gLUluZiwgeW1heCA9IG92ZXJhbGxfbWluX2NhaXJfcmFuZ2UpLCBmaWxsID0gImxpZ2h0Y29yYWwiLCBhbHBoYSA9IDAuMDA3NSkgKw0KICBnZW9tX3JlY3QoYWVzKHhtaW4gPSAtSW5mLCB4bWF4ID0gSW5mLCB5bWluID0gb3ZlcmFsbF9tYXhfY2Fpcl9yYW5nZSwgeW1heCA9IEluZiksIGZpbGwgPSAibGlnaHRjb3JhbCIsIGFscGhhID0gMC4wMDc1KSArDQogIA0KICAjIFBsb3QgbGluZXMgZm9yIGVhY2ggQ0FJUiBQZXJpb2QNCiAgZ2VvbV9saW5lKHNpemUgPSAxLjAsIGFscGhhID0gMy4wKSArICAgICAgICMgTGluZSBmb3IgZWFjaCBDQUlSDQogIGdlb21fcG9pbnQoc2l6ZSA9IDEuMCwgYWxwaGEgPSAzLjApICsgICAgICAgIyBQb2ludHMgZm9yIGVhY2ggQ0FJUg0KICANCiAgIyBBZGQgdGFyZ2V0IGFuZCByYW5nZSBsaW5lcw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSB0YXJnZXRfdmFsdWUsIGNvbG9yID0gImRhcmtibHVlIiwgbGluZXR5cGUgPSAiZGFzaGVkIikgKw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSBvdmVyYWxsX21pbl9jYWlyX3JhbmdlLCBjb2xvciA9ICJkYXJrZ3JlZW4iLCBsaW5ldHlwZSA9ICJzb2xpZCIpICsNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gb3ZlcmFsbF9tYXhfY2Fpcl9yYW5nZSwgY29sb3IgPSAiZGFya2dyZWVuIiwgbGluZXR5cGUgPSAic29saWQiKSArDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IG92ZXJhbGxfbWVhbl92YWx1ZSwgY29sb3IgPSAiZGFya3JlZCIsIGxpbmV0eXBlID0gImRhc2hlZCIpICsNCiAgDQogICMgRHluYW1pYyByaWdodC1hbGlnbmVkIHBsYWNlbWVudCBmb3IgYW5ub3RhdGlvbnMNCiAgYW5ub3RhdGUoInRleHQiLCB4ID0gSW5mLCB5ID0gdGFyZ2V0X3ZhbHVlLCBsYWJlbCA9ICJUYXJnZXQiLCANCiAgICAgICAgICAgaGp1c3QgPSAxLCB2anVzdCA9IC0wLjUsIGNvbG9yID0gImRhcmtibHVlIiwgc2l6ZSA9IDQpICsNCiAgYW5ub3RhdGUoInRleHQiLCB4ID0gSW5mLCB5ID0gb3ZlcmFsbF9taW5fY2Fpcl9yYW5nZSwgbGFiZWwgPSAiTWluIENBSVIiLCANCiAgICAgICAgICAgaGp1c3QgPSAxLCB2anVzdCA9IC0wLjUsIGNvbG9yID0gImRhcmtncmVlbiIsIHNpemUgPSA0KSArDQogIGFubm90YXRlKCJ0ZXh0IiwgeCA9IEluZiwgeSA9IG92ZXJhbGxfbWF4X2NhaXJfcmFuZ2UsIGxhYmVsID0gIk1heCBDQUlSIiwgDQogICAgICAgICAgIGhqdXN0ID0gMSwgdmp1c3QgPSAtMC41LCBjb2xvciA9ICJkYXJrZ3JlZW4iLCBzaXplID0gNCkgKw0KICBhbm5vdGF0ZSgidGV4dCIsIHggPSBJbmYsIHkgPSBvdmVyYWxsX21lYW5fdmFsdWUsIGxhYmVsID0gIkNBSVIiLCANCiAgICAgICAgICAgaGp1c3QgPSAxLCB2anVzdCA9IC0wLjUsIGNvbG9yID0gImRhcmtyZWQiLCBzaXplID0gNCkgKw0KDQogIGxhYnMoDQogICAgdGl0bGUgPSBkeW5hbWljX3RpdGxlLA0KICAgIHggPSAiWWVhciIsDQogICAgeSA9ICJDQUlSIFZhbHVlICglKSIsDQogICAgY29sb3IgPSAiQ0FJUiBQZXJpb2QiLA0KICAgIGNhcHRpb24gPSBkeW5hbWljX2NhcHRpb24NCiAgICApICsNCiAgDQogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjdXN0b21fY29sb3JzKSArICAjIFNldCBjb2xvcnMgZm9yIGVhY2ggQ0FJUiBQZXJpb2QNCiAgc2NhbGVfeF9jb250aW51b3VzKA0KICAgIGxpbWl0cyA9IGMoc3RhcnRfeWVhciwgZW5kX3llYXIgKyA1KSwgIyBTZXQgZGF0YSBmb3IgeC1heGlzIA0KICAgIGJyZWFrcyA9IHNlcShsaW1pdHNfc3RhcnRfeWVhciwgbGltaXRzX2VuZF95ZWFyICsgNSwgNSkgIyBTZXQgaW5jcmVtZW50cyBmb3IgeC1heGlzDQogICAgKSArICAjIFJlc3RyaWN0ICYgU2V0IE1ham9yIHgtYXhpcyBsaW5lcyBmb3IgZWFjaCB5ZWFyDQogIA0KICB0aGVtZV9taW5pbWFsKCkgKw0KICB0aGVtZSgNCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41LCBzaXplID0gMjApLCAgICAgICAgICMgTGFyZ2VyIHRpdGxlIGZvbnQNCiAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0KSwgICAgICAgICAgICAgICAgICAgICMgTGFyZ2VyIHgtYXhpcyBsYWJlbCBmb250DQogICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCksICAgICAgICAgICAgICAgICAgICAjIExhcmdlciB5LWF4aXMgbGFiZWwgZm9udA0KICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSwgc2l6ZSA9IDE0KSwgICMgTGFyZ2VyIHgtYXhpcyB0ZXh0DQogICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0KSwgICAgICAgICAgICAgICAgICAgICAjIExhcmdlciB5LWF4aXMgdGV4dA0KICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQpLCAgICAgICAgICAgICAgICAgICAgIyBMZWdlbmQgdGl0bGUgc2l6ZQ0KICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiksICAgICAgICAgICAgICAgICAgICAgIyBMZWdlbmQgdGV4dCBzaXplDQogICAgcGFuZWwuZ3JpZC5tYWpvciA9IGVsZW1lbnRfbGluZShsaW5ldHlwZSA9ICJkb3R0ZWQiLCBjb2xvciA9ICJibGFjayIpLCAgIyBNYWpvciBncmlkIGxpbmVzDQogICAgcGFuZWwuZ3JpZC5taW5vci54ID0gZWxlbWVudF9ibGFuaygpLCAgICAgICAgICAgICAgICAgICAgICAjIE5vIG1pbm9yIHggZ3JpZCBsaW5lcw0KICAgIGF4aXMudGlja3MubGVuZ3RoID0gdW5pdCgtMC4yNSwgImNtIiksICAgICAgICAgICAgICAgICAgICAgICMgSW5jcmVhc2UgdGljayBsZW5ndGgNCiAgICBheGlzLnRpY2tzID0gZWxlbWVudF9saW5lKGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDAuNTApLCAgICMgRGFya2VyIHRpY2tzDQogICAgYXhpcy5saW5lLnggPSBlbGVtZW50X2xpbmUoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMC43NSksICAjIERhcmsgYm90dG9tIGJvcmRlcg0KICAgIGF4aXMubGluZS55ID0gZWxlbWVudF9saW5lKGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDAuNzUpICAgIyBEYXJrIGxlZnQgYm9yZGVyDQogICkNCg0KIyBQcmludCB0aGUgcGxvdCANCnByaW50KHAxKQ0KDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KIyMgUExPVCBSRVNUUklDVEVEIFdJVEggTElNSVRTIA0KDQojIEZpbHRlciB0aGUgZGF0YSBmb3IgdGhlIHJlc3RyaWN0ZWQgeC1heGlzIHJhbmdlICgxOTc0LTIwMjMpDQpyZXN0cmljdGVkX2RhdGEgPC0gbnJ0X2xvbmcgJT4lDQogIGZpbHRlcihhcy5pbnRlZ2VyKERhdGUpID49IDE5NDUgJiBhcy5pbnRlZ2VyKERhdGUpIDw9IDIwMjMpDQoNCiMgRGVmaW5lIHN0YXJ0IGFuZCBlbmQgeWVhcnMNCnN0YXJ0X3llYXIgPC0gMTk3NA0KZW5kX3llYXIgPC0gMjAyMw0KeWVhcl9yYW5nZSA8LSBlbmRfeWVhciAtIHN0YXJ0X3llYXIgKyAxICAjIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIHllYXJzDQoNCiMgRGVmaW5lIGJyZWFrcyByb3VuZGVkIGFwcHJvcHJpYXRlbHkNCmxpbWl0c19zdGFydF95ZWFyIDwtIGZsb29yKHN0YXJ0X3llYXIgLyA1KSAqIDUgICMgUm91bmQgZG93biB0byB0aGUgbmVhcmVzdCBtdWx0aXBsZSBvZiA1DQpsaW1pdHNfZW5kX3llYXIgPC0gY2VpbGluZyhlbmRfeWVhciAvIDUpICogNSAgICMgUm91bmQgdXAgdG8gdGhlIG5lYXJlc3QgbXVsdGlwbGUgb2YgNQ0KDQojIENyZWF0ZSBkeW5hbWljIHRpdGxlIGFuZCBjYXB0aW9uDQpkeW5hbWljX3RpdGxlIDwtIHBhc3RlMCgiUm9sbGluZyBDQUlScyBBY3Jvc3MgUGVyaW9kcyBPdmVyICIseWVhcl9yYW5nZSwgIiBZZWFycyAoIiwgc3RhcnRfeWVhciwgIi0iLCBlbmRfeWVhciwgIikiKQ0KZHluYW1pY19jYXB0aW9uIDwtIHBhc3RlMCgiQ1BJIENvbXBvdW5kIEF2ZXJhZ2UgSW5mbGF0aW9uIFJhdGVzIGZvciBBbGwgVXJiYW4gQ29uc3VtZXJzLCBEYXRhc2V0ICgiLCBtaW5feWVhciwgIi0iLCBtYXhfeWVhciwgIikiKQ0KDQojIENhbGN1bGF0ZSBkeW5hbWljIHktYXhpcyBsaW1pdHMgZm9yIHRoZSByZXN0cmljdGVkIGRhdGENCnlfbWluIDwtIG1pbihyZXN0cmljdGVkX2RhdGEkQ0FJUl9WYWx1ZSwgbmEucm0gPSBUUlVFKQ0KeV9tYXggPC0gbWF4KHJlc3RyaWN0ZWRfZGF0YSRDQUlSX1ZhbHVlLCBuYS5ybSA9IFRSVUUpDQoNCiMgQ3JlYXRlIHRoZSBmaWx0ZXJlZCwgcmVzdHJpY3RlZCB4LWF4aXMgcGxvdCB3aXRoIGR5bmFtaWMgeCBwbGFjZW1lbnQgZm9yIGFubm90YXRpb25zDQpwMiA8LSBnZ3Bsb3QobnJ0X2xvbmcsIGFlcyh4ID0gYXMuaW50ZWdlcihEYXRlKSwgeSA9IENBSVJfVmFsdWUsIGNvbG9yID0gQ0FJUl9QZXJpb2QpKSArDQoNCiAgIyBBZGQgc2hhZGVkIGFyZWFzIGZvciBiYWNrZ3JvdW5kIGVmZmVjdA0KICBnZW9tX3JlY3QoYWVzKHhtaW4gPSAtSW5mLCB4bWF4ID0gSW5mLCB5bWluID0gb3ZlcmFsbF9taW5fY2Fpcl9yYW5nZSwgeW1heCA9IG92ZXJhbGxfbWF4X2NhaXJfcmFuZ2UpLCBmaWxsID0gImxpZ2h0Z3JlZW4iLCBhbHBoYSA9IDAuMDA3NSkgKw0KICBnZW9tX3JlY3QoYWVzKHhtaW4gPSAtSW5mLCB4bWF4ID0gSW5mLCB5bWluID0gLUluZiwgeW1heCA9IG92ZXJhbGxfbWluX2NhaXJfcmFuZ2UpLCBmaWxsID0gImxpZ2h0Y29yYWwiLCBhbHBoYSA9IDAuMDA3NSkgKw0KICBnZW9tX3JlY3QoYWVzKHhtaW4gPSAtSW5mLCB4bWF4ID0gSW5mLCB5bWluID0gb3ZlcmFsbF9tYXhfY2Fpcl9yYW5nZSwgeW1heCA9IEluZiksIGZpbGwgPSAibGlnaHRjb3JhbCIsIGFscGhhID0gMC4wMDc1KSArDQogIA0KICAjIFBsb3QgbGluZXMgZm9yIGVhY2ggQ0FJUiBQZXJpb2QNCiAgZ2VvbV9saW5lKHNpemUgPSAxLjAsIGFscGhhID0gMy4wKSArICAgICAgICMgTGluZSBmb3IgZWFjaCBDQUlSDQogIGdlb21fcG9pbnQoc2l6ZSA9IDEuMCwgYWxwaGEgPSAzLjApICsgICAgICAgIyBQb2ludHMgZm9yIGVhY2ggQ0FJUg0KICANCiAgIyBBZGQgdGFyZ2V0IGFuZCByYW5nZSBsaW5lcw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSB0YXJnZXRfdmFsdWUsIGNvbG9yID0gImRhcmtibHVlIiwgbGluZXR5cGUgPSAiZGFzaGVkIikgKw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSBvdmVyYWxsX21pbl9jYWlyX3JhbmdlLCBjb2xvciA9ICJkYXJrZ3JlZW4iLCBsaW5ldHlwZSA9ICJzb2xpZCIpICsNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gb3ZlcmFsbF9tYXhfY2Fpcl9yYW5nZSwgY29sb3IgPSAiZGFya2dyZWVuIiwgbGluZXR5cGUgPSAic29saWQiKSArDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IG92ZXJhbGxfbWVhbl92YWx1ZSwgY29sb3IgPSAiZGFya3JlZCIsIGxpbmV0eXBlID0gImRhc2hlZCIpICsNCiAgDQogICMgRHluYW1pYyByaWdodC1hbGlnbmVkIHBsYWNlbWVudCBmb3IgYW5ub3RhdGlvbnMNCiAgYW5ub3RhdGUoInRleHQiLCB4ID0gSW5mLCB5ID0gdGFyZ2V0X3ZhbHVlLCBsYWJlbCA9ICJUYXJnZXQiLCANCiAgICAgICAgICAgaGp1c3QgPSAxLCB2anVzdCA9IC0wLjUsIGNvbG9yID0gImRhcmtibHVlIiwgc2l6ZSA9IDQpICsNCiAgYW5ub3RhdGUoInRleHQiLCB4ID0gSW5mLCB5ID0gb3ZlcmFsbF9taW5fY2Fpcl9yYW5nZSwgbGFiZWwgPSAiTWluIENBSVIiLCANCiAgICAgICAgICAgaGp1c3QgPSAxLCB2anVzdCA9IC0wLjUsIGNvbG9yID0gImRhcmtncmVlbiIsIHNpemUgPSA0KSArDQogIGFubm90YXRlKCJ0ZXh0IiwgeCA9IEluZiwgeSA9IG92ZXJhbGxfbWF4X2NhaXJfcmFuZ2UsIGxhYmVsID0gIk1heCBDQUlSIiwgDQogICAgICAgICAgIGhqdXN0ID0gMSwgdmp1c3QgPSAtMC41LCBjb2xvciA9ICJkYXJrZ3JlZW4iLCBzaXplID0gNCkgKw0KICBhbm5vdGF0ZSgidGV4dCIsIHggPSBJbmYsIHkgPSBvdmVyYWxsX21lYW5fdmFsdWUsIGxhYmVsID0gIkNBSVIiLCANCiAgICAgICAgICAgaGp1c3QgPSAxLCB2anVzdCA9IC0wLjUsIGNvbG9yID0gImRhcmtyZWQiLCBzaXplID0gNCkgKw0KDQogIGxhYnMoDQogICAgdGl0bGUgPSBkeW5hbWljX3RpdGxlLA0KICAgIHggPSAiWWVhciIsDQogICAgeSA9ICJDQUlSIFZhbHVlICglKSIsDQogICAgY29sb3IgPSAiQ0FJUiBQZXJpb2QiLA0KICAgIGNhcHRpb24gPSBkeW5hbWljX2NhcHRpb24NCiAgICApICsNCiAgDQogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjdXN0b21fY29sb3JzKSArICAjIFNldCBjb2xvcnMgZm9yIGVhY2ggQ0FJUiBQZXJpb2QNCiAgY29vcmRfY2FydGVzaWFuKHlsaW0gPSBjKHlfbWluLCB5X21heCkpICsgIyBBcHBseSBkeW5hbWljIHktYXhpcyBsaW1pdHMNCiAgc2NhbGVfeF9jb250aW51b3VzKA0KICAgIGxpbWl0cyA9IGMoc3RhcnRfeWVhciwgZW5kX3llYXIgKyA1KSwgIyBSZXN0cmljdHMgeC1heGlzIGRhdGEgDQogICAgYnJlYWtzID0gc2VxKGxpbWl0c19zdGFydF95ZWFyLCBsaW1pdHNfZW5kX3llYXIsIDUpICMgU2V0cyBNYWpvciB4LWF4aXMgIA0KICApICsgICMgUmVzdHJpY3QgJiBTZXQgTWFqb3IgeC1heGlzIGxpbmVzIA0KICANCiAgdGhlbWVfbWluaW1hbCgpICsNCiAgdGhlbWUoDQogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSwgc2l6ZSA9IDIwKSwgICAgICAgICAjIExhcmdlciB0aXRsZSBmb250DQogICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCksICAgICAgICAgICAgICAgICAgICAjIExhcmdlciB4LWF4aXMgbGFiZWwgZm9udA0KICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQpLCAgICAgICAgICAgICAgICAgICAgIyBMYXJnZXIgeS1heGlzIGxhYmVsIGZvbnQNCiAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEsIHNpemUgPSAxNCksICAjIExhcmdlciB4LWF4aXMgdGV4dA0KICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCksICAgICAgICAgICAgICAgICAgICAgIyBMYXJnZXIgeS1heGlzIHRleHQNCiAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0KSwgICAgICAgICAgICAgICAgICAgICMgTGVnZW5kIHRpdGxlIHNpemUNCiAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIpLCAgICAgICAgICAgICAgICAgICAgICMgTGVnZW5kIHRleHQgc2l6ZQ0KICAgIHBhbmVsLmdyaWQubWFqb3IgPSBlbGVtZW50X2xpbmUobGluZXR5cGUgPSAiZG90dGVkIiwgY29sb3IgPSAiYmxhY2siKSwgICMgTWFqb3IgZ3JpZCBsaW5lcw0KICAgIHBhbmVsLmdyaWQubWlub3IueCA9IGVsZW1lbnRfYmxhbmsoKSwgICAgICAgICAgICAgICAgICAgICAgIyBObyBtaW5vciB4IGdyaWQgbGluZXMNCiAgICBheGlzLnRpY2tzLmxlbmd0aCA9IHVuaXQoLTAuMjUsICJjbSIpLCAgICAgICAgICAgICAgICAgICAgICAjIEluY3JlYXNlIHRpY2sgbGVuZ3RoDQogICAgYXhpcy50aWNrcyA9IGVsZW1lbnRfbGluZShjb2xvciA9ICJibGFjayIsIHNpemUgPSAwLjUwKSwgICAjIERhcmtlciB0aWNrcw0KICAgIGF4aXMubGluZS54ID0gZWxlbWVudF9saW5lKGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDAuNzUpLCAgIyBEYXJrIGJvdHRvbSBib3JkZXINCiAgICBheGlzLmxpbmUueSA9IGVsZW1lbnRfbGluZShjb2xvciA9ICJibGFjayIsIHNpemUgPSAwLjc1KSAgICMgRGFyayBsZWZ0IGJvcmRlcg0KICApDQoNCiMgUHJpbnQgdGhlIHBsb3QgDQpwcmludChwMikNCg0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiMjIFBMT1QgUkVTVFJJQ1RFRCBXSVRIIExJTUlUUyANCg0KIyBEZWZpbmUgc3RhcnQgYW5kIGVuZCB5ZWFycw0Kc3RhcnRfeWVhciA8LSAyMDA0DQplbmRfeWVhciA8LSAyMDIzDQp5ZWFyX3JhbmdlIDwtIGVuZF95ZWFyIC0gc3RhcnRfeWVhciArIDEgICMgQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgeWVhcnMNCg0KIyBEZWZpbmUgYnJlYWtzIHJvdW5kZWQgYXBwcm9wcmlhdGVseQ0KbGltaXRzX3N0YXJ0X3llYXIgPC0gZmxvb3Ioc3RhcnRfeWVhciAvIDUpICogNSAgIyBSb3VuZCBkb3duIHRvIHRoZSBuZWFyZXN0IG11bHRpcGxlIG9mIDUNCmxpbWl0c19lbmRfeWVhciA8LSBjZWlsaW5nKGVuZF95ZWFyIC8gNSkgKiA1ICAgIyBSb3VuZCB1cCB0byB0aGUgbmVhcmVzdCBtdWx0aXBsZSBvZiA1DQoNCiMgQ3JlYXRlIGR5bmFtaWMgdGl0bGUgYW5kIGNhcHRpb24NCmR5bmFtaWNfdGl0bGUgPC0gcGFzdGUwKCJSb2xsaW5nIENBSVJzIEFjcm9zcyBQZXJpb2RzIE92ZXIgIix5ZWFyX3JhbmdlLCAiIFllYXJzICgiLCBzdGFydF95ZWFyLCAiLSIsIGVuZF95ZWFyLCAiKSIpDQpkeW5hbWljX2NhcHRpb24gPC0gcGFzdGUwKCJDUEkgQ29tcG91bmQgQXZlcmFnZSBJbmZsYXRpb24gUmF0ZXMgZm9yIEFsbCBVcmJhbiBDb25zdW1lcnMsIERhdGFzZXQgKCIsIG1pbl95ZWFyLCAiLSIsIG1heF95ZWFyLCAiKSIpDQoNCiMgRmlsdGVyIHRoZSBkYXRhIGZvciB0aGUgcmVzdHJpY3RlZCB4LWF4aXMgcmFuZ2UgKDIwMDQtMjAyMykNCnJlc3RyaWN0ZWRfZGF0YSA8LSBucnRfbG9uZyAlPiUNCiAgZmlsdGVyKGFzLmludGVnZXIoRGF0ZSkgPj0gMjAwNCAmIGFzLmludGVnZXIoRGF0ZSkgPD0gMjAyMykNCg0KIyBDYWxjdWxhdGUgZHluYW1pYyB5LWF4aXMgbGltaXRzIGZvciB0aGUgcmVzdHJpY3RlZCBkYXRhDQp5X21pbiA8LSBtaW4ocmVzdHJpY3RlZF9kYXRhJENBSVJfVmFsdWUsIG5hLnJtID0gVFJVRSkNCnlfbWF4IDwtIG1heChyZXN0cmljdGVkX2RhdGEkQ0FJUl9WYWx1ZSwgbmEucm0gPSBUUlVFKQ0KDQojIENyZWF0ZSB0aGUgZmlsdGVyZWQsIHJlc3RyaWN0ZWQgeC1heGlzIHBsb3Qgd2l0aCBkeW5hbWljIHggcGxhY2VtZW50IGZvciBhbm5vdGF0aW9ucw0KcDMgPC0gZ2dwbG90KG5ydF9sb25nLCBhZXMoeCA9IGFzLmludGVnZXIoRGF0ZSksIHkgPSBDQUlSX1ZhbHVlLCBjb2xvciA9IENBSVJfUGVyaW9kKSkgKw0KDQogICMgQWRkIHNoYWRlZCBhcmVhcyBmb3IgYmFja2dyb3VuZCBlZmZlY3QNCiAgZ2VvbV9yZWN0KGFlcyh4bWluID0gLUluZiwgeG1heCA9IEluZiwgeW1pbiA9IG92ZXJhbGxfbWluX2NhaXJfcmFuZ2UsIHltYXggPSBvdmVyYWxsX21heF9jYWlyX3JhbmdlKSwgZmlsbCA9ICJsaWdodGdyZWVuIiwgYWxwaGEgPSAwLjAwNzUpICsNCiAgZ2VvbV9yZWN0KGFlcyh4bWluID0gLUluZiwgeG1heCA9IEluZiwgeW1pbiA9IC1JbmYsIHltYXggPSBvdmVyYWxsX21pbl9jYWlyX3JhbmdlKSwgZmlsbCA9ICJsaWdodGNvcmFsIiwgYWxwaGEgPSAwLjAwNzUpICsNCiAgZ2VvbV9yZWN0KGFlcyh4bWluID0gLUluZiwgeG1heCA9IEluZiwgeW1pbiA9IG92ZXJhbGxfbWF4X2NhaXJfcmFuZ2UsIHltYXggPSBJbmYpLCBmaWxsID0gImxpZ2h0Y29yYWwiLCBhbHBoYSA9IDAuMDA3NSkgKw0KICANCiAgIyBQbG90IGxpbmVzIGZvciBlYWNoIENBSVIgUGVyaW9kDQogIGdlb21fbGluZShzaXplID0gMS4wLCBhbHBoYSA9IDMuMCkgKyAgICAgICAjIExpbmUgZm9yIGVhY2ggQ0FJUg0KICBnZW9tX3BvaW50KHNpemUgPSAxLjAsIGFscGhhID0gMy4wKSArICAgICAgICMgUG9pbnRzIGZvciBlYWNoIENBSVINCiAgDQogICMgQWRkIHRhcmdldCBhbmQgcmFuZ2UgbGluZXMNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gdGFyZ2V0X3ZhbHVlLCBjb2xvciA9ICJkYXJrYmx1ZSIsIGxpbmV0eXBlID0gImRhc2hlZCIpICsNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gb3ZlcmFsbF9taW5fY2Fpcl9yYW5nZSwgY29sb3IgPSAiZGFya2dyZWVuIiwgbGluZXR5cGUgPSAic29saWQiKSArDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IG92ZXJhbGxfbWF4X2NhaXJfcmFuZ2UsIGNvbG9yID0gImRhcmtncmVlbiIsIGxpbmV0eXBlID0gInNvbGlkIikgKw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSBvdmVyYWxsX21lYW5fdmFsdWUsIGNvbG9yID0gImRhcmtyZWQiLCBsaW5ldHlwZSA9ICJkYXNoZWQiKSArDQogIA0KICAjIER5bmFtaWMgcmlnaHQtYWxpZ25lZCBwbGFjZW1lbnQgZm9yIGFubm90YXRpb25zDQogIGFubm90YXRlKCJ0ZXh0IiwgeCA9IEluZiwgeSA9IHRhcmdldF92YWx1ZSwgbGFiZWwgPSAiVGFyZ2V0IiwgDQogICAgICAgICAgIGhqdXN0ID0gMSwgdmp1c3QgPSAtMC41LCBjb2xvciA9ICJkYXJrYmx1ZSIsIHNpemUgPSA0KSArDQogIGFubm90YXRlKCJ0ZXh0IiwgeCA9IEluZiwgeSA9IG92ZXJhbGxfbWluX2NhaXJfcmFuZ2UsIGxhYmVsID0gIk1pbiBDQUlSIiwgDQogICAgICAgICAgIGhqdXN0ID0gMSwgdmp1c3QgPSAtMC41LCBjb2xvciA9ICJkYXJrZ3JlZW4iLCBzaXplID0gNCkgKw0KICBhbm5vdGF0ZSgidGV4dCIsIHggPSBJbmYsIHkgPSBvdmVyYWxsX21heF9jYWlyX3JhbmdlLCBsYWJlbCA9ICJNYXggQ0FJUiIsIA0KICAgICAgICAgICBoanVzdCA9IDEsIHZqdXN0ID0gLTAuNSwgY29sb3IgPSAiZGFya2dyZWVuIiwgc2l6ZSA9IDQpICsNCiAgYW5ub3RhdGUoInRleHQiLCB4ID0gSW5mLCB5ID0gb3ZlcmFsbF9tZWFuX3ZhbHVlLCBsYWJlbCA9ICJDQUlSIiwgDQogICAgICAgICAgIGhqdXN0ID0gMSwgdmp1c3QgPSAtMC41LCBjb2xvciA9ICJkYXJrcmVkIiwgc2l6ZSA9IDQpICsNCg0KICBsYWJzKA0KICAgIHRpdGxlID0gZHluYW1pY190aXRsZSwNCiAgICB4ID0gIlllYXIiLA0KICAgIHkgPSAiQ0FJUiBWYWx1ZSAoJSkiLA0KICAgIGNvbG9yID0gIkNBSVIgUGVyaW9kIiwNCiAgICBjYXB0aW9uID0gZHluYW1pY19jYXB0aW9uDQogICAgKSArDQogIA0KICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gY3VzdG9tX2NvbG9ycykgKyAgIyBTZXQgY29sb3JzIGZvciBlYWNoIENBSVIgUGVyaW9kDQogIGNvb3JkX2NhcnRlc2lhbih5bGltID0gYyh5X21pbiwgeV9tYXgpKSArICMgQXBwbHkgZHluYW1pYyB5LWF4aXMgbGltaXRzDQogIHNjYWxlX3hfY29udGludW91cygNCiAgICBsaW1pdHMgPSBjKHN0YXJ0X3llYXIsIGVuZF95ZWFyICsgMiksICMgUmVzdHJpY3RzIHgtYXhpcyBkYXRhIA0KICAgIGJyZWFrcyA9IHNlcShsaW1pdHNfc3RhcnRfeWVhciwgbGltaXRzX2VuZF95ZWFyLCA1KSAjIFNldHMgTWFqb3IgeC1heGlzICANCiAgKSArICAjIFJlc3RyaWN0ICYgU2V0IE1ham9yIHgtYXhpcyBsaW5lcyANCiAgDQogIHRoZW1lX21pbmltYWwoKSArDQogIHRoZW1lKA0KICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUsIHNpemUgPSAyMCksICAgICAgICAgIyBMYXJnZXIgdGl0bGUgZm9udA0KICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQpLCAgICAgICAgICAgICAgICAgICAgIyBMYXJnZXIgeC1heGlzIGxhYmVsIGZvbnQNCiAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0KSwgICAgICAgICAgICAgICAgICAgICMgTGFyZ2VyIHktYXhpcyBsYWJlbCBmb250DQogICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxLCBzaXplID0gMTQpLCAgIyBMYXJnZXIgeC1heGlzIHRleHQNCiAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQpLCAgICAgICAgICAgICAgICAgICAgICMgTGFyZ2VyIHktYXhpcyB0ZXh0DQogICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCksICAgICAgICAgICAgICAgICAgICAjIExlZ2VuZCB0aXRsZSBzaXplDQogICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyKSwgICAgICAgICAgICAgICAgICAgICAjIExlZ2VuZCB0ZXh0IHNpemUNCiAgICBwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9saW5lKGxpbmV0eXBlID0gImRvdHRlZCIsIGNvbG9yID0gImJsYWNrIiksICAjIE1ham9yIGdyaWQgbGluZXMNCiAgICBwYW5lbC5ncmlkLm1pbm9yLnggPSBlbGVtZW50X2JsYW5rKCksICAgICAgICAgICAgICAgICAgICAgICMgTm8gbWlub3IgeCBncmlkIGxpbmVzDQogICAgYXhpcy50aWNrcy5sZW5ndGggPSB1bml0KC0wLjI1LCAiY20iKSwgICAgICAgICAgICAgICAgICAgICAgIyBJbmNyZWFzZSB0aWNrIGxlbmd0aA0KICAgIGF4aXMudGlja3MgPSBlbGVtZW50X2xpbmUoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMC41MCksICAgIyBEYXJrZXIgdGlja3MNCiAgICBheGlzLmxpbmUueCA9IGVsZW1lbnRfbGluZShjb2xvciA9ICJibGFjayIsIHNpemUgPSAwLjc1KSwgICMgRGFyayBib3R0b20gYm9yZGVyDQogICAgYXhpcy5saW5lLnkgPSBlbGVtZW50X2xpbmUoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMC43NSkgICAjIERhcmsgbGVmdCBib3JkZXINCiAgKQ0KDQojIFByaW50IHRoZSBwbG90IA0KcHJpbnQocDMpDQoNCmBgYA0KDQojIyMjIFNob3J0LVRlcm0NCg0KYGBge3IgbnJ0JGNwaV9yYXdfY2Fpcl9ncmFwaHNfc2hvcnQsIGZpZy53aWR0aD0xMCwgZmlnLmhlaWdodD03LCBldmFsPVRSVUUsIGVjaG89RkFMU0V9DQoNCmNhdCgiXG5cbiMjIyMgQ29tcG91bmQgQXZlcmFnZSBJbmZsYXRpb24gUmF0ZXMgQWNyb3NzIFNob3J0LVRlcm0gUm9sbGluZyBQZXJpb2RzIFxuIikNCg0KIyBGaWx0ZXIgZGF0YSBmb3IgU2hvcnQtVGVybSBDQUlSICg1LVllYXIgYW5kIDEwLVllYXIpDQpzaG9ydHRlcm1fZGF0YSA8LSBucnRfbG9uZyAlPiUNCiAgZmlsdGVyKENBSVJfUGVyaW9kICVpbiUgYygiNS1ZZWFyIENBSVIiLCAiMTAtWWVhciBDQUlSIikpDQoNCg0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiMjIFBMT1QgRlVMTCBXSVRIT1VUIExJTUlUUw0KDQojIERlZmluZSBzdGFydCBhbmQgZW5kIHllYXJzDQpzdGFydF95ZWFyIDwtIDE5MTUNCmVuZF95ZWFyIDwtIDIwMjQNCnllYXJfcmFuZ2UgPC0gZW5kX3llYXIgLSBzdGFydF95ZWFyICsgMSAgIyBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiB5ZWFycw0KDQojIERlZmluZSBicmVha3Mgcm91bmRlZCBhcHByb3ByaWF0ZWx5DQpsaW1pdHNfc3RhcnRfeWVhciA8LSBmbG9vcihzdGFydF95ZWFyIC8gNSkgKiA1ICAjIFJvdW5kIGRvd24gdG8gdGhlIG5lYXJlc3QgbXVsdGlwbGUgb2YgNQ0KbGltaXRzX2VuZF95ZWFyIDwtIGNlaWxpbmcoZW5kX3llYXIgLyA1KSAqIDUgICAjIFJvdW5kIHVwIHRvIHRoZSBuZWFyZXN0IG11bHRpcGxlIG9mIDUNCg0KIyBDcmVhdGUgZHluYW1pYyB0aXRsZSBhbmQgY2FwdGlvbg0KZHluYW1pY190aXRsZSA8LSBwYXN0ZTAoIkNBSVIgQWNyb3NzIFNob3J0LVRlcm0gUGVyaW9kcyBPdmVyICIseWVhcl9yYW5nZSwgIiBZZWFycyAoIiwgc3RhcnRfeWVhciwgIi0iLCBlbmRfeWVhciwgIikiKQ0KZHluYW1pY19jYXB0aW9uIDwtIHBhc3RlMCgiQ1BJIENvbXBvdW5kIEF2ZXJhZ2UgSW5mbGF0aW9uIFJhdGVzIGZvciBBbGwgVXJiYW4gQ29uc3VtZXJzLCBEYXRhc2V0ICgiLCBtaW5feWVhciwgIi0iLCBtYXhfeWVhciwgIikiKQ0KDQoNCiMgQ3JlYXRlIHRoZSBmdWxsLCBub24tZmlsdGVyZWQgeC1heGlzIHBsb3Qgd2l0aCBkeW5hbWljIHggcGxhY2VtZW50IGZvciBhbm5vdGF0aW9ucw0KcDFfc2hvcnR0ZXJtIDwtIGdncGxvdChzaG9ydHRlcm1fZGF0YSwgYWVzKHggPSBhcy5pbnRlZ2VyKERhdGUpLCB5ID0gQ0FJUl9WYWx1ZSwgY29sb3IgPSBDQUlSX1BlcmlvZCkpICsNCg0KICAjIEFkZCBzaGFkZWQgYXJlYXMgZm9yIGJhY2tncm91bmQgZWZmZWN0DQogIGdlb21fcmVjdChhZXMoeG1pbiA9IC1JbmYsIHhtYXggPSBJbmYsIHltaW4gPSBvdmVyYWxsX21pbl9jYWlyX3JhbmdlLCB5bWF4ID0gb3ZlcmFsbF9tYXhfY2Fpcl9yYW5nZSksIGZpbGwgPSAibGlnaHRncmVlbiIsIGFscGhhID0gMC4wMDc1KSArDQogIGdlb21fcmVjdChhZXMoeG1pbiA9IC1JbmYsIHhtYXggPSBJbmYsIHltaW4gPSAtSW5mLCB5bWF4ID0gb3ZlcmFsbF9taW5fY2Fpcl9yYW5nZSksIGZpbGwgPSAibGlnaHRjb3JhbCIsIGFscGhhID0gMC4wMDc1KSArDQogIGdlb21fcmVjdChhZXMoeG1pbiA9IC1JbmYsIHhtYXggPSBJbmYsIHltaW4gPSBvdmVyYWxsX21heF9jYWlyX3JhbmdlLCB5bWF4ID0gSW5mKSwgZmlsbCA9ICJsaWdodGNvcmFsIiwgYWxwaGEgPSAwLjAwNzUpICsNCiAgDQogICMgUGxvdCBsaW5lcyBmb3IgZWFjaCBDQUlSIFBlcmlvZA0KICBnZW9tX2xpbmUoc2l6ZSA9IDEuMCwgYWxwaGEgPSAzLjApICsgICAgICAgIyBMaW5lIGZvciBlYWNoIENBSVINCiAgZ2VvbV9wb2ludChzaXplID0gMS4wLCBhbHBoYSA9IDMuMCkgKyAgICAgICAjIFBvaW50cyBmb3IgZWFjaCBDQUlSDQogIA0KICAjIEFkZCB0YXJnZXQgYW5kIHJhbmdlIGxpbmVzDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IHRhcmdldF92YWx1ZSwgY29sb3IgPSAiZGFya2JsdWUiLCBsaW5ldHlwZSA9ICJkYXNoZWQiKSArDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IG92ZXJhbGxfbWluX2NhaXJfcmFuZ2UsIGNvbG9yID0gImRhcmtncmVlbiIsIGxpbmV0eXBlID0gInNvbGlkIikgKw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSBvdmVyYWxsX21heF9jYWlyX3JhbmdlLCBjb2xvciA9ICJkYXJrZ3JlZW4iLCBsaW5ldHlwZSA9ICJzb2xpZCIpICsNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gb3ZlcmFsbF9tZWFuX3ZhbHVlLCBjb2xvciA9ICJkYXJrcmVkIiwgbGluZXR5cGUgPSAiZGFzaGVkIikgKw0KICANCiAgIyBEeW5hbWljIHJpZ2h0LWFsaWduZWQgcGxhY2VtZW50IGZvciBhbm5vdGF0aW9ucw0KICBhbm5vdGF0ZSgidGV4dCIsIHggPSBJbmYsIHkgPSB0YXJnZXRfdmFsdWUsIGxhYmVsID0gIlRhcmdldCIsIA0KICAgICAgICAgICBoanVzdCA9IDEsIHZqdXN0ID0gLTAuNSwgY29sb3IgPSAiZGFya2JsdWUiLCBzaXplID0gNCkgKw0KICBhbm5vdGF0ZSgidGV4dCIsIHggPSBJbmYsIHkgPSBvdmVyYWxsX21pbl9jYWlyX3JhbmdlLCBsYWJlbCA9ICJNaW4gQ0FJUiIsIA0KICAgICAgICAgICBoanVzdCA9IDEsIHZqdXN0ID0gLTAuNSwgY29sb3IgPSAiZGFya2dyZWVuIiwgc2l6ZSA9IDQpICsNCiAgYW5ub3RhdGUoInRleHQiLCB4ID0gSW5mLCB5ID0gb3ZlcmFsbF9tYXhfY2Fpcl9yYW5nZSwgbGFiZWwgPSAiTWF4IENBSVIiLCANCiAgICAgICAgICAgaGp1c3QgPSAxLCB2anVzdCA9IC0wLjUsIGNvbG9yID0gImRhcmtncmVlbiIsIHNpemUgPSA0KSArDQogIGFubm90YXRlKCJ0ZXh0IiwgeCA9IEluZiwgeSA9IG92ZXJhbGxfbWVhbl92YWx1ZSwgbGFiZWwgPSAiQ0FJUiIsIA0KICAgICAgICAgICBoanVzdCA9IDEsIHZqdXN0ID0gLTAuNSwgY29sb3IgPSAiZGFya3JlZCIsIHNpemUgPSA0KSArDQoNCiAgbGFicygNCiAgICB0aXRsZSA9IGR5bmFtaWNfdGl0bGUsDQogICAgeCA9ICJZZWFyIiwNCiAgICB5ID0gIkNBSVIgVmFsdWUgKCUpIiwNCiAgICBjb2xvciA9ICJDQUlSIFBlcmlvZCIsDQogICAgY2FwdGlvbiA9IGR5bmFtaWNfY2FwdGlvbg0KICAgICkgKw0KICANCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGN1c3RvbV9jb2xvcnMpICsgICMgU2V0IGNvbG9ycyBmb3IgZWFjaCBDQUlSIFBlcmlvZA0KICBzY2FsZV94X2NvbnRpbnVvdXMoDQogICAgbGltaXRzID0gYyhzdGFydF95ZWFyLCBlbmRfeWVhciArIDIpLCAjIFNldCBkYXRhIGZvciB4LWF4aXMgDQogICAgYnJlYWtzID0gc2VxKGxpbWl0c19zdGFydF95ZWFyLCBsaW1pdHNfZW5kX3llYXIsIDUpICMgU2V0IGluY3JlbWVudHMgZm9yIHgtYXhpcw0KICAgICkgKyAgIyBSZXN0cmljdCAmIFNldCBNYWpvciB4LWF4aXMgbGluZXMgZm9yIGVhY2ggeWVhcg0KICANCiAgdGhlbWVfbWluaW1hbCgpICsNCiAgdGhlbWUoDQogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSwgc2l6ZSA9IDIwKSwgICAgICAgICAjIExhcmdlciB0aXRsZSBmb250DQogICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCksICAgICAgICAgICAgICAgICAgICAjIExhcmdlciB4LWF4aXMgbGFiZWwgZm9udA0KICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQpLCAgICAgICAgICAgICAgICAgICAgIyBMYXJnZXIgeS1heGlzIGxhYmVsIGZvbnQNCiAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEsIHNpemUgPSAxNCksICAjIExhcmdlciB4LWF4aXMgdGV4dA0KICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCksICAgICAgICAgICAgICAgICAgICAgIyBMYXJnZXIgeS1heGlzIHRleHQNCiAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0KSwgICAgICAgICAgICAgICAgICAgICMgTGVnZW5kIHRpdGxlIHNpemUNCiAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIpLCAgICAgICAgICAgICAgICAgICAgICMgTGVnZW5kIHRleHQgc2l6ZQ0KICAgIHBhbmVsLmdyaWQubWFqb3IgPSBlbGVtZW50X2xpbmUobGluZXR5cGUgPSAiZG90dGVkIiwgY29sb3IgPSAiYmxhY2siKSwgICMgTWFqb3IgZ3JpZCBsaW5lcw0KICAgIHBhbmVsLmdyaWQubWlub3IueCA9IGVsZW1lbnRfYmxhbmsoKSwgICAgICAgICAgICAgICAgICAgICAgIyBObyBtaW5vciB4IGdyaWQgbGluZXMNCiAgICBheGlzLnRpY2tzLmxlbmd0aCA9IHVuaXQoLTAuMjUsICJjbSIpLCAgICAgICAgICAgICAgICAgICAgICAjIEluY3JlYXNlIHRpY2sgbGVuZ3RoDQogICAgYXhpcy50aWNrcyA9IGVsZW1lbnRfbGluZShjb2xvciA9ICJibGFjayIsIHNpemUgPSAwLjUwKSwgICAjIERhcmtlciB0aWNrcw0KICAgIGF4aXMubGluZS54ID0gZWxlbWVudF9saW5lKGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDAuNzUpLCAgIyBEYXJrIGJvdHRvbSBib3JkZXINCiAgICBheGlzLmxpbmUueSA9IGVsZW1lbnRfbGluZShjb2xvciA9ICJibGFjayIsIHNpemUgPSAwLjc1KSAgICMgRGFyayBsZWZ0IGJvcmRlcg0KICApDQoNCg0KIyBQcmludCB0aGUgcGxvdCANCnByaW50KHAxX3Nob3J0dGVybSkNCg0KYGBgDQoNCg0KIyMjIyBMb25nLVRlcm0NCg0KYGBge3IgbnJ0JGNwaV9yYXdfY2Fpcl9ncmFwaHNfbG9uZywgZmlnLndpZHRoPTEwLCBmaWcuaGVpZ2h0PTcsIGV2YWw9VFJVRSwgZWNobz1GQUxTRX0NCg0KY2F0KCJcblxuIyMjIyBDb21wb3VuZCBBdmVyYWdlIEluZmxhdGlvbiBSYXRlcyBBY3Jvc3MgTG9uZy1UZXJtIFJvbGxpbmcgUGVyaW9kcyBcbiIpDQoNCiMgRmlsdGVyIGRhdGEgZm9yIExvbmctVGVybSBDQUlSICgyMC1ZZWFyIGFuZCAzMC1ZZWFyKQ0KbG9uZ3Rlcm1fZGF0YSA8LSBucnRfbG9uZyAlPiUNCiAgZmlsdGVyKENBSVJfUGVyaW9kICVpbiUgYygiMjAtWWVhciBDQUlSIiwgIjMwLVllYXIgQ0FJUiIpKQ0KDQoNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQojIyBQTE9UIEZVTEwgV0lUSE9VVCBMSU1JVFMNCg0KIyBEZWZpbmUgc3RhcnQgYW5kIGVuZCB5ZWFycw0Kc3RhcnRfeWVhciA8LSAxOTMwDQplbmRfeWVhciA8LSAyMDI0DQp5ZWFyX3JhbmdlIDwtIGVuZF95ZWFyIC0gc3RhcnRfeWVhciArIDEgICMgQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgeWVhcnMNCg0KIyBEZWZpbmUgYnJlYWtzIHJvdW5kZWQgYXBwcm9wcmlhdGVseQ0KbGltaXRzX3N0YXJ0X3llYXIgPC0gZmxvb3Ioc3RhcnRfeWVhciAvIDUpICogNSAgIyBSb3VuZCBkb3duIHRvIHRoZSBuZWFyZXN0IG11bHRpcGxlIG9mIDUNCmxpbWl0c19lbmRfeWVhciA8LSBjZWlsaW5nKGVuZF95ZWFyIC8gNSkgKiA1ICAgIyBSb3VuZCB1cCB0byB0aGUgbmVhcmVzdCBtdWx0aXBsZSBvZiA1DQoNCiMgQ3JlYXRlIGR5bmFtaWMgdGl0bGUgYW5kIGNhcHRpb24NCmR5bmFtaWNfdGl0bGUgPC0gcGFzdGUwKCJDQUlSIEFjcm9zcyBMb25nLVRlcm0gUGVyaW9kcyBPdmVyICIseWVhcl9yYW5nZSwgIiBZZWFycyAoIiwgc3RhcnRfeWVhciwgIi0iLCBlbmRfeWVhciwgIikiKQ0KZHluYW1pY19jYXB0aW9uIDwtIHBhc3RlMCgiQ1BJIENvbXBvdW5kIEF2ZXJhZ2UgSW5mbGF0aW9uIFJhdGVzIGZvciBBbGwgVXJiYW4gQ29uc3VtZXJzLCBEYXRhc2V0ICgiLCBtaW5feWVhciwgIi0iLCBtYXhfeWVhciwgIikiKQ0KDQojIENyZWF0ZSB0aGUgZnVsbCwgbm9uLWZpbHRlcmVkIHgtYXhpcyBwbG90IHdpdGggZHluYW1pYyB4IHBsYWNlbWVudCBmb3IgYW5ub3RhdGlvbnMNCnAxX2xvbmd0ZXJtIDwtIGdncGxvdChsb25ndGVybV9kYXRhLCBhZXMoeCA9IGFzLmludGVnZXIoRGF0ZSksIHkgPSBDQUlSX1ZhbHVlLCBjb2xvciA9IENBSVJfUGVyaW9kKSkgKw0KDQogICMgQWRkIHNoYWRlZCBhcmVhcyBmb3IgYmFja2dyb3VuZCBlZmZlY3QNCiAgZ2VvbV9yZWN0KGFlcyh4bWluID0gLUluZiwgeG1heCA9IEluZiwgeW1pbiA9IG92ZXJhbGxfbWluX2NhaXJfcmFuZ2UsIHltYXggPSBvdmVyYWxsX21heF9jYWlyX3JhbmdlKSwgZmlsbCA9ICJsaWdodGdyZWVuIiwgYWxwaGEgPSAwLjAwNzUpICsNCiAgZ2VvbV9yZWN0KGFlcyh4bWluID0gLUluZiwgeG1heCA9IEluZiwgeW1pbiA9IC1JbmYsIHltYXggPSBvdmVyYWxsX21pbl9jYWlyX3JhbmdlKSwgZmlsbCA9ICJsaWdodGNvcmFsIiwgYWxwaGEgPSAwLjAwNzUpICsNCiAgZ2VvbV9yZWN0KGFlcyh4bWluID0gLUluZiwgeG1heCA9IEluZiwgeW1pbiA9IG92ZXJhbGxfbWF4X2NhaXJfcmFuZ2UsIHltYXggPSBJbmYpLCBmaWxsID0gImxpZ2h0Y29yYWwiLCBhbHBoYSA9IDAuMDA3NSkgKw0KICANCiAgIyBQbG90IGxpbmVzIGZvciBlYWNoIENBSVIgUGVyaW9kDQogIGdlb21fbGluZShzaXplID0gMS4wLCBhbHBoYSA9IDMuMCkgKyAgICAgICAjIExpbmUgZm9yIGVhY2ggQ0FJUg0KICBnZW9tX3BvaW50KHNpemUgPSAxLjAsIGFscGhhID0gMy4wKSArICAgICAgICMgUG9pbnRzIGZvciBlYWNoIENBSVINCiAgDQogICMgQWRkIHRhcmdldCBhbmQgcmFuZ2UgbGluZXMNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gdGFyZ2V0X3ZhbHVlLCBjb2xvciA9ICJkYXJrYmx1ZSIsIGxpbmV0eXBlID0gImRhc2hlZCIpICsNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gb3ZlcmFsbF9taW5fY2Fpcl9yYW5nZSwgY29sb3IgPSAiZGFya2dyZWVuIiwgbGluZXR5cGUgPSAic29saWQiKSArDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IG92ZXJhbGxfbWF4X2NhaXJfcmFuZ2UsIGNvbG9yID0gImRhcmtncmVlbiIsIGxpbmV0eXBlID0gInNvbGlkIikgKw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSBvdmVyYWxsX21lYW5fdmFsdWUsIGNvbG9yID0gImRhcmtyZWQiLCBsaW5ldHlwZSA9ICJkYXNoZWQiKSArDQogIA0KICAjIER5bmFtaWMgcmlnaHQtYWxpZ25lZCBwbGFjZW1lbnQgZm9yIGFubm90YXRpb25zDQogIGFubm90YXRlKCJ0ZXh0IiwgeCA9IEluZiwgeSA9IHRhcmdldF92YWx1ZSwgbGFiZWwgPSAiVGFyZ2V0IiwgDQogICAgICAgICAgIGhqdXN0ID0gMSwgdmp1c3QgPSAtMC41LCBjb2xvciA9ICJkYXJrYmx1ZSIsIHNpemUgPSA0KSArDQogIGFubm90YXRlKCJ0ZXh0IiwgeCA9IEluZiwgeSA9IG92ZXJhbGxfbWluX2NhaXJfcmFuZ2UsIGxhYmVsID0gIk1pbiBDQUlSIiwgDQogICAgICAgICAgIGhqdXN0ID0gMSwgdmp1c3QgPSAtMC41LCBjb2xvciA9ICJkYXJrZ3JlZW4iLCBzaXplID0gNCkgKw0KICBhbm5vdGF0ZSgidGV4dCIsIHggPSBJbmYsIHkgPSBvdmVyYWxsX21heF9jYWlyX3JhbmdlLCBsYWJlbCA9ICJNYXggQ0FJUiIsIA0KICAgICAgICAgICBoanVzdCA9IDEsIHZqdXN0ID0gLTAuNSwgY29sb3IgPSAiZGFya2dyZWVuIiwgc2l6ZSA9IDQpICsNCiAgYW5ub3RhdGUoInRleHQiLCB4ID0gSW5mLCB5ID0gb3ZlcmFsbF9tZWFuX3ZhbHVlLCBsYWJlbCA9ICJDQUlSIiwgDQogICAgICAgICAgIGhqdXN0ID0gMSwgdmp1c3QgPSAtMC41LCBjb2xvciA9ICJkYXJrcmVkIiwgc2l6ZSA9IDQpICsNCg0KICBsYWJzKA0KICAgIHRpdGxlID0gZHluYW1pY190aXRsZSwNCiAgICB4ID0gIlllYXIiLA0KICAgIHkgPSAiQ0FJUiBWYWx1ZSAoJSkiLA0KICAgIGNvbG9yID0gIkNBSVIgUGVyaW9kIiwNCiAgICBjYXB0aW9uID0gZHluYW1pY19jYXB0aW9uDQogICAgKSArDQogIA0KICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gY3VzdG9tX2NvbG9ycykgKyAgIyBTZXQgY29sb3JzIGZvciBlYWNoIENBSVIgUGVyaW9kDQogIHNjYWxlX3hfY29udGludW91cygNCiAgICBsaW1pdHMgPSBjKHN0YXJ0X3llYXIsIGVuZF95ZWFyICsgMiksICMgU2V0IGRhdGEgZm9yIHgtYXhpcyANCiAgICBicmVha3MgPSBzZXEobGltaXRzX3N0YXJ0X3llYXIsIGxpbWl0c19lbmRfeWVhciwgNSkgIyBTZXQgaW5jcmVtZW50cyBmb3IgeC1heGlzDQogICAgKSArICAjIFJlc3RyaWN0ICYgU2V0IE1ham9yIHgtYXhpcyBsaW5lcyBmb3IgZWFjaCB5ZWFyDQogIA0KICB0aGVtZV9taW5pbWFsKCkgKw0KICB0aGVtZSgNCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41LCBzaXplID0gMjApLCAgICAgICAgICMgTGFyZ2VyIHRpdGxlIGZvbnQNCiAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0KSwgICAgICAgICAgICAgICAgICAgICMgTGFyZ2VyIHgtYXhpcyBsYWJlbCBmb250DQogICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCksICAgICAgICAgICAgICAgICAgICAjIExhcmdlciB5LWF4aXMgbGFiZWwgZm9udA0KICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSwgc2l6ZSA9IDE0KSwgICMgTGFyZ2VyIHgtYXhpcyB0ZXh0DQogICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0KSwgICAgICAgICAgICAgICAgICAgICAjIExhcmdlciB5LWF4aXMgdGV4dA0KICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQpLCAgICAgICAgICAgICAgICAgICAgIyBMZWdlbmQgdGl0bGUgc2l6ZQ0KICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiksICAgICAgICAgICAgICAgICAgICAgIyBMZWdlbmQgdGV4dCBzaXplDQogICAgcGFuZWwuZ3JpZC5tYWpvciA9IGVsZW1lbnRfbGluZShsaW5ldHlwZSA9ICJkb3R0ZWQiLCBjb2xvciA9ICJibGFjayIpLCAgIyBNYWpvciBncmlkIGxpbmVzDQogICAgcGFuZWwuZ3JpZC5taW5vci54ID0gZWxlbWVudF9ibGFuaygpLCAgICAgICAgICAgICAgICAgICAgICAjIE5vIG1pbm9yIHggZ3JpZCBsaW5lcw0KICAgIGF4aXMudGlja3MubGVuZ3RoID0gdW5pdCgtMC4yNSwgImNtIiksICAgICAgICAgICAgICAgICAgICAgICMgSW5jcmVhc2UgdGljayBsZW5ndGgNCiAgICBheGlzLnRpY2tzID0gZWxlbWVudF9saW5lKGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDAuNTApLCAgICMgRGFya2VyIHRpY2tzDQogICAgYXhpcy5saW5lLnggPSBlbGVtZW50X2xpbmUoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMC43NSksICAjIERhcmsgYm90dG9tIGJvcmRlcg0KICAgIGF4aXMubGluZS55ID0gZWxlbWVudF9saW5lKGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDAuNzUpICAgIyBEYXJrIGxlZnQgYm9yZGVyDQogICkNCg0KIyBQcmludCB0aGUgcGxvdCANCnByaW50KHAxX2xvbmd0ZXJtKQ0KDQpgYGANCg0KDQojIElOREVYRVMgDQoNCiMjIEdlbmVyYWwgUG9ydGZvbGlvIFR5cGVzDQoNCioqQ29uc2VydmF0aXZlIFBvcnRmb2xpb3MqKg0KDQpDb25zZXJ2YXRpdmUgaW52ZXN0bWVudCBzdHJhdGVnaWVzIGZvY3VzIG9uIGNhcGl0YWwgcHJlc2VydmF0aW9uIHdpdGggYW5udWFsIGdyb3d0aCB0YXJnZXRzIG9mIDMlLTUlLiBUeXBpY2FsbHksIHRoZXNlIHBvcnRmb2xpb3MgY29uc2lzdCBvZiAyMCUtNDAlIGVxdWl0aWVzLCB3aXRoIHRoZSBtYWpvcml0eSBhbGxvY2F0ZWQgdG8gYm9uZHMgb3Igb3RoZXIgaW5jb21lLWdlbmVyYXRpbmcgYXNzZXRzLiBUaGV5IGFyZSBjaGFyYWN0ZXJpemVkIGJ5IHJlZHVjZWQgdm9sYXRpbGl0eSBhbmQgbGltaXRlZCBkcmF3ZG93bnMgKFx+MTAlLTIwJSksIG1ha2luZyB0aGVtIHN1aXRhYmxlIGZvciByaXNrLWF2ZXJzZSBpbmRpdmlkdWFscyBvciB0aG9zZSBuZWFyaW5nIHJldGlyZW1lbnQuIEZvciBtb3JlIG9uIGNvbnN0cnVjdGluZyBjb25zZXJ2YXRpdmUgcG9ydGZvbGlvcywgc2VlIFZhbmd1YXJkJ3MgQXNzZXQgQWxsb2NhdGlvbiBHdWlkZSAoPGh0dHBzOi8vaW52ZXN0b3IudmFuZ3VhcmQuY29tL2ludmVzdG9yLXJlc291cmNlcy1lZHVjYXRpb24vZWR1Y2F0aW9uL21vZGVsLXBvcnRmb2xpby1hbGxvY2F0aW9uPikuDQoNCioqTW9kZXJhdGUgUG9ydGZvbGlvcyoqDQoNCk1vZGVyYXRlIHBvcnRmb2xpb3MgdHlwaWNhbGx5IHRhcmdldCBhbm51YWwgZ3Jvd3RoIHJhdGVzIG9mIDUlLTclLCBiYWxhbmNpbmcgcmlzayBhbmQgcmV0dXJuLiBUaGVzZSBwb3J0Zm9saW9zIG9mdGVuIGFsbG9jYXRlIDYwJSB0byBzdG9ja3MsIHN1Y2ggYXMgU1BYLCBhbmQgNDAlIHRvIGZpeGVkLWluY29tZSBhc3NldHMgbGlrZSBib25kcy4gVGhlIGhpc3RvcmljYWwgcGVyZm9ybWFuY2Ugb2YgbW9kZXJhdGUgcG9ydGZvbGlvcyBwcm92aWRlcyBzdGFibGUsIGluZmxhdGlvbi1iZWF0aW5nIHJldHVybnMgd2l0aCBsb3dlciB2b2xhdGlsaXR5IHRoYW4gYWdncmVzc2l2ZSBzdHJhdGVnaWVzLCBtYWtpbmcgdGhlbSBpZGVhbCBmb3IgaW52ZXN0b3JzIHNlZWtpbmcgc3RlYWR5IGdyb3d0aCB3aXRob3V0IGhpZ2ggZXhwb3N1cmUgdG8gbWFya2V0IHN3aW5ncy4gVGhlIGNvbmNlcHQgYWxpZ25zIHdpdGggaW5zaWdodHMgcHJvdmlkZWQgYnkgTW9ybmluZ3N0YXIncyBQb3J0Zm9saW8gQW5hbHlzaXMgKDxodHRwczovL3d3dy5tb3JuaW5nc3Rhci5jb20vcHJvZHVjdHMvcG9ydGZvbGlvLWFuYWx5c2lzPikuDQoNCioqQWdncmVzc2l2ZSBQb3J0Zm9saW9zKioNCg0KQWdncmVzc2l2ZSBwb3J0Zm9saW9zIGFpbSBmb3IgYW5udWFsIGdyb3d0aCByYXRlcyBvZiAxMCUtMTIlIGFuZCBhcmUgaGVhdmlseSB3ZWlnaHRlZCBpbiBlcXVpdGllcywgc3VjaCBhcyBncm93dGggc3RvY2tzLCBzbWFsbC1jYXAgc3RvY2tzLCBhbmQgZW1lcmdpbmcgbWFya2V0cy4gV2hpbGUgdGhlc2UgcG9ydGZvbGlvcyBvZnRlbiBvdXRwZXJmb3JtIGJlbmNobWFya3MgbGlrZSBTUFggZHVyaW5nIGJ1bGwgbWFya2V0cywgdGhleSBjYXJyeSBzaWduaWZpY2FudCB2b2xhdGlsaXR5LCB3aXRoIHBvdGVudGlhbCBkcmF3ZG93bnMgb2YgXH41MCUgZHVyaW5nIGRvd250dXJucy4gVGhlc2Ugc3RyYXRlZ2llcyBhcmUgaWRlYWwgZm9yIGxvbmctdGVybSBpbnZlc3RvcnMgd2lsbGluZyB0byB3aXRoc3RhbmQgZmx1Y3R1YXRpb25zLiBMZWFybiBtb3JlIGFib3V0IGdyb3d0aC1mb2N1c2VkIGludmVzdGluZyB0aHJvdWdoIEludmVzdG9wZWRpYSdzIEFnZ3Jlc3NpdmUgR3Jvd3RoIFN0cmF0ZWdpZXMgKDxodHRwczovL3d3dy5pbnZlc3RvcGVkaWEuY29tL3Rlcm1zL2EvYWdncmVzc2l2ZWludmVzdG1lbnRzdHJhdGVneS5hc3A+KS4NCg0KIyMgSW5mbGF0aW9uIHRvIFNQWA0KDQpUaGUgU1BYIGRvZXMgbm90IGFkanVzdCBmb3IgaW5mbGF0aW9uLCBtZWFuaW5nIGl0cyBwZXJmb3JtYW5jZSByZWZsZWN0cyBub21pbmFsIHJldHVybnMuIEluZmxhdGlvbi1hZGp1c3RlZCAocmVhbCkgcmV0dXJucywgd2hpY2ggc3VidHJhY3QgaW5mbGF0aW9uIHJhdGVzIChlLmcuLCBcfjIlLTMlKSwgcHJvdmlkZSBhIGNsZWFyZXIgcGljdHVyZSBvZiBwdXJjaGFzaW5nIHBvd2VyLiBPbiBhdmVyYWdlLCBTUFggaXMgd2lkZWx5IGFjY2VwdGVkIHRvIGRlbGl2ZXIgXH42JS03JSByZWFsIGFubnVhbCByZXR1cm5zIGFmdGVyIGFjY291bnRpbmcgZm9yIGluZmxhdGlvbi4gRm9yIGhpc3RvcmljYWwgaW5zaWdodHMgb24gaW5mbGF0aW9uLWFkanVzdGVkIHJldHVybnMsIHRoZSBTaGlsbGVyIENBUEUgUmF0aW8gZGF0YXNldCAoPGh0dHBzOi8vc2hpbGxlcmRhdGEuY29tLz4pIGlzIGEgdmFsdWFibGUgcmVzb3VyY2UuIFRoaXMgZGF0YXNldCBhbGlnbnMgU1BYJ3Mgbm9taW5hbCBwcmljZXMgd2l0aCB0aGVpciByZWFsLCBpbmZsYXRpb24tYWRqdXN0ZWQgY291bnRlcnBhcnRzLCBvZmZlcmluZyBpbnNpZ2h0cyBpbnRvIGxvbmctdGVybSBtYXJrZXQgdmFsdWF0aW9ucy4gQWRkaXRpb25hbGx5LCB0aGUgVS5TLiBCdXJlYXUgb2YgTGFib3IgU3RhdGlzdGljcyBwcm92aWRlcyBhIENQSSBJbmZsYXRpb24gQ2FsY3VsYXRvciAoPGh0dHBzOi8vd3d3LmJscy5nb3YvZGF0YS9pbmZsYXRpb25fY2FsY3VsYXRvci5odG0+KSwgd2hpY2ggYWxsb3dzIHVzZXJzIHRvIGNhbGN1bGF0ZSB0aGUgYnV5aW5nIHBvd2VyIG9mIHRoZSBkb2xsYXIgYmV0d2VlbiBkaWZmZXJlbnQgZGF0ZXMsIGZhY2lsaXRhdGluZyBhIGJldHRlciB1bmRlcnN0YW5kaW5nIG9mIGluZmxhdGlvbidzIGltcGFjdCBvdmVyIHRpbWUuDQoNCioqQ29uY2x1c2lvbioqDQoNCkludmVzdG1lbnQgc3RyYXRlZ2llcyBhcmUgYWxpZ25lZCB0byBlYWNoIGluZGl2aWR1YWwgZ29hbHMgYW5kIHJpc2sgdG9sZXJhbmNlcy4gTW9kZXJhdGUgcG9ydGZvbGlvcyBiYWxhbmNlIGdyb3d0aCBhbmQgcmlzaywgY29uc2VydmF0aXZlIHN0cmF0ZWdpZXMgcHJpb3JpdGl6ZSBzdGFiaWxpdHksIGFuZCBhZ2dyZXNzaXZlIGFwcHJvYWNoZXMgZm9jdXMgb24gaGlnaCBncm93dGguIFVuZGVyc3RhbmRpbmcgaW5mbGF0aW9uJ3MgaW1wYWN0IG9uIG5vbWluYWwgcmV0dXJucyBpcyBjcml0aWNhbCBmb3IgZXZhbHVhdGluZyByZWFsIGludmVzdG1lbnQgcGVyZm9ybWFuY2UuIEZvciBhZGRpdGlvbmFsIGFuYWx5c2lzIHRvb2xzIGFuZCBoaXN0b3JpY2FsIGRhdGEsIGNvbnNpZGVyIHJldmlld2luZyBNb3JuaW5nc3RhciwgVmFuZ3VhcmQsIGFuZCB0aGUgU2hpbGxlciBDQVBFIFJhdGlvLg0KDQojIyBQcmVmZXJyZWQgVGFyZ2V0cw0KDQpUbyBlZmZlY3RpdmVseSBjb21wYXJlIGluZGV4ZXMgb3ZlciB0aW1lLCBpdCdzIGVzc2VudGlhbCB0byBhY2NvdW50IGZvciBpbmZsYXRpb24gcmF0ZXMuIEkndmUgc2V0IFN1YmplY3RpdmUgVGFyZ2V0IHJhdGVzIHVzaW5nIHRoZSBjYWxjdWxhdGVkIG92ZXJhbGwgaW5mbGF0aW9uIHJhdGUgKGByIGNwaV9jYWlyX3N1bW1hcnlfb3ZlcmFsbF9tZWFuX3MxOTEzX2UyMDIzX2F5ZGAlKSBhbmQgdGhlIGFzc3VtZWQgcG9ydGZvbGlvIGdyb3d0aCByYXRlcy4gQSBoaWdoZXIgaW5mbGF0aW9uIHJhdGUgYXMgYSB0YXJnZXQgc2VydmVzIGFzIGEgY29uc2VydmF0aXZlIGJ1ZmZlciBhZ2FpbnN0IGluZmxhdGlvbmFyeSB2b2xhdGlsaXR5LCBhaWRpbmcgaW4gdGhlIHNlbGVjdGlvbiBvZiBzdG9ja3Mgb3IgaW5kZXhlcyB0aGF0IHBlcmZvcm0gd2VsbCBpbiBwcmVzZXJ2aW5nIHB1cmNoYXNpbmcgcG93ZXIgZHVyaW5nIHBlcmlvZHMgb2YgZWxldmF0ZWQgaW5mbGF0aW9uLiBNb25pdG9yaW5nIHBlcmZvcm1hbmNlIGFnYWluc3QgdGhlc2UgYmVuY2htYXJrcyBoZWxwcyBuYXJyb3cgZG93biB3aGljaCBpbnZlc3RtZW50IG9yIGluZGV4IHByb3ZpZGVzIGJldHRlciBpbmZsYXRpb24tYWRqdXN0ZWQgb3V0Y29tZXMuIFRvIEVra28gd29yZHMgb25jZSBzYWlkLCAiSXQncyBub3QgZW5vdWdoIHRvIGdpdmUgcGVvcGxlIHdoYXQgdGhleSBuZWVkIHRvIHN1cnZpdmU7IHlvdSBoYXZlIHRvIGdpdmUgdGhlbSB3aGF0IHRoZXkgbmVlZCB0byBsaXZlLiINCg0KYGBge3Igc2V0X3RhcmdldHMsIGV2YWw9VFJVRSwgZWNobz1GQUxTRX0NCg0KaW50ZXJhY3RpdmVfcHJpbnQoY3BpX2NhaXJfc3VtbWFyeV9vdmVyYWxsX21lYW5fczE5MTNfZTIwMjNfYXlkKSAjIFRlc3QNCg0KIyBUYXJnZXQgUmF0ZSBBbmFseXNpcw0KdGFyZ2V0X2luZmxhdGlvbiA8LSBjcGlfY2Fpcl9zdW1tYXJ5X292ZXJhbGxfbWVhbl9zMTkxM19lMjAyM19heWQgIyBUYXJnZXQgcmF0ZSB0byBzdGF5IGFmbG9hdA0KdGFyZ2V0X2NvbnNlcnZhdGl2ZSA8LSAzICsgdGFyZ2V0X2luZmxhdGlvbiAjIFRhcmdldCBmb3IgMyUgZ3Jvd3RoIGluY2x1ZGluZyBpbmZsYXRpb24NCnRhcmdldF9tb2RlcmF0ZSA8LSA1ICsgdGFyZ2V0X2luZmxhdGlvbiAjIFRhcmdldCBmb3IgNSUgZ3Jvd3RoIGluY2x1ZGluZyBpbmZsYXRpb24NCnRhcmdldF9hZ2dyZXNzaXZlIDwtIDEwICsgdGFyZ2V0X2luZmxhdGlvbiAjIFRhcmdldCBmb3IgMTAlIGdyb3d0aCBpbmNsdWRpbmcgaW5mbGF0aW9uDQoNCiMgQ29tcGlsZSBzdGF0aXN0aWNzIGludG8gYSBsaXN0IGZvciBlYXN5IGNvbnZlcnNpb24gdG8gYSBkYXRhIGZyYW1lIHdpdGggZGVmaW5pdGlvbnMNCnByZWZlcnJlZF90YXJnZXRzIDwtIHRyaWJibGUoDQogIH4iVGFyZ2V0IFR5cGUiLCB+IlRhcmdldCBSYXRlIiwgfkRlZmluaXRpb24sDQogICJJbmZsYXRpb24iLCBwYXN0ZTAodGFyZ2V0X2luZmxhdGlvbiwgIiUiKSwgIk92ZXJhbGwsIEF2ZXJhZ2UgSW5mbGF0aW9uIFJhdGUgdG8gc3RheSBhZmxvYXQuIiwNCiAgIkNvbnNlcnZhdGl2ZSIsIHBhc3RlMCh0YXJnZXRfY29uc2VydmF0aXZlLCAiJSIpLCAiMyUgR3Jvd3RoIFJhdGUgbWluaW11bSwgaW5jbHVkaW5nIGluZmxhdGlvbi4iLA0KICAiTW9kZXJhdGUiLCBwYXN0ZTAodGFyZ2V0X21vZGVyYXRlLCAiJSIpLCAiNSUgR3Jvd3RoIFJhdGUgbWluaW11bSwgaW5jbHVkaW5nIGluZmxhdGlvbiIsDQogICJBZ2dyZXNzaXZlIiwgcGFzdGUwKHRhcmdldF9hZ2dyZXNzaXZlLCAiJSIpLCAiMTAlIEdyb3d0aCBSYXRlIG1pbmltdW0sIGluY2x1ZGluZyBpbmZsYXRpb24uIiwNCikNCg0KZm9ybWF0XzNjb2xfY3VzdG9tX3dpZHRocyhwcmVmZXJyZWRfdGFyZ2V0cywgY29sMV93aWR0aCA9ICIxNWVtIiwgY29sMl93aWR0aCA9ICIxMGVtIiwgY29sM193aWR0aCA9ICIzMGVtIiwgY2FwdGlvbiA9ICJHcm93dGggUmF0ZSBUYXJnZXRzIikNCg0KYGBgDQoNCiMjIEdsb3NzYXJ5DQoNCmBgYHtyIG5ydCRpbmRleGVzX21ldGF9DQoNCmZvcm1hdF8yY29sX2N1c3RvbV93aWR0aHMobnJ0JGluZGV4ZXNfbWV0YSwgY29sMV93aWR0aCA9ICIxMGVtIiwgY29sMl93aWR0aCA9ICI1MGVtIikNCmBgYA0KDQojIFNQWA0KDQpUaGUgUyZQIDUwMCwgc2hvcnQgZm9yIHRoZSBTdGFuZGFyZCAmIFBvb3IncyA1MDAgSW5kZXggYW5kIGNvbW1vbmx5IGtub3duIGJ5IGl0cyB0aWNrZXIgc3ltYm9sIFNQWCwgaXMgYSB3aWRlbHkgcmVjb2duaXplZCBiZW5jaG1hcmsgdGhhdCB0cmFja3MgdGhlIHBlcmZvcm1hbmNlIG9mIDUwMCBvZiB0aGUgbGFyZ2VzdCBwdWJsaWNseSB0cmFkZWQgY29tcGFuaWVzIGluIHRoZSBVbml0ZWQgU3RhdGVzLiBJdCByZXByZXNlbnRzIGEgYnJvYWQgc3BlY3RydW0gb2YgaW5kdXN0cmllcywgaW5jbHVkaW5nIHRlY2hub2xvZ3ksIGhlYWx0aGNhcmUsIGZpbmFuY2UsIGFuZCBlbmVyZ3ksIGFuZCBpcyBvZnRlbiB1c2VkIGFzIGEgZ2F1Z2Ugb2Ygb3ZlcmFsbCBtYXJrZXQgaGVhbHRoIGFuZCBlY29ub21pYyBwZXJmb3JtYW5jZS4gVGhlIGluZGV4IGlzIHdlaWdodGVkIGJ5IG1hcmtldCBjYXBpdGFsaXphdGlvbiwgbWVhbmluZyBjb21wYW5pZXMgd2l0aCBsYXJnZXIgbWFya2V0IHZhbHVlcyBoYXZlIGEgZ3JlYXRlciBpbXBhY3Qgb24gaXRzIHBlcmZvcm1hbmNlLiBBcyBhIGtleSBpbmRpY2F0b3IgZm9yIGludmVzdG9ycywgaXQgcmVmbGVjdHMgdGhlIGdyb3d0aCBhbmQgdm9sYXRpbGl0eSBvZiB0aGUgVS5TLiBzdG9jayBtYXJrZXQgYW5kIHNlcnZlcyBhcyBhIGJhc2VsaW5lIGZvciBtZWFzdXJpbmcgaW52ZXN0bWVudCByZXR1cm5zIGFjcm9zcyBhIHZhcmlldHkgb2YgcG9ydGZvbGlvcy4NCg0KIyMgU1BYIEdSDQoNCiMjIyBEYXRhDQoNClRoZSBTUFggZGF0YSBwcmVzZW50ZWQgaGVyZSwgc291cmNlZCBmcm9tIE11bHRwbCwgc3BhbnMgZnJvbSB0aGUgeWVhciAxOTAwIG9ud2FyZC4gTXVsdHBsIGlzIGEgZmluYW5jaWFsIGRhdGEgcGxhdGZvcm0gdGhhdCBwcm92aWRlcyBoaXN0b3JpY2FsIGFuZCBjdXJyZW50IG1ldHJpY3MgZm9yIFNQWCwgaW5jbHVkaW5nIHByaWNlcywgcHJpY2UtdG8tZWFybmluZ3MgcmF0aW9zLCBhbmQgaW5mbGF0aW9uLWFkanVzdGVkIHZhbHVlcywgb2ZmZXJpbmcgaW52ZXN0b3JzIGluc2lnaHRzIGludG8gbWFya2V0IHRyZW5kcyBvdmVyIHRpbWUuIEVhY2ggIkNsb3NlIiAoQ2xvc2luZyBQcmljZSkgcmVwcmVzZW50cyB0aGUgYXZlcmFnZSBvZiBlYWNoIG1vbnRoJ3MgY2xvc2luZyBwcmljZXM7IGZvciBleGFtcGxlLCB0aGUgcHJpY2UgZm9yIEphbnVhcnkgMSwgMjAyNCwgcmVmbGVjdHMgdGhlIGF2ZXJhZ2Ugb2YgYWxsIEphbnVhcnkgY2xvc2luZyBwcmljZXMuIEJ5IGNyb3NzLXJlZmVyZW5jaW5nIHRoZSBKYW51YXJ5IDEsIDIwMjQsIG1vbnRobHkgY2xvc2UgZnJvbSBNdWx0cGwgd2l0aCB0aGUgYXZlcmFnZSBvZiBhbGwgSmFudWFyeSAyMDI0IGNsb3NpbmcgcHJpY2VzIGZyb20gV2VidWxsIFRyYWRpbmcgUGxhdGZvcm0gKGFuIHVucmVsYXRlZCBwbGF0Zm9ybSksIHdlIGNhbiBhc3N1bWUgdGhlc2UgZGF0YWJhc2VzIGFyZSBhY2N1cmF0ZSBhbmQgY29uc2lzdGVudCB3aXRoIG90aGVyIG1ham9yIGZpbmFuY2lhbCBkYXRhIHNvdXJjZXMuDQoNCkRhdGEgU291cmNlOiBgciBucnYkc291cmNlX3NweF9tdWx0cGxgDQoNCmBgYHtyIHNweF9yYXcsIGV2YWw9VFJVRSwgZWNobz1GQUxTRX0NCg0KIyBEaXNwbGF5IHRoZSBzdHJ1Y3R1cmUgb2YgdGhlIGRhdGFzZXQgdG8gY29uZmlybSBjb2x1bW4gbmFtZXMNCmludGVyYWN0aXZlX3N0cihucnQkc3B4X3JhdykNCg0KbGlicmFyeShkcGx5cikNCmxpYnJhcnkobHVicmlkYXRlKSAgIyBGb3IgZGF0ZSBtYW5pcHVsYXRpb24NCmxpYnJhcnkoc2NhbGVzKQ0KbGlicmFyeShzdHJpbmdyKQ0KDQojIEVuc3VyZSB0aGUgJ0RhdGUnIGNvbHVtbiBpcyBvZiBEYXRlIGNsYXNzDQpzcHhfcmF3IDwtIG5ydCRzcHhfcmF3ICU+JQ0KICBtdXRhdGUoRGF0ZSA9IGFzLkRhdGUoRGF0ZSwgZm9ybWF0ID0gIiVZLSVtLSVkIikpDQoNCiMgRmluZCB0aGUgbWluaW11bSBhbmQgbWF4aW11bSB5ZWFyDQptaW5feWVhciA8LSBmb3JtYXQobWluKHNweF9yYXckRGF0ZSwgbmEucm0gPSBUUlVFKSwgIiVZIikNCm1heF95ZWFyIDwtIGZvcm1hdChtYXgoc3B4X3JhdyREYXRlLCBuYS5ybSA9IFRSVUUpLCAiJVkiKQ0KaW50ZXJhY3RpdmVfcHJpbnQobWluX3llYXIpDQppbnRlcmFjdGl2ZV9wcmludChtYXhfeWVhcikNCg0KIyBVcGRhdGUgZGF0YSBmcmFtZSB3aXRoIHByb3BlciBkYXRlIGFuZCBwZXJjZW50YWdlIGhhbmRsaW5nDQpzcHhfcmF3IDwtIHNweF9yYXcgJT4lDQogIG11dGF0ZSgNCiAgICAjIENvbnZlcnQgQ2xvc2UgRGF0ZSB0byAiWVlZWS1NTS1ERCIgZm9ybWF0DQogICAgYERhdGVgID0gZm9ybWF0KGFzLkRhdGUoYXMuY2hhcmFjdGVyKGBEYXRlYCksIG9yaWdpbiA9ICIxOTcwLTAxLTAxIiksICIlWS0lbS0lZCIpLA0KDQogICAgIyBFbnN1cmUgQ2xvc2UgaXMgYSBudW1iZXIgZm9ybWF0dGVkIHRvIDIgZGVjaW1hbCBwbGFjZXMNCiAgICBgQ2xvc2VgID0gbnVtYmVyKGFzLm51bWVyaWMoZ3N1YigiLCIsICIiLCBDbG9zZSkpLCBiaWcubWFyayA9ICIsIiwgZGVjaW1hbC5tYXJrID0gIi4iLCBhY2N1cmFjeSA9IDAuMDEpLA0KDQogICAgIyBDbGVhbiBhbmQgaGFuZGxlIHBlcmNlbnRhZ2UgY29sdW1ucw0KICAgIGFjcm9zcygzOjMsIH4gew0KICAgICAgdmFsdWUgPC0gZ3N1YigiWywlXFxzXSIsICIiLCAuKSAgIyBSZW1vdmUgJSwgY29tbWFzLCBhbmQgc3BhY2VzDQogICAgICBudW1lcmljX3ZhbHVlIDwtIHN1cHByZXNzV2FybmluZ3MoYXMubnVtZXJpYyh2YWx1ZSkpICAjIENvbnZlcnQgdG8gbnVtZXJpYw0KICAgICAgaWZlbHNlKA0KICAgICAgICAhaXMubmEobnVtZXJpY192YWx1ZSksIA0KICAgICAgICBwYXN0ZTAoZm9ybWF0KHJvdW5kKG51bWVyaWNfdmFsdWUqMTAwLCAyKSwgYmlnLm1hcmsgPSAiLCIsIHNjaWVudGlmaWMgPSBGQUxTRSksICIlIiksICAjIEZvcm1hdCB0byAyIGRlY2ltYWwgcGxhY2VzIGFuZCBhZGQgY29tbWFzDQogICAgICAgIC4NCiAgICAgICkNCiAgICB9KQ0KICApICU+JQ0KICBhcnJhbmdlKGRlc2MoYERhdGVgKSkgICMgU29ydCBieSBEYXRlIGZyb20gbmV3ZXN0IHRvIG9sZGVzdA0KDQojIERpc3BsYXkgdGhlIGZvcm1hdHRlZCBkYXRhDQppbnRlcmFjdGl2ZV9zdHIoc3B4X3JhdykNCmludGVyYWN0aXZlX3ByaW50KHNweF9yYXcpDQoNCiMgRGlzcGxheSB0aGUgdGFibGUgd2l0aCBjYXB0aW9uDQpjYXQoIlxuXG4jIyMjIFNQWCBZZWFybHkgUGVyZm9ybWFuY2UgKCIsIG1pbl95ZWFyLCAiLSIsIG1heF95ZWFyLCAiKVxuIiwgc2VwID0gIiIpDQoNCmZvcm1hdF9lcXVhbF93aWR0aF9ncm91cGVkKHNweF9yYXcsIGdyb3VwaW5nX2ZhY3RvciA9IDIpDQojIGNhdCgiXG5cbiBTb3VyY2U6ICIsIG5ydiRzb3VyY2Vfc3B4X211bHRwbCwgIlxuIikNCg0KYGBgDQoNCg0KIyMjIFN1bW1hcnkNCg0KYGBge3Igc3B4X3Jhd19zdW1tYXJ5LCBldmFsPVRSVUUsIGVjaG89RkFMU0V9DQoNCiMgTG9hZCBuZWNlc3NhcnkgbGlicmFyaWVzDQpsaWJyYXJ5KGRwbHlyKQ0KbGlicmFyeSh0aWJibGUpDQpsaWJyYXJ5KGtuaXRyKQ0KbGlicmFyeShrYWJsZUV4dHJhKQ0KDQppbnRlcmFjdGl2ZV9zdHIoc3B4X3JhdykNCmludGVyYWN0aXZlX3ByaW50KHNweF9yYXcpDQoNCiMgRW5zdXJlIHRoZSBEYXRlIGNvbHVtbiBpcyBhIHByb3BlciBEYXRlIG9iamVjdCBhbmQgZXh0cmFjdCB0aGUgeWVhcg0Kc3B4X3JhdyA8LSBzcHhfcmF3ICU+JQ0KICBzbGljZSgtMSkgJT4lICMgUmVtb3ZlIHRoZSBmaXJzdCByb3cNCiAgIyBtdXRhdGUoRGF0ZSA9IGlmZWxzZShyb3dfbnVtYmVyKCkgPT0gMSwgIjIwMjUtMDEtMDEiLCBEYXRlKSkgJT4lDQogIG11dGF0ZSgNCiAgICBEYXRlID0gYXMubnVtZXJpYyhmb3JtYXQoYXMuRGF0ZShEYXRlLCBmb3JtYXQgPSAiJVktJW0tJWQiKSwgIiVZIikpLA0KICAgIGAxLVllYXIgQ0FHUmAgPSBhcy5udW1lcmljKGdzdWIoIlteMC05Li1dIiwgIiIsIGAxLVllYXIgQ0FHUmApKQ0KICApDQoNCiMgU29ydCBkYXRhIGJ5IERhdGUgaW4gYXNjZW5kaW5nIG9yZGVyDQpzcHhfcmF3IDwtIHNweF9yYXcgJT4lDQogIGFycmFuZ2UoRGF0ZSkNCg0KDQojIENhbGN1bGF0ZSB0aGUgQ0FHUiBhbmQgZHluYW1pY2FsbHkgY3JlYXRlIGEgdmFyaWFibGUgbmFtZSB3aXRoIHRoZSBmb3JtYXQgc3B4X2NhZ3JfdmFsdWVfczxtaW5feWVhcj5fZTxtYXhfeWVhcj4NCmluaXRpYWxfdmFsdWUgPC0gMTAwICAjIEFzc3VtaW5nIGFuIGluaXRpYWwgaW5kZXggdmFsdWUgb2YgMTAwDQpmaW5hbF92YWx1ZSA8LSBpbml0aWFsX3ZhbHVlICogcHJvZCgxICsgc3B4X3JhdyRgMS1ZZWFyIENBR1JgIC8gMTAwLCBuYS5ybSA9IFRSVUUpDQptaW5feWVhciA8LSBtaW4oc3B4X3JhdyREYXRlLCBuYS5ybSA9IFRSVUUpDQptYXhfeWVhciA8LSBtYXgoc3B4X3JhdyREYXRlLCBuYS5ybSA9IFRSVUUpDQpudW1feWVhcnMgPC0gbWF4X3llYXIgLSBtaW5feWVhcg0KY2Fncl92YWx1ZSA8LSByb3VuZCgoKGZpbmFsX3ZhbHVlIC8gaW5pdGlhbF92YWx1ZSleKDEgLyBudW1feWVhcnMpIC0gMSkgKiAxMDAsIDIpDQp2YXJfbmFtZSA8LSBwYXN0ZTAoInNweF9jYWdyX3ZhbHVlX3MiLCBtaW5feWVhciwgIl9lIiwgbWF4X3llYXIpDQphc3NpZ24odmFyX25hbWUsIGNhZ3JfdmFsdWUpDQoNCiMgQ29udmVydCBTUFggZGF0YSB0byBudW1lcmljLCByZW1vdmluZyBhbnkgcGVyY2VudGFnZSBzaWducw0KZGF0YSA8LSBhcy5udW1lcmljKGdzdWIoIiUiLCAiIiwgc3B4X3JhdyRgMS1ZZWFyIENBR1JgKSkNCg0KIyBDYWxjdWxhdGUgc3RhdGlzdGljcw0KY291bnRfb2JzZXJ2YXRpb25zIDwtIHN1bSghaXMubmEoZGF0YSkpDQptZWFuX3ZhbHVlIDwtIHJvdW5kKG1lYW4oZGF0YSwgbmEucm0gPSBUUlVFKSwgMikNCm1lZGlhbl92YWx1ZSA8LSByb3VuZChtZWRpYW4oZGF0YSwgbmEucm0gPSBUUlVFKSwgMikNCnNkX3ZhbHVlIDwtIHJvdW5kKHNkKGRhdGEsIG5hLnJtID0gVFJVRSksIDIpDQptaW5fY2Fncl9yYW5nZSA8LSByb3VuZChjYWdyX3ZhbHVlIC0gc2RfdmFsdWUsIDIpDQptYXhfY2Fncl9yYW5nZSA8LSByb3VuZChjYWdyX3ZhbHVlICsgc2RfdmFsdWUsIDIpDQptaW5fdmFsdWUgPC0gcm91bmQobWluKGRhdGEsIG5hLnJtID0gVFJVRSksIDIpDQptYXhfdmFsdWUgPC0gcm91bmQobWF4KGRhdGEsIG5hLnJtID0gVFJVRSksIDIpDQoNCiMgVGFyZ2V0IFJhdGUgQW5hbHlzaXMgLSBSZWZlciB0byAiUHJlZmVycmVkIFRhcmdldHMiIG9yIGluY2x1ZGUgYmVsb3cgZm9yIGluZGl2aWR1YWwgY2hhbmdlcy4NCmFib3ZlX3RhcmdldF9pbmZsYXRpb24gPC0gc3VtKGRhdGEgPj0gdGFyZ2V0X2luZmxhdGlvbiwgbmEucm0gPSBUUlVFKQ0KYWJvdmVfdGFyZ2V0X2NvbnNlcnZhdGl2ZSA8LSBzdW0oZGF0YSA+PSB0YXJnZXRfY29uc2VydmF0aXZlLCBuYS5ybSA9IFRSVUUpDQphYm92ZV90YXJnZXRfbW9kZXJhdGUgPC0gc3VtKGRhdGEgPj0gdGFyZ2V0X21vZGVyYXRlLCBuYS5ybSA9IFRSVUUpDQphYm92ZV90YXJnZXRfYWdncmVzc2l2ZSA8LSBzdW0oZGF0YSA+PSB0YXJnZXRfYWdncmVzc2l2ZSwgbmEucm0gPSBUUlVFKQ0KDQpwZXJjZW50X2Fib3ZlX3RhcmdldF9jb25zZXJ2YXRpdmUgPC0gcm91bmQoKGFib3ZlX3RhcmdldF9jb25zZXJ2YXRpdmUgLyBjb3VudF9vYnNlcnZhdGlvbnMpICogMTAwLCAyKQ0KcGVyY2VudF9hYm92ZV90YXJnZXRfaW5mbGF0aW9uIDwtIHJvdW5kKChhYm92ZV90YXJnZXRfaW5mbGF0aW9uIC8gY291bnRfb2JzZXJ2YXRpb25zKSAqIDEwMCwgMikNCnBlcmNlbnRfYWJvdmVfdGFyZ2V0X21vZGVyYXRlIDwtIHJvdW5kKChhYm92ZV90YXJnZXRfbW9kZXJhdGUgLyBjb3VudF9vYnNlcnZhdGlvbnMpICogMTAwLCAyKQ0KcGVyY2VudF9hYm92ZV90YXJnZXRfYWdncmVzc2l2ZSA8LSByb3VuZCgoYWJvdmVfdGFyZ2V0X2FnZ3Jlc3NpdmUgLyBjb3VudF9vYnNlcnZhdGlvbnMpICogMTAwLCAyKQ0KDQojIENvbXBpbGUgc3RhdGlzdGljcyBpbnRvIGEgbGlzdCBmb3IgZWFzeSBjb252ZXJzaW9uIHRvIGEgZGF0YSBmcmFtZSB3aXRoIGRlZmluaXRpb25zDQpzcHhfcmF3X3N1bW1hcnkgPC0gdHJpYmJsZSgNCiAgflN0YXRpc3RpYywgflZhbHVlLCB+RGVmaW5pdGlvbiwNCiAgIkNvdW50IG9mIE9ic2VydmF0aW9ucyIsIGFzLmNoYXJhY3Rlcihjb3VudF9vYnNlcnZhdGlvbnMpLCAiVG90YWwgbnVtYmVyIG9mIGRhdGEgcG9pbnRzIGNvbGxlY3RlZCBvdmVyIHRoZSBzcGVjaWZpYyBwZXJpb2QuIiwNCiAgIkNBR1IiLCBwYXN0ZTAoY2Fncl92YWx1ZSwgIiUiKSwgIkNvbXBvdW5kIEF2ZXJhZ2UgR3Jvd3RoIFJhdGU7IG1lYW4gZ3Jvd3RoIHJhdGUgb3ZlciBhIHBlcmlvZCBpZiBpdCBoYWQgY29tcG91bmRlZCBhbnVhbGx5LiIsDQogICJNZWFuIiwgcGFzdGUwKG1lYW5fdmFsdWUsICIlIiksICJSZWZsZWN0cyB0aGUgZ2VuZXJhbCBwcmljZSBsZXZlbCBhbmQgb3ZlcmFsbCBncm93dGggcmF0ZS4iLA0KICAiTWVkaWFuIiwgcGFzdGUwKG1lZGlhbl92YWx1ZSwgIiUiKSwgIk1pZGRsZSB2YWx1ZSBvZiB0aGUgZGF0YSB3aGVuIG9yZGVyZWQgY2hyb25vbG9naWNhbGx5OyBjZW50cmFsIHRlbmRlbmN5IG1lYXN1cmUgbGVzcyBhZmZlY3RlZCBieSBleHRyZW1lIHZhbHVlcy4iLA0KICAiU3RhbmRhcmQgRGV2aWF0aW9uIChWb2xhdGlsaXR5KSIsIHBhc3RlMChzZF92YWx1ZSwgIiUiKSwgIlRoZSBkaXNwZXJzaW9uIG9mIHZhbHVlcyBmcm9tIHRoZSBtZWFuLCBpbmRpY2F0aW5nIHRoZSB2b2xhdGlsaXR5IG9mIHByaWNlIGNoYW5nZXMgYW5kIGVjb25vbWljIHN0YWJpbGl0eS4iLA0KICAiTWluIENBR1IgUmFuZ2UgKENBR1IgLSBTRCkiLCBwYXN0ZTAobWluX2NhZ3JfcmFuZ2UsICIlIiksICJMb3dlciBib3VuZGFyeSBvZiBleHBlY3RlZCBTUFggcmFuZ2U7IGxvd2VzdCBlc3RpbWF0ZSBvZiB0eXBpY2FsIGdyb3d0aCByYXRlIGNvbnNpZGVyaW5nIG5vcm1hbCBmbHVjdHVhdGlvbnMuIiwNCiAgIk1heCBDQUdSIFJhbmdlIChDQUdSICsgU0QpIiwgcGFzdGUwKG1heF9jYWdyX3JhbmdlLCAiJSIpLCAiVXBwZXIgYm91bmRhcnkgb2YgZXhwZWN0ZWQgU1BYIHJhbmdlOyBoaWdoZXN0IGVzdGltYXRlIG9mIHR5cGljYWwgZ3Jvd3RoIHJhdGUgY29uc2lkZXJpbmcgbm9ybWFsIGZsdWN0dWF0aW9ucy4iLA0KICAiTWluaW11bSIsIHBhc3RlMChtaW5fdmFsdWUsICIlIiksICJMb3dlc3QgZ3Jvd3RoIHJhdGUuIiwNCiAgIk1heGltdW0iLCBwYXN0ZTAobWF4X3ZhbHVlLCAiJSIpLCAiSGlnaGVzdCBncm93dGggcmF0ZS4iLA0KICAiUGVyY2VudCBBYm92ZSBJbmZsYXRpb24gVGFyZ2V0IiwgcGFzdGUwKHBlcmNlbnRfYWJvdmVfdGFyZ2V0X2luZmxhdGlvbiwgIiUiKSwgIlBlcmNlbnRhZ2Ugb2YgdmFsdWVzIGFib3ZlIHRoZSBpbmZsYXRpb24gdGFyZ2V0IHNwZWNpZmllZCBpbiBQcmVmZXJyZWQgVGFyZ2V0cyBzZWN0aW9uLiIsDQogICJQZXJjZW50IEFib3ZlIENvbnNlcnZhdGl2ZSBUYXJnZXQiLCBwYXN0ZTAocGVyY2VudF9hYm92ZV90YXJnZXRfY29uc2VydmF0aXZlLCAiJSIpLCAiUGVyY2VudGFnZSBvZiB2YWx1ZXMgYWJvdmUgdGhlIGNvbnNlcnZhdGl2ZSB0YXJnZXQgc3BlY2lmaWVkIGluIFByZWZlcnJlZCBUYXJnZXRzIHNlY3Rpb24uIiwNCiAgIlBlcmNlbnQgQWJvdmUgTW9kZXJhdGUgVGFyZ2V0IiwgcGFzdGUwKHBlcmNlbnRfYWJvdmVfdGFyZ2V0X21vZGVyYXRlLCAiJSIpLCAiUGVyY2VudGFnZSBvZiB2YWx1ZXMgYWJvdmUgdGhlIG1vZGVyYXRlIHRhcmdldCBzcGVjaWZpZWQgaW4gUHJlZmVycmVkIFRhcmdldHMgc2VjdGlvbi4iLA0KICAiUGVyY2VudCBBYm92ZSBBZ2dyZXNzaXZlIFRhcmdldCIsIHBhc3RlMChwZXJjZW50X2Fib3ZlX3RhcmdldF9hZ2dyZXNzaXZlLCAiJSIpLCAiUGVyY2VudGFnZSBvZiB2YWx1ZXMgYWJvdmUgdGhlIGFnZ3Jlc3NpdmUgdGFyZ2V0IHNwZWNpZmllZCBpbiBQcmVmZXJyZWQgVGFyZ2V0cyBzZWN0aW9uLiINCikNCg0KIyBDb252ZXJ0IHRvIGNoYXJhY3RlciB0byBhdm9pZCBhdXRvbWF0aWMgZGVjaW1hbCBwb2ludHMgb24gd2hvbGUgbnVtYmVycw0Kc3B4X3Jhd19zdW1tYXJ5IDwtIHNweF9yYXdfc3VtbWFyeSAlPiUNCiAgbXV0YXRlKGFjcm9zcyhldmVyeXRoaW5nKCksIGFzLmNoYXJhY3RlcikpDQoNCiMgRGlzcGxheSBmb3JtYXR0ZWQgdGFibGUNCmNhdCgiXG5cbiMjIyMgQW5udWFsIEdyb3d0aCBSYXRlIFN1bW1hcnkgKCIsIG1pbl95ZWFyLCAiLSIsIG1heF95ZWFyLCAiKVxuIiwgc2VwID0gIiIpDQpmb3JtYXRfM2NvbF9jdXN0b21fd2lkdGhzKHNweF9yYXdfc3VtbWFyeSwgY29sMV93aWR0aCA9ICIyMGVtIiwgY29sMl93aWR0aCA9ICIxMGVtIiwgY29sM193aWR0aCA9ICI0MGVtIikgDQoNCiMgVmlldyhzcHhfcmF3X3N1bW1hcnkpDQppbnRlcmFjdGl2ZV9zdHIoc3B4X3Jhd19zdW1tYXJ5KQ0KDQpgYGANCg0KU1BYJ3MgSW5kZXggZXhoaWJpdHMgYSBgciBpZihjYWdyX3ZhbHVlID4gdGFyZ2V0X2FnZ3Jlc3NpdmUpICJhZ2dyZXNzaXZlIiBlbHNlIGlmKGNhZ3JfdmFsdWUgPiB0YXJnZXRfbW9kZXJhdGUpICJtb2RlcmF0ZSIgZWxzZSBpZihjYWdyX3ZhbHVlID4gdGFyZ2V0X2NvbnNlcnZhdGl2ZSkgImNvbnNlcnZhdGl2ZSIgZWxzZSBpZihjYWdyX3ZhbHVlID4gdGFyZ2V0X2luZmxhdGlvbikgImJhc2VsaW5lIiBlbHNlICJkaXNhcHBvaW50aW5nImAgQ0FHUiBhdCBgciBjYWdyX3ZhbHVlYCUsIGByIGlmKGNhZ3JfdmFsdWUgPCBtZWFuX3ZhbHVlKSAibG93ZXIgdGhhbiIgZWxzZSAiaGlnaGVyIHRoYW4iYCB0aGUgbWVhbiBncm93dGggcmF0ZSBvZiBgciBtZWFuX3ZhbHVlYCUsIHJlZmxlY3RpbmcgdGhlIGltcGFjdCBvZiBzaG9ydC10ZXJtIHZvbGF0aWxpdHkgYW5kIGByIGlmKGNhZ3JfdmFsdWUgPiBtZWFuX3ZhbHVlKSAiZGVjbGluZXMiIGVsc2UgImdyb3d0aCBzcGlrZXMiYC4gVGhlIG1lZGlhbiByZXR1cm4gb2YgYHIgbWVkaWFuX3ZhbHVlYCUgaW5kaWNhdGVzIHRoYXQgbW9yZSB0aGFuIGhhbGYgb2YgdGhlIG9ic2VydmVkIHllYXJzIGV4cGVyaWVuY2VkIHJldHVybnMgYHIgaWYoY2Fncl92YWx1ZSA8IG1lZGlhbl92YWx1ZSkgImFib3ZlIiBlbHNlICJiZWxvdyJgIHRoZSBtZWFuLiBUaGUgcmVsYXRpb25zaGlwIGJldHdlZW4gdGhlIENBR1IgYW5kIHRoZSBtZWRpYW4gZ3Jvd3RoIHJhdGUgc3VnZ2VzdHMgdGhhdCBzdXN0YWluZWQgcGVyaW9kcyBvZiBhYm92ZS1tZWRpYW4gZ3Jvd3RoIGhhdmUgZXhlcnRlZCBjdW11bGF0aXZlIGByIGlmKGNhZ3JfdmFsdWUgPCBtZWRpYW5fdmFsdWUpICJ1cHdhcmQgcHJlc3N1cmUiIGVsc2UgImRvd253YXJkIHByZXNzdXJlImAgb24gb3ZlcmFsbCBwcmljZSBsZXZlbHMuIFRoaXMgcmVsYXRpb25zaGlwIGhpZ2hsaWdodHMgYSBkaXN0cmlidXRpb24gd2l0aCBub3RhYmxlIGV4dHJlbWVzIG9uIHRoZSBgciBpZihjYWdyX3ZhbHVlIDwgbWVhbl92YWx1ZSkgImhpZ2hlciIgZWxzZSAibG93ZXIiYCBlbmQsIHJlZmxlY3RpbmcgYHIgaWYoY2Fncl92YWx1ZSA8IG1lYW5fdmFsdWUpICJwb3NpdGl2ZSIgZWxzZSAibmVnYXRpdmUiYCBza2V3bmVzcy4gVGhpcyBgciBpZihjYWdyX3ZhbHVlIDwgbWVkaWFuX3ZhbHVlKSAicG9zaXRpdmUiIGVsc2UgIm5lZ2F0aXZlImAgc2tld25lc3MgaW1wbGllcyB0aGF0IHdoaWxlIG1vcmUgdGhhbiBoYWxmIG9mIHRoZSBvYnNlcnZlZCB5ZWFycyBleHBlcmllbmNlZCByZXR1cm5zIGByIGlmKGNhZ3JfdmFsdWUgPCBtZWRpYW5fdmFsdWUpICJhYm92ZSB0aGUgbWVhbiwgZG93bnR1cm5zIGNhbiBiZSBzZXZlcmUiIGVsc2UgImJlbG93IHRoZSBtZWFuLCB1cHR1cm5zIGNhbiBiZSBzaWduaWZpY2FudCJgLiBIb3dldmVyLCB0aGUgbWFya2V0IGhhcyBoaXN0b3JpY2FsbHkgcHJvdmlkZWQgc3Vic3RhbnRpYWwgYHIgaWYoY2Fncl92YWx1ZSA8IG1lZGlhbl92YWx1ZSkgInVwc2lkZSBwb3RlbnRpYWwiIGVsc2UgImRvd25zaWRlIHJpc2siYC4gQWRkaXRpb25hbGx5LCB0aGUgZmFjdCB0aGF0IGByIHBlcmNlbnRfYWJvdmVfdGFyZ2V0X2luZmxhdGlvbmAlIG9mIHRoZSB5ZWFycyBleGNlZWRlZCB0aGUgaW5mbGF0aW9uIHRhcmdldCBgciBpZiAocGVyY2VudF9hYm92ZV90YXJnZXRfaW5mbGF0aW9uID4gNzApICJyZWluZm9yY2VzIFNQWCdzIGVmZmVjdGl2ZW5lc3MgYXMgYSBzdHJvbmcgbG9uZy10ZXJtIGhlZGdlIiBlbHNlIGlmIChwZXJjZW50X2Fib3ZlX3RhcmdldF9pbmZsYXRpb24gPiA2MCkgInJlaW5mb3JjZXMgU1BYJ3MgZWZmZWN0aXZlbmVzcyBhcyBhIGxvbmctdGVybSBoZWRnZSIgZWxzZSBpZiAocGVyY2VudF9hYm92ZV90YXJnZXRfaW5mbGF0aW9uID4gNTApICJxdWVzdGlvbnMgU1BYJ3MgZWZmZWN0aXZlbmVzcyAgYXMgYSBsb25nLXRlcm0gaGVkZ2UiIGVsc2UgInVuZGVybWluZXMgU1BYJ3MgZWZmZWN0aXZlbmVzcyBhcyBhIGxvbmctdGVybSBoZWRnZSJgIGFnYWluc3QgaW5mbGF0aW9uLg0KDQpUaGUgc3RhbmRhcmQgZGV2aWF0aW9uIG9mIGByIHNkX3ZhbHVlYCUgYHIgaWYoc2RfdmFsdWUgPiAyMCkgImluZGljYXRlcyBleHRyZW1lIHZvbGF0aWxpdHksIHJlZmxlY3Rpbmcgc3Vic3RhbnRpYWwgZmx1Y3R1YXRpb25zIGluIGVxdWl0eSBtYXJrZXRzIiBlbHNlIGlmKHNkX3ZhbHVlID4gMTUpICJ1bmRlcnNjb3JlcyBzaWduaWZpY2FudCB2b2xhdGlsaXR5LCBhIGNvbW1vbiBmZWF0dXJlIG9mIGVxdWl0eSBtYXJrZXRzIiBlbHNlICJzdWdnZXN0cyBtb2RlcmF0ZSB2b2xhdGlsaXR5LCB0eXBpY2FsIG9mIHJlbGF0aXZlbHkgc3RhYmxlIG1hcmtldHMiYC4gVGhlIGByIHJhbmdlX3JhdGlvIDwtIChtYXhfdmFsdWUgLSBtaW5fdmFsdWUpIC8gc2RfdmFsdWU7IGlmKHJhbmdlX3JhdGlvID4gNSkgImhpZ2hseSB2b2xhdGlsZSIgZWxzZSBpZihyYW5nZV9yYXRpbyA+IDMpICJub3RhYmxlIiBlbHNlICJjb21wYXJhdGl2ZWx5IHN0YWJsZSJgIHJhbmdlIG9mIGFubnVhbCByZXR1cm5zLCBzcGFubmluZyBmcm9tIGByIG1pbl92YWx1ZWAlIHRvIGByIG1heF92YWx1ZWAlLCBgciBpZihyYW5nZV9yYXRpbyA+IDUpICJpbGx1c3RyYXRlcyBhIGhpZ2hseSB2b2xhdGlsZSBtYXJrZXQgZW52aXJvbm1lbnQsIHBhcnRseSBkdWUgdG8gaXRzIGNvbXBvc2l0aW9uLCB3aXRoIHRoZSBwb3RlbnRpYWwgZm9yIGJvdGggZXh0cmVtZSBnYWlucyBhbmQgbG9zc2VzIiBlbHNlIGlmKHJhbmdlX3JhdGlvID4gMykgImhpZ2hsaWdodHMgbm90YWJsZSBtYXJrZXQgdmFyaWFiaWxpdHksIHBhcnRseSBkdWUgdG8gaXRzIGNvbXBvc2l0aW9uLCAgcmVmbGVjdGluZyBib3RoIG9wcG9ydHVuaXRpZXMgYW5kIHJpc2tzIiBlbHNlICJpbmRpY2F0ZXMgYSBjb21wYXJhdGl2ZWx5IHN0YWJsZSBtYXJrZXQsIHBhcnRseSBkdWUgdG8gaXRzIGNvbXBvc2l0aW9uLCB3aXRoIGxlc3MgZXh0cmVtZSBhbm51YWwgZmx1Y3R1YXRpb25zImAuIA0KDQpGb3IgU1BYIHRvIGJlIGNvbnNpZGVyZWQgYSBoaWdoLXBlcmZvcm1pbmcgYW5kIHJlc2lsaWVudCBsb25nLXRlcm0gaW52ZXN0bWVudCwgaXQgd291bGQgYmUgaWRlYWwgdG8gZXhjZWVkIHRoZSBhZ2dyZXNzaXZlIHRhcmdldCAoZS5nLiwgYHIgKHRhcmdldF9hZ2dyZXNzaXZlIC0gdGFyZ2V0X2luZmxhdGlvbilgJSBhbm51YWxpemVkIHJldHVybnMsIGFjY291bnRpbmcgZm9yIGhpZ2hlciBpbmZsYXRpb24tYWRqdXN0ZWQgcGVyZm9ybWFuY2UgZXhwZWN0YXRpb25zKSBpbiBhdCBsZWFzdCA0MCUtNTAlIG9mIHRoZSB5ZWFycy4gVGhpcyByYW5nZSByZWZsZWN0cyB0aGUgcG90ZW50aWFsIGZvciBzdHJvbmcgdXBzaWRlIGluIG1hbnkgeWVhcnMgd2hpbGUgYmFsYW5jaW5nIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgbWFya2V0cyBkbyBleHBlcmllbmNlIGRvd250dXJucy4gVGhlIGZhY3QgdGhhdCBgciBwZXJjZW50X2Fib3ZlX3RhcmdldF9hZ2dyZXNzaXZlYCUgb2YgdGhlIHllYXJzIGV4Y2VlZGVkIHRoZSBhZ2dyZXNzaXZlIHRhcmdldCBgciBpZihwZXJjZW50X2Fib3ZlX3RhcmdldF9hZ2dyZXNzaXZlID4gNTApICJpbmRpY2F0ZXMgY29uc2lzdGVudCBhbmQgcm9idXN0IGdyb3d0aCwgbWFraW5nIFNQWCBhIHN0cm9uZyBvcHRpb24gZm9yIHRob3NlIHNlZWtpbmcgYWdncmVzc2l2ZSBpbnZlc3RtZW50cy4iIGVsc2UgaWYocGVyY2VudF9hYm92ZV90YXJnZXRfYWdncmVzc2l2ZSA+IDQwKSAic3VnZ2VzdHMgdGhhdCB3aGlsZSBub3QgY29uc2lzdGVudCwgU1BYIGhhcyBoaXN0b3JpY2FsbHkgcHJvdmlkZWQgcm9idXN0IGdyb3d0aCBvdmVyIHRoZSBsb25nIHRlcm0sIG1ha2luZyBpdCBhIHZpYWJsZSBpbnZlc3RtZW50IGZvciB0aG9zZSB3aXRoIGEgaGlnaGVyIHJpc2sgdG9sZXJhbmNlLiIgZWxzZSAicmFpc2VzIGNvbmNlcm5zIGFib3V0IFNQWCdzIGFiaWxpdHkgdG8gbWVldCBhZ2dyZXNzaXZlIGdyb3d0aCB0YXJnZXRzLCBtYWtpbmcgaXQgbGVzcyBzdWl0YWJsZSBmb3IgaW52ZXN0b3JzIHdpdGggaGlnaGVyIHJpc2sgdG9sZXJhbmNlLiJgDQoNCiMjIyBHcmFwaA0KDQpgYGB7ciBzcHhfcmF3X2dyYXBoLCBmaWcud2lkdGg9MTAsIGZpZy5oZWlnaHQ9NywgZXZhbD1UUlVFLCBlY2hvPUZBTFNFfQ0KDQoNCiMgTG9hZCBuZWNlc3NhcnkgbGlicmFyaWVzDQpsaWJyYXJ5KGdncGxvdDIpDQpsaWJyYXJ5KGRwbHlyKQ0KDQojIENvbnZlcnQgYDEtWWVhciBDQUdSYCB0byBudW1lcmljIGZvciBwbG90dGluZw0Kc3B4X3JhdyA8LSBzcHhfcmF3ICU+JQ0KICBtdXRhdGUoDQogICAgYERhdGVgID0gYXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIoYERhdGVgKSksICAjIEVuc3VyZSBEYXRlIGlzIG51bWVyaWMNCiAgICBgMS1ZZWFyIENBR1JgID0gYXMubnVtZXJpYyhnc3ViKCIlIiwgIiIsIGAxLVllYXIgQ0FHUmApKQ0KICApDQoNCiMgRmluZCB0aGUgbWluaW11bSBhbmQgbWF4aW11bSB4LXZhbHVlIGluIHlvdXIgZGF0YQ0KbWF4X3ggPC0gbWF4KGFzLmludGVnZXIoc3B4X3JhdyREYXRlKSwgbmEucm0gPSBUUlVFKQ0KbWluX3ggPC0gbWluKGFzLmludGVnZXIoc3B4X3JhdyREYXRlKSwgbmEucm0gPSBUUlVFKQ0KaW50ZXJhY3RpdmVfcHJpbnQobWF4X3gpICAjIFRlc3QNCmludGVyYWN0aXZlX3ByaW50KG1pbl94KSAgIyBUZXN0DQoNCiMgRmluZCB0aGUgbWluaW11bSBhbmQgbWF4aW11bSB5ZWFyDQptaW5feWVhciA8LSBtaW4oc3B4X3JhdyREYXRlLCBuYS5ybSA9IFRSVUUpDQptYXhfeWVhciA8LSBtYXgoc3B4X3JhdyREYXRlLCBuYS5ybSA9IFRSVUUpDQppbnRlcmFjdGl2ZV9wcmludChtaW5feWVhcikNCmludGVyYWN0aXZlX3ByaW50KG1heF95ZWFyKQ0KDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KIyMgUExPVCBGVUxMIFdJVEhPVVQgTElNSVRTDQoNCiMgRGVmaW5lIHN0YXJ0IGFuZCBlbmQgeWVhcnMNCnN0YXJ0X3llYXIgPC0gYXMubnVtZXJpYyhtaW5feWVhcikNCmVuZF95ZWFyIDwtIDIwMjQNCnllYXJfcmFuZ2UgPC0gZW5kX3llYXIgLSBzdGFydF95ZWFyICsgMSAgIyBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiB5ZWFycw0KDQojIERlZmluZSBicmVha3Mgcm91bmRlZCBhcHByb3ByaWF0ZWx5DQpsaW1pdHNfc3RhcnRfeWVhciA8LSBmbG9vcihzdGFydF95ZWFyIC8gNSkgKiA1ICAjIFJvdW5kIGRvd24gdG8gdGhlIG5lYXJlc3QgbXVsdGlwbGUgb2YgNQ0KbGltaXRzX2VuZF95ZWFyIDwtIGNlaWxpbmcoZW5kX3llYXIgLyA1KSAqIDUgICAjIFJvdW5kIHVwIHRvIHRoZSBuZWFyZXN0IG11bHRpcGxlIG9mIDUNCg0KIyBDcmVhdGUgZHluYW1pYyB0aXRsZSBhbmQgY2FwdGlvbg0KZHluYW1pY190aXRsZSA8LSBwYXN0ZTAoIkFubnVhbCBHcm93dGggUmF0ZXMgT3ZlciAiLHllYXJfcmFuZ2UsICIgWWVhcnMgKCIsIHN0YXJ0X3llYXIsICItIiwgZW5kX3llYXIsICIpIikNCmR5bmFtaWNfY2FwdGlvbiA8LSBwYXN0ZTAoIlNQWCBBbm51YWwgR3Jvd3RoIFJhdGVzLCBEYXRhIFBlcmlvZCAoIiwgbWluX3llYXIsICLigJMiLCBtYXhfeWVhciwgIikiKQ0KDQojIENyZWF0ZSB0aGUgZnVsbCwgbm9uLWZpbHRlcmVkIHgtYXhpcyBwbG90IHdpdGggZHluYW1pYyB4IHBsYWNlbWVudCBmb3IgYW5ub3RhdGlvbnMNCnAxIDwtIGdncGxvdChzcHhfcmF3LCBhZXMoeCA9IGFzLmludGVnZXIoRGF0ZSksIHkgPSBgMS1ZZWFyIENBR1JgKSkgKw0KICANCiAgIyBBZGQgc2hhZGVkIGFyZWFzIGZvciBiYWNrZ3JvdW5kIGVmZmVjdA0KICBnZW9tX3JlY3QoYWVzKHhtaW4gPSAtSW5mLCB4bWF4ID0gSW5mLCB5bWluID0gdGFyZ2V0X2FnZ3Jlc3NpdmUsIHltYXggPSBJbmYpLCBmaWxsID0gImxpZ2h0Z3JlZW4iLCBhbHBoYSA9IDAuMDEwKSArDQogIGdlb21fcmVjdChhZXMoeG1pbiA9IC1JbmYsIHhtYXggPSBJbmYsIHltaW4gPSB0YXJnZXRfY29uc2VydmF0aXZlLCB5bWF4ID0gdGFyZ2V0X2FnZ3Jlc3NpdmUpLCBmaWxsID0gIm9yYW5nZSIsIGFscGhhID0gMC4wMTApICsNCiAgZ2VvbV9yZWN0KGFlcyh4bWluID0gLUluZiwgeG1heCA9IEluZiwgeW1pbiA9IC1JbmYsIHltYXggPSB0YXJnZXRfY29uc2VydmF0aXZlKSwgZmlsbCA9ICJsaWdodGNvcmFsIiwgYWxwaGEgPSAwLjAxMCkgKw0KICANCiAgIyBQbG90IGxpbmVzLCBwb2ludHMsIGFuZCBhbm5vdGF0aW9ucyBvbiB0b3Agb2Ygc2hhZGVkIGFyZWFzDQogIGdlb21fbGluZShjb2xvciA9ICIjNEIwMDgyIiwgc2l6ZSA9IDEuMCkgKyAgICAgICAjIERhcmsgcHVycGxlIGxpbmUgDQogIGdlb21fcG9pbnQoY29sb3IgPSAiIzRCMDA4MiIsIHNpemUgPSAxLjUpICsgICAgICAgICMgRGFyayBwdXJwbGUgcG9pbnRzIA0KICANCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gdGFyZ2V0X2FnZ3Jlc3NpdmUsIGNvbG9yID0gImRhcmtibHVlIiwgbGluZXR5cGUgPSAic29saWQiKSArDQogICMgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gdGFyZ2V0X21vZGVyYXRlLCBjb2xvciA9ICJkYXJrYmx1ZSIsIGxpbmV0eXBlID0gInNvbGlkIikgKw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSB0YXJnZXRfY29uc2VydmF0aXZlLCBjb2xvciA9ICJkYXJrYmx1ZSIsIGxpbmV0eXBlID0gInNvbGlkIikgKw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSB0YXJnZXRfaW5mbGF0aW9uLCBjb2xvciA9ICJkYXJrcmVkIiwgbGluZXR5cGUgPSAiZGFzaGVkIikgKw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSBjYWdyX3ZhbHVlLCBjb2xvciA9ICJkYXJrcmVkIiwgbGluZXR5cGUgPSAiZGFzaGVkIikgKw0KICANCiAgIyBEeW5hbWljIHJpZ2h0LWFsaWduZWQgcGxhY2VtZW50IGZvciBhbm5vdGF0aW9ucw0KICBhbm5vdGF0ZSgidGV4dCIsIHggPSBJbmYsIHkgPSB0YXJnZXRfYWdncmVzc2l2ZSwgbGFiZWwgPSAiQWdncmVzc2l2ZSIsIA0KICAgICAgICAgICBoanVzdCA9IDEsIHZqdXN0ID0gLTAuNTAsIGNvbG9yID0gImRhcmtibHVlIiwgc2l6ZSA9IDQpICsNCiAgIyBhbm5vdGF0ZSgidGV4dCIsIHggPSBJbmYsIHkgPSB0YXJnZXRfbW9kZXJhdGUsIGxhYmVsID0gIk1vZGVyYXRlIiwgDQogICMgICAgICAgICAgaGp1c3QgPSAxLCB2anVzdCA9IC0wLjUwLCBjb2xvciA9ICJkYXJrYmx1ZSIsIHNpemUgPSA0KSArDQogIGFubm90YXRlKCJ0ZXh0IiwgeCA9IEluZiwgeSA9IHRhcmdldF9jb25zZXJ2YXRpdmUsIGxhYmVsID0gIkNvbnNlcnZhdGl2ZSIsIA0KICAgICAgICAgICBoanVzdCA9IDEsIHZqdXN0ID0gLTAuNTAsIGNvbG9yID0gImRhcmtibHVlIiwgc2l6ZSA9IDQpICsNCiAgYW5ub3RhdGUoInRleHQiLCB4ID0gSW5mLCB5ID0gdGFyZ2V0X2luZmxhdGlvbiwgbGFiZWwgPSAiSW5mbGF0aW9uIiwgDQogICAgICAgICAgIGhqdXN0ID0gMSwgdmp1c3QgPSArMS4xMCwgY29sb3IgPSAiZGFya3JlZCIsIHNpemUgPSA0KSArDQogIGFubm90YXRlKCJ0ZXh0IiwgeCA9IEluZiwgeSA9IGNhZ3JfdmFsdWUsIGxhYmVsID0gIkNBR1IiLCANCiAgICAgICAgICAgaGp1c3QgPSAxLCB2anVzdCA9ICsxLjEwLCBjb2xvciA9ICJkYXJrcmVkIiwgc2l6ZSA9IDQpICsgDQoNCiAgbGFicygNCiAgICB0aXRsZSA9IGR5bmFtaWNfdGl0bGUsDQogICAgeCA9ICJZZWFyIiwNCiAgICB5ID0gIkdyb3d0aCBSYXRlICglKSIsDQogICAgY2FwdGlvbiA9IGR5bmFtaWNfY2FwdGlvbg0KICApICsNCg0KICBzY2FsZV94X2NvbnRpbnVvdXMoDQogICAgbGltaXRzID0gYyhzdGFydF95ZWFyLCBlbmRfeWVhciArIDEwKSwgIyBSZXN0cmljdHMgeC1heGlzIGRhdGEgDQogICAgYnJlYWtzID0gc2VxKGxpbWl0c19zdGFydF95ZWFyLCBsaW1pdHNfZW5kX3llYXIgKyA1LCA1KSAjIFNldHMgTWFqb3IgeC1heGlzICANCiAgKSArICAjIFJlc3RyaWN0ICYgU2V0IE1ham9yIHgtYXhpcyBsaW5lcyANCiAgICANCiAgdGhlbWVfbWluaW1hbCgpICsNCiAgdGhlbWUoDQogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSwgc2l6ZSA9IDIwKSwgICAgICAgICAjIExhcmdlciB0aXRsZSBmb250DQogICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCksICAgICAgICAgICAgICAgICAgICAjIExhcmdlciB4LWF4aXMgbGFiZWwgZm9udA0KICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQpLCAgICAgICAgICAgICAgICAgICAgIyBMYXJnZXIgeS1heGlzIGxhYmVsIGZvbnQNCiAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEsIHNpemUgPSAxNCksICAjIExhcmdlciB4LWF4aXMgdGV4dA0KICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCksICAgICAgICAgICAgICAgICAgICAgIyBMYXJnZXIgeS1heGlzIHRleHQNCiAgICBwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9saW5lKGxpbmV0eXBlID0gImRvdHRlZCIsIGNvbG9yID0gImJsYWNrIiksICAgICAgICAgIyBNYWpvciBncmlkIGxpbmVzDQogICAgcGFuZWwuZ3JpZC5taW5vci54ID0gZWxlbWVudF9ibGFuaygpLCAjIGVsZW1lbnRfbGluZShjb2xvciA9ICJncmV5ODAiKSAgIyBNaW5vciB4IGdyaWQgbGluZXMgZm9yIGVhY2ggeWVhcg0KICAgICMgcGFuZWwuYm9yZGVyID0gZWxlbWVudF9yZWN0KGNvbG9yID0gImRhcmtncmV5IiwgZmlsbCA9IE5BLCBzaXplID0gMS4wKSAgIyBEYXJrIGJvcmRlciBhcm91bmQgdGhlIHBsb3QNCiAgICBheGlzLnRpY2tzLmxlbmd0aCA9IHVuaXQoLTAuMjUsICJjbSIpLCAgICAgICAgICAgICAgICAgICAgICAjIEluY3JlYXNlIHRpY2sgbGVuZ3RoDQogICAgYXhpcy50aWNrcyA9IGVsZW1lbnRfbGluZShjb2xvciA9ICJibGFjayIsIHNpemUgPSAwLjUwKSwgIyBEYXJrZXIgdGlja3MNCiAgICBheGlzLmxpbmUueCA9IGVsZW1lbnRfbGluZShjb2xvciA9ICJibGFjayIsIHNpemUgPSAwLjc1KSwgICMgRGFyayBib3R0b20gYm9yZGVyDQogICAgYXhpcy5saW5lLnkgPSBlbGVtZW50X2xpbmUoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMC43NSkgICAjIERhcmsgbGVmdCBib3JkZXINCiAgKQ0KDQpwcmludChwMSkNCg0KDQoNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQojIyBQTE9UIFJFU1RSSUNURUQgV0lUSCBMSU1JVFMNCg0KIyBGaWx0ZXIgdGhlIGRhdGEgZm9yIHRoZSByZXN0cmljdGVkIHgtYXhpcyByYW5nZSAoMTk3NS0yMDI0KQ0KcmVzdHJpY3RlZF9kYXRhIDwtIHNweF9yYXcgJT4lDQogIGZpbHRlcihhcy5pbnRlZ2VyKERhdGUpID49IDE5NzUgJiBhcy5pbnRlZ2VyKERhdGUpIDw9IDIwMjQpDQoNCiMgRGVmaW5lIHN0YXJ0IGFuZCBlbmQgeWVhcnMNCnN0YXJ0X3llYXIgPC0gMTk3NQ0KZW5kX3llYXIgPC0gMjAyNA0KeWVhcl9yYW5nZSA8LSBlbmRfeWVhciAtIHN0YXJ0X3llYXIgKyAxICAjIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIHllYXJzDQoNCiMgRGVmaW5lIGJyZWFrcyByb3VuZGVkIGFwcHJvcHJpYXRlbHkNCmxpbWl0c19zdGFydF95ZWFyIDwtIGZsb29yKHN0YXJ0X3llYXIgLyA1KSAqIDUgICMgUm91bmQgZG93biB0byB0aGUgbmVhcmVzdCBtdWx0aXBsZSBvZiA1DQpsaW1pdHNfZW5kX3llYXIgPC0gY2VpbGluZyhlbmRfeWVhciAvIDUpICogNSAgICMgUm91bmQgdXAgdG8gdGhlIG5lYXJlc3QgbXVsdGlwbGUgb2YgNQ0KDQojIENyZWF0ZSBkeW5hbWljIHRpdGxlIGFuZCBjYXB0aW9uDQpkeW5hbWljX3RpdGxlIDwtIHBhc3RlMCgiQW5udWFsIEdyb3d0aCBSYXRlcyBPdmVyICIseWVhcl9yYW5nZSwgIiBZZWFycyAoIiwgc3RhcnRfeWVhciwgIi0iLCBlbmRfeWVhciwgIikiKQ0KZHluYW1pY19jYXB0aW9uIDwtIHBhc3RlMCgiU1BYIEFubnVhbCBHcm93dGggUmF0ZXMsIERhdGEgUGVyaW9kICgiLCBtaW5feWVhciwgIuKAkyIsIG1heF95ZWFyLCAiKSIpDQoNCiMgQ2FsY3VsYXRlIGR5bmFtaWMgeS1heGlzIGxpbWl0cyBmb3IgdGhlIHJlc3RyaWN0ZWQgZGF0YQ0KeV9taW4gPC0gbWluKHJlc3RyaWN0ZWRfZGF0YSRgMS1ZZWFyIENBR1JgLCBuYS5ybSA9IFRSVUUpDQp5X21heCA8LSBtYXgocmVzdHJpY3RlZF9kYXRhJGAxLVllYXIgQ0FHUmAsIG5hLnJtID0gVFJVRSkNCg0KIyBDcmVhdGUgdGhlIGZ1bGwsIG5vbi1maWx0ZXJlZCB4LWF4aXMgcGxvdCB3aXRoIGR5bmFtaWMgeCBwbGFjZW1lbnQgZm9yIGFubm90YXRpb25zDQpwMiA8LSBnZ3Bsb3QocmVzdHJpY3RlZF9kYXRhLCBhZXMoeCA9IGFzLmludGVnZXIoRGF0ZSksIHkgPSBgMS1ZZWFyIENBR1JgKSkgKw0KICANCiAgIyBBZGQgc2hhZGVkIGFyZWFzIGZvciBiYWNrZ3JvdW5kIGVmZmVjdA0KICBnZW9tX3JlY3QoYWVzKHhtaW4gPSAtSW5mLCB4bWF4ID0gSW5mLCB5bWluID0gdGFyZ2V0X2FnZ3Jlc3NpdmUsIHltYXggPSBJbmYpLCBmaWxsID0gImxpZ2h0Z3JlZW4iLCBhbHBoYSA9IDAuMDE1KSArDQogIGdlb21fcmVjdChhZXMoeG1pbiA9IC1JbmYsIHhtYXggPSBJbmYsIHltaW4gPSB0YXJnZXRfY29uc2VydmF0aXZlLCB5bWF4ID0gdGFyZ2V0X2FnZ3Jlc3NpdmUpLCBmaWxsID0gIm9yYW5nZSIsIGFscGhhID0gMC4wMTUpICsNCiAgZ2VvbV9yZWN0KGFlcyh4bWluID0gLUluZiwgeG1heCA9IEluZiwgeW1pbiA9IC1JbmYsIHltYXggPSB0YXJnZXRfY29uc2VydmF0aXZlKSwgZmlsbCA9ICJsaWdodGNvcmFsIiwgYWxwaGEgPSAwLjAxNSkgKw0KICANCiAgIyBQbG90IGxpbmVzLCBwb2ludHMsIGFuZCBhbm5vdGF0aW9ucyBvbiB0b3Agb2Ygc2hhZGVkIGFyZWFzDQogIGdlb21fbGluZShjb2xvciA9ICIjNEIwMDgyIiwgc2l6ZSA9IDEuMCkgKyAgICAgICAjIERhcmsgcHVycGxlIGxpbmUgDQogIGdlb21fcG9pbnQoY29sb3IgPSAiIzRCMDA4MiIsIHNpemUgPSAxLjUpICsgICAgICAgICMgRGFyayBwdXJwbGUgcG9pbnRzIA0KICANCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gdGFyZ2V0X2FnZ3Jlc3NpdmUsIGNvbG9yID0gImRhcmtibHVlIiwgbGluZXR5cGUgPSAic29saWQiKSArDQogICMgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gdGFyZ2V0X21vZGVyYXRlLCBjb2xvciA9ICJkYXJrYmx1ZSIsIGxpbmV0eXBlID0gInNvbGlkIikgKw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSB0YXJnZXRfY29uc2VydmF0aXZlLCBjb2xvciA9ICJkYXJrYmx1ZSIsIGxpbmV0eXBlID0gInNvbGlkIikgKw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSB0YXJnZXRfaW5mbGF0aW9uLCBjb2xvciA9ICJkYXJrcmVkIiwgbGluZXR5cGUgPSAiZGFzaGVkIikgKw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSBjYWdyX3ZhbHVlLCBjb2xvciA9ICJkYXJrcmVkIiwgbGluZXR5cGUgPSAiZGFzaGVkIikgKw0KICANCiAgIyBEeW5hbWljIHJpZ2h0LWFsaWduZWQgcGxhY2VtZW50IGZvciBhbm5vdGF0aW9ucw0KICBhbm5vdGF0ZSgidGV4dCIsIHggPSBJbmYsIHkgPSB0YXJnZXRfYWdncmVzc2l2ZSwgbGFiZWwgPSAiQWdncmVzc2l2ZSIsIA0KICAgICAgICAgICBoanVzdCA9IDEsIHZqdXN0ID0gLTAuNTAsIGNvbG9yID0gImRhcmtibHVlIiwgc2l6ZSA9IDQpICsNCiAgIyBhbm5vdGF0ZSgidGV4dCIsIHggPSBJbmYsIHkgPSB0YXJnZXRfbW9kZXJhdGUsIGxhYmVsID0gIk1vZGVyYXRlIiwgDQogICMgICAgICAgICBoanVzdCA9IDEsIHZqdXN0ID0gLTAuNTAsIGNvbG9yID0gImRhcmtibHVlIiwgc2l6ZSA9IDQpICsNCiAgYW5ub3RhdGUoInRleHQiLCB4ID0gSW5mLCB5ID0gdGFyZ2V0X2NvbnNlcnZhdGl2ZSwgbGFiZWwgPSAiQ29uc2VydmF0aXZlIiwgDQogICAgICAgICAgIGhqdXN0ID0gMSwgdmp1c3QgPSAtMC41MCwgY29sb3IgPSAiZGFya2JsdWUiLCBzaXplID0gNCkgKw0KICBhbm5vdGF0ZSgidGV4dCIsIHggPSBJbmYsIHkgPSB0YXJnZXRfaW5mbGF0aW9uLCBsYWJlbCA9ICJJbmZsYXRpb24iLCANCiAgICAgICAgICAgaGp1c3QgPSAxLCB2anVzdCA9ICsxLjEwLCBjb2xvciA9ICJkYXJrcmVkIiwgc2l6ZSA9IDQpICsNCiAgYW5ub3RhdGUoInRleHQiLCB4ID0gSW5mLCB5ID0gY2Fncl92YWx1ZSwgbGFiZWwgPSAiQ0FHUiIsIA0KICAgICAgICAgICBoanVzdCA9IDEsIHZqdXN0ID0gKzEuMTAsIGNvbG9yID0gImRhcmtyZWQiLCBzaXplID0gNCkgKyANCg0KICBsYWJzKA0KICAgIHRpdGxlID0gZHluYW1pY190aXRsZSwNCiAgICB4ID0gIlllYXIiLA0KICAgIHkgPSAiR3Jvd3RoIFJhdGUgKCUpIiwNCiAgICBjYXB0aW9uID0gZHluYW1pY19jYXB0aW9uDQogICkgKw0KICANCiAgY29vcmRfY2FydGVzaWFuKHlsaW0gPSBjKHlfbWluLCB5X21heCkpICsgIyBBcHBseSBkeW5hbWljIHktYXhpcyBsaW1pdHMNCiAgc2NhbGVfeF9jb250aW51b3VzKA0KICAgIGxpbWl0cyA9IGMoc3RhcnRfeWVhciwgZW5kX3llYXIgKyA1KSwgDQogICAgYnJlYWtzID0gc2VxKGxpbWl0c19zdGFydF95ZWFyLCBsaW1pdHNfZW5kX3llYXIsIDUpDQogICkgKyAgIyBSZXN0cmljdCAmIFNldCBNYWpvciB4LWF4aXMgbGluZXMgZm9yIGVhY2ggeWVhcg0KICANCiAgdGhlbWVfbWluaW1hbCgpICsNCiAgdGhlbWUoDQogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSwgc2l6ZSA9IDIwKSwgICAgICAgICAjIExhcmdlciB0aXRsZSBmb250DQogICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCksICAgICAgICAgICAgICAgICAgICAjIExhcmdlciB4LWF4aXMgbGFiZWwgZm9udA0KICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQpLCAgICAgICAgICAgICAgICAgICAgIyBMYXJnZXIgeS1heGlzIGxhYmVsIGZvbnQNCiAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEsIHNpemUgPSAxNCksICAjIExhcmdlciB4LWF4aXMgdGV4dA0KICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCksICAgICAgICAgICAgICAgICAgICAgIyBMYXJnZXIgeS1heGlzIHRleHQNCiAgICBwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9saW5lKGxpbmV0eXBlID0gImRvdHRlZCIsIGNvbG9yID0gImJsYWNrIiksICAgICAgICAgIyBNYWpvciBncmlkIGxpbmVzDQogICAgcGFuZWwuZ3JpZC5taW5vci54ID0gZWxlbWVudF9ibGFuaygpLCAjIGVsZW1lbnRfbGluZShjb2xvciA9ICJncmV5ODAiKSAgIyBNaW5vciB4IGdyaWQgbGluZXMgZm9yIGVhY2ggeWVhcg0KICAgICMgcGFuZWwuYm9yZGVyID0gZWxlbWVudF9yZWN0KGNvbG9yID0gImRhcmtncmV5IiwgZmlsbCA9IE5BLCBzaXplID0gMS4wKSAgIyBEYXJrIGJvcmRlciBhcm91bmQgdGhlIHBsb3QNCiAgICBheGlzLnRpY2tzLmxlbmd0aCA9IHVuaXQoLTAuMjUsICJjbSIpLCAgICAgICAgICAgICAgICAgICAgICAjIEluY3JlYXNlIHRpY2sgbGVuZ3RoDQogICAgYXhpcy50aWNrcyA9IGVsZW1lbnRfbGluZShjb2xvciA9ICJibGFjayIsIHNpemUgPSAwLjUwKSwgIyBEYXJrZXIgdGlja3MNCiAgICBheGlzLmxpbmUueCA9IGVsZW1lbnRfbGluZShjb2xvciA9ICJibGFjayIsIHNpemUgPSAwLjc1KSwgICMgRGFyayBib3R0b20gYm9yZGVyDQogICAgYXhpcy5saW5lLnkgPSBlbGVtZW50X2xpbmUoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMC43NSkgICAjIERhcmsgbGVmdCBib3JkZXINCiAgKQ0KDQpwcmludChwMikNCg0KDQoNCg0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiMjIFBMT1QgUkVTVFJJQ1RFRCBXSVRIIExJTUlUUw0KDQojIEZpbHRlciB0aGUgZGF0YSBmb3IgdGhlIHJlc3RyaWN0ZWQgeC1heGlzIHJhbmdlICgyMDA1LTIwMjQpDQpyZXN0cmljdGVkX2RhdGEgPC0gc3B4X3JhdyAlPiUNCiAgZmlsdGVyKGFzLmludGVnZXIoRGF0ZSkgPj0gMjAwNSAmIGFzLmludGVnZXIoRGF0ZSkgPD0gMjAyNCkNCg0KIyBEZWZpbmUgc3RhcnQgYW5kIGVuZCB5ZWFycw0Kc3RhcnRfeWVhciA8LSAyMDA1DQplbmRfeWVhciA8LSAyMDI0DQp5ZWFyX3JhbmdlIDwtIGVuZF95ZWFyIC0gc3RhcnRfeWVhciArIDEgICMgQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgeWVhcnMNCg0KIyBEZWZpbmUgYnJlYWtzIHJvdW5kZWQgYXBwcm9wcmlhdGVseQ0KbGltaXRzX3N0YXJ0X3llYXIgPC0gZmxvb3Ioc3RhcnRfeWVhciAvIDUpICogNSAgIyBSb3VuZCBkb3duIHRvIHRoZSBuZWFyZXN0IG11bHRpcGxlIG9mIDUNCmxpbWl0c19lbmRfeWVhciA8LSBjZWlsaW5nKGVuZF95ZWFyIC8gNSkgKiA1ICAgIyBSb3VuZCB1cCB0byB0aGUgbmVhcmVzdCBtdWx0aXBsZSBvZiA1DQoNCiMgQ3JlYXRlIGR5bmFtaWMgdGl0bGUgYW5kIGNhcHRpb24NCmR5bmFtaWNfdGl0bGUgPC0gcGFzdGUwKCJBbm51YWwgR3Jvd3RoIFJhdGVzIE92ZXIgIix5ZWFyX3JhbmdlLCAiIFllYXJzICgiLCBzdGFydF95ZWFyLCAiLSIsIGVuZF95ZWFyLCAiKSIpDQpkeW5hbWljX2NhcHRpb24gPC0gcGFzdGUwKCJTUFggQW5udWFsIEdyb3d0aCBSYXRlcywgRGF0YSBQZXJpb2QgKCIsIG1pbl95ZWFyLCAi4oCTIiwgbWF4X3llYXIsICIpIikNCg0KIyBDYWxjdWxhdGUgZHluYW1pYyB5LWF4aXMgbGltaXRzIGZvciB0aGUgcmVzdHJpY3RlZCBkYXRhDQp5X21pbiA8LSBtaW4ocmVzdHJpY3RlZF9kYXRhJGAxLVllYXIgQ0FHUmAsIG5hLnJtID0gVFJVRSkNCnlfbWF4IDwtIG1heChyZXN0cmljdGVkX2RhdGEkYDEtWWVhciBDQUdSYCwgbmEucm0gPSBUUlVFKQ0KDQojIENyZWF0ZSB0aGUgZnVsbCwgbm9uLWZpbHRlcmVkIHgtYXhpcyBwbG90IHdpdGggZHluYW1pYyB4IHBsYWNlbWVudCBmb3IgYW5ub3RhdGlvbnMNCnAzIDwtIGdncGxvdChyZXN0cmljdGVkX2RhdGEsIGFlcyh4ID0gYXMuaW50ZWdlcihEYXRlKSwgeSA9IGAxLVllYXIgQ0FHUmApKSArDQogIA0KICAjIEFkZCBzaGFkZWQgYXJlYXMgZm9yIGJhY2tncm91bmQgZWZmZWN0DQogIGdlb21fcmVjdChhZXMoeG1pbiA9IC1JbmYsIHhtYXggPSBJbmYsIHltaW4gPSB0YXJnZXRfYWdncmVzc2l2ZSwgeW1heCA9IEluZiksIGZpbGwgPSAibGlnaHRncmVlbiIsIGFscGhhID0gMC4wMzApICsNCiAgZ2VvbV9yZWN0KGFlcyh4bWluID0gLUluZiwgeG1heCA9IEluZiwgeW1pbiA9IHRhcmdldF9jb25zZXJ2YXRpdmUsIHltYXggPSB0YXJnZXRfYWdncmVzc2l2ZSksIGZpbGwgPSAib3JhbmdlIiwgYWxwaGEgPSAwLjAzMCkgKw0KICBnZW9tX3JlY3QoYWVzKHhtaW4gPSAtSW5mLCB4bWF4ID0gSW5mLCB5bWluID0gLUluZiwgeW1heCA9IHRhcmdldF9jb25zZXJ2YXRpdmUpLCBmaWxsID0gImxpZ2h0Y29yYWwiLCBhbHBoYSA9IDAuMDMwKSArDQogIA0KICAjIFBsb3QgbGluZXMsIHBvaW50cywgYW5kIGFubm90YXRpb25zIG9uIHRvcCBvZiBzaGFkZWQgYXJlYXMNCiAgZ2VvbV9saW5lKGNvbG9yID0gIiM0QjAwODIiLCBzaXplID0gMS4wKSArICAgICAgICMgRGFyayBwdXJwbGUgbGluZSANCiAgZ2VvbV9wb2ludChjb2xvciA9ICIjNEIwMDgyIiwgc2l6ZSA9IDEuNSkgKyAgICAgICAgIyBEYXJrIHB1cnBsZSBwb2ludHMgDQogIA0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSB0YXJnZXRfYWdncmVzc2l2ZSwgY29sb3IgPSAiZGFya2JsdWUiLCBsaW5ldHlwZSA9ICJzb2xpZCIpICsNCiAgIyBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSB0YXJnZXRfbW9kZXJhdGUsIGNvbG9yID0gImRhcmtibHVlIiwgbGluZXR5cGUgPSAic29saWQiKSArDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IHRhcmdldF9jb25zZXJ2YXRpdmUsIGNvbG9yID0gImRhcmtibHVlIiwgbGluZXR5cGUgPSAic29saWQiKSArDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IHRhcmdldF9pbmZsYXRpb24sIGNvbG9yID0gImRhcmtyZWQiLCBsaW5ldHlwZSA9ICJkYXNoZWQiKSArDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IGNhZ3JfdmFsdWUsIGNvbG9yID0gImRhcmtyZWQiLCBsaW5ldHlwZSA9ICJkYXNoZWQiKSArDQogIA0KICAjIER5bmFtaWMgcmlnaHQtYWxpZ25lZCBwbGFjZW1lbnQgZm9yIGFubm90YXRpb25zDQogIGFubm90YXRlKCJ0ZXh0IiwgeCA9IEluZiwgeSA9IHRhcmdldF9hZ2dyZXNzaXZlLCBsYWJlbCA9ICJBZ2dyZXNzaXZlIiwgDQogICAgICAgICAgIGhqdXN0ID0gMSwgdmp1c3QgPSAtMC41MCwgY29sb3IgPSAiZGFya2JsdWUiLCBzaXplID0gNCkgKw0KICAjIGFubm90YXRlKCJ0ZXh0IiwgeCA9IEluZiwgeSA9IHRhcmdldF9tb2RlcmF0ZSwgbGFiZWwgPSAiTW9kZXJhdGUiLCANCiAgIyAgICAgICAgIGhqdXN0ID0gMSwgdmp1c3QgPSAtMC41MCwgY29sb3IgPSAiZGFya2JsdWUiLCBzaXplID0gNCkgKw0KICBhbm5vdGF0ZSgidGV4dCIsIHggPSBJbmYsIHkgPSB0YXJnZXRfY29uc2VydmF0aXZlLCBsYWJlbCA9ICJDb25zZXJ2YXRpdmUiLCANCiAgICAgICAgICAgaGp1c3QgPSAxLCB2anVzdCA9IC0wLjUwLCBjb2xvciA9ICJkYXJrYmx1ZSIsIHNpemUgPSA0KSArDQogIGFubm90YXRlKCJ0ZXh0IiwgeCA9IEluZiwgeSA9IHRhcmdldF9pbmZsYXRpb24sIGxhYmVsID0gIkluZmxhdGlvbiIsIA0KICAgICAgICAgICBoanVzdCA9IDEsIHZqdXN0ID0gKzEuMTAsIGNvbG9yID0gImRhcmtyZWQiLCBzaXplID0gNCkgKw0KICBhbm5vdGF0ZSgidGV4dCIsIHggPSBJbmYsIHkgPSBjYWdyX3ZhbHVlLCBsYWJlbCA9ICJDQUdSIiwgDQogICAgICAgICAgIGhqdXN0ID0gMSwgdmp1c3QgPSArMS4xMCwgY29sb3IgPSAiZGFya3JlZCIsIHNpemUgPSA0KSArIA0KDQogIGxhYnMoDQogICAgdGl0bGUgPSBkeW5hbWljX3RpdGxlLA0KICAgIHggPSAiWWVhciIsDQogICAgeSA9ICJHcm93dGggUmF0ZSAoJSkiLA0KICAgIGNhcHRpb24gPSBkeW5hbWljX2NhcHRpb24NCiAgKSArDQogIA0KICBjb29yZF9jYXJ0ZXNpYW4oeWxpbSA9IGMoeV9taW4sIHlfbWF4KSkgKyAjIEFwcGx5IGR5bmFtaWMgeS1heGlzIGxpbWl0cw0KICBzY2FsZV94X2NvbnRpbnVvdXMoDQogICAgbGltaXRzID0gYyhzdGFydF95ZWFyLCBlbmRfeWVhciArIDIpLCANCiAgICBicmVha3MgPSBzZXEobGltaXRzX3N0YXJ0X3llYXIsIGxpbWl0c19lbmRfeWVhciwgNSkNCiAgKSArICAjIFJlc3RyaWN0ICYgU2V0IE1ham9yIHgtYXhpcyBsaW5lcyBmb3IgZWFjaCB5ZWFyDQoNCiAgdGhlbWVfbWluaW1hbCgpICsNCiAgdGhlbWUoDQogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSwgc2l6ZSA9IDIwKSwgICAgICAgICAjIExhcmdlciB0aXRsZSBmb250DQogICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCksICAgICAgICAgICAgICAgICAgICAjIExhcmdlciB4LWF4aXMgbGFiZWwgZm9udA0KICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQpLCAgICAgICAgICAgICAgICAgICAgIyBMYXJnZXIgeS1heGlzIGxhYmVsIGZvbnQNCiAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEsIHNpemUgPSAxNCksICAjIExhcmdlciB4LWF4aXMgdGV4dA0KICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCksICAgICAgICAgICAgICAgICAgICAgIyBMYXJnZXIgeS1heGlzIHRleHQNCiAgICBwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9saW5lKGxpbmV0eXBlID0gImRvdHRlZCIsIGNvbG9yID0gImJsYWNrIiksICAgICAgICAgIyBNYWpvciBncmlkIGxpbmVzDQogICAgcGFuZWwuZ3JpZC5taW5vci54ID0gZWxlbWVudF9ibGFuaygpLCAjIGVsZW1lbnRfbGluZShjb2xvciA9ICJncmV5ODAiKSAgIyBNaW5vciB4IGdyaWQgbGluZXMgZm9yIGVhY2ggeWVhcg0KICAgICMgcGFuZWwuYm9yZGVyID0gZWxlbWVudF9yZWN0KGNvbG9yID0gImRhcmtncmV5IiwgZmlsbCA9IE5BLCBzaXplID0gMS4wKSAgIyBEYXJrIGJvcmRlciBhcm91bmQgdGhlIHBsb3QNCiAgICBheGlzLnRpY2tzLmxlbmd0aCA9IHVuaXQoLTAuMjUsICJjbSIpLCAgICAgICAgICAgICAgICAgICAgICAjIEluY3JlYXNlIHRpY2sgbGVuZ3RoDQogICAgYXhpcy50aWNrcyA9IGVsZW1lbnRfbGluZShjb2xvciA9ICJibGFjayIsIHNpemUgPSAwLjUwKSwgIyBEYXJrZXIgdGlja3MNCiAgICBheGlzLmxpbmUueCA9IGVsZW1lbnRfbGluZShjb2xvciA9ICJibGFjayIsIHNpemUgPSAwLjc1KSwgICMgRGFyayBib3R0b20gYm9yZGVyDQogICAgYXhpcy5saW5lLnkgPSBlbGVtZW50X2xpbmUoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMC43NSkgICAjIERhcmsgbGVmdCBib3JkZXINCiAgKQ0KDQpwcmludChwMykNCg0KYGBgDQoNCiMjIFNQWCBDQUdSDQoNCiMjIyBEYXRhDQoNCmBgYHtyIHNweF9yYXdfZ3IsIGV2YWw9VFJVRSwgZWNobz1GQUxTRX0NCg0KIyBWaWV3KG5ydCRzcHhfcmF3X2dyKQ0KaW50ZXJhY3RpdmVfc3RyKG5ydCRzcHhfcmF3X2dyKQ0KDQpsaWJyYXJ5KGRwbHlyKQ0KbGlicmFyeShsdWJyaWRhdGUpICAjIEZvciBkYXRlIG1hbmlwdWxhdGlvbg0KbGlicmFyeShzY2FsZXMpDQpsaWJyYXJ5KHN0cmluZ3IpDQoNCiMgVXBkYXRlIGRhdGEgZnJhbWUgd2l0aCBwcm9wZXIgZGF0ZSBhbmQgcGVyY2VudGFnZSBoYW5kbGluZw0Kc3B4X3Jhd19nciA8LSBucnQkc3B4X3Jhd19nciAlPiUNCiAgbXV0YXRlKA0KICAgICMgQ29udmVydCBDbG9zZSBEYXRlIHRvICJZWVlZLU1NLUREIiBmb3JtYXQNCiAgICBgRGF0ZWAgPSBmb3JtYXQoYXMuRGF0ZShhcy5jaGFyYWN0ZXIoYERhdGVgKSwgb3JpZ2luID0gIjE5NzAtMDEtMDEiKSwgIiVZLSVtLSVkIiksDQogICAgDQogICAgIyBFbnN1cmUgQ2xvc2UgaXMgYSBudW1iZXIgZm9ybWF0dGVkIHRvIDIgZGVjaW1hbCBwbGFjZXMNCiAgICBgQ2xvc2VgID0gbnVtYmVyKGFzLm51bWVyaWMoZ3N1YigiLCIsICIiLCBDbG9zZSkpLCBiaWcubWFyayA9ICIsIiwgZGVjaW1hbC5tYXJrID0gIi4iLCBhY2N1cmFjeSA9IDAuMDEpLA0KDQogICAgIyBDbGVhbiBhbmQgaGFuZGxlIHBlcmNlbnRhZ2UgY29sdW1ucw0KICAgIGFjcm9zcygzOjExLCB+IHsNCiAgICAgIHZhbHVlIDwtIGdzdWIoIlssJVxcc10iLCAiIiwgLikgICMgUmVtb3ZlICUsIGNvbW1hcywgYW5kIHNwYWNlcw0KICAgICAgbnVtZXJpY192YWx1ZSA8LSBzdXBwcmVzc1dhcm5pbmdzKGFzLm51bWVyaWModmFsdWUpKSAgIyBDb252ZXJ0IHRvIG51bWVyaWMNCiAgICAgIGlmZWxzZSgNCiAgICAgICAgIWlzLm5hKG51bWVyaWNfdmFsdWUpLCANCiAgICAgICAgcGFzdGUwKGZvcm1hdChyb3VuZChudW1lcmljX3ZhbHVlKjEwMCwgMiksIGJpZy5tYXJrID0gIiwiLCBzY2llbnRpZmljID0gRkFMU0UpLCAiJSIpLCAgIyBGb3JtYXQgdG8gMiBkZWNpbWFsIHBsYWNlcyBhbmQgYWRkIGNvbW1hcw0KICAgICAgICAuDQogICAgICApDQogICAgfSkNCiAgKSAlPiUNCiAgYXJyYW5nZShkZXNjKGBEYXRlYCkpICAjIFNvcnQgYnkgRGF0ZSBmcm9tIG5ld2VzdCB0byBvbGRlc3QNCg0KIyBDcmVhdGUgc3B4X3Jhd19ncjogQ0dSDQpzcHhfcmF3X2NnciA8LSBzcHhfcmF3X2dyICU+JQ0KICBzZWxlY3QoYERhdGVgLCBgQ2xvc2VgLCBgMS1ZZWFyIENBR1JgLCBjb250YWlucyAoIkNHUiIpKQ0KDQojIENyZWF0ZSBzcHhfcmF3X2dyOiBDQUdSDQpzcHhfcmF3X2NhZ3IgPC0gc3B4X3Jhd19nciAlPiUNCiAgc2VsZWN0KGBEYXRlYCwgYENsb3NlYCwgY29udGFpbnMgKCJDQUdSIikpDQoNCiMgRGlzcGxheSBib3RoIHRhYmxlcyBmb3IgY29uZmlybWF0aW9uDQppbnRlcmFjdGl2ZV9wcmludChzcHhfcmF3X2NncikNCmludGVyYWN0aXZlX3ByaW50KHNweF9yYXdfY2FncikNCg0KIyBPcHRpb25hbDogUHJpbnQgdGFibGUgc3VtbWFyaWVzDQppbnRlcmFjdGl2ZV9zdHIoc3B4X3Jhd19jZ3IpDQppbnRlcmFjdGl2ZV9zdHIoc3B4X3Jhd19jYWdyKQ0KDQojIERpc3BsYXkgY2FwdGlvbnMgZm9yIGVhY2ggdGFibGUNCiMgY2F0KCJcblxuIyMjIyBDdW11bGF0aXZlIEdyb3d0aCBSYXRlcyAoIiwgbWluX3llYXIsICItIiwgbWF4X3llYXIsICIpXG4iLCBzZXAgPSAiIikNCiMgZm9ybWF0X2VxdWFsX3dpZHRoKHNweF9yYXdfY2dyKQ0KDQpjYXQoIlxuXG4jIyMjIENvbXBvdW5kIEF2ZXJhZ2UgR3Jvd3RoIFJhdGVzICgiLCBtaW5feWVhciwgIi0iLCBtYXhfeWVhciwgIilcbiIsIHNlcCA9ICIiKQ0KZm9ybWF0X2VxdWFsX3dpZHRoKHNweF9yYXdfY2FncikNCg0KIyBWaWV3KHNweF9yYXdfY2FncikNCiMgY29sbmFtZXMoc3B4X3Jhd19jYWdyKQ0KaW50ZXJhY3RpdmVfc3RyKHNweF9yYXdfY2FncikNCg0KDQpgYGANCg0KIyMjIFN1bW1hcnkNCg0KYGBge3Igc3B4X3Jhd19jYWdyX3N1bW1hcnksIGV2YWw9VFJVRSwgZWNobz1GQUxTRX0NCg0KaW50ZXJhY3RpdmVfc3RyKHNweF9yYXdfY2FncikNCg0KIyBMb2FkIG5lY2Vzc2FyeSBsaWJyYXJpZXMNCmxpYnJhcnkoZHBseXIpDQpsaWJyYXJ5KHRpYmJsZSkNCg0KIyBEZWZpbmUgYSBoZWxwZXIgZnVuY3Rpb24gdG8gY2xlYW4gYW5kIGNvbnZlcnQgcGVyY2VudGFnZXMNCmNsZWFuX3BlcmNlbnRhZ2UgPC0gZnVuY3Rpb24oY29sdW1uKSB7DQogIGFzLm51bWVyaWMoZ3N1YigiJSIsICIiLCBjb2x1bW4pKQ0KfQ0KDQojIERlZmluZSB0aGUgc3RhdGlzdGljIG5hbWVzIGZvciB0aGUgc3VtbWFyeSB0YWJsZQ0Kc3RhdGlzdGljX25hbWVzIDwtIGMoDQogICJDb3VudCBvZiBPYnNlcnZhdGlvbnMiLCANCiAgIk1lYW4iLCANCiAgIk1lZGlhbiIsDQogICJTdGFuZGFyZCBEZXZpYXRpb24gKFZvbGF0aWxpdHkpIiwgDQogICJNaW4gQ0FHUiBSYW5nZSAoQ0FHUiAtIFNEKSIsDQogICJNYXggQ0FHUiBSYW5nZSAoQ0FHUiArIFNEKSIsDQogICJNaW5pbXVtIiwgDQogICJNYXhpbXVtIiwgDQogICJQZXJjZW50IEFib3ZlIEluZmxhdGlvbiBUYXJnZXQiLCANCiAgIlBlcmNlbnQgQWJvdmUgQ29uc2VydmF0aXZlIFRhcmdldCIsIA0KICAiUGVyY2VudCBBYm92ZSBNb2RlcmF0ZSBUYXJnZXQiLCANCiAgIlBlcmNlbnQgQWJvdmUgQWdncmVzc2l2ZSBUYXJnZXQiDQopDQoNCiMgQWRqdXN0IHRoZSBmaXJzdCByb3cncyBEYXRlIGFuZCBjbGVhbiB1cCBDQUdSIGNvbHVtbnMNCnNweF9yYXdfY2FnciA8LSBzcHhfcmF3X2NhZ3IgJT4lDQogIHNsaWNlKC0xKSAlPiUgIyBSZW1vdmUgdGhlIGZpcnN0IHJvdw0KICBtdXRhdGUoDQogICAgIyBEYXRlID0gaWZlbHNlKHJvd19udW1iZXIoKSA9PSAxLCAiMjAyNS0wMS0wMSIsIERhdGUpLA0KICAgIERhdGUgPSBhcy5udW1lcmljKGZvcm1hdChhcy5EYXRlKERhdGUpLCAiJVkiKSksDQogICAgYDEtWWVhciBDQUdSYCA9IGNsZWFuX3BlcmNlbnRhZ2UoYDEtWWVhciBDQUdSYCksDQogICAgYDUtWWVhciBDQUdSYCA9IGNsZWFuX3BlcmNlbnRhZ2UoYDUtWWVhciBDQUdSYCksDQogICAgYDEwLVllYXIgQ0FHUmAgPSBjbGVhbl9wZXJjZW50YWdlKGAxMC1ZZWFyIENBR1JgKSwNCiAgICBgMjAtWWVhciBDQUdSYCA9IGNsZWFuX3BlcmNlbnRhZ2UoYDIwLVllYXIgQ0FHUmApLA0KICAgIGAzMC1ZZWFyIENBR1JgID0gY2xlYW5fcGVyY2VudGFnZShgMzAtWWVhciBDQUdSYCkNCiAgKQ0KDQojIEZ1bmN0aW9uIHRvIGNhbGN1bGF0ZSBzdGF0aXN0aWNzIGZvciBhIGdpdmVuIGRhdGFzZXQNCmNhbGNfc3RhdHMgPC0gZnVuY3Rpb24oZGF0YSkgew0KICBpZiAoc3VtKCFpcy5uYShkYXRhKSkgPCAyKSByZXR1cm4ocmVwKE5BLCBsZW5ndGgoc3RhdGlzdGljX25hbWVzKSkpICAjIEhhbmRsZSBpbnN1ZmZpY2llbnQgZGF0YQ0KDQogIGNvdW50X29ic2VydmF0aW9ucyA8LSBzdW0oIWlzLm5hKGRhdGEpKQ0KICBtZWFuX3ZhbHVlIDwtIHJvdW5kKG1lYW4oZGF0YSwgbmEucm0gPSBUUlVFKSwgMikNCiAgbWVkaWFuX3ZhbHVlIDwtIHJvdW5kKG1lZGlhbihkYXRhLCBuYS5ybSA9IFRSVUUpLCAyKQ0KICBzZF92YWx1ZSA8LSByb3VuZChzZChkYXRhLCBuYS5ybSA9IFRSVUUpLCAyKQ0KICBtaW5fY2Fncl9yYW5nZSA8LSByb3VuZChjYWdyX3ZhbHVlIC0gc2RfdmFsdWUsIDIpDQogIG1heF9jYWdyX3JhbmdlIDwtIHJvdW5kKGNhZ3JfdmFsdWUgKyBzZF92YWx1ZSwgMikNCiAgbWluX3ZhbHVlIDwtIHJvdW5kKG1pbihkYXRhLCBuYS5ybSA9IFRSVUUpLCAyKQ0KICBtYXhfdmFsdWUgPC0gcm91bmQobWF4KGRhdGEsIG5hLnJtID0gVFJVRSksIDIpDQogIA0KICAjIERlZmluZSBpbmZsYXRpb24gYW5kIGdyb3d0aCB0YXJnZXRzDQogIHRhcmdldF9pbmZsYXRpb24gPC0gMiAgIyBFeGFtcGxlIHRhcmdldCBmb3IgaW5mbGF0aW9uDQogIHRhcmdldF9jb25zZXJ2YXRpdmUgPC0gMyArIHRhcmdldF9pbmZsYXRpb24NCiAgdGFyZ2V0X21vZGVyYXRlIDwtIDUgKyB0YXJnZXRfaW5mbGF0aW9uDQogIHRhcmdldF9hZ2dyZXNzaXZlIDwtIDEwICsgdGFyZ2V0X2luZmxhdGlvbg0KICANCiAgYWJvdmVfdGFyZ2V0X2luZmxhdGlvbiA8LSBzdW0oZGF0YSA+PSB0YXJnZXRfaW5mbGF0aW9uLCBuYS5ybSA9IFRSVUUpDQogIGFib3ZlX3RhcmdldF9jb25zZXJ2YXRpdmUgPC0gc3VtKGRhdGEgPj0gdGFyZ2V0X2NvbnNlcnZhdGl2ZSwgbmEucm0gPSBUUlVFKQ0KICBhYm92ZV90YXJnZXRfbW9kZXJhdGUgPC0gc3VtKGRhdGEgPj0gdGFyZ2V0X21vZGVyYXRlLCBuYS5ybSA9IFRSVUUpDQogIGFib3ZlX3RhcmdldF9hZ2dyZXNzaXZlIDwtIHN1bShkYXRhID49IHRhcmdldF9hZ2dyZXNzaXZlLCBuYS5ybSA9IFRSVUUpDQogIA0KICBwZXJjZW50X2Fib3ZlX3RhcmdldF9jb25zZXJ2YXRpdmUgPC0gcm91bmQoKGFib3ZlX3RhcmdldF9jb25zZXJ2YXRpdmUgLyBjb3VudF9vYnNlcnZhdGlvbnMpICogMTAwLCAyKQ0KICBwZXJjZW50X2Fib3ZlX3RhcmdldF9pbmZsYXRpb24gPC0gcm91bmQoKGFib3ZlX3RhcmdldF9pbmZsYXRpb24gLyBjb3VudF9vYnNlcnZhdGlvbnMpICogMTAwLCAyKQ0KICBwZXJjZW50X2Fib3ZlX3RhcmdldF9tb2RlcmF0ZSA8LSByb3VuZCgoYWJvdmVfdGFyZ2V0X21vZGVyYXRlIC8gY291bnRfb2JzZXJ2YXRpb25zKSAqIDEwMCwgMikNCiAgcGVyY2VudF9hYm92ZV90YXJnZXRfYWdncmVzc2l2ZSA8LSByb3VuZCgoYWJvdmVfdGFyZ2V0X2FnZ3Jlc3NpdmUgLyBjb3VudF9vYnNlcnZhdGlvbnMpICogMTAwLCAyKQ0KICANCiAgYygNCiAgICBjb3VudF9vYnNlcnZhdGlvbnMsIA0KICAgIHBhc3RlMChtZWFuX3ZhbHVlLCAiJSIpLA0KICAgIHBhc3RlMChtZWRpYW5fdmFsdWUsICIlIiksDQogICAgcGFzdGUwKHNkX3ZhbHVlLCAiJSIpLA0KICAgIHBhc3RlMChtaW5fY2Fncl9yYW5nZSwgIiUiKSwNCiAgICBwYXN0ZTAobWF4X2NhZ3JfcmFuZ2UsICIlIiksDQogICAgcGFzdGUwKG1pbl92YWx1ZSwgIiUiKSwNCiAgICBwYXN0ZTAobWF4X3ZhbHVlLCAiJSIpLA0KICAgIHBhc3RlMChwZXJjZW50X2Fib3ZlX3RhcmdldF9pbmZsYXRpb24sICIlIiksDQogICAgcGFzdGUwKHBlcmNlbnRfYWJvdmVfdGFyZ2V0X2NvbnNlcnZhdGl2ZSwgIiUiKSwgDQogICAgcGFzdGUwKHBlcmNlbnRfYWJvdmVfdGFyZ2V0X21vZGVyYXRlLCAiJSIpLCANCiAgICBwYXN0ZTAocGVyY2VudF9hYm92ZV90YXJnZXRfYWdncmVzc2l2ZSwgIiUiKQ0KICApDQp9DQoNCiMgQ29sdW1ucyB0byBjYWxjdWxhdGUgQ0FHUiBzdGF0aXN0aWNzDQpjYWdyX2NvbHVtbnMgPC0gYygiMS1ZZWFyIENBR1IiLCAiNS1ZZWFyIENBR1IiLCAiMTAtWWVhciBDQUdSIiwgIjIwLVllYXIgQ0FHUiIsICIzMC1ZZWFyIENBR1IiKQ0KZXhpc3RpbmdfY2Fncl9jb2x1bW5zIDwtIGludGVyc2VjdChjYWdyX2NvbHVtbnMsIG5hbWVzKHNweF9yYXdfY2FncikpDQoNCiMgQ2FsY3VsYXRlIHN0YXRzIGZvciBlYWNoIENBR1IgY29sdW1uDQpjYWdyX3N0YXRzX2xpc3QgPC0gbGFwcGx5KHNweF9yYXdfY2FncltleGlzdGluZ19jYWdyX2NvbHVtbnNdLCBjYWxjX3N0YXRzKQ0KDQojIENvbXBpbGUgaW50byBhIHN1bW1hcnkgZGF0YSBmcmFtZQ0Kc3B4X3Jhd19jYWdyX3N1bW1hcnkgPC0gYXMuZGF0YS5mcmFtZShkby5jYWxsKGNiaW5kLCBjYWdyX3N0YXRzX2xpc3QpKQ0Kcm93bmFtZXMoc3B4X3Jhd19jYWdyX3N1bW1hcnkpIDwtIHN0YXRpc3RpY19uYW1lcw0KDQoNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQojIyBTQVZFIFZBTFVFUyBGT1IgSU4tTElORSBDT0RFDQoNCiMgRGVmaW5lIHRoZSBtYXBwaW5nIG9mIHJvdyBuYW1lcyB0byB2YXJpYWJsZSBuYW1lcw0Kcm93X3RvX3Zhcl9uYW1lIDwtIGMoDQogICJDb3VudCBvZiBPYnNlcnZhdGlvbnMiID0gImNvdW50X29ic2VydmF0aW9ucyIsDQogICJNZWFuIiA9ICJtZWFuX3ZhbHVlIiwNCiAgIk1lZGlhbiIgPSAibWVkaWFuX3ZhbHVlIiwNCiAgIlN0YW5kYXJkIERldmlhdGlvbiAoVm9sYXRpbGl0eSkiID0gInNkX3ZhbHVlIiwNCiAgIk1pbiBDQUdSIFJhbmdlIChDQUdSIC0gU0QpIiA9ICJtaW5fY2Fncl9yYW5nZSIsDQogICJNYXggQ0FHUiBSYW5nZSAoQ0FHUiArIFNEKSIgPSAibWF4X2NhZ3JfcmFuZ2UiLA0KICAiTWluaW11bSIgPSAibWluX3ZhbHVlIiwNCiAgIk1heGltdW0iID0gIm1heF92YWx1ZSIsDQogICJQZXJjZW50IEFib3ZlIEluZmxhdGlvbiBUYXJnZXQiID0gInBlcmNlbnRfYWJvdmVfdGFyZ2V0X2luZmxhdGlvbiIsDQogICJQZXJjZW50IEFib3ZlIENvbnNlcnZhdGl2ZSBUYXJnZXQiID0gInBlcmNlbnRfYWJvdmVfdGFyZ2V0X2NvbnNlcnZhdGl2ZSIsDQogICJQZXJjZW50IEFib3ZlIE1vZGVyYXRlIFRhcmdldCIgPSAicGVyY2VudF9hYm92ZV90YXJnZXRfbW9kZXJhdGUiLA0KICAiUGVyY2VudCBBYm92ZSBBZ2dyZXNzaXZlIFRhcmdldCIgPSAicGVyY2VudF9hYm92ZV90YXJnZXRfYWdncmVzc2l2ZSINCikNCg0KIyBGdW5jdGlvbiB0byBzYXZlIHN1bW1hcnkgdmFsdWVzIGR5bmFtaWNhbGx5DQpzYXZlX2NvbHVtbl92YWx1ZXMgPC0gZnVuY3Rpb24oc3VtbWFyeV9kZikgew0KICAjIEV4Y2x1ZGUgdGhlICJTdGF0aXN0aWMiIGFuZCAiT3ZlcmFsbCIgY29sdW1ucw0KICBjb2x1bW5zX3RvX3NhdmUgPC0gc2V0ZGlmZihuYW1lcyhzdW1tYXJ5X2RmKSwgYygiU3RhdGlzdGljIiwgIk92ZXJhbGwiKSkNCiAgDQogICMgSXRlcmF0ZSBvdmVyIGVhY2ggY29sdW1uDQogIGZvciAoY29sIGluIGNvbHVtbnNfdG9fc2F2ZSkgew0KICAgICMgRm9ybWF0IGNvbHVtbiBuYW1lIHRvIGxvd2VyY2FzZSBhbmQgcmVwbGFjZSBpbnZhbGlkIGNoYXJhY3RlcnMNCiAgICBjb2xfbmFtZSA8LSB0b2xvd2VyKGdzdWIoIlteYS16QS1aMC05XSIsICJfIiwgY29sKSkNCiAgICANCiAgICAjIEV4dHJhY3QgdmFsdWVzIGZvciB0aGUgY3VycmVudCBjb2x1bW4NCiAgICBjb2xfdmFsdWVzIDwtIHN1bW1hcnlfZGZbW2NvbF1dDQogICAgDQogICAgIyBTYXZlIGVhY2ggdmFsdWUgZHluYW1pY2FsbHkgdXNpbmcgdGhlIG1hcHBpbmcgZm9yIHJvdyBuYW1lcw0KICAgIGZvciAoaSBpbiBzZXFfYWxvbmcoY29sX3ZhbHVlcykpIHsNCiAgICAgICMgR2V0IHRoZSBjb3JyZXNwb25kaW5nIHZhcmlhYmxlIG5hbWUgZnJvbSB0aGUgbWFwcGluZw0KICAgICAgc3RhdF9uYW1lIDwtIHJvd190b192YXJfbmFtZVtyb3duYW1lcyhzdW1tYXJ5X2RmKVtpXV0NCiAgICAgIA0KICAgICAgaWYgKCFpcy5uYShzdGF0X25hbWUpKSB7ICAjIFNraXAgaWYgbm8gbWFwcGluZyBpcyBkZWZpbmVkDQogICAgICAgICMgQ3JlYXRlIHRoZSB2YXJpYWJsZSBuYW1lDQogICAgICAgIHZhcl9uYW1lIDwtIHBhc3RlMChzdGF0X25hbWUsICJfIiwgY29sX25hbWUpDQogICAgICAgIA0KICAgICAgICAjIEF0dGVtcHQgbnVtZXJpYyBjb252ZXJzaW9uIGZvciBkb3duc3RyZWFtIHVzZQ0KICAgICAgICB2YWx1ZSA8LSBzdXBwcmVzc1dhcm5pbmdzKGFzLm51bWVyaWMoZ3N1YigiJSIsICIiLCBjb2xfdmFsdWVzW2ldKSkpDQogICAgICAgIA0KICAgICAgICAjIEFzc2lnbiB0aGUgdmFsdWUgdG8gdGhlIGdsb2JhbCBlbnZpcm9ubWVudA0KICAgICAgICBhc3NpZ24odmFyX25hbWUsIHZhbHVlLCBlbnZpciA9IC5HbG9iYWxFbnYpDQogICAgICB9DQogICAgfQ0KICB9DQp9DQoNCiMgQXBwbHkgdGhlIGZ1bmN0aW9uIHRvIHNhdmUgdmFsdWVzIGZvciBhbGwgY29sdW1ucyBleGNlcHQgIk92ZXJhbGwiDQpzYXZlX2NvbHVtbl92YWx1ZXMoc3B4X3Jhd19jYWdyX3N1bW1hcnkpDQoNCiMgRXhhbXBsZTogQWNjZXNzaW5nIGR5bmFtaWNhbGx5IGNyZWF0ZWQgdmFyaWFibGVzDQppbnRlcmFjdGl2ZV9wcmludChtZWFuX3ZhbHVlXzFfeWVhcl9jYWdyKSAgIyBTaG91bGQgcHJpbnQgdGhlIG1lYW4gdmFsdWUgZm9yIDEtWWVhciBDQUdSDQppbnRlcmFjdGl2ZV9wcmludChwZXJjZW50X2Fib3ZlX3RhcmdldF9pbmZsYXRpb25fNV95ZWFyX2NhZ3IpICAjIFNob3VsZCBwcmludCB0aGUgcGVyY2VudCBhYm92ZSBpbmZsYXRpb24gdGFyZ2V0IGZvciA1LVllYXIgQ0FHUg0KaW50ZXJhY3RpdmVfcHJpbnQoc2RfdmFsdWVfMTBfeWVhcl9jYWdyKSAgIyBTaG91bGQgcHJpbnQgdGhlIHN0YW5kYXJkIGRldmlhdGlvbiBmb3IgMTAtWWVhciBDQUdSDQoNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQojIyBPVkVSQUxMIFNUQVRJU1RJQ1MgDQpudW1lcmljX3ZhbHVlc19hbGwgPC0gYXMubnVtZXJpYyh1bmxpc3Qoc3B4X3Jhd19jYWdyW2V4aXN0aW5nX2NhZ3JfY29sdW1uc10sIHVzZS5uYW1lcyA9IEZBTFNFKSkNCm51bWVyaWNfdmFsdWVzX2FsbCA8LSBudW1lcmljX3ZhbHVlc19hbGxbIWlzLm5hKG51bWVyaWNfdmFsdWVzX2FsbCldDQoNCm92ZXJhbGxfY291bnRfb2JzZXJ2YXRpb25zIDwtIGxlbmd0aChudW1lcmljX3ZhbHVlc19hbGwpDQpvdmVyYWxsX21lYW5fdmFsdWUgPC0gcm91bmQobWVhbihudW1lcmljX3ZhbHVlc19hbGwpLCAyKQ0Kb3ZlcmFsbF9tZWRpYW5fdmFsdWUgPC0gcm91bmQobWVkaWFuKG51bWVyaWNfdmFsdWVzX2FsbCksIDIpDQpvdmVyYWxsX3NkX3ZhbHVlIDwtIHJvdW5kKHNkKG51bWVyaWNfdmFsdWVzX2FsbCksIDIpDQpvdmVyYWxsX21pbl9jYWdyX3JhbmdlIDwtIHJvdW5kKGNhZ3JfdmFsdWUgLSBvdmVyYWxsX3NkX3ZhbHVlLCAyKQ0Kb3ZlcmFsbF9tYXhfY2Fncl9yYW5nZSA8LSByb3VuZChjYWdyX3ZhbHVlICsgb3ZlcmFsbF9zZF92YWx1ZSwgMikNCm92ZXJhbGxfbWluX3ZhbHVlIDwtIHJvdW5kKG1pbihudW1lcmljX3ZhbHVlc19hbGwpLCAyKQ0Kb3ZlcmFsbF9tYXhfdmFsdWUgPC0gcm91bmQobWF4KG51bWVyaWNfdmFsdWVzX2FsbCksIDIpDQoNCm92ZXJhbGxfYWJvdmVfdGFyZ2V0X2luZmxhdGlvbiA8LSBzdW0obnVtZXJpY192YWx1ZXNfYWxsID49IHRhcmdldF9pbmZsYXRpb24sIG5hLnJtID0gVFJVRSkNCm92ZXJhbGxfYWJvdmVfdGFyZ2V0X2NvbnNlcnZhdGl2ZSA8LSBzdW0obnVtZXJpY192YWx1ZXNfYWxsID49IHRhcmdldF9jb25zZXJ2YXRpdmUsIG5hLnJtID0gVFJVRSkNCm92ZXJhbGxfYWJvdmVfdGFyZ2V0X21vZGVyYXRlIDwtIHN1bShudW1lcmljX3ZhbHVlc19hbGwgPj0gdGFyZ2V0X21vZGVyYXRlLCBuYS5ybSA9IFRSVUUpDQpvdmVyYWxsX2Fib3ZlX3RhcmdldF9hZ2dyZXNzaXZlIDwtIHN1bShudW1lcmljX3ZhbHVlc19hbGwgPj0gdGFyZ2V0X2FnZ3Jlc3NpdmUsIG5hLnJtID0gVFJVRSkNCg0Kb3ZlcmFsbF9wZXJjZW50X2Fib3ZlX3RhcmdldF9jb25zZXJ2YXRpdmUgPC0gcm91bmQoKG92ZXJhbGxfYWJvdmVfdGFyZ2V0X2NvbnNlcnZhdGl2ZSAvIG92ZXJhbGxfY291bnRfb2JzZXJ2YXRpb25zKSAqIDEwMCwgMikNCm92ZXJhbGxfcGVyY2VudF9hYm92ZV90YXJnZXRfaW5mbGF0aW9uIDwtIHJvdW5kKChvdmVyYWxsX2Fib3ZlX3RhcmdldF9pbmZsYXRpb24gLyBvdmVyYWxsX2NvdW50X29ic2VydmF0aW9ucykgKiAxMDAsIDIpDQpvdmVyYWxsX3BlcmNlbnRfYWJvdmVfdGFyZ2V0X21vZGVyYXRlIDwtIHJvdW5kKChvdmVyYWxsX2Fib3ZlX3RhcmdldF9tb2RlcmF0ZSAvIG92ZXJhbGxfY291bnRfb2JzZXJ2YXRpb25zKSAqIDEwMCwgMikNCm92ZXJhbGxfcGVyY2VudF9hYm92ZV90YXJnZXRfYWdncmVzc2l2ZSA8LSByb3VuZCgob3ZlcmFsbF9hYm92ZV90YXJnZXRfYWdncmVzc2l2ZSAvIG92ZXJhbGxfY291bnRfb2JzZXJ2YXRpb25zKSAqIDEwMCwgMikNCg0Kc3B4X3Jhd19jYWdyX3N1bW1hcnkkT3ZlcmFsbCA8LSBjKA0KICBvdmVyYWxsX2NvdW50X29ic2VydmF0aW9ucywNCiAgcGFzdGUwKG92ZXJhbGxfbWVhbl92YWx1ZSwgIiUiKSwNCiAgcGFzdGUwKG92ZXJhbGxfbWVkaWFuX3ZhbHVlLCAiJSIpLA0KICBwYXN0ZTAob3ZlcmFsbF9zZF92YWx1ZSwgIiUiKSwNCiAgcGFzdGUwKG92ZXJhbGxfbWluX2NhZ3JfcmFuZ2UsICIlIiksDQogIHBhc3RlMChvdmVyYWxsX21heF9jYWdyX3JhbmdlLCAiJSIpLA0KICBwYXN0ZTAob3ZlcmFsbF9taW5fdmFsdWUsICIlIiksDQogIHBhc3RlMChvdmVyYWxsX21heF92YWx1ZSwgIiUiKSwNCiAgcGFzdGUwKG92ZXJhbGxfcGVyY2VudF9hYm92ZV90YXJnZXRfaW5mbGF0aW9uLCAiJSIpLA0KICBwYXN0ZTAob3ZlcmFsbF9wZXJjZW50X2Fib3ZlX3RhcmdldF9jb25zZXJ2YXRpdmUsICIlIiksDQogIHBhc3RlMChvdmVyYWxsX3BlcmNlbnRfYWJvdmVfdGFyZ2V0X21vZGVyYXRlLCAiJSIpLA0KICBwYXN0ZTAob3ZlcmFsbF9wZXJjZW50X2Fib3ZlX3RhcmdldF9hZ2dyZXNzaXZlLCAiJSIpDQopDQoNCiMgQ29udmVydCByb3cgbmFtZXMgdG8gYSBjb2x1bW4NCnNweF9yYXdfY2Fncl9zdW1tYXJ5IDwtIHRpYmJsZTo6cm93bmFtZXNfdG9fY29sdW1uKHNweF9yYXdfY2Fncl9zdW1tYXJ5LCB2YXIgPSAiU3RhdGlzdGljIikNCg0KIyBFbnN1cmUgYWxsIGNvbHVtbnMgYXJlIGNoYXJhY3Rlcg0Kc3B4X3Jhd19jYWdyX3N1bW1hcnkgPC0gc3B4X3Jhd19jYWdyX3N1bW1hcnkgJT4lDQogIG11dGF0ZShhY3Jvc3MoZXZlcnl0aGluZygpLCBhcy5jaGFyYWN0ZXIpKQ0KDQojIERpc3BsYXkgdGhlIHN1bW1hcnkgdGFibGUNCmNhdCgiXG4jIyMjIENvbXBvdW5kIEF2ZXJhZ2UgR3Jvd3RoIFJhdGVzICgiLCBtaW5feWVhciwgIi0iLCBtYXhfeWVhciwgIilcbiIsIHNlcCA9ICIiKQ0KaW50ZXJhY3RpdmVfc3RyKHNweF9yYXdfY2Fncl9zdW1tYXJ5KQ0KZm9ybWF0X3Vuc3BlY2lmaWVkX3dpZHRoKHNweF9yYXdfY2Fncl9zdW1tYXJ5KQ0KDQpgYGANCg0KKipgciBtaW5feWVhcmAtYHIgbWF4X3llYXJgIFN1bW1hcnk6KiogVGhlIDEtWWVhciBDQUdSIGV4aGliaXRzIHRoZSBgciBpZihtZWFuX3ZhbHVlXzFfeWVhcl9jYWdyID09IG1heChjKG1lYW5fdmFsdWVfMV95ZWFyX2NhZ3IsIG1lYW5fdmFsdWVfNV95ZWFyX2NhZ3IsIG1lYW5fdmFsdWVfMTBfeWVhcl9jYWdyLCBtZWFuX3ZhbHVlXzIwX3llYXJfY2FnciwgbWVhbl92YWx1ZV8zMF95ZWFyX2NhZ3IpKSkgImhpZ2hlc3QgbWVhbiByZXR1cm4iIGVsc2UgaWYobWVhbl92YWx1ZV8xX3llYXJfY2FnciA9PSBtaW4oYyhtZWFuX3ZhbHVlXzFfeWVhcl9jYWdyLCBtZWFuX3ZhbHVlXzVfeWVhcl9jYWdyLCBtZWFuX3ZhbHVlXzEwX3llYXJfY2FnciwgbWVhbl92YWx1ZV8yMF95ZWFyX2NhZ3IsIG1lYW5fdmFsdWVfMzBfeWVhcl9jYWdyKSkpICJsb3dlc3QgbWVhbiByZXR1cm4iIGVsc2UgIm1lYW4gcmV0dXJuImAgYXQgYHIgbWVhbl92YWx1ZV8xX3llYXJfY2FncmAlLCBhbmQgYHIgaWYoc2RfdmFsdWVfMV95ZWFyX2NhZ3IgPT0gbWF4KGMoc2RfdmFsdWVfMV95ZWFyX2NhZ3IsIHNkX3ZhbHVlXzVfeWVhcl9jYWdyLCBzZF92YWx1ZV8xMF95ZWFyX2NhZ3IsIHNkX3ZhbHVlXzIwX3llYXJfY2Fnciwgc2RfdmFsdWVfMzBfeWVhcl9jYWdyKSkpICJ0aGUgZ3JlYXRlc3Qgdm9sYXRpbGl0eSB3aXRoIGEiIGVsc2UgaWYoc2RfdmFsdWVfMV95ZWFyX2NhZ3IgPT0gbWluKGMoc2RfdmFsdWVfMV95ZWFyX2NhZ3IsIHNkX3ZhbHVlXzVfeWVhcl9jYWdyLCBzZF92YWx1ZV8xMF95ZWFyX2NhZ3IsIHNkX3ZhbHVlXzIwX3llYXJfY2Fnciwgc2RfdmFsdWVfMzBfeWVhcl9jYWdyKSkpICJ0aGUgbGVhc3Qgdm9sYXRpbGl0eSB3aXRoIGEiIGVsc2UgIndpdGgiYCBhIHN0YW5kYXJkIGRldmlhdGlvbiBvZiBgciBzZF92YWx1ZV8xX3llYXJfY2FncmAlLiBBcyB0aGUgaW52ZXN0bWVudCBob3Jpem9uIGV4dGVuZHMgdG8gNSwgMTAsIDIwLCBhbmQgMzAgeWVhcnMsIHRoZSBtZWFuIHJldHVybnMgYHIgaWYobWVhbl92YWx1ZV8xX3llYXJfY2FnciA8IG1lYW4oYyhtZWFuX3ZhbHVlXzVfeWVhcl9jYWdyLCBtZWFuX3ZhbHVlXzEwX3llYXJfY2FnciwgbWVhbl92YWx1ZV8yMF95ZWFyX2NhZ3IsIG1lYW5fdmFsdWVfMzBfeWVhcl9jYWdyKSkpICJpbmNyZWFzZSIgZWxzZSAiZGVjcmVhc2UiYCwgcmFuZ2luZyBmcm9tIGByIG1lYW5fdmFsdWVfNV95ZWFyX2NhZ3JgJSB0byBgciBtZWFuX3ZhbHVlXzMwX3llYXJfY2FncmAlLCB3aGlsZSB2b2xhdGlsaXR5IGByIGlmKHNkX3ZhbHVlXzFfeWVhcl9jYWdyIDwgbWVhbihjKHNkX3ZhbHVlXzVfeWVhcl9jYWdyLCBzZF92YWx1ZV8xMF95ZWFyX2NhZ3IsIHNkX3ZhbHVlXzIwX3llYXJfY2Fnciwgc2RfdmFsdWVfMzBfeWVhcl9jYWdyKSkpICJyaXNlcyIgZWxzZSAiZGltaW5pc2hlcyJgLCB3aXRoIHN0YW5kYXJkIGRldmlhdGlvbnMgYHIgaWYoc2RfdmFsdWVfMV95ZWFyX2NhZ3IgPiBzZF92YWx1ZV8zMF95ZWFyX2NhZ3IpICJkcm9wcGluZyIgZWxzZSAicmlzaW5nImAgZnJvbSBgciBzZF92YWx1ZV81X3llYXJfY2FncmAlIHRvIGByIHNkX3ZhbHVlXzMwX3llYXJfY2FncmAlLiBUaGlzIHRyZW5kIGluZGljYXRlcyB0aGF0IGxvbmdlciBpbnZlc3RtZW50IHBlcmlvZHMgdGVuZCB0byBvZmZlciBgciBpZihzZF92YWx1ZV8xX3llYXJfY2FnciA+IHNkX3ZhbHVlXzMwX3llYXJfY2FncikgIm1vcmUgc3RhYmxlIiBlbHNlICJsZXNzIHN0YWJsZSJgIHJldHVybnMuIEZ1cnRoZXJtb3JlLCB0aGUgcGVyY2VudGFnZSBvZiBwZXJpb2RzIGV4Y2VlZGluZyB0aGUgaW5mbGF0aW9uIHRhcmdldCBgciBpZihwZXJjZW50X2Fib3ZlX3RhcmdldF9pbmZsYXRpb25fMV95ZWFyX2NhZ3IgPCBwZXJjZW50X2Fib3ZlX3RhcmdldF9pbmZsYXRpb25fMzBfeWVhcl9jYWdyKSAiaW5jcmVhc2VzIiBlbHNlICJkZWNyZWFzZXMiYCB3aXRoIGxvbmdlciBkdXJhdGlvbnMsIGZyb20gYHIgcGVyY2VudF9hYm92ZV90YXJnZXRfaW5mbGF0aW9uXzFfeWVhcl9jYWdyYCUgaW4gdGhlIDEtWWVhciBDQUdSIHRvIGByIHBlcmNlbnRfYWJvdmVfdGFyZ2V0X2luZmxhdGlvbl8zMF95ZWFyX2NhZ3JgJSBpbiB0aGUgMzAtWWVhciBDQUdSLCB1bmRlcnNjb3JpbmcgU1BYJ3MgYHIgaWYocGVyY2VudF9hYm92ZV90YXJnZXRfaW5mbGF0aW9uXzFfeWVhcl9jYWdyIDwgcGVyY2VudF9hYm92ZV90YXJnZXRfaW5mbGF0aW9uXzMwX3llYXJfY2FncikgImVmZmVjdGl2ZW5lc3MiIGVsc2UgImluZWZmZWN0aXZlbmVzcyJgIGFzIGEgaGVkZ2UgYWdhaW5zdCBpbmZsYXRpb24gb3ZlciBleHRlbmRlZCB0aW1lZnJhbWVzLiBXaXRoIGFuIG92ZXJhbGwgcGVyY2VudGFnZSBvZiBgciBvdmVyYWxsX3BlcmNlbnRfYWJvdmVfdGFyZ2V0X2FnZ3Jlc3NpdmVgJSBleGNlZWRpbmcgdGhlIGFnZ3Jlc3NpdmUgdGFyZ2V0IChgciB0YXJnZXRfYWdncmVzc2l2ZWAlIGFubnVhbGl6ZWQgcmV0dXJucyB3aXRoIGByIHRhcmdldF9pbmZsYXRpb25gJSBpbmZsYXRpb24pLCBTUFggYHIgaWYob3ZlcmFsbF9wZXJjZW50X2Fib3ZlX3RhcmdldF9hZ2dyZXNzaXZlID4gNTApICJoYXMsIG92ZXIgdGhpcyB0aW1lIHBlcmlvZCwgcHJvdmVuIHRvIGJlIGEgc3Ryb25nIiBlbHNlIGlmKG92ZXJhbGxfcGVyY2VudF9hYm92ZV90YXJnZXRfYWdncmVzc2l2ZSA+IDQwKSAiaGFzLCBvdmVyIHRoaXMgdGltZSBwZXJpb2QsIGRlbW9uc3RyYXRlZCBpdHNlbGYgYXMgYSB2aWFibGUiIGVsc2UgImFwcGVhcnMsIG92ZXIgdGhpcyB0aW1lIHBlcmlvZCwgdG8gYmUgYSBsZXNzIHN1aXRhYmxlImAgb3B0aW9uIGZvciBhIGhpZ2gtcmV0dXJuaW5nIGxvbmctdGVybSBpbnZlc3RtZW50Lg0KDQoNCiMjIyBHcmFwaA0KDQojIyMjIEFsbCBQZXJpb2RzDQoNCmBgYHtyIHNweF9yYXdfY2Fncl9ncmFwaHNfYWxsLCBmaWcud2lkdGg9MTAsIGZpZy5oZWlnaHQ9NywgZXZhbD1UUlVFLCBlY2hvPUZBTFNFfQ0KDQpjYXQoIlxuXG4jIyMjIENvbXBvdW5kIEF2ZXJhZ2UgR3Jvd3RoIFJhdGVzIEFjcm9zcyBQZXJpb2RzIFxuIikNCg0KIyBMb2FkIG5lY2Vzc2FyeSBsaWJyYXJpZXMNCmxpYnJhcnkoZ2dwbG90MikNCmxpYnJhcnkoZHBseXIpDQoNCg0KIyBDb252ZXJ0IGNvbHVtbnMgdG8gbnVtZXJpYyBmb3IgcGxvdHRpbmcgaWYgbmVlZGVkDQpzcHhfcmF3X2NhZ3IgPC0gc3B4X3Jhd19jYWdyICU+JQ0KICBtdXRhdGUoDQogICAgYERhdGVgID0gYXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIoYERhdGVgKSksICAjIEVuc3VyZSBEYXRlIGlzIG51bWVyaWMNCiAgICBgMS1ZZWFyIENBR1JgID0gYXMubnVtZXJpYyhnc3ViKCIlIiwgIiIsIGAxLVllYXIgQ0FHUmApKSwNCiAgICBgNS1ZZWFyIENBR1JgID0gYXMubnVtZXJpYyhnc3ViKCIlIiwgIiIsIGA1LVllYXIgQ0FHUmApKSwNCiAgICBgMTAtWWVhciBDQUdSYCA9IGFzLm51bWVyaWMoZ3N1YigiJSIsICIiLCBgMTAtWWVhciBDQUdSYCkpLA0KICAgIGAyMC1ZZWFyIENBR1JgID0gYXMubnVtZXJpYyhnc3ViKCIlIiwgIiIsIGAyMC1ZZWFyIENBR1JgKSksDQogICAgYDMwLVllYXIgQ0FHUmAgPSBhcy5udW1lcmljKGdzdWIoIiUiLCAiIiwgYDMwLVllYXIgQ0FHUmApKQ0KICApDQoNCiMgUmVzaGFwZSB0aGUgZGF0YSBpbnRvIGxvbmcgZm9ybWF0IGZvciBlYXN5IHBsb3R0aW5nIG9mIG11bHRpcGxlIGxpbmVzIGFuZCBzZXQgdGhlIGZhY3RvciBvcmRlcg0KbnJ0X2xvbmcgPC0gc3B4X3Jhd19jYWdyICU+JQ0KICBwaXZvdF9sb25nZXIoY29scyA9IGMoYDEtWWVhciBDQUdSYCwgYDUtWWVhciBDQUdSYCwgYDEwLVllYXIgQ0FHUmAsIGAyMC1ZZWFyIENBR1JgLCBgMzAtWWVhciBDQUdSYCksDQogICAgICAgICAgICAgICBuYW1lc190byA9ICJDQUdSX1BlcmlvZCIsDQogICAgICAgICAgICAgICB2YWx1ZXNfdG8gPSAiQ0FHUl9WYWx1ZSIpICU+JQ0KICBtdXRhdGUoQ0FHUl9QZXJpb2QgPSBmYWN0b3IoQ0FHUl9QZXJpb2QsIGxldmVscyA9IGMoIjEtWWVhciBDQUdSIiwgIjUtWWVhciBDQUdSIiwgIjEwLVllYXIgQ0FHUiIsICIyMC1ZZWFyIENBR1IiLCAiMzAtWWVhciBDQUdSIikpKQ0KDQojIEFzc2lnbiBjb2xvcnMgZHluYW1pY2FsbHkgYmFzZWQgb24gdGhlIG9yZGVyIG9mIENBR1JfUGVyaW9kIGluIHRoZSBkYXRhDQojIE1hdGNoIHRoZSB1bmlxdWUgbGV2ZWxzIG9mIENBR1JfUGVyaW9kIHdpdGggY29sb3JzIGZyb20gY29sb3JzX2dlbmVyYWxfZGFyaw0KdW5pcXVlX3R5cGVzIDwtIHVuaXF1ZShucnRfbG9uZyRDQUdSX1BlcmlvZCkNCmN1c3RvbV9jb2xvcnMgPC0gc2V0TmFtZXMoY29sb3JzX2dlbmVyYWxfZGFya1sxOmxlbmd0aCh1bmlxdWVfdHlwZXMpXSwgdW5pcXVlX3R5cGVzKQ0KDQojIEZpbmQgdGhlIG1pbmltdW0gYW5kIG1heGltdW0geC12YWx1ZSBpbiB5b3VyIGRhdGENCm1heF94IDwtIG1heChhcy5pbnRlZ2VyKHNweF9yYXdfY2FnciREYXRlKSwgbmEucm0gPSBUUlVFKQ0KbWluX3ggPC0gbWluKGFzLmludGVnZXIoc3B4X3Jhd19jYWdyJERhdGUpLCBuYS5ybSA9IFRSVUUpDQppbnRlcmFjdGl2ZV9wcmludChtYXhfeCkgICMgVGVzdA0KaW50ZXJhY3RpdmVfcHJpbnQobWluX3gpICAjIFRlc3QNCg0KIyBGaW5kIHRoZSBtaW5pbXVtIGFuZCBtYXhpbXVtIHllYXINCm1pbl95ZWFyIDwtIG1pbl94DQptYXhfeWVhciA8LSBtYXhfeA0KaW50ZXJhY3RpdmVfcHJpbnQobWluX3llYXIpDQppbnRlcmFjdGl2ZV9wcmludChtYXhfeWVhcikNCg0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiMjIFBMT1QgRlVMTCBXSVRIT1VUIExJTUlUUw0KDQojIERlZmluZSBzdGFydCBhbmQgZW5kIHllYXJzDQpzdGFydF95ZWFyIDwtIGFzLm51bWVyaWMobWluX3llYXIpDQplbmRfeWVhciA8LSAyMDI0DQp5ZWFyX3JhbmdlIDwtIGVuZF95ZWFyIC0gc3RhcnRfeWVhciArIDEgICMgQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgeWVhcnMNCg0KIyBEZWZpbmUgYnJlYWtzIHJvdW5kZWQgYXBwcm9wcmlhdGVseQ0KbGltaXRzX3N0YXJ0X3llYXIgPC0gZmxvb3Ioc3RhcnRfeWVhciAvIDUpICogNSAgIyBSb3VuZCBkb3duIHRvIHRoZSBuZWFyZXN0IG11bHRpcGxlIG9mIDUNCmxpbWl0c19lbmRfeWVhciA8LSBjZWlsaW5nKGVuZF95ZWFyIC8gNSkgKiA1ICAgIyBSb3VuZCB1cCB0byB0aGUgbmVhcmVzdCBtdWx0aXBsZSBvZiA1DQoNCiMgQ3JlYXRlIGR5bmFtaWMgdGl0bGUgYW5kIGNhcHRpb24NCmR5bmFtaWNfdGl0bGUgPC0gcGFzdGUwKCJSb2xsaW5nIENBR1JzIEFjcm9zcyBQZXJpb2RzIE92ZXIgIix5ZWFyX3JhbmdlLCAiIFllYXJzICgiLCBzdGFydF95ZWFyLCAiLSIsIGVuZF95ZWFyLCAiKSIpDQpkeW5hbWljX2NhcHRpb24gPC0gcGFzdGUwKCJTUFggQ29tcG91bmQgQXZlcmFnZSBHcm93dGggUmF0ZXMgQWNyb3NzIFJvbGxpbmcgUGVyaW9kcywgRGF0YXNldCAoIiwgbWluX3llYXIsICItIiwgbWF4X3llYXIsICIpIikNCg0KIyBDcmVhdGUgdGhlIGZ1bGwsIG5vbi1maWx0ZXJlZCB4LWF4aXMgcGxvdCB3aXRoIGR5bmFtaWMgeCBwbGFjZW1lbnQgZm9yIGFubm90YXRpb25zDQpwMSA8LSBnZ3Bsb3QobnJ0X2xvbmcsIGFlcyh4ID0gYXMuaW50ZWdlcihEYXRlKSwgeSA9IENBR1JfVmFsdWUsIGNvbG9yID0gQ0FHUl9QZXJpb2QpKSArDQoNCiAgIyBBZGQgc2hhZGVkIGFyZWFzIGZvciBiYWNrZ3JvdW5kIGVmZmVjdA0KICBnZW9tX3JlY3QoYWVzKHhtaW4gPSAtSW5mLCB4bWF4ID0gSW5mLCB5bWluID0gdGFyZ2V0X2FnZ3Jlc3NpdmUsIHltYXggPSBJbmYpLCBmaWxsID0gImxpZ2h0Z3JlZW4iLCBhbHBoYSA9IDAuMDEwKSArDQogIGdlb21fcmVjdChhZXMoeG1pbiA9IC1JbmYsIHhtYXggPSBJbmYsIHltaW4gPSB0YXJnZXRfY29uc2VydmF0aXZlLCB5bWF4ID0gdGFyZ2V0X2FnZ3Jlc3NpdmUpLCBmaWxsID0gIm9yYW5nZSIsIGFscGhhID0gMC4wMSkgKw0KICBnZW9tX3JlY3QoYWVzKHhtaW4gPSAtSW5mLCB4bWF4ID0gSW5mLCB5bWluID0gLUluZiwgeW1heCA9IHRhcmdldF9jb25zZXJ2YXRpdmUpLCBmaWxsID0gImxpZ2h0Y29yYWwiLCBhbHBoYSA9IDAuMDEwKSArDQogIA0KICAjIFBsb3QgbGluZXMgZm9yIGVhY2ggQ0FHUiBQZXJpb2QNCiAgZ2VvbV9saW5lKHNpemUgPSAxLjAsIGFscGhhID0gMy4wKSArICAgICAgICMgTGluZSBmb3IgZWFjaCBDQUdSDQogIGdlb21fcG9pbnQoc2l6ZSA9IDEuMCwgYWxwaGEgPSAzLjApICsgICAgICAgIyBQb2ludHMgZm9yIGVhY2ggQ0FHUg0KICANCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gdGFyZ2V0X2FnZ3Jlc3NpdmUsIGNvbG9yID0gImRhcmtibHVlIiwgbGluZXR5cGUgPSAic29saWQiKSArDQogICMgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gdGFyZ2V0X21vZGVyYXRlLCBjb2xvciA9ICJkYXJrYmx1ZSIsIGxpbmV0eXBlID0gInNvbGlkIikgKw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSB0YXJnZXRfY29uc2VydmF0aXZlLCBjb2xvciA9ICJkYXJrYmx1ZSIsIGxpbmV0eXBlID0gInNvbGlkIikgKw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSB0YXJnZXRfaW5mbGF0aW9uLCBjb2xvciA9ICJkYXJrcmVkIiwgbGluZXR5cGUgPSAiZGFzaGVkIikgKw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSBtZWFuX3ZhbHVlLCBjb2xvciA9ICJkYXJrcmVkIiwgbGluZXR5cGUgPSAiZGFzaGVkIikgKw0KICANCiAgIyBEeW5hbWljIHJpZ2h0LWFsaWduZWQgcGxhY2VtZW50IGZvciBhbm5vdGF0aW9ucw0KICBhbm5vdGF0ZSgidGV4dCIsIHggPSBJbmYsIHkgPSB0YXJnZXRfYWdncmVzc2l2ZSwgbGFiZWwgPSAiQWdncmVzc2l2ZSIsIA0KICAgICAgICAgICBoanVzdCA9IDEsIHZqdXN0ID0gLTAuNTAsIGNvbG9yID0gImRhcmtibHVlIiwgc2l6ZSA9IDQpICsNCiAgIyBhbm5vdGF0ZSgidGV4dCIsIHggPSBJbmYsIHkgPSB0YXJnZXRfbW9kZXJhdGUsIGxhYmVsID0gIk1vZGVyYXRlIiwgDQogICMgICAgICAgICBoanVzdCA9IDEsIHZqdXN0ID0gLTAuNTAsIGNvbG9yID0gImRhcmtibHVlIiwgc2l6ZSA9IDQpICsNCiAgYW5ub3RhdGUoInRleHQiLCB4ID0gSW5mLCB5ID0gdGFyZ2V0X2NvbnNlcnZhdGl2ZSwgbGFiZWwgPSAiQ29uc2VydmF0aXZlIiwgDQogICAgICAgICAgIGhqdXN0ID0gMSwgdmp1c3QgPSArMS4xMCwgY29sb3IgPSAiZGFya2JsdWUiLCBzaXplID0gNCkgKw0KICBhbm5vdGF0ZSgidGV4dCIsIHggPSBJbmYsIHkgPSB0YXJnZXRfaW5mbGF0aW9uLCBsYWJlbCA9ICJJbmZsYXRpb24iLCANCiAgICAgICAgICAgaGp1c3QgPSAxLCB2anVzdCA9ICsxLjEwLCBjb2xvciA9ICJkYXJrcmVkIiwgc2l6ZSA9IDQpICsNCiAgYW5ub3RhdGUoInRleHQiLCB4ID0gSW5mLCB5ID0gY2Fncl92YWx1ZSwgbGFiZWwgPSAiQ0FHUiIsIA0KICAgICAgICAgICBoanVzdCA9IDEsIHZqdXN0ID0gLTAuNzUsIGNvbG9yID0gImRhcmtyZWQiLCBzaXplID0gNCkgKyANCg0KICBsYWJzKA0KICAgIHRpdGxlID0gZHluYW1pY190aXRsZSwNCiAgICB4ID0gIlllYXIiLA0KICAgIHkgPSAiQ0FHUiBWYWx1ZSAoJSkiLA0KICAgIGNvbG9yID0gIkNBR1IgUGVyaW9kIiwNCiAgICBjYXB0aW9uID0gZHluYW1pY19jYXB0aW9uDQogICAgKSArDQogIA0KICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gY3VzdG9tX2NvbG9ycykgKyAgIyBTZXQgY29sb3JzIGZvciBlYWNoIENBR1IgUGVyaW9kDQogIHNjYWxlX3hfY29udGludW91cygNCiAgICBsaW1pdHMgPSBjKHN0YXJ0X3llYXIsIGVuZF95ZWFyICsgMTAgKyA1KSwgDQogICAgYnJlYWtzID0gc2VxKGxpbWl0c19zdGFydF95ZWFyLCBsaW1pdHNfZW5kX3llYXIgKyA1LCA1KSkgKyAgIyBSZXN0cmljdCAmIFNldCBNYWpvciB4LWF4aXMgbGluZXMgZm9yIGVhY2ggeWVhcg0KICANCiAgdGhlbWVfbWluaW1hbCgpICsNCiAgdGhlbWUoDQogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSwgc2l6ZSA9IDIwKSwgICAgICAgICAjIExhcmdlciB0aXRsZSBmb250DQogICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCksICAgICAgICAgICAgICAgICAgICAjIExhcmdlciB4LWF4aXMgbGFiZWwgZm9udA0KICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQpLCAgICAgICAgICAgICAgICAgICAgIyBMYXJnZXIgeS1heGlzIGxhYmVsIGZvbnQNCiAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEsIHNpemUgPSAxNCksICAjIExhcmdlciB4LWF4aXMgdGV4dA0KICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCksICAgICAgICAgICAgICAgICAgICAgIyBMYXJnZXIgeS1heGlzIHRleHQNCiAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0KSwgICAgICAgICAgICAgICAgICAgICMgTGVnZW5kIHRpdGxlIHNpemUNCiAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIpLCAgICAgICAgICAgICAgICAgICAgICMgTGVnZW5kIHRleHQgc2l6ZQ0KICAgIHBhbmVsLmdyaWQubWFqb3IgPSBlbGVtZW50X2xpbmUobGluZXR5cGUgPSAiZG90dGVkIiwgY29sb3IgPSAiYmxhY2siKSwgICMgTWFqb3IgZ3JpZCBsaW5lcw0KICAgIHBhbmVsLmdyaWQubWlub3IueCA9IGVsZW1lbnRfYmxhbmsoKSwgICAgICAgICAgICAgICAgICAgICAgIyBObyBtaW5vciB4IGdyaWQgbGluZXMNCiAgICBheGlzLnRpY2tzLmxlbmd0aCA9IHVuaXQoLTAuMjUsICJjbSIpLCAgICAgICAgICAgICAgICAgICAgICAjIEluY3JlYXNlIHRpY2sgbGVuZ3RoDQogICAgYXhpcy50aWNrcyA9IGVsZW1lbnRfbGluZShjb2xvciA9ICJibGFjayIsIHNpemUgPSAwLjUwKSwgICAjIERhcmtlciB0aWNrcw0KICAgIGF4aXMubGluZS54ID0gZWxlbWVudF9saW5lKGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDAuNzUpLCAgIyBEYXJrIGJvdHRvbSBib3JkZXINCiAgICBheGlzLmxpbmUueSA9IGVsZW1lbnRfbGluZShjb2xvciA9ICJibGFjayIsIHNpemUgPSAwLjc1KSAgICMgRGFyayBsZWZ0IGJvcmRlcg0KICApDQoNCiMgUHJpbnQgdGhlIHBsb3QgDQpwcmludChwMSkNCg0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiMjIFBMT1QgUkVTVFJJQ1RFRCBXSVRIIExJTUlUUyANCg0KIyBGaWx0ZXIgdGhlIGRhdGEgZm9yIHRoZSByZXN0cmljdGVkIHgtYXhpcyByYW5nZSAoMTk3NS0yMDI0KQ0KcmVzdHJpY3RlZF9kYXRhIDwtIG5ydF9sb25nICU+JQ0KICBmaWx0ZXIoYXMuaW50ZWdlcihEYXRlKSA+PSAxOTc1ICYgYXMuaW50ZWdlcihEYXRlKSA8PSAyMDI0KQ0KDQojIERlZmluZSBzdGFydCBhbmQgZW5kIHllYXJzDQpzdGFydF95ZWFyIDwtIDE5NzUNCmVuZF95ZWFyIDwtIDIwMjQNCnllYXJfcmFuZ2UgPC0gZW5kX3llYXIgLSBzdGFydF95ZWFyICsgMSAgIyBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiB5ZWFycw0KDQojIERlZmluZSBicmVha3Mgcm91bmRlZCBhcHByb3ByaWF0ZWx5DQpsaW1pdHNfc3RhcnRfeWVhciA8LSBmbG9vcihzdGFydF95ZWFyIC8gNSkgKiA1ICAjIFJvdW5kIGRvd24gdG8gdGhlIG5lYXJlc3QgbXVsdGlwbGUgb2YgNQ0KbGltaXRzX2VuZF95ZWFyIDwtIGNlaWxpbmcoZW5kX3llYXIgLyA1KSAqIDUgICAjIFJvdW5kIHVwIHRvIHRoZSBuZWFyZXN0IG11bHRpcGxlIG9mIDUNCg0KIyBDcmVhdGUgZHluYW1pYyB0aXRsZSBhbmQgY2FwdGlvbg0KZHluYW1pY190aXRsZSA8LSBwYXN0ZTAoIlJvbGxpbmcgQ0FHUnMgQWNyb3NzIFBlcmlvZHMgT3ZlciAiLHllYXJfcmFuZ2UsICIgWWVhcnMgKCIsIHN0YXJ0X3llYXIsICItIiwgZW5kX3llYXIsICIpIikNCmR5bmFtaWNfY2FwdGlvbiA8LSBwYXN0ZTAoIlNQWCBDb21wb3VuZCBBdmVyYWdlIEdyb3d0aCBSYXRlcyBBY3Jvc3MgUm9sbGluZyBQZXJpb2RzLCBEYXRhc2V0ICgiLCBtaW5feWVhciwgIi0iLCBtYXhfeWVhciwgIikiKQ0KDQojIENhbGN1bGF0ZSBkeW5hbWljIHktYXhpcyBsaW1pdHMgZm9yIHRoZSByZXN0cmljdGVkIGRhdGENCnlfbWluIDwtIG1pbihyZXN0cmljdGVkX2RhdGEkQ0FHUl9WYWx1ZSwgbmEucm0gPSBUUlVFKQ0KeV9tYXggPC0gbWF4KHJlc3RyaWN0ZWRfZGF0YSRDQUdSX1ZhbHVlLCBuYS5ybSA9IFRSVUUpDQoNCiMgQ3JlYXRlIHRoZSBmaWx0ZXJlZCwgcmVzdHJpY3RlZCB4LWF4aXMgcGxvdCB3aXRoIGR5bmFtaWMgeCBwbGFjZW1lbnQgZm9yIGFubm90YXRpb25zDQpwMiA8LSBnZ3Bsb3QobnJ0X2xvbmcsIGFlcyh4ID0gYXMuaW50ZWdlcihEYXRlKSwgeSA9IENBR1JfVmFsdWUsIGNvbG9yID0gQ0FHUl9QZXJpb2QpKSArDQoNCiAgIyBBZGQgc2hhZGVkIGFyZWFzIGZvciBiYWNrZ3JvdW5kIGVmZmVjdA0KICBnZW9tX3JlY3QoYWVzKHhtaW4gPSAtSW5mLCB4bWF4ID0gSW5mLCB5bWluID0gdGFyZ2V0X2FnZ3Jlc3NpdmUsIHltYXggPSBJbmYpLCBmaWxsID0gImxpZ2h0Z3JlZW4iLCBhbHBoYSA9IDAuMDEwKSArDQogIGdlb21fcmVjdChhZXMoeG1pbiA9IC1JbmYsIHhtYXggPSBJbmYsIHltaW4gPSB0YXJnZXRfY29uc2VydmF0aXZlLCB5bWF4ID0gdGFyZ2V0X2FnZ3Jlc3NpdmUpLCBmaWxsID0gIm9yYW5nZSIsIGFscGhhID0gMC4wMSkgKw0KICBnZW9tX3JlY3QoYWVzKHhtaW4gPSAtSW5mLCB4bWF4ID0gSW5mLCB5bWluID0gLUluZiwgeW1heCA9IHRhcmdldF9jb25zZXJ2YXRpdmUpLCBmaWxsID0gImxpZ2h0Y29yYWwiLCBhbHBoYSA9IDAuMDEwKSArDQogIA0KICAjIFBsb3QgbGluZXMgZm9yIGVhY2ggQ0FHUiBQZXJpb2QNCiAgZ2VvbV9saW5lKHNpemUgPSAxLjAsIGFscGhhID0gMy4wKSArICAgICAgICMgTGluZSBmb3IgZWFjaCBDQUdSDQogIGdlb21fcG9pbnQoc2l6ZSA9IDEuMCwgYWxwaGEgPSAzLjApICsgICAgICAgIyBQb2ludHMgZm9yIGVhY2ggQ0FHUg0KICANCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gdGFyZ2V0X2FnZ3Jlc3NpdmUsIGNvbG9yID0gImRhcmtibHVlIiwgbGluZXR5cGUgPSAic29saWQiKSArDQogICMgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gdGFyZ2V0X21vZGVyYXRlLCBjb2xvciA9ICJkYXJrYmx1ZSIsIGxpbmV0eXBlID0gInNvbGlkIikgKw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSB0YXJnZXRfY29uc2VydmF0aXZlLCBjb2xvciA9ICJkYXJrYmx1ZSIsIGxpbmV0eXBlID0gInNvbGlkIikgKw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSB0YXJnZXRfaW5mbGF0aW9uLCBjb2xvciA9ICJkYXJrcmVkIiwgbGluZXR5cGUgPSAiZGFzaGVkIikgKw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSBtZWFuX3ZhbHVlLCBjb2xvciA9ICJkYXJrcmVkIiwgbGluZXR5cGUgPSAiZGFzaGVkIikgKw0KICANCiAgIyBEeW5hbWljIHJpZ2h0LWFsaWduZWQgcGxhY2VtZW50IGZvciBhbm5vdGF0aW9ucw0KICBhbm5vdGF0ZSgidGV4dCIsIHggPSBJbmYsIHkgPSB0YXJnZXRfYWdncmVzc2l2ZSwgbGFiZWwgPSAiQWdncmVzc2l2ZSIsIA0KICAgICAgICAgICBoanVzdCA9IDEsIHZqdXN0ID0gLTAuNTAsIGNvbG9yID0gImRhcmtibHVlIiwgc2l6ZSA9IDQpICsNCiAgIyBhbm5vdGF0ZSgidGV4dCIsIHggPSBJbmYsIHkgPSB0YXJnZXRfbW9kZXJhdGUsIGxhYmVsID0gIk1vZGVyYXRlIiwgDQogICMgICAgICAgICBoanVzdCA9IDEsIHZqdXN0ID0gLTAuNTAsIGNvbG9yID0gImRhcmtibHVlIiwgc2l6ZSA9IDQpICsNCiAgYW5ub3RhdGUoInRleHQiLCB4ID0gSW5mLCB5ID0gdGFyZ2V0X2NvbnNlcnZhdGl2ZSwgbGFiZWwgPSAiQ29uc2VydmF0aXZlIiwgDQogICAgICAgICAgIGhqdXN0ID0gMSwgdmp1c3QgPSArMS4xMCwgY29sb3IgPSAiZGFya2JsdWUiLCBzaXplID0gNCkgKw0KICBhbm5vdGF0ZSgidGV4dCIsIHggPSBJbmYsIHkgPSB0YXJnZXRfaW5mbGF0aW9uLCBsYWJlbCA9ICJJbmZsYXRpb24iLCANCiAgICAgICAgICAgaGp1c3QgPSAxLCB2anVzdCA9ICsxLjEwLCBjb2xvciA9ICJkYXJrcmVkIiwgc2l6ZSA9IDQpICsNCiAgYW5ub3RhdGUoInRleHQiLCB4ID0gSW5mLCB5ID0gY2Fncl92YWx1ZSwgbGFiZWwgPSAiQ0FHUiIsIA0KICAgICAgICAgICBoanVzdCA9IDEsIHZqdXN0ID0gLTEuMjUsIGNvbG9yID0gImRhcmtyZWQiLCBzaXplID0gNCkgKyANCg0KICBsYWJzKA0KICAgIHRpdGxlID0gZHluYW1pY190aXRsZSwNCiAgICB4ID0gIlllYXIiLA0KICAgIHkgPSAiQ0FHUiBWYWx1ZSAoJSkiLA0KICAgIGNvbG9yID0gIkNBR1IgUGVyaW9kIiwNCiAgICBjYXB0aW9uID0gZHluYW1pY19jYXB0aW9uDQogICAgKSArDQogIA0KICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gY3VzdG9tX2NvbG9ycykgKyAgIyBTZXQgY29sb3JzIGZvciBlYWNoIENBR1IgUGVyaW9kDQogIGNvb3JkX2NhcnRlc2lhbih5bGltID0gYyh5X21pbiwgeV9tYXgpKSArICMgQXBwbHkgZHluYW1pYyB5LWF4aXMgbGltaXRzDQogIHNjYWxlX3hfY29udGludW91cygNCiAgICBsaW1pdHMgPSBjKHN0YXJ0X3llYXIsIGVuZF95ZWFyICsgNSArIDEpLCANCiAgICBicmVha3MgPSBzZXEobGltaXRzX3N0YXJ0X3llYXIsIGxpbWl0c19lbmRfeWVhciwgNSkNCiAgKSArICAjIFJlc3RyaWN0ICYgU2V0IE1ham9yIHgtYXhpcyBsaW5lcyBmb3IgZWFjaCB5ZWFyDQoNCiAgdGhlbWVfbWluaW1hbCgpICsNCiAgdGhlbWUoDQogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSwgc2l6ZSA9IDIwKSwgICAgICAgICAjIExhcmdlciB0aXRsZSBmb250DQogICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCksICAgICAgICAgICAgICAgICAgICAjIExhcmdlciB4LWF4aXMgbGFiZWwgZm9udA0KICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQpLCAgICAgICAgICAgICAgICAgICAgIyBMYXJnZXIgeS1heGlzIGxhYmVsIGZvbnQNCiAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEsIHNpemUgPSAxNCksICAjIExhcmdlciB4LWF4aXMgdGV4dA0KICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCksICAgICAgICAgICAgICAgICAgICAgIyBMYXJnZXIgeS1heGlzIHRleHQNCiAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0KSwgICAgICAgICAgICAgICAgICAgICMgTGVnZW5kIHRpdGxlIHNpemUNCiAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIpLCAgICAgICAgICAgICAgICAgICAgICMgTGVnZW5kIHRleHQgc2l6ZQ0KICAgIHBhbmVsLmdyaWQubWFqb3IgPSBlbGVtZW50X2xpbmUobGluZXR5cGUgPSAiZG90dGVkIiwgY29sb3IgPSAiYmxhY2siKSwgICMgTWFqb3IgZ3JpZCBsaW5lcw0KICAgIHBhbmVsLmdyaWQubWlub3IueCA9IGVsZW1lbnRfYmxhbmsoKSwgICAgICAgICAgICAgICAgICAgICAgIyBObyBtaW5vciB4IGdyaWQgbGluZXMNCiAgICBheGlzLnRpY2tzLmxlbmd0aCA9IHVuaXQoLTAuMjUsICJjbSIpLCAgICAgICAgICAgICAgICAgICAgICAjIEluY3JlYXNlIHRpY2sgbGVuZ3RoDQogICAgYXhpcy50aWNrcyA9IGVsZW1lbnRfbGluZShjb2xvciA9ICJibGFjayIsIHNpemUgPSAwLjUwKSwgICAjIERhcmtlciB0aWNrcw0KICAgIGF4aXMubGluZS54ID0gZWxlbWVudF9saW5lKGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDAuNzUpLCAgIyBEYXJrIGJvdHRvbSBib3JkZXINCiAgICBheGlzLmxpbmUueSA9IGVsZW1lbnRfbGluZShjb2xvciA9ICJibGFjayIsIHNpemUgPSAwLjc1KSAgICMgRGFyayBsZWZ0IGJvcmRlcg0KICApDQoNCiMgUHJpbnQgdGhlIHBsb3QgDQpwcmludChwMikNCg0KDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KIyMgUExPVCBSRVNUUklDVEVEIFdJVEggTElNSVRTIA0KDQojIEZpbHRlciB0aGUgZGF0YSBmb3IgdGhlIHJlc3RyaWN0ZWQgeC1heGlzIHJhbmdlICgyMDA1LTIwMjQpDQpyZXN0cmljdGVkX2RhdGEgPC0gbnJ0X2xvbmcgJT4lDQogIGZpbHRlcihhcy5pbnRlZ2VyKERhdGUpID49IDIwMDUgJiBhcy5pbnRlZ2VyKERhdGUpIDw9IDIwMjQpDQoNCiMgRGVmaW5lIHN0YXJ0IGFuZCBlbmQgeWVhcnMNCnN0YXJ0X3llYXIgPC0gMjAwNQ0KZW5kX3llYXIgPC0gMjAyNA0KeWVhcl9yYW5nZSA8LSBlbmRfeWVhciAtIHN0YXJ0X3llYXIgKyAxICAjIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIHllYXJzDQoNCiMgRGVmaW5lIGJyZWFrcyByb3VuZGVkIGFwcHJvcHJpYXRlbHkNCmxpbWl0c19zdGFydF95ZWFyIDwtIGZsb29yKHN0YXJ0X3llYXIgLyA1KSAqIDUgICMgUm91bmQgZG93biB0byB0aGUgbmVhcmVzdCBtdWx0aXBsZSBvZiA1DQpsaW1pdHNfZW5kX3llYXIgPC0gY2VpbGluZyhlbmRfeWVhciAvIDUpICogNSAgICMgUm91bmQgdXAgdG8gdGhlIG5lYXJlc3QgbXVsdGlwbGUgb2YgNQ0KDQojIENyZWF0ZSBkeW5hbWljIHRpdGxlIGFuZCBjYXB0aW9uDQpkeW5hbWljX3RpdGxlIDwtIHBhc3RlMCgiUm9sbGluZyBDQUdScyBBY3Jvc3MgUGVyaW9kcyBPdmVyICIseWVhcl9yYW5nZSwgIiBZZWFycyAoIiwgc3RhcnRfeWVhciwgIi0iLCBlbmRfeWVhciwgIikiKQ0KZHluYW1pY19jYXB0aW9uIDwtIHBhc3RlMCgiU1BYIENvbXBvdW5kIEF2ZXJhZ2UgR3Jvd3RoIFJhdGVzIEFjcm9zcyBSb2xsaW5nIFBlcmlvZHMsIERhdGFzZXQgKCIsIG1pbl95ZWFyLCAiLSIsIG1heF95ZWFyLCAiKSIpDQoNCiMgQ2FsY3VsYXRlIGR5bmFtaWMgeS1heGlzIGxpbWl0cyBmb3IgdGhlIHJlc3RyaWN0ZWQgZGF0YQ0KeV9taW4gPC0gbWluKHJlc3RyaWN0ZWRfZGF0YSRDQUdSX1ZhbHVlLCBuYS5ybSA9IFRSVUUpDQp5X21heCA8LSBtYXgocmVzdHJpY3RlZF9kYXRhJENBR1JfVmFsdWUsIG5hLnJtID0gVFJVRSkNCg0KIyBDcmVhdGUgdGhlIGZpbHRlcmVkLCByZXN0cmljdGVkIHgtYXhpcyBwbG90IHdpdGggZHluYW1pYyB4IHBsYWNlbWVudCBmb3IgYW5ub3RhdGlvbnMNCnAzIDwtIGdncGxvdChucnRfbG9uZywgYWVzKHggPSBhcy5pbnRlZ2VyKERhdGUpLCB5ID0gQ0FHUl9WYWx1ZSwgY29sb3IgPSBDQUdSX1BlcmlvZCkpICsNCg0KICAjIEFkZCBzaGFkZWQgYXJlYXMgZm9yIGJhY2tncm91bmQgZWZmZWN0DQogIGdlb21fcmVjdChhZXMoeG1pbiA9IC1JbmYsIHhtYXggPSBJbmYsIHltaW4gPSB0YXJnZXRfYWdncmVzc2l2ZSwgeW1heCA9IEluZiksIGZpbGwgPSAibGlnaHRncmVlbiIsIGFscGhhID0gMC4wMTApICsNCiAgZ2VvbV9yZWN0KGFlcyh4bWluID0gLUluZiwgeG1heCA9IEluZiwgeW1pbiA9IHRhcmdldF9jb25zZXJ2YXRpdmUsIHltYXggPSB0YXJnZXRfYWdncmVzc2l2ZSksIGZpbGwgPSAib3JhbmdlIiwgYWxwaGEgPSAwLjAxKSArDQogIGdlb21fcmVjdChhZXMoeG1pbiA9IC1JbmYsIHhtYXggPSBJbmYsIHltaW4gPSAtSW5mLCB5bWF4ID0gdGFyZ2V0X2NvbnNlcnZhdGl2ZSksIGZpbGwgPSAibGlnaHRjb3JhbCIsIGFscGhhID0gMC4wMTApICsNCiAgDQogICMgUGxvdCBsaW5lcyBmb3IgZWFjaCBDQUdSIFBlcmlvZA0KICBnZW9tX2xpbmUoc2l6ZSA9IDEuMCwgYWxwaGEgPSAzLjApICsgICAgICAgIyBMaW5lIGZvciBlYWNoIENBR1INCiAgZ2VvbV9wb2ludChzaXplID0gMS4wLCBhbHBoYSA9IDMuMCkgKyAgICAgICAjIFBvaW50cyBmb3IgZWFjaCBDQUdSDQoNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gdGFyZ2V0X2FnZ3Jlc3NpdmUsIGNvbG9yID0gImRhcmtibHVlIiwgbGluZXR5cGUgPSAic29saWQiKSArDQogICMgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gdGFyZ2V0X21vZGVyYXRlLCBjb2xvciA9ICJkYXJrYmx1ZSIsIGxpbmV0eXBlID0gInNvbGlkIikgKw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSB0YXJnZXRfY29uc2VydmF0aXZlLCBjb2xvciA9ICJkYXJrYmx1ZSIsIGxpbmV0eXBlID0gInNvbGlkIikgKw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSB0YXJnZXRfaW5mbGF0aW9uLCBjb2xvciA9ICJkYXJrcmVkIiwgbGluZXR5cGUgPSAiZGFzaGVkIikgKw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSBtZWFuX3ZhbHVlLCBjb2xvciA9ICJkYXJrcmVkIiwgbGluZXR5cGUgPSAiZGFzaGVkIikgKw0KICANCiAgIyBEeW5hbWljIHJpZ2h0LWFsaWduZWQgcGxhY2VtZW50IGZvciBhbm5vdGF0aW9ucw0KICBhbm5vdGF0ZSgidGV4dCIsIHggPSBJbmYsIHkgPSB0YXJnZXRfYWdncmVzc2l2ZSwgbGFiZWwgPSAiQWdncmVzc2l2ZSIsIA0KICAgICAgICAgICBoanVzdCA9IDEsIHZqdXN0ID0gLTAuNTAsIGNvbG9yID0gImRhcmtibHVlIiwgc2l6ZSA9IDQpICsNCiAgIyBhbm5vdGF0ZSgidGV4dCIsIHggPSBJbmYsIHkgPSB0YXJnZXRfbW9kZXJhdGUsIGxhYmVsID0gIk1vZGVyYXRlIiwgDQogICMgICAgICAgICBoanVzdCA9IDEsIHZqdXN0ID0gLTAuNTAsIGNvbG9yID0gImRhcmtibHVlIiwgc2l6ZSA9IDQpICsNCiAgYW5ub3RhdGUoInRleHQiLCB4ID0gSW5mLCB5ID0gdGFyZ2V0X2NvbnNlcnZhdGl2ZSwgbGFiZWwgPSAiQ29uc2VydmF0aXZlIiwgDQogICAgICAgICAgIGhqdXN0ID0gMSwgdmp1c3QgPSArMS4xMCwgY29sb3IgPSAiZGFya2JsdWUiLCBzaXplID0gNCkgKw0KICBhbm5vdGF0ZSgidGV4dCIsIHggPSBJbmYsIHkgPSB0YXJnZXRfaW5mbGF0aW9uLCBsYWJlbCA9ICJJbmZsYXRpb24iLCANCiAgICAgICAgICAgaGp1c3QgPSAxLCB2anVzdCA9ICsxLjEwLCBjb2xvciA9ICJkYXJrcmVkIiwgc2l6ZSA9IDQpICsNCiAgYW5ub3RhdGUoInRleHQiLCB4ID0gSW5mLCB5ID0gY2Fncl92YWx1ZSwgbGFiZWwgPSAiQ0FHUiIsIA0KICAgICAgICAgICBoanVzdCA9IDEsIHZqdXN0ID0gLTEuMjUsIGNvbG9yID0gImRhcmtyZWQiLCBzaXplID0gNCkgKyANCg0KICBsYWJzKA0KICAgIHRpdGxlID0gZHluYW1pY190aXRsZSwNCiAgICB4ID0gIlllYXIiLA0KICAgIHkgPSAiQ0FHUiBWYWx1ZSAoJSkiLA0KICAgIGNvbG9yID0gIkNBR1IgUGVyaW9kIiwNCiAgICBjYXB0aW9uID0gZHluYW1pY19jYXB0aW9uDQogICAgKSArDQogIA0KICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gY3VzdG9tX2NvbG9ycykgKyAgIyBTZXQgY29sb3JzIGZvciBlYWNoIENBR1IgUGVyaW9kDQogIGNvb3JkX2NhcnRlc2lhbih5bGltID0gYyh5X21pbiwgeV9tYXgpKSArICMgQXBwbHkgZHluYW1pYyB5LWF4aXMgbGltaXRzDQogIHNjYWxlX3hfY29udGludW91cygNCiAgICBsaW1pdHMgPSBjKHN0YXJ0X3llYXIsIGVuZF95ZWFyICsgMiArIDEpLCANCiAgICBicmVha3MgPSBzZXEobGltaXRzX3N0YXJ0X3llYXIsIGxpbWl0c19lbmRfeWVhciwgNSkNCiAgKSArICAjIFJlc3RyaWN0ICYgU2V0IE1ham9yIHgtYXhpcyBsaW5lcyBmb3IgZWFjaCB5ZWFyDQoNCiAgdGhlbWVfbWluaW1hbCgpICsNCiAgdGhlbWUoDQogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSwgc2l6ZSA9IDIwKSwgICAgICAgICAjIExhcmdlciB0aXRsZSBmb250DQogICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCksICAgICAgICAgICAgICAgICAgICAjIExhcmdlciB4LWF4aXMgbGFiZWwgZm9udA0KICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQpLCAgICAgICAgICAgICAgICAgICAgIyBMYXJnZXIgeS1heGlzIGxhYmVsIGZvbnQNCiAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEsIHNpemUgPSAxNCksICAjIExhcmdlciB4LWF4aXMgdGV4dA0KICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCksICAgICAgICAgICAgICAgICAgICAgIyBMYXJnZXIgeS1heGlzIHRleHQNCiAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0KSwgICAgICAgICAgICAgICAgICAgICMgTGVnZW5kIHRpdGxlIHNpemUNCiAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIpLCAgICAgICAgICAgICAgICAgICAgICMgTGVnZW5kIHRleHQgc2l6ZQ0KICAgIHBhbmVsLmdyaWQubWFqb3IgPSBlbGVtZW50X2xpbmUobGluZXR5cGUgPSAiZG90dGVkIiwgY29sb3IgPSAiYmxhY2siKSwgICMgTWFqb3IgZ3JpZCBsaW5lcw0KICAgIHBhbmVsLmdyaWQubWlub3IueCA9IGVsZW1lbnRfYmxhbmsoKSwgICAgICAgICAgICAgICAgICAgICAgIyBObyBtaW5vciB4IGdyaWQgbGluZXMNCiAgICBheGlzLnRpY2tzLmxlbmd0aCA9IHVuaXQoLTAuMjUsICJjbSIpLCAgICAgICAgICAgICAgICAgICAgICAjIEluY3JlYXNlIHRpY2sgbGVuZ3RoDQogICAgYXhpcy50aWNrcyA9IGVsZW1lbnRfbGluZShjb2xvciA9ICJibGFjayIsIHNpemUgPSAwLjUwKSwgICAjIERhcmtlciB0aWNrcw0KICAgIGF4aXMubGluZS54ID0gZWxlbWVudF9saW5lKGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDAuNzUpLCAgIyBEYXJrIGJvdHRvbSBib3JkZXINCiAgICBheGlzLmxpbmUueSA9IGVsZW1lbnRfbGluZShjb2xvciA9ICJibGFjayIsIHNpemUgPSAwLjc1KSAgICMgRGFyayBsZWZ0IGJvcmRlcg0KICApDQoNCiMgUHJpbnQgdGhlIHBsb3QgDQpwcmludChwMykNCg0KYGBgDQoNCiMjIyMgU2hvcnQtVGVybQ0KDQpgYGB7ciBzcHhfcmF3X2NhZ3JfZ3JhcGhzX3Nob3J0LCBmaWcud2lkdGg9MTAsIGZpZy5oZWlnaHQ9NywgZXZhbD1UUlVFLCBlY2hvPUZBTFNFfQ0KDQpjYXQoIlxuXG4jIyMjIENvbXBvdW5kIEF2ZXJhZ2UgR3Jvd3RoIFJhdGVzIEFjcm9zcyBTaG9ydC1UZXJtIFJvbGxpbmcgUGVyaW9kcyBcbiIpDQoNCiMgRmlsdGVyIGRhdGEgZm9yIFNob3J0LVRlcm0gQ0FHUiAoNS1ZZWFyIGFuZCAxMC1ZZWFyKQ0Kc2hvcnR0ZXJtX2RhdGEgPC0gbnJ0X2xvbmcgJT4lDQogIGZpbHRlcihDQUdSX1BlcmlvZCAlaW4lIGMoIjUtWWVhciBDQUdSIiwgIjEwLVllYXIgQ0FHUiIpKQ0KDQoNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQojIyBQTE9UIEZVTEwgV0lUSE9VVCBMSU1JVFMNCg0KIyBEZWZpbmUgc3RhcnQgYW5kIGVuZCB5ZWFycw0Kc3RhcnRfeWVhciA8LSAxOTA1DQplbmRfeWVhciA8LSAyMDI0DQp5ZWFyX3JhbmdlIDwtIGVuZF95ZWFyIC0gc3RhcnRfeWVhciArIDEgICMgQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgeWVhcnMNCg0KIyBEZWZpbmUgYnJlYWtzIHJvdW5kZWQgYXBwcm9wcmlhdGVseQ0KbGltaXRzX3N0YXJ0X3llYXIgPC0gZmxvb3Ioc3RhcnRfeWVhciAvIDUpICogNSAgIyBSb3VuZCBkb3duIHRvIHRoZSBuZWFyZXN0IG11bHRpcGxlIG9mIDUNCmxpbWl0c19lbmRfeWVhciA8LSBjZWlsaW5nKGVuZF95ZWFyIC8gNSkgKiA1ICAgIyBSb3VuZCB1cCB0byB0aGUgbmVhcmVzdCBtdWx0aXBsZSBvZiA1DQoNCiMgQ3JlYXRlIGR5bmFtaWMgdGl0bGUgYW5kIGNhcHRpb24NCmR5bmFtaWNfdGl0bGUgPC0gcGFzdGUwKCJDQUdSIEFjcm9zcyBTaG9ydC1UZXJtIFBlcmlvZHMgT3ZlciAiLHllYXJfcmFuZ2UsICIgWWVhcnMgKCIsIHN0YXJ0X3llYXIsICItIiwgZW5kX3llYXIsICIpIikNCmR5bmFtaWNfY2FwdGlvbiA8LSBwYXN0ZTAoIlNQWCBDb21wb3VuZCBBdmVyYWdlIEdyb3d0aCBSYXRlcyBBY3Jvc3MgU2hvcnQtVGVybSBSb2xsaW5nIFBlcmlvZHMsIERhdGFzZXQgKCIsIG1pbl95ZWFyLCAiLSIsIG1heF95ZWFyLCAiKSIpDQoNCiMgQ3JlYXRlIHRoZSBmdWxsLCBub24tZmlsdGVyZWQgeC1heGlzIHBsb3Qgd2l0aCBkeW5hbWljIHggcGxhY2VtZW50IGZvciBhbm5vdGF0aW9ucw0KcDFfc2hvcnR0ZXJtIDwtIGdncGxvdChzaG9ydHRlcm1fZGF0YSwgYWVzKHggPSBhcy5pbnRlZ2VyKERhdGUpLCB5ID0gQ0FHUl9WYWx1ZSwgY29sb3IgPSBDQUdSX1BlcmlvZCkpICsNCg0KICAjIEFkZCBzaGFkZWQgYXJlYXMgZm9yIGJhY2tncm91bmQgZWZmZWN0DQogIGdlb21fcmVjdChhZXMoeG1pbiA9IC1JbmYsIHhtYXggPSBJbmYsIHltaW4gPSB0YXJnZXRfYWdncmVzc2l2ZSwgeW1heCA9IEluZiksIGZpbGwgPSAibGlnaHRncmVlbiIsIGFscGhhID0gMC4wMTApICsNCiAgZ2VvbV9yZWN0KGFlcyh4bWluID0gLUluZiwgeG1heCA9IEluZiwgeW1pbiA9IHRhcmdldF9jb25zZXJ2YXRpdmUsIHltYXggPSB0YXJnZXRfYWdncmVzc2l2ZSksIGZpbGwgPSAib3JhbmdlIiwgYWxwaGEgPSAwLjAxKSArDQogIGdlb21fcmVjdChhZXMoeG1pbiA9IC1JbmYsIHhtYXggPSBJbmYsIHltaW4gPSAtSW5mLCB5bWF4ID0gdGFyZ2V0X2NvbnNlcnZhdGl2ZSksIGZpbGwgPSAibGlnaHRjb3JhbCIsIGFscGhhID0gMC4wMTApICsNCiAgDQogICMgUGxvdCBsaW5lcyBmb3IgZWFjaCBDQUdSIFBlcmlvZA0KICBnZW9tX2xpbmUoc2l6ZSA9IDEuMCwgYWxwaGEgPSAzLjApICsgICAgICAgIyBMaW5lIGZvciBlYWNoIENBR1INCiAgZ2VvbV9wb2ludChzaXplID0gMS4wLCBhbHBoYSA9IDMuMCkgKyAgICAgICAjIFBvaW50cyBmb3IgZWFjaCBDQUdSDQoNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gdGFyZ2V0X2FnZ3Jlc3NpdmUsIGNvbG9yID0gImRhcmtibHVlIiwgbGluZXR5cGUgPSAic29saWQiKSArDQogICMgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gdGFyZ2V0X21vZGVyYXRlLCBjb2xvciA9ICJkYXJrYmx1ZSIsIGxpbmV0eXBlID0gInNvbGlkIikgKw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSB0YXJnZXRfY29uc2VydmF0aXZlLCBjb2xvciA9ICJkYXJrYmx1ZSIsIGxpbmV0eXBlID0gInNvbGlkIikgKw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSB0YXJnZXRfaW5mbGF0aW9uLCBjb2xvciA9ICJkYXJrcmVkIiwgbGluZXR5cGUgPSAiZGFzaGVkIikgKw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSBjYWdyX3ZhbHVlLCBjb2xvciA9ICJkYXJrcmVkIiwgbGluZXR5cGUgPSAiZGFzaGVkIikgKw0KICANCiAgIyBEeW5hbWljIHJpZ2h0LWFsaWduZWQgcGxhY2VtZW50IGZvciBhbm5vdGF0aW9ucw0KICBhbm5vdGF0ZSgidGV4dCIsIHggPSBJbmYsIHkgPSB0YXJnZXRfYWdncmVzc2l2ZSwgbGFiZWwgPSAiQWdncmVzc2l2ZSIsIA0KICAgICAgICAgICBoanVzdCA9IDEsIHZqdXN0ID0gLTAuNTAsIGNvbG9yID0gImRhcmtibHVlIiwgc2l6ZSA9IDQpICsNCiAgIyBhbm5vdGF0ZSgidGV4dCIsIHggPSBJbmYsIHkgPSB0YXJnZXRfbW9kZXJhdGUsIGxhYmVsID0gIk1vZGVyYXRlIiwgDQogICMgICAgICAgICBoanVzdCA9IDEsIHZqdXN0ID0gLTAuNTAsIGNvbG9yID0gImRhcmtibHVlIiwgc2l6ZSA9IDQpICsNCiAgYW5ub3RhdGUoInRleHQiLCB4ID0gSW5mLCB5ID0gdGFyZ2V0X2NvbnNlcnZhdGl2ZSwgbGFiZWwgPSAiQ29uc2VydmF0aXZlIiwgDQogICAgICAgICAgIGhqdXN0ID0gMSwgdmp1c3QgPSAtMC41MCwgY29sb3IgPSAiZGFya2JsdWUiLCBzaXplID0gNCkgKw0KICBhbm5vdGF0ZSgidGV4dCIsIHggPSBJbmYsIHkgPSB0YXJnZXRfaW5mbGF0aW9uLCBsYWJlbCA9ICJJbmZsYXRpb24iLCANCiAgICAgICAgICAgaGp1c3QgPSAxLCB2anVzdCA9ICsxLjI1LCBjb2xvciA9ICJkYXJrcmVkIiwgc2l6ZSA9IDQpICsNCiAgYW5ub3RhdGUoInRleHQiLCB4ID0gSW5mLCB5ID0gY2Fncl92YWx1ZSwgbGFiZWwgPSAiQ0FHUiIsIA0KICAgICAgICAgICBoanVzdCA9IDEsIHZqdXN0ID0gKzEuMjUsIGNvbG9yID0gImRhcmtyZWQiLCBzaXplID0gNCkgKyANCg0KICBsYWJzKA0KICAgIHRpdGxlID0gZHluYW1pY190aXRsZSwNCiAgICB4ID0gIlllYXIiLA0KICAgIHkgPSAiQ0FHUiBWYWx1ZSAoJSkiLA0KICAgIGNvbG9yID0gIkNBR1IgUGVyaW9kIiwNCiAgICBjYXB0aW9uID0gZHluYW1pY19jYXB0aW9uDQogICAgKSArDQogIA0KICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gY3VzdG9tX2NvbG9yc1tjKCI1LVllYXIgQ0FHUiIsICIxMC1ZZWFyIENBR1IiKV0pICsNCiAgc2NhbGVfeF9jb250aW51b3VzKA0KICAgIGxpbWl0cyA9IGMoc3RhcnRfeWVhciwgZW5kX3llYXIgKyAxMCksIA0KICAgIGJyZWFrcyA9IHNlcShsaW1pdHNfc3RhcnRfeWVhciwgbGltaXRzX2VuZF95ZWFyICsgNSwgNSkNCiAgKSArICAjIFJlc3RyaWN0ICYgU2V0IE1ham9yIHgtYXhpcyBsaW5lcyBmb3IgZWFjaCB5ZWFyDQoNCiAgdGhlbWVfbWluaW1hbCgpICsNCiAgdGhlbWUoDQogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSwgc2l6ZSA9IDIwKSwgICAgICAgICAjIExhcmdlciB0aXRsZSBmb250DQogICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCksICAgICAgICAgICAgICAgICAgICAjIExhcmdlciB4LWF4aXMgbGFiZWwgZm9udA0KICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQpLCAgICAgICAgICAgICAgICAgICAgIyBMYXJnZXIgeS1heGlzIGxhYmVsIGZvbnQNCiAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEsIHNpemUgPSAxNCksICAjIExhcmdlciB4LWF4aXMgdGV4dA0KICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCksICAgICAgICAgICAgICAgICAgICAgIyBMYXJnZXIgeS1heGlzIHRleHQNCiAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0KSwgICAgICAgICAgICAgICAgICAgICMgTGVnZW5kIHRpdGxlIHNpemUNCiAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIpLCAgICAgICAgICAgICAgICAgICAgICMgTGVnZW5kIHRleHQgc2l6ZQ0KICAgIHBhbmVsLmdyaWQubWFqb3IgPSBlbGVtZW50X2xpbmUobGluZXR5cGUgPSAiZG90dGVkIiwgY29sb3IgPSAiYmxhY2siKSwgICMgTWFqb3IgZ3JpZCBsaW5lcw0KICAgIHBhbmVsLmdyaWQubWlub3IueCA9IGVsZW1lbnRfYmxhbmsoKSwgICAgICAgICAgICAgICAgICAgICAgIyBObyBtaW5vciB4IGdyaWQgbGluZXMNCiAgICBheGlzLnRpY2tzLmxlbmd0aCA9IHVuaXQoLTAuMjUsICJjbSIpLCAgICAgICAgICAgICAgICAgICAgICAjIEluY3JlYXNlIHRpY2sgbGVuZ3RoDQogICAgYXhpcy50aWNrcyA9IGVsZW1lbnRfbGluZShjb2xvciA9ICJibGFjayIsIHNpemUgPSAwLjUwKSwgICAjIERhcmtlciB0aWNrcw0KICAgIGF4aXMubGluZS54ID0gZWxlbWVudF9saW5lKGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDAuNzUpLCAgIyBEYXJrIGJvdHRvbSBib3JkZXINCiAgICBheGlzLmxpbmUueSA9IGVsZW1lbnRfbGluZShjb2xvciA9ICJibGFjayIsIHNpemUgPSAwLjc1KSAgICMgRGFyayBsZWZ0IGJvcmRlcg0KICApDQoNCiMgUHJpbnQgdGhlIHBsb3QgDQpwcmludChwMV9zaG9ydHRlcm0pDQoNCg0KDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KIyMgUExPVCBSRVNUUklDVEVEIFdJVEggTElNSVRTIA0KDQojIEZpbHRlciB0aGUgZGF0YSBmb3IgdGhlIHJlc3RyaWN0ZWQgeC1heGlzIHJhbmdlICgyMDA1LTIwMjQpDQpyZXN0cmljdGVkX2RhdGEgPC0gc2hvcnR0ZXJtX2RhdGEgJT4lDQogIGZpbHRlcihhcy5pbnRlZ2VyKERhdGUpID49IDIwMDUgJiBhcy5pbnRlZ2VyKERhdGUpIDw9IDIwMjQpDQoNCiMgRGVmaW5lIHN0YXJ0IGFuZCBlbmQgeWVhcnMNCnN0YXJ0X3llYXIgPC0gMjAwNQ0KZW5kX3llYXIgPC0gMjAyNA0KeWVhcl9yYW5nZSA8LSBlbmRfeWVhciAtIHN0YXJ0X3llYXIgKyAxICAjIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIHllYXJzDQoNCiMgRGVmaW5lIGJyZWFrcyByb3VuZGVkIGFwcHJvcHJpYXRlbHkNCmxpbWl0c19zdGFydF95ZWFyIDwtIGZsb29yKHN0YXJ0X3llYXIgLyA1KSAqIDUgICMgUm91bmQgZG93biB0byB0aGUgbmVhcmVzdCBtdWx0aXBsZSBvZiA1DQpsaW1pdHNfZW5kX3llYXIgPC0gY2VpbGluZyhlbmRfeWVhciAvIDUpICogNSAgICMgUm91bmQgdXAgdG8gdGhlIG5lYXJlc3QgbXVsdGlwbGUgb2YgNQ0KDQojIENyZWF0ZSBkeW5hbWljIHRpdGxlIGFuZCBjYXB0aW9uDQpkeW5hbWljX3RpdGxlIDwtIHBhc3RlMCgiQ0FHUiBBY3Jvc3MgU2hvcnQtVGVybSBQZXJpb2RzIE92ZXIgIix5ZWFyX3JhbmdlLCAiIFllYXJzICgiLCBzdGFydF95ZWFyLCAiLSIsIGVuZF95ZWFyLCAiKSIpDQpkeW5hbWljX2NhcHRpb24gPC0gcGFzdGUwKCJTUFggQ29tcG91bmQgQXZlcmFnZSBHcm93dGggUmF0ZXMgQWNyb3NzIFNob3J0LVRlcm0gUm9sbGluZyBQZXJpb2RzLCBEYXRhc2V0ICgiLCBtaW5feWVhciwgIi0iLCBtYXhfeWVhciwgIikiKQ0KDQojIENhbGN1bGF0ZSBkeW5hbWljIHktYXhpcyBsaW1pdHMgZm9yIHRoZSByZXN0cmljdGVkIGRhdGENCnlfbWluIDwtIG1pbihyZXN0cmljdGVkX2RhdGEkQ0FHUl9WYWx1ZSwgbmEucm0gPSBUUlVFKQ0KeV9tYXggPC0gbWF4KHJlc3RyaWN0ZWRfZGF0YSRDQUdSX1ZhbHVlLCBuYS5ybSA9IFRSVUUpDQoNCiMgQ3JlYXRlIHRoZSBmaWx0ZXJlZCwgcmVzdHJpY3RlZCB4LWF4aXMgcGxvdCB3aXRoIGR5bmFtaWMgeCBwbGFjZW1lbnQgZm9yIGFubm90YXRpb25zDQpwMl9zaG9ydHRlcm0gPC0gZ2dwbG90KHNob3J0dGVybV9kYXRhLCBhZXMoeCA9IGFzLmludGVnZXIoRGF0ZSksIHkgPSBDQUdSX1ZhbHVlLCBjb2xvciA9IENBR1JfUGVyaW9kKSkgKw0KICANCiAgIyBBZGQgc2hhZGVkIGFyZWFzIGZvciBiYWNrZ3JvdW5kIGVmZmVjdA0KICBnZW9tX3JlY3QoYWVzKHhtaW4gPSAtSW5mLCB4bWF4ID0gSW5mLCB5bWluID0gdGFyZ2V0X2FnZ3Jlc3NpdmUsIHltYXggPSBJbmYpLCBmaWxsID0gImxpZ2h0Z3JlZW4iLCBhbHBoYSA9IDAuMDEwKSArDQogIGdlb21fcmVjdChhZXMoeG1pbiA9IC1JbmYsIHhtYXggPSBJbmYsIHltaW4gPSB0YXJnZXRfY29uc2VydmF0aXZlLCB5bWF4ID0gdGFyZ2V0X2FnZ3Jlc3NpdmUpLCBmaWxsID0gIm9yYW5nZSIsIGFscGhhID0gMC4wMSkgKw0KICBnZW9tX3JlY3QoYWVzKHhtaW4gPSAtSW5mLCB4bWF4ID0gSW5mLCB5bWluID0gLUluZiwgeW1heCA9IHRhcmdldF9jb25zZXJ2YXRpdmUpLCBmaWxsID0gImxpZ2h0Y29yYWwiLCBhbHBoYSA9IDAuMDEwKSArDQogIA0KICAjIFBsb3QgbGluZXMgZm9yIGVhY2ggQ0FHUiBQZXJpb2QNCiAgZ2VvbV9saW5lKHNpemUgPSAxLjAsIGFscGhhID0gMy4wKSArICAgICAgICMgTGluZSBmb3IgZWFjaCBDQUdSDQogIGdlb21fcG9pbnQoc2l6ZSA9IDEuMCwgYWxwaGEgPSAzLjApICsgICAgICAgIyBQb2ludHMgZm9yIGVhY2ggQ0FHUg0KICAgIGdlb21faGxpbmUoeWludGVyY2VwdCA9IHRhcmdldF9hZ2dyZXNzaXZlLCBjb2xvciA9ICJkYXJrYmx1ZSIsIGxpbmV0eXBlID0gInNvbGlkIikgKw0KICAjIGdlb21faGxpbmUoeWludGVyY2VwdCA9IHRhcmdldF9tb2RlcmF0ZSwgY29sb3IgPSAiZGFya2JsdWUiLCBsaW5ldHlwZSA9ICJzb2xpZCIpICsNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gdGFyZ2V0X2NvbnNlcnZhdGl2ZSwgY29sb3IgPSAiZGFya2JsdWUiLCBsaW5ldHlwZSA9ICJzb2xpZCIpICsNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gdGFyZ2V0X2luZmxhdGlvbiwgY29sb3IgPSAiZGFya3JlZCIsIGxpbmV0eXBlID0gImRhc2hlZCIpICsNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gY2Fncl92YWx1ZSwgY29sb3IgPSAiZGFya3JlZCIsIGxpbmV0eXBlID0gImRhc2hlZCIpICsNCiAgDQogICMgRHluYW1pYyByaWdodC1hbGlnbmVkIHBsYWNlbWVudCBmb3IgYW5ub3RhdGlvbnMNCiAgYW5ub3RhdGUoInRleHQiLCB4ID0gSW5mLCB5ID0gdGFyZ2V0X2FnZ3Jlc3NpdmUsIGxhYmVsID0gIkFnZ3Jlc3NpdmUiLCANCiAgICAgICAgICAgaGp1c3QgPSAxLCB2anVzdCA9IC0wLjUwLCBjb2xvciA9ICJkYXJrYmx1ZSIsIHNpemUgPSA0KSArDQogICMgYW5ub3RhdGUoInRleHQiLCB4ID0gSW5mLCB5ID0gdGFyZ2V0X21vZGVyYXRlLCBsYWJlbCA9ICJNb2RlcmF0ZSIsIA0KICAjICAgICAgICAgaGp1c3QgPSAxLCB2anVzdCA9IC0wLjUwLCBjb2xvciA9ICJkYXJrYmx1ZSIsIHNpemUgPSA0KSArDQogIGFubm90YXRlKCJ0ZXh0IiwgeCA9IEluZiwgeSA9IHRhcmdldF9jb25zZXJ2YXRpdmUsIGxhYmVsID0gIkNvbnNlcnZhdGl2ZSIsIA0KICAgICAgICAgICBoanVzdCA9IDEsIHZqdXN0ID0gLTAuNTAsIGNvbG9yID0gImRhcmtibHVlIiwgc2l6ZSA9IDQpICsNCiAgYW5ub3RhdGUoInRleHQiLCB4ID0gSW5mLCB5ID0gdGFyZ2V0X2luZmxhdGlvbiwgbGFiZWwgPSAiSW5mbGF0aW9uIiwgDQogICAgICAgICAgIGhqdXN0ID0gMSwgdmp1c3QgPSArMS4yNSwgY29sb3IgPSAiZGFya3JlZCIsIHNpemUgPSA0KSArDQogIGFubm90YXRlKCJ0ZXh0IiwgeCA9IEluZiwgeSA9IGNhZ3JfdmFsdWUsIGxhYmVsID0gIkNBR1IiLCANCiAgICAgICAgICAgaGp1c3QgPSAxLCB2anVzdCA9ICsxLjI1LCBjb2xvciA9ICJkYXJrcmVkIiwgc2l6ZSA9IDQpICsgDQoNCiAgbGFicygNCiAgICB0aXRsZSA9IGR5bmFtaWNfdGl0bGUsDQogICAgeCA9ICJZZWFyIiwNCiAgICB5ID0gIkNBR1IgVmFsdWUgKCUpIiwNCiAgICBjb2xvciA9ICJDQUdSIFBlcmlvZCIsDQogICAgY2FwdGlvbiA9IGR5bmFtaWNfY2FwdGlvbg0KICAgICkgKw0KICANCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGN1c3RvbV9jb2xvcnNbYygiNS1ZZWFyIENBR1IiLCAiMTAtWWVhciBDQUdSIildKSArDQogIGNvb3JkX2NhcnRlc2lhbih5bGltID0gYyh5X21pbiwgeV9tYXgpKSArICMgQXBwbHkgZHluYW1pYyB5LWF4aXMgbGltaXRzDQogIHNjYWxlX3hfY29udGludW91cygNCiAgICBsaW1pdHMgPSBjKHN0YXJ0X3llYXIsIGVuZF95ZWFyICsgMiksIA0KICAgIGJyZWFrcyA9IHNlcShsaW1pdHNfc3RhcnRfeWVhciwgbGltaXRzX2VuZF95ZWFyLCA1KQ0KICApICsgICMgUmVzdHJpY3QgJiBTZXQgTWFqb3IgeC1heGlzIGxpbmVzIGZvciBlYWNoIHllYXINCiAgDQogIHRoZW1lX21pbmltYWwoKSArDQogIHRoZW1lKA0KICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUsIHNpemUgPSAyMCksICAgICAgICAgIyBMYXJnZXIgdGl0bGUgZm9udA0KICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQpLCAgICAgICAgICAgICAgICAgICAgIyBMYXJnZXIgeC1heGlzIGxhYmVsIGZvbnQNCiAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0KSwgICAgICAgICAgICAgICAgICAgICMgTGFyZ2VyIHktYXhpcyBsYWJlbCBmb250DQogICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxLCBzaXplID0gMTQpLCAgIyBMYXJnZXIgeC1heGlzIHRleHQNCiAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQpLCAgICAgICAgICAgICAgICAgICAgICMgTGFyZ2VyIHktYXhpcyB0ZXh0DQogICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCksICAgICAgICAgICAgICAgICAgICAjIExlZ2VuZCB0aXRsZSBzaXplDQogICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyKSwgICAgICAgICAgICAgICAgICAgICAjIExlZ2VuZCB0ZXh0IHNpemUNCiAgICBwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9saW5lKGxpbmV0eXBlID0gImRvdHRlZCIsIGNvbG9yID0gImJsYWNrIiksICAjIE1ham9yIGdyaWQgbGluZXMNCiAgICBwYW5lbC5ncmlkLm1pbm9yLnggPSBlbGVtZW50X2JsYW5rKCksICAgICAgICAgICAgICAgICAgICAgICMgTm8gbWlub3IgeCBncmlkIGxpbmVzDQogICAgYXhpcy50aWNrcy5sZW5ndGggPSB1bml0KC0wLjI1LCAiY20iKSwgICAgICAgICAgICAgICAgICAgICAgIyBJbmNyZWFzZSB0aWNrIGxlbmd0aA0KICAgIGF4aXMudGlja3MgPSBlbGVtZW50X2xpbmUoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMC41MCksICAgIyBEYXJrZXIgdGlja3MNCiAgICBheGlzLmxpbmUueCA9IGVsZW1lbnRfbGluZShjb2xvciA9ICJibGFjayIsIHNpemUgPSAwLjc1KSwgICMgRGFyayBib3R0b20gYm9yZGVyDQogICAgYXhpcy5saW5lLnkgPSBlbGVtZW50X2xpbmUoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMC43NSkgICAjIERhcmsgbGVmdCBib3JkZXINCiAgKQ0KDQojIFByaW50IHRoZSBzaG9ydC10ZXJtIENBR1IgcGxvdA0KcHJpbnQocDJfc2hvcnR0ZXJtKQ0KDQoNCmBgYA0KDQoNCg0KIyMjIyBMb25nLVRlcm0NCg0KYGBge3Igc3B4X3Jhd19jYWdyX2dyYXBoc19sb25nLCBmaWcud2lkdGg9MTAsIGZpZy5oZWlnaHQ9NywgZXZhbD1UUlVFLCBlY2hvPUZBTFNFfQ0KDQpjYXQoIlxuXG4jIyMjIENvbXBvdW5kIEF2ZXJhZ2UgR3Jvd3RoIFJhdGVzIEFjcm9zcyBMb25nLVRlcm0gUm9sbGluZyBQZXJpb2RzIFxuIikNCg0KIyBGaWx0ZXIgZGF0YSBmb3IgTG9uZy1UZXJtIENBR1IgKDIwLVllYXIgYW5kIDMwLVllYXIpDQpsb25ndGVybV9kYXRhIDwtIG5ydF9sb25nICU+JQ0KICBmaWx0ZXIoQ0FHUl9QZXJpb2QgJWluJSBjKCIyMC1ZZWFyIENBR1IiLCAiMzAtWWVhciBDQUdSIikpDQoNCg0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiMjIFBMT1QgRlVMTCBXSVRIT1VUIExJTUlUUw0KDQojIERlZmluZSBzdGFydCBhbmQgZW5kIHllYXJzDQpzdGFydF95ZWFyIDwtIDE5MjANCmVuZF95ZWFyIDwtIDIwMjQNCnllYXJfcmFuZ2UgPC0gZW5kX3llYXIgLSBzdGFydF95ZWFyICsgMSAgIyBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiB5ZWFycw0KDQojIERlZmluZSBicmVha3Mgcm91bmRlZCBhcHByb3ByaWF0ZWx5DQpsaW1pdHNfc3RhcnRfeWVhciA8LSBmbG9vcihzdGFydF95ZWFyIC8gNSkgKiA1ICAjIFJvdW5kIGRvd24gdG8gdGhlIG5lYXJlc3QgbXVsdGlwbGUgb2YgNQ0KbGltaXRzX2VuZF95ZWFyIDwtIGNlaWxpbmcoZW5kX3llYXIgLyA1KSAqIDUgICAjIFJvdW5kIHVwIHRvIHRoZSBuZWFyZXN0IG11bHRpcGxlIG9mIDUNCg0KIyBDcmVhdGUgZHluYW1pYyB0aXRsZSBhbmQgY2FwdGlvbg0KZHluYW1pY190aXRsZSA8LSBwYXN0ZTAoIkNBR1IgQWNyb3NzIExvbmctVGVybSBQZXJpb2RzIE92ZXIgIix5ZWFyX3JhbmdlLCAiIFllYXJzICgiLCBzdGFydF95ZWFyLCAiLSIsIGVuZF95ZWFyLCAiKSIpDQpkeW5hbWljX2NhcHRpb24gPC0gcGFzdGUwKCJTUFggQ29tcG91bmQgQXZlcmFnZSBHcm93dGggUmF0ZXMgQWNyb3NzIExvbmctVGVybSBSb2xsaW5nIFBlcmlvZHMsIERhdGFzZXQgKCIsIG1pbl95ZWFyLCAiLSIsIG1heF95ZWFyLCAiKSIpDQoNCiMgQ3JlYXRlIHRoZSBmdWxsLCBub24tZmlsdGVyZWQgeC1heGlzIHBsb3Qgd2l0aCBkeW5hbWljIHggcGxhY2VtZW50IGZvciBhbm5vdGF0aW9ucw0KcDFfbG9uZ3Rlcm0gPC0gZ2dwbG90KGxvbmd0ZXJtX2RhdGEsIGFlcyh4ID0gYXMuaW50ZWdlcihEYXRlKSwgeSA9IENBR1JfVmFsdWUsIGNvbG9yID0gQ0FHUl9QZXJpb2QpKSArDQoNCiAgIyBBZGQgc2hhZGVkIGFyZWFzIGZvciBiYWNrZ3JvdW5kIGVmZmVjdA0KICBnZW9tX3JlY3QoYWVzKHhtaW4gPSAtSW5mLCB4bWF4ID0gSW5mLCB5bWluID0gdGFyZ2V0X2FnZ3Jlc3NpdmUsIHltYXggPSBJbmYpLCBmaWxsID0gImxpZ2h0Z3JlZW4iLCBhbHBoYSA9IDAuMDEwKSArDQogIGdlb21fcmVjdChhZXMoeG1pbiA9IC1JbmYsIHhtYXggPSBJbmYsIHltaW4gPSB0YXJnZXRfY29uc2VydmF0aXZlLCB5bWF4ID0gdGFyZ2V0X2FnZ3Jlc3NpdmUpLCBmaWxsID0gIm9yYW5nZSIsIGFscGhhID0gMC4wMSkgKw0KICBnZW9tX3JlY3QoYWVzKHhtaW4gPSAtSW5mLCB4bWF4ID0gSW5mLCB5bWluID0gLUluZiwgeW1heCA9IHRhcmdldF9jb25zZXJ2YXRpdmUpLCBmaWxsID0gImxpZ2h0Y29yYWwiLCBhbHBoYSA9IDAuMDEwKSArDQogIA0KICAjIFBsb3QgbGluZXMgZm9yIGVhY2ggQ0FHUiBQZXJpb2QNCiAgZ2VvbV9saW5lKHNpemUgPSAxLjAsIGFscGhhID0gMy4wKSArICAgICAgICMgTGluZSBmb3IgZWFjaCBDQUdSDQogIGdlb21fcG9pbnQoc2l6ZSA9IDEuMCwgYWxwaGEgPSAzLjApICsgICAgICAgIyBQb2ludHMgZm9yIGVhY2ggQ0FHUg0KDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IHRhcmdldF9hZ2dyZXNzaXZlLCBjb2xvciA9ICJkYXJrYmx1ZSIsIGxpbmV0eXBlID0gInNvbGlkIikgKw0KICAjIGdlb21faGxpbmUoeWludGVyY2VwdCA9IHRhcmdldF9tb2RlcmF0ZSwgY29sb3IgPSAiZGFya2JsdWUiLCBsaW5ldHlwZSA9ICJzb2xpZCIpICsNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gdGFyZ2V0X2NvbnNlcnZhdGl2ZSwgY29sb3IgPSAiZGFya2JsdWUiLCBsaW5ldHlwZSA9ICJzb2xpZCIpICsNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gdGFyZ2V0X2luZmxhdGlvbiwgY29sb3IgPSAiZGFya3JlZCIsIGxpbmV0eXBlID0gImRhc2hlZCIpICsNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gY2Fncl92YWx1ZSwgY29sb3IgPSAiZGFya3JlZCIsIGxpbmV0eXBlID0gImRhc2hlZCIpICsNCiAgDQogICMgRHluYW1pYyByaWdodC1hbGlnbmVkIHBsYWNlbWVudCBmb3IgYW5ub3RhdGlvbnMNCiAgYW5ub3RhdGUoInRleHQiLCB4ID0gSW5mLCB5ID0gdGFyZ2V0X2FnZ3Jlc3NpdmUsIGxhYmVsID0gIkFnZ3Jlc3NpdmUiLCANCiAgICAgICAgICAgaGp1c3QgPSAxLCB2anVzdCA9IC0wLjUwLCBjb2xvciA9ICJkYXJrYmx1ZSIsIHNpemUgPSA0KSArDQogICMgYW5ub3RhdGUoInRleHQiLCB4ID0gSW5mLCB5ID0gdGFyZ2V0X21vZGVyYXRlLCBsYWJlbCA9ICJNb2RlcmF0ZSIsIA0KICAjICAgICAgICAgaGp1c3QgPSAxLCB2anVzdCA9IC0wLjUwLCBjb2xvciA9ICJkYXJrYmx1ZSIsIHNpemUgPSA0KSArDQogIGFubm90YXRlKCJ0ZXh0IiwgeCA9IEluZiwgeSA9IHRhcmdldF9jb25zZXJ2YXRpdmUsIGxhYmVsID0gIkNvbnNlcnZhdGl2ZSIsIA0KICAgICAgICAgICBoanVzdCA9IDEsIHZqdXN0ID0gLTAuNTAsIGNvbG9yID0gImRhcmtibHVlIiwgc2l6ZSA9IDQpICsNCiAgYW5ub3RhdGUoInRleHQiLCB4ID0gSW5mLCB5ID0gdGFyZ2V0X2luZmxhdGlvbiwgbGFiZWwgPSAiSW5mbGF0aW9uIiwgDQogICAgICAgICAgIGhqdXN0ID0gMSwgdmp1c3QgPSAtMC41MCwgY29sb3IgPSAiZGFya3JlZCIsIHNpemUgPSA0KSArDQogIGFubm90YXRlKCJ0ZXh0IiwgeCA9IEluZiwgeSA9IGNhZ3JfdmFsdWUsIGxhYmVsID0gIkNBR1IiLCANCiAgICAgICAgICAgaGp1c3QgPSAxLCB2anVzdCA9ICsxLjI1LCBjb2xvciA9ICJkYXJrcmVkIiwgc2l6ZSA9IDQpICsgDQoNCiAgbGFicygNCiAgICB0aXRsZSA9IGR5bmFtaWNfdGl0bGUsDQogICAgeCA9ICJZZWFyIiwNCiAgICB5ID0gIkNBR1IgVmFsdWUgKCUpIiwNCiAgICBjb2xvciA9ICJDQUdSIFBlcmlvZCIsDQogICAgY2FwdGlvbiA9IGR5bmFtaWNfY2FwdGlvbg0KICAgICkgKw0KICANCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGN1c3RvbV9jb2xvcnNbYygiMjAtWWVhciBDQUdSIiwgIjMwLVllYXIgQ0FHUiIpXSkgKw0KICBzY2FsZV94X2NvbnRpbnVvdXMoDQogICAgbGltaXRzID0gYyhzdGFydF95ZWFyLCBlbmRfeWVhciArIDEwKSwgDQogICAgYnJlYWtzID0gc2VxKGxpbWl0c19zdGFydF95ZWFyLCBsaW1pdHNfZW5kX3llYXIgKyA1LCA1KQ0KICApICsgICMgUmVzdHJpY3QgJiBTZXQgTWFqb3IgeC1heGlzIGxpbmVzIGZvciBlYWNoIHllYXINCg0KICB0aGVtZV9taW5pbWFsKCkgKw0KICB0aGVtZSgNCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41LCBzaXplID0gMjApLCAgICAgICAgICMgTGFyZ2VyIHRpdGxlIGZvbnQNCiAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0KSwgICAgICAgICAgICAgICAgICAgICMgTGFyZ2VyIHgtYXhpcyBsYWJlbCBmb250DQogICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCksICAgICAgICAgICAgICAgICAgICAjIExhcmdlciB5LWF4aXMgbGFiZWwgZm9udA0KICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSwgc2l6ZSA9IDE0KSwgICMgTGFyZ2VyIHgtYXhpcyB0ZXh0DQogICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0KSwgICAgICAgICAgICAgICAgICAgICAjIExhcmdlciB5LWF4aXMgdGV4dA0KICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQpLCAgICAgICAgICAgICAgICAgICAgIyBMZWdlbmQgdGl0bGUgc2l6ZQ0KICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiksICAgICAgICAgICAgICAgICAgICAgIyBMZWdlbmQgdGV4dCBzaXplDQogICAgcGFuZWwuZ3JpZC5tYWpvciA9IGVsZW1lbnRfbGluZShsaW5ldHlwZSA9ICJkb3R0ZWQiLCBjb2xvciA9ICJibGFjayIpLCAgIyBNYWpvciBncmlkIGxpbmVzDQogICAgcGFuZWwuZ3JpZC5taW5vci54ID0gZWxlbWVudF9ibGFuaygpLCAgICAgICAgICAgICAgICAgICAgICAjIE5vIG1pbm9yIHggZ3JpZCBsaW5lcw0KICAgIGF4aXMudGlja3MubGVuZ3RoID0gdW5pdCgtMC4yNSwgImNtIiksICAgICAgICAgICAgICAgICAgICAgICMgSW5jcmVhc2UgdGljayBsZW5ndGgNCiAgICBheGlzLnRpY2tzID0gZWxlbWVudF9saW5lKGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDAuNTApLCAgICMgRGFya2VyIHRpY2tzDQogICAgYXhpcy5saW5lLnggPSBlbGVtZW50X2xpbmUoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMC43NSksICAjIERhcmsgYm90dG9tIGJvcmRlcg0KICAgIGF4aXMubGluZS55ID0gZWxlbWVudF9saW5lKGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDAuNzUpICAgIyBEYXJrIGxlZnQgYm9yZGVyDQogICkNCg0KIyBQcmludCB0aGUgcGxvdCANCnByaW50KHAxX2xvbmd0ZXJtKQ0KDQoNCg0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiMjIFBMT1QgUkVTVFJJQ1RFRCBXSVRIIExJTUlUUyANCg0KIyBGaWx0ZXIgdGhlIGRhdGEgZm9yIHRoZSByZXN0cmljdGVkIHgtYXhpcyByYW5nZSAoMjAwNS0yMDI0KQ0KcmVzdHJpY3RlZF9kYXRhIDwtIGxvbmd0ZXJtX2RhdGEgJT4lDQogIGZpbHRlcihhcy5pbnRlZ2VyKERhdGUpID49IDIwMDUgJiBhcy5pbnRlZ2VyKERhdGUpIDw9IDIwMjQpDQoNCiMgRGVmaW5lIHN0YXJ0IGFuZCBlbmQgeWVhcnMNCnN0YXJ0X3llYXIgPC0gMjAwNQ0KZW5kX3llYXIgPC0gMjAyNA0KeWVhcl9yYW5nZSA8LSBlbmRfeWVhciAtIHN0YXJ0X3llYXIgKyAxICAjIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIHllYXJzDQoNCiMgRGVmaW5lIGJyZWFrcyByb3VuZGVkIGFwcHJvcHJpYXRlbHkNCmxpbWl0c19zdGFydF95ZWFyIDwtIGZsb29yKHN0YXJ0X3llYXIgLyA1KSAqIDUgICMgUm91bmQgZG93biB0byB0aGUgbmVhcmVzdCBtdWx0aXBsZSBvZiA1DQpsaW1pdHNfZW5kX3llYXIgPC0gY2VpbGluZyhlbmRfeWVhciAvIDUpICogNSAgICMgUm91bmQgdXAgdG8gdGhlIG5lYXJlc3QgbXVsdGlwbGUgb2YgNQ0KDQojIENyZWF0ZSBkeW5hbWljIHRpdGxlIGFuZCBjYXB0aW9uDQpkeW5hbWljX3RpdGxlIDwtIHBhc3RlMCgiQ0FHUiBBY3Jvc3MgTG9uZy1UZXJtIFBlcmlvZHMgT3ZlciAiLHllYXJfcmFuZ2UsICIgWWVhcnMgKCIsIHN0YXJ0X3llYXIsICItIiwgZW5kX3llYXIsICIpIikNCmR5bmFtaWNfY2FwdGlvbiA8LSBwYXN0ZTAoIlNQWCBDb21wb3VuZCBBdmVyYWdlIEdyb3d0aCBSYXRlcyBBY3Jvc3MgTG9uZy1UZXJtIFJvbGxpbmcgUGVyaW9kcywgRGF0YXNldCAoIiwgbWluX3llYXIsICItIiwgbWF4X3llYXIsICIpIikNCg0KIyBDYWxjdWxhdGUgZHluYW1pYyB5LWF4aXMgbGltaXRzIGZvciB0aGUgcmVzdHJpY3RlZCBkYXRhDQp5X21pbiA8LSBtaW4ocmVzdHJpY3RlZF9kYXRhJENBR1JfVmFsdWUsIG5hLnJtID0gVFJVRSkNCnlfbWF4IDwtIG1heChyZXN0cmljdGVkX2RhdGEkQ0FHUl9WYWx1ZSwgbmEucm0gPSBUUlVFKQ0KDQojIENyZWF0ZSB0aGUgZmlsdGVyZWQsIHJlc3RyaWN0ZWQgeC1heGlzIHBsb3Qgd2l0aCBkeW5hbWljIHggcGxhY2VtZW50IGZvciBhbm5vdGF0aW9ucw0KcDJfbG9uZ3Rlcm0gPC0gZ2dwbG90KGxvbmd0ZXJtX2RhdGEsIGFlcyh4ID0gYXMuaW50ZWdlcihEYXRlKSwgeSA9IENBR1JfVmFsdWUsIGNvbG9yID0gQ0FHUl9QZXJpb2QpKSArDQogIA0KICAjIEFkZCBzaGFkZWQgYXJlYXMgZm9yIGJhY2tncm91bmQgZWZmZWN0DQogIGdlb21fcmVjdChhZXMoeG1pbiA9IC1JbmYsIHhtYXggPSBJbmYsIHltaW4gPSB0YXJnZXRfYWdncmVzc2l2ZSwgeW1heCA9IEluZiksIGZpbGwgPSAibGlnaHRncmVlbiIsIGFscGhhID0gMC4wMTApICsNCiAgZ2VvbV9yZWN0KGFlcyh4bWluID0gLUluZiwgeG1heCA9IEluZiwgeW1pbiA9IHRhcmdldF9jb25zZXJ2YXRpdmUsIHltYXggPSB0YXJnZXRfYWdncmVzc2l2ZSksIGZpbGwgPSAib3JhbmdlIiwgYWxwaGEgPSAwLjAxKSArDQogIGdlb21fcmVjdChhZXMoeG1pbiA9IC1JbmYsIHhtYXggPSBJbmYsIHltaW4gPSAtSW5mLCB5bWF4ID0gdGFyZ2V0X2NvbnNlcnZhdGl2ZSksIGZpbGwgPSAibGlnaHRjb3JhbCIsIGFscGhhID0gMC4wMTApICsNCiAgDQogICMgUGxvdCBsaW5lcyBmb3IgZWFjaCBDQUdSIFBlcmlvZA0KICBnZW9tX2xpbmUoc2l6ZSA9IDEuMCwgYWxwaGEgPSAzLjApICsgICAgICAgIyBMaW5lIGZvciBlYWNoIENBR1INCiAgZ2VvbV9wb2ludChzaXplID0gMS4wLCBhbHBoYSA9IDMuMCkgKyAgICAgICAjIFBvaW50cyBmb3IgZWFjaCBDQUdSDQogICAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gdGFyZ2V0X2FnZ3Jlc3NpdmUsIGNvbG9yID0gImRhcmtibHVlIiwgbGluZXR5cGUgPSAic29saWQiKSArDQogICMgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gdGFyZ2V0X21vZGVyYXRlLCBjb2xvciA9ICJkYXJrYmx1ZSIsIGxpbmV0eXBlID0gInNvbGlkIikgKw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSB0YXJnZXRfY29uc2VydmF0aXZlLCBjb2xvciA9ICJkYXJrYmx1ZSIsIGxpbmV0eXBlID0gInNvbGlkIikgKw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSB0YXJnZXRfaW5mbGF0aW9uLCBjb2xvciA9ICJkYXJrcmVkIiwgbGluZXR5cGUgPSAiZGFzaGVkIikgKw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSBjYWdyX3ZhbHVlLCBjb2xvciA9ICJkYXJrcmVkIiwgbGluZXR5cGUgPSAiZGFzaGVkIikgKw0KICANCiAgIyBEeW5hbWljIHJpZ2h0LWFsaWduZWQgcGxhY2VtZW50IGZvciBhbm5vdGF0aW9ucw0KICBhbm5vdGF0ZSgidGV4dCIsIHggPSBJbmYsIHkgPSB0YXJnZXRfYWdncmVzc2l2ZSwgbGFiZWwgPSAiQWdncmVzc2l2ZSIsIA0KICAgICAgICAgICBoanVzdCA9IDEsIHZqdXN0ID0gLTAuNTAsIGNvbG9yID0gImRhcmtibHVlIiwgc2l6ZSA9IDQpICsNCiAgIyBhbm5vdGF0ZSgidGV4dCIsIHggPSBJbmYsIHkgPSB0YXJnZXRfbW9kZXJhdGUsIGxhYmVsID0gIk1vZGVyYXRlIiwgDQogICMgICAgICAgICBoanVzdCA9IDEsIHZqdXN0ID0gLTAuNTAsIGNvbG9yID0gImRhcmtibHVlIiwgc2l6ZSA9IDQpICsNCiAgYW5ub3RhdGUoInRleHQiLCB4ID0gSW5mLCB5ID0gdGFyZ2V0X2NvbnNlcnZhdGl2ZSwgbGFiZWwgPSAiQ29uc2VydmF0aXZlIiwgDQogICAgICAgICAgIGhqdXN0ID0gMSwgdmp1c3QgPSAtMC41MCwgY29sb3IgPSAiZGFya2JsdWUiLCBzaXplID0gNCkgKw0KICBhbm5vdGF0ZSgidGV4dCIsIHggPSBJbmYsIHkgPSB0YXJnZXRfaW5mbGF0aW9uLCBsYWJlbCA9ICJJbmZsYXRpb24iLCANCiAgICAgICAgICAgaGp1c3QgPSAxLCB2anVzdCA9IC0wLjUwLCBjb2xvciA9ICJkYXJrcmVkIiwgc2l6ZSA9IDQpICsNCiAgYW5ub3RhdGUoInRleHQiLCB4ID0gSW5mLCB5ID0gY2Fncl92YWx1ZSwgbGFiZWwgPSAiQ0FHUiIsIA0KICAgICAgICAgICBoanVzdCA9IDEsIHZqdXN0ID0gLTAuNTAsIGNvbG9yID0gImRhcmtyZWQiLCBzaXplID0gNCkgKyANCg0KICBsYWJzKA0KICAgIHRpdGxlID0gZHluYW1pY190aXRsZSwNCiAgICB4ID0gIlllYXIiLA0KICAgIHkgPSAiQ0FHUiBWYWx1ZSAoJSkiLA0KICAgIGNvbG9yID0gIkNBR1IgUGVyaW9kIiwNCiAgICBjYXB0aW9uID0gZHluYW1pY19jYXB0aW9uDQogICAgKSArDQogIA0KICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gY3VzdG9tX2NvbG9yc1tjKCIyMC1ZZWFyIENBR1IiLCAiMzAtWWVhciBDQUdSIildKSArDQogIGNvb3JkX2NhcnRlc2lhbih5bGltID0gYyh5X21pbiwgeV9tYXgpKSArICMgQXBwbHkgZHluYW1pYyB5LWF4aXMgbGltaXRzDQogIHNjYWxlX3hfY29udGludW91cygNCiAgICBsaW1pdHMgPSBjKHN0YXJ0X3llYXIsIGVuZF95ZWFyICsgMiksIA0KICAgIGJyZWFrcyA9IHNlcShsaW1pdHNfc3RhcnRfeWVhciwgbGltaXRzX2VuZF95ZWFyLCA1KQ0KICApICsgICMgUmVzdHJpY3QgJiBTZXQgTWFqb3IgeC1heGlzIGxpbmVzIGZvciBlYWNoIHllYXINCiAgDQogIHRoZW1lX21pbmltYWwoKSArDQogIHRoZW1lKA0KICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUsIHNpemUgPSAyMCksICAgICAgICAgIyBMYXJnZXIgdGl0bGUgZm9udA0KICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQpLCAgICAgICAgICAgICAgICAgICAgIyBMYXJnZXIgeC1heGlzIGxhYmVsIGZvbnQNCiAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0KSwgICAgICAgICAgICAgICAgICAgICMgTGFyZ2VyIHktYXhpcyBsYWJlbCBmb250DQogICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxLCBzaXplID0gMTQpLCAgIyBMYXJnZXIgeC1heGlzIHRleHQNCiAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQpLCAgICAgICAgICAgICAgICAgICAgICMgTGFyZ2VyIHktYXhpcyB0ZXh0DQogICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCksICAgICAgICAgICAgICAgICAgICAjIExlZ2VuZCB0aXRsZSBzaXplDQogICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyKSwgICAgICAgICAgICAgICAgICAgICAjIExlZ2VuZCB0ZXh0IHNpemUNCiAgICBwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9saW5lKGxpbmV0eXBlID0gImRvdHRlZCIsIGNvbG9yID0gImJsYWNrIiksICAjIE1ham9yIGdyaWQgbGluZXMNCiAgICBwYW5lbC5ncmlkLm1pbm9yLnggPSBlbGVtZW50X2JsYW5rKCksICAgICAgICAgICAgICAgICAgICAgICMgTm8gbWlub3IgeCBncmlkIGxpbmVzDQogICAgYXhpcy50aWNrcy5sZW5ndGggPSB1bml0KC0wLjI1LCAiY20iKSwgICAgICAgICAgICAgICAgICAgICAgIyBJbmNyZWFzZSB0aWNrIGxlbmd0aA0KICAgIGF4aXMudGlja3MgPSBlbGVtZW50X2xpbmUoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMC41MCksICAgIyBEYXJrZXIgdGlja3MNCiAgICBheGlzLmxpbmUueCA9IGVsZW1lbnRfbGluZShjb2xvciA9ICJibGFjayIsIHNpemUgPSAwLjc1KSwgICMgRGFyayBib3R0b20gYm9yZGVyDQogICAgYXhpcy5saW5lLnkgPSBlbGVtZW50X2xpbmUoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMC43NSkgICAjIERhcmsgbGVmdCBib3JkZXINCiAgKQ0KDQojIFByaW50IHRoZSBsb25nLXRlcm0gQ0FHUiBwbG90DQpwcmludChwMl9sb25ndGVybSkNCg0KDQpgYGANCg0KDQojIFFRUQ0KDQpUaGUgSW52ZXNjbyBRUVEgVHJ1c3QsIGNvbW1vbmx5IGtub3duIGJ5IGl0cyB0aWNrZXIgc3ltYm9sIFFRUSwgaXMgYW4gZXhjaGFuZ2UtdHJhZGVkIGZ1bmQgKEVURikgdGhhdCB0cmFja3MgdGhlIE5hc2RhcS0xMDAgSW5kZXguIFRoaXMgaW5kZXggY29tcHJpc2VzIDEwMCBvZiB0aGUgbGFyZ2VzdCBub24tZmluYW5jaWFsIGNvbXBhbmllcyBsaXN0ZWQgb24gdGhlIE5hc2RhcSBTdG9jayBNYXJrZXQsIHByZWRvbWluYW50bHkgZmVhdHVyaW5nIGZpcm1zIGluIHRoZSB0ZWNobm9sb2d5IHNlY3RvciwgYnV0IGFsc28gaW5jbHVkaW5nIGNvbXBhbmllcyBmcm9tIGNvbnN1bWVyIHNlcnZpY2VzLCBoZWFsdGhjYXJlLCBhbmQgaW5kdXN0cmlhbHMuIER1ZSB0byBpdHMgZm9jdXMgb24gaGlnaC1ncm93dGggaW5kdXN0cmllcywgUVFRIGlzIG9mdGVuIHVzZWQgYnkgaW52ZXN0b3JzIHRvIGdhaW4gZXhwb3N1cmUgdG8gbGVhZGluZyB0ZWNoIGNvbXBhbmllcyBhbmQgdG8gY2FwaXRhbGl6ZSBvbiB0aGUgcGVyZm9ybWFuY2Ugb2YgdGhlIGJyb2FkZXIgdGVjaG5vbG9neSBtYXJrZXQuIA0KDQpJbnZlc2NvIEx0ZC4gaXMgYSBnbG9iYWwgaW5kZXBlbmRlbnQgaW52ZXN0bWVudCBtYW5hZ2VtZW50IGZpcm0gaGVhZHF1YXJ0ZXJlZCBpbiBBdGxhbnRhLCBHZW9yZ2lhLiBFc3RhYmxpc2hlZCBpbiAxOTc4LCB0aGUgY29tcGFueSBvZmZlcnMgYSBkaXZlcnNlIHJhbmdlIG9mIGludmVzdG1lbnQgcHJvZHVjdHMgYW5kIHNlcnZpY2VzLCBpbmNsdWRpbmcgbXV0dWFsIGZ1bmRzLCBleGNoYW5nZS10cmFkZWQgZnVuZHMgKEVURnMpLCBhbmQgcmV0aXJlbWVudCBwbGFucywgY2F0ZXJpbmcgdG8gaW5kaXZpZHVhbCBpbnZlc3RvcnMsIGZpbmFuY2lhbCBwcm9mZXNzaW9uYWxzLCBhbmQgaW5zdGl0dXRpb25zLiBPcGVyYXRpbmcgdW5kZXIgYnJhbmQgbmFtZXMgc3VjaCBhcyBJbnZlc2NvLCBJbnZlc2NvIFBlcnBldHVhbCwgYW5kIFBvd2VyU2hhcmVzLCBJbnZlc2NvIG1hbmFnZXMgYXNzZXRzIGFjcm9zcyB2YXJpb3VzIGFzc2V0IGNsYXNzZXMsIGludmVzdG1lbnQgc3R5bGVzLCBhbmQgZ2VvZ3JhcGhpZXMuIFZpc2l0IEludmVzY28gYXQgaHR0cHM6Ly93d3cuaW52ZXNjby5jb20vcXFxLWV0Zi9lbi9hYm91dC1pbnZlc2NvLmh0bWwuIA0KDQoNCiMjIFFRUSBHUg0KDQojIyMgRGF0YQ0KDQpUaGUgUVFRIGRhdGEgcHJlc2VudGVkIGhlcmUsIHNvdXJjZWQgZnJvbSBJbnZlc3RpbmcuY29tLCBzcGFucyBmcm9tIERlY2VtYmVyIDMxLCAxOTk5LCBvbndhcmQuIEludmVzdGluZy5jb20gaXMgYSBjb21wcmVoZW5zaXZlIGZpbmFuY2lhbCBwbGF0Zm9ybSB0aGF0IG9mZmVycyByZWFsLXRpbWUgZGF0YSwgcXVvdGVzLCBjaGFydHMsIGFuZCBmaW5hbmNpYWwgbmV3cyBhY3Jvc3MgZ2xvYmFsIG1hcmtldHMuIEVhY2ggIkNsb3NlIiByZXByZXNlbnRzIHRoZSBjbG9zaW5nIHByaWNlIGZvciB0aGUgZGF5IHByaW9yLCBvciB0aGUgZW5kIG9mIHRoZSBwcmlvciB5ZWFyLiBGb3IgZXhhbXBsZSwgdGhlIHByaWNlIGZvciBKYW51YXJ5IDEsIDIwMjQsIHJlZmxlY3RzIHRoZSBEZWNlbWJlciAzMSwgMjAyMywgZW5kLW9mLXllYXIgY2xvc2luZyBwcmljZS4gDQoNCkRhdGEgU291cmNlOiBgciBucnYkc291cmNlX3FxcWANCg0KYGBge3IgcXFxX3JhdywgZXZhbD1UUlVFLCBlY2hvPUZBTFNFfQ0KDQojIERpc3BsYXkgdGhlIHN0cnVjdHVyZSBvZiB0aGUgZGF0YXNldCB0byBjb25maXJtIGNvbHVtbiBuYW1lcw0KaW50ZXJhY3RpdmVfc3RyKG5ydCRxcXFfcmF3KQ0KDQpsaWJyYXJ5KGRwbHlyKQ0KbGlicmFyeShsdWJyaWRhdGUpICAjIEZvciBkYXRlIG1hbmlwdWxhdGlvbg0KbGlicmFyeShzY2FsZXMpDQpsaWJyYXJ5KHN0cmluZ3IpDQoNCiMgRW5zdXJlIHRoZSAnRGF0ZScgY29sdW1uIGlzIG9mIERhdGUgY2xhc3MNCnFxcV9yYXcgPC0gbnJ0JHFxcV9yYXcgJT4lDQogIG11dGF0ZShEYXRlID0gYXMuRGF0ZShEYXRlLCBmb3JtYXQgPSAiJVktJW0tJWQiKSkNCg0KIyBGaW5kIHRoZSBtaW5pbXVtIGFuZCBtYXhpbXVtIHllYXINCm1pbl95ZWFyIDwtIGZvcm1hdChtaW4ocXFxX3JhdyREYXRlLCBuYS5ybSA9IFRSVUUpLCAiJVkiKQ0KbWF4X3llYXIgPC0gZm9ybWF0KG1heChxcXFfcmF3JERhdGUsIG5hLnJtID0gVFJVRSksICIlWSIpDQppbnRlcmFjdGl2ZV9wcmludChtaW5feWVhcikNCmludGVyYWN0aXZlX3ByaW50KG1heF95ZWFyKQ0KDQojIFVwZGF0ZSBkYXRhIGZyYW1lIHdpdGggcHJvcGVyIGRhdGUgYW5kIHBlcmNlbnRhZ2UgaGFuZGxpbmcNCnFxcV9yYXcgPC0gcXFxX3JhdyAlPiUNCiAgbXV0YXRlKA0KICAgICMgQ29udmVydCBDbG9zZSBEYXRlIHRvICJZWVlZLU1NLUREIiBmb3JtYXQNCiAgICBgRGF0ZWAgPSBmb3JtYXQoYXMuRGF0ZShhcy5jaGFyYWN0ZXIoYERhdGVgKSwgb3JpZ2luID0gIjE5NzAtMDEtMDEiKSwgIiVZLSVtLSVkIiksDQoNCiAgICAjIEVuc3VyZSBDbG9zZSBpcyBhIG51bWJlciBmb3JtYXR0ZWQgdG8gMiBkZWNpbWFsIHBsYWNlcw0KICAgIGBDbG9zZWAgPSBudW1iZXIoYXMubnVtZXJpYyhnc3ViKCIsIiwgIiIsIENsb3NlKSksIGJpZy5tYXJrID0gIiwiLCBkZWNpbWFsLm1hcmsgPSAiLiIsIGFjY3VyYWN5ID0gMC4wMSksDQoNCiAgICAjIENsZWFuIGFuZCBoYW5kbGUgcGVyY2VudGFnZSBjb2x1bW5zDQogICAgYWNyb3NzKDM6MywgfiB7DQogICAgICB2YWx1ZSA8LSBnc3ViKCJbLCVcXHNdIiwgIiIsIC4pICAjIFJlbW92ZSAlLCBjb21tYXMsIGFuZCBzcGFjZXMNCiAgICAgIG51bWVyaWNfdmFsdWUgPC0gc3VwcHJlc3NXYXJuaW5ncyhhcy5udW1lcmljKHZhbHVlKSkgICMgQ29udmVydCB0byBudW1lcmljDQogICAgICBpZmVsc2UoDQogICAgICAgICFpcy5uYShudW1lcmljX3ZhbHVlKSwgDQogICAgICAgIHBhc3RlMChmb3JtYXQocm91bmQobnVtZXJpY192YWx1ZSoxMDAsIDIpLCBiaWcubWFyayA9ICIsIiwgc2NpZW50aWZpYyA9IEZBTFNFKSwgIiUiKSwgICMgRm9ybWF0IHRvIDIgZGVjaW1hbCBwbGFjZXMgYW5kIGFkZCBjb21tYXMNCiAgICAgICAgLg0KICAgICAgKQ0KICAgIH0pDQogICkgJT4lDQogIGFycmFuZ2UoZGVzYyhgRGF0ZWApKSAgIyBTb3J0IGJ5IERhdGUgZnJvbSBuZXdlc3QgdG8gb2xkZXN0DQoNCiMgRGlzcGxheSB0aGUgZm9ybWF0dGVkIGRhdGENCmludGVyYWN0aXZlX3N0cihxcXFfcmF3KQ0KaW50ZXJhY3RpdmVfcHJpbnQocXFxX3JhdykNCg0KIyBEaXNwbGF5IHRoZSB0YWJsZSB3aXRoIGNhcHRpb24NCmNhdCgiXG5cbiMjIyMgUVFRIFllYXJseSBQZXJmb3JtYW5jZSAoIiwgbWluX3llYXIsICItIiwgbWF4X3llYXIsICIpXG4iLCBzZXAgPSAiIikNCmZvcm1hdF9lcXVhbF93aWR0aF9ncm91cGVkKHFxcV9yYXcsIGdyb3VwaW5nX2ZhY3RvciA9IDIpDQojIGNhdCgiXG5cbiBTb3VyY2U6ICIsIG5ydiRzb3VyY2VfcXFxLCAiXG4iKQ0KDQpgYGANCg0KIyMjIFN1bW1hcnkNCg0KYGBge3IgcXFxX3Jhd19zdW1tYXJ5LCBldmFsPVRSVUUsIGVjaG89RkFMU0V9DQoNCiMgTG9hZCBuZWNlc3NhcnkgbGlicmFyaWVzDQpsaWJyYXJ5KGRwbHlyKQ0KbGlicmFyeSh0aWJibGUpDQpsaWJyYXJ5KGtuaXRyKQ0KbGlicmFyeShrYWJsZUV4dHJhKQ0KDQppbnRlcmFjdGl2ZV9zdHIocXFxX3JhdykNCmludGVyYWN0aXZlX3ByaW50KHFxcV9yYXcpDQoNCiMgRW5zdXJlIHRoZSBEYXRlIGNvbHVtbiBpcyBhIHByb3BlciBEYXRlIG9iamVjdCBhbmQgZXh0cmFjdCB0aGUgeWVhcg0KcXFxX3JhdyA8LSBxcXFfcmF3ICU+JQ0KICBzbGljZSgtMSkgJT4lICMgUmVtb3ZlIHRoZSBmaXJzdCByb3cNCiAgIyBtdXRhdGUoRGF0ZSA9IGlmZWxzZShyb3dfbnVtYmVyKCkgPT0gMSwgIjIwMjUtMDEtMDEiLCBEYXRlKSkgJT4lDQogIG11dGF0ZSgNCiAgICBEYXRlID0gYXMubnVtZXJpYyhmb3JtYXQoYXMuRGF0ZShEYXRlLCBmb3JtYXQgPSAiJVktJW0tJWQiKSwgIiVZIikpLA0KICAgIGAxLVllYXIgQ0FHUmAgPSBhcy5udW1lcmljKGdzdWIoIlteMC05Li1dIiwgIiIsIGAxLVllYXIgQ0FHUmApKQ0KICApDQoNCiMgU29ydCBkYXRhIGJ5IERhdGUgaW4gYXNjZW5kaW5nIG9yZGVyDQpxcXFfcmF3IDwtIHFxcV9yYXcgJT4lDQogIGFycmFuZ2UoRGF0ZSkNCg0KDQojIENhbGN1bGF0ZSB0aGUgQ0FHUiBhbmQgZHluYW1pY2FsbHkgY3JlYXRlIGEgdmFyaWFibGUgbmFtZSB3aXRoIHRoZSBmb3JtYXQgcXFxX2NhZ3JfdmFsdWVfczxtaW5feWVhcj5fZTxtYXhfeWVhcj4NCmluaXRpYWxfdmFsdWUgPC0gMTAwICAjIEFzc3VtaW5nIGFuIGluaXRpYWwgaW5kZXggdmFsdWUgb2YgMTAwDQpmaW5hbF92YWx1ZSA8LSBpbml0aWFsX3ZhbHVlICogcHJvZCgxICsgcXFxX3JhdyRgMS1ZZWFyIENBR1JgIC8gMTAwLCBuYS5ybSA9IFRSVUUpDQptaW5feWVhciA8LSBtaW4ocXFxX3JhdyREYXRlLCBuYS5ybSA9IFRSVUUpDQptYXhfeWVhciA8LSBtYXgocXFxX3JhdyREYXRlLCBuYS5ybSA9IFRSVUUpDQpudW1feWVhcnMgPC0gbWF4X3llYXIgLSBtaW5feWVhcg0KY2Fncl92YWx1ZSA8LSByb3VuZCgoKGZpbmFsX3ZhbHVlIC8gaW5pdGlhbF92YWx1ZSleKDEgLyBudW1feWVhcnMpIC0gMSkgKiAxMDAsIDIpDQp2YXJfbmFtZSA8LSBwYXN0ZTAoInFxcV9jYWdyX3ZhbHVlX3MiLCBtaW5feWVhciwgIl9lIiwgbWF4X3llYXIpDQphc3NpZ24odmFyX25hbWUsIGNhZ3JfdmFsdWUpDQoNCiMgQ29udmVydCBRUVEgZGF0YSB0byBudW1lcmljLCByZW1vdmluZyBhbnkgcGVyY2VudGFnZSBzaWducw0KZGF0YSA8LSBhcy5udW1lcmljKGdzdWIoIiUiLCAiIiwgcXFxX3JhdyRgMS1ZZWFyIENBR1JgKSkNCg0KIyBDYWxjdWxhdGUgc3RhdGlzdGljcw0KY291bnRfb2JzZXJ2YXRpb25zIDwtIHN1bSghaXMubmEoZGF0YSkpDQptZWFuX3ZhbHVlIDwtIHJvdW5kKG1lYW4oZGF0YSwgbmEucm0gPSBUUlVFKSwgMikNCm1lZGlhbl92YWx1ZSA8LSByb3VuZChtZWRpYW4oZGF0YSwgbmEucm0gPSBUUlVFKSwgMikNCnNkX3ZhbHVlIDwtIHJvdW5kKHNkKGRhdGEsIG5hLnJtID0gVFJVRSksIDIpDQptaW5fY2Fncl9yYW5nZSA8LSByb3VuZChjYWdyX3ZhbHVlIC0gc2RfdmFsdWUsIDIpDQptYXhfY2Fncl9yYW5nZSA8LSByb3VuZChjYWdyX3ZhbHVlICsgc2RfdmFsdWUsIDIpDQptaW5fdmFsdWUgPC0gcm91bmQobWluKGRhdGEsIG5hLnJtID0gVFJVRSksIDIpDQptYXhfdmFsdWUgPC0gcm91bmQobWF4KGRhdGEsIG5hLnJtID0gVFJVRSksIDIpDQoNCiMgVGFyZ2V0IFJhdGUgQW5hbHlzaXMgLSBSZWZlciB0byAiUHJlZmVycmVkIFRhcmdldHMiIG9yIGluY2x1ZGUgYmVsb3cgZm9yIGluZGl2aWR1YWwgY2hhbmdlcy4NCmFib3ZlX3RhcmdldF9pbmZsYXRpb24gPC0gc3VtKGRhdGEgPj0gdGFyZ2V0X2luZmxhdGlvbiwgbmEucm0gPSBUUlVFKQ0KYWJvdmVfdGFyZ2V0X2NvbnNlcnZhdGl2ZSA8LSBzdW0oZGF0YSA+PSB0YXJnZXRfY29uc2VydmF0aXZlLCBuYS5ybSA9IFRSVUUpDQphYm92ZV90YXJnZXRfbW9kZXJhdGUgPC0gc3VtKGRhdGEgPj0gdGFyZ2V0X21vZGVyYXRlLCBuYS5ybSA9IFRSVUUpDQphYm92ZV90YXJnZXRfYWdncmVzc2l2ZSA8LSBzdW0oZGF0YSA+PSB0YXJnZXRfYWdncmVzc2l2ZSwgbmEucm0gPSBUUlVFKQ0KDQpwZXJjZW50X2Fib3ZlX3RhcmdldF9jb25zZXJ2YXRpdmUgPC0gcm91bmQoKGFib3ZlX3RhcmdldF9jb25zZXJ2YXRpdmUgLyBjb3VudF9vYnNlcnZhdGlvbnMpICogMTAwLCAyKQ0KcGVyY2VudF9hYm92ZV90YXJnZXRfaW5mbGF0aW9uIDwtIHJvdW5kKChhYm92ZV90YXJnZXRfaW5mbGF0aW9uIC8gY291bnRfb2JzZXJ2YXRpb25zKSAqIDEwMCwgMikNCnBlcmNlbnRfYWJvdmVfdGFyZ2V0X21vZGVyYXRlIDwtIHJvdW5kKChhYm92ZV90YXJnZXRfbW9kZXJhdGUgLyBjb3VudF9vYnNlcnZhdGlvbnMpICogMTAwLCAyKQ0KcGVyY2VudF9hYm92ZV90YXJnZXRfYWdncmVzc2l2ZSA8LSByb3VuZCgoYWJvdmVfdGFyZ2V0X2FnZ3Jlc3NpdmUgLyBjb3VudF9vYnNlcnZhdGlvbnMpICogMTAwLCAyKQ0KDQojIENvbXBpbGUgc3RhdGlzdGljcyBpbnRvIGEgbGlzdCBmb3IgZWFzeSBjb252ZXJzaW9uIHRvIGEgZGF0YSBmcmFtZSB3aXRoIGRlZmluaXRpb25zDQpxcXFfcmF3X3N1bW1hcnkgPC0gdHJpYmJsZSgNCiAgflN0YXRpc3RpYywgflZhbHVlLCB+RGVmaW5pdGlvbiwNCiAgIkNvdW50IG9mIE9ic2VydmF0aW9ucyIsIGFzLmNoYXJhY3Rlcihjb3VudF9vYnNlcnZhdGlvbnMpLCAiVG90YWwgbnVtYmVyIG9mIGRhdGEgcG9pbnRzIGNvbGxlY3RlZCBvdmVyIHRoZSBzcGVjaWZpYyBwZXJpb2QuIiwNCiAgIkNBR1IiLCBwYXN0ZTAoY2Fncl92YWx1ZSwgIiUiKSwgIkNvbXBvdW5kIEF2ZXJhZ2UgR3Jvd3RoIFJhdGU7IG1lYW4gZ3Jvd3RoIHJhdGUgb3ZlciBhIHBlcmlvZCBpZiBpdCBoYWQgY29tcG91bmRlZCBhbnVhbGx5LiIsDQogICJNZWFuIiwgcGFzdGUwKG1lYW5fdmFsdWUsICIlIiksICJSZWZsZWN0cyB0aGUgZ2VuZXJhbCBwcmljZSBsZXZlbCBhbmQgb3ZlcmFsbCBncm93dGggcmF0ZS4iLA0KICAiTWVkaWFuIiwgcGFzdGUwKG1lZGlhbl92YWx1ZSwgIiUiKSwgIk1pZGRsZSB2YWx1ZSBvZiB0aGUgZGF0YSB3aGVuIG9yZGVyZWQgY2hyb25vbG9naWNhbGx5OyBjZW50cmFsIHRlbmRlbmN5IG1lYXN1cmUgbGVzcyBhZmZlY3RlZCBieSBleHRyZW1lIHZhbHVlcy4iLA0KICAiU3RhbmRhcmQgRGV2aWF0aW9uIChWb2xhdGlsaXR5KSIsIHBhc3RlMChzZF92YWx1ZSwgIiUiKSwgIlRoZSBkaXNwZXJzaW9uIG9mIHZhbHVlcyBmcm9tIHRoZSBtZWFuLCBpbmRpY2F0aW5nIHRoZSB2b2xhdGlsaXR5IG9mIHByaWNlIGNoYW5nZXMgYW5kIGVjb25vbWljIHN0YWJpbGl0eS4iLA0KICAiTWluIENBR1IgUmFuZ2UgKENBR1IgLSBTRCkiLCBwYXN0ZTAobWluX2NhZ3JfcmFuZ2UsICIlIiksICJMb3dlciBib3VuZGFyeSBvZiBleHBlY3RlZCBRUVEgcmFuZ2U7IGxvd2VzdCBlc3RpbWF0ZSBvZiB0eXBpY2FsIGdyb3d0aCByYXRlIGNvbnNpZGVyaW5nIG5vcm1hbCBmbHVjdHVhdGlvbnMuIiwNCiAgIk1heCBDQUdSIFJhbmdlIChDQUdSICsgU0QpIiwgcGFzdGUwKG1heF9jYWdyX3JhbmdlLCAiJSIpLCAiVXBwZXIgYm91bmRhcnkgb2YgZXhwZWN0ZWQgUVFRIHJhbmdlOyBoaWdoZXN0IGVzdGltYXRlIG9mIHR5cGljYWwgZ3Jvd3RoIHJhdGUgY29uc2lkZXJpbmcgbm9ybWFsIGZsdWN0dWF0aW9ucy4iLA0KICAiTWluaW11bSIsIHBhc3RlMChtaW5fdmFsdWUsICIlIiksICJMb3dlc3QgZ3Jvd3RoIHJhdGUuIiwNCiAgIk1heGltdW0iLCBwYXN0ZTAobWF4X3ZhbHVlLCAiJSIpLCAiSGlnaGVzdCBncm93dGggcmF0ZS4iLA0KICAiUGVyY2VudCBBYm92ZSBJbmZsYXRpb24gVGFyZ2V0IiwgcGFzdGUwKHBlcmNlbnRfYWJvdmVfdGFyZ2V0X2luZmxhdGlvbiwgIiUiKSwgIlBlcmNlbnRhZ2Ugb2YgdmFsdWVzIGFib3ZlIHRoZSBpbmZsYXRpb24gdGFyZ2V0IHNwZWNpZmllZCBpbiBQcmVmZXJyZWQgVGFyZ2V0cyBzZWN0aW9uLiIsDQogICJQZXJjZW50IEFib3ZlIENvbnNlcnZhdGl2ZSBUYXJnZXQiLCBwYXN0ZTAocGVyY2VudF9hYm92ZV90YXJnZXRfY29uc2VydmF0aXZlLCAiJSIpLCAiUGVyY2VudGFnZSBvZiB2YWx1ZXMgYWJvdmUgdGhlIGNvbnNlcnZhdGl2ZSB0YXJnZXQgc3BlY2lmaWVkIGluIFByZWZlcnJlZCBUYXJnZXRzIHNlY3Rpb24uIiwNCiAgIlBlcmNlbnQgQWJvdmUgTW9kZXJhdGUgVGFyZ2V0IiwgcGFzdGUwKHBlcmNlbnRfYWJvdmVfdGFyZ2V0X21vZGVyYXRlLCAiJSIpLCAiUGVyY2VudGFnZSBvZiB2YWx1ZXMgYWJvdmUgdGhlIG1vZGVyYXRlIHRhcmdldCBzcGVjaWZpZWQgaW4gUHJlZmVycmVkIFRhcmdldHMgc2VjdGlvbi4iLA0KICAiUGVyY2VudCBBYm92ZSBBZ2dyZXNzaXZlIFRhcmdldCIsIHBhc3RlMChwZXJjZW50X2Fib3ZlX3RhcmdldF9hZ2dyZXNzaXZlLCAiJSIpLCAiUGVyY2VudGFnZSBvZiB2YWx1ZXMgYWJvdmUgdGhlIGFnZ3Jlc3NpdmUgdGFyZ2V0IHNwZWNpZmllZCBpbiBQcmVmZXJyZWQgVGFyZ2V0cyBzZWN0aW9uLiINCikNCg0KIyBDb252ZXJ0IHRvIGNoYXJhY3RlciB0byBhdm9pZCBhdXRvbWF0aWMgZGVjaW1hbCBwb2ludHMgb24gd2hvbGUgbnVtYmVycw0KcXFxX3Jhd19zdW1tYXJ5IDwtIHFxcV9yYXdfc3VtbWFyeSAlPiUNCiAgbXV0YXRlKGFjcm9zcyhldmVyeXRoaW5nKCksIGFzLmNoYXJhY3RlcikpDQoNCiMgRGlzcGxheSBmb3JtYXR0ZWQgdGFibGUNCmNhdCgiXG5cbiMjIyMgQW5udWFsIEdyb3d0aCBSYXRlIFN1bW1hcnkgKCIsIG1pbl95ZWFyLCAiLSIsIG1heF95ZWFyLCAiKVxuIiwgc2VwID0gIiIpDQpmb3JtYXRfM2NvbF9jdXN0b21fd2lkdGhzKHFxcV9yYXdfc3VtbWFyeSwgY29sMV93aWR0aCA9ICIyMGVtIiwgY29sMl93aWR0aCA9ICIxMGVtIiwgY29sM193aWR0aCA9ICI0MGVtIikgDQoNCiMgVmlldyhxcXFfcmF3X3N1bW1hcnkpDQppbnRlcmFjdGl2ZV9zdHIocXFxX3Jhd19zdW1tYXJ5KQ0KDQpgYGANCg0KUVFRJ3MgSW5kZXggZXhoaWJpdHMgYSBgciBpZihjYWdyX3ZhbHVlID4gdGFyZ2V0X2FnZ3Jlc3NpdmUpICJhZ2dyZXNzaXZlIiBlbHNlIGlmKGNhZ3JfdmFsdWUgPiB0YXJnZXRfbW9kZXJhdGUpICJtb2RlcmF0ZSIgZWxzZSBpZihjYWdyX3ZhbHVlID4gdGFyZ2V0X2NvbnNlcnZhdGl2ZSkgImNvbnNlcnZhdGl2ZSIgZWxzZSBpZihjYWdyX3ZhbHVlID4gdGFyZ2V0X2luZmxhdGlvbikgImJhc2VsaW5lIiBlbHNlICJkaXNhcHBvaW50aW5nImAgQ0FHUiBhdCBgciBjYWdyX3ZhbHVlYCUsIGByIGlmKGNhZ3JfdmFsdWUgPCBtZWFuX3ZhbHVlKSAibG93ZXIgdGhhbiIgZWxzZSAiaGlnaGVyIHRoYW4iYCB0aGUgbWVhbiBncm93dGggcmF0ZSBvZiBgciBtZWFuX3ZhbHVlYCUsIHJlZmxlY3RpbmcgdGhlIGltcGFjdCBvZiBzaG9ydC10ZXJtIHZvbGF0aWxpdHkgYW5kIGByIGlmKGNhZ3JfdmFsdWUgPiBtZWFuX3ZhbHVlKSAiZGVjbGluZXMiIGVsc2UgImdyb3d0aCBzcGlrZXMiYC4gVGhlIG1lZGlhbiByZXR1cm4gb2YgYHIgbWVkaWFuX3ZhbHVlYCUgaW5kaWNhdGVzIHRoYXQgbW9yZSB0aGFuIGhhbGYgb2YgdGhlIG9ic2VydmVkIHllYXJzIGV4cGVyaWVuY2VkIHJldHVybnMgYHIgaWYoY2Fncl92YWx1ZSA8IG1lZGlhbl92YWx1ZSkgImFib3ZlIiBlbHNlICJiZWxvdyJgIHRoZSBtZWFuLiBUaGUgcmVsYXRpb25zaGlwIGJldHdlZW4gdGhlIENBR1IgYW5kIHRoZSBtZWRpYW4gZ3Jvd3RoIHJhdGUgc3VnZ2VzdHMgdGhhdCBzdXN0YWluZWQgcGVyaW9kcyBvZiBhYm92ZS1tZWRpYW4gZ3Jvd3RoIGhhdmUgZXhlcnRlZCBjdW11bGF0aXZlIGByIGlmKGNhZ3JfdmFsdWUgPCBtZWRpYW5fdmFsdWUpICJ1cHdhcmQgcHJlc3N1cmUiIGVsc2UgImRvd253YXJkIHByZXNzdXJlImAgb24gb3ZlcmFsbCBwcmljZSBsZXZlbHMuIFRoaXMgcmVsYXRpb25zaGlwIGhpZ2hsaWdodHMgYSBkaXN0cmlidXRpb24gd2l0aCBub3RhYmxlIGV4dHJlbWVzIG9uIHRoZSBgciBpZihjYWdyX3ZhbHVlIDwgbWVhbl92YWx1ZSkgImhpZ2hlciIgZWxzZSAibG93ZXIiYCBlbmQsIHJlZmxlY3RpbmcgYHIgaWYoY2Fncl92YWx1ZSA8IG1lYW5fdmFsdWUpICJwb3NpdGl2ZSIgZWxzZSAibmVnYXRpdmUiYCBza2V3bmVzcy4gVGhpcyBgciBpZihjYWdyX3ZhbHVlIDwgbWVkaWFuX3ZhbHVlKSAicG9zaXRpdmUiIGVsc2UgIm5lZ2F0aXZlImAgc2tld25lc3MgaW1wbGllcyB0aGF0IHdoaWxlIG1vcmUgdGhhbiBoYWxmIG9mIHRoZSBvYnNlcnZlZCB5ZWFycyBleHBlcmllbmNlZCByZXR1cm5zIGByIGlmKGNhZ3JfdmFsdWUgPCBtZWRpYW5fdmFsdWUpICJhYm92ZSB0aGUgbWVhbiwgZG93bnR1cm5zIGNhbiBiZSBzZXZlcmUiIGVsc2UgImJlbG93IHRoZSBtZWFuLCB1cHR1cm5zIGNhbiBiZSBzaWduaWZpY2FudCJgLiBIb3dldmVyLCB0aGUgbWFya2V0IGhhcyBoaXN0b3JpY2FsbHkgcHJvdmlkZWQgc3Vic3RhbnRpYWwgYHIgaWYoY2Fncl92YWx1ZSA8IG1lZGlhbl92YWx1ZSkgInVwc2lkZSBwb3RlbnRpYWwiIGVsc2UgImRvd25zaWRlIHJpc2siYC4gQWRkaXRpb25hbGx5LCB0aGUgZmFjdCB0aGF0IGByIHBlcmNlbnRfYWJvdmVfdGFyZ2V0X2luZmxhdGlvbmAlIG9mIHRoZSB5ZWFycyBleGNlZWRlZCB0aGUgaW5mbGF0aW9uIHRhcmdldCBgciBpZiAocGVyY2VudF9hYm92ZV90YXJnZXRfaW5mbGF0aW9uID4gNzApICJyZWluZm9yY2VzIFFRUSdzIGVmZmVjdGl2ZW5lc3MgYXMgYSBzdHJvbmcgbG9uZy10ZXJtIGhlZGdlIiBlbHNlIGlmIChwZXJjZW50X2Fib3ZlX3RhcmdldF9pbmZsYXRpb24gPiA2MCkgInJlaW5mb3JjZXMgUVFRJ3MgZWZmZWN0aXZlbmVzcyBhcyBhIGxvbmctdGVybSBoZWRnZSIgZWxzZSBpZiAocGVyY2VudF9hYm92ZV90YXJnZXRfaW5mbGF0aW9uID4gNTApICJxdWVzdGlvbnMgUVFRJ3MgZWZmZWN0aXZlbmVzcyAgYXMgYSBsb25nLXRlcm0gaGVkZ2UiIGVsc2UgInVuZGVybWluZXMgUVFRJ3MgZWZmZWN0aXZlbmVzcyBhcyBhIGxvbmctdGVybSBoZWRnZSJgIGFnYWluc3QgaW5mbGF0aW9uLg0KDQpUaGUgc3RhbmRhcmQgZGV2aWF0aW9uIG9mIGByIHNkX3ZhbHVlYCUgYHIgaWYoc2RfdmFsdWUgPiAyMCkgImluZGljYXRlcyBleHRyZW1lIHZvbGF0aWxpdHksIHJlZmxlY3Rpbmcgc3Vic3RhbnRpYWwgZmx1Y3R1YXRpb25zIGluIGVxdWl0eSBtYXJrZXRzIiBlbHNlIGlmKHNkX3ZhbHVlID4gMTUpICJ1bmRlcnNjb3JlcyBzaWduaWZpY2FudCB2b2xhdGlsaXR5LCBhIGNvbW1vbiBmZWF0dXJlIG9mIGVxdWl0eSBtYXJrZXRzIiBlbHNlICJzdWdnZXN0cyBtb2RlcmF0ZSB2b2xhdGlsaXR5LCB0eXBpY2FsIG9mIHJlbGF0aXZlbHkgc3RhYmxlIG1hcmtldHMiYC4gVGhlIGByIHJhbmdlX3JhdGlvIDwtIChtYXhfdmFsdWUgLSBtaW5fdmFsdWUpIC8gc2RfdmFsdWU7IGlmKHJhbmdlX3JhdGlvID4gNSkgImhpZ2hseSB2b2xhdGlsZSIgZWxzZSBpZihyYW5nZV9yYXRpbyA+IDMpICJub3RhYmxlIiBlbHNlICJjb21wYXJhdGl2ZWx5IHN0YWJsZSJgIHJhbmdlIG9mIGFubnVhbCByZXR1cm5zLCBzcGFubmluZyBmcm9tIGByIG1pbl92YWx1ZWAlIHRvIGByIG1heF92YWx1ZWAlLCBgciBpZihyYW5nZV9yYXRpbyA+IDUpICJpbGx1c3RyYXRlcyBhIGhpZ2hseSB2b2xhdGlsZSBtYXJrZXQgZW52aXJvbm1lbnQsIHBhcnRseSBkdWUgdG8gaXRzIGNvbXBvc2l0aW9uLCB3aXRoIHRoZSBwb3RlbnRpYWwgZm9yIGJvdGggZXh0cmVtZSBnYWlucyBhbmQgbG9zc2VzIiBlbHNlIGlmKHJhbmdlX3JhdGlvID4gMykgImhpZ2hsaWdodHMgbm90YWJsZSBtYXJrZXQgdmFyaWFiaWxpdHksIHBhcnRseSBkdWUgdG8gaXRzIGNvbXBvc2l0aW9uLCAgcmVmbGVjdGluZyBib3RoIG9wcG9ydHVuaXRpZXMgYW5kIHJpc2tzIiBlbHNlICJpbmRpY2F0ZXMgYSBjb21wYXJhdGl2ZWx5IHN0YWJsZSBtYXJrZXQsIHBhcnRseSBkdWUgdG8gaXRzIGNvbXBvc2l0aW9uLCB3aXRoIGxlc3MgZXh0cmVtZSBhbm51YWwgZmx1Y3R1YXRpb25zImAuIA0KDQpGb3IgUVFRIHRvIGJlIGNvbnNpZGVyZWQgYSBoaWdoLXBlcmZvcm1pbmcgYW5kIHJlc2lsaWVudCBsb25nLXRlcm0gaW52ZXN0bWVudCwgaXQgd291bGQgYmUgaWRlYWwgdG8gZXhjZWVkIHRoZSBhZ2dyZXNzaXZlIHRhcmdldCAgKGUuZy4sIGByICh0YXJnZXRfYWdncmVzc2l2ZSAtIHRhcmdldF9pbmZsYXRpb24pYCUgYW5udWFsaXplZCByZXR1cm5zLCBhY2NvdW50aW5nIGZvciBoaWdoZXIgaW5mbGF0aW9uLWFkanVzdGVkIHBlcmZvcm1hbmNlIGV4cGVjdGF0aW9ucykgaW4gYXQgbGVhc3QgNDAlLTUwJSBvZiB0aGUgeWVhcnMuIFRoaXMgcmFuZ2UgcmVmbGVjdHMgdGhlIHBvdGVudGlhbCBmb3Igc3Ryb25nIHVwc2lkZSBpbiBtYW55IHllYXJzIHdoaWxlIGJhbGFuY2luZyB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IG1hcmtldHMgZG8gZXhwZXJpZW5jZSBkb3dudHVybnMuIFRoZSBmYWN0IHRoYXQgYHIgcGVyY2VudF9hYm92ZV90YXJnZXRfYWdncmVzc2l2ZWAlIG9mIHRoZSB5ZWFycyBleGNlZWRlZCB0aGUgYWdncmVzc2l2ZSB0YXJnZXQgYHIgaWYocGVyY2VudF9hYm92ZV90YXJnZXRfYWdncmVzc2l2ZSA+IDUwKSAiaW5kaWNhdGVzIGNvbnNpc3RlbnQgYW5kIHJvYnVzdCBncm93dGgsIG1ha2luZyBRUVEgYSBzdHJvbmcgb3B0aW9uIGZvciB0aG9zZSBzZWVraW5nIGFnZ3Jlc3NpdmUgaW52ZXN0bWVudHMuIiBlbHNlIGlmKHBlcmNlbnRfYWJvdmVfdGFyZ2V0X2FnZ3Jlc3NpdmUgPiA0MCkgInN1Z2dlc3RzIHRoYXQgd2hpbGUgbm90IGNvbnNpc3RlbnQsIFFRUSBoYXMgaGlzdG9yaWNhbGx5IHByb3ZpZGVkIHJvYnVzdCBncm93dGggb3ZlciB0aGUgbG9uZyB0ZXJtLCBtYWtpbmcgaXQgYSB2aWFibGUgaW52ZXN0bWVudCBmb3IgdGhvc2Ugd2l0aCBhIGhpZ2hlciByaXNrIHRvbGVyYW5jZS4iIGVsc2UgInJhaXNlcyBjb25jZXJucyBhYm91dCBRUVEncyBhYmlsaXR5IHRvIG1lZXQgYWdncmVzc2l2ZSBncm93dGggdGFyZ2V0cywgbWFraW5nIGl0IGxlc3Mgc3VpdGFibGUgZm9yIGludmVzdG9ycyB3aXRoIGhpZ2hlciByaXNrIHRvbGVyYW5jZS4iYA0KDQojIyMgR3JhcGgNCg0KYGBge3IgcXFxX3Jhd19ncmFwaCwgZmlnLndpZHRoPTEwLCBmaWcuaGVpZ2h0PTcsIGV2YWw9VFJVRSwgZWNobz1GQUxTRX0NCg0KIyBMb2FkIG5lY2Vzc2FyeSBsaWJyYXJpZXMNCmxpYnJhcnkoZ2dwbG90MikNCmxpYnJhcnkoZHBseXIpDQoNCiMgQ29udmVydCBgMS1ZZWFyIENBR1JgIHRvIG51bWVyaWMgZm9yIHBsb3R0aW5nDQpxcXFfcmF3IDwtIHFxcV9yYXcgJT4lDQogIG11dGF0ZSgNCiAgICBgRGF0ZWAgPSBhcy5udW1lcmljKGFzLmNoYXJhY3RlcihgRGF0ZWApKSwgICMgRW5zdXJlIERhdGUgaXMgbnVtZXJpYw0KICAgIGAxLVllYXIgQ0FHUmAgPSBhcy5udW1lcmljKGdzdWIoIiUiLCAiIiwgYDEtWWVhciBDQUdSYCkpDQogICkNCg0KIyBGaW5kIHRoZSBtaW5pbXVtIGFuZCBtYXhpbXVtIHgtdmFsdWUgaW4geW91ciBkYXRhDQptYXhfeCA8LSBtYXgoYXMuaW50ZWdlcihxcXFfcmF3JERhdGUpLCBuYS5ybSA9IFRSVUUpDQptaW5feCA8LSBtaW4oYXMuaW50ZWdlcihxcXFfcmF3JERhdGUpLCBuYS5ybSA9IFRSVUUpDQppbnRlcmFjdGl2ZV9wcmludChtYXhfeCkgICMgVGVzdA0KaW50ZXJhY3RpdmVfcHJpbnQobWluX3gpICAjIFRlc3QNCg0KIyBGaW5kIHRoZSBtaW5pbXVtIGFuZCBtYXhpbXVtIHllYXINCm1pbl95ZWFyIDwtIG1pbihxcXFfcmF3JERhdGUsIG5hLnJtID0gVFJVRSkNCm1heF95ZWFyIDwtIG1heChxcXFfcmF3JERhdGUsIG5hLnJtID0gVFJVRSkNCmludGVyYWN0aXZlX3ByaW50KG1pbl95ZWFyKQ0KaW50ZXJhY3RpdmVfcHJpbnQobWF4X3llYXIpDQoNCg0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiMjIFBMT1QgRlVMTCBXSVRIT1VUIExJTUlUUw0KDQojIERlZmluZSBzdGFydCBhbmQgZW5kIHllYXJzDQpzdGFydF95ZWFyIDwtIGFzLm51bWVyaWMobWluX3llYXIpDQplbmRfeWVhciA8LSAyMDI0DQp5ZWFyX3JhbmdlIDwtIGVuZF95ZWFyIC0gc3RhcnRfeWVhciArIDEgICMgQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgeWVhcnMNCg0KIyBEZWZpbmUgYnJlYWtzIHJvdW5kZWQgYXBwcm9wcmlhdGVseQ0KbGltaXRzX3N0YXJ0X3llYXIgPC0gZmxvb3Ioc3RhcnRfeWVhciAvIDUpICogNSAgIyBSb3VuZCBkb3duIHRvIHRoZSBuZWFyZXN0IG11bHRpcGxlIG9mIDUNCmxpbWl0c19lbmRfeWVhciA8LSBjZWlsaW5nKGVuZF95ZWFyIC8gNSkgKiA1ICAgIyBSb3VuZCB1cCB0byB0aGUgbmVhcmVzdCBtdWx0aXBsZSBvZiA1DQoNCiMgQ3JlYXRlIGR5bmFtaWMgdGl0bGUgYW5kIGNhcHRpb24NCmR5bmFtaWNfdGl0bGUgPC0gcGFzdGUwKCJBbm51YWwgR3Jvd3RoIFJhdGVzIE92ZXIgIix5ZWFyX3JhbmdlLCAiIFllYXJzICgiLCBzdGFydF95ZWFyLCAiLSIsIGVuZF95ZWFyLCAiKSIpDQpkeW5hbWljX2NhcHRpb24gPC0gcGFzdGUwKCJRUVEgQW5udWFsIEdyb3d0aCBSYXRlcywgRGF0YSBQZXJpb2QgKCIsIG1pbl95ZWFyLCAi4oCTIiwgbWF4X3llYXIsICIpIikNCg0KIyBDcmVhdGUgdGhlIGZ1bGwsIG5vbi1maWx0ZXJlZCB4LWF4aXMgcGxvdCB3aXRoIGR5bmFtaWMgeCBwbGFjZW1lbnQgZm9yIGFubm90YXRpb25zDQpwMSA8LSBnZ3Bsb3QocXFxX3JhdywgYWVzKHggPSBhcy5pbnRlZ2VyKERhdGUpLCB5ID0gYDEtWWVhciBDQUdSYCkpICsNCiAgDQogICMgQWRkIHNoYWRlZCBhcmVhcyBmb3IgYmFja2dyb3VuZCBlZmZlY3QNCiAgZ2VvbV9yZWN0KGFlcyh4bWluID0gLUluZiwgeG1heCA9IEluZiwgeW1pbiA9IHRhcmdldF9hZ2dyZXNzaXZlLCB5bWF4ID0gSW5mKSwgZmlsbCA9ICJsaWdodGdyZWVuIiwgYWxwaGEgPSAwLjAyNSkgKw0KICBnZW9tX3JlY3QoYWVzKHhtaW4gPSAtSW5mLCB4bWF4ID0gSW5mLCB5bWluID0gdGFyZ2V0X2NvbnNlcnZhdGl2ZSwgeW1heCA9IHRhcmdldF9hZ2dyZXNzaXZlKSwgZmlsbCA9ICJvcmFuZ2UiLCBhbHBoYSA9IDAuMDI1KSArDQogIGdlb21fcmVjdChhZXMoeG1pbiA9IC1JbmYsIHhtYXggPSBJbmYsIHltaW4gPSAtSW5mLCB5bWF4ID0gdGFyZ2V0X2NvbnNlcnZhdGl2ZSksIGZpbGwgPSAibGlnaHRjb3JhbCIsIGFscGhhID0gMC4wMjUpICsNCiAgDQogICMgUGxvdCBsaW5lcywgcG9pbnRzLCBhbmQgYW5ub3RhdGlvbnMgb24gdG9wIG9mIHNoYWRlZCBhcmVhcw0KICBnZW9tX2xpbmUoY29sb3IgPSAiIzRCMDA4MiIsIHNpemUgPSAxLjApICsgICAgICAgIyBEYXJrIHB1cnBsZSBsaW5lIA0KICBnZW9tX3BvaW50KGNvbG9yID0gIiM0QjAwODIiLCBzaXplID0gMS41KSArICAgICAgICAjIERhcmsgcHVycGxlIHBvaW50cyANCiAgDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IHRhcmdldF9hZ2dyZXNzaXZlLCBjb2xvciA9ICJkYXJrYmx1ZSIsIGxpbmV0eXBlID0gInNvbGlkIikgKw0KICAjIGdlb21faGxpbmUoeWludGVyY2VwdCA9IHRhcmdldF9tb2RlcmF0ZSwgY29sb3IgPSAiZGFya2JsdWUiLCBsaW5ldHlwZSA9ICJzb2xpZCIpICsNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gdGFyZ2V0X2NvbnNlcnZhdGl2ZSwgY29sb3IgPSAiZGFya2JsdWUiLCBsaW5ldHlwZSA9ICJzb2xpZCIpICsNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gdGFyZ2V0X2luZmxhdGlvbiwgY29sb3IgPSAiZGFya3JlZCIsIGxpbmV0eXBlID0gImRhc2hlZCIpICsNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gY2Fncl92YWx1ZSwgY29sb3IgPSAiZGFya3JlZCIsIGxpbmV0eXBlID0gImRhc2hlZCIpICsNCiAgDQogICMgRHluYW1pYyByaWdodC1hbGlnbmVkIHBsYWNlbWVudCBmb3IgYW5ub3RhdGlvbnMNCiAgYW5ub3RhdGUoInRleHQiLCB4ID0gSW5mLCB5ID0gdGFyZ2V0X2FnZ3Jlc3NpdmUsIGxhYmVsID0gIkFnZ3Jlc3NpdmUiLCANCiAgICAgICAgICAgaGp1c3QgPSAxLCB2anVzdCA9IC0wLjUwLCBjb2xvciA9ICJkYXJrYmx1ZSIsIHNpemUgPSA0KSArDQogICMgYW5ub3RhdGUoInRleHQiLCB4ID0gSW5mLCB5ID0gdGFyZ2V0X21vZGVyYXRlLCBsYWJlbCA9ICJNb2RlcmF0ZSIsIA0KICAjICAgICAgICAgaGp1c3QgPSAxLCB2anVzdCA9IC0wLjUwLCBjb2xvciA9ICJkYXJrYmx1ZSIsIHNpemUgPSA0KSArDQogIGFubm90YXRlKCJ0ZXh0IiwgeCA9IEluZiwgeSA9IHRhcmdldF9jb25zZXJ2YXRpdmUsIGxhYmVsID0gIkNvbnNlcnZhdGl2ZSIsIA0KICAgICAgICAgICBoanVzdCA9IDEsIHZqdXN0ID0gKzEuMTAsIGNvbG9yID0gImRhcmtibHVlIiwgc2l6ZSA9IDQpICsNCiAgYW5ub3RhdGUoInRleHQiLCB4ID0gSW5mLCB5ID0gdGFyZ2V0X2luZmxhdGlvbiwgbGFiZWwgPSAiSW5mbGF0aW9uIiwgDQogICAgICAgICAgIGhqdXN0ID0gMSwgdmp1c3QgPSArMS4xMCwgY29sb3IgPSAiZGFya3JlZCIsIHNpemUgPSA0KSArDQogIGFubm90YXRlKCJ0ZXh0IiwgeCA9IEluZiwgeSA9IGNhZ3JfdmFsdWUsIGxhYmVsID0gIkNBR1IiLCANCiAgICAgICAgICAgaGp1c3QgPSAxLCB2anVzdCA9IC0wLjUwLCBjb2xvciA9ICJkYXJrcmVkIiwgc2l6ZSA9IDQpICsgDQoNCiAgbGFicygNCiAgICB0aXRsZSA9IGR5bmFtaWNfdGl0bGUsDQogICAgeCA9ICJZZWFyIiwNCiAgICB5ID0gIkdyb3d0aCBSYXRlICglKSIsDQogICAgY2FwdGlvbiA9IGR5bmFtaWNfY2FwdGlvbg0KICApICsNCg0KICBzY2FsZV94X2NvbnRpbnVvdXMoDQogICAgbGltaXRzID0gYyhzdGFydF95ZWFyLCBlbmRfeWVhciArIDMpLCAjIFJlc3RyaWN0cyB4LWF4aXMgZGF0YSANCiAgICBicmVha3MgPSBzZXEobGltaXRzX3N0YXJ0X3llYXIsIGxpbWl0c19lbmRfeWVhciwgNSkgIyBTZXRzIE1ham9yIHgtYXhpcyAgDQogICkgKyAgIyBSZXN0cmljdCAmIFNldCBNYWpvciB4LWF4aXMgbGluZXMgDQogICAgDQogIHRoZW1lX21pbmltYWwoKSArDQogIHRoZW1lKA0KICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUsIHNpemUgPSAyMCksICAgICAgICAgIyBMYXJnZXIgdGl0bGUgZm9udA0KICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQpLCAgICAgICAgICAgICAgICAgICAgIyBMYXJnZXIgeC1heGlzIGxhYmVsIGZvbnQNCiAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0KSwgICAgICAgICAgICAgICAgICAgICMgTGFyZ2VyIHktYXhpcyBsYWJlbCBmb250DQogICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxLCBzaXplID0gMTQpLCAgIyBMYXJnZXIgeC1heGlzIHRleHQNCiAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQpLCAgICAgICAgICAgICAgICAgICAgICMgTGFyZ2VyIHktYXhpcyB0ZXh0DQogICAgcGFuZWwuZ3JpZC5tYWpvciA9IGVsZW1lbnRfbGluZShsaW5ldHlwZSA9ICJkb3R0ZWQiLCBjb2xvciA9ICJibGFjayIpLCAgICAgICAgICMgTWFqb3IgZ3JpZCBsaW5lcw0KICAgIHBhbmVsLmdyaWQubWlub3IueCA9IGVsZW1lbnRfYmxhbmsoKSwgIyBlbGVtZW50X2xpbmUoY29sb3IgPSAiZ3JleTgwIikgICMgTWlub3IgeCBncmlkIGxpbmVzIGZvciBlYWNoIHllYXINCiAgICAjIHBhbmVsLmJvcmRlciA9IGVsZW1lbnRfcmVjdChjb2xvciA9ICJkYXJrZ3JleSIsIGZpbGwgPSBOQSwgc2l6ZSA9IDEuMCkgICMgRGFyayBib3JkZXIgYXJvdW5kIHRoZSBwbG90DQogICAgYXhpcy50aWNrcy5sZW5ndGggPSB1bml0KC0wLjI1LCAiY20iKSwgICAgICAgICAgICAgICAgICAgICAgIyBJbmNyZWFzZSB0aWNrIGxlbmd0aA0KICAgIGF4aXMudGlja3MgPSBlbGVtZW50X2xpbmUoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMC41MCksICMgRGFya2VyIHRpY2tzDQogICAgYXhpcy5saW5lLnggPSBlbGVtZW50X2xpbmUoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMC43NSksICAjIERhcmsgYm90dG9tIGJvcmRlcg0KICAgIGF4aXMubGluZS55ID0gZWxlbWVudF9saW5lKGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDAuNzUpICAgIyBEYXJrIGxlZnQgYm9yZGVyDQogICkNCg0KcHJpbnQocDEpDQoNCg0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiMjIFBMT1QgUkVTVFJJQ1RFRCBXSVRIIExJTUlUUw0KDQojIEZpbHRlciB0aGUgZGF0YSBmb3IgdGhlIHJlc3RyaWN0ZWQgeC1heGlzIHJhbmdlICgyMDA1LTIwMjQpDQpyZXN0cmljdGVkX2RhdGEgPC0gcXFxX3JhdyAlPiUNCiAgZmlsdGVyKGFzLmludGVnZXIoRGF0ZSkgPj0gMjAwNSAmIGFzLmludGVnZXIoRGF0ZSkgPD0gMjAyNCkNCg0KIyBEZWZpbmUgc3RhcnQgYW5kIGVuZCB5ZWFycw0Kc3RhcnRfeWVhciA8LSAyMDA1DQplbmRfeWVhciA8LSAyMDI0DQp5ZWFyX3JhbmdlIDwtIGVuZF95ZWFyIC0gc3RhcnRfeWVhciArIDEgICMgQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgeWVhcnMNCg0KIyBEZWZpbmUgYnJlYWtzIHJvdW5kZWQgYXBwcm9wcmlhdGVseQ0KbGltaXRzX3N0YXJ0X3llYXIgPC0gZmxvb3Ioc3RhcnRfeWVhciAvIDUpICogNSAgIyBSb3VuZCBkb3duIHRvIHRoZSBuZWFyZXN0IG11bHRpcGxlIG9mIDUNCmxpbWl0c19lbmRfeWVhciA8LSBjZWlsaW5nKGVuZF95ZWFyIC8gNSkgKiA1ICAgIyBSb3VuZCB1cCB0byB0aGUgbmVhcmVzdCBtdWx0aXBsZSBvZiA1DQoNCiMgQ3JlYXRlIGR5bmFtaWMgdGl0bGUgYW5kIGNhcHRpb24NCmR5bmFtaWNfdGl0bGUgPC0gcGFzdGUwKCJBbm51YWwgR3Jvd3RoIFJhdGVzIE92ZXIgIix5ZWFyX3JhbmdlLCAiIFllYXJzICgiLCBzdGFydF95ZWFyLCAiLSIsIGVuZF95ZWFyLCAiKSIpDQpkeW5hbWljX2NhcHRpb24gPC0gcGFzdGUwKCJRUVEgQW5udWFsIEdyb3d0aCBSYXRlcywgRGF0YSBQZXJpb2QgKCIsIG1pbl95ZWFyLCAi4oCTIiwgbWF4X3llYXIsICIpIikNCg0KIyBDYWxjdWxhdGUgZHluYW1pYyB5LWF4aXMgbGltaXRzIGZvciB0aGUgcmVzdHJpY3RlZCBkYXRhDQp5X21pbiA8LSBtaW4ocmVzdHJpY3RlZF9kYXRhJGAxLVllYXIgQ0FHUmAsIG5hLnJtID0gVFJVRSkNCnlfbWF4IDwtIG1heChyZXN0cmljdGVkX2RhdGEkYDEtWWVhciBDQUdSYCwgbmEucm0gPSBUUlVFKQ0KDQojIENyZWF0ZSB0aGUgZnVsbCwgbm9uLWZpbHRlcmVkIHgtYXhpcyBwbG90IHdpdGggZHluYW1pYyB4IHBsYWNlbWVudCBmb3IgYW5ub3RhdGlvbnMNCnAzIDwtIGdncGxvdChyZXN0cmljdGVkX2RhdGEsIGFlcyh4ID0gYXMuaW50ZWdlcihEYXRlKSwgeSA9IGAxLVllYXIgQ0FHUmApKSArDQogIA0KICAjIEFkZCBzaGFkZWQgYXJlYXMgZm9yIGJhY2tncm91bmQgZWZmZWN0DQogIGdlb21fcmVjdChhZXMoeG1pbiA9IC1JbmYsIHhtYXggPSBJbmYsIHltaW4gPSB0YXJnZXRfYWdncmVzc2l2ZSwgeW1heCA9IEluZiksIGZpbGwgPSAibGlnaHRncmVlbiIsIGFscGhhID0gMC4wMzApICsNCiAgZ2VvbV9yZWN0KGFlcyh4bWluID0gLUluZiwgeG1heCA9IEluZiwgeW1pbiA9IHRhcmdldF9jb25zZXJ2YXRpdmUsIHltYXggPSB0YXJnZXRfYWdncmVzc2l2ZSksIGZpbGwgPSAib3JhbmdlIiwgYWxwaGEgPSAwLjAzMCkgKw0KICBnZW9tX3JlY3QoYWVzKHhtaW4gPSAtSW5mLCB4bWF4ID0gSW5mLCB5bWluID0gLUluZiwgeW1heCA9IHRhcmdldF9jb25zZXJ2YXRpdmUpLCBmaWxsID0gImxpZ2h0Y29yYWwiLCBhbHBoYSA9IDAuMDMwKSArDQogIA0KICAjIFBsb3QgbGluZXMsIHBvaW50cywgYW5kIGFubm90YXRpb25zIG9uIHRvcCBvZiBzaGFkZWQgYXJlYXMNCiAgZ2VvbV9saW5lKGNvbG9yID0gIiM0QjAwODIiLCBzaXplID0gMS4wKSArICAgICAgICMgRGFyayBwdXJwbGUgbGluZSANCiAgZ2VvbV9wb2ludChjb2xvciA9ICIjNEIwMDgyIiwgc2l6ZSA9IDEuNSkgKyAgICAgICAgIyBEYXJrIHB1cnBsZSBwb2ludHMgDQogIA0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSB0YXJnZXRfYWdncmVzc2l2ZSwgY29sb3IgPSAiZGFya2JsdWUiLCBsaW5ldHlwZSA9ICJzb2xpZCIpICsNCiAgIyBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSB0YXJnZXRfbW9kZXJhdGUsIGNvbG9yID0gImRhcmtibHVlIiwgbGluZXR5cGUgPSAic29saWQiKSArDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IHRhcmdldF9jb25zZXJ2YXRpdmUsIGNvbG9yID0gImRhcmtibHVlIiwgbGluZXR5cGUgPSAic29saWQiKSArDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IHRhcmdldF9pbmZsYXRpb24sIGNvbG9yID0gImRhcmtyZWQiLCBsaW5ldHlwZSA9ICJkYXNoZWQiKSArDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IGNhZ3JfdmFsdWUsIGNvbG9yID0gImRhcmtyZWQiLCBsaW5ldHlwZSA9ICJkYXNoZWQiKSArDQogIA0KICAjIER5bmFtaWMgcmlnaHQtYWxpZ25lZCBwbGFjZW1lbnQgZm9yIGFubm90YXRpb25zDQogIGFubm90YXRlKCJ0ZXh0IiwgeCA9IEluZiwgeSA9IHRhcmdldF9hZ2dyZXNzaXZlLCBsYWJlbCA9ICJBZ2dyZXNzaXZlIiwgDQogICAgICAgICAgIGhqdXN0ID0gMSwgdmp1c3QgPSAtMC41MCwgY29sb3IgPSAiZGFya2JsdWUiLCBzaXplID0gNCkgKw0KICAjIGFubm90YXRlKCJ0ZXh0IiwgeCA9IEluZiwgeSA9IHRhcmdldF9tb2RlcmF0ZSwgbGFiZWwgPSAiTW9kZXJhdGUiLCANCiAgIyAgICAgICAgIGhqdXN0ID0gMSwgdmp1c3QgPSAtMC41MCwgY29sb3IgPSAiZGFya2JsdWUiLCBzaXplID0gNCkgKw0KICBhbm5vdGF0ZSgidGV4dCIsIHggPSBJbmYsIHkgPSB0YXJnZXRfY29uc2VydmF0aXZlLCBsYWJlbCA9ICJDb25zZXJ2YXRpdmUiLCANCiAgICAgICAgICAgaGp1c3QgPSAxLCB2anVzdCA9ICsxLjEwLCBjb2xvciA9ICJkYXJrYmx1ZSIsIHNpemUgPSA0KSArDQogIGFubm90YXRlKCJ0ZXh0IiwgeCA9IEluZiwgeSA9IHRhcmdldF9pbmZsYXRpb24sIGxhYmVsID0gIkluZmxhdGlvbiIsIA0KICAgICAgICAgICBoanVzdCA9IDEsIHZqdXN0ID0gKzEuMTAsIGNvbG9yID0gImRhcmtyZWQiLCBzaXplID0gNCkgKw0KICBhbm5vdGF0ZSgidGV4dCIsIHggPSBJbmYsIHkgPSBjYWdyX3ZhbHVlLCBsYWJlbCA9ICJDQUdSIiwgDQogICAgICAgICAgIGhqdXN0ID0gMSwgdmp1c3QgPSAtMC41MCwgY29sb3IgPSAiZGFya3JlZCIsIHNpemUgPSA0KSArIA0KDQogIGxhYnMoDQogICAgdGl0bGUgPSBkeW5hbWljX3RpdGxlLA0KICAgIHggPSAiWWVhciIsDQogICAgeSA9ICJHcm93dGggUmF0ZSAoJSkiLA0KICAgIGNhcHRpb24gPSBkeW5hbWljX2NhcHRpb24NCiAgKSArDQogIA0KICBjb29yZF9jYXJ0ZXNpYW4oeWxpbSA9IGMoeV9taW4sIHlfbWF4KSkgKyAjIEFwcGx5IGR5bmFtaWMgeS1heGlzIGxpbWl0cw0KICBzY2FsZV94X2NvbnRpbnVvdXMoDQogICAgbGltaXRzID0gYyhzdGFydF95ZWFyLCBlbmRfeWVhciArIDIpLCANCiAgICBicmVha3MgPSBzZXEobGltaXRzX3N0YXJ0X3llYXIsIGxpbWl0c19lbmRfeWVhciwgNSkNCiAgKSArICAjIFJlc3RyaWN0ICYgU2V0IE1ham9yIHgtYXhpcyBsaW5lcyBmb3IgZWFjaCB5ZWFyDQoNCiAgdGhlbWVfbWluaW1hbCgpICsNCiAgdGhlbWUoDQogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSwgc2l6ZSA9IDIwKSwgICAgICAgICAjIExhcmdlciB0aXRsZSBmb250DQogICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCksICAgICAgICAgICAgICAgICAgICAjIExhcmdlciB4LWF4aXMgbGFiZWwgZm9udA0KICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQpLCAgICAgICAgICAgICAgICAgICAgIyBMYXJnZXIgeS1heGlzIGxhYmVsIGZvbnQNCiAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEsIHNpemUgPSAxNCksICAjIExhcmdlciB4LWF4aXMgdGV4dA0KICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCksICAgICAgICAgICAgICAgICAgICAgIyBMYXJnZXIgeS1heGlzIHRleHQNCiAgICBwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9saW5lKGxpbmV0eXBlID0gImRvdHRlZCIsIGNvbG9yID0gImJsYWNrIiksICAgICAgICAgIyBNYWpvciBncmlkIGxpbmVzDQogICAgcGFuZWwuZ3JpZC5taW5vci54ID0gZWxlbWVudF9ibGFuaygpLCAjIGVsZW1lbnRfbGluZShjb2xvciA9ICJncmV5ODAiKSAgIyBNaW5vciB4IGdyaWQgbGluZXMgZm9yIGVhY2ggeWVhcg0KICAgICMgcGFuZWwuYm9yZGVyID0gZWxlbWVudF9yZWN0KGNvbG9yID0gImRhcmtncmV5IiwgZmlsbCA9IE5BLCBzaXplID0gMS4wKSAgIyBEYXJrIGJvcmRlciBhcm91bmQgdGhlIHBsb3QNCiAgICBheGlzLnRpY2tzLmxlbmd0aCA9IHVuaXQoLTAuMjUsICJjbSIpLCAgICAgICAgICAgICAgICAgICAgICAjIEluY3JlYXNlIHRpY2sgbGVuZ3RoDQogICAgYXhpcy50aWNrcyA9IGVsZW1lbnRfbGluZShjb2xvciA9ICJibGFjayIsIHNpemUgPSAwLjUwKSwgIyBEYXJrZXIgdGlja3MNCiAgICBheGlzLmxpbmUueCA9IGVsZW1lbnRfbGluZShjb2xvciA9ICJibGFjayIsIHNpemUgPSAwLjc1KSwgICMgRGFyayBib3R0b20gYm9yZGVyDQogICAgYXhpcy5saW5lLnkgPSBlbGVtZW50X2xpbmUoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMC43NSkgICAjIERhcmsgbGVmdCBib3JkZXINCiAgKQ0KDQpwcmludChwMykNCg0KYGBgDQoNCg0KIyMgUVFRIENBR1INCg0KIyMjIERhdGENCg0KRHVlIHRvIFFRUSdzIGluY2VwdGlvbiBpbiBNYXJjaCAxOTk5LCB0aGVyZSBpcyBpbnN1ZmZpY2llbnQgZGF0YSB0byBjYWxjdWxhdGUgdGhlIDMwLXllYXIgQ0FHUnMuIA0KDQpgYGB7ciBxcXFfcmF3X2dyLCBldmFsPVRSVUUsIGVjaG89RkFMU0V9DQoNCiMgVmlldyhucnQkcXFxX3Jhd19ncikNCmludGVyYWN0aXZlX3N0cihucnQkcXFxX3Jhd19ncikNCg0KbGlicmFyeShkcGx5cikNCmxpYnJhcnkobHVicmlkYXRlKSAgIyBGb3IgZGF0ZSBtYW5pcHVsYXRpb24NCmxpYnJhcnkoc2NhbGVzKQ0KbGlicmFyeShzdHJpbmdyKQ0KDQojIFVwZGF0ZSBkYXRhIGZyYW1lIHdpdGggcHJvcGVyIGRhdGUgYW5kIHBlcmNlbnRhZ2UgaGFuZGxpbmcNCnFxcV9yYXdfZ3IgPC0gbnJ0JHFxcV9yYXdfZ3IgJT4lDQogIG11dGF0ZSgNCiAgICAjIENvbnZlcnQgQ2xvc2UgRGF0ZSB0byAiWVlZWS1NTS1ERCIgZm9ybWF0DQogICAgYERhdGVgID0gZm9ybWF0KGFzLkRhdGUoYXMuY2hhcmFjdGVyKGBEYXRlYCksIG9yaWdpbiA9ICIxOTcwLTAxLTAxIiksICIlWS0lbS0lZCIpLA0KICAgIA0KICAgICMgRW5zdXJlIENsb3NlIGlzIGEgbnVtYmVyIGZvcm1hdHRlZCB0byAyIGRlY2ltYWwgcGxhY2VzDQogICAgYENsb3NlYCA9IG51bWJlcihhcy5udW1lcmljKGdzdWIoIiwiLCAiIiwgQ2xvc2UpKSwgYmlnLm1hcmsgPSAiLCIsIGRlY2ltYWwubWFyayA9ICIuIiwgYWNjdXJhY3kgPSAwLjAxKSwNCg0KICAgICMgQ2xlYW4gYW5kIGhhbmRsZSBwZXJjZW50YWdlIGNvbHVtbnMNCiAgICBhY3Jvc3MoMzoxMSwgfiB7DQogICAgICB2YWx1ZSA8LSBnc3ViKCJbLCVcXHNdIiwgIiIsIC4pICAjIFJlbW92ZSAlLCBjb21tYXMsIGFuZCBzcGFjZXMNCiAgICAgIG51bWVyaWNfdmFsdWUgPC0gc3VwcHJlc3NXYXJuaW5ncyhhcy5udW1lcmljKHZhbHVlKSkgICMgQ29udmVydCB0byBudW1lcmljDQogICAgICBpZmVsc2UoDQogICAgICAgICFpcy5uYShudW1lcmljX3ZhbHVlKSwgDQogICAgICAgIHBhc3RlMChmb3JtYXQocm91bmQobnVtZXJpY192YWx1ZSoxMDAsIDIpLCBiaWcubWFyayA9ICIsIiwgc2NpZW50aWZpYyA9IEZBTFNFKSwgIiUiKSwgICMgRm9ybWF0IHRvIDIgZGVjaW1hbCBwbGFjZXMgYW5kIGFkZCBjb21tYXMNCiAgICAgICAgLg0KICAgICAgKQ0KICAgIH0pDQogICkgJT4lDQogIGFycmFuZ2UoZGVzYyhgRGF0ZWApKSAgIyBTb3J0IGJ5IERhdGUgZnJvbSBuZXdlc3QgdG8gb2xkZXN0DQoNCiMgQ3JlYXRlIHFxcV9yYXdfZ3I6IENHUg0KcXFxX3Jhd19jZ3IgPC0gcXFxX3Jhd19nciAlPiUNCiAgc2VsZWN0KGBEYXRlYCwgYENsb3NlYCwgYDEtWWVhciBDQUdSYCwgY29udGFpbnMgKCJDR1IiKSkNCg0KIyBDcmVhdGUgcXFxX3Jhd19ncjogQ0FHUg0KcXFxX3Jhd19jYWdyIDwtIHFxcV9yYXdfZ3IgJT4lDQogIHNlbGVjdChgRGF0ZWAsIGBDbG9zZWAsIGNvbnRhaW5zICgiQ0FHUiIpKQ0KDQojIERpc3BsYXkgYm90aCB0YWJsZXMgZm9yIGNvbmZpcm1hdGlvbg0KaW50ZXJhY3RpdmVfcHJpbnQocXFxX3Jhd19jZ3IpDQppbnRlcmFjdGl2ZV9wcmludChxcXFfcmF3X2NhZ3IpDQoNCiMgT3B0aW9uYWw6IFByaW50IHRhYmxlIHN1bW1hcmllcw0KaW50ZXJhY3RpdmVfc3RyKHFxcV9yYXdfY2dyKQ0KaW50ZXJhY3RpdmVfc3RyKHFxcV9yYXdfY2FncikNCg0KIyBEaXNwbGF5IGNhcHRpb25zIGZvciBlYWNoIHRhYmxlDQojIGNhdCgiXG5cbiMjIyMgQ3VtdWxhdGl2ZSBHcm93dGggUmF0ZXMgKCIsIG1pbl95ZWFyLCAiLSIsIG1heF95ZWFyLCAiKVxuIiwgc2VwID0gIiIpDQojIGZvcm1hdF9lcXVhbF93aWR0aChxcXFfcmF3X2NncikNCg0KY2F0KCJcblxuIyMjIyBDb21wb3VuZCBBdmVyYWdlIEdyb3d0aCBSYXRlcyAoIiwgbWluX3llYXIsICItIiwgbWF4X3llYXIsICIpXG4iLCBzZXAgPSAiIikNCmZvcm1hdF9lcXVhbF93aWR0aChxcXFfcmF3X2NhZ3IpDQoNCiMgVmlldyhxcXFfcmF3X2NhZ3IpDQojIGNvbG5hbWVzKHFxcV9yYXdfY2FncikNCmludGVyYWN0aXZlX3N0cihxcXFfcmF3X2NhZ3IpDQoNCg0KYGBgDQoNCiMjIyBTdW1tYXJ5DQoNCmBgYHtyIHFxcV9yYXdfY2Fncl9zdW1tYXJ5LCBldmFsPVRSVUUsIGVjaG89RkFMU0V9DQoNCmludGVyYWN0aXZlX3N0cihxcXFfcmF3X2NhZ3IpDQoNCiMgTG9hZCBuZWNlc3NhcnkgbGlicmFyaWVzDQpsaWJyYXJ5KGRwbHlyKQ0KbGlicmFyeSh0aWJibGUpDQoNCiMgRGVmaW5lIGEgaGVscGVyIGZ1bmN0aW9uIHRvIGNsZWFuIGFuZCBjb252ZXJ0IHBlcmNlbnRhZ2VzDQpjbGVhbl9wZXJjZW50YWdlIDwtIGZ1bmN0aW9uKGNvbHVtbikgew0KICBhcy5udW1lcmljKGdzdWIoIiUiLCAiIiwgY29sdW1uKSkNCn0NCg0KIyBEZWZpbmUgdGhlIHN0YXRpc3RpYyBuYW1lcyBmb3IgdGhlIHN1bW1hcnkgdGFibGUNCnN0YXRpc3RpY19uYW1lcyA8LSBjKA0KICAiQ291bnQgb2YgT2JzZXJ2YXRpb25zIiwgDQogICJNZWFuIiwgDQogICJNZWRpYW4iLA0KICAiU3RhbmRhcmQgRGV2aWF0aW9uIChWb2xhdGlsaXR5KSIsIA0KICAiTWluIENBR1IgUmFuZ2UgKENBR1IgLSBTRCkiLA0KICAiTWF4IENBR1IgUmFuZ2UgKENBR1IgKyBTRCkiLA0KICAiTWluaW11bSIsIA0KICAiTWF4aW11bSIsIA0KICAiUGVyY2VudCBBYm92ZSBJbmZsYXRpb24gVGFyZ2V0IiwgDQogICJQZXJjZW50IEFib3ZlIENvbnNlcnZhdGl2ZSBUYXJnZXQiLCANCiAgIlBlcmNlbnQgQWJvdmUgTW9kZXJhdGUgVGFyZ2V0IiwgDQogICJQZXJjZW50IEFib3ZlIEFnZ3Jlc3NpdmUgVGFyZ2V0Ig0KKQ0KDQojIEFkanVzdCB0aGUgZmlyc3Qgcm93J3MgRGF0ZSBhbmQgY2xlYW4gdXAgQ0FHUiBjb2x1bW5zDQpxcXFfcmF3X2NhZ3IgPC0gcXFxX3Jhd19jYWdyICU+JQ0KICBzbGljZSgtMSkgJT4lICMgUmVtb3ZlIHRoZSBmaXJzdCByb3cNCiAgbXV0YXRlKA0KICAgICMgRGF0ZSA9IGlmZWxzZShyb3dfbnVtYmVyKCkgPT0gMSwgIjIwMjUtMDEtMDEiLCBEYXRlKSwNCiAgICBEYXRlID0gYXMubnVtZXJpYyhmb3JtYXQoYXMuRGF0ZShEYXRlKSwgIiVZIikpLA0KICAgIGAxLVllYXIgQ0FHUmAgPSBjbGVhbl9wZXJjZW50YWdlKGAxLVllYXIgQ0FHUmApLA0KICAgIGA1LVllYXIgQ0FHUmAgPSBjbGVhbl9wZXJjZW50YWdlKGA1LVllYXIgQ0FHUmApLA0KICAgIGAxMC1ZZWFyIENBR1JgID0gY2xlYW5fcGVyY2VudGFnZShgMTAtWWVhciBDQUdSYCksDQogICAgYDIwLVllYXIgQ0FHUmAgPSBjbGVhbl9wZXJjZW50YWdlKGAyMC1ZZWFyIENBR1JgKSwNCiAgICBgMzAtWWVhciBDQUdSYCA9IGNsZWFuX3BlcmNlbnRhZ2UoYDMwLVllYXIgQ0FHUmApDQogICkNCg0KIyBGdW5jdGlvbiB0byBjYWxjdWxhdGUgc3RhdGlzdGljcyBmb3IgYSBnaXZlbiBkYXRhc2V0DQpjYWxjX3N0YXRzIDwtIGZ1bmN0aW9uKGRhdGEpIHsNCiAgaWYgKHN1bSghaXMubmEoZGF0YSkpIDwgMikgcmV0dXJuKHJlcChOQSwgbGVuZ3RoKHN0YXRpc3RpY19uYW1lcykpKSAgIyBIYW5kbGUgaW5zdWZmaWNpZW50IGRhdGENCg0KICBjb3VudF9vYnNlcnZhdGlvbnMgPC0gc3VtKCFpcy5uYShkYXRhKSkNCiAgbWVhbl92YWx1ZSA8LSByb3VuZChtZWFuKGRhdGEsIG5hLnJtID0gVFJVRSksIDIpDQogIG1lZGlhbl92YWx1ZSA8LSByb3VuZChtZWRpYW4oZGF0YSwgbmEucm0gPSBUUlVFKSwgMikNCiAgc2RfdmFsdWUgPC0gcm91bmQoc2QoZGF0YSwgbmEucm0gPSBUUlVFKSwgMikNCiAgbWluX2NhZ3JfcmFuZ2UgPC0gcm91bmQoY2Fncl92YWx1ZSAtIHNkX3ZhbHVlLCAyKQ0KICBtYXhfY2Fncl9yYW5nZSA8LSByb3VuZChjYWdyX3ZhbHVlICsgc2RfdmFsdWUsIDIpDQogIG1pbl92YWx1ZSA8LSByb3VuZChtaW4oZGF0YSwgbmEucm0gPSBUUlVFKSwgMikNCiAgbWF4X3ZhbHVlIDwtIHJvdW5kKG1heChkYXRhLCBuYS5ybSA9IFRSVUUpLCAyKQ0KICANCiAgIyBEZWZpbmUgaW5mbGF0aW9uIGFuZCBncm93dGggdGFyZ2V0cw0KICB0YXJnZXRfaW5mbGF0aW9uIDwtIDIgICMgRXhhbXBsZSB0YXJnZXQgZm9yIGluZmxhdGlvbg0KICB0YXJnZXRfY29uc2VydmF0aXZlIDwtIDMgKyB0YXJnZXRfaW5mbGF0aW9uDQogIHRhcmdldF9tb2RlcmF0ZSA8LSA1ICsgdGFyZ2V0X2luZmxhdGlvbg0KICB0YXJnZXRfYWdncmVzc2l2ZSA8LSAxMCArIHRhcmdldF9pbmZsYXRpb24NCiAgDQogIGFib3ZlX3RhcmdldF9pbmZsYXRpb24gPC0gc3VtKGRhdGEgPj0gdGFyZ2V0X2luZmxhdGlvbiwgbmEucm0gPSBUUlVFKQ0KICBhYm92ZV90YXJnZXRfY29uc2VydmF0aXZlIDwtIHN1bShkYXRhID49IHRhcmdldF9jb25zZXJ2YXRpdmUsIG5hLnJtID0gVFJVRSkNCiAgYWJvdmVfdGFyZ2V0X21vZGVyYXRlIDwtIHN1bShkYXRhID49IHRhcmdldF9tb2RlcmF0ZSwgbmEucm0gPSBUUlVFKQ0KICBhYm92ZV90YXJnZXRfYWdncmVzc2l2ZSA8LSBzdW0oZGF0YSA+PSB0YXJnZXRfYWdncmVzc2l2ZSwgbmEucm0gPSBUUlVFKQ0KICANCiAgcGVyY2VudF9hYm92ZV90YXJnZXRfY29uc2VydmF0aXZlIDwtIHJvdW5kKChhYm92ZV90YXJnZXRfY29uc2VydmF0aXZlIC8gY291bnRfb2JzZXJ2YXRpb25zKSAqIDEwMCwgMikNCiAgcGVyY2VudF9hYm92ZV90YXJnZXRfaW5mbGF0aW9uIDwtIHJvdW5kKChhYm92ZV90YXJnZXRfaW5mbGF0aW9uIC8gY291bnRfb2JzZXJ2YXRpb25zKSAqIDEwMCwgMikNCiAgcGVyY2VudF9hYm92ZV90YXJnZXRfbW9kZXJhdGUgPC0gcm91bmQoKGFib3ZlX3RhcmdldF9tb2RlcmF0ZSAvIGNvdW50X29ic2VydmF0aW9ucykgKiAxMDAsIDIpDQogIHBlcmNlbnRfYWJvdmVfdGFyZ2V0X2FnZ3Jlc3NpdmUgPC0gcm91bmQoKGFib3ZlX3RhcmdldF9hZ2dyZXNzaXZlIC8gY291bnRfb2JzZXJ2YXRpb25zKSAqIDEwMCwgMikNCiAgDQogIGMoDQogICAgY291bnRfb2JzZXJ2YXRpb25zLCANCiAgICBwYXN0ZTAobWVhbl92YWx1ZSwgIiUiKSwNCiAgICBwYXN0ZTAobWVkaWFuX3ZhbHVlLCAiJSIpLA0KICAgIHBhc3RlMChzZF92YWx1ZSwgIiUiKSwNCiAgICBwYXN0ZTAobWluX2NhZ3JfcmFuZ2UsICIlIiksDQogICAgcGFzdGUwKG1heF9jYWdyX3JhbmdlLCAiJSIpLA0KICAgIHBhc3RlMChtaW5fdmFsdWUsICIlIiksDQogICAgcGFzdGUwKG1heF92YWx1ZSwgIiUiKSwNCiAgICBwYXN0ZTAocGVyY2VudF9hYm92ZV90YXJnZXRfaW5mbGF0aW9uLCAiJSIpLA0KICAgIHBhc3RlMChwZXJjZW50X2Fib3ZlX3RhcmdldF9jb25zZXJ2YXRpdmUsICIlIiksIA0KICAgIHBhc3RlMChwZXJjZW50X2Fib3ZlX3RhcmdldF9tb2RlcmF0ZSwgIiUiKSwgDQogICAgcGFzdGUwKHBlcmNlbnRfYWJvdmVfdGFyZ2V0X2FnZ3Jlc3NpdmUsICIlIikNCiAgKQ0KfQ0KDQojIENvbHVtbnMgdG8gY2FsY3VsYXRlIENBR1Igc3RhdGlzdGljcw0KY2Fncl9jb2x1bW5zIDwtIGMoIjEtWWVhciBDQUdSIiwgIjUtWWVhciBDQUdSIiwgIjEwLVllYXIgQ0FHUiIsICIyMC1ZZWFyIENBR1IiLCAiMzAtWWVhciBDQUdSIikNCmV4aXN0aW5nX2NhZ3JfY29sdW1ucyA8LSBpbnRlcnNlY3QoY2Fncl9jb2x1bW5zLCBuYW1lcyhxcXFfcmF3X2NhZ3IpKQ0KDQojIENhbGN1bGF0ZSBzdGF0cyBmb3IgZWFjaCBDQUdSIGNvbHVtbg0KY2Fncl9zdGF0c19saXN0IDwtIGxhcHBseShxcXFfcmF3X2NhZ3JbZXhpc3RpbmdfY2Fncl9jb2x1bW5zXSwgY2FsY19zdGF0cykNCg0KIyBDb21waWxlIGludG8gYSBzdW1tYXJ5IGRhdGEgZnJhbWUNCnFxcV9yYXdfY2Fncl9zdW1tYXJ5IDwtIGFzLmRhdGEuZnJhbWUoZG8uY2FsbChjYmluZCwgY2Fncl9zdGF0c19saXN0KSkNCnJvd25hbWVzKHFxcV9yYXdfY2Fncl9zdW1tYXJ5KSA8LSBzdGF0aXN0aWNfbmFtZXMNCg0KDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KIyMgU0FWRSBWQUxVRVMgRk9SIElOLUxJTkUgQ09ERQ0KDQojIERlZmluZSB0aGUgbWFwcGluZyBvZiByb3cgbmFtZXMgdG8gdmFyaWFibGUgbmFtZXMNCnJvd190b192YXJfbmFtZSA8LSBjKA0KICAiQ291bnQgb2YgT2JzZXJ2YXRpb25zIiA9ICJjb3VudF9vYnNlcnZhdGlvbnMiLA0KICAiTWVhbiIgPSAibWVhbl92YWx1ZSIsDQogICJNZWRpYW4iID0gIm1lZGlhbl92YWx1ZSIsDQogICJTdGFuZGFyZCBEZXZpYXRpb24gKFZvbGF0aWxpdHkpIiA9ICJzZF92YWx1ZSIsDQogICJNaW4gQ0FHUiBSYW5nZSAoQ0FHUiAtIFNEKSIgPSAibWluX2NhZ3JfcmFuZ2UiLA0KICAiTWF4IENBR1IgUmFuZ2UgKENBR1IgKyBTRCkiID0gIm1heF9jYWdyX3JhbmdlIiwNCiAgIk1pbmltdW0iID0gIm1pbl92YWx1ZSIsDQogICJNYXhpbXVtIiA9ICJtYXhfdmFsdWUiLA0KICAiUGVyY2VudCBBYm92ZSBJbmZsYXRpb24gVGFyZ2V0IiA9ICJwZXJjZW50X2Fib3ZlX3RhcmdldF9pbmZsYXRpb24iLA0KICAiUGVyY2VudCBBYm92ZSBDb25zZXJ2YXRpdmUgVGFyZ2V0IiA9ICJwZXJjZW50X2Fib3ZlX3RhcmdldF9jb25zZXJ2YXRpdmUiLA0KICAiUGVyY2VudCBBYm92ZSBNb2RlcmF0ZSBUYXJnZXQiID0gInBlcmNlbnRfYWJvdmVfdGFyZ2V0X21vZGVyYXRlIiwNCiAgIlBlcmNlbnQgQWJvdmUgQWdncmVzc2l2ZSBUYXJnZXQiID0gInBlcmNlbnRfYWJvdmVfdGFyZ2V0X2FnZ3Jlc3NpdmUiDQopDQoNCiMgRnVuY3Rpb24gdG8gc2F2ZSBzdW1tYXJ5IHZhbHVlcyBkeW5hbWljYWxseQ0Kc2F2ZV9jb2x1bW5fdmFsdWVzIDwtIGZ1bmN0aW9uKHN1bW1hcnlfZGYpIHsNCiAgIyBFeGNsdWRlIHRoZSAiU3RhdGlzdGljIiBhbmQgIk92ZXJhbGwiIGNvbHVtbnMNCiAgY29sdW1uc190b19zYXZlIDwtIHNldGRpZmYobmFtZXMoc3VtbWFyeV9kZiksIGMoIlN0YXRpc3RpYyIsICJPdmVyYWxsIikpDQogIA0KICAjIEl0ZXJhdGUgb3ZlciBlYWNoIGNvbHVtbg0KICBmb3IgKGNvbCBpbiBjb2x1bW5zX3RvX3NhdmUpIHsNCiAgICAjIEZvcm1hdCBjb2x1bW4gbmFtZSB0byBsb3dlcmNhc2UgYW5kIHJlcGxhY2UgaW52YWxpZCBjaGFyYWN0ZXJzDQogICAgY29sX25hbWUgPC0gdG9sb3dlcihnc3ViKCJbXmEtekEtWjAtOV0iLCAiXyIsIGNvbCkpDQogICAgDQogICAgIyBFeHRyYWN0IHZhbHVlcyBmb3IgdGhlIGN1cnJlbnQgY29sdW1uDQogICAgY29sX3ZhbHVlcyA8LSBzdW1tYXJ5X2RmW1tjb2xdXQ0KICAgIA0KICAgICMgU2F2ZSBlYWNoIHZhbHVlIGR5bmFtaWNhbGx5IHVzaW5nIHRoZSBtYXBwaW5nIGZvciByb3cgbmFtZXMNCiAgICBmb3IgKGkgaW4gc2VxX2Fsb25nKGNvbF92YWx1ZXMpKSB7DQogICAgICAjIEdldCB0aGUgY29ycmVzcG9uZGluZyB2YXJpYWJsZSBuYW1lIGZyb20gdGhlIG1hcHBpbmcNCiAgICAgIHN0YXRfbmFtZSA8LSByb3dfdG9fdmFyX25hbWVbcm93bmFtZXMoc3VtbWFyeV9kZilbaV1dDQogICAgICANCiAgICAgIGlmICghaXMubmEoc3RhdF9uYW1lKSkgeyAgIyBTa2lwIGlmIG5vIG1hcHBpbmcgaXMgZGVmaW5lZA0KICAgICAgICAjIENyZWF0ZSB0aGUgdmFyaWFibGUgbmFtZQ0KICAgICAgICB2YXJfbmFtZSA8LSBwYXN0ZTAoc3RhdF9uYW1lLCAiXyIsIGNvbF9uYW1lKQ0KICAgICAgICANCiAgICAgICAgIyBBdHRlbXB0IG51bWVyaWMgY29udmVyc2lvbiBmb3IgZG93bnN0cmVhbSB1c2UNCiAgICAgICAgdmFsdWUgPC0gc3VwcHJlc3NXYXJuaW5ncyhhcy5udW1lcmljKGdzdWIoIiUiLCAiIiwgY29sX3ZhbHVlc1tpXSkpKQ0KICAgICAgICANCiAgICAgICAgIyBBc3NpZ24gdGhlIHZhbHVlIHRvIHRoZSBnbG9iYWwgZW52aXJvbm1lbnQNCiAgICAgICAgYXNzaWduKHZhcl9uYW1lLCB2YWx1ZSwgZW52aXIgPSAuR2xvYmFsRW52KQ0KICAgICAgfQ0KICAgIH0NCiAgfQ0KfQ0KDQojIEFwcGx5IHRoZSBmdW5jdGlvbiB0byBzYXZlIHZhbHVlcyBmb3IgYWxsIGNvbHVtbnMgZXhjZXB0ICJPdmVyYWxsIg0Kc2F2ZV9jb2x1bW5fdmFsdWVzKHFxcV9yYXdfY2Fncl9zdW1tYXJ5KQ0KDQojIEV4YW1wbGU6IEFjY2Vzc2luZyBkeW5hbWljYWxseSBjcmVhdGVkIHZhcmlhYmxlcw0KaW50ZXJhY3RpdmVfcHJpbnQobWVhbl92YWx1ZV8xX3llYXJfY2FncikgICMgU2hvdWxkIHByaW50IHRoZSBtZWFuIHZhbHVlIGZvciAxLVllYXIgQ0FHUg0KaW50ZXJhY3RpdmVfcHJpbnQocGVyY2VudF9hYm92ZV90YXJnZXRfaW5mbGF0aW9uXzVfeWVhcl9jYWdyKSAgIyBTaG91bGQgcHJpbnQgdGhlIHBlcmNlbnQgYWJvdmUgaW5mbGF0aW9uIHRhcmdldCBmb3IgNS1ZZWFyIENBR1INCmludGVyYWN0aXZlX3ByaW50KHNkX3ZhbHVlXzEwX3llYXJfY2FncikgICMgU2hvdWxkIHByaW50IHRoZSBzdGFuZGFyZCBkZXZpYXRpb24gZm9yIDEwLVllYXIgQ0FHUg0KDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KIyMgT1ZFUkFMTCBTVEFUSVNUSUNTIA0KbnVtZXJpY192YWx1ZXNfYWxsIDwtIGFzLm51bWVyaWModW5saXN0KHFxcV9yYXdfY2FncltleGlzdGluZ19jYWdyX2NvbHVtbnNdLCB1c2UubmFtZXMgPSBGQUxTRSkpDQpudW1lcmljX3ZhbHVlc19hbGwgPC0gbnVtZXJpY192YWx1ZXNfYWxsWyFpcy5uYShudW1lcmljX3ZhbHVlc19hbGwpXQ0KDQpvdmVyYWxsX2NvdW50X29ic2VydmF0aW9ucyA8LSBsZW5ndGgobnVtZXJpY192YWx1ZXNfYWxsKQ0Kb3ZlcmFsbF9tZWFuX3ZhbHVlIDwtIHJvdW5kKG1lYW4obnVtZXJpY192YWx1ZXNfYWxsKSwgMikNCm92ZXJhbGxfbWVkaWFuX3ZhbHVlIDwtIHJvdW5kKG1lZGlhbihudW1lcmljX3ZhbHVlc19hbGwpLCAyKQ0Kb3ZlcmFsbF9zZF92YWx1ZSA8LSByb3VuZChzZChudW1lcmljX3ZhbHVlc19hbGwpLCAyKQ0Kb3ZlcmFsbF9taW5fY2Fncl9yYW5nZSA8LSByb3VuZChjYWdyX3ZhbHVlIC0gb3ZlcmFsbF9zZF92YWx1ZSwgMikNCm92ZXJhbGxfbWF4X2NhZ3JfcmFuZ2UgPC0gcm91bmQoY2Fncl92YWx1ZSArIG92ZXJhbGxfc2RfdmFsdWUsIDIpDQpvdmVyYWxsX21pbl92YWx1ZSA8LSByb3VuZChtaW4obnVtZXJpY192YWx1ZXNfYWxsKSwgMikNCm92ZXJhbGxfbWF4X3ZhbHVlIDwtIHJvdW5kKG1heChudW1lcmljX3ZhbHVlc19hbGwpLCAyKQ0KDQpvdmVyYWxsX2Fib3ZlX3RhcmdldF9pbmZsYXRpb24gPC0gc3VtKG51bWVyaWNfdmFsdWVzX2FsbCA+PSB0YXJnZXRfaW5mbGF0aW9uLCBuYS5ybSA9IFRSVUUpDQpvdmVyYWxsX2Fib3ZlX3RhcmdldF9jb25zZXJ2YXRpdmUgPC0gc3VtKG51bWVyaWNfdmFsdWVzX2FsbCA+PSB0YXJnZXRfY29uc2VydmF0aXZlLCBuYS5ybSA9IFRSVUUpDQpvdmVyYWxsX2Fib3ZlX3RhcmdldF9tb2RlcmF0ZSA8LSBzdW0obnVtZXJpY192YWx1ZXNfYWxsID49IHRhcmdldF9tb2RlcmF0ZSwgbmEucm0gPSBUUlVFKQ0Kb3ZlcmFsbF9hYm92ZV90YXJnZXRfYWdncmVzc2l2ZSA8LSBzdW0obnVtZXJpY192YWx1ZXNfYWxsID49IHRhcmdldF9hZ2dyZXNzaXZlLCBuYS5ybSA9IFRSVUUpDQoNCm92ZXJhbGxfcGVyY2VudF9hYm92ZV90YXJnZXRfY29uc2VydmF0aXZlIDwtIHJvdW5kKChvdmVyYWxsX2Fib3ZlX3RhcmdldF9jb25zZXJ2YXRpdmUgLyBvdmVyYWxsX2NvdW50X29ic2VydmF0aW9ucykgKiAxMDAsIDIpDQpvdmVyYWxsX3BlcmNlbnRfYWJvdmVfdGFyZ2V0X2luZmxhdGlvbiA8LSByb3VuZCgob3ZlcmFsbF9hYm92ZV90YXJnZXRfaW5mbGF0aW9uIC8gb3ZlcmFsbF9jb3VudF9vYnNlcnZhdGlvbnMpICogMTAwLCAyKQ0Kb3ZlcmFsbF9wZXJjZW50X2Fib3ZlX3RhcmdldF9tb2RlcmF0ZSA8LSByb3VuZCgob3ZlcmFsbF9hYm92ZV90YXJnZXRfbW9kZXJhdGUgLyBvdmVyYWxsX2NvdW50X29ic2VydmF0aW9ucykgKiAxMDAsIDIpDQpvdmVyYWxsX3BlcmNlbnRfYWJvdmVfdGFyZ2V0X2FnZ3Jlc3NpdmUgPC0gcm91bmQoKG92ZXJhbGxfYWJvdmVfdGFyZ2V0X2FnZ3Jlc3NpdmUgLyBvdmVyYWxsX2NvdW50X29ic2VydmF0aW9ucykgKiAxMDAsIDIpDQoNCnFxcV9yYXdfY2Fncl9zdW1tYXJ5JE92ZXJhbGwgPC0gYygNCiAgb3ZlcmFsbF9jb3VudF9vYnNlcnZhdGlvbnMsDQogIHBhc3RlMChvdmVyYWxsX21lYW5fdmFsdWUsICIlIiksDQogIHBhc3RlMChvdmVyYWxsX21lZGlhbl92YWx1ZSwgIiUiKSwNCiAgcGFzdGUwKG92ZXJhbGxfc2RfdmFsdWUsICIlIiksDQogIHBhc3RlMChvdmVyYWxsX21pbl9jYWdyX3JhbmdlLCAiJSIpLA0KICBwYXN0ZTAob3ZlcmFsbF9tYXhfY2Fncl9yYW5nZSwgIiUiKSwNCiAgcGFzdGUwKG92ZXJhbGxfbWluX3ZhbHVlLCAiJSIpLA0KICBwYXN0ZTAob3ZlcmFsbF9tYXhfdmFsdWUsICIlIiksDQogIHBhc3RlMChvdmVyYWxsX3BlcmNlbnRfYWJvdmVfdGFyZ2V0X2luZmxhdGlvbiwgIiUiKSwNCiAgcGFzdGUwKG92ZXJhbGxfcGVyY2VudF9hYm92ZV90YXJnZXRfY29uc2VydmF0aXZlLCAiJSIpLA0KICBwYXN0ZTAob3ZlcmFsbF9wZXJjZW50X2Fib3ZlX3RhcmdldF9tb2RlcmF0ZSwgIiUiKSwNCiAgcGFzdGUwKG92ZXJhbGxfcGVyY2VudF9hYm92ZV90YXJnZXRfYWdncmVzc2l2ZSwgIiUiKQ0KKQ0KDQojIENvbnZlcnQgcm93IG5hbWVzIHRvIGEgY29sdW1uDQpxcXFfcmF3X2NhZ3Jfc3VtbWFyeSA8LSB0aWJibGU6OnJvd25hbWVzX3RvX2NvbHVtbihxcXFfcmF3X2NhZ3Jfc3VtbWFyeSwgdmFyID0gIlN0YXRpc3RpYyIpDQoNCiMgRW5zdXJlIGFsbCBjb2x1bW5zIGFyZSBjaGFyYWN0ZXINCnFxcV9yYXdfY2Fncl9zdW1tYXJ5IDwtIHFxcV9yYXdfY2Fncl9zdW1tYXJ5ICU+JQ0KICBtdXRhdGUoYWNyb3NzKGV2ZXJ5dGhpbmcoKSwgYXMuY2hhcmFjdGVyKSkNCg0KIyBEaXNwbGF5IHRoZSBzdW1tYXJ5IHRhYmxlDQpjYXQoIlxuIyMjIyBDb21wb3VuZCBBdmVyYWdlIEdyb3d0aCBSYXRlcyAoIiwgbWluX3llYXIsICItIiwgbWF4X3llYXIsICIpXG4iLCBzZXAgPSAiIikNCmludGVyYWN0aXZlX3N0cihxcXFfcmF3X2NhZ3Jfc3VtbWFyeSkNCmZvcm1hdF91bnNwZWNpZmllZF93aWR0aChxcXFfcmF3X2NhZ3Jfc3VtbWFyeSkNCg0KYGBgDQoNCioqYHIgbWluX3llYXJgLWByIG1heF95ZWFyYCBTdW1tYXJ5OioqIFRoZSAxLVllYXIgQ0FHUiBleGhpYml0cyB0aGUgYHIgaWYobWVhbl92YWx1ZV8xX3llYXJfY2FnciA9PSBtYXgoYyhtZWFuX3ZhbHVlXzFfeWVhcl9jYWdyLCBtZWFuX3ZhbHVlXzVfeWVhcl9jYWdyLCBtZWFuX3ZhbHVlXzEwX3llYXJfY2FnciwgbWVhbl92YWx1ZV8yMF95ZWFyX2NhZ3IpKSkgImhpZ2hlc3QgbWVhbiByZXR1cm4iIGVsc2UgaWYobWVhbl92YWx1ZV8xX3llYXJfY2FnciA9PSBtaW4oYyhtZWFuX3ZhbHVlXzFfeWVhcl9jYWdyLCBtZWFuX3ZhbHVlXzVfeWVhcl9jYWdyLCBtZWFuX3ZhbHVlXzEwX3llYXJfY2FnciwgbWVhbl92YWx1ZV8yMF95ZWFyX2NhZ3IpKSkgImxvd2VzdCBtZWFuIHJldHVybiIgZWxzZSAibWVhbiByZXR1cm4iYCBhdCBgciBtZWFuX3ZhbHVlXzFfeWVhcl9jYWdyYCUsIGFuZCBgciBpZihzZF92YWx1ZV8xX3llYXJfY2FnciA9PSBtYXgoYyhzZF92YWx1ZV8xX3llYXJfY2Fnciwgc2RfdmFsdWVfNV95ZWFyX2NhZ3IsIHNkX3ZhbHVlXzEwX3llYXJfY2Fnciwgc2RfdmFsdWVfMjBfeWVhcl9jYWdyKSkpICJ0aGUgZ3JlYXRlc3Qgdm9sYXRpbGl0eSB3aXRoIGEiIGVsc2UgaWYoc2RfdmFsdWVfMV95ZWFyX2NhZ3IgPT0gbWluKGMoc2RfdmFsdWVfMV95ZWFyX2NhZ3IsIHNkX3ZhbHVlXzVfeWVhcl9jYWdyLCBzZF92YWx1ZV8xMF95ZWFyX2NhZ3IsIHNkX3ZhbHVlXzIwX3llYXJfY2FncikpKSAidGhlIGxlYXN0IHZvbGF0aWxpdHkgd2l0aCBhIiBlbHNlICJhImAgc3RhbmRhcmQgZGV2aWF0aW9uIG9mIGByIHNkX3ZhbHVlXzFfeWVhcl9jYWdyYCUuIEFzIHRoZSBpbnZlc3RtZW50IGhvcml6b24gZXh0ZW5kcyB0byA1LCAxMCwgYW5kIDIwIHllYXJzLCB0aGUgbWVhbiByZXR1cm5zIGByIGlmKG1lYW5fdmFsdWVfMV95ZWFyX2NhZ3IgPCBtZWFuKGMobWVhbl92YWx1ZV81X3llYXJfY2FnciwgbWVhbl92YWx1ZV8xMF95ZWFyX2NhZ3IsIG1lYW5fdmFsdWVfMjBfeWVhcl9jYWdyKSkpICJpbmNyZWFzZSIgZWxzZSAiZGVjcmVhc2UiYCwgcmFuZ2luZyBmcm9tIGByIG1lYW5fdmFsdWVfNV95ZWFyX2NhZ3JgJSB0byBgciBtZWFuX3ZhbHVlXzIwX3llYXJfY2FncmAlLCB3aGlsZSB2b2xhdGlsaXR5IGByIGlmKHNkX3ZhbHVlXzFfeWVhcl9jYWdyIDwgbWVhbihjKHNkX3ZhbHVlXzVfeWVhcl9jYWdyLCBzZF92YWx1ZV8xMF95ZWFyX2NhZ3IsIHNkX3ZhbHVlXzIwX3llYXJfY2FncikpKSAicmlzZXMiIGVsc2UgImRpbWluaXNoZXMiYCwgd2l0aCBzdGFuZGFyZCBkZXZpYXRpb25zIGByIGlmKHNkX3ZhbHVlXzFfeWVhcl9jYWdyID4gc2RfdmFsdWVfMjBfeWVhcl9jYWdyKSAiZHJvcHBpbmciIGVsc2UgInJpc2luZyJgIGZyb20gYHIgc2RfdmFsdWVfNV95ZWFyX2NhZ3JgJSB0byBgciBzZF92YWx1ZV8yMF95ZWFyX2NhZ3JgJS4gVGhpcyB0cmVuZCBpbmRpY2F0ZXMgdGhhdCBsb25nZXIgaW52ZXN0bWVudCBwZXJpb2RzIHRlbmQgdG8gb2ZmZXIgYHIgaWYoc2RfdmFsdWVfMV95ZWFyX2NhZ3IgPiBzZF92YWx1ZV8yMF95ZWFyX2NhZ3IpICJtb3JlIHN0YWJsZSIgZWxzZSAibGVzcyBzdGFibGUiYCByZXR1cm5zLiBGdXJ0aGVybW9yZSwgdGhlIHBlcmNlbnRhZ2Ugb2YgcGVyaW9kcyBleGNlZWRpbmcgdGhlIGluZmxhdGlvbiB0YXJnZXQgYHIgaWYocGVyY2VudF9hYm92ZV90YXJnZXRfaW5mbGF0aW9uXzFfeWVhcl9jYWdyIDwgcGVyY2VudF9hYm92ZV90YXJnZXRfaW5mbGF0aW9uXzIwX3llYXJfY2FncikgImluY3JlYXNlcyIgZWxzZSAiZGVjcmVhc2VzImAgd2l0aCBsb25nZXIgZHVyYXRpb25zLCBmcm9tIGByIHBlcmNlbnRfYWJvdmVfdGFyZ2V0X2luZmxhdGlvbl8xX3llYXJfY2FncmAlIGluIHRoZSAxLVllYXIgQ0FHUiB0byBgciBwZXJjZW50X2Fib3ZlX3RhcmdldF9pbmZsYXRpb25fMjBfeWVhcl9jYWdyYCUgaW4gdGhlIDIwLVllYXIgQ0FHUiwgdW5kZXJzY29yaW5nIFFRUSdzIGByIGlmKHBlcmNlbnRfYWJvdmVfdGFyZ2V0X2luZmxhdGlvbl8xX3llYXJfY2FnciA8IHBlcmNlbnRfYWJvdmVfdGFyZ2V0X2luZmxhdGlvbl8yMF95ZWFyX2NhZ3IpICJlZmZlY3RpdmVuZXNzIiBlbHNlICJpbmVmZmVjdGl2ZW5lc3MiYCBhcyBhIGhlZGdlIGFnYWluc3QgaW5mbGF0aW9uIG92ZXIgZXh0ZW5kZWQgdGltZWZyYW1lcy4gV2l0aCBhbiBvdmVyYWxsIHBlcmNlbnRhZ2Ugb2YgYHIgb3ZlcmFsbF9wZXJjZW50X2Fib3ZlX3RhcmdldF9hZ2dyZXNzaXZlYCUgZXhjZWVkaW5nIHRoZSBhZ2dyZXNzaXZlIHRhcmdldCAoYHIgdGFyZ2V0X2FnZ3Jlc3NpdmVgJSBhbm51YWxpemVkIHJldHVybnMgd2l0aCBgciB0YXJnZXRfaW5mbGF0aW9uYCUgaW5mbGF0aW9uKSwgUVFRIGByIGlmKG92ZXJhbGxfcGVyY2VudF9hYm92ZV90YXJnZXRfYWdncmVzc2l2ZSA+IDUwKSAiaGFzLCBvdmVyIHRoaXMgdGltZSBwZXJpb2QsIHByb3ZlbiB0byBiZSBhIHN0cm9uZyIgZWxzZSBpZihvdmVyYWxsX3BlcmNlbnRfYWJvdmVfdGFyZ2V0X2FnZ3Jlc3NpdmUgPiA0MCkgImhhcywgb3ZlciB0aGlzIHRpbWUgcGVyaW9kLCBkZW1vbnN0cmF0ZWQgaXRzZWxmIGFzIGEgdmlhYmxlIiBlbHNlICJhcHBlYXJzLCBvdmVyIHRoaXMgdGltZSBwZXJpb2QsIHRvIGJlIGEgbGVzcyBzdWl0YWJsZSJgIG9wdGlvbiBmb3IgYSBoaWdoLXJldHVybmluZyBsb25nLXRlcm0gaW52ZXN0bWVudC4NCg0KIyMjIEdyYXBoDQoNCiMjIyMgQWxsIFBlcmlvZHMNCg0KDQpgYGB7ciBxcXFfcmF3X2NhZ3JfZ3JhcGhzX2FsbCwgZmlnLndpZHRoPTEwLCBmaWcuaGVpZ2h0PTcsIGV2YWw9VFJVRSwgZWNobz1GQUxTRX0NCg0KY2F0KCJcblxuIyMjIyBDb21wb3VuZCBBdmVyYWdlIEdyb3d0aCBSYXRlcyBBY3Jvc3MgUGVyaW9kcyBcbiIpDQoNCiMgTG9hZCBuZWNlc3NhcnkgbGlicmFyaWVzDQpsaWJyYXJ5KGdncGxvdDIpDQpsaWJyYXJ5KGRwbHlyKQ0KDQoNCiMgQ29udmVydCBjb2x1bW5zIHRvIG51bWVyaWMgZm9yIHBsb3R0aW5nIGlmIG5lZWRlZA0KcXFxX3Jhd19jYWdyIDwtIHFxcV9yYXdfY2FnciAlPiUNCiAgbXV0YXRlKA0KICAgIGBEYXRlYCA9IGFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKGBEYXRlYCkpLCAgIyBFbnN1cmUgRGF0ZSBpcyBudW1lcmljDQogICAgYDEtWWVhciBDQUdSYCA9IGFzLm51bWVyaWMoZ3N1YigiJSIsICIiLCBgMS1ZZWFyIENBR1JgKSksDQogICAgYDUtWWVhciBDQUdSYCA9IGFzLm51bWVyaWMoZ3N1YigiJSIsICIiLCBgNS1ZZWFyIENBR1JgKSksDQogICAgYDEwLVllYXIgQ0FHUmAgPSBhcy5udW1lcmljKGdzdWIoIiUiLCAiIiwgYDEwLVllYXIgQ0FHUmApKSwNCiAgICBgMjAtWWVhciBDQUdSYCA9IGFzLm51bWVyaWMoZ3N1YigiJSIsICIiLCBgMjAtWWVhciBDQUdSYCkpLA0KICAgIGAzMC1ZZWFyIENBR1JgID0gYXMubnVtZXJpYyhnc3ViKCIlIiwgIiIsIGAzMC1ZZWFyIENBR1JgKSkNCiAgKQ0KDQojIFJlc2hhcGUgdGhlIGRhdGEgaW50byBsb25nIGZvcm1hdCBmb3IgZWFzeSBwbG90dGluZyBvZiBtdWx0aXBsZSBsaW5lcyBhbmQgc2V0IHRoZSBmYWN0b3Igb3JkZXINCm5ydF9sb25nIDwtIHFxcV9yYXdfY2FnciAlPiUNCiAgcGl2b3RfbG9uZ2VyKGNvbHMgPSBjKGAxLVllYXIgQ0FHUmAsIGA1LVllYXIgQ0FHUmAsIGAxMC1ZZWFyIENBR1JgLCBgMjAtWWVhciBDQUdSYCwgYDMwLVllYXIgQ0FHUmApLA0KICAgICAgICAgICAgICAgbmFtZXNfdG8gPSAiQ0FHUl9QZXJpb2QiLA0KICAgICAgICAgICAgICAgdmFsdWVzX3RvID0gIkNBR1JfVmFsdWUiKSAlPiUNCiAgbXV0YXRlKENBR1JfUGVyaW9kID0gZmFjdG9yKENBR1JfUGVyaW9kLCBsZXZlbHMgPSBjKCIxLVllYXIgQ0FHUiIsICI1LVllYXIgQ0FHUiIsICIxMC1ZZWFyIENBR1IiLCAiMjAtWWVhciBDQUdSIiwgIjMwLVllYXIgQ0FHUiIpKSkNCg0KIyBBc3NpZ24gY29sb3JzIGR5bmFtaWNhbGx5IGJhc2VkIG9uIHRoZSBvcmRlciBvZiBDQUdSX1BlcmlvZCBpbiB0aGUgZGF0YQ0KIyBNYXRjaCB0aGUgdW5pcXVlIGxldmVscyBvZiBDQUdSX1BlcmlvZCB3aXRoIGNvbG9ycyBmcm9tIGNvbG9yc19nZW5lcmFsX2RhcmsNCnVuaXF1ZV90eXBlcyA8LSB1bmlxdWUobnJ0X2xvbmckQ0FHUl9QZXJpb2QpDQpjdXN0b21fY29sb3JzIDwtIHNldE5hbWVzKGNvbG9yc19nZW5lcmFsX2RhcmtbMTpsZW5ndGgodW5pcXVlX3R5cGVzKV0sIHVuaXF1ZV90eXBlcykNCg0KIyBGaW5kIHRoZSBtaW5pbXVtIGFuZCBtYXhpbXVtIHgtdmFsdWUgaW4geW91ciBkYXRhDQptYXhfeCA8LSBtYXgoYXMuaW50ZWdlcihxcXFfcmF3X2NhZ3IkRGF0ZSksIG5hLnJtID0gVFJVRSkNCm1pbl94IDwtIG1pbihhcy5pbnRlZ2VyKHFxcV9yYXdfY2FnciREYXRlKSwgbmEucm0gPSBUUlVFKQ0KaW50ZXJhY3RpdmVfcHJpbnQobWF4X3gpICAjIFRlc3QNCmludGVyYWN0aXZlX3ByaW50KG1pbl94KSAgIyBUZXN0DQoNCiMgRmluZCB0aGUgbWluaW11bSBhbmQgbWF4aW11bSB5ZWFyDQptaW5feWVhciA8LSBtaW4ocXFxX3Jhd19jYWdyJERhdGUsIG5hLnJtID0gVFJVRSkNCm1heF95ZWFyIDwtIG1heChxcXFfcmF3X2NhZ3IkRGF0ZSwgbmEucm0gPSBUUlVFKQ0KaW50ZXJhY3RpdmVfcHJpbnQobWluX3llYXIpDQppbnRlcmFjdGl2ZV9wcmludChtYXhfeWVhcikNCg0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiMjIFBMT1QgRlVMTCBXSVRIT1VUIExJTUlUUw0KDQojIERlZmluZSBzdGFydCBhbmQgZW5kIHllYXJzDQpzdGFydF95ZWFyIDwtIGFzLm51bWVyaWMobWluX3llYXIpDQplbmRfeWVhciA8LSAyMDI0DQp5ZWFyX3JhbmdlIDwtIGVuZF95ZWFyIC0gc3RhcnRfeWVhciArIDEgICMgQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgeWVhcnMNCg0KIyBEZWZpbmUgYnJlYWtzIHJvdW5kZWQgYXBwcm9wcmlhdGVseQ0KbGltaXRzX3N0YXJ0X3llYXIgPC0gZmxvb3Ioc3RhcnRfeWVhciAvIDUpICogNSAgIyBSb3VuZCBkb3duIHRvIHRoZSBuZWFyZXN0IG11bHRpcGxlIG9mIDUNCmxpbWl0c19lbmRfeWVhciA8LSBjZWlsaW5nKGVuZF95ZWFyIC8gNSkgKiA1ICAgIyBSb3VuZCB1cCB0byB0aGUgbmVhcmVzdCBtdWx0aXBsZSBvZiA1DQoNCiMgQ3JlYXRlIGR5bmFtaWMgdGl0bGUgYW5kIGNhcHRpb24NCmR5bmFtaWNfdGl0bGUgPC0gcGFzdGUwKCJSb2xsaW5nIENBR1JzIEFjcm9zcyBQZXJpb2RzIE92ZXIgIix5ZWFyX3JhbmdlLCAiIFllYXJzICgiLCBzdGFydF95ZWFyLCAiLSIsIGVuZF95ZWFyLCAiKSIpDQpkeW5hbWljX2NhcHRpb24gPC0gcGFzdGUwKCJRUVEgQ29tcG91bmQgQXZlcmFnZSBHcm93dGggUmF0ZXMgQWNyb3NzIFJvbGxpbmcgUGVyaW9kcywgRGF0YXNldCAoIiwgbWluX3llYXIsICItIiwgbWF4X3llYXIsICIpIikNCg0KIyBDcmVhdGUgdGhlIGZ1bGwsIG5vbi1maWx0ZXJlZCB4LWF4aXMgcGxvdCB3aXRoIGR5bmFtaWMgeCBwbGFjZW1lbnQgZm9yIGFubm90YXRpb25zDQpwMSA8LSBnZ3Bsb3QobnJ0X2xvbmcsIGFlcyh4ID0gYXMuaW50ZWdlcihEYXRlKSwgeSA9IENBR1JfVmFsdWUsIGNvbG9yID0gQ0FHUl9QZXJpb2QpKSArDQoNCiAgIyBBZGQgc2hhZGVkIGFyZWFzIGZvciBiYWNrZ3JvdW5kIGVmZmVjdA0KICBnZW9tX3JlY3QoYWVzKHhtaW4gPSAtSW5mLCB4bWF4ID0gSW5mLCB5bWluID0gdGFyZ2V0X2FnZ3Jlc3NpdmUsIHltYXggPSBJbmYpLCBmaWxsID0gImxpZ2h0Z3JlZW4iLCBhbHBoYSA9IDAuMDEwKSArDQogIGdlb21fcmVjdChhZXMoeG1pbiA9IC1JbmYsIHhtYXggPSBJbmYsIHltaW4gPSB0YXJnZXRfY29uc2VydmF0aXZlLCB5bWF4ID0gdGFyZ2V0X2FnZ3Jlc3NpdmUpLCBmaWxsID0gIm9yYW5nZSIsIGFscGhhID0gMC4wMSkgKw0KICBnZW9tX3JlY3QoYWVzKHhtaW4gPSAtSW5mLCB4bWF4ID0gSW5mLCB5bWluID0gLUluZiwgeW1heCA9IHRhcmdldF9jb25zZXJ2YXRpdmUpLCBmaWxsID0gImxpZ2h0Y29yYWwiLCBhbHBoYSA9IDAuMDEwKSArDQogIA0KICAjIFBsb3QgbGluZXMgZm9yIGVhY2ggQ0FHUiBQZXJpb2QNCiAgZ2VvbV9saW5lKHNpemUgPSAxLjAsIGFscGhhID0gMy4wKSArICAgICAgICMgTGluZSBmb3IgZWFjaCBDQUdSDQogIGdlb21fcG9pbnQoc2l6ZSA9IDEuMCwgYWxwaGEgPSAzLjApICsgICAgICAgIyBQb2ludHMgZm9yIGVhY2ggQ0FHUg0KICANCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gdGFyZ2V0X2FnZ3Jlc3NpdmUsIGNvbG9yID0gImRhcmtibHVlIiwgbGluZXR5cGUgPSAic29saWQiKSArDQogICMgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gdGFyZ2V0X21vZGVyYXRlLCBjb2xvciA9ICJkYXJrYmx1ZSIsIGxpbmV0eXBlID0gInNvbGlkIikgKw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSB0YXJnZXRfY29uc2VydmF0aXZlLCBjb2xvciA9ICJkYXJrYmx1ZSIsIGxpbmV0eXBlID0gInNvbGlkIikgKw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSB0YXJnZXRfaW5mbGF0aW9uLCBjb2xvciA9ICJkYXJrcmVkIiwgbGluZXR5cGUgPSAiZGFzaGVkIikgKw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSBjYWdyX3ZhbHVlLCBjb2xvciA9ICJkYXJrcmVkIiwgbGluZXR5cGUgPSAiZGFzaGVkIikgKw0KICANCiAgIyBEeW5hbWljIHJpZ2h0LWFsaWduZWQgcGxhY2VtZW50IGZvciBhbm5vdGF0aW9ucw0KICBhbm5vdGF0ZSgidGV4dCIsIHggPSBJbmYsIHkgPSB0YXJnZXRfYWdncmVzc2l2ZSwgbGFiZWwgPSAiQWdncmVzc2l2ZSIsIA0KICAgICAgICAgICBoanVzdCA9IDEsIHZqdXN0ID0gLTAuNTAsIGNvbG9yID0gImRhcmtibHVlIiwgc2l6ZSA9IDQpICsNCiAgIyBhbm5vdGF0ZSgidGV4dCIsIHggPSBJbmYsIHkgPSB0YXJnZXRfbW9kZXJhdGUsIGxhYmVsID0gIk1vZGVyYXRlIiwgDQogICMgICAgICAgICBoanVzdCA9IDEsIHZqdXN0ID0gLTAuNTAsIGNvbG9yID0gImRhcmtibHVlIiwgc2l6ZSA9IDQpICsNCiAgYW5ub3RhdGUoInRleHQiLCB4ID0gSW5mLCB5ID0gdGFyZ2V0X2NvbnNlcnZhdGl2ZSwgbGFiZWwgPSAiQ29uc2VydmF0aXZlIiwgDQogICAgICAgICAgIGhqdXN0ID0gMSwgdmp1c3QgPSArMS4xMCwgY29sb3IgPSAiZGFya2JsdWUiLCBzaXplID0gNCkgKw0KICBhbm5vdGF0ZSgidGV4dCIsIHggPSBJbmYsIHkgPSB0YXJnZXRfaW5mbGF0aW9uLCBsYWJlbCA9ICJJbmZsYXRpb24iLCANCiAgICAgICAgICAgaGp1c3QgPSAxLCB2anVzdCA9ICsxLjEwLCBjb2xvciA9ICJkYXJrcmVkIiwgc2l6ZSA9IDQpICsNCiAgYW5ub3RhdGUoInRleHQiLCB4ID0gSW5mLCB5ID0gY2Fncl92YWx1ZSwgbGFiZWwgPSAiQ0FHUiIsIA0KICAgICAgICAgICBoanVzdCA9IDEsIHZqdXN0ID0gLTAuNTAsIGNvbG9yID0gImRhcmtyZWQiLCBzaXplID0gNCkgKyANCg0KICBsYWJzKA0KICAgIHRpdGxlID0gZHluYW1pY190aXRsZSwNCiAgICB4ID0gIlllYXIiLA0KICAgIHkgPSAiQ0FHUiBWYWx1ZSAoJSkiLA0KICAgIGNvbG9yID0gIkNBR1IgUGVyaW9kIiwNCiAgICBjYXB0aW9uID0gZHluYW1pY19jYXB0aW9uDQogICAgKSArDQogIA0KICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gY3VzdG9tX2NvbG9ycykgKyAgIyBTZXQgY29sb3JzIGZvciBlYWNoIENBR1IgUGVyaW9kDQogIHNjYWxlX3hfY29udGludW91cygNCiAgICBsaW1pdHMgPSBjKHN0YXJ0X3llYXIsIGVuZF95ZWFyICsgMyksIA0KICAgIGJyZWFrcyA9IHNlcShsaW1pdHNfc3RhcnRfeWVhciwgbGltaXRzX2VuZF95ZWFyICwgNSkpICsgICMgUmVzdHJpY3QgJiBTZXQgTWFqb3IgeC1heGlzIGxpbmVzIGZvciBlYWNoIHllYXINCiAgDQogIHRoZW1lX21pbmltYWwoKSArDQogIHRoZW1lKA0KICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUsIHNpemUgPSAyMCksICAgICAgICAgIyBMYXJnZXIgdGl0bGUgZm9udA0KICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQpLCAgICAgICAgICAgICAgICAgICAgIyBMYXJnZXIgeC1heGlzIGxhYmVsIGZvbnQNCiAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0KSwgICAgICAgICAgICAgICAgICAgICMgTGFyZ2VyIHktYXhpcyBsYWJlbCBmb250DQogICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxLCBzaXplID0gMTQpLCAgIyBMYXJnZXIgeC1heGlzIHRleHQNCiAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQpLCAgICAgICAgICAgICAgICAgICAgICMgTGFyZ2VyIHktYXhpcyB0ZXh0DQogICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCksICAgICAgICAgICAgICAgICAgICAjIExlZ2VuZCB0aXRsZSBzaXplDQogICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyKSwgICAgICAgICAgICAgICAgICAgICAjIExlZ2VuZCB0ZXh0IHNpemUNCiAgICBwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9saW5lKGxpbmV0eXBlID0gImRvdHRlZCIsIGNvbG9yID0gImJsYWNrIiksICAjIE1ham9yIGdyaWQgbGluZXMNCiAgICBwYW5lbC5ncmlkLm1pbm9yLnggPSBlbGVtZW50X2JsYW5rKCksICAgICAgICAgICAgICAgICAgICAgICMgTm8gbWlub3IgeCBncmlkIGxpbmVzDQogICAgYXhpcy50aWNrcy5sZW5ndGggPSB1bml0KC0wLjI1LCAiY20iKSwgICAgICAgICAgICAgICAgICAgICAgIyBJbmNyZWFzZSB0aWNrIGxlbmd0aA0KICAgIGF4aXMudGlja3MgPSBlbGVtZW50X2xpbmUoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMC41MCksICAgIyBEYXJrZXIgdGlja3MNCiAgICBheGlzLmxpbmUueCA9IGVsZW1lbnRfbGluZShjb2xvciA9ICJibGFjayIsIHNpemUgPSAwLjc1KSwgICMgRGFyayBib3R0b20gYm9yZGVyDQogICAgYXhpcy5saW5lLnkgPSBlbGVtZW50X2xpbmUoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMC43NSkgICAjIERhcmsgbGVmdCBib3JkZXINCiAgKQ0KDQojIFByaW50IHRoZSBwbG90IA0KcHJpbnQocDEpDQoNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQojIyBQTE9UIFJFU1RSSUNURUQgV0lUSCBMSU1JVFMgDQoNCiMgRmlsdGVyIHRoZSBkYXRhIGZvciB0aGUgcmVzdHJpY3RlZCB4LWF4aXMgcmFuZ2UgKDIwMDUtMjAyNCkNCnJlc3RyaWN0ZWRfZGF0YSA8LSBucnRfbG9uZyAlPiUNCiAgZmlsdGVyKGFzLmludGVnZXIoRGF0ZSkgPj0gMjAwNSAmIGFzLmludGVnZXIoRGF0ZSkgPD0gMjAyNCkNCg0KIyBEZWZpbmUgc3RhcnQgYW5kIGVuZCB5ZWFycw0Kc3RhcnRfeWVhciA8LSAyMDA1DQplbmRfeWVhciA8LSAyMDI0DQp5ZWFyX3JhbmdlIDwtIGVuZF95ZWFyIC0gc3RhcnRfeWVhciArIDEgICMgQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgeWVhcnMNCg0KIyBEZWZpbmUgYnJlYWtzIHJvdW5kZWQgYXBwcm9wcmlhdGVseQ0KbGltaXRzX3N0YXJ0X3llYXIgPC0gZmxvb3Ioc3RhcnRfeWVhciAvIDUpICogNSAgIyBSb3VuZCBkb3duIHRvIHRoZSBuZWFyZXN0IG11bHRpcGxlIG9mIDUNCmxpbWl0c19lbmRfeWVhciA8LSBjZWlsaW5nKGVuZF95ZWFyIC8gNSkgKiA1ICAgIyBSb3VuZCB1cCB0byB0aGUgbmVhcmVzdCBtdWx0aXBsZSBvZiA1DQoNCiMgQ3JlYXRlIGR5bmFtaWMgdGl0bGUgYW5kIGNhcHRpb24NCmR5bmFtaWNfdGl0bGUgPC0gcGFzdGUwKCJSb2xsaW5nIENBR1JzIEFjcm9zcyBQZXJpb2RzIE92ZXIgIix5ZWFyX3JhbmdlLCAiIFllYXJzICgiLCBzdGFydF95ZWFyLCAiLSIsIGVuZF95ZWFyLCAiKSIpDQpkeW5hbWljX2NhcHRpb24gPC0gcGFzdGUwKCJRUVEgQ29tcG91bmQgQXZlcmFnZSBHcm93dGggUmF0ZXMgQWNyb3NzIFJvbGxpbmcgUGVyaW9kcywgRGF0YXNldCAoIiwgbWluX3llYXIsICItIiwgbWF4X3llYXIsICIpIikNCg0KIyBDYWxjdWxhdGUgZHluYW1pYyB5LWF4aXMgbGltaXRzIGZvciB0aGUgcmVzdHJpY3RlZCBkYXRhDQp5X21pbiA8LSBtaW4ocmVzdHJpY3RlZF9kYXRhJENBR1JfVmFsdWUsIG5hLnJtID0gVFJVRSkNCnlfbWF4IDwtIG1heChyZXN0cmljdGVkX2RhdGEkQ0FHUl9WYWx1ZSwgbmEucm0gPSBUUlVFKQ0KDQojIENyZWF0ZSB0aGUgZmlsdGVyZWQsIHJlc3RyaWN0ZWQgeC1heGlzIHBsb3Qgd2l0aCBkeW5hbWljIHggcGxhY2VtZW50IGZvciBhbm5vdGF0aW9ucw0KcDMgPC0gZ2dwbG90KG5ydF9sb25nLCBhZXMoeCA9IGFzLmludGVnZXIoRGF0ZSksIHkgPSBDQUdSX1ZhbHVlLCBjb2xvciA9IENBR1JfUGVyaW9kKSkgKw0KDQogICMgQWRkIHNoYWRlZCBhcmVhcyBmb3IgYmFja2dyb3VuZCBlZmZlY3QNCiAgZ2VvbV9yZWN0KGFlcyh4bWluID0gLUluZiwgeG1heCA9IEluZiwgeW1pbiA9IHRhcmdldF9hZ2dyZXNzaXZlLCB5bWF4ID0gSW5mKSwgZmlsbCA9ICJsaWdodGdyZWVuIiwgYWxwaGEgPSAwLjAxMCkgKw0KICBnZW9tX3JlY3QoYWVzKHhtaW4gPSAtSW5mLCB4bWF4ID0gSW5mLCB5bWluID0gdGFyZ2V0X2NvbnNlcnZhdGl2ZSwgeW1heCA9IHRhcmdldF9hZ2dyZXNzaXZlKSwgZmlsbCA9ICJvcmFuZ2UiLCBhbHBoYSA9IDAuMDEpICsNCiAgZ2VvbV9yZWN0KGFlcyh4bWluID0gLUluZiwgeG1heCA9IEluZiwgeW1pbiA9IC1JbmYsIHltYXggPSB0YXJnZXRfY29uc2VydmF0aXZlKSwgZmlsbCA9ICJsaWdodGNvcmFsIiwgYWxwaGEgPSAwLjAxMCkgKw0KICANCiAgIyBQbG90IGxpbmVzIGZvciBlYWNoIENBR1IgUGVyaW9kDQogIGdlb21fbGluZShzaXplID0gMS4wLCBhbHBoYSA9IDMuMCkgKyAgICAgICAjIExpbmUgZm9yIGVhY2ggQ0FHUg0KICBnZW9tX3BvaW50KHNpemUgPSAxLjAsIGFscGhhID0gMy4wKSArICAgICAgICMgUG9pbnRzIGZvciBlYWNoIENBR1INCg0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSB0YXJnZXRfYWdncmVzc2l2ZSwgY29sb3IgPSAiZGFya2JsdWUiLCBsaW5ldHlwZSA9ICJzb2xpZCIpICsNCiAgIyBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSB0YXJnZXRfbW9kZXJhdGUsIGNvbG9yID0gImRhcmtibHVlIiwgbGluZXR5cGUgPSAic29saWQiKSArDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IHRhcmdldF9jb25zZXJ2YXRpdmUsIGNvbG9yID0gImRhcmtibHVlIiwgbGluZXR5cGUgPSAic29saWQiKSArDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IHRhcmdldF9pbmZsYXRpb24sIGNvbG9yID0gImRhcmtyZWQiLCBsaW5ldHlwZSA9ICJkYXNoZWQiKSArDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IGNhZ3JfdmFsdWUsIGNvbG9yID0gImRhcmtyZWQiLCBsaW5ldHlwZSA9ICJkYXNoZWQiKSArDQogIA0KICAjIER5bmFtaWMgcmlnaHQtYWxpZ25lZCBwbGFjZW1lbnQgZm9yIGFubm90YXRpb25zDQogIGFubm90YXRlKCJ0ZXh0IiwgeCA9IEluZiwgeSA9IHRhcmdldF9hZ2dyZXNzaXZlLCBsYWJlbCA9ICJBZ2dyZXNzaXZlIiwgDQogICAgICAgICAgIGhqdXN0ID0gMSwgdmp1c3QgPSAtMC41MCwgY29sb3IgPSAiZGFya2JsdWUiLCBzaXplID0gNCkgKw0KICAjIGFubm90YXRlKCJ0ZXh0IiwgeCA9IEluZiwgeSA9IHRhcmdldF9tb2RlcmF0ZSwgbGFiZWwgPSAiTW9kZXJhdGUiLCANCiAgIyAgICAgICAgIGhqdXN0ID0gMSwgdmp1c3QgPSAtMC41MCwgY29sb3IgPSAiZGFya2JsdWUiLCBzaXplID0gNCkgKw0KICBhbm5vdGF0ZSgidGV4dCIsIHggPSBJbmYsIHkgPSB0YXJnZXRfY29uc2VydmF0aXZlLCBsYWJlbCA9ICJDb25zZXJ2YXRpdmUiLCANCiAgICAgICAgICAgaGp1c3QgPSAxLCB2anVzdCA9ICsxLjEwLCBjb2xvciA9ICJkYXJrYmx1ZSIsIHNpemUgPSA0KSArDQogIGFubm90YXRlKCJ0ZXh0IiwgeCA9IEluZiwgeSA9IHRhcmdldF9pbmZsYXRpb24sIGxhYmVsID0gIkluZmxhdGlvbiIsIA0KICAgICAgICAgICBoanVzdCA9IDEsIHZqdXN0ID0gKzEuMTAsIGNvbG9yID0gImRhcmtyZWQiLCBzaXplID0gNCkgKw0KICBhbm5vdGF0ZSgidGV4dCIsIHggPSBJbmYsIHkgPSBjYWdyX3ZhbHVlLCBsYWJlbCA9ICJDQUdSIiwgDQogICAgICAgICAgIGhqdXN0ID0gMSwgdmp1c3QgPSAtMC41MCwgY29sb3IgPSAiZGFya3JlZCIsIHNpemUgPSA0KSArIA0KDQogIGxhYnMoDQogICAgdGl0bGUgPSBkeW5hbWljX3RpdGxlLA0KICAgIHggPSAiWWVhciIsDQogICAgeSA9ICJDQUdSIFZhbHVlICglKSIsDQogICAgY29sb3IgPSAiQ0FHUiBQZXJpb2QiLA0KICAgIGNhcHRpb24gPSBkeW5hbWljX2NhcHRpb24NCiAgICApICsNCiAgDQogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjdXN0b21fY29sb3JzKSArICAjIFNldCBjb2xvcnMgZm9yIGVhY2ggQ0FHUiBQZXJpb2QNCiAgY29vcmRfY2FydGVzaWFuKHlsaW0gPSBjKHlfbWluLCB5X21heCkpICsgIyBBcHBseSBkeW5hbWljIHktYXhpcyBsaW1pdHMNCiAgc2NhbGVfeF9jb250aW51b3VzKA0KICAgIGxpbWl0cyA9IGMoc3RhcnRfeWVhciwgZW5kX3llYXIgKyAyICsgMSksIA0KICAgIGJyZWFrcyA9IHNlcShsaW1pdHNfc3RhcnRfeWVhciwgbGltaXRzX2VuZF95ZWFyLCA1KQ0KICApICsgICMgUmVzdHJpY3QgJiBTZXQgTWFqb3IgeC1heGlzIGxpbmVzIGZvciBlYWNoIHllYXINCg0KICB0aGVtZV9taW5pbWFsKCkgKw0KICB0aGVtZSgNCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41LCBzaXplID0gMjApLCAgICAgICAgICMgTGFyZ2VyIHRpdGxlIGZvbnQNCiAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0KSwgICAgICAgICAgICAgICAgICAgICMgTGFyZ2VyIHgtYXhpcyBsYWJlbCBmb250DQogICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCksICAgICAgICAgICAgICAgICAgICAjIExhcmdlciB5LWF4aXMgbGFiZWwgZm9udA0KICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSwgc2l6ZSA9IDE0KSwgICMgTGFyZ2VyIHgtYXhpcyB0ZXh0DQogICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0KSwgICAgICAgICAgICAgICAgICAgICAjIExhcmdlciB5LWF4aXMgdGV4dA0KICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQpLCAgICAgICAgICAgICAgICAgICAgIyBMZWdlbmQgdGl0bGUgc2l6ZQ0KICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiksICAgICAgICAgICAgICAgICAgICAgIyBMZWdlbmQgdGV4dCBzaXplDQogICAgcGFuZWwuZ3JpZC5tYWpvciA9IGVsZW1lbnRfbGluZShsaW5ldHlwZSA9ICJkb3R0ZWQiLCBjb2xvciA9ICJibGFjayIpLCAgIyBNYWpvciBncmlkIGxpbmVzDQogICAgcGFuZWwuZ3JpZC5taW5vci54ID0gZWxlbWVudF9ibGFuaygpLCAgICAgICAgICAgICAgICAgICAgICAjIE5vIG1pbm9yIHggZ3JpZCBsaW5lcw0KICAgIGF4aXMudGlja3MubGVuZ3RoID0gdW5pdCgtMC4yNSwgImNtIiksICAgICAgICAgICAgICAgICAgICAgICMgSW5jcmVhc2UgdGljayBsZW5ndGgNCiAgICBheGlzLnRpY2tzID0gZWxlbWVudF9saW5lKGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDAuNTApLCAgICMgRGFya2VyIHRpY2tzDQogICAgYXhpcy5saW5lLnggPSBlbGVtZW50X2xpbmUoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMC43NSksICAjIERhcmsgYm90dG9tIGJvcmRlcg0KICAgIGF4aXMubGluZS55ID0gZWxlbWVudF9saW5lKGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDAuNzUpICAgIyBEYXJrIGxlZnQgYm9yZGVyDQogICkNCg0KIyBQcmludCB0aGUgcGxvdCANCnByaW50KHAzKQ0KDQpgYGANCg0KIyMjIyBTaG9ydC1UZXJtDQoNCmBgYHtyIHFxcV9yYXdfY2Fncl9ncmFwaHNfc2hvcnQsIGZpZy53aWR0aD0xMCwgZmlnLmhlaWdodD03fQ0KDQpjYXQoIlxuXG4jIyMjIENvbXBvdW5kIEF2ZXJhZ2UgR3Jvd3RoIFJhdGVzIEFjcm9zcyBTaG9ydC1UZXJtIFJvbGxpbmcgUGVyaW9kcyBcbiIpDQoNCiMgRmlsdGVyIGRhdGEgZm9yIFNob3J0LVRlcm0gQ0FHUiAoNS1ZZWFyIGFuZCAxMC1ZZWFyKQ0Kc2hvcnR0ZXJtX2RhdGEgPC0gbnJ0X2xvbmcgJT4lDQogIGZpbHRlcihDQUdSX1BlcmlvZCAlaW4lIGMoIjUtWWVhciBDQUdSIiwgIjEwLVllYXIgQ0FHUiIpKQ0KDQoNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQojIyBQTE9UIEZVTEwgV0lUSE9VVCBMSU1JVFMNCg0KIyBEZWZpbmUgc3RhcnQgYW5kIGVuZCB5ZWFycw0Kc3RhcnRfeWVhciA8LSAyMDA1DQplbmRfeWVhciA8LSAyMDI0DQp5ZWFyX3JhbmdlIDwtIGVuZF95ZWFyIC0gc3RhcnRfeWVhciArIDEgICMgQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgeWVhcnMNCg0KIyBEZWZpbmUgYnJlYWtzIHJvdW5kZWQgYXBwcm9wcmlhdGVseQ0KbGltaXRzX3N0YXJ0X3llYXIgPC0gZmxvb3Ioc3RhcnRfeWVhciAvIDUpICogNSAgIyBSb3VuZCBkb3duIHRvIHRoZSBuZWFyZXN0IG11bHRpcGxlIG9mIDUNCmxpbWl0c19lbmRfeWVhciA8LSBjZWlsaW5nKGVuZF95ZWFyIC8gNSkgKiA1ICAgIyBSb3VuZCB1cCB0byB0aGUgbmVhcmVzdCBtdWx0aXBsZSBvZiA1DQoNCiMgQ3JlYXRlIGR5bmFtaWMgdGl0bGUgYW5kIGNhcHRpb24NCmR5bmFtaWNfdGl0bGUgPC0gcGFzdGUwKCJDQUdSIEFjcm9zcyBTaG9ydC1UZXJtIFBlcmlvZHMgT3ZlciAiLHllYXJfcmFuZ2UsICIgWWVhcnMgKCIsIHN0YXJ0X3llYXIsICItIiwgZW5kX3llYXIsICIpIikNCmR5bmFtaWNfY2FwdGlvbiA8LSBwYXN0ZTAoIlFRUSBDb21wb3VuZCBBdmVyYWdlIEdyb3d0aCBSYXRlcyBBY3Jvc3MgU2hvcnQtVGVybSBSb2xsaW5nIFBlcmlvZHMsIERhdGFzZXQgKCIsIG1pbl95ZWFyLCAiLSIsIG1heF95ZWFyLCAiKSIpDQoNCiMgQ3JlYXRlIHRoZSBmdWxsLCBub24tZmlsdGVyZWQgeC1heGlzIHBsb3Qgd2l0aCBkeW5hbWljIHggcGxhY2VtZW50IGZvciBhbm5vdGF0aW9ucw0KcDFfc2hvcnR0ZXJtIDwtIGdncGxvdChzaG9ydHRlcm1fZGF0YSwgYWVzKHggPSBhcy5pbnRlZ2VyKERhdGUpLCB5ID0gQ0FHUl9WYWx1ZSwgY29sb3IgPSBDQUdSX1BlcmlvZCkpICsNCg0KICAjIEFkZCBzaGFkZWQgYXJlYXMgZm9yIGJhY2tncm91bmQgZWZmZWN0DQogIGdlb21fcmVjdChhZXMoeG1pbiA9IC1JbmYsIHhtYXggPSBJbmYsIHltaW4gPSB0YXJnZXRfYWdncmVzc2l2ZSwgeW1heCA9IEluZiksIGZpbGwgPSAibGlnaHRncmVlbiIsIGFscGhhID0gMC4wMTApICsNCiAgZ2VvbV9yZWN0KGFlcyh4bWluID0gLUluZiwgeG1heCA9IEluZiwgeW1pbiA9IHRhcmdldF9jb25zZXJ2YXRpdmUsIHltYXggPSB0YXJnZXRfYWdncmVzc2l2ZSksIGZpbGwgPSAib3JhbmdlIiwgYWxwaGEgPSAwLjAxKSArDQogIGdlb21fcmVjdChhZXMoeG1pbiA9IC1JbmYsIHhtYXggPSBJbmYsIHltaW4gPSAtSW5mLCB5bWF4ID0gdGFyZ2V0X2NvbnNlcnZhdGl2ZSksIGZpbGwgPSAibGlnaHRjb3JhbCIsIGFscGhhID0gMC4wMTApICsNCiAgDQogICMgUGxvdCBsaW5lcyBmb3IgZWFjaCBDQUdSIFBlcmlvZA0KICBnZW9tX2xpbmUoc2l6ZSA9IDEuMCwgYWxwaGEgPSAzLjApICsgICAgICAgIyBMaW5lIGZvciBlYWNoIENBR1INCiAgZ2VvbV9wb2ludChzaXplID0gMS4wLCBhbHBoYSA9IDMuMCkgKyAgICAgICAjIFBvaW50cyBmb3IgZWFjaCBDQUdSDQoNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gdGFyZ2V0X2FnZ3Jlc3NpdmUsIGNvbG9yID0gImRhcmtibHVlIiwgbGluZXR5cGUgPSAic29saWQiKSArDQogICMgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gdGFyZ2V0X21vZGVyYXRlLCBjb2xvciA9ICJkYXJrYmx1ZSIsIGxpbmV0eXBlID0gInNvbGlkIikgKw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSB0YXJnZXRfY29uc2VydmF0aXZlLCBjb2xvciA9ICJkYXJrYmx1ZSIsIGxpbmV0eXBlID0gInNvbGlkIikgKw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSB0YXJnZXRfaW5mbGF0aW9uLCBjb2xvciA9ICJkYXJrcmVkIiwgbGluZXR5cGUgPSAiZGFzaGVkIikgKw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSBjYWdyX3ZhbHVlLCBjb2xvciA9ICJkYXJrcmVkIiwgbGluZXR5cGUgPSAiZGFzaGVkIikgKw0KICANCiAgIyBEeW5hbWljIHJpZ2h0LWFsaWduZWQgcGxhY2VtZW50IGZvciBhbm5vdGF0aW9ucw0KICBhbm5vdGF0ZSgidGV4dCIsIHggPSBJbmYsIHkgPSB0YXJnZXRfYWdncmVzc2l2ZSwgbGFiZWwgPSAiQWdncmVzc2l2ZSIsIA0KICAgICAgICAgICBoanVzdCA9IDEsIHZqdXN0ID0gLTAuNTAsIGNvbG9yID0gImRhcmtibHVlIiwgc2l6ZSA9IDQpICsNCiAgIyBhbm5vdGF0ZSgidGV4dCIsIHggPSBJbmYsIHkgPSB0YXJnZXRfbW9kZXJhdGUsIGxhYmVsID0gIk1vZGVyYXRlIiwgDQogICMgICAgICAgICBoanVzdCA9IDEsIHZqdXN0ID0gLTAuNTAsIGNvbG9yID0gImRhcmtibHVlIiwgc2l6ZSA9IDQpICsNCiAgYW5ub3RhdGUoInRleHQiLCB4ID0gSW5mLCB5ID0gdGFyZ2V0X2NvbnNlcnZhdGl2ZSwgbGFiZWwgPSAiQ29uc2VydmF0aXZlIiwgDQogICAgICAgICAgIGhqdXN0ID0gMSwgdmp1c3QgPSArMS4zMCwgY29sb3IgPSAiZGFya2JsdWUiLCBzaXplID0gNCkgKw0KICBhbm5vdGF0ZSgidGV4dCIsIHggPSBJbmYsIHkgPSB0YXJnZXRfaW5mbGF0aW9uLCBsYWJlbCA9ICJJbmZsYXRpb24iLCANCiAgICAgICAgICAgaGp1c3QgPSAxLCB2anVzdCA9ICsxLjMwLCBjb2xvciA9ICJkYXJrcmVkIiwgc2l6ZSA9IDQpICsNCiAgYW5ub3RhdGUoInRleHQiLCB4ID0gSW5mLCB5ID0gY2Fncl92YWx1ZSwgbGFiZWwgPSAiQ0FHUiIsIA0KICAgICAgICAgICBoanVzdCA9IDEsIHZqdXN0ID0gLTAuNTAsIGNvbG9yID0gImRhcmtyZWQiLCBzaXplID0gNCkgKyANCg0KICBsYWJzKA0KICAgIHRpdGxlID0gZHluYW1pY190aXRsZSwNCiAgICB4ID0gIlllYXIiLA0KICAgIHkgPSAiQ0FHUiBWYWx1ZSAoJSkiLA0KICAgIGNvbG9yID0gIkNBR1IgUGVyaW9kIiwNCiAgICBjYXB0aW9uID0gZHluYW1pY19jYXB0aW9uDQogICAgKSArDQogIA0KICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gY3VzdG9tX2NvbG9yc1tjKCI1LVllYXIgQ0FHUiIsICIxMC1ZZWFyIENBR1IiKV0pICsNCiAgc2NhbGVfeF9jb250aW51b3VzKA0KICAgIGxpbWl0cyA9IGMoc3RhcnRfeWVhciwgZW5kX3llYXIgKyAxKSwgDQogICAgYnJlYWtzID0gc2VxKGxpbWl0c19zdGFydF95ZWFyLCBsaW1pdHNfZW5kX3llYXIgKyAxICwgNSkNCiAgKSArICAjIFJlc3RyaWN0ICYgU2V0IE1ham9yIHgtYXhpcyBsaW5lcyBmb3IgZWFjaCB5ZWFyDQoNCiAgdGhlbWVfbWluaW1hbCgpICsNCiAgdGhlbWUoDQogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSwgc2l6ZSA9IDIwKSwgICAgICAgICAjIExhcmdlciB0aXRsZSBmb250DQogICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCksICAgICAgICAgICAgICAgICAgICAjIExhcmdlciB4LWF4aXMgbGFiZWwgZm9udA0KICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQpLCAgICAgICAgICAgICAgICAgICAgIyBMYXJnZXIgeS1heGlzIGxhYmVsIGZvbnQNCiAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEsIHNpemUgPSAxNCksICAjIExhcmdlciB4LWF4aXMgdGV4dA0KICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCksICAgICAgICAgICAgICAgICAgICAgIyBMYXJnZXIgeS1heGlzIHRleHQNCiAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0KSwgICAgICAgICAgICAgICAgICAgICMgTGVnZW5kIHRpdGxlIHNpemUNCiAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIpLCAgICAgICAgICAgICAgICAgICAgICMgTGVnZW5kIHRleHQgc2l6ZQ0KICAgIHBhbmVsLmdyaWQubWFqb3IgPSBlbGVtZW50X2xpbmUobGluZXR5cGUgPSAiZG90dGVkIiwgY29sb3IgPSAiYmxhY2siKSwgICMgTWFqb3IgZ3JpZCBsaW5lcw0KICAgIHBhbmVsLmdyaWQubWlub3IueCA9IGVsZW1lbnRfYmxhbmsoKSwgICAgICAgICAgICAgICAgICAgICAgIyBObyBtaW5vciB4IGdyaWQgbGluZXMNCiAgICBheGlzLnRpY2tzLmxlbmd0aCA9IHVuaXQoLTAuMjUsICJjbSIpLCAgICAgICAgICAgICAgICAgICAgICAjIEluY3JlYXNlIHRpY2sgbGVuZ3RoDQogICAgYXhpcy50aWNrcyA9IGVsZW1lbnRfbGluZShjb2xvciA9ICJibGFjayIsIHNpemUgPSAwLjUwKSwgICAjIERhcmtlciB0aWNrcw0KICAgIGF4aXMubGluZS54ID0gZWxlbWVudF9saW5lKGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDAuNzUpLCAgIyBEYXJrIGJvdHRvbSBib3JkZXINCiAgICBheGlzLmxpbmUueSA9IGVsZW1lbnRfbGluZShjb2xvciA9ICJibGFjayIsIHNpemUgPSAwLjc1KSAgICMgRGFyayBsZWZ0IGJvcmRlcg0KICApDQoNCiMgUHJpbnQgdGhlIHBsb3QgDQpwcmludChwMV9zaG9ydHRlcm0pDQoNCmBgYA0KDQoNCg0KIyMjIyBMb25nLVRlcm0NCg0KYGBge3IgcXFxX3Jhd19jYWdyX2dyYXBoc19sb25nLCBmaWcud2lkdGg9MTAsIGZpZy5oZWlnaHQ9N30NCg0KY2F0KCJcblxuIyMjIyBDb21wb3VuZCBBdmVyYWdlIEdyb3d0aCBSYXRlcyBBY3Jvc3MgTG9uZy1UZXJtIFJvbGxpbmcgUGVyaW9kcyBcbiIpDQoNCiMgRmlsdGVyIGRhdGEgZm9yIExvbmctVGVybSBDQUdSICgyMC1ZZWFyIGFuZCAzMC1ZZWFyKQ0KbG9uZ3Rlcm1fZGF0YSA8LSBucnRfbG9uZyAlPiUNCiAgZmlsdGVyKENBR1JfUGVyaW9kICVpbiUgYygiMjAtWWVhciBDQUdSIiwgIjMwLVllYXIgQ0FHUiIpKQ0KDQoNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQojIyBQTE9UIEZVTEwgV0lUSE9VVCBMSU1JVFMNCg0KIyBEZWZpbmUgc3RhcnQgYW5kIGVuZCB5ZWFycw0Kc3RhcnRfeWVhciA8LSAyMDIwDQplbmRfeWVhciA8LSAyMDI0DQp5ZWFyX3JhbmdlIDwtIGVuZF95ZWFyIC0gc3RhcnRfeWVhciArIDEgICMgQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgeWVhcnMNCg0KIyBEZWZpbmUgYnJlYWtzIHJvdW5kZWQgYXBwcm9wcmlhdGVseQ0KbGltaXRzX3N0YXJ0X3llYXIgPC0gZmxvb3Ioc3RhcnRfeWVhciAvIDUpICogNSAgIyBSb3VuZCBkb3duIHRvIHRoZSBuZWFyZXN0IG11bHRpcGxlIG9mIDUNCmxpbWl0c19lbmRfeWVhciA8LSBjZWlsaW5nKGVuZF95ZWFyIC8gNSkgKiA1ICAgIyBSb3VuZCB1cCB0byB0aGUgbmVhcmVzdCBtdWx0aXBsZSBvZiA1DQoNCiMgQ3JlYXRlIGR5bmFtaWMgdGl0bGUgYW5kIGNhcHRpb24NCmR5bmFtaWNfdGl0bGUgPC0gcGFzdGUwKCJDQUdSIEFjcm9zcyBMb25nLVRlcm0gUGVyaW9kcyBPdmVyICIseWVhcl9yYW5nZSwgIiBZZWFycyAoIiwgc3RhcnRfeWVhciwgIi0iLCBlbmRfeWVhciwgIikiKQ0KZHluYW1pY19jYXB0aW9uIDwtIHBhc3RlMCgiUVFRIENvbXBvdW5kIEF2ZXJhZ2UgR3Jvd3RoIFJhdGVzIEFjcm9zcyBMb25nLVRlcm0gUm9sbGluZyBQZXJpb2RzLCBEYXRhc2V0ICgiLCBtaW5feWVhciwgIi0iLCBtYXhfeWVhciwgIikiKQ0KDQojIENyZWF0ZSB0aGUgZnVsbCwgbm9uLWZpbHRlcmVkIHgtYXhpcyBwbG90IHdpdGggZHluYW1pYyB4IHBsYWNlbWVudCBmb3IgYW5ub3RhdGlvbnMNCnAxX2xvbmd0ZXJtIDwtIGdncGxvdChsb25ndGVybV9kYXRhLCBhZXMoeCA9IGFzLmludGVnZXIoRGF0ZSksIHkgPSBDQUdSX1ZhbHVlLCBjb2xvciA9IENBR1JfUGVyaW9kKSkgKw0KDQogICMgQWRkIHNoYWRlZCBhcmVhcyBmb3IgYmFja2dyb3VuZCBlZmZlY3QNCiAgZ2VvbV9yZWN0KGFlcyh4bWluID0gLUluZiwgeG1heCA9IEluZiwgeW1pbiA9IHRhcmdldF9hZ2dyZXNzaXZlLCB5bWF4ID0gSW5mKSwgZmlsbCA9ICJsaWdodGdyZWVuIiwgYWxwaGEgPSAwLjAxMCkgKw0KICBnZW9tX3JlY3QoYWVzKHhtaW4gPSAtSW5mLCB4bWF4ID0gSW5mLCB5bWluID0gdGFyZ2V0X2NvbnNlcnZhdGl2ZSwgeW1heCA9IHRhcmdldF9hZ2dyZXNzaXZlKSwgZmlsbCA9ICJvcmFuZ2UiLCBhbHBoYSA9IDAuMDEpICsNCiAgZ2VvbV9yZWN0KGFlcyh4bWluID0gLUluZiwgeG1heCA9IEluZiwgeW1pbiA9IC1JbmYsIHltYXggPSB0YXJnZXRfY29uc2VydmF0aXZlKSwgZmlsbCA9ICJsaWdodGNvcmFsIiwgYWxwaGEgPSAwLjAxMCkgKw0KICANCiAgIyBQbG90IGxpbmVzIGZvciBlYWNoIENBR1IgUGVyaW9kDQogIGdlb21fbGluZShzaXplID0gMS4wLCBhbHBoYSA9IDMuMCkgKyAgICAgICAjIExpbmUgZm9yIGVhY2ggQ0FHUg0KICBnZW9tX3BvaW50KHNpemUgPSAxLjAsIGFscGhhID0gMy4wKSArICAgICAgICMgUG9pbnRzIGZvciBlYWNoIENBR1INCg0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSB0YXJnZXRfYWdncmVzc2l2ZSwgY29sb3IgPSAiZGFya2JsdWUiLCBsaW5ldHlwZSA9ICJzb2xpZCIpICsNCiAgIyBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSB0YXJnZXRfbW9kZXJhdGUsIGNvbG9yID0gImRhcmtibHVlIiwgbGluZXR5cGUgPSAic29saWQiKSArDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IHRhcmdldF9jb25zZXJ2YXRpdmUsIGNvbG9yID0gImRhcmtibHVlIiwgbGluZXR5cGUgPSAic29saWQiKSArDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IHRhcmdldF9pbmZsYXRpb24sIGNvbG9yID0gImRhcmtyZWQiLCBsaW5ldHlwZSA9ICJkYXNoZWQiKSArDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IGNhZ3JfdmFsdWUsIGNvbG9yID0gImRhcmtyZWQiLCBsaW5ldHlwZSA9ICJkYXNoZWQiKSArDQogIA0KICAjIER5bmFtaWMgcmlnaHQtYWxpZ25lZCBwbGFjZW1lbnQgZm9yIGFubm90YXRpb25zDQogIGFubm90YXRlKCJ0ZXh0IiwgeCA9IEluZiwgeSA9IHRhcmdldF9hZ2dyZXNzaXZlLCBsYWJlbCA9ICJBZ2dyZXNzaXZlIiwgDQogICAgICAgICAgIGhqdXN0ID0gMSwgdmp1c3QgPSAtMC41MCwgY29sb3IgPSAiZGFya2JsdWUiLCBzaXplID0gNCkgKw0KICAjIGFubm90YXRlKCJ0ZXh0IiwgeCA9IEluZiwgeSA9IHRhcmdldF9tb2RlcmF0ZSwgbGFiZWwgPSAiTW9kZXJhdGUiLCANCiAgIyAgICAgICAgIGhqdXN0ID0gMSwgdmp1c3QgPSAtMC41MCwgY29sb3IgPSAiZGFya2JsdWUiLCBzaXplID0gNCkgKw0KICBhbm5vdGF0ZSgidGV4dCIsIHggPSBJbmYsIHkgPSB0YXJnZXRfY29uc2VydmF0aXZlLCBsYWJlbCA9ICJDb25zZXJ2YXRpdmUiLCANCiAgICAgICAgICAgaGp1c3QgPSAxLCB2anVzdCA9ICsxLjEwLCBjb2xvciA9ICJkYXJrYmx1ZSIsIHNpemUgPSA0KSArDQogIGFubm90YXRlKCJ0ZXh0IiwgeCA9IEluZiwgeSA9IHRhcmdldF9pbmZsYXRpb24sIGxhYmVsID0gIkluZmxhdGlvbiIsIA0KICAgICAgICAgICBoanVzdCA9IDEsIHZqdXN0ID0gLTAuNTAsIGNvbG9yID0gImRhcmtyZWQiLCBzaXplID0gNCkgKw0KICBhbm5vdGF0ZSgidGV4dCIsIHggPSBJbmYsIHkgPSBjYWdyX3ZhbHVlLCBsYWJlbCA9ICJDQUdSIiwgDQogICAgICAgICAgIGhqdXN0ID0gMSwgdmp1c3QgPSAtMC41MCwgY29sb3IgPSAiZGFya3JlZCIsIHNpemUgPSA0KSArIA0KDQogIGxhYnMoDQogICAgdGl0bGUgPSBkeW5hbWljX3RpdGxlLA0KICAgIHggPSAiWWVhciIsDQogICAgeSA9ICJDQUdSIFZhbHVlICglKSIsDQogICAgY29sb3IgPSAiQ0FHUiBQZXJpb2QiLA0KICAgIGNhcHRpb24gPSBkeW5hbWljX2NhcHRpb24NCiAgICApICsNCiAgDQogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjdXN0b21fY29sb3JzW2MoIjIwLVllYXIgQ0FHUiIsICIzMC1ZZWFyIENBR1IiKV0pICsNCiAgc2NhbGVfeF9jb250aW51b3VzKA0KICAgIGxpbWl0cyA9IGMoc3RhcnRfeWVhciwgZW5kX3llYXIgKyAxKSwgDQogICAgYnJlYWtzID0gc2VxKGxpbWl0c19zdGFydF95ZWFyLCBsaW1pdHNfZW5kX3llYXIgKyAxLCAxKQ0KICApICsgICMgUmVzdHJpY3QgJiBTZXQgTWFqb3IgeC1heGlzIGxpbmVzIGZvciBlYWNoIHllYXINCg0KICB0aGVtZV9taW5pbWFsKCkgKw0KICB0aGVtZSgNCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41LCBzaXplID0gMjApLCAgICAgICAgICMgTGFyZ2VyIHRpdGxlIGZvbnQNCiAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0KSwgICAgICAgICAgICAgICAgICAgICMgTGFyZ2VyIHgtYXhpcyBsYWJlbCBmb250DQogICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCksICAgICAgICAgICAgICAgICAgICAjIExhcmdlciB5LWF4aXMgbGFiZWwgZm9udA0KICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSwgc2l6ZSA9IDE0KSwgICMgTGFyZ2VyIHgtYXhpcyB0ZXh0DQogICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0KSwgICAgICAgICAgICAgICAgICAgICAjIExhcmdlciB5LWF4aXMgdGV4dA0KICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQpLCAgICAgICAgICAgICAgICAgICAgIyBMZWdlbmQgdGl0bGUgc2l6ZQ0KICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiksICAgICAgICAgICAgICAgICAgICAgIyBMZWdlbmQgdGV4dCBzaXplDQogICAgcGFuZWwuZ3JpZC5tYWpvciA9IGVsZW1lbnRfbGluZShsaW5ldHlwZSA9ICJkb3R0ZWQiLCBjb2xvciA9ICJibGFjayIpLCAgIyBNYWpvciBncmlkIGxpbmVzDQogICAgcGFuZWwuZ3JpZC5taW5vci54ID0gZWxlbWVudF9ibGFuaygpLCAgICAgICAgICAgICAgICAgICAgICAjIE5vIG1pbm9yIHggZ3JpZCBsaW5lcw0KICAgIGF4aXMudGlja3MubGVuZ3RoID0gdW5pdCgtMC4yNSwgImNtIiksICAgICAgICAgICAgICAgICAgICAgICMgSW5jcmVhc2UgdGljayBsZW5ndGgNCiAgICBheGlzLnRpY2tzID0gZWxlbWVudF9saW5lKGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDAuNTApLCAgICMgRGFya2VyIHRpY2tzDQogICAgYXhpcy5saW5lLnggPSBlbGVtZW50X2xpbmUoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMC43NSksICAjIERhcmsgYm90dG9tIGJvcmRlcg0KICAgIGF4aXMubGluZS55ID0gZWxlbWVudF9saW5lKGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDAuNzUpICAgIyBEYXJrIGxlZnQgYm9yZGVyDQogICkNCg0KIyBQcmludCB0aGUgcGxvdCANCnByaW50KHAxX2xvbmd0ZXJtKQ0KDQoNCmBgYA0KDQo8IS0tIA0KIyMjIyMjIyMjIyMNCiMjIFFRUSBTbG9wZSANCg0KIyMjIERhdGENCmBgYHtyIHFxcV9zbG9wZX0NCg0KaW50ZXJhY3RpdmVfcHJpbnQobWluX3llYXIpDQppbnRlcmFjdGl2ZV9wcmludChtYXhfeWVhcikNCg0KIyMgUVFRIFNsb3BlIC0gVXBkYXRlIERhdGUgdG8gWVlZWSBmb3JtYXQNCg0KIyBFbnN1cmUgbnVtZXJpYyBjb252ZXJzaW9uIGZvciB0aGUgYENsb3NlYCBhbmQgYERhdGVgIGNvbHVtbnMNCnFxcV9jYWdyX3Nsb3BlcyA8LSBxcXFfcmF3X2NhZ3IgJT4lDQogIG11dGF0ZSgNCiAgICBDbG9zZSA9IGFzLm51bWVyaWMoZ3N1YigiLCIsICIiLCBDbG9zZSkpLCAgIyBFbnN1cmUgQ2xvc2UgaXMgbnVtZXJpYw0KICAgIERhdGUgPSBhcy5jaGFyYWN0ZXIoYXMubnVtZXJpYyhnc3ViKCIsIiwgIiIsIERhdGUpKSkgIyBDb252ZXJ0IERhdGUgdG8gY2hhcmFjdGVyIFlZWVkNCiAgKQ0KDQojIEZ1bmN0aW9uIHRvIGNhbGN1bGF0ZSBzbG9wZXMgZm9yIGEgc3BlY2lmaWVkIHBlcmlvZCBmb3IgZWFjaCBDQUdSIGNvbHVtbg0KY2FsY3VsYXRlX2NhZ3Jfc2xvcGUgPC0gZnVuY3Rpb24oZGF0YSwgcGVyaW9kcykgew0KICBmb3IgKGNhZ3JfY29sIGluIGdyZXAoIkNBR1IiLCBuYW1lcyhkYXRhKSwgdmFsdWUgPSBUUlVFKSkgew0KICAgIGZvciAocGVyaW9kIGluIHBlcmlvZHMpIHsNCiAgICAgIHNsb3BlX2NvbF9uYW1lIDwtIHBhc3RlMChwZXJpb2QsICItWWVhciBTbG9wZSBvZiAiLCBjYWdyX2NvbCkNCiAgICAgIA0KICAgICAgIyBJbml0aWFsaXplIHNsb3BlIGNvbHVtbiB3aXRoIE5BDQogICAgICBkYXRhW1tzbG9wZV9jb2xfbmFtZV1dIDwtIE5BDQogICAgICANCiAgICAgICMgUmV2ZXJzZSB0aGUgb3JkZXIgb2YgdGhlIGRhdGEgYnkgRGF0ZSAocmVjZW50IHRvIG9sZGVzdCkNCiAgICAgIGRhdGEgPC0gZGF0YSAlPiUgYXJyYW5nZShkZXNjKGFzLm51bWVyaWMoRGF0ZSkpKSAgIyBTb3J0IG51bWVyaWNhbGx5IGJ5IERhdGUNCiAgICAgIA0KICAgICAgIyBDYWxjdWxhdGUgc2xvcGUgZm9yIGVhY2ggdmFsaWQgcGVyaW9kDQogICAgICBmb3IgKGkgaW4gMToobnJvdyhkYXRhKSAtIHBlcmlvZCArIDEpKSB7DQogICAgICAgIHN1YnNldF9kYXRhIDwtIGRhdGFbaTooaSArIHBlcmlvZCAtIDEpLCBjKCJEYXRlIiwgY2Fncl9jb2wpXQ0KICAgICAgICBpZiAobnJvdyhzdWJzZXRfZGF0YSkgPT0gcGVyaW9kICYmIGFsbCghaXMubmEoc3Vic2V0X2RhdGFbW2NhZ3JfY29sXV0pKSkgew0KICAgICAgICAgICMgVXNlIGJhY2t0aWNrcyB0byBlc2NhcGUgY29sdW1uIG5hbWVzIHdpdGggc3BlY2lhbCBjaGFyYWN0ZXJzDQogICAgICAgICAgbG1fbW9kZWwgPC0gbG0oYXMuZm9ybXVsYShwYXN0ZTAoImAiLCBjYWdyX2NvbCwgImAgfiBhcy5udW1lcmljKERhdGUpIikpLCBkYXRhID0gc3Vic2V0X2RhdGEpDQogICAgICAgICAgc2xvcGUgPC0gY29lZihsbV9tb2RlbClbImFzLm51bWVyaWMoRGF0ZSkiXSAgIyBTbG9wZSBvZiBDQUdSDQogICAgICAgICAgDQogICAgICAgICAgIyBTdG9yZSBzbG9wZSBhcyB0aGUgcmF0ZSBvZiBjaGFuZ2UgZm9yIENBR1INCiAgICAgICAgICBkYXRhW1tzbG9wZV9jb2xfbmFtZV1dW2ldIDwtIHJvdW5kKHNsb3BlLCAyKSAgIyBFbnN1cmUgc2xvcGUgaGFzIDIgZGVjaW1hbCBwb2ludHMNCiAgICAgICAgfQ0KICAgICAgfQ0KICAgIH0NCiAgfQ0KICByZXR1cm4oZGF0YSkNCn0NCg0KIyBBcHBseSB0aGUgZnVuY3Rpb24gdG8gY2FsY3VsYXRlIHNsb3BlcyBmb3IgZGVzaXJlZCBwZXJpb2RzIChlLmcuLCAxMCBhbmQgMjQgeWVhcnMpDQpkZXNpcmVkX3BlcmlvZHMgPC0gYygxMCwgMjQpDQpxcXFfY2Fncl9zbG9wZXMgPC0gY2FsY3VsYXRlX2NhZ3Jfc2xvcGUocXFxX2NhZ3Jfc2xvcGVzLCBkZXNpcmVkX3BlcmlvZHMpDQoNCiMgRW5zdXJlIGRhdGEgaXMgb3JkZXJlZCBieSBEYXRlIGFuZCByb3VuZCBudW1lcmljIGNvbHVtbnMgdG8gMiBkZWNpbWFscw0KcXFxX2NhZ3Jfc2xvcGVzIDwtIHFxcV9jYWdyX3Nsb3BlcyAlPiUNCiAgYXJyYW5nZShkZXNjKGFzLm51bWVyaWMoRGF0ZSkpKSAlPiUNCiAgbXV0YXRlKGFjcm9zcyh3aGVyZShpcy5udW1lcmljKSwgfiByb3VuZCgueCwgMikpKSAgIyBSb3VuZCBhbGwgbnVtZXJpYyBjb2x1bW5zIHRvIDIgZGVjaW1hbHMNCg0KIyBGb3JtYXQgQ0FHUiBhbmQgc2xvcGUgY29sdW1ucyBhcyBwZXJjZW50YWdlcyB3aXRoIHR3byBkZWNpbWFscywgaGFuZGxlIE5BIHZhbHVlcywgYW5kIGZvcm1hdCBDbG9zZSB3aXRoIGNvbW1hcw0KcXFxX2NhZ3Jfc2xvcGVzIDwtIHFxcV9jYWdyX3Nsb3BlcyAlPiUNCiAgbXV0YXRlKA0KICAgICMgRm9ybWF0IENBR1IgY29sdW1ucyB3aXRoIHBlcmNlbnRhZ2VzDQogICAgYWNyb3NzKGNvbnRhaW5zKCJDQUdSIiksIH4gaWZlbHNlKGlzLm5hKC54KSwgIk5BIiwgc3ByaW50ZigiJS4yZiUlIiwgLngpKSksDQogICAgDQogICAgIyBGb3JtYXQgQ2xvc2UgY29sdW1uIHdpdGggdHdvIGRlY2ltYWwgcG9pbnRzIGFuZCBjb21tYXMgZm9yIHRob3VzYW5kcyBzZXBhcmF0b3JzDQogICAgQ2xvc2UgPSBpZmVsc2UoaXMubmEoQ2xvc2UpLCAiTkEiLCBmb3JtYXRDKENsb3NlLCBmb3JtYXQgPSAiZiIsIGJpZy5tYXJrID0gIiwiLCBkaWdpdHMgPSAyKSkNCiAgKQ0KDQojIFNhdmUgdGhlIHJlc3VsdGluZyBkYXRhZnJhbWUgZHluYW1pY2FsbHkgd2l0aCBhZGp1c3RlZCBjb2x1bW4gbmFtZXMNCmluZGV4IDwtICJxcXEiICAjIERlZmluZSB0aGUgaW5kZXggbmFtZSAoZS5nLiwgUVFRKQ0KZm9yIChwZXJpb2QgaW4gZGVzaXJlZF9wZXJpb2RzKSB7DQogIHNsb3BlX2NvbHVtbnMgPC0gZ3JlcChwYXN0ZTAocGVyaW9kLCAiLVllYXIgU2xvcGUiKSwgbmFtZXMocXFxX2NhZ3Jfc2xvcGVzKSwgdmFsdWUgPSBUUlVFKQ0KICBzbG9wZV9kZiA8LSBxcXFfY2Fncl9zbG9wZXMgJT4lDQogICAgc2VsZWN0KERhdGUsIENsb3NlLCBhbGxfb2Yoc2xvcGVfY29sdW1ucykpICU+JQ0KICAgIGFycmFuZ2UoZGVzYyhhcy5udW1lcmljKERhdGUpKSkgICMgRW5zdXJlIGRhdGEgaXMgb3JkZXJlZCBieSByZWNlbnQgdG8gb2xkZXN0DQogIA0KICAjIEFkanVzdCBjb2x1bW4gbmFtZXMgZm9yIHRoZSB0YWJsZQ0KICBjb2xuYW1lcyhzbG9wZV9kZikgPC0gc3ViKHBhc3RlMChwZXJpb2QsICItWWVhciBTbG9wZSBvZiAiKSwgIiIsIGNvbG5hbWVzKHNsb3BlX2RmKSkNCiAgDQogICMgQ3JlYXRlIGR5bmFtaWMgZGF0YWZyYW1lIG5hbWUNCiAgZGZfbmFtZSA8LSBwYXN0ZTAoaW5kZXgsICJfIiwgcGVyaW9kLCAiX3llYXJfY2Fncl9zbG9wZXMiKQ0KICANCiAgIyBTYXZlIHRoZSBkYXRhZnJhbWUgd2l0aCB0aGUgZHluYW1pYyBuYW1lDQogIGFzc2lnbihkZl9uYW1lLCBzbG9wZV9kZiwgZW52aXIgPSAuR2xvYmFsRW52KQ0KfQ0KDQojIEV4YW1wbGUgdG8gYWNjZXNzIHRoZSBkYXRhZnJhbWVzDQppbnRlcmFjdGl2ZV9wcmludChscyhwYXR0ZXJuID0gcGFzdGUwKGluZGV4LCAiXy4qX3llYXJfY2Fncl9zbG9wZXMiKSkpDQppbnRlcmFjdGl2ZV9zdHIocXFxXzEwX3llYXJfY2Fncl9zbG9wZXMpDQppbnRlcmFjdGl2ZV9zdHIocXFxXzI0X3llYXJfY2Fncl9zbG9wZXMpDQoNCiMgUHJpbnQgdGhlIHRhYmxlIGNhcHRpb24gZHluYW1pY2FsbHkNCmNhdCgiXG4jIyMgMTAtWWVhciBDQUdSIFNsb3BlcyIpDQpmb3JtYXRfZXF1YWxfd2lkdGgocXFxXzEwX3llYXJfY2Fncl9zbG9wZXMpDQoNCmNhdCgiXG4jIyMgMjQtWWVhciBDQUdSIFNsb3BlcyIpDQpmb3JtYXRfZXF1YWxfd2lkdGgocXFxXzI0X3llYXJfY2Fncl9zbG9wZXMpDQoNCg0KDQpgYGANCi0tPg0KDQoNCg0KIyBCTEFDS1JPQ0sNCg0KQmxhY2tSb2NrLCBJbmMuIGlzIGFuIEFtZXJpY2FuIG11bHRpbmF0aW9uYWwgaW52ZXN0bWVudCBtYW5hZ2VtZW50IGNvcnBvcmF0aW9uIGhlYWRxdWFydGVyZWQgaW4gTmV3IFlvcmsgQ2l0eS4gRm91bmRlZCBpbiAxOTg4LCBpdCBoYXMgZ3Jvd24gdG8gYmVjb21lIHRoZSB3b3JsZCdzIGxhcmdlc3QgYXNzZXQgbWFuYWdlciwgd2l0aCBhcHByb3hpbWF0ZWx5ICQxMS41IHRyaWxsaW9uIGluIGFzc2V0cyB1bmRlciBtYW5hZ2VtZW50IGFzIG9mIE9jdG9iZXIgMjAyNC4gQmxhY2tSb2NrIG9mZmVycyBhIGRpdmVyc2UgcmFuZ2Ugb2YgaW52ZXN0bWVudCBwcm9kdWN0cywgaW5jbHVkaW5nIG11dHVhbCBmdW5kcywgZXhjaGFuZ2UtdHJhZGVkIGZ1bmRzIChFVEZzKSB1bmRlciB0aGUgaVNoYXJlcyBicmFuZCwgYW5kIGFsdGVybmF0aXZlIGludmVzdG1lbnRzLiBUaGUgZmlybSBzZXJ2ZXMgYSBicm9hZCBjbGllbnRlbGUsIGVuY29tcGFzc2luZyBpbnN0aXR1dGlvbmFsIGludmVzdG9ycywgZmluYW5jaWFsIHByb2Zlc3Npb25hbHMsIGFuZCBpbmRpdmlkdWFsIGludmVzdG9ycyB3b3JsZHdpZGUuIEJsYWNrUm9jayBpcyBhbHNvIGtub3duIGZvciBpdHMgQWxhZGRpbiBwbGF0Zm9ybSwgYSBjb21wcmVoZW5zaXZlIHJpc2sgbWFuYWdlbWVudCBhbmQgcG9ydGZvbGlvIG1hbmFnZW1lbnQgc3lzdGVtIHV0aWxpemVkIGJvdGggaW50ZXJuYWxseSBhbmQgYnkgZXh0ZXJuYWwgY2xpZW50cy4gVGhlIGNvbXBhbnkgZW1waGFzaXplcyBzdXN0YWluYWJsZSBpbnZlc3RpbmcsIGludGVncmF0aW5nIGVudmlyb25tZW50YWwsIHNvY2lhbCwgYW5kIGdvdmVybmFuY2UgKEVTRykgZmFjdG9ycyBpbnRvIGl0cyBpbnZlc3RtZW50IHByb2Nlc3Nlcy4gV2l0aCBhIGdsb2JhbCBwcmVzZW5jZSBzcGFubmluZyBvdmVyIDMwIGNvdW50cmllcywgQmxhY2tSb2NrIHBsYXlzIGEgc2lnbmlmaWNhbnQgcm9sZSBpbiB0aGUgZ2xvYmFsIGZpbmFuY2lhbCBzeXN0ZW0sIGluZmx1ZW5jaW5nIG1hcmtldCB0cmVuZHMgYW5kIGludmVzdG1lbnQgcHJhY3RpY2VzLg0KDQojIyBCbGFja1JvY2sgR1INCg0KIyMjIERhdGENCg0KVGhlIEJsYWNrUm9jayBpQkxEIEVuZHVyYcKuIFZDIDUuNSBFUiBJbmRleCwgY29tbW9ubHkgcmVmZXJyZWQgdG8gYXMgdGhlIEJsYWNrUm9jayBFbmR1cmHCriBJbmRleCB3aXRoIHRpY2tlciBzeW1ib2wgSUJMREU1NUUsIGlzIGRlc2lnbmVkIHRvIHByb3ZpZGUgbW9yZSBjb25zaXN0ZW50IHJldHVybnMgY29tcGFyZWQgdG8gdHJhZGl0aW9uYWwgc3RvY2sgaW5kaWNlcy4gSXQgYWltcyB0byByZWR1Y2UgbG9zc2VzIGR1cmluZyBtYXJrZXQgZG93bnR1cm5zIHdoaWxlIGNhcHR1cmluZyBnYWlucyBpbiByaXNpbmcgbWFya2V0cy4gVGhlIGluZGV4IHByaW1hcmlseSBjb21wcmlzZXMgVS5TLiBlcXVpdGllcyBhbmQgZW1wbG95cyBhIGRhaWx5IHZvbGF0aWxpdHkgY29udHJvbCBtZWNoYW5pc20gdG8gbWl0aWdhdGUgZG93bnNpZGUgcmlzay4gVGhpcyBtZWNoYW5pc20gYWRqdXN0cyBhbGxvY2F0aW9ucyBiZXR3ZWVuIFUuUy4gZXF1aXRpZXMgYW5kIHNob3J0LXRlcm0gVS5TLiBUcmVhc3VyeSBib25kcyBiYXNlZCBvbiBtYXJrZXQgdm9sYXRpbGl0eS4gVGhlIGluZGV4J3MgY29uc3RpdHVlbnRzIGluY2x1ZGUgaVNoYXJlc8KuIEVURnMsIGFuZCBpdCB0cmFja3MgdGhlIGV4Y2VzcyByZXR1cm4gb2YgdGhlc2Ugc2VsZWN0ZWQgRVRGcyBvdmVyIHRoZSByZXR1cm4gb24gY2FzaC4gVGhpcyBzdHJ1Y3R1cmUgc2Vla3MgdG8gYmFsYW5jZSBncm93dGggcG90ZW50aWFsIHdpdGggcmlzayBtYW5hZ2VtZW50LCBtYWtpbmcgaXQgYSBzdHJhdGVnaWMgb3B0aW9uIGZvciBpbnZlc3RvcnMgc2Vla2luZyBzdGFibGUgcmV0dXJucyBhY3Jvc3MgdmFyeWluZyBtYXJrZXQgY29uZGl0aW9ucy4gQmxhY2tSb2NrIEVuZHVyYSBJbmRleCB3YXMgb2ZmaWNpYWxseSBsYXVuY2hlZCBvbiBKdW5lIDE0LCAyMDE2IGFuZCB0aGVyZWZvcmUgaGFzIGFjY3VtdWxhdGVkIGxlc3MgZGF0YSBvdmVyIHRpbWUgd2hlbiBjb21wYXJlZCB0byB0aGUgb3RoZXIgaW5kZXhlcyBhbmQgRVRGcy4gDQoNClNob3J0LXRlcm0gVHJlYXN1cnkgYm9uZHMsIG9mdGVuIHJlZmVycmVkIHRvIGFzIFRyZWFzdXJ5IG5vdGVzIChULW5vdGVzKSwgYW5kIHJlcHJlc2VudGVkIGJ5IHRoZSBFVEYgdGlja2VyIHN5bWJvbCBTSFksIGFyZSBVLlMuIGdvdmVybm1lbnQgZGVidCBzZWN1cml0aWVzIHdpdGggbWF0dXJpdGllcyB0eXBpY2FsbHkgcmFuZ2luZyBmcm9tIDEgdG8gMyB5ZWFycyAocmF0aGVyIHRoYW4gdGhlIDIgdG8gMTAgeWVhcnMgY2hhcmFjdGVyaXN0aWMgb2YgdHJhZGl0aW9uYWwgVC1ub3RlcykuIFRoZXNlIHNlY3VyaXRpZXMgcGF5IGEgZml4ZWQgaW50ZXJlc3QgcmF0ZSBldmVyeSBzaXggbW9udGhzIGFuZCBhcmUgY29uc2lkZXJlZCBsb3ctcmlzayBpbnZlc3RtZW50cyBkdWUgdG8gYmVpbmcgYmFja2VkIGJ5IHRoZSBmdWxsIGZhaXRoIGFuZCBjcmVkaXQgb2YgdGhlIFUuUy4gZ292ZXJubWVudC4gSW52ZXN0b3JzIG9mdGVuIHVzZSBzaG9ydC10ZXJtIFRyZWFzdXJ5IGJvbmRzIGxpa2UgU0hZIHRvIGFjaGlldmUgc3RhYmlsaXR5IGluIHRoZWlyIHBvcnRmb2xpb3MsIGVhcm4gbW9kZXN0IGludGVyZXN0IGluY29tZSwgYW5kIG1pbmltaXplIGV4cG9zdXJlIHRvIGludGVyZXN0IHJhdGUgZmx1Y3R1YXRpb25zLCBtYWtpbmcgdGhlbSBhbiBpZGVhbCBjaG9pY2UgaW4gdW5jZXJ0YWluIGVjb25vbWljIGVudmlyb25tZW50cy4NCg0KVGhlIGlTaGFyZXMgTVNDSSBVU0EgTWluaW11bSBWb2xhdGlsaXR5IEZhY3RvciBFVEYgKFVTTVYpIGlzIGFuIGV4Y2hhbmdlLXRyYWRlZCBmdW5kIGRlc2lnbmVkIHRvIHByb3ZpZGUgZXhwb3N1cmUgdG8gVS5TLiBzdG9ja3Mgd2l0aCBsb3dlciB2b2xhdGlsaXR5IGNvbXBhcmVkIHRvIHRoZSBicm9hZGVyIG1hcmtldC4gSXQgdHJhY2tzIHRoZSBNU0NJIFVTQSBNaW5pbXVtIFZvbGF0aWxpdHkgSW5kZXgsIGZvY3VzaW5nIG9uIGNvbXBhbmllcyB0aGF0IGV4aGliaXQgc3RhYmxlIHByaWNlIG1vdmVtZW50cywgbWFraW5nIGl0IGEgcG9wdWxhciBjaG9pY2UgZm9yIHJpc2stYXZlcnNlIGludmVzdG9ycy4gVVNNViB0eXBpY2FsbHkgaW5jbHVkZXMgbGFyZ2UtY2FwIHN0b2NrcyBmcm9tIGRlZmVuc2l2ZSBzZWN0b3JzIGxpa2UgaGVhbHRoY2FyZSwgdXRpbGl0aWVzLCBhbmQgY29uc3VtZXIgc3RhcGxlcywgYWltaW5nIHRvIHJlZHVjZSBwb3J0Zm9saW8gcmlzayB3aGlsZSBtYWludGFpbmluZyBlcXVpdHkgbWFya2V0IGV4cG9zdXJlLiBXaXRoIGEgbG93IGV4cGVuc2UgcmF0aW8sIGl0IG9mZmVycyBhIGNvc3QtZWZmaWNpZW50IHdheSB0byBhY2hpZXZlIHN0ZWFkeSByZXR1cm5zLCB0aG91Z2ggaXQgbWF5IHVuZGVycGVyZm9ybSBpbiBidWxsIG1hcmtldHMgZHVlIHRvIGl0cyBkZWZlbnNpdmUgbmF0dXJlLiBUaGlzIEVURiBpcyBpZGVhbCBmb3IgaW52ZXN0b3JzIHNlZWtpbmcgdG8gd2VhdGhlciBtYXJrZXQgZmx1Y3R1YXRpb25zIHdoaWxlIG1haW50YWluaW5nIGNvbnNpc3RlbnQgcGVyZm9ybWFuY2Ugb3ZlciB0aW1lLg0KDQpEYXRhIFNvdXJjZTogYHIgbnJ2JHNvdXJjZV9ibGFja3JvY2tfZW5kdXJhYA0KDQoNCmBgYHtyIGJsYWNrcm9ja19yYXcsIGV2YWw9VFJVRSwgZWNobz1GQUxTRX0NCg0KIyBEaXNwbGF5IHRoZSBzdHJ1Y3R1cmUgb2YgdGhlIGRhdGFzZXQgdG8gY29uZmlybSBjb2x1bW4gbmFtZXMNCmludGVyYWN0aXZlX3N0cihucnQkYmxhY2tyb2NrX3JhdykNCg0KbGlicmFyeShkcGx5cikNCmxpYnJhcnkobHVicmlkYXRlKSAgIyBGb3IgZGF0ZSBtYW5pcHVsYXRpb24NCmxpYnJhcnkoc2NhbGVzKQ0KbGlicmFyeShzdHJpbmdyKQ0KDQojIEVuc3VyZSB0aGUgJ0RhdGUnIGNvbHVtbiBpcyBvZiBEYXRlIGNsYXNzDQpibGFja3JvY2tfcmF3IDwtIG5ydCRibGFja3JvY2tfcmF3ICU+JQ0KICBtdXRhdGUoRGF0ZSA9IGFzLkRhdGUoRGF0ZSwgZm9ybWF0ID0gIiVZLSVtLSVkIikpDQoNCiMgRmluZCB0aGUgbWluaW11bSBhbmQgbWF4aW11bSB5ZWFyDQptaW5feWVhciA8LSBmb3JtYXQobWluKGJsYWNrcm9ja19yYXckRGF0ZSwgbmEucm0gPSBUUlVFKSwgIiVZIikNCm1heF95ZWFyIDwtIGZvcm1hdChtYXgoYmxhY2tyb2NrX3JhdyREYXRlLCBuYS5ybSA9IFRSVUUpLCAiJVkiKQ0KaW50ZXJhY3RpdmVfcHJpbnQobWluX3llYXIpDQppbnRlcmFjdGl2ZV9wcmludChtYXhfeWVhcikNCg0KIyBVcGRhdGUgZGF0YSBmcmFtZSB3aXRoIHByb3BlciBkYXRlIGFuZCBwZXJjZW50YWdlIGhhbmRsaW5nDQpibGFja3JvY2tfcmF3IDwtIGJsYWNrcm9ja19yYXcgJT4lDQogIG11dGF0ZSgNCiAgICAjIENvbnZlcnQgQ2xvc2UgRGF0ZSB0byAiWVlZWS1NTS1ERCIgZm9ybWF0DQogICAgYERhdGVgID0gZm9ybWF0KGFzLkRhdGUoYXMuY2hhcmFjdGVyKGBEYXRlYCksIG9yaWdpbiA9ICIxOTcwLTAxLTAxIiksICIlWS0lbS0lZCIpLA0KDQogICAgIyBFbnN1cmUgQ2xvc2UgaXMgYSBudW1iZXIgZm9ybWF0dGVkIHRvIDIgZGVjaW1hbCBwbGFjZXMNCiAgICBgQ2xvc2VgID0gbnVtYmVyKGFzLm51bWVyaWMoZ3N1YigiLCIsICIiLCBDbG9zZSkpLCBiaWcubWFyayA9ICIsIiwgZGVjaW1hbC5tYXJrID0gIi4iLCBhY2N1cmFjeSA9IDAuMDEpLA0KDQogICAgIyBDbGVhbiBhbmQgaGFuZGxlIHBlcmNlbnRhZ2UgY29sdW1ucw0KICAgIGFjcm9zcygzOjMsIH4gew0KICAgICAgdmFsdWUgPC0gZ3N1YigiWywlXFxzXSIsICIiLCAuKSAgIyBSZW1vdmUgJSwgY29tbWFzLCBhbmQgc3BhY2VzDQogICAgICBudW1lcmljX3ZhbHVlIDwtIHN1cHByZXNzV2FybmluZ3MoYXMubnVtZXJpYyh2YWx1ZSkpICAjIENvbnZlcnQgdG8gbnVtZXJpYw0KICAgICAgaWZlbHNlKA0KICAgICAgICAhaXMubmEobnVtZXJpY192YWx1ZSksIA0KICAgICAgICBwYXN0ZTAoZm9ybWF0KHJvdW5kKG51bWVyaWNfdmFsdWUqMTAwLCAyKSwgYmlnLm1hcmsgPSAiLCIsIHNjaWVudGlmaWMgPSBGQUxTRSksICIlIiksICAjIEZvcm1hdCB0byAyIGRlY2ltYWwgcGxhY2VzIGFuZCBhZGQgY29tbWFzDQogICAgICAgIC4NCiAgICAgICkNCiAgICB9KQ0KICApICU+JQ0KICBhcnJhbmdlKGRlc2MoYERhdGVgKSkgICMgU29ydCBieSBEYXRlIGZyb20gbmV3ZXN0IHRvIG9sZGVzdA0KDQojIERpc3BsYXkgdGhlIGZvcm1hdHRlZCBkYXRhDQppbnRlcmFjdGl2ZV9zdHIoYmxhY2tyb2NrX3JhdykNCmludGVyYWN0aXZlX3ByaW50KGJsYWNrcm9ja19yYXcpDQoNCiMgRGlzcGxheSB0aGUgdGFibGUgd2l0aCBjYXB0aW9uDQpjYXQoIlxuXG4jIyMjIEJsYWNrUm9jayBZZWFybHkgUGVyZm9ybWFuY2UgKCIsIG1pbl95ZWFyLCAiLSIsIG1heF95ZWFyLCAiKVxuIiwgc2VwID0gIiIpDQpmb3JtYXRfZXF1YWxfd2lkdGhfZ3JvdXBlZChibGFja3JvY2tfcmF3LCBncm91cGluZ19mYWN0b3IgPSAxKQ0KIyBjYXQoIlxuXG4gU291cmNlOiAiLCBucnYkc291cmNlX2JsYWNrcm9ja19lbmR1cmEsICJcbiIpDQoNCmBgYA0KDQojIyMgU3VtbWFyeQ0KDQpgYGB7ciBibGFja3JvY2tfcmF3X3N1bW1hcnksIGV2YWw9VFJVRSwgZWNobz1GQUxTRX0NCg0KIyBMb2FkIG5lY2Vzc2FyeSBsaWJyYXJpZXMNCmxpYnJhcnkoZHBseXIpDQpsaWJyYXJ5KHRpYmJsZSkNCmxpYnJhcnkoa25pdHIpDQpsaWJyYXJ5KGthYmxlRXh0cmEpDQoNCmludGVyYWN0aXZlX3N0cihibGFja3JvY2tfcmF3KQ0KaW50ZXJhY3RpdmVfcHJpbnQoYmxhY2tyb2NrX3JhdykNCg0KIyBFbnN1cmUgdGhlIERhdGUgY29sdW1uIGlzIGEgcHJvcGVyIERhdGUgb2JqZWN0IGFuZCBleHRyYWN0IHRoZSB5ZWFyDQpibGFja3JvY2tfcmF3IDwtIGJsYWNrcm9ja19yYXcgJT4lDQogIHNsaWNlKC0xKSAlPiUgIyBSZW1vdmUgdGhlIGZpcnN0IHJvdw0KICAjIG11dGF0ZShEYXRlID0gaWZlbHNlKHJvd19udW1iZXIoKSA9PSAxLCAiMjAyNS0wMS0wMSIsIERhdGUpKSAlPiUNCiAgbXV0YXRlKA0KICAgIERhdGUgPSBhcy5udW1lcmljKGZvcm1hdChhcy5EYXRlKERhdGUsIGZvcm1hdCA9ICIlWS0lbS0lZCIpLCAiJVkiKSksDQogICAgYDEtWWVhciBDQUdSYCA9IGFzLm51bWVyaWMoZ3N1YigiW14wLTkuLV0iLCAiIiwgYDEtWWVhciBDQUdSYCkpDQogICkNCg0KIyBTb3J0IGRhdGEgYnkgRGF0ZSBpbiBhc2NlbmRpbmcgb3JkZXINCmJsYWNrcm9ja19yYXcgPC0gYmxhY2tyb2NrX3JhdyAlPiUNCiAgYXJyYW5nZShEYXRlKQ0KDQoNCiMgQ2FsY3VsYXRlIHRoZSBDQUdSIGFuZCBkeW5hbWljYWxseSBjcmVhdGUgYSB2YXJpYWJsZSBuYW1lIHdpdGggdGhlIGZvcm1hdCBibGFja3JvY2tfY2Fncl92YWx1ZV9zPG1pbl95ZWFyPl9lPG1heF95ZWFyPg0KaW5pdGlhbF92YWx1ZSA8LSAxMDAgICMgQXNzdW1pbmcgYW4gaW5pdGlhbCBpbmRleCB2YWx1ZSBvZiAxMDANCmZpbmFsX3ZhbHVlIDwtIGluaXRpYWxfdmFsdWUgKiBwcm9kKDEgKyBibGFja3JvY2tfcmF3JGAxLVllYXIgQ0FHUmAgLyAxMDAsIG5hLnJtID0gVFJVRSkNCm1pbl95ZWFyIDwtIG1pbihibGFja3JvY2tfcmF3JERhdGUsIG5hLnJtID0gVFJVRSkNCm1heF95ZWFyIDwtIG1heChibGFja3JvY2tfcmF3JERhdGUsIG5hLnJtID0gVFJVRSkNCm51bV95ZWFycyA8LSBtYXhfeWVhciAtIG1pbl95ZWFyDQpjYWdyX3ZhbHVlIDwtIHJvdW5kKCgoZmluYWxfdmFsdWUgLyBpbml0aWFsX3ZhbHVlKV4oMSAvIG51bV95ZWFycykgLSAxKSAqIDEwMCwgMikNCnZhcl9uYW1lIDwtIHBhc3RlMCgiYmxhY2tyb2NrX2NhZ3JfdmFsdWVfcyIsIG1pbl95ZWFyLCAiX2UiLCBtYXhfeWVhcikNCmFzc2lnbih2YXJfbmFtZSwgY2Fncl92YWx1ZSkNCg0KIyBDb252ZXJ0IEJsYWNrUm9jayBkYXRhIHRvIG51bWVyaWMsIHJlbW92aW5nIGFueSBwZXJjZW50YWdlIHNpZ25zDQpkYXRhIDwtIGFzLm51bWVyaWMoZ3N1YigiJSIsICIiLCBibGFja3JvY2tfcmF3JGAxLVllYXIgQ0FHUmApKQ0KDQojIENhbGN1bGF0ZSBzdGF0aXN0aWNzDQpjb3VudF9vYnNlcnZhdGlvbnMgPC0gc3VtKCFpcy5uYShkYXRhKSkNCm1lYW5fdmFsdWUgPC0gcm91bmQobWVhbihkYXRhLCBuYS5ybSA9IFRSVUUpLCAyKQ0KbWVkaWFuX3ZhbHVlIDwtIHJvdW5kKG1lZGlhbihkYXRhLCBuYS5ybSA9IFRSVUUpLCAyKQ0Kc2RfdmFsdWUgPC0gcm91bmQoc2QoZGF0YSwgbmEucm0gPSBUUlVFKSwgMikNCm1pbl9jYWdyX3JhbmdlIDwtIHJvdW5kKGNhZ3JfdmFsdWUgLSBzZF92YWx1ZSwgMikNCm1heF9jYWdyX3JhbmdlIDwtIHJvdW5kKGNhZ3JfdmFsdWUgKyBzZF92YWx1ZSwgMikNCm1pbl92YWx1ZSA8LSByb3VuZChtaW4oZGF0YSwgbmEucm0gPSBUUlVFKSwgMikNCm1heF92YWx1ZSA8LSByb3VuZChtYXgoZGF0YSwgbmEucm0gPSBUUlVFKSwgMikNCg0KIyBUYXJnZXQgUmF0ZSBBbmFseXNpcyAtIFJlZmVyIHRvICJQcmVmZXJyZWQgVGFyZ2V0cyIgb3IgaW5jbHVkZSBiZWxvdyBmb3IgaW5kaXZpZHVhbCBjaGFuZ2VzLg0KYWJvdmVfdGFyZ2V0X2luZmxhdGlvbiA8LSBzdW0oZGF0YSA+PSB0YXJnZXRfaW5mbGF0aW9uLCBuYS5ybSA9IFRSVUUpDQphYm92ZV90YXJnZXRfY29uc2VydmF0aXZlIDwtIHN1bShkYXRhID49IHRhcmdldF9jb25zZXJ2YXRpdmUsIG5hLnJtID0gVFJVRSkNCmFib3ZlX3RhcmdldF9tb2RlcmF0ZSA8LSBzdW0oZGF0YSA+PSB0YXJnZXRfbW9kZXJhdGUsIG5hLnJtID0gVFJVRSkNCmFib3ZlX3RhcmdldF9hZ2dyZXNzaXZlIDwtIHN1bShkYXRhID49IHRhcmdldF9hZ2dyZXNzaXZlLCBuYS5ybSA9IFRSVUUpDQoNCnBlcmNlbnRfYWJvdmVfdGFyZ2V0X2NvbnNlcnZhdGl2ZSA8LSByb3VuZCgoYWJvdmVfdGFyZ2V0X2NvbnNlcnZhdGl2ZSAvIGNvdW50X29ic2VydmF0aW9ucykgKiAxMDAsIDIpDQpwZXJjZW50X2Fib3ZlX3RhcmdldF9pbmZsYXRpb24gPC0gcm91bmQoKGFib3ZlX3RhcmdldF9pbmZsYXRpb24gLyBjb3VudF9vYnNlcnZhdGlvbnMpICogMTAwLCAyKQ0KcGVyY2VudF9hYm92ZV90YXJnZXRfbW9kZXJhdGUgPC0gcm91bmQoKGFib3ZlX3RhcmdldF9tb2RlcmF0ZSAvIGNvdW50X29ic2VydmF0aW9ucykgKiAxMDAsIDIpDQpwZXJjZW50X2Fib3ZlX3RhcmdldF9hZ2dyZXNzaXZlIDwtIHJvdW5kKChhYm92ZV90YXJnZXRfYWdncmVzc2l2ZSAvIGNvdW50X29ic2VydmF0aW9ucykgKiAxMDAsIDIpDQoNCiMgQ29tcGlsZSBzdGF0aXN0aWNzIGludG8gYSBsaXN0IGZvciBlYXN5IGNvbnZlcnNpb24gdG8gYSBkYXRhIGZyYW1lIHdpdGggZGVmaW5pdGlvbnMNCmJsYWNrcm9ja19yYXdfc3VtbWFyeSA8LSB0cmliYmxlKA0KICB+U3RhdGlzdGljLCB+VmFsdWUsIH5EZWZpbml0aW9uLA0KICAiQ291bnQgb2YgT2JzZXJ2YXRpb25zIiwgYXMuY2hhcmFjdGVyKGNvdW50X29ic2VydmF0aW9ucyksICJUb3RhbCBudW1iZXIgb2YgZGF0YSBwb2ludHMgY29sbGVjdGVkIG92ZXIgdGhlIHNwZWNpZmljIHBlcmlvZC4iLA0KICAiQ0FHUiIsIHBhc3RlMChjYWdyX3ZhbHVlLCAiJSIpLCAiQ29tcG91bmQgQXZlcmFnZSBHcm93dGggUmF0ZTsgbWVhbiBncm93dGggcmF0ZSBvdmVyIGEgcGVyaW9kIGlmIGl0IGhhZCBjb21wb3VuZGVkIGFudWFsbHkuIiwNCiAgIk1lYW4iLCBwYXN0ZTAobWVhbl92YWx1ZSwgIiUiKSwgIlJlZmxlY3RzIHRoZSBnZW5lcmFsIHByaWNlIGxldmVsIGFuZCBvdmVyYWxsIGdyb3d0aCByYXRlLiIsDQogICJNZWRpYW4iLCBwYXN0ZTAobWVkaWFuX3ZhbHVlLCAiJSIpLCAiTWlkZGxlIHZhbHVlIG9mIHRoZSBkYXRhIHdoZW4gb3JkZXJlZCBjaHJvbm9sb2dpY2FsbHk7IGNlbnRyYWwgdGVuZGVuY3kgbWVhc3VyZSBsZXNzIGFmZmVjdGVkIGJ5IGV4dHJlbWUgdmFsdWVzLiIsDQogICJTdGFuZGFyZCBEZXZpYXRpb24gKFZvbGF0aWxpdHkpIiwgcGFzdGUwKHNkX3ZhbHVlLCAiJSIpLCAiVGhlIGRpc3BlcnNpb24gb2YgdmFsdWVzIGZyb20gdGhlIG1lYW4sIGluZGljYXRpbmcgdGhlIHZvbGF0aWxpdHkgb2YgcHJpY2UgY2hhbmdlcyBhbmQgZWNvbm9taWMgc3RhYmlsaXR5LiIsDQogICJNaW4gQ0FHUiBSYW5nZSAoQ0FHUiAtIFNEKSIsIHBhc3RlMChtaW5fY2Fncl9yYW5nZSwgIiUiKSwgIkxvd2VyIGJvdW5kYXJ5IG9mIGV4cGVjdGVkIEJsYWNrUm9jayByYW5nZTsgbG93ZXN0IGVzdGltYXRlIG9mIHR5cGljYWwgZ3Jvd3RoIHJhdGUgY29uc2lkZXJpbmcgbm9ybWFsIGZsdWN0dWF0aW9ucy4iLA0KICAiTWF4IENBR1IgUmFuZ2UgKENBR1IgKyBTRCkiLCBwYXN0ZTAobWF4X2NhZ3JfcmFuZ2UsICIlIiksICJVcHBlciBib3VuZGFyeSBvZiBleHBlY3RlZCBCbGFja1JvY2sgcmFuZ2U7IGhpZ2hlc3QgZXN0aW1hdGUgb2YgdHlwaWNhbCBncm93dGggcmF0ZSBjb25zaWRlcmluZyBub3JtYWwgZmx1Y3R1YXRpb25zLiIsDQogICJNaW5pbXVtIiwgcGFzdGUwKG1pbl92YWx1ZSwgIiUiKSwgIkxvd2VzdCBncm93dGggcmF0ZS4iLA0KICAiTWF4aW11bSIsIHBhc3RlMChtYXhfdmFsdWUsICIlIiksICJIaWdoZXN0IGdyb3d0aCByYXRlLiIsDQogICJQZXJjZW50IEFib3ZlIEluZmxhdGlvbiBUYXJnZXQiLCBwYXN0ZTAocGVyY2VudF9hYm92ZV90YXJnZXRfaW5mbGF0aW9uLCAiJSIpLCAiUGVyY2VudGFnZSBvZiB2YWx1ZXMgYWJvdmUgdGhlIGluZmxhdGlvbiB0YXJnZXQgc3BlY2lmaWVkIGluIFByZWZlcnJlZCBUYXJnZXRzIHNlY3Rpb24uIiwNCiAgIlBlcmNlbnQgQWJvdmUgQ29uc2VydmF0aXZlIFRhcmdldCIsIHBhc3RlMChwZXJjZW50X2Fib3ZlX3RhcmdldF9jb25zZXJ2YXRpdmUsICIlIiksICJQZXJjZW50YWdlIG9mIHZhbHVlcyBhYm92ZSB0aGUgY29uc2VydmF0aXZlIHRhcmdldCBzcGVjaWZpZWQgaW4gUHJlZmVycmVkIFRhcmdldHMgc2VjdGlvbi4iLA0KICAiUGVyY2VudCBBYm92ZSBNb2RlcmF0ZSBUYXJnZXQiLCBwYXN0ZTAocGVyY2VudF9hYm92ZV90YXJnZXRfbW9kZXJhdGUsICIlIiksICJQZXJjZW50YWdlIG9mIHZhbHVlcyBhYm92ZSB0aGUgbW9kZXJhdGUgdGFyZ2V0IHNwZWNpZmllZCBpbiBQcmVmZXJyZWQgVGFyZ2V0cyBzZWN0aW9uLiIsDQogICJQZXJjZW50IEFib3ZlIEFnZ3Jlc3NpdmUgVGFyZ2V0IiwgcGFzdGUwKHBlcmNlbnRfYWJvdmVfdGFyZ2V0X2FnZ3Jlc3NpdmUsICIlIiksICJQZXJjZW50YWdlIG9mIHZhbHVlcyBhYm92ZSB0aGUgYWdncmVzc2l2ZSB0YXJnZXQgc3BlY2lmaWVkIGluIFByZWZlcnJlZCBUYXJnZXRzIHNlY3Rpb24uIg0KKQ0KDQojIENvbnZlcnQgdG8gY2hhcmFjdGVyIHRvIGF2b2lkIGF1dG9tYXRpYyBkZWNpbWFsIHBvaW50cyBvbiB3aG9sZSBudW1iZXJzDQpibGFja3JvY2tfcmF3X3N1bW1hcnkgPC0gYmxhY2tyb2NrX3Jhd19zdW1tYXJ5ICU+JQ0KICBtdXRhdGUoYWNyb3NzKGV2ZXJ5dGhpbmcoKSwgYXMuY2hhcmFjdGVyKSkNCg0KIyBEaXNwbGF5IGZvcm1hdHRlZCB0YWJsZQ0KY2F0KCJcblxuIyMjIyBBbm51YWwgR3Jvd3RoIFJhdGUgU3VtbWFyeSAoIiwgbWluX3llYXIsICItIiwgbWF4X3llYXIsICIpXG4iLCBzZXAgPSAiIikNCmZvcm1hdF8zY29sX2N1c3RvbV93aWR0aHMoYmxhY2tyb2NrX3Jhd19zdW1tYXJ5LCBjb2wxX3dpZHRoID0gIjIwZW0iLCBjb2wyX3dpZHRoID0gIjEwZW0iLCBjb2wzX3dpZHRoID0gIjQwZW0iKSANCg0KIyBWaWV3KGJsYWNrcm9ja19yYXdfc3VtbWFyeSkNCmludGVyYWN0aXZlX3N0cihibGFja3JvY2tfcmF3X3N1bW1hcnkpDQoNCmBgYA0KDQpCbGFja1JvY2sgRW5kdXJhJ3MgSW5kZXggZXhoaWJpdHMgYSBgciBpZihjYWdyX3ZhbHVlID4gdGFyZ2V0X2FnZ3Jlc3NpdmUpICJhZ2dyZXNzaXZlIiBlbHNlIGlmKGNhZ3JfdmFsdWUgPiB0YXJnZXRfbW9kZXJhdGUpICJtb2RlcmF0ZSIgZWxzZSBpZihjYWdyX3ZhbHVlID4gdGFyZ2V0X2NvbnNlcnZhdGl2ZSkgImNvbnNlcnZhdGl2ZSIgZWxzZSBpZihjYWdyX3ZhbHVlID4gdGFyZ2V0X2luZmxhdGlvbikgImJhc2VsaW5lIiBlbHNlICJkaXNhcHBvaW50aW5nImAgQ0FHUiBhdCBgciBjYWdyX3ZhbHVlYCUsIGByIGlmKGNhZ3JfdmFsdWUgPCBtZWFuX3ZhbHVlKSAibG93ZXIgdGhhbiIgZWxzZSAiaGlnaGVyIHRoYW4iYCB0aGUgbWVhbiBncm93dGggcmF0ZSBvZiBgciBtZWFuX3ZhbHVlYCUsIHJlZmxlY3RpbmcgdGhlIGltcGFjdCBvZiBzaG9ydC10ZXJtIHZvbGF0aWxpdHkgYW5kIGByIGlmKGNhZ3JfdmFsdWUgPiBtZWFuX3ZhbHVlKSAiZGVjbGluZXMiIGVsc2UgImdyb3d0aCBzcGlrZXMiYC4gVGhlIG1lZGlhbiByZXR1cm4gb2YgYHIgbWVkaWFuX3ZhbHVlYCUgaW5kaWNhdGVzIHRoYXQgbW9yZSB0aGFuIGhhbGYgb2YgdGhlIG9ic2VydmVkIHllYXJzIGV4cGVyaWVuY2VkIHJldHVybnMgYHIgaWYoY2Fncl92YWx1ZSA8IG1lZGlhbl92YWx1ZSkgImFib3ZlIiBlbHNlICJiZWxvdyJgIHRoZSBtZWFuLiBUaGUgcmVsYXRpb25zaGlwIGJldHdlZW4gdGhlIENBR1IgYW5kIHRoZSBtZWRpYW4gZ3Jvd3RoIHJhdGUgc3VnZ2VzdHMgdGhhdCBzdXN0YWluZWQgcGVyaW9kcyBvZiBhYm92ZS1tZWRpYW4gZ3Jvd3RoIGhhdmUgZXhlcnRlZCBjdW11bGF0aXZlIGByIGlmKGNhZ3JfdmFsdWUgPCBtZWRpYW5fdmFsdWUpICJ1cHdhcmQgcHJlc3N1cmUiIGVsc2UgImRvd253YXJkIHByZXNzdXJlImAgb24gb3ZlcmFsbCBwcmljZSBsZXZlbHMuIFRoaXMgcmVsYXRpb25zaGlwIGhpZ2hsaWdodHMgYSBkaXN0cmlidXRpb24gd2l0aCBub3RhYmxlIGV4dHJlbWVzIG9uIHRoZSBgciBpZihjYWdyX3ZhbHVlIDwgbWVhbl92YWx1ZSkgImhpZ2hlciIgZWxzZSAibG93ZXIiYCBlbmQsIHJlZmxlY3RpbmcgYHIgaWYoY2Fncl92YWx1ZSA8IG1lYW5fdmFsdWUpICJwb3NpdGl2ZSIgZWxzZSAibmVnYXRpdmUiYCBza2V3bmVzcy4gVGhpcyBgciBpZihjYWdyX3ZhbHVlIDwgbWVkaWFuX3ZhbHVlKSAicG9zaXRpdmUiIGVsc2UgIm5lZ2F0aXZlImAgc2tld25lc3MgaW1wbGllcyB0aGF0IHdoaWxlIG1vcmUgdGhhbiBoYWxmIG9mIHRoZSBvYnNlcnZlZCB5ZWFycyBleHBlcmllbmNlZCByZXR1cm5zIGByIGlmKGNhZ3JfdmFsdWUgPCBtZWRpYW5fdmFsdWUpICJhYm92ZSB0aGUgbWVhbiwgZG93bnR1cm5zIGNhbiBiZSBzZXZlcmUiIGVsc2UgImJlbG93IHRoZSBtZWFuLCB1cHR1cm5zIGNhbiBiZSBzaWduaWZpY2FudCJgLiBIb3dldmVyLCB0aGUgbWFya2V0IGhhcyBoaXN0b3JpY2FsbHkgcHJvdmlkZWQgc3Vic3RhbnRpYWwgYHIgaWYoY2Fncl92YWx1ZSA8IG1lZGlhbl92YWx1ZSkgInVwc2lkZSBwb3RlbnRpYWwiIGVsc2UgImRvd25zaWRlIHJpc2siYC4gQWRkaXRpb25hbGx5LCB0aGUgZmFjdCB0aGF0IGByIHBlcmNlbnRfYWJvdmVfdGFyZ2V0X2luZmxhdGlvbmAlIG9mIHRoZSB5ZWFycyBleGNlZWRlZCB0aGUgaW5mbGF0aW9uIHRhcmdldCBgciBpZiAocGVyY2VudF9hYm92ZV90YXJnZXRfaW5mbGF0aW9uID4gNzApICJyZWluZm9yY2VzIEJsYWNrUm9jayBFbmR1cmEncyBlZmZlY3RpdmVuZXNzIGFzIGEgc3Ryb25nIGxvbmctdGVybSBoZWRnZSIgZWxzZSBpZiAocGVyY2VudF9hYm92ZV90YXJnZXRfaW5mbGF0aW9uID4gNjApICJyZWluZm9yY2VzIEJsYWNrUm9jayBFbmR1cmEncyBlZmZlY3RpdmVuZXNzIGFzIGEgbG9uZy10ZXJtIGhlZGdlIiBlbHNlIGlmIChwZXJjZW50X2Fib3ZlX3RhcmdldF9pbmZsYXRpb24gPiA1MCkgInF1ZXN0aW9ucyBCbGFja1JvY2sgRW5kdXJhJ3MgZWZmZWN0aXZlbmVzcyAgYXMgYSBsb25nLXRlcm0gaGVkZ2UiIGVsc2UgInVuZGVybWluZXMgQmxhY2tSb2NrIEVuZHVyYSdzIGVmZmVjdGl2ZW5lc3MgYXMgYSBsb25nLXRlcm0gaGVkZ2UiYCBhZ2FpbnN0IGluZmxhdGlvbi4NCg0KVGhlIHN0YW5kYXJkIGRldmlhdGlvbiBvZiBgciBzZF92YWx1ZWAlIGByIGlmKHNkX3ZhbHVlID4gMjApICJpbmRpY2F0ZXMgZXh0cmVtZSB2b2xhdGlsaXR5LCByZWZsZWN0aW5nIHN1YnN0YW50aWFsIGZsdWN0dWF0aW9ucyBpbiBlcXVpdHkgbWFya2V0cyIgZWxzZSBpZihzZF92YWx1ZSA+IDE1KSAidW5kZXJzY29yZXMgc2lnbmlmaWNhbnQgdm9sYXRpbGl0eSwgYSBjb21tb24gZmVhdHVyZSBvZiBlcXVpdHkgbWFya2V0cyIgZWxzZSAic3VnZ2VzdHMgbW9kZXJhdGUgdm9sYXRpbGl0eSwgdHlwaWNhbCBvZiByZWxhdGl2ZWx5IHN0YWJsZSBtYXJrZXRzImAuIFRoZSBgciByYW5nZV9yYXRpbyA8LSAobWF4X3ZhbHVlIC0gbWluX3ZhbHVlKSAvIHNkX3ZhbHVlOyBpZihyYW5nZV9yYXRpbyA+IDUpICJoaWdobHkgdm9sYXRpbGUiIGVsc2UgaWYocmFuZ2VfcmF0aW8gPiAzKSAibm90YWJsZSIgZWxzZSAiY29tcGFyYXRpdmVseSBzdGFibGUiYCByYW5nZSBvZiBhbm51YWwgcmV0dXJucywgc3Bhbm5pbmcgZnJvbSBgciBtaW5fdmFsdWVgJSB0byBgciBtYXhfdmFsdWVgJSwgYHIgaWYocmFuZ2VfcmF0aW8gPiA1KSAiaWxsdXN0cmF0ZXMgYSBoaWdobHkgdm9sYXRpbGUgbWFya2V0IGVudmlyb25tZW50LCBwYXJ0bHkgZHVlIHRvIGl0cyBjb21wb3NpdGlvbiwgd2l0aCB0aGUgcG90ZW50aWFsIGZvciBib3RoIGV4dHJlbWUgZ2FpbnMgYW5kIGxvc3NlcyIgZWxzZSBpZihyYW5nZV9yYXRpbyA+IDMpICJoaWdobGlnaHRzIG5vdGFibGUgbWFya2V0IHZhcmlhYmlsaXR5LCBwYXJ0bHkgZHVlIHRvIGl0cyBjb21wb3NpdGlvbiwgIHJlZmxlY3RpbmcgYm90aCBvcHBvcnR1bml0aWVzIGFuZCByaXNrcyIgZWxzZSAiaW5kaWNhdGVzIGEgY29tcGFyYXRpdmVseSBzdGFibGUgbWFya2V0LCBwYXJ0bHkgZHVlIHRvIGl0cyBjb21wb3NpdGlvbiwgd2l0aCBsZXNzIGV4dHJlbWUgYW5udWFsIGZsdWN0dWF0aW9ucyJgLiANCg0KRm9yIEJsYWNrUm9jayBFbmR1cmEgdG8gYmUgY29uc2lkZXJlZCBhIGhpZ2gtcGVyZm9ybWluZyBhbmQgcmVzaWxpZW50IGxvbmctdGVybSBpbnZlc3RtZW50LCBpdCB3b3VsZCBiZSBpZGVhbCB0byBleGNlZWQgdGhlIGFnZ3Jlc3NpdmUgdGFyZ2V0IChlLmcuLCBgciAodGFyZ2V0X2FnZ3Jlc3NpdmUgLSB0YXJnZXRfaW5mbGF0aW9uKWAlIGFubnVhbGl6ZWQgcmV0dXJucywgYWNjb3VudGluZyBmb3IgaGlnaGVyIGluZmxhdGlvbi1hZGp1c3RlZCBwZXJmb3JtYW5jZSBleHBlY3RhdGlvbnMpIGluIGF0IGxlYXN0IDQwJS01MCUgb2YgdGhlIHllYXJzLiBUaGlzIHJhbmdlIHJlZmxlY3RzIHRoZSBwb3RlbnRpYWwgZm9yIHN0cm9uZyB1cHNpZGUgaW4gbWFueSB5ZWFycyB3aGlsZSBiYWxhbmNpbmcgdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBtYXJrZXRzIGRvIGV4cGVyaWVuY2UgZG93bnR1cm5zLiBUaGUgZmFjdCB0aGF0IGByIHBlcmNlbnRfYWJvdmVfdGFyZ2V0X2FnZ3Jlc3NpdmVgJSBvZiB0aGUgeWVhcnMgZXhjZWVkZWQgdGhlIGFnZ3Jlc3NpdmUgdGFyZ2V0IGByIGlmKHBlcmNlbnRfYWJvdmVfdGFyZ2V0X2FnZ3Jlc3NpdmUgPiA1MCkgImluZGljYXRlcyBjb25zaXN0ZW50IGFuZCByb2J1c3QgZ3Jvd3RoLCBtYWtpbmcgQmxhY2tSb2NrIEVuZHVyYSBhIHN0cm9uZyBvcHRpb24gZm9yIHRob3NlIHNlZWtpbmcgYWdncmVzc2l2ZSBpbnZlc3RtZW50cy4iIGVsc2UgaWYocGVyY2VudF9hYm92ZV90YXJnZXRfYWdncmVzc2l2ZSA+IDQwKSAic3VnZ2VzdHMgdGhhdCB3aGlsZSBub3QgY29uc2lzdGVudCwgQmxhY2tSb2NrIEVuZHVyYSBoYXMgaGlzdG9yaWNhbGx5IHByb3ZpZGVkIHJvYnVzdCBncm93dGggb3ZlciB0aGUgbG9uZyB0ZXJtLCBtYWtpbmcgaXQgYSB2aWFibGUgaW52ZXN0bWVudCBmb3IgdGhvc2Ugd2l0aCBhIGhpZ2hlciByaXNrIHRvbGVyYW5jZS4iIGVsc2UgInJhaXNlcyBjb25jZXJucyBhYm91dCBCbGFja1JvY2sgRW5kdXJhJ3MgYWJpbGl0eSB0byBtZWV0IGFnZ3Jlc3NpdmUgZ3Jvd3RoIHRhcmdldHMsIG1ha2luZyBpdCBsZXNzIHN1aXRhYmxlIGZvciBpbnZlc3RvcnMgd2l0aCBoaWdoZXIgcmlzayB0b2xlcmFuY2UuImANCg0KDQojIyMgR3JhcGgNCg0KYGBge3IgYmxhY2tyb2NrX3Jhd19ncmFwaCwgZmlnLndpZHRoPTEwLCBmaWcuaGVpZ2h0PTd9DQoNCiMgTG9hZCBuZWNlc3NhcnkgbGlicmFyaWVzDQpsaWJyYXJ5KGdncGxvdDIpDQpsaWJyYXJ5KGRwbHlyKQ0KDQojIENvbnZlcnQgYDEtWWVhciBDQUdSYCB0byBudW1lcmljIGZvciBwbG90dGluZw0KYmxhY2tyb2NrX3JhdyA8LSBibGFja3JvY2tfcmF3ICU+JQ0KICBtdXRhdGUoDQogICAgYERhdGVgID0gYXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIoYERhdGVgKSksICAjIEVuc3VyZSBEYXRlIGlzIG51bWVyaWMNCiAgICBgMS1ZZWFyIENBR1JgID0gYXMubnVtZXJpYyhnc3ViKCIlIiwgIiIsIGAxLVllYXIgQ0FHUmApKQ0KICApDQoNCiMgRmluZCB0aGUgbWluaW11bSBhbmQgbWF4aW11bSB4LXZhbHVlIGluIHlvdXIgZGF0YQ0KbWF4X3ggPC0gbWF4KGFzLmludGVnZXIoYmxhY2tyb2NrX3JhdyREYXRlKSwgbmEucm0gPSBUUlVFKQ0KbWluX3ggPC0gbWluKGFzLmludGVnZXIoYmxhY2tyb2NrX3JhdyREYXRlKSwgbmEucm0gPSBUUlVFKQ0KaW50ZXJhY3RpdmVfcHJpbnQobWF4X3gpICAjIFRlc3QNCmludGVyYWN0aXZlX3ByaW50KG1pbl94KSAgIyBUZXN0DQoNCiMgRmluZCB0aGUgbWluaW11bSBhbmQgbWF4aW11bSB5ZWFyDQptaW5feWVhciA8LSBtaW4oYmxhY2tyb2NrX3JhdyREYXRlLCBuYS5ybSA9IFRSVUUpDQptYXhfeWVhciA8LSBtYXgoYmxhY2tyb2NrX3JhdyREYXRlLCBuYS5ybSA9IFRSVUUpDQppbnRlcmFjdGl2ZV9wcmludChtaW5feWVhcikNCmludGVyYWN0aXZlX3ByaW50KG1heF95ZWFyKQ0KDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KIyMgUExPVCBGVUxMIFdJVEhPVVQgTElNSVRTDQoNCiMgRGVmaW5lIHN0YXJ0IGFuZCBlbmQgeWVhcnMNCnN0YXJ0X3llYXIgPC0gYXMubnVtZXJpYyhtaW5feWVhcikNCmVuZF95ZWFyIDwtIDIwMjQNCnllYXJfcmFuZ2UgPC0gZW5kX3llYXIgLSBzdGFydF95ZWFyICsgMSAgIyBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiB5ZWFycw0KDQojIERlZmluZSBicmVha3Mgcm91bmRlZCBhcHByb3ByaWF0ZWx5DQpsaW1pdHNfc3RhcnRfeWVhciA8LSBmbG9vcihzdGFydF95ZWFyIC8gMikgKiAyICAjIFJvdW5kIGRvd24gdG8gdGhlIG5lYXJlc3QgbXVsdGlwbGUgb2YgNQ0KbGltaXRzX2VuZF95ZWFyIDwtIGNlaWxpbmcoZW5kX3llYXIgLyAyKSAqIDIgICAjIFJvdW5kIHVwIHRvIHRoZSBuZWFyZXN0IG11bHRpcGxlIG9mIDUNCg0KIyBDcmVhdGUgZHluYW1pYyB0aXRsZSBhbmQgY2FwdGlvbg0KZHluYW1pY190aXRsZSA8LSBwYXN0ZTAoIkFubnVhbCBHcm93dGggUmF0ZXMgT3ZlciAiLHllYXJfcmFuZ2UsICIgWWVhcnMgKCIsIHN0YXJ0X3llYXIsICItIiwgZW5kX3llYXIsICIpIikNCmR5bmFtaWNfY2FwdGlvbiA8LSBwYXN0ZTAoIkJsYWNrUm9jayBBbm51YWwgR3Jvd3RoIFJhdGVzLCBEYXRhIFBlcmlvZCAoIiwgbWluX3llYXIsICLigJMiLCBtYXhfeWVhciwgIikiKQ0KDQojIENyZWF0ZSB0aGUgZnVsbCwgbm9uLWZpbHRlcmVkIHgtYXhpcyBwbG90IHdpdGggZHluYW1pYyB4IHBsYWNlbWVudCBmb3IgYW5ub3RhdGlvbnMNCnAxIDwtIGdncGxvdChibGFja3JvY2tfcmF3LCBhZXMoeCA9IGFzLmludGVnZXIoRGF0ZSksIHkgPSBgMS1ZZWFyIENBR1JgKSkgKw0KICANCiAgIyBBZGQgc2hhZGVkIGFyZWFzIGZvciBiYWNrZ3JvdW5kIGVmZmVjdA0KICBnZW9tX3JlY3QoYWVzKHhtaW4gPSAtSW5mLCB4bWF4ID0gSW5mLCB5bWluID0gdGFyZ2V0X2FnZ3Jlc3NpdmUsIHltYXggPSBJbmYpLCBmaWxsID0gImxpZ2h0Z3JlZW4iLCBhbHBoYSA9IDAuMDUwKSArDQogIGdlb21fcmVjdChhZXMoeG1pbiA9IC1JbmYsIHhtYXggPSBJbmYsIHltaW4gPSB0YXJnZXRfY29uc2VydmF0aXZlLCB5bWF4ID0gdGFyZ2V0X2FnZ3Jlc3NpdmUpLCBmaWxsID0gIm9yYW5nZSIsIGFscGhhID0gMC4wNTApICsNCiAgZ2VvbV9yZWN0KGFlcyh4bWluID0gLUluZiwgeG1heCA9IEluZiwgeW1pbiA9IC1JbmYsIHltYXggPSB0YXJnZXRfY29uc2VydmF0aXZlKSwgZmlsbCA9ICJsaWdodGNvcmFsIiwgYWxwaGEgPSAwLjA1MCkgKw0KICANCiAgIyBQbG90IGxpbmVzLCBwb2ludHMsIGFuZCBhbm5vdGF0aW9ucyBvbiB0b3Agb2Ygc2hhZGVkIGFyZWFzDQogIGdlb21fbGluZShjb2xvciA9ICIjNEIwMDgyIiwgc2l6ZSA9IDEuMCkgKyAgICAgICAjIERhcmsgcHVycGxlIGxpbmUgDQogIGdlb21fcG9pbnQoY29sb3IgPSAiIzRCMDA4MiIsIHNpemUgPSAxLjUpICsgICAgICAgICMgRGFyayBwdXJwbGUgcG9pbnRzIA0KICANCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gdGFyZ2V0X2FnZ3Jlc3NpdmUsIGNvbG9yID0gImRhcmtibHVlIiwgbGluZXR5cGUgPSAic29saWQiKSArDQogICMgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gdGFyZ2V0X21vZGVyYXRlLCBjb2xvciA9ICJkYXJrYmx1ZSIsIGxpbmV0eXBlID0gInNvbGlkIikgKw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSB0YXJnZXRfY29uc2VydmF0aXZlLCBjb2xvciA9ICJkYXJrYmx1ZSIsIGxpbmV0eXBlID0gInNvbGlkIikgKw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSB0YXJnZXRfaW5mbGF0aW9uLCBjb2xvciA9ICJkYXJrcmVkIiwgbGluZXR5cGUgPSAiZGFzaGVkIikgKw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSBjYWdyX3ZhbHVlLCBjb2xvciA9ICJkYXJrcmVkIiwgbGluZXR5cGUgPSAiZGFzaGVkIikgKw0KICANCiAgIyBEeW5hbWljIHJpZ2h0LWFsaWduZWQgcGxhY2VtZW50IGZvciBhbm5vdGF0aW9ucw0KICBhbm5vdGF0ZSgidGV4dCIsIHggPSBJbmYsIHkgPSB0YXJnZXRfYWdncmVzc2l2ZSwgbGFiZWwgPSAiQWdncmVzc2l2ZSIsIA0KICAgICAgICAgICBoanVzdCA9IDEsIHZqdXN0ID0gLTAuNTAsIGNvbG9yID0gImRhcmtibHVlIiwgc2l6ZSA9IDQpICsNCiAgIyBhbm5vdGF0ZSgidGV4dCIsIHggPSBJbmYsIHkgPSB0YXJnZXRfbW9kZXJhdGUsIGxhYmVsID0gIk1vZGVyYXRlIiwgDQogICMgICAgICAgICBoanVzdCA9IDEsIHZqdXN0ID0gLTAuNTAsIGNvbG9yID0gImRhcmtibHVlIiwgc2l6ZSA9IDQpICsNCiAgYW5ub3RhdGUoInRleHQiLCB4ID0gSW5mLCB5ID0gdGFyZ2V0X2NvbnNlcnZhdGl2ZSwgbGFiZWwgPSAiQ29uc2VydmF0aXZlIiwgDQogICAgICAgICAgIGhqdXN0ID0gMSwgdmp1c3QgPSAtMC41MCwgY29sb3IgPSAiZGFya2JsdWUiLCBzaXplID0gNCkgKw0KICBhbm5vdGF0ZSgidGV4dCIsIHggPSBJbmYsIHkgPSB0YXJnZXRfaW5mbGF0aW9uLCBsYWJlbCA9ICJJbmZsYXRpb24iLCANCiAgICAgICAgICAgaGp1c3QgPSAxLCB2anVzdCA9ICsxLjEwLCBjb2xvciA9ICJkYXJrcmVkIiwgc2l6ZSA9IDQpICsNCiAgYW5ub3RhdGUoInRleHQiLCB4ID0gSW5mLCB5ID0gY2Fncl92YWx1ZSwgbGFiZWwgPSAiQ0FHUiIsIA0KICAgICAgICAgICBoanVzdCA9IDEsIHZqdXN0ID0gLTAuNTAsIGNvbG9yID0gImRhcmtyZWQiLCBzaXplID0gNCkgKyANCg0KICBsYWJzKA0KICAgIHRpdGxlID0gZHluYW1pY190aXRsZSwNCiAgICB4ID0gIlllYXIiLA0KICAgIHkgPSAiR3Jvd3RoIFJhdGUgKCUpIiwNCiAgICBjYXB0aW9uID0gZHluYW1pY19jYXB0aW9uDQogICkgKw0KDQogIHNjYWxlX3hfY29udGludW91cygNCiAgICBsaW1pdHMgPSBjKHN0YXJ0X3llYXIsIGVuZF95ZWFyICsgMSksICMgUmVzdHJpY3RzIHgtYXhpcyBkYXRhIA0KICAgIGJyZWFrcyA9IHNlcShsaW1pdHNfc3RhcnRfeWVhciwgbGltaXRzX2VuZF95ZWFyLCAyKSAjIFNldHMgTWFqb3IgeC1heGlzICANCiAgKSArICAjIFJlc3RyaWN0ICYgU2V0IE1ham9yIHgtYXhpcyBsaW5lcyANCiAgICANCiAgdGhlbWVfbWluaW1hbCgpICsNCiAgdGhlbWUoDQogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSwgc2l6ZSA9IDIwKSwgICAgICAgICAjIExhcmdlciB0aXRsZSBmb250DQogICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCksICAgICAgICAgICAgICAgICAgICAjIExhcmdlciB4LWF4aXMgbGFiZWwgZm9udA0KICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQpLCAgICAgICAgICAgICAgICAgICAgIyBMYXJnZXIgeS1heGlzIGxhYmVsIGZvbnQNCiAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEsIHNpemUgPSAxNCksICAjIExhcmdlciB4LWF4aXMgdGV4dA0KICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCksICAgICAgICAgICAgICAgICAgICAgIyBMYXJnZXIgeS1heGlzIHRleHQNCiAgICBwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9saW5lKGxpbmV0eXBlID0gImRvdHRlZCIsIGNvbG9yID0gImJsYWNrIiksICAgICAgICAgIyBNYWpvciBncmlkIGxpbmVzDQogICAgcGFuZWwuZ3JpZC5taW5vci54ID0gZWxlbWVudF9ibGFuaygpLCAjIGVsZW1lbnRfbGluZShjb2xvciA9ICJncmV5ODAiKSAgIyBNaW5vciB4IGdyaWQgbGluZXMgZm9yIGVhY2ggeWVhcg0KICAgICMgcGFuZWwuYm9yZGVyID0gZWxlbWVudF9yZWN0KGNvbG9yID0gImRhcmtncmV5IiwgZmlsbCA9IE5BLCBzaXplID0gMS4wKSAgIyBEYXJrIGJvcmRlciBhcm91bmQgdGhlIHBsb3QNCiAgICBheGlzLnRpY2tzLmxlbmd0aCA9IHVuaXQoLTAuMjUsICJjbSIpLCAgICAgICAgICAgICAgICAgICAgICAjIEluY3JlYXNlIHRpY2sgbGVuZ3RoDQogICAgYXhpcy50aWNrcyA9IGVsZW1lbnRfbGluZShjb2xvciA9ICJibGFjayIsIHNpemUgPSAwLjUwKSwgIyBEYXJrZXIgdGlja3MNCiAgICBheGlzLmxpbmUueCA9IGVsZW1lbnRfbGluZShjb2xvciA9ICJibGFjayIsIHNpemUgPSAwLjc1KSwgICMgRGFyayBib3R0b20gYm9yZGVyDQogICAgYXhpcy5saW5lLnkgPSBlbGVtZW50X2xpbmUoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMC43NSkgICAjIERhcmsgbGVmdCBib3JkZXINCiAgKQ0KDQpwcmludChwMSkNCg0KYGBgDQoNCiMjIEJsYWNrUm9jayBDQUdSDQoNCiMjIyBEYXRhDQoNCkR1ZSB0byBCbGFja1JvY2sgRW5kdXJhJ3MgaW5jZXB0aW9uIGluIDIwMTYsIHRoZXJlIGlzIGluc3VmZmljaWVudCBkYXRhIHRvIGNhbGN1bGF0ZSB0aGUgMTAteWVhciwgMjAteWVhciBhbmQgMzAteWVhciBDQUdScy4gDQoNCmBgYHtyIGJsYWNrcm9ja19yYXdfZ3IsIGV2YWw9VFJVRSwgZWNobz1GQUxTRX0NCg0KIyBWaWV3KGJsYWNrcm9ja19yYXdfZ3IpDQppbnRlcmFjdGl2ZV9zdHIobnJ0JGJsYWNrcm9ja19yYXdfZ3IpDQoNCmxpYnJhcnkoZHBseXIpDQpsaWJyYXJ5KGx1YnJpZGF0ZSkgICMgRm9yIGRhdGUgbWFuaXB1bGF0aW9uDQpsaWJyYXJ5KHNjYWxlcykNCmxpYnJhcnkoc3RyaW5ncikNCg0KIyBVcGRhdGUgZGF0YSBmcmFtZSB3aXRoIHByb3BlciBkYXRlIGFuZCBwZXJjZW50YWdlIGhhbmRsaW5nDQpibGFja3JvY2tfcmF3X2dyIDwtIG5ydCRibGFja3JvY2tfcmF3X2dyICU+JQ0KICBtdXRhdGUoDQogICAgIyBDb252ZXJ0IENsb3NlIERhdGUgdG8gIllZWVktTU0tREQiIGZvcm1hdA0KICAgIGBEYXRlYCA9IGZvcm1hdChhcy5EYXRlKGFzLmNoYXJhY3RlcihgRGF0ZWApLCBvcmlnaW4gPSAiMTk3MC0wMS0wMSIpLCAiJVktJW0tJWQiKSwNCiAgICANCiAgICAjIEVuc3VyZSBDbG9zZSBpcyBhIG51bWJlciBmb3JtYXR0ZWQgdG8gMiBkZWNpbWFsIHBsYWNlcw0KICAgIGBDbG9zZWAgPSBudW1iZXIoYXMubnVtZXJpYyhnc3ViKCIsIiwgIiIsIENsb3NlKSksIGJpZy5tYXJrID0gIiwiLCBkZWNpbWFsLm1hcmsgPSAiLiIsIGFjY3VyYWN5ID0gMC4wMSksDQoNCiAgICAjIENsZWFuIGFuZCBoYW5kbGUgcGVyY2VudGFnZSBjb2x1bW5zDQogICAgYWNyb3NzKDM6MTEsIH4gew0KICAgICAgdmFsdWUgPC0gZ3N1YigiWywlXFxzXSIsICIiLCAuKSAgIyBSZW1vdmUgJSwgY29tbWFzLCBhbmQgc3BhY2VzDQogICAgICBudW1lcmljX3ZhbHVlIDwtIHN1cHByZXNzV2FybmluZ3MoYXMubnVtZXJpYyh2YWx1ZSkpICAjIENvbnZlcnQgdG8gbnVtZXJpYw0KICAgICAgaWZlbHNlKA0KICAgICAgICAhaXMubmEobnVtZXJpY192YWx1ZSksIA0KICAgICAgICBwYXN0ZTAoZm9ybWF0KHJvdW5kKG51bWVyaWNfdmFsdWUqMTAwLCAyKSwgYmlnLm1hcmsgPSAiLCIsIHNjaWVudGlmaWMgPSBGQUxTRSksICIlIiksICAjIEZvcm1hdCB0byAyIGRlY2ltYWwgcGxhY2VzIGFuZCBhZGQgY29tbWFzDQogICAgICAgIC4NCiAgICAgICkNCiAgICB9KQ0KICApICU+JQ0KICBhcnJhbmdlKGRlc2MoYERhdGVgKSkgICMgU29ydCBieSBEYXRlIGZyb20gbmV3ZXN0IHRvIG9sZGVzdA0KDQojIENyZWF0ZSBibGFja3JvY2tfcmF3X2dyOiBDR1INCmJsYWNrcm9ja19yYXdfY2dyIDwtIGJsYWNrcm9ja19yYXdfZ3IgJT4lDQogIHNlbGVjdChgRGF0ZWAsIGBDbG9zZWAsIGAxLVllYXIgQ0FHUmAsIGNvbnRhaW5zICgiQ0dSIikpDQoNCiMgQ3JlYXRlIGJsYWNrcm9ja19yYXdfZ3I6IENBR1INCmJsYWNrcm9ja19yYXdfY2FnciA8LSBibGFja3JvY2tfcmF3X2dyICU+JQ0KICBzZWxlY3QoYERhdGVgLCBgQ2xvc2VgLCBjb250YWlucyAoIkNBR1IiKSkNCg0KIyBEaXNwbGF5IGJvdGggdGFibGVzIGZvciBjb25maXJtYXRpb24NCmludGVyYWN0aXZlX3ByaW50KGJsYWNrcm9ja19yYXdfY2dyKQ0KaW50ZXJhY3RpdmVfcHJpbnQoYmxhY2tyb2NrX3Jhd19jYWdyKQ0KDQojIE9wdGlvbmFsOiBQcmludCB0YWJsZSBzdW1tYXJpZXMNCmludGVyYWN0aXZlX3N0cihibGFja3JvY2tfcmF3X2NncikNCmludGVyYWN0aXZlX3N0cihibGFja3JvY2tfcmF3X2NhZ3IpDQoNCiMgRGlzcGxheSBjYXB0aW9ucyBmb3IgZWFjaCB0YWJsZQ0KIyBjYXQoIlxuXG4jIyMjIEN1bXVsYXRpdmUgR3Jvd3RoIFJhdGVzICgiLCBtaW5feWVhciwgIi0iLCBtYXhfeWVhciwgIilcbiIsIHNlcCA9ICIiKQ0KIyBmb3JtYXRfZXF1YWxfd2lkdGgoYmxhY2tyb2NrX3Jhd19jZ3IpDQoNCmNhdCgiXG5cbiMjIyMgQ29tcG91bmQgQXZlcmFnZSBHcm93dGggUmF0ZXMgKCIsIG1pbl95ZWFyLCAiLSIsIG1heF95ZWFyLCAiKVxuIiwgc2VwID0gIiIpDQpmb3JtYXRfZXF1YWxfd2lkdGgoYmxhY2tyb2NrX3Jhd19jYWdyKQ0KDQojIFZpZXcoYmxhY2tyb2NrX3Jhd19jYWdyKQ0KIyBjb2xuYW1lcyhibGFja3JvY2tfcmF3X2NhZ3IpDQppbnRlcmFjdGl2ZV9zdHIoYmxhY2tyb2NrX3Jhd19jYWdyKQ0KDQoNCmBgYA0KDQojIyMgU3VtbWFyeQ0KDQpgYGB7ciBibGFja3JvY2tfcmF3X2NhZ3Jfc3VtbWFyeSwgZXZhbD1UUlVFLCBlY2hvPUZBTFNFfQ0KDQppbnRlcmFjdGl2ZV9zdHIoYmxhY2tyb2NrX3Jhd19jYWdyKQ0KDQojIExvYWQgbmVjZXNzYXJ5IGxpYnJhcmllcw0KbGlicmFyeShkcGx5cikNCmxpYnJhcnkodGliYmxlKQ0KDQojIERlZmluZSBhIGhlbHBlciBmdW5jdGlvbiB0byBjbGVhbiBhbmQgY29udmVydCBwZXJjZW50YWdlcw0KY2xlYW5fcGVyY2VudGFnZSA8LSBmdW5jdGlvbihjb2x1bW4pIHsNCiAgYXMubnVtZXJpYyhnc3ViKCIlIiwgIiIsIGNvbHVtbikpDQp9DQoNCiMgRGVmaW5lIHRoZSBzdGF0aXN0aWMgbmFtZXMgZm9yIHRoZSBzdW1tYXJ5IHRhYmxlDQpzdGF0aXN0aWNfbmFtZXMgPC0gYygNCiAgIkNvdW50IG9mIE9ic2VydmF0aW9ucyIsIA0KICAiTWVhbiIsIA0KICAiTWVkaWFuIiwNCiAgIlN0YW5kYXJkIERldmlhdGlvbiAoVm9sYXRpbGl0eSkiLCANCiAgIk1pbiBDQUdSIFJhbmdlIChDQUdSIC0gU0QpIiwNCiAgIk1heCBDQUdSIFJhbmdlIChDQUdSICsgU0QpIiwNCiAgIk1pbmltdW0iLCANCiAgIk1heGltdW0iLCANCiAgIlBlcmNlbnQgQWJvdmUgSW5mbGF0aW9uIFRhcmdldCIsIA0KICAiUGVyY2VudCBBYm92ZSBDb25zZXJ2YXRpdmUgVGFyZ2V0IiwgDQogICJQZXJjZW50IEFib3ZlIE1vZGVyYXRlIFRhcmdldCIsIA0KICAiUGVyY2VudCBBYm92ZSBBZ2dyZXNzaXZlIFRhcmdldCINCikNCg0KIyBBZGp1c3QgdGhlIGZpcnN0IHJvdydzIERhdGUgYW5kIGNsZWFuIHVwIENBR1IgY29sdW1ucw0KYmxhY2tyb2NrX3Jhd19jYWdyIDwtIGJsYWNrcm9ja19yYXdfY2FnciAlPiUNCiAgc2xpY2UoLTEpICU+JSAjIFJlbW92ZSB0aGUgZmlyc3Qgcm93DQogIG11dGF0ZSgNCiAgICAjIERhdGUgPSBpZmVsc2Uocm93X251bWJlcigpID09IDEsICIyMDI1LTAxLTAxIiwgRGF0ZSksDQogICAgRGF0ZSA9IGFzLm51bWVyaWMoZm9ybWF0KGFzLkRhdGUoRGF0ZSksICIlWSIpKSwNCiAgICBgMS1ZZWFyIENBR1JgID0gY2xlYW5fcGVyY2VudGFnZShgMS1ZZWFyIENBR1JgKSwNCiAgICBgNS1ZZWFyIENBR1JgID0gY2xlYW5fcGVyY2VudGFnZShgNS1ZZWFyIENBR1JgKSwNCiAgICBgMTAtWWVhciBDQUdSYCA9IGNsZWFuX3BlcmNlbnRhZ2UoYDEwLVllYXIgQ0FHUmApLA0KICAgIGAyMC1ZZWFyIENBR1JgID0gY2xlYW5fcGVyY2VudGFnZShgMjAtWWVhciBDQUdSYCksDQogICAgYDMwLVllYXIgQ0FHUmAgPSBjbGVhbl9wZXJjZW50YWdlKGAzMC1ZZWFyIENBR1JgKQ0KICApDQoNCiMgRnVuY3Rpb24gdG8gY2FsY3VsYXRlIHN0YXRpc3RpY3MgZm9yIGEgZ2l2ZW4gZGF0YXNldA0KY2FsY19zdGF0cyA8LSBmdW5jdGlvbihkYXRhKSB7DQogIGlmIChzdW0oIWlzLm5hKGRhdGEpKSA8IDIpIHJldHVybihyZXAoTkEsIGxlbmd0aChzdGF0aXN0aWNfbmFtZXMpKSkgICMgSGFuZGxlIGluc3VmZmljaWVudCBkYXRhDQoNCiAgY291bnRfb2JzZXJ2YXRpb25zIDwtIHN1bSghaXMubmEoZGF0YSkpDQogIG1lYW5fdmFsdWUgPC0gcm91bmQobWVhbihkYXRhLCBuYS5ybSA9IFRSVUUpLCAyKQ0KICBtZWRpYW5fdmFsdWUgPC0gcm91bmQobWVkaWFuKGRhdGEsIG5hLnJtID0gVFJVRSksIDIpDQogIHNkX3ZhbHVlIDwtIHJvdW5kKHNkKGRhdGEsIG5hLnJtID0gVFJVRSksIDIpDQogIG1pbl9jYWdyX3JhbmdlIDwtIHJvdW5kKGNhZ3JfdmFsdWUgLSBzZF92YWx1ZSwgMikNCiAgbWF4X2NhZ3JfcmFuZ2UgPC0gcm91bmQoY2Fncl92YWx1ZSArIHNkX3ZhbHVlLCAyKQ0KICBtaW5fdmFsdWUgPC0gcm91bmQobWluKGRhdGEsIG5hLnJtID0gVFJVRSksIDIpDQogIG1heF92YWx1ZSA8LSByb3VuZChtYXgoZGF0YSwgbmEucm0gPSBUUlVFKSwgMikNCiAgDQogICMgRGVmaW5lIGluZmxhdGlvbiBhbmQgZ3Jvd3RoIHRhcmdldHMNCiAgdGFyZ2V0X2luZmxhdGlvbiA8LSAyICAjIEV4YW1wbGUgdGFyZ2V0IGZvciBpbmZsYXRpb24NCiAgdGFyZ2V0X2NvbnNlcnZhdGl2ZSA8LSAzICsgdGFyZ2V0X2luZmxhdGlvbg0KICB0YXJnZXRfbW9kZXJhdGUgPC0gNSArIHRhcmdldF9pbmZsYXRpb24NCiAgdGFyZ2V0X2FnZ3Jlc3NpdmUgPC0gMTAgKyB0YXJnZXRfaW5mbGF0aW9uDQogIA0KICBhYm92ZV90YXJnZXRfaW5mbGF0aW9uIDwtIHN1bShkYXRhID49IHRhcmdldF9pbmZsYXRpb24sIG5hLnJtID0gVFJVRSkNCiAgYWJvdmVfdGFyZ2V0X2NvbnNlcnZhdGl2ZSA8LSBzdW0oZGF0YSA+PSB0YXJnZXRfY29uc2VydmF0aXZlLCBuYS5ybSA9IFRSVUUpDQogIGFib3ZlX3RhcmdldF9tb2RlcmF0ZSA8LSBzdW0oZGF0YSA+PSB0YXJnZXRfbW9kZXJhdGUsIG5hLnJtID0gVFJVRSkNCiAgYWJvdmVfdGFyZ2V0X2FnZ3Jlc3NpdmUgPC0gc3VtKGRhdGEgPj0gdGFyZ2V0X2FnZ3Jlc3NpdmUsIG5hLnJtID0gVFJVRSkNCiAgDQogIHBlcmNlbnRfYWJvdmVfdGFyZ2V0X2NvbnNlcnZhdGl2ZSA8LSByb3VuZCgoYWJvdmVfdGFyZ2V0X2NvbnNlcnZhdGl2ZSAvIGNvdW50X29ic2VydmF0aW9ucykgKiAxMDAsIDIpDQogIHBlcmNlbnRfYWJvdmVfdGFyZ2V0X2luZmxhdGlvbiA8LSByb3VuZCgoYWJvdmVfdGFyZ2V0X2luZmxhdGlvbiAvIGNvdW50X29ic2VydmF0aW9ucykgKiAxMDAsIDIpDQogIHBlcmNlbnRfYWJvdmVfdGFyZ2V0X21vZGVyYXRlIDwtIHJvdW5kKChhYm92ZV90YXJnZXRfbW9kZXJhdGUgLyBjb3VudF9vYnNlcnZhdGlvbnMpICogMTAwLCAyKQ0KICBwZXJjZW50X2Fib3ZlX3RhcmdldF9hZ2dyZXNzaXZlIDwtIHJvdW5kKChhYm92ZV90YXJnZXRfYWdncmVzc2l2ZSAvIGNvdW50X29ic2VydmF0aW9ucykgKiAxMDAsIDIpDQogIA0KICBjKA0KICAgIGNvdW50X29ic2VydmF0aW9ucywgDQogICAgcGFzdGUwKG1lYW5fdmFsdWUsICIlIiksDQogICAgcGFzdGUwKG1lZGlhbl92YWx1ZSwgIiUiKSwNCiAgICBwYXN0ZTAoc2RfdmFsdWUsICIlIiksDQogICAgcGFzdGUwKG1pbl9jYWdyX3JhbmdlLCAiJSIpLA0KICAgIHBhc3RlMChtYXhfY2Fncl9yYW5nZSwgIiUiKSwNCiAgICBwYXN0ZTAobWluX3ZhbHVlLCAiJSIpLA0KICAgIHBhc3RlMChtYXhfdmFsdWUsICIlIiksDQogICAgcGFzdGUwKHBlcmNlbnRfYWJvdmVfdGFyZ2V0X2luZmxhdGlvbiwgIiUiKSwNCiAgICBwYXN0ZTAocGVyY2VudF9hYm92ZV90YXJnZXRfY29uc2VydmF0aXZlLCAiJSIpLCANCiAgICBwYXN0ZTAocGVyY2VudF9hYm92ZV90YXJnZXRfbW9kZXJhdGUsICIlIiksIA0KICAgIHBhc3RlMChwZXJjZW50X2Fib3ZlX3RhcmdldF9hZ2dyZXNzaXZlLCAiJSIpDQogICkNCn0NCg0KIyBDb2x1bW5zIHRvIGNhbGN1bGF0ZSBDQUdSIHN0YXRpc3RpY3MNCmNhZ3JfY29sdW1ucyA8LSBjKCIxLVllYXIgQ0FHUiIsICI1LVllYXIgQ0FHUiIsICIxMC1ZZWFyIENBR1IiLCAiMjAtWWVhciBDQUdSIiwgIjMwLVllYXIgQ0FHUiIpDQpleGlzdGluZ19jYWdyX2NvbHVtbnMgPC0gaW50ZXJzZWN0KGNhZ3JfY29sdW1ucywgbmFtZXMoYmxhY2tyb2NrX3Jhd19jYWdyKSkNCg0KIyBDYWxjdWxhdGUgc3RhdHMgZm9yIGVhY2ggQ0FHUiBjb2x1bW4NCmNhZ3Jfc3RhdHNfbGlzdCA8LSBsYXBwbHkoYmxhY2tyb2NrX3Jhd19jYWdyW2V4aXN0aW5nX2NhZ3JfY29sdW1uc10sIGNhbGNfc3RhdHMpDQoNCiMgQ29tcGlsZSBpbnRvIGEgc3VtbWFyeSBkYXRhIGZyYW1lDQpibGFja3JvY2tfcmF3X2NhZ3Jfc3VtbWFyeSA8LSBhcy5kYXRhLmZyYW1lKGRvLmNhbGwoY2JpbmQsIGNhZ3Jfc3RhdHNfbGlzdCkpDQpyb3duYW1lcyhibGFja3JvY2tfcmF3X2NhZ3Jfc3VtbWFyeSkgPC0gc3RhdGlzdGljX25hbWVzDQoNCg0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiMjIFNBVkUgVkFMVUVTIEZPUiBJTi1MSU5FIENPREUNCg0KIyBEZWZpbmUgdGhlIG1hcHBpbmcgb2Ygcm93IG5hbWVzIHRvIHZhcmlhYmxlIG5hbWVzDQpyb3dfdG9fdmFyX25hbWUgPC0gYygNCiAgIkNvdW50IG9mIE9ic2VydmF0aW9ucyIgPSAiY291bnRfb2JzZXJ2YXRpb25zIiwNCiAgIk1lYW4iID0gIm1lYW5fdmFsdWUiLA0KICAiTWVkaWFuIiA9ICJtZWRpYW5fdmFsdWUiLA0KICAiU3RhbmRhcmQgRGV2aWF0aW9uIChWb2xhdGlsaXR5KSIgPSAic2RfdmFsdWUiLA0KICAiTWluIENBR1IgUmFuZ2UgKENBR1IgLSBTRCkiID0gIm1pbl9jYWdyX3JhbmdlIiwNCiAgIk1heCBDQUdSIFJhbmdlIChDQUdSICsgU0QpIiA9ICJtYXhfY2Fncl9yYW5nZSIsDQogICJNaW5pbXVtIiA9ICJtaW5fdmFsdWUiLA0KICAiTWF4aW11bSIgPSAibWF4X3ZhbHVlIiwNCiAgIlBlcmNlbnQgQWJvdmUgSW5mbGF0aW9uIFRhcmdldCIgPSAicGVyY2VudF9hYm92ZV90YXJnZXRfaW5mbGF0aW9uIiwNCiAgIlBlcmNlbnQgQWJvdmUgQ29uc2VydmF0aXZlIFRhcmdldCIgPSAicGVyY2VudF9hYm92ZV90YXJnZXRfY29uc2VydmF0aXZlIiwNCiAgIlBlcmNlbnQgQWJvdmUgTW9kZXJhdGUgVGFyZ2V0IiA9ICJwZXJjZW50X2Fib3ZlX3RhcmdldF9tb2RlcmF0ZSIsDQogICJQZXJjZW50IEFib3ZlIEFnZ3Jlc3NpdmUgVGFyZ2V0IiA9ICJwZXJjZW50X2Fib3ZlX3RhcmdldF9hZ2dyZXNzaXZlIg0KKQ0KDQojIEZ1bmN0aW9uIHRvIHNhdmUgc3VtbWFyeSB2YWx1ZXMgZHluYW1pY2FsbHkNCnNhdmVfY29sdW1uX3ZhbHVlcyA8LSBmdW5jdGlvbihzdW1tYXJ5X2RmKSB7DQogICMgRXhjbHVkZSB0aGUgIlN0YXRpc3RpYyIgYW5kICJPdmVyYWxsIiBjb2x1bW5zDQogIGNvbHVtbnNfdG9fc2F2ZSA8LSBzZXRkaWZmKG5hbWVzKHN1bW1hcnlfZGYpLCBjKCJTdGF0aXN0aWMiLCAiT3ZlcmFsbCIpKQ0KICANCiAgIyBJdGVyYXRlIG92ZXIgZWFjaCBjb2x1bW4NCiAgZm9yIChjb2wgaW4gY29sdW1uc190b19zYXZlKSB7DQogICAgIyBGb3JtYXQgY29sdW1uIG5hbWUgdG8gbG93ZXJjYXNlIGFuZCByZXBsYWNlIGludmFsaWQgY2hhcmFjdGVycw0KICAgIGNvbF9uYW1lIDwtIHRvbG93ZXIoZ3N1YigiW15hLXpBLVowLTldIiwgIl8iLCBjb2wpKQ0KICAgIA0KICAgICMgRXh0cmFjdCB2YWx1ZXMgZm9yIHRoZSBjdXJyZW50IGNvbHVtbg0KICAgIGNvbF92YWx1ZXMgPC0gc3VtbWFyeV9kZltbY29sXV0NCiAgICANCiAgICAjIFNhdmUgZWFjaCB2YWx1ZSBkeW5hbWljYWxseSB1c2luZyB0aGUgbWFwcGluZyBmb3Igcm93IG5hbWVzDQogICAgZm9yIChpIGluIHNlcV9hbG9uZyhjb2xfdmFsdWVzKSkgew0KICAgICAgIyBHZXQgdGhlIGNvcnJlc3BvbmRpbmcgdmFyaWFibGUgbmFtZSBmcm9tIHRoZSBtYXBwaW5nDQogICAgICBzdGF0X25hbWUgPC0gcm93X3RvX3Zhcl9uYW1lW3Jvd25hbWVzKHN1bW1hcnlfZGYpW2ldXQ0KICAgICAgDQogICAgICBpZiAoIWlzLm5hKHN0YXRfbmFtZSkpIHsgICMgU2tpcCBpZiBubyBtYXBwaW5nIGlzIGRlZmluZWQNCiAgICAgICAgIyBDcmVhdGUgdGhlIHZhcmlhYmxlIG5hbWUNCiAgICAgICAgdmFyX25hbWUgPC0gcGFzdGUwKHN0YXRfbmFtZSwgIl8iLCBjb2xfbmFtZSkNCiAgICAgICAgDQogICAgICAgICMgQXR0ZW1wdCBudW1lcmljIGNvbnZlcnNpb24gZm9yIGRvd25zdHJlYW0gdXNlDQogICAgICAgIHZhbHVlIDwtIHN1cHByZXNzV2FybmluZ3MoYXMubnVtZXJpYyhnc3ViKCIlIiwgIiIsIGNvbF92YWx1ZXNbaV0pKSkNCiAgICAgICAgDQogICAgICAgICMgQXNzaWduIHRoZSB2YWx1ZSB0byB0aGUgZ2xvYmFsIGVudmlyb25tZW50DQogICAgICAgIGFzc2lnbih2YXJfbmFtZSwgdmFsdWUsIGVudmlyID0gLkdsb2JhbEVudikNCiAgICAgIH0NCiAgICB9DQogIH0NCn0NCg0KIyBBcHBseSB0aGUgZnVuY3Rpb24gdG8gc2F2ZSB2YWx1ZXMgZm9yIGFsbCBjb2x1bW5zIGV4Y2VwdCAiT3ZlcmFsbCINCnNhdmVfY29sdW1uX3ZhbHVlcyhibGFja3JvY2tfcmF3X2NhZ3Jfc3VtbWFyeSkNCg0KIyBFeGFtcGxlOiBBY2Nlc3NpbmcgZHluYW1pY2FsbHkgY3JlYXRlZCB2YXJpYWJsZXMNCmludGVyYWN0aXZlX3ByaW50KG1lYW5fdmFsdWVfMV95ZWFyX2NhZ3IpICAjIFNob3VsZCBwcmludCB0aGUgbWVhbiB2YWx1ZSBmb3IgMS1ZZWFyIENBR1INCmludGVyYWN0aXZlX3ByaW50KHBlcmNlbnRfYWJvdmVfdGFyZ2V0X2luZmxhdGlvbl81X3llYXJfY2FncikgICMgU2hvdWxkIHByaW50IHRoZSBwZXJjZW50IGFib3ZlIGluZmxhdGlvbiB0YXJnZXQgZm9yIDUtWWVhciBDQUdSDQppbnRlcmFjdGl2ZV9wcmludChzZF92YWx1ZV8xMF95ZWFyX2NhZ3IpICAjIFNob3VsZCBwcmludCB0aGUgc3RhbmRhcmQgZGV2aWF0aW9uIGZvciAxMC1ZZWFyIENBR1INCg0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiMjIE9WRVJBTEwgU1RBVElTVElDUyANCm51bWVyaWNfdmFsdWVzX2FsbCA8LSBhcy5udW1lcmljKHVubGlzdChibGFja3JvY2tfcmF3X2NhZ3JbZXhpc3RpbmdfY2Fncl9jb2x1bW5zXSwgdXNlLm5hbWVzID0gRkFMU0UpKQ0KbnVtZXJpY192YWx1ZXNfYWxsIDwtIG51bWVyaWNfdmFsdWVzX2FsbFshaXMubmEobnVtZXJpY192YWx1ZXNfYWxsKV0NCg0Kb3ZlcmFsbF9jb3VudF9vYnNlcnZhdGlvbnMgPC0gbGVuZ3RoKG51bWVyaWNfdmFsdWVzX2FsbCkNCm92ZXJhbGxfbWVhbl92YWx1ZSA8LSByb3VuZChtZWFuKG51bWVyaWNfdmFsdWVzX2FsbCksIDIpDQpvdmVyYWxsX21lZGlhbl92YWx1ZSA8LSByb3VuZChtZWRpYW4obnVtZXJpY192YWx1ZXNfYWxsKSwgMikNCm92ZXJhbGxfc2RfdmFsdWUgPC0gcm91bmQoc2QobnVtZXJpY192YWx1ZXNfYWxsKSwgMikNCm92ZXJhbGxfbWluX2NhZ3JfcmFuZ2UgPC0gcm91bmQoY2Fncl92YWx1ZSAtIG92ZXJhbGxfc2RfdmFsdWUsIDIpDQpvdmVyYWxsX21heF9jYWdyX3JhbmdlIDwtIHJvdW5kKGNhZ3JfdmFsdWUgKyBvdmVyYWxsX3NkX3ZhbHVlLCAyKQ0Kb3ZlcmFsbF9taW5fdmFsdWUgPC0gcm91bmQobWluKG51bWVyaWNfdmFsdWVzX2FsbCksIDIpDQpvdmVyYWxsX21heF92YWx1ZSA8LSByb3VuZChtYXgobnVtZXJpY192YWx1ZXNfYWxsKSwgMikNCg0Kb3ZlcmFsbF9hYm92ZV90YXJnZXRfaW5mbGF0aW9uIDwtIHN1bShudW1lcmljX3ZhbHVlc19hbGwgPj0gdGFyZ2V0X2luZmxhdGlvbiwgbmEucm0gPSBUUlVFKQ0Kb3ZlcmFsbF9hYm92ZV90YXJnZXRfY29uc2VydmF0aXZlIDwtIHN1bShudW1lcmljX3ZhbHVlc19hbGwgPj0gdGFyZ2V0X2NvbnNlcnZhdGl2ZSwgbmEucm0gPSBUUlVFKQ0Kb3ZlcmFsbF9hYm92ZV90YXJnZXRfbW9kZXJhdGUgPC0gc3VtKG51bWVyaWNfdmFsdWVzX2FsbCA+PSB0YXJnZXRfbW9kZXJhdGUsIG5hLnJtID0gVFJVRSkNCm92ZXJhbGxfYWJvdmVfdGFyZ2V0X2FnZ3Jlc3NpdmUgPC0gc3VtKG51bWVyaWNfdmFsdWVzX2FsbCA+PSB0YXJnZXRfYWdncmVzc2l2ZSwgbmEucm0gPSBUUlVFKQ0KDQpvdmVyYWxsX3BlcmNlbnRfYWJvdmVfdGFyZ2V0X2NvbnNlcnZhdGl2ZSA8LSByb3VuZCgob3ZlcmFsbF9hYm92ZV90YXJnZXRfY29uc2VydmF0aXZlIC8gb3ZlcmFsbF9jb3VudF9vYnNlcnZhdGlvbnMpICogMTAwLCAyKQ0Kb3ZlcmFsbF9wZXJjZW50X2Fib3ZlX3RhcmdldF9pbmZsYXRpb24gPC0gcm91bmQoKG92ZXJhbGxfYWJvdmVfdGFyZ2V0X2luZmxhdGlvbiAvIG92ZXJhbGxfY291bnRfb2JzZXJ2YXRpb25zKSAqIDEwMCwgMikNCm92ZXJhbGxfcGVyY2VudF9hYm92ZV90YXJnZXRfbW9kZXJhdGUgPC0gcm91bmQoKG92ZXJhbGxfYWJvdmVfdGFyZ2V0X21vZGVyYXRlIC8gb3ZlcmFsbF9jb3VudF9vYnNlcnZhdGlvbnMpICogMTAwLCAyKQ0Kb3ZlcmFsbF9wZXJjZW50X2Fib3ZlX3RhcmdldF9hZ2dyZXNzaXZlIDwtIHJvdW5kKChvdmVyYWxsX2Fib3ZlX3RhcmdldF9hZ2dyZXNzaXZlIC8gb3ZlcmFsbF9jb3VudF9vYnNlcnZhdGlvbnMpICogMTAwLCAyKQ0KDQpibGFja3JvY2tfcmF3X2NhZ3Jfc3VtbWFyeSRPdmVyYWxsIDwtIGMoDQogIG92ZXJhbGxfY291bnRfb2JzZXJ2YXRpb25zLA0KICBwYXN0ZTAob3ZlcmFsbF9tZWFuX3ZhbHVlLCAiJSIpLA0KICBwYXN0ZTAob3ZlcmFsbF9tZWRpYW5fdmFsdWUsICIlIiksDQogIHBhc3RlMChvdmVyYWxsX3NkX3ZhbHVlLCAiJSIpLA0KICBwYXN0ZTAob3ZlcmFsbF9taW5fY2Fncl9yYW5nZSwgIiUiKSwNCiAgcGFzdGUwKG92ZXJhbGxfbWF4X2NhZ3JfcmFuZ2UsICIlIiksDQogIHBhc3RlMChvdmVyYWxsX21pbl92YWx1ZSwgIiUiKSwNCiAgcGFzdGUwKG92ZXJhbGxfbWF4X3ZhbHVlLCAiJSIpLA0KICBwYXN0ZTAob3ZlcmFsbF9wZXJjZW50X2Fib3ZlX3RhcmdldF9pbmZsYXRpb24sICIlIiksDQogIHBhc3RlMChvdmVyYWxsX3BlcmNlbnRfYWJvdmVfdGFyZ2V0X2NvbnNlcnZhdGl2ZSwgIiUiKSwNCiAgcGFzdGUwKG92ZXJhbGxfcGVyY2VudF9hYm92ZV90YXJnZXRfbW9kZXJhdGUsICIlIiksDQogIHBhc3RlMChvdmVyYWxsX3BlcmNlbnRfYWJvdmVfdGFyZ2V0X2FnZ3Jlc3NpdmUsICIlIikNCikNCg0KIyBDb252ZXJ0IHJvdyBuYW1lcyB0byBhIGNvbHVtbg0KYmxhY2tyb2NrX3Jhd19jYWdyX3N1bW1hcnkgPC0gdGliYmxlOjpyb3duYW1lc190b19jb2x1bW4oYmxhY2tyb2NrX3Jhd19jYWdyX3N1bW1hcnksIHZhciA9ICJTdGF0aXN0aWMiKQ0KDQojIEVuc3VyZSBhbGwgY29sdW1ucyBhcmUgY2hhcmFjdGVyDQpibGFja3JvY2tfcmF3X2NhZ3Jfc3VtbWFyeSA8LSBibGFja3JvY2tfcmF3X2NhZ3Jfc3VtbWFyeSAlPiUNCiAgbXV0YXRlKGFjcm9zcyhldmVyeXRoaW5nKCksIGFzLmNoYXJhY3RlcikpDQoNCiMgRGlzcGxheSB0aGUgc3VtbWFyeSB0YWJsZQ0KY2F0KCJcbiMjIyMgQ29tcG91bmQgQXZlcmFnZSBHcm93dGggUmF0ZXMgKCIsIG1pbl95ZWFyLCAiLSIsIG1heF95ZWFyLCAiKVxuIiwgc2VwID0gIiIpDQppbnRlcmFjdGl2ZV9zdHIoYmxhY2tyb2NrX3Jhd19jYWdyX3N1bW1hcnkpDQpmb3JtYXRfdW5zcGVjaWZpZWRfd2lkdGgoYmxhY2tyb2NrX3Jhd19jYWdyX3N1bW1hcnkpDQoNCmBgYA0KDQoqKmByIG1pbl95ZWFyYC1gciBtYXhfeWVhcmAgU3VtbWFyeToqKiBUaGUgMS1ZZWFyIENBR1IgZXhoaWJpdHMgdGhlIGByIGlmKG1lYW5fdmFsdWVfMV95ZWFyX2NhZ3IgPT0gbWF4KGMobWVhbl92YWx1ZV8xX3llYXJfY2FnciwgbWVhbl92YWx1ZV81X3llYXJfY2FncikpKSAiaGlnaGVzdCBtZWFuIHJldHVybiIgZWxzZSBpZihtZWFuX3ZhbHVlXzFfeWVhcl9jYWdyID09IG1pbihjKG1lYW5fdmFsdWVfMV95ZWFyX2NhZ3IsIG1lYW5fdmFsdWVfNV95ZWFyX2NhZ3IpKSkgImxvd2VzdCBtZWFuIHJldHVybiIgZWxzZSAibWVhbiByZXR1cm4iYCBhdCBgciBtZWFuX3ZhbHVlXzFfeWVhcl9jYWdyYCUsIGFuZCBgciBpZihzZF92YWx1ZV8xX3llYXJfY2FnciA9PSBtYXgoYyhzZF92YWx1ZV8xX3llYXJfY2Fnciwgc2RfdmFsdWVfNV95ZWFyX2NhZ3IpKSkgInRoZSBncmVhdGVzdCB2b2xhdGlsaXR5IHdpdGggYSIgZWxzZSBpZihzZF92YWx1ZV8xX3llYXJfY2FnciA9PSBtaW4oYyhzZF92YWx1ZV8xX3llYXJfY2Fnciwgc2RfdmFsdWVfNV95ZWFyX2NhZ3IpKSkgInRoZSBsZWFzdCB2b2xhdGlsaXR5IHdpdGggYSIgZWxzZSAiYSJgIHN0YW5kYXJkIGRldmlhdGlvbiBvZiBgciBzZF92YWx1ZV8xX3llYXJfY2FncmAlLiBBcyB0aGUgaW52ZXN0bWVudCBob3Jpem9uIGV4dGVuZHMgdG8gNSB5ZWFycywgdGhlIG1lYW4gcmV0dXJucyBgciBpZihtZWFuX3ZhbHVlXzFfeWVhcl9jYWdyIDwgbWVhbl92YWx1ZV81X3llYXJfY2FncikgImluY3JlYXNlIiBlbHNlICJkZWNyZWFzZSJgLCB0byBgciBtZWFuX3ZhbHVlXzVfeWVhcl9jYWdyYCUsIHdoaWxlIHZvbGF0aWxpdHkgYHIgaWYoc2RfdmFsdWVfMV95ZWFyX2NhZ3IgPCBzZF92YWx1ZV81X3llYXJfY2FncikgInJpc2VzIiBlbHNlICJkaW1pbmlzaGVzImAsIHdpdGggc3RhbmRhcmQgZGV2aWF0aW9ucyBhdCBgciBzZF92YWx1ZV81X3llYXJfY2FncmAlLiBUaGlzIHRyZW5kIGluZGljYXRlcyB0aGF0IGxvbmdlciBpbnZlc3RtZW50IHBlcmlvZHMgdGVuZCB0byBvZmZlciBgciBpZihzZF92YWx1ZV8xX3llYXJfY2FnciA+IHNkX3ZhbHVlXzVfeWVhcl9jYWdyKSAibW9yZSBzdGFibGUiIGVsc2UgImxlc3Mgc3RhYmxlImAgcmV0dXJucy4gRnVydGhlcm1vcmUsIHRoZSBwZXJjZW50YWdlIG9mIHBlcmlvZHMgZXhjZWVkaW5nIHRoZSBpbmZsYXRpb24gdGFyZ2V0IGByIGlmKHBlcmNlbnRfYWJvdmVfdGFyZ2V0X2luZmxhdGlvbl8xX3llYXJfY2FnciA8IHBlcmNlbnRfYWJvdmVfdGFyZ2V0X2luZmxhdGlvbl81X3llYXJfY2FncikgImluY3JlYXNlcyIgZWxzZSAiZGVjcmVhc2VzImAgd2l0aCBsb25nZXIgZHVyYXRpb25zLCBmcm9tIGByIHBlcmNlbnRfYWJvdmVfdGFyZ2V0X2luZmxhdGlvbl8xX3llYXJfY2FncmAlIGluIHRoZSAxLVllYXIgQ0FHUiB0byBgciBwZXJjZW50X2Fib3ZlX3RhcmdldF9pbmZsYXRpb25fNV95ZWFyX2NhZ3JgJSBpbiB0aGUgNS1ZZWFyIENBR1IsIHVuZGVyc2NvcmluZyBCbGFja1JvY2sncyBgciBpZihwZXJjZW50X2Fib3ZlX3RhcmdldF9pbmZsYXRpb25fMV95ZWFyX2NhZ3IgPCBwZXJjZW50X2Fib3ZlX3RhcmdldF9pbmZsYXRpb25fNV95ZWFyX2NhZ3IpICJlZmZlY3RpdmVuZXNzIiBlbHNlICJpbmVmZmVjdGl2ZW5lc3MiYCBhcyBhIGhlZGdlIGFnYWluc3QgaW5mbGF0aW9uIG92ZXIgZXh0ZW5kZWQgdGltZWZyYW1lcy4gV2l0aCBhbiBvdmVyYWxsIHBlcmNlbnRhZ2Ugb2YgYHIgb3ZlcmFsbF9wZXJjZW50X2Fib3ZlX3RhcmdldF9hZ2dyZXNzaXZlYCUgZXhjZWVkaW5nIHRoZSBhZ2dyZXNzaXZlIHRhcmdldCAoYHIgdGFyZ2V0X2FnZ3Jlc3NpdmVgJSBhbm51YWxpemVkIHJldHVybnMgd2l0aCBgciB0YXJnZXRfaW5mbGF0aW9uYCUgaW5mbGF0aW9uKSwgQmxhY2tSb2NrIGByIGlmKG92ZXJhbGxfcGVyY2VudF9hYm92ZV90YXJnZXRfYWdncmVzc2l2ZSA+IDUwKSAiaGFzLCBvdmVyIHRoaXMgdGltZSBwZXJpb2QsIHByb3ZlbiB0byBiZSBhIHN0cm9uZyIgZWxzZSBpZihvdmVyYWxsX3BlcmNlbnRfYWJvdmVfdGFyZ2V0X2FnZ3Jlc3NpdmUgPiA0MCkgImhhcywgb3ZlciB0aGlzIHRpbWUgcGVyaW9kLCBkZW1vbnN0cmF0ZWQgaXRzZWxmIGFzIGEgdmlhYmxlIiBlbHNlICJhcHBlYXJzLCBvdmVyIHRoaXMgdGltZSBwZXJpb2QsIHRvIGJlIGEgbGVzcyBzdWl0YWJsZSJgIG9wdGlvbiBmb3IgYSBoaWdoLXJldHVybmluZyBsb25nLXRlcm0gaW52ZXN0bWVudC4NCg0KIyMjIEdyYXBoDQoNCiMjIyMgQWxsIFBlcmlvZHMNCg0KYGBge3IgYmxhY2tyb2NrX3Jhd19jYWdyX2dyYXBoc19hbGwsIGZpZy53aWR0aD0xMCwgZmlnLmhlaWdodD03LCBldmFsPVRSVUUsIGVjaG89RkFMU0V9DQoNCmNhdCgiXG5cbiMjIyMgQ29tcG91bmQgQXZlcmFnZSBHcm93dGggUmF0ZXMgQWNyb3NzIFBlcmlvZHMgXG4iKQ0KDQojIExvYWQgbmVjZXNzYXJ5IGxpYnJhcmllcw0KbGlicmFyeShnZ3Bsb3QyKQ0KbGlicmFyeShkcGx5cikNCg0KDQojIENvbnZlcnQgY29sdW1ucyB0byBudW1lcmljIGZvciBwbG90dGluZyBpZiBuZWVkZWQNCmJsYWNrcm9ja19yYXdfY2FnciA8LSBibGFja3JvY2tfcmF3X2NhZ3IgJT4lDQogIG11dGF0ZSgNCiAgICBgRGF0ZWAgPSBhcy5udW1lcmljKGFzLmNoYXJhY3RlcihgRGF0ZWApKSwgICMgRW5zdXJlIERhdGUgaXMgbnVtZXJpYw0KICAgIGAxLVllYXIgQ0FHUmAgPSBhcy5udW1lcmljKGdzdWIoIiUiLCAiIiwgYDEtWWVhciBDQUdSYCkpLA0KICAgIGA1LVllYXIgQ0FHUmAgPSBhcy5udW1lcmljKGdzdWIoIiUiLCAiIiwgYDUtWWVhciBDQUdSYCkpLA0KICAgIGAxMC1ZZWFyIENBR1JgID0gYXMubnVtZXJpYyhnc3ViKCIlIiwgIiIsIGAxMC1ZZWFyIENBR1JgKSksDQogICAgYDIwLVllYXIgQ0FHUmAgPSBhcy5udW1lcmljKGdzdWIoIiUiLCAiIiwgYDIwLVllYXIgQ0FHUmApKSwNCiAgICBgMzAtWWVhciBDQUdSYCA9IGFzLm51bWVyaWMoZ3N1YigiJSIsICIiLCBgMzAtWWVhciBDQUdSYCkpDQogICkNCg0KIyBSZXNoYXBlIHRoZSBkYXRhIGludG8gbG9uZyBmb3JtYXQgZm9yIGVhc3kgcGxvdHRpbmcgb2YgbXVsdGlwbGUgbGluZXMgYW5kIHNldCB0aGUgZmFjdG9yIG9yZGVyDQpucnRfbG9uZyA8LSBibGFja3JvY2tfcmF3X2NhZ3IgJT4lDQogIHBpdm90X2xvbmdlcihjb2xzID0gYyhgMS1ZZWFyIENBR1JgLCBgNS1ZZWFyIENBR1JgLCBgMTAtWWVhciBDQUdSYCwgYDIwLVllYXIgQ0FHUmAsIGAzMC1ZZWFyIENBR1JgKSwNCiAgICAgICAgICAgICAgIG5hbWVzX3RvID0gIkNBR1JfUGVyaW9kIiwNCiAgICAgICAgICAgICAgIHZhbHVlc190byA9ICJDQUdSX1ZhbHVlIikgJT4lDQogIG11dGF0ZShDQUdSX1BlcmlvZCA9IGZhY3RvcihDQUdSX1BlcmlvZCwgbGV2ZWxzID0gYygiMS1ZZWFyIENBR1IiLCAiNS1ZZWFyIENBR1IiLCAiMTAtWWVhciBDQUdSIiwgIjIwLVllYXIgQ0FHUiIsICIzMC1ZZWFyIENBR1IiKSkpDQoNCiMgQXNzaWduIGNvbG9ycyBkeW5hbWljYWxseSBiYXNlZCBvbiB0aGUgb3JkZXIgb2YgQ0FHUl9QZXJpb2QgaW4gdGhlIGRhdGENCiMgTWF0Y2ggdGhlIHVuaXF1ZSBsZXZlbHMgb2YgQ0FHUl9QZXJpb2Qgd2l0aCBjb2xvcnMgZnJvbSBjb2xvcnNfZ2VuZXJhbF9kYXJrDQp1bmlxdWVfdHlwZXMgPC0gdW5pcXVlKG5ydF9sb25nJENBR1JfUGVyaW9kKQ0KY3VzdG9tX2NvbG9ycyA8LSBzZXROYW1lcyhjb2xvcnNfZ2VuZXJhbF9kYXJrWzE6bGVuZ3RoKHVuaXF1ZV90eXBlcyldLCB1bmlxdWVfdHlwZXMpDQoNCiMgRmluZCB0aGUgbWluaW11bSBhbmQgbWF4aW11bSB4LXZhbHVlIGluIHlvdXIgZGF0YQ0KbWF4X3ggPC0gbWF4KGFzLmludGVnZXIoYmxhY2tyb2NrX3Jhd19jYWdyJERhdGUpLCBuYS5ybSA9IFRSVUUpDQptaW5feCA8LSBtaW4oYXMuaW50ZWdlcihibGFja3JvY2tfcmF3X2NhZ3IkRGF0ZSksIG5hLnJtID0gVFJVRSkNCmludGVyYWN0aXZlX3ByaW50KG1heF94KSAgIyBUZXN0DQppbnRlcmFjdGl2ZV9wcmludChtaW5feCkgICMgVGVzdA0KDQojIEZpbmQgdGhlIG1pbmltdW0gYW5kIG1heGltdW0geWVhcg0KbWluX3llYXIgPC0gbWluKGJsYWNrcm9ja19yYXdfY2FnciREYXRlLCBuYS5ybSA9IFRSVUUpDQptYXhfeWVhciA8LSBtYXgoYmxhY2tyb2NrX3Jhd19jYWdyJERhdGUsIG5hLnJtID0gVFJVRSkNCmludGVyYWN0aXZlX3ByaW50KG1pbl95ZWFyKQ0KaW50ZXJhY3RpdmVfcHJpbnQobWF4X3llYXIpDQoNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQojIyBQTE9UIEZVTEwgV0lUSE9VVCBMSU1JVFMNCg0KIyBEZWZpbmUgc3RhcnQgYW5kIGVuZCB5ZWFycw0Kc3RhcnRfeWVhciA8LSBhcy5udW1lcmljKG1pbl95ZWFyKQ0KZW5kX3llYXIgPC0gMjAyNA0KeWVhcl9yYW5nZSA8LSBlbmRfeWVhciAtIHN0YXJ0X3llYXIgKyAxICAjIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIHllYXJzDQoNCiMgRGVmaW5lIGJyZWFrcyByb3VuZGVkIGFwcHJvcHJpYXRlbHkNCmxpbWl0c19zdGFydF95ZWFyIDwtIGZsb29yKHN0YXJ0X3llYXIgLyAyKSAqIDIgICMgUm91bmQgZG93biB0byB0aGUgbmVhcmVzdCBtdWx0aXBsZSBvZiA1DQpsaW1pdHNfZW5kX3llYXIgPC0gY2VpbGluZyhlbmRfeWVhciAvIDIpICogMiAgICMgUm91bmQgdXAgdG8gdGhlIG5lYXJlc3QgbXVsdGlwbGUgb2YgNQ0KDQojIENyZWF0ZSBkeW5hbWljIHRpdGxlIGFuZCBjYXB0aW9uDQpkeW5hbWljX3RpdGxlIDwtIHBhc3RlMCgiUm9sbGluZyBDQUdScyBBY3Jvc3MgUGVyaW9kcyBPdmVyICIseWVhcl9yYW5nZSwgIiBZZWFycyAoIiwgc3RhcnRfeWVhciwgIi0iLCBlbmRfeWVhciwgIikiKQ0KZHluYW1pY19jYXB0aW9uIDwtIHBhc3RlMCgiQmxhY2tSb2NrIENvbXBvdW5kIEF2ZXJhZ2UgR3Jvd3RoIFJhdGVzIEFjcm9zcyBSb2xsaW5nIFBlcmlvZHMsIERhdGFzZXQgKCIsIG1pbl95ZWFyLCAiLSIsIG1heF95ZWFyLCAiKSIpDQoNCiMgQ3JlYXRlIHRoZSBmdWxsLCBub24tZmlsdGVyZWQgeC1heGlzIHBsb3Qgd2l0aCBkeW5hbWljIHggcGxhY2VtZW50IGZvciBhbm5vdGF0aW9ucw0KcDEgPC0gZ2dwbG90KG5ydF9sb25nLCBhZXMoeCA9IGFzLmludGVnZXIoRGF0ZSksIHkgPSBDQUdSX1ZhbHVlLCBjb2xvciA9IENBR1JfUGVyaW9kKSkgKw0KDQogICMgQWRkIHNoYWRlZCBhcmVhcyBmb3IgYmFja2dyb3VuZCBlZmZlY3QNCiAgZ2VvbV9yZWN0KGFlcyh4bWluID0gLUluZiwgeG1heCA9IEluZiwgeW1pbiA9IHRhcmdldF9hZ2dyZXNzaXZlLCB5bWF4ID0gSW5mKSwgZmlsbCA9ICJsaWdodGdyZWVuIiwgYWxwaGEgPSAwLjAxMCkgKw0KICBnZW9tX3JlY3QoYWVzKHhtaW4gPSAtSW5mLCB4bWF4ID0gSW5mLCB5bWluID0gdGFyZ2V0X2NvbnNlcnZhdGl2ZSwgeW1heCA9IHRhcmdldF9hZ2dyZXNzaXZlKSwgZmlsbCA9ICJvcmFuZ2UiLCBhbHBoYSA9IDAuMDEpICsNCiAgZ2VvbV9yZWN0KGFlcyh4bWluID0gLUluZiwgeG1heCA9IEluZiwgeW1pbiA9IC1JbmYsIHltYXggPSB0YXJnZXRfY29uc2VydmF0aXZlKSwgZmlsbCA9ICJsaWdodGNvcmFsIiwgYWxwaGEgPSAwLjAxMCkgKw0KICANCiAgIyBQbG90IGxpbmVzIGZvciBlYWNoIENBR1IgUGVyaW9kDQogIGdlb21fbGluZShzaXplID0gMS4wLCBhbHBoYSA9IDMuMCkgKyAgICAgICAjIExpbmUgZm9yIGVhY2ggQ0FHUg0KICBnZW9tX3BvaW50KHNpemUgPSAxLjAsIGFscGhhID0gMy4wKSArICAgICAgICMgUG9pbnRzIGZvciBlYWNoIENBR1INCiAgDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IHRhcmdldF9hZ2dyZXNzaXZlLCBjb2xvciA9ICJkYXJrYmx1ZSIsIGxpbmV0eXBlID0gInNvbGlkIikgKw0KICAjIGdlb21faGxpbmUoeWludGVyY2VwdCA9IHRhcmdldF9tb2RlcmF0ZSwgY29sb3IgPSAiZGFya2JsdWUiLCBsaW5ldHlwZSA9ICJzb2xpZCIpICsNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gdGFyZ2V0X2NvbnNlcnZhdGl2ZSwgY29sb3IgPSAiZGFya2JsdWUiLCBsaW5ldHlwZSA9ICJzb2xpZCIpICsNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gdGFyZ2V0X2luZmxhdGlvbiwgY29sb3IgPSAiZGFya3JlZCIsIGxpbmV0eXBlID0gImRhc2hlZCIpICsNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gY2Fncl92YWx1ZSwgY29sb3IgPSAiZGFya3JlZCIsIGxpbmV0eXBlID0gImRhc2hlZCIpICsNCiAgDQogICMgRHluYW1pYyByaWdodC1hbGlnbmVkIHBsYWNlbWVudCBmb3IgYW5ub3RhdGlvbnMNCiAgYW5ub3RhdGUoInRleHQiLCB4ID0gSW5mLCB5ID0gdGFyZ2V0X2FnZ3Jlc3NpdmUsIGxhYmVsID0gIkFnZ3Jlc3NpdmUiLCANCiAgICAgICAgICAgaGp1c3QgPSAxLCB2anVzdCA9IC0wLjUwLCBjb2xvciA9ICJkYXJrYmx1ZSIsIHNpemUgPSA0KSArDQogICMgYW5ub3RhdGUoInRleHQiLCB4ID0gSW5mLCB5ID0gdGFyZ2V0X21vZGVyYXRlLCBsYWJlbCA9ICJNb2RlcmF0ZSIsIA0KICAjICAgICAgICAgaGp1c3QgPSAxLCB2anVzdCA9IC0wLjUwLCBjb2xvciA9ICJkYXJrYmx1ZSIsIHNpemUgPSA0KSArDQogIGFubm90YXRlKCJ0ZXh0IiwgeCA9IEluZiwgeSA9IHRhcmdldF9jb25zZXJ2YXRpdmUsIGxhYmVsID0gIkNvbnNlcnZhdGl2ZSIsIA0KICAgICAgICAgICBoanVzdCA9IDEsIHZqdXN0ID0gLTAuNTAsIGNvbG9yID0gImRhcmtibHVlIiwgc2l6ZSA9IDQpICsNCiAgYW5ub3RhdGUoInRleHQiLCB4ID0gSW5mLCB5ID0gdGFyZ2V0X2luZmxhdGlvbiwgbGFiZWwgPSAiSW5mbGF0aW9uIiwgDQogICAgICAgICAgIGhqdXN0ID0gMSwgdmp1c3QgPSArMS4xMCwgY29sb3IgPSAiZGFya3JlZCIsIHNpemUgPSA0KSArDQogIGFubm90YXRlKCJ0ZXh0IiwgeCA9IEluZiwgeSA9IGNhZ3JfdmFsdWUsIGxhYmVsID0gIkNBR1IiLCANCiAgICAgICAgICAgaGp1c3QgPSAxLCB2anVzdCA9IC0wLjUwLCBjb2xvciA9ICJkYXJrcmVkIiwgc2l6ZSA9IDQpICsgDQoNCiAgbGFicygNCiAgICB0aXRsZSA9IGR5bmFtaWNfdGl0bGUsDQogICAgeCA9ICJZZWFyIiwNCiAgICB5ID0gIkNBR1IgVmFsdWUgKCUpIiwNCiAgICBjb2xvciA9ICJDQUdSIFBlcmlvZCIsDQogICAgY2FwdGlvbiA9IGR5bmFtaWNfY2FwdGlvbg0KICAgICkgKw0KICANCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGN1c3RvbV9jb2xvcnMpICsgICMgU2V0IGNvbG9ycyBmb3IgZWFjaCBDQUdSIFBlcmlvZA0KICBzY2FsZV94X2NvbnRpbnVvdXMoDQogICAgbGltaXRzID0gYyhzdGFydF95ZWFyLCBlbmRfeWVhciArIDEpLCANCiAgICBicmVha3MgPSBzZXEobGltaXRzX3N0YXJ0X3llYXIsIGxpbWl0c19lbmRfeWVhciwgMikpICsgICMgUmVzdHJpY3QgJiBTZXQgTWFqb3IgeC1heGlzIGxpbmVzIGZvciBlYWNoIHllYXINCiAgDQogIHRoZW1lX21pbmltYWwoKSArDQogIHRoZW1lKA0KICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUsIHNpemUgPSAyMCksICAgICAgICAgIyBMYXJnZXIgdGl0bGUgZm9udA0KICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQpLCAgICAgICAgICAgICAgICAgICAgIyBMYXJnZXIgeC1heGlzIGxhYmVsIGZvbnQNCiAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0KSwgICAgICAgICAgICAgICAgICAgICMgTGFyZ2VyIHktYXhpcyBsYWJlbCBmb250DQogICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxLCBzaXplID0gMTQpLCAgIyBMYXJnZXIgeC1heGlzIHRleHQNCiAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQpLCAgICAgICAgICAgICAgICAgICAgICMgTGFyZ2VyIHktYXhpcyB0ZXh0DQogICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCksICAgICAgICAgICAgICAgICAgICAjIExlZ2VuZCB0aXRsZSBzaXplDQogICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyKSwgICAgICAgICAgICAgICAgICAgICAjIExlZ2VuZCB0ZXh0IHNpemUNCiAgICBwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9saW5lKGxpbmV0eXBlID0gImRvdHRlZCIsIGNvbG9yID0gImJsYWNrIiksICAjIE1ham9yIGdyaWQgbGluZXMNCiAgICBwYW5lbC5ncmlkLm1pbm9yLnggPSBlbGVtZW50X2JsYW5rKCksICAgICAgICAgICAgICAgICAgICAgICMgTm8gbWlub3IgeCBncmlkIGxpbmVzDQogICAgYXhpcy50aWNrcy5sZW5ndGggPSB1bml0KC0wLjI1LCAiY20iKSwgICAgICAgICAgICAgICAgICAgICAgIyBJbmNyZWFzZSB0aWNrIGxlbmd0aA0KICAgIGF4aXMudGlja3MgPSBlbGVtZW50X2xpbmUoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMC41MCksICAgIyBEYXJrZXIgdGlja3MNCiAgICBheGlzLmxpbmUueCA9IGVsZW1lbnRfbGluZShjb2xvciA9ICJibGFjayIsIHNpemUgPSAwLjc1KSwgICMgRGFyayBib3R0b20gYm9yZGVyDQogICAgYXhpcy5saW5lLnkgPSBlbGVtZW50X2xpbmUoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMC43NSkgICAjIERhcmsgbGVmdCBib3JkZXINCiAgKQ0KDQojIFByaW50IHRoZSBwbG90IA0KcHJpbnQocDEpDQoNCg0KYGBgDQoNCg0KIyBBQVBMDQoNCkFwcGxlIEluYy4gKEFBUEwpIGlzIGNvbnNpZGVyZWQgYSB0ZWNobm9sb2d5IGNvbXBhbnkgaGVhZHF1YXJ0ZXJlZCBpbiBDdXBlcnRpbm8sIENhbGlmb3JuaWEuIEVzdGFibGlzaGVkIGluIDE5NzYgYnkgU3RldmUgSm9icywgU3RldmUgV296bmlhaywgYW5kIFJvbmFsZCBXYXluZSwgQXBwbGUgaXMgYmVzdCBrbm93biBmb3IgaXRzIGlubm92YXRpdmUgY29uc3VtZXIgZWxlY3Ryb25pY3MsIHNvZnR3YXJlLCBhbmQgc2VydmljZXMsIGluY2x1ZGluZyB0aGUgaVBob25lLCBpUGFkLCBNYWMgY29tcHV0ZXJzLCBBcHBsZSBXYXRjaCwgYW5kIEFwcGxlIFRWLiBUaGUgY29tcGFueSBhbHNvIG9mZmVycyBwb3B1bGFyIHNvZnR3YXJlIGVjb3N5c3RlbXMgbGlrZSBpT1MsIG1hY09TLCBhbmQgaUNsb3VkLCBhcyB3ZWxsIGFzIHN1YnNjcmlwdGlvbiBzZXJ2aWNlcyBzdWNoIGFzIEFwcGxlIE11c2ljLCBBcHBsZSBUVissIGFuZCBBcHBsZSBQYXkuDQoNCiMjIEFBUEwgR1INCg0KIyMjIERhdGENCg0KVGhlIEFBUEwgRGF0YSBwcmVzZW50ZWQgaGVyZSBpcyBzb3VyY2VkIGZyb20gWWFob28gRmluYW5jZSwgZmlsdGVyZWQgdG8gZGlzcGxheSBNb250aGx5IEhpc3RvcmljYWwgRGF0YSAoZS5nLiwgMDMvMDEvMjAyNCkuIFRoaXMgZGF0YSByZXByZXNlbnRzIHRoZSBjbG9zaW5nIHByaWNlIG9mIHRoZSBsYXN0IHRyYWRpbmcgZGF5IG9mIGVhY2ggbW9udGggKGUuZy4sIDAzLzI4LzIwMjQpLiBQbGVhc2Ugbm90ZSB0aGF0IHRoZSBzdGF0aXN0aWNzIHByZXNlbnRlZCBoZXJlIG1heSBkaWZmZXIgZnJvbSB0aG9zZSBpbiBZYWhvbyBGaW5hbmNlJ3MgUGVyZm9ybWFuY2Ugc2VjdGlvbiBkdWUgdG8gZGlmZmVyZW5jZXMgaW4gZGF0YSBhZ2dyZWdhdGlvbiBhbmQgY2FsY3VsYXRpb24gbWV0aG9kcy4gIA0KDQpEYXRhIFNvdXJjZTogYHIgbnJ2JHNvdXJjZV9hYXBsX3lhaG9vYA0KDQpgYGB7ciBhYXBsX3JhdywgZXZhbD1UUlVFLCBlY2hvPUZBTFNFfQ0KDQojIERpc3BsYXkgdGhlIHN0cnVjdHVyZSBvZiB0aGUgZGF0YXNldCB0byBjb25maXJtIGNvbHVtbiBuYW1lcw0KaW50ZXJhY3RpdmVfc3RyKG5ydCRhYXBsX3JhdykNCg0KbGlicmFyeShkcGx5cikNCmxpYnJhcnkobHVicmlkYXRlKSAgIyBGb3IgZGF0ZSBtYW5pcHVsYXRpb24NCmxpYnJhcnkoc2NhbGVzKQ0KbGlicmFyeShzdHJpbmdyKQ0KDQojIEVuc3VyZSB0aGUgJ0RhdGUnIGNvbHVtbiBpcyBvZiBEYXRlIGNsYXNzDQphYXBsX3JhdyA8LSBucnQkYWFwbF9yYXcgJT4lDQogIG11dGF0ZShEYXRlID0gYXMuRGF0ZShEYXRlLCBmb3JtYXQgPSAiJVktJW0tJWQiKSkNCg0KIyBGaW5kIHRoZSBtaW5pbXVtIGFuZCBtYXhpbXVtIHllYXINCm1pbl95ZWFyIDwtIGZvcm1hdChtaW4oYWFwbF9yYXckRGF0ZSwgbmEucm0gPSBUUlVFKSwgIiVZIikNCm1heF95ZWFyIDwtIGZvcm1hdChtYXgoYWFwbF9yYXckRGF0ZSwgbmEucm0gPSBUUlVFKSwgIiVZIikNCmludGVyYWN0aXZlX3ByaW50KG1pbl95ZWFyKQ0KaW50ZXJhY3RpdmVfcHJpbnQobWF4X3llYXIpDQoNCiMgVXBkYXRlIGRhdGEgZnJhbWUgd2l0aCBwcm9wZXIgZGF0ZSBhbmQgcGVyY2VudGFnZSBoYW5kbGluZw0KYWFwbF9yYXcgPC0gYWFwbF9yYXcgJT4lDQogIG11dGF0ZSgNCiAgICAjIENvbnZlcnQgQ2xvc2UgRGF0ZSB0byAiWVlZWS1NTS1ERCIgZm9ybWF0DQogICAgYERhdGVgID0gZm9ybWF0KGFzLkRhdGUoYXMuY2hhcmFjdGVyKGBEYXRlYCksIG9yaWdpbiA9ICIxOTcwLTAxLTAxIiksICIlWS0lbS0lZCIpLA0KDQogICAgIyBFbnN1cmUgQ2xvc2UgaXMgYSBudW1iZXIgZm9ybWF0dGVkIHRvIDIgZGVjaW1hbCBwbGFjZXMNCiAgICBgQ2xvc2VgID0gbnVtYmVyKGFzLm51bWVyaWMoZ3N1YigiLCIsICIiLCBDbG9zZSkpLCBiaWcubWFyayA9ICIsIiwgZGVjaW1hbC5tYXJrID0gIi4iLCBhY2N1cmFjeSA9IDAuMDEpLA0KDQogICAgIyBDbGVhbiBhbmQgaGFuZGxlIHBlcmNlbnRhZ2UgY29sdW1ucw0KICAgIGFjcm9zcygzOjMsIH4gew0KICAgICAgdmFsdWUgPC0gZ3N1YigiWywlXFxzXSIsICIiLCAuKSAgIyBSZW1vdmUgJSwgY29tbWFzLCBhbmQgc3BhY2VzDQogICAgICBudW1lcmljX3ZhbHVlIDwtIHN1cHByZXNzV2FybmluZ3MoYXMubnVtZXJpYyh2YWx1ZSkpICAjIENvbnZlcnQgdG8gbnVtZXJpYw0KICAgICAgaWZlbHNlKA0KICAgICAgICAhaXMubmEobnVtZXJpY192YWx1ZSksIA0KICAgICAgICBwYXN0ZTAoZm9ybWF0KHJvdW5kKG51bWVyaWNfdmFsdWUqMTAwLCAyKSwgYmlnLm1hcmsgPSAiLCIsIHNjaWVudGlmaWMgPSBGQUxTRSksICIlIiksICAjIEZvcm1hdCB0byAyIGRlY2ltYWwgcGxhY2VzIGFuZCBhZGQgY29tbWFzDQogICAgICAgIC4NCiAgICAgICkNCiAgICB9KQ0KICApICU+JQ0KICBhcnJhbmdlKGRlc2MoYERhdGVgKSkgICMgU29ydCBieSBEYXRlIGZyb20gbmV3ZXN0IHRvIG9sZGVzdA0KDQojIERpc3BsYXkgdGhlIGZvcm1hdHRlZCBkYXRhDQppbnRlcmFjdGl2ZV9zdHIoYWFwbF9yYXcpDQppbnRlcmFjdGl2ZV9wcmludChhYXBsX3JhdykNCg0KIyBEaXNwbGF5IHRoZSB0YWJsZSB3aXRoIGNhcHRpb24NCmNhdCgiXG5cbiMjIyMgQUFQTCBZZWFybHkgUGVyZm9ybWFuY2UgKCIsIG1pbl95ZWFyLCAiLSIsIG1heF95ZWFyLCAiKVxuIiwgc2VwID0gIiIpDQpmb3JtYXRfZXF1YWxfd2lkdGhfZ3JvdXBlZChhYXBsX3JhdywgZ3JvdXBpbmdfZmFjdG9yID0gMikNCiMgY2F0KCJcblxuIFNvdXJjZTogIiwgbnJ2JHNvdXJjZV9hYXBsX3lhaG9vLCAiXG4iKQ0KDQpgYGANCg0KIyMjIFN1bW1hcnkNCg0KYGBge3IgYWFwbF9yYXdfc3VtbWFyeSwgZXZhbD1UUlVFLCBlY2hvPUZBTFNFfQ0KDQojIExvYWQgbmVjZXNzYXJ5IGxpYnJhcmllcw0KbGlicmFyeShkcGx5cikNCmxpYnJhcnkodGliYmxlKQ0KbGlicmFyeShrbml0cikNCmxpYnJhcnkoa2FibGVFeHRyYSkNCg0KaW50ZXJhY3RpdmVfc3RyKGFhcGxfcmF3KQ0KaW50ZXJhY3RpdmVfcHJpbnQoYWFwbF9yYXcpDQoNCiMgRW5zdXJlIHRoZSBEYXRlIGNvbHVtbiBpcyBhIHByb3BlciBEYXRlIG9iamVjdCBhbmQgZXh0cmFjdCB0aGUgeWVhcg0KYWFwbF9yYXcgPC0gYWFwbF9yYXcgJT4lDQogIHNsaWNlKC0xKSAlPiUgIyBSZW1vdmUgdGhlIGZpcnN0IHJvdw0KICAjIG11dGF0ZShEYXRlID0gaWZlbHNlKHJvd19udW1iZXIoKSA9PSAxLCAiMjAyNS0wMS0wMSIsIERhdGUpKSAlPiUNCiAgbXV0YXRlKA0KICAgIERhdGUgPSBhcy5udW1lcmljKGZvcm1hdChhcy5EYXRlKERhdGUsIGZvcm1hdCA9ICIlWS0lbS0lZCIpLCAiJVkiKSksDQogICAgYDEtWWVhciBDQUdSYCA9IGFzLm51bWVyaWMoZ3N1YigiW14wLTkuLV0iLCAiIiwgYDEtWWVhciBDQUdSYCkpDQogICkNCg0KIyBTb3J0IGRhdGEgYnkgRGF0ZSBpbiBhc2NlbmRpbmcgb3JkZXINCmFhcGxfcmF3IDwtIGFhcGxfcmF3ICU+JQ0KICBhcnJhbmdlKERhdGUpDQoNCg0KIyBDYWxjdWxhdGUgdGhlIENBR1IgYW5kIGR5bmFtaWNhbGx5IGNyZWF0ZSBhIHZhcmlhYmxlIG5hbWUgd2l0aCB0aGUgZm9ybWF0IGFhcGxfY2Fncl92YWx1ZV9zPG1pbl95ZWFyPl9lPG1heF95ZWFyPg0KaW5pdGlhbF92YWx1ZSA8LSAxMDAgICMgQXNzdW1pbmcgYW4gaW5pdGlhbCBpbmRleCB2YWx1ZSBvZiAxMDANCmZpbmFsX3ZhbHVlIDwtIGluaXRpYWxfdmFsdWUgKiBwcm9kKDEgKyBhYXBsX3JhdyRgMS1ZZWFyIENBR1JgIC8gMTAwLCBuYS5ybSA9IFRSVUUpDQptaW5feWVhciA8LSBtaW4oYWFwbF9yYXckRGF0ZSwgbmEucm0gPSBUUlVFKQ0KbWF4X3llYXIgPC0gbWF4KGFhcGxfcmF3JERhdGUsIG5hLnJtID0gVFJVRSkNCm51bV95ZWFycyA8LSBtYXhfeWVhciAtIG1pbl95ZWFyDQpjYWdyX3ZhbHVlIDwtIHJvdW5kKCgoZmluYWxfdmFsdWUgLyBpbml0aWFsX3ZhbHVlKV4oMSAvIG51bV95ZWFycykgLSAxKSAqIDEwMCwgMikNCnZhcl9uYW1lIDwtIHBhc3RlMCgiYWFwbF9jYWdyX3ZhbHVlX3MiLCBtaW5feWVhciwgIl9lIiwgbWF4X3llYXIpDQphc3NpZ24odmFyX25hbWUsIGNhZ3JfdmFsdWUpDQoNCiMgQ29udmVydCBBQVBMIGRhdGEgdG8gbnVtZXJpYywgcmVtb3ZpbmcgYW55IHBlcmNlbnRhZ2Ugc2lnbnMNCmRhdGEgPC0gYXMubnVtZXJpYyhnc3ViKCIlIiwgIiIsIGFhcGxfcmF3JGAxLVllYXIgQ0FHUmApKQ0KDQojIENhbGN1bGF0ZSBzdGF0aXN0aWNzDQpjb3VudF9vYnNlcnZhdGlvbnMgPC0gc3VtKCFpcy5uYShkYXRhKSkNCm1lYW5fdmFsdWUgPC0gcm91bmQobWVhbihkYXRhLCBuYS5ybSA9IFRSVUUpLCAyKQ0KbWVkaWFuX3ZhbHVlIDwtIHJvdW5kKG1lZGlhbihkYXRhLCBuYS5ybSA9IFRSVUUpLCAyKQ0Kc2RfdmFsdWUgPC0gcm91bmQoc2QoZGF0YSwgbmEucm0gPSBUUlVFKSwgMikNCm1pbl9jYWdyX3JhbmdlIDwtIHJvdW5kKGNhZ3JfdmFsdWUgLSBzZF92YWx1ZSwgMikNCm1heF9jYWdyX3JhbmdlIDwtIHJvdW5kKGNhZ3JfdmFsdWUgKyBzZF92YWx1ZSwgMikNCm1pbl92YWx1ZSA8LSByb3VuZChtaW4oZGF0YSwgbmEucm0gPSBUUlVFKSwgMikNCm1heF92YWx1ZSA8LSByb3VuZChtYXgoZGF0YSwgbmEucm0gPSBUUlVFKSwgMikNCg0KIyBUYXJnZXQgUmF0ZSBBbmFseXNpcyAtIFJlZmVyIHRvICJQcmVmZXJyZWQgVGFyZ2V0cyIgb3IgaW5jbHVkZSBiZWxvdyBmb3IgaW5kaXZpZHVhbCBjaGFuZ2VzLg0KYWJvdmVfdGFyZ2V0X2luZmxhdGlvbiA8LSBzdW0oZGF0YSA+PSB0YXJnZXRfaW5mbGF0aW9uLCBuYS5ybSA9IFRSVUUpDQphYm92ZV90YXJnZXRfY29uc2VydmF0aXZlIDwtIHN1bShkYXRhID49IHRhcmdldF9jb25zZXJ2YXRpdmUsIG5hLnJtID0gVFJVRSkNCmFib3ZlX3RhcmdldF9tb2RlcmF0ZSA8LSBzdW0oZGF0YSA+PSB0YXJnZXRfbW9kZXJhdGUsIG5hLnJtID0gVFJVRSkNCmFib3ZlX3RhcmdldF9hZ2dyZXNzaXZlIDwtIHN1bShkYXRhID49IHRhcmdldF9hZ2dyZXNzaXZlLCBuYS5ybSA9IFRSVUUpDQoNCnBlcmNlbnRfYWJvdmVfdGFyZ2V0X2NvbnNlcnZhdGl2ZSA8LSByb3VuZCgoYWJvdmVfdGFyZ2V0X2NvbnNlcnZhdGl2ZSAvIGNvdW50X29ic2VydmF0aW9ucykgKiAxMDAsIDIpDQpwZXJjZW50X2Fib3ZlX3RhcmdldF9pbmZsYXRpb24gPC0gcm91bmQoKGFib3ZlX3RhcmdldF9pbmZsYXRpb24gLyBjb3VudF9vYnNlcnZhdGlvbnMpICogMTAwLCAyKQ0KcGVyY2VudF9hYm92ZV90YXJnZXRfbW9kZXJhdGUgPC0gcm91bmQoKGFib3ZlX3RhcmdldF9tb2RlcmF0ZSAvIGNvdW50X29ic2VydmF0aW9ucykgKiAxMDAsIDIpDQpwZXJjZW50X2Fib3ZlX3RhcmdldF9hZ2dyZXNzaXZlIDwtIHJvdW5kKChhYm92ZV90YXJnZXRfYWdncmVzc2l2ZSAvIGNvdW50X29ic2VydmF0aW9ucykgKiAxMDAsIDIpDQoNCiMgQ29tcGlsZSBzdGF0aXN0aWNzIGludG8gYSBsaXN0IGZvciBlYXN5IGNvbnZlcnNpb24gdG8gYSBkYXRhIGZyYW1lIHdpdGggZGVmaW5pdGlvbnMNCmFhcGxfcmF3X3N1bW1hcnkgPC0gdHJpYmJsZSgNCiAgflN0YXRpc3RpYywgflZhbHVlLCB+RGVmaW5pdGlvbiwNCiAgIkNvdW50IG9mIE9ic2VydmF0aW9ucyIsIGFzLmNoYXJhY3Rlcihjb3VudF9vYnNlcnZhdGlvbnMpLCAiVG90YWwgbnVtYmVyIG9mIGRhdGEgcG9pbnRzIGNvbGxlY3RlZCBvdmVyIHRoZSBzcGVjaWZpYyBwZXJpb2QuIiwNCiAgIkNBR1IiLCBwYXN0ZTAoY2Fncl92YWx1ZSwgIiUiKSwgIkNvbXBvdW5kIEF2ZXJhZ2UgR3Jvd3RoIFJhdGU7IG1lYW4gZ3Jvd3RoIHJhdGUgb3ZlciBhIHBlcmlvZCBpZiBpdCBoYWQgY29tcG91bmRlZCBhbnVhbGx5LiIsDQogICJNZWFuIiwgcGFzdGUwKG1lYW5fdmFsdWUsICIlIiksICJSZWZsZWN0cyB0aGUgZ2VuZXJhbCBwcmljZSBsZXZlbCBhbmQgb3ZlcmFsbCBncm93dGggcmF0ZS4iLA0KICAiTWVkaWFuIiwgcGFzdGUwKG1lZGlhbl92YWx1ZSwgIiUiKSwgIk1pZGRsZSB2YWx1ZSBvZiB0aGUgZGF0YSB3aGVuIG9yZGVyZWQgY2hyb25vbG9naWNhbGx5OyBjZW50cmFsIHRlbmRlbmN5IG1lYXN1cmUgbGVzcyBhZmZlY3RlZCBieSBleHRyZW1lIHZhbHVlcy4iLA0KICAiU3RhbmRhcmQgRGV2aWF0aW9uIChWb2xhdGlsaXR5KSIsIHBhc3RlMChzZF92YWx1ZSwgIiUiKSwgIlRoZSBkaXNwZXJzaW9uIG9mIHZhbHVlcyBmcm9tIHRoZSBtZWFuLCBpbmRpY2F0aW5nIHRoZSB2b2xhdGlsaXR5IG9mIHByaWNlIGNoYW5nZXMgYW5kIGVjb25vbWljIHN0YWJpbGl0eS4iLA0KICAiTWluIENBR1IgUmFuZ2UgKENBR1IgLSBTRCkiLCBwYXN0ZTAobWluX2NhZ3JfcmFuZ2UsICIlIiksICJMb3dlciBib3VuZGFyeSBvZiBleHBlY3RlZCBBQVBMIHJhbmdlOyBsb3dlc3QgZXN0aW1hdGUgb2YgdHlwaWNhbCBncm93dGggcmF0ZSBjb25zaWRlcmluZyBub3JtYWwgZmx1Y3R1YXRpb25zLiIsDQogICJNYXggQ0FHUiBSYW5nZSAoQ0FHUiArIFNEKSIsIHBhc3RlMChtYXhfY2Fncl9yYW5nZSwgIiUiKSwgIlVwcGVyIGJvdW5kYXJ5IG9mIGV4cGVjdGVkIEFBUEwgcmFuZ2U7IGhpZ2hlc3QgZXN0aW1hdGUgb2YgdHlwaWNhbCBncm93dGggcmF0ZSBjb25zaWRlcmluZyBub3JtYWwgZmx1Y3R1YXRpb25zLiIsDQogICJNaW5pbXVtIiwgcGFzdGUwKG1pbl92YWx1ZSwgIiUiKSwgIkxvd2VzdCBncm93dGggcmF0ZS4iLA0KICAiTWF4aW11bSIsIHBhc3RlMChtYXhfdmFsdWUsICIlIiksICJIaWdoZXN0IGdyb3d0aCByYXRlLiIsDQogICJQZXJjZW50IEFib3ZlIEluZmxhdGlvbiBUYXJnZXQiLCBwYXN0ZTAocGVyY2VudF9hYm92ZV90YXJnZXRfaW5mbGF0aW9uLCAiJSIpLCAiUGVyY2VudGFnZSBvZiB2YWx1ZXMgYWJvdmUgdGhlIGluZmxhdGlvbiB0YXJnZXQgc3BlY2lmaWVkIGluIFByZWZlcnJlZCBUYXJnZXRzIHNlY3Rpb24uIiwNCiAgIlBlcmNlbnQgQWJvdmUgQ29uc2VydmF0aXZlIFRhcmdldCIsIHBhc3RlMChwZXJjZW50X2Fib3ZlX3RhcmdldF9jb25zZXJ2YXRpdmUsICIlIiksICJQZXJjZW50YWdlIG9mIHZhbHVlcyBhYm92ZSB0aGUgY29uc2VydmF0aXZlIHRhcmdldCBzcGVjaWZpZWQgaW4gUHJlZmVycmVkIFRhcmdldHMgc2VjdGlvbi4iLA0KICAiUGVyY2VudCBBYm92ZSBNb2RlcmF0ZSBUYXJnZXQiLCBwYXN0ZTAocGVyY2VudF9hYm92ZV90YXJnZXRfbW9kZXJhdGUsICIlIiksICJQZXJjZW50YWdlIG9mIHZhbHVlcyBhYm92ZSB0aGUgbW9kZXJhdGUgdGFyZ2V0IHNwZWNpZmllZCBpbiBQcmVmZXJyZWQgVGFyZ2V0cyBzZWN0aW9uLiIsDQogICJQZXJjZW50IEFib3ZlIEFnZ3Jlc3NpdmUgVGFyZ2V0IiwgcGFzdGUwKHBlcmNlbnRfYWJvdmVfdGFyZ2V0X2FnZ3Jlc3NpdmUsICIlIiksICJQZXJjZW50YWdlIG9mIHZhbHVlcyBhYm92ZSB0aGUgYWdncmVzc2l2ZSB0YXJnZXQgc3BlY2lmaWVkIGluIFByZWZlcnJlZCBUYXJnZXRzIHNlY3Rpb24uIg0KKQ0KDQojIENvbnZlcnQgdG8gY2hhcmFjdGVyIHRvIGF2b2lkIGF1dG9tYXRpYyBkZWNpbWFsIHBvaW50cyBvbiB3aG9sZSBudW1iZXJzDQphYXBsX3Jhd19zdW1tYXJ5IDwtIGFhcGxfcmF3X3N1bW1hcnkgJT4lDQogIG11dGF0ZShhY3Jvc3MoZXZlcnl0aGluZygpLCBhcy5jaGFyYWN0ZXIpKQ0KDQojIERpc3BsYXkgZm9ybWF0dGVkIHRhYmxlDQpjYXQoIlxuXG4jIyMjIEFubnVhbCBHcm93dGggUmF0ZSBTdW1tYXJ5ICgiLCBtaW5feWVhciwgIi0iLCBtYXhfeWVhciwgIilcbiIsIHNlcCA9ICIiKQ0KZm9ybWF0XzNjb2xfY3VzdG9tX3dpZHRocyhhYXBsX3Jhd19zdW1tYXJ5LCBjb2wxX3dpZHRoID0gIjIwZW0iLCBjb2wyX3dpZHRoID0gIjEwZW0iLCBjb2wzX3dpZHRoID0gIjQwZW0iKSANCg0KIyBWaWV3KGFhcGxfcmF3X3N1bW1hcnkpDQppbnRlcmFjdGl2ZV9zdHIoYWFwbF9yYXdfc3VtbWFyeSkNCg0KYGBgDQoNCkFBUEwncyBJbmRleCBleGhpYml0cyBhIGByIGlmKGNhZ3JfdmFsdWUgPiB0YXJnZXRfYWdncmVzc2l2ZSkgImFnZ3Jlc3NpdmUiIGVsc2UgaWYoY2Fncl92YWx1ZSA+IHRhcmdldF9tb2RlcmF0ZSkgIm1vZGVyYXRlIiBlbHNlIGlmKGNhZ3JfdmFsdWUgPiB0YXJnZXRfY29uc2VydmF0aXZlKSAiY29uc2VydmF0aXZlIiBlbHNlIGlmKGNhZ3JfdmFsdWUgPiB0YXJnZXRfaW5mbGF0aW9uKSAiYmFzZWxpbmUiIGVsc2UgImRpc2FwcG9pbnRpbmciYCBDQUdSIGF0IGByIGNhZ3JfdmFsdWVgJSwgYHIgaWYoY2Fncl92YWx1ZSA8IG1lYW5fdmFsdWUpICJsb3dlciB0aGFuIiBlbHNlICJoaWdoZXIgdGhhbiJgIHRoZSBtZWFuIGdyb3d0aCByYXRlIG9mIGByIG1lYW5fdmFsdWVgJSwgcmVmbGVjdGluZyB0aGUgaW1wYWN0IG9mIHNob3J0LXRlcm0gdm9sYXRpbGl0eSBhbmQgYHIgaWYoY2Fncl92YWx1ZSA+IG1lYW5fdmFsdWUpICJkZWNsaW5lcyIgZWxzZSAiZ3Jvd3RoIHNwaWtlcyJgLiBUaGUgbWVkaWFuIHJldHVybiBvZiBgciBtZWRpYW5fdmFsdWVgJSBpbmRpY2F0ZXMgdGhhdCBtb3JlIHRoYW4gaGFsZiBvZiB0aGUgb2JzZXJ2ZWQgeWVhcnMgZXhwZXJpZW5jZWQgcmV0dXJucyBgciBpZihjYWdyX3ZhbHVlIDwgbWVkaWFuX3ZhbHVlKSAiYWJvdmUiIGVsc2UgImJlbG93ImAgdGhlIG1lYW4uIFRoZSByZWxhdGlvbnNoaXAgYmV0d2VlbiB0aGUgQ0FHUiBhbmQgdGhlIG1lZGlhbiBncm93dGggcmF0ZSBzdWdnZXN0cyB0aGF0IHN1c3RhaW5lZCBwZXJpb2RzIG9mIGFib3ZlLW1lZGlhbiBncm93dGggaGF2ZSBleGVydGVkIGN1bXVsYXRpdmUgYHIgaWYoY2Fncl92YWx1ZSA8IG1lZGlhbl92YWx1ZSkgInVwd2FyZCBwcmVzc3VyZSIgZWxzZSAiZG93bndhcmQgcHJlc3N1cmUiYCBvbiBvdmVyYWxsIHByaWNlIGxldmVscy4gVGhpcyByZWxhdGlvbnNoaXAgaGlnaGxpZ2h0cyBhIGRpc3RyaWJ1dGlvbiB3aXRoIG5vdGFibGUgZXh0cmVtZXMgb24gdGhlIGByIGlmKGNhZ3JfdmFsdWUgPCBtZWFuX3ZhbHVlKSAiaGlnaGVyIiBlbHNlICJsb3dlciJgIGVuZCwgcmVmbGVjdGluZyBgciBpZihjYWdyX3ZhbHVlIDwgbWVhbl92YWx1ZSkgInBvc2l0aXZlIiBlbHNlICJuZWdhdGl2ZSJgIHNrZXduZXNzLiBUaGlzIGByIGlmKGNhZ3JfdmFsdWUgPCBtZWRpYW5fdmFsdWUpICJwb3NpdGl2ZSIgZWxzZSAibmVnYXRpdmUiYCBza2V3bmVzcyBpbXBsaWVzIHRoYXQgd2hpbGUgbW9yZSB0aGFuIGhhbGYgb2YgdGhlIG9ic2VydmVkIHllYXJzIGV4cGVyaWVuY2VkIHJldHVybnMgYHIgaWYoY2Fncl92YWx1ZSA8IG1lZGlhbl92YWx1ZSkgImFib3ZlIHRoZSBtZWFuLCBkb3dudHVybnMgY2FuIGJlIHNldmVyZSIgZWxzZSAiYmVsb3cgdGhlIG1lYW4sIHVwdHVybnMgY2FuIGJlIHNpZ25pZmljYW50ImAuIEhvd2V2ZXIsIHRoZSBtYXJrZXQgaGFzIGhpc3RvcmljYWxseSBwcm92aWRlZCBzdWJzdGFudGlhbCBgciBpZihjYWdyX3ZhbHVlIDwgbWVkaWFuX3ZhbHVlKSAidXBzaWRlIHBvdGVudGlhbCIgZWxzZSAiZG93bnNpZGUgcmlzayJgLiBBZGRpdGlvbmFsbHksIHRoZSBmYWN0IHRoYXQgYHIgcGVyY2VudF9hYm92ZV90YXJnZXRfaW5mbGF0aW9uYCUgb2YgdGhlIHllYXJzIGV4Y2VlZGVkIHRoZSBpbmZsYXRpb24gdGFyZ2V0IGByIGlmIChwZXJjZW50X2Fib3ZlX3RhcmdldF9pbmZsYXRpb24gPiA3MCkgInJlaW5mb3JjZXMgQUFQTCdzIGVmZmVjdGl2ZW5lc3MgYXMgYSBzdHJvbmcgbG9uZy10ZXJtIGhlZGdlIiBlbHNlIGlmIChwZXJjZW50X2Fib3ZlX3RhcmdldF9pbmZsYXRpb24gPiA2MCkgInJlaW5mb3JjZXMgQUFQTCdzIGVmZmVjdGl2ZW5lc3MgYXMgYSBsb25nLXRlcm0gaGVkZ2UiIGVsc2UgaWYgKHBlcmNlbnRfYWJvdmVfdGFyZ2V0X2luZmxhdGlvbiA+IDUwKSAicXVlc3Rpb25zIEFBUEwncyBlZmZlY3RpdmVuZXNzICBhcyBhIGxvbmctdGVybSBoZWRnZSIgZWxzZSAidW5kZXJtaW5lcyBBQVBMJ3MgZWZmZWN0aXZlbmVzcyBhcyBhIGxvbmctdGVybSBoZWRnZSJgIGFnYWluc3QgaW5mbGF0aW9uLg0KDQpUaGUgc3RhbmRhcmQgZGV2aWF0aW9uIG9mIGByIHNkX3ZhbHVlYCUgYHIgaWYoc2RfdmFsdWUgPiAyMCkgImluZGljYXRlcyBleHRyZW1lIHZvbGF0aWxpdHksIHJlZmxlY3Rpbmcgc3Vic3RhbnRpYWwgZmx1Y3R1YXRpb25zIGluIGVxdWl0eSBtYXJrZXRzIiBlbHNlIGlmKHNkX3ZhbHVlID4gMTUpICJ1bmRlcnNjb3JlcyBzaWduaWZpY2FudCB2b2xhdGlsaXR5LCBhIGNvbW1vbiBmZWF0dXJlIG9mIGVxdWl0eSBtYXJrZXRzIiBlbHNlICJzdWdnZXN0cyBtb2RlcmF0ZSB2b2xhdGlsaXR5LCB0eXBpY2FsIG9mIHJlbGF0aXZlbHkgc3RhYmxlIG1hcmtldHMiYC4gVGhlIGByIHJhbmdlX3JhdGlvIDwtIChtYXhfdmFsdWUgLSBtaW5fdmFsdWUpIC8gc2RfdmFsdWU7IGlmKHJhbmdlX3JhdGlvID4gNSkgImhpZ2hseSB2b2xhdGlsZSIgZWxzZSBpZihyYW5nZV9yYXRpbyA+IDMpICJub3RhYmxlIiBlbHNlICJjb21wYXJhdGl2ZWx5IHN0YWJsZSJgIHJhbmdlIG9mIGFubnVhbCByZXR1cm5zLCBzcGFubmluZyBmcm9tIGByIG1pbl92YWx1ZWAlIHRvIGByIG1heF92YWx1ZWAlLCBgciBpZihyYW5nZV9yYXRpbyA+IDUpICJpbGx1c3RyYXRlcyBhIGhpZ2hseSB2b2xhdGlsZSBtYXJrZXQgZW52aXJvbm1lbnQsIHBhcnRseSBkdWUgdG8gaXRzIGNvbXBvc2l0aW9uLCB3aXRoIHRoZSBwb3RlbnRpYWwgZm9yIGJvdGggZXh0cmVtZSBnYWlucyBhbmQgbG9zc2VzIiBlbHNlIGlmKHJhbmdlX3JhdGlvID4gMykgImhpZ2hsaWdodHMgbm90YWJsZSBtYXJrZXQgdmFyaWFiaWxpdHksIHBhcnRseSBkdWUgdG8gaXRzIGNvbXBvc2l0aW9uLCAgcmVmbGVjdGluZyBib3RoIG9wcG9ydHVuaXRpZXMgYW5kIHJpc2tzIiBlbHNlICJpbmRpY2F0ZXMgYSBjb21wYXJhdGl2ZWx5IHN0YWJsZSBtYXJrZXQsIHBhcnRseSBkdWUgdG8gaXRzIGNvbXBvc2l0aW9uLCB3aXRoIGxlc3MgZXh0cmVtZSBhbm51YWwgZmx1Y3R1YXRpb25zImAuIA0KDQpGb3IgQUFQTCB0byBiZSBjb25zaWRlcmVkIGEgaGlnaC1wZXJmb3JtaW5nIGFuZCByZXNpbGllbnQgbG9uZy10ZXJtIGludmVzdG1lbnQsIGl0IHdvdWxkIGJlIGlkZWFsIHRvIGV4Y2VlZCB0aGUgYWdncmVzc2l2ZSB0YXJnZXQgIChlLmcuLCBgciAodGFyZ2V0X2FnZ3Jlc3NpdmUgLSB0YXJnZXRfaW5mbGF0aW9uKWAlIGFubnVhbGl6ZWQgcmV0dXJucywgYWNjb3VudGluZyBmb3IgaGlnaGVyIGluZmxhdGlvbi1hZGp1c3RlZCBwZXJmb3JtYW5jZSBleHBlY3RhdGlvbnMpIGluIGF0IGxlYXN0IDQwJS01MCUgb2YgdGhlIHllYXJzLiBUaGlzIHJhbmdlIHJlZmxlY3RzIHRoZSBwb3RlbnRpYWwgZm9yIHN0cm9uZyB1cHNpZGUgaW4gbWFueSB5ZWFycyB3aGlsZSBiYWxhbmNpbmcgdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBtYXJrZXRzIGRvIGV4cGVyaWVuY2UgZG93bnR1cm5zLiBUaGUgZmFjdCB0aGF0IGByIHBlcmNlbnRfYWJvdmVfdGFyZ2V0X2FnZ3Jlc3NpdmVgJSBvZiB0aGUgeWVhcnMgZXhjZWVkZWQgdGhlIGFnZ3Jlc3NpdmUgdGFyZ2V0IGByIGlmKHBlcmNlbnRfYWJvdmVfdGFyZ2V0X2FnZ3Jlc3NpdmUgPiA1MCkgImluZGljYXRlcyBjb25zaXN0ZW50IGFuZCByb2J1c3QgZ3Jvd3RoLCBtYWtpbmcgQUFQTCBhIHN0cm9uZyBvcHRpb24gZm9yIHRob3NlIHNlZWtpbmcgYWdncmVzc2l2ZSBpbnZlc3RtZW50cy4iIGVsc2UgaWYocGVyY2VudF9hYm92ZV90YXJnZXRfYWdncmVzc2l2ZSA+IDQwKSAic3VnZ2VzdHMgdGhhdCB3aGlsZSBub3QgY29uc2lzdGVudCwgQUFQTCBoYXMgaGlzdG9yaWNhbGx5IHByb3ZpZGVkIHJvYnVzdCBncm93dGggb3ZlciB0aGUgbG9uZyB0ZXJtLCBtYWtpbmcgaXQgYSB2aWFibGUgaW52ZXN0bWVudCBmb3IgdGhvc2Ugd2l0aCBhIGhpZ2hlciByaXNrIHRvbGVyYW5jZS4iIGVsc2UgInJhaXNlcyBjb25jZXJucyBhYm91dCBBQVBMJ3MgYWJpbGl0eSB0byBtZWV0IGFnZ3Jlc3NpdmUgZ3Jvd3RoIHRhcmdldHMsIG1ha2luZyBpdCBsZXNzIHN1aXRhYmxlIGZvciBpbnZlc3RvcnMgd2l0aCBoaWdoZXIgcmlzayB0b2xlcmFuY2UuImANCg0KIyMjIEdyYXBoDQoNCmBgYHtyIGFhcGxfcmF3X2dyYXBoLCBmaWcud2lkdGg9MTAsIGZpZy5oZWlnaHQ9NywgZXZhbD1UUlVFLCBlY2hvPUZBTFNFfQ0KDQojIExvYWQgbmVjZXNzYXJ5IGxpYnJhcmllcw0KbGlicmFyeShnZ3Bsb3QyKQ0KbGlicmFyeShkcGx5cikNCg0KIyBDb252ZXJ0IGAxLVllYXIgQ0FHUmAgdG8gbnVtZXJpYyBmb3IgcGxvdHRpbmcNCmFhcGxfcmF3IDwtIGFhcGxfcmF3ICU+JQ0KICBtdXRhdGUoDQogICAgYERhdGVgID0gYXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIoYERhdGVgKSksICAjIEVuc3VyZSBEYXRlIGlzIG51bWVyaWMNCiAgICBgMS1ZZWFyIENBR1JgID0gYXMubnVtZXJpYyhnc3ViKCIlIiwgIiIsIGAxLVllYXIgQ0FHUmApKQ0KICApDQoNCiMgRmluZCB0aGUgbWluaW11bSBhbmQgbWF4aW11bSB4LXZhbHVlIGluIHlvdXIgZGF0YQ0KbWF4X3ggPC0gbWF4KGFzLmludGVnZXIoYWFwbF9yYXckRGF0ZSksIG5hLnJtID0gVFJVRSkNCm1pbl94IDwtIG1pbihhcy5pbnRlZ2VyKGFhcGxfcmF3JERhdGUpLCBuYS5ybSA9IFRSVUUpDQppbnRlcmFjdGl2ZV9wcmludChtYXhfeCkgICMgVGVzdA0KaW50ZXJhY3RpdmVfcHJpbnQobWluX3gpICAjIFRlc3QNCg0KIyBGaW5kIHRoZSBtaW5pbXVtIGFuZCBtYXhpbXVtIHllYXINCm1pbl95ZWFyIDwtIG1pbihhYXBsX3JhdyREYXRlLCBuYS5ybSA9IFRSVUUpDQptYXhfeWVhciA8LSBtYXgoYWFwbF9yYXckRGF0ZSwgbmEucm0gPSBUUlVFKQ0KaW50ZXJhY3RpdmVfcHJpbnQobWluX3llYXIpDQppbnRlcmFjdGl2ZV9wcmludChtYXhfeWVhcikNCg0KDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KIyMgUExPVCBGVUxMIFdJVEhPVVQgTElNSVRTDQoNCiMgRGVmaW5lIHN0YXJ0IGFuZCBlbmQgeWVhcnMNCnN0YXJ0X3llYXIgPC0gYXMubnVtZXJpYyhtaW5feWVhcikNCmVuZF95ZWFyIDwtIDIwMjQNCnllYXJfcmFuZ2UgPC0gZW5kX3llYXIgLSBzdGFydF95ZWFyICsgMSAgIyBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiB5ZWFycw0KDQojIERlZmluZSBicmVha3Mgcm91bmRlZCBhcHByb3ByaWF0ZWx5DQpsaW1pdHNfc3RhcnRfeWVhciA8LSBmbG9vcihzdGFydF95ZWFyIC8gNSkgKiA1ICAjIFJvdW5kIGRvd24gdG8gdGhlIG5lYXJlc3QgbXVsdGlwbGUgb2YgNQ0KbGltaXRzX2VuZF95ZWFyIDwtIGNlaWxpbmcoZW5kX3llYXIgLyA1KSAqIDUgICAjIFJvdW5kIHVwIHRvIHRoZSBuZWFyZXN0IG11bHRpcGxlIG9mIDUNCg0KIyBDcmVhdGUgZHluYW1pYyB0aXRsZSBhbmQgY2FwdGlvbg0KZHluYW1pY190aXRsZSA8LSBwYXN0ZTAoIkFubnVhbCBHcm93dGggUmF0ZXMgT3ZlciAiLHllYXJfcmFuZ2UsICIgWWVhcnMgKCIsIHN0YXJ0X3llYXIsICItIiwgZW5kX3llYXIsICIpIikNCmR5bmFtaWNfY2FwdGlvbiA8LSBwYXN0ZTAoIkFBUEwgQW5udWFsIEdyb3d0aCBSYXRlcywgRGF0YSBQZXJpb2QgKCIsIG1pbl95ZWFyLCAi4oCTIiwgbWF4X3llYXIsICIpIikNCg0KIyBDcmVhdGUgdGhlIGZ1bGwsIG5vbi1maWx0ZXJlZCB4LWF4aXMgcGxvdCB3aXRoIGR5bmFtaWMgeCBwbGFjZW1lbnQgZm9yIGFubm90YXRpb25zDQpwMSA8LSBnZ3Bsb3QoYWFwbF9yYXcsIGFlcyh4ID0gYXMuaW50ZWdlcihEYXRlKSwgeSA9IGAxLVllYXIgQ0FHUmApKSArDQogIA0KICAjIEFkZCBzaGFkZWQgYXJlYXMgZm9yIGJhY2tncm91bmQgZWZmZWN0DQogIGdlb21fcmVjdChhZXMoeG1pbiA9IC1JbmYsIHhtYXggPSBJbmYsIHltaW4gPSB0YXJnZXRfYWdncmVzc2l2ZSwgeW1heCA9IEluZiksIGZpbGwgPSAibGlnaHRncmVlbiIsIGFscGhhID0gMC4wMjUpICsNCiAgZ2VvbV9yZWN0KGFlcyh4bWluID0gLUluZiwgeG1heCA9IEluZiwgeW1pbiA9IHRhcmdldF9jb25zZXJ2YXRpdmUsIHltYXggPSB0YXJnZXRfYWdncmVzc2l2ZSksIGZpbGwgPSAib3JhbmdlIiwgYWxwaGEgPSAwLjAyNSkgKw0KICBnZW9tX3JlY3QoYWVzKHhtaW4gPSAtSW5mLCB4bWF4ID0gSW5mLCB5bWluID0gLUluZiwgeW1heCA9IHRhcmdldF9jb25zZXJ2YXRpdmUpLCBmaWxsID0gImxpZ2h0Y29yYWwiLCBhbHBoYSA9IDAuMDI1KSArDQogIA0KICAjIFBsb3QgbGluZXMsIHBvaW50cywgYW5kIGFubm90YXRpb25zIG9uIHRvcCBvZiBzaGFkZWQgYXJlYXMNCiAgZ2VvbV9saW5lKGNvbG9yID0gIiM0QjAwODIiLCBzaXplID0gMS4wKSArICAgICAgICMgRGFyayBwdXJwbGUgbGluZSANCiAgZ2VvbV9wb2ludChjb2xvciA9ICIjNEIwMDgyIiwgc2l6ZSA9IDEuNSkgKyAgICAgICAgIyBEYXJrIHB1cnBsZSBwb2ludHMgDQogIA0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSB0YXJnZXRfYWdncmVzc2l2ZSwgY29sb3IgPSAiZGFya2JsdWUiLCBsaW5ldHlwZSA9ICJzb2xpZCIpICsNCiAgIyBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSB0YXJnZXRfbW9kZXJhdGUsIGNvbG9yID0gImRhcmtibHVlIiwgbGluZXR5cGUgPSAic29saWQiKSArDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IHRhcmdldF9jb25zZXJ2YXRpdmUsIGNvbG9yID0gImRhcmtibHVlIiwgbGluZXR5cGUgPSAic29saWQiKSArDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IHRhcmdldF9pbmZsYXRpb24sIGNvbG9yID0gImRhcmtyZWQiLCBsaW5ldHlwZSA9ICJkYXNoZWQiKSArDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IGNhZ3JfdmFsdWUsIGNvbG9yID0gImRhcmtyZWQiLCBsaW5ldHlwZSA9ICJkYXNoZWQiKSArDQogIA0KICAjIER5bmFtaWMgcmlnaHQtYWxpZ25lZCBwbGFjZW1lbnQgZm9yIGFubm90YXRpb25zDQogIGFubm90YXRlKCJ0ZXh0IiwgeCA9IEluZiwgeSA9IHRhcmdldF9hZ2dyZXNzaXZlLCBsYWJlbCA9ICJBZ2dyZXNzaXZlIiwgDQogICAgICAgICAgIGhqdXN0ID0gMSwgdmp1c3QgPSAtMC41MCwgY29sb3IgPSAiZGFya2JsdWUiLCBzaXplID0gNCkgKw0KICAjIGFubm90YXRlKCJ0ZXh0IiwgeCA9IEluZiwgeSA9IHRhcmdldF9tb2RlcmF0ZSwgbGFiZWwgPSAiTW9kZXJhdGUiLCANCiAgIyAgICAgICAgIGhqdXN0ID0gMSwgdmp1c3QgPSAtMC41MCwgY29sb3IgPSAiZGFya2JsdWUiLCBzaXplID0gNCkgKw0KICBhbm5vdGF0ZSgidGV4dCIsIHggPSBJbmYsIHkgPSB0YXJnZXRfY29uc2VydmF0aXZlLCBsYWJlbCA9ICJDb25zZXJ2YXRpdmUiLCANCiAgICAgICAgICAgaGp1c3QgPSAxLCB2anVzdCA9IC0wLjUwLCBjb2xvciA9ICJkYXJrYmx1ZSIsIHNpemUgPSA0KSArDQogIGFubm90YXRlKCJ0ZXh0IiwgeCA9IEluZiwgeSA9IHRhcmdldF9pbmZsYXRpb24sIGxhYmVsID0gIkluZmxhdGlvbiIsIA0KICAgICAgICAgICBoanVzdCA9IDEsIHZqdXN0ID0gKzEuMTAsIGNvbG9yID0gImRhcmtyZWQiLCBzaXplID0gNCkgKw0KICBhbm5vdGF0ZSgidGV4dCIsIHggPSBJbmYsIHkgPSBjYWdyX3ZhbHVlLCBsYWJlbCA9ICJDQUdSIiwgDQogICAgICAgICAgIGhqdXN0ID0gMSwgdmp1c3QgPSAtMC41MCwgY29sb3IgPSAiZGFya3JlZCIsIHNpemUgPSA0KSArIA0KDQogIGxhYnMoDQogICAgdGl0bGUgPSBkeW5hbWljX3RpdGxlLA0KICAgIHggPSAiWWVhciIsDQogICAgeSA9ICJHcm93dGggUmF0ZSAoJSkiLA0KICAgIGNhcHRpb24gPSBkeW5hbWljX2NhcHRpb24NCiAgKSArDQoNCiAgc2NhbGVfeF9jb250aW51b3VzKA0KICAgIGxpbWl0cyA9IGMoc3RhcnRfeWVhciwgZW5kX3llYXIgKyAzKSwgIyBSZXN0cmljdHMgeC1heGlzIGRhdGEgDQogICAgYnJlYWtzID0gc2VxKGxpbWl0c19zdGFydF95ZWFyLCBsaW1pdHNfZW5kX3llYXIsIDUpICMgU2V0cyBNYWpvciB4LWF4aXMgIA0KICApICsgICMgUmVzdHJpY3QgJiBTZXQgTWFqb3IgeC1heGlzIGxpbmVzIA0KICAgIA0KICB0aGVtZV9taW5pbWFsKCkgKw0KICB0aGVtZSgNCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41LCBzaXplID0gMjApLCAgICAgICAgICMgTGFyZ2VyIHRpdGxlIGZvbnQNCiAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0KSwgICAgICAgICAgICAgICAgICAgICMgTGFyZ2VyIHgtYXhpcyBsYWJlbCBmb250DQogICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCksICAgICAgICAgICAgICAgICAgICAjIExhcmdlciB5LWF4aXMgbGFiZWwgZm9udA0KICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSwgc2l6ZSA9IDE0KSwgICMgTGFyZ2VyIHgtYXhpcyB0ZXh0DQogICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0KSwgICAgICAgICAgICAgICAgICAgICAjIExhcmdlciB5LWF4aXMgdGV4dA0KICAgIHBhbmVsLmdyaWQubWFqb3IgPSBlbGVtZW50X2xpbmUobGluZXR5cGUgPSAiZG90dGVkIiwgY29sb3IgPSAiYmxhY2siKSwgICAgICAgICAjIE1ham9yIGdyaWQgbGluZXMNCiAgICBwYW5lbC5ncmlkLm1pbm9yLnggPSBlbGVtZW50X2JsYW5rKCksICMgZWxlbWVudF9saW5lKGNvbG9yID0gImdyZXk4MCIpICAjIE1pbm9yIHggZ3JpZCBsaW5lcyBmb3IgZWFjaCB5ZWFyDQogICAgIyBwYW5lbC5ib3JkZXIgPSBlbGVtZW50X3JlY3QoY29sb3IgPSAiZGFya2dyZXkiLCBmaWxsID0gTkEsIHNpemUgPSAxLjApICAjIERhcmsgYm9yZGVyIGFyb3VuZCB0aGUgcGxvdA0KICAgIGF4aXMudGlja3MubGVuZ3RoID0gdW5pdCgtMC4yNSwgImNtIiksICAgICAgICAgICAgICAgICAgICAgICMgSW5jcmVhc2UgdGljayBsZW5ndGgNCiAgICBheGlzLnRpY2tzID0gZWxlbWVudF9saW5lKGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDAuNTApLCAjIERhcmtlciB0aWNrcw0KICAgIGF4aXMubGluZS54ID0gZWxlbWVudF9saW5lKGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDAuNzUpLCAgIyBEYXJrIGJvdHRvbSBib3JkZXINCiAgICBheGlzLmxpbmUueSA9IGVsZW1lbnRfbGluZShjb2xvciA9ICJibGFjayIsIHNpemUgPSAwLjc1KSAgICMgRGFyayBsZWZ0IGJvcmRlcg0KICApDQoNCnByaW50KHAxKQ0KDQoNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQojIyBQTE9UIFJFU1RSSUNURUQgV0lUSCBMSU1JVFMNCg0KIyBGaWx0ZXIgdGhlIGRhdGEgZm9yIHRoZSByZXN0cmljdGVkIHgtYXhpcyByYW5nZSAoMjAwNi0yMDI0KQ0KcmVzdHJpY3RlZF9kYXRhIDwtIGFhcGxfcmF3ICU+JQ0KICBmaWx0ZXIoYXMuaW50ZWdlcihEYXRlKSA+PSAyMDA2ICYgYXMuaW50ZWdlcihEYXRlKSA8PSAyMDI0KQ0KDQojIERlZmluZSBzdGFydCBhbmQgZW5kIHllYXJzDQpzdGFydF95ZWFyIDwtIDIwMDYNCmVuZF95ZWFyIDwtIDIwMjQNCnllYXJfcmFuZ2UgPC0gZW5kX3llYXIgLSBzdGFydF95ZWFyICsgMSAgIyBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiB5ZWFycw0KDQojIERlZmluZSBicmVha3Mgcm91bmRlZCBhcHByb3ByaWF0ZWx5DQpsaW1pdHNfc3RhcnRfeWVhciA8LSBmbG9vcihzdGFydF95ZWFyIC8gNSkgKiA1ICAjIFJvdW5kIGRvd24gdG8gdGhlIG5lYXJlc3QgbXVsdGlwbGUgb2YgNQ0KbGltaXRzX2VuZF95ZWFyIDwtIGNlaWxpbmcoZW5kX3llYXIgLyA1KSAqIDUgICAjIFJvdW5kIHVwIHRvIHRoZSBuZWFyZXN0IG11bHRpcGxlIG9mIDUNCg0KIyBDcmVhdGUgZHluYW1pYyB0aXRsZSBhbmQgY2FwdGlvbg0KZHluYW1pY190aXRsZSA8LSBwYXN0ZTAoIkFubnVhbCBHcm93dGggUmF0ZXMgT3ZlciAiLHllYXJfcmFuZ2UsICIgWWVhcnMgKCIsIHN0YXJ0X3llYXIsICItIiwgZW5kX3llYXIsICIpIikNCmR5bmFtaWNfY2FwdGlvbiA8LSBwYXN0ZTAoIkFBUEwgQW5udWFsIEdyb3d0aCBSYXRlcywgRGF0YSBQZXJpb2QgKCIsIG1pbl95ZWFyLCAi4oCTIiwgbWF4X3llYXIsICIpIikNCg0KIyBDYWxjdWxhdGUgZHluYW1pYyB5LWF4aXMgbGltaXRzIGZvciB0aGUgcmVzdHJpY3RlZCBkYXRhDQp5X21pbiA8LSBtaW4ocmVzdHJpY3RlZF9kYXRhJGAxLVllYXIgQ0FHUmAsIG5hLnJtID0gVFJVRSkNCnlfbWF4IDwtIG1heChyZXN0cmljdGVkX2RhdGEkYDEtWWVhciBDQUdSYCwgbmEucm0gPSBUUlVFKQ0KDQojIENyZWF0ZSB0aGUgZnVsbCwgbm9uLWZpbHRlcmVkIHgtYXhpcyBwbG90IHdpdGggZHluYW1pYyB4IHBsYWNlbWVudCBmb3IgYW5ub3RhdGlvbnMNCnAzIDwtIGdncGxvdChyZXN0cmljdGVkX2RhdGEsIGFlcyh4ID0gYXMuaW50ZWdlcihEYXRlKSwgeSA9IGAxLVllYXIgQ0FHUmApKSArDQogIA0KICAjIEFkZCBzaGFkZWQgYXJlYXMgZm9yIGJhY2tncm91bmQgZWZmZWN0DQogIGdlb21fcmVjdChhZXMoeG1pbiA9IC1JbmYsIHhtYXggPSBJbmYsIHltaW4gPSB0YXJnZXRfYWdncmVzc2l2ZSwgeW1heCA9IEluZiksIGZpbGwgPSAibGlnaHRncmVlbiIsIGFscGhhID0gMC4wMzApICsNCiAgZ2VvbV9yZWN0KGFlcyh4bWluID0gLUluZiwgeG1heCA9IEluZiwgeW1pbiA9IHRhcmdldF9jb25zZXJ2YXRpdmUsIHltYXggPSB0YXJnZXRfYWdncmVzc2l2ZSksIGZpbGwgPSAib3JhbmdlIiwgYWxwaGEgPSAwLjAzMCkgKw0KICBnZW9tX3JlY3QoYWVzKHhtaW4gPSAtSW5mLCB4bWF4ID0gSW5mLCB5bWluID0gLUluZiwgeW1heCA9IHRhcmdldF9jb25zZXJ2YXRpdmUpLCBmaWxsID0gImxpZ2h0Y29yYWwiLCBhbHBoYSA9IDAuMDMwKSArDQogIA0KICAjIFBsb3QgbGluZXMsIHBvaW50cywgYW5kIGFubm90YXRpb25zIG9uIHRvcCBvZiBzaGFkZWQgYXJlYXMNCiAgZ2VvbV9saW5lKGNvbG9yID0gIiM0QjAwODIiLCBzaXplID0gMS4wKSArICAgICAgICMgRGFyayBwdXJwbGUgbGluZSANCiAgZ2VvbV9wb2ludChjb2xvciA9ICIjNEIwMDgyIiwgc2l6ZSA9IDEuNSkgKyAgICAgICAgIyBEYXJrIHB1cnBsZSBwb2ludHMgDQogIA0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSB0YXJnZXRfYWdncmVzc2l2ZSwgY29sb3IgPSAiZGFya2JsdWUiLCBsaW5ldHlwZSA9ICJzb2xpZCIpICsNCiAgIyBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSB0YXJnZXRfbW9kZXJhdGUsIGNvbG9yID0gImRhcmtibHVlIiwgbGluZXR5cGUgPSAic29saWQiKSArDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IHRhcmdldF9jb25zZXJ2YXRpdmUsIGNvbG9yID0gImRhcmtibHVlIiwgbGluZXR5cGUgPSAic29saWQiKSArDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IHRhcmdldF9pbmZsYXRpb24sIGNvbG9yID0gImRhcmtyZWQiLCBsaW5ldHlwZSA9ICJkYXNoZWQiKSArDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IGNhZ3JfdmFsdWUsIGNvbG9yID0gImRhcmtyZWQiLCBsaW5ldHlwZSA9ICJkYXNoZWQiKSArDQogIA0KICAjIER5bmFtaWMgcmlnaHQtYWxpZ25lZCBwbGFjZW1lbnQgZm9yIGFubm90YXRpb25zDQogIGFubm90YXRlKCJ0ZXh0IiwgeCA9IEluZiwgeSA9IHRhcmdldF9hZ2dyZXNzaXZlLCBsYWJlbCA9ICJBZ2dyZXNzaXZlIiwgDQogICAgICAgICAgIGhqdXN0ID0gMSwgdmp1c3QgPSAtMC41MCwgY29sb3IgPSAiZGFya2JsdWUiLCBzaXplID0gNCkgKw0KICAjIGFubm90YXRlKCJ0ZXh0IiwgeCA9IEluZiwgeSA9IHRhcmdldF9tb2RlcmF0ZSwgbGFiZWwgPSAiTW9kZXJhdGUiLCANCiAgIyAgICAgICAgIGhqdXN0ID0gMSwgdmp1c3QgPSAtMC41MCwgY29sb3IgPSAiZGFya2JsdWUiLCBzaXplID0gNCkgKw0KICBhbm5vdGF0ZSgidGV4dCIsIHggPSBJbmYsIHkgPSB0YXJnZXRfY29uc2VydmF0aXZlLCBsYWJlbCA9ICJDb25zZXJ2YXRpdmUiLCANCiAgICAgICAgICAgaGp1c3QgPSAxLCB2anVzdCA9IC0wLjUwLCBjb2xvciA9ICJkYXJrYmx1ZSIsIHNpemUgPSA0KSArDQogIGFubm90YXRlKCJ0ZXh0IiwgeCA9IEluZiwgeSA9IHRhcmdldF9pbmZsYXRpb24sIGxhYmVsID0gIkluZmxhdGlvbiIsIA0KICAgICAgICAgICBoanVzdCA9IDEsIHZqdXN0ID0gKzEuMTAsIGNvbG9yID0gImRhcmtyZWQiLCBzaXplID0gNCkgKw0KICBhbm5vdGF0ZSgidGV4dCIsIHggPSBJbmYsIHkgPSBjYWdyX3ZhbHVlLCBsYWJlbCA9ICJDQUdSIiwgDQogICAgICAgICAgIGhqdXN0ID0gMSwgdmp1c3QgPSAtMC41MCwgY29sb3IgPSAiZGFya3JlZCIsIHNpemUgPSA0KSArIA0KDQogIGxhYnMoDQogICAgdGl0bGUgPSBkeW5hbWljX3RpdGxlLA0KICAgIHggPSAiWWVhciIsDQogICAgeSA9ICJHcm93dGggUmF0ZSAoJSkiLA0KICAgIGNhcHRpb24gPSBkeW5hbWljX2NhcHRpb24NCiAgKSArDQogIA0KICBjb29yZF9jYXJ0ZXNpYW4oeWxpbSA9IGMoeV9taW4sIHlfbWF4KSkgKyAjIEFwcGx5IGR5bmFtaWMgeS1heGlzIGxpbWl0cw0KICBzY2FsZV94X2NvbnRpbnVvdXMoDQogICAgbGltaXRzID0gYyhzdGFydF95ZWFyLCBlbmRfeWVhciArIDIpLCANCiAgICBicmVha3MgPSBzZXEobGltaXRzX3N0YXJ0X3llYXIsIGxpbWl0c19lbmRfeWVhciwgNSkNCiAgKSArICAjIFJlc3RyaWN0ICYgU2V0IE1ham9yIHgtYXhpcyBsaW5lcyBmb3IgZWFjaCB5ZWFyDQoNCiAgdGhlbWVfbWluaW1hbCgpICsNCiAgdGhlbWUoDQogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSwgc2l6ZSA9IDIwKSwgICAgICAgICAjIExhcmdlciB0aXRsZSBmb250DQogICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCksICAgICAgICAgICAgICAgICAgICAjIExhcmdlciB4LWF4aXMgbGFiZWwgZm9udA0KICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQpLCAgICAgICAgICAgICAgICAgICAgIyBMYXJnZXIgeS1heGlzIGxhYmVsIGZvbnQNCiAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEsIHNpemUgPSAxNCksICAjIExhcmdlciB4LWF4aXMgdGV4dA0KICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCksICAgICAgICAgICAgICAgICAgICAgIyBMYXJnZXIgeS1heGlzIHRleHQNCiAgICBwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9saW5lKGxpbmV0eXBlID0gImRvdHRlZCIsIGNvbG9yID0gImJsYWNrIiksICAgICAgICAgIyBNYWpvciBncmlkIGxpbmVzDQogICAgcGFuZWwuZ3JpZC5taW5vci54ID0gZWxlbWVudF9ibGFuaygpLCAjIGVsZW1lbnRfbGluZShjb2xvciA9ICJncmV5ODAiKSAgIyBNaW5vciB4IGdyaWQgbGluZXMgZm9yIGVhY2ggeWVhcg0KICAgICMgcGFuZWwuYm9yZGVyID0gZWxlbWVudF9yZWN0KGNvbG9yID0gImRhcmtncmV5IiwgZmlsbCA9IE5BLCBzaXplID0gMS4wKSAgIyBEYXJrIGJvcmRlciBhcm91bmQgdGhlIHBsb3QNCiAgICBheGlzLnRpY2tzLmxlbmd0aCA9IHVuaXQoLTAuMjUsICJjbSIpLCAgICAgICAgICAgICAgICAgICAgICAjIEluY3JlYXNlIHRpY2sgbGVuZ3RoDQogICAgYXhpcy50aWNrcyA9IGVsZW1lbnRfbGluZShjb2xvciA9ICJibGFjayIsIHNpemUgPSAwLjUwKSwgIyBEYXJrZXIgdGlja3MNCiAgICBheGlzLmxpbmUueCA9IGVsZW1lbnRfbGluZShjb2xvciA9ICJibGFjayIsIHNpemUgPSAwLjc1KSwgICMgRGFyayBib3R0b20gYm9yZGVyDQogICAgYXhpcy5saW5lLnkgPSBlbGVtZW50X2xpbmUoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMC43NSkgICAjIERhcmsgbGVmdCBib3JkZXINCiAgKQ0KDQpwcmludChwMykNCg0KYGBgDQoNCg0KIyMgQUFQTCBDQUdSDQoNCiMjIyBEYXRhDQoNCmBgYHtyIGFhcGxfcmF3X2dyLCBldmFsPVRSVUUsIGVjaG89RkFMU0V9DQoNCiMgVmlldyhucnQkYWFwbF9yYXdfZ3IpDQppbnRlcmFjdGl2ZV9zdHIobnJ0JGFhcGxfcmF3X2dyKQ0KDQpsaWJyYXJ5KGRwbHlyKQ0KbGlicmFyeShsdWJyaWRhdGUpICAjIEZvciBkYXRlIG1hbmlwdWxhdGlvbg0KbGlicmFyeShzY2FsZXMpDQpsaWJyYXJ5KHN0cmluZ3IpDQoNCiMgVXBkYXRlIGRhdGEgZnJhbWUgd2l0aCBwcm9wZXIgZGF0ZSBhbmQgcGVyY2VudGFnZSBoYW5kbGluZw0KYWFwbF9yYXdfZ3IgPC0gbnJ0JGFhcGxfcmF3X2dyICU+JQ0KICBtdXRhdGUoDQogICAgIyBDb252ZXJ0IENsb3NlIERhdGUgdG8gIllZWVktTU0tREQiIGZvcm1hdA0KICAgIGBEYXRlYCA9IGZvcm1hdChhcy5EYXRlKGFzLmNoYXJhY3RlcihgRGF0ZWApLCBvcmlnaW4gPSAiMTk3MC0wMS0wMSIpLCAiJVktJW0tJWQiKSwNCiAgICANCiAgICAjIEVuc3VyZSBDbG9zZSBpcyBhIG51bWJlciBmb3JtYXR0ZWQgdG8gMiBkZWNpbWFsIHBsYWNlcw0KICAgIGBDbG9zZWAgPSBudW1iZXIoYXMubnVtZXJpYyhnc3ViKCIsIiwgIiIsIENsb3NlKSksIGJpZy5tYXJrID0gIiwiLCBkZWNpbWFsLm1hcmsgPSAiLiIsIGFjY3VyYWN5ID0gMC4wMSksDQoNCiAgICAjIENsZWFuIGFuZCBoYW5kbGUgcGVyY2VudGFnZSBjb2x1bW5zDQogICAgYWNyb3NzKDM6MTEsIH4gew0KICAgICAgdmFsdWUgPC0gZ3N1YigiWywlXFxzXSIsICIiLCAuKSAgIyBSZW1vdmUgJSwgY29tbWFzLCBhbmQgc3BhY2VzDQogICAgICBudW1lcmljX3ZhbHVlIDwtIHN1cHByZXNzV2FybmluZ3MoYXMubnVtZXJpYyh2YWx1ZSkpICAjIENvbnZlcnQgdG8gbnVtZXJpYw0KICAgICAgaWZlbHNlKA0KICAgICAgICAhaXMubmEobnVtZXJpY192YWx1ZSksIA0KICAgICAgICBwYXN0ZTAoZm9ybWF0KHJvdW5kKG51bWVyaWNfdmFsdWUqMTAwLCAyKSwgYmlnLm1hcmsgPSAiLCIsIHNjaWVudGlmaWMgPSBGQUxTRSksICIlIiksICAjIEZvcm1hdCB0byAyIGRlY2ltYWwgcGxhY2VzIGFuZCBhZGQgY29tbWFzDQogICAgICAgIC4NCiAgICAgICkNCiAgICB9KQ0KICApICU+JQ0KICBhcnJhbmdlKGRlc2MoYERhdGVgKSkgICMgU29ydCBieSBEYXRlIGZyb20gbmV3ZXN0IHRvIG9sZGVzdA0KDQojIENyZWF0ZSBhYXBsX3Jhd19ncjogQ0dSDQphYXBsX3Jhd19jZ3IgPC0gYWFwbF9yYXdfZ3IgJT4lDQogIHNlbGVjdChgRGF0ZWAsIGBDbG9zZWAsIGAxLVllYXIgQ0FHUmAsIGNvbnRhaW5zICgiQ0dSIikpDQoNCiMgQ3JlYXRlIGFhcGxfcmF3X2dyOiBDQUdSDQphYXBsX3Jhd19jYWdyIDwtIGFhcGxfcmF3X2dyICU+JQ0KICBzZWxlY3QoYERhdGVgLCBgQ2xvc2VgLCBjb250YWlucyAoIkNBR1IiKSkNCg0KIyBEaXNwbGF5IGJvdGggdGFibGVzIGZvciBjb25maXJtYXRpb24NCmludGVyYWN0aXZlX3ByaW50KGFhcGxfcmF3X2NncikNCmludGVyYWN0aXZlX3ByaW50KGFhcGxfcmF3X2NhZ3IpDQoNCiMgT3B0aW9uYWw6IFByaW50IHRhYmxlIHN1bW1hcmllcw0KaW50ZXJhY3RpdmVfc3RyKGFhcGxfcmF3X2NncikNCmludGVyYWN0aXZlX3N0cihhYXBsX3Jhd19jYWdyKQ0KDQojIERpc3BsYXkgY2FwdGlvbnMgZm9yIGVhY2ggdGFibGUNCiMgY2F0KCJcblxuIyMjIyBDdW11bGF0aXZlIEdyb3d0aCBSYXRlcyAoIiwgbWluX3llYXIsICItIiwgbWF4X3llYXIsICIpXG4iLCBzZXAgPSAiIikNCiMgZm9ybWF0X2VxdWFsX3dpZHRoKGFhcGxfcmF3X2NncikNCg0KY2F0KCJcblxuIyMjIyBDb21wb3VuZCBBdmVyYWdlIEdyb3d0aCBSYXRlcyAoIiwgbWluX3llYXIsICItIiwgbWF4X3llYXIsICIpXG4iLCBzZXAgPSAiIikNCmZvcm1hdF9lcXVhbF93aWR0aChhYXBsX3Jhd19jYWdyKQ0KDQojIFZpZXcoYWFwbF9yYXdfY2FncikNCiMgY29sbmFtZXMoYWFwbF9yYXdfY2FncikNCmludGVyYWN0aXZlX3N0cihhYXBsX3Jhd19jYWdyKQ0KDQoNCmBgYA0KDQojIyMgU3VtbWFyeQ0KDQpgYGB7ciBhYXBsX3Jhd19jYWdyX3N1bW1hcnksIGV2YWw9VFJVRSwgZWNobz1GQUxTRX0NCg0KaW50ZXJhY3RpdmVfc3RyKGFhcGxfcmF3X2NhZ3IpDQoNCiMgTG9hZCBuZWNlc3NhcnkgbGlicmFyaWVzDQpsaWJyYXJ5KGRwbHlyKQ0KbGlicmFyeSh0aWJibGUpDQoNCiMgRGVmaW5lIGEgaGVscGVyIGZ1bmN0aW9uIHRvIGNsZWFuIGFuZCBjb252ZXJ0IHBlcmNlbnRhZ2VzDQpjbGVhbl9wZXJjZW50YWdlIDwtIGZ1bmN0aW9uKGNvbHVtbikgew0KICBhcy5udW1lcmljKGdzdWIoIiUiLCAiIiwgY29sdW1uKSkNCn0NCg0KIyBEZWZpbmUgdGhlIHN0YXRpc3RpYyBuYW1lcyBmb3IgdGhlIHN1bW1hcnkgdGFibGUNCnN0YXRpc3RpY19uYW1lcyA8LSBjKA0KICAiQ291bnQgb2YgT2JzZXJ2YXRpb25zIiwgDQogICJNZWFuIiwgDQogICJNZWRpYW4iLA0KICAiU3RhbmRhcmQgRGV2aWF0aW9uIChWb2xhdGlsaXR5KSIsIA0KICAiTWluIENBR1IgUmFuZ2UgKENBR1IgLSBTRCkiLA0KICAiTWF4IENBR1IgUmFuZ2UgKENBR1IgKyBTRCkiLA0KICAiTWluaW11bSIsIA0KICAiTWF4aW11bSIsIA0KICAiUGVyY2VudCBBYm92ZSBJbmZsYXRpb24gVGFyZ2V0IiwgDQogICJQZXJjZW50IEFib3ZlIENvbnNlcnZhdGl2ZSBUYXJnZXQiLCANCiAgIlBlcmNlbnQgQWJvdmUgTW9kZXJhdGUgVGFyZ2V0IiwgDQogICJQZXJjZW50IEFib3ZlIEFnZ3Jlc3NpdmUgVGFyZ2V0Ig0KKQ0KDQojIEFkanVzdCB0aGUgZmlyc3Qgcm93J3MgRGF0ZSBhbmQgY2xlYW4gdXAgQ0FHUiBjb2x1bW5zDQphYXBsX3Jhd19jYWdyIDwtIGFhcGxfcmF3X2NhZ3IgJT4lDQogIHNsaWNlKC0xKSAlPiUgIyBSZW1vdmUgdGhlIGZpcnN0IHJvdw0KICBtdXRhdGUoDQogICAgIyBEYXRlID0gaWZlbHNlKHJvd19udW1iZXIoKSA9PSAxLCAiMjAyNS0wMS0wMSIsIERhdGUpLA0KICAgIERhdGUgPSBhcy5udW1lcmljKGZvcm1hdChhcy5EYXRlKERhdGUpLCAiJVkiKSksDQogICAgYDEtWWVhciBDQUdSYCA9IGNsZWFuX3BlcmNlbnRhZ2UoYDEtWWVhciBDQUdSYCksDQogICAgYDUtWWVhciBDQUdSYCA9IGNsZWFuX3BlcmNlbnRhZ2UoYDUtWWVhciBDQUdSYCksDQogICAgYDEwLVllYXIgQ0FHUmAgPSBjbGVhbl9wZXJjZW50YWdlKGAxMC1ZZWFyIENBR1JgKSwNCiAgICBgMjAtWWVhciBDQUdSYCA9IGNsZWFuX3BlcmNlbnRhZ2UoYDIwLVllYXIgQ0FHUmApLA0KICAgIGAzMC1ZZWFyIENBR1JgID0gY2xlYW5fcGVyY2VudGFnZShgMzAtWWVhciBDQUdSYCkNCiAgKQ0KDQojIEZ1bmN0aW9uIHRvIGNhbGN1bGF0ZSBzdGF0aXN0aWNzIGZvciBhIGdpdmVuIGRhdGFzZXQNCmNhbGNfc3RhdHMgPC0gZnVuY3Rpb24oZGF0YSkgew0KICBpZiAoc3VtKCFpcy5uYShkYXRhKSkgPCAyKSByZXR1cm4ocmVwKE5BLCBsZW5ndGgoc3RhdGlzdGljX25hbWVzKSkpICAjIEhhbmRsZSBpbnN1ZmZpY2llbnQgZGF0YQ0KDQogIGNvdW50X29ic2VydmF0aW9ucyA8LSBzdW0oIWlzLm5hKGRhdGEpKQ0KICBtZWFuX3ZhbHVlIDwtIHJvdW5kKG1lYW4oZGF0YSwgbmEucm0gPSBUUlVFKSwgMikNCiAgbWVkaWFuX3ZhbHVlIDwtIHJvdW5kKG1lZGlhbihkYXRhLCBuYS5ybSA9IFRSVUUpLCAyKQ0KICBzZF92YWx1ZSA8LSByb3VuZChzZChkYXRhLCBuYS5ybSA9IFRSVUUpLCAyKQ0KICBtaW5fY2Fncl9yYW5nZSA8LSByb3VuZChjYWdyX3ZhbHVlIC0gc2RfdmFsdWUsIDIpDQogIG1heF9jYWdyX3JhbmdlIDwtIHJvdW5kKGNhZ3JfdmFsdWUgKyBzZF92YWx1ZSwgMikNCiAgbWluX3ZhbHVlIDwtIHJvdW5kKG1pbihkYXRhLCBuYS5ybSA9IFRSVUUpLCAyKQ0KICBtYXhfdmFsdWUgPC0gcm91bmQobWF4KGRhdGEsIG5hLnJtID0gVFJVRSksIDIpDQogIA0KICAjIERlZmluZSBpbmZsYXRpb24gYW5kIGdyb3d0aCB0YXJnZXRzDQogIHRhcmdldF9pbmZsYXRpb24gPC0gMiAgIyBFeGFtcGxlIHRhcmdldCBmb3IgaW5mbGF0aW9uDQogIHRhcmdldF9jb25zZXJ2YXRpdmUgPC0gMyArIHRhcmdldF9pbmZsYXRpb24NCiAgdGFyZ2V0X21vZGVyYXRlIDwtIDUgKyB0YXJnZXRfaW5mbGF0aW9uDQogIHRhcmdldF9hZ2dyZXNzaXZlIDwtIDEwICsgdGFyZ2V0X2luZmxhdGlvbg0KICANCiAgYWJvdmVfdGFyZ2V0X2luZmxhdGlvbiA8LSBzdW0oZGF0YSA+PSB0YXJnZXRfaW5mbGF0aW9uLCBuYS5ybSA9IFRSVUUpDQogIGFib3ZlX3RhcmdldF9jb25zZXJ2YXRpdmUgPC0gc3VtKGRhdGEgPj0gdGFyZ2V0X2NvbnNlcnZhdGl2ZSwgbmEucm0gPSBUUlVFKQ0KICBhYm92ZV90YXJnZXRfbW9kZXJhdGUgPC0gc3VtKGRhdGEgPj0gdGFyZ2V0X21vZGVyYXRlLCBuYS5ybSA9IFRSVUUpDQogIGFib3ZlX3RhcmdldF9hZ2dyZXNzaXZlIDwtIHN1bShkYXRhID49IHRhcmdldF9hZ2dyZXNzaXZlLCBuYS5ybSA9IFRSVUUpDQogIA0KICBwZXJjZW50X2Fib3ZlX3RhcmdldF9jb25zZXJ2YXRpdmUgPC0gcm91bmQoKGFib3ZlX3RhcmdldF9jb25zZXJ2YXRpdmUgLyBjb3VudF9vYnNlcnZhdGlvbnMpICogMTAwLCAyKQ0KICBwZXJjZW50X2Fib3ZlX3RhcmdldF9pbmZsYXRpb24gPC0gcm91bmQoKGFib3ZlX3RhcmdldF9pbmZsYXRpb24gLyBjb3VudF9vYnNlcnZhdGlvbnMpICogMTAwLCAyKQ0KICBwZXJjZW50X2Fib3ZlX3RhcmdldF9tb2RlcmF0ZSA8LSByb3VuZCgoYWJvdmVfdGFyZ2V0X21vZGVyYXRlIC8gY291bnRfb2JzZXJ2YXRpb25zKSAqIDEwMCwgMikNCiAgcGVyY2VudF9hYm92ZV90YXJnZXRfYWdncmVzc2l2ZSA8LSByb3VuZCgoYWJvdmVfdGFyZ2V0X2FnZ3Jlc3NpdmUgLyBjb3VudF9vYnNlcnZhdGlvbnMpICogMTAwLCAyKQ0KICANCiAgYygNCiAgICBjb3VudF9vYnNlcnZhdGlvbnMsIA0KICAgIHBhc3RlMChtZWFuX3ZhbHVlLCAiJSIpLA0KICAgIHBhc3RlMChtZWRpYW5fdmFsdWUsICIlIiksDQogICAgcGFzdGUwKHNkX3ZhbHVlLCAiJSIpLA0KICAgIHBhc3RlMChtaW5fY2Fncl9yYW5nZSwgIiUiKSwNCiAgICBwYXN0ZTAobWF4X2NhZ3JfcmFuZ2UsICIlIiksDQogICAgcGFzdGUwKG1pbl92YWx1ZSwgIiUiKSwNCiAgICBwYXN0ZTAobWF4X3ZhbHVlLCAiJSIpLA0KICAgIHBhc3RlMChwZXJjZW50X2Fib3ZlX3RhcmdldF9pbmZsYXRpb24sICIlIiksDQogICAgcGFzdGUwKHBlcmNlbnRfYWJvdmVfdGFyZ2V0X2NvbnNlcnZhdGl2ZSwgIiUiKSwgDQogICAgcGFzdGUwKHBlcmNlbnRfYWJvdmVfdGFyZ2V0X21vZGVyYXRlLCAiJSIpLCANCiAgICBwYXN0ZTAocGVyY2VudF9hYm92ZV90YXJnZXRfYWdncmVzc2l2ZSwgIiUiKQ0KICApDQp9DQoNCiMgQ29sdW1ucyB0byBjYWxjdWxhdGUgQ0FHUiBzdGF0aXN0aWNzDQpjYWdyX2NvbHVtbnMgPC0gYygiMS1ZZWFyIENBR1IiLCAiNS1ZZWFyIENBR1IiLCAiMTAtWWVhciBDQUdSIiwgIjIwLVllYXIgQ0FHUiIsICIzMC1ZZWFyIENBR1IiKQ0KZXhpc3RpbmdfY2Fncl9jb2x1bW5zIDwtIGludGVyc2VjdChjYWdyX2NvbHVtbnMsIG5hbWVzKGFhcGxfcmF3X2NhZ3IpKQ0KDQojIENhbGN1bGF0ZSBzdGF0cyBmb3IgZWFjaCBDQUdSIGNvbHVtbg0KY2Fncl9zdGF0c19saXN0IDwtIGxhcHBseShhYXBsX3Jhd19jYWdyW2V4aXN0aW5nX2NhZ3JfY29sdW1uc10sIGNhbGNfc3RhdHMpDQoNCiMgQ29tcGlsZSBpbnRvIGEgc3VtbWFyeSBkYXRhIGZyYW1lDQphYXBsX3Jhd19jYWdyX3N1bW1hcnkgPC0gYXMuZGF0YS5mcmFtZShkby5jYWxsKGNiaW5kLCBjYWdyX3N0YXRzX2xpc3QpKQ0Kcm93bmFtZXMoYWFwbF9yYXdfY2Fncl9zdW1tYXJ5KSA8LSBzdGF0aXN0aWNfbmFtZXMNCg0KDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KIyMgU0FWRSBWQUxVRVMgRk9SIElOLUxJTkUgQ09ERQ0KDQojIERlZmluZSB0aGUgbWFwcGluZyBvZiByb3cgbmFtZXMgdG8gdmFyaWFibGUgbmFtZXMNCnJvd190b192YXJfbmFtZSA8LSBjKA0KICAiQ291bnQgb2YgT2JzZXJ2YXRpb25zIiA9ICJjb3VudF9vYnNlcnZhdGlvbnMiLA0KICAiTWVhbiIgPSAibWVhbl92YWx1ZSIsDQogICJNZWRpYW4iID0gIm1lZGlhbl92YWx1ZSIsDQogICJTdGFuZGFyZCBEZXZpYXRpb24gKFZvbGF0aWxpdHkpIiA9ICJzZF92YWx1ZSIsDQogICJNaW4gQ0FHUiBSYW5nZSAoQ0FHUiAtIFNEKSIgPSAibWluX2NhZ3JfcmFuZ2UiLA0KICAiTWF4IENBR1IgUmFuZ2UgKENBR1IgKyBTRCkiID0gIm1heF9jYWdyX3JhbmdlIiwNCiAgIk1pbmltdW0iID0gIm1pbl92YWx1ZSIsDQogICJNYXhpbXVtIiA9ICJtYXhfdmFsdWUiLA0KICAiUGVyY2VudCBBYm92ZSBJbmZsYXRpb24gVGFyZ2V0IiA9ICJwZXJjZW50X2Fib3ZlX3RhcmdldF9pbmZsYXRpb24iLA0KICAiUGVyY2VudCBBYm92ZSBDb25zZXJ2YXRpdmUgVGFyZ2V0IiA9ICJwZXJjZW50X2Fib3ZlX3RhcmdldF9jb25zZXJ2YXRpdmUiLA0KICAiUGVyY2VudCBBYm92ZSBNb2RlcmF0ZSBUYXJnZXQiID0gInBlcmNlbnRfYWJvdmVfdGFyZ2V0X21vZGVyYXRlIiwNCiAgIlBlcmNlbnQgQWJvdmUgQWdncmVzc2l2ZSBUYXJnZXQiID0gInBlcmNlbnRfYWJvdmVfdGFyZ2V0X2FnZ3Jlc3NpdmUiDQopDQoNCiMgRnVuY3Rpb24gdG8gc2F2ZSBzdW1tYXJ5IHZhbHVlcyBkeW5hbWljYWxseQ0Kc2F2ZV9jb2x1bW5fdmFsdWVzIDwtIGZ1bmN0aW9uKHN1bW1hcnlfZGYpIHsNCiAgIyBFeGNsdWRlIHRoZSAiU3RhdGlzdGljIiBhbmQgIk92ZXJhbGwiIGNvbHVtbnMNCiAgY29sdW1uc190b19zYXZlIDwtIHNldGRpZmYobmFtZXMoc3VtbWFyeV9kZiksIGMoIlN0YXRpc3RpYyIsICJPdmVyYWxsIikpDQogIA0KICAjIEl0ZXJhdGUgb3ZlciBlYWNoIGNvbHVtbg0KICBmb3IgKGNvbCBpbiBjb2x1bW5zX3RvX3NhdmUpIHsNCiAgICAjIEZvcm1hdCBjb2x1bW4gbmFtZSB0byBsb3dlcmNhc2UgYW5kIHJlcGxhY2UgaW52YWxpZCBjaGFyYWN0ZXJzDQogICAgY29sX25hbWUgPC0gdG9sb3dlcihnc3ViKCJbXmEtekEtWjAtOV0iLCAiXyIsIGNvbCkpDQogICAgDQogICAgIyBFeHRyYWN0IHZhbHVlcyBmb3IgdGhlIGN1cnJlbnQgY29sdW1uDQogICAgY29sX3ZhbHVlcyA8LSBzdW1tYXJ5X2RmW1tjb2xdXQ0KICAgIA0KICAgICMgU2F2ZSBlYWNoIHZhbHVlIGR5bmFtaWNhbGx5IHVzaW5nIHRoZSBtYXBwaW5nIGZvciByb3cgbmFtZXMNCiAgICBmb3IgKGkgaW4gc2VxX2Fsb25nKGNvbF92YWx1ZXMpKSB7DQogICAgICAjIEdldCB0aGUgY29ycmVzcG9uZGluZyB2YXJpYWJsZSBuYW1lIGZyb20gdGhlIG1hcHBpbmcNCiAgICAgIHN0YXRfbmFtZSA8LSByb3dfdG9fdmFyX25hbWVbcm93bmFtZXMoc3VtbWFyeV9kZilbaV1dDQogICAgICANCiAgICAgIGlmICghaXMubmEoc3RhdF9uYW1lKSkgeyAgIyBTa2lwIGlmIG5vIG1hcHBpbmcgaXMgZGVmaW5lZA0KICAgICAgICAjIENyZWF0ZSB0aGUgdmFyaWFibGUgbmFtZQ0KICAgICAgICB2YXJfbmFtZSA8LSBwYXN0ZTAoc3RhdF9uYW1lLCAiXyIsIGNvbF9uYW1lKQ0KICAgICAgICANCiAgICAgICAgIyBBdHRlbXB0IG51bWVyaWMgY29udmVyc2lvbiBmb3IgZG93bnN0cmVhbSB1c2UNCiAgICAgICAgdmFsdWUgPC0gc3VwcHJlc3NXYXJuaW5ncyhhcy5udW1lcmljKGdzdWIoIiUiLCAiIiwgY29sX3ZhbHVlc1tpXSkpKQ0KICAgICAgICANCiAgICAgICAgIyBBc3NpZ24gdGhlIHZhbHVlIHRvIHRoZSBnbG9iYWwgZW52aXJvbm1lbnQNCiAgICAgICAgYXNzaWduKHZhcl9uYW1lLCB2YWx1ZSwgZW52aXIgPSAuR2xvYmFsRW52KQ0KICAgICAgfQ0KICAgIH0NCiAgfQ0KfQ0KDQojIEFwcGx5IHRoZSBmdW5jdGlvbiB0byBzYXZlIHZhbHVlcyBmb3IgYWxsIGNvbHVtbnMgZXhjZXB0ICJPdmVyYWxsIg0Kc2F2ZV9jb2x1bW5fdmFsdWVzKGFhcGxfcmF3X2NhZ3Jfc3VtbWFyeSkNCg0KIyBFeGFtcGxlOiBBY2Nlc3NpbmcgZHluYW1pY2FsbHkgY3JlYXRlZCB2YXJpYWJsZXMNCmludGVyYWN0aXZlX3ByaW50KG1lYW5fdmFsdWVfMV95ZWFyX2NhZ3IpICAjIFNob3VsZCBwcmludCB0aGUgbWVhbiB2YWx1ZSBmb3IgMS1ZZWFyIENBR1INCmludGVyYWN0aXZlX3ByaW50KHBlcmNlbnRfYWJvdmVfdGFyZ2V0X2luZmxhdGlvbl81X3llYXJfY2FncikgICMgU2hvdWxkIHByaW50IHRoZSBwZXJjZW50IGFib3ZlIGluZmxhdGlvbiB0YXJnZXQgZm9yIDUtWWVhciBDQUdSDQppbnRlcmFjdGl2ZV9wcmludChzZF92YWx1ZV8xMF95ZWFyX2NhZ3IpICAjIFNob3VsZCBwcmludCB0aGUgc3RhbmRhcmQgZGV2aWF0aW9uIGZvciAxMC1ZZWFyIENBR1INCg0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiMjIE9WRVJBTEwgU1RBVElTVElDUyANCm51bWVyaWNfdmFsdWVzX2FsbCA8LSBhcy5udW1lcmljKHVubGlzdChhYXBsX3Jhd19jYWdyW2V4aXN0aW5nX2NhZ3JfY29sdW1uc10sIHVzZS5uYW1lcyA9IEZBTFNFKSkNCm51bWVyaWNfdmFsdWVzX2FsbCA8LSBudW1lcmljX3ZhbHVlc19hbGxbIWlzLm5hKG51bWVyaWNfdmFsdWVzX2FsbCldDQoNCm92ZXJhbGxfY291bnRfb2JzZXJ2YXRpb25zIDwtIGxlbmd0aChudW1lcmljX3ZhbHVlc19hbGwpDQpvdmVyYWxsX21lYW5fdmFsdWUgPC0gcm91bmQobWVhbihudW1lcmljX3ZhbHVlc19hbGwpLCAyKQ0Kb3ZlcmFsbF9tZWRpYW5fdmFsdWUgPC0gcm91bmQobWVkaWFuKG51bWVyaWNfdmFsdWVzX2FsbCksIDIpDQpvdmVyYWxsX3NkX3ZhbHVlIDwtIHJvdW5kKHNkKG51bWVyaWNfdmFsdWVzX2FsbCksIDIpDQpvdmVyYWxsX21pbl9jYWdyX3JhbmdlIDwtIHJvdW5kKGNhZ3JfdmFsdWUgLSBvdmVyYWxsX3NkX3ZhbHVlLCAyKQ0Kb3ZlcmFsbF9tYXhfY2Fncl9yYW5nZSA8LSByb3VuZChjYWdyX3ZhbHVlICsgb3ZlcmFsbF9zZF92YWx1ZSwgMikNCm92ZXJhbGxfbWluX3ZhbHVlIDwtIHJvdW5kKG1pbihudW1lcmljX3ZhbHVlc19hbGwpLCAyKQ0Kb3ZlcmFsbF9tYXhfdmFsdWUgPC0gcm91bmQobWF4KG51bWVyaWNfdmFsdWVzX2FsbCksIDIpDQoNCm92ZXJhbGxfYWJvdmVfdGFyZ2V0X2luZmxhdGlvbiA8LSBzdW0obnVtZXJpY192YWx1ZXNfYWxsID49IHRhcmdldF9pbmZsYXRpb24sIG5hLnJtID0gVFJVRSkNCm92ZXJhbGxfYWJvdmVfdGFyZ2V0X2NvbnNlcnZhdGl2ZSA8LSBzdW0obnVtZXJpY192YWx1ZXNfYWxsID49IHRhcmdldF9jb25zZXJ2YXRpdmUsIG5hLnJtID0gVFJVRSkNCm92ZXJhbGxfYWJvdmVfdGFyZ2V0X21vZGVyYXRlIDwtIHN1bShudW1lcmljX3ZhbHVlc19hbGwgPj0gdGFyZ2V0X21vZGVyYXRlLCBuYS5ybSA9IFRSVUUpDQpvdmVyYWxsX2Fib3ZlX3RhcmdldF9hZ2dyZXNzaXZlIDwtIHN1bShudW1lcmljX3ZhbHVlc19hbGwgPj0gdGFyZ2V0X2FnZ3Jlc3NpdmUsIG5hLnJtID0gVFJVRSkNCg0Kb3ZlcmFsbF9wZXJjZW50X2Fib3ZlX3RhcmdldF9jb25zZXJ2YXRpdmUgPC0gcm91bmQoKG92ZXJhbGxfYWJvdmVfdGFyZ2V0X2NvbnNlcnZhdGl2ZSAvIG92ZXJhbGxfY291bnRfb2JzZXJ2YXRpb25zKSAqIDEwMCwgMikNCm92ZXJhbGxfcGVyY2VudF9hYm92ZV90YXJnZXRfaW5mbGF0aW9uIDwtIHJvdW5kKChvdmVyYWxsX2Fib3ZlX3RhcmdldF9pbmZsYXRpb24gLyBvdmVyYWxsX2NvdW50X29ic2VydmF0aW9ucykgKiAxMDAsIDIpDQpvdmVyYWxsX3BlcmNlbnRfYWJvdmVfdGFyZ2V0X21vZGVyYXRlIDwtIHJvdW5kKChvdmVyYWxsX2Fib3ZlX3RhcmdldF9tb2RlcmF0ZSAvIG92ZXJhbGxfY291bnRfb2JzZXJ2YXRpb25zKSAqIDEwMCwgMikNCm92ZXJhbGxfcGVyY2VudF9hYm92ZV90YXJnZXRfYWdncmVzc2l2ZSA8LSByb3VuZCgob3ZlcmFsbF9hYm92ZV90YXJnZXRfYWdncmVzc2l2ZSAvIG92ZXJhbGxfY291bnRfb2JzZXJ2YXRpb25zKSAqIDEwMCwgMikNCg0KYWFwbF9yYXdfY2Fncl9zdW1tYXJ5JE92ZXJhbGwgPC0gYygNCiAgb3ZlcmFsbF9jb3VudF9vYnNlcnZhdGlvbnMsDQogIHBhc3RlMChvdmVyYWxsX21lYW5fdmFsdWUsICIlIiksDQogIHBhc3RlMChvdmVyYWxsX21lZGlhbl92YWx1ZSwgIiUiKSwNCiAgcGFzdGUwKG92ZXJhbGxfc2RfdmFsdWUsICIlIiksDQogIHBhc3RlMChvdmVyYWxsX21pbl9jYWdyX3JhbmdlLCAiJSIpLA0KICBwYXN0ZTAob3ZlcmFsbF9tYXhfY2Fncl9yYW5nZSwgIiUiKSwNCiAgcGFzdGUwKG92ZXJhbGxfbWluX3ZhbHVlLCAiJSIpLA0KICBwYXN0ZTAob3ZlcmFsbF9tYXhfdmFsdWUsICIlIiksDQogIHBhc3RlMChvdmVyYWxsX3BlcmNlbnRfYWJvdmVfdGFyZ2V0X2luZmxhdGlvbiwgIiUiKSwNCiAgcGFzdGUwKG92ZXJhbGxfcGVyY2VudF9hYm92ZV90YXJnZXRfY29uc2VydmF0aXZlLCAiJSIpLA0KICBwYXN0ZTAob3ZlcmFsbF9wZXJjZW50X2Fib3ZlX3RhcmdldF9tb2RlcmF0ZSwgIiUiKSwNCiAgcGFzdGUwKG92ZXJhbGxfcGVyY2VudF9hYm92ZV90YXJnZXRfYWdncmVzc2l2ZSwgIiUiKQ0KKQ0KDQojIENvbnZlcnQgcm93IG5hbWVzIHRvIGEgY29sdW1uDQphYXBsX3Jhd19jYWdyX3N1bW1hcnkgPC0gdGliYmxlOjpyb3duYW1lc190b19jb2x1bW4oYWFwbF9yYXdfY2Fncl9zdW1tYXJ5LCB2YXIgPSAiU3RhdGlzdGljIikNCg0KIyBFbnN1cmUgYWxsIGNvbHVtbnMgYXJlIGNoYXJhY3Rlcg0KYWFwbF9yYXdfY2Fncl9zdW1tYXJ5IDwtIGFhcGxfcmF3X2NhZ3Jfc3VtbWFyeSAlPiUNCiAgbXV0YXRlKGFjcm9zcyhldmVyeXRoaW5nKCksIGFzLmNoYXJhY3RlcikpDQoNCiMgRGlzcGxheSB0aGUgc3VtbWFyeSB0YWJsZQ0KY2F0KCJcbiMjIyMgQ29tcG91bmQgQXZlcmFnZSBHcm93dGggUmF0ZXMgKCIsIG1pbl95ZWFyLCAiLSIsIG1heF95ZWFyLCAiKVxuIiwgc2VwID0gIiIpDQppbnRlcmFjdGl2ZV9zdHIoYWFwbF9yYXdfY2Fncl9zdW1tYXJ5KQ0KZm9ybWF0X3Vuc3BlY2lmaWVkX3dpZHRoKGFhcGxfcmF3X2NhZ3Jfc3VtbWFyeSkNCg0KYGBgDQoNCioqYHIgbWluX3llYXJgLWByIG1heF95ZWFyYCBTdW1tYXJ5OioqIFRoZSAxLVllYXIgQ0FHUiBleGhpYml0cyB0aGUgYHIgaWYobWVhbl92YWx1ZV8xX3llYXJfY2FnciA9PSBtYXgoYyhtZWFuX3ZhbHVlXzFfeWVhcl9jYWdyLCBtZWFuX3ZhbHVlXzVfeWVhcl9jYWdyLCBtZWFuX3ZhbHVlXzEwX3llYXJfY2FnciwgbWVhbl92YWx1ZV8yMF95ZWFyX2NhZ3IsIG1lYW5fdmFsdWVfMzBfeWVhcl9jYWdyKSkpICJoaWdoZXN0IG1lYW4gcmV0dXJuIiBlbHNlIGlmKG1lYW5fdmFsdWVfMV95ZWFyX2NhZ3IgPT0gbWluKGMobWVhbl92YWx1ZV8xX3llYXJfY2FnciwgbWVhbl92YWx1ZV81X3llYXJfY2FnciwgbWVhbl92YWx1ZV8xMF95ZWFyX2NhZ3IsIG1lYW5fdmFsdWVfMjBfeWVhcl9jYWdyLCBtZWFuX3ZhbHVlXzMwX3llYXJfY2FncikpKSAibG93ZXN0IG1lYW4gcmV0dXJuIiBlbHNlICJtZWFuIHJldHVybiJgIGF0IGByIG1lYW5fdmFsdWVfMV95ZWFyX2NhZ3JgJSwgYW5kIGByIGlmKHNkX3ZhbHVlXzFfeWVhcl9jYWdyID09IG1heChjKHNkX3ZhbHVlXzFfeWVhcl9jYWdyLCBzZF92YWx1ZV81X3llYXJfY2Fnciwgc2RfdmFsdWVfMTBfeWVhcl9jYWdyLCBzZF92YWx1ZV8yMF95ZWFyX2NhZ3IsIHNkX3ZhbHVlXzMwX3llYXJfY2FncikpKSAidGhlIGdyZWF0ZXN0IHZvbGF0aWxpdHkgd2l0aCBhIiBlbHNlIGlmKHNkX3ZhbHVlXzFfeWVhcl9jYWdyID09IG1pbihjKHNkX3ZhbHVlXzFfeWVhcl9jYWdyLCBzZF92YWx1ZV81X3llYXJfY2Fnciwgc2RfdmFsdWVfMTBfeWVhcl9jYWdyLCBzZF92YWx1ZV8yMF95ZWFyX2NhZ3IsIHNkX3ZhbHVlXzMwX3llYXJfY2FncikpKSAidGhlIGxlYXN0IHZvbGF0aWxpdHkgd2l0aCBhIiBlbHNlICJhImAgc3RhbmRhcmQgZGV2aWF0aW9uIG9mIGByIHNkX3ZhbHVlXzFfeWVhcl9jYWdyYCUuIEFzIHRoZSBpbnZlc3RtZW50IGhvcml6b24gZXh0ZW5kcyB0byA1LCAxMCwgMjAsIGFuZCAzMCB5ZWFycywgdGhlIG1lYW4gcmV0dXJucyBgciBpZihtZWFuX3ZhbHVlXzFfeWVhcl9jYWdyIDwgbWVhbihjKG1lYW5fdmFsdWVfNV95ZWFyX2NhZ3IsIG1lYW5fdmFsdWVfMTBfeWVhcl9jYWdyLCBtZWFuX3ZhbHVlXzIwX3llYXJfY2FnciwgbWVhbl92YWx1ZV8zMF95ZWFyX2NhZ3IpKSkgImluY3JlYXNlIiBlbHNlICJkZWNyZWFzZSJgLCByYW5naW5nIGZyb20gYHIgbWVhbl92YWx1ZV81X3llYXJfY2FncmAlIHRvIGByIG1lYW5fdmFsdWVfMzBfeWVhcl9jYWdyYCUsIHdoaWxlIHZvbGF0aWxpdHkgYHIgaWYoc2RfdmFsdWVfMV95ZWFyX2NhZ3IgPCBtZWFuKGMoc2RfdmFsdWVfNV95ZWFyX2NhZ3IsIHNkX3ZhbHVlXzEwX3llYXJfY2Fnciwgc2RfdmFsdWVfMjBfeWVhcl9jYWdyLCBzZF92YWx1ZV8zMF95ZWFyX2NhZ3IpKSkgInJpc2VzIiBlbHNlICJkaW1pbmlzaGVzImAsIHdpdGggc3RhbmRhcmQgZGV2aWF0aW9ucyBgciBpZihzZF92YWx1ZV8xX3llYXJfY2FnciA+IHNkX3ZhbHVlXzMwX3llYXJfY2FncikgImRyb3BwaW5nIiBlbHNlICJyaXNpbmciYCBmcm9tIGByIHNkX3ZhbHVlXzVfeWVhcl9jYWdyYCUgdG8gYHIgc2RfdmFsdWVfMzBfeWVhcl9jYWdyYCUuIFRoaXMgdHJlbmQgaW5kaWNhdGVzIHRoYXQgbG9uZ2VyIGludmVzdG1lbnQgcGVyaW9kcyB0ZW5kIHRvIG9mZmVyIGByIGlmKHNkX3ZhbHVlXzFfeWVhcl9jYWdyID4gc2RfdmFsdWVfMzBfeWVhcl9jYWdyKSAibW9yZSBzdGFibGUiIGVsc2UgImxlc3Mgc3RhYmxlImAgcmV0dXJucy4gRnVydGhlcm1vcmUsIHRoZSBwZXJjZW50YWdlIG9mIHBlcmlvZHMgZXhjZWVkaW5nIHRoZSBpbmZsYXRpb24gdGFyZ2V0IGByIGlmKHBlcmNlbnRfYWJvdmVfdGFyZ2V0X2luZmxhdGlvbl8xX3llYXJfY2FnciA8IHBlcmNlbnRfYWJvdmVfdGFyZ2V0X2luZmxhdGlvbl8zMF95ZWFyX2NhZ3IpICJpbmNyZWFzZXMiIGVsc2UgImRlY3JlYXNlcyJgIHdpdGggbG9uZ2VyIGR1cmF0aW9ucywgZnJvbSBgciBwZXJjZW50X2Fib3ZlX3RhcmdldF9pbmZsYXRpb25fMV95ZWFyX2NhZ3JgJSBpbiB0aGUgMS1ZZWFyIENBR1IgdG8gYHIgcGVyY2VudF9hYm92ZV90YXJnZXRfaW5mbGF0aW9uXzMwX3llYXJfY2FncmAlIGluIHRoZSAzMC1ZZWFyIENBR1IsIHVuZGVyc2NvcmluZyBBQVBMJ3MgYHIgaWYocGVyY2VudF9hYm92ZV90YXJnZXRfaW5mbGF0aW9uXzFfeWVhcl9jYWdyIDwgcGVyY2VudF9hYm92ZV90YXJnZXRfaW5mbGF0aW9uXzMwX3llYXJfY2FncikgImVmZmVjdGl2ZW5lc3MiIGVsc2UgImluZWZmZWN0aXZlbmVzcyJgIGFzIGEgaGVkZ2UgYWdhaW5zdCBpbmZsYXRpb24gb3ZlciBleHRlbmRlZCB0aW1lZnJhbWVzLiBXaXRoIGFuIG92ZXJhbGwgcGVyY2VudGFnZSBvZiBgciBvdmVyYWxsX3BlcmNlbnRfYWJvdmVfdGFyZ2V0X2FnZ3Jlc3NpdmVgJSBleGNlZWRpbmcgdGhlIGFnZ3Jlc3NpdmUgdGFyZ2V0IChgciB0YXJnZXRfYWdncmVzc2l2ZWAlIGFubnVhbGl6ZWQgcmV0dXJucyB3aXRoIGByIHRhcmdldF9pbmZsYXRpb25gJSBpbmZsYXRpb24pLCBBQVBMIGByIGlmKG92ZXJhbGxfcGVyY2VudF9hYm92ZV90YXJnZXRfYWdncmVzc2l2ZSA+IDUwKSAiaGFzLCBvdmVyIHRoaXMgdGltZSBwZXJpb2QsIHByb3ZlbiB0byBiZSBhIHN0cm9uZyIgZWxzZSBpZihvdmVyYWxsX3BlcmNlbnRfYWJvdmVfdGFyZ2V0X2FnZ3Jlc3NpdmUgPiA0MCkgImhhcywgb3ZlciB0aGlzIHRpbWUgcGVyaW9kLCBkZW1vbnN0cmF0ZWQgaXRzZWxmIGFzIGEgdmlhYmxlIiBlbHNlICJhcHBlYXJzLCBvdmVyIHRoaXMgdGltZSBwZXJpb2QsIHRvIGJlIGEgbGVzcyBzdWl0YWJsZSJgIG9wdGlvbiBmb3IgYSBoaWdoLXJldHVybmluZyBsb25nLXRlcm0gaW52ZXN0bWVudC4NCg0KIyMjIEdyYXBoDQoNCiMjIyMgQWxsIFBlcmlvZHMNCg0KDQpgYGB7ciBhYXBsX3Jhd19jYWdyX2dyYXBoc19hbGwsIGZpZy53aWR0aD0xMCwgZmlnLmhlaWdodD03LCBldmFsPVRSVUUsIGVjaG89RkFMU0V9DQoNCmNhdCgiXG5cbiMjIyMgQ29tcG91bmQgQXZlcmFnZSBHcm93dGggUmF0ZXMgQWNyb3NzIFBlcmlvZHMgXG4iKQ0KDQojIExvYWQgbmVjZXNzYXJ5IGxpYnJhcmllcw0KbGlicmFyeShnZ3Bsb3QyKQ0KbGlicmFyeShkcGx5cikNCg0KDQojIENvbnZlcnQgY29sdW1ucyB0byBudW1lcmljIGZvciBwbG90dGluZyBpZiBuZWVkZWQNCmFhcGxfcmF3X2NhZ3IgPC0gYWFwbF9yYXdfY2FnciAlPiUNCiAgbXV0YXRlKA0KICAgIGBEYXRlYCA9IGFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKGBEYXRlYCkpLCAgIyBFbnN1cmUgRGF0ZSBpcyBudW1lcmljDQogICAgYDEtWWVhciBDQUdSYCA9IGFzLm51bWVyaWMoZ3N1YigiJSIsICIiLCBgMS1ZZWFyIENBR1JgKSksDQogICAgYDUtWWVhciBDQUdSYCA9IGFzLm51bWVyaWMoZ3N1YigiJSIsICIiLCBgNS1ZZWFyIENBR1JgKSksDQogICAgYDEwLVllYXIgQ0FHUmAgPSBhcy5udW1lcmljKGdzdWIoIiUiLCAiIiwgYDEwLVllYXIgQ0FHUmApKSwNCiAgICBgMjAtWWVhciBDQUdSYCA9IGFzLm51bWVyaWMoZ3N1YigiJSIsICIiLCBgMjAtWWVhciBDQUdSYCkpLA0KICAgIGAzMC1ZZWFyIENBR1JgID0gYXMubnVtZXJpYyhnc3ViKCIlIiwgIiIsIGAzMC1ZZWFyIENBR1JgKSkNCiAgKQ0KDQojIFJlc2hhcGUgdGhlIGRhdGEgaW50byBsb25nIGZvcm1hdCBmb3IgZWFzeSBwbG90dGluZyBvZiBtdWx0aXBsZSBsaW5lcyBhbmQgc2V0IHRoZSBmYWN0b3Igb3JkZXINCm5ydF9sb25nIDwtIGFhcGxfcmF3X2NhZ3IgJT4lDQogIHBpdm90X2xvbmdlcihjb2xzID0gYyhgMS1ZZWFyIENBR1JgLCBgNS1ZZWFyIENBR1JgLCBgMTAtWWVhciBDQUdSYCwgYDIwLVllYXIgQ0FHUmAsIGAzMC1ZZWFyIENBR1JgKSwNCiAgICAgICAgICAgICAgIG5hbWVzX3RvID0gIkNBR1JfUGVyaW9kIiwNCiAgICAgICAgICAgICAgIHZhbHVlc190byA9ICJDQUdSX1ZhbHVlIikgJT4lDQogIG11dGF0ZShDQUdSX1BlcmlvZCA9IGZhY3RvcihDQUdSX1BlcmlvZCwgbGV2ZWxzID0gYygiMS1ZZWFyIENBR1IiLCAiNS1ZZWFyIENBR1IiLCAiMTAtWWVhciBDQUdSIiwgIjIwLVllYXIgQ0FHUiIsICIzMC1ZZWFyIENBR1IiKSkpDQoNCiMgQXNzaWduIGNvbG9ycyBkeW5hbWljYWxseSBiYXNlZCBvbiB0aGUgb3JkZXIgb2YgQ0FHUl9QZXJpb2QgaW4gdGhlIGRhdGENCiMgTWF0Y2ggdGhlIHVuaXF1ZSBsZXZlbHMgb2YgQ0FHUl9QZXJpb2Qgd2l0aCBjb2xvcnMgZnJvbSBjb2xvcnNfZ2VuZXJhbF9kYXJrDQp1bmlxdWVfdHlwZXMgPC0gdW5pcXVlKG5ydF9sb25nJENBR1JfUGVyaW9kKQ0KY3VzdG9tX2NvbG9ycyA8LSBzZXROYW1lcyhjb2xvcnNfZ2VuZXJhbF9kYXJrWzE6bGVuZ3RoKHVuaXF1ZV90eXBlcyldLCB1bmlxdWVfdHlwZXMpDQoNCiMgRmluZCB0aGUgbWluaW11bSBhbmQgbWF4aW11bSB4LXZhbHVlIGluIHlvdXIgZGF0YQ0KbWF4X3ggPC0gbWF4KGFzLmludGVnZXIoYWFwbF9yYXdfY2FnciREYXRlKSwgbmEucm0gPSBUUlVFKQ0KbWluX3ggPC0gbWluKGFzLmludGVnZXIoYWFwbF9yYXdfY2FnciREYXRlKSwgbmEucm0gPSBUUlVFKQ0KaW50ZXJhY3RpdmVfcHJpbnQobWF4X3gpICAjIFRlc3QNCmludGVyYWN0aXZlX3ByaW50KG1pbl94KSAgIyBUZXN0DQoNCiMgRmluZCB0aGUgbWluaW11bSBhbmQgbWF4aW11bSB5ZWFyDQptaW5feWVhciA8LSBtaW4oYWFwbF9yYXdfY2FnciREYXRlLCBuYS5ybSA9IFRSVUUpDQptYXhfeWVhciA8LSBtYXgoYWFwbF9yYXdfY2FnciREYXRlLCBuYS5ybSA9IFRSVUUpDQppbnRlcmFjdGl2ZV9wcmludChtaW5feWVhcikNCmludGVyYWN0aXZlX3ByaW50KG1heF95ZWFyKQ0KDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KIyMgUExPVCBGVUxMIFdJVEhPVVQgTElNSVRTDQoNCiMgRGVmaW5lIHN0YXJ0IGFuZCBlbmQgeWVhcnMNCnN0YXJ0X3llYXIgPC0gYXMubnVtZXJpYyhtaW5feWVhcikNCmVuZF95ZWFyIDwtIDIwMjQNCnllYXJfcmFuZ2UgPC0gZW5kX3llYXIgLSBzdGFydF95ZWFyICsgMSAgIyBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiB5ZWFycw0KDQojIERlZmluZSBicmVha3Mgcm91bmRlZCBhcHByb3ByaWF0ZWx5DQpsaW1pdHNfc3RhcnRfeWVhciA8LSBmbG9vcihzdGFydF95ZWFyIC8gNSkgKiA1ICAjIFJvdW5kIGRvd24gdG8gdGhlIG5lYXJlc3QgbXVsdGlwbGUgb2YgNQ0KbGltaXRzX2VuZF95ZWFyIDwtIGNlaWxpbmcoZW5kX3llYXIgLyA1KSAqIDUgICAjIFJvdW5kIHVwIHRvIHRoZSBuZWFyZXN0IG11bHRpcGxlIG9mIDUNCg0KIyBDcmVhdGUgZHluYW1pYyB0aXRsZSBhbmQgY2FwdGlvbg0KZHluYW1pY190aXRsZSA8LSBwYXN0ZTAoIlJvbGxpbmcgQ0FHUnMgQWNyb3NzIFBlcmlvZHMgT3ZlciAiLHllYXJfcmFuZ2UsICIgWWVhcnMgKCIsIHN0YXJ0X3llYXIsICItIiwgZW5kX3llYXIsICIpIikNCmR5bmFtaWNfY2FwdGlvbiA8LSBwYXN0ZTAoIkFBUEwgQ29tcG91bmQgQXZlcmFnZSBHcm93dGggUmF0ZXMgQWNyb3NzIFJvbGxpbmcgUGVyaW9kcywgRGF0YXNldCAoIiwgbWluX3llYXIsICItIiwgbWF4X3llYXIsICIpIikNCg0KIyBDcmVhdGUgdGhlIGZ1bGwsIG5vbi1maWx0ZXJlZCB4LWF4aXMgcGxvdCB3aXRoIGR5bmFtaWMgeCBwbGFjZW1lbnQgZm9yIGFubm90YXRpb25zDQpwMSA8LSBnZ3Bsb3QobnJ0X2xvbmcsIGFlcyh4ID0gYXMuaW50ZWdlcihEYXRlKSwgeSA9IENBR1JfVmFsdWUsIGNvbG9yID0gQ0FHUl9QZXJpb2QpKSArDQoNCiAgIyBBZGQgc2hhZGVkIGFyZWFzIGZvciBiYWNrZ3JvdW5kIGVmZmVjdA0KICBnZW9tX3JlY3QoYWVzKHhtaW4gPSAtSW5mLCB4bWF4ID0gSW5mLCB5bWluID0gdGFyZ2V0X2FnZ3Jlc3NpdmUsIHltYXggPSBJbmYpLCBmaWxsID0gImxpZ2h0Z3JlZW4iLCBhbHBoYSA9IDAuMDEwKSArDQogIGdlb21fcmVjdChhZXMoeG1pbiA9IC1JbmYsIHhtYXggPSBJbmYsIHltaW4gPSB0YXJnZXRfY29uc2VydmF0aXZlLCB5bWF4ID0gdGFyZ2V0X2FnZ3Jlc3NpdmUpLCBmaWxsID0gIm9yYW5nZSIsIGFscGhhID0gMC4wMSkgKw0KICBnZW9tX3JlY3QoYWVzKHhtaW4gPSAtSW5mLCB4bWF4ID0gSW5mLCB5bWluID0gLUluZiwgeW1heCA9IHRhcmdldF9jb25zZXJ2YXRpdmUpLCBmaWxsID0gImxpZ2h0Y29yYWwiLCBhbHBoYSA9IDAuMDEwKSArDQogIA0KICAjIFBsb3QgbGluZXMgZm9yIGVhY2ggQ0FHUiBQZXJpb2QNCiAgZ2VvbV9saW5lKHNpemUgPSAxLjAsIGFscGhhID0gMy4wKSArICAgICAgICMgTGluZSBmb3IgZWFjaCBDQUdSDQogIGdlb21fcG9pbnQoc2l6ZSA9IDEuMCwgYWxwaGEgPSAzLjApICsgICAgICAgIyBQb2ludHMgZm9yIGVhY2ggQ0FHUg0KICANCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gdGFyZ2V0X2FnZ3Jlc3NpdmUsIGNvbG9yID0gImRhcmtibHVlIiwgbGluZXR5cGUgPSAic29saWQiKSArDQogICMgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gdGFyZ2V0X21vZGVyYXRlLCBjb2xvciA9ICJkYXJrYmx1ZSIsIGxpbmV0eXBlID0gInNvbGlkIikgKw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSB0YXJnZXRfY29uc2VydmF0aXZlLCBjb2xvciA9ICJkYXJrYmx1ZSIsIGxpbmV0eXBlID0gInNvbGlkIikgKw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSB0YXJnZXRfaW5mbGF0aW9uLCBjb2xvciA9ICJkYXJrcmVkIiwgbGluZXR5cGUgPSAiZGFzaGVkIikgKw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSBjYWdyX3ZhbHVlLCBjb2xvciA9ICJkYXJrcmVkIiwgbGluZXR5cGUgPSAiZGFzaGVkIikgKw0KICANCiAgIyBEeW5hbWljIHJpZ2h0LWFsaWduZWQgcGxhY2VtZW50IGZvciBhbm5vdGF0aW9ucw0KICBhbm5vdGF0ZSgidGV4dCIsIHggPSBJbmYsIHkgPSB0YXJnZXRfYWdncmVzc2l2ZSwgbGFiZWwgPSAiQWdncmVzc2l2ZSIsIA0KICAgICAgICAgICBoanVzdCA9IDEsIHZqdXN0ID0gLTAuNTAsIGNvbG9yID0gImRhcmtibHVlIiwgc2l6ZSA9IDQpICsNCiAgIyBhbm5vdGF0ZSgidGV4dCIsIHggPSBJbmYsIHkgPSB0YXJnZXRfbW9kZXJhdGUsIGxhYmVsID0gIk1vZGVyYXRlIiwgDQogICMgICAgICAgICBoanVzdCA9IDEsIHZqdXN0ID0gLTAuNTAsIGNvbG9yID0gImRhcmtibHVlIiwgc2l6ZSA9IDQpICsNCiAgYW5ub3RhdGUoInRleHQiLCB4ID0gSW5mLCB5ID0gdGFyZ2V0X2NvbnNlcnZhdGl2ZSwgbGFiZWwgPSAiQ29uc2VydmF0aXZlIiwgDQogICAgICAgICAgIGhqdXN0ID0gMSwgdmp1c3QgPSAtMC41MCwgY29sb3IgPSAiZGFya2JsdWUiLCBzaXplID0gNCkgKw0KICBhbm5vdGF0ZSgidGV4dCIsIHggPSBJbmYsIHkgPSB0YXJnZXRfaW5mbGF0aW9uLCBsYWJlbCA9ICJJbmZsYXRpb24iLCANCiAgICAgICAgICAgaGp1c3QgPSAxLCB2anVzdCA9ICsxLjEwLCBjb2xvciA9ICJkYXJrcmVkIiwgc2l6ZSA9IDQpICsNCiAgYW5ub3RhdGUoInRleHQiLCB4ID0gSW5mLCB5ID0gY2Fncl92YWx1ZSwgbGFiZWwgPSAiQ0FHUiIsIA0KICAgICAgICAgICBoanVzdCA9IDEsIHZqdXN0ID0gLTAuNTAsIGNvbG9yID0gImRhcmtyZWQiLCBzaXplID0gNCkgKyANCg0KICBsYWJzKA0KICAgIHRpdGxlID0gZHluYW1pY190aXRsZSwNCiAgICB4ID0gIlllYXIiLA0KICAgIHkgPSAiQ0FHUiBWYWx1ZSAoJSkiLA0KICAgIGNvbG9yID0gIkNBR1IgUGVyaW9kIiwNCiAgICBjYXB0aW9uID0gZHluYW1pY19jYXB0aW9uDQogICAgKSArDQogIA0KICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gY3VzdG9tX2NvbG9ycykgKyAgIyBTZXQgY29sb3JzIGZvciBlYWNoIENBR1IgUGVyaW9kDQogIHNjYWxlX3hfY29udGludW91cygNCiAgICBsaW1pdHMgPSBjKHN0YXJ0X3llYXIsIGVuZF95ZWFyICsgMyksIA0KICAgIGJyZWFrcyA9IHNlcShsaW1pdHNfc3RhcnRfeWVhciwgbGltaXRzX2VuZF95ZWFyICwgNSkpICsgICMgUmVzdHJpY3QgJiBTZXQgTWFqb3IgeC1heGlzIGxpbmVzIGZvciBlYWNoIHllYXINCiAgDQogIHRoZW1lX21pbmltYWwoKSArDQogIHRoZW1lKA0KICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUsIHNpemUgPSAyMCksICAgICAgICAgIyBMYXJnZXIgdGl0bGUgZm9udA0KICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQpLCAgICAgICAgICAgICAgICAgICAgIyBMYXJnZXIgeC1heGlzIGxhYmVsIGZvbnQNCiAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0KSwgICAgICAgICAgICAgICAgICAgICMgTGFyZ2VyIHktYXhpcyBsYWJlbCBmb250DQogICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxLCBzaXplID0gMTQpLCAgIyBMYXJnZXIgeC1heGlzIHRleHQNCiAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQpLCAgICAgICAgICAgICAgICAgICAgICMgTGFyZ2VyIHktYXhpcyB0ZXh0DQogICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCksICAgICAgICAgICAgICAgICAgICAjIExlZ2VuZCB0aXRsZSBzaXplDQogICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyKSwgICAgICAgICAgICAgICAgICAgICAjIExlZ2VuZCB0ZXh0IHNpemUNCiAgICBwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9saW5lKGxpbmV0eXBlID0gImRvdHRlZCIsIGNvbG9yID0gImJsYWNrIiksICAjIE1ham9yIGdyaWQgbGluZXMNCiAgICBwYW5lbC5ncmlkLm1pbm9yLnggPSBlbGVtZW50X2JsYW5rKCksICAgICAgICAgICAgICAgICAgICAgICMgTm8gbWlub3IgeCBncmlkIGxpbmVzDQogICAgYXhpcy50aWNrcy5sZW5ndGggPSB1bml0KC0wLjI1LCAiY20iKSwgICAgICAgICAgICAgICAgICAgICAgIyBJbmNyZWFzZSB0aWNrIGxlbmd0aA0KICAgIGF4aXMudGlja3MgPSBlbGVtZW50X2xpbmUoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMC41MCksICAgIyBEYXJrZXIgdGlja3MNCiAgICBheGlzLmxpbmUueCA9IGVsZW1lbnRfbGluZShjb2xvciA9ICJibGFjayIsIHNpemUgPSAwLjc1KSwgICMgRGFyayBib3R0b20gYm9yZGVyDQogICAgYXhpcy5saW5lLnkgPSBlbGVtZW50X2xpbmUoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMC43NSkgICAjIERhcmsgbGVmdCBib3JkZXINCiAgKQ0KDQojIFByaW50IHRoZSBwbG90IA0KcHJpbnQocDEpDQoNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQojIyBQTE9UIFJFU1RSSUNURUQgV0lUSCBMSU1JVFMgDQoNCiMgRmlsdGVyIHRoZSBkYXRhIGZvciB0aGUgcmVzdHJpY3RlZCB4LWF4aXMgcmFuZ2UgKDIwMDYtMjAyNCkNCnJlc3RyaWN0ZWRfZGF0YSA8LSBucnRfbG9uZyAlPiUNCiAgZmlsdGVyKGFzLmludGVnZXIoRGF0ZSkgPj0gMjAwNiAmIGFzLmludGVnZXIoRGF0ZSkgPD0gMjAyNCkNCg0KIyBEZWZpbmUgc3RhcnQgYW5kIGVuZCB5ZWFycw0Kc3RhcnRfeWVhciA8LSAyMDA2DQplbmRfeWVhciA8LSAyMDI0DQp5ZWFyX3JhbmdlIDwtIGVuZF95ZWFyIC0gc3RhcnRfeWVhciArIDEgICMgQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgeWVhcnMNCg0KIyBEZWZpbmUgYnJlYWtzIHJvdW5kZWQgYXBwcm9wcmlhdGVseQ0KbGltaXRzX3N0YXJ0X3llYXIgPC0gZmxvb3Ioc3RhcnRfeWVhciAvIDUpICogNSAgIyBSb3VuZCBkb3duIHRvIHRoZSBuZWFyZXN0IG11bHRpcGxlIG9mIDUNCmxpbWl0c19lbmRfeWVhciA8LSBjZWlsaW5nKGVuZF95ZWFyIC8gNSkgKiA1ICAgIyBSb3VuZCB1cCB0byB0aGUgbmVhcmVzdCBtdWx0aXBsZSBvZiA1DQoNCiMgQ3JlYXRlIGR5bmFtaWMgdGl0bGUgYW5kIGNhcHRpb24NCmR5bmFtaWNfdGl0bGUgPC0gcGFzdGUwKCJSb2xsaW5nIENBR1JzIEFjcm9zcyBQZXJpb2RzIE92ZXIgIix5ZWFyX3JhbmdlLCAiIFllYXJzICgiLCBzdGFydF95ZWFyLCAiLSIsIGVuZF95ZWFyLCAiKSIpDQpkeW5hbWljX2NhcHRpb24gPC0gcGFzdGUwKCJBQVBMIENvbXBvdW5kIEF2ZXJhZ2UgR3Jvd3RoIFJhdGVzIEFjcm9zcyBSb2xsaW5nIFBlcmlvZHMsIERhdGFzZXQgKCIsIG1pbl95ZWFyLCAiLSIsIG1heF95ZWFyLCAiKSIpDQoNCiMgQ2FsY3VsYXRlIGR5bmFtaWMgeS1heGlzIGxpbWl0cyBmb3IgdGhlIHJlc3RyaWN0ZWQgZGF0YQ0KeV9taW4gPC0gbWluKHJlc3RyaWN0ZWRfZGF0YSRDQUdSX1ZhbHVlLCBuYS5ybSA9IFRSVUUpDQp5X21heCA8LSBtYXgocmVzdHJpY3RlZF9kYXRhJENBR1JfVmFsdWUsIG5hLnJtID0gVFJVRSkNCg0KIyBDcmVhdGUgdGhlIGZpbHRlcmVkLCByZXN0cmljdGVkIHgtYXhpcyBwbG90IHdpdGggZHluYW1pYyB4IHBsYWNlbWVudCBmb3IgYW5ub3RhdGlvbnMNCnAzIDwtIGdncGxvdChucnRfbG9uZywgYWVzKHggPSBhcy5pbnRlZ2VyKERhdGUpLCB5ID0gQ0FHUl9WYWx1ZSwgY29sb3IgPSBDQUdSX1BlcmlvZCkpICsNCg0KICAjIEFkZCBzaGFkZWQgYXJlYXMgZm9yIGJhY2tncm91bmQgZWZmZWN0DQogIGdlb21fcmVjdChhZXMoeG1pbiA9IC1JbmYsIHhtYXggPSBJbmYsIHltaW4gPSB0YXJnZXRfYWdncmVzc2l2ZSwgeW1heCA9IEluZiksIGZpbGwgPSAibGlnaHRncmVlbiIsIGFscGhhID0gMC4wMTApICsNCiAgZ2VvbV9yZWN0KGFlcyh4bWluID0gLUluZiwgeG1heCA9IEluZiwgeW1pbiA9IHRhcmdldF9jb25zZXJ2YXRpdmUsIHltYXggPSB0YXJnZXRfYWdncmVzc2l2ZSksIGZpbGwgPSAib3JhbmdlIiwgYWxwaGEgPSAwLjAxKSArDQogIGdlb21fcmVjdChhZXMoeG1pbiA9IC1JbmYsIHhtYXggPSBJbmYsIHltaW4gPSAtSW5mLCB5bWF4ID0gdGFyZ2V0X2NvbnNlcnZhdGl2ZSksIGZpbGwgPSAibGlnaHRjb3JhbCIsIGFscGhhID0gMC4wMTApICsNCiAgDQogICMgUGxvdCBsaW5lcyBmb3IgZWFjaCBDQUdSIFBlcmlvZA0KICBnZW9tX2xpbmUoc2l6ZSA9IDEuMCwgYWxwaGEgPSAzLjApICsgICAgICAgIyBMaW5lIGZvciBlYWNoIENBR1INCiAgZ2VvbV9wb2ludChzaXplID0gMS4wLCBhbHBoYSA9IDMuMCkgKyAgICAgICAjIFBvaW50cyBmb3IgZWFjaCBDQUdSDQoNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gdGFyZ2V0X2FnZ3Jlc3NpdmUsIGNvbG9yID0gImRhcmtibHVlIiwgbGluZXR5cGUgPSAic29saWQiKSArDQogICMgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gdGFyZ2V0X21vZGVyYXRlLCBjb2xvciA9ICJkYXJrYmx1ZSIsIGxpbmV0eXBlID0gInNvbGlkIikgKw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSB0YXJnZXRfY29uc2VydmF0aXZlLCBjb2xvciA9ICJkYXJrYmx1ZSIsIGxpbmV0eXBlID0gInNvbGlkIikgKw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSB0YXJnZXRfaW5mbGF0aW9uLCBjb2xvciA9ICJkYXJrcmVkIiwgbGluZXR5cGUgPSAiZGFzaGVkIikgKw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSBjYWdyX3ZhbHVlLCBjb2xvciA9ICJkYXJrcmVkIiwgbGluZXR5cGUgPSAiZGFzaGVkIikgKw0KICANCiAgIyBEeW5hbWljIHJpZ2h0LWFsaWduZWQgcGxhY2VtZW50IGZvciBhbm5vdGF0aW9ucw0KICBhbm5vdGF0ZSgidGV4dCIsIHggPSBJbmYsIHkgPSB0YXJnZXRfYWdncmVzc2l2ZSwgbGFiZWwgPSAiQWdncmVzc2l2ZSIsIA0KICAgICAgICAgICBoanVzdCA9IDEsIHZqdXN0ID0gLTAuNTAsIGNvbG9yID0gImRhcmtibHVlIiwgc2l6ZSA9IDQpICsNCiAgIyBhbm5vdGF0ZSgidGV4dCIsIHggPSBJbmYsIHkgPSB0YXJnZXRfbW9kZXJhdGUsIGxhYmVsID0gIk1vZGVyYXRlIiwgDQogICMgICAgICAgICBoanVzdCA9IDEsIHZqdXN0ID0gLTAuNTAsIGNvbG9yID0gImRhcmtibHVlIiwgc2l6ZSA9IDQpICsNCiAgYW5ub3RhdGUoInRleHQiLCB4ID0gSW5mLCB5ID0gdGFyZ2V0X2NvbnNlcnZhdGl2ZSwgbGFiZWwgPSAiQ29uc2VydmF0aXZlIiwNCiAgICAgICAgICAgaGp1c3QgPSAxLCB2anVzdCA9IC0wLjUwLCBjb2xvciA9ICJkYXJrYmx1ZSIsIHNpemUgPSA0KSArDQogIGFubm90YXRlKCJ0ZXh0IiwgeCA9IEluZiwgeSA9IHRhcmdldF9pbmZsYXRpb24sIGxhYmVsID0gIkluZmxhdGlvbiIsIA0KICAgICAgICAgICBoanVzdCA9IDEsIHZqdXN0ID0gKzEuMTAsIGNvbG9yID0gImRhcmtyZWQiLCBzaXplID0gNCkgKw0KICBhbm5vdGF0ZSgidGV4dCIsIHggPSBJbmYsIHkgPSBjYWdyX3ZhbHVlLCBsYWJlbCA9ICJDQUdSIiwgDQogICAgICAgICAgIGhqdXN0ID0gMSwgdmp1c3QgPSAtMC41MCwgY29sb3IgPSAiZGFya3JlZCIsIHNpemUgPSA0KSArIA0KDQogIGxhYnMoDQogICAgdGl0bGUgPSBkeW5hbWljX3RpdGxlLA0KICAgIHggPSAiWWVhciIsDQogICAgeSA9ICJDQUdSIFZhbHVlICglKSIsDQogICAgY29sb3IgPSAiQ0FHUiBQZXJpb2QiLA0KICAgIGNhcHRpb24gPSBkeW5hbWljX2NhcHRpb24NCiAgICApICsNCiAgDQogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjdXN0b21fY29sb3JzKSArICAjIFNldCBjb2xvcnMgZm9yIGVhY2ggQ0FHUiBQZXJpb2QNCiAgY29vcmRfY2FydGVzaWFuKHlsaW0gPSBjKHlfbWluLCB5X21heCkpICsgIyBBcHBseSBkeW5hbWljIHktYXhpcyBsaW1pdHMNCiAgc2NhbGVfeF9jb250aW51b3VzKA0KICAgIGxpbWl0cyA9IGMoc3RhcnRfeWVhciwgZW5kX3llYXIgKyAyKSwgDQogICAgYnJlYWtzID0gc2VxKGxpbWl0c19zdGFydF95ZWFyLCBsaW1pdHNfZW5kX3llYXIsIDUpDQogICkgKyAgIyBSZXN0cmljdCAmIFNldCBNYWpvciB4LWF4aXMgbGluZXMgZm9yIGVhY2ggeWVhcg0KDQogIHRoZW1lX21pbmltYWwoKSArDQogIHRoZW1lKA0KICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUsIHNpemUgPSAyMCksICAgICAgICAgIyBMYXJnZXIgdGl0bGUgZm9udA0KICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQpLCAgICAgICAgICAgICAgICAgICAgIyBMYXJnZXIgeC1heGlzIGxhYmVsIGZvbnQNCiAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0KSwgICAgICAgICAgICAgICAgICAgICMgTGFyZ2VyIHktYXhpcyBsYWJlbCBmb250DQogICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxLCBzaXplID0gMTQpLCAgIyBMYXJnZXIgeC1heGlzIHRleHQNCiAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQpLCAgICAgICAgICAgICAgICAgICAgICMgTGFyZ2VyIHktYXhpcyB0ZXh0DQogICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCksICAgICAgICAgICAgICAgICAgICAjIExlZ2VuZCB0aXRsZSBzaXplDQogICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyKSwgICAgICAgICAgICAgICAgICAgICAjIExlZ2VuZCB0ZXh0IHNpemUNCiAgICBwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9saW5lKGxpbmV0eXBlID0gImRvdHRlZCIsIGNvbG9yID0gImJsYWNrIiksICAjIE1ham9yIGdyaWQgbGluZXMNCiAgICBwYW5lbC5ncmlkLm1pbm9yLnggPSBlbGVtZW50X2JsYW5rKCksICAgICAgICAgICAgICAgICAgICAgICMgTm8gbWlub3IgeCBncmlkIGxpbmVzDQogICAgYXhpcy50aWNrcy5sZW5ndGggPSB1bml0KC0wLjI1LCAiY20iKSwgICAgICAgICAgICAgICAgICAgICAgIyBJbmNyZWFzZSB0aWNrIGxlbmd0aA0KICAgIGF4aXMudGlja3MgPSBlbGVtZW50X2xpbmUoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMC41MCksICAgIyBEYXJrZXIgdGlja3MNCiAgICBheGlzLmxpbmUueCA9IGVsZW1lbnRfbGluZShjb2xvciA9ICJibGFjayIsIHNpemUgPSAwLjc1KSwgICMgRGFyayBib3R0b20gYm9yZGVyDQogICAgYXhpcy5saW5lLnkgPSBlbGVtZW50X2xpbmUoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMC43NSkgICAjIERhcmsgbGVmdCBib3JkZXINCiAgKQ0KDQojIFByaW50IHRoZSBwbG90IA0KcHJpbnQocDMpDQoNCmBgYA0KDQojIyMjIFNob3J0LVRlcm0NCg0KYGBge3IgYWFwbF9yYXdfY2Fncl9ncmFwaHNfc2hvcnQsIGZpZy53aWR0aD0xMCwgZmlnLmhlaWdodD03fQ0KDQpjYXQoIlxuXG4jIyMjIENvbXBvdW5kIEF2ZXJhZ2UgR3Jvd3RoIFJhdGVzIEFjcm9zcyBTaG9ydC1UZXJtIFJvbGxpbmcgUGVyaW9kcyBcbiIpDQoNCiMgRmlsdGVyIGRhdGEgZm9yIFNob3J0LVRlcm0gQ0FHUiAoNS1ZZWFyIGFuZCAxMC1ZZWFyKQ0Kc2hvcnR0ZXJtX2RhdGEgPC0gbnJ0X2xvbmcgJT4lDQogIGZpbHRlcihDQUdSX1BlcmlvZCAlaW4lIGMoIjUtWWVhciBDQUdSIiwgIjEwLVllYXIgQ0FHUiIpKQ0KDQoNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQojIyBQTE9UIEZVTEwgV0lUSE9VVCBMSU1JVFMNCg0KIyBEZWZpbmUgc3RhcnQgYW5kIGVuZCB5ZWFycw0Kc3RhcnRfeWVhciA8LSAxOTkwDQplbmRfeWVhciA8LSAyMDI0DQp5ZWFyX3JhbmdlIDwtIGVuZF95ZWFyIC0gc3RhcnRfeWVhciArIDEgICMgQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgeWVhcnMNCg0KIyBEZWZpbmUgYnJlYWtzIHJvdW5kZWQgYXBwcm9wcmlhdGVseQ0KbGltaXRzX3N0YXJ0X3llYXIgPC0gZmxvb3Ioc3RhcnRfeWVhciAvIDUpICogNSAgIyBSb3VuZCBkb3duIHRvIHRoZSBuZWFyZXN0IG11bHRpcGxlIG9mIDUNCmxpbWl0c19lbmRfeWVhciA8LSBjZWlsaW5nKGVuZF95ZWFyIC8gNSkgKiA1ICAgIyBSb3VuZCB1cCB0byB0aGUgbmVhcmVzdCBtdWx0aXBsZSBvZiA1DQoNCiMgQ3JlYXRlIGR5bmFtaWMgdGl0bGUgYW5kIGNhcHRpb24NCmR5bmFtaWNfdGl0bGUgPC0gcGFzdGUwKCJDQUdSIEFjcm9zcyBTaG9ydC1UZXJtIFBlcmlvZHMgT3ZlciAiLHllYXJfcmFuZ2UsICIgWWVhcnMgKCIsIHN0YXJ0X3llYXIsICItIiwgZW5kX3llYXIsICIpIikNCmR5bmFtaWNfY2FwdGlvbiA8LSBwYXN0ZTAoIkFBUEwgQ29tcG91bmQgQXZlcmFnZSBHcm93dGggUmF0ZXMgQWNyb3NzIFNob3J0LVRlcm0gUm9sbGluZyBQZXJpb2RzLCBEYXRhc2V0ICgiLCBtaW5feWVhciwgIi0iLCBtYXhfeWVhciwgIikiKQ0KDQojIENyZWF0ZSB0aGUgZnVsbCwgbm9uLWZpbHRlcmVkIHgtYXhpcyBwbG90IHdpdGggZHluYW1pYyB4IHBsYWNlbWVudCBmb3IgYW5ub3RhdGlvbnMNCnAxX3Nob3J0dGVybSA8LSBnZ3Bsb3Qoc2hvcnR0ZXJtX2RhdGEsIGFlcyh4ID0gYXMuaW50ZWdlcihEYXRlKSwgeSA9IENBR1JfVmFsdWUsIGNvbG9yID0gQ0FHUl9QZXJpb2QpKSArDQoNCiAgIyBBZGQgc2hhZGVkIGFyZWFzIGZvciBiYWNrZ3JvdW5kIGVmZmVjdA0KICBnZW9tX3JlY3QoYWVzKHhtaW4gPSAtSW5mLCB4bWF4ID0gSW5mLCB5bWluID0gdGFyZ2V0X2FnZ3Jlc3NpdmUsIHltYXggPSBJbmYpLCBmaWxsID0gImxpZ2h0Z3JlZW4iLCBhbHBoYSA9IDAuMDEwKSArDQogIGdlb21fcmVjdChhZXMoeG1pbiA9IC1JbmYsIHhtYXggPSBJbmYsIHltaW4gPSB0YXJnZXRfY29uc2VydmF0aXZlLCB5bWF4ID0gdGFyZ2V0X2FnZ3Jlc3NpdmUpLCBmaWxsID0gIm9yYW5nZSIsIGFscGhhID0gMC4wMSkgKw0KICBnZW9tX3JlY3QoYWVzKHhtaW4gPSAtSW5mLCB4bWF4ID0gSW5mLCB5bWluID0gLUluZiwgeW1heCA9IHRhcmdldF9jb25zZXJ2YXRpdmUpLCBmaWxsID0gImxpZ2h0Y29yYWwiLCBhbHBoYSA9IDAuMDEwKSArDQogIA0KICAjIFBsb3QgbGluZXMgZm9yIGVhY2ggQ0FHUiBQZXJpb2QNCiAgZ2VvbV9saW5lKHNpemUgPSAxLjAsIGFscGhhID0gMy4wKSArICAgICAgICMgTGluZSBmb3IgZWFjaCBDQUdSDQogIGdlb21fcG9pbnQoc2l6ZSA9IDEuMCwgYWxwaGEgPSAzLjApICsgICAgICAgIyBQb2ludHMgZm9yIGVhY2ggQ0FHUg0KDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IHRhcmdldF9hZ2dyZXNzaXZlLCBjb2xvciA9ICJkYXJrYmx1ZSIsIGxpbmV0eXBlID0gInNvbGlkIikgKw0KICAjIGdlb21faGxpbmUoeWludGVyY2VwdCA9IHRhcmdldF9tb2RlcmF0ZSwgY29sb3IgPSAiZGFya2JsdWUiLCBsaW5ldHlwZSA9ICJzb2xpZCIpICsNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gdGFyZ2V0X2NvbnNlcnZhdGl2ZSwgY29sb3IgPSAiZGFya2JsdWUiLCBsaW5ldHlwZSA9ICJzb2xpZCIpICsNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gdGFyZ2V0X2luZmxhdGlvbiwgY29sb3IgPSAiZGFya3JlZCIsIGxpbmV0eXBlID0gImRhc2hlZCIpICsNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gY2Fncl92YWx1ZSwgY29sb3IgPSAiZGFya3JlZCIsIGxpbmV0eXBlID0gImRhc2hlZCIpICsNCiAgDQogICMgRHluYW1pYyByaWdodC1hbGlnbmVkIHBsYWNlbWVudCBmb3IgYW5ub3RhdGlvbnMNCiAgYW5ub3RhdGUoInRleHQiLCB4ID0gSW5mLCB5ID0gdGFyZ2V0X2FnZ3Jlc3NpdmUsIGxhYmVsID0gIkFnZ3Jlc3NpdmUiLCANCiAgICAgICAgICAgaGp1c3QgPSAxLCB2anVzdCA9IC0wLjUwLCBjb2xvciA9ICJkYXJrYmx1ZSIsIHNpemUgPSA0KSArDQogICMgYW5ub3RhdGUoInRleHQiLCB4ID0gSW5mLCB5ID0gdGFyZ2V0X21vZGVyYXRlLCBsYWJlbCA9ICJNb2RlcmF0ZSIsIA0KICAjICAgICAgICAgaGp1c3QgPSAxLCB2anVzdCA9IC0wLjUwLCBjb2xvciA9ICJkYXJrYmx1ZSIsIHNpemUgPSA0KSArDQogIGFubm90YXRlKCJ0ZXh0IiwgeCA9IEluZiwgeSA9IHRhcmdldF9jb25zZXJ2YXRpdmUsIGxhYmVsID0gIkNvbnNlcnZhdGl2ZSIsIA0KICAgICAgICAgICBoanVzdCA9IDEsIHZqdXN0ID0gLTAuNTAsIGNvbG9yID0gImRhcmtibHVlIiwgc2l6ZSA9IDQpICsNCiAgYW5ub3RhdGUoInRleHQiLCB4ID0gSW5mLCB5ID0gdGFyZ2V0X2luZmxhdGlvbiwgbGFiZWwgPSAiSW5mbGF0aW9uIiwgDQogICAgICAgICAgIGhqdXN0ID0gMSwgdmp1c3QgPSArMS4zMCwgY29sb3IgPSAiZGFya3JlZCIsIHNpemUgPSA0KSArDQogIGFubm90YXRlKCJ0ZXh0IiwgeCA9IEluZiwgeSA9IGNhZ3JfdmFsdWUsIGxhYmVsID0gIkNBR1IiLCANCiAgICAgICAgICAgaGp1c3QgPSAxLCB2anVzdCA9IC0wLjUwLCBjb2xvciA9ICJkYXJrcmVkIiwgc2l6ZSA9IDQpICsgDQoNCiAgbGFicygNCiAgICB0aXRsZSA9IGR5bmFtaWNfdGl0bGUsDQogICAgeCA9ICJZZWFyIiwNCiAgICB5ID0gIkNBR1IgVmFsdWUgKCUpIiwNCiAgICBjb2xvciA9ICJDQUdSIFBlcmlvZCIsDQogICAgY2FwdGlvbiA9IGR5bmFtaWNfY2FwdGlvbg0KICAgICkgKw0KICANCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGN1c3RvbV9jb2xvcnNbYygiNS1ZZWFyIENBR1IiLCAiMTAtWWVhciBDQUdSIildKSArDQogIHNjYWxlX3hfY29udGludW91cygNCiAgICBsaW1pdHMgPSBjKHN0YXJ0X3llYXIsIGVuZF95ZWFyICsgMSksIA0KICAgIGJyZWFrcyA9IHNlcShsaW1pdHNfc3RhcnRfeWVhciwgbGltaXRzX2VuZF95ZWFyICsgMSAsIDUpDQogICkgKyAgIyBSZXN0cmljdCAmIFNldCBNYWpvciB4LWF4aXMgbGluZXMgZm9yIGVhY2ggeWVhcg0KDQogIHRoZW1lX21pbmltYWwoKSArDQogIHRoZW1lKA0KICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUsIHNpemUgPSAyMCksICAgICAgICAgIyBMYXJnZXIgdGl0bGUgZm9udA0KICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQpLCAgICAgICAgICAgICAgICAgICAgIyBMYXJnZXIgeC1heGlzIGxhYmVsIGZvbnQNCiAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0KSwgICAgICAgICAgICAgICAgICAgICMgTGFyZ2VyIHktYXhpcyBsYWJlbCBmb250DQogICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxLCBzaXplID0gMTQpLCAgIyBMYXJnZXIgeC1heGlzIHRleHQNCiAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQpLCAgICAgICAgICAgICAgICAgICAgICMgTGFyZ2VyIHktYXhpcyB0ZXh0DQogICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCksICAgICAgICAgICAgICAgICAgICAjIExlZ2VuZCB0aXRsZSBzaXplDQogICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyKSwgICAgICAgICAgICAgICAgICAgICAjIExlZ2VuZCB0ZXh0IHNpemUNCiAgICBwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9saW5lKGxpbmV0eXBlID0gImRvdHRlZCIsIGNvbG9yID0gImJsYWNrIiksICAjIE1ham9yIGdyaWQgbGluZXMNCiAgICBwYW5lbC5ncmlkLm1pbm9yLnggPSBlbGVtZW50X2JsYW5rKCksICAgICAgICAgICAgICAgICAgICAgICMgTm8gbWlub3IgeCBncmlkIGxpbmVzDQogICAgYXhpcy50aWNrcy5sZW5ndGggPSB1bml0KC0wLjI1LCAiY20iKSwgICAgICAgICAgICAgICAgICAgICAgIyBJbmNyZWFzZSB0aWNrIGxlbmd0aA0KICAgIGF4aXMudGlja3MgPSBlbGVtZW50X2xpbmUoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMC41MCksICAgIyBEYXJrZXIgdGlja3MNCiAgICBheGlzLmxpbmUueCA9IGVsZW1lbnRfbGluZShjb2xvciA9ICJibGFjayIsIHNpemUgPSAwLjc1KSwgICMgRGFyayBib3R0b20gYm9yZGVyDQogICAgYXhpcy5saW5lLnkgPSBlbGVtZW50X2xpbmUoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMC43NSkgICAjIERhcmsgbGVmdCBib3JkZXINCiAgKQ0KDQojIFByaW50IHRoZSBwbG90IA0KcHJpbnQocDFfc2hvcnR0ZXJtKQ0KDQpgYGANCg0KDQoNCiMjIyMgTG9uZy1UZXJtDQoNCmBgYHtyIGFhcGxfcmF3X2NhZ3JfZ3JhcGhzX2xvbmcsIGZpZy53aWR0aD0xMCwgZmlnLmhlaWdodD03fQ0KDQpjYXQoIlxuXG4jIyMjIENvbXBvdW5kIEF2ZXJhZ2UgR3Jvd3RoIFJhdGVzIEFjcm9zcyBMb25nLVRlcm0gUm9sbGluZyBQZXJpb2RzIFxuIikNCg0KIyBGaWx0ZXIgZGF0YSBmb3IgTG9uZy1UZXJtIENBR1IgKDIwLVllYXIgYW5kIDMwLVllYXIpDQpsb25ndGVybV9kYXRhIDwtIG5ydF9sb25nICU+JQ0KICBmaWx0ZXIoQ0FHUl9QZXJpb2QgJWluJSBjKCIyMC1ZZWFyIENBR1IiLCAiMzAtWWVhciBDQUdSIikpDQoNCg0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiMjIFBMT1QgRlVMTCBXSVRIT1VUIExJTUlUUw0KDQojIERlZmluZSBzdGFydCBhbmQgZW5kIHllYXJzDQpzdGFydF95ZWFyIDwtIDIwMDUNCmVuZF95ZWFyIDwtIDIwMjQNCnllYXJfcmFuZ2UgPC0gZW5kX3llYXIgLSBzdGFydF95ZWFyICsgMSAgIyBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiB5ZWFycw0KDQojIERlZmluZSBicmVha3Mgcm91bmRlZCBhcHByb3ByaWF0ZWx5DQpsaW1pdHNfc3RhcnRfeWVhciA8LSBmbG9vcihzdGFydF95ZWFyIC8gNSkgKiA1ICAjIFJvdW5kIGRvd24gdG8gdGhlIG5lYXJlc3QgbXVsdGlwbGUgb2YgNQ0KbGltaXRzX2VuZF95ZWFyIDwtIGNlaWxpbmcoZW5kX3llYXIgLyA1KSAqIDUgICAjIFJvdW5kIHVwIHRvIHRoZSBuZWFyZXN0IG11bHRpcGxlIG9mIDUNCg0KIyBDcmVhdGUgZHluYW1pYyB0aXRsZSBhbmQgY2FwdGlvbg0KZHluYW1pY190aXRsZSA8LSBwYXN0ZTAoIkNBR1IgQWNyb3NzIExvbmctVGVybSBQZXJpb2RzIE92ZXIgIix5ZWFyX3JhbmdlLCAiIFllYXJzICgiLCBzdGFydF95ZWFyLCAiLSIsIGVuZF95ZWFyLCAiKSIpDQpkeW5hbWljX2NhcHRpb24gPC0gcGFzdGUwKCJBQVBMIENvbXBvdW5kIEF2ZXJhZ2UgR3Jvd3RoIFJhdGVzIEFjcm9zcyBMb25nLVRlcm0gUm9sbGluZyBQZXJpb2RzLCBEYXRhc2V0ICgiLCBtaW5feWVhciwgIi0iLCBtYXhfeWVhciwgIikiKQ0KDQojIENyZWF0ZSB0aGUgZnVsbCwgbm9uLWZpbHRlcmVkIHgtYXhpcyBwbG90IHdpdGggZHluYW1pYyB4IHBsYWNlbWVudCBmb3IgYW5ub3RhdGlvbnMNCnAxX2xvbmd0ZXJtIDwtIGdncGxvdChsb25ndGVybV9kYXRhLCBhZXMoeCA9IGFzLmludGVnZXIoRGF0ZSksIHkgPSBDQUdSX1ZhbHVlLCBjb2xvciA9IENBR1JfUGVyaW9kKSkgKw0KDQogICMgQWRkIHNoYWRlZCBhcmVhcyBmb3IgYmFja2dyb3VuZCBlZmZlY3QNCiAgZ2VvbV9yZWN0KGFlcyh4bWluID0gLUluZiwgeG1heCA9IEluZiwgeW1pbiA9IHRhcmdldF9hZ2dyZXNzaXZlLCB5bWF4ID0gSW5mKSwgZmlsbCA9ICJsaWdodGdyZWVuIiwgYWxwaGEgPSAwLjAxMCkgKw0KICBnZW9tX3JlY3QoYWVzKHhtaW4gPSAtSW5mLCB4bWF4ID0gSW5mLCB5bWluID0gdGFyZ2V0X2NvbnNlcnZhdGl2ZSwgeW1heCA9IHRhcmdldF9hZ2dyZXNzaXZlKSwgZmlsbCA9ICJvcmFuZ2UiLCBhbHBoYSA9IDAuMDEpICsNCiAgZ2VvbV9yZWN0KGFlcyh4bWluID0gLUluZiwgeG1heCA9IEluZiwgeW1pbiA9IC1JbmYsIHltYXggPSB0YXJnZXRfY29uc2VydmF0aXZlKSwgZmlsbCA9ICJsaWdodGNvcmFsIiwgYWxwaGEgPSAwLjAxMCkgKw0KICANCiAgIyBQbG90IGxpbmVzIGZvciBlYWNoIENBR1IgUGVyaW9kDQogIGdlb21fbGluZShzaXplID0gMS4wLCBhbHBoYSA9IDMuMCkgKyAgICAgICAjIExpbmUgZm9yIGVhY2ggQ0FHUg0KICBnZW9tX3BvaW50KHNpemUgPSAxLjAsIGFscGhhID0gMy4wKSArICAgICAgICMgUG9pbnRzIGZvciBlYWNoIENBR1INCg0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSB0YXJnZXRfYWdncmVzc2l2ZSwgY29sb3IgPSAiZGFya2JsdWUiLCBsaW5ldHlwZSA9ICJzb2xpZCIpICsNCiAgIyBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSB0YXJnZXRfbW9kZXJhdGUsIGNvbG9yID0gImRhcmtibHVlIiwgbGluZXR5cGUgPSAic29saWQiKSArDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IHRhcmdldF9jb25zZXJ2YXRpdmUsIGNvbG9yID0gImRhcmtibHVlIiwgbGluZXR5cGUgPSAic29saWQiKSArDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IHRhcmdldF9pbmZsYXRpb24sIGNvbG9yID0gImRhcmtyZWQiLCBsaW5ldHlwZSA9ICJkYXNoZWQiKSArDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IGNhZ3JfdmFsdWUsIGNvbG9yID0gImRhcmtyZWQiLCBsaW5ldHlwZSA9ICJkYXNoZWQiKSArDQogIA0KICAjIER5bmFtaWMgcmlnaHQtYWxpZ25lZCBwbGFjZW1lbnQgZm9yIGFubm90YXRpb25zDQogIGFubm90YXRlKCJ0ZXh0IiwgeCA9IEluZiwgeSA9IHRhcmdldF9hZ2dyZXNzaXZlLCBsYWJlbCA9ICJBZ2dyZXNzaXZlIiwgDQogICAgICAgICAgIGhqdXN0ID0gMSwgdmp1c3QgPSAtMC41MCwgY29sb3IgPSAiZGFya2JsdWUiLCBzaXplID0gNCkgKw0KICAjIGFubm90YXRlKCJ0ZXh0IiwgeCA9IEluZiwgeSA9IHRhcmdldF9tb2RlcmF0ZSwgbGFiZWwgPSAiTW9kZXJhdGUiLCANCiAgIyAgICAgICAgIGhqdXN0ID0gMSwgdmp1c3QgPSAtMC41MCwgY29sb3IgPSAiZGFya2JsdWUiLCBzaXplID0gNCkgKw0KICBhbm5vdGF0ZSgidGV4dCIsIHggPSBJbmYsIHkgPSB0YXJnZXRfY29uc2VydmF0aXZlLCBsYWJlbCA9ICJDb25zZXJ2YXRpdmUiLCANCiAgICAgICAgICAgaGp1c3QgPSAxLCB2anVzdCA9IC0wLjUwLCBjb2xvciA9ICJkYXJrYmx1ZSIsIHNpemUgPSA0KSArDQogIGFubm90YXRlKCJ0ZXh0IiwgeCA9IEluZiwgeSA9IHRhcmdldF9pbmZsYXRpb24sIGxhYmVsID0gIkluZmxhdGlvbiIsIA0KICAgICAgICAgICBoanVzdCA9IDEsIHZqdXN0ID0gLTAuNTAsIGNvbG9yID0gImRhcmtyZWQiLCBzaXplID0gNCkgKw0KICBhbm5vdGF0ZSgidGV4dCIsIHggPSBJbmYsIHkgPSBjYWdyX3ZhbHVlLCBsYWJlbCA9ICJDQUdSIiwgDQogICAgICAgICAgIGhqdXN0ID0gMSwgdmp1c3QgPSAtMC41MCwgY29sb3IgPSAiZGFya3JlZCIsIHNpemUgPSA0KSArIA0KDQogIGxhYnMoDQogICAgdGl0bGUgPSBkeW5hbWljX3RpdGxlLA0KICAgIHggPSAiWWVhciIsDQogICAgeSA9ICJDQUdSIFZhbHVlICglKSIsDQogICAgY29sb3IgPSAiQ0FHUiBQZXJpb2QiLA0KICAgIGNhcHRpb24gPSBkeW5hbWljX2NhcHRpb24NCiAgICApICsNCiAgDQogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjdXN0b21fY29sb3JzW2MoIjIwLVllYXIgQ0FHUiIsICIzMC1ZZWFyIENBR1IiKV0pICsNCiAgc2NhbGVfeF9jb250aW51b3VzKA0KICAgIGxpbWl0cyA9IGMoc3RhcnRfeWVhciwgZW5kX3llYXIgKSwgDQogICAgYnJlYWtzID0gc2VxKGxpbWl0c19zdGFydF95ZWFyLCBsaW1pdHNfZW5kX3llYXIgKyA1LCA1KQ0KICApICsgICMgUmVzdHJpY3QgJiBTZXQgTWFqb3IgeC1heGlzIGxpbmVzIGZvciBlYWNoIHllYXINCg0KICB0aGVtZV9taW5pbWFsKCkgKw0KICB0aGVtZSgNCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41LCBzaXplID0gMjApLCAgICAgICAgICMgTGFyZ2VyIHRpdGxlIGZvbnQNCiAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0KSwgICAgICAgICAgICAgICAgICAgICMgTGFyZ2VyIHgtYXhpcyBsYWJlbCBmb250DQogICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCksICAgICAgICAgICAgICAgICAgICAjIExhcmdlciB5LWF4aXMgbGFiZWwgZm9udA0KICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSwgc2l6ZSA9IDE0KSwgICMgTGFyZ2VyIHgtYXhpcyB0ZXh0DQogICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0KSwgICAgICAgICAgICAgICAgICAgICAjIExhcmdlciB5LWF4aXMgdGV4dA0KICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQpLCAgICAgICAgICAgICAgICAgICAgIyBMZWdlbmQgdGl0bGUgc2l6ZQ0KICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiksICAgICAgICAgICAgICAgICAgICAgIyBMZWdlbmQgdGV4dCBzaXplDQogICAgcGFuZWwuZ3JpZC5tYWpvciA9IGVsZW1lbnRfbGluZShsaW5ldHlwZSA9ICJkb3R0ZWQiLCBjb2xvciA9ICJibGFjayIpLCAgIyBNYWpvciBncmlkIGxpbmVzDQogICAgcGFuZWwuZ3JpZC5taW5vci54ID0gZWxlbWVudF9ibGFuaygpLCAgICAgICAgICAgICAgICAgICAgICAjIE5vIG1pbm9yIHggZ3JpZCBsaW5lcw0KICAgIGF4aXMudGlja3MubGVuZ3RoID0gdW5pdCgtMC4yNSwgImNtIiksICAgICAgICAgICAgICAgICAgICAgICMgSW5jcmVhc2UgdGljayBsZW5ndGgNCiAgICBheGlzLnRpY2tzID0gZWxlbWVudF9saW5lKGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDAuNTApLCAgICMgRGFya2VyIHRpY2tzDQogICAgYXhpcy5saW5lLnggPSBlbGVtZW50X2xpbmUoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMC43NSksICAjIERhcmsgYm90dG9tIGJvcmRlcg0KICAgIGF4aXMubGluZS55ID0gZWxlbWVudF9saW5lKGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDAuNzUpICAgIyBEYXJrIGxlZnQgYm9yZGVyDQogICkNCg0KIyBQcmludCB0aGUgcGxvdCANCnByaW50KHAxX2xvbmd0ZXJtKQ0KDQoNCmBgYA0KDQoNCg0KDQojIE5WREENCg0KTlZJRElBIENvcnBvcmF0aW9uIChOVkRBKSBpcyBjb25zaWRlcmVkIGEgdGVjaG5vbG9neSBjb21wYW55IGhlYWRxdWFydGVyZWQgaW4gU2FudGEgQ2xhcmEsIENhbGlmb3JuaWEuIEVzdGFibGlzaGVkIGluIDE5OTMgYnkgSmVuc2VuIEh1YW5nLCBDaHJpcyBNYWxhY2hvd3NreSwgYW5kIEN1cnRpcyBQcmllbSwgTlZJRElBIGlzIGJlc3Qga25vd24gZm9yIGl0cyBjdXR0aW5nLWVkZ2UgZ3JhcGhpY3MgcHJvY2Vzc2luZyB1bml0cyAoR1BVcyksIHdoaWNoIHJldm9sdXRpb25pemVkIGNvbXB1dGVyIGdhbWluZyBhbmQgdmlzdWFsIGNvbXB1dGluZy4gVGhlIGNvbXBhbnkgYWxzbyBleGNlbHMgaW4gYXJ0aWZpY2lhbCBpbnRlbGxpZ2VuY2UgKEFJKSwgZGF0YSBjZW50ZXIgdGVjaG5vbG9naWVzLCBhdXRvbm9tb3VzIHZlaGljbGVzLCBhbmQgaGlnaC1wZXJmb3JtYW5jZSBjb21wdXRpbmcsIG1ha2luZyBpdCBhIGxlYWRlciBpbiBpbm5vdmF0aW9uIGFjcm9zcyBtdWx0aXBsZSBpbmR1c3RyaWVzLg0KDQojIyBOVkRBIEdSDQoNCiMjIyBEYXRhDQoNClRoZSBOVkRBIERhdGEgcHJlc2VudGVkIGhlcmUgaXMgc291cmNlZCBmcm9tIFlhaG9vIEZpbmFuY2UsIGZpbHRlcmVkIHRvIGRpc3BsYXkgTW9udGhseSBIaXN0b3JpY2FsIERhdGEgKGUuZy4sIDAzLzAxLzIwMjQpLiBUaGlzIGRhdGEgcmVwcmVzZW50cyB0aGUgY2xvc2luZyBwcmljZSBvZiB0aGUgbGFzdCB0cmFkaW5nIGRheSBvZiBlYWNoIG1vbnRoIChlLmcuLCAwMy8yOC8yMDI0KS4gUGxlYXNlIG5vdGUgdGhhdCB0aGUgc3RhdGlzdGljcyBwcmVzZW50ZWQgaGVyZSBtYXkgZGlmZmVyIGZyb20gdGhvc2UgaW4gWWFob28gRmluYW5jZSdzIFBlcmZvcm1hbmNlIHNlY3Rpb24gZHVlIHRvIGRpZmZlcmVuY2VzIGluIGRhdGEgYWdncmVnYXRpb24gYW5kIGNhbGN1bGF0aW9uIG1ldGhvZHMuICANCg0KRGF0YSBTb3VyY2U6IGByIG5ydiRzb3VyY2VfbnZkYV95YWhvb2ANCg0KYGBge3IgbnZkYV9yYXcsIGV2YWw9VFJVRSwgZWNobz1GQUxTRX0NCg0KIyBEaXNwbGF5IHRoZSBzdHJ1Y3R1cmUgb2YgdGhlIGRhdGFzZXQgdG8gY29uZmlybSBjb2x1bW4gbmFtZXMNCmludGVyYWN0aXZlX3N0cihucnQkbnZkYV9yYXcpDQoNCmxpYnJhcnkoZHBseXIpDQpsaWJyYXJ5KGx1YnJpZGF0ZSkgICMgRm9yIGRhdGUgbWFuaXB1bGF0aW9uDQpsaWJyYXJ5KHNjYWxlcykNCmxpYnJhcnkoc3RyaW5ncikNCg0KIyBFbnN1cmUgdGhlICdEYXRlJyBjb2x1bW4gaXMgb2YgRGF0ZSBjbGFzcw0KbnZkYV9yYXcgPC0gbnJ0JG52ZGFfcmF3ICU+JQ0KICBtdXRhdGUoRGF0ZSA9IGFzLkRhdGUoRGF0ZSwgZm9ybWF0ID0gIiVZLSVtLSVkIikpDQoNCiMgRmluZCB0aGUgbWluaW11bSBhbmQgbWF4aW11bSB5ZWFyDQptaW5feWVhciA8LSBmb3JtYXQobWluKG52ZGFfcmF3JERhdGUsIG5hLnJtID0gVFJVRSksICIlWSIpDQptYXhfeWVhciA8LSBmb3JtYXQobWF4KG52ZGFfcmF3JERhdGUsIG5hLnJtID0gVFJVRSksICIlWSIpDQppbnRlcmFjdGl2ZV9wcmludChtaW5feWVhcikNCmludGVyYWN0aXZlX3ByaW50KG1heF95ZWFyKQ0KDQojIFVwZGF0ZSBkYXRhIGZyYW1lIHdpdGggcHJvcGVyIGRhdGUgYW5kIHBlcmNlbnRhZ2UgaGFuZGxpbmcNCm52ZGFfcmF3IDwtIG52ZGFfcmF3ICU+JQ0KICBtdXRhdGUoDQogICAgIyBDb252ZXJ0IENsb3NlIERhdGUgdG8gIllZWVktTU0tREQiIGZvcm1hdA0KICAgIGBEYXRlYCA9IGZvcm1hdChhcy5EYXRlKGFzLmNoYXJhY3RlcihgRGF0ZWApLCBvcmlnaW4gPSAiMTk3MC0wMS0wMSIpLCAiJVktJW0tJWQiKSwNCg0KICAgICMgRW5zdXJlIENsb3NlIGlzIGEgbnVtYmVyIGZvcm1hdHRlZCB0byAyIGRlY2ltYWwgcGxhY2VzDQogICAgYENsb3NlYCA9IG51bWJlcihhcy5udW1lcmljKGdzdWIoIiwiLCAiIiwgQ2xvc2UpKSwgYmlnLm1hcmsgPSAiLCIsIGRlY2ltYWwubWFyayA9ICIuIiwgYWNjdXJhY3kgPSAwLjAxKSwNCg0KICAgICMgQ2xlYW4gYW5kIGhhbmRsZSBwZXJjZW50YWdlIGNvbHVtbnMNCiAgICBhY3Jvc3MoMzozLCB+IHsNCiAgICAgIHZhbHVlIDwtIGdzdWIoIlssJVxcc10iLCAiIiwgLikgICMgUmVtb3ZlICUsIGNvbW1hcywgYW5kIHNwYWNlcw0KICAgICAgbnVtZXJpY192YWx1ZSA8LSBzdXBwcmVzc1dhcm5pbmdzKGFzLm51bWVyaWModmFsdWUpKSAgIyBDb252ZXJ0IHRvIG51bWVyaWMNCiAgICAgIGlmZWxzZSgNCiAgICAgICAgIWlzLm5hKG51bWVyaWNfdmFsdWUpLCANCiAgICAgICAgcGFzdGUwKGZvcm1hdChyb3VuZChudW1lcmljX3ZhbHVlKjEwMCwgMiksIGJpZy5tYXJrID0gIiwiLCBzY2llbnRpZmljID0gRkFMU0UpLCAiJSIpLCAgIyBGb3JtYXQgdG8gMiBkZWNpbWFsIHBsYWNlcyBhbmQgYWRkIGNvbW1hcw0KICAgICAgICAuDQogICAgICApDQogICAgfSkNCiAgKSAlPiUNCiAgYXJyYW5nZShkZXNjKGBEYXRlYCkpICAjIFNvcnQgYnkgRGF0ZSBmcm9tIG5ld2VzdCB0byBvbGRlc3QNCg0KIyBEaXNwbGF5IHRoZSBmb3JtYXR0ZWQgZGF0YQ0KaW50ZXJhY3RpdmVfc3RyKG52ZGFfcmF3KQ0KaW50ZXJhY3RpdmVfcHJpbnQobnZkYV9yYXcpDQoNCiMgRGlzcGxheSB0aGUgdGFibGUgd2l0aCBjYXB0aW9uDQpjYXQoIlxuXG4jIyMjIE5WREEgWWVhcmx5IFBlcmZvcm1hbmNlICgiLCBtaW5feWVhciwgIi0iLCBtYXhfeWVhciwgIilcbiIsIHNlcCA9ICIiKQ0KZm9ybWF0X2VxdWFsX3dpZHRoX2dyb3VwZWQobnZkYV9yYXcsIGdyb3VwaW5nX2ZhY3RvciA9IDIpDQojIGNhdCgiXG5cbiBTb3VyY2U6ICIsIG5ydiRzb3VyY2VfbnZkYV95YWhvbywgIlxuIikNCg0KYGBgDQoNCiMjIyBTdW1tYXJ5DQoNCmBgYHtyIG52ZGFfcmF3X3N1bW1hcnksIGV2YWw9VFJVRSwgZWNobz1GQUxTRX0NCg0KIyBMb2FkIG5lY2Vzc2FyeSBsaWJyYXJpZXMNCmxpYnJhcnkoZHBseXIpDQpsaWJyYXJ5KHRpYmJsZSkNCmxpYnJhcnkoa25pdHIpDQpsaWJyYXJ5KGthYmxlRXh0cmEpDQoNCmludGVyYWN0aXZlX3N0cihudmRhX3JhdykNCmludGVyYWN0aXZlX3ByaW50KG52ZGFfcmF3KQ0KDQojIEVuc3VyZSB0aGUgRGF0ZSBjb2x1bW4gaXMgYSBwcm9wZXIgRGF0ZSBvYmplY3QgYW5kIGV4dHJhY3QgdGhlIHllYXINCm52ZGFfcmF3IDwtIG52ZGFfcmF3ICU+JQ0KICBzbGljZSgtMSkgJT4lICMgUmVtb3ZlIHRoZSBmaXJzdCByb3cNCiAgIyBtdXRhdGUoRGF0ZSA9IGlmZWxzZShyb3dfbnVtYmVyKCkgPT0gMSwgIjIwMjUtMDEtMDEiLCBEYXRlKSkgJT4lDQogIG11dGF0ZSgNCiAgICBEYXRlID0gYXMubnVtZXJpYyhmb3JtYXQoYXMuRGF0ZShEYXRlLCBmb3JtYXQgPSAiJVktJW0tJWQiKSwgIiVZIikpLA0KICAgIGAxLVllYXIgQ0FHUmAgPSBhcy5udW1lcmljKGdzdWIoIlteMC05Li1dIiwgIiIsIGAxLVllYXIgQ0FHUmApKQ0KICApDQoNCiMgU29ydCBkYXRhIGJ5IERhdGUgaW4gYXNjZW5kaW5nIG9yZGVyDQpudmRhX3JhdyA8LSBudmRhX3JhdyAlPiUNCiAgYXJyYW5nZShEYXRlKQ0KDQoNCiMgQ2FsY3VsYXRlIHRoZSBDQUdSIGFuZCBkeW5hbWljYWxseSBjcmVhdGUgYSB2YXJpYWJsZSBuYW1lIHdpdGggdGhlIGZvcm1hdCBudmRhX2NhZ3JfdmFsdWVfczxtaW5feWVhcj5fZTxtYXhfeWVhcj4NCmluaXRpYWxfdmFsdWUgPC0gMTAwICAjIEFzc3VtaW5nIGFuIGluaXRpYWwgaW5kZXggdmFsdWUgb2YgMTAwDQpmaW5hbF92YWx1ZSA8LSBpbml0aWFsX3ZhbHVlICogcHJvZCgxICsgbnZkYV9yYXckYDEtWWVhciBDQUdSYCAvIDEwMCwgbmEucm0gPSBUUlVFKQ0KbWluX3llYXIgPC0gbWluKG52ZGFfcmF3JERhdGUsIG5hLnJtID0gVFJVRSkNCm1heF95ZWFyIDwtIG1heChudmRhX3JhdyREYXRlLCBuYS5ybSA9IFRSVUUpDQpudW1feWVhcnMgPC0gbWF4X3llYXIgLSBtaW5feWVhcg0KY2Fncl92YWx1ZSA8LSByb3VuZCgoKGZpbmFsX3ZhbHVlIC8gaW5pdGlhbF92YWx1ZSleKDEgLyBudW1feWVhcnMpIC0gMSkgKiAxMDAsIDIpDQp2YXJfbmFtZSA8LSBwYXN0ZTAoIm52ZGFfY2Fncl92YWx1ZV9zIiwgbWluX3llYXIsICJfZSIsIG1heF95ZWFyKQ0KYXNzaWduKHZhcl9uYW1lLCBjYWdyX3ZhbHVlKQ0KDQojIENvbnZlcnQgTlZEQSBkYXRhIHRvIG51bWVyaWMsIHJlbW92aW5nIGFueSBwZXJjZW50YWdlIHNpZ25zDQpkYXRhIDwtIGFzLm51bWVyaWMoZ3N1YigiJSIsICIiLCBudmRhX3JhdyRgMS1ZZWFyIENBR1JgKSkNCg0KIyBDYWxjdWxhdGUgc3RhdGlzdGljcw0KY291bnRfb2JzZXJ2YXRpb25zIDwtIHN1bSghaXMubmEoZGF0YSkpDQptZWFuX3ZhbHVlIDwtIHJvdW5kKG1lYW4oZGF0YSwgbmEucm0gPSBUUlVFKSwgMikNCm1lZGlhbl92YWx1ZSA8LSByb3VuZChtZWRpYW4oZGF0YSwgbmEucm0gPSBUUlVFKSwgMikNCnNkX3ZhbHVlIDwtIHJvdW5kKHNkKGRhdGEsIG5hLnJtID0gVFJVRSksIDIpDQptaW5fY2Fncl9yYW5nZSA8LSByb3VuZChjYWdyX3ZhbHVlIC0gc2RfdmFsdWUsIDIpDQptYXhfY2Fncl9yYW5nZSA8LSByb3VuZChjYWdyX3ZhbHVlICsgc2RfdmFsdWUsIDIpDQptaW5fdmFsdWUgPC0gcm91bmQobWluKGRhdGEsIG5hLnJtID0gVFJVRSksIDIpDQptYXhfdmFsdWUgPC0gcm91bmQobWF4KGRhdGEsIG5hLnJtID0gVFJVRSksIDIpDQoNCiMgVGFyZ2V0IFJhdGUgQW5hbHlzaXMgLSBSZWZlciB0byAiUHJlZmVycmVkIFRhcmdldHMiIG9yIGluY2x1ZGUgYmVsb3cgZm9yIGluZGl2aWR1YWwgY2hhbmdlcy4NCmFib3ZlX3RhcmdldF9pbmZsYXRpb24gPC0gc3VtKGRhdGEgPj0gdGFyZ2V0X2luZmxhdGlvbiwgbmEucm0gPSBUUlVFKQ0KYWJvdmVfdGFyZ2V0X2NvbnNlcnZhdGl2ZSA8LSBzdW0oZGF0YSA+PSB0YXJnZXRfY29uc2VydmF0aXZlLCBuYS5ybSA9IFRSVUUpDQphYm92ZV90YXJnZXRfbW9kZXJhdGUgPC0gc3VtKGRhdGEgPj0gdGFyZ2V0X21vZGVyYXRlLCBuYS5ybSA9IFRSVUUpDQphYm92ZV90YXJnZXRfYWdncmVzc2l2ZSA8LSBzdW0oZGF0YSA+PSB0YXJnZXRfYWdncmVzc2l2ZSwgbmEucm0gPSBUUlVFKQ0KDQpwZXJjZW50X2Fib3ZlX3RhcmdldF9jb25zZXJ2YXRpdmUgPC0gcm91bmQoKGFib3ZlX3RhcmdldF9jb25zZXJ2YXRpdmUgLyBjb3VudF9vYnNlcnZhdGlvbnMpICogMTAwLCAyKQ0KcGVyY2VudF9hYm92ZV90YXJnZXRfaW5mbGF0aW9uIDwtIHJvdW5kKChhYm92ZV90YXJnZXRfaW5mbGF0aW9uIC8gY291bnRfb2JzZXJ2YXRpb25zKSAqIDEwMCwgMikNCnBlcmNlbnRfYWJvdmVfdGFyZ2V0X21vZGVyYXRlIDwtIHJvdW5kKChhYm92ZV90YXJnZXRfbW9kZXJhdGUgLyBjb3VudF9vYnNlcnZhdGlvbnMpICogMTAwLCAyKQ0KcGVyY2VudF9hYm92ZV90YXJnZXRfYWdncmVzc2l2ZSA8LSByb3VuZCgoYWJvdmVfdGFyZ2V0X2FnZ3Jlc3NpdmUgLyBjb3VudF9vYnNlcnZhdGlvbnMpICogMTAwLCAyKQ0KDQojIENvbXBpbGUgc3RhdGlzdGljcyBpbnRvIGEgbGlzdCBmb3IgZWFzeSBjb252ZXJzaW9uIHRvIGEgZGF0YSBmcmFtZSB3aXRoIGRlZmluaXRpb25zDQpudmRhX3Jhd19zdW1tYXJ5IDwtIHRyaWJibGUoDQogIH5TdGF0aXN0aWMsIH5WYWx1ZSwgfkRlZmluaXRpb24sDQogICJDb3VudCBvZiBPYnNlcnZhdGlvbnMiLCBhcy5jaGFyYWN0ZXIoY291bnRfb2JzZXJ2YXRpb25zKSwgIlRvdGFsIG51bWJlciBvZiBkYXRhIHBvaW50cyBjb2xsZWN0ZWQgb3ZlciB0aGUgc3BlY2lmaWMgcGVyaW9kLiIsDQogICJDQUdSIiwgcGFzdGUwKGNhZ3JfdmFsdWUsICIlIiksICJDb21wb3VuZCBBdmVyYWdlIEdyb3d0aCBSYXRlOyBtZWFuIGdyb3d0aCByYXRlIG92ZXIgYSBwZXJpb2QgaWYgaXQgaGFkIGNvbXBvdW5kZWQgYW51YWxseS4iLA0KICAiTWVhbiIsIHBhc3RlMChtZWFuX3ZhbHVlLCAiJSIpLCAiUmVmbGVjdHMgdGhlIGdlbmVyYWwgcHJpY2UgbGV2ZWwgYW5kIG92ZXJhbGwgZ3Jvd3RoIHJhdGUuIiwNCiAgIk1lZGlhbiIsIHBhc3RlMChtZWRpYW5fdmFsdWUsICIlIiksICJNaWRkbGUgdmFsdWUgb2YgdGhlIGRhdGEgd2hlbiBvcmRlcmVkIGNocm9ub2xvZ2ljYWxseTsgY2VudHJhbCB0ZW5kZW5jeSBtZWFzdXJlIGxlc3MgYWZmZWN0ZWQgYnkgZXh0cmVtZSB2YWx1ZXMuIiwNCiAgIlN0YW5kYXJkIERldmlhdGlvbiAoVm9sYXRpbGl0eSkiLCBwYXN0ZTAoc2RfdmFsdWUsICIlIiksICJUaGUgZGlzcGVyc2lvbiBvZiB2YWx1ZXMgZnJvbSB0aGUgbWVhbiwgaW5kaWNhdGluZyB0aGUgdm9sYXRpbGl0eSBvZiBwcmljZSBjaGFuZ2VzIGFuZCBlY29ub21pYyBzdGFiaWxpdHkuIiwNCiAgIk1pbiBDQUdSIFJhbmdlIChDQUdSIC0gU0QpIiwgcGFzdGUwKG1pbl9jYWdyX3JhbmdlLCAiJSIpLCAiTG93ZXIgYm91bmRhcnkgb2YgZXhwZWN0ZWQgTlZEQSByYW5nZTsgbG93ZXN0IGVzdGltYXRlIG9mIHR5cGljYWwgZ3Jvd3RoIHJhdGUgY29uc2lkZXJpbmcgbm9ybWFsIGZsdWN0dWF0aW9ucy4iLA0KICAiTWF4IENBR1IgUmFuZ2UgKENBR1IgKyBTRCkiLCBwYXN0ZTAobWF4X2NhZ3JfcmFuZ2UsICIlIiksICJVcHBlciBib3VuZGFyeSBvZiBleHBlY3RlZCBOVkRBIHJhbmdlOyBoaWdoZXN0IGVzdGltYXRlIG9mIHR5cGljYWwgZ3Jvd3RoIHJhdGUgY29uc2lkZXJpbmcgbm9ybWFsIGZsdWN0dWF0aW9ucy4iLA0KICAiTWluaW11bSIsIHBhc3RlMChtaW5fdmFsdWUsICIlIiksICJMb3dlc3QgZ3Jvd3RoIHJhdGUuIiwNCiAgIk1heGltdW0iLCBwYXN0ZTAobWF4X3ZhbHVlLCAiJSIpLCAiSGlnaGVzdCBncm93dGggcmF0ZS4iLA0KICAiUGVyY2VudCBBYm92ZSBJbmZsYXRpb24gVGFyZ2V0IiwgcGFzdGUwKHBlcmNlbnRfYWJvdmVfdGFyZ2V0X2luZmxhdGlvbiwgIiUiKSwgIlBlcmNlbnRhZ2Ugb2YgdmFsdWVzIGFib3ZlIHRoZSBpbmZsYXRpb24gdGFyZ2V0IHNwZWNpZmllZCBpbiBQcmVmZXJyZWQgVGFyZ2V0cyBzZWN0aW9uLiIsDQogICJQZXJjZW50IEFib3ZlIENvbnNlcnZhdGl2ZSBUYXJnZXQiLCBwYXN0ZTAocGVyY2VudF9hYm92ZV90YXJnZXRfY29uc2VydmF0aXZlLCAiJSIpLCAiUGVyY2VudGFnZSBvZiB2YWx1ZXMgYWJvdmUgdGhlIGNvbnNlcnZhdGl2ZSB0YXJnZXQgc3BlY2lmaWVkIGluIFByZWZlcnJlZCBUYXJnZXRzIHNlY3Rpb24uIiwNCiAgIlBlcmNlbnQgQWJvdmUgTW9kZXJhdGUgVGFyZ2V0IiwgcGFzdGUwKHBlcmNlbnRfYWJvdmVfdGFyZ2V0X21vZGVyYXRlLCAiJSIpLCAiUGVyY2VudGFnZSBvZiB2YWx1ZXMgYWJvdmUgdGhlIG1vZGVyYXRlIHRhcmdldCBzcGVjaWZpZWQgaW4gUHJlZmVycmVkIFRhcmdldHMgc2VjdGlvbi4iLA0KICAiUGVyY2VudCBBYm92ZSBBZ2dyZXNzaXZlIFRhcmdldCIsIHBhc3RlMChwZXJjZW50X2Fib3ZlX3RhcmdldF9hZ2dyZXNzaXZlLCAiJSIpLCAiUGVyY2VudGFnZSBvZiB2YWx1ZXMgYWJvdmUgdGhlIGFnZ3Jlc3NpdmUgdGFyZ2V0IHNwZWNpZmllZCBpbiBQcmVmZXJyZWQgVGFyZ2V0cyBzZWN0aW9uLiINCikNCg0KIyBDb252ZXJ0IHRvIGNoYXJhY3RlciB0byBhdm9pZCBhdXRvbWF0aWMgZGVjaW1hbCBwb2ludHMgb24gd2hvbGUgbnVtYmVycw0KbnZkYV9yYXdfc3VtbWFyeSA8LSBudmRhX3Jhd19zdW1tYXJ5ICU+JQ0KICBtdXRhdGUoYWNyb3NzKGV2ZXJ5dGhpbmcoKSwgYXMuY2hhcmFjdGVyKSkNCg0KIyBEaXNwbGF5IGZvcm1hdHRlZCB0YWJsZQ0KY2F0KCJcblxuIyMjIyBBbm51YWwgR3Jvd3RoIFJhdGUgU3VtbWFyeSAoIiwgbWluX3llYXIsICItIiwgbWF4X3llYXIsICIpXG4iLCBzZXAgPSAiIikNCmZvcm1hdF8zY29sX2N1c3RvbV93aWR0aHMobnZkYV9yYXdfc3VtbWFyeSwgY29sMV93aWR0aCA9ICIyMGVtIiwgY29sMl93aWR0aCA9ICIxMGVtIiwgY29sM193aWR0aCA9ICI0MGVtIikgDQoNCiMgVmlldyhudmRhX3Jhd19zdW1tYXJ5KQ0KaW50ZXJhY3RpdmVfc3RyKG52ZGFfcmF3X3N1bW1hcnkpDQoNCmBgYA0KDQpOVkRBJ3MgSW5kZXggZXhoaWJpdHMgYSBgciBpZihjYWdyX3ZhbHVlID4gdGFyZ2V0X2FnZ3Jlc3NpdmUpICJhZ2dyZXNzaXZlIiBlbHNlIGlmKGNhZ3JfdmFsdWUgPiB0YXJnZXRfbW9kZXJhdGUpICJtb2RlcmF0ZSIgZWxzZSBpZihjYWdyX3ZhbHVlID4gdGFyZ2V0X2NvbnNlcnZhdGl2ZSkgImNvbnNlcnZhdGl2ZSIgZWxzZSBpZihjYWdyX3ZhbHVlID4gdGFyZ2V0X2luZmxhdGlvbikgImJhc2VsaW5lIiBlbHNlICJkaXNhcHBvaW50aW5nImAgQ0FHUiBhdCBgciBjYWdyX3ZhbHVlYCUsIGByIGlmKGNhZ3JfdmFsdWUgPCBtZWFuX3ZhbHVlKSAibG93ZXIgdGhhbiIgZWxzZSAiaGlnaGVyIHRoYW4iYCB0aGUgbWVhbiBncm93dGggcmF0ZSBvZiBgciBtZWFuX3ZhbHVlYCUsIHJlZmxlY3RpbmcgdGhlIGltcGFjdCBvZiBzaG9ydC10ZXJtIHZvbGF0aWxpdHkgYW5kIGByIGlmKGNhZ3JfdmFsdWUgPiBtZWFuX3ZhbHVlKSAiZGVjbGluZXMiIGVsc2UgImdyb3d0aCBzcGlrZXMiYC4gVGhlIG1lZGlhbiByZXR1cm4gb2YgYHIgbWVkaWFuX3ZhbHVlYCUgaW5kaWNhdGVzIHRoYXQgbW9yZSB0aGFuIGhhbGYgb2YgdGhlIG9ic2VydmVkIHllYXJzIGV4cGVyaWVuY2VkIHJldHVybnMgYHIgaWYoY2Fncl92YWx1ZSA8IG1lZGlhbl92YWx1ZSkgImFib3ZlIiBlbHNlICJiZWxvdyJgIHRoZSBtZWFuLiBUaGUgcmVsYXRpb25zaGlwIGJldHdlZW4gdGhlIENBR1IgYW5kIHRoZSBtZWRpYW4gZ3Jvd3RoIHJhdGUgc3VnZ2VzdHMgdGhhdCBzdXN0YWluZWQgcGVyaW9kcyBvZiBhYm92ZS1tZWRpYW4gZ3Jvd3RoIGhhdmUgZXhlcnRlZCBjdW11bGF0aXZlIGByIGlmKGNhZ3JfdmFsdWUgPCBtZWRpYW5fdmFsdWUpICJ1cHdhcmQgcHJlc3N1cmUiIGVsc2UgImRvd253YXJkIHByZXNzdXJlImAgb24gb3ZlcmFsbCBwcmljZSBsZXZlbHMuIFRoaXMgcmVsYXRpb25zaGlwIGhpZ2hsaWdodHMgYSBkaXN0cmlidXRpb24gd2l0aCBub3RhYmxlIGV4dHJlbWVzIG9uIHRoZSBgciBpZihjYWdyX3ZhbHVlIDwgbWVhbl92YWx1ZSkgImhpZ2hlciIgZWxzZSAibG93ZXIiYCBlbmQsIHJlZmxlY3RpbmcgYHIgaWYoY2Fncl92YWx1ZSA8IG1lYW5fdmFsdWUpICJwb3NpdGl2ZSIgZWxzZSAibmVnYXRpdmUiYCBza2V3bmVzcy4gVGhpcyBgciBpZihjYWdyX3ZhbHVlIDwgbWVkaWFuX3ZhbHVlKSAicG9zaXRpdmUiIGVsc2UgIm5lZ2F0aXZlImAgc2tld25lc3MgaW1wbGllcyB0aGF0IHdoaWxlIG1vcmUgdGhhbiBoYWxmIG9mIHRoZSBvYnNlcnZlZCB5ZWFycyBleHBlcmllbmNlZCByZXR1cm5zIGByIGlmKGNhZ3JfdmFsdWUgPCBtZWRpYW5fdmFsdWUpICJhYm92ZSB0aGUgbWVhbiwgZG93bnR1cm5zIGNhbiBiZSBzZXZlcmUiIGVsc2UgImJlbG93IHRoZSBtZWFuLCB1cHR1cm5zIGNhbiBiZSBzaWduaWZpY2FudCJgLiBIb3dldmVyLCB0aGUgbWFya2V0IGhhcyBoaXN0b3JpY2FsbHkgcHJvdmlkZWQgc3Vic3RhbnRpYWwgYHIgaWYoY2Fncl92YWx1ZSA8IG1lZGlhbl92YWx1ZSkgInVwc2lkZSBwb3RlbnRpYWwiIGVsc2UgImRvd25zaWRlIHJpc2siYC4gQWRkaXRpb25hbGx5LCB0aGUgZmFjdCB0aGF0IGByIHBlcmNlbnRfYWJvdmVfdGFyZ2V0X2luZmxhdGlvbmAlIG9mIHRoZSB5ZWFycyBleGNlZWRlZCB0aGUgaW5mbGF0aW9uIHRhcmdldCBgciBpZiAocGVyY2VudF9hYm92ZV90YXJnZXRfaW5mbGF0aW9uID4gNzApICJyZWluZm9yY2VzIE5WREEncyBlZmZlY3RpdmVuZXNzIGFzIGEgc3Ryb25nIGxvbmctdGVybSBoZWRnZSIgZWxzZSBpZiAocGVyY2VudF9hYm92ZV90YXJnZXRfaW5mbGF0aW9uID4gNjApICJyZWluZm9yY2VzIE5WREEncyBlZmZlY3RpdmVuZXNzIGFzIGEgbG9uZy10ZXJtIGhlZGdlIiBlbHNlIGlmIChwZXJjZW50X2Fib3ZlX3RhcmdldF9pbmZsYXRpb24gPiA1MCkgInF1ZXN0aW9ucyBOVkRBJ3MgZWZmZWN0aXZlbmVzcyAgYXMgYSBsb25nLXRlcm0gaGVkZ2UiIGVsc2UgInVuZGVybWluZXMgTlZEQSdzIGVmZmVjdGl2ZW5lc3MgYXMgYSBsb25nLXRlcm0gaGVkZ2UiYCBhZ2FpbnN0IGluZmxhdGlvbi4NCg0KVGhlIHN0YW5kYXJkIGRldmlhdGlvbiBvZiBgciBzZF92YWx1ZWAlIGByIGlmKHNkX3ZhbHVlID4gMjApICJpbmRpY2F0ZXMgZXh0cmVtZSB2b2xhdGlsaXR5LCByZWZsZWN0aW5nIHN1YnN0YW50aWFsIGZsdWN0dWF0aW9ucyBpbiBlcXVpdHkgbWFya2V0cyIgZWxzZSBpZihzZF92YWx1ZSA+IDE1KSAidW5kZXJzY29yZXMgc2lnbmlmaWNhbnQgdm9sYXRpbGl0eSwgYSBjb21tb24gZmVhdHVyZSBvZiBlcXVpdHkgbWFya2V0cyIgZWxzZSAic3VnZ2VzdHMgbW9kZXJhdGUgdm9sYXRpbGl0eSwgdHlwaWNhbCBvZiByZWxhdGl2ZWx5IHN0YWJsZSBtYXJrZXRzImAuIFRoZSBgciByYW5nZV9yYXRpbyA8LSAobWF4X3ZhbHVlIC0gbWluX3ZhbHVlKSAvIHNkX3ZhbHVlOyBpZihyYW5nZV9yYXRpbyA+IDUpICJoaWdobHkgdm9sYXRpbGUiIGVsc2UgaWYocmFuZ2VfcmF0aW8gPiAzKSAibm90YWJsZSIgZWxzZSAiY29tcGFyYXRpdmVseSBzdGFibGUiYCByYW5nZSBvZiBhbm51YWwgcmV0dXJucywgc3Bhbm5pbmcgZnJvbSBgciBtaW5fdmFsdWVgJSB0byBgciBtYXhfdmFsdWVgJSwgYHIgaWYocmFuZ2VfcmF0aW8gPiA1KSAiaWxsdXN0cmF0ZXMgYSBoaWdobHkgdm9sYXRpbGUgbWFya2V0IGVudmlyb25tZW50LCBwYXJ0bHkgZHVlIHRvIGl0cyBjb21wb3NpdGlvbiwgd2l0aCB0aGUgcG90ZW50aWFsIGZvciBib3RoIGV4dHJlbWUgZ2FpbnMgYW5kIGxvc3NlcyIgZWxzZSBpZihyYW5nZV9yYXRpbyA+IDMpICJoaWdobGlnaHRzIG5vdGFibGUgbWFya2V0IHZhcmlhYmlsaXR5LCBwYXJ0bHkgZHVlIHRvIGl0cyBjb21wb3NpdGlvbiwgIHJlZmxlY3RpbmcgYm90aCBvcHBvcnR1bml0aWVzIGFuZCByaXNrcyIgZWxzZSAiaW5kaWNhdGVzIGEgY29tcGFyYXRpdmVseSBzdGFibGUgbWFya2V0LCBwYXJ0bHkgZHVlIHRvIGl0cyBjb21wb3NpdGlvbiwgd2l0aCBsZXNzIGV4dHJlbWUgYW5udWFsIGZsdWN0dWF0aW9ucyJgLiANCg0KRm9yIE5WREEgdG8gYmUgY29uc2lkZXJlZCBhIGhpZ2gtcGVyZm9ybWluZyBhbmQgcmVzaWxpZW50IGxvbmctdGVybSBpbnZlc3RtZW50LCBpdCB3b3VsZCBiZSBpZGVhbCB0byBleGNlZWQgdGhlIGFnZ3Jlc3NpdmUgdGFyZ2V0ICAoZS5nLiwgYHIgKHRhcmdldF9hZ2dyZXNzaXZlIC0gdGFyZ2V0X2luZmxhdGlvbilgJSBhbm51YWxpemVkIHJldHVybnMsIGFjY291bnRpbmcgZm9yIGhpZ2hlciBpbmZsYXRpb24tYWRqdXN0ZWQgcGVyZm9ybWFuY2UgZXhwZWN0YXRpb25zKSBpbiBhdCBsZWFzdCA0MCUtNTAlIG9mIHRoZSB5ZWFycy4gVGhpcyByYW5nZSByZWZsZWN0cyB0aGUgcG90ZW50aWFsIGZvciBzdHJvbmcgdXBzaWRlIGluIG1hbnkgeWVhcnMgd2hpbGUgYmFsYW5jaW5nIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgbWFya2V0cyBkbyBleHBlcmllbmNlIGRvd250dXJucy4gVGhlIGZhY3QgdGhhdCBgciBwZXJjZW50X2Fib3ZlX3RhcmdldF9hZ2dyZXNzaXZlYCUgb2YgdGhlIHllYXJzIGV4Y2VlZGVkIHRoZSBhZ2dyZXNzaXZlIHRhcmdldCBgciBpZihwZXJjZW50X2Fib3ZlX3RhcmdldF9hZ2dyZXNzaXZlID4gNTApICJpbmRpY2F0ZXMgY29uc2lzdGVudCBhbmQgcm9idXN0IGdyb3d0aCwgbWFraW5nIE5WREEgYSBzdHJvbmcgb3B0aW9uIGZvciB0aG9zZSBzZWVraW5nIGFnZ3Jlc3NpdmUgaW52ZXN0bWVudHMuIiBlbHNlIGlmKHBlcmNlbnRfYWJvdmVfdGFyZ2V0X2FnZ3Jlc3NpdmUgPiA0MCkgInN1Z2dlc3RzIHRoYXQgd2hpbGUgbm90IGNvbnNpc3RlbnQsIE5WREEgaGFzIGhpc3RvcmljYWxseSBwcm92aWRlZCByb2J1c3QgZ3Jvd3RoIG92ZXIgdGhlIGxvbmcgdGVybSwgbWFraW5nIGl0IGEgdmlhYmxlIGludmVzdG1lbnQgZm9yIHRob3NlIHdpdGggYSBoaWdoZXIgcmlzayB0b2xlcmFuY2UuIiBlbHNlICJyYWlzZXMgY29uY2VybnMgYWJvdXQgTlZEQSdzIGFiaWxpdHkgdG8gbWVldCBhZ2dyZXNzaXZlIGdyb3d0aCB0YXJnZXRzLCBtYWtpbmcgaXQgbGVzcyBzdWl0YWJsZSBmb3IgaW52ZXN0b3JzIHdpdGggaGlnaGVyIHJpc2sgdG9sZXJhbmNlLiJgDQoNCiMjIyBHcmFwaA0KDQpgYGB7ciBudmRhX3Jhd19ncmFwaCwgZmlnLndpZHRoPTEwLCBmaWcuaGVpZ2h0PTcsIGV2YWw9VFJVRSwgZWNobz1GQUxTRX0NCg0KIyBMb2FkIG5lY2Vzc2FyeSBsaWJyYXJpZXMNCmxpYnJhcnkoZ2dwbG90MikNCmxpYnJhcnkoZHBseXIpDQoNCiMgQ29udmVydCBgMS1ZZWFyIENBR1JgIHRvIG51bWVyaWMgZm9yIHBsb3R0aW5nDQpudmRhX3JhdyA8LSBudmRhX3JhdyAlPiUNCiAgbXV0YXRlKA0KICAgIGBEYXRlYCA9IGFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKGBEYXRlYCkpLCAgIyBFbnN1cmUgRGF0ZSBpcyBudW1lcmljDQogICAgYDEtWWVhciBDQUdSYCA9IGFzLm51bWVyaWMoZ3N1YigiJSIsICIiLCBgMS1ZZWFyIENBR1JgKSkNCiAgKQ0KDQojIEZpbmQgdGhlIG1pbmltdW0gYW5kIG1heGltdW0geC12YWx1ZSBpbiB5b3VyIGRhdGENCm1heF94IDwtIG1heChhcy5pbnRlZ2VyKG52ZGFfcmF3JERhdGUpLCBuYS5ybSA9IFRSVUUpDQptaW5feCA8LSBtaW4oYXMuaW50ZWdlcihudmRhX3JhdyREYXRlKSwgbmEucm0gPSBUUlVFKQ0KaW50ZXJhY3RpdmVfcHJpbnQobWF4X3gpICAjIFRlc3QNCmludGVyYWN0aXZlX3ByaW50KG1pbl94KSAgIyBUZXN0DQoNCiMgRmluZCB0aGUgbWluaW11bSBhbmQgbWF4aW11bSB5ZWFyDQptaW5feWVhciA8LSBtaW4obnZkYV9yYXckRGF0ZSwgbmEucm0gPSBUUlVFKQ0KbWF4X3llYXIgPC0gbWF4KG52ZGFfcmF3JERhdGUsIG5hLnJtID0gVFJVRSkNCmludGVyYWN0aXZlX3ByaW50KG1pbl95ZWFyKQ0KaW50ZXJhY3RpdmVfcHJpbnQobWF4X3llYXIpDQoNCg0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiMjIFBMT1QgRlVMTCBXSVRIT1VUIExJTUlUUw0KDQojIERlZmluZSBzdGFydCBhbmQgZW5kIHllYXJzDQpzdGFydF95ZWFyIDwtIGFzLm51bWVyaWMobWluX3llYXIpDQplbmRfeWVhciA8LSAyMDI0DQp5ZWFyX3JhbmdlIDwtIGVuZF95ZWFyIC0gc3RhcnRfeWVhciArIDEgICMgQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgeWVhcnMNCg0KIyBEZWZpbmUgYnJlYWtzIHJvdW5kZWQgYXBwcm9wcmlhdGVseQ0KbGltaXRzX3N0YXJ0X3llYXIgPC0gZmxvb3Ioc3RhcnRfeWVhciAvIDUpICogNSAgIyBSb3VuZCBkb3duIHRvIHRoZSBuZWFyZXN0IG11bHRpcGxlIG9mIDUNCmxpbWl0c19lbmRfeWVhciA8LSBjZWlsaW5nKGVuZF95ZWFyIC8gNSkgKiA1ICAgIyBSb3VuZCB1cCB0byB0aGUgbmVhcmVzdCBtdWx0aXBsZSBvZiA1DQoNCiMgQ3JlYXRlIGR5bmFtaWMgdGl0bGUgYW5kIGNhcHRpb24NCmR5bmFtaWNfdGl0bGUgPC0gcGFzdGUwKCJBbm51YWwgR3Jvd3RoIFJhdGVzIE92ZXIgIix5ZWFyX3JhbmdlLCAiIFllYXJzICgiLCBzdGFydF95ZWFyLCAiLSIsIGVuZF95ZWFyLCAiKSIpDQpkeW5hbWljX2NhcHRpb24gPC0gcGFzdGUwKCJOVkRBIEFubnVhbCBHcm93dGggUmF0ZXMsIERhdGEgUGVyaW9kICgiLCBtaW5feWVhciwgIuKAkyIsIG1heF95ZWFyLCAiKSIpDQoNCiMgQ3JlYXRlIHRoZSBmdWxsLCBub24tZmlsdGVyZWQgeC1heGlzIHBsb3Qgd2l0aCBkeW5hbWljIHggcGxhY2VtZW50IGZvciBhbm5vdGF0aW9ucw0KcDEgPC0gZ2dwbG90KG52ZGFfcmF3LCBhZXMoeCA9IGFzLmludGVnZXIoRGF0ZSksIHkgPSBgMS1ZZWFyIENBR1JgKSkgKw0KICANCiAgIyBBZGQgc2hhZGVkIGFyZWFzIGZvciBiYWNrZ3JvdW5kIGVmZmVjdA0KICBnZW9tX3JlY3QoYWVzKHhtaW4gPSAtSW5mLCB4bWF4ID0gSW5mLCB5bWluID0gdGFyZ2V0X2FnZ3Jlc3NpdmUsIHltYXggPSBJbmYpLCBmaWxsID0gImxpZ2h0Z3JlZW4iLCBhbHBoYSA9IDAuMDI1KSArDQogIGdlb21fcmVjdChhZXMoeG1pbiA9IC1JbmYsIHhtYXggPSBJbmYsIHltaW4gPSB0YXJnZXRfY29uc2VydmF0aXZlLCB5bWF4ID0gdGFyZ2V0X2FnZ3Jlc3NpdmUpLCBmaWxsID0gIm9yYW5nZSIsIGFscGhhID0gMC4wMjUpICsNCiAgZ2VvbV9yZWN0KGFlcyh4bWluID0gLUluZiwgeG1heCA9IEluZiwgeW1pbiA9IC1JbmYsIHltYXggPSB0YXJnZXRfY29uc2VydmF0aXZlKSwgZmlsbCA9ICJsaWdodGNvcmFsIiwgYWxwaGEgPSAwLjAyNSkgKw0KICANCiAgIyBQbG90IGxpbmVzLCBwb2ludHMsIGFuZCBhbm5vdGF0aW9ucyBvbiB0b3Agb2Ygc2hhZGVkIGFyZWFzDQogIGdlb21fbGluZShjb2xvciA9ICIjNEIwMDgyIiwgc2l6ZSA9IDEuMCkgKyAgICAgICAjIERhcmsgcHVycGxlIGxpbmUgDQogIGdlb21fcG9pbnQoY29sb3IgPSAiIzRCMDA4MiIsIHNpemUgPSAxLjUpICsgICAgICAgICMgRGFyayBwdXJwbGUgcG9pbnRzIA0KICANCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gdGFyZ2V0X2FnZ3Jlc3NpdmUsIGNvbG9yID0gImRhcmtibHVlIiwgbGluZXR5cGUgPSAic29saWQiKSArDQogICMgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gdGFyZ2V0X21vZGVyYXRlLCBjb2xvciA9ICJkYXJrYmx1ZSIsIGxpbmV0eXBlID0gInNvbGlkIikgKw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSB0YXJnZXRfY29uc2VydmF0aXZlLCBjb2xvciA9ICJkYXJrYmx1ZSIsIGxpbmV0eXBlID0gInNvbGlkIikgKw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSB0YXJnZXRfaW5mbGF0aW9uLCBjb2xvciA9ICJkYXJrcmVkIiwgbGluZXR5cGUgPSAiZGFzaGVkIikgKw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSBjYWdyX3ZhbHVlLCBjb2xvciA9ICJkYXJrcmVkIiwgbGluZXR5cGUgPSAiZGFzaGVkIikgKw0KICANCiAgIyBEeW5hbWljIHJpZ2h0LWFsaWduZWQgcGxhY2VtZW50IGZvciBhbm5vdGF0aW9ucw0KICBhbm5vdGF0ZSgidGV4dCIsIHggPSBJbmYsIHkgPSB0YXJnZXRfYWdncmVzc2l2ZSwgbGFiZWwgPSAiQWdncmVzc2l2ZS9Db25zZXJ2YXRpdmUiLCANCiAgICAgICAgICAgaGp1c3QgPSAxLCB2anVzdCA9IC0wLjUwLCBjb2xvciA9ICJkYXJrYmx1ZSIsIHNpemUgPSA0KSArDQogICMgYW5ub3RhdGUoInRleHQiLCB4ID0gSW5mLCB5ID0gdGFyZ2V0X21vZGVyYXRlLCBsYWJlbCA9ICJNb2RlcmF0ZSIsIA0KICAjICAgICAgICAgaGp1c3QgPSAxLCB2anVzdCA9IC0wLjUwLCBjb2xvciA9ICJkYXJrYmx1ZSIsIHNpemUgPSA0KSArDQogIGFubm90YXRlKCJ0ZXh0IiwgeCA9IEluZiwgeSA9IHRhcmdldF9jb25zZXJ2YXRpdmUsIGxhYmVsID0gIiIsIA0KICAgICAgICAgICBoanVzdCA9IDEsIHZqdXN0ID0gLTAuNTAsIGNvbG9yID0gImRhcmtibHVlIiwgc2l6ZSA9IDQpICsNCiAgYW5ub3RhdGUoInRleHQiLCB4ID0gSW5mLCB5ID0gdGFyZ2V0X2luZmxhdGlvbiwgbGFiZWwgPSAiSW5mbGF0aW9uIiwgDQogICAgICAgICAgIGhqdXN0ID0gMSwgdmp1c3QgPSArMS4xMCwgY29sb3IgPSAiZGFya3JlZCIsIHNpemUgPSA0KSArDQogIGFubm90YXRlKCJ0ZXh0IiwgeCA9IEluZiwgeSA9IGNhZ3JfdmFsdWUsIGxhYmVsID0gIkNBR1IiLCANCiAgICAgICAgICAgaGp1c3QgPSAxLCB2anVzdCA9IC0wLjUwLCBjb2xvciA9ICJkYXJrcmVkIiwgc2l6ZSA9IDQpICsgDQoNCiAgbGFicygNCiAgICB0aXRsZSA9IGR5bmFtaWNfdGl0bGUsDQogICAgeCA9ICJZZWFyIiwNCiAgICB5ID0gIkdyb3d0aCBSYXRlICglKSIsDQogICAgY2FwdGlvbiA9IGR5bmFtaWNfY2FwdGlvbg0KICApICsNCg0KICBzY2FsZV94X2NvbnRpbnVvdXMoDQogICAgbGltaXRzID0gYyhzdGFydF95ZWFyLCBlbmRfeWVhciArIDEpLCAjIFJlc3RyaWN0cyB4LWF4aXMgZGF0YSANCiAgICBicmVha3MgPSBzZXEobGltaXRzX3N0YXJ0X3llYXIsIGxpbWl0c19lbmRfeWVhciwgNSkgIyBTZXRzIE1ham9yIHgtYXhpcyAgDQogICkgKyAgIyBSZXN0cmljdCAmIFNldCBNYWpvciB4LWF4aXMgbGluZXMgDQogICAgDQogIHRoZW1lX21pbmltYWwoKSArDQogIHRoZW1lKA0KICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUsIHNpemUgPSAyMCksICAgICAgICAgIyBMYXJnZXIgdGl0bGUgZm9udA0KICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQpLCAgICAgICAgICAgICAgICAgICAgIyBMYXJnZXIgeC1heGlzIGxhYmVsIGZvbnQNCiAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0KSwgICAgICAgICAgICAgICAgICAgICMgTGFyZ2VyIHktYXhpcyBsYWJlbCBmb250DQogICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxLCBzaXplID0gMTQpLCAgIyBMYXJnZXIgeC1heGlzIHRleHQNCiAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQpLCAgICAgICAgICAgICAgICAgICAgICMgTGFyZ2VyIHktYXhpcyB0ZXh0DQogICAgcGFuZWwuZ3JpZC5tYWpvciA9IGVsZW1lbnRfbGluZShsaW5ldHlwZSA9ICJkb3R0ZWQiLCBjb2xvciA9ICJibGFjayIpLCAgICAgICAgICMgTWFqb3IgZ3JpZCBsaW5lcw0KICAgIHBhbmVsLmdyaWQubWlub3IueCA9IGVsZW1lbnRfYmxhbmsoKSwgIyBlbGVtZW50X2xpbmUoY29sb3IgPSAiZ3JleTgwIikgICMgTWlub3IgeCBncmlkIGxpbmVzIGZvciBlYWNoIHllYXINCiAgICAjIHBhbmVsLmJvcmRlciA9IGVsZW1lbnRfcmVjdChjb2xvciA9ICJkYXJrZ3JleSIsIGZpbGwgPSBOQSwgc2l6ZSA9IDEuMCkgICMgRGFyayBib3JkZXIgYXJvdW5kIHRoZSBwbG90DQogICAgYXhpcy50aWNrcy5sZW5ndGggPSB1bml0KC0wLjI1LCAiY20iKSwgICAgICAgICAgICAgICAgICAgICAgIyBJbmNyZWFzZSB0aWNrIGxlbmd0aA0KICAgIGF4aXMudGlja3MgPSBlbGVtZW50X2xpbmUoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMC41MCksICMgRGFya2VyIHRpY2tzDQogICAgYXhpcy5saW5lLnggPSBlbGVtZW50X2xpbmUoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMC43NSksICAjIERhcmsgYm90dG9tIGJvcmRlcg0KICAgIGF4aXMubGluZS55ID0gZWxlbWVudF9saW5lKGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDAuNzUpICAgIyBEYXJrIGxlZnQgYm9yZGVyDQogICkNCg0KcHJpbnQocDEpDQoNCg0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiMjIFBMT1QgUkVTVFJJQ1RFRCBXSVRIIExJTUlUUw0KDQojIEZpbHRlciB0aGUgZGF0YSBmb3IgdGhlIHJlc3RyaWN0ZWQgeC1heGlzIHJhbmdlICgyMDA2LTIwMjQpDQpyZXN0cmljdGVkX2RhdGEgPC0gbnZkYV9yYXcgJT4lDQogIGZpbHRlcihhcy5pbnRlZ2VyKERhdGUpID49IDIwMDYgJiBhcy5pbnRlZ2VyKERhdGUpIDw9IDIwMjQpDQoNCiMgRGVmaW5lIHN0YXJ0IGFuZCBlbmQgeWVhcnMNCnN0YXJ0X3llYXIgPC0gMjAwNg0KZW5kX3llYXIgPC0gMjAyNA0KeWVhcl9yYW5nZSA8LSBlbmRfeWVhciAtIHN0YXJ0X3llYXIgKyAxICAjIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIHllYXJzDQoNCiMgRGVmaW5lIGJyZWFrcyByb3VuZGVkIGFwcHJvcHJpYXRlbHkNCmxpbWl0c19zdGFydF95ZWFyIDwtIGZsb29yKHN0YXJ0X3llYXIgLyA1KSAqIDUgICMgUm91bmQgZG93biB0byB0aGUgbmVhcmVzdCBtdWx0aXBsZSBvZiA1DQpsaW1pdHNfZW5kX3llYXIgPC0gY2VpbGluZyhlbmRfeWVhciAvIDUpICogNSAgICMgUm91bmQgdXAgdG8gdGhlIG5lYXJlc3QgbXVsdGlwbGUgb2YgNQ0KDQojIENyZWF0ZSBkeW5hbWljIHRpdGxlIGFuZCBjYXB0aW9uDQpkeW5hbWljX3RpdGxlIDwtIHBhc3RlMCgiQW5udWFsIEdyb3d0aCBSYXRlcyBPdmVyICIseWVhcl9yYW5nZSwgIiBZZWFycyAoIiwgc3RhcnRfeWVhciwgIi0iLCBlbmRfeWVhciwgIikiKQ0KZHluYW1pY19jYXB0aW9uIDwtIHBhc3RlMCgiTlZEQSBBbm51YWwgR3Jvd3RoIFJhdGVzLCBEYXRhIFBlcmlvZCAoIiwgbWluX3llYXIsICLigJMiLCBtYXhfeWVhciwgIikiKQ0KDQojIENhbGN1bGF0ZSBkeW5hbWljIHktYXhpcyBsaW1pdHMgZm9yIHRoZSByZXN0cmljdGVkIGRhdGENCnlfbWluIDwtIG1pbihyZXN0cmljdGVkX2RhdGEkYDEtWWVhciBDQUdSYCwgbmEucm0gPSBUUlVFKQ0KeV9tYXggPC0gbWF4KHJlc3RyaWN0ZWRfZGF0YSRgMS1ZZWFyIENBR1JgLCBuYS5ybSA9IFRSVUUpDQoNCiMgQ3JlYXRlIHRoZSBmdWxsLCBub24tZmlsdGVyZWQgeC1heGlzIHBsb3Qgd2l0aCBkeW5hbWljIHggcGxhY2VtZW50IGZvciBhbm5vdGF0aW9ucw0KcDMgPC0gZ2dwbG90KHJlc3RyaWN0ZWRfZGF0YSwgYWVzKHggPSBhcy5pbnRlZ2VyKERhdGUpLCB5ID0gYDEtWWVhciBDQUdSYCkpICsNCiAgDQogICMgQWRkIHNoYWRlZCBhcmVhcyBmb3IgYmFja2dyb3VuZCBlZmZlY3QNCiAgZ2VvbV9yZWN0KGFlcyh4bWluID0gLUluZiwgeG1heCA9IEluZiwgeW1pbiA9IHRhcmdldF9hZ2dyZXNzaXZlLCB5bWF4ID0gSW5mKSwgZmlsbCA9ICJsaWdodGdyZWVuIiwgYWxwaGEgPSAwLjAzMCkgKw0KICBnZW9tX3JlY3QoYWVzKHhtaW4gPSAtSW5mLCB4bWF4ID0gSW5mLCB5bWluID0gdGFyZ2V0X2NvbnNlcnZhdGl2ZSwgeW1heCA9IHRhcmdldF9hZ2dyZXNzaXZlKSwgZmlsbCA9ICJvcmFuZ2UiLCBhbHBoYSA9IDAuMDMwKSArDQogIGdlb21fcmVjdChhZXMoeG1pbiA9IC1JbmYsIHhtYXggPSBJbmYsIHltaW4gPSAtSW5mLCB5bWF4ID0gdGFyZ2V0X2NvbnNlcnZhdGl2ZSksIGZpbGwgPSAibGlnaHRjb3JhbCIsIGFscGhhID0gMC4wMzApICsNCiAgDQogICMgUGxvdCBsaW5lcywgcG9pbnRzLCBhbmQgYW5ub3RhdGlvbnMgb24gdG9wIG9mIHNoYWRlZCBhcmVhcw0KICBnZW9tX2xpbmUoY29sb3IgPSAiIzRCMDA4MiIsIHNpemUgPSAxLjApICsgICAgICAgIyBEYXJrIHB1cnBsZSBsaW5lIA0KICBnZW9tX3BvaW50KGNvbG9yID0gIiM0QjAwODIiLCBzaXplID0gMS41KSArICAgICAgICAjIERhcmsgcHVycGxlIHBvaW50cyANCiAgDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IHRhcmdldF9hZ2dyZXNzaXZlLCBjb2xvciA9ICJkYXJrYmx1ZSIsIGxpbmV0eXBlID0gInNvbGlkIikgKw0KICAjIGdlb21faGxpbmUoeWludGVyY2VwdCA9IHRhcmdldF9tb2RlcmF0ZSwgY29sb3IgPSAiZGFya2JsdWUiLCBsaW5ldHlwZSA9ICJzb2xpZCIpICsNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gdGFyZ2V0X2NvbnNlcnZhdGl2ZSwgY29sb3IgPSAiZGFya2JsdWUiLCBsaW5ldHlwZSA9ICJzb2xpZCIpICsNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gdGFyZ2V0X2luZmxhdGlvbiwgY29sb3IgPSAiZGFya3JlZCIsIGxpbmV0eXBlID0gImRhc2hlZCIpICsNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gY2Fncl92YWx1ZSwgY29sb3IgPSAiZGFya3JlZCIsIGxpbmV0eXBlID0gImRhc2hlZCIpICsNCiAgDQogICMgRHluYW1pYyByaWdodC1hbGlnbmVkIHBsYWNlbWVudCBmb3IgYW5ub3RhdGlvbnMNCiAgYW5ub3RhdGUoInRleHQiLCB4ID0gSW5mLCB5ID0gdGFyZ2V0X2FnZ3Jlc3NpdmUsIGxhYmVsID0gIkFnZ3Jlc3NpdmUvQ29uc2VydmF0aXZlIiwgDQogICAgICAgICAgIGhqdXN0ID0gMSwgdmp1c3QgPSAtMC41MCwgY29sb3IgPSAiZGFya2JsdWUiLCBzaXplID0gNCkgKw0KICAjIGFubm90YXRlKCJ0ZXh0IiwgeCA9IEluZiwgeSA9IHRhcmdldF9tb2RlcmF0ZSwgbGFiZWwgPSAiTW9kZXJhdGUiLCANCiAgIyAgICAgICAgIGhqdXN0ID0gMSwgdmp1c3QgPSAtMC41MCwgY29sb3IgPSAiZGFya2JsdWUiLCBzaXplID0gNCkgKw0KICBhbm5vdGF0ZSgidGV4dCIsIHggPSBJbmYsIHkgPSB0YXJnZXRfY29uc2VydmF0aXZlLCBsYWJlbCA9ICIiLCANCiAgICAgICAgICAgaGp1c3QgPSAxLCB2anVzdCA9IC0wLjUwLCBjb2xvciA9ICJkYXJrYmx1ZSIsIHNpemUgPSA0KSArDQogIGFubm90YXRlKCJ0ZXh0IiwgeCA9IEluZiwgeSA9IHRhcmdldF9pbmZsYXRpb24sIGxhYmVsID0gIkluZmxhdGlvbiIsIA0KICAgICAgICAgICBoanVzdCA9IDEsIHZqdXN0ID0gKzEuMTAsIGNvbG9yID0gImRhcmtyZWQiLCBzaXplID0gNCkgKw0KICBhbm5vdGF0ZSgidGV4dCIsIHggPSBJbmYsIHkgPSBjYWdyX3ZhbHVlLCBsYWJlbCA9ICJDQUdSIiwgDQogICAgICAgICAgIGhqdXN0ID0gMSwgdmp1c3QgPSAtMC41MCwgY29sb3IgPSAiZGFya3JlZCIsIHNpemUgPSA0KSArIA0KDQogIGxhYnMoDQogICAgdGl0bGUgPSBkeW5hbWljX3RpdGxlLA0KICAgIHggPSAiWWVhciIsDQogICAgeSA9ICJHcm93dGggUmF0ZSAoJSkiLA0KICAgIGNhcHRpb24gPSBkeW5hbWljX2NhcHRpb24NCiAgKSArDQogIA0KICBjb29yZF9jYXJ0ZXNpYW4oeWxpbSA9IGMoeV9taW4sIHlfbWF4KSkgKyAjIEFwcGx5IGR5bmFtaWMgeS1heGlzIGxpbWl0cw0KICBzY2FsZV94X2NvbnRpbnVvdXMoDQogICAgbGltaXRzID0gYyhzdGFydF95ZWFyLCBlbmRfeWVhciArIDEpLCANCiAgICBicmVha3MgPSBzZXEobGltaXRzX3N0YXJ0X3llYXIsIGxpbWl0c19lbmRfeWVhciwgNSkNCiAgKSArICAjIFJlc3RyaWN0ICYgU2V0IE1ham9yIHgtYXhpcyBsaW5lcyBmb3IgZWFjaCB5ZWFyDQoNCiAgdGhlbWVfbWluaW1hbCgpICsNCiAgdGhlbWUoDQogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSwgc2l6ZSA9IDIwKSwgICAgICAgICAjIExhcmdlciB0aXRsZSBmb250DQogICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCksICAgICAgICAgICAgICAgICAgICAjIExhcmdlciB4LWF4aXMgbGFiZWwgZm9udA0KICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQpLCAgICAgICAgICAgICAgICAgICAgIyBMYXJnZXIgeS1heGlzIGxhYmVsIGZvbnQNCiAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEsIHNpemUgPSAxNCksICAjIExhcmdlciB4LWF4aXMgdGV4dA0KICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCksICAgICAgICAgICAgICAgICAgICAgIyBMYXJnZXIgeS1heGlzIHRleHQNCiAgICBwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9saW5lKGxpbmV0eXBlID0gImRvdHRlZCIsIGNvbG9yID0gImJsYWNrIiksICAgICAgICAgIyBNYWpvciBncmlkIGxpbmVzDQogICAgcGFuZWwuZ3JpZC5taW5vci54ID0gZWxlbWVudF9ibGFuaygpLCAjIGVsZW1lbnRfbGluZShjb2xvciA9ICJncmV5ODAiKSAgIyBNaW5vciB4IGdyaWQgbGluZXMgZm9yIGVhY2ggeWVhcg0KICAgICMgcGFuZWwuYm9yZGVyID0gZWxlbWVudF9yZWN0KGNvbG9yID0gImRhcmtncmV5IiwgZmlsbCA9IE5BLCBzaXplID0gMS4wKSAgIyBEYXJrIGJvcmRlciBhcm91bmQgdGhlIHBsb3QNCiAgICBheGlzLnRpY2tzLmxlbmd0aCA9IHVuaXQoLTAuMjUsICJjbSIpLCAgICAgICAgICAgICAgICAgICAgICAjIEluY3JlYXNlIHRpY2sgbGVuZ3RoDQogICAgYXhpcy50aWNrcyA9IGVsZW1lbnRfbGluZShjb2xvciA9ICJibGFjayIsIHNpemUgPSAwLjUwKSwgIyBEYXJrZXIgdGlja3MNCiAgICBheGlzLmxpbmUueCA9IGVsZW1lbnRfbGluZShjb2xvciA9ICJibGFjayIsIHNpemUgPSAwLjc1KSwgICMgRGFyayBib3R0b20gYm9yZGVyDQogICAgYXhpcy5saW5lLnkgPSBlbGVtZW50X2xpbmUoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMC43NSkgICAjIERhcmsgbGVmdCBib3JkZXINCiAgKQ0KDQpwcmludChwMykNCg0KYGBgDQoNCg0KIyMgTlZEQSBDQUdSDQoNCiMjIyBEYXRhDQoNCmBgYHtyIG52ZGFfcmF3X2dyLCBldmFsPVRSVUUsIGVjaG89RkFMU0V9DQoNCiMgVmlldyhucnQkbnZkYV9yYXdfZ3IpDQppbnRlcmFjdGl2ZV9zdHIobnJ0JG52ZGFfcmF3X2dyKQ0KDQpsaWJyYXJ5KGRwbHlyKQ0KbGlicmFyeShsdWJyaWRhdGUpICAjIEZvciBkYXRlIG1hbmlwdWxhdGlvbg0KbGlicmFyeShzY2FsZXMpDQpsaWJyYXJ5KHN0cmluZ3IpDQoNCiMgVXBkYXRlIGRhdGEgZnJhbWUgd2l0aCBwcm9wZXIgZGF0ZSBhbmQgcGVyY2VudGFnZSBoYW5kbGluZw0KbnZkYV9yYXdfZ3IgPC0gbnJ0JG52ZGFfcmF3X2dyICU+JQ0KICBtdXRhdGUoDQogICAgIyBDb252ZXJ0IENsb3NlIERhdGUgdG8gIllZWVktTU0tREQiIGZvcm1hdA0KICAgIGBEYXRlYCA9IGZvcm1hdChhcy5EYXRlKGFzLmNoYXJhY3RlcihgRGF0ZWApLCBvcmlnaW4gPSAiMTk3MC0wMS0wMSIpLCAiJVktJW0tJWQiKSwNCiAgICANCiAgICAjIEVuc3VyZSBDbG9zZSBpcyBhIG51bWJlciBmb3JtYXR0ZWQgdG8gMiBkZWNpbWFsIHBsYWNlcw0KICAgIGBDbG9zZWAgPSBudW1iZXIoYXMubnVtZXJpYyhnc3ViKCIsIiwgIiIsIENsb3NlKSksIGJpZy5tYXJrID0gIiwiLCBkZWNpbWFsLm1hcmsgPSAiLiIsIGFjY3VyYWN5ID0gMC4wMSksDQoNCiAgICAjIENsZWFuIGFuZCBoYW5kbGUgcGVyY2VudGFnZSBjb2x1bW5zDQogICAgYWNyb3NzKDM6MTEsIH4gew0KICAgICAgdmFsdWUgPC0gZ3N1YigiWywlXFxzXSIsICIiLCAuKSAgIyBSZW1vdmUgJSwgY29tbWFzLCBhbmQgc3BhY2VzDQogICAgICBudW1lcmljX3ZhbHVlIDwtIHN1cHByZXNzV2FybmluZ3MoYXMubnVtZXJpYyh2YWx1ZSkpICAjIENvbnZlcnQgdG8gbnVtZXJpYw0KICAgICAgaWZlbHNlKA0KICAgICAgICAhaXMubmEobnVtZXJpY192YWx1ZSksIA0KICAgICAgICBwYXN0ZTAoZm9ybWF0KHJvdW5kKG51bWVyaWNfdmFsdWUqMTAwLCAyKSwgYmlnLm1hcmsgPSAiLCIsIHNjaWVudGlmaWMgPSBGQUxTRSksICIlIiksICAjIEZvcm1hdCB0byAyIGRlY2ltYWwgcGxhY2VzIGFuZCBhZGQgY29tbWFzDQogICAgICAgIC4NCiAgICAgICkNCiAgICB9KQ0KICApICU+JQ0KICBhcnJhbmdlKGRlc2MoYERhdGVgKSkgICMgU29ydCBieSBEYXRlIGZyb20gbmV3ZXN0IHRvIG9sZGVzdA0KDQojIENyZWF0ZSBudmRhX3Jhd19ncjogQ0dSDQpudmRhX3Jhd19jZ3IgPC0gbnZkYV9yYXdfZ3IgJT4lDQogIHNlbGVjdChgRGF0ZWAsIGBDbG9zZWAsIGAxLVllYXIgQ0FHUmAsIGNvbnRhaW5zICgiQ0dSIikpDQoNCiMgQ3JlYXRlIG52ZGFfcmF3X2dyOiBDQUdSDQpudmRhX3Jhd19jYWdyIDwtIG52ZGFfcmF3X2dyICU+JQ0KICBzZWxlY3QoYERhdGVgLCBgQ2xvc2VgLCBjb250YWlucyAoIkNBR1IiKSkNCg0KIyBEaXNwbGF5IGJvdGggdGFibGVzIGZvciBjb25maXJtYXRpb24NCmludGVyYWN0aXZlX3ByaW50KG52ZGFfcmF3X2NncikNCmludGVyYWN0aXZlX3ByaW50KG52ZGFfcmF3X2NhZ3IpDQoNCiMgT3B0aW9uYWw6IFByaW50IHRhYmxlIHN1bW1hcmllcw0KaW50ZXJhY3RpdmVfc3RyKG52ZGFfcmF3X2NncikNCmludGVyYWN0aXZlX3N0cihudmRhX3Jhd19jYWdyKQ0KDQojIERpc3BsYXkgY2FwdGlvbnMgZm9yIGVhY2ggdGFibGUNCiMgY2F0KCJcblxuIyMjIyBDdW11bGF0aXZlIEdyb3d0aCBSYXRlcyAoIiwgbWluX3llYXIsICItIiwgbWF4X3llYXIsICIpXG4iLCBzZXAgPSAiIikNCiMgZm9ybWF0X2VxdWFsX3dpZHRoKG52ZGFfcmF3X2NncikNCg0KY2F0KCJcblxuIyMjIyBDb21wb3VuZCBBdmVyYWdlIEdyb3d0aCBSYXRlcyAoIiwgbWluX3llYXIsICItIiwgbWF4X3llYXIsICIpXG4iLCBzZXAgPSAiIikNCmZvcm1hdF9lcXVhbF93aWR0aChudmRhX3Jhd19jYWdyKQ0KDQojIFZpZXcobnZkYV9yYXdfY2FncikNCiMgY29sbmFtZXMobnZkYV9yYXdfY2FncikNCmludGVyYWN0aXZlX3N0cihudmRhX3Jhd19jYWdyKQ0KDQoNCmBgYA0KDQojIyMgU3VtbWFyeQ0KDQpgYGB7ciBudmRhX3Jhd19jYWdyX3N1bW1hcnksIGV2YWw9VFJVRSwgZWNobz1GQUxTRX0NCg0KaW50ZXJhY3RpdmVfc3RyKG52ZGFfcmF3X2NhZ3IpDQoNCiMgTG9hZCBuZWNlc3NhcnkgbGlicmFyaWVzDQpsaWJyYXJ5KGRwbHlyKQ0KbGlicmFyeSh0aWJibGUpDQoNCiMgRGVmaW5lIGEgaGVscGVyIGZ1bmN0aW9uIHRvIGNsZWFuIGFuZCBjb252ZXJ0IHBlcmNlbnRhZ2VzDQpjbGVhbl9wZXJjZW50YWdlIDwtIGZ1bmN0aW9uKGNvbHVtbikgew0KICBhcy5udW1lcmljKGdzdWIoIiUiLCAiIiwgY29sdW1uKSkNCn0NCg0KIyBEZWZpbmUgdGhlIHN0YXRpc3RpYyBuYW1lcyBmb3IgdGhlIHN1bW1hcnkgdGFibGUNCnN0YXRpc3RpY19uYW1lcyA8LSBjKA0KICAiQ291bnQgb2YgT2JzZXJ2YXRpb25zIiwgDQogICJNZWFuIiwgDQogICJNZWRpYW4iLA0KICAiU3RhbmRhcmQgRGV2aWF0aW9uIChWb2xhdGlsaXR5KSIsIA0KICAiTWluIENBR1IgUmFuZ2UgKENBR1IgLSBTRCkiLA0KICAiTWF4IENBR1IgUmFuZ2UgKENBR1IgKyBTRCkiLA0KICAiTWluaW11bSIsIA0KICAiTWF4aW11bSIsIA0KICAiUGVyY2VudCBBYm92ZSBJbmZsYXRpb24gVGFyZ2V0IiwgDQogICJQZXJjZW50IEFib3ZlIENvbnNlcnZhdGl2ZSBUYXJnZXQiLCANCiAgIlBlcmNlbnQgQWJvdmUgTW9kZXJhdGUgVGFyZ2V0IiwgDQogICJQZXJjZW50IEFib3ZlIEFnZ3Jlc3NpdmUgVGFyZ2V0Ig0KKQ0KDQojIEFkanVzdCB0aGUgZmlyc3Qgcm93J3MgRGF0ZSBhbmQgY2xlYW4gdXAgQ0FHUiBjb2x1bW5zDQpudmRhX3Jhd19jYWdyIDwtIG52ZGFfcmF3X2NhZ3IgJT4lDQogIHNsaWNlKC0xKSAlPiUgIyBSZW1vdmUgdGhlIGZpcnN0IHJvdw0KICBtdXRhdGUoDQogICAgIyBEYXRlID0gaWZlbHNlKHJvd19udW1iZXIoKSA9PSAxLCAiMjAyNS0wMS0wMSIsIERhdGUpLA0KICAgIERhdGUgPSBhcy5udW1lcmljKGZvcm1hdChhcy5EYXRlKERhdGUpLCAiJVkiKSksDQogICAgYDEtWWVhciBDQUdSYCA9IGNsZWFuX3BlcmNlbnRhZ2UoYDEtWWVhciBDQUdSYCksDQogICAgYDUtWWVhciBDQUdSYCA9IGNsZWFuX3BlcmNlbnRhZ2UoYDUtWWVhciBDQUdSYCksDQogICAgYDEwLVllYXIgQ0FHUmAgPSBjbGVhbl9wZXJjZW50YWdlKGAxMC1ZZWFyIENBR1JgKSwNCiAgICBgMjAtWWVhciBDQUdSYCA9IGNsZWFuX3BlcmNlbnRhZ2UoYDIwLVllYXIgQ0FHUmApLA0KICAgIGAzMC1ZZWFyIENBR1JgID0gY2xlYW5fcGVyY2VudGFnZShgMzAtWWVhciBDQUdSYCkNCiAgKQ0KDQojIEZ1bmN0aW9uIHRvIGNhbGN1bGF0ZSBzdGF0aXN0aWNzIGZvciBhIGdpdmVuIGRhdGFzZXQNCmNhbGNfc3RhdHMgPC0gZnVuY3Rpb24oZGF0YSkgew0KICBpZiAoc3VtKCFpcy5uYShkYXRhKSkgPCAyKSByZXR1cm4ocmVwKE5BLCBsZW5ndGgoc3RhdGlzdGljX25hbWVzKSkpICAjIEhhbmRsZSBpbnN1ZmZpY2llbnQgZGF0YQ0KDQogIGNvdW50X29ic2VydmF0aW9ucyA8LSBzdW0oIWlzLm5hKGRhdGEpKQ0KICBtZWFuX3ZhbHVlIDwtIHJvdW5kKG1lYW4oZGF0YSwgbmEucm0gPSBUUlVFKSwgMikNCiAgbWVkaWFuX3ZhbHVlIDwtIHJvdW5kKG1lZGlhbihkYXRhLCBuYS5ybSA9IFRSVUUpLCAyKQ0KICBzZF92YWx1ZSA8LSByb3VuZChzZChkYXRhLCBuYS5ybSA9IFRSVUUpLCAyKQ0KICBtaW5fY2Fncl9yYW5nZSA8LSByb3VuZChjYWdyX3ZhbHVlIC0gc2RfdmFsdWUsIDIpDQogIG1heF9jYWdyX3JhbmdlIDwtIHJvdW5kKGNhZ3JfdmFsdWUgKyBzZF92YWx1ZSwgMikNCiAgbWluX3ZhbHVlIDwtIHJvdW5kKG1pbihkYXRhLCBuYS5ybSA9IFRSVUUpLCAyKQ0KICBtYXhfdmFsdWUgPC0gcm91bmQobWF4KGRhdGEsIG5hLnJtID0gVFJVRSksIDIpDQogIA0KICAjIERlZmluZSBpbmZsYXRpb24gYW5kIGdyb3d0aCB0YXJnZXRzDQogIHRhcmdldF9pbmZsYXRpb24gPC0gMiAgIyBFeGFtcGxlIHRhcmdldCBmb3IgaW5mbGF0aW9uDQogIHRhcmdldF9jb25zZXJ2YXRpdmUgPC0gMyArIHRhcmdldF9pbmZsYXRpb24NCiAgdGFyZ2V0X21vZGVyYXRlIDwtIDUgKyB0YXJnZXRfaW5mbGF0aW9uDQogIHRhcmdldF9hZ2dyZXNzaXZlIDwtIDEwICsgdGFyZ2V0X2luZmxhdGlvbg0KICANCiAgYWJvdmVfdGFyZ2V0X2luZmxhdGlvbiA8LSBzdW0oZGF0YSA+PSB0YXJnZXRfaW5mbGF0aW9uLCBuYS5ybSA9IFRSVUUpDQogIGFib3ZlX3RhcmdldF9jb25zZXJ2YXRpdmUgPC0gc3VtKGRhdGEgPj0gdGFyZ2V0X2NvbnNlcnZhdGl2ZSwgbmEucm0gPSBUUlVFKQ0KICBhYm92ZV90YXJnZXRfbW9kZXJhdGUgPC0gc3VtKGRhdGEgPj0gdGFyZ2V0X21vZGVyYXRlLCBuYS5ybSA9IFRSVUUpDQogIGFib3ZlX3RhcmdldF9hZ2dyZXNzaXZlIDwtIHN1bShkYXRhID49IHRhcmdldF9hZ2dyZXNzaXZlLCBuYS5ybSA9IFRSVUUpDQogIA0KICBwZXJjZW50X2Fib3ZlX3RhcmdldF9jb25zZXJ2YXRpdmUgPC0gcm91bmQoKGFib3ZlX3RhcmdldF9jb25zZXJ2YXRpdmUgLyBjb3VudF9vYnNlcnZhdGlvbnMpICogMTAwLCAyKQ0KICBwZXJjZW50X2Fib3ZlX3RhcmdldF9pbmZsYXRpb24gPC0gcm91bmQoKGFib3ZlX3RhcmdldF9pbmZsYXRpb24gLyBjb3VudF9vYnNlcnZhdGlvbnMpICogMTAwLCAyKQ0KICBwZXJjZW50X2Fib3ZlX3RhcmdldF9tb2RlcmF0ZSA8LSByb3VuZCgoYWJvdmVfdGFyZ2V0X21vZGVyYXRlIC8gY291bnRfb2JzZXJ2YXRpb25zKSAqIDEwMCwgMikNCiAgcGVyY2VudF9hYm92ZV90YXJnZXRfYWdncmVzc2l2ZSA8LSByb3VuZCgoYWJvdmVfdGFyZ2V0X2FnZ3Jlc3NpdmUgLyBjb3VudF9vYnNlcnZhdGlvbnMpICogMTAwLCAyKQ0KICANCiAgYygNCiAgICBjb3VudF9vYnNlcnZhdGlvbnMsIA0KICAgIHBhc3RlMChtZWFuX3ZhbHVlLCAiJSIpLA0KICAgIHBhc3RlMChtZWRpYW5fdmFsdWUsICIlIiksDQogICAgcGFzdGUwKHNkX3ZhbHVlLCAiJSIpLA0KICAgIHBhc3RlMChtaW5fY2Fncl9yYW5nZSwgIiUiKSwNCiAgICBwYXN0ZTAobWF4X2NhZ3JfcmFuZ2UsICIlIiksDQogICAgcGFzdGUwKG1pbl92YWx1ZSwgIiUiKSwNCiAgICBwYXN0ZTAobWF4X3ZhbHVlLCAiJSIpLA0KICAgIHBhc3RlMChwZXJjZW50X2Fib3ZlX3RhcmdldF9pbmZsYXRpb24sICIlIiksDQogICAgcGFzdGUwKHBlcmNlbnRfYWJvdmVfdGFyZ2V0X2NvbnNlcnZhdGl2ZSwgIiUiKSwgDQogICAgcGFzdGUwKHBlcmNlbnRfYWJvdmVfdGFyZ2V0X21vZGVyYXRlLCAiJSIpLCANCiAgICBwYXN0ZTAocGVyY2VudF9hYm92ZV90YXJnZXRfYWdncmVzc2l2ZSwgIiUiKQ0KICApDQp9DQoNCiMgQ29sdW1ucyB0byBjYWxjdWxhdGUgQ0FHUiBzdGF0aXN0aWNzDQpjYWdyX2NvbHVtbnMgPC0gYygiMS1ZZWFyIENBR1IiLCAiNS1ZZWFyIENBR1IiLCAiMTAtWWVhciBDQUdSIiwgIjIwLVllYXIgQ0FHUiIsICIzMC1ZZWFyIENBR1IiKQ0KZXhpc3RpbmdfY2Fncl9jb2x1bW5zIDwtIGludGVyc2VjdChjYWdyX2NvbHVtbnMsIG5hbWVzKG52ZGFfcmF3X2NhZ3IpKQ0KDQojIENhbGN1bGF0ZSBzdGF0cyBmb3IgZWFjaCBDQUdSIGNvbHVtbg0KY2Fncl9zdGF0c19saXN0IDwtIGxhcHBseShudmRhX3Jhd19jYWdyW2V4aXN0aW5nX2NhZ3JfY29sdW1uc10sIGNhbGNfc3RhdHMpDQoNCiMgQ29tcGlsZSBpbnRvIGEgc3VtbWFyeSBkYXRhIGZyYW1lDQpudmRhX3Jhd19jYWdyX3N1bW1hcnkgPC0gYXMuZGF0YS5mcmFtZShkby5jYWxsKGNiaW5kLCBjYWdyX3N0YXRzX2xpc3QpKQ0Kcm93bmFtZXMobnZkYV9yYXdfY2Fncl9zdW1tYXJ5KSA8LSBzdGF0aXN0aWNfbmFtZXMNCg0KDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KIyMgU0FWRSBWQUxVRVMgRk9SIElOLUxJTkUgQ09ERQ0KDQojIERlZmluZSB0aGUgbWFwcGluZyBvZiByb3cgbmFtZXMgdG8gdmFyaWFibGUgbmFtZXMNCnJvd190b192YXJfbmFtZSA8LSBjKA0KICAiQ291bnQgb2YgT2JzZXJ2YXRpb25zIiA9ICJjb3VudF9vYnNlcnZhdGlvbnMiLA0KICAiTWVhbiIgPSAibWVhbl92YWx1ZSIsDQogICJNZWRpYW4iID0gIm1lZGlhbl92YWx1ZSIsDQogICJTdGFuZGFyZCBEZXZpYXRpb24gKFZvbGF0aWxpdHkpIiA9ICJzZF92YWx1ZSIsDQogICJNaW4gQ0FHUiBSYW5nZSAoQ0FHUiAtIFNEKSIgPSAibWluX2NhZ3JfcmFuZ2UiLA0KICAiTWF4IENBR1IgUmFuZ2UgKENBR1IgKyBTRCkiID0gIm1heF9jYWdyX3JhbmdlIiwNCiAgIk1pbmltdW0iID0gIm1pbl92YWx1ZSIsDQogICJNYXhpbXVtIiA9ICJtYXhfdmFsdWUiLA0KICAiUGVyY2VudCBBYm92ZSBJbmZsYXRpb24gVGFyZ2V0IiA9ICJwZXJjZW50X2Fib3ZlX3RhcmdldF9pbmZsYXRpb24iLA0KICAiUGVyY2VudCBBYm92ZSBDb25zZXJ2YXRpdmUgVGFyZ2V0IiA9ICJwZXJjZW50X2Fib3ZlX3RhcmdldF9jb25zZXJ2YXRpdmUiLA0KICAiUGVyY2VudCBBYm92ZSBNb2RlcmF0ZSBUYXJnZXQiID0gInBlcmNlbnRfYWJvdmVfdGFyZ2V0X21vZGVyYXRlIiwNCiAgIlBlcmNlbnQgQWJvdmUgQWdncmVzc2l2ZSBUYXJnZXQiID0gInBlcmNlbnRfYWJvdmVfdGFyZ2V0X2FnZ3Jlc3NpdmUiDQopDQoNCiMgRnVuY3Rpb24gdG8gc2F2ZSBzdW1tYXJ5IHZhbHVlcyBkeW5hbWljYWxseQ0Kc2F2ZV9jb2x1bW5fdmFsdWVzIDwtIGZ1bmN0aW9uKHN1bW1hcnlfZGYpIHsNCiAgIyBFeGNsdWRlIHRoZSAiU3RhdGlzdGljIiBhbmQgIk92ZXJhbGwiIGNvbHVtbnMNCiAgY29sdW1uc190b19zYXZlIDwtIHNldGRpZmYobmFtZXMoc3VtbWFyeV9kZiksIGMoIlN0YXRpc3RpYyIsICJPdmVyYWxsIikpDQogIA0KICAjIEl0ZXJhdGUgb3ZlciBlYWNoIGNvbHVtbg0KICBmb3IgKGNvbCBpbiBjb2x1bW5zX3RvX3NhdmUpIHsNCiAgICAjIEZvcm1hdCBjb2x1bW4gbmFtZSB0byBsb3dlcmNhc2UgYW5kIHJlcGxhY2UgaW52YWxpZCBjaGFyYWN0ZXJzDQogICAgY29sX25hbWUgPC0gdG9sb3dlcihnc3ViKCJbXmEtekEtWjAtOV0iLCAiXyIsIGNvbCkpDQogICAgDQogICAgIyBFeHRyYWN0IHZhbHVlcyBmb3IgdGhlIGN1cnJlbnQgY29sdW1uDQogICAgY29sX3ZhbHVlcyA8LSBzdW1tYXJ5X2RmW1tjb2xdXQ0KICAgIA0KICAgICMgU2F2ZSBlYWNoIHZhbHVlIGR5bmFtaWNhbGx5IHVzaW5nIHRoZSBtYXBwaW5nIGZvciByb3cgbmFtZXMNCiAgICBmb3IgKGkgaW4gc2VxX2Fsb25nKGNvbF92YWx1ZXMpKSB7DQogICAgICAjIEdldCB0aGUgY29ycmVzcG9uZGluZyB2YXJpYWJsZSBuYW1lIGZyb20gdGhlIG1hcHBpbmcNCiAgICAgIHN0YXRfbmFtZSA8LSByb3dfdG9fdmFyX25hbWVbcm93bmFtZXMoc3VtbWFyeV9kZilbaV1dDQogICAgICANCiAgICAgIGlmICghaXMubmEoc3RhdF9uYW1lKSkgeyAgIyBTa2lwIGlmIG5vIG1hcHBpbmcgaXMgZGVmaW5lZA0KICAgICAgICAjIENyZWF0ZSB0aGUgdmFyaWFibGUgbmFtZQ0KICAgICAgICB2YXJfbmFtZSA8LSBwYXN0ZTAoc3RhdF9uYW1lLCAiXyIsIGNvbF9uYW1lKQ0KICAgICAgICANCiAgICAgICAgIyBBdHRlbXB0IG51bWVyaWMgY29udmVyc2lvbiBmb3IgZG93bnN0cmVhbSB1c2UNCiAgICAgICAgdmFsdWUgPC0gc3VwcHJlc3NXYXJuaW5ncyhhcy5udW1lcmljKGdzdWIoIiUiLCAiIiwgY29sX3ZhbHVlc1tpXSkpKQ0KICAgICAgICANCiAgICAgICAgIyBBc3NpZ24gdGhlIHZhbHVlIHRvIHRoZSBnbG9iYWwgZW52aXJvbm1lbnQNCiAgICAgICAgYXNzaWduKHZhcl9uYW1lLCB2YWx1ZSwgZW52aXIgPSAuR2xvYmFsRW52KQ0KICAgICAgfQ0KICAgIH0NCiAgfQ0KfQ0KDQojIEFwcGx5IHRoZSBmdW5jdGlvbiB0byBzYXZlIHZhbHVlcyBmb3IgYWxsIGNvbHVtbnMgZXhjZXB0ICJPdmVyYWxsIg0Kc2F2ZV9jb2x1bW5fdmFsdWVzKG52ZGFfcmF3X2NhZ3Jfc3VtbWFyeSkNCg0KIyBFeGFtcGxlOiBBY2Nlc3NpbmcgZHluYW1pY2FsbHkgY3JlYXRlZCB2YXJpYWJsZXMNCmludGVyYWN0aXZlX3ByaW50KG1lYW5fdmFsdWVfMV95ZWFyX2NhZ3IpICAjIFNob3VsZCBwcmludCB0aGUgbWVhbiB2YWx1ZSBmb3IgMS1ZZWFyIENBR1INCmludGVyYWN0aXZlX3ByaW50KHBlcmNlbnRfYWJvdmVfdGFyZ2V0X2luZmxhdGlvbl81X3llYXJfY2FncikgICMgU2hvdWxkIHByaW50IHRoZSBwZXJjZW50IGFib3ZlIGluZmxhdGlvbiB0YXJnZXQgZm9yIDUtWWVhciBDQUdSDQppbnRlcmFjdGl2ZV9wcmludChzZF92YWx1ZV8xMF95ZWFyX2NhZ3IpICAjIFNob3VsZCBwcmludCB0aGUgc3RhbmRhcmQgZGV2aWF0aW9uIGZvciAxMC1ZZWFyIENBR1INCg0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiMjIE9WRVJBTEwgU1RBVElTVElDUyANCm51bWVyaWNfdmFsdWVzX2FsbCA8LSBhcy5udW1lcmljKHVubGlzdChudmRhX3Jhd19jYWdyW2V4aXN0aW5nX2NhZ3JfY29sdW1uc10sIHVzZS5uYW1lcyA9IEZBTFNFKSkNCm51bWVyaWNfdmFsdWVzX2FsbCA8LSBudW1lcmljX3ZhbHVlc19hbGxbIWlzLm5hKG51bWVyaWNfdmFsdWVzX2FsbCldDQoNCm92ZXJhbGxfY291bnRfb2JzZXJ2YXRpb25zIDwtIGxlbmd0aChudW1lcmljX3ZhbHVlc19hbGwpDQpvdmVyYWxsX21lYW5fdmFsdWUgPC0gcm91bmQobWVhbihudW1lcmljX3ZhbHVlc19hbGwpLCAyKQ0Kb3ZlcmFsbF9tZWRpYW5fdmFsdWUgPC0gcm91bmQobWVkaWFuKG51bWVyaWNfdmFsdWVzX2FsbCksIDIpDQpvdmVyYWxsX3NkX3ZhbHVlIDwtIHJvdW5kKHNkKG51bWVyaWNfdmFsdWVzX2FsbCksIDIpDQpvdmVyYWxsX21pbl9jYWdyX3JhbmdlIDwtIHJvdW5kKGNhZ3JfdmFsdWUgLSBvdmVyYWxsX3NkX3ZhbHVlLCAyKQ0Kb3ZlcmFsbF9tYXhfY2Fncl9yYW5nZSA8LSByb3VuZChjYWdyX3ZhbHVlICsgb3ZlcmFsbF9zZF92YWx1ZSwgMikNCm92ZXJhbGxfbWluX3ZhbHVlIDwtIHJvdW5kKG1pbihudW1lcmljX3ZhbHVlc19hbGwpLCAyKQ0Kb3ZlcmFsbF9tYXhfdmFsdWUgPC0gcm91bmQobWF4KG51bWVyaWNfdmFsdWVzX2FsbCksIDIpDQoNCm92ZXJhbGxfYWJvdmVfdGFyZ2V0X2luZmxhdGlvbiA8LSBzdW0obnVtZXJpY192YWx1ZXNfYWxsID49IHRhcmdldF9pbmZsYXRpb24sIG5hLnJtID0gVFJVRSkNCm92ZXJhbGxfYWJvdmVfdGFyZ2V0X2NvbnNlcnZhdGl2ZSA8LSBzdW0obnVtZXJpY192YWx1ZXNfYWxsID49IHRhcmdldF9jb25zZXJ2YXRpdmUsIG5hLnJtID0gVFJVRSkNCm92ZXJhbGxfYWJvdmVfdGFyZ2V0X21vZGVyYXRlIDwtIHN1bShudW1lcmljX3ZhbHVlc19hbGwgPj0gdGFyZ2V0X21vZGVyYXRlLCBuYS5ybSA9IFRSVUUpDQpvdmVyYWxsX2Fib3ZlX3RhcmdldF9hZ2dyZXNzaXZlIDwtIHN1bShudW1lcmljX3ZhbHVlc19hbGwgPj0gdGFyZ2V0X2FnZ3Jlc3NpdmUsIG5hLnJtID0gVFJVRSkNCg0Kb3ZlcmFsbF9wZXJjZW50X2Fib3ZlX3RhcmdldF9jb25zZXJ2YXRpdmUgPC0gcm91bmQoKG92ZXJhbGxfYWJvdmVfdGFyZ2V0X2NvbnNlcnZhdGl2ZSAvIG92ZXJhbGxfY291bnRfb2JzZXJ2YXRpb25zKSAqIDEwMCwgMikNCm92ZXJhbGxfcGVyY2VudF9hYm92ZV90YXJnZXRfaW5mbGF0aW9uIDwtIHJvdW5kKChvdmVyYWxsX2Fib3ZlX3RhcmdldF9pbmZsYXRpb24gLyBvdmVyYWxsX2NvdW50X29ic2VydmF0aW9ucykgKiAxMDAsIDIpDQpvdmVyYWxsX3BlcmNlbnRfYWJvdmVfdGFyZ2V0X21vZGVyYXRlIDwtIHJvdW5kKChvdmVyYWxsX2Fib3ZlX3RhcmdldF9tb2RlcmF0ZSAvIG92ZXJhbGxfY291bnRfb2JzZXJ2YXRpb25zKSAqIDEwMCwgMikNCm92ZXJhbGxfcGVyY2VudF9hYm92ZV90YXJnZXRfYWdncmVzc2l2ZSA8LSByb3VuZCgob3ZlcmFsbF9hYm92ZV90YXJnZXRfYWdncmVzc2l2ZSAvIG92ZXJhbGxfY291bnRfb2JzZXJ2YXRpb25zKSAqIDEwMCwgMikNCg0KbnZkYV9yYXdfY2Fncl9zdW1tYXJ5JE92ZXJhbGwgPC0gYygNCiAgb3ZlcmFsbF9jb3VudF9vYnNlcnZhdGlvbnMsDQogIHBhc3RlMChvdmVyYWxsX21lYW5fdmFsdWUsICIlIiksDQogIHBhc3RlMChvdmVyYWxsX21lZGlhbl92YWx1ZSwgIiUiKSwNCiAgcGFzdGUwKG92ZXJhbGxfc2RfdmFsdWUsICIlIiksDQogIHBhc3RlMChvdmVyYWxsX21pbl9jYWdyX3JhbmdlLCAiJSIpLA0KICBwYXN0ZTAob3ZlcmFsbF9tYXhfY2Fncl9yYW5nZSwgIiUiKSwNCiAgcGFzdGUwKG92ZXJhbGxfbWluX3ZhbHVlLCAiJSIpLA0KICBwYXN0ZTAob3ZlcmFsbF9tYXhfdmFsdWUsICIlIiksDQogIHBhc3RlMChvdmVyYWxsX3BlcmNlbnRfYWJvdmVfdGFyZ2V0X2luZmxhdGlvbiwgIiUiKSwNCiAgcGFzdGUwKG92ZXJhbGxfcGVyY2VudF9hYm92ZV90YXJnZXRfY29uc2VydmF0aXZlLCAiJSIpLA0KICBwYXN0ZTAob3ZlcmFsbF9wZXJjZW50X2Fib3ZlX3RhcmdldF9tb2RlcmF0ZSwgIiUiKSwNCiAgcGFzdGUwKG92ZXJhbGxfcGVyY2VudF9hYm92ZV90YXJnZXRfYWdncmVzc2l2ZSwgIiUiKQ0KKQ0KDQojIENvbnZlcnQgcm93IG5hbWVzIHRvIGEgY29sdW1uDQpudmRhX3Jhd19jYWdyX3N1bW1hcnkgPC0gdGliYmxlOjpyb3duYW1lc190b19jb2x1bW4obnZkYV9yYXdfY2Fncl9zdW1tYXJ5LCB2YXIgPSAiU3RhdGlzdGljIikNCg0KIyBFbnN1cmUgYWxsIGNvbHVtbnMgYXJlIGNoYXJhY3Rlcg0KbnZkYV9yYXdfY2Fncl9zdW1tYXJ5IDwtIG52ZGFfcmF3X2NhZ3Jfc3VtbWFyeSAlPiUNCiAgbXV0YXRlKGFjcm9zcyhldmVyeXRoaW5nKCksIGFzLmNoYXJhY3RlcikpDQoNCiMgRGlzcGxheSB0aGUgc3VtbWFyeSB0YWJsZQ0KY2F0KCJcbiMjIyMgQ29tcG91bmQgQXZlcmFnZSBHcm93dGggUmF0ZXMgKCIsIG1pbl95ZWFyLCAiLSIsIG1heF95ZWFyLCAiKVxuIiwgc2VwID0gIiIpDQppbnRlcmFjdGl2ZV9zdHIobnZkYV9yYXdfY2Fncl9zdW1tYXJ5KQ0KZm9ybWF0X3Vuc3BlY2lmaWVkX3dpZHRoKG52ZGFfcmF3X2NhZ3Jfc3VtbWFyeSkNCg0KYGBgDQoNCioqYHIgbWluX3llYXJgLWByIG1heF95ZWFyYCBTdW1tYXJ5OioqIFRoZSAxLVllYXIgQ0FHUiBleGhpYml0cyB0aGUgYHIgaWYobWVhbl92YWx1ZV8xX3llYXJfY2FnciA9PSBtYXgoYyhtZWFuX3ZhbHVlXzFfeWVhcl9jYWdyLCBtZWFuX3ZhbHVlXzVfeWVhcl9jYWdyLCBtZWFuX3ZhbHVlXzEwX3llYXJfY2FnciwgbWVhbl92YWx1ZV8yMF95ZWFyX2NhZ3IpKSkgImhpZ2hlc3QgbWVhbiByZXR1cm4iIGVsc2UgaWYobWVhbl92YWx1ZV8xX3llYXJfY2FnciA9PSBtaW4oYyhtZWFuX3ZhbHVlXzFfeWVhcl9jYWdyLCBtZWFuX3ZhbHVlXzVfeWVhcl9jYWdyLCBtZWFuX3ZhbHVlXzEwX3llYXJfY2FnciwgbWVhbl92YWx1ZV8yMF95ZWFyX2NhZ3IpKSkgImxvd2VzdCBtZWFuIHJldHVybiIgZWxzZSAibWVhbiByZXR1cm4iYCBhdCBgciBtZWFuX3ZhbHVlXzFfeWVhcl9jYWdyYCUsIGFuZCBgciBpZihzZF92YWx1ZV8xX3llYXJfY2FnciA9PSBtYXgoYyhzZF92YWx1ZV8xX3llYXJfY2Fnciwgc2RfdmFsdWVfNV95ZWFyX2NhZ3IsIHNkX3ZhbHVlXzEwX3llYXJfY2Fnciwgc2RfdmFsdWVfMjBfeWVhcl9jYWdyKSkpICJ0aGUgZ3JlYXRlc3Qgdm9sYXRpbGl0eSB3aXRoIGEiIGVsc2UgaWYoc2RfdmFsdWVfMV95ZWFyX2NhZ3IgPT0gbWluKGMoc2RfdmFsdWVfMV95ZWFyX2NhZ3IsIHNkX3ZhbHVlXzVfeWVhcl9jYWdyLCBzZF92YWx1ZV8xMF95ZWFyX2NhZ3IsIHNkX3ZhbHVlXzIwX3llYXJfY2FncikpKSAidGhlIGxlYXN0IHZvbGF0aWxpdHkgd2l0aCBhIiBlbHNlICJhImAgc3RhbmRhcmQgZGV2aWF0aW9uIG9mIGByIHNkX3ZhbHVlXzFfeWVhcl9jYWdyYCUuIEFzIHRoZSBpbnZlc3RtZW50IGhvcml6b24gZXh0ZW5kcyB0byA1LCAxMCwgYW5kIDIwIHllYXJzLCB0aGUgbWVhbiByZXR1cm5zIGByIGlmKG1lYW5fdmFsdWVfMV95ZWFyX2NhZ3IgPCBtZWFuKGMobWVhbl92YWx1ZV81X3llYXJfY2FnciwgbWVhbl92YWx1ZV8xMF95ZWFyX2NhZ3IsIG1lYW5fdmFsdWVfMjBfeWVhcl9jYWdyKSkpICJpbmNyZWFzZSIgZWxzZSAiZGVjcmVhc2UiYCwgcmFuZ2luZyBmcm9tIGByIG1lYW5fdmFsdWVfNV95ZWFyX2NhZ3JgJSB0byBgciBtZWFuX3ZhbHVlXzIwX3llYXJfY2FncmAlLCB3aGlsZSB2b2xhdGlsaXR5IGByIGlmKHNkX3ZhbHVlXzFfeWVhcl9jYWdyIDwgbWVhbihjKHNkX3ZhbHVlXzVfeWVhcl9jYWdyLCBzZF92YWx1ZV8xMF95ZWFyX2NhZ3IsIHNkX3ZhbHVlXzIwX3llYXJfY2FncikpKSAicmlzZXMiIGVsc2UgImRpbWluaXNoZXMiYCwgd2l0aCBzdGFuZGFyZCBkZXZpYXRpb25zIGByIGlmKHNkX3ZhbHVlXzFfeWVhcl9jYWdyID4gc2RfdmFsdWVfMjBfeWVhcl9jYWdyKSAiZHJvcHBpbmciIGVsc2UgInJpc2luZyJgIGZyb20gYHIgc2RfdmFsdWVfNV95ZWFyX2NhZ3JgJSB0byBgciBzZF92YWx1ZV8yMF95ZWFyX2NhZ3JgJS4gVGhpcyB0cmVuZCBpbmRpY2F0ZXMgdGhhdCBsb25nZXIgaW52ZXN0bWVudCBwZXJpb2RzIHRlbmQgdG8gb2ZmZXIgYHIgaWYoc2RfdmFsdWVfMV95ZWFyX2NhZ3IgPiBzZF92YWx1ZV8yMF95ZWFyX2NhZ3IpICJtb3JlIHN0YWJsZSIgZWxzZSAibGVzcyBzdGFibGUiYCByZXR1cm5zLiBGdXJ0aGVybW9yZSwgdGhlIHBlcmNlbnRhZ2Ugb2YgcGVyaW9kcyBleGNlZWRpbmcgdGhlIGluZmxhdGlvbiB0YXJnZXQgYHIgaWYocGVyY2VudF9hYm92ZV90YXJnZXRfaW5mbGF0aW9uXzFfeWVhcl9jYWdyIDwgcGVyY2VudF9hYm92ZV90YXJnZXRfaW5mbGF0aW9uXzIwX3llYXJfY2FncikgImluY3JlYXNlcyIgZWxzZSAiZGVjcmVhc2VzImAgd2l0aCBsb25nZXIgZHVyYXRpb25zLCBmcm9tIGByIHBlcmNlbnRfYWJvdmVfdGFyZ2V0X2luZmxhdGlvbl8xX3llYXJfY2FncmAlIGluIHRoZSAxLVllYXIgQ0FHUiB0byBgciBwZXJjZW50X2Fib3ZlX3RhcmdldF9pbmZsYXRpb25fMjBfeWVhcl9jYWdyYCUgaW4gdGhlIDIwLVllYXIgQ0FHUiwgdW5kZXJzY29yaW5nIE5WREEncyBgciBpZihwZXJjZW50X2Fib3ZlX3RhcmdldF9pbmZsYXRpb25fMV95ZWFyX2NhZ3IgPCBwZXJjZW50X2Fib3ZlX3RhcmdldF9pbmZsYXRpb25fMjBfeWVhcl9jYWdyKSAiZWZmZWN0aXZlbmVzcyIgZWxzZSAiaW5lZmZlY3RpdmVuZXNzImAgYXMgYSBoZWRnZSBhZ2FpbnN0IGluZmxhdGlvbiBvdmVyIGV4dGVuZGVkIHRpbWVmcmFtZXMuIFdpdGggYW4gb3ZlcmFsbCBwZXJjZW50YWdlIG9mIGByIG92ZXJhbGxfcGVyY2VudF9hYm92ZV90YXJnZXRfYWdncmVzc2l2ZWAlIGV4Y2VlZGluZyB0aGUgYWdncmVzc2l2ZSB0YXJnZXQgKGByIHRhcmdldF9hZ2dyZXNzaXZlYCUgYW5udWFsaXplZCByZXR1cm5zIHdpdGggYHIgdGFyZ2V0X2luZmxhdGlvbmAlIGluZmxhdGlvbiksIE5WREEgYHIgaWYob3ZlcmFsbF9wZXJjZW50X2Fib3ZlX3RhcmdldF9hZ2dyZXNzaXZlID4gNTApICJoYXMsIG92ZXIgdGhpcyB0aW1lIHBlcmlvZCwgcHJvdmVuIHRvIGJlIGEgc3Ryb25nIiBlbHNlIGlmKG92ZXJhbGxfcGVyY2VudF9hYm92ZV90YXJnZXRfYWdncmVzc2l2ZSA+IDQwKSAiaGFzLCBvdmVyIHRoaXMgdGltZSBwZXJpb2QsIGRlbW9uc3RyYXRlZCBpdHNlbGYgYXMgYSB2aWFibGUiIGVsc2UgImFwcGVhcnMsIG92ZXIgdGhpcyB0aW1lIHBlcmlvZCwgdG8gYmUgYSBsZXNzIHN1aXRhYmxlImAgb3B0aW9uIGZvciBhIGhpZ2gtcmV0dXJuaW5nIGxvbmctdGVybSBpbnZlc3RtZW50Lg0KDQojIyMgR3JhcGgNCg0KIyMjIyBBbGwgUGVyaW9kcw0KDQoNCmBgYHtyIG52ZGFfcmF3X2NhZ3JfZ3JhcGhzX2FsbCwgZmlnLndpZHRoPTEwLCBmaWcuaGVpZ2h0PTcsIGV2YWw9VFJVRSwgZWNobz1GQUxTRX0NCg0KY2F0KCJcblxuIyMjIyBDb21wb3VuZCBBdmVyYWdlIEdyb3d0aCBSYXRlcyBBY3Jvc3MgUGVyaW9kcyBcbiIpDQoNCiMgTG9hZCBuZWNlc3NhcnkgbGlicmFyaWVzDQpsaWJyYXJ5KGdncGxvdDIpDQpsaWJyYXJ5KGRwbHlyKQ0KDQoNCiMgQ29udmVydCBjb2x1bW5zIHRvIG51bWVyaWMgZm9yIHBsb3R0aW5nIGlmIG5lZWRlZA0KbnZkYV9yYXdfY2FnciA8LSBudmRhX3Jhd19jYWdyICU+JQ0KICBtdXRhdGUoDQogICAgYERhdGVgID0gYXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIoYERhdGVgKSksICAjIEVuc3VyZSBEYXRlIGlzIG51bWVyaWMNCiAgICBgMS1ZZWFyIENBR1JgID0gYXMubnVtZXJpYyhnc3ViKCIlIiwgIiIsIGAxLVllYXIgQ0FHUmApKSwNCiAgICBgNS1ZZWFyIENBR1JgID0gYXMubnVtZXJpYyhnc3ViKCIlIiwgIiIsIGA1LVllYXIgQ0FHUmApKSwNCiAgICBgMTAtWWVhciBDQUdSYCA9IGFzLm51bWVyaWMoZ3N1YigiJSIsICIiLCBgMTAtWWVhciBDQUdSYCkpLA0KICAgIGAyMC1ZZWFyIENBR1JgID0gYXMubnVtZXJpYyhnc3ViKCIlIiwgIiIsIGAyMC1ZZWFyIENBR1JgKSksDQogICAgYDMwLVllYXIgQ0FHUmAgPSBhcy5udW1lcmljKGdzdWIoIiUiLCAiIiwgYDMwLVllYXIgQ0FHUmApKQ0KICApDQoNCiMgUmVzaGFwZSB0aGUgZGF0YSBpbnRvIGxvbmcgZm9ybWF0IGZvciBlYXN5IHBsb3R0aW5nIG9mIG11bHRpcGxlIGxpbmVzIGFuZCBzZXQgdGhlIGZhY3RvciBvcmRlcg0KbnJ0X2xvbmcgPC0gbnZkYV9yYXdfY2FnciAlPiUNCiAgcGl2b3RfbG9uZ2VyKGNvbHMgPSBjKGAxLVllYXIgQ0FHUmAsIGA1LVllYXIgQ0FHUmAsIGAxMC1ZZWFyIENBR1JgLCBgMjAtWWVhciBDQUdSYCwgYDMwLVllYXIgQ0FHUmApLA0KICAgICAgICAgICAgICAgbmFtZXNfdG8gPSAiQ0FHUl9QZXJpb2QiLA0KICAgICAgICAgICAgICAgdmFsdWVzX3RvID0gIkNBR1JfVmFsdWUiKSAlPiUNCiAgbXV0YXRlKENBR1JfUGVyaW9kID0gZmFjdG9yKENBR1JfUGVyaW9kLCBsZXZlbHMgPSBjKCIxLVllYXIgQ0FHUiIsICI1LVllYXIgQ0FHUiIsICIxMC1ZZWFyIENBR1IiLCAiMjAtWWVhciBDQUdSIiwgIjMwLVllYXIgQ0FHUiIpKSkNCg0KIyBBc3NpZ24gY29sb3JzIGR5bmFtaWNhbGx5IGJhc2VkIG9uIHRoZSBvcmRlciBvZiBDQUdSX1BlcmlvZCBpbiB0aGUgZGF0YQ0KIyBNYXRjaCB0aGUgdW5pcXVlIGxldmVscyBvZiBDQUdSX1BlcmlvZCB3aXRoIGNvbG9ycyBmcm9tIGNvbG9yc19nZW5lcmFsX2RhcmsNCnVuaXF1ZV90eXBlcyA8LSB1bmlxdWUobnJ0X2xvbmckQ0FHUl9QZXJpb2QpDQpjdXN0b21fY29sb3JzIDwtIHNldE5hbWVzKGNvbG9yc19nZW5lcmFsX2RhcmtbMTpsZW5ndGgodW5pcXVlX3R5cGVzKV0sIHVuaXF1ZV90eXBlcykNCg0KIyBGaW5kIHRoZSBtaW5pbXVtIGFuZCBtYXhpbXVtIHgtdmFsdWUgaW4geW91ciBkYXRhDQptYXhfeCA8LSBtYXgoYXMuaW50ZWdlcihudmRhX3Jhd19jYWdyJERhdGUpLCBuYS5ybSA9IFRSVUUpDQptaW5feCA8LSBtaW4oYXMuaW50ZWdlcihudmRhX3Jhd19jYWdyJERhdGUpLCBuYS5ybSA9IFRSVUUpDQppbnRlcmFjdGl2ZV9wcmludChtYXhfeCkgICMgVGVzdA0KaW50ZXJhY3RpdmVfcHJpbnQobWluX3gpICAjIFRlc3QNCg0KIyBGaW5kIHRoZSBtaW5pbXVtIGFuZCBtYXhpbXVtIHllYXINCm1pbl95ZWFyIDwtIG1pbihudmRhX3Jhd19jYWdyJERhdGUsIG5hLnJtID0gVFJVRSkNCm1heF95ZWFyIDwtIG1heChudmRhX3Jhd19jYWdyJERhdGUsIG5hLnJtID0gVFJVRSkNCmludGVyYWN0aXZlX3ByaW50KG1pbl95ZWFyKQ0KaW50ZXJhY3RpdmVfcHJpbnQobWF4X3llYXIpDQoNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQojIyBQTE9UIEZVTEwgV0lUSE9VVCBMSU1JVFMNCg0KIyBEZWZpbmUgc3RhcnQgYW5kIGVuZCB5ZWFycw0Kc3RhcnRfeWVhciA8LSBhcy5udW1lcmljKG1pbl95ZWFyKQ0KZW5kX3llYXIgPC0gMjAyNA0KeWVhcl9yYW5nZSA8LSBlbmRfeWVhciAtIHN0YXJ0X3llYXIgKyAxICAjIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIHllYXJzDQoNCiMgRGVmaW5lIGJyZWFrcyByb3VuZGVkIGFwcHJvcHJpYXRlbHkNCmxpbWl0c19zdGFydF95ZWFyIDwtIGZsb29yKHN0YXJ0X3llYXIgLyA1KSAqIDUgICMgUm91bmQgZG93biB0byB0aGUgbmVhcmVzdCBtdWx0aXBsZSBvZiA1DQpsaW1pdHNfZW5kX3llYXIgPC0gY2VpbGluZyhlbmRfeWVhciAvIDUpICogNSAgICMgUm91bmQgdXAgdG8gdGhlIG5lYXJlc3QgbXVsdGlwbGUgb2YgNQ0KDQojIENyZWF0ZSBkeW5hbWljIHRpdGxlIGFuZCBjYXB0aW9uDQpkeW5hbWljX3RpdGxlIDwtIHBhc3RlMCgiUm9sbGluZyBDQUdScyBBY3Jvc3MgUGVyaW9kcyBPdmVyICIseWVhcl9yYW5nZSwgIiBZZWFycyAoIiwgc3RhcnRfeWVhciwgIi0iLCBlbmRfeWVhciwgIikiKQ0KZHluYW1pY19jYXB0aW9uIDwtIHBhc3RlMCgiTlZEQSBDb21wb3VuZCBBdmVyYWdlIEdyb3d0aCBSYXRlcyBBY3Jvc3MgUm9sbGluZyBQZXJpb2RzLCBEYXRhc2V0ICgiLCBtaW5feWVhciwgIi0iLCBtYXhfeWVhciwgIikiKQ0KDQojIENyZWF0ZSB0aGUgZnVsbCwgbm9uLWZpbHRlcmVkIHgtYXhpcyBwbG90IHdpdGggZHluYW1pYyB4IHBsYWNlbWVudCBmb3IgYW5ub3RhdGlvbnMNCnAxIDwtIGdncGxvdChucnRfbG9uZywgYWVzKHggPSBhcy5pbnRlZ2VyKERhdGUpLCB5ID0gQ0FHUl9WYWx1ZSwgY29sb3IgPSBDQUdSX1BlcmlvZCkpICsNCg0KICAjIEFkZCBzaGFkZWQgYXJlYXMgZm9yIGJhY2tncm91bmQgZWZmZWN0DQogIGdlb21fcmVjdChhZXMoeG1pbiA9IC1JbmYsIHhtYXggPSBJbmYsIHltaW4gPSB0YXJnZXRfYWdncmVzc2l2ZSwgeW1heCA9IEluZiksIGZpbGwgPSAibGlnaHRncmVlbiIsIGFscGhhID0gMC4wMTApICsNCiAgZ2VvbV9yZWN0KGFlcyh4bWluID0gLUluZiwgeG1heCA9IEluZiwgeW1pbiA9IHRhcmdldF9jb25zZXJ2YXRpdmUsIHltYXggPSB0YXJnZXRfYWdncmVzc2l2ZSksIGZpbGwgPSAib3JhbmdlIiwgYWxwaGEgPSAwLjAxKSArDQogIGdlb21fcmVjdChhZXMoeG1pbiA9IC1JbmYsIHhtYXggPSBJbmYsIHltaW4gPSAtSW5mLCB5bWF4ID0gdGFyZ2V0X2NvbnNlcnZhdGl2ZSksIGZpbGwgPSAibGlnaHRjb3JhbCIsIGFscGhhID0gMC4wMTApICsNCiAgDQogICMgUGxvdCBsaW5lcyBmb3IgZWFjaCBDQUdSIFBlcmlvZA0KICBnZW9tX2xpbmUoc2l6ZSA9IDEuMCwgYWxwaGEgPSAzLjApICsgICAgICAgIyBMaW5lIGZvciBlYWNoIENBR1INCiAgZ2VvbV9wb2ludChzaXplID0gMS4wLCBhbHBoYSA9IDMuMCkgKyAgICAgICAjIFBvaW50cyBmb3IgZWFjaCBDQUdSDQogIA0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSB0YXJnZXRfYWdncmVzc2l2ZSwgY29sb3IgPSAiZGFya2JsdWUiLCBsaW5ldHlwZSA9ICJzb2xpZCIpICsNCiAgIyBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSB0YXJnZXRfbW9kZXJhdGUsIGNvbG9yID0gImRhcmtibHVlIiwgbGluZXR5cGUgPSAic29saWQiKSArDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IHRhcmdldF9jb25zZXJ2YXRpdmUsIGNvbG9yID0gImRhcmtibHVlIiwgbGluZXR5cGUgPSAic29saWQiKSArDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IHRhcmdldF9pbmZsYXRpb24sIGNvbG9yID0gImRhcmtyZWQiLCBsaW5ldHlwZSA9ICJkYXNoZWQiKSArDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IGNhZ3JfdmFsdWUsIGNvbG9yID0gImRhcmtyZWQiLCBsaW5ldHlwZSA9ICJkYXNoZWQiKSArDQogIA0KICAjIER5bmFtaWMgcmlnaHQtYWxpZ25lZCBwbGFjZW1lbnQgZm9yIGFubm90YXRpb25zDQogIGFubm90YXRlKCJ0ZXh0IiwgeCA9IEluZiwgeSA9IHRhcmdldF9hZ2dyZXNzaXZlLCBsYWJlbCA9ICJBZ2dyZXNzaXZlIiwgDQogICAgICAgICAgIGhqdXN0ID0gMSwgdmp1c3QgPSAtMC41MCwgY29sb3IgPSAiZGFya2JsdWUiLCBzaXplID0gNCkgKw0KICAjIGFubm90YXRlKCJ0ZXh0IiwgeCA9IEluZiwgeSA9IHRhcmdldF9tb2RlcmF0ZSwgbGFiZWwgPSAiTW9kZXJhdGUiLCANCiAgIyAgICAgICAgIGhqdXN0ID0gMSwgdmp1c3QgPSAtMC41MCwgY29sb3IgPSAiZGFya2JsdWUiLCBzaXplID0gNCkgKw0KICBhbm5vdGF0ZSgidGV4dCIsIHggPSBJbmYsIHkgPSB0YXJnZXRfY29uc2VydmF0aXZlLCBsYWJlbCA9ICJDb25zZXJ2YXRpdmUiLCANCiAgICAgICAgICAgaGp1c3QgPSAxLCB2anVzdCA9IC0wLjMwLCBjb2xvciA9ICJkYXJrYmx1ZSIsIHNpemUgPSA0KSArDQogIGFubm90YXRlKCJ0ZXh0IiwgeCA9IEluZiwgeSA9IHRhcmdldF9pbmZsYXRpb24sIGxhYmVsID0gIkluZmxhdGlvbiIsIA0KICAgICAgICAgICBoanVzdCA9IDEsIHZqdXN0ID0gKzEuMTAsIGNvbG9yID0gImRhcmtyZWQiLCBzaXplID0gNCkgKw0KICBhbm5vdGF0ZSgidGV4dCIsIHggPSBJbmYsIHkgPSBjYWdyX3ZhbHVlLCBsYWJlbCA9ICJDQUdSIiwgDQogICAgICAgICAgIGhqdXN0ID0gMSwgdmp1c3QgPSAtMC41MCwgY29sb3IgPSAiZGFya3JlZCIsIHNpemUgPSA0KSArIA0KDQogIGxhYnMoDQogICAgdGl0bGUgPSBkeW5hbWljX3RpdGxlLA0KICAgIHggPSAiWWVhciIsDQogICAgeSA9ICJDQUdSIFZhbHVlICglKSIsDQogICAgY29sb3IgPSAiQ0FHUiBQZXJpb2QiLA0KICAgIGNhcHRpb24gPSBkeW5hbWljX2NhcHRpb24NCiAgICApICsNCiAgDQogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjdXN0b21fY29sb3JzKSArICAjIFNldCBjb2xvcnMgZm9yIGVhY2ggQ0FHUiBQZXJpb2QNCiAgc2NhbGVfeF9jb250aW51b3VzKA0KICAgIGxpbWl0cyA9IGMoc3RhcnRfeWVhciwgZW5kX3llYXIgKyAzKSwgDQogICAgYnJlYWtzID0gc2VxKGxpbWl0c19zdGFydF95ZWFyLCBsaW1pdHNfZW5kX3llYXIgLCA1KSkgKyAgIyBSZXN0cmljdCAmIFNldCBNYWpvciB4LWF4aXMgbGluZXMgZm9yIGVhY2ggeWVhcg0KICANCiAgdGhlbWVfbWluaW1hbCgpICsNCiAgdGhlbWUoDQogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSwgc2l6ZSA9IDIwKSwgICAgICAgICAjIExhcmdlciB0aXRsZSBmb250DQogICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCksICAgICAgICAgICAgICAgICAgICAjIExhcmdlciB4LWF4aXMgbGFiZWwgZm9udA0KICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQpLCAgICAgICAgICAgICAgICAgICAgIyBMYXJnZXIgeS1heGlzIGxhYmVsIGZvbnQNCiAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEsIHNpemUgPSAxNCksICAjIExhcmdlciB4LWF4aXMgdGV4dA0KICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCksICAgICAgICAgICAgICAgICAgICAgIyBMYXJnZXIgeS1heGlzIHRleHQNCiAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0KSwgICAgICAgICAgICAgICAgICAgICMgTGVnZW5kIHRpdGxlIHNpemUNCiAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIpLCAgICAgICAgICAgICAgICAgICAgICMgTGVnZW5kIHRleHQgc2l6ZQ0KICAgIHBhbmVsLmdyaWQubWFqb3IgPSBlbGVtZW50X2xpbmUobGluZXR5cGUgPSAiZG90dGVkIiwgY29sb3IgPSAiYmxhY2siKSwgICMgTWFqb3IgZ3JpZCBsaW5lcw0KICAgIHBhbmVsLmdyaWQubWlub3IueCA9IGVsZW1lbnRfYmxhbmsoKSwgICAgICAgICAgICAgICAgICAgICAgIyBObyBtaW5vciB4IGdyaWQgbGluZXMNCiAgICBheGlzLnRpY2tzLmxlbmd0aCA9IHVuaXQoLTAuMjUsICJjbSIpLCAgICAgICAgICAgICAgICAgICAgICAjIEluY3JlYXNlIHRpY2sgbGVuZ3RoDQogICAgYXhpcy50aWNrcyA9IGVsZW1lbnRfbGluZShjb2xvciA9ICJibGFjayIsIHNpemUgPSAwLjUwKSwgICAjIERhcmtlciB0aWNrcw0KICAgIGF4aXMubGluZS54ID0gZWxlbWVudF9saW5lKGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDAuNzUpLCAgIyBEYXJrIGJvdHRvbSBib3JkZXINCiAgICBheGlzLmxpbmUueSA9IGVsZW1lbnRfbGluZShjb2xvciA9ICJibGFjayIsIHNpemUgPSAwLjc1KSAgICMgRGFyayBsZWZ0IGJvcmRlcg0KICApDQoNCiMgUHJpbnQgdGhlIHBsb3QgDQpwcmludChwMSkNCg0KYGBgDQoNCiMjIyMgU2hvcnQtVGVybQ0KDQpgYGB7ciBudmRhX3Jhd19jYWdyX2dyYXBoc19zaG9ydCwgZmlnLndpZHRoPTEwLCBmaWcuaGVpZ2h0PTd9DQoNCmNhdCgiXG5cbiMjIyMgQ29tcG91bmQgQXZlcmFnZSBHcm93dGggUmF0ZXMgQWNyb3NzIFNob3J0LVRlcm0gUm9sbGluZyBQZXJpb2RzIFxuIikNCg0KIyBGaWx0ZXIgZGF0YSBmb3IgU2hvcnQtVGVybSBDQUdSICg1LVllYXIgYW5kIDEwLVllYXIpDQpzaG9ydHRlcm1fZGF0YSA8LSBucnRfbG9uZyAlPiUNCiAgZmlsdGVyKENBR1JfUGVyaW9kICVpbiUgYygiNS1ZZWFyIENBR1IiLCAiMTAtWWVhciBDQUdSIikpDQoNCg0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiMjIFBMT1QgRlVMTCBXSVRIT1VUIExJTUlUUw0KDQojIERlZmluZSBzdGFydCBhbmQgZW5kIHllYXJzDQpzdGFydF95ZWFyIDwtIDIwMDUNCmVuZF95ZWFyIDwtIDIwMjQNCnllYXJfcmFuZ2UgPC0gZW5kX3llYXIgLSBzdGFydF95ZWFyICsgMSAgIyBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiB5ZWFycw0KDQojIERlZmluZSBicmVha3Mgcm91bmRlZCBhcHByb3ByaWF0ZWx5DQpsaW1pdHNfc3RhcnRfeWVhciA8LSBmbG9vcihzdGFydF95ZWFyIC8gNSkgKiA1ICAjIFJvdW5kIGRvd24gdG8gdGhlIG5lYXJlc3QgbXVsdGlwbGUgb2YgNQ0KbGltaXRzX2VuZF95ZWFyIDwtIGNlaWxpbmcoZW5kX3llYXIgLyA1KSAqIDUgICAjIFJvdW5kIHVwIHRvIHRoZSBuZWFyZXN0IG11bHRpcGxlIG9mIDUNCg0KIyBDcmVhdGUgZHluYW1pYyB0aXRsZSBhbmQgY2FwdGlvbg0KZHluYW1pY190aXRsZSA8LSBwYXN0ZTAoIkNBR1IgQWNyb3NzIFNob3J0LVRlcm0gUGVyaW9kcyBPdmVyICIseWVhcl9yYW5nZSwgIiBZZWFycyAoIiwgc3RhcnRfeWVhciwgIi0iLCBlbmRfeWVhciwgIikiKQ0KZHluYW1pY19jYXB0aW9uIDwtIHBhc3RlMCgiTlZEQSBDb21wb3VuZCBBdmVyYWdlIEdyb3d0aCBSYXRlcyBBY3Jvc3MgU2hvcnQtVGVybSBSb2xsaW5nIFBlcmlvZHMsIERhdGFzZXQgKCIsIG1pbl95ZWFyLCAiLSIsIG1heF95ZWFyLCAiKSIpDQoNCiMgQ3JlYXRlIHRoZSBmdWxsLCBub24tZmlsdGVyZWQgeC1heGlzIHBsb3Qgd2l0aCBkeW5hbWljIHggcGxhY2VtZW50IGZvciBhbm5vdGF0aW9ucw0KcDFfc2hvcnR0ZXJtIDwtIGdncGxvdChzaG9ydHRlcm1fZGF0YSwgYWVzKHggPSBhcy5pbnRlZ2VyKERhdGUpLCB5ID0gQ0FHUl9WYWx1ZSwgY29sb3IgPSBDQUdSX1BlcmlvZCkpICsNCg0KICAjIEFkZCBzaGFkZWQgYXJlYXMgZm9yIGJhY2tncm91bmQgZWZmZWN0DQogIGdlb21fcmVjdChhZXMoeG1pbiA9IC1JbmYsIHhtYXggPSBJbmYsIHltaW4gPSB0YXJnZXRfYWdncmVzc2l2ZSwgeW1heCA9IEluZiksIGZpbGwgPSAibGlnaHRncmVlbiIsIGFscGhhID0gMC4wMTApICsNCiAgZ2VvbV9yZWN0KGFlcyh4bWluID0gLUluZiwgeG1heCA9IEluZiwgeW1pbiA9IHRhcmdldF9jb25zZXJ2YXRpdmUsIHltYXggPSB0YXJnZXRfYWdncmVzc2l2ZSksIGZpbGwgPSAib3JhbmdlIiwgYWxwaGEgPSAwLjAxKSArDQogIGdlb21fcmVjdChhZXMoeG1pbiA9IC1JbmYsIHhtYXggPSBJbmYsIHltaW4gPSAtSW5mLCB5bWF4ID0gdGFyZ2V0X2NvbnNlcnZhdGl2ZSksIGZpbGwgPSAibGlnaHRjb3JhbCIsIGFscGhhID0gMC4wMTApICsNCiAgDQogICMgUGxvdCBsaW5lcyBmb3IgZWFjaCBDQUdSIFBlcmlvZA0KICBnZW9tX2xpbmUoc2l6ZSA9IDEuMCwgYWxwaGEgPSAzLjApICsgICAgICAgIyBMaW5lIGZvciBlYWNoIENBR1INCiAgZ2VvbV9wb2ludChzaXplID0gMS4wLCBhbHBoYSA9IDMuMCkgKyAgICAgICAjIFBvaW50cyBmb3IgZWFjaCBDQUdSDQoNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gdGFyZ2V0X2FnZ3Jlc3NpdmUsIGNvbG9yID0gImRhcmtibHVlIiwgbGluZXR5cGUgPSAic29saWQiKSArDQogICMgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gdGFyZ2V0X21vZGVyYXRlLCBjb2xvciA9ICJkYXJrYmx1ZSIsIGxpbmV0eXBlID0gInNvbGlkIikgKw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSB0YXJnZXRfY29uc2VydmF0aXZlLCBjb2xvciA9ICJkYXJrYmx1ZSIsIGxpbmV0eXBlID0gInNvbGlkIikgKw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSB0YXJnZXRfaW5mbGF0aW9uLCBjb2xvciA9ICJkYXJrcmVkIiwgbGluZXR5cGUgPSAiZGFzaGVkIikgKw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSBjYWdyX3ZhbHVlLCBjb2xvciA9ICJkYXJrcmVkIiwgbGluZXR5cGUgPSAiZGFzaGVkIikgKw0KICANCiAgIyBEeW5hbWljIHJpZ2h0LWFsaWduZWQgcGxhY2VtZW50IGZvciBhbm5vdGF0aW9ucw0KICBhbm5vdGF0ZSgidGV4dCIsIHggPSBJbmYsIHkgPSB0YXJnZXRfYWdncmVzc2l2ZSwgbGFiZWwgPSAiQWdncmVzc2l2ZSIsIA0KICAgICAgICAgICBoanVzdCA9IDEsIHZqdXN0ID0gLTAuNTAsIGNvbG9yID0gImRhcmtibHVlIiwgc2l6ZSA9IDQpICsNCiAgIyBhbm5vdGF0ZSgidGV4dCIsIHggPSBJbmYsIHkgPSB0YXJnZXRfbW9kZXJhdGUsIGxhYmVsID0gIk1vZGVyYXRlIiwgDQogICMgICAgICAgICBoanVzdCA9IDEsIHZqdXN0ID0gLTAuNTAsIGNvbG9yID0gImRhcmtibHVlIiwgc2l6ZSA9IDQpICsNCiAgYW5ub3RhdGUoInRleHQiLCB4ID0gSW5mLCB5ID0gdGFyZ2V0X2NvbnNlcnZhdGl2ZSwgbGFiZWwgPSAiQ29uc2VydmF0aXZlIiwgDQogICAgICAgICAgIGhqdXN0ID0gMSwgdmp1c3QgPSAtMC41MCwgY29sb3IgPSAiZGFya2JsdWUiLCBzaXplID0gNCkgKw0KICBhbm5vdGF0ZSgidGV4dCIsIHggPSBJbmYsIHkgPSB0YXJnZXRfaW5mbGF0aW9uLCBsYWJlbCA9ICJJbmZsYXRpb24iLCANCiAgICAgICAgICAgaGp1c3QgPSAxLCB2anVzdCA9ICsxLjMwLCBjb2xvciA9ICJkYXJrcmVkIiwgc2l6ZSA9IDQpICsNCiAgYW5ub3RhdGUoInRleHQiLCB4ID0gSW5mLCB5ID0gY2Fncl92YWx1ZSwgbGFiZWwgPSAiQ0FHUiIsIA0KICAgICAgICAgICBoanVzdCA9IDEsIHZqdXN0ID0gLTAuNTAsIGNvbG9yID0gImRhcmtyZWQiLCBzaXplID0gNCkgKyANCg0KICBsYWJzKA0KICAgIHRpdGxlID0gZHluYW1pY190aXRsZSwNCiAgICB4ID0gIlllYXIiLA0KICAgIHkgPSAiQ0FHUiBWYWx1ZSAoJSkiLA0KICAgIGNvbG9yID0gIkNBR1IgUGVyaW9kIiwNCiAgICBjYXB0aW9uID0gZHluYW1pY19jYXB0aW9uDQogICAgKSArDQogIA0KICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gY3VzdG9tX2NvbG9yc1tjKCI1LVllYXIgQ0FHUiIsICIxMC1ZZWFyIENBR1IiKV0pICsNCiAgc2NhbGVfeF9jb250aW51b3VzKA0KICAgIGxpbWl0cyA9IGMoc3RhcnRfeWVhciwgZW5kX3llYXIgKyAxKSwgDQogICAgYnJlYWtzID0gc2VxKGxpbWl0c19zdGFydF95ZWFyLCBsaW1pdHNfZW5kX3llYXIgKyAxICwgNSkNCiAgKSArICAjIFJlc3RyaWN0ICYgU2V0IE1ham9yIHgtYXhpcyBsaW5lcyBmb3IgZWFjaCB5ZWFyDQoNCiAgdGhlbWVfbWluaW1hbCgpICsNCiAgdGhlbWUoDQogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSwgc2l6ZSA9IDIwKSwgICAgICAgICAjIExhcmdlciB0aXRsZSBmb250DQogICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCksICAgICAgICAgICAgICAgICAgICAjIExhcmdlciB4LWF4aXMgbGFiZWwgZm9udA0KICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQpLCAgICAgICAgICAgICAgICAgICAgIyBMYXJnZXIgeS1heGlzIGxhYmVsIGZvbnQNCiAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEsIHNpemUgPSAxNCksICAjIExhcmdlciB4LWF4aXMgdGV4dA0KICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCksICAgICAgICAgICAgICAgICAgICAgIyBMYXJnZXIgeS1heGlzIHRleHQNCiAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0KSwgICAgICAgICAgICAgICAgICAgICMgTGVnZW5kIHRpdGxlIHNpemUNCiAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIpLCAgICAgICAgICAgICAgICAgICAgICMgTGVnZW5kIHRleHQgc2l6ZQ0KICAgIHBhbmVsLmdyaWQubWFqb3IgPSBlbGVtZW50X2xpbmUobGluZXR5cGUgPSAiZG90dGVkIiwgY29sb3IgPSAiYmxhY2siKSwgICMgTWFqb3IgZ3JpZCBsaW5lcw0KICAgIHBhbmVsLmdyaWQubWlub3IueCA9IGVsZW1lbnRfYmxhbmsoKSwgICAgICAgICAgICAgICAgICAgICAgIyBObyBtaW5vciB4IGdyaWQgbGluZXMNCiAgICBheGlzLnRpY2tzLmxlbmd0aCA9IHVuaXQoLTAuMjUsICJjbSIpLCAgICAgICAgICAgICAgICAgICAgICAjIEluY3JlYXNlIHRpY2sgbGVuZ3RoDQogICAgYXhpcy50aWNrcyA9IGVsZW1lbnRfbGluZShjb2xvciA9ICJibGFjayIsIHNpemUgPSAwLjUwKSwgICAjIERhcmtlciB0aWNrcw0KICAgIGF4aXMubGluZS54ID0gZWxlbWVudF9saW5lKGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDAuNzUpLCAgIyBEYXJrIGJvdHRvbSBib3JkZXINCiAgICBheGlzLmxpbmUueSA9IGVsZW1lbnRfbGluZShjb2xvciA9ICJibGFjayIsIHNpemUgPSAwLjc1KSAgICMgRGFyayBsZWZ0IGJvcmRlcg0KICApDQoNCiMgUHJpbnQgdGhlIHBsb3QgDQpwcmludChwMV9zaG9ydHRlcm0pDQoNCmBgYA0KDQoNCg0KIyMjIyBMb25nLVRlcm0NCg0KYGBge3IgbnZkYV9yYXdfY2Fncl9ncmFwaHNfbG9uZywgZmlnLndpZHRoPTEwLCBmaWcuaGVpZ2h0PTd9DQoNCmNhdCgiXG5cbiMjIyMgQ29tcG91bmQgQXZlcmFnZSBHcm93dGggUmF0ZXMgQWNyb3NzIExvbmctVGVybSBSb2xsaW5nIFBlcmlvZHMgXG4iKQ0KDQojIEZpbHRlciBkYXRhIGZvciBMb25nLVRlcm0gQ0FHUiAoMjAtWWVhciBhbmQgMzAtWWVhcikNCmxvbmd0ZXJtX2RhdGEgPC0gbnJ0X2xvbmcgJT4lDQogIGZpbHRlcihDQUdSX1BlcmlvZCAlaW4lIGMoIjIwLVllYXIgQ0FHUiIsICIzMC1ZZWFyIENBR1IiKSkNCg0KDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KIyMgUExPVCBGVUxMIFdJVEhPVVQgTElNSVRTDQoNCiMgRGVmaW5lIHN0YXJ0IGFuZCBlbmQgeWVhcnMNCnN0YXJ0X3llYXIgPC0gMjAyMA0KZW5kX3llYXIgPC0gMjAyNA0KeWVhcl9yYW5nZSA8LSBlbmRfeWVhciAtIHN0YXJ0X3llYXIgKyAxICAjIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIHllYXJzDQoNCiMgRGVmaW5lIGJyZWFrcyByb3VuZGVkIGFwcHJvcHJpYXRlbHkNCmxpbWl0c19zdGFydF95ZWFyIDwtIGZsb29yKHN0YXJ0X3llYXIgLyA1KSAqIDUgICMgUm91bmQgZG93biB0byB0aGUgbmVhcmVzdCBtdWx0aXBsZSBvZiA1DQpsaW1pdHNfZW5kX3llYXIgPC0gY2VpbGluZyhlbmRfeWVhciAvIDUpICogNSAgICMgUm91bmQgdXAgdG8gdGhlIG5lYXJlc3QgbXVsdGlwbGUgb2YgNQ0KDQojIENyZWF0ZSBkeW5hbWljIHRpdGxlIGFuZCBjYXB0aW9uDQpkeW5hbWljX3RpdGxlIDwtIHBhc3RlMCgiQ0FHUiBBY3Jvc3MgTG9uZy1UZXJtIFBlcmlvZHMgT3ZlciAiLHllYXJfcmFuZ2UsICIgWWVhcnMgKCIsIHN0YXJ0X3llYXIsICItIiwgZW5kX3llYXIsICIpIikNCmR5bmFtaWNfY2FwdGlvbiA8LSBwYXN0ZTAoIk5WREEgQ29tcG91bmQgQXZlcmFnZSBHcm93dGggUmF0ZXMgQWNyb3NzIExvbmctVGVybSBSb2xsaW5nIFBlcmlvZHMsIERhdGFzZXQgKCIsIG1pbl95ZWFyLCAiLSIsIG1heF95ZWFyLCAiKSIpDQoNCiMgQ3JlYXRlIHRoZSBmdWxsLCBub24tZmlsdGVyZWQgeC1heGlzIHBsb3Qgd2l0aCBkeW5hbWljIHggcGxhY2VtZW50IGZvciBhbm5vdGF0aW9ucw0KcDFfbG9uZ3Rlcm0gPC0gZ2dwbG90KGxvbmd0ZXJtX2RhdGEsIGFlcyh4ID0gYXMuaW50ZWdlcihEYXRlKSwgeSA9IENBR1JfVmFsdWUsIGNvbG9yID0gQ0FHUl9QZXJpb2QpKSArDQoNCiAgIyBBZGQgc2hhZGVkIGFyZWFzIGZvciBiYWNrZ3JvdW5kIGVmZmVjdA0KICBnZW9tX3JlY3QoYWVzKHhtaW4gPSAtSW5mLCB4bWF4ID0gSW5mLCB5bWluID0gdGFyZ2V0X2FnZ3Jlc3NpdmUsIHltYXggPSBJbmYpLCBmaWxsID0gImxpZ2h0Z3JlZW4iLCBhbHBoYSA9IDAuMDEwKSArDQogIGdlb21fcmVjdChhZXMoeG1pbiA9IC1JbmYsIHhtYXggPSBJbmYsIHltaW4gPSB0YXJnZXRfY29uc2VydmF0aXZlLCB5bWF4ID0gdGFyZ2V0X2FnZ3Jlc3NpdmUpLCBmaWxsID0gIm9yYW5nZSIsIGFscGhhID0gMC4wMSkgKw0KICBnZW9tX3JlY3QoYWVzKHhtaW4gPSAtSW5mLCB4bWF4ID0gSW5mLCB5bWluID0gLUluZiwgeW1heCA9IHRhcmdldF9jb25zZXJ2YXRpdmUpLCBmaWxsID0gImxpZ2h0Y29yYWwiLCBhbHBoYSA9IDAuMDEwKSArDQogIA0KICAjIFBsb3QgbGluZXMgZm9yIGVhY2ggQ0FHUiBQZXJpb2QNCiAgZ2VvbV9saW5lKHNpemUgPSAxLjAsIGFscGhhID0gMy4wKSArICAgICAgICMgTGluZSBmb3IgZWFjaCBDQUdSDQogIGdlb21fcG9pbnQoc2l6ZSA9IDEuMCwgYWxwaGEgPSAzLjApICsgICAgICAgIyBQb2ludHMgZm9yIGVhY2ggQ0FHUg0KDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IHRhcmdldF9hZ2dyZXNzaXZlLCBjb2xvciA9ICJkYXJrYmx1ZSIsIGxpbmV0eXBlID0gInNvbGlkIikgKw0KICAjIGdlb21faGxpbmUoeWludGVyY2VwdCA9IHRhcmdldF9tb2RlcmF0ZSwgY29sb3IgPSAiZGFya2JsdWUiLCBsaW5ldHlwZSA9ICJzb2xpZCIpICsNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gdGFyZ2V0X2NvbnNlcnZhdGl2ZSwgY29sb3IgPSAiZGFya2JsdWUiLCBsaW5ldHlwZSA9ICJzb2xpZCIpICsNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gdGFyZ2V0X2luZmxhdGlvbiwgY29sb3IgPSAiZGFya3JlZCIsIGxpbmV0eXBlID0gImRhc2hlZCIpICsNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gY2Fncl92YWx1ZSwgY29sb3IgPSAiZGFya3JlZCIsIGxpbmV0eXBlID0gImRhc2hlZCIpICsNCiAgDQogICMgRHluYW1pYyByaWdodC1hbGlnbmVkIHBsYWNlbWVudCBmb3IgYW5ub3RhdGlvbnMNCiAgYW5ub3RhdGUoInRleHQiLCB4ID0gSW5mLCB5ID0gdGFyZ2V0X2FnZ3Jlc3NpdmUsIGxhYmVsID0gIkFnZ3Jlc3NpdmUiLCANCiAgICAgICAgICAgaGp1c3QgPSAxLCB2anVzdCA9IC0wLjUwLCBjb2xvciA9ICJkYXJrYmx1ZSIsIHNpemUgPSA0KSArDQogICMgYW5ub3RhdGUoInRleHQiLCB4ID0gSW5mLCB5ID0gdGFyZ2V0X21vZGVyYXRlLCBsYWJlbCA9ICJNb2RlcmF0ZSIsIA0KICAjICAgICAgICAgaGp1c3QgPSAxLCB2anVzdCA9IC0wLjUwLCBjb2xvciA9ICJkYXJrYmx1ZSIsIHNpemUgPSA0KSArDQogIGFubm90YXRlKCJ0ZXh0IiwgeCA9IEluZiwgeSA9IHRhcmdldF9jb25zZXJ2YXRpdmUsIGxhYmVsID0gIkNvbnNlcnZhdGl2ZSIsIA0KICAgICAgICAgICBoanVzdCA9IDEsIHZqdXN0ID0gLTAuNTAsIGNvbG9yID0gImRhcmtibHVlIiwgc2l6ZSA9IDQpICsNCiAgYW5ub3RhdGUoInRleHQiLCB4ID0gSW5mLCB5ID0gdGFyZ2V0X2luZmxhdGlvbiwgbGFiZWwgPSAiSW5mbGF0aW9uIiwgDQogICAgICAgICAgIGhqdXN0ID0gMSwgdmp1c3QgPSAtMC41MCwgY29sb3IgPSAiZGFya3JlZCIsIHNpemUgPSA0KSArDQogIGFubm90YXRlKCJ0ZXh0IiwgeCA9IEluZiwgeSA9IGNhZ3JfdmFsdWUsIGxhYmVsID0gIkNBR1IiLCANCiAgICAgICAgICAgaGp1c3QgPSAxLCB2anVzdCA9IC0wLjUwLCBjb2xvciA9ICJkYXJrcmVkIiwgc2l6ZSA9IDQpICsgDQoNCiAgbGFicygNCiAgICB0aXRsZSA9IGR5bmFtaWNfdGl0bGUsDQogICAgeCA9ICJZZWFyIiwNCiAgICB5ID0gIkNBR1IgVmFsdWUgKCUpIiwNCiAgICBjb2xvciA9ICJDQUdSIFBlcmlvZCIsDQogICAgY2FwdGlvbiA9IGR5bmFtaWNfY2FwdGlvbg0KICAgICkgKw0KICANCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGN1c3RvbV9jb2xvcnNbYygiMjAtWWVhciBDQUdSIiwgIjMwLVllYXIgQ0FHUiIpXSkgKw0KICBzY2FsZV94X2NvbnRpbnVvdXMoDQogICAgbGltaXRzID0gYyhzdGFydF95ZWFyLCBlbmRfeWVhciArIDEpLCANCiAgICBicmVha3MgPSBzZXEobGltaXRzX3N0YXJ0X3llYXIsIGxpbWl0c19lbmRfeWVhciArIDEsIDEpDQogICkgKyAgIyBSZXN0cmljdCAmIFNldCBNYWpvciB4LWF4aXMgbGluZXMgZm9yIGVhY2ggeWVhcg0KDQogIHRoZW1lX21pbmltYWwoKSArDQogIHRoZW1lKA0KICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUsIHNpemUgPSAyMCksICAgICAgICAgIyBMYXJnZXIgdGl0bGUgZm9udA0KICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQpLCAgICAgICAgICAgICAgICAgICAgIyBMYXJnZXIgeC1heGlzIGxhYmVsIGZvbnQNCiAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0KSwgICAgICAgICAgICAgICAgICAgICMgTGFyZ2VyIHktYXhpcyBsYWJlbCBmb250DQogICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxLCBzaXplID0gMTQpLCAgIyBMYXJnZXIgeC1heGlzIHRleHQNCiAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQpLCAgICAgICAgICAgICAgICAgICAgICMgTGFyZ2VyIHktYXhpcyB0ZXh0DQogICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCksICAgICAgICAgICAgICAgICAgICAjIExlZ2VuZCB0aXRsZSBzaXplDQogICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyKSwgICAgICAgICAgICAgICAgICAgICAjIExlZ2VuZCB0ZXh0IHNpemUNCiAgICBwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9saW5lKGxpbmV0eXBlID0gImRvdHRlZCIsIGNvbG9yID0gImJsYWNrIiksICAjIE1ham9yIGdyaWQgbGluZXMNCiAgICBwYW5lbC5ncmlkLm1pbm9yLnggPSBlbGVtZW50X2JsYW5rKCksICAgICAgICAgICAgICAgICAgICAgICMgTm8gbWlub3IgeCBncmlkIGxpbmVzDQogICAgYXhpcy50aWNrcy5sZW5ndGggPSB1bml0KC0wLjI1LCAiY20iKSwgICAgICAgICAgICAgICAgICAgICAgIyBJbmNyZWFzZSB0aWNrIGxlbmd0aA0KICAgIGF4aXMudGlja3MgPSBlbGVtZW50X2xpbmUoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMC41MCksICAgIyBEYXJrZXIgdGlja3MNCiAgICBheGlzLmxpbmUueCA9IGVsZW1lbnRfbGluZShjb2xvciA9ICJibGFjayIsIHNpemUgPSAwLjc1KSwgICMgRGFyayBib3R0b20gYm9yZGVyDQogICAgYXhpcy5saW5lLnkgPSBlbGVtZW50X2xpbmUoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMC43NSkgICAjIERhcmsgbGVmdCBib3JkZXINCiAgKQ0KDQojIFByaW50IHRoZSBwbG90IA0KcHJpbnQocDFfbG9uZ3Rlcm0pDQoNCg0KYGBgDQoNCiMgTVNGVA0KDQpNaWNyb3NvZnQgQ29ycG9yYXRpb24gKE1TRlQpIGlzIGNvbnNpZGVyZWQgYSBsZWFkaW5nIHRlY2hub2xvZ3kgY29tcGFueSBoZWFkcXVhcnRlcmVkIGluIFJlZG1vbmQsIFdhc2hpbmd0b24uIEVzdGFibGlzaGVkIGluIDE5NzUgYnkgQmlsbCBHYXRlcyBhbmQgUGF1bCBBbGxlbiwgTWljcm9zb2Z0IGlzIGJlc3Qga25vd24gZm9yIGl0cyBXaW5kb3dzIG9wZXJhdGluZyBzeXN0ZW0sIHRoZSBNaWNyb3NvZnQgT2ZmaWNlIFN1aXRlLCBhbmQgaXRzIEF6dXJlIGNsb3VkIGNvbXB1dGluZyBwbGF0Zm9ybS4gVGhlIGNvbXBhbnkgYWxzbyBkZXZlbG9wcyBpbm5vdmF0aXZlIGhhcmR3YXJlIHN1Y2ggYXMgdGhlIFN1cmZhY2UgbGluZSBvZiBkZXZpY2VzIGFuZCB0aGUgWGJveCBnYW1pbmcgY29uc29sZSwgYWxvbmdzaWRlIHNvZnR3YXJlIGFuZCBzZXJ2aWNlcyBpbiBhcmVhcyBsaWtlIGFydGlmaWNpYWwgaW50ZWxsaWdlbmNlIChBSSksIGN5YmVyc2VjdXJpdHksIGFuZCBlbnRlcnByaXNlIHNvbHV0aW9ucy4NCg0KIyMgTVNGVCBHUg0KDQojIyMgRGF0YQ0KDQpUaGUgTVNGVCBEYXRhIHByZXNlbnRlZCBoZXJlIGlzIHNvdXJjZWQgZnJvbSBZYWhvbyBGaW5hbmNlLCBmaWx0ZXJlZCB0byBkaXNwbGF5IE1vbnRobHkgSGlzdG9yaWNhbCBEYXRhIChlLmcuLCAwMy8wMS8yMDI0KS4gVGhpcyBkYXRhIHJlcHJlc2VudHMgdGhlIGNsb3NpbmcgcHJpY2Ugb2YgdGhlIGxhc3QgdHJhZGluZyBkYXkgb2YgZWFjaCBtb250aCAoZS5nLiwgMDMvMjgvMjAyNCkuIFBsZWFzZSBub3RlIHRoYXQgdGhlIHN0YXRpc3RpY3MgcHJlc2VudGVkIGhlcmUgbWF5IGRpZmZlciBmcm9tIHRob3NlIGluIFlhaG9vIEZpbmFuY2UncyBQZXJmb3JtYW5jZSBzZWN0aW9uIGR1ZSB0byBkaWZmZXJlbmNlcyBpbiBkYXRhIGFnZ3JlZ2F0aW9uIGFuZCBjYWxjdWxhdGlvbiBtZXRob2RzLiAgDQoNCkRhdGEgU291cmNlOiBgciBucnYkc291cmNlX21zZnRfeWFob29gDQoNCmBgYHtyIG1zZnRfcmF3LCBldmFsPVRSVUUsIGVjaG89RkFMU0V9DQoNCiMgRGlzcGxheSB0aGUgc3RydWN0dXJlIG9mIHRoZSBkYXRhc2V0IHRvIGNvbmZpcm0gY29sdW1uIG5hbWVzDQppbnRlcmFjdGl2ZV9zdHIobnJ0JG1zZnRfcmF3KQ0KDQpsaWJyYXJ5KGRwbHlyKQ0KbGlicmFyeShsdWJyaWRhdGUpICAjIEZvciBkYXRlIG1hbmlwdWxhdGlvbg0KbGlicmFyeShzY2FsZXMpDQpsaWJyYXJ5KHN0cmluZ3IpDQoNCiMgRW5zdXJlIHRoZSAnRGF0ZScgY29sdW1uIGlzIG9mIERhdGUgY2xhc3MNCm1zZnRfcmF3IDwtIG5ydCRtc2Z0X3JhdyAlPiUNCiAgbXV0YXRlKERhdGUgPSBhcy5EYXRlKERhdGUsIGZvcm1hdCA9ICIlWS0lbS0lZCIpKQ0KDQojIEZpbmQgdGhlIG1pbmltdW0gYW5kIG1heGltdW0geWVhcg0KbWluX3llYXIgPC0gZm9ybWF0KG1pbihtc2Z0X3JhdyREYXRlLCBuYS5ybSA9IFRSVUUpLCAiJVkiKQ0KbWF4X3llYXIgPC0gZm9ybWF0KG1heChtc2Z0X3JhdyREYXRlLCBuYS5ybSA9IFRSVUUpLCAiJVkiKQ0KaW50ZXJhY3RpdmVfcHJpbnQobWluX3llYXIpDQppbnRlcmFjdGl2ZV9wcmludChtYXhfeWVhcikNCg0KIyBVcGRhdGUgZGF0YSBmcmFtZSB3aXRoIHByb3BlciBkYXRlIGFuZCBwZXJjZW50YWdlIGhhbmRsaW5nDQptc2Z0X3JhdyA8LSBtc2Z0X3JhdyAlPiUNCiAgbXV0YXRlKA0KICAgICMgQ29udmVydCBDbG9zZSBEYXRlIHRvICJZWVlZLU1NLUREIiBmb3JtYXQNCiAgICBgRGF0ZWAgPSBmb3JtYXQoYXMuRGF0ZShhcy5jaGFyYWN0ZXIoYERhdGVgKSwgb3JpZ2luID0gIjE5NzAtMDEtMDEiKSwgIiVZLSVtLSVkIiksDQoNCiAgICAjIEVuc3VyZSBDbG9zZSBpcyBhIG51bWJlciBmb3JtYXR0ZWQgdG8gMiBkZWNpbWFsIHBsYWNlcw0KICAgIGBDbG9zZWAgPSBudW1iZXIoYXMubnVtZXJpYyhnc3ViKCIsIiwgIiIsIENsb3NlKSksIGJpZy5tYXJrID0gIiwiLCBkZWNpbWFsLm1hcmsgPSAiLiIsIGFjY3VyYWN5ID0gMC4wMSksDQoNCiAgICAjIENsZWFuIGFuZCBoYW5kbGUgcGVyY2VudGFnZSBjb2x1bW5zDQogICAgYWNyb3NzKDM6MywgfiB7DQogICAgICB2YWx1ZSA8LSBnc3ViKCJbLCVcXHNdIiwgIiIsIC4pICAjIFJlbW92ZSAlLCBjb21tYXMsIGFuZCBzcGFjZXMNCiAgICAgIG51bWVyaWNfdmFsdWUgPC0gc3VwcHJlc3NXYXJuaW5ncyhhcy5udW1lcmljKHZhbHVlKSkgICMgQ29udmVydCB0byBudW1lcmljDQogICAgICBpZmVsc2UoDQogICAgICAgICFpcy5uYShudW1lcmljX3ZhbHVlKSwgDQogICAgICAgIHBhc3RlMChmb3JtYXQocm91bmQobnVtZXJpY192YWx1ZSoxMDAsIDIpLCBiaWcubWFyayA9ICIsIiwgc2NpZW50aWZpYyA9IEZBTFNFKSwgIiUiKSwgICMgRm9ybWF0IHRvIDIgZGVjaW1hbCBwbGFjZXMgYW5kIGFkZCBjb21tYXMNCiAgICAgICAgLg0KICAgICAgKQ0KICAgIH0pDQogICkgJT4lDQogIGFycmFuZ2UoZGVzYyhgRGF0ZWApKSAgIyBTb3J0IGJ5IERhdGUgZnJvbSBuZXdlc3QgdG8gb2xkZXN0DQoNCiMgRGlzcGxheSB0aGUgZm9ybWF0dGVkIGRhdGENCmludGVyYWN0aXZlX3N0cihtc2Z0X3JhdykNCmludGVyYWN0aXZlX3ByaW50KG1zZnRfcmF3KQ0KDQojIERpc3BsYXkgdGhlIHRhYmxlIHdpdGggY2FwdGlvbg0KY2F0KCJcblxuIyMjIyBNU0ZUIFllYXJseSBQZXJmb3JtYW5jZSAoIiwgbWluX3llYXIsICItIiwgbWF4X3llYXIsICIpXG4iLCBzZXAgPSAiIikNCmZvcm1hdF9lcXVhbF93aWR0aF9ncm91cGVkKG1zZnRfcmF3LCBncm91cGluZ19mYWN0b3IgPSAyKQ0KIyBjYXQoIlxuXG4gU291cmNlOiAiLCBucnYkc291cmNlX21zZnRfeWFob28sICJcbiIpDQoNCmBgYA0KDQojIyMgU3VtbWFyeQ0KDQpgYGB7ciBtc2Z0X3Jhd19zdW1tYXJ5LCBldmFsPVRSVUUsIGVjaG89RkFMU0V9DQoNCiMgTG9hZCBuZWNlc3NhcnkgbGlicmFyaWVzDQpsaWJyYXJ5KGRwbHlyKQ0KbGlicmFyeSh0aWJibGUpDQpsaWJyYXJ5KGtuaXRyKQ0KbGlicmFyeShrYWJsZUV4dHJhKQ0KDQppbnRlcmFjdGl2ZV9zdHIobXNmdF9yYXcpDQppbnRlcmFjdGl2ZV9wcmludChtc2Z0X3JhdykNCg0KIyBFbnN1cmUgdGhlIERhdGUgY29sdW1uIGlzIGEgcHJvcGVyIERhdGUgb2JqZWN0IGFuZCBleHRyYWN0IHRoZSB5ZWFyDQptc2Z0X3JhdyA8LSBtc2Z0X3JhdyAlPiUNCiAgc2xpY2UoLTEpICU+JSAjIFJlbW92ZSB0aGUgZmlyc3Qgcm93DQogICMgbXV0YXRlKERhdGUgPSBpZmVsc2Uocm93X251bWJlcigpID09IDEsICIyMDI1LTAxLTAxIiwgRGF0ZSkpICU+JQ0KICBtdXRhdGUoDQogICAgRGF0ZSA9IGFzLm51bWVyaWMoZm9ybWF0KGFzLkRhdGUoRGF0ZSwgZm9ybWF0ID0gIiVZLSVtLSVkIiksICIlWSIpKSwNCiAgICBgMS1ZZWFyIENBR1JgID0gYXMubnVtZXJpYyhnc3ViKCJbXjAtOS4tXSIsICIiLCBgMS1ZZWFyIENBR1JgKSkNCiAgKQ0KDQojIFNvcnQgZGF0YSBieSBEYXRlIGluIGFzY2VuZGluZyBvcmRlcg0KbXNmdF9yYXcgPC0gbXNmdF9yYXcgJT4lDQogIGFycmFuZ2UoRGF0ZSkNCg0KDQojIENhbGN1bGF0ZSB0aGUgQ0FHUiBhbmQgZHluYW1pY2FsbHkgY3JlYXRlIGEgdmFyaWFibGUgbmFtZSB3aXRoIHRoZSBmb3JtYXQgbXNmdF9jYWdyX3ZhbHVlX3M8bWluX3llYXI+X2U8bWF4X3llYXI+DQppbml0aWFsX3ZhbHVlIDwtIDEwMCAgIyBBc3N1bWluZyBhbiBpbml0aWFsIGluZGV4IHZhbHVlIG9mIDEwMA0KZmluYWxfdmFsdWUgPC0gaW5pdGlhbF92YWx1ZSAqIHByb2QoMSArIG1zZnRfcmF3JGAxLVllYXIgQ0FHUmAgLyAxMDAsIG5hLnJtID0gVFJVRSkNCm1pbl95ZWFyIDwtIG1pbihtc2Z0X3JhdyREYXRlLCBuYS5ybSA9IFRSVUUpDQptYXhfeWVhciA8LSBtYXgobXNmdF9yYXckRGF0ZSwgbmEucm0gPSBUUlVFKQ0KbnVtX3llYXJzIDwtIG1heF95ZWFyIC0gbWluX3llYXINCmNhZ3JfdmFsdWUgPC0gcm91bmQoKChmaW5hbF92YWx1ZSAvIGluaXRpYWxfdmFsdWUpXigxIC8gbnVtX3llYXJzKSAtIDEpICogMTAwLCAyKQ0KdmFyX25hbWUgPC0gcGFzdGUwKCJtc2Z0X2NhZ3JfdmFsdWVfcyIsIG1pbl95ZWFyLCAiX2UiLCBtYXhfeWVhcikNCmFzc2lnbih2YXJfbmFtZSwgY2Fncl92YWx1ZSkNCg0KIyBDb252ZXJ0IE1TRlQgZGF0YSB0byBudW1lcmljLCByZW1vdmluZyBhbnkgcGVyY2VudGFnZSBzaWducw0KZGF0YSA8LSBhcy5udW1lcmljKGdzdWIoIiUiLCAiIiwgbXNmdF9yYXckYDEtWWVhciBDQUdSYCkpDQoNCiMgQ2FsY3VsYXRlIHN0YXRpc3RpY3MNCmNvdW50X29ic2VydmF0aW9ucyA8LSBzdW0oIWlzLm5hKGRhdGEpKQ0KbWVhbl92YWx1ZSA8LSByb3VuZChtZWFuKGRhdGEsIG5hLnJtID0gVFJVRSksIDIpDQptZWRpYW5fdmFsdWUgPC0gcm91bmQobWVkaWFuKGRhdGEsIG5hLnJtID0gVFJVRSksIDIpDQpzZF92YWx1ZSA8LSByb3VuZChzZChkYXRhLCBuYS5ybSA9IFRSVUUpLCAyKQ0KbWluX2NhZ3JfcmFuZ2UgPC0gcm91bmQoY2Fncl92YWx1ZSAtIHNkX3ZhbHVlLCAyKQ0KbWF4X2NhZ3JfcmFuZ2UgPC0gcm91bmQoY2Fncl92YWx1ZSArIHNkX3ZhbHVlLCAyKQ0KbWluX3ZhbHVlIDwtIHJvdW5kKG1pbihkYXRhLCBuYS5ybSA9IFRSVUUpLCAyKQ0KbWF4X3ZhbHVlIDwtIHJvdW5kKG1heChkYXRhLCBuYS5ybSA9IFRSVUUpLCAyKQ0KDQojIFRhcmdldCBSYXRlIEFuYWx5c2lzIC0gUmVmZXIgdG8gIlByZWZlcnJlZCBUYXJnZXRzIiBvciBpbmNsdWRlIGJlbG93IGZvciBpbmRpdmlkdWFsIGNoYW5nZXMuDQphYm92ZV90YXJnZXRfaW5mbGF0aW9uIDwtIHN1bShkYXRhID49IHRhcmdldF9pbmZsYXRpb24sIG5hLnJtID0gVFJVRSkNCmFib3ZlX3RhcmdldF9jb25zZXJ2YXRpdmUgPC0gc3VtKGRhdGEgPj0gdGFyZ2V0X2NvbnNlcnZhdGl2ZSwgbmEucm0gPSBUUlVFKQ0KYWJvdmVfdGFyZ2V0X21vZGVyYXRlIDwtIHN1bShkYXRhID49IHRhcmdldF9tb2RlcmF0ZSwgbmEucm0gPSBUUlVFKQ0KYWJvdmVfdGFyZ2V0X2FnZ3Jlc3NpdmUgPC0gc3VtKGRhdGEgPj0gdGFyZ2V0X2FnZ3Jlc3NpdmUsIG5hLnJtID0gVFJVRSkNCg0KcGVyY2VudF9hYm92ZV90YXJnZXRfY29uc2VydmF0aXZlIDwtIHJvdW5kKChhYm92ZV90YXJnZXRfY29uc2VydmF0aXZlIC8gY291bnRfb2JzZXJ2YXRpb25zKSAqIDEwMCwgMikNCnBlcmNlbnRfYWJvdmVfdGFyZ2V0X2luZmxhdGlvbiA8LSByb3VuZCgoYWJvdmVfdGFyZ2V0X2luZmxhdGlvbiAvIGNvdW50X29ic2VydmF0aW9ucykgKiAxMDAsIDIpDQpwZXJjZW50X2Fib3ZlX3RhcmdldF9tb2RlcmF0ZSA8LSByb3VuZCgoYWJvdmVfdGFyZ2V0X21vZGVyYXRlIC8gY291bnRfb2JzZXJ2YXRpb25zKSAqIDEwMCwgMikNCnBlcmNlbnRfYWJvdmVfdGFyZ2V0X2FnZ3Jlc3NpdmUgPC0gcm91bmQoKGFib3ZlX3RhcmdldF9hZ2dyZXNzaXZlIC8gY291bnRfb2JzZXJ2YXRpb25zKSAqIDEwMCwgMikNCg0KIyBDb21waWxlIHN0YXRpc3RpY3MgaW50byBhIGxpc3QgZm9yIGVhc3kgY29udmVyc2lvbiB0byBhIGRhdGEgZnJhbWUgd2l0aCBkZWZpbml0aW9ucw0KbXNmdF9yYXdfc3VtbWFyeSA8LSB0cmliYmxlKA0KICB+U3RhdGlzdGljLCB+VmFsdWUsIH5EZWZpbml0aW9uLA0KICAiQ291bnQgb2YgT2JzZXJ2YXRpb25zIiwgYXMuY2hhcmFjdGVyKGNvdW50X29ic2VydmF0aW9ucyksICJUb3RhbCBudW1iZXIgb2YgZGF0YSBwb2ludHMgY29sbGVjdGVkIG92ZXIgdGhlIHNwZWNpZmljIHBlcmlvZC4iLA0KICAiQ0FHUiIsIHBhc3RlMChjYWdyX3ZhbHVlLCAiJSIpLCAiQ29tcG91bmQgQXZlcmFnZSBHcm93dGggUmF0ZTsgbWVhbiBncm93dGggcmF0ZSBvdmVyIGEgcGVyaW9kIGlmIGl0IGhhZCBjb21wb3VuZGVkIGFudWFsbHkuIiwNCiAgIk1lYW4iLCBwYXN0ZTAobWVhbl92YWx1ZSwgIiUiKSwgIlJlZmxlY3RzIHRoZSBnZW5lcmFsIHByaWNlIGxldmVsIGFuZCBvdmVyYWxsIGdyb3d0aCByYXRlLiIsDQogICJNZWRpYW4iLCBwYXN0ZTAobWVkaWFuX3ZhbHVlLCAiJSIpLCAiTWlkZGxlIHZhbHVlIG9mIHRoZSBkYXRhIHdoZW4gb3JkZXJlZCBjaHJvbm9sb2dpY2FsbHk7IGNlbnRyYWwgdGVuZGVuY3kgbWVhc3VyZSBsZXNzIGFmZmVjdGVkIGJ5IGV4dHJlbWUgdmFsdWVzLiIsDQogICJTdGFuZGFyZCBEZXZpYXRpb24gKFZvbGF0aWxpdHkpIiwgcGFzdGUwKHNkX3ZhbHVlLCAiJSIpLCAiVGhlIGRpc3BlcnNpb24gb2YgdmFsdWVzIGZyb20gdGhlIG1lYW4sIGluZGljYXRpbmcgdGhlIHZvbGF0aWxpdHkgb2YgcHJpY2UgY2hhbmdlcyBhbmQgZWNvbm9taWMgc3RhYmlsaXR5LiIsDQogICJNaW4gQ0FHUiBSYW5nZSAoQ0FHUiAtIFNEKSIsIHBhc3RlMChtaW5fY2Fncl9yYW5nZSwgIiUiKSwgIkxvd2VyIGJvdW5kYXJ5IG9mIGV4cGVjdGVkIE1TRlQgcmFuZ2U7IGxvd2VzdCBlc3RpbWF0ZSBvZiB0eXBpY2FsIGdyb3d0aCByYXRlIGNvbnNpZGVyaW5nIG5vcm1hbCBmbHVjdHVhdGlvbnMuIiwNCiAgIk1heCBDQUdSIFJhbmdlIChDQUdSICsgU0QpIiwgcGFzdGUwKG1heF9jYWdyX3JhbmdlLCAiJSIpLCAiVXBwZXIgYm91bmRhcnkgb2YgZXhwZWN0ZWQgTVNGVCByYW5nZTsgaGlnaGVzdCBlc3RpbWF0ZSBvZiB0eXBpY2FsIGdyb3d0aCByYXRlIGNvbnNpZGVyaW5nIG5vcm1hbCBmbHVjdHVhdGlvbnMuIiwNCiAgIk1pbmltdW0iLCBwYXN0ZTAobWluX3ZhbHVlLCAiJSIpLCAiTG93ZXN0IGdyb3d0aCByYXRlLiIsDQogICJNYXhpbXVtIiwgcGFzdGUwKG1heF92YWx1ZSwgIiUiKSwgIkhpZ2hlc3QgZ3Jvd3RoIHJhdGUuIiwNCiAgIlBlcmNlbnQgQWJvdmUgSW5mbGF0aW9uIFRhcmdldCIsIHBhc3RlMChwZXJjZW50X2Fib3ZlX3RhcmdldF9pbmZsYXRpb24sICIlIiksICJQZXJjZW50YWdlIG9mIHZhbHVlcyBhYm92ZSB0aGUgaW5mbGF0aW9uIHRhcmdldCBzcGVjaWZpZWQgaW4gUHJlZmVycmVkIFRhcmdldHMgc2VjdGlvbi4iLA0KICAiUGVyY2VudCBBYm92ZSBDb25zZXJ2YXRpdmUgVGFyZ2V0IiwgcGFzdGUwKHBlcmNlbnRfYWJvdmVfdGFyZ2V0X2NvbnNlcnZhdGl2ZSwgIiUiKSwgIlBlcmNlbnRhZ2Ugb2YgdmFsdWVzIGFib3ZlIHRoZSBjb25zZXJ2YXRpdmUgdGFyZ2V0IHNwZWNpZmllZCBpbiBQcmVmZXJyZWQgVGFyZ2V0cyBzZWN0aW9uLiIsDQogICJQZXJjZW50IEFib3ZlIE1vZGVyYXRlIFRhcmdldCIsIHBhc3RlMChwZXJjZW50X2Fib3ZlX3RhcmdldF9tb2RlcmF0ZSwgIiUiKSwgIlBlcmNlbnRhZ2Ugb2YgdmFsdWVzIGFib3ZlIHRoZSBtb2RlcmF0ZSB0YXJnZXQgc3BlY2lmaWVkIGluIFByZWZlcnJlZCBUYXJnZXRzIHNlY3Rpb24uIiwNCiAgIlBlcmNlbnQgQWJvdmUgQWdncmVzc2l2ZSBUYXJnZXQiLCBwYXN0ZTAocGVyY2VudF9hYm92ZV90YXJnZXRfYWdncmVzc2l2ZSwgIiUiKSwgIlBlcmNlbnRhZ2Ugb2YgdmFsdWVzIGFib3ZlIHRoZSBhZ2dyZXNzaXZlIHRhcmdldCBzcGVjaWZpZWQgaW4gUHJlZmVycmVkIFRhcmdldHMgc2VjdGlvbi4iDQopDQoNCiMgQ29udmVydCB0byBjaGFyYWN0ZXIgdG8gYXZvaWQgYXV0b21hdGljIGRlY2ltYWwgcG9pbnRzIG9uIHdob2xlIG51bWJlcnMNCm1zZnRfcmF3X3N1bW1hcnkgPC0gbXNmdF9yYXdfc3VtbWFyeSAlPiUNCiAgbXV0YXRlKGFjcm9zcyhldmVyeXRoaW5nKCksIGFzLmNoYXJhY3RlcikpDQoNCiMgRGlzcGxheSBmb3JtYXR0ZWQgdGFibGUNCmNhdCgiXG5cbiMjIyMgQW5udWFsIEdyb3d0aCBSYXRlIFN1bW1hcnkgKCIsIG1pbl95ZWFyLCAiLSIsIG1heF95ZWFyLCAiKVxuIiwgc2VwID0gIiIpDQpmb3JtYXRfM2NvbF9jdXN0b21fd2lkdGhzKG1zZnRfcmF3X3N1bW1hcnksIGNvbDFfd2lkdGggPSAiMjBlbSIsIGNvbDJfd2lkdGggPSAiMTBlbSIsIGNvbDNfd2lkdGggPSAiNDBlbSIpIA0KDQojIFZpZXcobXNmdF9yYXdfc3VtbWFyeSkNCmludGVyYWN0aXZlX3N0cihtc2Z0X3Jhd19zdW1tYXJ5KQ0KDQpgYGANCg0KTVNGVCdzIEluZGV4IGV4aGliaXRzIGEgYHIgaWYoY2Fncl92YWx1ZSA+IHRhcmdldF9hZ2dyZXNzaXZlKSAiYWdncmVzc2l2ZSIgZWxzZSBpZihjYWdyX3ZhbHVlID4gdGFyZ2V0X21vZGVyYXRlKSAibW9kZXJhdGUiIGVsc2UgaWYoY2Fncl92YWx1ZSA+IHRhcmdldF9jb25zZXJ2YXRpdmUpICJjb25zZXJ2YXRpdmUiIGVsc2UgaWYoY2Fncl92YWx1ZSA+IHRhcmdldF9pbmZsYXRpb24pICJiYXNlbGluZSIgZWxzZSAiZGlzYXBwb2ludGluZyJgIENBR1IgYXQgYHIgY2Fncl92YWx1ZWAlLCBgciBpZihjYWdyX3ZhbHVlIDwgbWVhbl92YWx1ZSkgImxvd2VyIHRoYW4iIGVsc2UgImhpZ2hlciB0aGFuImAgdGhlIG1lYW4gZ3Jvd3RoIHJhdGUgb2YgYHIgbWVhbl92YWx1ZWAlLCByZWZsZWN0aW5nIHRoZSBpbXBhY3Qgb2Ygc2hvcnQtdGVybSB2b2xhdGlsaXR5IGFuZCBgciBpZihjYWdyX3ZhbHVlID4gbWVhbl92YWx1ZSkgImRlY2xpbmVzIiBlbHNlICJncm93dGggc3Bpa2VzImAuIFRoZSBtZWRpYW4gcmV0dXJuIG9mIGByIG1lZGlhbl92YWx1ZWAlIGluZGljYXRlcyB0aGF0IG1vcmUgdGhhbiBoYWxmIG9mIHRoZSBvYnNlcnZlZCB5ZWFycyBleHBlcmllbmNlZCByZXR1cm5zIGByIGlmKGNhZ3JfdmFsdWUgPCBtZWRpYW5fdmFsdWUpICJhYm92ZSIgZWxzZSAiYmVsb3ciYCB0aGUgbWVhbi4gVGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHRoZSBDQUdSIGFuZCB0aGUgbWVkaWFuIGdyb3d0aCByYXRlIHN1Z2dlc3RzIHRoYXQgc3VzdGFpbmVkIHBlcmlvZHMgb2YgYWJvdmUtbWVkaWFuIGdyb3d0aCBoYXZlIGV4ZXJ0ZWQgY3VtdWxhdGl2ZSBgciBpZihjYWdyX3ZhbHVlIDwgbWVkaWFuX3ZhbHVlKSAidXB3YXJkIHByZXNzdXJlIiBlbHNlICJkb3dud2FyZCBwcmVzc3VyZSJgIG9uIG92ZXJhbGwgcHJpY2UgbGV2ZWxzLiBUaGlzIHJlbGF0aW9uc2hpcCBoaWdobGlnaHRzIGEgZGlzdHJpYnV0aW9uIHdpdGggbm90YWJsZSBleHRyZW1lcyBvbiB0aGUgYHIgaWYoY2Fncl92YWx1ZSA8IG1lYW5fdmFsdWUpICJoaWdoZXIiIGVsc2UgImxvd2VyImAgZW5kLCByZWZsZWN0aW5nIGByIGlmKGNhZ3JfdmFsdWUgPCBtZWFuX3ZhbHVlKSAicG9zaXRpdmUiIGVsc2UgIm5lZ2F0aXZlImAgc2tld25lc3MuIFRoaXMgYHIgaWYoY2Fncl92YWx1ZSA8IG1lZGlhbl92YWx1ZSkgInBvc2l0aXZlIiBlbHNlICJuZWdhdGl2ZSJgIHNrZXduZXNzIGltcGxpZXMgdGhhdCB3aGlsZSBtb3JlIHRoYW4gaGFsZiBvZiB0aGUgb2JzZXJ2ZWQgeWVhcnMgZXhwZXJpZW5jZWQgcmV0dXJucyBgciBpZihjYWdyX3ZhbHVlIDwgbWVkaWFuX3ZhbHVlKSAiYWJvdmUgdGhlIG1lYW4sIGRvd250dXJucyBjYW4gYmUgc2V2ZXJlIiBlbHNlICJiZWxvdyB0aGUgbWVhbiwgdXB0dXJucyBjYW4gYmUgc2lnbmlmaWNhbnQiYC4gSG93ZXZlciwgdGhlIG1hcmtldCBoYXMgaGlzdG9yaWNhbGx5IHByb3ZpZGVkIHN1YnN0YW50aWFsIGByIGlmKGNhZ3JfdmFsdWUgPCBtZWRpYW5fdmFsdWUpICJ1cHNpZGUgcG90ZW50aWFsIiBlbHNlICJkb3duc2lkZSByaXNrImAuIEFkZGl0aW9uYWxseSwgdGhlIGZhY3QgdGhhdCBgciBwZXJjZW50X2Fib3ZlX3RhcmdldF9pbmZsYXRpb25gJSBvZiB0aGUgeWVhcnMgZXhjZWVkZWQgdGhlIGluZmxhdGlvbiB0YXJnZXQgYHIgaWYgKHBlcmNlbnRfYWJvdmVfdGFyZ2V0X2luZmxhdGlvbiA+IDcwKSAicmVpbmZvcmNlcyBNU0ZUJ3MgZWZmZWN0aXZlbmVzcyBhcyBhIHN0cm9uZyBsb25nLXRlcm0gaGVkZ2UiIGVsc2UgaWYgKHBlcmNlbnRfYWJvdmVfdGFyZ2V0X2luZmxhdGlvbiA+IDYwKSAicmVpbmZvcmNlcyBNU0ZUJ3MgZWZmZWN0aXZlbmVzcyBhcyBhIGxvbmctdGVybSBoZWRnZSIgZWxzZSBpZiAocGVyY2VudF9hYm92ZV90YXJnZXRfaW5mbGF0aW9uID4gNTApICJxdWVzdGlvbnMgTVNGVCdzIGVmZmVjdGl2ZW5lc3MgIGFzIGEgbG9uZy10ZXJtIGhlZGdlIiBlbHNlICJ1bmRlcm1pbmVzIE1TRlQncyBlZmZlY3RpdmVuZXNzIGFzIGEgbG9uZy10ZXJtIGhlZGdlImAgYWdhaW5zdCBpbmZsYXRpb24uDQoNClRoZSBzdGFuZGFyZCBkZXZpYXRpb24gb2YgYHIgc2RfdmFsdWVgJSBgciBpZihzZF92YWx1ZSA+IDIwKSAiaW5kaWNhdGVzIGV4dHJlbWUgdm9sYXRpbGl0eSwgcmVmbGVjdGluZyBzdWJzdGFudGlhbCBmbHVjdHVhdGlvbnMgaW4gZXF1aXR5IG1hcmtldHMiIGVsc2UgaWYoc2RfdmFsdWUgPiAxNSkgInVuZGVyc2NvcmVzIHNpZ25pZmljYW50IHZvbGF0aWxpdHksIGEgY29tbW9uIGZlYXR1cmUgb2YgZXF1aXR5IG1hcmtldHMiIGVsc2UgInN1Z2dlc3RzIG1vZGVyYXRlIHZvbGF0aWxpdHksIHR5cGljYWwgb2YgcmVsYXRpdmVseSBzdGFibGUgbWFya2V0cyJgLiBUaGUgYHIgcmFuZ2VfcmF0aW8gPC0gKG1heF92YWx1ZSAtIG1pbl92YWx1ZSkgLyBzZF92YWx1ZTsgaWYocmFuZ2VfcmF0aW8gPiA1KSAiaGlnaGx5IHZvbGF0aWxlIiBlbHNlIGlmKHJhbmdlX3JhdGlvID4gMykgIm5vdGFibGUiIGVsc2UgImNvbXBhcmF0aXZlbHkgc3RhYmxlImAgcmFuZ2Ugb2YgYW5udWFsIHJldHVybnMsIHNwYW5uaW5nIGZyb20gYHIgbWluX3ZhbHVlYCUgdG8gYHIgbWF4X3ZhbHVlYCUsIGByIGlmKHJhbmdlX3JhdGlvID4gNSkgImlsbHVzdHJhdGVzIGEgaGlnaGx5IHZvbGF0aWxlIG1hcmtldCBlbnZpcm9ubWVudCwgcGFydGx5IGR1ZSB0byBpdHMgY29tcG9zaXRpb24sIHdpdGggdGhlIHBvdGVudGlhbCBmb3IgYm90aCBleHRyZW1lIGdhaW5zIGFuZCBsb3NzZXMiIGVsc2UgaWYocmFuZ2VfcmF0aW8gPiAzKSAiaGlnaGxpZ2h0cyBub3RhYmxlIG1hcmtldCB2YXJpYWJpbGl0eSwgcGFydGx5IGR1ZSB0byBpdHMgY29tcG9zaXRpb24sICByZWZsZWN0aW5nIGJvdGggb3Bwb3J0dW5pdGllcyBhbmQgcmlza3MiIGVsc2UgImluZGljYXRlcyBhIGNvbXBhcmF0aXZlbHkgc3RhYmxlIG1hcmtldCwgcGFydGx5IGR1ZSB0byBpdHMgY29tcG9zaXRpb24sIHdpdGggbGVzcyBleHRyZW1lIGFubnVhbCBmbHVjdHVhdGlvbnMiYC4gDQoNCkZvciBNU0ZUIHRvIGJlIGNvbnNpZGVyZWQgYSBoaWdoLXBlcmZvcm1pbmcgYW5kIHJlc2lsaWVudCBsb25nLXRlcm0gaW52ZXN0bWVudCwgaXQgd291bGQgYmUgaWRlYWwgdG8gZXhjZWVkIHRoZSBhZ2dyZXNzaXZlIHRhcmdldCAgKGUuZy4sIGByICh0YXJnZXRfYWdncmVzc2l2ZSAtIHRhcmdldF9pbmZsYXRpb24pYCUgYW5udWFsaXplZCByZXR1cm5zLCBhY2NvdW50aW5nIGZvciBoaWdoZXIgaW5mbGF0aW9uLWFkanVzdGVkIHBlcmZvcm1hbmNlIGV4cGVjdGF0aW9ucykgaW4gYXQgbGVhc3QgNDAlLTUwJSBvZiB0aGUgeWVhcnMuIFRoaXMgcmFuZ2UgcmVmbGVjdHMgdGhlIHBvdGVudGlhbCBmb3Igc3Ryb25nIHVwc2lkZSBpbiBtYW55IHllYXJzIHdoaWxlIGJhbGFuY2luZyB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IG1hcmtldHMgZG8gZXhwZXJpZW5jZSBkb3dudHVybnMuIFRoZSBmYWN0IHRoYXQgYHIgcGVyY2VudF9hYm92ZV90YXJnZXRfYWdncmVzc2l2ZWAlIG9mIHRoZSB5ZWFycyBleGNlZWRlZCB0aGUgYWdncmVzc2l2ZSB0YXJnZXQgYHIgaWYocGVyY2VudF9hYm92ZV90YXJnZXRfYWdncmVzc2l2ZSA+IDUwKSAiaW5kaWNhdGVzIGNvbnNpc3RlbnQgYW5kIHJvYnVzdCBncm93dGgsIG1ha2luZyBNU0ZUIGEgc3Ryb25nIG9wdGlvbiBmb3IgdGhvc2Ugc2Vla2luZyBhZ2dyZXNzaXZlIGludmVzdG1lbnRzLiIgZWxzZSBpZihwZXJjZW50X2Fib3ZlX3RhcmdldF9hZ2dyZXNzaXZlID4gNDApICJzdWdnZXN0cyB0aGF0IHdoaWxlIG5vdCBjb25zaXN0ZW50LCBNU0ZUIGhhcyBoaXN0b3JpY2FsbHkgcHJvdmlkZWQgcm9idXN0IGdyb3d0aCBvdmVyIHRoZSBsb25nIHRlcm0sIG1ha2luZyBpdCBhIHZpYWJsZSBpbnZlc3RtZW50IGZvciB0aG9zZSB3aXRoIGEgaGlnaGVyIHJpc2sgdG9sZXJhbmNlLiIgZWxzZSAicmFpc2VzIGNvbmNlcm5zIGFib3V0IE1TRlQncyBhYmlsaXR5IHRvIG1lZXQgYWdncmVzc2l2ZSBncm93dGggdGFyZ2V0cywgbWFraW5nIGl0IGxlc3Mgc3VpdGFibGUgZm9yIGludmVzdG9ycyB3aXRoIGhpZ2hlciByaXNrIHRvbGVyYW5jZS4iYA0KDQojIyMgR3JhcGgNCg0KYGBge3IgbXNmdF9yYXdfZ3JhcGgsIGZpZy53aWR0aD0xMCwgZmlnLmhlaWdodD03LCBldmFsPVRSVUUsIGVjaG89RkFMU0V9DQoNCiMgTG9hZCBuZWNlc3NhcnkgbGlicmFyaWVzDQpsaWJyYXJ5KGdncGxvdDIpDQpsaWJyYXJ5KGRwbHlyKQ0KDQojIENvbnZlcnQgYDEtWWVhciBDQUdSYCB0byBudW1lcmljIGZvciBwbG90dGluZw0KbXNmdF9yYXcgPC0gbXNmdF9yYXcgJT4lDQogIG11dGF0ZSgNCiAgICBgRGF0ZWAgPSBhcy5udW1lcmljKGFzLmNoYXJhY3RlcihgRGF0ZWApKSwgICMgRW5zdXJlIERhdGUgaXMgbnVtZXJpYw0KICAgIGAxLVllYXIgQ0FHUmAgPSBhcy5udW1lcmljKGdzdWIoIiUiLCAiIiwgYDEtWWVhciBDQUdSYCkpDQogICkNCg0KIyBGaW5kIHRoZSBtaW5pbXVtIGFuZCBtYXhpbXVtIHgtdmFsdWUgaW4geW91ciBkYXRhDQptYXhfeCA8LSBtYXgoYXMuaW50ZWdlcihtc2Z0X3JhdyREYXRlKSwgbmEucm0gPSBUUlVFKQ0KbWluX3ggPC0gbWluKGFzLmludGVnZXIobXNmdF9yYXckRGF0ZSksIG5hLnJtID0gVFJVRSkNCmludGVyYWN0aXZlX3ByaW50KG1heF94KSAgIyBUZXN0DQppbnRlcmFjdGl2ZV9wcmludChtaW5feCkgICMgVGVzdA0KDQojIEZpbmQgdGhlIG1pbmltdW0gYW5kIG1heGltdW0geWVhcg0KbWluX3llYXIgPC0gbWluKG1zZnRfcmF3JERhdGUsIG5hLnJtID0gVFJVRSkNCm1heF95ZWFyIDwtIG1heChtc2Z0X3JhdyREYXRlLCBuYS5ybSA9IFRSVUUpDQppbnRlcmFjdGl2ZV9wcmludChtaW5feWVhcikNCmludGVyYWN0aXZlX3ByaW50KG1heF95ZWFyKQ0KDQoNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQojIyBQTE9UIEZVTEwgV0lUSE9VVCBMSU1JVFMNCg0KIyBEZWZpbmUgc3RhcnQgYW5kIGVuZCB5ZWFycw0Kc3RhcnRfeWVhciA8LSBhcy5udW1lcmljKG1pbl95ZWFyKQ0KZW5kX3llYXIgPC0gMjAyNA0KeWVhcl9yYW5nZSA8LSBlbmRfeWVhciAtIHN0YXJ0X3llYXIgKyAxICAjIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIHllYXJzDQoNCiMgRGVmaW5lIGJyZWFrcyByb3VuZGVkIGFwcHJvcHJpYXRlbHkNCmxpbWl0c19zdGFydF95ZWFyIDwtIGZsb29yKHN0YXJ0X3llYXIgLyA1KSAqIDUgICMgUm91bmQgZG93biB0byB0aGUgbmVhcmVzdCBtdWx0aXBsZSBvZiA1DQpsaW1pdHNfZW5kX3llYXIgPC0gY2VpbGluZyhlbmRfeWVhciAvIDUpICogNSAgICMgUm91bmQgdXAgdG8gdGhlIG5lYXJlc3QgbXVsdGlwbGUgb2YgNQ0KDQojIENyZWF0ZSBkeW5hbWljIHRpdGxlIGFuZCBjYXB0aW9uDQpkeW5hbWljX3RpdGxlIDwtIHBhc3RlMCgiQW5udWFsIEdyb3d0aCBSYXRlcyBPdmVyICIseWVhcl9yYW5nZSwgIiBZZWFycyAoIiwgc3RhcnRfeWVhciwgIi0iLCBlbmRfeWVhciwgIikiKQ0KZHluYW1pY19jYXB0aW9uIDwtIHBhc3RlMCgiTVNGVCBBbm51YWwgR3Jvd3RoIFJhdGVzLCBEYXRhIFBlcmlvZCAoIiwgbWluX3llYXIsICLigJMiLCBtYXhfeWVhciwgIikiKQ0KDQojIENyZWF0ZSB0aGUgZnVsbCwgbm9uLWZpbHRlcmVkIHgtYXhpcyBwbG90IHdpdGggZHluYW1pYyB4IHBsYWNlbWVudCBmb3IgYW5ub3RhdGlvbnMNCnAxIDwtIGdncGxvdChtc2Z0X3JhdywgYWVzKHggPSBhcy5pbnRlZ2VyKERhdGUpLCB5ID0gYDEtWWVhciBDQUdSYCkpICsNCiAgDQogICMgQWRkIHNoYWRlZCBhcmVhcyBmb3IgYmFja2dyb3VuZCBlZmZlY3QNCiAgZ2VvbV9yZWN0KGFlcyh4bWluID0gLUluZiwgeG1heCA9IEluZiwgeW1pbiA9IHRhcmdldF9hZ2dyZXNzaXZlLCB5bWF4ID0gSW5mKSwgZmlsbCA9ICJsaWdodGdyZWVuIiwgYWxwaGEgPSAwLjAyNSkgKw0KICBnZW9tX3JlY3QoYWVzKHhtaW4gPSAtSW5mLCB4bWF4ID0gSW5mLCB5bWluID0gdGFyZ2V0X2NvbnNlcnZhdGl2ZSwgeW1heCA9IHRhcmdldF9hZ2dyZXNzaXZlKSwgZmlsbCA9ICJvcmFuZ2UiLCBhbHBoYSA9IDAuMDI1KSArDQogIGdlb21fcmVjdChhZXMoeG1pbiA9IC1JbmYsIHhtYXggPSBJbmYsIHltaW4gPSAtSW5mLCB5bWF4ID0gdGFyZ2V0X2NvbnNlcnZhdGl2ZSksIGZpbGwgPSAibGlnaHRjb3JhbCIsIGFscGhhID0gMC4wMjUpICsNCiAgDQogICMgUGxvdCBsaW5lcywgcG9pbnRzLCBhbmQgYW5ub3RhdGlvbnMgb24gdG9wIG9mIHNoYWRlZCBhcmVhcw0KICBnZW9tX2xpbmUoY29sb3IgPSAiIzRCMDA4MiIsIHNpemUgPSAxLjApICsgICAgICAgIyBEYXJrIHB1cnBsZSBsaW5lIA0KICBnZW9tX3BvaW50KGNvbG9yID0gIiM0QjAwODIiLCBzaXplID0gMS41KSArICAgICAgICAjIERhcmsgcHVycGxlIHBvaW50cyANCiAgDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IHRhcmdldF9hZ2dyZXNzaXZlLCBjb2xvciA9ICJkYXJrYmx1ZSIsIGxpbmV0eXBlID0gInNvbGlkIikgKw0KICAjIGdlb21faGxpbmUoeWludGVyY2VwdCA9IHRhcmdldF9tb2RlcmF0ZSwgY29sb3IgPSAiZGFya2JsdWUiLCBsaW5ldHlwZSA9ICJzb2xpZCIpICsNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gdGFyZ2V0X2NvbnNlcnZhdGl2ZSwgY29sb3IgPSAiZGFya2JsdWUiLCBsaW5ldHlwZSA9ICJzb2xpZCIpICsNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gdGFyZ2V0X2luZmxhdGlvbiwgY29sb3IgPSAiZGFya3JlZCIsIGxpbmV0eXBlID0gImRhc2hlZCIpICsNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gY2Fncl92YWx1ZSwgY29sb3IgPSAiZGFya3JlZCIsIGxpbmV0eXBlID0gImRhc2hlZCIpICsNCiAgDQogICMgRHluYW1pYyByaWdodC1hbGlnbmVkIHBsYWNlbWVudCBmb3IgYW5ub3RhdGlvbnMNCiAgYW5ub3RhdGUoInRleHQiLCB4ID0gSW5mLCB5ID0gdGFyZ2V0X2FnZ3Jlc3NpdmUsIGxhYmVsID0gIkFnZ3Jlc3NpdmUiLCANCiAgICAgICAgICAgaGp1c3QgPSAxLCB2anVzdCA9IC0wLjUwLCBjb2xvciA9ICJkYXJrYmx1ZSIsIHNpemUgPSA0KSArDQogICMgYW5ub3RhdGUoInRleHQiLCB4ID0gSW5mLCB5ID0gdGFyZ2V0X21vZGVyYXRlLCBsYWJlbCA9ICJNb2RlcmF0ZSIsIA0KICAjICAgICAgICAgaGp1c3QgPSAxLCB2anVzdCA9IC0wLjUwLCBjb2xvciA9ICJkYXJrYmx1ZSIsIHNpemUgPSA0KSArDQogIGFubm90YXRlKCJ0ZXh0IiwgeCA9IEluZiwgeSA9IHRhcmdldF9jb25zZXJ2YXRpdmUsIGxhYmVsID0gIkNvbnNlcnZhdGl2ZSIsIA0KICAgICAgICAgICBoanVzdCA9IDEsIHZqdXN0ID0gLTAuNTAsIGNvbG9yID0gImRhcmtibHVlIiwgc2l6ZSA9IDQpICsNCiAgYW5ub3RhdGUoInRleHQiLCB4ID0gSW5mLCB5ID0gdGFyZ2V0X2luZmxhdGlvbiwgbGFiZWwgPSAiSW5mbGF0aW9uIiwgDQogICAgICAgICAgIGhqdXN0ID0gMSwgdmp1c3QgPSArMS4xMCwgY29sb3IgPSAiZGFya3JlZCIsIHNpemUgPSA0KSArDQogIGFubm90YXRlKCJ0ZXh0IiwgeCA9IEluZiwgeSA9IGNhZ3JfdmFsdWUsIGxhYmVsID0gIkNBR1IiLCANCiAgICAgICAgICAgaGp1c3QgPSAxLCB2anVzdCA9IC0wLjUwLCBjb2xvciA9ICJkYXJrcmVkIiwgc2l6ZSA9IDQpICsgDQoNCiAgbGFicygNCiAgICB0aXRsZSA9IGR5bmFtaWNfdGl0bGUsDQogICAgeCA9ICJZZWFyIiwNCiAgICB5ID0gIkdyb3d0aCBSYXRlICglKSIsDQogICAgY2FwdGlvbiA9IGR5bmFtaWNfY2FwdGlvbg0KICApICsNCg0KICBzY2FsZV94X2NvbnRpbnVvdXMoDQogICAgbGltaXRzID0gYyhzdGFydF95ZWFyLCBlbmRfeWVhciArIDMpLCAjIFJlc3RyaWN0cyB4LWF4aXMgZGF0YSANCiAgICBicmVha3MgPSBzZXEobGltaXRzX3N0YXJ0X3llYXIsIGxpbWl0c19lbmRfeWVhciwgNSkgIyBTZXRzIE1ham9yIHgtYXhpcyAgDQogICkgKyAgIyBSZXN0cmljdCAmIFNldCBNYWpvciB4LWF4aXMgbGluZXMgDQogICAgDQogIHRoZW1lX21pbmltYWwoKSArDQogIHRoZW1lKA0KICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUsIHNpemUgPSAyMCksICAgICAgICAgIyBMYXJnZXIgdGl0bGUgZm9udA0KICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQpLCAgICAgICAgICAgICAgICAgICAgIyBMYXJnZXIgeC1heGlzIGxhYmVsIGZvbnQNCiAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0KSwgICAgICAgICAgICAgICAgICAgICMgTGFyZ2VyIHktYXhpcyBsYWJlbCBmb250DQogICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxLCBzaXplID0gMTQpLCAgIyBMYXJnZXIgeC1heGlzIHRleHQNCiAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQpLCAgICAgICAgICAgICAgICAgICAgICMgTGFyZ2VyIHktYXhpcyB0ZXh0DQogICAgcGFuZWwuZ3JpZC5tYWpvciA9IGVsZW1lbnRfbGluZShsaW5ldHlwZSA9ICJkb3R0ZWQiLCBjb2xvciA9ICJibGFjayIpLCAgICAgICAgICMgTWFqb3IgZ3JpZCBsaW5lcw0KICAgIHBhbmVsLmdyaWQubWlub3IueCA9IGVsZW1lbnRfYmxhbmsoKSwgIyBlbGVtZW50X2xpbmUoY29sb3IgPSAiZ3JleTgwIikgICMgTWlub3IgeCBncmlkIGxpbmVzIGZvciBlYWNoIHllYXINCiAgICAjIHBhbmVsLmJvcmRlciA9IGVsZW1lbnRfcmVjdChjb2xvciA9ICJkYXJrZ3JleSIsIGZpbGwgPSBOQSwgc2l6ZSA9IDEuMCkgICMgRGFyayBib3JkZXIgYXJvdW5kIHRoZSBwbG90DQogICAgYXhpcy50aWNrcy5sZW5ndGggPSB1bml0KC0wLjI1LCAiY20iKSwgICAgICAgICAgICAgICAgICAgICAgIyBJbmNyZWFzZSB0aWNrIGxlbmd0aA0KICAgIGF4aXMudGlja3MgPSBlbGVtZW50X2xpbmUoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMC41MCksICMgRGFya2VyIHRpY2tzDQogICAgYXhpcy5saW5lLnggPSBlbGVtZW50X2xpbmUoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMC43NSksICAjIERhcmsgYm90dG9tIGJvcmRlcg0KICAgIGF4aXMubGluZS55ID0gZWxlbWVudF9saW5lKGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDAuNzUpICAgIyBEYXJrIGxlZnQgYm9yZGVyDQogICkNCg0KcHJpbnQocDEpDQoNCg0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiMjIFBMT1QgUkVTVFJJQ1RFRCBXSVRIIExJTUlUUw0KDQojIEZpbHRlciB0aGUgZGF0YSBmb3IgdGhlIHJlc3RyaWN0ZWQgeC1heGlzIHJhbmdlICgyMDA1LTIwMjQpDQpyZXN0cmljdGVkX2RhdGEgPC0gbXNmdF9yYXcgJT4lDQogIGZpbHRlcihhcy5pbnRlZ2VyKERhdGUpID49IDIwMDUgJiBhcy5pbnRlZ2VyKERhdGUpIDw9IDIwMjQpDQoNCiMgRGVmaW5lIHN0YXJ0IGFuZCBlbmQgeWVhcnMNCnN0YXJ0X3llYXIgPC0gMjAwNQ0KZW5kX3llYXIgPC0gMjAyNA0KeWVhcl9yYW5nZSA8LSBlbmRfeWVhciAtIHN0YXJ0X3llYXIgKyAxICAjIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIHllYXJzDQoNCiMgRGVmaW5lIGJyZWFrcyByb3VuZGVkIGFwcHJvcHJpYXRlbHkNCmxpbWl0c19zdGFydF95ZWFyIDwtIGZsb29yKHN0YXJ0X3llYXIgLyA1KSAqIDUgICMgUm91bmQgZG93biB0byB0aGUgbmVhcmVzdCBtdWx0aXBsZSBvZiA1DQpsaW1pdHNfZW5kX3llYXIgPC0gY2VpbGluZyhlbmRfeWVhciAvIDUpICogNSAgICMgUm91bmQgdXAgdG8gdGhlIG5lYXJlc3QgbXVsdGlwbGUgb2YgNQ0KDQojIENyZWF0ZSBkeW5hbWljIHRpdGxlIGFuZCBjYXB0aW9uDQpkeW5hbWljX3RpdGxlIDwtIHBhc3RlMCgiQW5udWFsIEdyb3d0aCBSYXRlcyBPdmVyICIseWVhcl9yYW5nZSwgIiBZZWFycyAoIiwgc3RhcnRfeWVhciwgIi0iLCBlbmRfeWVhciwgIikiKQ0KZHluYW1pY19jYXB0aW9uIDwtIHBhc3RlMCgiTVNGVCBBbm51YWwgR3Jvd3RoIFJhdGVzLCBEYXRhIFBlcmlvZCAoIiwgbWluX3llYXIsICLigJMiLCBtYXhfeWVhciwgIikiKQ0KDQojIENhbGN1bGF0ZSBkeW5hbWljIHktYXhpcyBsaW1pdHMgZm9yIHRoZSByZXN0cmljdGVkIGRhdGENCnlfbWluIDwtIG1pbihyZXN0cmljdGVkX2RhdGEkYDEtWWVhciBDQUdSYCwgbmEucm0gPSBUUlVFKQ0KeV9tYXggPC0gbWF4KHJlc3RyaWN0ZWRfZGF0YSRgMS1ZZWFyIENBR1JgLCBuYS5ybSA9IFRSVUUpDQoNCiMgQ3JlYXRlIHRoZSBmdWxsLCBub24tZmlsdGVyZWQgeC1heGlzIHBsb3Qgd2l0aCBkeW5hbWljIHggcGxhY2VtZW50IGZvciBhbm5vdGF0aW9ucw0KcDMgPC0gZ2dwbG90KHJlc3RyaWN0ZWRfZGF0YSwgYWVzKHggPSBhcy5pbnRlZ2VyKERhdGUpLCB5ID0gYDEtWWVhciBDQUdSYCkpICsNCiAgDQogICMgQWRkIHNoYWRlZCBhcmVhcyBmb3IgYmFja2dyb3VuZCBlZmZlY3QNCiAgZ2VvbV9yZWN0KGFlcyh4bWluID0gLUluZiwgeG1heCA9IEluZiwgeW1pbiA9IHRhcmdldF9hZ2dyZXNzaXZlLCB5bWF4ID0gSW5mKSwgZmlsbCA9ICJsaWdodGdyZWVuIiwgYWxwaGEgPSAwLjAzMCkgKw0KICBnZW9tX3JlY3QoYWVzKHhtaW4gPSAtSW5mLCB4bWF4ID0gSW5mLCB5bWluID0gdGFyZ2V0X2NvbnNlcnZhdGl2ZSwgeW1heCA9IHRhcmdldF9hZ2dyZXNzaXZlKSwgZmlsbCA9ICJvcmFuZ2UiLCBhbHBoYSA9IDAuMDMwKSArDQogIGdlb21fcmVjdChhZXMoeG1pbiA9IC1JbmYsIHhtYXggPSBJbmYsIHltaW4gPSAtSW5mLCB5bWF4ID0gdGFyZ2V0X2NvbnNlcnZhdGl2ZSksIGZpbGwgPSAibGlnaHRjb3JhbCIsIGFscGhhID0gMC4wMzApICsNCiAgDQogICMgUGxvdCBsaW5lcywgcG9pbnRzLCBhbmQgYW5ub3RhdGlvbnMgb24gdG9wIG9mIHNoYWRlZCBhcmVhcw0KICBnZW9tX2xpbmUoY29sb3IgPSAiIzRCMDA4MiIsIHNpemUgPSAxLjApICsgICAgICAgIyBEYXJrIHB1cnBsZSBsaW5lIA0KICBnZW9tX3BvaW50KGNvbG9yID0gIiM0QjAwODIiLCBzaXplID0gMS41KSArICAgICAgICAjIERhcmsgcHVycGxlIHBvaW50cyANCiAgDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IHRhcmdldF9hZ2dyZXNzaXZlLCBjb2xvciA9ICJkYXJrYmx1ZSIsIGxpbmV0eXBlID0gInNvbGlkIikgKw0KICAjIGdlb21faGxpbmUoeWludGVyY2VwdCA9IHRhcmdldF9tb2RlcmF0ZSwgY29sb3IgPSAiZGFya2JsdWUiLCBsaW5ldHlwZSA9ICJzb2xpZCIpICsNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gdGFyZ2V0X2NvbnNlcnZhdGl2ZSwgY29sb3IgPSAiZGFya2JsdWUiLCBsaW5ldHlwZSA9ICJzb2xpZCIpICsNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gdGFyZ2V0X2luZmxhdGlvbiwgY29sb3IgPSAiZGFya3JlZCIsIGxpbmV0eXBlID0gImRhc2hlZCIpICsNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gY2Fncl92YWx1ZSwgY29sb3IgPSAiZGFya3JlZCIsIGxpbmV0eXBlID0gImRhc2hlZCIpICsNCiAgDQogICMgRHluYW1pYyByaWdodC1hbGlnbmVkIHBsYWNlbWVudCBmb3IgYW5ub3RhdGlvbnMNCiAgYW5ub3RhdGUoInRleHQiLCB4ID0gSW5mLCB5ID0gdGFyZ2V0X2FnZ3Jlc3NpdmUsIGxhYmVsID0gIkFnZ3Jlc3NpdmUiLCANCiAgICAgICAgICAgaGp1c3QgPSAxLCB2anVzdCA9IC0wLjUwLCBjb2xvciA9ICJkYXJrYmx1ZSIsIHNpemUgPSA0KSArDQogICMgYW5ub3RhdGUoInRleHQiLCB4ID0gSW5mLCB5ID0gdGFyZ2V0X21vZGVyYXRlLCBsYWJlbCA9ICJNb2RlcmF0ZSIsIA0KICAjICAgICAgICAgaGp1c3QgPSAxLCB2anVzdCA9IC0wLjUwLCBjb2xvciA9ICJkYXJrYmx1ZSIsIHNpemUgPSA0KSArDQogIGFubm90YXRlKCJ0ZXh0IiwgeCA9IEluZiwgeSA9IHRhcmdldF9jb25zZXJ2YXRpdmUsIGxhYmVsID0gIkNvbnNlcnZhdGl2ZSIsIA0KICAgICAgICAgICBoanVzdCA9IDEsIHZqdXN0ID0gLTAuNTAsIGNvbG9yID0gImRhcmtibHVlIiwgc2l6ZSA9IDQpICsNCiAgYW5ub3RhdGUoInRleHQiLCB4ID0gSW5mLCB5ID0gdGFyZ2V0X2luZmxhdGlvbiwgbGFiZWwgPSAiSW5mbGF0aW9uIiwgDQogICAgICAgICAgIGhqdXN0ID0gMSwgdmp1c3QgPSArMS4xMCwgY29sb3IgPSAiZGFya3JlZCIsIHNpemUgPSA0KSArDQogIGFubm90YXRlKCJ0ZXh0IiwgeCA9IEluZiwgeSA9IGNhZ3JfdmFsdWUsIGxhYmVsID0gIkNBR1IiLCANCiAgICAgICAgICAgaGp1c3QgPSAxLCB2anVzdCA9IC0wLjUwLCBjb2xvciA9ICJkYXJrcmVkIiwgc2l6ZSA9IDQpICsgDQoNCiAgbGFicygNCiAgICB0aXRsZSA9IGR5bmFtaWNfdGl0bGUsDQogICAgeCA9ICJZZWFyIiwNCiAgICB5ID0gIkdyb3d0aCBSYXRlICglKSIsDQogICAgY2FwdGlvbiA9IGR5bmFtaWNfY2FwdGlvbg0KICApICsNCiAgDQogIGNvb3JkX2NhcnRlc2lhbih5bGltID0gYyh5X21pbiwgeV9tYXgpKSArICMgQXBwbHkgZHluYW1pYyB5LWF4aXMgbGltaXRzDQogIHNjYWxlX3hfY29udGludW91cygNCiAgICBsaW1pdHMgPSBjKHN0YXJ0X3llYXIsIGVuZF95ZWFyICsgMiksIA0KICAgIGJyZWFrcyA9IHNlcShsaW1pdHNfc3RhcnRfeWVhciwgbGltaXRzX2VuZF95ZWFyLCA1KQ0KICApICsgICMgUmVzdHJpY3QgJiBTZXQgTWFqb3IgeC1heGlzIGxpbmVzIGZvciBlYWNoIHllYXINCg0KICB0aGVtZV9taW5pbWFsKCkgKw0KICB0aGVtZSgNCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41LCBzaXplID0gMjApLCAgICAgICAgICMgTGFyZ2VyIHRpdGxlIGZvbnQNCiAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0KSwgICAgICAgICAgICAgICAgICAgICMgTGFyZ2VyIHgtYXhpcyBsYWJlbCBmb250DQogICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCksICAgICAgICAgICAgICAgICAgICAjIExhcmdlciB5LWF4aXMgbGFiZWwgZm9udA0KICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSwgc2l6ZSA9IDE0KSwgICMgTGFyZ2VyIHgtYXhpcyB0ZXh0DQogICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0KSwgICAgICAgICAgICAgICAgICAgICAjIExhcmdlciB5LWF4aXMgdGV4dA0KICAgIHBhbmVsLmdyaWQubWFqb3IgPSBlbGVtZW50X2xpbmUobGluZXR5cGUgPSAiZG90dGVkIiwgY29sb3IgPSAiYmxhY2siKSwgICAgICAgICAjIE1ham9yIGdyaWQgbGluZXMNCiAgICBwYW5lbC5ncmlkLm1pbm9yLnggPSBlbGVtZW50X2JsYW5rKCksICMgZWxlbWVudF9saW5lKGNvbG9yID0gImdyZXk4MCIpICAjIE1pbm9yIHggZ3JpZCBsaW5lcyBmb3IgZWFjaCB5ZWFyDQogICAgIyBwYW5lbC5ib3JkZXIgPSBlbGVtZW50X3JlY3QoY29sb3IgPSAiZGFya2dyZXkiLCBmaWxsID0gTkEsIHNpemUgPSAxLjApICAjIERhcmsgYm9yZGVyIGFyb3VuZCB0aGUgcGxvdA0KICAgIGF4aXMudGlja3MubGVuZ3RoID0gdW5pdCgtMC4yNSwgImNtIiksICAgICAgICAgICAgICAgICAgICAgICMgSW5jcmVhc2UgdGljayBsZW5ndGgNCiAgICBheGlzLnRpY2tzID0gZWxlbWVudF9saW5lKGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDAuNTApLCAjIERhcmtlciB0aWNrcw0KICAgIGF4aXMubGluZS54ID0gZWxlbWVudF9saW5lKGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDAuNzUpLCAgIyBEYXJrIGJvdHRvbSBib3JkZXINCiAgICBheGlzLmxpbmUueSA9IGVsZW1lbnRfbGluZShjb2xvciA9ICJibGFjayIsIHNpemUgPSAwLjc1KSAgICMgRGFyayBsZWZ0IGJvcmRlcg0KICApDQoNCnByaW50KHAzKQ0KDQpgYGANCg0KDQojIyBNU0ZUIENBR1INCg0KIyMjIERhdGENCg0KYGBge3IgbXNmdF9yYXdfZ3IsIGV2YWw9VFJVRSwgZWNobz1GQUxTRX0NCg0KIyBWaWV3KG5ydCRtc2Z0X3Jhd19ncikNCmludGVyYWN0aXZlX3N0cihucnQkbXNmdF9yYXdfZ3IpDQoNCmxpYnJhcnkoZHBseXIpDQpsaWJyYXJ5KGx1YnJpZGF0ZSkgICMgRm9yIGRhdGUgbWFuaXB1bGF0aW9uDQpsaWJyYXJ5KHNjYWxlcykNCmxpYnJhcnkoc3RyaW5ncikNCg0KIyBVcGRhdGUgZGF0YSBmcmFtZSB3aXRoIHByb3BlciBkYXRlIGFuZCBwZXJjZW50YWdlIGhhbmRsaW5nDQptc2Z0X3Jhd19nciA8LSBucnQkbXNmdF9yYXdfZ3IgJT4lDQogIG11dGF0ZSgNCiAgICAjIENvbnZlcnQgQ2xvc2UgRGF0ZSB0byAiWVlZWS1NTS1ERCIgZm9ybWF0DQogICAgYERhdGVgID0gZm9ybWF0KGFzLkRhdGUoYXMuY2hhcmFjdGVyKGBEYXRlYCksIG9yaWdpbiA9ICIxOTcwLTAxLTAxIiksICIlWS0lbS0lZCIpLA0KICAgIA0KICAgICMgRW5zdXJlIENsb3NlIGlzIGEgbnVtYmVyIGZvcm1hdHRlZCB0byAyIGRlY2ltYWwgcGxhY2VzDQogICAgYENsb3NlYCA9IG51bWJlcihhcy5udW1lcmljKGdzdWIoIiwiLCAiIiwgQ2xvc2UpKSwgYmlnLm1hcmsgPSAiLCIsIGRlY2ltYWwubWFyayA9ICIuIiwgYWNjdXJhY3kgPSAwLjAxKSwNCg0KICAgICMgQ2xlYW4gYW5kIGhhbmRsZSBwZXJjZW50YWdlIGNvbHVtbnMNCiAgICBhY3Jvc3MoMzoxMSwgfiB7DQogICAgICB2YWx1ZSA8LSBnc3ViKCJbLCVcXHNdIiwgIiIsIC4pICAjIFJlbW92ZSAlLCBjb21tYXMsIGFuZCBzcGFjZXMNCiAgICAgIG51bWVyaWNfdmFsdWUgPC0gc3VwcHJlc3NXYXJuaW5ncyhhcy5udW1lcmljKHZhbHVlKSkgICMgQ29udmVydCB0byBudW1lcmljDQogICAgICBpZmVsc2UoDQogICAgICAgICFpcy5uYShudW1lcmljX3ZhbHVlKSwgDQogICAgICAgIHBhc3RlMChmb3JtYXQocm91bmQobnVtZXJpY192YWx1ZSoxMDAsIDIpLCBiaWcubWFyayA9ICIsIiwgc2NpZW50aWZpYyA9IEZBTFNFKSwgIiUiKSwgICMgRm9ybWF0IHRvIDIgZGVjaW1hbCBwbGFjZXMgYW5kIGFkZCBjb21tYXMNCiAgICAgICAgLg0KICAgICAgKQ0KICAgIH0pDQogICkgJT4lDQogIGFycmFuZ2UoZGVzYyhgRGF0ZWApKSAgIyBTb3J0IGJ5IERhdGUgZnJvbSBuZXdlc3QgdG8gb2xkZXN0DQoNCiMgQ3JlYXRlIG1zZnRfcmF3X2dyOiBDR1INCm1zZnRfcmF3X2NnciA8LSBtc2Z0X3Jhd19nciAlPiUNCiAgc2VsZWN0KGBEYXRlYCwgYENsb3NlYCwgYDEtWWVhciBDQUdSYCwgY29udGFpbnMgKCJDR1IiKSkNCg0KIyBDcmVhdGUgbXNmdF9yYXdfZ3I6IENBR1INCm1zZnRfcmF3X2NhZ3IgPC0gbXNmdF9yYXdfZ3IgJT4lDQogIHNlbGVjdChgRGF0ZWAsIGBDbG9zZWAsIGNvbnRhaW5zICgiQ0FHUiIpKQ0KDQojIERpc3BsYXkgYm90aCB0YWJsZXMgZm9yIGNvbmZpcm1hdGlvbg0KaW50ZXJhY3RpdmVfcHJpbnQobXNmdF9yYXdfY2dyKQ0KaW50ZXJhY3RpdmVfcHJpbnQobXNmdF9yYXdfY2FncikNCg0KIyBPcHRpb25hbDogUHJpbnQgdGFibGUgc3VtbWFyaWVzDQppbnRlcmFjdGl2ZV9zdHIobXNmdF9yYXdfY2dyKQ0KaW50ZXJhY3RpdmVfc3RyKG1zZnRfcmF3X2NhZ3IpDQoNCiMgRGlzcGxheSBjYXB0aW9ucyBmb3IgZWFjaCB0YWJsZQ0KIyBjYXQoIlxuXG4jIyMjIEN1bXVsYXRpdmUgR3Jvd3RoIFJhdGVzICgiLCBtaW5feWVhciwgIi0iLCBtYXhfeWVhciwgIilcbiIsIHNlcCA9ICIiKQ0KIyBmb3JtYXRfZXF1YWxfd2lkdGgobXNmdF9yYXdfY2dyKQ0KDQpjYXQoIlxuXG4jIyMjIENvbXBvdW5kIEF2ZXJhZ2UgR3Jvd3RoIFJhdGVzICgiLCBtaW5feWVhciwgIi0iLCBtYXhfeWVhciwgIilcbiIsIHNlcCA9ICIiKQ0KZm9ybWF0X2VxdWFsX3dpZHRoKG1zZnRfcmF3X2NhZ3IpDQoNCiMgVmlldyhtc2Z0X3Jhd19jYWdyKQ0KIyBjb2xuYW1lcyhtc2Z0X3Jhd19jYWdyKQ0KaW50ZXJhY3RpdmVfc3RyKG1zZnRfcmF3X2NhZ3IpDQoNCg0KYGBgDQoNCiMjIyBTdW1tYXJ5DQoNCmBgYHtyIG1zZnRfcmF3X2NhZ3Jfc3VtbWFyeSwgZXZhbD1UUlVFLCBlY2hvPUZBTFNFfQ0KDQppbnRlcmFjdGl2ZV9zdHIobXNmdF9yYXdfY2FncikNCg0KIyBMb2FkIG5lY2Vzc2FyeSBsaWJyYXJpZXMNCmxpYnJhcnkoZHBseXIpDQpsaWJyYXJ5KHRpYmJsZSkNCg0KIyBEZWZpbmUgYSBoZWxwZXIgZnVuY3Rpb24gdG8gY2xlYW4gYW5kIGNvbnZlcnQgcGVyY2VudGFnZXMNCmNsZWFuX3BlcmNlbnRhZ2UgPC0gZnVuY3Rpb24oY29sdW1uKSB7DQogIGFzLm51bWVyaWMoZ3N1YigiJSIsICIiLCBjb2x1bW4pKQ0KfQ0KDQojIERlZmluZSB0aGUgc3RhdGlzdGljIG5hbWVzIGZvciB0aGUgc3VtbWFyeSB0YWJsZQ0Kc3RhdGlzdGljX25hbWVzIDwtIGMoDQogICJDb3VudCBvZiBPYnNlcnZhdGlvbnMiLCANCiAgIk1lYW4iLCANCiAgIk1lZGlhbiIsDQogICJTdGFuZGFyZCBEZXZpYXRpb24gKFZvbGF0aWxpdHkpIiwgDQogICJNaW4gQ0FHUiBSYW5nZSAoQ0FHUiAtIFNEKSIsDQogICJNYXggQ0FHUiBSYW5nZSAoQ0FHUiArIFNEKSIsDQogICJNaW5pbXVtIiwgDQogICJNYXhpbXVtIiwgDQogICJQZXJjZW50IEFib3ZlIEluZmxhdGlvbiBUYXJnZXQiLCANCiAgIlBlcmNlbnQgQWJvdmUgQ29uc2VydmF0aXZlIFRhcmdldCIsIA0KICAiUGVyY2VudCBBYm92ZSBNb2RlcmF0ZSBUYXJnZXQiLCANCiAgIlBlcmNlbnQgQWJvdmUgQWdncmVzc2l2ZSBUYXJnZXQiDQopDQoNCiMgQWRqdXN0IHRoZSBmaXJzdCByb3cncyBEYXRlIGFuZCBjbGVhbiB1cCBDQUdSIGNvbHVtbnMNCm1zZnRfcmF3X2NhZ3IgPC0gbXNmdF9yYXdfY2FnciAlPiUNCiAgc2xpY2UoLTEpICU+JSAjIFJlbW92ZSB0aGUgZmlyc3Qgcm93DQogIG11dGF0ZSgNCiAgICAjIERhdGUgPSBpZmVsc2Uocm93X251bWJlcigpID09IDEsICIyMDI1LTAxLTAxIiwgRGF0ZSksDQogICAgRGF0ZSA9IGFzLm51bWVyaWMoZm9ybWF0KGFzLkRhdGUoRGF0ZSksICIlWSIpKSwNCiAgICBgMS1ZZWFyIENBR1JgID0gY2xlYW5fcGVyY2VudGFnZShgMS1ZZWFyIENBR1JgKSwNCiAgICBgNS1ZZWFyIENBR1JgID0gY2xlYW5fcGVyY2VudGFnZShgNS1ZZWFyIENBR1JgKSwNCiAgICBgMTAtWWVhciBDQUdSYCA9IGNsZWFuX3BlcmNlbnRhZ2UoYDEwLVllYXIgQ0FHUmApLA0KICAgIGAyMC1ZZWFyIENBR1JgID0gY2xlYW5fcGVyY2VudGFnZShgMjAtWWVhciBDQUdSYCksDQogICAgYDMwLVllYXIgQ0FHUmAgPSBjbGVhbl9wZXJjZW50YWdlKGAzMC1ZZWFyIENBR1JgKQ0KICApDQoNCiMgRnVuY3Rpb24gdG8gY2FsY3VsYXRlIHN0YXRpc3RpY3MgZm9yIGEgZ2l2ZW4gZGF0YXNldA0KY2FsY19zdGF0cyA8LSBmdW5jdGlvbihkYXRhKSB7DQogIGlmIChzdW0oIWlzLm5hKGRhdGEpKSA8IDIpIHJldHVybihyZXAoTkEsIGxlbmd0aChzdGF0aXN0aWNfbmFtZXMpKSkgICMgSGFuZGxlIGluc3VmZmljaWVudCBkYXRhDQoNCiAgY291bnRfb2JzZXJ2YXRpb25zIDwtIHN1bSghaXMubmEoZGF0YSkpDQogIG1lYW5fdmFsdWUgPC0gcm91bmQobWVhbihkYXRhLCBuYS5ybSA9IFRSVUUpLCAyKQ0KICBtZWRpYW5fdmFsdWUgPC0gcm91bmQobWVkaWFuKGRhdGEsIG5hLnJtID0gVFJVRSksIDIpDQogIHNkX3ZhbHVlIDwtIHJvdW5kKHNkKGRhdGEsIG5hLnJtID0gVFJVRSksIDIpDQogIG1pbl9jYWdyX3JhbmdlIDwtIHJvdW5kKGNhZ3JfdmFsdWUgLSBzZF92YWx1ZSwgMikNCiAgbWF4X2NhZ3JfcmFuZ2UgPC0gcm91bmQoY2Fncl92YWx1ZSArIHNkX3ZhbHVlLCAyKQ0KICBtaW5fdmFsdWUgPC0gcm91bmQobWluKGRhdGEsIG5hLnJtID0gVFJVRSksIDIpDQogIG1heF92YWx1ZSA8LSByb3VuZChtYXgoZGF0YSwgbmEucm0gPSBUUlVFKSwgMikNCiAgDQogICMgRGVmaW5lIGluZmxhdGlvbiBhbmQgZ3Jvd3RoIHRhcmdldHMNCiAgdGFyZ2V0X2luZmxhdGlvbiA8LSAyICAjIEV4YW1wbGUgdGFyZ2V0IGZvciBpbmZsYXRpb24NCiAgdGFyZ2V0X2NvbnNlcnZhdGl2ZSA8LSAzICsgdGFyZ2V0X2luZmxhdGlvbg0KICB0YXJnZXRfbW9kZXJhdGUgPC0gNSArIHRhcmdldF9pbmZsYXRpb24NCiAgdGFyZ2V0X2FnZ3Jlc3NpdmUgPC0gMTAgKyB0YXJnZXRfaW5mbGF0aW9uDQogIA0KICBhYm92ZV90YXJnZXRfaW5mbGF0aW9uIDwtIHN1bShkYXRhID49IHRhcmdldF9pbmZsYXRpb24sIG5hLnJtID0gVFJVRSkNCiAgYWJvdmVfdGFyZ2V0X2NvbnNlcnZhdGl2ZSA8LSBzdW0oZGF0YSA+PSB0YXJnZXRfY29uc2VydmF0aXZlLCBuYS5ybSA9IFRSVUUpDQogIGFib3ZlX3RhcmdldF9tb2RlcmF0ZSA8LSBzdW0oZGF0YSA+PSB0YXJnZXRfbW9kZXJhdGUsIG5hLnJtID0gVFJVRSkNCiAgYWJvdmVfdGFyZ2V0X2FnZ3Jlc3NpdmUgPC0gc3VtKGRhdGEgPj0gdGFyZ2V0X2FnZ3Jlc3NpdmUsIG5hLnJtID0gVFJVRSkNCiAgDQogIHBlcmNlbnRfYWJvdmVfdGFyZ2V0X2NvbnNlcnZhdGl2ZSA8LSByb3VuZCgoYWJvdmVfdGFyZ2V0X2NvbnNlcnZhdGl2ZSAvIGNvdW50X29ic2VydmF0aW9ucykgKiAxMDAsIDIpDQogIHBlcmNlbnRfYWJvdmVfdGFyZ2V0X2luZmxhdGlvbiA8LSByb3VuZCgoYWJvdmVfdGFyZ2V0X2luZmxhdGlvbiAvIGNvdW50X29ic2VydmF0aW9ucykgKiAxMDAsIDIpDQogIHBlcmNlbnRfYWJvdmVfdGFyZ2V0X21vZGVyYXRlIDwtIHJvdW5kKChhYm92ZV90YXJnZXRfbW9kZXJhdGUgLyBjb3VudF9vYnNlcnZhdGlvbnMpICogMTAwLCAyKQ0KICBwZXJjZW50X2Fib3ZlX3RhcmdldF9hZ2dyZXNzaXZlIDwtIHJvdW5kKChhYm92ZV90YXJnZXRfYWdncmVzc2l2ZSAvIGNvdW50X29ic2VydmF0aW9ucykgKiAxMDAsIDIpDQogIA0KICBjKA0KICAgIGNvdW50X29ic2VydmF0aW9ucywgDQogICAgcGFzdGUwKG1lYW5fdmFsdWUsICIlIiksDQogICAgcGFzdGUwKG1lZGlhbl92YWx1ZSwgIiUiKSwNCiAgICBwYXN0ZTAoc2RfdmFsdWUsICIlIiksDQogICAgcGFzdGUwKG1pbl9jYWdyX3JhbmdlLCAiJSIpLA0KICAgIHBhc3RlMChtYXhfY2Fncl9yYW5nZSwgIiUiKSwNCiAgICBwYXN0ZTAobWluX3ZhbHVlLCAiJSIpLA0KICAgIHBhc3RlMChtYXhfdmFsdWUsICIlIiksDQogICAgcGFzdGUwKHBlcmNlbnRfYWJvdmVfdGFyZ2V0X2luZmxhdGlvbiwgIiUiKSwNCiAgICBwYXN0ZTAocGVyY2VudF9hYm92ZV90YXJnZXRfY29uc2VydmF0aXZlLCAiJSIpLCANCiAgICBwYXN0ZTAocGVyY2VudF9hYm92ZV90YXJnZXRfbW9kZXJhdGUsICIlIiksIA0KICAgIHBhc3RlMChwZXJjZW50X2Fib3ZlX3RhcmdldF9hZ2dyZXNzaXZlLCAiJSIpDQogICkNCn0NCg0KIyBDb2x1bW5zIHRvIGNhbGN1bGF0ZSBDQUdSIHN0YXRpc3RpY3MNCmNhZ3JfY29sdW1ucyA8LSBjKCIxLVllYXIgQ0FHUiIsICI1LVllYXIgQ0FHUiIsICIxMC1ZZWFyIENBR1IiLCAiMjAtWWVhciBDQUdSIiwgIjMwLVllYXIgQ0FHUiIpDQpleGlzdGluZ19jYWdyX2NvbHVtbnMgPC0gaW50ZXJzZWN0KGNhZ3JfY29sdW1ucywgbmFtZXMobXNmdF9yYXdfY2FncikpDQoNCiMgQ2FsY3VsYXRlIHN0YXRzIGZvciBlYWNoIENBR1IgY29sdW1uDQpjYWdyX3N0YXRzX2xpc3QgPC0gbGFwcGx5KG1zZnRfcmF3X2NhZ3JbZXhpc3RpbmdfY2Fncl9jb2x1bW5zXSwgY2FsY19zdGF0cykNCg0KIyBDb21waWxlIGludG8gYSBzdW1tYXJ5IGRhdGEgZnJhbWUNCm1zZnRfcmF3X2NhZ3Jfc3VtbWFyeSA8LSBhcy5kYXRhLmZyYW1lKGRvLmNhbGwoY2JpbmQsIGNhZ3Jfc3RhdHNfbGlzdCkpDQpyb3duYW1lcyhtc2Z0X3Jhd19jYWdyX3N1bW1hcnkpIDwtIHN0YXRpc3RpY19uYW1lcw0KDQoNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQojIyBTQVZFIFZBTFVFUyBGT1IgSU4tTElORSBDT0RFDQoNCiMgRGVmaW5lIHRoZSBtYXBwaW5nIG9mIHJvdyBuYW1lcyB0byB2YXJpYWJsZSBuYW1lcw0Kcm93X3RvX3Zhcl9uYW1lIDwtIGMoDQogICJDb3VudCBvZiBPYnNlcnZhdGlvbnMiID0gImNvdW50X29ic2VydmF0aW9ucyIsDQogICJNZWFuIiA9ICJtZWFuX3ZhbHVlIiwNCiAgIk1lZGlhbiIgPSAibWVkaWFuX3ZhbHVlIiwNCiAgIlN0YW5kYXJkIERldmlhdGlvbiAoVm9sYXRpbGl0eSkiID0gInNkX3ZhbHVlIiwNCiAgIk1pbiBDQUdSIFJhbmdlIChDQUdSIC0gU0QpIiA9ICJtaW5fY2Fncl9yYW5nZSIsDQogICJNYXggQ0FHUiBSYW5nZSAoQ0FHUiArIFNEKSIgPSAibWF4X2NhZ3JfcmFuZ2UiLA0KICAiTWluaW11bSIgPSAibWluX3ZhbHVlIiwNCiAgIk1heGltdW0iID0gIm1heF92YWx1ZSIsDQogICJQZXJjZW50IEFib3ZlIEluZmxhdGlvbiBUYXJnZXQiID0gInBlcmNlbnRfYWJvdmVfdGFyZ2V0X2luZmxhdGlvbiIsDQogICJQZXJjZW50IEFib3ZlIENvbnNlcnZhdGl2ZSBUYXJnZXQiID0gInBlcmNlbnRfYWJvdmVfdGFyZ2V0X2NvbnNlcnZhdGl2ZSIsDQogICJQZXJjZW50IEFib3ZlIE1vZGVyYXRlIFRhcmdldCIgPSAicGVyY2VudF9hYm92ZV90YXJnZXRfbW9kZXJhdGUiLA0KICAiUGVyY2VudCBBYm92ZSBBZ2dyZXNzaXZlIFRhcmdldCIgPSAicGVyY2VudF9hYm92ZV90YXJnZXRfYWdncmVzc2l2ZSINCikNCg0KIyBGdW5jdGlvbiB0byBzYXZlIHN1bW1hcnkgdmFsdWVzIGR5bmFtaWNhbGx5DQpzYXZlX2NvbHVtbl92YWx1ZXMgPC0gZnVuY3Rpb24oc3VtbWFyeV9kZikgew0KICAjIEV4Y2x1ZGUgdGhlICJTdGF0aXN0aWMiIGFuZCAiT3ZlcmFsbCIgY29sdW1ucw0KICBjb2x1bW5zX3RvX3NhdmUgPC0gc2V0ZGlmZihuYW1lcyhzdW1tYXJ5X2RmKSwgYygiU3RhdGlzdGljIiwgIk92ZXJhbGwiKSkNCiAgDQogICMgSXRlcmF0ZSBvdmVyIGVhY2ggY29sdW1uDQogIGZvciAoY29sIGluIGNvbHVtbnNfdG9fc2F2ZSkgew0KICAgICMgRm9ybWF0IGNvbHVtbiBuYW1lIHRvIGxvd2VyY2FzZSBhbmQgcmVwbGFjZSBpbnZhbGlkIGNoYXJhY3RlcnMNCiAgICBjb2xfbmFtZSA8LSB0b2xvd2VyKGdzdWIoIlteYS16QS1aMC05XSIsICJfIiwgY29sKSkNCiAgICANCiAgICAjIEV4dHJhY3QgdmFsdWVzIGZvciB0aGUgY3VycmVudCBjb2x1bW4NCiAgICBjb2xfdmFsdWVzIDwtIHN1bW1hcnlfZGZbW2NvbF1dDQogICAgDQogICAgIyBTYXZlIGVhY2ggdmFsdWUgZHluYW1pY2FsbHkgdXNpbmcgdGhlIG1hcHBpbmcgZm9yIHJvdyBuYW1lcw0KICAgIGZvciAoaSBpbiBzZXFfYWxvbmcoY29sX3ZhbHVlcykpIHsNCiAgICAgICMgR2V0IHRoZSBjb3JyZXNwb25kaW5nIHZhcmlhYmxlIG5hbWUgZnJvbSB0aGUgbWFwcGluZw0KICAgICAgc3RhdF9uYW1lIDwtIHJvd190b192YXJfbmFtZVtyb3duYW1lcyhzdW1tYXJ5X2RmKVtpXV0NCiAgICAgIA0KICAgICAgaWYgKCFpcy5uYShzdGF0X25hbWUpKSB7ICAjIFNraXAgaWYgbm8gbWFwcGluZyBpcyBkZWZpbmVkDQogICAgICAgICMgQ3JlYXRlIHRoZSB2YXJpYWJsZSBuYW1lDQogICAgICAgIHZhcl9uYW1lIDwtIHBhc3RlMChzdGF0X25hbWUsICJfIiwgY29sX25hbWUpDQogICAgICAgIA0KICAgICAgICAjIEF0dGVtcHQgbnVtZXJpYyBjb252ZXJzaW9uIGZvciBkb3duc3RyZWFtIHVzZQ0KICAgICAgICB2YWx1ZSA8LSBzdXBwcmVzc1dhcm5pbmdzKGFzLm51bWVyaWMoZ3N1YigiJSIsICIiLCBjb2xfdmFsdWVzW2ldKSkpDQogICAgICAgIA0KICAgICAgICAjIEFzc2lnbiB0aGUgdmFsdWUgdG8gdGhlIGdsb2JhbCBlbnZpcm9ubWVudA0KICAgICAgICBhc3NpZ24odmFyX25hbWUsIHZhbHVlLCBlbnZpciA9IC5HbG9iYWxFbnYpDQogICAgICB9DQogICAgfQ0KICB9DQp9DQoNCiMgQXBwbHkgdGhlIGZ1bmN0aW9uIHRvIHNhdmUgdmFsdWVzIGZvciBhbGwgY29sdW1ucyBleGNlcHQgIk92ZXJhbGwiDQpzYXZlX2NvbHVtbl92YWx1ZXMobXNmdF9yYXdfY2Fncl9zdW1tYXJ5KQ0KDQojIEV4YW1wbGU6IEFjY2Vzc2luZyBkeW5hbWljYWxseSBjcmVhdGVkIHZhcmlhYmxlcw0KaW50ZXJhY3RpdmVfcHJpbnQobWVhbl92YWx1ZV8xX3llYXJfY2FncikgICMgU2hvdWxkIHByaW50IHRoZSBtZWFuIHZhbHVlIGZvciAxLVllYXIgQ0FHUg0KaW50ZXJhY3RpdmVfcHJpbnQocGVyY2VudF9hYm92ZV90YXJnZXRfaW5mbGF0aW9uXzVfeWVhcl9jYWdyKSAgIyBTaG91bGQgcHJpbnQgdGhlIHBlcmNlbnQgYWJvdmUgaW5mbGF0aW9uIHRhcmdldCBmb3IgNS1ZZWFyIENBR1INCmludGVyYWN0aXZlX3ByaW50KHNkX3ZhbHVlXzEwX3llYXJfY2FncikgICMgU2hvdWxkIHByaW50IHRoZSBzdGFuZGFyZCBkZXZpYXRpb24gZm9yIDEwLVllYXIgQ0FHUg0KDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KIyMgT1ZFUkFMTCBTVEFUSVNUSUNTIA0KbnVtZXJpY192YWx1ZXNfYWxsIDwtIGFzLm51bWVyaWModW5saXN0KG1zZnRfcmF3X2NhZ3JbZXhpc3RpbmdfY2Fncl9jb2x1bW5zXSwgdXNlLm5hbWVzID0gRkFMU0UpKQ0KbnVtZXJpY192YWx1ZXNfYWxsIDwtIG51bWVyaWNfdmFsdWVzX2FsbFshaXMubmEobnVtZXJpY192YWx1ZXNfYWxsKV0NCg0Kb3ZlcmFsbF9jb3VudF9vYnNlcnZhdGlvbnMgPC0gbGVuZ3RoKG51bWVyaWNfdmFsdWVzX2FsbCkNCm92ZXJhbGxfbWVhbl92YWx1ZSA8LSByb3VuZChtZWFuKG51bWVyaWNfdmFsdWVzX2FsbCksIDIpDQpvdmVyYWxsX21lZGlhbl92YWx1ZSA8LSByb3VuZChtZWRpYW4obnVtZXJpY192YWx1ZXNfYWxsKSwgMikNCm92ZXJhbGxfc2RfdmFsdWUgPC0gcm91bmQoc2QobnVtZXJpY192YWx1ZXNfYWxsKSwgMikNCm92ZXJhbGxfbWluX2NhZ3JfcmFuZ2UgPC0gcm91bmQoY2Fncl92YWx1ZSAtIG92ZXJhbGxfc2RfdmFsdWUsIDIpDQpvdmVyYWxsX21heF9jYWdyX3JhbmdlIDwtIHJvdW5kKGNhZ3JfdmFsdWUgKyBvdmVyYWxsX3NkX3ZhbHVlLCAyKQ0Kb3ZlcmFsbF9taW5fdmFsdWUgPC0gcm91bmQobWluKG51bWVyaWNfdmFsdWVzX2FsbCksIDIpDQpvdmVyYWxsX21heF92YWx1ZSA8LSByb3VuZChtYXgobnVtZXJpY192YWx1ZXNfYWxsKSwgMikNCg0Kb3ZlcmFsbF9hYm92ZV90YXJnZXRfaW5mbGF0aW9uIDwtIHN1bShudW1lcmljX3ZhbHVlc19hbGwgPj0gdGFyZ2V0X2luZmxhdGlvbiwgbmEucm0gPSBUUlVFKQ0Kb3ZlcmFsbF9hYm92ZV90YXJnZXRfY29uc2VydmF0aXZlIDwtIHN1bShudW1lcmljX3ZhbHVlc19hbGwgPj0gdGFyZ2V0X2NvbnNlcnZhdGl2ZSwgbmEucm0gPSBUUlVFKQ0Kb3ZlcmFsbF9hYm92ZV90YXJnZXRfbW9kZXJhdGUgPC0gc3VtKG51bWVyaWNfdmFsdWVzX2FsbCA+PSB0YXJnZXRfbW9kZXJhdGUsIG5hLnJtID0gVFJVRSkNCm92ZXJhbGxfYWJvdmVfdGFyZ2V0X2FnZ3Jlc3NpdmUgPC0gc3VtKG51bWVyaWNfdmFsdWVzX2FsbCA+PSB0YXJnZXRfYWdncmVzc2l2ZSwgbmEucm0gPSBUUlVFKQ0KDQpvdmVyYWxsX3BlcmNlbnRfYWJvdmVfdGFyZ2V0X2NvbnNlcnZhdGl2ZSA8LSByb3VuZCgob3ZlcmFsbF9hYm92ZV90YXJnZXRfY29uc2VydmF0aXZlIC8gb3ZlcmFsbF9jb3VudF9vYnNlcnZhdGlvbnMpICogMTAwLCAyKQ0Kb3ZlcmFsbF9wZXJjZW50X2Fib3ZlX3RhcmdldF9pbmZsYXRpb24gPC0gcm91bmQoKG92ZXJhbGxfYWJvdmVfdGFyZ2V0X2luZmxhdGlvbiAvIG92ZXJhbGxfY291bnRfb2JzZXJ2YXRpb25zKSAqIDEwMCwgMikNCm92ZXJhbGxfcGVyY2VudF9hYm92ZV90YXJnZXRfbW9kZXJhdGUgPC0gcm91bmQoKG92ZXJhbGxfYWJvdmVfdGFyZ2V0X21vZGVyYXRlIC8gb3ZlcmFsbF9jb3VudF9vYnNlcnZhdGlvbnMpICogMTAwLCAyKQ0Kb3ZlcmFsbF9wZXJjZW50X2Fib3ZlX3RhcmdldF9hZ2dyZXNzaXZlIDwtIHJvdW5kKChvdmVyYWxsX2Fib3ZlX3RhcmdldF9hZ2dyZXNzaXZlIC8gb3ZlcmFsbF9jb3VudF9vYnNlcnZhdGlvbnMpICogMTAwLCAyKQ0KDQptc2Z0X3Jhd19jYWdyX3N1bW1hcnkkT3ZlcmFsbCA8LSBjKA0KICBvdmVyYWxsX2NvdW50X29ic2VydmF0aW9ucywNCiAgcGFzdGUwKG92ZXJhbGxfbWVhbl92YWx1ZSwgIiUiKSwNCiAgcGFzdGUwKG92ZXJhbGxfbWVkaWFuX3ZhbHVlLCAiJSIpLA0KICBwYXN0ZTAob3ZlcmFsbF9zZF92YWx1ZSwgIiUiKSwNCiAgcGFzdGUwKG92ZXJhbGxfbWluX2NhZ3JfcmFuZ2UsICIlIiksDQogIHBhc3RlMChvdmVyYWxsX21heF9jYWdyX3JhbmdlLCAiJSIpLA0KICBwYXN0ZTAob3ZlcmFsbF9taW5fdmFsdWUsICIlIiksDQogIHBhc3RlMChvdmVyYWxsX21heF92YWx1ZSwgIiUiKSwNCiAgcGFzdGUwKG92ZXJhbGxfcGVyY2VudF9hYm92ZV90YXJnZXRfaW5mbGF0aW9uLCAiJSIpLA0KICBwYXN0ZTAob3ZlcmFsbF9wZXJjZW50X2Fib3ZlX3RhcmdldF9jb25zZXJ2YXRpdmUsICIlIiksDQogIHBhc3RlMChvdmVyYWxsX3BlcmNlbnRfYWJvdmVfdGFyZ2V0X21vZGVyYXRlLCAiJSIpLA0KICBwYXN0ZTAob3ZlcmFsbF9wZXJjZW50X2Fib3ZlX3RhcmdldF9hZ2dyZXNzaXZlLCAiJSIpDQopDQoNCiMgQ29udmVydCByb3cgbmFtZXMgdG8gYSBjb2x1bW4NCm1zZnRfcmF3X2NhZ3Jfc3VtbWFyeSA8LSB0aWJibGU6OnJvd25hbWVzX3RvX2NvbHVtbihtc2Z0X3Jhd19jYWdyX3N1bW1hcnksIHZhciA9ICJTdGF0aXN0aWMiKQ0KDQojIEVuc3VyZSBhbGwgY29sdW1ucyBhcmUgY2hhcmFjdGVyDQptc2Z0X3Jhd19jYWdyX3N1bW1hcnkgPC0gbXNmdF9yYXdfY2Fncl9zdW1tYXJ5ICU+JQ0KICBtdXRhdGUoYWNyb3NzKGV2ZXJ5dGhpbmcoKSwgYXMuY2hhcmFjdGVyKSkNCg0KIyBEaXNwbGF5IHRoZSBzdW1tYXJ5IHRhYmxlDQpjYXQoIlxuIyMjIyBDb21wb3VuZCBBdmVyYWdlIEdyb3d0aCBSYXRlcyAoIiwgbWluX3llYXIsICItIiwgbWF4X3llYXIsICIpXG4iLCBzZXAgPSAiIikNCmludGVyYWN0aXZlX3N0cihtc2Z0X3Jhd19jYWdyX3N1bW1hcnkpDQpmb3JtYXRfdW5zcGVjaWZpZWRfd2lkdGgobXNmdF9yYXdfY2Fncl9zdW1tYXJ5KQ0KDQpgYGANCg0KKipgciBtaW5feWVhcmAtYHIgbWF4X3llYXJgIFN1bW1hcnk6KiogVGhlIDEtWWVhciBDQUdSIGV4aGliaXRzIHRoZSBgciBpZihtZWFuX3ZhbHVlXzFfeWVhcl9jYWdyID09IG1heChjKG1lYW5fdmFsdWVfMV95ZWFyX2NhZ3IsIG1lYW5fdmFsdWVfNV95ZWFyX2NhZ3IsIG1lYW5fdmFsdWVfMTBfeWVhcl9jYWdyLCBtZWFuX3ZhbHVlXzIwX3llYXJfY2FnciwgbWVhbl92YWx1ZV8zMF95ZWFyX2NhZ3IpKSkgImhpZ2hlc3QgbWVhbiByZXR1cm4iIGVsc2UgaWYobWVhbl92YWx1ZV8xX3llYXJfY2FnciA9PSBtaW4oYyhtZWFuX3ZhbHVlXzFfeWVhcl9jYWdyLCBtZWFuX3ZhbHVlXzVfeWVhcl9jYWdyLCBtZWFuX3ZhbHVlXzEwX3llYXJfY2FnciwgbWVhbl92YWx1ZV8yMF95ZWFyX2NhZ3IsIG1lYW5fdmFsdWVfMzBfeWVhcl9jYWdyKSkpICJsb3dlc3QgbWVhbiByZXR1cm4iIGVsc2UgIm1lYW4gcmV0dXJuImAgYXQgYHIgbWVhbl92YWx1ZV8xX3llYXJfY2FncmAlLCBhbmQgYHIgaWYoc2RfdmFsdWVfMV95ZWFyX2NhZ3IgPT0gbWF4KGMoc2RfdmFsdWVfMV95ZWFyX2NhZ3IsIHNkX3ZhbHVlXzVfeWVhcl9jYWdyLCBzZF92YWx1ZV8xMF95ZWFyX2NhZ3IsIHNkX3ZhbHVlXzIwX3llYXJfY2Fnciwgc2RfdmFsdWVfMzBfeWVhcl9jYWdyKSkpICJ0aGUgZ3JlYXRlc3Qgdm9sYXRpbGl0eSB3aXRoIGEiIGVsc2UgaWYoc2RfdmFsdWVfMV95ZWFyX2NhZ3IgPT0gbWluKGMoc2RfdmFsdWVfMV95ZWFyX2NhZ3IsIHNkX3ZhbHVlXzVfeWVhcl9jYWdyLCBzZF92YWx1ZV8xMF95ZWFyX2NhZ3IsIHNkX3ZhbHVlXzIwX3llYXJfY2Fnciwgc2RfdmFsdWVfMzBfeWVhcl9jYWdyKSkpICJ0aGUgbGVhc3Qgdm9sYXRpbGl0eSB3aXRoIGEiIGVsc2UgImEiYCBzdGFuZGFyZCBkZXZpYXRpb24gb2YgYHIgc2RfdmFsdWVfMV95ZWFyX2NhZ3JgJS4gQXMgdGhlIGludmVzdG1lbnQgaG9yaXpvbiBleHRlbmRzIHRvIDUsIDEwLCAyMCwgYW5kIDMwIHllYXJzLCB0aGUgbWVhbiByZXR1cm5zIGByIGlmKG1lYW5fdmFsdWVfMV95ZWFyX2NhZ3IgPCBtZWFuKGMobWVhbl92YWx1ZV81X3llYXJfY2FnciwgbWVhbl92YWx1ZV8xMF95ZWFyX2NhZ3IsIG1lYW5fdmFsdWVfMjBfeWVhcl9jYWdyLCBtZWFuX3ZhbHVlXzMwX3llYXJfY2FncikpKSAiaW5jcmVhc2UiIGVsc2UgImRlY3JlYXNlImAsIHJhbmdpbmcgZnJvbSBgciBtZWFuX3ZhbHVlXzVfeWVhcl9jYWdyYCUgdG8gYHIgbWVhbl92YWx1ZV8zMF95ZWFyX2NhZ3JgJSwgd2hpbGUgdm9sYXRpbGl0eSBgciBpZihzZF92YWx1ZV8xX3llYXJfY2FnciA8IG1lYW4oYyhzZF92YWx1ZV81X3llYXJfY2Fnciwgc2RfdmFsdWVfMTBfeWVhcl9jYWdyLCBzZF92YWx1ZV8yMF95ZWFyX2NhZ3IsIHNkX3ZhbHVlXzMwX3llYXJfY2FncikpKSAicmlzZXMiIGVsc2UgImRpbWluaXNoZXMiYCwgd2l0aCBzdGFuZGFyZCBkZXZpYXRpb25zIGByIGlmKHNkX3ZhbHVlXzFfeWVhcl9jYWdyID4gc2RfdmFsdWVfMzBfeWVhcl9jYWdyKSAiZHJvcHBpbmciIGVsc2UgInJpc2luZyJgIGZyb20gYHIgc2RfdmFsdWVfNV95ZWFyX2NhZ3JgJSB0byBgciBzZF92YWx1ZV8zMF95ZWFyX2NhZ3JgJS4gVGhpcyB0cmVuZCBpbmRpY2F0ZXMgdGhhdCBsb25nZXIgaW52ZXN0bWVudCBwZXJpb2RzIHRlbmQgdG8gb2ZmZXIgYHIgaWYoc2RfdmFsdWVfMV95ZWFyX2NhZ3IgPiBzZF92YWx1ZV8zMF95ZWFyX2NhZ3IpICJtb3JlIHN0YWJsZSIgZWxzZSAibGVzcyBzdGFibGUiYCByZXR1cm5zLiBGdXJ0aGVybW9yZSwgdGhlIHBlcmNlbnRhZ2Ugb2YgcGVyaW9kcyBleGNlZWRpbmcgdGhlIGluZmxhdGlvbiB0YXJnZXQgYHIgaWYocGVyY2VudF9hYm92ZV90YXJnZXRfaW5mbGF0aW9uXzFfeWVhcl9jYWdyIDwgcGVyY2VudF9hYm92ZV90YXJnZXRfaW5mbGF0aW9uXzMwX3llYXJfY2FncikgImluY3JlYXNlcyIgZWxzZSAiZGVjcmVhc2VzImAgd2l0aCBsb25nZXIgZHVyYXRpb25zLCBmcm9tIGByIHBlcmNlbnRfYWJvdmVfdGFyZ2V0X2luZmxhdGlvbl8xX3llYXJfY2FncmAlIGluIHRoZSAxLVllYXIgQ0FHUiB0byBgciBwZXJjZW50X2Fib3ZlX3RhcmdldF9pbmZsYXRpb25fMzBfeWVhcl9jYWdyYCUgaW4gdGhlIDMwLVllYXIgQ0FHUiwgdW5kZXJzY29yaW5nIE1TRlQncyBgciBpZihwZXJjZW50X2Fib3ZlX3RhcmdldF9pbmZsYXRpb25fMV95ZWFyX2NhZ3IgPCBwZXJjZW50X2Fib3ZlX3RhcmdldF9pbmZsYXRpb25fMzBfeWVhcl9jYWdyKSAiZWZmZWN0aXZlbmVzcyIgZWxzZSAiaW5lZmZlY3RpdmVuZXNzImAgYXMgYSBoZWRnZSBhZ2FpbnN0IGluZmxhdGlvbiBvdmVyIGV4dGVuZGVkIHRpbWVmcmFtZXMuIFdpdGggYW4gb3ZlcmFsbCBwZXJjZW50YWdlIG9mIGByIG92ZXJhbGxfcGVyY2VudF9hYm92ZV90YXJnZXRfYWdncmVzc2l2ZWAlIGV4Y2VlZGluZyB0aGUgYWdncmVzc2l2ZSB0YXJnZXQgKGByIHRhcmdldF9hZ2dyZXNzaXZlYCUgYW5udWFsaXplZCByZXR1cm5zIHdpdGggYHIgdGFyZ2V0X2luZmxhdGlvbmAlIGluZmxhdGlvbiksIE1TRlQgYHIgaWYob3ZlcmFsbF9wZXJjZW50X2Fib3ZlX3RhcmdldF9hZ2dyZXNzaXZlID4gNTApICJoYXMsIG92ZXIgdGhpcyB0aW1lIHBlcmlvZCwgcHJvdmVuIHRvIGJlIGEgc3Ryb25nIiBlbHNlIGlmKG92ZXJhbGxfcGVyY2VudF9hYm92ZV90YXJnZXRfYWdncmVzc2l2ZSA+IDQwKSAiaGFzLCBvdmVyIHRoaXMgdGltZSBwZXJpb2QsIGRlbW9uc3RyYXRlZCBpdHNlbGYgYXMgYSB2aWFibGUiIGVsc2UgImFwcGVhcnMsIG92ZXIgdGhpcyB0aW1lIHBlcmlvZCwgdG8gYmUgYSBsZXNzIHN1aXRhYmxlImAgb3B0aW9uIGZvciBhIGhpZ2gtcmV0dXJuaW5nIGxvbmctdGVybSBpbnZlc3RtZW50Lg0KDQojIyMgR3JhcGgNCg0KIyMjIyBBbGwgUGVyaW9kcw0KDQoNCmBgYHtyIG1zZnRfcmF3X2NhZ3JfZ3JhcGhzX2FsbCwgZmlnLndpZHRoPTEwLCBmaWcuaGVpZ2h0PTcsIGV2YWw9VFJVRSwgZWNobz1GQUxTRX0NCg0KY2F0KCJcblxuIyMjIyBDb21wb3VuZCBBdmVyYWdlIEdyb3d0aCBSYXRlcyBBY3Jvc3MgUGVyaW9kcyBcbiIpDQoNCiMgTG9hZCBuZWNlc3NhcnkgbGlicmFyaWVzDQpsaWJyYXJ5KGdncGxvdDIpDQpsaWJyYXJ5KGRwbHlyKQ0KDQoNCiMgQ29udmVydCBjb2x1bW5zIHRvIG51bWVyaWMgZm9yIHBsb3R0aW5nIGlmIG5lZWRlZA0KbXNmdF9yYXdfY2FnciA8LSBtc2Z0X3Jhd19jYWdyICU+JQ0KICBtdXRhdGUoDQogICAgYERhdGVgID0gYXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIoYERhdGVgKSksICAjIEVuc3VyZSBEYXRlIGlzIG51bWVyaWMNCiAgICBgMS1ZZWFyIENBR1JgID0gYXMubnVtZXJpYyhnc3ViKCIlIiwgIiIsIGAxLVllYXIgQ0FHUmApKSwNCiAgICBgNS1ZZWFyIENBR1JgID0gYXMubnVtZXJpYyhnc3ViKCIlIiwgIiIsIGA1LVllYXIgQ0FHUmApKSwNCiAgICBgMTAtWWVhciBDQUdSYCA9IGFzLm51bWVyaWMoZ3N1YigiJSIsICIiLCBgMTAtWWVhciBDQUdSYCkpLA0KICAgIGAyMC1ZZWFyIENBR1JgID0gYXMubnVtZXJpYyhnc3ViKCIlIiwgIiIsIGAyMC1ZZWFyIENBR1JgKSksDQogICAgYDMwLVllYXIgQ0FHUmAgPSBhcy5udW1lcmljKGdzdWIoIiUiLCAiIiwgYDMwLVllYXIgQ0FHUmApKQ0KICApDQoNCiMgUmVzaGFwZSB0aGUgZGF0YSBpbnRvIGxvbmcgZm9ybWF0IGZvciBlYXN5IHBsb3R0aW5nIG9mIG11bHRpcGxlIGxpbmVzIGFuZCBzZXQgdGhlIGZhY3RvciBvcmRlcg0KbnJ0X2xvbmcgPC0gbXNmdF9yYXdfY2FnciAlPiUNCiAgcGl2b3RfbG9uZ2VyKGNvbHMgPSBjKGAxLVllYXIgQ0FHUmAsIGA1LVllYXIgQ0FHUmAsIGAxMC1ZZWFyIENBR1JgLCBgMjAtWWVhciBDQUdSYCwgYDMwLVllYXIgQ0FHUmApLA0KICAgICAgICAgICAgICAgbmFtZXNfdG8gPSAiQ0FHUl9QZXJpb2QiLA0KICAgICAgICAgICAgICAgdmFsdWVzX3RvID0gIkNBR1JfVmFsdWUiKSAlPiUNCiAgbXV0YXRlKENBR1JfUGVyaW9kID0gZmFjdG9yKENBR1JfUGVyaW9kLCBsZXZlbHMgPSBjKCIxLVllYXIgQ0FHUiIsICI1LVllYXIgQ0FHUiIsICIxMC1ZZWFyIENBR1IiLCAiMjAtWWVhciBDQUdSIiwgIjMwLVllYXIgQ0FHUiIpKSkNCg0KIyBBc3NpZ24gY29sb3JzIGR5bmFtaWNhbGx5IGJhc2VkIG9uIHRoZSBvcmRlciBvZiBDQUdSX1BlcmlvZCBpbiB0aGUgZGF0YQ0KIyBNYXRjaCB0aGUgdW5pcXVlIGxldmVscyBvZiBDQUdSX1BlcmlvZCB3aXRoIGNvbG9ycyBmcm9tIGNvbG9yc19nZW5lcmFsX2RhcmsNCnVuaXF1ZV90eXBlcyA8LSB1bmlxdWUobnJ0X2xvbmckQ0FHUl9QZXJpb2QpDQpjdXN0b21fY29sb3JzIDwtIHNldE5hbWVzKGNvbG9yc19nZW5lcmFsX2RhcmtbMTpsZW5ndGgodW5pcXVlX3R5cGVzKV0sIHVuaXF1ZV90eXBlcykNCg0KIyBGaW5kIHRoZSBtaW5pbXVtIGFuZCBtYXhpbXVtIHgtdmFsdWUgaW4geW91ciBkYXRhDQptYXhfeCA8LSBtYXgoYXMuaW50ZWdlcihtc2Z0X3Jhd19jYWdyJERhdGUpLCBuYS5ybSA9IFRSVUUpDQptaW5feCA8LSBtaW4oYXMuaW50ZWdlcihtc2Z0X3Jhd19jYWdyJERhdGUpLCBuYS5ybSA9IFRSVUUpDQppbnRlcmFjdGl2ZV9wcmludChtYXhfeCkgICMgVGVzdA0KaW50ZXJhY3RpdmVfcHJpbnQobWluX3gpICAjIFRlc3QNCg0KIyBGaW5kIHRoZSBtaW5pbXVtIGFuZCBtYXhpbXVtIHllYXINCm1pbl95ZWFyIDwtIG1pbihtc2Z0X3Jhd19jYWdyJERhdGUsIG5hLnJtID0gVFJVRSkNCm1heF95ZWFyIDwtIG1heChtc2Z0X3Jhd19jYWdyJERhdGUsIG5hLnJtID0gVFJVRSkNCmludGVyYWN0aXZlX3ByaW50KG1pbl95ZWFyKQ0KaW50ZXJhY3RpdmVfcHJpbnQobWF4X3llYXIpDQoNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQojIyBQTE9UIEZVTEwgV0lUSE9VVCBMSU1JVFMNCg0KIyBEZWZpbmUgc3RhcnQgYW5kIGVuZCB5ZWFycw0Kc3RhcnRfeWVhciA8LSBhcy5udW1lcmljKG1pbl95ZWFyKQ0KZW5kX3llYXIgPC0gMjAyNA0KeWVhcl9yYW5nZSA8LSBlbmRfeWVhciAtIHN0YXJ0X3llYXIgKyAxICAjIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIHllYXJzDQoNCiMgRGVmaW5lIGJyZWFrcyByb3VuZGVkIGFwcHJvcHJpYXRlbHkNCmxpbWl0c19zdGFydF95ZWFyIDwtIGZsb29yKHN0YXJ0X3llYXIgLyA1KSAqIDUgICMgUm91bmQgZG93biB0byB0aGUgbmVhcmVzdCBtdWx0aXBsZSBvZiA1DQpsaW1pdHNfZW5kX3llYXIgPC0gY2VpbGluZyhlbmRfeWVhciAvIDUpICogNSAgICMgUm91bmQgdXAgdG8gdGhlIG5lYXJlc3QgbXVsdGlwbGUgb2YgNQ0KDQojIENyZWF0ZSBkeW5hbWljIHRpdGxlIGFuZCBjYXB0aW9uDQpkeW5hbWljX3RpdGxlIDwtIHBhc3RlMCgiUm9sbGluZyBDQUdScyBBY3Jvc3MgUGVyaW9kcyBPdmVyICIseWVhcl9yYW5nZSwgIiBZZWFycyAoIiwgc3RhcnRfeWVhciwgIi0iLCBlbmRfeWVhciwgIikiKQ0KZHluYW1pY19jYXB0aW9uIDwtIHBhc3RlMCgiTVNGVCBDb21wb3VuZCBBdmVyYWdlIEdyb3d0aCBSYXRlcyBBY3Jvc3MgUm9sbGluZyBQZXJpb2RzLCBEYXRhc2V0ICgiLCBtaW5feWVhciwgIi0iLCBtYXhfeWVhciwgIikiKQ0KDQojIENyZWF0ZSB0aGUgZnVsbCwgbm9uLWZpbHRlcmVkIHgtYXhpcyBwbG90IHdpdGggZHluYW1pYyB4IHBsYWNlbWVudCBmb3IgYW5ub3RhdGlvbnMNCnAxIDwtIGdncGxvdChucnRfbG9uZywgYWVzKHggPSBhcy5pbnRlZ2VyKERhdGUpLCB5ID0gQ0FHUl9WYWx1ZSwgY29sb3IgPSBDQUdSX1BlcmlvZCkpICsNCg0KICAjIEFkZCBzaGFkZWQgYXJlYXMgZm9yIGJhY2tncm91bmQgZWZmZWN0DQogIGdlb21fcmVjdChhZXMoeG1pbiA9IC1JbmYsIHhtYXggPSBJbmYsIHltaW4gPSB0YXJnZXRfYWdncmVzc2l2ZSwgeW1heCA9IEluZiksIGZpbGwgPSAibGlnaHRncmVlbiIsIGFscGhhID0gMC4wMTApICsNCiAgZ2VvbV9yZWN0KGFlcyh4bWluID0gLUluZiwgeG1heCA9IEluZiwgeW1pbiA9IHRhcmdldF9jb25zZXJ2YXRpdmUsIHltYXggPSB0YXJnZXRfYWdncmVzc2l2ZSksIGZpbGwgPSAib3JhbmdlIiwgYWxwaGEgPSAwLjAxKSArDQogIGdlb21fcmVjdChhZXMoeG1pbiA9IC1JbmYsIHhtYXggPSBJbmYsIHltaW4gPSAtSW5mLCB5bWF4ID0gdGFyZ2V0X2NvbnNlcnZhdGl2ZSksIGZpbGwgPSAibGlnaHRjb3JhbCIsIGFscGhhID0gMC4wMTApICsNCiAgDQogICMgUGxvdCBsaW5lcyBmb3IgZWFjaCBDQUdSIFBlcmlvZA0KICBnZW9tX2xpbmUoc2l6ZSA9IDEuMCwgYWxwaGEgPSAzLjApICsgICAgICAgIyBMaW5lIGZvciBlYWNoIENBR1INCiAgZ2VvbV9wb2ludChzaXplID0gMS4wLCBhbHBoYSA9IDMuMCkgKyAgICAgICAjIFBvaW50cyBmb3IgZWFjaCBDQUdSDQogIA0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSB0YXJnZXRfYWdncmVzc2l2ZSwgY29sb3IgPSAiZGFya2JsdWUiLCBsaW5ldHlwZSA9ICJzb2xpZCIpICsNCiAgIyBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSB0YXJnZXRfbW9kZXJhdGUsIGNvbG9yID0gImRhcmtibHVlIiwgbGluZXR5cGUgPSAic29saWQiKSArDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IHRhcmdldF9jb25zZXJ2YXRpdmUsIGNvbG9yID0gImRhcmtibHVlIiwgbGluZXR5cGUgPSAic29saWQiKSArDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IHRhcmdldF9pbmZsYXRpb24sIGNvbG9yID0gImRhcmtyZWQiLCBsaW5ldHlwZSA9ICJkYXNoZWQiKSArDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IGNhZ3JfdmFsdWUsIGNvbG9yID0gImRhcmtyZWQiLCBsaW5ldHlwZSA9ICJkYXNoZWQiKSArDQogIA0KICAjIER5bmFtaWMgcmlnaHQtYWxpZ25lZCBwbGFjZW1lbnQgZm9yIGFubm90YXRpb25zDQogIGFubm90YXRlKCJ0ZXh0IiwgeCA9IEluZiwgeSA9IHRhcmdldF9hZ2dyZXNzaXZlLCBsYWJlbCA9ICJBZ2dyZXNzaXZlIiwgDQogICAgICAgICAgIGhqdXN0ID0gMSwgdmp1c3QgPSAtMC41MCwgY29sb3IgPSAiZGFya2JsdWUiLCBzaXplID0gNCkgKw0KICAjIGFubm90YXRlKCJ0ZXh0IiwgeCA9IEluZiwgeSA9IHRhcmdldF9tb2RlcmF0ZSwgbGFiZWwgPSAiTW9kZXJhdGUiLCANCiAgIyAgICAgICAgIGhqdXN0ID0gMSwgdmp1c3QgPSAtMC41MCwgY29sb3IgPSAiZGFya2JsdWUiLCBzaXplID0gNCkgKw0KICBhbm5vdGF0ZSgidGV4dCIsIHggPSBJbmYsIHkgPSB0YXJnZXRfY29uc2VydmF0aXZlLCBsYWJlbCA9ICJDb25zZXJ2YXRpdmUiLCANCiAgICAgICAgICAgaGp1c3QgPSAxLCB2anVzdCA9IC0wLjUwLCBjb2xvciA9ICJkYXJrYmx1ZSIsIHNpemUgPSA0KSArDQogIGFubm90YXRlKCJ0ZXh0IiwgeCA9IEluZiwgeSA9IHRhcmdldF9pbmZsYXRpb24sIGxhYmVsID0gIkluZmxhdGlvbiIsIA0KICAgICAgICAgICBoanVzdCA9IDEsIHZqdXN0ID0gKzEuMTAsIGNvbG9yID0gImRhcmtyZWQiLCBzaXplID0gNCkgKw0KICBhbm5vdGF0ZSgidGV4dCIsIHggPSBJbmYsIHkgPSBjYWdyX3ZhbHVlLCBsYWJlbCA9ICJDQUdSIiwgDQogICAgICAgICAgIGhqdXN0ID0gMSwgdmp1c3QgPSAtMC41MCwgY29sb3IgPSAiZGFya3JlZCIsIHNpemUgPSA0KSArIA0KDQogIGxhYnMoDQogICAgdGl0bGUgPSBkeW5hbWljX3RpdGxlLA0KICAgIHggPSAiWWVhciIsDQogICAgeSA9ICJDQUdSIFZhbHVlICglKSIsDQogICAgY29sb3IgPSAiQ0FHUiBQZXJpb2QiLA0KICAgIGNhcHRpb24gPSBkeW5hbWljX2NhcHRpb24NCiAgICApICsNCiAgDQogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjdXN0b21fY29sb3JzKSArICAjIFNldCBjb2xvcnMgZm9yIGVhY2ggQ0FHUiBQZXJpb2QNCiAgc2NhbGVfeF9jb250aW51b3VzKA0KICAgIGxpbWl0cyA9IGMoc3RhcnRfeWVhciwgZW5kX3llYXIgKyAzKSwgDQogICAgYnJlYWtzID0gc2VxKGxpbWl0c19zdGFydF95ZWFyLCBsaW1pdHNfZW5kX3llYXIgLCA1KSkgKyAgIyBSZXN0cmljdCAmIFNldCBNYWpvciB4LWF4aXMgbGluZXMgZm9yIGVhY2ggeWVhcg0KICANCiAgdGhlbWVfbWluaW1hbCgpICsNCiAgdGhlbWUoDQogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSwgc2l6ZSA9IDIwKSwgICAgICAgICAjIExhcmdlciB0aXRsZSBmb250DQogICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCksICAgICAgICAgICAgICAgICAgICAjIExhcmdlciB4LWF4aXMgbGFiZWwgZm9udA0KICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQpLCAgICAgICAgICAgICAgICAgICAgIyBMYXJnZXIgeS1heGlzIGxhYmVsIGZvbnQNCiAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEsIHNpemUgPSAxNCksICAjIExhcmdlciB4LWF4aXMgdGV4dA0KICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCksICAgICAgICAgICAgICAgICAgICAgIyBMYXJnZXIgeS1heGlzIHRleHQNCiAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0KSwgICAgICAgICAgICAgICAgICAgICMgTGVnZW5kIHRpdGxlIHNpemUNCiAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIpLCAgICAgICAgICAgICAgICAgICAgICMgTGVnZW5kIHRleHQgc2l6ZQ0KICAgIHBhbmVsLmdyaWQubWFqb3IgPSBlbGVtZW50X2xpbmUobGluZXR5cGUgPSAiZG90dGVkIiwgY29sb3IgPSAiYmxhY2siKSwgICMgTWFqb3IgZ3JpZCBsaW5lcw0KICAgIHBhbmVsLmdyaWQubWlub3IueCA9IGVsZW1lbnRfYmxhbmsoKSwgICAgICAgICAgICAgICAgICAgICAgIyBObyBtaW5vciB4IGdyaWQgbGluZXMNCiAgICBheGlzLnRpY2tzLmxlbmd0aCA9IHVuaXQoLTAuMjUsICJjbSIpLCAgICAgICAgICAgICAgICAgICAgICAjIEluY3JlYXNlIHRpY2sgbGVuZ3RoDQogICAgYXhpcy50aWNrcyA9IGVsZW1lbnRfbGluZShjb2xvciA9ICJibGFjayIsIHNpemUgPSAwLjUwKSwgICAjIERhcmtlciB0aWNrcw0KICAgIGF4aXMubGluZS54ID0gZWxlbWVudF9saW5lKGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDAuNzUpLCAgIyBEYXJrIGJvdHRvbSBib3JkZXINCiAgICBheGlzLmxpbmUueSA9IGVsZW1lbnRfbGluZShjb2xvciA9ICJibGFjayIsIHNpemUgPSAwLjc1KSAgICMgRGFyayBsZWZ0IGJvcmRlcg0KICApDQoNCiMgUHJpbnQgdGhlIHBsb3QgDQpwcmludChwMSkNCg0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiMjIFBMT1QgUkVTVFJJQ1RFRCBXSVRIIExJTUlUUyANCg0KIyBGaWx0ZXIgdGhlIGRhdGEgZm9yIHRoZSByZXN0cmljdGVkIHgtYXhpcyByYW5nZSAoMjAwNS0yMDI0KQ0KcmVzdHJpY3RlZF9kYXRhIDwtIG5ydF9sb25nICU+JQ0KICBmaWx0ZXIoYXMuaW50ZWdlcihEYXRlKSA+PSAyMDA1ICYgYXMuaW50ZWdlcihEYXRlKSA8PSAyMDI0KQ0KDQojIERlZmluZSBzdGFydCBhbmQgZW5kIHllYXJzDQpzdGFydF95ZWFyIDwtIDIwMDUNCmVuZF95ZWFyIDwtIDIwMjQNCnllYXJfcmFuZ2UgPC0gZW5kX3llYXIgLSBzdGFydF95ZWFyICsgMSAgIyBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiB5ZWFycw0KDQojIERlZmluZSBicmVha3Mgcm91bmRlZCBhcHByb3ByaWF0ZWx5DQpsaW1pdHNfc3RhcnRfeWVhciA8LSBmbG9vcihzdGFydF95ZWFyIC8gNSkgKiA1ICAjIFJvdW5kIGRvd24gdG8gdGhlIG5lYXJlc3QgbXVsdGlwbGUgb2YgNQ0KbGltaXRzX2VuZF95ZWFyIDwtIGNlaWxpbmcoZW5kX3llYXIgLyA1KSAqIDUgICAjIFJvdW5kIHVwIHRvIHRoZSBuZWFyZXN0IG11bHRpcGxlIG9mIDUNCg0KIyBDcmVhdGUgZHluYW1pYyB0aXRsZSBhbmQgY2FwdGlvbg0KZHluYW1pY190aXRsZSA8LSBwYXN0ZTAoIlJvbGxpbmcgQ0FHUnMgQWNyb3NzIFBlcmlvZHMgT3ZlciAiLHllYXJfcmFuZ2UsICIgWWVhcnMgKCIsIHN0YXJ0X3llYXIsICItIiwgZW5kX3llYXIsICIpIikNCmR5bmFtaWNfY2FwdGlvbiA8LSBwYXN0ZTAoIk1TRlQgQ29tcG91bmQgQXZlcmFnZSBHcm93dGggUmF0ZXMgQWNyb3NzIFJvbGxpbmcgUGVyaW9kcywgRGF0YXNldCAoIiwgbWluX3llYXIsICItIiwgbWF4X3llYXIsICIpIikNCg0KIyBDYWxjdWxhdGUgZHluYW1pYyB5LWF4aXMgbGltaXRzIGZvciB0aGUgcmVzdHJpY3RlZCBkYXRhDQp5X21pbiA8LSBtaW4ocmVzdHJpY3RlZF9kYXRhJENBR1JfVmFsdWUsIG5hLnJtID0gVFJVRSkNCnlfbWF4IDwtIG1heChyZXN0cmljdGVkX2RhdGEkQ0FHUl9WYWx1ZSwgbmEucm0gPSBUUlVFKQ0KDQojIENyZWF0ZSB0aGUgZmlsdGVyZWQsIHJlc3RyaWN0ZWQgeC1heGlzIHBsb3Qgd2l0aCBkeW5hbWljIHggcGxhY2VtZW50IGZvciBhbm5vdGF0aW9ucw0KcDMgPC0gZ2dwbG90KG5ydF9sb25nLCBhZXMoeCA9IGFzLmludGVnZXIoRGF0ZSksIHkgPSBDQUdSX1ZhbHVlLCBjb2xvciA9IENBR1JfUGVyaW9kKSkgKw0KDQogICMgQWRkIHNoYWRlZCBhcmVhcyBmb3IgYmFja2dyb3VuZCBlZmZlY3QNCiAgZ2VvbV9yZWN0KGFlcyh4bWluID0gLUluZiwgeG1heCA9IEluZiwgeW1pbiA9IHRhcmdldF9hZ2dyZXNzaXZlLCB5bWF4ID0gSW5mKSwgZmlsbCA9ICJsaWdodGdyZWVuIiwgYWxwaGEgPSAwLjAxMCkgKw0KICBnZW9tX3JlY3QoYWVzKHhtaW4gPSAtSW5mLCB4bWF4ID0gSW5mLCB5bWluID0gdGFyZ2V0X2NvbnNlcnZhdGl2ZSwgeW1heCA9IHRhcmdldF9hZ2dyZXNzaXZlKSwgZmlsbCA9ICJvcmFuZ2UiLCBhbHBoYSA9IDAuMDEpICsNCiAgZ2VvbV9yZWN0KGFlcyh4bWluID0gLUluZiwgeG1heCA9IEluZiwgeW1pbiA9IC1JbmYsIHltYXggPSB0YXJnZXRfY29uc2VydmF0aXZlKSwgZmlsbCA9ICJsaWdodGNvcmFsIiwgYWxwaGEgPSAwLjAxMCkgKw0KICANCiAgIyBQbG90IGxpbmVzIGZvciBlYWNoIENBR1IgUGVyaW9kDQogIGdlb21fbGluZShzaXplID0gMS4wLCBhbHBoYSA9IDMuMCkgKyAgICAgICAjIExpbmUgZm9yIGVhY2ggQ0FHUg0KICBnZW9tX3BvaW50KHNpemUgPSAxLjAsIGFscGhhID0gMy4wKSArICAgICAgICMgUG9pbnRzIGZvciBlYWNoIENBR1INCg0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSB0YXJnZXRfYWdncmVzc2l2ZSwgY29sb3IgPSAiZGFya2JsdWUiLCBsaW5ldHlwZSA9ICJzb2xpZCIpICsNCiAgIyBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSB0YXJnZXRfbW9kZXJhdGUsIGNvbG9yID0gImRhcmtibHVlIiwgbGluZXR5cGUgPSAic29saWQiKSArDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IHRhcmdldF9jb25zZXJ2YXRpdmUsIGNvbG9yID0gImRhcmtibHVlIiwgbGluZXR5cGUgPSAic29saWQiKSArDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IHRhcmdldF9pbmZsYXRpb24sIGNvbG9yID0gImRhcmtyZWQiLCBsaW5ldHlwZSA9ICJkYXNoZWQiKSArDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IGNhZ3JfdmFsdWUsIGNvbG9yID0gImRhcmtyZWQiLCBsaW5ldHlwZSA9ICJkYXNoZWQiKSArDQogIA0KICAjIER5bmFtaWMgcmlnaHQtYWxpZ25lZCBwbGFjZW1lbnQgZm9yIGFubm90YXRpb25zDQogIGFubm90YXRlKCJ0ZXh0IiwgeCA9IEluZiwgeSA9IHRhcmdldF9hZ2dyZXNzaXZlLCBsYWJlbCA9ICJBZ2dyZXNzaXZlIiwgDQogICAgICAgICAgIGhqdXN0ID0gMSwgdmp1c3QgPSAtMC41MCwgY29sb3IgPSAiZGFya2JsdWUiLCBzaXplID0gNCkgKw0KICAjIGFubm90YXRlKCJ0ZXh0IiwgeCA9IEluZiwgeSA9IHRhcmdldF9tb2RlcmF0ZSwgbGFiZWwgPSAiTW9kZXJhdGUiLCANCiAgIyAgICAgICAgIGhqdXN0ID0gMSwgdmp1c3QgPSAtMC41MCwgY29sb3IgPSAiZGFya2JsdWUiLCBzaXplID0gNCkgKw0KICBhbm5vdGF0ZSgidGV4dCIsIHggPSBJbmYsIHkgPSB0YXJnZXRfY29uc2VydmF0aXZlLCBsYWJlbCA9ICJDb25zZXJ2YXRpdmUiLA0KICAgICAgICAgICBoanVzdCA9IDEsIHZqdXN0ID0gLTAuNTAsIGNvbG9yID0gImRhcmtibHVlIiwgc2l6ZSA9IDQpICsNCiAgYW5ub3RhdGUoInRleHQiLCB4ID0gSW5mLCB5ID0gdGFyZ2V0X2luZmxhdGlvbiwgbGFiZWwgPSAiSW5mbGF0aW9uIiwgDQogICAgICAgICAgIGhqdXN0ID0gMSwgdmp1c3QgPSArMS4xMCwgY29sb3IgPSAiZGFya3JlZCIsIHNpemUgPSA0KSArDQogIGFubm90YXRlKCJ0ZXh0IiwgeCA9IEluZiwgeSA9IGNhZ3JfdmFsdWUsIGxhYmVsID0gIkNBR1IiLCANCiAgICAgICAgICAgaGp1c3QgPSAxLCB2anVzdCA9IC0wLjUwLCBjb2xvciA9ICJkYXJrcmVkIiwgc2l6ZSA9IDQpICsgDQoNCiAgbGFicygNCiAgICB0aXRsZSA9IGR5bmFtaWNfdGl0bGUsDQogICAgeCA9ICJZZWFyIiwNCiAgICB5ID0gIkNBR1IgVmFsdWUgKCUpIiwNCiAgICBjb2xvciA9ICJDQUdSIFBlcmlvZCIsDQogICAgY2FwdGlvbiA9IGR5bmFtaWNfY2FwdGlvbg0KICAgICkgKw0KICANCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGN1c3RvbV9jb2xvcnMpICsgICMgU2V0IGNvbG9ycyBmb3IgZWFjaCBDQUdSIFBlcmlvZA0KICBjb29yZF9jYXJ0ZXNpYW4oeWxpbSA9IGMoeV9taW4sIHlfbWF4KSkgKyAjIEFwcGx5IGR5bmFtaWMgeS1heGlzIGxpbWl0cw0KICBzY2FsZV94X2NvbnRpbnVvdXMoDQogICAgbGltaXRzID0gYyhzdGFydF95ZWFyLCBlbmRfeWVhciArIDIpLCANCiAgICBicmVha3MgPSBzZXEobGltaXRzX3N0YXJ0X3llYXIsIGxpbWl0c19lbmRfeWVhciwgNSkNCiAgKSArICAjIFJlc3RyaWN0ICYgU2V0IE1ham9yIHgtYXhpcyBsaW5lcyBmb3IgZWFjaCB5ZWFyDQoNCiAgdGhlbWVfbWluaW1hbCgpICsNCiAgdGhlbWUoDQogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSwgc2l6ZSA9IDIwKSwgICAgICAgICAjIExhcmdlciB0aXRsZSBmb250DQogICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCksICAgICAgICAgICAgICAgICAgICAjIExhcmdlciB4LWF4aXMgbGFiZWwgZm9udA0KICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQpLCAgICAgICAgICAgICAgICAgICAgIyBMYXJnZXIgeS1heGlzIGxhYmVsIGZvbnQNCiAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEsIHNpemUgPSAxNCksICAjIExhcmdlciB4LWF4aXMgdGV4dA0KICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCksICAgICAgICAgICAgICAgICAgICAgIyBMYXJnZXIgeS1heGlzIHRleHQNCiAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0KSwgICAgICAgICAgICAgICAgICAgICMgTGVnZW5kIHRpdGxlIHNpemUNCiAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIpLCAgICAgICAgICAgICAgICAgICAgICMgTGVnZW5kIHRleHQgc2l6ZQ0KICAgIHBhbmVsLmdyaWQubWFqb3IgPSBlbGVtZW50X2xpbmUobGluZXR5cGUgPSAiZG90dGVkIiwgY29sb3IgPSAiYmxhY2siKSwgICMgTWFqb3IgZ3JpZCBsaW5lcw0KICAgIHBhbmVsLmdyaWQubWlub3IueCA9IGVsZW1lbnRfYmxhbmsoKSwgICAgICAgICAgICAgICAgICAgICAgIyBObyBtaW5vciB4IGdyaWQgbGluZXMNCiAgICBheGlzLnRpY2tzLmxlbmd0aCA9IHVuaXQoLTAuMjUsICJjbSIpLCAgICAgICAgICAgICAgICAgICAgICAjIEluY3JlYXNlIHRpY2sgbGVuZ3RoDQogICAgYXhpcy50aWNrcyA9IGVsZW1lbnRfbGluZShjb2xvciA9ICJibGFjayIsIHNpemUgPSAwLjUwKSwgICAjIERhcmtlciB0aWNrcw0KICAgIGF4aXMubGluZS54ID0gZWxlbWVudF9saW5lKGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDAuNzUpLCAgIyBEYXJrIGJvdHRvbSBib3JkZXINCiAgICBheGlzLmxpbmUueSA9IGVsZW1lbnRfbGluZShjb2xvciA9ICJibGFjayIsIHNpemUgPSAwLjc1KSAgICMgRGFyayBsZWZ0IGJvcmRlcg0KICApDQoNCiMgUHJpbnQgdGhlIHBsb3QgDQpwcmludChwMykNCg0KYGBgDQoNCiMjIyMgU2hvcnQtVGVybQ0KDQpgYGB7ciBtc2Z0X3Jhd19jYWdyX2dyYXBoc19zaG9ydCwgZmlnLndpZHRoPTEwLCBmaWcuaGVpZ2h0PTd9DQoNCmNhdCgiXG5cbiMjIyMgQ29tcG91bmQgQXZlcmFnZSBHcm93dGggUmF0ZXMgQWNyb3NzIFNob3J0LVRlcm0gUm9sbGluZyBQZXJpb2RzIFxuIikNCg0KIyBGaWx0ZXIgZGF0YSBmb3IgU2hvcnQtVGVybSBDQUdSICg1LVllYXIgYW5kIDEwLVllYXIpDQpzaG9ydHRlcm1fZGF0YSA8LSBucnRfbG9uZyAlPiUNCiAgZmlsdGVyKENBR1JfUGVyaW9kICVpbiUgYygiNS1ZZWFyIENBR1IiLCAiMTAtWWVhciBDQUdSIikpDQoNCg0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiMjIFBMT1QgRlVMTCBXSVRIT1VUIExJTUlUUw0KDQojIERlZmluZSBzdGFydCBhbmQgZW5kIHllYXJzDQpzdGFydF95ZWFyIDwtIDE5OTINCmVuZF95ZWFyIDwtIDIwMjQNCnllYXJfcmFuZ2UgPC0gZW5kX3llYXIgLSBzdGFydF95ZWFyICsgMSAgIyBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiB5ZWFycw0KDQojIERlZmluZSBicmVha3Mgcm91bmRlZCBhcHByb3ByaWF0ZWx5DQpsaW1pdHNfc3RhcnRfeWVhciA8LSBmbG9vcihzdGFydF95ZWFyIC8gNSkgKiA1ICAjIFJvdW5kIGRvd24gdG8gdGhlIG5lYXJlc3QgbXVsdGlwbGUgb2YgNQ0KbGltaXRzX2VuZF95ZWFyIDwtIGNlaWxpbmcoZW5kX3llYXIgLyA1KSAqIDUgICAjIFJvdW5kIHVwIHRvIHRoZSBuZWFyZXN0IG11bHRpcGxlIG9mIDUNCg0KIyBDcmVhdGUgZHluYW1pYyB0aXRsZSBhbmQgY2FwdGlvbg0KZHluYW1pY190aXRsZSA8LSBwYXN0ZTAoIkNBR1IgQWNyb3NzIFNob3J0LVRlcm0gUGVyaW9kcyBPdmVyICIseWVhcl9yYW5nZSwgIiBZZWFycyAoIiwgc3RhcnRfeWVhciwgIi0iLCBlbmRfeWVhciwgIikiKQ0KZHluYW1pY19jYXB0aW9uIDwtIHBhc3RlMCgiTVNGVCBDb21wb3VuZCBBdmVyYWdlIEdyb3d0aCBSYXRlcyBBY3Jvc3MgU2hvcnQtVGVybSBSb2xsaW5nIFBlcmlvZHMsIERhdGFzZXQgKCIsIG1pbl95ZWFyLCAiLSIsIG1heF95ZWFyLCAiKSIpDQoNCiMgQ3JlYXRlIHRoZSBmdWxsLCBub24tZmlsdGVyZWQgeC1heGlzIHBsb3Qgd2l0aCBkeW5hbWljIHggcGxhY2VtZW50IGZvciBhbm5vdGF0aW9ucw0KcDFfc2hvcnR0ZXJtIDwtIGdncGxvdChzaG9ydHRlcm1fZGF0YSwgYWVzKHggPSBhcy5pbnRlZ2VyKERhdGUpLCB5ID0gQ0FHUl9WYWx1ZSwgY29sb3IgPSBDQUdSX1BlcmlvZCkpICsNCg0KICAjIEFkZCBzaGFkZWQgYXJlYXMgZm9yIGJhY2tncm91bmQgZWZmZWN0DQogIGdlb21fcmVjdChhZXMoeG1pbiA9IC1JbmYsIHhtYXggPSBJbmYsIHltaW4gPSB0YXJnZXRfYWdncmVzc2l2ZSwgeW1heCA9IEluZiksIGZpbGwgPSAibGlnaHRncmVlbiIsIGFscGhhID0gMC4wMTApICsNCiAgZ2VvbV9yZWN0KGFlcyh4bWluID0gLUluZiwgeG1heCA9IEluZiwgeW1pbiA9IHRhcmdldF9jb25zZXJ2YXRpdmUsIHltYXggPSB0YXJnZXRfYWdncmVzc2l2ZSksIGZpbGwgPSAib3JhbmdlIiwgYWxwaGEgPSAwLjAxKSArDQogIGdlb21fcmVjdChhZXMoeG1pbiA9IC1JbmYsIHhtYXggPSBJbmYsIHltaW4gPSAtSW5mLCB5bWF4ID0gdGFyZ2V0X2NvbnNlcnZhdGl2ZSksIGZpbGwgPSAibGlnaHRjb3JhbCIsIGFscGhhID0gMC4wMTApICsNCiAgDQogICMgUGxvdCBsaW5lcyBmb3IgZWFjaCBDQUdSIFBlcmlvZA0KICBnZW9tX2xpbmUoc2l6ZSA9IDEuMCwgYWxwaGEgPSAzLjApICsgICAgICAgIyBMaW5lIGZvciBlYWNoIENBR1INCiAgZ2VvbV9wb2ludChzaXplID0gMS4wLCBhbHBoYSA9IDMuMCkgKyAgICAgICAjIFBvaW50cyBmb3IgZWFjaCBDQUdSDQoNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gdGFyZ2V0X2FnZ3Jlc3NpdmUsIGNvbG9yID0gImRhcmtibHVlIiwgbGluZXR5cGUgPSAic29saWQiKSArDQogICMgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gdGFyZ2V0X21vZGVyYXRlLCBjb2xvciA9ICJkYXJrYmx1ZSIsIGxpbmV0eXBlID0gInNvbGlkIikgKw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSB0YXJnZXRfY29uc2VydmF0aXZlLCBjb2xvciA9ICJkYXJrYmx1ZSIsIGxpbmV0eXBlID0gInNvbGlkIikgKw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSB0YXJnZXRfaW5mbGF0aW9uLCBjb2xvciA9ICJkYXJrcmVkIiwgbGluZXR5cGUgPSAiZGFzaGVkIikgKw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSBjYWdyX3ZhbHVlLCBjb2xvciA9ICJkYXJrcmVkIiwgbGluZXR5cGUgPSAiZGFzaGVkIikgKw0KICANCiAgIyBEeW5hbWljIHJpZ2h0LWFsaWduZWQgcGxhY2VtZW50IGZvciBhbm5vdGF0aW9ucw0KICBhbm5vdGF0ZSgidGV4dCIsIHggPSBJbmYsIHkgPSB0YXJnZXRfYWdncmVzc2l2ZSwgbGFiZWwgPSAiQWdncmVzc2l2ZSIsIA0KICAgICAgICAgICBoanVzdCA9IDEsIHZqdXN0ID0gLTAuNTAsIGNvbG9yID0gImRhcmtibHVlIiwgc2l6ZSA9IDQpICsNCiAgIyBhbm5vdGF0ZSgidGV4dCIsIHggPSBJbmYsIHkgPSB0YXJnZXRfbW9kZXJhdGUsIGxhYmVsID0gIk1vZGVyYXRlIiwgDQogICMgICAgICAgICBoanVzdCA9IDEsIHZqdXN0ID0gLTAuNTAsIGNvbG9yID0gImRhcmtibHVlIiwgc2l6ZSA9IDQpICsNCiAgYW5ub3RhdGUoInRleHQiLCB4ID0gSW5mLCB5ID0gdGFyZ2V0X2NvbnNlcnZhdGl2ZSwgbGFiZWwgPSAiQ29uc2VydmF0aXZlIiwgDQogICAgICAgICAgIGhqdXN0ID0gMSwgdmp1c3QgPSAtMC41MCwgY29sb3IgPSAiZGFya2JsdWUiLCBzaXplID0gNCkgKw0KICBhbm5vdGF0ZSgidGV4dCIsIHggPSBJbmYsIHkgPSB0YXJnZXRfaW5mbGF0aW9uLCBsYWJlbCA9ICJJbmZsYXRpb24iLCANCiAgICAgICAgICAgaGp1c3QgPSAxLCB2anVzdCA9ICsxLjMwLCBjb2xvciA9ICJkYXJrcmVkIiwgc2l6ZSA9IDQpICsNCiAgYW5ub3RhdGUoInRleHQiLCB4ID0gSW5mLCB5ID0gY2Fncl92YWx1ZSwgbGFiZWwgPSAiQ0FHUiIsIA0KICAgICAgICAgICBoanVzdCA9IDEsIHZqdXN0ID0gLTAuNTAsIGNvbG9yID0gImRhcmtyZWQiLCBzaXplID0gNCkgKyANCg0KICBsYWJzKA0KICAgIHRpdGxlID0gZHluYW1pY190aXRsZSwNCiAgICB4ID0gIlllYXIiLA0KICAgIHkgPSAiQ0FHUiBWYWx1ZSAoJSkiLA0KICAgIGNvbG9yID0gIkNBR1IgUGVyaW9kIiwNCiAgICBjYXB0aW9uID0gZHluYW1pY19jYXB0aW9uDQogICAgKSArDQogIA0KICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gY3VzdG9tX2NvbG9yc1tjKCI1LVllYXIgQ0FHUiIsICIxMC1ZZWFyIENBR1IiKV0pICsNCiAgc2NhbGVfeF9jb250aW51b3VzKA0KICAgIGxpbWl0cyA9IGMoc3RhcnRfeWVhciwgZW5kX3llYXIgKyAxKSwgDQogICAgYnJlYWtzID0gc2VxKGxpbWl0c19zdGFydF95ZWFyLCBsaW1pdHNfZW5kX3llYXIgKyAxICwgNSkNCiAgKSArICAjIFJlc3RyaWN0ICYgU2V0IE1ham9yIHgtYXhpcyBsaW5lcyBmb3IgZWFjaCB5ZWFyDQoNCiAgdGhlbWVfbWluaW1hbCgpICsNCiAgdGhlbWUoDQogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSwgc2l6ZSA9IDIwKSwgICAgICAgICAjIExhcmdlciB0aXRsZSBmb250DQogICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCksICAgICAgICAgICAgICAgICAgICAjIExhcmdlciB4LWF4aXMgbGFiZWwgZm9udA0KICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQpLCAgICAgICAgICAgICAgICAgICAgIyBMYXJnZXIgeS1heGlzIGxhYmVsIGZvbnQNCiAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEsIHNpemUgPSAxNCksICAjIExhcmdlciB4LWF4aXMgdGV4dA0KICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCksICAgICAgICAgICAgICAgICAgICAgIyBMYXJnZXIgeS1heGlzIHRleHQNCiAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0KSwgICAgICAgICAgICAgICAgICAgICMgTGVnZW5kIHRpdGxlIHNpemUNCiAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIpLCAgICAgICAgICAgICAgICAgICAgICMgTGVnZW5kIHRleHQgc2l6ZQ0KICAgIHBhbmVsLmdyaWQubWFqb3IgPSBlbGVtZW50X2xpbmUobGluZXR5cGUgPSAiZG90dGVkIiwgY29sb3IgPSAiYmxhY2siKSwgICMgTWFqb3IgZ3JpZCBsaW5lcw0KICAgIHBhbmVsLmdyaWQubWlub3IueCA9IGVsZW1lbnRfYmxhbmsoKSwgICAgICAgICAgICAgICAgICAgICAgIyBObyBtaW5vciB4IGdyaWQgbGluZXMNCiAgICBheGlzLnRpY2tzLmxlbmd0aCA9IHVuaXQoLTAuMjUsICJjbSIpLCAgICAgICAgICAgICAgICAgICAgICAjIEluY3JlYXNlIHRpY2sgbGVuZ3RoDQogICAgYXhpcy50aWNrcyA9IGVsZW1lbnRfbGluZShjb2xvciA9ICJibGFjayIsIHNpemUgPSAwLjUwKSwgICAjIERhcmtlciB0aWNrcw0KICAgIGF4aXMubGluZS54ID0gZWxlbWVudF9saW5lKGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDAuNzUpLCAgIyBEYXJrIGJvdHRvbSBib3JkZXINCiAgICBheGlzLmxpbmUueSA9IGVsZW1lbnRfbGluZShjb2xvciA9ICJibGFjayIsIHNpemUgPSAwLjc1KSAgICMgRGFyayBsZWZ0IGJvcmRlcg0KICApDQoNCiMgUHJpbnQgdGhlIHBsb3QgDQpwcmludChwMV9zaG9ydHRlcm0pDQoNCmBgYA0KDQoNCg0KIyMjIyBMb25nLVRlcm0NCg0KYGBge3IgbXNmdF9yYXdfY2Fncl9ncmFwaHNfbG9uZywgZmlnLndpZHRoPTEwLCBmaWcuaGVpZ2h0PTd9DQoNCmNhdCgiXG5cbiMjIyMgQ29tcG91bmQgQXZlcmFnZSBHcm93dGggUmF0ZXMgQWNyb3NzIExvbmctVGVybSBSb2xsaW5nIFBlcmlvZHMgXG4iKQ0KDQojIEZpbHRlciBkYXRhIGZvciBMb25nLVRlcm0gQ0FHUiAoMjAtWWVhciBhbmQgMzAtWWVhcikNCmxvbmd0ZXJtX2RhdGEgPC0gbnJ0X2xvbmcgJT4lDQogIGZpbHRlcihDQUdSX1BlcmlvZCAlaW4lIGMoIjIwLVllYXIgQ0FHUiIsICIzMC1ZZWFyIENBR1IiKSkNCg0KDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KIyMgUExPVCBGVUxMIFdJVEhPVVQgTElNSVRTDQoNCiMgRGVmaW5lIHN0YXJ0IGFuZCBlbmQgeWVhcnMNCnN0YXJ0X3llYXIgPC0gMjAwNw0KZW5kX3llYXIgPC0gMjAyNA0KeWVhcl9yYW5nZSA8LSBlbmRfeWVhciAtIHN0YXJ0X3llYXIgKyAxICAjIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIHllYXJzDQoNCiMgRGVmaW5lIGJyZWFrcyByb3VuZGVkIGFwcHJvcHJpYXRlbHkNCmxpbWl0c19zdGFydF95ZWFyIDwtIGZsb29yKHN0YXJ0X3llYXIgLyA1KSAqIDUgICMgUm91bmQgZG93biB0byB0aGUgbmVhcmVzdCBtdWx0aXBsZSBvZiA1DQpsaW1pdHNfZW5kX3llYXIgPC0gY2VpbGluZyhlbmRfeWVhciAvIDUpICogNSAgICMgUm91bmQgdXAgdG8gdGhlIG5lYXJlc3QgbXVsdGlwbGUgb2YgNQ0KDQojIENyZWF0ZSBkeW5hbWljIHRpdGxlIGFuZCBjYXB0aW9uDQpkeW5hbWljX3RpdGxlIDwtIHBhc3RlMCgiQ0FHUiBBY3Jvc3MgTG9uZy1UZXJtIFBlcmlvZHMgT3ZlciAiLHllYXJfcmFuZ2UsICIgWWVhcnMgKCIsIHN0YXJ0X3llYXIsICItIiwgZW5kX3llYXIsICIpIikNCmR5bmFtaWNfY2FwdGlvbiA8LSBwYXN0ZTAoIk1TRlQgQ29tcG91bmQgQXZlcmFnZSBHcm93dGggUmF0ZXMgQWNyb3NzIExvbmctVGVybSBSb2xsaW5nIFBlcmlvZHMsIERhdGFzZXQgKCIsIG1pbl95ZWFyLCAiLSIsIG1heF95ZWFyLCAiKSIpDQoNCiMgQ3JlYXRlIHRoZSBmdWxsLCBub24tZmlsdGVyZWQgeC1heGlzIHBsb3Qgd2l0aCBkeW5hbWljIHggcGxhY2VtZW50IGZvciBhbm5vdGF0aW9ucw0KcDFfbG9uZ3Rlcm0gPC0gZ2dwbG90KGxvbmd0ZXJtX2RhdGEsIGFlcyh4ID0gYXMuaW50ZWdlcihEYXRlKSwgeSA9IENBR1JfVmFsdWUsIGNvbG9yID0gQ0FHUl9QZXJpb2QpKSArDQoNCiAgIyBBZGQgc2hhZGVkIGFyZWFzIGZvciBiYWNrZ3JvdW5kIGVmZmVjdA0KICBnZW9tX3JlY3QoYWVzKHhtaW4gPSAtSW5mLCB4bWF4ID0gSW5mLCB5bWluID0gdGFyZ2V0X2FnZ3Jlc3NpdmUsIHltYXggPSBJbmYpLCBmaWxsID0gImxpZ2h0Z3JlZW4iLCBhbHBoYSA9IDAuMDEwKSArDQogIGdlb21fcmVjdChhZXMoeG1pbiA9IC1JbmYsIHhtYXggPSBJbmYsIHltaW4gPSB0YXJnZXRfY29uc2VydmF0aXZlLCB5bWF4ID0gdGFyZ2V0X2FnZ3Jlc3NpdmUpLCBmaWxsID0gIm9yYW5nZSIsIGFscGhhID0gMC4wMSkgKw0KICBnZW9tX3JlY3QoYWVzKHhtaW4gPSAtSW5mLCB4bWF4ID0gSW5mLCB5bWluID0gLUluZiwgeW1heCA9IHRhcmdldF9jb25zZXJ2YXRpdmUpLCBmaWxsID0gImxpZ2h0Y29yYWwiLCBhbHBoYSA9IDAuMDEwKSArDQogIA0KICAjIFBsb3QgbGluZXMgZm9yIGVhY2ggQ0FHUiBQZXJpb2QNCiAgZ2VvbV9saW5lKHNpemUgPSAxLjAsIGFscGhhID0gMy4wKSArICAgICAgICMgTGluZSBmb3IgZWFjaCBDQUdSDQogIGdlb21fcG9pbnQoc2l6ZSA9IDEuMCwgYWxwaGEgPSAzLjApICsgICAgICAgIyBQb2ludHMgZm9yIGVhY2ggQ0FHUg0KDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IHRhcmdldF9hZ2dyZXNzaXZlLCBjb2xvciA9ICJkYXJrYmx1ZSIsIGxpbmV0eXBlID0gInNvbGlkIikgKw0KICAjIGdlb21faGxpbmUoeWludGVyY2VwdCA9IHRhcmdldF9tb2RlcmF0ZSwgY29sb3IgPSAiZGFya2JsdWUiLCBsaW5ldHlwZSA9ICJzb2xpZCIpICsNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gdGFyZ2V0X2NvbnNlcnZhdGl2ZSwgY29sb3IgPSAiZGFya2JsdWUiLCBsaW5ldHlwZSA9ICJzb2xpZCIpICsNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gdGFyZ2V0X2luZmxhdGlvbiwgY29sb3IgPSAiZGFya3JlZCIsIGxpbmV0eXBlID0gImRhc2hlZCIpICsNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gY2Fncl92YWx1ZSwgY29sb3IgPSAiZGFya3JlZCIsIGxpbmV0eXBlID0gImRhc2hlZCIpICsNCiAgDQogICMgRHluYW1pYyByaWdodC1hbGlnbmVkIHBsYWNlbWVudCBmb3IgYW5ub3RhdGlvbnMNCiAgYW5ub3RhdGUoInRleHQiLCB4ID0gSW5mLCB5ID0gdGFyZ2V0X2FnZ3Jlc3NpdmUsIGxhYmVsID0gIkFnZ3Jlc3NpdmUiLCANCiAgICAgICAgICAgaGp1c3QgPSAxLCB2anVzdCA9IC0wLjUwLCBjb2xvciA9ICJkYXJrYmx1ZSIsIHNpemUgPSA0KSArDQogICMgYW5ub3RhdGUoInRleHQiLCB4ID0gSW5mLCB5ID0gdGFyZ2V0X21vZGVyYXRlLCBsYWJlbCA9ICJNb2RlcmF0ZSIsIA0KICAjICAgICAgICAgaGp1c3QgPSAxLCB2anVzdCA9IC0wLjUwLCBjb2xvciA9ICJkYXJrYmx1ZSIsIHNpemUgPSA0KSArDQogIGFubm90YXRlKCJ0ZXh0IiwgeCA9IEluZiwgeSA9IHRhcmdldF9jb25zZXJ2YXRpdmUsIGxhYmVsID0gIkNvbnNlcnZhdGl2ZSIsIA0KICAgICAgICAgICBoanVzdCA9IDEsIHZqdXN0ID0gLTAuNTAsIGNvbG9yID0gImRhcmtibHVlIiwgc2l6ZSA9IDQpICsNCiAgYW5ub3RhdGUoInRleHQiLCB4ID0gSW5mLCB5ID0gdGFyZ2V0X2luZmxhdGlvbiwgbGFiZWwgPSAiSW5mbGF0aW9uIiwgDQogICAgICAgICAgIGhqdXN0ID0gMSwgdmp1c3QgPSAtMC41MCwgY29sb3IgPSAiZGFya3JlZCIsIHNpemUgPSA0KSArDQogIGFubm90YXRlKCJ0ZXh0IiwgeCA9IEluZiwgeSA9IGNhZ3JfdmFsdWUsIGxhYmVsID0gIkNBR1IiLCANCiAgICAgICAgICAgaGp1c3QgPSAxLCB2anVzdCA9IC0wLjUwLCBjb2xvciA9ICJkYXJrcmVkIiwgc2l6ZSA9IDQpICsgDQoNCiAgbGFicygNCiAgICB0aXRsZSA9IGR5bmFtaWNfdGl0bGUsDQogICAgeCA9ICJZZWFyIiwNCiAgICB5ID0gIkNBR1IgVmFsdWUgKCUpIiwNCiAgICBjb2xvciA9ICJDQUdSIFBlcmlvZCIsDQogICAgY2FwdGlvbiA9IGR5bmFtaWNfY2FwdGlvbg0KICAgICkgKw0KICANCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGN1c3RvbV9jb2xvcnNbYygiMjAtWWVhciBDQUdSIiwgIjMwLVllYXIgQ0FHUiIpXSkgKw0KICBzY2FsZV94X2NvbnRpbnVvdXMoDQogICAgbGltaXRzID0gYyhzdGFydF95ZWFyLCBlbmRfeWVhciArIDIgKSwgDQogICAgYnJlYWtzID0gc2VxKGxpbWl0c19zdGFydF95ZWFyLCBsaW1pdHNfZW5kX3llYXIgKyA1LCA1KQ0KICApICsgICMgUmVzdHJpY3QgJiBTZXQgTWFqb3IgeC1heGlzIGxpbmVzIGZvciBlYWNoIHllYXINCg0KICB0aGVtZV9taW5pbWFsKCkgKw0KICB0aGVtZSgNCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41LCBzaXplID0gMjApLCAgICAgICAgICMgTGFyZ2VyIHRpdGxlIGZvbnQNCiAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0KSwgICAgICAgICAgICAgICAgICAgICMgTGFyZ2VyIHgtYXhpcyBsYWJlbCBmb250DQogICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCksICAgICAgICAgICAgICAgICAgICAjIExhcmdlciB5LWF4aXMgbGFiZWwgZm9udA0KICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSwgc2l6ZSA9IDE0KSwgICMgTGFyZ2VyIHgtYXhpcyB0ZXh0DQogICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0KSwgICAgICAgICAgICAgICAgICAgICAjIExhcmdlciB5LWF4aXMgdGV4dA0KICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQpLCAgICAgICAgICAgICAgICAgICAgIyBMZWdlbmQgdGl0bGUgc2l6ZQ0KICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiksICAgICAgICAgICAgICAgICAgICAgIyBMZWdlbmQgdGV4dCBzaXplDQogICAgcGFuZWwuZ3JpZC5tYWpvciA9IGVsZW1lbnRfbGluZShsaW5ldHlwZSA9ICJkb3R0ZWQiLCBjb2xvciA9ICJibGFjayIpLCAgIyBNYWpvciBncmlkIGxpbmVzDQogICAgcGFuZWwuZ3JpZC5taW5vci54ID0gZWxlbWVudF9ibGFuaygpLCAgICAgICAgICAgICAgICAgICAgICAjIE5vIG1pbm9yIHggZ3JpZCBsaW5lcw0KICAgIGF4aXMudGlja3MubGVuZ3RoID0gdW5pdCgtMC4yNSwgImNtIiksICAgICAgICAgICAgICAgICAgICAgICMgSW5jcmVhc2UgdGljayBsZW5ndGgNCiAgICBheGlzLnRpY2tzID0gZWxlbWVudF9saW5lKGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDAuNTApLCAgICMgRGFya2VyIHRpY2tzDQogICAgYXhpcy5saW5lLnggPSBlbGVtZW50X2xpbmUoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMC43NSksICAjIERhcmsgYm90dG9tIGJvcmRlcg0KICAgIGF4aXMubGluZS55ID0gZWxlbWVudF9saW5lKGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDAuNzUpICAgIyBEYXJrIGxlZnQgYm9yZGVyDQogICkNCg0KIyBQcmludCB0aGUgcGxvdCANCnByaW50KHAxX2xvbmd0ZXJtKQ0KDQoNCmBgYA0KDQoNCg0KDQoNCg0KIyBBTVpODQoNCkFtYXpvbi5jb20sIEluYy4gKEFNWk4pIGlzIGNvbnNpZGVyZWQgYSBsZWFkaW5nIHRlY2hub2xvZ3kgYW5kIGUtY29tbWVyY2UgY29tcGFueSBoZWFkcXVhcnRlcmVkIGluIFNlYXR0bGUsIFdhc2hpbmd0b24uIEVzdGFibGlzaGVkIGluIDE5OTQgYnkgSmVmZiBCZXpvcywgQW1hem9uIGlzIGJlc3Qga25vd24gZm9yIGl0cyBnbG9iYWwgb25saW5lIG1hcmtldHBsYWNlLCB3aGljaCByZXZvbHV0aW9uaXplZCB0aGUgcmV0YWlsIGluZHVzdHJ5LiBUaGUgY29tcGFueSBhbHNvIGV4Y2VscyBpbiBjbG91ZCBjb21wdXRpbmcgdGhyb3VnaCBpdHMgQW1hem9uIFdlYiBTZXJ2aWNlcyAoQVdTKSBwbGF0Zm9ybSwgYXJ0aWZpY2lhbCBpbnRlbGxpZ2VuY2UgKEFJKSB3aXRoIEFsZXhhLWVuYWJsZWQgZGV2aWNlcywgYW5kIGRpZ2l0YWwgc3RyZWFtaW5nIHNlcnZpY2VzIGxpa2UgQW1hem9uIFByaW1lIFZpZGVvIGFuZCBBbWF6b24gTXVzaWMuDQoNCiMjIEFNWk4gR1INCg0KIyMjIERhdGENCg0KVGhlIEFNWk4gRGF0YSBwcmVzZW50ZWQgaGVyZSBpcyBzb3VyY2VkIGZyb20gWWFob28gRmluYW5jZSwgZmlsdGVyZWQgdG8gZGlzcGxheSBNb250aGx5IEhpc3RvcmljYWwgRGF0YSAoZS5nLiwgMDMvMDEvMjAyNCkuIFRoaXMgZGF0YSByZXByZXNlbnRzIHRoZSBjbG9zaW5nIHByaWNlIG9mIHRoZSBsYXN0IHRyYWRpbmcgZGF5IG9mIGVhY2ggbW9udGggKGUuZy4sIDAzLzI4LzIwMjQpLiBQbGVhc2Ugbm90ZSB0aGF0IHRoZSBzdGF0aXN0aWNzIHByZXNlbnRlZCBoZXJlIG1heSBkaWZmZXIgZnJvbSB0aG9zZSBpbiBZYWhvbyBGaW5hbmNlJ3MgUGVyZm9ybWFuY2Ugc2VjdGlvbiBkdWUgdG8gZGlmZmVyZW5jZXMgaW4gZGF0YSBhZ2dyZWdhdGlvbiBhbmQgY2FsY3VsYXRpb24gbWV0aG9kcy4gIA0KDQpEYXRhIFNvdXJjZTogYHIgbnJ2JHNvdXJjZV9hbXpuX3lhaG9vYA0KDQpgYGB7ciBhbXpuX3JhdywgZXZhbD1UUlVFLCBlY2hvPUZBTFNFfQ0KDQojIERpc3BsYXkgdGhlIHN0cnVjdHVyZSBvZiB0aGUgZGF0YXNldCB0byBjb25maXJtIGNvbHVtbiBuYW1lcw0KaW50ZXJhY3RpdmVfc3RyKG5ydCRhbXpuX3JhdykNCg0KbGlicmFyeShkcGx5cikNCmxpYnJhcnkobHVicmlkYXRlKSAgIyBGb3IgZGF0ZSBtYW5pcHVsYXRpb24NCmxpYnJhcnkoc2NhbGVzKQ0KbGlicmFyeShzdHJpbmdyKQ0KDQojIEVuc3VyZSB0aGUgJ0RhdGUnIGNvbHVtbiBpcyBvZiBEYXRlIGNsYXNzDQphbXpuX3JhdyA8LSBucnQkYW16bl9yYXcgJT4lDQogIG11dGF0ZShEYXRlID0gYXMuRGF0ZShEYXRlLCBmb3JtYXQgPSAiJVktJW0tJWQiKSkNCg0KIyBGaW5kIHRoZSBtaW5pbXVtIGFuZCBtYXhpbXVtIHllYXINCm1pbl95ZWFyIDwtIGZvcm1hdChtaW4oYW16bl9yYXckRGF0ZSwgbmEucm0gPSBUUlVFKSwgIiVZIikNCm1heF95ZWFyIDwtIGZvcm1hdChtYXgoYW16bl9yYXckRGF0ZSwgbmEucm0gPSBUUlVFKSwgIiVZIikNCmludGVyYWN0aXZlX3ByaW50KG1pbl95ZWFyKQ0KaW50ZXJhY3RpdmVfcHJpbnQobWF4X3llYXIpDQoNCiMgVXBkYXRlIGRhdGEgZnJhbWUgd2l0aCBwcm9wZXIgZGF0ZSBhbmQgcGVyY2VudGFnZSBoYW5kbGluZw0KYW16bl9yYXcgPC0gYW16bl9yYXcgJT4lDQogIG11dGF0ZSgNCiAgICAjIENvbnZlcnQgQ2xvc2UgRGF0ZSB0byAiWVlZWS1NTS1ERCIgZm9ybWF0DQogICAgYERhdGVgID0gZm9ybWF0KGFzLkRhdGUoYXMuY2hhcmFjdGVyKGBEYXRlYCksIG9yaWdpbiA9ICIxOTcwLTAxLTAxIiksICIlWS0lbS0lZCIpLA0KDQogICAgIyBFbnN1cmUgQ2xvc2UgaXMgYSBudW1iZXIgZm9ybWF0dGVkIHRvIDIgZGVjaW1hbCBwbGFjZXMNCiAgICBgQ2xvc2VgID0gbnVtYmVyKGFzLm51bWVyaWMoZ3N1YigiLCIsICIiLCBDbG9zZSkpLCBiaWcubWFyayA9ICIsIiwgZGVjaW1hbC5tYXJrID0gIi4iLCBhY2N1cmFjeSA9IDAuMDEpLA0KDQogICAgIyBDbGVhbiBhbmQgaGFuZGxlIHBlcmNlbnRhZ2UgY29sdW1ucw0KICAgIGFjcm9zcygzOjMsIH4gew0KICAgICAgdmFsdWUgPC0gZ3N1YigiWywlXFxzXSIsICIiLCAuKSAgIyBSZW1vdmUgJSwgY29tbWFzLCBhbmQgc3BhY2VzDQogICAgICBudW1lcmljX3ZhbHVlIDwtIHN1cHByZXNzV2FybmluZ3MoYXMubnVtZXJpYyh2YWx1ZSkpICAjIENvbnZlcnQgdG8gbnVtZXJpYw0KICAgICAgaWZlbHNlKA0KICAgICAgICAhaXMubmEobnVtZXJpY192YWx1ZSksIA0KICAgICAgICBwYXN0ZTAoZm9ybWF0KHJvdW5kKG51bWVyaWNfdmFsdWUqMTAwLCAyKSwgYmlnLm1hcmsgPSAiLCIsIHNjaWVudGlmaWMgPSBGQUxTRSksICIlIiksICAjIEZvcm1hdCB0byAyIGRlY2ltYWwgcGxhY2VzIGFuZCBhZGQgY29tbWFzDQogICAgICAgIC4NCiAgICAgICkNCiAgICB9KQ0KICApICU+JQ0KICBhcnJhbmdlKGRlc2MoYERhdGVgKSkgICMgU29ydCBieSBEYXRlIGZyb20gbmV3ZXN0IHRvIG9sZGVzdA0KDQojIERpc3BsYXkgdGhlIGZvcm1hdHRlZCBkYXRhDQppbnRlcmFjdGl2ZV9zdHIoYW16bl9yYXcpDQppbnRlcmFjdGl2ZV9wcmludChhbXpuX3JhdykNCg0KIyBEaXNwbGF5IHRoZSB0YWJsZSB3aXRoIGNhcHRpb24NCmNhdCgiXG5cbiMjIyMgQU1aTiBZZWFybHkgUGVyZm9ybWFuY2UgKCIsIG1pbl95ZWFyLCAiLSIsIG1heF95ZWFyLCAiKVxuIiwgc2VwID0gIiIpDQpmb3JtYXRfZXF1YWxfd2lkdGhfZ3JvdXBlZChhbXpuX3JhdywgZ3JvdXBpbmdfZmFjdG9yID0gMikNCiMgY2F0KCJcblxuIFNvdXJjZTogIiwgbnJ2JHNvdXJjZV9hbXpuX3lhaG9vLCAiXG4iKQ0KDQpgYGANCg0KIyMjIFN1bW1hcnkNCg0KYGBge3IgYW16bl9yYXdfc3VtbWFyeSwgZXZhbD1UUlVFLCBlY2hvPUZBTFNFfQ0KDQojIExvYWQgbmVjZXNzYXJ5IGxpYnJhcmllcw0KbGlicmFyeShkcGx5cikNCmxpYnJhcnkodGliYmxlKQ0KbGlicmFyeShrbml0cikNCmxpYnJhcnkoa2FibGVFeHRyYSkNCg0KaW50ZXJhY3RpdmVfc3RyKGFtem5fcmF3KQ0KaW50ZXJhY3RpdmVfcHJpbnQoYW16bl9yYXcpDQoNCiMgRW5zdXJlIHRoZSBEYXRlIGNvbHVtbiBpcyBhIHByb3BlciBEYXRlIG9iamVjdCBhbmQgZXh0cmFjdCB0aGUgeWVhcg0KYW16bl9yYXcgPC0gYW16bl9yYXcgJT4lDQogIHNsaWNlKC0xKSAlPiUgIyBSZW1vdmUgdGhlIGZpcnN0IHJvdw0KICAjIG11dGF0ZShEYXRlID0gaWZlbHNlKHJvd19udW1iZXIoKSA9PSAxLCAiMjAyNS0wMS0wMSIsIERhdGUpKSAlPiUNCiAgbXV0YXRlKA0KICAgIERhdGUgPSBhcy5udW1lcmljKGZvcm1hdChhcy5EYXRlKERhdGUsIGZvcm1hdCA9ICIlWS0lbS0lZCIpLCAiJVkiKSksDQogICAgYDEtWWVhciBDQUdSYCA9IGFzLm51bWVyaWMoZ3N1YigiW14wLTkuLV0iLCAiIiwgYDEtWWVhciBDQUdSYCkpDQogICkNCg0KIyBTb3J0IGRhdGEgYnkgRGF0ZSBpbiBhc2NlbmRpbmcgb3JkZXINCmFtem5fcmF3IDwtIGFtem5fcmF3ICU+JQ0KICBhcnJhbmdlKERhdGUpDQoNCg0KIyBDYWxjdWxhdGUgdGhlIENBR1IgYW5kIGR5bmFtaWNhbGx5IGNyZWF0ZSBhIHZhcmlhYmxlIG5hbWUgd2l0aCB0aGUgZm9ybWF0IGFtem5fY2Fncl92YWx1ZV9zPG1pbl95ZWFyPl9lPG1heF95ZWFyPg0KaW5pdGlhbF92YWx1ZSA8LSAxMDAgICMgQXNzdW1pbmcgYW4gaW5pdGlhbCBpbmRleCB2YWx1ZSBvZiAxMDANCmZpbmFsX3ZhbHVlIDwtIGluaXRpYWxfdmFsdWUgKiBwcm9kKDEgKyBhbXpuX3JhdyRgMS1ZZWFyIENBR1JgIC8gMTAwLCBuYS5ybSA9IFRSVUUpDQptaW5feWVhciA8LSBtaW4oYW16bl9yYXckRGF0ZSwgbmEucm0gPSBUUlVFKQ0KbWF4X3llYXIgPC0gbWF4KGFtem5fcmF3JERhdGUsIG5hLnJtID0gVFJVRSkNCm51bV95ZWFycyA8LSBtYXhfeWVhciAtIG1pbl95ZWFyDQpjYWdyX3ZhbHVlIDwtIHJvdW5kKCgoZmluYWxfdmFsdWUgLyBpbml0aWFsX3ZhbHVlKV4oMSAvIG51bV95ZWFycykgLSAxKSAqIDEwMCwgMikNCnZhcl9uYW1lIDwtIHBhc3RlMCgiYW16bl9jYWdyX3ZhbHVlX3MiLCBtaW5feWVhciwgIl9lIiwgbWF4X3llYXIpDQphc3NpZ24odmFyX25hbWUsIGNhZ3JfdmFsdWUpDQoNCiMgQ29udmVydCBBTVpOIGRhdGEgdG8gbnVtZXJpYywgcmVtb3ZpbmcgYW55IHBlcmNlbnRhZ2Ugc2lnbnMNCmRhdGEgPC0gYXMubnVtZXJpYyhnc3ViKCIlIiwgIiIsIGFtem5fcmF3JGAxLVllYXIgQ0FHUmApKQ0KDQojIENhbGN1bGF0ZSBzdGF0aXN0aWNzDQpjb3VudF9vYnNlcnZhdGlvbnMgPC0gc3VtKCFpcy5uYShkYXRhKSkNCm1lYW5fdmFsdWUgPC0gcm91bmQobWVhbihkYXRhLCBuYS5ybSA9IFRSVUUpLCAyKQ0KbWVkaWFuX3ZhbHVlIDwtIHJvdW5kKG1lZGlhbihkYXRhLCBuYS5ybSA9IFRSVUUpLCAyKQ0Kc2RfdmFsdWUgPC0gcm91bmQoc2QoZGF0YSwgbmEucm0gPSBUUlVFKSwgMikNCm1pbl9jYWdyX3JhbmdlIDwtIHJvdW5kKGNhZ3JfdmFsdWUgLSBzZF92YWx1ZSwgMikNCm1heF9jYWdyX3JhbmdlIDwtIHJvdW5kKGNhZ3JfdmFsdWUgKyBzZF92YWx1ZSwgMikNCm1pbl92YWx1ZSA8LSByb3VuZChtaW4oZGF0YSwgbmEucm0gPSBUUlVFKSwgMikNCm1heF92YWx1ZSA8LSByb3VuZChtYXgoZGF0YSwgbmEucm0gPSBUUlVFKSwgMikNCg0KIyBUYXJnZXQgUmF0ZSBBbmFseXNpcyAtIFJlZmVyIHRvICJQcmVmZXJyZWQgVGFyZ2V0cyIgb3IgaW5jbHVkZSBiZWxvdyBmb3IgaW5kaXZpZHVhbCBjaGFuZ2VzLg0KYWJvdmVfdGFyZ2V0X2luZmxhdGlvbiA8LSBzdW0oZGF0YSA+PSB0YXJnZXRfaW5mbGF0aW9uLCBuYS5ybSA9IFRSVUUpDQphYm92ZV90YXJnZXRfY29uc2VydmF0aXZlIDwtIHN1bShkYXRhID49IHRhcmdldF9jb25zZXJ2YXRpdmUsIG5hLnJtID0gVFJVRSkNCmFib3ZlX3RhcmdldF9tb2RlcmF0ZSA8LSBzdW0oZGF0YSA+PSB0YXJnZXRfbW9kZXJhdGUsIG5hLnJtID0gVFJVRSkNCmFib3ZlX3RhcmdldF9hZ2dyZXNzaXZlIDwtIHN1bShkYXRhID49IHRhcmdldF9hZ2dyZXNzaXZlLCBuYS5ybSA9IFRSVUUpDQoNCnBlcmNlbnRfYWJvdmVfdGFyZ2V0X2NvbnNlcnZhdGl2ZSA8LSByb3VuZCgoYWJvdmVfdGFyZ2V0X2NvbnNlcnZhdGl2ZSAvIGNvdW50X29ic2VydmF0aW9ucykgKiAxMDAsIDIpDQpwZXJjZW50X2Fib3ZlX3RhcmdldF9pbmZsYXRpb24gPC0gcm91bmQoKGFib3ZlX3RhcmdldF9pbmZsYXRpb24gLyBjb3VudF9vYnNlcnZhdGlvbnMpICogMTAwLCAyKQ0KcGVyY2VudF9hYm92ZV90YXJnZXRfbW9kZXJhdGUgPC0gcm91bmQoKGFib3ZlX3RhcmdldF9tb2RlcmF0ZSAvIGNvdW50X29ic2VydmF0aW9ucykgKiAxMDAsIDIpDQpwZXJjZW50X2Fib3ZlX3RhcmdldF9hZ2dyZXNzaXZlIDwtIHJvdW5kKChhYm92ZV90YXJnZXRfYWdncmVzc2l2ZSAvIGNvdW50X29ic2VydmF0aW9ucykgKiAxMDAsIDIpDQoNCiMgQ29tcGlsZSBzdGF0aXN0aWNzIGludG8gYSBsaXN0IGZvciBlYXN5IGNvbnZlcnNpb24gdG8gYSBkYXRhIGZyYW1lIHdpdGggZGVmaW5pdGlvbnMNCmFtem5fcmF3X3N1bW1hcnkgPC0gdHJpYmJsZSgNCiAgflN0YXRpc3RpYywgflZhbHVlLCB+RGVmaW5pdGlvbiwNCiAgIkNvdW50IG9mIE9ic2VydmF0aW9ucyIsIGFzLmNoYXJhY3Rlcihjb3VudF9vYnNlcnZhdGlvbnMpLCAiVG90YWwgbnVtYmVyIG9mIGRhdGEgcG9pbnRzIGNvbGxlY3RlZCBvdmVyIHRoZSBzcGVjaWZpYyBwZXJpb2QuIiwNCiAgIkNBR1IiLCBwYXN0ZTAoY2Fncl92YWx1ZSwgIiUiKSwgIkNvbXBvdW5kIEF2ZXJhZ2UgR3Jvd3RoIFJhdGU7IG1lYW4gZ3Jvd3RoIHJhdGUgb3ZlciBhIHBlcmlvZCBpZiBpdCBoYWQgY29tcG91bmRlZCBhbnVhbGx5LiIsDQogICJNZWFuIiwgcGFzdGUwKG1lYW5fdmFsdWUsICIlIiksICJSZWZsZWN0cyB0aGUgZ2VuZXJhbCBwcmljZSBsZXZlbCBhbmQgb3ZlcmFsbCBncm93dGggcmF0ZS4iLA0KICAiTWVkaWFuIiwgcGFzdGUwKG1lZGlhbl92YWx1ZSwgIiUiKSwgIk1pZGRsZSB2YWx1ZSBvZiB0aGUgZGF0YSB3aGVuIG9yZGVyZWQgY2hyb25vbG9naWNhbGx5OyBjZW50cmFsIHRlbmRlbmN5IG1lYXN1cmUgbGVzcyBhZmZlY3RlZCBieSBleHRyZW1lIHZhbHVlcy4iLA0KICAiU3RhbmRhcmQgRGV2aWF0aW9uIChWb2xhdGlsaXR5KSIsIHBhc3RlMChzZF92YWx1ZSwgIiUiKSwgIlRoZSBkaXNwZXJzaW9uIG9mIHZhbHVlcyBmcm9tIHRoZSBtZWFuLCBpbmRpY2F0aW5nIHRoZSB2b2xhdGlsaXR5IG9mIHByaWNlIGNoYW5nZXMgYW5kIGVjb25vbWljIHN0YWJpbGl0eS4iLA0KICAiTWluIENBR1IgUmFuZ2UgKENBR1IgLSBTRCkiLCBwYXN0ZTAobWluX2NhZ3JfcmFuZ2UsICIlIiksICJMb3dlciBib3VuZGFyeSBvZiBleHBlY3RlZCBBTVpOIHJhbmdlOyBsb3dlc3QgZXN0aW1hdGUgb2YgdHlwaWNhbCBncm93dGggcmF0ZSBjb25zaWRlcmluZyBub3JtYWwgZmx1Y3R1YXRpb25zLiIsDQogICJNYXggQ0FHUiBSYW5nZSAoQ0FHUiArIFNEKSIsIHBhc3RlMChtYXhfY2Fncl9yYW5nZSwgIiUiKSwgIlVwcGVyIGJvdW5kYXJ5IG9mIGV4cGVjdGVkIEFNWk4gcmFuZ2U7IGhpZ2hlc3QgZXN0aW1hdGUgb2YgdHlwaWNhbCBncm93dGggcmF0ZSBjb25zaWRlcmluZyBub3JtYWwgZmx1Y3R1YXRpb25zLiIsDQogICJNaW5pbXVtIiwgcGFzdGUwKG1pbl92YWx1ZSwgIiUiKSwgIkxvd2VzdCBncm93dGggcmF0ZS4iLA0KICAiTWF4aW11bSIsIHBhc3RlMChtYXhfdmFsdWUsICIlIiksICJIaWdoZXN0IGdyb3d0aCByYXRlLiIsDQogICJQZXJjZW50IEFib3ZlIEluZmxhdGlvbiBUYXJnZXQiLCBwYXN0ZTAocGVyY2VudF9hYm92ZV90YXJnZXRfaW5mbGF0aW9uLCAiJSIpLCAiUGVyY2VudGFnZSBvZiB2YWx1ZXMgYWJvdmUgdGhlIGluZmxhdGlvbiB0YXJnZXQgc3BlY2lmaWVkIGluIFByZWZlcnJlZCBUYXJnZXRzIHNlY3Rpb24uIiwNCiAgIlBlcmNlbnQgQWJvdmUgQ29uc2VydmF0aXZlIFRhcmdldCIsIHBhc3RlMChwZXJjZW50X2Fib3ZlX3RhcmdldF9jb25zZXJ2YXRpdmUsICIlIiksICJQZXJjZW50YWdlIG9mIHZhbHVlcyBhYm92ZSB0aGUgY29uc2VydmF0aXZlIHRhcmdldCBzcGVjaWZpZWQgaW4gUHJlZmVycmVkIFRhcmdldHMgc2VjdGlvbi4iLA0KICAiUGVyY2VudCBBYm92ZSBNb2RlcmF0ZSBUYXJnZXQiLCBwYXN0ZTAocGVyY2VudF9hYm92ZV90YXJnZXRfbW9kZXJhdGUsICIlIiksICJQZXJjZW50YWdlIG9mIHZhbHVlcyBhYm92ZSB0aGUgbW9kZXJhdGUgdGFyZ2V0IHNwZWNpZmllZCBpbiBQcmVmZXJyZWQgVGFyZ2V0cyBzZWN0aW9uLiIsDQogICJQZXJjZW50IEFib3ZlIEFnZ3Jlc3NpdmUgVGFyZ2V0IiwgcGFzdGUwKHBlcmNlbnRfYWJvdmVfdGFyZ2V0X2FnZ3Jlc3NpdmUsICIlIiksICJQZXJjZW50YWdlIG9mIHZhbHVlcyBhYm92ZSB0aGUgYWdncmVzc2l2ZSB0YXJnZXQgc3BlY2lmaWVkIGluIFByZWZlcnJlZCBUYXJnZXRzIHNlY3Rpb24uIg0KKQ0KDQojIENvbnZlcnQgdG8gY2hhcmFjdGVyIHRvIGF2b2lkIGF1dG9tYXRpYyBkZWNpbWFsIHBvaW50cyBvbiB3aG9sZSBudW1iZXJzDQphbXpuX3Jhd19zdW1tYXJ5IDwtIGFtem5fcmF3X3N1bW1hcnkgJT4lDQogIG11dGF0ZShhY3Jvc3MoZXZlcnl0aGluZygpLCBhcy5jaGFyYWN0ZXIpKQ0KDQojIERpc3BsYXkgZm9ybWF0dGVkIHRhYmxlDQpjYXQoIlxuXG4jIyMjIEFubnVhbCBHcm93dGggUmF0ZSBTdW1tYXJ5ICgiLCBtaW5feWVhciwgIi0iLCBtYXhfeWVhciwgIilcbiIsIHNlcCA9ICIiKQ0KZm9ybWF0XzNjb2xfY3VzdG9tX3dpZHRocyhhbXpuX3Jhd19zdW1tYXJ5LCBjb2wxX3dpZHRoID0gIjIwZW0iLCBjb2wyX3dpZHRoID0gIjEwZW0iLCBjb2wzX3dpZHRoID0gIjQwZW0iKSANCg0KIyBWaWV3KGFtem5fcmF3X3N1bW1hcnkpDQppbnRlcmFjdGl2ZV9zdHIoYW16bl9yYXdfc3VtbWFyeSkNCg0KYGBgDQoNCkFNWk4ncyBJbmRleCBleGhpYml0cyBhIGByIGlmKGNhZ3JfdmFsdWUgPiB0YXJnZXRfYWdncmVzc2l2ZSkgImFnZ3Jlc3NpdmUiIGVsc2UgaWYoY2Fncl92YWx1ZSA+IHRhcmdldF9tb2RlcmF0ZSkgIm1vZGVyYXRlIiBlbHNlIGlmKGNhZ3JfdmFsdWUgPiB0YXJnZXRfY29uc2VydmF0aXZlKSAiY29uc2VydmF0aXZlIiBlbHNlIGlmKGNhZ3JfdmFsdWUgPiB0YXJnZXRfaW5mbGF0aW9uKSAiYmFzZWxpbmUiIGVsc2UgImRpc2FwcG9pbnRpbmciYCBDQUdSIGF0IGByIGNhZ3JfdmFsdWVgJSwgYHIgaWYoY2Fncl92YWx1ZSA8IG1lYW5fdmFsdWUpICJsb3dlciB0aGFuIiBlbHNlICJoaWdoZXIgdGhhbiJgIHRoZSBtZWFuIGdyb3d0aCByYXRlIG9mIGByIG1lYW5fdmFsdWVgJSwgcmVmbGVjdGluZyB0aGUgaW1wYWN0IG9mIHNob3J0LXRlcm0gdm9sYXRpbGl0eSBhbmQgYHIgaWYoY2Fncl92YWx1ZSA+IG1lYW5fdmFsdWUpICJkZWNsaW5lcyIgZWxzZSAiZ3Jvd3RoIHNwaWtlcyJgLiBUaGUgbWVkaWFuIHJldHVybiBvZiBgciBtZWRpYW5fdmFsdWVgJSBpbmRpY2F0ZXMgdGhhdCBtb3JlIHRoYW4gaGFsZiBvZiB0aGUgb2JzZXJ2ZWQgeWVhcnMgZXhwZXJpZW5jZWQgcmV0dXJucyBgciBpZihjYWdyX3ZhbHVlIDwgbWVkaWFuX3ZhbHVlKSAiYWJvdmUiIGVsc2UgImJlbG93ImAgdGhlIG1lYW4uIFRoZSByZWxhdGlvbnNoaXAgYmV0d2VlbiB0aGUgQ0FHUiBhbmQgdGhlIG1lZGlhbiBncm93dGggcmF0ZSBzdWdnZXN0cyB0aGF0IHN1c3RhaW5lZCBwZXJpb2RzIG9mIGFib3ZlLW1lZGlhbiBncm93dGggaGF2ZSBleGVydGVkIGN1bXVsYXRpdmUgYHIgaWYoY2Fncl92YWx1ZSA8IG1lZGlhbl92YWx1ZSkgInVwd2FyZCBwcmVzc3VyZSIgZWxzZSAiZG93bndhcmQgcHJlc3N1cmUiYCBvbiBvdmVyYWxsIHByaWNlIGxldmVscy4gVGhpcyByZWxhdGlvbnNoaXAgaGlnaGxpZ2h0cyBhIGRpc3RyaWJ1dGlvbiB3aXRoIG5vdGFibGUgZXh0cmVtZXMgb24gdGhlIGByIGlmKGNhZ3JfdmFsdWUgPCBtZWFuX3ZhbHVlKSAiaGlnaGVyIiBlbHNlICJsb3dlciJgIGVuZCwgcmVmbGVjdGluZyBgciBpZihjYWdyX3ZhbHVlIDwgbWVhbl92YWx1ZSkgInBvc2l0aXZlIiBlbHNlICJuZWdhdGl2ZSJgIHNrZXduZXNzLiBUaGlzIGByIGlmKGNhZ3JfdmFsdWUgPCBtZWRpYW5fdmFsdWUpICJwb3NpdGl2ZSIgZWxzZSAibmVnYXRpdmUiYCBza2V3bmVzcyBpbXBsaWVzIHRoYXQgd2hpbGUgbW9yZSB0aGFuIGhhbGYgb2YgdGhlIG9ic2VydmVkIHllYXJzIGV4cGVyaWVuY2VkIHJldHVybnMgYHIgaWYoY2Fncl92YWx1ZSA8IG1lZGlhbl92YWx1ZSkgImFib3ZlIHRoZSBtZWFuLCBkb3dudHVybnMgY2FuIGJlIHNldmVyZSIgZWxzZSAiYmVsb3cgdGhlIG1lYW4sIHVwdHVybnMgY2FuIGJlIHNpZ25pZmljYW50ImAuIEhvd2V2ZXIsIHRoZSBtYXJrZXQgaGFzIGhpc3RvcmljYWxseSBwcm92aWRlZCBzdWJzdGFudGlhbCBgciBpZihjYWdyX3ZhbHVlIDwgbWVkaWFuX3ZhbHVlKSAidXBzaWRlIHBvdGVudGlhbCIgZWxzZSAiZG93bnNpZGUgcmlzayJgLiBBZGRpdGlvbmFsbHksIHRoZSBmYWN0IHRoYXQgYHIgcGVyY2VudF9hYm92ZV90YXJnZXRfaW5mbGF0aW9uYCUgb2YgdGhlIHllYXJzIGV4Y2VlZGVkIHRoZSBpbmZsYXRpb24gdGFyZ2V0IGByIGlmIChwZXJjZW50X2Fib3ZlX3RhcmdldF9pbmZsYXRpb24gPiA3MCkgInJlaW5mb3JjZXMgQU1aTidzIGVmZmVjdGl2ZW5lc3MgYXMgYSBzdHJvbmcgbG9uZy10ZXJtIGhlZGdlIiBlbHNlIGlmIChwZXJjZW50X2Fib3ZlX3RhcmdldF9pbmZsYXRpb24gPiA2MCkgInJlaW5mb3JjZXMgQU1aTidzIGVmZmVjdGl2ZW5lc3MgYXMgYSBsb25nLXRlcm0gaGVkZ2UiIGVsc2UgaWYgKHBlcmNlbnRfYWJvdmVfdGFyZ2V0X2luZmxhdGlvbiA+IDUwKSAicXVlc3Rpb25zIEFNWk4ncyBlZmZlY3RpdmVuZXNzICBhcyBhIGxvbmctdGVybSBoZWRnZSIgZWxzZSAidW5kZXJtaW5lcyBBTVpOJ3MgZWZmZWN0aXZlbmVzcyBhcyBhIGxvbmctdGVybSBoZWRnZSJgIGFnYWluc3QgaW5mbGF0aW9uLg0KDQpUaGUgc3RhbmRhcmQgZGV2aWF0aW9uIG9mIGByIHNkX3ZhbHVlYCUgYHIgaWYoc2RfdmFsdWUgPiAyMCkgImluZGljYXRlcyBleHRyZW1lIHZvbGF0aWxpdHksIHJlZmxlY3Rpbmcgc3Vic3RhbnRpYWwgZmx1Y3R1YXRpb25zIGluIGVxdWl0eSBtYXJrZXRzIiBlbHNlIGlmKHNkX3ZhbHVlID4gMTUpICJ1bmRlcnNjb3JlcyBzaWduaWZpY2FudCB2b2xhdGlsaXR5LCBhIGNvbW1vbiBmZWF0dXJlIG9mIGVxdWl0eSBtYXJrZXRzIiBlbHNlICJzdWdnZXN0cyBtb2RlcmF0ZSB2b2xhdGlsaXR5LCB0eXBpY2FsIG9mIHJlbGF0aXZlbHkgc3RhYmxlIG1hcmtldHMiYC4gVGhlIGByIHJhbmdlX3JhdGlvIDwtIChtYXhfdmFsdWUgLSBtaW5fdmFsdWUpIC8gc2RfdmFsdWU7IGlmKHJhbmdlX3JhdGlvID4gNSkgImhpZ2hseSB2b2xhdGlsZSIgZWxzZSBpZihyYW5nZV9yYXRpbyA+IDMpICJub3RhYmxlIiBlbHNlICJjb21wYXJhdGl2ZWx5IHN0YWJsZSJgIHJhbmdlIG9mIGFubnVhbCByZXR1cm5zLCBzcGFubmluZyBmcm9tIGByIG1pbl92YWx1ZWAlIHRvIGByIG1heF92YWx1ZWAlLCBgciBpZihyYW5nZV9yYXRpbyA+IDUpICJpbGx1c3RyYXRlcyBhIGhpZ2hseSB2b2xhdGlsZSBtYXJrZXQgZW52aXJvbm1lbnQsIHBhcnRseSBkdWUgdG8gaXRzIGNvbXBvc2l0aW9uLCB3aXRoIHRoZSBwb3RlbnRpYWwgZm9yIGJvdGggZXh0cmVtZSBnYWlucyBhbmQgbG9zc2VzIiBlbHNlIGlmKHJhbmdlX3JhdGlvID4gMykgImhpZ2hsaWdodHMgbm90YWJsZSBtYXJrZXQgdmFyaWFiaWxpdHksIHBhcnRseSBkdWUgdG8gaXRzIGNvbXBvc2l0aW9uLCAgcmVmbGVjdGluZyBib3RoIG9wcG9ydHVuaXRpZXMgYW5kIHJpc2tzIiBlbHNlICJpbmRpY2F0ZXMgYSBjb21wYXJhdGl2ZWx5IHN0YWJsZSBtYXJrZXQsIHBhcnRseSBkdWUgdG8gaXRzIGNvbXBvc2l0aW9uLCB3aXRoIGxlc3MgZXh0cmVtZSBhbm51YWwgZmx1Y3R1YXRpb25zImAuIA0KDQpGb3IgQU1aTiB0byBiZSBjb25zaWRlcmVkIGEgaGlnaC1wZXJmb3JtaW5nIGFuZCByZXNpbGllbnQgbG9uZy10ZXJtIGludmVzdG1lbnQsIGl0IHdvdWxkIGJlIGlkZWFsIHRvIGV4Y2VlZCB0aGUgYWdncmVzc2l2ZSB0YXJnZXQgIChlLmcuLCBgciAodGFyZ2V0X2FnZ3Jlc3NpdmUgLSB0YXJnZXRfaW5mbGF0aW9uKWAlIGFubnVhbGl6ZWQgcmV0dXJucywgYWNjb3VudGluZyBmb3IgaGlnaGVyIGluZmxhdGlvbi1hZGp1c3RlZCBwZXJmb3JtYW5jZSBleHBlY3RhdGlvbnMpIGluIGF0IGxlYXN0IDQwJS01MCUgb2YgdGhlIHllYXJzLiBUaGlzIHJhbmdlIHJlZmxlY3RzIHRoZSBwb3RlbnRpYWwgZm9yIHN0cm9uZyB1cHNpZGUgaW4gbWFueSB5ZWFycyB3aGlsZSBiYWxhbmNpbmcgdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBtYXJrZXRzIGRvIGV4cGVyaWVuY2UgZG93bnR1cm5zLiBUaGUgZmFjdCB0aGF0IGByIHBlcmNlbnRfYWJvdmVfdGFyZ2V0X2FnZ3Jlc3NpdmVgJSBvZiB0aGUgeWVhcnMgZXhjZWVkZWQgdGhlIGFnZ3Jlc3NpdmUgdGFyZ2V0IGByIGlmKHBlcmNlbnRfYWJvdmVfdGFyZ2V0X2FnZ3Jlc3NpdmUgPiA1MCkgImluZGljYXRlcyBjb25zaXN0ZW50IGFuZCByb2J1c3QgZ3Jvd3RoLCBtYWtpbmcgQU1aTiBhIHN0cm9uZyBvcHRpb24gZm9yIHRob3NlIHNlZWtpbmcgYWdncmVzc2l2ZSBpbnZlc3RtZW50cy4iIGVsc2UgaWYocGVyY2VudF9hYm92ZV90YXJnZXRfYWdncmVzc2l2ZSA+IDQwKSAic3VnZ2VzdHMgdGhhdCB3aGlsZSBub3QgY29uc2lzdGVudCwgQU1aTiBoYXMgaGlzdG9yaWNhbGx5IHByb3ZpZGVkIHJvYnVzdCBncm93dGggb3ZlciB0aGUgbG9uZyB0ZXJtLCBtYWtpbmcgaXQgYSB2aWFibGUgaW52ZXN0bWVudCBmb3IgdGhvc2Ugd2l0aCBhIGhpZ2hlciByaXNrIHRvbGVyYW5jZS4iIGVsc2UgInJhaXNlcyBjb25jZXJucyBhYm91dCBBTVpOJ3MgYWJpbGl0eSB0byBtZWV0IGFnZ3Jlc3NpdmUgZ3Jvd3RoIHRhcmdldHMsIG1ha2luZyBpdCBsZXNzIHN1aXRhYmxlIGZvciBpbnZlc3RvcnMgd2l0aCBoaWdoZXIgcmlzayB0b2xlcmFuY2UuImANCg0KIyMjIEdyYXBoDQoNCmBgYHtyIGFtem5fcmF3X2dyYXBoLCBmaWcud2lkdGg9MTAsIGZpZy5oZWlnaHQ9NywgZXZhbD1UUlVFLCBlY2hvPUZBTFNFfQ0KDQojIExvYWQgbmVjZXNzYXJ5IGxpYnJhcmllcw0KbGlicmFyeShnZ3Bsb3QyKQ0KbGlicmFyeShkcGx5cikNCg0KIyBDb252ZXJ0IGAxLVllYXIgQ0FHUmAgdG8gbnVtZXJpYyBmb3IgcGxvdHRpbmcNCmFtem5fcmF3IDwtIGFtem5fcmF3ICU+JQ0KICBtdXRhdGUoDQogICAgYERhdGVgID0gYXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIoYERhdGVgKSksICAjIEVuc3VyZSBEYXRlIGlzIG51bWVyaWMNCiAgICBgMS1ZZWFyIENBR1JgID0gYXMubnVtZXJpYyhnc3ViKCIlIiwgIiIsIGAxLVllYXIgQ0FHUmApKQ0KICApDQoNCiMgRmluZCB0aGUgbWluaW11bSBhbmQgbWF4aW11bSB4LXZhbHVlIGluIHlvdXIgZGF0YQ0KbWF4X3ggPC0gbWF4KGFzLmludGVnZXIoYW16bl9yYXckRGF0ZSksIG5hLnJtID0gVFJVRSkNCm1pbl94IDwtIG1pbihhcy5pbnRlZ2VyKGFtem5fcmF3JERhdGUpLCBuYS5ybSA9IFRSVUUpDQppbnRlcmFjdGl2ZV9wcmludChtYXhfeCkgICMgVGVzdA0KaW50ZXJhY3RpdmVfcHJpbnQobWluX3gpICAjIFRlc3QNCg0KIyBGaW5kIHRoZSBtaW5pbXVtIGFuZCBtYXhpbXVtIHllYXINCm1pbl95ZWFyIDwtIG1pbihhbXpuX3JhdyREYXRlLCBuYS5ybSA9IFRSVUUpDQptYXhfeWVhciA8LSBtYXgoYW16bl9yYXckRGF0ZSwgbmEucm0gPSBUUlVFKQ0KaW50ZXJhY3RpdmVfcHJpbnQobWluX3llYXIpDQppbnRlcmFjdGl2ZV9wcmludChtYXhfeWVhcikNCg0KDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KIyMgUExPVCBGVUxMIFdJVEhPVVQgTElNSVRTDQoNCiMgRGVmaW5lIHN0YXJ0IGFuZCBlbmQgeWVhcnMNCnN0YXJ0X3llYXIgPC0gYXMubnVtZXJpYyhtaW5feWVhciArIDEpDQplbmRfeWVhciA8LSAyMDI0DQp5ZWFyX3JhbmdlIDwtIGVuZF95ZWFyIC0gc3RhcnRfeWVhciArIDEgICMgQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgeWVhcnMNCg0KIyBEZWZpbmUgYnJlYWtzIHJvdW5kZWQgYXBwcm9wcmlhdGVseQ0KbGltaXRzX3N0YXJ0X3llYXIgPC0gZmxvb3Ioc3RhcnRfeWVhciAvIDUpICogNSAgIyBSb3VuZCBkb3duIHRvIHRoZSBuZWFyZXN0IG11bHRpcGxlIG9mIDUNCmxpbWl0c19lbmRfeWVhciA8LSBjZWlsaW5nKGVuZF95ZWFyIC8gNSkgKiA1ICAgIyBSb3VuZCB1cCB0byB0aGUgbmVhcmVzdCBtdWx0aXBsZSBvZiA1DQoNCiMgQ3JlYXRlIGR5bmFtaWMgdGl0bGUgYW5kIGNhcHRpb24NCmR5bmFtaWNfdGl0bGUgPC0gcGFzdGUwKCJBbm51YWwgR3Jvd3RoIFJhdGVzIE92ZXIgIix5ZWFyX3JhbmdlLCAiIFllYXJzICgiLCBzdGFydF95ZWFyLCAiLSIsIGVuZF95ZWFyLCAiKSIpDQpkeW5hbWljX2NhcHRpb24gPC0gcGFzdGUwKCJBTVpOIEFubnVhbCBHcm93dGggUmF0ZXMsIERhdGEgUGVyaW9kICgiLCBtaW5feWVhciwgIuKAkyIsIG1heF95ZWFyLCAiKSIpDQoNCiMgQ3JlYXRlIHRoZSBmdWxsLCBub24tZmlsdGVyZWQgeC1heGlzIHBsb3Qgd2l0aCBkeW5hbWljIHggcGxhY2VtZW50IGZvciBhbm5vdGF0aW9ucw0KcDEgPC0gZ2dwbG90KGFtem5fcmF3LCBhZXMoeCA9IGFzLmludGVnZXIoRGF0ZSksIHkgPSBgMS1ZZWFyIENBR1JgKSkgKw0KICANCiAgIyBBZGQgc2hhZGVkIGFyZWFzIGZvciBiYWNrZ3JvdW5kIGVmZmVjdA0KICBnZW9tX3JlY3QoYWVzKHhtaW4gPSAtSW5mLCB4bWF4ID0gSW5mLCB5bWluID0gdGFyZ2V0X2FnZ3Jlc3NpdmUsIHltYXggPSBJbmYpLCBmaWxsID0gImxpZ2h0Z3JlZW4iLCBhbHBoYSA9IDAuMDI1KSArDQogIGdlb21fcmVjdChhZXMoeG1pbiA9IC1JbmYsIHhtYXggPSBJbmYsIHltaW4gPSB0YXJnZXRfY29uc2VydmF0aXZlLCB5bWF4ID0gdGFyZ2V0X2FnZ3Jlc3NpdmUpLCBmaWxsID0gIm9yYW5nZSIsIGFscGhhID0gMC4wMjUpICsNCiAgZ2VvbV9yZWN0KGFlcyh4bWluID0gLUluZiwgeG1heCA9IEluZiwgeW1pbiA9IC1JbmYsIHltYXggPSB0YXJnZXRfY29uc2VydmF0aXZlKSwgZmlsbCA9ICJsaWdodGNvcmFsIiwgYWxwaGEgPSAwLjAyNSkgKw0KICANCiAgIyBQbG90IGxpbmVzLCBwb2ludHMsIGFuZCBhbm5vdGF0aW9ucyBvbiB0b3Agb2Ygc2hhZGVkIGFyZWFzDQogIGdlb21fbGluZShjb2xvciA9ICIjNEIwMDgyIiwgc2l6ZSA9IDEuMCkgKyAgICAgICAjIERhcmsgcHVycGxlIGxpbmUgDQogIGdlb21fcG9pbnQoY29sb3IgPSAiIzRCMDA4MiIsIHNpemUgPSAxLjUpICsgICAgICAgICMgRGFyayBwdXJwbGUgcG9pbnRzIA0KICANCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gdGFyZ2V0X2FnZ3Jlc3NpdmUsIGNvbG9yID0gImRhcmtibHVlIiwgbGluZXR5cGUgPSAic29saWQiKSArDQogICMgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gdGFyZ2V0X21vZGVyYXRlLCBjb2xvciA9ICJkYXJrYmx1ZSIsIGxpbmV0eXBlID0gInNvbGlkIikgKw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSB0YXJnZXRfY29uc2VydmF0aXZlLCBjb2xvciA9ICJkYXJrYmx1ZSIsIGxpbmV0eXBlID0gInNvbGlkIikgKw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSB0YXJnZXRfaW5mbGF0aW9uLCBjb2xvciA9ICJkYXJrcmVkIiwgbGluZXR5cGUgPSAiZGFzaGVkIikgKw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSBjYWdyX3ZhbHVlLCBjb2xvciA9ICJkYXJrcmVkIiwgbGluZXR5cGUgPSAiZGFzaGVkIikgKw0KICANCiAgIyBEeW5hbWljIHJpZ2h0LWFsaWduZWQgcGxhY2VtZW50IGZvciBhbm5vdGF0aW9ucw0KICBhbm5vdGF0ZSgidGV4dCIsIHggPSBJbmYsIHkgPSB0YXJnZXRfYWdncmVzc2l2ZSwgbGFiZWwgPSAiQWdncmVzc2l2ZSIsIA0KICAgICAgICAgICBoanVzdCA9IDEsIHZqdXN0ID0gLTAuNTAsIGNvbG9yID0gImRhcmtibHVlIiwgc2l6ZSA9IDQpICsNCiAgIyBhbm5vdGF0ZSgidGV4dCIsIHggPSBJbmYsIHkgPSB0YXJnZXRfbW9kZXJhdGUsIGxhYmVsID0gIk1vZGVyYXRlIiwgDQogICMgICAgICAgICBoanVzdCA9IDEsIHZqdXN0ID0gLTAuNTAsIGNvbG9yID0gImRhcmtibHVlIiwgc2l6ZSA9IDQpICsNCiAgYW5ub3RhdGUoInRleHQiLCB4ID0gSW5mLCB5ID0gdGFyZ2V0X2NvbnNlcnZhdGl2ZSwgbGFiZWwgPSAiQ29uc2VydmF0aXZlIiwgDQogICAgICAgICAgIGhqdXN0ID0gMSwgdmp1c3QgPSAtMC41MCwgY29sb3IgPSAiZGFya2JsdWUiLCBzaXplID0gNCkgKw0KICBhbm5vdGF0ZSgidGV4dCIsIHggPSBJbmYsIHkgPSB0YXJnZXRfaW5mbGF0aW9uLCBsYWJlbCA9ICJJbmZsYXRpb24iLCANCiAgICAgICAgICAgaGp1c3QgPSAxLCB2anVzdCA9ICsxLjEwLCBjb2xvciA9ICJkYXJrcmVkIiwgc2l6ZSA9IDQpICsNCiAgYW5ub3RhdGUoInRleHQiLCB4ID0gSW5mLCB5ID0gY2Fncl92YWx1ZSwgbGFiZWwgPSAiQ0FHUiIsIA0KICAgICAgICAgICBoanVzdCA9IDEsIHZqdXN0ID0gLTAuNTAsIGNvbG9yID0gImRhcmtyZWQiLCBzaXplID0gNCkgKyANCg0KICBsYWJzKA0KICAgIHRpdGxlID0gZHluYW1pY190aXRsZSwNCiAgICB4ID0gIlllYXIiLA0KICAgIHkgPSAiR3Jvd3RoIFJhdGUgKCUpIiwNCiAgICBjYXB0aW9uID0gZHluYW1pY19jYXB0aW9uDQogICkgKw0KDQogIHNjYWxlX3hfY29udGludW91cygNCiAgICBsaW1pdHMgPSBjKHN0YXJ0X3llYXIsIGVuZF95ZWFyICsgMyksICMgUmVzdHJpY3RzIHgtYXhpcyBkYXRhIA0KICAgIGJyZWFrcyA9IHNlcShsaW1pdHNfc3RhcnRfeWVhciwgbGltaXRzX2VuZF95ZWFyLCA1KSAjIFNldHMgTWFqb3IgeC1heGlzICANCiAgKSArICAjIFJlc3RyaWN0ICYgU2V0IE1ham9yIHgtYXhpcyBsaW5lcyANCiAgICANCiAgdGhlbWVfbWluaW1hbCgpICsNCiAgdGhlbWUoDQogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSwgc2l6ZSA9IDIwKSwgICAgICAgICAjIExhcmdlciB0aXRsZSBmb250DQogICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCksICAgICAgICAgICAgICAgICAgICAjIExhcmdlciB4LWF4aXMgbGFiZWwgZm9udA0KICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQpLCAgICAgICAgICAgICAgICAgICAgIyBMYXJnZXIgeS1heGlzIGxhYmVsIGZvbnQNCiAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEsIHNpemUgPSAxNCksICAjIExhcmdlciB4LWF4aXMgdGV4dA0KICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCksICAgICAgICAgICAgICAgICAgICAgIyBMYXJnZXIgeS1heGlzIHRleHQNCiAgICBwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9saW5lKGxpbmV0eXBlID0gImRvdHRlZCIsIGNvbG9yID0gImJsYWNrIiksICAgICAgICAgIyBNYWpvciBncmlkIGxpbmVzDQogICAgcGFuZWwuZ3JpZC5taW5vci54ID0gZWxlbWVudF9ibGFuaygpLCAjIGVsZW1lbnRfbGluZShjb2xvciA9ICJncmV5ODAiKSAgIyBNaW5vciB4IGdyaWQgbGluZXMgZm9yIGVhY2ggeWVhcg0KICAgICMgcGFuZWwuYm9yZGVyID0gZWxlbWVudF9yZWN0KGNvbG9yID0gImRhcmtncmV5IiwgZmlsbCA9IE5BLCBzaXplID0gMS4wKSAgIyBEYXJrIGJvcmRlciBhcm91bmQgdGhlIHBsb3QNCiAgICBheGlzLnRpY2tzLmxlbmd0aCA9IHVuaXQoLTAuMjUsICJjbSIpLCAgICAgICAgICAgICAgICAgICAgICAjIEluY3JlYXNlIHRpY2sgbGVuZ3RoDQogICAgYXhpcy50aWNrcyA9IGVsZW1lbnRfbGluZShjb2xvciA9ICJibGFjayIsIHNpemUgPSAwLjUwKSwgIyBEYXJrZXIgdGlja3MNCiAgICBheGlzLmxpbmUueCA9IGVsZW1lbnRfbGluZShjb2xvciA9ICJibGFjayIsIHNpemUgPSAwLjc1KSwgICMgRGFyayBib3R0b20gYm9yZGVyDQogICAgYXhpcy5saW5lLnkgPSBlbGVtZW50X2xpbmUoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMC43NSkgICAjIERhcmsgbGVmdCBib3JkZXINCiAgKQ0KDQpwcmludChwMSkNCg0KDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KIyMgUExPVCBSRVNUUklDVEVEIFdJVEggTElNSVRTDQoNCiMgRmlsdGVyIHRoZSBkYXRhIGZvciB0aGUgcmVzdHJpY3RlZCB4LWF4aXMgcmFuZ2UgKDIwMDYtMjAyNCkNCnJlc3RyaWN0ZWRfZGF0YSA8LSBhbXpuX3JhdyAlPiUNCiAgZmlsdGVyKGFzLmludGVnZXIoRGF0ZSkgPj0gMjAwNiAmIGFzLmludGVnZXIoRGF0ZSkgPD0gMjAyNCkNCg0KIyBEZWZpbmUgc3RhcnQgYW5kIGVuZCB5ZWFycw0Kc3RhcnRfeWVhciA8LSAyMDA2DQplbmRfeWVhciA8LSAyMDI0DQp5ZWFyX3JhbmdlIDwtIGVuZF95ZWFyIC0gc3RhcnRfeWVhciArIDEgICMgQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgeWVhcnMNCg0KIyBEZWZpbmUgYnJlYWtzIHJvdW5kZWQgYXBwcm9wcmlhdGVseQ0KbGltaXRzX3N0YXJ0X3llYXIgPC0gZmxvb3Ioc3RhcnRfeWVhciAvIDUpICogNSAgIyBSb3VuZCBkb3duIHRvIHRoZSBuZWFyZXN0IG11bHRpcGxlIG9mIDUNCmxpbWl0c19lbmRfeWVhciA8LSBjZWlsaW5nKGVuZF95ZWFyIC8gNSkgKiA1ICAgIyBSb3VuZCB1cCB0byB0aGUgbmVhcmVzdCBtdWx0aXBsZSBvZiA1DQoNCiMgQ3JlYXRlIGR5bmFtaWMgdGl0bGUgYW5kIGNhcHRpb24NCmR5bmFtaWNfdGl0bGUgPC0gcGFzdGUwKCJBbm51YWwgR3Jvd3RoIFJhdGVzIE92ZXIgIix5ZWFyX3JhbmdlLCAiIFllYXJzICgiLCBzdGFydF95ZWFyLCAiLSIsIGVuZF95ZWFyLCAiKSIpDQpkeW5hbWljX2NhcHRpb24gPC0gcGFzdGUwKCJBTVpOIEFubnVhbCBHcm93dGggUmF0ZXMsIERhdGEgUGVyaW9kICgiLCBtaW5feWVhciwgIuKAkyIsIG1heF95ZWFyLCAiKSIpDQoNCiMgQ2FsY3VsYXRlIGR5bmFtaWMgeS1heGlzIGxpbWl0cyBmb3IgdGhlIHJlc3RyaWN0ZWQgZGF0YQ0KeV9taW4gPC0gbWluKHJlc3RyaWN0ZWRfZGF0YSRgMS1ZZWFyIENBR1JgLCBuYS5ybSA9IFRSVUUpDQp5X21heCA8LSBtYXgocmVzdHJpY3RlZF9kYXRhJGAxLVllYXIgQ0FHUmAsIG5hLnJtID0gVFJVRSkNCg0KIyBDcmVhdGUgdGhlIGZ1bGwsIG5vbi1maWx0ZXJlZCB4LWF4aXMgcGxvdCB3aXRoIGR5bmFtaWMgeCBwbGFjZW1lbnQgZm9yIGFubm90YXRpb25zDQpwMyA8LSBnZ3Bsb3QocmVzdHJpY3RlZF9kYXRhLCBhZXMoeCA9IGFzLmludGVnZXIoRGF0ZSksIHkgPSBgMS1ZZWFyIENBR1JgKSkgKw0KICANCiAgIyBBZGQgc2hhZGVkIGFyZWFzIGZvciBiYWNrZ3JvdW5kIGVmZmVjdA0KICBnZW9tX3JlY3QoYWVzKHhtaW4gPSAtSW5mLCB4bWF4ID0gSW5mLCB5bWluID0gdGFyZ2V0X2FnZ3Jlc3NpdmUsIHltYXggPSBJbmYpLCBmaWxsID0gImxpZ2h0Z3JlZW4iLCBhbHBoYSA9IDAuMDMwKSArDQogIGdlb21fcmVjdChhZXMoeG1pbiA9IC1JbmYsIHhtYXggPSBJbmYsIHltaW4gPSB0YXJnZXRfY29uc2VydmF0aXZlLCB5bWF4ID0gdGFyZ2V0X2FnZ3Jlc3NpdmUpLCBmaWxsID0gIm9yYW5nZSIsIGFscGhhID0gMC4wMzApICsNCiAgZ2VvbV9yZWN0KGFlcyh4bWluID0gLUluZiwgeG1heCA9IEluZiwgeW1pbiA9IC1JbmYsIHltYXggPSB0YXJnZXRfY29uc2VydmF0aXZlKSwgZmlsbCA9ICJsaWdodGNvcmFsIiwgYWxwaGEgPSAwLjAzMCkgKw0KICANCiAgIyBQbG90IGxpbmVzLCBwb2ludHMsIGFuZCBhbm5vdGF0aW9ucyBvbiB0b3Agb2Ygc2hhZGVkIGFyZWFzDQogIGdlb21fbGluZShjb2xvciA9ICIjNEIwMDgyIiwgc2l6ZSA9IDEuMCkgKyAgICAgICAjIERhcmsgcHVycGxlIGxpbmUgDQogIGdlb21fcG9pbnQoY29sb3IgPSAiIzRCMDA4MiIsIHNpemUgPSAxLjUpICsgICAgICAgICMgRGFyayBwdXJwbGUgcG9pbnRzIA0KICANCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gdGFyZ2V0X2FnZ3Jlc3NpdmUsIGNvbG9yID0gImRhcmtibHVlIiwgbGluZXR5cGUgPSAic29saWQiKSArDQogICMgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gdGFyZ2V0X21vZGVyYXRlLCBjb2xvciA9ICJkYXJrYmx1ZSIsIGxpbmV0eXBlID0gInNvbGlkIikgKw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSB0YXJnZXRfY29uc2VydmF0aXZlLCBjb2xvciA9ICJkYXJrYmx1ZSIsIGxpbmV0eXBlID0gInNvbGlkIikgKw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSB0YXJnZXRfaW5mbGF0aW9uLCBjb2xvciA9ICJkYXJrcmVkIiwgbGluZXR5cGUgPSAiZGFzaGVkIikgKw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSBjYWdyX3ZhbHVlLCBjb2xvciA9ICJkYXJrcmVkIiwgbGluZXR5cGUgPSAiZGFzaGVkIikgKw0KICANCiAgIyBEeW5hbWljIHJpZ2h0LWFsaWduZWQgcGxhY2VtZW50IGZvciBhbm5vdGF0aW9ucw0KICBhbm5vdGF0ZSgidGV4dCIsIHggPSBJbmYsIHkgPSB0YXJnZXRfYWdncmVzc2l2ZSwgbGFiZWwgPSAiQWdncmVzc2l2ZSIsIA0KICAgICAgICAgICBoanVzdCA9IDEsIHZqdXN0ID0gLTAuNTAsIGNvbG9yID0gImRhcmtibHVlIiwgc2l6ZSA9IDQpICsNCiAgIyBhbm5vdGF0ZSgidGV4dCIsIHggPSBJbmYsIHkgPSB0YXJnZXRfbW9kZXJhdGUsIGxhYmVsID0gIk1vZGVyYXRlIiwgDQogICMgICAgICAgICBoanVzdCA9IDEsIHZqdXN0ID0gLTAuNTAsIGNvbG9yID0gImRhcmtibHVlIiwgc2l6ZSA9IDQpICsNCiAgYW5ub3RhdGUoInRleHQiLCB4ID0gSW5mLCB5ID0gdGFyZ2V0X2NvbnNlcnZhdGl2ZSwgbGFiZWwgPSAiQ29uc2VydmF0aXZlIiwgDQogICAgICAgICAgIGhqdXN0ID0gMSwgdmp1c3QgPSAtMC41MCwgY29sb3IgPSAiZGFya2JsdWUiLCBzaXplID0gNCkgKw0KICBhbm5vdGF0ZSgidGV4dCIsIHggPSBJbmYsIHkgPSB0YXJnZXRfaW5mbGF0aW9uLCBsYWJlbCA9ICJJbmZsYXRpb24iLCANCiAgICAgICAgICAgaGp1c3QgPSAxLCB2anVzdCA9ICsxLjEwLCBjb2xvciA9ICJkYXJrcmVkIiwgc2l6ZSA9IDQpICsNCiAgYW5ub3RhdGUoInRleHQiLCB4ID0gSW5mLCB5ID0gY2Fncl92YWx1ZSwgbGFiZWwgPSAiQ0FHUiIsIA0KICAgICAgICAgICBoanVzdCA9IDEsIHZqdXN0ID0gLTAuNTAsIGNvbG9yID0gImRhcmtyZWQiLCBzaXplID0gNCkgKyANCg0KICBsYWJzKA0KICAgIHRpdGxlID0gZHluYW1pY190aXRsZSwNCiAgICB4ID0gIlllYXIiLA0KICAgIHkgPSAiR3Jvd3RoIFJhdGUgKCUpIiwNCiAgICBjYXB0aW9uID0gZHluYW1pY19jYXB0aW9uDQogICkgKw0KICANCiAgY29vcmRfY2FydGVzaWFuKHlsaW0gPSBjKHlfbWluLCB5X21heCkpICsgIyBBcHBseSBkeW5hbWljIHktYXhpcyBsaW1pdHMNCiAgc2NhbGVfeF9jb250aW51b3VzKA0KICAgIGxpbWl0cyA9IGMoc3RhcnRfeWVhciwgZW5kX3llYXIgKyAyKSwgDQogICAgYnJlYWtzID0gc2VxKGxpbWl0c19zdGFydF95ZWFyLCBsaW1pdHNfZW5kX3llYXIsIDUpDQogICkgKyAgIyBSZXN0cmljdCAmIFNldCBNYWpvciB4LWF4aXMgbGluZXMgZm9yIGVhY2ggeWVhcg0KDQogIHRoZW1lX21pbmltYWwoKSArDQogIHRoZW1lKA0KICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUsIHNpemUgPSAyMCksICAgICAgICAgIyBMYXJnZXIgdGl0bGUgZm9udA0KICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQpLCAgICAgICAgICAgICAgICAgICAgIyBMYXJnZXIgeC1heGlzIGxhYmVsIGZvbnQNCiAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0KSwgICAgICAgICAgICAgICAgICAgICMgTGFyZ2VyIHktYXhpcyBsYWJlbCBmb250DQogICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxLCBzaXplID0gMTQpLCAgIyBMYXJnZXIgeC1heGlzIHRleHQNCiAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQpLCAgICAgICAgICAgICAgICAgICAgICMgTGFyZ2VyIHktYXhpcyB0ZXh0DQogICAgcGFuZWwuZ3JpZC5tYWpvciA9IGVsZW1lbnRfbGluZShsaW5ldHlwZSA9ICJkb3R0ZWQiLCBjb2xvciA9ICJibGFjayIpLCAgICAgICAgICMgTWFqb3IgZ3JpZCBsaW5lcw0KICAgIHBhbmVsLmdyaWQubWlub3IueCA9IGVsZW1lbnRfYmxhbmsoKSwgIyBlbGVtZW50X2xpbmUoY29sb3IgPSAiZ3JleTgwIikgICMgTWlub3IgeCBncmlkIGxpbmVzIGZvciBlYWNoIHllYXINCiAgICAjIHBhbmVsLmJvcmRlciA9IGVsZW1lbnRfcmVjdChjb2xvciA9ICJkYXJrZ3JleSIsIGZpbGwgPSBOQSwgc2l6ZSA9IDEuMCkgICMgRGFyayBib3JkZXIgYXJvdW5kIHRoZSBwbG90DQogICAgYXhpcy50aWNrcy5sZW5ndGggPSB1bml0KC0wLjI1LCAiY20iKSwgICAgICAgICAgICAgICAgICAgICAgIyBJbmNyZWFzZSB0aWNrIGxlbmd0aA0KICAgIGF4aXMudGlja3MgPSBlbGVtZW50X2xpbmUoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMC41MCksICMgRGFya2VyIHRpY2tzDQogICAgYXhpcy5saW5lLnggPSBlbGVtZW50X2xpbmUoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMC43NSksICAjIERhcmsgYm90dG9tIGJvcmRlcg0KICAgIGF4aXMubGluZS55ID0gZWxlbWVudF9saW5lKGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDAuNzUpICAgIyBEYXJrIGxlZnQgYm9yZGVyDQogICkNCg0KcHJpbnQocDMpDQoNCmBgYA0KDQoNCiMjIEFNWk4gQ0FHUg0KDQojIyMgRGF0YQ0KDQpgYGB7ciBhbXpuX3Jhd19nciwgZXZhbD1UUlVFLCBlY2hvPUZBTFNFfQ0KDQojIFZpZXcobnJ0JGFtem5fcmF3X2dyKQ0KaW50ZXJhY3RpdmVfc3RyKG5ydCRhbXpuX3Jhd19ncikNCg0KbGlicmFyeShkcGx5cikNCmxpYnJhcnkobHVicmlkYXRlKSAgIyBGb3IgZGF0ZSBtYW5pcHVsYXRpb24NCmxpYnJhcnkoc2NhbGVzKQ0KbGlicmFyeShzdHJpbmdyKQ0KDQojIFVwZGF0ZSBkYXRhIGZyYW1lIHdpdGggcHJvcGVyIGRhdGUgYW5kIHBlcmNlbnRhZ2UgaGFuZGxpbmcNCmFtem5fcmF3X2dyIDwtIG5ydCRhbXpuX3Jhd19nciAlPiUNCiAgbXV0YXRlKA0KICAgICMgQ29udmVydCBDbG9zZSBEYXRlIHRvICJZWVlZLU1NLUREIiBmb3JtYXQNCiAgICBgRGF0ZWAgPSBmb3JtYXQoYXMuRGF0ZShhcy5jaGFyYWN0ZXIoYERhdGVgKSwgb3JpZ2luID0gIjE5NzAtMDEtMDEiKSwgIiVZLSVtLSVkIiksDQogICAgDQogICAgIyBFbnN1cmUgQ2xvc2UgaXMgYSBudW1iZXIgZm9ybWF0dGVkIHRvIDIgZGVjaW1hbCBwbGFjZXMNCiAgICBgQ2xvc2VgID0gbnVtYmVyKGFzLm51bWVyaWMoZ3N1YigiLCIsICIiLCBDbG9zZSkpLCBiaWcubWFyayA9ICIsIiwgZGVjaW1hbC5tYXJrID0gIi4iLCBhY2N1cmFjeSA9IDAuMDEpLA0KDQogICAgIyBDbGVhbiBhbmQgaGFuZGxlIHBlcmNlbnRhZ2UgY29sdW1ucw0KICAgIGFjcm9zcygzOjExLCB+IHsNCiAgICAgIHZhbHVlIDwtIGdzdWIoIlssJVxcc10iLCAiIiwgLikgICMgUmVtb3ZlICUsIGNvbW1hcywgYW5kIHNwYWNlcw0KICAgICAgbnVtZXJpY192YWx1ZSA8LSBzdXBwcmVzc1dhcm5pbmdzKGFzLm51bWVyaWModmFsdWUpKSAgIyBDb252ZXJ0IHRvIG51bWVyaWMNCiAgICAgIGlmZWxzZSgNCiAgICAgICAgIWlzLm5hKG51bWVyaWNfdmFsdWUpLCANCiAgICAgICAgcGFzdGUwKGZvcm1hdChyb3VuZChudW1lcmljX3ZhbHVlKjEwMCwgMiksIGJpZy5tYXJrID0gIiwiLCBzY2llbnRpZmljID0gRkFMU0UpLCAiJSIpLCAgIyBGb3JtYXQgdG8gMiBkZWNpbWFsIHBsYWNlcyBhbmQgYWRkIGNvbW1hcw0KICAgICAgICAuDQogICAgICApDQogICAgfSkNCiAgKSAlPiUNCiAgYXJyYW5nZShkZXNjKGBEYXRlYCkpICAjIFNvcnQgYnkgRGF0ZSBmcm9tIG5ld2VzdCB0byBvbGRlc3QNCg0KIyBDcmVhdGUgYW16bl9yYXdfZ3I6IENHUg0KYW16bl9yYXdfY2dyIDwtIGFtem5fcmF3X2dyICU+JQ0KICBzZWxlY3QoYERhdGVgLCBgQ2xvc2VgLCBgMS1ZZWFyIENBR1JgLCBjb250YWlucyAoIkNHUiIpKQ0KDQojIENyZWF0ZSBhbXpuX3Jhd19ncjogQ0FHUg0KYW16bl9yYXdfY2FnciA8LSBhbXpuX3Jhd19nciAlPiUNCiAgc2VsZWN0KGBEYXRlYCwgYENsb3NlYCwgY29udGFpbnMgKCJDQUdSIikpDQoNCiMgRGlzcGxheSBib3RoIHRhYmxlcyBmb3IgY29uZmlybWF0aW9uDQppbnRlcmFjdGl2ZV9wcmludChhbXpuX3Jhd19jZ3IpDQppbnRlcmFjdGl2ZV9wcmludChhbXpuX3Jhd19jYWdyKQ0KDQojIE9wdGlvbmFsOiBQcmludCB0YWJsZSBzdW1tYXJpZXMNCmludGVyYWN0aXZlX3N0cihhbXpuX3Jhd19jZ3IpDQppbnRlcmFjdGl2ZV9zdHIoYW16bl9yYXdfY2FncikNCg0KIyBEaXNwbGF5IGNhcHRpb25zIGZvciBlYWNoIHRhYmxlDQojIGNhdCgiXG5cbiMjIyMgQ3VtdWxhdGl2ZSBHcm93dGggUmF0ZXMgKCIsIG1pbl95ZWFyLCAiLSIsIG1heF95ZWFyLCAiKVxuIiwgc2VwID0gIiIpDQojIGZvcm1hdF9lcXVhbF93aWR0aChhbXpuX3Jhd19jZ3IpDQoNCmNhdCgiXG5cbiMjIyMgQ29tcG91bmQgQXZlcmFnZSBHcm93dGggUmF0ZXMgKCIsIG1pbl95ZWFyLCAiLSIsIG1heF95ZWFyLCAiKVxuIiwgc2VwID0gIiIpDQpmb3JtYXRfZXF1YWxfd2lkdGgoYW16bl9yYXdfY2FncikNCg0KIyBWaWV3KGFtem5fcmF3X2NhZ3IpDQojIGNvbG5hbWVzKGFtem5fcmF3X2NhZ3IpDQppbnRlcmFjdGl2ZV9zdHIoYW16bl9yYXdfY2FncikNCg0KDQpgYGANCg0KIyMjIFN1bW1hcnkNCg0KYGBge3IgYW16bl9yYXdfY2Fncl9zdW1tYXJ5LCBldmFsPVRSVUUsIGVjaG89RkFMU0V9DQoNCmludGVyYWN0aXZlX3N0cihhbXpuX3Jhd19jYWdyKQ0KDQojIExvYWQgbmVjZXNzYXJ5IGxpYnJhcmllcw0KbGlicmFyeShkcGx5cikNCmxpYnJhcnkodGliYmxlKQ0KDQojIERlZmluZSBhIGhlbHBlciBmdW5jdGlvbiB0byBjbGVhbiBhbmQgY29udmVydCBwZXJjZW50YWdlcw0KY2xlYW5fcGVyY2VudGFnZSA8LSBmdW5jdGlvbihjb2x1bW4pIHsNCiAgYXMubnVtZXJpYyhnc3ViKCIlIiwgIiIsIGNvbHVtbikpDQp9DQoNCiMgRGVmaW5lIHRoZSBzdGF0aXN0aWMgbmFtZXMgZm9yIHRoZSBzdW1tYXJ5IHRhYmxlDQpzdGF0aXN0aWNfbmFtZXMgPC0gYygNCiAgIkNvdW50IG9mIE9ic2VydmF0aW9ucyIsIA0KICAiTWVhbiIsIA0KICAiTWVkaWFuIiwNCiAgIlN0YW5kYXJkIERldmlhdGlvbiAoVm9sYXRpbGl0eSkiLCANCiAgIk1pbiBDQUdSIFJhbmdlIChDQUdSIC0gU0QpIiwNCiAgIk1heCBDQUdSIFJhbmdlIChDQUdSICsgU0QpIiwNCiAgIk1pbmltdW0iLCANCiAgIk1heGltdW0iLCANCiAgIlBlcmNlbnQgQWJvdmUgSW5mbGF0aW9uIFRhcmdldCIsIA0KICAiUGVyY2VudCBBYm92ZSBDb25zZXJ2YXRpdmUgVGFyZ2V0IiwgDQogICJQZXJjZW50IEFib3ZlIE1vZGVyYXRlIFRhcmdldCIsIA0KICAiUGVyY2VudCBBYm92ZSBBZ2dyZXNzaXZlIFRhcmdldCINCikNCg0KIyBBZGp1c3QgdGhlIGZpcnN0IHJvdydzIERhdGUgYW5kIGNsZWFuIHVwIENBR1IgY29sdW1ucw0KYW16bl9yYXdfY2FnciA8LSBhbXpuX3Jhd19jYWdyICU+JQ0KICBzbGljZSgtMSkgJT4lICMgUmVtb3ZlIHRoZSBmaXJzdCByb3cNCiAgbXV0YXRlKA0KICAgICMgRGF0ZSA9IGlmZWxzZShyb3dfbnVtYmVyKCkgPT0gMSwgIjIwMjUtMDEtMDEiLCBEYXRlKSwNCiAgICBEYXRlID0gYXMubnVtZXJpYyhmb3JtYXQoYXMuRGF0ZShEYXRlKSwgIiVZIikpLA0KICAgIGAxLVllYXIgQ0FHUmAgPSBjbGVhbl9wZXJjZW50YWdlKGAxLVllYXIgQ0FHUmApLA0KICAgIGA1LVllYXIgQ0FHUmAgPSBjbGVhbl9wZXJjZW50YWdlKGA1LVllYXIgQ0FHUmApLA0KICAgIGAxMC1ZZWFyIENBR1JgID0gY2xlYW5fcGVyY2VudGFnZShgMTAtWWVhciBDQUdSYCksDQogICAgYDIwLVllYXIgQ0FHUmAgPSBjbGVhbl9wZXJjZW50YWdlKGAyMC1ZZWFyIENBR1JgKSwNCiAgICBgMzAtWWVhciBDQUdSYCA9IGNsZWFuX3BlcmNlbnRhZ2UoYDMwLVllYXIgQ0FHUmApDQogICkNCg0KIyBGdW5jdGlvbiB0byBjYWxjdWxhdGUgc3RhdGlzdGljcyBmb3IgYSBnaXZlbiBkYXRhc2V0DQpjYWxjX3N0YXRzIDwtIGZ1bmN0aW9uKGRhdGEpIHsNCiAgaWYgKHN1bSghaXMubmEoZGF0YSkpIDwgMikgcmV0dXJuKHJlcChOQSwgbGVuZ3RoKHN0YXRpc3RpY19uYW1lcykpKSAgIyBIYW5kbGUgaW5zdWZmaWNpZW50IGRhdGENCg0KICBjb3VudF9vYnNlcnZhdGlvbnMgPC0gc3VtKCFpcy5uYShkYXRhKSkNCiAgbWVhbl92YWx1ZSA8LSByb3VuZChtZWFuKGRhdGEsIG5hLnJtID0gVFJVRSksIDIpDQogIG1lZGlhbl92YWx1ZSA8LSByb3VuZChtZWRpYW4oZGF0YSwgbmEucm0gPSBUUlVFKSwgMikNCiAgc2RfdmFsdWUgPC0gcm91bmQoc2QoZGF0YSwgbmEucm0gPSBUUlVFKSwgMikNCiAgbWluX2NhZ3JfcmFuZ2UgPC0gcm91bmQoY2Fncl92YWx1ZSAtIHNkX3ZhbHVlLCAyKQ0KICBtYXhfY2Fncl9yYW5nZSA8LSByb3VuZChjYWdyX3ZhbHVlICsgc2RfdmFsdWUsIDIpDQogIG1pbl92YWx1ZSA8LSByb3VuZChtaW4oZGF0YSwgbmEucm0gPSBUUlVFKSwgMikNCiAgbWF4X3ZhbHVlIDwtIHJvdW5kKG1heChkYXRhLCBuYS5ybSA9IFRSVUUpLCAyKQ0KICANCiAgIyBEZWZpbmUgaW5mbGF0aW9uIGFuZCBncm93dGggdGFyZ2V0cw0KICB0YXJnZXRfaW5mbGF0aW9uIDwtIDIgICMgRXhhbXBsZSB0YXJnZXQgZm9yIGluZmxhdGlvbg0KICB0YXJnZXRfY29uc2VydmF0aXZlIDwtIDMgKyB0YXJnZXRfaW5mbGF0aW9uDQogIHRhcmdldF9tb2RlcmF0ZSA8LSA1ICsgdGFyZ2V0X2luZmxhdGlvbg0KICB0YXJnZXRfYWdncmVzc2l2ZSA8LSAxMCArIHRhcmdldF9pbmZsYXRpb24NCiAgDQogIGFib3ZlX3RhcmdldF9pbmZsYXRpb24gPC0gc3VtKGRhdGEgPj0gdGFyZ2V0X2luZmxhdGlvbiwgbmEucm0gPSBUUlVFKQ0KICBhYm92ZV90YXJnZXRfY29uc2VydmF0aXZlIDwtIHN1bShkYXRhID49IHRhcmdldF9jb25zZXJ2YXRpdmUsIG5hLnJtID0gVFJVRSkNCiAgYWJvdmVfdGFyZ2V0X21vZGVyYXRlIDwtIHN1bShkYXRhID49IHRhcmdldF9tb2RlcmF0ZSwgbmEucm0gPSBUUlVFKQ0KICBhYm92ZV90YXJnZXRfYWdncmVzc2l2ZSA8LSBzdW0oZGF0YSA+PSB0YXJnZXRfYWdncmVzc2l2ZSwgbmEucm0gPSBUUlVFKQ0KICANCiAgcGVyY2VudF9hYm92ZV90YXJnZXRfY29uc2VydmF0aXZlIDwtIHJvdW5kKChhYm92ZV90YXJnZXRfY29uc2VydmF0aXZlIC8gY291bnRfb2JzZXJ2YXRpb25zKSAqIDEwMCwgMikNCiAgcGVyY2VudF9hYm92ZV90YXJnZXRfaW5mbGF0aW9uIDwtIHJvdW5kKChhYm92ZV90YXJnZXRfaW5mbGF0aW9uIC8gY291bnRfb2JzZXJ2YXRpb25zKSAqIDEwMCwgMikNCiAgcGVyY2VudF9hYm92ZV90YXJnZXRfbW9kZXJhdGUgPC0gcm91bmQoKGFib3ZlX3RhcmdldF9tb2RlcmF0ZSAvIGNvdW50X29ic2VydmF0aW9ucykgKiAxMDAsIDIpDQogIHBlcmNlbnRfYWJvdmVfdGFyZ2V0X2FnZ3Jlc3NpdmUgPC0gcm91bmQoKGFib3ZlX3RhcmdldF9hZ2dyZXNzaXZlIC8gY291bnRfb2JzZXJ2YXRpb25zKSAqIDEwMCwgMikNCiAgDQogIGMoDQogICAgY291bnRfb2JzZXJ2YXRpb25zLCANCiAgICBwYXN0ZTAobWVhbl92YWx1ZSwgIiUiKSwNCiAgICBwYXN0ZTAobWVkaWFuX3ZhbHVlLCAiJSIpLA0KICAgIHBhc3RlMChzZF92YWx1ZSwgIiUiKSwNCiAgICBwYXN0ZTAobWluX2NhZ3JfcmFuZ2UsICIlIiksDQogICAgcGFzdGUwKG1heF9jYWdyX3JhbmdlLCAiJSIpLA0KICAgIHBhc3RlMChtaW5fdmFsdWUsICIlIiksDQogICAgcGFzdGUwKG1heF92YWx1ZSwgIiUiKSwNCiAgICBwYXN0ZTAocGVyY2VudF9hYm92ZV90YXJnZXRfaW5mbGF0aW9uLCAiJSIpLA0KICAgIHBhc3RlMChwZXJjZW50X2Fib3ZlX3RhcmdldF9jb25zZXJ2YXRpdmUsICIlIiksIA0KICAgIHBhc3RlMChwZXJjZW50X2Fib3ZlX3RhcmdldF9tb2RlcmF0ZSwgIiUiKSwgDQogICAgcGFzdGUwKHBlcmNlbnRfYWJvdmVfdGFyZ2V0X2FnZ3Jlc3NpdmUsICIlIikNCiAgKQ0KfQ0KDQojIENvbHVtbnMgdG8gY2FsY3VsYXRlIENBR1Igc3RhdGlzdGljcw0KY2Fncl9jb2x1bW5zIDwtIGMoIjEtWWVhciBDQUdSIiwgIjUtWWVhciBDQUdSIiwgIjEwLVllYXIgQ0FHUiIsICIyMC1ZZWFyIENBR1IiLCAiMzAtWWVhciBDQUdSIikNCmV4aXN0aW5nX2NhZ3JfY29sdW1ucyA8LSBpbnRlcnNlY3QoY2Fncl9jb2x1bW5zLCBuYW1lcyhhbXpuX3Jhd19jYWdyKSkNCg0KIyBDYWxjdWxhdGUgc3RhdHMgZm9yIGVhY2ggQ0FHUiBjb2x1bW4NCmNhZ3Jfc3RhdHNfbGlzdCA8LSBsYXBwbHkoYW16bl9yYXdfY2FncltleGlzdGluZ19jYWdyX2NvbHVtbnNdLCBjYWxjX3N0YXRzKQ0KDQojIENvbXBpbGUgaW50byBhIHN1bW1hcnkgZGF0YSBmcmFtZQ0KYW16bl9yYXdfY2Fncl9zdW1tYXJ5IDwtIGFzLmRhdGEuZnJhbWUoZG8uY2FsbChjYmluZCwgY2Fncl9zdGF0c19saXN0KSkNCnJvd25hbWVzKGFtem5fcmF3X2NhZ3Jfc3VtbWFyeSkgPC0gc3RhdGlzdGljX25hbWVzDQoNCg0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiMjIFNBVkUgVkFMVUVTIEZPUiBJTi1MSU5FIENPREUNCg0KIyBEZWZpbmUgdGhlIG1hcHBpbmcgb2Ygcm93IG5hbWVzIHRvIHZhcmlhYmxlIG5hbWVzDQpyb3dfdG9fdmFyX25hbWUgPC0gYygNCiAgIkNvdW50IG9mIE9ic2VydmF0aW9ucyIgPSAiY291bnRfb2JzZXJ2YXRpb25zIiwNCiAgIk1lYW4iID0gIm1lYW5fdmFsdWUiLA0KICAiTWVkaWFuIiA9ICJtZWRpYW5fdmFsdWUiLA0KICAiU3RhbmRhcmQgRGV2aWF0aW9uIChWb2xhdGlsaXR5KSIgPSAic2RfdmFsdWUiLA0KICAiTWluIENBR1IgUmFuZ2UgKENBR1IgLSBTRCkiID0gIm1pbl9jYWdyX3JhbmdlIiwNCiAgIk1heCBDQUdSIFJhbmdlIChDQUdSICsgU0QpIiA9ICJtYXhfY2Fncl9yYW5nZSIsDQogICJNaW5pbXVtIiA9ICJtaW5fdmFsdWUiLA0KICAiTWF4aW11bSIgPSAibWF4X3ZhbHVlIiwNCiAgIlBlcmNlbnQgQWJvdmUgSW5mbGF0aW9uIFRhcmdldCIgPSAicGVyY2VudF9hYm92ZV90YXJnZXRfaW5mbGF0aW9uIiwNCiAgIlBlcmNlbnQgQWJvdmUgQ29uc2VydmF0aXZlIFRhcmdldCIgPSAicGVyY2VudF9hYm92ZV90YXJnZXRfY29uc2VydmF0aXZlIiwNCiAgIlBlcmNlbnQgQWJvdmUgTW9kZXJhdGUgVGFyZ2V0IiA9ICJwZXJjZW50X2Fib3ZlX3RhcmdldF9tb2RlcmF0ZSIsDQogICJQZXJjZW50IEFib3ZlIEFnZ3Jlc3NpdmUgVGFyZ2V0IiA9ICJwZXJjZW50X2Fib3ZlX3RhcmdldF9hZ2dyZXNzaXZlIg0KKQ0KDQojIEZ1bmN0aW9uIHRvIHNhdmUgc3VtbWFyeSB2YWx1ZXMgZHluYW1pY2FsbHkNCnNhdmVfY29sdW1uX3ZhbHVlcyA8LSBmdW5jdGlvbihzdW1tYXJ5X2RmKSB7DQogICMgRXhjbHVkZSB0aGUgIlN0YXRpc3RpYyIgYW5kICJPdmVyYWxsIiBjb2x1bW5zDQogIGNvbHVtbnNfdG9fc2F2ZSA8LSBzZXRkaWZmKG5hbWVzKHN1bW1hcnlfZGYpLCBjKCJTdGF0aXN0aWMiLCAiT3ZlcmFsbCIpKQ0KICANCiAgIyBJdGVyYXRlIG92ZXIgZWFjaCBjb2x1bW4NCiAgZm9yIChjb2wgaW4gY29sdW1uc190b19zYXZlKSB7DQogICAgIyBGb3JtYXQgY29sdW1uIG5hbWUgdG8gbG93ZXJjYXNlIGFuZCByZXBsYWNlIGludmFsaWQgY2hhcmFjdGVycw0KICAgIGNvbF9uYW1lIDwtIHRvbG93ZXIoZ3N1YigiW15hLXpBLVowLTldIiwgIl8iLCBjb2wpKQ0KICAgIA0KICAgICMgRXh0cmFjdCB2YWx1ZXMgZm9yIHRoZSBjdXJyZW50IGNvbHVtbg0KICAgIGNvbF92YWx1ZXMgPC0gc3VtbWFyeV9kZltbY29sXV0NCiAgICANCiAgICAjIFNhdmUgZWFjaCB2YWx1ZSBkeW5hbWljYWxseSB1c2luZyB0aGUgbWFwcGluZyBmb3Igcm93IG5hbWVzDQogICAgZm9yIChpIGluIHNlcV9hbG9uZyhjb2xfdmFsdWVzKSkgew0KICAgICAgIyBHZXQgdGhlIGNvcnJlc3BvbmRpbmcgdmFyaWFibGUgbmFtZSBmcm9tIHRoZSBtYXBwaW5nDQogICAgICBzdGF0X25hbWUgPC0gcm93X3RvX3Zhcl9uYW1lW3Jvd25hbWVzKHN1bW1hcnlfZGYpW2ldXQ0KICAgICAgDQogICAgICBpZiAoIWlzLm5hKHN0YXRfbmFtZSkpIHsgICMgU2tpcCBpZiBubyBtYXBwaW5nIGlzIGRlZmluZWQNCiAgICAgICAgIyBDcmVhdGUgdGhlIHZhcmlhYmxlIG5hbWUNCiAgICAgICAgdmFyX25hbWUgPC0gcGFzdGUwKHN0YXRfbmFtZSwgIl8iLCBjb2xfbmFtZSkNCiAgICAgICAgDQogICAgICAgICMgQXR0ZW1wdCBudW1lcmljIGNvbnZlcnNpb24gZm9yIGRvd25zdHJlYW0gdXNlDQogICAgICAgIHZhbHVlIDwtIHN1cHByZXNzV2FybmluZ3MoYXMubnVtZXJpYyhnc3ViKCIlIiwgIiIsIGNvbF92YWx1ZXNbaV0pKSkNCiAgICAgICAgDQogICAgICAgICMgQXNzaWduIHRoZSB2YWx1ZSB0byB0aGUgZ2xvYmFsIGVudmlyb25tZW50DQogICAgICAgIGFzc2lnbih2YXJfbmFtZSwgdmFsdWUsIGVudmlyID0gLkdsb2JhbEVudikNCiAgICAgIH0NCiAgICB9DQogIH0NCn0NCg0KIyBBcHBseSB0aGUgZnVuY3Rpb24gdG8gc2F2ZSB2YWx1ZXMgZm9yIGFsbCBjb2x1bW5zIGV4Y2VwdCAiT3ZlcmFsbCINCnNhdmVfY29sdW1uX3ZhbHVlcyhhbXpuX3Jhd19jYWdyX3N1bW1hcnkpDQoNCiMgRXhhbXBsZTogQWNjZXNzaW5nIGR5bmFtaWNhbGx5IGNyZWF0ZWQgdmFyaWFibGVzDQppbnRlcmFjdGl2ZV9wcmludChtZWFuX3ZhbHVlXzFfeWVhcl9jYWdyKSAgIyBTaG91bGQgcHJpbnQgdGhlIG1lYW4gdmFsdWUgZm9yIDEtWWVhciBDQUdSDQppbnRlcmFjdGl2ZV9wcmludChwZXJjZW50X2Fib3ZlX3RhcmdldF9pbmZsYXRpb25fNV95ZWFyX2NhZ3IpICAjIFNob3VsZCBwcmludCB0aGUgcGVyY2VudCBhYm92ZSBpbmZsYXRpb24gdGFyZ2V0IGZvciA1LVllYXIgQ0FHUg0KaW50ZXJhY3RpdmVfcHJpbnQoc2RfdmFsdWVfMTBfeWVhcl9jYWdyKSAgIyBTaG91bGQgcHJpbnQgdGhlIHN0YW5kYXJkIGRldmlhdGlvbiBmb3IgMTAtWWVhciBDQUdSDQoNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQojIyBPVkVSQUxMIFNUQVRJU1RJQ1MgDQpudW1lcmljX3ZhbHVlc19hbGwgPC0gYXMubnVtZXJpYyh1bmxpc3QoYW16bl9yYXdfY2FncltleGlzdGluZ19jYWdyX2NvbHVtbnNdLCB1c2UubmFtZXMgPSBGQUxTRSkpDQpudW1lcmljX3ZhbHVlc19hbGwgPC0gbnVtZXJpY192YWx1ZXNfYWxsWyFpcy5uYShudW1lcmljX3ZhbHVlc19hbGwpXQ0KDQpvdmVyYWxsX2NvdW50X29ic2VydmF0aW9ucyA8LSBsZW5ndGgobnVtZXJpY192YWx1ZXNfYWxsKQ0Kb3ZlcmFsbF9tZWFuX3ZhbHVlIDwtIHJvdW5kKG1lYW4obnVtZXJpY192YWx1ZXNfYWxsKSwgMikNCm92ZXJhbGxfbWVkaWFuX3ZhbHVlIDwtIHJvdW5kKG1lZGlhbihudW1lcmljX3ZhbHVlc19hbGwpLCAyKQ0Kb3ZlcmFsbF9zZF92YWx1ZSA8LSByb3VuZChzZChudW1lcmljX3ZhbHVlc19hbGwpLCAyKQ0Kb3ZlcmFsbF9taW5fY2Fncl9yYW5nZSA8LSByb3VuZChjYWdyX3ZhbHVlIC0gb3ZlcmFsbF9zZF92YWx1ZSwgMikNCm92ZXJhbGxfbWF4X2NhZ3JfcmFuZ2UgPC0gcm91bmQoY2Fncl92YWx1ZSArIG92ZXJhbGxfc2RfdmFsdWUsIDIpDQpvdmVyYWxsX21pbl92YWx1ZSA8LSByb3VuZChtaW4obnVtZXJpY192YWx1ZXNfYWxsKSwgMikNCm92ZXJhbGxfbWF4X3ZhbHVlIDwtIHJvdW5kKG1heChudW1lcmljX3ZhbHVlc19hbGwpLCAyKQ0KDQpvdmVyYWxsX2Fib3ZlX3RhcmdldF9pbmZsYXRpb24gPC0gc3VtKG51bWVyaWNfdmFsdWVzX2FsbCA+PSB0YXJnZXRfaW5mbGF0aW9uLCBuYS5ybSA9IFRSVUUpDQpvdmVyYWxsX2Fib3ZlX3RhcmdldF9jb25zZXJ2YXRpdmUgPC0gc3VtKG51bWVyaWNfdmFsdWVzX2FsbCA+PSB0YXJnZXRfY29uc2VydmF0aXZlLCBuYS5ybSA9IFRSVUUpDQpvdmVyYWxsX2Fib3ZlX3RhcmdldF9tb2RlcmF0ZSA8LSBzdW0obnVtZXJpY192YWx1ZXNfYWxsID49IHRhcmdldF9tb2RlcmF0ZSwgbmEucm0gPSBUUlVFKQ0Kb3ZlcmFsbF9hYm92ZV90YXJnZXRfYWdncmVzc2l2ZSA8LSBzdW0obnVtZXJpY192YWx1ZXNfYWxsID49IHRhcmdldF9hZ2dyZXNzaXZlLCBuYS5ybSA9IFRSVUUpDQoNCm92ZXJhbGxfcGVyY2VudF9hYm92ZV90YXJnZXRfY29uc2VydmF0aXZlIDwtIHJvdW5kKChvdmVyYWxsX2Fib3ZlX3RhcmdldF9jb25zZXJ2YXRpdmUgLyBvdmVyYWxsX2NvdW50X29ic2VydmF0aW9ucykgKiAxMDAsIDIpDQpvdmVyYWxsX3BlcmNlbnRfYWJvdmVfdGFyZ2V0X2luZmxhdGlvbiA8LSByb3VuZCgob3ZlcmFsbF9hYm92ZV90YXJnZXRfaW5mbGF0aW9uIC8gb3ZlcmFsbF9jb3VudF9vYnNlcnZhdGlvbnMpICogMTAwLCAyKQ0Kb3ZlcmFsbF9wZXJjZW50X2Fib3ZlX3RhcmdldF9tb2RlcmF0ZSA8LSByb3VuZCgob3ZlcmFsbF9hYm92ZV90YXJnZXRfbW9kZXJhdGUgLyBvdmVyYWxsX2NvdW50X29ic2VydmF0aW9ucykgKiAxMDAsIDIpDQpvdmVyYWxsX3BlcmNlbnRfYWJvdmVfdGFyZ2V0X2FnZ3Jlc3NpdmUgPC0gcm91bmQoKG92ZXJhbGxfYWJvdmVfdGFyZ2V0X2FnZ3Jlc3NpdmUgLyBvdmVyYWxsX2NvdW50X29ic2VydmF0aW9ucykgKiAxMDAsIDIpDQoNCmFtem5fcmF3X2NhZ3Jfc3VtbWFyeSRPdmVyYWxsIDwtIGMoDQogIG92ZXJhbGxfY291bnRfb2JzZXJ2YXRpb25zLA0KICBwYXN0ZTAob3ZlcmFsbF9tZWFuX3ZhbHVlLCAiJSIpLA0KICBwYXN0ZTAob3ZlcmFsbF9tZWRpYW5fdmFsdWUsICIlIiksDQogIHBhc3RlMChvdmVyYWxsX3NkX3ZhbHVlLCAiJSIpLA0KICBwYXN0ZTAob3ZlcmFsbF9taW5fY2Fncl9yYW5nZSwgIiUiKSwNCiAgcGFzdGUwKG92ZXJhbGxfbWF4X2NhZ3JfcmFuZ2UsICIlIiksDQogIHBhc3RlMChvdmVyYWxsX21pbl92YWx1ZSwgIiUiKSwNCiAgcGFzdGUwKG92ZXJhbGxfbWF4X3ZhbHVlLCAiJSIpLA0KICBwYXN0ZTAob3ZlcmFsbF9wZXJjZW50X2Fib3ZlX3RhcmdldF9pbmZsYXRpb24sICIlIiksDQogIHBhc3RlMChvdmVyYWxsX3BlcmNlbnRfYWJvdmVfdGFyZ2V0X2NvbnNlcnZhdGl2ZSwgIiUiKSwNCiAgcGFzdGUwKG92ZXJhbGxfcGVyY2VudF9hYm92ZV90YXJnZXRfbW9kZXJhdGUsICIlIiksDQogIHBhc3RlMChvdmVyYWxsX3BlcmNlbnRfYWJvdmVfdGFyZ2V0X2FnZ3Jlc3NpdmUsICIlIikNCikNCg0KIyBDb252ZXJ0IHJvdyBuYW1lcyB0byBhIGNvbHVtbg0KYW16bl9yYXdfY2Fncl9zdW1tYXJ5IDwtIHRpYmJsZTo6cm93bmFtZXNfdG9fY29sdW1uKGFtem5fcmF3X2NhZ3Jfc3VtbWFyeSwgdmFyID0gIlN0YXRpc3RpYyIpDQoNCiMgRW5zdXJlIGFsbCBjb2x1bW5zIGFyZSBjaGFyYWN0ZXINCmFtem5fcmF3X2NhZ3Jfc3VtbWFyeSA8LSBhbXpuX3Jhd19jYWdyX3N1bW1hcnkgJT4lDQogIG11dGF0ZShhY3Jvc3MoZXZlcnl0aGluZygpLCBhcy5jaGFyYWN0ZXIpKQ0KDQojIERpc3BsYXkgdGhlIHN1bW1hcnkgdGFibGUNCmNhdCgiXG4jIyMjIENvbXBvdW5kIEF2ZXJhZ2UgR3Jvd3RoIFJhdGVzICgiLCBtaW5feWVhciwgIi0iLCBtYXhfeWVhciwgIilcbiIsIHNlcCA9ICIiKQ0KaW50ZXJhY3RpdmVfc3RyKGFtem5fcmF3X2NhZ3Jfc3VtbWFyeSkNCmZvcm1hdF91bnNwZWNpZmllZF93aWR0aChhbXpuX3Jhd19jYWdyX3N1bW1hcnkpDQoNCmBgYA0KDQoqKmByIG1pbl95ZWFyYC1gciBtYXhfeWVhcmAgU3VtbWFyeToqKiBUaGUgMS1ZZWFyIENBR1IgZXhoaWJpdHMgdGhlIGByIGlmKG1lYW5fdmFsdWVfMV95ZWFyX2NhZ3IgPT0gbWF4KGMobWVhbl92YWx1ZV8xX3llYXJfY2FnciwgbWVhbl92YWx1ZV81X3llYXJfY2FnciwgbWVhbl92YWx1ZV8xMF95ZWFyX2NhZ3IsIG1lYW5fdmFsdWVfMjBfeWVhcl9jYWdyKSkpICJoaWdoZXN0IG1lYW4gcmV0dXJuIiBlbHNlIGlmKG1lYW5fdmFsdWVfMV95ZWFyX2NhZ3IgPT0gbWluKGMobWVhbl92YWx1ZV8xX3llYXJfY2FnciwgbWVhbl92YWx1ZV81X3llYXJfY2FnciwgbWVhbl92YWx1ZV8xMF95ZWFyX2NhZ3IsIG1lYW5fdmFsdWVfMjBfeWVhcl9jYWdyKSkpICJsb3dlc3QgbWVhbiByZXR1cm4iIGVsc2UgIm1lYW4gcmV0dXJuImAgYXQgYHIgbWVhbl92YWx1ZV8xX3llYXJfY2FncmAlLCBhbmQgYHIgaWYoc2RfdmFsdWVfMV95ZWFyX2NhZ3IgPT0gbWF4KGMoc2RfdmFsdWVfMV95ZWFyX2NhZ3IsIHNkX3ZhbHVlXzVfeWVhcl9jYWdyLCBzZF92YWx1ZV8xMF95ZWFyX2NhZ3IsIHNkX3ZhbHVlXzIwX3llYXJfY2FncikpKSAidGhlIGdyZWF0ZXN0IHZvbGF0aWxpdHkgd2l0aCBhIiBlbHNlIGlmKHNkX3ZhbHVlXzFfeWVhcl9jYWdyID09IG1pbihjKHNkX3ZhbHVlXzFfeWVhcl9jYWdyLCBzZF92YWx1ZV81X3llYXJfY2Fnciwgc2RfdmFsdWVfMTBfeWVhcl9jYWdyLCBzZF92YWx1ZV8yMF95ZWFyX2NhZ3IpKSkgInRoZSBsZWFzdCB2b2xhdGlsaXR5IHdpdGggYSIgZWxzZSAiYSJgIHN0YW5kYXJkIGRldmlhdGlvbiBvZiBgciBzZF92YWx1ZV8xX3llYXJfY2FncmAlLiBBcyB0aGUgaW52ZXN0bWVudCBob3Jpem9uIGV4dGVuZHMgdG8gNSwgMTAsIGFuZCAyMCB5ZWFycywgdGhlIG1lYW4gcmV0dXJucyBgciBpZihtZWFuX3ZhbHVlXzFfeWVhcl9jYWdyIDwgbWVhbihjKG1lYW5fdmFsdWVfNV95ZWFyX2NhZ3IsIG1lYW5fdmFsdWVfMTBfeWVhcl9jYWdyLCBtZWFuX3ZhbHVlXzIwX3llYXJfY2FncikpKSAiaW5jcmVhc2UiIGVsc2UgImRlY3JlYXNlImAsIHJhbmdpbmcgZnJvbSBgciBtZWFuX3ZhbHVlXzVfeWVhcl9jYWdyYCUgdG8gYHIgbWVhbl92YWx1ZV8yMF95ZWFyX2NhZ3JgJSwgd2hpbGUgdm9sYXRpbGl0eSBgciBpZihzZF92YWx1ZV8xX3llYXJfY2FnciA8IG1lYW4oYyhzZF92YWx1ZV81X3llYXJfY2Fnciwgc2RfdmFsdWVfMTBfeWVhcl9jYWdyLCBzZF92YWx1ZV8yMF95ZWFyX2NhZ3IpKSkgInJpc2VzIiBlbHNlICJkaW1pbmlzaGVzImAsIHdpdGggc3RhbmRhcmQgZGV2aWF0aW9ucyBgciBpZihzZF92YWx1ZV8xX3llYXJfY2FnciA+IHNkX3ZhbHVlXzIwX3llYXJfY2FncikgImRyb3BwaW5nIiBlbHNlICJyaXNpbmciYCBmcm9tIGByIHNkX3ZhbHVlXzVfeWVhcl9jYWdyYCUgdG8gYHIgc2RfdmFsdWVfMjBfeWVhcl9jYWdyYCUuIFRoaXMgdHJlbmQgaW5kaWNhdGVzIHRoYXQgbG9uZ2VyIGludmVzdG1lbnQgcGVyaW9kcyB0ZW5kIHRvIG9mZmVyIGByIGlmKHNkX3ZhbHVlXzFfeWVhcl9jYWdyID4gc2RfdmFsdWVfMjBfeWVhcl9jYWdyKSAibW9yZSBzdGFibGUiIGVsc2UgImxlc3Mgc3RhYmxlImAgcmV0dXJucy4gRnVydGhlcm1vcmUsIHRoZSBwZXJjZW50YWdlIG9mIHBlcmlvZHMgZXhjZWVkaW5nIHRoZSBpbmZsYXRpb24gdGFyZ2V0IGByIGlmKHBlcmNlbnRfYWJvdmVfdGFyZ2V0X2luZmxhdGlvbl8xX3llYXJfY2FnciA8IHBlcmNlbnRfYWJvdmVfdGFyZ2V0X2luZmxhdGlvbl8yMF95ZWFyX2NhZ3IpICJpbmNyZWFzZXMiIGVsc2UgImRlY3JlYXNlcyJgIHdpdGggbG9uZ2VyIGR1cmF0aW9ucywgZnJvbSBgciBwZXJjZW50X2Fib3ZlX3RhcmdldF9pbmZsYXRpb25fMV95ZWFyX2NhZ3JgJSBpbiB0aGUgMS1ZZWFyIENBR1IgdG8gYHIgcGVyY2VudF9hYm92ZV90YXJnZXRfaW5mbGF0aW9uXzIwX3llYXJfY2FncmAlIGluIHRoZSAyMC1ZZWFyIENBR1IsIHVuZGVyc2NvcmluZyBBTVpOJ3MgYHIgaWYocGVyY2VudF9hYm92ZV90YXJnZXRfaW5mbGF0aW9uXzFfeWVhcl9jYWdyIDwgcGVyY2VudF9hYm92ZV90YXJnZXRfaW5mbGF0aW9uXzIwX3llYXJfY2FncikgImVmZmVjdGl2ZW5lc3MiIGVsc2UgImluZWZmZWN0aXZlbmVzcyJgIGFzIGEgaGVkZ2UgYWdhaW5zdCBpbmZsYXRpb24gb3ZlciBleHRlbmRlZCB0aW1lZnJhbWVzLiBXaXRoIGFuIG92ZXJhbGwgcGVyY2VudGFnZSBvZiBgciBvdmVyYWxsX3BlcmNlbnRfYWJvdmVfdGFyZ2V0X2FnZ3Jlc3NpdmVgJSBleGNlZWRpbmcgdGhlIGFnZ3Jlc3NpdmUgdGFyZ2V0IChgciB0YXJnZXRfYWdncmVzc2l2ZWAlIGFubnVhbGl6ZWQgcmV0dXJucyB3aXRoIGByIHRhcmdldF9pbmZsYXRpb25gJSBpbmZsYXRpb24pLCBBTVpOIGByIGlmKG92ZXJhbGxfcGVyY2VudF9hYm92ZV90YXJnZXRfYWdncmVzc2l2ZSA+IDUwKSAiaGFzLCBvdmVyIHRoaXMgdGltZSBwZXJpb2QsIHByb3ZlbiB0byBiZSBhIHN0cm9uZyIgZWxzZSBpZihvdmVyYWxsX3BlcmNlbnRfYWJvdmVfdGFyZ2V0X2FnZ3Jlc3NpdmUgPiA0MCkgImhhcywgb3ZlciB0aGlzIHRpbWUgcGVyaW9kLCBkZW1vbnN0cmF0ZWQgaXRzZWxmIGFzIGEgdmlhYmxlIiBlbHNlICJhcHBlYXJzLCBvdmVyIHRoaXMgdGltZSBwZXJpb2QsIHRvIGJlIGEgbGVzcyBzdWl0YWJsZSJgIG9wdGlvbiBmb3IgYSBoaWdoLXJldHVybmluZyBsb25nLXRlcm0gaW52ZXN0bWVudC4NCg0KIyMjIEdyYXBoDQoNCiMjIyMgQWxsIFBlcmlvZHMNCg0KDQpgYGB7ciBhbXpuX3Jhd19jYWdyX2dyYXBoc19hbGwsIGZpZy53aWR0aD0xMCwgZmlnLmhlaWdodD03LCBldmFsPVRSVUUsIGVjaG89RkFMU0V9DQoNCmNhdCgiXG5cbiMjIyMgQ29tcG91bmQgQXZlcmFnZSBHcm93dGggUmF0ZXMgQWNyb3NzIFBlcmlvZHMgXG4iKQ0KDQojIExvYWQgbmVjZXNzYXJ5IGxpYnJhcmllcw0KbGlicmFyeShnZ3Bsb3QyKQ0KbGlicmFyeShkcGx5cikNCg0KDQojIENvbnZlcnQgY29sdW1ucyB0byBudW1lcmljIGZvciBwbG90dGluZyBpZiBuZWVkZWQNCmFtem5fcmF3X2NhZ3IgPC0gYW16bl9yYXdfY2FnciAlPiUNCiAgbXV0YXRlKA0KICAgIGBEYXRlYCA9IGFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKGBEYXRlYCkpLCAgIyBFbnN1cmUgRGF0ZSBpcyBudW1lcmljDQogICAgYDEtWWVhciBDQUdSYCA9IGFzLm51bWVyaWMoZ3N1YigiJSIsICIiLCBgMS1ZZWFyIENBR1JgKSksDQogICAgYDUtWWVhciBDQUdSYCA9IGFzLm51bWVyaWMoZ3N1YigiJSIsICIiLCBgNS1ZZWFyIENBR1JgKSksDQogICAgYDEwLVllYXIgQ0FHUmAgPSBhcy5udW1lcmljKGdzdWIoIiUiLCAiIiwgYDEwLVllYXIgQ0FHUmApKSwNCiAgICBgMjAtWWVhciBDQUdSYCA9IGFzLm51bWVyaWMoZ3N1YigiJSIsICIiLCBgMjAtWWVhciBDQUdSYCkpLA0KICAgIGAzMC1ZZWFyIENBR1JgID0gYXMubnVtZXJpYyhnc3ViKCIlIiwgIiIsIGAzMC1ZZWFyIENBR1JgKSkNCiAgKQ0KDQojIFJlc2hhcGUgdGhlIGRhdGEgaW50byBsb25nIGZvcm1hdCBmb3IgZWFzeSBwbG90dGluZyBvZiBtdWx0aXBsZSBsaW5lcyBhbmQgc2V0IHRoZSBmYWN0b3Igb3JkZXINCm5ydF9sb25nIDwtIGFtem5fcmF3X2NhZ3IgJT4lDQogIHBpdm90X2xvbmdlcihjb2xzID0gYyhgMS1ZZWFyIENBR1JgLCBgNS1ZZWFyIENBR1JgLCBgMTAtWWVhciBDQUdSYCwgYDIwLVllYXIgQ0FHUmAsIGAzMC1ZZWFyIENBR1JgKSwNCiAgICAgICAgICAgICAgIG5hbWVzX3RvID0gIkNBR1JfUGVyaW9kIiwNCiAgICAgICAgICAgICAgIHZhbHVlc190byA9ICJDQUdSX1ZhbHVlIikgJT4lDQogIG11dGF0ZShDQUdSX1BlcmlvZCA9IGZhY3RvcihDQUdSX1BlcmlvZCwgbGV2ZWxzID0gYygiMS1ZZWFyIENBR1IiLCAiNS1ZZWFyIENBR1IiLCAiMTAtWWVhciBDQUdSIiwgIjIwLVllYXIgQ0FHUiIsICIzMC1ZZWFyIENBR1IiKSkpDQoNCiMgQXNzaWduIGNvbG9ycyBkeW5hbWljYWxseSBiYXNlZCBvbiB0aGUgb3JkZXIgb2YgQ0FHUl9QZXJpb2QgaW4gdGhlIGRhdGENCiMgTWF0Y2ggdGhlIHVuaXF1ZSBsZXZlbHMgb2YgQ0FHUl9QZXJpb2Qgd2l0aCBjb2xvcnMgZnJvbSBjb2xvcnNfZ2VuZXJhbF9kYXJrDQp1bmlxdWVfdHlwZXMgPC0gdW5pcXVlKG5ydF9sb25nJENBR1JfUGVyaW9kKQ0KY3VzdG9tX2NvbG9ycyA8LSBzZXROYW1lcyhjb2xvcnNfZ2VuZXJhbF9kYXJrWzE6bGVuZ3RoKHVuaXF1ZV90eXBlcyldLCB1bmlxdWVfdHlwZXMpDQoNCiMgRmluZCB0aGUgbWluaW11bSBhbmQgbWF4aW11bSB4LXZhbHVlIGluIHlvdXIgZGF0YQ0KbWF4X3ggPC0gbWF4KGFzLmludGVnZXIoYW16bl9yYXdfY2FnciREYXRlKSwgbmEucm0gPSBUUlVFKQ0KbWluX3ggPC0gbWluKGFzLmludGVnZXIoYW16bl9yYXdfY2FnciREYXRlKSwgbmEucm0gPSBUUlVFKQ0KaW50ZXJhY3RpdmVfcHJpbnQobWF4X3gpICAjIFRlc3QNCmludGVyYWN0aXZlX3ByaW50KG1pbl94KSAgIyBUZXN0DQoNCiMgRmluZCB0aGUgbWluaW11bSBhbmQgbWF4aW11bSB5ZWFyDQptaW5feWVhciA8LSBtaW4oYW16bl9yYXdfY2FnciREYXRlLCBuYS5ybSA9IFRSVUUpDQptYXhfeWVhciA8LSBtYXgoYW16bl9yYXdfY2FnciREYXRlLCBuYS5ybSA9IFRSVUUpDQppbnRlcmFjdGl2ZV9wcmludChtaW5feWVhcikNCmludGVyYWN0aXZlX3ByaW50KG1heF95ZWFyKQ0KDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KIyMgUExPVCBGVUxMIFdJVEhPVVQgTElNSVRTDQoNCiMgRGVmaW5lIHN0YXJ0IGFuZCBlbmQgeWVhcnMNCnN0YXJ0X3llYXIgPC0gYXMubnVtZXJpYyhtaW5feWVhcikNCmVuZF95ZWFyIDwtIDIwMjQNCnllYXJfcmFuZ2UgPC0gZW5kX3llYXIgLSBzdGFydF95ZWFyICsgMSAgIyBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiB5ZWFycw0KDQojIERlZmluZSBicmVha3Mgcm91bmRlZCBhcHByb3ByaWF0ZWx5DQpsaW1pdHNfc3RhcnRfeWVhciA8LSBmbG9vcihzdGFydF95ZWFyIC8gNSkgKiA1ICAjIFJvdW5kIGRvd24gdG8gdGhlIG5lYXJlc3QgbXVsdGlwbGUgb2YgNQ0KbGltaXRzX2VuZF95ZWFyIDwtIGNlaWxpbmcoZW5kX3llYXIgLyA1KSAqIDUgICAjIFJvdW5kIHVwIHRvIHRoZSBuZWFyZXN0IG11bHRpcGxlIG9mIDUNCg0KIyBDcmVhdGUgZHluYW1pYyB0aXRsZSBhbmQgY2FwdGlvbg0KZHluYW1pY190aXRsZSA8LSBwYXN0ZTAoIlJvbGxpbmcgQ0FHUnMgQWNyb3NzIFBlcmlvZHMgT3ZlciAiLHllYXJfcmFuZ2UsICIgWWVhcnMgKCIsIHN0YXJ0X3llYXIsICItIiwgZW5kX3llYXIsICIpIikNCmR5bmFtaWNfY2FwdGlvbiA8LSBwYXN0ZTAoIkFNWk4gQ29tcG91bmQgQXZlcmFnZSBHcm93dGggUmF0ZXMgQWNyb3NzIFJvbGxpbmcgUGVyaW9kcywgRGF0YXNldCAoIiwgbWluX3llYXIsICItIiwgbWF4X3llYXIsICIpIikNCg0KIyBDcmVhdGUgdGhlIGZ1bGwsIG5vbi1maWx0ZXJlZCB4LWF4aXMgcGxvdCB3aXRoIGR5bmFtaWMgeCBwbGFjZW1lbnQgZm9yIGFubm90YXRpb25zDQpwMSA8LSBnZ3Bsb3QobnJ0X2xvbmcsIGFlcyh4ID0gYXMuaW50ZWdlcihEYXRlKSwgeSA9IENBR1JfVmFsdWUsIGNvbG9yID0gQ0FHUl9QZXJpb2QpKSArDQoNCiAgIyBBZGQgc2hhZGVkIGFyZWFzIGZvciBiYWNrZ3JvdW5kIGVmZmVjdA0KICBnZW9tX3JlY3QoYWVzKHhtaW4gPSAtSW5mLCB4bWF4ID0gSW5mLCB5bWluID0gdGFyZ2V0X2FnZ3Jlc3NpdmUsIHltYXggPSBJbmYpLCBmaWxsID0gImxpZ2h0Z3JlZW4iLCBhbHBoYSA9IDAuMDEwKSArDQogIGdlb21fcmVjdChhZXMoeG1pbiA9IC1JbmYsIHhtYXggPSBJbmYsIHltaW4gPSB0YXJnZXRfY29uc2VydmF0aXZlLCB5bWF4ID0gdGFyZ2V0X2FnZ3Jlc3NpdmUpLCBmaWxsID0gIm9yYW5nZSIsIGFscGhhID0gMC4wMSkgKw0KICBnZW9tX3JlY3QoYWVzKHhtaW4gPSAtSW5mLCB4bWF4ID0gSW5mLCB5bWluID0gLUluZiwgeW1heCA9IHRhcmdldF9jb25zZXJ2YXRpdmUpLCBmaWxsID0gImxpZ2h0Y29yYWwiLCBhbHBoYSA9IDAuMDEwKSArDQogIA0KICAjIFBsb3QgbGluZXMgZm9yIGVhY2ggQ0FHUiBQZXJpb2QNCiAgZ2VvbV9saW5lKHNpemUgPSAxLjAsIGFscGhhID0gMy4wKSArICAgICAgICMgTGluZSBmb3IgZWFjaCBDQUdSDQogIGdlb21fcG9pbnQoc2l6ZSA9IDEuMCwgYWxwaGEgPSAzLjApICsgICAgICAgIyBQb2ludHMgZm9yIGVhY2ggQ0FHUg0KICANCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gdGFyZ2V0X2FnZ3Jlc3NpdmUsIGNvbG9yID0gImRhcmtibHVlIiwgbGluZXR5cGUgPSAic29saWQiKSArDQogICMgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gdGFyZ2V0X21vZGVyYXRlLCBjb2xvciA9ICJkYXJrYmx1ZSIsIGxpbmV0eXBlID0gInNvbGlkIikgKw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSB0YXJnZXRfY29uc2VydmF0aXZlLCBjb2xvciA9ICJkYXJrYmx1ZSIsIGxpbmV0eXBlID0gInNvbGlkIikgKw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSB0YXJnZXRfaW5mbGF0aW9uLCBjb2xvciA9ICJkYXJrcmVkIiwgbGluZXR5cGUgPSAiZGFzaGVkIikgKw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSBjYWdyX3ZhbHVlLCBjb2xvciA9ICJkYXJrcmVkIiwgbGluZXR5cGUgPSAiZGFzaGVkIikgKw0KICANCiAgIyBEeW5hbWljIHJpZ2h0LWFsaWduZWQgcGxhY2VtZW50IGZvciBhbm5vdGF0aW9ucw0KICBhbm5vdGF0ZSgidGV4dCIsIHggPSBJbmYsIHkgPSB0YXJnZXRfYWdncmVzc2l2ZSwgbGFiZWwgPSAiQWdncmVzc2l2ZSIsIA0KICAgICAgICAgICBoanVzdCA9IDEsIHZqdXN0ID0gLTAuNTAsIGNvbG9yID0gImRhcmtibHVlIiwgc2l6ZSA9IDQpICsNCiAgIyBhbm5vdGF0ZSgidGV4dCIsIHggPSBJbmYsIHkgPSB0YXJnZXRfbW9kZXJhdGUsIGxhYmVsID0gIk1vZGVyYXRlIiwgDQogICMgICAgICAgICBoanVzdCA9IDEsIHZqdXN0ID0gLTAuNTAsIGNvbG9yID0gImRhcmtibHVlIiwgc2l6ZSA9IDQpICsNCiAgYW5ub3RhdGUoInRleHQiLCB4ID0gSW5mLCB5ID0gdGFyZ2V0X2NvbnNlcnZhdGl2ZSwgbGFiZWwgPSAiQ29uc2VydmF0aXZlIiwgDQogICAgICAgICAgIGhqdXN0ID0gMSwgdmp1c3QgPSAtMC41MCwgY29sb3IgPSAiZGFya2JsdWUiLCBzaXplID0gNCkgKw0KICBhbm5vdGF0ZSgidGV4dCIsIHggPSBJbmYsIHkgPSB0YXJnZXRfaW5mbGF0aW9uLCBsYWJlbCA9ICJJbmZsYXRpb24iLCANCiAgICAgICAgICAgaGp1c3QgPSAxLCB2anVzdCA9ICsxLjEwLCBjb2xvciA9ICJkYXJrcmVkIiwgc2l6ZSA9IDQpICsNCiAgYW5ub3RhdGUoInRleHQiLCB4ID0gSW5mLCB5ID0gY2Fncl92YWx1ZSwgbGFiZWwgPSAiQ0FHUiIsIA0KICAgICAgICAgICBoanVzdCA9IDEsIHZqdXN0ID0gLTAuNTAsIGNvbG9yID0gImRhcmtyZWQiLCBzaXplID0gNCkgKyANCg0KICBsYWJzKA0KICAgIHRpdGxlID0gZHluYW1pY190aXRsZSwNCiAgICB4ID0gIlllYXIiLA0KICAgIHkgPSAiQ0FHUiBWYWx1ZSAoJSkiLA0KICAgIGNvbG9yID0gIkNBR1IgUGVyaW9kIiwNCiAgICBjYXB0aW9uID0gZHluYW1pY19jYXB0aW9uDQogICAgKSArDQogIA0KICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gY3VzdG9tX2NvbG9ycykgKyAgIyBTZXQgY29sb3JzIGZvciBlYWNoIENBR1IgUGVyaW9kDQogIHNjYWxlX3hfY29udGludW91cygNCiAgICBsaW1pdHMgPSBjKHN0YXJ0X3llYXIsIGVuZF95ZWFyICsgMyksIA0KICAgIGJyZWFrcyA9IHNlcShsaW1pdHNfc3RhcnRfeWVhciwgbGltaXRzX2VuZF95ZWFyICwgNSkpICsgICMgUmVzdHJpY3QgJiBTZXQgTWFqb3IgeC1heGlzIGxpbmVzIGZvciBlYWNoIHllYXINCiAgDQogIHRoZW1lX21pbmltYWwoKSArDQogIHRoZW1lKA0KICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUsIHNpemUgPSAyMCksICAgICAgICAgIyBMYXJnZXIgdGl0bGUgZm9udA0KICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQpLCAgICAgICAgICAgICAgICAgICAgIyBMYXJnZXIgeC1heGlzIGxhYmVsIGZvbnQNCiAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0KSwgICAgICAgICAgICAgICAgICAgICMgTGFyZ2VyIHktYXhpcyBsYWJlbCBmb250DQogICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxLCBzaXplID0gMTQpLCAgIyBMYXJnZXIgeC1heGlzIHRleHQNCiAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQpLCAgICAgICAgICAgICAgICAgICAgICMgTGFyZ2VyIHktYXhpcyB0ZXh0DQogICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCksICAgICAgICAgICAgICAgICAgICAjIExlZ2VuZCB0aXRsZSBzaXplDQogICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyKSwgICAgICAgICAgICAgICAgICAgICAjIExlZ2VuZCB0ZXh0IHNpemUNCiAgICBwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9saW5lKGxpbmV0eXBlID0gImRvdHRlZCIsIGNvbG9yID0gImJsYWNrIiksICAjIE1ham9yIGdyaWQgbGluZXMNCiAgICBwYW5lbC5ncmlkLm1pbm9yLnggPSBlbGVtZW50X2JsYW5rKCksICAgICAgICAgICAgICAgICAgICAgICMgTm8gbWlub3IgeCBncmlkIGxpbmVzDQogICAgYXhpcy50aWNrcy5sZW5ndGggPSB1bml0KC0wLjI1LCAiY20iKSwgICAgICAgICAgICAgICAgICAgICAgIyBJbmNyZWFzZSB0aWNrIGxlbmd0aA0KICAgIGF4aXMudGlja3MgPSBlbGVtZW50X2xpbmUoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMC41MCksICAgIyBEYXJrZXIgdGlja3MNCiAgICBheGlzLmxpbmUueCA9IGVsZW1lbnRfbGluZShjb2xvciA9ICJibGFjayIsIHNpemUgPSAwLjc1KSwgICMgRGFyayBib3R0b20gYm9yZGVyDQogICAgYXhpcy5saW5lLnkgPSBlbGVtZW50X2xpbmUoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMC43NSkgICAjIERhcmsgbGVmdCBib3JkZXINCiAgKQ0KDQojIFByaW50IHRoZSBwbG90IA0KcHJpbnQocDEpDQoNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQojIyBQTE9UIFJFU1RSSUNURUQgV0lUSCBMSU1JVFMgDQoNCiMgRmlsdGVyIHRoZSBkYXRhIGZvciB0aGUgcmVzdHJpY3RlZCB4LWF4aXMgcmFuZ2UgKDIwMDUtMjAyNCkNCnJlc3RyaWN0ZWRfZGF0YSA8LSBucnRfbG9uZyAlPiUNCiAgZmlsdGVyKGFzLmludGVnZXIoRGF0ZSkgPj0gMjAwNSAmIGFzLmludGVnZXIoRGF0ZSkgPD0gMjAyNCkNCg0KIyBEZWZpbmUgc3RhcnQgYW5kIGVuZCB5ZWFycw0Kc3RhcnRfeWVhciA8LSAyMDA1DQplbmRfeWVhciA8LSAyMDI0DQp5ZWFyX3JhbmdlIDwtIGVuZF95ZWFyIC0gc3RhcnRfeWVhciArIDEgICMgQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgeWVhcnMNCg0KIyBEZWZpbmUgYnJlYWtzIHJvdW5kZWQgYXBwcm9wcmlhdGVseQ0KbGltaXRzX3N0YXJ0X3llYXIgPC0gZmxvb3Ioc3RhcnRfeWVhciAvIDUpICogNSAgIyBSb3VuZCBkb3duIHRvIHRoZSBuZWFyZXN0IG11bHRpcGxlIG9mIDUNCmxpbWl0c19lbmRfeWVhciA8LSBjZWlsaW5nKGVuZF95ZWFyIC8gNSkgKiA1ICAgIyBSb3VuZCB1cCB0byB0aGUgbmVhcmVzdCBtdWx0aXBsZSBvZiA1DQoNCiMgQ3JlYXRlIGR5bmFtaWMgdGl0bGUgYW5kIGNhcHRpb24NCmR5bmFtaWNfdGl0bGUgPC0gcGFzdGUwKCJSb2xsaW5nIENBR1JzIEFjcm9zcyBQZXJpb2RzIE92ZXIgIix5ZWFyX3JhbmdlLCAiIFllYXJzICgiLCBzdGFydF95ZWFyLCAiLSIsIGVuZF95ZWFyLCAiKSIpDQpkeW5hbWljX2NhcHRpb24gPC0gcGFzdGUwKCJBTVpOIENvbXBvdW5kIEF2ZXJhZ2UgR3Jvd3RoIFJhdGVzIEFjcm9zcyBSb2xsaW5nIFBlcmlvZHMsIERhdGFzZXQgKCIsIG1pbl95ZWFyLCAiLSIsIG1heF95ZWFyLCAiKSIpDQoNCiMgQ2FsY3VsYXRlIGR5bmFtaWMgeS1heGlzIGxpbWl0cyBmb3IgdGhlIHJlc3RyaWN0ZWQgZGF0YQ0KeV9taW4gPC0gbWluKHJlc3RyaWN0ZWRfZGF0YSRDQUdSX1ZhbHVlLCBuYS5ybSA9IFRSVUUpDQp5X21heCA8LSBtYXgocmVzdHJpY3RlZF9kYXRhJENBR1JfVmFsdWUsIG5hLnJtID0gVFJVRSkNCg0KIyBDcmVhdGUgdGhlIGZpbHRlcmVkLCByZXN0cmljdGVkIHgtYXhpcyBwbG90IHdpdGggZHluYW1pYyB4IHBsYWNlbWVudCBmb3IgYW5ub3RhdGlvbnMNCnAzIDwtIGdncGxvdChucnRfbG9uZywgYWVzKHggPSBhcy5pbnRlZ2VyKERhdGUpLCB5ID0gQ0FHUl9WYWx1ZSwgY29sb3IgPSBDQUdSX1BlcmlvZCkpICsNCg0KICAjIEFkZCBzaGFkZWQgYXJlYXMgZm9yIGJhY2tncm91bmQgZWZmZWN0DQogIGdlb21fcmVjdChhZXMoeG1pbiA9IC1JbmYsIHhtYXggPSBJbmYsIHltaW4gPSB0YXJnZXRfYWdncmVzc2l2ZSwgeW1heCA9IEluZiksIGZpbGwgPSAibGlnaHRncmVlbiIsIGFscGhhID0gMC4wMTApICsNCiAgZ2VvbV9yZWN0KGFlcyh4bWluID0gLUluZiwgeG1heCA9IEluZiwgeW1pbiA9IHRhcmdldF9jb25zZXJ2YXRpdmUsIHltYXggPSB0YXJnZXRfYWdncmVzc2l2ZSksIGZpbGwgPSAib3JhbmdlIiwgYWxwaGEgPSAwLjAxKSArDQogIGdlb21fcmVjdChhZXMoeG1pbiA9IC1JbmYsIHhtYXggPSBJbmYsIHltaW4gPSAtSW5mLCB5bWF4ID0gdGFyZ2V0X2NvbnNlcnZhdGl2ZSksIGZpbGwgPSAibGlnaHRjb3JhbCIsIGFscGhhID0gMC4wMTApICsNCiAgDQogICMgUGxvdCBsaW5lcyBmb3IgZWFjaCBDQUdSIFBlcmlvZA0KICBnZW9tX2xpbmUoc2l6ZSA9IDEuMCwgYWxwaGEgPSAzLjApICsgICAgICAgIyBMaW5lIGZvciBlYWNoIENBR1INCiAgZ2VvbV9wb2ludChzaXplID0gMS4wLCBhbHBoYSA9IDMuMCkgKyAgICAgICAjIFBvaW50cyBmb3IgZWFjaCBDQUdSDQoNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gdGFyZ2V0X2FnZ3Jlc3NpdmUsIGNvbG9yID0gImRhcmtibHVlIiwgbGluZXR5cGUgPSAic29saWQiKSArDQogICMgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gdGFyZ2V0X21vZGVyYXRlLCBjb2xvciA9ICJkYXJrYmx1ZSIsIGxpbmV0eXBlID0gInNvbGlkIikgKw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSB0YXJnZXRfY29uc2VydmF0aXZlLCBjb2xvciA9ICJkYXJrYmx1ZSIsIGxpbmV0eXBlID0gInNvbGlkIikgKw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSB0YXJnZXRfaW5mbGF0aW9uLCBjb2xvciA9ICJkYXJrcmVkIiwgbGluZXR5cGUgPSAiZGFzaGVkIikgKw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSBjYWdyX3ZhbHVlLCBjb2xvciA9ICJkYXJrcmVkIiwgbGluZXR5cGUgPSAiZGFzaGVkIikgKw0KICANCiAgIyBEeW5hbWljIHJpZ2h0LWFsaWduZWQgcGxhY2VtZW50IGZvciBhbm5vdGF0aW9ucw0KICBhbm5vdGF0ZSgidGV4dCIsIHggPSBJbmYsIHkgPSB0YXJnZXRfYWdncmVzc2l2ZSwgbGFiZWwgPSAiQWdncmVzc2l2ZSIsIA0KICAgICAgICAgICBoanVzdCA9IDEsIHZqdXN0ID0gLTAuNTAsIGNvbG9yID0gImRhcmtibHVlIiwgc2l6ZSA9IDQpICsNCiAgIyBhbm5vdGF0ZSgidGV4dCIsIHggPSBJbmYsIHkgPSB0YXJnZXRfbW9kZXJhdGUsIGxhYmVsID0gIk1vZGVyYXRlIiwgDQogICMgICAgICAgICBoanVzdCA9IDEsIHZqdXN0ID0gLTAuNTAsIGNvbG9yID0gImRhcmtibHVlIiwgc2l6ZSA9IDQpICsNCiAgYW5ub3RhdGUoInRleHQiLCB4ID0gSW5mLCB5ID0gdGFyZ2V0X2NvbnNlcnZhdGl2ZSwgbGFiZWwgPSAiQ29uc2VydmF0aXZlIiwgDQogICAgICAgICAgIGhqdXN0ID0gMSwgdmp1c3QgPSAtMC41MCwgY29sb3IgPSAiZGFya2JsdWUiLCBzaXplID0gNCkgKw0KICBhbm5vdGF0ZSgidGV4dCIsIHggPSBJbmYsIHkgPSB0YXJnZXRfaW5mbGF0aW9uLCBsYWJlbCA9ICJJbmZsYXRpb24iLCANCiAgICAgICAgICAgaGp1c3QgPSAxLCB2anVzdCA9ICsxLjEwLCBjb2xvciA9ICJkYXJrcmVkIiwgc2l6ZSA9IDQpICsNCiAgYW5ub3RhdGUoInRleHQiLCB4ID0gSW5mLCB5ID0gY2Fncl92YWx1ZSwgbGFiZWwgPSAiQ0FHUiIsIA0KICAgICAgICAgICBoanVzdCA9IDEsIHZqdXN0ID0gLTAuNTAsIGNvbG9yID0gImRhcmtyZWQiLCBzaXplID0gNCkgKyANCg0KICBsYWJzKA0KICAgIHRpdGxlID0gZHluYW1pY190aXRsZSwNCiAgICB4ID0gIlllYXIiLA0KICAgIHkgPSAiQ0FHUiBWYWx1ZSAoJSkiLA0KICAgIGNvbG9yID0gIkNBR1IgUGVyaW9kIiwNCiAgICBjYXB0aW9uID0gZHluYW1pY19jYXB0aW9uDQogICAgKSArDQogIA0KICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gY3VzdG9tX2NvbG9ycykgKyAgIyBTZXQgY29sb3JzIGZvciBlYWNoIENBR1IgUGVyaW9kDQogIGNvb3JkX2NhcnRlc2lhbih5bGltID0gYyh5X21pbiwgeV9tYXgpKSArICMgQXBwbHkgZHluYW1pYyB5LWF4aXMgbGltaXRzDQogIHNjYWxlX3hfY29udGludW91cygNCiAgICBsaW1pdHMgPSBjKHN0YXJ0X3llYXIsIGVuZF95ZWFyICsgMiArIDEpLCANCiAgICBicmVha3MgPSBzZXEobGltaXRzX3N0YXJ0X3llYXIsIGxpbWl0c19lbmRfeWVhciwgNSkNCiAgKSArICAjIFJlc3RyaWN0ICYgU2V0IE1ham9yIHgtYXhpcyBsaW5lcyBmb3IgZWFjaCB5ZWFyDQoNCiAgdGhlbWVfbWluaW1hbCgpICsNCiAgdGhlbWUoDQogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSwgc2l6ZSA9IDIwKSwgICAgICAgICAjIExhcmdlciB0aXRsZSBmb250DQogICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCksICAgICAgICAgICAgICAgICAgICAjIExhcmdlciB4LWF4aXMgbGFiZWwgZm9udA0KICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQpLCAgICAgICAgICAgICAgICAgICAgIyBMYXJnZXIgeS1heGlzIGxhYmVsIGZvbnQNCiAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEsIHNpemUgPSAxNCksICAjIExhcmdlciB4LWF4aXMgdGV4dA0KICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCksICAgICAgICAgICAgICAgICAgICAgIyBMYXJnZXIgeS1heGlzIHRleHQNCiAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0KSwgICAgICAgICAgICAgICAgICAgICMgTGVnZW5kIHRpdGxlIHNpemUNCiAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIpLCAgICAgICAgICAgICAgICAgICAgICMgTGVnZW5kIHRleHQgc2l6ZQ0KICAgIHBhbmVsLmdyaWQubWFqb3IgPSBlbGVtZW50X2xpbmUobGluZXR5cGUgPSAiZG90dGVkIiwgY29sb3IgPSAiYmxhY2siKSwgICMgTWFqb3IgZ3JpZCBsaW5lcw0KICAgIHBhbmVsLmdyaWQubWlub3IueCA9IGVsZW1lbnRfYmxhbmsoKSwgICAgICAgICAgICAgICAgICAgICAgIyBObyBtaW5vciB4IGdyaWQgbGluZXMNCiAgICBheGlzLnRpY2tzLmxlbmd0aCA9IHVuaXQoLTAuMjUsICJjbSIpLCAgICAgICAgICAgICAgICAgICAgICAjIEluY3JlYXNlIHRpY2sgbGVuZ3RoDQogICAgYXhpcy50aWNrcyA9IGVsZW1lbnRfbGluZShjb2xvciA9ICJibGFjayIsIHNpemUgPSAwLjUwKSwgICAjIERhcmtlciB0aWNrcw0KICAgIGF4aXMubGluZS54ID0gZWxlbWVudF9saW5lKGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDAuNzUpLCAgIyBEYXJrIGJvdHRvbSBib3JkZXINCiAgICBheGlzLmxpbmUueSA9IGVsZW1lbnRfbGluZShjb2xvciA9ICJibGFjayIsIHNpemUgPSAwLjc1KSAgICMgRGFyayBsZWZ0IGJvcmRlcg0KICApDQoNCiMgUHJpbnQgdGhlIHBsb3QgDQpwcmludChwMykNCg0KYGBgDQoNCiMjIyMgU2hvcnQtVGVybQ0KDQpgYGB7ciBhbXpuX3Jhd19jYWdyX2dyYXBoc19zaG9ydCwgZmlnLndpZHRoPTEwLCBmaWcuaGVpZ2h0PTd9DQoNCmNhdCgiXG5cbiMjIyMgQ29tcG91bmQgQXZlcmFnZSBHcm93dGggUmF0ZXMgQWNyb3NzIFNob3J0LVRlcm0gUm9sbGluZyBQZXJpb2RzIFxuIikNCg0KIyBGaWx0ZXIgZGF0YSBmb3IgU2hvcnQtVGVybSBDQUdSICg1LVllYXIgYW5kIDEwLVllYXIpDQpzaG9ydHRlcm1fZGF0YSA8LSBucnRfbG9uZyAlPiUNCiAgZmlsdGVyKENBR1JfUGVyaW9kICVpbiUgYygiNS1ZZWFyIENBR1IiLCAiMTAtWWVhciBDQUdSIikpDQoNCg0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiMjIFBMT1QgRlVMTCBXSVRIT1VUIExJTUlUUw0KDQojIERlZmluZSBzdGFydCBhbmQgZW5kIHllYXJzDQpzdGFydF95ZWFyIDwtIDIwMDUNCmVuZF95ZWFyIDwtIDIwMjQNCnllYXJfcmFuZ2UgPC0gZW5kX3llYXIgLSBzdGFydF95ZWFyICsgMSAgIyBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiB5ZWFycw0KDQojIERlZmluZSBicmVha3Mgcm91bmRlZCBhcHByb3ByaWF0ZWx5DQpsaW1pdHNfc3RhcnRfeWVhciA8LSBmbG9vcihzdGFydF95ZWFyIC8gNSkgKiA1ICAjIFJvdW5kIGRvd24gdG8gdGhlIG5lYXJlc3QgbXVsdGlwbGUgb2YgNQ0KbGltaXRzX2VuZF95ZWFyIDwtIGNlaWxpbmcoZW5kX3llYXIgLyA1KSAqIDUgICAjIFJvdW5kIHVwIHRvIHRoZSBuZWFyZXN0IG11bHRpcGxlIG9mIDUNCg0KIyBDcmVhdGUgZHluYW1pYyB0aXRsZSBhbmQgY2FwdGlvbg0KZHluYW1pY190aXRsZSA8LSBwYXN0ZTAoIkNBR1IgQWNyb3NzIFNob3J0LVRlcm0gUGVyaW9kcyBPdmVyICIseWVhcl9yYW5nZSwgIiBZZWFycyAoIiwgc3RhcnRfeWVhciwgIi0iLCBlbmRfeWVhciwgIikiKQ0KZHluYW1pY19jYXB0aW9uIDwtIHBhc3RlMCgiQU1aTiBDb21wb3VuZCBBdmVyYWdlIEdyb3d0aCBSYXRlcyBBY3Jvc3MgU2hvcnQtVGVybSBSb2xsaW5nIFBlcmlvZHMsIERhdGFzZXQgKCIsIG1pbl95ZWFyLCAiLSIsIG1heF95ZWFyLCAiKSIpDQoNCiMgQ3JlYXRlIHRoZSBmdWxsLCBub24tZmlsdGVyZWQgeC1heGlzIHBsb3Qgd2l0aCBkeW5hbWljIHggcGxhY2VtZW50IGZvciBhbm5vdGF0aW9ucw0KcDFfc2hvcnR0ZXJtIDwtIGdncGxvdChzaG9ydHRlcm1fZGF0YSwgYWVzKHggPSBhcy5pbnRlZ2VyKERhdGUpLCB5ID0gQ0FHUl9WYWx1ZSwgY29sb3IgPSBDQUdSX1BlcmlvZCkpICsNCg0KICAjIEFkZCBzaGFkZWQgYXJlYXMgZm9yIGJhY2tncm91bmQgZWZmZWN0DQogIGdlb21fcmVjdChhZXMoeG1pbiA9IC1JbmYsIHhtYXggPSBJbmYsIHltaW4gPSB0YXJnZXRfYWdncmVzc2l2ZSwgeW1heCA9IEluZiksIGZpbGwgPSAibGlnaHRncmVlbiIsIGFscGhhID0gMC4wMTApICsNCiAgZ2VvbV9yZWN0KGFlcyh4bWluID0gLUluZiwgeG1heCA9IEluZiwgeW1pbiA9IHRhcmdldF9jb25zZXJ2YXRpdmUsIHltYXggPSB0YXJnZXRfYWdncmVzc2l2ZSksIGZpbGwgPSAib3JhbmdlIiwgYWxwaGEgPSAwLjAxKSArDQogIGdlb21fcmVjdChhZXMoeG1pbiA9IC1JbmYsIHhtYXggPSBJbmYsIHltaW4gPSAtSW5mLCB5bWF4ID0gdGFyZ2V0X2NvbnNlcnZhdGl2ZSksIGZpbGwgPSAibGlnaHRjb3JhbCIsIGFscGhhID0gMC4wMTApICsNCiAgDQogICMgUGxvdCBsaW5lcyBmb3IgZWFjaCBDQUdSIFBlcmlvZA0KICBnZW9tX2xpbmUoc2l6ZSA9IDEuMCwgYWxwaGEgPSAzLjApICsgICAgICAgIyBMaW5lIGZvciBlYWNoIENBR1INCiAgZ2VvbV9wb2ludChzaXplID0gMS4wLCBhbHBoYSA9IDMuMCkgKyAgICAgICAjIFBvaW50cyBmb3IgZWFjaCBDQUdSDQoNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gdGFyZ2V0X2FnZ3Jlc3NpdmUsIGNvbG9yID0gImRhcmtibHVlIiwgbGluZXR5cGUgPSAic29saWQiKSArDQogICMgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gdGFyZ2V0X21vZGVyYXRlLCBjb2xvciA9ICJkYXJrYmx1ZSIsIGxpbmV0eXBlID0gInNvbGlkIikgKw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSB0YXJnZXRfY29uc2VydmF0aXZlLCBjb2xvciA9ICJkYXJrYmx1ZSIsIGxpbmV0eXBlID0gInNvbGlkIikgKw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSB0YXJnZXRfaW5mbGF0aW9uLCBjb2xvciA9ICJkYXJrcmVkIiwgbGluZXR5cGUgPSAiZGFzaGVkIikgKw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSBjYWdyX3ZhbHVlLCBjb2xvciA9ICJkYXJrcmVkIiwgbGluZXR5cGUgPSAiZGFzaGVkIikgKw0KICANCiAgIyBEeW5hbWljIHJpZ2h0LWFsaWduZWQgcGxhY2VtZW50IGZvciBhbm5vdGF0aW9ucw0KICBhbm5vdGF0ZSgidGV4dCIsIHggPSBJbmYsIHkgPSB0YXJnZXRfYWdncmVzc2l2ZSwgbGFiZWwgPSAiQWdncmVzc2l2ZSIsIA0KICAgICAgICAgICBoanVzdCA9IDEsIHZqdXN0ID0gLTAuNTAsIGNvbG9yID0gImRhcmtibHVlIiwgc2l6ZSA9IDQpICsNCiAgIyBhbm5vdGF0ZSgidGV4dCIsIHggPSBJbmYsIHkgPSB0YXJnZXRfbW9kZXJhdGUsIGxhYmVsID0gIk1vZGVyYXRlIiwgDQogICMgICAgICAgICBoanVzdCA9IDEsIHZqdXN0ID0gLTAuNTAsIGNvbG9yID0gImRhcmtibHVlIiwgc2l6ZSA9IDQpICsNCiAgYW5ub3RhdGUoInRleHQiLCB4ID0gSW5mLCB5ID0gdGFyZ2V0X2NvbnNlcnZhdGl2ZSwgbGFiZWwgPSAiQ29uc2VydmF0aXZlIiwgDQogICAgICAgICAgIGhqdXN0ID0gMSwgdmp1c3QgPSArMS4zMCwgY29sb3IgPSAiZGFya2JsdWUiLCBzaXplID0gNCkgKw0KICBhbm5vdGF0ZSgidGV4dCIsIHggPSBJbmYsIHkgPSB0YXJnZXRfaW5mbGF0aW9uLCBsYWJlbCA9ICJJbmZsYXRpb24iLCANCiAgICAgICAgICAgaGp1c3QgPSAxLCB2anVzdCA9ICsxLjMwLCBjb2xvciA9ICJkYXJrcmVkIiwgc2l6ZSA9IDQpICsNCiAgYW5ub3RhdGUoInRleHQiLCB4ID0gSW5mLCB5ID0gY2Fncl92YWx1ZSwgbGFiZWwgPSAiQ0FHUiIsIA0KICAgICAgICAgICBoanVzdCA9IDEsIHZqdXN0ID0gLTAuNTAsIGNvbG9yID0gImRhcmtyZWQiLCBzaXplID0gNCkgKyANCg0KICBsYWJzKA0KICAgIHRpdGxlID0gZHluYW1pY190aXRsZSwNCiAgICB4ID0gIlllYXIiLA0KICAgIHkgPSAiQ0FHUiBWYWx1ZSAoJSkiLA0KICAgIGNvbG9yID0gIkNBR1IgUGVyaW9kIiwNCiAgICBjYXB0aW9uID0gZHluYW1pY19jYXB0aW9uDQogICAgKSArDQogIA0KICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gY3VzdG9tX2NvbG9yc1tjKCI1LVllYXIgQ0FHUiIsICIxMC1ZZWFyIENBR1IiKV0pICsNCiAgc2NhbGVfeF9jb250aW51b3VzKA0KICAgIGxpbWl0cyA9IGMoc3RhcnRfeWVhciwgZW5kX3llYXIgKyAxKSwgDQogICAgYnJlYWtzID0gc2VxKGxpbWl0c19zdGFydF95ZWFyLCBsaW1pdHNfZW5kX3llYXIgKyAxICwgNSkNCiAgKSArICAjIFJlc3RyaWN0ICYgU2V0IE1ham9yIHgtYXhpcyBsaW5lcyBmb3IgZWFjaCB5ZWFyDQoNCiAgdGhlbWVfbWluaW1hbCgpICsNCiAgdGhlbWUoDQogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSwgc2l6ZSA9IDIwKSwgICAgICAgICAjIExhcmdlciB0aXRsZSBmb250DQogICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCksICAgICAgICAgICAgICAgICAgICAjIExhcmdlciB4LWF4aXMgbGFiZWwgZm9udA0KICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQpLCAgICAgICAgICAgICAgICAgICAgIyBMYXJnZXIgeS1heGlzIGxhYmVsIGZvbnQNCiAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEsIHNpemUgPSAxNCksICAjIExhcmdlciB4LWF4aXMgdGV4dA0KICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCksICAgICAgICAgICAgICAgICAgICAgIyBMYXJnZXIgeS1heGlzIHRleHQNCiAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0KSwgICAgICAgICAgICAgICAgICAgICMgTGVnZW5kIHRpdGxlIHNpemUNCiAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIpLCAgICAgICAgICAgICAgICAgICAgICMgTGVnZW5kIHRleHQgc2l6ZQ0KICAgIHBhbmVsLmdyaWQubWFqb3IgPSBlbGVtZW50X2xpbmUobGluZXR5cGUgPSAiZG90dGVkIiwgY29sb3IgPSAiYmxhY2siKSwgICMgTWFqb3IgZ3JpZCBsaW5lcw0KICAgIHBhbmVsLmdyaWQubWlub3IueCA9IGVsZW1lbnRfYmxhbmsoKSwgICAgICAgICAgICAgICAgICAgICAgIyBObyBtaW5vciB4IGdyaWQgbGluZXMNCiAgICBheGlzLnRpY2tzLmxlbmd0aCA9IHVuaXQoLTAuMjUsICJjbSIpLCAgICAgICAgICAgICAgICAgICAgICAjIEluY3JlYXNlIHRpY2sgbGVuZ3RoDQogICAgYXhpcy50aWNrcyA9IGVsZW1lbnRfbGluZShjb2xvciA9ICJibGFjayIsIHNpemUgPSAwLjUwKSwgICAjIERhcmtlciB0aWNrcw0KICAgIGF4aXMubGluZS54ID0gZWxlbWVudF9saW5lKGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDAuNzUpLCAgIyBEYXJrIGJvdHRvbSBib3JkZXINCiAgICBheGlzLmxpbmUueSA9IGVsZW1lbnRfbGluZShjb2xvciA9ICJibGFjayIsIHNpemUgPSAwLjc1KSAgICMgRGFyayBsZWZ0IGJvcmRlcg0KICApDQoNCiMgUHJpbnQgdGhlIHBsb3QgDQpwcmludChwMV9zaG9ydHRlcm0pDQoNCmBgYA0KDQoNCg0KIyMjIyBMb25nLVRlcm0NCg0KYGBge3IgYW16bl9yYXdfY2Fncl9ncmFwaHNfbG9uZywgZmlnLndpZHRoPTEwLCBmaWcuaGVpZ2h0PTd9DQoNCmNhdCgiXG5cbiMjIyMgQ29tcG91bmQgQXZlcmFnZSBHcm93dGggUmF0ZXMgQWNyb3NzIExvbmctVGVybSBSb2xsaW5nIFBlcmlvZHMgXG4iKQ0KDQojIEZpbHRlciBkYXRhIGZvciBMb25nLVRlcm0gQ0FHUiAoMjAtWWVhciBhbmQgMzAtWWVhcikNCmxvbmd0ZXJtX2RhdGEgPC0gbnJ0X2xvbmcgJT4lDQogIGZpbHRlcihDQUdSX1BlcmlvZCAlaW4lIGMoIjIwLVllYXIgQ0FHUiIsICIzMC1ZZWFyIENBR1IiKSkNCg0KDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KIyMgUExPVCBGVUxMIFdJVEhPVVQgTElNSVRTDQoNCiMgRGVmaW5lIHN0YXJ0IGFuZCBlbmQgeWVhcnMNCnN0YXJ0X3llYXIgPC0gMjAyMA0KZW5kX3llYXIgPC0gMjAyNA0KeWVhcl9yYW5nZSA8LSBlbmRfeWVhciAtIHN0YXJ0X3llYXIgKyAxICAjIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIHllYXJzDQoNCiMgRGVmaW5lIGJyZWFrcyByb3VuZGVkIGFwcHJvcHJpYXRlbHkNCmxpbWl0c19zdGFydF95ZWFyIDwtIGZsb29yKHN0YXJ0X3llYXIgLyA1KSAqIDUgICMgUm91bmQgZG93biB0byB0aGUgbmVhcmVzdCBtdWx0aXBsZSBvZiA1DQpsaW1pdHNfZW5kX3llYXIgPC0gY2VpbGluZyhlbmRfeWVhciAvIDUpICogNSAgICMgUm91bmQgdXAgdG8gdGhlIG5lYXJlc3QgbXVsdGlwbGUgb2YgNQ0KDQojIENyZWF0ZSBkeW5hbWljIHRpdGxlIGFuZCBjYXB0aW9uDQpkeW5hbWljX3RpdGxlIDwtIHBhc3RlMCgiQ0FHUiBBY3Jvc3MgTG9uZy1UZXJtIFBlcmlvZHMgT3ZlciAiLHllYXJfcmFuZ2UsICIgWWVhcnMgKCIsIHN0YXJ0X3llYXIsICItIiwgZW5kX3llYXIsICIpIikNCmR5bmFtaWNfY2FwdGlvbiA8LSBwYXN0ZTAoIkFNWk4gQ29tcG91bmQgQXZlcmFnZSBHcm93dGggUmF0ZXMgQWNyb3NzIExvbmctVGVybSBSb2xsaW5nIFBlcmlvZHMsIERhdGFzZXQgKCIsIG1pbl95ZWFyLCAiLSIsIG1heF95ZWFyLCAiKSIpDQoNCiMgQ3JlYXRlIHRoZSBmdWxsLCBub24tZmlsdGVyZWQgeC1heGlzIHBsb3Qgd2l0aCBkeW5hbWljIHggcGxhY2VtZW50IGZvciBhbm5vdGF0aW9ucw0KcDFfbG9uZ3Rlcm0gPC0gZ2dwbG90KGxvbmd0ZXJtX2RhdGEsIGFlcyh4ID0gYXMuaW50ZWdlcihEYXRlKSwgeSA9IENBR1JfVmFsdWUsIGNvbG9yID0gQ0FHUl9QZXJpb2QpKSArDQoNCiAgIyBBZGQgc2hhZGVkIGFyZWFzIGZvciBiYWNrZ3JvdW5kIGVmZmVjdA0KICBnZW9tX3JlY3QoYWVzKHhtaW4gPSAtSW5mLCB4bWF4ID0gSW5mLCB5bWluID0gdGFyZ2V0X2FnZ3Jlc3NpdmUsIHltYXggPSBJbmYpLCBmaWxsID0gImxpZ2h0Z3JlZW4iLCBhbHBoYSA9IDAuMDEwKSArDQogIGdlb21fcmVjdChhZXMoeG1pbiA9IC1JbmYsIHhtYXggPSBJbmYsIHltaW4gPSB0YXJnZXRfY29uc2VydmF0aXZlLCB5bWF4ID0gdGFyZ2V0X2FnZ3Jlc3NpdmUpLCBmaWxsID0gIm9yYW5nZSIsIGFscGhhID0gMC4wMSkgKw0KICBnZW9tX3JlY3QoYWVzKHhtaW4gPSAtSW5mLCB4bWF4ID0gSW5mLCB5bWluID0gLUluZiwgeW1heCA9IHRhcmdldF9jb25zZXJ2YXRpdmUpLCBmaWxsID0gImxpZ2h0Y29yYWwiLCBhbHBoYSA9IDAuMDEwKSArDQogIA0KICAjIFBsb3QgbGluZXMgZm9yIGVhY2ggQ0FHUiBQZXJpb2QNCiAgZ2VvbV9saW5lKHNpemUgPSAxLjAsIGFscGhhID0gMy4wKSArICAgICAgICMgTGluZSBmb3IgZWFjaCBDQUdSDQogIGdlb21fcG9pbnQoc2l6ZSA9IDEuMCwgYWxwaGEgPSAzLjApICsgICAgICAgIyBQb2ludHMgZm9yIGVhY2ggQ0FHUg0KDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IHRhcmdldF9hZ2dyZXNzaXZlLCBjb2xvciA9ICJkYXJrYmx1ZSIsIGxpbmV0eXBlID0gInNvbGlkIikgKw0KICAjIGdlb21faGxpbmUoeWludGVyY2VwdCA9IHRhcmdldF9tb2RlcmF0ZSwgY29sb3IgPSAiZGFya2JsdWUiLCBsaW5ldHlwZSA9ICJzb2xpZCIpICsNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gdGFyZ2V0X2NvbnNlcnZhdGl2ZSwgY29sb3IgPSAiZGFya2JsdWUiLCBsaW5ldHlwZSA9ICJzb2xpZCIpICsNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gdGFyZ2V0X2luZmxhdGlvbiwgY29sb3IgPSAiZGFya3JlZCIsIGxpbmV0eXBlID0gImRhc2hlZCIpICsNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gY2Fncl92YWx1ZSwgY29sb3IgPSAiZGFya3JlZCIsIGxpbmV0eXBlID0gImRhc2hlZCIpICsNCiAgDQogICMgRHluYW1pYyByaWdodC1hbGlnbmVkIHBsYWNlbWVudCBmb3IgYW5ub3RhdGlvbnMNCiAgYW5ub3RhdGUoInRleHQiLCB4ID0gSW5mLCB5ID0gdGFyZ2V0X2FnZ3Jlc3NpdmUsIGxhYmVsID0gIkFnZ3Jlc3NpdmUiLCANCiAgICAgICAgICAgaGp1c3QgPSAxLCB2anVzdCA9IC0wLjUwLCBjb2xvciA9ICJkYXJrYmx1ZSIsIHNpemUgPSA0KSArDQogICMgYW5ub3RhdGUoInRleHQiLCB4ID0gSW5mLCB5ID0gdGFyZ2V0X21vZGVyYXRlLCBsYWJlbCA9ICJNb2RlcmF0ZSIsIA0KICAjICAgICAgICAgaGp1c3QgPSAxLCB2anVzdCA9IC0wLjUwLCBjb2xvciA9ICJkYXJrYmx1ZSIsIHNpemUgPSA0KSArDQogIGFubm90YXRlKCJ0ZXh0IiwgeCA9IEluZiwgeSA9IHRhcmdldF9jb25zZXJ2YXRpdmUsIGxhYmVsID0gIkNvbnNlcnZhdGl2ZSIsIA0KICAgICAgICAgICBoanVzdCA9IDEsIHZqdXN0ID0gLTAuNTAsIGNvbG9yID0gImRhcmtibHVlIiwgc2l6ZSA9IDQpICsNCiAgYW5ub3RhdGUoInRleHQiLCB4ID0gSW5mLCB5ID0gdGFyZ2V0X2luZmxhdGlvbiwgbGFiZWwgPSAiSW5mbGF0aW9uIiwgDQogICAgICAgICAgIGhqdXN0ID0gMSwgdmp1c3QgPSAtMC41MCwgY29sb3IgPSAiZGFya3JlZCIsIHNpemUgPSA0KSArDQogIGFubm90YXRlKCJ0ZXh0IiwgeCA9IEluZiwgeSA9IGNhZ3JfdmFsdWUsIGxhYmVsID0gIkNBR1IiLCANCiAgICAgICAgICAgaGp1c3QgPSAxLCB2anVzdCA9IC0wLjUwLCBjb2xvciA9ICJkYXJrcmVkIiwgc2l6ZSA9IDQpICsgDQoNCiAgbGFicygNCiAgICB0aXRsZSA9IGR5bmFtaWNfdGl0bGUsDQogICAgeCA9ICJZZWFyIiwNCiAgICB5ID0gIkNBR1IgVmFsdWUgKCUpIiwNCiAgICBjb2xvciA9ICJDQUdSIFBlcmlvZCIsDQogICAgY2FwdGlvbiA9IGR5bmFtaWNfY2FwdGlvbg0KICAgICkgKw0KICANCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGN1c3RvbV9jb2xvcnNbYygiMjAtWWVhciBDQUdSIiwgIjMwLVllYXIgQ0FHUiIpXSkgKw0KICBzY2FsZV94X2NvbnRpbnVvdXMoDQogICAgbGltaXRzID0gYyhzdGFydF95ZWFyLCBlbmRfeWVhciArIDEpLCANCiAgICBicmVha3MgPSBzZXEobGltaXRzX3N0YXJ0X3llYXIsIGxpbWl0c19lbmRfeWVhciArIDEsIDEpDQogICkgKyAgIyBSZXN0cmljdCAmIFNldCBNYWpvciB4LWF4aXMgbGluZXMgZm9yIGVhY2ggeWVhcg0KDQogIHRoZW1lX21pbmltYWwoKSArDQogIHRoZW1lKA0KICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUsIHNpemUgPSAyMCksICAgICAgICAgIyBMYXJnZXIgdGl0bGUgZm9udA0KICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQpLCAgICAgICAgICAgICAgICAgICAgIyBMYXJnZXIgeC1heGlzIGxhYmVsIGZvbnQNCiAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0KSwgICAgICAgICAgICAgICAgICAgICMgTGFyZ2VyIHktYXhpcyBsYWJlbCBmb250DQogICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxLCBzaXplID0gMTQpLCAgIyBMYXJnZXIgeC1heGlzIHRleHQNCiAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQpLCAgICAgICAgICAgICAgICAgICAgICMgTGFyZ2VyIHktYXhpcyB0ZXh0DQogICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCksICAgICAgICAgICAgICAgICAgICAjIExlZ2VuZCB0aXRsZSBzaXplDQogICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyKSwgICAgICAgICAgICAgICAgICAgICAjIExlZ2VuZCB0ZXh0IHNpemUNCiAgICBwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9saW5lKGxpbmV0eXBlID0gImRvdHRlZCIsIGNvbG9yID0gImJsYWNrIiksICAjIE1ham9yIGdyaWQgbGluZXMNCiAgICBwYW5lbC5ncmlkLm1pbm9yLnggPSBlbGVtZW50X2JsYW5rKCksICAgICAgICAgICAgICAgICAgICAgICMgTm8gbWlub3IgeCBncmlkIGxpbmVzDQogICAgYXhpcy50aWNrcy5sZW5ndGggPSB1bml0KC0wLjI1LCAiY20iKSwgICAgICAgICAgICAgICAgICAgICAgIyBJbmNyZWFzZSB0aWNrIGxlbmd0aA0KICAgIGF4aXMudGlja3MgPSBlbGVtZW50X2xpbmUoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMC41MCksICAgIyBEYXJrZXIgdGlja3MNCiAgICBheGlzLmxpbmUueCA9IGVsZW1lbnRfbGluZShjb2xvciA9ICJibGFjayIsIHNpemUgPSAwLjc1KSwgICMgRGFyayBib3R0b20gYm9yZGVyDQogICAgYXhpcy5saW5lLnkgPSBlbGVtZW50X2xpbmUoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMC43NSkgICAjIERhcmsgbGVmdCBib3JkZXINCiAgKQ0KDQojIFByaW50IHRoZSBwbG90IA0KcHJpbnQocDFfbG9uZ3Rlcm0pDQoNCg0KYGBgDQoNCiMgTUVUQQ0KDQpNZXRhIFBsYXRmb3JtcywgSW5jLiAoTUVUQSkgaXMgY29uc2lkZXJlZCBhIGxlYWRpbmcgdGVjaG5vbG9neSBhbmQgc29jaWFsIG1lZGlhIGNvbXBhbnkgaGVhZHF1YXJ0ZXJlZCBpbiBNZW5sbyBQYXJrLCBDYWxpZm9ybmlhLiBFc3RhYmxpc2hlZCBpbiAyMDA0IGJ5IE1hcmsgWnVja2VyYmVyZywgRWR1YXJkbyBTYXZlcmluLCBBbmRyZXcgTWNDb2xsdW0sIER1c3RpbiBNb3Nrb3ZpdHosIGFuZCBDaHJpcyBIdWdoZXMsIE1ldGEgaXMgYmVzdCBrbm93biBmb3IgaXRzIGZhbWlseSBvZiBzb2NpYWwgbWVkaWEgcGxhdGZvcm1zLCBpbmNsdWRpbmcgRmFjZWJvb2ssIEluc3RhZ3JhbSwgYW5kIFdoYXRzQXBwLiBUaGUgY29tcGFueSBhbHNvIGV4Y2VscyBpbiB2aXJ0dWFsIHJlYWxpdHkgKFZSKSBhbmQgYXVnbWVudGVkIHJlYWxpdHkgKEFSKSB0aHJvdWdoIGl0cyBSZWFsaXR5IExhYnMgZGl2aXNpb24sIHdoaWNoIGRldmVsb3BzIHRlY2hub2xvZ2llcyBsaWtlIHRoZSBPY3VsdXMgVlIgaGVhZHNldHMuIE1ldGEgaGFzIHNoaWZ0ZWQgaXRzIGZvY3VzIHRvd2FyZCBidWlsZGluZyB0aGUgIm1ldGF2ZXJzZSwiIGFuIGludGVyY29ubmVjdGVkIHZpcnR1YWwgcmVhbGl0eSBlY29zeXN0ZW0sIHdoaWxlIGNvbnRpbnVpbmcgdG8gaW5ub3ZhdGUgaW4gYXJlYXMgbGlrZSBhcnRpZmljaWFsIGludGVsbGlnZW5jZSAoQUkpIGFuZCBkaWdpdGFsIGFkdmVydGlzaW5nLg0KDQoNCiMjIE1FVEEgR1INCg0KIyMjIERhdGENCg0KVGhlIE1FVEEgRGF0YSBwcmVzZW50ZWQgaGVyZSBpcyBzb3VyY2VkIGZyb20gWWFob28gRmluYW5jZSwgZmlsdGVyZWQgdG8gZGlzcGxheSBNb250aGx5IEhpc3RvcmljYWwgRGF0YSAoZS5nLiwgMDMvMDEvMjAyNCkuIFRoaXMgZGF0YSByZXByZXNlbnRzIHRoZSBjbG9zaW5nIHByaWNlIG9mIHRoZSBsYXN0IHRyYWRpbmcgZGF5IG9mIGVhY2ggbW9udGggKGUuZy4sIDAzLzI4LzIwMjQpLiBQbGVhc2Ugbm90ZSB0aGF0IHRoZSBzdGF0aXN0aWNzIHByZXNlbnRlZCBoZXJlIG1heSBkaWZmZXIgZnJvbSB0aG9zZSBpbiBZYWhvbyBGaW5hbmNlJ3MgUGVyZm9ybWFuY2Ugc2VjdGlvbiBkdWUgdG8gZGlmZmVyZW5jZXMgaW4gZGF0YSBhZ2dyZWdhdGlvbiBhbmQgY2FsY3VsYXRpb24gbWV0aG9kcy4gIA0KDQpEYXRhIFNvdXJjZTogYHIgbnJ2JHNvdXJjZV9tZXRhX3lhaG9vYA0KDQpgYGB7ciBtZXRhX3JhdywgZXZhbD1UUlVFLCBlY2hvPUZBTFNFfQ0KDQojIERpc3BsYXkgdGhlIHN0cnVjdHVyZSBvZiB0aGUgZGF0YXNldCB0byBjb25maXJtIGNvbHVtbiBuYW1lcw0KaW50ZXJhY3RpdmVfc3RyKG5ydCRtZXRhX3JhdykNCg0KbGlicmFyeShkcGx5cikNCmxpYnJhcnkobHVicmlkYXRlKSAgIyBGb3IgZGF0ZSBtYW5pcHVsYXRpb24NCmxpYnJhcnkoc2NhbGVzKQ0KbGlicmFyeShzdHJpbmdyKQ0KDQojIEVuc3VyZSB0aGUgJ0RhdGUnIGNvbHVtbiBpcyBvZiBEYXRlIGNsYXNzDQptZXRhX3JhdyA8LSBucnQkbWV0YV9yYXcgJT4lDQogIG11dGF0ZShEYXRlID0gYXMuRGF0ZShEYXRlLCBmb3JtYXQgPSAiJVktJW0tJWQiKSkNCg0KIyBGaW5kIHRoZSBtaW5pbXVtIGFuZCBtYXhpbXVtIHllYXINCm1pbl95ZWFyIDwtIGZvcm1hdChtaW4obWV0YV9yYXckRGF0ZSwgbmEucm0gPSBUUlVFKSwgIiVZIikNCm1heF95ZWFyIDwtIGZvcm1hdChtYXgobWV0YV9yYXckRGF0ZSwgbmEucm0gPSBUUlVFKSwgIiVZIikNCmludGVyYWN0aXZlX3ByaW50KG1pbl95ZWFyKQ0KaW50ZXJhY3RpdmVfcHJpbnQobWF4X3llYXIpDQoNCiMgVXBkYXRlIGRhdGEgZnJhbWUgd2l0aCBwcm9wZXIgZGF0ZSBhbmQgcGVyY2VudGFnZSBoYW5kbGluZw0KbWV0YV9yYXcgPC0gbWV0YV9yYXcgJT4lDQogIG11dGF0ZSgNCiAgICAjIENvbnZlcnQgQ2xvc2UgRGF0ZSB0byAiWVlZWS1NTS1ERCIgZm9ybWF0DQogICAgYERhdGVgID0gZm9ybWF0KGFzLkRhdGUoYXMuY2hhcmFjdGVyKGBEYXRlYCksIG9yaWdpbiA9ICIxOTcwLTAxLTAxIiksICIlWS0lbS0lZCIpLA0KDQogICAgIyBFbnN1cmUgQ2xvc2UgaXMgYSBudW1iZXIgZm9ybWF0dGVkIHRvIDIgZGVjaW1hbCBwbGFjZXMNCiAgICBgQ2xvc2VgID0gbnVtYmVyKGFzLm51bWVyaWMoZ3N1YigiLCIsICIiLCBDbG9zZSkpLCBiaWcubWFyayA9ICIsIiwgZGVjaW1hbC5tYXJrID0gIi4iLCBhY2N1cmFjeSA9IDAuMDEpLA0KDQogICAgIyBDbGVhbiBhbmQgaGFuZGxlIHBlcmNlbnRhZ2UgY29sdW1ucw0KICAgIGFjcm9zcygzOjMsIH4gew0KICAgICAgdmFsdWUgPC0gZ3N1YigiWywlXFxzXSIsICIiLCAuKSAgIyBSZW1vdmUgJSwgY29tbWFzLCBhbmQgc3BhY2VzDQogICAgICBudW1lcmljX3ZhbHVlIDwtIHN1cHByZXNzV2FybmluZ3MoYXMubnVtZXJpYyh2YWx1ZSkpICAjIENvbnZlcnQgdG8gbnVtZXJpYw0KICAgICAgaWZlbHNlKA0KICAgICAgICAhaXMubmEobnVtZXJpY192YWx1ZSksIA0KICAgICAgICBwYXN0ZTAoZm9ybWF0KHJvdW5kKG51bWVyaWNfdmFsdWUqMTAwLCAyKSwgYmlnLm1hcmsgPSAiLCIsIHNjaWVudGlmaWMgPSBGQUxTRSksICIlIiksICAjIEZvcm1hdCB0byAyIGRlY2ltYWwgcGxhY2VzIGFuZCBhZGQgY29tbWFzDQogICAgICAgIC4NCiAgICAgICkNCiAgICB9KQ0KICApICU+JQ0KICBhcnJhbmdlKGRlc2MoYERhdGVgKSkgICMgU29ydCBieSBEYXRlIGZyb20gbmV3ZXN0IHRvIG9sZGVzdA0KDQojIERpc3BsYXkgdGhlIGZvcm1hdHRlZCBkYXRhDQppbnRlcmFjdGl2ZV9zdHIobWV0YV9yYXcpDQppbnRlcmFjdGl2ZV9wcmludChtZXRhX3JhdykNCg0KIyBEaXNwbGF5IHRoZSB0YWJsZSB3aXRoIGNhcHRpb24NCmNhdCgiXG5cbiMjIyMgTUVUQSBZZWFybHkgUGVyZm9ybWFuY2UgKCIsIG1pbl95ZWFyLCAiLSIsIG1heF95ZWFyLCAiKVxuIiwgc2VwID0gIiIpDQpmb3JtYXRfZXF1YWxfd2lkdGhfZ3JvdXBlZChtZXRhX3JhdywgZ3JvdXBpbmdfZmFjdG9yID0gMikNCiMgY2F0KCJcblxuIFNvdXJjZTogIiwgbnJ2JHNvdXJjZV9tZXRhX3lhaG9vLCAiXG4iKQ0KDQpgYGANCg0KIyMjIFN1bW1hcnkNCg0KYGBge3IgbWV0YV9yYXdfc3VtbWFyeSwgZXZhbD1UUlVFLCBlY2hvPUZBTFNFfQ0KDQojIExvYWQgbmVjZXNzYXJ5IGxpYnJhcmllcw0KbGlicmFyeShkcGx5cikNCmxpYnJhcnkodGliYmxlKQ0KbGlicmFyeShrbml0cikNCmxpYnJhcnkoa2FibGVFeHRyYSkNCg0KaW50ZXJhY3RpdmVfc3RyKG1ldGFfcmF3KQ0KaW50ZXJhY3RpdmVfcHJpbnQobWV0YV9yYXcpDQoNCiMgRW5zdXJlIHRoZSBEYXRlIGNvbHVtbiBpcyBhIHByb3BlciBEYXRlIG9iamVjdCBhbmQgZXh0cmFjdCB0aGUgeWVhcg0KbWV0YV9yYXcgPC0gbWV0YV9yYXcgJT4lDQogIHNsaWNlKC0xKSAlPiUgIyBSZW1vdmUgdGhlIGZpcnN0IHJvdw0KICAjIG11dGF0ZShEYXRlID0gaWZlbHNlKHJvd19udW1iZXIoKSA9PSAxLCAiMjAyNS0wMS0wMSIsIERhdGUpKSAlPiUNCiAgbXV0YXRlKA0KICAgIERhdGUgPSBhcy5udW1lcmljKGZvcm1hdChhcy5EYXRlKERhdGUsIGZvcm1hdCA9ICIlWS0lbS0lZCIpLCAiJVkiKSksDQogICAgYDEtWWVhciBDQUdSYCA9IGFzLm51bWVyaWMoZ3N1YigiW14wLTkuLV0iLCAiIiwgYDEtWWVhciBDQUdSYCkpDQogICkNCg0KIyBTb3J0IGRhdGEgYnkgRGF0ZSBpbiBhc2NlbmRpbmcgb3JkZXINCm1ldGFfcmF3IDwtIG1ldGFfcmF3ICU+JQ0KICBhcnJhbmdlKERhdGUpDQoNCg0KIyBDYWxjdWxhdGUgdGhlIENBR1IgYW5kIGR5bmFtaWNhbGx5IGNyZWF0ZSBhIHZhcmlhYmxlIG5hbWUgd2l0aCB0aGUgZm9ybWF0IG1ldGFfY2Fncl92YWx1ZV9zPG1pbl95ZWFyPl9lPG1heF95ZWFyPg0KaW5pdGlhbF92YWx1ZSA8LSAxMDAgICMgQXNzdW1pbmcgYW4gaW5pdGlhbCBpbmRleCB2YWx1ZSBvZiAxMDANCmZpbmFsX3ZhbHVlIDwtIGluaXRpYWxfdmFsdWUgKiBwcm9kKDEgKyBtZXRhX3JhdyRgMS1ZZWFyIENBR1JgIC8gMTAwLCBuYS5ybSA9IFRSVUUpDQptaW5feWVhciA8LSBtaW4obWV0YV9yYXckRGF0ZSwgbmEucm0gPSBUUlVFKQ0KbWF4X3llYXIgPC0gbWF4KG1ldGFfcmF3JERhdGUsIG5hLnJtID0gVFJVRSkNCm51bV95ZWFycyA8LSBtYXhfeWVhciAtIG1pbl95ZWFyDQpjYWdyX3ZhbHVlIDwtIHJvdW5kKCgoZmluYWxfdmFsdWUgLyBpbml0aWFsX3ZhbHVlKV4oMSAvIG51bV95ZWFycykgLSAxKSAqIDEwMCwgMikNCnZhcl9uYW1lIDwtIHBhc3RlMCgibWV0YV9jYWdyX3ZhbHVlX3MiLCBtaW5feWVhciwgIl9lIiwgbWF4X3llYXIpDQphc3NpZ24odmFyX25hbWUsIGNhZ3JfdmFsdWUpDQoNCiMgQ29udmVydCBNRVRBIGRhdGEgdG8gbnVtZXJpYywgcmVtb3ZpbmcgYW55IHBlcmNlbnRhZ2Ugc2lnbnMNCmRhdGEgPC0gYXMubnVtZXJpYyhnc3ViKCIlIiwgIiIsIG1ldGFfcmF3JGAxLVllYXIgQ0FHUmApKQ0KDQojIENhbGN1bGF0ZSBzdGF0aXN0aWNzDQpjb3VudF9vYnNlcnZhdGlvbnMgPC0gc3VtKCFpcy5uYShkYXRhKSkNCm1lYW5fdmFsdWUgPC0gcm91bmQobWVhbihkYXRhLCBuYS5ybSA9IFRSVUUpLCAyKQ0KbWVkaWFuX3ZhbHVlIDwtIHJvdW5kKG1lZGlhbihkYXRhLCBuYS5ybSA9IFRSVUUpLCAyKQ0Kc2RfdmFsdWUgPC0gcm91bmQoc2QoZGF0YSwgbmEucm0gPSBUUlVFKSwgMikNCm1pbl9jYWdyX3JhbmdlIDwtIHJvdW5kKGNhZ3JfdmFsdWUgLSBzZF92YWx1ZSwgMikNCm1heF9jYWdyX3JhbmdlIDwtIHJvdW5kKGNhZ3JfdmFsdWUgKyBzZF92YWx1ZSwgMikNCm1pbl92YWx1ZSA8LSByb3VuZChtaW4oZGF0YSwgbmEucm0gPSBUUlVFKSwgMikNCm1heF92YWx1ZSA8LSByb3VuZChtYXgoZGF0YSwgbmEucm0gPSBUUlVFKSwgMikNCg0KIyBUYXJnZXQgUmF0ZSBBbmFseXNpcyAtIFJlZmVyIHRvICJQcmVmZXJyZWQgVGFyZ2V0cyIgb3IgaW5jbHVkZSBiZWxvdyBmb3IgaW5kaXZpZHVhbCBjaGFuZ2VzLg0KYWJvdmVfdGFyZ2V0X2luZmxhdGlvbiA8LSBzdW0oZGF0YSA+PSB0YXJnZXRfaW5mbGF0aW9uLCBuYS5ybSA9IFRSVUUpDQphYm92ZV90YXJnZXRfY29uc2VydmF0aXZlIDwtIHN1bShkYXRhID49IHRhcmdldF9jb25zZXJ2YXRpdmUsIG5hLnJtID0gVFJVRSkNCmFib3ZlX3RhcmdldF9tb2RlcmF0ZSA8LSBzdW0oZGF0YSA+PSB0YXJnZXRfbW9kZXJhdGUsIG5hLnJtID0gVFJVRSkNCmFib3ZlX3RhcmdldF9hZ2dyZXNzaXZlIDwtIHN1bShkYXRhID49IHRhcmdldF9hZ2dyZXNzaXZlLCBuYS5ybSA9IFRSVUUpDQoNCnBlcmNlbnRfYWJvdmVfdGFyZ2V0X2NvbnNlcnZhdGl2ZSA8LSByb3VuZCgoYWJvdmVfdGFyZ2V0X2NvbnNlcnZhdGl2ZSAvIGNvdW50X29ic2VydmF0aW9ucykgKiAxMDAsIDIpDQpwZXJjZW50X2Fib3ZlX3RhcmdldF9pbmZsYXRpb24gPC0gcm91bmQoKGFib3ZlX3RhcmdldF9pbmZsYXRpb24gLyBjb3VudF9vYnNlcnZhdGlvbnMpICogMTAwLCAyKQ0KcGVyY2VudF9hYm92ZV90YXJnZXRfbW9kZXJhdGUgPC0gcm91bmQoKGFib3ZlX3RhcmdldF9tb2RlcmF0ZSAvIGNvdW50X29ic2VydmF0aW9ucykgKiAxMDAsIDIpDQpwZXJjZW50X2Fib3ZlX3RhcmdldF9hZ2dyZXNzaXZlIDwtIHJvdW5kKChhYm92ZV90YXJnZXRfYWdncmVzc2l2ZSAvIGNvdW50X29ic2VydmF0aW9ucykgKiAxMDAsIDIpDQoNCiMgQ29tcGlsZSBzdGF0aXN0aWNzIGludG8gYSBsaXN0IGZvciBlYXN5IGNvbnZlcnNpb24gdG8gYSBkYXRhIGZyYW1lIHdpdGggZGVmaW5pdGlvbnMNCm1ldGFfcmF3X3N1bW1hcnkgPC0gdHJpYmJsZSgNCiAgflN0YXRpc3RpYywgflZhbHVlLCB+RGVmaW5pdGlvbiwNCiAgIkNvdW50IG9mIE9ic2VydmF0aW9ucyIsIGFzLmNoYXJhY3Rlcihjb3VudF9vYnNlcnZhdGlvbnMpLCAiVG90YWwgbnVtYmVyIG9mIGRhdGEgcG9pbnRzIGNvbGxlY3RlZCBvdmVyIHRoZSBzcGVjaWZpYyBwZXJpb2QuIiwNCiAgIkNBR1IiLCBwYXN0ZTAoY2Fncl92YWx1ZSwgIiUiKSwgIkNvbXBvdW5kIEF2ZXJhZ2UgR3Jvd3RoIFJhdGU7IG1lYW4gZ3Jvd3RoIHJhdGUgb3ZlciBhIHBlcmlvZCBpZiBpdCBoYWQgY29tcG91bmRlZCBhbnVhbGx5LiIsDQogICJNZWFuIiwgcGFzdGUwKG1lYW5fdmFsdWUsICIlIiksICJSZWZsZWN0cyB0aGUgZ2VuZXJhbCBwcmljZSBsZXZlbCBhbmQgb3ZlcmFsbCBncm93dGggcmF0ZS4iLA0KICAiTWVkaWFuIiwgcGFzdGUwKG1lZGlhbl92YWx1ZSwgIiUiKSwgIk1pZGRsZSB2YWx1ZSBvZiB0aGUgZGF0YSB3aGVuIG9yZGVyZWQgY2hyb25vbG9naWNhbGx5OyBjZW50cmFsIHRlbmRlbmN5IG1lYXN1cmUgbGVzcyBhZmZlY3RlZCBieSBleHRyZW1lIHZhbHVlcy4iLA0KICAiU3RhbmRhcmQgRGV2aWF0aW9uIChWb2xhdGlsaXR5KSIsIHBhc3RlMChzZF92YWx1ZSwgIiUiKSwgIlRoZSBkaXNwZXJzaW9uIG9mIHZhbHVlcyBmcm9tIHRoZSBtZWFuLCBpbmRpY2F0aW5nIHRoZSB2b2xhdGlsaXR5IG9mIHByaWNlIGNoYW5nZXMgYW5kIGVjb25vbWljIHN0YWJpbGl0eS4iLA0KICAiTWluIENBR1IgUmFuZ2UgKENBR1IgLSBTRCkiLCBwYXN0ZTAobWluX2NhZ3JfcmFuZ2UsICIlIiksICJMb3dlciBib3VuZGFyeSBvZiBleHBlY3RlZCBNRVRBIHJhbmdlOyBsb3dlc3QgZXN0aW1hdGUgb2YgdHlwaWNhbCBncm93dGggcmF0ZSBjb25zaWRlcmluZyBub3JtYWwgZmx1Y3R1YXRpb25zLiIsDQogICJNYXggQ0FHUiBSYW5nZSAoQ0FHUiArIFNEKSIsIHBhc3RlMChtYXhfY2Fncl9yYW5nZSwgIiUiKSwgIlVwcGVyIGJvdW5kYXJ5IG9mIGV4cGVjdGVkIE1FVEEgcmFuZ2U7IGhpZ2hlc3QgZXN0aW1hdGUgb2YgdHlwaWNhbCBncm93dGggcmF0ZSBjb25zaWRlcmluZyBub3JtYWwgZmx1Y3R1YXRpb25zLiIsDQogICJNaW5pbXVtIiwgcGFzdGUwKG1pbl92YWx1ZSwgIiUiKSwgIkxvd2VzdCBncm93dGggcmF0ZS4iLA0KICAiTWF4aW11bSIsIHBhc3RlMChtYXhfdmFsdWUsICIlIiksICJIaWdoZXN0IGdyb3d0aCByYXRlLiIsDQogICJQZXJjZW50IEFib3ZlIEluZmxhdGlvbiBUYXJnZXQiLCBwYXN0ZTAocGVyY2VudF9hYm92ZV90YXJnZXRfaW5mbGF0aW9uLCAiJSIpLCAiUGVyY2VudGFnZSBvZiB2YWx1ZXMgYWJvdmUgdGhlIGluZmxhdGlvbiB0YXJnZXQgc3BlY2lmaWVkIGluIFByZWZlcnJlZCBUYXJnZXRzIHNlY3Rpb24uIiwNCiAgIlBlcmNlbnQgQWJvdmUgQ29uc2VydmF0aXZlIFRhcmdldCIsIHBhc3RlMChwZXJjZW50X2Fib3ZlX3RhcmdldF9jb25zZXJ2YXRpdmUsICIlIiksICJQZXJjZW50YWdlIG9mIHZhbHVlcyBhYm92ZSB0aGUgY29uc2VydmF0aXZlIHRhcmdldCBzcGVjaWZpZWQgaW4gUHJlZmVycmVkIFRhcmdldHMgc2VjdGlvbi4iLA0KICAiUGVyY2VudCBBYm92ZSBNb2RlcmF0ZSBUYXJnZXQiLCBwYXN0ZTAocGVyY2VudF9hYm92ZV90YXJnZXRfbW9kZXJhdGUsICIlIiksICJQZXJjZW50YWdlIG9mIHZhbHVlcyBhYm92ZSB0aGUgbW9kZXJhdGUgdGFyZ2V0IHNwZWNpZmllZCBpbiBQcmVmZXJyZWQgVGFyZ2V0cyBzZWN0aW9uLiIsDQogICJQZXJjZW50IEFib3ZlIEFnZ3Jlc3NpdmUgVGFyZ2V0IiwgcGFzdGUwKHBlcmNlbnRfYWJvdmVfdGFyZ2V0X2FnZ3Jlc3NpdmUsICIlIiksICJQZXJjZW50YWdlIG9mIHZhbHVlcyBhYm92ZSB0aGUgYWdncmVzc2l2ZSB0YXJnZXQgc3BlY2lmaWVkIGluIFByZWZlcnJlZCBUYXJnZXRzIHNlY3Rpb24uIg0KKQ0KDQojIENvbnZlcnQgdG8gY2hhcmFjdGVyIHRvIGF2b2lkIGF1dG9tYXRpYyBkZWNpbWFsIHBvaW50cyBvbiB3aG9sZSBudW1iZXJzDQptZXRhX3Jhd19zdW1tYXJ5IDwtIG1ldGFfcmF3X3N1bW1hcnkgJT4lDQogIG11dGF0ZShhY3Jvc3MoZXZlcnl0aGluZygpLCBhcy5jaGFyYWN0ZXIpKQ0KDQojIERpc3BsYXkgZm9ybWF0dGVkIHRhYmxlDQpjYXQoIlxuXG4jIyMjIEFubnVhbCBHcm93dGggUmF0ZSBTdW1tYXJ5ICgiLCBtaW5feWVhciwgIi0iLCBtYXhfeWVhciwgIilcbiIsIHNlcCA9ICIiKQ0KZm9ybWF0XzNjb2xfY3VzdG9tX3dpZHRocyhtZXRhX3Jhd19zdW1tYXJ5LCBjb2wxX3dpZHRoID0gIjIwZW0iLCBjb2wyX3dpZHRoID0gIjEwZW0iLCBjb2wzX3dpZHRoID0gIjQwZW0iKSANCg0KIyBWaWV3KG1ldGFfcmF3X3N1bW1hcnkpDQppbnRlcmFjdGl2ZV9zdHIobWV0YV9yYXdfc3VtbWFyeSkNCg0KYGBgDQoNCk1FVEEncyBJbmRleCBleGhpYml0cyBhIGByIGlmKGNhZ3JfdmFsdWUgPiB0YXJnZXRfYWdncmVzc2l2ZSkgImFnZ3Jlc3NpdmUiIGVsc2UgaWYoY2Fncl92YWx1ZSA+IHRhcmdldF9tb2RlcmF0ZSkgIm1vZGVyYXRlIiBlbHNlIGlmKGNhZ3JfdmFsdWUgPiB0YXJnZXRfY29uc2VydmF0aXZlKSAiY29uc2VydmF0aXZlIiBlbHNlIGlmKGNhZ3JfdmFsdWUgPiB0YXJnZXRfaW5mbGF0aW9uKSAiYmFzZWxpbmUiIGVsc2UgImRpc2FwcG9pbnRpbmciYCBDQUdSIGF0IGByIGNhZ3JfdmFsdWVgJSwgYHIgaWYoY2Fncl92YWx1ZSA8IG1lYW5fdmFsdWUpICJsb3dlciB0aGFuIiBlbHNlICJoaWdoZXIgdGhhbiJgIHRoZSBtZWFuIGdyb3d0aCByYXRlIG9mIGByIG1lYW5fdmFsdWVgJSwgcmVmbGVjdGluZyB0aGUgaW1wYWN0IG9mIHNob3J0LXRlcm0gdm9sYXRpbGl0eSBhbmQgYHIgaWYoY2Fncl92YWx1ZSA+IG1lYW5fdmFsdWUpICJkZWNsaW5lcyIgZWxzZSAiZ3Jvd3RoIHNwaWtlcyJgLiBUaGUgbWVkaWFuIHJldHVybiBvZiBgciBtZWRpYW5fdmFsdWVgJSBpbmRpY2F0ZXMgdGhhdCBtb3JlIHRoYW4gaGFsZiBvZiB0aGUgb2JzZXJ2ZWQgeWVhcnMgZXhwZXJpZW5jZWQgcmV0dXJucyBgciBpZihjYWdyX3ZhbHVlIDwgbWVkaWFuX3ZhbHVlKSAiYWJvdmUiIGVsc2UgImJlbG93ImAgdGhlIG1lYW4uIFRoZSByZWxhdGlvbnNoaXAgYmV0d2VlbiB0aGUgQ0FHUiBhbmQgdGhlIG1lZGlhbiBncm93dGggcmF0ZSBzdWdnZXN0cyB0aGF0IHN1c3RhaW5lZCBwZXJpb2RzIG9mIGFib3ZlLW1lZGlhbiBncm93dGggaGF2ZSBleGVydGVkIGN1bXVsYXRpdmUgYHIgaWYoY2Fncl92YWx1ZSA8IG1lZGlhbl92YWx1ZSkgInVwd2FyZCBwcmVzc3VyZSIgZWxzZSAiZG93bndhcmQgcHJlc3N1cmUiYCBvbiBvdmVyYWxsIHByaWNlIGxldmVscy4gVGhpcyByZWxhdGlvbnNoaXAgaGlnaGxpZ2h0cyBhIGRpc3RyaWJ1dGlvbiB3aXRoIG5vdGFibGUgZXh0cmVtZXMgb24gdGhlIGByIGlmKGNhZ3JfdmFsdWUgPCBtZWFuX3ZhbHVlKSAiaGlnaGVyIiBlbHNlICJsb3dlciJgIGVuZCwgcmVmbGVjdGluZyBgciBpZihjYWdyX3ZhbHVlIDwgbWVhbl92YWx1ZSkgInBvc2l0aXZlIiBlbHNlICJuZWdhdGl2ZSJgIHNrZXduZXNzLiBUaGlzIGByIGlmKGNhZ3JfdmFsdWUgPCBtZWRpYW5fdmFsdWUpICJwb3NpdGl2ZSIgZWxzZSAibmVnYXRpdmUiYCBza2V3bmVzcyBpbXBsaWVzIHRoYXQgd2hpbGUgbW9yZSB0aGFuIGhhbGYgb2YgdGhlIG9ic2VydmVkIHllYXJzIGV4cGVyaWVuY2VkIHJldHVybnMgYHIgaWYoY2Fncl92YWx1ZSA8IG1lZGlhbl92YWx1ZSkgImFib3ZlIHRoZSBtZWFuLCBkb3dudHVybnMgY2FuIGJlIHNldmVyZSIgZWxzZSAiYmVsb3cgdGhlIG1lYW4sIHVwdHVybnMgY2FuIGJlIHNpZ25pZmljYW50ImAuIEhvd2V2ZXIsIHRoZSBtYXJrZXQgaGFzIGhpc3RvcmljYWxseSBwcm92aWRlZCBzdWJzdGFudGlhbCBgciBpZihjYWdyX3ZhbHVlIDwgbWVkaWFuX3ZhbHVlKSAidXBzaWRlIHBvdGVudGlhbCIgZWxzZSAiZG93bnNpZGUgcmlzayJgLiBBZGRpdGlvbmFsbHksIHRoZSBmYWN0IHRoYXQgYHIgcGVyY2VudF9hYm92ZV90YXJnZXRfaW5mbGF0aW9uYCUgb2YgdGhlIHllYXJzIGV4Y2VlZGVkIHRoZSBpbmZsYXRpb24gdGFyZ2V0IGByIGlmIChwZXJjZW50X2Fib3ZlX3RhcmdldF9pbmZsYXRpb24gPiA3MCkgInJlaW5mb3JjZXMgTUVUQSdzIGVmZmVjdGl2ZW5lc3MgYXMgYSBzdHJvbmcgbG9uZy10ZXJtIGhlZGdlIiBlbHNlIGlmIChwZXJjZW50X2Fib3ZlX3RhcmdldF9pbmZsYXRpb24gPiA2MCkgInJlaW5mb3JjZXMgTUVUQSdzIGVmZmVjdGl2ZW5lc3MgYXMgYSBsb25nLXRlcm0gaGVkZ2UiIGVsc2UgaWYgKHBlcmNlbnRfYWJvdmVfdGFyZ2V0X2luZmxhdGlvbiA+IDUwKSAicXVlc3Rpb25zIE1FVEEncyBlZmZlY3RpdmVuZXNzICBhcyBhIGxvbmctdGVybSBoZWRnZSIgZWxzZSAidW5kZXJtaW5lcyBNRVRBJ3MgZWZmZWN0aXZlbmVzcyBhcyBhIGxvbmctdGVybSBoZWRnZSJgIGFnYWluc3QgaW5mbGF0aW9uLg0KDQpUaGUgc3RhbmRhcmQgZGV2aWF0aW9uIG9mIGByIHNkX3ZhbHVlYCUgYHIgaWYoc2RfdmFsdWUgPiAyMCkgImluZGljYXRlcyBleHRyZW1lIHZvbGF0aWxpdHksIHJlZmxlY3Rpbmcgc3Vic3RhbnRpYWwgZmx1Y3R1YXRpb25zIGluIGVxdWl0eSBtYXJrZXRzIiBlbHNlIGlmKHNkX3ZhbHVlID4gMTUpICJ1bmRlcnNjb3JlcyBzaWduaWZpY2FudCB2b2xhdGlsaXR5LCBhIGNvbW1vbiBmZWF0dXJlIG9mIGVxdWl0eSBtYXJrZXRzIiBlbHNlICJzdWdnZXN0cyBtb2RlcmF0ZSB2b2xhdGlsaXR5LCB0eXBpY2FsIG9mIHJlbGF0aXZlbHkgc3RhYmxlIG1hcmtldHMiYC4gVGhlIGByIHJhbmdlX3JhdGlvIDwtIChtYXhfdmFsdWUgLSBtaW5fdmFsdWUpIC8gc2RfdmFsdWU7IGlmKHJhbmdlX3JhdGlvID4gNSkgImhpZ2hseSB2b2xhdGlsZSIgZWxzZSBpZihyYW5nZV9yYXRpbyA+IDMpICJub3RhYmxlIiBlbHNlICJjb21wYXJhdGl2ZWx5IHN0YWJsZSJgIHJhbmdlIG9mIGFubnVhbCByZXR1cm5zLCBzcGFubmluZyBmcm9tIGByIG1pbl92YWx1ZWAlIHRvIGByIG1heF92YWx1ZWAlLCBgciBpZihyYW5nZV9yYXRpbyA+IDUpICJpbGx1c3RyYXRlcyBhIGhpZ2hseSB2b2xhdGlsZSBtYXJrZXQgZW52aXJvbm1lbnQsIHBhcnRseSBkdWUgdG8gaXRzIGNvbXBvc2l0aW9uLCB3aXRoIHRoZSBwb3RlbnRpYWwgZm9yIGJvdGggZXh0cmVtZSBnYWlucyBhbmQgbG9zc2VzIiBlbHNlIGlmKHJhbmdlX3JhdGlvID4gMykgImhpZ2hsaWdodHMgbm90YWJsZSBtYXJrZXQgdmFyaWFiaWxpdHksIHBhcnRseSBkdWUgdG8gaXRzIGNvbXBvc2l0aW9uLCAgcmVmbGVjdGluZyBib3RoIG9wcG9ydHVuaXRpZXMgYW5kIHJpc2tzIiBlbHNlICJpbmRpY2F0ZXMgYSBjb21wYXJhdGl2ZWx5IHN0YWJsZSBtYXJrZXQsIHBhcnRseSBkdWUgdG8gaXRzIGNvbXBvc2l0aW9uLCB3aXRoIGxlc3MgZXh0cmVtZSBhbm51YWwgZmx1Y3R1YXRpb25zImAuIA0KDQpGb3IgTUVUQSB0byBiZSBjb25zaWRlcmVkIGEgaGlnaC1wZXJmb3JtaW5nIGFuZCByZXNpbGllbnQgbG9uZy10ZXJtIGludmVzdG1lbnQsIGl0IHdvdWxkIGJlIGlkZWFsIHRvIGV4Y2VlZCB0aGUgYWdncmVzc2l2ZSB0YXJnZXQgIChlLmcuLCBgciAodGFyZ2V0X2FnZ3Jlc3NpdmUgLSB0YXJnZXRfaW5mbGF0aW9uKWAlIGFubnVhbGl6ZWQgcmV0dXJucywgYWNjb3VudGluZyBmb3IgaGlnaGVyIGluZmxhdGlvbi1hZGp1c3RlZCBwZXJmb3JtYW5jZSBleHBlY3RhdGlvbnMpIGluIGF0IGxlYXN0IDQwJS01MCUgb2YgdGhlIHllYXJzLiBUaGlzIHJhbmdlIHJlZmxlY3RzIHRoZSBwb3RlbnRpYWwgZm9yIHN0cm9uZyB1cHNpZGUgaW4gbWFueSB5ZWFycyB3aGlsZSBiYWxhbmNpbmcgdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBtYXJrZXRzIGRvIGV4cGVyaWVuY2UgZG93bnR1cm5zLiBUaGUgZmFjdCB0aGF0IGByIHBlcmNlbnRfYWJvdmVfdGFyZ2V0X2FnZ3Jlc3NpdmVgJSBvZiB0aGUgeWVhcnMgZXhjZWVkZWQgdGhlIGFnZ3Jlc3NpdmUgdGFyZ2V0IGByIGlmKHBlcmNlbnRfYWJvdmVfdGFyZ2V0X2FnZ3Jlc3NpdmUgPiA1MCkgImluZGljYXRlcyBjb25zaXN0ZW50IGFuZCByb2J1c3QgZ3Jvd3RoLCBtYWtpbmcgTUVUQSBhIHN0cm9uZyBvcHRpb24gZm9yIHRob3NlIHNlZWtpbmcgYWdncmVzc2l2ZSBpbnZlc3RtZW50cy4iIGVsc2UgaWYocGVyY2VudF9hYm92ZV90YXJnZXRfYWdncmVzc2l2ZSA+IDQwKSAic3VnZ2VzdHMgdGhhdCB3aGlsZSBub3QgY29uc2lzdGVudCwgTUVUQSBoYXMgaGlzdG9yaWNhbGx5IHByb3ZpZGVkIHJvYnVzdCBncm93dGggb3ZlciB0aGUgbG9uZyB0ZXJtLCBtYWtpbmcgaXQgYSB2aWFibGUgaW52ZXN0bWVudCBmb3IgdGhvc2Ugd2l0aCBhIGhpZ2hlciByaXNrIHRvbGVyYW5jZS4iIGVsc2UgInJhaXNlcyBjb25jZXJucyBhYm91dCBNRVRBJ3MgYWJpbGl0eSB0byBtZWV0IGFnZ3Jlc3NpdmUgZ3Jvd3RoIHRhcmdldHMsIG1ha2luZyBpdCBsZXNzIHN1aXRhYmxlIGZvciBpbnZlc3RvcnMgd2l0aCBoaWdoZXIgcmlzayB0b2xlcmFuY2UuImANCg0KIyMjIEdyYXBoDQoNCmBgYHtyIG1ldGFfcmF3X2dyYXBoLCBmaWcud2lkdGg9MTAsIGZpZy5oZWlnaHQ9NywgZXZhbD1UUlVFLCBlY2hvPUZBTFNFfQ0KDQojIExvYWQgbmVjZXNzYXJ5IGxpYnJhcmllcw0KbGlicmFyeShnZ3Bsb3QyKQ0KbGlicmFyeShkcGx5cikNCg0KIyBDb252ZXJ0IGAxLVllYXIgQ0FHUmAgdG8gbnVtZXJpYyBmb3IgcGxvdHRpbmcNCm1ldGFfcmF3IDwtIG1ldGFfcmF3ICU+JQ0KICBtdXRhdGUoDQogICAgYERhdGVgID0gYXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIoYERhdGVgKSksICAjIEVuc3VyZSBEYXRlIGlzIG51bWVyaWMNCiAgICBgMS1ZZWFyIENBR1JgID0gYXMubnVtZXJpYyhnc3ViKCIlIiwgIiIsIGAxLVllYXIgQ0FHUmApKQ0KICApDQoNCiMgRmluZCB0aGUgbWluaW11bSBhbmQgbWF4aW11bSB4LXZhbHVlIGluIHlvdXIgZGF0YQ0KbWF4X3ggPC0gbWF4KGFzLmludGVnZXIobWV0YV9yYXckRGF0ZSksIG5hLnJtID0gVFJVRSkNCm1pbl94IDwtIG1pbihhcy5pbnRlZ2VyKG1ldGFfcmF3JERhdGUpLCBuYS5ybSA9IFRSVUUpDQppbnRlcmFjdGl2ZV9wcmludChtYXhfeCkgICMgVGVzdA0KaW50ZXJhY3RpdmVfcHJpbnQobWluX3gpICAjIFRlc3QNCg0KIyBGaW5kIHRoZSBtaW5pbXVtIGFuZCBtYXhpbXVtIHllYXINCm1pbl95ZWFyIDwtIG1pbihtZXRhX3JhdyREYXRlLCBuYS5ybSA9IFRSVUUpDQptYXhfeWVhciA8LSBtYXgobWV0YV9yYXckRGF0ZSwgbmEucm0gPSBUUlVFKQ0KaW50ZXJhY3RpdmVfcHJpbnQobWluX3llYXIpDQppbnRlcmFjdGl2ZV9wcmludChtYXhfeWVhcikNCg0KDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KIyMgUExPVCBGVUxMIFdJVEhPVVQgTElNSVRTDQoNCiMgRGVmaW5lIHN0YXJ0IGFuZCBlbmQgeWVhcnMNCnN0YXJ0X3llYXIgPC0gYXMubnVtZXJpYyhtaW5feWVhcikNCmVuZF95ZWFyIDwtIDIwMjQNCnllYXJfcmFuZ2UgPC0gZW5kX3llYXIgLSBzdGFydF95ZWFyICsgMSAgIyBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiB5ZWFycw0KDQojIERlZmluZSBicmVha3Mgcm91bmRlZCBhcHByb3ByaWF0ZWx5DQpsaW1pdHNfc3RhcnRfeWVhciA8LSBmbG9vcihzdGFydF95ZWFyIC8gNSkgKiA1ICAjIFJvdW5kIGRvd24gdG8gdGhlIG5lYXJlc3QgbXVsdGlwbGUgb2YgNQ0KbGltaXRzX2VuZF95ZWFyIDwtIGNlaWxpbmcoZW5kX3llYXIgLyA1KSAqIDUgICAjIFJvdW5kIHVwIHRvIHRoZSBuZWFyZXN0IG11bHRpcGxlIG9mIDUNCg0KIyBDcmVhdGUgZHluYW1pYyB0aXRsZSBhbmQgY2FwdGlvbg0KZHluYW1pY190aXRsZSA8LSBwYXN0ZTAoIkFubnVhbCBHcm93dGggUmF0ZXMgT3ZlciAiLHllYXJfcmFuZ2UsICIgWWVhcnMgKCIsIHN0YXJ0X3llYXIsICItIiwgZW5kX3llYXIsICIpIikNCmR5bmFtaWNfY2FwdGlvbiA8LSBwYXN0ZTAoIk1FVEEgQW5udWFsIEdyb3d0aCBSYXRlcywgRGF0YSBQZXJpb2QgKCIsIG1pbl95ZWFyLCAi4oCTIiwgbWF4X3llYXIsICIpIikNCg0KIyBDcmVhdGUgdGhlIGZ1bGwsIG5vbi1maWx0ZXJlZCB4LWF4aXMgcGxvdCB3aXRoIGR5bmFtaWMgeCBwbGFjZW1lbnQgZm9yIGFubm90YXRpb25zDQpwMSA8LSBnZ3Bsb3QobWV0YV9yYXcsIGFlcyh4ID0gYXMuaW50ZWdlcihEYXRlKSwgeSA9IGAxLVllYXIgQ0FHUmApKSArDQogIA0KICAjIEFkZCBzaGFkZWQgYXJlYXMgZm9yIGJhY2tncm91bmQgZWZmZWN0DQogIGdlb21fcmVjdChhZXMoeG1pbiA9IC1JbmYsIHhtYXggPSBJbmYsIHltaW4gPSB0YXJnZXRfYWdncmVzc2l2ZSwgeW1heCA9IEluZiksIGZpbGwgPSAibGlnaHRncmVlbiIsIGFscGhhID0gMC4wMjUpICsNCiAgZ2VvbV9yZWN0KGFlcyh4bWluID0gLUluZiwgeG1heCA9IEluZiwgeW1pbiA9IHRhcmdldF9jb25zZXJ2YXRpdmUsIHltYXggPSB0YXJnZXRfYWdncmVzc2l2ZSksIGZpbGwgPSAib3JhbmdlIiwgYWxwaGEgPSAwLjAyNSkgKw0KICBnZW9tX3JlY3QoYWVzKHhtaW4gPSAtSW5mLCB4bWF4ID0gSW5mLCB5bWluID0gLUluZiwgeW1heCA9IHRhcmdldF9jb25zZXJ2YXRpdmUpLCBmaWxsID0gImxpZ2h0Y29yYWwiLCBhbHBoYSA9IDAuMDI1KSArDQogIA0KICAjIFBsb3QgbGluZXMsIHBvaW50cywgYW5kIGFubm90YXRpb25zIG9uIHRvcCBvZiBzaGFkZWQgYXJlYXMNCiAgZ2VvbV9saW5lKGNvbG9yID0gIiM0QjAwODIiLCBzaXplID0gMS4wKSArICAgICAgICMgRGFyayBwdXJwbGUgbGluZSANCiAgZ2VvbV9wb2ludChjb2xvciA9ICIjNEIwMDgyIiwgc2l6ZSA9IDEuNSkgKyAgICAgICAgIyBEYXJrIHB1cnBsZSBwb2ludHMgDQogIA0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSB0YXJnZXRfYWdncmVzc2l2ZSwgY29sb3IgPSAiZGFya2JsdWUiLCBsaW5ldHlwZSA9ICJzb2xpZCIpICsNCiAgIyBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSB0YXJnZXRfbW9kZXJhdGUsIGNvbG9yID0gImRhcmtibHVlIiwgbGluZXR5cGUgPSAic29saWQiKSArDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IHRhcmdldF9jb25zZXJ2YXRpdmUsIGNvbG9yID0gImRhcmtibHVlIiwgbGluZXR5cGUgPSAic29saWQiKSArDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IHRhcmdldF9pbmZsYXRpb24sIGNvbG9yID0gImRhcmtyZWQiLCBsaW5ldHlwZSA9ICJkYXNoZWQiKSArDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IGNhZ3JfdmFsdWUsIGNvbG9yID0gImRhcmtyZWQiLCBsaW5ldHlwZSA9ICJkYXNoZWQiKSArDQogIA0KICAjIER5bmFtaWMgcmlnaHQtYWxpZ25lZCBwbGFjZW1lbnQgZm9yIGFubm90YXRpb25zDQogIGFubm90YXRlKCJ0ZXh0IiwgeCA9IEluZiwgeSA9IHRhcmdldF9hZ2dyZXNzaXZlLCBsYWJlbCA9ICJBZ2dyZXNzaXZlIiwgDQogICAgICAgICAgIGhqdXN0ID0gMSwgdmp1c3QgPSAtMC41MCwgY29sb3IgPSAiZGFya2JsdWUiLCBzaXplID0gNCkgKw0KICAjIGFubm90YXRlKCJ0ZXh0IiwgeCA9IEluZiwgeSA9IHRhcmdldF9tb2RlcmF0ZSwgbGFiZWwgPSAiTW9kZXJhdGUiLCANCiAgIyAgICAgICAgIGhqdXN0ID0gMSwgdmp1c3QgPSAtMC41MCwgY29sb3IgPSAiZGFya2JsdWUiLCBzaXplID0gNCkgKw0KICBhbm5vdGF0ZSgidGV4dCIsIHggPSBJbmYsIHkgPSB0YXJnZXRfY29uc2VydmF0aXZlLCBsYWJlbCA9ICJDb25zZXJ2YXRpdmUiLCANCiAgICAgICAgICAgaGp1c3QgPSAxLCB2anVzdCA9IC0wLjUwLCBjb2xvciA9ICJkYXJrYmx1ZSIsIHNpemUgPSA0KSArDQogIGFubm90YXRlKCJ0ZXh0IiwgeCA9IEluZiwgeSA9IHRhcmdldF9pbmZsYXRpb24sIGxhYmVsID0gIkluZmxhdGlvbiIsIA0KICAgICAgICAgICBoanVzdCA9IDEsIHZqdXN0ID0gKzEuMTAsIGNvbG9yID0gImRhcmtyZWQiLCBzaXplID0gNCkgKw0KICBhbm5vdGF0ZSgidGV4dCIsIHggPSBJbmYsIHkgPSBjYWdyX3ZhbHVlLCBsYWJlbCA9ICJDQUdSIiwgDQogICAgICAgICAgIGhqdXN0ID0gMSwgdmp1c3QgPSAtMC41MCwgY29sb3IgPSAiZGFya3JlZCIsIHNpemUgPSA0KSArIA0KDQogIGxhYnMoDQogICAgdGl0bGUgPSBkeW5hbWljX3RpdGxlLA0KICAgIHggPSAiWWVhciIsDQogICAgeSA9ICJHcm93dGggUmF0ZSAoJSkiLA0KICAgIGNhcHRpb24gPSBkeW5hbWljX2NhcHRpb24NCiAgKSArDQoNCiAgc2NhbGVfeF9jb250aW51b3VzKA0KICAgIGxpbWl0cyA9IGMoc3RhcnRfeWVhciwgZW5kX3llYXIgKyAxKSwgIyBSZXN0cmljdHMgeC1heGlzIGRhdGEgDQogICAgYnJlYWtzID0gc2VxKGxpbWl0c19zdGFydF95ZWFyLCBsaW1pdHNfZW5kX3llYXIsIDIpICMgU2V0cyBNYWpvciB4LWF4aXMgIA0KICApICsgICMgUmVzdHJpY3QgJiBTZXQgTWFqb3IgeC1heGlzIGxpbmVzIA0KICAgIA0KICB0aGVtZV9taW5pbWFsKCkgKw0KICB0aGVtZSgNCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41LCBzaXplID0gMjApLCAgICAgICAgICMgTGFyZ2VyIHRpdGxlIGZvbnQNCiAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0KSwgICAgICAgICAgICAgICAgICAgICMgTGFyZ2VyIHgtYXhpcyBsYWJlbCBmb250DQogICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCksICAgICAgICAgICAgICAgICAgICAjIExhcmdlciB5LWF4aXMgbGFiZWwgZm9udA0KICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSwgc2l6ZSA9IDE0KSwgICMgTGFyZ2VyIHgtYXhpcyB0ZXh0DQogICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0KSwgICAgICAgICAgICAgICAgICAgICAjIExhcmdlciB5LWF4aXMgdGV4dA0KICAgIHBhbmVsLmdyaWQubWFqb3IgPSBlbGVtZW50X2xpbmUobGluZXR5cGUgPSAiZG90dGVkIiwgY29sb3IgPSAiYmxhY2siKSwgICAgICAgICAjIE1ham9yIGdyaWQgbGluZXMNCiAgICBwYW5lbC5ncmlkLm1pbm9yLnggPSBlbGVtZW50X2JsYW5rKCksICMgZWxlbWVudF9saW5lKGNvbG9yID0gImdyZXk4MCIpICAjIE1pbm9yIHggZ3JpZCBsaW5lcyBmb3IgZWFjaCB5ZWFyDQogICAgIyBwYW5lbC5ib3JkZXIgPSBlbGVtZW50X3JlY3QoY29sb3IgPSAiZGFya2dyZXkiLCBmaWxsID0gTkEsIHNpemUgPSAxLjApICAjIERhcmsgYm9yZGVyIGFyb3VuZCB0aGUgcGxvdA0KICAgIGF4aXMudGlja3MubGVuZ3RoID0gdW5pdCgtMC4yNSwgImNtIiksICAgICAgICAgICAgICAgICAgICAgICMgSW5jcmVhc2UgdGljayBsZW5ndGgNCiAgICBheGlzLnRpY2tzID0gZWxlbWVudF9saW5lKGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDAuNTApLCAjIERhcmtlciB0aWNrcw0KICAgIGF4aXMubGluZS54ID0gZWxlbWVudF9saW5lKGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDAuNzUpLCAgIyBEYXJrIGJvdHRvbSBib3JkZXINCiAgICBheGlzLmxpbmUueSA9IGVsZW1lbnRfbGluZShjb2xvciA9ICJibGFjayIsIHNpemUgPSAwLjc1KSAgICMgRGFyayBsZWZ0IGJvcmRlcg0KICApDQoNCnByaW50KHAxKQ0KDQoNCmBgYA0KDQoNCiMjIE1FVEEgQ0FHUg0KDQojIyMgRGF0YQ0KDQpgYGB7ciBtZXRhX3Jhd19nciwgZXZhbD1UUlVFLCBlY2hvPUZBTFNFfQ0KDQojIFZpZXcobnJ0JG1ldGFfcmF3X2dyKQ0KaW50ZXJhY3RpdmVfc3RyKG5ydCRtZXRhX3Jhd19ncikNCg0KbGlicmFyeShkcGx5cikNCmxpYnJhcnkobHVicmlkYXRlKSAgIyBGb3IgZGF0ZSBtYW5pcHVsYXRpb24NCmxpYnJhcnkoc2NhbGVzKQ0KbGlicmFyeShzdHJpbmdyKQ0KDQojIFVwZGF0ZSBkYXRhIGZyYW1lIHdpdGggcHJvcGVyIGRhdGUgYW5kIHBlcmNlbnRhZ2UgaGFuZGxpbmcNCm1ldGFfcmF3X2dyIDwtIG5ydCRtZXRhX3Jhd19nciAlPiUNCiAgbXV0YXRlKA0KICAgICMgQ29udmVydCBDbG9zZSBEYXRlIHRvICJZWVlZLU1NLUREIiBmb3JtYXQNCiAgICBgRGF0ZWAgPSBmb3JtYXQoYXMuRGF0ZShhcy5jaGFyYWN0ZXIoYERhdGVgKSwgb3JpZ2luID0gIjE5NzAtMDEtMDEiKSwgIiVZLSVtLSVkIiksDQogICAgDQogICAgIyBFbnN1cmUgQ2xvc2UgaXMgYSBudW1iZXIgZm9ybWF0dGVkIHRvIDIgZGVjaW1hbCBwbGFjZXMNCiAgICBgQ2xvc2VgID0gbnVtYmVyKGFzLm51bWVyaWMoZ3N1YigiLCIsICIiLCBDbG9zZSkpLCBiaWcubWFyayA9ICIsIiwgZGVjaW1hbC5tYXJrID0gIi4iLCBhY2N1cmFjeSA9IDAuMDEpLA0KDQogICAgIyBDbGVhbiBhbmQgaGFuZGxlIHBlcmNlbnRhZ2UgY29sdW1ucw0KICAgIGFjcm9zcygzOjExLCB+IHsNCiAgICAgIHZhbHVlIDwtIGdzdWIoIlssJVxcc10iLCAiIiwgLikgICMgUmVtb3ZlICUsIGNvbW1hcywgYW5kIHNwYWNlcw0KICAgICAgbnVtZXJpY192YWx1ZSA8LSBzdXBwcmVzc1dhcm5pbmdzKGFzLm51bWVyaWModmFsdWUpKSAgIyBDb252ZXJ0IHRvIG51bWVyaWMNCiAgICAgIGlmZWxzZSgNCiAgICAgICAgIWlzLm5hKG51bWVyaWNfdmFsdWUpLCANCiAgICAgICAgcGFzdGUwKGZvcm1hdChyb3VuZChudW1lcmljX3ZhbHVlKjEwMCwgMiksIGJpZy5tYXJrID0gIiwiLCBzY2llbnRpZmljID0gRkFMU0UpLCAiJSIpLCAgIyBGb3JtYXQgdG8gMiBkZWNpbWFsIHBsYWNlcyBhbmQgYWRkIGNvbW1hcw0KICAgICAgICAuDQogICAgICApDQogICAgfSkNCiAgKSAlPiUNCiAgYXJyYW5nZShkZXNjKGBEYXRlYCkpICAjIFNvcnQgYnkgRGF0ZSBmcm9tIG5ld2VzdCB0byBvbGRlc3QNCg0KIyBDcmVhdGUgbWV0YV9yYXdfZ3I6IENHUg0KbWV0YV9yYXdfY2dyIDwtIG1ldGFfcmF3X2dyICU+JQ0KICBzZWxlY3QoYERhdGVgLCBgQ2xvc2VgLCBgMS1ZZWFyIENBR1JgLCBjb250YWlucyAoIkNHUiIpKQ0KDQojIENyZWF0ZSBtZXRhX3Jhd19ncjogQ0FHUg0KbWV0YV9yYXdfY2FnciA8LSBtZXRhX3Jhd19nciAlPiUNCiAgc2VsZWN0KGBEYXRlYCwgYENsb3NlYCwgY29udGFpbnMgKCJDQUdSIikpDQoNCiMgRGlzcGxheSBib3RoIHRhYmxlcyBmb3IgY29uZmlybWF0aW9uDQppbnRlcmFjdGl2ZV9wcmludChtZXRhX3Jhd19jZ3IpDQppbnRlcmFjdGl2ZV9wcmludChtZXRhX3Jhd19jYWdyKQ0KDQojIE9wdGlvbmFsOiBQcmludCB0YWJsZSBzdW1tYXJpZXMNCmludGVyYWN0aXZlX3N0cihtZXRhX3Jhd19jZ3IpDQppbnRlcmFjdGl2ZV9zdHIobWV0YV9yYXdfY2FncikNCg0KIyBEaXNwbGF5IGNhcHRpb25zIGZvciBlYWNoIHRhYmxlDQojIGNhdCgiXG5cbiMjIyMgQ3VtdWxhdGl2ZSBHcm93dGggUmF0ZXMgKCIsIG1pbl95ZWFyLCAiLSIsIG1heF95ZWFyLCAiKVxuIiwgc2VwID0gIiIpDQojIGZvcm1hdF9lcXVhbF93aWR0aChtZXRhX3Jhd19jZ3IpDQoNCmNhdCgiXG5cbiMjIyMgQ29tcG91bmQgQXZlcmFnZSBHcm93dGggUmF0ZXMgKCIsIG1pbl95ZWFyLCAiLSIsIG1heF95ZWFyLCAiKVxuIiwgc2VwID0gIiIpDQpmb3JtYXRfZXF1YWxfd2lkdGgobWV0YV9yYXdfY2FncikNCg0KIyBWaWV3KG1ldGFfcmF3X2NhZ3IpDQojIGNvbG5hbWVzKG1ldGFfcmF3X2NhZ3IpDQppbnRlcmFjdGl2ZV9zdHIobWV0YV9yYXdfY2FncikNCg0KDQpgYGANCg0KIyMjIFN1bW1hcnkNCg0KYGBge3IgbWV0YV9yYXdfY2Fncl9zdW1tYXJ5LCBldmFsPVRSVUUsIGVjaG89RkFMU0V9DQoNCmludGVyYWN0aXZlX3N0cihtZXRhX3Jhd19jYWdyKQ0KDQojIExvYWQgbmVjZXNzYXJ5IGxpYnJhcmllcw0KbGlicmFyeShkcGx5cikNCmxpYnJhcnkodGliYmxlKQ0KDQojIERlZmluZSBhIGhlbHBlciBmdW5jdGlvbiB0byBjbGVhbiBhbmQgY29udmVydCBwZXJjZW50YWdlcw0KY2xlYW5fcGVyY2VudGFnZSA8LSBmdW5jdGlvbihjb2x1bW4pIHsNCiAgYXMubnVtZXJpYyhnc3ViKCIlIiwgIiIsIGNvbHVtbikpDQp9DQoNCiMgRGVmaW5lIHRoZSBzdGF0aXN0aWMgbmFtZXMgZm9yIHRoZSBzdW1tYXJ5IHRhYmxlDQpzdGF0aXN0aWNfbmFtZXMgPC0gYygNCiAgIkNvdW50IG9mIE9ic2VydmF0aW9ucyIsIA0KICAiTWVhbiIsIA0KICAiTWVkaWFuIiwNCiAgIlN0YW5kYXJkIERldmlhdGlvbiAoVm9sYXRpbGl0eSkiLCANCiAgIk1pbiBDQUdSIFJhbmdlIChDQUdSIC0gU0QpIiwNCiAgIk1heCBDQUdSIFJhbmdlIChDQUdSICsgU0QpIiwNCiAgIk1pbmltdW0iLCANCiAgIk1heGltdW0iLCANCiAgIlBlcmNlbnQgQWJvdmUgSW5mbGF0aW9uIFRhcmdldCIsIA0KICAiUGVyY2VudCBBYm92ZSBDb25zZXJ2YXRpdmUgVGFyZ2V0IiwgDQogICJQZXJjZW50IEFib3ZlIE1vZGVyYXRlIFRhcmdldCIsIA0KICAiUGVyY2VudCBBYm92ZSBBZ2dyZXNzaXZlIFRhcmdldCINCikNCg0KIyBBZGp1c3QgdGhlIGZpcnN0IHJvdydzIERhdGUgYW5kIGNsZWFuIHVwIENBR1IgY29sdW1ucw0KbWV0YV9yYXdfY2FnciA8LSBtZXRhX3Jhd19jYWdyICU+JQ0KICBzbGljZSgtMSkgJT4lICMgUmVtb3ZlIHRoZSBmaXJzdCByb3cNCiAgbXV0YXRlKA0KICAgICMgRGF0ZSA9IGlmZWxzZShyb3dfbnVtYmVyKCkgPT0gMSwgIjIwMjUtMDEtMDEiLCBEYXRlKSwNCiAgICBEYXRlID0gYXMubnVtZXJpYyhmb3JtYXQoYXMuRGF0ZShEYXRlKSwgIiVZIikpLA0KICAgIGAxLVllYXIgQ0FHUmAgPSBjbGVhbl9wZXJjZW50YWdlKGAxLVllYXIgQ0FHUmApLA0KICAgIGA1LVllYXIgQ0FHUmAgPSBjbGVhbl9wZXJjZW50YWdlKGA1LVllYXIgQ0FHUmApLA0KICAgIGAxMC1ZZWFyIENBR1JgID0gY2xlYW5fcGVyY2VudGFnZShgMTAtWWVhciBDQUdSYCksDQogICAgYDIwLVllYXIgQ0FHUmAgPSBjbGVhbl9wZXJjZW50YWdlKGAyMC1ZZWFyIENBR1JgKSwNCiAgICBgMzAtWWVhciBDQUdSYCA9IGNsZWFuX3BlcmNlbnRhZ2UoYDMwLVllYXIgQ0FHUmApDQogICkNCg0KIyBGdW5jdGlvbiB0byBjYWxjdWxhdGUgc3RhdGlzdGljcyBmb3IgYSBnaXZlbiBkYXRhc2V0DQpjYWxjX3N0YXRzIDwtIGZ1bmN0aW9uKGRhdGEpIHsNCiAgaWYgKHN1bSghaXMubmEoZGF0YSkpIDwgMikgcmV0dXJuKHJlcChOQSwgbGVuZ3RoKHN0YXRpc3RpY19uYW1lcykpKSAgIyBIYW5kbGUgaW5zdWZmaWNpZW50IGRhdGENCg0KICBjb3VudF9vYnNlcnZhdGlvbnMgPC0gc3VtKCFpcy5uYShkYXRhKSkNCiAgbWVhbl92YWx1ZSA8LSByb3VuZChtZWFuKGRhdGEsIG5hLnJtID0gVFJVRSksIDIpDQogIG1lZGlhbl92YWx1ZSA8LSByb3VuZChtZWRpYW4oZGF0YSwgbmEucm0gPSBUUlVFKSwgMikNCiAgc2RfdmFsdWUgPC0gcm91bmQoc2QoZGF0YSwgbmEucm0gPSBUUlVFKSwgMikNCiAgbWluX2NhZ3JfcmFuZ2UgPC0gcm91bmQoY2Fncl92YWx1ZSAtIHNkX3ZhbHVlLCAyKQ0KICBtYXhfY2Fncl9yYW5nZSA8LSByb3VuZChjYWdyX3ZhbHVlICsgc2RfdmFsdWUsIDIpDQogIG1pbl92YWx1ZSA8LSByb3VuZChtaW4oZGF0YSwgbmEucm0gPSBUUlVFKSwgMikNCiAgbWF4X3ZhbHVlIDwtIHJvdW5kKG1heChkYXRhLCBuYS5ybSA9IFRSVUUpLCAyKQ0KICANCiAgIyBEZWZpbmUgaW5mbGF0aW9uIGFuZCBncm93dGggdGFyZ2V0cw0KICB0YXJnZXRfaW5mbGF0aW9uIDwtIDIgICMgRXhhbXBsZSB0YXJnZXQgZm9yIGluZmxhdGlvbg0KICB0YXJnZXRfY29uc2VydmF0aXZlIDwtIDMgKyB0YXJnZXRfaW5mbGF0aW9uDQogIHRhcmdldF9tb2RlcmF0ZSA8LSA1ICsgdGFyZ2V0X2luZmxhdGlvbg0KICB0YXJnZXRfYWdncmVzc2l2ZSA8LSAxMCArIHRhcmdldF9pbmZsYXRpb24NCiAgDQogIGFib3ZlX3RhcmdldF9pbmZsYXRpb24gPC0gc3VtKGRhdGEgPj0gdGFyZ2V0X2luZmxhdGlvbiwgbmEucm0gPSBUUlVFKQ0KICBhYm92ZV90YXJnZXRfY29uc2VydmF0aXZlIDwtIHN1bShkYXRhID49IHRhcmdldF9jb25zZXJ2YXRpdmUsIG5hLnJtID0gVFJVRSkNCiAgYWJvdmVfdGFyZ2V0X21vZGVyYXRlIDwtIHN1bShkYXRhID49IHRhcmdldF9tb2RlcmF0ZSwgbmEucm0gPSBUUlVFKQ0KICBhYm92ZV90YXJnZXRfYWdncmVzc2l2ZSA8LSBzdW0oZGF0YSA+PSB0YXJnZXRfYWdncmVzc2l2ZSwgbmEucm0gPSBUUlVFKQ0KICANCiAgcGVyY2VudF9hYm92ZV90YXJnZXRfY29uc2VydmF0aXZlIDwtIHJvdW5kKChhYm92ZV90YXJnZXRfY29uc2VydmF0aXZlIC8gY291bnRfb2JzZXJ2YXRpb25zKSAqIDEwMCwgMikNCiAgcGVyY2VudF9hYm92ZV90YXJnZXRfaW5mbGF0aW9uIDwtIHJvdW5kKChhYm92ZV90YXJnZXRfaW5mbGF0aW9uIC8gY291bnRfb2JzZXJ2YXRpb25zKSAqIDEwMCwgMikNCiAgcGVyY2VudF9hYm92ZV90YXJnZXRfbW9kZXJhdGUgPC0gcm91bmQoKGFib3ZlX3RhcmdldF9tb2RlcmF0ZSAvIGNvdW50X29ic2VydmF0aW9ucykgKiAxMDAsIDIpDQogIHBlcmNlbnRfYWJvdmVfdGFyZ2V0X2FnZ3Jlc3NpdmUgPC0gcm91bmQoKGFib3ZlX3RhcmdldF9hZ2dyZXNzaXZlIC8gY291bnRfb2JzZXJ2YXRpb25zKSAqIDEwMCwgMikNCiAgDQogIGMoDQogICAgY291bnRfb2JzZXJ2YXRpb25zLCANCiAgICBwYXN0ZTAobWVhbl92YWx1ZSwgIiUiKSwNCiAgICBwYXN0ZTAobWVkaWFuX3ZhbHVlLCAiJSIpLA0KICAgIHBhc3RlMChzZF92YWx1ZSwgIiUiKSwNCiAgICBwYXN0ZTAobWluX2NhZ3JfcmFuZ2UsICIlIiksDQogICAgcGFzdGUwKG1heF9jYWdyX3JhbmdlLCAiJSIpLA0KICAgIHBhc3RlMChtaW5fdmFsdWUsICIlIiksDQogICAgcGFzdGUwKG1heF92YWx1ZSwgIiUiKSwNCiAgICBwYXN0ZTAocGVyY2VudF9hYm92ZV90YXJnZXRfaW5mbGF0aW9uLCAiJSIpLA0KICAgIHBhc3RlMChwZXJjZW50X2Fib3ZlX3RhcmdldF9jb25zZXJ2YXRpdmUsICIlIiksIA0KICAgIHBhc3RlMChwZXJjZW50X2Fib3ZlX3RhcmdldF9tb2RlcmF0ZSwgIiUiKSwgDQogICAgcGFzdGUwKHBlcmNlbnRfYWJvdmVfdGFyZ2V0X2FnZ3Jlc3NpdmUsICIlIikNCiAgKQ0KfQ0KDQojIENvbHVtbnMgdG8gY2FsY3VsYXRlIENBR1Igc3RhdGlzdGljcw0KY2Fncl9jb2x1bW5zIDwtIGMoIjEtWWVhciBDQUdSIiwgIjUtWWVhciBDQUdSIiwgIjEwLVllYXIgQ0FHUiIsICIyMC1ZZWFyIENBR1IiLCAiMzAtWWVhciBDQUdSIikNCmV4aXN0aW5nX2NhZ3JfY29sdW1ucyA8LSBpbnRlcnNlY3QoY2Fncl9jb2x1bW5zLCBuYW1lcyhtZXRhX3Jhd19jYWdyKSkNCg0KIyBDYWxjdWxhdGUgc3RhdHMgZm9yIGVhY2ggQ0FHUiBjb2x1bW4NCmNhZ3Jfc3RhdHNfbGlzdCA8LSBsYXBwbHkobWV0YV9yYXdfY2FncltleGlzdGluZ19jYWdyX2NvbHVtbnNdLCBjYWxjX3N0YXRzKQ0KDQojIENvbXBpbGUgaW50byBhIHN1bW1hcnkgZGF0YSBmcmFtZQ0KbWV0YV9yYXdfY2Fncl9zdW1tYXJ5IDwtIGFzLmRhdGEuZnJhbWUoZG8uY2FsbChjYmluZCwgY2Fncl9zdGF0c19saXN0KSkNCnJvd25hbWVzKG1ldGFfcmF3X2NhZ3Jfc3VtbWFyeSkgPC0gc3RhdGlzdGljX25hbWVzDQoNCg0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiMjIFNBVkUgVkFMVUVTIEZPUiBJTi1MSU5FIENPREUNCg0KIyBEZWZpbmUgdGhlIG1hcHBpbmcgb2Ygcm93IG5hbWVzIHRvIHZhcmlhYmxlIG5hbWVzDQpyb3dfdG9fdmFyX25hbWUgPC0gYygNCiAgIkNvdW50IG9mIE9ic2VydmF0aW9ucyIgPSAiY291bnRfb2JzZXJ2YXRpb25zIiwNCiAgIk1lYW4iID0gIm1lYW5fdmFsdWUiLA0KICAiTWVkaWFuIiA9ICJtZWRpYW5fdmFsdWUiLA0KICAiU3RhbmRhcmQgRGV2aWF0aW9uIChWb2xhdGlsaXR5KSIgPSAic2RfdmFsdWUiLA0KICAiTWluIENBR1IgUmFuZ2UgKENBR1IgLSBTRCkiID0gIm1pbl9jYWdyX3JhbmdlIiwNCiAgIk1heCBDQUdSIFJhbmdlIChDQUdSICsgU0QpIiA9ICJtYXhfY2Fncl9yYW5nZSIsDQogICJNaW5pbXVtIiA9ICJtaW5fdmFsdWUiLA0KICAiTWF4aW11bSIgPSAibWF4X3ZhbHVlIiwNCiAgIlBlcmNlbnQgQWJvdmUgSW5mbGF0aW9uIFRhcmdldCIgPSAicGVyY2VudF9hYm92ZV90YXJnZXRfaW5mbGF0aW9uIiwNCiAgIlBlcmNlbnQgQWJvdmUgQ29uc2VydmF0aXZlIFRhcmdldCIgPSAicGVyY2VudF9hYm92ZV90YXJnZXRfY29uc2VydmF0aXZlIiwNCiAgIlBlcmNlbnQgQWJvdmUgTW9kZXJhdGUgVGFyZ2V0IiA9ICJwZXJjZW50X2Fib3ZlX3RhcmdldF9tb2RlcmF0ZSIsDQogICJQZXJjZW50IEFib3ZlIEFnZ3Jlc3NpdmUgVGFyZ2V0IiA9ICJwZXJjZW50X2Fib3ZlX3RhcmdldF9hZ2dyZXNzaXZlIg0KKQ0KDQojIEZ1bmN0aW9uIHRvIHNhdmUgc3VtbWFyeSB2YWx1ZXMgZHluYW1pY2FsbHkNCnNhdmVfY29sdW1uX3ZhbHVlcyA8LSBmdW5jdGlvbihzdW1tYXJ5X2RmKSB7DQogICMgRXhjbHVkZSB0aGUgIlN0YXRpc3RpYyIgYW5kICJPdmVyYWxsIiBjb2x1bW5zDQogIGNvbHVtbnNfdG9fc2F2ZSA8LSBzZXRkaWZmKG5hbWVzKHN1bW1hcnlfZGYpLCBjKCJTdGF0aXN0aWMiLCAiT3ZlcmFsbCIpKQ0KICANCiAgIyBJdGVyYXRlIG92ZXIgZWFjaCBjb2x1bW4NCiAgZm9yIChjb2wgaW4gY29sdW1uc190b19zYXZlKSB7DQogICAgIyBGb3JtYXQgY29sdW1uIG5hbWUgdG8gbG93ZXJjYXNlIGFuZCByZXBsYWNlIGludmFsaWQgY2hhcmFjdGVycw0KICAgIGNvbF9uYW1lIDwtIHRvbG93ZXIoZ3N1YigiW15hLXpBLVowLTldIiwgIl8iLCBjb2wpKQ0KICAgIA0KICAgICMgRXh0cmFjdCB2YWx1ZXMgZm9yIHRoZSBjdXJyZW50IGNvbHVtbg0KICAgIGNvbF92YWx1ZXMgPC0gc3VtbWFyeV9kZltbY29sXV0NCiAgICANCiAgICAjIFNhdmUgZWFjaCB2YWx1ZSBkeW5hbWljYWxseSB1c2luZyB0aGUgbWFwcGluZyBmb3Igcm93IG5hbWVzDQogICAgZm9yIChpIGluIHNlcV9hbG9uZyhjb2xfdmFsdWVzKSkgew0KICAgICAgIyBHZXQgdGhlIGNvcnJlc3BvbmRpbmcgdmFyaWFibGUgbmFtZSBmcm9tIHRoZSBtYXBwaW5nDQogICAgICBzdGF0X25hbWUgPC0gcm93X3RvX3Zhcl9uYW1lW3Jvd25hbWVzKHN1bW1hcnlfZGYpW2ldXQ0KICAgICAgDQogICAgICBpZiAoIWlzLm5hKHN0YXRfbmFtZSkpIHsgICMgU2tpcCBpZiBubyBtYXBwaW5nIGlzIGRlZmluZWQNCiAgICAgICAgIyBDcmVhdGUgdGhlIHZhcmlhYmxlIG5hbWUNCiAgICAgICAgdmFyX25hbWUgPC0gcGFzdGUwKHN0YXRfbmFtZSwgIl8iLCBjb2xfbmFtZSkNCiAgICAgICAgDQogICAgICAgICMgQXR0ZW1wdCBudW1lcmljIGNvbnZlcnNpb24gZm9yIGRvd25zdHJlYW0gdXNlDQogICAgICAgIHZhbHVlIDwtIHN1cHByZXNzV2FybmluZ3MoYXMubnVtZXJpYyhnc3ViKCIlIiwgIiIsIGNvbF92YWx1ZXNbaV0pKSkNCiAgICAgICAgDQogICAgICAgICMgQXNzaWduIHRoZSB2YWx1ZSB0byB0aGUgZ2xvYmFsIGVudmlyb25tZW50DQogICAgICAgIGFzc2lnbih2YXJfbmFtZSwgdmFsdWUsIGVudmlyID0gLkdsb2JhbEVudikNCiAgICAgIH0NCiAgICB9DQogIH0NCn0NCg0KIyBBcHBseSB0aGUgZnVuY3Rpb24gdG8gc2F2ZSB2YWx1ZXMgZm9yIGFsbCBjb2x1bW5zIGV4Y2VwdCAiT3ZlcmFsbCINCnNhdmVfY29sdW1uX3ZhbHVlcyhtZXRhX3Jhd19jYWdyX3N1bW1hcnkpDQoNCiMgRXhhbXBsZTogQWNjZXNzaW5nIGR5bmFtaWNhbGx5IGNyZWF0ZWQgdmFyaWFibGVzDQppbnRlcmFjdGl2ZV9wcmludChtZWFuX3ZhbHVlXzFfeWVhcl9jYWdyKSAgIyBTaG91bGQgcHJpbnQgdGhlIG1lYW4gdmFsdWUgZm9yIDEtWWVhciBDQUdSDQppbnRlcmFjdGl2ZV9wcmludChwZXJjZW50X2Fib3ZlX3RhcmdldF9pbmZsYXRpb25fNV95ZWFyX2NhZ3IpICAjIFNob3VsZCBwcmludCB0aGUgcGVyY2VudCBhYm92ZSBpbmZsYXRpb24gdGFyZ2V0IGZvciA1LVllYXIgQ0FHUg0KaW50ZXJhY3RpdmVfcHJpbnQoc2RfdmFsdWVfMTBfeWVhcl9jYWdyKSAgIyBTaG91bGQgcHJpbnQgdGhlIHN0YW5kYXJkIGRldmlhdGlvbiBmb3IgMTAtWWVhciBDQUdSDQoNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQojIyBPVkVSQUxMIFNUQVRJU1RJQ1MgDQpudW1lcmljX3ZhbHVlc19hbGwgPC0gYXMubnVtZXJpYyh1bmxpc3QobWV0YV9yYXdfY2FncltleGlzdGluZ19jYWdyX2NvbHVtbnNdLCB1c2UubmFtZXMgPSBGQUxTRSkpDQpudW1lcmljX3ZhbHVlc19hbGwgPC0gbnVtZXJpY192YWx1ZXNfYWxsWyFpcy5uYShudW1lcmljX3ZhbHVlc19hbGwpXQ0KDQpvdmVyYWxsX2NvdW50X29ic2VydmF0aW9ucyA8LSBsZW5ndGgobnVtZXJpY192YWx1ZXNfYWxsKQ0Kb3ZlcmFsbF9tZWFuX3ZhbHVlIDwtIHJvdW5kKG1lYW4obnVtZXJpY192YWx1ZXNfYWxsKSwgMikNCm92ZXJhbGxfbWVkaWFuX3ZhbHVlIDwtIHJvdW5kKG1lZGlhbihudW1lcmljX3ZhbHVlc19hbGwpLCAyKQ0Kb3ZlcmFsbF9zZF92YWx1ZSA8LSByb3VuZChzZChudW1lcmljX3ZhbHVlc19hbGwpLCAyKQ0Kb3ZlcmFsbF9taW5fY2Fncl9yYW5nZSA8LSByb3VuZChjYWdyX3ZhbHVlIC0gb3ZlcmFsbF9zZF92YWx1ZSwgMikNCm92ZXJhbGxfbWF4X2NhZ3JfcmFuZ2UgPC0gcm91bmQoY2Fncl92YWx1ZSArIG92ZXJhbGxfc2RfdmFsdWUsIDIpDQpvdmVyYWxsX21pbl92YWx1ZSA8LSByb3VuZChtaW4obnVtZXJpY192YWx1ZXNfYWxsKSwgMikNCm92ZXJhbGxfbWF4X3ZhbHVlIDwtIHJvdW5kKG1heChudW1lcmljX3ZhbHVlc19hbGwpLCAyKQ0KDQpvdmVyYWxsX2Fib3ZlX3RhcmdldF9pbmZsYXRpb24gPC0gc3VtKG51bWVyaWNfdmFsdWVzX2FsbCA+PSB0YXJnZXRfaW5mbGF0aW9uLCBuYS5ybSA9IFRSVUUpDQpvdmVyYWxsX2Fib3ZlX3RhcmdldF9jb25zZXJ2YXRpdmUgPC0gc3VtKG51bWVyaWNfdmFsdWVzX2FsbCA+PSB0YXJnZXRfY29uc2VydmF0aXZlLCBuYS5ybSA9IFRSVUUpDQpvdmVyYWxsX2Fib3ZlX3RhcmdldF9tb2RlcmF0ZSA8LSBzdW0obnVtZXJpY192YWx1ZXNfYWxsID49IHRhcmdldF9tb2RlcmF0ZSwgbmEucm0gPSBUUlVFKQ0Kb3ZlcmFsbF9hYm92ZV90YXJnZXRfYWdncmVzc2l2ZSA8LSBzdW0obnVtZXJpY192YWx1ZXNfYWxsID49IHRhcmdldF9hZ2dyZXNzaXZlLCBuYS5ybSA9IFRSVUUpDQoNCm92ZXJhbGxfcGVyY2VudF9hYm92ZV90YXJnZXRfY29uc2VydmF0aXZlIDwtIHJvdW5kKChvdmVyYWxsX2Fib3ZlX3RhcmdldF9jb25zZXJ2YXRpdmUgLyBvdmVyYWxsX2NvdW50X29ic2VydmF0aW9ucykgKiAxMDAsIDIpDQpvdmVyYWxsX3BlcmNlbnRfYWJvdmVfdGFyZ2V0X2luZmxhdGlvbiA8LSByb3VuZCgob3ZlcmFsbF9hYm92ZV90YXJnZXRfaW5mbGF0aW9uIC8gb3ZlcmFsbF9jb3VudF9vYnNlcnZhdGlvbnMpICogMTAwLCAyKQ0Kb3ZlcmFsbF9wZXJjZW50X2Fib3ZlX3RhcmdldF9tb2RlcmF0ZSA8LSByb3VuZCgob3ZlcmFsbF9hYm92ZV90YXJnZXRfbW9kZXJhdGUgLyBvdmVyYWxsX2NvdW50X29ic2VydmF0aW9ucykgKiAxMDAsIDIpDQpvdmVyYWxsX3BlcmNlbnRfYWJvdmVfdGFyZ2V0X2FnZ3Jlc3NpdmUgPC0gcm91bmQoKG92ZXJhbGxfYWJvdmVfdGFyZ2V0X2FnZ3Jlc3NpdmUgLyBvdmVyYWxsX2NvdW50X29ic2VydmF0aW9ucykgKiAxMDAsIDIpDQoNCm1ldGFfcmF3X2NhZ3Jfc3VtbWFyeSRPdmVyYWxsIDwtIGMoDQogIG92ZXJhbGxfY291bnRfb2JzZXJ2YXRpb25zLA0KICBwYXN0ZTAob3ZlcmFsbF9tZWFuX3ZhbHVlLCAiJSIpLA0KICBwYXN0ZTAob3ZlcmFsbF9tZWRpYW5fdmFsdWUsICIlIiksDQogIHBhc3RlMChvdmVyYWxsX3NkX3ZhbHVlLCAiJSIpLA0KICBwYXN0ZTAob3ZlcmFsbF9taW5fY2Fncl9yYW5nZSwgIiUiKSwNCiAgcGFzdGUwKG92ZXJhbGxfbWF4X2NhZ3JfcmFuZ2UsICIlIiksDQogIHBhc3RlMChvdmVyYWxsX21pbl92YWx1ZSwgIiUiKSwNCiAgcGFzdGUwKG92ZXJhbGxfbWF4X3ZhbHVlLCAiJSIpLA0KICBwYXN0ZTAob3ZlcmFsbF9wZXJjZW50X2Fib3ZlX3RhcmdldF9pbmZsYXRpb24sICIlIiksDQogIHBhc3RlMChvdmVyYWxsX3BlcmNlbnRfYWJvdmVfdGFyZ2V0X2NvbnNlcnZhdGl2ZSwgIiUiKSwNCiAgcGFzdGUwKG92ZXJhbGxfcGVyY2VudF9hYm92ZV90YXJnZXRfbW9kZXJhdGUsICIlIiksDQogIHBhc3RlMChvdmVyYWxsX3BlcmNlbnRfYWJvdmVfdGFyZ2V0X2FnZ3Jlc3NpdmUsICIlIikNCikNCg0KIyBDb252ZXJ0IHJvdyBuYW1lcyB0byBhIGNvbHVtbg0KbWV0YV9yYXdfY2Fncl9zdW1tYXJ5IDwtIHRpYmJsZTo6cm93bmFtZXNfdG9fY29sdW1uKG1ldGFfcmF3X2NhZ3Jfc3VtbWFyeSwgdmFyID0gIlN0YXRpc3RpYyIpDQoNCiMgRW5zdXJlIGFsbCBjb2x1bW5zIGFyZSBjaGFyYWN0ZXINCm1ldGFfcmF3X2NhZ3Jfc3VtbWFyeSA8LSBtZXRhX3Jhd19jYWdyX3N1bW1hcnkgJT4lDQogIG11dGF0ZShhY3Jvc3MoZXZlcnl0aGluZygpLCBhcy5jaGFyYWN0ZXIpKQ0KDQojIERpc3BsYXkgdGhlIHN1bW1hcnkgdGFibGUNCmNhdCgiXG4jIyMjIENvbXBvdW5kIEF2ZXJhZ2UgR3Jvd3RoIFJhdGVzICgiLCBtaW5feWVhciwgIi0iLCBtYXhfeWVhciwgIilcbiIsIHNlcCA9ICIiKQ0KaW50ZXJhY3RpdmVfc3RyKG1ldGFfcmF3X2NhZ3Jfc3VtbWFyeSkNCmZvcm1hdF91bnNwZWNpZmllZF93aWR0aChtZXRhX3Jhd19jYWdyX3N1bW1hcnkpDQoNCmBgYA0KDQoqKmByIG1pbl95ZWFyYC1gciBtYXhfeWVhcmAgU3VtbWFyeToqKiBUaGUgMS1ZZWFyIENBR1IgZXhoaWJpdHMgdGhlIGByIGlmKG1lYW5fdmFsdWVfMV95ZWFyX2NhZ3IgPT0gbWF4KGMobWVhbl92YWx1ZV8xX3llYXJfY2FnciwgbWVhbl92YWx1ZV81X3llYXJfY2FnciwgbWVhbl92YWx1ZV8xMF95ZWFyX2NhZ3IpKSkgImhpZ2hlc3QgbWVhbiByZXR1cm4iIGVsc2UgaWYobWVhbl92YWx1ZV8xX3llYXJfY2FnciA9PSBtaW4oYyhtZWFuX3ZhbHVlXzFfeWVhcl9jYWdyLCBtZWFuX3ZhbHVlXzVfeWVhcl9jYWdyLCBtZWFuX3ZhbHVlXzEwX3llYXJfY2FncikpKSAibG93ZXN0IG1lYW4gcmV0dXJuIiBlbHNlICJtZWFuIHJldHVybiJgIGF0IGByIG1lYW5fdmFsdWVfMV95ZWFyX2NhZ3JgJSwgYW5kIGByIGlmKHNkX3ZhbHVlXzFfeWVhcl9jYWdyID09IG1heChjKHNkX3ZhbHVlXzFfeWVhcl9jYWdyLCBzZF92YWx1ZV81X3llYXJfY2Fnciwgc2RfdmFsdWVfMTBfeWVhcl9jYWdyKSkpICJ0aGUgZ3JlYXRlc3Qgdm9sYXRpbGl0eSB3aXRoIGEiIGVsc2UgaWYoc2RfdmFsdWVfMV95ZWFyX2NhZ3IgPT0gbWluKGMoc2RfdmFsdWVfMV95ZWFyX2NhZ3IsIHNkX3ZhbHVlXzVfeWVhcl9jYWdyLCBzZF92YWx1ZV8xMF95ZWFyX2NhZ3IpKSkgInRoZSBsZWFzdCB2b2xhdGlsaXR5IHdpdGggYSIgZWxzZSAiYSJgIHN0YW5kYXJkIGRldmlhdGlvbiBvZiBgciBzZF92YWx1ZV8xX3llYXJfY2FncmAlLiBBcyB0aGUgaW52ZXN0bWVudCBob3Jpem9uIGV4dGVuZHMgdG8gNSwgYW5kIDEwIHllYXJzLCB0aGUgbWVhbiByZXR1cm5zIGByIGlmKG1lYW5fdmFsdWVfMV95ZWFyX2NhZ3IgPCBtZWFuKGMobWVhbl92YWx1ZV81X3llYXJfY2FnciwgbWVhbl92YWx1ZV8xMF95ZWFyX2NhZ3IpKSkgImluY3JlYXNlIiBlbHNlICJkZWNyZWFzZSJgLCByYW5naW5nIGZyb20gYHIgbWVhbl92YWx1ZV81X3llYXJfY2FncmAlIHRvIGByIG1lYW5fdmFsdWVfMTBfeWVhcl9jYWdyYCUsIHdoaWxlIHZvbGF0aWxpdHkgYHIgaWYoc2RfdmFsdWVfMV95ZWFyX2NhZ3IgPCBtZWFuKGMoc2RfdmFsdWVfNV95ZWFyX2NhZ3IsIHNkX3ZhbHVlXzEwX3llYXJfY2FncikpKSAicmlzZXMiIGVsc2UgImRpbWluaXNoZXMiYCwgd2l0aCBzdGFuZGFyZCBkZXZpYXRpb25zIGByIGlmKHNkX3ZhbHVlXzFfeWVhcl9jYWdyID4gc2RfdmFsdWVfMTBfeWVhcl9jYWdyKSAiZHJvcHBpbmciIGVsc2UgInJpc2luZyJgIGZyb20gYHIgc2RfdmFsdWVfNV95ZWFyX2NhZ3JgJSB0byBgciBzZF92YWx1ZV8xMF95ZWFyX2NhZ3JgJS4gVGhpcyB0cmVuZCBpbmRpY2F0ZXMgdGhhdCBsb25nZXIgaW52ZXN0bWVudCBwZXJpb2RzIHRlbmQgdG8gb2ZmZXIgYHIgaWYoc2RfdmFsdWVfMV95ZWFyX2NhZ3IgPiBzZF92YWx1ZV8xMF95ZWFyX2NhZ3IpICJtb3JlIHN0YWJsZSIgZWxzZSAibGVzcyBzdGFibGUiYCByZXR1cm5zLiBGdXJ0aGVybW9yZSwgdGhlIHBlcmNlbnRhZ2Ugb2YgcGVyaW9kcyBleGNlZWRpbmcgdGhlIGluZmxhdGlvbiB0YXJnZXQgYHIgaWYocGVyY2VudF9hYm92ZV90YXJnZXRfaW5mbGF0aW9uXzFfeWVhcl9jYWdyIDwgcGVyY2VudF9hYm92ZV90YXJnZXRfaW5mbGF0aW9uXzEwX3llYXJfY2FncikgImluY3JlYXNlcyIgZWxzZSAiZGVjcmVhc2VzImAgd2l0aCBsb25nZXIgZHVyYXRpb25zLCBmcm9tIGByIHBlcmNlbnRfYWJvdmVfdGFyZ2V0X2luZmxhdGlvbl8xX3llYXJfY2FncmAlIGluIHRoZSAxLVllYXIgQ0FHUiB0byBgciBwZXJjZW50X2Fib3ZlX3RhcmdldF9pbmZsYXRpb25fMTBfeWVhcl9jYWdyYCUgaW4gdGhlIDEwLVllYXIgQ0FHUiwgdW5kZXJzY29yaW5nIE1FVEEncyBgciBpZihwZXJjZW50X2Fib3ZlX3RhcmdldF9pbmZsYXRpb25fMV95ZWFyX2NhZ3IgPCBwZXJjZW50X2Fib3ZlX3RhcmdldF9pbmZsYXRpb25fMTBfeWVhcl9jYWdyKSAiZWZmZWN0aXZlbmVzcyIgZWxzZSAiaW5lZmZlY3RpdmVuZXNzImAgYXMgYSBoZWRnZSBhZ2FpbnN0IGluZmxhdGlvbiBvdmVyIGV4dGVuZGVkIHRpbWVmcmFtZXMuIFdpdGggYW4gb3ZlcmFsbCBwZXJjZW50YWdlIG9mIGByIG92ZXJhbGxfcGVyY2VudF9hYm92ZV90YXJnZXRfYWdncmVzc2l2ZWAlIGV4Y2VlZGluZyB0aGUgYWdncmVzc2l2ZSB0YXJnZXQgKGByIHRhcmdldF9hZ2dyZXNzaXZlYCUgYW5udWFsaXplZCByZXR1cm5zIHdpdGggYHIgdGFyZ2V0X2luZmxhdGlvbmAlIGluZmxhdGlvbiksIE1FVEEgYHIgaWYob3ZlcmFsbF9wZXJjZW50X2Fib3ZlX3RhcmdldF9hZ2dyZXNzaXZlID4gNTApICJoYXMsIG92ZXIgdGhpcyB0aW1lIHBlcmlvZCwgcHJvdmVuIHRvIGJlIGEgc3Ryb25nIiBlbHNlIGlmKG92ZXJhbGxfcGVyY2VudF9hYm92ZV90YXJnZXRfYWdncmVzc2l2ZSA+IDQwKSAiaGFzLCBvdmVyIHRoaXMgdGltZSBwZXJpb2QsIGRlbW9uc3RyYXRlZCBpdHNlbGYgYXMgYSB2aWFibGUiIGVsc2UgImFwcGVhcnMsIG92ZXIgdGhpcyB0aW1lIHBlcmlvZCwgdG8gYmUgYSBsZXNzIHN1aXRhYmxlImAgb3B0aW9uIGZvciBhIGhpZ2gtcmV0dXJuaW5nIGxvbmctdGVybSBpbnZlc3RtZW50Lg0KDQojIyMgR3JhcGgNCg0KIyMjIyBBbGwgUGVyaW9kcw0KDQoNCmBgYHtyIG1ldGFfcmF3X2NhZ3JfZ3JhcGhzX2FsbCwgZmlnLndpZHRoPTEwLCBmaWcuaGVpZ2h0PTcsIGV2YWw9VFJVRSwgZWNobz1GQUxTRX0NCg0KY2F0KCJcblxuIyMjIyBDb21wb3VuZCBBdmVyYWdlIEdyb3d0aCBSYXRlcyBBY3Jvc3MgUGVyaW9kcyBcbiIpDQoNCiMgTG9hZCBuZWNlc3NhcnkgbGlicmFyaWVzDQpsaWJyYXJ5KGdncGxvdDIpDQpsaWJyYXJ5KGRwbHlyKQ0KDQoNCiMgQ29udmVydCBjb2x1bW5zIHRvIG51bWVyaWMgZm9yIHBsb3R0aW5nIGlmIG5lZWRlZA0KbWV0YV9yYXdfY2FnciA8LSBtZXRhX3Jhd19jYWdyICU+JQ0KICBtdXRhdGUoDQogICAgYERhdGVgID0gYXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIoYERhdGVgKSksICAjIEVuc3VyZSBEYXRlIGlzIG51bWVyaWMNCiAgICBgMS1ZZWFyIENBR1JgID0gYXMubnVtZXJpYyhnc3ViKCIlIiwgIiIsIGAxLVllYXIgQ0FHUmApKSwNCiAgICBgNS1ZZWFyIENBR1JgID0gYXMubnVtZXJpYyhnc3ViKCIlIiwgIiIsIGA1LVllYXIgQ0FHUmApKSwNCiAgICBgMTAtWWVhciBDQUdSYCA9IGFzLm51bWVyaWMoZ3N1YigiJSIsICIiLCBgMTAtWWVhciBDQUdSYCkpLA0KICAgIGAyMC1ZZWFyIENBR1JgID0gYXMubnVtZXJpYyhnc3ViKCIlIiwgIiIsIGAyMC1ZZWFyIENBR1JgKSksDQogICAgYDMwLVllYXIgQ0FHUmAgPSBhcy5udW1lcmljKGdzdWIoIiUiLCAiIiwgYDMwLVllYXIgQ0FHUmApKQ0KICApDQoNCiMgUmVzaGFwZSB0aGUgZGF0YSBpbnRvIGxvbmcgZm9ybWF0IGZvciBlYXN5IHBsb3R0aW5nIG9mIG11bHRpcGxlIGxpbmVzIGFuZCBzZXQgdGhlIGZhY3RvciBvcmRlcg0KbnJ0X2xvbmcgPC0gbWV0YV9yYXdfY2FnciAlPiUNCiAgcGl2b3RfbG9uZ2VyKGNvbHMgPSBjKGAxLVllYXIgQ0FHUmAsIGA1LVllYXIgQ0FHUmAsIGAxMC1ZZWFyIENBR1JgLCBgMjAtWWVhciBDQUdSYCwgYDMwLVllYXIgQ0FHUmApLA0KICAgICAgICAgICAgICAgbmFtZXNfdG8gPSAiQ0FHUl9QZXJpb2QiLA0KICAgICAgICAgICAgICAgdmFsdWVzX3RvID0gIkNBR1JfVmFsdWUiKSAlPiUNCiAgbXV0YXRlKENBR1JfUGVyaW9kID0gZmFjdG9yKENBR1JfUGVyaW9kLCBsZXZlbHMgPSBjKCIxLVllYXIgQ0FHUiIsICI1LVllYXIgQ0FHUiIsICIxMC1ZZWFyIENBR1IiLCAiMjAtWWVhciBDQUdSIiwgIjMwLVllYXIgQ0FHUiIpKSkNCg0KIyBBc3NpZ24gY29sb3JzIGR5bmFtaWNhbGx5IGJhc2VkIG9uIHRoZSBvcmRlciBvZiBDQUdSX1BlcmlvZCBpbiB0aGUgZGF0YQ0KIyBNYXRjaCB0aGUgdW5pcXVlIGxldmVscyBvZiBDQUdSX1BlcmlvZCB3aXRoIGNvbG9ycyBmcm9tIGNvbG9yc19nZW5lcmFsX2RhcmsNCnVuaXF1ZV90eXBlcyA8LSB1bmlxdWUobnJ0X2xvbmckQ0FHUl9QZXJpb2QpDQpjdXN0b21fY29sb3JzIDwtIHNldE5hbWVzKGNvbG9yc19nZW5lcmFsX2RhcmtbMTpsZW5ndGgodW5pcXVlX3R5cGVzKV0sIHVuaXF1ZV90eXBlcykNCg0KIyBGaW5kIHRoZSBtaW5pbXVtIGFuZCBtYXhpbXVtIHgtdmFsdWUgaW4geW91ciBkYXRhDQptYXhfeCA8LSBtYXgoYXMuaW50ZWdlcihtZXRhX3Jhd19jYWdyJERhdGUpLCBuYS5ybSA9IFRSVUUpDQptaW5feCA8LSBtaW4oYXMuaW50ZWdlcihtZXRhX3Jhd19jYWdyJERhdGUpLCBuYS5ybSA9IFRSVUUpDQppbnRlcmFjdGl2ZV9wcmludChtYXhfeCkgICMgVGVzdA0KaW50ZXJhY3RpdmVfcHJpbnQobWluX3gpICAjIFRlc3QNCg0KIyBGaW5kIHRoZSBtaW5pbXVtIGFuZCBtYXhpbXVtIHllYXINCm1pbl95ZWFyIDwtIG1pbihtZXRhX3Jhd19jYWdyJERhdGUsIG5hLnJtID0gVFJVRSkNCm1heF95ZWFyIDwtIG1heChtZXRhX3Jhd19jYWdyJERhdGUsIG5hLnJtID0gVFJVRSkNCmludGVyYWN0aXZlX3ByaW50KG1pbl95ZWFyKQ0KaW50ZXJhY3RpdmVfcHJpbnQobWF4X3llYXIpDQoNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQojIyBQTE9UIEZVTEwgV0lUSE9VVCBMSU1JVFMNCg0KIyBEZWZpbmUgc3RhcnQgYW5kIGVuZCB5ZWFycw0Kc3RhcnRfeWVhciA8LSBhcy5udW1lcmljKG1pbl95ZWFyKQ0KZW5kX3llYXIgPC0gMjAyNA0KeWVhcl9yYW5nZSA8LSBlbmRfeWVhciAtIHN0YXJ0X3llYXIgKyAxICAjIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIHllYXJzDQoNCiMgRGVmaW5lIGJyZWFrcyByb3VuZGVkIGFwcHJvcHJpYXRlbHkNCmxpbWl0c19zdGFydF95ZWFyIDwtIGZsb29yKHN0YXJ0X3llYXIgLyAyKSAqIDIgICMgUm91bmQgZG93biB0byB0aGUgbmVhcmVzdCBtdWx0aXBsZSBvZiA1DQpsaW1pdHNfZW5kX3llYXIgPC0gY2VpbGluZyhlbmRfeWVhciAvIDIpICogMiAgICMgUm91bmQgdXAgdG8gdGhlIG5lYXJlc3QgbXVsdGlwbGUgb2YgNQ0KDQojIENyZWF0ZSBkeW5hbWljIHRpdGxlIGFuZCBjYXB0aW9uDQpkeW5hbWljX3RpdGxlIDwtIHBhc3RlMCgiUm9sbGluZyBDQUdScyBBY3Jvc3MgUGVyaW9kcyBPdmVyICIseWVhcl9yYW5nZSwgIiBZZWFycyAoIiwgc3RhcnRfeWVhciwgIi0iLCBlbmRfeWVhciwgIikiKQ0KZHluYW1pY19jYXB0aW9uIDwtIHBhc3RlMCgiTUVUQSBDb21wb3VuZCBBdmVyYWdlIEdyb3d0aCBSYXRlcyBBY3Jvc3MgUm9sbGluZyBQZXJpb2RzLCBEYXRhc2V0ICgiLCBtaW5feWVhciwgIi0iLCBtYXhfeWVhciwgIikiKQ0KDQojIENyZWF0ZSB0aGUgZnVsbCwgbm9uLWZpbHRlcmVkIHgtYXhpcyBwbG90IHdpdGggZHluYW1pYyB4IHBsYWNlbWVudCBmb3IgYW5ub3RhdGlvbnMNCnAxIDwtIGdncGxvdChucnRfbG9uZywgYWVzKHggPSBhcy5pbnRlZ2VyKERhdGUpLCB5ID0gQ0FHUl9WYWx1ZSwgY29sb3IgPSBDQUdSX1BlcmlvZCkpICsNCg0KICAjIEFkZCBzaGFkZWQgYXJlYXMgZm9yIGJhY2tncm91bmQgZWZmZWN0DQogIGdlb21fcmVjdChhZXMoeG1pbiA9IC1JbmYsIHhtYXggPSBJbmYsIHltaW4gPSB0YXJnZXRfYWdncmVzc2l2ZSwgeW1heCA9IEluZiksIGZpbGwgPSAibGlnaHRncmVlbiIsIGFscGhhID0gMC4wMTApICsNCiAgZ2VvbV9yZWN0KGFlcyh4bWluID0gLUluZiwgeG1heCA9IEluZiwgeW1pbiA9IHRhcmdldF9jb25zZXJ2YXRpdmUsIHltYXggPSB0YXJnZXRfYWdncmVzc2l2ZSksIGZpbGwgPSAib3JhbmdlIiwgYWxwaGEgPSAwLjAxKSArDQogIGdlb21fcmVjdChhZXMoeG1pbiA9IC1JbmYsIHhtYXggPSBJbmYsIHltaW4gPSAtSW5mLCB5bWF4ID0gdGFyZ2V0X2NvbnNlcnZhdGl2ZSksIGZpbGwgPSAibGlnaHRjb3JhbCIsIGFscGhhID0gMC4wMTApICsNCiAgDQogICMgUGxvdCBsaW5lcyBmb3IgZWFjaCBDQUdSIFBlcmlvZA0KICBnZW9tX2xpbmUoc2l6ZSA9IDEuMCwgYWxwaGEgPSAzLjApICsgICAgICAgIyBMaW5lIGZvciBlYWNoIENBR1INCiAgZ2VvbV9wb2ludChzaXplID0gMS4wLCBhbHBoYSA9IDMuMCkgKyAgICAgICAjIFBvaW50cyBmb3IgZWFjaCBDQUdSDQogIA0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSB0YXJnZXRfYWdncmVzc2l2ZSwgY29sb3IgPSAiZGFya2JsdWUiLCBsaW5ldHlwZSA9ICJzb2xpZCIpICsNCiAgIyBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSB0YXJnZXRfbW9kZXJhdGUsIGNvbG9yID0gImRhcmtibHVlIiwgbGluZXR5cGUgPSAic29saWQiKSArDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IHRhcmdldF9jb25zZXJ2YXRpdmUsIGNvbG9yID0gImRhcmtibHVlIiwgbGluZXR5cGUgPSAic29saWQiKSArDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IHRhcmdldF9pbmZsYXRpb24sIGNvbG9yID0gImRhcmtyZWQiLCBsaW5ldHlwZSA9ICJkYXNoZWQiKSArDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IGNhZ3JfdmFsdWUsIGNvbG9yID0gImRhcmtyZWQiLCBsaW5ldHlwZSA9ICJkYXNoZWQiKSArDQogIA0KICAjIER5bmFtaWMgcmlnaHQtYWxpZ25lZCBwbGFjZW1lbnQgZm9yIGFubm90YXRpb25zDQogIGFubm90YXRlKCJ0ZXh0IiwgeCA9IEluZiwgeSA9IHRhcmdldF9hZ2dyZXNzaXZlLCBsYWJlbCA9ICJBZ2dyZXNzaXZlIiwgDQogICAgICAgICAgIGhqdXN0ID0gMSwgdmp1c3QgPSAtMC41MCwgY29sb3IgPSAiZGFya2JsdWUiLCBzaXplID0gNCkgKw0KICAjIGFubm90YXRlKCJ0ZXh0IiwgeCA9IEluZiwgeSA9IHRhcmdldF9tb2RlcmF0ZSwgbGFiZWwgPSAiTW9kZXJhdGUiLCANCiAgIyAgICAgICAgIGhqdXN0ID0gMSwgdmp1c3QgPSAtMC41MCwgY29sb3IgPSAiZGFya2JsdWUiLCBzaXplID0gNCkgKw0KICBhbm5vdGF0ZSgidGV4dCIsIHggPSBJbmYsIHkgPSB0YXJnZXRfY29uc2VydmF0aXZlLCBsYWJlbCA9ICJDb25zZXJ2YXRpdmUiLCANCiAgICAgICAgICAgaGp1c3QgPSAxLCB2anVzdCA9IC0wLjUwLCBjb2xvciA9ICJkYXJrYmx1ZSIsIHNpemUgPSA0KSArDQogIGFubm90YXRlKCJ0ZXh0IiwgeCA9IEluZiwgeSA9IHRhcmdldF9pbmZsYXRpb24sIGxhYmVsID0gIkluZmxhdGlvbiIsIA0KICAgICAgICAgICBoanVzdCA9IDEsIHZqdXN0ID0gKzEuMTAsIGNvbG9yID0gImRhcmtyZWQiLCBzaXplID0gNCkgKw0KICBhbm5vdGF0ZSgidGV4dCIsIHggPSBJbmYsIHkgPSBjYWdyX3ZhbHVlLCBsYWJlbCA9ICJDQUdSIiwgDQogICAgICAgICAgIGhqdXN0ID0gMSwgdmp1c3QgPSAtMC41MCwgY29sb3IgPSAiZGFya3JlZCIsIHNpemUgPSA0KSArIA0KDQogIGxhYnMoDQogICAgdGl0bGUgPSBkeW5hbWljX3RpdGxlLA0KICAgIHggPSAiWWVhciIsDQogICAgeSA9ICJDQUdSIFZhbHVlICglKSIsDQogICAgY29sb3IgPSAiQ0FHUiBQZXJpb2QiLA0KICAgIGNhcHRpb24gPSBkeW5hbWljX2NhcHRpb24NCiAgICApICsNCiAgDQogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjdXN0b21fY29sb3JzKSArICAjIFNldCBjb2xvcnMgZm9yIGVhY2ggQ0FHUiBQZXJpb2QNCiAgc2NhbGVfeF9jb250aW51b3VzKA0KICAgIGxpbWl0cyA9IGMoc3RhcnRfeWVhciwgZW5kX3llYXIgKyAxKSwgDQogICAgYnJlYWtzID0gc2VxKGxpbWl0c19zdGFydF95ZWFyLCBsaW1pdHNfZW5kX3llYXIgLCAyKSkgKyAgIyBSZXN0cmljdCAmIFNldCBNYWpvciB4LWF4aXMgbGluZXMgZm9yIGVhY2ggeWVhcg0KICANCiAgdGhlbWVfbWluaW1hbCgpICsNCiAgdGhlbWUoDQogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSwgc2l6ZSA9IDIwKSwgICAgICAgICAjIExhcmdlciB0aXRsZSBmb250DQogICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCksICAgICAgICAgICAgICAgICAgICAjIExhcmdlciB4LWF4aXMgbGFiZWwgZm9udA0KICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQpLCAgICAgICAgICAgICAgICAgICAgIyBMYXJnZXIgeS1heGlzIGxhYmVsIGZvbnQNCiAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEsIHNpemUgPSAxNCksICAjIExhcmdlciB4LWF4aXMgdGV4dA0KICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCksICAgICAgICAgICAgICAgICAgICAgIyBMYXJnZXIgeS1heGlzIHRleHQNCiAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0KSwgICAgICAgICAgICAgICAgICAgICMgTGVnZW5kIHRpdGxlIHNpemUNCiAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIpLCAgICAgICAgICAgICAgICAgICAgICMgTGVnZW5kIHRleHQgc2l6ZQ0KICAgIHBhbmVsLmdyaWQubWFqb3IgPSBlbGVtZW50X2xpbmUobGluZXR5cGUgPSAiZG90dGVkIiwgY29sb3IgPSAiYmxhY2siKSwgICMgTWFqb3IgZ3JpZCBsaW5lcw0KICAgIHBhbmVsLmdyaWQubWlub3IueCA9IGVsZW1lbnRfYmxhbmsoKSwgICAgICAgICAgICAgICAgICAgICAgIyBObyBtaW5vciB4IGdyaWQgbGluZXMNCiAgICBheGlzLnRpY2tzLmxlbmd0aCA9IHVuaXQoLTAuMjUsICJjbSIpLCAgICAgICAgICAgICAgICAgICAgICAjIEluY3JlYXNlIHRpY2sgbGVuZ3RoDQogICAgYXhpcy50aWNrcyA9IGVsZW1lbnRfbGluZShjb2xvciA9ICJibGFjayIsIHNpemUgPSAwLjUwKSwgICAjIERhcmtlciB0aWNrcw0KICAgIGF4aXMubGluZS54ID0gZWxlbWVudF9saW5lKGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDAuNzUpLCAgIyBEYXJrIGJvdHRvbSBib3JkZXINCiAgICBheGlzLmxpbmUueSA9IGVsZW1lbnRfbGluZShjb2xvciA9ICJibGFjayIsIHNpemUgPSAwLjc1KSAgICMgRGFyayBsZWZ0IGJvcmRlcg0KICApDQoNCiMgUHJpbnQgdGhlIHBsb3QgDQpwcmludChwMSkNCg0KDQpgYGANCg0KIyMjIyBTaG9ydC1UZXJtDQoNCmBgYHtyIG1ldGFfcmF3X2NhZ3JfZ3JhcGhzX3Nob3J0LCBmaWcud2lkdGg9MTAsIGZpZy5oZWlnaHQ9N30NCg0KY2F0KCJcblxuIyMjIyBDb21wb3VuZCBBdmVyYWdlIEdyb3d0aCBSYXRlcyBBY3Jvc3MgU2hvcnQtVGVybSBSb2xsaW5nIFBlcmlvZHMgXG4iKQ0KDQojIEZpbHRlciBkYXRhIGZvciBTaG9ydC1UZXJtIENBR1IgKDUtWWVhciBhbmQgMTAtWWVhcikNCnNob3J0dGVybV9kYXRhIDwtIG5ydF9sb25nICU+JQ0KICBmaWx0ZXIoQ0FHUl9QZXJpb2QgJWluJSBjKCI1LVllYXIgQ0FHUiIsICIxMC1ZZWFyIENBR1IiKSkNCg0KDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KIyMgUExPVCBGVUxMIFdJVEhPVVQgTElNSVRTDQoNCiMgRGVmaW5lIHN0YXJ0IGFuZCBlbmQgeWVhcnMNCnN0YXJ0X3llYXIgPC0gMjAxOA0KZW5kX3llYXIgPC0gMjAyNA0KeWVhcl9yYW5nZSA8LSBlbmRfeWVhciAtIHN0YXJ0X3llYXIgKyAxICAjIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIHllYXJzDQoNCiMgRGVmaW5lIGJyZWFrcyByb3VuZGVkIGFwcHJvcHJpYXRlbHkNCmxpbWl0c19zdGFydF95ZWFyIDwtIGZsb29yKHN0YXJ0X3llYXIgLyA1KSAqIDUgICMgUm91bmQgZG93biB0byB0aGUgbmVhcmVzdCBtdWx0aXBsZSBvZiA1DQpsaW1pdHNfZW5kX3llYXIgPC0gY2VpbGluZyhlbmRfeWVhciAvIDUpICogNSAgICMgUm91bmQgdXAgdG8gdGhlIG5lYXJlc3QgbXVsdGlwbGUgb2YgNQ0KDQojIENyZWF0ZSBkeW5hbWljIHRpdGxlIGFuZCBjYXB0aW9uDQpkeW5hbWljX3RpdGxlIDwtIHBhc3RlMCgiQ0FHUiBBY3Jvc3MgU2hvcnQtVGVybSBQZXJpb2RzIE92ZXIgIix5ZWFyX3JhbmdlLCAiIFllYXJzICgiLCBzdGFydF95ZWFyLCAiLSIsIGVuZF95ZWFyLCAiKSIpDQpkeW5hbWljX2NhcHRpb24gPC0gcGFzdGUwKCJNRVRBIENvbXBvdW5kIEF2ZXJhZ2UgR3Jvd3RoIFJhdGVzIEFjcm9zcyBTaG9ydC1UZXJtIFJvbGxpbmcgUGVyaW9kcywgRGF0YXNldCAoIiwgbWluX3llYXIsICItIiwgbWF4X3llYXIsICIpIikNCg0KIyBDcmVhdGUgdGhlIGZ1bGwsIG5vbi1maWx0ZXJlZCB4LWF4aXMgcGxvdCB3aXRoIGR5bmFtaWMgeCBwbGFjZW1lbnQgZm9yIGFubm90YXRpb25zDQpwMV9zaG9ydHRlcm0gPC0gZ2dwbG90KHNob3J0dGVybV9kYXRhLCBhZXMoeCA9IGFzLmludGVnZXIoRGF0ZSksIHkgPSBDQUdSX1ZhbHVlLCBjb2xvciA9IENBR1JfUGVyaW9kKSkgKw0KDQogICMgQWRkIHNoYWRlZCBhcmVhcyBmb3IgYmFja2dyb3VuZCBlZmZlY3QNCiAgZ2VvbV9yZWN0KGFlcyh4bWluID0gLUluZiwgeG1heCA9IEluZiwgeW1pbiA9IHRhcmdldF9hZ2dyZXNzaXZlLCB5bWF4ID0gSW5mKSwgZmlsbCA9ICJsaWdodGdyZWVuIiwgYWxwaGEgPSAwLjAxMCkgKw0KICBnZW9tX3JlY3QoYWVzKHhtaW4gPSAtSW5mLCB4bWF4ID0gSW5mLCB5bWluID0gdGFyZ2V0X2NvbnNlcnZhdGl2ZSwgeW1heCA9IHRhcmdldF9hZ2dyZXNzaXZlKSwgZmlsbCA9ICJvcmFuZ2UiLCBhbHBoYSA9IDAuMDEpICsNCiAgZ2VvbV9yZWN0KGFlcyh4bWluID0gLUluZiwgeG1heCA9IEluZiwgeW1pbiA9IC1JbmYsIHltYXggPSB0YXJnZXRfY29uc2VydmF0aXZlKSwgZmlsbCA9ICJsaWdodGNvcmFsIiwgYWxwaGEgPSAwLjAxMCkgKw0KICANCiAgIyBQbG90IGxpbmVzIGZvciBlYWNoIENBR1IgUGVyaW9kDQogIGdlb21fbGluZShzaXplID0gMS4wLCBhbHBoYSA9IDMuMCkgKyAgICAgICAjIExpbmUgZm9yIGVhY2ggQ0FHUg0KICBnZW9tX3BvaW50KHNpemUgPSAxLjAsIGFscGhhID0gMy4wKSArICAgICAgICMgUG9pbnRzIGZvciBlYWNoIENBR1INCg0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSB0YXJnZXRfYWdncmVzc2l2ZSwgY29sb3IgPSAiZGFya2JsdWUiLCBsaW5ldHlwZSA9ICJzb2xpZCIpICsNCiAgIyBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSB0YXJnZXRfbW9kZXJhdGUsIGNvbG9yID0gImRhcmtibHVlIiwgbGluZXR5cGUgPSAic29saWQiKSArDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IHRhcmdldF9jb25zZXJ2YXRpdmUsIGNvbG9yID0gImRhcmtibHVlIiwgbGluZXR5cGUgPSAic29saWQiKSArDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IHRhcmdldF9pbmZsYXRpb24sIGNvbG9yID0gImRhcmtyZWQiLCBsaW5ldHlwZSA9ICJkYXNoZWQiKSArDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IGNhZ3JfdmFsdWUsIGNvbG9yID0gImRhcmtyZWQiLCBsaW5ldHlwZSA9ICJkYXNoZWQiKSArDQogIA0KICAjIER5bmFtaWMgcmlnaHQtYWxpZ25lZCBwbGFjZW1lbnQgZm9yIGFubm90YXRpb25zDQogIGFubm90YXRlKCJ0ZXh0IiwgeCA9IEluZiwgeSA9IHRhcmdldF9hZ2dyZXNzaXZlLCBsYWJlbCA9ICJBZ2dyZXNzaXZlIiwgDQogICAgICAgICAgIGhqdXN0ID0gMSwgdmp1c3QgPSAtMC41MCwgY29sb3IgPSAiZGFya2JsdWUiLCBzaXplID0gNCkgKw0KICAjIGFubm90YXRlKCJ0ZXh0IiwgeCA9IEluZiwgeSA9IHRhcmdldF9tb2RlcmF0ZSwgbGFiZWwgPSAiTW9kZXJhdGUiLCANCiAgIyAgICAgICAgIGhqdXN0ID0gMSwgdmp1c3QgPSAtMC41MCwgY29sb3IgPSAiZGFya2JsdWUiLCBzaXplID0gNCkgKw0KICBhbm5vdGF0ZSgidGV4dCIsIHggPSBJbmYsIHkgPSB0YXJnZXRfY29uc2VydmF0aXZlLCBsYWJlbCA9ICJDb25zZXJ2YXRpdmUiLCANCiAgICAgICAgICAgaGp1c3QgPSAxLCB2anVzdCA9IC0wLjUwLCBjb2xvciA9ICJkYXJrYmx1ZSIsIHNpemUgPSA0KSArDQogIGFubm90YXRlKCJ0ZXh0IiwgeCA9IEluZiwgeSA9IHRhcmdldF9pbmZsYXRpb24sIGxhYmVsID0gIkluZmxhdGlvbiIsIA0KICAgICAgICAgICBoanVzdCA9IDEsIHZqdXN0ID0gKzEuMzAsIGNvbG9yID0gImRhcmtyZWQiLCBzaXplID0gNCkgKw0KICBhbm5vdGF0ZSgidGV4dCIsIHggPSBJbmYsIHkgPSBjYWdyX3ZhbHVlLCBsYWJlbCA9ICJDQUdSIiwgDQogICAgICAgICAgIGhqdXN0ID0gMSwgdmp1c3QgPSAtMC41MCwgY29sb3IgPSAiZGFya3JlZCIsIHNpemUgPSA0KSArIA0KDQogIGxhYnMoDQogICAgdGl0bGUgPSBkeW5hbWljX3RpdGxlLA0KICAgIHggPSAiWWVhciIsDQogICAgeSA9ICJDQUdSIFZhbHVlICglKSIsDQogICAgY29sb3IgPSAiQ0FHUiBQZXJpb2QiLA0KICAgIGNhcHRpb24gPSBkeW5hbWljX2NhcHRpb24NCiAgICApICsNCiAgDQogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjdXN0b21fY29sb3JzW2MoIjUtWWVhciBDQUdSIiwgIjEwLVllYXIgQ0FHUiIpXSkgKw0KICBzY2FsZV94X2NvbnRpbnVvdXMoDQogICAgbGltaXRzID0gYyhzdGFydF95ZWFyLCBlbmRfeWVhciArIDEpLCANCiAgICBicmVha3MgPSBzZXEobGltaXRzX3N0YXJ0X3llYXIsIGxpbWl0c19lbmRfeWVhciArIDEgLCA1KQ0KICApICsgICMgUmVzdHJpY3QgJiBTZXQgTWFqb3IgeC1heGlzIGxpbmVzIGZvciBlYWNoIHllYXINCg0KICB0aGVtZV9taW5pbWFsKCkgKw0KICB0aGVtZSgNCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41LCBzaXplID0gMjApLCAgICAgICAgICMgTGFyZ2VyIHRpdGxlIGZvbnQNCiAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0KSwgICAgICAgICAgICAgICAgICAgICMgTGFyZ2VyIHgtYXhpcyBsYWJlbCBmb250DQogICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCksICAgICAgICAgICAgICAgICAgICAjIExhcmdlciB5LWF4aXMgbGFiZWwgZm9udA0KICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSwgc2l6ZSA9IDE0KSwgICMgTGFyZ2VyIHgtYXhpcyB0ZXh0DQogICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0KSwgICAgICAgICAgICAgICAgICAgICAjIExhcmdlciB5LWF4aXMgdGV4dA0KICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQpLCAgICAgICAgICAgICAgICAgICAgIyBMZWdlbmQgdGl0bGUgc2l6ZQ0KICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiksICAgICAgICAgICAgICAgICAgICAgIyBMZWdlbmQgdGV4dCBzaXplDQogICAgcGFuZWwuZ3JpZC5tYWpvciA9IGVsZW1lbnRfbGluZShsaW5ldHlwZSA9ICJkb3R0ZWQiLCBjb2xvciA9ICJibGFjayIpLCAgIyBNYWpvciBncmlkIGxpbmVzDQogICAgcGFuZWwuZ3JpZC5taW5vci54ID0gZWxlbWVudF9ibGFuaygpLCAgICAgICAgICAgICAgICAgICAgICAjIE5vIG1pbm9yIHggZ3JpZCBsaW5lcw0KICAgIGF4aXMudGlja3MubGVuZ3RoID0gdW5pdCgtMC4yNSwgImNtIiksICAgICAgICAgICAgICAgICAgICAgICMgSW5jcmVhc2UgdGljayBsZW5ndGgNCiAgICBheGlzLnRpY2tzID0gZWxlbWVudF9saW5lKGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDAuNTApLCAgICMgRGFya2VyIHRpY2tzDQogICAgYXhpcy5saW5lLnggPSBlbGVtZW50X2xpbmUoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMC43NSksICAjIERhcmsgYm90dG9tIGJvcmRlcg0KICAgIGF4aXMubGluZS55ID0gZWxlbWVudF9saW5lKGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDAuNzUpICAgIyBEYXJrIGxlZnQgYm9yZGVyDQogICkNCg0KIyBQcmludCB0aGUgcGxvdCANCnByaW50KHAxX3Nob3J0dGVybSkNCg0KYGBgDQoNCiMgVFNMQQ0KDQpUZXNsYSwgSW5jLiAoVFNMQSkgaXMgY29uc2lkZXJlZCBhIGxlYWRpbmcgdGVjaG5vbG9neSBhbmQgYXV0b21vdGl2ZSBjb21wYW55IGhlYWRxdWFydGVyZWQgaW4gUGFsbyBBbHRvLCBDYWxpZm9ybmlhIChub3cgb2ZmaWNpYWxseSBpbiBBdXN0aW4sIFRleGFzKS4gRXN0YWJsaXNoZWQgaW4gMjAwMyBieSBNYXJ0aW4gRWJlcmhhcmQgYW5kIE1hcmMgVGFycGVubmluZywgd2l0aCBlYXJseSBjb250cmlidXRpb25zIGZyb20gRWxvbiBNdXNrLCBKQiBTdHJhdWJlbCwgYW5kIElhbiBXcmlnaHQsIFRlc2xhIGlzIGJlc3Qga25vd24gZm9yIGl0cyBlbGVjdHJpYyB2ZWhpY2xlcyAoRVZzKSBzdWNoIGFzIHRoZSBNb2RlbCBTLCBNb2RlbCAzLCBNb2RlbCBYLCBhbmQgTW9kZWwgWS4gVGhlIGNvbXBhbnkgYWxzbyBleGNlbHMgaW4gY2xlYW4gZW5lcmd5IHNvbHV0aW9ucywgaW5jbHVkaW5nIHNvbGFyIHBhbmVscywgc29sYXIgcm9vZnMsIGFuZCBlbmVyZ3kgc3RvcmFnZSBwcm9kdWN0cyBsaWtlIHRoZSBQb3dlcndhbGwgYW5kIE1lZ2FwYWNrLiBUZXNsYSBoYXMgYmVlbiBhIHBpb25lZXIgaW4gYXV0b25vbW91cyBkcml2aW5nIHRlY2hub2xvZ2llcyBhbmQgYXJ0aWZpY2lhbCBpbnRlbGxpZ2VuY2UgKEFJKSwgZGV2ZWxvcGluZyBjdXR0aW5nLWVkZ2Ugc29mdHdhcmUgYW5kIGhhcmR3YXJlIGZvciBGdWxsIFNlbGYtRHJpdmluZyAoRlNEKSBjYXBhYmlsaXRpZXMuDQoNCiMjIFRTTEEgR1INCg0KIyMjIERhdGENCg0KVGhlIFRTTEEgRGF0YSBwcmVzZW50ZWQgaGVyZSBpcyBzb3VyY2VkIGZyb20gWWFob28gRmluYW5jZSwgZmlsdGVyZWQgdG8gZGlzcGxheSBNb250aGx5IEhpc3RvcmljYWwgRGF0YSAoZS5nLiwgMDMvMDEvMjAyNCkuIFRoaXMgZGF0YSByZXByZXNlbnRzIHRoZSBjbG9zaW5nIHByaWNlIG9mIHRoZSBsYXN0IHRyYWRpbmcgZGF5IG9mIGVhY2ggbW9udGggKGUuZy4sIDAzLzI4LzIwMjQpLiBQbGVhc2Ugbm90ZSB0aGF0IHRoZSBzdGF0aXN0aWNzIHByZXNlbnRlZCBoZXJlIG1heSBkaWZmZXIgZnJvbSB0aG9zZSBpbiBZYWhvbyBGaW5hbmNlJ3MgUGVyZm9ybWFuY2Ugc2VjdGlvbiBkdWUgdG8gZGlmZmVyZW5jZXMgaW4gZGF0YSBhZ2dyZWdhdGlvbiBhbmQgY2FsY3VsYXRpb24gbWV0aG9kcy4gIA0KDQpEYXRhIFNvdXJjZTogYHIgbnJ2JHNvdXJjZV90c2xhX3lhaG9vYA0KDQpgYGB7ciB0c2xhX3JhdywgZXZhbD1UUlVFLCBlY2hvPUZBTFNFfQ0KDQojIERpc3BsYXkgdGhlIHN0cnVjdHVyZSBvZiB0aGUgZGF0YXNldCB0byBjb25maXJtIGNvbHVtbiBuYW1lcw0KaW50ZXJhY3RpdmVfc3RyKG5ydCR0c2xhX3JhdykNCg0KbGlicmFyeShkcGx5cikNCmxpYnJhcnkobHVicmlkYXRlKSAgIyBGb3IgZGF0ZSBtYW5pcHVsYXRpb24NCmxpYnJhcnkoc2NhbGVzKQ0KbGlicmFyeShzdHJpbmdyKQ0KDQojIEVuc3VyZSB0aGUgJ0RhdGUnIGNvbHVtbiBpcyBvZiBEYXRlIGNsYXNzDQp0c2xhX3JhdyA8LSBucnQkdHNsYV9yYXcgJT4lDQogIG11dGF0ZShEYXRlID0gYXMuRGF0ZShEYXRlLCBmb3JtYXQgPSAiJVktJW0tJWQiKSkNCg0KIyBGaW5kIHRoZSBtaW5pbXVtIGFuZCBtYXhpbXVtIHllYXINCm1pbl95ZWFyIDwtIGZvcm1hdChtaW4odHNsYV9yYXckRGF0ZSwgbmEucm0gPSBUUlVFKSwgIiVZIikNCm1heF95ZWFyIDwtIGZvcm1hdChtYXgodHNsYV9yYXckRGF0ZSwgbmEucm0gPSBUUlVFKSwgIiVZIikNCmludGVyYWN0aXZlX3ByaW50KG1pbl95ZWFyKQ0KaW50ZXJhY3RpdmVfcHJpbnQobWF4X3llYXIpDQoNCiMgVXBkYXRlIGRhdGEgZnJhbWUgd2l0aCBwcm9wZXIgZGF0ZSBhbmQgcGVyY2VudGFnZSBoYW5kbGluZw0KdHNsYV9yYXcgPC0gdHNsYV9yYXcgJT4lDQogIG11dGF0ZSgNCiAgICAjIENvbnZlcnQgQ2xvc2UgRGF0ZSB0byAiWVlZWS1NTS1ERCIgZm9ybWF0DQogICAgYERhdGVgID0gZm9ybWF0KGFzLkRhdGUoYXMuY2hhcmFjdGVyKGBEYXRlYCksIG9yaWdpbiA9ICIxOTcwLTAxLTAxIiksICIlWS0lbS0lZCIpLA0KDQogICAgIyBFbnN1cmUgQ2xvc2UgaXMgYSBudW1iZXIgZm9ybWF0dGVkIHRvIDIgZGVjaW1hbCBwbGFjZXMNCiAgICBgQ2xvc2VgID0gbnVtYmVyKGFzLm51bWVyaWMoZ3N1YigiLCIsICIiLCBDbG9zZSkpLCBiaWcubWFyayA9ICIsIiwgZGVjaW1hbC5tYXJrID0gIi4iLCBhY2N1cmFjeSA9IDAuMDEpLA0KDQogICAgIyBDbGVhbiBhbmQgaGFuZGxlIHBlcmNlbnRhZ2UgY29sdW1ucw0KICAgIGFjcm9zcygzOjMsIH4gew0KICAgICAgdmFsdWUgPC0gZ3N1YigiWywlXFxzXSIsICIiLCAuKSAgIyBSZW1vdmUgJSwgY29tbWFzLCBhbmQgc3BhY2VzDQogICAgICBudW1lcmljX3ZhbHVlIDwtIHN1cHByZXNzV2FybmluZ3MoYXMubnVtZXJpYyh2YWx1ZSkpICAjIENvbnZlcnQgdG8gbnVtZXJpYw0KICAgICAgaWZlbHNlKA0KICAgICAgICAhaXMubmEobnVtZXJpY192YWx1ZSksIA0KICAgICAgICBwYXN0ZTAoZm9ybWF0KHJvdW5kKG51bWVyaWNfdmFsdWUqMTAwLCAyKSwgYmlnLm1hcmsgPSAiLCIsIHNjaWVudGlmaWMgPSBGQUxTRSksICIlIiksICAjIEZvcm1hdCB0byAyIGRlY2ltYWwgcGxhY2VzIGFuZCBhZGQgY29tbWFzDQogICAgICAgIC4NCiAgICAgICkNCiAgICB9KQ0KICApICU+JQ0KICBhcnJhbmdlKGRlc2MoYERhdGVgKSkgICMgU29ydCBieSBEYXRlIGZyb20gbmV3ZXN0IHRvIG9sZGVzdA0KDQojIERpc3BsYXkgdGhlIGZvcm1hdHRlZCBkYXRhDQppbnRlcmFjdGl2ZV9zdHIodHNsYV9yYXcpDQppbnRlcmFjdGl2ZV9wcmludCh0c2xhX3JhdykNCg0KIyBEaXNwbGF5IHRoZSB0YWJsZSB3aXRoIGNhcHRpb24NCmNhdCgiXG5cbiMjIyMgVFNMQSBZZWFybHkgUGVyZm9ybWFuY2UgKCIsIG1pbl95ZWFyLCAiLSIsIG1heF95ZWFyLCAiKVxuIiwgc2VwID0gIiIpDQpmb3JtYXRfZXF1YWxfd2lkdGhfZ3JvdXBlZCh0c2xhX3JhdywgZ3JvdXBpbmdfZmFjdG9yID0gMikNCiMgY2F0KCJcblxuIFNvdXJjZTogIiwgbnJ2JHNvdXJjZV90c2xhX3lhaG9vLCAiXG4iKQ0KDQpgYGANCg0KIyMjIFN1bW1hcnkNCg0KYGBge3IgdHNsYV9yYXdfc3VtbWFyeSwgZXZhbD1UUlVFLCBlY2hvPUZBTFNFfQ0KDQojIExvYWQgbmVjZXNzYXJ5IGxpYnJhcmllcw0KbGlicmFyeShkcGx5cikNCmxpYnJhcnkodGliYmxlKQ0KbGlicmFyeShrbml0cikNCmxpYnJhcnkoa2FibGVFeHRyYSkNCg0KaW50ZXJhY3RpdmVfc3RyKHRzbGFfcmF3KQ0KaW50ZXJhY3RpdmVfcHJpbnQodHNsYV9yYXcpDQoNCiMgRW5zdXJlIHRoZSBEYXRlIGNvbHVtbiBpcyBhIHByb3BlciBEYXRlIG9iamVjdCBhbmQgZXh0cmFjdCB0aGUgeWVhcg0KdHNsYV9yYXcgPC0gdHNsYV9yYXcgJT4lDQogIHNsaWNlKC0xKSAlPiUgIyBSZW1vdmUgdGhlIGZpcnN0IHJvdw0KICAjIG11dGF0ZShEYXRlID0gaWZlbHNlKHJvd19udW1iZXIoKSA9PSAxLCAiMjAyNS0wMS0wMSIsIERhdGUpKSAlPiUNCiAgbXV0YXRlKA0KICAgIERhdGUgPSBhcy5udW1lcmljKGZvcm1hdChhcy5EYXRlKERhdGUsIGZvcm1hdCA9ICIlWS0lbS0lZCIpLCAiJVkiKSksDQogICAgYDEtWWVhciBDQUdSYCA9IGFzLm51bWVyaWMoZ3N1YigiW14wLTkuLV0iLCAiIiwgYDEtWWVhciBDQUdSYCkpDQogICkNCg0KIyBTb3J0IGRhdGEgYnkgRGF0ZSBpbiBhc2NlbmRpbmcgb3JkZXINCnRzbGFfcmF3IDwtIHRzbGFfcmF3ICU+JQ0KICBhcnJhbmdlKERhdGUpDQoNCg0KIyBDYWxjdWxhdGUgdGhlIENBR1IgYW5kIGR5bmFtaWNhbGx5IGNyZWF0ZSBhIHZhcmlhYmxlIG5hbWUgd2l0aCB0aGUgZm9ybWF0IHRzbGFfY2Fncl92YWx1ZV9zPG1pbl95ZWFyPl9lPG1heF95ZWFyPg0KaW5pdGlhbF92YWx1ZSA8LSAxMDAgICMgQXNzdW1pbmcgYW4gaW5pdGlhbCBpbmRleCB2YWx1ZSBvZiAxMDANCmZpbmFsX3ZhbHVlIDwtIGluaXRpYWxfdmFsdWUgKiBwcm9kKDEgKyB0c2xhX3JhdyRgMS1ZZWFyIENBR1JgIC8gMTAwLCBuYS5ybSA9IFRSVUUpDQptaW5feWVhciA8LSBtaW4odHNsYV9yYXckRGF0ZSwgbmEucm0gPSBUUlVFKQ0KbWF4X3llYXIgPC0gbWF4KHRzbGFfcmF3JERhdGUsIG5hLnJtID0gVFJVRSkNCm51bV95ZWFycyA8LSBtYXhfeWVhciAtIG1pbl95ZWFyDQpjYWdyX3ZhbHVlIDwtIHJvdW5kKCgoZmluYWxfdmFsdWUgLyBpbml0aWFsX3ZhbHVlKV4oMSAvIG51bV95ZWFycykgLSAxKSAqIDEwMCwgMikNCnZhcl9uYW1lIDwtIHBhc3RlMCgidHNsYV9jYWdyX3ZhbHVlX3MiLCBtaW5feWVhciwgIl9lIiwgbWF4X3llYXIpDQphc3NpZ24odmFyX25hbWUsIGNhZ3JfdmFsdWUpDQoNCiMgQ29udmVydCBUU0xBIGRhdGEgdG8gbnVtZXJpYywgcmVtb3ZpbmcgYW55IHBlcmNlbnRhZ2Ugc2lnbnMNCmRhdGEgPC0gYXMubnVtZXJpYyhnc3ViKCIlIiwgIiIsIHRzbGFfcmF3JGAxLVllYXIgQ0FHUmApKQ0KDQojIENhbGN1bGF0ZSBzdGF0aXN0aWNzDQpjb3VudF9vYnNlcnZhdGlvbnMgPC0gc3VtKCFpcy5uYShkYXRhKSkNCm1lYW5fdmFsdWUgPC0gcm91bmQobWVhbihkYXRhLCBuYS5ybSA9IFRSVUUpLCAyKQ0KbWVkaWFuX3ZhbHVlIDwtIHJvdW5kKG1lZGlhbihkYXRhLCBuYS5ybSA9IFRSVUUpLCAyKQ0Kc2RfdmFsdWUgPC0gcm91bmQoc2QoZGF0YSwgbmEucm0gPSBUUlVFKSwgMikNCm1pbl9jYWdyX3JhbmdlIDwtIHJvdW5kKGNhZ3JfdmFsdWUgLSBzZF92YWx1ZSwgMikNCm1heF9jYWdyX3JhbmdlIDwtIHJvdW5kKGNhZ3JfdmFsdWUgKyBzZF92YWx1ZSwgMikNCm1pbl92YWx1ZSA8LSByb3VuZChtaW4oZGF0YSwgbmEucm0gPSBUUlVFKSwgMikNCm1heF92YWx1ZSA8LSByb3VuZChtYXgoZGF0YSwgbmEucm0gPSBUUlVFKSwgMikNCg0KIyBUYXJnZXQgUmF0ZSBBbmFseXNpcyAtIFJlZmVyIHRvICJQcmVmZXJyZWQgVGFyZ2V0cyIgb3IgaW5jbHVkZSBiZWxvdyBmb3IgaW5kaXZpZHVhbCBjaGFuZ2VzLg0KYWJvdmVfdGFyZ2V0X2luZmxhdGlvbiA8LSBzdW0oZGF0YSA+PSB0YXJnZXRfaW5mbGF0aW9uLCBuYS5ybSA9IFRSVUUpDQphYm92ZV90YXJnZXRfY29uc2VydmF0aXZlIDwtIHN1bShkYXRhID49IHRhcmdldF9jb25zZXJ2YXRpdmUsIG5hLnJtID0gVFJVRSkNCmFib3ZlX3RhcmdldF9tb2RlcmF0ZSA8LSBzdW0oZGF0YSA+PSB0YXJnZXRfbW9kZXJhdGUsIG5hLnJtID0gVFJVRSkNCmFib3ZlX3RhcmdldF9hZ2dyZXNzaXZlIDwtIHN1bShkYXRhID49IHRhcmdldF9hZ2dyZXNzaXZlLCBuYS5ybSA9IFRSVUUpDQoNCnBlcmNlbnRfYWJvdmVfdGFyZ2V0X2NvbnNlcnZhdGl2ZSA8LSByb3VuZCgoYWJvdmVfdGFyZ2V0X2NvbnNlcnZhdGl2ZSAvIGNvdW50X29ic2VydmF0aW9ucykgKiAxMDAsIDIpDQpwZXJjZW50X2Fib3ZlX3RhcmdldF9pbmZsYXRpb24gPC0gcm91bmQoKGFib3ZlX3RhcmdldF9pbmZsYXRpb24gLyBjb3VudF9vYnNlcnZhdGlvbnMpICogMTAwLCAyKQ0KcGVyY2VudF9hYm92ZV90YXJnZXRfbW9kZXJhdGUgPC0gcm91bmQoKGFib3ZlX3RhcmdldF9tb2RlcmF0ZSAvIGNvdW50X29ic2VydmF0aW9ucykgKiAxMDAsIDIpDQpwZXJjZW50X2Fib3ZlX3RhcmdldF9hZ2dyZXNzaXZlIDwtIHJvdW5kKChhYm92ZV90YXJnZXRfYWdncmVzc2l2ZSAvIGNvdW50X29ic2VydmF0aW9ucykgKiAxMDAsIDIpDQoNCiMgQ29tcGlsZSBzdGF0aXN0aWNzIGludG8gYSBsaXN0IGZvciBlYXN5IGNvbnZlcnNpb24gdG8gYSBkYXRhIGZyYW1lIHdpdGggZGVmaW5pdGlvbnMNCnRzbGFfcmF3X3N1bW1hcnkgPC0gdHJpYmJsZSgNCiAgflN0YXRpc3RpYywgflZhbHVlLCB+RGVmaW5pdGlvbiwNCiAgIkNvdW50IG9mIE9ic2VydmF0aW9ucyIsIGFzLmNoYXJhY3Rlcihjb3VudF9vYnNlcnZhdGlvbnMpLCAiVG90YWwgbnVtYmVyIG9mIGRhdGEgcG9pbnRzIGNvbGxlY3RlZCBvdmVyIHRoZSBzcGVjaWZpYyBwZXJpb2QuIiwNCiAgIkNBR1IiLCBwYXN0ZTAoY2Fncl92YWx1ZSwgIiUiKSwgIkNvbXBvdW5kIEF2ZXJhZ2UgR3Jvd3RoIFJhdGU7IG1lYW4gZ3Jvd3RoIHJhdGUgb3ZlciBhIHBlcmlvZCBpZiBpdCBoYWQgY29tcG91bmRlZCBhbnVhbGx5LiIsDQogICJNZWFuIiwgcGFzdGUwKG1lYW5fdmFsdWUsICIlIiksICJSZWZsZWN0cyB0aGUgZ2VuZXJhbCBwcmljZSBsZXZlbCBhbmQgb3ZlcmFsbCBncm93dGggcmF0ZS4iLA0KICAiTWVkaWFuIiwgcGFzdGUwKG1lZGlhbl92YWx1ZSwgIiUiKSwgIk1pZGRsZSB2YWx1ZSBvZiB0aGUgZGF0YSB3aGVuIG9yZGVyZWQgY2hyb25vbG9naWNhbGx5OyBjZW50cmFsIHRlbmRlbmN5IG1lYXN1cmUgbGVzcyBhZmZlY3RlZCBieSBleHRyZW1lIHZhbHVlcy4iLA0KICAiU3RhbmRhcmQgRGV2aWF0aW9uIChWb2xhdGlsaXR5KSIsIHBhc3RlMChzZF92YWx1ZSwgIiUiKSwgIlRoZSBkaXNwZXJzaW9uIG9mIHZhbHVlcyBmcm9tIHRoZSBtZWFuLCBpbmRpY2F0aW5nIHRoZSB2b2xhdGlsaXR5IG9mIHByaWNlIGNoYW5nZXMgYW5kIGVjb25vbWljIHN0YWJpbGl0eS4iLA0KICAiTWluIENBR1IgUmFuZ2UgKENBR1IgLSBTRCkiLCBwYXN0ZTAobWluX2NhZ3JfcmFuZ2UsICIlIiksICJMb3dlciBib3VuZGFyeSBvZiBleHBlY3RlZCBUU0xBIHJhbmdlOyBsb3dlc3QgZXN0aW1hdGUgb2YgdHlwaWNhbCBncm93dGggcmF0ZSBjb25zaWRlcmluZyBub3JtYWwgZmx1Y3R1YXRpb25zLiIsDQogICJNYXggQ0FHUiBSYW5nZSAoQ0FHUiArIFNEKSIsIHBhc3RlMChtYXhfY2Fncl9yYW5nZSwgIiUiKSwgIlVwcGVyIGJvdW5kYXJ5IG9mIGV4cGVjdGVkIFRTTEEgcmFuZ2U7IGhpZ2hlc3QgZXN0aW1hdGUgb2YgdHlwaWNhbCBncm93dGggcmF0ZSBjb25zaWRlcmluZyBub3JtYWwgZmx1Y3R1YXRpb25zLiIsDQogICJNaW5pbXVtIiwgcGFzdGUwKG1pbl92YWx1ZSwgIiUiKSwgIkxvd2VzdCBncm93dGggcmF0ZS4iLA0KICAiTWF4aW11bSIsIHBhc3RlMChtYXhfdmFsdWUsICIlIiksICJIaWdoZXN0IGdyb3d0aCByYXRlLiIsDQogICJQZXJjZW50IEFib3ZlIEluZmxhdGlvbiBUYXJnZXQiLCBwYXN0ZTAocGVyY2VudF9hYm92ZV90YXJnZXRfaW5mbGF0aW9uLCAiJSIpLCAiUGVyY2VudGFnZSBvZiB2YWx1ZXMgYWJvdmUgdGhlIGluZmxhdGlvbiB0YXJnZXQgc3BlY2lmaWVkIGluIFByZWZlcnJlZCBUYXJnZXRzIHNlY3Rpb24uIiwNCiAgIlBlcmNlbnQgQWJvdmUgQ29uc2VydmF0aXZlIFRhcmdldCIsIHBhc3RlMChwZXJjZW50X2Fib3ZlX3RhcmdldF9jb25zZXJ2YXRpdmUsICIlIiksICJQZXJjZW50YWdlIG9mIHZhbHVlcyBhYm92ZSB0aGUgY29uc2VydmF0aXZlIHRhcmdldCBzcGVjaWZpZWQgaW4gUHJlZmVycmVkIFRhcmdldHMgc2VjdGlvbi4iLA0KICAiUGVyY2VudCBBYm92ZSBNb2RlcmF0ZSBUYXJnZXQiLCBwYXN0ZTAocGVyY2VudF9hYm92ZV90YXJnZXRfbW9kZXJhdGUsICIlIiksICJQZXJjZW50YWdlIG9mIHZhbHVlcyBhYm92ZSB0aGUgbW9kZXJhdGUgdGFyZ2V0IHNwZWNpZmllZCBpbiBQcmVmZXJyZWQgVGFyZ2V0cyBzZWN0aW9uLiIsDQogICJQZXJjZW50IEFib3ZlIEFnZ3Jlc3NpdmUgVGFyZ2V0IiwgcGFzdGUwKHBlcmNlbnRfYWJvdmVfdGFyZ2V0X2FnZ3Jlc3NpdmUsICIlIiksICJQZXJjZW50YWdlIG9mIHZhbHVlcyBhYm92ZSB0aGUgYWdncmVzc2l2ZSB0YXJnZXQgc3BlY2lmaWVkIGluIFByZWZlcnJlZCBUYXJnZXRzIHNlY3Rpb24uIg0KKQ0KDQojIENvbnZlcnQgdG8gY2hhcmFjdGVyIHRvIGF2b2lkIGF1dG9tYXRpYyBkZWNpbWFsIHBvaW50cyBvbiB3aG9sZSBudW1iZXJzDQp0c2xhX3Jhd19zdW1tYXJ5IDwtIHRzbGFfcmF3X3N1bW1hcnkgJT4lDQogIG11dGF0ZShhY3Jvc3MoZXZlcnl0aGluZygpLCBhcy5jaGFyYWN0ZXIpKQ0KDQojIERpc3BsYXkgZm9ybWF0dGVkIHRhYmxlDQpjYXQoIlxuXG4jIyMjIEFubnVhbCBHcm93dGggUmF0ZSBTdW1tYXJ5ICgiLCBtaW5feWVhciwgIi0iLCBtYXhfeWVhciwgIilcbiIsIHNlcCA9ICIiKQ0KZm9ybWF0XzNjb2xfY3VzdG9tX3dpZHRocyh0c2xhX3Jhd19zdW1tYXJ5LCBjb2wxX3dpZHRoID0gIjIwZW0iLCBjb2wyX3dpZHRoID0gIjEwZW0iLCBjb2wzX3dpZHRoID0gIjQwZW0iKSANCg0KIyBWaWV3KHRzbGFfcmF3X3N1bW1hcnkpDQppbnRlcmFjdGl2ZV9zdHIodHNsYV9yYXdfc3VtbWFyeSkNCg0KYGBgDQoNClRTTEEncyBJbmRleCBleGhpYml0cyBhIGByIGlmKGNhZ3JfdmFsdWUgPiB0YXJnZXRfYWdncmVzc2l2ZSkgImFnZ3Jlc3NpdmUiIGVsc2UgaWYoY2Fncl92YWx1ZSA+IHRhcmdldF9tb2RlcmF0ZSkgIm1vZGVyYXRlIiBlbHNlIGlmKGNhZ3JfdmFsdWUgPiB0YXJnZXRfY29uc2VydmF0aXZlKSAiY29uc2VydmF0aXZlIiBlbHNlIGlmKGNhZ3JfdmFsdWUgPiB0YXJnZXRfaW5mbGF0aW9uKSAiYmFzZWxpbmUiIGVsc2UgImRpc2FwcG9pbnRpbmciYCBDQUdSIGF0IGByIGNhZ3JfdmFsdWVgJSwgYHIgaWYoY2Fncl92YWx1ZSA8IG1lYW5fdmFsdWUpICJsb3dlciB0aGFuIiBlbHNlICJoaWdoZXIgdGhhbiJgIHRoZSBtZWFuIGdyb3d0aCByYXRlIG9mIGByIG1lYW5fdmFsdWVgJSwgcmVmbGVjdGluZyB0aGUgaW1wYWN0IG9mIHNob3J0LXRlcm0gdm9sYXRpbGl0eSBhbmQgYHIgaWYoY2Fncl92YWx1ZSA+IG1lYW5fdmFsdWUpICJkZWNsaW5lcyIgZWxzZSAiZ3Jvd3RoIHNwaWtlcyJgLiBUaGUgbWVkaWFuIHJldHVybiBvZiBgciBtZWRpYW5fdmFsdWVgJSBpbmRpY2F0ZXMgdGhhdCBtb3JlIHRoYW4gaGFsZiBvZiB0aGUgb2JzZXJ2ZWQgeWVhcnMgZXhwZXJpZW5jZWQgcmV0dXJucyBgciBpZihjYWdyX3ZhbHVlIDwgbWVkaWFuX3ZhbHVlKSAiYWJvdmUiIGVsc2UgImJlbG93ImAgdGhlIG1lYW4uIFRoZSByZWxhdGlvbnNoaXAgYmV0d2VlbiB0aGUgQ0FHUiBhbmQgdGhlIG1lZGlhbiBncm93dGggcmF0ZSBzdWdnZXN0cyB0aGF0IHN1c3RhaW5lZCBwZXJpb2RzIG9mIGFib3ZlLW1lZGlhbiBncm93dGggaGF2ZSBleGVydGVkIGN1bXVsYXRpdmUgYHIgaWYoY2Fncl92YWx1ZSA8IG1lZGlhbl92YWx1ZSkgInVwd2FyZCBwcmVzc3VyZSIgZWxzZSAiZG93bndhcmQgcHJlc3N1cmUiYCBvbiBvdmVyYWxsIHByaWNlIGxldmVscy4gVGhpcyByZWxhdGlvbnNoaXAgaGlnaGxpZ2h0cyBhIGRpc3RyaWJ1dGlvbiB3aXRoIG5vdGFibGUgZXh0cmVtZXMgb24gdGhlIGByIGlmKGNhZ3JfdmFsdWUgPCBtZWFuX3ZhbHVlKSAiaGlnaGVyIiBlbHNlICJsb3dlciJgIGVuZCwgcmVmbGVjdGluZyBgciBpZihjYWdyX3ZhbHVlIDwgbWVhbl92YWx1ZSkgInBvc2l0aXZlIiBlbHNlICJuZWdhdGl2ZSJgIHNrZXduZXNzLiBUaGlzIGByIGlmKGNhZ3JfdmFsdWUgPCBtZWRpYW5fdmFsdWUpICJwb3NpdGl2ZSIgZWxzZSAibmVnYXRpdmUiYCBza2V3bmVzcyBpbXBsaWVzIHRoYXQgd2hpbGUgbW9yZSB0aGFuIGhhbGYgb2YgdGhlIG9ic2VydmVkIHllYXJzIGV4cGVyaWVuY2VkIHJldHVybnMgYHIgaWYoY2Fncl92YWx1ZSA8IG1lZGlhbl92YWx1ZSkgImFib3ZlIHRoZSBtZWFuLCBkb3dudHVybnMgY2FuIGJlIHNldmVyZSIgZWxzZSAiYmVsb3cgdGhlIG1lYW4sIHVwdHVybnMgY2FuIGJlIHNpZ25pZmljYW50ImAuIEhvd2V2ZXIsIHRoZSBtYXJrZXQgaGFzIGhpc3RvcmljYWxseSBwcm92aWRlZCBzdWJzdGFudGlhbCBgciBpZihjYWdyX3ZhbHVlIDwgbWVkaWFuX3ZhbHVlKSAidXBzaWRlIHBvdGVudGlhbCIgZWxzZSAiZG93bnNpZGUgcmlzayJgLiBBZGRpdGlvbmFsbHksIHRoZSBmYWN0IHRoYXQgYHIgcGVyY2VudF9hYm92ZV90YXJnZXRfaW5mbGF0aW9uYCUgb2YgdGhlIHllYXJzIGV4Y2VlZGVkIHRoZSBpbmZsYXRpb24gdGFyZ2V0IGByIGlmIChwZXJjZW50X2Fib3ZlX3RhcmdldF9pbmZsYXRpb24gPiA3MCkgInJlaW5mb3JjZXMgVFNMQSdzIGVmZmVjdGl2ZW5lc3MgYXMgYSBzdHJvbmcgbG9uZy10ZXJtIGhlZGdlIiBlbHNlIGlmIChwZXJjZW50X2Fib3ZlX3RhcmdldF9pbmZsYXRpb24gPiA2MCkgInJlaW5mb3JjZXMgVFNMQSdzIGVmZmVjdGl2ZW5lc3MgYXMgYSBsb25nLXRlcm0gaGVkZ2UiIGVsc2UgaWYgKHBlcmNlbnRfYWJvdmVfdGFyZ2V0X2luZmxhdGlvbiA+IDUwKSAicXVlc3Rpb25zIFRTTEEncyBlZmZlY3RpdmVuZXNzICBhcyBhIGxvbmctdGVybSBoZWRnZSIgZWxzZSAidW5kZXJtaW5lcyBUU0xBJ3MgZWZmZWN0aXZlbmVzcyBhcyBhIGxvbmctdGVybSBoZWRnZSJgIGFnYWluc3QgaW5mbGF0aW9uLg0KDQpUaGUgc3RhbmRhcmQgZGV2aWF0aW9uIG9mIGByIHNkX3ZhbHVlYCUgYHIgaWYoc2RfdmFsdWUgPiAyMCkgImluZGljYXRlcyBleHRyZW1lIHZvbGF0aWxpdHksIHJlZmxlY3Rpbmcgc3Vic3RhbnRpYWwgZmx1Y3R1YXRpb25zIGluIGVxdWl0eSBtYXJrZXRzIiBlbHNlIGlmKHNkX3ZhbHVlID4gMTUpICJ1bmRlcnNjb3JlcyBzaWduaWZpY2FudCB2b2xhdGlsaXR5LCBhIGNvbW1vbiBmZWF0dXJlIG9mIGVxdWl0eSBtYXJrZXRzIiBlbHNlICJzdWdnZXN0cyBtb2RlcmF0ZSB2b2xhdGlsaXR5LCB0eXBpY2FsIG9mIHJlbGF0aXZlbHkgc3RhYmxlIG1hcmtldHMiYC4gVGhlIGByIHJhbmdlX3JhdGlvIDwtIChtYXhfdmFsdWUgLSBtaW5fdmFsdWUpIC8gc2RfdmFsdWU7IGlmKHJhbmdlX3JhdGlvID4gNSkgImhpZ2hseSB2b2xhdGlsZSIgZWxzZSBpZihyYW5nZV9yYXRpbyA+IDMpICJub3RhYmxlIiBlbHNlICJjb21wYXJhdGl2ZWx5IHN0YWJsZSJgIHJhbmdlIG9mIGFubnVhbCByZXR1cm5zLCBzcGFubmluZyBmcm9tIGByIG1pbl92YWx1ZWAlIHRvIGByIG1heF92YWx1ZWAlLCBgciBpZihyYW5nZV9yYXRpbyA+IDUpICJpbGx1c3RyYXRlcyBhIGhpZ2hseSB2b2xhdGlsZSBtYXJrZXQgZW52aXJvbm1lbnQsIHBhcnRseSBkdWUgdG8gaXRzIGNvbXBvc2l0aW9uLCB3aXRoIHRoZSBwb3RlbnRpYWwgZm9yIGJvdGggZXh0cmVtZSBnYWlucyBhbmQgbG9zc2VzIiBlbHNlIGlmKHJhbmdlX3JhdGlvID4gMykgImhpZ2hsaWdodHMgbm90YWJsZSBtYXJrZXQgdmFyaWFiaWxpdHksIHBhcnRseSBkdWUgdG8gaXRzIGNvbXBvc2l0aW9uLCAgcmVmbGVjdGluZyBib3RoIG9wcG9ydHVuaXRpZXMgYW5kIHJpc2tzIiBlbHNlICJpbmRpY2F0ZXMgYSBjb21wYXJhdGl2ZWx5IHN0YWJsZSBtYXJrZXQsIHBhcnRseSBkdWUgdG8gaXRzIGNvbXBvc2l0aW9uLCB3aXRoIGxlc3MgZXh0cmVtZSBhbm51YWwgZmx1Y3R1YXRpb25zImAuIA0KDQpGb3IgVFNMQSB0byBiZSBjb25zaWRlcmVkIGEgaGlnaC1wZXJmb3JtaW5nIGFuZCByZXNpbGllbnQgbG9uZy10ZXJtIGludmVzdG1lbnQsIGl0IHdvdWxkIGJlIGlkZWFsIHRvIGV4Y2VlZCB0aGUgYWdncmVzc2l2ZSB0YXJnZXQgIChlLmcuLCBgciAodGFyZ2V0X2FnZ3Jlc3NpdmUgLSB0YXJnZXRfaW5mbGF0aW9uKWAlIGFubnVhbGl6ZWQgcmV0dXJucywgYWNjb3VudGluZyBmb3IgaGlnaGVyIGluZmxhdGlvbi1hZGp1c3RlZCBwZXJmb3JtYW5jZSBleHBlY3RhdGlvbnMpIGluIGF0IGxlYXN0IDQwJS01MCUgb2YgdGhlIHllYXJzLiBUaGlzIHJhbmdlIHJlZmxlY3RzIHRoZSBwb3RlbnRpYWwgZm9yIHN0cm9uZyB1cHNpZGUgaW4gbWFueSB5ZWFycyB3aGlsZSBiYWxhbmNpbmcgdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBtYXJrZXRzIGRvIGV4cGVyaWVuY2UgZG93bnR1cm5zLiBUaGUgZmFjdCB0aGF0IGByIHBlcmNlbnRfYWJvdmVfdGFyZ2V0X2FnZ3Jlc3NpdmVgJSBvZiB0aGUgeWVhcnMgZXhjZWVkZWQgdGhlIGFnZ3Jlc3NpdmUgdGFyZ2V0IGByIGlmKHBlcmNlbnRfYWJvdmVfdGFyZ2V0X2FnZ3Jlc3NpdmUgPiA1MCkgImluZGljYXRlcyBjb25zaXN0ZW50IGFuZCByb2J1c3QgZ3Jvd3RoLCBtYWtpbmcgVFNMQSBhIHN0cm9uZyBvcHRpb24gZm9yIHRob3NlIHNlZWtpbmcgYWdncmVzc2l2ZSBpbnZlc3RtZW50cy4iIGVsc2UgaWYocGVyY2VudF9hYm92ZV90YXJnZXRfYWdncmVzc2l2ZSA+IDQwKSAic3VnZ2VzdHMgdGhhdCB3aGlsZSBub3QgY29uc2lzdGVudCwgVFNMQSBoYXMgaGlzdG9yaWNhbGx5IHByb3ZpZGVkIHJvYnVzdCBncm93dGggb3ZlciB0aGUgbG9uZyB0ZXJtLCBtYWtpbmcgaXQgYSB2aWFibGUgaW52ZXN0bWVudCBmb3IgdGhvc2Ugd2l0aCBhIGhpZ2hlciByaXNrIHRvbGVyYW5jZS4iIGVsc2UgInJhaXNlcyBjb25jZXJucyBhYm91dCBUU0xBJ3MgYWJpbGl0eSB0byBtZWV0IGFnZ3Jlc3NpdmUgZ3Jvd3RoIHRhcmdldHMsIG1ha2luZyBpdCBsZXNzIHN1aXRhYmxlIGZvciBpbnZlc3RvcnMgd2l0aCBoaWdoZXIgcmlzayB0b2xlcmFuY2UuImANCg0KIyMjIEdyYXBoDQoNCmBgYHtyIHRzbGFfcmF3X2dyYXBoLCBmaWcud2lkdGg9MTAsIGZpZy5oZWlnaHQ9NywgZXZhbD1UUlVFLCBlY2hvPUZBTFNFfQ0KDQojIExvYWQgbmVjZXNzYXJ5IGxpYnJhcmllcw0KbGlicmFyeShnZ3Bsb3QyKQ0KbGlicmFyeShkcGx5cikNCg0KIyBDb252ZXJ0IGAxLVllYXIgQ0FHUmAgdG8gbnVtZXJpYyBmb3IgcGxvdHRpbmcNCnRzbGFfcmF3IDwtIHRzbGFfcmF3ICU+JQ0KICBtdXRhdGUoDQogICAgYERhdGVgID0gYXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIoYERhdGVgKSksICAjIEVuc3VyZSBEYXRlIGlzIG51bWVyaWMNCiAgICBgMS1ZZWFyIENBR1JgID0gYXMubnVtZXJpYyhnc3ViKCIlIiwgIiIsIGAxLVllYXIgQ0FHUmApKQ0KICApDQoNCiMgRmluZCB0aGUgbWluaW11bSBhbmQgbWF4aW11bSB4LXZhbHVlIGluIHlvdXIgZGF0YQ0KbWF4X3ggPC0gbWF4KGFzLmludGVnZXIodHNsYV9yYXckRGF0ZSksIG5hLnJtID0gVFJVRSkNCm1pbl94IDwtIG1pbihhcy5pbnRlZ2VyKHRzbGFfcmF3JERhdGUpLCBuYS5ybSA9IFRSVUUpDQppbnRlcmFjdGl2ZV9wcmludChtYXhfeCkgICMgVGVzdA0KaW50ZXJhY3RpdmVfcHJpbnQobWluX3gpICAjIFRlc3QNCg0KIyBGaW5kIHRoZSBtaW5pbXVtIGFuZCBtYXhpbXVtIHllYXINCm1pbl95ZWFyIDwtIG1pbih0c2xhX3JhdyREYXRlLCBuYS5ybSA9IFRSVUUpDQptYXhfeWVhciA8LSBtYXgodHNsYV9yYXckRGF0ZSwgbmEucm0gPSBUUlVFKQ0KaW50ZXJhY3RpdmVfcHJpbnQobWluX3llYXIpDQppbnRlcmFjdGl2ZV9wcmludChtYXhfeWVhcikNCg0KDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KIyMgUExPVCBGVUxMIFdJVEhPVVQgTElNSVRTDQoNCiMgRGVmaW5lIHN0YXJ0IGFuZCBlbmQgeWVhcnMNCnN0YXJ0X3llYXIgPC0gYXMubnVtZXJpYyhtaW5feWVhcikNCmVuZF95ZWFyIDwtIDIwMjQNCnllYXJfcmFuZ2UgPC0gZW5kX3llYXIgLSBzdGFydF95ZWFyICsgMSAgIyBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiB5ZWFycw0KDQojIERlZmluZSBicmVha3Mgcm91bmRlZCBhcHByb3ByaWF0ZWx5DQpsaW1pdHNfc3RhcnRfeWVhciA8LSBmbG9vcihzdGFydF95ZWFyIC8gMikgKiAyICAjIFJvdW5kIGRvd24gdG8gdGhlIG5lYXJlc3QgbXVsdGlwbGUgb2YgNQ0KbGltaXRzX2VuZF95ZWFyIDwtIGNlaWxpbmcoZW5kX3llYXIgLyAyKSAqIDIgICAjIFJvdW5kIHVwIHRvIHRoZSBuZWFyZXN0IG11bHRpcGxlIG9mIDUNCg0KIyBDcmVhdGUgZHluYW1pYyB0aXRsZSBhbmQgY2FwdGlvbg0KZHluYW1pY190aXRsZSA8LSBwYXN0ZTAoIkFubnVhbCBHcm93dGggUmF0ZXMgT3ZlciAiLHllYXJfcmFuZ2UsICIgWWVhcnMgKCIsIHN0YXJ0X3llYXIsICItIiwgZW5kX3llYXIsICIpIikNCmR5bmFtaWNfY2FwdGlvbiA8LSBwYXN0ZTAoIlRTTEEgQW5udWFsIEdyb3d0aCBSYXRlcywgRGF0YSBQZXJpb2QgKCIsIG1pbl95ZWFyLCAi4oCTIiwgbWF4X3llYXIsICIpIikNCg0KIyBDcmVhdGUgdGhlIGZ1bGwsIG5vbi1maWx0ZXJlZCB4LWF4aXMgcGxvdCB3aXRoIGR5bmFtaWMgeCBwbGFjZW1lbnQgZm9yIGFubm90YXRpb25zDQpwMSA8LSBnZ3Bsb3QodHNsYV9yYXcsIGFlcyh4ID0gYXMuaW50ZWdlcihEYXRlKSwgeSA9IGAxLVllYXIgQ0FHUmApKSArDQogIA0KICAjIEFkZCBzaGFkZWQgYXJlYXMgZm9yIGJhY2tncm91bmQgZWZmZWN0DQogIGdlb21fcmVjdChhZXMoeG1pbiA9IC1JbmYsIHhtYXggPSBJbmYsIHltaW4gPSB0YXJnZXRfYWdncmVzc2l2ZSwgeW1heCA9IEluZiksIGZpbGwgPSAibGlnaHRncmVlbiIsIGFscGhhID0gMC4wMjUpICsNCiAgZ2VvbV9yZWN0KGFlcyh4bWluID0gLUluZiwgeG1heCA9IEluZiwgeW1pbiA9IHRhcmdldF9jb25zZXJ2YXRpdmUsIHltYXggPSB0YXJnZXRfYWdncmVzc2l2ZSksIGZpbGwgPSAib3JhbmdlIiwgYWxwaGEgPSAwLjAyNSkgKw0KICBnZW9tX3JlY3QoYWVzKHhtaW4gPSAtSW5mLCB4bWF4ID0gSW5mLCB5bWluID0gLUluZiwgeW1heCA9IHRhcmdldF9jb25zZXJ2YXRpdmUpLCBmaWxsID0gImxpZ2h0Y29yYWwiLCBhbHBoYSA9IDAuMDI1KSArDQogIA0KICAjIFBsb3QgbGluZXMsIHBvaW50cywgYW5kIGFubm90YXRpb25zIG9uIHRvcCBvZiBzaGFkZWQgYXJlYXMNCiAgZ2VvbV9saW5lKGNvbG9yID0gIiM0QjAwODIiLCBzaXplID0gMS4wKSArICAgICAgICMgRGFyayBwdXJwbGUgbGluZSANCiAgZ2VvbV9wb2ludChjb2xvciA9ICIjNEIwMDgyIiwgc2l6ZSA9IDEuNSkgKyAgICAgICAgIyBEYXJrIHB1cnBsZSBwb2ludHMgDQogIA0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSB0YXJnZXRfYWdncmVzc2l2ZSwgY29sb3IgPSAiZGFya2JsdWUiLCBsaW5ldHlwZSA9ICJzb2xpZCIpICsNCiAgIyBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSB0YXJnZXRfbW9kZXJhdGUsIGNvbG9yID0gImRhcmtibHVlIiwgbGluZXR5cGUgPSAic29saWQiKSArDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IHRhcmdldF9jb25zZXJ2YXRpdmUsIGNvbG9yID0gImRhcmtibHVlIiwgbGluZXR5cGUgPSAic29saWQiKSArDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IHRhcmdldF9pbmZsYXRpb24sIGNvbG9yID0gImRhcmtyZWQiLCBsaW5ldHlwZSA9ICJkYXNoZWQiKSArDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IGNhZ3JfdmFsdWUsIGNvbG9yID0gImRhcmtyZWQiLCBsaW5ldHlwZSA9ICJkYXNoZWQiKSArDQogIA0KICAjIER5bmFtaWMgcmlnaHQtYWxpZ25lZCBwbGFjZW1lbnQgZm9yIGFubm90YXRpb25zDQogIGFubm90YXRlKCJ0ZXh0IiwgeCA9IEluZiwgeSA9IHRhcmdldF9hZ2dyZXNzaXZlLCBsYWJlbCA9ICJBZ2dyZXNzaXZlL0NvbnNlcnZhdGl2ZSIsIA0KICAgICAgICAgICBoanVzdCA9IDEsIHZqdXN0ID0gLTAuNTAsIGNvbG9yID0gImRhcmtibHVlIiwgc2l6ZSA9IDQpICsNCiAgIyBhbm5vdGF0ZSgidGV4dCIsIHggPSBJbmYsIHkgPSB0YXJnZXRfbW9kZXJhdGUsIGxhYmVsID0gIk1vZGVyYXRlIiwgDQogICMgICAgICAgICBoanVzdCA9IDEsIHZqdXN0ID0gLTAuNTAsIGNvbG9yID0gImRhcmtibHVlIiwgc2l6ZSA9IDQpICsNCiAgYW5ub3RhdGUoInRleHQiLCB4ID0gSW5mLCB5ID0gdGFyZ2V0X2NvbnNlcnZhdGl2ZSwgbGFiZWwgPSAiIiwgDQogICAgICAgICAgIGhqdXN0ID0gMSwgdmp1c3QgPSAtMC41MCwgY29sb3IgPSAiZGFya2JsdWUiLCBzaXplID0gNCkgKw0KICBhbm5vdGF0ZSgidGV4dCIsIHggPSBJbmYsIHkgPSB0YXJnZXRfaW5mbGF0aW9uLCBsYWJlbCA9ICJJbmZsYXRpb24iLCANCiAgICAgICAgICAgaGp1c3QgPSAxLCB2anVzdCA9ICsxLjEwLCBjb2xvciA9ICJkYXJrcmVkIiwgc2l6ZSA9IDQpICsNCiAgYW5ub3RhdGUoInRleHQiLCB4ID0gSW5mLCB5ID0gY2Fncl92YWx1ZSwgbGFiZWwgPSAiQ0FHUiIsIA0KICAgICAgICAgICBoanVzdCA9IDEsIHZqdXN0ID0gLTAuNTAsIGNvbG9yID0gImRhcmtyZWQiLCBzaXplID0gNCkgKyANCg0KICBsYWJzKA0KICAgIHRpdGxlID0gZHluYW1pY190aXRsZSwNCiAgICB4ID0gIlllYXIiLA0KICAgIHkgPSAiR3Jvd3RoIFJhdGUgKCUpIiwNCiAgICBjYXB0aW9uID0gZHluYW1pY19jYXB0aW9uDQogICkgKw0KDQogIHNjYWxlX3hfY29udGludW91cygNCiAgICBsaW1pdHMgPSBjKHN0YXJ0X3llYXIsIGVuZF95ZWFyICsgMSksICMgUmVzdHJpY3RzIHgtYXhpcyBkYXRhIA0KICAgIGJyZWFrcyA9IHNlcShsaW1pdHNfc3RhcnRfeWVhciwgbGltaXRzX2VuZF95ZWFyLCAyKSAjIFNldHMgTWFqb3IgeC1heGlzICANCiAgKSArICAjIFJlc3RyaWN0ICYgU2V0IE1ham9yIHgtYXhpcyBsaW5lcyANCiAgICANCiAgdGhlbWVfbWluaW1hbCgpICsNCiAgdGhlbWUoDQogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSwgc2l6ZSA9IDIwKSwgICAgICAgICAjIExhcmdlciB0aXRsZSBmb250DQogICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCksICAgICAgICAgICAgICAgICAgICAjIExhcmdlciB4LWF4aXMgbGFiZWwgZm9udA0KICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQpLCAgICAgICAgICAgICAgICAgICAgIyBMYXJnZXIgeS1heGlzIGxhYmVsIGZvbnQNCiAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEsIHNpemUgPSAxNCksICAjIExhcmdlciB4LWF4aXMgdGV4dA0KICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCksICAgICAgICAgICAgICAgICAgICAgIyBMYXJnZXIgeS1heGlzIHRleHQNCiAgICBwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9saW5lKGxpbmV0eXBlID0gImRvdHRlZCIsIGNvbG9yID0gImJsYWNrIiksICAgICAgICAgIyBNYWpvciBncmlkIGxpbmVzDQogICAgcGFuZWwuZ3JpZC5taW5vci54ID0gZWxlbWVudF9ibGFuaygpLCAjIGVsZW1lbnRfbGluZShjb2xvciA9ICJncmV5ODAiKSAgIyBNaW5vciB4IGdyaWQgbGluZXMgZm9yIGVhY2ggeWVhcg0KICAgICMgcGFuZWwuYm9yZGVyID0gZWxlbWVudF9yZWN0KGNvbG9yID0gImRhcmtncmV5IiwgZmlsbCA9IE5BLCBzaXplID0gMS4wKSAgIyBEYXJrIGJvcmRlciBhcm91bmQgdGhlIHBsb3QNCiAgICBheGlzLnRpY2tzLmxlbmd0aCA9IHVuaXQoLTAuMjUsICJjbSIpLCAgICAgICAgICAgICAgICAgICAgICAjIEluY3JlYXNlIHRpY2sgbGVuZ3RoDQogICAgYXhpcy50aWNrcyA9IGVsZW1lbnRfbGluZShjb2xvciA9ICJibGFjayIsIHNpemUgPSAwLjUwKSwgIyBEYXJrZXIgdGlja3MNCiAgICBheGlzLmxpbmUueCA9IGVsZW1lbnRfbGluZShjb2xvciA9ICJibGFjayIsIHNpemUgPSAwLjc1KSwgICMgRGFyayBib3R0b20gYm9yZGVyDQogICAgYXhpcy5saW5lLnkgPSBlbGVtZW50X2xpbmUoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMC43NSkgICAjIERhcmsgbGVmdCBib3JkZXINCiAgKQ0KDQpwcmludChwMSkNCg0KDQoNCmBgYA0KDQoNCiMjIFRTTEEgQ0FHUg0KDQojIyMgRGF0YQ0KDQpgYGB7ciB0c2xhX3Jhd19nciwgZXZhbD1UUlVFLCBlY2hvPUZBTFNFfQ0KDQojIFZpZXcobnJ0JHRzbGFfcmF3X2dyKQ0KaW50ZXJhY3RpdmVfc3RyKG5ydCR0c2xhX3Jhd19ncikNCg0KbGlicmFyeShkcGx5cikNCmxpYnJhcnkobHVicmlkYXRlKSAgIyBGb3IgZGF0ZSBtYW5pcHVsYXRpb24NCmxpYnJhcnkoc2NhbGVzKQ0KbGlicmFyeShzdHJpbmdyKQ0KDQojIFVwZGF0ZSBkYXRhIGZyYW1lIHdpdGggcHJvcGVyIGRhdGUgYW5kIHBlcmNlbnRhZ2UgaGFuZGxpbmcNCnRzbGFfcmF3X2dyIDwtIG5ydCR0c2xhX3Jhd19nciAlPiUNCiAgbXV0YXRlKA0KICAgICMgQ29udmVydCBDbG9zZSBEYXRlIHRvICJZWVlZLU1NLUREIiBmb3JtYXQNCiAgICBgRGF0ZWAgPSBmb3JtYXQoYXMuRGF0ZShhcy5jaGFyYWN0ZXIoYERhdGVgKSwgb3JpZ2luID0gIjE5NzAtMDEtMDEiKSwgIiVZLSVtLSVkIiksDQogICAgDQogICAgIyBFbnN1cmUgQ2xvc2UgaXMgYSBudW1iZXIgZm9ybWF0dGVkIHRvIDIgZGVjaW1hbCBwbGFjZXMNCiAgICBgQ2xvc2VgID0gbnVtYmVyKGFzLm51bWVyaWMoZ3N1YigiLCIsICIiLCBDbG9zZSkpLCBiaWcubWFyayA9ICIsIiwgZGVjaW1hbC5tYXJrID0gIi4iLCBhY2N1cmFjeSA9IDAuMDEpLA0KDQogICAgIyBDbGVhbiBhbmQgaGFuZGxlIHBlcmNlbnRhZ2UgY29sdW1ucw0KICAgIGFjcm9zcygzOjExLCB+IHsNCiAgICAgIHZhbHVlIDwtIGdzdWIoIlssJVxcc10iLCAiIiwgLikgICMgUmVtb3ZlICUsIGNvbW1hcywgYW5kIHNwYWNlcw0KICAgICAgbnVtZXJpY192YWx1ZSA8LSBzdXBwcmVzc1dhcm5pbmdzKGFzLm51bWVyaWModmFsdWUpKSAgIyBDb252ZXJ0IHRvIG51bWVyaWMNCiAgICAgIGlmZWxzZSgNCiAgICAgICAgIWlzLm5hKG51bWVyaWNfdmFsdWUpLCANCiAgICAgICAgcGFzdGUwKGZvcm1hdChyb3VuZChudW1lcmljX3ZhbHVlKjEwMCwgMiksIGJpZy5tYXJrID0gIiwiLCBzY2llbnRpZmljID0gRkFMU0UpLCAiJSIpLCAgIyBGb3JtYXQgdG8gMiBkZWNpbWFsIHBsYWNlcyBhbmQgYWRkIGNvbW1hcw0KICAgICAgICAuDQogICAgICApDQogICAgfSkNCiAgKSAlPiUNCiAgYXJyYW5nZShkZXNjKGBEYXRlYCkpICAjIFNvcnQgYnkgRGF0ZSBmcm9tIG5ld2VzdCB0byBvbGRlc3QNCg0KIyBDcmVhdGUgdHNsYV9yYXdfZ3I6IENHUg0KdHNsYV9yYXdfY2dyIDwtIHRzbGFfcmF3X2dyICU+JQ0KICBzZWxlY3QoYERhdGVgLCBgQ2xvc2VgLCBgMS1ZZWFyIENBR1JgLCBjb250YWlucyAoIkNHUiIpKQ0KDQojIENyZWF0ZSB0c2xhX3Jhd19ncjogQ0FHUg0KdHNsYV9yYXdfY2FnciA8LSB0c2xhX3Jhd19nciAlPiUNCiAgc2VsZWN0KGBEYXRlYCwgYENsb3NlYCwgY29udGFpbnMgKCJDQUdSIikpDQoNCiMgRGlzcGxheSBib3RoIHRhYmxlcyBmb3IgY29uZmlybWF0aW9uDQppbnRlcmFjdGl2ZV9wcmludCh0c2xhX3Jhd19jZ3IpDQppbnRlcmFjdGl2ZV9wcmludCh0c2xhX3Jhd19jYWdyKQ0KDQojIE9wdGlvbmFsOiBQcmludCB0YWJsZSBzdW1tYXJpZXMNCmludGVyYWN0aXZlX3N0cih0c2xhX3Jhd19jZ3IpDQppbnRlcmFjdGl2ZV9zdHIodHNsYV9yYXdfY2FncikNCg0KIyBEaXNwbGF5IGNhcHRpb25zIGZvciBlYWNoIHRhYmxlDQojIGNhdCgiXG5cbiMjIyMgQ3VtdWxhdGl2ZSBHcm93dGggUmF0ZXMgKCIsIG1pbl95ZWFyLCAiLSIsIG1heF95ZWFyLCAiKVxuIiwgc2VwID0gIiIpDQojIGZvcm1hdF9lcXVhbF93aWR0aCh0c2xhX3Jhd19jZ3IpDQoNCmNhdCgiXG5cbiMjIyMgQ29tcG91bmQgQXZlcmFnZSBHcm93dGggUmF0ZXMgKCIsIG1pbl95ZWFyLCAiLSIsIG1heF95ZWFyLCAiKVxuIiwgc2VwID0gIiIpDQpmb3JtYXRfZXF1YWxfd2lkdGgodHNsYV9yYXdfY2FncikNCg0KIyBWaWV3KHRzbGFfcmF3X2NhZ3IpDQojIGNvbG5hbWVzKHRzbGFfcmF3X2NhZ3IpDQppbnRlcmFjdGl2ZV9zdHIodHNsYV9yYXdfY2FncikNCg0KDQpgYGANCg0KIyMjIFN1bW1hcnkNCg0KYGBge3IgdHNsYV9yYXdfY2Fncl9zdW1tYXJ5LCBldmFsPVRSVUUsIGVjaG89RkFMU0V9DQoNCmludGVyYWN0aXZlX3N0cih0c2xhX3Jhd19jYWdyKQ0KDQojIExvYWQgbmVjZXNzYXJ5IGxpYnJhcmllcw0KbGlicmFyeShkcGx5cikNCmxpYnJhcnkodGliYmxlKQ0KDQojIERlZmluZSBhIGhlbHBlciBmdW5jdGlvbiB0byBjbGVhbiBhbmQgY29udmVydCBwZXJjZW50YWdlcw0KY2xlYW5fcGVyY2VudGFnZSA8LSBmdW5jdGlvbihjb2x1bW4pIHsNCiAgYXMubnVtZXJpYyhnc3ViKCIlIiwgIiIsIGNvbHVtbikpDQp9DQoNCiMgRGVmaW5lIHRoZSBzdGF0aXN0aWMgbmFtZXMgZm9yIHRoZSBzdW1tYXJ5IHRhYmxlDQpzdGF0aXN0aWNfbmFtZXMgPC0gYygNCiAgIkNvdW50IG9mIE9ic2VydmF0aW9ucyIsIA0KICAiTWVhbiIsIA0KICAiTWVkaWFuIiwNCiAgIlN0YW5kYXJkIERldmlhdGlvbiAoVm9sYXRpbGl0eSkiLCANCiAgIk1pbiBDQUdSIFJhbmdlIChDQUdSIC0gU0QpIiwNCiAgIk1heCBDQUdSIFJhbmdlIChDQUdSICsgU0QpIiwNCiAgIk1pbmltdW0iLCANCiAgIk1heGltdW0iLCANCiAgIlBlcmNlbnQgQWJvdmUgSW5mbGF0aW9uIFRhcmdldCIsIA0KICAiUGVyY2VudCBBYm92ZSBDb25zZXJ2YXRpdmUgVGFyZ2V0IiwgDQogICJQZXJjZW50IEFib3ZlIE1vZGVyYXRlIFRhcmdldCIsIA0KICAiUGVyY2VudCBBYm92ZSBBZ2dyZXNzaXZlIFRhcmdldCINCikNCg0KIyBBZGp1c3QgdGhlIGZpcnN0IHJvdydzIERhdGUgYW5kIGNsZWFuIHVwIENBR1IgY29sdW1ucw0KdHNsYV9yYXdfY2FnciA8LSB0c2xhX3Jhd19jYWdyICU+JQ0KICBzbGljZSgtMSkgJT4lICMgUmVtb3ZlIHRoZSBmaXJzdCByb3cNCiAgbXV0YXRlKA0KICAgICMgRGF0ZSA9IGlmZWxzZShyb3dfbnVtYmVyKCkgPT0gMSwgIjIwMjUtMDEtMDEiLCBEYXRlKSwNCiAgICBEYXRlID0gYXMubnVtZXJpYyhmb3JtYXQoYXMuRGF0ZShEYXRlKSwgIiVZIikpLA0KICAgIGAxLVllYXIgQ0FHUmAgPSBjbGVhbl9wZXJjZW50YWdlKGAxLVllYXIgQ0FHUmApLA0KICAgIGA1LVllYXIgQ0FHUmAgPSBjbGVhbl9wZXJjZW50YWdlKGA1LVllYXIgQ0FHUmApLA0KICAgIGAxMC1ZZWFyIENBR1JgID0gY2xlYW5fcGVyY2VudGFnZShgMTAtWWVhciBDQUdSYCksDQogICAgYDIwLVllYXIgQ0FHUmAgPSBjbGVhbl9wZXJjZW50YWdlKGAyMC1ZZWFyIENBR1JgKSwNCiAgICBgMzAtWWVhciBDQUdSYCA9IGNsZWFuX3BlcmNlbnRhZ2UoYDMwLVllYXIgQ0FHUmApDQogICkNCg0KIyBGdW5jdGlvbiB0byBjYWxjdWxhdGUgc3RhdGlzdGljcyBmb3IgYSBnaXZlbiBkYXRhc2V0DQpjYWxjX3N0YXRzIDwtIGZ1bmN0aW9uKGRhdGEpIHsNCiAgaWYgKHN1bSghaXMubmEoZGF0YSkpIDwgMikgcmV0dXJuKHJlcChOQSwgbGVuZ3RoKHN0YXRpc3RpY19uYW1lcykpKSAgIyBIYW5kbGUgaW5zdWZmaWNpZW50IGRhdGENCg0KICBjb3VudF9vYnNlcnZhdGlvbnMgPC0gc3VtKCFpcy5uYShkYXRhKSkNCiAgbWVhbl92YWx1ZSA8LSByb3VuZChtZWFuKGRhdGEsIG5hLnJtID0gVFJVRSksIDIpDQogIG1lZGlhbl92YWx1ZSA8LSByb3VuZChtZWRpYW4oZGF0YSwgbmEucm0gPSBUUlVFKSwgMikNCiAgc2RfdmFsdWUgPC0gcm91bmQoc2QoZGF0YSwgbmEucm0gPSBUUlVFKSwgMikNCiAgbWluX2NhZ3JfcmFuZ2UgPC0gcm91bmQoY2Fncl92YWx1ZSAtIHNkX3ZhbHVlLCAyKQ0KICBtYXhfY2Fncl9yYW5nZSA8LSByb3VuZChjYWdyX3ZhbHVlICsgc2RfdmFsdWUsIDIpDQogIG1pbl92YWx1ZSA8LSByb3VuZChtaW4oZGF0YSwgbmEucm0gPSBUUlVFKSwgMikNCiAgbWF4X3ZhbHVlIDwtIHJvdW5kKG1heChkYXRhLCBuYS5ybSA9IFRSVUUpLCAyKQ0KICANCiAgIyBEZWZpbmUgaW5mbGF0aW9uIGFuZCBncm93dGggdGFyZ2V0cw0KICB0YXJnZXRfaW5mbGF0aW9uIDwtIDIgICMgRXhhbXBsZSB0YXJnZXQgZm9yIGluZmxhdGlvbg0KICB0YXJnZXRfY29uc2VydmF0aXZlIDwtIDMgKyB0YXJnZXRfaW5mbGF0aW9uDQogIHRhcmdldF9tb2RlcmF0ZSA8LSA1ICsgdGFyZ2V0X2luZmxhdGlvbg0KICB0YXJnZXRfYWdncmVzc2l2ZSA8LSAxMCArIHRhcmdldF9pbmZsYXRpb24NCiAgDQogIGFib3ZlX3RhcmdldF9pbmZsYXRpb24gPC0gc3VtKGRhdGEgPj0gdGFyZ2V0X2luZmxhdGlvbiwgbmEucm0gPSBUUlVFKQ0KICBhYm92ZV90YXJnZXRfY29uc2VydmF0aXZlIDwtIHN1bShkYXRhID49IHRhcmdldF9jb25zZXJ2YXRpdmUsIG5hLnJtID0gVFJVRSkNCiAgYWJvdmVfdGFyZ2V0X21vZGVyYXRlIDwtIHN1bShkYXRhID49IHRhcmdldF9tb2RlcmF0ZSwgbmEucm0gPSBUUlVFKQ0KICBhYm92ZV90YXJnZXRfYWdncmVzc2l2ZSA8LSBzdW0oZGF0YSA+PSB0YXJnZXRfYWdncmVzc2l2ZSwgbmEucm0gPSBUUlVFKQ0KICANCiAgcGVyY2VudF9hYm92ZV90YXJnZXRfY29uc2VydmF0aXZlIDwtIHJvdW5kKChhYm92ZV90YXJnZXRfY29uc2VydmF0aXZlIC8gY291bnRfb2JzZXJ2YXRpb25zKSAqIDEwMCwgMikNCiAgcGVyY2VudF9hYm92ZV90YXJnZXRfaW5mbGF0aW9uIDwtIHJvdW5kKChhYm92ZV90YXJnZXRfaW5mbGF0aW9uIC8gY291bnRfb2JzZXJ2YXRpb25zKSAqIDEwMCwgMikNCiAgcGVyY2VudF9hYm92ZV90YXJnZXRfbW9kZXJhdGUgPC0gcm91bmQoKGFib3ZlX3RhcmdldF9tb2RlcmF0ZSAvIGNvdW50X29ic2VydmF0aW9ucykgKiAxMDAsIDIpDQogIHBlcmNlbnRfYWJvdmVfdGFyZ2V0X2FnZ3Jlc3NpdmUgPC0gcm91bmQoKGFib3ZlX3RhcmdldF9hZ2dyZXNzaXZlIC8gY291bnRfb2JzZXJ2YXRpb25zKSAqIDEwMCwgMikNCiAgDQogIGMoDQogICAgY291bnRfb2JzZXJ2YXRpb25zLCANCiAgICBwYXN0ZTAobWVhbl92YWx1ZSwgIiUiKSwNCiAgICBwYXN0ZTAobWVkaWFuX3ZhbHVlLCAiJSIpLA0KICAgIHBhc3RlMChzZF92YWx1ZSwgIiUiKSwNCiAgICBwYXN0ZTAobWluX2NhZ3JfcmFuZ2UsICIlIiksDQogICAgcGFzdGUwKG1heF9jYWdyX3JhbmdlLCAiJSIpLA0KICAgIHBhc3RlMChtaW5fdmFsdWUsICIlIiksDQogICAgcGFzdGUwKG1heF92YWx1ZSwgIiUiKSwNCiAgICBwYXN0ZTAocGVyY2VudF9hYm92ZV90YXJnZXRfaW5mbGF0aW9uLCAiJSIpLA0KICAgIHBhc3RlMChwZXJjZW50X2Fib3ZlX3RhcmdldF9jb25zZXJ2YXRpdmUsICIlIiksIA0KICAgIHBhc3RlMChwZXJjZW50X2Fib3ZlX3RhcmdldF9tb2RlcmF0ZSwgIiUiKSwgDQogICAgcGFzdGUwKHBlcmNlbnRfYWJvdmVfdGFyZ2V0X2FnZ3Jlc3NpdmUsICIlIikNCiAgKQ0KfQ0KDQojIENvbHVtbnMgdG8gY2FsY3VsYXRlIENBR1Igc3RhdGlzdGljcw0KY2Fncl9jb2x1bW5zIDwtIGMoIjEtWWVhciBDQUdSIiwgIjUtWWVhciBDQUdSIiwgIjEwLVllYXIgQ0FHUiIsICIyMC1ZZWFyIENBR1IiLCAiMzAtWWVhciBDQUdSIikNCmV4aXN0aW5nX2NhZ3JfY29sdW1ucyA8LSBpbnRlcnNlY3QoY2Fncl9jb2x1bW5zLCBuYW1lcyh0c2xhX3Jhd19jYWdyKSkNCg0KIyBDYWxjdWxhdGUgc3RhdHMgZm9yIGVhY2ggQ0FHUiBjb2x1bW4NCmNhZ3Jfc3RhdHNfbGlzdCA8LSBsYXBwbHkodHNsYV9yYXdfY2FncltleGlzdGluZ19jYWdyX2NvbHVtbnNdLCBjYWxjX3N0YXRzKQ0KDQojIENvbXBpbGUgaW50byBhIHN1bW1hcnkgZGF0YSBmcmFtZQ0KdHNsYV9yYXdfY2Fncl9zdW1tYXJ5IDwtIGFzLmRhdGEuZnJhbWUoZG8uY2FsbChjYmluZCwgY2Fncl9zdGF0c19saXN0KSkNCnJvd25hbWVzKHRzbGFfcmF3X2NhZ3Jfc3VtbWFyeSkgPC0gc3RhdGlzdGljX25hbWVzDQoNCg0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiMjIFNBVkUgVkFMVUVTIEZPUiBJTi1MSU5FIENPREUNCg0KIyBEZWZpbmUgdGhlIG1hcHBpbmcgb2Ygcm93IG5hbWVzIHRvIHZhcmlhYmxlIG5hbWVzDQpyb3dfdG9fdmFyX25hbWUgPC0gYygNCiAgIkNvdW50IG9mIE9ic2VydmF0aW9ucyIgPSAiY291bnRfb2JzZXJ2YXRpb25zIiwNCiAgIk1lYW4iID0gIm1lYW5fdmFsdWUiLA0KICAiTWVkaWFuIiA9ICJtZWRpYW5fdmFsdWUiLA0KICAiU3RhbmRhcmQgRGV2aWF0aW9uIChWb2xhdGlsaXR5KSIgPSAic2RfdmFsdWUiLA0KICAiTWluIENBR1IgUmFuZ2UgKENBR1IgLSBTRCkiID0gIm1pbl9jYWdyX3JhbmdlIiwNCiAgIk1heCBDQUdSIFJhbmdlIChDQUdSICsgU0QpIiA9ICJtYXhfY2Fncl9yYW5nZSIsDQogICJNaW5pbXVtIiA9ICJtaW5fdmFsdWUiLA0KICAiTWF4aW11bSIgPSAibWF4X3ZhbHVlIiwNCiAgIlBlcmNlbnQgQWJvdmUgSW5mbGF0aW9uIFRhcmdldCIgPSAicGVyY2VudF9hYm92ZV90YXJnZXRfaW5mbGF0aW9uIiwNCiAgIlBlcmNlbnQgQWJvdmUgQ29uc2VydmF0aXZlIFRhcmdldCIgPSAicGVyY2VudF9hYm92ZV90YXJnZXRfY29uc2VydmF0aXZlIiwNCiAgIlBlcmNlbnQgQWJvdmUgTW9kZXJhdGUgVGFyZ2V0IiA9ICJwZXJjZW50X2Fib3ZlX3RhcmdldF9tb2RlcmF0ZSIsDQogICJQZXJjZW50IEFib3ZlIEFnZ3Jlc3NpdmUgVGFyZ2V0IiA9ICJwZXJjZW50X2Fib3ZlX3RhcmdldF9hZ2dyZXNzaXZlIg0KKQ0KDQojIEZ1bmN0aW9uIHRvIHNhdmUgc3VtbWFyeSB2YWx1ZXMgZHluYW1pY2FsbHkNCnNhdmVfY29sdW1uX3ZhbHVlcyA8LSBmdW5jdGlvbihzdW1tYXJ5X2RmKSB7DQogICMgRXhjbHVkZSB0aGUgIlN0YXRpc3RpYyIgYW5kICJPdmVyYWxsIiBjb2x1bW5zDQogIGNvbHVtbnNfdG9fc2F2ZSA8LSBzZXRkaWZmKG5hbWVzKHN1bW1hcnlfZGYpLCBjKCJTdGF0aXN0aWMiLCAiT3ZlcmFsbCIpKQ0KICANCiAgIyBJdGVyYXRlIG92ZXIgZWFjaCBjb2x1bW4NCiAgZm9yIChjb2wgaW4gY29sdW1uc190b19zYXZlKSB7DQogICAgIyBGb3JtYXQgY29sdW1uIG5hbWUgdG8gbG93ZXJjYXNlIGFuZCByZXBsYWNlIGludmFsaWQgY2hhcmFjdGVycw0KICAgIGNvbF9uYW1lIDwtIHRvbG93ZXIoZ3N1YigiW15hLXpBLVowLTldIiwgIl8iLCBjb2wpKQ0KICAgIA0KICAgICMgRXh0cmFjdCB2YWx1ZXMgZm9yIHRoZSBjdXJyZW50IGNvbHVtbg0KICAgIGNvbF92YWx1ZXMgPC0gc3VtbWFyeV9kZltbY29sXV0NCiAgICANCiAgICAjIFNhdmUgZWFjaCB2YWx1ZSBkeW5hbWljYWxseSB1c2luZyB0aGUgbWFwcGluZyBmb3Igcm93IG5hbWVzDQogICAgZm9yIChpIGluIHNlcV9hbG9uZyhjb2xfdmFsdWVzKSkgew0KICAgICAgIyBHZXQgdGhlIGNvcnJlc3BvbmRpbmcgdmFyaWFibGUgbmFtZSBmcm9tIHRoZSBtYXBwaW5nDQogICAgICBzdGF0X25hbWUgPC0gcm93X3RvX3Zhcl9uYW1lW3Jvd25hbWVzKHN1bW1hcnlfZGYpW2ldXQ0KICAgICAgDQogICAgICBpZiAoIWlzLm5hKHN0YXRfbmFtZSkpIHsgICMgU2tpcCBpZiBubyBtYXBwaW5nIGlzIGRlZmluZWQNCiAgICAgICAgIyBDcmVhdGUgdGhlIHZhcmlhYmxlIG5hbWUNCiAgICAgICAgdmFyX25hbWUgPC0gcGFzdGUwKHN0YXRfbmFtZSwgIl8iLCBjb2xfbmFtZSkNCiAgICAgICAgDQogICAgICAgICMgQXR0ZW1wdCBudW1lcmljIGNvbnZlcnNpb24gZm9yIGRvd25zdHJlYW0gdXNlDQogICAgICAgIHZhbHVlIDwtIHN1cHByZXNzV2FybmluZ3MoYXMubnVtZXJpYyhnc3ViKCIlIiwgIiIsIGNvbF92YWx1ZXNbaV0pKSkNCiAgICAgICAgDQogICAgICAgICMgQXNzaWduIHRoZSB2YWx1ZSB0byB0aGUgZ2xvYmFsIGVudmlyb25tZW50DQogICAgICAgIGFzc2lnbih2YXJfbmFtZSwgdmFsdWUsIGVudmlyID0gLkdsb2JhbEVudikNCiAgICAgIH0NCiAgICB9DQogIH0NCn0NCg0KIyBBcHBseSB0aGUgZnVuY3Rpb24gdG8gc2F2ZSB2YWx1ZXMgZm9yIGFsbCBjb2x1bW5zIGV4Y2VwdCAiT3ZlcmFsbCINCnNhdmVfY29sdW1uX3ZhbHVlcyh0c2xhX3Jhd19jYWdyX3N1bW1hcnkpDQoNCiMgRXhhbXBsZTogQWNjZXNzaW5nIGR5bmFtaWNhbGx5IGNyZWF0ZWQgdmFyaWFibGVzDQppbnRlcmFjdGl2ZV9wcmludChtZWFuX3ZhbHVlXzFfeWVhcl9jYWdyKSAgIyBTaG91bGQgcHJpbnQgdGhlIG1lYW4gdmFsdWUgZm9yIDEtWWVhciBDQUdSDQppbnRlcmFjdGl2ZV9wcmludChwZXJjZW50X2Fib3ZlX3RhcmdldF9pbmZsYXRpb25fNV95ZWFyX2NhZ3IpICAjIFNob3VsZCBwcmludCB0aGUgcGVyY2VudCBhYm92ZSBpbmZsYXRpb24gdGFyZ2V0IGZvciA1LVllYXIgQ0FHUg0KaW50ZXJhY3RpdmVfcHJpbnQoc2RfdmFsdWVfMTBfeWVhcl9jYWdyKSAgIyBTaG91bGQgcHJpbnQgdGhlIHN0YW5kYXJkIGRldmlhdGlvbiBmb3IgMTAtWWVhciBDQUdSDQoNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQojIyBPVkVSQUxMIFNUQVRJU1RJQ1MgDQpudW1lcmljX3ZhbHVlc19hbGwgPC0gYXMubnVtZXJpYyh1bmxpc3QodHNsYV9yYXdfY2FncltleGlzdGluZ19jYWdyX2NvbHVtbnNdLCB1c2UubmFtZXMgPSBGQUxTRSkpDQpudW1lcmljX3ZhbHVlc19hbGwgPC0gbnVtZXJpY192YWx1ZXNfYWxsWyFpcy5uYShudW1lcmljX3ZhbHVlc19hbGwpXQ0KDQpvdmVyYWxsX2NvdW50X29ic2VydmF0aW9ucyA8LSBsZW5ndGgobnVtZXJpY192YWx1ZXNfYWxsKQ0Kb3ZlcmFsbF9tZWFuX3ZhbHVlIDwtIHJvdW5kKG1lYW4obnVtZXJpY192YWx1ZXNfYWxsKSwgMikNCm92ZXJhbGxfbWVkaWFuX3ZhbHVlIDwtIHJvdW5kKG1lZGlhbihudW1lcmljX3ZhbHVlc19hbGwpLCAyKQ0Kb3ZlcmFsbF9zZF92YWx1ZSA8LSByb3VuZChzZChudW1lcmljX3ZhbHVlc19hbGwpLCAyKQ0Kb3ZlcmFsbF9taW5fY2Fncl9yYW5nZSA8LSByb3VuZChjYWdyX3ZhbHVlIC0gb3ZlcmFsbF9zZF92YWx1ZSwgMikNCm92ZXJhbGxfbWF4X2NhZ3JfcmFuZ2UgPC0gcm91bmQoY2Fncl92YWx1ZSArIG92ZXJhbGxfc2RfdmFsdWUsIDIpDQpvdmVyYWxsX21pbl92YWx1ZSA8LSByb3VuZChtaW4obnVtZXJpY192YWx1ZXNfYWxsKSwgMikNCm92ZXJhbGxfbWF4X3ZhbHVlIDwtIHJvdW5kKG1heChudW1lcmljX3ZhbHVlc19hbGwpLCAyKQ0KDQpvdmVyYWxsX2Fib3ZlX3RhcmdldF9pbmZsYXRpb24gPC0gc3VtKG51bWVyaWNfdmFsdWVzX2FsbCA+PSB0YXJnZXRfaW5mbGF0aW9uLCBuYS5ybSA9IFRSVUUpDQpvdmVyYWxsX2Fib3ZlX3RhcmdldF9jb25zZXJ2YXRpdmUgPC0gc3VtKG51bWVyaWNfdmFsdWVzX2FsbCA+PSB0YXJnZXRfY29uc2VydmF0aXZlLCBuYS5ybSA9IFRSVUUpDQpvdmVyYWxsX2Fib3ZlX3RhcmdldF9tb2RlcmF0ZSA8LSBzdW0obnVtZXJpY192YWx1ZXNfYWxsID49IHRhcmdldF9tb2RlcmF0ZSwgbmEucm0gPSBUUlVFKQ0Kb3ZlcmFsbF9hYm92ZV90YXJnZXRfYWdncmVzc2l2ZSA8LSBzdW0obnVtZXJpY192YWx1ZXNfYWxsID49IHRhcmdldF9hZ2dyZXNzaXZlLCBuYS5ybSA9IFRSVUUpDQoNCm92ZXJhbGxfcGVyY2VudF9hYm92ZV90YXJnZXRfY29uc2VydmF0aXZlIDwtIHJvdW5kKChvdmVyYWxsX2Fib3ZlX3RhcmdldF9jb25zZXJ2YXRpdmUgLyBvdmVyYWxsX2NvdW50X29ic2VydmF0aW9ucykgKiAxMDAsIDIpDQpvdmVyYWxsX3BlcmNlbnRfYWJvdmVfdGFyZ2V0X2luZmxhdGlvbiA8LSByb3VuZCgob3ZlcmFsbF9hYm92ZV90YXJnZXRfaW5mbGF0aW9uIC8gb3ZlcmFsbF9jb3VudF9vYnNlcnZhdGlvbnMpICogMTAwLCAyKQ0Kb3ZlcmFsbF9wZXJjZW50X2Fib3ZlX3RhcmdldF9tb2RlcmF0ZSA8LSByb3VuZCgob3ZlcmFsbF9hYm92ZV90YXJnZXRfbW9kZXJhdGUgLyBvdmVyYWxsX2NvdW50X29ic2VydmF0aW9ucykgKiAxMDAsIDIpDQpvdmVyYWxsX3BlcmNlbnRfYWJvdmVfdGFyZ2V0X2FnZ3Jlc3NpdmUgPC0gcm91bmQoKG92ZXJhbGxfYWJvdmVfdGFyZ2V0X2FnZ3Jlc3NpdmUgLyBvdmVyYWxsX2NvdW50X29ic2VydmF0aW9ucykgKiAxMDAsIDIpDQoNCnRzbGFfcmF3X2NhZ3Jfc3VtbWFyeSRPdmVyYWxsIDwtIGMoDQogIG92ZXJhbGxfY291bnRfb2JzZXJ2YXRpb25zLA0KICBwYXN0ZTAob3ZlcmFsbF9tZWFuX3ZhbHVlLCAiJSIpLA0KICBwYXN0ZTAob3ZlcmFsbF9tZWRpYW5fdmFsdWUsICIlIiksDQogIHBhc3RlMChvdmVyYWxsX3NkX3ZhbHVlLCAiJSIpLA0KICBwYXN0ZTAob3ZlcmFsbF9taW5fY2Fncl9yYW5nZSwgIiUiKSwNCiAgcGFzdGUwKG92ZXJhbGxfbWF4X2NhZ3JfcmFuZ2UsICIlIiksDQogIHBhc3RlMChvdmVyYWxsX21pbl92YWx1ZSwgIiUiKSwNCiAgcGFzdGUwKG92ZXJhbGxfbWF4X3ZhbHVlLCAiJSIpLA0KICBwYXN0ZTAob3ZlcmFsbF9wZXJjZW50X2Fib3ZlX3RhcmdldF9pbmZsYXRpb24sICIlIiksDQogIHBhc3RlMChvdmVyYWxsX3BlcmNlbnRfYWJvdmVfdGFyZ2V0X2NvbnNlcnZhdGl2ZSwgIiUiKSwNCiAgcGFzdGUwKG92ZXJhbGxfcGVyY2VudF9hYm92ZV90YXJnZXRfbW9kZXJhdGUsICIlIiksDQogIHBhc3RlMChvdmVyYWxsX3BlcmNlbnRfYWJvdmVfdGFyZ2V0X2FnZ3Jlc3NpdmUsICIlIikNCikNCg0KIyBDb252ZXJ0IHJvdyBuYW1lcyB0byBhIGNvbHVtbg0KdHNsYV9yYXdfY2Fncl9zdW1tYXJ5IDwtIHRpYmJsZTo6cm93bmFtZXNfdG9fY29sdW1uKHRzbGFfcmF3X2NhZ3Jfc3VtbWFyeSwgdmFyID0gIlN0YXRpc3RpYyIpDQoNCiMgRW5zdXJlIGFsbCBjb2x1bW5zIGFyZSBjaGFyYWN0ZXINCnRzbGFfcmF3X2NhZ3Jfc3VtbWFyeSA8LSB0c2xhX3Jhd19jYWdyX3N1bW1hcnkgJT4lDQogIG11dGF0ZShhY3Jvc3MoZXZlcnl0aGluZygpLCBhcy5jaGFyYWN0ZXIpKQ0KDQojIERpc3BsYXkgdGhlIHN1bW1hcnkgdGFibGUNCmNhdCgiXG4jIyMjIENvbXBvdW5kIEF2ZXJhZ2UgR3Jvd3RoIFJhdGVzICgiLCBtaW5feWVhciwgIi0iLCBtYXhfeWVhciwgIilcbiIsIHNlcCA9ICIiKQ0KaW50ZXJhY3RpdmVfc3RyKHRzbGFfcmF3X2NhZ3Jfc3VtbWFyeSkNCmZvcm1hdF91bnNwZWNpZmllZF93aWR0aCh0c2xhX3Jhd19jYWdyX3N1bW1hcnkpDQoNCmBgYA0KDQoqKmByIG1pbl95ZWFyYC1gciBtYXhfeWVhcmAgU3VtbWFyeToqKiBUaGUgMS1ZZWFyIENBR1IgZXhoaWJpdHMgdGhlIGByIGlmKG1lYW5fdmFsdWVfMV95ZWFyX2NhZ3IgPT0gbWF4KGMobWVhbl92YWx1ZV8xX3llYXJfY2FnciwgbWVhbl92YWx1ZV81X3llYXJfY2FnciwgbWVhbl92YWx1ZV8xMF95ZWFyX2NhZ3IpKSkgImhpZ2hlc3QgbWVhbiByZXR1cm4iIGVsc2UgaWYobWVhbl92YWx1ZV8xX3llYXJfY2FnciA9PSBtaW4oYyhtZWFuX3ZhbHVlXzFfeWVhcl9jYWdyLCBtZWFuX3ZhbHVlXzVfeWVhcl9jYWdyLCBtZWFuX3ZhbHVlXzEwX3llYXJfY2FncikpKSAibG93ZXN0IG1lYW4gcmV0dXJuIiBlbHNlICJtZWFuIHJldHVybiJgIGF0IGByIG1lYW5fdmFsdWVfMV95ZWFyX2NhZ3JgJSwgYW5kIGByIGlmKHNkX3ZhbHVlXzFfeWVhcl9jYWdyID09IG1heChjKHNkX3ZhbHVlXzFfeWVhcl9jYWdyLCBzZF92YWx1ZV81X3llYXJfY2Fnciwgc2RfdmFsdWVfMTBfeWVhcl9jYWdyKSkpICJ0aGUgZ3JlYXRlc3Qgdm9sYXRpbGl0eSB3aXRoIGEiIGVsc2UgaWYoc2RfdmFsdWVfMV95ZWFyX2NhZ3IgPT0gbWluKGMoc2RfdmFsdWVfMV95ZWFyX2NhZ3IsIHNkX3ZhbHVlXzVfeWVhcl9jYWdyLCBzZF92YWx1ZV8xMF95ZWFyX2NhZ3IpKSkgInRoZSBsZWFzdCB2b2xhdGlsaXR5IHdpdGggYSIgZWxzZSAiYSJgIHN0YW5kYXJkIGRldmlhdGlvbiBvZiBgciBzZF92YWx1ZV8xX3llYXJfY2FncmAlLiBBcyB0aGUgaW52ZXN0bWVudCBob3Jpem9uIGV4dGVuZHMgdG8gNSwgYW5kIDEwIHllYXJzLCB0aGUgbWVhbiByZXR1cm5zIGByIGlmKG1lYW5fdmFsdWVfMV95ZWFyX2NhZ3IgPCBtZWFuKGMobWVhbl92YWx1ZV81X3llYXJfY2FnciwgbWVhbl92YWx1ZV8xMF95ZWFyX2NhZ3IpKSkgImluY3JlYXNlIiBlbHNlICJkZWNyZWFzZSJgLCByYW5naW5nIGZyb20gYHIgbWVhbl92YWx1ZV81X3llYXJfY2FncmAlIHRvIGByIG1lYW5fdmFsdWVfMTBfeWVhcl9jYWdyYCUsIHdoaWxlIHZvbGF0aWxpdHkgYHIgaWYoc2RfdmFsdWVfMV95ZWFyX2NhZ3IgPCBtZWFuKGMoc2RfdmFsdWVfNV95ZWFyX2NhZ3IsIHNkX3ZhbHVlXzEwX3llYXJfY2FncikpKSAicmlzZXMiIGVsc2UgImRpbWluaXNoZXMiYCwgd2l0aCBzdGFuZGFyZCBkZXZpYXRpb25zIGByIGlmKHNkX3ZhbHVlXzFfeWVhcl9jYWdyID4gc2RfdmFsdWVfMTBfeWVhcl9jYWdyKSAiZHJvcHBpbmciIGVsc2UgInJpc2luZyJgIGZyb20gYHIgc2RfdmFsdWVfNV95ZWFyX2NhZ3JgJSB0byBgciBzZF92YWx1ZV8xMF95ZWFyX2NhZ3JgJS4gVGhpcyB0cmVuZCBpbmRpY2F0ZXMgdGhhdCBsb25nZXIgaW52ZXN0bWVudCBwZXJpb2RzIHRlbmQgdG8gb2ZmZXIgYHIgaWYoc2RfdmFsdWVfMV95ZWFyX2NhZ3IgPiBzZF92YWx1ZV8xMF95ZWFyX2NhZ3IpICJtb3JlIHN0YWJsZSIgZWxzZSAibGVzcyBzdGFibGUiYCByZXR1cm5zLiBGdXJ0aGVybW9yZSwgdGhlIHBlcmNlbnRhZ2Ugb2YgcGVyaW9kcyBleGNlZWRpbmcgdGhlIGluZmxhdGlvbiB0YXJnZXQgYHIgaWYocGVyY2VudF9hYm92ZV90YXJnZXRfaW5mbGF0aW9uXzFfeWVhcl9jYWdyIDwgcGVyY2VudF9hYm92ZV90YXJnZXRfaW5mbGF0aW9uXzEwX3llYXJfY2FncikgImluY3JlYXNlcyIgZWxzZSAiZGVjcmVhc2VzImAgd2l0aCBsb25nZXIgZHVyYXRpb25zLCBmcm9tIGByIHBlcmNlbnRfYWJvdmVfdGFyZ2V0X2luZmxhdGlvbl8xX3llYXJfY2FncmAlIGluIHRoZSAxLVllYXIgQ0FHUiB0byBgciBwZXJjZW50X2Fib3ZlX3RhcmdldF9pbmZsYXRpb25fMTBfeWVhcl9jYWdyYCUgaW4gdGhlIDEwLVllYXIgQ0FHUiwgdW5kZXJzY29yaW5nIFRTTEEncyBgciBpZihwZXJjZW50X2Fib3ZlX3RhcmdldF9pbmZsYXRpb25fMV95ZWFyX2NhZ3IgPCBwZXJjZW50X2Fib3ZlX3RhcmdldF9pbmZsYXRpb25fMTBfeWVhcl9jYWdyKSAiZWZmZWN0aXZlbmVzcyIgZWxzZSAiaW5lZmZlY3RpdmVuZXNzImAgYXMgYSBoZWRnZSBhZ2FpbnN0IGluZmxhdGlvbiBvdmVyIGV4dGVuZGVkIHRpbWVmcmFtZXMuIFdpdGggYW4gb3ZlcmFsbCBwZXJjZW50YWdlIG9mIGByIG92ZXJhbGxfcGVyY2VudF9hYm92ZV90YXJnZXRfYWdncmVzc2l2ZWAlIGV4Y2VlZGluZyB0aGUgYWdncmVzc2l2ZSB0YXJnZXQgKGByIHRhcmdldF9hZ2dyZXNzaXZlYCUgYW5udWFsaXplZCByZXR1cm5zIHdpdGggYHIgdGFyZ2V0X2luZmxhdGlvbmAlIGluZmxhdGlvbiksIFRTTEEgYHIgaWYob3ZlcmFsbF9wZXJjZW50X2Fib3ZlX3RhcmdldF9hZ2dyZXNzaXZlID4gNTApICJoYXMsIG92ZXIgdGhpcyB0aW1lIHBlcmlvZCwgcHJvdmVuIHRvIGJlIGEgc3Ryb25nIiBlbHNlIGlmKG92ZXJhbGxfcGVyY2VudF9hYm92ZV90YXJnZXRfYWdncmVzc2l2ZSA+IDQwKSAiaGFzLCBvdmVyIHRoaXMgdGltZSBwZXJpb2QsIGRlbW9uc3RyYXRlZCBpdHNlbGYgYXMgYSB2aWFibGUiIGVsc2UgImFwcGVhcnMsIG92ZXIgdGhpcyB0aW1lIHBlcmlvZCwgdG8gYmUgYSBsZXNzIHN1aXRhYmxlImAgb3B0aW9uIGZvciBhIGhpZ2gtcmV0dXJuaW5nIGxvbmctdGVybSBpbnZlc3RtZW50Lg0KDQojIyMgR3JhcGgNCg0KIyMjIyBBbGwgUGVyaW9kcw0KDQoNCmBgYHtyIHRzbGFfcmF3X2NhZ3JfZ3JhcGhzX2FsbCwgZmlnLndpZHRoPTEwLCBmaWcuaGVpZ2h0PTcsIGV2YWw9VFJVRSwgZWNobz1GQUxTRX0NCg0KY2F0KCJcblxuIyMjIyBDb21wb3VuZCBBdmVyYWdlIEdyb3d0aCBSYXRlcyBBY3Jvc3MgUGVyaW9kcyBcbiIpDQoNCiMgTG9hZCBuZWNlc3NhcnkgbGlicmFyaWVzDQpsaWJyYXJ5KGdncGxvdDIpDQpsaWJyYXJ5KGRwbHlyKQ0KDQoNCiMgQ29udmVydCBjb2x1bW5zIHRvIG51bWVyaWMgZm9yIHBsb3R0aW5nIGlmIG5lZWRlZA0KdHNsYV9yYXdfY2FnciA8LSB0c2xhX3Jhd19jYWdyICU+JQ0KICBtdXRhdGUoDQogICAgYERhdGVgID0gYXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIoYERhdGVgKSksICAjIEVuc3VyZSBEYXRlIGlzIG51bWVyaWMNCiAgICBgMS1ZZWFyIENBR1JgID0gYXMubnVtZXJpYyhnc3ViKCIlIiwgIiIsIGAxLVllYXIgQ0FHUmApKSwNCiAgICBgNS1ZZWFyIENBR1JgID0gYXMubnVtZXJpYyhnc3ViKCIlIiwgIiIsIGA1LVllYXIgQ0FHUmApKSwNCiAgICBgMTAtWWVhciBDQUdSYCA9IGFzLm51bWVyaWMoZ3N1YigiJSIsICIiLCBgMTAtWWVhciBDQUdSYCkpLA0KICAgIGAyMC1ZZWFyIENBR1JgID0gYXMubnVtZXJpYyhnc3ViKCIlIiwgIiIsIGAyMC1ZZWFyIENBR1JgKSksDQogICAgYDMwLVllYXIgQ0FHUmAgPSBhcy5udW1lcmljKGdzdWIoIiUiLCAiIiwgYDMwLVllYXIgQ0FHUmApKQ0KICApDQoNCiMgUmVzaGFwZSB0aGUgZGF0YSBpbnRvIGxvbmcgZm9ybWF0IGZvciBlYXN5IHBsb3R0aW5nIG9mIG11bHRpcGxlIGxpbmVzIGFuZCBzZXQgdGhlIGZhY3RvciBvcmRlcg0KbnJ0X2xvbmcgPC0gdHNsYV9yYXdfY2FnciAlPiUNCiAgcGl2b3RfbG9uZ2VyKGNvbHMgPSBjKGAxLVllYXIgQ0FHUmAsIGA1LVllYXIgQ0FHUmAsIGAxMC1ZZWFyIENBR1JgLCBgMjAtWWVhciBDQUdSYCwgYDMwLVllYXIgQ0FHUmApLA0KICAgICAgICAgICAgICAgbmFtZXNfdG8gPSAiQ0FHUl9QZXJpb2QiLA0KICAgICAgICAgICAgICAgdmFsdWVzX3RvID0gIkNBR1JfVmFsdWUiKSAlPiUNCiAgbXV0YXRlKENBR1JfUGVyaW9kID0gZmFjdG9yKENBR1JfUGVyaW9kLCBsZXZlbHMgPSBjKCIxLVllYXIgQ0FHUiIsICI1LVllYXIgQ0FHUiIsICIxMC1ZZWFyIENBR1IiLCAiMjAtWWVhciBDQUdSIiwgIjMwLVllYXIgQ0FHUiIpKSkNCg0KIyBBc3NpZ24gY29sb3JzIGR5bmFtaWNhbGx5IGJhc2VkIG9uIHRoZSBvcmRlciBvZiBDQUdSX1BlcmlvZCBpbiB0aGUgZGF0YQ0KIyBNYXRjaCB0aGUgdW5pcXVlIGxldmVscyBvZiBDQUdSX1BlcmlvZCB3aXRoIGNvbG9ycyBmcm9tIGNvbG9yc19nZW5lcmFsX2RhcmsNCnVuaXF1ZV90eXBlcyA8LSB1bmlxdWUobnJ0X2xvbmckQ0FHUl9QZXJpb2QpDQpjdXN0b21fY29sb3JzIDwtIHNldE5hbWVzKGNvbG9yc19nZW5lcmFsX2RhcmtbMTpsZW5ndGgodW5pcXVlX3R5cGVzKV0sIHVuaXF1ZV90eXBlcykNCg0KIyBGaW5kIHRoZSBtaW5pbXVtIGFuZCBtYXhpbXVtIHgtdmFsdWUgaW4geW91ciBkYXRhDQptYXhfeCA8LSBtYXgoYXMuaW50ZWdlcih0c2xhX3Jhd19jYWdyJERhdGUpLCBuYS5ybSA9IFRSVUUpDQptaW5feCA8LSBtaW4oYXMuaW50ZWdlcih0c2xhX3Jhd19jYWdyJERhdGUpLCBuYS5ybSA9IFRSVUUpDQppbnRlcmFjdGl2ZV9wcmludChtYXhfeCkgICMgVGVzdA0KaW50ZXJhY3RpdmVfcHJpbnQobWluX3gpICAjIFRlc3QNCg0KIyBGaW5kIHRoZSBtaW5pbXVtIGFuZCBtYXhpbXVtIHllYXINCm1pbl95ZWFyIDwtIG1pbih0c2xhX3Jhd19jYWdyJERhdGUsIG5hLnJtID0gVFJVRSkNCm1heF95ZWFyIDwtIG1heCh0c2xhX3Jhd19jYWdyJERhdGUsIG5hLnJtID0gVFJVRSkNCmludGVyYWN0aXZlX3ByaW50KG1pbl95ZWFyKQ0KaW50ZXJhY3RpdmVfcHJpbnQobWF4X3llYXIpDQoNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQojIyBQTE9UIEZVTEwgV0lUSE9VVCBMSU1JVFMNCg0KIyBEZWZpbmUgc3RhcnQgYW5kIGVuZCB5ZWFycw0Kc3RhcnRfeWVhciA8LSBhcy5udW1lcmljKG1pbl95ZWFyKQ0KZW5kX3llYXIgPC0gMjAyNA0KeWVhcl9yYW5nZSA8LSBlbmRfeWVhciAtIHN0YXJ0X3llYXIgKyAxICAjIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIHllYXJzDQoNCiMgRGVmaW5lIGJyZWFrcyByb3VuZGVkIGFwcHJvcHJpYXRlbHkNCmxpbWl0c19zdGFydF95ZWFyIDwtIGZsb29yKHN0YXJ0X3llYXIgLyA1KSAqIDUgICMgUm91bmQgZG93biB0byB0aGUgbmVhcmVzdCBtdWx0aXBsZSBvZiA1DQpsaW1pdHNfZW5kX3llYXIgPC0gY2VpbGluZyhlbmRfeWVhciAvIDUpICogNSAgICMgUm91bmQgdXAgdG8gdGhlIG5lYXJlc3QgbXVsdGlwbGUgb2YgNQ0KDQojIENyZWF0ZSBkeW5hbWljIHRpdGxlIGFuZCBjYXB0aW9uDQpkeW5hbWljX3RpdGxlIDwtIHBhc3RlMCgiUm9sbGluZyBDQUdScyBBY3Jvc3MgUGVyaW9kcyBPdmVyICIseWVhcl9yYW5nZSwgIiBZZWFycyAoIiwgc3RhcnRfeWVhciwgIi0iLCBlbmRfeWVhciwgIikiKQ0KZHluYW1pY19jYXB0aW9uIDwtIHBhc3RlMCgiVFNMQSBDb21wb3VuZCBBdmVyYWdlIEdyb3d0aCBSYXRlcyBBY3Jvc3MgUm9sbGluZyBQZXJpb2RzLCBEYXRhc2V0ICgiLCBtaW5feWVhciwgIi0iLCBtYXhfeWVhciwgIikiKQ0KDQojIENyZWF0ZSB0aGUgZnVsbCwgbm9uLWZpbHRlcmVkIHgtYXhpcyBwbG90IHdpdGggZHluYW1pYyB4IHBsYWNlbWVudCBmb3IgYW5ub3RhdGlvbnMNCnAxIDwtIGdncGxvdChucnRfbG9uZywgYWVzKHggPSBhcy5pbnRlZ2VyKERhdGUpLCB5ID0gQ0FHUl9WYWx1ZSwgY29sb3IgPSBDQUdSX1BlcmlvZCkpICsNCg0KICAjIEFkZCBzaGFkZWQgYXJlYXMgZm9yIGJhY2tncm91bmQgZWZmZWN0DQogIGdlb21fcmVjdChhZXMoeG1pbiA9IC1JbmYsIHhtYXggPSBJbmYsIHltaW4gPSB0YXJnZXRfYWdncmVzc2l2ZSwgeW1heCA9IEluZiksIGZpbGwgPSAibGlnaHRncmVlbiIsIGFscGhhID0gMC4wMTApICsNCiAgZ2VvbV9yZWN0KGFlcyh4bWluID0gLUluZiwgeG1heCA9IEluZiwgeW1pbiA9IHRhcmdldF9jb25zZXJ2YXRpdmUsIHltYXggPSB0YXJnZXRfYWdncmVzc2l2ZSksIGZpbGwgPSAib3JhbmdlIiwgYWxwaGEgPSAwLjAxKSArDQogIGdlb21fcmVjdChhZXMoeG1pbiA9IC1JbmYsIHhtYXggPSBJbmYsIHltaW4gPSAtSW5mLCB5bWF4ID0gdGFyZ2V0X2NvbnNlcnZhdGl2ZSksIGZpbGwgPSAibGlnaHRjb3JhbCIsIGFscGhhID0gMC4wMTApICsNCiAgDQogICMgUGxvdCBsaW5lcyBmb3IgZWFjaCBDQUdSIFBlcmlvZA0KICBnZW9tX2xpbmUoc2l6ZSA9IDEuMCwgYWxwaGEgPSAzLjApICsgICAgICAgIyBMaW5lIGZvciBlYWNoIENBR1INCiAgZ2VvbV9wb2ludChzaXplID0gMS4wLCBhbHBoYSA9IDMuMCkgKyAgICAgICAjIFBvaW50cyBmb3IgZWFjaCBDQUdSDQogIA0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSB0YXJnZXRfYWdncmVzc2l2ZSwgY29sb3IgPSAiZGFya2JsdWUiLCBsaW5ldHlwZSA9ICJzb2xpZCIpICsNCiAgIyBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSB0YXJnZXRfbW9kZXJhdGUsIGNvbG9yID0gImRhcmtibHVlIiwgbGluZXR5cGUgPSAic29saWQiKSArDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IHRhcmdldF9jb25zZXJ2YXRpdmUsIGNvbG9yID0gImRhcmtibHVlIiwgbGluZXR5cGUgPSAic29saWQiKSArDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IHRhcmdldF9pbmZsYXRpb24sIGNvbG9yID0gImRhcmtyZWQiLCBsaW5ldHlwZSA9ICJkYXNoZWQiKSArDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IGNhZ3JfdmFsdWUsIGNvbG9yID0gImRhcmtyZWQiLCBsaW5ldHlwZSA9ICJkYXNoZWQiKSArDQogIA0KICAjIER5bmFtaWMgcmlnaHQtYWxpZ25lZCBwbGFjZW1lbnQgZm9yIGFubm90YXRpb25zDQogIGFubm90YXRlKCJ0ZXh0IiwgeCA9IEluZiwgeSA9IHRhcmdldF9hZ2dyZXNzaXZlLCBsYWJlbCA9ICJBZ2dyZXNzaXZlL0NvbnNlcnZhdGl2ZSIsIA0KICAgICAgICAgICBoanVzdCA9IDEsIHZqdXN0ID0gLTAuNTAsIGNvbG9yID0gImRhcmtibHVlIiwgc2l6ZSA9IDQpICsNCiAgIyBhbm5vdGF0ZSgidGV4dCIsIHggPSBJbmYsIHkgPSB0YXJnZXRfbW9kZXJhdGUsIGxhYmVsID0gIk1vZGVyYXRlIiwgDQogICMgICAgICAgICBoanVzdCA9IDEsIHZqdXN0ID0gLTAuNTAsIGNvbG9yID0gImRhcmtibHVlIiwgc2l6ZSA9IDQpICsNCiAgYW5ub3RhdGUoInRleHQiLCB4ID0gSW5mLCB5ID0gdGFyZ2V0X2NvbnNlcnZhdGl2ZSwgbGFiZWwgPSAiIiwgICAgICAgICAgICBoanVzdCA9IDEsIHZqdXN0ID0gKzEuMTAsIGNvbG9yID0gImRhcmtibHVlIiwgc2l6ZSA9IDQpICsNCiAgYW5ub3RhdGUoInRleHQiLCB4ID0gSW5mLCB5ID0gdGFyZ2V0X2luZmxhdGlvbiwgbGFiZWwgPSAiSW5mbGF0aW9uIiwgDQogICAgICAgICAgIGhqdXN0ID0gMSwgdmp1c3QgPSArMS4xMCwgY29sb3IgPSAiZGFya3JlZCIsIHNpemUgPSA0KSArDQogIGFubm90YXRlKCJ0ZXh0IiwgeCA9IEluZiwgeSA9IGNhZ3JfdmFsdWUsIGxhYmVsID0gIkNBR1IiLCANCiAgICAgICAgICAgaGp1c3QgPSAxLCB2anVzdCA9IC0wLjUwLCBjb2xvciA9ICJkYXJrcmVkIiwgc2l6ZSA9IDQpICsgDQoNCiAgbGFicygNCiAgICB0aXRsZSA9IGR5bmFtaWNfdGl0bGUsDQogICAgeCA9ICJZZWFyIiwNCiAgICB5ID0gIkNBR1IgVmFsdWUgKCUpIiwNCiAgICBjb2xvciA9ICJDQUdSIFBlcmlvZCIsDQogICAgY2FwdGlvbiA9IGR5bmFtaWNfY2FwdGlvbg0KICAgICkgKw0KICANCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGN1c3RvbV9jb2xvcnMpICsgICMgU2V0IGNvbG9ycyBmb3IgZWFjaCBDQUdSIFBlcmlvZA0KICBzY2FsZV94X2NvbnRpbnVvdXMoDQogICAgbGltaXRzID0gYyhzdGFydF95ZWFyLCBlbmRfeWVhciArIDMpLCANCiAgICBicmVha3MgPSBzZXEobGltaXRzX3N0YXJ0X3llYXIsIGxpbWl0c19lbmRfeWVhciAsIDUpKSArICAjIFJlc3RyaWN0ICYgU2V0IE1ham9yIHgtYXhpcyBsaW5lcyBmb3IgZWFjaCB5ZWFyDQogIA0KICB0aGVtZV9taW5pbWFsKCkgKw0KICB0aGVtZSgNCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41LCBzaXplID0gMjApLCAgICAgICAgICMgTGFyZ2VyIHRpdGxlIGZvbnQNCiAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0KSwgICAgICAgICAgICAgICAgICAgICMgTGFyZ2VyIHgtYXhpcyBsYWJlbCBmb250DQogICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCksICAgICAgICAgICAgICAgICAgICAjIExhcmdlciB5LWF4aXMgbGFiZWwgZm9udA0KICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSwgc2l6ZSA9IDE0KSwgICMgTGFyZ2VyIHgtYXhpcyB0ZXh0DQogICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0KSwgICAgICAgICAgICAgICAgICAgICAjIExhcmdlciB5LWF4aXMgdGV4dA0KICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQpLCAgICAgICAgICAgICAgICAgICAgIyBMZWdlbmQgdGl0bGUgc2l6ZQ0KICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiksICAgICAgICAgICAgICAgICAgICAgIyBMZWdlbmQgdGV4dCBzaXplDQogICAgcGFuZWwuZ3JpZC5tYWpvciA9IGVsZW1lbnRfbGluZShsaW5ldHlwZSA9ICJkb3R0ZWQiLCBjb2xvciA9ICJibGFjayIpLCAgIyBNYWpvciBncmlkIGxpbmVzDQogICAgcGFuZWwuZ3JpZC5taW5vci54ID0gZWxlbWVudF9ibGFuaygpLCAgICAgICAgICAgICAgICAgICAgICAjIE5vIG1pbm9yIHggZ3JpZCBsaW5lcw0KICAgIGF4aXMudGlja3MubGVuZ3RoID0gdW5pdCgtMC4yNSwgImNtIiksICAgICAgICAgICAgICAgICAgICAgICMgSW5jcmVhc2UgdGljayBsZW5ndGgNCiAgICBheGlzLnRpY2tzID0gZWxlbWVudF9saW5lKGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDAuNTApLCAgICMgRGFya2VyIHRpY2tzDQogICAgYXhpcy5saW5lLnggPSBlbGVtZW50X2xpbmUoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMC43NSksICAjIERhcmsgYm90dG9tIGJvcmRlcg0KICAgIGF4aXMubGluZS55ID0gZWxlbWVudF9saW5lKGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDAuNzUpICAgIyBEYXJrIGxlZnQgYm9yZGVyDQogICkNCg0KIyBQcmludCB0aGUgcGxvdCANCnByaW50KHAxKQ0KDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KIyMgUExPVCBSRVNUUklDVEVEIFdJVEggTElNSVRTIA0KDQojIEZpbHRlciB0aGUgZGF0YSBmb3IgdGhlIHJlc3RyaWN0ZWQgeC1heGlzIHJhbmdlICgyMDEyLTIwMjQpDQpyZXN0cmljdGVkX2RhdGEgPC0gbnJ0X2xvbmcgJT4lDQogIGZpbHRlcihhcy5pbnRlZ2VyKERhdGUpID49IDIwMTIgJiBhcy5pbnRlZ2VyKERhdGUpIDw9IDIwMjQpDQoNCiMgRGVmaW5lIHN0YXJ0IGFuZCBlbmQgeWVhcnMNCnN0YXJ0X3llYXIgPC0gMjAxMg0KZW5kX3llYXIgPC0gMjAyNA0KeWVhcl9yYW5nZSA8LSBlbmRfeWVhciAtIHN0YXJ0X3llYXIgKyAxICAjIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIHllYXJzDQoNCiMgRGVmaW5lIGJyZWFrcyByb3VuZGVkIGFwcHJvcHJpYXRlbHkNCmxpbWl0c19zdGFydF95ZWFyIDwtIGZsb29yKHN0YXJ0X3llYXIgLyA1KSAqIDUgICMgUm91bmQgZG93biB0byB0aGUgbmVhcmVzdCBtdWx0aXBsZSBvZiA1DQpsaW1pdHNfZW5kX3llYXIgPC0gY2VpbGluZyhlbmRfeWVhciAvIDUpICogNSAgICMgUm91bmQgdXAgdG8gdGhlIG5lYXJlc3QgbXVsdGlwbGUgb2YgNQ0KDQojIENyZWF0ZSBkeW5hbWljIHRpdGxlIGFuZCBjYXB0aW9uDQpkeW5hbWljX3RpdGxlIDwtIHBhc3RlMCgiUm9sbGluZyBDQUdScyBBY3Jvc3MgUGVyaW9kcyBPdmVyICIseWVhcl9yYW5nZSwgIiBZZWFycyAoIiwgc3RhcnRfeWVhciwgIi0iLCBlbmRfeWVhciwgIikiKQ0KZHluYW1pY19jYXB0aW9uIDwtIHBhc3RlMCgiVFNMQSBDb21wb3VuZCBBdmVyYWdlIEdyb3d0aCBSYXRlcyBBY3Jvc3MgUm9sbGluZyBQZXJpb2RzLCBEYXRhc2V0ICgiLCBtaW5feWVhciwgIi0iLCBtYXhfeWVhciwgIikiKQ0KDQojIENhbGN1bGF0ZSBkeW5hbWljIHktYXhpcyBsaW1pdHMgZm9yIHRoZSByZXN0cmljdGVkIGRhdGENCnlfbWluIDwtIG1pbihyZXN0cmljdGVkX2RhdGEkQ0FHUl9WYWx1ZSwgbmEucm0gPSBUUlVFKQ0KeV9tYXggPC0gbWF4KHJlc3RyaWN0ZWRfZGF0YSRDQUdSX1ZhbHVlLCBuYS5ybSA9IFRSVUUpDQoNCiMgQ3JlYXRlIHRoZSBmaWx0ZXJlZCwgcmVzdHJpY3RlZCB4LWF4aXMgcGxvdCB3aXRoIGR5bmFtaWMgeCBwbGFjZW1lbnQgZm9yIGFubm90YXRpb25zDQpwMyA8LSBnZ3Bsb3QobnJ0X2xvbmcsIGFlcyh4ID0gYXMuaW50ZWdlcihEYXRlKSwgeSA9IENBR1JfVmFsdWUsIGNvbG9yID0gQ0FHUl9QZXJpb2QpKSArDQoNCiAgIyBBZGQgc2hhZGVkIGFyZWFzIGZvciBiYWNrZ3JvdW5kIGVmZmVjdA0KICBnZW9tX3JlY3QoYWVzKHhtaW4gPSAtSW5mLCB4bWF4ID0gSW5mLCB5bWluID0gdGFyZ2V0X2FnZ3Jlc3NpdmUsIHltYXggPSBJbmYpLCBmaWxsID0gImxpZ2h0Z3JlZW4iLCBhbHBoYSA9IDAuMDEwKSArDQogIGdlb21fcmVjdChhZXMoeG1pbiA9IC1JbmYsIHhtYXggPSBJbmYsIHltaW4gPSB0YXJnZXRfY29uc2VydmF0aXZlLCB5bWF4ID0gdGFyZ2V0X2FnZ3Jlc3NpdmUpLCBmaWxsID0gIm9yYW5nZSIsIGFscGhhID0gMC4wMSkgKw0KICBnZW9tX3JlY3QoYWVzKHhtaW4gPSAtSW5mLCB4bWF4ID0gSW5mLCB5bWluID0gLUluZiwgeW1heCA9IHRhcmdldF9jb25zZXJ2YXRpdmUpLCBmaWxsID0gImxpZ2h0Y29yYWwiLCBhbHBoYSA9IDAuMDEwKSArDQogIA0KICAjIFBsb3QgbGluZXMgZm9yIGVhY2ggQ0FHUiBQZXJpb2QNCiAgZ2VvbV9saW5lKHNpemUgPSAxLjAsIGFscGhhID0gMy4wKSArICAgICAgICMgTGluZSBmb3IgZWFjaCBDQUdSDQogIGdlb21fcG9pbnQoc2l6ZSA9IDEuMCwgYWxwaGEgPSAzLjApICsgICAgICAgIyBQb2ludHMgZm9yIGVhY2ggQ0FHUg0KDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IHRhcmdldF9hZ2dyZXNzaXZlLCBjb2xvciA9ICJkYXJrYmx1ZSIsIGxpbmV0eXBlID0gInNvbGlkIikgKw0KICAjIGdlb21faGxpbmUoeWludGVyY2VwdCA9IHRhcmdldF9tb2RlcmF0ZSwgY29sb3IgPSAiZGFya2JsdWUiLCBsaW5ldHlwZSA9ICJzb2xpZCIpICsNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gdGFyZ2V0X2NvbnNlcnZhdGl2ZSwgY29sb3IgPSAiZGFya2JsdWUiLCBsaW5ldHlwZSA9ICJzb2xpZCIpICsNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gdGFyZ2V0X2luZmxhdGlvbiwgY29sb3IgPSAiZGFya3JlZCIsIGxpbmV0eXBlID0gImRhc2hlZCIpICsNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gY2Fncl92YWx1ZSwgY29sb3IgPSAiZGFya3JlZCIsIGxpbmV0eXBlID0gImRhc2hlZCIpICsNCiAgDQogICMgRHluYW1pYyByaWdodC1hbGlnbmVkIHBsYWNlbWVudCBmb3IgYW5ub3RhdGlvbnMNCiAgYW5ub3RhdGUoInRleHQiLCB4ID0gSW5mLCB5ID0gdGFyZ2V0X2FnZ3Jlc3NpdmUsIGxhYmVsID0gIkFnZ3Jlc3NpdmUvQ29uc2VydmF0aXZlIiwgDQogICAgICAgICAgIGhqdXN0ID0gMSwgdmp1c3QgPSAtMC41MCwgY29sb3IgPSAiZGFya2JsdWUiLCBzaXplID0gNCkgKw0KICAjIGFubm90YXRlKCJ0ZXh0IiwgeCA9IEluZiwgeSA9IHRhcmdldF9tb2RlcmF0ZSwgbGFiZWwgPSAiTW9kZXJhdGUiLCANCiAgIyAgICAgICAgIGhqdXN0ID0gMSwgdmp1c3QgPSAtMC41MCwgY29sb3IgPSAiZGFya2JsdWUiLCBzaXplID0gNCkgKw0KICBhbm5vdGF0ZSgidGV4dCIsIHggPSBJbmYsIHkgPSB0YXJnZXRfY29uc2VydmF0aXZlLCBsYWJlbCA9ICIiLCANCiAgICAgICAgICAgaGp1c3QgPSAxLCB2anVzdCA9ICsxLjEwLCBjb2xvciA9ICJkYXJrYmx1ZSIsIHNpemUgPSA0KSArDQogIGFubm90YXRlKCJ0ZXh0IiwgeCA9IEluZiwgeSA9IHRhcmdldF9pbmZsYXRpb24sIGxhYmVsID0gIkluZmxhdGlvbiIsIA0KICAgICAgICAgICBoanVzdCA9IDEsIHZqdXN0ID0gKzEuMTAsIGNvbG9yID0gImRhcmtyZWQiLCBzaXplID0gNCkgKw0KICBhbm5vdGF0ZSgidGV4dCIsIHggPSBJbmYsIHkgPSBjYWdyX3ZhbHVlLCBsYWJlbCA9ICJDQUdSIiwgDQogICAgICAgICAgIGhqdXN0ID0gMSwgdmp1c3QgPSAtMC41MCwgY29sb3IgPSAiZGFya3JlZCIsIHNpemUgPSA0KSArIA0KDQogIGxhYnMoDQogICAgdGl0bGUgPSBkeW5hbWljX3RpdGxlLA0KICAgIHggPSAiWWVhciIsDQogICAgeSA9ICJDQUdSIFZhbHVlICglKSIsDQogICAgY29sb3IgPSAiQ0FHUiBQZXJpb2QiLA0KICAgIGNhcHRpb24gPSBkeW5hbWljX2NhcHRpb24NCiAgICApICsNCiAgDQogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjdXN0b21fY29sb3JzKSArICAjIFNldCBjb2xvcnMgZm9yIGVhY2ggQ0FHUiBQZXJpb2QNCiAgY29vcmRfY2FydGVzaWFuKHlsaW0gPSBjKHlfbWluLCB5X21heCkpICsgIyBBcHBseSBkeW5hbWljIHktYXhpcyBsaW1pdHMNCiAgc2NhbGVfeF9jb250aW51b3VzKA0KICAgIGxpbWl0cyA9IGMoc3RhcnRfeWVhciwgZW5kX3llYXIgKyAyICsgMSksIA0KICAgIGJyZWFrcyA9IHNlcShsaW1pdHNfc3RhcnRfeWVhciwgbGltaXRzX2VuZF95ZWFyLCA1KQ0KICApICsgICMgUmVzdHJpY3QgJiBTZXQgTWFqb3IgeC1heGlzIGxpbmVzIGZvciBlYWNoIHllYXINCg0KICB0aGVtZV9taW5pbWFsKCkgKw0KICB0aGVtZSgNCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41LCBzaXplID0gMjApLCAgICAgICAgICMgTGFyZ2VyIHRpdGxlIGZvbnQNCiAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0KSwgICAgICAgICAgICAgICAgICAgICMgTGFyZ2VyIHgtYXhpcyBsYWJlbCBmb250DQogICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCksICAgICAgICAgICAgICAgICAgICAjIExhcmdlciB5LWF4aXMgbGFiZWwgZm9udA0KICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSwgc2l6ZSA9IDE0KSwgICMgTGFyZ2VyIHgtYXhpcyB0ZXh0DQogICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0KSwgICAgICAgICAgICAgICAgICAgICAjIExhcmdlciB5LWF4aXMgdGV4dA0KICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQpLCAgICAgICAgICAgICAgICAgICAgIyBMZWdlbmQgdGl0bGUgc2l6ZQ0KICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiksICAgICAgICAgICAgICAgICAgICAgIyBMZWdlbmQgdGV4dCBzaXplDQogICAgcGFuZWwuZ3JpZC5tYWpvciA9IGVsZW1lbnRfbGluZShsaW5ldHlwZSA9ICJkb3R0ZWQiLCBjb2xvciA9ICJibGFjayIpLCAgIyBNYWpvciBncmlkIGxpbmVzDQogICAgcGFuZWwuZ3JpZC5taW5vci54ID0gZWxlbWVudF9ibGFuaygpLCAgICAgICAgICAgICAgICAgICAgICAjIE5vIG1pbm9yIHggZ3JpZCBsaW5lcw0KICAgIGF4aXMudGlja3MubGVuZ3RoID0gdW5pdCgtMC4yNSwgImNtIiksICAgICAgICAgICAgICAgICAgICAgICMgSW5jcmVhc2UgdGljayBsZW5ndGgNCiAgICBheGlzLnRpY2tzID0gZWxlbWVudF9saW5lKGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDAuNTApLCAgICMgRGFya2VyIHRpY2tzDQogICAgYXhpcy5saW5lLnggPSBlbGVtZW50X2xpbmUoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMC43NSksICAjIERhcmsgYm90dG9tIGJvcmRlcg0KICAgIGF4aXMubGluZS55ID0gZWxlbWVudF9saW5lKGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDAuNzUpICAgIyBEYXJrIGxlZnQgYm9yZGVyDQogICkNCg0KIyBQcmludCB0aGUgcGxvdCANCnByaW50KHAzKQ0KDQpgYGANCg0KIyMjIyBTaG9ydC1UZXJtDQoNCmBgYHtyIHRzbGFfcmF3X2NhZ3JfZ3JhcGhzX3Nob3J0LCBmaWcud2lkdGg9MTAsIGZpZy5oZWlnaHQ9N30NCg0KY2F0KCJcblxuIyMjIyBDb21wb3VuZCBBdmVyYWdlIEdyb3d0aCBSYXRlcyBBY3Jvc3MgU2hvcnQtVGVybSBSb2xsaW5nIFBlcmlvZHMgXG4iKQ0KDQojIEZpbHRlciBkYXRhIGZvciBTaG9ydC1UZXJtIENBR1IgKDUtWWVhciBhbmQgMTAtWWVhcikNCnNob3J0dGVybV9kYXRhIDwtIG5ydF9sb25nICU+JQ0KICBmaWx0ZXIoQ0FHUl9QZXJpb2QgJWluJSBjKCI1LVllYXIgQ0FHUiIsICIxMC1ZZWFyIENBR1IiKSkNCg0KDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KIyMgUExPVCBGVUxMIFdJVEhPVVQgTElNSVRTDQoNCiMgRGVmaW5lIHN0YXJ0IGFuZCBlbmQgeWVhcnMNCnN0YXJ0X3llYXIgPC0gMjAxNg0KZW5kX3llYXIgPC0gMjAyNA0KeWVhcl9yYW5nZSA8LSBlbmRfeWVhciAtIHN0YXJ0X3llYXIgKyAxICAjIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIHllYXJzDQoNCiMgRGVmaW5lIGJyZWFrcyByb3VuZGVkIGFwcHJvcHJpYXRlbHkNCmxpbWl0c19zdGFydF95ZWFyIDwtIGZsb29yKHN0YXJ0X3llYXIgLyA1KSAqIDUgICMgUm91bmQgZG93biB0byB0aGUgbmVhcmVzdCBtdWx0aXBsZSBvZiA1DQpsaW1pdHNfZW5kX3llYXIgPC0gY2VpbGluZyhlbmRfeWVhciAvIDUpICogNSAgICMgUm91bmQgdXAgdG8gdGhlIG5lYXJlc3QgbXVsdGlwbGUgb2YgNQ0KDQojIENyZWF0ZSBkeW5hbWljIHRpdGxlIGFuZCBjYXB0aW9uDQpkeW5hbWljX3RpdGxlIDwtIHBhc3RlMCgiQ0FHUiBBY3Jvc3MgU2hvcnQtVGVybSBQZXJpb2RzIE92ZXIgIix5ZWFyX3JhbmdlLCAiIFllYXJzICgiLCBzdGFydF95ZWFyLCAiLSIsIGVuZF95ZWFyLCAiKSIpDQpkeW5hbWljX2NhcHRpb24gPC0gcGFzdGUwKCJUU0xBIENvbXBvdW5kIEF2ZXJhZ2UgR3Jvd3RoIFJhdGVzIEFjcm9zcyBTaG9ydC1UZXJtIFJvbGxpbmcgUGVyaW9kcywgRGF0YXNldCAoIiwgbWluX3llYXIsICItIiwgbWF4X3llYXIsICIpIikNCg0KIyBDcmVhdGUgdGhlIGZ1bGwsIG5vbi1maWx0ZXJlZCB4LWF4aXMgcGxvdCB3aXRoIGR5bmFtaWMgeCBwbGFjZW1lbnQgZm9yIGFubm90YXRpb25zDQpwMV9zaG9ydHRlcm0gPC0gZ2dwbG90KHNob3J0dGVybV9kYXRhLCBhZXMoeCA9IGFzLmludGVnZXIoRGF0ZSksIHkgPSBDQUdSX1ZhbHVlLCBjb2xvciA9IENBR1JfUGVyaW9kKSkgKw0KDQogICMgQWRkIHNoYWRlZCBhcmVhcyBmb3IgYmFja2dyb3VuZCBlZmZlY3QNCiAgZ2VvbV9yZWN0KGFlcyh4bWluID0gLUluZiwgeG1heCA9IEluZiwgeW1pbiA9IHRhcmdldF9hZ2dyZXNzaXZlLCB5bWF4ID0gSW5mKSwgZmlsbCA9ICJsaWdodGdyZWVuIiwgYWxwaGEgPSAwLjAxMCkgKw0KICBnZW9tX3JlY3QoYWVzKHhtaW4gPSAtSW5mLCB4bWF4ID0gSW5mLCB5bWluID0gdGFyZ2V0X2NvbnNlcnZhdGl2ZSwgeW1heCA9IHRhcmdldF9hZ2dyZXNzaXZlKSwgZmlsbCA9ICJvcmFuZ2UiLCBhbHBoYSA9IDAuMDEpICsNCiAgZ2VvbV9yZWN0KGFlcyh4bWluID0gLUluZiwgeG1heCA9IEluZiwgeW1pbiA9IC1JbmYsIHltYXggPSB0YXJnZXRfY29uc2VydmF0aXZlKSwgZmlsbCA9ICJsaWdodGNvcmFsIiwgYWxwaGEgPSAwLjAxMCkgKw0KICANCiAgIyBQbG90IGxpbmVzIGZvciBlYWNoIENBR1IgUGVyaW9kDQogIGdlb21fbGluZShzaXplID0gMS4wLCBhbHBoYSA9IDMuMCkgKyAgICAgICAjIExpbmUgZm9yIGVhY2ggQ0FHUg0KICBnZW9tX3BvaW50KHNpemUgPSAxLjAsIGFscGhhID0gMy4wKSArICAgICAgICMgUG9pbnRzIGZvciBlYWNoIENBR1INCg0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSB0YXJnZXRfYWdncmVzc2l2ZSwgY29sb3IgPSAiZGFya2JsdWUiLCBsaW5ldHlwZSA9ICJzb2xpZCIpICsNCiAgIyBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSB0YXJnZXRfbW9kZXJhdGUsIGNvbG9yID0gImRhcmtibHVlIiwgbGluZXR5cGUgPSAic29saWQiKSArDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IHRhcmdldF9jb25zZXJ2YXRpdmUsIGNvbG9yID0gImRhcmtibHVlIiwgbGluZXR5cGUgPSAic29saWQiKSArDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IHRhcmdldF9pbmZsYXRpb24sIGNvbG9yID0gImRhcmtyZWQiLCBsaW5ldHlwZSA9ICJkYXNoZWQiKSArDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IGNhZ3JfdmFsdWUsIGNvbG9yID0gImRhcmtyZWQiLCBsaW5ldHlwZSA9ICJkYXNoZWQiKSArDQogIA0KICAjIER5bmFtaWMgcmlnaHQtYWxpZ25lZCBwbGFjZW1lbnQgZm9yIGFubm90YXRpb25zDQogIGFubm90YXRlKCJ0ZXh0IiwgeCA9IEluZiwgeSA9IHRhcmdldF9hZ2dyZXNzaXZlLCBsYWJlbCA9ICJBZ2dyZXNzaXZlIiwgDQogICAgICAgICAgIGhqdXN0ID0gMSwgdmp1c3QgPSAtMC41MCwgY29sb3IgPSAiZGFya2JsdWUiLCBzaXplID0gNCkgKw0KICAjIGFubm90YXRlKCJ0ZXh0IiwgeCA9IEluZiwgeSA9IHRhcmdldF9tb2RlcmF0ZSwgbGFiZWwgPSAiTW9kZXJhdGUiLCANCiAgIyAgICAgICAgIGhqdXN0ID0gMSwgdmp1c3QgPSAtMC41MCwgY29sb3IgPSAiZGFya2JsdWUiLCBzaXplID0gNCkgKw0KICBhbm5vdGF0ZSgidGV4dCIsIHggPSBJbmYsIHkgPSB0YXJnZXRfY29uc2VydmF0aXZlLCBsYWJlbCA9ICJDb25zZXJ2YXRpdmUiLCANCiAgICAgICAgICAgaGp1c3QgPSAxLCB2anVzdCA9IC0wLjUwLCBjb2xvciA9ICJkYXJrYmx1ZSIsIHNpemUgPSA0KSArDQogIGFubm90YXRlKCJ0ZXh0IiwgeCA9IEluZiwgeSA9IHRhcmdldF9pbmZsYXRpb24sIGxhYmVsID0gIkluZmxhdGlvbiIsIA0KICAgICAgICAgICBoanVzdCA9IDEsIHZqdXN0ID0gKzEuMzAsIGNvbG9yID0gImRhcmtyZWQiLCBzaXplID0gNCkgKw0KICBhbm5vdGF0ZSgidGV4dCIsIHggPSBJbmYsIHkgPSBjYWdyX3ZhbHVlLCBsYWJlbCA9ICJDQUdSIiwgDQogICAgICAgICAgIGhqdXN0ID0gMSwgdmp1c3QgPSAtMC41MCwgY29sb3IgPSAiZGFya3JlZCIsIHNpemUgPSA0KSArIA0KDQogIGxhYnMoDQogICAgdGl0bGUgPSBkeW5hbWljX3RpdGxlLA0KICAgIHggPSAiWWVhciIsDQogICAgeSA9ICJDQUdSIFZhbHVlICglKSIsDQogICAgY29sb3IgPSAiQ0FHUiBQZXJpb2QiLA0KICAgIGNhcHRpb24gPSBkeW5hbWljX2NhcHRpb24NCiAgICApICsNCiAgDQogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjdXN0b21fY29sb3JzW2MoIjUtWWVhciBDQUdSIiwgIjEwLVllYXIgQ0FHUiIpXSkgKw0KICBzY2FsZV94X2NvbnRpbnVvdXMoDQogICAgbGltaXRzID0gYyhzdGFydF95ZWFyLCBlbmRfeWVhciArIDEpLCANCiAgICBicmVha3MgPSBzZXEobGltaXRzX3N0YXJ0X3llYXIsIGxpbWl0c19lbmRfeWVhciArIDEgLCA1KQ0KICApICsgICMgUmVzdHJpY3QgJiBTZXQgTWFqb3IgeC1heGlzIGxpbmVzIGZvciBlYWNoIHllYXINCg0KICB0aGVtZV9taW5pbWFsKCkgKw0KICB0aGVtZSgNCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41LCBzaXplID0gMjApLCAgICAgICAgICMgTGFyZ2VyIHRpdGxlIGZvbnQNCiAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0KSwgICAgICAgICAgICAgICAgICAgICMgTGFyZ2VyIHgtYXhpcyBsYWJlbCBmb250DQogICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCksICAgICAgICAgICAgICAgICAgICAjIExhcmdlciB5LWF4aXMgbGFiZWwgZm9udA0KICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSwgc2l6ZSA9IDE0KSwgICMgTGFyZ2VyIHgtYXhpcyB0ZXh0DQogICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0KSwgICAgICAgICAgICAgICAgICAgICAjIExhcmdlciB5LWF4aXMgdGV4dA0KICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQpLCAgICAgICAgICAgICAgICAgICAgIyBMZWdlbmQgdGl0bGUgc2l6ZQ0KICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiksICAgICAgICAgICAgICAgICAgICAgIyBMZWdlbmQgdGV4dCBzaXplDQogICAgcGFuZWwuZ3JpZC5tYWpvciA9IGVsZW1lbnRfbGluZShsaW5ldHlwZSA9ICJkb3R0ZWQiLCBjb2xvciA9ICJibGFjayIpLCAgIyBNYWpvciBncmlkIGxpbmVzDQogICAgcGFuZWwuZ3JpZC5taW5vci54ID0gZWxlbWVudF9ibGFuaygpLCAgICAgICAgICAgICAgICAgICAgICAjIE5vIG1pbm9yIHggZ3JpZCBsaW5lcw0KICAgIGF4aXMudGlja3MubGVuZ3RoID0gdW5pdCgtMC4yNSwgImNtIiksICAgICAgICAgICAgICAgICAgICAgICMgSW5jcmVhc2UgdGljayBsZW5ndGgNCiAgICBheGlzLnRpY2tzID0gZWxlbWVudF9saW5lKGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDAuNTApLCAgICMgRGFya2VyIHRpY2tzDQogICAgYXhpcy5saW5lLnggPSBlbGVtZW50X2xpbmUoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMC43NSksICAjIERhcmsgYm90dG9tIGJvcmRlcg0KICAgIGF4aXMubGluZS55ID0gZWxlbWVudF9saW5lKGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDAuNzUpICAgIyBEYXJrIGxlZnQgYm9yZGVyDQogICkNCg0KIyBQcmludCB0aGUgcGxvdCANCnByaW50KHAxX3Nob3J0dGVybSkNCg0KYGBgDQoNCiMgQ09TVA0KDQpDb3N0Y28gV2hvbGVzYWxlIENvcnBvcmF0aW9uIChDT1NUKSBpcyBjb25zaWRlcmVkIGEgbGVhZGluZyByZXRhaWwgY29tcGFueSBoZWFkcXVhcnRlcmVkIGluIElzc2FxdWFoLCBXYXNoaW5ndG9uLiBFc3RhYmxpc2hlZCBpbiAxOTgzIGJ5IEphbWVzIFNpbmVnYWwgYW5kIEplZmZyZXkgQnJvdG1hbiwgQ29zdGNvIGlzIGJlc3Qga25vd24gZm9yIGl0cyBtZW1iZXJzaGlwLWJhc2VkIHdhcmVob3VzZSBzdG9yZXMgdGhhdCBvZmZlciBhIHdpZGUgcmFuZ2Ugb2YgcHJvZHVjdHMsIGluY2x1ZGluZyBncm9jZXJpZXMsIGVsZWN0cm9uaWNzLCBob3VzZWhvbGQgZ29vZHMsIGFuZCBhcHBhcmVsLCBhdCBjb21wZXRpdGl2ZSBwcmljZXMuIENvc3RjbyBpcyBhbHNvIHJlY29nbml6ZWQgZm9yIGl0cyBLaXJrbGFuZCBTaWduYXR1cmUgcHJpdmF0ZS1sYWJlbCBicmFuZCwgd2hpY2ggc3BhbnMgdmFyaW91cyBwcm9kdWN0IGNhdGVnb3JpZXMuIEluIGFkZGl0aW9uIHRvIHJldGFpbCwgQ29zdGNvIG9wZXJhdGVzIGluIGUtY29tbWVyY2UgYW5kIGxvZ2lzdGljcywgcHJvdmlkaW5nIG9ubGluZSBzaG9wcGluZyBhbmQgZWZmaWNpZW50IHN1cHBseSBjaGFpbiBtYW5hZ2VtZW50IHRvIGVuaGFuY2UgY3VzdG9tZXIgY29udmVuaWVuY2UuIA0KDQojIyBDT1NUIEdSDQoNCiMjIyBEYXRhDQoNClRoZSBDT1NUIERhdGEgcHJlc2VudGVkIGhlcmUgaXMgc291cmNlZCBmcm9tIFlhaG9vIEZpbmFuY2UsIGZpbHRlcmVkIHRvIGRpc3BsYXkgTW9udGhseSBIaXN0b3JpY2FsIERhdGEgKGUuZy4sIDAzLzAxLzIwMjQpLiBUaGlzIGRhdGEgcmVwcmVzZW50cyB0aGUgY2xvc2luZyBwcmljZSBvZiB0aGUgbGFzdCB0cmFkaW5nIGRheSBvZiBlYWNoIG1vbnRoIChlLmcuLCAwMy8yOC8yMDI0KS4gUGxlYXNlIG5vdGUgdGhhdCB0aGUgc3RhdGlzdGljcyBwcmVzZW50ZWQgaGVyZSBtYXkgZGlmZmVyIGZyb20gdGhvc2UgaW4gWWFob28gRmluYW5jZSdzIFBlcmZvcm1hbmNlIHNlY3Rpb24gZHVlIHRvIGRpZmZlcmVuY2VzIGluIGRhdGEgYWdncmVnYXRpb24gYW5kIGNhbGN1bGF0aW9uIG1ldGhvZHMuICANCg0KRGF0YSBTb3VyY2U6IGByIG5ydiRzb3VyY2VfY29zdF95YWhvb2ANCg0KYGBge3IgY29zdF9yYXcsIGV2YWw9VFJVRSwgZWNobz1GQUxTRX0NCg0KIyBEaXNwbGF5IHRoZSBzdHJ1Y3R1cmUgb2YgdGhlIGRhdGFzZXQgdG8gY29uZmlybSBjb2x1bW4gbmFtZXMNCmludGVyYWN0aXZlX3N0cihucnQkY29zdF9yYXcpDQoNCmxpYnJhcnkoZHBseXIpDQpsaWJyYXJ5KGx1YnJpZGF0ZSkgICMgRm9yIGRhdGUgbWFuaXB1bGF0aW9uDQpsaWJyYXJ5KHNjYWxlcykNCmxpYnJhcnkoc3RyaW5ncikNCg0KIyBFbnN1cmUgdGhlICdEYXRlJyBjb2x1bW4gaXMgb2YgRGF0ZSBjbGFzcw0KY29zdF9yYXcgPC0gbnJ0JGNvc3RfcmF3ICU+JQ0KICBtdXRhdGUoRGF0ZSA9IGFzLkRhdGUoRGF0ZSwgZm9ybWF0ID0gIiVZLSVtLSVkIikpDQoNCiMgRmluZCB0aGUgbWluaW11bSBhbmQgbWF4aW11bSB5ZWFyDQptaW5feWVhciA8LSBmb3JtYXQobWluKGNvc3RfcmF3JERhdGUsIG5hLnJtID0gVFJVRSksICIlWSIpDQptYXhfeWVhciA8LSBmb3JtYXQobWF4KGNvc3RfcmF3JERhdGUsIG5hLnJtID0gVFJVRSksICIlWSIpDQppbnRlcmFjdGl2ZV9wcmludChtaW5feWVhcikNCmludGVyYWN0aXZlX3ByaW50KG1heF95ZWFyKQ0KDQojIFVwZGF0ZSBkYXRhIGZyYW1lIHdpdGggcHJvcGVyIGRhdGUgYW5kIHBlcmNlbnRhZ2UgaGFuZGxpbmcNCmNvc3RfcmF3IDwtIGNvc3RfcmF3ICU+JQ0KICBtdXRhdGUoDQogICAgIyBDb252ZXJ0IENsb3NlIERhdGUgdG8gIllZWVktTU0tREQiIGZvcm1hdA0KICAgIGBEYXRlYCA9IGZvcm1hdChhcy5EYXRlKGFzLmNoYXJhY3RlcihgRGF0ZWApLCBvcmlnaW4gPSAiMTk3MC0wMS0wMSIpLCAiJVktJW0tJWQiKSwNCg0KICAgICMgRW5zdXJlIENsb3NlIGlzIGEgbnVtYmVyIGZvcm1hdHRlZCB0byAyIGRlY2ltYWwgcGxhY2VzDQogICAgYENsb3NlYCA9IG51bWJlcihhcy5udW1lcmljKGdzdWIoIiwiLCAiIiwgQ2xvc2UpKSwgYmlnLm1hcmsgPSAiLCIsIGRlY2ltYWwubWFyayA9ICIuIiwgYWNjdXJhY3kgPSAwLjAxKSwNCg0KICAgICMgQ2xlYW4gYW5kIGhhbmRsZSBwZXJjZW50YWdlIGNvbHVtbnMNCiAgICBhY3Jvc3MoMzozLCB+IHsNCiAgICAgIHZhbHVlIDwtIGdzdWIoIlssJVxcc10iLCAiIiwgLikgICMgUmVtb3ZlICUsIGNvbW1hcywgYW5kIHNwYWNlcw0KICAgICAgbnVtZXJpY192YWx1ZSA8LSBzdXBwcmVzc1dhcm5pbmdzKGFzLm51bWVyaWModmFsdWUpKSAgIyBDb252ZXJ0IHRvIG51bWVyaWMNCiAgICAgIGlmZWxzZSgNCiAgICAgICAgIWlzLm5hKG51bWVyaWNfdmFsdWUpLCANCiAgICAgICAgcGFzdGUwKGZvcm1hdChyb3VuZChudW1lcmljX3ZhbHVlKjEwMCwgMiksIGJpZy5tYXJrID0gIiwiLCBzY2llbnRpZmljID0gRkFMU0UpLCAiJSIpLCAgIyBGb3JtYXQgdG8gMiBkZWNpbWFsIHBsYWNlcyBhbmQgYWRkIGNvbW1hcw0KICAgICAgICAuDQogICAgICApDQogICAgfSkNCiAgKSAlPiUNCiAgYXJyYW5nZShkZXNjKGBEYXRlYCkpICAjIFNvcnQgYnkgRGF0ZSBmcm9tIG5ld2VzdCB0byBvbGRlc3QNCg0KIyBEaXNwbGF5IHRoZSBmb3JtYXR0ZWQgZGF0YQ0KaW50ZXJhY3RpdmVfc3RyKGNvc3RfcmF3KQ0KaW50ZXJhY3RpdmVfcHJpbnQoY29zdF9yYXcpDQoNCiMgRGlzcGxheSB0aGUgdGFibGUgd2l0aCBjYXB0aW9uDQpjYXQoIlxuXG4jIyMjIENPU1QgWWVhcmx5IFBlcmZvcm1hbmNlICgiLCBtaW5feWVhciwgIi0iLCBtYXhfeWVhciwgIilcbiIsIHNlcCA9ICIiKQ0KZm9ybWF0X2VxdWFsX3dpZHRoX2dyb3VwZWQoY29zdF9yYXcsIGdyb3VwaW5nX2ZhY3RvciA9IDIpDQojIGNhdCgiXG5cbiBTb3VyY2U6ICIsIG5ydiRzb3VyY2VfY29zdF95YWhvbywgIlxuIikNCg0KYGBgDQoNCiMjIyBTdW1tYXJ5DQoNCmBgYHtyIGNvc3RfcmF3X3N1bW1hcnksIGV2YWw9VFJVRSwgZWNobz1GQUxTRX0NCg0KIyBMb2FkIG5lY2Vzc2FyeSBsaWJyYXJpZXMNCmxpYnJhcnkoZHBseXIpDQpsaWJyYXJ5KHRpYmJsZSkNCmxpYnJhcnkoa25pdHIpDQpsaWJyYXJ5KGthYmxlRXh0cmEpDQoNCmludGVyYWN0aXZlX3N0cihjb3N0X3JhdykNCmludGVyYWN0aXZlX3ByaW50KGNvc3RfcmF3KQ0KDQojIEVuc3VyZSB0aGUgRGF0ZSBjb2x1bW4gaXMgYSBwcm9wZXIgRGF0ZSBvYmplY3QgYW5kIGV4dHJhY3QgdGhlIHllYXINCmNvc3RfcmF3IDwtIGNvc3RfcmF3ICU+JQ0KICBzbGljZSgtMSkgJT4lICMgUmVtb3ZlIHRoZSBmaXJzdCByb3cNCiAgIyBtdXRhdGUoRGF0ZSA9IGlmZWxzZShyb3dfbnVtYmVyKCkgPT0gMSwgIjIwMjUtMDEtMDEiLCBEYXRlKSkgJT4lDQogIG11dGF0ZSgNCiAgICBEYXRlID0gYXMubnVtZXJpYyhmb3JtYXQoYXMuRGF0ZShEYXRlLCBmb3JtYXQgPSAiJVktJW0tJWQiKSwgIiVZIikpLA0KICAgIGAxLVllYXIgQ0FHUmAgPSBhcy5udW1lcmljKGdzdWIoIlteMC05Li1dIiwgIiIsIGAxLVllYXIgQ0FHUmApKQ0KICApDQoNCiMgU29ydCBkYXRhIGJ5IERhdGUgaW4gYXNjZW5kaW5nIG9yZGVyDQpjb3N0X3JhdyA8LSBjb3N0X3JhdyAlPiUNCiAgYXJyYW5nZShEYXRlKQ0KDQoNCiMgQ2FsY3VsYXRlIHRoZSBDQUdSIGFuZCBkeW5hbWljYWxseSBjcmVhdGUgYSB2YXJpYWJsZSBuYW1lIHdpdGggdGhlIGZvcm1hdCBjb3N0X2NhZ3JfdmFsdWVfczxtaW5feWVhcj5fZTxtYXhfeWVhcj4NCmluaXRpYWxfdmFsdWUgPC0gMTAwICAjIEFzc3VtaW5nIGFuIGluaXRpYWwgaW5kZXggdmFsdWUgb2YgMTAwDQpmaW5hbF92YWx1ZSA8LSBpbml0aWFsX3ZhbHVlICogcHJvZCgxICsgY29zdF9yYXckYDEtWWVhciBDQUdSYCAvIDEwMCwgbmEucm0gPSBUUlVFKQ0KbWluX3llYXIgPC0gbWluKGNvc3RfcmF3JERhdGUsIG5hLnJtID0gVFJVRSkNCm1heF95ZWFyIDwtIG1heChjb3N0X3JhdyREYXRlLCBuYS5ybSA9IFRSVUUpDQpudW1feWVhcnMgPC0gbWF4X3llYXIgLSBtaW5feWVhcg0KY2Fncl92YWx1ZSA8LSByb3VuZCgoKGZpbmFsX3ZhbHVlIC8gaW5pdGlhbF92YWx1ZSleKDEgLyBudW1feWVhcnMpIC0gMSkgKiAxMDAsIDIpDQp2YXJfbmFtZSA8LSBwYXN0ZTAoImNvc3RfY2Fncl92YWx1ZV9zIiwgbWluX3llYXIsICJfZSIsIG1heF95ZWFyKQ0KYXNzaWduKHZhcl9uYW1lLCBjYWdyX3ZhbHVlKQ0KDQojIENvbnZlcnQgQ09TVCBkYXRhIHRvIG51bWVyaWMsIHJlbW92aW5nIGFueSBwZXJjZW50YWdlIHNpZ25zDQpkYXRhIDwtIGFzLm51bWVyaWMoZ3N1YigiJSIsICIiLCBjb3N0X3JhdyRgMS1ZZWFyIENBR1JgKSkNCg0KIyBDYWxjdWxhdGUgc3RhdGlzdGljcw0KY291bnRfb2JzZXJ2YXRpb25zIDwtIHN1bSghaXMubmEoZGF0YSkpDQptZWFuX3ZhbHVlIDwtIHJvdW5kKG1lYW4oZGF0YSwgbmEucm0gPSBUUlVFKSwgMikNCm1lZGlhbl92YWx1ZSA8LSByb3VuZChtZWRpYW4oZGF0YSwgbmEucm0gPSBUUlVFKSwgMikNCnNkX3ZhbHVlIDwtIHJvdW5kKHNkKGRhdGEsIG5hLnJtID0gVFJVRSksIDIpDQptaW5fY2Fncl9yYW5nZSA8LSByb3VuZChjYWdyX3ZhbHVlIC0gc2RfdmFsdWUsIDIpDQptYXhfY2Fncl9yYW5nZSA8LSByb3VuZChjYWdyX3ZhbHVlICsgc2RfdmFsdWUsIDIpDQptaW5fdmFsdWUgPC0gcm91bmQobWluKGRhdGEsIG5hLnJtID0gVFJVRSksIDIpDQptYXhfdmFsdWUgPC0gcm91bmQobWF4KGRhdGEsIG5hLnJtID0gVFJVRSksIDIpDQoNCiMgVGFyZ2V0IFJhdGUgQW5hbHlzaXMgLSBSZWZlciB0byAiUHJlZmVycmVkIFRhcmdldHMiIG9yIGluY2x1ZGUgYmVsb3cgZm9yIGluZGl2aWR1YWwgY2hhbmdlcy4NCmFib3ZlX3RhcmdldF9pbmZsYXRpb24gPC0gc3VtKGRhdGEgPj0gdGFyZ2V0X2luZmxhdGlvbiwgbmEucm0gPSBUUlVFKQ0KYWJvdmVfdGFyZ2V0X2NvbnNlcnZhdGl2ZSA8LSBzdW0oZGF0YSA+PSB0YXJnZXRfY29uc2VydmF0aXZlLCBuYS5ybSA9IFRSVUUpDQphYm92ZV90YXJnZXRfbW9kZXJhdGUgPC0gc3VtKGRhdGEgPj0gdGFyZ2V0X21vZGVyYXRlLCBuYS5ybSA9IFRSVUUpDQphYm92ZV90YXJnZXRfYWdncmVzc2l2ZSA8LSBzdW0oZGF0YSA+PSB0YXJnZXRfYWdncmVzc2l2ZSwgbmEucm0gPSBUUlVFKQ0KDQpwZXJjZW50X2Fib3ZlX3RhcmdldF9jb25zZXJ2YXRpdmUgPC0gcm91bmQoKGFib3ZlX3RhcmdldF9jb25zZXJ2YXRpdmUgLyBjb3VudF9vYnNlcnZhdGlvbnMpICogMTAwLCAyKQ0KcGVyY2VudF9hYm92ZV90YXJnZXRfaW5mbGF0aW9uIDwtIHJvdW5kKChhYm92ZV90YXJnZXRfaW5mbGF0aW9uIC8gY291bnRfb2JzZXJ2YXRpb25zKSAqIDEwMCwgMikNCnBlcmNlbnRfYWJvdmVfdGFyZ2V0X21vZGVyYXRlIDwtIHJvdW5kKChhYm92ZV90YXJnZXRfbW9kZXJhdGUgLyBjb3VudF9vYnNlcnZhdGlvbnMpICogMTAwLCAyKQ0KcGVyY2VudF9hYm92ZV90YXJnZXRfYWdncmVzc2l2ZSA8LSByb3VuZCgoYWJvdmVfdGFyZ2V0X2FnZ3Jlc3NpdmUgLyBjb3VudF9vYnNlcnZhdGlvbnMpICogMTAwLCAyKQ0KDQojIENvbXBpbGUgc3RhdGlzdGljcyBpbnRvIGEgbGlzdCBmb3IgZWFzeSBjb252ZXJzaW9uIHRvIGEgZGF0YSBmcmFtZSB3aXRoIGRlZmluaXRpb25zDQpjb3N0X3Jhd19zdW1tYXJ5IDwtIHRyaWJibGUoDQogIH5TdGF0aXN0aWMsIH5WYWx1ZSwgfkRlZmluaXRpb24sDQogICJDb3VudCBvZiBPYnNlcnZhdGlvbnMiLCBhcy5jaGFyYWN0ZXIoY291bnRfb2JzZXJ2YXRpb25zKSwgIlRvdGFsIG51bWJlciBvZiBkYXRhIHBvaW50cyBjb2xsZWN0ZWQgb3ZlciB0aGUgc3BlY2lmaWMgcGVyaW9kLiIsDQogICJDQUdSIiwgcGFzdGUwKGNhZ3JfdmFsdWUsICIlIiksICJDb21wb3VuZCBBdmVyYWdlIEdyb3d0aCBSYXRlOyBtZWFuIGdyb3d0aCByYXRlIG92ZXIgYSBwZXJpb2QgaWYgaXQgaGFkIGNvbXBvdW5kZWQgYW51YWxseS4iLA0KICAiTWVhbiIsIHBhc3RlMChtZWFuX3ZhbHVlLCAiJSIpLCAiUmVmbGVjdHMgdGhlIGdlbmVyYWwgcHJpY2UgbGV2ZWwgYW5kIG92ZXJhbGwgZ3Jvd3RoIHJhdGUuIiwNCiAgIk1lZGlhbiIsIHBhc3RlMChtZWRpYW5fdmFsdWUsICIlIiksICJNaWRkbGUgdmFsdWUgb2YgdGhlIGRhdGEgd2hlbiBvcmRlcmVkIGNocm9ub2xvZ2ljYWxseTsgY2VudHJhbCB0ZW5kZW5jeSBtZWFzdXJlIGxlc3MgYWZmZWN0ZWQgYnkgZXh0cmVtZSB2YWx1ZXMuIiwNCiAgIlN0YW5kYXJkIERldmlhdGlvbiAoVm9sYXRpbGl0eSkiLCBwYXN0ZTAoc2RfdmFsdWUsICIlIiksICJUaGUgZGlzcGVyc2lvbiBvZiB2YWx1ZXMgZnJvbSB0aGUgbWVhbiwgaW5kaWNhdGluZyB0aGUgdm9sYXRpbGl0eSBvZiBwcmljZSBjaGFuZ2VzIGFuZCBlY29ub21pYyBzdGFiaWxpdHkuIiwNCiAgIk1pbiBDQUdSIFJhbmdlIChDQUdSIC0gU0QpIiwgcGFzdGUwKG1pbl9jYWdyX3JhbmdlLCAiJSIpLCAiTG93ZXIgYm91bmRhcnkgb2YgZXhwZWN0ZWQgQ09TVCByYW5nZTsgbG93ZXN0IGVzdGltYXRlIG9mIHR5cGljYWwgZ3Jvd3RoIHJhdGUgY29uc2lkZXJpbmcgbm9ybWFsIGZsdWN0dWF0aW9ucy4iLA0KICAiTWF4IENBR1IgUmFuZ2UgKENBR1IgKyBTRCkiLCBwYXN0ZTAobWF4X2NhZ3JfcmFuZ2UsICIlIiksICJVcHBlciBib3VuZGFyeSBvZiBleHBlY3RlZCBDT1NUIHJhbmdlOyBoaWdoZXN0IGVzdGltYXRlIG9mIHR5cGljYWwgZ3Jvd3RoIHJhdGUgY29uc2lkZXJpbmcgbm9ybWFsIGZsdWN0dWF0aW9ucy4iLA0KICAiTWluaW11bSIsIHBhc3RlMChtaW5fdmFsdWUsICIlIiksICJMb3dlc3QgZ3Jvd3RoIHJhdGUuIiwNCiAgIk1heGltdW0iLCBwYXN0ZTAobWF4X3ZhbHVlLCAiJSIpLCAiSGlnaGVzdCBncm93dGggcmF0ZS4iLA0KICAiUGVyY2VudCBBYm92ZSBJbmZsYXRpb24gVGFyZ2V0IiwgcGFzdGUwKHBlcmNlbnRfYWJvdmVfdGFyZ2V0X2luZmxhdGlvbiwgIiUiKSwgIlBlcmNlbnRhZ2Ugb2YgdmFsdWVzIGFib3ZlIHRoZSBpbmZsYXRpb24gdGFyZ2V0IHNwZWNpZmllZCBpbiBQcmVmZXJyZWQgVGFyZ2V0cyBzZWN0aW9uLiIsDQogICJQZXJjZW50IEFib3ZlIENvbnNlcnZhdGl2ZSBUYXJnZXQiLCBwYXN0ZTAocGVyY2VudF9hYm92ZV90YXJnZXRfY29uc2VydmF0aXZlLCAiJSIpLCAiUGVyY2VudGFnZSBvZiB2YWx1ZXMgYWJvdmUgdGhlIGNvbnNlcnZhdGl2ZSB0YXJnZXQgc3BlY2lmaWVkIGluIFByZWZlcnJlZCBUYXJnZXRzIHNlY3Rpb24uIiwNCiAgIlBlcmNlbnQgQWJvdmUgTW9kZXJhdGUgVGFyZ2V0IiwgcGFzdGUwKHBlcmNlbnRfYWJvdmVfdGFyZ2V0X21vZGVyYXRlLCAiJSIpLCAiUGVyY2VudGFnZSBvZiB2YWx1ZXMgYWJvdmUgdGhlIG1vZGVyYXRlIHRhcmdldCBzcGVjaWZpZWQgaW4gUHJlZmVycmVkIFRhcmdldHMgc2VjdGlvbi4iLA0KICAiUGVyY2VudCBBYm92ZSBBZ2dyZXNzaXZlIFRhcmdldCIsIHBhc3RlMChwZXJjZW50X2Fib3ZlX3RhcmdldF9hZ2dyZXNzaXZlLCAiJSIpLCAiUGVyY2VudGFnZSBvZiB2YWx1ZXMgYWJvdmUgdGhlIGFnZ3Jlc3NpdmUgdGFyZ2V0IHNwZWNpZmllZCBpbiBQcmVmZXJyZWQgVGFyZ2V0cyBzZWN0aW9uLiINCikNCg0KIyBDb252ZXJ0IHRvIGNoYXJhY3RlciB0byBhdm9pZCBhdXRvbWF0aWMgZGVjaW1hbCBwb2ludHMgb24gd2hvbGUgbnVtYmVycw0KY29zdF9yYXdfc3VtbWFyeSA8LSBjb3N0X3Jhd19zdW1tYXJ5ICU+JQ0KICBtdXRhdGUoYWNyb3NzKGV2ZXJ5dGhpbmcoKSwgYXMuY2hhcmFjdGVyKSkNCg0KIyBEaXNwbGF5IGZvcm1hdHRlZCB0YWJsZQ0KY2F0KCJcblxuIyMjIyBBbm51YWwgR3Jvd3RoIFJhdGUgU3VtbWFyeSAoIiwgbWluX3llYXIsICItIiwgbWF4X3llYXIsICIpXG4iLCBzZXAgPSAiIikNCmZvcm1hdF8zY29sX2N1c3RvbV93aWR0aHMoY29zdF9yYXdfc3VtbWFyeSwgY29sMV93aWR0aCA9ICIyMGVtIiwgY29sMl93aWR0aCA9ICIxMGVtIiwgY29sM193aWR0aCA9ICI0MGVtIikgDQoNCiMgVmlldyhjb3N0X3Jhd19zdW1tYXJ5KQ0KaW50ZXJhY3RpdmVfc3RyKGNvc3RfcmF3X3N1bW1hcnkpDQoNCmBgYA0KDQpDT1NUJ3MgSW5kZXggZXhoaWJpdHMgYSBgciBpZihjYWdyX3ZhbHVlID4gdGFyZ2V0X2FnZ3Jlc3NpdmUpICJhZ2dyZXNzaXZlIiBlbHNlIGlmKGNhZ3JfdmFsdWUgPiB0YXJnZXRfbW9kZXJhdGUpICJtb2RlcmF0ZSIgZWxzZSBpZihjYWdyX3ZhbHVlID4gdGFyZ2V0X2NvbnNlcnZhdGl2ZSkgImNvbnNlcnZhdGl2ZSIgZWxzZSBpZihjYWdyX3ZhbHVlID4gdGFyZ2V0X2luZmxhdGlvbikgImJhc2VsaW5lIiBlbHNlICJkaXNhcHBvaW50aW5nImAgQ0FHUiBhdCBgciBjYWdyX3ZhbHVlYCUsIGByIGlmKGNhZ3JfdmFsdWUgPCBtZWFuX3ZhbHVlKSAibG93ZXIgdGhhbiIgZWxzZSAiaGlnaGVyIHRoYW4iYCB0aGUgbWVhbiBncm93dGggcmF0ZSBvZiBgciBtZWFuX3ZhbHVlYCUsIHJlZmxlY3RpbmcgdGhlIGltcGFjdCBvZiBzaG9ydC10ZXJtIHZvbGF0aWxpdHkgYW5kIGByIGlmKGNhZ3JfdmFsdWUgPiBtZWFuX3ZhbHVlKSAiZGVjbGluZXMiIGVsc2UgImdyb3d0aCBzcGlrZXMiYC4gVGhlIG1lZGlhbiByZXR1cm4gb2YgYHIgbWVkaWFuX3ZhbHVlYCUgaW5kaWNhdGVzIHRoYXQgbW9yZSB0aGFuIGhhbGYgb2YgdGhlIG9ic2VydmVkIHllYXJzIGV4cGVyaWVuY2VkIHJldHVybnMgYHIgaWYoY2Fncl92YWx1ZSA8IG1lZGlhbl92YWx1ZSkgImFib3ZlIiBlbHNlICJiZWxvdyJgIHRoZSBtZWFuLiBUaGUgcmVsYXRpb25zaGlwIGJldHdlZW4gdGhlIENBR1IgYW5kIHRoZSBtZWRpYW4gZ3Jvd3RoIHJhdGUgc3VnZ2VzdHMgdGhhdCBzdXN0YWluZWQgcGVyaW9kcyBvZiBhYm92ZS1tZWRpYW4gZ3Jvd3RoIGhhdmUgZXhlcnRlZCBjdW11bGF0aXZlIGByIGlmKGNhZ3JfdmFsdWUgPCBtZWRpYW5fdmFsdWUpICJ1cHdhcmQgcHJlc3N1cmUiIGVsc2UgImRvd253YXJkIHByZXNzdXJlImAgb24gb3ZlcmFsbCBwcmljZSBsZXZlbHMuIFRoaXMgcmVsYXRpb25zaGlwIGhpZ2hsaWdodHMgYSBkaXN0cmlidXRpb24gd2l0aCBub3RhYmxlIGV4dHJlbWVzIG9uIHRoZSBgciBpZihjYWdyX3ZhbHVlIDwgbWVhbl92YWx1ZSkgImhpZ2hlciIgZWxzZSAibG93ZXIiYCBlbmQsIHJlZmxlY3RpbmcgYHIgaWYoY2Fncl92YWx1ZSA8IG1lYW5fdmFsdWUpICJwb3NpdGl2ZSIgZWxzZSAibmVnYXRpdmUiYCBza2V3bmVzcy4gVGhpcyBgciBpZihjYWdyX3ZhbHVlIDwgbWVkaWFuX3ZhbHVlKSAicG9zaXRpdmUiIGVsc2UgIm5lZ2F0aXZlImAgc2tld25lc3MgaW1wbGllcyB0aGF0IHdoaWxlIG1vcmUgdGhhbiBoYWxmIG9mIHRoZSBvYnNlcnZlZCB5ZWFycyBleHBlcmllbmNlZCByZXR1cm5zIGByIGlmKGNhZ3JfdmFsdWUgPCBtZWRpYW5fdmFsdWUpICJhYm92ZSB0aGUgbWVhbiwgZG93bnR1cm5zIGNhbiBiZSBzZXZlcmUiIGVsc2UgImJlbG93IHRoZSBtZWFuLCB1cHR1cm5zIGNhbiBiZSBzaWduaWZpY2FudCJgLiBIb3dldmVyLCB0aGUgbWFya2V0IGhhcyBoaXN0b3JpY2FsbHkgcHJvdmlkZWQgc3Vic3RhbnRpYWwgYHIgaWYoY2Fncl92YWx1ZSA8IG1lZGlhbl92YWx1ZSkgInVwc2lkZSBwb3RlbnRpYWwiIGVsc2UgImRvd25zaWRlIHJpc2siYC4gQWRkaXRpb25hbGx5LCB0aGUgZmFjdCB0aGF0IGByIHBlcmNlbnRfYWJvdmVfdGFyZ2V0X2luZmxhdGlvbmAlIG9mIHRoZSB5ZWFycyBleGNlZWRlZCB0aGUgaW5mbGF0aW9uIHRhcmdldCBgciBpZiAocGVyY2VudF9hYm92ZV90YXJnZXRfaW5mbGF0aW9uID4gNzApICJyZWluZm9yY2VzIENPU1QncyBlZmZlY3RpdmVuZXNzIGFzIGEgc3Ryb25nIGxvbmctdGVybSBoZWRnZSIgZWxzZSBpZiAocGVyY2VudF9hYm92ZV90YXJnZXRfaW5mbGF0aW9uID4gNjApICJyZWluZm9yY2VzIENPU1QncyBlZmZlY3RpdmVuZXNzIGFzIGEgbG9uZy10ZXJtIGhlZGdlIiBlbHNlIGlmIChwZXJjZW50X2Fib3ZlX3RhcmdldF9pbmZsYXRpb24gPiA1MCkgInF1ZXN0aW9ucyBDT1NUJ3MgZWZmZWN0aXZlbmVzcyAgYXMgYSBsb25nLXRlcm0gaGVkZ2UiIGVsc2UgInVuZGVybWluZXMgQ09TVCdzIGVmZmVjdGl2ZW5lc3MgYXMgYSBsb25nLXRlcm0gaGVkZ2UiYCBhZ2FpbnN0IGluZmxhdGlvbi4NCg0KVGhlIHN0YW5kYXJkIGRldmlhdGlvbiBvZiBgciBzZF92YWx1ZWAlIGByIGlmKHNkX3ZhbHVlID4gMjApICJpbmRpY2F0ZXMgZXh0cmVtZSB2b2xhdGlsaXR5LCByZWZsZWN0aW5nIHN1YnN0YW50aWFsIGZsdWN0dWF0aW9ucyBpbiBlcXVpdHkgbWFya2V0cyIgZWxzZSBpZihzZF92YWx1ZSA+IDE1KSAidW5kZXJzY29yZXMgc2lnbmlmaWNhbnQgdm9sYXRpbGl0eSwgYSBjb21tb24gZmVhdHVyZSBvZiBlcXVpdHkgbWFya2V0cyIgZWxzZSAic3VnZ2VzdHMgbW9kZXJhdGUgdm9sYXRpbGl0eSwgdHlwaWNhbCBvZiByZWxhdGl2ZWx5IHN0YWJsZSBtYXJrZXRzImAuIFRoZSBgciByYW5nZV9yYXRpbyA8LSAobWF4X3ZhbHVlIC0gbWluX3ZhbHVlKSAvIHNkX3ZhbHVlOyBpZihyYW5nZV9yYXRpbyA+IDUpICJoaWdobHkgdm9sYXRpbGUiIGVsc2UgaWYocmFuZ2VfcmF0aW8gPiAzKSAibm90YWJsZSIgZWxzZSAiY29tcGFyYXRpdmVseSBzdGFibGUiYCByYW5nZSBvZiBhbm51YWwgcmV0dXJucywgc3Bhbm5pbmcgZnJvbSBgciBtaW5fdmFsdWVgJSB0byBgciBtYXhfdmFsdWVgJSwgYHIgaWYocmFuZ2VfcmF0aW8gPiA1KSAiaWxsdXN0cmF0ZXMgYSBoaWdobHkgdm9sYXRpbGUgbWFya2V0IGVudmlyb25tZW50LCBwYXJ0bHkgZHVlIHRvIGl0cyBjb21wb3NpdGlvbiwgd2l0aCB0aGUgcG90ZW50aWFsIGZvciBib3RoIGV4dHJlbWUgZ2FpbnMgYW5kIGxvc3NlcyIgZWxzZSBpZihyYW5nZV9yYXRpbyA+IDMpICJoaWdobGlnaHRzIG5vdGFibGUgbWFya2V0IHZhcmlhYmlsaXR5LCBwYXJ0bHkgZHVlIHRvIGl0cyBjb21wb3NpdGlvbiwgIHJlZmxlY3RpbmcgYm90aCBvcHBvcnR1bml0aWVzIGFuZCByaXNrcyIgZWxzZSAiaW5kaWNhdGVzIGEgY29tcGFyYXRpdmVseSBzdGFibGUgbWFya2V0LCBwYXJ0bHkgZHVlIHRvIGl0cyBjb21wb3NpdGlvbiwgd2l0aCBsZXNzIGV4dHJlbWUgYW5udWFsIGZsdWN0dWF0aW9ucyJgLiANCg0KRm9yIENPU1QgdG8gYmUgY29uc2lkZXJlZCBhIGhpZ2gtcGVyZm9ybWluZyBhbmQgcmVzaWxpZW50IGxvbmctdGVybSBpbnZlc3RtZW50LCBpdCB3b3VsZCBiZSBpZGVhbCB0byBleGNlZWQgdGhlIGFnZ3Jlc3NpdmUgdGFyZ2V0ICAoZS5nLiwgYHIgKHRhcmdldF9hZ2dyZXNzaXZlIC0gdGFyZ2V0X2luZmxhdGlvbilgJSBhbm51YWxpemVkIHJldHVybnMsIGFjY291bnRpbmcgZm9yIGhpZ2hlciBpbmZsYXRpb24tYWRqdXN0ZWQgcGVyZm9ybWFuY2UgZXhwZWN0YXRpb25zKSBpbiBhdCBsZWFzdCA0MCUtNTAlIG9mIHRoZSB5ZWFycy4gVGhpcyByYW5nZSByZWZsZWN0cyB0aGUgcG90ZW50aWFsIGZvciBzdHJvbmcgdXBzaWRlIGluIG1hbnkgeWVhcnMgd2hpbGUgYmFsYW5jaW5nIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgbWFya2V0cyBkbyBleHBlcmllbmNlIGRvd250dXJucy4gVGhlIGZhY3QgdGhhdCBgciBwZXJjZW50X2Fib3ZlX3RhcmdldF9hZ2dyZXNzaXZlYCUgb2YgdGhlIHllYXJzIGV4Y2VlZGVkIHRoZSBhZ2dyZXNzaXZlIHRhcmdldCBgciBpZihwZXJjZW50X2Fib3ZlX3RhcmdldF9hZ2dyZXNzaXZlID4gNTApICJpbmRpY2F0ZXMgY29uc2lzdGVudCBhbmQgcm9idXN0IGdyb3d0aCwgbWFraW5nIENPU1QgYSBzdHJvbmcgb3B0aW9uIGZvciB0aG9zZSBzZWVraW5nIGFnZ3Jlc3NpdmUgaW52ZXN0bWVudHMuIiBlbHNlIGlmKHBlcmNlbnRfYWJvdmVfdGFyZ2V0X2FnZ3Jlc3NpdmUgPiA0MCkgInN1Z2dlc3RzIHRoYXQgd2hpbGUgbm90IGNvbnNpc3RlbnQsIENPU1QgaGFzIGhpc3RvcmljYWxseSBwcm92aWRlZCByb2J1c3QgZ3Jvd3RoIG92ZXIgdGhlIGxvbmcgdGVybSwgbWFraW5nIGl0IGEgdmlhYmxlIGludmVzdG1lbnQgZm9yIHRob3NlIHdpdGggYSBoaWdoZXIgcmlzayB0b2xlcmFuY2UuIiBlbHNlICJyYWlzZXMgY29uY2VybnMgYWJvdXQgQ09TVCdzIGFiaWxpdHkgdG8gbWVldCBhZ2dyZXNzaXZlIGdyb3d0aCB0YXJnZXRzLCBtYWtpbmcgaXQgbGVzcyBzdWl0YWJsZSBmb3IgaW52ZXN0b3JzIHdpdGggaGlnaGVyIHJpc2sgdG9sZXJhbmNlLiJgDQoNCiMjIyBHcmFwaA0KDQpgYGB7ciBjb3N0X3Jhd19ncmFwaCwgZmlnLndpZHRoPTEwLCBmaWcuaGVpZ2h0PTcsIGV2YWw9VFJVRSwgZWNobz1GQUxTRX0NCg0KIyBMb2FkIG5lY2Vzc2FyeSBsaWJyYXJpZXMNCmxpYnJhcnkoZ2dwbG90MikNCmxpYnJhcnkoZHBseXIpDQoNCiMgQ29udmVydCBgMS1ZZWFyIENBR1JgIHRvIG51bWVyaWMgZm9yIHBsb3R0aW5nDQpjb3N0X3JhdyA8LSBjb3N0X3JhdyAlPiUNCiAgbXV0YXRlKA0KICAgIGBEYXRlYCA9IGFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKGBEYXRlYCkpLCAgIyBFbnN1cmUgRGF0ZSBpcyBudW1lcmljDQogICAgYDEtWWVhciBDQUdSYCA9IGFzLm51bWVyaWMoZ3N1YigiJSIsICIiLCBgMS1ZZWFyIENBR1JgKSkNCiAgKQ0KDQojIEZpbmQgdGhlIG1pbmltdW0gYW5kIG1heGltdW0geC12YWx1ZSBpbiB5b3VyIGRhdGENCm1heF94IDwtIG1heChhcy5pbnRlZ2VyKGNvc3RfcmF3JERhdGUpLCBuYS5ybSA9IFRSVUUpDQptaW5feCA8LSBtaW4oYXMuaW50ZWdlcihjb3N0X3JhdyREYXRlKSwgbmEucm0gPSBUUlVFKQ0KaW50ZXJhY3RpdmVfcHJpbnQobWF4X3gpICAjIFRlc3QNCmludGVyYWN0aXZlX3ByaW50KG1pbl94KSAgIyBUZXN0DQoNCiMgRmluZCB0aGUgbWluaW11bSBhbmQgbWF4aW11bSB5ZWFyDQptaW5feWVhciA8LSBtaW4oY29zdF9yYXckRGF0ZSwgbmEucm0gPSBUUlVFKQ0KbWF4X3llYXIgPC0gbWF4KGNvc3RfcmF3JERhdGUsIG5hLnJtID0gVFJVRSkNCmludGVyYWN0aXZlX3ByaW50KG1pbl95ZWFyKQ0KaW50ZXJhY3RpdmVfcHJpbnQobWF4X3llYXIpDQoNCg0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiMjIFBMT1QgRlVMTCBXSVRIT1VUIExJTUlUUw0KDQojIERlZmluZSBzdGFydCBhbmQgZW5kIHllYXJzDQpzdGFydF95ZWFyIDwtIGFzLm51bWVyaWMobWluX3llYXIpDQplbmRfeWVhciA8LSAyMDI0DQp5ZWFyX3JhbmdlIDwtIGVuZF95ZWFyIC0gc3RhcnRfeWVhciArIDEgICMgQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgeWVhcnMNCg0KIyBEZWZpbmUgYnJlYWtzIHJvdW5kZWQgYXBwcm9wcmlhdGVseQ0KbGltaXRzX3N0YXJ0X3llYXIgPC0gZmxvb3Ioc3RhcnRfeWVhciAvIDUpICogNSAgIyBSb3VuZCBkb3duIHRvIHRoZSBuZWFyZXN0IG11bHRpcGxlIG9mIDUNCmxpbWl0c19lbmRfeWVhciA8LSBjZWlsaW5nKGVuZF95ZWFyIC8gNSkgKiA1ICAgIyBSb3VuZCB1cCB0byB0aGUgbmVhcmVzdCBtdWx0aXBsZSBvZiA1DQoNCiMgQ3JlYXRlIGR5bmFtaWMgdGl0bGUgYW5kIGNhcHRpb24NCmR5bmFtaWNfdGl0bGUgPC0gcGFzdGUwKCJBbm51YWwgR3Jvd3RoIFJhdGVzIE92ZXIgIix5ZWFyX3JhbmdlLCAiIFllYXJzICgiLCBzdGFydF95ZWFyLCAiLSIsIGVuZF95ZWFyLCAiKSIpDQpkeW5hbWljX2NhcHRpb24gPC0gcGFzdGUwKCJDT1NUIEFubnVhbCBHcm93dGggUmF0ZXMsIERhdGEgUGVyaW9kICgiLCBtaW5feWVhciwgIuKAkyIsIG1heF95ZWFyLCAiKSIpDQoNCiMgQ3JlYXRlIHRoZSBmdWxsLCBub24tZmlsdGVyZWQgeC1heGlzIHBsb3Qgd2l0aCBkeW5hbWljIHggcGxhY2VtZW50IGZvciBhbm5vdGF0aW9ucw0KcDEgPC0gZ2dwbG90KGNvc3RfcmF3LCBhZXMoeCA9IGFzLmludGVnZXIoRGF0ZSksIHkgPSBgMS1ZZWFyIENBR1JgKSkgKw0KICANCiAgIyBBZGQgc2hhZGVkIGFyZWFzIGZvciBiYWNrZ3JvdW5kIGVmZmVjdA0KICBnZW9tX3JlY3QoYWVzKHhtaW4gPSAtSW5mLCB4bWF4ID0gSW5mLCB5bWluID0gdGFyZ2V0X2FnZ3Jlc3NpdmUsIHltYXggPSBJbmYpLCBmaWxsID0gImxpZ2h0Z3JlZW4iLCBhbHBoYSA9IDAuMDI1KSArDQogIGdlb21fcmVjdChhZXMoeG1pbiA9IC1JbmYsIHhtYXggPSBJbmYsIHltaW4gPSB0YXJnZXRfY29uc2VydmF0aXZlLCB5bWF4ID0gdGFyZ2V0X2FnZ3Jlc3NpdmUpLCBmaWxsID0gIm9yYW5nZSIsIGFscGhhID0gMC4wMjUpICsNCiAgZ2VvbV9yZWN0KGFlcyh4bWluID0gLUluZiwgeG1heCA9IEluZiwgeW1pbiA9IC1JbmYsIHltYXggPSB0YXJnZXRfY29uc2VydmF0aXZlKSwgZmlsbCA9ICJsaWdodGNvcmFsIiwgYWxwaGEgPSAwLjAyNSkgKw0KICANCiAgIyBQbG90IGxpbmVzLCBwb2ludHMsIGFuZCBhbm5vdGF0aW9ucyBvbiB0b3Agb2Ygc2hhZGVkIGFyZWFzDQogIGdlb21fbGluZShjb2xvciA9ICIjNEIwMDgyIiwgc2l6ZSA9IDEuMCkgKyAgICAgICAjIERhcmsgcHVycGxlIGxpbmUgDQogIGdlb21fcG9pbnQoY29sb3IgPSAiIzRCMDA4MiIsIHNpemUgPSAxLjUpICsgICAgICAgICMgRGFyayBwdXJwbGUgcG9pbnRzIA0KICANCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gdGFyZ2V0X2FnZ3Jlc3NpdmUsIGNvbG9yID0gImRhcmtibHVlIiwgbGluZXR5cGUgPSAic29saWQiKSArDQogICMgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gdGFyZ2V0X21vZGVyYXRlLCBjb2xvciA9ICJkYXJrYmx1ZSIsIGxpbmV0eXBlID0gInNvbGlkIikgKw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSB0YXJnZXRfY29uc2VydmF0aXZlLCBjb2xvciA9ICJkYXJrYmx1ZSIsIGxpbmV0eXBlID0gInNvbGlkIikgKw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSB0YXJnZXRfaW5mbGF0aW9uLCBjb2xvciA9ICJkYXJrcmVkIiwgbGluZXR5cGUgPSAiZGFzaGVkIikgKw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSBjYWdyX3ZhbHVlLCBjb2xvciA9ICJkYXJrcmVkIiwgbGluZXR5cGUgPSAiZGFzaGVkIikgKw0KICANCiAgIyBEeW5hbWljIHJpZ2h0LWFsaWduZWQgcGxhY2VtZW50IGZvciBhbm5vdGF0aW9ucw0KICBhbm5vdGF0ZSgidGV4dCIsIHggPSBJbmYsIHkgPSB0YXJnZXRfYWdncmVzc2l2ZSwgbGFiZWwgPSAiQWdncmVzc2l2ZSIsIA0KICAgICAgICAgICBoanVzdCA9IDEsIHZqdXN0ID0gLTAuNTAsIGNvbG9yID0gImRhcmtibHVlIiwgc2l6ZSA9IDQpICsNCiAgIyBhbm5vdGF0ZSgidGV4dCIsIHggPSBJbmYsIHkgPSB0YXJnZXRfbW9kZXJhdGUsIGxhYmVsID0gIk1vZGVyYXRlIiwgDQogICMgICAgICAgICBoanVzdCA9IDEsIHZqdXN0ID0gLTAuNTAsIGNvbG9yID0gImRhcmtibHVlIiwgc2l6ZSA9IDQpICsNCiAgYW5ub3RhdGUoInRleHQiLCB4ID0gSW5mLCB5ID0gdGFyZ2V0X2NvbnNlcnZhdGl2ZSwgbGFiZWwgPSAiQ29uc2VydmF0aXZlIiwNCiAgICAgICAgICAgaGp1c3QgPSAxLCB2anVzdCA9ICsxLjEwLCBjb2xvciA9ICJkYXJrYmx1ZSIsIHNpemUgPSA0KSArDQogIGFubm90YXRlKCJ0ZXh0IiwgeCA9IEluZiwgeSA9IHRhcmdldF9pbmZsYXRpb24sIGxhYmVsID0gIkluZmxhdGlvbiIsIA0KICAgICAgICAgICBoanVzdCA9IDEsIHZqdXN0ID0gKzEuMTAsIGNvbG9yID0gImRhcmtyZWQiLCBzaXplID0gNCkgKw0KICBhbm5vdGF0ZSgidGV4dCIsIHggPSBJbmYsIHkgPSBjYWdyX3ZhbHVlLCBsYWJlbCA9ICJDQUdSIiwgDQogICAgICAgICAgIGhqdXN0ID0gMSwgdmp1c3QgPSArMS4xMCwgY29sb3IgPSAiZGFya3JlZCIsIHNpemUgPSA0KSArIA0KDQogIGxhYnMoDQogICAgdGl0bGUgPSBkeW5hbWljX3RpdGxlLA0KICAgIHggPSAiWWVhciIsDQogICAgeSA9ICJHcm93dGggUmF0ZSAoJSkiLA0KICAgIGNhcHRpb24gPSBkeW5hbWljX2NhcHRpb24NCiAgKSArDQoNCiAgc2NhbGVfeF9jb250aW51b3VzKA0KICAgIGxpbWl0cyA9IGMoc3RhcnRfeWVhciwgZW5kX3llYXIgKyAzKSwgIyBSZXN0cmljdHMgeC1heGlzIGRhdGEgDQogICAgYnJlYWtzID0gc2VxKGxpbWl0c19zdGFydF95ZWFyLCBsaW1pdHNfZW5kX3llYXIsIDUpICMgU2V0cyBNYWpvciB4LWF4aXMgIA0KICApICsgICMgUmVzdHJpY3QgJiBTZXQgTWFqb3IgeC1heGlzIGxpbmVzIA0KICAgIA0KICB0aGVtZV9taW5pbWFsKCkgKw0KICB0aGVtZSgNCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41LCBzaXplID0gMjApLCAgICAgICAgICMgTGFyZ2VyIHRpdGxlIGZvbnQNCiAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0KSwgICAgICAgICAgICAgICAgICAgICMgTGFyZ2VyIHgtYXhpcyBsYWJlbCBmb250DQogICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCksICAgICAgICAgICAgICAgICAgICAjIExhcmdlciB5LWF4aXMgbGFiZWwgZm9udA0KICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSwgc2l6ZSA9IDE0KSwgICMgTGFyZ2VyIHgtYXhpcyB0ZXh0DQogICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0KSwgICAgICAgICAgICAgICAgICAgICAjIExhcmdlciB5LWF4aXMgdGV4dA0KICAgIHBhbmVsLmdyaWQubWFqb3IgPSBlbGVtZW50X2xpbmUobGluZXR5cGUgPSAiZG90dGVkIiwgY29sb3IgPSAiYmxhY2siKSwgICAgICAgICAjIE1ham9yIGdyaWQgbGluZXMNCiAgICBwYW5lbC5ncmlkLm1pbm9yLnggPSBlbGVtZW50X2JsYW5rKCksICMgZWxlbWVudF9saW5lKGNvbG9yID0gImdyZXk4MCIpICAjIE1pbm9yIHggZ3JpZCBsaW5lcyBmb3IgZWFjaCB5ZWFyDQogICAgIyBwYW5lbC5ib3JkZXIgPSBlbGVtZW50X3JlY3QoY29sb3IgPSAiZGFya2dyZXkiLCBmaWxsID0gTkEsIHNpemUgPSAxLjApICAjIERhcmsgYm9yZGVyIGFyb3VuZCB0aGUgcGxvdA0KICAgIGF4aXMudGlja3MubGVuZ3RoID0gdW5pdCgtMC4yNSwgImNtIiksICAgICAgICAgICAgICAgICAgICAgICMgSW5jcmVhc2UgdGljayBsZW5ndGgNCiAgICBheGlzLnRpY2tzID0gZWxlbWVudF9saW5lKGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDAuNTApLCAjIERhcmtlciB0aWNrcw0KICAgIGF4aXMubGluZS54ID0gZWxlbWVudF9saW5lKGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDAuNzUpLCAgIyBEYXJrIGJvdHRvbSBib3JkZXINCiAgICBheGlzLmxpbmUueSA9IGVsZW1lbnRfbGluZShjb2xvciA9ICJibGFjayIsIHNpemUgPSAwLjc1KSAgICMgRGFyayBsZWZ0IGJvcmRlcg0KICApDQoNCnByaW50KHAxKQ0KDQoNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQojIyBQTE9UIFJFU1RSSUNURUQgV0lUSCBMSU1JVFMNCg0KIyBGaWx0ZXIgdGhlIGRhdGEgZm9yIHRoZSByZXN0cmljdGVkIHgtYXhpcyByYW5nZSAoMjAwNi0yMDI0KQ0KcmVzdHJpY3RlZF9kYXRhIDwtIGNvc3RfcmF3ICU+JQ0KICBmaWx0ZXIoYXMuaW50ZWdlcihEYXRlKSA+PSAyMDA2ICYgYXMuaW50ZWdlcihEYXRlKSA8PSAyMDI0KQ0KDQojIERlZmluZSBzdGFydCBhbmQgZW5kIHllYXJzDQpzdGFydF95ZWFyIDwtIDIwMDYNCmVuZF95ZWFyIDwtIDIwMjQNCnllYXJfcmFuZ2UgPC0gZW5kX3llYXIgLSBzdGFydF95ZWFyICsgMSAgIyBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiB5ZWFycw0KDQojIERlZmluZSBicmVha3Mgcm91bmRlZCBhcHByb3ByaWF0ZWx5DQpsaW1pdHNfc3RhcnRfeWVhciA8LSBmbG9vcihzdGFydF95ZWFyIC8gNSkgKiA1ICAjIFJvdW5kIGRvd24gdG8gdGhlIG5lYXJlc3QgbXVsdGlwbGUgb2YgNQ0KbGltaXRzX2VuZF95ZWFyIDwtIGNlaWxpbmcoZW5kX3llYXIgLyA1KSAqIDUgICAjIFJvdW5kIHVwIHRvIHRoZSBuZWFyZXN0IG11bHRpcGxlIG9mIDUNCg0KIyBDcmVhdGUgZHluYW1pYyB0aXRsZSBhbmQgY2FwdGlvbg0KZHluYW1pY190aXRsZSA8LSBwYXN0ZTAoIkFubnVhbCBHcm93dGggUmF0ZXMgT3ZlciAiLHllYXJfcmFuZ2UsICIgWWVhcnMgKCIsIHN0YXJ0X3llYXIsICItIiwgZW5kX3llYXIsICIpIikNCmR5bmFtaWNfY2FwdGlvbiA8LSBwYXN0ZTAoIkNPU1QgQW5udWFsIEdyb3d0aCBSYXRlcywgRGF0YSBQZXJpb2QgKCIsIG1pbl95ZWFyLCAi4oCTIiwgbWF4X3llYXIsICIpIikNCg0KIyBDYWxjdWxhdGUgZHluYW1pYyB5LWF4aXMgbGltaXRzIGZvciB0aGUgcmVzdHJpY3RlZCBkYXRhDQp5X21pbiA8LSBtaW4ocmVzdHJpY3RlZF9kYXRhJGAxLVllYXIgQ0FHUmAsIG5hLnJtID0gVFJVRSkNCnlfbWF4IDwtIG1heChyZXN0cmljdGVkX2RhdGEkYDEtWWVhciBDQUdSYCwgbmEucm0gPSBUUlVFKQ0KDQojIENyZWF0ZSB0aGUgZnVsbCwgbm9uLWZpbHRlcmVkIHgtYXhpcyBwbG90IHdpdGggZHluYW1pYyB4IHBsYWNlbWVudCBmb3IgYW5ub3RhdGlvbnMNCnAzIDwtIGdncGxvdChyZXN0cmljdGVkX2RhdGEsIGFlcyh4ID0gYXMuaW50ZWdlcihEYXRlKSwgeSA9IGAxLVllYXIgQ0FHUmApKSArDQogIA0KICAjIEFkZCBzaGFkZWQgYXJlYXMgZm9yIGJhY2tncm91bmQgZWZmZWN0DQogIGdlb21fcmVjdChhZXMoeG1pbiA9IC1JbmYsIHhtYXggPSBJbmYsIHltaW4gPSB0YXJnZXRfYWdncmVzc2l2ZSwgeW1heCA9IEluZiksIGZpbGwgPSAibGlnaHRncmVlbiIsIGFscGhhID0gMC4wMzApICsNCiAgZ2VvbV9yZWN0KGFlcyh4bWluID0gLUluZiwgeG1heCA9IEluZiwgeW1pbiA9IHRhcmdldF9jb25zZXJ2YXRpdmUsIHltYXggPSB0YXJnZXRfYWdncmVzc2l2ZSksIGZpbGwgPSAib3JhbmdlIiwgYWxwaGEgPSAwLjAzMCkgKw0KICBnZW9tX3JlY3QoYWVzKHhtaW4gPSAtSW5mLCB4bWF4ID0gSW5mLCB5bWluID0gLUluZiwgeW1heCA9IHRhcmdldF9jb25zZXJ2YXRpdmUpLCBmaWxsID0gImxpZ2h0Y29yYWwiLCBhbHBoYSA9IDAuMDMwKSArDQogIA0KICAjIFBsb3QgbGluZXMsIHBvaW50cywgYW5kIGFubm90YXRpb25zIG9uIHRvcCBvZiBzaGFkZWQgYXJlYXMNCiAgZ2VvbV9saW5lKGNvbG9yID0gIiM0QjAwODIiLCBzaXplID0gMS4wKSArICAgICAgICMgRGFyayBwdXJwbGUgbGluZSANCiAgZ2VvbV9wb2ludChjb2xvciA9ICIjNEIwMDgyIiwgc2l6ZSA9IDEuNSkgKyAgICAgICAgIyBEYXJrIHB1cnBsZSBwb2ludHMgDQogIA0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSB0YXJnZXRfYWdncmVzc2l2ZSwgY29sb3IgPSAiZGFya2JsdWUiLCBsaW5ldHlwZSA9ICJzb2xpZCIpICsNCiAgIyBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSB0YXJnZXRfbW9kZXJhdGUsIGNvbG9yID0gImRhcmtibHVlIiwgbGluZXR5cGUgPSAic29saWQiKSArDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IHRhcmdldF9jb25zZXJ2YXRpdmUsIGNvbG9yID0gImRhcmtibHVlIiwgbGluZXR5cGUgPSAic29saWQiKSArDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IHRhcmdldF9pbmZsYXRpb24sIGNvbG9yID0gImRhcmtyZWQiLCBsaW5ldHlwZSA9ICJkYXNoZWQiKSArDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IGNhZ3JfdmFsdWUsIGNvbG9yID0gImRhcmtyZWQiLCBsaW5ldHlwZSA9ICJkYXNoZWQiKSArDQogIA0KICAjIER5bmFtaWMgcmlnaHQtYWxpZ25lZCBwbGFjZW1lbnQgZm9yIGFubm90YXRpb25zDQogIGFubm90YXRlKCJ0ZXh0IiwgeCA9IEluZiwgeSA9IHRhcmdldF9hZ2dyZXNzaXZlLCBsYWJlbCA9ICJBZ2dyZXNzaXZlIiwgDQogICAgICAgICAgIGhqdXN0ID0gMSwgdmp1c3QgPSAtMC41MCwgY29sb3IgPSAiZGFya2JsdWUiLCBzaXplID0gNCkgKw0KICAjIGFubm90YXRlKCJ0ZXh0IiwgeCA9IEluZiwgeSA9IHRhcmdldF9tb2RlcmF0ZSwgbGFiZWwgPSAiTW9kZXJhdGUiLCANCiAgIyAgICAgICAgIGhqdXN0ID0gMSwgdmp1c3QgPSAtMC41MCwgY29sb3IgPSAiZGFya2JsdWUiLCBzaXplID0gNCkgKw0KICBhbm5vdGF0ZSgidGV4dCIsIHggPSBJbmYsIHkgPSB0YXJnZXRfY29uc2VydmF0aXZlLCBsYWJlbCA9ICJDb25zZXJ2YXRpdmUiLCANCiAgICAgICAgICAgaGp1c3QgPSAxLCB2anVzdCA9IC0wLjUwLCBjb2xvciA9ICJkYXJrYmx1ZSIsIHNpemUgPSA0KSArDQogIGFubm90YXRlKCJ0ZXh0IiwgeCA9IEluZiwgeSA9IHRhcmdldF9pbmZsYXRpb24sIGxhYmVsID0gIkluZmxhdGlvbiIsIA0KICAgICAgICAgICBoanVzdCA9IDEsIHZqdXN0ID0gKzEuMTAsIGNvbG9yID0gImRhcmtyZWQiLCBzaXplID0gNCkgKw0KICBhbm5vdGF0ZSgidGV4dCIsIHggPSBJbmYsIHkgPSBjYWdyX3ZhbHVlLCBsYWJlbCA9ICJDQUdSIiwgDQogICAgICAgICAgIGhqdXN0ID0gMSwgdmp1c3QgPSArMS4xMCwgY29sb3IgPSAiZGFya3JlZCIsIHNpemUgPSA0KSArIA0KDQogIGxhYnMoDQogICAgdGl0bGUgPSBkeW5hbWljX3RpdGxlLA0KICAgIHggPSAiWWVhciIsDQogICAgeSA9ICJHcm93dGggUmF0ZSAoJSkiLA0KICAgIGNhcHRpb24gPSBkeW5hbWljX2NhcHRpb24NCiAgKSArDQogIA0KICBjb29yZF9jYXJ0ZXNpYW4oeWxpbSA9IGMoeV9taW4sIHlfbWF4KSkgKyAjIEFwcGx5IGR5bmFtaWMgeS1heGlzIGxpbWl0cw0KICBzY2FsZV94X2NvbnRpbnVvdXMoDQogICAgbGltaXRzID0gYyhzdGFydF95ZWFyLCBlbmRfeWVhciArIDIpLCANCiAgICBicmVha3MgPSBzZXEobGltaXRzX3N0YXJ0X3llYXIsIGxpbWl0c19lbmRfeWVhciwgNSkNCiAgKSArICAjIFJlc3RyaWN0ICYgU2V0IE1ham9yIHgtYXhpcyBsaW5lcyBmb3IgZWFjaCB5ZWFyDQoNCiAgdGhlbWVfbWluaW1hbCgpICsNCiAgdGhlbWUoDQogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSwgc2l6ZSA9IDIwKSwgICAgICAgICAjIExhcmdlciB0aXRsZSBmb250DQogICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCksICAgICAgICAgICAgICAgICAgICAjIExhcmdlciB4LWF4aXMgbGFiZWwgZm9udA0KICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQpLCAgICAgICAgICAgICAgICAgICAgIyBMYXJnZXIgeS1heGlzIGxhYmVsIGZvbnQNCiAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEsIHNpemUgPSAxNCksICAjIExhcmdlciB4LWF4aXMgdGV4dA0KICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCksICAgICAgICAgICAgICAgICAgICAgIyBMYXJnZXIgeS1heGlzIHRleHQNCiAgICBwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9saW5lKGxpbmV0eXBlID0gImRvdHRlZCIsIGNvbG9yID0gImJsYWNrIiksICAgICAgICAgIyBNYWpvciBncmlkIGxpbmVzDQogICAgcGFuZWwuZ3JpZC5taW5vci54ID0gZWxlbWVudF9ibGFuaygpLCAjIGVsZW1lbnRfbGluZShjb2xvciA9ICJncmV5ODAiKSAgIyBNaW5vciB4IGdyaWQgbGluZXMgZm9yIGVhY2ggeWVhcg0KICAgICMgcGFuZWwuYm9yZGVyID0gZWxlbWVudF9yZWN0KGNvbG9yID0gImRhcmtncmV5IiwgZmlsbCA9IE5BLCBzaXplID0gMS4wKSAgIyBEYXJrIGJvcmRlciBhcm91bmQgdGhlIHBsb3QNCiAgICBheGlzLnRpY2tzLmxlbmd0aCA9IHVuaXQoLTAuMjUsICJjbSIpLCAgICAgICAgICAgICAgICAgICAgICAjIEluY3JlYXNlIHRpY2sgbGVuZ3RoDQogICAgYXhpcy50aWNrcyA9IGVsZW1lbnRfbGluZShjb2xvciA9ICJibGFjayIsIHNpemUgPSAwLjUwKSwgIyBEYXJrZXIgdGlja3MNCiAgICBheGlzLmxpbmUueCA9IGVsZW1lbnRfbGluZShjb2xvciA9ICJibGFjayIsIHNpemUgPSAwLjc1KSwgICMgRGFyayBib3R0b20gYm9yZGVyDQogICAgYXhpcy5saW5lLnkgPSBlbGVtZW50X2xpbmUoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMC43NSkgICAjIERhcmsgbGVmdCBib3JkZXINCiAgKQ0KDQpwcmludChwMykNCg0KYGBgDQoNCg0KIyMgQ09TVCBDQUdSDQoNCiMjIyBEYXRhDQoNCmBgYHtyIGNvc3RfcmF3X2dyLCBldmFsPVRSVUUsIGVjaG89RkFMU0V9DQoNCiMgVmlldyhucnQkY29zdF9yYXdfZ3IpDQppbnRlcmFjdGl2ZV9zdHIobnJ0JGNvc3RfcmF3X2dyKQ0KDQpsaWJyYXJ5KGRwbHlyKQ0KbGlicmFyeShsdWJyaWRhdGUpICAjIEZvciBkYXRlIG1hbmlwdWxhdGlvbg0KbGlicmFyeShzY2FsZXMpDQpsaWJyYXJ5KHN0cmluZ3IpDQoNCiMgVXBkYXRlIGRhdGEgZnJhbWUgd2l0aCBwcm9wZXIgZGF0ZSBhbmQgcGVyY2VudGFnZSBoYW5kbGluZw0KY29zdF9yYXdfZ3IgPC0gbnJ0JGNvc3RfcmF3X2dyICU+JQ0KICBtdXRhdGUoDQogICAgIyBDb252ZXJ0IENsb3NlIERhdGUgdG8gIllZWVktTU0tREQiIGZvcm1hdA0KICAgIGBEYXRlYCA9IGZvcm1hdChhcy5EYXRlKGFzLmNoYXJhY3RlcihgRGF0ZWApLCBvcmlnaW4gPSAiMTk3MC0wMS0wMSIpLCAiJVktJW0tJWQiKSwNCiAgICANCiAgICAjIEVuc3VyZSBDbG9zZSBpcyBhIG51bWJlciBmb3JtYXR0ZWQgdG8gMiBkZWNpbWFsIHBsYWNlcw0KICAgIGBDbG9zZWAgPSBudW1iZXIoYXMubnVtZXJpYyhnc3ViKCIsIiwgIiIsIENsb3NlKSksIGJpZy5tYXJrID0gIiwiLCBkZWNpbWFsLm1hcmsgPSAiLiIsIGFjY3VyYWN5ID0gMC4wMSksDQoNCiAgICAjIENsZWFuIGFuZCBoYW5kbGUgcGVyY2VudGFnZSBjb2x1bW5zDQogICAgYWNyb3NzKDM6MTEsIH4gew0KICAgICAgdmFsdWUgPC0gZ3N1YigiWywlXFxzXSIsICIiLCAuKSAgIyBSZW1vdmUgJSwgY29tbWFzLCBhbmQgc3BhY2VzDQogICAgICBudW1lcmljX3ZhbHVlIDwtIHN1cHByZXNzV2FybmluZ3MoYXMubnVtZXJpYyh2YWx1ZSkpICAjIENvbnZlcnQgdG8gbnVtZXJpYw0KICAgICAgaWZlbHNlKA0KICAgICAgICAhaXMubmEobnVtZXJpY192YWx1ZSksIA0KICAgICAgICBwYXN0ZTAoZm9ybWF0KHJvdW5kKG51bWVyaWNfdmFsdWUqMTAwLCAyKSwgYmlnLm1hcmsgPSAiLCIsIHNjaWVudGlmaWMgPSBGQUxTRSksICIlIiksICAjIEZvcm1hdCB0byAyIGRlY2ltYWwgcGxhY2VzIGFuZCBhZGQgY29tbWFzDQogICAgICAgIC4NCiAgICAgICkNCiAgICB9KQ0KICApICU+JQ0KICBhcnJhbmdlKGRlc2MoYERhdGVgKSkgICMgU29ydCBieSBEYXRlIGZyb20gbmV3ZXN0IHRvIG9sZGVzdA0KDQojIENyZWF0ZSBjb3N0X3Jhd19ncjogQ0dSDQpjb3N0X3Jhd19jZ3IgPC0gY29zdF9yYXdfZ3IgJT4lDQogIHNlbGVjdChgRGF0ZWAsIGBDbG9zZWAsIGAxLVllYXIgQ0FHUmAsIGNvbnRhaW5zICgiQ0dSIikpDQoNCiMgQ3JlYXRlIGNvc3RfcmF3X2dyOiBDQUdSDQpjb3N0X3Jhd19jYWdyIDwtIGNvc3RfcmF3X2dyICU+JQ0KICBzZWxlY3QoYERhdGVgLCBgQ2xvc2VgLCBjb250YWlucyAoIkNBR1IiKSkNCg0KIyBEaXNwbGF5IGJvdGggdGFibGVzIGZvciBjb25maXJtYXRpb24NCmludGVyYWN0aXZlX3ByaW50KGNvc3RfcmF3X2NncikNCmludGVyYWN0aXZlX3ByaW50KGNvc3RfcmF3X2NhZ3IpDQoNCiMgT3B0aW9uYWw6IFByaW50IHRhYmxlIHN1bW1hcmllcw0KaW50ZXJhY3RpdmVfc3RyKGNvc3RfcmF3X2NncikNCmludGVyYWN0aXZlX3N0cihjb3N0X3Jhd19jYWdyKQ0KDQojIERpc3BsYXkgY2FwdGlvbnMgZm9yIGVhY2ggdGFibGUNCiMgY2F0KCJcblxuIyMjIyBDdW11bGF0aXZlIEdyb3d0aCBSYXRlcyAoIiwgbWluX3llYXIsICItIiwgbWF4X3llYXIsICIpXG4iLCBzZXAgPSAiIikNCiMgZm9ybWF0X2VxdWFsX3dpZHRoKGNvc3RfcmF3X2NncikNCg0KY2F0KCJcblxuIyMjIyBDb21wb3VuZCBBdmVyYWdlIEdyb3d0aCBSYXRlcyAoIiwgbWluX3llYXIsICItIiwgbWF4X3llYXIsICIpXG4iLCBzZXAgPSAiIikNCmZvcm1hdF9lcXVhbF93aWR0aChjb3N0X3Jhd19jYWdyKQ0KDQojIFZpZXcoY29zdF9yYXdfY2FncikNCiMgY29sbmFtZXMoY29zdF9yYXdfY2FncikNCmludGVyYWN0aXZlX3N0cihjb3N0X3Jhd19jYWdyKQ0KDQoNCmBgYA0KDQojIyMgU3VtbWFyeQ0KDQpgYGB7ciBjb3N0X3Jhd19jYWdyX3N1bW1hcnksIGV2YWw9VFJVRSwgZWNobz1GQUxTRX0NCg0KaW50ZXJhY3RpdmVfc3RyKGNvc3RfcmF3X2NhZ3IpDQoNCiMgTG9hZCBuZWNlc3NhcnkgbGlicmFyaWVzDQpsaWJyYXJ5KGRwbHlyKQ0KbGlicmFyeSh0aWJibGUpDQoNCiMgRGVmaW5lIGEgaGVscGVyIGZ1bmN0aW9uIHRvIGNsZWFuIGFuZCBjb252ZXJ0IHBlcmNlbnRhZ2VzDQpjbGVhbl9wZXJjZW50YWdlIDwtIGZ1bmN0aW9uKGNvbHVtbikgew0KICBhcy5udW1lcmljKGdzdWIoIiUiLCAiIiwgY29sdW1uKSkNCn0NCg0KIyBEZWZpbmUgdGhlIHN0YXRpc3RpYyBuYW1lcyBmb3IgdGhlIHN1bW1hcnkgdGFibGUNCnN0YXRpc3RpY19uYW1lcyA8LSBjKA0KICAiQ291bnQgb2YgT2JzZXJ2YXRpb25zIiwgDQogICJNZWFuIiwgDQogICJNZWRpYW4iLA0KICAiU3RhbmRhcmQgRGV2aWF0aW9uIChWb2xhdGlsaXR5KSIsIA0KICAiTWluIENBR1IgUmFuZ2UgKENBR1IgLSBTRCkiLA0KICAiTWF4IENBR1IgUmFuZ2UgKENBR1IgKyBTRCkiLA0KICAiTWluaW11bSIsIA0KICAiTWF4aW11bSIsIA0KICAiUGVyY2VudCBBYm92ZSBJbmZsYXRpb24gVGFyZ2V0IiwgDQogICJQZXJjZW50IEFib3ZlIENvbnNlcnZhdGl2ZSBUYXJnZXQiLCANCiAgIlBlcmNlbnQgQWJvdmUgTW9kZXJhdGUgVGFyZ2V0IiwgDQogICJQZXJjZW50IEFib3ZlIEFnZ3Jlc3NpdmUgVGFyZ2V0Ig0KKQ0KDQojIEFkanVzdCB0aGUgZmlyc3Qgcm93J3MgRGF0ZSBhbmQgY2xlYW4gdXAgQ0FHUiBjb2x1bW5zDQpjb3N0X3Jhd19jYWdyIDwtIGNvc3RfcmF3X2NhZ3IgJT4lDQogIHNsaWNlKC0xKSAlPiUgIyBSZW1vdmUgdGhlIGZpcnN0IHJvdw0KICBtdXRhdGUoDQogICAgIyBEYXRlID0gaWZlbHNlKHJvd19udW1iZXIoKSA9PSAxLCAiMjAyNS0wMS0wMSIsIERhdGUpLA0KICAgIERhdGUgPSBhcy5udW1lcmljKGZvcm1hdChhcy5EYXRlKERhdGUpLCAiJVkiKSksDQogICAgYDEtWWVhciBDQUdSYCA9IGNsZWFuX3BlcmNlbnRhZ2UoYDEtWWVhciBDQUdSYCksDQogICAgYDUtWWVhciBDQUdSYCA9IGNsZWFuX3BlcmNlbnRhZ2UoYDUtWWVhciBDQUdSYCksDQogICAgYDEwLVllYXIgQ0FHUmAgPSBjbGVhbl9wZXJjZW50YWdlKGAxMC1ZZWFyIENBR1JgKSwNCiAgICBgMjAtWWVhciBDQUdSYCA9IGNsZWFuX3BlcmNlbnRhZ2UoYDIwLVllYXIgQ0FHUmApLA0KICAgIGAzMC1ZZWFyIENBR1JgID0gY2xlYW5fcGVyY2VudGFnZShgMzAtWWVhciBDQUdSYCkNCiAgKQ0KDQojIEZ1bmN0aW9uIHRvIGNhbGN1bGF0ZSBzdGF0aXN0aWNzIGZvciBhIGdpdmVuIGRhdGFzZXQNCmNhbGNfc3RhdHMgPC0gZnVuY3Rpb24oZGF0YSkgew0KICBpZiAoc3VtKCFpcy5uYShkYXRhKSkgPCAyKSByZXR1cm4ocmVwKE5BLCBsZW5ndGgoc3RhdGlzdGljX25hbWVzKSkpICAjIEhhbmRsZSBpbnN1ZmZpY2llbnQgZGF0YQ0KDQogIGNvdW50X29ic2VydmF0aW9ucyA8LSBzdW0oIWlzLm5hKGRhdGEpKQ0KICBtZWFuX3ZhbHVlIDwtIHJvdW5kKG1lYW4oZGF0YSwgbmEucm0gPSBUUlVFKSwgMikNCiAgbWVkaWFuX3ZhbHVlIDwtIHJvdW5kKG1lZGlhbihkYXRhLCBuYS5ybSA9IFRSVUUpLCAyKQ0KICBzZF92YWx1ZSA8LSByb3VuZChzZChkYXRhLCBuYS5ybSA9IFRSVUUpLCAyKQ0KICBtaW5fY2Fncl9yYW5nZSA8LSByb3VuZChjYWdyX3ZhbHVlIC0gc2RfdmFsdWUsIDIpDQogIG1heF9jYWdyX3JhbmdlIDwtIHJvdW5kKGNhZ3JfdmFsdWUgKyBzZF92YWx1ZSwgMikNCiAgbWluX3ZhbHVlIDwtIHJvdW5kKG1pbihkYXRhLCBuYS5ybSA9IFRSVUUpLCAyKQ0KICBtYXhfdmFsdWUgPC0gcm91bmQobWF4KGRhdGEsIG5hLnJtID0gVFJVRSksIDIpDQogIA0KICAjIERlZmluZSBpbmZsYXRpb24gYW5kIGdyb3d0aCB0YXJnZXRzDQogIHRhcmdldF9pbmZsYXRpb24gPC0gMiAgIyBFeGFtcGxlIHRhcmdldCBmb3IgaW5mbGF0aW9uDQogIHRhcmdldF9jb25zZXJ2YXRpdmUgPC0gMyArIHRhcmdldF9pbmZsYXRpb24NCiAgdGFyZ2V0X21vZGVyYXRlIDwtIDUgKyB0YXJnZXRfaW5mbGF0aW9uDQogIHRhcmdldF9hZ2dyZXNzaXZlIDwtIDEwICsgdGFyZ2V0X2luZmxhdGlvbg0KICANCiAgYWJvdmVfdGFyZ2V0X2luZmxhdGlvbiA8LSBzdW0oZGF0YSA+PSB0YXJnZXRfaW5mbGF0aW9uLCBuYS5ybSA9IFRSVUUpDQogIGFib3ZlX3RhcmdldF9jb25zZXJ2YXRpdmUgPC0gc3VtKGRhdGEgPj0gdGFyZ2V0X2NvbnNlcnZhdGl2ZSwgbmEucm0gPSBUUlVFKQ0KICBhYm92ZV90YXJnZXRfbW9kZXJhdGUgPC0gc3VtKGRhdGEgPj0gdGFyZ2V0X21vZGVyYXRlLCBuYS5ybSA9IFRSVUUpDQogIGFib3ZlX3RhcmdldF9hZ2dyZXNzaXZlIDwtIHN1bShkYXRhID49IHRhcmdldF9hZ2dyZXNzaXZlLCBuYS5ybSA9IFRSVUUpDQogIA0KICBwZXJjZW50X2Fib3ZlX3RhcmdldF9jb25zZXJ2YXRpdmUgPC0gcm91bmQoKGFib3ZlX3RhcmdldF9jb25zZXJ2YXRpdmUgLyBjb3VudF9vYnNlcnZhdGlvbnMpICogMTAwLCAyKQ0KICBwZXJjZW50X2Fib3ZlX3RhcmdldF9pbmZsYXRpb24gPC0gcm91bmQoKGFib3ZlX3RhcmdldF9pbmZsYXRpb24gLyBjb3VudF9vYnNlcnZhdGlvbnMpICogMTAwLCAyKQ0KICBwZXJjZW50X2Fib3ZlX3RhcmdldF9tb2RlcmF0ZSA8LSByb3VuZCgoYWJvdmVfdGFyZ2V0X21vZGVyYXRlIC8gY291bnRfb2JzZXJ2YXRpb25zKSAqIDEwMCwgMikNCiAgcGVyY2VudF9hYm92ZV90YXJnZXRfYWdncmVzc2l2ZSA8LSByb3VuZCgoYWJvdmVfdGFyZ2V0X2FnZ3Jlc3NpdmUgLyBjb3VudF9vYnNlcnZhdGlvbnMpICogMTAwLCAyKQ0KICANCiAgYygNCiAgICBjb3VudF9vYnNlcnZhdGlvbnMsIA0KICAgIHBhc3RlMChtZWFuX3ZhbHVlLCAiJSIpLA0KICAgIHBhc3RlMChtZWRpYW5fdmFsdWUsICIlIiksDQogICAgcGFzdGUwKHNkX3ZhbHVlLCAiJSIpLA0KICAgIHBhc3RlMChtaW5fY2Fncl9yYW5nZSwgIiUiKSwNCiAgICBwYXN0ZTAobWF4X2NhZ3JfcmFuZ2UsICIlIiksDQogICAgcGFzdGUwKG1pbl92YWx1ZSwgIiUiKSwNCiAgICBwYXN0ZTAobWF4X3ZhbHVlLCAiJSIpLA0KICAgIHBhc3RlMChwZXJjZW50X2Fib3ZlX3RhcmdldF9pbmZsYXRpb24sICIlIiksDQogICAgcGFzdGUwKHBlcmNlbnRfYWJvdmVfdGFyZ2V0X2NvbnNlcnZhdGl2ZSwgIiUiKSwgDQogICAgcGFzdGUwKHBlcmNlbnRfYWJvdmVfdGFyZ2V0X21vZGVyYXRlLCAiJSIpLCANCiAgICBwYXN0ZTAocGVyY2VudF9hYm92ZV90YXJnZXRfYWdncmVzc2l2ZSwgIiUiKQ0KICApDQp9DQoNCiMgQ29sdW1ucyB0byBjYWxjdWxhdGUgQ0FHUiBzdGF0aXN0aWNzDQpjYWdyX2NvbHVtbnMgPC0gYygiMS1ZZWFyIENBR1IiLCAiNS1ZZWFyIENBR1IiLCAiMTAtWWVhciBDQUdSIiwgIjIwLVllYXIgQ0FHUiIsICIzMC1ZZWFyIENBR1IiKQ0KZXhpc3RpbmdfY2Fncl9jb2x1bW5zIDwtIGludGVyc2VjdChjYWdyX2NvbHVtbnMsIG5hbWVzKGNvc3RfcmF3X2NhZ3IpKQ0KDQojIENhbGN1bGF0ZSBzdGF0cyBmb3IgZWFjaCBDQUdSIGNvbHVtbg0KY2Fncl9zdGF0c19saXN0IDwtIGxhcHBseShjb3N0X3Jhd19jYWdyW2V4aXN0aW5nX2NhZ3JfY29sdW1uc10sIGNhbGNfc3RhdHMpDQoNCiMgQ29tcGlsZSBpbnRvIGEgc3VtbWFyeSBkYXRhIGZyYW1lDQpjb3N0X3Jhd19jYWdyX3N1bW1hcnkgPC0gYXMuZGF0YS5mcmFtZShkby5jYWxsKGNiaW5kLCBjYWdyX3N0YXRzX2xpc3QpKQ0Kcm93bmFtZXMoY29zdF9yYXdfY2Fncl9zdW1tYXJ5KSA8LSBzdGF0aXN0aWNfbmFtZXMNCg0KDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KIyMgU0FWRSBWQUxVRVMgRk9SIElOLUxJTkUgQ09ERQ0KDQojIERlZmluZSB0aGUgbWFwcGluZyBvZiByb3cgbmFtZXMgdG8gdmFyaWFibGUgbmFtZXMNCnJvd190b192YXJfbmFtZSA8LSBjKA0KICAiQ291bnQgb2YgT2JzZXJ2YXRpb25zIiA9ICJjb3VudF9vYnNlcnZhdGlvbnMiLA0KICAiTWVhbiIgPSAibWVhbl92YWx1ZSIsDQogICJNZWRpYW4iID0gIm1lZGlhbl92YWx1ZSIsDQogICJTdGFuZGFyZCBEZXZpYXRpb24gKFZvbGF0aWxpdHkpIiA9ICJzZF92YWx1ZSIsDQogICJNaW4gQ0FHUiBSYW5nZSAoQ0FHUiAtIFNEKSIgPSAibWluX2NhZ3JfcmFuZ2UiLA0KICAiTWF4IENBR1IgUmFuZ2UgKENBR1IgKyBTRCkiID0gIm1heF9jYWdyX3JhbmdlIiwNCiAgIk1pbmltdW0iID0gIm1pbl92YWx1ZSIsDQogICJNYXhpbXVtIiA9ICJtYXhfdmFsdWUiLA0KICAiUGVyY2VudCBBYm92ZSBJbmZsYXRpb24gVGFyZ2V0IiA9ICJwZXJjZW50X2Fib3ZlX3RhcmdldF9pbmZsYXRpb24iLA0KICAiUGVyY2VudCBBYm92ZSBDb25zZXJ2YXRpdmUgVGFyZ2V0IiA9ICJwZXJjZW50X2Fib3ZlX3RhcmdldF9jb25zZXJ2YXRpdmUiLA0KICAiUGVyY2VudCBBYm92ZSBNb2RlcmF0ZSBUYXJnZXQiID0gInBlcmNlbnRfYWJvdmVfdGFyZ2V0X21vZGVyYXRlIiwNCiAgIlBlcmNlbnQgQWJvdmUgQWdncmVzc2l2ZSBUYXJnZXQiID0gInBlcmNlbnRfYWJvdmVfdGFyZ2V0X2FnZ3Jlc3NpdmUiDQopDQoNCiMgRnVuY3Rpb24gdG8gc2F2ZSBzdW1tYXJ5IHZhbHVlcyBkeW5hbWljYWxseQ0Kc2F2ZV9jb2x1bW5fdmFsdWVzIDwtIGZ1bmN0aW9uKHN1bW1hcnlfZGYpIHsNCiAgIyBFeGNsdWRlIHRoZSAiU3RhdGlzdGljIiBhbmQgIk92ZXJhbGwiIGNvbHVtbnMNCiAgY29sdW1uc190b19zYXZlIDwtIHNldGRpZmYobmFtZXMoc3VtbWFyeV9kZiksIGMoIlN0YXRpc3RpYyIsICJPdmVyYWxsIikpDQogIA0KICAjIEl0ZXJhdGUgb3ZlciBlYWNoIGNvbHVtbg0KICBmb3IgKGNvbCBpbiBjb2x1bW5zX3RvX3NhdmUpIHsNCiAgICAjIEZvcm1hdCBjb2x1bW4gbmFtZSB0byBsb3dlcmNhc2UgYW5kIHJlcGxhY2UgaW52YWxpZCBjaGFyYWN0ZXJzDQogICAgY29sX25hbWUgPC0gdG9sb3dlcihnc3ViKCJbXmEtekEtWjAtOV0iLCAiXyIsIGNvbCkpDQogICAgDQogICAgIyBFeHRyYWN0IHZhbHVlcyBmb3IgdGhlIGN1cnJlbnQgY29sdW1uDQogICAgY29sX3ZhbHVlcyA8LSBzdW1tYXJ5X2RmW1tjb2xdXQ0KICAgIA0KICAgICMgU2F2ZSBlYWNoIHZhbHVlIGR5bmFtaWNhbGx5IHVzaW5nIHRoZSBtYXBwaW5nIGZvciByb3cgbmFtZXMNCiAgICBmb3IgKGkgaW4gc2VxX2Fsb25nKGNvbF92YWx1ZXMpKSB7DQogICAgICAjIEdldCB0aGUgY29ycmVzcG9uZGluZyB2YXJpYWJsZSBuYW1lIGZyb20gdGhlIG1hcHBpbmcNCiAgICAgIHN0YXRfbmFtZSA8LSByb3dfdG9fdmFyX25hbWVbcm93bmFtZXMoc3VtbWFyeV9kZilbaV1dDQogICAgICANCiAgICAgIGlmICghaXMubmEoc3RhdF9uYW1lKSkgeyAgIyBTa2lwIGlmIG5vIG1hcHBpbmcgaXMgZGVmaW5lZA0KICAgICAgICAjIENyZWF0ZSB0aGUgdmFyaWFibGUgbmFtZQ0KICAgICAgICB2YXJfbmFtZSA8LSBwYXN0ZTAoc3RhdF9uYW1lLCAiXyIsIGNvbF9uYW1lKQ0KICAgICAgICANCiAgICAgICAgIyBBdHRlbXB0IG51bWVyaWMgY29udmVyc2lvbiBmb3IgZG93bnN0cmVhbSB1c2UNCiAgICAgICAgdmFsdWUgPC0gc3VwcHJlc3NXYXJuaW5ncyhhcy5udW1lcmljKGdzdWIoIiUiLCAiIiwgY29sX3ZhbHVlc1tpXSkpKQ0KICAgICAgICANCiAgICAgICAgIyBBc3NpZ24gdGhlIHZhbHVlIHRvIHRoZSBnbG9iYWwgZW52aXJvbm1lbnQNCiAgICAgICAgYXNzaWduKHZhcl9uYW1lLCB2YWx1ZSwgZW52aXIgPSAuR2xvYmFsRW52KQ0KICAgICAgfQ0KICAgIH0NCiAgfQ0KfQ0KDQojIEFwcGx5IHRoZSBmdW5jdGlvbiB0byBzYXZlIHZhbHVlcyBmb3IgYWxsIGNvbHVtbnMgZXhjZXB0ICJPdmVyYWxsIg0Kc2F2ZV9jb2x1bW5fdmFsdWVzKGNvc3RfcmF3X2NhZ3Jfc3VtbWFyeSkNCg0KIyBFeGFtcGxlOiBBY2Nlc3NpbmcgZHluYW1pY2FsbHkgY3JlYXRlZCB2YXJpYWJsZXMNCmludGVyYWN0aXZlX3ByaW50KG1lYW5fdmFsdWVfMV95ZWFyX2NhZ3IpICAjIFNob3VsZCBwcmludCB0aGUgbWVhbiB2YWx1ZSBmb3IgMS1ZZWFyIENBR1INCmludGVyYWN0aXZlX3ByaW50KHBlcmNlbnRfYWJvdmVfdGFyZ2V0X2luZmxhdGlvbl81X3llYXJfY2FncikgICMgU2hvdWxkIHByaW50IHRoZSBwZXJjZW50IGFib3ZlIGluZmxhdGlvbiB0YXJnZXQgZm9yIDUtWWVhciBDQUdSDQppbnRlcmFjdGl2ZV9wcmludChzZF92YWx1ZV8xMF95ZWFyX2NhZ3IpICAjIFNob3VsZCBwcmludCB0aGUgc3RhbmRhcmQgZGV2aWF0aW9uIGZvciAxMC1ZZWFyIENBR1INCg0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiMjIE9WRVJBTEwgU1RBVElTVElDUyANCm51bWVyaWNfdmFsdWVzX2FsbCA8LSBhcy5udW1lcmljKHVubGlzdChjb3N0X3Jhd19jYWdyW2V4aXN0aW5nX2NhZ3JfY29sdW1uc10sIHVzZS5uYW1lcyA9IEZBTFNFKSkNCm51bWVyaWNfdmFsdWVzX2FsbCA8LSBudW1lcmljX3ZhbHVlc19hbGxbIWlzLm5hKG51bWVyaWNfdmFsdWVzX2FsbCldDQoNCm92ZXJhbGxfY291bnRfb2JzZXJ2YXRpb25zIDwtIGxlbmd0aChudW1lcmljX3ZhbHVlc19hbGwpDQpvdmVyYWxsX21lYW5fdmFsdWUgPC0gcm91bmQobWVhbihudW1lcmljX3ZhbHVlc19hbGwpLCAyKQ0Kb3ZlcmFsbF9tZWRpYW5fdmFsdWUgPC0gcm91bmQobWVkaWFuKG51bWVyaWNfdmFsdWVzX2FsbCksIDIpDQpvdmVyYWxsX3NkX3ZhbHVlIDwtIHJvdW5kKHNkKG51bWVyaWNfdmFsdWVzX2FsbCksIDIpDQpvdmVyYWxsX21pbl9jYWdyX3JhbmdlIDwtIHJvdW5kKGNhZ3JfdmFsdWUgLSBvdmVyYWxsX3NkX3ZhbHVlLCAyKQ0Kb3ZlcmFsbF9tYXhfY2Fncl9yYW5nZSA8LSByb3VuZChjYWdyX3ZhbHVlICsgb3ZlcmFsbF9zZF92YWx1ZSwgMikNCm92ZXJhbGxfbWluX3ZhbHVlIDwtIHJvdW5kKG1pbihudW1lcmljX3ZhbHVlc19hbGwpLCAyKQ0Kb3ZlcmFsbF9tYXhfdmFsdWUgPC0gcm91bmQobWF4KG51bWVyaWNfdmFsdWVzX2FsbCksIDIpDQoNCm92ZXJhbGxfYWJvdmVfdGFyZ2V0X2luZmxhdGlvbiA8LSBzdW0obnVtZXJpY192YWx1ZXNfYWxsID49IHRhcmdldF9pbmZsYXRpb24sIG5hLnJtID0gVFJVRSkNCm92ZXJhbGxfYWJvdmVfdGFyZ2V0X2NvbnNlcnZhdGl2ZSA8LSBzdW0obnVtZXJpY192YWx1ZXNfYWxsID49IHRhcmdldF9jb25zZXJ2YXRpdmUsIG5hLnJtID0gVFJVRSkNCm92ZXJhbGxfYWJvdmVfdGFyZ2V0X21vZGVyYXRlIDwtIHN1bShudW1lcmljX3ZhbHVlc19hbGwgPj0gdGFyZ2V0X21vZGVyYXRlLCBuYS5ybSA9IFRSVUUpDQpvdmVyYWxsX2Fib3ZlX3RhcmdldF9hZ2dyZXNzaXZlIDwtIHN1bShudW1lcmljX3ZhbHVlc19hbGwgPj0gdGFyZ2V0X2FnZ3Jlc3NpdmUsIG5hLnJtID0gVFJVRSkNCg0Kb3ZlcmFsbF9wZXJjZW50X2Fib3ZlX3RhcmdldF9jb25zZXJ2YXRpdmUgPC0gcm91bmQoKG92ZXJhbGxfYWJvdmVfdGFyZ2V0X2NvbnNlcnZhdGl2ZSAvIG92ZXJhbGxfY291bnRfb2JzZXJ2YXRpb25zKSAqIDEwMCwgMikNCm92ZXJhbGxfcGVyY2VudF9hYm92ZV90YXJnZXRfaW5mbGF0aW9uIDwtIHJvdW5kKChvdmVyYWxsX2Fib3ZlX3RhcmdldF9pbmZsYXRpb24gLyBvdmVyYWxsX2NvdW50X29ic2VydmF0aW9ucykgKiAxMDAsIDIpDQpvdmVyYWxsX3BlcmNlbnRfYWJvdmVfdGFyZ2V0X21vZGVyYXRlIDwtIHJvdW5kKChvdmVyYWxsX2Fib3ZlX3RhcmdldF9tb2RlcmF0ZSAvIG92ZXJhbGxfY291bnRfb2JzZXJ2YXRpb25zKSAqIDEwMCwgMikNCm92ZXJhbGxfcGVyY2VudF9hYm92ZV90YXJnZXRfYWdncmVzc2l2ZSA8LSByb3VuZCgob3ZlcmFsbF9hYm92ZV90YXJnZXRfYWdncmVzc2l2ZSAvIG92ZXJhbGxfY291bnRfb2JzZXJ2YXRpb25zKSAqIDEwMCwgMikNCg0KY29zdF9yYXdfY2Fncl9zdW1tYXJ5JE92ZXJhbGwgPC0gYygNCiAgb3ZlcmFsbF9jb3VudF9vYnNlcnZhdGlvbnMsDQogIHBhc3RlMChvdmVyYWxsX21lYW5fdmFsdWUsICIlIiksDQogIHBhc3RlMChvdmVyYWxsX21lZGlhbl92YWx1ZSwgIiUiKSwNCiAgcGFzdGUwKG92ZXJhbGxfc2RfdmFsdWUsICIlIiksDQogIHBhc3RlMChvdmVyYWxsX21pbl9jYWdyX3JhbmdlLCAiJSIpLA0KICBwYXN0ZTAob3ZlcmFsbF9tYXhfY2Fncl9yYW5nZSwgIiUiKSwNCiAgcGFzdGUwKG92ZXJhbGxfbWluX3ZhbHVlLCAiJSIpLA0KICBwYXN0ZTAob3ZlcmFsbF9tYXhfdmFsdWUsICIlIiksDQogIHBhc3RlMChvdmVyYWxsX3BlcmNlbnRfYWJvdmVfdGFyZ2V0X2luZmxhdGlvbiwgIiUiKSwNCiAgcGFzdGUwKG92ZXJhbGxfcGVyY2VudF9hYm92ZV90YXJnZXRfY29uc2VydmF0aXZlLCAiJSIpLA0KICBwYXN0ZTAob3ZlcmFsbF9wZXJjZW50X2Fib3ZlX3RhcmdldF9tb2RlcmF0ZSwgIiUiKSwNCiAgcGFzdGUwKG92ZXJhbGxfcGVyY2VudF9hYm92ZV90YXJnZXRfYWdncmVzc2l2ZSwgIiUiKQ0KKQ0KDQojIENvbnZlcnQgcm93IG5hbWVzIHRvIGEgY29sdW1uDQpjb3N0X3Jhd19jYWdyX3N1bW1hcnkgPC0gdGliYmxlOjpyb3duYW1lc190b19jb2x1bW4oY29zdF9yYXdfY2Fncl9zdW1tYXJ5LCB2YXIgPSAiU3RhdGlzdGljIikNCg0KIyBFbnN1cmUgYWxsIGNvbHVtbnMgYXJlIGNoYXJhY3Rlcg0KY29zdF9yYXdfY2Fncl9zdW1tYXJ5IDwtIGNvc3RfcmF3X2NhZ3Jfc3VtbWFyeSAlPiUNCiAgbXV0YXRlKGFjcm9zcyhldmVyeXRoaW5nKCksIGFzLmNoYXJhY3RlcikpDQoNCiMgRGlzcGxheSB0aGUgc3VtbWFyeSB0YWJsZQ0KY2F0KCJcbiMjIyMgQ29tcG91bmQgQXZlcmFnZSBHcm93dGggUmF0ZXMgKCIsIG1pbl95ZWFyLCAiLSIsIG1heF95ZWFyLCAiKVxuIiwgc2VwID0gIiIpDQppbnRlcmFjdGl2ZV9zdHIoY29zdF9yYXdfY2Fncl9zdW1tYXJ5KQ0KZm9ybWF0X3Vuc3BlY2lmaWVkX3dpZHRoKGNvc3RfcmF3X2NhZ3Jfc3VtbWFyeSkNCg0KYGBgDQoNCioqYHIgbWluX3llYXJgLWByIG1heF95ZWFyYCBTdW1tYXJ5OioqIFRoZSAxLVllYXIgQ0FHUiBleGhpYml0cyB0aGUgYHIgaWYobWVhbl92YWx1ZV8xX3llYXJfY2FnciA9PSBtYXgoYyhtZWFuX3ZhbHVlXzFfeWVhcl9jYWdyLCBtZWFuX3ZhbHVlXzVfeWVhcl9jYWdyLCBtZWFuX3ZhbHVlXzEwX3llYXJfY2FnciwgbWVhbl92YWx1ZV8yMF95ZWFyX2NhZ3IpKSkgImhpZ2hlc3QgbWVhbiByZXR1cm4iIGVsc2UgaWYobWVhbl92YWx1ZV8xX3llYXJfY2FnciA9PSBtaW4oYyhtZWFuX3ZhbHVlXzFfeWVhcl9jYWdyLCBtZWFuX3ZhbHVlXzVfeWVhcl9jYWdyLCBtZWFuX3ZhbHVlXzEwX3llYXJfY2FnciwgbWVhbl92YWx1ZV8yMF95ZWFyX2NhZ3IpKSkgImxvd2VzdCBtZWFuIHJldHVybiIgZWxzZSAibWVhbiByZXR1cm4iYCBhdCBgciBtZWFuX3ZhbHVlXzFfeWVhcl9jYWdyYCUsIGFuZCBgciBpZihzZF92YWx1ZV8xX3llYXJfY2FnciA9PSBtYXgoYyhzZF92YWx1ZV8xX3llYXJfY2Fnciwgc2RfdmFsdWVfNV95ZWFyX2NhZ3IsIHNkX3ZhbHVlXzEwX3llYXJfY2Fnciwgc2RfdmFsdWVfMjBfeWVhcl9jYWdyKSkpICJ0aGUgZ3JlYXRlc3Qgdm9sYXRpbGl0eSB3aXRoIGEiIGVsc2UgaWYoc2RfdmFsdWVfMV95ZWFyX2NhZ3IgPT0gbWluKGMoc2RfdmFsdWVfMV95ZWFyX2NhZ3IsIHNkX3ZhbHVlXzVfeWVhcl9jYWdyLCBzZF92YWx1ZV8xMF95ZWFyX2NhZ3IsIHNkX3ZhbHVlXzIwX3llYXJfY2FncikpKSAidGhlIGxlYXN0IHZvbGF0aWxpdHkgd2l0aCBhIiBlbHNlICJhImAgc3RhbmRhcmQgZGV2aWF0aW9uIG9mIGByIHNkX3ZhbHVlXzFfeWVhcl9jYWdyYCUuIEFzIHRoZSBpbnZlc3RtZW50IGhvcml6b24gZXh0ZW5kcyB0byA1LCAxMCwgYW5kIDIwIHllYXJzLCB0aGUgbWVhbiByZXR1cm5zIGByIGlmKG1lYW5fdmFsdWVfMV95ZWFyX2NhZ3IgPCBtZWFuKGMobWVhbl92YWx1ZV81X3llYXJfY2FnciwgbWVhbl92YWx1ZV8xMF95ZWFyX2NhZ3IsIG1lYW5fdmFsdWVfMjBfeWVhcl9jYWdyKSkpICJpbmNyZWFzZSIgZWxzZSAiZGVjcmVhc2UiYCwgcmFuZ2luZyBmcm9tIGByIG1lYW5fdmFsdWVfNV95ZWFyX2NhZ3JgJSB0byBgciBtZWFuX3ZhbHVlXzIwX3llYXJfY2FncmAlLCB3aGlsZSB2b2xhdGlsaXR5IGByIGlmKHNkX3ZhbHVlXzFfeWVhcl9jYWdyIDwgbWVhbihjKHNkX3ZhbHVlXzVfeWVhcl9jYWdyLCBzZF92YWx1ZV8xMF95ZWFyX2NhZ3IsIHNkX3ZhbHVlXzIwX3llYXJfY2FncikpKSAicmlzZXMiIGVsc2UgImRpbWluaXNoZXMiYCwgd2l0aCBzdGFuZGFyZCBkZXZpYXRpb25zIGByIGlmKHNkX3ZhbHVlXzFfeWVhcl9jYWdyID4gc2RfdmFsdWVfMjBfeWVhcl9jYWdyKSAiZHJvcHBpbmciIGVsc2UgInJpc2luZyJgIGZyb20gYHIgc2RfdmFsdWVfNV95ZWFyX2NhZ3JgJSB0byBgciBzZF92YWx1ZV8yMF95ZWFyX2NhZ3JgJS4gVGhpcyB0cmVuZCBpbmRpY2F0ZXMgdGhhdCBsb25nZXIgaW52ZXN0bWVudCBwZXJpb2RzIHRlbmQgdG8gb2ZmZXIgYHIgaWYoc2RfdmFsdWVfMV95ZWFyX2NhZ3IgPiBzZF92YWx1ZV8yMF95ZWFyX2NhZ3IpICJtb3JlIHN0YWJsZSIgZWxzZSAibGVzcyBzdGFibGUiYCByZXR1cm5zLiBGdXJ0aGVybW9yZSwgdGhlIHBlcmNlbnRhZ2Ugb2YgcGVyaW9kcyBleGNlZWRpbmcgdGhlIGluZmxhdGlvbiB0YXJnZXQgYHIgaWYocGVyY2VudF9hYm92ZV90YXJnZXRfaW5mbGF0aW9uXzFfeWVhcl9jYWdyIDwgcGVyY2VudF9hYm92ZV90YXJnZXRfaW5mbGF0aW9uXzIwX3llYXJfY2FncikgImluY3JlYXNlcyIgZWxzZSAiZGVjcmVhc2VzImAgd2l0aCBsb25nZXIgZHVyYXRpb25zLCBmcm9tIGByIHBlcmNlbnRfYWJvdmVfdGFyZ2V0X2luZmxhdGlvbl8xX3llYXJfY2FncmAlIGluIHRoZSAxLVllYXIgQ0FHUiB0byBgciBwZXJjZW50X2Fib3ZlX3RhcmdldF9pbmZsYXRpb25fMjBfeWVhcl9jYWdyYCUgaW4gdGhlIDIwLVllYXIgQ0FHUiwgdW5kZXJzY29yaW5nIENPU1QncyBgciBpZihwZXJjZW50X2Fib3ZlX3RhcmdldF9pbmZsYXRpb25fMV95ZWFyX2NhZ3IgPCBwZXJjZW50X2Fib3ZlX3RhcmdldF9pbmZsYXRpb25fMjBfeWVhcl9jYWdyKSAiZWZmZWN0aXZlbmVzcyIgZWxzZSAiaW5lZmZlY3RpdmVuZXNzImAgYXMgYSBoZWRnZSBhZ2FpbnN0IGluZmxhdGlvbiBvdmVyIGV4dGVuZGVkIHRpbWVmcmFtZXMuIFdpdGggYW4gb3ZlcmFsbCBwZXJjZW50YWdlIG9mIGByIG92ZXJhbGxfcGVyY2VudF9hYm92ZV90YXJnZXRfYWdncmVzc2l2ZWAlIGV4Y2VlZGluZyB0aGUgYWdncmVzc2l2ZSB0YXJnZXQgKGByIHRhcmdldF9hZ2dyZXNzaXZlYCUgYW5udWFsaXplZCByZXR1cm5zIHdpdGggYHIgdGFyZ2V0X2luZmxhdGlvbmAlIGluZmxhdGlvbiksIENPU1QgYHIgaWYob3ZlcmFsbF9wZXJjZW50X2Fib3ZlX3RhcmdldF9hZ2dyZXNzaXZlID4gNTApICJoYXMsIG92ZXIgdGhpcyB0aW1lIHBlcmlvZCwgcHJvdmVuIHRvIGJlIGEgc3Ryb25nIiBlbHNlIGlmKG92ZXJhbGxfcGVyY2VudF9hYm92ZV90YXJnZXRfYWdncmVzc2l2ZSA+IDQwKSAiaGFzLCBvdmVyIHRoaXMgdGltZSBwZXJpb2QsIGRlbW9uc3RyYXRlZCBpdHNlbGYgYXMgYSB2aWFibGUiIGVsc2UgImFwcGVhcnMsIG92ZXIgdGhpcyB0aW1lIHBlcmlvZCwgdG8gYmUgYSBsZXNzIHN1aXRhYmxlImAgb3B0aW9uIGZvciBhIGhpZ2gtcmV0dXJuaW5nIGxvbmctdGVybSBpbnZlc3RtZW50Lg0KDQojIyMgR3JhcGgNCg0KIyMjIyBBbGwgUGVyaW9kcw0KDQoNCmBgYHtyIGNvc3RfcmF3X2NhZ3JfZ3JhcGhzX2FsbCwgZmlnLndpZHRoPTEwLCBmaWcuaGVpZ2h0PTcsIGV2YWw9VFJVRSwgZWNobz1GQUxTRX0NCg0KY2F0KCJcblxuIyMjIyBDb21wb3VuZCBBdmVyYWdlIEdyb3d0aCBSYXRlcyBBY3Jvc3MgUGVyaW9kcyBcbiIpDQoNCiMgTG9hZCBuZWNlc3NhcnkgbGlicmFyaWVzDQpsaWJyYXJ5KGdncGxvdDIpDQpsaWJyYXJ5KGRwbHlyKQ0KDQoNCiMgQ29udmVydCBjb2x1bW5zIHRvIG51bWVyaWMgZm9yIHBsb3R0aW5nIGlmIG5lZWRlZA0KY29zdF9yYXdfY2FnciA8LSBjb3N0X3Jhd19jYWdyICU+JQ0KICBtdXRhdGUoDQogICAgYERhdGVgID0gYXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIoYERhdGVgKSksICAjIEVuc3VyZSBEYXRlIGlzIG51bWVyaWMNCiAgICBgMS1ZZWFyIENBR1JgID0gYXMubnVtZXJpYyhnc3ViKCIlIiwgIiIsIGAxLVllYXIgQ0FHUmApKSwNCiAgICBgNS1ZZWFyIENBR1JgID0gYXMubnVtZXJpYyhnc3ViKCIlIiwgIiIsIGA1LVllYXIgQ0FHUmApKSwNCiAgICBgMTAtWWVhciBDQUdSYCA9IGFzLm51bWVyaWMoZ3N1YigiJSIsICIiLCBgMTAtWWVhciBDQUdSYCkpLA0KICAgIGAyMC1ZZWFyIENBR1JgID0gYXMubnVtZXJpYyhnc3ViKCIlIiwgIiIsIGAyMC1ZZWFyIENBR1JgKSksDQogICAgYDMwLVllYXIgQ0FHUmAgPSBhcy5udW1lcmljKGdzdWIoIiUiLCAiIiwgYDMwLVllYXIgQ0FHUmApKQ0KICApDQoNCiMgUmVzaGFwZSB0aGUgZGF0YSBpbnRvIGxvbmcgZm9ybWF0IGZvciBlYXN5IHBsb3R0aW5nIG9mIG11bHRpcGxlIGxpbmVzIGFuZCBzZXQgdGhlIGZhY3RvciBvcmRlcg0KbnJ0X2xvbmcgPC0gY29zdF9yYXdfY2FnciAlPiUNCiAgcGl2b3RfbG9uZ2VyKGNvbHMgPSBjKGAxLVllYXIgQ0FHUmAsIGA1LVllYXIgQ0FHUmAsIGAxMC1ZZWFyIENBR1JgLCBgMjAtWWVhciBDQUdSYCwgYDMwLVllYXIgQ0FHUmApLA0KICAgICAgICAgICAgICAgbmFtZXNfdG8gPSAiQ0FHUl9QZXJpb2QiLA0KICAgICAgICAgICAgICAgdmFsdWVzX3RvID0gIkNBR1JfVmFsdWUiKSAlPiUNCiAgbXV0YXRlKENBR1JfUGVyaW9kID0gZmFjdG9yKENBR1JfUGVyaW9kLCBsZXZlbHMgPSBjKCIxLVllYXIgQ0FHUiIsICI1LVllYXIgQ0FHUiIsICIxMC1ZZWFyIENBR1IiLCAiMjAtWWVhciBDQUdSIiwgIjMwLVllYXIgQ0FHUiIpKSkNCg0KIyBBc3NpZ24gY29sb3JzIGR5bmFtaWNhbGx5IGJhc2VkIG9uIHRoZSBvcmRlciBvZiBDQUdSX1BlcmlvZCBpbiB0aGUgZGF0YQ0KIyBNYXRjaCB0aGUgdW5pcXVlIGxldmVscyBvZiBDQUdSX1BlcmlvZCB3aXRoIGNvbG9ycyBmcm9tIGNvbG9yc19nZW5lcmFsX2RhcmsNCnVuaXF1ZV90eXBlcyA8LSB1bmlxdWUobnJ0X2xvbmckQ0FHUl9QZXJpb2QpDQpjdXN0b21fY29sb3JzIDwtIHNldE5hbWVzKGNvbG9yc19nZW5lcmFsX2RhcmtbMTpsZW5ndGgodW5pcXVlX3R5cGVzKV0sIHVuaXF1ZV90eXBlcykNCg0KIyBGaW5kIHRoZSBtaW5pbXVtIGFuZCBtYXhpbXVtIHgtdmFsdWUgaW4geW91ciBkYXRhDQptYXhfeCA8LSBtYXgoYXMuaW50ZWdlcihjb3N0X3Jhd19jYWdyJERhdGUpLCBuYS5ybSA9IFRSVUUpDQptaW5feCA8LSBtaW4oYXMuaW50ZWdlcihjb3N0X3Jhd19jYWdyJERhdGUpLCBuYS5ybSA9IFRSVUUpDQppbnRlcmFjdGl2ZV9wcmludChtYXhfeCkgICMgVGVzdA0KaW50ZXJhY3RpdmVfcHJpbnQobWluX3gpICAjIFRlc3QNCg0KIyBGaW5kIHRoZSBtaW5pbXVtIGFuZCBtYXhpbXVtIHllYXINCm1pbl95ZWFyIDwtIG1pbihjb3N0X3Jhd19jYWdyJERhdGUsIG5hLnJtID0gVFJVRSkNCm1heF95ZWFyIDwtIG1heChjb3N0X3Jhd19jYWdyJERhdGUsIG5hLnJtID0gVFJVRSkNCmludGVyYWN0aXZlX3ByaW50KG1pbl95ZWFyKQ0KaW50ZXJhY3RpdmVfcHJpbnQobWF4X3llYXIpDQoNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQojIyBQTE9UIEZVTEwgV0lUSE9VVCBMSU1JVFMNCg0KIyBEZWZpbmUgc3RhcnQgYW5kIGVuZCB5ZWFycw0Kc3RhcnRfeWVhciA8LSBhcy5udW1lcmljKG1pbl95ZWFyKQ0KZW5kX3llYXIgPC0gMjAyNA0KeWVhcl9yYW5nZSA8LSBlbmRfeWVhciAtIHN0YXJ0X3llYXIgKyAxICAjIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIHllYXJzDQoNCiMgRGVmaW5lIGJyZWFrcyByb3VuZGVkIGFwcHJvcHJpYXRlbHkNCmxpbWl0c19zdGFydF95ZWFyIDwtIGZsb29yKHN0YXJ0X3llYXIgLyA1KSAqIDUgICMgUm91bmQgZG93biB0byB0aGUgbmVhcmVzdCBtdWx0aXBsZSBvZiA1DQpsaW1pdHNfZW5kX3llYXIgPC0gY2VpbGluZyhlbmRfeWVhciAvIDUpICogNSAgICMgUm91bmQgdXAgdG8gdGhlIG5lYXJlc3QgbXVsdGlwbGUgb2YgNQ0KDQojIENyZWF0ZSBkeW5hbWljIHRpdGxlIGFuZCBjYXB0aW9uDQpkeW5hbWljX3RpdGxlIDwtIHBhc3RlMCgiUm9sbGluZyBDQUdScyBBY3Jvc3MgUGVyaW9kcyBPdmVyICIseWVhcl9yYW5nZSwgIiBZZWFycyAoIiwgc3RhcnRfeWVhciwgIi0iLCBlbmRfeWVhciwgIikiKQ0KZHluYW1pY19jYXB0aW9uIDwtIHBhc3RlMCgiQ09TVCBDb21wb3VuZCBBdmVyYWdlIEdyb3d0aCBSYXRlcyBBY3Jvc3MgUm9sbGluZyBQZXJpb2RzLCBEYXRhc2V0ICgiLCBtaW5feWVhciwgIi0iLCBtYXhfeWVhciwgIikiKQ0KDQojIENyZWF0ZSB0aGUgZnVsbCwgbm9uLWZpbHRlcmVkIHgtYXhpcyBwbG90IHdpdGggZHluYW1pYyB4IHBsYWNlbWVudCBmb3IgYW5ub3RhdGlvbnMNCnAxIDwtIGdncGxvdChucnRfbG9uZywgYWVzKHggPSBhcy5pbnRlZ2VyKERhdGUpLCB5ID0gQ0FHUl9WYWx1ZSwgY29sb3IgPSBDQUdSX1BlcmlvZCkpICsNCg0KICAjIEFkZCBzaGFkZWQgYXJlYXMgZm9yIGJhY2tncm91bmQgZWZmZWN0DQogIGdlb21fcmVjdChhZXMoeG1pbiA9IC1JbmYsIHhtYXggPSBJbmYsIHltaW4gPSB0YXJnZXRfYWdncmVzc2l2ZSwgeW1heCA9IEluZiksIGZpbGwgPSAibGlnaHRncmVlbiIsIGFscGhhID0gMC4wMTApICsNCiAgZ2VvbV9yZWN0KGFlcyh4bWluID0gLUluZiwgeG1heCA9IEluZiwgeW1pbiA9IHRhcmdldF9jb25zZXJ2YXRpdmUsIHltYXggPSB0YXJnZXRfYWdncmVzc2l2ZSksIGZpbGwgPSAib3JhbmdlIiwgYWxwaGEgPSAwLjAxKSArDQogIGdlb21fcmVjdChhZXMoeG1pbiA9IC1JbmYsIHhtYXggPSBJbmYsIHltaW4gPSAtSW5mLCB5bWF4ID0gdGFyZ2V0X2NvbnNlcnZhdGl2ZSksIGZpbGwgPSAibGlnaHRjb3JhbCIsIGFscGhhID0gMC4wMTApICsNCiAgDQogICMgUGxvdCBsaW5lcyBmb3IgZWFjaCBDQUdSIFBlcmlvZA0KICBnZW9tX2xpbmUoc2l6ZSA9IDEuMCwgYWxwaGEgPSAzLjApICsgICAgICAgIyBMaW5lIGZvciBlYWNoIENBR1INCiAgZ2VvbV9wb2ludChzaXplID0gMS4wLCBhbHBoYSA9IDMuMCkgKyAgICAgICAjIFBvaW50cyBmb3IgZWFjaCBDQUdSDQogIA0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSB0YXJnZXRfYWdncmVzc2l2ZSwgY29sb3IgPSAiZGFya2JsdWUiLCBsaW5ldHlwZSA9ICJzb2xpZCIpICsNCiAgIyBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSB0YXJnZXRfbW9kZXJhdGUsIGNvbG9yID0gImRhcmtibHVlIiwgbGluZXR5cGUgPSAic29saWQiKSArDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IHRhcmdldF9jb25zZXJ2YXRpdmUsIGNvbG9yID0gImRhcmtibHVlIiwgbGluZXR5cGUgPSAic29saWQiKSArDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IHRhcmdldF9pbmZsYXRpb24sIGNvbG9yID0gImRhcmtyZWQiLCBsaW5ldHlwZSA9ICJkYXNoZWQiKSArDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IGNhZ3JfdmFsdWUsIGNvbG9yID0gImRhcmtyZWQiLCBsaW5ldHlwZSA9ICJkYXNoZWQiKSArDQogIA0KICAjIER5bmFtaWMgcmlnaHQtYWxpZ25lZCBwbGFjZW1lbnQgZm9yIGFubm90YXRpb25zDQogIGFubm90YXRlKCJ0ZXh0IiwgeCA9IEluZiwgeSA9IHRhcmdldF9hZ2dyZXNzaXZlLCBsYWJlbCA9ICJBZ2dyZXNzaXZlIiwgDQogICAgICAgICAgIGhqdXN0ID0gMSwgdmp1c3QgPSAtMC41MCwgY29sb3IgPSAiZGFya2JsdWUiLCBzaXplID0gNCkgKw0KICAjIGFubm90YXRlKCJ0ZXh0IiwgeCA9IEluZiwgeSA9IHRhcmdldF9tb2RlcmF0ZSwgbGFiZWwgPSAiTW9kZXJhdGUiLCANCiAgIyAgICAgICAgIGhqdXN0ID0gMSwgdmp1c3QgPSAtMC41MCwgY29sb3IgPSAiZGFya2JsdWUiLCBzaXplID0gNCkgKw0KICBhbm5vdGF0ZSgidGV4dCIsIHggPSBJbmYsIHkgPSB0YXJnZXRfY29uc2VydmF0aXZlLCBsYWJlbCA9ICJDb25zZXJ2YXRpdmUiLCANCiAgICAgICAgICAgaGp1c3QgPSAxLCB2anVzdCA9ICsxLjEwLCBjb2xvciA9ICJkYXJrYmx1ZSIsIHNpemUgPSA0KSArDQogIGFubm90YXRlKCJ0ZXh0IiwgeCA9IEluZiwgeSA9IHRhcmdldF9pbmZsYXRpb24sIGxhYmVsID0gIkluZmxhdGlvbiIsIA0KICAgICAgICAgICBoanVzdCA9IDEsIHZqdXN0ID0gKzEuMTAsIGNvbG9yID0gImRhcmtyZWQiLCBzaXplID0gNCkgKw0KICBhbm5vdGF0ZSgidGV4dCIsIHggPSBJbmYsIHkgPSBjYWdyX3ZhbHVlLCBsYWJlbCA9ICJDQUdSIiwgDQogICAgICAgICAgIGhqdXN0ID0gMSwgdmp1c3QgPSArMS4xMCwgY29sb3IgPSAiZGFya3JlZCIsIHNpemUgPSA0KSArIA0KDQogIGxhYnMoDQogICAgdGl0bGUgPSBkeW5hbWljX3RpdGxlLA0KICAgIHggPSAiWWVhciIsDQogICAgeSA9ICJDQUdSIFZhbHVlICglKSIsDQogICAgY29sb3IgPSAiQ0FHUiBQZXJpb2QiLA0KICAgIGNhcHRpb24gPSBkeW5hbWljX2NhcHRpb24NCiAgICApICsNCiAgDQogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjdXN0b21fY29sb3JzKSArICAjIFNldCBjb2xvcnMgZm9yIGVhY2ggQ0FHUiBQZXJpb2QNCiAgc2NhbGVfeF9jb250aW51b3VzKA0KICAgIGxpbWl0cyA9IGMoc3RhcnRfeWVhciwgZW5kX3llYXIgKyAzKSwgDQogICAgYnJlYWtzID0gc2VxKGxpbWl0c19zdGFydF95ZWFyLCBsaW1pdHNfZW5kX3llYXIgLCA1KSkgKyAgIyBSZXN0cmljdCAmIFNldCBNYWpvciB4LWF4aXMgbGluZXMgZm9yIGVhY2ggeWVhcg0KICANCiAgdGhlbWVfbWluaW1hbCgpICsNCiAgdGhlbWUoDQogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSwgc2l6ZSA9IDIwKSwgICAgICAgICAjIExhcmdlciB0aXRsZSBmb250DQogICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCksICAgICAgICAgICAgICAgICAgICAjIExhcmdlciB4LWF4aXMgbGFiZWwgZm9udA0KICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQpLCAgICAgICAgICAgICAgICAgICAgIyBMYXJnZXIgeS1heGlzIGxhYmVsIGZvbnQNCiAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEsIHNpemUgPSAxNCksICAjIExhcmdlciB4LWF4aXMgdGV4dA0KICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCksICAgICAgICAgICAgICAgICAgICAgIyBMYXJnZXIgeS1heGlzIHRleHQNCiAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0KSwgICAgICAgICAgICAgICAgICAgICMgTGVnZW5kIHRpdGxlIHNpemUNCiAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIpLCAgICAgICAgICAgICAgICAgICAgICMgTGVnZW5kIHRleHQgc2l6ZQ0KICAgIHBhbmVsLmdyaWQubWFqb3IgPSBlbGVtZW50X2xpbmUobGluZXR5cGUgPSAiZG90dGVkIiwgY29sb3IgPSAiYmxhY2siKSwgICMgTWFqb3IgZ3JpZCBsaW5lcw0KICAgIHBhbmVsLmdyaWQubWlub3IueCA9IGVsZW1lbnRfYmxhbmsoKSwgICAgICAgICAgICAgICAgICAgICAgIyBObyBtaW5vciB4IGdyaWQgbGluZXMNCiAgICBheGlzLnRpY2tzLmxlbmd0aCA9IHVuaXQoLTAuMjUsICJjbSIpLCAgICAgICAgICAgICAgICAgICAgICAjIEluY3JlYXNlIHRpY2sgbGVuZ3RoDQogICAgYXhpcy50aWNrcyA9IGVsZW1lbnRfbGluZShjb2xvciA9ICJibGFjayIsIHNpemUgPSAwLjUwKSwgICAjIERhcmtlciB0aWNrcw0KICAgIGF4aXMubGluZS54ID0gZWxlbWVudF9saW5lKGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDAuNzUpLCAgIyBEYXJrIGJvdHRvbSBib3JkZXINCiAgICBheGlzLmxpbmUueSA9IGVsZW1lbnRfbGluZShjb2xvciA9ICJibGFjayIsIHNpemUgPSAwLjc1KSAgICMgRGFyayBsZWZ0IGJvcmRlcg0KICApDQoNCiMgUHJpbnQgdGhlIHBsb3QgDQpwcmludChwMSkNCg0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiMjIFBMT1QgUkVTVFJJQ1RFRCBXSVRIIExJTUlUUyANCg0KIyBGaWx0ZXIgdGhlIGRhdGEgZm9yIHRoZSByZXN0cmljdGVkIHgtYXhpcyByYW5nZSAoMjAwNS0yMDI0KQ0KcmVzdHJpY3RlZF9kYXRhIDwtIG5ydF9sb25nICU+JQ0KICBmaWx0ZXIoYXMuaW50ZWdlcihEYXRlKSA+PSAyMDA1ICYgYXMuaW50ZWdlcihEYXRlKSA8PSAyMDI0KQ0KDQojIERlZmluZSBzdGFydCBhbmQgZW5kIHllYXJzDQpzdGFydF95ZWFyIDwtIDIwMDUNCmVuZF95ZWFyIDwtIDIwMjQNCnllYXJfcmFuZ2UgPC0gZW5kX3llYXIgLSBzdGFydF95ZWFyICsgMSAgIyBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiB5ZWFycw0KDQojIERlZmluZSBicmVha3Mgcm91bmRlZCBhcHByb3ByaWF0ZWx5DQpsaW1pdHNfc3RhcnRfeWVhciA8LSBmbG9vcihzdGFydF95ZWFyIC8gNSkgKiA1ICAjIFJvdW5kIGRvd24gdG8gdGhlIG5lYXJlc3QgbXVsdGlwbGUgb2YgNQ0KbGltaXRzX2VuZF95ZWFyIDwtIGNlaWxpbmcoZW5kX3llYXIgLyA1KSAqIDUgICAjIFJvdW5kIHVwIHRvIHRoZSBuZWFyZXN0IG11bHRpcGxlIG9mIDUNCg0KIyBDcmVhdGUgZHluYW1pYyB0aXRsZSBhbmQgY2FwdGlvbg0KZHluYW1pY190aXRsZSA8LSBwYXN0ZTAoIlJvbGxpbmcgQ0FHUnMgQWNyb3NzIFBlcmlvZHMgT3ZlciAiLHllYXJfcmFuZ2UsICIgWWVhcnMgKCIsIHN0YXJ0X3llYXIsICItIiwgZW5kX3llYXIsICIpIikNCmR5bmFtaWNfY2FwdGlvbiA8LSBwYXN0ZTAoIkNPU1QgQ29tcG91bmQgQXZlcmFnZSBHcm93dGggUmF0ZXMgQWNyb3NzIFJvbGxpbmcgUGVyaW9kcywgRGF0YXNldCAoIiwgbWluX3llYXIsICItIiwgbWF4X3llYXIsICIpIikNCg0KIyBDYWxjdWxhdGUgZHluYW1pYyB5LWF4aXMgbGltaXRzIGZvciB0aGUgcmVzdHJpY3RlZCBkYXRhDQp5X21pbiA8LSBtaW4ocmVzdHJpY3RlZF9kYXRhJENBR1JfVmFsdWUsIG5hLnJtID0gVFJVRSkNCnlfbWF4IDwtIG1heChyZXN0cmljdGVkX2RhdGEkQ0FHUl9WYWx1ZSwgbmEucm0gPSBUUlVFKQ0KDQojIENyZWF0ZSB0aGUgZmlsdGVyZWQsIHJlc3RyaWN0ZWQgeC1heGlzIHBsb3Qgd2l0aCBkeW5hbWljIHggcGxhY2VtZW50IGZvciBhbm5vdGF0aW9ucw0KcDMgPC0gZ2dwbG90KG5ydF9sb25nLCBhZXMoeCA9IGFzLmludGVnZXIoRGF0ZSksIHkgPSBDQUdSX1ZhbHVlLCBjb2xvciA9IENBR1JfUGVyaW9kKSkgKw0KDQogICMgQWRkIHNoYWRlZCBhcmVhcyBmb3IgYmFja2dyb3VuZCBlZmZlY3QNCiAgZ2VvbV9yZWN0KGFlcyh4bWluID0gLUluZiwgeG1heCA9IEluZiwgeW1pbiA9IHRhcmdldF9hZ2dyZXNzaXZlLCB5bWF4ID0gSW5mKSwgZmlsbCA9ICJsaWdodGdyZWVuIiwgYWxwaGEgPSAwLjAxMCkgKw0KICBnZW9tX3JlY3QoYWVzKHhtaW4gPSAtSW5mLCB4bWF4ID0gSW5mLCB5bWluID0gdGFyZ2V0X2NvbnNlcnZhdGl2ZSwgeW1heCA9IHRhcmdldF9hZ2dyZXNzaXZlKSwgZmlsbCA9ICJvcmFuZ2UiLCBhbHBoYSA9IDAuMDEpICsNCiAgZ2VvbV9yZWN0KGFlcyh4bWluID0gLUluZiwgeG1heCA9IEluZiwgeW1pbiA9IC1JbmYsIHltYXggPSB0YXJnZXRfY29uc2VydmF0aXZlKSwgZmlsbCA9ICJsaWdodGNvcmFsIiwgYWxwaGEgPSAwLjAxMCkgKw0KICANCiAgIyBQbG90IGxpbmVzIGZvciBlYWNoIENBR1IgUGVyaW9kDQogIGdlb21fbGluZShzaXplID0gMS4wLCBhbHBoYSA9IDMuMCkgKyAgICAgICAjIExpbmUgZm9yIGVhY2ggQ0FHUg0KICBnZW9tX3BvaW50KHNpemUgPSAxLjAsIGFscGhhID0gMy4wKSArICAgICAgICMgUG9pbnRzIGZvciBlYWNoIENBR1INCg0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSB0YXJnZXRfYWdncmVzc2l2ZSwgY29sb3IgPSAiZGFya2JsdWUiLCBsaW5ldHlwZSA9ICJzb2xpZCIpICsNCiAgIyBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSB0YXJnZXRfbW9kZXJhdGUsIGNvbG9yID0gImRhcmtibHVlIiwgbGluZXR5cGUgPSAic29saWQiKSArDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IHRhcmdldF9jb25zZXJ2YXRpdmUsIGNvbG9yID0gImRhcmtibHVlIiwgbGluZXR5cGUgPSAic29saWQiKSArDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IHRhcmdldF9pbmZsYXRpb24sIGNvbG9yID0gImRhcmtyZWQiLCBsaW5ldHlwZSA9ICJkYXNoZWQiKSArDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IGNhZ3JfdmFsdWUsIGNvbG9yID0gImRhcmtyZWQiLCBsaW5ldHlwZSA9ICJkYXNoZWQiKSArDQogIA0KICAjIER5bmFtaWMgcmlnaHQtYWxpZ25lZCBwbGFjZW1lbnQgZm9yIGFubm90YXRpb25zDQogIGFubm90YXRlKCJ0ZXh0IiwgeCA9IEluZiwgeSA9IHRhcmdldF9hZ2dyZXNzaXZlLCBsYWJlbCA9ICJBZ2dyZXNzaXZlIiwgDQogICAgICAgICAgIGhqdXN0ID0gMSwgdmp1c3QgPSAtMC41MCwgY29sb3IgPSAiZGFya2JsdWUiLCBzaXplID0gNCkgKw0KICAjIGFubm90YXRlKCJ0ZXh0IiwgeCA9IEluZiwgeSA9IHRhcmdldF9tb2RlcmF0ZSwgbGFiZWwgPSAiTW9kZXJhdGUiLCANCiAgIyAgICAgICAgIGhqdXN0ID0gMSwgdmp1c3QgPSAtMC41MCwgY29sb3IgPSAiZGFya2JsdWUiLCBzaXplID0gNCkgKw0KICBhbm5vdGF0ZSgidGV4dCIsIHggPSBJbmYsIHkgPSB0YXJnZXRfY29uc2VydmF0aXZlLCBsYWJlbCA9ICJDb25zZXJ2YXRpdmUiLCANCiAgICAgICAgICAgaGp1c3QgPSAxLCB2anVzdCA9IC0wLjUwLCBjb2xvciA9ICJkYXJrYmx1ZSIsIHNpemUgPSA0KSArDQogIGFubm90YXRlKCJ0ZXh0IiwgeCA9IEluZiwgeSA9IHRhcmdldF9pbmZsYXRpb24sIGxhYmVsID0gIkluZmxhdGlvbiIsIA0KICAgICAgICAgICBoanVzdCA9IDEsIHZqdXN0ID0gLTAuNTAsIGNvbG9yID0gImRhcmtyZWQiLCBzaXplID0gNCkgKw0KICBhbm5vdGF0ZSgidGV4dCIsIHggPSBJbmYsIHkgPSBjYWdyX3ZhbHVlLCBsYWJlbCA9ICJDQUdSIiwgDQogICAgICAgICAgIGhqdXN0ID0gMSwgdmp1c3QgPSArMS4xMCwgY29sb3IgPSAiZGFya3JlZCIsIHNpemUgPSA0KSArIA0KDQogIGxhYnMoDQogICAgdGl0bGUgPSBkeW5hbWljX3RpdGxlLA0KICAgIHggPSAiWWVhciIsDQogICAgeSA9ICJDQUdSIFZhbHVlICglKSIsDQogICAgY29sb3IgPSAiQ0FHUiBQZXJpb2QiLA0KICAgIGNhcHRpb24gPSBkeW5hbWljX2NhcHRpb24NCiAgICApICsNCiAgDQogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjdXN0b21fY29sb3JzKSArICAjIFNldCBjb2xvcnMgZm9yIGVhY2ggQ0FHUiBQZXJpb2QNCiAgY29vcmRfY2FydGVzaWFuKHlsaW0gPSBjKHlfbWluLCB5X21heCkpICsgIyBBcHBseSBkeW5hbWljIHktYXhpcyBsaW1pdHMNCiAgc2NhbGVfeF9jb250aW51b3VzKA0KICAgIGxpbWl0cyA9IGMoc3RhcnRfeWVhciwgZW5kX3llYXIgKyAyICsgMSksIA0KICAgIGJyZWFrcyA9IHNlcShsaW1pdHNfc3RhcnRfeWVhciwgbGltaXRzX2VuZF95ZWFyLCA1KQ0KICApICsgICMgUmVzdHJpY3QgJiBTZXQgTWFqb3IgeC1heGlzIGxpbmVzIGZvciBlYWNoIHllYXINCg0KICB0aGVtZV9taW5pbWFsKCkgKw0KICB0aGVtZSgNCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41LCBzaXplID0gMjApLCAgICAgICAgICMgTGFyZ2VyIHRpdGxlIGZvbnQNCiAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0KSwgICAgICAgICAgICAgICAgICAgICMgTGFyZ2VyIHgtYXhpcyBsYWJlbCBmb250DQogICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCksICAgICAgICAgICAgICAgICAgICAjIExhcmdlciB5LWF4aXMgbGFiZWwgZm9udA0KICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSwgc2l6ZSA9IDE0KSwgICMgTGFyZ2VyIHgtYXhpcyB0ZXh0DQogICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0KSwgICAgICAgICAgICAgICAgICAgICAjIExhcmdlciB5LWF4aXMgdGV4dA0KICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQpLCAgICAgICAgICAgICAgICAgICAgIyBMZWdlbmQgdGl0bGUgc2l6ZQ0KICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiksICAgICAgICAgICAgICAgICAgICAgIyBMZWdlbmQgdGV4dCBzaXplDQogICAgcGFuZWwuZ3JpZC5tYWpvciA9IGVsZW1lbnRfbGluZShsaW5ldHlwZSA9ICJkb3R0ZWQiLCBjb2xvciA9ICJibGFjayIpLCAgIyBNYWpvciBncmlkIGxpbmVzDQogICAgcGFuZWwuZ3JpZC5taW5vci54ID0gZWxlbWVudF9ibGFuaygpLCAgICAgICAgICAgICAgICAgICAgICAjIE5vIG1pbm9yIHggZ3JpZCBsaW5lcw0KICAgIGF4aXMudGlja3MubGVuZ3RoID0gdW5pdCgtMC4yNSwgImNtIiksICAgICAgICAgICAgICAgICAgICAgICMgSW5jcmVhc2UgdGljayBsZW5ndGgNCiAgICBheGlzLnRpY2tzID0gZWxlbWVudF9saW5lKGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDAuNTApLCAgICMgRGFya2VyIHRpY2tzDQogICAgYXhpcy5saW5lLnggPSBlbGVtZW50X2xpbmUoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMC43NSksICAjIERhcmsgYm90dG9tIGJvcmRlcg0KICAgIGF4aXMubGluZS55ID0gZWxlbWVudF9saW5lKGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDAuNzUpICAgIyBEYXJrIGxlZnQgYm9yZGVyDQogICkNCg0KIyBQcmludCB0aGUgcGxvdCANCnByaW50KHAzKQ0KDQpgYGANCg0KIyMjIyBTaG9ydC1UZXJtDQoNCmBgYHtyIGNvc3RfcmF3X2NhZ3JfZ3JhcGhzX3Nob3J0LCBmaWcud2lkdGg9MTAsIGZpZy5oZWlnaHQ9N30NCg0KY2F0KCJcblxuIyMjIyBDb21wb3VuZCBBdmVyYWdlIEdyb3d0aCBSYXRlcyBBY3Jvc3MgU2hvcnQtVGVybSBSb2xsaW5nIFBlcmlvZHMgXG4iKQ0KDQojIEZpbHRlciBkYXRhIGZvciBTaG9ydC1UZXJtIENBR1IgKDUtWWVhciBhbmQgMTAtWWVhcikNCnNob3J0dGVybV9kYXRhIDwtIG5ydF9sb25nICU+JQ0KICBmaWx0ZXIoQ0FHUl9QZXJpb2QgJWluJSBjKCI1LVllYXIgQ0FHUiIsICIxMC1ZZWFyIENBR1IiKSkNCg0KDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KIyMgUExPVCBGVUxMIFdJVEhPVVQgTElNSVRTDQoNCiMgRGVmaW5lIHN0YXJ0IGFuZCBlbmQgeWVhcnMNCnN0YXJ0X3llYXIgPC0gMjAwNQ0KZW5kX3llYXIgPC0gMjAyNA0KeWVhcl9yYW5nZSA8LSBlbmRfeWVhciAtIHN0YXJ0X3llYXIgKyAxICAjIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIHllYXJzDQoNCiMgRGVmaW5lIGJyZWFrcyByb3VuZGVkIGFwcHJvcHJpYXRlbHkNCmxpbWl0c19zdGFydF95ZWFyIDwtIGZsb29yKHN0YXJ0X3llYXIgLyA1KSAqIDUgICMgUm91bmQgZG93biB0byB0aGUgbmVhcmVzdCBtdWx0aXBsZSBvZiA1DQpsaW1pdHNfZW5kX3llYXIgPC0gY2VpbGluZyhlbmRfeWVhciAvIDUpICogNSAgICMgUm91bmQgdXAgdG8gdGhlIG5lYXJlc3QgbXVsdGlwbGUgb2YgNQ0KDQojIENyZWF0ZSBkeW5hbWljIHRpdGxlIGFuZCBjYXB0aW9uDQpkeW5hbWljX3RpdGxlIDwtIHBhc3RlMCgiQ0FHUiBBY3Jvc3MgU2hvcnQtVGVybSBQZXJpb2RzIE92ZXIgIix5ZWFyX3JhbmdlLCAiIFllYXJzICgiLCBzdGFydF95ZWFyLCAiLSIsIGVuZF95ZWFyLCAiKSIpDQpkeW5hbWljX2NhcHRpb24gPC0gcGFzdGUwKCJDT1NUIENvbXBvdW5kIEF2ZXJhZ2UgR3Jvd3RoIFJhdGVzIEFjcm9zcyBTaG9ydC1UZXJtIFJvbGxpbmcgUGVyaW9kcywgRGF0YXNldCAoIiwgbWluX3llYXIsICItIiwgbWF4X3llYXIsICIpIikNCg0KIyBDcmVhdGUgdGhlIGZ1bGwsIG5vbi1maWx0ZXJlZCB4LWF4aXMgcGxvdCB3aXRoIGR5bmFtaWMgeCBwbGFjZW1lbnQgZm9yIGFubm90YXRpb25zDQpwMV9zaG9ydHRlcm0gPC0gZ2dwbG90KHNob3J0dGVybV9kYXRhLCBhZXMoeCA9IGFzLmludGVnZXIoRGF0ZSksIHkgPSBDQUdSX1ZhbHVlLCBjb2xvciA9IENBR1JfUGVyaW9kKSkgKw0KDQogICMgQWRkIHNoYWRlZCBhcmVhcyBmb3IgYmFja2dyb3VuZCBlZmZlY3QNCiAgZ2VvbV9yZWN0KGFlcyh4bWluID0gLUluZiwgeG1heCA9IEluZiwgeW1pbiA9IHRhcmdldF9hZ2dyZXNzaXZlLCB5bWF4ID0gSW5mKSwgZmlsbCA9ICJsaWdodGdyZWVuIiwgYWxwaGEgPSAwLjAxMCkgKw0KICBnZW9tX3JlY3QoYWVzKHhtaW4gPSAtSW5mLCB4bWF4ID0gSW5mLCB5bWluID0gdGFyZ2V0X2NvbnNlcnZhdGl2ZSwgeW1heCA9IHRhcmdldF9hZ2dyZXNzaXZlKSwgZmlsbCA9ICJvcmFuZ2UiLCBhbHBoYSA9IDAuMDEpICsNCiAgZ2VvbV9yZWN0KGFlcyh4bWluID0gLUluZiwgeG1heCA9IEluZiwgeW1pbiA9IC1JbmYsIHltYXggPSB0YXJnZXRfY29uc2VydmF0aXZlKSwgZmlsbCA9ICJsaWdodGNvcmFsIiwgYWxwaGEgPSAwLjAxMCkgKw0KICANCiAgIyBQbG90IGxpbmVzIGZvciBlYWNoIENBR1IgUGVyaW9kDQogIGdlb21fbGluZShzaXplID0gMS4wLCBhbHBoYSA9IDMuMCkgKyAgICAgICAjIExpbmUgZm9yIGVhY2ggQ0FHUg0KICBnZW9tX3BvaW50KHNpemUgPSAxLjAsIGFscGhhID0gMy4wKSArICAgICAgICMgUG9pbnRzIGZvciBlYWNoIENBR1INCg0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSB0YXJnZXRfYWdncmVzc2l2ZSwgY29sb3IgPSAiZGFya2JsdWUiLCBsaW5ldHlwZSA9ICJzb2xpZCIpICsNCiAgIyBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSB0YXJnZXRfbW9kZXJhdGUsIGNvbG9yID0gImRhcmtibHVlIiwgbGluZXR5cGUgPSAic29saWQiKSArDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IHRhcmdldF9jb25zZXJ2YXRpdmUsIGNvbG9yID0gImRhcmtibHVlIiwgbGluZXR5cGUgPSAic29saWQiKSArDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IHRhcmdldF9pbmZsYXRpb24sIGNvbG9yID0gImRhcmtyZWQiLCBsaW5ldHlwZSA9ICJkYXNoZWQiKSArDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IGNhZ3JfdmFsdWUsIGNvbG9yID0gImRhcmtyZWQiLCBsaW5ldHlwZSA9ICJkYXNoZWQiKSArDQogIA0KICAjIER5bmFtaWMgcmlnaHQtYWxpZ25lZCBwbGFjZW1lbnQgZm9yIGFubm90YXRpb25zDQogIGFubm90YXRlKCJ0ZXh0IiwgeCA9IEluZiwgeSA9IHRhcmdldF9hZ2dyZXNzaXZlLCBsYWJlbCA9ICJBZ2dyZXNzaXZlIiwgDQogICAgICAgICAgIGhqdXN0ID0gMSwgdmp1c3QgPSAtMC41MCwgY29sb3IgPSAiZGFya2JsdWUiLCBzaXplID0gNCkgKw0KICAjIGFubm90YXRlKCJ0ZXh0IiwgeCA9IEluZiwgeSA9IHRhcmdldF9tb2RlcmF0ZSwgbGFiZWwgPSAiTW9kZXJhdGUiLCANCiAgIyAgICAgICAgIGhqdXN0ID0gMSwgdmp1c3QgPSAtMC41MCwgY29sb3IgPSAiZGFya2JsdWUiLCBzaXplID0gNCkgKw0KICBhbm5vdGF0ZSgidGV4dCIsIHggPSBJbmYsIHkgPSB0YXJnZXRfY29uc2VydmF0aXZlLCBsYWJlbCA9ICJDb25zZXJ2YXRpdmUiLA0KICAgICAgICAgICBoanVzdCA9IDEsIHZqdXN0ID0gLTAuNTAsIGNvbG9yID0gImRhcmtibHVlIiwgc2l6ZSA9IDQpICsNCiAgYW5ub3RhdGUoInRleHQiLCB4ID0gSW5mLCB5ID0gdGFyZ2V0X2luZmxhdGlvbiwgbGFiZWwgPSAiSW5mbGF0aW9uIiwgDQogICAgICAgICAgIGhqdXN0ID0gMSwgdmp1c3QgPSAtMC41MCwgY29sb3IgPSAiZGFya3JlZCIsIHNpemUgPSA0KSArDQogIGFubm90YXRlKCJ0ZXh0IiwgeCA9IEluZiwgeSA9IGNhZ3JfdmFsdWUsIGxhYmVsID0gIkNBR1IiLCANCiAgICAgICAgICAgaGp1c3QgPSAxLCB2anVzdCA9ICsxLjMwLCBjb2xvciA9ICJkYXJrcmVkIiwgc2l6ZSA9IDQpICsgDQoNCiAgbGFicygNCiAgICB0aXRsZSA9IGR5bmFtaWNfdGl0bGUsDQogICAgeCA9ICJZZWFyIiwNCiAgICB5ID0gIkNBR1IgVmFsdWUgKCUpIiwNCiAgICBjb2xvciA9ICJDQUdSIFBlcmlvZCIsDQogICAgY2FwdGlvbiA9IGR5bmFtaWNfY2FwdGlvbg0KICAgICkgKw0KICANCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGN1c3RvbV9jb2xvcnNbYygiNS1ZZWFyIENBR1IiLCAiMTAtWWVhciBDQUdSIildKSArDQogIHNjYWxlX3hfY29udGludW91cygNCiAgICBsaW1pdHMgPSBjKHN0YXJ0X3llYXIsIGVuZF95ZWFyICsgMSksIA0KICAgIGJyZWFrcyA9IHNlcShsaW1pdHNfc3RhcnRfeWVhciwgbGltaXRzX2VuZF95ZWFyICsgMSAsIDUpDQogICkgKyAgIyBSZXN0cmljdCAmIFNldCBNYWpvciB4LWF4aXMgbGluZXMgZm9yIGVhY2ggeWVhcg0KDQogIHRoZW1lX21pbmltYWwoKSArDQogIHRoZW1lKA0KICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUsIHNpemUgPSAyMCksICAgICAgICAgIyBMYXJnZXIgdGl0bGUgZm9udA0KICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQpLCAgICAgICAgICAgICAgICAgICAgIyBMYXJnZXIgeC1heGlzIGxhYmVsIGZvbnQNCiAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0KSwgICAgICAgICAgICAgICAgICAgICMgTGFyZ2VyIHktYXhpcyBsYWJlbCBmb250DQogICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxLCBzaXplID0gMTQpLCAgIyBMYXJnZXIgeC1heGlzIHRleHQNCiAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQpLCAgICAgICAgICAgICAgICAgICAgICMgTGFyZ2VyIHktYXhpcyB0ZXh0DQogICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCksICAgICAgICAgICAgICAgICAgICAjIExlZ2VuZCB0aXRsZSBzaXplDQogICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyKSwgICAgICAgICAgICAgICAgICAgICAjIExlZ2VuZCB0ZXh0IHNpemUNCiAgICBwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9saW5lKGxpbmV0eXBlID0gImRvdHRlZCIsIGNvbG9yID0gImJsYWNrIiksICAjIE1ham9yIGdyaWQgbGluZXMNCiAgICBwYW5lbC5ncmlkLm1pbm9yLnggPSBlbGVtZW50X2JsYW5rKCksICAgICAgICAgICAgICAgICAgICAgICMgTm8gbWlub3IgeCBncmlkIGxpbmVzDQogICAgYXhpcy50aWNrcy5sZW5ndGggPSB1bml0KC0wLjI1LCAiY20iKSwgICAgICAgICAgICAgICAgICAgICAgIyBJbmNyZWFzZSB0aWNrIGxlbmd0aA0KICAgIGF4aXMudGlja3MgPSBlbGVtZW50X2xpbmUoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMC41MCksICAgIyBEYXJrZXIgdGlja3MNCiAgICBheGlzLmxpbmUueCA9IGVsZW1lbnRfbGluZShjb2xvciA9ICJibGFjayIsIHNpemUgPSAwLjc1KSwgICMgRGFyayBib3R0b20gYm9yZGVyDQogICAgYXhpcy5saW5lLnkgPSBlbGVtZW50X2xpbmUoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMC43NSkgICAjIERhcmsgbGVmdCBib3JkZXINCiAgKQ0KDQojIFByaW50IHRoZSBwbG90IA0KcHJpbnQocDFfc2hvcnR0ZXJtKQ0KDQpgYGANCg0KDQoNCiMjIyMgTG9uZy1UZXJtDQoNCmBgYHtyIGNvc3RfcmF3X2NhZ3JfZ3JhcGhzX2xvbmcsIGZpZy53aWR0aD0xMCwgZmlnLmhlaWdodD03fQ0KDQpjYXQoIlxuXG4jIyMjIENvbXBvdW5kIEF2ZXJhZ2UgR3Jvd3RoIFJhdGVzIEFjcm9zcyBMb25nLVRlcm0gUm9sbGluZyBQZXJpb2RzIFxuIikNCg0KIyBGaWx0ZXIgZGF0YSBmb3IgTG9uZy1UZXJtIENBR1IgKDIwLVllYXIgYW5kIDMwLVllYXIpDQpsb25ndGVybV9kYXRhIDwtIG5ydF9sb25nICU+JQ0KICBmaWx0ZXIoQ0FHUl9QZXJpb2QgJWluJSBjKCIyMC1ZZWFyIENBR1IiLCAiMzAtWWVhciBDQUdSIikpDQoNCg0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiMjIFBMT1QgRlVMTCBXSVRIT1VUIExJTUlUUw0KDQojIERlZmluZSBzdGFydCBhbmQgZW5kIHllYXJzDQpzdGFydF95ZWFyIDwtIDIwMjANCmVuZF95ZWFyIDwtIDIwMjQNCnllYXJfcmFuZ2UgPC0gZW5kX3llYXIgLSBzdGFydF95ZWFyICsgMSAgIyBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiB5ZWFycw0KDQojIERlZmluZSBicmVha3Mgcm91bmRlZCBhcHByb3ByaWF0ZWx5DQpsaW1pdHNfc3RhcnRfeWVhciA8LSBmbG9vcihzdGFydF95ZWFyIC8gNSkgKiA1ICAjIFJvdW5kIGRvd24gdG8gdGhlIG5lYXJlc3QgbXVsdGlwbGUgb2YgNQ0KbGltaXRzX2VuZF95ZWFyIDwtIGNlaWxpbmcoZW5kX3llYXIgLyA1KSAqIDUgICAjIFJvdW5kIHVwIHRvIHRoZSBuZWFyZXN0IG11bHRpcGxlIG9mIDUNCg0KIyBDcmVhdGUgZHluYW1pYyB0aXRsZSBhbmQgY2FwdGlvbg0KZHluYW1pY190aXRsZSA8LSBwYXN0ZTAoIkNBR1IgQWNyb3NzIExvbmctVGVybSBQZXJpb2RzIE92ZXIgIix5ZWFyX3JhbmdlLCAiIFllYXJzICgiLCBzdGFydF95ZWFyLCAiLSIsIGVuZF95ZWFyLCAiKSIpDQpkeW5hbWljX2NhcHRpb24gPC0gcGFzdGUwKCJDT1NUIENvbXBvdW5kIEF2ZXJhZ2UgR3Jvd3RoIFJhdGVzIEFjcm9zcyBMb25nLVRlcm0gUm9sbGluZyBQZXJpb2RzLCBEYXRhc2V0ICgiLCBtaW5feWVhciwgIi0iLCBtYXhfeWVhciwgIikiKQ0KDQojIENyZWF0ZSB0aGUgZnVsbCwgbm9uLWZpbHRlcmVkIHgtYXhpcyBwbG90IHdpdGggZHluYW1pYyB4IHBsYWNlbWVudCBmb3IgYW5ub3RhdGlvbnMNCnAxX2xvbmd0ZXJtIDwtIGdncGxvdChsb25ndGVybV9kYXRhLCBhZXMoeCA9IGFzLmludGVnZXIoRGF0ZSksIHkgPSBDQUdSX1ZhbHVlLCBjb2xvciA9IENBR1JfUGVyaW9kKSkgKw0KDQogICMgQWRkIHNoYWRlZCBhcmVhcyBmb3IgYmFja2dyb3VuZCBlZmZlY3QNCiAgZ2VvbV9yZWN0KGFlcyh4bWluID0gLUluZiwgeG1heCA9IEluZiwgeW1pbiA9IHRhcmdldF9hZ2dyZXNzaXZlLCB5bWF4ID0gSW5mKSwgZmlsbCA9ICJsaWdodGdyZWVuIiwgYWxwaGEgPSAwLjAxMCkgKw0KICBnZW9tX3JlY3QoYWVzKHhtaW4gPSAtSW5mLCB4bWF4ID0gSW5mLCB5bWluID0gdGFyZ2V0X2NvbnNlcnZhdGl2ZSwgeW1heCA9IHRhcmdldF9hZ2dyZXNzaXZlKSwgZmlsbCA9ICJvcmFuZ2UiLCBhbHBoYSA9IDAuMDEpICsNCiAgZ2VvbV9yZWN0KGFlcyh4bWluID0gLUluZiwgeG1heCA9IEluZiwgeW1pbiA9IC1JbmYsIHltYXggPSB0YXJnZXRfY29uc2VydmF0aXZlKSwgZmlsbCA9ICJsaWdodGNvcmFsIiwgYWxwaGEgPSAwLjAxMCkgKw0KICANCiAgIyBQbG90IGxpbmVzIGZvciBlYWNoIENBR1IgUGVyaW9kDQogIGdlb21fbGluZShzaXplID0gMS4wLCBhbHBoYSA9IDMuMCkgKyAgICAgICAjIExpbmUgZm9yIGVhY2ggQ0FHUg0KICBnZW9tX3BvaW50KHNpemUgPSAxLjAsIGFscGhhID0gMy4wKSArICAgICAgICMgUG9pbnRzIGZvciBlYWNoIENBR1INCg0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSB0YXJnZXRfYWdncmVzc2l2ZSwgY29sb3IgPSAiZGFya2JsdWUiLCBsaW5ldHlwZSA9ICJzb2xpZCIpICsNCiAgIyBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSB0YXJnZXRfbW9kZXJhdGUsIGNvbG9yID0gImRhcmtibHVlIiwgbGluZXR5cGUgPSAic29saWQiKSArDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IHRhcmdldF9jb25zZXJ2YXRpdmUsIGNvbG9yID0gImRhcmtibHVlIiwgbGluZXR5cGUgPSAic29saWQiKSArDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IHRhcmdldF9pbmZsYXRpb24sIGNvbG9yID0gImRhcmtyZWQiLCBsaW5ldHlwZSA9ICJkYXNoZWQiKSArDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IGNhZ3JfdmFsdWUsIGNvbG9yID0gImRhcmtyZWQiLCBsaW5ldHlwZSA9ICJkYXNoZWQiKSArDQogIA0KICAjIER5bmFtaWMgcmlnaHQtYWxpZ25lZCBwbGFjZW1lbnQgZm9yIGFubm90YXRpb25zDQogIGFubm90YXRlKCJ0ZXh0IiwgeCA9IEluZiwgeSA9IHRhcmdldF9hZ2dyZXNzaXZlLCBsYWJlbCA9ICJBZ2dyZXNzaXZlIiwgDQogICAgICAgICAgIGhqdXN0ID0gMSwgdmp1c3QgPSAtMC41MCwgY29sb3IgPSAiZGFya2JsdWUiLCBzaXplID0gNCkgKw0KICAjIGFubm90YXRlKCJ0ZXh0IiwgeCA9IEluZiwgeSA9IHRhcmdldF9tb2RlcmF0ZSwgbGFiZWwgPSAiTW9kZXJhdGUiLCANCiAgIyAgICAgICAgIGhqdXN0ID0gMSwgdmp1c3QgPSAtMC41MCwgY29sb3IgPSAiZGFya2JsdWUiLCBzaXplID0gNCkgKw0KICBhbm5vdGF0ZSgidGV4dCIsIHggPSBJbmYsIHkgPSB0YXJnZXRfY29uc2VydmF0aXZlLCBsYWJlbCA9ICJDb25zZXJ2YXRpdmUiLCANCiAgICAgICAgICAgaGp1c3QgPSAxLCB2anVzdCA9IC0wLjUwLCBjb2xvciA9ICJkYXJrYmx1ZSIsIHNpemUgPSA0KSArDQogIGFubm90YXRlKCJ0ZXh0IiwgeCA9IEluZiwgeSA9IHRhcmdldF9pbmZsYXRpb24sIGxhYmVsID0gIkluZmxhdGlvbiIsIA0KICAgICAgICAgICBoanVzdCA9IDEsIHZqdXN0ID0gLTAuNTAsIGNvbG9yID0gImRhcmtyZWQiLCBzaXplID0gNCkgKw0KICBhbm5vdGF0ZSgidGV4dCIsIHggPSBJbmYsIHkgPSBjYWdyX3ZhbHVlLCBsYWJlbCA9ICJDQUdSIiwgDQogICAgICAgICAgIGhqdXN0ID0gMSwgdmp1c3QgPSAtMC41MCwgY29sb3IgPSAiZGFya3JlZCIsIHNpemUgPSA0KSArIA0KDQogIGxhYnMoDQogICAgdGl0bGUgPSBkeW5hbWljX3RpdGxlLA0KICAgIHggPSAiWWVhciIsDQogICAgeSA9ICJDQUdSIFZhbHVlICglKSIsDQogICAgY29sb3IgPSAiQ0FHUiBQZXJpb2QiLA0KICAgIGNhcHRpb24gPSBkeW5hbWljX2NhcHRpb24NCiAgICApICsNCiAgDQogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjdXN0b21fY29sb3JzW2MoIjIwLVllYXIgQ0FHUiIsICIzMC1ZZWFyIENBR1IiKV0pICsNCiAgc2NhbGVfeF9jb250aW51b3VzKA0KICAgIGxpbWl0cyA9IGMoc3RhcnRfeWVhciwgZW5kX3llYXIgKSwgDQogICAgYnJlYWtzID0gc2VxKGxpbWl0c19zdGFydF95ZWFyLCBsaW1pdHNfZW5kX3llYXIsIDEpDQogICkgKyAgIyBSZXN0cmljdCAmIFNldCBNYWpvciB4LWF4aXMgbGluZXMgZm9yIGVhY2ggeWVhcg0KDQogIHRoZW1lX21pbmltYWwoKSArDQogIHRoZW1lKA0KICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUsIHNpemUgPSAyMCksICAgICAgICAgIyBMYXJnZXIgdGl0bGUgZm9udA0KICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQpLCAgICAgICAgICAgICAgICAgICAgIyBMYXJnZXIgeC1heGlzIGxhYmVsIGZvbnQNCiAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0KSwgICAgICAgICAgICAgICAgICAgICMgTGFyZ2VyIHktYXhpcyBsYWJlbCBmb250DQogICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxLCBzaXplID0gMTQpLCAgIyBMYXJnZXIgeC1heGlzIHRleHQNCiAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQpLCAgICAgICAgICAgICAgICAgICAgICMgTGFyZ2VyIHktYXhpcyB0ZXh0DQogICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCksICAgICAgICAgICAgICAgICAgICAjIExlZ2VuZCB0aXRsZSBzaXplDQogICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyKSwgICAgICAgICAgICAgICAgICAgICAjIExlZ2VuZCB0ZXh0IHNpemUNCiAgICBwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9saW5lKGxpbmV0eXBlID0gImRvdHRlZCIsIGNvbG9yID0gImJsYWNrIiksICAjIE1ham9yIGdyaWQgbGluZXMNCiAgICBwYW5lbC5ncmlkLm1pbm9yLnggPSBlbGVtZW50X2JsYW5rKCksICAgICAgICAgICAgICAgICAgICAgICMgTm8gbWlub3IgeCBncmlkIGxpbmVzDQogICAgYXhpcy50aWNrcy5sZW5ndGggPSB1bml0KC0wLjI1LCAiY20iKSwgICAgICAgICAgICAgICAgICAgICAgIyBJbmNyZWFzZSB0aWNrIGxlbmd0aA0KICAgIGF4aXMudGlja3MgPSBlbGVtZW50X2xpbmUoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMC41MCksICAgIyBEYXJrZXIgdGlja3MNCiAgICBheGlzLmxpbmUueCA9IGVsZW1lbnRfbGluZShjb2xvciA9ICJibGFjayIsIHNpemUgPSAwLjc1KSwgICMgRGFyayBib3R0b20gYm9yZGVyDQogICAgYXhpcy5saW5lLnkgPSBlbGVtZW50X2xpbmUoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMC43NSkgICAjIERhcmsgbGVmdCBib3JkZXINCiAgKQ0KDQojIFByaW50IHRoZSBwbG90IA0KcHJpbnQocDFfbG9uZ3Rlcm0pDQoNCg0KYGBgDQoNCiMgVlRJIA0KDQpUaGUgVmFuZ3VhcmQgVG90YWwgU3RvY2sgTWFya2V0IEVURiAoVlRJKSBpcyBhbiBleGNoYW5nZS10cmFkZWQgZnVuZCAoRVRGKSB0aGF0IGFpbXMgdG8gdHJhY2sgdGhlIHBlcmZvcm1hbmNlIG9mIHRoZSBDUlNQIFVTIFRvdGFsIE1hcmtldCBJbmRleCwgcmVwcmVzZW50aW5nIHRoZSBlbnRpcmUgVS5TLiBzdG9jayBtYXJrZXQuIEVzdGFibGlzaGVkIGFuZCBtYW5hZ2VkIGJ5IFZhbmd1YXJkLCBWVEkgcHJvdmlkZXMgYnJvYWQgZXhwb3N1cmUgdG8gbGFyZ2UtY2FwLCBtaWQtY2FwLCBzbWFsbC1jYXAsIGFuZCBtaWNyby1jYXAgc3RvY2tzLCBzcGFubmluZyB2YXJpb3VzIHNlY3RvcnMsIGluY2x1ZGluZyB0ZWNobm9sb2d5LCBoZWFsdGhjYXJlLCBmaW5hbmNpYWxzLCBhbmQgY29uc3VtZXIgZ29vZHMuDQoNClZUSSBpcyBvbmUgb2YgdGhlIG1vc3QgcG9wdWxhciBFVEZzIGFtb25nIGludmVzdG9ycyBkdWUgdG8gaXRzIGxvdyBleHBlbnNlIHJhdGlvLCBoaWdoIGRpdmVyc2lmaWNhdGlvbiwgYW5kIHRheCBlZmZpY2llbmN5LiBJdCBpbmNsdWRlcyB0aG91c2FuZHMgb2YgcHVibGljbHkgdHJhZGVkIGNvbXBhbmllcywgb2ZmZXJpbmcgYSBjb21wcmVoZW5zaXZlIHdheSB0byBpbnZlc3QgaW4gdGhlIG92ZXJhbGwgVS5TLiBlcXVpdHkgbWFya2V0LiBWYW5ndWFyZCBpcyBmYXZvcmVkIGZvciBpdHMgY29zdC1lZmZlY3RpdmUgaW52ZXN0bWVudCBvcHRpb25zIGFuZCBwYXNzaXZlIG1hbmFnZW1lbnQNCg0KIyMgVlRJIEdSDQoNCiMjIyBEYXRhDQoNClRoZSBWVEkgRGF0YSBwcmVzZW50ZWQgaGVyZSBpcyBzb3VyY2VkIGZyb20gWWFob28gRmluYW5jZSwgZmlsdGVyZWQgdG8gZGlzcGxheSBNb250aGx5IEhpc3RvcmljYWwgRGF0YSAoZS5nLiwgMDMvMDEvMjAyNCkuIFRoaXMgZGF0YSByZXByZXNlbnRzIHRoZSBjbG9zaW5nIHByaWNlIG9mIHRoZSBsYXN0IHRyYWRpbmcgZGF5IG9mIGVhY2ggbW9udGggKGUuZy4sIDAzLzI4LzIwMjQpLiBQbGVhc2Ugbm90ZSB0aGF0IHRoZSBzdGF0aXN0aWNzIHByZXNlbnRlZCBoZXJlIG1heSBkaWZmZXIgZnJvbSB0aG9zZSBpbiBZYWhvbyBGaW5hbmNlJ3MgUGVyZm9ybWFuY2Ugc2VjdGlvbiBkdWUgdG8gZGlmZmVyZW5jZXMgaW4gZGF0YSBhZ2dyZWdhdGlvbiBhbmQgY2FsY3VsYXRpb24gbWV0aG9kcy4gIA0KDQpEYXRhIFNvdXJjZTogYHIgbnJ2JHNvdXJjZV92dGlfeWFob29gDQoNCmBgYHtyIHZ0aV9yYXcsIGV2YWw9VFJVRSwgZWNobz1GQUxTRX0NCg0KIyBEaXNwbGF5IHRoZSBzdHJ1Y3R1cmUgb2YgdGhlIGRhdGFzZXQgdG8gY29uZmlybSBjb2x1bW4gbmFtZXMNCmludGVyYWN0aXZlX3N0cihucnQkdnRpX3JhdykNCg0KbGlicmFyeShkcGx5cikNCmxpYnJhcnkobHVicmlkYXRlKSAgIyBGb3IgZGF0ZSBtYW5pcHVsYXRpb24NCmxpYnJhcnkoc2NhbGVzKQ0KbGlicmFyeShzdHJpbmdyKQ0KDQojIEVuc3VyZSB0aGUgJ0RhdGUnIGNvbHVtbiBpcyBvZiBEYXRlIGNsYXNzDQp2dGlfcmF3IDwtIG5ydCR2dGlfcmF3ICU+JQ0KICBtdXRhdGUoRGF0ZSA9IGFzLkRhdGUoRGF0ZSwgZm9ybWF0ID0gIiVZLSVtLSVkIikpDQoNCiMgRmluZCB0aGUgbWluaW11bSBhbmQgbWF4aW11bSB5ZWFyDQptaW5feWVhciA8LSBmb3JtYXQobWluKHZ0aV9yYXckRGF0ZSwgbmEucm0gPSBUUlVFKSwgIiVZIikNCm1heF95ZWFyIDwtIGZvcm1hdChtYXgodnRpX3JhdyREYXRlLCBuYS5ybSA9IFRSVUUpLCAiJVkiKQ0KaW50ZXJhY3RpdmVfcHJpbnQobWluX3llYXIpDQppbnRlcmFjdGl2ZV9wcmludChtYXhfeWVhcikNCg0KIyBVcGRhdGUgZGF0YSBmcmFtZSB3aXRoIHByb3BlciBkYXRlIGFuZCBwZXJjZW50YWdlIGhhbmRsaW5nDQp2dGlfcmF3IDwtIHZ0aV9yYXcgJT4lDQogIG11dGF0ZSgNCiAgICAjIENvbnZlcnQgQ2xvc2UgRGF0ZSB0byAiWVlZWS1NTS1ERCIgZm9ybWF0DQogICAgYERhdGVgID0gZm9ybWF0KGFzLkRhdGUoYXMuY2hhcmFjdGVyKGBEYXRlYCksIG9yaWdpbiA9ICIxOTcwLTAxLTAxIiksICIlWS0lbS0lZCIpLA0KDQogICAgIyBFbnN1cmUgQ2xvc2UgaXMgYSBudW1iZXIgZm9ybWF0dGVkIHRvIDIgZGVjaW1hbCBwbGFjZXMNCiAgICBgQ2xvc2VgID0gbnVtYmVyKGFzLm51bWVyaWMoZ3N1YigiLCIsICIiLCBDbG9zZSkpLCBiaWcubWFyayA9ICIsIiwgZGVjaW1hbC5tYXJrID0gIi4iLCBhY2N1cmFjeSA9IDAuMDEpLA0KDQogICAgIyBDbGVhbiBhbmQgaGFuZGxlIHBlcmNlbnRhZ2UgY29sdW1ucw0KICAgIGFjcm9zcygzOjMsIH4gew0KICAgICAgdmFsdWUgPC0gZ3N1YigiWywlXFxzXSIsICIiLCAuKSAgIyBSZW1vdmUgJSwgY29tbWFzLCBhbmQgc3BhY2VzDQogICAgICBudW1lcmljX3ZhbHVlIDwtIHN1cHByZXNzV2FybmluZ3MoYXMubnVtZXJpYyh2YWx1ZSkpICAjIENvbnZlcnQgdG8gbnVtZXJpYw0KICAgICAgaWZlbHNlKA0KICAgICAgICAhaXMubmEobnVtZXJpY192YWx1ZSksIA0KICAgICAgICBwYXN0ZTAoZm9ybWF0KHJvdW5kKG51bWVyaWNfdmFsdWUqMTAwLCAyKSwgYmlnLm1hcmsgPSAiLCIsIHNjaWVudGlmaWMgPSBGQUxTRSksICIlIiksICAjIEZvcm1hdCB0byAyIGRlY2ltYWwgcGxhY2VzIGFuZCBhZGQgY29tbWFzDQogICAgICAgIC4NCiAgICAgICkNCiAgICB9KQ0KICApICU+JQ0KICBhcnJhbmdlKGRlc2MoYERhdGVgKSkgICMgU29ydCBieSBEYXRlIGZyb20gbmV3ZXN0IHRvIG9sZGVzdA0KDQojIERpc3BsYXkgdGhlIGZvcm1hdHRlZCBkYXRhDQppbnRlcmFjdGl2ZV9zdHIodnRpX3JhdykNCmludGVyYWN0aXZlX3ByaW50KHZ0aV9yYXcpDQoNCiMgRGlzcGxheSB0aGUgdGFibGUgd2l0aCBjYXB0aW9uDQpjYXQoIlxuXG4jIyMjIFZUSSBZZWFybHkgUGVyZm9ybWFuY2UgKCIsIG1pbl95ZWFyLCAiLSIsIG1heF95ZWFyLCAiKVxuIiwgc2VwID0gIiIpDQpmb3JtYXRfZXF1YWxfd2lkdGhfZ3JvdXBlZCh2dGlfcmF3LCBncm91cGluZ19mYWN0b3IgPSAyKQ0KIyBjYXQoIlxuXG4gU291cmNlOiAiLCBucnYkc291cmNlX3Z0aV95YWhvbywgIlxuIikNCg0KYGBgDQoNCiMjIyBTdW1tYXJ5DQoNCmBgYHtyIHZ0aV9yYXdfc3VtbWFyeSwgZXZhbD1UUlVFLCBlY2hvPUZBTFNFfQ0KDQojIExvYWQgbmVjZXNzYXJ5IGxpYnJhcmllcw0KbGlicmFyeShkcGx5cikNCmxpYnJhcnkodGliYmxlKQ0KbGlicmFyeShrbml0cikNCmxpYnJhcnkoa2FibGVFeHRyYSkNCg0KaW50ZXJhY3RpdmVfc3RyKHZ0aV9yYXcpDQppbnRlcmFjdGl2ZV9wcmludCh2dGlfcmF3KQ0KDQojIEVuc3VyZSB0aGUgRGF0ZSBjb2x1bW4gaXMgYSBwcm9wZXIgRGF0ZSBvYmplY3QgYW5kIGV4dHJhY3QgdGhlIHllYXINCnZ0aV9yYXcgPC0gdnRpX3JhdyAlPiUNCiAgc2xpY2UoLTEpICU+JSAjIFJlbW92ZSB0aGUgZmlyc3Qgcm93DQogICMgbXV0YXRlKERhdGUgPSBpZmVsc2Uocm93X251bWJlcigpID09IDEsICIyMDI1LTAxLTAxIiwgRGF0ZSkpICU+JQ0KICBtdXRhdGUoDQogICAgRGF0ZSA9IGFzLm51bWVyaWMoZm9ybWF0KGFzLkRhdGUoRGF0ZSwgZm9ybWF0ID0gIiVZLSVtLSVkIiksICIlWSIpKSwNCiAgICBgMS1ZZWFyIENBR1JgID0gYXMubnVtZXJpYyhnc3ViKCJbXjAtOS4tXSIsICIiLCBgMS1ZZWFyIENBR1JgKSkNCiAgKQ0KDQojIFNvcnQgZGF0YSBieSBEYXRlIGluIGFzY2VuZGluZyBvcmRlcg0KdnRpX3JhdyA8LSB2dGlfcmF3ICU+JQ0KICBhcnJhbmdlKERhdGUpDQoNCg0KIyBDYWxjdWxhdGUgdGhlIENBR1IgYW5kIGR5bmFtaWNhbGx5IGNyZWF0ZSBhIHZhcmlhYmxlIG5hbWUgd2l0aCB0aGUgZm9ybWF0IHZ0aV9jYWdyX3ZhbHVlX3M8bWluX3llYXI+X2U8bWF4X3llYXI+DQppbml0aWFsX3ZhbHVlIDwtIDEwMCAgIyBBc3N1bWluZyBhbiBpbml0aWFsIGluZGV4IHZhbHVlIG9mIDEwMA0KZmluYWxfdmFsdWUgPC0gaW5pdGlhbF92YWx1ZSAqIHByb2QoMSArIHZ0aV9yYXckYDEtWWVhciBDQUdSYCAvIDEwMCwgbmEucm0gPSBUUlVFKQ0KbWluX3llYXIgPC0gbWluKHZ0aV9yYXckRGF0ZSwgbmEucm0gPSBUUlVFKQ0KbWF4X3llYXIgPC0gbWF4KHZ0aV9yYXckRGF0ZSwgbmEucm0gPSBUUlVFKQ0KbnVtX3llYXJzIDwtIG1heF95ZWFyIC0gbWluX3llYXINCmNhZ3JfdmFsdWUgPC0gcm91bmQoKChmaW5hbF92YWx1ZSAvIGluaXRpYWxfdmFsdWUpXigxIC8gbnVtX3llYXJzKSAtIDEpICogMTAwLCAyKQ0KdmFyX25hbWUgPC0gcGFzdGUwKCJ2dGlfY2Fncl92YWx1ZV9zIiwgbWluX3llYXIsICJfZSIsIG1heF95ZWFyKQ0KYXNzaWduKHZhcl9uYW1lLCBjYWdyX3ZhbHVlKQ0KDQojIENvbnZlcnQgVlRJIGRhdGEgdG8gbnVtZXJpYywgcmVtb3ZpbmcgYW55IHBlcmNlbnRhZ2Ugc2lnbnMNCmRhdGEgPC0gYXMubnVtZXJpYyhnc3ViKCIlIiwgIiIsIHZ0aV9yYXckYDEtWWVhciBDQUdSYCkpDQoNCiMgQ2FsY3VsYXRlIHN0YXRpc3RpY3MNCmNvdW50X29ic2VydmF0aW9ucyA8LSBzdW0oIWlzLm5hKGRhdGEpKQ0KbWVhbl92YWx1ZSA8LSByb3VuZChtZWFuKGRhdGEsIG5hLnJtID0gVFJVRSksIDIpDQptZWRpYW5fdmFsdWUgPC0gcm91bmQobWVkaWFuKGRhdGEsIG5hLnJtID0gVFJVRSksIDIpDQpzZF92YWx1ZSA8LSByb3VuZChzZChkYXRhLCBuYS5ybSA9IFRSVUUpLCAyKQ0KbWluX2NhZ3JfcmFuZ2UgPC0gcm91bmQoY2Fncl92YWx1ZSAtIHNkX3ZhbHVlLCAyKQ0KbWF4X2NhZ3JfcmFuZ2UgPC0gcm91bmQoY2Fncl92YWx1ZSArIHNkX3ZhbHVlLCAyKQ0KbWluX3ZhbHVlIDwtIHJvdW5kKG1pbihkYXRhLCBuYS5ybSA9IFRSVUUpLCAyKQ0KbWF4X3ZhbHVlIDwtIHJvdW5kKG1heChkYXRhLCBuYS5ybSA9IFRSVUUpLCAyKQ0KDQojIFRhcmdldCBSYXRlIEFuYWx5c2lzIC0gUmVmZXIgdG8gIlByZWZlcnJlZCBUYXJnZXRzIiBvciBpbmNsdWRlIGJlbG93IGZvciBpbmRpdmlkdWFsIGNoYW5nZXMuDQphYm92ZV90YXJnZXRfaW5mbGF0aW9uIDwtIHN1bShkYXRhID49IHRhcmdldF9pbmZsYXRpb24sIG5hLnJtID0gVFJVRSkNCmFib3ZlX3RhcmdldF9jb25zZXJ2YXRpdmUgPC0gc3VtKGRhdGEgPj0gdGFyZ2V0X2NvbnNlcnZhdGl2ZSwgbmEucm0gPSBUUlVFKQ0KYWJvdmVfdGFyZ2V0X21vZGVyYXRlIDwtIHN1bShkYXRhID49IHRhcmdldF9tb2RlcmF0ZSwgbmEucm0gPSBUUlVFKQ0KYWJvdmVfdGFyZ2V0X2FnZ3Jlc3NpdmUgPC0gc3VtKGRhdGEgPj0gdGFyZ2V0X2FnZ3Jlc3NpdmUsIG5hLnJtID0gVFJVRSkNCg0KcGVyY2VudF9hYm92ZV90YXJnZXRfY29uc2VydmF0aXZlIDwtIHJvdW5kKChhYm92ZV90YXJnZXRfY29uc2VydmF0aXZlIC8gY291bnRfb2JzZXJ2YXRpb25zKSAqIDEwMCwgMikNCnBlcmNlbnRfYWJvdmVfdGFyZ2V0X2luZmxhdGlvbiA8LSByb3VuZCgoYWJvdmVfdGFyZ2V0X2luZmxhdGlvbiAvIGNvdW50X29ic2VydmF0aW9ucykgKiAxMDAsIDIpDQpwZXJjZW50X2Fib3ZlX3RhcmdldF9tb2RlcmF0ZSA8LSByb3VuZCgoYWJvdmVfdGFyZ2V0X21vZGVyYXRlIC8gY291bnRfb2JzZXJ2YXRpb25zKSAqIDEwMCwgMikNCnBlcmNlbnRfYWJvdmVfdGFyZ2V0X2FnZ3Jlc3NpdmUgPC0gcm91bmQoKGFib3ZlX3RhcmdldF9hZ2dyZXNzaXZlIC8gY291bnRfb2JzZXJ2YXRpb25zKSAqIDEwMCwgMikNCg0KIyBDb21waWxlIHN0YXRpc3RpY3MgaW50byBhIGxpc3QgZm9yIGVhc3kgY29udmVyc2lvbiB0byBhIGRhdGEgZnJhbWUgd2l0aCBkZWZpbml0aW9ucw0KdnRpX3Jhd19zdW1tYXJ5IDwtIHRyaWJibGUoDQogIH5TdGF0aXN0aWMsIH5WYWx1ZSwgfkRlZmluaXRpb24sDQogICJDb3VudCBvZiBPYnNlcnZhdGlvbnMiLCBhcy5jaGFyYWN0ZXIoY291bnRfb2JzZXJ2YXRpb25zKSwgIlRvdGFsIG51bWJlciBvZiBkYXRhIHBvaW50cyBjb2xsZWN0ZWQgb3ZlciB0aGUgc3BlY2lmaWMgcGVyaW9kLiIsDQogICJDQUdSIiwgcGFzdGUwKGNhZ3JfdmFsdWUsICIlIiksICJDb21wb3VuZCBBdmVyYWdlIEdyb3d0aCBSYXRlOyBtZWFuIGdyb3d0aCByYXRlIG92ZXIgYSBwZXJpb2QgaWYgaXQgaGFkIGNvbXBvdW5kZWQgYW51YWxseS4iLA0KICAiTWVhbiIsIHBhc3RlMChtZWFuX3ZhbHVlLCAiJSIpLCAiUmVmbGVjdHMgdGhlIGdlbmVyYWwgcHJpY2UgbGV2ZWwgYW5kIG92ZXJhbGwgZ3Jvd3RoIHJhdGUuIiwNCiAgIk1lZGlhbiIsIHBhc3RlMChtZWRpYW5fdmFsdWUsICIlIiksICJNaWRkbGUgdmFsdWUgb2YgdGhlIGRhdGEgd2hlbiBvcmRlcmVkIGNocm9ub2xvZ2ljYWxseTsgY2VudHJhbCB0ZW5kZW5jeSBtZWFzdXJlIGxlc3MgYWZmZWN0ZWQgYnkgZXh0cmVtZSB2YWx1ZXMuIiwNCiAgIlN0YW5kYXJkIERldmlhdGlvbiAoVm9sYXRpbGl0eSkiLCBwYXN0ZTAoc2RfdmFsdWUsICIlIiksICJUaGUgZGlzcGVyc2lvbiBvZiB2YWx1ZXMgZnJvbSB0aGUgbWVhbiwgaW5kaWNhdGluZyB0aGUgdm9sYXRpbGl0eSBvZiBwcmljZSBjaGFuZ2VzIGFuZCBlY29ub21pYyBzdGFiaWxpdHkuIiwNCiAgIk1pbiBDQUdSIFJhbmdlIChDQUdSIC0gU0QpIiwgcGFzdGUwKG1pbl9jYWdyX3JhbmdlLCAiJSIpLCAiTG93ZXIgYm91bmRhcnkgb2YgZXhwZWN0ZWQgVlRJIHJhbmdlOyBsb3dlc3QgZXN0aW1hdGUgb2YgdHlwaWNhbCBncm93dGggcmF0ZSBjb25zaWRlcmluZyBub3JtYWwgZmx1Y3R1YXRpb25zLiIsDQogICJNYXggQ0FHUiBSYW5nZSAoQ0FHUiArIFNEKSIsIHBhc3RlMChtYXhfY2Fncl9yYW5nZSwgIiUiKSwgIlVwcGVyIGJvdW5kYXJ5IG9mIGV4cGVjdGVkIFZUSSByYW5nZTsgaGlnaGVzdCBlc3RpbWF0ZSBvZiB0eXBpY2FsIGdyb3d0aCByYXRlIGNvbnNpZGVyaW5nIG5vcm1hbCBmbHVjdHVhdGlvbnMuIiwNCiAgIk1pbmltdW0iLCBwYXN0ZTAobWluX3ZhbHVlLCAiJSIpLCAiTG93ZXN0IGdyb3d0aCByYXRlLiIsDQogICJNYXhpbXVtIiwgcGFzdGUwKG1heF92YWx1ZSwgIiUiKSwgIkhpZ2hlc3QgZ3Jvd3RoIHJhdGUuIiwNCiAgIlBlcmNlbnQgQWJvdmUgSW5mbGF0aW9uIFRhcmdldCIsIHBhc3RlMChwZXJjZW50X2Fib3ZlX3RhcmdldF9pbmZsYXRpb24sICIlIiksICJQZXJjZW50YWdlIG9mIHZhbHVlcyBhYm92ZSB0aGUgaW5mbGF0aW9uIHRhcmdldCBzcGVjaWZpZWQgaW4gUHJlZmVycmVkIFRhcmdldHMgc2VjdGlvbi4iLA0KICAiUGVyY2VudCBBYm92ZSBDb25zZXJ2YXRpdmUgVGFyZ2V0IiwgcGFzdGUwKHBlcmNlbnRfYWJvdmVfdGFyZ2V0X2NvbnNlcnZhdGl2ZSwgIiUiKSwgIlBlcmNlbnRhZ2Ugb2YgdmFsdWVzIGFib3ZlIHRoZSBjb25zZXJ2YXRpdmUgdGFyZ2V0IHNwZWNpZmllZCBpbiBQcmVmZXJyZWQgVGFyZ2V0cyBzZWN0aW9uLiIsDQogICJQZXJjZW50IEFib3ZlIE1vZGVyYXRlIFRhcmdldCIsIHBhc3RlMChwZXJjZW50X2Fib3ZlX3RhcmdldF9tb2RlcmF0ZSwgIiUiKSwgIlBlcmNlbnRhZ2Ugb2YgdmFsdWVzIGFib3ZlIHRoZSBtb2RlcmF0ZSB0YXJnZXQgc3BlY2lmaWVkIGluIFByZWZlcnJlZCBUYXJnZXRzIHNlY3Rpb24uIiwNCiAgIlBlcmNlbnQgQWJvdmUgQWdncmVzc2l2ZSBUYXJnZXQiLCBwYXN0ZTAocGVyY2VudF9hYm92ZV90YXJnZXRfYWdncmVzc2l2ZSwgIiUiKSwgIlBlcmNlbnRhZ2Ugb2YgdmFsdWVzIGFib3ZlIHRoZSBhZ2dyZXNzaXZlIHRhcmdldCBzcGVjaWZpZWQgaW4gUHJlZmVycmVkIFRhcmdldHMgc2VjdGlvbi4iDQopDQoNCiMgQ29udmVydCB0byBjaGFyYWN0ZXIgdG8gYXZvaWQgYXV0b21hdGljIGRlY2ltYWwgcG9pbnRzIG9uIHdob2xlIG51bWJlcnMNCnZ0aV9yYXdfc3VtbWFyeSA8LSB2dGlfcmF3X3N1bW1hcnkgJT4lDQogIG11dGF0ZShhY3Jvc3MoZXZlcnl0aGluZygpLCBhcy5jaGFyYWN0ZXIpKQ0KDQojIERpc3BsYXkgZm9ybWF0dGVkIHRhYmxlDQpjYXQoIlxuXG4jIyMjIEFubnVhbCBHcm93dGggUmF0ZSBTdW1tYXJ5ICgiLCBtaW5feWVhciwgIi0iLCBtYXhfeWVhciwgIilcbiIsIHNlcCA9ICIiKQ0KZm9ybWF0XzNjb2xfY3VzdG9tX3dpZHRocyh2dGlfcmF3X3N1bW1hcnksIGNvbDFfd2lkdGggPSAiMjBlbSIsIGNvbDJfd2lkdGggPSAiMTBlbSIsIGNvbDNfd2lkdGggPSAiNDBlbSIpIA0KDQojIFZpZXcodnRpX3Jhd19zdW1tYXJ5KQ0KaW50ZXJhY3RpdmVfc3RyKHZ0aV9yYXdfc3VtbWFyeSkNCg0KYGBgDQoNClZUSSdzIEluZGV4IGV4aGliaXRzIGEgYHIgaWYoY2Fncl92YWx1ZSA+IHRhcmdldF9hZ2dyZXNzaXZlKSAiYWdncmVzc2l2ZSIgZWxzZSBpZihjYWdyX3ZhbHVlID4gdGFyZ2V0X21vZGVyYXRlKSAibW9kZXJhdGUiIGVsc2UgaWYoY2Fncl92YWx1ZSA+IHRhcmdldF9jb25zZXJ2YXRpdmUpICJjb25zZXJ2YXRpdmUiIGVsc2UgaWYoY2Fncl92YWx1ZSA+IHRhcmdldF9pbmZsYXRpb24pICJiYXNlbGluZSIgZWxzZSAiZGlzYXBwb2ludGluZyJgIENBR1IgYXQgYHIgY2Fncl92YWx1ZWAlLCBgciBpZihjYWdyX3ZhbHVlIDwgbWVhbl92YWx1ZSkgImxvd2VyIHRoYW4iIGVsc2UgImhpZ2hlciB0aGFuImAgdGhlIG1lYW4gZ3Jvd3RoIHJhdGUgb2YgYHIgbWVhbl92YWx1ZWAlLCByZWZsZWN0aW5nIHRoZSBpbXBhY3Qgb2Ygc2hvcnQtdGVybSB2b2xhdGlsaXR5IGFuZCBgciBpZihjYWdyX3ZhbHVlID4gbWVhbl92YWx1ZSkgImRlY2xpbmVzIiBlbHNlICJncm93dGggc3Bpa2VzImAuIFRoZSBtZWRpYW4gcmV0dXJuIG9mIGByIG1lZGlhbl92YWx1ZWAlIGluZGljYXRlcyB0aGF0IG1vcmUgdGhhbiBoYWxmIG9mIHRoZSBvYnNlcnZlZCB5ZWFycyBleHBlcmllbmNlZCByZXR1cm5zIGByIGlmKGNhZ3JfdmFsdWUgPCBtZWRpYW5fdmFsdWUpICJhYm92ZSIgZWxzZSAiYmVsb3ciYCB0aGUgbWVhbi4gVGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHRoZSBDQUdSIGFuZCB0aGUgbWVkaWFuIGdyb3d0aCByYXRlIHN1Z2dlc3RzIHRoYXQgc3VzdGFpbmVkIHBlcmlvZHMgb2YgYWJvdmUtbWVkaWFuIGdyb3d0aCBoYXZlIGV4ZXJ0ZWQgY3VtdWxhdGl2ZSBgciBpZihjYWdyX3ZhbHVlIDwgbWVkaWFuX3ZhbHVlKSAidXB3YXJkIHByZXNzdXJlIiBlbHNlICJkb3dud2FyZCBwcmVzc3VyZSJgIG9uIG92ZXJhbGwgcHJpY2UgbGV2ZWxzLiBUaGlzIHJlbGF0aW9uc2hpcCBoaWdobGlnaHRzIGEgZGlzdHJpYnV0aW9uIHdpdGggbm90YWJsZSBleHRyZW1lcyBvbiB0aGUgYHIgaWYoY2Fncl92YWx1ZSA8IG1lYW5fdmFsdWUpICJoaWdoZXIiIGVsc2UgImxvd2VyImAgZW5kLCByZWZsZWN0aW5nIGByIGlmKGNhZ3JfdmFsdWUgPCBtZWFuX3ZhbHVlKSAicG9zaXRpdmUiIGVsc2UgIm5lZ2F0aXZlImAgc2tld25lc3MuIFRoaXMgYHIgaWYoY2Fncl92YWx1ZSA8IG1lZGlhbl92YWx1ZSkgInBvc2l0aXZlIiBlbHNlICJuZWdhdGl2ZSJgIHNrZXduZXNzIGltcGxpZXMgdGhhdCB3aGlsZSBtb3JlIHRoYW4gaGFsZiBvZiB0aGUgb2JzZXJ2ZWQgeWVhcnMgZXhwZXJpZW5jZWQgcmV0dXJucyBgciBpZihjYWdyX3ZhbHVlIDwgbWVkaWFuX3ZhbHVlKSAiYWJvdmUgdGhlIG1lYW4sIGRvd250dXJucyBjYW4gYmUgc2V2ZXJlIiBlbHNlICJiZWxvdyB0aGUgbWVhbiwgdXB0dXJucyBjYW4gYmUgc2lnbmlmaWNhbnQiYC4gSG93ZXZlciwgdGhlIG1hcmtldCBoYXMgaGlzdG9yaWNhbGx5IHByb3ZpZGVkIHN1YnN0YW50aWFsIGByIGlmKGNhZ3JfdmFsdWUgPCBtZWRpYW5fdmFsdWUpICJ1cHNpZGUgcG90ZW50aWFsIiBlbHNlICJkb3duc2lkZSByaXNrImAuIEFkZGl0aW9uYWxseSwgdGhlIGZhY3QgdGhhdCBgciBwZXJjZW50X2Fib3ZlX3RhcmdldF9pbmZsYXRpb25gJSBvZiB0aGUgeWVhcnMgZXhjZWVkZWQgdGhlIGluZmxhdGlvbiB0YXJnZXQgYHIgaWYgKHBlcmNlbnRfYWJvdmVfdGFyZ2V0X2luZmxhdGlvbiA+IDcwKSAicmVpbmZvcmNlcyBWVEkncyBlZmZlY3RpdmVuZXNzIGFzIGEgc3Ryb25nIGxvbmctdGVybSBoZWRnZSIgZWxzZSBpZiAocGVyY2VudF9hYm92ZV90YXJnZXRfaW5mbGF0aW9uID4gNjApICJyZWluZm9yY2VzIFZUSSdzIGVmZmVjdGl2ZW5lc3MgYXMgYSBsb25nLXRlcm0gaGVkZ2UiIGVsc2UgaWYgKHBlcmNlbnRfYWJvdmVfdGFyZ2V0X2luZmxhdGlvbiA+IDUwKSAicXVlc3Rpb25zIFZUSSdzIGVmZmVjdGl2ZW5lc3MgIGFzIGEgbG9uZy10ZXJtIGhlZGdlIiBlbHNlICJ1bmRlcm1pbmVzIFZUSSdzIGVmZmVjdGl2ZW5lc3MgYXMgYSBsb25nLXRlcm0gaGVkZ2UiYCBhZ2FpbnN0IGluZmxhdGlvbi4NCg0KVGhlIHN0YW5kYXJkIGRldmlhdGlvbiBvZiBgciBzZF92YWx1ZWAlIGByIGlmKHNkX3ZhbHVlID4gMjApICJpbmRpY2F0ZXMgZXh0cmVtZSB2b2xhdGlsaXR5LCByZWZsZWN0aW5nIHN1YnN0YW50aWFsIGZsdWN0dWF0aW9ucyBpbiBlcXVpdHkgbWFya2V0cyIgZWxzZSBpZihzZF92YWx1ZSA+IDE1KSAidW5kZXJzY29yZXMgc2lnbmlmaWNhbnQgdm9sYXRpbGl0eSwgYSBjb21tb24gZmVhdHVyZSBvZiBlcXVpdHkgbWFya2V0cyIgZWxzZSAic3VnZ2VzdHMgbW9kZXJhdGUgdm9sYXRpbGl0eSwgdHlwaWNhbCBvZiByZWxhdGl2ZWx5IHN0YWJsZSBtYXJrZXRzImAuIFRoZSBgciByYW5nZV9yYXRpbyA8LSAobWF4X3ZhbHVlIC0gbWluX3ZhbHVlKSAvIHNkX3ZhbHVlOyBpZihyYW5nZV9yYXRpbyA+IDUpICJoaWdobHkgdm9sYXRpbGUiIGVsc2UgaWYocmFuZ2VfcmF0aW8gPiAzKSAibm90YWJsZSIgZWxzZSAiY29tcGFyYXRpdmVseSBzdGFibGUiYCByYW5nZSBvZiBhbm51YWwgcmV0dXJucywgc3Bhbm5pbmcgZnJvbSBgciBtaW5fdmFsdWVgJSB0byBgciBtYXhfdmFsdWVgJSwgYHIgaWYocmFuZ2VfcmF0aW8gPiA1KSAiaWxsdXN0cmF0ZXMgYSBoaWdobHkgdm9sYXRpbGUgbWFya2V0IGVudmlyb25tZW50LCBwYXJ0bHkgZHVlIHRvIGl0cyBjb21wb3NpdGlvbiwgd2l0aCB0aGUgcG90ZW50aWFsIGZvciBib3RoIGV4dHJlbWUgZ2FpbnMgYW5kIGxvc3NlcyIgZWxzZSBpZihyYW5nZV9yYXRpbyA+IDMpICJoaWdobGlnaHRzIG5vdGFibGUgbWFya2V0IHZhcmlhYmlsaXR5LCBwYXJ0bHkgZHVlIHRvIGl0cyBjb21wb3NpdGlvbiwgIHJlZmxlY3RpbmcgYm90aCBvcHBvcnR1bml0aWVzIGFuZCByaXNrcyIgZWxzZSAiaW5kaWNhdGVzIGEgY29tcGFyYXRpdmVseSBzdGFibGUgbWFya2V0LCBwYXJ0bHkgZHVlIHRvIGl0cyBjb21wb3NpdGlvbiwgd2l0aCBsZXNzIGV4dHJlbWUgYW5udWFsIGZsdWN0dWF0aW9ucyJgLiANCg0KRm9yIFZUSSB0byBiZSBjb25zaWRlcmVkIGEgaGlnaC1wZXJmb3JtaW5nIGFuZCByZXNpbGllbnQgbG9uZy10ZXJtIGludmVzdG1lbnQsIGl0IHdvdWxkIGJlIGlkZWFsIHRvIGV4Y2VlZCB0aGUgYWdncmVzc2l2ZSB0YXJnZXQgIChlLmcuLCBgciAodGFyZ2V0X2FnZ3Jlc3NpdmUgLSB0YXJnZXRfaW5mbGF0aW9uKWAlIGFubnVhbGl6ZWQgcmV0dXJucywgYWNjb3VudGluZyBmb3IgaGlnaGVyIGluZmxhdGlvbi1hZGp1c3RlZCBwZXJmb3JtYW5jZSBleHBlY3RhdGlvbnMpIGluIGF0IGxlYXN0IDQwJS01MCUgb2YgdGhlIHllYXJzLiBUaGlzIHJhbmdlIHJlZmxlY3RzIHRoZSBwb3RlbnRpYWwgZm9yIHN0cm9uZyB1cHNpZGUgaW4gbWFueSB5ZWFycyB3aGlsZSBiYWxhbmNpbmcgdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBtYXJrZXRzIGRvIGV4cGVyaWVuY2UgZG93bnR1cm5zLiBUaGUgZmFjdCB0aGF0IGByIHBlcmNlbnRfYWJvdmVfdGFyZ2V0X2FnZ3Jlc3NpdmVgJSBvZiB0aGUgeWVhcnMgZXhjZWVkZWQgdGhlIGFnZ3Jlc3NpdmUgdGFyZ2V0IGByIGlmKHBlcmNlbnRfYWJvdmVfdGFyZ2V0X2FnZ3Jlc3NpdmUgPiA1MCkgImluZGljYXRlcyBjb25zaXN0ZW50IGFuZCByb2J1c3QgZ3Jvd3RoLCBtYWtpbmcgVlRJIGEgc3Ryb25nIG9wdGlvbiBmb3IgdGhvc2Ugc2Vla2luZyBhZ2dyZXNzaXZlIGludmVzdG1lbnRzLiIgZWxzZSBpZihwZXJjZW50X2Fib3ZlX3RhcmdldF9hZ2dyZXNzaXZlID4gNDApICJzdWdnZXN0cyB0aGF0IHdoaWxlIG5vdCBjb25zaXN0ZW50LCBWVEkgaGFzIGhpc3RvcmljYWxseSBwcm92aWRlZCByb2J1c3QgZ3Jvd3RoIG92ZXIgdGhlIGxvbmcgdGVybSwgbWFraW5nIGl0IGEgdmlhYmxlIGludmVzdG1lbnQgZm9yIHRob3NlIHdpdGggYSBoaWdoZXIgcmlzayB0b2xlcmFuY2UuIiBlbHNlICJyYWlzZXMgY29uY2VybnMgYWJvdXQgVlRJJ3MgYWJpbGl0eSB0byBtZWV0IGFnZ3Jlc3NpdmUgZ3Jvd3RoIHRhcmdldHMsIG1ha2luZyBpdCBsZXNzIHN1aXRhYmxlIGZvciBpbnZlc3RvcnMgd2l0aCBoaWdoZXIgcmlzayB0b2xlcmFuY2UuImANCg0KIyMjIEdyYXBoDQoNCmBgYHtyIHZ0aV9yYXdfZ3JhcGgsIGZpZy53aWR0aD0xMCwgZmlnLmhlaWdodD03LCBldmFsPVRSVUUsIGVjaG89RkFMU0V9DQoNCiMgTG9hZCBuZWNlc3NhcnkgbGlicmFyaWVzDQpsaWJyYXJ5KGdncGxvdDIpDQpsaWJyYXJ5KGRwbHlyKQ0KDQojIENvbnZlcnQgYDEtWWVhciBDQUdSYCB0byBudW1lcmljIGZvciBwbG90dGluZw0KdnRpX3JhdyA8LSB2dGlfcmF3ICU+JQ0KICBtdXRhdGUoDQogICAgYERhdGVgID0gYXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIoYERhdGVgKSksICAjIEVuc3VyZSBEYXRlIGlzIG51bWVyaWMNCiAgICBgMS1ZZWFyIENBR1JgID0gYXMubnVtZXJpYyhnc3ViKCIlIiwgIiIsIGAxLVllYXIgQ0FHUmApKQ0KICApDQoNCiMgRmluZCB0aGUgbWluaW11bSBhbmQgbWF4aW11bSB4LXZhbHVlIGluIHlvdXIgZGF0YQ0KbWF4X3ggPC0gbWF4KGFzLmludGVnZXIodnRpX3JhdyREYXRlKSwgbmEucm0gPSBUUlVFKQ0KbWluX3ggPC0gbWluKGFzLmludGVnZXIodnRpX3JhdyREYXRlKSwgbmEucm0gPSBUUlVFKQ0KaW50ZXJhY3RpdmVfcHJpbnQobWF4X3gpICAjIFRlc3QNCmludGVyYWN0aXZlX3ByaW50KG1pbl94KSAgIyBUZXN0DQoNCiMgRmluZCB0aGUgbWluaW11bSBhbmQgbWF4aW11bSB5ZWFyDQptaW5feWVhciA8LSBtaW4odnRpX3JhdyREYXRlLCBuYS5ybSA9IFRSVUUpDQptYXhfeWVhciA8LSBtYXgodnRpX3JhdyREYXRlLCBuYS5ybSA9IFRSVUUpDQppbnRlcmFjdGl2ZV9wcmludChtaW5feWVhcikNCmludGVyYWN0aXZlX3ByaW50KG1heF95ZWFyKQ0KDQoNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQojIyBQTE9UIEZVTEwgV0lUSE9VVCBMSU1JVFMNCg0KIyBEZWZpbmUgc3RhcnQgYW5kIGVuZCB5ZWFycw0Kc3RhcnRfeWVhciA8LSBhcy5udW1lcmljKG1pbl95ZWFyKQ0KZW5kX3llYXIgPC0gMjAyNA0KeWVhcl9yYW5nZSA8LSBlbmRfeWVhciAtIHN0YXJ0X3llYXIgKyAxICAjIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIHllYXJzDQoNCiMgRGVmaW5lIGJyZWFrcyByb3VuZGVkIGFwcHJvcHJpYXRlbHkNCmxpbWl0c19zdGFydF95ZWFyIDwtIGZsb29yKHN0YXJ0X3llYXIgLyA1KSAqIDUgICMgUm91bmQgZG93biB0byB0aGUgbmVhcmVzdCBtdWx0aXBsZSBvZiA1DQpsaW1pdHNfZW5kX3llYXIgPC0gY2VpbGluZyhlbmRfeWVhciAvIDUpICogNSAgICMgUm91bmQgdXAgdG8gdGhlIG5lYXJlc3QgbXVsdGlwbGUgb2YgNQ0KDQojIENyZWF0ZSBkeW5hbWljIHRpdGxlIGFuZCBjYXB0aW9uDQpkeW5hbWljX3RpdGxlIDwtIHBhc3RlMCgiQW5udWFsIEdyb3d0aCBSYXRlcyBPdmVyICIseWVhcl9yYW5nZSwgIiBZZWFycyAoIiwgc3RhcnRfeWVhciwgIi0iLCBlbmRfeWVhciwgIikiKQ0KZHluYW1pY19jYXB0aW9uIDwtIHBhc3RlMCgiVlRJIEFubnVhbCBHcm93dGggUmF0ZXMsIERhdGEgUGVyaW9kICgiLCBtaW5feWVhciwgIuKAkyIsIG1heF95ZWFyLCAiKSIpDQoNCiMgQ3JlYXRlIHRoZSBmdWxsLCBub24tZmlsdGVyZWQgeC1heGlzIHBsb3Qgd2l0aCBkeW5hbWljIHggcGxhY2VtZW50IGZvciBhbm5vdGF0aW9ucw0KcDEgPC0gZ2dwbG90KHZ0aV9yYXcsIGFlcyh4ID0gYXMuaW50ZWdlcihEYXRlKSwgeSA9IGAxLVllYXIgQ0FHUmApKSArDQogIA0KICAjIEFkZCBzaGFkZWQgYXJlYXMgZm9yIGJhY2tncm91bmQgZWZmZWN0DQogIGdlb21fcmVjdChhZXMoeG1pbiA9IC1JbmYsIHhtYXggPSBJbmYsIHltaW4gPSB0YXJnZXRfYWdncmVzc2l2ZSwgeW1heCA9IEluZiksIGZpbGwgPSAibGlnaHRncmVlbiIsIGFscGhhID0gMC4wMjUpICsNCiAgZ2VvbV9yZWN0KGFlcyh4bWluID0gLUluZiwgeG1heCA9IEluZiwgeW1pbiA9IHRhcmdldF9jb25zZXJ2YXRpdmUsIHltYXggPSB0YXJnZXRfYWdncmVzc2l2ZSksIGZpbGwgPSAib3JhbmdlIiwgYWxwaGEgPSAwLjAyNSkgKw0KICBnZW9tX3JlY3QoYWVzKHhtaW4gPSAtSW5mLCB4bWF4ID0gSW5mLCB5bWluID0gLUluZiwgeW1heCA9IHRhcmdldF9jb25zZXJ2YXRpdmUpLCBmaWxsID0gImxpZ2h0Y29yYWwiLCBhbHBoYSA9IDAuMDI1KSArDQogIA0KICAjIFBsb3QgbGluZXMsIHBvaW50cywgYW5kIGFubm90YXRpb25zIG9uIHRvcCBvZiBzaGFkZWQgYXJlYXMNCiAgZ2VvbV9saW5lKGNvbG9yID0gIiM0QjAwODIiLCBzaXplID0gMS4wKSArICAgICAgICMgRGFyayBwdXJwbGUgbGluZSANCiAgZ2VvbV9wb2ludChjb2xvciA9ICIjNEIwMDgyIiwgc2l6ZSA9IDEuNSkgKyAgICAgICAgIyBEYXJrIHB1cnBsZSBwb2ludHMgDQogIA0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSB0YXJnZXRfYWdncmVzc2l2ZSwgY29sb3IgPSAiZGFya2JsdWUiLCBsaW5ldHlwZSA9ICJzb2xpZCIpICsNCiAgIyBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSB0YXJnZXRfbW9kZXJhdGUsIGNvbG9yID0gImRhcmtibHVlIiwgbGluZXR5cGUgPSAic29saWQiKSArDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IHRhcmdldF9jb25zZXJ2YXRpdmUsIGNvbG9yID0gImRhcmtibHVlIiwgbGluZXR5cGUgPSAic29saWQiKSArDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IHRhcmdldF9pbmZsYXRpb24sIGNvbG9yID0gImRhcmtyZWQiLCBsaW5ldHlwZSA9ICJkYXNoZWQiKSArDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IGNhZ3JfdmFsdWUsIGNvbG9yID0gImRhcmtyZWQiLCBsaW5ldHlwZSA9ICJkYXNoZWQiKSArDQogIA0KICAjIER5bmFtaWMgcmlnaHQtYWxpZ25lZCBwbGFjZW1lbnQgZm9yIGFubm90YXRpb25zDQogIGFubm90YXRlKCJ0ZXh0IiwgeCA9IEluZiwgeSA9IHRhcmdldF9hZ2dyZXNzaXZlLCBsYWJlbCA9ICJBZ2dyZXNzaXZlIiwgDQogICAgICAgICAgIGhqdXN0ID0gMSwgdmp1c3QgPSAtMC41MCwgY29sb3IgPSAiZGFya2JsdWUiLCBzaXplID0gNCkgKw0KICAjIGFubm90YXRlKCJ0ZXh0IiwgeCA9IEluZiwgeSA9IHRhcmdldF9tb2RlcmF0ZSwgbGFiZWwgPSAiTW9kZXJhdGUiLCANCiAgIyAgICAgICAgIGhqdXN0ID0gMSwgdmp1c3QgPSAtMC41MCwgY29sb3IgPSAiZGFya2JsdWUiLCBzaXplID0gNCkgKw0KICBhbm5vdGF0ZSgidGV4dCIsIHggPSBJbmYsIHkgPSB0YXJnZXRfY29uc2VydmF0aXZlLCBsYWJlbCA9ICJDb25zZXJ2YXRpdmUiLCANCiAgICAgICAgICAgaGp1c3QgPSAxLCB2anVzdCA9ICsxLjEwLCBjb2xvciA9ICJkYXJrYmx1ZSIsIHNpemUgPSA0KSArDQogIGFubm90YXRlKCJ0ZXh0IiwgeCA9IEluZiwgeSA9IHRhcmdldF9pbmZsYXRpb24sIGxhYmVsID0gIkluZmxhdGlvbiIsIA0KICAgICAgICAgICBoanVzdCA9IDEsIHZqdXN0ID0gKzEuMTAsIGNvbG9yID0gImRhcmtyZWQiLCBzaXplID0gNCkgKw0KICBhbm5vdGF0ZSgidGV4dCIsIHggPSBJbmYsIHkgPSBjYWdyX3ZhbHVlLCBsYWJlbCA9ICJDQUdSIiwgDQogICAgICAgICAgIGhqdXN0ID0gMSwgdmp1c3QgPSAtMC41MCwgY29sb3IgPSAiZGFya3JlZCIsIHNpemUgPSA0KSArIA0KDQogIGxhYnMoDQogICAgdGl0bGUgPSBkeW5hbWljX3RpdGxlLA0KICAgIHggPSAiWWVhciIsDQogICAgeSA9ICJHcm93dGggUmF0ZSAoJSkiLA0KICAgIGNhcHRpb24gPSBkeW5hbWljX2NhcHRpb24NCiAgKSArDQoNCiAgc2NhbGVfeF9jb250aW51b3VzKA0KICAgIGxpbWl0cyA9IGMoc3RhcnRfeWVhciwgZW5kX3llYXIgKyAzKSwgIyBSZXN0cmljdHMgeC1heGlzIGRhdGEgDQogICAgYnJlYWtzID0gc2VxKGxpbWl0c19zdGFydF95ZWFyLCBsaW1pdHNfZW5kX3llYXIsIDUpICMgU2V0cyBNYWpvciB4LWF4aXMgIA0KICApICsgICMgUmVzdHJpY3QgJiBTZXQgTWFqb3IgeC1heGlzIGxpbmVzIA0KICAgIA0KICB0aGVtZV9taW5pbWFsKCkgKw0KICB0aGVtZSgNCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41LCBzaXplID0gMjApLCAgICAgICAgICMgTGFyZ2VyIHRpdGxlIGZvbnQNCiAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0KSwgICAgICAgICAgICAgICAgICAgICMgTGFyZ2VyIHgtYXhpcyBsYWJlbCBmb250DQogICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCksICAgICAgICAgICAgICAgICAgICAjIExhcmdlciB5LWF4aXMgbGFiZWwgZm9udA0KICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSwgc2l6ZSA9IDE0KSwgICMgTGFyZ2VyIHgtYXhpcyB0ZXh0DQogICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0KSwgICAgICAgICAgICAgICAgICAgICAjIExhcmdlciB5LWF4aXMgdGV4dA0KICAgIHBhbmVsLmdyaWQubWFqb3IgPSBlbGVtZW50X2xpbmUobGluZXR5cGUgPSAiZG90dGVkIiwgY29sb3IgPSAiYmxhY2siKSwgICAgICAgICAjIE1ham9yIGdyaWQgbGluZXMNCiAgICBwYW5lbC5ncmlkLm1pbm9yLnggPSBlbGVtZW50X2JsYW5rKCksICMgZWxlbWVudF9saW5lKGNvbG9yID0gImdyZXk4MCIpICAjIE1pbm9yIHggZ3JpZCBsaW5lcyBmb3IgZWFjaCB5ZWFyDQogICAgIyBwYW5lbC5ib3JkZXIgPSBlbGVtZW50X3JlY3QoY29sb3IgPSAiZGFya2dyZXkiLCBmaWxsID0gTkEsIHNpemUgPSAxLjApICAjIERhcmsgYm9yZGVyIGFyb3VuZCB0aGUgcGxvdA0KICAgIGF4aXMudGlja3MubGVuZ3RoID0gdW5pdCgtMC4yNSwgImNtIiksICAgICAgICAgICAgICAgICAgICAgICMgSW5jcmVhc2UgdGljayBsZW5ndGgNCiAgICBheGlzLnRpY2tzID0gZWxlbWVudF9saW5lKGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDAuNTApLCAjIERhcmtlciB0aWNrcw0KICAgIGF4aXMubGluZS54ID0gZWxlbWVudF9saW5lKGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDAuNzUpLCAgIyBEYXJrIGJvdHRvbSBib3JkZXINCiAgICBheGlzLmxpbmUueSA9IGVsZW1lbnRfbGluZShjb2xvciA9ICJibGFjayIsIHNpemUgPSAwLjc1KSAgICMgRGFyayBsZWZ0IGJvcmRlcg0KICApDQoNCnByaW50KHAxKQ0KDQoNCmBgYA0KDQoNCiMjIFZUSSBDQUdSDQoNCiMjIyBEYXRhDQoNCmBgYHtyIHZ0aV9yYXdfZ3IsIGV2YWw9VFJVRSwgZWNobz1GQUxTRX0NCg0KIyBWaWV3KG5ydCR2dGlfcmF3X2dyKQ0KaW50ZXJhY3RpdmVfc3RyKG5ydCR2dGlfcmF3X2dyKQ0KDQpsaWJyYXJ5KGRwbHlyKQ0KbGlicmFyeShsdWJyaWRhdGUpICAjIEZvciBkYXRlIG1hbmlwdWxhdGlvbg0KbGlicmFyeShzY2FsZXMpDQpsaWJyYXJ5KHN0cmluZ3IpDQoNCiMgVXBkYXRlIGRhdGEgZnJhbWUgd2l0aCBwcm9wZXIgZGF0ZSBhbmQgcGVyY2VudGFnZSBoYW5kbGluZw0KdnRpX3Jhd19nciA8LSBucnQkdnRpX3Jhd19nciAlPiUNCiAgbXV0YXRlKA0KICAgICMgQ29udmVydCBDbG9zZSBEYXRlIHRvICJZWVlZLU1NLUREIiBmb3JtYXQNCiAgICBgRGF0ZWAgPSBmb3JtYXQoYXMuRGF0ZShhcy5jaGFyYWN0ZXIoYERhdGVgKSwgb3JpZ2luID0gIjE5NzAtMDEtMDEiKSwgIiVZLSVtLSVkIiksDQogICAgDQogICAgIyBFbnN1cmUgQ2xvc2UgaXMgYSBudW1iZXIgZm9ybWF0dGVkIHRvIDIgZGVjaW1hbCBwbGFjZXMNCiAgICBgQ2xvc2VgID0gbnVtYmVyKGFzLm51bWVyaWMoZ3N1YigiLCIsICIiLCBDbG9zZSkpLCBiaWcubWFyayA9ICIsIiwgZGVjaW1hbC5tYXJrID0gIi4iLCBhY2N1cmFjeSA9IDAuMDEpLA0KDQogICAgIyBDbGVhbiBhbmQgaGFuZGxlIHBlcmNlbnRhZ2UgY29sdW1ucw0KICAgIGFjcm9zcygzOjExLCB+IHsNCiAgICAgIHZhbHVlIDwtIGdzdWIoIlssJVxcc10iLCAiIiwgLikgICMgUmVtb3ZlICUsIGNvbW1hcywgYW5kIHNwYWNlcw0KICAgICAgbnVtZXJpY192YWx1ZSA8LSBzdXBwcmVzc1dhcm5pbmdzKGFzLm51bWVyaWModmFsdWUpKSAgIyBDb252ZXJ0IHRvIG51bWVyaWMNCiAgICAgIGlmZWxzZSgNCiAgICAgICAgIWlzLm5hKG51bWVyaWNfdmFsdWUpLCANCiAgICAgICAgcGFzdGUwKGZvcm1hdChyb3VuZChudW1lcmljX3ZhbHVlKjEwMCwgMiksIGJpZy5tYXJrID0gIiwiLCBzY2llbnRpZmljID0gRkFMU0UpLCAiJSIpLCAgIyBGb3JtYXQgdG8gMiBkZWNpbWFsIHBsYWNlcyBhbmQgYWRkIGNvbW1hcw0KICAgICAgICAuDQogICAgICApDQogICAgfSkNCiAgKSAlPiUNCiAgYXJyYW5nZShkZXNjKGBEYXRlYCkpICAjIFNvcnQgYnkgRGF0ZSBmcm9tIG5ld2VzdCB0byBvbGRlc3QNCg0KIyBDcmVhdGUgdnRpX3Jhd19ncjogQ0dSDQp2dGlfcmF3X2NnciA8LSB2dGlfcmF3X2dyICU+JQ0KICBzZWxlY3QoYERhdGVgLCBgQ2xvc2VgLCBgMS1ZZWFyIENBR1JgLCBjb250YWlucyAoIkNHUiIpKQ0KDQojIENyZWF0ZSB2dGlfcmF3X2dyOiBDQUdSDQp2dGlfcmF3X2NhZ3IgPC0gdnRpX3Jhd19nciAlPiUNCiAgc2VsZWN0KGBEYXRlYCwgYENsb3NlYCwgY29udGFpbnMgKCJDQUdSIikpDQoNCiMgRGlzcGxheSBib3RoIHRhYmxlcyBmb3IgY29uZmlybWF0aW9uDQppbnRlcmFjdGl2ZV9wcmludCh2dGlfcmF3X2NncikNCmludGVyYWN0aXZlX3ByaW50KHZ0aV9yYXdfY2FncikNCg0KIyBPcHRpb25hbDogUHJpbnQgdGFibGUgc3VtbWFyaWVzDQppbnRlcmFjdGl2ZV9zdHIodnRpX3Jhd19jZ3IpDQppbnRlcmFjdGl2ZV9zdHIodnRpX3Jhd19jYWdyKQ0KDQojIERpc3BsYXkgY2FwdGlvbnMgZm9yIGVhY2ggdGFibGUNCiMgY2F0KCJcblxuIyMjIyBDdW11bGF0aXZlIEdyb3d0aCBSYXRlcyAoIiwgbWluX3llYXIsICItIiwgbWF4X3llYXIsICIpXG4iLCBzZXAgPSAiIikNCiMgZm9ybWF0X2VxdWFsX3dpZHRoKHZ0aV9yYXdfY2dyKQ0KDQpjYXQoIlxuXG4jIyMjIENvbXBvdW5kIEF2ZXJhZ2UgR3Jvd3RoIFJhdGVzICgiLCBtaW5feWVhciwgIi0iLCBtYXhfeWVhciwgIilcbiIsIHNlcCA9ICIiKQ0KZm9ybWF0X2VxdWFsX3dpZHRoKHZ0aV9yYXdfY2FncikNCg0KIyBWaWV3KHZ0aV9yYXdfY2FncikNCiMgY29sbmFtZXModnRpX3Jhd19jYWdyKQ0KaW50ZXJhY3RpdmVfc3RyKHZ0aV9yYXdfY2FncikNCg0KDQpgYGANCg0KIyMjIFN1bW1hcnkNCg0KYGBge3IgdnRpX3Jhd19jYWdyX3N1bW1hcnksIGV2YWw9VFJVRSwgZWNobz1GQUxTRX0NCg0KaW50ZXJhY3RpdmVfc3RyKHZ0aV9yYXdfY2FncikNCg0KIyBMb2FkIG5lY2Vzc2FyeSBsaWJyYXJpZXMNCmxpYnJhcnkoZHBseXIpDQpsaWJyYXJ5KHRpYmJsZSkNCg0KIyBEZWZpbmUgYSBoZWxwZXIgZnVuY3Rpb24gdG8gY2xlYW4gYW5kIGNvbnZlcnQgcGVyY2VudGFnZXMNCmNsZWFuX3BlcmNlbnRhZ2UgPC0gZnVuY3Rpb24oY29sdW1uKSB7DQogIGFzLm51bWVyaWMoZ3N1YigiJSIsICIiLCBjb2x1bW4pKQ0KfQ0KDQojIERlZmluZSB0aGUgc3RhdGlzdGljIG5hbWVzIGZvciB0aGUgc3VtbWFyeSB0YWJsZQ0Kc3RhdGlzdGljX25hbWVzIDwtIGMoDQogICJDb3VudCBvZiBPYnNlcnZhdGlvbnMiLCANCiAgIk1lYW4iLCANCiAgIk1lZGlhbiIsDQogICJTdGFuZGFyZCBEZXZpYXRpb24gKFZvbGF0aWxpdHkpIiwgDQogICJNaW4gQ0FHUiBSYW5nZSAoQ0FHUiAtIFNEKSIsDQogICJNYXggQ0FHUiBSYW5nZSAoQ0FHUiArIFNEKSIsDQogICJNaW5pbXVtIiwgDQogICJNYXhpbXVtIiwgDQogICJQZXJjZW50IEFib3ZlIEluZmxhdGlvbiBUYXJnZXQiLCANCiAgIlBlcmNlbnQgQWJvdmUgQ29uc2VydmF0aXZlIFRhcmdldCIsIA0KICAiUGVyY2VudCBBYm92ZSBNb2RlcmF0ZSBUYXJnZXQiLCANCiAgIlBlcmNlbnQgQWJvdmUgQWdncmVzc2l2ZSBUYXJnZXQiDQopDQoNCiMgQWRqdXN0IHRoZSBmaXJzdCByb3cncyBEYXRlIGFuZCBjbGVhbiB1cCBDQUdSIGNvbHVtbnMNCnZ0aV9yYXdfY2FnciA8LSB2dGlfcmF3X2NhZ3IgJT4lDQogIHNsaWNlKC0xKSAlPiUgIyBSZW1vdmUgdGhlIGZpcnN0IHJvdw0KICBtdXRhdGUoDQogICAgIyBEYXRlID0gaWZlbHNlKHJvd19udW1iZXIoKSA9PSAxLCAiMjAyNS0wMS0wMSIsIERhdGUpLA0KICAgIERhdGUgPSBhcy5udW1lcmljKGZvcm1hdChhcy5EYXRlKERhdGUpLCAiJVkiKSksDQogICAgYDEtWWVhciBDQUdSYCA9IGNsZWFuX3BlcmNlbnRhZ2UoYDEtWWVhciBDQUdSYCksDQogICAgYDUtWWVhciBDQUdSYCA9IGNsZWFuX3BlcmNlbnRhZ2UoYDUtWWVhciBDQUdSYCksDQogICAgYDEwLVllYXIgQ0FHUmAgPSBjbGVhbl9wZXJjZW50YWdlKGAxMC1ZZWFyIENBR1JgKSwNCiAgICBgMjAtWWVhciBDQUdSYCA9IGNsZWFuX3BlcmNlbnRhZ2UoYDIwLVllYXIgQ0FHUmApLA0KICAgIGAzMC1ZZWFyIENBR1JgID0gY2xlYW5fcGVyY2VudGFnZShgMzAtWWVhciBDQUdSYCkNCiAgKQ0KDQojIEZ1bmN0aW9uIHRvIGNhbGN1bGF0ZSBzdGF0aXN0aWNzIGZvciBhIGdpdmVuIGRhdGFzZXQNCmNhbGNfc3RhdHMgPC0gZnVuY3Rpb24oZGF0YSkgew0KICBpZiAoc3VtKCFpcy5uYShkYXRhKSkgPCAyKSByZXR1cm4ocmVwKE5BLCBsZW5ndGgoc3RhdGlzdGljX25hbWVzKSkpICAjIEhhbmRsZSBpbnN1ZmZpY2llbnQgZGF0YQ0KDQogIGNvdW50X29ic2VydmF0aW9ucyA8LSBzdW0oIWlzLm5hKGRhdGEpKQ0KICBtZWFuX3ZhbHVlIDwtIHJvdW5kKG1lYW4oZGF0YSwgbmEucm0gPSBUUlVFKSwgMikNCiAgbWVkaWFuX3ZhbHVlIDwtIHJvdW5kKG1lZGlhbihkYXRhLCBuYS5ybSA9IFRSVUUpLCAyKQ0KICBzZF92YWx1ZSA8LSByb3VuZChzZChkYXRhLCBuYS5ybSA9IFRSVUUpLCAyKQ0KICBtaW5fY2Fncl9yYW5nZSA8LSByb3VuZChjYWdyX3ZhbHVlIC0gc2RfdmFsdWUsIDIpDQogIG1heF9jYWdyX3JhbmdlIDwtIHJvdW5kKGNhZ3JfdmFsdWUgKyBzZF92YWx1ZSwgMikNCiAgbWluX3ZhbHVlIDwtIHJvdW5kKG1pbihkYXRhLCBuYS5ybSA9IFRSVUUpLCAyKQ0KICBtYXhfdmFsdWUgPC0gcm91bmQobWF4KGRhdGEsIG5hLnJtID0gVFJVRSksIDIpDQogIA0KICAjIERlZmluZSBpbmZsYXRpb24gYW5kIGdyb3d0aCB0YXJnZXRzDQogIHRhcmdldF9pbmZsYXRpb24gPC0gMiAgIyBFeGFtcGxlIHRhcmdldCBmb3IgaW5mbGF0aW9uDQogIHRhcmdldF9jb25zZXJ2YXRpdmUgPC0gMyArIHRhcmdldF9pbmZsYXRpb24NCiAgdGFyZ2V0X21vZGVyYXRlIDwtIDUgKyB0YXJnZXRfaW5mbGF0aW9uDQogIHRhcmdldF9hZ2dyZXNzaXZlIDwtIDEwICsgdGFyZ2V0X2luZmxhdGlvbg0KICANCiAgYWJvdmVfdGFyZ2V0X2luZmxhdGlvbiA8LSBzdW0oZGF0YSA+PSB0YXJnZXRfaW5mbGF0aW9uLCBuYS5ybSA9IFRSVUUpDQogIGFib3ZlX3RhcmdldF9jb25zZXJ2YXRpdmUgPC0gc3VtKGRhdGEgPj0gdGFyZ2V0X2NvbnNlcnZhdGl2ZSwgbmEucm0gPSBUUlVFKQ0KICBhYm92ZV90YXJnZXRfbW9kZXJhdGUgPC0gc3VtKGRhdGEgPj0gdGFyZ2V0X21vZGVyYXRlLCBuYS5ybSA9IFRSVUUpDQogIGFib3ZlX3RhcmdldF9hZ2dyZXNzaXZlIDwtIHN1bShkYXRhID49IHRhcmdldF9hZ2dyZXNzaXZlLCBuYS5ybSA9IFRSVUUpDQogIA0KICBwZXJjZW50X2Fib3ZlX3RhcmdldF9jb25zZXJ2YXRpdmUgPC0gcm91bmQoKGFib3ZlX3RhcmdldF9jb25zZXJ2YXRpdmUgLyBjb3VudF9vYnNlcnZhdGlvbnMpICogMTAwLCAyKQ0KICBwZXJjZW50X2Fib3ZlX3RhcmdldF9pbmZsYXRpb24gPC0gcm91bmQoKGFib3ZlX3RhcmdldF9pbmZsYXRpb24gLyBjb3VudF9vYnNlcnZhdGlvbnMpICogMTAwLCAyKQ0KICBwZXJjZW50X2Fib3ZlX3RhcmdldF9tb2RlcmF0ZSA8LSByb3VuZCgoYWJvdmVfdGFyZ2V0X21vZGVyYXRlIC8gY291bnRfb2JzZXJ2YXRpb25zKSAqIDEwMCwgMikNCiAgcGVyY2VudF9hYm92ZV90YXJnZXRfYWdncmVzc2l2ZSA8LSByb3VuZCgoYWJvdmVfdGFyZ2V0X2FnZ3Jlc3NpdmUgLyBjb3VudF9vYnNlcnZhdGlvbnMpICogMTAwLCAyKQ0KICANCiAgYygNCiAgICBjb3VudF9vYnNlcnZhdGlvbnMsIA0KICAgIHBhc3RlMChtZWFuX3ZhbHVlLCAiJSIpLA0KICAgIHBhc3RlMChtZWRpYW5fdmFsdWUsICIlIiksDQogICAgcGFzdGUwKHNkX3ZhbHVlLCAiJSIpLA0KICAgIHBhc3RlMChtaW5fY2Fncl9yYW5nZSwgIiUiKSwNCiAgICBwYXN0ZTAobWF4X2NhZ3JfcmFuZ2UsICIlIiksDQogICAgcGFzdGUwKG1pbl92YWx1ZSwgIiUiKSwNCiAgICBwYXN0ZTAobWF4X3ZhbHVlLCAiJSIpLA0KICAgIHBhc3RlMChwZXJjZW50X2Fib3ZlX3RhcmdldF9pbmZsYXRpb24sICIlIiksDQogICAgcGFzdGUwKHBlcmNlbnRfYWJvdmVfdGFyZ2V0X2NvbnNlcnZhdGl2ZSwgIiUiKSwgDQogICAgcGFzdGUwKHBlcmNlbnRfYWJvdmVfdGFyZ2V0X21vZGVyYXRlLCAiJSIpLCANCiAgICBwYXN0ZTAocGVyY2VudF9hYm92ZV90YXJnZXRfYWdncmVzc2l2ZSwgIiUiKQ0KICApDQp9DQoNCiMgQ29sdW1ucyB0byBjYWxjdWxhdGUgQ0FHUiBzdGF0aXN0aWNzDQpjYWdyX2NvbHVtbnMgPC0gYygiMS1ZZWFyIENBR1IiLCAiNS1ZZWFyIENBR1IiLCAiMTAtWWVhciBDQUdSIiwgIjIwLVllYXIgQ0FHUiIsICIzMC1ZZWFyIENBR1IiKQ0KZXhpc3RpbmdfY2Fncl9jb2x1bW5zIDwtIGludGVyc2VjdChjYWdyX2NvbHVtbnMsIG5hbWVzKHZ0aV9yYXdfY2FncikpDQoNCiMgQ2FsY3VsYXRlIHN0YXRzIGZvciBlYWNoIENBR1IgY29sdW1uDQpjYWdyX3N0YXRzX2xpc3QgPC0gbGFwcGx5KHZ0aV9yYXdfY2FncltleGlzdGluZ19jYWdyX2NvbHVtbnNdLCBjYWxjX3N0YXRzKQ0KDQojIENvbXBpbGUgaW50byBhIHN1bW1hcnkgZGF0YSBmcmFtZQ0KdnRpX3Jhd19jYWdyX3N1bW1hcnkgPC0gYXMuZGF0YS5mcmFtZShkby5jYWxsKGNiaW5kLCBjYWdyX3N0YXRzX2xpc3QpKQ0Kcm93bmFtZXModnRpX3Jhd19jYWdyX3N1bW1hcnkpIDwtIHN0YXRpc3RpY19uYW1lcw0KDQoNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQojIyBTQVZFIFZBTFVFUyBGT1IgSU4tTElORSBDT0RFDQoNCiMgRGVmaW5lIHRoZSBtYXBwaW5nIG9mIHJvdyBuYW1lcyB0byB2YXJpYWJsZSBuYW1lcw0Kcm93X3RvX3Zhcl9uYW1lIDwtIGMoDQogICJDb3VudCBvZiBPYnNlcnZhdGlvbnMiID0gImNvdW50X29ic2VydmF0aW9ucyIsDQogICJNZWFuIiA9ICJtZWFuX3ZhbHVlIiwNCiAgIk1lZGlhbiIgPSAibWVkaWFuX3ZhbHVlIiwNCiAgIlN0YW5kYXJkIERldmlhdGlvbiAoVm9sYXRpbGl0eSkiID0gInNkX3ZhbHVlIiwNCiAgIk1pbiBDQUdSIFJhbmdlIChDQUdSIC0gU0QpIiA9ICJtaW5fY2Fncl9yYW5nZSIsDQogICJNYXggQ0FHUiBSYW5nZSAoQ0FHUiArIFNEKSIgPSAibWF4X2NhZ3JfcmFuZ2UiLA0KICAiTWluaW11bSIgPSAibWluX3ZhbHVlIiwNCiAgIk1heGltdW0iID0gIm1heF92YWx1ZSIsDQogICJQZXJjZW50IEFib3ZlIEluZmxhdGlvbiBUYXJnZXQiID0gInBlcmNlbnRfYWJvdmVfdGFyZ2V0X2luZmxhdGlvbiIsDQogICJQZXJjZW50IEFib3ZlIENvbnNlcnZhdGl2ZSBUYXJnZXQiID0gInBlcmNlbnRfYWJvdmVfdGFyZ2V0X2NvbnNlcnZhdGl2ZSIsDQogICJQZXJjZW50IEFib3ZlIE1vZGVyYXRlIFRhcmdldCIgPSAicGVyY2VudF9hYm92ZV90YXJnZXRfbW9kZXJhdGUiLA0KICAiUGVyY2VudCBBYm92ZSBBZ2dyZXNzaXZlIFRhcmdldCIgPSAicGVyY2VudF9hYm92ZV90YXJnZXRfYWdncmVzc2l2ZSINCikNCg0KIyBGdW5jdGlvbiB0byBzYXZlIHN1bW1hcnkgdmFsdWVzIGR5bmFtaWNhbGx5DQpzYXZlX2NvbHVtbl92YWx1ZXMgPC0gZnVuY3Rpb24oc3VtbWFyeV9kZikgew0KICAjIEV4Y2x1ZGUgdGhlICJTdGF0aXN0aWMiIGFuZCAiT3ZlcmFsbCIgY29sdW1ucw0KICBjb2x1bW5zX3RvX3NhdmUgPC0gc2V0ZGlmZihuYW1lcyhzdW1tYXJ5X2RmKSwgYygiU3RhdGlzdGljIiwgIk92ZXJhbGwiKSkNCiAgDQogICMgSXRlcmF0ZSBvdmVyIGVhY2ggY29sdW1uDQogIGZvciAoY29sIGluIGNvbHVtbnNfdG9fc2F2ZSkgew0KICAgICMgRm9ybWF0IGNvbHVtbiBuYW1lIHRvIGxvd2VyY2FzZSBhbmQgcmVwbGFjZSBpbnZhbGlkIGNoYXJhY3RlcnMNCiAgICBjb2xfbmFtZSA8LSB0b2xvd2VyKGdzdWIoIlteYS16QS1aMC05XSIsICJfIiwgY29sKSkNCiAgICANCiAgICAjIEV4dHJhY3QgdmFsdWVzIGZvciB0aGUgY3VycmVudCBjb2x1bW4NCiAgICBjb2xfdmFsdWVzIDwtIHN1bW1hcnlfZGZbW2NvbF1dDQogICAgDQogICAgIyBTYXZlIGVhY2ggdmFsdWUgZHluYW1pY2FsbHkgdXNpbmcgdGhlIG1hcHBpbmcgZm9yIHJvdyBuYW1lcw0KICAgIGZvciAoaSBpbiBzZXFfYWxvbmcoY29sX3ZhbHVlcykpIHsNCiAgICAgICMgR2V0IHRoZSBjb3JyZXNwb25kaW5nIHZhcmlhYmxlIG5hbWUgZnJvbSB0aGUgbWFwcGluZw0KICAgICAgc3RhdF9uYW1lIDwtIHJvd190b192YXJfbmFtZVtyb3duYW1lcyhzdW1tYXJ5X2RmKVtpXV0NCiAgICAgIA0KICAgICAgaWYgKCFpcy5uYShzdGF0X25hbWUpKSB7ICAjIFNraXAgaWYgbm8gbWFwcGluZyBpcyBkZWZpbmVkDQogICAgICAgICMgQ3JlYXRlIHRoZSB2YXJpYWJsZSBuYW1lDQogICAgICAgIHZhcl9uYW1lIDwtIHBhc3RlMChzdGF0X25hbWUsICJfIiwgY29sX25hbWUpDQogICAgICAgIA0KICAgICAgICAjIEF0dGVtcHQgbnVtZXJpYyBjb252ZXJzaW9uIGZvciBkb3duc3RyZWFtIHVzZQ0KICAgICAgICB2YWx1ZSA8LSBzdXBwcmVzc1dhcm5pbmdzKGFzLm51bWVyaWMoZ3N1YigiJSIsICIiLCBjb2xfdmFsdWVzW2ldKSkpDQogICAgICAgIA0KICAgICAgICAjIEFzc2lnbiB0aGUgdmFsdWUgdG8gdGhlIGdsb2JhbCBlbnZpcm9ubWVudA0KICAgICAgICBhc3NpZ24odmFyX25hbWUsIHZhbHVlLCBlbnZpciA9IC5HbG9iYWxFbnYpDQogICAgICB9DQogICAgfQ0KICB9DQp9DQoNCiMgQXBwbHkgdGhlIGZ1bmN0aW9uIHRvIHNhdmUgdmFsdWVzIGZvciBhbGwgY29sdW1ucyBleGNlcHQgIk92ZXJhbGwiDQpzYXZlX2NvbHVtbl92YWx1ZXModnRpX3Jhd19jYWdyX3N1bW1hcnkpDQoNCiMgRXhhbXBsZTogQWNjZXNzaW5nIGR5bmFtaWNhbGx5IGNyZWF0ZWQgdmFyaWFibGVzDQppbnRlcmFjdGl2ZV9wcmludChtZWFuX3ZhbHVlXzFfeWVhcl9jYWdyKSAgIyBTaG91bGQgcHJpbnQgdGhlIG1lYW4gdmFsdWUgZm9yIDEtWWVhciBDQUdSDQppbnRlcmFjdGl2ZV9wcmludChwZXJjZW50X2Fib3ZlX3RhcmdldF9pbmZsYXRpb25fNV95ZWFyX2NhZ3IpICAjIFNob3VsZCBwcmludCB0aGUgcGVyY2VudCBhYm92ZSBpbmZsYXRpb24gdGFyZ2V0IGZvciA1LVllYXIgQ0FHUg0KaW50ZXJhY3RpdmVfcHJpbnQoc2RfdmFsdWVfMTBfeWVhcl9jYWdyKSAgIyBTaG91bGQgcHJpbnQgdGhlIHN0YW5kYXJkIGRldmlhdGlvbiBmb3IgMTAtWWVhciBDQUdSDQoNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQojIyBPVkVSQUxMIFNUQVRJU1RJQ1MgDQpudW1lcmljX3ZhbHVlc19hbGwgPC0gYXMubnVtZXJpYyh1bmxpc3QodnRpX3Jhd19jYWdyW2V4aXN0aW5nX2NhZ3JfY29sdW1uc10sIHVzZS5uYW1lcyA9IEZBTFNFKSkNCm51bWVyaWNfdmFsdWVzX2FsbCA8LSBudW1lcmljX3ZhbHVlc19hbGxbIWlzLm5hKG51bWVyaWNfdmFsdWVzX2FsbCldDQoNCm92ZXJhbGxfY291bnRfb2JzZXJ2YXRpb25zIDwtIGxlbmd0aChudW1lcmljX3ZhbHVlc19hbGwpDQpvdmVyYWxsX21lYW5fdmFsdWUgPC0gcm91bmQobWVhbihudW1lcmljX3ZhbHVlc19hbGwpLCAyKQ0Kb3ZlcmFsbF9tZWRpYW5fdmFsdWUgPC0gcm91bmQobWVkaWFuKG51bWVyaWNfdmFsdWVzX2FsbCksIDIpDQpvdmVyYWxsX3NkX3ZhbHVlIDwtIHJvdW5kKHNkKG51bWVyaWNfdmFsdWVzX2FsbCksIDIpDQpvdmVyYWxsX21pbl9jYWdyX3JhbmdlIDwtIHJvdW5kKGNhZ3JfdmFsdWUgLSBvdmVyYWxsX3NkX3ZhbHVlLCAyKQ0Kb3ZlcmFsbF9tYXhfY2Fncl9yYW5nZSA8LSByb3VuZChjYWdyX3ZhbHVlICsgb3ZlcmFsbF9zZF92YWx1ZSwgMikNCm92ZXJhbGxfbWluX3ZhbHVlIDwtIHJvdW5kKG1pbihudW1lcmljX3ZhbHVlc19hbGwpLCAyKQ0Kb3ZlcmFsbF9tYXhfdmFsdWUgPC0gcm91bmQobWF4KG51bWVyaWNfdmFsdWVzX2FsbCksIDIpDQoNCm92ZXJhbGxfYWJvdmVfdGFyZ2V0X2luZmxhdGlvbiA8LSBzdW0obnVtZXJpY192YWx1ZXNfYWxsID49IHRhcmdldF9pbmZsYXRpb24sIG5hLnJtID0gVFJVRSkNCm92ZXJhbGxfYWJvdmVfdGFyZ2V0X2NvbnNlcnZhdGl2ZSA8LSBzdW0obnVtZXJpY192YWx1ZXNfYWxsID49IHRhcmdldF9jb25zZXJ2YXRpdmUsIG5hLnJtID0gVFJVRSkNCm92ZXJhbGxfYWJvdmVfdGFyZ2V0X21vZGVyYXRlIDwtIHN1bShudW1lcmljX3ZhbHVlc19hbGwgPj0gdGFyZ2V0X21vZGVyYXRlLCBuYS5ybSA9IFRSVUUpDQpvdmVyYWxsX2Fib3ZlX3RhcmdldF9hZ2dyZXNzaXZlIDwtIHN1bShudW1lcmljX3ZhbHVlc19hbGwgPj0gdGFyZ2V0X2FnZ3Jlc3NpdmUsIG5hLnJtID0gVFJVRSkNCg0Kb3ZlcmFsbF9wZXJjZW50X2Fib3ZlX3RhcmdldF9jb25zZXJ2YXRpdmUgPC0gcm91bmQoKG92ZXJhbGxfYWJvdmVfdGFyZ2V0X2NvbnNlcnZhdGl2ZSAvIG92ZXJhbGxfY291bnRfb2JzZXJ2YXRpb25zKSAqIDEwMCwgMikNCm92ZXJhbGxfcGVyY2VudF9hYm92ZV90YXJnZXRfaW5mbGF0aW9uIDwtIHJvdW5kKChvdmVyYWxsX2Fib3ZlX3RhcmdldF9pbmZsYXRpb24gLyBvdmVyYWxsX2NvdW50X29ic2VydmF0aW9ucykgKiAxMDAsIDIpDQpvdmVyYWxsX3BlcmNlbnRfYWJvdmVfdGFyZ2V0X21vZGVyYXRlIDwtIHJvdW5kKChvdmVyYWxsX2Fib3ZlX3RhcmdldF9tb2RlcmF0ZSAvIG92ZXJhbGxfY291bnRfb2JzZXJ2YXRpb25zKSAqIDEwMCwgMikNCm92ZXJhbGxfcGVyY2VudF9hYm92ZV90YXJnZXRfYWdncmVzc2l2ZSA8LSByb3VuZCgob3ZlcmFsbF9hYm92ZV90YXJnZXRfYWdncmVzc2l2ZSAvIG92ZXJhbGxfY291bnRfb2JzZXJ2YXRpb25zKSAqIDEwMCwgMikNCg0KdnRpX3Jhd19jYWdyX3N1bW1hcnkkT3ZlcmFsbCA8LSBjKA0KICBvdmVyYWxsX2NvdW50X29ic2VydmF0aW9ucywNCiAgcGFzdGUwKG92ZXJhbGxfbWVhbl92YWx1ZSwgIiUiKSwNCiAgcGFzdGUwKG92ZXJhbGxfbWVkaWFuX3ZhbHVlLCAiJSIpLA0KICBwYXN0ZTAob3ZlcmFsbF9zZF92YWx1ZSwgIiUiKSwNCiAgcGFzdGUwKG92ZXJhbGxfbWluX2NhZ3JfcmFuZ2UsICIlIiksDQogIHBhc3RlMChvdmVyYWxsX21heF9jYWdyX3JhbmdlLCAiJSIpLA0KICBwYXN0ZTAob3ZlcmFsbF9taW5fdmFsdWUsICIlIiksDQogIHBhc3RlMChvdmVyYWxsX21heF92YWx1ZSwgIiUiKSwNCiAgcGFzdGUwKG92ZXJhbGxfcGVyY2VudF9hYm92ZV90YXJnZXRfaW5mbGF0aW9uLCAiJSIpLA0KICBwYXN0ZTAob3ZlcmFsbF9wZXJjZW50X2Fib3ZlX3RhcmdldF9jb25zZXJ2YXRpdmUsICIlIiksDQogIHBhc3RlMChvdmVyYWxsX3BlcmNlbnRfYWJvdmVfdGFyZ2V0X21vZGVyYXRlLCAiJSIpLA0KICBwYXN0ZTAob3ZlcmFsbF9wZXJjZW50X2Fib3ZlX3RhcmdldF9hZ2dyZXNzaXZlLCAiJSIpDQopDQoNCiMgQ29udmVydCByb3cgbmFtZXMgdG8gYSBjb2x1bW4NCnZ0aV9yYXdfY2Fncl9zdW1tYXJ5IDwtIHRpYmJsZTo6cm93bmFtZXNfdG9fY29sdW1uKHZ0aV9yYXdfY2Fncl9zdW1tYXJ5LCB2YXIgPSAiU3RhdGlzdGljIikNCg0KIyBFbnN1cmUgYWxsIGNvbHVtbnMgYXJlIGNoYXJhY3Rlcg0KdnRpX3Jhd19jYWdyX3N1bW1hcnkgPC0gdnRpX3Jhd19jYWdyX3N1bW1hcnkgJT4lDQogIG11dGF0ZShhY3Jvc3MoZXZlcnl0aGluZygpLCBhcy5jaGFyYWN0ZXIpKQ0KDQojIERpc3BsYXkgdGhlIHN1bW1hcnkgdGFibGUNCmNhdCgiXG4jIyMjIENvbXBvdW5kIEF2ZXJhZ2UgR3Jvd3RoIFJhdGVzICgiLCBtaW5feWVhciwgIi0iLCBtYXhfeWVhciwgIilcbiIsIHNlcCA9ICIiKQ0KaW50ZXJhY3RpdmVfc3RyKHZ0aV9yYXdfY2Fncl9zdW1tYXJ5KQ0KZm9ybWF0X3Vuc3BlY2lmaWVkX3dpZHRoKHZ0aV9yYXdfY2Fncl9zdW1tYXJ5KQ0KDQpgYGANCg0KKipgciBtaW5feWVhcmAtYHIgbWF4X3llYXJgIFN1bW1hcnk6KiogVGhlIDEtWWVhciBDQUdSIGV4aGliaXRzIHRoZSBgciBpZihtZWFuX3ZhbHVlXzFfeWVhcl9jYWdyID09IG1heChjKG1lYW5fdmFsdWVfMV95ZWFyX2NhZ3IsIG1lYW5fdmFsdWVfNV95ZWFyX2NhZ3IsIG1lYW5fdmFsdWVfMTBfeWVhcl9jYWdyLCBtZWFuX3ZhbHVlXzIwX3llYXJfY2FncikpKSAiaGlnaGVzdCBtZWFuIHJldHVybiIgZWxzZSBpZihtZWFuX3ZhbHVlXzFfeWVhcl9jYWdyID09IG1pbihjKG1lYW5fdmFsdWVfMV95ZWFyX2NhZ3IsIG1lYW5fdmFsdWVfNV95ZWFyX2NhZ3IsIG1lYW5fdmFsdWVfMTBfeWVhcl9jYWdyLCBtZWFuX3ZhbHVlXzIwX3llYXJfY2FncikpKSAibG93ZXN0IG1lYW4gcmV0dXJuIiBlbHNlICJtZWFuIHJldHVybiJgIGF0IGByIG1lYW5fdmFsdWVfMV95ZWFyX2NhZ3JgJSwgYW5kIGByIGlmKHNkX3ZhbHVlXzFfeWVhcl9jYWdyID09IG1heChjKHNkX3ZhbHVlXzFfeWVhcl9jYWdyLCBzZF92YWx1ZV81X3llYXJfY2Fnciwgc2RfdmFsdWVfMTBfeWVhcl9jYWdyLCBzZF92YWx1ZV8yMF95ZWFyX2NhZ3IpKSkgInRoZSBncmVhdGVzdCB2b2xhdGlsaXR5IHdpdGggYSIgZWxzZSBpZihzZF92YWx1ZV8xX3llYXJfY2FnciA9PSBtaW4oYyhzZF92YWx1ZV8xX3llYXJfY2Fnciwgc2RfdmFsdWVfNV95ZWFyX2NhZ3IsIHNkX3ZhbHVlXzEwX3llYXJfY2Fnciwgc2RfdmFsdWVfMjBfeWVhcl9jYWdyKSkpICJ0aGUgbGVhc3Qgdm9sYXRpbGl0eSB3aXRoIGEiIGVsc2UgImEiYCBzdGFuZGFyZCBkZXZpYXRpb24gb2YgYHIgc2RfdmFsdWVfMV95ZWFyX2NhZ3JgJS4gQXMgdGhlIGludmVzdG1lbnQgaG9yaXpvbiBleHRlbmRzIHRvIDUsIDEwLCBhbmQgMjAgeWVhcnMsIHRoZSBtZWFuIHJldHVybnMgYHIgaWYobWVhbl92YWx1ZV8xX3llYXJfY2FnciA8IG1lYW4oYyhtZWFuX3ZhbHVlXzVfeWVhcl9jYWdyLCBtZWFuX3ZhbHVlXzEwX3llYXJfY2FnciwgbWVhbl92YWx1ZV8yMF95ZWFyX2NhZ3IpKSkgImluY3JlYXNlIiBlbHNlICJkZWNyZWFzZSJgLCByYW5naW5nIGZyb20gYHIgbWVhbl92YWx1ZV81X3llYXJfY2FncmAlIHRvIGByIG1lYW5fdmFsdWVfMjBfeWVhcl9jYWdyYCUsIHdoaWxlIHZvbGF0aWxpdHkgYHIgaWYoc2RfdmFsdWVfMV95ZWFyX2NhZ3IgPCBtZWFuKGMoc2RfdmFsdWVfNV95ZWFyX2NhZ3IsIHNkX3ZhbHVlXzEwX3llYXJfY2Fnciwgc2RfdmFsdWVfMjBfeWVhcl9jYWdyKSkpICJyaXNlcyIgZWxzZSAiZGltaW5pc2hlcyJgLCB3aXRoIHN0YW5kYXJkIGRldmlhdGlvbnMgYHIgaWYoc2RfdmFsdWVfMV95ZWFyX2NhZ3IgPiBzZF92YWx1ZV8yMF95ZWFyX2NhZ3IpICJkcm9wcGluZyIgZWxzZSAicmlzaW5nImAgZnJvbSBgciBzZF92YWx1ZV81X3llYXJfY2FncmAlIHRvIGByIHNkX3ZhbHVlXzIwX3llYXJfY2FncmAlLiBUaGlzIHRyZW5kIGluZGljYXRlcyB0aGF0IGxvbmdlciBpbnZlc3RtZW50IHBlcmlvZHMgdGVuZCB0byBvZmZlciBgciBpZihzZF92YWx1ZV8xX3llYXJfY2FnciA+IHNkX3ZhbHVlXzIwX3llYXJfY2FncikgIm1vcmUgc3RhYmxlIiBlbHNlICJsZXNzIHN0YWJsZSJgIHJldHVybnMuIEZ1cnRoZXJtb3JlLCB0aGUgcGVyY2VudGFnZSBvZiBwZXJpb2RzIGV4Y2VlZGluZyB0aGUgaW5mbGF0aW9uIHRhcmdldCBgciBpZihwZXJjZW50X2Fib3ZlX3RhcmdldF9pbmZsYXRpb25fMV95ZWFyX2NhZ3IgPCBwZXJjZW50X2Fib3ZlX3RhcmdldF9pbmZsYXRpb25fMjBfeWVhcl9jYWdyKSAiaW5jcmVhc2VzIiBlbHNlICJkZWNyZWFzZXMiYCB3aXRoIGxvbmdlciBkdXJhdGlvbnMsIGZyb20gYHIgcGVyY2VudF9hYm92ZV90YXJnZXRfaW5mbGF0aW9uXzFfeWVhcl9jYWdyYCUgaW4gdGhlIDEtWWVhciBDQUdSIHRvIGByIHBlcmNlbnRfYWJvdmVfdGFyZ2V0X2luZmxhdGlvbl8yMF95ZWFyX2NhZ3JgJSBpbiB0aGUgMjAtWWVhciBDQUdSLCB1bmRlcnNjb3JpbmcgVlRJJ3MgYHIgaWYocGVyY2VudF9hYm92ZV90YXJnZXRfaW5mbGF0aW9uXzFfeWVhcl9jYWdyIDwgcGVyY2VudF9hYm92ZV90YXJnZXRfaW5mbGF0aW9uXzIwX3llYXJfY2FncikgImVmZmVjdGl2ZW5lc3MiIGVsc2UgImluZWZmZWN0aXZlbmVzcyJgIGFzIGEgaGVkZ2UgYWdhaW5zdCBpbmZsYXRpb24gb3ZlciBleHRlbmRlZCB0aW1lZnJhbWVzLiBXaXRoIGFuIG92ZXJhbGwgcGVyY2VudGFnZSBvZiBgciBvdmVyYWxsX3BlcmNlbnRfYWJvdmVfdGFyZ2V0X2FnZ3Jlc3NpdmVgJSBleGNlZWRpbmcgdGhlIGFnZ3Jlc3NpdmUgdGFyZ2V0IChgciB0YXJnZXRfYWdncmVzc2l2ZWAlIGFubnVhbGl6ZWQgcmV0dXJucyB3aXRoIGByIHRhcmdldF9pbmZsYXRpb25gJSBpbmZsYXRpb24pLCBWVEkgYHIgaWYob3ZlcmFsbF9wZXJjZW50X2Fib3ZlX3RhcmdldF9hZ2dyZXNzaXZlID4gNTApICJoYXMsIG92ZXIgdGhpcyB0aW1lIHBlcmlvZCwgcHJvdmVuIHRvIGJlIGEgc3Ryb25nIiBlbHNlIGlmKG92ZXJhbGxfcGVyY2VudF9hYm92ZV90YXJnZXRfYWdncmVzc2l2ZSA+IDQwKSAiaGFzLCBvdmVyIHRoaXMgdGltZSBwZXJpb2QsIGRlbW9uc3RyYXRlZCBpdHNlbGYgYXMgYSB2aWFibGUiIGVsc2UgImFwcGVhcnMsIG92ZXIgdGhpcyB0aW1lIHBlcmlvZCwgdG8gYmUgYSBsZXNzIHN1aXRhYmxlImAgb3B0aW9uIGZvciBhIGhpZ2gtcmV0dXJuaW5nIGxvbmctdGVybSBpbnZlc3RtZW50Lg0KDQojIyMgR3JhcGgNCg0KIyMjIyBBbGwgUGVyaW9kcw0KDQoNCmBgYHtyIHZ0aV9yYXdfY2Fncl9ncmFwaHNfYWxsLCBmaWcud2lkdGg9MTAsIGZpZy5oZWlnaHQ9NywgZXZhbD1UUlVFLCBlY2hvPUZBTFNFfQ0KDQpjYXQoIlxuXG4jIyMjIENvbXBvdW5kIEF2ZXJhZ2UgR3Jvd3RoIFJhdGVzIEFjcm9zcyBQZXJpb2RzIFxuIikNCg0KIyBMb2FkIG5lY2Vzc2FyeSBsaWJyYXJpZXMNCmxpYnJhcnkoZ2dwbG90MikNCmxpYnJhcnkoZHBseXIpDQoNCg0KIyBDb252ZXJ0IGNvbHVtbnMgdG8gbnVtZXJpYyBmb3IgcGxvdHRpbmcgaWYgbmVlZGVkDQp2dGlfcmF3X2NhZ3IgPC0gdnRpX3Jhd19jYWdyICU+JQ0KICBtdXRhdGUoDQogICAgYERhdGVgID0gYXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIoYERhdGVgKSksICAjIEVuc3VyZSBEYXRlIGlzIG51bWVyaWMNCiAgICBgMS1ZZWFyIENBR1JgID0gYXMubnVtZXJpYyhnc3ViKCIlIiwgIiIsIGAxLVllYXIgQ0FHUmApKSwNCiAgICBgNS1ZZWFyIENBR1JgID0gYXMubnVtZXJpYyhnc3ViKCIlIiwgIiIsIGA1LVllYXIgQ0FHUmApKSwNCiAgICBgMTAtWWVhciBDQUdSYCA9IGFzLm51bWVyaWMoZ3N1YigiJSIsICIiLCBgMTAtWWVhciBDQUdSYCkpLA0KICAgIGAyMC1ZZWFyIENBR1JgID0gYXMubnVtZXJpYyhnc3ViKCIlIiwgIiIsIGAyMC1ZZWFyIENBR1JgKSksDQogICAgYDMwLVllYXIgQ0FHUmAgPSBhcy5udW1lcmljKGdzdWIoIiUiLCAiIiwgYDMwLVllYXIgQ0FHUmApKQ0KICApDQoNCiMgUmVzaGFwZSB0aGUgZGF0YSBpbnRvIGxvbmcgZm9ybWF0IGZvciBlYXN5IHBsb3R0aW5nIG9mIG11bHRpcGxlIGxpbmVzIGFuZCBzZXQgdGhlIGZhY3RvciBvcmRlcg0KbnJ0X2xvbmcgPC0gdnRpX3Jhd19jYWdyICU+JQ0KICBwaXZvdF9sb25nZXIoY29scyA9IGMoYDEtWWVhciBDQUdSYCwgYDUtWWVhciBDQUdSYCwgYDEwLVllYXIgQ0FHUmAsIGAyMC1ZZWFyIENBR1JgLCBgMzAtWWVhciBDQUdSYCksDQogICAgICAgICAgICAgICBuYW1lc190byA9ICJDQUdSX1BlcmlvZCIsDQogICAgICAgICAgICAgICB2YWx1ZXNfdG8gPSAiQ0FHUl9WYWx1ZSIpICU+JQ0KICBtdXRhdGUoQ0FHUl9QZXJpb2QgPSBmYWN0b3IoQ0FHUl9QZXJpb2QsIGxldmVscyA9IGMoIjEtWWVhciBDQUdSIiwgIjUtWWVhciBDQUdSIiwgIjEwLVllYXIgQ0FHUiIsICIyMC1ZZWFyIENBR1IiLCAiMzAtWWVhciBDQUdSIikpKQ0KDQojIEFzc2lnbiBjb2xvcnMgZHluYW1pY2FsbHkgYmFzZWQgb24gdGhlIG9yZGVyIG9mIENBR1JfUGVyaW9kIGluIHRoZSBkYXRhDQojIE1hdGNoIHRoZSB1bmlxdWUgbGV2ZWxzIG9mIENBR1JfUGVyaW9kIHdpdGggY29sb3JzIGZyb20gY29sb3JzX2dlbmVyYWxfZGFyaw0KdW5pcXVlX3R5cGVzIDwtIHVuaXF1ZShucnRfbG9uZyRDQUdSX1BlcmlvZCkNCmN1c3RvbV9jb2xvcnMgPC0gc2V0TmFtZXMoY29sb3JzX2dlbmVyYWxfZGFya1sxOmxlbmd0aCh1bmlxdWVfdHlwZXMpXSwgdW5pcXVlX3R5cGVzKQ0KDQojIEZpbmQgdGhlIG1pbmltdW0gYW5kIG1heGltdW0geC12YWx1ZSBpbiB5b3VyIGRhdGENCm1heF94IDwtIG1heChhcy5pbnRlZ2VyKHZ0aV9yYXdfY2FnciREYXRlKSwgbmEucm0gPSBUUlVFKQ0KbWluX3ggPC0gbWluKGFzLmludGVnZXIodnRpX3Jhd19jYWdyJERhdGUpLCBuYS5ybSA9IFRSVUUpDQppbnRlcmFjdGl2ZV9wcmludChtYXhfeCkgICMgVGVzdA0KaW50ZXJhY3RpdmVfcHJpbnQobWluX3gpICAjIFRlc3QNCg0KIyBGaW5kIHRoZSBtaW5pbXVtIGFuZCBtYXhpbXVtIHllYXINCm1pbl95ZWFyIDwtIG1pbih2dGlfcmF3X2NhZ3IkRGF0ZSwgbmEucm0gPSBUUlVFKQ0KbWF4X3llYXIgPC0gbWF4KHZ0aV9yYXdfY2FnciREYXRlLCBuYS5ybSA9IFRSVUUpDQppbnRlcmFjdGl2ZV9wcmludChtaW5feWVhcikNCmludGVyYWN0aXZlX3ByaW50KG1heF95ZWFyKQ0KDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KIyMgUExPVCBGVUxMIFdJVEhPVVQgTElNSVRTDQoNCiMgRGVmaW5lIHN0YXJ0IGFuZCBlbmQgeWVhcnMNCnN0YXJ0X3llYXIgPC0gYXMubnVtZXJpYyhtaW5feWVhcikNCmVuZF95ZWFyIDwtIDIwMjQNCnllYXJfcmFuZ2UgPC0gZW5kX3llYXIgLSBzdGFydF95ZWFyICsgMSAgIyBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiB5ZWFycw0KDQojIERlZmluZSBicmVha3Mgcm91bmRlZCBhcHByb3ByaWF0ZWx5DQpsaW1pdHNfc3RhcnRfeWVhciA8LSBmbG9vcihzdGFydF95ZWFyIC8gNSkgKiA1ICAjIFJvdW5kIGRvd24gdG8gdGhlIG5lYXJlc3QgbXVsdGlwbGUgb2YgNQ0KbGltaXRzX2VuZF95ZWFyIDwtIGNlaWxpbmcoZW5kX3llYXIgLyA1KSAqIDUgICAjIFJvdW5kIHVwIHRvIHRoZSBuZWFyZXN0IG11bHRpcGxlIG9mIDUNCg0KIyBDcmVhdGUgZHluYW1pYyB0aXRsZSBhbmQgY2FwdGlvbg0KZHluYW1pY190aXRsZSA8LSBwYXN0ZTAoIlJvbGxpbmcgQ0FHUnMgQWNyb3NzIFBlcmlvZHMgT3ZlciAiLHllYXJfcmFuZ2UsICIgWWVhcnMgKCIsIHN0YXJ0X3llYXIsICItIiwgZW5kX3llYXIsICIpIikNCmR5bmFtaWNfY2FwdGlvbiA8LSBwYXN0ZTAoIlZUSSBDb21wb3VuZCBBdmVyYWdlIEdyb3d0aCBSYXRlcyBBY3Jvc3MgUm9sbGluZyBQZXJpb2RzLCBEYXRhc2V0ICgiLCBtaW5feWVhciwgIi0iLCBtYXhfeWVhciwgIikiKQ0KDQojIENyZWF0ZSB0aGUgZnVsbCwgbm9uLWZpbHRlcmVkIHgtYXhpcyBwbG90IHdpdGggZHluYW1pYyB4IHBsYWNlbWVudCBmb3IgYW5ub3RhdGlvbnMNCnAxIDwtIGdncGxvdChucnRfbG9uZywgYWVzKHggPSBhcy5pbnRlZ2VyKERhdGUpLCB5ID0gQ0FHUl9WYWx1ZSwgY29sb3IgPSBDQUdSX1BlcmlvZCkpICsNCg0KICAjIEFkZCBzaGFkZWQgYXJlYXMgZm9yIGJhY2tncm91bmQgZWZmZWN0DQogIGdlb21fcmVjdChhZXMoeG1pbiA9IC1JbmYsIHhtYXggPSBJbmYsIHltaW4gPSB0YXJnZXRfYWdncmVzc2l2ZSwgeW1heCA9IEluZiksIGZpbGwgPSAibGlnaHRncmVlbiIsIGFscGhhID0gMC4wMTApICsNCiAgZ2VvbV9yZWN0KGFlcyh4bWluID0gLUluZiwgeG1heCA9IEluZiwgeW1pbiA9IHRhcmdldF9jb25zZXJ2YXRpdmUsIHltYXggPSB0YXJnZXRfYWdncmVzc2l2ZSksIGZpbGwgPSAib3JhbmdlIiwgYWxwaGEgPSAwLjAxKSArDQogIGdlb21fcmVjdChhZXMoeG1pbiA9IC1JbmYsIHhtYXggPSBJbmYsIHltaW4gPSAtSW5mLCB5bWF4ID0gdGFyZ2V0X2NvbnNlcnZhdGl2ZSksIGZpbGwgPSAibGlnaHRjb3JhbCIsIGFscGhhID0gMC4wMTApICsNCiAgDQogICMgUGxvdCBsaW5lcyBmb3IgZWFjaCBDQUdSIFBlcmlvZA0KICBnZW9tX2xpbmUoc2l6ZSA9IDEuMCwgYWxwaGEgPSAzLjApICsgICAgICAgIyBMaW5lIGZvciBlYWNoIENBR1INCiAgZ2VvbV9wb2ludChzaXplID0gMS4wLCBhbHBoYSA9IDMuMCkgKyAgICAgICAjIFBvaW50cyBmb3IgZWFjaCBDQUdSDQogIA0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSB0YXJnZXRfYWdncmVzc2l2ZSwgY29sb3IgPSAiZGFya2JsdWUiLCBsaW5ldHlwZSA9ICJzb2xpZCIpICsNCiAgIyBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSB0YXJnZXRfbW9kZXJhdGUsIGNvbG9yID0gImRhcmtibHVlIiwgbGluZXR5cGUgPSAic29saWQiKSArDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IHRhcmdldF9jb25zZXJ2YXRpdmUsIGNvbG9yID0gImRhcmtibHVlIiwgbGluZXR5cGUgPSAic29saWQiKSArDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IHRhcmdldF9pbmZsYXRpb24sIGNvbG9yID0gImRhcmtyZWQiLCBsaW5ldHlwZSA9ICJkYXNoZWQiKSArDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IGNhZ3JfdmFsdWUsIGNvbG9yID0gImRhcmtyZWQiLCBsaW5ldHlwZSA9ICJkYXNoZWQiKSArDQogIA0KICAjIER5bmFtaWMgcmlnaHQtYWxpZ25lZCBwbGFjZW1lbnQgZm9yIGFubm90YXRpb25zDQogIGFubm90YXRlKCJ0ZXh0IiwgeCA9IEluZiwgeSA9IHRhcmdldF9hZ2dyZXNzaXZlLCBsYWJlbCA9ICJBZ2dyZXNzaXZlIiwgDQogICAgICAgICAgIGhqdXN0ID0gMSwgdmp1c3QgPSAtMC41MCwgY29sb3IgPSAiZGFya2JsdWUiLCBzaXplID0gNCkgKw0KICAjIGFubm90YXRlKCJ0ZXh0IiwgeCA9IEluZiwgeSA9IHRhcmdldF9tb2RlcmF0ZSwgbGFiZWwgPSAiTW9kZXJhdGUiLCANCiAgIyAgICAgICAgIGhqdXN0ID0gMSwgdmp1c3QgPSAtMC41MCwgY29sb3IgPSAiZGFya2JsdWUiLCBzaXplID0gNCkgKw0KICBhbm5vdGF0ZSgidGV4dCIsIHggPSBJbmYsIHkgPSB0YXJnZXRfY29uc2VydmF0aXZlLCBsYWJlbCA9ICJDb25zZXJ2YXRpdmUiLCANCiAgICAgICAgICAgaGp1c3QgPSAxLCB2anVzdCA9ICsxLjEwLCBjb2xvciA9ICJkYXJrYmx1ZSIsIHNpemUgPSA0KSArDQogIGFubm90YXRlKCJ0ZXh0IiwgeCA9IEluZiwgeSA9IHRhcmdldF9pbmZsYXRpb24sIGxhYmVsID0gIkluZmxhdGlvbiIsIA0KICAgICAgICAgICBoanVzdCA9IDEsIHZqdXN0ID0gKzEuMTAsIGNvbG9yID0gImRhcmtyZWQiLCBzaXplID0gNCkgKw0KICBhbm5vdGF0ZSgidGV4dCIsIHggPSBJbmYsIHkgPSBjYWdyX3ZhbHVlLCBsYWJlbCA9ICJDQUdSIiwgDQogICAgICAgICAgIGhqdXN0ID0gMSwgdmp1c3QgPSAtMC41MCwgY29sb3IgPSAiZGFya3JlZCIsIHNpemUgPSA0KSArIA0KDQogIGxhYnMoDQogICAgdGl0bGUgPSBkeW5hbWljX3RpdGxlLA0KICAgIHggPSAiWWVhciIsDQogICAgeSA9ICJDQUdSIFZhbHVlICglKSIsDQogICAgY29sb3IgPSAiQ0FHUiBQZXJpb2QiLA0KICAgIGNhcHRpb24gPSBkeW5hbWljX2NhcHRpb24NCiAgICApICsNCiAgDQogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjdXN0b21fY29sb3JzKSArICAjIFNldCBjb2xvcnMgZm9yIGVhY2ggQ0FHUiBQZXJpb2QNCiAgc2NhbGVfeF9jb250aW51b3VzKA0KICAgIGxpbWl0cyA9IGMoc3RhcnRfeWVhciwgZW5kX3llYXIgKyAzKSwgDQogICAgYnJlYWtzID0gc2VxKGxpbWl0c19zdGFydF95ZWFyLCBsaW1pdHNfZW5kX3llYXIgLCA1KSkgKyAgIyBSZXN0cmljdCAmIFNldCBNYWpvciB4LWF4aXMgbGluZXMgZm9yIGVhY2ggeWVhcg0KICANCiAgdGhlbWVfbWluaW1hbCgpICsNCiAgdGhlbWUoDQogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSwgc2l6ZSA9IDIwKSwgICAgICAgICAjIExhcmdlciB0aXRsZSBmb250DQogICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCksICAgICAgICAgICAgICAgICAgICAjIExhcmdlciB4LWF4aXMgbGFiZWwgZm9udA0KICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQpLCAgICAgICAgICAgICAgICAgICAgIyBMYXJnZXIgeS1heGlzIGxhYmVsIGZvbnQNCiAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEsIHNpemUgPSAxNCksICAjIExhcmdlciB4LWF4aXMgdGV4dA0KICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCksICAgICAgICAgICAgICAgICAgICAgIyBMYXJnZXIgeS1heGlzIHRleHQNCiAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0KSwgICAgICAgICAgICAgICAgICAgICMgTGVnZW5kIHRpdGxlIHNpemUNCiAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIpLCAgICAgICAgICAgICAgICAgICAgICMgTGVnZW5kIHRleHQgc2l6ZQ0KICAgIHBhbmVsLmdyaWQubWFqb3IgPSBlbGVtZW50X2xpbmUobGluZXR5cGUgPSAiZG90dGVkIiwgY29sb3IgPSAiYmxhY2siKSwgICMgTWFqb3IgZ3JpZCBsaW5lcw0KICAgIHBhbmVsLmdyaWQubWlub3IueCA9IGVsZW1lbnRfYmxhbmsoKSwgICAgICAgICAgICAgICAgICAgICAgIyBObyBtaW5vciB4IGdyaWQgbGluZXMNCiAgICBheGlzLnRpY2tzLmxlbmd0aCA9IHVuaXQoLTAuMjUsICJjbSIpLCAgICAgICAgICAgICAgICAgICAgICAjIEluY3JlYXNlIHRpY2sgbGVuZ3RoDQogICAgYXhpcy50aWNrcyA9IGVsZW1lbnRfbGluZShjb2xvciA9ICJibGFjayIsIHNpemUgPSAwLjUwKSwgICAjIERhcmtlciB0aWNrcw0KICAgIGF4aXMubGluZS54ID0gZWxlbWVudF9saW5lKGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDAuNzUpLCAgIyBEYXJrIGJvdHRvbSBib3JkZXINCiAgICBheGlzLmxpbmUueSA9IGVsZW1lbnRfbGluZShjb2xvciA9ICJibGFjayIsIHNpemUgPSAwLjc1KSAgICMgRGFyayBsZWZ0IGJvcmRlcg0KICApDQoNCiMgUHJpbnQgdGhlIHBsb3QgDQpwcmludChwMSkNCmBgYA0KDQojIyMjIFNob3J0LVRlcm0NCg0KYGBge3IgdnRpX3Jhd19jYWdyX2dyYXBoc19zaG9ydCwgZmlnLndpZHRoPTEwLCBmaWcuaGVpZ2h0PTd9DQoNCmNhdCgiXG5cbiMjIyMgQ29tcG91bmQgQXZlcmFnZSBHcm93dGggUmF0ZXMgQWNyb3NzIFNob3J0LVRlcm0gUm9sbGluZyBQZXJpb2RzIFxuIikNCg0KIyBGaWx0ZXIgZGF0YSBmb3IgU2hvcnQtVGVybSBDQUdSICg1LVllYXIgYW5kIDEwLVllYXIpDQpzaG9ydHRlcm1fZGF0YSA8LSBucnRfbG9uZyAlPiUNCiAgZmlsdGVyKENBR1JfUGVyaW9kICVpbiUgYygiNS1ZZWFyIENBR1IiLCAiMTAtWWVhciBDQUdSIikpDQoNCg0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiMjIFBMT1QgRlVMTCBXSVRIT1VUIExJTUlUUw0KDQojIERlZmluZSBzdGFydCBhbmQgZW5kIHllYXJzDQpzdGFydF95ZWFyIDwtIDIwMDUNCmVuZF95ZWFyIDwtIDIwMjQNCnllYXJfcmFuZ2UgPC0gZW5kX3llYXIgLSBzdGFydF95ZWFyICsgMSAgIyBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiB5ZWFycw0KDQojIERlZmluZSBicmVha3Mgcm91bmRlZCBhcHByb3ByaWF0ZWx5DQpsaW1pdHNfc3RhcnRfeWVhciA8LSBmbG9vcihzdGFydF95ZWFyIC8gNSkgKiA1ICAjIFJvdW5kIGRvd24gdG8gdGhlIG5lYXJlc3QgbXVsdGlwbGUgb2YgNQ0KbGltaXRzX2VuZF95ZWFyIDwtIGNlaWxpbmcoZW5kX3llYXIgLyA1KSAqIDUgICAjIFJvdW5kIHVwIHRvIHRoZSBuZWFyZXN0IG11bHRpcGxlIG9mIDUNCg0KIyBDcmVhdGUgZHluYW1pYyB0aXRsZSBhbmQgY2FwdGlvbg0KZHluYW1pY190aXRsZSA8LSBwYXN0ZTAoIkNBR1IgQWNyb3NzIFNob3J0LVRlcm0gUGVyaW9kcyBPdmVyICIseWVhcl9yYW5nZSwgIiBZZWFycyAoIiwgc3RhcnRfeWVhciwgIi0iLCBlbmRfeWVhciwgIikiKQ0KZHluYW1pY19jYXB0aW9uIDwtIHBhc3RlMCgiVlRJIENvbXBvdW5kIEF2ZXJhZ2UgR3Jvd3RoIFJhdGVzIEFjcm9zcyBTaG9ydC1UZXJtIFJvbGxpbmcgUGVyaW9kcywgRGF0YXNldCAoIiwgbWluX3llYXIsICItIiwgbWF4X3llYXIsICIpIikNCg0KIyBDcmVhdGUgdGhlIGZ1bGwsIG5vbi1maWx0ZXJlZCB4LWF4aXMgcGxvdCB3aXRoIGR5bmFtaWMgeCBwbGFjZW1lbnQgZm9yIGFubm90YXRpb25zDQpwMV9zaG9ydHRlcm0gPC0gZ2dwbG90KHNob3J0dGVybV9kYXRhLCBhZXMoeCA9IGFzLmludGVnZXIoRGF0ZSksIHkgPSBDQUdSX1ZhbHVlLCBjb2xvciA9IENBR1JfUGVyaW9kKSkgKw0KDQogICMgQWRkIHNoYWRlZCBhcmVhcyBmb3IgYmFja2dyb3VuZCBlZmZlY3QNCiAgZ2VvbV9yZWN0KGFlcyh4bWluID0gLUluZiwgeG1heCA9IEluZiwgeW1pbiA9IHRhcmdldF9hZ2dyZXNzaXZlLCB5bWF4ID0gSW5mKSwgZmlsbCA9ICJsaWdodGdyZWVuIiwgYWxwaGEgPSAwLjAxMCkgKw0KICBnZW9tX3JlY3QoYWVzKHhtaW4gPSAtSW5mLCB4bWF4ID0gSW5mLCB5bWluID0gdGFyZ2V0X2NvbnNlcnZhdGl2ZSwgeW1heCA9IHRhcmdldF9hZ2dyZXNzaXZlKSwgZmlsbCA9ICJvcmFuZ2UiLCBhbHBoYSA9IDAuMDEpICsNCiAgZ2VvbV9yZWN0KGFlcyh4bWluID0gLUluZiwgeG1heCA9IEluZiwgeW1pbiA9IC1JbmYsIHltYXggPSB0YXJnZXRfY29uc2VydmF0aXZlKSwgZmlsbCA9ICJsaWdodGNvcmFsIiwgYWxwaGEgPSAwLjAxMCkgKw0KICANCiAgIyBQbG90IGxpbmVzIGZvciBlYWNoIENBR1IgUGVyaW9kDQogIGdlb21fbGluZShzaXplID0gMS4wLCBhbHBoYSA9IDMuMCkgKyAgICAgICAjIExpbmUgZm9yIGVhY2ggQ0FHUg0KICBnZW9tX3BvaW50KHNpemUgPSAxLjAsIGFscGhhID0gMy4wKSArICAgICAgICMgUG9pbnRzIGZvciBlYWNoIENBR1INCg0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSB0YXJnZXRfYWdncmVzc2l2ZSwgY29sb3IgPSAiZGFya2JsdWUiLCBsaW5ldHlwZSA9ICJzb2xpZCIpICsNCiAgIyBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSB0YXJnZXRfbW9kZXJhdGUsIGNvbG9yID0gImRhcmtibHVlIiwgbGluZXR5cGUgPSAic29saWQiKSArDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IHRhcmdldF9jb25zZXJ2YXRpdmUsIGNvbG9yID0gImRhcmtibHVlIiwgbGluZXR5cGUgPSAic29saWQiKSArDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IHRhcmdldF9pbmZsYXRpb24sIGNvbG9yID0gImRhcmtyZWQiLCBsaW5ldHlwZSA9ICJkYXNoZWQiKSArDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IGNhZ3JfdmFsdWUsIGNvbG9yID0gImRhcmtyZWQiLCBsaW5ldHlwZSA9ICJkYXNoZWQiKSArDQogIA0KICAjIER5bmFtaWMgcmlnaHQtYWxpZ25lZCBwbGFjZW1lbnQgZm9yIGFubm90YXRpb25zDQogIGFubm90YXRlKCJ0ZXh0IiwgeCA9IEluZiwgeSA9IHRhcmdldF9hZ2dyZXNzaXZlLCBsYWJlbCA9ICJBZ2dyZXNzaXZlIiwgDQogICAgICAgICAgIGhqdXN0ID0gMSwgdmp1c3QgPSAtMC41MCwgY29sb3IgPSAiZGFya2JsdWUiLCBzaXplID0gNCkgKw0KICAjIGFubm90YXRlKCJ0ZXh0IiwgeCA9IEluZiwgeSA9IHRhcmdldF9tb2RlcmF0ZSwgbGFiZWwgPSAiTW9kZXJhdGUiLCANCiAgIyAgICAgICAgIGhqdXN0ID0gMSwgdmp1c3QgPSAtMC41MCwgY29sb3IgPSAiZGFya2JsdWUiLCBzaXplID0gNCkgKw0KICBhbm5vdGF0ZSgidGV4dCIsIHggPSBJbmYsIHkgPSB0YXJnZXRfY29uc2VydmF0aXZlLCBsYWJlbCA9ICJDb25zZXJ2YXRpdmUiLCANCiAgICAgICAgICAgaGp1c3QgPSAxLCB2anVzdCA9ICsxLjMwLCBjb2xvciA9ICJkYXJrYmx1ZSIsIHNpemUgPSA0KSArDQogIGFubm90YXRlKCJ0ZXh0IiwgeCA9IEluZiwgeSA9IHRhcmdldF9pbmZsYXRpb24sIGxhYmVsID0gIkluZmxhdGlvbiIsIA0KICAgICAgICAgICBoanVzdCA9IDEsIHZqdXN0ID0gKzEuMzAsIGNvbG9yID0gImRhcmtyZWQiLCBzaXplID0gNCkgKw0KICBhbm5vdGF0ZSgidGV4dCIsIHggPSBJbmYsIHkgPSBjYWdyX3ZhbHVlLCBsYWJlbCA9ICJDQUdSIiwgDQogICAgICAgICAgIGhqdXN0ID0gMSwgdmp1c3QgPSAtMC41MCwgY29sb3IgPSAiZGFya3JlZCIsIHNpemUgPSA0KSArIA0KDQogIGxhYnMoDQogICAgdGl0bGUgPSBkeW5hbWljX3RpdGxlLA0KICAgIHggPSAiWWVhciIsDQogICAgeSA9ICJDQUdSIFZhbHVlICglKSIsDQogICAgY29sb3IgPSAiQ0FHUiBQZXJpb2QiLA0KICAgIGNhcHRpb24gPSBkeW5hbWljX2NhcHRpb24NCiAgICApICsNCiAgDQogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjdXN0b21fY29sb3JzW2MoIjUtWWVhciBDQUdSIiwgIjEwLVllYXIgQ0FHUiIpXSkgKw0KICBzY2FsZV94X2NvbnRpbnVvdXMoDQogICAgbGltaXRzID0gYyhzdGFydF95ZWFyLCBlbmRfeWVhciArIDEpLCANCiAgICBicmVha3MgPSBzZXEobGltaXRzX3N0YXJ0X3llYXIsIGxpbWl0c19lbmRfeWVhciArIDEgLCA1KQ0KICApICsgICMgUmVzdHJpY3QgJiBTZXQgTWFqb3IgeC1heGlzIGxpbmVzIGZvciBlYWNoIHllYXINCg0KICB0aGVtZV9taW5pbWFsKCkgKw0KICB0aGVtZSgNCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41LCBzaXplID0gMjApLCAgICAgICAgICMgTGFyZ2VyIHRpdGxlIGZvbnQNCiAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0KSwgICAgICAgICAgICAgICAgICAgICMgTGFyZ2VyIHgtYXhpcyBsYWJlbCBmb250DQogICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCksICAgICAgICAgICAgICAgICAgICAjIExhcmdlciB5LWF4aXMgbGFiZWwgZm9udA0KICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSwgc2l6ZSA9IDE0KSwgICMgTGFyZ2VyIHgtYXhpcyB0ZXh0DQogICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0KSwgICAgICAgICAgICAgICAgICAgICAjIExhcmdlciB5LWF4aXMgdGV4dA0KICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQpLCAgICAgICAgICAgICAgICAgICAgIyBMZWdlbmQgdGl0bGUgc2l6ZQ0KICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiksICAgICAgICAgICAgICAgICAgICAgIyBMZWdlbmQgdGV4dCBzaXplDQogICAgcGFuZWwuZ3JpZC5tYWpvciA9IGVsZW1lbnRfbGluZShsaW5ldHlwZSA9ICJkb3R0ZWQiLCBjb2xvciA9ICJibGFjayIpLCAgIyBNYWpvciBncmlkIGxpbmVzDQogICAgcGFuZWwuZ3JpZC5taW5vci54ID0gZWxlbWVudF9ibGFuaygpLCAgICAgICAgICAgICAgICAgICAgICAjIE5vIG1pbm9yIHggZ3JpZCBsaW5lcw0KICAgIGF4aXMudGlja3MubGVuZ3RoID0gdW5pdCgtMC4yNSwgImNtIiksICAgICAgICAgICAgICAgICAgICAgICMgSW5jcmVhc2UgdGljayBsZW5ndGgNCiAgICBheGlzLnRpY2tzID0gZWxlbWVudF9saW5lKGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDAuNTApLCAgICMgRGFya2VyIHRpY2tzDQogICAgYXhpcy5saW5lLnggPSBlbGVtZW50X2xpbmUoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMC43NSksICAjIERhcmsgYm90dG9tIGJvcmRlcg0KICAgIGF4aXMubGluZS55ID0gZWxlbWVudF9saW5lKGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDAuNzUpICAgIyBEYXJrIGxlZnQgYm9yZGVyDQogICkNCg0KIyBQcmludCB0aGUgcGxvdCANCnByaW50KHAxX3Nob3J0dGVybSkNCg0KYGBgDQoNCiMgVk9PDQoNClRoZSBWYW5ndWFyZCBTJlAgNTAwIEVURiAoVk9PKSBpcyBhbiBleGNoYW5nZS10cmFkZWQgZnVuZCAoRVRGKSBkZXNpZ25lZCB0byB0cmFjayB0aGUgcGVyZm9ybWFuY2Ugb2YgdGhlIFMmUCA1MDAgSW5kZXgsIHdoaWNoIGNvbXByaXNlcyA1MDAgb2YgdGhlIGxhcmdlc3QgcHVibGljbHkgdHJhZGVkIGNvbXBhbmllcyBpbiB0aGUgVW5pdGVkIFN0YXRlcy4gTWFuYWdlZCBieSBWYW5ndWFyZCwgVk9PIHByb3ZpZGVzIGludmVzdG9ycyB3aXRoIGV4cG9zdXJlIHRvIGEgZGl2ZXJzZSByYW5nZSBvZiBzZWN0b3JzLCBpbmNsdWRpbmcgdGVjaG5vbG9neSwgaGVhbHRoY2FyZSwgY29uc3VtZXIgZ29vZHMsIGFuZCBmaW5hbmNpYWxzLg0KDQpWT08gaXMga25vd24gZm9yIGl0cyBsb3cgZXhwZW5zZSByYXRpbywgbWFraW5nIGl0IGEgY29zdC1lZmZlY3RpdmUgb3B0aW9uIGZvciBpbnZlc3RvcnMgc2Vla2luZyB0byBtaXJyb3IgdGhlIHBlcmZvcm1hbmNlIG9mIHRoZSBVLlMuIHN0b2NrIG1hcmtldOKAmXMgbGFyZ2UtY2FwIHNlZ21lbnQuIEFzIG9uZSBvZiB0aGUgbGFyZ2VzdCBhbmQgbW9zdCBsaXF1aWQgRVRGcywgVk9PIG9mZmVycyBhIHN0cmFpZ2h0Zm9yd2FyZCBhbmQgZWZmaWNpZW50IHdheSB0byBpbnZlc3QgaW4gdGhlIG92ZXJhbGwgVS5TLiBlY29ub215LiBJdCBpcyBwYXJ0aWN1bGFybHkgcG9wdWxhciBmb3IgZGl2ZXJzaWZpY2F0aW9uIGFuZCBzdGVhZHkgZ3Jvd3RoLg0KDQoNCiMjIFZPTyBHUg0KDQojIyMgRGF0YQ0KDQpUaGUgVk9PIERhdGEgcHJlc2VudGVkIGhlcmUgaXMgc291cmNlZCBmcm9tIFlhaG9vIEZpbmFuY2UsIGZpbHRlcmVkIHRvIGRpc3BsYXkgTW9udGhseSBIaXN0b3JpY2FsIERhdGEgKGUuZy4sIDAzLzAxLzIwMjQpLiBUaGlzIGRhdGEgcmVwcmVzZW50cyB0aGUgY2xvc2luZyBwcmljZSBvZiB0aGUgbGFzdCB0cmFkaW5nIGRheSBvZiBlYWNoIG1vbnRoIChlLmcuLCAwMy8yOC8yMDI0KS4gUGxlYXNlIG5vdGUgdGhhdCB0aGUgc3RhdGlzdGljcyBwcmVzZW50ZWQgaGVyZSBtYXkgZGlmZmVyIGZyb20gdGhvc2UgaW4gWWFob28gRmluYW5jZSdzIFBlcmZvcm1hbmNlIHNlY3Rpb24gZHVlIHRvIGRpZmZlcmVuY2VzIGluIGRhdGEgYWdncmVnYXRpb24gYW5kIGNhbGN1bGF0aW9uIG1ldGhvZHMuICANCg0KRGF0YSBTb3VyY2U6IGByIG5ydiRzb3VyY2Vfdm9vX3lhaG9vYA0KDQpgYGB7ciB2b29fcmF3LCBldmFsPVRSVUUsIGVjaG89RkFMU0V9DQoNCiMgRGlzcGxheSB0aGUgc3RydWN0dXJlIG9mIHRoZSBkYXRhc2V0IHRvIGNvbmZpcm0gY29sdW1uIG5hbWVzDQppbnRlcmFjdGl2ZV9zdHIobnJ0JHZvb19yYXcpDQoNCmxpYnJhcnkoZHBseXIpDQpsaWJyYXJ5KGx1YnJpZGF0ZSkgICMgRm9yIGRhdGUgbWFuaXB1bGF0aW9uDQpsaWJyYXJ5KHNjYWxlcykNCmxpYnJhcnkoc3RyaW5ncikNCg0KIyBFbnN1cmUgdGhlICdEYXRlJyBjb2x1bW4gaXMgb2YgRGF0ZSBjbGFzcw0Kdm9vX3JhdyA8LSBucnQkdm9vX3JhdyAlPiUNCiAgbXV0YXRlKERhdGUgPSBhcy5EYXRlKERhdGUsIGZvcm1hdCA9ICIlWS0lbS0lZCIpKQ0KDQojIEZpbmQgdGhlIG1pbmltdW0gYW5kIG1heGltdW0geWVhcg0KbWluX3llYXIgPC0gZm9ybWF0KG1pbih2b29fcmF3JERhdGUsIG5hLnJtID0gVFJVRSksICIlWSIpDQptYXhfeWVhciA8LSBmb3JtYXQobWF4KHZvb19yYXckRGF0ZSwgbmEucm0gPSBUUlVFKSwgIiVZIikNCmludGVyYWN0aXZlX3ByaW50KG1pbl95ZWFyKQ0KaW50ZXJhY3RpdmVfcHJpbnQobWF4X3llYXIpDQoNCiMgVXBkYXRlIGRhdGEgZnJhbWUgd2l0aCBwcm9wZXIgZGF0ZSBhbmQgcGVyY2VudGFnZSBoYW5kbGluZw0Kdm9vX3JhdyA8LSB2b29fcmF3ICU+JQ0KICBtdXRhdGUoDQogICAgIyBDb252ZXJ0IENsb3NlIERhdGUgdG8gIllZWVktTU0tREQiIGZvcm1hdA0KICAgIGBEYXRlYCA9IGZvcm1hdChhcy5EYXRlKGFzLmNoYXJhY3RlcihgRGF0ZWApLCBvcmlnaW4gPSAiMTk3MC0wMS0wMSIpLCAiJVktJW0tJWQiKSwNCg0KICAgICMgRW5zdXJlIENsb3NlIGlzIGEgbnVtYmVyIGZvcm1hdHRlZCB0byAyIGRlY2ltYWwgcGxhY2VzDQogICAgYENsb3NlYCA9IG51bWJlcihhcy5udW1lcmljKGdzdWIoIiwiLCAiIiwgQ2xvc2UpKSwgYmlnLm1hcmsgPSAiLCIsIGRlY2ltYWwubWFyayA9ICIuIiwgYWNjdXJhY3kgPSAwLjAxKSwNCg0KICAgICMgQ2xlYW4gYW5kIGhhbmRsZSBwZXJjZW50YWdlIGNvbHVtbnMNCiAgICBhY3Jvc3MoMzozLCB+IHsNCiAgICAgIHZhbHVlIDwtIGdzdWIoIlssJVxcc10iLCAiIiwgLikgICMgUmVtb3ZlICUsIGNvbW1hcywgYW5kIHNwYWNlcw0KICAgICAgbnVtZXJpY192YWx1ZSA8LSBzdXBwcmVzc1dhcm5pbmdzKGFzLm51bWVyaWModmFsdWUpKSAgIyBDb252ZXJ0IHRvIG51bWVyaWMNCiAgICAgIGlmZWxzZSgNCiAgICAgICAgIWlzLm5hKG51bWVyaWNfdmFsdWUpLCANCiAgICAgICAgcGFzdGUwKGZvcm1hdChyb3VuZChudW1lcmljX3ZhbHVlKjEwMCwgMiksIGJpZy5tYXJrID0gIiwiLCBzY2llbnRpZmljID0gRkFMU0UpLCAiJSIpLCAgIyBGb3JtYXQgdG8gMiBkZWNpbWFsIHBsYWNlcyBhbmQgYWRkIGNvbW1hcw0KICAgICAgICAuDQogICAgICApDQogICAgfSkNCiAgKSAlPiUNCiAgYXJyYW5nZShkZXNjKGBEYXRlYCkpICAjIFNvcnQgYnkgRGF0ZSBmcm9tIG5ld2VzdCB0byBvbGRlc3QNCg0KIyBEaXNwbGF5IHRoZSBmb3JtYXR0ZWQgZGF0YQ0KaW50ZXJhY3RpdmVfc3RyKHZvb19yYXcpDQppbnRlcmFjdGl2ZV9wcmludCh2b29fcmF3KQ0KDQojIERpc3BsYXkgdGhlIHRhYmxlIHdpdGggY2FwdGlvbg0KY2F0KCJcblxuIyMjIyBWT08gWWVhcmx5IFBlcmZvcm1hbmNlICgiLCBtaW5feWVhciwgIi0iLCBtYXhfeWVhciwgIilcbiIsIHNlcCA9ICIiKQ0KZm9ybWF0X2VxdWFsX3dpZHRoX2dyb3VwZWQodm9vX3JhdywgZ3JvdXBpbmdfZmFjdG9yID0gMikNCiMgY2F0KCJcblxuIFNvdXJjZTogIiwgbnJ2JHNvdXJjZV92b29feWFob28sICJcbiIpDQoNCmBgYA0KDQojIyMgU3VtbWFyeQ0KDQpgYGB7ciB2b29fcmF3X3N1bW1hcnksIGV2YWw9VFJVRSwgZWNobz1GQUxTRX0NCg0KIyBMb2FkIG5lY2Vzc2FyeSBsaWJyYXJpZXMNCmxpYnJhcnkoZHBseXIpDQpsaWJyYXJ5KHRpYmJsZSkNCmxpYnJhcnkoa25pdHIpDQpsaWJyYXJ5KGthYmxlRXh0cmEpDQoNCmludGVyYWN0aXZlX3N0cih2b29fcmF3KQ0KaW50ZXJhY3RpdmVfcHJpbnQodm9vX3JhdykNCg0KIyBFbnN1cmUgdGhlIERhdGUgY29sdW1uIGlzIGEgcHJvcGVyIERhdGUgb2JqZWN0IGFuZCBleHRyYWN0IHRoZSB5ZWFyDQp2b29fcmF3IDwtIHZvb19yYXcgJT4lDQogIHNsaWNlKC0xKSAlPiUgIyBSZW1vdmUgdGhlIGZpcnN0IHJvdw0KICAjIG11dGF0ZShEYXRlID0gaWZlbHNlKHJvd19udW1iZXIoKSA9PSAxLCAiMjAyNS0wMS0wMSIsIERhdGUpKSAlPiUNCiAgbXV0YXRlKA0KICAgIERhdGUgPSBhcy5udW1lcmljKGZvcm1hdChhcy5EYXRlKERhdGUsIGZvcm1hdCA9ICIlWS0lbS0lZCIpLCAiJVkiKSksDQogICAgYDEtWWVhciBDQUdSYCA9IGFzLm51bWVyaWMoZ3N1YigiW14wLTkuLV0iLCAiIiwgYDEtWWVhciBDQUdSYCkpDQogICkNCg0KIyBTb3J0IGRhdGEgYnkgRGF0ZSBpbiBhc2NlbmRpbmcgb3JkZXINCnZvb19yYXcgPC0gdm9vX3JhdyAlPiUNCiAgYXJyYW5nZShEYXRlKQ0KDQoNCiMgQ2FsY3VsYXRlIHRoZSBDQUdSIGFuZCBkeW5hbWljYWxseSBjcmVhdGUgYSB2YXJpYWJsZSBuYW1lIHdpdGggdGhlIGZvcm1hdCB2b29fY2Fncl92YWx1ZV9zPG1pbl95ZWFyPl9lPG1heF95ZWFyPg0KaW5pdGlhbF92YWx1ZSA8LSAxMDAgICMgQXNzdW1pbmcgYW4gaW5pdGlhbCBpbmRleCB2YWx1ZSBvZiAxMDANCmZpbmFsX3ZhbHVlIDwtIGluaXRpYWxfdmFsdWUgKiBwcm9kKDEgKyB2b29fcmF3JGAxLVllYXIgQ0FHUmAgLyAxMDAsIG5hLnJtID0gVFJVRSkNCm1pbl95ZWFyIDwtIG1pbih2b29fcmF3JERhdGUsIG5hLnJtID0gVFJVRSkNCm1heF95ZWFyIDwtIG1heCh2b29fcmF3JERhdGUsIG5hLnJtID0gVFJVRSkNCm51bV95ZWFycyA8LSBtYXhfeWVhciAtIG1pbl95ZWFyDQpjYWdyX3ZhbHVlIDwtIHJvdW5kKCgoZmluYWxfdmFsdWUgLyBpbml0aWFsX3ZhbHVlKV4oMSAvIG51bV95ZWFycykgLSAxKSAqIDEwMCwgMikNCnZhcl9uYW1lIDwtIHBhc3RlMCgidm9vX2NhZ3JfdmFsdWVfcyIsIG1pbl95ZWFyLCAiX2UiLCBtYXhfeWVhcikNCmFzc2lnbih2YXJfbmFtZSwgY2Fncl92YWx1ZSkNCg0KIyBDb252ZXJ0IFZPTyBkYXRhIHRvIG51bWVyaWMsIHJlbW92aW5nIGFueSBwZXJjZW50YWdlIHNpZ25zDQpkYXRhIDwtIGFzLm51bWVyaWMoZ3N1YigiJSIsICIiLCB2b29fcmF3JGAxLVllYXIgQ0FHUmApKQ0KDQojIENhbGN1bGF0ZSBzdGF0aXN0aWNzDQpjb3VudF9vYnNlcnZhdGlvbnMgPC0gc3VtKCFpcy5uYShkYXRhKSkNCm1lYW5fdmFsdWUgPC0gcm91bmQobWVhbihkYXRhLCBuYS5ybSA9IFRSVUUpLCAyKQ0KbWVkaWFuX3ZhbHVlIDwtIHJvdW5kKG1lZGlhbihkYXRhLCBuYS5ybSA9IFRSVUUpLCAyKQ0Kc2RfdmFsdWUgPC0gcm91bmQoc2QoZGF0YSwgbmEucm0gPSBUUlVFKSwgMikNCm1pbl9jYWdyX3JhbmdlIDwtIHJvdW5kKGNhZ3JfdmFsdWUgLSBzZF92YWx1ZSwgMikNCm1heF9jYWdyX3JhbmdlIDwtIHJvdW5kKGNhZ3JfdmFsdWUgKyBzZF92YWx1ZSwgMikNCm1pbl92YWx1ZSA8LSByb3VuZChtaW4oZGF0YSwgbmEucm0gPSBUUlVFKSwgMikNCm1heF92YWx1ZSA8LSByb3VuZChtYXgoZGF0YSwgbmEucm0gPSBUUlVFKSwgMikNCg0KIyBUYXJnZXQgUmF0ZSBBbmFseXNpcyAtIFJlZmVyIHRvICJQcmVmZXJyZWQgVGFyZ2V0cyIgb3IgaW5jbHVkZSBiZWxvdyBmb3IgaW5kaXZpZHVhbCBjaGFuZ2VzLg0KYWJvdmVfdGFyZ2V0X2luZmxhdGlvbiA8LSBzdW0oZGF0YSA+PSB0YXJnZXRfaW5mbGF0aW9uLCBuYS5ybSA9IFRSVUUpDQphYm92ZV90YXJnZXRfY29uc2VydmF0aXZlIDwtIHN1bShkYXRhID49IHRhcmdldF9jb25zZXJ2YXRpdmUsIG5hLnJtID0gVFJVRSkNCmFib3ZlX3RhcmdldF9tb2RlcmF0ZSA8LSBzdW0oZGF0YSA+PSB0YXJnZXRfbW9kZXJhdGUsIG5hLnJtID0gVFJVRSkNCmFib3ZlX3RhcmdldF9hZ2dyZXNzaXZlIDwtIHN1bShkYXRhID49IHRhcmdldF9hZ2dyZXNzaXZlLCBuYS5ybSA9IFRSVUUpDQoNCnBlcmNlbnRfYWJvdmVfdGFyZ2V0X2NvbnNlcnZhdGl2ZSA8LSByb3VuZCgoYWJvdmVfdGFyZ2V0X2NvbnNlcnZhdGl2ZSAvIGNvdW50X29ic2VydmF0aW9ucykgKiAxMDAsIDIpDQpwZXJjZW50X2Fib3ZlX3RhcmdldF9pbmZsYXRpb24gPC0gcm91bmQoKGFib3ZlX3RhcmdldF9pbmZsYXRpb24gLyBjb3VudF9vYnNlcnZhdGlvbnMpICogMTAwLCAyKQ0KcGVyY2VudF9hYm92ZV90YXJnZXRfbW9kZXJhdGUgPC0gcm91bmQoKGFib3ZlX3RhcmdldF9tb2RlcmF0ZSAvIGNvdW50X29ic2VydmF0aW9ucykgKiAxMDAsIDIpDQpwZXJjZW50X2Fib3ZlX3RhcmdldF9hZ2dyZXNzaXZlIDwtIHJvdW5kKChhYm92ZV90YXJnZXRfYWdncmVzc2l2ZSAvIGNvdW50X29ic2VydmF0aW9ucykgKiAxMDAsIDIpDQoNCiMgQ29tcGlsZSBzdGF0aXN0aWNzIGludG8gYSBsaXN0IGZvciBlYXN5IGNvbnZlcnNpb24gdG8gYSBkYXRhIGZyYW1lIHdpdGggZGVmaW5pdGlvbnMNCnZvb19yYXdfc3VtbWFyeSA8LSB0cmliYmxlKA0KICB+U3RhdGlzdGljLCB+VmFsdWUsIH5EZWZpbml0aW9uLA0KICAiQ291bnQgb2YgT2JzZXJ2YXRpb25zIiwgYXMuY2hhcmFjdGVyKGNvdW50X29ic2VydmF0aW9ucyksICJUb3RhbCBudW1iZXIgb2YgZGF0YSBwb2ludHMgY29sbGVjdGVkIG92ZXIgdGhlIHNwZWNpZmljIHBlcmlvZC4iLA0KICAiQ0FHUiIsIHBhc3RlMChjYWdyX3ZhbHVlLCAiJSIpLCAiQ29tcG91bmQgQXZlcmFnZSBHcm93dGggUmF0ZTsgbWVhbiBncm93dGggcmF0ZSBvdmVyIGEgcGVyaW9kIGlmIGl0IGhhZCBjb21wb3VuZGVkIGFudWFsbHkuIiwNCiAgIk1lYW4iLCBwYXN0ZTAobWVhbl92YWx1ZSwgIiUiKSwgIlJlZmxlY3RzIHRoZSBnZW5lcmFsIHByaWNlIGxldmVsIGFuZCBvdmVyYWxsIGdyb3d0aCByYXRlLiIsDQogICJNZWRpYW4iLCBwYXN0ZTAobWVkaWFuX3ZhbHVlLCAiJSIpLCAiTWlkZGxlIHZhbHVlIG9mIHRoZSBkYXRhIHdoZW4gb3JkZXJlZCBjaHJvbm9sb2dpY2FsbHk7IGNlbnRyYWwgdGVuZGVuY3kgbWVhc3VyZSBsZXNzIGFmZmVjdGVkIGJ5IGV4dHJlbWUgdmFsdWVzLiIsDQogICJTdGFuZGFyZCBEZXZpYXRpb24gKFZvbGF0aWxpdHkpIiwgcGFzdGUwKHNkX3ZhbHVlLCAiJSIpLCAiVGhlIGRpc3BlcnNpb24gb2YgdmFsdWVzIGZyb20gdGhlIG1lYW4sIGluZGljYXRpbmcgdGhlIHZvbGF0aWxpdHkgb2YgcHJpY2UgY2hhbmdlcyBhbmQgZWNvbm9taWMgc3RhYmlsaXR5LiIsDQogICJNaW4gQ0FHUiBSYW5nZSAoQ0FHUiAtIFNEKSIsIHBhc3RlMChtaW5fY2Fncl9yYW5nZSwgIiUiKSwgIkxvd2VyIGJvdW5kYXJ5IG9mIGV4cGVjdGVkIFZPTyByYW5nZTsgbG93ZXN0IGVzdGltYXRlIG9mIHR5cGljYWwgZ3Jvd3RoIHJhdGUgY29uc2lkZXJpbmcgbm9ybWFsIGZsdWN0dWF0aW9ucy4iLA0KICAiTWF4IENBR1IgUmFuZ2UgKENBR1IgKyBTRCkiLCBwYXN0ZTAobWF4X2NhZ3JfcmFuZ2UsICIlIiksICJVcHBlciBib3VuZGFyeSBvZiBleHBlY3RlZCBWT08gcmFuZ2U7IGhpZ2hlc3QgZXN0aW1hdGUgb2YgdHlwaWNhbCBncm93dGggcmF0ZSBjb25zaWRlcmluZyBub3JtYWwgZmx1Y3R1YXRpb25zLiIsDQogICJNaW5pbXVtIiwgcGFzdGUwKG1pbl92YWx1ZSwgIiUiKSwgIkxvd2VzdCBncm93dGggcmF0ZS4iLA0KICAiTWF4aW11bSIsIHBhc3RlMChtYXhfdmFsdWUsICIlIiksICJIaWdoZXN0IGdyb3d0aCByYXRlLiIsDQogICJQZXJjZW50IEFib3ZlIEluZmxhdGlvbiBUYXJnZXQiLCBwYXN0ZTAocGVyY2VudF9hYm92ZV90YXJnZXRfaW5mbGF0aW9uLCAiJSIpLCAiUGVyY2VudGFnZSBvZiB2YWx1ZXMgYWJvdmUgdGhlIGluZmxhdGlvbiB0YXJnZXQgc3BlY2lmaWVkIGluIFByZWZlcnJlZCBUYXJnZXRzIHNlY3Rpb24uIiwNCiAgIlBlcmNlbnQgQWJvdmUgQ29uc2VydmF0aXZlIFRhcmdldCIsIHBhc3RlMChwZXJjZW50X2Fib3ZlX3RhcmdldF9jb25zZXJ2YXRpdmUsICIlIiksICJQZXJjZW50YWdlIG9mIHZhbHVlcyBhYm92ZSB0aGUgY29uc2VydmF0aXZlIHRhcmdldCBzcGVjaWZpZWQgaW4gUHJlZmVycmVkIFRhcmdldHMgc2VjdGlvbi4iLA0KICAiUGVyY2VudCBBYm92ZSBNb2RlcmF0ZSBUYXJnZXQiLCBwYXN0ZTAocGVyY2VudF9hYm92ZV90YXJnZXRfbW9kZXJhdGUsICIlIiksICJQZXJjZW50YWdlIG9mIHZhbHVlcyBhYm92ZSB0aGUgbW9kZXJhdGUgdGFyZ2V0IHNwZWNpZmllZCBpbiBQcmVmZXJyZWQgVGFyZ2V0cyBzZWN0aW9uLiIsDQogICJQZXJjZW50IEFib3ZlIEFnZ3Jlc3NpdmUgVGFyZ2V0IiwgcGFzdGUwKHBlcmNlbnRfYWJvdmVfdGFyZ2V0X2FnZ3Jlc3NpdmUsICIlIiksICJQZXJjZW50YWdlIG9mIHZhbHVlcyBhYm92ZSB0aGUgYWdncmVzc2l2ZSB0YXJnZXQgc3BlY2lmaWVkIGluIFByZWZlcnJlZCBUYXJnZXRzIHNlY3Rpb24uIg0KKQ0KDQojIENvbnZlcnQgdG8gY2hhcmFjdGVyIHRvIGF2b2lkIGF1dG9tYXRpYyBkZWNpbWFsIHBvaW50cyBvbiB3aG9sZSBudW1iZXJzDQp2b29fcmF3X3N1bW1hcnkgPC0gdm9vX3Jhd19zdW1tYXJ5ICU+JQ0KICBtdXRhdGUoYWNyb3NzKGV2ZXJ5dGhpbmcoKSwgYXMuY2hhcmFjdGVyKSkNCg0KIyBEaXNwbGF5IGZvcm1hdHRlZCB0YWJsZQ0KY2F0KCJcblxuIyMjIyBBbm51YWwgR3Jvd3RoIFJhdGUgU3VtbWFyeSAoIiwgbWluX3llYXIsICItIiwgbWF4X3llYXIsICIpXG4iLCBzZXAgPSAiIikNCmZvcm1hdF8zY29sX2N1c3RvbV93aWR0aHModm9vX3Jhd19zdW1tYXJ5LCBjb2wxX3dpZHRoID0gIjIwZW0iLCBjb2wyX3dpZHRoID0gIjEwZW0iLCBjb2wzX3dpZHRoID0gIjQwZW0iKSANCg0KIyBWaWV3KHZvb19yYXdfc3VtbWFyeSkNCmludGVyYWN0aXZlX3N0cih2b29fcmF3X3N1bW1hcnkpDQoNCmBgYA0KDQpWT08ncyBJbmRleCBleGhpYml0cyBhIGByIGlmKGNhZ3JfdmFsdWUgPiB0YXJnZXRfYWdncmVzc2l2ZSkgImFnZ3Jlc3NpdmUiIGVsc2UgaWYoY2Fncl92YWx1ZSA+IHRhcmdldF9tb2RlcmF0ZSkgIm1vZGVyYXRlIiBlbHNlIGlmKGNhZ3JfdmFsdWUgPiB0YXJnZXRfY29uc2VydmF0aXZlKSAiY29uc2VydmF0aXZlIiBlbHNlIGlmKGNhZ3JfdmFsdWUgPiB0YXJnZXRfaW5mbGF0aW9uKSAiYmFzZWxpbmUiIGVsc2UgImRpc2FwcG9pbnRpbmciYCBDQUdSIGF0IGByIGNhZ3JfdmFsdWVgJSwgYHIgaWYoY2Fncl92YWx1ZSA8IG1lYW5fdmFsdWUpICJsb3dlciB0aGFuIiBlbHNlICJoaWdoZXIgdGhhbiJgIHRoZSBtZWFuIGdyb3d0aCByYXRlIG9mIGByIG1lYW5fdmFsdWVgJSwgcmVmbGVjdGluZyB0aGUgaW1wYWN0IG9mIHNob3J0LXRlcm0gdm9sYXRpbGl0eSBhbmQgYHIgaWYoY2Fncl92YWx1ZSA+IG1lYW5fdmFsdWUpICJkZWNsaW5lcyIgZWxzZSAiZ3Jvd3RoIHNwaWtlcyJgLiBUaGUgbWVkaWFuIHJldHVybiBvZiBgciBtZWRpYW5fdmFsdWVgJSBpbmRpY2F0ZXMgdGhhdCBtb3JlIHRoYW4gaGFsZiBvZiB0aGUgb2JzZXJ2ZWQgeWVhcnMgZXhwZXJpZW5jZWQgcmV0dXJucyBgciBpZihjYWdyX3ZhbHVlIDwgbWVkaWFuX3ZhbHVlKSAiYWJvdmUiIGVsc2UgImJlbG93ImAgdGhlIG1lYW4uIFRoZSByZWxhdGlvbnNoaXAgYmV0d2VlbiB0aGUgQ0FHUiBhbmQgdGhlIG1lZGlhbiBncm93dGggcmF0ZSBzdWdnZXN0cyB0aGF0IHN1c3RhaW5lZCBwZXJpb2RzIG9mIGFib3ZlLW1lZGlhbiBncm93dGggaGF2ZSBleGVydGVkIGN1bXVsYXRpdmUgYHIgaWYoY2Fncl92YWx1ZSA8IG1lZGlhbl92YWx1ZSkgInVwd2FyZCBwcmVzc3VyZSIgZWxzZSAiZG93bndhcmQgcHJlc3N1cmUiYCBvbiBvdmVyYWxsIHByaWNlIGxldmVscy4gVGhpcyByZWxhdGlvbnNoaXAgaGlnaGxpZ2h0cyBhIGRpc3RyaWJ1dGlvbiB3aXRoIG5vdGFibGUgZXh0cmVtZXMgb24gdGhlIGByIGlmKGNhZ3JfdmFsdWUgPCBtZWFuX3ZhbHVlKSAiaGlnaGVyIiBlbHNlICJsb3dlciJgIGVuZCwgcmVmbGVjdGluZyBgciBpZihjYWdyX3ZhbHVlIDwgbWVhbl92YWx1ZSkgInBvc2l0aXZlIiBlbHNlICJuZWdhdGl2ZSJgIHNrZXduZXNzLiBUaGlzIGByIGlmKGNhZ3JfdmFsdWUgPCBtZWRpYW5fdmFsdWUpICJwb3NpdGl2ZSIgZWxzZSAibmVnYXRpdmUiYCBza2V3bmVzcyBpbXBsaWVzIHRoYXQgd2hpbGUgbW9yZSB0aGFuIGhhbGYgb2YgdGhlIG9ic2VydmVkIHllYXJzIGV4cGVyaWVuY2VkIHJldHVybnMgYHIgaWYoY2Fncl92YWx1ZSA8IG1lZGlhbl92YWx1ZSkgImFib3ZlIHRoZSBtZWFuLCBkb3dudHVybnMgY2FuIGJlIHNldmVyZSIgZWxzZSAiYmVsb3cgdGhlIG1lYW4sIHVwdHVybnMgY2FuIGJlIHNpZ25pZmljYW50ImAuIEhvd2V2ZXIsIHRoZSBtYXJrZXQgaGFzIGhpc3RvcmljYWxseSBwcm92aWRlZCBzdWJzdGFudGlhbCBgciBpZihjYWdyX3ZhbHVlIDwgbWVkaWFuX3ZhbHVlKSAidXBzaWRlIHBvdGVudGlhbCIgZWxzZSAiZG93bnNpZGUgcmlzayJgLiBBZGRpdGlvbmFsbHksIHRoZSBmYWN0IHRoYXQgYHIgcGVyY2VudF9hYm92ZV90YXJnZXRfaW5mbGF0aW9uYCUgb2YgdGhlIHllYXJzIGV4Y2VlZGVkIHRoZSBpbmZsYXRpb24gdGFyZ2V0IGByIGlmIChwZXJjZW50X2Fib3ZlX3RhcmdldF9pbmZsYXRpb24gPiA3MCkgInJlaW5mb3JjZXMgVk9PJ3MgZWZmZWN0aXZlbmVzcyBhcyBhIHN0cm9uZyBsb25nLXRlcm0gaGVkZ2UiIGVsc2UgaWYgKHBlcmNlbnRfYWJvdmVfdGFyZ2V0X2luZmxhdGlvbiA+IDYwKSAicmVpbmZvcmNlcyBWT08ncyBlZmZlY3RpdmVuZXNzIGFzIGEgbG9uZy10ZXJtIGhlZGdlIiBlbHNlIGlmIChwZXJjZW50X2Fib3ZlX3RhcmdldF9pbmZsYXRpb24gPiA1MCkgInF1ZXN0aW9ucyBWT08ncyBlZmZlY3RpdmVuZXNzICBhcyBhIGxvbmctdGVybSBoZWRnZSIgZWxzZSAidW5kZXJtaW5lcyBWT08ncyBlZmZlY3RpdmVuZXNzIGFzIGEgbG9uZy10ZXJtIGhlZGdlImAgYWdhaW5zdCBpbmZsYXRpb24uDQoNClRoZSBzdGFuZGFyZCBkZXZpYXRpb24gb2YgYHIgc2RfdmFsdWVgJSBgciBpZihzZF92YWx1ZSA+IDIwKSAiaW5kaWNhdGVzIGV4dHJlbWUgdm9sYXRpbGl0eSwgcmVmbGVjdGluZyBzdWJzdGFudGlhbCBmbHVjdHVhdGlvbnMgaW4gZXF1aXR5IG1hcmtldHMiIGVsc2UgaWYoc2RfdmFsdWUgPiAxNSkgInVuZGVyc2NvcmVzIHNpZ25pZmljYW50IHZvbGF0aWxpdHksIGEgY29tbW9uIGZlYXR1cmUgb2YgZXF1aXR5IG1hcmtldHMiIGVsc2UgInN1Z2dlc3RzIG1vZGVyYXRlIHZvbGF0aWxpdHksIHR5cGljYWwgb2YgcmVsYXRpdmVseSBzdGFibGUgbWFya2V0cyJgLiBUaGUgYHIgcmFuZ2VfcmF0aW8gPC0gKG1heF92YWx1ZSAtIG1pbl92YWx1ZSkgLyBzZF92YWx1ZTsgaWYocmFuZ2VfcmF0aW8gPiA1KSAiaGlnaGx5IHZvbGF0aWxlIiBlbHNlIGlmKHJhbmdlX3JhdGlvID4gMykgIm5vdGFibGUiIGVsc2UgImNvbXBhcmF0aXZlbHkgc3RhYmxlImAgcmFuZ2Ugb2YgYW5udWFsIHJldHVybnMsIHNwYW5uaW5nIGZyb20gYHIgbWluX3ZhbHVlYCUgdG8gYHIgbWF4X3ZhbHVlYCUsIGByIGlmKHJhbmdlX3JhdGlvID4gNSkgImlsbHVzdHJhdGVzIGEgaGlnaGx5IHZvbGF0aWxlIG1hcmtldCBlbnZpcm9ubWVudCwgcGFydGx5IGR1ZSB0byBpdHMgY29tcG9zaXRpb24sIHdpdGggdGhlIHBvdGVudGlhbCBmb3IgYm90aCBleHRyZW1lIGdhaW5zIGFuZCBsb3NzZXMiIGVsc2UgaWYocmFuZ2VfcmF0aW8gPiAzKSAiaGlnaGxpZ2h0cyBub3RhYmxlIG1hcmtldCB2YXJpYWJpbGl0eSwgcGFydGx5IGR1ZSB0byBpdHMgY29tcG9zaXRpb24sICByZWZsZWN0aW5nIGJvdGggb3Bwb3J0dW5pdGllcyBhbmQgcmlza3MiIGVsc2UgImluZGljYXRlcyBhIGNvbXBhcmF0aXZlbHkgc3RhYmxlIG1hcmtldCwgcGFydGx5IGR1ZSB0byBpdHMgY29tcG9zaXRpb24sIHdpdGggbGVzcyBleHRyZW1lIGFubnVhbCBmbHVjdHVhdGlvbnMiYC4gDQoNCkZvciBWT08gdG8gYmUgY29uc2lkZXJlZCBhIGhpZ2gtcGVyZm9ybWluZyBhbmQgcmVzaWxpZW50IGxvbmctdGVybSBpbnZlc3RtZW50LCBpdCB3b3VsZCBiZSBpZGVhbCB0byBleGNlZWQgdGhlIGFnZ3Jlc3NpdmUgdGFyZ2V0ICAoZS5nLiwgYHIgKHRhcmdldF9hZ2dyZXNzaXZlIC0gdGFyZ2V0X2luZmxhdGlvbilgJSBhbm51YWxpemVkIHJldHVybnMsIGFjY291bnRpbmcgZm9yIGhpZ2hlciBpbmZsYXRpb24tYWRqdXN0ZWQgcGVyZm9ybWFuY2UgZXhwZWN0YXRpb25zKSBpbiBhdCBsZWFzdCA0MCUtNTAlIG9mIHRoZSB5ZWFycy4gVGhpcyByYW5nZSByZWZsZWN0cyB0aGUgcG90ZW50aWFsIGZvciBzdHJvbmcgdXBzaWRlIGluIG1hbnkgeWVhcnMgd2hpbGUgYmFsYW5jaW5nIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgbWFya2V0cyBkbyBleHBlcmllbmNlIGRvd250dXJucy4gVGhlIGZhY3QgdGhhdCBgciBwZXJjZW50X2Fib3ZlX3RhcmdldF9hZ2dyZXNzaXZlYCUgb2YgdGhlIHllYXJzIGV4Y2VlZGVkIHRoZSBhZ2dyZXNzaXZlIHRhcmdldCBgciBpZihwZXJjZW50X2Fib3ZlX3RhcmdldF9hZ2dyZXNzaXZlID4gNTApICJpbmRpY2F0ZXMgY29uc2lzdGVudCBhbmQgcm9idXN0IGdyb3d0aCwgbWFraW5nIFZPTyBhIHN0cm9uZyBvcHRpb24gZm9yIHRob3NlIHNlZWtpbmcgYWdncmVzc2l2ZSBpbnZlc3RtZW50cy4iIGVsc2UgaWYocGVyY2VudF9hYm92ZV90YXJnZXRfYWdncmVzc2l2ZSA+IDQwKSAic3VnZ2VzdHMgdGhhdCB3aGlsZSBub3QgY29uc2lzdGVudCwgVk9PIGhhcyBoaXN0b3JpY2FsbHkgcHJvdmlkZWQgcm9idXN0IGdyb3d0aCBvdmVyIHRoZSBsb25nIHRlcm0sIG1ha2luZyBpdCBhIHZpYWJsZSBpbnZlc3RtZW50IGZvciB0aG9zZSB3aXRoIGEgaGlnaGVyIHJpc2sgdG9sZXJhbmNlLiIgZWxzZSAicmFpc2VzIGNvbmNlcm5zIGFib3V0IFZPTydzIGFiaWxpdHkgdG8gbWVldCBhZ2dyZXNzaXZlIGdyb3d0aCB0YXJnZXRzLCBtYWtpbmcgaXQgbGVzcyBzdWl0YWJsZSBmb3IgaW52ZXN0b3JzIHdpdGggaGlnaGVyIHJpc2sgdG9sZXJhbmNlLiJgDQoNCiMjIyBHcmFwaA0KDQpgYGB7ciB2b29fcmF3X2dyYXBoLCBmaWcud2lkdGg9MTAsIGZpZy5oZWlnaHQ9NywgZXZhbD1UUlVFLCBlY2hvPUZBTFNFfQ0KDQojIExvYWQgbmVjZXNzYXJ5IGxpYnJhcmllcw0KbGlicmFyeShnZ3Bsb3QyKQ0KbGlicmFyeShkcGx5cikNCg0KIyBDb252ZXJ0IGAxLVllYXIgQ0FHUmAgdG8gbnVtZXJpYyBmb3IgcGxvdHRpbmcNCnZvb19yYXcgPC0gdm9vX3JhdyAlPiUNCiAgbXV0YXRlKA0KICAgIGBEYXRlYCA9IGFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKGBEYXRlYCkpLCAgIyBFbnN1cmUgRGF0ZSBpcyBudW1lcmljDQogICAgYDEtWWVhciBDQUdSYCA9IGFzLm51bWVyaWMoZ3N1YigiJSIsICIiLCBgMS1ZZWFyIENBR1JgKSkNCiAgKQ0KDQojIEZpbmQgdGhlIG1pbmltdW0gYW5kIG1heGltdW0geC12YWx1ZSBpbiB5b3VyIGRhdGENCm1heF94IDwtIG1heChhcy5pbnRlZ2VyKHZvb19yYXckRGF0ZSksIG5hLnJtID0gVFJVRSkNCm1pbl94IDwtIG1pbihhcy5pbnRlZ2VyKHZvb19yYXckRGF0ZSksIG5hLnJtID0gVFJVRSkNCmludGVyYWN0aXZlX3ByaW50KG1heF94KSAgIyBUZXN0DQppbnRlcmFjdGl2ZV9wcmludChtaW5feCkgICMgVGVzdA0KDQojIEZpbmQgdGhlIG1pbmltdW0gYW5kIG1heGltdW0geWVhcg0KbWluX3llYXIgPC0gbWluKHZvb19yYXckRGF0ZSwgbmEucm0gPSBUUlVFKQ0KbWF4X3llYXIgPC0gbWF4KHZvb19yYXckRGF0ZSwgbmEucm0gPSBUUlVFKQ0KaW50ZXJhY3RpdmVfcHJpbnQobWluX3llYXIpDQppbnRlcmFjdGl2ZV9wcmludChtYXhfeWVhcikNCg0KDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KIyMgUExPVCBGVUxMIFdJVEhPVVQgTElNSVRTDQoNCiMgRGVmaW5lIHN0YXJ0IGFuZCBlbmQgeWVhcnMNCnN0YXJ0X3llYXIgPC0gYXMubnVtZXJpYyhtaW5feWVhcikNCmVuZF95ZWFyIDwtIDIwMjQNCnllYXJfcmFuZ2UgPC0gZW5kX3llYXIgLSBzdGFydF95ZWFyICsgMSAgIyBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiB5ZWFycw0KDQojIERlZmluZSBicmVha3Mgcm91bmRlZCBhcHByb3ByaWF0ZWx5DQpsaW1pdHNfc3RhcnRfeWVhciA8LSBmbG9vcihzdGFydF95ZWFyIC8gNSkgKiA1ICAjIFJvdW5kIGRvd24gdG8gdGhlIG5lYXJlc3QgbXVsdGlwbGUgb2YgNQ0KbGltaXRzX2VuZF95ZWFyIDwtIGNlaWxpbmcoZW5kX3llYXIgLyA1KSAqIDUgICAjIFJvdW5kIHVwIHRvIHRoZSBuZWFyZXN0IG11bHRpcGxlIG9mIDUNCg0KIyBDcmVhdGUgZHluYW1pYyB0aXRsZSBhbmQgY2FwdGlvbg0KZHluYW1pY190aXRsZSA8LSBwYXN0ZTAoIkFubnVhbCBHcm93dGggUmF0ZXMgT3ZlciAiLHllYXJfcmFuZ2UsICIgWWVhcnMgKCIsIHN0YXJ0X3llYXIsICItIiwgZW5kX3llYXIsICIpIikNCmR5bmFtaWNfY2FwdGlvbiA8LSBwYXN0ZTAoIlZPTyBBbm51YWwgR3Jvd3RoIFJhdGVzLCBEYXRhIFBlcmlvZCAoIiwgbWluX3llYXIsICLigJMiLCBtYXhfeWVhciwgIikiKQ0KDQojIENyZWF0ZSB0aGUgZnVsbCwgbm9uLWZpbHRlcmVkIHgtYXhpcyBwbG90IHdpdGggZHluYW1pYyB4IHBsYWNlbWVudCBmb3IgYW5ub3RhdGlvbnMNCnAxIDwtIGdncGxvdCh2b29fcmF3LCBhZXMoeCA9IGFzLmludGVnZXIoRGF0ZSksIHkgPSBgMS1ZZWFyIENBR1JgKSkgKw0KICANCiAgIyBBZGQgc2hhZGVkIGFyZWFzIGZvciBiYWNrZ3JvdW5kIGVmZmVjdA0KICBnZW9tX3JlY3QoYWVzKHhtaW4gPSAtSW5mLCB4bWF4ID0gSW5mLCB5bWluID0gdGFyZ2V0X2FnZ3Jlc3NpdmUsIHltYXggPSBJbmYpLCBmaWxsID0gImxpZ2h0Z3JlZW4iLCBhbHBoYSA9IDAuMDI1KSArDQogIGdlb21fcmVjdChhZXMoeG1pbiA9IC1JbmYsIHhtYXggPSBJbmYsIHltaW4gPSB0YXJnZXRfY29uc2VydmF0aXZlLCB5bWF4ID0gdGFyZ2V0X2FnZ3Jlc3NpdmUpLCBmaWxsID0gIm9yYW5nZSIsIGFscGhhID0gMC4wMjUpICsNCiAgZ2VvbV9yZWN0KGFlcyh4bWluID0gLUluZiwgeG1heCA9IEluZiwgeW1pbiA9IC1JbmYsIHltYXggPSB0YXJnZXRfY29uc2VydmF0aXZlKSwgZmlsbCA9ICJsaWdodGNvcmFsIiwgYWxwaGEgPSAwLjAyNSkgKw0KICANCiAgIyBQbG90IGxpbmVzLCBwb2ludHMsIGFuZCBhbm5vdGF0aW9ucyBvbiB0b3Agb2Ygc2hhZGVkIGFyZWFzDQogIGdlb21fbGluZShjb2xvciA9ICIjNEIwMDgyIiwgc2l6ZSA9IDEuMCkgKyAgICAgICAjIERhcmsgcHVycGxlIGxpbmUgDQogIGdlb21fcG9pbnQoY29sb3IgPSAiIzRCMDA4MiIsIHNpemUgPSAxLjUpICsgICAgICAgICMgRGFyayBwdXJwbGUgcG9pbnRzIA0KICANCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gdGFyZ2V0X2FnZ3Jlc3NpdmUsIGNvbG9yID0gImRhcmtibHVlIiwgbGluZXR5cGUgPSAic29saWQiKSArDQogICMgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gdGFyZ2V0X21vZGVyYXRlLCBjb2xvciA9ICJkYXJrYmx1ZSIsIGxpbmV0eXBlID0gInNvbGlkIikgKw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSB0YXJnZXRfY29uc2VydmF0aXZlLCBjb2xvciA9ICJkYXJrYmx1ZSIsIGxpbmV0eXBlID0gInNvbGlkIikgKw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSB0YXJnZXRfaW5mbGF0aW9uLCBjb2xvciA9ICJkYXJrcmVkIiwgbGluZXR5cGUgPSAiZGFzaGVkIikgKw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSBjYWdyX3ZhbHVlLCBjb2xvciA9ICJkYXJrcmVkIiwgbGluZXR5cGUgPSAiZGFzaGVkIikgKw0KICANCiAgIyBEeW5hbWljIHJpZ2h0LWFsaWduZWQgcGxhY2VtZW50IGZvciBhbm5vdGF0aW9ucw0KICBhbm5vdGF0ZSgidGV4dCIsIHggPSBJbmYsIHkgPSB0YXJnZXRfYWdncmVzc2l2ZSwgbGFiZWwgPSAiQWdncmVzc2l2ZSIsIA0KICAgICAgICAgICBoanVzdCA9IDEsIHZqdXN0ID0gLTAuNTAsIGNvbG9yID0gImRhcmtibHVlIiwgc2l6ZSA9IDQpICsNCiAgIyBhbm5vdGF0ZSgidGV4dCIsIHggPSBJbmYsIHkgPSB0YXJnZXRfbW9kZXJhdGUsIGxhYmVsID0gIk1vZGVyYXRlIiwgDQogICMgICAgICAgICBoanVzdCA9IDEsIHZqdXN0ID0gLTAuNTAsIGNvbG9yID0gImRhcmtibHVlIiwgc2l6ZSA9IDQpICsNCiAgYW5ub3RhdGUoInRleHQiLCB4ID0gSW5mLCB5ID0gdGFyZ2V0X2NvbnNlcnZhdGl2ZSwgbGFiZWwgPSAiQ29uc2VydmF0aXZlIiwgDQogICAgICAgICAgIGhqdXN0ID0gMSwgdmp1c3QgPSAtMC41MCwgY29sb3IgPSAiZGFya2JsdWUiLCBzaXplID0gNCkgKw0KICBhbm5vdGF0ZSgidGV4dCIsIHggPSBJbmYsIHkgPSB0YXJnZXRfaW5mbGF0aW9uLCBsYWJlbCA9ICJJbmZsYXRpb24iLCANCiAgICAgICAgICAgaGp1c3QgPSAxLCB2anVzdCA9IC0wLjUwLCBjb2xvciA9ICJkYXJrcmVkIiwgc2l6ZSA9IDQpICsNCiAgYW5ub3RhdGUoInRleHQiLCB4ID0gSW5mLCB5ID0gY2Fncl92YWx1ZSwgbGFiZWwgPSAiQ0FHUiIsIA0KICAgICAgICAgICBoanVzdCA9IDEsIHZqdXN0ID0gLTAuNTAsIGNvbG9yID0gImRhcmtyZWQiLCBzaXplID0gNCkgKyANCg0KICBsYWJzKA0KICAgIHRpdGxlID0gZHluYW1pY190aXRsZSwNCiAgICB4ID0gIlllYXIiLA0KICAgIHkgPSAiR3Jvd3RoIFJhdGUgKCUpIiwNCiAgICBjYXB0aW9uID0gZHluYW1pY19jYXB0aW9uDQogICkgKw0KDQogIHNjYWxlX3hfY29udGludW91cygNCiAgICBsaW1pdHMgPSBjKHN0YXJ0X3llYXIsIGVuZF95ZWFyICsgMyksICMgUmVzdHJpY3RzIHgtYXhpcyBkYXRhIA0KICAgIGJyZWFrcyA9IHNlcShsaW1pdHNfc3RhcnRfeWVhciwgbGltaXRzX2VuZF95ZWFyLCA1KSAjIFNldHMgTWFqb3IgeC1heGlzICANCiAgKSArICAjIFJlc3RyaWN0ICYgU2V0IE1ham9yIHgtYXhpcyBsaW5lcyANCiAgICANCiAgdGhlbWVfbWluaW1hbCgpICsNCiAgdGhlbWUoDQogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSwgc2l6ZSA9IDIwKSwgICAgICAgICAjIExhcmdlciB0aXRsZSBmb250DQogICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCksICAgICAgICAgICAgICAgICAgICAjIExhcmdlciB4LWF4aXMgbGFiZWwgZm9udA0KICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQpLCAgICAgICAgICAgICAgICAgICAgIyBMYXJnZXIgeS1heGlzIGxhYmVsIGZvbnQNCiAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEsIHNpemUgPSAxNCksICAjIExhcmdlciB4LWF4aXMgdGV4dA0KICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCksICAgICAgICAgICAgICAgICAgICAgIyBMYXJnZXIgeS1heGlzIHRleHQNCiAgICBwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9saW5lKGxpbmV0eXBlID0gImRvdHRlZCIsIGNvbG9yID0gImJsYWNrIiksICAgICAgICAgIyBNYWpvciBncmlkIGxpbmVzDQogICAgcGFuZWwuZ3JpZC5taW5vci54ID0gZWxlbWVudF9ibGFuaygpLCAjIGVsZW1lbnRfbGluZShjb2xvciA9ICJncmV5ODAiKSAgIyBNaW5vciB4IGdyaWQgbGluZXMgZm9yIGVhY2ggeWVhcg0KICAgICMgcGFuZWwuYm9yZGVyID0gZWxlbWVudF9yZWN0KGNvbG9yID0gImRhcmtncmV5IiwgZmlsbCA9IE5BLCBzaXplID0gMS4wKSAgIyBEYXJrIGJvcmRlciBhcm91bmQgdGhlIHBsb3QNCiAgICBheGlzLnRpY2tzLmxlbmd0aCA9IHVuaXQoLTAuMjUsICJjbSIpLCAgICAgICAgICAgICAgICAgICAgICAjIEluY3JlYXNlIHRpY2sgbGVuZ3RoDQogICAgYXhpcy50aWNrcyA9IGVsZW1lbnRfbGluZShjb2xvciA9ICJibGFjayIsIHNpemUgPSAwLjUwKSwgIyBEYXJrZXIgdGlja3MNCiAgICBheGlzLmxpbmUueCA9IGVsZW1lbnRfbGluZShjb2xvciA9ICJibGFjayIsIHNpemUgPSAwLjc1KSwgICMgRGFyayBib3R0b20gYm9yZGVyDQogICAgYXhpcy5saW5lLnkgPSBlbGVtZW50X2xpbmUoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMC43NSkgICAjIERhcmsgbGVmdCBib3JkZXINCiAgKQ0KDQpwcmludChwMSkNCg0KYGBgDQoNCg0KIyMgVk9PIENBR1INCg0KIyMjIERhdGENCg0KYGBge3Igdm9vX3Jhd19nciwgZXZhbD1UUlVFLCBlY2hvPUZBTFNFfQ0KDQojIFZpZXcobnJ0JHZvb19yYXdfZ3IpDQppbnRlcmFjdGl2ZV9zdHIobnJ0JHZvb19yYXdfZ3IpDQoNCmxpYnJhcnkoZHBseXIpDQpsaWJyYXJ5KGx1YnJpZGF0ZSkgICMgRm9yIGRhdGUgbWFuaXB1bGF0aW9uDQpsaWJyYXJ5KHNjYWxlcykNCmxpYnJhcnkoc3RyaW5ncikNCg0KIyBVcGRhdGUgZGF0YSBmcmFtZSB3aXRoIHByb3BlciBkYXRlIGFuZCBwZXJjZW50YWdlIGhhbmRsaW5nDQp2b29fcmF3X2dyIDwtIG5ydCR2b29fcmF3X2dyICU+JQ0KICBtdXRhdGUoDQogICAgIyBDb252ZXJ0IENsb3NlIERhdGUgdG8gIllZWVktTU0tREQiIGZvcm1hdA0KICAgIGBEYXRlYCA9IGZvcm1hdChhcy5EYXRlKGFzLmNoYXJhY3RlcihgRGF0ZWApLCBvcmlnaW4gPSAiMTk3MC0wMS0wMSIpLCAiJVktJW0tJWQiKSwNCiAgICANCiAgICAjIEVuc3VyZSBDbG9zZSBpcyBhIG51bWJlciBmb3JtYXR0ZWQgdG8gMiBkZWNpbWFsIHBsYWNlcw0KICAgIGBDbG9zZWAgPSBudW1iZXIoYXMubnVtZXJpYyhnc3ViKCIsIiwgIiIsIENsb3NlKSksIGJpZy5tYXJrID0gIiwiLCBkZWNpbWFsLm1hcmsgPSAiLiIsIGFjY3VyYWN5ID0gMC4wMSksDQoNCiAgICAjIENsZWFuIGFuZCBoYW5kbGUgcGVyY2VudGFnZSBjb2x1bW5zDQogICAgYWNyb3NzKDM6MTEsIH4gew0KICAgICAgdmFsdWUgPC0gZ3N1YigiWywlXFxzXSIsICIiLCAuKSAgIyBSZW1vdmUgJSwgY29tbWFzLCBhbmQgc3BhY2VzDQogICAgICBudW1lcmljX3ZhbHVlIDwtIHN1cHByZXNzV2FybmluZ3MoYXMubnVtZXJpYyh2YWx1ZSkpICAjIENvbnZlcnQgdG8gbnVtZXJpYw0KICAgICAgaWZlbHNlKA0KICAgICAgICAhaXMubmEobnVtZXJpY192YWx1ZSksIA0KICAgICAgICBwYXN0ZTAoZm9ybWF0KHJvdW5kKG51bWVyaWNfdmFsdWUqMTAwLCAyKSwgYmlnLm1hcmsgPSAiLCIsIHNjaWVudGlmaWMgPSBGQUxTRSksICIlIiksICAjIEZvcm1hdCB0byAyIGRlY2ltYWwgcGxhY2VzIGFuZCBhZGQgY29tbWFzDQogICAgICAgIC4NCiAgICAgICkNCiAgICB9KQ0KICApICU+JQ0KICBhcnJhbmdlKGRlc2MoYERhdGVgKSkgICMgU29ydCBieSBEYXRlIGZyb20gbmV3ZXN0IHRvIG9sZGVzdA0KDQojIENyZWF0ZSB2b29fcmF3X2dyOiBDR1INCnZvb19yYXdfY2dyIDwtIHZvb19yYXdfZ3IgJT4lDQogIHNlbGVjdChgRGF0ZWAsIGBDbG9zZWAsIGAxLVllYXIgQ0FHUmAsIGNvbnRhaW5zICgiQ0dSIikpDQoNCiMgQ3JlYXRlIHZvb19yYXdfZ3I6IENBR1INCnZvb19yYXdfY2FnciA8LSB2b29fcmF3X2dyICU+JQ0KICBzZWxlY3QoYERhdGVgLCBgQ2xvc2VgLCBjb250YWlucyAoIkNBR1IiKSkNCg0KIyBEaXNwbGF5IGJvdGggdGFibGVzIGZvciBjb25maXJtYXRpb24NCmludGVyYWN0aXZlX3ByaW50KHZvb19yYXdfY2dyKQ0KaW50ZXJhY3RpdmVfcHJpbnQodm9vX3Jhd19jYWdyKQ0KDQojIE9wdGlvbmFsOiBQcmludCB0YWJsZSBzdW1tYXJpZXMNCmludGVyYWN0aXZlX3N0cih2b29fcmF3X2NncikNCmludGVyYWN0aXZlX3N0cih2b29fcmF3X2NhZ3IpDQoNCiMgRGlzcGxheSBjYXB0aW9ucyBmb3IgZWFjaCB0YWJsZQ0KIyBjYXQoIlxuXG4jIyMjIEN1bXVsYXRpdmUgR3Jvd3RoIFJhdGVzICgiLCBtaW5feWVhciwgIi0iLCBtYXhfeWVhciwgIilcbiIsIHNlcCA9ICIiKQ0KIyBmb3JtYXRfZXF1YWxfd2lkdGgodm9vX3Jhd19jZ3IpDQoNCmNhdCgiXG5cbiMjIyMgQ29tcG91bmQgQXZlcmFnZSBHcm93dGggUmF0ZXMgKCIsIG1pbl95ZWFyLCAiLSIsIG1heF95ZWFyLCAiKVxuIiwgc2VwID0gIiIpDQpmb3JtYXRfZXF1YWxfd2lkdGgodm9vX3Jhd19jYWdyKQ0KDQojIFZpZXcodm9vX3Jhd19jYWdyKQ0KIyBjb2xuYW1lcyh2b29fcmF3X2NhZ3IpDQppbnRlcmFjdGl2ZV9zdHIodm9vX3Jhd19jYWdyKQ0KDQoNCmBgYA0KDQojIyMgU3VtbWFyeQ0KDQpgYGB7ciB2b29fcmF3X2NhZ3Jfc3VtbWFyeSwgZXZhbD1UUlVFLCBlY2hvPUZBTFNFfQ0KDQppbnRlcmFjdGl2ZV9zdHIodm9vX3Jhd19jYWdyKQ0KDQojIExvYWQgbmVjZXNzYXJ5IGxpYnJhcmllcw0KbGlicmFyeShkcGx5cikNCmxpYnJhcnkodGliYmxlKQ0KDQojIERlZmluZSBhIGhlbHBlciBmdW5jdGlvbiB0byBjbGVhbiBhbmQgY29udmVydCBwZXJjZW50YWdlcw0KY2xlYW5fcGVyY2VudGFnZSA8LSBmdW5jdGlvbihjb2x1bW4pIHsNCiAgYXMubnVtZXJpYyhnc3ViKCIlIiwgIiIsIGNvbHVtbikpDQp9DQoNCiMgRGVmaW5lIHRoZSBzdGF0aXN0aWMgbmFtZXMgZm9yIHRoZSBzdW1tYXJ5IHRhYmxlDQpzdGF0aXN0aWNfbmFtZXMgPC0gYygNCiAgIkNvdW50IG9mIE9ic2VydmF0aW9ucyIsIA0KICAiTWVhbiIsIA0KICAiTWVkaWFuIiwNCiAgIlN0YW5kYXJkIERldmlhdGlvbiAoVm9sYXRpbGl0eSkiLCANCiAgIk1pbiBDQUdSIFJhbmdlIChDQUdSIC0gU0QpIiwNCiAgIk1heCBDQUdSIFJhbmdlIChDQUdSICsgU0QpIiwNCiAgIk1pbmltdW0iLCANCiAgIk1heGltdW0iLCANCiAgIlBlcmNlbnQgQWJvdmUgSW5mbGF0aW9uIFRhcmdldCIsIA0KICAiUGVyY2VudCBBYm92ZSBDb25zZXJ2YXRpdmUgVGFyZ2V0IiwgDQogICJQZXJjZW50IEFib3ZlIE1vZGVyYXRlIFRhcmdldCIsIA0KICAiUGVyY2VudCBBYm92ZSBBZ2dyZXNzaXZlIFRhcmdldCINCikNCg0KIyBBZGp1c3QgdGhlIGZpcnN0IHJvdydzIERhdGUgYW5kIGNsZWFuIHVwIENBR1IgY29sdW1ucw0Kdm9vX3Jhd19jYWdyIDwtIHZvb19yYXdfY2FnciAlPiUNCiAgc2xpY2UoLTEpICU+JSAjIFJlbW92ZSB0aGUgZmlyc3Qgcm93DQogIG11dGF0ZSgNCiAgICAjIERhdGUgPSBpZmVsc2Uocm93X251bWJlcigpID09IDEsICIyMDI1LTAxLTAxIiwgRGF0ZSksDQogICAgRGF0ZSA9IGFzLm51bWVyaWMoZm9ybWF0KGFzLkRhdGUoRGF0ZSksICIlWSIpKSwNCiAgICBgMS1ZZWFyIENBR1JgID0gY2xlYW5fcGVyY2VudGFnZShgMS1ZZWFyIENBR1JgKSwNCiAgICBgNS1ZZWFyIENBR1JgID0gY2xlYW5fcGVyY2VudGFnZShgNS1ZZWFyIENBR1JgKSwNCiAgICBgMTAtWWVhciBDQUdSYCA9IGNsZWFuX3BlcmNlbnRhZ2UoYDEwLVllYXIgQ0FHUmApLA0KICAgIGAyMC1ZZWFyIENBR1JgID0gY2xlYW5fcGVyY2VudGFnZShgMjAtWWVhciBDQUdSYCksDQogICAgYDMwLVllYXIgQ0FHUmAgPSBjbGVhbl9wZXJjZW50YWdlKGAzMC1ZZWFyIENBR1JgKQ0KICApDQoNCiMgRnVuY3Rpb24gdG8gY2FsY3VsYXRlIHN0YXRpc3RpY3MgZm9yIGEgZ2l2ZW4gZGF0YXNldA0KY2FsY19zdGF0cyA8LSBmdW5jdGlvbihkYXRhKSB7DQogIGlmIChzdW0oIWlzLm5hKGRhdGEpKSA8IDIpIHJldHVybihyZXAoTkEsIGxlbmd0aChzdGF0aXN0aWNfbmFtZXMpKSkgICMgSGFuZGxlIGluc3VmZmljaWVudCBkYXRhDQoNCiAgY291bnRfb2JzZXJ2YXRpb25zIDwtIHN1bSghaXMubmEoZGF0YSkpDQogIG1lYW5fdmFsdWUgPC0gcm91bmQobWVhbihkYXRhLCBuYS5ybSA9IFRSVUUpLCAyKQ0KICBtZWRpYW5fdmFsdWUgPC0gcm91bmQobWVkaWFuKGRhdGEsIG5hLnJtID0gVFJVRSksIDIpDQogIHNkX3ZhbHVlIDwtIHJvdW5kKHNkKGRhdGEsIG5hLnJtID0gVFJVRSksIDIpDQogIG1pbl9jYWdyX3JhbmdlIDwtIHJvdW5kKGNhZ3JfdmFsdWUgLSBzZF92YWx1ZSwgMikNCiAgbWF4X2NhZ3JfcmFuZ2UgPC0gcm91bmQoY2Fncl92YWx1ZSArIHNkX3ZhbHVlLCAyKQ0KICBtaW5fdmFsdWUgPC0gcm91bmQobWluKGRhdGEsIG5hLnJtID0gVFJVRSksIDIpDQogIG1heF92YWx1ZSA8LSByb3VuZChtYXgoZGF0YSwgbmEucm0gPSBUUlVFKSwgMikNCiAgDQogICMgRGVmaW5lIGluZmxhdGlvbiBhbmQgZ3Jvd3RoIHRhcmdldHMNCiAgdGFyZ2V0X2luZmxhdGlvbiA8LSAyICAjIEV4YW1wbGUgdGFyZ2V0IGZvciBpbmZsYXRpb24NCiAgdGFyZ2V0X2NvbnNlcnZhdGl2ZSA8LSAzICsgdGFyZ2V0X2luZmxhdGlvbg0KICB0YXJnZXRfbW9kZXJhdGUgPC0gNSArIHRhcmdldF9pbmZsYXRpb24NCiAgdGFyZ2V0X2FnZ3Jlc3NpdmUgPC0gMTAgKyB0YXJnZXRfaW5mbGF0aW9uDQogIA0KICBhYm92ZV90YXJnZXRfaW5mbGF0aW9uIDwtIHN1bShkYXRhID49IHRhcmdldF9pbmZsYXRpb24sIG5hLnJtID0gVFJVRSkNCiAgYWJvdmVfdGFyZ2V0X2NvbnNlcnZhdGl2ZSA8LSBzdW0oZGF0YSA+PSB0YXJnZXRfY29uc2VydmF0aXZlLCBuYS5ybSA9IFRSVUUpDQogIGFib3ZlX3RhcmdldF9tb2RlcmF0ZSA8LSBzdW0oZGF0YSA+PSB0YXJnZXRfbW9kZXJhdGUsIG5hLnJtID0gVFJVRSkNCiAgYWJvdmVfdGFyZ2V0X2FnZ3Jlc3NpdmUgPC0gc3VtKGRhdGEgPj0gdGFyZ2V0X2FnZ3Jlc3NpdmUsIG5hLnJtID0gVFJVRSkNCiAgDQogIHBlcmNlbnRfYWJvdmVfdGFyZ2V0X2NvbnNlcnZhdGl2ZSA8LSByb3VuZCgoYWJvdmVfdGFyZ2V0X2NvbnNlcnZhdGl2ZSAvIGNvdW50X29ic2VydmF0aW9ucykgKiAxMDAsIDIpDQogIHBlcmNlbnRfYWJvdmVfdGFyZ2V0X2luZmxhdGlvbiA8LSByb3VuZCgoYWJvdmVfdGFyZ2V0X2luZmxhdGlvbiAvIGNvdW50X29ic2VydmF0aW9ucykgKiAxMDAsIDIpDQogIHBlcmNlbnRfYWJvdmVfdGFyZ2V0X21vZGVyYXRlIDwtIHJvdW5kKChhYm92ZV90YXJnZXRfbW9kZXJhdGUgLyBjb3VudF9vYnNlcnZhdGlvbnMpICogMTAwLCAyKQ0KICBwZXJjZW50X2Fib3ZlX3RhcmdldF9hZ2dyZXNzaXZlIDwtIHJvdW5kKChhYm92ZV90YXJnZXRfYWdncmVzc2l2ZSAvIGNvdW50X29ic2VydmF0aW9ucykgKiAxMDAsIDIpDQogIA0KICBjKA0KICAgIGNvdW50X29ic2VydmF0aW9ucywgDQogICAgcGFzdGUwKG1lYW5fdmFsdWUsICIlIiksDQogICAgcGFzdGUwKG1lZGlhbl92YWx1ZSwgIiUiKSwNCiAgICBwYXN0ZTAoc2RfdmFsdWUsICIlIiksDQogICAgcGFzdGUwKG1pbl9jYWdyX3JhbmdlLCAiJSIpLA0KICAgIHBhc3RlMChtYXhfY2Fncl9yYW5nZSwgIiUiKSwNCiAgICBwYXN0ZTAobWluX3ZhbHVlLCAiJSIpLA0KICAgIHBhc3RlMChtYXhfdmFsdWUsICIlIiksDQogICAgcGFzdGUwKHBlcmNlbnRfYWJvdmVfdGFyZ2V0X2luZmxhdGlvbiwgIiUiKSwNCiAgICBwYXN0ZTAocGVyY2VudF9hYm92ZV90YXJnZXRfY29uc2VydmF0aXZlLCAiJSIpLCANCiAgICBwYXN0ZTAocGVyY2VudF9hYm92ZV90YXJnZXRfbW9kZXJhdGUsICIlIiksIA0KICAgIHBhc3RlMChwZXJjZW50X2Fib3ZlX3RhcmdldF9hZ2dyZXNzaXZlLCAiJSIpDQogICkNCn0NCg0KIyBDb2x1bW5zIHRvIGNhbGN1bGF0ZSBDQUdSIHN0YXRpc3RpY3MNCmNhZ3JfY29sdW1ucyA8LSBjKCIxLVllYXIgQ0FHUiIsICI1LVllYXIgQ0FHUiIsICIxMC1ZZWFyIENBR1IiLCAiMjAtWWVhciBDQUdSIiwgIjMwLVllYXIgQ0FHUiIpDQpleGlzdGluZ19jYWdyX2NvbHVtbnMgPC0gaW50ZXJzZWN0KGNhZ3JfY29sdW1ucywgbmFtZXModm9vX3Jhd19jYWdyKSkNCg0KIyBDYWxjdWxhdGUgc3RhdHMgZm9yIGVhY2ggQ0FHUiBjb2x1bW4NCmNhZ3Jfc3RhdHNfbGlzdCA8LSBsYXBwbHkodm9vX3Jhd19jYWdyW2V4aXN0aW5nX2NhZ3JfY29sdW1uc10sIGNhbGNfc3RhdHMpDQoNCiMgQ29tcGlsZSBpbnRvIGEgc3VtbWFyeSBkYXRhIGZyYW1lDQp2b29fcmF3X2NhZ3Jfc3VtbWFyeSA8LSBhcy5kYXRhLmZyYW1lKGRvLmNhbGwoY2JpbmQsIGNhZ3Jfc3RhdHNfbGlzdCkpDQpyb3duYW1lcyh2b29fcmF3X2NhZ3Jfc3VtbWFyeSkgPC0gc3RhdGlzdGljX25hbWVzDQoNCg0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiMjIFNBVkUgVkFMVUVTIEZPUiBJTi1MSU5FIENPREUNCg0KIyBEZWZpbmUgdGhlIG1hcHBpbmcgb2Ygcm93IG5hbWVzIHRvIHZhcmlhYmxlIG5hbWVzDQpyb3dfdG9fdmFyX25hbWUgPC0gYygNCiAgIkNvdW50IG9mIE9ic2VydmF0aW9ucyIgPSAiY291bnRfb2JzZXJ2YXRpb25zIiwNCiAgIk1lYW4iID0gIm1lYW5fdmFsdWUiLA0KICAiTWVkaWFuIiA9ICJtZWRpYW5fdmFsdWUiLA0KICAiU3RhbmRhcmQgRGV2aWF0aW9uIChWb2xhdGlsaXR5KSIgPSAic2RfdmFsdWUiLA0KICAiTWluIENBR1IgUmFuZ2UgKENBR1IgLSBTRCkiID0gIm1pbl9jYWdyX3JhbmdlIiwNCiAgIk1heCBDQUdSIFJhbmdlIChDQUdSICsgU0QpIiA9ICJtYXhfY2Fncl9yYW5nZSIsDQogICJNaW5pbXVtIiA9ICJtaW5fdmFsdWUiLA0KICAiTWF4aW11bSIgPSAibWF4X3ZhbHVlIiwNCiAgIlBlcmNlbnQgQWJvdmUgSW5mbGF0aW9uIFRhcmdldCIgPSAicGVyY2VudF9hYm92ZV90YXJnZXRfaW5mbGF0aW9uIiwNCiAgIlBlcmNlbnQgQWJvdmUgQ29uc2VydmF0aXZlIFRhcmdldCIgPSAicGVyY2VudF9hYm92ZV90YXJnZXRfY29uc2VydmF0aXZlIiwNCiAgIlBlcmNlbnQgQWJvdmUgTW9kZXJhdGUgVGFyZ2V0IiA9ICJwZXJjZW50X2Fib3ZlX3RhcmdldF9tb2RlcmF0ZSIsDQogICJQZXJjZW50IEFib3ZlIEFnZ3Jlc3NpdmUgVGFyZ2V0IiA9ICJwZXJjZW50X2Fib3ZlX3RhcmdldF9hZ2dyZXNzaXZlIg0KKQ0KDQojIEZ1bmN0aW9uIHRvIHNhdmUgc3VtbWFyeSB2YWx1ZXMgZHluYW1pY2FsbHkNCnNhdmVfY29sdW1uX3ZhbHVlcyA8LSBmdW5jdGlvbihzdW1tYXJ5X2RmKSB7DQogICMgRXhjbHVkZSB0aGUgIlN0YXRpc3RpYyIgYW5kICJPdmVyYWxsIiBjb2x1bW5zDQogIGNvbHVtbnNfdG9fc2F2ZSA8LSBzZXRkaWZmKG5hbWVzKHN1bW1hcnlfZGYpLCBjKCJTdGF0aXN0aWMiLCAiT3ZlcmFsbCIpKQ0KICANCiAgIyBJdGVyYXRlIG92ZXIgZWFjaCBjb2x1bW4NCiAgZm9yIChjb2wgaW4gY29sdW1uc190b19zYXZlKSB7DQogICAgIyBGb3JtYXQgY29sdW1uIG5hbWUgdG8gbG93ZXJjYXNlIGFuZCByZXBsYWNlIGludmFsaWQgY2hhcmFjdGVycw0KICAgIGNvbF9uYW1lIDwtIHRvbG93ZXIoZ3N1YigiW15hLXpBLVowLTldIiwgIl8iLCBjb2wpKQ0KICAgIA0KICAgICMgRXh0cmFjdCB2YWx1ZXMgZm9yIHRoZSBjdXJyZW50IGNvbHVtbg0KICAgIGNvbF92YWx1ZXMgPC0gc3VtbWFyeV9kZltbY29sXV0NCiAgICANCiAgICAjIFNhdmUgZWFjaCB2YWx1ZSBkeW5hbWljYWxseSB1c2luZyB0aGUgbWFwcGluZyBmb3Igcm93IG5hbWVzDQogICAgZm9yIChpIGluIHNlcV9hbG9uZyhjb2xfdmFsdWVzKSkgew0KICAgICAgIyBHZXQgdGhlIGNvcnJlc3BvbmRpbmcgdmFyaWFibGUgbmFtZSBmcm9tIHRoZSBtYXBwaW5nDQogICAgICBzdGF0X25hbWUgPC0gcm93X3RvX3Zhcl9uYW1lW3Jvd25hbWVzKHN1bW1hcnlfZGYpW2ldXQ0KICAgICAgDQogICAgICBpZiAoIWlzLm5hKHN0YXRfbmFtZSkpIHsgICMgU2tpcCBpZiBubyBtYXBwaW5nIGlzIGRlZmluZWQNCiAgICAgICAgIyBDcmVhdGUgdGhlIHZhcmlhYmxlIG5hbWUNCiAgICAgICAgdmFyX25hbWUgPC0gcGFzdGUwKHN0YXRfbmFtZSwgIl8iLCBjb2xfbmFtZSkNCiAgICAgICAgDQogICAgICAgICMgQXR0ZW1wdCBudW1lcmljIGNvbnZlcnNpb24gZm9yIGRvd25zdHJlYW0gdXNlDQogICAgICAgIHZhbHVlIDwtIHN1cHByZXNzV2FybmluZ3MoYXMubnVtZXJpYyhnc3ViKCIlIiwgIiIsIGNvbF92YWx1ZXNbaV0pKSkNCiAgICAgICAgDQogICAgICAgICMgQXNzaWduIHRoZSB2YWx1ZSB0byB0aGUgZ2xvYmFsIGVudmlyb25tZW50DQogICAgICAgIGFzc2lnbih2YXJfbmFtZSwgdmFsdWUsIGVudmlyID0gLkdsb2JhbEVudikNCiAgICAgIH0NCiAgICB9DQogIH0NCn0NCg0KIyBBcHBseSB0aGUgZnVuY3Rpb24gdG8gc2F2ZSB2YWx1ZXMgZm9yIGFsbCBjb2x1bW5zIGV4Y2VwdCAiT3ZlcmFsbCINCnNhdmVfY29sdW1uX3ZhbHVlcyh2b29fcmF3X2NhZ3Jfc3VtbWFyeSkNCg0KIyBFeGFtcGxlOiBBY2Nlc3NpbmcgZHluYW1pY2FsbHkgY3JlYXRlZCB2YXJpYWJsZXMNCmludGVyYWN0aXZlX3ByaW50KG1lYW5fdmFsdWVfMV95ZWFyX2NhZ3IpICAjIFNob3VsZCBwcmludCB0aGUgbWVhbiB2YWx1ZSBmb3IgMS1ZZWFyIENBR1INCmludGVyYWN0aXZlX3ByaW50KHBlcmNlbnRfYWJvdmVfdGFyZ2V0X2luZmxhdGlvbl81X3llYXJfY2FncikgICMgU2hvdWxkIHByaW50IHRoZSBwZXJjZW50IGFib3ZlIGluZmxhdGlvbiB0YXJnZXQgZm9yIDUtWWVhciBDQUdSDQppbnRlcmFjdGl2ZV9wcmludChzZF92YWx1ZV8xMF95ZWFyX2NhZ3IpICAjIFNob3VsZCBwcmludCB0aGUgc3RhbmRhcmQgZGV2aWF0aW9uIGZvciAxMC1ZZWFyIENBR1INCg0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiMjIE9WRVJBTEwgU1RBVElTVElDUyANCm51bWVyaWNfdmFsdWVzX2FsbCA8LSBhcy5udW1lcmljKHVubGlzdCh2b29fcmF3X2NhZ3JbZXhpc3RpbmdfY2Fncl9jb2x1bW5zXSwgdXNlLm5hbWVzID0gRkFMU0UpKQ0KbnVtZXJpY192YWx1ZXNfYWxsIDwtIG51bWVyaWNfdmFsdWVzX2FsbFshaXMubmEobnVtZXJpY192YWx1ZXNfYWxsKV0NCg0Kb3ZlcmFsbF9jb3VudF9vYnNlcnZhdGlvbnMgPC0gbGVuZ3RoKG51bWVyaWNfdmFsdWVzX2FsbCkNCm92ZXJhbGxfbWVhbl92YWx1ZSA8LSByb3VuZChtZWFuKG51bWVyaWNfdmFsdWVzX2FsbCksIDIpDQpvdmVyYWxsX21lZGlhbl92YWx1ZSA8LSByb3VuZChtZWRpYW4obnVtZXJpY192YWx1ZXNfYWxsKSwgMikNCm92ZXJhbGxfc2RfdmFsdWUgPC0gcm91bmQoc2QobnVtZXJpY192YWx1ZXNfYWxsKSwgMikNCm92ZXJhbGxfbWluX2NhZ3JfcmFuZ2UgPC0gcm91bmQoY2Fncl92YWx1ZSAtIG92ZXJhbGxfc2RfdmFsdWUsIDIpDQpvdmVyYWxsX21heF9jYWdyX3JhbmdlIDwtIHJvdW5kKGNhZ3JfdmFsdWUgKyBvdmVyYWxsX3NkX3ZhbHVlLCAyKQ0Kb3ZlcmFsbF9taW5fdmFsdWUgPC0gcm91bmQobWluKG51bWVyaWNfdmFsdWVzX2FsbCksIDIpDQpvdmVyYWxsX21heF92YWx1ZSA8LSByb3VuZChtYXgobnVtZXJpY192YWx1ZXNfYWxsKSwgMikNCg0Kb3ZlcmFsbF9hYm92ZV90YXJnZXRfaW5mbGF0aW9uIDwtIHN1bShudW1lcmljX3ZhbHVlc19hbGwgPj0gdGFyZ2V0X2luZmxhdGlvbiwgbmEucm0gPSBUUlVFKQ0Kb3ZlcmFsbF9hYm92ZV90YXJnZXRfY29uc2VydmF0aXZlIDwtIHN1bShudW1lcmljX3ZhbHVlc19hbGwgPj0gdGFyZ2V0X2NvbnNlcnZhdGl2ZSwgbmEucm0gPSBUUlVFKQ0Kb3ZlcmFsbF9hYm92ZV90YXJnZXRfbW9kZXJhdGUgPC0gc3VtKG51bWVyaWNfdmFsdWVzX2FsbCA+PSB0YXJnZXRfbW9kZXJhdGUsIG5hLnJtID0gVFJVRSkNCm92ZXJhbGxfYWJvdmVfdGFyZ2V0X2FnZ3Jlc3NpdmUgPC0gc3VtKG51bWVyaWNfdmFsdWVzX2FsbCA+PSB0YXJnZXRfYWdncmVzc2l2ZSwgbmEucm0gPSBUUlVFKQ0KDQpvdmVyYWxsX3BlcmNlbnRfYWJvdmVfdGFyZ2V0X2NvbnNlcnZhdGl2ZSA8LSByb3VuZCgob3ZlcmFsbF9hYm92ZV90YXJnZXRfY29uc2VydmF0aXZlIC8gb3ZlcmFsbF9jb3VudF9vYnNlcnZhdGlvbnMpICogMTAwLCAyKQ0Kb3ZlcmFsbF9wZXJjZW50X2Fib3ZlX3RhcmdldF9pbmZsYXRpb24gPC0gcm91bmQoKG92ZXJhbGxfYWJvdmVfdGFyZ2V0X2luZmxhdGlvbiAvIG92ZXJhbGxfY291bnRfb2JzZXJ2YXRpb25zKSAqIDEwMCwgMikNCm92ZXJhbGxfcGVyY2VudF9hYm92ZV90YXJnZXRfbW9kZXJhdGUgPC0gcm91bmQoKG92ZXJhbGxfYWJvdmVfdGFyZ2V0X21vZGVyYXRlIC8gb3ZlcmFsbF9jb3VudF9vYnNlcnZhdGlvbnMpICogMTAwLCAyKQ0Kb3ZlcmFsbF9wZXJjZW50X2Fib3ZlX3RhcmdldF9hZ2dyZXNzaXZlIDwtIHJvdW5kKChvdmVyYWxsX2Fib3ZlX3RhcmdldF9hZ2dyZXNzaXZlIC8gb3ZlcmFsbF9jb3VudF9vYnNlcnZhdGlvbnMpICogMTAwLCAyKQ0KDQp2b29fcmF3X2NhZ3Jfc3VtbWFyeSRPdmVyYWxsIDwtIGMoDQogIG92ZXJhbGxfY291bnRfb2JzZXJ2YXRpb25zLA0KICBwYXN0ZTAob3ZlcmFsbF9tZWFuX3ZhbHVlLCAiJSIpLA0KICBwYXN0ZTAob3ZlcmFsbF9tZWRpYW5fdmFsdWUsICIlIiksDQogIHBhc3RlMChvdmVyYWxsX3NkX3ZhbHVlLCAiJSIpLA0KICBwYXN0ZTAob3ZlcmFsbF9taW5fY2Fncl9yYW5nZSwgIiUiKSwNCiAgcGFzdGUwKG92ZXJhbGxfbWF4X2NhZ3JfcmFuZ2UsICIlIiksDQogIHBhc3RlMChvdmVyYWxsX21pbl92YWx1ZSwgIiUiKSwNCiAgcGFzdGUwKG92ZXJhbGxfbWF4X3ZhbHVlLCAiJSIpLA0KICBwYXN0ZTAob3ZlcmFsbF9wZXJjZW50X2Fib3ZlX3RhcmdldF9pbmZsYXRpb24sICIlIiksDQogIHBhc3RlMChvdmVyYWxsX3BlcmNlbnRfYWJvdmVfdGFyZ2V0X2NvbnNlcnZhdGl2ZSwgIiUiKSwNCiAgcGFzdGUwKG92ZXJhbGxfcGVyY2VudF9hYm92ZV90YXJnZXRfbW9kZXJhdGUsICIlIiksDQogIHBhc3RlMChvdmVyYWxsX3BlcmNlbnRfYWJvdmVfdGFyZ2V0X2FnZ3Jlc3NpdmUsICIlIikNCikNCg0KIyBDb252ZXJ0IHJvdyBuYW1lcyB0byBhIGNvbHVtbg0Kdm9vX3Jhd19jYWdyX3N1bW1hcnkgPC0gdGliYmxlOjpyb3duYW1lc190b19jb2x1bW4odm9vX3Jhd19jYWdyX3N1bW1hcnksIHZhciA9ICJTdGF0aXN0aWMiKQ0KDQojIEVuc3VyZSBhbGwgY29sdW1ucyBhcmUgY2hhcmFjdGVyDQp2b29fcmF3X2NhZ3Jfc3VtbWFyeSA8LSB2b29fcmF3X2NhZ3Jfc3VtbWFyeSAlPiUNCiAgbXV0YXRlKGFjcm9zcyhldmVyeXRoaW5nKCksIGFzLmNoYXJhY3RlcikpDQoNCiMgRGlzcGxheSB0aGUgc3VtbWFyeSB0YWJsZQ0KY2F0KCJcbiMjIyMgQ29tcG91bmQgQXZlcmFnZSBHcm93dGggUmF0ZXMgKCIsIG1pbl95ZWFyLCAiLSIsIG1heF95ZWFyLCAiKVxuIiwgc2VwID0gIiIpDQppbnRlcmFjdGl2ZV9zdHIodm9vX3Jhd19jYWdyX3N1bW1hcnkpDQpmb3JtYXRfdW5zcGVjaWZpZWRfd2lkdGgodm9vX3Jhd19jYWdyX3N1bW1hcnkpDQoNCmBgYA0KDQoNCioqYHIgbWluX3llYXJgLWByIG1heF95ZWFyYCBTdW1tYXJ5OioqIFRoZSAxLVllYXIgQ0FHUiBleGhpYml0cyB0aGUgYHIgaWYobWVhbl92YWx1ZV8xX3llYXJfY2FnciA9PSBtYXgoYyhtZWFuX3ZhbHVlXzFfeWVhcl9jYWdyLCBtZWFuX3ZhbHVlXzVfeWVhcl9jYWdyLCBtZWFuX3ZhbHVlXzEwX3llYXJfY2FncikpKSAiaGlnaGVzdCBtZWFuIHJldHVybiIgZWxzZSBpZihtZWFuX3ZhbHVlXzFfeWVhcl9jYWdyID09IG1pbihjKG1lYW5fdmFsdWVfMV95ZWFyX2NhZ3IsIG1lYW5fdmFsdWVfNV95ZWFyX2NhZ3IsIG1lYW5fdmFsdWVfMTBfeWVhcl9jYWdyKSkpICJsb3dlc3QgbWVhbiByZXR1cm4iIGVsc2UgIm1lYW4gcmV0dXJuImAgYXQgYHIgbWVhbl92YWx1ZV8xX3llYXJfY2FncmAlLCBhbmQgYHIgaWYoc2RfdmFsdWVfMV95ZWFyX2NhZ3IgPT0gbWF4KGMoc2RfdmFsdWVfMV95ZWFyX2NhZ3IsIHNkX3ZhbHVlXzVfeWVhcl9jYWdyLCBzZF92YWx1ZV8xMF95ZWFyX2NhZ3IpKSkgInRoZSBncmVhdGVzdCB2b2xhdGlsaXR5IHdpdGggYSIgZWxzZSBpZihzZF92YWx1ZV8xX3llYXJfY2FnciA9PSBtaW4oYyhzZF92YWx1ZV8xX3llYXJfY2Fnciwgc2RfdmFsdWVfNV95ZWFyX2NhZ3IsIHNkX3ZhbHVlXzEwX3llYXJfY2FncikpKSAidGhlIGxlYXN0IHZvbGF0aWxpdHkgd2l0aCBhIiBlbHNlICJhImAgc3RhbmRhcmQgZGV2aWF0aW9uIG9mIGByIHNkX3ZhbHVlXzFfeWVhcl9jYWdyYCUuIEFzIHRoZSBpbnZlc3RtZW50IGhvcml6b24gZXh0ZW5kcyB0byA1LCBhbmQgMTAgeWVhcnMsIHRoZSBtZWFuIHJldHVybnMgYHIgaWYobWVhbl92YWx1ZV8xX3llYXJfY2FnciA8IG1lYW4oYyhtZWFuX3ZhbHVlXzVfeWVhcl9jYWdyLCBtZWFuX3ZhbHVlXzEwX3llYXJfY2FncikpKSAiaW5jcmVhc2UiIGVsc2UgImRlY3JlYXNlImAsIHJhbmdpbmcgZnJvbSBgciBtZWFuX3ZhbHVlXzVfeWVhcl9jYWdyYCUgdG8gYHIgbWVhbl92YWx1ZV8xMF95ZWFyX2NhZ3JgJSwgd2hpbGUgdm9sYXRpbGl0eSBgciBpZihzZF92YWx1ZV8xX3llYXJfY2FnciA8IG1lYW4oYyhzZF92YWx1ZV81X3llYXJfY2Fnciwgc2RfdmFsdWVfMTBfeWVhcl9jYWdyKSkpICJyaXNlcyIgZWxzZSAiZGltaW5pc2hlcyJgLCB3aXRoIHN0YW5kYXJkIGRldmlhdGlvbnMgYHIgaWYoc2RfdmFsdWVfMV95ZWFyX2NhZ3IgPiBzZF92YWx1ZV8xMF95ZWFyX2NhZ3IpICJkcm9wcGluZyIgZWxzZSAicmlzaW5nImAgZnJvbSBgciBzZF92YWx1ZV81X3llYXJfY2FncmAlIHRvIGByIHNkX3ZhbHVlXzEwX3llYXJfY2FncmAlLiBUaGlzIHRyZW5kIGluZGljYXRlcyB0aGF0IGxvbmdlciBpbnZlc3RtZW50IHBlcmlvZHMgdGVuZCB0byBvZmZlciBgciBpZihzZF92YWx1ZV8xX3llYXJfY2FnciA+IHNkX3ZhbHVlXzEwX3llYXJfY2FncikgIm1vcmUgc3RhYmxlIiBlbHNlICJsZXNzIHN0YWJsZSJgIHJldHVybnMuIEZ1cnRoZXJtb3JlLCB0aGUgcGVyY2VudGFnZSBvZiBwZXJpb2RzIGV4Y2VlZGluZyB0aGUgaW5mbGF0aW9uIHRhcmdldCBgciBpZihwZXJjZW50X2Fib3ZlX3RhcmdldF9pbmZsYXRpb25fMV95ZWFyX2NhZ3IgPCBwZXJjZW50X2Fib3ZlX3RhcmdldF9pbmZsYXRpb25fMTBfeWVhcl9jYWdyKSAiaW5jcmVhc2VzIiBlbHNlICJkZWNyZWFzZXMiYCB3aXRoIGxvbmdlciBkdXJhdGlvbnMsIGZyb20gYHIgcGVyY2VudF9hYm92ZV90YXJnZXRfaW5mbGF0aW9uXzFfeWVhcl9jYWdyYCUgaW4gdGhlIDEtWWVhciBDQUdSIHRvIGByIHBlcmNlbnRfYWJvdmVfdGFyZ2V0X2luZmxhdGlvbl8xMF95ZWFyX2NhZ3JgJSBpbiB0aGUgMTAtWWVhciBDQUdSLCB1bmRlcnNjb3JpbmcgVk9PJ3MgYHIgaWYocGVyY2VudF9hYm92ZV90YXJnZXRfaW5mbGF0aW9uXzFfeWVhcl9jYWdyIDwgcGVyY2VudF9hYm92ZV90YXJnZXRfaW5mbGF0aW9uXzEwX3llYXJfY2FncikgImVmZmVjdGl2ZW5lc3MiIGVsc2UgImluZWZmZWN0aXZlbmVzcyJgIGFzIGEgaGVkZ2UgYWdhaW5zdCBpbmZsYXRpb24gb3ZlciBleHRlbmRlZCB0aW1lZnJhbWVzLiBXaXRoIGFuIG92ZXJhbGwgcGVyY2VudGFnZSBvZiBgciBvdmVyYWxsX3BlcmNlbnRfYWJvdmVfdGFyZ2V0X2FnZ3Jlc3NpdmVgJSBleGNlZWRpbmcgdGhlIGFnZ3Jlc3NpdmUgdGFyZ2V0IChgciB0YXJnZXRfYWdncmVzc2l2ZWAlIGFubnVhbGl6ZWQgcmV0dXJucyB3aXRoIGByIHRhcmdldF9pbmZsYXRpb25gJSBpbmZsYXRpb24pLCBWT08gYHIgaWYob3ZlcmFsbF9wZXJjZW50X2Fib3ZlX3RhcmdldF9hZ2dyZXNzaXZlID4gNTApICJoYXMsIG92ZXIgdGhpcyB0aW1lIHBlcmlvZCwgcHJvdmVuIHRvIGJlIGEgc3Ryb25nIiBlbHNlIGlmKG92ZXJhbGxfcGVyY2VudF9hYm92ZV90YXJnZXRfYWdncmVzc2l2ZSA+IDQwKSAiaGFzLCBvdmVyIHRoaXMgdGltZSBwZXJpb2QsIGRlbW9uc3RyYXRlZCBpdHNlbGYgYXMgYSB2aWFibGUiIGVsc2UgImFwcGVhcnMsIG92ZXIgdGhpcyB0aW1lIHBlcmlvZCwgdG8gYmUgYSBsZXNzIHN1aXRhYmxlImAgb3B0aW9uIGZvciBhIGhpZ2gtcmV0dXJuaW5nIGxvbmctdGVybSBpbnZlc3RtZW50Lg0KDQojIyMgR3JhcGgNCg0KIyMjIyBBbGwgUGVyaW9kcw0KDQoNCmBgYHtyIHZvb19yYXdfY2Fncl9ncmFwaHNfYWxsLCBmaWcud2lkdGg9MTAsIGZpZy5oZWlnaHQ9NywgZXZhbD1UUlVFLCBlY2hvPUZBTFNFfQ0KDQpjYXQoIlxuXG4jIyMjIENvbXBvdW5kIEF2ZXJhZ2UgR3Jvd3RoIFJhdGVzIEFjcm9zcyBQZXJpb2RzIFxuIikNCg0KIyBMb2FkIG5lY2Vzc2FyeSBsaWJyYXJpZXMNCmxpYnJhcnkoZ2dwbG90MikNCmxpYnJhcnkoZHBseXIpDQoNCg0KIyBDb252ZXJ0IGNvbHVtbnMgdG8gbnVtZXJpYyBmb3IgcGxvdHRpbmcgaWYgbmVlZGVkDQp2b29fcmF3X2NhZ3IgPC0gdm9vX3Jhd19jYWdyICU+JQ0KICBtdXRhdGUoDQogICAgYERhdGVgID0gYXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIoYERhdGVgKSksICAjIEVuc3VyZSBEYXRlIGlzIG51bWVyaWMNCiAgICBgMS1ZZWFyIENBR1JgID0gYXMubnVtZXJpYyhnc3ViKCIlIiwgIiIsIGAxLVllYXIgQ0FHUmApKSwNCiAgICBgNS1ZZWFyIENBR1JgID0gYXMubnVtZXJpYyhnc3ViKCIlIiwgIiIsIGA1LVllYXIgQ0FHUmApKSwNCiAgICBgMTAtWWVhciBDQUdSYCA9IGFzLm51bWVyaWMoZ3N1YigiJSIsICIiLCBgMTAtWWVhciBDQUdSYCkpLA0KICAgIGAyMC1ZZWFyIENBR1JgID0gYXMubnVtZXJpYyhnc3ViKCIlIiwgIiIsIGAyMC1ZZWFyIENBR1JgKSksDQogICAgYDMwLVllYXIgQ0FHUmAgPSBhcy5udW1lcmljKGdzdWIoIiUiLCAiIiwgYDMwLVllYXIgQ0FHUmApKQ0KICApDQoNCiMgUmVzaGFwZSB0aGUgZGF0YSBpbnRvIGxvbmcgZm9ybWF0IGZvciBlYXN5IHBsb3R0aW5nIG9mIG11bHRpcGxlIGxpbmVzIGFuZCBzZXQgdGhlIGZhY3RvciBvcmRlcg0KbnJ0X2xvbmcgPC0gdm9vX3Jhd19jYWdyICU+JQ0KICBwaXZvdF9sb25nZXIoY29scyA9IGMoYDEtWWVhciBDQUdSYCwgYDUtWWVhciBDQUdSYCwgYDEwLVllYXIgQ0FHUmAsIGAyMC1ZZWFyIENBR1JgLCBgMzAtWWVhciBDQUdSYCksDQogICAgICAgICAgICAgICBuYW1lc190byA9ICJDQUdSX1BlcmlvZCIsDQogICAgICAgICAgICAgICB2YWx1ZXNfdG8gPSAiQ0FHUl9WYWx1ZSIpICU+JQ0KICBtdXRhdGUoQ0FHUl9QZXJpb2QgPSBmYWN0b3IoQ0FHUl9QZXJpb2QsIGxldmVscyA9IGMoIjEtWWVhciBDQUdSIiwgIjUtWWVhciBDQUdSIiwgIjEwLVllYXIgQ0FHUiIsICIyMC1ZZWFyIENBR1IiLCAiMzAtWWVhciBDQUdSIikpKQ0KDQojIEFzc2lnbiBjb2xvcnMgZHluYW1pY2FsbHkgYmFzZWQgb24gdGhlIG9yZGVyIG9mIENBR1JfUGVyaW9kIGluIHRoZSBkYXRhDQojIE1hdGNoIHRoZSB1bmlxdWUgbGV2ZWxzIG9mIENBR1JfUGVyaW9kIHdpdGggY29sb3JzIGZyb20gY29sb3JzX2dlbmVyYWxfZGFyaw0KdW5pcXVlX3R5cGVzIDwtIHVuaXF1ZShucnRfbG9uZyRDQUdSX1BlcmlvZCkNCmN1c3RvbV9jb2xvcnMgPC0gc2V0TmFtZXMoY29sb3JzX2dlbmVyYWxfZGFya1sxOmxlbmd0aCh1bmlxdWVfdHlwZXMpXSwgdW5pcXVlX3R5cGVzKQ0KDQojIEZpbmQgdGhlIG1pbmltdW0gYW5kIG1heGltdW0geC12YWx1ZSBpbiB5b3VyIGRhdGENCm1heF94IDwtIG1heChhcy5pbnRlZ2VyKHZvb19yYXdfY2FnciREYXRlKSwgbmEucm0gPSBUUlVFKQ0KbWluX3ggPC0gbWluKGFzLmludGVnZXIodm9vX3Jhd19jYWdyJERhdGUpLCBuYS5ybSA9IFRSVUUpDQppbnRlcmFjdGl2ZV9wcmludChtYXhfeCkgICMgVGVzdA0KaW50ZXJhY3RpdmVfcHJpbnQobWluX3gpICAjIFRlc3QNCg0KIyBGaW5kIHRoZSBtaW5pbXVtIGFuZCBtYXhpbXVtIHllYXINCm1pbl95ZWFyIDwtIG1pbih2b29fcmF3X2NhZ3IkRGF0ZSwgbmEucm0gPSBUUlVFKQ0KbWF4X3llYXIgPC0gbWF4KHZvb19yYXdfY2FnciREYXRlLCBuYS5ybSA9IFRSVUUpDQppbnRlcmFjdGl2ZV9wcmludChtaW5feWVhcikNCmludGVyYWN0aXZlX3ByaW50KG1heF95ZWFyKQ0KDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KIyMgUExPVCBGVUxMIFdJVEhPVVQgTElNSVRTDQoNCiMgRGVmaW5lIHN0YXJ0IGFuZCBlbmQgeWVhcnMNCnN0YXJ0X3llYXIgPC0gYXMubnVtZXJpYyhtaW5feWVhcikNCmVuZF95ZWFyIDwtIDIwMjQNCnllYXJfcmFuZ2UgPC0gZW5kX3llYXIgLSBzdGFydF95ZWFyICsgMSAgIyBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiB5ZWFycw0KDQojIERlZmluZSBicmVha3Mgcm91bmRlZCBhcHByb3ByaWF0ZWx5DQpsaW1pdHNfc3RhcnRfeWVhciA8LSBmbG9vcihzdGFydF95ZWFyIC8gNSkgKiA1ICAjIFJvdW5kIGRvd24gdG8gdGhlIG5lYXJlc3QgbXVsdGlwbGUgb2YgNQ0KbGltaXRzX2VuZF95ZWFyIDwtIGNlaWxpbmcoZW5kX3llYXIgLyA1KSAqIDUgICAjIFJvdW5kIHVwIHRvIHRoZSBuZWFyZXN0IG11bHRpcGxlIG9mIDUNCg0KIyBDcmVhdGUgZHluYW1pYyB0aXRsZSBhbmQgY2FwdGlvbg0KZHluYW1pY190aXRsZSA8LSBwYXN0ZTAoIlJvbGxpbmcgQ0FHUnMgQWNyb3NzIFBlcmlvZHMgT3ZlciAiLHllYXJfcmFuZ2UsICIgWWVhcnMgKCIsIHN0YXJ0X3llYXIsICItIiwgZW5kX3llYXIsICIpIikNCmR5bmFtaWNfY2FwdGlvbiA8LSBwYXN0ZTAoIlZPTyBDb21wb3VuZCBBdmVyYWdlIEdyb3d0aCBSYXRlcyBBY3Jvc3MgUm9sbGluZyBQZXJpb2RzLCBEYXRhc2V0ICgiLCBtaW5feWVhciwgIi0iLCBtYXhfeWVhciwgIikiKQ0KDQojIENyZWF0ZSB0aGUgZnVsbCwgbm9uLWZpbHRlcmVkIHgtYXhpcyBwbG90IHdpdGggZHluYW1pYyB4IHBsYWNlbWVudCBmb3IgYW5ub3RhdGlvbnMNCnAxIDwtIGdncGxvdChucnRfbG9uZywgYWVzKHggPSBhcy5pbnRlZ2VyKERhdGUpLCB5ID0gQ0FHUl9WYWx1ZSwgY29sb3IgPSBDQUdSX1BlcmlvZCkpICsNCg0KICAjIEFkZCBzaGFkZWQgYXJlYXMgZm9yIGJhY2tncm91bmQgZWZmZWN0DQogIGdlb21fcmVjdChhZXMoeG1pbiA9IC1JbmYsIHhtYXggPSBJbmYsIHltaW4gPSB0YXJnZXRfYWdncmVzc2l2ZSwgeW1heCA9IEluZiksIGZpbGwgPSAibGlnaHRncmVlbiIsIGFscGhhID0gMC4wMTApICsNCiAgZ2VvbV9yZWN0KGFlcyh4bWluID0gLUluZiwgeG1heCA9IEluZiwgeW1pbiA9IHRhcmdldF9jb25zZXJ2YXRpdmUsIHltYXggPSB0YXJnZXRfYWdncmVzc2l2ZSksIGZpbGwgPSAib3JhbmdlIiwgYWxwaGEgPSAwLjAxKSArDQogIGdlb21fcmVjdChhZXMoeG1pbiA9IC1JbmYsIHhtYXggPSBJbmYsIHltaW4gPSAtSW5mLCB5bWF4ID0gdGFyZ2V0X2NvbnNlcnZhdGl2ZSksIGZpbGwgPSAibGlnaHRjb3JhbCIsIGFscGhhID0gMC4wMTApICsNCiAgDQogICMgUGxvdCBsaW5lcyBmb3IgZWFjaCBDQUdSIFBlcmlvZA0KICBnZW9tX2xpbmUoc2l6ZSA9IDEuMCwgYWxwaGEgPSAzLjApICsgICAgICAgIyBMaW5lIGZvciBlYWNoIENBR1INCiAgZ2VvbV9wb2ludChzaXplID0gMS4wLCBhbHBoYSA9IDMuMCkgKyAgICAgICAjIFBvaW50cyBmb3IgZWFjaCBDQUdSDQogIA0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSB0YXJnZXRfYWdncmVzc2l2ZSwgY29sb3IgPSAiZGFya2JsdWUiLCBsaW5ldHlwZSA9ICJzb2xpZCIpICsNCiAgIyBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSB0YXJnZXRfbW9kZXJhdGUsIGNvbG9yID0gImRhcmtibHVlIiwgbGluZXR5cGUgPSAic29saWQiKSArDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IHRhcmdldF9jb25zZXJ2YXRpdmUsIGNvbG9yID0gImRhcmtibHVlIiwgbGluZXR5cGUgPSAic29saWQiKSArDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IHRhcmdldF9pbmZsYXRpb24sIGNvbG9yID0gImRhcmtyZWQiLCBsaW5ldHlwZSA9ICJkYXNoZWQiKSArDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IGNhZ3JfdmFsdWUsIGNvbG9yID0gImRhcmtyZWQiLCBsaW5ldHlwZSA9ICJkYXNoZWQiKSArDQogIA0KICAjIER5bmFtaWMgcmlnaHQtYWxpZ25lZCBwbGFjZW1lbnQgZm9yIGFubm90YXRpb25zDQogIGFubm90YXRlKCJ0ZXh0IiwgeCA9IEluZiwgeSA9IHRhcmdldF9hZ2dyZXNzaXZlLCBsYWJlbCA9ICJBZ2dyZXNzaXZlIiwgDQogICAgICAgICAgIGhqdXN0ID0gMSwgdmp1c3QgPSAtMC41MCwgY29sb3IgPSAiZGFya2JsdWUiLCBzaXplID0gNCkgKw0KICAjIGFubm90YXRlKCJ0ZXh0IiwgeCA9IEluZiwgeSA9IHRhcmdldF9tb2RlcmF0ZSwgbGFiZWwgPSAiTW9kZXJhdGUiLCANCiAgIyAgICAgICAgIGhqdXN0ID0gMSwgdmp1c3QgPSAtMC41MCwgY29sb3IgPSAiZGFya2JsdWUiLCBzaXplID0gNCkgKw0KICBhbm5vdGF0ZSgidGV4dCIsIHggPSBJbmYsIHkgPSB0YXJnZXRfY29uc2VydmF0aXZlLCBsYWJlbCA9ICJDb25zZXJ2YXRpdmUiLCANCiAgICAgICAgICAgaGp1c3QgPSAxLCB2anVzdCA9IC0wLjUwLCBjb2xvciA9ICJkYXJrYmx1ZSIsIHNpemUgPSA0KSArDQogIGFubm90YXRlKCJ0ZXh0IiwgeCA9IEluZiwgeSA9IHRhcmdldF9pbmZsYXRpb24sIGxhYmVsID0gIkluZmxhdGlvbiIsIA0KICAgICAgICAgICBoanVzdCA9IDEsIHZqdXN0ID0gLTAuNTAsIGNvbG9yID0gImRhcmtyZWQiLCBzaXplID0gNCkgKw0KICBhbm5vdGF0ZSgidGV4dCIsIHggPSBJbmYsIHkgPSBjYWdyX3ZhbHVlLCBsYWJlbCA9ICJDQUdSIiwgDQogICAgICAgICAgIGhqdXN0ID0gMSwgdmp1c3QgPSAtMC41MCwgY29sb3IgPSAiZGFya3JlZCIsIHNpemUgPSA0KSArIA0KDQogIGxhYnMoDQogICAgdGl0bGUgPSBkeW5hbWljX3RpdGxlLA0KICAgIHggPSAiWWVhciIsDQogICAgeSA9ICJDQUdSIFZhbHVlICglKSIsDQogICAgY29sb3IgPSAiQ0FHUiBQZXJpb2QiLA0KICAgIGNhcHRpb24gPSBkeW5hbWljX2NhcHRpb24NCiAgICApICsNCiAgDQogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjdXN0b21fY29sb3JzKSArICAjIFNldCBjb2xvcnMgZm9yIGVhY2ggQ0FHUiBQZXJpb2QNCiAgc2NhbGVfeF9jb250aW51b3VzKA0KICAgIGxpbWl0cyA9IGMoc3RhcnRfeWVhciwgZW5kX3llYXIgKyAzKSwgDQogICAgYnJlYWtzID0gc2VxKGxpbWl0c19zdGFydF95ZWFyLCBsaW1pdHNfZW5kX3llYXIgLCA1KSkgKyAgIyBSZXN0cmljdCAmIFNldCBNYWpvciB4LWF4aXMgbGluZXMgZm9yIGVhY2ggeWVhcg0KICANCiAgdGhlbWVfbWluaW1hbCgpICsNCiAgdGhlbWUoDQogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSwgc2l6ZSA9IDIwKSwgICAgICAgICAjIExhcmdlciB0aXRsZSBmb250DQogICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCksICAgICAgICAgICAgICAgICAgICAjIExhcmdlciB4LWF4aXMgbGFiZWwgZm9udA0KICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQpLCAgICAgICAgICAgICAgICAgICAgIyBMYXJnZXIgeS1heGlzIGxhYmVsIGZvbnQNCiAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEsIHNpemUgPSAxNCksICAjIExhcmdlciB4LWF4aXMgdGV4dA0KICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCksICAgICAgICAgICAgICAgICAgICAgIyBMYXJnZXIgeS1heGlzIHRleHQNCiAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0KSwgICAgICAgICAgICAgICAgICAgICMgTGVnZW5kIHRpdGxlIHNpemUNCiAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIpLCAgICAgICAgICAgICAgICAgICAgICMgTGVnZW5kIHRleHQgc2l6ZQ0KICAgIHBhbmVsLmdyaWQubWFqb3IgPSBlbGVtZW50X2xpbmUobGluZXR5cGUgPSAiZG90dGVkIiwgY29sb3IgPSAiYmxhY2siKSwgICMgTWFqb3IgZ3JpZCBsaW5lcw0KICAgIHBhbmVsLmdyaWQubWlub3IueCA9IGVsZW1lbnRfYmxhbmsoKSwgICAgICAgICAgICAgICAgICAgICAgIyBObyBtaW5vciB4IGdyaWQgbGluZXMNCiAgICBheGlzLnRpY2tzLmxlbmd0aCA9IHVuaXQoLTAuMjUsICJjbSIpLCAgICAgICAgICAgICAgICAgICAgICAjIEluY3JlYXNlIHRpY2sgbGVuZ3RoDQogICAgYXhpcy50aWNrcyA9IGVsZW1lbnRfbGluZShjb2xvciA9ICJibGFjayIsIHNpemUgPSAwLjUwKSwgICAjIERhcmtlciB0aWNrcw0KICAgIGF4aXMubGluZS54ID0gZWxlbWVudF9saW5lKGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDAuNzUpLCAgIyBEYXJrIGJvdHRvbSBib3JkZXINCiAgICBheGlzLmxpbmUueSA9IGVsZW1lbnRfbGluZShjb2xvciA9ICJibGFjayIsIHNpemUgPSAwLjc1KSAgICMgRGFyayBsZWZ0IGJvcmRlcg0KICApDQoNCiMgUHJpbnQgdGhlIHBsb3QgDQpwcmludChwMSkNCg0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiMjIFBMT1QgUkVTVFJJQ1RFRCBXSVRIIExJTUlUUyANCg0KIyBGaWx0ZXIgdGhlIGRhdGEgZm9yIHRoZSByZXN0cmljdGVkIHgtYXhpcyByYW5nZSAoMjAxMi0yMDI0KQ0KcmVzdHJpY3RlZF9kYXRhIDwtIG5ydF9sb25nICU+JQ0KICBmaWx0ZXIoYXMuaW50ZWdlcihEYXRlKSA+PSAyMDEyICYgYXMuaW50ZWdlcihEYXRlKSA8PSAyMDI0KQ0KDQojIERlZmluZSBzdGFydCBhbmQgZW5kIHllYXJzDQpzdGFydF95ZWFyIDwtIDIwMTINCmVuZF95ZWFyIDwtIDIwMjQNCnllYXJfcmFuZ2UgPC0gZW5kX3llYXIgLSBzdGFydF95ZWFyICsgMSAgIyBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiB5ZWFycw0KDQojIERlZmluZSBicmVha3Mgcm91bmRlZCBhcHByb3ByaWF0ZWx5DQpsaW1pdHNfc3RhcnRfeWVhciA8LSBmbG9vcihzdGFydF95ZWFyIC8gNSkgKiA1ICAjIFJvdW5kIGRvd24gdG8gdGhlIG5lYXJlc3QgbXVsdGlwbGUgb2YgNQ0KbGltaXRzX2VuZF95ZWFyIDwtIGNlaWxpbmcoZW5kX3llYXIgLyA1KSAqIDUgICAjIFJvdW5kIHVwIHRvIHRoZSBuZWFyZXN0IG11bHRpcGxlIG9mIDUNCg0KIyBDcmVhdGUgZHluYW1pYyB0aXRsZSBhbmQgY2FwdGlvbg0KZHluYW1pY190aXRsZSA8LSBwYXN0ZTAoIlJvbGxpbmcgQ0FHUnMgQWNyb3NzIFBlcmlvZHMgT3ZlciAiLHllYXJfcmFuZ2UsICIgWWVhcnMgKCIsIHN0YXJ0X3llYXIsICItIiwgZW5kX3llYXIsICIpIikNCmR5bmFtaWNfY2FwdGlvbiA8LSBwYXN0ZTAoIlZPTyBDb21wb3VuZCBBdmVyYWdlIEdyb3d0aCBSYXRlcyBBY3Jvc3MgUm9sbGluZyBQZXJpb2RzLCBEYXRhc2V0ICgiLCBtaW5feWVhciwgIi0iLCBtYXhfeWVhciwgIikiKQ0KDQojIENhbGN1bGF0ZSBkeW5hbWljIHktYXhpcyBsaW1pdHMgZm9yIHRoZSByZXN0cmljdGVkIGRhdGENCnlfbWluIDwtIG1pbihyZXN0cmljdGVkX2RhdGEkQ0FHUl9WYWx1ZSwgbmEucm0gPSBUUlVFKQ0KeV9tYXggPC0gbWF4KHJlc3RyaWN0ZWRfZGF0YSRDQUdSX1ZhbHVlLCBuYS5ybSA9IFRSVUUpDQoNCiMgQ3JlYXRlIHRoZSBmaWx0ZXJlZCwgcmVzdHJpY3RlZCB4LWF4aXMgcGxvdCB3aXRoIGR5bmFtaWMgeCBwbGFjZW1lbnQgZm9yIGFubm90YXRpb25zDQpwMyA8LSBnZ3Bsb3QobnJ0X2xvbmcsIGFlcyh4ID0gYXMuaW50ZWdlcihEYXRlKSwgeSA9IENBR1JfVmFsdWUsIGNvbG9yID0gQ0FHUl9QZXJpb2QpKSArDQoNCiAgIyBBZGQgc2hhZGVkIGFyZWFzIGZvciBiYWNrZ3JvdW5kIGVmZmVjdA0KICBnZW9tX3JlY3QoYWVzKHhtaW4gPSAtSW5mLCB4bWF4ID0gSW5mLCB5bWluID0gdGFyZ2V0X2FnZ3Jlc3NpdmUsIHltYXggPSBJbmYpLCBmaWxsID0gImxpZ2h0Z3JlZW4iLCBhbHBoYSA9IDAuMDEwKSArDQogIGdlb21fcmVjdChhZXMoeG1pbiA9IC1JbmYsIHhtYXggPSBJbmYsIHltaW4gPSB0YXJnZXRfY29uc2VydmF0aXZlLCB5bWF4ID0gdGFyZ2V0X2FnZ3Jlc3NpdmUpLCBmaWxsID0gIm9yYW5nZSIsIGFscGhhID0gMC4wMSkgKw0KICBnZW9tX3JlY3QoYWVzKHhtaW4gPSAtSW5mLCB4bWF4ID0gSW5mLCB5bWluID0gLUluZiwgeW1heCA9IHRhcmdldF9jb25zZXJ2YXRpdmUpLCBmaWxsID0gImxpZ2h0Y29yYWwiLCBhbHBoYSA9IDAuMDEwKSArDQogIA0KICAjIFBsb3QgbGluZXMgZm9yIGVhY2ggQ0FHUiBQZXJpb2QNCiAgZ2VvbV9saW5lKHNpemUgPSAxLjAsIGFscGhhID0gMy4wKSArICAgICAgICMgTGluZSBmb3IgZWFjaCBDQUdSDQogIGdlb21fcG9pbnQoc2l6ZSA9IDEuMCwgYWxwaGEgPSAzLjApICsgICAgICAgIyBQb2ludHMgZm9yIGVhY2ggQ0FHUg0KDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IHRhcmdldF9hZ2dyZXNzaXZlLCBjb2xvciA9ICJkYXJrYmx1ZSIsIGxpbmV0eXBlID0gInNvbGlkIikgKw0KICAjIGdlb21faGxpbmUoeWludGVyY2VwdCA9IHRhcmdldF9tb2RlcmF0ZSwgY29sb3IgPSAiZGFya2JsdWUiLCBsaW5ldHlwZSA9ICJzb2xpZCIpICsNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gdGFyZ2V0X2NvbnNlcnZhdGl2ZSwgY29sb3IgPSAiZGFya2JsdWUiLCBsaW5ldHlwZSA9ICJzb2xpZCIpICsNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gdGFyZ2V0X2luZmxhdGlvbiwgY29sb3IgPSAiZGFya3JlZCIsIGxpbmV0eXBlID0gImRhc2hlZCIpICsNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gY2Fncl92YWx1ZSwgY29sb3IgPSAiZGFya3JlZCIsIGxpbmV0eXBlID0gImRhc2hlZCIpICsNCiAgDQogICMgRHluYW1pYyByaWdodC1hbGlnbmVkIHBsYWNlbWVudCBmb3IgYW5ub3RhdGlvbnMNCiAgYW5ub3RhdGUoInRleHQiLCB4ID0gSW5mLCB5ID0gdGFyZ2V0X2FnZ3Jlc3NpdmUsIGxhYmVsID0gIkFnZ3Jlc3NpdmUiLCANCiAgICAgICAgICAgaGp1c3QgPSAxLCB2anVzdCA9IC0wLjUwLCBjb2xvciA9ICJkYXJrYmx1ZSIsIHNpemUgPSA0KSArDQogICMgYW5ub3RhdGUoInRleHQiLCB4ID0gSW5mLCB5ID0gdGFyZ2V0X21vZGVyYXRlLCBsYWJlbCA9ICJNb2RlcmF0ZSIsIA0KICAjICAgICAgICAgaGp1c3QgPSAxLCB2anVzdCA9IC0wLjUwLCBjb2xvciA9ICJkYXJrYmx1ZSIsIHNpemUgPSA0KSArDQogIGFubm90YXRlKCJ0ZXh0IiwgeCA9IEluZiwgeSA9IHRhcmdldF9jb25zZXJ2YXRpdmUsIGxhYmVsID0gIkNvbnNlcnZhdGl2ZSIsIA0KICAgICAgICAgICBoanVzdCA9IDEsIHZqdXN0ID0gLTAuNTAsIGNvbG9yID0gImRhcmtibHVlIiwgc2l6ZSA9IDQpICsNCiAgYW5ub3RhdGUoInRleHQiLCB4ID0gSW5mLCB5ID0gdGFyZ2V0X2luZmxhdGlvbiwgbGFiZWwgPSAiSW5mbGF0aW9uIiwgDQogICAgICAgICAgIGhqdXN0ID0gMSwgdmp1c3QgPSAtMC41MCwgY29sb3IgPSAiZGFya3JlZCIsIHNpemUgPSA0KSArDQogIGFubm90YXRlKCJ0ZXh0IiwgeCA9IEluZiwgeSA9IGNhZ3JfdmFsdWUsIGxhYmVsID0gIkNBR1IiLCANCiAgICAgICAgICAgaGp1c3QgPSAxLCB2anVzdCA9IC0wLjUwLCBjb2xvciA9ICJkYXJrcmVkIiwgc2l6ZSA9IDQpICsgDQoNCiAgbGFicygNCiAgICB0aXRsZSA9IGR5bmFtaWNfdGl0bGUsDQogICAgeCA9ICJZZWFyIiwNCiAgICB5ID0gIkNBR1IgVmFsdWUgKCUpIiwNCiAgICBjb2xvciA9ICJDQUdSIFBlcmlvZCIsDQogICAgY2FwdGlvbiA9IGR5bmFtaWNfY2FwdGlvbg0KICAgICkgKw0KICANCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGN1c3RvbV9jb2xvcnMpICsgICMgU2V0IGNvbG9ycyBmb3IgZWFjaCBDQUdSIFBlcmlvZA0KICBjb29yZF9jYXJ0ZXNpYW4oeWxpbSA9IGMoeV9taW4sIHlfbWF4KSkgKyAjIEFwcGx5IGR5bmFtaWMgeS1heGlzIGxpbWl0cw0KICBzY2FsZV94X2NvbnRpbnVvdXMoDQogICAgbGltaXRzID0gYyhzdGFydF95ZWFyLCBlbmRfeWVhciArIDIgKyAxKSwgDQogICAgYnJlYWtzID0gc2VxKGxpbWl0c19zdGFydF95ZWFyLCBsaW1pdHNfZW5kX3llYXIsIDUpDQogICkgKyAgIyBSZXN0cmljdCAmIFNldCBNYWpvciB4LWF4aXMgbGluZXMgZm9yIGVhY2ggeWVhcg0KDQogIHRoZW1lX21pbmltYWwoKSArDQogIHRoZW1lKA0KICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUsIHNpemUgPSAyMCksICAgICAgICAgIyBMYXJnZXIgdGl0bGUgZm9udA0KICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQpLCAgICAgICAgICAgICAgICAgICAgIyBMYXJnZXIgeC1heGlzIGxhYmVsIGZvbnQNCiAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0KSwgICAgICAgICAgICAgICAgICAgICMgTGFyZ2VyIHktYXhpcyBsYWJlbCBmb250DQogICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxLCBzaXplID0gMTQpLCAgIyBMYXJnZXIgeC1heGlzIHRleHQNCiAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQpLCAgICAgICAgICAgICAgICAgICAgICMgTGFyZ2VyIHktYXhpcyB0ZXh0DQogICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCksICAgICAgICAgICAgICAgICAgICAjIExlZ2VuZCB0aXRsZSBzaXplDQogICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyKSwgICAgICAgICAgICAgICAgICAgICAjIExlZ2VuZCB0ZXh0IHNpemUNCiAgICBwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9saW5lKGxpbmV0eXBlID0gImRvdHRlZCIsIGNvbG9yID0gImJsYWNrIiksICAjIE1ham9yIGdyaWQgbGluZXMNCiAgICBwYW5lbC5ncmlkLm1pbm9yLnggPSBlbGVtZW50X2JsYW5rKCksICAgICAgICAgICAgICAgICAgICAgICMgTm8gbWlub3IgeCBncmlkIGxpbmVzDQogICAgYXhpcy50aWNrcy5sZW5ndGggPSB1bml0KC0wLjI1LCAiY20iKSwgICAgICAgICAgICAgICAgICAgICAgIyBJbmNyZWFzZSB0aWNrIGxlbmd0aA0KICAgIGF4aXMudGlja3MgPSBlbGVtZW50X2xpbmUoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMC41MCksICAgIyBEYXJrZXIgdGlja3MNCiAgICBheGlzLmxpbmUueCA9IGVsZW1lbnRfbGluZShjb2xvciA9ICJibGFjayIsIHNpemUgPSAwLjc1KSwgICMgRGFyayBib3R0b20gYm9yZGVyDQogICAgYXhpcy5saW5lLnkgPSBlbGVtZW50X2xpbmUoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMC43NSkgICAjIERhcmsgbGVmdCBib3JkZXINCiAgKQ0KDQojIFByaW50IHRoZSBwbG90IA0KcHJpbnQocDMpDQoNCmBgYA0KDQojIyMjIFNob3J0LVRlcm0NCg0KYGBge3Igdm9vX3Jhd19jYWdyX2dyYXBoc19zaG9ydCwgZmlnLndpZHRoPTEwLCBmaWcuaGVpZ2h0PTd9DQoNCmNhdCgiXG5cbiMjIyMgQ29tcG91bmQgQXZlcmFnZSBHcm93dGggUmF0ZXMgQWNyb3NzIFNob3J0LVRlcm0gUm9sbGluZyBQZXJpb2RzIFxuIikNCg0KIyBGaWx0ZXIgZGF0YSBmb3IgU2hvcnQtVGVybSBDQUdSICg1LVllYXIgYW5kIDEwLVllYXIpDQpzaG9ydHRlcm1fZGF0YSA8LSBucnRfbG9uZyAlPiUNCiAgZmlsdGVyKENBR1JfUGVyaW9kICVpbiUgYygiNS1ZZWFyIENBR1IiLCAiMTAtWWVhciBDQUdSIikpDQoNCg0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiMjIFBMT1QgRlVMTCBXSVRIT1VUIExJTUlUUw0KDQojIERlZmluZSBzdGFydCBhbmQgZW5kIHllYXJzDQpzdGFydF95ZWFyIDwtIDIwMTYNCmVuZF95ZWFyIDwtIDIwMjQNCnllYXJfcmFuZ2UgPC0gZW5kX3llYXIgLSBzdGFydF95ZWFyICsgMSAgIyBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiB5ZWFycw0KDQojIERlZmluZSBicmVha3Mgcm91bmRlZCBhcHByb3ByaWF0ZWx5DQpsaW1pdHNfc3RhcnRfeWVhciA8LSBmbG9vcihzdGFydF95ZWFyIC8gNSkgKiA1ICAjIFJvdW5kIGRvd24gdG8gdGhlIG5lYXJlc3QgbXVsdGlwbGUgb2YgNQ0KbGltaXRzX2VuZF95ZWFyIDwtIGNlaWxpbmcoZW5kX3llYXIgLyA1KSAqIDUgICAjIFJvdW5kIHVwIHRvIHRoZSBuZWFyZXN0IG11bHRpcGxlIG9mIDUNCg0KIyBDcmVhdGUgZHluYW1pYyB0aXRsZSBhbmQgY2FwdGlvbg0KZHluYW1pY190aXRsZSA8LSBwYXN0ZTAoIkNBR1IgQWNyb3NzIFNob3J0LVRlcm0gUGVyaW9kcyBPdmVyICIseWVhcl9yYW5nZSwgIiBZZWFycyAoIiwgc3RhcnRfeWVhciwgIi0iLCBlbmRfeWVhciwgIikiKQ0KZHluYW1pY19jYXB0aW9uIDwtIHBhc3RlMCgiVk9PIENvbXBvdW5kIEF2ZXJhZ2UgR3Jvd3RoIFJhdGVzIEFjcm9zcyBTaG9ydC1UZXJtIFJvbGxpbmcgUGVyaW9kcywgRGF0YXNldCAoIiwgbWluX3llYXIsICItIiwgbWF4X3llYXIsICIpIikNCg0KIyBDcmVhdGUgdGhlIGZ1bGwsIG5vbi1maWx0ZXJlZCB4LWF4aXMgcGxvdCB3aXRoIGR5bmFtaWMgeCBwbGFjZW1lbnQgZm9yIGFubm90YXRpb25zDQpwMV9zaG9ydHRlcm0gPC0gZ2dwbG90KHNob3J0dGVybV9kYXRhLCBhZXMoeCA9IGFzLmludGVnZXIoRGF0ZSksIHkgPSBDQUdSX1ZhbHVlLCBjb2xvciA9IENBR1JfUGVyaW9kKSkgKw0KDQogICMgQWRkIHNoYWRlZCBhcmVhcyBmb3IgYmFja2dyb3VuZCBlZmZlY3QNCiAgZ2VvbV9yZWN0KGFlcyh4bWluID0gLUluZiwgeG1heCA9IEluZiwgeW1pbiA9IHRhcmdldF9hZ2dyZXNzaXZlLCB5bWF4ID0gSW5mKSwgZmlsbCA9ICJsaWdodGdyZWVuIiwgYWxwaGEgPSAwLjAxMCkgKw0KICBnZW9tX3JlY3QoYWVzKHhtaW4gPSAtSW5mLCB4bWF4ID0gSW5mLCB5bWluID0gdGFyZ2V0X2NvbnNlcnZhdGl2ZSwgeW1heCA9IHRhcmdldF9hZ2dyZXNzaXZlKSwgZmlsbCA9ICJvcmFuZ2UiLCBhbHBoYSA9IDAuMDEpICsNCiAgZ2VvbV9yZWN0KGFlcyh4bWluID0gLUluZiwgeG1heCA9IEluZiwgeW1pbiA9IC1JbmYsIHltYXggPSB0YXJnZXRfY29uc2VydmF0aXZlKSwgZmlsbCA9ICJsaWdodGNvcmFsIiwgYWxwaGEgPSAwLjAxMCkgKw0KICANCiAgIyBQbG90IGxpbmVzIGZvciBlYWNoIENBR1IgUGVyaW9kDQogIGdlb21fbGluZShzaXplID0gMS4wLCBhbHBoYSA9IDMuMCkgKyAgICAgICAjIExpbmUgZm9yIGVhY2ggQ0FHUg0KICBnZW9tX3BvaW50KHNpemUgPSAxLjAsIGFscGhhID0gMy4wKSArICAgICAgICMgUG9pbnRzIGZvciBlYWNoIENBR1INCg0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSB0YXJnZXRfYWdncmVzc2l2ZSwgY29sb3IgPSAiZGFya2JsdWUiLCBsaW5ldHlwZSA9ICJzb2xpZCIpICsNCiAgIyBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSB0YXJnZXRfbW9kZXJhdGUsIGNvbG9yID0gImRhcmtibHVlIiwgbGluZXR5cGUgPSAic29saWQiKSArDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IHRhcmdldF9jb25zZXJ2YXRpdmUsIGNvbG9yID0gImRhcmtibHVlIiwgbGluZXR5cGUgPSAic29saWQiKSArDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IHRhcmdldF9pbmZsYXRpb24sIGNvbG9yID0gImRhcmtyZWQiLCBsaW5ldHlwZSA9ICJkYXNoZWQiKSArDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IGNhZ3JfdmFsdWUsIGNvbG9yID0gImRhcmtyZWQiLCBsaW5ldHlwZSA9ICJkYXNoZWQiKSArDQogIA0KICAjIER5bmFtaWMgcmlnaHQtYWxpZ25lZCBwbGFjZW1lbnQgZm9yIGFubm90YXRpb25zDQogIGFubm90YXRlKCJ0ZXh0IiwgeCA9IEluZiwgeSA9IHRhcmdldF9hZ2dyZXNzaXZlLCBsYWJlbCA9ICJBZ2dyZXNzaXZlIiwgDQogICAgICAgICAgIGhqdXN0ID0gMSwgdmp1c3QgPSAtMC41MCwgY29sb3IgPSAiZGFya2JsdWUiLCBzaXplID0gNCkgKw0KICAjIGFubm90YXRlKCJ0ZXh0IiwgeCA9IEluZiwgeSA9IHRhcmdldF9tb2RlcmF0ZSwgbGFiZWwgPSAiTW9kZXJhdGUiLCANCiAgIyAgICAgICAgIGhqdXN0ID0gMSwgdmp1c3QgPSAtMC41MCwgY29sb3IgPSAiZGFya2JsdWUiLCBzaXplID0gNCkgKw0KICBhbm5vdGF0ZSgidGV4dCIsIHggPSBJbmYsIHkgPSB0YXJnZXRfY29uc2VydmF0aXZlLCBsYWJlbCA9ICJDb25zZXJ2YXRpdmUiLCANCiAgICAgICAgICAgaGp1c3QgPSAxLCB2anVzdCA9IC0wLjUwLCBjb2xvciA9ICJkYXJrYmx1ZSIsIHNpemUgPSA0KSArDQogIGFubm90YXRlKCJ0ZXh0IiwgeCA9IEluZiwgeSA9IHRhcmdldF9pbmZsYXRpb24sIGxhYmVsID0gIkluZmxhdGlvbiIsIA0KICAgICAgICAgICBoanVzdCA9IDEsIHZqdXN0ID0gLTAuNTAsIGNvbG9yID0gImRhcmtyZWQiLCBzaXplID0gNCkgKw0KICBhbm5vdGF0ZSgidGV4dCIsIHggPSBJbmYsIHkgPSBjYWdyX3ZhbHVlLCBsYWJlbCA9ICJDQUdSIiwgDQogICAgICAgICAgIGhqdXN0ID0gMSwgdmp1c3QgPSAtMC41MCwgY29sb3IgPSAiZGFya3JlZCIsIHNpemUgPSA0KSArIA0KDQogIGxhYnMoDQogICAgdGl0bGUgPSBkeW5hbWljX3RpdGxlLA0KICAgIHggPSAiWWVhciIsDQogICAgeSA9ICJDQUdSIFZhbHVlICglKSIsDQogICAgY29sb3IgPSAiQ0FHUiBQZXJpb2QiLA0KICAgIGNhcHRpb24gPSBkeW5hbWljX2NhcHRpb24NCiAgICApICsNCiAgDQogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjdXN0b21fY29sb3JzW2MoIjUtWWVhciBDQUdSIiwgIjEwLVllYXIgQ0FHUiIpXSkgKw0KICBzY2FsZV94X2NvbnRpbnVvdXMoDQogICAgbGltaXRzID0gYyhzdGFydF95ZWFyLCBlbmRfeWVhciArIDEpLCANCiAgICBicmVha3MgPSBzZXEobGltaXRzX3N0YXJ0X3llYXIsIGxpbWl0c19lbmRfeWVhciArIDEgLCA1KQ0KICApICsgICMgUmVzdHJpY3QgJiBTZXQgTWFqb3IgeC1heGlzIGxpbmVzIGZvciBlYWNoIHllYXINCg0KICB0aGVtZV9taW5pbWFsKCkgKw0KICB0aGVtZSgNCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41LCBzaXplID0gMjApLCAgICAgICAgICMgTGFyZ2VyIHRpdGxlIGZvbnQNCiAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0KSwgICAgICAgICAgICAgICAgICAgICMgTGFyZ2VyIHgtYXhpcyBsYWJlbCBmb250DQogICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCksICAgICAgICAgICAgICAgICAgICAjIExhcmdlciB5LWF4aXMgbGFiZWwgZm9udA0KICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSwgc2l6ZSA9IDE0KSwgICMgTGFyZ2VyIHgtYXhpcyB0ZXh0DQogICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0KSwgICAgICAgICAgICAgICAgICAgICAjIExhcmdlciB5LWF4aXMgdGV4dA0KICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQpLCAgICAgICAgICAgICAgICAgICAgIyBMZWdlbmQgdGl0bGUgc2l6ZQ0KICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiksICAgICAgICAgICAgICAgICAgICAgIyBMZWdlbmQgdGV4dCBzaXplDQogICAgcGFuZWwuZ3JpZC5tYWpvciA9IGVsZW1lbnRfbGluZShsaW5ldHlwZSA9ICJkb3R0ZWQiLCBjb2xvciA9ICJibGFjayIpLCAgIyBNYWpvciBncmlkIGxpbmVzDQogICAgcGFuZWwuZ3JpZC5taW5vci54ID0gZWxlbWVudF9ibGFuaygpLCAgICAgICAgICAgICAgICAgICAgICAjIE5vIG1pbm9yIHggZ3JpZCBsaW5lcw0KICAgIGF4aXMudGlja3MubGVuZ3RoID0gdW5pdCgtMC4yNSwgImNtIiksICAgICAgICAgICAgICAgICAgICAgICMgSW5jcmVhc2UgdGljayBsZW5ndGgNCiAgICBheGlzLnRpY2tzID0gZWxlbWVudF9saW5lKGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDAuNTApLCAgICMgRGFya2VyIHRpY2tzDQogICAgYXhpcy5saW5lLnggPSBlbGVtZW50X2xpbmUoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMC43NSksICAjIERhcmsgYm90dG9tIGJvcmRlcg0KICAgIGF4aXMubGluZS55ID0gZWxlbWVudF9saW5lKGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDAuNzUpICAgIyBEYXJrIGxlZnQgYm9yZGVyDQogICkNCg0KIyBQcmludCB0aGUgcGxvdCANCnByaW50KHAxX3Nob3J0dGVybSkNCg0KYGBgDQoNCiMgVkdUDQoNClRoZSBWYW5ndWFyZCBJbmZvcm1hdGlvbiBUZWNobm9sb2d5IEVURiAoVkdUKSBpcyBhbiBleGNoYW5nZS10cmFkZWQgZnVuZCAoRVRGKSB0aGF0IHByb3ZpZGVzIHRhcmdldGVkIGV4cG9zdXJlIHRvIHRoZSBpbmZvcm1hdGlvbiB0ZWNobm9sb2d5IHNlY3RvciBvZiB0aGUgVS5TLiBzdG9jayBtYXJrZXQuIE1hbmFnZWQgYnkgVmFuZ3VhcmQsIFZHVCBzZWVrcyB0byB0cmFjayB0aGUgcGVyZm9ybWFuY2Ugb2YgdGhlIE1TQ0kgVVMgSW52ZXN0YWJsZSBNYXJrZXQgSW5mb3JtYXRpb24gVGVjaG5vbG9neSAyNS81MCBJbmRleCwgd2hpY2ggaW5jbHVkZXMgY29tcGFuaWVzIGludm9sdmVkIGluIHNvZnR3YXJlIGRldmVsb3BtZW50LCBoYXJkd2FyZSBtYW51ZmFjdHVyaW5nLCBzZW1pY29uZHVjdG9ycywgSVQgc2VydmljZXMsIGFuZCBvdGhlciB0ZWNoLXJlbGF0ZWQgaW5kdXN0cmllcy4NCg0KVkdUIGlzIHBvcHVsYXIgYW1vbmcgaW52ZXN0b3JzIGxvb2tpbmcgdG8gY2FwaXRhbGl6ZSBvbiB0aGUgZ3Jvd3RoIHBvdGVudGlhbCBvZiB0aGUgdGVjaG5vbG9neSBzZWN0b3IuIEl0cyBob2xkaW5ncyBpbmNsdWRlIHNvbWUgb2YgdGhlIGxhcmdlc3QgYW5kIG1vc3QgaW5ub3ZhdGl2ZSBjb21wYW5pZXMsIHN1Y2ggYXMgQXBwbGUsIE1pY3Jvc29mdCwgYW5kIE5WSURJQS4gVGhlIEVURiBvZmZlcnMgYSBjb3N0LWVmZmVjdGl2ZSB3YXkgdG8gZ2FpbiBkaXZlcnNpZmllZCBleHBvc3VyZSB0byB0aGlzIGhpZ2gtZ3Jvd3RoIHNlY3Rvci4NCg0KIyMgVkdUIEdSDQoNCiMjIyBEYXRhDQoNClRoZSBWR1QgRGF0YSBwcmVzZW50ZWQgaGVyZSBpcyBzb3VyY2VkIGZyb20gWWFob28gRmluYW5jZSwgZmlsdGVyZWQgdG8gZGlzcGxheSBNb250aGx5IEhpc3RvcmljYWwgRGF0YSAoZS5nLiwgMDMvMDEvMjAyNCkuIFRoaXMgZGF0YSByZXByZXNlbnRzIHRoZSBjbG9zaW5nIHByaWNlIG9mIHRoZSBsYXN0IHRyYWRpbmcgZGF5IG9mIGVhY2ggbW9udGggKGUuZy4sIDAzLzI4LzIwMjQpLiBQbGVhc2Ugbm90ZSB0aGF0IHRoZSBzdGF0aXN0aWNzIHByZXNlbnRlZCBoZXJlIG1heSBkaWZmZXIgZnJvbSB0aG9zZSBpbiBZYWhvbyBGaW5hbmNlJ3MgUGVyZm9ybWFuY2Ugc2VjdGlvbiBkdWUgdG8gZGlmZmVyZW5jZXMgaW4gZGF0YSBhZ2dyZWdhdGlvbiBhbmQgY2FsY3VsYXRpb24gbWV0aG9kcy4gIA0KDQpEYXRhIFNvdXJjZTogYHIgbnJ2JHNvdXJjZV92Z3RfeWFob29gDQoNCmBgYHtyIHZndF9yYXcsIGV2YWw9VFJVRSwgZWNobz1GQUxTRX0NCg0KIyBEaXNwbGF5IHRoZSBzdHJ1Y3R1cmUgb2YgdGhlIGRhdGFzZXQgdG8gY29uZmlybSBjb2x1bW4gbmFtZXMNCmludGVyYWN0aXZlX3N0cihucnQkdmd0X3JhdykNCg0KbGlicmFyeShkcGx5cikNCmxpYnJhcnkobHVicmlkYXRlKSAgIyBGb3IgZGF0ZSBtYW5pcHVsYXRpb24NCmxpYnJhcnkoc2NhbGVzKQ0KbGlicmFyeShzdHJpbmdyKQ0KDQojIEVuc3VyZSB0aGUgJ0RhdGUnIGNvbHVtbiBpcyBvZiBEYXRlIGNsYXNzDQp2Z3RfcmF3IDwtIG5ydCR2Z3RfcmF3ICU+JQ0KICBtdXRhdGUoRGF0ZSA9IGFzLkRhdGUoRGF0ZSwgZm9ybWF0ID0gIiVZLSVtLSVkIikpDQoNCiMgRmluZCB0aGUgbWluaW11bSBhbmQgbWF4aW11bSB5ZWFyDQptaW5feWVhciA8LSBmb3JtYXQobWluKHZndF9yYXckRGF0ZSwgbmEucm0gPSBUUlVFKSwgIiVZIikNCm1heF95ZWFyIDwtIGZvcm1hdChtYXgodmd0X3JhdyREYXRlLCBuYS5ybSA9IFRSVUUpLCAiJVkiKQ0KaW50ZXJhY3RpdmVfcHJpbnQobWluX3llYXIpDQppbnRlcmFjdGl2ZV9wcmludChtYXhfeWVhcikNCg0KIyBVcGRhdGUgZGF0YSBmcmFtZSB3aXRoIHByb3BlciBkYXRlIGFuZCBwZXJjZW50YWdlIGhhbmRsaW5nDQp2Z3RfcmF3IDwtIHZndF9yYXcgJT4lDQogIG11dGF0ZSgNCiAgICAjIENvbnZlcnQgQ2xvc2UgRGF0ZSB0byAiWVlZWS1NTS1ERCIgZm9ybWF0DQogICAgYERhdGVgID0gZm9ybWF0KGFzLkRhdGUoYXMuY2hhcmFjdGVyKGBEYXRlYCksIG9yaWdpbiA9ICIxOTcwLTAxLTAxIiksICIlWS0lbS0lZCIpLA0KDQogICAgIyBFbnN1cmUgQ2xvc2UgaXMgYSBudW1iZXIgZm9ybWF0dGVkIHRvIDIgZGVjaW1hbCBwbGFjZXMNCiAgICBgQ2xvc2VgID0gbnVtYmVyKGFzLm51bWVyaWMoZ3N1YigiLCIsICIiLCBDbG9zZSkpLCBiaWcubWFyayA9ICIsIiwgZGVjaW1hbC5tYXJrID0gIi4iLCBhY2N1cmFjeSA9IDAuMDEpLA0KDQogICAgIyBDbGVhbiBhbmQgaGFuZGxlIHBlcmNlbnRhZ2UgY29sdW1ucw0KICAgIGFjcm9zcygzOjMsIH4gew0KICAgICAgdmFsdWUgPC0gZ3N1YigiWywlXFxzXSIsICIiLCAuKSAgIyBSZW1vdmUgJSwgY29tbWFzLCBhbmQgc3BhY2VzDQogICAgICBudW1lcmljX3ZhbHVlIDwtIHN1cHByZXNzV2FybmluZ3MoYXMubnVtZXJpYyh2YWx1ZSkpICAjIENvbnZlcnQgdG8gbnVtZXJpYw0KICAgICAgaWZlbHNlKA0KICAgICAgICAhaXMubmEobnVtZXJpY192YWx1ZSksIA0KICAgICAgICBwYXN0ZTAoZm9ybWF0KHJvdW5kKG51bWVyaWNfdmFsdWUqMTAwLCAyKSwgYmlnLm1hcmsgPSAiLCIsIHNjaWVudGlmaWMgPSBGQUxTRSksICIlIiksICAjIEZvcm1hdCB0byAyIGRlY2ltYWwgcGxhY2VzIGFuZCBhZGQgY29tbWFzDQogICAgICAgIC4NCiAgICAgICkNCiAgICB9KQ0KICApICU+JQ0KICBhcnJhbmdlKGRlc2MoYERhdGVgKSkgICMgU29ydCBieSBEYXRlIGZyb20gbmV3ZXN0IHRvIG9sZGVzdA0KDQojIERpc3BsYXkgdGhlIGZvcm1hdHRlZCBkYXRhDQppbnRlcmFjdGl2ZV9zdHIodmd0X3JhdykNCmludGVyYWN0aXZlX3ByaW50KHZndF9yYXcpDQoNCiMgRGlzcGxheSB0aGUgdGFibGUgd2l0aCBjYXB0aW9uDQpjYXQoIlxuXG4jIyMjIFZHVCBZZWFybHkgUGVyZm9ybWFuY2UgKCIsIG1pbl95ZWFyLCAiLSIsIG1heF95ZWFyLCAiKVxuIiwgc2VwID0gIiIpDQpmb3JtYXRfZXF1YWxfd2lkdGhfZ3JvdXBlZCh2Z3RfcmF3LCBncm91cGluZ19mYWN0b3IgPSAyKQ0KIyBjYXQoIlxuXG4gU291cmNlOiAiLCBucnYkc291cmNlX3ZndF95YWhvbywgIlxuIikNCg0KYGBgDQoNCiMjIyBTdW1tYXJ5DQoNCmBgYHtyIHZndF9yYXdfc3VtbWFyeSwgZXZhbD1UUlVFLCBlY2hvPUZBTFNFfQ0KDQojIExvYWQgbmVjZXNzYXJ5IGxpYnJhcmllcw0KbGlicmFyeShkcGx5cikNCmxpYnJhcnkodGliYmxlKQ0KbGlicmFyeShrbml0cikNCmxpYnJhcnkoa2FibGVFeHRyYSkNCg0KaW50ZXJhY3RpdmVfc3RyKHZndF9yYXcpDQppbnRlcmFjdGl2ZV9wcmludCh2Z3RfcmF3KQ0KDQojIEVuc3VyZSB0aGUgRGF0ZSBjb2x1bW4gaXMgYSBwcm9wZXIgRGF0ZSBvYmplY3QgYW5kIGV4dHJhY3QgdGhlIHllYXINCnZndF9yYXcgPC0gdmd0X3JhdyAlPiUNCiAgc2xpY2UoLTEpICU+JSAjIFJlbW92ZSB0aGUgZmlyc3Qgcm93DQogICMgbXV0YXRlKERhdGUgPSBpZmVsc2Uocm93X251bWJlcigpID09IDEsICIyMDI1LTAxLTAxIiwgRGF0ZSkpICU+JQ0KICBtdXRhdGUoDQogICAgRGF0ZSA9IGFzLm51bWVyaWMoZm9ybWF0KGFzLkRhdGUoRGF0ZSwgZm9ybWF0ID0gIiVZLSVtLSVkIiksICIlWSIpKSwNCiAgICBgMS1ZZWFyIENBR1JgID0gYXMubnVtZXJpYyhnc3ViKCJbXjAtOS4tXSIsICIiLCBgMS1ZZWFyIENBR1JgKSkNCiAgKQ0KDQojIFNvcnQgZGF0YSBieSBEYXRlIGluIGFzY2VuZGluZyBvcmRlcg0Kdmd0X3JhdyA8LSB2Z3RfcmF3ICU+JQ0KICBhcnJhbmdlKERhdGUpDQoNCg0KIyBDYWxjdWxhdGUgdGhlIENBR1IgYW5kIGR5bmFtaWNhbGx5IGNyZWF0ZSBhIHZhcmlhYmxlIG5hbWUgd2l0aCB0aGUgZm9ybWF0IHZndF9jYWdyX3ZhbHVlX3M8bWluX3llYXI+X2U8bWF4X3llYXI+DQppbml0aWFsX3ZhbHVlIDwtIDEwMCAgIyBBc3N1bWluZyBhbiBpbml0aWFsIGluZGV4IHZhbHVlIG9mIDEwMA0KZmluYWxfdmFsdWUgPC0gaW5pdGlhbF92YWx1ZSAqIHByb2QoMSArIHZndF9yYXckYDEtWWVhciBDQUdSYCAvIDEwMCwgbmEucm0gPSBUUlVFKQ0KbWluX3llYXIgPC0gbWluKHZndF9yYXckRGF0ZSwgbmEucm0gPSBUUlVFKQ0KbWF4X3llYXIgPC0gbWF4KHZndF9yYXckRGF0ZSwgbmEucm0gPSBUUlVFKQ0KbnVtX3llYXJzIDwtIG1heF95ZWFyIC0gbWluX3llYXINCmNhZ3JfdmFsdWUgPC0gcm91bmQoKChmaW5hbF92YWx1ZSAvIGluaXRpYWxfdmFsdWUpXigxIC8gbnVtX3llYXJzKSAtIDEpICogMTAwLCAyKQ0KdmFyX25hbWUgPC0gcGFzdGUwKCJ2Z3RfY2Fncl92YWx1ZV9zIiwgbWluX3llYXIsICJfZSIsIG1heF95ZWFyKQ0KYXNzaWduKHZhcl9uYW1lLCBjYWdyX3ZhbHVlKQ0KDQojIENvbnZlcnQgVkdUIGRhdGEgdG8gbnVtZXJpYywgcmVtb3ZpbmcgYW55IHBlcmNlbnRhZ2Ugc2lnbnMNCmRhdGEgPC0gYXMubnVtZXJpYyhnc3ViKCIlIiwgIiIsIHZndF9yYXckYDEtWWVhciBDQUdSYCkpDQoNCiMgQ2FsY3VsYXRlIHN0YXRpc3RpY3MNCmNvdW50X29ic2VydmF0aW9ucyA8LSBzdW0oIWlzLm5hKGRhdGEpKQ0KbWVhbl92YWx1ZSA8LSByb3VuZChtZWFuKGRhdGEsIG5hLnJtID0gVFJVRSksIDIpDQptZWRpYW5fdmFsdWUgPC0gcm91bmQobWVkaWFuKGRhdGEsIG5hLnJtID0gVFJVRSksIDIpDQpzZF92YWx1ZSA8LSByb3VuZChzZChkYXRhLCBuYS5ybSA9IFRSVUUpLCAyKQ0KbWluX2NhZ3JfcmFuZ2UgPC0gcm91bmQoY2Fncl92YWx1ZSAtIHNkX3ZhbHVlLCAyKQ0KbWF4X2NhZ3JfcmFuZ2UgPC0gcm91bmQoY2Fncl92YWx1ZSArIHNkX3ZhbHVlLCAyKQ0KbWluX3ZhbHVlIDwtIHJvdW5kKG1pbihkYXRhLCBuYS5ybSA9IFRSVUUpLCAyKQ0KbWF4X3ZhbHVlIDwtIHJvdW5kKG1heChkYXRhLCBuYS5ybSA9IFRSVUUpLCAyKQ0KDQojIFRhcmdldCBSYXRlIEFuYWx5c2lzIC0gUmVmZXIgdG8gIlByZWZlcnJlZCBUYXJnZXRzIiBvciBpbmNsdWRlIGJlbG93IGZvciBpbmRpdmlkdWFsIGNoYW5nZXMuDQphYm92ZV90YXJnZXRfaW5mbGF0aW9uIDwtIHN1bShkYXRhID49IHRhcmdldF9pbmZsYXRpb24sIG5hLnJtID0gVFJVRSkNCmFib3ZlX3RhcmdldF9jb25zZXJ2YXRpdmUgPC0gc3VtKGRhdGEgPj0gdGFyZ2V0X2NvbnNlcnZhdGl2ZSwgbmEucm0gPSBUUlVFKQ0KYWJvdmVfdGFyZ2V0X21vZGVyYXRlIDwtIHN1bShkYXRhID49IHRhcmdldF9tb2RlcmF0ZSwgbmEucm0gPSBUUlVFKQ0KYWJvdmVfdGFyZ2V0X2FnZ3Jlc3NpdmUgPC0gc3VtKGRhdGEgPj0gdGFyZ2V0X2FnZ3Jlc3NpdmUsIG5hLnJtID0gVFJVRSkNCg0KcGVyY2VudF9hYm92ZV90YXJnZXRfY29uc2VydmF0aXZlIDwtIHJvdW5kKChhYm92ZV90YXJnZXRfY29uc2VydmF0aXZlIC8gY291bnRfb2JzZXJ2YXRpb25zKSAqIDEwMCwgMikNCnBlcmNlbnRfYWJvdmVfdGFyZ2V0X2luZmxhdGlvbiA8LSByb3VuZCgoYWJvdmVfdGFyZ2V0X2luZmxhdGlvbiAvIGNvdW50X29ic2VydmF0aW9ucykgKiAxMDAsIDIpDQpwZXJjZW50X2Fib3ZlX3RhcmdldF9tb2RlcmF0ZSA8LSByb3VuZCgoYWJvdmVfdGFyZ2V0X21vZGVyYXRlIC8gY291bnRfb2JzZXJ2YXRpb25zKSAqIDEwMCwgMikNCnBlcmNlbnRfYWJvdmVfdGFyZ2V0X2FnZ3Jlc3NpdmUgPC0gcm91bmQoKGFib3ZlX3RhcmdldF9hZ2dyZXNzaXZlIC8gY291bnRfb2JzZXJ2YXRpb25zKSAqIDEwMCwgMikNCg0KIyBDb21waWxlIHN0YXRpc3RpY3MgaW50byBhIGxpc3QgZm9yIGVhc3kgY29udmVyc2lvbiB0byBhIGRhdGEgZnJhbWUgd2l0aCBkZWZpbml0aW9ucw0Kdmd0X3Jhd19zdW1tYXJ5IDwtIHRyaWJibGUoDQogIH5TdGF0aXN0aWMsIH5WYWx1ZSwgfkRlZmluaXRpb24sDQogICJDb3VudCBvZiBPYnNlcnZhdGlvbnMiLCBhcy5jaGFyYWN0ZXIoY291bnRfb2JzZXJ2YXRpb25zKSwgIlRvdGFsIG51bWJlciBvZiBkYXRhIHBvaW50cyBjb2xsZWN0ZWQgb3ZlciB0aGUgc3BlY2lmaWMgcGVyaW9kLiIsDQogICJDQUdSIiwgcGFzdGUwKGNhZ3JfdmFsdWUsICIlIiksICJDb21wb3VuZCBBdmVyYWdlIEdyb3d0aCBSYXRlOyBtZWFuIGdyb3d0aCByYXRlIG92ZXIgYSBwZXJpb2QgaWYgaXQgaGFkIGNvbXBvdW5kZWQgYW51YWxseS4iLA0KICAiTWVhbiIsIHBhc3RlMChtZWFuX3ZhbHVlLCAiJSIpLCAiUmVmbGVjdHMgdGhlIGdlbmVyYWwgcHJpY2UgbGV2ZWwgYW5kIG92ZXJhbGwgZ3Jvd3RoIHJhdGUuIiwNCiAgIk1lZGlhbiIsIHBhc3RlMChtZWRpYW5fdmFsdWUsICIlIiksICJNaWRkbGUgdmFsdWUgb2YgdGhlIGRhdGEgd2hlbiBvcmRlcmVkIGNocm9ub2xvZ2ljYWxseTsgY2VudHJhbCB0ZW5kZW5jeSBtZWFzdXJlIGxlc3MgYWZmZWN0ZWQgYnkgZXh0cmVtZSB2YWx1ZXMuIiwNCiAgIlN0YW5kYXJkIERldmlhdGlvbiAoVm9sYXRpbGl0eSkiLCBwYXN0ZTAoc2RfdmFsdWUsICIlIiksICJUaGUgZGlzcGVyc2lvbiBvZiB2YWx1ZXMgZnJvbSB0aGUgbWVhbiwgaW5kaWNhdGluZyB0aGUgdm9sYXRpbGl0eSBvZiBwcmljZSBjaGFuZ2VzIGFuZCBlY29ub21pYyBzdGFiaWxpdHkuIiwNCiAgIk1pbiBDQUdSIFJhbmdlIChDQUdSIC0gU0QpIiwgcGFzdGUwKG1pbl9jYWdyX3JhbmdlLCAiJSIpLCAiTG93ZXIgYm91bmRhcnkgb2YgZXhwZWN0ZWQgVkdUIHJhbmdlOyBsb3dlc3QgZXN0aW1hdGUgb2YgdHlwaWNhbCBncm93dGggcmF0ZSBjb25zaWRlcmluZyBub3JtYWwgZmx1Y3R1YXRpb25zLiIsDQogICJNYXggQ0FHUiBSYW5nZSAoQ0FHUiArIFNEKSIsIHBhc3RlMChtYXhfY2Fncl9yYW5nZSwgIiUiKSwgIlVwcGVyIGJvdW5kYXJ5IG9mIGV4cGVjdGVkIFZHVCByYW5nZTsgaGlnaGVzdCBlc3RpbWF0ZSBvZiB0eXBpY2FsIGdyb3d0aCByYXRlIGNvbnNpZGVyaW5nIG5vcm1hbCBmbHVjdHVhdGlvbnMuIiwNCiAgIk1pbmltdW0iLCBwYXN0ZTAobWluX3ZhbHVlLCAiJSIpLCAiTG93ZXN0IGdyb3d0aCByYXRlLiIsDQogICJNYXhpbXVtIiwgcGFzdGUwKG1heF92YWx1ZSwgIiUiKSwgIkhpZ2hlc3QgZ3Jvd3RoIHJhdGUuIiwNCiAgIlBlcmNlbnQgQWJvdmUgSW5mbGF0aW9uIFRhcmdldCIsIHBhc3RlMChwZXJjZW50X2Fib3ZlX3RhcmdldF9pbmZsYXRpb24sICIlIiksICJQZXJjZW50YWdlIG9mIHZhbHVlcyBhYm92ZSB0aGUgaW5mbGF0aW9uIHRhcmdldCBzcGVjaWZpZWQgaW4gUHJlZmVycmVkIFRhcmdldHMgc2VjdGlvbi4iLA0KICAiUGVyY2VudCBBYm92ZSBDb25zZXJ2YXRpdmUgVGFyZ2V0IiwgcGFzdGUwKHBlcmNlbnRfYWJvdmVfdGFyZ2V0X2NvbnNlcnZhdGl2ZSwgIiUiKSwgIlBlcmNlbnRhZ2Ugb2YgdmFsdWVzIGFib3ZlIHRoZSBjb25zZXJ2YXRpdmUgdGFyZ2V0IHNwZWNpZmllZCBpbiBQcmVmZXJyZWQgVGFyZ2V0cyBzZWN0aW9uLiIsDQogICJQZXJjZW50IEFib3ZlIE1vZGVyYXRlIFRhcmdldCIsIHBhc3RlMChwZXJjZW50X2Fib3ZlX3RhcmdldF9tb2RlcmF0ZSwgIiUiKSwgIlBlcmNlbnRhZ2Ugb2YgdmFsdWVzIGFib3ZlIHRoZSBtb2RlcmF0ZSB0YXJnZXQgc3BlY2lmaWVkIGluIFByZWZlcnJlZCBUYXJnZXRzIHNlY3Rpb24uIiwNCiAgIlBlcmNlbnQgQWJvdmUgQWdncmVzc2l2ZSBUYXJnZXQiLCBwYXN0ZTAocGVyY2VudF9hYm92ZV90YXJnZXRfYWdncmVzc2l2ZSwgIiUiKSwgIlBlcmNlbnRhZ2Ugb2YgdmFsdWVzIGFib3ZlIHRoZSBhZ2dyZXNzaXZlIHRhcmdldCBzcGVjaWZpZWQgaW4gUHJlZmVycmVkIFRhcmdldHMgc2VjdGlvbi4iDQopDQoNCiMgQ29udmVydCB0byBjaGFyYWN0ZXIgdG8gYXZvaWQgYXV0b21hdGljIGRlY2ltYWwgcG9pbnRzIG9uIHdob2xlIG51bWJlcnMNCnZndF9yYXdfc3VtbWFyeSA8LSB2Z3RfcmF3X3N1bW1hcnkgJT4lDQogIG11dGF0ZShhY3Jvc3MoZXZlcnl0aGluZygpLCBhcy5jaGFyYWN0ZXIpKQ0KDQojIERpc3BsYXkgZm9ybWF0dGVkIHRhYmxlDQpjYXQoIlxuXG4jIyMjIEFubnVhbCBHcm93dGggUmF0ZSBTdW1tYXJ5ICgiLCBtaW5feWVhciwgIi0iLCBtYXhfeWVhciwgIilcbiIsIHNlcCA9ICIiKQ0KZm9ybWF0XzNjb2xfY3VzdG9tX3dpZHRocyh2Z3RfcmF3X3N1bW1hcnksIGNvbDFfd2lkdGggPSAiMjBlbSIsIGNvbDJfd2lkdGggPSAiMTBlbSIsIGNvbDNfd2lkdGggPSAiNDBlbSIpIA0KDQojIFZpZXcodmd0X3Jhd19zdW1tYXJ5KQ0KaW50ZXJhY3RpdmVfc3RyKHZndF9yYXdfc3VtbWFyeSkNCg0KYGBgDQoNClZHVCdzIEluZGV4IGV4aGliaXRzIGEgYHIgaWYoY2Fncl92YWx1ZSA+IHRhcmdldF9hZ2dyZXNzaXZlKSAiYWdncmVzc2l2ZSIgZWxzZSBpZihjYWdyX3ZhbHVlID4gdGFyZ2V0X21vZGVyYXRlKSAibW9kZXJhdGUiIGVsc2UgaWYoY2Fncl92YWx1ZSA+IHRhcmdldF9jb25zZXJ2YXRpdmUpICJjb25zZXJ2YXRpdmUiIGVsc2UgaWYoY2Fncl92YWx1ZSA+IHRhcmdldF9pbmZsYXRpb24pICJiYXNlbGluZSIgZWxzZSAiZGlzYXBwb2ludGluZyJgIENBR1IgYXQgYHIgY2Fncl92YWx1ZWAlLCBgciBpZihjYWdyX3ZhbHVlIDwgbWVhbl92YWx1ZSkgImxvd2VyIHRoYW4iIGVsc2UgImhpZ2hlciB0aGFuImAgdGhlIG1lYW4gZ3Jvd3RoIHJhdGUgb2YgYHIgbWVhbl92YWx1ZWAlLCByZWZsZWN0aW5nIHRoZSBpbXBhY3Qgb2Ygc2hvcnQtdGVybSB2b2xhdGlsaXR5IGFuZCBgciBpZihjYWdyX3ZhbHVlID4gbWVhbl92YWx1ZSkgImRlY2xpbmVzIiBlbHNlICJncm93dGggc3Bpa2VzImAuIFRoZSBtZWRpYW4gcmV0dXJuIG9mIGByIG1lZGlhbl92YWx1ZWAlIGluZGljYXRlcyB0aGF0IG1vcmUgdGhhbiBoYWxmIG9mIHRoZSBvYnNlcnZlZCB5ZWFycyBleHBlcmllbmNlZCByZXR1cm5zIGByIGlmKGNhZ3JfdmFsdWUgPCBtZWRpYW5fdmFsdWUpICJhYm92ZSIgZWxzZSAiYmVsb3ciYCB0aGUgbWVhbi4gVGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHRoZSBDQUdSIGFuZCB0aGUgbWVkaWFuIGdyb3d0aCByYXRlIHN1Z2dlc3RzIHRoYXQgc3VzdGFpbmVkIHBlcmlvZHMgb2YgYWJvdmUtbWVkaWFuIGdyb3d0aCBoYXZlIGV4ZXJ0ZWQgY3VtdWxhdGl2ZSBgciBpZihjYWdyX3ZhbHVlIDwgbWVkaWFuX3ZhbHVlKSAidXB3YXJkIHByZXNzdXJlIiBlbHNlICJkb3dud2FyZCBwcmVzc3VyZSJgIG9uIG92ZXJhbGwgcHJpY2UgbGV2ZWxzLiBUaGlzIHJlbGF0aW9uc2hpcCBoaWdobGlnaHRzIGEgZGlzdHJpYnV0aW9uIHdpdGggbm90YWJsZSBleHRyZW1lcyBvbiB0aGUgYHIgaWYoY2Fncl92YWx1ZSA8IG1lYW5fdmFsdWUpICJoaWdoZXIiIGVsc2UgImxvd2VyImAgZW5kLCByZWZsZWN0aW5nIGByIGlmKGNhZ3JfdmFsdWUgPCBtZWFuX3ZhbHVlKSAicG9zaXRpdmUiIGVsc2UgIm5lZ2F0aXZlImAgc2tld25lc3MuIFRoaXMgYHIgaWYoY2Fncl92YWx1ZSA8IG1lZGlhbl92YWx1ZSkgInBvc2l0aXZlIiBlbHNlICJuZWdhdGl2ZSJgIHNrZXduZXNzIGltcGxpZXMgdGhhdCB3aGlsZSBtb3JlIHRoYW4gaGFsZiBvZiB0aGUgb2JzZXJ2ZWQgeWVhcnMgZXhwZXJpZW5jZWQgcmV0dXJucyBgciBpZihjYWdyX3ZhbHVlIDwgbWVkaWFuX3ZhbHVlKSAiYWJvdmUgdGhlIG1lYW4sIGRvd250dXJucyBjYW4gYmUgc2V2ZXJlIiBlbHNlICJiZWxvdyB0aGUgbWVhbiwgdXB0dXJucyBjYW4gYmUgc2lnbmlmaWNhbnQiYC4gSG93ZXZlciwgdGhlIG1hcmtldCBoYXMgaGlzdG9yaWNhbGx5IHByb3ZpZGVkIHN1YnN0YW50aWFsIGByIGlmKGNhZ3JfdmFsdWUgPCBtZWRpYW5fdmFsdWUpICJ1cHNpZGUgcG90ZW50aWFsIiBlbHNlICJkb3duc2lkZSByaXNrImAuIEFkZGl0aW9uYWxseSwgdGhlIGZhY3QgdGhhdCBgciBwZXJjZW50X2Fib3ZlX3RhcmdldF9pbmZsYXRpb25gJSBvZiB0aGUgeWVhcnMgZXhjZWVkZWQgdGhlIGluZmxhdGlvbiB0YXJnZXQgYHIgaWYgKHBlcmNlbnRfYWJvdmVfdGFyZ2V0X2luZmxhdGlvbiA+IDcwKSAicmVpbmZvcmNlcyBWR1QncyBlZmZlY3RpdmVuZXNzIGFzIGEgc3Ryb25nIGxvbmctdGVybSBoZWRnZSIgZWxzZSBpZiAocGVyY2VudF9hYm92ZV90YXJnZXRfaW5mbGF0aW9uID4gNjApICJyZWluZm9yY2VzIFZHVCdzIGVmZmVjdGl2ZW5lc3MgYXMgYSBsb25nLXRlcm0gaGVkZ2UiIGVsc2UgaWYgKHBlcmNlbnRfYWJvdmVfdGFyZ2V0X2luZmxhdGlvbiA+IDUwKSAicXVlc3Rpb25zIFZHVCdzIGVmZmVjdGl2ZW5lc3MgIGFzIGEgbG9uZy10ZXJtIGhlZGdlIiBlbHNlICJ1bmRlcm1pbmVzIFZHVCdzIGVmZmVjdGl2ZW5lc3MgYXMgYSBsb25nLXRlcm0gaGVkZ2UiYCBhZ2FpbnN0IGluZmxhdGlvbi4NCg0KVGhlIHN0YW5kYXJkIGRldmlhdGlvbiBvZiBgciBzZF92YWx1ZWAlIGByIGlmKHNkX3ZhbHVlID4gMjApICJpbmRpY2F0ZXMgZXh0cmVtZSB2b2xhdGlsaXR5LCByZWZsZWN0aW5nIHN1YnN0YW50aWFsIGZsdWN0dWF0aW9ucyBpbiBlcXVpdHkgbWFya2V0cyIgZWxzZSBpZihzZF92YWx1ZSA+IDE1KSAidW5kZXJzY29yZXMgc2lnbmlmaWNhbnQgdm9sYXRpbGl0eSwgYSBjb21tb24gZmVhdHVyZSBvZiBlcXVpdHkgbWFya2V0cyIgZWxzZSAic3VnZ2VzdHMgbW9kZXJhdGUgdm9sYXRpbGl0eSwgdHlwaWNhbCBvZiByZWxhdGl2ZWx5IHN0YWJsZSBtYXJrZXRzImAuIFRoZSBgciByYW5nZV9yYXRpbyA8LSAobWF4X3ZhbHVlIC0gbWluX3ZhbHVlKSAvIHNkX3ZhbHVlOyBpZihyYW5nZV9yYXRpbyA+IDUpICJoaWdobHkgdm9sYXRpbGUiIGVsc2UgaWYocmFuZ2VfcmF0aW8gPiAzKSAibm90YWJsZSIgZWxzZSAiY29tcGFyYXRpdmVseSBzdGFibGUiYCByYW5nZSBvZiBhbm51YWwgcmV0dXJucywgc3Bhbm5pbmcgZnJvbSBgciBtaW5fdmFsdWVgJSB0byBgciBtYXhfdmFsdWVgJSwgYHIgaWYocmFuZ2VfcmF0aW8gPiA1KSAiaWxsdXN0cmF0ZXMgYSBoaWdobHkgdm9sYXRpbGUgbWFya2V0IGVudmlyb25tZW50LCBwYXJ0bHkgZHVlIHRvIGl0cyBjb21wb3NpdGlvbiwgd2l0aCB0aGUgcG90ZW50aWFsIGZvciBib3RoIGV4dHJlbWUgZ2FpbnMgYW5kIGxvc3NlcyIgZWxzZSBpZihyYW5nZV9yYXRpbyA+IDMpICJoaWdobGlnaHRzIG5vdGFibGUgbWFya2V0IHZhcmlhYmlsaXR5LCBwYXJ0bHkgZHVlIHRvIGl0cyBjb21wb3NpdGlvbiwgIHJlZmxlY3RpbmcgYm90aCBvcHBvcnR1bml0aWVzIGFuZCByaXNrcyIgZWxzZSAiaW5kaWNhdGVzIGEgY29tcGFyYXRpdmVseSBzdGFibGUgbWFya2V0LCBwYXJ0bHkgZHVlIHRvIGl0cyBjb21wb3NpdGlvbiwgd2l0aCBsZXNzIGV4dHJlbWUgYW5udWFsIGZsdWN0dWF0aW9ucyJgLiANCg0KRm9yIFZHVCB0byBiZSBjb25zaWRlcmVkIGEgaGlnaC1wZXJmb3JtaW5nIGFuZCByZXNpbGllbnQgbG9uZy10ZXJtIGludmVzdG1lbnQsIGl0IHdvdWxkIGJlIGlkZWFsIHRvIGV4Y2VlZCB0aGUgYWdncmVzc2l2ZSB0YXJnZXQgIChlLmcuLCBgciAodGFyZ2V0X2FnZ3Jlc3NpdmUgLSB0YXJnZXRfaW5mbGF0aW9uKWAlIGFubnVhbGl6ZWQgcmV0dXJucywgYWNjb3VudGluZyBmb3IgaGlnaGVyIGluZmxhdGlvbi1hZGp1c3RlZCBwZXJmb3JtYW5jZSBleHBlY3RhdGlvbnMpIGluIGF0IGxlYXN0IDQwJS01MCUgb2YgdGhlIHllYXJzLiBUaGlzIHJhbmdlIHJlZmxlY3RzIHRoZSBwb3RlbnRpYWwgZm9yIHN0cm9uZyB1cHNpZGUgaW4gbWFueSB5ZWFycyB3aGlsZSBiYWxhbmNpbmcgdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBtYXJrZXRzIGRvIGV4cGVyaWVuY2UgZG93bnR1cm5zLiBUaGUgZmFjdCB0aGF0IGByIHBlcmNlbnRfYWJvdmVfdGFyZ2V0X2FnZ3Jlc3NpdmVgJSBvZiB0aGUgeWVhcnMgZXhjZWVkZWQgdGhlIGFnZ3Jlc3NpdmUgdGFyZ2V0IGByIGlmKHBlcmNlbnRfYWJvdmVfdGFyZ2V0X2FnZ3Jlc3NpdmUgPiA1MCkgImluZGljYXRlcyBjb25zaXN0ZW50IGFuZCByb2J1c3QgZ3Jvd3RoLCBtYWtpbmcgVkdUIGEgc3Ryb25nIG9wdGlvbiBmb3IgdGhvc2Ugc2Vla2luZyBhZ2dyZXNzaXZlIGludmVzdG1lbnRzLiIgZWxzZSBpZihwZXJjZW50X2Fib3ZlX3RhcmdldF9hZ2dyZXNzaXZlID4gNDApICJzdWdnZXN0cyB0aGF0IHdoaWxlIG5vdCBjb25zaXN0ZW50LCBWR1QgaGFzIGhpc3RvcmljYWxseSBwcm92aWRlZCByb2J1c3QgZ3Jvd3RoIG92ZXIgdGhlIGxvbmcgdGVybSwgbWFraW5nIGl0IGEgdmlhYmxlIGludmVzdG1lbnQgZm9yIHRob3NlIHdpdGggYSBoaWdoZXIgcmlzayB0b2xlcmFuY2UuIiBlbHNlICJyYWlzZXMgY29uY2VybnMgYWJvdXQgVkdUJ3MgYWJpbGl0eSB0byBtZWV0IGFnZ3Jlc3NpdmUgZ3Jvd3RoIHRhcmdldHMsIG1ha2luZyBpdCBsZXNzIHN1aXRhYmxlIGZvciBpbnZlc3RvcnMgd2l0aCBoaWdoZXIgcmlzayB0b2xlcmFuY2UuImANCg0KIyMjIEdyYXBoDQoNCmBgYHtyIHZndF9yYXdfZ3JhcGgsIGZpZy53aWR0aD0xMCwgZmlnLmhlaWdodD03LCBldmFsPVRSVUUsIGVjaG89RkFMU0V9DQoNCiMgTG9hZCBuZWNlc3NhcnkgbGlicmFyaWVzDQpsaWJyYXJ5KGdncGxvdDIpDQpsaWJyYXJ5KGRwbHlyKQ0KDQojIENvbnZlcnQgYDEtWWVhciBDQUdSYCB0byBudW1lcmljIGZvciBwbG90dGluZw0Kdmd0X3JhdyA8LSB2Z3RfcmF3ICU+JQ0KICBtdXRhdGUoDQogICAgYERhdGVgID0gYXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIoYERhdGVgKSksICAjIEVuc3VyZSBEYXRlIGlzIG51bWVyaWMNCiAgICBgMS1ZZWFyIENBR1JgID0gYXMubnVtZXJpYyhnc3ViKCIlIiwgIiIsIGAxLVllYXIgQ0FHUmApKQ0KICApDQoNCiMgRmluZCB0aGUgbWluaW11bSBhbmQgbWF4aW11bSB4LXZhbHVlIGluIHlvdXIgZGF0YQ0KbWF4X3ggPC0gbWF4KGFzLmludGVnZXIodmd0X3JhdyREYXRlKSwgbmEucm0gPSBUUlVFKQ0KbWluX3ggPC0gbWluKGFzLmludGVnZXIodmd0X3JhdyREYXRlKSwgbmEucm0gPSBUUlVFKQ0KaW50ZXJhY3RpdmVfcHJpbnQobWF4X3gpICAjIFRlc3QNCmludGVyYWN0aXZlX3ByaW50KG1pbl94KSAgIyBUZXN0DQoNCiMgRmluZCB0aGUgbWluaW11bSBhbmQgbWF4aW11bSB5ZWFyDQptaW5feWVhciA8LSBtaW4odmd0X3JhdyREYXRlLCBuYS5ybSA9IFRSVUUpDQptYXhfeWVhciA8LSBtYXgodmd0X3JhdyREYXRlLCBuYS5ybSA9IFRSVUUpDQppbnRlcmFjdGl2ZV9wcmludChtaW5feWVhcikNCmludGVyYWN0aXZlX3ByaW50KG1heF95ZWFyKQ0KDQoNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQojIyBQTE9UIEZVTEwgV0lUSE9VVCBMSU1JVFMNCg0KIyBEZWZpbmUgc3RhcnQgYW5kIGVuZCB5ZWFycw0Kc3RhcnRfeWVhciA8LSBhcy5udW1lcmljKG1pbl95ZWFyKQ0KZW5kX3llYXIgPC0gMjAyNA0KeWVhcl9yYW5nZSA8LSBlbmRfeWVhciAtIHN0YXJ0X3llYXIgKyAxICAjIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIHllYXJzDQoNCiMgRGVmaW5lIGJyZWFrcyByb3VuZGVkIGFwcHJvcHJpYXRlbHkNCmxpbWl0c19zdGFydF95ZWFyIDwtIGZsb29yKHN0YXJ0X3llYXIgLyA1KSAqIDUgICMgUm91bmQgZG93biB0byB0aGUgbmVhcmVzdCBtdWx0aXBsZSBvZiA1DQpsaW1pdHNfZW5kX3llYXIgPC0gY2VpbGluZyhlbmRfeWVhciAvIDUpICogNSAgICMgUm91bmQgdXAgdG8gdGhlIG5lYXJlc3QgbXVsdGlwbGUgb2YgNQ0KDQojIENyZWF0ZSBkeW5hbWljIHRpdGxlIGFuZCBjYXB0aW9uDQpkeW5hbWljX3RpdGxlIDwtIHBhc3RlMCgiQW5udWFsIEdyb3d0aCBSYXRlcyBPdmVyICIseWVhcl9yYW5nZSwgIiBZZWFycyAoIiwgc3RhcnRfeWVhciwgIi0iLCBlbmRfeWVhciwgIikiKQ0KZHluYW1pY19jYXB0aW9uIDwtIHBhc3RlMCgiVkdUIEFubnVhbCBHcm93dGggUmF0ZXMsIERhdGEgUGVyaW9kICgiLCBtaW5feWVhciwgIuKAkyIsIG1heF95ZWFyLCAiKSIpDQoNCiMgQ3JlYXRlIHRoZSBmdWxsLCBub24tZmlsdGVyZWQgeC1heGlzIHBsb3Qgd2l0aCBkeW5hbWljIHggcGxhY2VtZW50IGZvciBhbm5vdGF0aW9ucw0KcDEgPC0gZ2dwbG90KHZndF9yYXcsIGFlcyh4ID0gYXMuaW50ZWdlcihEYXRlKSwgeSA9IGAxLVllYXIgQ0FHUmApKSArDQogIA0KICAjIEFkZCBzaGFkZWQgYXJlYXMgZm9yIGJhY2tncm91bmQgZWZmZWN0DQogIGdlb21fcmVjdChhZXMoeG1pbiA9IC1JbmYsIHhtYXggPSBJbmYsIHltaW4gPSB0YXJnZXRfYWdncmVzc2l2ZSwgeW1heCA9IEluZiksIGZpbGwgPSAibGlnaHRncmVlbiIsIGFscGhhID0gMC4wMjUpICsNCiAgZ2VvbV9yZWN0KGFlcyh4bWluID0gLUluZiwgeG1heCA9IEluZiwgeW1pbiA9IHRhcmdldF9jb25zZXJ2YXRpdmUsIHltYXggPSB0YXJnZXRfYWdncmVzc2l2ZSksIGZpbGwgPSAib3JhbmdlIiwgYWxwaGEgPSAwLjAyNSkgKw0KICBnZW9tX3JlY3QoYWVzKHhtaW4gPSAtSW5mLCB4bWF4ID0gSW5mLCB5bWluID0gLUluZiwgeW1heCA9IHRhcmdldF9jb25zZXJ2YXRpdmUpLCBmaWxsID0gImxpZ2h0Y29yYWwiLCBhbHBoYSA9IDAuMDI1KSArDQogIA0KICAjIFBsb3QgbGluZXMsIHBvaW50cywgYW5kIGFubm90YXRpb25zIG9uIHRvcCBvZiBzaGFkZWQgYXJlYXMNCiAgZ2VvbV9saW5lKGNvbG9yID0gIiM0QjAwODIiLCBzaXplID0gMS4wKSArICAgICAgICMgRGFyayBwdXJwbGUgbGluZSANCiAgZ2VvbV9wb2ludChjb2xvciA9ICIjNEIwMDgyIiwgc2l6ZSA9IDEuNSkgKyAgICAgICAgIyBEYXJrIHB1cnBsZSBwb2ludHMgDQogIA0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSB0YXJnZXRfYWdncmVzc2l2ZSwgY29sb3IgPSAiZGFya2JsdWUiLCBsaW5ldHlwZSA9ICJzb2xpZCIpICsNCiAgIyBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSB0YXJnZXRfbW9kZXJhdGUsIGNvbG9yID0gImRhcmtibHVlIiwgbGluZXR5cGUgPSAic29saWQiKSArDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IHRhcmdldF9jb25zZXJ2YXRpdmUsIGNvbG9yID0gImRhcmtibHVlIiwgbGluZXR5cGUgPSAic29saWQiKSArDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IHRhcmdldF9pbmZsYXRpb24sIGNvbG9yID0gImRhcmtyZWQiLCBsaW5ldHlwZSA9ICJkYXNoZWQiKSArDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IGNhZ3JfdmFsdWUsIGNvbG9yID0gImRhcmtyZWQiLCBsaW5ldHlwZSA9ICJkYXNoZWQiKSArDQogIA0KICAjIER5bmFtaWMgcmlnaHQtYWxpZ25lZCBwbGFjZW1lbnQgZm9yIGFubm90YXRpb25zDQogIGFubm90YXRlKCJ0ZXh0IiwgeCA9IEluZiwgeSA9IHRhcmdldF9hZ2dyZXNzaXZlLCBsYWJlbCA9ICJBZ2dyZXNzaXZlIiwgDQogICAgICAgICAgIGhqdXN0ID0gMSwgdmp1c3QgPSArMS4xMCwgY29sb3IgPSAiZGFya2JsdWUiLCBzaXplID0gNCkgKw0KICAjIGFubm90YXRlKCJ0ZXh0IiwgeCA9IEluZiwgeSA9IHRhcmdldF9tb2RlcmF0ZSwgbGFiZWwgPSAiTW9kZXJhdGUiLCANCiAgIyAgICAgICAgIGhqdXN0ID0gMSwgdmp1c3QgPSAtMC41MCwgY29sb3IgPSAiZGFya2JsdWUiLCBzaXplID0gNCkgKw0KICBhbm5vdGF0ZSgidGV4dCIsIHggPSBJbmYsIHkgPSB0YXJnZXRfY29uc2VydmF0aXZlLCBsYWJlbCA9ICJDb25zZXJ2YXRpdmUiLCANCiAgICAgICAgICAgaGp1c3QgPSAxLCB2anVzdCA9IC0wLjUwLCBjb2xvciA9ICJkYXJrYmx1ZSIsIHNpemUgPSA0KSArDQogIGFubm90YXRlKCJ0ZXh0IiwgeCA9IEluZiwgeSA9IHRhcmdldF9pbmZsYXRpb24sIGxhYmVsID0gIkluZmxhdGlvbiIsIA0KICAgICAgICAgICBoanVzdCA9IDEsIHZqdXN0ID0gKzEuMTAsIGNvbG9yID0gImRhcmtyZWQiLCBzaXplID0gNCkgKw0KICBhbm5vdGF0ZSgidGV4dCIsIHggPSBJbmYsIHkgPSBjYWdyX3ZhbHVlLCBsYWJlbCA9ICJDQUdSIiwgDQogICAgICAgICAgIGhqdXN0ID0gMSwgdmp1c3QgPSAtMC41MCwgY29sb3IgPSAiZGFya3JlZCIsIHNpemUgPSA0KSArIA0KDQogIGxhYnMoDQogICAgdGl0bGUgPSBkeW5hbWljX3RpdGxlLA0KICAgIHggPSAiWWVhciIsDQogICAgeSA9ICJHcm93dGggUmF0ZSAoJSkiLA0KICAgIGNhcHRpb24gPSBkeW5hbWljX2NhcHRpb24NCiAgKSArDQoNCiAgc2NhbGVfeF9jb250aW51b3VzKA0KICAgIGxpbWl0cyA9IGMoc3RhcnRfeWVhciwgZW5kX3llYXIgKyAzKSwgIyBSZXN0cmljdHMgeC1heGlzIGRhdGEgDQogICAgYnJlYWtzID0gc2VxKGxpbWl0c19zdGFydF95ZWFyLCBsaW1pdHNfZW5kX3llYXIsIDUpICMgU2V0cyBNYWpvciB4LWF4aXMgIA0KICApICsgICMgUmVzdHJpY3QgJiBTZXQgTWFqb3IgeC1heGlzIGxpbmVzIA0KICAgIA0KICB0aGVtZV9taW5pbWFsKCkgKw0KICB0aGVtZSgNCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41LCBzaXplID0gMjApLCAgICAgICAgICMgTGFyZ2VyIHRpdGxlIGZvbnQNCiAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0KSwgICAgICAgICAgICAgICAgICAgICMgTGFyZ2VyIHgtYXhpcyBsYWJlbCBmb250DQogICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCksICAgICAgICAgICAgICAgICAgICAjIExhcmdlciB5LWF4aXMgbGFiZWwgZm9udA0KICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSwgc2l6ZSA9IDE0KSwgICMgTGFyZ2VyIHgtYXhpcyB0ZXh0DQogICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0KSwgICAgICAgICAgICAgICAgICAgICAjIExhcmdlciB5LWF4aXMgdGV4dA0KICAgIHBhbmVsLmdyaWQubWFqb3IgPSBlbGVtZW50X2xpbmUobGluZXR5cGUgPSAiZG90dGVkIiwgY29sb3IgPSAiYmxhY2siKSwgICAgICAgICAjIE1ham9yIGdyaWQgbGluZXMNCiAgICBwYW5lbC5ncmlkLm1pbm9yLnggPSBlbGVtZW50X2JsYW5rKCksICMgZWxlbWVudF9saW5lKGNvbG9yID0gImdyZXk4MCIpICAjIE1pbm9yIHggZ3JpZCBsaW5lcyBmb3IgZWFjaCB5ZWFyDQogICAgIyBwYW5lbC5ib3JkZXIgPSBlbGVtZW50X3JlY3QoY29sb3IgPSAiZGFya2dyZXkiLCBmaWxsID0gTkEsIHNpemUgPSAxLjApICAjIERhcmsgYm9yZGVyIGFyb3VuZCB0aGUgcGxvdA0KICAgIGF4aXMudGlja3MubGVuZ3RoID0gdW5pdCgtMC4yNSwgImNtIiksICAgICAgICAgICAgICAgICAgICAgICMgSW5jcmVhc2UgdGljayBsZW5ndGgNCiAgICBheGlzLnRpY2tzID0gZWxlbWVudF9saW5lKGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDAuNTApLCAjIERhcmtlciB0aWNrcw0KICAgIGF4aXMubGluZS54ID0gZWxlbWVudF9saW5lKGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDAuNzUpLCAgIyBEYXJrIGJvdHRvbSBib3JkZXINCiAgICBheGlzLmxpbmUueSA9IGVsZW1lbnRfbGluZShjb2xvciA9ICJibGFjayIsIHNpemUgPSAwLjc1KSAgICMgRGFyayBsZWZ0IGJvcmRlcg0KICApDQoNCnByaW50KHAxKQ0KDQpgYGANCg0KDQojIyBWR1QgQ0FHUg0KDQojIyMgRGF0YQ0KDQpgYGB7ciB2Z3RfcmF3X2dyLCBldmFsPVRSVUUsIGVjaG89RkFMU0V9DQoNCiMgVmlldyhucnQkdmd0X3Jhd19ncikNCmludGVyYWN0aXZlX3N0cihucnQkdmd0X3Jhd19ncikNCg0KbGlicmFyeShkcGx5cikNCmxpYnJhcnkobHVicmlkYXRlKSAgIyBGb3IgZGF0ZSBtYW5pcHVsYXRpb24NCmxpYnJhcnkoc2NhbGVzKQ0KbGlicmFyeShzdHJpbmdyKQ0KDQojIFVwZGF0ZSBkYXRhIGZyYW1lIHdpdGggcHJvcGVyIGRhdGUgYW5kIHBlcmNlbnRhZ2UgaGFuZGxpbmcNCnZndF9yYXdfZ3IgPC0gbnJ0JHZndF9yYXdfZ3IgJT4lDQogIG11dGF0ZSgNCiAgICAjIENvbnZlcnQgQ2xvc2UgRGF0ZSB0byAiWVlZWS1NTS1ERCIgZm9ybWF0DQogICAgYERhdGVgID0gZm9ybWF0KGFzLkRhdGUoYXMuY2hhcmFjdGVyKGBEYXRlYCksIG9yaWdpbiA9ICIxOTcwLTAxLTAxIiksICIlWS0lbS0lZCIpLA0KICAgIA0KICAgICMgRW5zdXJlIENsb3NlIGlzIGEgbnVtYmVyIGZvcm1hdHRlZCB0byAyIGRlY2ltYWwgcGxhY2VzDQogICAgYENsb3NlYCA9IG51bWJlcihhcy5udW1lcmljKGdzdWIoIiwiLCAiIiwgQ2xvc2UpKSwgYmlnLm1hcmsgPSAiLCIsIGRlY2ltYWwubWFyayA9ICIuIiwgYWNjdXJhY3kgPSAwLjAxKSwNCg0KICAgICMgQ2xlYW4gYW5kIGhhbmRsZSBwZXJjZW50YWdlIGNvbHVtbnMNCiAgICBhY3Jvc3MoMzoxMSwgfiB7DQogICAgICB2YWx1ZSA8LSBnc3ViKCJbLCVcXHNdIiwgIiIsIC4pICAjIFJlbW92ZSAlLCBjb21tYXMsIGFuZCBzcGFjZXMNCiAgICAgIG51bWVyaWNfdmFsdWUgPC0gc3VwcHJlc3NXYXJuaW5ncyhhcy5udW1lcmljKHZhbHVlKSkgICMgQ29udmVydCB0byBudW1lcmljDQogICAgICBpZmVsc2UoDQogICAgICAgICFpcy5uYShudW1lcmljX3ZhbHVlKSwgDQogICAgICAgIHBhc3RlMChmb3JtYXQocm91bmQobnVtZXJpY192YWx1ZSoxMDAsIDIpLCBiaWcubWFyayA9ICIsIiwgc2NpZW50aWZpYyA9IEZBTFNFKSwgIiUiKSwgICMgRm9ybWF0IHRvIDIgZGVjaW1hbCBwbGFjZXMgYW5kIGFkZCBjb21tYXMNCiAgICAgICAgLg0KICAgICAgKQ0KICAgIH0pDQogICkgJT4lDQogIGFycmFuZ2UoZGVzYyhgRGF0ZWApKSAgIyBTb3J0IGJ5IERhdGUgZnJvbSBuZXdlc3QgdG8gb2xkZXN0DQoNCiMgQ3JlYXRlIHZndF9yYXdfZ3I6IENHUg0Kdmd0X3Jhd19jZ3IgPC0gdmd0X3Jhd19nciAlPiUNCiAgc2VsZWN0KGBEYXRlYCwgYENsb3NlYCwgYDEtWWVhciBDQUdSYCwgY29udGFpbnMgKCJDR1IiKSkNCg0KIyBDcmVhdGUgdmd0X3Jhd19ncjogQ0FHUg0Kdmd0X3Jhd19jYWdyIDwtIHZndF9yYXdfZ3IgJT4lDQogIHNlbGVjdChgRGF0ZWAsIGBDbG9zZWAsIGNvbnRhaW5zICgiQ0FHUiIpKQ0KDQojIERpc3BsYXkgYm90aCB0YWJsZXMgZm9yIGNvbmZpcm1hdGlvbg0KaW50ZXJhY3RpdmVfcHJpbnQodmd0X3Jhd19jZ3IpDQppbnRlcmFjdGl2ZV9wcmludCh2Z3RfcmF3X2NhZ3IpDQoNCiMgT3B0aW9uYWw6IFByaW50IHRhYmxlIHN1bW1hcmllcw0KaW50ZXJhY3RpdmVfc3RyKHZndF9yYXdfY2dyKQ0KaW50ZXJhY3RpdmVfc3RyKHZndF9yYXdfY2FncikNCg0KIyBEaXNwbGF5IGNhcHRpb25zIGZvciBlYWNoIHRhYmxlDQojIGNhdCgiXG5cbiMjIyMgQ3VtdWxhdGl2ZSBHcm93dGggUmF0ZXMgKCIsIG1pbl95ZWFyLCAiLSIsIG1heF95ZWFyLCAiKVxuIiwgc2VwID0gIiIpDQojIGZvcm1hdF9lcXVhbF93aWR0aCh2Z3RfcmF3X2NncikNCg0KY2F0KCJcblxuIyMjIyBDb21wb3VuZCBBdmVyYWdlIEdyb3d0aCBSYXRlcyAoIiwgbWluX3llYXIsICItIiwgbWF4X3llYXIsICIpXG4iLCBzZXAgPSAiIikNCmZvcm1hdF9lcXVhbF93aWR0aCh2Z3RfcmF3X2NhZ3IpDQoNCiMgVmlldyh2Z3RfcmF3X2NhZ3IpDQojIGNvbG5hbWVzKHZndF9yYXdfY2FncikNCmludGVyYWN0aXZlX3N0cih2Z3RfcmF3X2NhZ3IpDQoNCg0KYGBgDQoNCiMjIyBTdW1tYXJ5DQoNCmBgYHtyIHZndF9yYXdfY2Fncl9zdW1tYXJ5LCBldmFsPVRSVUUsIGVjaG89RkFMU0V9DQoNCmludGVyYWN0aXZlX3N0cih2Z3RfcmF3X2NhZ3IpDQoNCiMgTG9hZCBuZWNlc3NhcnkgbGlicmFyaWVzDQpsaWJyYXJ5KGRwbHlyKQ0KbGlicmFyeSh0aWJibGUpDQoNCiMgRGVmaW5lIGEgaGVscGVyIGZ1bmN0aW9uIHRvIGNsZWFuIGFuZCBjb252ZXJ0IHBlcmNlbnRhZ2VzDQpjbGVhbl9wZXJjZW50YWdlIDwtIGZ1bmN0aW9uKGNvbHVtbikgew0KICBhcy5udW1lcmljKGdzdWIoIiUiLCAiIiwgY29sdW1uKSkNCn0NCg0KIyBEZWZpbmUgdGhlIHN0YXRpc3RpYyBuYW1lcyBmb3IgdGhlIHN1bW1hcnkgdGFibGUNCnN0YXRpc3RpY19uYW1lcyA8LSBjKA0KICAiQ291bnQgb2YgT2JzZXJ2YXRpb25zIiwgDQogICJNZWFuIiwgDQogICJNZWRpYW4iLA0KICAiU3RhbmRhcmQgRGV2aWF0aW9uIChWb2xhdGlsaXR5KSIsIA0KICAiTWluIENBR1IgUmFuZ2UgKENBR1IgLSBTRCkiLA0KICAiTWF4IENBR1IgUmFuZ2UgKENBR1IgKyBTRCkiLA0KICAiTWluaW11bSIsIA0KICAiTWF4aW11bSIsIA0KICAiUGVyY2VudCBBYm92ZSBJbmZsYXRpb24gVGFyZ2V0IiwgDQogICJQZXJjZW50IEFib3ZlIENvbnNlcnZhdGl2ZSBUYXJnZXQiLCANCiAgIlBlcmNlbnQgQWJvdmUgTW9kZXJhdGUgVGFyZ2V0IiwgDQogICJQZXJjZW50IEFib3ZlIEFnZ3Jlc3NpdmUgVGFyZ2V0Ig0KKQ0KDQojIEFkanVzdCB0aGUgZmlyc3Qgcm93J3MgRGF0ZSBhbmQgY2xlYW4gdXAgQ0FHUiBjb2x1bW5zDQp2Z3RfcmF3X2NhZ3IgPC0gdmd0X3Jhd19jYWdyICU+JQ0KICBzbGljZSgtMSkgJT4lICMgUmVtb3ZlIHRoZSBmaXJzdCByb3cNCiAgbXV0YXRlKA0KICAgICMgRGF0ZSA9IGlmZWxzZShyb3dfbnVtYmVyKCkgPT0gMSwgIjIwMjUtMDEtMDEiLCBEYXRlKSwNCiAgICBEYXRlID0gYXMubnVtZXJpYyhmb3JtYXQoYXMuRGF0ZShEYXRlKSwgIiVZIikpLA0KICAgIGAxLVllYXIgQ0FHUmAgPSBjbGVhbl9wZXJjZW50YWdlKGAxLVllYXIgQ0FHUmApLA0KICAgIGA1LVllYXIgQ0FHUmAgPSBjbGVhbl9wZXJjZW50YWdlKGA1LVllYXIgQ0FHUmApLA0KICAgIGAxMC1ZZWFyIENBR1JgID0gY2xlYW5fcGVyY2VudGFnZShgMTAtWWVhciBDQUdSYCksDQogICAgYDIwLVllYXIgQ0FHUmAgPSBjbGVhbl9wZXJjZW50YWdlKGAyMC1ZZWFyIENBR1JgKSwNCiAgICBgMzAtWWVhciBDQUdSYCA9IGNsZWFuX3BlcmNlbnRhZ2UoYDMwLVllYXIgQ0FHUmApDQogICkNCg0KIyBGdW5jdGlvbiB0byBjYWxjdWxhdGUgc3RhdGlzdGljcyBmb3IgYSBnaXZlbiBkYXRhc2V0DQpjYWxjX3N0YXRzIDwtIGZ1bmN0aW9uKGRhdGEpIHsNCiAgaWYgKHN1bSghaXMubmEoZGF0YSkpIDwgMikgcmV0dXJuKHJlcChOQSwgbGVuZ3RoKHN0YXRpc3RpY19uYW1lcykpKSAgIyBIYW5kbGUgaW5zdWZmaWNpZW50IGRhdGENCg0KICBjb3VudF9vYnNlcnZhdGlvbnMgPC0gc3VtKCFpcy5uYShkYXRhKSkNCiAgbWVhbl92YWx1ZSA8LSByb3VuZChtZWFuKGRhdGEsIG5hLnJtID0gVFJVRSksIDIpDQogIG1lZGlhbl92YWx1ZSA8LSByb3VuZChtZWRpYW4oZGF0YSwgbmEucm0gPSBUUlVFKSwgMikNCiAgc2RfdmFsdWUgPC0gcm91bmQoc2QoZGF0YSwgbmEucm0gPSBUUlVFKSwgMikNCiAgbWluX2NhZ3JfcmFuZ2UgPC0gcm91bmQoY2Fncl92YWx1ZSAtIHNkX3ZhbHVlLCAyKQ0KICBtYXhfY2Fncl9yYW5nZSA8LSByb3VuZChjYWdyX3ZhbHVlICsgc2RfdmFsdWUsIDIpDQogIG1pbl92YWx1ZSA8LSByb3VuZChtaW4oZGF0YSwgbmEucm0gPSBUUlVFKSwgMikNCiAgbWF4X3ZhbHVlIDwtIHJvdW5kKG1heChkYXRhLCBuYS5ybSA9IFRSVUUpLCAyKQ0KICANCiAgIyBEZWZpbmUgaW5mbGF0aW9uIGFuZCBncm93dGggdGFyZ2V0cw0KICB0YXJnZXRfaW5mbGF0aW9uIDwtIDIgICMgRXhhbXBsZSB0YXJnZXQgZm9yIGluZmxhdGlvbg0KICB0YXJnZXRfY29uc2VydmF0aXZlIDwtIDMgKyB0YXJnZXRfaW5mbGF0aW9uDQogIHRhcmdldF9tb2RlcmF0ZSA8LSA1ICsgdGFyZ2V0X2luZmxhdGlvbg0KICB0YXJnZXRfYWdncmVzc2l2ZSA8LSAxMCArIHRhcmdldF9pbmZsYXRpb24NCiAgDQogIGFib3ZlX3RhcmdldF9pbmZsYXRpb24gPC0gc3VtKGRhdGEgPj0gdGFyZ2V0X2luZmxhdGlvbiwgbmEucm0gPSBUUlVFKQ0KICBhYm92ZV90YXJnZXRfY29uc2VydmF0aXZlIDwtIHN1bShkYXRhID49IHRhcmdldF9jb25zZXJ2YXRpdmUsIG5hLnJtID0gVFJVRSkNCiAgYWJvdmVfdGFyZ2V0X21vZGVyYXRlIDwtIHN1bShkYXRhID49IHRhcmdldF9tb2RlcmF0ZSwgbmEucm0gPSBUUlVFKQ0KICBhYm92ZV90YXJnZXRfYWdncmVzc2l2ZSA8LSBzdW0oZGF0YSA+PSB0YXJnZXRfYWdncmVzc2l2ZSwgbmEucm0gPSBUUlVFKQ0KICANCiAgcGVyY2VudF9hYm92ZV90YXJnZXRfY29uc2VydmF0aXZlIDwtIHJvdW5kKChhYm92ZV90YXJnZXRfY29uc2VydmF0aXZlIC8gY291bnRfb2JzZXJ2YXRpb25zKSAqIDEwMCwgMikNCiAgcGVyY2VudF9hYm92ZV90YXJnZXRfaW5mbGF0aW9uIDwtIHJvdW5kKChhYm92ZV90YXJnZXRfaW5mbGF0aW9uIC8gY291bnRfb2JzZXJ2YXRpb25zKSAqIDEwMCwgMikNCiAgcGVyY2VudF9hYm92ZV90YXJnZXRfbW9kZXJhdGUgPC0gcm91bmQoKGFib3ZlX3RhcmdldF9tb2RlcmF0ZSAvIGNvdW50X29ic2VydmF0aW9ucykgKiAxMDAsIDIpDQogIHBlcmNlbnRfYWJvdmVfdGFyZ2V0X2FnZ3Jlc3NpdmUgPC0gcm91bmQoKGFib3ZlX3RhcmdldF9hZ2dyZXNzaXZlIC8gY291bnRfb2JzZXJ2YXRpb25zKSAqIDEwMCwgMikNCiAgDQogIGMoDQogICAgY291bnRfb2JzZXJ2YXRpb25zLCANCiAgICBwYXN0ZTAobWVhbl92YWx1ZSwgIiUiKSwNCiAgICBwYXN0ZTAobWVkaWFuX3ZhbHVlLCAiJSIpLA0KICAgIHBhc3RlMChzZF92YWx1ZSwgIiUiKSwNCiAgICBwYXN0ZTAobWluX2NhZ3JfcmFuZ2UsICIlIiksDQogICAgcGFzdGUwKG1heF9jYWdyX3JhbmdlLCAiJSIpLA0KICAgIHBhc3RlMChtaW5fdmFsdWUsICIlIiksDQogICAgcGFzdGUwKG1heF92YWx1ZSwgIiUiKSwNCiAgICBwYXN0ZTAocGVyY2VudF9hYm92ZV90YXJnZXRfaW5mbGF0aW9uLCAiJSIpLA0KICAgIHBhc3RlMChwZXJjZW50X2Fib3ZlX3RhcmdldF9jb25zZXJ2YXRpdmUsICIlIiksIA0KICAgIHBhc3RlMChwZXJjZW50X2Fib3ZlX3RhcmdldF9tb2RlcmF0ZSwgIiUiKSwgDQogICAgcGFzdGUwKHBlcmNlbnRfYWJvdmVfdGFyZ2V0X2FnZ3Jlc3NpdmUsICIlIikNCiAgKQ0KfQ0KDQojIENvbHVtbnMgdG8gY2FsY3VsYXRlIENBR1Igc3RhdGlzdGljcw0KY2Fncl9jb2x1bW5zIDwtIGMoIjEtWWVhciBDQUdSIiwgIjUtWWVhciBDQUdSIiwgIjEwLVllYXIgQ0FHUiIsICIyMC1ZZWFyIENBR1IiLCAiMzAtWWVhciBDQUdSIikNCmV4aXN0aW5nX2NhZ3JfY29sdW1ucyA8LSBpbnRlcnNlY3QoY2Fncl9jb2x1bW5zLCBuYW1lcyh2Z3RfcmF3X2NhZ3IpKQ0KDQojIENhbGN1bGF0ZSBzdGF0cyBmb3IgZWFjaCBDQUdSIGNvbHVtbg0KY2Fncl9zdGF0c19saXN0IDwtIGxhcHBseSh2Z3RfcmF3X2NhZ3JbZXhpc3RpbmdfY2Fncl9jb2x1bW5zXSwgY2FsY19zdGF0cykNCg0KIyBDb21waWxlIGludG8gYSBzdW1tYXJ5IGRhdGEgZnJhbWUNCnZndF9yYXdfY2Fncl9zdW1tYXJ5IDwtIGFzLmRhdGEuZnJhbWUoZG8uY2FsbChjYmluZCwgY2Fncl9zdGF0c19saXN0KSkNCnJvd25hbWVzKHZndF9yYXdfY2Fncl9zdW1tYXJ5KSA8LSBzdGF0aXN0aWNfbmFtZXMNCg0KDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KIyMgU0FWRSBWQUxVRVMgRk9SIElOLUxJTkUgQ09ERQ0KDQojIERlZmluZSB0aGUgbWFwcGluZyBvZiByb3cgbmFtZXMgdG8gdmFyaWFibGUgbmFtZXMNCnJvd190b192YXJfbmFtZSA8LSBjKA0KICAiQ291bnQgb2YgT2JzZXJ2YXRpb25zIiA9ICJjb3VudF9vYnNlcnZhdGlvbnMiLA0KICAiTWVhbiIgPSAibWVhbl92YWx1ZSIsDQogICJNZWRpYW4iID0gIm1lZGlhbl92YWx1ZSIsDQogICJTdGFuZGFyZCBEZXZpYXRpb24gKFZvbGF0aWxpdHkpIiA9ICJzZF92YWx1ZSIsDQogICJNaW4gQ0FHUiBSYW5nZSAoQ0FHUiAtIFNEKSIgPSAibWluX2NhZ3JfcmFuZ2UiLA0KICAiTWF4IENBR1IgUmFuZ2UgKENBR1IgKyBTRCkiID0gIm1heF9jYWdyX3JhbmdlIiwNCiAgIk1pbmltdW0iID0gIm1pbl92YWx1ZSIsDQogICJNYXhpbXVtIiA9ICJtYXhfdmFsdWUiLA0KICAiUGVyY2VudCBBYm92ZSBJbmZsYXRpb24gVGFyZ2V0IiA9ICJwZXJjZW50X2Fib3ZlX3RhcmdldF9pbmZsYXRpb24iLA0KICAiUGVyY2VudCBBYm92ZSBDb25zZXJ2YXRpdmUgVGFyZ2V0IiA9ICJwZXJjZW50X2Fib3ZlX3RhcmdldF9jb25zZXJ2YXRpdmUiLA0KICAiUGVyY2VudCBBYm92ZSBNb2RlcmF0ZSBUYXJnZXQiID0gInBlcmNlbnRfYWJvdmVfdGFyZ2V0X21vZGVyYXRlIiwNCiAgIlBlcmNlbnQgQWJvdmUgQWdncmVzc2l2ZSBUYXJnZXQiID0gInBlcmNlbnRfYWJvdmVfdGFyZ2V0X2FnZ3Jlc3NpdmUiDQopDQoNCiMgRnVuY3Rpb24gdG8gc2F2ZSBzdW1tYXJ5IHZhbHVlcyBkeW5hbWljYWxseQ0Kc2F2ZV9jb2x1bW5fdmFsdWVzIDwtIGZ1bmN0aW9uKHN1bW1hcnlfZGYpIHsNCiAgIyBFeGNsdWRlIHRoZSAiU3RhdGlzdGljIiBhbmQgIk92ZXJhbGwiIGNvbHVtbnMNCiAgY29sdW1uc190b19zYXZlIDwtIHNldGRpZmYobmFtZXMoc3VtbWFyeV9kZiksIGMoIlN0YXRpc3RpYyIsICJPdmVyYWxsIikpDQogIA0KICAjIEl0ZXJhdGUgb3ZlciBlYWNoIGNvbHVtbg0KICBmb3IgKGNvbCBpbiBjb2x1bW5zX3RvX3NhdmUpIHsNCiAgICAjIEZvcm1hdCBjb2x1bW4gbmFtZSB0byBsb3dlcmNhc2UgYW5kIHJlcGxhY2UgaW52YWxpZCBjaGFyYWN0ZXJzDQogICAgY29sX25hbWUgPC0gdG9sb3dlcihnc3ViKCJbXmEtekEtWjAtOV0iLCAiXyIsIGNvbCkpDQogICAgDQogICAgIyBFeHRyYWN0IHZhbHVlcyBmb3IgdGhlIGN1cnJlbnQgY29sdW1uDQogICAgY29sX3ZhbHVlcyA8LSBzdW1tYXJ5X2RmW1tjb2xdXQ0KICAgIA0KICAgICMgU2F2ZSBlYWNoIHZhbHVlIGR5bmFtaWNhbGx5IHVzaW5nIHRoZSBtYXBwaW5nIGZvciByb3cgbmFtZXMNCiAgICBmb3IgKGkgaW4gc2VxX2Fsb25nKGNvbF92YWx1ZXMpKSB7DQogICAgICAjIEdldCB0aGUgY29ycmVzcG9uZGluZyB2YXJpYWJsZSBuYW1lIGZyb20gdGhlIG1hcHBpbmcNCiAgICAgIHN0YXRfbmFtZSA8LSByb3dfdG9fdmFyX25hbWVbcm93bmFtZXMoc3VtbWFyeV9kZilbaV1dDQogICAgICANCiAgICAgIGlmICghaXMubmEoc3RhdF9uYW1lKSkgeyAgIyBTa2lwIGlmIG5vIG1hcHBpbmcgaXMgZGVmaW5lZA0KICAgICAgICAjIENyZWF0ZSB0aGUgdmFyaWFibGUgbmFtZQ0KICAgICAgICB2YXJfbmFtZSA8LSBwYXN0ZTAoc3RhdF9uYW1lLCAiXyIsIGNvbF9uYW1lKQ0KICAgICAgICANCiAgICAgICAgIyBBdHRlbXB0IG51bWVyaWMgY29udmVyc2lvbiBmb3IgZG93bnN0cmVhbSB1c2UNCiAgICAgICAgdmFsdWUgPC0gc3VwcHJlc3NXYXJuaW5ncyhhcy5udW1lcmljKGdzdWIoIiUiLCAiIiwgY29sX3ZhbHVlc1tpXSkpKQ0KICAgICAgICANCiAgICAgICAgIyBBc3NpZ24gdGhlIHZhbHVlIHRvIHRoZSBnbG9iYWwgZW52aXJvbm1lbnQNCiAgICAgICAgYXNzaWduKHZhcl9uYW1lLCB2YWx1ZSwgZW52aXIgPSAuR2xvYmFsRW52KQ0KICAgICAgfQ0KICAgIH0NCiAgfQ0KfQ0KDQojIEFwcGx5IHRoZSBmdW5jdGlvbiB0byBzYXZlIHZhbHVlcyBmb3IgYWxsIGNvbHVtbnMgZXhjZXB0ICJPdmVyYWxsIg0Kc2F2ZV9jb2x1bW5fdmFsdWVzKHZndF9yYXdfY2Fncl9zdW1tYXJ5KQ0KDQojIEV4YW1wbGU6IEFjY2Vzc2luZyBkeW5hbWljYWxseSBjcmVhdGVkIHZhcmlhYmxlcw0KaW50ZXJhY3RpdmVfcHJpbnQobWVhbl92YWx1ZV8xX3llYXJfY2FncikgICMgU2hvdWxkIHByaW50IHRoZSBtZWFuIHZhbHVlIGZvciAxLVllYXIgQ0FHUg0KaW50ZXJhY3RpdmVfcHJpbnQocGVyY2VudF9hYm92ZV90YXJnZXRfaW5mbGF0aW9uXzVfeWVhcl9jYWdyKSAgIyBTaG91bGQgcHJpbnQgdGhlIHBlcmNlbnQgYWJvdmUgaW5mbGF0aW9uIHRhcmdldCBmb3IgNS1ZZWFyIENBR1INCmludGVyYWN0aXZlX3ByaW50KHNkX3ZhbHVlXzEwX3llYXJfY2FncikgICMgU2hvdWxkIHByaW50IHRoZSBzdGFuZGFyZCBkZXZpYXRpb24gZm9yIDEwLVllYXIgQ0FHUg0KDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KIyMgT1ZFUkFMTCBTVEFUSVNUSUNTIA0KbnVtZXJpY192YWx1ZXNfYWxsIDwtIGFzLm51bWVyaWModW5saXN0KHZndF9yYXdfY2FncltleGlzdGluZ19jYWdyX2NvbHVtbnNdLCB1c2UubmFtZXMgPSBGQUxTRSkpDQpudW1lcmljX3ZhbHVlc19hbGwgPC0gbnVtZXJpY192YWx1ZXNfYWxsWyFpcy5uYShudW1lcmljX3ZhbHVlc19hbGwpXQ0KDQpvdmVyYWxsX2NvdW50X29ic2VydmF0aW9ucyA8LSBsZW5ndGgobnVtZXJpY192YWx1ZXNfYWxsKQ0Kb3ZlcmFsbF9tZWFuX3ZhbHVlIDwtIHJvdW5kKG1lYW4obnVtZXJpY192YWx1ZXNfYWxsKSwgMikNCm92ZXJhbGxfbWVkaWFuX3ZhbHVlIDwtIHJvdW5kKG1lZGlhbihudW1lcmljX3ZhbHVlc19hbGwpLCAyKQ0Kb3ZlcmFsbF9zZF92YWx1ZSA8LSByb3VuZChzZChudW1lcmljX3ZhbHVlc19hbGwpLCAyKQ0Kb3ZlcmFsbF9taW5fY2Fncl9yYW5nZSA8LSByb3VuZChjYWdyX3ZhbHVlIC0gb3ZlcmFsbF9zZF92YWx1ZSwgMikNCm92ZXJhbGxfbWF4X2NhZ3JfcmFuZ2UgPC0gcm91bmQoY2Fncl92YWx1ZSArIG92ZXJhbGxfc2RfdmFsdWUsIDIpDQpvdmVyYWxsX21pbl92YWx1ZSA8LSByb3VuZChtaW4obnVtZXJpY192YWx1ZXNfYWxsKSwgMikNCm92ZXJhbGxfbWF4X3ZhbHVlIDwtIHJvdW5kKG1heChudW1lcmljX3ZhbHVlc19hbGwpLCAyKQ0KDQpvdmVyYWxsX2Fib3ZlX3RhcmdldF9pbmZsYXRpb24gPC0gc3VtKG51bWVyaWNfdmFsdWVzX2FsbCA+PSB0YXJnZXRfaW5mbGF0aW9uLCBuYS5ybSA9IFRSVUUpDQpvdmVyYWxsX2Fib3ZlX3RhcmdldF9jb25zZXJ2YXRpdmUgPC0gc3VtKG51bWVyaWNfdmFsdWVzX2FsbCA+PSB0YXJnZXRfY29uc2VydmF0aXZlLCBuYS5ybSA9IFRSVUUpDQpvdmVyYWxsX2Fib3ZlX3RhcmdldF9tb2RlcmF0ZSA8LSBzdW0obnVtZXJpY192YWx1ZXNfYWxsID49IHRhcmdldF9tb2RlcmF0ZSwgbmEucm0gPSBUUlVFKQ0Kb3ZlcmFsbF9hYm92ZV90YXJnZXRfYWdncmVzc2l2ZSA8LSBzdW0obnVtZXJpY192YWx1ZXNfYWxsID49IHRhcmdldF9hZ2dyZXNzaXZlLCBuYS5ybSA9IFRSVUUpDQoNCm92ZXJhbGxfcGVyY2VudF9hYm92ZV90YXJnZXRfY29uc2VydmF0aXZlIDwtIHJvdW5kKChvdmVyYWxsX2Fib3ZlX3RhcmdldF9jb25zZXJ2YXRpdmUgLyBvdmVyYWxsX2NvdW50X29ic2VydmF0aW9ucykgKiAxMDAsIDIpDQpvdmVyYWxsX3BlcmNlbnRfYWJvdmVfdGFyZ2V0X2luZmxhdGlvbiA8LSByb3VuZCgob3ZlcmFsbF9hYm92ZV90YXJnZXRfaW5mbGF0aW9uIC8gb3ZlcmFsbF9jb3VudF9vYnNlcnZhdGlvbnMpICogMTAwLCAyKQ0Kb3ZlcmFsbF9wZXJjZW50X2Fib3ZlX3RhcmdldF9tb2RlcmF0ZSA8LSByb3VuZCgob3ZlcmFsbF9hYm92ZV90YXJnZXRfbW9kZXJhdGUgLyBvdmVyYWxsX2NvdW50X29ic2VydmF0aW9ucykgKiAxMDAsIDIpDQpvdmVyYWxsX3BlcmNlbnRfYWJvdmVfdGFyZ2V0X2FnZ3Jlc3NpdmUgPC0gcm91bmQoKG92ZXJhbGxfYWJvdmVfdGFyZ2V0X2FnZ3Jlc3NpdmUgLyBvdmVyYWxsX2NvdW50X29ic2VydmF0aW9ucykgKiAxMDAsIDIpDQoNCnZndF9yYXdfY2Fncl9zdW1tYXJ5JE92ZXJhbGwgPC0gYygNCiAgb3ZlcmFsbF9jb3VudF9vYnNlcnZhdGlvbnMsDQogIHBhc3RlMChvdmVyYWxsX21lYW5fdmFsdWUsICIlIiksDQogIHBhc3RlMChvdmVyYWxsX21lZGlhbl92YWx1ZSwgIiUiKSwNCiAgcGFzdGUwKG92ZXJhbGxfc2RfdmFsdWUsICIlIiksDQogIHBhc3RlMChvdmVyYWxsX21pbl9jYWdyX3JhbmdlLCAiJSIpLA0KICBwYXN0ZTAob3ZlcmFsbF9tYXhfY2Fncl9yYW5nZSwgIiUiKSwNCiAgcGFzdGUwKG92ZXJhbGxfbWluX3ZhbHVlLCAiJSIpLA0KICBwYXN0ZTAob3ZlcmFsbF9tYXhfdmFsdWUsICIlIiksDQogIHBhc3RlMChvdmVyYWxsX3BlcmNlbnRfYWJvdmVfdGFyZ2V0X2luZmxhdGlvbiwgIiUiKSwNCiAgcGFzdGUwKG92ZXJhbGxfcGVyY2VudF9hYm92ZV90YXJnZXRfY29uc2VydmF0aXZlLCAiJSIpLA0KICBwYXN0ZTAob3ZlcmFsbF9wZXJjZW50X2Fib3ZlX3RhcmdldF9tb2RlcmF0ZSwgIiUiKSwNCiAgcGFzdGUwKG92ZXJhbGxfcGVyY2VudF9hYm92ZV90YXJnZXRfYWdncmVzc2l2ZSwgIiUiKQ0KKQ0KDQojIENvbnZlcnQgcm93IG5hbWVzIHRvIGEgY29sdW1uDQp2Z3RfcmF3X2NhZ3Jfc3VtbWFyeSA8LSB0aWJibGU6OnJvd25hbWVzX3RvX2NvbHVtbih2Z3RfcmF3X2NhZ3Jfc3VtbWFyeSwgdmFyID0gIlN0YXRpc3RpYyIpDQoNCiMgRW5zdXJlIGFsbCBjb2x1bW5zIGFyZSBjaGFyYWN0ZXINCnZndF9yYXdfY2Fncl9zdW1tYXJ5IDwtIHZndF9yYXdfY2Fncl9zdW1tYXJ5ICU+JQ0KICBtdXRhdGUoYWNyb3NzKGV2ZXJ5dGhpbmcoKSwgYXMuY2hhcmFjdGVyKSkNCg0KIyBEaXNwbGF5IHRoZSBzdW1tYXJ5IHRhYmxlDQpjYXQoIlxuIyMjIyBDb21wb3VuZCBBdmVyYWdlIEdyb3d0aCBSYXRlcyAoIiwgbWluX3llYXIsICItIiwgbWF4X3llYXIsICIpXG4iLCBzZXAgPSAiIikNCmludGVyYWN0aXZlX3N0cih2Z3RfcmF3X2NhZ3Jfc3VtbWFyeSkNCmZvcm1hdF91bnNwZWNpZmllZF93aWR0aCh2Z3RfcmF3X2NhZ3Jfc3VtbWFyeSkNCg0KYGBgDQoNCioqYHIgbWluX3llYXJgLWByIG1heF95ZWFyYCBTdW1tYXJ5OioqIFRoZSAxLVllYXIgQ0FHUiBleGhpYml0cyB0aGUgYHIgaWYobWVhbl92YWx1ZV8xX3llYXJfY2FnciA9PSBtYXgoYyhtZWFuX3ZhbHVlXzFfeWVhcl9jYWdyLCBtZWFuX3ZhbHVlXzVfeWVhcl9jYWdyLCBtZWFuX3ZhbHVlXzEwX3llYXJfY2FncikpKSAiaGlnaGVzdCBtZWFuIHJldHVybiIgZWxzZSBpZihtZWFuX3ZhbHVlXzFfeWVhcl9jYWdyID09IG1pbihjKG1lYW5fdmFsdWVfMV95ZWFyX2NhZ3IsIG1lYW5fdmFsdWVfNV95ZWFyX2NhZ3IsIG1lYW5fdmFsdWVfMTBfeWVhcl9jYWdyKSkpICJsb3dlc3QgbWVhbiByZXR1cm4iIGVsc2UgIm1lYW4gcmV0dXJuImAgYXQgYHIgbWVhbl92YWx1ZV8xX3llYXJfY2FncmAlLCBhbmQgYHIgaWYoc2RfdmFsdWVfMV95ZWFyX2NhZ3IgPT0gbWF4KGMoc2RfdmFsdWVfMV95ZWFyX2NhZ3IsIHNkX3ZhbHVlXzVfeWVhcl9jYWdyLCBzZF92YWx1ZV8xMF95ZWFyX2NhZ3IpKSkgInRoZSBncmVhdGVzdCB2b2xhdGlsaXR5IHdpdGggYSIgZWxzZSBpZihzZF92YWx1ZV8xX3llYXJfY2FnciA9PSBtaW4oYyhzZF92YWx1ZV8xX3llYXJfY2Fnciwgc2RfdmFsdWVfNV95ZWFyX2NhZ3IsIHNkX3ZhbHVlXzEwX3llYXJfY2FncikpKSAidGhlIGxlYXN0IHZvbGF0aWxpdHkgd2l0aCBhIiBlbHNlICJhImAgc3RhbmRhcmQgZGV2aWF0aW9uIG9mIGByIHNkX3ZhbHVlXzFfeWVhcl9jYWdyYCUuIEFzIHRoZSBpbnZlc3RtZW50IGhvcml6b24gZXh0ZW5kcyB0byA1LCBhbmQgMTAgeWVhcnMsIHRoZSBtZWFuIHJldHVybnMgYHIgaWYobWVhbl92YWx1ZV8xX3llYXJfY2FnciA8IG1lYW4oYyhtZWFuX3ZhbHVlXzVfeWVhcl9jYWdyLCBtZWFuX3ZhbHVlXzEwX3llYXJfY2FncikpKSAiaW5jcmVhc2UiIGVsc2UgImRlY3JlYXNlImAsIHJhbmdpbmcgZnJvbSBgciBtZWFuX3ZhbHVlXzVfeWVhcl9jYWdyYCUgdG8gYHIgbWVhbl92YWx1ZV8xMF95ZWFyX2NhZ3JgJSwgd2hpbGUgdm9sYXRpbGl0eSBgciBpZihzZF92YWx1ZV8xX3llYXJfY2FnciA8IG1lYW4oYyhzZF92YWx1ZV81X3llYXJfY2Fnciwgc2RfdmFsdWVfMTBfeWVhcl9jYWdyKSkpICJyaXNlcyIgZWxzZSAiZGltaW5pc2hlcyJgLCB3aXRoIHN0YW5kYXJkIGRldmlhdGlvbnMgYHIgaWYoc2RfdmFsdWVfMV95ZWFyX2NhZ3IgPiBzZF92YWx1ZV8xMF95ZWFyX2NhZ3IpICJkcm9wcGluZyIgZWxzZSAicmlzaW5nImAgZnJvbSBgciBzZF92YWx1ZV81X3llYXJfY2FncmAlIHRvIGByIHNkX3ZhbHVlXzEwX3llYXJfY2FncmAlLiBUaGlzIHRyZW5kIGluZGljYXRlcyB0aGF0IGxvbmdlciBpbnZlc3RtZW50IHBlcmlvZHMgdGVuZCB0byBvZmZlciBgciBpZihzZF92YWx1ZV8xX3llYXJfY2FnciA+IHNkX3ZhbHVlXzEwX3llYXJfY2FncikgIm1vcmUgc3RhYmxlIiBlbHNlICJsZXNzIHN0YWJsZSJgIHJldHVybnMuIEZ1cnRoZXJtb3JlLCB0aGUgcGVyY2VudGFnZSBvZiBwZXJpb2RzIGV4Y2VlZGluZyB0aGUgaW5mbGF0aW9uIHRhcmdldCBgciBpZihwZXJjZW50X2Fib3ZlX3RhcmdldF9pbmZsYXRpb25fMV95ZWFyX2NhZ3IgPCBwZXJjZW50X2Fib3ZlX3RhcmdldF9pbmZsYXRpb25fMTBfeWVhcl9jYWdyKSAiaW5jcmVhc2VzIiBlbHNlICJkZWNyZWFzZXMiYCB3aXRoIGxvbmdlciBkdXJhdGlvbnMsIGZyb20gYHIgcGVyY2VudF9hYm92ZV90YXJnZXRfaW5mbGF0aW9uXzFfeWVhcl9jYWdyYCUgaW4gdGhlIDEtWWVhciBDQUdSIHRvIGByIHBlcmNlbnRfYWJvdmVfdGFyZ2V0X2luZmxhdGlvbl8xMF95ZWFyX2NhZ3JgJSBpbiB0aGUgMTAtWWVhciBDQUdSLCB1bmRlcnNjb3JpbmcgVkdUJ3MgYHIgaWYocGVyY2VudF9hYm92ZV90YXJnZXRfaW5mbGF0aW9uXzFfeWVhcl9jYWdyIDwgcGVyY2VudF9hYm92ZV90YXJnZXRfaW5mbGF0aW9uXzEwX3llYXJfY2FncikgImVmZmVjdGl2ZW5lc3MiIGVsc2UgImluZWZmZWN0aXZlbmVzcyJgIGFzIGEgaGVkZ2UgYWdhaW5zdCBpbmZsYXRpb24gb3ZlciBleHRlbmRlZCB0aW1lZnJhbWVzLiBXaXRoIGFuIG92ZXJhbGwgcGVyY2VudGFnZSBvZiBgciBvdmVyYWxsX3BlcmNlbnRfYWJvdmVfdGFyZ2V0X2FnZ3Jlc3NpdmVgJSBleGNlZWRpbmcgdGhlIGFnZ3Jlc3NpdmUgdGFyZ2V0IChgciB0YXJnZXRfYWdncmVzc2l2ZWAlIGFubnVhbGl6ZWQgcmV0dXJucyB3aXRoIGByIHRhcmdldF9pbmZsYXRpb25gJSBpbmZsYXRpb24pLCBWR1QgYHIgaWYob3ZlcmFsbF9wZXJjZW50X2Fib3ZlX3RhcmdldF9hZ2dyZXNzaXZlID4gNTApICJoYXMsIG92ZXIgdGhpcyB0aW1lIHBlcmlvZCwgcHJvdmVuIHRvIGJlIGEgc3Ryb25nIiBlbHNlIGlmKG92ZXJhbGxfcGVyY2VudF9hYm92ZV90YXJnZXRfYWdncmVzc2l2ZSA+IDQwKSAiaGFzLCBvdmVyIHRoaXMgdGltZSBwZXJpb2QsIGRlbW9uc3RyYXRlZCBpdHNlbGYgYXMgYSB2aWFibGUiIGVsc2UgImFwcGVhcnMsIG92ZXIgdGhpcyB0aW1lIHBlcmlvZCwgdG8gYmUgYSBsZXNzIHN1aXRhYmxlImAgb3B0aW9uIGZvciBhIGhpZ2gtcmV0dXJuaW5nIGxvbmctdGVybSBpbnZlc3RtZW50Lg0KDQojIyMgR3JhcGgNCg0KIyMjIyBBbGwgUGVyaW9kcw0KDQoNCmBgYHtyIHZndF9yYXdfY2Fncl9ncmFwaHNfYWxsLCBmaWcud2lkdGg9MTAsIGZpZy5oZWlnaHQ9NywgZXZhbD1UUlVFLCBlY2hvPUZBTFNFfQ0KDQpjYXQoIlxuXG4jIyMjIENvbXBvdW5kIEF2ZXJhZ2UgR3Jvd3RoIFJhdGVzIEFjcm9zcyBQZXJpb2RzIFxuIikNCg0KIyBMb2FkIG5lY2Vzc2FyeSBsaWJyYXJpZXMNCmxpYnJhcnkoZ2dwbG90MikNCmxpYnJhcnkoZHBseXIpDQoNCg0KIyBDb252ZXJ0IGNvbHVtbnMgdG8gbnVtZXJpYyBmb3IgcGxvdHRpbmcgaWYgbmVlZGVkDQp2Z3RfcmF3X2NhZ3IgPC0gdmd0X3Jhd19jYWdyICU+JQ0KICBtdXRhdGUoDQogICAgYERhdGVgID0gYXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIoYERhdGVgKSksICAjIEVuc3VyZSBEYXRlIGlzIG51bWVyaWMNCiAgICBgMS1ZZWFyIENBR1JgID0gYXMubnVtZXJpYyhnc3ViKCIlIiwgIiIsIGAxLVllYXIgQ0FHUmApKSwNCiAgICBgNS1ZZWFyIENBR1JgID0gYXMubnVtZXJpYyhnc3ViKCIlIiwgIiIsIGA1LVllYXIgQ0FHUmApKSwNCiAgICBgMTAtWWVhciBDQUdSYCA9IGFzLm51bWVyaWMoZ3N1YigiJSIsICIiLCBgMTAtWWVhciBDQUdSYCkpLA0KICAgIGAyMC1ZZWFyIENBR1JgID0gYXMubnVtZXJpYyhnc3ViKCIlIiwgIiIsIGAyMC1ZZWFyIENBR1JgKSksDQogICAgYDMwLVllYXIgQ0FHUmAgPSBhcy5udW1lcmljKGdzdWIoIiUiLCAiIiwgYDMwLVllYXIgQ0FHUmApKQ0KICApDQoNCiMgUmVzaGFwZSB0aGUgZGF0YSBpbnRvIGxvbmcgZm9ybWF0IGZvciBlYXN5IHBsb3R0aW5nIG9mIG11bHRpcGxlIGxpbmVzIGFuZCBzZXQgdGhlIGZhY3RvciBvcmRlcg0KbnJ0X2xvbmcgPC0gdmd0X3Jhd19jYWdyICU+JQ0KICBwaXZvdF9sb25nZXIoY29scyA9IGMoYDEtWWVhciBDQUdSYCwgYDUtWWVhciBDQUdSYCwgYDEwLVllYXIgQ0FHUmAsIGAyMC1ZZWFyIENBR1JgLCBgMzAtWWVhciBDQUdSYCksDQogICAgICAgICAgICAgICBuYW1lc190byA9ICJDQUdSX1BlcmlvZCIsDQogICAgICAgICAgICAgICB2YWx1ZXNfdG8gPSAiQ0FHUl9WYWx1ZSIpICU+JQ0KICBtdXRhdGUoQ0FHUl9QZXJpb2QgPSBmYWN0b3IoQ0FHUl9QZXJpb2QsIGxldmVscyA9IGMoIjEtWWVhciBDQUdSIiwgIjUtWWVhciBDQUdSIiwgIjEwLVllYXIgQ0FHUiIsICIyMC1ZZWFyIENBR1IiLCAiMzAtWWVhciBDQUdSIikpKQ0KDQojIEFzc2lnbiBjb2xvcnMgZHluYW1pY2FsbHkgYmFzZWQgb24gdGhlIG9yZGVyIG9mIENBR1JfUGVyaW9kIGluIHRoZSBkYXRhDQojIE1hdGNoIHRoZSB1bmlxdWUgbGV2ZWxzIG9mIENBR1JfUGVyaW9kIHdpdGggY29sb3JzIGZyb20gY29sb3JzX2dlbmVyYWxfZGFyaw0KdW5pcXVlX3R5cGVzIDwtIHVuaXF1ZShucnRfbG9uZyRDQUdSX1BlcmlvZCkNCmN1c3RvbV9jb2xvcnMgPC0gc2V0TmFtZXMoY29sb3JzX2dlbmVyYWxfZGFya1sxOmxlbmd0aCh1bmlxdWVfdHlwZXMpXSwgdW5pcXVlX3R5cGVzKQ0KDQojIEZpbmQgdGhlIG1pbmltdW0gYW5kIG1heGltdW0geC12YWx1ZSBpbiB5b3VyIGRhdGENCm1heF94IDwtIG1heChhcy5pbnRlZ2VyKHZndF9yYXdfY2FnciREYXRlKSwgbmEucm0gPSBUUlVFKQ0KbWluX3ggPC0gbWluKGFzLmludGVnZXIodmd0X3Jhd19jYWdyJERhdGUpLCBuYS5ybSA9IFRSVUUpDQppbnRlcmFjdGl2ZV9wcmludChtYXhfeCkgICMgVGVzdA0KaW50ZXJhY3RpdmVfcHJpbnQobWluX3gpICAjIFRlc3QNCg0KIyBGaW5kIHRoZSBtaW5pbXVtIGFuZCBtYXhpbXVtIHllYXINCm1pbl95ZWFyIDwtIG1pbih2Z3RfcmF3X2NhZ3IkRGF0ZSwgbmEucm0gPSBUUlVFKQ0KbWF4X3llYXIgPC0gbWF4KHZndF9yYXdfY2FnciREYXRlLCBuYS5ybSA9IFRSVUUpDQppbnRlcmFjdGl2ZV9wcmludChtaW5feWVhcikNCmludGVyYWN0aXZlX3ByaW50KG1heF95ZWFyKQ0KDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KIyMgUExPVCBGVUxMIFdJVEhPVVQgTElNSVRTDQoNCiMgRGVmaW5lIHN0YXJ0IGFuZCBlbmQgeWVhcnMNCnN0YXJ0X3llYXIgPC0gYXMubnVtZXJpYyhtaW5feWVhcikNCmVuZF95ZWFyIDwtIDIwMjQNCnllYXJfcmFuZ2UgPC0gZW5kX3llYXIgLSBzdGFydF95ZWFyICsgMSAgIyBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiB5ZWFycw0KDQojIERlZmluZSBicmVha3Mgcm91bmRlZCBhcHByb3ByaWF0ZWx5DQpsaW1pdHNfc3RhcnRfeWVhciA8LSBmbG9vcihzdGFydF95ZWFyIC8gNSkgKiA1ICAjIFJvdW5kIGRvd24gdG8gdGhlIG5lYXJlc3QgbXVsdGlwbGUgb2YgNQ0KbGltaXRzX2VuZF95ZWFyIDwtIGNlaWxpbmcoZW5kX3llYXIgLyA1KSAqIDUgICAjIFJvdW5kIHVwIHRvIHRoZSBuZWFyZXN0IG11bHRpcGxlIG9mIDUNCg0KIyBDcmVhdGUgZHluYW1pYyB0aXRsZSBhbmQgY2FwdGlvbg0KZHluYW1pY190aXRsZSA8LSBwYXN0ZTAoIlJvbGxpbmcgQ0FHUnMgQWNyb3NzIFBlcmlvZHMgT3ZlciAiLHllYXJfcmFuZ2UsICIgWWVhcnMgKCIsIHN0YXJ0X3llYXIsICItIiwgZW5kX3llYXIsICIpIikNCmR5bmFtaWNfY2FwdGlvbiA8LSBwYXN0ZTAoIlZHVCBDb21wb3VuZCBBdmVyYWdlIEdyb3d0aCBSYXRlcyBBY3Jvc3MgUm9sbGluZyBQZXJpb2RzLCBEYXRhc2V0ICgiLCBtaW5feWVhciwgIi0iLCBtYXhfeWVhciwgIikiKQ0KDQojIENyZWF0ZSB0aGUgZnVsbCwgbm9uLWZpbHRlcmVkIHgtYXhpcyBwbG90IHdpdGggZHluYW1pYyB4IHBsYWNlbWVudCBmb3IgYW5ub3RhdGlvbnMNCnAxIDwtIGdncGxvdChucnRfbG9uZywgYWVzKHggPSBhcy5pbnRlZ2VyKERhdGUpLCB5ID0gQ0FHUl9WYWx1ZSwgY29sb3IgPSBDQUdSX1BlcmlvZCkpICsNCg0KICAjIEFkZCBzaGFkZWQgYXJlYXMgZm9yIGJhY2tncm91bmQgZWZmZWN0DQogIGdlb21fcmVjdChhZXMoeG1pbiA9IC1JbmYsIHhtYXggPSBJbmYsIHltaW4gPSB0YXJnZXRfYWdncmVzc2l2ZSwgeW1heCA9IEluZiksIGZpbGwgPSAibGlnaHRncmVlbiIsIGFscGhhID0gMC4wMTApICsNCiAgZ2VvbV9yZWN0KGFlcyh4bWluID0gLUluZiwgeG1heCA9IEluZiwgeW1pbiA9IHRhcmdldF9jb25zZXJ2YXRpdmUsIHltYXggPSB0YXJnZXRfYWdncmVzc2l2ZSksIGZpbGwgPSAib3JhbmdlIiwgYWxwaGEgPSAwLjAxKSArDQogIGdlb21fcmVjdChhZXMoeG1pbiA9IC1JbmYsIHhtYXggPSBJbmYsIHltaW4gPSAtSW5mLCB5bWF4ID0gdGFyZ2V0X2NvbnNlcnZhdGl2ZSksIGZpbGwgPSAibGlnaHRjb3JhbCIsIGFscGhhID0gMC4wMTApICsNCiAgDQogICMgUGxvdCBsaW5lcyBmb3IgZWFjaCBDQUdSIFBlcmlvZA0KICBnZW9tX2xpbmUoc2l6ZSA9IDEuMCwgYWxwaGEgPSAzLjApICsgICAgICAgIyBMaW5lIGZvciBlYWNoIENBR1INCiAgZ2VvbV9wb2ludChzaXplID0gMS4wLCBhbHBoYSA9IDMuMCkgKyAgICAgICAjIFBvaW50cyBmb3IgZWFjaCBDQUdSDQogIA0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSB0YXJnZXRfYWdncmVzc2l2ZSwgY29sb3IgPSAiZGFya2JsdWUiLCBsaW5ldHlwZSA9ICJzb2xpZCIpICsNCiAgIyBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSB0YXJnZXRfbW9kZXJhdGUsIGNvbG9yID0gImRhcmtibHVlIiwgbGluZXR5cGUgPSAic29saWQiKSArDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IHRhcmdldF9jb25zZXJ2YXRpdmUsIGNvbG9yID0gImRhcmtibHVlIiwgbGluZXR5cGUgPSAic29saWQiKSArDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IHRhcmdldF9pbmZsYXRpb24sIGNvbG9yID0gImRhcmtyZWQiLCBsaW5ldHlwZSA9ICJkYXNoZWQiKSArDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IGNhZ3JfdmFsdWUsIGNvbG9yID0gImRhcmtyZWQiLCBsaW5ldHlwZSA9ICJkYXNoZWQiKSArDQogIA0KICAjIER5bmFtaWMgcmlnaHQtYWxpZ25lZCBwbGFjZW1lbnQgZm9yIGFubm90YXRpb25zDQogIGFubm90YXRlKCJ0ZXh0IiwgeCA9IEluZiwgeSA9IHRhcmdldF9hZ2dyZXNzaXZlLCBsYWJlbCA9ICJBZ2dyZXNzaXZlIiwgDQogICAgICAgICAgIGhqdXN0ID0gMSwgdmp1c3QgPSArMS4xMCwgY29sb3IgPSAiZGFya2JsdWUiLCBzaXplID0gNCkgKw0KICAjIGFubm90YXRlKCJ0ZXh0IiwgeCA9IEluZiwgeSA9IHRhcmdldF9tb2RlcmF0ZSwgbGFiZWwgPSAiTW9kZXJhdGUiLCANCiAgIyAgICAgICAgIGhqdXN0ID0gMSwgdmp1c3QgPSAtMC41MCwgY29sb3IgPSAiZGFya2JsdWUiLCBzaXplID0gNCkgKw0KICBhbm5vdGF0ZSgidGV4dCIsIHggPSBJbmYsIHkgPSB0YXJnZXRfY29uc2VydmF0aXZlLCBsYWJlbCA9ICJDb25zZXJ2YXRpdmUiLA0KICAgICAgICAgICBoanVzdCA9IDEsIHZqdXN0ID0gLTAuNTAsIGNvbG9yID0gImRhcmtibHVlIiwgc2l6ZSA9IDQpICsNCiAgYW5ub3RhdGUoInRleHQiLCB4ID0gSW5mLCB5ID0gdGFyZ2V0X2luZmxhdGlvbiwgbGFiZWwgPSAiSW5mbGF0aW9uIiwgDQogICAgICAgICAgIGhqdXN0ID0gMSwgdmp1c3QgPSArMS4xMCwgY29sb3IgPSAiZGFya3JlZCIsIHNpemUgPSA0KSArDQogIGFubm90YXRlKCJ0ZXh0IiwgeCA9IEluZiwgeSA9IGNhZ3JfdmFsdWUsIGxhYmVsID0gIkNBR1IiLCANCiAgICAgICAgICAgaGp1c3QgPSAxLCB2anVzdCA9IC0wLjUwLCBjb2xvciA9ICJkYXJrcmVkIiwgc2l6ZSA9IDQpICsgDQoNCiAgbGFicygNCiAgICB0aXRsZSA9IGR5bmFtaWNfdGl0bGUsDQogICAgeCA9ICJZZWFyIiwNCiAgICB5ID0gIkNBR1IgVmFsdWUgKCUpIiwNCiAgICBjb2xvciA9ICJDQUdSIFBlcmlvZCIsDQogICAgY2FwdGlvbiA9IGR5bmFtaWNfY2FwdGlvbg0KICAgICkgKw0KICANCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGN1c3RvbV9jb2xvcnMpICsgICMgU2V0IGNvbG9ycyBmb3IgZWFjaCBDQUdSIFBlcmlvZA0KICBzY2FsZV94X2NvbnRpbnVvdXMoDQogICAgbGltaXRzID0gYyhzdGFydF95ZWFyLCBlbmRfeWVhciArIDMpLCANCiAgICBicmVha3MgPSBzZXEobGltaXRzX3N0YXJ0X3llYXIsIGxpbWl0c19lbmRfeWVhciAsIDUpKSArICAjIFJlc3RyaWN0ICYgU2V0IE1ham9yIHgtYXhpcyBsaW5lcyBmb3IgZWFjaCB5ZWFyDQogIA0KICB0aGVtZV9taW5pbWFsKCkgKw0KICB0aGVtZSgNCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41LCBzaXplID0gMjApLCAgICAgICAgICMgTGFyZ2VyIHRpdGxlIGZvbnQNCiAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0KSwgICAgICAgICAgICAgICAgICAgICMgTGFyZ2VyIHgtYXhpcyBsYWJlbCBmb250DQogICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCksICAgICAgICAgICAgICAgICAgICAjIExhcmdlciB5LWF4aXMgbGFiZWwgZm9udA0KICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSwgc2l6ZSA9IDE0KSwgICMgTGFyZ2VyIHgtYXhpcyB0ZXh0DQogICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0KSwgICAgICAgICAgICAgICAgICAgICAjIExhcmdlciB5LWF4aXMgdGV4dA0KICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQpLCAgICAgICAgICAgICAgICAgICAgIyBMZWdlbmQgdGl0bGUgc2l6ZQ0KICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiksICAgICAgICAgICAgICAgICAgICAgIyBMZWdlbmQgdGV4dCBzaXplDQogICAgcGFuZWwuZ3JpZC5tYWpvciA9IGVsZW1lbnRfbGluZShsaW5ldHlwZSA9ICJkb3R0ZWQiLCBjb2xvciA9ICJibGFjayIpLCAgIyBNYWpvciBncmlkIGxpbmVzDQogICAgcGFuZWwuZ3JpZC5taW5vci54ID0gZWxlbWVudF9ibGFuaygpLCAgICAgICAgICAgICAgICAgICAgICAjIE5vIG1pbm9yIHggZ3JpZCBsaW5lcw0KICAgIGF4aXMudGlja3MubGVuZ3RoID0gdW5pdCgtMC4yNSwgImNtIiksICAgICAgICAgICAgICAgICAgICAgICMgSW5jcmVhc2UgdGljayBsZW5ndGgNCiAgICBheGlzLnRpY2tzID0gZWxlbWVudF9saW5lKGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDAuNTApLCAgICMgRGFya2VyIHRpY2tzDQogICAgYXhpcy5saW5lLnggPSBlbGVtZW50X2xpbmUoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMC43NSksICAjIERhcmsgYm90dG9tIGJvcmRlcg0KICAgIGF4aXMubGluZS55ID0gZWxlbWVudF9saW5lKGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDAuNzUpICAgIyBEYXJrIGxlZnQgYm9yZGVyDQogICkNCg0KIyBQcmludCB0aGUgcGxvdCANCnByaW50KHAxKQ0KDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KIyMgUExPVCBSRVNUUklDVEVEIFdJVEggTElNSVRTIA0KDQojIEZpbHRlciB0aGUgZGF0YSBmb3IgdGhlIHJlc3RyaWN0ZWQgeC1heGlzIHJhbmdlICgyMDA1LTIwMjQpDQpyZXN0cmljdGVkX2RhdGEgPC0gbnJ0X2xvbmcgJT4lDQogIGZpbHRlcihhcy5pbnRlZ2VyKERhdGUpID49IDIwMDUgJiBhcy5pbnRlZ2VyKERhdGUpIDw9IDIwMjQpDQoNCiMgRGVmaW5lIHN0YXJ0IGFuZCBlbmQgeWVhcnMNCnN0YXJ0X3llYXIgPC0gMjAwNg0KZW5kX3llYXIgPC0gMjAyNA0KeWVhcl9yYW5nZSA8LSBlbmRfeWVhciAtIHN0YXJ0X3llYXIgKyAxICAjIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIHllYXJzDQoNCiMgRGVmaW5lIGJyZWFrcyByb3VuZGVkIGFwcHJvcHJpYXRlbHkNCmxpbWl0c19zdGFydF95ZWFyIDwtIGZsb29yKHN0YXJ0X3llYXIgLyA1KSAqIDUgICMgUm91bmQgZG93biB0byB0aGUgbmVhcmVzdCBtdWx0aXBsZSBvZiA1DQpsaW1pdHNfZW5kX3llYXIgPC0gY2VpbGluZyhlbmRfeWVhciAvIDUpICogNSAgICMgUm91bmQgdXAgdG8gdGhlIG5lYXJlc3QgbXVsdGlwbGUgb2YgNQ0KDQojIENyZWF0ZSBkeW5hbWljIHRpdGxlIGFuZCBjYXB0aW9uDQpkeW5hbWljX3RpdGxlIDwtIHBhc3RlMCgiUm9sbGluZyBDQUdScyBBY3Jvc3MgUGVyaW9kcyBPdmVyICIseWVhcl9yYW5nZSwgIiBZZWFycyAoIiwgc3RhcnRfeWVhciwgIi0iLCBlbmRfeWVhciwgIikiKQ0KZHluYW1pY19jYXB0aW9uIDwtIHBhc3RlMCgiVkdUIENvbXBvdW5kIEF2ZXJhZ2UgR3Jvd3RoIFJhdGVzIEFjcm9zcyBSb2xsaW5nIFBlcmlvZHMsIERhdGFzZXQgKCIsIG1pbl95ZWFyLCAiLSIsIG1heF95ZWFyLCAiKSIpDQoNCiMgQ2FsY3VsYXRlIGR5bmFtaWMgeS1heGlzIGxpbWl0cyBmb3IgdGhlIHJlc3RyaWN0ZWQgZGF0YQ0KeV9taW4gPC0gbWluKHJlc3RyaWN0ZWRfZGF0YSRDQUdSX1ZhbHVlLCBuYS5ybSA9IFRSVUUpDQp5X21heCA8LSBtYXgocmVzdHJpY3RlZF9kYXRhJENBR1JfVmFsdWUsIG5hLnJtID0gVFJVRSkNCg0KIyBDcmVhdGUgdGhlIGZpbHRlcmVkLCByZXN0cmljdGVkIHgtYXhpcyBwbG90IHdpdGggZHluYW1pYyB4IHBsYWNlbWVudCBmb3IgYW5ub3RhdGlvbnMNCnAzIDwtIGdncGxvdChucnRfbG9uZywgYWVzKHggPSBhcy5pbnRlZ2VyKERhdGUpLCB5ID0gQ0FHUl9WYWx1ZSwgY29sb3IgPSBDQUdSX1BlcmlvZCkpICsNCg0KICAjIEFkZCBzaGFkZWQgYXJlYXMgZm9yIGJhY2tncm91bmQgZWZmZWN0DQogIGdlb21fcmVjdChhZXMoeG1pbiA9IC1JbmYsIHhtYXggPSBJbmYsIHltaW4gPSB0YXJnZXRfYWdncmVzc2l2ZSwgeW1heCA9IEluZiksIGZpbGwgPSAibGlnaHRncmVlbiIsIGFscGhhID0gMC4wMTApICsNCiAgZ2VvbV9yZWN0KGFlcyh4bWluID0gLUluZiwgeG1heCA9IEluZiwgeW1pbiA9IHRhcmdldF9jb25zZXJ2YXRpdmUsIHltYXggPSB0YXJnZXRfYWdncmVzc2l2ZSksIGZpbGwgPSAib3JhbmdlIiwgYWxwaGEgPSAwLjAxKSArDQogIGdlb21fcmVjdChhZXMoeG1pbiA9IC1JbmYsIHhtYXggPSBJbmYsIHltaW4gPSAtSW5mLCB5bWF4ID0gdGFyZ2V0X2NvbnNlcnZhdGl2ZSksIGZpbGwgPSAibGlnaHRjb3JhbCIsIGFscGhhID0gMC4wMTApICsNCiAgDQogICMgUGxvdCBsaW5lcyBmb3IgZWFjaCBDQUdSIFBlcmlvZA0KICBnZW9tX2xpbmUoc2l6ZSA9IDEuMCwgYWxwaGEgPSAzLjApICsgICAgICAgIyBMaW5lIGZvciBlYWNoIENBR1INCiAgZ2VvbV9wb2ludChzaXplID0gMS4wLCBhbHBoYSA9IDMuMCkgKyAgICAgICAjIFBvaW50cyBmb3IgZWFjaCBDQUdSDQoNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gdGFyZ2V0X2FnZ3Jlc3NpdmUsIGNvbG9yID0gImRhcmtibHVlIiwgbGluZXR5cGUgPSAic29saWQiKSArDQogICMgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gdGFyZ2V0X21vZGVyYXRlLCBjb2xvciA9ICJkYXJrYmx1ZSIsIGxpbmV0eXBlID0gInNvbGlkIikgKw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSB0YXJnZXRfY29uc2VydmF0aXZlLCBjb2xvciA9ICJkYXJrYmx1ZSIsIGxpbmV0eXBlID0gInNvbGlkIikgKw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSB0YXJnZXRfaW5mbGF0aW9uLCBjb2xvciA9ICJkYXJrcmVkIiwgbGluZXR5cGUgPSAiZGFzaGVkIikgKw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSBjYWdyX3ZhbHVlLCBjb2xvciA9ICJkYXJrcmVkIiwgbGluZXR5cGUgPSAiZGFzaGVkIikgKw0KICANCiAgIyBEeW5hbWljIHJpZ2h0LWFsaWduZWQgcGxhY2VtZW50IGZvciBhbm5vdGF0aW9ucw0KICBhbm5vdGF0ZSgidGV4dCIsIHggPSBJbmYsIHkgPSB0YXJnZXRfYWdncmVzc2l2ZSwgbGFiZWwgPSAiQWdncmVzc2l2ZSIsIA0KICAgICAgICAgICBoanVzdCA9IDEsIHZqdXN0ID0gKzEuMTAsIGNvbG9yID0gImRhcmtibHVlIiwgc2l6ZSA9IDQpICsNCiAgIyBhbm5vdGF0ZSgidGV4dCIsIHggPSBJbmYsIHkgPSB0YXJnZXRfbW9kZXJhdGUsIGxhYmVsID0gIk1vZGVyYXRlIiwgDQogICMgICAgICAgICBoanVzdCA9IDEsIHZqdXN0ID0gLTAuNTAsIGNvbG9yID0gImRhcmtibHVlIiwgc2l6ZSA9IDQpICsNCiAgYW5ub3RhdGUoInRleHQiLCB4ID0gSW5mLCB5ID0gdGFyZ2V0X2NvbnNlcnZhdGl2ZSwgbGFiZWwgPSAiQ29uc2VydmF0aXZlIiwgDQogICAgICAgICAgIGhqdXN0ID0gMSwgdmp1c3QgPSAtMC41MCwgY29sb3IgPSAiZGFya2JsdWUiLCBzaXplID0gNCkgKw0KICBhbm5vdGF0ZSgidGV4dCIsIHggPSBJbmYsIHkgPSB0YXJnZXRfaW5mbGF0aW9uLCBsYWJlbCA9ICJJbmZsYXRpb24iLCANCiAgICAgICAgICAgaGp1c3QgPSAxLCB2anVzdCA9ICsxLjEwLCBjb2xvciA9ICJkYXJrcmVkIiwgc2l6ZSA9IDQpICsNCiAgYW5ub3RhdGUoInRleHQiLCB4ID0gSW5mLCB5ID0gY2Fncl92YWx1ZSwgbGFiZWwgPSAiQ0FHUiIsIA0KICAgICAgICAgICBoanVzdCA9IDEsIHZqdXN0ID0gLTAuNTAsIGNvbG9yID0gImRhcmtyZWQiLCBzaXplID0gNCkgKyANCg0KICBsYWJzKA0KICAgIHRpdGxlID0gZHluYW1pY190aXRsZSwNCiAgICB4ID0gIlllYXIiLA0KICAgIHkgPSAiQ0FHUiBWYWx1ZSAoJSkiLA0KICAgIGNvbG9yID0gIkNBR1IgUGVyaW9kIiwNCiAgICBjYXB0aW9uID0gZHluYW1pY19jYXB0aW9uDQogICAgKSArDQogIA0KICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gY3VzdG9tX2NvbG9ycykgKyAgIyBTZXQgY29sb3JzIGZvciBlYWNoIENBR1IgUGVyaW9kDQogIGNvb3JkX2NhcnRlc2lhbih5bGltID0gYyh5X21pbiwgeV9tYXgpKSArICMgQXBwbHkgZHluYW1pYyB5LWF4aXMgbGltaXRzDQogIHNjYWxlX3hfY29udGludW91cygNCiAgICBsaW1pdHMgPSBjKHN0YXJ0X3llYXIsIGVuZF95ZWFyICsgMiArIDEpLCANCiAgICBicmVha3MgPSBzZXEobGltaXRzX3N0YXJ0X3llYXIsIGxpbWl0c19lbmRfeWVhciwgNSkNCiAgKSArICAjIFJlc3RyaWN0ICYgU2V0IE1ham9yIHgtYXhpcyBsaW5lcyBmb3IgZWFjaCB5ZWFyDQoNCiAgdGhlbWVfbWluaW1hbCgpICsNCiAgdGhlbWUoDQogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSwgc2l6ZSA9IDIwKSwgICAgICAgICAjIExhcmdlciB0aXRsZSBmb250DQogICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCksICAgICAgICAgICAgICAgICAgICAjIExhcmdlciB4LWF4aXMgbGFiZWwgZm9udA0KICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQpLCAgICAgICAgICAgICAgICAgICAgIyBMYXJnZXIgeS1heGlzIGxhYmVsIGZvbnQNCiAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEsIHNpemUgPSAxNCksICAjIExhcmdlciB4LWF4aXMgdGV4dA0KICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCksICAgICAgICAgICAgICAgICAgICAgIyBMYXJnZXIgeS1heGlzIHRleHQNCiAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0KSwgICAgICAgICAgICAgICAgICAgICMgTGVnZW5kIHRpdGxlIHNpemUNCiAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIpLCAgICAgICAgICAgICAgICAgICAgICMgTGVnZW5kIHRleHQgc2l6ZQ0KICAgIHBhbmVsLmdyaWQubWFqb3IgPSBlbGVtZW50X2xpbmUobGluZXR5cGUgPSAiZG90dGVkIiwgY29sb3IgPSAiYmxhY2siKSwgICMgTWFqb3IgZ3JpZCBsaW5lcw0KICAgIHBhbmVsLmdyaWQubWlub3IueCA9IGVsZW1lbnRfYmxhbmsoKSwgICAgICAgICAgICAgICAgICAgICAgIyBObyBtaW5vciB4IGdyaWQgbGluZXMNCiAgICBheGlzLnRpY2tzLmxlbmd0aCA9IHVuaXQoLTAuMjUsICJjbSIpLCAgICAgICAgICAgICAgICAgICAgICAjIEluY3JlYXNlIHRpY2sgbGVuZ3RoDQogICAgYXhpcy50aWNrcyA9IGVsZW1lbnRfbGluZShjb2xvciA9ICJibGFjayIsIHNpemUgPSAwLjUwKSwgICAjIERhcmtlciB0aWNrcw0KICAgIGF4aXMubGluZS54ID0gZWxlbWVudF9saW5lKGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDAuNzUpLCAgIyBEYXJrIGJvdHRvbSBib3JkZXINCiAgICBheGlzLmxpbmUueSA9IGVsZW1lbnRfbGluZShjb2xvciA9ICJibGFjayIsIHNpemUgPSAwLjc1KSAgICMgRGFyayBsZWZ0IGJvcmRlcg0KICApDQoNCiMgUHJpbnQgdGhlIHBsb3QgDQpwcmludChwMykNCg0KYGBgDQoNCiMjIyMgU2hvcnQtVGVybQ0KDQpgYGB7ciB2Z3RfcmF3X2NhZ3JfZ3JhcGhzX3Nob3J0LCBmaWcud2lkdGg9MTAsIGZpZy5oZWlnaHQ9N30NCg0KY2F0KCJcblxuIyMjIyBDb21wb3VuZCBBdmVyYWdlIEdyb3d0aCBSYXRlcyBBY3Jvc3MgU2hvcnQtVGVybSBSb2xsaW5nIFBlcmlvZHMgXG4iKQ0KDQojIEZpbHRlciBkYXRhIGZvciBTaG9ydC1UZXJtIENBR1IgKDUtWWVhciBhbmQgMTAtWWVhcikNCnNob3J0dGVybV9kYXRhIDwtIG5ydF9sb25nICU+JQ0KICBmaWx0ZXIoQ0FHUl9QZXJpb2QgJWluJSBjKCI1LVllYXIgQ0FHUiIsICIxMC1ZZWFyIENBR1IiKSkNCg0KDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KIyMgUExPVCBGVUxMIFdJVEhPVVQgTElNSVRTDQoNCiMgRGVmaW5lIHN0YXJ0IGFuZCBlbmQgeWVhcnMNCnN0YXJ0X3llYXIgPC0gMjAxMA0KZW5kX3llYXIgPC0gMjAyNA0KeWVhcl9yYW5nZSA8LSBlbmRfeWVhciAtIHN0YXJ0X3llYXIgKyAxICAjIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIHllYXJzDQoNCiMgRGVmaW5lIGJyZWFrcyByb3VuZGVkIGFwcHJvcHJpYXRlbHkNCmxpbWl0c19zdGFydF95ZWFyIDwtIGZsb29yKHN0YXJ0X3llYXIgLyA1KSAqIDUgICMgUm91bmQgZG93biB0byB0aGUgbmVhcmVzdCBtdWx0aXBsZSBvZiA1DQpsaW1pdHNfZW5kX3llYXIgPC0gY2VpbGluZyhlbmRfeWVhciAvIDUpICogNSAgICMgUm91bmQgdXAgdG8gdGhlIG5lYXJlc3QgbXVsdGlwbGUgb2YgNQ0KDQojIENyZWF0ZSBkeW5hbWljIHRpdGxlIGFuZCBjYXB0aW9uDQpkeW5hbWljX3RpdGxlIDwtIHBhc3RlMCgiQ0FHUiBBY3Jvc3MgU2hvcnQtVGVybSBQZXJpb2RzIE92ZXIgIix5ZWFyX3JhbmdlLCAiIFllYXJzICgiLCBzdGFydF95ZWFyLCAiLSIsIGVuZF95ZWFyLCAiKSIpDQpkeW5hbWljX2NhcHRpb24gPC0gcGFzdGUwKCJWR1QgQ29tcG91bmQgQXZlcmFnZSBHcm93dGggUmF0ZXMgQWNyb3NzIFNob3J0LVRlcm0gUm9sbGluZyBQZXJpb2RzLCBEYXRhc2V0ICgiLCBtaW5feWVhciwgIi0iLCBtYXhfeWVhciwgIikiKQ0KDQojIENyZWF0ZSB0aGUgZnVsbCwgbm9uLWZpbHRlcmVkIHgtYXhpcyBwbG90IHdpdGggZHluYW1pYyB4IHBsYWNlbWVudCBmb3IgYW5ub3RhdGlvbnMNCnAxX3Nob3J0dGVybSA8LSBnZ3Bsb3Qoc2hvcnR0ZXJtX2RhdGEsIGFlcyh4ID0gYXMuaW50ZWdlcihEYXRlKSwgeSA9IENBR1JfVmFsdWUsIGNvbG9yID0gQ0FHUl9QZXJpb2QpKSArDQoNCiAgIyBBZGQgc2hhZGVkIGFyZWFzIGZvciBiYWNrZ3JvdW5kIGVmZmVjdA0KICBnZW9tX3JlY3QoYWVzKHhtaW4gPSAtSW5mLCB4bWF4ID0gSW5mLCB5bWluID0gdGFyZ2V0X2FnZ3Jlc3NpdmUsIHltYXggPSBJbmYpLCBmaWxsID0gImxpZ2h0Z3JlZW4iLCBhbHBoYSA9IDAuMDEwKSArDQogIGdlb21fcmVjdChhZXMoeG1pbiA9IC1JbmYsIHhtYXggPSBJbmYsIHltaW4gPSB0YXJnZXRfY29uc2VydmF0aXZlLCB5bWF4ID0gdGFyZ2V0X2FnZ3Jlc3NpdmUpLCBmaWxsID0gIm9yYW5nZSIsIGFscGhhID0gMC4wMSkgKw0KICBnZW9tX3JlY3QoYWVzKHhtaW4gPSAtSW5mLCB4bWF4ID0gSW5mLCB5bWluID0gLUluZiwgeW1heCA9IHRhcmdldF9jb25zZXJ2YXRpdmUpLCBmaWxsID0gImxpZ2h0Y29yYWwiLCBhbHBoYSA9IDAuMDEwKSArDQogIA0KICAjIFBsb3QgbGluZXMgZm9yIGVhY2ggQ0FHUiBQZXJpb2QNCiAgZ2VvbV9saW5lKHNpemUgPSAxLjAsIGFscGhhID0gMy4wKSArICAgICAgICMgTGluZSBmb3IgZWFjaCBDQUdSDQogIGdlb21fcG9pbnQoc2l6ZSA9IDEuMCwgYWxwaGEgPSAzLjApICsgICAgICAgIyBQb2ludHMgZm9yIGVhY2ggQ0FHUg0KDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IHRhcmdldF9hZ2dyZXNzaXZlLCBjb2xvciA9ICJkYXJrYmx1ZSIsIGxpbmV0eXBlID0gInNvbGlkIikgKw0KICAjIGdlb21faGxpbmUoeWludGVyY2VwdCA9IHRhcmdldF9tb2RlcmF0ZSwgY29sb3IgPSAiZGFya2JsdWUiLCBsaW5ldHlwZSA9ICJzb2xpZCIpICsNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gdGFyZ2V0X2NvbnNlcnZhdGl2ZSwgY29sb3IgPSAiZGFya2JsdWUiLCBsaW5ldHlwZSA9ICJzb2xpZCIpICsNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gdGFyZ2V0X2luZmxhdGlvbiwgY29sb3IgPSAiZGFya3JlZCIsIGxpbmV0eXBlID0gImRhc2hlZCIpICsNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gY2Fncl92YWx1ZSwgY29sb3IgPSAiZGFya3JlZCIsIGxpbmV0eXBlID0gImRhc2hlZCIpICsNCiAgDQogICMgRHluYW1pYyByaWdodC1hbGlnbmVkIHBsYWNlbWVudCBmb3IgYW5ub3RhdGlvbnMNCiAgYW5ub3RhdGUoInRleHQiLCB4ID0gSW5mLCB5ID0gdGFyZ2V0X2FnZ3Jlc3NpdmUsIGxhYmVsID0gIkFnZ3Jlc3NpdmUiLCANCiAgICAgICAgICAgaGp1c3QgPSAxLCB2anVzdCA9ICsxLjEwLCBjb2xvciA9ICJkYXJrYmx1ZSIsIHNpemUgPSA0KSArDQogICMgYW5ub3RhdGUoInRleHQiLCB4ID0gSW5mLCB5ID0gdGFyZ2V0X21vZGVyYXRlLCBsYWJlbCA9ICJNb2RlcmF0ZSIsIA0KICAjICAgICAgICAgaGp1c3QgPSAxLCB2anVzdCA9IC0wLjUwLCBjb2xvciA9ICJkYXJrYmx1ZSIsIHNpemUgPSA0KSArDQogIGFubm90YXRlKCJ0ZXh0IiwgeCA9IEluZiwgeSA9IHRhcmdldF9jb25zZXJ2YXRpdmUsIGxhYmVsID0gIkNvbnNlcnZhdGl2ZSIsIA0KICAgICAgICAgICBoanVzdCA9IDEsIHZqdXN0ID0gLTAuNTAsIGNvbG9yID0gImRhcmtibHVlIiwgc2l6ZSA9IDQpICsNCiAgYW5ub3RhdGUoInRleHQiLCB4ID0gSW5mLCB5ID0gdGFyZ2V0X2luZmxhdGlvbiwgbGFiZWwgPSAiSW5mbGF0aW9uIiwgDQogICAgICAgICAgIGhqdXN0ID0gMSwgdmp1c3QgPSAtMC41MCwgY29sb3IgPSAiZGFya3JlZCIsIHNpemUgPSA0KSArDQogIGFubm90YXRlKCJ0ZXh0IiwgeCA9IEluZiwgeSA9IGNhZ3JfdmFsdWUsIGxhYmVsID0gIkNBR1IiLCANCiAgICAgICAgICAgaGp1c3QgPSAxLCB2anVzdCA9IC0wLjUwLCBjb2xvciA9ICJkYXJrcmVkIiwgc2l6ZSA9IDQpICsgDQoNCiAgbGFicygNCiAgICB0aXRsZSA9IGR5bmFtaWNfdGl0bGUsDQogICAgeCA9ICJZZWFyIiwNCiAgICB5ID0gIkNBR1IgVmFsdWUgKCUpIiwNCiAgICBjb2xvciA9ICJDQUdSIFBlcmlvZCIsDQogICAgY2FwdGlvbiA9IGR5bmFtaWNfY2FwdGlvbg0KICAgICkgKw0KICANCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGN1c3RvbV9jb2xvcnNbYygiNS1ZZWFyIENBR1IiLCAiMTAtWWVhciBDQUdSIildKSArDQogIHNjYWxlX3hfY29udGludW91cygNCiAgICBsaW1pdHMgPSBjKHN0YXJ0X3llYXIsIGVuZF95ZWFyICsgMSksIA0KICAgIGJyZWFrcyA9IHNlcShsaW1pdHNfc3RhcnRfeWVhciwgbGltaXRzX2VuZF95ZWFyICsgMSAsIDUpDQogICkgKyAgIyBSZXN0cmljdCAmIFNldCBNYWpvciB4LWF4aXMgbGluZXMgZm9yIGVhY2ggeWVhcg0KDQogIHRoZW1lX21pbmltYWwoKSArDQogIHRoZW1lKA0KICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUsIHNpemUgPSAyMCksICAgICAgICAgIyBMYXJnZXIgdGl0bGUgZm9udA0KICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQpLCAgICAgICAgICAgICAgICAgICAgIyBMYXJnZXIgeC1heGlzIGxhYmVsIGZvbnQNCiAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0KSwgICAgICAgICAgICAgICAgICAgICMgTGFyZ2VyIHktYXhpcyBsYWJlbCBmb250DQogICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxLCBzaXplID0gMTQpLCAgIyBMYXJnZXIgeC1heGlzIHRleHQNCiAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQpLCAgICAgICAgICAgICAgICAgICAgICMgTGFyZ2VyIHktYXhpcyB0ZXh0DQogICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCksICAgICAgICAgICAgICAgICAgICAjIExlZ2VuZCB0aXRsZSBzaXplDQogICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyKSwgICAgICAgICAgICAgICAgICAgICAjIExlZ2VuZCB0ZXh0IHNpemUNCiAgICBwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9saW5lKGxpbmV0eXBlID0gImRvdHRlZCIsIGNvbG9yID0gImJsYWNrIiksICAjIE1ham9yIGdyaWQgbGluZXMNCiAgICBwYW5lbC5ncmlkLm1pbm9yLnggPSBlbGVtZW50X2JsYW5rKCksICAgICAgICAgICAgICAgICAgICAgICMgTm8gbWlub3IgeCBncmlkIGxpbmVzDQogICAgYXhpcy50aWNrcy5sZW5ndGggPSB1bml0KC0wLjI1LCAiY20iKSwgICAgICAgICAgICAgICAgICAgICAgIyBJbmNyZWFzZSB0aWNrIGxlbmd0aA0KICAgIGF4aXMudGlja3MgPSBlbGVtZW50X2xpbmUoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMC41MCksICAgIyBEYXJrZXIgdGlja3MNCiAgICBheGlzLmxpbmUueCA9IGVsZW1lbnRfbGluZShjb2xvciA9ICJibGFjayIsIHNpemUgPSAwLjc1KSwgICMgRGFyayBib3R0b20gYm9yZGVyDQogICAgYXhpcy5saW5lLnkgPSBlbGVtZW50X2xpbmUoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMC43NSkgICAjIERhcmsgbGVmdCBib3JkZXINCiAgKQ0KDQojIFByaW50IHRoZSBwbG90IA0KcHJpbnQocDFfc2hvcnR0ZXJtKQ0KDQpgYGANCg0KIyBTUFgtUVFRLUJMQUNLUk9DSw0KDQojIyBBbm51YWwgR1INCg0KIyMjIERhdGENCg0KYGBge3IgaW5kZXhfY29tcGFyaXNvbl9nciwgZXZhbD1UUlVFLCBlY2hvPUZBTFNFfQ0KDQppbnRlcmFjdGl2ZV9zdHIoc3B4X3JhdykNCmludGVyYWN0aXZlX3N0cihxcXFfcmF3KQ0KaW50ZXJhY3RpdmVfc3RyKGJsYWNrcm9ja19yYXcpDQoNCmludGVyYWN0aXZlX3ByaW50KHNweF9yYXcpDQppbnRlcmFjdGl2ZV9wcmludChxcXFfcmF3KQ0KaW50ZXJhY3RpdmVfcHJpbnQoYmxhY2tyb2NrX3JhdykNCg0KbWluX3llYXIgPC0gbWluKHNweF9yYXckRGF0ZSkNCm1heF95ZWFyIDwtIG1heChzcHhfcmF3JERhdGUpDQppbnRlcmFjdGl2ZV9wcmludChtaW5feWVhcikNCmludGVyYWN0aXZlX3ByaW50KG1heF95ZWFyKQ0KDQptaW5feWVhciA8LSBtaW4ocXFxX3JhdyREYXRlKQ0KbWF4X3llYXIgPC0gbWF4KHFxcV9yYXckRGF0ZSkNCmludGVyYWN0aXZlX3ByaW50KG1pbl95ZWFyKQ0KaW50ZXJhY3RpdmVfcHJpbnQobWF4X3llYXIpDQoNCm1pbl95ZWFyIDwtIG1pbihibGFja3JvY2tfcmF3JERhdGUpDQptYXhfeWVhciA8LSBtYXgoYmxhY2tyb2NrX3JhdyREYXRlKQ0KaW50ZXJhY3RpdmVfcHJpbnQobWluX3llYXIpDQppbnRlcmFjdGl2ZV9wcmludChtYXhfeWVhcikNCg0KIyBGaWx0ZXIgZGF0YSBmb3IgdGhlIG1hdGNoaW5nIGRhdGUgcmFuZ2UNCm1hdGNoaW5nX2RhdGVzIDwtIFJlZHVjZShpbnRlcnNlY3QsIGxpc3Qoc3B4X3JhdyREYXRlLCBxcXFfcmF3JERhdGUsIGJsYWNrcm9ja19yYXckRGF0ZSkpDQojIEdldCB0aGUgb2xkZXN0IG1hdGNoaW5nIGRhdGUNCmlmIChsZW5ndGgobWF0Y2hpbmdfZGF0ZXMpID4gMCkgew0KICBvbGRlc3RfbWF0Y2hpbmdfZGF0ZSA8LSBtaW4obWF0Y2hpbmdfZGF0ZXMpDQogIGludGVyYWN0aXZlX2NhdCgiT2xkZXN0IG1hdGNoaW5nIGRhdGU6Iiwgb2xkZXN0X21hdGNoaW5nX2RhdGUsICJcbiIpDQp9IGVsc2Ugew0KICBpbnRlcmFjdGl2ZV9jYXQoIk5vIG1hdGNoaW5nIGRhdGVzIGZvdW5kIGFtb25nIHRoZSB0aHJlZSBkYXRhc2V0cy5cbiIpDQp9DQoNCnN0YXJ0X3llYXIgPC0gb2xkZXN0X21hdGNoaW5nX2RhdGUgKyAxDQojIGVuZF95ZWFyIDwtIDIwMjQNCmVuZF95ZWFyIDwtIGFzLm51bWVyaWMoZm9ybWF0KFN5cy5EYXRlKCksICIlWSIpKQ0KDQpzcHhfZmlsdGVyZWQgPC0gc3Vic2V0KHNweF9yYXcsIERhdGUgPj0gc3RhcnRfeWVhciAmIERhdGUgPD0gZW5kX3llYXIsIHNlbGVjdCA9IGMoRGF0ZSwgYDEtWWVhciBDQUdSYCkpDQpxcXFfZmlsdGVyZWQgPC0gc3Vic2V0KHFxcV9yYXcsIERhdGUgPj0gc3RhcnRfeWVhciAmIERhdGUgPD0gZW5kX3llYXIsIHNlbGVjdCA9IGMoRGF0ZSwgYDEtWWVhciBDQUdSYCkpDQpibGFja3JvY2tfZmlsdGVyZWQgPC0gc3Vic2V0KGJsYWNrcm9ja19yYXcsIERhdGUgPj0gc3RhcnRfeWVhciAmIERhdGUgPD0gZW5kX3llYXIsIHNlbGVjdCA9IGMoRGF0ZSwgYDEtWWVhciBDQUdSYCkpDQoNCiMgUmVuYW1lIGNvbHVtbnMgZm9yIGNsYXJpdHkNCmNvbG5hbWVzKHNweF9maWx0ZXJlZClbY29sbmFtZXMoc3B4X2ZpbHRlcmVkKSA9PSAiMS1ZZWFyIENBR1IiXSA8LSAiU1BYIg0KY29sbmFtZXMocXFxX2ZpbHRlcmVkKVtjb2xuYW1lcyhxcXFfZmlsdGVyZWQpID09ICIxLVllYXIgQ0FHUiJdIDwtICJRUVEiDQpjb2xuYW1lcyhibGFja3JvY2tfZmlsdGVyZWQpW2NvbG5hbWVzKGJsYWNrcm9ja19maWx0ZXJlZCkgPT0gIjEtWWVhciBDQUdSIl0gPC0gIkJsYWNrUm9jayINCg0KIyBNZXJnZSBkYXRhc2V0cyBieSBEYXRlIChZZWFyKQ0KbWVyZ2VkX2RhdGEgPC0gbWVyZ2Uoc3B4X2ZpbHRlcmVkLCBxcXFfZmlsdGVyZWQsIGJ5ID0gIkRhdGUiKQ0KbWVyZ2VkX2RhdGEgPC0gbWVyZ2UobWVyZ2VkX2RhdGEsIGJsYWNrcm9ja19maWx0ZXJlZCwgYnkgPSAiRGF0ZSIpDQoNCiMgU29ydCBieSBEYXRlIGluIGRlc2NlbmRpbmcgb3JkZXIgKG1vc3QgcmVjZW50IHllYXIgZmlyc3QpDQptZXJnZWRfZGF0YSA8LSBtZXJnZWRfZGF0YVtvcmRlcigtbWVyZ2VkX2RhdGEkRGF0ZSksIF0NCg0KIyBGb3JtYXQgdGhlIG1lcmdlZCBkYXRhDQptZXJnZWRfZGF0YSREYXRlIDwtIGFzLmNoYXJhY3RlcihtZXJnZWRfZGF0YSREYXRlKSAgIyBFbnN1cmUgRGF0ZSBpcyBhIGNoYXJhY3RlciB3aXRob3V0IGNvbW1hcw0KbWVyZ2VkX2RhdGEkYFNQWGAgPC0gcGFzdGUwKGZvcm1hdEMobWVyZ2VkX2RhdGEkYFNQWGAsIGZvcm1hdCA9ICJmIiwgZGlnaXRzID0gMiksICIlIikNCm1lcmdlZF9kYXRhJFFRUSA8LSBwYXN0ZTAoZm9ybWF0QyhtZXJnZWRfZGF0YSRRUVEsIGZvcm1hdCA9ICJmIiwgZGlnaXRzID0gMiksICIlIikNCm1lcmdlZF9kYXRhJGBCbGFja1JvY2tgIDwtIHBhc3RlMChmb3JtYXRDKG1lcmdlZF9kYXRhJGBCbGFja1JvY2tgLCBmb3JtYXQgPSAiZiIsIGRpZ2l0cyA9IDIpLCAiJSIpDQoNCiMgRGlzcGxheSBmb3JtYXR0ZWQgdGFibGUNCmNhdCgiXG5cbiMjIyMgQW5udWFsIEdyb3d0aCBSYXRlcyBCeSBJbmRleCAoIiwgc3RhcnRfeWVhciwgIi0iLCBlbmRfeWVhciwgIilcbiIsIHNlcCA9ICIiKQ0KaW50ZXJhY3RpdmVfcHJpbnQobWVyZ2VkX2RhdGEpDQppbnRlcmFjdGl2ZV9zdHIobWVyZ2VkX2RhdGEpDQpmb3JtYXRfZXF1YWxfd2lkdGgobWVyZ2VkX2RhdGEpDQoNCg0KYGBgDQoNCkRhdGEgYmVnaW5zIHdpdGggYHIgc3RhcnRfeWVhcmAsIGRldGVybWluZWQgYnkgdGhlIGluZGV4IHdpdGggdGhlIGxlYXN0IGhpc3RvcmljYWwgZGF0YSBmb3IgY29uc2lzdGVudCBjb21wYXJpc29uIGFjcm9zcyBhbGwgaW5kZXhlcy4NCg0KIyMjIFN1bW1hcnkNCg0KYGBge3IgaW5kZXhfY29tcGFyaXNvbl9ncl9zdW1tYXJ5LCBldmFsPVRSVUUsIGVjaG89RkFMU0V9DQoNCiMgTG9hZCBuZWNlc3NhcnkgbGlicmFyeQ0KbGlicmFyeShkcGx5cikNCg0KIyBSZW1vdmUgcGVyY2VudGFnZSBzaWducyBhbmQgY29udmVydCBjb2x1bW5zIHRvIG51bWVyaWMNCm1lcmdlZF9kYXRhX2NsZWFuIDwtIG1lcmdlZF9kYXRhDQptZXJnZWRfZGF0YV9jbGVhblsyOjRdIDwtIGxhcHBseShtZXJnZWRfZGF0YVsyOjRdLCBmdW5jdGlvbih4KSBhcy5udW1lcmljKGdzdWIoIiUiLCAiIiwgeCkpKQ0KDQojIEZpbmQgdGhlIG1pbmltdW0gYW5kIG1heGltdW0geWVhcg0KbWluX3llYXIgPC0gbWluKG1lcmdlZF9kYXRhJERhdGUsIG5hLnJtID0gVFJVRSkNCm1heF95ZWFyIDwtIG1heChtZXJnZWRfZGF0YSREYXRlLCBuYS5ybSA9IFRSVUUpDQppbnRlcmFjdGl2ZV9wcmludChtaW5feWVhcikNCmludGVyYWN0aXZlX3ByaW50KG1heF95ZWFyKQ0KDQojIERlZmluZSB0aGUgbWV0cmljcyB0byBjYWxjdWxhdGUsIGluY2x1ZGluZyBDQUdSDQptZXRyaWNzIDwtIGMoDQogICJDQUdSIiwgDQogICJNZWFuIiwgDQogICJNZWRpYW4iLCANCiAgIlN0YW5kYXJkIERldmlhdGlvbiAoVm9sYXRpbGl0eSkiLCANCiAgIk1pbiBDQUdSIFJhbmdlIChDQUdSIC0gU0QpIiwgDQogICJNYXggQ0FHUiBSYW5nZSAoQ0FHUiArIFNEKSIsIA0KICAiTWluIiwgDQogICJNYXgiLCANCiAgIlBlcmNlbnQgQWJvdmUgSW5mbGF0aW9uIFRhcmdldCIsIA0KICAiUGVyY2VudCBBYm92ZSBDb25zZXJ2YXRpdmUgVGFyZ2V0IiwgDQogICJQZXJjZW50IEFib3ZlIE1vZGVyYXRlIFRhcmdldCIsIA0KICAiUGVyY2VudCBBYm92ZSBBZ2dyZXNzaXZlIFRhcmdldCINCikNCg0KIyBEZWZpbmUgdGhlIENBR1IgY2FsY3VsYXRpb24NCmNhbGN1bGF0ZV9jYWdyIDwtIGZ1bmN0aW9uKGNvbCkgew0KICBzdGFydF92YWwgPC0gMSAgIyBGaXJzdCB5ZWFyIHZhbHVlDQogIGVuZF92YWwgPC0gcHJvZCgxICsgY29sIC8gMTAwLCBuYS5ybSA9IFRSVUUpICAjIFByb2R1Y3Qgb2YgZ3Jvd3RoIGZhY3RvcnMNCiAgeWVhcnMgPC0gbnJvdyhtZXJnZWRfZGF0YV9jbGVhbikNCiAgKChlbmRfdmFsIC8gc3RhcnRfdmFsKV4oMSAvIHllYXJzKSAtIDEpICogMTAwICAjIENBR1IgZm9ybXVsYQ0KfQ0KDQojIENhbGN1bGF0ZSBtZXRyaWNzIGR5bmFtaWNhbGx5IGZvciBhbGwgbnVtZXJpYyBjb2x1bW5zDQpjYWxjdWxhdGVkX21ldHJpY3MgPC0gc2FwcGx5KG1lcmdlZF9kYXRhX2NsZWFuWzI6NF0sIGZ1bmN0aW9uKGNvbCkgew0KICBtZWFuX3ZhbCA8LSBtZWFuKGNvbCwgbmEucm0gPSBUUlVFKQ0KICBzZF92YWwgPC0gc2QoY29sLCBuYS5ybSA9IFRSVUUpDQogIHBlcmNlbnRfYWJvdmUgPC0gZnVuY3Rpb24odGFyZ2V0KSBtZWFuKGNvbCA+IHRhcmdldCwgbmEucm0gPSBUUlVFKSAqIDEwMA0KICANCiAgYygNCiAgICBgQ0FHUmAgPSBjYWxjdWxhdGVfY2Fncihjb2wpLA0KICAgIE1lYW4gPSBtZWFuX3ZhbCwNCiAgICBNZWRpYW4gPSBtZWRpYW4oY29sLCBuYS5ybSA9IFRSVUUpLA0KICAgIGBTdGFuZGFyZCBEZXZpYXRpb24gKFZvbGF0aWxpdHkpYCA9IHNkX3ZhbCwNCiAgICBgTWluIENBR1IgUmFuZ2UgKENBR1IgLSBTRClgID0gbWVhbl92YWwgLSBzZF92YWwsDQogICAgYE1heCBDQUdSIFJhbmdlIChDQUdSICsgU0QpYCA9IG1lYW5fdmFsICsgc2RfdmFsLA0KICAgIE1pbiA9IG1pbihjb2wsIG5hLnJtID0gVFJVRSksDQogICAgTWF4ID0gbWF4KGNvbCwgbmEucm0gPSBUUlVFKSwNCiAgICBgUGVyY2VudCBBYm92ZSBJbmZsYXRpb24gVGFyZ2V0YCA9IHBlcmNlbnRfYWJvdmUodGFyZ2V0X2luZmxhdGlvbiksICAjIEV4YW1wbGUgaW5mbGF0aW9uIHRhcmdldDogMiUNCiAgICBgUGVyY2VudCBBYm92ZSBDb25zZXJ2YXRpdmUgVGFyZ2V0YCA9IHBlcmNlbnRfYWJvdmUodGFyZ2V0X2NvbnNlcnZhdGl2ZSksDQogICAgYFBlcmNlbnQgQWJvdmUgTW9kZXJhdGUgVGFyZ2V0YCA9IHBlcmNlbnRfYWJvdmUodGFyZ2V0X21vZGVyYXRlKSwNCiAgICBgUGVyY2VudCBBYm92ZSBBZ2dyZXNzaXZlIFRhcmdldGAgPSBwZXJjZW50X2Fib3ZlKHRhcmdldF9hZ2dyZXNzaXZlKQ0KICApDQp9KQ0KDQojIFRyYW5zcG9zZSB0aGUgcmVzdWx0IGFuZCBhZGQgdGhlIE1ldHJpYyBjb2x1bW4NCmN1c3RvbV9zdW1tYXJ5IDwtIGRhdGEuZnJhbWUoDQogIE1ldHJpYyA9IG1ldHJpY3MsDQogIGNhbGN1bGF0ZWRfbWV0cmljcw0KKQ0KDQojIFJlbmFtZSBjb2x1bW5zIHRvIHJldGFpbiB0aGUgb3JpZ2luYWwgY29sdW1uIG5hbWVzIGR5bmFtaWNhbGx5DQpjb2xuYW1lcyhjdXN0b21fc3VtbWFyeSlbLTFdIDwtIGNvbG5hbWVzKG1lcmdlZF9kYXRhKVsyOjRdDQoNCiMgQWRkIHBlcmNlbnRhZ2Ugc2lnbnMgYmFjayB0byBhbGwgbnVtZXJpYyB2YWx1ZXMNCmN1c3RvbV9zdW1tYXJ5Wy0xXSA8LSBsYXBwbHkoY3VzdG9tX3N1bW1hcnlbLTFdLCBmdW5jdGlvbih4KSBwYXN0ZTAoZm9ybWF0Qyh4LCBmb3JtYXQgPSAiZiIsIGRpZ2l0cyA9IDIpLCAiJSIpKQ0KDQojIFJlbW92ZSByb3cgbmFtZXMNCnJvd25hbWVzKGN1c3RvbV9zdW1tYXJ5KSA8LSBOVUxMDQoNCiMgUHJpbnQgdGhlIGZpbmFsIHN1bW1hcnkNCiMgRGlzcGxheSBmb3JtYXR0ZWQgdGFibGUNCmNhdCgiXG5cbiMjIyMgQW5udWFsIEdyb3d0aCBSYXRlcyBTdW1tYXJ5IEJ5IEluZGV4ICgiLCBzdGFydF95ZWFyLCAiLSIsIGVuZF95ZWFyLCAiKVxuIiwgc2VwID0gIiIpDQppbnRlcmFjdGl2ZV9wcmludChjdXN0b21fc3VtbWFyeSkNCmZvcm1hdF80Y29sX2N1c3RvbV93aWR0aHMoY3VzdG9tX3N1bW1hcnksIGNvbDFfd2lkdGggPSAiMjBlbSIsIGNvbDJfd2lkdGggPSAiMTVlbSIsIGNvbDNfd2lkdGggPSAiMTVlbSIsIGNvbDRfd2lkdGggPSAiMTVlbSIpDQoNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQojIyBTQVZFIFZBTFVFUyBGT1IgSU4tTElORSBDT0RFDQoNCg0KIyBEZWZpbmUgdGhlIG1hcHBpbmcgb2Ygcm93IG5hbWVzIHRvIHZhcmlhYmxlIG5hbWVzDQpyb3dfdG9fdmFyX25hbWUgPC0gYygNCiAgIkNBR1IiID0gImNhZ3JfdmFsdWUiLA0KICAiTWVhbiIgPSAibWVhbl92YWx1ZSIsDQogICJNZWRpYW4iID0gIm1lZGlhbl92YWx1ZSIsDQogICJTdGFuZGFyZCBEZXZpYXRpb24gKFZvbGF0aWxpdHkpIiA9ICJzZF92YWx1ZSIsDQogICJNaW4gQ0FHUiBSYW5nZSAoQ0FHUiAtIFNEKSIgPSAibWluX2NhZ3JfcmFuZ2UiLA0KICAiTWF4IENBR1IgUmFuZ2UgKENBR1IgKyBTRCkiID0gIm1heF9jYWdyX3JhbmdlIiwNCiAgIk1pbiIgPSAibWluX3ZhbHVlIiwNCiAgIk1heCIgPSAibWF4X3ZhbHVlIiwNCiAgIlBlcmNlbnQgQWJvdmUgSW5mbGF0aW9uIFRhcmdldCIgPSAicGVyY2VudF9hYm92ZV90YXJnZXRfaW5mbGF0aW9uIiwNCiAgIlBlcmNlbnQgQWJvdmUgQ29uc2VydmF0aXZlIFRhcmdldCIgPSAicGVyY2VudF9hYm92ZV90YXJnZXRfY29uc2VydmF0aXZlIiwNCiAgIlBlcmNlbnQgQWJvdmUgTW9kZXJhdGUgVGFyZ2V0IiA9ICJwZXJjZW50X2Fib3ZlX3RhcmdldF9tb2RlcmF0ZSIsDQogICJQZXJjZW50IEFib3ZlIEFnZ3Jlc3NpdmUgVGFyZ2V0IiA9ICJwZXJjZW50X2Fib3ZlX3RhcmdldF9hZ2dyZXNzaXZlIg0KKQ0KDQojIERlZmluZSBhIGN1c3RvbSBtYXBwaW5nIGZvciBjb2x1bW4gbmFtZXMNCmNvbHVtbl9uYW1lX21hcHBpbmcgPC0gYygNCiAgIlNQWCIgPSAic3B4IiwNCiAgIlFRUSIgPSAicXFxIiwNCiAgIkJsYWNrUm9jayIgPSAiYmxhY2tyb2NrIg0KKQ0KDQojIEZ1bmN0aW9uIHRvIHNhdmUgc3VtbWFyeSB2YWx1ZXMgZHluYW1pY2FsbHkgd2l0aCBjb2x1bW4gbmFtZSBtYXBwaW5nDQpzYXZlX2NvbHVtbl92YWx1ZXMgPC0gZnVuY3Rpb24oc3VtbWFyeV9kZiwgcm93X21hcHBpbmcsIGNvbHVtbl9tYXBwaW5nKSB7DQogICMgR2V0IHRoZSBjb2x1bW4gbmFtZXMgaW4gdGhlIGRhdGEgZnJhbWUNCiAgY29sdW1uc190b19zYXZlIDwtIHNldGRpZmYobmFtZXMoc3VtbWFyeV9kZiksIGMoIk1ldHJpYyIpKSAgIyBFeGNsdWRlIHRoZSBNZXRyaWMgY29sdW1uDQogIA0KICAjIEl0ZXJhdGUgb3ZlciBlYWNoIGNvbHVtbg0KICBmb3IgKGNvbCBpbiBjb2x1bW5zX3RvX3NhdmUpIHsNCiAgICAjIFVzZSB0aGUgY3VzdG9tIG1hcHBpbmcgdG8gZ2V0IHRoZSBhcHByb3ByaWF0ZSBjb2x1bW4gbmFtZQ0KICAgIGNvbF9uYW1lIDwtIGNvbHVtbl9tYXBwaW5nW1tjb2xdXSAlfHwlIHRvbG93ZXIoZ3N1YigiW15hLXpBLVowLTldIiwgIl8iLCBjb2wpKQ0KICAgIA0KICAgICMgRXh0cmFjdCB2YWx1ZXMgZm9yIHRoZSBjdXJyZW50IGNvbHVtbg0KICAgIGNvbF92YWx1ZXMgPC0gc3VtbWFyeV9kZltbY29sXV0NCiAgICANCiAgICAjIEl0ZXJhdGUgb3ZlciByb3dzIHRvIHNhdmUgZWFjaCB2YWx1ZSBkeW5hbWljYWxseQ0KICAgIGZvciAoaSBpbiBzZXFfYWxvbmcoY29sX3ZhbHVlcykpIHsNCiAgICAgICMgR2V0IHRoZSBjb3JyZXNwb25kaW5nIHZhcmlhYmxlIG5hbWUgZnJvbSB0aGUgbWFwcGluZw0KICAgICAgc3RhdF9uYW1lIDwtIHJvd19tYXBwaW5nW3N1bW1hcnlfZGYkTWV0cmljW2ldXQ0KICAgICAgDQogICAgICBpZiAoIWlzLm5hKHN0YXRfbmFtZSkpIHsgICMgU2tpcCBpZiBubyBtYXBwaW5nIGlzIGRlZmluZWQNCiAgICAgICAgIyBDcmVhdGUgdGhlIHZhcmlhYmxlIG5hbWUNCiAgICAgICAgdmFyX25hbWUgPC0gcGFzdGUwKHN0YXRfbmFtZSwgIl8iLCBjb2xfbmFtZSkNCiAgICAgICAgDQogICAgICAgICMgQXR0ZW1wdCBudW1lcmljIGNvbnZlcnNpb24gZm9yIGRvd25zdHJlYW0gdXNlDQogICAgICAgIHZhbHVlIDwtIHN1cHByZXNzV2FybmluZ3MoYXMubnVtZXJpYyhnc3ViKCIlIiwgIiIsIGNvbF92YWx1ZXNbaV0pKSkNCiAgICAgICAgDQogICAgICAgICMgQXNzaWduIHRoZSB2YWx1ZSB0byB0aGUgZ2xvYmFsIGVudmlyb25tZW50DQogICAgICAgIGFzc2lnbih2YXJfbmFtZSwgdmFsdWUsIGVudmlyID0gLkdsb2JhbEVudikNCiAgICAgIH0NCiAgICB9DQogIH0NCn0NCg0KIyBBcHBseSB0aGUgZnVuY3Rpb24gdG8gc2F2ZSB2YWx1ZXMgZHluYW1pY2FsbHkNCnNhdmVfY29sdW1uX3ZhbHVlcyhjdXN0b21fc3VtbWFyeSwgcm93X3RvX3Zhcl9uYW1lLCBjb2x1bW5fbmFtZV9tYXBwaW5nKQ0KDQojIEV4YW1wbGU6IEFjY2Vzc2luZyBkeW5hbWljYWxseSBjcmVhdGVkIHZhcmlhYmxlcw0KaW50ZXJhY3RpdmVfcHJpbnQobWVhbl92YWx1ZV9zcHgpICAjIFNob3VsZCBwcmludCB0aGUgbWVhbiB2YWx1ZSBmb3IgU1BYDQppbnRlcmFjdGl2ZV9wcmludChzZF92YWx1ZV9ibGFja3JvY2spICAjIFNob3VsZCBwcmludCB0aGUgc3RhbmRhcmQgZGV2aWF0aW9uIGZvciBCbGFja1JvY2sNCmludGVyYWN0aXZlX3ByaW50KHBlcmNlbnRfYWJvdmVfdGFyZ2V0X2FnZ3Jlc3NpdmVfcXFxKSAgIyBTaG91bGQgcHJpbnQgdGhlIHBlcmNlbnQgYWJvdmUgYWdncmVzc2l2ZSB0YXJnZXQgZm9yIFFRUQ0KaW50ZXJhY3RpdmVfcHJpbnQoZW5kX3llYXIgLSBzdGFydF95ZWFyKQ0KDQpgYGANCg0KKipDb21wYXJpc29uIGluIEFubnVhbCBHcm93dGggUmF0ZXMgT3ZlciBgciBlbmRfeWVhciAtIHN0YXJ0X3llYXIgKyAxYCBZZWFycyAoYHIgc3RhcnRfeWVhcmAtYHIgZW5kX3llYXJgKSoqOiBUaGUgc3VtbWFyeSByZWZsZWN0cyBkYXRhIG92ZXIgYSBgciBpZigoZW5kX3llYXIgLSBzdGFydF95ZWFyKSA8IDUpICJTaG9ydC1UZXJtIFBlcmlvZCAodW5kZXIgNSB5ZWFycykiIGVsc2UgaWYoKGVuZF95ZWFyIC0gc3RhcnRfeWVhcikgPj0gNSAmJiAgKGVuZF95ZWFyIC0gc3RhcnRfeWVhcikgPD0gMTApICJJbnRlcm1lZGlhdGUtVGVybSBQZXJpb2QgKDUtMTAgeWVhcnMpIiBlbHNlICJMb25nLVRlcm0gUGVyaW9kIChvdmVyIDEwIHllYXJzKSJgLiBUaGUgcGVyZm9ybWFuY2UgYW5kIHJlbGF0aXZlIHN0cmVuZ3RoIGJldHdlZW4gaW5kZXhlcyBhcmUgbGlrZWx5IHRvIHNoaWZ0IHdoZW4gbWVhc3VyZWQgYWNyb3NzIGRpZmZlcmVudCB0aW1lIGZyYW1lcywgcGFydGljdWxhcmx5IGluIHJlc3BvbnNlIHRvIG1ham9yIGhpc3RvcmljYWwgZXZlbnRzLCBhbmQgcGFydGljdWxhcmx5IGZvciBTaG9ydC1UZXJtIGFuZCBMb25nLVRlcm0gUGVyaW9kcy4gV2hpbGUgYSBzaG9ydC0gb3IgaW50ZXJtZWRpYXRlLXRlcm0gYW5hbHlzaXMgY2FuIHByb3ZpZGUgaW5zaWdodHMsIGl0IG1heSBub3QgZnVsbHkgcmVwcmVzZW50IHBlcmZvcm1hbmNlIG92ZXIgZXh0ZW5kZWQsIGxvbmctdGVybSBwZXJpb2RzLiBOZXZlcnRoZWxlc3MsIHRoZXNlIHN0YXRpc3RpY3MgY2FuIHNlcnZlIGFzIGEgYmVuY2htYXJrIGZvciBldmFsdWF0aW5nIGZ1dHVyZSBtYXJrZXQgdHJlbmRzLg0KDQoqKkNvbXBhcmF0aXZlIEFuYWx5c2lzIG9mIEluZGV4IFBlcmZvcm1hbmNlOioqIFFRUSBleGhpYml0cyB0aGUgaGlnaGVzdCBtZWFuIHJldHVybiBhdCBgciBtZWFuX3ZhbHVlX3FxcWAlLCBzdXJwYXNzaW5nIFNQWCdzIGByIG1lYW5fdmFsdWVfc3B4YCUgYW5kIEJsYWNrUm9jaydzIGByIG1lYW5fdmFsdWVfYmxhY2tyb2NrYCUsIHJlZmxlY3RpbmcgaXRzIGFnZ3Jlc3NpdmUsIHRlY2gtZm9jdXNlZCBjb21wb3NpdGlvbi4gSXRzIENBR1Igb2YgYHIgY2Fncl92YWx1ZV9xcXFgJSBzaWduaWZpY2FudGx5IG91dHBhY2VzIFNQWCdzIGByIGNhZ3JfdmFsdWVfc3B4YCUgYW5kIEJsYWNrUm9jaydzIGByIGNhZ3JfdmFsdWVfYmxhY2tyb2NrYCUsIGZ1cnRoZXIgZW1waGFzaXppbmcgUVFRJ3Mgc3Ryb25nIGdyb3d0aCBwb3RlbnRpYWwuIFdoaWxlIGJvdGggU1BYIGFuZCBRUVEgaGF2ZSBjb25zaXN0ZW50bHkgc3VycGFzc2VkIGluZmxhdGlvbiwgY29uc2VydmF0aXZlLCBhbmQgbW9kZXJhdGUgdGFyZ2V0cyBgciBwZXJjZW50X2Fib3ZlX3RhcmdldF9tb2RlcmF0ZV9xcXFgJSBvZiB0aGUgdGltZSwgQmxhY2tSb2NrIGxhZ3Mgc2lnbmlmaWNhbnRseSwgbWVldGluZyB0aGVzZSB0aHJlc2hvbGRzIG9ubHkgYHIgcGVyY2VudF9hYm92ZV90YXJnZXRfY29uc2VydmF0aXZlX2JsYWNrcm9ja2AlIGFuZCBgciBwZXJjZW50X2Fib3ZlX3RhcmdldF9tb2RlcmF0ZV9xcXFgJSBvZiB0aGUgdGltZSwgcmVzcGVjdGl2ZWx5LiBBZGRpdGlvbmFsbHksIEJsYWNrUm9jaydzIHBlcmZvcm1hbmNlIGluIGV4Y2VlZGluZyB0aGUgYWdncmVzc2l2ZSBiZW5jaG1hcmsgc3RhbmRzIGF0IGp1c3QgYHIgcGVyY2VudF9hYm92ZV90YXJnZXRfYWdncmVzc2l2ZV9ibGFja3JvY2tgJSwgY29tcGFyZWQgdG8gYHIgcGVyY2VudF9hYm92ZV90YXJnZXRfYWdncmVzc2l2ZV9xcXFgJSBmb3IgYm90aCBTUFggYW5kIFFRUS4NCg0KSG93ZXZlciwgUVFRIGFsc28gZGVtb25zdHJhdGVzIHRoZSBoaWdoZXN0IHZvbGF0aWxpdHksIHdpdGggYSBzdGFuZGFyZCBkZXZpYXRpb24gb2YgYHIgc2RfdmFsdWVfcXFxYCUlLCBjb21wYXJlZCB0byBgciBzZF92YWx1ZV9zcHhgJSBmb3IgU1BYIGFuZCBgciBzZF92YWx1ZV9ibGFja3JvY2tgJSBmb3IgQmxhY2tSb2NrLCB1bmRlcnNjb3JpbmcgaXRzIGdyZWF0ZXIgcmlzay4gVGhlIHJhbmdlIG9mIGV4cGVjdGVkIHJldHVybnMgKENBR1IgwrEgU0QpIGlzIHdpZGVzdCBmb3IgUVFRIChgciBtaW5fY2Fncl9yYW5nZV9xcXFgJSB0byBgciBtYXhfY2Fncl9yYW5nZV9xcXFgJSkgYW5kIG5hcnJvd2VzdCBmb3IgQmxhY2tSb2NrIChgciBtaW5fY2Fncl9yYW5nZV9ibGFja3JvY2tgJSB0byBgciBtYXhfY2Fncl9yYW5nZV9ibGFja3JvY2tgJSksIGVtcGhhc2l6aW5nIEJsYWNrUm9jaydzIHN0YWJpbGl0eSBidXQgc2lnbmlmaWNhbnRseSBsb3dlciBncm93dGggcG90ZW50aWFsLiBNZWRpYW4gcmV0dXJucyBmdXJ0aGVyIGhpZ2hsaWdodCBRUVEncyBkb21pbmFuY2UgKGByIG1lZGlhbl92YWx1ZV9xcXFgJSkgb3ZlciBTUFggKGByIG1lZGlhbl92YWx1ZV9zcHhgJSkgYW5kIEJsYWNrUm9jayAoYHIgbWVkaWFuX3ZhbHVlX2JsYWNrcm9ja2AlKS4gQmxhY2tSb2NrLCB0aG91Z2ggbGVzcyB2b2xhdGlsZSwgbGFncyBpbiBwZXJmb3JtYW5jZSB3aXRoIHRoZSBsb3dlc3QgbWF4aW11bSByZXR1cm4uIEJvdGggU1BYIGFuZCBRUVEgaGF2ZSBuZWFyLSBvciBhdC1lcXVhbCBwZXJjZW50YWdlIG9mIHllYXJzIGFib3ZlIGVhY2ggdGFyZ2V0LCAoYHIgbWF4X3ZhbHVlX2JsYWNrcm9ja2AlKSBhbmQgdGhlIGhpZ2hlc3QgcGVyY2VudGFnZSBvZiB5ZWFycyBiZWxvdyBpbmZsYXRpb24gYW5kIGNvbnNlcnZhdGl2ZSB0YXJnZXRzLiBUaGlzIGNvbXBhcmlzb24gdW5kZXJzY29yZXMgUVFRJ3MgYXBwZWFsIGZvciBncm93dGgtb3JpZW50ZWQgaW52ZXN0b3JzIHNlZWtpbmcgaGlnaGVyIHJldHVybnMgZGVzcGl0ZSBpbmNyZWFzZWQgcmlzay4NCg0KKipMb25nLVRlcm0gSW52ZXN0bWVudCBWaWFiaWxpdHk6KiogRm9yIGFueSBvZiB0aGVzZSBJbmRleGVzIHRvIGJlIGNvbnNpZGVyZWQgYSBoaWdoLXBlcmZvcm1pbmcgYW5kIHJlc2lsaWVudCBsb25nLXRlcm0gaW52ZXN0bWVudCwgaXQgd291bGQgYmUgaWRlYWwgdG8gZXhjZWVkIHRoZSBhZ2dyZXNzaXZlIHRhcmdldCAoZS5nLiwgYHIgKHRhcmdldF9hZ2dyZXNzaXZlIC0gdGFyZ2V0X2luZmxhdGlvbilgJSBhbm51YWxpemVkIHJldHVybnMsIGFjY291bnRpbmcgZm9yIGhpZ2hlciBpbmZsYXRpb24tYWRqdXN0ZWQgcGVyZm9ybWFuY2UgZXhwZWN0YXRpb25zKSBpbiBhdCBsZWFzdCA0MCUtNTAlIG9mIHRoZSB5ZWFycy4gVGhpcyByYW5nZSByZWZsZWN0cyB0aGUgcG90ZW50aWFsIGZvciBzdHJvbmcgdXBzaWRlIGluIG1hbnkgeWVhcnMgd2hpbGUgYmFsYW5jaW5nIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgbWFya2V0cyBkbyBleHBlcmllbmNlIGRvd250dXJucy4gDQoNCi0gU1BYOiBgciBwZXJjZW50X2Fib3ZlX3RhcmdldF9hZ2dyZXNzaXZlX3NweGAlIG9mIHRoZSB5ZWFycyBleGNlZWRlZCB0aGUgYWdncmVzc2l2ZSB0YXJnZXQgYHIgaWYocGVyY2VudF9hYm92ZV90YXJnZXRfYWdncmVzc2l2ZV9zcHggPiA1MCkgImluZGljYXRpbmcgY29uc2lzdGVudCBhbmQgcm9idXN0IGdyb3d0aCwgbWFraW5nIGl0IGEgc3Ryb25nIG9wdGlvbiBmb3IgdGhvc2Ugc2Vla2luZyBhZ2dyZXNzaXZlIGludmVzdG1lbnRzLiIgZWxzZSBpZihwZXJjZW50X2Fib3ZlX3RhcmdldF9hZ2dyZXNzaXZlX3NweCA+IDQwKSAic3VnZ2VzdGluZyB0aGF0IHdoaWxlIG5vdCBjb25zaXN0ZW50LCBpdCBoYXMgaGlzdG9yaWNhbGx5IHByb3ZpZGVkIHJvYnVzdCBncm93dGggb3ZlciB0aGUgbG9uZyB0ZXJtLCBtYWtpbmcgaXQgYSB2aWFibGUgaW52ZXN0bWVudCBmb3IgdGhvc2Ugd2l0aCBhIGhpZ2hlciByaXNrIHRvbGVyYW5jZS4iIGVsc2UgInJhaXNpbmcgY29uY2VybnMgYWJvdXQgaXRzIGFiaWxpdHkgdG8gbWVldCBhZ2dyZXNzaXZlIGdyb3d0aCB0YXJnZXRzLCBtYWtpbmcgaXQgbGVzcyBzdWl0YWJsZSBmb3IgaW52ZXN0b3JzIHdpdGggaGlnaGVyIHJpc2sgdG9sZXJhbmNlLiJgDQoNCi0gUVFROiBgciBwZXJjZW50X2Fib3ZlX3RhcmdldF9hZ2dyZXNzaXZlX3FxcWAlIG9mIHRoZSB5ZWFycyBleGNlZWRlZCB0aGUgYWdncmVzc2l2ZSB0YXJnZXQgYHIgaWYocGVyY2VudF9hYm92ZV90YXJnZXRfYWdncmVzc2l2ZV9xcXEgPiA1MCkgImluZGljYXRpbmcgY29uc2lzdGVudCBhbmQgcm9idXN0IGdyb3d0aCwgbWFraW5nIGl0IGEgc3Ryb25nIG9wdGlvbiBmb3IgdGhvc2Ugc2Vla2luZyBhZ2dyZXNzaXZlIGludmVzdG1lbnRzLiIgZWxzZSBpZihwZXJjZW50X2Fib3ZlX3RhcmdldF9hZ2dyZXNzaXZlX3FxcSA+IDQwKSAic3VnZ2VzdGluZyB0aGF0IHdoaWxlIG5vdCBjb25zaXN0ZW50LCBpdCBoYXMgaGlzdG9yaWNhbGx5IHByb3ZpZGVkIHJvYnVzdCBncm93dGggb3ZlciB0aGUgbG9uZyB0ZXJtLCBtYWtpbmcgaXQgYSB2aWFibGUgaW52ZXN0bWVudCBmb3IgdGhvc2Ugd2l0aCBhIGhpZ2hlciByaXNrIHRvbGVyYW5jZS4iIGVsc2UgInJhaXNpbmcgY29uY2VybnMgYWJvdXQgaXRzIGFiaWxpdHkgdG8gbWVldCBhZ2dyZXNzaXZlIGdyb3d0aCB0YXJnZXRzLCBtYWtpbmcgaXQgbGVzcyBzdWl0YWJsZSBmb3IgaW52ZXN0b3JzIHdpdGggaGlnaGVyIHJpc2sgdG9sZXJhbmNlLiJgDQoNCi0gQmxhY2tSb2NrOiBgciBwZXJjZW50X2Fib3ZlX3RhcmdldF9hZ2dyZXNzaXZlX2JsYWNrcm9ja2AlIG9mIHRoZSB5ZWFycyBleGNlZWRlZCB0aGUgYWdncmVzc2l2ZSB0YXJnZXQgYHIgaWYocGVyY2VudF9hYm92ZV90YXJnZXRfYWdncmVzc2l2ZV9ibGFja3JvY2sgPiA1MCkgImluZGljYXRpbmcgY29uc2lzdGVudCBhbmQgcm9idXN0IGdyb3d0aCwgbWFraW5nIGl0IGEgc3Ryb25nIG9wdGlvbiBmb3IgdGhvc2Ugc2Vla2luZyBhZ2dyZXNzaXZlIGludmVzdG1lbnRzLiIgZWxzZSBpZihwZXJjZW50X2Fib3ZlX3RhcmdldF9hZ2dyZXNzaXZlX2JsYWNrcm9jayA+IDQwKSAic3VnZ2VzdGluZyB0aGF0IHdoaWxlIG5vdCBjb25zaXN0ZW50LCBpdCBoYXMgaGlzdG9yaWNhbGx5IHByb3ZpZGVkIHJvYnVzdCBncm93dGggb3ZlciB0aGUgbG9uZyB0ZXJtLCBtYWtpbmcgaXQgYSB2aWFibGUgaW52ZXN0bWVudCBmb3IgdGhvc2Ugd2l0aCBhIGhpZ2hlciByaXNrIHRvbGVyYW5jZS4iIGVsc2UgInJhaXNpbmcgY29uY2VybnMgYWJvdXQgaXRzIGFiaWxpdHkgdG8gbWVldCBhZ2dyZXNzaXZlIGdyb3d0aCB0YXJnZXRzLCBtYWtpbmcgaXQgbGVzcyBzdWl0YWJsZSBmb3IgaW52ZXN0b3JzIHdpdGggaGlnaGVyIHJpc2sgdG9sZXJhbmNlLiJgDQoNCiMjIyBHcmFwaCANCg0KYGBge3IgaW5kZXhfY29tcGFyaXNvbl9ncl9ncmFwaCwgZmlnLndpZHRoPTEwLCBmaWcuaGVpZ2h0PTcsIGV2YWw9VFJVRSwgZWNobz1GQUxTRX0NCg0KY2F0KCJcblxuIyMjIyBBbm51YWwgR3Jvd3RoIFJhdGVzIEJ5IEluZGV4IFxuIikNCg0KIyBMb2FkIG5lY2Vzc2FyeSBsaWJyYXJpZXMNCmxpYnJhcnkoZ2dwbG90MikNCmxpYnJhcnkoZHBseXIpDQoNCiMgQ29udmVydCBjb2x1bW5zIHRvIG51bWVyaWMgZm9yIHBsb3R0aW5nIGlmIG5lZWRlZA0KbWVyZ2VkX2RhdGEgPC0gbWVyZ2VkX2RhdGEgJT4lDQogIG11dGF0ZSgNCiAgICBgRGF0ZWAgPSBhcy5udW1lcmljKGFzLmNoYXJhY3RlcihgRGF0ZWApKSwgICMgRW5zdXJlIERhdGUgaXMgbnVtZXJpYw0KICAgIGBTUFhgID0gYXMubnVtZXJpYyhnc3ViKCIlIiwgIiIsIGBTUFhgKSksDQogICAgYFFRUWAgPSBhcy5udW1lcmljKGdzdWIoIiUiLCAiIiwgYFFRUWApKSwNCiAgICBgQmxhY2tSb2NrYCA9IGFzLm51bWVyaWMoZ3N1YigiJSIsICIiLCBgQmxhY2tSb2NrYCkpDQogICkNCg0KIyBSZXNoYXBlIHRoZSBkYXRhIGludG8gbG9uZyBmb3JtYXQgZm9yIGVhc3kgcGxvdHRpbmcgb2YgbXVsdGlwbGUgbGluZXMgYW5kIHNldCB0aGUgZmFjdG9yIG9yZGVyDQpucnRfbG9uZyA8LSBtZXJnZWRfZGF0YSAlPiUNCiAgcGl2b3RfbG9uZ2VyKGNvbHMgPSBjKGBTUFhgLCBgUVFRYCwgYEJsYWNrUm9ja2ApLA0KICAgICAgICAgICAgICAgbmFtZXNfdG8gPSAiQUdSX0luZGV4IiwNCiAgICAgICAgICAgICAgIHZhbHVlc190byA9ICJBR1JfVmFsdWUiKSAlPiUNCiAgbXV0YXRlKEFHUl9JbmRleCA9IGZhY3RvcihBR1JfSW5kZXgsIGxldmVscyA9IGMoIlNQWCIsICJRUVEiLCAiQmxhY2tSb2NrIikpKQ0KDQojIEFzc2lnbiBjb2xvcnMgZHluYW1pY2FsbHkgYmFzZWQgb24gdGhlIG9yZGVyIG9mIEFHUl9JbmRleCBpbiB0aGUgZGF0YQ0KIyBNYXRjaCB0aGUgdW5pcXVlIGxldmVscyBvZiBBR1JfSW5kZXggd2l0aCBjb2xvcnMgZnJvbSBjb2xvcnNfZ2VuZXJhbF9kYXJrDQp1bmlxdWVfdHlwZXMgPC0gdW5pcXVlKG5ydF9sb25nJEFHUl9JbmRleCkNCmN1c3RvbV9jb2xvcnMgPC0gc2V0TmFtZXMoY29sb3JzX2dlbmVyYWxfZGFya1sxOmxlbmd0aCh1bmlxdWVfdHlwZXMpXSwgdW5pcXVlX3R5cGVzKQ0KDQojIEZpbmQgdGhlIG1pbmltdW0gYW5kIG1heGltdW0geC12YWx1ZSBpbiB5b3VyIGRhdGENCm1heF94IDwtIG1heChhcy5pbnRlZ2VyKG1lcmdlZF9kYXRhJERhdGUpLCBuYS5ybSA9IFRSVUUpDQptaW5feCA8LSBtaW4oYXMuaW50ZWdlcihtZXJnZWRfZGF0YSREYXRlKSwgbmEucm0gPSBUUlVFKQ0KaW50ZXJhY3RpdmVfcHJpbnQobWF4X3gpICAjIFRlc3QNCmludGVyYWN0aXZlX3ByaW50KG1pbl94KSAgIyBUZXN0DQoNCiMgRmluZCB0aGUgbWluaW11bSBhbmQgbWF4aW11bSB5ZWFyDQptaW5feWVhciA8LSBtaW4obWVyZ2VkX2RhdGEkRGF0ZSwgbmEucm0gPSBUUlVFKQ0KbWF4X3llYXIgPC0gbWF4KG1lcmdlZF9kYXRhJERhdGUsIG5hLnJtID0gVFJVRSkNCmludGVyYWN0aXZlX3ByaW50KG1pbl95ZWFyKQ0KaW50ZXJhY3RpdmVfcHJpbnQobWF4X3llYXIpDQoNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQojIyBQTE9UIEZVTEwgV0lUSE9VVCBMSU1JVFMNCg0KIyBEZWZpbmUgc3RhcnQgYW5kIGVuZCB5ZWFycw0Kc3RhcnRfeWVhciA8LSBhcy5udW1lcmljKG1pbl95ZWFyKQ0KZW5kX3llYXIgPC0gbWF4X3llYXINCnllYXJfcmFuZ2UgPC0gZW5kX3llYXIgLSBzdGFydF95ZWFyICsgMSAgIyBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiB5ZWFycw0KDQojIERlZmluZSBicmVha3Mgcm91bmRlZCBhcHByb3ByaWF0ZWx5DQpsaW1pdHNfc3RhcnRfeWVhciA8LSBmbG9vcihzdGFydF95ZWFyIC8gMikgKiAyICAjIFJvdW5kIGRvd24gdG8gdGhlIG5lYXJlc3QgbXVsdGlwbGUgb2YgNQ0KbGltaXRzX2VuZF95ZWFyIDwtIGNlaWxpbmcoZW5kX3llYXIgLyAyKSAqIDIgICAjIFJvdW5kIHVwIHRvIHRoZSBuZWFyZXN0IG11bHRpcGxlIG9mIDUNCg0KIyBDcmVhdGUgZHluYW1pYyB0aXRsZSBhbmQgY2FwdGlvbg0KZHluYW1pY190aXRsZSA8LSBwYXN0ZTAoIkFubnVhbCBHcm93dGggUmF0ZXMgQnkgSW5kZXggT3ZlciAiLCB5ZWFyX3JhbmdlLCAiIFllYXJzICgiLCBzdGFydF95ZWFyLCAiLSIsIGVuZF95ZWFyLCAiKSIpDQpkeW5hbWljX2NhcHRpb24gPC0gcGFzdGUwKCJBbm51YWwgR3Jvd3RoIFJhdGVzIEJ5IEluZGV4LCBEYXRhIFBlcmlvZCAoIiwgc3RhcnRfeWVhciwgIi0iLCBlbmRfeWVhciwgIikiKQ0KDQojIENyZWF0ZSB0aGUgZnVsbCwgbm9uLWZpbHRlcmVkIHgtYXhpcyBwbG90IHdpdGggZHluYW1pYyB4IHBsYWNlbWVudCBmb3IgYW5ub3RhdGlvbnMNCnAxIDwtIGdncGxvdChucnRfbG9uZywgYWVzKHggPSBhcy5pbnRlZ2VyKERhdGUpLCB5ID0gQUdSX1ZhbHVlLCBjb2xvciA9IEFHUl9JbmRleCkpICsNCg0KICAjIEFkZCBzaGFkZWQgYXJlYXMgZm9yIGJhY2tncm91bmQgZWZmZWN0DQogIGdlb21fcmVjdChhZXMoeG1pbiA9IC1JbmYsIHhtYXggPSBJbmYsIHltaW4gPSB0YXJnZXRfYWdncmVzc2l2ZSwgeW1heCA9IEluZiksIGZpbGwgPSAibGlnaHRncmVlbiIsIGFscGhhID0gMC4wMzApICsNCiAgZ2VvbV9yZWN0KGFlcyh4bWluID0gLUluZiwgeG1heCA9IEluZiwgeW1pbiA9IHRhcmdldF9jb25zZXJ2YXRpdmUsIHltYXggPSB0YXJnZXRfYWdncmVzc2l2ZSksIGZpbGwgPSAib3JhbmdlIiwgYWxwaGEgPSAwLjAzMCkgKw0KICBnZW9tX3JlY3QoYWVzKHhtaW4gPSAtSW5mLCB4bWF4ID0gSW5mLCB5bWluID0gLUluZiwgeW1heCA9IHRhcmdldF9jb25zZXJ2YXRpdmUpLCBmaWxsID0gImxpZ2h0Y29yYWwiLCBhbHBoYSA9IDAuMDMwKSArDQogIA0KICAjIFBsb3QgbGluZXMgZm9yIGVhY2ggQUdSIEluZGV4DQogIGdlb21fbGluZShzaXplID0gMS4yNSwgYWxwaGEgPSAzLjApICsgICAgICAgIyBMaW5lIGZvciBlYWNoIENBR1INCiAgZ2VvbV9wb2ludChzaXplID0gMi4wLCBhbHBoYSA9IDMuMCkgKyAgICAgICAjIFBvaW50cyBmb3IgZWFjaCBDQUdSDQogIA0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSB0YXJnZXRfYWdncmVzc2l2ZSwgY29sb3IgPSAiZGFya2JsdWUiLCBsaW5ldHlwZSA9ICJzb2xpZCIpICsNCiAgIyBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSB0YXJnZXRfbW9kZXJhdGUsIGNvbG9yID0gImRhcmtibHVlIiwgbGluZXR5cGUgPSAic29saWQiKSArDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IHRhcmdldF9jb25zZXJ2YXRpdmUsIGNvbG9yID0gImRhcmtibHVlIiwgbGluZXR5cGUgPSAic29saWQiKSArDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IHRhcmdldF9pbmZsYXRpb24sIGNvbG9yID0gImRhcmtyZWQiLCBsaW5ldHlwZSA9ICJkYXNoZWQiKSArDQoNCiAgIyBEeW5hbWljIHJpZ2h0LWFsaWduZWQgcGxhY2VtZW50IGZvciBhbm5vdGF0aW9ucw0KICBhbm5vdGF0ZSgidGV4dCIsIHggPSBJbmYsIHkgPSB0YXJnZXRfYWdncmVzc2l2ZSwgbGFiZWwgPSAiQWdncmVzc2l2ZSIsIA0KICAgICAgICAgICBoanVzdCA9IDEsIHZqdXN0ID0gLTAuNSwgY29sb3IgPSAiZGFya2JsdWUiLCBzaXplID0gNCkgKw0KICAjIGFubm90YXRlKCJ0ZXh0IiwgeCA9IEluZiwgeSA9IHRhcmdldF9tb2RlcmF0ZSwgbGFiZWwgPSAiTW9kZXJhdGUiLCANCiAgIyAgICAgICAgIGhqdXN0ID0gMSwgdmp1c3QgPSAtMC41LCBjb2xvciA9ICJkYXJrYmx1ZSIsIHNpemUgPSA0KSArDQogIGFubm90YXRlKCJ0ZXh0IiwgeCA9IEluZiwgeSA9IHRhcmdldF9jb25zZXJ2YXRpdmUsIGxhYmVsID0gIkNvbnNlcnZhdGl2ZSIsIA0KICAgICAgICAgICBoanVzdCA9IDEsIHZqdXN0ID0gLTAuNSwgY29sb3IgPSAiZGFya2JsdWUiLCBzaXplID0gNCkgKw0KICBhbm5vdGF0ZSgidGV4dCIsIHggPSBJbmYsIHkgPSB0YXJnZXRfaW5mbGF0aW9uLCBsYWJlbCA9ICJJbmZsYXRpb24iLCANCiAgICAgICAgICAgaGp1c3QgPSAxLCB2anVzdCA9IC0wLjUsIGNvbG9yID0gImRhcmtyZWQiLCBzaXplID0gNCkgKw0KDQogIGxhYnMoDQogICAgdGl0bGUgPSBkeW5hbWljX3RpdGxlLA0KICAgIHggPSAiWWVhciIsDQogICAgeSA9ICJHcm93dGggUmF0ZSAoJSkiLA0KICAgIGNvbG9yID0gIkFHUiBJbmRleCIsDQogICAgY2FwdGlvbiA9IGR5bmFtaWNfY2FwdGlvbg0KICAgICkgKw0KICANCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGN1c3RvbV9jb2xvcnMpICsgICMgU2V0IGNvbG9ycyBmb3IgZWFjaCBBR1IgSW5kZXgNCiAgc2NhbGVfeF9jb250aW51b3VzKA0KICAgIGxpbWl0cyA9IGMoc3RhcnRfeWVhciwgZW5kX3llYXIgKyAxKSwgDQogICAgYnJlYWtzID0gc2VxKGxpbWl0c19zdGFydF95ZWFyLCBsaW1pdHNfZW5kX3llYXIgKyAxLCAyKSAgIyBSZXN0cmljdCAmIFNldCBNYWpvciB4LWF4aXMgbGluZXMgZm9yIGVhY2ggeWVhcg0KICApICsgDQogIA0KICB0aGVtZV9taW5pbWFsKCkgKw0KICB0aGVtZSgNCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41LCBzaXplID0gMjApLCAgICAgICAgICMgTGFyZ2VyIHRpdGxlIGZvbnQNCiAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0KSwgICAgICAgICAgICAgICAgICAgICMgTGFyZ2VyIHgtYXhpcyBsYWJlbCBmb250DQogICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCksICAgICAgICAgICAgICAgICAgICAjIExhcmdlciB5LWF4aXMgbGFiZWwgZm9udA0KICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSwgc2l6ZSA9IDE0KSwgICMgTGFyZ2VyIHgtYXhpcyB0ZXh0DQogICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0KSwgICAgICAgICAgICAgICAgICAgICAjIExhcmdlciB5LWF4aXMgdGV4dA0KICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQpLCAgICAgICAgICAgICAgICAgICAgIyBMZWdlbmQgdGl0bGUgc2l6ZQ0KICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiksICAgICAgICAgICAgICAgICAgICAgIyBMZWdlbmQgdGV4dCBzaXplDQogICAgcGFuZWwuZ3JpZC5tYWpvciA9IGVsZW1lbnRfbGluZShsaW5ldHlwZSA9ICJkb3R0ZWQiLCBjb2xvciA9ICJibGFjayIpLCAgIyBNYWpvciBncmlkIGxpbmVzDQogICAgcGFuZWwuZ3JpZC5taW5vci54ID0gZWxlbWVudF9ibGFuaygpLCAgICAgICAgICAgICAgICAgICAgICAjIE5vIG1pbm9yIHggZ3JpZCBsaW5lcw0KICAgIGF4aXMudGlja3MubGVuZ3RoID0gdW5pdCgtMC4yNSwgImNtIiksICAgICAgICAgICAgICAgICAgICAgICMgSW5jcmVhc2UgdGljayBsZW5ndGgNCiAgICBheGlzLnRpY2tzID0gZWxlbWVudF9saW5lKGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDAuNTApLCAgICMgRGFya2VyIHRpY2tzDQogICAgYXhpcy5saW5lLnggPSBlbGVtZW50X2xpbmUoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMC43NSksICAjIERhcmsgYm90dG9tIGJvcmRlcg0KICAgIGF4aXMubGluZS55ID0gZWxlbWVudF9saW5lKGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDAuNzUpICAgIyBEYXJrIGxlZnQgYm9yZGVyDQogICkNCg0KIyBQcmludCB0aGUgcGxvdCANCnByaW50KHAxKQ0KDQoNCmBgYA0KDQpUaGVyZSBhcmUgeWVhcnMgd2hlbiBRUVEncyBhbm51YWwgZ3Jvd3RoIHJhdGUgdW5kZXJwZXJmb3JtZWQgdGhlIG90aGVyIGluZGV4ZXMsIHBhcnRpY3VsYXJseSBkdXJpbmcgZGVjbGluZXMgc3VjaCBhcyBpbiAyMDIzLCBidXQgdGhvc2UgeWVhcnMgYXJlIG92ZXJzaGFkb3dlZCBieSBpdHMgb3ZlcmFsbCBzdHJlbmd0aC4gSW4gaGluZHNpZ2h0LCBwZXJpb2RzIHdoZW4gc3Ryb25nLCB2b2xhdGlsZSBpbmRleGVzIGhhdmUgcGVyZm9ybWVkIHRoZSB3b3JzdCBtYXkgYWN0dWFsbHkgcmVwcmVzZW50IHRoZSBiZXN0IG9wcG9ydHVuaXRpZXMgdG8gaW52ZXN0Lg0KDQojIyBDdW11bGF0aXZlIEdyb3d0aCANCg0KIyMjIERhdGENCg0KYGBge3IgaW5kZXhfY29tcGFyaXNvbl9jZywgZXZhbD1UUlVFLCBlY2hvPUZBTFNFfQ0KDQojIExvYWQgbmVjZXNzYXJ5IGxpYnJhcnkNCmxpYnJhcnkoZHBseXIpDQoNCiMgU3RlcCAxOiBDb252ZXJ0IHBlcmNlbnRhZ2VzIHRvIG51bWVyaWMgdmFsdWVzIChjb2x1bW5zIDI6NCkNCmN1bXVsYXRpdmVfZGF0YSA8LSBtZXJnZWRfZGF0YSAlPiUNCiAgbXV0YXRlKA0KICAgIGFjcm9zcygyOjQsIH4gYXMubnVtZXJpYyhnc3ViKCIlIiwgIiIsIC4pKSAvIDEwMCkgIyBDb252ZXJ0IHBlcmNlbnRhZ2Ugc3RyaW5ncyB0byBudW1lcmljDQogICkNCg0KIyBTdGVwIDI6IEVuc3VyZSB0aGUgYERhdGVgIGNvbHVtbiBpcyB0cmVhdGVkIGFzIGFuIGludGVnZXINCmN1bXVsYXRpdmVfZGF0YSA8LSBjdW11bGF0aXZlX2RhdGEgJT4lDQogIG11dGF0ZShEYXRlID0gYXMuaW50ZWdlcihEYXRlKSkNCg0KIyBTdGVwIDM6IEFkZCB0aGUgaW5pdGlhbCB2YWx1ZSBmb3IgMjAxNw0KY3VtdWxhdGl2ZV9kYXRhIDwtIGJpbmRfcm93cygNCiAgZGF0YS5mcmFtZShEYXRlID0gc3RhcnRfeWVhci0xLCBgU1BYYCA9IDAsIFFRUSA9IDAsIEJsYWNrUm9jayA9IDApLCAjIFNldCBncm93dGggcmF0ZXMgZm9yIDIwMTcgdG8gMA0KICBjdW11bGF0aXZlX2RhdGENCikNCg0KIyBTdGVwIDQ6IFNvcnQgYnkgRGF0ZSBhc2NlbmRpbmcgZm9yIHByb3BlciBjdW11bGF0aXZlIGNhbGN1bGF0aW9uDQpjdW11bGF0aXZlX2RhdGEgPC0gY3VtdWxhdGl2ZV9kYXRhICU+JQ0KICBhcnJhbmdlKERhdGUpDQoNCiMgU3RlcCA1OiBJbml0aWFsaXplIHRoZSBzdGFydGluZyB2YWx1ZQ0Kc3RhcnRpbmdfdmFsdWUgPC0gMTAwDQoNCiMgU3RlcCA2OiBDYWxjdWxhdGUgY3VtdWxhdGl2ZSBncm93dGgNCmN1bXVsYXRpdmVfZGF0YSA8LSBjdW11bGF0aXZlX2RhdGEgJT4lDQogIG11dGF0ZSgNCiAgICBgU1BYYCA9IHN0YXJ0aW5nX3ZhbHVlICogY3VtcHJvZCgxICsgcmVwbGFjZV9uYShgU1BYYCwgMCkpLCAjIFJlcGxhY2UgTkEgd2l0aCAwIGZvciBwcm9wZXIgY2FsY3VsYXRpb24NCiAgICBRUVEgPSBzdGFydGluZ192YWx1ZSAqIGN1bXByb2QoMSArIHJlcGxhY2VfbmEoUVFRLCAwKSksDQogICAgQmxhY2tSb2NrID0gc3RhcnRpbmdfdmFsdWUgKiBjdW1wcm9kKDEgKyByZXBsYWNlX25hKEJsYWNrUm9jaywgMCkpDQogICkNCg0KIyBTdGVwIDc6IFJlcGxhY2UgaW5pdGlhbCBncm93dGggcmF0ZXMgZm9yIDIwMTcgd2l0aCAkMTAwIGV4cGxpY2l0bHkNCmN1bXVsYXRpdmVfZGF0YSA8LSBjdW11bGF0aXZlX2RhdGEgJT4lDQogIG11dGF0ZShhY3Jvc3MoMjo0LCB+IGlmZWxzZShEYXRlID09IHN0YXJ0X3llYXItMSwgMTAwLCAuKSkpDQoNCiMgU3RlcCA4OiBSZW9yZGVyIGNvbHVtbnMgYXMgRGF0ZSwgU1BYLCBRUVEsIEJsYWNrUm9jaw0KY3VtdWxhdGl2ZV9kYXRhIDwtIGN1bXVsYXRpdmVfZGF0YSAlPiUNCiAgc2VsZWN0KERhdGUsIGBTUFhgLCBRUVEsIEJsYWNrUm9jaykNCg0KIyBTdGVwIDk6IFJvdW5kIHZhbHVlcyB0byAyIGRlY2ltYWwgcGxhY2VzDQpjdW11bGF0aXZlX2RhdGEgPC0gY3VtdWxhdGl2ZV9kYXRhICU+JQ0KICBtdXRhdGUoYWNyb3NzKDI6NCwgfiByb3VuZCguLCAyKSkpDQoNCiMgU3RlcCAxMDogU29ydCBieSBEYXRlIGRlc2NlbmRpbmcgZm9yIHByZXNlbnRhdGlvbg0KY3VtdWxhdGl2ZV9kYXRhIDwtIGN1bXVsYXRpdmVfZGF0YSAlPiUNCiAgYXJyYW5nZShkZXNjKERhdGUpKQ0KDQojIEZvcm1hdCB0aGUgdGFibGUgd2l0aG91dCBhZGRpbmcgY29tbWFzIHRvIHRoZSBEYXRlIGNvbHVtbg0KY3VtdWxhdGl2ZV9kYXRhJERhdGUgPC0gYXMuY2hhcmFjdGVyKGN1bXVsYXRpdmVfZGF0YSREYXRlKSAgIyBFbnN1cmUgRGF0ZSBpcyBhIGNoYXJhY3RlciB3aXRob3V0IGNvbW1hcw0KY3VtdWxhdGl2ZV9kYXRhJGBTUFhgIDwtIGZvcm1hdEMoY3VtdWxhdGl2ZV9kYXRhJGBTUFhgLCBmb3JtYXQgPSAiZiIsIGRpZ2l0cyA9IDIpDQpjdW11bGF0aXZlX2RhdGEkUVFRIDwtIGZvcm1hdEMoY3VtdWxhdGl2ZV9kYXRhJFFRUSwgZm9ybWF0ID0gImYiLCBkaWdpdHMgPSAyKQ0KY3VtdWxhdGl2ZV9kYXRhJGBCbGFja1JvY2tgIDwtIGZvcm1hdEMoY3VtdWxhdGl2ZV9kYXRhJGBCbGFja1JvY2tgLCBmb3JtYXQgPSAiZiIsIGRpZ2l0cyA9IDIpDQoNCg0KIyBQcmludCB0aGUgY3VtdWxhdGl2ZSBncm93dGggdGFibGUNCmNhdCgiXG5cbiMjIyMgQ3VtdWxhdGl2ZSBHcm93dGggKCIsIG1pbl95ZWFyLCAiLSIsIG1heF95ZWFyLCAiKVxuIiwgc2VwID0gIiIpDQppbnRlcmFjdGl2ZV9wcmludChjdW11bGF0aXZlX2RhdGEpDQppbnRlcmFjdGl2ZV9zdHIoY3VtdWxhdGl2ZV9kYXRhKQ0KZm9ybWF0X2VxdWFsX3dpZHRoKGN1bXVsYXRpdmVfZGF0YSkNCg0KDQoNCg0KYGBgDQoNClRoZSB0YWJsZSBhbmQgZ3JhcGggYmVsb3cgc2hvdyB0aGUgaW1wYWN0IG9mIHRoZSBhbm51YWwgZ3Jvd3RoIHJhdGVzLCBjb21wYXJpbmcgdGhlIGN1bXVsYXRpdmUgZ3Jvd3RoIG9mIFNQWCwgUVFRLCBhbmQgQmxhY2tSb2NrIGluZGV4ZXMgb3ZlciBhIGByIHllYXJfcmFuZ2VgLXllYXIgcGVyaW9kIGZyb20gYHIgc3RhcnRfeWVhciAtIDFgIHRvIGByIGVuZF95ZWFyYCwgc3RhcnRpbmcgd2l0aCBhbiBpbml0aWFsIHZhbHVlIG9mICQxMDAgcGVyIDEwMCUuIA0KDQojIyMgR3JhcGggDQoNCmBgYHtyIGluZGV4X2NvbXBhcmlzb25fY2dfZ3JhcGgsIGZpZy53aWR0aD0xMCwgZmlnLmhlaWdodD03LCBldmFsPVRSVUUsIGVjaG89RkFMU0V9DQoNCmNhdCgiXG5cbiMjIyMgQ3VtdWxhdGl2ZSBHcm93dGggQnkgSW5kZXggXG4iKQ0KDQojIExvYWQgbmVjZXNzYXJ5IGxpYnJhcmllcw0KbGlicmFyeShnZ3Bsb3QyKQ0KbGlicmFyeShkcGx5cikNCg0KIyBDb252ZXJ0IGNvbHVtbnMgdG8gbnVtZXJpYyBmb3IgcGxvdHRpbmcgaWYgbmVlZGVkDQpjdW11bGF0aXZlX2RhdGEgPC0gY3VtdWxhdGl2ZV9kYXRhICU+JQ0KICBtdXRhdGUoDQogICAgYERhdGVgID0gYXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIoYERhdGVgKSksICAjIEVuc3VyZSBEYXRlIGlzIG51bWVyaWMNCiAgICBgU1BYYCA9IGFzLm51bWVyaWMoZ3N1YigiJSIsICIiLCBgU1BYYCkpLA0KICAgIGBRUVFgID0gYXMubnVtZXJpYyhnc3ViKCIlIiwgIiIsIGBRUVFgKSksDQogICAgYEJsYWNrUm9ja2AgPSBhcy5udW1lcmljKGdzdWIoIiUiLCAiIiwgYEJsYWNrUm9ja2ApKQ0KICApDQoNCiMgUmVzaGFwZSB0aGUgZGF0YSBpbnRvIGxvbmcgZm9ybWF0IGZvciBlYXN5IHBsb3R0aW5nIG9mIG11bHRpcGxlIGxpbmVzIGFuZCBzZXQgdGhlIGZhY3RvciBvcmRlcg0KbnJ0X2xvbmcgPC0gY3VtdWxhdGl2ZV9kYXRhICU+JQ0KICBwaXZvdF9sb25nZXIoY29scyA9IGMoYFNQWGAsIGBRUVFgLCBgQmxhY2tSb2NrYCksDQogICAgICAgICAgICAgICBuYW1lc190byA9ICJDR19JbmRleCIsDQogICAgICAgICAgICAgICB2YWx1ZXNfdG8gPSAiQ0dfVmFsdWUiKSAlPiUNCiAgbXV0YXRlKENHX0luZGV4ID0gZmFjdG9yKENHX0luZGV4LCBsZXZlbHMgPSBjKCJTUFgiLCAiUVFRIiwgIkJsYWNrUm9jayIpKSkNCg0KIyBBc3NpZ24gY29sb3JzIGR5bmFtaWNhbGx5IGJhc2VkIG9uIHRoZSBvcmRlciBvZiBDR19JbmRleCBpbiB0aGUgZGF0YQ0KIyBNYXRjaCB0aGUgdW5pcXVlIGxldmVscyBvZiBDR19JbmRleCB3aXRoIGNvbG9ycyBmcm9tIGNvbG9yc19nZW5lcmFsX2RhcmsNCnVuaXF1ZV90eXBlcyA8LSB1bmlxdWUobnJ0X2xvbmckQ0dfSW5kZXgpDQpjdXN0b21fY29sb3JzIDwtIHNldE5hbWVzKGNvbG9yc19nZW5lcmFsX2RhcmtbMTpsZW5ndGgodW5pcXVlX3R5cGVzKV0sIHVuaXF1ZV90eXBlcykNCg0KIyBGaW5kIHRoZSBtaW5pbXVtIGFuZCBtYXhpbXVtIHgtdmFsdWUgaW4geW91ciBkYXRhDQptYXhfeCA8LSBtYXgoYXMuaW50ZWdlcihjdW11bGF0aXZlX2RhdGEkRGF0ZSksIG5hLnJtID0gVFJVRSkNCm1pbl94IDwtIG1pbihhcy5pbnRlZ2VyKGN1bXVsYXRpdmVfZGF0YSREYXRlKSwgbmEucm0gPSBUUlVFKQ0KaW50ZXJhY3RpdmVfcHJpbnQobWF4X3gpICAjIFRlc3QNCmludGVyYWN0aXZlX3ByaW50KG1pbl94KSAgIyBUZXN0DQoNCiMgRmluZCB0aGUgbWluaW11bSBhbmQgbWF4aW11bSB5ZWFyDQptaW5feWVhciA8LSBtaW4oY3VtdWxhdGl2ZV9kYXRhJERhdGUsIG5hLnJtID0gVFJVRSkNCm1heF95ZWFyIDwtIG1heChjdW11bGF0aXZlX2RhdGEkRGF0ZSwgbmEucm0gPSBUUlVFKQ0KaW50ZXJhY3RpdmVfcHJpbnQobWluX3llYXIpDQppbnRlcmFjdGl2ZV9wcmludChtYXhfeWVhcikNCg0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiMjIFBMT1QgRlVMTCBXSVRIT1VUIExJTUlUUw0KDQojIERlZmluZSBzdGFydCBhbmQgZW5kIHllYXJzDQpzdGFydF95ZWFyIDwtIDIwMTcNCmVuZF95ZWFyIDwtIDIwMjQNCnllYXJfcmFuZ2UgPC0gZW5kX3llYXIgLSBzdGFydF95ZWFyICsgMSAgIyBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiB5ZWFycw0KDQojIERlZmluZSBicmVha3Mgcm91bmRlZCBhcHByb3ByaWF0ZWx5DQpsaW1pdHNfc3RhcnRfeWVhciA8LSBmbG9vcihzdGFydF95ZWFyIC8gMikgKiAyICAjIFJvdW5kIGRvd24gdG8gdGhlIG5lYXJlc3QgbXVsdGlwbGUgb2YgMg0KbGltaXRzX2VuZF95ZWFyIDwtIGNlaWxpbmcoZW5kX3llYXIgLyAyKSAqIDIgICAjIFJvdW5kIHVwIHRvIHRoZSBuZWFyZXN0IG11bHRpcGxlIG9mIDINCg0KIyBDcmVhdGUgZHluYW1pYyB0aXRsZSBhbmQgY2FwdGlvbg0KZHluYW1pY190aXRsZSA8LSBwYXN0ZTAoIkN1bXVsYXRpdmUgR3Jvd3RoIEJ5IEluZGV4IE92ZXIgIiwgeWVhcl9yYW5nZSAtIDEsICIgWWVhcnMgKCIsIHN0YXJ0X3llYXIsICItIiwgZW5kX3llYXIsICIpIikNCmR5bmFtaWNfY2FwdGlvbiA8LSBwYXN0ZTAoIkN1bXVsYXRpdmUgR3Jvd3RoIEJ5IEluZGV4LCBEYXRhIFBlcmlvZCAoIiwgc3RhcnRfeWVhciwgIi0iLCBlbmRfeWVhciwgIikiKQ0KDQojIENyZWF0ZSB0aGUgZnVsbCwgbm9uLWZpbHRlcmVkIHgtYXhpcyBwbG90IHdpdGggZHluYW1pYyB4IHBsYWNlbWVudCBmb3IgYW5ub3RhdGlvbnMNCnAxIDwtIGdncGxvdChucnRfbG9uZywgYWVzKHggPSBhcy5pbnRlZ2VyKERhdGUpLCB5ID0gQ0dfVmFsdWUsIGNvbG9yID0gQ0dfSW5kZXgpKSArDQoNCiAgIyBBZGQgc2hhZGVkIGFyZWFzIGZvciBiYWNrZ3JvdW5kIGVmZmVjdA0KICBnZW9tX3JlY3QoYWVzKHhtaW4gPSAtSW5mLCB4bWF4ID0gSW5mLCB5bWluID0gMTAwLCB5bWF4ID0gSW5mKSwgZmlsbCA9ICJsaWdodGdyZWVuIiwgYWxwaGEgPSAwLjAzMCkgKw0KICBnZW9tX3JlY3QoYWVzKHhtaW4gPSAtSW5mLCB4bWF4ID0gSW5mLCB5bWluID0gLUluZiwgeW1heCA9IDEwMCksIGZpbGwgPSAibGlnaHRjb3JhbCIsIGFscGhhID0gMC4wMzApICsNCiAgDQogICMgUGxvdCBsaW5lcyBmb3IgZWFjaCBDRyBJbmRleA0KICBnZW9tX2xpbmUoc2l6ZSA9IDEuMjUsIGFscGhhID0gMy4wKSArICAgICAgICMgTGluZSBmb3IgZWFjaCBDRw0KICBnZW9tX3BvaW50KHNpemUgPSAyLjAsIGFscGhhID0gMy4wKSArICAgICAgICMgUG9pbnRzIGZvciBlYWNoIENHDQoNCiAgbGFicygNCiAgICB0aXRsZSA9IGR5bmFtaWNfdGl0bGUsDQogICAgeCA9ICJZZWFyIiwNCiAgICB5ID0gIkNHIFZhbHVlICgxJCAvIDElKSIsDQogICAgY29sb3IgPSAiQ0cgSW5kZXgiLA0KICAgIGNhcHRpb24gPSBkeW5hbWljX2NhcHRpb24NCiAgICApICsNCiAgDQogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjdXN0b21fY29sb3JzKSArICAjIFNldCBjb2xvcnMgZm9yIGVhY2ggQ0cgSW5kZXgNCiAgc2NhbGVfeF9jb250aW51b3VzKA0KICAgIGxpbWl0cyA9IGMoc3RhcnRfeWVhciwgZW5kX3llYXIpLCANCiAgICBicmVha3MgPSBzZXEobGltaXRzX3N0YXJ0X3llYXIsIGxpbWl0c19lbmRfeWVhciwgMikgICMgUmVzdHJpY3QgJiBTZXQgTWFqb3IgeC1heGlzIGxpbmVzIGZvciBlYWNoIHllYXINCiAgKSArIA0KICANCiAgdGhlbWVfbWluaW1hbCgpICsNCiAgdGhlbWUoDQogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSwgc2l6ZSA9IDIwKSwgICAgICAgICAjIExhcmdlciB0aXRsZSBmb250DQogICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCksICAgICAgICAgICAgICAgICAgICAjIExhcmdlciB4LWF4aXMgbGFiZWwgZm9udA0KICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQpLCAgICAgICAgICAgICAgICAgICAgIyBMYXJnZXIgeS1heGlzIGxhYmVsIGZvbnQNCiAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEsIHNpemUgPSAxNCksICAjIExhcmdlciB4LWF4aXMgdGV4dA0KICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCksICAgICAgICAgICAgICAgICAgICAgIyBMYXJnZXIgeS1heGlzIHRleHQNCiAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0KSwgICAgICAgICAgICAgICAgICAgICMgTGVnZW5kIHRpdGxlIHNpemUNCiAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIpLCAgICAgICAgICAgICAgICAgICAgICMgTGVnZW5kIHRleHQgc2l6ZQ0KICAgIHBhbmVsLmdyaWQubWFqb3IgPSBlbGVtZW50X2xpbmUobGluZXR5cGUgPSAiZG90dGVkIiwgY29sb3IgPSAiYmxhY2siKSwgICMgTWFqb3IgZ3JpZCBsaW5lcw0KICAgIHBhbmVsLmdyaWQubWlub3IueCA9IGVsZW1lbnRfYmxhbmsoKSwgICAgICAgICAgICAgICAgICAgICAgIyBObyBtaW5vciB4IGdyaWQgbGluZXMNCiAgICBheGlzLnRpY2tzLmxlbmd0aCA9IHVuaXQoLTAuMjUsICJjbSIpLCAgICAgICAgICAgICAgICAgICAgICAjIEluY3JlYXNlIHRpY2sgbGVuZ3RoDQogICAgYXhpcy50aWNrcyA9IGVsZW1lbnRfbGluZShjb2xvciA9ICJibGFjayIsIHNpemUgPSAwLjUwKSwgICAjIERhcmtlciB0aWNrcw0KICAgIGF4aXMubGluZS54ID0gZWxlbWVudF9saW5lKGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDAuNzUpLCAgIyBEYXJrIGJvdHRvbSBib3JkZXINCiAgICBheGlzLmxpbmUueSA9IGVsZW1lbnRfbGluZShjb2xvciA9ICJibGFjayIsIHNpemUgPSAwLjc1KSAgICMgRGFyayBsZWZ0IGJvcmRlcg0KICApDQoNCiMgUHJpbnQgdGhlIHBsb3QgDQpwcmludChwMSkNCg0KDQpgYGANCg0KUVFRIGRlbW9uc3RyYXRlcyB0aGUgaGlnaGVzdCBjdW11bGF0aXZlIGdyb3d0aCwgcmVmbGVjdGluZyBpdHMgdGVjaC1oZWF2eSBjb21wb3NpdGlvbiBhbmQgaGlnaGVyIHJpc2stcmV3YXJkIHByb2ZpbGUsIHdoaWxlIFNQWCBzaG93cyBzdGVhZHksIG1vZGVyYXRlIGdyb3d0aCwgY29uc2lzdGVudCB3aXRoIGl0cyBicm9hZGVyIG1hcmtldCByZXByZXNlbnRhdGlvbi4gSW4gY29udHJhc3QsIEJsYWNrUm9jayBleGhpYml0cyB0aGUgbW9zdCBjb25zZXJ2YXRpdmUgZ3Jvd3RoLCBsaWtlbHkgZHVlIHRvIGl0cyBmb2N1cyBvbiBsb3dlci1yaXNrIHN0cmF0ZWdpZXMgb3IgZGl2ZXJzaWZpZWQgcG9ydGZvbGlvcy4gU2luY2UgYHIgc3RhcnRfeWVhcmAsIFFRUSBoYXMgbWFpbnRhaW5lZCBkb21pbmFuY2Ugb24gYSBjdW11bGF0aXZlIGJhc2lzLiBUaGlzIGNvbXBhcmlzb24gaGlnaGxpZ2h0cyB0aGUgdmFyeWluZyByaXNrLXJldHVybiBkeW5hbWljcyBvZiB0aGUgaW5kZXhlcywgd2l0aCBRUVEgb2ZmZXJpbmcgYWdncmVzc2l2ZSBncm93dGggcG90ZW50aWFsIGFuZCBCbGFja1JvY2sgY2F0ZXJpbmcgdG8gc3RhYmlsaXR5LWZvY3VzZWQgaW52ZXN0b3JzLg0KDQojIFNQWCBWUyBRUVENCg0KIyMgQW5udWFsIEdSDQoNCiMjIyBEYXRhDQoNCg0KYGBge3IgaW5kZXhfY29tcGFyaXNvbl9ncl92MiwgZXZhbD1UUlVFLCBlY2hvPUZBTFNFfQ0KDQppbnRlcmFjdGl2ZV9zdHIoc3B4X3JhdykNCmludGVyYWN0aXZlX3N0cihxcXFfcmF3KQ0KDQppbnRlcmFjdGl2ZV9wcmludChzcHhfcmF3KQ0KaW50ZXJhY3RpdmVfcHJpbnQocXFxX3JhdykNCg0KbWluX3llYXIgPC0gbWluKHNweF9yYXckRGF0ZSkNCm1heF95ZWFyIDwtIG1heChzcHhfcmF3JERhdGUpDQppbnRlcmFjdGl2ZV9wcmludChtaW5feWVhcikNCmludGVyYWN0aXZlX3ByaW50KG1heF95ZWFyKQ0KDQptaW5feWVhciA8LSBtaW4ocXFxX3JhdyREYXRlKQ0KbWF4X3llYXIgPC0gbWF4KHFxcV9yYXckRGF0ZSkNCmludGVyYWN0aXZlX3ByaW50KG1pbl95ZWFyKQ0KaW50ZXJhY3RpdmVfcHJpbnQobWF4X3llYXIpDQoNCiMgRmlsdGVyIGRhdGEgZm9yIHRoZSBtYXRjaGluZyBkYXRlIHJhbmdlDQptYXRjaGluZ19kYXRlcyA8LSBSZWR1Y2UoaW50ZXJzZWN0LCBsaXN0KHFxcV9yYXckRGF0ZSwgcXFxX3JhdyREYXRlKSkNCiMgR2V0IHRoZSBvbGRlc3QgbWF0Y2hpbmcgZGF0ZQ0KaWYgKGxlbmd0aChtYXRjaGluZ19kYXRlcykgPiAwKSB7DQogIG9sZGVzdF9tYXRjaGluZ19kYXRlIDwtIG1pbihtYXRjaGluZ19kYXRlcykNCiAgaW50ZXJhY3RpdmVfY2F0KCJPbGRlc3QgbWF0Y2hpbmcgZGF0ZToiLCBvbGRlc3RfbWF0Y2hpbmdfZGF0ZSwgIlxuIikNCn0gZWxzZSB7DQogIGludGVyYWN0aXZlX2NhdCgiTm8gbWF0Y2hpbmcgZGF0ZXMgZm91bmQgYW1vbmcgdGhlIHRocmVlIGRhdGFzZXRzLlxuIikNCn0NCg0Kc3RhcnRfeWVhciA8LSBvbGRlc3RfbWF0Y2hpbmdfZGF0ZSArIDENCiMgZW5kX3llYXIgPC0gMjAyNA0KZW5kX3llYXIgPC0gYXMubnVtZXJpYyhmb3JtYXQoU3lzLkRhdGUoKSwgIiVZIikpDQoNCnNweF9maWx0ZXJlZCA8LSBzdWJzZXQoc3B4X3JhdywgRGF0ZSA+PSBzdGFydF95ZWFyICYgRGF0ZSA8PSBlbmRfeWVhciwgc2VsZWN0ID0gYyhEYXRlLCBgMS1ZZWFyIENBR1JgKSkNCnFxcV9maWx0ZXJlZCA8LSBzdWJzZXQocXFxX3JhdywgRGF0ZSA+PSBzdGFydF95ZWFyICYgRGF0ZSA8PSBlbmRfeWVhciwgc2VsZWN0ID0gYyhEYXRlLCBgMS1ZZWFyIENBR1JgKSkNCg0KIyBSZW5hbWUgY29sdW1ucyBmb3IgY2xhcml0eQ0KY29sbmFtZXMoc3B4X2ZpbHRlcmVkKVtjb2xuYW1lcyhzcHhfZmlsdGVyZWQpID09ICIxLVllYXIgQ0FHUiJdIDwtICJTUFgiDQpjb2xuYW1lcyhxcXFfZmlsdGVyZWQpW2NvbG5hbWVzKHFxcV9maWx0ZXJlZCkgPT0gIjEtWWVhciBDQUdSIl0gPC0gIlFRUSINCg0KIyBNZXJnZSBkYXRhc2V0cyBieSBEYXRlIChZZWFyKQ0KbWVyZ2VkX2RhdGEgPC0gbWVyZ2Uoc3B4X2ZpbHRlcmVkLCBxcXFfZmlsdGVyZWQsIGJ5ID0gIkRhdGUiKQ0KDQojIFNvcnQgYnkgRGF0ZSBpbiBkZXNjZW5kaW5nIG9yZGVyIChtb3N0IHJlY2VudCB5ZWFyIGZpcnN0KQ0KbWVyZ2VkX2RhdGEgPC0gbWVyZ2VkX2RhdGFbb3JkZXIoLW1lcmdlZF9kYXRhJERhdGUpLCBdDQoNCiMgRm9ybWF0IHRoZSBtZXJnZWQgZGF0YQ0KbWVyZ2VkX2RhdGEkRGF0ZSA8LSBhcy5jaGFyYWN0ZXIobWVyZ2VkX2RhdGEkRGF0ZSkgICMgRW5zdXJlIERhdGUgaXMgYSBjaGFyYWN0ZXIgd2l0aG91dCBjb21tYXMNCm1lcmdlZF9kYXRhJGBTUFhgIDwtIHBhc3RlMChmb3JtYXRDKG1lcmdlZF9kYXRhJGBTUFhgLCBmb3JtYXQgPSAiZiIsIGRpZ2l0cyA9IDIpLCAiJSIpDQptZXJnZWRfZGF0YSRRUVEgPC0gcGFzdGUwKGZvcm1hdEMobWVyZ2VkX2RhdGEkUVFRLCBmb3JtYXQgPSAiZiIsIGRpZ2l0cyA9IDIpLCAiJSIpDQoNCiMgRGlzcGxheSBmb3JtYXR0ZWQgdGFibGUNCmNhdCgiXG5cbiMjIyMgQW5udWFsIEdyb3d0aCBSYXRlcyBCeSBJbmRleCAoIiwgc3RhcnRfeWVhciwgIi0iLCBlbmRfeWVhciwgIilcbiIsIHNlcCA9ICIiKQ0KaW50ZXJhY3RpdmVfcHJpbnQobWVyZ2VkX2RhdGEpDQppbnRlcmFjdGl2ZV9zdHIobWVyZ2VkX2RhdGEpDQpmb3JtYXRfZXF1YWxfd2lkdGgobWVyZ2VkX2RhdGEpDQoNCiMjIFNhdmUgRGF0YWZyYW1lIHVzaW5nIGZ1bmN0aW9uIA0KIyBEZWZpbmUgcGFyYW1ldGVycw0KaW5kZXhfMSA8LSAic3B4Ig0KaW5kZXhfMiA8LSAicXFxIg0Kc3RhcnRfeWVhciA8LSBzdGFydF95ZWFyDQplbmRfeWVhciA8LSBlbmRfeWVhcg0KDQojIFVzZSB0aGUgZnVuY3Rpb24gdG8gc2F2ZSB0aGUgZGF0YWZyYW1lDQpzYXZlX2RhdGFmcmFtZV9pbmRleF8xX2luZGV4XzJfc3RhcnRfeWVhcl9lbmRfeWVhcihtZXJnZWRfZGF0YSwgaW5kZXhfMSwgaW5kZXhfMiwgc3RhcnRfeWVhciwgZW5kX3llYXIpDQpzYXZlX2RhdGFmcmFtZV9pbmRleF8xX2luZGV4XzIobWVyZ2VkX2RhdGEsIGluZGV4XzEsIGluZGV4XzIpDQoNCiMgQWNjZXNzIHRoZSBzYXZlZCB2YXJpYWJsZSBkaXJlY3RseQ0KaW50ZXJhY3RpdmVfY2F0KCJEYXRhZnJhbWUgc2F2ZWQgYXMgdmFyaWFibGU6IiwgcGFzdGUwKCJtZXJnZWRfZGF0YV8iLCBpbmRleF8xLCAiXyIsIGluZGV4XzIsICJfcyIsIHN0YXJ0X3llYXIsICJfZSIsIGVuZF95ZWFyKSwgIlxuIikNCmludGVyYWN0aXZlX2NhdCgiRGF0YWZyYW1lIHNhdmVkIGFzIHZhcmlhYmxlOiIsIHBhc3RlMCgibWVyZ2VkX2RhdGFfIiwgaW5kZXhfMSwgIl8iLCBpbmRleF8yKSkNCg0KYGBgDQoNCkRhdGEgYmVnaW5zIHdpdGggYHIgc3RhcnRfeWVhcmAsIGRldGVybWluZWQgYnkgdGhlIGluZGV4IHdpdGggdGhlIGxlYXN0IGhpc3RvcmljYWwgZGF0YSBmb3IgY29uc2lzdGVudCBjb21wYXJpc29uIGFjcm9zcyBhbGwgaW5kZXhlcy4NCg0KIyMjIFN1bW1hcnkNCg0KYGBge3IgaW5kZXhfY29tcGFyaXNvbl9ncl92Ml9zdW1tYXJ5LCBldmFsPVRSVUUsIGVjaG89RkFMU0V9DQoNCiMgTG9hZCBuZWNlc3NhcnkgbGlicmFyeQ0KbGlicmFyeShkcGx5cikNCg0KIyBSZW1vdmUgcGVyY2VudGFnZSBzaWducyBhbmQgY29udmVydCBjb2x1bW5zIHRvIG51bWVyaWMNCm1lcmdlZF9kYXRhX2NsZWFuIDwtIG1lcmdlZF9kYXRhDQptZXJnZWRfZGF0YV9jbGVhblsyOjNdIDwtIGxhcHBseShtZXJnZWRfZGF0YVsyOjNdLCBmdW5jdGlvbih4KSBhcy5udW1lcmljKGdzdWIoIiUiLCAiIiwgeCkpKQ0KDQojIEZpbmQgdGhlIG1pbmltdW0gYW5kIG1heGltdW0geWVhcg0KbWluX3llYXIgPC0gbWluKG1lcmdlZF9kYXRhJERhdGUsIG5hLnJtID0gVFJVRSkNCm1heF95ZWFyIDwtIG1heChtZXJnZWRfZGF0YSREYXRlLCBuYS5ybSA9IFRSVUUpDQppbnRlcmFjdGl2ZV9wcmludChtaW5feWVhcikNCmludGVyYWN0aXZlX3ByaW50KG1heF95ZWFyKQ0KDQojIERlZmluZSB0aGUgbWV0cmljcyB0byBjYWxjdWxhdGUsIGluY2x1ZGluZyBDQUdSDQptZXRyaWNzIDwtIGMoDQogICJDQUdSIiwgDQogICJNZWFuIiwgDQogICJNZWRpYW4iLCANCiAgIlN0YW5kYXJkIERldmlhdGlvbiAoVm9sYXRpbGl0eSkiLCANCiAgIk1pbiBDQUdSIFJhbmdlIChDQUdSIC0gU0QpIiwgDQogICJNYXggQ0FHUiBSYW5nZSAoQ0FHUiArIFNEKSIsIA0KICAiTWluIiwgDQogICJNYXgiLCANCiAgIlBlcmNlbnQgQWJvdmUgSW5mbGF0aW9uIFRhcmdldCIsIA0KICAiUGVyY2VudCBBYm92ZSBDb25zZXJ2YXRpdmUgVGFyZ2V0IiwgDQogICJQZXJjZW50IEFib3ZlIE1vZGVyYXRlIFRhcmdldCIsIA0KICAiUGVyY2VudCBBYm92ZSBBZ2dyZXNzaXZlIFRhcmdldCINCikNCg0KIyBEZWZpbmUgdGhlIENBR1IgY2FsY3VsYXRpb24NCmNhbGN1bGF0ZV9jYWdyIDwtIGZ1bmN0aW9uKGNvbCkgew0KICBzdGFydF92YWwgPC0gMSAgIyBGaXJzdCB5ZWFyIHZhbHVlDQogIGVuZF92YWwgPC0gcHJvZCgxICsgY29sIC8gMTAwLCBuYS5ybSA9IFRSVUUpICAjIFByb2R1Y3Qgb2YgZ3Jvd3RoIGZhY3RvcnMNCiAgeWVhcnMgPC0gbnJvdyhtZXJnZWRfZGF0YV9jbGVhbikNCiAgKChlbmRfdmFsIC8gc3RhcnRfdmFsKV4oMSAvIHllYXJzKSAtIDEpICogMTAwICAjIENBR1IgZm9ybXVsYQ0KfQ0KDQojIENhbGN1bGF0ZSBtZXRyaWNzIGR5bmFtaWNhbGx5IGZvciBhbGwgbnVtZXJpYyBjb2x1bW5zDQpjYWxjdWxhdGVkX21ldHJpY3MgPC0gc2FwcGx5KG1lcmdlZF9kYXRhX2NsZWFuWzI6M10sIGZ1bmN0aW9uKGNvbCkgew0KICBtZWFuX3ZhbCA8LSBtZWFuKGNvbCwgbmEucm0gPSBUUlVFKQ0KICBzZF92YWwgPC0gc2QoY29sLCBuYS5ybSA9IFRSVUUpDQogIHBlcmNlbnRfYWJvdmUgPC0gZnVuY3Rpb24odGFyZ2V0KSBtZWFuKGNvbCA+IHRhcmdldCwgbmEucm0gPSBUUlVFKSAqIDEwMA0KICANCiAgYygNCiAgICBgQ0FHUmAgPSBjYWxjdWxhdGVfY2Fncihjb2wpLA0KICAgIE1lYW4gPSBtZWFuX3ZhbCwNCiAgICBNZWRpYW4gPSBtZWRpYW4oY29sLCBuYS5ybSA9IFRSVUUpLA0KICAgIGBTdGFuZGFyZCBEZXZpYXRpb24gKFZvbGF0aWxpdHkpYCA9IHNkX3ZhbCwNCiAgICBgTWluIENBR1IgUmFuZ2UgKENBR1IgLSBTRClgID0gbWVhbl92YWwgLSBzZF92YWwsDQogICAgYE1heCBDQUdSIFJhbmdlIChDQUdSICsgU0QpYCA9IG1lYW5fdmFsICsgc2RfdmFsLA0KICAgIE1pbiA9IG1pbihjb2wsIG5hLnJtID0gVFJVRSksDQogICAgTWF4ID0gbWF4KGNvbCwgbmEucm0gPSBUUlVFKSwNCiAgICBgUGVyY2VudCBBYm92ZSBJbmZsYXRpb24gVGFyZ2V0YCA9IHBlcmNlbnRfYWJvdmUodGFyZ2V0X2luZmxhdGlvbiksICAjIEV4YW1wbGUgaW5mbGF0aW9uIHRhcmdldDogMiUNCiAgICBgUGVyY2VudCBBYm92ZSBDb25zZXJ2YXRpdmUgVGFyZ2V0YCA9IHBlcmNlbnRfYWJvdmUodGFyZ2V0X2NvbnNlcnZhdGl2ZSksDQogICAgYFBlcmNlbnQgQWJvdmUgTW9kZXJhdGUgVGFyZ2V0YCA9IHBlcmNlbnRfYWJvdmUodGFyZ2V0X21vZGVyYXRlKSwNCiAgICBgUGVyY2VudCBBYm92ZSBBZ2dyZXNzaXZlIFRhcmdldGAgPSBwZXJjZW50X2Fib3ZlKHRhcmdldF9hZ2dyZXNzaXZlKQ0KICApDQp9KQ0KDQojIFRyYW5zcG9zZSB0aGUgcmVzdWx0IGFuZCBhZGQgdGhlIE1ldHJpYyBjb2x1bW4NCmN1c3RvbV9zdW1tYXJ5IDwtIGRhdGEuZnJhbWUoDQogIE1ldHJpYyA9IG1ldHJpY3MsDQogIGNhbGN1bGF0ZWRfbWV0cmljcw0KKQ0KDQojIFJlbmFtZSBjb2x1bW5zIHRvIHJldGFpbiB0aGUgb3JpZ2luYWwgY29sdW1uIG5hbWVzIGR5bmFtaWNhbGx5DQpjb2xuYW1lcyhjdXN0b21fc3VtbWFyeSlbLTFdIDwtIGNvbG5hbWVzKG1lcmdlZF9kYXRhKVsyOjNdDQoNCiMgQWRkIHBlcmNlbnRhZ2Ugc2lnbnMgYmFjayB0byBhbGwgbnVtZXJpYyB2YWx1ZXMNCmN1c3RvbV9zdW1tYXJ5Wy0xXSA8LSBsYXBwbHkoY3VzdG9tX3N1bW1hcnlbLTFdLCBmdW5jdGlvbih4KSBwYXN0ZTAoZm9ybWF0Qyh4LCBmb3JtYXQgPSAiZiIsIGRpZ2l0cyA9IDIpLCAiJSIpKQ0KDQojIFJlbW92ZSByb3cgbmFtZXMNCnJvd25hbWVzKGN1c3RvbV9zdW1tYXJ5KSA8LSBOVUxMDQoNCiMgUHJpbnQgdGhlIGZpbmFsIHN1bW1hcnkNCiMgRGlzcGxheSBmb3JtYXR0ZWQgdGFibGUNCmNhdCgiXG5cbiMjIyMgQW5udWFsIEdyb3d0aCBSYXRlcyBTdW1tYXJ5IEJ5IEluZGV4ICgiLCBzdGFydF95ZWFyLCAiLSIsIGVuZF95ZWFyLCAiKVxuIiwgc2VwID0gIiIpDQoNCmludGVyYWN0aXZlX3ByaW50KGN1c3RvbV9zdW1tYXJ5KQ0KZm9ybWF0XzNjb2xfY3VzdG9tX3dpZHRocyhjdXN0b21fc3VtbWFyeSwgY29sMV93aWR0aCA9ICIyMGVtIiwgY29sMl93aWR0aCA9ICIxNWVtIiwgY29sM193aWR0aCA9ICIxNWVtIikNCg0KDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KIyMgU0FWRSBWQUxVRVMgRk9SIElOLUxJTkUgQ09ERQ0KDQojIERlZmluZSB0aGUgbWFwcGluZyBvZiByb3cgbmFtZXMgdG8gdmFyaWFibGUgbmFtZXMNCnJvd190b192YXJfbmFtZSA8LSBjKA0KICAiQ0FHUiIgPSAiY2Fncl92YWx1ZSIsDQogICJNZWFuIiA9ICJtZWFuX3ZhbHVlIiwNCiAgIk1lZGlhbiIgPSAibWVkaWFuX3ZhbHVlIiwNCiAgIlN0YW5kYXJkIERldmlhdGlvbiAoVm9sYXRpbGl0eSkiID0gInNkX3ZhbHVlIiwNCiAgIk1pbiBDQUdSIFJhbmdlIChDQUdSIC0gU0QpIiA9ICJtaW5fY2Fncl9yYW5nZSIsDQogICJNYXggQ0FHUiBSYW5nZSAoQ0FHUiArIFNEKSIgPSAibWF4X2NhZ3JfcmFuZ2UiLA0KICAiTWluIiA9ICJtaW5fdmFsdWUiLA0KICAiTWF4IiA9ICJtYXhfdmFsdWUiLA0KICAiUGVyY2VudCBBYm92ZSBJbmZsYXRpb24gVGFyZ2V0IiA9ICJwZXJjZW50X2Fib3ZlX3RhcmdldF9pbmZsYXRpb24iLA0KICAiUGVyY2VudCBBYm92ZSBDb25zZXJ2YXRpdmUgVGFyZ2V0IiA9ICJwZXJjZW50X2Fib3ZlX3RhcmdldF9jb25zZXJ2YXRpdmUiLA0KICAiUGVyY2VudCBBYm92ZSBNb2RlcmF0ZSBUYXJnZXQiID0gInBlcmNlbnRfYWJvdmVfdGFyZ2V0X21vZGVyYXRlIiwNCiAgIlBlcmNlbnQgQWJvdmUgQWdncmVzc2l2ZSBUYXJnZXQiID0gInBlcmNlbnRfYWJvdmVfdGFyZ2V0X2FnZ3Jlc3NpdmUiDQopDQoNCiMgRGVmaW5lIGEgY3VzdG9tIG1hcHBpbmcgZm9yIGNvbHVtbiBuYW1lcw0KY29sdW1uX25hbWVfbWFwcGluZyA8LSBjKA0KICAiU1BYIiA9ICJzcHgiLA0KICAiUVFRIiA9ICJxcXEiDQopDQoNCiMgRnVuY3Rpb24gdG8gc2F2ZSBzdW1tYXJ5IHZhbHVlcyBkeW5hbWljYWxseSB3aXRoIGNvbHVtbiBuYW1lIG1hcHBpbmcNCnNhdmVfY29sdW1uX3ZhbHVlcyA8LSBmdW5jdGlvbihzdW1tYXJ5X2RmLCByb3dfbWFwcGluZywgY29sdW1uX21hcHBpbmcpIHsNCiAgIyBHZXQgdGhlIGNvbHVtbiBuYW1lcyBpbiB0aGUgZGF0YSBmcmFtZQ0KICBjb2x1bW5zX3RvX3NhdmUgPC0gc2V0ZGlmZihuYW1lcyhzdW1tYXJ5X2RmKSwgYygiTWV0cmljIikpICAjIEV4Y2x1ZGUgdGhlIE1ldHJpYyBjb2x1bW4NCiAgDQogICMgSXRlcmF0ZSBvdmVyIGVhY2ggY29sdW1uDQogIGZvciAoY29sIGluIGNvbHVtbnNfdG9fc2F2ZSkgew0KICAgICMgVXNlIHRoZSBjdXN0b20gbWFwcGluZyB0byBnZXQgdGhlIGFwcHJvcHJpYXRlIGNvbHVtbiBuYW1lDQogICAgY29sX25hbWUgPC0gY29sdW1uX21hcHBpbmdbW2NvbF1dICV8fCUgdG9sb3dlcihnc3ViKCJbXmEtekEtWjAtOV0iLCAiXyIsIGNvbCkpDQogICAgDQogICAgIyBFeHRyYWN0IHZhbHVlcyBmb3IgdGhlIGN1cnJlbnQgY29sdW1uDQogICAgY29sX3ZhbHVlcyA8LSBzdW1tYXJ5X2RmW1tjb2xdXQ0KICAgIA0KICAgICMgSXRlcmF0ZSBvdmVyIHJvd3MgdG8gc2F2ZSBlYWNoIHZhbHVlIGR5bmFtaWNhbGx5DQogICAgZm9yIChpIGluIHNlcV9hbG9uZyhjb2xfdmFsdWVzKSkgew0KICAgICAgIyBHZXQgdGhlIGNvcnJlc3BvbmRpbmcgdmFyaWFibGUgbmFtZSBmcm9tIHRoZSBtYXBwaW5nDQogICAgICBzdGF0X25hbWUgPC0gcm93X21hcHBpbmdbc3VtbWFyeV9kZiRNZXRyaWNbaV1dDQogICAgICANCiAgICAgIGlmICghaXMubmEoc3RhdF9uYW1lKSkgeyAgIyBTa2lwIGlmIG5vIG1hcHBpbmcgaXMgZGVmaW5lZA0KICAgICAgICAjIENyZWF0ZSB0aGUgdmFyaWFibGUgbmFtZQ0KICAgICAgICB2YXJfbmFtZSA8LSBwYXN0ZTAoc3RhdF9uYW1lLCAiXyIsIGNvbF9uYW1lKQ0KICAgICAgICANCiAgICAgICAgIyBBdHRlbXB0IG51bWVyaWMgY29udmVyc2lvbiBmb3IgZG93bnN0cmVhbSB1c2UNCiAgICAgICAgdmFsdWUgPC0gc3VwcHJlc3NXYXJuaW5ncyhhcy5udW1lcmljKGdzdWIoIiUiLCAiIiwgY29sX3ZhbHVlc1tpXSkpKQ0KICAgICAgICANCiAgICAgICAgIyBBc3NpZ24gdGhlIHZhbHVlIHRvIHRoZSBnbG9iYWwgZW52aXJvbm1lbnQNCiAgICAgICAgYXNzaWduKHZhcl9uYW1lLCB2YWx1ZSwgZW52aXIgPSAuR2xvYmFsRW52KQ0KICAgICAgfQ0KICAgIH0NCiAgfQ0KfQ0KDQojIEFwcGx5IHRoZSBmdW5jdGlvbiB0byBzYXZlIHZhbHVlcyBkeW5hbWljYWxseQ0Kc2F2ZV9jb2x1bW5fdmFsdWVzKGN1c3RvbV9zdW1tYXJ5LCByb3dfdG9fdmFyX25hbWUsIGNvbHVtbl9uYW1lX21hcHBpbmcpDQoNCiMgRXhhbXBsZTogQWNjZXNzaW5nIGR5bmFtaWNhbGx5IGNyZWF0ZWQgdmFyaWFibGVzDQppbnRlcmFjdGl2ZV9wYXN0ZSgiU1BYIE1lYW46ICIsIG1lYW5fdmFsdWVfc3B4KSAgIyBTaG91bGQgcHJpbnQgdGhlIG1lYW4gdmFsdWUgZm9yIFNQWA0KaW50ZXJhY3RpdmVfcHJpbnQocGVyY2VudF9hYm92ZV90YXJnZXRfYWdncmVzc2l2ZV9xcXEpICAjIFNob3VsZCBwcmludCB0aGUgcGVyY2VudCBhYm92ZSBhZ2dyZXNzaXZlIHRhcmdldCBmb3IgUVFRDQoNCg0KYGBgDQoNCioqQ29tcGFyaXNvbiBpbiBBbm51YWwgR3Jvd3RoIFJhdGVzIG9mIEluZGV4ZXMgKFNQWCBhbmQgUVFRKSBPdmVyIGByIGVuZF95ZWFyIC0gc3RhcnRfeWVhciArIDFgIFllYXJzIChgciBzdGFydF95ZWFyYC1gciBlbmRfeWVhcmApKio6IFFRUSBleGhpYml0cyB0aGUgaGlnaGVzdCBtZWFuIHJldHVybiBhdCBgciBtZWFuX3ZhbHVlX3FxcWAlLCBzdXJwYXNzaW5nIFNQWCdzIGByIG1lYW5fdmFsdWVfc3B4YCUsIHJlZmxlY3RpbmcgaXRzIGFnZ3Jlc3NpdmUsIHRlY2gtZm9jdXNlZCBjb21wb3NpdGlvbi4gSXRzIENBR1Igb2YgYHIgY2Fncl92YWx1ZV9xcXFgJSBzaWduaWZpY2FudGx5IG91dHBhY2VzIFNQWCdzIGByIGNhZ3JfdmFsdWVfc3B4YCUsIGZ1cnRoZXIgZW1waGFzaXppbmcgUVFRJ3Mgc3Ryb25nIGdyb3d0aCBwb3RlbnRpYWwuIEhvd2V2ZXIsIFFRUSBhbHNvIGRlbW9uc3RyYXRlcyB0aGUgaGlnaGVzdCB2b2xhdGlsaXR5IHdpdGggYSBzdGFuZGFyZCBkZXZpYXRpb24gb2YgYHIgc2RfdmFsdWVfcXFxYCUsIGNvbXBhcmVkIHRvIGByIHNkX3ZhbHVlX3NweGAlIGZvciBTUFgsIHVuZGVyc2NvcmluZyBncmVhdGVyIHJpc2suIFRoZSByYW5nZSBvZiBleHBlY3RlZCByZXR1cm5zIChNZWFuIMKxIFNEKSBpcyB3aWRlc3QgZm9yIFFRUSAoYHIgbWluX2NhZ3JfcmFuZ2VfcXFxYCUgdG8gYHIgbWF4X2NhZ3JfcmFuZ2VfcXFxYCUpLiBNZWRpYW4gcmV0dXJucyBmdXJ0aGVyIHNob3djYXNlIFFRUSdzIGRvbWluYW5jZSAoYHIgbWVkaWFuX3ZhbHVlX3FxcWAlKSBvdmVyIFNQWCAoYHIgbWVkaWFuX3ZhbHVlX3NweGAlKS4gU1BYLCB0aG91Z2ggbGVzcyB2b2xhdGlsZSwgbGFncyBpbiBwZXJmb3JtYW5jZSB3aXRoIHRoZSBsb3dlc3QgbWF4aW11bSByZXR1cm4gKGByIG1heF92YWx1ZV9zcHhgJSkgYW5kIHRoZSBoaWdoZXN0IHBlcmNlbnRhZ2Ugb2YgeWVhcnMgYmVsb3cgaW5mbGF0aW9uIGFuZCBjb25zZXJ2YXRpdmUgdGFyZ2V0cywgbWVldGluZyB0aGUgYWdncmVzc2l2ZSBiZW5jaG1hcmsgb25seSBgciBwZXJjZW50X2Fib3ZlX3RhcmdldF9hZ2dyZXNzaXZlX3NweGAlIG9mIHRoZSB0aW1lIGNvbXBhcmVkIHRvIGByIHBlcmNlbnRfYWJvdmVfdGFyZ2V0X2FnZ3Jlc3NpdmVfcXFxYCUgZm9yIFFRUS4gVGhpcyBjb21wYXJpc29uIHVuZGVyc2NvcmVzIFFRUSdzIGFwcGVhbCBmb3IgZ3Jvd3RoLW9yaWVudGVkIGludmVzdG9ycyBkZXNwaXRlIGhpZ2hlciByaXNrLCB3aGlsZSBTUFggc3VpdHMgdGhvc2UgcHJpb3JpdGl6aW5nIHN0YWJpbGl0eS4NCg0KIyMjIEdyYXBoIA0KDQojIyMjIEFHUg0KYGBge3IgaW5kZXhfY29tcGFyaXNvbl9ncl92Ml9ncmFwaCwgZmlnLndpZHRoPTEwLCBmaWcuaGVpZ2h0PTcsIGV2YWw9VFJVRSwgZWNobz1GQUxTRX0NCg0KY2F0KCJcblxuIyMjIyBBbm51YWwgR3Jvd3RoIFJhdGVzIEJ5IEluZGV4IFxuIikNCg0KIyBMb2FkIG5lY2Vzc2FyeSBsaWJyYXJpZXMNCmxpYnJhcnkoZ2dwbG90MikNCmxpYnJhcnkoZHBseXIpDQoNCiMgQ29udmVydCBjb2x1bW5zIHRvIG51bWVyaWMgZm9yIHBsb3R0aW5nIGlmIG5lZWRlZA0KbWVyZ2VkX2RhdGEgPC0gbWVyZ2VkX2RhdGEgJT4lDQogIG11dGF0ZSgNCiAgICBgRGF0ZWAgPSBhcy5udW1lcmljKGFzLmNoYXJhY3RlcihgRGF0ZWApKSwgICMgRW5zdXJlIERhdGUgaXMgbnVtZXJpYw0KICAgIGBTUFhgID0gYXMubnVtZXJpYyhnc3ViKCIlIiwgIiIsIGBTUFhgKSksDQogICAgYFFRUWAgPSBhcy5udW1lcmljKGdzdWIoIiUiLCAiIiwgYFFRUWApKQ0KICApDQoNCiMgUmVzaGFwZSB0aGUgZGF0YSBpbnRvIGxvbmcgZm9ybWF0IGZvciBlYXN5IHBsb3R0aW5nIG9mIG11bHRpcGxlIGxpbmVzIGFuZCBzZXQgdGhlIGZhY3RvciBvcmRlcg0KbnJ0X2xvbmcgPC0gbWVyZ2VkX2RhdGEgJT4lDQogIHBpdm90X2xvbmdlcihjb2xzID0gYyhgU1BYYCwgYFFRUWApLA0KICAgICAgICAgICAgICAgbmFtZXNfdG8gPSAiQUdSX0luZGV4IiwNCiAgICAgICAgICAgICAgIHZhbHVlc190byA9ICJBR1JfVmFsdWUiKSAlPiUNCiAgbXV0YXRlKEFHUl9JbmRleCA9IGZhY3RvcihBR1JfSW5kZXgsIGxldmVscyA9IGMoIlNQWCIsICJRUVEiKSkpDQoNCiMgQXNzaWduIGNvbG9ycyBkeW5hbWljYWxseSBiYXNlZCBvbiB0aGUgb3JkZXIgb2YgQUdSX0luZGV4IGluIHRoZSBkYXRhDQojIE1hdGNoIHRoZSB1bmlxdWUgbGV2ZWxzIG9mIEFHUl9JbmRleCB3aXRoIGNvbG9ycyBmcm9tIGNvbG9yc19nZW5lcmFsX2RhcmsNCnVuaXF1ZV90eXBlcyA8LSB1bmlxdWUobnJ0X2xvbmckQUdSX0luZGV4KQ0KY3VzdG9tX2NvbG9ycyA8LSBzZXROYW1lcyhjb2xvcnNfZ2VuZXJhbF9kYXJrWzE6bGVuZ3RoKHVuaXF1ZV90eXBlcyldLCB1bmlxdWVfdHlwZXMpDQoNCiMgRmluZCB0aGUgbWluaW11bSBhbmQgbWF4aW11bSB4LXZhbHVlIGluIHlvdXIgZGF0YQ0KbWF4X3ggPC0gbWF4KGFzLmludGVnZXIobWVyZ2VkX2RhdGEkRGF0ZSksIG5hLnJtID0gVFJVRSkNCm1pbl94IDwtIG1pbihhcy5pbnRlZ2VyKG1lcmdlZF9kYXRhJERhdGUpLCBuYS5ybSA9IFRSVUUpDQppbnRlcmFjdGl2ZV9wcmludChtYXhfeCkgICMgVGVzdA0KaW50ZXJhY3RpdmVfcHJpbnQobWluX3gpICAjIFRlc3QNCg0KIyBGaW5kIHRoZSBtaW5pbXVtIGFuZCBtYXhpbXVtIHllYXINCm1pbl95ZWFyIDwtIG1pbihtZXJnZWRfZGF0YSREYXRlLCBuYS5ybSA9IFRSVUUpDQptYXhfeWVhciA8LSBtYXgobWVyZ2VkX2RhdGEkRGF0ZSwgbmEucm0gPSBUUlVFKQ0KaW50ZXJhY3RpdmVfcHJpbnQobWluX3llYXIpDQppbnRlcmFjdGl2ZV9wcmludChtYXhfeWVhcikNCg0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiMjIFBMT1QgRlVMTCBXSVRIT1VUIExJTUlUUw0KDQojIERlZmluZSBzdGFydCBhbmQgZW5kIHllYXJzDQpzdGFydF95ZWFyIDwtIGFzLm51bWVyaWMobWluX3llYXIpDQplbmRfeWVhciA8LSBtYXhfeWVhcg0KeWVhcl9yYW5nZSA8LSBlbmRfeWVhciAtIHN0YXJ0X3llYXIgKyAxICAjIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIHllYXJzDQoNCiMgRGVmaW5lIGJyZWFrcyByb3VuZGVkIGFwcHJvcHJpYXRlbHkNCmxpbWl0c19zdGFydF95ZWFyIDwtIGZsb29yKHN0YXJ0X3llYXIgLyAyKSAqIDIgICMgUm91bmQgZG93biB0byB0aGUgbmVhcmVzdCBtdWx0aXBsZSBvZiA1DQpsaW1pdHNfZW5kX3llYXIgPC0gY2VpbGluZyhlbmRfeWVhciAvIDIpICogMiAgICMgUm91bmQgdXAgdG8gdGhlIG5lYXJlc3QgbXVsdGlwbGUgb2YgNQ0KDQojIENyZWF0ZSBkeW5hbWljIHRpdGxlIGFuZCBjYXB0aW9uDQpkeW5hbWljX3RpdGxlIDwtIHBhc3RlMCgiQW5udWFsIEdyb3d0aCBSYXRlcyBCeSBJbmRleCBPdmVyICIsIHllYXJfcmFuZ2UsICIgWWVhcnMgKCIsIHN0YXJ0X3llYXIsICItIiwgZW5kX3llYXIsICIpIikNCmR5bmFtaWNfY2FwdGlvbiA8LSBwYXN0ZTAoIkFubnVhbCBHcm93dGggUmF0ZXMgQnkgSW5kZXgsIERhdGEgUGVyaW9kICgiLCBzdGFydF95ZWFyLCAiLSIsIGVuZF95ZWFyLCAiKSIpDQoNCiMgQ3JlYXRlIHRoZSBmdWxsLCBub24tZmlsdGVyZWQgeC1heGlzIHBsb3Qgd2l0aCBkeW5hbWljIHggcGxhY2VtZW50IGZvciBhbm5vdGF0aW9ucw0KcDEgPC0gZ2dwbG90KG5ydF9sb25nLCBhZXMoeCA9IGFzLmludGVnZXIoRGF0ZSksIHkgPSBBR1JfVmFsdWUsIGNvbG9yID0gQUdSX0luZGV4KSkgKw0KDQogICMgQWRkIHNoYWRlZCBhcmVhcyBmb3IgYmFja2dyb3VuZCBlZmZlY3QNCiAgZ2VvbV9yZWN0KGFlcyh4bWluID0gLUluZiwgeG1heCA9IEluZiwgeW1pbiA9IHRhcmdldF9hZ2dyZXNzaXZlLCB5bWF4ID0gSW5mKSwgZmlsbCA9ICJsaWdodGdyZWVuIiwgYWxwaGEgPSAwLjAzMCkgKw0KICBnZW9tX3JlY3QoYWVzKHhtaW4gPSAtSW5mLCB4bWF4ID0gSW5mLCB5bWluID0gdGFyZ2V0X2NvbnNlcnZhdGl2ZSwgeW1heCA9IHRhcmdldF9hZ2dyZXNzaXZlKSwgZmlsbCA9ICJvcmFuZ2UiLCBhbHBoYSA9IDAuMDMwKSArDQogIGdlb21fcmVjdChhZXMoeG1pbiA9IC1JbmYsIHhtYXggPSBJbmYsIHltaW4gPSAtSW5mLCB5bWF4ID0gdGFyZ2V0X2NvbnNlcnZhdGl2ZSksIGZpbGwgPSAibGlnaHRjb3JhbCIsIGFscGhhID0gMC4wMzApICsNCiAgDQogICMgUGxvdCBsaW5lcyBmb3IgZWFjaCBNYXJrZXQgSW5kZXgNCiAgZ2VvbV9saW5lKHNpemUgPSAxLjI1LCBhbHBoYSA9IDMuMCkgKyAgICAgICAjIExpbmUgZm9yIGVhY2ggQ0FHUg0KICBnZW9tX3BvaW50KHNpemUgPSAyLjAsIGFscGhhID0gMy4wKSArICAgICAgICMgUG9pbnRzIGZvciBlYWNoIENBR1INCiAgDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IHRhcmdldF9hZ2dyZXNzaXZlLCBjb2xvciA9ICJkYXJrYmx1ZSIsIGxpbmV0eXBlID0gInNvbGlkIikgKw0KICAjIGdlb21faGxpbmUoeWludGVyY2VwdCA9IHRhcmdldF9tb2RlcmF0ZSwgY29sb3IgPSAiZGFya2JsdWUiLCBsaW5ldHlwZSA9ICJzb2xpZCIpICsNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gdGFyZ2V0X2NvbnNlcnZhdGl2ZSwgY29sb3IgPSAiZGFya2JsdWUiLCBsaW5ldHlwZSA9ICJzb2xpZCIpICsNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gdGFyZ2V0X2luZmxhdGlvbiwgY29sb3IgPSAiZGFya3JlZCIsIGxpbmV0eXBlID0gImRhc2hlZCIpICsNCg0KICAjIER5bmFtaWMgcmlnaHQtYWxpZ25lZCBwbGFjZW1lbnQgZm9yIGFubm90YXRpb25zDQogIGFubm90YXRlKCJ0ZXh0IiwgeCA9IEluZiwgeSA9IHRhcmdldF9hZ2dyZXNzaXZlLCBsYWJlbCA9ICJBZ2dyZXNzaXZlIiwgDQogICAgICAgICAgIGhqdXN0ID0gMSwgdmp1c3QgPSAtMC41LCBjb2xvciA9ICJkYXJrYmx1ZSIsIHNpemUgPSA0KSArDQogICMgYW5ub3RhdGUoInRleHQiLCB4ID0gSW5mLCB5ID0gdGFyZ2V0X21vZGVyYXRlLCBsYWJlbCA9ICJNb2RlcmF0ZSIsIA0KICAjICAgICAgICAgaGp1c3QgPSAxLCB2anVzdCA9IC0wLjUsIGNvbG9yID0gImRhcmtibHVlIiwgc2l6ZSA9IDQpICsNCiAgYW5ub3RhdGUoInRleHQiLCB4ID0gSW5mLCB5ID0gdGFyZ2V0X2NvbnNlcnZhdGl2ZSwgbGFiZWwgPSAiQ29uc2VydmF0aXZlIiwgDQogICAgICAgICAgIGhqdXN0ID0gMSwgdmp1c3QgPSAtMC41LCBjb2xvciA9ICJkYXJrYmx1ZSIsIHNpemUgPSA0KSArDQogIGFubm90YXRlKCJ0ZXh0IiwgeCA9IEluZiwgeSA9IHRhcmdldF9pbmZsYXRpb24sIGxhYmVsID0gIkluZmxhdGlvbiIsIA0KICAgICAgICAgICBoanVzdCA9IDEsIHZqdXN0ID0gKzEuMTAsIGNvbG9yID0gImRhcmtyZWQiLCBzaXplID0gNCkgKw0KDQogIGxhYnMoDQogICAgdGl0bGUgPSBkeW5hbWljX3RpdGxlLA0KICAgIHggPSAiWWVhciIsDQogICAgeSA9ICJDQUdSIFZhbHVlICglKSIsDQogICAgY29sb3IgPSAiTWFya2V0IEluZGV4IiwNCiAgICBjYXB0aW9uID0gZHluYW1pY19jYXB0aW9uDQogICAgKSArDQogIA0KICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gY3VzdG9tX2NvbG9ycykgKyAgIyBTZXQgY29sb3JzIGZvciBlYWNoIE1hcmtldCBJbmRleA0KICBzY2FsZV94X2NvbnRpbnVvdXMoDQogICAgbGltaXRzID0gYyhzdGFydF95ZWFyLCBlbmRfeWVhciArIDIpLCANCiAgICBicmVha3MgPSBzZXEobGltaXRzX3N0YXJ0X3llYXIsIGxpbWl0c19lbmRfeWVhciArIDIsIDIpICAjIFJlc3RyaWN0ICYgU2V0IE1ham9yIHgtYXhpcyBsaW5lcyBmb3IgZWFjaCB5ZWFyDQogICkgKyANCiAgDQogIHRoZW1lX21pbmltYWwoKSArDQogIHRoZW1lKA0KICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUsIHNpemUgPSAyMCksICAgICAgICAgIyBMYXJnZXIgdGl0bGUgZm9udA0KICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQpLCAgICAgICAgICAgICAgICAgICAgIyBMYXJnZXIgeC1heGlzIGxhYmVsIGZvbnQNCiAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0KSwgICAgICAgICAgICAgICAgICAgICMgTGFyZ2VyIHktYXhpcyBsYWJlbCBmb250DQogICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxLCBzaXplID0gMTQpLCAgIyBMYXJnZXIgeC1heGlzIHRleHQNCiAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQpLCAgICAgICAgICAgICAgICAgICAgICMgTGFyZ2VyIHktYXhpcyB0ZXh0DQogICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCksICAgICAgICAgICAgICAgICAgICAjIExlZ2VuZCB0aXRsZSBzaXplDQogICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyKSwgICAgICAgICAgICAgICAgICAgICAjIExlZ2VuZCB0ZXh0IHNpemUNCiAgICBwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9saW5lKGxpbmV0eXBlID0gImRvdHRlZCIsIGNvbG9yID0gImJsYWNrIiksICAjIE1ham9yIGdyaWQgbGluZXMNCiAgICBwYW5lbC5ncmlkLm1pbm9yLnggPSBlbGVtZW50X2JsYW5rKCksICAgICAgICAgICAgICAgICAgICAgICMgTm8gbWlub3IgeCBncmlkIGxpbmVzDQogICAgYXhpcy50aWNrcy5sZW5ndGggPSB1bml0KC0wLjI1LCAiY20iKSwgICAgICAgICAgICAgICAgICAgICAgIyBJbmNyZWFzZSB0aWNrIGxlbmd0aA0KICAgIGF4aXMudGlja3MgPSBlbGVtZW50X2xpbmUoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMC41MCksICAgIyBEYXJrZXIgdGlja3MNCiAgICBheGlzLmxpbmUueCA9IGVsZW1lbnRfbGluZShjb2xvciA9ICJibGFjayIsIHNpemUgPSAwLjc1KSwgICMgRGFyayBib3R0b20gYm9yZGVyDQogICAgYXhpcy5saW5lLnkgPSBlbGVtZW50X2xpbmUoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMC43NSkgICAjIERhcmsgbGVmdCBib3JkZXINCiAgKQ0KDQojIFByaW50IHRoZSBwbG90IA0KcHJpbnQocDEpDQoNCg0KYGBgDQoNCiMjIyMgT3V0cGVyZm9ybWFuY2UNCg0KYGBge3IgaW5kZXhfY29tcGFyaXNvbl9ncl92Ml9yYXRpb19ncmFwaCwgZmlnLndpZHRoPTEwLCBmaWcuaGVpZ2h0PTcsIGV2YWw9VFJVRSwgZWNobz1GQUxTRX0NCg0KIyBDb252ZXJ0IFNQWCBhbmQgUVFRIGNvbHVtbnMgdG8gbnVtZXJpYw0KbWVyZ2VkX2RhdGEkYFNQWGAgPC0gYXMubnVtZXJpYyhnc3ViKCIlIiwgIiIsIG1lcmdlZF9kYXRhJGBTUFhgKSkNCm1lcmdlZF9kYXRhJFFRUSA8LSBhcy5udW1lcmljKGdzdWIoIiUiLCAiIiwgbWVyZ2VkX2RhdGEkUVFRKSkNCg0KIyBDYWxjdWxhdGUgQUdSIERpZmZlcmVuY2UgKFNQWCAtIFFRUSkNCm1lcmdlZF9kYXRhJGBBR1IgRGlmZmVyZW5jZWAgPC0gbWVyZ2VkX2RhdGEkYFNQWGAgLSBtZXJnZWRfZGF0YSRRUVENCm1lcmdlZF9kYXRhJGBBR1IgRGlmZmVyZW5jZWAgPC0gLW1lcmdlZF9kYXRhJGBBR1IgRGlmZmVyZW5jZWANCm1lcmdlZF9kYXRhJERpcmVjdGlvbiA8LSBpZmVsc2UobWVyZ2VkX2RhdGEkYEFHUiBEaWZmZXJlbmNlYCA+IDAsICJRUVEiLCAiU1BYIikNCg0KIyBDcmVhdGUgYSBiYXNlbGluZSB3aWR0aCBmb3IgdGhlIHllYXINCmJhc2VsaW5lX3dpZHRoIDwtIDAuMQ0KbWVyZ2VkX2RhdGEkTGVmdF9CYXIgPC0gaWZlbHNlKG1lcmdlZF9kYXRhJGBBR1IgRGlmZmVyZW5jZWAgPCAwLCBtZXJnZWRfZGF0YSRgQUdSIERpZmZlcmVuY2VgLCAtYmFzZWxpbmVfd2lkdGgpDQptZXJnZWRfZGF0YSRSaWdodF9CYXIgPC0gaWZlbHNlKG1lcmdlZF9kYXRhJGBBR1IgRGlmZmVyZW5jZWAgPiAwLCBtZXJnZWRfZGF0YSRgQUdSIERpZmZlcmVuY2VgLCBiYXNlbGluZV93aWR0aCkNCm1lcmdlZF9kYXRhJFllYXJfUG9zaXRpb24gPC0gaWZlbHNlKG1lcmdlZF9kYXRhJGBBR1IgRGlmZmVyZW5jZWAgPiAwLCAtYmFzZWxpbmVfd2lkdGggKiAxLjUsIGJhc2VsaW5lX3dpZHRoICogMS41KQ0KDQojIER5bmFtaWNhbGx5IGFzc2lnbiBjb2xvcnMgZnJvbSBjb2xvcnNfZ2VuZXJhbF9kYXJrIHRvIHVuaXF1ZSBsZXZlbHMgb2YgRGlyZWN0aW9uDQpjb2xvcl9tYXBwaW5nIDwtIHNldE5hbWVzKGNvbG9yc19nZW5lcmFsX2RhcmtbMTpsZW5ndGgodW5pcXVlKG1lcmdlZF9kYXRhJERpcmVjdGlvbikpXSwgdW5pcXVlKG1lcmdlZF9kYXRhJERpcmVjdGlvbikpDQoNCiMgSG9yaXpvbnRhbCBCYXIgQ2hhcnQgd2l0aCBEeW5hbWljIENvbG9ycw0KZ2dwbG90KCkgKw0KICANCiAgIyBMZWZ0IGJhcnMgKFNQWCkNCiAgZ2VvbV9iYXIoZGF0YSA9IG1lcmdlZF9kYXRhLCBhZXMoeCA9IGFzLmZhY3RvcihEYXRlKSwgeSA9IExlZnRfQmFyLCBmaWxsID0gRGlyZWN0aW9uKSwgDQogICAgICAgICAgIHN0YXQgPSAiaWRlbnRpdHkiLCBwb3NpdGlvbiA9ICJpZGVudGl0eSIsIHdpZHRoID0gMC43KSArDQogICMgUmlnaHQgYmFycyAoUVFRKQ0KICBnZW9tX2JhcihkYXRhID0gbWVyZ2VkX2RhdGEsIGFlcyh4ID0gYXMuZmFjdG9yKERhdGUpLCB5ID0gUmlnaHRfQmFyLCBmaWxsID0gRGlyZWN0aW9uKSwgDQogICAgICAgICAgIHN0YXQgPSAiaWRlbnRpdHkiLCBwb3NpdGlvbiA9ICJpZGVudGl0eSIsIHdpZHRoID0gMC43KSArDQogICMgQWRkIHllYXIgbGFiZWxzIGR5bmFtaWNhbGx5IGJhc2VkIG9uIHRoZSBzaWRlDQogIGdlb21fdGV4dChkYXRhID0gbWVyZ2VkX2RhdGEsIGFlcyh4ID0gYXMuZmFjdG9yKERhdGUpLCB5ID0gWWVhcl9Qb3NpdGlvbiwgbGFiZWwgPSBEYXRlKSwgDQogICAgICAgICAgICB2anVzdCA9IDAuNCwgaGp1c3QgPSBpZmVsc2UobWVyZ2VkX2RhdGEkYEFHUiBEaWZmZXJlbmNlYCA+IDAsIDEuMSwgLTAuMSksIGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDQpICsNCiAgDQogICMgQWRkIEFHUiBEaWZmZXJlbmNlIHZhbHVlcyBvbiB0aGUgc2lkZSBvZiB0aGUgYmFyDQogIGdlb21fdGV4dChkYXRhID0gbWVyZ2VkX2RhdGEsIGFlcyh4ID0gYXMuZmFjdG9yKERhdGUpLCB5ID0gYEFHUiBEaWZmZXJlbmNlYCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbCA9IHNwcmludGYoIiUuMmYlJSIsIGFicyhgQUdSIERpZmZlcmVuY2VgKSkpLA0KICAgICAgICAgICAgaGp1c3QgPSBpZmVsc2UobWVyZ2VkX2RhdGEkYEFHUiBEaWZmZXJlbmNlYCA+IDAsIC0wLjEsIDEuMSksICAjIEFsaWduIHRleHQgZHluYW1pY2FsbHkNCiAgICAgICAgICAgIHZqdXN0ID0gMC40LCBjb2xvciA9ICJibGFjayIsIHNpemUgPSAzLjUpICsNCg0KICAjIFVzZSBkeW5hbWljYWxseSBhc3NpZ25lZCBjb2xvcnMNCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gY29sb3JfbWFwcGluZykgKw0KICANCiAgIyBBZGp1c3QgWC1heGlzIHJhbmdlIHdpdGggZXhwYW5kZWQgbGltaXRzDQogIGNvb3JkX2ZsaXAoeWxpbSA9IGMoLTM1LCAzNSkpICsgICMgRXhwYW5kZWQgcmFuZ2UgdG8gcHJldmVudCBjdXRvZmYNCg0KICAgIGxhYnMoDQogICAgdGl0bGUgPSAiQUdSIERpZmZlcmVuY2UgQmV0d2VlbiBTUFggYW5kIFFRUSBPdmVyIFRpbWUiLA0KICAgIHN1YnRpdGxlID0gIk5lZ2F0aXZlIFZhbHVlcyBJbmRpY2F0ZSBTUFg7IFBvc2l0aXZlIFZhbHVlcyBJbmRpY2F0ZSBRUVEiLA0KICAgIHggPSAiWWVhciIsDQogICAgeSA9ICJBR1IgRGlmZmVyZW5jZSAoJSkiLA0KICAgIGZpbGwgPSAiT3V0cGVyZm9ybWFuY2UiDQogICkgKw0KICB0aGVtZV9taW5pbWFsKCkgKw0KICB0aGVtZSgNCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAyMCksIA0KICAgIHBsb3Quc3VidGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0KSwNCiAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0KSwgICMgTGFyZ2VyIHgtYXhpcyBsYWJlbCBmb250ICAgICANCiAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIpLA0KICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfYmxhbmsoKSwgICMgUmVtb3ZlIHktYXhpcyB0aXRsZQ0KICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF9ibGFuaygpLCAjIFJlbW92ZSB5LWF4aXMgdGV4dA0KICAgIGF4aXMudGlja3MueSA9IGVsZW1lbnRfYmxhbmsoKSwgIyBSZW1vdmUgeS1heGlzIHRpY2tzDQogICAgcGFuZWwuZ3JpZC5tYWpvci55ID0gZWxlbWVudF9ibGFuaygpLCAjIFJlbW92ZSBob3Jpem9udGFsIGdyaWQgbGluZXMNCiAgICBwYW5lbC5ncmlkLm1pbm9yLnkgPSBlbGVtZW50X2JsYW5rKCksDQogICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiksICAjIExlZ2VuZCB0aXRsZSBzaXplDQogICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEwKSwgICMgTGVnZW5kIHRleHQgc2l6ZQ0KICAgIGxlZ2VuZC5wb3NpdGlvbiA9IGMoMC4wMiwgMC45OCksICAjIE1vdmUgbGVnZW5kIHRvIHRvcC1sZWZ0IGNvcm5lcg0KICAgIGxlZ2VuZC5qdXN0aWZpY2F0aW9uID0gYygwLCAxKSwgICMgQWxpZ24gbGVnZW5kIHRvIHRoZSBpbnNpZGUgYm9yZGVyDQogICAgcGFuZWwuZ3JpZC5tYWpvciA9IGVsZW1lbnRfbGluZShsaW5ldHlwZSA9ICJkb3R0ZWQiLCBjb2xvciA9ICJibGFjayIpLCAgIyBNYWpvciBncmlkIGxpbmVzDQogICAgcGFuZWwuZ3JpZC5taW5vci54ID0gZWxlbWVudF9ibGFuaygpLCAgIyBObyBtaW5vciB4IGdyaWQgbGluZXMNCiAgICBheGlzLmxpbmUueCA9IGVsZW1lbnRfbGluZShjb2xvciA9ICJibGFjayIsIHNpemUgPSAwLjc1KSwgICMgRGFyayBib3R0b20gYm9yZGVyDQogICAgcGxvdC5tYXJnaW4gPSB1bml0KGMoMC41LCAxLCAwLjUsIDEpLCAiY20iKQ0KICApDQoNCg0KDQpgYGANCg0KVGhlIGZpcnN0IGdyYXBoIGhpZ2hsaWdodHMgYW5udWFsIGdyb3d0aCByYXRlcyAoQUdSKSBmb3IgU1BYIGFuZCBRUVEgb3ZlciBhIGByIGVuZF95ZWFyIC0gc3RhcnRfeWVhciArIDFgLXllYXIgcGVyaW9kLCBkZW1vbnN0cmF0aW5nIHRoZSB2b2xhdGlsaXR5IGFuZCB2YXJpYWJpbGl0eSBvZiBib3RoIGluZGV4ZXMuIFFRUSBjb25zaXN0ZW50bHkgc2hvd3MgbGFyZ2VyIHN3aW5ncywgYm90aCBhYm92ZSBhbmQgYmVsb3cgdGhlIGFnZ3Jlc3NpdmUgYmVuY2htYXJrLCByZWZsZWN0aXZlIG9mIGl0cyB0ZWNoLWhlYXZ5IGFuZCBoaWdoLWdyb3d0aCBuYXR1cmUsIHdoaWxlIFNQWCBleGhpYml0cyBzdGVhZGllciBwZXJmb3JtYW5jZSB3aXRoIGZld2VyIGV4dHJlbWUgb3V0bGllcnMuIFRoZSBzZWNvbmQgZ3JhcGggY29tcGFyZXMgdGhlIEFHUiBkaWZmZXJlbmNlcyBiZXR3ZWVuIHRoZSB0d28gaW5kZXhlcywgaWxsdXN0cmF0aW5nIHBlcmlvZHMgd2hlbiBRUVEgb3V0cGVyZm9ybWVkIChibHVlIGJhcnMpIG9yIHVuZGVycGVyZm9ybWVkIChvcmFuZ2UgYmFycykgU1BYLiBOb3RhYmx5LCBRUVEncyBkb21pbmFuY2UgaXMgZXZpZGVudCBpbiB0aGUgbW9zdCByZWNlbnQgeWVhcnMgKGUuZy4sIDIwMjQgYW5kIDIwMjEpLCB3aGVyZSBpdCBzaWduaWZpY2FudGx5IG91dHBlcmZvcm1lZCwgd2hpbGUgZWFybGllciBwZXJpb2RzIGxpa2UgMjAwMSB0aHJ1IDIwMjMgc2hvdyBub3RhYmxlIHVuZGVycGVyZm9ybWFuY2UgY29tcGFyZWQgdG8gU1BYLiANCg0KKipUYWtlYXdheToqKiBUaGVyZSBoYXZlIGJlZW4gZW5vdWdoIHBlcmlvZHMgKDMgb2YgdGhlbSkgYmV0d2VlbiBgciBzdGFydF95ZWFyYCBhbmQgYHIgZW5kX3llYXJgIHdoZXJlIHRoZSBtYXJrZXQgcGVyZm9ybWVkIHRlcnJpYmx5LCBhcyBwcmVzZW50ZWQgYnkgdGhlIGRhdGEgYW5kIGdyYXBocyBhYm92ZS4gRGVzcGl0ZSBTUFggb3V0cGVyZm9ybWluZyB3aXRoIFFRUSBoYXZpbmcgbGFyZ2VyIG5lZ2F0aXZlIHJldHVybiByYXRlcyBkdXJpbmcgdGhvc2UgYmFkIHllYXJzLCBRUVEgaGFzIGN1bXVsYXRpdmVseSBvdXRwZXJmb3JtZWQuIEFzIGV4ZW1wbGlmaWVkIGJ5IHRoZSAxLVllYXIgQ0FHUi4gVGVjaCBoYXMgYmVlbiBoZXJlLCBhbmQgc2hvd3Mgbm8gc2lnbiBvZiBzdG9wcGluZyBhbnkgdGltZSBzb29uLiANCg0KIyMgQ3VtdWxhdGl2ZSBHcm93dGggDQoNCiMjIyBEYXRhDQoNCmBgYHtyIGluZGV4X2NvbXBhcmlzb25fY2dfdjIsIGV2YWw9VFJVRSwgZWNobz1GQUxTRX0NCg0KDQojIExvYWQgbmVjZXNzYXJ5IGxpYnJhcnkNCmxpYnJhcnkoZHBseXIpDQoNCiMgU3RlcCAxOiBDb252ZXJ0IHBlcmNlbnRhZ2VzIHRvIG51bWVyaWMgdmFsdWVzIChjb2x1bW5zIDI6MykNCmN1bXVsYXRpdmVfZGF0YSA8LSBtZXJnZWRfZGF0YSAlPiUNCiAgbXV0YXRlKA0KICAgIGFjcm9zcygyOjMsIH4gYXMubnVtZXJpYyhnc3ViKCIlIiwgIiIsIC4pKSAvIDEwMCkgIyBDb252ZXJ0IHBlcmNlbnRhZ2Ugc3RyaW5ncyB0byBudW1lcmljDQogICkNCg0KIyBTdGVwIDI6IEVuc3VyZSB0aGUgYERhdGVgIGNvbHVtbiBpcyB0cmVhdGVkIGFzIGFuIGludGVnZXINCmN1bXVsYXRpdmVfZGF0YSA8LSBjdW11bGF0aXZlX2RhdGEgJT4lDQogIG11dGF0ZShEYXRlID0gYXMuaW50ZWdlcihEYXRlKSkNCg0KIyBTdGVwIDM6IEFkZCB0aGUgaW5pdGlhbCB2YWx1ZSBmb3IgMjAwMA0KY3VtdWxhdGl2ZV9kYXRhIDwtIGJpbmRfcm93cygNCiAgZGF0YS5mcmFtZShEYXRlID0gMjAwMCwgYFNQWGAgPSAwLCBRUVEgPSAwKSwgIyBTZXQgZ3Jvd3RoIHJhdGVzIGZvciAyMDAwIHRvIDANCiAgY3VtdWxhdGl2ZV9kYXRhDQopDQoNCiMgU3RlcCA0OiBTb3J0IGJ5IERhdGUgYXNjZW5kaW5nIGZvciBwcm9wZXIgY3VtdWxhdGl2ZSBjYWxjdWxhdGlvbg0KY3VtdWxhdGl2ZV9kYXRhIDwtIGN1bXVsYXRpdmVfZGF0YSAlPiUNCiAgYXJyYW5nZShEYXRlKQ0KDQojIFN0ZXAgNTogSW5pdGlhbGl6ZSB0aGUgc3RhcnRpbmcgdmFsdWUNCnN0YXJ0aW5nX3ZhbHVlIDwtIDEwMA0KDQojIFN0ZXAgNjogQ2FsY3VsYXRlIGN1bXVsYXRpdmUgZ3Jvd3RoDQpjdW11bGF0aXZlX2RhdGEgPC0gY3VtdWxhdGl2ZV9kYXRhICU+JQ0KICBtdXRhdGUoDQogICAgYFNQWGAgPSBzdGFydGluZ192YWx1ZSAqIGN1bXByb2QoMSArIHJlcGxhY2VfbmEoYFNQWGAsIDApKSwgIyBSZXBsYWNlIE5BIHdpdGggMCBmb3IgcHJvcGVyIGNhbGN1bGF0aW9uDQogICAgUVFRID0gc3RhcnRpbmdfdmFsdWUgKiBjdW1wcm9kKDEgKyByZXBsYWNlX25hKFFRUSwgMCkpDQogICkNCg0KIyBTdGVwIDc6IFJlcGxhY2UgaW5pdGlhbCBncm93dGggcmF0ZXMgZm9yIDIwMDAgd2l0aCAkMTAwIGV4cGxpY2l0bHkNCmN1bXVsYXRpdmVfZGF0YSA8LSBjdW11bGF0aXZlX2RhdGEgJT4lDQogIG11dGF0ZShhY3Jvc3MoMjozLCB+IGlmZWxzZShEYXRlID09IDIwMDAsIDEwMCwgLikpKQ0KDQojIFN0ZXAgODogUmVvcmRlciBjb2x1bW5zIGFzIERhdGUsIFNQWCwgUVFRDQpjdW11bGF0aXZlX2RhdGEgPC0gY3VtdWxhdGl2ZV9kYXRhICU+JQ0KICBzZWxlY3QoRGF0ZSwgYFNQWGAsIFFRUSkNCg0KIyBTdGVwIDk6IFJvdW5kIHZhbHVlcyB0byAyIGRlY2ltYWwgcGxhY2VzDQpjdW11bGF0aXZlX2RhdGEgPC0gY3VtdWxhdGl2ZV9kYXRhICU+JQ0KICBtdXRhdGUoYWNyb3NzKDI6MywgfiByb3VuZCguLCAyKSkpDQoNCiMgU3RlcCAxMDogU29ydCBieSBEYXRlIGRlc2NlbmRpbmcgZm9yIHByZXNlbnRhdGlvbg0KY3VtdWxhdGl2ZV9kYXRhIDwtIGN1bXVsYXRpdmVfZGF0YSAlPiUNCiAgYXJyYW5nZShkZXNjKERhdGUpKQ0KDQojIEZvcm1hdCB0aGUgdGFibGUgd2l0aG91dCBhZGRpbmcgY29tbWFzIHRvIHRoZSBEYXRlIGNvbHVtbg0KY3VtdWxhdGl2ZV9kYXRhJERhdGUgPC0gYXMuY2hhcmFjdGVyKGN1bXVsYXRpdmVfZGF0YSREYXRlKSAgIyBFbnN1cmUgRGF0ZSBpcyBhIGNoYXJhY3RlciB3aXRob3V0IGNvbW1hcw0KY3VtdWxhdGl2ZV9kYXRhJGBTUFhgIDwtIGZvcm1hdEMoY3VtdWxhdGl2ZV9kYXRhJGBTUFhgLCBmb3JtYXQgPSAiZiIsIGRpZ2l0cyA9IDIpDQpjdW11bGF0aXZlX2RhdGEkUVFRIDwtIGZvcm1hdEMoY3VtdWxhdGl2ZV9kYXRhJFFRUSwgZm9ybWF0ID0gImYiLCBkaWdpdHMgPSAyKQ0KDQojIFByaW50IHRoZSBjdW11bGF0aXZlIGdyb3d0aCB0YWJsZQ0KY2F0KCJcblxuIyMjIyBDdW11bGF0aXZlIEdyb3d0aCBSYXRlcyAoIiwgbWluX3llYXIsICItIiwgbWF4X3llYXIsICIpXG4iLCBzZXAgPSAiIikNCmludGVyYWN0aXZlX3ByaW50KGN1bXVsYXRpdmVfZGF0YSkNCmludGVyYWN0aXZlX3N0cihjdW11bGF0aXZlX2RhdGEpDQpmb3JtYXRfZXF1YWxfd2lkdGgoY3VtdWxhdGl2ZV9kYXRhKQ0KDQoNCmBgYA0KDQpUaGUgdGFibGUgYW5kIGdyYXBoIGJlbG93IHNob3cgdGhlIGltcGFjdCBvZiB0aGUgYW5udWFsIGdyb3d0aCByYXRlcywgY29tcGFyaW5nIHRoZSBjdW11bGF0aXZlIGdyb3d0aCBvZiBTUFggYW5kIFFRUSBpbmRleGVzIG92ZXIgYSBgciB5ZWFyX3JhbmdlYC15ZWFyIHBlcmlvZCBmcm9tIGByIHN0YXJ0X3llYXIgLSAxYCB0byBgciBlbmRfeWVhcmAsIHN0YXJ0aW5nIHdpdGggYW4gaW5pdGlhbCB2YWx1ZSBvZiAkMTAwIHBlciAxMDAlLiANCg0KIyMjIEdyYXBoIA0KDQpgYGB7ciBpbmRleF9jb21wYXJpc29uX2NnX3YyX2dyYXBoLCBmaWcud2lkdGg9MTAsIGZpZy5oZWlnaHQ9NywgZXZhbD1UUlVFLCBlY2hvPUZBTFNFfQ0KDQpjYXQoIlxuXG4jIyMjIEN1bXVsYXRpdmUgR3Jvd3RoIEJ5IEluZGV4IFxuIikNCg0KIyBMb2FkIG5lY2Vzc2FyeSBsaWJyYXJpZXMNCmxpYnJhcnkoZ2dwbG90MikNCmxpYnJhcnkoZHBseXIpDQoNCiMgQ29udmVydCBjb2x1bW5zIHRvIG51bWVyaWMgZm9yIHBsb3R0aW5nIGlmIG5lZWRlZA0KY3VtdWxhdGl2ZV9kYXRhIDwtIGN1bXVsYXRpdmVfZGF0YSAlPiUNCiAgbXV0YXRlKA0KICAgIGBEYXRlYCA9IGFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKGBEYXRlYCkpLCAgIyBFbnN1cmUgRGF0ZSBpcyBudW1lcmljDQogICAgYFNQWGAgPSBhcy5udW1lcmljKGdzdWIoIiUiLCAiIiwgYFNQWGApKSwNCiAgICBgUVFRYCA9IGFzLm51bWVyaWMoZ3N1YigiJSIsICIiLCBgUVFRYCkpDQogICkNCg0KIyBSZXNoYXBlIHRoZSBkYXRhIGludG8gbG9uZyBmb3JtYXQgZm9yIGVhc3kgcGxvdHRpbmcgb2YgbXVsdGlwbGUgbGluZXMgYW5kIHNldCB0aGUgZmFjdG9yIG9yZGVyDQpucnRfbG9uZyA8LSBjdW11bGF0aXZlX2RhdGEgJT4lDQogIHBpdm90X2xvbmdlcihjb2xzID0gYyhgU1BYYCwgYFFRUWApLA0KICAgICAgICAgICAgICAgbmFtZXNfdG8gPSAiQ0dfSW5kZXgiLA0KICAgICAgICAgICAgICAgdmFsdWVzX3RvID0gIkNHX1ZhbHVlIikgJT4lDQogIG11dGF0ZShDR19JbmRleCA9IGZhY3RvcihDR19JbmRleCwgbGV2ZWxzID0gYygiU1BYIiwgIlFRUSIpKSkNCg0KIyBBc3NpZ24gY29sb3JzIGR5bmFtaWNhbGx5IGJhc2VkIG9uIHRoZSBvcmRlciBvZiBDR19JbmRleCBpbiB0aGUgZGF0YQ0KIyBNYXRjaCB0aGUgdW5pcXVlIGxldmVscyBvZiBDR19JbmRleCB3aXRoIGNvbG9ycyBmcm9tIGNvbG9yc19nZW5lcmFsX2RhcmsNCnVuaXF1ZV90eXBlcyA8LSB1bmlxdWUobnJ0X2xvbmckQ0dfSW5kZXgpDQpjdXN0b21fY29sb3JzIDwtIHNldE5hbWVzKGNvbG9yc19nZW5lcmFsX2RhcmtbMTpsZW5ndGgodW5pcXVlX3R5cGVzKV0sIHVuaXF1ZV90eXBlcykNCg0KIyBGaW5kIHRoZSBtaW5pbXVtIGFuZCBtYXhpbXVtIHgtdmFsdWUgaW4geW91ciBkYXRhDQptYXhfeCA8LSBtYXgoYXMuaW50ZWdlcihjdW11bGF0aXZlX2RhdGEkRGF0ZSksIG5hLnJtID0gVFJVRSkNCm1pbl94IDwtIG1pbihhcy5pbnRlZ2VyKGN1bXVsYXRpdmVfZGF0YSREYXRlKSwgbmEucm0gPSBUUlVFKQ0KaW50ZXJhY3RpdmVfcHJpbnQobWF4X3gpICAjIFRlc3QNCmludGVyYWN0aXZlX3ByaW50KG1pbl94KSAgIyBUZXN0DQoNCiMgRmluZCB0aGUgbWluaW11bSBhbmQgbWF4aW11bSB5ZWFyDQptaW5feWVhciA8LSBtaW4oY3VtdWxhdGl2ZV9kYXRhJERhdGUsIG5hLnJtID0gVFJVRSkNCm1heF95ZWFyIDwtIG1heChjdW11bGF0aXZlX2RhdGEkRGF0ZSwgbmEucm0gPSBUUlVFKQ0KaW50ZXJhY3RpdmVfcHJpbnQobWluX3llYXIpDQppbnRlcmFjdGl2ZV9wcmludChtYXhfeWVhcikNCg0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiMjIFBMT1QgRlVMTCBXSVRIT1VUIExJTUlUUw0KDQojIERlZmluZSBzdGFydCBhbmQgZW5kIHllYXJzDQpzdGFydF95ZWFyIDwtIGFzLm51bWVyaWMobWluX3llYXIpDQplbmRfeWVhciA8LSBtYXhfeWVhcg0KeWVhcl9yYW5nZSA8LSBlbmRfeWVhciAtIHN0YXJ0X3llYXIgKyAxICAjIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIHllYXJzDQoNCiMgRGVmaW5lIGJyZWFrcyByb3VuZGVkIGFwcHJvcHJpYXRlbHkNCmxpbWl0c19zdGFydF95ZWFyIDwtIGZsb29yKHN0YXJ0X3llYXIgLyAyKSAqIDIgICMgUm91bmQgZG93biB0byB0aGUgbmVhcmVzdCBtdWx0aXBsZSBvZiAyDQpsaW1pdHNfZW5kX3llYXIgPC0gY2VpbGluZyhlbmRfeWVhciAvIDIpICogMiAgICMgUm91bmQgdXAgdG8gdGhlIG5lYXJlc3QgbXVsdGlwbGUgb2YgMg0KDQojIENyZWF0ZSBkeW5hbWljIHRpdGxlIGFuZCBjYXB0aW9uDQpkeW5hbWljX3RpdGxlIDwtIHBhc3RlMCgiQ3VtdWxhdGl2ZSBHcm93dGggQnkgSW5kZXggT3ZlciAiLCB5ZWFyX3JhbmdlIC0gMSwgIiBZZWFycyAoIiwgc3RhcnRfeWVhciwgIi0iLCBlbmRfeWVhciwgIikiKQ0KZHluYW1pY19jYXB0aW9uIDwtIHBhc3RlMCgiQ3VtdWxhdGl2ZSBHcm93dGggQnkgSW5kZXgsIERhdGEgUGVyaW9kICgiLCBzdGFydF95ZWFyLCAiLSIsIGVuZF95ZWFyLCAiKSIpDQoNCiMgQ3JlYXRlIHRoZSBmdWxsLCBub24tZmlsdGVyZWQgeC1heGlzIHBsb3Qgd2l0aCBkeW5hbWljIHggcGxhY2VtZW50IGZvciBhbm5vdGF0aW9ucw0KcDEgPC0gZ2dwbG90KG5ydF9sb25nLCBhZXMoeCA9IGFzLmludGVnZXIoRGF0ZSksIHkgPSBDR19WYWx1ZSwgY29sb3IgPSBDR19JbmRleCkpICsNCg0KICAjIEFkZCBzaGFkZWQgYXJlYXMgZm9yIGJhY2tncm91bmQgZWZmZWN0DQogIGdlb21fcmVjdChhZXMoeG1pbiA9IC1JbmYsIHhtYXggPSBJbmYsIHltaW4gPSAxMDAsIHltYXggPSBJbmYpLCBmaWxsID0gImxpZ2h0Z3JlZW4iLCBhbHBoYSA9IDAuMDI1KSArDQogIGdlb21fcmVjdChhZXMoeG1pbiA9IC1JbmYsIHhtYXggPSBJbmYsIHltaW4gPSAtSW5mLCB5bWF4ID0gMTAwKSwgZmlsbCA9ICJsaWdodGNvcmFsIiwgYWxwaGEgPSAwLjAyNSkgKw0KICANCiAgIyBQbG90IGxpbmVzIGZvciBlYWNoIENHIEluZGV4DQogIGdlb21fbGluZShzaXplID0gMS4yNSwgYWxwaGEgPSAzLjApICsgICAgICAgIyBMaW5lIGZvciBlYWNoIENHDQogIGdlb21fcG9pbnQoc2l6ZSA9IDIuMCwgYWxwaGEgPSAzLjApICsgICAgICAgIyBQb2ludHMgZm9yIGVhY2ggQ0cNCg0KICBsYWJzKA0KICAgIHRpdGxlID0gZHluYW1pY190aXRsZSwNCiAgICB4ID0gIlllYXIiLA0KICAgIHkgPSAiQ0cgVmFsdWUgKDEkIC8gMSUpIiwNCiAgICBjb2xvciA9ICJDRyBJbmRleCIsDQogICAgY2FwdGlvbiA9IGR5bmFtaWNfY2FwdGlvbg0KICAgICkgKw0KICANCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGN1c3RvbV9jb2xvcnMpICsgICMgU2V0IGNvbG9ycyBmb3IgZWFjaCBDRyBJbmRleA0KICBzY2FsZV94X2NvbnRpbnVvdXMoDQogICAgbGltaXRzID0gYyhzdGFydF95ZWFyLCBlbmRfeWVhciArIDEpLCANCiAgICBicmVha3MgPSBzZXEobGltaXRzX3N0YXJ0X3llYXIsIGxpbWl0c19lbmRfeWVhciArIDEsIDIpICAjIFJlc3RyaWN0ICYgU2V0IE1ham9yIHgtYXhpcyBsaW5lcyBmb3IgZWFjaCB5ZWFyDQogICkgKyANCiAgDQogIHRoZW1lX21pbmltYWwoKSArDQogIHRoZW1lKA0KICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUsIHNpemUgPSAyMCksICAgICAgICAgIyBMYXJnZXIgdGl0bGUgZm9udA0KICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQpLCAgICAgICAgICAgICAgICAgICAgIyBMYXJnZXIgeC1heGlzIGxhYmVsIGZvbnQNCiAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0KSwgICAgICAgICAgICAgICAgICAgICMgTGFyZ2VyIHktYXhpcyBsYWJlbCBmb250DQogICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxLCBzaXplID0gMTQpLCAgIyBMYXJnZXIgeC1heGlzIHRleHQNCiAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQpLCAgICAgICAgICAgICAgICAgICAgICMgTGFyZ2VyIHktYXhpcyB0ZXh0DQogICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCksICAgICAgICAgICAgICAgICAgICAjIExlZ2VuZCB0aXRsZSBzaXplDQogICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyKSwgICAgICAgICAgICAgICAgICAgICAjIExlZ2VuZCB0ZXh0IHNpemUNCiAgICBwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9saW5lKGxpbmV0eXBlID0gImRvdHRlZCIsIGNvbG9yID0gImJsYWNrIiksICAjIE1ham9yIGdyaWQgbGluZXMNCiAgICBwYW5lbC5ncmlkLm1pbm9yLnggPSBlbGVtZW50X2JsYW5rKCksICAgICAgICAgICAgICAgICAgICAgICMgTm8gbWlub3IgeCBncmlkIGxpbmVzDQogICAgYXhpcy50aWNrcy5sZW5ndGggPSB1bml0KC0wLjI1LCAiY20iKSwgICAgICAgICAgICAgICAgICAgICAgIyBJbmNyZWFzZSB0aWNrIGxlbmd0aA0KICAgIGF4aXMudGlja3MgPSBlbGVtZW50X2xpbmUoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMC41MCksICAgIyBEYXJrZXIgdGlja3MNCiAgICBheGlzLmxpbmUueCA9IGVsZW1lbnRfbGluZShjb2xvciA9ICJibGFjayIsIHNpemUgPSAwLjc1KSwgICMgRGFyayBib3R0b20gYm9yZGVyDQogICAgYXhpcy5saW5lLnkgPSBlbGVtZW50X2xpbmUoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMC43NSkgICAjIERhcmsgbGVmdCBib3JkZXINCiAgKQ0KDQojIFByaW50IHRoZSBwbG90IA0KcHJpbnQocDEpDQoNCg0KYGBgDQoNClRoaXMgZ3JhcGggZGVwaWN0cyB0aGUgY3VtdWxhdGl2ZSBncm93dGggb2YgU1BYIChTUFgpIGFuZCBRUVEgb3ZlciBhIGByIGVuZF95ZWFyIC0gc3RhcnRfeWVhcmAteWVhciBwZXJpb2QgKGByIHN0YXJ0X3llYXJgIOKAkyBgciBlbmRfeWVhcmApLiBJbml0aWFsbHksIFFRUSB1bmRlcnBlcmZvcm1lZCBvbiBhIGN1bXVsYXRpdmUgYmFzaXMsIHBhcnRpY3VsYXJseSBkdXJpbmcgdGhlIGRvdC1jb20gYnViYmxlIGJ1cnN0IGluIHRoZSBlYXJseSAyMDAwcyBhbmQgdGhlIDIwMDggZmluYW5jaWFsIGNyaXNpcywgd2hpY2ggc2lnbmlmaWNhbnRseSBpbXBhY3RlZCBpdHMgdGVjaC1oZWF2eSBjb21wb3NpdGlvbi4gRGVzcGl0ZSB0aGVzZSBzZXRiYWNrcywgYXMgdGltZSBwcm9ncmVzc2VkLCBRUVEgb3V0cGVyZm9ybWVkIFNQWCwgcmVmbGVjdGluZyBpdHMgc3Ryb25nIHJlY292ZXJ5IGFuZCBkb21pbmFuY2UgZHVyaW5nIHRoZSB0ZWNoIGJvb20gb2YgdGhlIDIwMTBzIGFuZCBiZXlvbmQuIFRoaXMgZ3JhcGggZXhlbXBsaWZpZXMgaG93IHRpbWluZyBpbXBhY3RzIHBlcmZvcm1hbmNlLCBoaWdobGlnaHRpbmcgdGhlIGltcG9ydGFuY2Ugb2YgYW5hbHl6aW5nIGdyb3d0aCBvdmVyIHNob3J0LXRlcm0sIGludGVybWVkaWF0ZSwgYW5kIGxvbmctdGVybSBwZXJpb2RzIHRvIHVuZGVyc3RhbmQgdGhlIHZhcnlpbmcgcmlzay1yZXR1cm4gZHluYW1pY3MgYW5kIHRoZSBpbmZsdWVuY2Ugb2YgbWFqb3IgZWNvbm9taWMgZXZlbnRzLg0KDQo8IS0tIA0KIyMgQ0FHUiBSb2xsaW5nIFBlcmlvZHMgDQoNCiMjIyBBdmVyYWdlcw0KDQojIyMjIERhdGENCmBgYHtyIGluZGV4X2NvbXBhcmlzb25fY2Fncl9hdmVyYWdlc19zdW1tYXJ5LCBldmFsPVRSVUUsIGVjaG89RkFMU0V9DQoNCiMgRGVmaW5lIGEgZnVuY3Rpb24gdG8gZmlsdGVyIGRhdGFzZXRzIGZvciB2YWxpZCBkYXRhIGluIGVhY2ggcm9sbGluZyBDQUdSIHBlcmlvZCBhbmQgd2l0aGluIG1pbi9tYXggeWVhciByYW5nZQ0KZmlsdGVyX2RhdGFfZm9yX3BlcmlvZCA8LSBmdW5jdGlvbihkYXRhLCBjb2x1bW5fbmFtZSwgbWluX3llYXIsIG1heF95ZWFyKSB7DQogIGRhdGEgPC0gZGF0YVshaXMubmEoZGF0YVtbY29sdW1uX25hbWVdXSksIF0NCiAgZGF0YSA8LSBkYXRhW2RhdGEkRGF0ZSA+PSBtaW5feWVhciAmIGRhdGEkRGF0ZSA8PSBtYXhfeWVhciwgXQ0KICByZXR1cm4oZGF0YSkNCn0NCg0KIyBGaWx0ZXIgZGF0YXNldHMgZm9yIGVhY2ggcm9sbGluZyBwZXJpb2QNCmZpbHRlcmVkX3NweF8xeXIgPC0gZmlsdGVyX2RhdGFfZm9yX3BlcmlvZChzcHhfcmF3X2NhZ3IsICIxLVllYXIgQ0FHUiIsIG1pbl95ZWFyLCBtYXhfeWVhcikNCmZpbHRlcmVkX3NweF81eXIgPC0gZmlsdGVyX2RhdGFfZm9yX3BlcmlvZChzcHhfcmF3X2NhZ3IsICI1LVllYXIgQ0FHUiIsIG1pbl95ZWFyLCBtYXhfeWVhcikNCmZpbHRlcmVkX3NweF8xMHlyIDwtIGZpbHRlcl9kYXRhX2Zvcl9wZXJpb2Qoc3B4X3Jhd19jYWdyLCAiMTAtWWVhciBDQUdSIiwgbWluX3llYXIsIG1heF95ZWFyKQ0KZmlsdGVyZWRfc3B4XzIweXIgPC0gZmlsdGVyX2RhdGFfZm9yX3BlcmlvZChzcHhfcmF3X2NhZ3IsICIyMC1ZZWFyIENBR1IiLCBtaW5feWVhciwgbWF4X3llYXIpDQoNCmZpbHRlcmVkX3FxcV8xeXIgPC0gZmlsdGVyX2RhdGFfZm9yX3BlcmlvZChxcXFfcmF3X2NhZ3IsICIxLVllYXIgQ0FHUiIsIG1pbl95ZWFyLCBtYXhfeWVhcikNCmZpbHRlcmVkX3FxcV81eXIgPC0gZmlsdGVyX2RhdGFfZm9yX3BlcmlvZChxcXFfcmF3X2NhZ3IsICI1LVllYXIgQ0FHUiIsIG1pbl95ZWFyLCBtYXhfeWVhcikNCmZpbHRlcmVkX3FxcV8xMHlyIDwtIGZpbHRlcl9kYXRhX2Zvcl9wZXJpb2QocXFxX3Jhd19jYWdyLCAiMTAtWWVhciBDQUdSIiwgbWluX3llYXIsIG1heF95ZWFyKQ0KZmlsdGVyZWRfcXFxXzIweXIgPC0gZmlsdGVyX2RhdGFfZm9yX3BlcmlvZChxcXFfcmF3X2NhZ3IsICIyMC1ZZWFyIENBR1IiLCBtaW5feWVhciwgbWF4X3llYXIpDQoNCiMgRW5zdXJlIG1hdGNoaW5nIGRhdGVzIGZvciBlYWNoIHJvbGxpbmcgcGVyaW9kDQpjb21tb25fZGF0ZXNfMXlyIDwtIGludGVyc2VjdChmaWx0ZXJlZF9zcHhfMXlyJERhdGUsIGZpbHRlcmVkX3FxcV8xeXIkRGF0ZSkNCmNvbW1vbl9kYXRlc181eXIgPC0gaW50ZXJzZWN0KGZpbHRlcmVkX3NweF81eXIkRGF0ZSwgZmlsdGVyZWRfcXFxXzV5ciREYXRlKQ0KY29tbW9uX2RhdGVzXzEweXIgPC0gaW50ZXJzZWN0KGZpbHRlcmVkX3NweF8xMHlyJERhdGUsIGZpbHRlcmVkX3FxcV8xMHlyJERhdGUpDQpjb21tb25fZGF0ZXNfMjB5ciA8LSBpbnRlcnNlY3QoZmlsdGVyZWRfc3B4XzIweXIkRGF0ZSwgZmlsdGVyZWRfcXFxXzIweXIkRGF0ZSkNCg0KIyBGaWx0ZXIgZGF0YXNldHMgdG8gaW5jbHVkZSBvbmx5IG1hdGNoaW5nIGRhdGVzIGZvciBlYWNoIHBlcmlvZA0KZmlsdGVyZWRfc3B4XzF5ciA8LSBmaWx0ZXJlZF9zcHhfMXlyW2ZpbHRlcmVkX3NweF8xeXIkRGF0ZSAlaW4lIGNvbW1vbl9kYXRlc18xeXIsIF0NCmZpbHRlcmVkX3FxcV8xeXIgPC0gZmlsdGVyZWRfcXFxXzF5cltmaWx0ZXJlZF9xcXFfMXlyJERhdGUgJWluJSBjb21tb25fZGF0ZXNfMXlyLCBdDQoNCmZpbHRlcmVkX3NweF81eXIgPC0gZmlsdGVyZWRfc3B4XzV5cltmaWx0ZXJlZF9zcHhfNXlyJERhdGUgJWluJSBjb21tb25fZGF0ZXNfNXlyLCBdDQpmaWx0ZXJlZF9xcXFfNXlyIDwtIGZpbHRlcmVkX3FxcV81eXJbZmlsdGVyZWRfcXFxXzV5ciREYXRlICVpbiUgY29tbW9uX2RhdGVzXzV5ciwgXQ0KDQpmaWx0ZXJlZF9zcHhfMTB5ciA8LSBmaWx0ZXJlZF9zcHhfMTB5cltmaWx0ZXJlZF9zcHhfMTB5ciREYXRlICVpbiUgY29tbW9uX2RhdGVzXzEweXIsIF0NCmZpbHRlcmVkX3FxcV8xMHlyIDwtIGZpbHRlcmVkX3FxcV8xMHlyW2ZpbHRlcmVkX3FxcV8xMHlyJERhdGUgJWluJSBjb21tb25fZGF0ZXNfMTB5ciwgXQ0KDQpmaWx0ZXJlZF9zcHhfMjB5ciA8LSBmaWx0ZXJlZF9zcHhfMjB5cltmaWx0ZXJlZF9zcHhfMjB5ciREYXRlICVpbiUgY29tbW9uX2RhdGVzXzIweXIsIF0NCmZpbHRlcmVkX3FxcV8yMHlyIDwtIGZpbHRlcmVkX3FxcV8yMHlyW2ZpbHRlcmVkX3FxcV8yMHlyJERhdGUgJWluJSBjb21tb25fZGF0ZXNfMjB5ciwgXQ0KDQojIERldGVybWluZSB0aGUgbWluIGFuZCBtYXggeWVhcnMgZm9yIGVhY2ggcm9sbGluZyBwZXJpb2QNCnllYXJfcmFuZ2VzIDwtIGMoDQogIHBhc3RlMChtaW4oY29tbW9uX2RhdGVzXzF5ciksICItIiwgbWF4KGNvbW1vbl9kYXRlc18xeXIpKSwNCiAgcGFzdGUwKG1pbihjb21tb25fZGF0ZXNfNXlyKSwgIi0iLCBtYXgoY29tbW9uX2RhdGVzXzV5cikpLA0KICBwYXN0ZTAobWluKGNvbW1vbl9kYXRlc18xMHlyKSwgIi0iLCBtYXgoY29tbW9uX2RhdGVzXzEweXIpKSwNCiAgcGFzdGUwKG1pbihjb21tb25fZGF0ZXNfMjB5ciksICItIiwgbWF4KGNvbW1vbl9kYXRlc18yMHlyKSkNCikNCg0KIyBDYWxjdWxhdGUgdGhlIG1lYW4gc3VtbWFyeSBmb3IgU1BYIGFuZCBRUVENCnN1bW1hcnlfZGF0YSA8LSBkYXRhLmZyYW1lKA0KICBNZXRyaWMgPSBjKCIxLVllYXIgQ0FHUiIsICI1LVllYXIgQ0FHUiIsICIxMC1ZZWFyIENBR1IiLCAiMjAtWWVhciBDQUdSIiksDQogIGBTUFhgID0gYygNCiAgICBtZWFuKGZpbHRlcmVkX3NweF8xeXIkYDEtWWVhciBDQUdSYCwgbmEucm0gPSBUUlVFKSwNCiAgICBtZWFuKGZpbHRlcmVkX3NweF81eXIkYDUtWWVhciBDQUdSYCwgbmEucm0gPSBUUlVFKSwNCiAgICBtZWFuKGZpbHRlcmVkX3NweF8xMHlyJGAxMC1ZZWFyIENBR1JgLCBuYS5ybSA9IFRSVUUpLA0KICAgIG1lYW4oZmlsdGVyZWRfc3B4XzIweXIkYDIwLVllYXIgQ0FHUmAsIG5hLnJtID0gVFJVRSkNCiAgKSwNCiAgUVFRID0gYygNCiAgICBtZWFuKGZpbHRlcmVkX3FxcV8xeXIkYDEtWWVhciBDQUdSYCwgbmEucm0gPSBUUlVFKSwNCiAgICBtZWFuKGZpbHRlcmVkX3FxcV81eXIkYDUtWWVhciBDQUdSYCwgbmEucm0gPSBUUlVFKSwNCiAgICBtZWFuKGZpbHRlcmVkX3FxcV8xMHlyJGAxMC1ZZWFyIENBR1JgLCBuYS5ybSA9IFRSVUUpLA0KICAgIG1lYW4oZmlsdGVyZWRfcXFxXzIweXIkYDIwLVllYXIgQ0FHUmAsIG5hLnJtID0gVFJVRSkNCiAgKSwNCiAgYFJhbmdlYCA9IHllYXJfcmFuZ2VzLA0KICBjaGVjay5uYW1lcyA9IEZBTFNFICMgUHJldmVudCBSIGZyb20gYWx0ZXJpbmcgY29sdW1uIG5hbWVzDQopDQoNCiMgQ2FsY3VsYXRlIHRoZSBSYXRpbyBjb2x1bW4gKFNQWCAvIFFRUSkNCnN1bW1hcnlfZGF0YSRSYXRpbyA8LSBOQSAgIyBJbml0aWFsaXplIHRoZSBSYXRpbyBjb2x1bW4gd2l0aCBOQSB2YWx1ZXMNCmZvciAoaSBpbiBzZXFfbGVuKG5yb3coc3VtbWFyeV9kYXRhKSkpIHsNCiAgc3B4X3ZhbCA8LSBzdXBwcmVzc1dhcm5pbmdzKGFzLm51bWVyaWMoZ3N1YigiJSIsICIiLCBzdW1tYXJ5X2RhdGEkYFNQWGBbaV0pKSkNCiAgcXFxX3ZhbCA8LSBzdXBwcmVzc1dhcm5pbmdzKGFzLm51bWVyaWMoZ3N1YigiJSIsICIiLCBzdW1tYXJ5X2RhdGEkUVFRW2ldKSkpDQogIA0KICBpZiAoIWlzLm5hKHNweF92YWwpICYmICFpcy5uYShxcXFfdmFsKSAmJiBxcXFfdmFsICE9IDApIHsNCiAgICBzdW1tYXJ5X2RhdGEkUmF0aW9baV0gPC0gcm91bmQoKHNweF92YWwgLyBxcXFfdmFsKSwgMikgICMgQ2FsY3VsYXRlIGFuZCBzdG9yZSB0aGUgcmF0aW8NCiAgfQ0KfQ0KDQojIEZvcm1hdCBTUFgsIFFRUSwgYW5kIFJhdGlvIGNvbHVtbnMNCmlmIChucm93KHN1bW1hcnlfZGF0YSkgPiAwKSB7DQogIHN1bW1hcnlfZGF0YSRgU1BYYCA8LSBzcHJpbnRmKCIlLjJmJSUiLCBzdW1tYXJ5X2RhdGEkYFNQWGApDQogIHN1bW1hcnlfZGF0YSRRUVEgPC0gc3ByaW50ZigiJS4yZiUlIiwgc3VtbWFyeV9kYXRhJFFRUSkNCiAgc3VtbWFyeV9kYXRhJFJhdGlvIDwtIHNwcmludGYoIiUuMmYiLCBzdW1tYXJ5X2RhdGEkUmF0aW8pICAjIEtlZXAgdGhlIHJhdGlvIGFzIGEgbnVtZXJpYyBzdHJpbmcNCn0gZWxzZSB7DQogIHN0b3AoIk5vIGRhdGEgdG8gc3VtbWFyaXplIG9yIHJvd3MgZG8gbm90IG1hdGNoLiIpDQp9DQoNCiMgUmVvcmRlciBjb2x1bW5zIHRvIE1ldHJpYyAvIFNQWCAvIFFRUSAvIFJhdGlvIC8gUmFuZ2UNCnN1bW1hcnlfZGF0YSA8LSBzdW1tYXJ5X2RhdGFbLCBjKCJNZXRyaWMiLCAiU1BYIiwgIlFRUSIsICJSYXRpbyIsICJSYW5nZSIpXQ0KDQojIERpc3BsYXkgdGhlIHVwZGF0ZWQgc3VtbWFyeSB3aXRoIHRoZSBSYXRpbyBjb2x1bW4NCmNhdCgiXG5cbiMjIyMgQXZlcmFnZSBSb2xsaW5nIENBR1JzIGJ5IEluZGV4IHdpdGggUmF0aW86IERhdGFzZXQgKCIsIG1pbl95ZWFyLCAiLSIsIG1heF95ZWFyLCAiKVxuIiwgc2VwID0gIiIpDQppbnRlcmFjdGl2ZV9zdHIoc3VtbWFyeV9kYXRhKQ0KaW50ZXJhY3RpdmVfcHJpbnQoc3VtbWFyeV9kYXRhKQ0KZm9ybWF0X2VxdWFsX3dpZHRoKHN1bW1hcnlfZGF0YSkNCg0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiMjIFNBVkUgVkFMVUVTIEZPUiBJTi1MSU5FIENPREUgSU5DTFVESU5HIFJBVElPUw0KDQojIERlZmluZSB0aGUgbWFwcGluZyBvZiByb3cgbmFtZXMgdG8gdmFyaWFibGUgbmFtZXMNCnJvd190b192YXJfbmFtZSA8LSBjKA0KICAiMS1ZZWFyIENBR1IiID0gIjFfeWVhcl9jYWdyIiwNCiAgIjUtWWVhciBDQUdSIiA9ICI1X3llYXJfY2FnciIsDQogICIxMC1ZZWFyIENBR1IiID0gIjEwX3llYXJfY2FnciIsDQogICIyMC1ZZWFyIENBR1IiID0gIjIwX3llYXJfY2FnciINCikNCg0KIyBEZWZpbmUgYSBjdXN0b20gbWFwcGluZyBmb3IgY29sdW1uIG5hbWVzDQpjb2x1bW5fbmFtZV9tYXBwaW5nIDwtIGMoDQogICJTUFgiID0gInNweCIsDQogICJRUVEiID0gInFxcSIsDQogICJSYXRpbyIgPSAicmF0aW8iDQopDQoNCiMgRnVuY3Rpb24gdG8gc2F2ZSBzdW1tYXJ5IHZhbHVlcyBkeW5hbWljYWxseSB3aXRoIGNvbHVtbiBuYW1lIG1hcHBpbmcNCnNhdmVfY29sdW1uX3ZhbHVlcyA8LSBmdW5jdGlvbihzdW1tYXJ5X2RmLCByb3dfbWFwcGluZywgY29sdW1uX21hcHBpbmcsIHByZWZpeCA9ICIiKSB7DQogICMgR2V0IHRoZSBjb2x1bW4gbmFtZXMgaW4gdGhlIGRhdGEgZnJhbWUNCiAgY29sdW1uc190b19zYXZlIDwtIHNldGRpZmYobmFtZXMoc3VtbWFyeV9kZiksIGMoIk1ldHJpYyIsICJSYW5nZSIpKSAgIyBFeGNsdWRlIHRoZSBNZXRyaWMgYW5kIFJhbmdlIGNvbHVtbnMNCiAgDQogICMgSXRlcmF0ZSBvdmVyIGVhY2ggY29sdW1uDQogIGZvciAoY29sIGluIGNvbHVtbnNfdG9fc2F2ZSkgew0KICAgICMgVXNlIHRoZSBjdXN0b20gbWFwcGluZyB0byBnZXQgdGhlIGFwcHJvcHJpYXRlIGNvbHVtbiBuYW1lDQogICAgY29sX25hbWUgPC0gY29sdW1uX21hcHBpbmdbW2NvbF1dICV8fCUgdG9sb3dlcihnc3ViKCJbXmEtekEtWjAtOV0iLCAiXyIsIGNvbCkpDQogICAgDQogICAgIyBFeHRyYWN0IHZhbHVlcyBmb3IgdGhlIGN1cnJlbnQgY29sdW1uDQogICAgY29sX3ZhbHVlcyA8LSBzdW1tYXJ5X2RmW1tjb2xdXQ0KICAgIA0KICAgICMgSXRlcmF0ZSBvdmVyIHJvd3MgdG8gc2F2ZSBlYWNoIHZhbHVlIGR5bmFtaWNhbGx5DQogICAgZm9yIChpIGluIHNlcV9hbG9uZyhjb2xfdmFsdWVzKSkgew0KICAgICAgIyBHZXQgdGhlIGNvcnJlc3BvbmRpbmcgdmFyaWFibGUgbmFtZSBmcm9tIHRoZSBtYXBwaW5nDQogICAgICBzdGF0X25hbWUgPC0gcm93X21hcHBpbmdbc3VtbWFyeV9kZiRNZXRyaWNbaV1dDQogICAgICANCiAgICAgIGlmICghaXMubmEoc3RhdF9uYW1lKSkgeyAgIyBTa2lwIGlmIG5vIG1hcHBpbmcgaXMgZGVmaW5lZA0KICAgICAgICAjIENyZWF0ZSB0aGUgdmFyaWFibGUgbmFtZSB3aXRoIHRoZSBwcmVmaXgNCiAgICAgICAgdmFyX25hbWUgPC0gcGFzdGUwKHByZWZpeCwgc3RhdF9uYW1lLCAiXyIsIGNvbF9uYW1lKQ0KICAgICAgICANCiAgICAgICAgIyBBdHRlbXB0IG51bWVyaWMgY29udmVyc2lvbiBmb3IgZG93bnN0cmVhbSB1c2UNCiAgICAgICAgdmFsdWUgPC0gc3VwcHJlc3NXYXJuaW5ncyhhcy5udW1lcmljKGdzdWIoIiUiLCAiIiwgY29sX3ZhbHVlc1tpXSkpKQ0KICAgICAgICANCiAgICAgICAgIyBBc3NpZ24gdGhlIHZhbHVlIHRvIHRoZSBnbG9iYWwgZW52aXJvbm1lbnQNCiAgICAgICAgYXNzaWduKHZhcl9uYW1lLCB2YWx1ZSwgZW52aXIgPSAuR2xvYmFsRW52KQ0KICAgICAgfQ0KICAgIH0NCiAgfQ0KfQ0KDQojIENhbGwgdGhlIGZ1bmN0aW9uIHdpdGggYSBwcmVmaXgNCnNhdmVfY29sdW1uX3ZhbHVlcyhzdW1tYXJ5X2RhdGEsIHJvd190b192YXJfbmFtZSwgY29sdW1uX25hbWVfbWFwcGluZywgcHJlZml4ID0gInJvbGxpbmdfYXZnXyIpDQoNCiMgRXhhbXBsZTogQWNjZXNzaW5nIGR5bmFtaWNhbGx5IGNyZWF0ZWQgdmFyaWFibGVzDQppbnRlcmFjdGl2ZV9wcmludChyb2xsaW5nX2F2Z18xX3llYXJfY2Fncl9zcHgpICAjIFNob3VsZCBwcmludCB0aGUgMS1ZZWFyIENBR1IgZm9yIFNQWA0KaW50ZXJhY3RpdmVfcHJpbnQocm9sbGluZ19hdmdfMV95ZWFyX2NhZ3JfcXFxKSAgICAjIFNob3VsZCBwcmludCB0aGUgMS1ZZWFyIENBR1IgZm9yIFFRUQ0KaW50ZXJhY3RpdmVfcHJpbnQocm9sbGluZ19hdmdfMV95ZWFyX2NhZ3JfcmF0aW8pICAjIFNob3VsZCBwcmludCB0aGUgUmF0aW8gZm9yIDEtWWVhciBDQUdSDQppbnRlcmFjdGl2ZV9wcmludChyb2xsaW5nX2F2Z181X3llYXJfY2Fncl9yYXRpbykgICMgU2hvdWxkIHByaW50IHRoZSBSYXRpbyBmb3IgNS1ZZWFyIENBR1INCg0KYGBgDQoNCkNvbXBhcmluZyB0aGUgQ0FHUiBhdmVyYWdlcyBwcm92aWRlcyBhIHN0YW5kYXJkaXplZCB3YXkgdG8gZXZhbHVhdGUgdGhlIHBlcmZvcm1hbmNlIG9mIGRpZmZlcmVudCBpbmRleGVzIG92ZXIgdmFyeWluZyB0aW1lIGhvcml6b25zLiBVbmxpa2Ugc2luZ2xlLXBvaW50IGdyb3d0aCByYXRlcywgcm9sbGluZyBDQUdScyBzbW9vdGggb3V0IHNob3J0LXRlcm0gZmx1Y3R1YXRpb25zIGFuZCBvZmZlciBhIGNsZWFyZXIgcGljdHVyZSBvZiBsb25nLXRlcm0gdHJlbmRzLiBUaGUgcmF0aW9zIHVuZGVyc2NvcmVzIHRoZSByZWxhdGl2ZSBncm93dGggZHluYW1pY3MgYmV0d2VlbiB0aGUgdHdvIGluZGV4ZXMsIGlsbHVzdHJhdGluZyB0aGUgbWFnbml0dWRlIG9mIFFRUSdzIG91dHBlcmZvcm1hbmNlIG92ZXIgZWFjaCBwZXJpb2QuDQoNClRoZSBncmFwaCBhbmQgYWNjb21wYW55aW5nIGRhdGEgdGFibGUgaWxsdXN0cmF0ZSB0aGUgYXZlcmFnZSByb2xsaW5nIENBR1JzIG9mIFNQWCBhbmQgUVFRIG92ZXIgdmFyaW91cyB0aW1lIHBlcmlvZHMsIGZyb20gMS15ZWFyIHRvIDIwLXllYXIgaW50ZXJ2YWxzLiBBY3Jvc3MgYWxsIHJvbGxpbmcgcGVyaW9kcywgUVFRIGNvbnNpc3RlbnRseSBvdXRwZXJmb3JtcyBTUFgsIHdpdGggYSAxLVllYXIgQ0FHUiBvZiBgciByb2xsaW5nX2F2Z18xX3llYXJfY2Fncl9xcXFgJSBjb21wYXJlZCB0byBTUFgncyBgciByb2xsaW5nX2F2Z18xX3llYXJfY2Fncl9zcHhgJSwgYW5kIGEgMjAtWWVhciBDQUdSIG9mIGByIHJvbGxpbmdfYXZnXzIwX3llYXJfY2Fncl9xcXFgJSBjb21wYXJlZCB0byBTUFgncyBgciByb2xsaW5nX2F2Z18yMF95ZWFyX2NhZ3Jfc3B4YCUuIFRoZSByYXRpb3Mgb2YgU1BYIHRvIFFRUSBDQUdScyBmdXJ0aGVyIGhpZ2hsaWdodCB0aGlzIGRpc3Bhcml0eSwgd2l0aCB2YWx1ZXMgcmFuZ2luZyBmcm9tIGByIHJvbGxpbmdfYXZnXzFfeWVhcl9jYWdyX3JhdGlvYCBmb3IgdGhlIDEtWWVhciBDQUdSIHRvIGByIHJvbGxpbmdfYXZnXzEwX3llYXJfY2Fncl9yYXRpb2AgZm9yIHRoZSAxMC1ZZWFyIENBR1IsIHJlZmxlY3RpbmcgUVFRJ3Mgc3Ryb25nZXIgcGVyZm9ybWFuY2UgcmVsYXRpdmUgdG8gdGhlIGJyb2FkZXIgbWFya2V0IGluZGV4LiANCg0KRWFybHkgeWVhcnMgc2hvdyBzaWduaWZpY2FudCBvdXRwZXJmb3JtYW5jZSBieSBTUFgsIGJ1dCBtb3N0IG9mIHRoZSBzdWJzZXF1ZW50IHllYXJzIGFyZSBkb21pbmF0ZWQgYnkgc3Ryb25nZXIgUVFRIGdyb3d0aC4gU2luY2UgdGhlIHJvbGxpbmcgQ0FHUiBoZWF2aWx5IHdlaWdodHMgdGhlIG1ham9yaXR5IG9mIHllYXJzIHdoZXJlIFFRUSBoYWQgc3Ryb25nZXIgcGVyZm9ybWFuY2UsIHRoZSBhdmVyYWdlIENBR1IgZm9yIFFRUSByZW1haW5zIGNvbnNpc3RlbnRseSBoaWdoZXIgdGhhbiBTUFggYWNyb3NzIGRpZmZlcmVudCByb2xsaW5nIHBlcmlvZHMuIEhvd2V2ZXIsIHRoZSBzdHJvbmcgaW5pdGlhbCBvdXRwZXJmb3JtYW5jZSBvZiBTUFggaW4gZWFybHkgeWVhcnMgcHJldmVudHMgdGhlIHJhdGlvIGJldHdlZW4gdGhlIHR3byBpbmRpY2VzIGZyb20gZGl2ZXJnaW5nIGZ1cnRoZXIuDQoNCiMjIyMgR3JhcGgNCg0KYGBge3IgaW5kZXhfY29tcGFyaXNvbl9jYWdyX2F2ZXJhZ2VzX3N1bW1hcnlfZ3JhcGhfdXBkYXRlZCwgZmlnLndpZHRoPTEwLCBmaWcuaGVpZ2h0PTcsIGV2YWw9VFJVRSwgZWNobz1GQUxTRX0NCg0KIyBEZWZpbmUgYSBoZWxwZXIgZnVuY3Rpb24gdG8gcmVtb3ZlICIlIiBhbmQgY29udmVydCB0byBudW1lcmljDQpjbGVhbl9wZXJjZW50YWdlIDwtIGZ1bmN0aW9uKGNvbHVtbikgew0KICBhcy5udW1lcmljKGdzdWIoIiUiLCAiIiwgY29sdW1uKSkNCn0NCg0KIyBFbnN1cmUgYWxsIGNvbHVtbnMgYXJlIG51bWVyaWMgYW5kIGZvcm1hdCB0aGUgUmF0aW8gcHJvcGVybHkNCnN1bW1hcnlfZGF0YSA8LSBzdW1tYXJ5X2RhdGEgJT4lDQogIG11dGF0ZSgNCiAgICBgU1BYYCA9IGNsZWFuX3BlcmNlbnRhZ2UoYFNQWGApLA0KICAgIGBRUVFgID0gY2xlYW5fcGVyY2VudGFnZShgUVFRYCksDQogICAgUmF0aW8gPSBhcy5udW1lcmljKFJhdGlvKSAjIEVuc3VyZSBSYXRpbyBpcyBudW1lcmljDQogICkNCg0KIyBDb21iaW5lIE1ldHJpYywgUmFuZ2UsIGFuZCBSYXRpbyBpbnRvIGEgc2luZ2xlIGxhYmVsDQpzdW1tYXJ5X2RhdGEgPC0gc3VtbWFyeV9kYXRhICU+JQ0KICBtdXRhdGUoDQogICAgTGFiZWwgPSBwYXN0ZTAoDQogICAgICBNZXRyaWMsICJcbigiLCBSYW5nZSwgIikiLA0KICAgICAgIlxuUmF0aW8gIiwgc3ByaW50ZigiJS4yZiIsIFJhdGlvKSAjIFJhdGlvIGlzIG5vdyBudW1lcmljDQogICAgKQ0KICApDQoNCg0KIyBDb252ZXJ0IHRvIGxvbmcgZm9ybWF0IGZvciBnZ3Bsb3QyDQpsaWJyYXJ5KHJlc2hhcGUyKQ0Kc3VtbWFyeV9kYXRhX2xvbmcgPC0gbWVsdChzdW1tYXJ5X2RhdGEsIGlkLnZhcnMgPSBjKCJNZXRyaWMiLCAiUmFuZ2UiLCAiTGFiZWwiLCAiUmF0aW8iKSwgdmFyaWFibGUubmFtZSA9ICJJbmRleCIsIHZhbHVlLm5hbWUgPSAiQ0FHUiIpDQoNCiMgRW5zdXJlIHRoZSBNZXRyaWMgY29sdW1uIGhhcyB0aGUgZGVzaXJlZCBvcmRlcg0Kc3VtbWFyeV9kYXRhX2xvbmckTGFiZWwgPC0gZmFjdG9yKHN1bW1hcnlfZGF0YV9sb25nJExhYmVsLCBsZXZlbHMgPSB1bmlxdWUoc3VtbWFyeV9kYXRhJExhYmVsKSkNCg0KIyBDcmVhdGUgdGhlIGJhciBncmFwaA0KZ2dwbG90KHN1bW1hcnlfZGF0YV9sb25nLCBhZXMoeCA9IExhYmVsLCB5ID0gQ0FHUiwgZmlsbCA9IEluZGV4KSkgKw0KICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IiwgcG9zaXRpb24gPSAiZG9kZ2UiKSArDQogIA0KICAjIEFkZCB0ZXh0IHZhbHVlcyBvbiB0b3Agb2YgYmFycw0KICBnZW9tX3RleHQoDQogICAgYWVzKGxhYmVsID0gc3ByaW50ZigiJS4yZiUlIiwgQ0FHUikpLA0KICAgIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAwLjkpLA0KICAgIHZqdXN0ID0gLTAuNSwgIyBQb3NpdGlvbiBhYm92ZSB0aGUgYmFyDQogICAgc2l6ZSA9IDQgICAgICAjIFNldCB0ZXh0IHNpemUNCiAgKSArDQogIA0KICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gc2NhbGVzOjpwZXJjZW50X2Zvcm1hdChzY2FsZSA9IDEpKSArDQogIGxhYnMoDQogICAgdGl0bGUgPSAiQXZlcmFnZSBSb2xsaW5nIENBR1JzIEJ5IEluZGV4IiwNCiAgICBzdWJ0aXRsZSA9IHBhc3RlKCJDb21wYXJpc29uIG9mIFNQWCBhbmQgUVFRIERhdGFzZXQgKCIsIG1pbl95ZWFyLCAiLSIsIG1heF95ZWFyLCAiKSIsIHNlcCA9ICIiKSwNCiAgICB4ID0gIlJvbGxpbmcgUGVyaW9kIiwNCiAgICB5ID0gIkNBR1IgVmFsdWUiLA0KICAgIGZpbGwgPSAiSW5kZXgiDQogICkgKw0KICB0aGVtZV9taW5pbWFsKCkgKw0KICB0aGVtZSgNCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAyMCksIA0KICAgIHBsb3Quc3VidGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0KSwNCiAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0LCBtYXJnaW4gPSBtYXJnaW4odCA9IDEwKSksICMgQWRkIHNwYWNlIGFib3ZlIFgtYXhpcyB0aXRsZQ0KICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQpLCAgICAgICAgICAgICAgICAgICAgICAgICAjIExhcmdlciBZLWF4aXMgdGl0bGUgZm9udA0KICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiwgdmp1c3QgPSAwLjUpLCAgICAgICAgICAgICAjIEFkanVzdCBYLWF4aXMgdGV4dCBzaXplIGFuZCBzcGFjaW5nDQogICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0KSwgICAgICAgICAgICAgICAgICAgICAgICAgICMgTGFyZ2VyIFktYXhpcyB0ZXh0DQogICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCksICAgICAgICAgICAgICAgICAgICAgICAgICMgTGVnZW5kIHRpdGxlIHNpemUNCiAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIpLCAgICAgICAgICAgICAgICAgICAgICAgICAgIyBMZWdlbmQgdGV4dCBzaXplDQogICAgcGFuZWwuZ3JpZC5tYWpvciA9IGVsZW1lbnRfbGluZShsaW5ldHlwZSA9ICJkb3R0ZWQiLCBjb2xvciA9ICJibGFjayIpLCAgIyBNYWpvciBncmlkIGxpbmVzDQogICAgcGFuZWwuZ3JpZC5taW5vci54ID0gZWxlbWVudF9ibGFuaygpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICMgTm8gbWlub3IgWCBncmlkIGxpbmVzDQogICAgYXhpcy50aWNrcy5sZW5ndGggPSB1bml0KC0wLjI1LCAiY20iKSwgICAgICAgICAgICAgICAgICAgICAgICAgICMgSW5jcmVhc2UgdGljayBsZW5ndGgNCiAgICBheGlzLnRpY2tzID0gZWxlbWVudF9saW5lKGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDAuNTApLCAgICAgICAgIyBEYXJrZXIgdGlja3MNCiAgICBheGlzLmxpbmUueCA9IGVsZW1lbnRfbGluZShjb2xvciA9ICJibGFjayIsIHNpemUgPSAwLjc1KSwgICAgICAgIyBEYXJrIGJvdHRvbSBib3JkZXINCiAgICBheGlzLmxpbmUueSA9IGVsZW1lbnRfbGluZShjb2xvciA9ICJibGFjayIsIHNpemUgPSAwLjc1KSAgICAgICAgIyBEYXJrIGxlZnQgYm9yZGVyDQogICkNCg0KDQoNCmBgYA0KDQojIyMgTGluZWFyIFJlZ3Jlc3Npb24NCg0KIyMjIyBEYXRhDQojIFRPIEJFIENPTlRJTlVFRCANClVwZGF0ZSB0aGUgZm9sbG93aW5nLiANCkluc3RlYWQgb2YgZmlsdGVyaW5nIE5BcyB0byBjYWxjdWxhdGUgdGhlIGxpbmVhciByZWdyZXNzaW9uIHNsb3BlLCB1c2UgdGhlIHNweF8xMF95ZWFyX2NhZ3Jfc2xvcGVzIGFuZCBxcXFfMTBfeWVhcl9jYWdyX3Nsb3Blcw0KU2xvcGVzIGFyZSBhbHJlYWR5IGNhbGN1bGF0ZWQ7IGZpbHRlciB0aGUgZGF0ZSByYW5nZSBhbmQgc3VtbWFyaXplIHRoZSBhdmVyYWdlIDEwLVllYXIgU2xvcGUgZm9yIGVhY2ggaW5kZXggYW5kIENBR1IgY29sdW1uOyBRUVEgMTAtWWVhciBzbG9wZXMgZm9yIDIwLVllYXIgQ0FHUiBpcyBub3QgYXZhaWxhYmxlOyBjb25zaWRlciB0byBzdGljayB3aXRoIG1hdGNoaW5nIERhdGVzIG9mIDEwLVllYXJzLiANCg0KYGBge3IgaW5kZXhfY29tcGFyaXNvbl9jYWdyX3Nsb3BlX3N1bW1hcnlfdXBkYXRlZCwgZXZhbD1UUlVFLCBlY2hvPUZBTFNFfQ0KDQojIERlZmluZSBhIGZ1bmN0aW9uIHRvIGZpbHRlciBkYXRhc2V0cyBmb3IgdmFsaWQgZGF0YSBpbiBlYWNoIHJvbGxpbmcgQ0FHUiBwZXJpb2QgYW5kIHdpdGhpbiBtaW4vbWF4IHllYXIgcmFuZ2UNCmZpbHRlcl9kYXRhX2Zvcl9wZXJpb2QgPC0gZnVuY3Rpb24oZGF0YSwgY29sdW1uX25hbWUsIG1pbl95ZWFyLCBtYXhfeWVhcikgew0KICBkYXRhIDwtIGRhdGFbIWlzLm5hKGRhdGFbW2NvbHVtbl9uYW1lXV0pLCBdDQogIGRhdGEgPC0gZGF0YVtkYXRhJERhdGUgPj0gbWluX3llYXIgJiBkYXRhJERhdGUgPD0gbWF4X3llYXIsIF0NCiAgcmV0dXJuKGRhdGEpDQp9DQoNCiMgRmlsdGVyIGRhdGFzZXRzIGZvciBlYWNoIHJvbGxpbmcgcGVyaW9kDQpmaWx0ZXJlZF9zcHhfMXlyIDwtIGZpbHRlcl9kYXRhX2Zvcl9wZXJpb2Qoc3B4X3Jhd19jYWdyLCAiMS1ZZWFyIENBR1IiLCBtaW5feWVhciwgbWF4X3llYXIpDQpmaWx0ZXJlZF9zcHhfNXlyIDwtIGZpbHRlcl9kYXRhX2Zvcl9wZXJpb2Qoc3B4X3Jhd19jYWdyLCAiNS1ZZWFyIENBR1IiLCBtaW5feWVhciwgbWF4X3llYXIpDQpmaWx0ZXJlZF9zcHhfMTB5ciA8LSBmaWx0ZXJfZGF0YV9mb3JfcGVyaW9kKHNweF9yYXdfY2FnciwgIjEwLVllYXIgQ0FHUiIsIG1pbl95ZWFyLCBtYXhfeWVhcikNCmZpbHRlcmVkX3NweF8yMHlyIDwtIGZpbHRlcl9kYXRhX2Zvcl9wZXJpb2Qoc3B4X3Jhd19jYWdyLCAiMjAtWWVhciBDQUdSIiwgbWluX3llYXIsIG1heF95ZWFyKQ0KDQpmaWx0ZXJlZF9xcXFfMXlyIDwtIGZpbHRlcl9kYXRhX2Zvcl9wZXJpb2QocXFxX3Jhd19jYWdyLCAiMS1ZZWFyIENBR1IiLCBtaW5feWVhciwgbWF4X3llYXIpDQpmaWx0ZXJlZF9xcXFfNXlyIDwtIGZpbHRlcl9kYXRhX2Zvcl9wZXJpb2QocXFxX3Jhd19jYWdyLCAiNS1ZZWFyIENBR1IiLCBtaW5feWVhciwgbWF4X3llYXIpDQpmaWx0ZXJlZF9xcXFfMTB5ciA8LSBmaWx0ZXJfZGF0YV9mb3JfcGVyaW9kKHFxcV9yYXdfY2FnciwgIjEwLVllYXIgQ0FHUiIsIG1pbl95ZWFyLCBtYXhfeWVhcikNCmZpbHRlcmVkX3FxcV8yMHlyIDwtIGZpbHRlcl9kYXRhX2Zvcl9wZXJpb2QocXFxX3Jhd19jYWdyLCAiMjAtWWVhciBDQUdSIiwgbWluX3llYXIsIG1heF95ZWFyKQ0KDQojIEVuc3VyZSBtYXRjaGluZyBkYXRlcyBmb3IgZWFjaCBwZXJpb2QNCmNvbW1vbl9kYXRlc18xeXIgPC0gaW50ZXJzZWN0KGZpbHRlcmVkX3NweF8xeXIkRGF0ZSwgZmlsdGVyZWRfcXFxXzF5ciREYXRlKQ0KY29tbW9uX2RhdGVzXzV5ciA8LSBpbnRlcnNlY3QoZmlsdGVyZWRfc3B4XzV5ciREYXRlLCBmaWx0ZXJlZF9xcXFfNXlyJERhdGUpDQpjb21tb25fZGF0ZXNfMTB5ciA8LSBpbnRlcnNlY3QoZmlsdGVyZWRfc3B4XzEweXIkRGF0ZSwgZmlsdGVyZWRfcXFxXzEweXIkRGF0ZSkNCmNvbW1vbl9kYXRlc18yMHlyIDwtIGludGVyc2VjdChmaWx0ZXJlZF9zcHhfMjB5ciREYXRlLCBmaWx0ZXJlZF9xcXFfMjB5ciREYXRlKQ0KDQojIEZpbHRlciBkYXRhc2V0cyB0byBpbmNsdWRlIG9ubHkgbWF0Y2hpbmcgZGF0ZXMgZm9yIGVhY2ggcGVyaW9kDQpmaWx0ZXJlZF9zcHhfMXlyIDwtIGZpbHRlcmVkX3NweF8xeXJbZmlsdGVyZWRfc3B4XzF5ciREYXRlICVpbiUgY29tbW9uX2RhdGVzXzF5ciwgXQ0KZmlsdGVyZWRfcXFxXzF5ciA8LSBmaWx0ZXJlZF9xcXFfMXlyW2ZpbHRlcmVkX3FxcV8xeXIkRGF0ZSAlaW4lIGNvbW1vbl9kYXRlc18xeXIsIF0NCg0KZmlsdGVyZWRfc3B4XzV5ciA8LSBmaWx0ZXJlZF9zcHhfNXlyW2ZpbHRlcmVkX3NweF81eXIkRGF0ZSAlaW4lIGNvbW1vbl9kYXRlc181eXIsIF0NCmZpbHRlcmVkX3FxcV81eXIgPC0gZmlsdGVyZWRfcXFxXzV5cltmaWx0ZXJlZF9xcXFfNXlyJERhdGUgJWluJSBjb21tb25fZGF0ZXNfNXlyLCBdDQoNCmZpbHRlcmVkX3NweF8xMHlyIDwtIGZpbHRlcmVkX3NweF8xMHlyW2ZpbHRlcmVkX3NweF8xMHlyJERhdGUgJWluJSBjb21tb25fZGF0ZXNfMTB5ciwgXQ0KZmlsdGVyZWRfcXFxXzEweXIgPC0gZmlsdGVyZWRfcXFxXzEweXJbZmlsdGVyZWRfcXFxXzEweXIkRGF0ZSAlaW4lIGNvbW1vbl9kYXRlc18xMHlyLCBdDQoNCmZpbHRlcmVkX3NweF8yMHlyIDwtIGZpbHRlcmVkX3NweF8yMHlyW2ZpbHRlcmVkX3NweF8yMHlyJERhdGUgJWluJSBjb21tb25fZGF0ZXNfMjB5ciwgXQ0KZmlsdGVyZWRfcXFxXzIweXIgPC0gZmlsdGVyZWRfcXFxXzIweXJbZmlsdGVyZWRfcXFxXzIweXIkRGF0ZSAlaW4lIGNvbW1vbl9kYXRlc18yMHlyLCBdDQoNCiMgRnVuY3Rpb24gdG8gY2FsY3VsYXRlIHJlZ3Jlc3Npb24gc2xvcGUNCmNhbGN1bGF0ZV9zbG9wZSA8LSBmdW5jdGlvbih2YWx1ZXMsIGRhdGVzKSB7DQogIGlmIChsZW5ndGgodmFsdWVzKSA8IDIpIHJldHVybihOQSkgIyBIYW5kbGUgaW5zdWZmaWNpZW50IGRhdGENCiAgcmVncmVzc2lvbiA8LSBsbSh2YWx1ZXMgfiBkYXRlcykNCiAgcmV0dXJuKHJvdW5kKGNvZWYocmVncmVzc2lvbilbMl0sIDIpKSAjIFJldHVybiBzbG9wZQ0KfQ0KDQojIERldGVybWluZSB0aGUgbWluIGFuZCBtYXggeWVhcnMgZm9yIGVhY2ggcm9sbGluZyBwZXJpb2QNCnllYXJfcmFuZ2VzIDwtIGMoDQogIHBhc3RlMChtaW4oY29tbW9uX2RhdGVzXzF5ciksICItIiwgbWF4KGNvbW1vbl9kYXRlc18xeXIpKSwNCiAgcGFzdGUwKG1pbihjb21tb25fZGF0ZXNfNXlyKSwgIi0iLCBtYXgoY29tbW9uX2RhdGVzXzV5cikpLA0KICBwYXN0ZTAobWluKGNvbW1vbl9kYXRlc18xMHlyKSwgIi0iLCBtYXgoY29tbW9uX2RhdGVzXzEweXIpKSwNCiAgcGFzdGUwKG1pbihjb21tb25fZGF0ZXNfMjB5ciksICItIiwgbWF4KGNvbW1vbl9kYXRlc18yMHlyKSkNCikNCg0KIyBDYWxjdWxhdGUgc2xvcGVzIGZvciBTUFggYW5kIFFRUSBmb3IgZWFjaCByb2xsaW5nIHBlcmlvZA0Kc2xvcGVfZGF0YSA8LSBkYXRhLmZyYW1lKA0KICBNZXRyaWMgPSBjKCIxLVllYXIgQ0FHUiIsICI1LVllYXIgQ0FHUiIsICIxMC1ZZWFyIENBR1IiLCAiMjAtWWVhciBDQUdSIiksDQogIGBTUFhgID0gYygNCiAgICBjYWxjdWxhdGVfc2xvcGUoZmlsdGVyZWRfc3B4XzF5ciRgMS1ZZWFyIENBR1JgLCBmaWx0ZXJlZF9zcHhfMXlyJERhdGUpLA0KICAgIGNhbGN1bGF0ZV9zbG9wZShmaWx0ZXJlZF9zcHhfNXlyJGA1LVllYXIgQ0FHUmAsIGZpbHRlcmVkX3NweF81eXIkRGF0ZSksDQogICAgY2FsY3VsYXRlX3Nsb3BlKGZpbHRlcmVkX3NweF8xMHlyJGAxMC1ZZWFyIENBR1JgLCBmaWx0ZXJlZF9zcHhfMTB5ciREYXRlKSwNCiAgICBjYWxjdWxhdGVfc2xvcGUoZmlsdGVyZWRfc3B4XzIweXIkYDIwLVllYXIgQ0FHUmAsIGZpbHRlcmVkX3NweF8yMHlyJERhdGUpDQogICksDQogIFFRUSA9IGMoDQogICAgY2FsY3VsYXRlX3Nsb3BlKGZpbHRlcmVkX3FxcV8xeXIkYDEtWWVhciBDQUdSYCwgZmlsdGVyZWRfcXFxXzF5ciREYXRlKSwNCiAgICBjYWxjdWxhdGVfc2xvcGUoZmlsdGVyZWRfcXFxXzV5ciRgNS1ZZWFyIENBR1JgLCBmaWx0ZXJlZF9xcXFfNXlyJERhdGUpLA0KICAgIGNhbGN1bGF0ZV9zbG9wZShmaWx0ZXJlZF9xcXFfMTB5ciRgMTAtWWVhciBDQUdSYCwgZmlsdGVyZWRfcXFxXzEweXIkRGF0ZSksDQogICAgY2FsY3VsYXRlX3Nsb3BlKGZpbHRlcmVkX3FxcV8yMHlyJGAyMC1ZZWFyIENBR1JgLCBmaWx0ZXJlZF9xcXFfMjB5ciREYXRlKQ0KICApLA0KICBSYXRpbyA9IE5BLCAgIyBJbml0aWFsaXplIHRoZSBSYXRpbyBjb2x1bW4NCiAgYFJhbmdlYCA9IHllYXJfcmFuZ2VzLA0KICBjaGVjay5uYW1lcyA9IEZBTFNFICMgUHJldmVudCBSIGZyb20gYWx0ZXJpbmcgY29sdW1uIG5hbWVzDQopDQoNCiMgRm9ybWF0IHNsb3BlcyBhbmQgY2FsY3VsYXRlIHRoZSBSYXRpbyBjb2x1bW4NCmlmIChucm93KHNsb3BlX2RhdGEpID4gMCkgew0KICBzbG9wZV9kYXRhJGBTUFhgIDwtIHNwcmludGYoIiUuMmYlJSIsIHNsb3BlX2RhdGEkYFNQWGApDQogIHNsb3BlX2RhdGEkUVFRIDwtIHNwcmludGYoIiUuMmYlJSIsIHNsb3BlX2RhdGEkUVFRKQ0KICBmb3IgKGkgaW4gc2VxX2xlbihucm93KHNsb3BlX2RhdGEpKSkgew0KICAgIHNweF92YWwgPC0gc3VwcHJlc3NXYXJuaW5ncyhhcy5udW1lcmljKGdzdWIoIiUiLCAiIiwgc2xvcGVfZGF0YSRgU1BYYFtpXSkpKQ0KICAgIHFxcV92YWwgPC0gc3VwcHJlc3NXYXJuaW5ncyhhcy5udW1lcmljKGdzdWIoIiUiLCAiIiwgc2xvcGVfZGF0YSRRUVFbaV0pKSkNCiAgICANCiAgICBpZiAoIWlzLm5hKHNweF92YWwpICYmICFpcy5uYShxcXFfdmFsKSAmJiBxcXFfdmFsICE9IDApIHsNCiAgICAgIHNsb3BlX2RhdGEkUmF0aW9baV0gPC0gcm91bmQoc3B4X3ZhbCAvIHFxcV92YWwsIDIpDQogICAgfQ0KICB9DQogIHNsb3BlX2RhdGEkUmF0aW8gPC0gc3ByaW50ZigiJS4yZiIsIHNsb3BlX2RhdGEkUmF0aW8pDQp9IGVsc2Ugew0KICBzdG9wKCJObyBkYXRhIHRvIHN1bW1hcml6ZSBvciByb3dzIGRvIG5vdCBtYXRjaC4iKQ0KfQ0KDQojIFJlb3JkZXIgY29sdW1ucyB0byBNZXRyaWMgLyBTUFggLyBRUVEgLyBSYXRpbyAvIFJhbmdlDQpzbG9wZV9kYXRhIDwtIHNsb3BlX2RhdGFbLCBjKCJNZXRyaWMiLCAiU1BYIiwgIlFRUSIsICJSYXRpbyIsICJSYW5nZSIpXQ0KDQojIENhbGwgdGhlIGZ1bmN0aW9uIHdpdGggYSBwcmVmaXgNCnNhdmVfY29sdW1uX3ZhbHVlcyhzbG9wZV9kYXRhLCByb3dfdG9fdmFyX25hbWUsIGNvbHVtbl9uYW1lX21hcHBpbmcsIHByZWZpeCA9ICJyb2xsaW5nX3Nsb3BlXyIpDQoNCiMgRGlzcGxheSB0aGUgc3VtbWFyeSB3aXRoIGR5bmFtaWMgeWVhciByYW5nZQ0KY2F0KCJcblxuIyMjIyBMaW5lYXIgUmVncmVzc2lvbiBTbG9wZXMgZm9yIFJvbGxpbmcgQ0FHUnMsIERhdGFzZXQgKCIsIG1pbl95ZWFyLCAiLSIsIG1heF95ZWFyLCAiKVxuIiwgc2VwID0gIiIpDQppbnRlcmFjdGl2ZV9wcmludChzbG9wZV9kYXRhKQ0KaW50ZXJhY3RpdmVfc3RyKHNsb3BlX2RhdGEpDQpmb3JtYXRfZXF1YWxfd2lkdGgoc2xvcGVfZGF0YSkNCg0KYGBgDQpUaGUgdGFibGUgYW5kIGFjY29tcGFueWluZyBncmFwaCBzaG93IGhvdyB0aGUgZ3Jvd3RoIHRyZW5kcyBvZiBTUFggYW5kIFFRUSBjaGFuZ2Ugb3ZlciB0aW1lIHVzaW5nIGxpbmVhciByZWdyZXNzaW9uIHNsb3Blcywgc2hvd2luZyBob3cgZmFzdCB0aGUgZ3Jvd3RoIHJhdGVzIGFyZSBpbmNyZWFzaW5nIG9yIGRlY3JlYXNpbmcuIFRoaXMgaGVscHMgdW5kZXJzdGFuZCB0aGUgcGVyaW9kaWMgdHJlbmRzLg0KDQpRUVEgY29uc2lzdGVudGx5IHNob3dzIHN0cm9uZ2VyIGdyb3d0aCB0cmVuZHMgdGhhbiBTUFggYWNyb3NzIGFsbCB0aW1lIHBlcmlvZHMuIEZvciBpbnN0YW5jZSwgUVFRJ3MgMS1ZZWFyIHNsb3BlIGlzIGByIHJvbGxpbmdfc2xvcGVfMV95ZWFyX2NhZ3JfcXFxYCUgY29tcGFyZWQgdG8gU1BYJ3MgYHIgcm9sbGluZ19zbG9wZV8xX3llYXJfY2Fncl9zcHhgJSwgYW5kIHRoaXMgZGlmZmVyZW5jZSBiZWNvbWVzIGV2ZW4gbGFyZ2VyIG92ZXIgMjAgeWVhcnMsIHdpdGggUVFRIGF0IGByIHJvbGxpbmdfc2xvcGVfMjBfeWVhcl9jYWdyX3FxcWAlIHZlcnN1cyBTUFgncyBgciByb2xsaW5nX3Nsb3BlXzIwX3llYXJfY2Fncl9zcHhgJS4gVGhlIHJhdGlvIG9mIFNQWCB0byBRUVEgc2xvcGVzIHNob3dzIGhvdyBtdWNoIGZhc3RlciBRUVEgaXMgZ3Jvd2luZywgcmFuZ2luZyBmcm9tIGByIHJvbGxpbmdfc2xvcGVfMV95ZWFyX2NhZ3JfcmF0aW9gIGZvciB0aGUgMS1ZZWFyIHBlcmlvZCB0byBgciByb2xsaW5nX3Nsb3BlXzIwX3llYXJfY2Fncl9yYXRpb2AgZm9yIHRoZSAyMC1ZZWFyIHBlcmlvZC4gVGhpcyBoaWdobGlnaHRzIFFRUSdzIG1vcmUgYWdncmVzc2l2ZSBncm93dGggcG90ZW50aWFsIG92ZXIgdGltZS4NCg0KIyMjIyBHcmFwaCANCg0KYGBge3IgaW5kZXhfY29tcGFyaXNvbl9jYWdyX3Nsb3BlX3N1bW1hcnlfZ3JhcGhfdXBkYXRlZCwgZmlnLndpZHRoPTEwLCBmaWcuaGVpZ2h0PTcsIGV2YWw9VFJVRSwgZWNobz1GQUxTRX0NCg0KIyBEZWZpbmUgYSBoZWxwZXIgZnVuY3Rpb24gdG8gcmVtb3ZlICIlIiBhbmQgY29udmVydCB0byBudW1lcmljDQpjbGVhbl9wZXJjZW50YWdlIDwtIGZ1bmN0aW9uKGNvbHVtbikgew0KICBhcy5udW1lcmljKGdzdWIoIiUiLCAiIiwgY29sdW1uKSkNCn0NCg0KIyBFbnN1cmUgYWxsIGNvbHVtbnMgYXJlIG51bWVyaWMgYW5kIGZvcm1hdCB0aGUgUmF0aW8gcHJvcGVybHkNCnNsb3BlX2RhdGEgPC0gc2xvcGVfZGF0YSAlPiUNCiAgbXV0YXRlKA0KICAgIGBTUFhgID0gY2xlYW5fcGVyY2VudGFnZShgU1BYYCksDQogICAgYFFRUWAgPSBjbGVhbl9wZXJjZW50YWdlKGBRUVFgKSwNCiAgICBSYXRpbyA9IGFzLm51bWVyaWMoUmF0aW8pICMgRW5zdXJlIFJhdGlvIGlzIG51bWVyaWMNCiAgKQ0KDQojIENvbWJpbmUgTWV0cmljLCBSYW5nZSwgYW5kIFJhdGlvIGludG8gYSBzaW5nbGUgbGFiZWwgZm9yIGJldHRlciByZWFkYWJpbGl0eQ0Kc2xvcGVfZGF0YSA8LSBzbG9wZV9kYXRhICU+JQ0KICBtdXRhdGUoDQogICAgTGFiZWwgPSBwYXN0ZTAoDQogICAgICBNZXRyaWMsICJcbigiLCBSYW5nZSwgIikiLA0KICAgICAgIlxuUmF0aW86ICIsIHNwcmludGYoIiUuMmYiLCBSYXRpbykNCiAgICApDQogICkNCg0KIyBDb252ZXJ0IHRvIGxvbmcgZm9ybWF0IGZvciBnZ3Bsb3QyIGNvbXBhdGliaWxpdHkNCmxpYnJhcnkocmVzaGFwZTIpDQpzbG9wZV9kYXRhX2xvbmcgPC0gbWVsdChzbG9wZV9kYXRhLCBpZC52YXJzID0gYygiTWV0cmljIiwgIlJhbmdlIiwgIkxhYmVsIiwgIlJhdGlvIiksIA0KICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZS5uYW1lID0gIkluZGV4IiwgdmFsdWUubmFtZSA9ICJTbG9wZSIpDQoNCiMgRW5zdXJlIHRoZSBvcmRlciBvZiB0aGUgTGFiZWwgY29sdW1uIG1hdGNoZXMgdGhlIG9yaWdpbmFsIHNlcXVlbmNlDQpzbG9wZV9kYXRhX2xvbmckTGFiZWwgPC0gZmFjdG9yKHNsb3BlX2RhdGFfbG9uZyRMYWJlbCwgbGV2ZWxzID0gdW5pcXVlKHNsb3BlX2RhdGEkTGFiZWwpKQ0KDQojIENyZWF0ZSB0aGUgYmFyIGdyYXBoDQpnZ3Bsb3Qoc2xvcGVfZGF0YV9sb25nLCBhZXMoeCA9IExhYmVsLCB5ID0gU2xvcGUsIGZpbGwgPSBJbmRleCkpICsNCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIsIHBvc2l0aW9uID0gImRvZGdlIikgKw0KICANCiAgIyBBZGQgdGV4dCBsYWJlbHMgdG8gdGhlIGJhcnMNCiAgZ2VvbV90ZXh0KA0KICAgIGFlcyhsYWJlbCA9IHNwcmludGYoIiUuMmYlJSIsIFNsb3BlKSksDQogICAgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDAuOSksDQogICAgdmp1c3QgPSAtMC41LCAjIFBvc2l0aW9uIGxhYmVscyBhYm92ZSB0aGUgYmFycw0KICAgIHNpemUgPSA0ICAgICAgIyBTZXQgdGV4dCBzaXplIGZvciByZWFkYWJpbGl0eQ0KICApICsNCiAgDQogICMgRm9ybWF0IHRoZSB5LWF4aXMgZm9yIHBlcmNlbnRhZ2UgdmFsdWVzDQogIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBzY2FsZXM6OnBlcmNlbnRfZm9ybWF0KHNjYWxlID0gMSkpICsNCiAgDQogICMgU2V0IGdyYXBoIHRpdGxlcyBhbmQgbGFiZWxzDQogIGxhYnMoDQogICAgdGl0bGUgPSAiTGluZWFyIFJlZ3Jlc3Npb24gU2xvcGUgZm9yIFJvbGxpbmcgQ0FHUnMgQnkgSW5kZXgiLA0KICAgIHN1YnRpdGxlID0gcGFzdGUoIkNvbXBhcmlzb24gb2YgU1BYIGFuZCBRUVEgRGF0YXNldCAoIiwgbWluX3llYXIsICItIiwgbWF4X3llYXIsICIpIiwgc2VwID0gIiIpLA0KICAgIHggPSAiUm9sbGluZyBQZXJpb2QiLA0KICAgIHkgPSAiU2xvcGUgVmFsdWUgKCUpIiwNCiAgICBmaWxsID0gIkluZGV4Ig0KICApICsNCiAgDQogICMgQXBwbHkgdGhlbWUgc2V0dGluZ3MgZm9yIGJldHRlciBhZXN0aGV0aWNzDQogIHRoZW1lX21pbmltYWwoKSArDQogIHRoZW1lKA0KICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDIwKSwgDQogICAgcGxvdC5zdWJ0aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQpLA0KICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQsIG1hcmdpbiA9IG1hcmdpbih0ID0gMTApKSwgIyBBZGQgc3BhY2UgYWJvdmUgWC1heGlzIHRpdGxlDQogICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCksICAgICAgICAgICAgICAgICAgICAgICAgICMgTGFyZ2VyIFktYXhpcyB0aXRsZSBmb250DQogICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyLCB2anVzdCA9IDAuNSksICAgICAgICAgICAgICMgQWRqdXN0IFgtYXhpcyB0ZXh0IHNpemUgYW5kIHNwYWNpbmcNCiAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQpLCAgICAgICAgICAgICAgICAgICAgICAgICAgIyBMYXJnZXIgWS1heGlzIHRleHQNCiAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0KSwgICAgICAgICAgICAgICAgICAgICAgICAgIyBMZWdlbmQgdGl0bGUgc2l6ZQ0KICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiksICAgICAgICAgICAgICAgICAgICAgICAgICAjIExlZ2VuZCB0ZXh0IHNpemUNCiAgICBwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9saW5lKGxpbmV0eXBlID0gImRvdHRlZCIsIGNvbG9yID0gImJsYWNrIiksICAjIE1ham9yIGdyaWQgbGluZXMNCiAgICBwYW5lbC5ncmlkLm1pbm9yLnggPSBlbGVtZW50X2JsYW5rKCksICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBObyBtaW5vciBYIGdyaWQgbGluZXMNCiAgICBheGlzLnRpY2tzLmxlbmd0aCA9IHVuaXQoLTAuMjUsICJjbSIpLCAgICAgICAgICAgICAgICAgICAgICAgICAgIyBJbmNyZWFzZSB0aWNrIGxlbmd0aA0KICAgIGF4aXMudGlja3MgPSBlbGVtZW50X2xpbmUoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMC41MCksICAgICAgICAjIERhcmtlciB0aWNrcw0KICAgIGF4aXMubGluZS54ID0gZWxlbWVudF9saW5lKGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDAuNzUpLCAgICAgICAjIERhcmsgYm90dG9tIGJvcmRlcg0KICAgIGF4aXMubGluZS55ID0gZWxlbWVudF9saW5lKGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDAuNzUpICAgICAgICAjIERhcmsgbGVmdCBib3JkZXINCiAgKQ0KYGBgDQoNClRoZXJlIGFyZSBjb25zaXN0ZW50bHkgaGlnaGVyIHNsb3BlcyBmb3IgUVFRIGNvbXBhcmVkIHRvIFNQWC4gSWYgd2UgcmVmZXIgYmFjayB0byBTUFggVlMgUVFROiBBbm51YWwgR1Igc2VjdGlvbiwgd2UgZmluZCBzaGFycCBzd2luZ3MgKGUuZy4sIGR1cmluZyAyMDA4IGFuZCAyMDIwKSBhbmQgcGVyaW9kcyBvZiBjb25zaXN0ZW50IHRyZW5kcyAoZS5nLiwgUVFR4oCZcyBzdHJvbmcgcG9zdC0yMDA5IGdyb3d0aCkuIFRoaXMgc2lnbmlmaWNhbnRseSBpbmZsdWVuY2VkIHRoZSBzbG9wZSBjYWxjdWxhdGlvbnMsIHBhcnRpY3VsYXJseSBmb3Igc2hvcnRlciByb2xsaW5nIHBlcmlvZHMgbGlrZSB0aGUgMS15ZWFyIENBR1IsIGFzIGxhcmdlciB2YXJpYWJpbGl0eSBhbmQgb3V0bGllcnMgKGUuZy4sIGV4dHJlbWUgbmVnYXRpdmUgb3IgcG9zaXRpdmUgZ3Jvd3RoIHllYXJzKSBhbXBsaWZ5IHRoZSBzbG9wZSB2YWx1ZS4NCg0KIyMjIFByb2plY3Rpb24NCg0KIyMjIyBBbm51YWwgKyBTbG9wZQ0KDQpgYGB7ciBjYWdyXzF5ZWFyX3Byb2plY3Rpb24sIGZpZy53aWR0aD0xMCwgZmlnLmhlaWdodD03LCBldmFsPVRSVUUsIGVjaG89RkFMU0V9DQoNCiMgRW5zdXJlIHRoZSBsaWJyYXJpZXMgYXJlIGxvYWRlZA0KbGlicmFyeShnZ3Bsb3QyKQ0KbGlicmFyeShkcGx5cikNCmxpYnJhcnkodGlkeXIpDQoNCiMgRGVidWdnaW5nOiBDaGVjayBgc3VtbWFyeV9kYXRhYCBhbmQgYHNsb3BlX2RhdGFgIHN0cnVjdHVyZXMNCiMgY29sbmFtZXMoc3VtbWFyeV9kYXRhKSAgIyBTaG91bGQgaW5jbHVkZSAiTWV0cmljIiwgIlNQWCIsICJRUVEiDQojIGNvbG5hbWVzKHNsb3BlX2RhdGEpICAgICMgU2hvdWxkIGluY2x1ZGUgIk1ldHJpYyIsICJTUFgiLCAiUVFRIg0KDQojIEV4dHJhY3Qgc3RhcnRpbmcgdmFsdWVzIGZvciAxLVllYXIgQ0FHUiBmcm9tIHN1bW1hcnlfZGF0YQ0Kc3B4X3N0YXJ0IDwtIGFzLm51bWVyaWMoZ3N1YigiJSIsICIiLCBzdW1tYXJ5X2RhdGEkYFNQWGBbc3VtbWFyeV9kYXRhJE1ldHJpYyA9PSAiMS1ZZWFyIENBR1IiXSkpDQpxcXFfc3RhcnQgPC0gYXMubnVtZXJpYyhnc3ViKCIlIiwgIiIsIHN1bW1hcnlfZGF0YSRRUVFbc3VtbWFyeV9kYXRhJE1ldHJpYyA9PSAiMS1ZZWFyIENBR1IiXSkpDQoNCiMgc3B4X3N0YXJ0IDwtIDEwMA0KIyBxcXFfc3RhcnQgPC0gMTAwDQoNCiMgRW5zdXJlIHRoZSBzdGFydGluZyB2YWx1ZXMgYXJlIHZhbGlkDQppZiAobGVuZ3RoKHNweF9zdGFydCkgPT0gMCB8fCBsZW5ndGgocXFxX3N0YXJ0KSA9PSAwKSB7DQogIHN0b3AoIkZhaWxlZCB0byBleHRyYWN0IHN0YXJ0aW5nIHZhbHVlcyBmb3IgU1BYIG9yIFFRUSBmcm9tIHN1bW1hcnlfZGF0YS4iKQ0KfQ0KDQojIFJlbW92ZSBwZXJjZW50YWdlIHN5bWJvbHMgYW5kIGNvbnZlcnQgc2xvcGVzIHRvIG51bWVyaWMNCnNsb3BlX2RhdGEkYFNQWGAgPC0gYXMubnVtZXJpYyhnc3ViKCIlIiwgIiIsIHNsb3BlX2RhdGEkYFNQWGApKQ0Kc2xvcGVfZGF0YSRRUVEgPC0gYXMubnVtZXJpYyhnc3ViKCIlIiwgIiIsIHNsb3BlX2RhdGEkUVFRKSkNCg0KIyBFeHRyYWN0IHNsb3BlcyBmb3IgMS1ZZWFyIENBR1INCnNweF9zbG9wZSA8LSBzbG9wZV9kYXRhJGBTUFhgW3Nsb3BlX2RhdGEkTWV0cmljID09ICIxLVllYXIgQ0FHUiJdDQpxcXFfc2xvcGUgPC0gc2xvcGVfZGF0YSRRUVFbc2xvcGVfZGF0YSRNZXRyaWMgPT0gIjEtWWVhciBDQUdSIl0NCg0KIyBFbnN1cmUgc2xvcGVzIGFyZSB2YWxpZCBudW1lcmljIHZhbHVlcw0KaWYgKGxlbmd0aChzcHhfc2xvcGUpID09IDAgfHwgbGVuZ3RoKHFxcV9zbG9wZSkgPT0gMCkgew0KICBzdG9wKCJGYWlsZWQgdG8gZXh0cmFjdCB2YWxpZCBudW1lcmljIHNsb3BlcyBmb3IgU1BYIG9yIFFRUSBmcm9tIHNsb3BlX2RhdGEuIikNCn0NCg0KDQojIEZpbmQgdGhlIG1pbmltdW0gYW5kIG1heGltdW0geWVhcg0KbWluX3llYXIgPC0gbWluKG1lcmdlZF9kYXRhJERhdGUsIG5hLnJtID0gVFJVRSkNCm1heF95ZWFyIDwtIG1heChtZXJnZWRfZGF0YSREYXRlLCBuYS5ybSA9IFRSVUUpDQppbnRlcmFjdGl2ZV9wcmludChtaW5feWVhcikNCmludGVyYWN0aXZlX3ByaW50KG1heF95ZWFyKQ0KDQojIFNldCBkYXRlIHJhbmdlDQpzdGFydF95ZWFyID0gYXMubnVtZXJpYyhtYXhfeWVhcikNCm51bWJlcl95ZWFycyA9IDIwDQplbmRfeWVhciA9IHN1bShzdGFydF95ZWFyICsgbnVtYmVyX3llYXJzKQ0KDQojIERlZmluZSBicmVha3Mgcm91bmRlZCBhcHByb3ByaWF0ZWx5DQpsaW1pdHNfc3RhcnRfeWVhciA8LSBmbG9vcihzdGFydF95ZWFyIC8gMikgKiAyICAjIFJvdW5kIGRvd24gdG8gdGhlIG5lYXJlc3QgbXVsdGlwbGUgb2YgMg0KbGltaXRzX2VuZF95ZWFyIDwtIGNlaWxpbmcoZW5kX3llYXIgLyAyKSAqIDIgICAjIFJvdW5kIHVwIHRvIHRoZSBuZWFyZXN0IG11bHRpcGxlIG9mIDINCiAgDQojIEluaXRpYWxpemUgdGhlIHByb2plY3Rpb25zIGRhdGFmcmFtZSB3aXRoIHRoZSBzdGFydGluZyB5ZWFyIGFuZCBpbml0aWFsIHZhbHVlcw0KcHJvamVjdGlvbnMgPC0gZGF0YS5mcmFtZSgNCiAgRGF0ZSA9IHN0YXJ0X3llYXIsDQogIGBTUFhgID0gc3B4X3N0YXJ0LA0KICBRUVEgPSBxcXFfc3RhcnQNCikNCg0KIyBSZW5hbWUgdGhlIGNvbHVtbiBmcm9tICJTLlAuNTAwIiB0byAiU1BYIg0KY29sbmFtZXMocHJvamVjdGlvbnMpW2NvbG5hbWVzKHByb2plY3Rpb25zKSA9PSAiUy5QLjUwMCJdIDwtICJTUFgiDQoNCiMgVmVyaWZ5IHRoZSBjaGFuZ2UNCmludGVyYWN0aXZlX3N0cihwcm9qZWN0aW9ucykNCiMgRW5zdXJlIHRoZSBjb2x1bW4gbmFtZXMgYXJlIGNvbnNpc3RlbnQNCiMgY29sbmFtZXMocHJvamVjdGlvbnMpDQoNCiMgQ29tcHV0ZSBwcm9qZWN0aW9ucyBmb3IgdGhlIG5leHQgMjAgeWVhcnMNCmZvciAoaSBpbiAxOm51bWJlcl95ZWFycykgew0KICBuZXdfcm93IDwtIGRhdGEuZnJhbWUoDQogICAgRGF0ZSA9IHN0YXJ0X3llYXIgKyBpLA0KICAgIGBTUFhgID0gcHJvamVjdGlvbnMkYFNQWGBbaV0gKyBzcHhfc2xvcGUsDQogICAgUVFRID0gcHJvamVjdGlvbnMkUVFRW2ldICsgcXFxX3Nsb3BlDQogICkNCiAgDQogICMgRW5zdXJlIHRoZSBuZXcgcm93IGhhcyB0aGUgc2FtZSBjb2x1bW4gbmFtZXMgYXMgdGhlIHByb2plY3Rpb25zIGRhdGFmcmFtZQ0KICBjb2xuYW1lcyhuZXdfcm93KSA8LSBjb2xuYW1lcyhwcm9qZWN0aW9ucykNCiAgDQogICMgQXBwZW5kIHRoZSBuZXcgcm93DQogIHByb2plY3Rpb25zIDwtIHJiaW5kKHByb2plY3Rpb25zLCBuZXdfcm93KQ0KfQ0KDQojIFNvcnQgdGhlIHByb2plY3Rpb25zIGRhdGFmcmFtZSBieSBEYXRlIGluIGRlc2NlbmRpbmcgb3JkZXINCnByb2plY3Rpb25zIDwtIHByb2plY3Rpb25zICU+JQ0KICBhcnJhbmdlKGRlc2MoRGF0ZSkpDQoNCiMgRm9ybWF0IFNQWCwgUVFRLCBhbmQgUmF0aW8gY29sdW1ucw0KaWYgKG5yb3cocHJvamVjdGlvbnMpID4gMCkgew0KICBwcm9qZWN0aW9ucyREYXRlIDwtIGFzLmNoYXJhY3Rlcihwcm9qZWN0aW9ucyREYXRlKQ0KICBwcm9qZWN0aW9ucyRgU1BYYCA8LSBhcy5jaGFyYWN0ZXIocHJvamVjdGlvbnMkYFNQWGApDQogIHByb2plY3Rpb25zJFFRUSA8LSBhcy5jaGFyYWN0ZXIocHJvamVjdGlvbnMkUVFRKQ0KfSBlbHNlIHsNCiAgc3RvcCgiTm8gZGF0YSB0byBzdW1tYXJpemUgb3Igcm93cyBkbyBub3QgbWF0Y2guIikNCn0NCg0KIyBWZXJpZnkgdGhlIHByb2plY3Rpb25zDQppbnRlcmFjdGl2ZV9wcmludChwcm9qZWN0aW9ucykNCmludGVyYWN0aXZlX3N0cihwcm9qZWN0aW9ucykNCmZvcm1hdF9lcXVhbF93aWR0aChwcm9qZWN0aW9ucykNCg0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiMjIENSRUFURSBQTE9UDQoNCiMgQ29udmVydCBjb2x1bW5zIHRvIG51bWVyaWMgZm9yIHBsb3R0aW5nIGlmIG5lZWRlZA0KcHJvamVjdGlvbnMgPC0gcHJvamVjdGlvbnMgJT4lDQogIG11dGF0ZSgNCiAgICBgRGF0ZWAgPSBhcy5udW1lcmljKGFzLmNoYXJhY3RlcihgRGF0ZWApKSwgICMgRW5zdXJlIERhdGUgaXMgbnVtZXJpYw0KICAgIGBTUFhgID0gYXMubnVtZXJpYyhnc3ViKCIlIiwgIiIsIGBTUFhgKSksDQogICAgYFFRUWAgPSBhcy5udW1lcmljKGdzdWIoIiUiLCAiIiwgYFFRUWApKQ0KICApDQoNCiMgQ29udmVydCB0byBsb25nIGZvcm1hdCBmb3IgZ2dwbG90Mg0KcHJvamVjdGlvbnNfbG9uZyA8LSBwcm9qZWN0aW9ucyAlPiUNCiAgcGl2b3RfbG9uZ2VyKGNvbHMgPSBjKGBTUFhgLCBRUVEpLCBuYW1lc190byA9ICJJbmRleCIsIHZhbHVlc190byA9ICJDQUdSIikNCg0KIyBBc3NpZ24gY29sb3JzIGR5bmFtaWNhbGx5IGJhc2VkIG9uIHRoZSBvcmRlciBvZiBJbmRleA0KdW5pcXVlX3R5cGVzIDwtIHVuaXF1ZShwcm9qZWN0aW9uc19sb25nJEluZGV4KQ0KY3VzdG9tX2NvbG9ycyA8LSBzZXROYW1lcyhjb2xvcnNfZ2VuZXJhbF9kYXJrWzE6bGVuZ3RoKHVuaXF1ZV90eXBlcyldLCB1bmlxdWVfdHlwZXMpDQoNCiMgQ3JlYXRlIGR5bmFtaWMgdGl0bGUgYW5kIGNhcHRpb24NCmR5bmFtaWNfdGl0bGUgPC0gcGFzdGUwKCJQcm9qZWN0ZWQgR3Jvd3RoIFJhdGUgT3ZlciAiLCBudW1iZXJfeWVhcnMsICIgWWVhcnMgKCIsIHN0YXJ0X3llYXIsICItIiwgZW5kX3llYXIsICIpIikNCmR5bmFtaWNfY2FwdGlvbiA8LSBwYXN0ZTAoIlByb2plY3RlZCBHcm93dGggUmF0ZSAoQXZlcmFnZSBHcm93dGggKyBTbG9wZSksIERhdGFzZXQgKCIsIG1pbl95ZWFyLCAiLSIsIG1heF95ZWFyLCAiKSIpDQoNCiMgQ3JlYXRlIHRoZSBwcm9qZWN0aW9uIHBsb3QNCmdncGxvdChwcm9qZWN0aW9uc19sb25nLCBhZXMoeCA9IERhdGUsIHkgPSBDQUdSLCBjb2xvciA9IEluZGV4KSkgKw0KDQoNCiAgIyBBZGQgc2hhZGVkIGFyZWFzIGZvciBiYWNrZ3JvdW5kIGVmZmVjdA0KICBnZW9tX3JlY3QoYWVzKHhtaW4gPSAtSW5mLCB4bWF4ID0gSW5mLCB5bWluID0gdGFyZ2V0X2FnZ3Jlc3NpdmUsIHltYXggPSBJbmYpLCBmaWxsID0gImxpZ2h0Z3JlZW4iLCBhbHBoYSA9IDAuMDMwKSArDQogIGdlb21fcmVjdChhZXMoeG1pbiA9IC1JbmYsIHhtYXggPSBJbmYsIHltaW4gPSB0YXJnZXRfY29uc2VydmF0aXZlLCB5bWF4ID0gdGFyZ2V0X2FnZ3Jlc3NpdmUpLCBmaWxsID0gIm9yYW5nZSIsIGFscGhhID0gMC4wMzApICsNCiAgZ2VvbV9yZWN0KGFlcyh4bWluID0gLUluZiwgeG1heCA9IEluZiwgeW1pbiA9IC1JbmYsIHltYXggPSB0YXJnZXRfY29uc2VydmF0aXZlKSwgZmlsbCA9ICJsaWdodGNvcmFsIiwgYWxwaGEgPSAwLjAzMCkgKw0KICANCiAgIyBQbG90IGxpbmVzIGZvciBlYWNoIE1hcmtldCBJbmRleA0KICBnZW9tX2xpbmUoc2l6ZSA9IDEuMjUsIGFscGhhID0gMy4wKSArICAgICAgICMgTGluZSBmb3IgZWFjaCBDQUdSDQogIGdlb21fcG9pbnQoc2l6ZSA9IDIuMCwgYWxwaGEgPSAzLjApICsgICAgICAgIyBQb2ludHMgZm9yIGVhY2ggQ0FHUg0KICANCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gdGFyZ2V0X2FnZ3Jlc3NpdmUsIGNvbG9yID0gImRhcmtibHVlIiwgbGluZXR5cGUgPSAic29saWQiKSArDQogICMgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gdGFyZ2V0X21vZGVyYXRlLCBjb2xvciA9ICJkYXJrYmx1ZSIsIGxpbmV0eXBlID0gInNvbGlkIikgKw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSB0YXJnZXRfY29uc2VydmF0aXZlLCBjb2xvciA9ICJkYXJrYmx1ZSIsIGxpbmV0eXBlID0gInNvbGlkIikgKw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSB0YXJnZXRfaW5mbGF0aW9uLCBjb2xvciA9ICJkYXJrcmVkIiwgbGluZXR5cGUgPSAiZGFzaGVkIikgKw0KDQogICMgRHluYW1pYyByaWdodC1hbGlnbmVkIHBsYWNlbWVudCBmb3IgYW5ub3RhdGlvbnMNCiAgYW5ub3RhdGUoInRleHQiLCB4ID0gSW5mLCB5ID0gdGFyZ2V0X2FnZ3Jlc3NpdmUsIGxhYmVsID0gIkFnZ3Jlc3NpdmUiLCANCiAgICAgICAgICAgaGp1c3QgPSAxLCB2anVzdCA9IC0wLjUsIGNvbG9yID0gImRhcmtibHVlIiwgc2l6ZSA9IDQpICsNCiAgIyBhbm5vdGF0ZSgidGV4dCIsIHggPSBJbmYsIHkgPSB0YXJnZXRfbW9kZXJhdGUsIGxhYmVsID0gIk1vZGVyYXRlIiwgDQogICMgICAgICAgICBoanVzdCA9IDEsIHZqdXN0ID0gLTAuNSwgY29sb3IgPSAiZGFya2JsdWUiLCBzaXplID0gNCkgKw0KICBhbm5vdGF0ZSgidGV4dCIsIHggPSBJbmYsIHkgPSB0YXJnZXRfY29uc2VydmF0aXZlLCBsYWJlbCA9ICJDb25zZXJ2YXRpdmUiLCANCiAgICAgICAgICAgaGp1c3QgPSAxLCB2anVzdCA9IC0wLjUsIGNvbG9yID0gImRhcmtibHVlIiwgc2l6ZSA9IDQpICsNCiAgYW5ub3RhdGUoInRleHQiLCB4ID0gSW5mLCB5ID0gdGFyZ2V0X2luZmxhdGlvbiwgbGFiZWwgPSAiSW5mbGF0aW9uIiwgDQogICAgICAgICAgIGhqdXN0ID0gMSwgdmp1c3QgPSAtMC41LCBjb2xvciA9ICJkYXJrcmVkIiwgc2l6ZSA9IDQpICsNCg0KICBsYWJzKA0KICAgIHRpdGxlID0gZHluYW1pY190aXRsZSwNCiAgICB4ID0gIlllYXIiLA0KICAgIHkgPSAiR3Jvd3RoIFJhdGUgKCUpIiwNCiAgICBjb2xvciA9ICJJbmRleCIsDQogICAgY2FwdGlvbiA9IGR5bmFtaWNfY2FwdGlvbg0KICAgICkgKw0KICANCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGN1c3RvbV9jb2xvcnMpICsgICMgU2V0IGNvbG9ycyBmb3IgZWFjaCBNYXJrZXQgSW5kZXgNCiAgc2NhbGVfeF9jb250aW51b3VzKA0KICAgIGxpbWl0cyA9IGMoc3RhcnRfeWVhciwgZW5kX3llYXIpLCANCiAgICBicmVha3MgPSBzZXEobGltaXRzX3N0YXJ0X3llYXIsIGxpbWl0c19lbmRfeWVhciwgMikgICMgUmVzdHJpY3QgJiBTZXQgTWFqb3IgeC1heGlzIGxpbmVzIGZvciBlYWNoIHllYXINCiAgKSArIA0KICANCiAgdGhlbWVfbWluaW1hbCgpICsNCiAgdGhlbWUoDQogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSwgc2l6ZSA9IDIwKSwgICAgICAgICAjIExhcmdlciB0aXRsZSBmb250DQogICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCksICAgICAgICAgICAgICAgICAgICAjIExhcmdlciB4LWF4aXMgbGFiZWwgZm9udA0KICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQpLCAgICAgICAgICAgICAgICAgICAgIyBMYXJnZXIgeS1heGlzIGxhYmVsIGZvbnQNCiAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEsIHNpemUgPSAxNCksICAjIExhcmdlciB4LWF4aXMgdGV4dA0KICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCksICAgICAgICAgICAgICAgICAgICAgIyBMYXJnZXIgeS1heGlzIHRleHQNCiAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0KSwgICAgICAgICAgICAgICAgICAgICMgTGVnZW5kIHRpdGxlIHNpemUNCiAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIpLCAgICAgICAgICAgICAgICAgICAgICMgTGVnZW5kIHRleHQgc2l6ZQ0KICAgIHBhbmVsLmdyaWQubWFqb3IgPSBlbGVtZW50X2xpbmUobGluZXR5cGUgPSAiZG90dGVkIiwgY29sb3IgPSAiYmxhY2siKSwgICMgTWFqb3IgZ3JpZCBsaW5lcw0KICAgIHBhbmVsLmdyaWQubWlub3IueCA9IGVsZW1lbnRfYmxhbmsoKSwgICAgICAgICAgICAgICAgICAgICAgIyBObyBtaW5vciB4IGdyaWQgbGluZXMNCiAgICBheGlzLnRpY2tzLmxlbmd0aCA9IHVuaXQoLTAuMjUsICJjbSIpLCAgICAgICAgICAgICAgICAgICAgICAjIEluY3JlYXNlIHRpY2sgbGVuZ3RoDQogICAgYXhpcy50aWNrcyA9IGVsZW1lbnRfbGluZShjb2xvciA9ICJibGFjayIsIHNpemUgPSAwLjUwKSwgICAjIERhcmtlciB0aWNrcw0KICAgIGF4aXMubGluZS54ID0gZWxlbWVudF9saW5lKGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDAuNzUpLCAgIyBEYXJrIGJvdHRvbSBib3JkZXINCiAgICBheGlzLmxpbmUueSA9IGVsZW1lbnRfbGluZShjb2xvciA9ICJibGFjayIsIHNpemUgPSAwLjc1KSAgICMgRGFyayBsZWZ0IGJvcmRlcg0KICApDQoNCiMjIFNhdmUgRGF0YWZyYW1lIHVzaW5nIGZ1bmN0aW9uIA0KIyBEZWZpbmUgcGFyYW1ldGVycw0KaW5kZXhfMSA8LSAic3B4Ig0KaW5kZXhfMiA8LSAicXFxIg0Kc3RhcnRfeWVhciA8LSBzdGFydF95ZWFyDQplbmRfeWVhciA8LSBlbmRfeWVhcg0KDQojIFVzZSB0aGUgZnVuY3Rpb24gdG8gc2F2ZSB0aGUgZGF0YWZyYW1lDQpzYXZlX2RhdGFmcmFtZV9pbmRleF8xX2luZGV4XzJfc3RhcnRfeWVhcl9lbmRfeWVhcihwcm9qZWN0aW9ucywgaW5kZXhfMSwgaW5kZXhfMiwgc3RhcnRfeWVhciwgZW5kX3llYXIpDQpzYXZlX2RhdGFmcmFtZV9pbmRleF8xX2luZGV4XzIocHJvamVjdGlvbnMsIGluZGV4XzEsIGluZGV4XzIpDQoNCiMgQWNjZXNzIHRoZSBzYXZlZCB2YXJpYWJsZSBkaXJlY3RseQ0KaW50ZXJhY3RpdmVfY2F0KCJEYXRhZnJhbWUgc2F2ZWQgYXMgdmFyaWFibGU6IiwgcGFzdGUwKCJwcm9qZWN0aW9uc18iLCBpbmRleF8xLCAiXyIsIGluZGV4XzIsICJfcyIsIHN0YXJ0X3llYXIsICJfZSIsIGVuZF95ZWFyKSwgIlxuIikNCiMgQWNjZXNzIHRoZSBzYXZlZCB2YXJpYWJsZSBkaXJlY3RseQ0KaW50ZXJhY3RpdmVfY2F0KCJEYXRhZnJhbWUgc2F2ZWQgYXMgdmFyaWFibGU6IiwgcGFzdGUwKCJwcm9qZWN0aW9uc18iLCBpbmRleF8xLCAiXyIsIGluZGV4XzIpKQ0KDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KIyMgU0FWRSBWQUxVRVMgRk9SIElOLUxJTkUgQ09ERSBJTkNMVURJTkcgUkFUSU9TDQoNCiMgRGVmaW5lIGEgZnVuY3Rpb24gdG8gc2F2ZSBwcm9qZWN0ZWQgZ3Jvd3RoIHJhdGUgdmFsdWVzIGR5bmFtaWNhbGx5DQpzYXZlX3Byb2plY3RlZF92YWx1ZXMgPC0gZnVuY3Rpb24ocHJvamVjdGlvbnMsIGNvbHVtbl9tYXBwaW5nKSB7DQogIGZvciAocm93IGluIHNlcV9sZW4obnJvdyhwcm9qZWN0aW9ucykpKSB7DQogICAgZm9yIChjb2wgaW4gbmFtZXMoY29sdW1uX21hcHBpbmcpKSB7DQogICAgICAjIENvbnN0cnVjdCB0aGUgdmFyaWFibGUgbmFtZSBiYXNlZCBvbiB0aGUgY29sdW1uIGFuZCB5ZWFyDQogICAgICB2YXJpYWJsZV9uYW1lIDwtIHBhc3RlMCgicHJvamVjdGVkX2dyXyIsIGNvbHVtbl9tYXBwaW5nW1tjb2xdXSwgIl8iLCBwcm9qZWN0aW9ucyREYXRlW3Jvd10pDQogICAgICANCiAgICAgICMgRXh0cmFjdCB0aGUgdmFsdWUgZm9yIHRoZSBjdXJyZW50IHJvdyBhbmQgY29sdW1uDQogICAgICB2YWx1ZSA8LSBwcm9qZWN0aW9uc1tbY29sXV1bcm93XQ0KICAgICAgDQogICAgICAjIFNhdmUgdGhlIHZhbHVlIGR5bmFtaWNhbGx5DQogICAgICBhc3NpZ24odmFyaWFibGVfbmFtZSwgdmFsdWUsIGVudmlyID0gLkdsb2JhbEVudikNCiAgICB9DQogIH0NCn0NCg0KIyBDdXN0b20gbWFwcGluZyBmb3IgY29sdW1ucw0KY29sdW1uX25hbWVfbWFwcGluZyA8LSBjKA0KICBgU1BYYCA9ICJzcHgiLA0KICBRUVEgPSAicXFxIg0KKQ0KDQojIENhbGwgdGhlIGZ1bmN0aW9uIHRvIHNhdmUgdmFsdWVzIGR5bmFtaWNhbGx5DQpzYXZlX3Byb2plY3RlZF92YWx1ZXMocHJvamVjdGlvbnMsIGNvbHVtbl9uYW1lX21hcHBpbmcpDQoNCiMgRXhhbXBsZTogQWNjZXNzIGR5bmFtaWNhbGx5IHNhdmVkIHZhcmlhYmxlcw0KaW50ZXJhY3RpdmVfcHJpbnQocHJvamVjdGVkX2dyX3NweF8yMDM0KSAgIyBTaG91bGQgcHJpbnQgdGhlIHByb2plY3RlZCBncm93dGggcmF0ZSBmb3IgU1BYIGluIDIwMzQNCmludGVyYWN0aXZlX3ByaW50KHByb2plY3RlZF9ncl9xcXFfMjAzNCkgICAgIyBTaG91bGQgcHJpbnQgdGhlIHByb2plY3RlZCBncm93dGggcmF0ZSBmb3IgUVFRIGluIDIwMzQNCmludGVyYWN0aXZlX3ByaW50KHByb2plY3RlZF9ncl9zcHhfMjAyNCkgICMgU2hvdWxkIHByaW50IHRoZSBwcm9qZWN0ZWQgZ3Jvd3RoIHJhdGUgZm9yIFNQWCBpbiAyMDI0DQppbnRlcmFjdGl2ZV9wcmludChwcm9qZWN0ZWRfZ3JfcXFxXzIwMjQpICAgICMgU2hvdWxkIHByaW50IHRoZSBwcm9qZWN0ZWQgZ3Jvd3RoIHJhdGUgZm9yIFFRUSBpbiAyMDI0DQoNCg0KDQoNCiAgICANCmBgYA0KDQpUaGUgYHIgbWF4X3llYXIgLSBtaW5feWVhcmAtWWVhciBwcm9qZWN0aW9uIHJlZmxlY3RzIGJlaGF2aW9yIG9mIHRoZSBjYWxjdWxhdGVkIEF2ZXJhZ2VzIGFuZCBMaW5lYXIgUmVncmVzc2lvbiBTbG9wZSBmcm9tIGByIHN0YXJ0X3llYXJgIHRocnUgYHIgZW5kX3llYXJgLiBTUFgncyAxLXllYXIgYW5udWFsIGF2ZXJhZ2UgZ3Jvd3RoIHJhdGUgKGByICByb2xsaW5nX2F2Z18xX3llYXJfY2Fncl9zcHhgJSkgYW5kIHNsb3BlIChgciByb2xsaW5nX3Nsb3BlXzFfeWVhcl9jYWdyX3NweGApIHByb3ZpZGVzIHVzIHdpdGggYSBwcm9qZWN0ZWQgYSBncm93dGggcmF0ZSBvZiBgciBwcm9qZWN0ZWRfZ3Jfc3B4XzIwMzRgIGJ5IDIwMzQuIFFRUSdzIDEteWVhciBhbm51YWwgYXZlcmFnZSBncm93dGggcmF0ZSAoYHIgIHJvbGxpbmdfYXZnXzFfeWVhcl9jYWdyX3FxcWAlKSBhbmQgc2xvcGUgKGByIHJvbGxpbmdfc2xvcGVfMV95ZWFyX2NhZ3JfcXFxYCkgcHJvdmlkZXMgdXMgd2l0aCBhIHByb2plY3RlZCBhdmVyYWdlIGdyb3d0aCByYXRlIG9mIGByIHByb2plY3RlZF9ncl9xcXFfMjAzNGAgYnkgMjAzNCwgYW5kIA0KDQpUaGUgZ3JhcGggYmVsb3cgc2hvd3MgdGhlIFVuZm9ydHVuYXRlbHkgdGhpcyBwcm9qZWN0aW9uIGlzIGh5cG90aGV0aWNhbCBiYXNlZCBvbiB0aGUgcGVyZm9ybWFuY2Ugb3ZlciB0aW1lIHBlcmlvZC4gcmFuZ2UuIEFzIGJvdGggU1BYIEdSIEdyYXBoIGFuZCBRUVEgR1IgR3JhcGggc2hvd3MsIHRoZXJlIGlzIHF1aXRlIHRoZSB2b2xhdGlsaXR5IGFuZCBmbHVjdHVhdGlvbiB0aGF0IHRoaXMgZ3JhcGggY2xlYXJseSBkb2VzIG5vdCBwcmVzZW50LiANCg0KU2hpZnRpbmcgb3Igc2hvcnRlbmluZyB0aGUgZGF0ZSByYW5nZSB3b3VsZCBzaWduaWZpY2FudGx5IGltcGFjdCB0aGUgQ0FHUiBhbmQgdGhlIHNsb3BlLiBGb2N1c2luZyBvbiBhIHJhbmdlIGRvbWluYXRlZCBieSBTUFgncyBzdHJvbmcgcGVyZm9ybWFuY2UgKGUuZy4sIGVhcmx5IDIwMDBzKSB3b3VsZCBsaWtlbHkgZmxhdHRlbiBRUVEncyBzbG9wZSBhbmQgYm9vc3QgU1BYJ3MgcmVsYXRpdmUgZ3Jvd3RoLiBDb252ZXJzZWx5LCBlbXBoYXNpemluZyBtb3JlIHJlY2VudCB5ZWFycyB3b3VsZCBhbXBsaWZ5IFFRUSdzIENBR1IgZG9taW5hbmNlIGFuZCBpbmNyZWFzZSBpdHMgc2xvcGUsIGdpdmVuIGl0cyBzdHJvbmdlciBwZXJmb3JtYW5jZSBpbiB0aGUgbGFzdCB0d28gZGVjYWRlcy4gVGhlIGNob2ljZSBvZiB0aGUgZGF0ZSByYW5nZSB0aHVzIGNyaXRpY2FsbHkgc2hhcGVzIHRoZSBwZXJjZWl2ZWQgZ3Jvd3RoIHRyYWplY3RvcmllcyBhbmQgcmVsYXRpdmUgc3RyZW5ndGhzIG9mIHRoZSBpbmRpY2VzIGluIHByb2plY3Rpb24gbW9kZWxzLg0KDQojIyMjIEhQIHYxDQoNCmBgYHtyIGNhZ3JfMXllYXJfaGlzdG9yaWNhbF9wcm9qZWN0aW9uLCBmaWcud2lkdGg9MTAsIGZpZy5oZWlnaHQ9NywgZXZhbD1UUlVFLCBlY2hvPUZBTFNFfQ0KDQojIEVuc3VyZSB0aGUgbGlicmFyaWVzIGFyZSBsb2FkZWQNCmxpYnJhcnkoZ2dwbG90MikNCmxpYnJhcnkoZHBseXIpDQpsaWJyYXJ5KHRpZHlyKQ0KDQppbnRlcmFjdGl2ZV9zdHIobWVyZ2VkX2RhdGFfc3B4X3FxcSkNCmludGVyYWN0aXZlX3N0cihwcm9qZWN0aW9uc19zcHhfcXFxKQ0KDQojIENsZWFuIGFuZCBwcmVwYXJlIEhpc3RvcmljYWwgRGF0YXNldA0KaGlzdG9yaWNhbF9kYXRhIDwtIG1lcmdlZF9kYXRhX3NweF9xcXEgJT4lDQogIG11dGF0ZSgNCiAgICBEYXRlID0gYXMubnVtZXJpYyhEYXRlKSwNCiAgICBgU1BYYCA9IGNsZWFuX251bWVyaWMoYFNQWGApLA0KICAgIFFRUSA9IGNsZWFuX251bWVyaWMoUVFRKQ0KICApICU+JQ0KICBzZWxlY3QoRGF0ZSwgYFNQWGAsIFFRUSkNCg0KIyBDbGVhbiBhbmQgcHJlcGFyZSBQcm9qZWN0ZWQgRGF0YXNldA0KcHJvamVjdGVkX2RhdGEgPC0gcHJvamVjdGlvbnNfc3B4X3FxcSAlPiUNCiAgbXV0YXRlKA0KICAgIERhdGUgPSBhcy5udW1lcmljKERhdGUpLCAgIyBDb252ZXJ0IERhdGUgdG8gbnVtZXJpYyBpZiBuZWVkZWQNCiAgICBgU1BYYCA9IGFzLm51bWVyaWMoYFNQWGApLCAgIyBBc3N1bWluZyB0aGlzIGlzIGFscmVhZHkgbnVtZXJpYw0KICAgIFFRUSA9IGFzLm51bWVyaWMoUVFRKSAgIyBBc3N1bWluZyB0aGlzIGlzIGFscmVhZHkgbnVtZXJpYw0KICApICU+JQ0KICBzZWxlY3QoRGF0ZSwgYFNQWGAsIFFRUSkNCg0KIyBWaWV3IHRoZSBjbGVhbmVkIGRhdGFzZXRzDQppbnRlcmFjdGl2ZV9wcmludChoaXN0b3JpY2FsX2RhdGEpDQppbnRlcmFjdGl2ZV9wcmludChwcm9qZWN0ZWRfZGF0YSkNCg0KIyBQcmVwYXJlIEhpc3RvcmljYWwgRGF0YSBmb3IgUGxvdHRpbmcNCmhpc3RvcmljYWxfbG9uZyA8LSBoaXN0b3JpY2FsX2RhdGEgJT4lDQogIHBpdm90X2xvbmdlcihjb2xzID0gYyhgU1BYYCwgUVFRKSwgbmFtZXNfdG8gPSAiSW5kZXgiLCB2YWx1ZXNfdG8gPSAiQ0FHUiIpICU+JQ0KICBtdXRhdGUoYERhdGUgVHlwZWAgPSAiSGlzdG9yaWNhbCIpICAjIEFkZCBEYXRlIFR5cGUgY29sdW1uDQoNCiMgUHJlcGFyZSBQcm9qZWN0ZWQgRGF0YSBmb3IgUGxvdHRpbmcNCnByb2plY3RlZF9sb25nIDwtIHByb2plY3RlZF9kYXRhICU+JQ0KICBwaXZvdF9sb25nZXIoY29scyA9IGMoYFNQWGAsIFFRUSksIG5hbWVzX3RvID0gIkluZGV4IiwgdmFsdWVzX3RvID0gIkNBR1IiKSAlPiUNCiAgbXV0YXRlKGBEYXRlIFR5cGVgID0gIlByb2plY3RlZCIpICAjIEFkZCBEYXRlIFR5cGUgY29sdW1uDQoNCiMgQ29tYmluZSBEYXRhIGZvciBDb25zaXN0ZW50IExlZ2VuZA0KY29tYmluZWRfbG9uZyA8LSBiaW5kX3Jvd3MoaGlzdG9yaWNhbF9sb25nLCBwcm9qZWN0ZWRfbG9uZykNCg0KIyBGaW5kIHRoZSBtaW5pbXVtIGFuZCBtYXhpbXVtIHllYXJzIGZvciBzZXR0aW5nIGF4aXMgbGltaXRzDQptaW5feWVhciA8LSBtaW4oY29tYmluZWRfbG9uZyREYXRlKQ0KbWF4X3llYXIgPC0gbWF4KGNvbWJpbmVkX2xvbmckRGF0ZSkNCmludGVyYWN0aXZlX3ByaW50KG1pbl95ZWFyKQ0KaW50ZXJhY3RpdmVfcHJpbnQobWF4X3llYXIpDQoNCiMgU2V0IGRhdGUgcmFuZ2UNCnN0YXJ0X3llYXIgPSBhcy5udW1lcmljKG1pbl95ZWFyKQ0KZW5kX3llYXIgPSBhcy5udW1lcmljKG1heF95ZWFyKQ0KbnVtYmVyX3llYXJzID0gZW5kX3llYXIgLSBzdGFydF95ZWFyICsgMQ0KDQojIERlZmluZSBicmVha3Mgcm91bmRlZCBhcHByb3ByaWF0ZWx5DQpsaW1pdHNfc3RhcnRfeWVhciA8LSBmbG9vcihzdGFydF95ZWFyIC8gNSkgKiA1ICAjIFJvdW5kIGRvd24gdG8gdGhlIG5lYXJlc3QgbXVsdGlwbGUgb2YgMg0KbGltaXRzX2VuZF95ZWFyIDwtIGNlaWxpbmcoZW5kX3llYXIgLyA1KSAqIDUgICAjIFJvdW5kIHVwIHRvIHRoZSBuZWFyZXN0IG11bHRpcGxlIG9mIDINCg0KIyBBc3NpZ24gY29sb3JzIGR5bmFtaWNhbGx5IGJhc2VkIG9uIHRoZSBvcmRlciBvZiBJbmRleA0KdW5pcXVlX3R5cGVzIDwtIHVuaXF1ZShwcm9qZWN0aW9uc19sb25nJEluZGV4KQ0KY3VzdG9tX2NvbG9ycyA8LSBzZXROYW1lcyhjb2xvcnNfZ2VuZXJhbF9kYXJrWzE6bGVuZ3RoKHVuaXF1ZV90eXBlcyldLCB1bmlxdWVfdHlwZXMpDQoNCiMgQ3JlYXRlIGR5bmFtaWMgdGl0bGUgYW5kIGNhcHRpb24NCmR5bmFtaWNfdGl0bGUgPC0gIkhpc3RvcmljYWwgdG8gUHJvamVjdGVkIEdyb3d0aCBSYXRlIg0KZHluYW1pY19jYXB0aW9uIDwtIHBhc3RlMCgiSGlzdG9yaWNhbCBHcm93dGggUmF0ZSAoIiwgbWluKGhpc3RvcmljYWxfZGF0YSREYXRlKSwgIi0iLCBtYXgoaGlzdG9yaWNhbF9kYXRhJERhdGUpLCAiKSAvLyBQcm9qZWN0ZWQgQXZlcmFnZSBHcm93dGggUmF0ZSAoIiwgbWluKHByb2plY3RlZF9kYXRhJERhdGUpLCAiLSIsIG1heChwcm9qZWN0ZWRfZGF0YSREYXRlKSwgIikiKQ0KDQojIFVwZGF0ZSB0aGUgRGF0YV9UeXBlIGNvbHVtbiB0byAiRGF0ZSBUeXBlIg0KY29tYmluZWRfbG9uZyA8LSBjb21iaW5lZF9sb25nICU+JQ0KICBtdXRhdGUoDQogICAgYERhdGUgVHlwZWAgPSBpZmVsc2UoRGF0ZSA8PSBlbmRfeWVhciwgIkhpc3RvcmljYWwiLCAiUHJvamVjdGVkIikgICMgQWRkIERhdGUgVHlwZSBjb2x1bW4NCiAgKQ0KDQojIENyZWF0ZSBDb21wYXJpc29uIEdyYXBoDQpnZ3Bsb3QoKSArDQogIA0KICAjIEFkZCBIaXN0b3JpY2FsIERhdGENCiAgZ2VvbV9saW5lKGRhdGEgPSBoaXN0b3JpY2FsX2xvbmcsIGFlcyh4ID0gRGF0ZSwgeSA9IENBR1IsIGNvbG9yID0gSW5kZXgsIGxpbmV0eXBlID0gYERhdGUgVHlwZWApLCBzaXplID0gMS4yNSkgKw0KICBnZW9tX3BvaW50KGRhdGEgPSBoaXN0b3JpY2FsX2xvbmcsIGFlcyh4ID0gRGF0ZSwgeSA9IENBR1IsIGNvbG9yID0gSW5kZXgpLCBzaXplID0gMi4wKSArDQogIA0KICAjIEFkZCBQcm9qZWN0ZWQgRGF0YQ0KICBnZW9tX2xpbmUoZGF0YSA9IHByb2plY3RlZF9sb25nLCBhZXMoeCA9IERhdGUsIHkgPSBDQUdSLCBjb2xvciA9IEluZGV4LCBsaW5ldHlwZSA9IGBEYXRlIFR5cGVgKSwgc2l6ZSA9IDEuMjUpICsNCiAgZ2VvbV9wb2ludChkYXRhID0gcHJvamVjdGVkX2xvbmcsIGFlcyh4ID0gRGF0ZSwgeSA9IENBR1IsIGNvbG9yID0gSW5kZXgpLCBzaXplID0gMi4wKSArDQogICMgQWRkIHNoYWRlZCBhcmVhcyBmb3IgYmFja2dyb3VuZCBlZmZlY3QNCiAgZ2VvbV9yZWN0KGFlcyh4bWluID0gLUluZiwgeG1heCA9IEluZiwgeW1pbiA9IHRhcmdldF9hZ2dyZXNzaXZlLCB5bWF4ID0gSW5mKSwgZmlsbCA9ICJsaWdodGdyZWVuIiwgYWxwaGEgPSAwLjMwKSArDQogIGdlb21fcmVjdChhZXMoeG1pbiA9IC1JbmYsIHhtYXggPSBJbmYsIHltaW4gPSB0YXJnZXRfY29uc2VydmF0aXZlLCB5bWF4ID0gdGFyZ2V0X2FnZ3Jlc3NpdmUpLCBmaWxsID0gIm9yYW5nZSIsIGFscGhhID0gMC4zMCkgKw0KICBnZW9tX3JlY3QoYWVzKHhtaW4gPSAtSW5mLCB4bWF4ID0gSW5mLCB5bWluID0gLUluZiwgeW1heCA9IHRhcmdldF9jb25zZXJ2YXRpdmUpLCBmaWxsID0gImxpZ2h0Y29yYWwiLCBhbHBoYSA9IDAuMzApICsNCiAgDQogICMgUGxvdCBsaW5lcyBmb3IgZWFjaCBNYXJrZXQgSW5kZXgNCiAgZ2VvbV9saW5lKHNpemUgPSAxLjAwLCBhbHBoYSA9IDMuMCkgKw0KICBnZW9tX3BvaW50KHNpemUgPSAxLjUwLCBhbHBoYSA9IDMuMCkgKw0KICANCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gdGFyZ2V0X2FnZ3Jlc3NpdmUsIGNvbG9yID0gImRhcmtibHVlIiwgbGluZXR5cGUgPSAic29saWQiKSArDQogICMgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gdGFyZ2V0X21vZGVyYXRlLCBjb2xvciA9ICJkYXJrYmx1ZSIsIGxpbmV0eXBlID0gInNvbGlkIikgKw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSB0YXJnZXRfY29uc2VydmF0aXZlLCBjb2xvciA9ICJkYXJrYmx1ZSIsIGxpbmV0eXBlID0gInNvbGlkIikgKw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSB0YXJnZXRfaW5mbGF0aW9uLCBjb2xvciA9ICJkYXJrcmVkIiwgbGluZXR5cGUgPSAiZGFzaGVkIikgKw0KDQogICMgRHluYW1pYyByaWdodC1hbGlnbmVkIHBsYWNlbWVudCBmb3IgYW5ub3RhdGlvbnMNCiAgYW5ub3RhdGUoInRleHQiLCB4ID0gSW5mLCB5ID0gdGFyZ2V0X2FnZ3Jlc3NpdmUsIGxhYmVsID0gIkFnZ3Jlc3NpdmUiLCANCiAgICAgICAgICAgaGp1c3QgPSAxLCB2anVzdCA9IC0wLjUsIGNvbG9yID0gImRhcmtibHVlIiwgc2l6ZSA9IDQpICsNCiAgIyBhbm5vdGF0ZSgidGV4dCIsIHggPSBJbmYsIHkgPSB0YXJnZXRfbW9kZXJhdGUsIGxhYmVsID0gIk1vZGVyYXRlIiwgDQogICMgICAgICAgICBoanVzdCA9IDEsIHZqdXN0ID0gLTAuNSwgY29sb3IgPSAiZGFya2JsdWUiLCBzaXplID0gNCkgKw0KICBhbm5vdGF0ZSgidGV4dCIsIHggPSBJbmYsIHkgPSB0YXJnZXRfY29uc2VydmF0aXZlLCBsYWJlbCA9ICJDb25zZXJ2YXRpdmUiLCANCiAgICAgICAgICAgaGp1c3QgPSAxLCB2anVzdCA9IC0wLjUsIGNvbG9yID0gImRhcmtibHVlIiwgc2l6ZSA9IDQpICsNCiAgYW5ub3RhdGUoInRleHQiLCB4ID0gSW5mLCB5ID0gdGFyZ2V0X2luZmxhdGlvbiwgbGFiZWwgPSAiSW5mbGF0aW9uIiwgDQogICAgICAgICAgIGhqdXN0ID0gMSwgdmp1c3QgPSArMS4xMCwgY29sb3IgPSAiZGFya3JlZCIsIHNpemUgPSA0KSArDQogIA0KICAgIyBBZGQgdGl0bGVzIGFuZCBsYWJlbHMNCiAgbGFicygNCiAgICB0aXRsZSA9IGR5bmFtaWNfdGl0bGUsDQogICAgeCA9ICJZZWFyIiwNCiAgICB5ID0gIkdyb3d0aCBSYXRlICglKSIsDQogICAgY29sb3IgPSAiSW5kZXgiLA0KICAgIGxpbmV0eXBlID0gIkRhdGUgVHlwZSIsDQogICAgY2FwdGlvbiA9IGR5bmFtaWNfY2FwdGlvbg0KICAgICkgKw0KDQogIHNjYWxlX2xpbmV0eXBlX21hbnVhbCh2YWx1ZXMgPSBjKCJIaXN0b3JpY2FsIiA9ICJzb2xpZCIsICJQcm9qZWN0ZWQiID0gImRhc2hlZCIpKSArICAjIFNldCBsaW5ldHlwZXMNCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGN1c3RvbV9jb2xvcnMpICsgICMgU2V0IGNvbG9ycyBmb3IgZWFjaCBNYXJrZXQgSW5kZXgNCg0KICBzY2FsZV94X2NvbnRpbnVvdXMoDQogICAgbGltaXRzID0gYyhzdGFydF95ZWFyLCBlbmRfeWVhciksIA0KICAgIGJyZWFrcyA9IHNlcShsaW1pdHNfc3RhcnRfeWVhciwgbGltaXRzX2VuZF95ZWFyLCA1KSAgIyBSZXN0cmljdCAmIFNldCBNYWpvciB4LWF4aXMgbGluZXMgZm9yIGVhY2ggeWVhcg0KICApICsgDQogIA0KICAjIEN1c3RvbWl6ZSB0aGVtZQ0KICB0aGVtZV9taW5pbWFsKCkgKw0KICB0aGVtZSgNCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41LCBzaXplID0gMjApLCAgIyBMYXJnZXIgdGl0bGUgZm9udA0KICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQpLCAgIyBMYXJnZXIgeC1heGlzIGxhYmVsIGZvbnQNCiAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0KSwgICMgTGFyZ2VyIHktYXhpcyBsYWJlbCBmb250DQogICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxLCBzaXplID0gMTQpLCAgIyBMYXJnZXIgeC1heGlzIHRleHQNCiAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQpLCAgIyBMYXJnZXIgeS1heGlzIHRleHQNCiAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0KSwgICMgTGVnZW5kIHRpdGxlIHNpemUNCiAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIpLCAgIyBMZWdlbmQgdGV4dCBzaXplDQogICAgcGFuZWwuZ3JpZC5tYWpvciA9IGVsZW1lbnRfbGluZShsaW5ldHlwZSA9ICJkb3R0ZWQiLCBjb2xvciA9ICJibGFjayIpLCAgIyBNYWpvciBncmlkIGxpbmVzDQogICAgcGFuZWwuZ3JpZC5taW5vci54ID0gZWxlbWVudF9ibGFuaygpLCAgIyBObyBtaW5vciB4IGdyaWQgbGluZXMNCiAgICBheGlzLnRpY2tzLmxlbmd0aCA9IHVuaXQoLTAuMjUsICJjbSIpLCAgIyBJbmNyZWFzZSB0aWNrIGxlbmd0aA0KICAgIGF4aXMudGlja3MgPSBlbGVtZW50X2xpbmUoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMC41MCksICAgIyBEYXJrZXIgdGlja3MNCiAgICBheGlzLmxpbmUueCA9IGVsZW1lbnRfbGluZShjb2xvciA9ICJibGFjayIsIHNpemUgPSAwLjc1KSwgICMgRGFyayBib3R0b20gYm9yZGVyDQogICAgYXhpcy5saW5lLnkgPSBlbGVtZW50X2xpbmUoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMC43NSkgICAjIERhcmsgbGVmdCBib3JkZXINCiAgKQ0KDQoNCmBgYA0KDQojIyMjIEhQIHYyDQpgYGB7ciBjYWdyXzF5ZWFyX2hpc3RvcmljYWxfcHJvamVjdGlvbl93aXRoX3NwbGl0LCBmaWcud2lkdGg9MTIsIGZpZy5oZWlnaHQ9NywgZXZhbD1UUlVFLCBlY2hvPUZBTFNFfQ0KDQoNCiMgRW5zdXJlIHRoZSBsaWJyYXJpZXMgYXJlIGxvYWRlZA0KbGlicmFyeShnZ3Bsb3QyKQ0KbGlicmFyeShkcGx5cikNCmxpYnJhcnkodGlkeXIpDQoNCiMgQ2xlYW4gYW5kIHByZXBhcmUgSGlzdG9yaWNhbCBEYXRhc2V0DQpoaXN0b3JpY2FsX2RhdGEgPC0gbWVyZ2VkX2RhdGFfc3B4X3FxcSAlPiUNCiAgbXV0YXRlKERhdGUgPSBhcy5udW1lcmljKERhdGUpLA0KICAgICAgICAgYFNQWGAgPSBjbGVhbl9udW1lcmljKGBTUFhgKSwNCiAgICAgICAgIFFRUSA9IGNsZWFuX251bWVyaWMoUVFRKSkgJT4lDQogIHNlbGVjdChEYXRlLCBgU1BYYCwgUVFRKQ0KDQojIENsZWFuIGFuZCBwcmVwYXJlIFByb2plY3RlZCBEYXRhc2V0DQpwcm9qZWN0ZWRfZGF0YSA8LSBwcm9qZWN0aW9uc19zcHhfcXFxICU+JQ0KICBtdXRhdGUoRGF0ZSA9IGFzLm51bWVyaWMoRGF0ZSksDQogICAgICAgICBgU1BYYCA9IGNsZWFuX251bWVyaWMoYFNQWGApLA0KICAgICAgICAgUVFRID0gY2xlYW5fbnVtZXJpYyhRUVEpKSAlPiUNCiAgc2VsZWN0KERhdGUsIGBTUFhgLCBRUVEpDQoNCiMgUHJlcGFyZSBIaXN0b3JpY2FsIERhdGEgZm9yIFBsb3R0aW5nDQpoaXN0b3JpY2FsX2xvbmcgPC0gaGlzdG9yaWNhbF9kYXRhICU+JQ0KICBwaXZvdF9sb25nZXIoY29scyA9IGMoYFNQWGAsIFFRUSksIG5hbWVzX3RvID0gIkluZGV4IiwgdmFsdWVzX3RvID0gIkNBR1IiKSAlPiUNCiAgbXV0YXRlKGBEYXRlIFR5cGVgID0gIkhpc3RvcmljYWwiLCBTZWN0aW9uID0gcGFzdGUwKCJIaXN0b3JpY2FsIEdSICgiLCBtaW4oaGlzdG9yaWNhbF9kYXRhJERhdGUpLCAiLSIsIG1heChoaXN0b3JpY2FsX2RhdGEkRGF0ZSksICIpIikpICAjIEFkZCBkeW5hbWljIFNlY3Rpb24gdGl0bGUNCg0KIyBQcmVwYXJlIFByb2plY3RlZCBEYXRhIGZvciBQbG90dGluZw0KcHJvamVjdGVkX2xvbmcgPC0gcHJvamVjdGVkX2RhdGEgJT4lDQogIHBpdm90X2xvbmdlcihjb2xzID0gYyhgU1BYYCwgUVFRKSwgbmFtZXNfdG8gPSAiSW5kZXgiLCB2YWx1ZXNfdG8gPSAiQ0FHUiIpICU+JQ0KICBtdXRhdGUoYERhdGUgVHlwZWAgPSAiUHJvamVjdGVkIiwgU2VjdGlvbiA9IHBhc3RlMCgiUHJvamVjdGVkIEdSICgiLCBtaW4ocHJvamVjdGVkX2RhdGEkRGF0ZSksICItIiwgbWF4KHByb2plY3RlZF9kYXRhJERhdGUpLCAiKSIpKSAgIyBBZGQgZHluYW1pYyBTZWN0aW9uIHRpdGxlDQoNCiMgQ29tYmluZSBIaXN0b3JpY2FsIGFuZCBQcm9qZWN0ZWQgRGF0YQ0KY29tYmluZWRfbG9uZyA8LSBiaW5kX3Jvd3MoaGlzdG9yaWNhbF9sb25nLCBwcm9qZWN0ZWRfbG9uZykNCg0KIyBGaW5kIHRoZSBtaW5pbXVtIGFuZCBtYXhpbXVtIHllYXJzIGZvciBzZXR0aW5nIGF4aXMgbGltaXRzDQptaW5feWVhciA8LSBtaW4oY29tYmluZWRfbG9uZyREYXRlKQ0KbWF4X3llYXIgPC0gbWF4KGNvbWJpbmVkX2xvbmckRGF0ZSkNCmludGVyYWN0aXZlX3ByaW50KG1pbl95ZWFyKQ0KaW50ZXJhY3RpdmVfcHJpbnQobWF4X3llYXIpDQoNCiMgU2V0IGRhdGUgcmFuZ2UNCnN0YXJ0X3llYXIgPSBhcy5udW1lcmljKG1pbl95ZWFyKQ0KZW5kX3llYXIgPSBhcy5udW1lcmljKG1heF95ZWFyKQ0KbnVtYmVyX3llYXJzID0gZW5kX3llYXIgLSBzdGFydF95ZWFyICsgMQ0KDQojIERlZmluZSBicmVha3Mgcm91bmRlZCBhcHByb3ByaWF0ZWx5DQpsaW1pdHNfc3RhcnRfeWVhciA8LSBmbG9vcihzdGFydF95ZWFyIC8gNSkgKiA1ICAjIFJvdW5kIGRvd24gdG8gdGhlIG5lYXJlc3QgbXVsdGlwbGUgb2YgMg0KbGltaXRzX2VuZF95ZWFyIDwtIGNlaWxpbmcoZW5kX3llYXIgLyA1KSAqIDUgICAjIFJvdW5kIHVwIHRvIHRoZSBuZWFyZXN0IG11bHRpcGxlIG9mIDINCg0KIyBBc3NpZ24gY29sb3JzIGR5bmFtaWNhbGx5IGJhc2VkIG9uIHRoZSBvcmRlciBvZiBJbmRleA0KdW5pcXVlX3R5cGVzIDwtIHVuaXF1ZShwcm9qZWN0aW9uc19sb25nJEluZGV4KQ0KY3VzdG9tX2NvbG9ycyA8LSBzZXROYW1lcyhjb2xvcnNfZ2VuZXJhbF9kYXJrWzE6bGVuZ3RoKHVuaXF1ZV90eXBlcyldLCB1bmlxdWVfdHlwZXMpDQoNCiMgQ3JlYXRlIGR5bmFtaWMgdGl0bGUgYW5kIGNhcHRpb24NCmR5bmFtaWNfdGl0bGUgPC0gIkhpc3RvcmljYWwgdG8gUHJvamVjdGVkIEdyb3d0aCBSYXRlIg0KZHluYW1pY19jYXB0aW9uIDwtIHBhc3RlMCgiSGlzdG9yaWNhbCBHcm93dGggUmF0ZSAoIiwgbWluKGhpc3RvcmljYWxfZGF0YSREYXRlKSwgIi0iLCBtYXgoaGlzdG9yaWNhbF9kYXRhJERhdGUpLCAiKSAvLyBQcm9qZWN0ZWQgQXZlcmFnZSBHcm93dGggUmF0ZSAoIiwgbWluKHByb2plY3RlZF9kYXRhJERhdGUpLCAiLSIsIG1heChwcm9qZWN0ZWRfZGF0YSREYXRlKSwgIikiKQ0KDQojIERhdGEgZm9yIHNoYWRlZCBhcmVhcyAocmVjdGFuZ2xlcykNCmJhY2tncm91bmRfZGF0YSA8LSBkYXRhLmZyYW1lKA0KICB4bWluID0gLUluZiwNCiAgeG1heCA9IEluZiwNCiAgeW1pbiA9IGMoLUluZiwgdGFyZ2V0X2NvbnNlcnZhdGl2ZSwgdGFyZ2V0X2FnZ3Jlc3NpdmUpLA0KICB5bWF4ID0gYyh0YXJnZXRfY29uc2VydmF0aXZlLCB0YXJnZXRfYWdncmVzc2l2ZSwgSW5mKSwNCiAgZmlsbCA9IGMoImxpZ2h0Y29yYWwiLCAib3JhbmdlIiwgImxpZ2h0Z3JlZW4iKQ0KKQ0KDQojIENyZWF0ZSB0aGUgZ3JhcGgNCmdncGxvdChjb21iaW5lZF9sb25nLCBhZXMoeCA9IERhdGUsIHkgPSBDQUdSLCBjb2xvciA9IEluZGV4LCBsaW5ldHlwZSA9IGBEYXRlIFR5cGVgKSkgKw0KICANCiAgIyBBZGQgc2hhZGVkIGJhY2tncm91bmQgYXJlYXMgdXNpbmcgYW5ub3RhdGUoKQ0KICBhbm5vdGF0ZSgicmVjdCIsIHhtaW4gPSAtSW5mLCB4bWF4ID0gSW5mLCB5bWluID0gLUluZiwgeW1heCA9IHRhcmdldF9jb25zZXJ2YXRpdmUsIGZpbGwgPSAibGlnaHRjb3JhbCIsIGFscGhhID0gMC4zMCkgKw0KICBhbm5vdGF0ZSgicmVjdCIsIHhtaW4gPSAtSW5mLCB4bWF4ID0gSW5mLCB5bWluID0gdGFyZ2V0X2NvbnNlcnZhdGl2ZSwgeW1heCA9IHRhcmdldF9hZ2dyZXNzaXZlLCBmaWxsID0gIm9yYW5nZSIsIGFscGhhID0gMC4zMCkgKw0KICBhbm5vdGF0ZSgicmVjdCIsIHhtaW4gPSAtSW5mLCB4bWF4ID0gSW5mLCB5bWluID0gdGFyZ2V0X2FnZ3Jlc3NpdmUsIHltYXggPSBJbmYsIGZpbGwgPSAibGlnaHRncmVlbiIsIGFscGhhID0gMC4zMCkgKw0KDQogICMgQWRkIGxpbmVzIGFuZCBwb2ludHMgZm9yIGVhY2ggaW5kZXgNCiAgZ2VvbV9saW5lKHNpemUgPSAxLjI1KSArDQogIGdlb21fcG9pbnQoc2l6ZSA9IDIuMCkgKw0KDQogICMgQWRkIHJlZmVyZW5jZSBsaW5lcw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSB0YXJnZXRfYWdncmVzc2l2ZSwgY29sb3IgPSAiZGFya2JsdWUiLCBsaW5ldHlwZSA9ICJzb2xpZCIpICsNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gdGFyZ2V0X2NvbnNlcnZhdGl2ZSwgY29sb3IgPSAiZGFya2JsdWUiLCBsaW5ldHlwZSA9ICJzb2xpZCIpICsNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gdGFyZ2V0X2luZmxhdGlvbiwgY29sb3IgPSAiZGFya3JlZCIsIGxpbmV0eXBlID0gImRhc2hlZCIpICsNCg0KICAjIFNwbGl0IGludG8gZmFjZXRzIGZvciBIaXN0b3JpY2FsIGFuZCBQcm9qZWN0ZWQNCiAgZmFjZXRfZ3JpZCh+U2VjdGlvbiwgc2NhbGVzID0gImZyZWVfeCIsIHNwYWNlID0gImZyZWUiKSArDQoNCiAgIyBBZGQgdGl0bGVzLCBsYWJlbHMsIGFuZCBjYXB0aW9ucw0KICBsYWJzKA0KICAgIHRpdGxlID0gZHluYW1pY190aXRsZSwNCiAgICB4ID0gIlllYXIiLA0KICAgIHkgPSAiR3Jvd3RoIFJhdGUgKCUpIiwNCiAgICBjb2xvciA9ICJJbmRleCIsDQogICAgbGluZXR5cGUgPSAiRGF0ZSBUeXBlIiwNCiAgICBjYXB0aW9uID0gZHluYW1pY19jYXB0aW9uDQogICkgKw0KDQogICMgQ3VzdG9taXplIGNvbG9ycyBhbmQgbGluZXR5cGVzDQogIHNjYWxlX2xpbmV0eXBlX21hbnVhbCh2YWx1ZXMgPSBjKCJIaXN0b3JpY2FsIiA9ICJzb2xpZCIsICJQcm9qZWN0ZWQiID0gImRhc2hlZCIpKSArICAjIFNldCBsaW5ldHlwZXMNCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGN1c3RvbV9jb2xvcnMpICsgICMgU2V0IGNvbG9ycyBmb3IgZWFjaCBNYXJrZXQgSW5kZXgNCg0KICAjIEN1c3RvbWl6ZSB0aGVtZQ0KICB0aGVtZV9taW5pbWFsKCkgKw0KICB0aGVtZSgNCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41LCBzaXplID0gMjApLCAgIyBDZW50ZXJlZCB0aXRsZQ0KICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQpLCAgICAgICAgICAgICMgWC1heGlzIHRpdGxlIGZvbnQNCiAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0KSwgICAgICAgICAgICAjIFktYXhpcyB0aXRsZSBmb250DQogICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyLCBhbmdsZSA9IDQ1LCBoanVzdCA9IDEpLCAgIyBYLWF4aXMgdGlja3MNCiAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIpLCAgICAgICAgICAgICAjIFktYXhpcyB0aWNrcw0KICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQpLCAgICAgICAgICAgICMgTGVnZW5kIHRpdGxlIGZvbnQNCiAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIpLCAgICAgICAgICAgICAjIExlZ2VuZCB0ZXh0IGZvbnQNCiAgICBzdHJpcC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNiwgZmFjZSA9ICJib2xkIiksICAjIEZhY2V0IHRpdGxlIGZvbnQNCiAgICBwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9saW5lKGxpbmV0eXBlID0gImRvdHRlZCIsIGNvbG9yID0gImJsYWNrIiksICAjIEdyaWQgbGluZXMNCiAgICBwYW5lbC5ncmlkLm1pbm9yID0gZWxlbWVudF9ibGFuaygpLCAgICAgICAgICAgICAgICAjIFJlbW92ZSBtaW5vciBncmlkIGxpbmVzDQogICAgcGFuZWwuc3BhY2luZyA9IHVuaXQoMSwgImxpbmVzIiksICAgICAgICAgICAgICAgICAgIyBTcGFjZSBiZXR3ZWVuIGZhY2V0cw0KICAgIGF4aXMudGlja3MubGVuZ3RoID0gdW5pdCgtMC4yNSwgImNtIiksICAgICAgICAgICAgICMgSW5jcmVhc2UgdGljayBsZW5ndGgNCiAgICBheGlzLnRpY2tzID0gZWxlbWVudF9saW5lKGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDAuNTApLCAgICMgRGFya2VyIHRpY2tzDQogICAgYXhpcy5saW5lLnggPSBlbGVtZW50X2xpbmUoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMC43NSksICAjIERhcmsgYm90dG9tIGJvcmRlcg0KICAgIGF4aXMubGluZS55ID0gZWxlbWVudF9saW5lKGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDAuNzUpICAgIyBEYXJrIGxlZnQgYm9yZGVyDQogICkNCg0KDQpgYGANCg0KQmFzZWQgb24gdGhlIGhpc3RvcmljYWwgZ3Jvd3RoIHJhdGUNCg0KDQojIyMgNS1ZZWFyIENBR1IgDQoNCiMjIyMgRGF0YQ0KDQpgYGB7ciBpbmRleF9jb21wYXJpc29uXzV5ZWFyX2NhZ3IsIGV2YWw9VFJVRSwgZWNobz1GQUxTRX0NCg0KaW50ZXJhY3RpdmVfc3RyKHNweF9yYXdfY2FncikNCmludGVyYWN0aXZlX3N0cihxcXFfcmF3X2NhZ3IpDQoNCmludGVyYWN0aXZlX3ByaW50KHNweF9yYXdfY2FncikNCmludGVyYWN0aXZlX3ByaW50KHFxcV9yYXdfY2FncikNCg0KbWluX3llYXIgPC0gbWluKHNweF9yYXdfY2FnciREYXRlKQ0KbWF4X3llYXIgPC0gbWF4KHNweF9yYXdfY2FnciREYXRlKQ0KaW50ZXJhY3RpdmVfcHJpbnQobWluX3llYXIpDQppbnRlcmFjdGl2ZV9wcmludChtYXhfeWVhcikNCg0KbWluX3llYXIgPC0gbWluKHFxcV9yYXdfY2FnciREYXRlKQ0KbWF4X3llYXIgPC0gbWF4KHFxcV9yYXdfY2FnciREYXRlKQ0KaW50ZXJhY3RpdmVfcHJpbnQobWluX3llYXIpDQppbnRlcmFjdGl2ZV9wcmludChtYXhfeWVhcikNCg0KIyBGaWx0ZXIgZGF0YSBmb3IgdGhlIHJlcXVpcmVkIGRhdGUgcmFuZ2UgKDIwMDUgdG8gdGhlIHByZXNlbnQgeWVhcikNCnN0YXJ0X3llYXIgPC0gMjAwNQ0KIyBlbmRfeWVhciA8LSAyMDI0DQplbmRfeWVhciA8LSBhcy5udW1lcmljKGZvcm1hdChTeXMuRGF0ZSgpLCAiJVkiKSkNCg0Kc3B4X2ZpbHRlcmVkIDwtIHN1YnNldChzcHhfcmF3X2NhZ3IsIERhdGUgPj0gc3RhcnRfeWVhciAmIERhdGUgPD0gZW5kX3llYXIsIHNlbGVjdCA9IGMoRGF0ZSwgYDUtWWVhciBDQUdSYCkpDQpxcXFfZmlsdGVyZWQgPC0gc3Vic2V0KHFxcV9yYXdfY2FnciwgRGF0ZSA+PSBzdGFydF95ZWFyICYgRGF0ZSA8PSBlbmRfeWVhciwgc2VsZWN0ID0gYyhEYXRlLCBgNS1ZZWFyIENBR1JgKSkNCg0KIyBSZW5hbWUgY29sdW1ucyBmb3IgY2xhcml0eQ0KY29sbmFtZXMoc3B4X2ZpbHRlcmVkKVtjb2xuYW1lcyhzcHhfZmlsdGVyZWQpID09ICI1LVllYXIgQ0FHUiJdIDwtICJTUFgiDQpjb2xuYW1lcyhxcXFfZmlsdGVyZWQpW2NvbG5hbWVzKHFxcV9maWx0ZXJlZCkgPT0gIjUtWWVhciBDQUdSIl0gPC0gIlFRUSINCg0KIyBNZXJnZSBkYXRhc2V0cyBieSBEYXRlIChZZWFyKQ0KbWVyZ2VkX2RhdGEgPC0gbWVyZ2Uoc3B4X2ZpbHRlcmVkLCBxcXFfZmlsdGVyZWQsIGJ5ID0gIkRhdGUiKQ0KDQojIFNvcnQgYnkgRGF0ZSBpbiBkZXNjZW5kaW5nIG9yZGVyIChtb3N0IHJlY2VudCB5ZWFyIGZpcnN0KQ0KbWVyZ2VkX2RhdGEgPC0gbWVyZ2VkX2RhdGFbb3JkZXIoLW1lcmdlZF9kYXRhJERhdGUpLCBdDQoNCiMgRm9ybWF0IHRoZSBtZXJnZWQgZGF0YQ0KbWVyZ2VkX2RhdGEkRGF0ZSA8LSBhcy5jaGFyYWN0ZXIobWVyZ2VkX2RhdGEkRGF0ZSkgICMgRW5zdXJlIERhdGUgaXMgYSBjaGFyYWN0ZXIgd2l0aG91dCBjb21tYXMNCm1lcmdlZF9kYXRhJGBTUFhgIDwtIHBhc3RlMChmb3JtYXRDKG1lcmdlZF9kYXRhJGBTUFhgLCBmb3JtYXQgPSAiZiIsIGRpZ2l0cyA9IDIpLCAiJSIpDQptZXJnZWRfZGF0YSRRUVEgPC0gcGFzdGUwKGZvcm1hdEMobWVyZ2VkX2RhdGEkUVFRLCBmb3JtYXQgPSAiZiIsIGRpZ2l0cyA9IDIpLCAiJSIpDQoNCiMgRGlzcGxheSBmb3JtYXR0ZWQgdGFibGUNCmNhdCgiXG5cbiMjIyMgNS1ZZWFyIFJvbGxpbmcgQ0FHUnMgQnkgSW5kZXggKCIsIHN0YXJ0X3llYXIsICItIiwgZW5kX3llYXIsICIpXG4iLCBzZXAgPSAiIikNCmludGVyYWN0aXZlX3ByaW50KG1lcmdlZF9kYXRhKQ0KaW50ZXJhY3RpdmVfc3RyKG1lcmdlZF9kYXRhKQ0KZm9ybWF0X2VxdWFsX3dpZHRoKG1lcmdlZF9kYXRhKQ0KDQoNCmBgYA0KDQojIyMjIFN1bW1hcnkNCg0KYGBge3IgaW5kZXhfY29tcGFyaXNvbl81eWVhcl9jYWdyX3N1bW1hcnksIGV2YWw9VFJVRSwgZWNobz1GQUxTRX0NCg0KIyBMb2FkIG5lY2Vzc2FyeSBsaWJyYXJ5DQpsaWJyYXJ5KGRwbHlyKQ0KDQojIFJlbW92ZSBwZXJjZW50YWdlIHNpZ25zIGFuZCBjb252ZXJ0IGNvbHVtbnMgdG8gbnVtZXJpYw0KbWVyZ2VkX2RhdGFfY2xlYW4gPC0gbWVyZ2VkX2RhdGENCm1lcmdlZF9kYXRhX2NsZWFuWzI6M10gPC0gbGFwcGx5KG1lcmdlZF9kYXRhWzI6M10sIGZ1bmN0aW9uKHgpIGFzLm51bWVyaWMoZ3N1YigiJSIsICIiLCB4KSkpDQoNCiMgRmluZCB0aGUgbWluaW11bSBhbmQgbWF4aW11bSB5ZWFyDQptaW5feWVhciA8LSBtaW4obWVyZ2VkX2RhdGEkRGF0ZSwgbmEucm0gPSBUUlVFKQ0KbWF4X3llYXIgPC0gbWF4KG1lcmdlZF9kYXRhJERhdGUsIG5hLnJtID0gVFJVRSkNCmludGVyYWN0aXZlX3ByaW50KG1pbl95ZWFyKQ0KaW50ZXJhY3RpdmVfcHJpbnQobWF4X3llYXIpDQoNCiMgRGVmaW5lIHRoZSBtZXRyaWNzIHRvIGNhbGN1bGF0ZSwgaW5jbHVkaW5nIENBR1INCm1ldHJpY3MgPC0gYygNCiAgIk1lYW4iLCANCiAgIk1lZGlhbiIsIA0KICAiU3RhbmRhcmQgRGV2aWF0aW9uIChWb2xhdGlsaXR5KSIsIA0KICAiTWluIENBR1IgUmFuZ2UgKENBR1IgLSBTRCkiLCANCiAgIk1heCBDQUdSIFJhbmdlIChDQUdSICsgU0QpIiwgDQogICJNaW4iLCANCiAgIk1heCIsIA0KICAiUGVyY2VudCBBYm92ZSBJbmZsYXRpb24gVGFyZ2V0IiwgDQogICJQZXJjZW50IEFib3ZlIENvbnNlcnZhdGl2ZSBUYXJnZXQiLCANCiAgIlBlcmNlbnQgQWJvdmUgTW9kZXJhdGUgVGFyZ2V0IiwgDQogICJQZXJjZW50IEFib3ZlIEFnZ3Jlc3NpdmUgVGFyZ2V0Ig0KKQ0KDQojIENhbGN1bGF0ZSBtZXRyaWNzIGR5bmFtaWNhbGx5IGZvciBhbGwgbnVtZXJpYyBjb2x1bW5zDQpjYWxjdWxhdGVkX21ldHJpY3MgPC0gc2FwcGx5KG1lcmdlZF9kYXRhX2NsZWFuWzI6M10sIGZ1bmN0aW9uKGNvbCkgew0KICBtZWFuX3ZhbCA8LSBtZWFuKGNvbCwgbmEucm0gPSBUUlVFKQ0KICBzZF92YWwgPC0gc2QoY29sLCBuYS5ybSA9IFRSVUUpDQogIHBlcmNlbnRfYWJvdmUgPC0gZnVuY3Rpb24odGFyZ2V0KSBtZWFuKGNvbCA+IHRhcmdldCwgbmEucm0gPSBUUlVFKSAqIDEwMA0KICANCiAgYygNCiAgICBNZWFuID0gbWVhbl92YWwsDQogICAgTWVkaWFuID0gbWVkaWFuKGNvbCwgbmEucm0gPSBUUlVFKSwNCiAgICBgU3RhbmRhcmQgRGV2aWF0aW9uIChWb2xhdGlsaXR5KWAgPSBzZF92YWwsDQogICAgYE1pbiBDQUdSIFJhbmdlIChDQUdSIC0gU0QpYCA9IG1lYW5fdmFsIC0gc2RfdmFsLA0KICAgIGBNYXggQ0FHUiBSYW5nZSAoQ0FHUiArIFNEKWAgPSBtZWFuX3ZhbCArIHNkX3ZhbCwNCiAgICBNaW4gPSBtaW4oY29sLCBuYS5ybSA9IFRSVUUpLA0KICAgIE1heCA9IG1heChjb2wsIG5hLnJtID0gVFJVRSksDQogICAgYFBlcmNlbnQgQWJvdmUgSW5mbGF0aW9uIFRhcmdldGAgPSBwZXJjZW50X2Fib3ZlKHRhcmdldF9pbmZsYXRpb24pLCAgIyBFeGFtcGxlIGluZmxhdGlvbiB0YXJnZXQ6IDIlDQogICAgYFBlcmNlbnQgQWJvdmUgQ29uc2VydmF0aXZlIFRhcmdldGAgPSBwZXJjZW50X2Fib3ZlKHRhcmdldF9jb25zZXJ2YXRpdmUpLA0KICAgIGBQZXJjZW50IEFib3ZlIE1vZGVyYXRlIFRhcmdldGAgPSBwZXJjZW50X2Fib3ZlKHRhcmdldF9tb2RlcmF0ZSksDQogICAgYFBlcmNlbnQgQWJvdmUgQWdncmVzc2l2ZSBUYXJnZXRgID0gcGVyY2VudF9hYm92ZSh0YXJnZXRfYWdncmVzc2l2ZSkNCiAgKQ0KfSkNCg0KIyBUcmFuc3Bvc2UgdGhlIHJlc3VsdCBhbmQgYWRkIHRoZSBNZXRyaWMgY29sdW1uDQpjdXN0b21fc3VtbWFyeSA8LSBkYXRhLmZyYW1lKA0KICBNZXRyaWMgPSBtZXRyaWNzLA0KICBjYWxjdWxhdGVkX21ldHJpY3MNCikNCg0KIyBSZW5hbWUgY29sdW1ucyB0byByZXRhaW4gdGhlIG9yaWdpbmFsIGNvbHVtbiBuYW1lcyBkeW5hbWljYWxseQ0KY29sbmFtZXMoY3VzdG9tX3N1bW1hcnkpWy0xXSA8LSBjb2xuYW1lcyhtZXJnZWRfZGF0YSlbMjozXQ0KDQojIEFkZCBwZXJjZW50YWdlIHNpZ25zIGJhY2sgdG8gYWxsIG51bWVyaWMgdmFsdWVzDQpjdXN0b21fc3VtbWFyeVstMV0gPC0gbGFwcGx5KGN1c3RvbV9zdW1tYXJ5Wy0xXSwgZnVuY3Rpb24oeCkgcGFzdGUwKGZvcm1hdEMoeCwgZm9ybWF0ID0gImYiLCBkaWdpdHMgPSAyKSwgIiUiKSkNCg0KIyBSZW1vdmUgcm93IG5hbWVzDQpyb3duYW1lcyhjdXN0b21fc3VtbWFyeSkgPC0gTlVMTA0KDQojIFByaW50IHRoZSBmaW5hbCBzdW1tYXJ5DQojIERpc3BsYXkgZm9ybWF0dGVkIHRhYmxlDQpjYXQoIlxuXG4jIyMjIDUtWWVhciBHcm93dGggUmF0ZXMgU3VtbWFyeSBCeSBJbmRleCAoIiwgc3RhcnRfeWVhciwgIi0iLCBlbmRfeWVhciwgIilcbiIsIHNlcCA9ICIiKQ0KDQppbnRlcmFjdGl2ZV9wcmludChjdXN0b21fc3VtbWFyeSkNCmZvcm1hdF8zY29sX2N1c3RvbV93aWR0aHMoY3VzdG9tX3N1bW1hcnksIGNvbDFfd2lkdGggPSAiMjBlbSIsIGNvbDJfd2lkdGggPSAiMTVlbSIsIGNvbDNfd2lkdGggPSAiMTVlbSIpDQoNCg0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiMjIFNBVkUgVkFMVUVTIEZPUiBJTi1MSU5FIENPREUNCg0KIyBEZWZpbmUgdGhlIG1hcHBpbmcgb2Ygcm93IG5hbWVzIHRvIHZhcmlhYmxlIG5hbWVzDQpyb3dfdG9fdmFyX25hbWUgPC0gYygNCiAgIk1lYW4iID0gIm1lYW5fdmFsdWUiLA0KICAiTWVkaWFuIiA9ICJtZWRpYW5fdmFsdWUiLA0KICAiU3RhbmRhcmQgRGV2aWF0aW9uIChWb2xhdGlsaXR5KSIgPSAic2RfdmFsdWUiLA0KICAiTWluIENBR1IgUmFuZ2UgKENBR1IgLSBTRCkiID0gIm1pbl9jYWdyX3JhbmdlIiwNCiAgIk1heCBDQUdSIFJhbmdlIChDQUdSICsgU0QpIiA9ICJtYXhfY2Fncl9yYW5nZSIsDQogICJNaW4iID0gIm1pbl92YWx1ZSIsDQogICJNYXgiID0gIm1heF92YWx1ZSIsDQogICJQZXJjZW50IEFib3ZlIEluZmxhdGlvbiBUYXJnZXQiID0gInBlcmNlbnRfYWJvdmVfdGFyZ2V0X2luZmxhdGlvbiIsDQogICJQZXJjZW50IEFib3ZlIENvbnNlcnZhdGl2ZSBUYXJnZXQiID0gInBlcmNlbnRfYWJvdmVfdGFyZ2V0X2NvbnNlcnZhdGl2ZSIsDQogICJQZXJjZW50IEFib3ZlIE1vZGVyYXRlIFRhcmdldCIgPSAicGVyY2VudF9hYm92ZV90YXJnZXRfbW9kZXJhdGUiLA0KICAiUGVyY2VudCBBYm92ZSBBZ2dyZXNzaXZlIFRhcmdldCIgPSAicGVyY2VudF9hYm92ZV90YXJnZXRfYWdncmVzc2l2ZSINCikNCg0KIyBEZWZpbmUgYSBjdXN0b20gbWFwcGluZyBmb3IgY29sdW1uIG5hbWVzDQpjb2x1bW5fbmFtZV9tYXBwaW5nIDwtIGMoDQogICJTUFgiID0gInNweCIsDQogICJRUVEiID0gInFxcSINCikNCg0KIyBGdW5jdGlvbiB0byBzYXZlIHN1bW1hcnkgdmFsdWVzIGR5bmFtaWNhbGx5IHdpdGggY29sdW1uIG5hbWUgbWFwcGluZw0Kc2F2ZV9jb2x1bW5fdmFsdWVzIDwtIGZ1bmN0aW9uKHN1bW1hcnlfZGYsIHJvd19tYXBwaW5nLCBjb2x1bW5fbWFwcGluZykgew0KICAjIEdldCB0aGUgY29sdW1uIG5hbWVzIGluIHRoZSBkYXRhIGZyYW1lDQogIGNvbHVtbnNfdG9fc2F2ZSA8LSBzZXRkaWZmKG5hbWVzKHN1bW1hcnlfZGYpLCBjKCJNZXRyaWMiKSkgICMgRXhjbHVkZSB0aGUgTWV0cmljIGNvbHVtbg0KICANCiAgIyBJdGVyYXRlIG92ZXIgZWFjaCBjb2x1bW4NCiAgZm9yIChjb2wgaW4gY29sdW1uc190b19zYXZlKSB7DQogICAgIyBVc2UgdGhlIGN1c3RvbSBtYXBwaW5nIHRvIGdldCB0aGUgYXBwcm9wcmlhdGUgY29sdW1uIG5hbWUNCiAgICBjb2xfbmFtZSA8LSBjb2x1bW5fbWFwcGluZ1tbY29sXV0gJXx8JSB0b2xvd2VyKGdzdWIoIlteYS16QS1aMC05XSIsICJfIiwgY29sKSkNCiAgICANCiAgICAjIEV4dHJhY3QgdmFsdWVzIGZvciB0aGUgY3VycmVudCBjb2x1bW4NCiAgICBjb2xfdmFsdWVzIDwtIHN1bW1hcnlfZGZbW2NvbF1dDQogICAgDQogICAgIyBJdGVyYXRlIG92ZXIgcm93cyB0byBzYXZlIGVhY2ggdmFsdWUgZHluYW1pY2FsbHkNCiAgICBmb3IgKGkgaW4gc2VxX2Fsb25nKGNvbF92YWx1ZXMpKSB7DQogICAgICAjIEdldCB0aGUgY29ycmVzcG9uZGluZyB2YXJpYWJsZSBuYW1lIGZyb20gdGhlIG1hcHBpbmcNCiAgICAgIHN0YXRfbmFtZSA8LSByb3dfbWFwcGluZ1tzdW1tYXJ5X2RmJE1ldHJpY1tpXV0NCiAgICAgIA0KICAgICAgaWYgKCFpcy5uYShzdGF0X25hbWUpKSB7ICAjIFNraXAgaWYgbm8gbWFwcGluZyBpcyBkZWZpbmVkDQogICAgICAgICMgQ3JlYXRlIHRoZSB2YXJpYWJsZSBuYW1lDQogICAgICAgIHZhcl9uYW1lIDwtIHBhc3RlMChzdGF0X25hbWUsICJfIiwgY29sX25hbWUpDQogICAgICAgIA0KICAgICAgICAjIEF0dGVtcHQgbnVtZXJpYyBjb252ZXJzaW9uIGZvciBkb3duc3RyZWFtIHVzZQ0KICAgICAgICB2YWx1ZSA8LSBzdXBwcmVzc1dhcm5pbmdzKGFzLm51bWVyaWMoZ3N1YigiJSIsICIiLCBjb2xfdmFsdWVzW2ldKSkpDQogICAgICAgIA0KICAgICAgICAjIEFzc2lnbiB0aGUgdmFsdWUgdG8gdGhlIGdsb2JhbCBlbnZpcm9ubWVudA0KICAgICAgICBhc3NpZ24odmFyX25hbWUsIHZhbHVlLCBlbnZpciA9IC5HbG9iYWxFbnYpDQogICAgICB9DQogICAgfQ0KICB9DQp9DQoNCiMgQXBwbHkgdGhlIGZ1bmN0aW9uIHRvIHNhdmUgdmFsdWVzIGR5bmFtaWNhbGx5DQpzYXZlX2NvbHVtbl92YWx1ZXMoY3VzdG9tX3N1bW1hcnksIHJvd190b192YXJfbmFtZSwgY29sdW1uX25hbWVfbWFwcGluZykNCg0KIyBFeGFtcGxlOiBBY2Nlc3NpbmcgZHluYW1pY2FsbHkgY3JlYXRlZCB2YXJpYWJsZXMNCmludGVyYWN0aXZlX3Bhc3RlKCJTUFggTWVhbjogIiwgbWVhbl92YWx1ZV9zcHgpICAjIFNob3VsZCBwcmludCB0aGUgbWVhbiB2YWx1ZSBmb3IgU1BYDQppbnRlcmFjdGl2ZV9wcmludChwZXJjZW50X2Fib3ZlX3RhcmdldF9hZ2dyZXNzaXZlX3FxcSkgICMgU2hvdWxkIHByaW50IHRoZSBwZXJjZW50IGFib3ZlIGFnZ3Jlc3NpdmUgdGFyZ2V0IGZvciBRUVENCg0KDQpgYGANCg0KDQojIyMjIEdyYXBoIA0KDQpgYGB7ciBpbmRleF9jb21wYXJpc29uXzV5ZWFyX2NhZ3JfZ3JhcGgsIGZpZy53aWR0aD0xMCwgZmlnLmhlaWdodD03LCBldmFsPVRSVUUsIGVjaG89RkFMU0V9DQoNCmNhdCgiXG5cbiMjIyMgNS1ZZWFyIFJvbGxpbmcgQ0FHUnMgQnkgSW5kZXggXG4iKQ0KDQojIExvYWQgbmVjZXNzYXJ5IGxpYnJhcmllcw0KbGlicmFyeShnZ3Bsb3QyKQ0KbGlicmFyeShkcGx5cikNCg0KIyBDb252ZXJ0IGNvbHVtbnMgdG8gbnVtZXJpYyBmb3IgcGxvdHRpbmcgaWYgbmVlZGVkDQptZXJnZWRfZGF0YSA8LSBtZXJnZWRfZGF0YSAlPiUNCiAgbXV0YXRlKA0KICAgIGBEYXRlYCA9IGFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKGBEYXRlYCkpLCAgIyBFbnN1cmUgRGF0ZSBpcyBudW1lcmljDQogICAgYFNQWGAgPSBhcy5udW1lcmljKGdzdWIoIiUiLCAiIiwgYFNQWGApKSwNCiAgICBgUVFRYCA9IGFzLm51bWVyaWMoZ3N1YigiJSIsICIiLCBgUVFRYCkpDQogICkNCg0KIyBSZXNoYXBlIHRoZSBkYXRhIGludG8gbG9uZyBmb3JtYXQgZm9yIGVhc3kgcGxvdHRpbmcgb2YgbXVsdGlwbGUgbGluZXMgYW5kIHNldCB0aGUgZmFjdG9yIG9yZGVyDQpucnRfbG9uZyA8LSBtZXJnZWRfZGF0YSAlPiUNCiAgcGl2b3RfbG9uZ2VyKGNvbHMgPSBjKGBTUFhgLCBgUVFRYCksDQogICAgICAgICAgICAgICBuYW1lc190byA9ICJBR1JfSW5kZXgiLA0KICAgICAgICAgICAgICAgdmFsdWVzX3RvID0gIkFHUl9WYWx1ZSIpICU+JQ0KICBtdXRhdGUoQUdSX0luZGV4ID0gZmFjdG9yKEFHUl9JbmRleCwgbGV2ZWxzID0gYygiU1BYIiwgIlFRUSIpKSkNCg0KIyBBc3NpZ24gY29sb3JzIGR5bmFtaWNhbGx5IGJhc2VkIG9uIHRoZSBvcmRlciBvZiBBR1JfSW5kZXggaW4gdGhlIGRhdGENCiMgTWF0Y2ggdGhlIHVuaXF1ZSBsZXZlbHMgb2YgQUdSX0luZGV4IHdpdGggY29sb3JzIGZyb20gY29sb3JzX2dlbmVyYWxfZGFyaw0KdW5pcXVlX3R5cGVzIDwtIHVuaXF1ZShucnRfbG9uZyRBR1JfSW5kZXgpDQpjdXN0b21fY29sb3JzIDwtIHNldE5hbWVzKGNvbG9yc19nZW5lcmFsX2RhcmtbMTpsZW5ndGgodW5pcXVlX3R5cGVzKV0sIHVuaXF1ZV90eXBlcykNCg0KIyBGaW5kIHRoZSBtaW5pbXVtIGFuZCBtYXhpbXVtIHgtdmFsdWUgaW4geW91ciBkYXRhDQptYXhfeCA8LSBtYXgoYXMuaW50ZWdlcihtZXJnZWRfZGF0YSREYXRlKSwgbmEucm0gPSBUUlVFKQ0KbWluX3ggPC0gbWluKGFzLmludGVnZXIobWVyZ2VkX2RhdGEkRGF0ZSksIG5hLnJtID0gVFJVRSkNCmludGVyYWN0aXZlX3ByaW50KG1heF94KSAgIyBUZXN0DQppbnRlcmFjdGl2ZV9wcmludChtaW5feCkgICMgVGVzdA0KDQojIEZpbmQgdGhlIG1pbmltdW0gYW5kIG1heGltdW0geWVhcg0KbWluX3llYXIgPC0gbWluKG1lcmdlZF9kYXRhJERhdGUsIG5hLnJtID0gVFJVRSkNCm1heF95ZWFyIDwtIG1heChtZXJnZWRfZGF0YSREYXRlLCBuYS5ybSA9IFRSVUUpDQppbnRlcmFjdGl2ZV9wcmludChtaW5feWVhcikNCmludGVyYWN0aXZlX3ByaW50KG1heF95ZWFyKQ0KDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KIyMgUExPVCBGVUxMIFdJVEhPVVQgTElNSVRTDQoNCiMgRGVmaW5lIHN0YXJ0IGFuZCBlbmQgeWVhcnMNCnN0YXJ0X3llYXIgPC0gMjAwNQ0KZW5kX3llYXIgPC0gMjAyNA0KeWVhcl9yYW5nZSA8LSBlbmRfeWVhciAtIHN0YXJ0X3llYXIgKyAxICAjIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIHllYXJzDQoNCiMgRGVmaW5lIGJyZWFrcyByb3VuZGVkIGFwcHJvcHJpYXRlbHkNCmxpbWl0c19zdGFydF95ZWFyIDwtIGZsb29yKHN0YXJ0X3llYXIgLyAyKSAqIDIgICMgUm91bmQgZG93biB0byB0aGUgbmVhcmVzdCBtdWx0aXBsZSBvZiA1DQpsaW1pdHNfZW5kX3llYXIgPC0gY2VpbGluZyhlbmRfeWVhciAvIDIpICogMiAgICMgUm91bmQgdXAgdG8gdGhlIG5lYXJlc3QgbXVsdGlwbGUgb2YgNQ0KDQojIENyZWF0ZSBkeW5hbWljIHRpdGxlIGFuZCBjYXB0aW9uDQpkeW5hbWljX3RpdGxlIDwtIHBhc3RlMCgiNS1ZZWFyIFJvbGxpbmcgQ0FHUnMgQnkgSW5kZXggT3ZlciAiLCB5ZWFyX3JhbmdlLCAiIFllYXJzICgiLCBzdGFydF95ZWFyLCAiLSIsIGVuZF95ZWFyLCAiKSIpDQpkeW5hbWljX2NhcHRpb24gPC0gcGFzdGUwKCI1LVllYXIgUm9sbGluZyBDb21wb3VuZCBBdmVyYWdlIEdyb3d0aCBSYXRlcyBCeSBJbmRleCwgRGF0YSBQZXJpb2QgKCIsIHN0YXJ0X3llYXIsICItIiwgZW5kX3llYXIsICIpIikNCg0KIyBDcmVhdGUgdGhlIGZ1bGwsIG5vbi1maWx0ZXJlZCB4LWF4aXMgcGxvdCB3aXRoIGR5bmFtaWMgeCBwbGFjZW1lbnQgZm9yIGFubm90YXRpb25zDQpwMSA8LSBnZ3Bsb3QobnJ0X2xvbmcsIGFlcyh4ID0gYXMuaW50ZWdlcihEYXRlKSwgeSA9IEFHUl9WYWx1ZSwgY29sb3IgPSBBR1JfSW5kZXgpKSArDQoNCiAgIyBBZGQgc2hhZGVkIGFyZWFzIGZvciBiYWNrZ3JvdW5kIGVmZmVjdA0KICBnZW9tX3JlY3QoYWVzKHhtaW4gPSAtSW5mLCB4bWF4ID0gSW5mLCB5bWluID0gdGFyZ2V0X2FnZ3Jlc3NpdmUsIHltYXggPSBJbmYpLCBmaWxsID0gImxpZ2h0Z3JlZW4iLCBhbHBoYSA9IDAuMDMwKSArDQogIGdlb21fcmVjdChhZXMoeG1pbiA9IC1JbmYsIHhtYXggPSBJbmYsIHltaW4gPSB0YXJnZXRfY29uc2VydmF0aXZlLCB5bWF4ID0gdGFyZ2V0X2FnZ3Jlc3NpdmUpLCBmaWxsID0gIm9yYW5nZSIsIGFscGhhID0gMC4wMzApICsNCiAgZ2VvbV9yZWN0KGFlcyh4bWluID0gLUluZiwgeG1heCA9IEluZiwgeW1pbiA9IC1JbmYsIHltYXggPSB0YXJnZXRfY29uc2VydmF0aXZlKSwgZmlsbCA9ICJsaWdodGNvcmFsIiwgYWxwaGEgPSAwLjAzMCkgKw0KICANCiAgIyBQbG90IGxpbmVzIGZvciBlYWNoIE1hcmtldCBJbmRleA0KICBnZW9tX2xpbmUoc2l6ZSA9IDEuMjUsIGFscGhhID0gMy4wKSArICAgICAgICMgTGluZSBmb3IgZWFjaCBDQUdSDQogIGdlb21fcG9pbnQoc2l6ZSA9IDIuMCwgYWxwaGEgPSAzLjApICsgICAgICAgIyBQb2ludHMgZm9yIGVhY2ggQ0FHUg0KICANCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gdGFyZ2V0X2FnZ3Jlc3NpdmUsIGNvbG9yID0gImRhcmtibHVlIiwgbGluZXR5cGUgPSAic29saWQiKSArDQogICMgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gdGFyZ2V0X21vZGVyYXRlLCBjb2xvciA9ICJkYXJrYmx1ZSIsIGxpbmV0eXBlID0gInNvbGlkIikgKw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSB0YXJnZXRfY29uc2VydmF0aXZlLCBjb2xvciA9ICJkYXJrYmx1ZSIsIGxpbmV0eXBlID0gInNvbGlkIikgKw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSB0YXJnZXRfaW5mbGF0aW9uLCBjb2xvciA9ICJkYXJrcmVkIiwgbGluZXR5cGUgPSAiZGFzaGVkIikgKw0KDQogICMgRHluYW1pYyByaWdodC1hbGlnbmVkIHBsYWNlbWVudCBmb3IgYW5ub3RhdGlvbnMNCiAgYW5ub3RhdGUoInRleHQiLCB4ID0gSW5mLCB5ID0gdGFyZ2V0X2FnZ3Jlc3NpdmUsIGxhYmVsID0gIkFnZ3Jlc3NpdmUiLCANCiAgICAgICAgICAgaGp1c3QgPSAxLCB2anVzdCA9IC0wLjUsIGNvbG9yID0gImRhcmtibHVlIiwgc2l6ZSA9IDQpICsNCiAgIyBhbm5vdGF0ZSgidGV4dCIsIHggPSBJbmYsIHkgPSB0YXJnZXRfbW9kZXJhdGUsIGxhYmVsID0gIk1vZGVyYXRlIiwgDQogICMgICAgICAgICBoanVzdCA9IDEsIHZqdXN0ID0gLTAuNSwgY29sb3IgPSAiZGFya2JsdWUiLCBzaXplID0gNCkgKw0KICBhbm5vdGF0ZSgidGV4dCIsIHggPSBJbmYsIHkgPSB0YXJnZXRfY29uc2VydmF0aXZlLCBsYWJlbCA9ICJDb25zZXJ2YXRpdmUiLCANCiAgICAgICAgICAgaGp1c3QgPSAxLCB2anVzdCA9IC0wLjUsIGNvbG9yID0gImRhcmtibHVlIiwgc2l6ZSA9IDQpICsNCiAgYW5ub3RhdGUoInRleHQiLCB4ID0gSW5mLCB5ID0gdGFyZ2V0X2luZmxhdGlvbiwgbGFiZWwgPSAiSW5mbGF0aW9uIiwgDQogICAgICAgICAgIGhqdXN0ID0gMSwgdmp1c3QgPSAtMC41LCBjb2xvciA9ICJkYXJrcmVkIiwgc2l6ZSA9IDQpICsNCg0KICBsYWJzKA0KICAgIHRpdGxlID0gZHluYW1pY190aXRsZSwNCiAgICB4ID0gIlllYXIiLA0KICAgIHkgPSAiQ0FHUiBWYWx1ZSAoJSkiLA0KICAgIGNvbG9yID0gIk1hcmtldCBJbmRleCIsDQogICAgY2FwdGlvbiA9IGR5bmFtaWNfY2FwdGlvbg0KICAgICkgKw0KICANCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGN1c3RvbV9jb2xvcnMpICsgICMgU2V0IGNvbG9ycyBmb3IgZWFjaCBNYXJrZXQgSW5kZXgNCiAgc2NhbGVfeF9jb250aW51b3VzKA0KICAgIGxpbWl0cyA9IGMoc3RhcnRfeWVhciwgZW5kX3llYXIgKyAxKSwgDQogICAgYnJlYWtzID0gc2VxKGxpbWl0c19zdGFydF95ZWFyLCBsaW1pdHNfZW5kX3llYXIsIDIpICAjIFJlc3RyaWN0ICYgU2V0IE1ham9yIHgtYXhpcyBsaW5lcyBmb3IgZWFjaCB5ZWFyDQogICkgKyANCiAgDQogIHRoZW1lX21pbmltYWwoKSArDQogIHRoZW1lKA0KICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUsIHNpemUgPSAyMCksICAgICAgICAgIyBMYXJnZXIgdGl0bGUgZm9udA0KICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQpLCAgICAgICAgICAgICAgICAgICAgIyBMYXJnZXIgeC1heGlzIGxhYmVsIGZvbnQNCiAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0KSwgICAgICAgICAgICAgICAgICAgICMgTGFyZ2VyIHktYXhpcyBsYWJlbCBmb250DQogICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxLCBzaXplID0gMTQpLCAgIyBMYXJnZXIgeC1heGlzIHRleHQNCiAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQpLCAgICAgICAgICAgICAgICAgICAgICMgTGFyZ2VyIHktYXhpcyB0ZXh0DQogICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCksICAgICAgICAgICAgICAgICAgICAjIExlZ2VuZCB0aXRsZSBzaXplDQogICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyKSwgICAgICAgICAgICAgICAgICAgICAjIExlZ2VuZCB0ZXh0IHNpemUNCiAgICBwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9saW5lKGxpbmV0eXBlID0gImRvdHRlZCIsIGNvbG9yID0gImJsYWNrIiksICAjIE1ham9yIGdyaWQgbGluZXMNCiAgICBwYW5lbC5ncmlkLm1pbm9yLnggPSBlbGVtZW50X2JsYW5rKCksICAgICAgICAgICAgICAgICAgICAgICMgTm8gbWlub3IgeCBncmlkIGxpbmVzDQogICAgYXhpcy50aWNrcy5sZW5ndGggPSB1bml0KC0wLjI1LCAiY20iKSwgICAgICAgICAgICAgICAgICAgICAgIyBJbmNyZWFzZSB0aWNrIGxlbmd0aA0KICAgIGF4aXMudGlja3MgPSBlbGVtZW50X2xpbmUoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMC41MCksICAgIyBEYXJrZXIgdGlja3MNCiAgICBheGlzLmxpbmUueCA9IGVsZW1lbnRfbGluZShjb2xvciA9ICJibGFjayIsIHNpemUgPSAwLjc1KSwgICMgRGFyayBib3R0b20gYm9yZGVyDQogICAgYXhpcy5saW5lLnkgPSBlbGVtZW50X2xpbmUoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMC43NSkgICAjIERhcmsgbGVmdCBib3JkZXINCiAgKQ0KDQojIFByaW50IHRoZSBwbG90IA0KcHJpbnQocDEpDQoNCg0KYGBgDQoNCg0KDQoNCg0KIyMjIDEwLVllYXIgQ0FHUiANCg0KIyMjIyBEYXRhDQoNCmBgYHtyIGluZGV4X2NvbXBhcmlzb25fMTB5ZWFyX2NhZ3IsIGV2YWw9VFJVRSwgZWNobz1GQUxTRX0NCg0KaW50ZXJhY3RpdmVfc3RyKHNweF9yYXdfY2FncikNCmludGVyYWN0aXZlX3N0cihxcXFfcmF3X2NhZ3IpDQoNCmludGVyYWN0aXZlX3ByaW50KHNweF9yYXdfY2FncikNCmludGVyYWN0aXZlX3ByaW50KHFxcV9yYXdfY2FncikNCg0KbWluX3llYXIgPC0gbWluKHNweF9yYXdfY2FnciREYXRlKQ0KbWF4X3llYXIgPC0gbWF4KHNweF9yYXdfY2FnciREYXRlKQ0KaW50ZXJhY3RpdmVfcHJpbnQobWluX3llYXIpDQppbnRlcmFjdGl2ZV9wcmludChtYXhfeWVhcikNCg0KbWluX3llYXIgPC0gbWluKHFxcV9yYXdfY2FnciREYXRlKQ0KbWF4X3llYXIgPC0gbWF4KHFxcV9yYXdfY2FnciREYXRlKQ0KaW50ZXJhY3RpdmVfcHJpbnQobWluX3llYXIpDQppbnRlcmFjdGl2ZV9wcmludChtYXhfeWVhcikNCg0KIyBGaWx0ZXIgZGF0YSBmb3IgdGhlIHJlcXVpcmVkIGRhdGUgcmFuZ2UgKDIwMTAgdG8gdGhlIHByZXNlbnQgeWVhcikNCnN0YXJ0X3llYXIgPC0gMjAxMA0KIyBlbmRfeWVhciA8LSAyMDI0DQplbmRfeWVhciA8LSBhcy5udW1lcmljKGZvcm1hdChTeXMuRGF0ZSgpLCAiJVkiKSkNCg0Kc3B4X2ZpbHRlcmVkIDwtIHN1YnNldChzcHhfcmF3X2NhZ3IsIERhdGUgPj0gc3RhcnRfeWVhciAmIERhdGUgPD0gZW5kX3llYXIsIHNlbGVjdCA9IGMoRGF0ZSwgYDEwLVllYXIgQ0FHUmApKQ0KcXFxX2ZpbHRlcmVkIDwtIHN1YnNldChxcXFfcmF3X2NhZ3IsIERhdGUgPj0gc3RhcnRfeWVhciAmIERhdGUgPD0gZW5kX3llYXIsIHNlbGVjdCA9IGMoRGF0ZSwgYDEwLVllYXIgQ0FHUmApKQ0KDQojIFJlbmFtZSBjb2x1bW5zIGZvciBjbGFyaXR5DQpjb2xuYW1lcyhzcHhfZmlsdGVyZWQpW2NvbG5hbWVzKHNweF9maWx0ZXJlZCkgPT0gIjEwLVllYXIgQ0FHUiJdIDwtICJTUFgiDQpjb2xuYW1lcyhxcXFfZmlsdGVyZWQpW2NvbG5hbWVzKHFxcV9maWx0ZXJlZCkgPT0gIjEwLVllYXIgQ0FHUiJdIDwtICJRUVEiDQoNCiMgTWVyZ2UgZGF0YXNldHMgYnkgRGF0ZSAoWWVhcikNCm1lcmdlZF9kYXRhIDwtIG1lcmdlKHNweF9maWx0ZXJlZCwgcXFxX2ZpbHRlcmVkLCBieSA9ICJEYXRlIikNCg0KIyBTb3J0IGJ5IERhdGUgaW4gZGVzY2VuZGluZyBvcmRlciAobW9zdCByZWNlbnQgeWVhciBmaXJzdCkNCm1lcmdlZF9kYXRhIDwtIG1lcmdlZF9kYXRhW29yZGVyKC1tZXJnZWRfZGF0YSREYXRlKSwgXQ0KDQojIEZvcm1hdCB0aGUgbWVyZ2VkIGRhdGENCm1lcmdlZF9kYXRhJERhdGUgPC0gYXMuY2hhcmFjdGVyKG1lcmdlZF9kYXRhJERhdGUpICAjIEVuc3VyZSBEYXRlIGlzIGEgY2hhcmFjdGVyIHdpdGhvdXQgY29tbWFzDQptZXJnZWRfZGF0YSRgU1BYYCA8LSBwYXN0ZTAoZm9ybWF0QyhtZXJnZWRfZGF0YSRgU1BYYCwgZm9ybWF0ID0gImYiLCBkaWdpdHMgPSAyKSwgIiUiKQ0KbWVyZ2VkX2RhdGEkUVFRIDwtIHBhc3RlMChmb3JtYXRDKG1lcmdlZF9kYXRhJFFRUSwgZm9ybWF0ID0gImYiLCBkaWdpdHMgPSAyKSwgIiUiKQ0KDQojIERpc3BsYXkgZm9ybWF0dGVkIHRhYmxlDQpjYXQoIlxuXG4jIyMjIDEwLVllYXIgUm9sbGluZyBDQUdScyBCeSBJbmRleCAoIiwgc3RhcnRfeWVhciwgIi0iLCBlbmRfeWVhciwgIilcbiIsIHNlcCA9ICIiKQ0KaW50ZXJhY3RpdmVfcHJpbnQobWVyZ2VkX2RhdGEpDQppbnRlcmFjdGl2ZV9zdHIobWVyZ2VkX2RhdGEpDQpmb3JtYXRfZXF1YWxfd2lkdGgobWVyZ2VkX2RhdGEpDQoNCg0KYGBgDQoNCg0KIyMjIyBTdW1tYXJ5DQoNCmBgYHtyIGluZGV4X2NvbXBhcmlzb25fMTB5ZWFyX2NhZ3Jfc3VtbWFyeSwgZXZhbD1UUlVFLCBlY2hvPUZBTFNFfQ0KDQojIExvYWQgbmVjZXNzYXJ5IGxpYnJhcnkNCmxpYnJhcnkoZHBseXIpDQoNCiMgUmVtb3ZlIHBlcmNlbnRhZ2Ugc2lnbnMgYW5kIGNvbnZlcnQgY29sdW1ucyB0byBudW1lcmljDQptZXJnZWRfZGF0YV9jbGVhbiA8LSBtZXJnZWRfZGF0YQ0KbWVyZ2VkX2RhdGFfY2xlYW5bMjozXSA8LSBsYXBwbHkobWVyZ2VkX2RhdGFbMjozXSwgZnVuY3Rpb24oeCkgYXMubnVtZXJpYyhnc3ViKCIlIiwgIiIsIHgpKSkNCg0KIyBGaW5kIHRoZSBtaW5pbXVtIGFuZCBtYXhpbXVtIHllYXINCm1pbl95ZWFyIDwtIG1pbihtZXJnZWRfZGF0YSREYXRlLCBuYS5ybSA9IFRSVUUpDQptYXhfeWVhciA8LSBtYXgobWVyZ2VkX2RhdGEkRGF0ZSwgbmEucm0gPSBUUlVFKQ0KaW50ZXJhY3RpdmVfcHJpbnQobWluX3llYXIpDQppbnRlcmFjdGl2ZV9wcmludChtYXhfeWVhcikNCg0KIyBEZWZpbmUgdGhlIG1ldHJpY3MgdG8gY2FsY3VsYXRlLCBpbmNsdWRpbmcgQ0FHUg0KbWV0cmljcyA8LSBjKA0KICAiTWVhbiIsIA0KICAiTWVkaWFuIiwgDQogICJTdGFuZGFyZCBEZXZpYXRpb24gKFZvbGF0aWxpdHkpIiwgDQogICJNaW4gQ0FHUiBSYW5nZSAoQ0FHUiAtIFNEKSIsIA0KICAiTWF4IENBR1IgUmFuZ2UgKENBR1IgKyBTRCkiLCANCiAgIk1pbiIsIA0KICAiTWF4IiwgDQogICJQZXJjZW50IEFib3ZlIEluZmxhdGlvbiBUYXJnZXQiLCANCiAgIlBlcmNlbnQgQWJvdmUgQ29uc2VydmF0aXZlIFRhcmdldCIsIA0KICAiUGVyY2VudCBBYm92ZSBNb2RlcmF0ZSBUYXJnZXQiLCANCiAgIlBlcmNlbnQgQWJvdmUgQWdncmVzc2l2ZSBUYXJnZXQiDQopDQoNCiMgQ2FsY3VsYXRlIG1ldHJpY3MgZHluYW1pY2FsbHkgZm9yIGFsbCBudW1lcmljIGNvbHVtbnMNCmNhbGN1bGF0ZWRfbWV0cmljcyA8LSBzYXBwbHkobWVyZ2VkX2RhdGFfY2xlYW5bMjozXSwgZnVuY3Rpb24oY29sKSB7DQogIG1lYW5fdmFsIDwtIG1lYW4oY29sLCBuYS5ybSA9IFRSVUUpDQogIHNkX3ZhbCA8LSBzZChjb2wsIG5hLnJtID0gVFJVRSkNCiAgcGVyY2VudF9hYm92ZSA8LSBmdW5jdGlvbih0YXJnZXQpIG1lYW4oY29sID4gdGFyZ2V0LCBuYS5ybSA9IFRSVUUpICogMTAwDQogIA0KICBjKA0KICAgIE1lYW4gPSBtZWFuX3ZhbCwNCiAgICBNZWRpYW4gPSBtZWRpYW4oY29sLCBuYS5ybSA9IFRSVUUpLA0KICAgIGBTdGFuZGFyZCBEZXZpYXRpb24gKFZvbGF0aWxpdHkpYCA9IHNkX3ZhbCwNCiAgICBgTWluIENBR1IgUmFuZ2UgKENBR1IgLSBTRClgID0gbWVhbl92YWwgLSBzZF92YWwsDQogICAgYE1heCBDQUdSIFJhbmdlIChDQUdSICsgU0QpYCA9IG1lYW5fdmFsICsgc2RfdmFsLA0KICAgIE1pbiA9IG1pbihjb2wsIG5hLnJtID0gVFJVRSksDQogICAgTWF4ID0gbWF4KGNvbCwgbmEucm0gPSBUUlVFKSwNCiAgICBgUGVyY2VudCBBYm92ZSBJbmZsYXRpb24gVGFyZ2V0YCA9IHBlcmNlbnRfYWJvdmUodGFyZ2V0X2luZmxhdGlvbiksICAjIEV4YW1wbGUgaW5mbGF0aW9uIHRhcmdldDogMiUNCiAgICBgUGVyY2VudCBBYm92ZSBDb25zZXJ2YXRpdmUgVGFyZ2V0YCA9IHBlcmNlbnRfYWJvdmUodGFyZ2V0X2NvbnNlcnZhdGl2ZSksDQogICAgYFBlcmNlbnQgQWJvdmUgTW9kZXJhdGUgVGFyZ2V0YCA9IHBlcmNlbnRfYWJvdmUodGFyZ2V0X21vZGVyYXRlKSwNCiAgICBgUGVyY2VudCBBYm92ZSBBZ2dyZXNzaXZlIFRhcmdldGAgPSBwZXJjZW50X2Fib3ZlKHRhcmdldF9hZ2dyZXNzaXZlKQ0KICApDQp9KQ0KDQojIFRyYW5zcG9zZSB0aGUgcmVzdWx0IGFuZCBhZGQgdGhlIE1ldHJpYyBjb2x1bW4NCmN1c3RvbV9zdW1tYXJ5IDwtIGRhdGEuZnJhbWUoDQogIE1ldHJpYyA9IG1ldHJpY3MsDQogIGNhbGN1bGF0ZWRfbWV0cmljcw0KKQ0KDQojIFJlbmFtZSBjb2x1bW5zIHRvIHJldGFpbiB0aGUgb3JpZ2luYWwgY29sdW1uIG5hbWVzIGR5bmFtaWNhbGx5DQpjb2xuYW1lcyhjdXN0b21fc3VtbWFyeSlbLTFdIDwtIGNvbG5hbWVzKG1lcmdlZF9kYXRhKVsyOjNdDQoNCiMgQWRkIHBlcmNlbnRhZ2Ugc2lnbnMgYmFjayB0byBhbGwgbnVtZXJpYyB2YWx1ZXMNCmN1c3RvbV9zdW1tYXJ5Wy0xXSA8LSBsYXBwbHkoY3VzdG9tX3N1bW1hcnlbLTFdLCBmdW5jdGlvbih4KSBwYXN0ZTAoZm9ybWF0Qyh4LCBmb3JtYXQgPSAiZiIsIGRpZ2l0cyA9IDIpLCAiJSIpKQ0KDQojIFJlbW92ZSByb3cgbmFtZXMNCnJvd25hbWVzKGN1c3RvbV9zdW1tYXJ5KSA8LSBOVUxMDQoNCiMgUHJpbnQgdGhlIGZpbmFsIHN1bW1hcnkNCiMgRGlzcGxheSBmb3JtYXR0ZWQgdGFibGUNCmNhdCgiXG5cbiMjIyMgMTAtWWVhciBHcm93dGggUmF0ZXMgU3VtbWFyeSBCeSBJbmRleCAoIiwgc3RhcnRfeWVhciwgIi0iLCBlbmRfeWVhciwgIilcbiIsIHNlcCA9ICIiKQ0KDQppbnRlcmFjdGl2ZV9wcmludChjdXN0b21fc3VtbWFyeSkNCmZvcm1hdF8zY29sX2N1c3RvbV93aWR0aHMoY3VzdG9tX3N1bW1hcnksIGNvbDFfd2lkdGggPSAiMjBlbSIsIGNvbDJfd2lkdGggPSAiMTVlbSIsIGNvbDNfd2lkdGggPSAiMTVlbSIpDQoNCg0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiMjIFNBVkUgVkFMVUVTIEZPUiBJTi1MSU5FIENPREUNCg0KIyBEZWZpbmUgdGhlIG1hcHBpbmcgb2Ygcm93IG5hbWVzIHRvIHZhcmlhYmxlIG5hbWVzDQpyb3dfdG9fdmFyX25hbWUgPC0gYygNCiAgIk1lYW4iID0gIm1lYW5fdmFsdWUiLA0KICAiTWVkaWFuIiA9ICJtZWRpYW5fdmFsdWUiLA0KICAiU3RhbmRhcmQgRGV2aWF0aW9uIChWb2xhdGlsaXR5KSIgPSAic2RfdmFsdWUiLA0KICAiTWluIENBR1IgUmFuZ2UgKENBR1IgLSBTRCkiID0gIm1pbl9jYWdyX3JhbmdlIiwNCiAgIk1heCBDQUdSIFJhbmdlIChDQUdSICsgU0QpIiA9ICJtYXhfY2Fncl9yYW5nZSIsDQogICJNaW4iID0gIm1pbl92YWx1ZSIsDQogICJNYXgiID0gIm1heF92YWx1ZSIsDQogICJQZXJjZW50IEFib3ZlIEluZmxhdGlvbiBUYXJnZXQiID0gInBlcmNlbnRfYWJvdmVfdGFyZ2V0X2luZmxhdGlvbiIsDQogICJQZXJjZW50IEFib3ZlIENvbnNlcnZhdGl2ZSBUYXJnZXQiID0gInBlcmNlbnRfYWJvdmVfdGFyZ2V0X2NvbnNlcnZhdGl2ZSIsDQogICJQZXJjZW50IEFib3ZlIE1vZGVyYXRlIFRhcmdldCIgPSAicGVyY2VudF9hYm92ZV90YXJnZXRfbW9kZXJhdGUiLA0KICAiUGVyY2VudCBBYm92ZSBBZ2dyZXNzaXZlIFRhcmdldCIgPSAicGVyY2VudF9hYm92ZV90YXJnZXRfYWdncmVzc2l2ZSINCikNCg0KIyBEZWZpbmUgYSBjdXN0b20gbWFwcGluZyBmb3IgY29sdW1uIG5hbWVzDQpjb2x1bW5fbmFtZV9tYXBwaW5nIDwtIGMoDQogICJTUFgiID0gInNweCIsDQogICJRUVEiID0gInFxcSINCikNCg0KIyBGdW5jdGlvbiB0byBzYXZlIHN1bW1hcnkgdmFsdWVzIGR5bmFtaWNhbGx5IHdpdGggY29sdW1uIG5hbWUgbWFwcGluZw0Kc2F2ZV9jb2x1bW5fdmFsdWVzIDwtIGZ1bmN0aW9uKHN1bW1hcnlfZGYsIHJvd19tYXBwaW5nLCBjb2x1bW5fbWFwcGluZykgew0KICAjIEdldCB0aGUgY29sdW1uIG5hbWVzIGluIHRoZSBkYXRhIGZyYW1lDQogIGNvbHVtbnNfdG9fc2F2ZSA8LSBzZXRkaWZmKG5hbWVzKHN1bW1hcnlfZGYpLCBjKCJNZXRyaWMiKSkgICMgRXhjbHVkZSB0aGUgTWV0cmljIGNvbHVtbg0KICANCiAgIyBJdGVyYXRlIG92ZXIgZWFjaCBjb2x1bW4NCiAgZm9yIChjb2wgaW4gY29sdW1uc190b19zYXZlKSB7DQogICAgIyBVc2UgdGhlIGN1c3RvbSBtYXBwaW5nIHRvIGdldCB0aGUgYXBwcm9wcmlhdGUgY29sdW1uIG5hbWUNCiAgICBjb2xfbmFtZSA8LSBjb2x1bW5fbWFwcGluZ1tbY29sXV0gJXx8JSB0b2xvd2VyKGdzdWIoIlteYS16QS1aMC05XSIsICJfIiwgY29sKSkNCiAgICANCiAgICAjIEV4dHJhY3QgdmFsdWVzIGZvciB0aGUgY3VycmVudCBjb2x1bW4NCiAgICBjb2xfdmFsdWVzIDwtIHN1bW1hcnlfZGZbW2NvbF1dDQogICAgDQogICAgIyBJdGVyYXRlIG92ZXIgcm93cyB0byBzYXZlIGVhY2ggdmFsdWUgZHluYW1pY2FsbHkNCiAgICBmb3IgKGkgaW4gc2VxX2Fsb25nKGNvbF92YWx1ZXMpKSB7DQogICAgICAjIEdldCB0aGUgY29ycmVzcG9uZGluZyB2YXJpYWJsZSBuYW1lIGZyb20gdGhlIG1hcHBpbmcNCiAgICAgIHN0YXRfbmFtZSA8LSByb3dfbWFwcGluZ1tzdW1tYXJ5X2RmJE1ldHJpY1tpXV0NCiAgICAgIA0KICAgICAgaWYgKCFpcy5uYShzdGF0X25hbWUpKSB7ICAjIFNraXAgaWYgbm8gbWFwcGluZyBpcyBkZWZpbmVkDQogICAgICAgICMgQ3JlYXRlIHRoZSB2YXJpYWJsZSBuYW1lDQogICAgICAgIHZhcl9uYW1lIDwtIHBhc3RlMChzdGF0X25hbWUsICJfIiwgY29sX25hbWUpDQogICAgICAgIA0KICAgICAgICAjIEF0dGVtcHQgbnVtZXJpYyBjb252ZXJzaW9uIGZvciBkb3duc3RyZWFtIHVzZQ0KICAgICAgICB2YWx1ZSA8LSBzdXBwcmVzc1dhcm5pbmdzKGFzLm51bWVyaWMoZ3N1YigiJSIsICIiLCBjb2xfdmFsdWVzW2ldKSkpDQogICAgICAgIA0KICAgICAgICAjIEFzc2lnbiB0aGUgdmFsdWUgdG8gdGhlIGdsb2JhbCBlbnZpcm9ubWVudA0KICAgICAgICBhc3NpZ24odmFyX25hbWUsIHZhbHVlLCBlbnZpciA9IC5HbG9iYWxFbnYpDQogICAgICB9DQogICAgfQ0KICB9DQp9DQoNCiMgQXBwbHkgdGhlIGZ1bmN0aW9uIHRvIHNhdmUgdmFsdWVzIGR5bmFtaWNhbGx5DQpzYXZlX2NvbHVtbl92YWx1ZXMoY3VzdG9tX3N1bW1hcnksIHJvd190b192YXJfbmFtZSwgY29sdW1uX25hbWVfbWFwcGluZykNCg0KIyBFeGFtcGxlOiBBY2Nlc3NpbmcgZHluYW1pY2FsbHkgY3JlYXRlZCB2YXJpYWJsZXMNCmludGVyYWN0aXZlX3Bhc3RlKCJTUFggTWVhbjogIiwgbWVhbl92YWx1ZV9zcHgpICAjIFNob3VsZCBwcmludCB0aGUgbWVhbiB2YWx1ZSBmb3IgU1BYDQppbnRlcmFjdGl2ZV9wcmludChwZXJjZW50X2Fib3ZlX3RhcmdldF9hZ2dyZXNzaXZlX3FxcSkgICMgU2hvdWxkIHByaW50IHRoZSBwZXJjZW50IGFib3ZlIGFnZ3Jlc3NpdmUgdGFyZ2V0IGZvciBRUVENCg0KDQpgYGANCg0KIyMjIyBHcmFwaCANCg0KYGBge3IgaW5kZXhfY29tcGFyaXNvbl8xMHllYXJfY2Fncl9ncmFwaCwgZmlnLndpZHRoPTEwLCBmaWcuaGVpZ2h0PTcsIGV2YWw9VFJVRSwgZWNobz1GQUxTRX0NCg0KY2F0KCJcblxuIyMjIyAxMC1ZZWFyIFJvbGxpbmcgQ0FHUnMgQnkgSW5kZXggXG4iKQ0KDQojIExvYWQgbmVjZXNzYXJ5IGxpYnJhcmllcw0KbGlicmFyeShnZ3Bsb3QyKQ0KbGlicmFyeShkcGx5cikNCg0KIyBDb252ZXJ0IGNvbHVtbnMgdG8gbnVtZXJpYyBmb3IgcGxvdHRpbmcgaWYgbmVlZGVkDQptZXJnZWRfZGF0YSA8LSBtZXJnZWRfZGF0YSAlPiUNCiAgbXV0YXRlKA0KICAgIGBEYXRlYCA9IGFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKGBEYXRlYCkpLCAgIyBFbnN1cmUgRGF0ZSBpcyBudW1lcmljDQogICAgYFNQWGAgPSBhcy5udW1lcmljKGdzdWIoIiUiLCAiIiwgYFNQWGApKSwNCiAgICBgUVFRYCA9IGFzLm51bWVyaWMoZ3N1YigiJSIsICIiLCBgUVFRYCkpDQogICkNCg0KIyBSZXNoYXBlIHRoZSBkYXRhIGludG8gbG9uZyBmb3JtYXQgZm9yIGVhc3kgcGxvdHRpbmcgb2YgbXVsdGlwbGUgbGluZXMgYW5kIHNldCB0aGUgZmFjdG9yIG9yZGVyDQpucnRfbG9uZyA8LSBtZXJnZWRfZGF0YSAlPiUNCiAgcGl2b3RfbG9uZ2VyKGNvbHMgPSBjKGBTUFhgLCBgUVFRYCksDQogICAgICAgICAgICAgICBuYW1lc190byA9ICJBR1JfSW5kZXgiLA0KICAgICAgICAgICAgICAgdmFsdWVzX3RvID0gIkFHUl9WYWx1ZSIpICU+JQ0KICBtdXRhdGUoQUdSX0luZGV4ID0gZmFjdG9yKEFHUl9JbmRleCwgbGV2ZWxzID0gYygiU1BYIiwgIlFRUSIpKSkNCg0KIyBBc3NpZ24gY29sb3JzIGR5bmFtaWNhbGx5IGJhc2VkIG9uIHRoZSBvcmRlciBvZiBBR1JfSW5kZXggaW4gdGhlIGRhdGENCiMgTWF0Y2ggdGhlIHVuaXF1ZSBsZXZlbHMgb2YgQUdSX0luZGV4IHdpdGggY29sb3JzIGZyb20gY29sb3JzX2dlbmVyYWxfZGFyaw0KdW5pcXVlX3R5cGVzIDwtIHVuaXF1ZShucnRfbG9uZyRBR1JfSW5kZXgpDQpjdXN0b21fY29sb3JzIDwtIHNldE5hbWVzKGNvbG9yc19nZW5lcmFsX2RhcmtbMTpsZW5ndGgodW5pcXVlX3R5cGVzKV0sIHVuaXF1ZV90eXBlcykNCg0KIyBGaW5kIHRoZSBtaW5pbXVtIGFuZCBtYXhpbXVtIHgtdmFsdWUgaW4geW91ciBkYXRhDQptYXhfeCA8LSBtYXgoYXMuaW50ZWdlcihtZXJnZWRfZGF0YSREYXRlKSwgbmEucm0gPSBUUlVFKQ0KbWluX3ggPC0gbWluKGFzLmludGVnZXIobWVyZ2VkX2RhdGEkRGF0ZSksIG5hLnJtID0gVFJVRSkNCmludGVyYWN0aXZlX3ByaW50KG1heF94KSAgIyBUZXN0DQppbnRlcmFjdGl2ZV9wcmludChtaW5feCkgICMgVGVzdA0KDQojIEZpbmQgdGhlIG1pbmltdW0gYW5kIG1heGltdW0geWVhcg0KbWluX3llYXIgPC0gbWluKG1lcmdlZF9kYXRhJERhdGUsIG5hLnJtID0gVFJVRSkNCm1heF95ZWFyIDwtIG1heChtZXJnZWRfZGF0YSREYXRlLCBuYS5ybSA9IFRSVUUpDQppbnRlcmFjdGl2ZV9wcmludChtaW5feWVhcikNCmludGVyYWN0aXZlX3ByaW50KG1heF95ZWFyKQ0KDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KIyMgUExPVCBGVUxMIFdJVEhPVVQgTElNSVRTDQoNCiMgRGVmaW5lIHN0YXJ0IGFuZCBlbmQgeWVhcnMNCnN0YXJ0X3llYXIgPC0gMjAxMA0KZW5kX3llYXIgPC0gMjAyNA0KeWVhcl9yYW5nZSA8LSBlbmRfeWVhciAtIHN0YXJ0X3llYXIgKyAxICAjIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIHllYXJzDQoNCiMgRGVmaW5lIGJyZWFrcyByb3VuZGVkIGFwcHJvcHJpYXRlbHkNCmxpbWl0c19zdGFydF95ZWFyIDwtIGZsb29yKHN0YXJ0X3llYXIgLyAyKSAqIDIgICMgUm91bmQgZG93biB0byB0aGUgbmVhcmVzdCBtdWx0aXBsZSBvZiA1DQpsaW1pdHNfZW5kX3llYXIgPC0gY2VpbGluZyhlbmRfeWVhciAvIDIpICogMiAgICMgUm91bmQgdXAgdG8gdGhlIG5lYXJlc3QgbXVsdGlwbGUgb2YgNQ0KDQojIENyZWF0ZSBkeW5hbWljIHRpdGxlIGFuZCBjYXB0aW9uDQpkeW5hbWljX3RpdGxlIDwtIHBhc3RlMCgiMTAtWWVhciBSb2xsaW5nIENBR1JzIEJ5IEluZGV4IE92ZXIgIiwgeWVhcl9yYW5nZSwgIiBZZWFycyAoIiwgc3RhcnRfeWVhciwgIi0iLCBlbmRfeWVhciwgIikiKQ0KZHluYW1pY19jYXB0aW9uIDwtIHBhc3RlMCgiMTAtWWVhciBSb2xsaW5nIENvbXBvdW5kIEF2ZXJhZ2UgR3Jvd3RoIFJhdGVzIEJ5IEluZGV4LCBEYXRhIFBlcmlvZCAoIiwgc3RhcnRfeWVhciwgIi0iLCBlbmRfeWVhciwgIikiKQ0KDQojIENyZWF0ZSB0aGUgZnVsbCwgbm9uLWZpbHRlcmVkIHgtYXhpcyBwbG90IHdpdGggZHluYW1pYyB4IHBsYWNlbWVudCBmb3IgYW5ub3RhdGlvbnMNCnAxIDwtIGdncGxvdChucnRfbG9uZywgYWVzKHggPSBhcy5pbnRlZ2VyKERhdGUpLCB5ID0gQUdSX1ZhbHVlLCBjb2xvciA9IEFHUl9JbmRleCkpICsNCg0KICAjIEFkZCBzaGFkZWQgYXJlYXMgZm9yIGJhY2tncm91bmQgZWZmZWN0DQogIGdlb21fcmVjdChhZXMoeG1pbiA9IC1JbmYsIHhtYXggPSBJbmYsIHltaW4gPSB0YXJnZXRfYWdncmVzc2l2ZSwgeW1heCA9IEluZiksIGZpbGwgPSAibGlnaHRncmVlbiIsIGFscGhhID0gMC4wMzApICsNCiAgZ2VvbV9yZWN0KGFlcyh4bWluID0gLUluZiwgeG1heCA9IEluZiwgeW1pbiA9IHRhcmdldF9jb25zZXJ2YXRpdmUsIHltYXggPSB0YXJnZXRfYWdncmVzc2l2ZSksIGZpbGwgPSAib3JhbmdlIiwgYWxwaGEgPSAwLjAzMCkgKw0KICBnZW9tX3JlY3QoYWVzKHhtaW4gPSAtSW5mLCB4bWF4ID0gSW5mLCB5bWluID0gLUluZiwgeW1heCA9IHRhcmdldF9jb25zZXJ2YXRpdmUpLCBmaWxsID0gImxpZ2h0Y29yYWwiLCBhbHBoYSA9IDAuMDMwKSArDQogIA0KICAjIFBsb3QgbGluZXMgZm9yIGVhY2ggTWFya2V0IEluZGV4DQogIGdlb21fbGluZShzaXplID0gMS4yNSwgYWxwaGEgPSAzLjApICsgICAgICAgIyBMaW5lIGZvciBlYWNoIENBR1INCiAgZ2VvbV9wb2ludChzaXplID0gMi4wLCBhbHBoYSA9IDMuMCkgKyAgICAgICAjIFBvaW50cyBmb3IgZWFjaCBDQUdSDQogIA0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSB0YXJnZXRfYWdncmVzc2l2ZSwgY29sb3IgPSAiZGFya2JsdWUiLCBsaW5ldHlwZSA9ICJzb2xpZCIpICsNCiAgIyBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSB0YXJnZXRfbW9kZXJhdGUsIGNvbG9yID0gImRhcmtibHVlIiwgbGluZXR5cGUgPSAic29saWQiKSArDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IHRhcmdldF9jb25zZXJ2YXRpdmUsIGNvbG9yID0gImRhcmtibHVlIiwgbGluZXR5cGUgPSAic29saWQiKSArDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IHRhcmdldF9pbmZsYXRpb24sIGNvbG9yID0gImRhcmtyZWQiLCBsaW5ldHlwZSA9ICJkYXNoZWQiKSArDQoNCiAgIyBEeW5hbWljIHJpZ2h0LWFsaWduZWQgcGxhY2VtZW50IGZvciBhbm5vdGF0aW9ucw0KICBhbm5vdGF0ZSgidGV4dCIsIHggPSBJbmYsIHkgPSB0YXJnZXRfYWdncmVzc2l2ZSwgbGFiZWwgPSAiQWdncmVzc2l2ZSIsIA0KICAgICAgICAgICBoanVzdCA9IDEsIHZqdXN0ID0gLTAuNSwgY29sb3IgPSAiZGFya2JsdWUiLCBzaXplID0gNCkgKw0KICAjIGFubm90YXRlKCJ0ZXh0IiwgeCA9IEluZiwgeSA9IHRhcmdldF9tb2RlcmF0ZSwgbGFiZWwgPSAiTW9kZXJhdGUiLCANCiAgIyAgICAgICAgIGhqdXN0ID0gMSwgdmp1c3QgPSAtMC41LCBjb2xvciA9ICJkYXJrYmx1ZSIsIHNpemUgPSA0KSArDQogIGFubm90YXRlKCJ0ZXh0IiwgeCA9IEluZiwgeSA9IHRhcmdldF9jb25zZXJ2YXRpdmUsIGxhYmVsID0gIkNvbnNlcnZhdGl2ZSIsIA0KICAgICAgICAgICBoanVzdCA9IDEsIHZqdXN0ID0gLTAuNSwgY29sb3IgPSAiZGFya2JsdWUiLCBzaXplID0gNCkgKw0KICBhbm5vdGF0ZSgidGV4dCIsIHggPSBJbmYsIHkgPSB0YXJnZXRfaW5mbGF0aW9uLCBsYWJlbCA9ICJJbmZsYXRpb24iLCANCiAgICAgICAgICAgaGp1c3QgPSAxLCB2anVzdCA9IC0wLjUsIGNvbG9yID0gImRhcmtyZWQiLCBzaXplID0gNCkgKw0KDQogIGxhYnMoDQogICAgdGl0bGUgPSBkeW5hbWljX3RpdGxlLA0KICAgIHggPSAiWWVhciIsDQogICAgeSA9ICJDQUdSIFZhbHVlICglKSIsDQogICAgY29sb3IgPSAiTWFya2V0IEluZGV4IiwNCiAgICBjYXB0aW9uID0gZHluYW1pY19jYXB0aW9uDQogICAgKSArDQogIA0KICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gY3VzdG9tX2NvbG9ycykgKyAgIyBTZXQgY29sb3JzIGZvciBlYWNoIE1hcmtldCBJbmRleA0KICBzY2FsZV94X2NvbnRpbnVvdXMoDQogICAgbGltaXRzID0gYyhzdGFydF95ZWFyLCBlbmRfeWVhciArIDEpLCANCiAgICBicmVha3MgPSBzZXEobGltaXRzX3N0YXJ0X3llYXIsIGxpbWl0c19lbmRfeWVhciwgMikgICMgUmVzdHJpY3QgJiBTZXQgTWFqb3IgeC1heGlzIGxpbmVzIGZvciBlYWNoIHllYXINCiAgKSArIA0KICANCiAgdGhlbWVfbWluaW1hbCgpICsNCiAgdGhlbWUoDQogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSwgc2l6ZSA9IDIwKSwgICAgICAgICAjIExhcmdlciB0aXRsZSBmb250DQogICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCksICAgICAgICAgICAgICAgICAgICAjIExhcmdlciB4LWF4aXMgbGFiZWwgZm9udA0KICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQpLCAgICAgICAgICAgICAgICAgICAgIyBMYXJnZXIgeS1heGlzIGxhYmVsIGZvbnQNCiAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEsIHNpemUgPSAxNCksICAjIExhcmdlciB4LWF4aXMgdGV4dA0KICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCksICAgICAgICAgICAgICAgICAgICAgIyBMYXJnZXIgeS1heGlzIHRleHQNCiAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0KSwgICAgICAgICAgICAgICAgICAgICMgTGVnZW5kIHRpdGxlIHNpemUNCiAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIpLCAgICAgICAgICAgICAgICAgICAgICMgTGVnZW5kIHRleHQgc2l6ZQ0KICAgIHBhbmVsLmdyaWQubWFqb3IgPSBlbGVtZW50X2xpbmUobGluZXR5cGUgPSAiZG90dGVkIiwgY29sb3IgPSAiYmxhY2siKSwgICMgTWFqb3IgZ3JpZCBsaW5lcw0KICAgIHBhbmVsLmdyaWQubWlub3IueCA9IGVsZW1lbnRfYmxhbmsoKSwgICAgICAgICAgICAgICAgICAgICAgIyBObyBtaW5vciB4IGdyaWQgbGluZXMNCiAgICBheGlzLnRpY2tzLmxlbmd0aCA9IHVuaXQoLTAuMjUsICJjbSIpLCAgICAgICAgICAgICAgICAgICAgICAjIEluY3JlYXNlIHRpY2sgbGVuZ3RoDQogICAgYXhpcy50aWNrcyA9IGVsZW1lbnRfbGluZShjb2xvciA9ICJibGFjayIsIHNpemUgPSAwLjUwKSwgICAjIERhcmtlciB0aWNrcw0KICAgIGF4aXMubGluZS54ID0gZWxlbWVudF9saW5lKGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDAuNzUpLCAgIyBEYXJrIGJvdHRvbSBib3JkZXINCiAgICBheGlzLmxpbmUueSA9IGVsZW1lbnRfbGluZShjb2xvciA9ICJibGFjayIsIHNpemUgPSAwLjc1KSAgICMgRGFyayBsZWZ0IGJvcmRlcg0KICApDQoNCiMgUHJpbnQgdGhlIHBsb3QgDQpwcmludChwMSkNCg0KDQpgYGANCg0KIyMjIDIwLVllYXIgQ0FHUiANCg0KIyMjIyBEYXRhDQoNCmBgYHtyIGluZGV4X2NvbXBhcmlzb25fMjB5ZWFyX2NhZ3IsIGV2YWw9VFJVRSwgZWNobz1GQUxTRX0NCg0KaW50ZXJhY3RpdmVfc3RyKHNweF9yYXdfY2FncikNCmludGVyYWN0aXZlX3N0cihxcXFfcmF3X2NhZ3IpDQoNCmludGVyYWN0aXZlX3ByaW50KHNweF9yYXdfY2FncikNCmludGVyYWN0aXZlX3ByaW50KHFxcV9yYXdfY2FncikNCg0KbWluX3llYXIgPC0gbWluKHNweF9yYXdfY2FnciREYXRlKQ0KbWF4X3llYXIgPC0gbWF4KHNweF9yYXdfY2FnciREYXRlKQ0KaW50ZXJhY3RpdmVfcHJpbnQobWluX3llYXIpDQppbnRlcmFjdGl2ZV9wcmludChtYXhfeWVhcikNCg0KbWluX3llYXIgPC0gbWluKHFxcV9yYXdfY2FnciREYXRlKQ0KbWF4X3llYXIgPC0gbWF4KHFxcV9yYXdfY2FnciREYXRlKQ0KaW50ZXJhY3RpdmVfcHJpbnQobWluX3llYXIpDQppbnRlcmFjdGl2ZV9wcmludChtYXhfeWVhcikNCg0KIyBGaWx0ZXIgZGF0YSBmb3IgdGhlIHJlcXVpcmVkIGRhdGUgcmFuZ2UgKDIwMjAgdG8gdGhlIHByZXNlbnQgeWVhcikNCnN0YXJ0X3llYXIgPC0gMjAyMA0KIyBlbmRfeWVhciA8LSAyMDI0DQplbmRfeWVhciA8LSBhcy5udW1lcmljKGZvcm1hdChTeXMuRGF0ZSgpLCAiJVkiKSkNCg0Kc3B4X2ZpbHRlcmVkIDwtIHN1YnNldChzcHhfcmF3X2NhZ3IsIERhdGUgPj0gc3RhcnRfeWVhciAmIERhdGUgPD0gZW5kX3llYXIsIHNlbGVjdCA9IGMoRGF0ZSwgYDIwLVllYXIgQ0FHUmApKQ0KcXFxX2ZpbHRlcmVkIDwtIHN1YnNldChxcXFfcmF3X2NhZ3IsIERhdGUgPj0gc3RhcnRfeWVhciAmIERhdGUgPD0gZW5kX3llYXIsIHNlbGVjdCA9IGMoRGF0ZSwgYDIwLVllYXIgQ0FHUmApKQ0KDQojIFJlbmFtZSBjb2x1bW5zIGZvciBjbGFyaXR5DQpjb2xuYW1lcyhzcHhfZmlsdGVyZWQpW2NvbG5hbWVzKHNweF9maWx0ZXJlZCkgPT0gIjIwLVllYXIgQ0FHUiJdIDwtICJTUFgiDQpjb2xuYW1lcyhxcXFfZmlsdGVyZWQpW2NvbG5hbWVzKHFxcV9maWx0ZXJlZCkgPT0gIjIwLVllYXIgQ0FHUiJdIDwtICJRUVEiDQoNCiMgTWVyZ2UgZGF0YXNldHMgYnkgRGF0ZSAoWWVhcikNCm1lcmdlZF9kYXRhIDwtIG1lcmdlKHNweF9maWx0ZXJlZCwgcXFxX2ZpbHRlcmVkLCBieSA9ICJEYXRlIikNCg0KIyBTb3J0IGJ5IERhdGUgaW4gZGVzY2VuZGluZyBvcmRlciAobW9zdCByZWNlbnQgeWVhciBmaXJzdCkNCm1lcmdlZF9kYXRhIDwtIG1lcmdlZF9kYXRhW29yZGVyKC1tZXJnZWRfZGF0YSREYXRlKSwgXQ0KDQojIEZvcm1hdCB0aGUgbWVyZ2VkIGRhdGENCm1lcmdlZF9kYXRhJERhdGUgPC0gYXMuY2hhcmFjdGVyKG1lcmdlZF9kYXRhJERhdGUpICAjIEVuc3VyZSBEYXRlIGlzIGEgY2hhcmFjdGVyIHdpdGhvdXQgY29tbWFzDQptZXJnZWRfZGF0YSRgU1BYYCA8LSBwYXN0ZTAoZm9ybWF0QyhtZXJnZWRfZGF0YSRgU1BYYCwgZm9ybWF0ID0gImYiLCBkaWdpdHMgPSAyKSwgIiUiKQ0KbWVyZ2VkX2RhdGEkUVFRIDwtIHBhc3RlMChmb3JtYXRDKG1lcmdlZF9kYXRhJFFRUSwgZm9ybWF0ID0gImYiLCBkaWdpdHMgPSAyKSwgIiUiKQ0KDQojIERpc3BsYXkgZm9ybWF0dGVkIHRhYmxlDQpjYXQoIlxuXG4jIyMjIDIwLVllYXIgUm9sbGluZyBDQUdScyBCeSBJbmRleCAoIiwgc3RhcnRfeWVhciwgIi0iLCBlbmRfeWVhciwgIilcbiIsIHNlcCA9ICIiKQ0KaW50ZXJhY3RpdmVfcHJpbnQobWVyZ2VkX2RhdGEpDQppbnRlcmFjdGl2ZV9zdHIobWVyZ2VkX2RhdGEpDQpmb3JtYXRfZXF1YWxfd2lkdGgobWVyZ2VkX2RhdGEpDQoNCg0KYGBgDQoNCiMjIyMgU3VtbWFyeQ0KDQpgYGB7ciBpbmRleF9jb21wYXJpc29uXzIweWVhcl9jYWdyX3N1bW1hcnksIGV2YWw9VFJVRSwgZWNobz1GQUxTRX0NCg0KIyBMb2FkIG5lY2Vzc2FyeSBsaWJyYXJ5DQpsaWJyYXJ5KGRwbHlyKQ0KDQojIFJlbW92ZSBwZXJjZW50YWdlIHNpZ25zIGFuZCBjb252ZXJ0IGNvbHVtbnMgdG8gbnVtZXJpYw0KbWVyZ2VkX2RhdGFfY2xlYW4gPC0gbWVyZ2VkX2RhdGENCm1lcmdlZF9kYXRhX2NsZWFuWzI6M10gPC0gbGFwcGx5KG1lcmdlZF9kYXRhWzI6M10sIGZ1bmN0aW9uKHgpIGFzLm51bWVyaWMoZ3N1YigiJSIsICIiLCB4KSkpDQoNCiMgRmluZCB0aGUgbWluaW11bSBhbmQgbWF4aW11bSB5ZWFyDQptaW5feWVhciA8LSBtaW4obWVyZ2VkX2RhdGEkRGF0ZSwgbmEucm0gPSBUUlVFKQ0KbWF4X3llYXIgPC0gbWF4KG1lcmdlZF9kYXRhJERhdGUsIG5hLnJtID0gVFJVRSkNCmludGVyYWN0aXZlX3ByaW50KG1pbl95ZWFyKQ0KaW50ZXJhY3RpdmVfcHJpbnQobWF4X3llYXIpDQoNCiMgRGVmaW5lIHRoZSBtZXRyaWNzIHRvIGNhbGN1bGF0ZSwgaW5jbHVkaW5nIENBR1INCm1ldHJpY3MgPC0gYygNCiAgIk1lYW4iLCANCiAgIk1lZGlhbiIsIA0KICAiU3RhbmRhcmQgRGV2aWF0aW9uIChWb2xhdGlsaXR5KSIsIA0KICAiTWluIENBR1IgUmFuZ2UgKENBR1IgLSBTRCkiLCANCiAgIk1heCBDQUdSIFJhbmdlIChDQUdSICsgU0QpIiwgDQogICJNaW4iLCANCiAgIk1heCIsIA0KICAiUGVyY2VudCBBYm92ZSBJbmZsYXRpb24gVGFyZ2V0IiwgDQogICJQZXJjZW50IEFib3ZlIENvbnNlcnZhdGl2ZSBUYXJnZXQiLCANCiAgIlBlcmNlbnQgQWJvdmUgTW9kZXJhdGUgVGFyZ2V0IiwgDQogICJQZXJjZW50IEFib3ZlIEFnZ3Jlc3NpdmUgVGFyZ2V0Ig0KKQ0KDQojIENhbGN1bGF0ZSBtZXRyaWNzIGR5bmFtaWNhbGx5IGZvciBhbGwgbnVtZXJpYyBjb2x1bW5zDQpjYWxjdWxhdGVkX21ldHJpY3MgPC0gc2FwcGx5KG1lcmdlZF9kYXRhX2NsZWFuWzI6M10sIGZ1bmN0aW9uKGNvbCkgew0KICBtZWFuX3ZhbCA8LSBtZWFuKGNvbCwgbmEucm0gPSBUUlVFKQ0KICBzZF92YWwgPC0gc2QoY29sLCBuYS5ybSA9IFRSVUUpDQogIHBlcmNlbnRfYWJvdmUgPC0gZnVuY3Rpb24odGFyZ2V0KSBtZWFuKGNvbCA+IHRhcmdldCwgbmEucm0gPSBUUlVFKSAqIDEwMA0KICANCiAgYygNCiAgICBNZWFuID0gbWVhbl92YWwsDQogICAgTWVkaWFuID0gbWVkaWFuKGNvbCwgbmEucm0gPSBUUlVFKSwNCiAgICBgU3RhbmRhcmQgRGV2aWF0aW9uIChWb2xhdGlsaXR5KWAgPSBzZF92YWwsDQogICAgYE1pbiBDQUdSIFJhbmdlIChDQUdSIC0gU0QpYCA9IG1lYW5fdmFsIC0gc2RfdmFsLA0KICAgIGBNYXggQ0FHUiBSYW5nZSAoQ0FHUiArIFNEKWAgPSBtZWFuX3ZhbCArIHNkX3ZhbCwNCiAgICBNaW4gPSBtaW4oY29sLCBuYS5ybSA9IFRSVUUpLA0KICAgIE1heCA9IG1heChjb2wsIG5hLnJtID0gVFJVRSksDQogICAgYFBlcmNlbnQgQWJvdmUgSW5mbGF0aW9uIFRhcmdldGAgPSBwZXJjZW50X2Fib3ZlKHRhcmdldF9pbmZsYXRpb24pLCAgIyBFeGFtcGxlIGluZmxhdGlvbiB0YXJnZXQ6IDIlDQogICAgYFBlcmNlbnQgQWJvdmUgQ29uc2VydmF0aXZlIFRhcmdldGAgPSBwZXJjZW50X2Fib3ZlKHRhcmdldF9jb25zZXJ2YXRpdmUpLA0KICAgIGBQZXJjZW50IEFib3ZlIE1vZGVyYXRlIFRhcmdldGAgPSBwZXJjZW50X2Fib3ZlKHRhcmdldF9tb2RlcmF0ZSksDQogICAgYFBlcmNlbnQgQWJvdmUgQWdncmVzc2l2ZSBUYXJnZXRgID0gcGVyY2VudF9hYm92ZSh0YXJnZXRfYWdncmVzc2l2ZSkNCiAgKQ0KfSkNCg0KIyBUcmFuc3Bvc2UgdGhlIHJlc3VsdCBhbmQgYWRkIHRoZSBNZXRyaWMgY29sdW1uDQpjdXN0b21fc3VtbWFyeSA8LSBkYXRhLmZyYW1lKA0KICBNZXRyaWMgPSBtZXRyaWNzLA0KICBjYWxjdWxhdGVkX21ldHJpY3MNCikNCg0KIyBSZW5hbWUgY29sdW1ucyB0byByZXRhaW4gdGhlIG9yaWdpbmFsIGNvbHVtbiBuYW1lcyBkeW5hbWljYWxseQ0KY29sbmFtZXMoY3VzdG9tX3N1bW1hcnkpWy0xXSA8LSBjb2xuYW1lcyhtZXJnZWRfZGF0YSlbMjozXQ0KDQojIEFkZCBwZXJjZW50YWdlIHNpZ25zIGJhY2sgdG8gYWxsIG51bWVyaWMgdmFsdWVzDQpjdXN0b21fc3VtbWFyeVstMV0gPC0gbGFwcGx5KGN1c3RvbV9zdW1tYXJ5Wy0xXSwgZnVuY3Rpb24oeCkgcGFzdGUwKGZvcm1hdEMoeCwgZm9ybWF0ID0gImYiLCBkaWdpdHMgPSAyKSwgIiUiKSkNCg0KIyBSZW1vdmUgcm93IG5hbWVzDQpyb3duYW1lcyhjdXN0b21fc3VtbWFyeSkgPC0gTlVMTA0KDQojIFByaW50IHRoZSBmaW5hbCBzdW1tYXJ5DQojIERpc3BsYXkgZm9ybWF0dGVkIHRhYmxlDQpjYXQoIlxuXG4jIyMjIDIwLVllYXIgR3Jvd3RoIFJhdGVzIFN1bW1hcnkgQnkgSW5kZXggKCIsIHN0YXJ0X3llYXIsICItIiwgZW5kX3llYXIsICIpXG4iLCBzZXAgPSAiIikNCg0KaW50ZXJhY3RpdmVfcHJpbnQoY3VzdG9tX3N1bW1hcnkpDQpmb3JtYXRfM2NvbF9jdXN0b21fd2lkdGhzKGN1c3RvbV9zdW1tYXJ5LCBjb2wxX3dpZHRoID0gIjIwZW0iLCBjb2wyX3dpZHRoID0gIjE1ZW0iLCBjb2wzX3dpZHRoID0gIjE1ZW0iKQ0KDQoNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQojIyBTQVZFIFZBTFVFUyBGT1IgSU4tTElORSBDT0RFDQoNCiMgRGVmaW5lIHRoZSBtYXBwaW5nIG9mIHJvdyBuYW1lcyB0byB2YXJpYWJsZSBuYW1lcw0Kcm93X3RvX3Zhcl9uYW1lIDwtIGMoDQogICJNZWFuIiA9ICJtZWFuX3ZhbHVlIiwNCiAgIk1lZGlhbiIgPSAibWVkaWFuX3ZhbHVlIiwNCiAgIlN0YW5kYXJkIERldmlhdGlvbiAoVm9sYXRpbGl0eSkiID0gInNkX3ZhbHVlIiwNCiAgIk1pbiBDQUdSIFJhbmdlIChDQUdSIC0gU0QpIiA9ICJtaW5fY2Fncl9yYW5nZSIsDQogICJNYXggQ0FHUiBSYW5nZSAoQ0FHUiArIFNEKSIgPSAibWF4X2NhZ3JfcmFuZ2UiLA0KICAiTWluIiA9ICJtaW5fdmFsdWUiLA0KICAiTWF4IiA9ICJtYXhfdmFsdWUiLA0KICAiUGVyY2VudCBBYm92ZSBJbmZsYXRpb24gVGFyZ2V0IiA9ICJwZXJjZW50X2Fib3ZlX3RhcmdldF9pbmZsYXRpb24iLA0KICAiUGVyY2VudCBBYm92ZSBDb25zZXJ2YXRpdmUgVGFyZ2V0IiA9ICJwZXJjZW50X2Fib3ZlX3RhcmdldF9jb25zZXJ2YXRpdmUiLA0KICAiUGVyY2VudCBBYm92ZSBNb2RlcmF0ZSBUYXJnZXQiID0gInBlcmNlbnRfYWJvdmVfdGFyZ2V0X21vZGVyYXRlIiwNCiAgIlBlcmNlbnQgQWJvdmUgQWdncmVzc2l2ZSBUYXJnZXQiID0gInBlcmNlbnRfYWJvdmVfdGFyZ2V0X2FnZ3Jlc3NpdmUiDQopDQoNCiMgRGVmaW5lIGEgY3VzdG9tIG1hcHBpbmcgZm9yIGNvbHVtbiBuYW1lcw0KY29sdW1uX25hbWVfbWFwcGluZyA8LSBjKA0KICAiU1BYIiA9ICJzcHgiLA0KICAiUVFRIiA9ICJxcXEiDQopDQoNCiMgRnVuY3Rpb24gdG8gc2F2ZSBzdW1tYXJ5IHZhbHVlcyBkeW5hbWljYWxseSB3aXRoIGNvbHVtbiBuYW1lIG1hcHBpbmcNCnNhdmVfY29sdW1uX3ZhbHVlcyA8LSBmdW5jdGlvbihzdW1tYXJ5X2RmLCByb3dfbWFwcGluZywgY29sdW1uX21hcHBpbmcpIHsNCiAgIyBHZXQgdGhlIGNvbHVtbiBuYW1lcyBpbiB0aGUgZGF0YSBmcmFtZQ0KICBjb2x1bW5zX3RvX3NhdmUgPC0gc2V0ZGlmZihuYW1lcyhzdW1tYXJ5X2RmKSwgYygiTWV0cmljIikpICAjIEV4Y2x1ZGUgdGhlIE1ldHJpYyBjb2x1bW4NCiAgDQogICMgSXRlcmF0ZSBvdmVyIGVhY2ggY29sdW1uDQogIGZvciAoY29sIGluIGNvbHVtbnNfdG9fc2F2ZSkgew0KICAgICMgVXNlIHRoZSBjdXN0b20gbWFwcGluZyB0byBnZXQgdGhlIGFwcHJvcHJpYXRlIGNvbHVtbiBuYW1lDQogICAgY29sX25hbWUgPC0gY29sdW1uX21hcHBpbmdbW2NvbF1dICV8fCUgdG9sb3dlcihnc3ViKCJbXmEtekEtWjAtOV0iLCAiXyIsIGNvbCkpDQogICAgDQogICAgIyBFeHRyYWN0IHZhbHVlcyBmb3IgdGhlIGN1cnJlbnQgY29sdW1uDQogICAgY29sX3ZhbHVlcyA8LSBzdW1tYXJ5X2RmW1tjb2xdXQ0KICAgIA0KICAgICMgSXRlcmF0ZSBvdmVyIHJvd3MgdG8gc2F2ZSBlYWNoIHZhbHVlIGR5bmFtaWNhbGx5DQogICAgZm9yIChpIGluIHNlcV9hbG9uZyhjb2xfdmFsdWVzKSkgew0KICAgICAgIyBHZXQgdGhlIGNvcnJlc3BvbmRpbmcgdmFyaWFibGUgbmFtZSBmcm9tIHRoZSBtYXBwaW5nDQogICAgICBzdGF0X25hbWUgPC0gcm93X21hcHBpbmdbc3VtbWFyeV9kZiRNZXRyaWNbaV1dDQogICAgICANCiAgICAgIGlmICghaXMubmEoc3RhdF9uYW1lKSkgeyAgIyBTa2lwIGlmIG5vIG1hcHBpbmcgaXMgZGVmaW5lZA0KICAgICAgICAjIENyZWF0ZSB0aGUgdmFyaWFibGUgbmFtZQ0KICAgICAgICB2YXJfbmFtZSA8LSBwYXN0ZTAoc3RhdF9uYW1lLCAiXyIsIGNvbF9uYW1lKQ0KICAgICAgICANCiAgICAgICAgIyBBdHRlbXB0IG51bWVyaWMgY29udmVyc2lvbiBmb3IgZG93bnN0cmVhbSB1c2UNCiAgICAgICAgdmFsdWUgPC0gc3VwcHJlc3NXYXJuaW5ncyhhcy5udW1lcmljKGdzdWIoIiUiLCAiIiwgY29sX3ZhbHVlc1tpXSkpKQ0KICAgICAgICANCiAgICAgICAgIyBBc3NpZ24gdGhlIHZhbHVlIHRvIHRoZSBnbG9iYWwgZW52aXJvbm1lbnQNCiAgICAgICAgYXNzaWduKHZhcl9uYW1lLCB2YWx1ZSwgZW52aXIgPSAuR2xvYmFsRW52KQ0KICAgICAgfQ0KICAgIH0NCiAgfQ0KfQ0KDQojIEFwcGx5IHRoZSBmdW5jdGlvbiB0byBzYXZlIHZhbHVlcyBkeW5hbWljYWxseQ0Kc2F2ZV9jb2x1bW5fdmFsdWVzKGN1c3RvbV9zdW1tYXJ5LCByb3dfdG9fdmFyX25hbWUsIGNvbHVtbl9uYW1lX21hcHBpbmcpDQoNCiMgRXhhbXBsZTogQWNjZXNzaW5nIGR5bmFtaWNhbGx5IGNyZWF0ZWQgdmFyaWFibGVzDQppbnRlcmFjdGl2ZV9wYXN0ZSgiU1BYIE1lYW46ICIsIG1lYW5fdmFsdWVfc3B4KSAgIyBTaG91bGQgcHJpbnQgdGhlIG1lYW4gdmFsdWUgZm9yIFNQWA0KaW50ZXJhY3RpdmVfcHJpbnQocGVyY2VudF9hYm92ZV90YXJnZXRfYWdncmVzc2l2ZV9xcXEpICAjIFNob3VsZCBwcmludCB0aGUgcGVyY2VudCBhYm92ZSBhZ2dyZXNzaXZlIHRhcmdldCBmb3IgUVFRDQoNCg0KYGBgDQoNCiMjIyMgR3JhcGggDQoNCmBgYHtyIGluZGV4X2NvbXBhcmlzb25fMjB5ZWFyX2NhZ3JfZ3JhcGgsIGZpZy53aWR0aD0xMCwgZmlnLmhlaWdodD03LCBldmFsPVRSVUUsIGVjaG89RkFMU0V9DQoNCmNhdCgiXG5cbiMjIyMgMjAtWWVhciBSb2xsaW5nIENBR1JzIEJ5IEluZGV4IFxuIikNCg0KIyBMb2FkIG5lY2Vzc2FyeSBsaWJyYXJpZXMNCmxpYnJhcnkoZ2dwbG90MikNCmxpYnJhcnkoZHBseXIpDQoNCiMgQ29udmVydCBjb2x1bW5zIHRvIG51bWVyaWMgZm9yIHBsb3R0aW5nIGlmIG5lZWRlZA0KbWVyZ2VkX2RhdGEgPC0gbWVyZ2VkX2RhdGEgJT4lDQogIG11dGF0ZSgNCiAgICBgRGF0ZWAgPSBhcy5udW1lcmljKGFzLmNoYXJhY3RlcihgRGF0ZWApKSwgICMgRW5zdXJlIERhdGUgaXMgbnVtZXJpYw0KICAgIGBTUFhgID0gYXMubnVtZXJpYyhnc3ViKCIlIiwgIiIsIGBTUFhgKSksDQogICAgYFFRUWAgPSBhcy5udW1lcmljKGdzdWIoIiUiLCAiIiwgYFFRUWApKQ0KICApDQoNCiMgUmVzaGFwZSB0aGUgZGF0YSBpbnRvIGxvbmcgZm9ybWF0IGZvciBlYXN5IHBsb3R0aW5nIG9mIG11bHRpcGxlIGxpbmVzIGFuZCBzZXQgdGhlIGZhY3RvciBvcmRlcg0KbnJ0X2xvbmcgPC0gbWVyZ2VkX2RhdGEgJT4lDQogIHBpdm90X2xvbmdlcihjb2xzID0gYyhgU1BYYCwgYFFRUWApLA0KICAgICAgICAgICAgICAgbmFtZXNfdG8gPSAiQUdSX0luZGV4IiwNCiAgICAgICAgICAgICAgIHZhbHVlc190byA9ICJBR1JfVmFsdWUiKSAlPiUNCiAgbXV0YXRlKEFHUl9JbmRleCA9IGZhY3RvcihBR1JfSW5kZXgsIGxldmVscyA9IGMoIlNQWCIsICJRUVEiKSkpDQoNCiMgQXNzaWduIGNvbG9ycyBkeW5hbWljYWxseSBiYXNlZCBvbiB0aGUgb3JkZXIgb2YgQUdSX0luZGV4IGluIHRoZSBkYXRhDQojIE1hdGNoIHRoZSB1bmlxdWUgbGV2ZWxzIG9mIEFHUl9JbmRleCB3aXRoIGNvbG9ycyBmcm9tIGNvbG9yc19nZW5lcmFsX2RhcmsNCnVuaXF1ZV90eXBlcyA8LSB1bmlxdWUobnJ0X2xvbmckQUdSX0luZGV4KQ0KY3VzdG9tX2NvbG9ycyA8LSBzZXROYW1lcyhjb2xvcnNfZ2VuZXJhbF9kYXJrWzE6bGVuZ3RoKHVuaXF1ZV90eXBlcyldLCB1bmlxdWVfdHlwZXMpDQoNCiMgRmluZCB0aGUgbWluaW11bSBhbmQgbWF4aW11bSB4LXZhbHVlIGluIHlvdXIgZGF0YQ0KbWF4X3ggPC0gbWF4KGFzLmludGVnZXIobWVyZ2VkX2RhdGEkRGF0ZSksIG5hLnJtID0gVFJVRSkNCm1pbl94IDwtIG1pbihhcy5pbnRlZ2VyKG1lcmdlZF9kYXRhJERhdGUpLCBuYS5ybSA9IFRSVUUpDQppbnRlcmFjdGl2ZV9wcmludChtYXhfeCkgICMgVGVzdA0KaW50ZXJhY3RpdmVfcHJpbnQobWluX3gpICAjIFRlc3QNCg0KIyBGaW5kIHRoZSBtaW5pbXVtIGFuZCBtYXhpbXVtIHllYXINCm1pbl95ZWFyIDwtIG1pbihtZXJnZWRfZGF0YSREYXRlLCBuYS5ybSA9IFRSVUUpDQptYXhfeWVhciA8LSBtYXgobWVyZ2VkX2RhdGEkRGF0ZSwgbmEucm0gPSBUUlVFKQ0KaW50ZXJhY3RpdmVfcHJpbnQobWluX3llYXIpDQppbnRlcmFjdGl2ZV9wcmludChtYXhfeWVhcikNCg0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiMjIFBMT1QgRlVMTCBXSVRIT1VUIExJTUlUUw0KDQojIERlZmluZSBzdGFydCBhbmQgZW5kIHllYXJzDQpzdGFydF95ZWFyIDwtIDIwMjANCmVuZF95ZWFyIDwtIDIwMjQNCnllYXJfcmFuZ2UgPC0gZW5kX3llYXIgLSBzdGFydF95ZWFyICsgMSAgIyBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiB5ZWFycw0KDQojIERlZmluZSBicmVha3Mgcm91bmRlZCBhcHByb3ByaWF0ZWx5DQpsaW1pdHNfc3RhcnRfeWVhciA8LSBmbG9vcihzdGFydF95ZWFyIC8gMikgKiAyICAjIFJvdW5kIGRvd24gdG8gdGhlIG5lYXJlc3QgbXVsdGlwbGUgb2YgNQ0KbGltaXRzX2VuZF95ZWFyIDwtIGNlaWxpbmcoZW5kX3llYXIgLyAyKSAqIDIgICAjIFJvdW5kIHVwIHRvIHRoZSBuZWFyZXN0IG11bHRpcGxlIG9mIDUNCg0KIyBDcmVhdGUgZHluYW1pYyB0aXRsZSBhbmQgY2FwdGlvbg0KZHluYW1pY190aXRsZSA8LSBwYXN0ZTAoIjIwLVllYXIgUm9sbGluZyBDQUdScyBCeSBJbmRleCBPdmVyICIsIHllYXJfcmFuZ2UsICIgWWVhcnMgKCIsIHN0YXJ0X3llYXIsICItIiwgZW5kX3llYXIsICIpIikNCmR5bmFtaWNfY2FwdGlvbiA8LSBwYXN0ZTAoIjIwLVllYXIgUm9sbGluZyBDb21wb3VuZCBBdmVyYWdlIEdyb3d0aCBSYXRlcyBCeSBJbmRleCwgRGF0YSBQZXJpb2QgKCIsIHN0YXJ0X3llYXIsICItIiwgZW5kX3llYXIsICIpIikNCg0KIyBDcmVhdGUgdGhlIGZ1bGwsIG5vbi1maWx0ZXJlZCB4LWF4aXMgcGxvdCB3aXRoIGR5bmFtaWMgeCBwbGFjZW1lbnQgZm9yIGFubm90YXRpb25zDQpwMSA8LSBnZ3Bsb3QobnJ0X2xvbmcsIGFlcyh4ID0gYXMuaW50ZWdlcihEYXRlKSwgeSA9IEFHUl9WYWx1ZSwgY29sb3IgPSBBR1JfSW5kZXgpKSArDQoNCiAgIyBBZGQgc2hhZGVkIGFyZWFzIGZvciBiYWNrZ3JvdW5kIGVmZmVjdA0KICBnZW9tX3JlY3QoYWVzKHhtaW4gPSAtSW5mLCB4bWF4ID0gSW5mLCB5bWluID0gdGFyZ2V0X2FnZ3Jlc3NpdmUsIHltYXggPSBJbmYpLCBmaWxsID0gImxpZ2h0Z3JlZW4iLCBhbHBoYSA9IDAuMDMwKSArDQogIGdlb21fcmVjdChhZXMoeG1pbiA9IC1JbmYsIHhtYXggPSBJbmYsIHltaW4gPSB0YXJnZXRfY29uc2VydmF0aXZlLCB5bWF4ID0gdGFyZ2V0X2FnZ3Jlc3NpdmUpLCBmaWxsID0gIm9yYW5nZSIsIGFscGhhID0gMC4wMzApICsNCiAgZ2VvbV9yZWN0KGFlcyh4bWluID0gLUluZiwgeG1heCA9IEluZiwgeW1pbiA9IC1JbmYsIHltYXggPSB0YXJnZXRfY29uc2VydmF0aXZlKSwgZmlsbCA9ICJsaWdodGNvcmFsIiwgYWxwaGEgPSAwLjAzMCkgKw0KICANCiAgIyBQbG90IGxpbmVzIGZvciBlYWNoIE1hcmtldCBJbmRleA0KICBnZW9tX2xpbmUoc2l6ZSA9IDEuMjUsIGFscGhhID0gMy4wKSArICAgICAgICMgTGluZSBmb3IgZWFjaCBDQUdSDQogIGdlb21fcG9pbnQoc2l6ZSA9IDIuMCwgYWxwaGEgPSAzLjApICsgICAgICAgIyBQb2ludHMgZm9yIGVhY2ggQ0FHUg0KICANCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gdGFyZ2V0X2FnZ3Jlc3NpdmUsIGNvbG9yID0gImRhcmtibHVlIiwgbGluZXR5cGUgPSAic29saWQiKSArDQogICMgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gdGFyZ2V0X21vZGVyYXRlLCBjb2xvciA9ICJkYXJrYmx1ZSIsIGxpbmV0eXBlID0gInNvbGlkIikgKw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSB0YXJnZXRfY29uc2VydmF0aXZlLCBjb2xvciA9ICJkYXJrYmx1ZSIsIGxpbmV0eXBlID0gInNvbGlkIikgKw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSB0YXJnZXRfaW5mbGF0aW9uLCBjb2xvciA9ICJkYXJrcmVkIiwgbGluZXR5cGUgPSAiZGFzaGVkIikgKw0KDQogICMgRHluYW1pYyByaWdodC1hbGlnbmVkIHBsYWNlbWVudCBmb3IgYW5ub3RhdGlvbnMNCiAgYW5ub3RhdGUoInRleHQiLCB4ID0gSW5mLCB5ID0gdGFyZ2V0X2FnZ3Jlc3NpdmUsIGxhYmVsID0gIkFnZ3Jlc3NpdmUiLCANCiAgICAgICAgICAgaGp1c3QgPSAxLCB2anVzdCA9IC0wLjUsIGNvbG9yID0gImRhcmtibHVlIiwgc2l6ZSA9IDQpICsNCiAgIyBhbm5vdGF0ZSgidGV4dCIsIHggPSBJbmYsIHkgPSB0YXJnZXRfbW9kZXJhdGUsIGxhYmVsID0gIk1vZGVyYXRlIiwgDQogICMgICAgICAgICBoanVzdCA9IDEsIHZqdXN0ID0gLTAuNSwgY29sb3IgPSAiZGFya2JsdWUiLCBzaXplID0gNCkgKw0KICBhbm5vdGF0ZSgidGV4dCIsIHggPSBJbmYsIHkgPSB0YXJnZXRfY29uc2VydmF0aXZlLCBsYWJlbCA9ICJDb25zZXJ2YXRpdmUiLCANCiAgICAgICAgICAgaGp1c3QgPSAxLCB2anVzdCA9IC0wLjUsIGNvbG9yID0gImRhcmtibHVlIiwgc2l6ZSA9IDQpICsNCiAgYW5ub3RhdGUoInRleHQiLCB4ID0gSW5mLCB5ID0gdGFyZ2V0X2luZmxhdGlvbiwgbGFiZWwgPSAiSW5mbGF0aW9uIiwgDQogICAgICAgICAgIGhqdXN0ID0gMSwgdmp1c3QgPSAtMC41LCBjb2xvciA9ICJkYXJrcmVkIiwgc2l6ZSA9IDQpICsNCg0KICBsYWJzKA0KICAgIHRpdGxlID0gZHluYW1pY190aXRsZSwNCiAgICB4ID0gIlllYXIiLA0KICAgIHkgPSAiQ0FHUiBWYWx1ZSAoJSkiLA0KICAgIGNvbG9yID0gIk1hcmtldCBJbmRleCIsDQogICAgY2FwdGlvbiA9IGR5bmFtaWNfY2FwdGlvbg0KICAgICkgKw0KICANCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGN1c3RvbV9jb2xvcnMpICsgICMgU2V0IGNvbG9ycyBmb3IgZWFjaCBNYXJrZXQgSW5kZXgNCiAgc2NhbGVfeF9jb250aW51b3VzKA0KICAgIGxpbWl0cyA9IGMoc3RhcnRfeWVhciwgZW5kX3llYXIgKyAxKSwgDQogICAgYnJlYWtzID0gc2VxKGxpbWl0c19zdGFydF95ZWFyLCBsaW1pdHNfZW5kX3llYXIsIDIpICAjIFJlc3RyaWN0ICYgU2V0IE1ham9yIHgtYXhpcyBsaW5lcyBmb3IgZWFjaCB5ZWFyDQogICkgKyANCiAgDQogIHRoZW1lX21pbmltYWwoKSArDQogIHRoZW1lKA0KICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUsIHNpemUgPSAyMCksICAgICAgICAgIyBMYXJnZXIgdGl0bGUgZm9udA0KICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQpLCAgICAgICAgICAgICAgICAgICAgIyBMYXJnZXIgeC1heGlzIGxhYmVsIGZvbnQNCiAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0KSwgICAgICAgICAgICAgICAgICAgICMgTGFyZ2VyIHktYXhpcyBsYWJlbCBmb250DQogICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxLCBzaXplID0gMTQpLCAgIyBMYXJnZXIgeC1heGlzIHRleHQNCiAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQpLCAgICAgICAgICAgICAgICAgICAgICMgTGFyZ2VyIHktYXhpcyB0ZXh0DQogICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCksICAgICAgICAgICAgICAgICAgICAjIExlZ2VuZCB0aXRsZSBzaXplDQogICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyKSwgICAgICAgICAgICAgICAgICAgICAjIExlZ2VuZCB0ZXh0IHNpemUNCiAgICBwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9saW5lKGxpbmV0eXBlID0gImRvdHRlZCIsIGNvbG9yID0gImJsYWNrIiksICAjIE1ham9yIGdyaWQgbGluZXMNCiAgICBwYW5lbC5ncmlkLm1pbm9yLnggPSBlbGVtZW50X2JsYW5rKCksICAgICAgICAgICAgICAgICAgICAgICMgTm8gbWlub3IgeCBncmlkIGxpbmVzDQogICAgYXhpcy50aWNrcy5sZW5ndGggPSB1bml0KC0wLjI1LCAiY20iKSwgICAgICAgICAgICAgICAgICAgICAgIyBJbmNyZWFzZSB0aWNrIGxlbmd0aA0KICAgIGF4aXMudGlja3MgPSBlbGVtZW50X2xpbmUoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMC41MCksICAgIyBEYXJrZXIgdGlja3MNCiAgICBheGlzLmxpbmUueCA9IGVsZW1lbnRfbGluZShjb2xvciA9ICJibGFjayIsIHNpemUgPSAwLjc1KSwgICMgRGFyayBib3R0b20gYm9yZGVyDQogICAgYXhpcy5saW5lLnkgPSBlbGVtZW50X2xpbmUoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMC43NSkgICAjIERhcmsgbGVmdCBib3JkZXINCiAgKQ0KDQojIFByaW50IHRoZSBwbG90IA0KcHJpbnQocDEpDQoNCg0KYGBgDQotLT4gDQoNCiMgVkFOR1VBUkQtU1BYLVFRUQ0KDQojIyBBbm51YWwgR1INCg0KIyMjIERhdGENCg0KYGBge3IgaW5kZXhfY29tcGFyaXNvbl92YW5ndWFyZF9zcHhfcXFxX2dyLCBldmFsPVRSVUUsIGVjaG89RkFMU0V9DQoNCiMgU2V0IGRhdGFzZXQgbGlzdCBhbmQgbmFtZXMuDQpkYXRhc2V0cyA9IGxpc3QodnRpX3Jhdywgdm9vX3Jhdywgdmd0X3Jhdywgc3B4X3JhdywgcXFxX3JhdykNCmluZGV4X25hbWVzID0gYygiVlRJIiwgIlZPTyIsICJWR1QiLCAiU1BYIiwgIlFRUSIpDQoNCnByb2Nlc3NfZ3Jvd3RoX3JhdGVzIDwtIGZ1bmN0aW9uKGRhdGFzZXRzLCBpbmRleF9uYW1lcywgc3RhcnRfb2Zmc2V0ID0gMSwgZW5kX3llYXIgPSBhcy5udW1lcmljKGZvcm1hdChTeXMuRGF0ZSgpLCAiJVkiKSkpIHsNCiAgIyBFbnN1cmUgZGF0YXNldHMgYW5kIGluZGV4X25hbWVzIGhhdmUgdGhlIHNhbWUgbGVuZ3RoDQogIGlmIChsZW5ndGgoZGF0YXNldHMpICE9IGxlbmd0aChpbmRleF9uYW1lcykpIHsNCiAgICBzdG9wKCJUaGUgbnVtYmVyIG9mIGRhdGFzZXRzIG11c3QgbWF0Y2ggdGhlIG51bWJlciBvZiBpbmRleCBuYW1lcy4iKQ0KICB9DQoNCiAgIyBEZXRlcm1pbmUgdGhlIG1hdGNoaW5nIGRhdGUgcmFuZ2UgYWNyb3NzIGFsbCBkYXRhc2V0cw0KICBtYXRjaGluZ19kYXRlcyA8LSBSZWR1Y2UoaW50ZXJzZWN0LCBsYXBwbHkoZGF0YXNldHMsIGZ1bmN0aW9uKGRmKSBkZiREYXRlKSkNCg0KICBpZiAobGVuZ3RoKG1hdGNoaW5nX2RhdGVzKSA+IDApIHsNCiAgICBvbGRlc3RfbWF0Y2hpbmdfZGF0ZSA8LSBtaW4obWF0Y2hpbmdfZGF0ZXMpDQogICAgaW50ZXJhY3RpdmVfY2F0KCJPbGRlc3QgbWF0Y2hpbmcgZGF0ZToiLCBvbGRlc3RfbWF0Y2hpbmdfZGF0ZSwgIlxuIikNCiAgfSBlbHNlIHsNCiAgICBpbnRlcmFjdGl2ZV9jYXQoIk5vIG1hdGNoaW5nIGRhdGVzIGZvdW5kIGFtb25nIHRoZSBkYXRhc2V0cy5cbiIpDQogICAgcmV0dXJuKE5VTEwpDQogIH0NCg0KICBzdGFydF95ZWFyIDw8LSBvbGRlc3RfbWF0Y2hpbmdfZGF0ZSArIHN0YXJ0X29mZnNldA0KDQogICMgRmlsdGVyIGRhdGFzZXRzIGZvciB0aGUgbWF0Y2hpbmcgZGF0ZSByYW5nZSBhbmQgcmVuYW1lIGNvbHVtbnMNCiAgZmlsdGVyZWRfZGF0YSA8LSBsYXBwbHkoc2VxX2Fsb25nKGRhdGFzZXRzKSwgZnVuY3Rpb24oaSkgew0KICAgIGZpbHRlcmVkIDwtIHN1YnNldChkYXRhc2V0c1tbaV1dLCBEYXRlID49IHN0YXJ0X3llYXIgJiBEYXRlIDw9IGVuZF95ZWFyLCBzZWxlY3QgPSBjKERhdGUsIGAxLVllYXIgQ0FHUmApKQ0KICAgIGNvbG5hbWVzKGZpbHRlcmVkKVtjb2xuYW1lcyhmaWx0ZXJlZCkgPT0gIjEtWWVhciBDQUdSIl0gPC0gaW5kZXhfbmFtZXNbaV0NCiAgICByZXR1cm4oZmlsdGVyZWQpDQogIH0pDQoNCiAgIyBNZXJnZSBhbGwgZmlsdGVyZWQgZGF0YXNldHMgYnkgRGF0ZQ0KICBtZXJnZWRfZGF0YSA8PC0gUmVkdWNlKGZ1bmN0aW9uKHgsIHkpIG1lcmdlKHgsIHksIGJ5ID0gIkRhdGUiKSwgZmlsdGVyZWRfZGF0YSkNCg0KICAjIFNvcnQgYnkgRGF0ZSBpbiBkZXNjZW5kaW5nIG9yZGVyIChtb3N0IHJlY2VudCB5ZWFyIGZpcnN0KQ0KICBtZXJnZWRfZGF0YSA8LSBtZXJnZWRfZGF0YVtvcmRlcigtbWVyZ2VkX2RhdGEkRGF0ZSksIF0NCg0KICAjIEZvcm1hdCB0aGUgbWVyZ2VkIGRhdGENCiAgbWVyZ2VkX2RhdGEkRGF0ZSA8LSBhcy5jaGFyYWN0ZXIobWVyZ2VkX2RhdGEkRGF0ZSkgICMgRW5zdXJlIERhdGUgaXMgYSBjaGFyYWN0ZXIgd2l0aG91dCBjb21tYXMNCiAgZm9yIChpbmRleCBpbiBpbmRleF9uYW1lcykgew0KICAgIG1lcmdlZF9kYXRhW1tpbmRleF1dIDwtIHBhc3RlMChmb3JtYXRDKG1lcmdlZF9kYXRhW1tpbmRleF1dLCBmb3JtYXQgPSAiZiIsIGRpZ2l0cyA9IDIpLCAiJSIpDQogIH0NCg0KICAjIERpc3BsYXkgZm9ybWF0dGVkIHRhYmxlDQogIGNhdCgiXG5cbiMjIyMgQW5udWFsIEdyb3d0aCBSYXRlcyBCeSBJbmRleCAoIiwgc3RhcnRfeWVhciwgIi0iLCBlbmRfeWVhciwgIilcbiIsIHNlcCA9ICIiKQ0KICBpbnRlcmFjdGl2ZV9wcmludChtZXJnZWRfZGF0YSkNCiAgaW50ZXJhY3RpdmVfc3RyKG1lcmdlZF9kYXRhKQ0KICBmb3JtYXRfZXF1YWxfd2lkdGgobWVyZ2VkX2RhdGEpDQp9DQogICAgDQojIFNldCBkYXRhc2V0IGxpc3QgYW5kIG5hbWVzLg0KcHJvY2Vzc19ncm93dGhfcmF0ZXMoZGF0YXNldHMsIGluZGV4X25hbWVzKQ0KDQpgYGANCg0KRGF0YSBiZWdpbnMgd2l0aCBgciBzdGFydF95ZWFyYCwgZGV0ZXJtaW5lZCBieSB0aGUgaW5kZXggd2l0aCB0aGUgbGVhc3QgaGlzdG9yaWNhbCBkYXRhIGZvciBjb25zaXN0ZW50IGNvbXBhcmlzb24gYWNyb3NzIGFsbCBpbmRleGVzLg0KDQojIyMgU3VtbWFyeQ0KDQpgYGB7ciBpbmRleF9jb21wYXJpc29uX3Zhbmd1YXJkX3NweF9xcXFfZ3Jfc3VtbWFyeSwgZXZhbD1UUlVFLCBlY2hvPUZBTFNFfQ0KDQoNCiMgTG9hZCBuZWNlc3NhcnkgbGlicmFyeQ0KbGlicmFyeShkcGx5cikNCg0KIyBSZW1vdmUgcGVyY2VudGFnZSBzaWducyBhbmQgY29udmVydCBjb2x1bW5zIHRvIG51bWVyaWMNCm1lcmdlZF9kYXRhX2NsZWFuIDwtIG1lcmdlZF9kYXRhDQptZXJnZWRfZGF0YV9jbGVhblsyOm5jb2wobWVyZ2VkX2RhdGEpXSA8LSBsYXBwbHkobWVyZ2VkX2RhdGFbMjpuY29sKG1lcmdlZF9kYXRhKV0sIGZ1bmN0aW9uKHgpIGFzLm51bWVyaWMoZ3N1YigiJSIsICIiLCB4KSkpDQoNCiMgRmluZCB0aGUgbWluaW11bSBhbmQgbWF4aW11bSB5ZWFyDQptaW5feWVhciA8LSBtaW4obWVyZ2VkX2RhdGEkRGF0ZSwgbmEucm0gPSBUUlVFKQ0KbWF4X3llYXIgPC0gbWF4KG1lcmdlZF9kYXRhJERhdGUsIG5hLnJtID0gVFJVRSkNCmludGVyYWN0aXZlX3ByaW50KG1pbl95ZWFyKQ0KaW50ZXJhY3RpdmVfcHJpbnQobWF4X3llYXIpDQoNCiMgRGVmaW5lIHRoZSBtZXRyaWNzIHRvIGNhbGN1bGF0ZSwgaW5jbHVkaW5nIENBR1INCm1ldHJpY3MgPC0gYygNCiAgIkNBR1IiLCANCiAgIk1lYW4iLCANCiAgIk1lZGlhbiIsIA0KICAiU3RhbmRhcmQgRGV2aWF0aW9uIChWb2xhdGlsaXR5KSIsIA0KICAiTWluIENBR1IgUmFuZ2UgKENBR1IgLSBTRCkiLCANCiAgIk1heCBDQUdSIFJhbmdlIChDQUdSICsgU0QpIiwgDQogICJNaW4iLCANCiAgIk1heCIsIA0KICAiUGVyY2VudCBBYm92ZSBJbmZsYXRpb24gVGFyZ2V0IiwgDQogICJQZXJjZW50IEFib3ZlIENvbnNlcnZhdGl2ZSBUYXJnZXQiLCANCiAgIlBlcmNlbnQgQWJvdmUgTW9kZXJhdGUgVGFyZ2V0IiwgDQogICJQZXJjZW50IEFib3ZlIEFnZ3Jlc3NpdmUgVGFyZ2V0Ig0KKQ0KDQojIERlZmluZSB0aGUgQ0FHUiBjYWxjdWxhdGlvbg0KY2FsY3VsYXRlX2NhZ3IgPC0gZnVuY3Rpb24oY29sKSB7DQogIHN0YXJ0X3ZhbCA8LSAxICAjIEZpcnN0IHllYXIgdmFsdWUNCiAgZW5kX3ZhbCA8LSBwcm9kKDEgKyBjb2wgLyAxMDAsIG5hLnJtID0gVFJVRSkgICMgUHJvZHVjdCBvZiBncm93dGggZmFjdG9ycw0KICB5ZWFycyA8LSBucm93KG1lcmdlZF9kYXRhX2NsZWFuKQ0KICAoKGVuZF92YWwgLyBzdGFydF92YWwpXigxIC8geWVhcnMpIC0gMSkgKiAxMDAgICMgQ0FHUiBmb3JtdWxhDQp9DQoNCiMgQ2FsY3VsYXRlIG1ldHJpY3MgZHluYW1pY2FsbHkgZm9yIGFsbCBudW1lcmljIGNvbHVtbnMNCmNhbGN1bGF0ZWRfbWV0cmljcyA8LSBzYXBwbHkobWVyZ2VkX2RhdGFfY2xlYW5bMjpuY29sKG1lcmdlZF9kYXRhKV0sIGZ1bmN0aW9uKGNvbCkgew0KICBtZWFuX3ZhbCA8LSBtZWFuKGNvbCwgbmEucm0gPSBUUlVFKQ0KICBzZF92YWwgPC0gc2QoY29sLCBuYS5ybSA9IFRSVUUpDQogIHBlcmNlbnRfYWJvdmUgPC0gZnVuY3Rpb24odGFyZ2V0KSBtZWFuKGNvbCA+IHRhcmdldCwgbmEucm0gPSBUUlVFKSAqIDEwMA0KICANCiAgYygNCiAgICBgQ0FHUmAgPSBjYWxjdWxhdGVfY2Fncihjb2wpLA0KICAgIE1lYW4gPSBtZWFuX3ZhbCwNCiAgICBNZWRpYW4gPSBtZWRpYW4oY29sLCBuYS5ybSA9IFRSVUUpLA0KICAgIGBTdGFuZGFyZCBEZXZpYXRpb24gKFZvbGF0aWxpdHkpYCA9IHNkX3ZhbCwNCiAgICBgTWluIENBR1IgUmFuZ2UgKENBR1IgLSBTRClgID0gbWVhbl92YWwgLSBzZF92YWwsDQogICAgYE1heCBDQUdSIFJhbmdlIChDQUdSICsgU0QpYCA9IG1lYW5fdmFsICsgc2RfdmFsLA0KICAgIE1pbiA9IG1pbihjb2wsIG5hLnJtID0gVFJVRSksDQogICAgTWF4ID0gbWF4KGNvbCwgbmEucm0gPSBUUlVFKSwNCiAgICBgUGVyY2VudCBBYm92ZSBJbmZsYXRpb24gVGFyZ2V0YCA9IHBlcmNlbnRfYWJvdmUodGFyZ2V0X2luZmxhdGlvbiksICAjIEV4YW1wbGUgaW5mbGF0aW9uIHRhcmdldDogMiUNCiAgICBgUGVyY2VudCBBYm92ZSBDb25zZXJ2YXRpdmUgVGFyZ2V0YCA9IHBlcmNlbnRfYWJvdmUodGFyZ2V0X2NvbnNlcnZhdGl2ZSksDQogICAgYFBlcmNlbnQgQWJvdmUgTW9kZXJhdGUgVGFyZ2V0YCA9IHBlcmNlbnRfYWJvdmUodGFyZ2V0X21vZGVyYXRlKSwNCiAgICBgUGVyY2VudCBBYm92ZSBBZ2dyZXNzaXZlIFRhcmdldGAgPSBwZXJjZW50X2Fib3ZlKHRhcmdldF9hZ2dyZXNzaXZlKQ0KICApDQp9KQ0KDQojIFRyYW5zcG9zZSB0aGUgcmVzdWx0IGFuZCBhZGQgdGhlIE1ldHJpYyBjb2x1bW4NCmN1c3RvbV9zdW1tYXJ5IDwtIGRhdGEuZnJhbWUoDQogIE1ldHJpYyA9IG1ldHJpY3MsDQogIGNhbGN1bGF0ZWRfbWV0cmljcw0KKQ0KDQojIFJlbmFtZSBjb2x1bW5zIHRvIHJldGFpbiB0aGUgb3JpZ2luYWwgY29sdW1uIG5hbWVzIGR5bmFtaWNhbGx5DQpjb2xuYW1lcyhjdXN0b21fc3VtbWFyeSlbLTFdIDwtIGNvbG5hbWVzKG1lcmdlZF9kYXRhKVsyOm5jb2wobWVyZ2VkX2RhdGEpXQ0KDQojIEFkZCBwZXJjZW50YWdlIHNpZ25zIGJhY2sgdG8gYWxsIG51bWVyaWMgdmFsdWVzDQpjdXN0b21fc3VtbWFyeVstMV0gPC0gbGFwcGx5KGN1c3RvbV9zdW1tYXJ5Wy0xXSwgZnVuY3Rpb24oeCkgcGFzdGUwKGZvcm1hdEMoeCwgZm9ybWF0ID0gImYiLCBkaWdpdHMgPSAyKSwgIiUiKSkNCg0KIyBSZW1vdmUgcm93IG5hbWVzDQpyb3duYW1lcyhjdXN0b21fc3VtbWFyeSkgPC0gTlVMTA0KDQojIFByaW50IHRoZSBmaW5hbCBzdW1tYXJ5DQojIERpc3BsYXkgZm9ybWF0dGVkIHRhYmxlDQpjYXQoIlxuXG4jIyMjIEFubnVhbCBHcm93dGggUmF0ZXMgU3VtbWFyeSBCeSBJbmRleCAoIiwgc3RhcnRfeWVhciwgIi0iLCBlbmRfeWVhciwgIilcbiIsIHNlcCA9ICIiKQ0KaW50ZXJhY3RpdmVfcHJpbnQoY3VzdG9tX3N1bW1hcnkpDQpmb3JtYXRfZXF1YWxfd2lkdGgoY3VzdG9tX3N1bW1hcnkpDQojIGZvcm1hdF80Y29sX2N1c3RvbV93aWR0aHMoY3VzdG9tX3N1bW1hcnksIGNvbDFfd2lkdGggPSAiMjBlbSIsIGNvbDJfd2lkdGggPSAiMTVlbSIsIGNvbDNfd2lkdGggPSAiMTVlbSIsIGNvbDRfd2lkdGggPSAiMTVlbSIpDQoNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQojIyBTQVZFIFZBTFVFUyBGT1IgSU4tTElORSBDT0RFDQoNCg0KIyBEZWZpbmUgdGhlIG1hcHBpbmcgb2Ygcm93IG5hbWVzIHRvIHZhcmlhYmxlIG5hbWVzDQpyb3dfdG9fdmFyX25hbWUgPC0gYygNCiAgIkNBR1IiID0gImNhZ3JfdmFsdWUiLA0KICAiTWVhbiIgPSAibWVhbl92YWx1ZSIsDQogICJNZWRpYW4iID0gIm1lZGlhbl92YWx1ZSIsDQogICJTdGFuZGFyZCBEZXZpYXRpb24gKFZvbGF0aWxpdHkpIiA9ICJzZF92YWx1ZSIsDQogICJNaW4gQ0FHUiBSYW5nZSAoQ0FHUiAtIFNEKSIgPSAibWluX2NhZ3JfcmFuZ2UiLA0KICAiTWF4IENBR1IgUmFuZ2UgKENBR1IgKyBTRCkiID0gIm1heF9jYWdyX3JhbmdlIiwNCiAgIk1pbiIgPSAibWluX3ZhbHVlIiwNCiAgIk1heCIgPSAibWF4X3ZhbHVlIiwNCiAgIlBlcmNlbnQgQWJvdmUgSW5mbGF0aW9uIFRhcmdldCIgPSAicGVyY2VudF9hYm92ZV90YXJnZXRfaW5mbGF0aW9uIiwNCiAgIlBlcmNlbnQgQWJvdmUgQ29uc2VydmF0aXZlIFRhcmdldCIgPSAicGVyY2VudF9hYm92ZV90YXJnZXRfY29uc2VydmF0aXZlIiwNCiAgIlBlcmNlbnQgQWJvdmUgTW9kZXJhdGUgVGFyZ2V0IiA9ICJwZXJjZW50X2Fib3ZlX3RhcmdldF9tb2RlcmF0ZSIsDQogICJQZXJjZW50IEFib3ZlIEFnZ3Jlc3NpdmUgVGFyZ2V0IiA9ICJwZXJjZW50X2Fib3ZlX3RhcmdldF9hZ2dyZXNzaXZlIg0KKQ0KDQoNCiMgRGVmaW5lIGEgY3VzdG9tIG1hcHBpbmcgZm9yIGNvbHVtbiBuYW1lcw0KZGF0YV9jb2x1bW5zIDwtIGNvbG5hbWVzKG1lcmdlZF9kYXRhKVsyOm5jb2wobWVyZ2VkX2RhdGEpXQ0KY29sdW1uX25hbWVfbWFwcGluZyA8LSBzZXROYW1lcyh0b2xvd2VyKGdzdWIoIlteYS16QS1aMC05XSIsICJfIiwgZGF0YV9jb2x1bW5zKSksIGRhdGFfY29sdW1ucykNCg0KIyBGdW5jdGlvbiB0byBzYXZlIHN1bW1hcnkgdmFsdWVzIGR5bmFtaWNhbGx5IHdpdGggY29sdW1uIG5hbWUgbWFwcGluZw0Kc2F2ZV9jb2x1bW5fdmFsdWVzIDwtIGZ1bmN0aW9uKHN1bW1hcnlfZGYsIHJvd19tYXBwaW5nLCBjb2x1bW5fbWFwcGluZykgew0KICAjIEdldCB0aGUgY29sdW1uIG5hbWVzIGluIHRoZSBkYXRhIGZyYW1lDQogIGNvbHVtbnNfdG9fc2F2ZSA8LSBzZXRkaWZmKG5hbWVzKHN1bW1hcnlfZGYpLCBjKCJNZXRyaWMiKSkgICMgRXhjbHVkZSB0aGUgTWV0cmljIGNvbHVtbg0KICANCiAgIyBJdGVyYXRlIG92ZXIgZWFjaCBjb2x1bW4NCiAgZm9yIChjb2wgaW4gY29sdW1uc190b19zYXZlKSB7DQogICAgIyBVc2UgdGhlIGN1c3RvbSBtYXBwaW5nIHRvIGdldCB0aGUgYXBwcm9wcmlhdGUgY29sdW1uIG5hbWUNCiAgICBjb2xfbmFtZSA8LSBjb2x1bW5fbWFwcGluZ1tbY29sXV0NCiAgICANCiAgICAjIEV4dHJhY3QgdmFsdWVzIGZvciB0aGUgY3VycmVudCBjb2x1bW4NCiAgICBjb2xfdmFsdWVzIDwtIHN1bW1hcnlfZGZbW2NvbF1dDQogICAgDQogICAgIyBJdGVyYXRlIG92ZXIgcm93cyB0byBzYXZlIGVhY2ggdmFsdWUgZHluYW1pY2FsbHkNCiAgICBmb3IgKGkgaW4gc2VxX2Fsb25nKGNvbF92YWx1ZXMpKSB7DQogICAgICAjIEdldCB0aGUgY29ycmVzcG9uZGluZyB2YXJpYWJsZSBuYW1lIGZyb20gdGhlIG1hcHBpbmcNCiAgICAgIHN0YXRfbmFtZSA8LSByb3dfbWFwcGluZ1tzdW1tYXJ5X2RmJE1ldHJpY1tpXV0NCiAgICAgIA0KICAgICAgaWYgKCFpcy5uYShzdGF0X25hbWUpKSB7ICAjIFNraXAgaWYgbm8gbWFwcGluZyBpcyBkZWZpbmVkDQogICAgICAgICMgQ3JlYXRlIHRoZSB2YXJpYWJsZSBuYW1lDQogICAgICAgIHZhcl9uYW1lIDwtIHBhc3RlMChzdGF0X25hbWUsICJfIiwgY29sX25hbWUpDQogICAgICAgIA0KICAgICAgICAjIEF0dGVtcHQgbnVtZXJpYyBjb252ZXJzaW9uIGZvciBkb3duc3RyZWFtIHVzZQ0KICAgICAgICB2YWx1ZSA8LSBzdXBwcmVzc1dhcm5pbmdzKGFzLm51bWVyaWMoZ3N1YigiJSIsICIiLCBjb2xfdmFsdWVzW2ldKSkpDQogICAgICAgIA0KICAgICAgICAjIEFzc2lnbiB0aGUgdmFsdWUgdG8gdGhlIGdsb2JhbCBlbnZpcm9ubWVudA0KICAgICAgICBhc3NpZ24odmFyX25hbWUsIHZhbHVlLCBlbnZpciA9IC5HbG9iYWxFbnYpDQogICAgICB9DQogICAgfQ0KICB9DQp9DQoNCiMgQXBwbHkgdGhlIGZ1bmN0aW9uIHRvIHNhdmUgdmFsdWVzIGR5bmFtaWNhbGx5DQpzYXZlX2NvbHVtbl92YWx1ZXMoY3VzdG9tX3N1bW1hcnksIHJvd190b192YXJfbmFtZSwgY29sdW1uX25hbWVfbWFwcGluZykNCg0KIyBFeGFtcGxlOiBBY2Nlc3NpbmcgZHluYW1pY2FsbHkgY3JlYXRlZCB2YXJpYWJsZXMNCmludGVyYWN0aXZlX3ByaW50KG1lYW5fdmFsdWVfcXFxKSAgIyBBZGp1c3RlZCB0byBwcmludCBiYXNlZCBvbiBkeW5hbWljYWxseSBjcmVhdGVkIHZhcmlhYmxlcw0KaW50ZXJhY3RpdmVfcHJpbnQoc2RfdmFsdWVfdnRpKSAgIyBFeGFtcGxlOiBzdGFuZGFyZCBkZXZpYXRpb24gZm9yIFZUSQ0KaW50ZXJhY3RpdmVfcHJpbnQocGVyY2VudF9hYm92ZV90YXJnZXRfYWdncmVzc2l2ZV92Z3QpICAjIEV4YW1wbGU6IHBlcmNlbnQgYWJvdmUgYWdncmVzc2l2ZSB0YXJnZXQgZm9yIFZHVA0KaW50ZXJhY3RpdmVfcHJpbnQoZW5kX3llYXIgLSBzdGFydF95ZWFyKQ0KDQoNCg0KYGBgDQoqKlVQREFURSBFWFBMQU5BVElPTioqDQoNCioqQ29tcGFyaXNvbiBpbiBBbm51YWwgR3Jvd3RoIFJhdGVzIE92ZXIgYHIgZW5kX3llYXIgLSBzdGFydF95ZWFyICsgMWAgWWVhcnMgKGByIHN0YXJ0X3llYXJgLWByIGVuZF95ZWFyYCkqKjogVGhlIHN1bW1hcnkgcmVmbGVjdHMgZGF0YSBvdmVyIGEgYHIgaWYoKGVuZF95ZWFyIC0gc3RhcnRfeWVhcikgPCA1KSAiU2hvcnQtVGVybSBQZXJpb2QgKHVuZGVyIDUgeWVhcnMpIiBlbHNlIGlmKChlbmRfeWVhciAtIHN0YXJ0X3llYXIpID49IDUgJiYgIChlbmRfeWVhciAtIHN0YXJ0X3llYXIpIDw9IDEwKSAiSW50ZXJtZWRpYXRlLVRlcm0gUGVyaW9kICg1LTEwIHllYXJzKSIgZWxzZSAiTG9uZy1UZXJtIFBlcmlvZCAob3ZlciAxMCB5ZWFycykiYC4gVGhlIHBlcmZvcm1hbmNlIGFuZCByZWxhdGl2ZSBzdHJlbmd0aCBiZXR3ZWVuIGluZGV4ZXMgc2hpZnRzIHdoZW4gbWVhc3VyZWQgYWNyb3NzIGRpZmZlcmVudCB0aW1lIGZyYW1lcywgcGFydGljdWxhcmx5IGluIHJlc3BvbnNlIHRvIG1ham9yIGNvbXBhbnkgZXZlbnRzLCBhbmQgcGFydGljdWxhcmx5IGZvciBTaG9ydC1UZXJtIGFuZCBMb25nLVRlcm0gUGVyaW9kcy4gV2hpbGUgYSBzaG9ydC0gb3IgaW50ZXJtZWRpYXRlLXRlcm0gYW5hbHlzaXMgY2FuIHByb3ZpZGUgaW5zaWdodHMsIGl0IG1heSBub3QgZnVsbHkgcmVwcmVzZW50IHBlcmZvcm1hbmNlIG92ZXIgZXh0ZW5kZWQsIGxvbmctdGVybSBwZXJpb2RzLg0KDQo8IS0tDQoqKkNvbXBhcmF0aXZlIEFuYWx5c2lzIG9mIEluZGV4IFBlcmZvcm1hbmNlOioqIFFRUSBleGhpYml0cyB0aGUgaGlnaGVzdCBtZWFuIHJldHVybiBhdCBgciBtZWFuX3ZhbHVlX3FxcWAlLCBzdXJwYXNzaW5nIFNQWCdzIGByIG1lYW5fdmFsdWVfc3B4YCUgYW5kIEJsYWNrUm9jaydzIGByIG1lYW5fdmFsdWVfYmxhY2tyb2NrYCUsIHJlZmxlY3RpbmcgaXRzIGFnZ3Jlc3NpdmUsIHRlY2gtZm9jdXNlZCBjb21wb3NpdGlvbi4gSXRzIENBR1Igb2YgYHIgY2Fncl92YWx1ZV9xcXFgJSBzaWduaWZpY2FudGx5IG91dHBhY2VzIFNQWCdzIGByIGNhZ3JfdmFsdWVfc3B4YCUgYW5kIEJsYWNrUm9jaydzIGByIGNhZ3JfdmFsdWVfYmxhY2tyb2NrYCUsIGZ1cnRoZXIgZW1waGFzaXppbmcgUVFRJ3Mgc3Ryb25nIGdyb3d0aCBwb3RlbnRpYWwuIFdoaWxlIGJvdGggU1BYIGFuZCBRUVEgaGF2ZSBjb25zaXN0ZW50bHkgc3VycGFzc2VkIGluZmxhdGlvbiwgY29uc2VydmF0aXZlLCBhbmQgbW9kZXJhdGUgdGFyZ2V0cyBgciBwZXJjZW50X2Fib3ZlX3RhcmdldF9tb2RlcmF0ZV9xcXFgJSBvZiB0aGUgdGltZSwgQmxhY2tSb2NrIGxhZ3Mgc2lnbmlmaWNhbnRseSwgbWVldGluZyB0aGVzZSB0aHJlc2hvbGRzIG9ubHkgYHIgcGVyY2VudF9hYm92ZV90YXJnZXRfY29uc2VydmF0aXZlX2JsYWNrcm9ja2AlIGFuZCBgciBwZXJjZW50X2Fib3ZlX3RhcmdldF9tb2RlcmF0ZV9xcXFgJSBvZiB0aGUgdGltZSwgcmVzcGVjdGl2ZWx5LiBBZGRpdGlvbmFsbHksIEJsYWNrUm9jaydzIHBlcmZvcm1hbmNlIGluIGV4Y2VlZGluZyB0aGUgYWdncmVzc2l2ZSBiZW5jaG1hcmsgc3RhbmRzIGF0IGp1c3QgYHIgcGVyY2VudF9hYm92ZV90YXJnZXRfYWdncmVzc2l2ZV9ibGFja3JvY2tgJSwgY29tcGFyZWQgdG8gYHIgcGVyY2VudF9hYm92ZV90YXJnZXRfYWdncmVzc2l2ZV9xcXFgJSBmb3IgYm90aCBTUFggYW5kIFFRUS4NCg0KSG93ZXZlciwgUVFRIGFsc28gZGVtb25zdHJhdGVzIHRoZSBoaWdoZXN0IHZvbGF0aWxpdHksIHdpdGggYSBzdGFuZGFyZCBkZXZpYXRpb24gb2YgYHIgc2RfdmFsdWVfcXFxYCUlLCBjb21wYXJlZCB0byBgciBzZF92YWx1ZV9zcHhgJSBmb3IgU1BYIGFuZCBgciBzZF92YWx1ZV9ibGFja3JvY2tgJSBmb3IgQmxhY2tSb2NrLCB1bmRlcnNjb3JpbmcgaXRzIGdyZWF0ZXIgcmlzay4gVGhlIHJhbmdlIG9mIGV4cGVjdGVkIHJldHVybnMgKENBR1IgwrEgU0QpIGlzIHdpZGVzdCBmb3IgUVFRIChgciBtaW5fY2Fncl9yYW5nZV9xcXFgJSB0byBgciBtYXhfY2Fncl9yYW5nZV9xcXFgJSkgYW5kIG5hcnJvd2VzdCBmb3IgQmxhY2tSb2NrIChgciBtaW5fY2Fncl9yYW5nZV9ibGFja3JvY2tgJSB0byBgciBtYXhfY2Fncl9yYW5nZV9ibGFja3JvY2tgJSksIGVtcGhhc2l6aW5nIEJsYWNrUm9jaydzIHN0YWJpbGl0eSBidXQgc2lnbmlmaWNhbnRseSBsb3dlciBncm93dGggcG90ZW50aWFsLiBNZWRpYW4gcmV0dXJucyBmdXJ0aGVyIGhpZ2hsaWdodCBRUVEncyBkb21pbmFuY2UgKGByIG1lZGlhbl92YWx1ZV9xcXFgJSkgb3ZlciBTUFggKGByIG1lZGlhbl92YWx1ZV9zcHhgJSkgYW5kIEJsYWNrUm9jayAoYHIgbWVkaWFuX3ZhbHVlX2JsYWNrcm9ja2AlKS4gQmxhY2tSb2NrLCB0aG91Z2ggbGVzcyB2b2xhdGlsZSwgbGFncyBpbiBwZXJmb3JtYW5jZSB3aXRoIHRoZSBsb3dlc3QgbWF4aW11bSByZXR1cm4uIEJvdGggU1BYIGFuZCBRUVEgaGF2ZSBuZWFyLSBvciBhdC1lcXVhbCBwZXJjZW50YWdlIG9mIHllYXJzIGFib3ZlIGVhY2ggdGFyZ2V0LCAoYHIgbWF4X3ZhbHVlX2JsYWNrcm9ja2AlKSBhbmQgdGhlIGhpZ2hlc3QgcGVyY2VudGFnZSBvZiB5ZWFycyBiZWxvdyBpbmZsYXRpb24gYW5kIGNvbnNlcnZhdGl2ZSB0YXJnZXRzLiBUaGlzIGNvbXBhcmlzb24gdW5kZXJzY29yZXMgUVFRJ3MgYXBwZWFsIGZvciBncm93dGgtb3JpZW50ZWQgaW52ZXN0b3JzIHNlZWtpbmcgaGlnaGVyIHJldHVybnMgZGVzcGl0ZSBpbmNyZWFzZWQgcmlzay4NCi0tPg0KDQoqKkxvbmctVGVybSBJbnZlc3RtZW50IFZpYWJpbGl0eToqKiBGb3IgYW55IG9mIHRoZXNlIEluZGV4ZXMgdG8gYmUgY29uc2lkZXJlZCBhIGhpZ2gtcGVyZm9ybWluZyBhbmQgcmVzaWxpZW50IGxvbmctdGVybSBpbnZlc3RtZW50LCBpdCB3b3VsZCBiZSBpZGVhbCB0byBleGNlZWQgdGhlIGFnZ3Jlc3NpdmUgdGFyZ2V0IChlLmcuLCBgciAodGFyZ2V0X2FnZ3Jlc3NpdmUgLSB0YXJnZXRfaW5mbGF0aW9uKWAlIGFubnVhbGl6ZWQgcmV0dXJucywgYWNjb3VudGluZyBmb3IgaGlnaGVyIGluZmxhdGlvbi1hZGp1c3RlZCBwZXJmb3JtYW5jZSBleHBlY3RhdGlvbnMpIGluIGF0IGxlYXN0IDQwJS01MCUgb2YgdGhlIHllYXJzLiBUaGlzIHJhbmdlIHJlZmxlY3RzIHRoZSBwb3RlbnRpYWwgZm9yIHN0cm9uZyB1cHNpZGUgaW4gbWFueSB5ZWFycyB3aGlsZSBiYWxhbmNpbmcgdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBtYXJrZXRzIGRvIGV4cGVyaWVuY2UgZG93bnR1cm5zLiANCg0KDQotIFZUSTogYHIgcGVyY2VudF9hYm92ZV90YXJnZXRfYWdncmVzc2l2ZV92dGlgJSBvZiB0aGUgeWVhcnMgZXhjZWVkZWQgdGhlIGFnZ3Jlc3NpdmUgdGFyZ2V0IGByIGlmKHBlcmNlbnRfYWJvdmVfdGFyZ2V0X2FnZ3Jlc3NpdmVfdnRpID4gNTApICJpbmRpY2F0aW5nIGNvbnNpc3RlbnQgYW5kIHJvYnVzdCBncm93dGgsIG1ha2luZyBpdCBhIHN0cm9uZyBvcHRpb24gZm9yIHRob3NlIHNlZWtpbmcgYWdncmVzc2l2ZSBpbnZlc3RtZW50cy4iIGVsc2UgaWYocGVyY2VudF9hYm92ZV90YXJnZXRfYWdncmVzc2l2ZV92dGkgPiA0MCkgInN1Z2dlc3RpbmcgdGhhdCB3aGlsZSBub3QgY29uc2lzdGVudCwgaXQgaGFzIGhpc3RvcmljYWxseSBwcm92aWRlZCByb2J1c3QgZ3Jvd3RoIG92ZXIgdGhlIGxvbmcgdGVybSwgbWFraW5nIGl0IGEgdmlhYmxlIGludmVzdG1lbnQgZm9yIHRob3NlIHdpdGggYSBoaWdoZXIgcmlzayB0b2xlcmFuY2UuIiBlbHNlICJyYWlzaW5nIGNvbmNlcm5zIGFib3V0IGl0cyBhYmlsaXR5IHRvIG1lZXQgYWdncmVzc2l2ZSBncm93dGggdGFyZ2V0cywgbWFraW5nIGl0IGxlc3Mgc3VpdGFibGUgZm9yIGludmVzdG9ycyB3aXRoIGhpZ2hlciByaXNrIHRvbGVyYW5jZS4iYA0KDQotIFZPTzogYHIgcGVyY2VudF9hYm92ZV90YXJnZXRfYWdncmVzc2l2ZV92b29gJSBvZiB0aGUgeWVhcnMgZXhjZWVkZWQgdGhlIGFnZ3Jlc3NpdmUgdGFyZ2V0IGByIGlmKHBlcmNlbnRfYWJvdmVfdGFyZ2V0X2FnZ3Jlc3NpdmVfdm9vID4gNTApICJpbmRpY2F0aW5nIGNvbnNpc3RlbnQgYW5kIHJvYnVzdCBncm93dGgsIG1ha2luZyBpdCBhIHN0cm9uZyBvcHRpb24gZm9yIHRob3NlIHNlZWtpbmcgYWdncmVzc2l2ZSBpbnZlc3RtZW50cy4iIGVsc2UgaWYocGVyY2VudF9hYm92ZV90YXJnZXRfYWdncmVzc2l2ZV92b28gPiA0MCkgInN1Z2dlc3RpbmcgdGhhdCB3aGlsZSBub3QgY29uc2lzdGVudCwgaXQgaGFzIGhpc3RvcmljYWxseSBwcm92aWRlZCByb2J1c3QgZ3Jvd3RoIG92ZXIgdGhlIGxvbmcgdGVybSwgbWFraW5nIGl0IGEgdmlhYmxlIGludmVzdG1lbnQgZm9yIHRob3NlIHdpdGggYSBoaWdoZXIgcmlzayB0b2xlcmFuY2UuIiBlbHNlICJyYWlzaW5nIGNvbmNlcm5zIGFib3V0IGl0cyBhYmlsaXR5IHRvIG1lZXQgYWdncmVzc2l2ZSBncm93dGggdGFyZ2V0cywgbWFraW5nIGl0IGxlc3Mgc3VpdGFibGUgZm9yIGludmVzdG9ycyB3aXRoIGhpZ2hlciByaXNrIHRvbGVyYW5jZS4iYA0KDQotIFZHVDogYHIgcGVyY2VudF9hYm92ZV90YXJnZXRfYWdncmVzc2l2ZV92Z3RgJSBvZiB0aGUgeWVhcnMgZXhjZWVkZWQgdGhlIGFnZ3Jlc3NpdmUgdGFyZ2V0IGByIGlmKHBlcmNlbnRfYWJvdmVfdGFyZ2V0X2FnZ3Jlc3NpdmVfdmd0ID4gNTApICJpbmRpY2F0aW5nIGNvbnNpc3RlbnQgYW5kIHJvYnVzdCBncm93dGgsIG1ha2luZyBpdCBhIHN0cm9uZyBvcHRpb24gZm9yIHRob3NlIHNlZWtpbmcgYWdncmVzc2l2ZSBpbnZlc3RtZW50cy4iIGVsc2UgaWYocGVyY2VudF9hYm92ZV90YXJnZXRfYWdncmVzc2l2ZV92Z3QgPiA0MCkgInN1Z2dlc3RpbmcgdGhhdCB3aGlsZSBub3QgY29uc2lzdGVudCwgaXQgaGFzIGhpc3RvcmljYWxseSBwcm92aWRlZCByb2J1c3QgZ3Jvd3RoIG92ZXIgdGhlIGxvbmcgdGVybSwgbWFraW5nIGl0IGEgdmlhYmxlIGludmVzdG1lbnQgZm9yIHRob3NlIHdpdGggYSBoaWdoZXIgcmlzayB0b2xlcmFuY2UuIiBlbHNlICJyYWlzaW5nIGNvbmNlcm5zIGFib3V0IGl0cyBhYmlsaXR5IHRvIG1lZXQgYWdncmVzc2l2ZSBncm93dGggdGFyZ2V0cywgbWFraW5nIGl0IGxlc3Mgc3VpdGFibGUgZm9yIGludmVzdG9ycyB3aXRoIGhpZ2hlciByaXNrIHRvbGVyYW5jZS4iYA0KDQotIFNQWDogYHIgcGVyY2VudF9hYm92ZV90YXJnZXRfYWdncmVzc2l2ZV9zcHhgJSBvZiB0aGUgeWVhcnMgZXhjZWVkZWQgdGhlIGFnZ3Jlc3NpdmUgdGFyZ2V0IGByIGlmKHBlcmNlbnRfYWJvdmVfdGFyZ2V0X2FnZ3Jlc3NpdmVfc3B4ID4gNTApICJpbmRpY2F0aW5nIGNvbnNpc3RlbnQgYW5kIHJvYnVzdCBncm93dGgsIG1ha2luZyBpdCBhIHN0cm9uZyBvcHRpb24gZm9yIHRob3NlIHNlZWtpbmcgYWdncmVzc2l2ZSBpbnZlc3RtZW50cy4iIGVsc2UgaWYocGVyY2VudF9hYm92ZV90YXJnZXRfYWdncmVzc2l2ZV9zcHggPiA0MCkgInN1Z2dlc3RpbmcgdGhhdCB3aGlsZSBub3QgY29uc2lzdGVudCwgaXQgaGFzIGhpc3RvcmljYWxseSBwcm92aWRlZCByb2J1c3QgZ3Jvd3RoIG92ZXIgdGhlIGxvbmcgdGVybSwgbWFraW5nIGl0IGEgdmlhYmxlIGludmVzdG1lbnQgZm9yIHRob3NlIHdpdGggYSBoaWdoZXIgcmlzayB0b2xlcmFuY2UuIiBlbHNlICJyYWlzaW5nIGNvbmNlcm5zIGFib3V0IGl0cyBhYmlsaXR5IHRvIG1lZXQgYWdncmVzc2l2ZSBncm93dGggdGFyZ2V0cywgbWFraW5nIGl0IGxlc3Mgc3VpdGFibGUgZm9yIGludmVzdG9ycyB3aXRoIGhpZ2hlciByaXNrIHRvbGVyYW5jZS4iYA0KDQotIFFRUTogYHIgcGVyY2VudF9hYm92ZV90YXJnZXRfYWdncmVzc2l2ZV9xcXFgJSBvZiB0aGUgeWVhcnMgZXhjZWVkZWQgdGhlIGFnZ3Jlc3NpdmUgdGFyZ2V0IGByIGlmKHBlcmNlbnRfYWJvdmVfdGFyZ2V0X2FnZ3Jlc3NpdmVfcXFxID4gNTApICJpbmRpY2F0aW5nIGNvbnNpc3RlbnQgYW5kIHJvYnVzdCBncm93dGgsIG1ha2luZyBpdCBhIHN0cm9uZyBvcHRpb24gZm9yIHRob3NlIHNlZWtpbmcgYWdncmVzc2l2ZSBpbnZlc3RtZW50cy4iIGVsc2UgaWYocGVyY2VudF9hYm92ZV90YXJnZXRfYWdncmVzc2l2ZV9xcXEgPiA0MCkgInN1Z2dlc3RpbmcgdGhhdCB3aGlsZSBub3QgY29uc2lzdGVudCwgaXQgaGFzIGhpc3RvcmljYWxseSBwcm92aWRlZCByb2J1c3QgZ3Jvd3RoIG92ZXIgdGhlIGxvbmcgdGVybSwgbWFraW5nIGl0IGEgdmlhYmxlIGludmVzdG1lbnQgZm9yIHRob3NlIHdpdGggYSBoaWdoZXIgcmlzayB0b2xlcmFuY2UuIiBlbHNlICJyYWlzaW5nIGNvbmNlcm5zIGFib3V0IGl0cyBhYmlsaXR5IHRvIG1lZXQgYWdncmVzc2l2ZSBncm93dGggdGFyZ2V0cywgbWFraW5nIGl0IGxlc3Mgc3VpdGFibGUgZm9yIGludmVzdG9ycyB3aXRoIGhpZ2hlciByaXNrIHRvbGVyYW5jZS4iYA0KDQojIyMgR3JhcGggDQoNCmBgYHtyIGluZGV4X2NvbXBhcmlzb25fdmFuZ3VhcmRfc3B4X3FxcV9ncl9ncmFwaCwgZmlnLndpZHRoPTEwLCBmaWcuaGVpZ2h0PTcsIGV2YWw9VFJVRSwgZWNobz1GQUxTRX0NCg0KY2F0KCJcblxuIyMjIyBBbm51YWwgR3Jvd3RoIFJhdGVzIEJ5IEluZGV4IFxuIikNCg0KIyBMb2FkIG5lY2Vzc2FyeSBsaWJyYXJpZXMNCmxpYnJhcnkoZ2dwbG90MikNCmxpYnJhcnkoZHBseXIpDQoNCiMgQ29udmVydCBjb2x1bW5zIHRvIG51bWVyaWMgZm9yIHBsb3R0aW5nIGlmIG5lZWRlZCANCiMgaW5kZXhfbmFtZXMgPSBjKCJWVEkiLCAiVk9PIiwgIlZHVCIsICJTUFgiLCAiUVFRIikgDQoNCm1lcmdlZF9kYXRhIDwtIG1lcmdlZF9kYXRhICU+JQ0KICBtdXRhdGUoDQogICAgYERhdGVgID0gYXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIoYERhdGVgKSksICAjIEVuc3VyZSBEYXRlIGlzIG51bWVyaWMNCiAgICBhY3Jvc3MoYWxsX29mKGluZGV4X25hbWVzKSwgfiBhcy5udW1lcmljKGdzdWIoIiUiLCAiIiwgLikpKQ0KICApDQoNCiMgUmVzaGFwZSB0aGUgZGF0YSBpbnRvIGxvbmcgZm9ybWF0IGZvciBlYXN5IHBsb3R0aW5nIG9mIG11bHRpcGxlIGxpbmVzIGFuZCBzZXQgdGhlIGZhY3RvciBvcmRlcg0KbnJ0X2xvbmcgPC0gbWVyZ2VkX2RhdGEgJT4lDQogIHBpdm90X2xvbmdlcihjb2xzID0gYWxsX29mKGluZGV4X25hbWVzKSwNCiAgICAgICAgICAgICAgIG5hbWVzX3RvID0gIkFHUl9JbmRleCIsDQogICAgICAgICAgICAgICB2YWx1ZXNfdG8gPSAiQUdSX1ZhbHVlIikgJT4lDQogIG11dGF0ZShBR1JfSW5kZXggPSBmYWN0b3IoQUdSX0luZGV4LCBsZXZlbHMgPSBpbmRleF9uYW1lcykpDQoNCiMgQXNzaWduIGNvbG9ycyBkeW5hbWljYWxseSBiYXNlZCBvbiB0aGUgb3JkZXIgb2YgQUdSX0luZGV4IGluIHRoZSBkYXRhDQojIE1hdGNoIHRoZSB1bmlxdWUgbGV2ZWxzIG9mIEFHUl9JbmRleCB3aXRoIGNvbG9ycyBmcm9tIGNvbG9yc19nZW5lcmFsX2RhcmsNCnVuaXF1ZV90eXBlcyA8LSB1bmlxdWUobnJ0X2xvbmckQUdSX0luZGV4KQ0KY3VzdG9tX2NvbG9ycyA8LSBzZXROYW1lcyhjb2xvcnNfZ2VuZXJhbF9kYXJrWzE6bGVuZ3RoKHVuaXF1ZV90eXBlcyldLCB1bmlxdWVfdHlwZXMpDQoNCiMgRmluZCB0aGUgbWluaW11bSBhbmQgbWF4aW11bSB4LXZhbHVlIGluIHlvdXIgZGF0YQ0KbWF4X3ggPC0gbWF4KGFzLmludGVnZXIobWVyZ2VkX2RhdGEkRGF0ZSksIG5hLnJtID0gVFJVRSkNCm1pbl94IDwtIG1pbihhcy5pbnRlZ2VyKG1lcmdlZF9kYXRhJERhdGUpLCBuYS5ybSA9IFRSVUUpDQppbnRlcmFjdGl2ZV9wcmludChtYXhfeCkgICMgVGVzdA0KaW50ZXJhY3RpdmVfcHJpbnQobWluX3gpICAjIFRlc3QNCg0KIyBGaW5kIHRoZSBtaW5pbXVtIGFuZCBtYXhpbXVtIHllYXINCm1pbl95ZWFyIDwtIG1pbihtZXJnZWRfZGF0YSREYXRlLCBuYS5ybSA9IFRSVUUpDQptYXhfeWVhciA8LSBtYXgobWVyZ2VkX2RhdGEkRGF0ZSwgbmEucm0gPSBUUlVFKQ0KaW50ZXJhY3RpdmVfcHJpbnQobWluX3llYXIpDQppbnRlcmFjdGl2ZV9wcmludChtYXhfeWVhcikNCg0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiMjIFBMT1QgRlVMTCBXSVRIT1VUIExJTUlUUw0KDQojIERlZmluZSBzdGFydCBhbmQgZW5kIHllYXJzDQpzdGFydF95ZWFyIDwtIGFzLm51bWVyaWMobWluX3llYXIpDQplbmRfeWVhciA8LSBtYXhfeWVhcg0KeWVhcl9yYW5nZSA8LSBlbmRfeWVhciAtIHN0YXJ0X3llYXIgKyAxICAjIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIHllYXJzDQoNCiMgRGVmaW5lIGJyZWFrcyByb3VuZGVkIGFwcHJvcHJpYXRlbHkNCmxpbWl0c19zdGFydF95ZWFyIDwtIGZsb29yKHN0YXJ0X3llYXIgLyAyKSAqIDIgICMgUm91bmQgZG93biB0byB0aGUgbmVhcmVzdCBtdWx0aXBsZSBvZiA1DQpsaW1pdHNfZW5kX3llYXIgPC0gY2VpbGluZyhlbmRfeWVhciAvIDIpICogMiAgICMgUm91bmQgdXAgdG8gdGhlIG5lYXJlc3QgbXVsdGlwbGUgb2YgNQ0KDQojIENyZWF0ZSBkeW5hbWljIHRpdGxlIGFuZCBjYXB0aW9uDQpkeW5hbWljX3RpdGxlIDwtIHBhc3RlMCgiQW5udWFsIEdyb3d0aCBSYXRlcyBCeSBJbmRleCBPdmVyICIsIHllYXJfcmFuZ2UsICIgWWVhcnMgKCIsIHN0YXJ0X3llYXIsICItIiwgZW5kX3llYXIsICIpIikNCmR5bmFtaWNfY2FwdGlvbiA8LSBwYXN0ZTAoIkFubnVhbCBHcm93dGggUmF0ZXMgQnkgSW5kZXgsIERhdGEgUGVyaW9kICgiLCBzdGFydF95ZWFyLCAiLSIsIGVuZF95ZWFyLCAiKSIpDQoNCiMgQ3JlYXRlIHRoZSBmdWxsLCBub24tZmlsdGVyZWQgeC1heGlzIHBsb3Qgd2l0aCBkeW5hbWljIHggcGxhY2VtZW50IGZvciBhbm5vdGF0aW9ucw0KcDEgPC0gZ2dwbG90KG5ydF9sb25nLCBhZXMoeCA9IGFzLmludGVnZXIoRGF0ZSksIHkgPSBBR1JfVmFsdWUsIGNvbG9yID0gQUdSX0luZGV4KSkgKw0KDQogICMgQWRkIHNoYWRlZCBhcmVhcyBmb3IgYmFja2dyb3VuZCBlZmZlY3QNCiAgZ2VvbV9yZWN0KGFlcyh4bWluID0gLUluZiwgeG1heCA9IEluZiwgeW1pbiA9IHRhcmdldF9hZ2dyZXNzaXZlLCB5bWF4ID0gSW5mKSwgZmlsbCA9ICJsaWdodGdyZWVuIiwgYWxwaGEgPSAwLjAzMCkgKw0KICBnZW9tX3JlY3QoYWVzKHhtaW4gPSAtSW5mLCB4bWF4ID0gSW5mLCB5bWluID0gdGFyZ2V0X2NvbnNlcnZhdGl2ZSwgeW1heCA9IHRhcmdldF9hZ2dyZXNzaXZlKSwgZmlsbCA9ICJvcmFuZ2UiLCBhbHBoYSA9IDAuMDMwKSArDQogIGdlb21fcmVjdChhZXMoeG1pbiA9IC1JbmYsIHhtYXggPSBJbmYsIHltaW4gPSAtSW5mLCB5bWF4ID0gdGFyZ2V0X2NvbnNlcnZhdGl2ZSksIGZpbGwgPSAibGlnaHRjb3JhbCIsIGFscGhhID0gMC4wMzApICsNCiAgDQogICMgUGxvdCBsaW5lcyBmb3IgZWFjaCBBR1IgSW5kZXgNCiAgZ2VvbV9saW5lKHNpemUgPSAxLjI1LCBhbHBoYSA9IDMuMCkgKyAgICAgICAjIExpbmUgZm9yIGVhY2ggQ0FHUg0KICBnZW9tX3BvaW50KHNpemUgPSAyLjAsIGFscGhhID0gMy4wKSArICAgICAgICMgUG9pbnRzIGZvciBlYWNoIENBR1INCiAgDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IHRhcmdldF9hZ2dyZXNzaXZlLCBjb2xvciA9ICJkYXJrYmx1ZSIsIGxpbmV0eXBlID0gInNvbGlkIikgKw0KICAjIGdlb21faGxpbmUoeWludGVyY2VwdCA9IHRhcmdldF9tb2RlcmF0ZSwgY29sb3IgPSAiZGFya2JsdWUiLCBsaW5ldHlwZSA9ICJzb2xpZCIpICsNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gdGFyZ2V0X2NvbnNlcnZhdGl2ZSwgY29sb3IgPSAiZGFya2JsdWUiLCBsaW5ldHlwZSA9ICJzb2xpZCIpICsNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gdGFyZ2V0X2luZmxhdGlvbiwgY29sb3IgPSAiZGFya3JlZCIsIGxpbmV0eXBlID0gImRhc2hlZCIpICsNCg0KICAjIER5bmFtaWMgcmlnaHQtYWxpZ25lZCBwbGFjZW1lbnQgZm9yIGFubm90YXRpb25zDQogIGFubm90YXRlKCJ0ZXh0IiwgeCA9IEluZiwgeSA9IHRhcmdldF9hZ2dyZXNzaXZlLCBsYWJlbCA9ICJBZ2dyZXNzaXZlIiwgDQogICAgICAgICAgIGhqdXN0ID0gMSwgdmp1c3QgPSAtMC41LCBjb2xvciA9ICJkYXJrYmx1ZSIsIHNpemUgPSA0KSArDQogICMgYW5ub3RhdGUoInRleHQiLCB4ID0gSW5mLCB5ID0gdGFyZ2V0X21vZGVyYXRlLCBsYWJlbCA9ICJNb2RlcmF0ZSIsIA0KICAjICAgICAgICAgaGp1c3QgPSAxLCB2anVzdCA9IC0wLjUsIGNvbG9yID0gImRhcmtibHVlIiwgc2l6ZSA9IDQpICsNCiAgYW5ub3RhdGUoInRleHQiLCB4ID0gSW5mLCB5ID0gdGFyZ2V0X2NvbnNlcnZhdGl2ZSwgbGFiZWwgPSAiQ29uc2VydmF0aXZlIiwNCiAgICAgICAgICAgaGp1c3QgPSAxLCB2anVzdCA9IC0wLjUwLCBjb2xvciA9ICJkYXJrYmx1ZSIsIHNpemUgPSA0KSArDQogIGFubm90YXRlKCJ0ZXh0IiwgeCA9IEluZiwgeSA9IHRhcmdldF9pbmZsYXRpb24sIGxhYmVsID0gIkluZmxhdGlvbiIsIA0KICAgICAgICAgICBoanVzdCA9IDEsIHZqdXN0ID0gKzEuMTAsIGNvbG9yID0gImRhcmtyZWQiLCBzaXplID0gNCkgKw0KDQogIGxhYnMoDQogICAgdGl0bGUgPSBkeW5hbWljX3RpdGxlLA0KICAgIHggPSAiWWVhciIsDQogICAgeSA9ICJHcm93dGggUmF0ZSAoJSkiLA0KICAgIGNvbG9yID0gIkFHUiBJbmRleCIsDQogICAgY2FwdGlvbiA9IGR5bmFtaWNfY2FwdGlvbg0KICAgICkgKw0KICANCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGN1c3RvbV9jb2xvcnMpICsgICMgU2V0IGNvbG9ycyBmb3IgZWFjaCBBR1IgSW5kZXgNCiAgc2NhbGVfeF9jb250aW51b3VzKA0KICAgIGxpbWl0cyA9IGMoc3RhcnRfeWVhciwgZW5kX3llYXIgKyAxKSwgDQogICAgYnJlYWtzID0gc2VxKGxpbWl0c19zdGFydF95ZWFyLCBsaW1pdHNfZW5kX3llYXIgKyAxLCAyKSAgIyBSZXN0cmljdCAmIFNldCBNYWpvciB4LWF4aXMgbGluZXMgZm9yIGVhY2ggeWVhcg0KICApICsgDQogIA0KICB0aGVtZV9taW5pbWFsKCkgKw0KICB0aGVtZSgNCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41LCBzaXplID0gMjApLCAgICAgICAgICMgTGFyZ2VyIHRpdGxlIGZvbnQNCiAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0KSwgICAgICAgICAgICAgICAgICAgICMgTGFyZ2VyIHgtYXhpcyBsYWJlbCBmb250DQogICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCksICAgICAgICAgICAgICAgICAgICAjIExhcmdlciB5LWF4aXMgbGFiZWwgZm9udA0KICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSwgc2l6ZSA9IDE0KSwgICMgTGFyZ2VyIHgtYXhpcyB0ZXh0DQogICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0KSwgICAgICAgICAgICAgICAgICAgICAjIExhcmdlciB5LWF4aXMgdGV4dA0KICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQpLCAgICAgICAgICAgICAgICAgICAgIyBMZWdlbmQgdGl0bGUgc2l6ZQ0KICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiksICAgICAgICAgICAgICAgICAgICAgIyBMZWdlbmQgdGV4dCBzaXplDQogICAgcGFuZWwuZ3JpZC5tYWpvciA9IGVsZW1lbnRfbGluZShsaW5ldHlwZSA9ICJkb3R0ZWQiLCBjb2xvciA9ICJibGFjayIpLCAgIyBNYWpvciBncmlkIGxpbmVzDQogICAgcGFuZWwuZ3JpZC5taW5vci54ID0gZWxlbWVudF9ibGFuaygpLCAgICAgICAgICAgICAgICAgICAgICAjIE5vIG1pbm9yIHggZ3JpZCBsaW5lcw0KICAgIGF4aXMudGlja3MubGVuZ3RoID0gdW5pdCgtMC4yNSwgImNtIiksICAgICAgICAgICAgICAgICAgICAgICMgSW5jcmVhc2UgdGljayBsZW5ndGgNCiAgICBheGlzLnRpY2tzID0gZWxlbWVudF9saW5lKGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDAuNTApLCAgICMgRGFya2VyIHRpY2tzDQogICAgYXhpcy5saW5lLnggPSBlbGVtZW50X2xpbmUoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMC43NSksICAjIERhcmsgYm90dG9tIGJvcmRlcg0KICAgIGF4aXMubGluZS55ID0gZWxlbWVudF9saW5lKGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDAuNzUpICAgIyBEYXJrIGxlZnQgYm9yZGVyDQogICkNCg0KIyBQcmludCB0aGUgcGxvdCANCnByaW50KHAxKQ0KDQoNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQojIyBQTE9UIEVYQ0xVRElORyBRUVEgQU5EIFZHVA0KDQojIFNFQ09ORCBQTE9UOiBFeGNsdWRlIFFRUSBhbmQgVkdUDQoNCiMgRGVmaW5lIGV4Y2x1ZGVkIGluZGljZXMgZm9yIFBsb3QgMg0KZXhjbHVkZWRfaW5kaWNlcyA8LSBzZXRkaWZmKGluZGV4X25hbWVzLCBjKCJRUVEiLCAiVkdUIikpDQoNCiMgUmVzaGFwZSB0aGUgZGF0YSBmb3IgUGxvdCAyDQpucnRfbG9uZ19leGNsdWRlZCA8LSBtZXJnZWRfZGF0YSAlPiUNCiAgcGl2b3RfbG9uZ2VyKGNvbHMgPSBhbGxfb2YoZXhjbHVkZWRfaW5kaWNlcyksDQogICAgICAgICAgICAgICBuYW1lc190byA9ICJBR1JfSW5kZXgiLA0KICAgICAgICAgICAgICAgdmFsdWVzX3RvID0gIkFHUl9WYWx1ZSIpICU+JQ0KICBtdXRhdGUoQUdSX0luZGV4ID0gZmFjdG9yKEFHUl9JbmRleCwgbGV2ZWxzID0gZXhjbHVkZWRfaW5kaWNlcykpDQoNCiMgQXNzaWduIGNvbG9ycyBkeW5hbWljYWxseSBmb3IgUGxvdCAyDQp1bmlxdWVfdHlwZXNfZXhjbHVkZWQgPC0gdW5pcXVlKG5ydF9sb25nX2V4Y2x1ZGVkJEFHUl9JbmRleCkNCmN1c3RvbV9jb2xvcnNfZXhjbHVkZWQgPC0gc2V0TmFtZXMoY29sb3JzX2dlbmVyYWxfZGFya1sxOmxlbmd0aCh1bmlxdWVfdHlwZXNfZXhjbHVkZWQpXSwgdW5pcXVlX3R5cGVzX2V4Y2x1ZGVkKQ0KDQojIENyZWF0ZSBQbG90IDIgZXhjbHVkaW5nIFFRUSBhbmQgVkdUDQpwMiA8LSBnZ3Bsb3QobnJ0X2xvbmdfZXhjbHVkZWQsIGFlcyh4ID0gYXMuaW50ZWdlcihEYXRlKSwgeSA9IEFHUl9WYWx1ZSwgY29sb3IgPSBBR1JfSW5kZXgpKSArDQoNCiAgIyBBZGQgc2hhZGVkIGFyZWFzIGZvciBiYWNrZ3JvdW5kIGVmZmVjdA0KICBnZW9tX3JlY3QoYWVzKHhtaW4gPSAtSW5mLCB4bWF4ID0gSW5mLCB5bWluID0gdGFyZ2V0X2FnZ3Jlc3NpdmUsIHltYXggPSBJbmYpLCBmaWxsID0gImxpZ2h0Z3JlZW4iLCBhbHBoYSA9IDAuMDMwKSArDQogIGdlb21fcmVjdChhZXMoeG1pbiA9IC1JbmYsIHhtYXggPSBJbmYsIHltaW4gPSB0YXJnZXRfY29uc2VydmF0aXZlLCB5bWF4ID0gdGFyZ2V0X2FnZ3Jlc3NpdmUpLCBmaWxsID0gIm9yYW5nZSIsIGFscGhhID0gMC4wMzApICsNCiAgZ2VvbV9yZWN0KGFlcyh4bWluID0gLUluZiwgeG1heCA9IEluZiwgeW1pbiA9IC1JbmYsIHltYXggPSB0YXJnZXRfY29uc2VydmF0aXZlKSwgZmlsbCA9ICJsaWdodGNvcmFsIiwgYWxwaGEgPSAwLjAzMCkgKw0KICANCiAgIyBQbG90IGxpbmVzIGZvciBlYWNoIEFHUiBJbmRleA0KICBnZW9tX2xpbmUoc2l6ZSA9IDEuMjUsIGFscGhhID0gMy4wKSArICAgICAgICMgTGluZSBmb3IgZWFjaCBDQUdSDQogIGdlb21fcG9pbnQoc2l6ZSA9IDIuMCwgYWxwaGEgPSAzLjApICsgICAgICAgIyBQb2ludHMgZm9yIGVhY2ggQ0FHUg0KICANCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gdGFyZ2V0X2FnZ3Jlc3NpdmUsIGNvbG9yID0gImRhcmtibHVlIiwgbGluZXR5cGUgPSAic29saWQiKSArDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IHRhcmdldF9jb25zZXJ2YXRpdmUsIGNvbG9yID0gImRhcmtibHVlIiwgbGluZXR5cGUgPSAic29saWQiKSArDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IHRhcmdldF9pbmZsYXRpb24sIGNvbG9yID0gImRhcmtyZWQiLCBsaW5ldHlwZSA9ICJkYXNoZWQiKSArDQoNCiAgIyBEeW5hbWljIHJpZ2h0LWFsaWduZWQgcGxhY2VtZW50IGZvciBhbm5vdGF0aW9ucw0KICBhbm5vdGF0ZSgidGV4dCIsIHggPSBJbmYsIHkgPSB0YXJnZXRfYWdncmVzc2l2ZSwgbGFiZWwgPSAiQWdncmVzc2l2ZSIsIA0KICAgICAgICAgICBoanVzdCA9IDEsIHZqdXN0ID0gLTAuNTAsIGNvbG9yID0gImRhcmtibHVlIiwgc2l6ZSA9IDQpICsNCiAgYW5ub3RhdGUoInRleHQiLCB4ID0gSW5mLCB5ID0gdGFyZ2V0X2NvbnNlcnZhdGl2ZSwgbGFiZWwgPSAiQ29uc2VydmF0aXZlIiwNCiAgICAgICAgICAgaGp1c3QgPSAxLCB2anVzdCA9IC0wLjUwLCBjb2xvciA9ICJkYXJrYmx1ZSIsIHNpemUgPSA0KSArDQogIGFubm90YXRlKCJ0ZXh0IiwgeCA9IEluZiwgeSA9IHRhcmdldF9pbmZsYXRpb24sIGxhYmVsID0gIkluZmxhdGlvbiIsIA0KICAgICAgICAgICBoanVzdCA9IDEsIHZqdXN0ID0gKzEuMTAsIGNvbG9yID0gImRhcmtyZWQiLCBzaXplID0gNCkgKw0KDQogIGxhYnMoDQogICAgdGl0bGUgPSAiQW5udWFsIEdyb3d0aCBSYXRlcyBFeGNsdWRpbmcgUVFRIGFuZCBWR1QiLA0KICAgIHggPSAiWWVhciIsDQogICAgeSA9ICJHcm93dGggUmF0ZSAoJSkiLA0KICAgIGNvbG9yID0gIkFHUiBJbmRleCIsDQogICAgY2FwdGlvbiA9ICJBbm51YWwgR3Jvd3RoIFJhdGVzIEV4Y2x1ZGluZyBRUVEgYW5kIFZHVCINCiAgICApICsNCiAgDQogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjdXN0b21fY29sb3JzX2V4Y2x1ZGVkKSArICAjIFNldCBjb2xvcnMgZm9yIGVhY2ggQUdSIEluZGV4DQogIHNjYWxlX3hfY29udGludW91cygNCiAgICBsaW1pdHMgPSBjKHN0YXJ0X3llYXIsIGVuZF95ZWFyICsgMSksIA0KICAgIGJyZWFrcyA9IHNlcShsaW1pdHNfc3RhcnRfeWVhciwgbGltaXRzX2VuZF95ZWFyICsgMSwgMikgICMgUmVzdHJpY3QgJiBTZXQgTWFqb3IgeC1heGlzIGxpbmVzIGZvciBlYWNoIHllYXINCiAgKSArIA0KICANCiAgdGhlbWVfbWluaW1hbCgpICsNCiAgdGhlbWUoDQogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSwgc2l6ZSA9IDIwKSwgICAgICAgICAjIExhcmdlciB0aXRsZSBmb250DQogICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCksICAgICAgICAgICAgICAgICAgICAjIExhcmdlciB4LWF4aXMgbGFiZWwgZm9udA0KICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQpLCAgICAgICAgICAgICAgICAgICAgIyBMYXJnZXIgeS1heGlzIGxhYmVsIGZvbnQNCiAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEsIHNpemUgPSAxNCksICAjIExhcmdlciB4LWF4aXMgdGV4dA0KICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCksICAgICAgICAgICAgICAgICAgICAgIyBMYXJnZXIgeS1heGlzIHRleHQNCiAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0KSwgICAgICAgICAgICAgICAgICAgICMgTGVnZW5kIHRpdGxlIHNpemUNCiAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIpLCAgICAgICAgICAgICAgICAgICAgICMgTGVnZW5kIHRleHQgc2l6ZQ0KICAgIHBhbmVsLmdyaWQubWFqb3IgPSBlbGVtZW50X2xpbmUobGluZXR5cGUgPSAiZG90dGVkIiwgY29sb3IgPSAiYmxhY2siKSwgICMgTWFqb3IgZ3JpZCBsaW5lcw0KICAgIHBhbmVsLmdyaWQubWlub3IueCA9IGVsZW1lbnRfYmxhbmsoKSwgICAgICAgICAgICAgICAgICAgICAgIyBObyBtaW5vciB4IGdyaWQgbGluZXMNCiAgICBheGlzLnRpY2tzLmxlbmd0aCA9IHVuaXQoLTAuMjUsICJjbSIpLCAgICAgICAgICAgICAgICAgICAgICAjIEluY3JlYXNlIHRpY2sgbGVuZ3RoDQogICAgYXhpcy50aWNrcyA9IGVsZW1lbnRfbGluZShjb2xvciA9ICJibGFjayIsIHNpemUgPSAwLjUwKSwgICAjIERhcmtlciB0aWNrcw0KICAgIGF4aXMubGluZS54ID0gZWxlbWVudF9saW5lKGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDAuNzUpLCAgIyBEYXJrIGJvdHRvbSBib3JkZXINCiAgICBheGlzLmxpbmUueSA9IGVsZW1lbnRfbGluZShjb2xvciA9ICJibGFjayIsIHNpemUgPSAwLjc1KSAgICMgRGFyayBsZWZ0IGJvcmRlcg0KICApDQoNCiMgUHJpbnQgUGxvdCAyDQpwcmludChwMikNCg0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiMjIFBMT1QgRVhDTFVESU5HIFNQWCwgVlRJLCBBTkQgVk9PDQoNCiMgU0VDT05EIFBMT1Q6IEV4Y2x1ZGUgU1BYLCBWVEksIGFuZCBWT08NCg0KIyBEZWZpbmUgZXhjbHVkZWQgaW5kaWNlcyBmb3IgUGxvdCAzDQpleGNsdWRlZF9pbmRpY2VzX3YyIDwtIHNldGRpZmYoaW5kZXhfbmFtZXMsIGMoIlNQWCIsICJWVEkiLCAiVk9PIikpDQoNCiMgUmVzaGFwZSB0aGUgZGF0YSBmb3IgUGxvdCAzDQpucnRfbG9uZ19leGNsdWRlZCA8LSBtZXJnZWRfZGF0YSAlPiUNCiAgcGl2b3RfbG9uZ2VyKGNvbHMgPSBhbGxfb2YoZXhjbHVkZWRfaW5kaWNlc192MiksDQogICAgICAgICAgICAgICBuYW1lc190byA9ICJBR1JfSW5kZXgiLA0KICAgICAgICAgICAgICAgdmFsdWVzX3RvID0gIkFHUl9WYWx1ZSIpICU+JQ0KICBtdXRhdGUoQUdSX0luZGV4ID0gZmFjdG9yKEFHUl9JbmRleCwgbGV2ZWxzID0gZXhjbHVkZWRfaW5kaWNlc192MikpDQoNCiMgQXNzaWduIGNvbG9ycyBkeW5hbWljYWxseSBmb3IgUGxvdCAzDQp1bmlxdWVfdHlwZXNfZXhjbHVkZWQgPC0gdW5pcXVlKG5ydF9sb25nX2V4Y2x1ZGVkJEFHUl9JbmRleCkNCmN1c3RvbV9jb2xvcnNfZXhjbHVkZWQgPC0gc2V0TmFtZXMoY29sb3JzX2dlbmVyYWxfZGFya1sxOmxlbmd0aCh1bmlxdWVfdHlwZXNfZXhjbHVkZWQpXSwgdW5pcXVlX3R5cGVzX2V4Y2x1ZGVkKQ0KDQojIENyZWF0ZSBQbG90IDMgZXhjbHVkaW5nIFNQWCwgVlRJLCBhbmQgVk9PDQpwMyA8LSBnZ3Bsb3QobnJ0X2xvbmdfZXhjbHVkZWQsIGFlcyh4ID0gYXMuaW50ZWdlcihEYXRlKSwgeSA9IEFHUl9WYWx1ZSwgY29sb3IgPSBBR1JfSW5kZXgpKSArDQoNCiAgIyBBZGQgc2hhZGVkIGFyZWFzIGZvciBiYWNrZ3JvdW5kIGVmZmVjdA0KICBnZW9tX3JlY3QoYWVzKHhtaW4gPSAtSW5mLCB4bWF4ID0gSW5mLCB5bWluID0gdGFyZ2V0X2FnZ3Jlc3NpdmUsIHltYXggPSBJbmYpLCBmaWxsID0gImxpZ2h0Z3JlZW4iLCBhbHBoYSA9IDAuMDMwKSArDQogIGdlb21fcmVjdChhZXMoeG1pbiA9IC1JbmYsIHhtYXggPSBJbmYsIHltaW4gPSB0YXJnZXRfY29uc2VydmF0aXZlLCB5bWF4ID0gdGFyZ2V0X2FnZ3Jlc3NpdmUpLCBmaWxsID0gIm9yYW5nZSIsIGFscGhhID0gMC4wMzApICsNCiAgZ2VvbV9yZWN0KGFlcyh4bWluID0gLUluZiwgeG1heCA9IEluZiwgeW1pbiA9IC1JbmYsIHltYXggPSB0YXJnZXRfY29uc2VydmF0aXZlKSwgZmlsbCA9ICJsaWdodGNvcmFsIiwgYWxwaGEgPSAwLjAzMCkgKw0KICANCiAgIyBQbG90IGxpbmVzIGZvciBlYWNoIEFHUiBJbmRleA0KICBnZW9tX2xpbmUoc2l6ZSA9IDEuMjUsIGFscGhhID0gMy4wKSArICAgICAgICMgTGluZSBmb3IgZWFjaCBDQUdSDQogIGdlb21fcG9pbnQoc2l6ZSA9IDIuMCwgYWxwaGEgPSAzLjApICsgICAgICAgIyBQb2ludHMgZm9yIGVhY2ggQ0FHUg0KICANCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gdGFyZ2V0X2FnZ3Jlc3NpdmUsIGNvbG9yID0gImRhcmtibHVlIiwgbGluZXR5cGUgPSAic29saWQiKSArDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IHRhcmdldF9jb25zZXJ2YXRpdmUsIGNvbG9yID0gImRhcmtibHVlIiwgbGluZXR5cGUgPSAic29saWQiKSArDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IHRhcmdldF9pbmZsYXRpb24sIGNvbG9yID0gImRhcmtyZWQiLCBsaW5ldHlwZSA9ICJkYXNoZWQiKSArDQoNCiAgIyBEeW5hbWljIHJpZ2h0LWFsaWduZWQgcGxhY2VtZW50IGZvciBhbm5vdGF0aW9ucw0KICBhbm5vdGF0ZSgidGV4dCIsIHggPSBJbmYsIHkgPSB0YXJnZXRfYWdncmVzc2l2ZSwgbGFiZWwgPSAiQWdncmVzc2l2ZSIsIA0KICAgICAgICAgICBoanVzdCA9IDEsIHZqdXN0ID0gLTAuNTAsIGNvbG9yID0gImRhcmtibHVlIiwgc2l6ZSA9IDQpICsNCiAgYW5ub3RhdGUoInRleHQiLCB4ID0gSW5mLCB5ID0gdGFyZ2V0X2NvbnNlcnZhdGl2ZSwgbGFiZWwgPSAiQ29uc2VydmF0aXZlIiwNCiAgICAgICAgICAgaGp1c3QgPSAxLCB2anVzdCA9IC0wLjUwLCBjb2xvciA9ICJkYXJrYmx1ZSIsIHNpemUgPSA0KSArDQogIGFubm90YXRlKCJ0ZXh0IiwgeCA9IEluZiwgeSA9IHRhcmdldF9pbmZsYXRpb24sIGxhYmVsID0gIkluZmxhdGlvbiIsIA0KICAgICAgICAgICBoanVzdCA9IDEsIHZqdXN0ID0gKzEuMTAsIGNvbG9yID0gImRhcmtyZWQiLCBzaXplID0gNCkgKw0KDQogIGxhYnMoDQogICAgdGl0bGUgPSAiQW5udWFsIEdyb3d0aCBSYXRlcyBFeGNsdWRpbmcgU1BYLCBWVEksIGFuZCBWT08iLA0KICAgIHggPSAiWWVhciIsDQogICAgeSA9ICJHcm93dGggUmF0ZSAoJSkiLA0KICAgIGNvbG9yID0gIkFHUiBJbmRleCIsDQogICAgY2FwdGlvbiA9ICJBbm51YWwgR3Jvd3RoIFJhdGVzIEV4Y2x1ZGluZyBTUFgsIFZUSSwgYW5kIFZPTyINCiAgICApICsNCiAgDQogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjdXN0b21fY29sb3JzX2V4Y2x1ZGVkKSArICAjIFNldCBjb2xvcnMgZm9yIGVhY2ggQUdSIEluZGV4DQogIHNjYWxlX3hfY29udGludW91cygNCiAgICBsaW1pdHMgPSBjKHN0YXJ0X3llYXIsIGVuZF95ZWFyICsgMSksIA0KICAgIGJyZWFrcyA9IHNlcShsaW1pdHNfc3RhcnRfeWVhciwgbGltaXRzX2VuZF95ZWFyICsgMSwgMikgICMgUmVzdHJpY3QgJiBTZXQgTWFqb3IgeC1heGlzIGxpbmVzIGZvciBlYWNoIHllYXINCiAgKSArIA0KICANCiAgdGhlbWVfbWluaW1hbCgpICsNCiAgdGhlbWUoDQogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSwgc2l6ZSA9IDIwKSwgICAgICAgICAjIExhcmdlciB0aXRsZSBmb250DQogICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCksICAgICAgICAgICAgICAgICAgICAjIExhcmdlciB4LWF4aXMgbGFiZWwgZm9udA0KICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQpLCAgICAgICAgICAgICAgICAgICAgIyBMYXJnZXIgeS1heGlzIGxhYmVsIGZvbnQNCiAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEsIHNpemUgPSAxNCksICAjIExhcmdlciB4LWF4aXMgdGV4dA0KICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCksICAgICAgICAgICAgICAgICAgICAgIyBMYXJnZXIgeS1heGlzIHRleHQNCiAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0KSwgICAgICAgICAgICAgICAgICAgICMgTGVnZW5kIHRpdGxlIHNpemUNCiAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIpLCAgICAgICAgICAgICAgICAgICAgICMgTGVnZW5kIHRleHQgc2l6ZQ0KICAgIHBhbmVsLmdyaWQubWFqb3IgPSBlbGVtZW50X2xpbmUobGluZXR5cGUgPSAiZG90dGVkIiwgY29sb3IgPSAiYmxhY2siKSwgICMgTWFqb3IgZ3JpZCBsaW5lcw0KICAgIHBhbmVsLmdyaWQubWlub3IueCA9IGVsZW1lbnRfYmxhbmsoKSwgICAgICAgICAgICAgICAgICAgICAgIyBObyBtaW5vciB4IGdyaWQgbGluZXMNCiAgICBheGlzLnRpY2tzLmxlbmd0aCA9IHVuaXQoLTAuMjUsICJjbSIpLCAgICAgICAgICAgICAgICAgICAgICAjIEluY3JlYXNlIHRpY2sgbGVuZ3RoDQogICAgYXhpcy50aWNrcyA9IGVsZW1lbnRfbGluZShjb2xvciA9ICJibGFjayIsIHNpemUgPSAwLjUwKSwgICAjIERhcmtlciB0aWNrcw0KICAgIGF4aXMubGluZS54ID0gZWxlbWVudF9saW5lKGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDAuNzUpLCAgIyBEYXJrIGJvdHRvbSBib3JkZXINCiAgICBheGlzLmxpbmUueSA9IGVsZW1lbnRfbGluZShjb2xvciA9ICJibGFjayIsIHNpemUgPSAwLjc1KSAgICMgRGFyayBsZWZ0IGJvcmRlcg0KICApDQoNCiMgUHJpbnQgUGxvdCAzDQpwcmludChwMykNCg0KDQpgYGANCg0KPCEtLSANClVQREFURSBCRUxPVyAmIElOU0VSVCBJTlRPIENPREUgQ0hVTksgQUJPVkUgQVMgTkVFREVEDQoNCg0KLS0+IA0KDQoNCg0KIyMgQ3VtdWxhdGl2ZSBHcm93dGggDQoNCiMjIyBEYXRhDQoNCmBgYHtyIGluZGV4X2NvbXBhcmlzb25fdmFuZ3VhcmRfc3B4X3FxcV9jZywgZXZhbD1UUlVFLCBlY2hvPUZBTFNFfQ0KDQojIENvbnZlcnQgY29sdW1ucyB0byBudW1lcmljIGZvciBwbG90dGluZyBpZiBuZWVkZWQNCiMgaW5kZXhfbmFtZXMgPSBjKCJWVEkiLCAiVk9PIiwgIlZHVCIsICJTUFgiLCAiUVFRIikgDQoNCm1lcmdlZF9kYXRhIDwtIG1lcmdlZF9kYXRhICU+JQ0KICBtdXRhdGUoDQogICAgYERhdGVgID0gYXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIoYERhdGVgKSksICAjIEVuc3VyZSBEYXRlIGlzIG51bWVyaWMNCiAgICBhY3Jvc3MoYWxsX29mKGluZGV4X25hbWVzKSwgfiBhcy5udW1lcmljKGdzdWIoIiUiLCAiIiwgLikpKQ0KICApDQoNCiMgUmVzaGFwZSB0aGUgZGF0YSBpbnRvIGxvbmcgZm9ybWF0IGZvciBlYXN5IHBsb3R0aW5nIG9mIG11bHRpcGxlIGxpbmVzIGFuZCBzZXQgdGhlIGZhY3RvciBvcmRlcg0KbnJ0X2xvbmcgPC0gbWVyZ2VkX2RhdGEgJT4lDQogIHBpdm90X2xvbmdlcihjb2xzID0gYWxsX29mKGluZGV4X25hbWVzKSwNCiAgICAgICAgICAgICAgIG5hbWVzX3RvID0gIkFHUl9JbmRleCIsDQogICAgICAgICAgICAgICB2YWx1ZXNfdG8gPSAiQUdSX1ZhbHVlIikgJT4lDQogIG11dGF0ZShBR1JfSW5kZXggPSBmYWN0b3IoQUdSX0luZGV4LCBsZXZlbHMgPSBpbmRleF9uYW1lcykpDQoNCiMgQXNzaWduIGNvbG9ycyBkeW5hbWljYWxseSBiYXNlZCBvbiB0aGUgb3JkZXIgb2YgQUdSX0luZGV4IGluIHRoZSBkYXRhDQojIE1hdGNoIHRoZSB1bmlxdWUgbGV2ZWxzIG9mIEFHUl9JbmRleCB3aXRoIGNvbG9ycyBmcm9tIGNvbG9yc19nZW5lcmFsX2RhcmsNCnVuaXF1ZV90eXBlcyA8LSB1bmlxdWUobnJ0X2xvbmckQUdSX0luZGV4KQ0KY3VzdG9tX2NvbG9ycyA8LSBzZXROYW1lcyhjb2xvcnNfZ2VuZXJhbF9kYXJrWzE6bGVuZ3RoKHVuaXF1ZV90eXBlcyldLCB1bmlxdWVfdHlwZXMpDQoNCiMgTG9hZCBuZWNlc3NhcnkgbGlicmFyeQ0KbGlicmFyeShkcGx5cikNCg0KIyBTdGVwIDE6IENvbnZlcnQgcGVyY2VudGFnZXMgdG8gbnVtZXJpYyB2YWx1ZXMgZm9yIGRlZmluZWQgaW5kZXggbmFtZXMNCmN1bXVsYXRpdmVfZGF0YSA8LSBtZXJnZWRfZGF0YSAlPiUNCiAgbXV0YXRlKA0KICAgIGFjcm9zcyhhbGxfb2YoaW5kZXhfbmFtZXMpLCB+IGFzLm51bWVyaWMoZ3N1YigiJSIsICIiLCAuKSkgLyAxMDApICMgQ29udmVydCBwZXJjZW50YWdlIHN0cmluZ3MgdG8gbnVtZXJpYw0KICApDQoNCiMgU3RlcCAyOiBFbnN1cmUgdGhlIGBEYXRlYCBjb2x1bW4gaXMgdHJlYXRlZCBhcyBhbiBpbnRlZ2VyDQpjdW11bGF0aXZlX2RhdGEgPC0gY3VtdWxhdGl2ZV9kYXRhICU+JQ0KICBtdXRhdGUoRGF0ZSA9IGFzLmludGVnZXIoRGF0ZSkpDQoNCiMgU3RlcCAzOiBBZGQgdGhlIGluaXRpYWwgdmFsdWUgZm9yIDIwMTcNCmN1bXVsYXRpdmVfZGF0YSA8LSBiaW5kX3Jvd3MoDQogIGRhdGEuZnJhbWUoRGF0ZSA9IHN0YXJ0X3llYXItMSwgc2V0TmFtZXMoYXMubGlzdChyZXAoMCwgbGVuZ3RoKGluZGV4X25hbWVzKSkpLCBpbmRleF9uYW1lcykpLCAjIFNldCBncm93dGggcmF0ZXMgZm9yIDIwMTcgdG8gMA0KICBjdW11bGF0aXZlX2RhdGENCikNCg0KIyBTdGVwIDQ6IFNvcnQgYnkgRGF0ZSBhc2NlbmRpbmcgZm9yIHByb3BlciBjdW11bGF0aXZlIGNhbGN1bGF0aW9uDQpjdW11bGF0aXZlX2RhdGEgPC0gY3VtdWxhdGl2ZV9kYXRhICU+JQ0KICBhcnJhbmdlKERhdGUpDQoNCiMgU3RlcCA1OiBJbml0aWFsaXplIHRoZSBzdGFydGluZyB2YWx1ZQ0Kc3RhcnRpbmdfdmFsdWUgPC0gMTAwDQoNCiMgU3RlcCA2OiBDYWxjdWxhdGUgY3VtdWxhdGl2ZSBncm93dGgNCmN1bXVsYXRpdmVfZGF0YSA8LSBjdW11bGF0aXZlX2RhdGEgJT4lDQogIG11dGF0ZSgNCiAgICBhY3Jvc3MoYWxsX29mKGluZGV4X25hbWVzKSwgfiBzdGFydGluZ192YWx1ZSAqIGN1bXByb2QoMSArIHJlcGxhY2VfbmEoLiwgMCkpKSAjIFJlcGxhY2UgTkEgd2l0aCAwIGZvciBwcm9wZXIgY2FsY3VsYXRpb24NCiAgKQ0KDQojIFN0ZXAgNzogUmVwbGFjZSBpbml0aWFsIGdyb3d0aCByYXRlcyBmb3IgMjAxNyB3aXRoICQxMDAgZXhwbGljaXRseQ0KY3VtdWxhdGl2ZV9kYXRhIDwtIGN1bXVsYXRpdmVfZGF0YSAlPiUNCiAgbXV0YXRlKGFjcm9zcyhhbGxfb2YoaW5kZXhfbmFtZXMpLCB+IGlmZWxzZShEYXRlID09IHN0YXJ0X3llYXItMSwgMTAwLCAuKSkpDQoNCiMgU3RlcCA4OiBSZW9yZGVyIGNvbHVtbnMgYXMgRGF0ZSBmb2xsb3dlZCBieSBpbmRleCBuYW1lcw0KY3VtdWxhdGl2ZV9kYXRhIDwtIGN1bXVsYXRpdmVfZGF0YSAlPiUNCiAgc2VsZWN0KERhdGUsIGFsbF9vZihpbmRleF9uYW1lcykpDQoNCiMgU3RlcCA5OiBSb3VuZCB2YWx1ZXMgdG8gMiBkZWNpbWFsIHBsYWNlcw0KY3VtdWxhdGl2ZV9kYXRhIDwtIGN1bXVsYXRpdmVfZGF0YSAlPiUNCiAgbXV0YXRlKGFjcm9zcyhhbGxfb2YoaW5kZXhfbmFtZXMpLCB+IHJvdW5kKC4sIDIpKSkNCg0KIyBTdGVwIDEwOiBTb3J0IGJ5IERhdGUgZGVzY2VuZGluZyBmb3IgcHJlc2VudGF0aW9uDQpjdW11bGF0aXZlX2RhdGEgPC0gY3VtdWxhdGl2ZV9kYXRhICU+JQ0KICBhcnJhbmdlKGRlc2MoRGF0ZSkpDQoNCiMgRm9ybWF0IHRoZSB0YWJsZSB3aXRob3V0IGFkZGluZyBjb21tYXMgdG8gdGhlIERhdGUgY29sdW1uDQpjdW11bGF0aXZlX2RhdGEkRGF0ZSA8LSBhcy5jaGFyYWN0ZXIoY3VtdWxhdGl2ZV9kYXRhJERhdGUpICAjIEVuc3VyZSBEYXRlIGlzIGEgY2hhcmFjdGVyIHdpdGhvdXQgY29tbWFzDQpjdW11bGF0aXZlX2RhdGFbaW5kZXhfbmFtZXNdIDwtIGxhcHBseShjdW11bGF0aXZlX2RhdGFbaW5kZXhfbmFtZXNdLCBmdW5jdGlvbih4KSBmb3JtYXRDKHgsIGZvcm1hdCA9ICJmIiwgZGlnaXRzID0gMikpDQoNCiMgUHJpbnQgdGhlIGN1bXVsYXRpdmUgZ3Jvd3RoIHRhYmxlDQpjYXQoIlxuXG4jIyMjIEN1bXVsYXRpdmUgR3Jvd3RoICgiLCBtaW5feWVhciwgIi0iLCBtYXhfeWVhciwgIilcbiIsIHNlcCA9ICIiKQ0KaW50ZXJhY3RpdmVfcHJpbnQoY3VtdWxhdGl2ZV9kYXRhKQ0KaW50ZXJhY3RpdmVfc3RyKGN1bXVsYXRpdmVfZGF0YSkNCmZvcm1hdF9lcXVhbF93aWR0aChjdW11bGF0aXZlX2RhdGEpDQoNCg0KDQpgYGANCg0KVGhlIHRhYmxlIGFuZCBncmFwaCBiZWxvdyBzaG93IHRoZSBpbXBhY3Qgb2YgdGhlIGFubnVhbCBncm93dGggcmF0ZXMsIGNvbXBhcmluZyB0aGUgY3VtdWxhdGl2ZSBncm93dGggb2YgdGhlIGluZGV4ZXMgb3ZlciBhIGByIHllYXJfcmFuZ2VgLXllYXIgcGVyaW9kIGZyb20gYHIgc3RhcnRfeWVhciAtIDFgIHRvIGByIGVuZF95ZWFyYCwgc3RhcnRpbmcgd2l0aCBhbiBpbml0aWFsIHZhbHVlIG9mICQxMDAgcGVyIDEwMCUuIA0KDQojIyMgR3JhcGggDQoNCmBgYHtyIGluZGV4X2NvbXBhcmlzb25fdmFuZ3VhcmRfc3B4X3FxcV9jZ19ncmFwaCwgZmlnLndpZHRoPTEwLCBmaWcuaGVpZ2h0PTcsIGV2YWw9VFJVRSwgZWNobz1GQUxTRX0NCg0KY2F0KCJcblxuIyMjIyBDdW11bGF0aXZlIEdyb3d0aCBCeSBJbmRleCBcbiIpDQoNCiMgTG9hZCBuZWNlc3NhcnkgbGlicmFyaWVzDQpsaWJyYXJ5KGdncGxvdDIpDQpsaWJyYXJ5KGRwbHlyKQ0KDQojIENvbnZlcnQgY29sdW1ucyB0byBudW1lcmljIGZvciBwbG90dGluZyBpZiBuZWVkZWQNCmluZGV4X25hbWVzID0gYygiVlRJIiwgIlZPTyIsICJWR1QiLCAiU1BYIiwgIlFRUSIpIA0KDQpjdW11bGF0aXZlX2RhdGEgPC0gY3VtdWxhdGl2ZV9kYXRhICU+JQ0KICBtdXRhdGUoDQogICAgYERhdGVgID0gYXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIoYERhdGVgKSksICAjIEVuc3VyZSBEYXRlIGlzIG51bWVyaWMNCiAgICBhY3Jvc3MoYWxsX29mKGluZGV4X25hbWVzKSwgfiBhcy5udW1lcmljKGdzdWIoIiUiLCAiIiwgLikpKQ0KICApDQoNCiMgUmVzaGFwZSB0aGUgZGF0YSBpbnRvIGxvbmcgZm9ybWF0IGZvciBlYXN5IHBsb3R0aW5nIG9mIG11bHRpcGxlIGxpbmVzIGFuZCBzZXQgdGhlIGZhY3RvciBvcmRlcg0KbnJ0X2xvbmcgPC0gY3VtdWxhdGl2ZV9kYXRhICU+JQ0KICBwaXZvdF9sb25nZXIoY29scyA9IGFsbF9vZihpbmRleF9uYW1lcyksDQogICAgICAgICAgICAgICBuYW1lc190byA9ICJDR19JbmRleCIsDQogICAgICAgICAgICAgICB2YWx1ZXNfdG8gPSAiQ0dfVmFsdWUiKSAlPiUNCiAgbXV0YXRlKENHX0luZGV4ID0gZmFjdG9yKENHX0luZGV4LCBsZXZlbHMgPSBpbmRleF9uYW1lcykpDQoNCiMgQXNzaWduIGNvbG9ycyBkeW5hbWljYWxseSBiYXNlZCBvbiB0aGUgb3JkZXIgb2YgQ0dfSW5kZXggaW4gdGhlIGRhdGENCiMgTWF0Y2ggdGhlIHVuaXF1ZSBsZXZlbHMgb2YgQ0dfSW5kZXggd2l0aCBjb2xvcnMgZnJvbSBjb2xvcnNfZ2VuZXJhbF9kYXJrDQp1bmlxdWVfdHlwZXMgPC0gdW5pcXVlKG5ydF9sb25nJENHX0luZGV4KQ0KY3VzdG9tX2NvbG9ycyA8LSBzZXROYW1lcyhjb2xvcnNfZ2VuZXJhbF9kYXJrWzE6bGVuZ3RoKHVuaXF1ZV90eXBlcyldLCB1bmlxdWVfdHlwZXMpDQoNCiMgRmluZCB0aGUgbWluaW11bSBhbmQgbWF4aW11bSB4LXZhbHVlIGluIHlvdXIgZGF0YQ0KbWF4X3ggPC0gbWF4KGFzLmludGVnZXIoY3VtdWxhdGl2ZV9kYXRhJERhdGUpLCBuYS5ybSA9IFRSVUUpDQptaW5feCA8LSBtaW4oYXMuaW50ZWdlcihjdW11bGF0aXZlX2RhdGEkRGF0ZSksIG5hLnJtID0gVFJVRSkNCmludGVyYWN0aXZlX3ByaW50KG1heF94KSAgIyBUZXN0DQppbnRlcmFjdGl2ZV9wcmludChtaW5feCkgICMgVGVzdA0KDQojIEZpbmQgdGhlIG1pbmltdW0gYW5kIG1heGltdW0geWVhcg0KbWluX3llYXIgPC0gbWluKGN1bXVsYXRpdmVfZGF0YSREYXRlLCBuYS5ybSA9IFRSVUUpDQptYXhfeWVhciA8LSBtYXgoY3VtdWxhdGl2ZV9kYXRhJERhdGUsIG5hLnJtID0gVFJVRSkNCmludGVyYWN0aXZlX3ByaW50KG1pbl95ZWFyKQ0KaW50ZXJhY3RpdmVfcHJpbnQobWF4X3llYXIpDQoNCg0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiMjIFBMT1QgRlVMTCBXSVRIT1VUIExJTUlUUw0KDQojIERlZmluZSBzdGFydCBhbmQgZW5kIHllYXJzDQpzdGFydF95ZWFyIDwtIG1pbl95ZWFyICMgT3IgRGVzaXJlZCBZZWFyIA0KZW5kX3llYXIgPC0gbWF4X3llYXIgIyBPciBEZXNpcmVkIFllYXINCnllYXJfcmFuZ2UgPC0gZW5kX3llYXIgLSBzdGFydF95ZWFyICsgMSAgIyBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiB5ZWFycw0KDQojIERlZmluZSBicmVha3Mgcm91bmRlZCBhcHByb3ByaWF0ZWx5DQpsaW1pdHNfc3RhcnRfeWVhciA8LSBmbG9vcihzdGFydF95ZWFyIC8gMikgKiAyICAjIFJvdW5kIGRvd24gdG8gdGhlIG5lYXJlc3QgbXVsdGlwbGUgb2YgMg0KbGltaXRzX2VuZF95ZWFyIDwtIGNlaWxpbmcoZW5kX3llYXIgLyAyKSAqIDIgICAjIFJvdW5kIHVwIHRvIHRoZSBuZWFyZXN0IG11bHRpcGxlIG9mIDINCg0KIyBDcmVhdGUgZHluYW1pYyB0aXRsZSBhbmQgY2FwdGlvbg0KZHluYW1pY190aXRsZSA8LSBwYXN0ZTAoIkN1bXVsYXRpdmUgR3Jvd3RoIEJ5IEluZGV4IE92ZXIgIiwgeWVhcl9yYW5nZSAtIDEsICIgWWVhcnMgKCIsIHN0YXJ0X3llYXIsICItIiwgZW5kX3llYXIsICIpIikNCmR5bmFtaWNfY2FwdGlvbiA8LSBwYXN0ZTAoIkN1bXVsYXRpdmUgR3Jvd3RoIEJ5IEluZGV4LCBEYXRhIFBlcmlvZCAoIiwgc3RhcnRfeWVhciwgIi0iLCBlbmRfeWVhciwgIikiKQ0KDQojIENyZWF0ZSB0aGUgZnVsbCwgbm9uLWZpbHRlcmVkIHgtYXhpcyBwbG90IHdpdGggZHluYW1pYyB4IHBsYWNlbWVudCBmb3IgYW5ub3RhdGlvbnMNCnAxIDwtIGdncGxvdChucnRfbG9uZywgYWVzKHggPSBhcy5pbnRlZ2VyKERhdGUpLCB5ID0gQ0dfVmFsdWUsIGNvbG9yID0gQ0dfSW5kZXgpKSArDQoNCiAgIyBBZGQgc2hhZGVkIGFyZWFzIGZvciBiYWNrZ3JvdW5kIGVmZmVjdA0KICBnZW9tX3JlY3QoYWVzKHhtaW4gPSAtSW5mLCB4bWF4ID0gSW5mLCB5bWluID0gMTAwLCB5bWF4ID0gSW5mKSwgZmlsbCA9ICJsaWdodGdyZWVuIiwgYWxwaGEgPSAwLjAzMCkgKw0KICBnZW9tX3JlY3QoYWVzKHhtaW4gPSAtSW5mLCB4bWF4ID0gSW5mLCB5bWluID0gLUluZiwgeW1heCA9IDEwMCksIGZpbGwgPSAibGlnaHRjb3JhbCIsIGFscGhhID0gMC4wMzApICsNCiAgDQogICMgUGxvdCBsaW5lcyBmb3IgZWFjaCBDRyBJbmRleA0KICBnZW9tX2xpbmUoc2l6ZSA9IDEuMjUsIGFscGhhID0gMy4wKSArICAgICAgICMgTGluZSBmb3IgZWFjaCBDRw0KICBnZW9tX3BvaW50KHNpemUgPSAyLjAsIGFscGhhID0gMy4wKSArICAgICAgICMgUG9pbnRzIGZvciBlYWNoIENHDQoNCiAgbGFicygNCiAgICB0aXRsZSA9IGR5bmFtaWNfdGl0bGUsDQogICAgeCA9ICJZZWFyIiwNCiAgICB5ID0gIkNHIFZhbHVlICgxJCAvIDElKSIsDQogICAgY29sb3IgPSAiQ0cgSW5kZXgiLA0KICAgIGNhcHRpb24gPSBkeW5hbWljX2NhcHRpb24NCiAgICApICsNCiAgDQogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjdXN0b21fY29sb3JzKSArICAjIFNldCBjb2xvcnMgZm9yIGVhY2ggQ0cgSW5kZXgNCiAgc2NhbGVfeF9jb250aW51b3VzKA0KICAgIGxpbWl0cyA9IGMoc3RhcnRfeWVhciwgZW5kX3llYXIpLCANCiAgICBicmVha3MgPSBzZXEobGltaXRzX3N0YXJ0X3llYXIsIGxpbWl0c19lbmRfeWVhciwgMikgICMgUmVzdHJpY3QgJiBTZXQgTWFqb3IgeC1heGlzIGxpbmVzIGZvciBlYWNoIHllYXINCiAgKSArIA0KICANCiAgdGhlbWVfbWluaW1hbCgpICsNCiAgdGhlbWUoDQogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSwgc2l6ZSA9IDIwKSwgICAgICAgICAjIExhcmdlciB0aXRsZSBmb250DQogICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCksICAgICAgICAgICAgICAgICAgICAjIExhcmdlciB4LWF4aXMgbGFiZWwgZm9udA0KICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQpLCAgICAgICAgICAgICAgICAgICAgIyBMYXJnZXIgeS1heGlzIGxhYmVsIGZvbnQNCiAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEsIHNpemUgPSAxNCksICAjIExhcmdlciB4LWF4aXMgdGV4dA0KICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCksICAgICAgICAgICAgICAgICAgICAgIyBMYXJnZXIgeS1heGlzIHRleHQNCiAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0KSwgICAgICAgICAgICAgICAgICAgICMgTGVnZW5kIHRpdGxlIHNpemUNCiAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIpLCAgICAgICAgICAgICAgICAgICAgICMgTGVnZW5kIHRleHQgc2l6ZQ0KICAgIHBhbmVsLmdyaWQubWFqb3IgPSBlbGVtZW50X2xpbmUobGluZXR5cGUgPSAiZG90dGVkIiwgY29sb3IgPSAiYmxhY2siKSwgICMgTWFqb3IgZ3JpZCBsaW5lcw0KICAgIHBhbmVsLmdyaWQubWlub3IueCA9IGVsZW1lbnRfYmxhbmsoKSwgICAgICAgICAgICAgICAgICAgICAgIyBObyBtaW5vciB4IGdyaWQgbGluZXMNCiAgICBheGlzLnRpY2tzLmxlbmd0aCA9IHVuaXQoLTAuMjUsICJjbSIpLCAgICAgICAgICAgICAgICAgICAgICAjIEluY3JlYXNlIHRpY2sgbGVuZ3RoDQogICAgYXhpcy50aWNrcyA9IGVsZW1lbnRfbGluZShjb2xvciA9ICJibGFjayIsIHNpemUgPSAwLjUwKSwgICAjIERhcmtlciB0aWNrcw0KICAgIGF4aXMubGluZS54ID0gZWxlbWVudF9saW5lKGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDAuNzUpLCAgIyBEYXJrIGJvdHRvbSBib3JkZXINCiAgICBheGlzLmxpbmUueSA9IGVsZW1lbnRfbGluZShjb2xvciA9ICJibGFjayIsIHNpemUgPSAwLjc1KSAgICMgRGFyayBsZWZ0IGJvcmRlcg0KICApDQoNCiMgUHJpbnQgdGhlIHBsb3QgDQpwcmludChwMSkNCg0KYGBgDQoNCg0KPCEtLSANClVQREFURSBCRUxPVyAmIElOU0VSVCBJTlRPIENPREUgQ0hVTksgQUJPVkUgQVMgTkVFREVEDQoNCg0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiMjIFBMT1QgRVhDTFVESU5HIE5WREEgQU5EIFRTTEENCg0KIyBTRUNPTkQgUExPVDogRXhjbHVkZSBOVkRBIGFuZCBUU0xBDQpleGNsdWRlZF9pbmRpY2VzIDwtIHNldGRpZmYoaW5kZXhfbmFtZXMsIGMoIk5WREEiLCAiVFNMQSIpKQ0KDQpucnRfbG9uZ19leGNsdWRlZCA8LSBjdW11bGF0aXZlX2RhdGEgJT4lDQogIHBpdm90X2xvbmdlcihjb2xzID0gYWxsX29mKGV4Y2x1ZGVkX2luZGljZXMpLA0KICAgICAgICAgICAgICAgbmFtZXNfdG8gPSAiQ0dfSW5kZXgiLA0KICAgICAgICAgICAgICAgdmFsdWVzX3RvID0gIkNHX1ZhbHVlIikgJT4lDQogIG11dGF0ZShDR19JbmRleCA9IGZhY3RvcihDR19JbmRleCwgbGV2ZWxzID0gZXhjbHVkZWRfaW5kaWNlcykpDQoNCmN1c3RvbV9jb2xvcnNfZXhjbHVkZWQgPC0gc2V0TmFtZXMoY29sb3JzX2dlbmVyYWxfZGFya1sxOmxlbmd0aChleGNsdWRlZF9pbmRpY2VzKV0sIGV4Y2x1ZGVkX2luZGljZXMpDQoNCnAyIDwtIGdncGxvdChucnRfbG9uZ19leGNsdWRlZCwgYWVzKHggPSBhcy5pbnRlZ2VyKERhdGUpLCB5ID0gQ0dfVmFsdWUsIGNvbG9yID0gQ0dfSW5kZXgpKSArDQoNCiAgIyBBZGQgc2hhZGVkIGFyZWFzIGZvciBiYWNrZ3JvdW5kIGVmZmVjdA0KICBnZW9tX3JlY3QoYWVzKHhtaW4gPSAtSW5mLCB4bWF4ID0gSW5mLCB5bWluID0gMTAwLCB5bWF4ID0gSW5mKSwgZmlsbCA9ICJsaWdodGdyZWVuIiwgYWxwaGEgPSAwLjAzMCkgKw0KICBnZW9tX3JlY3QoYWVzKHhtaW4gPSAtSW5mLCB4bWF4ID0gSW5mLCB5bWluID0gLUluZiwgeW1heCA9IDEwMCksIGZpbGwgPSAibGlnaHRjb3JhbCIsIGFscGhhID0gMC4wMzApICsNCiAgDQogICMgUGxvdCBsaW5lcyBmb3IgZWFjaCBDRyBJbmRleA0KICBnZW9tX2xpbmUoc2l6ZSA9IDEuMjUsIGFscGhhID0gMy4wKSArICAgICAgICMgTGluZSBmb3IgZWFjaCBDRw0KICBnZW9tX3BvaW50KHNpemUgPSAyLjAsIGFscGhhID0gMy4wKSArICAgICAgICMgUG9pbnRzIGZvciBlYWNoIENHDQoNCiAgbGFicygNCiAgICB0aXRsZSA9ICJDdW11bGF0aXZlIEdyb3d0aCBFeGNsdWRpbmcgTlZEQSBhbmQgVFNMQSIsDQogICAgeCA9ICJZZWFyIiwNCiAgICB5ID0gIkNHIFZhbHVlICgxJCAvIDElKSIsDQogICAgY29sb3IgPSAiQ0cgSW5kZXgiLA0KICAgIGNhcHRpb24gPSAiRXhjbHVkaW5nIE5WREEgYW5kIFRTTEEiDQogICAgKSArDQogIA0KICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gY3VzdG9tX2NvbG9yc19leGNsdWRlZCkgKyAgIyBTZXQgY29sb3JzIGZvciBlYWNoIENHIEluZGV4DQogIHNjYWxlX3hfY29udGludW91cygNCiAgICBsaW1pdHMgPSBjKHN0YXJ0X3llYXIsIGVuZF95ZWFyKSwgDQogICAgYnJlYWtzID0gc2VxKGxpbWl0c19zdGFydF95ZWFyLCBsaW1pdHNfZW5kX3llYXIsIDIpICAjIFJlc3RyaWN0ICYgU2V0IE1ham9yIHgtYXhpcyBsaW5lcyBmb3IgZWFjaCB5ZWFyDQogICkgKyANCiAgDQogIHRoZW1lX21pbmltYWwoKSArDQogIHRoZW1lKA0KICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUsIHNpemUgPSAyMCksICAgICAgICAgIyBMYXJnZXIgdGl0bGUgZm9udA0KICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQpLCAgICAgICAgICAgICAgICAgICAgIyBMYXJnZXIgeC1heGlzIGxhYmVsIGZvbnQNCiAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0KSwgICAgICAgICAgICAgICAgICAgICMgTGFyZ2VyIHktYXhpcyBsYWJlbCBmb250DQogICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxLCBzaXplID0gMTQpLCAgIyBMYXJnZXIgeC1heGlzIHRleHQNCiAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQpLCAgICAgICAgICAgICAgICAgICAgICMgTGFyZ2VyIHktYXhpcyB0ZXh0DQogICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCksICAgICAgICAgICAgICAgICAgICAjIExlZ2VuZCB0aXRsZSBzaXplDQogICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyKSwgICAgICAgICAgICAgICAgICAgICAjIExlZ2VuZCB0ZXh0IHNpemUNCiAgICBwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9saW5lKGxpbmV0eXBlID0gImRvdHRlZCIsIGNvbG9yID0gImJsYWNrIiksICAjIE1ham9yIGdyaWQgbGluZXMNCiAgICBwYW5lbC5ncmlkLm1pbm9yLnggPSBlbGVtZW50X2JsYW5rKCksICAgICAgICAgICAgICAgICAgICAgICMgTm8gbWlub3IgeCBncmlkIGxpbmVzDQogICAgYXhpcy50aWNrcy5sZW5ndGggPSB1bml0KC0wLjI1LCAiY20iKSwgICAgICAgICAgICAgICAgICAgICAgIyBJbmNyZWFzZSB0aWNrIGxlbmd0aA0KICAgIGF4aXMudGlja3MgPSBlbGVtZW50X2xpbmUoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMC41MCksICAgIyBEYXJrZXIgdGlja3MNCiAgICBheGlzLmxpbmUueCA9IGVsZW1lbnRfbGluZShjb2xvciA9ICJibGFjayIsIHNpemUgPSAwLjc1KSwgICMgRGFyayBib3R0b20gYm9yZGVyDQogICAgYXhpcy5saW5lLnkgPSBlbGVtZW50X2xpbmUoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMC43NSkgICAjIERhcmsgbGVmdCBib3JkZXINCiAgKQ0KDQojIFByaW50IHRoZSBzZWNvbmQgcGxvdA0KcHJpbnQocDIpDQoNCi0tPiANCg0KDQojIFFRUS1DT01QT1NJVFMNCg0KIyMgQW5udWFsIEdSDQoNCiMjIyBEYXRhDQoNCmBgYHtyIGluZGV4X2NvbXBhcmlzb25fcXFxX2dyLCBldmFsPVRSVUUsIGVjaG89RkFMU0V9DQoNCiMgU2V0IGRhdGFzZXQgbGlzdCBhbmQgbmFtZXMuDQpkYXRhc2V0cyA9IGxpc3QocXFxX3JhdywgYWFwbF9yYXcsIG52ZGFfcmF3LCBtc2Z0X3JhdywgYW16bl9yYXcsIG1ldGFfcmF3LCB0c2xhX3JhdywgY29zdF9yYXcpDQppbmRleF9uYW1lcyA9IGMoIlFRUSIsICJBQVBMIiwiTlZEQSIsICJNU0ZUIiwgIkFNWk4iLCAiTUVUQSIsICJUU0xBIiwgIkNPU1QiKQ0KDQpwcm9jZXNzX2dyb3d0aF9yYXRlcyA8LSBmdW5jdGlvbihkYXRhc2V0cywgaW5kZXhfbmFtZXMsIHN0YXJ0X29mZnNldCA9IDEsIGVuZF95ZWFyID0gYXMubnVtZXJpYyhmb3JtYXQoU3lzLkRhdGUoKSwgIiVZIikpKSB7DQogICMgRW5zdXJlIGRhdGFzZXRzIGFuZCBpbmRleF9uYW1lcyBoYXZlIHRoZSBzYW1lIGxlbmd0aA0KICBpZiAobGVuZ3RoKGRhdGFzZXRzKSAhPSBsZW5ndGgoaW5kZXhfbmFtZXMpKSB7DQogICAgc3RvcCgiVGhlIG51bWJlciBvZiBkYXRhc2V0cyBtdXN0IG1hdGNoIHRoZSBudW1iZXIgb2YgaW5kZXggbmFtZXMuIikNCiAgfQ0KDQogICMgRGV0ZXJtaW5lIHRoZSBtYXRjaGluZyBkYXRlIHJhbmdlIGFjcm9zcyBhbGwgZGF0YXNldHMNCiAgbWF0Y2hpbmdfZGF0ZXMgPC0gUmVkdWNlKGludGVyc2VjdCwgbGFwcGx5KGRhdGFzZXRzLCBmdW5jdGlvbihkZikgZGYkRGF0ZSkpDQoNCiAgaWYgKGxlbmd0aChtYXRjaGluZ19kYXRlcykgPiAwKSB7DQogICAgb2xkZXN0X21hdGNoaW5nX2RhdGUgPC0gbWluKG1hdGNoaW5nX2RhdGVzKQ0KICAgIGludGVyYWN0aXZlX2NhdCgiT2xkZXN0IG1hdGNoaW5nIGRhdGU6Iiwgb2xkZXN0X21hdGNoaW5nX2RhdGUsICJcbiIpDQogIH0gZWxzZSB7DQogICAgaW50ZXJhY3RpdmVfY2F0KCJObyBtYXRjaGluZyBkYXRlcyBmb3VuZCBhbW9uZyB0aGUgZGF0YXNldHMuXG4iKQ0KICAgIHJldHVybihOVUxMKQ0KICB9DQoNCiAgc3RhcnRfeWVhciA8PC0gb2xkZXN0X21hdGNoaW5nX2RhdGUgKyBzdGFydF9vZmZzZXQNCg0KICAjIEZpbHRlciBkYXRhc2V0cyBmb3IgdGhlIG1hdGNoaW5nIGRhdGUgcmFuZ2UgYW5kIHJlbmFtZSBjb2x1bW5zDQogIGZpbHRlcmVkX2RhdGEgPC0gbGFwcGx5KHNlcV9hbG9uZyhkYXRhc2V0cyksIGZ1bmN0aW9uKGkpIHsNCiAgICBmaWx0ZXJlZCA8LSBzdWJzZXQoZGF0YXNldHNbW2ldXSwgRGF0ZSA+PSBzdGFydF95ZWFyICYgRGF0ZSA8PSBlbmRfeWVhciwgc2VsZWN0ID0gYyhEYXRlLCBgMS1ZZWFyIENBR1JgKSkNCiAgICBjb2xuYW1lcyhmaWx0ZXJlZClbY29sbmFtZXMoZmlsdGVyZWQpID09ICIxLVllYXIgQ0FHUiJdIDwtIGluZGV4X25hbWVzW2ldDQogICAgcmV0dXJuKGZpbHRlcmVkKQ0KICB9KQ0KDQogICMgTWVyZ2UgYWxsIGZpbHRlcmVkIGRhdGFzZXRzIGJ5IERhdGUNCiAgbWVyZ2VkX2RhdGEgPDwtIFJlZHVjZShmdW5jdGlvbih4LCB5KSBtZXJnZSh4LCB5LCBieSA9ICJEYXRlIiksIGZpbHRlcmVkX2RhdGEpDQoNCiAgIyBTb3J0IGJ5IERhdGUgaW4gZGVzY2VuZGluZyBvcmRlciAobW9zdCByZWNlbnQgeWVhciBmaXJzdCkNCiAgbWVyZ2VkX2RhdGEgPC0gbWVyZ2VkX2RhdGFbb3JkZXIoLW1lcmdlZF9kYXRhJERhdGUpLCBdDQoNCiAgIyBGb3JtYXQgdGhlIG1lcmdlZCBkYXRhDQogIG1lcmdlZF9kYXRhJERhdGUgPC0gYXMuY2hhcmFjdGVyKG1lcmdlZF9kYXRhJERhdGUpICAjIEVuc3VyZSBEYXRlIGlzIGEgY2hhcmFjdGVyIHdpdGhvdXQgY29tbWFzDQogIGZvciAoaW5kZXggaW4gaW5kZXhfbmFtZXMpIHsNCiAgICBtZXJnZWRfZGF0YVtbaW5kZXhdXSA8LSBwYXN0ZTAoZm9ybWF0QyhtZXJnZWRfZGF0YVtbaW5kZXhdXSwgZm9ybWF0ID0gImYiLCBkaWdpdHMgPSAyKSwgIiUiKQ0KICB9DQoNCiAgIyBEaXNwbGF5IGZvcm1hdHRlZCB0YWJsZQ0KICBjYXQoIlxuXG4jIyMjIEFubnVhbCBHcm93dGggUmF0ZXMgQnkgSW5kZXggKCIsIHN0YXJ0X3llYXIsICItIiwgZW5kX3llYXIsICIpXG4iLCBzZXAgPSAiIikNCiAgaW50ZXJhY3RpdmVfcHJpbnQobWVyZ2VkX2RhdGEpDQogIGludGVyYWN0aXZlX3N0cihtZXJnZWRfZGF0YSkNCiAgZm9ybWF0X2VxdWFsX3dpZHRoKG1lcmdlZF9kYXRhKQ0KfQ0KICAgIA0KIyBTZXQgZGF0YXNldCBsaXN0IGFuZCBuYW1lcy4NCnByb2Nlc3NfZ3Jvd3RoX3JhdGVzKGRhdGFzZXRzLCBpbmRleF9uYW1lcykNCg0KYGBgDQoNCkRhdGEgYmVnaW5zIHdpdGggYHIgc3RhcnRfeWVhcmAsIGRldGVybWluZWQgYnkgdGhlIGluZGV4IHdpdGggdGhlIGxlYXN0IGhpc3RvcmljYWwgZGF0YSBmb3IgY29uc2lzdGVudCBjb21wYXJpc29uIGFjcm9zcyBhbGwgaW5kZXhlcy4NCg0KIyMjIFN1bW1hcnkNCg0KYGBge3IgaW5kZXhfY29tcGFyaXNvbl9xcXFfZ3Jfc3VtbWFyeSwgZXZhbD1UUlVFLCBlY2hvPUZBTFNFfQ0KDQoNCiMgTG9hZCBuZWNlc3NhcnkgbGlicmFyeQ0KbGlicmFyeShkcGx5cikNCg0KIyBSZW1vdmUgcGVyY2VudGFnZSBzaWducyBhbmQgY29udmVydCBjb2x1bW5zIHRvIG51bWVyaWMNCm1lcmdlZF9kYXRhX2NsZWFuIDwtIG1lcmdlZF9kYXRhDQptZXJnZWRfZGF0YV9jbGVhblsyOm5jb2wobWVyZ2VkX2RhdGEpXSA8LSBsYXBwbHkobWVyZ2VkX2RhdGFbMjpuY29sKG1lcmdlZF9kYXRhKV0sIGZ1bmN0aW9uKHgpIGFzLm51bWVyaWMoZ3N1YigiJSIsICIiLCB4KSkpDQoNCiMgRmluZCB0aGUgbWluaW11bSBhbmQgbWF4aW11bSB5ZWFyDQptaW5feWVhciA8LSBtaW4obWVyZ2VkX2RhdGEkRGF0ZSwgbmEucm0gPSBUUlVFKQ0KbWF4X3llYXIgPC0gbWF4KG1lcmdlZF9kYXRhJERhdGUsIG5hLnJtID0gVFJVRSkNCmludGVyYWN0aXZlX3ByaW50KG1pbl95ZWFyKQ0KaW50ZXJhY3RpdmVfcHJpbnQobWF4X3llYXIpDQoNCiMgRGVmaW5lIHRoZSBtZXRyaWNzIHRvIGNhbGN1bGF0ZSwgaW5jbHVkaW5nIENBR1INCm1ldHJpY3MgPC0gYygNCiAgIkNBR1IiLCANCiAgIk1lYW4iLCANCiAgIk1lZGlhbiIsIA0KICAiU3RhbmRhcmQgRGV2aWF0aW9uIChWb2xhdGlsaXR5KSIsIA0KICAiTWluIENBR1IgUmFuZ2UgKENBR1IgLSBTRCkiLCANCiAgIk1heCBDQUdSIFJhbmdlIChDQUdSICsgU0QpIiwgDQogICJNaW4iLCANCiAgIk1heCIsIA0KICAiUGVyY2VudCBBYm92ZSBJbmZsYXRpb24gVGFyZ2V0IiwgDQogICJQZXJjZW50IEFib3ZlIENvbnNlcnZhdGl2ZSBUYXJnZXQiLCANCiAgIlBlcmNlbnQgQWJvdmUgTW9kZXJhdGUgVGFyZ2V0IiwgDQogICJQZXJjZW50IEFib3ZlIEFnZ3Jlc3NpdmUgVGFyZ2V0Ig0KKQ0KDQojIERlZmluZSB0aGUgQ0FHUiBjYWxjdWxhdGlvbg0KY2FsY3VsYXRlX2NhZ3IgPC0gZnVuY3Rpb24oY29sKSB7DQogIHN0YXJ0X3ZhbCA8LSAxICAjIEZpcnN0IHllYXIgdmFsdWUNCiAgZW5kX3ZhbCA8LSBwcm9kKDEgKyBjb2wgLyAxMDAsIG5hLnJtID0gVFJVRSkgICMgUHJvZHVjdCBvZiBncm93dGggZmFjdG9ycw0KICB5ZWFycyA8LSBucm93KG1lcmdlZF9kYXRhX2NsZWFuKQ0KICAoKGVuZF92YWwgLyBzdGFydF92YWwpXigxIC8geWVhcnMpIC0gMSkgKiAxMDAgICMgQ0FHUiBmb3JtdWxhDQp9DQoNCiMgQ2FsY3VsYXRlIG1ldHJpY3MgZHluYW1pY2FsbHkgZm9yIGFsbCBudW1lcmljIGNvbHVtbnMNCmNhbGN1bGF0ZWRfbWV0cmljcyA8LSBzYXBwbHkobWVyZ2VkX2RhdGFfY2xlYW5bMjpuY29sKG1lcmdlZF9kYXRhKV0sIGZ1bmN0aW9uKGNvbCkgew0KICBtZWFuX3ZhbCA8LSBtZWFuKGNvbCwgbmEucm0gPSBUUlVFKQ0KICBzZF92YWwgPC0gc2QoY29sLCBuYS5ybSA9IFRSVUUpDQogIHBlcmNlbnRfYWJvdmUgPC0gZnVuY3Rpb24odGFyZ2V0KSBtZWFuKGNvbCA+IHRhcmdldCwgbmEucm0gPSBUUlVFKSAqIDEwMA0KICANCiAgYygNCiAgICBgQ0FHUmAgPSBjYWxjdWxhdGVfY2Fncihjb2wpLA0KICAgIE1lYW4gPSBtZWFuX3ZhbCwNCiAgICBNZWRpYW4gPSBtZWRpYW4oY29sLCBuYS5ybSA9IFRSVUUpLA0KICAgIGBTdGFuZGFyZCBEZXZpYXRpb24gKFZvbGF0aWxpdHkpYCA9IHNkX3ZhbCwNCiAgICBgTWluIENBR1IgUmFuZ2UgKENBR1IgLSBTRClgID0gbWVhbl92YWwgLSBzZF92YWwsDQogICAgYE1heCBDQUdSIFJhbmdlIChDQUdSICsgU0QpYCA9IG1lYW5fdmFsICsgc2RfdmFsLA0KICAgIE1pbiA9IG1pbihjb2wsIG5hLnJtID0gVFJVRSksDQogICAgTWF4ID0gbWF4KGNvbCwgbmEucm0gPSBUUlVFKSwNCiAgICBgUGVyY2VudCBBYm92ZSBJbmZsYXRpb24gVGFyZ2V0YCA9IHBlcmNlbnRfYWJvdmUodGFyZ2V0X2luZmxhdGlvbiksICAjIEV4YW1wbGUgaW5mbGF0aW9uIHRhcmdldDogMiUNCiAgICBgUGVyY2VudCBBYm92ZSBDb25zZXJ2YXRpdmUgVGFyZ2V0YCA9IHBlcmNlbnRfYWJvdmUodGFyZ2V0X2NvbnNlcnZhdGl2ZSksDQogICAgYFBlcmNlbnQgQWJvdmUgTW9kZXJhdGUgVGFyZ2V0YCA9IHBlcmNlbnRfYWJvdmUodGFyZ2V0X21vZGVyYXRlKSwNCiAgICBgUGVyY2VudCBBYm92ZSBBZ2dyZXNzaXZlIFRhcmdldGAgPSBwZXJjZW50X2Fib3ZlKHRhcmdldF9hZ2dyZXNzaXZlKQ0KICApDQp9KQ0KDQojIFRyYW5zcG9zZSB0aGUgcmVzdWx0IGFuZCBhZGQgdGhlIE1ldHJpYyBjb2x1bW4NCmN1c3RvbV9zdW1tYXJ5IDwtIGRhdGEuZnJhbWUoDQogIE1ldHJpYyA9IG1ldHJpY3MsDQogIGNhbGN1bGF0ZWRfbWV0cmljcw0KKQ0KDQojIFJlbmFtZSBjb2x1bW5zIHRvIHJldGFpbiB0aGUgb3JpZ2luYWwgY29sdW1uIG5hbWVzIGR5bmFtaWNhbGx5DQpjb2xuYW1lcyhjdXN0b21fc3VtbWFyeSlbLTFdIDwtIGNvbG5hbWVzKG1lcmdlZF9kYXRhKVsyOm5jb2wobWVyZ2VkX2RhdGEpXQ0KDQojIEFkZCBwZXJjZW50YWdlIHNpZ25zIGJhY2sgdG8gYWxsIG51bWVyaWMgdmFsdWVzDQpjdXN0b21fc3VtbWFyeVstMV0gPC0gbGFwcGx5KGN1c3RvbV9zdW1tYXJ5Wy0xXSwgZnVuY3Rpb24oeCkgcGFzdGUwKGZvcm1hdEMoeCwgZm9ybWF0ID0gImYiLCBkaWdpdHMgPSAyKSwgIiUiKSkNCg0KIyBSZW1vdmUgcm93IG5hbWVzDQpyb3duYW1lcyhjdXN0b21fc3VtbWFyeSkgPC0gTlVMTA0KDQojIFByaW50IHRoZSBmaW5hbCBzdW1tYXJ5DQojIERpc3BsYXkgZm9ybWF0dGVkIHRhYmxlDQpjYXQoIlxuXG4jIyMjIEFubnVhbCBHcm93dGggUmF0ZXMgU3VtbWFyeSBCeSBJbmRleCAoIiwgc3RhcnRfeWVhciwgIi0iLCBlbmRfeWVhciwgIilcbiIsIHNlcCA9ICIiKQ0KaW50ZXJhY3RpdmVfcHJpbnQoY3VzdG9tX3N1bW1hcnkpDQpmb3JtYXRfZXF1YWxfd2lkdGgoY3VzdG9tX3N1bW1hcnkpDQojIGZvcm1hdF80Y29sX2N1c3RvbV93aWR0aHMoY3VzdG9tX3N1bW1hcnksIGNvbDFfd2lkdGggPSAiMjBlbSIsIGNvbDJfd2lkdGggPSAiMTVlbSIsIGNvbDNfd2lkdGggPSAiMTVlbSIsIGNvbDRfd2lkdGggPSAiMTVlbSIpDQoNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQojIyBTQVZFIFZBTFVFUyBGT1IgSU4tTElORSBDT0RFDQoNCg0KIyBEZWZpbmUgdGhlIG1hcHBpbmcgb2Ygcm93IG5hbWVzIHRvIHZhcmlhYmxlIG5hbWVzDQpyb3dfdG9fdmFyX25hbWUgPC0gYygNCiAgIkNBR1IiID0gImNhZ3JfdmFsdWUiLA0KICAiTWVhbiIgPSAibWVhbl92YWx1ZSIsDQogICJNZWRpYW4iID0gIm1lZGlhbl92YWx1ZSIsDQogICJTdGFuZGFyZCBEZXZpYXRpb24gKFZvbGF0aWxpdHkpIiA9ICJzZF92YWx1ZSIsDQogICJNaW4gQ0FHUiBSYW5nZSAoQ0FHUiAtIFNEKSIgPSAibWluX2NhZ3JfcmFuZ2UiLA0KICAiTWF4IENBR1IgUmFuZ2UgKENBR1IgKyBTRCkiID0gIm1heF9jYWdyX3JhbmdlIiwNCiAgIk1pbiIgPSAibWluX3ZhbHVlIiwNCiAgIk1heCIgPSAibWF4X3ZhbHVlIiwNCiAgIlBlcmNlbnQgQWJvdmUgSW5mbGF0aW9uIFRhcmdldCIgPSAicGVyY2VudF9hYm92ZV90YXJnZXRfaW5mbGF0aW9uIiwNCiAgIlBlcmNlbnQgQWJvdmUgQ29uc2VydmF0aXZlIFRhcmdldCIgPSAicGVyY2VudF9hYm92ZV90YXJnZXRfY29uc2VydmF0aXZlIiwNCiAgIlBlcmNlbnQgQWJvdmUgTW9kZXJhdGUgVGFyZ2V0IiA9ICJwZXJjZW50X2Fib3ZlX3RhcmdldF9tb2RlcmF0ZSIsDQogICJQZXJjZW50IEFib3ZlIEFnZ3Jlc3NpdmUgVGFyZ2V0IiA9ICJwZXJjZW50X2Fib3ZlX3RhcmdldF9hZ2dyZXNzaXZlIg0KKQ0KDQoNCiMgRGVmaW5lIGEgY3VzdG9tIG1hcHBpbmcgZm9yIGNvbHVtbiBuYW1lcw0KZGF0YV9jb2x1bW5zIDwtIGNvbG5hbWVzKG1lcmdlZF9kYXRhKVsyOm5jb2wobWVyZ2VkX2RhdGEpXQ0KY29sdW1uX25hbWVfbWFwcGluZyA8LSBzZXROYW1lcyh0b2xvd2VyKGdzdWIoIlteYS16QS1aMC05XSIsICJfIiwgZGF0YV9jb2x1bW5zKSksIGRhdGFfY29sdW1ucykNCg0KIyBGdW5jdGlvbiB0byBzYXZlIHN1bW1hcnkgdmFsdWVzIGR5bmFtaWNhbGx5IHdpdGggY29sdW1uIG5hbWUgbWFwcGluZw0Kc2F2ZV9jb2x1bW5fdmFsdWVzIDwtIGZ1bmN0aW9uKHN1bW1hcnlfZGYsIHJvd19tYXBwaW5nLCBjb2x1bW5fbWFwcGluZykgew0KICAjIEdldCB0aGUgY29sdW1uIG5hbWVzIGluIHRoZSBkYXRhIGZyYW1lDQogIGNvbHVtbnNfdG9fc2F2ZSA8LSBzZXRkaWZmKG5hbWVzKHN1bW1hcnlfZGYpLCBjKCJNZXRyaWMiKSkgICMgRXhjbHVkZSB0aGUgTWV0cmljIGNvbHVtbg0KICANCiAgIyBJdGVyYXRlIG92ZXIgZWFjaCBjb2x1bW4NCiAgZm9yIChjb2wgaW4gY29sdW1uc190b19zYXZlKSB7DQogICAgIyBVc2UgdGhlIGN1c3RvbSBtYXBwaW5nIHRvIGdldCB0aGUgYXBwcm9wcmlhdGUgY29sdW1uIG5hbWUNCiAgICBjb2xfbmFtZSA8LSBjb2x1bW5fbWFwcGluZ1tbY29sXV0NCiAgICANCiAgICAjIEV4dHJhY3QgdmFsdWVzIGZvciB0aGUgY3VycmVudCBjb2x1bW4NCiAgICBjb2xfdmFsdWVzIDwtIHN1bW1hcnlfZGZbW2NvbF1dDQogICAgDQogICAgIyBJdGVyYXRlIG92ZXIgcm93cyB0byBzYXZlIGVhY2ggdmFsdWUgZHluYW1pY2FsbHkNCiAgICBmb3IgKGkgaW4gc2VxX2Fsb25nKGNvbF92YWx1ZXMpKSB7DQogICAgICAjIEdldCB0aGUgY29ycmVzcG9uZGluZyB2YXJpYWJsZSBuYW1lIGZyb20gdGhlIG1hcHBpbmcNCiAgICAgIHN0YXRfbmFtZSA8LSByb3dfbWFwcGluZ1tzdW1tYXJ5X2RmJE1ldHJpY1tpXV0NCiAgICAgIA0KICAgICAgaWYgKCFpcy5uYShzdGF0X25hbWUpKSB7ICAjIFNraXAgaWYgbm8gbWFwcGluZyBpcyBkZWZpbmVkDQogICAgICAgICMgQ3JlYXRlIHRoZSB2YXJpYWJsZSBuYW1lDQogICAgICAgIHZhcl9uYW1lIDwtIHBhc3RlMChzdGF0X25hbWUsICJfIiwgY29sX25hbWUpDQogICAgICAgIA0KICAgICAgICAjIEF0dGVtcHQgbnVtZXJpYyBjb252ZXJzaW9uIGZvciBkb3duc3RyZWFtIHVzZQ0KICAgICAgICB2YWx1ZSA8LSBzdXBwcmVzc1dhcm5pbmdzKGFzLm51bWVyaWMoZ3N1YigiJSIsICIiLCBjb2xfdmFsdWVzW2ldKSkpDQogICAgICAgIA0KICAgICAgICAjIEFzc2lnbiB0aGUgdmFsdWUgdG8gdGhlIGdsb2JhbCBlbnZpcm9ubWVudA0KICAgICAgICBhc3NpZ24odmFyX25hbWUsIHZhbHVlLCBlbnZpciA9IC5HbG9iYWxFbnYpDQogICAgICB9DQogICAgfQ0KICB9DQp9DQoNCiMgQXBwbHkgdGhlIGZ1bmN0aW9uIHRvIHNhdmUgdmFsdWVzIGR5bmFtaWNhbGx5DQpzYXZlX2NvbHVtbl92YWx1ZXMoY3VzdG9tX3N1bW1hcnksIHJvd190b192YXJfbmFtZSwgY29sdW1uX25hbWVfbWFwcGluZykNCg0KIyBFeGFtcGxlOiBBY2Nlc3NpbmcgZHluYW1pY2FsbHkgY3JlYXRlZCB2YXJpYWJsZXMNCmludGVyYWN0aXZlX3ByaW50KG1lYW5fdmFsdWVfcXFxKSAgIyBBZGp1c3RlZCB0byBwcmludCBiYXNlZCBvbiBkeW5hbWljYWxseSBjcmVhdGVkIHZhcmlhYmxlcw0KaW50ZXJhY3RpdmVfcHJpbnQoc2RfdmFsdWVfbWV0YSkgICMgRXhhbXBsZTogc3RhbmRhcmQgZGV2aWF0aW9uIGZvciBNRVRBDQppbnRlcmFjdGl2ZV9wcmludChwZXJjZW50X2Fib3ZlX3RhcmdldF9hZ2dyZXNzaXZlX2Ftem4pICAjIEV4YW1wbGU6IHBlcmNlbnQgYWJvdmUgYWdncmVzc2l2ZSB0YXJnZXQgZm9yIEFNWk4NCmludGVyYWN0aXZlX3ByaW50KGVuZF95ZWFyIC0gc3RhcnRfeWVhcikNCg0KDQoNCmBgYA0KKipVUERBVEUgRVhQTEFOQVRJT04qKg0KDQoqKkNvbXBhcmlzb24gaW4gQW5udWFsIEdyb3d0aCBSYXRlcyBPdmVyIGByIGVuZF95ZWFyIC0gc3RhcnRfeWVhciArIDFgIFllYXJzIChgciBzdGFydF95ZWFyYC1gciBlbmRfeWVhcmApKio6IFRoZSBzdW1tYXJ5IHJlZmxlY3RzIGRhdGEgb3ZlciBhIGByIGlmKChlbmRfeWVhciAtIHN0YXJ0X3llYXIpIDwgNSkgIlNob3J0LVRlcm0gUGVyaW9kICh1bmRlciA1IHllYXJzKSIgZWxzZSBpZigoZW5kX3llYXIgLSBzdGFydF95ZWFyKSA+PSA1ICYmICAoZW5kX3llYXIgLSBzdGFydF95ZWFyKSA8PSAxMCkgIkludGVybWVkaWF0ZS1UZXJtIFBlcmlvZCAoNS0xMCB5ZWFycykiIGVsc2UgIkxvbmctVGVybSBQZXJpb2QgKG92ZXIgMTAgeWVhcnMpImAuIFRoZSBwZXJmb3JtYW5jZSBhbmQgcmVsYXRpdmUgc3RyZW5ndGggYmV0d2VlbiBpbmRleGVzIHNoaWZ0cyB3aGVuIG1lYXN1cmVkIGFjcm9zcyBkaWZmZXJlbnQgdGltZSBmcmFtZXMsIHBhcnRpY3VsYXJseSBpbiByZXNwb25zZSB0byBtYWpvciBjb21wYW55IGV2ZW50cywgYW5kIHBhcnRpY3VsYXJseSBmb3IgU2hvcnQtVGVybSBhbmQgTG9uZy1UZXJtIFBlcmlvZHMuIFdoaWxlIGEgc2hvcnQtIG9yIGludGVybWVkaWF0ZS10ZXJtIGFuYWx5c2lzIGNhbiBwcm92aWRlIGluc2lnaHRzLCBpdCBtYXkgbm90IGZ1bGx5IHJlcHJlc2VudCBwZXJmb3JtYW5jZSBvdmVyIGV4dGVuZGVkLCBsb25nLXRlcm0gcGVyaW9kcy4NCg0KPCEtLQ0KKipDb21wYXJhdGl2ZSBBbmFseXNpcyBvZiBJbmRleCBQZXJmb3JtYW5jZToqKiBRUVEgZXhoaWJpdHMgdGhlIGhpZ2hlc3QgbWVhbiByZXR1cm4gYXQgYHIgbWVhbl92YWx1ZV9xcXFgJSwgc3VycGFzc2luZyBTUFgncyBgciBtZWFuX3ZhbHVlX3NweGAlIGFuZCBCbGFja1JvY2sncyBgciBtZWFuX3ZhbHVlX2JsYWNrcm9ja2AlLCByZWZsZWN0aW5nIGl0cyBhZ2dyZXNzaXZlLCB0ZWNoLWZvY3VzZWQgY29tcG9zaXRpb24uIEl0cyBDQUdSIG9mIGByIGNhZ3JfdmFsdWVfcXFxYCUgc2lnbmlmaWNhbnRseSBvdXRwYWNlcyBTUFgncyBgciBjYWdyX3ZhbHVlX3NweGAlIGFuZCBCbGFja1JvY2sncyBgciBjYWdyX3ZhbHVlX2JsYWNrcm9ja2AlLCBmdXJ0aGVyIGVtcGhhc2l6aW5nIFFRUSdzIHN0cm9uZyBncm93dGggcG90ZW50aWFsLiBXaGlsZSBib3RoIFNQWCBhbmQgUVFRIGhhdmUgY29uc2lzdGVudGx5IHN1cnBhc3NlZCBpbmZsYXRpb24sIGNvbnNlcnZhdGl2ZSwgYW5kIG1vZGVyYXRlIHRhcmdldHMgYHIgcGVyY2VudF9hYm92ZV90YXJnZXRfbW9kZXJhdGVfcXFxYCUgb2YgdGhlIHRpbWUsIEJsYWNrUm9jayBsYWdzIHNpZ25pZmljYW50bHksIG1lZXRpbmcgdGhlc2UgdGhyZXNob2xkcyBvbmx5IGByIHBlcmNlbnRfYWJvdmVfdGFyZ2V0X2NvbnNlcnZhdGl2ZV9ibGFja3JvY2tgJSBhbmQgYHIgcGVyY2VudF9hYm92ZV90YXJnZXRfbW9kZXJhdGVfcXFxYCUgb2YgdGhlIHRpbWUsIHJlc3BlY3RpdmVseS4gQWRkaXRpb25hbGx5LCBCbGFja1JvY2sncyBwZXJmb3JtYW5jZSBpbiBleGNlZWRpbmcgdGhlIGFnZ3Jlc3NpdmUgYmVuY2htYXJrIHN0YW5kcyBhdCBqdXN0IGByIHBlcmNlbnRfYWJvdmVfdGFyZ2V0X2FnZ3Jlc3NpdmVfYmxhY2tyb2NrYCUsIGNvbXBhcmVkIHRvIGByIHBlcmNlbnRfYWJvdmVfdGFyZ2V0X2FnZ3Jlc3NpdmVfcXFxYCUgZm9yIGJvdGggU1BYIGFuZCBRUVEuDQoNCkhvd2V2ZXIsIFFRUSBhbHNvIGRlbW9uc3RyYXRlcyB0aGUgaGlnaGVzdCB2b2xhdGlsaXR5LCB3aXRoIGEgc3RhbmRhcmQgZGV2aWF0aW9uIG9mIGByIHNkX3ZhbHVlX3FxcWAlJSwgY29tcGFyZWQgdG8gYHIgc2RfdmFsdWVfc3B4YCUgZm9yIFNQWCBhbmQgYHIgc2RfdmFsdWVfYmxhY2tyb2NrYCUgZm9yIEJsYWNrUm9jaywgdW5kZXJzY29yaW5nIGl0cyBncmVhdGVyIHJpc2suIFRoZSByYW5nZSBvZiBleHBlY3RlZCByZXR1cm5zIChDQUdSIMKxIFNEKSBpcyB3aWRlc3QgZm9yIFFRUSAoYHIgbWluX2NhZ3JfcmFuZ2VfcXFxYCUgdG8gYHIgbWF4X2NhZ3JfcmFuZ2VfcXFxYCUpIGFuZCBuYXJyb3dlc3QgZm9yIEJsYWNrUm9jayAoYHIgbWluX2NhZ3JfcmFuZ2VfYmxhY2tyb2NrYCUgdG8gYHIgbWF4X2NhZ3JfcmFuZ2VfYmxhY2tyb2NrYCUpLCBlbXBoYXNpemluZyBCbGFja1JvY2sncyBzdGFiaWxpdHkgYnV0IHNpZ25pZmljYW50bHkgbG93ZXIgZ3Jvd3RoIHBvdGVudGlhbC4gTWVkaWFuIHJldHVybnMgZnVydGhlciBoaWdobGlnaHQgUVFRJ3MgZG9taW5hbmNlIChgciBtZWRpYW5fdmFsdWVfcXFxYCUpIG92ZXIgU1BYIChgciBtZWRpYW5fdmFsdWVfc3B4YCUpIGFuZCBCbGFja1JvY2sgKGByIG1lZGlhbl92YWx1ZV9ibGFja3JvY2tgJSkuIEJsYWNrUm9jaywgdGhvdWdoIGxlc3Mgdm9sYXRpbGUsIGxhZ3MgaW4gcGVyZm9ybWFuY2Ugd2l0aCB0aGUgbG93ZXN0IG1heGltdW0gcmV0dXJuLiBCb3RoIFNQWCBhbmQgUVFRIGhhdmUgbmVhci0gb3IgYXQtZXF1YWwgcGVyY2VudGFnZSBvZiB5ZWFycyBhYm92ZSBlYWNoIHRhcmdldCwgKGByIG1heF92YWx1ZV9ibGFja3JvY2tgJSkgYW5kIHRoZSBoaWdoZXN0IHBlcmNlbnRhZ2Ugb2YgeWVhcnMgYmVsb3cgaW5mbGF0aW9uIGFuZCBjb25zZXJ2YXRpdmUgdGFyZ2V0cy4gVGhpcyBjb21wYXJpc29uIHVuZGVyc2NvcmVzIFFRUSdzIGFwcGVhbCBmb3IgZ3Jvd3RoLW9yaWVudGVkIGludmVzdG9ycyBzZWVraW5nIGhpZ2hlciByZXR1cm5zIGRlc3BpdGUgaW5jcmVhc2VkIHJpc2suDQotLT4NCg0KKipMb25nLVRlcm0gSW52ZXN0bWVudCBWaWFiaWxpdHk6KiogRm9yIGFueSBvZiB0aGVzZSBJbmRleGVzIHRvIGJlIGNvbnNpZGVyZWQgYSBoaWdoLXBlcmZvcm1pbmcgYW5kIHJlc2lsaWVudCBsb25nLXRlcm0gaW52ZXN0bWVudCwgaXQgd291bGQgYmUgaWRlYWwgdG8gZXhjZWVkIHRoZSBhZ2dyZXNzaXZlIHRhcmdldCAoZS5nLiwgYHIgKHRhcmdldF9hZ2dyZXNzaXZlIC0gdGFyZ2V0X2luZmxhdGlvbilgJSBhbm51YWxpemVkIHJldHVybnMsIGFjY291bnRpbmcgZm9yIGhpZ2hlciBpbmZsYXRpb24tYWRqdXN0ZWQgcGVyZm9ybWFuY2UgZXhwZWN0YXRpb25zKSBpbiBhdCBsZWFzdCA0MCUtNTAlIG9mIHRoZSB5ZWFycy4gVGhpcyByYW5nZSByZWZsZWN0cyB0aGUgcG90ZW50aWFsIGZvciBzdHJvbmcgdXBzaWRlIGluIG1hbnkgeWVhcnMgd2hpbGUgYmFsYW5jaW5nIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgbWFya2V0cyBkbyBleHBlcmllbmNlIGRvd250dXJucy4gDQoNCi0gUVFROiBgciBwZXJjZW50X2Fib3ZlX3RhcmdldF9hZ2dyZXNzaXZlX3FxcWAlIG9mIHRoZSB5ZWFycyBleGNlZWRlZCB0aGUgYWdncmVzc2l2ZSB0YXJnZXQgYHIgaWYocGVyY2VudF9hYm92ZV90YXJnZXRfYWdncmVzc2l2ZV9xcXEgPiA1MCkgImluZGljYXRpbmcgY29uc2lzdGVudCBhbmQgcm9idXN0IGdyb3d0aCwgbWFraW5nIGl0IGEgc3Ryb25nIG9wdGlvbiBmb3IgdGhvc2Ugc2Vla2luZyBhZ2dyZXNzaXZlIGludmVzdG1lbnRzLiIgZWxzZSBpZihwZXJjZW50X2Fib3ZlX3RhcmdldF9hZ2dyZXNzaXZlX3FxcSA+IDQwKSAic3VnZ2VzdGluZyB0aGF0IHdoaWxlIG5vdCBjb25zaXN0ZW50LCBpdCBoYXMgaGlzdG9yaWNhbGx5IHByb3ZpZGVkIHJvYnVzdCBncm93dGggb3ZlciB0aGUgbG9uZyB0ZXJtLCBtYWtpbmcgaXQgYSB2aWFibGUgaW52ZXN0bWVudCBmb3IgdGhvc2Ugd2l0aCBhIGhpZ2hlciByaXNrIHRvbGVyYW5jZS4iIGVsc2UgInJhaXNpbmcgY29uY2VybnMgYWJvdXQgaXRzIGFiaWxpdHkgdG8gbWVldCBhZ2dyZXNzaXZlIGdyb3d0aCB0YXJnZXRzLCBtYWtpbmcgaXQgbGVzcyBzdWl0YWJsZSBmb3IgaW52ZXN0b3JzIHdpdGggaGlnaGVyIHJpc2sgdG9sZXJhbmNlLiJgDQoNCi0gQUFQTDogYHIgcGVyY2VudF9hYm92ZV90YXJnZXRfYWdncmVzc2l2ZV9hYXBsYCUgb2YgdGhlIHllYXJzIGV4Y2VlZGVkIHRoZSBhZ2dyZXNzaXZlIHRhcmdldCBgciBpZihwZXJjZW50X2Fib3ZlX3RhcmdldF9hZ2dyZXNzaXZlX2FhcGwgPiA1MCkgImluZGljYXRpbmcgY29uc2lzdGVudCBhbmQgcm9idXN0IGdyb3d0aCwgbWFraW5nIGl0IGEgc3Ryb25nIG9wdGlvbiBmb3IgdGhvc2Ugc2Vla2luZyBhZ2dyZXNzaXZlIGludmVzdG1lbnRzLiIgZWxzZSBpZihwZXJjZW50X2Fib3ZlX3RhcmdldF9hZ2dyZXNzaXZlX2FhcGwgPiA0MCkgInN1Z2dlc3RpbmcgdGhhdCB3aGlsZSBub3QgY29uc2lzdGVudCwgaXQgaGFzIGhpc3RvcmljYWxseSBwcm92aWRlZCByb2J1c3QgZ3Jvd3RoIG92ZXIgdGhlIGxvbmcgdGVybSwgbWFraW5nIGl0IGEgdmlhYmxlIGludmVzdG1lbnQgZm9yIHRob3NlIHdpdGggYSBoaWdoZXIgcmlzayB0b2xlcmFuY2UuIiBlbHNlICJyYWlzaW5nIGNvbmNlcm5zIGFib3V0IGl0cyBhYmlsaXR5IHRvIG1lZXQgYWdncmVzc2l2ZSBncm93dGggdGFyZ2V0cywgbWFraW5nIGl0IGxlc3Mgc3VpdGFibGUgZm9yIGludmVzdG9ycyB3aXRoIGhpZ2hlciByaXNrIHRvbGVyYW5jZS4iYA0KDQotIE5WREE6IGByIHBlcmNlbnRfYWJvdmVfdGFyZ2V0X2FnZ3Jlc3NpdmVfbnZkYWAlIG9mIHRoZSB5ZWFycyBleGNlZWRlZCB0aGUgYWdncmVzc2l2ZSB0YXJnZXQgYHIgaWYocGVyY2VudF9hYm92ZV90YXJnZXRfYWdncmVzc2l2ZV9udmRhID4gNTApICJpbmRpY2F0aW5nIGNvbnNpc3RlbnQgYW5kIHJvYnVzdCBncm93dGgsIG1ha2luZyBpdCBhIHN0cm9uZyBvcHRpb24gZm9yIHRob3NlIHNlZWtpbmcgYWdncmVzc2l2ZSBpbnZlc3RtZW50cy4iIGVsc2UgaWYocGVyY2VudF9hYm92ZV90YXJnZXRfYWdncmVzc2l2ZV9udmRhID4gNDApICJzdWdnZXN0aW5nIHRoYXQgd2hpbGUgbm90IGNvbnNpc3RlbnQsIGl0IGhhcyBoaXN0b3JpY2FsbHkgcHJvdmlkZWQgcm9idXN0IGdyb3d0aCBvdmVyIHRoZSBsb25nIHRlcm0sIG1ha2luZyBpdCBhIHZpYWJsZSBpbnZlc3RtZW50IGZvciB0aG9zZSB3aXRoIGEgaGlnaGVyIHJpc2sgdG9sZXJhbmNlLiIgZWxzZSAicmFpc2luZyBjb25jZXJucyBhYm91dCBpdHMgYWJpbGl0eSB0byBtZWV0IGFnZ3Jlc3NpdmUgZ3Jvd3RoIHRhcmdldHMsIG1ha2luZyBpdCBsZXNzIHN1aXRhYmxlIGZvciBpbnZlc3RvcnMgd2l0aCBoaWdoZXIgcmlzayB0b2xlcmFuY2UuImANCg0KLSBNU0ZUOiBgciBwZXJjZW50X2Fib3ZlX3RhcmdldF9hZ2dyZXNzaXZlX21zZnRgJSBvZiB0aGUgeWVhcnMgZXhjZWVkZWQgdGhlIGFnZ3Jlc3NpdmUgdGFyZ2V0IGByIGlmKHBlcmNlbnRfYWJvdmVfdGFyZ2V0X2FnZ3Jlc3NpdmVfbXNmdCA+IDUwKSAiaW5kaWNhdGluZyBjb25zaXN0ZW50IGFuZCByb2J1c3QgZ3Jvd3RoLCBtYWtpbmcgaXQgYSBzdHJvbmcgb3B0aW9uIGZvciB0aG9zZSBzZWVraW5nIGFnZ3Jlc3NpdmUgaW52ZXN0bWVudHMuIiBlbHNlIGlmKHBlcmNlbnRfYWJvdmVfdGFyZ2V0X2FnZ3Jlc3NpdmVfbXNmdCA+IDQwKSAic3VnZ2VzdGluZyB0aGF0IHdoaWxlIG5vdCBjb25zaXN0ZW50LCBpdCBoYXMgaGlzdG9yaWNhbGx5IHByb3ZpZGVkIHJvYnVzdCBncm93dGggb3ZlciB0aGUgbG9uZyB0ZXJtLCBtYWtpbmcgaXQgYSB2aWFibGUgaW52ZXN0bWVudCBmb3IgdGhvc2Ugd2l0aCBhIGhpZ2hlciByaXNrIHRvbGVyYW5jZS4iIGVsc2UgInJhaXNpbmcgY29uY2VybnMgYWJvdXQgaXRzIGFiaWxpdHkgdG8gbWVldCBhZ2dyZXNzaXZlIGdyb3d0aCB0YXJnZXRzLCBtYWtpbmcgaXQgbGVzcyBzdWl0YWJsZSBmb3IgaW52ZXN0b3JzIHdpdGggaGlnaGVyIHJpc2sgdG9sZXJhbmNlLiJgDQoNCi0gQU1aTjogYHIgcGVyY2VudF9hYm92ZV90YXJnZXRfYWdncmVzc2l2ZV9hbXpuYCUgb2YgdGhlIHllYXJzIGV4Y2VlZGVkIHRoZSBhZ2dyZXNzaXZlIHRhcmdldCBgciBpZihwZXJjZW50X2Fib3ZlX3RhcmdldF9hZ2dyZXNzaXZlX2Ftem4gPiA1MCkgImluZGljYXRpbmcgY29uc2lzdGVudCBhbmQgcm9idXN0IGdyb3d0aCwgbWFraW5nIGl0IGEgc3Ryb25nIG9wdGlvbiBmb3IgdGhvc2Ugc2Vla2luZyBhZ2dyZXNzaXZlIGludmVzdG1lbnRzLiIgZWxzZSBpZihwZXJjZW50X2Fib3ZlX3RhcmdldF9hZ2dyZXNzaXZlX2Ftem4gPiA0MCkgInN1Z2dlc3RpbmcgdGhhdCB3aGlsZSBub3QgY29uc2lzdGVudCwgaXQgaGFzIGhpc3RvcmljYWxseSBwcm92aWRlZCByb2J1c3QgZ3Jvd3RoIG92ZXIgdGhlIGxvbmcgdGVybSwgbWFraW5nIGl0IGEgdmlhYmxlIGludmVzdG1lbnQgZm9yIHRob3NlIHdpdGggYSBoaWdoZXIgcmlzayB0b2xlcmFuY2UuIiBlbHNlICJyYWlzaW5nIGNvbmNlcm5zIGFib3V0IGl0cyBhYmlsaXR5IHRvIG1lZXQgYWdncmVzc2l2ZSBncm93dGggdGFyZ2V0cywgbWFraW5nIGl0IGxlc3Mgc3VpdGFibGUgZm9yIGludmVzdG9ycyB3aXRoIGhpZ2hlciByaXNrIHRvbGVyYW5jZS4iYA0KDQotIE1FVEE6IGByIHBlcmNlbnRfYWJvdmVfdGFyZ2V0X2FnZ3Jlc3NpdmVfbWV0YWAlIG9mIHRoZSB5ZWFycyBleGNlZWRlZCB0aGUgYWdncmVzc2l2ZSB0YXJnZXQgYHIgaWYocGVyY2VudF9hYm92ZV90YXJnZXRfYWdncmVzc2l2ZV9tZXRhID4gNTApICJpbmRpY2F0aW5nIGNvbnNpc3RlbnQgYW5kIHJvYnVzdCBncm93dGgsIG1ha2luZyBpdCBhIHN0cm9uZyBvcHRpb24gZm9yIHRob3NlIHNlZWtpbmcgYWdncmVzc2l2ZSBpbnZlc3RtZW50cy4iIGVsc2UgaWYocGVyY2VudF9hYm92ZV90YXJnZXRfYWdncmVzc2l2ZV9tZXRhID4gNDApICJzdWdnZXN0aW5nIHRoYXQgd2hpbGUgbm90IGNvbnNpc3RlbnQsIGl0IGhhcyBoaXN0b3JpY2FsbHkgcHJvdmlkZWQgcm9idXN0IGdyb3d0aCBvdmVyIHRoZSBsb25nIHRlcm0sIG1ha2luZyBpdCBhIHZpYWJsZSBpbnZlc3RtZW50IGZvciB0aG9zZSB3aXRoIGEgaGlnaGVyIHJpc2sgdG9sZXJhbmNlLiIgZWxzZSAicmFpc2luZyBjb25jZXJucyBhYm91dCBpdHMgYWJpbGl0eSB0byBtZWV0IGFnZ3Jlc3NpdmUgZ3Jvd3RoIHRhcmdldHMsIG1ha2luZyBpdCBsZXNzIHN1aXRhYmxlIGZvciBpbnZlc3RvcnMgd2l0aCBoaWdoZXIgcmlzayB0b2xlcmFuY2UuImANCg0KLSBUU0xBOiBgciBwZXJjZW50X2Fib3ZlX3RhcmdldF9hZ2dyZXNzaXZlX3RzbGFgJSBvZiB0aGUgeWVhcnMgZXhjZWVkZWQgdGhlIGFnZ3Jlc3NpdmUgdGFyZ2V0IGByIGlmKHBlcmNlbnRfYWJvdmVfdGFyZ2V0X2FnZ3Jlc3NpdmVfdHNsYSA+IDUwKSAiaW5kaWNhdGluZyBjb25zaXN0ZW50IGFuZCByb2J1c3QgZ3Jvd3RoLCBtYWtpbmcgaXQgYSBzdHJvbmcgb3B0aW9uIGZvciB0aG9zZSBzZWVraW5nIGFnZ3Jlc3NpdmUgaW52ZXN0bWVudHMuIiBlbHNlIGlmKHBlcmNlbnRfYWJvdmVfdGFyZ2V0X2FnZ3Jlc3NpdmVfdHNsYSA+IDQwKSAic3VnZ2VzdGluZyB0aGF0IHdoaWxlIG5vdCBjb25zaXN0ZW50LCBpdCBoYXMgaGlzdG9yaWNhbGx5IHByb3ZpZGVkIHJvYnVzdCBncm93dGggb3ZlciB0aGUgbG9uZyB0ZXJtLCBtYWtpbmcgaXQgYSB2aWFibGUgaW52ZXN0bWVudCBmb3IgdGhvc2Ugd2l0aCBhIGhpZ2hlciByaXNrIHRvbGVyYW5jZS4iIGVsc2UgInJhaXNpbmcgY29uY2VybnMgYWJvdXQgaXRzIGFiaWxpdHkgdG8gbWVldCBhZ2dyZXNzaXZlIGdyb3d0aCB0YXJnZXRzLCBtYWtpbmcgaXQgbGVzcyBzdWl0YWJsZSBmb3IgaW52ZXN0b3JzIHdpdGggaGlnaGVyIHJpc2sgdG9sZXJhbmNlLiJgDQoNCi0gQ09TVDogYHIgcGVyY2VudF9hYm92ZV90YXJnZXRfYWdncmVzc2l2ZV9jb3N0YCUgb2YgdGhlIHllYXJzIGV4Y2VlZGVkIHRoZSBhZ2dyZXNzaXZlIHRhcmdldCBgciBpZihwZXJjZW50X2Fib3ZlX3RhcmdldF9hZ2dyZXNzaXZlX2Nvc3QgPiA1MCkgImluZGljYXRpbmcgY29uc2lzdGVudCBhbmQgcm9idXN0IGdyb3d0aCwgbWFraW5nIGl0IGEgc3Ryb25nIG9wdGlvbiBmb3IgdGhvc2Ugc2Vla2luZyBhZ2dyZXNzaXZlIGludmVzdG1lbnRzLiIgZWxzZSBpZihwZXJjZW50X2Fib3ZlX3RhcmdldF9hZ2dyZXNzaXZlX2Nvc3QgPiA0MCkgInN1Z2dlc3RpbmcgdGhhdCB3aGlsZSBub3QgY29uc2lzdGVudCwgaXQgaGFzIGhpc3RvcmljYWxseSBwcm92aWRlZCByb2J1c3QgZ3Jvd3RoIG92ZXIgdGhlIGxvbmcgdGVybSwgbWFraW5nIGl0IGEgdmlhYmxlIGludmVzdG1lbnQgZm9yIHRob3NlIHdpdGggYSBoaWdoZXIgcmlzayB0b2xlcmFuY2UuIiBlbHNlICJyYWlzaW5nIGNvbmNlcm5zIGFib3V0IGl0cyBhYmlsaXR5IHRvIG1lZXQgYWdncmVzc2l2ZSBncm93dGggdGFyZ2V0cywgbWFraW5nIGl0IGxlc3Mgc3VpdGFibGUgZm9yIGludmVzdG9ycyB3aXRoIGhpZ2hlciByaXNrIHRvbGVyYW5jZS4iYA0KDQoNCiMjIyBHcmFwaCANCg0KYGBge3IgaW5kZXhfY29tcGFyaXNvbl9xcXFfZ3JfZ3JhcGgsIGZpZy53aWR0aD0xMCwgZmlnLmhlaWdodD03LCBldmFsPVRSVUUsIGVjaG89RkFMU0V9DQoNCmNhdCgiXG5cbiMjIyMgQW5udWFsIEdyb3d0aCBSYXRlcyBCeSBJbmRleCBcbiIpDQoNCiMgTG9hZCBuZWNlc3NhcnkgbGlicmFyaWVzDQpsaWJyYXJ5KGdncGxvdDIpDQpsaWJyYXJ5KGRwbHlyKQ0KDQojIENvbnZlcnQgY29sdW1ucyB0byBudW1lcmljIGZvciBwbG90dGluZyBpZiBuZWVkZWQgDQojIGluZGV4X25hbWVzID0gYygiUVFRIiwgIkFBUEwiLCJOVkRBIiwgIk1TRlQiLCAiQU1aTiIsICJNRVRBIiwgIlRTTEEiLCAiQ09TVCIpIA0KDQptZXJnZWRfZGF0YSA8LSBtZXJnZWRfZGF0YSAlPiUNCiAgbXV0YXRlKA0KICAgIGBEYXRlYCA9IGFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKGBEYXRlYCkpLCAgIyBFbnN1cmUgRGF0ZSBpcyBudW1lcmljDQogICAgYWNyb3NzKGFsbF9vZihpbmRleF9uYW1lcyksIH4gYXMubnVtZXJpYyhnc3ViKCIlIiwgIiIsIC4pKSkNCiAgKQ0KDQojIFJlc2hhcGUgdGhlIGRhdGEgaW50byBsb25nIGZvcm1hdCBmb3IgZWFzeSBwbG90dGluZyBvZiBtdWx0aXBsZSBsaW5lcyBhbmQgc2V0IHRoZSBmYWN0b3Igb3JkZXINCm5ydF9sb25nIDwtIG1lcmdlZF9kYXRhICU+JQ0KICBwaXZvdF9sb25nZXIoY29scyA9IGFsbF9vZihpbmRleF9uYW1lcyksDQogICAgICAgICAgICAgICBuYW1lc190byA9ICJBR1JfSW5kZXgiLA0KICAgICAgICAgICAgICAgdmFsdWVzX3RvID0gIkFHUl9WYWx1ZSIpICU+JQ0KICBtdXRhdGUoQUdSX0luZGV4ID0gZmFjdG9yKEFHUl9JbmRleCwgbGV2ZWxzID0gaW5kZXhfbmFtZXMpKQ0KDQojIEFzc2lnbiBjb2xvcnMgZHluYW1pY2FsbHkgYmFzZWQgb24gdGhlIG9yZGVyIG9mIEFHUl9JbmRleCBpbiB0aGUgZGF0YQ0KIyBNYXRjaCB0aGUgdW5pcXVlIGxldmVscyBvZiBBR1JfSW5kZXggd2l0aCBjb2xvcnMgZnJvbSBjb2xvcnNfZ2VuZXJhbF9kYXJrDQp1bmlxdWVfdHlwZXMgPC0gdW5pcXVlKG5ydF9sb25nJEFHUl9JbmRleCkNCmN1c3RvbV9jb2xvcnMgPC0gc2V0TmFtZXMoY29sb3JzX2dlbmVyYWxfZGFya1sxOmxlbmd0aCh1bmlxdWVfdHlwZXMpXSwgdW5pcXVlX3R5cGVzKQ0KDQojIEZpbmQgdGhlIG1pbmltdW0gYW5kIG1heGltdW0geC12YWx1ZSBpbiB5b3VyIGRhdGENCm1heF94IDwtIG1heChhcy5pbnRlZ2VyKG1lcmdlZF9kYXRhJERhdGUpLCBuYS5ybSA9IFRSVUUpDQptaW5feCA8LSBtaW4oYXMuaW50ZWdlcihtZXJnZWRfZGF0YSREYXRlKSwgbmEucm0gPSBUUlVFKQ0KaW50ZXJhY3RpdmVfcHJpbnQobWF4X3gpICAjIFRlc3QNCmludGVyYWN0aXZlX3ByaW50KG1pbl94KSAgIyBUZXN0DQoNCiMgRmluZCB0aGUgbWluaW11bSBhbmQgbWF4aW11bSB5ZWFyDQptaW5feWVhciA8LSBtaW4obWVyZ2VkX2RhdGEkRGF0ZSwgbmEucm0gPSBUUlVFKQ0KbWF4X3llYXIgPC0gbWF4KG1lcmdlZF9kYXRhJERhdGUsIG5hLnJtID0gVFJVRSkNCmludGVyYWN0aXZlX3ByaW50KG1pbl95ZWFyKQ0KaW50ZXJhY3RpdmVfcHJpbnQobWF4X3llYXIpDQoNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQojIyBQTE9UIEZVTEwgV0lUSE9VVCBMSU1JVFMNCg0KIyBEZWZpbmUgc3RhcnQgYW5kIGVuZCB5ZWFycw0Kc3RhcnRfeWVhciA8LSBhcy5udW1lcmljKG1pbl95ZWFyKQ0KZW5kX3llYXIgPC0gbWF4X3llYXINCnllYXJfcmFuZ2UgPC0gZW5kX3llYXIgLSBzdGFydF95ZWFyICsgMSAgIyBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiB5ZWFycw0KDQojIERlZmluZSBicmVha3Mgcm91bmRlZCBhcHByb3ByaWF0ZWx5DQpsaW1pdHNfc3RhcnRfeWVhciA8LSBmbG9vcihzdGFydF95ZWFyIC8gMikgKiAyICAjIFJvdW5kIGRvd24gdG8gdGhlIG5lYXJlc3QgbXVsdGlwbGUgb2YgNQ0KbGltaXRzX2VuZF95ZWFyIDwtIGNlaWxpbmcoZW5kX3llYXIgLyAyKSAqIDIgICAjIFJvdW5kIHVwIHRvIHRoZSBuZWFyZXN0IG11bHRpcGxlIG9mIDUNCg0KIyBDcmVhdGUgZHluYW1pYyB0aXRsZSBhbmQgY2FwdGlvbg0KZHluYW1pY190aXRsZSA8LSBwYXN0ZTAoIkFubnVhbCBHcm93dGggUmF0ZXMgQnkgSW5kZXggT3ZlciAiLCB5ZWFyX3JhbmdlLCAiIFllYXJzICgiLCBzdGFydF95ZWFyLCAiLSIsIGVuZF95ZWFyLCAiKSIpDQpkeW5hbWljX2NhcHRpb24gPC0gcGFzdGUwKCJBbm51YWwgR3Jvd3RoIFJhdGVzIEJ5IEluZGV4LCBEYXRhIFBlcmlvZCAoIiwgc3RhcnRfeWVhciwgIi0iLCBlbmRfeWVhciwgIikiKQ0KDQojIENyZWF0ZSB0aGUgZnVsbCwgbm9uLWZpbHRlcmVkIHgtYXhpcyBwbG90IHdpdGggZHluYW1pYyB4IHBsYWNlbWVudCBmb3IgYW5ub3RhdGlvbnMNCnAxIDwtIGdncGxvdChucnRfbG9uZywgYWVzKHggPSBhcy5pbnRlZ2VyKERhdGUpLCB5ID0gQUdSX1ZhbHVlLCBjb2xvciA9IEFHUl9JbmRleCkpICsNCg0KICAjIEFkZCBzaGFkZWQgYXJlYXMgZm9yIGJhY2tncm91bmQgZWZmZWN0DQogIGdlb21fcmVjdChhZXMoeG1pbiA9IC1JbmYsIHhtYXggPSBJbmYsIHltaW4gPSB0YXJnZXRfYWdncmVzc2l2ZSwgeW1heCA9IEluZiksIGZpbGwgPSAibGlnaHRncmVlbiIsIGFscGhhID0gMC4wMzApICsNCiAgZ2VvbV9yZWN0KGFlcyh4bWluID0gLUluZiwgeG1heCA9IEluZiwgeW1pbiA9IHRhcmdldF9jb25zZXJ2YXRpdmUsIHltYXggPSB0YXJnZXRfYWdncmVzc2l2ZSksIGZpbGwgPSAib3JhbmdlIiwgYWxwaGEgPSAwLjAzMCkgKw0KICBnZW9tX3JlY3QoYWVzKHhtaW4gPSAtSW5mLCB4bWF4ID0gSW5mLCB5bWluID0gLUluZiwgeW1heCA9IHRhcmdldF9jb25zZXJ2YXRpdmUpLCBmaWxsID0gImxpZ2h0Y29yYWwiLCBhbHBoYSA9IDAuMDMwKSArDQogIA0KICAjIFBsb3QgbGluZXMgZm9yIGVhY2ggQUdSIEluZGV4DQogIGdlb21fbGluZShzaXplID0gMS4yNSwgYWxwaGEgPSAzLjApICsgICAgICAgIyBMaW5lIGZvciBlYWNoIENBR1INCiAgZ2VvbV9wb2ludChzaXplID0gMi4wLCBhbHBoYSA9IDMuMCkgKyAgICAgICAjIFBvaW50cyBmb3IgZWFjaCBDQUdSDQogIA0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSB0YXJnZXRfYWdncmVzc2l2ZSwgY29sb3IgPSAiZGFya2JsdWUiLCBsaW5ldHlwZSA9ICJzb2xpZCIpICsNCiAgIyBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSB0YXJnZXRfbW9kZXJhdGUsIGNvbG9yID0gImRhcmtibHVlIiwgbGluZXR5cGUgPSAic29saWQiKSArDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IHRhcmdldF9jb25zZXJ2YXRpdmUsIGNvbG9yID0gImRhcmtibHVlIiwgbGluZXR5cGUgPSAic29saWQiKSArDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IHRhcmdldF9pbmZsYXRpb24sIGNvbG9yID0gImRhcmtyZWQiLCBsaW5ldHlwZSA9ICJkYXNoZWQiKSArDQoNCiAgIyBEeW5hbWljIHJpZ2h0LWFsaWduZWQgcGxhY2VtZW50IGZvciBhbm5vdGF0aW9ucw0KICBhbm5vdGF0ZSgidGV4dCIsIHggPSBJbmYsIHkgPSB0YXJnZXRfYWdncmVzc2l2ZSwgbGFiZWwgPSAiQWdncmVzc2l2ZSIsIA0KICAgICAgICAgICBoanVzdCA9IDEsIHZqdXN0ID0gLTAuNSwgY29sb3IgPSAiZGFya2JsdWUiLCBzaXplID0gNCkgKw0KICAjIGFubm90YXRlKCJ0ZXh0IiwgeCA9IEluZiwgeSA9IHRhcmdldF9tb2RlcmF0ZSwgbGFiZWwgPSAiTW9kZXJhdGUiLCANCiAgIyAgICAgICAgIGhqdXN0ID0gMSwgdmp1c3QgPSAtMC41LCBjb2xvciA9ICJkYXJrYmx1ZSIsIHNpemUgPSA0KSArDQogIGFubm90YXRlKCJ0ZXh0IiwgeCA9IEluZiwgeSA9IHRhcmdldF9jb25zZXJ2YXRpdmUsIGxhYmVsID0gIiIsDQogICAgICAgICAgIGhqdXN0ID0gMSwgdmp1c3QgPSAtMC41MCwgY29sb3IgPSAiZGFya2JsdWUiLCBzaXplID0gNCkgKw0KICBhbm5vdGF0ZSgidGV4dCIsIHggPSBJbmYsIHkgPSB0YXJnZXRfaW5mbGF0aW9uLCBsYWJlbCA9ICJJbmZsYXRpb24iLCANCiAgICAgICAgICAgaGp1c3QgPSAxLCB2anVzdCA9ICsxLjEwLCBjb2xvciA9ICJkYXJrcmVkIiwgc2l6ZSA9IDQpICsNCg0KICBsYWJzKA0KICAgIHRpdGxlID0gZHluYW1pY190aXRsZSwNCiAgICB4ID0gIlllYXIiLA0KICAgIHkgPSAiR3Jvd3RoIFJhdGUgKCUpIiwNCiAgICBjb2xvciA9ICJBR1IgSW5kZXgiLA0KICAgIGNhcHRpb24gPSBkeW5hbWljX2NhcHRpb24NCiAgICApICsNCiAgDQogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjdXN0b21fY29sb3JzKSArICAjIFNldCBjb2xvcnMgZm9yIGVhY2ggQUdSIEluZGV4DQogIHNjYWxlX3hfY29udGludW91cygNCiAgICBsaW1pdHMgPSBjKHN0YXJ0X3llYXIsIGVuZF95ZWFyICsgMSksIA0KICAgIGJyZWFrcyA9IHNlcShsaW1pdHNfc3RhcnRfeWVhciwgbGltaXRzX2VuZF95ZWFyICsgMSwgMikgICMgUmVzdHJpY3QgJiBTZXQgTWFqb3IgeC1heGlzIGxpbmVzIGZvciBlYWNoIHllYXINCiAgKSArIA0KICANCiAgdGhlbWVfbWluaW1hbCgpICsNCiAgdGhlbWUoDQogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSwgc2l6ZSA9IDIwKSwgICAgICAgICAjIExhcmdlciB0aXRsZSBmb250DQogICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCksICAgICAgICAgICAgICAgICAgICAjIExhcmdlciB4LWF4aXMgbGFiZWwgZm9udA0KICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQpLCAgICAgICAgICAgICAgICAgICAgIyBMYXJnZXIgeS1heGlzIGxhYmVsIGZvbnQNCiAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEsIHNpemUgPSAxNCksICAjIExhcmdlciB4LWF4aXMgdGV4dA0KICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCksICAgICAgICAgICAgICAgICAgICAgIyBMYXJnZXIgeS1heGlzIHRleHQNCiAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0KSwgICAgICAgICAgICAgICAgICAgICMgTGVnZW5kIHRpdGxlIHNpemUNCiAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIpLCAgICAgICAgICAgICAgICAgICAgICMgTGVnZW5kIHRleHQgc2l6ZQ0KICAgIHBhbmVsLmdyaWQubWFqb3IgPSBlbGVtZW50X2xpbmUobGluZXR5cGUgPSAiZG90dGVkIiwgY29sb3IgPSAiYmxhY2siKSwgICMgTWFqb3IgZ3JpZCBsaW5lcw0KICAgIHBhbmVsLmdyaWQubWlub3IueCA9IGVsZW1lbnRfYmxhbmsoKSwgICAgICAgICAgICAgICAgICAgICAgIyBObyBtaW5vciB4IGdyaWQgbGluZXMNCiAgICBheGlzLnRpY2tzLmxlbmd0aCA9IHVuaXQoLTAuMjUsICJjbSIpLCAgICAgICAgICAgICAgICAgICAgICAjIEluY3JlYXNlIHRpY2sgbGVuZ3RoDQogICAgYXhpcy50aWNrcyA9IGVsZW1lbnRfbGluZShjb2xvciA9ICJibGFjayIsIHNpemUgPSAwLjUwKSwgICAjIERhcmtlciB0aWNrcw0KICAgIGF4aXMubGluZS54ID0gZWxlbWVudF9saW5lKGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDAuNzUpLCAgIyBEYXJrIGJvdHRvbSBib3JkZXINCiAgICBheGlzLmxpbmUueSA9IGVsZW1lbnRfbGluZShjb2xvciA9ICJibGFjayIsIHNpemUgPSAwLjc1KSAgICMgRGFyayBsZWZ0IGJvcmRlcg0KICApDQoNCiMgUHJpbnQgdGhlIHBsb3QgDQpwcmludChwMSkNCg0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiMjIFBMT1QgRVhDTFVESU5HIE5WREEgQU5EIFRTTEENCg0KIyBTRUNPTkQgUExPVDogRXhjbHVkZSBOVkRBIGFuZCBUU0xBDQoNCiMgRGVmaW5lIGV4Y2x1ZGVkIGluZGljZXMgZm9yIFBsb3QgMg0KZXhjbHVkZWRfaW5kaWNlcyA8LSBzZXRkaWZmKGluZGV4X25hbWVzLCBjKCJOVkRBIiwgIlRTTEEiKSkNCg0KIyBSZXNoYXBlIHRoZSBkYXRhIGZvciBQbG90IDINCm5ydF9sb25nX2V4Y2x1ZGVkIDwtIG1lcmdlZF9kYXRhICU+JQ0KICBwaXZvdF9sb25nZXIoY29scyA9IGFsbF9vZihleGNsdWRlZF9pbmRpY2VzKSwNCiAgICAgICAgICAgICAgIG5hbWVzX3RvID0gIkFHUl9JbmRleCIsDQogICAgICAgICAgICAgICB2YWx1ZXNfdG8gPSAiQUdSX1ZhbHVlIikgJT4lDQogIG11dGF0ZShBR1JfSW5kZXggPSBmYWN0b3IoQUdSX0luZGV4LCBsZXZlbHMgPSBleGNsdWRlZF9pbmRpY2VzKSkNCg0KIyBBc3NpZ24gY29sb3JzIGR5bmFtaWNhbGx5IGZvciBQbG90IDINCnVuaXF1ZV90eXBlc19leGNsdWRlZCA8LSB1bmlxdWUobnJ0X2xvbmdfZXhjbHVkZWQkQUdSX0luZGV4KQ0KY3VzdG9tX2NvbG9yc19leGNsdWRlZCA8LSBzZXROYW1lcyhjb2xvcnNfZ2VuZXJhbF9kYXJrWzE6bGVuZ3RoKHVuaXF1ZV90eXBlc19leGNsdWRlZCldLCB1bmlxdWVfdHlwZXNfZXhjbHVkZWQpDQoNCiMgQ3JlYXRlIFBsb3QgMiBleGNsdWRpbmcgTlZEQSBhbmQgVFNMQQ0KcDIgPC0gZ2dwbG90KG5ydF9sb25nX2V4Y2x1ZGVkLCBhZXMoeCA9IGFzLmludGVnZXIoRGF0ZSksIHkgPSBBR1JfVmFsdWUsIGNvbG9yID0gQUdSX0luZGV4KSkgKw0KDQogICMgQWRkIHNoYWRlZCBhcmVhcyBmb3IgYmFja2dyb3VuZCBlZmZlY3QNCiAgZ2VvbV9yZWN0KGFlcyh4bWluID0gLUluZiwgeG1heCA9IEluZiwgeW1pbiA9IHRhcmdldF9hZ2dyZXNzaXZlLCB5bWF4ID0gSW5mKSwgZmlsbCA9ICJsaWdodGdyZWVuIiwgYWxwaGEgPSAwLjAzMCkgKw0KICBnZW9tX3JlY3QoYWVzKHhtaW4gPSAtSW5mLCB4bWF4ID0gSW5mLCB5bWluID0gdGFyZ2V0X2NvbnNlcnZhdGl2ZSwgeW1heCA9IHRhcmdldF9hZ2dyZXNzaXZlKSwgZmlsbCA9ICJvcmFuZ2UiLCBhbHBoYSA9IDAuMDMwKSArDQogIGdlb21fcmVjdChhZXMoeG1pbiA9IC1JbmYsIHhtYXggPSBJbmYsIHltaW4gPSAtSW5mLCB5bWF4ID0gdGFyZ2V0X2NvbnNlcnZhdGl2ZSksIGZpbGwgPSAibGlnaHRjb3JhbCIsIGFscGhhID0gMC4wMzApICsNCiAgDQogICMgUGxvdCBsaW5lcyBmb3IgZWFjaCBBR1IgSW5kZXgNCiAgZ2VvbV9saW5lKHNpemUgPSAxLjI1LCBhbHBoYSA9IDMuMCkgKyAgICAgICAjIExpbmUgZm9yIGVhY2ggQ0FHUg0KICBnZW9tX3BvaW50KHNpemUgPSAyLjAsIGFscGhhID0gMy4wKSArICAgICAgICMgUG9pbnRzIGZvciBlYWNoIENBR1INCiAgDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IHRhcmdldF9hZ2dyZXNzaXZlLCBjb2xvciA9ICJkYXJrYmx1ZSIsIGxpbmV0eXBlID0gInNvbGlkIikgKw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSB0YXJnZXRfY29uc2VydmF0aXZlLCBjb2xvciA9ICJkYXJrYmx1ZSIsIGxpbmV0eXBlID0gInNvbGlkIikgKw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSB0YXJnZXRfaW5mbGF0aW9uLCBjb2xvciA9ICJkYXJrcmVkIiwgbGluZXR5cGUgPSAiZGFzaGVkIikgKw0KDQogICMgRHluYW1pYyByaWdodC1hbGlnbmVkIHBsYWNlbWVudCBmb3IgYW5ub3RhdGlvbnMNCiAgYW5ub3RhdGUoInRleHQiLCB4ID0gSW5mLCB5ID0gdGFyZ2V0X2FnZ3Jlc3NpdmUsIGxhYmVsID0gIkFnZ3Jlc3NpdmUiLCANCiAgICAgICAgICAgaGp1c3QgPSAxLCB2anVzdCA9IC0wLjUwLCBjb2xvciA9ICJkYXJrYmx1ZSIsIHNpemUgPSA0KSArDQogIGFubm90YXRlKCJ0ZXh0IiwgeCA9IEluZiwgeSA9IHRhcmdldF9jb25zZXJ2YXRpdmUsIGxhYmVsID0gIkNvbnNlcnZhdGl2ZSIsDQogICAgICAgICAgIGhqdXN0ID0gMSwgdmp1c3QgPSAtMC41MCwgY29sb3IgPSAiZGFya2JsdWUiLCBzaXplID0gNCkgKw0KICBhbm5vdGF0ZSgidGV4dCIsIHggPSBJbmYsIHkgPSB0YXJnZXRfaW5mbGF0aW9uLCBsYWJlbCA9ICJJbmZsYXRpb24iLCANCiAgICAgICAgICAgaGp1c3QgPSAxLCB2anVzdCA9ICsxLjEwLCBjb2xvciA9ICJkYXJrcmVkIiwgc2l6ZSA9IDQpICsNCg0KICBsYWJzKA0KICAgIHRpdGxlID0gIkFubnVhbCBHcm93dGggUmF0ZXMgRXhjbHVkaW5nIE5WREEgYW5kIFRTTEEiLA0KICAgIHggPSAiWWVhciIsDQogICAgeSA9ICJHcm93dGggUmF0ZSAoJSkiLA0KICAgIGNvbG9yID0gIkFHUiBJbmRleCIsDQogICAgY2FwdGlvbiA9ICJBbm51YWwgR3Jvd3RoIFJhdGVzIEV4Y2x1ZGluZyBOVkRBIGFuZCBUU0xBIg0KICAgICkgKw0KICANCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGN1c3RvbV9jb2xvcnNfZXhjbHVkZWQpICsgICMgU2V0IGNvbG9ycyBmb3IgZWFjaCBBR1IgSW5kZXgNCiAgc2NhbGVfeF9jb250aW51b3VzKA0KICAgIGxpbWl0cyA9IGMoc3RhcnRfeWVhciwgZW5kX3llYXIgKyAxKSwgDQogICAgYnJlYWtzID0gc2VxKGxpbWl0c19zdGFydF95ZWFyLCBsaW1pdHNfZW5kX3llYXIgKyAxLCAyKSAgIyBSZXN0cmljdCAmIFNldCBNYWpvciB4LWF4aXMgbGluZXMgZm9yIGVhY2ggeWVhcg0KICApICsgDQogIA0KICB0aGVtZV9taW5pbWFsKCkgKw0KICB0aGVtZSgNCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41LCBzaXplID0gMjApLCAgICAgICAgICMgTGFyZ2VyIHRpdGxlIGZvbnQNCiAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0KSwgICAgICAgICAgICAgICAgICAgICMgTGFyZ2VyIHgtYXhpcyBsYWJlbCBmb250DQogICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCksICAgICAgICAgICAgICAgICAgICAjIExhcmdlciB5LWF4aXMgbGFiZWwgZm9udA0KICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSwgc2l6ZSA9IDE0KSwgICMgTGFyZ2VyIHgtYXhpcyB0ZXh0DQogICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0KSwgICAgICAgICAgICAgICAgICAgICAjIExhcmdlciB5LWF4aXMgdGV4dA0KICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQpLCAgICAgICAgICAgICAgICAgICAgIyBMZWdlbmQgdGl0bGUgc2l6ZQ0KICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiksICAgICAgICAgICAgICAgICAgICAgIyBMZWdlbmQgdGV4dCBzaXplDQogICAgcGFuZWwuZ3JpZC5tYWpvciA9IGVsZW1lbnRfbGluZShsaW5ldHlwZSA9ICJkb3R0ZWQiLCBjb2xvciA9ICJibGFjayIpLCAgIyBNYWpvciBncmlkIGxpbmVzDQogICAgcGFuZWwuZ3JpZC5taW5vci54ID0gZWxlbWVudF9ibGFuaygpLCAgICAgICAgICAgICAgICAgICAgICAjIE5vIG1pbm9yIHggZ3JpZCBsaW5lcw0KICAgIGF4aXMudGlja3MubGVuZ3RoID0gdW5pdCgtMC4yNSwgImNtIiksICAgICAgICAgICAgICAgICAgICAgICMgSW5jcmVhc2UgdGljayBsZW5ndGgNCiAgICBheGlzLnRpY2tzID0gZWxlbWVudF9saW5lKGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDAuNTApLCAgICMgRGFya2VyIHRpY2tzDQogICAgYXhpcy5saW5lLnggPSBlbGVtZW50X2xpbmUoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMC43NSksICAjIERhcmsgYm90dG9tIGJvcmRlcg0KICAgIGF4aXMubGluZS55ID0gZWxlbWVudF9saW5lKGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDAuNzUpICAgIyBEYXJrIGxlZnQgYm9yZGVyDQogICkNCg0KIyBQcmludCBQbG90IDINCnByaW50KHAyKQ0KDQpgYGANCg0KDQojIyBDdW11bGF0aXZlIEdyb3d0aCANCg0KIyMjIERhdGENCg0KYGBge3IgaW5kZXhfY29tcGFyaXNvbl9xcXFfY2csIGV2YWw9VFJVRSwgZWNobz1GQUxTRX0NCg0KIyBDb252ZXJ0IGNvbHVtbnMgdG8gbnVtZXJpYyBmb3IgcGxvdHRpbmcgaWYgbmVlZGVkDQojIGluZGV4X25hbWVzID0gYygiUVFRIiwgIkFBUEwiLCJOVkRBIiwgIk1TRlQiLCAiQU1aTiIsICJNRVRBIiwgIlRTTEEiLCAiQ09TVCIpIA0KDQptZXJnZWRfZGF0YSA8LSBtZXJnZWRfZGF0YSAlPiUNCiAgbXV0YXRlKA0KICAgIGBEYXRlYCA9IGFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKGBEYXRlYCkpLCAgIyBFbnN1cmUgRGF0ZSBpcyBudW1lcmljDQogICAgYWNyb3NzKGFsbF9vZihpbmRleF9uYW1lcyksIH4gYXMubnVtZXJpYyhnc3ViKCIlIiwgIiIsIC4pKSkNCiAgKQ0KDQojIFJlc2hhcGUgdGhlIGRhdGEgaW50byBsb25nIGZvcm1hdCBmb3IgZWFzeSBwbG90dGluZyBvZiBtdWx0aXBsZSBsaW5lcyBhbmQgc2V0IHRoZSBmYWN0b3Igb3JkZXINCm5ydF9sb25nIDwtIG1lcmdlZF9kYXRhICU+JQ0KICBwaXZvdF9sb25nZXIoY29scyA9IGFsbF9vZihpbmRleF9uYW1lcyksDQogICAgICAgICAgICAgICBuYW1lc190byA9ICJBR1JfSW5kZXgiLA0KICAgICAgICAgICAgICAgdmFsdWVzX3RvID0gIkFHUl9WYWx1ZSIpICU+JQ0KICBtdXRhdGUoQUdSX0luZGV4ID0gZmFjdG9yKEFHUl9JbmRleCwgbGV2ZWxzID0gaW5kZXhfbmFtZXMpKQ0KDQojIEFzc2lnbiBjb2xvcnMgZHluYW1pY2FsbHkgYmFzZWQgb24gdGhlIG9yZGVyIG9mIEFHUl9JbmRleCBpbiB0aGUgZGF0YQ0KIyBNYXRjaCB0aGUgdW5pcXVlIGxldmVscyBvZiBBR1JfSW5kZXggd2l0aCBjb2xvcnMgZnJvbSBjb2xvcnNfZ2VuZXJhbF9kYXJrDQp1bmlxdWVfdHlwZXMgPC0gdW5pcXVlKG5ydF9sb25nJEFHUl9JbmRleCkNCmN1c3RvbV9jb2xvcnMgPC0gc2V0TmFtZXMoY29sb3JzX2dlbmVyYWxfZGFya1sxOmxlbmd0aCh1bmlxdWVfdHlwZXMpXSwgdW5pcXVlX3R5cGVzKQ0KDQojIExvYWQgbmVjZXNzYXJ5IGxpYnJhcnkNCmxpYnJhcnkoZHBseXIpDQoNCiMgU3RlcCAxOiBDb252ZXJ0IHBlcmNlbnRhZ2VzIHRvIG51bWVyaWMgdmFsdWVzIGZvciBkZWZpbmVkIGluZGV4IG5hbWVzDQpjdW11bGF0aXZlX2RhdGEgPC0gbWVyZ2VkX2RhdGEgJT4lDQogIG11dGF0ZSgNCiAgICBhY3Jvc3MoYWxsX29mKGluZGV4X25hbWVzKSwgfiBhcy5udW1lcmljKGdzdWIoIiUiLCAiIiwgLikpIC8gMTAwKSAjIENvbnZlcnQgcGVyY2VudGFnZSBzdHJpbmdzIHRvIG51bWVyaWMNCiAgKQ0KDQojIFN0ZXAgMjogRW5zdXJlIHRoZSBgRGF0ZWAgY29sdW1uIGlzIHRyZWF0ZWQgYXMgYW4gaW50ZWdlcg0KY3VtdWxhdGl2ZV9kYXRhIDwtIGN1bXVsYXRpdmVfZGF0YSAlPiUNCiAgbXV0YXRlKERhdGUgPSBhcy5pbnRlZ2VyKERhdGUpKQ0KDQojIFN0ZXAgMzogQWRkIHRoZSBpbml0aWFsIHZhbHVlIGZvciAyMDE3DQpjdW11bGF0aXZlX2RhdGEgPC0gYmluZF9yb3dzKA0KICBkYXRhLmZyYW1lKERhdGUgPSBzdGFydF95ZWFyLTEsIHNldE5hbWVzKGFzLmxpc3QocmVwKDAsIGxlbmd0aChpbmRleF9uYW1lcykpKSwgaW5kZXhfbmFtZXMpKSwgIyBTZXQgZ3Jvd3RoIHJhdGVzIGZvciAyMDE3IHRvIDANCiAgY3VtdWxhdGl2ZV9kYXRhDQopDQoNCiMgU3RlcCA0OiBTb3J0IGJ5IERhdGUgYXNjZW5kaW5nIGZvciBwcm9wZXIgY3VtdWxhdGl2ZSBjYWxjdWxhdGlvbg0KY3VtdWxhdGl2ZV9kYXRhIDwtIGN1bXVsYXRpdmVfZGF0YSAlPiUNCiAgYXJyYW5nZShEYXRlKQ0KDQojIFN0ZXAgNTogSW5pdGlhbGl6ZSB0aGUgc3RhcnRpbmcgdmFsdWUNCnN0YXJ0aW5nX3ZhbHVlIDwtIDEwMA0KDQojIFN0ZXAgNjogQ2FsY3VsYXRlIGN1bXVsYXRpdmUgZ3Jvd3RoDQpjdW11bGF0aXZlX2RhdGEgPC0gY3VtdWxhdGl2ZV9kYXRhICU+JQ0KICBtdXRhdGUoDQogICAgYWNyb3NzKGFsbF9vZihpbmRleF9uYW1lcyksIH4gc3RhcnRpbmdfdmFsdWUgKiBjdW1wcm9kKDEgKyByZXBsYWNlX25hKC4sIDApKSkgIyBSZXBsYWNlIE5BIHdpdGggMCBmb3IgcHJvcGVyIGNhbGN1bGF0aW9uDQogICkNCg0KIyBTdGVwIDc6IFJlcGxhY2UgaW5pdGlhbCBncm93dGggcmF0ZXMgZm9yIDIwMTcgd2l0aCAkMTAwIGV4cGxpY2l0bHkNCmN1bXVsYXRpdmVfZGF0YSA8LSBjdW11bGF0aXZlX2RhdGEgJT4lDQogIG11dGF0ZShhY3Jvc3MoYWxsX29mKGluZGV4X25hbWVzKSwgfiBpZmVsc2UoRGF0ZSA9PSBzdGFydF95ZWFyLTEsIDEwMCwgLikpKQ0KDQojIFN0ZXAgODogUmVvcmRlciBjb2x1bW5zIGFzIERhdGUgZm9sbG93ZWQgYnkgaW5kZXggbmFtZXMNCmN1bXVsYXRpdmVfZGF0YSA8LSBjdW11bGF0aXZlX2RhdGEgJT4lDQogIHNlbGVjdChEYXRlLCBhbGxfb2YoaW5kZXhfbmFtZXMpKQ0KDQojIFN0ZXAgOTogUm91bmQgdmFsdWVzIHRvIDIgZGVjaW1hbCBwbGFjZXMNCmN1bXVsYXRpdmVfZGF0YSA8LSBjdW11bGF0aXZlX2RhdGEgJT4lDQogIG11dGF0ZShhY3Jvc3MoYWxsX29mKGluZGV4X25hbWVzKSwgfiByb3VuZCguLCAyKSkpDQoNCiMgU3RlcCAxMDogU29ydCBieSBEYXRlIGRlc2NlbmRpbmcgZm9yIHByZXNlbnRhdGlvbg0KY3VtdWxhdGl2ZV9kYXRhIDwtIGN1bXVsYXRpdmVfZGF0YSAlPiUNCiAgYXJyYW5nZShkZXNjKERhdGUpKQ0KDQojIEZvcm1hdCB0aGUgdGFibGUgd2l0aG91dCBhZGRpbmcgY29tbWFzIHRvIHRoZSBEYXRlIGNvbHVtbg0KY3VtdWxhdGl2ZV9kYXRhJERhdGUgPC0gYXMuY2hhcmFjdGVyKGN1bXVsYXRpdmVfZGF0YSREYXRlKSAgIyBFbnN1cmUgRGF0ZSBpcyBhIGNoYXJhY3RlciB3aXRob3V0IGNvbW1hcw0KY3VtdWxhdGl2ZV9kYXRhW2luZGV4X25hbWVzXSA8LSBsYXBwbHkoY3VtdWxhdGl2ZV9kYXRhW2luZGV4X25hbWVzXSwgZnVuY3Rpb24oeCkgZm9ybWF0Qyh4LCBmb3JtYXQgPSAiZiIsIGRpZ2l0cyA9IDIpKQ0KDQojIFByaW50IHRoZSBjdW11bGF0aXZlIGdyb3d0aCB0YWJsZQ0KY2F0KCJcblxuIyMjIyBDdW11bGF0aXZlIEdyb3d0aCAoIiwgbWluX3llYXIsICItIiwgbWF4X3llYXIsICIpXG4iLCBzZXAgPSAiIikNCmludGVyYWN0aXZlX3ByaW50KGN1bXVsYXRpdmVfZGF0YSkNCmludGVyYWN0aXZlX3N0cihjdW11bGF0aXZlX2RhdGEpDQpmb3JtYXRfZXF1YWxfd2lkdGgoY3VtdWxhdGl2ZV9kYXRhKQ0KDQoNCg0KYGBgDQoNClRoZSB0YWJsZSBhbmQgZ3JhcGggYmVsb3cgc2hvdyB0aGUgaW1wYWN0IG9mIHRoZSBhbm51YWwgZ3Jvd3RoIHJhdGVzLCBjb21wYXJpbmcgdGhlIGN1bXVsYXRpdmUgZ3Jvd3RoIG9mIHRoZSBpbmRleGVzIG92ZXIgYSBgciB5ZWFyX3JhbmdlYC15ZWFyIHBlcmlvZCBmcm9tIGByIHN0YXJ0X3llYXIgLSAxYCB0byBgciBlbmRfeWVhcmAsIHN0YXJ0aW5nIHdpdGggYW4gaW5pdGlhbCB2YWx1ZSBvZiAkMTAwIHBlciAxMDAlLiANCg0KIyMjIEdyYXBoIA0KDQpgYGB7ciBpbmRleF9jb21wYXJpc29uX3FxcV9jZ19ncmFwaCwgZmlnLndpZHRoPTEwLCBmaWcuaGVpZ2h0PTcsIGV2YWw9VFJVRSwgZWNobz1GQUxTRX0NCg0KY2F0KCJcblxuIyMjIyBDdW11bGF0aXZlIEdyb3d0aCBCeSBJbmRleCBcbiIpDQoNCiMgTG9hZCBuZWNlc3NhcnkgbGlicmFyaWVzDQpsaWJyYXJ5KGdncGxvdDIpDQpsaWJyYXJ5KGRwbHlyKQ0KDQojIENvbnZlcnQgY29sdW1ucyB0byBudW1lcmljIGZvciBwbG90dGluZyBpZiBuZWVkZWQNCmluZGV4X25hbWVzID0gYygiUVFRIiwgIkFBUEwiLCJOVkRBIiwgIk1TRlQiLCAiQU1aTiIsICJNRVRBIiwgIlRTTEEiLCAiQ09TVCIpIA0KDQpjdW11bGF0aXZlX2RhdGEgPC0gY3VtdWxhdGl2ZV9kYXRhICU+JQ0KICBtdXRhdGUoDQogICAgYERhdGVgID0gYXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIoYERhdGVgKSksICAjIEVuc3VyZSBEYXRlIGlzIG51bWVyaWMNCiAgICBhY3Jvc3MoYWxsX29mKGluZGV4X25hbWVzKSwgfiBhcy5udW1lcmljKGdzdWIoIiUiLCAiIiwgLikpKQ0KICApDQoNCiMgUmVzaGFwZSB0aGUgZGF0YSBpbnRvIGxvbmcgZm9ybWF0IGZvciBlYXN5IHBsb3R0aW5nIG9mIG11bHRpcGxlIGxpbmVzIGFuZCBzZXQgdGhlIGZhY3RvciBvcmRlcg0KbnJ0X2xvbmcgPC0gY3VtdWxhdGl2ZV9kYXRhICU+JQ0KICBwaXZvdF9sb25nZXIoY29scyA9IGFsbF9vZihpbmRleF9uYW1lcyksDQogICAgICAgICAgICAgICBuYW1lc190byA9ICJDR19JbmRleCIsDQogICAgICAgICAgICAgICB2YWx1ZXNfdG8gPSAiQ0dfVmFsdWUiKSAlPiUNCiAgbXV0YXRlKENHX0luZGV4ID0gZmFjdG9yKENHX0luZGV4LCBsZXZlbHMgPSBpbmRleF9uYW1lcykpDQoNCiMgQXNzaWduIGNvbG9ycyBkeW5hbWljYWxseSBiYXNlZCBvbiB0aGUgb3JkZXIgb2YgQ0dfSW5kZXggaW4gdGhlIGRhdGENCiMgTWF0Y2ggdGhlIHVuaXF1ZSBsZXZlbHMgb2YgQ0dfSW5kZXggd2l0aCBjb2xvcnMgZnJvbSBjb2xvcnNfZ2VuZXJhbF9kYXJrDQp1bmlxdWVfdHlwZXMgPC0gdW5pcXVlKG5ydF9sb25nJENHX0luZGV4KQ0KY3VzdG9tX2NvbG9ycyA8LSBzZXROYW1lcyhjb2xvcnNfZ2VuZXJhbF9kYXJrWzE6bGVuZ3RoKHVuaXF1ZV90eXBlcyldLCB1bmlxdWVfdHlwZXMpDQoNCiMgRmluZCB0aGUgbWluaW11bSBhbmQgbWF4aW11bSB4LXZhbHVlIGluIHlvdXIgZGF0YQ0KbWF4X3ggPC0gbWF4KGFzLmludGVnZXIoY3VtdWxhdGl2ZV9kYXRhJERhdGUpLCBuYS5ybSA9IFRSVUUpDQptaW5feCA8LSBtaW4oYXMuaW50ZWdlcihjdW11bGF0aXZlX2RhdGEkRGF0ZSksIG5hLnJtID0gVFJVRSkNCmludGVyYWN0aXZlX3ByaW50KG1heF94KSAgIyBUZXN0DQppbnRlcmFjdGl2ZV9wcmludChtaW5feCkgICMgVGVzdA0KDQojIEZpbmQgdGhlIG1pbmltdW0gYW5kIG1heGltdW0geWVhcg0KbWluX3llYXIgPC0gbWluKGN1bXVsYXRpdmVfZGF0YSREYXRlLCBuYS5ybSA9IFRSVUUpDQptYXhfeWVhciA8LSBtYXgoY3VtdWxhdGl2ZV9kYXRhJERhdGUsIG5hLnJtID0gVFJVRSkNCmludGVyYWN0aXZlX3ByaW50KG1pbl95ZWFyKQ0KaW50ZXJhY3RpdmVfcHJpbnQobWF4X3llYXIpDQoNCg0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiMjIFBMT1QgRlVMTCBXSVRIT1VUIExJTUlUUw0KDQojIERlZmluZSBzdGFydCBhbmQgZW5kIHllYXJzDQpzdGFydF95ZWFyIDwtIG1pbl95ZWFyICMgT3IgRGVzaXJlZCBZZWFyIA0KZW5kX3llYXIgPC0gbWF4X3llYXIgIyBPciBEZXNpcmVkIFllYXINCnllYXJfcmFuZ2UgPC0gZW5kX3llYXIgLSBzdGFydF95ZWFyICsgMSAgIyBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiB5ZWFycw0KDQojIERlZmluZSBicmVha3Mgcm91bmRlZCBhcHByb3ByaWF0ZWx5DQpsaW1pdHNfc3RhcnRfeWVhciA8LSBmbG9vcihzdGFydF95ZWFyIC8gMikgKiAyICAjIFJvdW5kIGRvd24gdG8gdGhlIG5lYXJlc3QgbXVsdGlwbGUgb2YgMg0KbGltaXRzX2VuZF95ZWFyIDwtIGNlaWxpbmcoZW5kX3llYXIgLyAyKSAqIDIgICAjIFJvdW5kIHVwIHRvIHRoZSBuZWFyZXN0IG11bHRpcGxlIG9mIDINCg0KIyBDcmVhdGUgZHluYW1pYyB0aXRsZSBhbmQgY2FwdGlvbg0KZHluYW1pY190aXRsZSA8LSBwYXN0ZTAoIkN1bXVsYXRpdmUgR3Jvd3RoIEJ5IEluZGV4IE92ZXIgIiwgeWVhcl9yYW5nZSAtIDEsICIgWWVhcnMgKCIsIHN0YXJ0X3llYXIsICItIiwgZW5kX3llYXIsICIpIikNCmR5bmFtaWNfY2FwdGlvbiA8LSBwYXN0ZTAoIkN1bXVsYXRpdmUgR3Jvd3RoIEJ5IEluZGV4LCBEYXRhIFBlcmlvZCAoIiwgc3RhcnRfeWVhciwgIi0iLCBlbmRfeWVhciwgIikiKQ0KDQojIENyZWF0ZSB0aGUgZnVsbCwgbm9uLWZpbHRlcmVkIHgtYXhpcyBwbG90IHdpdGggZHluYW1pYyB4IHBsYWNlbWVudCBmb3IgYW5ub3RhdGlvbnMNCnAxIDwtIGdncGxvdChucnRfbG9uZywgYWVzKHggPSBhcy5pbnRlZ2VyKERhdGUpLCB5ID0gQ0dfVmFsdWUsIGNvbG9yID0gQ0dfSW5kZXgpKSArDQoNCiAgIyBBZGQgc2hhZGVkIGFyZWFzIGZvciBiYWNrZ3JvdW5kIGVmZmVjdA0KICBnZW9tX3JlY3QoYWVzKHhtaW4gPSAtSW5mLCB4bWF4ID0gSW5mLCB5bWluID0gMTAwLCB5bWF4ID0gSW5mKSwgZmlsbCA9ICJsaWdodGdyZWVuIiwgYWxwaGEgPSAwLjAzMCkgKw0KICBnZW9tX3JlY3QoYWVzKHhtaW4gPSAtSW5mLCB4bWF4ID0gSW5mLCB5bWluID0gLUluZiwgeW1heCA9IDEwMCksIGZpbGwgPSAibGlnaHRjb3JhbCIsIGFscGhhID0gMC4wMzApICsNCiAgDQogICMgUGxvdCBsaW5lcyBmb3IgZWFjaCBDRyBJbmRleA0KICBnZW9tX2xpbmUoc2l6ZSA9IDEuMjUsIGFscGhhID0gMy4wKSArICAgICAgICMgTGluZSBmb3IgZWFjaCBDRw0KICBnZW9tX3BvaW50KHNpemUgPSAyLjAsIGFscGhhID0gMy4wKSArICAgICAgICMgUG9pbnRzIGZvciBlYWNoIENHDQoNCiAgbGFicygNCiAgICB0aXRsZSA9IGR5bmFtaWNfdGl0bGUsDQogICAgeCA9ICJZZWFyIiwNCiAgICB5ID0gIkNHIFZhbHVlICgxJCAvIDElKSIsDQogICAgY29sb3IgPSAiQ0cgSW5kZXgiLA0KICAgIGNhcHRpb24gPSBkeW5hbWljX2NhcHRpb24NCiAgICApICsNCiAgDQogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjdXN0b21fY29sb3JzKSArICAjIFNldCBjb2xvcnMgZm9yIGVhY2ggQ0cgSW5kZXgNCiAgc2NhbGVfeF9jb250aW51b3VzKA0KICAgIGxpbWl0cyA9IGMoc3RhcnRfeWVhciwgZW5kX3llYXIpLCANCiAgICBicmVha3MgPSBzZXEobGltaXRzX3N0YXJ0X3llYXIsIGxpbWl0c19lbmRfeWVhciwgMikgICMgUmVzdHJpY3QgJiBTZXQgTWFqb3IgeC1heGlzIGxpbmVzIGZvciBlYWNoIHllYXINCiAgKSArIA0KICANCiAgdGhlbWVfbWluaW1hbCgpICsNCiAgdGhlbWUoDQogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSwgc2l6ZSA9IDIwKSwgICAgICAgICAjIExhcmdlciB0aXRsZSBmb250DQogICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCksICAgICAgICAgICAgICAgICAgICAjIExhcmdlciB4LWF4aXMgbGFiZWwgZm9udA0KICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQpLCAgICAgICAgICAgICAgICAgICAgIyBMYXJnZXIgeS1heGlzIGxhYmVsIGZvbnQNCiAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEsIHNpemUgPSAxNCksICAjIExhcmdlciB4LWF4aXMgdGV4dA0KICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCksICAgICAgICAgICAgICAgICAgICAgIyBMYXJnZXIgeS1heGlzIHRleHQNCiAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0KSwgICAgICAgICAgICAgICAgICAgICMgTGVnZW5kIHRpdGxlIHNpemUNCiAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIpLCAgICAgICAgICAgICAgICAgICAgICMgTGVnZW5kIHRleHQgc2l6ZQ0KICAgIHBhbmVsLmdyaWQubWFqb3IgPSBlbGVtZW50X2xpbmUobGluZXR5cGUgPSAiZG90dGVkIiwgY29sb3IgPSAiYmxhY2siKSwgICMgTWFqb3IgZ3JpZCBsaW5lcw0KICAgIHBhbmVsLmdyaWQubWlub3IueCA9IGVsZW1lbnRfYmxhbmsoKSwgICAgICAgICAgICAgICAgICAgICAgIyBObyBtaW5vciB4IGdyaWQgbGluZXMNCiAgICBheGlzLnRpY2tzLmxlbmd0aCA9IHVuaXQoLTAuMjUsICJjbSIpLCAgICAgICAgICAgICAgICAgICAgICAjIEluY3JlYXNlIHRpY2sgbGVuZ3RoDQogICAgYXhpcy50aWNrcyA9IGVsZW1lbnRfbGluZShjb2xvciA9ICJibGFjayIsIHNpemUgPSAwLjUwKSwgICAjIERhcmtlciB0aWNrcw0KICAgIGF4aXMubGluZS54ID0gZWxlbWVudF9saW5lKGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDAuNzUpLCAgIyBEYXJrIGJvdHRvbSBib3JkZXINCiAgICBheGlzLmxpbmUueSA9IGVsZW1lbnRfbGluZShjb2xvciA9ICJibGFjayIsIHNpemUgPSAwLjc1KSAgICMgRGFyayBsZWZ0IGJvcmRlcg0KICApDQoNCiMgUHJpbnQgdGhlIHBsb3QgDQpwcmludChwMSkNCg0KDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KIyMgUExPVCBFWENMVURJTkcgTlZEQSBBTkQgVFNMQQ0KDQojIFNFQ09ORCBQTE9UOiBFeGNsdWRlIE5WREEgYW5kIFRTTEENCmV4Y2x1ZGVkX2luZGljZXMgPC0gc2V0ZGlmZihpbmRleF9uYW1lcywgYygiTlZEQSIsICJUU0xBIikpDQoNCm5ydF9sb25nX2V4Y2x1ZGVkIDwtIGN1bXVsYXRpdmVfZGF0YSAlPiUNCiAgcGl2b3RfbG9uZ2VyKGNvbHMgPSBhbGxfb2YoZXhjbHVkZWRfaW5kaWNlcyksDQogICAgICAgICAgICAgICBuYW1lc190byA9ICJDR19JbmRleCIsDQogICAgICAgICAgICAgICB2YWx1ZXNfdG8gPSAiQ0dfVmFsdWUiKSAlPiUNCiAgbXV0YXRlKENHX0luZGV4ID0gZmFjdG9yKENHX0luZGV4LCBsZXZlbHMgPSBleGNsdWRlZF9pbmRpY2VzKSkNCg0KY3VzdG9tX2NvbG9yc19leGNsdWRlZCA8LSBzZXROYW1lcyhjb2xvcnNfZ2VuZXJhbF9kYXJrWzE6bGVuZ3RoKGV4Y2x1ZGVkX2luZGljZXMpXSwgZXhjbHVkZWRfaW5kaWNlcykNCg0KcDIgPC0gZ2dwbG90KG5ydF9sb25nX2V4Y2x1ZGVkLCBhZXMoeCA9IGFzLmludGVnZXIoRGF0ZSksIHkgPSBDR19WYWx1ZSwgY29sb3IgPSBDR19JbmRleCkpICsNCg0KICAjIEFkZCBzaGFkZWQgYXJlYXMgZm9yIGJhY2tncm91bmQgZWZmZWN0DQogIGdlb21fcmVjdChhZXMoeG1pbiA9IC1JbmYsIHhtYXggPSBJbmYsIHltaW4gPSAxMDAsIHltYXggPSBJbmYpLCBmaWxsID0gImxpZ2h0Z3JlZW4iLCBhbHBoYSA9IDAuMDMwKSArDQogIGdlb21fcmVjdChhZXMoeG1pbiA9IC1JbmYsIHhtYXggPSBJbmYsIHltaW4gPSAtSW5mLCB5bWF4ID0gMTAwKSwgZmlsbCA9ICJsaWdodGNvcmFsIiwgYWxwaGEgPSAwLjAzMCkgKw0KICANCiAgIyBQbG90IGxpbmVzIGZvciBlYWNoIENHIEluZGV4DQogIGdlb21fbGluZShzaXplID0gMS4yNSwgYWxwaGEgPSAzLjApICsgICAgICAgIyBMaW5lIGZvciBlYWNoIENHDQogIGdlb21fcG9pbnQoc2l6ZSA9IDIuMCwgYWxwaGEgPSAzLjApICsgICAgICAgIyBQb2ludHMgZm9yIGVhY2ggQ0cNCg0KICBsYWJzKA0KICAgIHRpdGxlID0gIkN1bXVsYXRpdmUgR3Jvd3RoIEV4Y2x1ZGluZyBOVkRBIGFuZCBUU0xBIiwNCiAgICB4ID0gIlllYXIiLA0KICAgIHkgPSAiQ0cgVmFsdWUgKDEkIC8gMSUpIiwNCiAgICBjb2xvciA9ICJDRyBJbmRleCIsDQogICAgY2FwdGlvbiA9ICJFeGNsdWRpbmcgTlZEQSBhbmQgVFNMQSINCiAgICApICsNCiAgDQogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjdXN0b21fY29sb3JzX2V4Y2x1ZGVkKSArICAjIFNldCBjb2xvcnMgZm9yIGVhY2ggQ0cgSW5kZXgNCiAgc2NhbGVfeF9jb250aW51b3VzKA0KICAgIGxpbWl0cyA9IGMoc3RhcnRfeWVhciwgZW5kX3llYXIpLCANCiAgICBicmVha3MgPSBzZXEobGltaXRzX3N0YXJ0X3llYXIsIGxpbWl0c19lbmRfeWVhciwgMikgICMgUmVzdHJpY3QgJiBTZXQgTWFqb3IgeC1heGlzIGxpbmVzIGZvciBlYWNoIHllYXINCiAgKSArIA0KICANCiAgdGhlbWVfbWluaW1hbCgpICsNCiAgdGhlbWUoDQogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSwgc2l6ZSA9IDIwKSwgICAgICAgICAjIExhcmdlciB0aXRsZSBmb250DQogICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCksICAgICAgICAgICAgICAgICAgICAjIExhcmdlciB4LWF4aXMgbGFiZWwgZm9udA0KICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQpLCAgICAgICAgICAgICAgICAgICAgIyBMYXJnZXIgeS1heGlzIGxhYmVsIGZvbnQNCiAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEsIHNpemUgPSAxNCksICAjIExhcmdlciB4LWF4aXMgdGV4dA0KICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCksICAgICAgICAgICAgICAgICAgICAgIyBMYXJnZXIgeS1heGlzIHRleHQNCiAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0KSwgICAgICAgICAgICAgICAgICAgICMgTGVnZW5kIHRpdGxlIHNpemUNCiAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIpLCAgICAgICAgICAgICAgICAgICAgICMgTGVnZW5kIHRleHQgc2l6ZQ0KICAgIHBhbmVsLmdyaWQubWFqb3IgPSBlbGVtZW50X2xpbmUobGluZXR5cGUgPSAiZG90dGVkIiwgY29sb3IgPSAiYmxhY2siKSwgICMgTWFqb3IgZ3JpZCBsaW5lcw0KICAgIHBhbmVsLmdyaWQubWlub3IueCA9IGVsZW1lbnRfYmxhbmsoKSwgICAgICAgICAgICAgICAgICAgICAgIyBObyBtaW5vciB4IGdyaWQgbGluZXMNCiAgICBheGlzLnRpY2tzLmxlbmd0aCA9IHVuaXQoLTAuMjUsICJjbSIpLCAgICAgICAgICAgICAgICAgICAgICAjIEluY3JlYXNlIHRpY2sgbGVuZ3RoDQogICAgYXhpcy50aWNrcyA9IGVsZW1lbnRfbGluZShjb2xvciA9ICJibGFjayIsIHNpemUgPSAwLjUwKSwgICAjIERhcmtlciB0aWNrcw0KICAgIGF4aXMubGluZS54ID0gZWxlbWVudF9saW5lKGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDAuNzUpLCAgIyBEYXJrIGJvdHRvbSBib3JkZXINCiAgICBheGlzLmxpbmUueSA9IGVsZW1lbnRfbGluZShjb2xvciA9ICJibGFjayIsIHNpemUgPSAwLjc1KSAgICMgRGFyayBsZWZ0IGJvcmRlcg0KICApDQoNCiMgUHJpbnQgdGhlIHNlY29uZCBwbG90DQpwcmludChwMikNCg0KYGBgDQoNCg0KIyBFTkQNCg0KPCEtLQ0KIyBGVVRVUkUgQ09OU0lERVJBVElPTlMNCg0KVGhlcmUgYXJlIGh1bmRyZWRzIG9mIEVURnMgYW5kIHB1YmxpY2x5IHRyYWRlZCBzdG9jayBjb21wYW5pZXMgdGhhdCBvbmUgY2FuIGV4cGxvcmUuIFRoZXNlIG1heSBpbmNsdWRlIG90aGVyIEVURnMgc3VjaCBhcyB0aGUgVmFuZ3VhcmQgVkdUIEVURiAoaHR0cHM6Ly9pbnZlc3Rvci52YW5ndWFyZC5jb20vaW52ZXN0bWVudC1wcm9kdWN0cy9ldGZzL3Byb2ZpbGUvdmd0I3ByaWNlKSBhbmQgQmxhY2tSb2NrIEVURnMgKGh0dHBzOi8vd3d3LmJsYWNrcm9jay5jb20vdXMvaW5kaXZpZHVhbC9wcm9kdWN0cy9pbnZlc3RtZW50LWZ1bmRzKSwgaW5kaXZpZHVhbCBjb21wYW5pZXMgKGUuZy4sIEFBUEwsIE1TRlQpLCBhbmQgb3RoZXIgcG9ydGZvbGlvcyB0eXBlcyAoUmV0aXJlbWVudC1QbGFuIFBvcnRmb2xpb3MsIGV0YykuDQoNCjwhLS0gDQojIE9USEVSIEFOQUxZVElDQUwgREVTSUdOUyAvIE1PREVMUw0KDQojIyBQcm9qZWN0aW9ucyANCg0KQ29uc2lkZXIgdG8gY3JlYXRlIGZ1dHVyZSBwcm9qZWN0aW9ucyBmb3IgaW5kZXhlcyBiYXNlZCBvbiBoaXN0b3JpY2FsIGRhdGEuIA0KDQoxLiBTaW1wbGUgQXZlcmFnZSBHcm93dGggUHJvamVjdGlvbjoNCi0gVXNlIHRoZSBoaXN0b3JpY2FsIENBR1Igb3IgTWVhbiBHcm93dGggUmF0ZSBhcyB0aGUgYXNzdW1lZCBhbm51YWwgZ3Jvd3RoIHJhdGUgZm9yIGZ1dHVyZSB5ZWFycy4gDQotIEFwcGx5IHRoaXMgcmF0ZSBjdW11bGF0aXZlbHkgdG8gcHJvamVjdCBmdXR1cmUgdmFsdWVzLg0KDQoyLiBNb250ZSBDYXJsbyBTaW11bGF0aW9uOg0KLSBJbmNvcnBvcmF0ZSBoaXN0b3JpY2FsIG1lYW4gYW5kIHZvbGF0aWxpdHkgKHN0YW5kYXJkIGRldmlhdGlvbikgdG8gc2ltdWxhdGUgcmFuZG9tIHJldHVybnMgb3ZlciB0aW1lLg0KLSBHZW5lcmF0ZSBtdWx0aXBsZSBzY2VuYXJpb3MgYW5kIHRha2UgdGhlIGF2ZXJhZ2UgdG8gcmVwcmVzZW50IHBvc3NpYmxlIGZ1dHVyZSB0cmFqZWN0b3JpZXMuDQoNCjMuIFJlZ3Jlc3Npb24gQW5hbHlzaXM6DQotIEZpdCBhIHRyZW5kbGluZSAobGluZWFyLCBwb2x5bm9taWFsLCBvciBleHBvbmVudGlhbCkgdG8gaGlzdG9yaWNhbCBkYXRhIHRvIHByb2plY3QgZnV0dXJlIHBlcmZvcm1hbmNlLg0KLSBJbmNvcnBvcmF0ZSB0aW1lIGFzIHRoZSBpbmRlcGVuZGVudCB2YXJpYWJsZSBhbmQgZ3Jvd3RoIHJhdGVzIGFzIHRoZSBkZXBlbmRlbnQgdmFyaWFibGUuDQoNCjQuIFNjZW5hcmlvLUJhc2VkIFByb2plY3Rpb25zOg0KLSBEZXZlbG9wIG9wdGltaXN0aWMsIG1vZGVyYXRlLCBhbmQgcGVzc2ltaXN0aWMgc2NlbmFyaW9zIGJhc2VkIG9uIHRoZSBNaW4gQ0FHUiBSYW5nZSBhbmQgTWF4IENBR1IgUmFuZ2UgKGUuZy4sIGhpc3RvcmljYWwgbWVhbiDCsSBzdGFuZGFyZCBkZXZpYXRpb24pLg0KLSBVc2UgdGhlc2UgdG8gY3JlYXRlIGEgcmFuZ2Ugb2YgcG9zc2libGUgb3V0Y29tZXMuDQoNCiMjIENQSSB2cyBJbmRleA0KDQotIENvbnNpZGVyIHRvIG1hdGNoIHRoZSBDUEkgSW5mbGF0aW9uIFJhdGUocykgdG8gdGhlIEluZGV4LiBDb25zaWRlciB0byBtdWx0aXBseSBpbmZsYXRpb24gcmF0ZXMgZm9yIG1hZ25pZmljYXRpb24gcHVycG9zZXMgdG8gY29tcGFyZSByZWxhdGlvbnNoaXAgYmV0d2VlbiBpbmRleGVzIChlZyB4NC1TUFggYW5kIHg1LVFRUSkNCg0KLS0+