About

This document contains analysis of recent data regarding wage taxes, licensing, zoning, and mobility related to Philadelphia’s nighttime economy. These analyses are internal research by Philadelphia City Council’s Arts and Culture Task Force, Nightlife Committee. They are presented here for public documentation, reproducibility, and transparency.

Analysis by Michael Fichman of Philadelphia City Council’s Arts and Culture Task Force, Nightlife Committee.

Wage tax revenue data obtained from Philadelphia Controller’s Office, updated for the 2021 tax year, 3/8/2022. All other data obtained from Open Data Philly or Indigo Bike Share in April, May and June of 2022.

For code base used to synthesize these data, refer to the code download button at the top of this document or visit the github repository for this page - https://github.com/mafichman/ACTF_nightlife

Questions, contact

1. Hospitality Wage Tax Receipts, 2014-2022

Quarterly wage tax receipts for industries in the arts and hospitality were dramatically impacted by the pandemic which began in March, 2020, and have not fully recovered.

Data on nighttime-specific industries tend not to be subdivided by day and nighttime activity in wage tax data.

All dollar values adjusted for inflation (2021 dollars) based on BLS guidelines.

1.1. Tax revenues by year in millions of dollars

year Arts, Entertainment, and Other Recreation Hotels Restaurants
2014 8.78 9.47 36.89
2015 14.35 12.10 52.20
2016 16.06 12.18 55.62
2017 16.21 11.87 57.90
2018 16.65 12.44 59.19
2019 18.48 12.83 61.75
2020 13.26 6.53 41.47
2021 12.63 7.81 43.26

1.3. Tax Revenue in Pandemic Year 1

Year over year losses - Pandemic Year 1 - Wage tax revenues during March, 2020 - December, 2021 relative to March, 2019 - February, 2020.

As gross (in millions of US dollars, adjust for inflation to 2021 dollars) and as a percentage change.

Hospitality industries were hit much harder than the economy as a whole, where losses were ~9%

variable Pre-pandemic year Pandemic year 1 Pct_Change
All Sectors 1964.94 1787.38 -9.04
Arts_Entertainment_Recreation 16.51 10.81 -34.52
Hotels 11.55 4.75 -58.87
Restaurants 55.84 33.08 -40.76

1.4. Tax Loss Estimates and Recovery Timeline

Tax revenues by the end of 2021 are still falling short of expected, meaning that recovery has not been achieved. Expected revenues are based on 2014-2020(TY Q1) trends (based on year, quarter and sector) and adjusted for inflation to 2021 dollars.

Projected revenues are climbing back towards pre-pandemic status-quo.

Wage tax losses since the beginning of 2020, relative to projections based on 2014-19, are still as much as $2 million per quarter by sector.

On a percentage basis, this looks like the following:

Total tax shortfalls (compared to pre-pandemic trend) since March, 2020, in millions (2021 dollars)

sector Est Loss (millions)
Arts, Entertainment, and Other Recreation -14.89
Hotels -18.68
Restaurants -36.95

2. Amusement Tax Receipts

Data from Philadelphia City Controller’s Office - 5/18/2022.

Source:

https://raw.githubusercontent.com/PhilaController/phl-budget-data/main/src/phl_budget_data/data/processed/revenue/city-collections.csv

2.1. Timeline of Amusement Tax Revenues

1.3. Tax Loss Estimates and Recovery Timeline

Starting in late 2021, amusement tax revenues began to near pre-pandemic levels and seasonal patterns, but have only surpassed pre-2020 trends in two months since the pandemic began. Monthly tax revenues are still off between 10-50% with some strong fluctuations from month to month.

It’s not clear whether this trend is homogeneous across the entertainment sector. Since March, 2020 - the total loss in amusement taxes is approximately $37.1M.

Expected revenues are based on 2014-2020(TY Q1) trends (based on OLS models incorporating year and month) and adjusted for inflation to 2021 dollars.

Estimated total losses in Amusement tax revenue since March, 2020. Based on differences between actual and predicted revenues from OLS regression controlling for year and seasonality (month), in 2021 dollars

Est Loss (millions)
-37.15

3. Save Our Stages Grants

This repo contains interactive maps and analysis of SBA Grants given as part of the “Save Our Stages” Act passed by the US Congress.

The data being used here have been geocoded using the Google Geocoding service, which is highly accurate but not error free. Data are current as of August 17, 2021, and are available from the SBA.

3.1. Grantee map

The following map shows the grantee locations.

3.2. Philadelphia SVOG grant breakdown:

Num Grants Grants Total Mean Grant Median Grant
68 88135486 1296110 247143.4

3.3. Phila SVOG searchable database:

4. Zoning and Assembly Licenses

A Special Assembly Occupancy License (SAOL) is the highest form of license for assembly for entertainment for 50+ people (non-seated). In combination with an amusement license and regular business licenses, this is what you usually need to open a venue. These licenses are difficult to get, and can be expensive. Much expense and risk is incurred when you need a zoning variance (and council approval) or to go through a zoning process triggered by a special exception.

SAOLs are only available by right in very few zoning categories, most of these the most expensive land in Center City. Recently, people have NOT been taking out licenses in CC, they have been going through zoning processes in nearby neighborhoods with transit access and clusters of amenities, and SAOLs have been going extinct much faster than they are being created.

There are a few opportunities for Council to make SAOLs easier to access - one is by supporting operators in getting variances, two is by opening up more zoning districts to SAOLs by right.

24HrPHL put together a “playbook” for how to obtain a SAOL in 2019 that was vetted by then L&I Commissioner Dave Perri.

The number of active SAOLs in Philadelphia is declining, and the places where people want to (or can afford to) build creative spaces are not the places where they are available by-right. Only 28% of active SAOLs are in by-right districts - rate of by-right development of SAOL businesses has been relatively constant for over 15 years.

Frequently, people are applying for SAOLs in CMX-2.5 properties - where this use is availabe by special exception Opening CMX-2.5 to by-right SAOL would more than double the amount of commercial parcels eligible for by-right SAOL.

FALSE Reading layer `Zoning_BaseDistricts' from data source 
FALSE   `https://opendata.arcgis.com/datasets/0bdb0b5f13774c03abf8dc2f1aa01693_0.geojson' 
FALSE   using driver `GeoJSON'
FALSE Simple feature collection with 29152 features and 13 fields
FALSE Geometry type: MULTIPOLYGON
FALSE Dimension:     XY
FALSE Bounding box:  xmin: -75.28023 ymin: 39.87082 xmax: -74.95581 ymax: 40.13786
FALSE Geodetic CRS:  WGS 84
FALSE Reading layer `OGRGeoJSON' from data source 
FALSE   `https://phl.carto.com/api/v2/sql?q=SELECT+*+FROM+business_licenses&filename=business_licenses&format=geojson&skipfields=cartodb_id' 
FALSE   using driver `GeoJSON'
FALSE replacing null geometries with empty geometries
FALSE Simple feature collection with 388626 features and 41 fields (with 17510 geometries empty)
FALSE Geometry type: POINT
FALSE Dimension:     XY
FALSE Bounding box:  xmin: -75.27421 ymin: 39.88057 xmax: -74.95819 ymax: 40.1374
FALSE Geodetic CRS:  WGS 84

4.1. Summary of SAOL-eligible Districts

Assembly is allowed by right in four zoning districts, and by special exception in four others.

Here are some very basic descriptions of these types of zones, with information sourced from Anastasio Law - http://phillyzoning.com/

By Right

-CA-2 - Auto-oriented commercial

-CMX-4 - Commercial Mixed Use, mostly found in Center City or along major arterials like Broad, Market or Chestnut Streets

-CMX-5 - Commercial Mixed Use, found in the core of Center City office districts

-ICMX - Commercial/Industrial uses designed as a buffer between commercial and residential uses

Special Exception

-CMX-2 - Neighborhood commercial corridor, mixed use - e.g. Baltimore Avenue, Germantown Avenue

-CMX-2.5 - Commercial mixed use designed to promote pedestrian-friendly uses

-CMX-3 - Lower density commercial mixed use than CMX 4&5, found on major corridors like Kensington Ave, South St, Broad south of Washington.

-IRMX - “Low impact” industrial, including artist spaces

City-wide, roughly 26% of commercial districts (by area) are zoned for assembly by right. Much of this area is in large Center City tracts where creative spaces are unlikely to be developed due to cost or constraints of the land.

assembly_allowed sum_area Pct
By-Right 78538211 [US_survey_foot^2] 26.37 [1]
Not Permitted 42801765 [US_survey_foot^2] 14.37 [1]
Special Exception 176471533 [US_survey_foot^2] 59.26 [1]

4.2. City-wide zoning examination

The majority of areas zoned for assembly by-right are in Center City. This is not where most development of creative entertainment is taking place.

Take a look at districts outside Center City like Fishtown - by-right SAOL is not really allowed by-right anywhere.

These static maps represent the same information but are designed to be used in the Task Force written report or with printed materials.

SAOL zoning status:

SAOL license locations, by zoning status:

4.3. SAOL issuance timeline

There are currently 121 SAOLs active in Philly, and 88 of those license holders also have amusement licenses.

Very few SAOLs are issued in Philly, and especially few the last two years. The following chart shows the date when SAOL’s were issued. 2006 probably has data inflated by the start of the record-keeping period for these data.

Record numbers of licenses became inactive in 2020… The following chart shows the years in which SAOL’s became inactive. Meanwhile, the real estate market is getting much more competitive and entertainment wages are slow to recover (see Section 1 of this document).

4.4. SAOLs and By-Right Zoning

Among active Special Assembly Occupancy Licenses, only 35 (28%) were permitted by right in the zones where they were created.

assembly_allowed LONG_CODE n_licenses pct
By-Right CA-2 4 3.23
By-Right CMX-4 10 8.06
By-Right CMX-5 16 12.90
By-Right ICMX 2 1.61
Not Permitted CA-1 3 2.42
Not Permitted CMX-1 7 5.65
Not Permitted I-1 1 0.81
Not Permitted I-2 5 4.03
Not Permitted I-3 1 0.81
Not Permitted RM-1 3 2.42
Not Permitted RSA-3 2 1.61
Not Permitted RSA-5 5 4.03
Not Permitted SP-STA 1 0.81
Special Exception CMX-2 23 18.55
Special Exception CMX-2.5 10 8.06
Special Exception CMX-3 23 18.55
Special Exception IRMX 3 2.42
NA NA 5 4.03
assembly_allowed n_licenses pct
By-Right 32 25.81
Not Permitted 28 22.58
Special Exception 59 47.58
NA 5 4.03

Has this phenomenon been changing over time? Not much in the last 15 years!

5. Amusement Licenses

Here is an activation/inactivation timeline for amusement licenses - these data appear to start being reliable in about 2015 - in 2014, hundreds of licenses were added to the register (possibly due to a recording sprint).

Next steps -

How is this related to property costs / tax rates / valuation? How many can we verify are music venues vs, say adult entertainment? Are temporary assembly licenses in the data set? How good are these data, really?

6. Firearm Incidents at Night in Philadelphia

There is ongoing concern about gun crime in Philadelphia. Gun crime is rising for the city as a whole. 2021 was a particularly bad year for gun crime. According to FBI’s uniform crime report, national rates of violent crime are down substantially from peak recorded levels in the 1990s.

This section analyzes Philadelphia Police Department (PPD) firearm incident reports from January, 2017 to June, 2022 in relation to the location of Commerce Dept. designated [commercial corridors]https://www.opendataphilly.org/dataset/commercial-corridors, and the location of food service, sidewalk cafe, special assembly occupancy, and entertainment licenses. We do not have specific information about when specific establishments open or close.

Keep in mind that these are reported incidents - subject to bias in observation, reporting, and classification.

The major takeaways from our analysis are as follows:

  1. Firearm incidents are rising for the city as a whole.

  2. Most incidents happen at night, between approximately 11PM and 1AM.

  3. Gun crime at night mostly happens away from establishments in commercial corridors (~88%), and mostly concentrated in neighborhoods with high volumes of incidents.

  4. If you are near a licensed establishment at night in a place with relatively low gun crime, you are much, much less likely to be exposed to an incident than if you are elsewhere.

  5. Eastern segments of South Street are some of the highest traffic local nightlife corridors and draw a very wide scope of visitors, but have comparatively low frequencies of incidents.

## Reading layer `OGRGeoJSON' from data source 
##   `https://phl.carto.com/api/v2/sql?q=SELECT+*+FROM+business_licenses&filename=business_licenses&format=geojson&skipfields=cartodb_id' 
##   using driver `GeoJSON'
## replacing null geometries with empty geometries
## Simple feature collection with 388626 features and 41 fields (with 17510 geometries empty)
## Geometry type: POINT
## Dimension:     XY
## Bounding box:  xmin: -75.27421 ymin: 39.88057 xmax: -74.95819 ymax: 40.1374
## Geodetic CRS:  WGS 84
## Reading layer `538ab13a-be43-4ab4-9a25-150600c805e62020329-1-gbhj2k.x1k7m' from data source `https://opendata.arcgis.com/datasets/f43e5f92d34e41249e7a11f269792d11_0.geojson' 
##   using driver `GeoJSON'
## Simple feature collection with 279 features and 79 fields
## Geometry type: MULTIPOLYGON
## Dimension:     XY
## Bounding box:  xmin: -75.27572 ymin: 39.87086 xmax: -74.95575 ymax: 40.13498
## Geodetic CRS:  WGS 84

6.1. Time patterns of firearm incidents

We examined a category of incidents recorded between January 1, 2017 and June 27, 2022 - incidents classified by the PPD as Criminal Homicide, Robbery with a Firearm, Aggravated Assault with a Firearm.

Most gun crime, overall, happens in the evening, between about 11 PM and 1AM, with much of it concentrated around midnight.

The following plots show all firearm incidents since 2020, broken down by day of the week and hour reported. The 12PM (0h) time of day has the highest reporting count by far of any time of day. It is unclear how much of that is related to record-keeping practices, but it doesn’t seem like there’s a pattern.

6.2. Spatial Pattern of Nighttime Incidents

We related these firearm incidents (and other violent crime incidents) to two types of data, wanting to know how frequently incidents were happening near hospitality locations at night.

  1. Philadelphia Licenses and Inspections records of Amusement, Special Assembly Occupancy Licenses, Sidewalk Cafe licenses, and any type of Food Establishment License. and

  2. Commercial corridor boundaries kept by the Department of Commerce.

Keep in mind - we do not know particularly when these establishments are open and closed. We don’t know if an incident at 11PM outside a restaurant happens while that restaurant is in active operation. We filtered out incidents that took place near license locations when those licenses were not active (e.g. before they were created).


We examined a wide variety of violent crimes in commercial corridors and within 200 feet of restaurants, assembly and amusement businesses. This timeline shows that at any time of day, any day of the week, there are far more incidents of aggravated assault, robbery, theft, rape, sexual crimes, and homicide away from areas of hospitality activity.

It is substantially more likely one will be exposed to a violent crime at almost any hour of the day away from a licensed establishment at any time of day, as compared to a weekend night near a licensed establishment.

On average, commercial corridors have about as many incidents city-wide at 4PM as they do at 10 or PM. For the most part, violence on corridors does not spike on weekends, surprisingly.

Incidents in commercial areas, near establishments make up 10-15% of incidents city-wide at night - a steady rate for over 5 years. (As of 6/10, 1950 total incidents 6PM-6AM, 222 w/in 200 ft of a business in a corridor). We don’t have info about specific open/close hours to know exactly what businesses might have been open during what incidents.

Incidents in corridors track the city’s overall trends pretty closely.

Incidents within 200 feet of a licensed establishment also track general trends - notice how few incidents take place near establishments.

6.3. Interactive Map of Commercial Corridors

This interactive map shows the total number of firearm incidents 6PM-6AM since 2017 reported in the City’s commercial corridors. Hover over each specific area to see a breakdown of incidents by year.

Some commentary regarding this map:

By far, the corridors in the city with the most firearm incidents (aggravated assault, robbery, homicide) are the ones in areas with epidemic gun violence (e.g. Kensington and Allegheny, Broad and Hunting Park, 60th and Market). This intensity is especially pronounced when you consider their size.

South Street is one of the most popular nighttime destinations in the City - averaging about 330% of the nighttime visitors compared to an average Philly corridor. It has one of the highest distances travelled by the average visitor. Students of mine analyzed phone GPS data from third parties to these corridors at night - you can look at how many people go to each corridor and from where using this app: https://sabrinasmlee.github.io/exploratory_page/home.html

South Street has a fairly low incidence of violent crime 6PM-6AM given its popularity as a regional destination. Parts of South Street west of 8th St have seen multiple years in the last 5 without a single incident. South & 8th to the Waterfront is slightly higher - with 9 firearm-related incidents in 2021, but a general average of 2-6 per year.

Center City has had some uptick in nighttime gun crime in 2021 - but about 1/3rd of these incidents were not near establishments. Given how much stuff was closed, I wouldn’t be surprised if a lot of this was happening in the absence of nightlife programming.

Next up for analysis

overlays, Mobility trends, PPP data, Illuminate the Arts grants

Bike Share and Mobility

Philadelphia Bike Share Q2, 2021

LS0tDQp0aXRsZTogIkFDVEYgTmlnaHRsaWZlIERhdGEgQW5hbHlzaXMiDQphdXRob3I6ICJNaWNoYWVsIEZpY2htYW4iDQpkYXRlOiAiSnVuZSAyOCwgMjAyMiINCm91dHB1dDogDQogIGh0bWxfZG9jdW1lbnQ6DQogICAgdG9jOiB0cnVlDQogICAgdG9jX2Zsb2F0OiB0cnVlDQogICAgY29kZV9mb2xkaW5nOiAiaGlkZSINCiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlDQotLS0NCg0KYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9DQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IFRSVUUpDQoNCmxpYnJhcnkodGlkeXZlcnNlKQ0KbGlicmFyeShyZWFkeGwpDQpsaWJyYXJ5KGx1YnJpZGF0ZSkNCmxpYnJhcnkoa2FibGVFeHRyYSkNCmxpYnJhcnkobGVhZmxldCkNCmxpYnJhcnkobGVhZmxldC5leHRyYXMpDQpsaWJyYXJ5KGxlYWZsZXQucHJvdmlkZXJzKQ0KbGlicmFyeShzZikNCmxpYnJhcnkoZ2dtYXApDQpsaWJyYXJ5KERUKQ0KbGlicmFyeSh0aWdyaXMpDQpsaWJyYXJ5KG1hcHZpZXcpDQoNCnBsb3RUaGVtZSA8LSB0aGVtZSgNCiAgcGxvdC50aXRsZSA9ZWxlbWVudF90ZXh0KHNpemU9MTIpLA0KICBwbG90LnN1YnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9OCksDQogIHBsb3QuY2FwdGlvbiA9IGVsZW1lbnRfdGV4dChzaXplID0gNiksDQogIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMCwgYW5nbGUgPSA0NSwgaGp1c3QgPSAxKSwNCiAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEwKSwNCiAgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMCksDQogICMgU2V0IHRoZSBlbnRpcmUgY2hhcnQgcmVnaW9uIHRvIGJsYW5rDQogIHBhbmVsLmJhY2tncm91bmQ9ZWxlbWVudF9ibGFuaygpLA0KICBwbG90LmJhY2tncm91bmQ9ZWxlbWVudF9ibGFuaygpLA0KICAjcGFuZWwuYm9yZGVyPWVsZW1lbnRfcmVjdChjb2xvdXI9IiNGMEYwRjAiKSwNCiAgIyBGb3JtYXQgdGhlIGdyaWQNCiAgcGFuZWwuZ3JpZC5tYWpvcj1lbGVtZW50X2xpbmUoY29sb3VyPSIjRDBEMEQwIixzaXplPS43NSksDQogIGF4aXMudGlja3M9ZWxlbWVudF9ibGFuaygpKQ0KDQptYXBUaGVtZSA8LSB0aGVtZShwbG90LnRpdGxlID1lbGVtZW50X3RleHQoc2l6ZT0xMiksDQogICAgICAgICAgICAgICAgICBwbG90LnN1YnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9OCksDQogICAgICAgICAgICAgICAgICBwbG90LmNhcHRpb24gPSBlbGVtZW50X3RleHQoc2l6ZSA9IDYpLA0KICAgICAgICAgICAgICAgICAgYXhpcy5saW5lPWVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgICAgICAgICAgIGF4aXMudGV4dC54PWVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgICAgICAgICAgIGF4aXMudGV4dC55PWVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgICAgICAgICAgIGF4aXMudGlja3M9ZWxlbWVudF9ibGFuaygpLA0KICAgICAgICAgICAgICAgICAgYXhpcy50aXRsZS54PWVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgICAgICAgICAgIGF4aXMudGl0bGUueT1lbGVtZW50X2JsYW5rKCksDQogICAgICAgICAgICAgICAgICBwYW5lbC5iYWNrZ3JvdW5kPWVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgICAgICAgICAgIHBhbmVsLmJvcmRlcj1lbGVtZW50X2JsYW5rKCksDQogICAgICAgICAgICAgICAgICBwYW5lbC5ncmlkLm1ham9yPWVsZW1lbnRfbGluZShjb2xvdXIgPSAndHJhbnNwYXJlbnQnKSwNCiAgICAgICAgICAgICAgICAgIHBhbmVsLmdyaWQubWlub3I9ZWxlbWVudF9ibGFuaygpLA0KICAgICAgICAgICAgICAgICAgbGVnZW5kLmRpcmVjdGlvbiA9ICJ2ZXJ0aWNhbCIsIA0KICAgICAgICAgICAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gInJpZ2h0IiwNCiAgICAgICAgICAgICAgICAgIHBsb3QubWFyZ2luID0gbWFyZ2luKDEsIDEsIDEsIDEsICdjbScpLA0KICAgICAgICAgICAgICAgICAgbGVnZW5kLmtleS5oZWlnaHQgPSB1bml0KDEsICJjbSIpLCBsZWdlbmQua2V5LndpZHRoID0gdW5pdCgwLjIsICJjbSIpKQ0KDQojdGhlIG1hZ2ljIGhhcHBlbnMgaGVyZSAtIGdnbWFwIGZ1bmN0aW9uDQpsbCA8LSBmdW5jdGlvbihkYXQsIHByb2o0ID0gNDMyNil7DQogIHN0X3RyYW5zZm9ybShkYXQsIHByb2o0KQ0KfQ0KDQp3YWdlX3RheF9yZXZlbnVlIDwtIHJlYWRfZXhjZWwoIn4vR2l0SHViL0FDVEZfbmlnaHRsaWZlL2RhdGEvd2FnZS10YXgtcmV2ZW51ZS54bHN4IikgJT4lDQogIHJlbmFtZShBcnRzX0VudGVydGFpbm1lbnRfUmVjcmVhdGlvbiA9ICdBcnRzLCBFbnRlcnRhaW5tZW50LCBhbmQgT3RoZXIgUmVjcmVhdGlvbicpICU+JQ0KICBtdXRhdGUoeWVhciA9IHllYXIoeW1kKGRhdGUpKSwNCiAgICAgICAgIG1vbnRoID0gbW9udGgoeW1kKGRhdGUpKSkNCg0KIyBMb2FkIGRhdGEsIHJlbW92ZSBkdXBsaWNhdGVzLCBhZGp1c3QgZm9yIGluZmxhdGlvbiB0byAyMDIxIGRvbGxhcnMNCndhZ2VfdGF4X3JldmVudWVfbmV3IDwtIHJlYWQuY3N2KCJodHRwczovL3BobC1idWRnZXQtZGF0YXNldHRlLmhlcm9rdWFwcC5jb20vcmV2ZW51ZS93YWdlLWNvbGxlY3Rpb25zLWJ5LXNlY3Rvci5jc3Y/c2VjdG9yX19pbj0lNUIlMjJIb3RlbHMlMjIlMkMrJTIyQXJ0cyUyQytFbnRlcnRhaW5tZW50JTJDK2FuZCtPdGhlcitSZWNyZWF0aW9uJTIyJTJDKyUyMlJlc3RhdXJhbnRzJTIyJTVEJl9zb3J0X2Rlc2M9ZGF0ZSZfc2l6ZT1tYXgiKSAlPiUNCiAgICBtdXRhdGUoeWVhciA9IHllYXIoeW1kKGRhdGUpKSwNCiAgICAgICAgICAgbW9udGggPSBtb250aCh5bWQoZGF0ZSkpKSAlPiUNCiAgc2VsZWN0KC1yb3dpZCkgJT4lDQogIGdyb3VwX2J5KGZpc2NhbF95ZWFyLCBmaXNjYWxfcXVhcnRlciwgc2VjdG9yKSAlPiUNCiAgc2xpY2UoMSkgJT4lDQogIHVuZ3JvdXAoKSAlPiUNCiAgbXV0YXRlKHRvdGFsID0gY2FzZV93aGVuKHllYXIgPT0gMjAxNCB+IHRvdGFsICogMS4xMiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHllYXIgPT0gMjAxNSB+IHRvdGFsICogMS4xMiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHllYXIgPT0gMjAxNiB+IHRvdGFsICogMS4xMCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHllYXIgPT0gMjAxNyB+IHRvdGFsICogMS4wOCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHllYXIgPT0gMjAxOCB+IHRvdGFsICogMS4wNiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHllYXIgPT0gMjAxOSB+IHRvdGFsICogMS4wNCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHllYXIgPT0gMjAyMCB+IHRvdGFsICogMS4wMSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHllYXIgPT0gMjAyMSB+IHRvdGFsKSkNCg0KIyBDb3VudHkgU2hhcGVmaWxlDQpwaGlsYV9zaHAgPC0gY291bnRpZXMoIlBBIikgJT4lDQogIGZpbHRlcihOQU1FID09ICJQaGlsYWRlbHBoaWEiKSAlPiUNCiAgc3RfYXNfc2YoY3JzID0gNDMyNikNCg0KIyBMb2FkIGRpc3RyaWN0cyBmcm9tIE9wZW5EYXRhUGhpbGx5DQpjb3VuY2lsRGlzdHJpY3RzIDwtIHN0X3JlYWQoImh0dHBzOi8vb3BlbmRhdGEuYXJjZ2lzLmNvbS9kYXRhc2V0cy85Mjk4YzJmM2ZhMzI0MWZiYjE3NmZmMWU4NGQzMzM2MF8wLmdlb2pzb24iKSAlPiUNCiAgc3RfdHJhbnNmb3JtKGNycyA9IDQzMjYpIA0KDQpgYGANCg0KIyBBYm91dA0KDQpUaGlzIGRvY3VtZW50IGNvbnRhaW5zIGFuYWx5c2lzIG9mIHJlY2VudCBkYXRhIHJlZ2FyZGluZyB3YWdlIHRheGVzLCBsaWNlbnNpbmcsIHpvbmluZywgYW5kIG1vYmlsaXR5IHJlbGF0ZWQgdG8gUGhpbGFkZWxwaGlhJ3MgbmlnaHR0aW1lIGVjb25vbXkuIFRoZXNlIGFuYWx5c2VzIGFyZSBpbnRlcm5hbCByZXNlYXJjaCBieSBQaGlsYWRlbHBoaWEgQ2l0eSBDb3VuY2lsJ3MgQXJ0cyBhbmQgQ3VsdHVyZSBUYXNrIEZvcmNlLCBOaWdodGxpZmUgQ29tbWl0dGVlLiBUaGV5IGFyZSBwcmVzZW50ZWQgaGVyZSBmb3IgcHVibGljIGRvY3VtZW50YXRpb24sIHJlcHJvZHVjaWJpbGl0eSwgYW5kIHRyYW5zcGFyZW5jeS4NCg0KQW5hbHlzaXMgYnkgTWljaGFlbCBGaWNobWFuIG9mIFBoaWxhZGVscGhpYSBDaXR5IENvdW5jaWwncyBBcnRzIGFuZCBDdWx0dXJlIFRhc2sgRm9yY2UsIE5pZ2h0bGlmZSBDb21taXR0ZWUuIA0KDQpXYWdlIHRheCByZXZlbnVlIGRhdGEgb2J0YWluZWQgZnJvbSBQaGlsYWRlbHBoaWEgQ29udHJvbGxlcidzIE9mZmljZSwgdXBkYXRlZCBmb3IgdGhlIDIwMjEgdGF4IHllYXIsIDMvOC8yMDIyLiBBbGwgb3RoZXIgZGF0YSBvYnRhaW5lZCBmcm9tIE9wZW4gRGF0YSBQaGlsbHkgb3IgSW5kaWdvIEJpa2UgU2hhcmUgaW4gQXByaWwsIE1heSBhbmQgSnVuZSBvZiAyMDIyLg0KDQpGb3IgY29kZSBiYXNlIHVzZWQgdG8gc3ludGhlc2l6ZSB0aGVzZSBkYXRhLCByZWZlciB0byB0aGUgY29kZSBkb3dubG9hZCBidXR0b24gYXQgdGhlIHRvcCBvZiB0aGlzIGRvY3VtZW50IG9yIHZpc2l0IHRoZSBnaXRodWIgcmVwb3NpdG9yeSBmb3IgdGhpcyBwYWdlIC0gaHR0cHM6Ly9naXRodWIuY29tL21hZmljaG1hbi9BQ1RGX25pZ2h0bGlmZQ0KDQpRdWVzdGlvbnMsIGNvbnRhY3QgbWZpY2htYW5AdXBlbm4uZWR1DQoNCiMgMS4gSG9zcGl0YWxpdHkgV2FnZSBUYXggUmVjZWlwdHMsIDIwMTQtMjAyMg0KDQpRdWFydGVybHkgd2FnZSB0YXggcmVjZWlwdHMgZm9yIGluZHVzdHJpZXMgaW4gdGhlIGFydHMgYW5kIGhvc3BpdGFsaXR5IHdlcmUgZHJhbWF0aWNhbGx5IGltcGFjdGVkIGJ5IHRoZSBwYW5kZW1pYyB3aGljaCBiZWdhbiBpbiBNYXJjaCwgMjAyMCwgYW5kIGhhdmUgbm90IGZ1bGx5IHJlY292ZXJlZC4gDQoNCkRhdGEgb24gbmlnaHR0aW1lLXNwZWNpZmljIGluZHVzdHJpZXMgdGVuZCBub3QgdG8gYmUgc3ViZGl2aWRlZCBieSBkYXkgYW5kIG5pZ2h0dGltZSBhY3Rpdml0eSBpbiB3YWdlIHRheCBkYXRhLg0KDQpBbGwgZG9sbGFyIHZhbHVlcyBhZGp1c3RlZCBmb3IgaW5mbGF0aW9uICgyMDIxIGRvbGxhcnMpIGJhc2VkIG9uIEJMUyBndWlkZWxpbmVzLg0KDQpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBlY2hvPUZBTFNFfQ0Kd2FnZV90YXhfcmV2ZW51ZV9uZXcgJT4lDQogIGdyb3VwX2J5KGRhdGUsIHNlY3RvcikgJT4lDQogIHN1bW1hcml6ZShzdW0gPSBzdW0odG90YWwpLA0KICAgICAgICAgICAgc3VtID0gcm91bmQoKHN1bS8xMDAwMDAwKSwgZGlnaXRzID0gMikpICU+JQ0KICBnZ3Bsb3QoKSsNCiAgZ2VvbV9saW5lKGFlcyh4ID0gYXMuRGF0ZShkYXRlKSwgeT1zdW0sIGNvbG9yID0gc2VjdG9yKSkrDQogIHlsYWIoIlF1YXJ0ZXJseSBXYWdlIFRheCBSZXZlbnVlICgkIE1pbGxpb25zKSIpKw0KICB4bGFiKCJEYXRlIikrDQogIGxhYnMoDQogICAgdGl0bGUgPSAiUGhpbGFkZWxwaGlhIFdhZ2UgVGF4IFJlY2VpcHRzIGZvciBUaHJlZSBIb3NwaXRhbGl0eSBJbmR1c3RyaWVzIiwNCiAgICBzdWJ0aXRsZSA9ICJBZGp1c3RlZCBmb3IgaW5mbGF0aW9uIHRvIDIwMjEgRG9sbGFycy4gU291cmNlOiBQaGlsYWRlbHBoaWEgQ2l0eSBDb250cm9sbGVyJ3MgT2ZmaWNlLCBCTFMiKSsNCiAgcGxvdFRoZW1lDQpgYGANCg0KIyMgMS4xLiBUYXggcmV2ZW51ZXMgYnkgeWVhciBpbiBtaWxsaW9ucyBvZiBkb2xsYXJzDQoNCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGVjaG89RkFMU0V9DQp3YWdlX3RheF9yZXZlbnVlX25ldyAlPiUNCiAgZ3JvdXBfYnkoeWVhciwgc2VjdG9yKSAlPiUNCiAgc3VtbWFyaXplKHN1bSA9IHN1bSh0b3RhbCkpICU+JQ0KICBtdXRhdGUoc3VtID0gcm91bmQoKHN1bS8xMDAwMDAwKSwgZGlnaXRzID0gMikpICU+JQ0KICBzcHJlYWQoc2VjdG9yLCBzdW0pICU+JQ0KICBrYWJsZSgpICU+JQ0KICBrYWJsZV9zdHlsaW5nKCkNCg0KYGBgDQojIyAxLjMuIFRheCBSZXZlbnVlIGluIFBhbmRlbWljIFllYXIgMQ0KDQpZZWFyIG92ZXIgeWVhciBsb3NzZXMgLSBQYW5kZW1pYyBZZWFyIDEgLSBXYWdlIHRheCByZXZlbnVlcyBkdXJpbmcgTWFyY2gsIDIwMjAgLSBEZWNlbWJlciwgMjAyMSByZWxhdGl2ZSB0byBNYXJjaCwgMjAxOSAtIEZlYnJ1YXJ5LCAyMDIwLg0KDQpBcyBncm9zcyAoaW4gbWlsbGlvbnMgb2YgVVMgZG9sbGFycywgYWRqdXN0IGZvciBpbmZsYXRpb24gdG8gMjAyMSBkb2xsYXJzKSBhbmQgYXMgYSBwZXJjZW50YWdlIGNoYW5nZS4NCg0KSG9zcGl0YWxpdHkgaW5kdXN0cmllcyB3ZXJlIGhpdCBtdWNoIGhhcmRlciB0aGFuIHRoZSBlY29ub215IGFzIGEgd2hvbGUsIHdoZXJlIGxvc3NlcyB3ZXJlIH45JQ0KDQpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBlY2hvPUZBTFNFfQ0Kd2FnZV90YXhfcmV2ZW51ZSAlPiUNCiAgcmVuYW1lKCJBbGwgU2VjdG9ycyIgPSBUb3RhbCkgJT4lDQogIG11dGF0ZShwYW5kZW1pYyA9IGNhc2Vfd2hlbih5ZWFyID09IDIwMjAgJiBtb250aCA+PTMgfiAiTWFyY2gyMDIwX0ZlYjIwMjEiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeWVhciA9PSAyMDIxIH4gIk1hcmNoMjAyMF9GZWIyMDIxIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHllYXIgPT0gMjAyMCAmIG1vbnRoIDwzIH4gIk1hcmNoMjAxOV9GZWIyMDIwIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHllYXIgPT0gMjAxOSAmIG1vbnRoID4gMyB+ICJNYXJjaDIwMTlfRmViMjAyMCIpKSAlPiUNCiAgZmlsdGVyKGlzLm5hKHBhbmRlbWljKSA9PSBGQUxTRSkgJT4lDQogIHNlbGVjdCgtZGF0ZSwgLW1vbnRoLCAteWVhciApICU+JQ0KICBnYXRoZXIoLXBhbmRlbWljLCBrZXkgPSAidmFyaWFibGUiLCB2YWx1ZSA9ICJ2YWx1ZSIpICU+JQ0KICBncm91cF9ieShwYW5kZW1pYywgdmFyaWFibGUpICU+JQ0KICBzdW1tYXJpemUoc3VtID0gc3VtKHZhbHVlKSkgJT4lDQogIG11dGF0ZShzdW0gPSByb3VuZCgoc3VtLzEwMDAwMDApLCBkaWdpdHMgPSAyKSkgJT4lDQogIHNwcmVhZChwYW5kZW1pYywgc3VtKSAlPiUNCiAgbXV0YXRlKFBjdF9DaGFuZ2UgPSByb3VuZCgxMDAqKChNYXJjaDIwMjBfRmViMjAyMSAtIE1hcmNoMjAxOV9GZWIyMDIwKS8gTWFyY2gyMDE5X0ZlYjIwMjApLCBkaWdpdHMgPSAyKSkgJT4lDQogIHJlbmFtZSgiUHJlLXBhbmRlbWljIHllYXIiID0gTWFyY2gyMDE5X0ZlYjIwMjAsDQogICAgICAgICAiUGFuZGVtaWMgeWVhciAxIiA9IE1hcmNoMjAyMF9GZWIyMDIxKSAlPiUNCiAga2FibGUoKSAlPiUNCiAga2FibGVfc3R5bGluZygpDQoNCmBgYA0KDQojIyAxLjQuIFRheCBMb3NzIEVzdGltYXRlcyBhbmQgUmVjb3ZlcnkgVGltZWxpbmUNCg0KVGF4IHJldmVudWVzIGJ5IHRoZSBlbmQgb2YgMjAyMSBhcmUgc3RpbGwgZmFsbGluZyBzaG9ydCBvZiBleHBlY3RlZCwgbWVhbmluZyB0aGF0IHJlY292ZXJ5IGhhcyBub3QgYmVlbiBhY2hpZXZlZC4gRXhwZWN0ZWQgcmV2ZW51ZXMgYXJlIGJhc2VkIG9uIDIwMTQtMjAyMChUWSBRMSkgdHJlbmRzIChiYXNlZCBvbiB5ZWFyLCBxdWFydGVyIGFuZCBzZWN0b3IpIGFuZCBhZGp1c3RlZCBmb3IgaW5mbGF0aW9uIHRvIDIwMjEgZG9sbGFycy4NCg0KYGBge3IgbW9kZWwsIHdhcm5pbmcgPSBGQUxTRSwgbWVzc2FnZSA9IEZBTFNFLCBpbmNsdWRlPUZBTFNFfQ0KbW9kZWwgPC0gbG0oZGF0YSA9IHdhZ2VfdGF4X3JldmVudWVfbmV3ICU+JSBmaWx0ZXIoeWVhciA8IDIwMjApICU+JSBzZWxlY3Qoc2VjdG9yLCBmaXNjYWxfcXVhcnRlciwgeWVhciwgdG90YWwpLCB0b3RhbCB+IGFzLmZhY3RvcihmaXNjYWxfcXVhcnRlcikgKyB5ZWFyICsgc2VjdG9yKQ0KDQpzdW1tYXJ5KG1vZGVsKQ0KDQoNCnByZWRpY3QobW9kZWwsIHdhZ2VfdGF4X3JldmVudWVfbmV3KSAlPiUgDQogIGFzLmRhdGEuZnJhbWUoKSAlPiUgDQogIHJlbmFtZShwcmVkID0gIi4iKSAlPiUgDQogIGNiaW5kKC4sIHdhZ2VfdGF4X3JldmVudWVfbmV3KSAtPiB3YWdlX3RheF9yZXZlbnVlX25ldw0KYGBgDQoNClByb2plY3RlZCByZXZlbnVlcyBhcmUgY2xpbWJpbmcgYmFjayB0b3dhcmRzIHByZS1wYW5kZW1pYyBzdGF0dXMtcXVvLg0KDQpgYGB7ciBwcm9qZWN0aW9uX2NoYXJ0LCB3YXJuaW5nID0gRkFMU0UsIG1lc3NhZ2UgPSBGQUxTRSwgZWNobz1GQUxTRX0NCndhZ2VfdGF4X3JldmVudWVfbmV3ICU+JQ0KICBncm91cF9ieShkYXRlLCBzZWN0b3IsIHllYXIsIG1vbnRoKSAlPiUgDQogIHN1bW1hcml6ZShBY3R1YWwgPSBzdW0odG90YWwpLCANCiAgICAgICAgICAgIFByZS5QYW5kZW1pYy5UcmVuZCA9IHN1bShwcmVkKSkgJT4lIA0KICBmaWx0ZXIoeWVhciA+PSAyMDE4KSAlPiUNCiAgdW5ncm91cCgpICU+JQ0KICBzZWxlY3QoZGF0ZSwgc2VjdG9yLCBBY3R1YWwsIFByZS5QYW5kZW1pYy5UcmVuZCkgJT4lDQogIGdhdGhlcigtc2VjdG9yLCAtIGRhdGUsIGtleSA9ICJ2YXJpYWJsZSIsIHZhbHVlID0gInZhbHVlIikgJT4lDQogIG11dGF0ZSh2YWx1ZV9tID0gcm91bmQodmFsdWUvMTAwMDAwMCwgZGlnaXRzID0gMikpICU+JQ0KICBnZ3Bsb3QoKSsNCiAgICBnZW9tX2xpbmUoYWVzKHggPSBhcy5EYXRlKGRhdGUpLCB5PXZhbHVlX20sIGNvbG9yID0gdmFyaWFibGUpKSsgDQogICAgZ2VvbV9saW5lKGFlcyh4ID0gYXMuRGF0ZShkYXRlKSwgeT12YWx1ZV9tLCBjb2xvciA9IHZhcmlhYmxlKSwgDQogICAgICAgICAgICBsaW5ldHlwZSA9ICJkYXNoZWQiLCBhbHBoYSA9IDAuNSkrDQogIGZhY2V0X3dyYXAofnNlY3RvcikrDQogICAgeWxhYigiUXVhcnRlcmx5IFdhZ2UgVGF4IFJldmVudWUgKCQgTWlsbGlvbnMpIikrDQogICAgeGxhYigiRGF0ZSIpKw0KICAgIGxhYnMoDQogICAgICAgIHRpdGxlID0gIlBoaWxhZGVscGhpYSBXYWdlIFRheCBTaG9ydGZhbGxzIiwNCiAgICAgICAgc3VidGl0bGUgPSAiQWRqdXN0ZWQgZm9yIGluZmxhdGlvbiB0byAyMDIxIERvbGxhcnMuXG4gVHJlbmQgYmFzZWQgb24gMjAxNC0yMDE5IHJlZ3Jlc3Npb24gY29udHJvbGxpbmcgZm9yIHllYXIsIHF1YXJ0ZXIsIHNlY3Rvci4gXG5Tb3VyY2U6IFBoaWxhZGVscGhpYSBDaXR5IENvbnRyb2xsZXIncyBPZmZpY2UsIEJMUyIpKw0KICAgIHBsb3RUaGVtZQ0KDQpgYGANCg0KV2FnZSB0YXggbG9zc2VzIHNpbmNlIHRoZSBiZWdpbm5pbmcgb2YgMjAyMCwgcmVsYXRpdmUgdG8gcHJvamVjdGlvbnMgYmFzZWQgb24gMjAxNC0xOSwgYXJlIHN0aWxsIGFzIG11Y2ggYXMgJDIgbWlsbGlvbiBwZXIgcXVhcnRlciBieSBzZWN0b3IuDQoNCmBgYHtyIHByb2plY3Rpb25fY2hhcnRfYmFyLCB3YXJuaW5nID0gRkFMU0UsIG1lc3NhZ2UgPSBGQUxTRSwgZWNobz1GQUxTRX0NCndhZ2VfdGF4X3JldmVudWVfbmV3ICU+JQ0KICBncm91cF9ieShkYXRlLCBzZWN0b3IsIHllYXIsIG1vbnRoKSAlPiUgDQogIHN1bW1hcml6ZShBY3R1YWwgPSBzdW0odG90YWwpLCANCiAgICAgICAgICAgIFByZS5QYW5kZW1pYy5UcmVuZCA9IHN1bShwcmVkKSkgJT4lIA0KICBtdXRhdGUobG9zcyA9IEFjdHVhbCAtIFByZS5QYW5kZW1pYy5UcmVuZCkgJT4lDQogIGZpbHRlcih5ZWFyID49IDIwMjApICU+JQ0KICB1bmdyb3VwKCkgJT4lDQogIHNlbGVjdChkYXRlLCBzZWN0b3IsIGxvc3MpICU+JQ0KICBnYXRoZXIoLXNlY3RvciwgLSBkYXRlLCBrZXkgPSAidmFyaWFibGUiLCB2YWx1ZSA9ICJ2YWx1ZSIpICU+JQ0KICBtdXRhdGUodmFsdWVfbSA9IHJvdW5kKHZhbHVlLzEwMDAwMDAsIGRpZ2l0cyA9IDIpKSAlPiUNCiAgZ2dwbG90KCkrDQogICAgZ2VvbV9iYXIoYWVzKHggPSBhcy5EYXRlKGRhdGUpLCB5PXZhbHVlX20pLCBzdGF0ID0gImlkZW50aXR5IiwgY29sb3IgPSAiZ3JleSIpKyANCiAgZmFjZXRfd3JhcCh+c2VjdG9yKSsNCiAgICB5bGFiKCJRdWFydGVybHkgV2FnZSBUYXggUmV2ZW51ZSBzaG9ydGZhbGwgKCQgTWlsbGlvbnMpIikrDQogICAgeGxhYigiRGF0ZSIpKw0KICAgIGxhYnMoDQogICAgICAgIHRpdGxlID0gIlBoaWxhZGVscGhpYSBXYWdlIFRheCBSZWNlaXB0cyB2cy4gUHJlLVBhbmRlbWljIFRyZW5kcyIsDQogICAgICAgIHN1YnRpdGxlID0gIkFkanVzdGVkIGZvciBpbmZsYXRpb24gdG8gMjAyMSBEb2xsYXJzLiBTb3VyY2U6IFBoaWxhZGVscGhpYSBDaXR5IENvbnRyb2xsZXIncyBPZmZpY2UsIEJMUyIpKw0KICAgIHBsb3RUaGVtZQ0KDQpgYGANCg0KT24gYSBwZXJjZW50YWdlIGJhc2lzLCB0aGlzIGxvb2tzIGxpa2UgdGhlIGZvbGxvd2luZzoNCg0KYGBge3Igc2hvcnRmYWxsX3BjdCwgd2FybmluZyA9IEZBTFNFLCBtZXNzYWdlID0gRkFMU0UsIGVjaG89RkFMU0V9DQp3YWdlX3RheF9yZXZlbnVlX25ldyAlPiUNCiAgICBncm91cF9ieShkYXRlLCBzZWN0b3IsIHllYXIsIG1vbnRoKSAlPiUgDQogICAgc3VtbWFyaXplKEFjdHVhbCA9IHN1bSh0b3RhbCksIA0KICAgICAgICAgICAgICBQcmUuUGFuZGVtaWMuVHJlbmQgPSBzdW0ocHJlZCksIA0KICAgICAgICAgICAgICBwY3RfZGlmZiA9IDEwMCooKEFjdHVhbC1QcmUuUGFuZGVtaWMuVHJlbmQpL1ByZS5QYW5kZW1pYy5UcmVuZCkpICU+JQ0KICAgIGZpbHRlcih5ZWFyID49IDIwMjApICU+JQ0KICAgIGdncGxvdCgpKw0KICAgIGdlb21fYmFyKGFlcyh4ID0gYXMuRGF0ZShkYXRlKSwgeT1wY3RfZGlmZiksIHN0YXQgPSAiaWRlbnRpdHkiLCBwb3NpdGlvbiA9ICJkb2RnZSIpKyANCiAgICBmYWNldF93cmFwKH5zZWN0b3IpKw0KICAgIHlsYWIoIlF1YXJ0ZXJseSBUYXggUmV2ZW51ZSB2cy4gRXhwZWN0ZWQgKCUpIikrDQogICAgeGxhYigiRGF0ZSIpKw0KICAgIGxhYnMoDQogICAgICAgIHRpdGxlID0gIlBoaWxhZGVscGhpYSBXYWdlIFRheCAtIFBlcmNlbnRhZ2UgU2hvcnRmYWxsIHZzIFByZS1QYW5kZW1pYyBUcmVuZHMiLA0KICAgICAgICBzdWJ0aXRsZSA9ICJBZGp1c3RlZCBmb3IgaW5mbGF0aW9uIHRvIDIwMjEgRG9sbGFycy5cbiBUcmVuZCBiYXNlZCBvbiAyMDE0LTIwMTkgcmVncmVzc2lvbiBjb250cm9sbGluZyBmb3IgeWVhciwgcXVhcnRlciwgc2VjdG9yLiBcblNvdXJjZTogUGhpbGFkZWxwaGlhIENpdHkgQ29udHJvbGxlcidzIE9mZmljZSwgQkxTIikrDQogICAgcGxvdFRoZW1lDQpgYGANCg0KVG90YWwgdGF4IHNob3J0ZmFsbHMgKGNvbXBhcmVkIHRvIHByZS1wYW5kZW1pYyB0cmVuZCkgc2luY2UgTWFyY2gsIDIwMjAsIGluIG1pbGxpb25zICgyMDIxIGRvbGxhcnMpDQoNCmBgYHtyIGxvc3Nfc3VtbWFyeSwgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCg0Kd2FnZV90YXhfcmV2ZW51ZV9uZXcgJT4lDQogIGdyb3VwX2J5KGRhdGUsIHNlY3RvciwgeWVhciwgbW9udGgpICU+JSANCiAgc3VtbWFyaXplKEFjdHVhbCA9IHN1bSh0b3RhbCksIA0KICAgICAgICAgICAgUHJlLlBhbmRlbWljLlRyZW5kID0gc3VtKHByZWQpKSAlPiUgDQogIG11dGF0ZShsb3NzID0gQWN0dWFsIC0gUHJlLlBhbmRlbWljLlRyZW5kKSAlPiUNCiAgdW5ncm91cCgpICU+JQ0KICBmaWx0ZXIoeWVhciA9PSAyMDIwICYgbW9udGggPj0zIHwgeWVhciA+IDIwMjApICU+JQ0KICBncm91cF9ieShzZWN0b3IpICU+JQ0KICBzdW1tYXJpemUoIkVzdCBMb3NzIChtaWxsaW9ucykiID0gcm91bmQoc3VtKGxvc3MpLzEwMDAwMDAsIGRpZ2l0cyA9IDIpKSAlPiUNCiAga2FibGUoKQ0KDQpgYGANCg0KIyAyLiBBbXVzZW1lbnQgVGF4IFJlY2VpcHRzDQoNCkRhdGEgZnJvbSBQaGlsYWRlbHBoaWEgQ2l0eSBDb250cm9sbGVyJ3MgT2ZmaWNlIC0gNS8xOC8yMDIyLg0KDQpTb3VyY2U6DQoNCmh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9QaGlsYUNvbnRyb2xsZXIvcGhsLWJ1ZGdldC1kYXRhL21haW4vc3JjL3BobF9idWRnZXRfZGF0YS9kYXRhL3Byb2Nlc3NlZC9yZXZlbnVlL2NpdHktY29sbGVjdGlvbnMuY3N2DQoNCg0KYGBge3IgbG9hZF9hbXVzZW1lbnQsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGVjaG89RkFMU0V9DQphbXVzZW1lbnQgPC0gcmVhZC5jc3YoImh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9QaGlsYUNvbnRyb2xsZXIvcGhsLWJ1ZGdldC1kYXRhL21haW4vc3JjL3BobF9idWRnZXRfZGF0YS9kYXRhL3Byb2Nlc3NlZC9yZXZlbnVlL2NpdHktY29sbGVjdGlvbnMuY3N2IikgJT4lDQogIGZpbHRlcihuYW1lID09ICJhbXVzZW1lbnQiKSAlPiUNCiAgICBtdXRhdGUoeWVhciA9IHllYXIoeW1kKGRhdGUpKSwNCiAgICAgICAgICAgbW9udGggPSBtb250aCh5bWQoZGF0ZSkpKSAlPiUNCiAgbXV0YXRlKHRvdGFsID0gY2FzZV93aGVuKHllYXIgPT0gMjAxNCB+IHRvdGFsICogMS4xMiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHllYXIgPT0gMjAxNSB+IHRvdGFsICogMS4xMiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHllYXIgPT0gMjAxNiB+IHRvdGFsICogMS4xMCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHllYXIgPT0gMjAxNyB+IHRvdGFsICogMS4wOCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHllYXIgPT0gMjAxOCB+IHRvdGFsICogMS4wNiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHllYXIgPT0gMjAxOSB+IHRvdGFsICogMS4wNCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHllYXIgPT0gMjAyMCB+IHRvdGFsICogMS4wMSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHllYXIgPT0gMjAyMSB+IHRvdGFsLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHllYXIgPT0gMjAyMiB+IHRvdGFsKSkNCg0KYGBgDQoNCiMjIDIuMS4gVGltZWxpbmUgb2YgQW11c2VtZW50IFRheCBSZXZlbnVlcw0KDQpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBlY2hvPUZBTFNFfQ0KYW11c2VtZW50ICU+JQ0KICBncm91cF9ieShkYXRlKSAlPiUNCiAgc3VtbWFyaXplKHN1bSA9IHN1bSh0b3RhbCksDQogICAgICAgICAgICBzdW0gPSByb3VuZCgoc3VtLzEwMDAwMDApLCBkaWdpdHMgPSAyKSkgJT4lDQogIGdncGxvdCgpKw0KICBnZW9tX2xpbmUoYWVzKHggPSBhcy5EYXRlKGRhdGUpLCB5PXN1bSkpKw0KICB5bGFiKCJNb250aGx5IEFtdXNlbWVudCBUYXggUmV2ZW51ZSAoJCBNaWxsaW9ucykiKSsNCiAgeGxhYigiRGF0ZSIpKw0KICBsYWJzKA0KICAgIHRpdGxlID0gIlBoaWxhZGVscGhpYSBBbXVzZW1lbnQgVGF4IFJlY2VpcHRzIiwNCiAgICBzdWJ0aXRsZSA9ICJBZGp1c3RlZCBmb3IgaW5mbGF0aW9uIHRvIDIwMjEgRG9sbGFycy4gU291cmNlOiBQaGlsYWRlbHBoaWEgQ2l0eSBDb250cm9sbGVyJ3MgT2ZmaWNlIikrDQogIHBsb3RUaGVtZQ0KYGBgDQoNCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGVjaG89RkFMU0V9DQphbXVzZW1lbnQgJT4lDQogIGdyb3VwX2J5KHllYXIpICU+JQ0KICBzdW1tYXJpemUoc3VtID0gc3VtKHRvdGFsKSwNCiAgICAgICAgICAgIHN1bSA9IHJvdW5kKChzdW0vMTAwMDAwMCksIGRpZ2l0cyA9IDIpKSAlPiUNCiAgZ2dwbG90KCkrDQogIGdlb21fYmFyKGFlcyh4ID0geWVhciwgeT1zdW0pLCBzdGF0ID0gImlkZW50aXR5IikrDQogIHlsYWIoIk1vbnRobHkgQW11c2VtZW50IFRheCBSZXZlbnVlICgkIE1pbGxpb25zKSIpKw0KICB4bGFiKCJEYXRlIikrDQogIGxhYnMoDQogICAgdGl0bGUgPSAiUGhpbGFkZWxwaGlhIEFtdXNlbWVudCBUYXggUmVjZWlwdHMiLA0KICAgIHN1YnRpdGxlID0gIjIwMjIgRGF0YSBhcmUgdGhyb3VnaCBBcHJpbC4gQWRqdXN0ZWQgZm9yIGluZmxhdGlvbiB0byAyMDIxIERvbGxhcnMuIFNvdXJjZTogUGhpbGFkZWxwaGlhIENpdHkgQ29udHJvbGxlcidzIE9mZmljZSIpKw0KICBwbG90VGhlbWUNCg0KDQpgYGANCg0KIyMgMS4zLiBUYXggTG9zcyBFc3RpbWF0ZXMgYW5kIFJlY292ZXJ5IFRpbWVsaW5lDQoNClN0YXJ0aW5nIGluIGxhdGUgMjAyMSwgYW11c2VtZW50IHRheCByZXZlbnVlcyBiZWdhbiB0byBuZWFyIHByZS1wYW5kZW1pYyBsZXZlbHMgYW5kIHNlYXNvbmFsIHBhdHRlcm5zLCBidXQgaGF2ZSBvbmx5IHN1cnBhc3NlZCBwcmUtMjAyMCB0cmVuZHMgaW4gdHdvIG1vbnRocyBzaW5jZSB0aGUgcGFuZGVtaWMgYmVnYW4uIE1vbnRobHkgdGF4IHJldmVudWVzIGFyZSBzdGlsbCBvZmYgYmV0d2VlbiAxMC01MCUgd2l0aCBzb21lIHN0cm9uZyBmbHVjdHVhdGlvbnMgZnJvbSBtb250aCB0byBtb250aC4NCg0KSXQncyBub3QgY2xlYXIgd2hldGhlciB0aGlzIHRyZW5kIGlzIGhvbW9nZW5lb3VzIGFjcm9zcyB0aGUgZW50ZXJ0YWlubWVudCBzZWN0b3IuIFNpbmNlIE1hcmNoLCAyMDIwIC0gdGhlIHRvdGFsIGxvc3MgaW4gYW11c2VtZW50IHRheGVzIGlzIGFwcHJveGltYXRlbHkgJDM3LjFNLg0KDQpFeHBlY3RlZCByZXZlbnVlcyBhcmUgYmFzZWQgb24gMjAxNC0yMDIwKFRZIFExKSB0cmVuZHMgKGJhc2VkIG9uIE9MUyBtb2RlbHMgaW5jb3Jwb3JhdGluZyB5ZWFyIGFuZCBtb250aCkgYW5kIGFkanVzdGVkIGZvciBpbmZsYXRpb24gdG8gMjAyMSBkb2xsYXJzLg0KDQpgYGB7ciBtb2RlbF9hbXVzZW1lbnQsIHdhcm5pbmcgPSBGQUxTRSwgbWVzc2FnZSA9IEZBTFNFLCBpbmNsdWRlPUZBTFNFfQ0KbW9kZWxfYW11c2VtZW50IDwtIGxtKGRhdGEgPSBhbXVzZW1lbnQgJT4lIGZpbHRlcih5ZWFyIDwgMjAyMCkgJT4lIHNlbGVjdChtb250aCwgeWVhciwgdG90YWwpLCB0b3RhbCB+IGFzLmZhY3Rvcihtb250aCkgKyB5ZWFyKQ0KDQpzdW1tYXJ5KG1vZGVsX2FtdXNlbWVudCkNCg0KDQpwcmVkaWN0KG1vZGVsX2FtdXNlbWVudCwgYW11c2VtZW50KSAlPiUgDQogIGFzLmRhdGEuZnJhbWUoKSAlPiUgDQogIHJlbmFtZShwcmVkID0gIi4iKSAlPiUgDQogIGNiaW5kKC4sIGFtdXNlbWVudCkgLT4gYW11c2VtZW50DQpgYGANCg0KYGBge3IgcHJvamVjdGlvbl9jaGFydF9hbXVzZW1lbnQsIHdhcm5pbmcgPSBGQUxTRSwgbWVzc2FnZSA9IEZBTFNFLCBlY2hvPUZBTFNFfQ0KYW11c2VtZW50ICU+JQ0KICBncm91cF9ieShkYXRlLCB5ZWFyLCBtb250aCkgJT4lIA0KICBzdW1tYXJpemUoQWN0dWFsID0gc3VtKHRvdGFsKSwgDQogICAgICAgICAgICBQcmUuUGFuZGVtaWMuVHJlbmQgPSBzdW0ocHJlZCkpICU+JSANCiAgZmlsdGVyKHllYXIgPj0gMjAxOCkgJT4lDQogIHVuZ3JvdXAoKSAlPiUNCiAgc2VsZWN0KGRhdGUsIEFjdHVhbCwgUHJlLlBhbmRlbWljLlRyZW5kKSAlPiUNCiAgZ2F0aGVyKC0gZGF0ZSwga2V5ID0gInZhcmlhYmxlIiwgdmFsdWUgPSAidmFsdWUiKSAlPiUNCiAgbXV0YXRlKHZhbHVlX20gPSByb3VuZCh2YWx1ZS8xMDAwMDAwLCBkaWdpdHMgPSAyKSkgJT4lDQogIGdncGxvdCgpKw0KICAgIGdlb21fbGluZShhZXMoeCA9IGFzLkRhdGUoZGF0ZSksIHk9dmFsdWVfbSwgY29sb3IgPSB2YXJpYWJsZSkpKyANCiAgICBnZW9tX2xpbmUoYWVzKHggPSBhcy5EYXRlKGRhdGUpLCB5PXZhbHVlX20sIGNvbG9yID0gdmFyaWFibGUpLCANCiAgICAgICAgICAgIGxpbmV0eXBlID0gImRhc2hlZCIsIGFscGhhID0gMC41KSsNCiAgICB5bGFiKCJRdWFydGVybHkgQW11c2VtZW50IFRheCBSZXZlbnVlICgkIE1pbGxpb25zKSIpKw0KICAgIHhsYWIoIkRhdGUiKSsNCiAgICBsYWJzKA0KICAgICAgICB0aXRsZSA9ICJQaGlsYWRlbHBoaWEgQW11c2VtZW50IFRheCBTaG9ydGZhbGxzIiwNCiAgICAgICAgc3VidGl0bGUgPSAiQWRqdXN0ZWQgZm9yIGluZmxhdGlvbiB0byAyMDIxIERvbGxhcnMuXG4gVHJlbmQgYmFzZWQgb24gMjAxNC0yMDE5IHJlZ3Jlc3Npb24gY29udHJvbGxpbmcgZm9yIHllYXIsIG1vbnRoLiBcblNvdXJjZTogUGhpbGFkZWxwaGlhIENpdHkgQ29udHJvbGxlcidzIE9mZmljZSIpKw0KICAgIHBsb3RUaGVtZQ0KDQpgYGANCg0KYGBge3IgcHJvamVjdGlvbl9jaGFydF9iYXIyLCB3YXJuaW5nID0gRkFMU0UsIG1lc3NhZ2UgPSBGQUxTRSwgZWNobz1GQUxTRX0NCmFtdXNlbWVudCAlPiUNCiAgZ3JvdXBfYnkoZGF0ZSwgeWVhciwgbW9udGgpICU+JSANCiAgc3VtbWFyaXplKEFjdHVhbCA9IHN1bSh0b3RhbCksIA0KICAgICAgICAgICAgUHJlLlBhbmRlbWljLlRyZW5kID0gc3VtKHByZWQpKSAlPiUgDQogIG11dGF0ZShsb3NzID0gQWN0dWFsIC0gUHJlLlBhbmRlbWljLlRyZW5kKSAlPiUNCiAgZmlsdGVyKHllYXIgPj0gMjAyMCkgJT4lDQogIHVuZ3JvdXAoKSAlPiUNCiAgc2VsZWN0KGRhdGUsICBsb3NzKSAlPiUNCiAgZ2F0aGVyKC0gZGF0ZSwga2V5ID0gInZhcmlhYmxlIiwgdmFsdWUgPSAidmFsdWUiKSAlPiUNCiAgbXV0YXRlKHZhbHVlX20gPSByb3VuZCh2YWx1ZS8xMDAwMDAwLCBkaWdpdHMgPSAyKSkgJT4lDQogIGdncGxvdCgpKw0KICAgIGdlb21fYmFyKGFlcyh4ID0gYXMuRGF0ZShkYXRlKSwgeT12YWx1ZV9tKSwgc3RhdCA9ICJpZGVudGl0eSIsIGNvbG9yID0gImdyZXkiKSsgDQogICAgeWxhYigiTW9udGhseSBBbXVzZW1lbnQgVGF4IFJldmVudWUgc2hvcnRmYWxsICgkIE1pbGxpb25zKSIpKw0KICAgIHhsYWIoIkRhdGUiKSsNCiAgICBsYWJzKA0KICAgICAgICB0aXRsZSA9ICJQaGlsYWRlbHBoaWEgQW11c2VtZW50IFRheCBTaG9ydGZhbGwgdnMuIFByZS1QYW5kZW1pYyBUcmVuZHMiLA0KICAgICAgICBzdWJ0aXRsZSA9ICJBZGp1c3RlZCBmb3IgaW5mbGF0aW9uIHRvIDIwMjEgRG9sbGFycy5cblRyZW5kIGJhc2VkIG9uIDIwMTQtMjAxOSByZWdyZXNzaW9uIGNvbnRyb2xsaW5nIGZvciB5ZWFyLCBtb250aC4gXG5Tb3VyY2U6IFBoaWxhZGVscGhpYSBDaXR5IENvbnRyb2xsZXIncyBPZmZpY2UiKSsNCiAgICBwbG90VGhlbWUNCg0KYGBgDQoNCmBgYHtyIGFtdXNlbWVtdF9zaG9ydGZhbGxfcGN0LCB3YXJuaW5nID0gRkFMU0UsIG1lc3NhZ2UgPSBGQUxTRSwgZWNobz1GQUxTRX0NCmFtdXNlbWVudCAlPiUNCiAgICBncm91cF9ieShkYXRlLCB5ZWFyLCBtb250aCkgJT4lIA0KICAgIHN1bW1hcml6ZShBY3R1YWwgPSBzdW0odG90YWwpLCANCiAgICAgICAgICAgICAgUHJlLlBhbmRlbWljLlRyZW5kID0gc3VtKHByZWQpLCANCiAgICAgICAgICAgICAgcGN0X2RpZmYgPSAxMDAqKChBY3R1YWwtUHJlLlBhbmRlbWljLlRyZW5kKS9QcmUuUGFuZGVtaWMuVHJlbmQpKSAlPiUNCiAgICBmaWx0ZXIoeWVhciA+PSAyMDIwKSAlPiUNCiAgICBnZ3Bsb3QoKSsNCiAgICBnZW9tX2JhcihhZXMoeCA9IGFzLkRhdGUoZGF0ZSksIHk9cGN0X2RpZmYpLCBzdGF0ID0gImlkZW50aXR5IikrIA0KICAgIHlsYWIoIlRheCBSZXZlbnVlIHZzLiBFeHBlY3RlZCAoJSkiKSsNCiAgICB4bGFiKCJEYXRlIikrDQogICAgbGFicygNCiAgICAgICAgdGl0bGUgPSAiUGhpbGFkZWxwaGlhIEFtdXNlbWVudCBUYXggLSBQZXJjZW50YWdlIFNob3J0ZmFsbCB2cyBQcmUtUGFuZGVtaWMgVHJlbmRzIiwNCiAgICAgICAgc3VidGl0bGUgPSAiQWRqdXN0ZWQgZm9yIGluZmxhdGlvbiB0byAyMDIxIERvbGxhcnMuXG4gVHJlbmQgYmFzZWQgb24gMjAxNC0yMDE5IHJlZ3Jlc3Npb24gY29udHJvbGxpbmcgZm9yIHllYXIsIG1vbnRoLiBcblNvdXJjZTogUGhpbGFkZWxwaGlhIENpdHkgQ29udHJvbGxlcidzIE9mZmljZSwgQkxTIikrDQogICAgcGxvdFRoZW1lDQpgYGANCg0KRXN0aW1hdGVkIHRvdGFsIGxvc3NlcyBpbiBBbXVzZW1lbnQgdGF4IHJldmVudWUgc2luY2UgTWFyY2gsIDIwMjAuIEJhc2VkIG9uIGRpZmZlcmVuY2VzIGJldHdlZW4gYWN0dWFsIGFuZCBwcmVkaWN0ZWQgcmV2ZW51ZXMgZnJvbSBPTFMgcmVncmVzc2lvbiBjb250cm9sbGluZyBmb3IgeWVhciBhbmQgc2Vhc29uYWxpdHkgKG1vbnRoKSwgaW4gMjAyMSBkb2xsYXJzDQoNCmBgYHtyIGxvc3Nfc3VtbWFyeV9hbXVzZW1lbnQsIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQoNCmFtdXNlbWVudCAlPiUNCiAgZ3JvdXBfYnkoZGF0ZSwgeWVhciwgbW9udGgpICU+JSANCiAgc3VtbWFyaXplKEFjdHVhbCA9IHN1bSh0b3RhbCksIA0KICAgICAgICAgICAgUHJlLlBhbmRlbWljLlRyZW5kID0gc3VtKHByZWQpKSAlPiUgDQogIG11dGF0ZShsb3NzID0gQWN0dWFsIC0gUHJlLlBhbmRlbWljLlRyZW5kKSAlPiUNCiAgdW5ncm91cCgpICU+JQ0KICBmaWx0ZXIoeWVhciA9PSAyMDIwICYgbW9udGggPj0zIHwgeWVhciA+IDIwMjApICU+JQ0KICBzdW1tYXJpemUoIkVzdCBMb3NzIChtaWxsaW9ucykiID0gcm91bmQoc3VtKGxvc3MpLzEwMDAwMDAsIGRpZ2l0cyA9IDIpKSAlPiUNCiAga2FibGUoKQ0KDQpgYGANCg0KIyAzLiBTYXZlIE91ciBTdGFnZXMgR3JhbnRzDQoNClRoaXMgcmVwbyBjb250YWlucyBpbnRlcmFjdGl2ZSBtYXBzIGFuZCBhbmFseXNpcyBvZiBTQkEgR3JhbnRzIGdpdmVuIGFzIHBhcnQgb2YgdGhlICJTYXZlIE91ciBTdGFnZXMiIEFjdCBwYXNzZWQgYnkgdGhlIFVTIENvbmdyZXNzLg0KDQpUaGUgZGF0YSBiZWluZyB1c2VkIGhlcmUgaGF2ZSBiZWVuIGdlb2NvZGVkIHVzaW5nIHRoZSBHb29nbGUgR2VvY29kaW5nIHNlcnZpY2UsIHdoaWNoIGlzIGhpZ2hseSBhY2N1cmF0ZSBidXQgbm90IGVycm9yIGZyZWUuIERhdGEgYXJlIGN1cnJlbnQgYXMgb2YgQXVndXN0IDE3LCAyMDIxLCBhbmQgYXJlIGF2YWlsYWJsZSBbZnJvbSB0aGUgU0JBXShodHRwczovL2RhdGEuc2JhLmdvdi9kYXRhc2V0L3N2b2cvcmVzb3VyY2UvMzMyNzBjMmEtZjFjNS00ZGNiLWJjOTgtYWVkY2FlYzE5ZWYzKS4NCg0KIyMgMy4xLiBHcmFudGVlIG1hcA0KDQpUaGUgZm9sbG93aW5nIG1hcCBzaG93cyB0aGUgZ3JhbnRlZSBsb2NhdGlvbnMuDQoNCmBgYHtyIHZlbnVlcywgZWNobyA9IEZBTFNFLCBtZXNzYWdlID0gRkFMU0UsIHdhcm5pbmcgPSBGQUxTRX0NCmdlb2NvZGVkX3ZlbnVlcyA8LSByZWFkLmNzdigifi9HaXRIdWIvU2F2ZU91clN0YWdlc0dyYW50cy9kYXRhL2dlb2NvZGVkX3ZlbnVlcy5jc3YiKSAlPiUNCiAgcmVuYW1lKGFjY3RfdHlwZSA9ICdBY2NvdW50LlZlbnVlJykgJT4lDQogIGZpbHRlcihDaXR5ID09ICJQaGlsYWRlbHBoaWEiICYgU3RhdGUgPT0gIlBBIikNCg0KbCA8LSBsZWFmbGV0KCkgJT4lIA0KICBhZGRQcm92aWRlclRpbGVzKHByb3ZpZGVycyRFc3JpLldvcmxkVG9wb01hcCkgJT4lDQogIHNldFZpZXcobG5nID0gbWVhbihnZW9jb2RlZF92ZW51ZXMkbG9uLCBuYS5ybSA9IFRSVUUpLA0KICAgICAgICAgIGxhdCA9IG1lYW4oZ2VvY29kZWRfdmVudWVzJGxhdCwgbmEucm0gPSBUUlVFKSwNCiAgICAgICAgICB6b29tID0gMTApICU+JQ0KICBhZGRTY2FsZUJhcihwb3NpdGlvbiA9ICJ0b3BsZWZ0IikgJT4lDQogIGFkZENpcmNsZU1hcmtlcnMoZGF0YT0gZ2VvY29kZWRfdmVudWVzICU+JQ0KICAgICAgICAgICAgICAgICAgICAgZmlsdGVyKGFjY3RfdHlwZSA9PSAiTGl2ZSBwZXJmb3JtaW5nIGFydHMgb3JnYW5pemF0aW9uIG9wZXJhdG9yIiksDQogICAgICAgICAgICAgICAgICAgbG5nPX5sb24sIA0KICAgICAgICAgICAgICAgICAgIGxhdD1+bGF0LA0KICAgICAgICAgICAgICAgICAgIHJhZGl1cyA9fiAxLCANCiAgICAgICAgICAgICAgICAgICBmaWxsT3BhY2l0eSA9fiAwLjUsDQogICAgICAgICAgICAgICAgICAgY29sb3I9ICJibHVlIiwgIyAifnBhbChhY2N0X3R5cGUpIg0KICAgICAgICAgICAgICAgICAgIGxhYmVsPX5wYXN0ZShzdm9nX2dyYW50ZWUsICIgfCBHcmFudCAkIiwgc3ZvZ19hbW91bnQpLA0KICAgICAgICAgICAgICAgICAgIGdyb3VwPSAiTGl2ZSBwZXJmb3JtaW5nIGFydHMgb3JnYW5pemF0aW9uIG9wZXJhdG9yIikgJT4lDQogIGFkZENpcmNsZU1hcmtlcnMoZGF0YT0gZ2VvY29kZWRfdmVudWVzICU+JQ0KICAgICAgICAgICAgICAgICAgICAgZmlsdGVyKGFjY3RfdHlwZSA9PSAiTGl2ZSB2ZW51ZSBvcGVyYXRvciBvciBwcm9tb3RlciIpLA0KICAgICAgICAgICAgICAgICAgIGxuZz1+bG9uLCANCiAgICAgICAgICAgICAgICAgICBsYXQ9fmxhdCwNCiAgICAgICAgICAgICAgICAgICByYWRpdXMgPX4gMSwgDQogICAgICAgICAgICAgICAgICAgZmlsbE9wYWNpdHkgPX4gMC41LA0KICAgICAgICAgICAgICAgICAgIGNvbG9yPSAiYmx1ZSIsICMgIn5wYWwoYWNjdF90eXBlKSINCiAgICAgICAgICAgICAgICAgICBsYWJlbD1+cGFzdGUoc3ZvZ19ncmFudGVlLCAiIHwgR3JhbnQgJCIsIHN2b2dfYW1vdW50KSwNCiAgICAgICAgICAgICAgICAgICBncm91cD0gIkxpdmUgdmVudWUgb3BlcmF0b3Igb3IgcHJvbW90ZXIiKSAlPiUNCiAgYWRkQ2lyY2xlTWFya2VycyhkYXRhPSBnZW9jb2RlZF92ZW51ZXMgJT4lDQogICAgICAgICAgICAgICAgICAgICBmaWx0ZXIoYWNjdF90eXBlID09ICJNb3Rpb24gcGljdHVyZSB0aGVhdGVyIG9wZXJhdG9yIiksDQogICAgICAgICAgICAgICAgICAgbG5nPX5sb24sIA0KICAgICAgICAgICAgICAgICAgIGxhdD1+bGF0LA0KICAgICAgICAgICAgICAgICAgIHJhZGl1cyA9fiAxLCANCiAgICAgICAgICAgICAgICAgICBmaWxsT3BhY2l0eSA9fiAwLjUsDQogICAgICAgICAgICAgICAgICAgY29sb3I9ICJibHVlIiwgIyAifnBhbChhY2N0X3R5cGUpIg0KICAgICAgICAgICAgICAgICAgIGxhYmVsPX5wYXN0ZShzdm9nX2dyYW50ZWUsICIgfCBHcmFudCAkIiwgc3ZvZ19hbW91bnQpLA0KICAgICAgICAgICAgICAgICAgIGdyb3VwPSAiTW90aW9uIHBpY3R1cmUgdGhlYXRlciBvcGVyYXRvciIpICU+JQ0KICBhZGRDaXJjbGVNYXJrZXJzKGRhdGE9IGdlb2NvZGVkX3ZlbnVlcyAlPiUNCiAgICAgICAgICAgICAgICAgICAgIGZpbHRlcihhY2N0X3R5cGUgPT0gIk11c2V1bSBPcGVyYXRvciIpLA0KICAgICAgICAgICAgICAgICAgIGxuZz1+bG9uLCANCiAgICAgICAgICAgICAgICAgICBsYXQ9fmxhdCwNCiAgICAgICAgICAgICAgICAgICByYWRpdXMgPX4gMSwgDQogICAgICAgICAgICAgICAgICAgZmlsbE9wYWNpdHkgPX4gMC41LA0KICAgICAgICAgICAgICAgICAgIGNvbG9yPSAiYmx1ZSIsICMgIn5wYWwoYWNjdF90eXBlKSINCiAgICAgICAgICAgICAgICAgICBsYWJlbD1+cGFzdGUoc3ZvZ19ncmFudGVlLCAiIHwgR3JhbnQgJCIsIHN2b2dfYW1vdW50KSwNCiAgICAgICAgICAgICAgICAgICBncm91cD0gIk11c2V1bSBPcGVyYXRvciIpICU+JQ0KICBhZGRDaXJjbGVNYXJrZXJzKGRhdGE9IGdlb2NvZGVkX3ZlbnVlcyAlPiUNCiAgICAgICAgICAgICAgICAgICAgIGZpbHRlcihhY2N0X3R5cGUgPT0gIlRhbGVudCByZXByZXNlbnRhdGl2ZSIpLA0KICAgICAgICAgICAgICAgICAgIGxuZz1+bG9uLCANCiAgICAgICAgICAgICAgICAgICBsYXQ9fmxhdCwNCiAgICAgICAgICAgICAgICAgICByYWRpdXMgPX4gMSwgDQogICAgICAgICAgICAgICAgICAgZmlsbE9wYWNpdHkgPX4gMC41LA0KICAgICAgICAgICAgICAgICAgIGNvbG9yPSAiYmx1ZSIsICMgIn5wYWwoYWNjdF90eXBlKSINCiAgICAgICAgICAgICAgICAgICBsYWJlbD1+cGFzdGUoc3ZvZ19ncmFudGVlLCAiIHwgR3JhbnQgJCIsIHN2b2dfYW1vdW50KSwNCiAgICAgICAgICAgICAgICAgICBncm91cD0gIlRhbGVudCByZXByZXNlbnRhdGl2ZSIpICU+JQ0KICBhZGRDaXJjbGVNYXJrZXJzKGRhdGE9IGdlb2NvZGVkX3ZlbnVlcyAlPiUNCiAgICAgICAgICAgICAgICAgICAgIGZpbHRlcihhY2N0X3R5cGUgPT0gIlRoZWF0cmljYWwgcHJvZHVjZXIiKSwNCiAgICAgICAgICAgICAgICAgICBsbmc9fmxvbiwgDQogICAgICAgICAgICAgICAgICAgbGF0PX5sYXQsDQogICAgICAgICAgICAgICAgICAgcmFkaXVzID1+IDEsIA0KICAgICAgICAgICAgICAgICAgIGZpbGxPcGFjaXR5ID1+IDAuNSwNCiAgICAgICAgICAgICAgICAgICBjb2xvcj0gImJsdWUiLCAjICJ+cGFsKGFjY3RfdHlwZSkiDQogICAgICAgICAgICAgICAgICAgbGFiZWw9fnBhc3RlKHN2b2dfZ3JhbnRlZSwgIiB8IEdyYW50ICQiLCBzdm9nX2Ftb3VudCksDQogICAgICAgICAgICAgICAgICAgZ3JvdXA9ICJUaGVhdHJpY2FsIHByb2R1Y2VyIikgJT4lDQogIGFkZExheWVyc0NvbnRyb2woDQogICAgb3ZlcmxheUdyb3VwcyA9IGMoIkxpdmUgcGVyZm9ybWluZyBhcnRzIG9yZ2FuaXphdGlvbiBvcGVyYXRvciIsIA0KICAgICAgICAgICAgICAgICAgICAgICJMaXZlIHZlbnVlIG9wZXJhdG9yIG9yIHByb21vdGVyIiwNCiAgICAgICAgICAgICAgICAgICAgICAiTW90aW9uIHBpY3R1cmUgdGhlYXRlciBvcGVyYXRvciIsDQogICAgICAgICAgICAgICAgICAgICAgIk11c2V1bSBPcGVyYXRvciIsDQogICAgICAgICAgICAgICAgICAgICAgIlRhbGVudCByZXByZXNlbnRhdGl2ZSIsDQogICAgICAgICAgICAgICAgICAgICAgIlRoZWF0cmljYWwgcHJvZHVjZXIiKSAsDQogICAgb3B0aW9ucyA9IGxheWVyc0NvbnRyb2xPcHRpb25zKGNvbGxhcHNlZCA9IFRSVUUpDQogICAgKSAlPiUNCiAgaGlkZUdyb3VwKGMoIkxpdmUgcGVyZm9ybWluZyBhcnRzIG9yZ2FuaXphdGlvbiBvcGVyYXRvciIsIA0KICAgICAgICAgICAgICAgICAgICAgICJNb3Rpb24gcGljdHVyZSB0aGVhdGVyIG9wZXJhdG9yIiwNCiAgICAgICAgICAgICAgICAgICAgICAiTXVzZXVtIE9wZXJhdG9yIiwNCiAgICAgICAgICAgICAgICAgICAgICAiVGFsZW50IHJlcHJlc2VudGF0aXZlIiwNCiAgICAgICAgICAgICAgICAgICAgICAiVGhlYXRyaWNhbCBwcm9kdWNlciIpKQ0KDQpsDQoNCmBgYA0KIyMgMy4yLiBQaGlsYWRlbHBoaWEgU1ZPRyBncmFudCBicmVha2Rvd246DQoNCmBgYHtyIHN2b2dfYnJlYWtkb3duLCBtZXNzYWdlID0gRkFMU0UsIGVjaG8gPSBGQUxTRSwgd2FybmluZyA9IEZBTFNFfQ0KZ2VvY29kZWRfdmVudWVzICU+JQ0KICBzdW1tYXJpemUoIk51bSBHcmFudHMiID0gbigpLA0KICAgICAgICAgICAgIkdyYW50cyBUb3RhbCIgPSBzdW0oc3ZvZ19hbW91bnQpLA0KICAgICAgICAgICAgIk1lYW4gR3JhbnQiID0gbWVhbihzdm9nX2Ftb3VudCksDQogICAgICAgICAgICAiTWVkaWFuIEdyYW50IiA9IG1lZGlhbihzdm9nX2Ftb3VudCkpICU+JQ0KICBrYWJsZSgpICU+JQ0KICBrYWJsZV9zdHlsaW5nKCkNCmBgYA0KDQojIyAzLjMuIFBoaWxhIFNWT0cgc2VhcmNoYWJsZSBkYXRhYmFzZToNCg0KYGBge3Igc2VhcmNoYWJsZV90YWJsZSwgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCmRhdGF0YWJsZShnZW9jb2RlZF92ZW51ZXMgJT4lDQogICAgICAgICAgICBzZWxlY3QoLVgsIC1sb24sIC1sYXQsIC1hZGRyZXNzX2Z1bGwpICU+JQ0KICAgICAgICAgICAgcmVuYW1lKCdHcmFudCAoJCknID0gc3ZvZ19hbW91bnQsDQogICAgICAgICAgICAgICAgICAgR3JhbnRlZSA9IHN2b2dfZ3JhbnRlZSwNCiAgICAgICAgICAgICAgICAgICBDYXRlZ29yeSA9IGFjY3RfdHlwZSksIA0KICAgICAgICAgIG9wdGlvbnMgPSBsaXN0KHBhZ2VMZW5ndGggPSAxMCkpDQpgYGANCg0KDQojIDQuIFpvbmluZyBhbmQgQXNzZW1ibHkgTGljZW5zZXMNCg0KQSBTcGVjaWFsIEFzc2VtYmx5IE9jY3VwYW5jeSBMaWNlbnNlIChTQU9MKSBpcyB0aGUgaGlnaGVzdCBmb3JtIG9mIGxpY2Vuc2UgZm9yIGFzc2VtYmx5IGZvciBlbnRlcnRhaW5tZW50IGZvciA1MCsgcGVvcGxlIChub24tc2VhdGVkKS4gSW4gY29tYmluYXRpb24gd2l0aCBhbiBhbXVzZW1lbnQgbGljZW5zZSBhbmQgcmVndWxhciBidXNpbmVzcyBsaWNlbnNlcywgdGhpcyBpcyB3aGF0IHlvdSB1c3VhbGx5IG5lZWQgdG8gb3BlbiBhIHZlbnVlLiBUaGVzZSBsaWNlbnNlcyBhcmUgZGlmZmljdWx0IHRvIGdldCwgYW5kIGNhbiBiZSBleHBlbnNpdmUuIE11Y2ggZXhwZW5zZSBhbmQgcmlzayBpcyBpbmN1cnJlZCB3aGVuIHlvdSBuZWVkIGEgem9uaW5nIHZhcmlhbmNlIChhbmQgY291bmNpbCBhcHByb3ZhbCkgb3IgdG8gZ28gdGhyb3VnaCBhIHpvbmluZyBwcm9jZXNzIHRyaWdnZXJlZCBieSBhIHNwZWNpYWwgZXhjZXB0aW9uLg0KDQpTQU9McyBhcmUgb25seSBhdmFpbGFibGUgYnkgcmlnaHQgaW4gdmVyeSBmZXcgem9uaW5nIGNhdGVnb3JpZXMsIG1vc3Qgb2YgdGhlc2UgdGhlIG1vc3QgZXhwZW5zaXZlIGxhbmQgaW4gQ2VudGVyIENpdHkuIFJlY2VudGx5LCBwZW9wbGUgaGF2ZSBOT1QgYmVlbiB0YWtpbmcgb3V0IGxpY2Vuc2VzIGluIENDLCB0aGV5IGhhdmUgYmVlbiBnb2luZyB0aHJvdWdoIHpvbmluZyBwcm9jZXNzZXMgaW4gbmVhcmJ5IG5laWdoYm9yaG9vZHMgd2l0aCB0cmFuc2l0IGFjY2VzcyBhbmQgY2x1c3RlcnMgb2YgYW1lbml0aWVzLCBhbmQgU0FPTHMgaGF2ZSBiZWVuIGdvaW5nIGV4dGluY3QgbXVjaCBmYXN0ZXIgdGhhbiB0aGV5IGFyZSBiZWluZyBjcmVhdGVkLg0KDQpUaGVyZSBhcmUgYSBmZXcgb3Bwb3J0dW5pdGllcyBmb3IgQ291bmNpbCB0byBtYWtlIFNBT0xzIGVhc2llciB0byBhY2Nlc3MgLSBvbmUgaXMgYnkgc3VwcG9ydGluZyBvcGVyYXRvcnMgaW4gZ2V0dGluZyB2YXJpYW5jZXMsIHR3byBpcyBieSBvcGVuaW5nIHVwIG1vcmUgem9uaW5nIGRpc3RyaWN0cyB0byBTQU9McyBieSByaWdodC4NCg0KWzI0SHJQSEwgcHV0IHRvZ2V0aGVyIGEgInBsYXlib29rIiBmb3IgaG93IHRvIG9idGFpbiBhIFNBT0wgaW4gMjAxOSB0aGF0IHdhcyB2ZXR0ZWQgYnkgdGhlbiBMJkkgQ29tbWlzc2lvbmVyIERhdmUgUGVycmkuXShodHRwOi8vMjRocnBobC5vcmcvdGhlLXZlbnVlLXN0YXJ0ZXItcGxheWJvb2svKQ0KDQpUaGUgbnVtYmVyIG9mIGFjdGl2ZSBTQU9McyBpbiBQaGlsYWRlbHBoaWEgaXMgZGVjbGluaW5nLCBhbmQgdGhlIHBsYWNlcyB3aGVyZSBwZW9wbGUgd2FudCB0byAob3IgY2FuIGFmZm9yZCB0bykgYnVpbGQgY3JlYXRpdmUgc3BhY2VzIGFyZSBub3QgdGhlIHBsYWNlcyB3aGVyZSB0aGV5IGFyZSBhdmFpbGFibGUgYnktcmlnaHQuIE9ubHkgMjglIG9mIGFjdGl2ZSBTQU9McyBhcmUgaW4gYnktcmlnaHQgZGlzdHJpY3RzIC0gcmF0ZSBvZiBieS1yaWdodCBkZXZlbG9wbWVudCBvZiBTQU9MIGJ1c2luZXNzZXMgaGFzIGJlZW4gcmVsYXRpdmVseSBjb25zdGFudCBmb3Igb3ZlciAxNSB5ZWFycy4NCg0KRnJlcXVlbnRseSwgcGVvcGxlIGFyZSBhcHBseWluZyBmb3IgU0FPTHMgaW4gQ01YLTIuNSBwcm9wZXJ0aWVzIC0gd2hlcmUgdGhpcyB1c2UgaXMgYXZhaWxhYmUgYnkgc3BlY2lhbCBleGNlcHRpb24gKk9wZW5pbmcgQ01YLTIuNSB0byBieS1yaWdodCBTQU9MIHdvdWxkIG1vcmUgdGhhbiBkb3VibGUgdGhlIGFtb3VudCBvZiBjb21tZXJjaWFsIHBhcmNlbHMgZWxpZ2libGUgZm9yIGJ5LXJpZ2h0IFNBT0wuKg0KDQpgYGB7ciBkbF96b25pbmcsIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGVjaG89RkFMU0UsIGNvbW1lbnQgPSBGQUxTRX0NCg0Kem9uZXMgPC0gc3RfcmVhZCgiaHR0cHM6Ly9vcGVuZGF0YS5hcmNnaXMuY29tL2RhdGFzZXRzLzBiZGIwYjVmMTM3NzRjMDNhYmY4ZGMyZjFhYTAxNjkzXzAuZ2VvanNvbiIpICU+JQ0KICBzdF9hc19zZihjcnMgPSA0MzI2KSAlPiUNCiAgbXV0YXRlKGFzc2VtYmx5X2FsbG93ZWQgPSBpZmVsc2UoTE9OR19DT0RFICVpbiUgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYygiQ01YLTQiLCAiQ01YLTUiLCAiQ0EtMiIsICJJQ01YIiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJCeS1SaWdodCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoTE9OR19DT0RFICVpbiUgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMoIkNNWC0yIiwgIkNNWC0yLjUiLCAiQ01YLTMiLCAiSVJNWCIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNwZWNpYWwgRXhjZXB0aW9uIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTm90IFBlcm1pdHRlZCIgKSkpDQoNCmxpY2Vuc2VzIDwtIHN0X3JlYWQoImh0dHBzOi8vcGhsLmNhcnRvLmNvbS9hcGkvdjIvc3FsP3E9U0VMRUNUKyorRlJPTStidXNpbmVzc19saWNlbnNlcyZmaWxlbmFtZT1idXNpbmVzc19saWNlbnNlcyZmb3JtYXQ9Z2VvanNvbiZza2lwZmllbGRzPWNhcnRvZGJfaWQiKSAlPiUNCiAgc3RfYXNfc2YoY3JzID0gNDMyNikNCg0KYGBgDQojIyA0LjEuIFN1bW1hcnkgb2YgU0FPTC1lbGlnaWJsZSBEaXN0cmljdHMNCg0KQXNzZW1ibHkgaXMgYWxsb3dlZCBieSByaWdodCBpbiBmb3VyIHpvbmluZyBkaXN0cmljdHMsIGFuZCBieSBzcGVjaWFsIGV4Y2VwdGlvbiBpbiBmb3VyIG90aGVycy4NCg0KSGVyZSBhcmUgc29tZSB2ZXJ5IGJhc2ljIGRlc2NyaXB0aW9ucyBvZiB0aGVzZSB0eXBlcyBvZiB6b25lcywgd2l0aCBpbmZvcm1hdGlvbiBzb3VyY2VkIGZyb20gQW5hc3Rhc2lvIExhdyAtIGh0dHA6Ly9waGlsbHl6b25pbmcuY29tLw0KDQoqQnkgUmlnaHQqDQoNCi1DQS0yIC0gQXV0by1vcmllbnRlZCBjb21tZXJjaWFsDQoNCi1DTVgtNCAtIENvbW1lcmNpYWwgTWl4ZWQgVXNlLCBtb3N0bHkgZm91bmQgaW4gQ2VudGVyIENpdHkgb3IgYWxvbmcgbWFqb3IgYXJ0ZXJpYWxzIGxpa2UgQnJvYWQsIE1hcmtldCBvciBDaGVzdG51dCBTdHJlZXRzDQoNCi1DTVgtNSAtIENvbW1lcmNpYWwgTWl4ZWQgVXNlLCBmb3VuZCBpbiB0aGUgY29yZSBvZiBDZW50ZXIgQ2l0eSBvZmZpY2UgZGlzdHJpY3RzDQoNCi1JQ01YIC0gQ29tbWVyY2lhbC9JbmR1c3RyaWFsIHVzZXMgZGVzaWduZWQgYXMgYSBidWZmZXIgYmV0d2VlbiBjb21tZXJjaWFsIGFuZCByZXNpZGVudGlhbCB1c2VzDQoNCipTcGVjaWFsIEV4Y2VwdGlvbioNCg0KLUNNWC0yIC0gTmVpZ2hib3Job29kIGNvbW1lcmNpYWwgY29ycmlkb3IsIG1peGVkIHVzZSAtIGUuZy4gQmFsdGltb3JlIEF2ZW51ZSwgR2VybWFudG93biBBdmVudWUNCg0KLUNNWC0yLjUgLSBDb21tZXJjaWFsIG1peGVkIHVzZSBkZXNpZ25lZCB0byBwcm9tb3RlIHBlZGVzdHJpYW4tZnJpZW5kbHkgdXNlcw0KDQotQ01YLTMgLSBMb3dlciBkZW5zaXR5IGNvbW1lcmNpYWwgbWl4ZWQgdXNlIHRoYW4gQ01YIDQmNSwgZm91bmQgb24gbWFqb3IgY29ycmlkb3JzIGxpa2UgS2Vuc2luZ3RvbiBBdmUsIFNvdXRoIFN0LCBCcm9hZCBzb3V0aCBvZiBXYXNoaW5ndG9uLg0KDQotSVJNWCAtICJMb3cgaW1wYWN0IiBpbmR1c3RyaWFsLCBpbmNsdWRpbmcgYXJ0aXN0IHNwYWNlcw0KDQpgYGB7ciBleHBsb3JlX3pvbmVzLCBtZXNzYWdlID0gRkFMU0UsIHdhcm5pbmcgPSBGQUxTRSwgZWNobz1GQUxTRSwgZXZhbCA9IEZBTFNFfQ0Kem9uZXMgJT4lDQogIGFzLmRhdGEuZnJhbWUoKSU+JQ0KICBmaWx0ZXIoTE9OR19DT0RFICVpbiUgYygiQ01YLTQiLCAiQ01YLTUiLCAiQ0EtMiIsICJJQ01YIiwgIkNNWC0yIiwgIkNNWC0yLjUiLCAiQ01YLTMiLCAiSVJNWCIpKSAlPiUNCiAgZ3JvdXBfYnkoYXNzZW1ibHlfYWxsb3dlZCwgTE9OR19DT0RFKSAlPiUNCiAgdGFsbHkoKSAlPiUNCiAgcmVuYW1lKCJQYXJjZWxzIGNpdHktd2lkZSIgPSBuLA0KICAgICAgICAgRGlzdHJpY3QgPSBMT05HX0NPREUpICU+JQ0KICBrYWJsZSAlPiUNCiAga2FibGVfc3R5bGluZygpDQpgYGANCg0KQ2l0eS13aWRlLCByb3VnaGx5IDI2JSBvZiAqY29tbWVyY2lhbCogZGlzdHJpY3RzIChieSBhcmVhKSBhcmUgem9uZWQgZm9yIGFzc2VtYmx5IGJ5IHJpZ2h0LiBNdWNoIG9mIHRoaXMgYXJlYSBpcyBpbiBsYXJnZSBDZW50ZXIgQ2l0eSB0cmFjdHMgd2hlcmUgY3JlYXRpdmUgc3BhY2VzIGFyZSB1bmxpa2VseSB0byBiZSBkZXZlbG9wZWQgZHVlIHRvIGNvc3Qgb3IgY29uc3RyYWludHMgb2YgdGhlIGxhbmQuDQoNCmBgYHtyIHBjdF9jb21tZXJjaWFsX3Byb3BzLCBtZXNzYWdlID0gRkFMU0UsIHdhcm5pbmcgPSBGQUxTRSwgZWNobz1GQUxTRX0NCnpvbmVzICU+JQ0KICBmaWx0ZXIoc3RyX2RldGVjdChaT05JTkdHUk9VUCwgIkNvbW1lcmNpYWwiKSA9PSBUUlVFKSAlPiUNCiAgc3RfdHJhbnNmb3JtKDIyNzIpICU+JQ0KICBtdXRhdGUoYXJlYSA9IHN0X2FyZWEoLikpICU+JQ0KICBhcy5kYXRhLmZyYW1lKCklPiUNCiAgZ3JvdXBfYnkoYXNzZW1ibHlfYWxsb3dlZCkgJT4lDQogIHN1bW1hcml6ZShzdW1fYXJlYSA9IHN1bShhcmVhKSkgJT4lDQogICNyZW5hbWUobl9wYXJjZWxzID0gbikgJT4lDQogIG11dGF0ZShQY3QgPSByb3VuZCgxMDAqKHN1bV9hcmVhIC8gc3VtKHN1bV9hcmVhKSksIDIpKSAlPiUNCiAgI3JlbmFtZSgiUGFyY2VscyBDaXR5LVdpZGUiID0gbl9wYXJjZWxzKSAlPiUNCiAga2FibGUoKSAlPiUNCiAga2FibGVfc3R5bGluZygpDQpgYGANCg0KIyMgNC4yLiBDaXR5LXdpZGUgem9uaW5nIGV4YW1pbmF0aW9uDQoNClRoZSBtYWpvcml0eSBvZiBhcmVhcyB6b25lZCBmb3IgYXNzZW1ibHkgYnktcmlnaHQgYXJlIGluIENlbnRlciBDaXR5LiBUaGlzIGlzICpub3QqIHdoZXJlIG1vc3QgZGV2ZWxvcG1lbnQgb2YgY3JlYXRpdmUgZW50ZXJ0YWlubWVudCBpcyB0YWtpbmcgcGxhY2UuDQoNClRha2UgYSBsb29rIGF0IGRpc3RyaWN0cyBvdXRzaWRlIENlbnRlciBDaXR5IGxpa2UgRmlzaHRvd24gLSBieS1yaWdodCBTQU9MIGlzIG5vdCByZWFsbHkgYWxsb3dlZCBieS1yaWdodCBhbnl3aGVyZS4NCg0KYGBge3IgbWFwX2V4Y2VwdGlvbnMsIG1lc3NhZ2UgPSBGQUxTRSwgd2FybmluZyA9IEZBTFNFLCBlY2hvPUZBTFNFLCBmaWcud2lkdGg9OCwgZmlnLmhlaWdodD0gOH0NCm1hcHZpZXcoem9uZXMgJT4lDQogICAgICAgICAgZmlsdGVyKGFzc2VtYmx5X2FsbG93ZWQgJWluJSBjKCJTcGVjaWFsIEV4Y2VwdGlvbiIsICJCeS1SaWdodCIpKSAlPiUNCiAgICAgICAgICBtdXRhdGUoTE9OR19DT0RFID0gY2FzZV93aGVuKExPTkdfQ09ERSA9PSAiQ0EtMiIgfiAiQnktUmlnaHQgQ0EtMiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMT05HX0NPREUgPT0gIkNNWC00IiB+ICJCeS1SaWdodCBDTVgtNCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMT05HX0NPREUgPT0gIkNNWC01IiB+ICJCeS1SaWdodCBDTVgtNSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMT05HX0NPREUgPT0gIklDTVgiIH4gIkJ5LVJpZ2h0IElDTVgiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTE9OR19DT0RFID09ICJDTVgtMiIgfiAiU3BlYyBFeGVjcHQgQ01YLTIiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTE9OR19DT0RFID09ICJDTVgtMi41IiB+ICJTcGVjIEV4ZWNwdCBDTVgtMi41IiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExPTkdfQ09ERSA9PSAiQ01YLTMiIH4gIlNwZWMgRXhlY3B0IENNWC0zIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExPTkdfQ09ERSA9PSAiSVJNWCIgfiAiU3BlYyBFeGVjcHQgSVJNWCIpKSwNCiAgICAgICAgemNvbCA9ICJMT05HX0NPREUiLCBjb2wucmVnaW9ucz1saXN0KCIjZmZmZmIyIiwgIiNmZWNjNWMiLCAiI2ZkOGQzYyIsICIjZTMxYTFjIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIjZWRmOGZiIiwgIiNiM2NkZTMiLCAiIzhjOTZjNiIsICIjODg0MTlkIiksDQogICAgICAgIGNvbCA9IGxpc3QoInRyYW5zcGFyZW50IiksDQogICAgICAgIGxheWVyLm5hbWUgPSAiWm9uaW5nIERpc3RyaWN0cyIpICsNCiAgbWFwdmlldyhsaWNlbnNlcyAlPiUgDQogIGZpbHRlcihsaWNlbnNldHlwZSA9PSAiU3BlY2lhbCBBc3NlbWJseSBPY2N1cGFuY3kiLA0KICAgICAgICAgbGljZW5zZXN0YXR1cyA9PSAiQWN0aXZlIikgJT4lIA0KICBzdF9qb2luKC4sIHpvbmVzKSwgemNvbCA9ICJhc3NlbWJseV9hbGxvd2VkIiAsbGF5ZXIubmFtZSA9ICJTQU9MIExpY2Vuc2UiKQ0KDQpgYGANCg0KVGhlc2Ugc3RhdGljIG1hcHMgcmVwcmVzZW50IHRoZSBzYW1lIGluZm9ybWF0aW9uIGJ1dCBhcmUgZGVzaWduZWQgdG8gYmUgdXNlZCBpbiB0aGUgVGFzayBGb3JjZSB3cml0dGVuIHJlcG9ydCBvciB3aXRoIHByaW50ZWQgbWF0ZXJpYWxzLg0KDQpTQU9MIHpvbmluZyBzdGF0dXM6DQoNCmBgYHtyIHN0YXRpY19tYXAyLCBlY2hvPUZBTFNFLCBmaWcuaGVpZ2h0PTYsIGZpZy53aWR0aD02LCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KZ2dwbG90KCkrIA0KICBnZW9tX3NmKGRhdGEgPSBwaGlsYV9zaHAsIGZpbGwgPSAiYmxhY2siKSArIA0KICBnZW9tX3NmKGRhdGEgPSB6b25lcyAlPiUgDQogICAgICAgICAgICBmaWx0ZXIoYXNzZW1ibHlfYWxsb3dlZCAlaW4lIGMoIlNwZWNpYWwgRXhjZXB0aW9uIiwgIkJ5LVJpZ2h0IikpLCANCiAgICAgICAgICBhZXMoZmlsbCA9IGFzc2VtYmx5X2FsbG93ZWQpLCANCiAgICAgICAgICBjb2xvciA9ICJ0cmFuc3BhcmVudCIsDQogICAgICAgICAgYWxwaGEgPSAwLjcpKyANCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYygiYmx1ZSIsICJ5ZWxsb3ciKSkrDQogIHRoZW1lKGxlZ2VuZC50aXRsZT1lbGVtZW50X2JsYW5rKCkpKw0KICBtYXBUaGVtZQ0KYGBgDQoNCg0KU0FPTCBsaWNlbnNlIGxvY2F0aW9ucywgYnkgem9uaW5nIHN0YXR1czoNCg0KDQpgYGB7ciBzdGF0aWNfbWFwMSwgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgZmlnLmhlaWdodD02LCBmaWcud2lkdGg9Nix9DQpnZ3Bsb3QoKSsgDQogIGdlb21fc2YoZGF0YSA9IHBoaWxhX3NocCwgZmlsbCA9ICJibGFjayIpICsgDQogIGdlb21fc2YoZGF0YSA9IGxpY2Vuc2VzICU+JSANCiAgICAgICAgICAgIGZpbHRlcihsaWNlbnNldHlwZSA9PSAiU3BlY2lhbCBBc3NlbWJseSBPY2N1cGFuY3kiLCANCiAgICAgICAgICAgICAgICAgICBsaWNlbnNlc3RhdHVzID09ICJBY3RpdmUiKSAlPiUgDQogICAgICAgICAgICBzdF9qb2luKC4sIHpvbmVzKSAlPiUgDQogICAgICAgICAgICBmaWx0ZXIoaXMubmEoYXNzZW1ibHlfYWxsb3dlZCkgPT0gRkFMU0UpLCANCiAgICAgICAgICBhZXMoY29sb3IgPSBhc3NlbWJseV9hbGxvd2VkKSwgDQogICAgICAgICAgc2l6ZSA9IC41LA0KICAgICAgICAgIGFscGhhID0gMC42KSArIA0KICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYygiYmx1ZSIsICAicmVkIiAsICJ5ZWxsb3ciKSkrIA0KICB0aGVtZShsZWdlbmQudGl0bGU9ZWxlbWVudF9ibGFuaygpKSsNCiAgbWFwVGhlbWUNCmBgYA0KDQpgYGB7ciBnZXRfYmFzZW1hcCwgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCmJhc2VfbWFwIDwtIGdldF9zdGFtZW5tYXAoYmJveCA9IHVubmFtZShzdF9iYm94KGxsKHN0X2J1ZmZlcihwaGlsYV9zaHAsMTUwMCkpKSksDQogICAgICAgICAgICAgICAgICAgICAgICAgIGZvcmNlID0gVFJVRSwgbWFwdHlwZSA9ICJ0b25lci1saW5lcyIsIHpvb20gPSAxMSkNCmBgYA0KYGBgIHtyIG1hcF9hbGwsIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGluY2x1ZGU9RkFMU0V9DQoNCmdnbWFwKGJhc2VfbWFwLA0KICAgICAgYWxwaGEgPSAuOCkrDQogIGdlb21fc2YoZGF0YSA9IGxsKHBoaWxhX3NocCksIA0KICAgICAgICAgIGluaGVyaXQuYWVzID0gRkFMU0UsDQogICAgICAgICAgZmlsbCA9ICJ0cmFuc3BhcmVudCIsIA0KICAgICAgICAgIGNvbG9yID0gIm9yYW5nZSIsDQogICAgICAgICAgc2l6ZSA9IC41LA0KICAgICAgICAgIGFscGhhID0gMC41KSArDQogIGdlb21fc2YoZGF0YSA9IGxsKGxpY2Vuc2VzICU+JSANCiAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXIobGljZW5zZXR5cGUgPT0gIlNwZWNpYWwgQXNzZW1ibHkgT2NjdXBhbmN5IiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpY2Vuc2VzdGF0dXMgPT0gIkFjdGl2ZSIpICU+JSANCiAgICAgICAgICAgICAgICAgICAgICBzdF9qb2luKC4sIHpvbmVzKSkgJT4lDQogICAgICAgICAgICBmaWx0ZXIoaXMubmEoYXNzZW1ibHlfYWxsb3dlZCkgPT0gRkFMU0UpICU+JQ0KICAgICAgICAgICAgICAgICAgICAgIHN0X3RyYW5zZm9ybShzdF9jcnMocGhpbGFfc2hwKSksIA0KICAgICAgICAgIGFlcyhjb2xvciA9IGFzc2VtYmx5X2FsbG93ZWQpLA0KICAgICAgICAgIGluaGVyaXQuYWVzID0gRkFMU0UsLA0KICAgICAgICAgIHNpemUgPSAxLjIsDQogICAgICAgICAgYWxwaGEgPSAwLjcpKw0KICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYygiYmx1ZSIsICAicmVkIiAsICJ5ZWxsb3ciKSkrIA0KICB0aGVtZShsZWdlbmQudGl0bGU9ZWxlbWVudF9ibGFuaygpKSsNCiAgbWFwVGhlbWUNCg0KYGBgDQoNCmBgYCB7ciBtYXBfYWxsX2ZhY2V0LCBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KDQpnZ21hcChiYXNlX21hcCkrDQogIGdlb21fc2YoZGF0YSA9IGxsKHBoaWxhX3NocCksIA0KICAgICAgICAgIGluaGVyaXQuYWVzID0gRkFMU0UsDQogICAgICAgICAgZmlsbCA9ICJ0cmFuc3BhcmVudCIsIA0KICAgICAgICAgIGNvbG9yID0gImJsdWUiLA0KICAgICAgICAgIHNpemUgPSAxKSArDQogIGdlb21fc2YoZGF0YSA9IGxsKGxpY2Vuc2VzICU+JSANCiAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXIobGljZW5zZXR5cGUgPT0gIlNwZWNpYWwgQXNzZW1ibHkgT2NjdXBhbmN5IiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpY2Vuc2VzdGF0dXMgPT0gIkFjdGl2ZSIpICU+JSANCiAgICAgICAgICAgICAgICAgICAgICBzdF9qb2luKC4sIHpvbmVzKSkgJT4lDQogICAgICAgICAgICAgICAgICAgICAgc3RfdHJhbnNmb3JtKHN0X2NycyhwaGlsYV9zaHApKSAlPiUNCiAgICAgICAgICAgIGZpbHRlcihpcy5uYShhc3NlbWJseV9hbGxvd2VkKSA9PSBGQUxTRSksIA0KICAgICAgICAgIGFlcyhjb2xvciA9IGFzc2VtYmx5X2FsbG93ZWQpLA0KICAgICAgICAgIGluaGVyaXQuYWVzID0gRkFMU0UsLA0KICAgICAgICAgIGNvbG9yID0gInJlZCIsDQogICAgICAgICAgYWxwaGEgPSAwLjcsDQogICAgICAgICAgc2l6ZSA9IDEpKw0KICB0aGVtZShsZWdlbmQudGl0bGU9ZWxlbWVudF9ibGFuaygpKSsNCiAgZmFjZXRfd3JhcCh+YXNzZW1ibHlfYWxsb3dlZCkrDQogIG1hcFRoZW1lDQoNCmBgYA0KYGBgIHtyIGJhc2VtYXBfZmFjZXRfem9vbSwgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgaW5jbHVkZT1GQUxTRX0NCg0KYmFzZV9tYXBfem9vbSA8LSBnZXRfc3RhbWVubWFwKGJib3ggPSB1bm5hbWUoc3RfYmJveChsbChzdF9idWZmZXIoc3RfY2VudHJvaWQoY291bmNpbERpc3RyaWN0cyAlPiUgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyKERJU1RSSUNUICVpbiUgYyggMSwgMiwgMywgNSkpKSw2MDAwKSkpKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yY2UgPSBUUlVFLCBtYXB0eXBlID0gInRlcnJhaW4iLCB6b29tID0gMTIpDQpgYGANCg0KYGBgIHtyIG1hcF9hbGxfZmFjZXRfem9vbSwgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCmdnbWFwKGJhc2VfbWFwX3pvb20pKw0KICBnZW9tX3NmKGRhdGEgPSBjb3VuY2lsRGlzdHJpY3RzICU+JSANCiAgICAgICAgICAgICNmaWx0ZXIoRElTVFJJQ1QgJWluJSBjKCAxLCAyLCAzLCA1KSkgJT4lDQogICAgICAgICAgICBzdF90cmFuc2Zvcm0oY3JzID0gNDMyNiksIGluaGVyaXQuYWVzID0gRkFMU0UsDQogICAgICAgICAgZmlsbCA9ICJ0cmFuc3BhcmVudCIsIGNvbG9yID0gImJsdWUiLCBzaXplID0gLjc1LCBhbHBoYSA9IDAuMikrDQogIGdlb21fc2ZfbGFiZWwoZGF0YSA9IGNvdW5jaWxEaXN0cmljdHMgJT4lIA0KICAgICAgICAgICAgICAgICAgZmlsdGVyKERJU1RSSUNUICE9IDEpICU+JQ0KICAgICAgICAgICAgc3RfdHJhbnNmb3JtKGNycyA9IDQzMjYpLCBpbmhlcml0LmFlcyA9IEZBTFNFLA0KICAgICAgICAgICAgYWVzKGxhYmVsID0gRElTVFJJQ1QpLA0KICAgICAgICAgICAgbGFiZWwuc2l6ZSA9IDAuMjUpKw0KICBnZW9tX3NmX2xhYmVsKGRhdGEgPSBjb3VuY2lsRGlzdHJpY3RzICU+JSANCiAgICAgICAgICAgICAgICAgIGZpbHRlcihESVNUUklDVCA9PSAxKSAlPiUNCiAgICAgICAgICAgIHN0X3RyYW5zZm9ybShjcnMgPSA0MzI2KSwgaW5oZXJpdC5hZXMgPSBGQUxTRSwNCiAgICAgICAgICAgIGFlcyhsYWJlbCA9IERJU1RSSUNUKSwNCiAgICAgICAgICAgIGxhYmVsLnNpemUgPSAwLjI1LA0KICAgICAgICAgICAgbnVkZ2VfeSA9IC0uMDIpKw0KICBnZW9tX3NmKGRhdGEgPSBsbChsaWNlbnNlcyAlPiUgDQogICAgICAgICAgICAgICAgICAgICAgZmlsdGVyKGxpY2Vuc2V0eXBlID09ICJTcGVjaWFsIEFzc2VtYmx5IE9jY3VwYW5jeSIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaWNlbnNlc3RhdHVzID09ICJBY3RpdmUiKSAlPiUgDQogICAgICAgICAgICAgICAgICAgICAgc3Rfam9pbiguLCB6b25lcykpICU+JQ0KICAgICAgICAgICAgICAgICAgICAgIHN0X3RyYW5zZm9ybShzdF9jcnMoNDMyNikpICU+JQ0KICAgICAgICAgICAgZmlsdGVyKGlzLm5hKGFzc2VtYmx5X2FsbG93ZWQpID09IEZBTFNFKSwgDQogICAgICAgICAgYWVzKGNvbG9yID0gYXNzZW1ibHlfYWxsb3dlZCksDQogICAgICAgICAgaW5oZXJpdC5hZXMgPSBGQUxTRSwsDQogICAgICAgICAgY29sb3IgPSAicmVkIiwNCiAgICAgICAgICBhbHBoYSA9IDAuNywNCiAgICAgICAgICBzaXplID0gMSkrDQogIHRoZW1lKGxlZ2VuZC50aXRsZT1lbGVtZW50X2JsYW5rKCkpKw0KICBmYWNldF93cmFwKH5hc3NlbWJseV9hbGxvd2VkKSsNCiAgbWFwVGhlbWUNCg0KYGBgDQoNCmBgYCB7ciBieV9yaWdodCwgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgaW5jbHVkZT1GQUxTRX0NCg0KZ2dtYXAoYmFzZV9tYXApKw0KICBnZW9tX3NmKGRhdGEgPSBsbChwaGlsYV9zaHApLCANCiAgICAgICAgICBpbmhlcml0LmFlcyA9IEZBTFNFLA0KICAgICAgICAgIGZpbGwgPSAidHJhbnNwYXJlbnQiLCANCiAgICAgICAgICBjb2xvciA9ICJibHVlIiwNCiAgICAgICAgICBzaXplID0gMSkgKw0KICBnZW9tX3NmKGRhdGEgPSBsbChsaWNlbnNlcyAlPiUgDQogICAgICAgICAgICAgICAgICAgICAgZmlsdGVyKGxpY2Vuc2V0eXBlID09ICJTcGVjaWFsIEFzc2VtYmx5IE9jY3VwYW5jeSIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaWNlbnNlc3RhdHVzID09ICJBY3RpdmUiKSAlPiUgDQogICAgICAgICAgICAgICAgICAgICAgc3Rfam9pbiguLCB6b25lcykgJT4lIA0KICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcihhc3NlbWJseV9hbGxvd2VkID09ICJCeS1SaWdodCIpICU+JQ0KICAgICAgICAgICAgICAgICAgICAgIHN0X3RyYW5zZm9ybShzdF9jcnMocGhpbGFfc2hwKSkpLCANCiAgICAgICAgICBpbmhlcml0LmFlcyA9IEZBTFNFLA0KICAgICAgICAgIGNvbG9yID0gInJlZCIsDQogICAgICAgICAgc2l6ZSA9IDEsDQogICAgICAgICAgYWxwaGEgPSAwLjcpKw0KICBnZ3RpdGxlKCJCeSBSaWdodCIpICsNCiAgbWFwVGhlbWUNCg0KYGBgDQoNCmBgYCB7ciBzcGVjaWFsX2V4Y2VwdGlvbiwgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgaW5jbHVkZT1GQUxTRX0NCg0KZ2dtYXAoYmFzZV9tYXApKw0KICBnZW9tX3NmKGRhdGEgPSBsbChwaGlsYV9zaHApLCANCiAgICAgICAgICBpbmhlcml0LmFlcyA9IEZBTFNFLA0KICAgICAgICAgIGZpbGwgPSAidHJhbnNwYXJlbnQiLCANCiAgICAgICAgICBjb2xvciA9ICJibHVlIikgKw0KICBnZW9tX3NmKGRhdGEgPSBsbChsaWNlbnNlcyAlPiUgDQogICAgICAgICAgICAgICAgICAgICAgZmlsdGVyKGxpY2Vuc2V0eXBlID09ICJTcGVjaWFsIEFzc2VtYmx5IE9jY3VwYW5jeSIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaWNlbnNlc3RhdHVzID09ICJBY3RpdmUiKSAlPiUgDQogICAgICAgICAgICAgICAgICAgICAgc3Rfam9pbiguLCB6b25lcykgJT4lIA0KICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcihhc3NlbWJseV9hbGxvd2VkID09ICJTcGVjaWFsIEV4Y2VwdGlvbiIpICU+JQ0KICAgICAgICAgICAgICAgICAgICAgIHN0X3RyYW5zZm9ybShzdF9jcnMocGhpbGFfc2hwKSkpLCANCiAgICAgICAgICBpbmhlcml0LmFlcyA9IEZBTFNFLA0KICAgICAgICAgIGNvbG9yID0gInJlZCIsDQogICAgICAgICAgc2l6ZSA9IDEsDQogICAgICAgICAgYWxwaGEgPSAwLjcpKw0KICBnZ3RpdGxlKCJTcGVjaWFsIEV4Y2VwdGlvbiIpICsNCiAgbWFwVGhlbWUNCg0KYGBgDQoNCmBgYCB7ciBub3RfcGVybWl0dGVkLCBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBpbmNsdWRlPUZBTFNFfQ0KDQpnZ21hcChiYXNlX21hcCkrDQogIGdlb21fc2YoZGF0YSA9IGxsKHBoaWxhX3NocCksIA0KICAgICAgICAgIGluaGVyaXQuYWVzID0gRkFMU0UsDQogICAgICAgICAgZmlsbCA9ICJ0cmFuc3BhcmVudCIsIA0KICAgICAgICAgIGNvbG9yID0gImJsdWUiKSArDQogIGdlb21fc2YoZGF0YSA9IGxsKGxpY2Vuc2VzICU+JSANCiAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXIobGljZW5zZXR5cGUgPT0gIlNwZWNpYWwgQXNzZW1ibHkgT2NjdXBhbmN5IiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpY2Vuc2VzdGF0dXMgPT0gIkFjdGl2ZSIpICU+JSANCiAgICAgICAgICAgICAgICAgICAgICBzdF9qb2luKC4sIHpvbmVzKSAlPiUgDQogICAgICAgICAgICAgICAgICAgICAgZmlsdGVyKGFzc2VtYmx5X2FsbG93ZWQgPT0gIk5vdCBQZXJtaXR0ZWQiKSAlPiUNCiAgICAgICAgICAgICAgICAgICAgICBzdF90cmFuc2Zvcm0oc3RfY3JzKHBoaWxhX3NocCkpKSwgDQogICAgICAgICAgaW5oZXJpdC5hZXMgPSBGQUxTRSwNCiAgICAgICAgICBjb2xvciA9ICJyZWQiLA0KICAgICAgICAgIHNpemUgPSAxLA0KICAgICAgICAgIGFscGhhID0gMC43KSsNCiAgZ2d0aXRsZSgiTm90IFBlcm1pdHRlZCIpICsNCiAgbWFwVGhlbWUNCg0KYGBgDQoNCmBgYHtyIGNvdW5jaWwgZGlzdHJpY3RzLCBldmFsPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBpbmNsdWRlPUZBTFNFfQ0KDQpsaWNlbnNlcyAlPiUgDQogICAgICAgICAgICBmaWx0ZXIobGljZW5zZXR5cGUgPT0gIlNwZWNpYWwgQXNzZW1ibHkgT2NjdXBhbmN5IiwgDQogICAgICAgICAgICAgICAgICAgbGljZW5zZXN0YXR1cyA9PSAiQWN0aXZlIikgJT4lIA0KICAgICAgICAgICAgc3Rfam9pbiguLCB6b25lcykgJT4lIA0KICAgICAgICAgICAgZmlsdGVyKGlzLm5hKGFzc2VtYmx5X2FsbG93ZWQpID09IEZBTFNFKSAlPiUNCiAgYXMuZGF0YS5mcmFtZSgpICU+JQ0KICBncm91cF9ieShhc3NlbWJseV9hbGxvd2VkLCBjb3VuY2lsX2Rpc3RyaWN0KSAlPiUNCiAgdGFsbHkoKSAlPiUNCiAgZ2dwbG90KCkrDQogIGdlb21fYmFyKGFlcyh4ID0gY291bmNpbF9kaXN0cmljdCwgeSA9IG4sIGZpbGw9IGFzc2VtYmx5X2FsbG93ZWQpLCANCiAgICAgICAgICAgc3RhdCA9ICJpZGVudGl0eSIsIHBvc2l0aW9uID0gImRvZGdlIikrDQogIHBsb3RUaGVtZQ0KDQpgYGANCg0KIyMgNC4zLiBTQU9MIGlzc3VhbmNlIHRpbWVsaW5lDQoNClRoZXJlIGFyZSBjdXJyZW50bHkgMTIxIFNBT0xzIGFjdGl2ZSBpbiBQaGlsbHksIGFuZCA4OCBvZiB0aG9zZSBsaWNlbnNlIGhvbGRlcnMgYWxzbyBoYXZlIGFtdXNlbWVudCBsaWNlbnNlcy4NCg0KVmVyeSBmZXcgU0FPTHMgYXJlIGlzc3VlZCBpbiBQaGlsbHksIGFuZCBlc3BlY2lhbGx5IGZldyB0aGUgbGFzdCB0d28geWVhcnMuIFRoZSBmb2xsb3dpbmcgY2hhcnQgc2hvd3MgdGhlIGRhdGUgd2hlbiBTQU9MJ3Mgd2VyZSBpc3N1ZWQuIDIwMDYgcHJvYmFibHkgaGFzIGRhdGEgaW5mbGF0ZWQgYnkgdGhlIHN0YXJ0IG9mIHRoZSByZWNvcmQta2VlcGluZyBwZXJpb2QgZm9yIHRoZXNlIGRhdGEuDQoNCmBgYHtyIGxpY2Vuc2VfdGltZWxpbmUsIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQpsaWNlbnNlcyAlPiUNCiAgZmlsdGVyKGxpY2Vuc2V0eXBlID09ICJTcGVjaWFsIEFzc2VtYmx5IE9jY3VwYW5jeSIpICU+JQ0KICBtdXRhdGUoeWVhcl9vcGVuZWQgPSB5ZWFyKGFzLkRhdGUoaW5pdGlhbGlzc3VlZGF0ZSkpKSAlPiUNCiAgZ3JvdXBfYnkoeWVhcl9vcGVuZWQpICU+JQ0KICB0YWxseSgpICU+JQ0KICBnZ3Bsb3QoKSsNCiAgZ2VvbV9oaXN0b2dyYW0oYWVzKHkgPSBuLCB4ID0geWVhcl9vcGVuZWQpLCBzdGF0ID0gImlkZW50aXR5IikgKw0KICBsYWJzKHRpdGxlPSJTcGVjaWFsIEFzc2VtYmx5IE9jY3VwYW5jeSBMaWNlbnNlIEFjdGl2ZSBEYXRlcyIsDQogICAgICAgc3VidGl0bGU9ICJEYXRhIHRocm91Z2ggTWF5LCAyMDIyLiBTb3VyY2U6IFBoaWxhZGVscGhpYSBEZXB0LiBPZiBMaWNlbnNlcyAmIEluc3BlY3Rpb25zIiwNCiAgICAgICB4PSJZZWFyIiwgDQogICAgICAgeT0iTnVtYmVyIG9mIExpY2Vuc2VzIEFjdGl2YXRlZCIpKw0KICBwbG90VGhlbWUNCg0KYGBgDQoNClJlY29yZCBudW1iZXJzIG9mIGxpY2Vuc2VzIGJlY2FtZSBpbmFjdGl2ZSBpbiAyMDIwLi4uIFRoZSBmb2xsb3dpbmcgY2hhcnQgc2hvd3MgdGhlIHllYXJzIGluIHdoaWNoIFNBT0wncyBiZWNhbWUgaW5hY3RpdmUuIE1lYW53aGlsZSwgdGhlIHJlYWwgZXN0YXRlIG1hcmtldCBpcyBnZXR0aW5nIG11Y2ggbW9yZSBjb21wZXRpdGl2ZSBhbmQgZW50ZXJ0YWlubWVudCB3YWdlcyBhcmUgc2xvdyB0byByZWNvdmVyIChzZWUgU2VjdGlvbiAxIG9mIHRoaXMgZG9jdW1lbnQpLg0KDQpgYGB7ciBsaWNlbnNlX3RpbWVsaW5lX2luYWN0aXZlLCBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KbGljZW5zZXMgJT4lDQogIGZpbHRlcihsaWNlbnNldHlwZSA9PSAiU3BlY2lhbCBBc3NlbWJseSBPY2N1cGFuY3kiLA0KICAgICAgICAgbGljZW5zZXN0YXR1cyAhPSAiQWN0aXZlIikgJT4lDQogIG11dGF0ZSh5ZWFyX2Nsb3NlZCA9IHllYXIoYXMuRGF0ZShleHBpcmF0aW9uZGF0ZSkpKSAlPiUNCiAgZ3JvdXBfYnkoeWVhcl9jbG9zZWQpICU+JQ0KICB0YWxseSgpICU+JQ0KICBnZ3Bsb3QoKSsNCiAgZ2VvbV9oaXN0b2dyYW0oYWVzKHkgPSBuLCB4ID0geWVhcl9jbG9zZWQpLCBzdGF0ID0gImlkZW50aXR5IikgKw0KICBsYWJzKHRpdGxlPSJTcGVjaWFsIEFzc2VtYmx5IE9jY3VwYW5jeSBMaWNlbnNlIEV4cGlyYXRpb24gRGF0ZXMiLA0KICAgICAgIHN1YnRpdGxlPSAiRGF0YSB0aHJvdWdoIE1heSwgMjAyMi4gU291cmNlOiBQaGlsYWRlbHBoaWEgRGVwdC4gT2YgTGljZW5zZXMgJiBJbnNwZWN0aW9ucyIsDQogICAgICAgeD0iWWVhciIsIA0KICAgICAgIHk9Ik51bWJlciBvZiBMaWNlbnNlcyBJbmFjdGl2YXRlZCwiKSsNCiAgcGxvdFRoZW1lDQoNCmBgYA0KDQpgYGB7ciBsaWNlbnNlX3RpbWVsaW5lX2luYWN0aXZlMywgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCmxpY2Vuc2VzICU+JQ0KICBmaWx0ZXIobGljZW5zZXR5cGUgPT0gIlNwZWNpYWwgQXNzZW1ibHkgT2NjdXBhbmN5IiwNCiAgICAgICAgIGxpY2Vuc2VzdGF0dXMgIT0gIkFjdGl2ZSIpICU+JQ0KICBtdXRhdGUoeWVhciA9IHllYXIoYXMuRGF0ZShleHBpcmF0aW9uZGF0ZSkpKSAlPiUNCiAgYXMuZGF0YS5mcmFtZSgpICU+JQ0KICBncm91cF9ieSh5ZWFyKSAlPiUNCiAgdGFsbHkoKSAlPiUNCiAgbXV0YXRlKEFjdGlvbiA9ICJFeHBpcmVkIikgJT4lDQogIHJiaW5kKC4sIA0KICBsaWNlbnNlcyAlPiUNCiAgbXV0YXRlKHllYXIgPSB5ZWFyKGFzLkRhdGUoaW5pdGlhbGlzc3VlZGF0ZSkpKSAlPiUNCiAgICBmaWx0ZXIobGljZW5zZXR5cGUgPT0gIlNwZWNpYWwgQXNzZW1ibHkgT2NjdXBhbmN5IikgJT4lDQogICAgYXMuZGF0YS5mcmFtZSgpICU+JQ0KICBncm91cF9ieSh5ZWFyKSAlPiUNCiAgdGFsbHkoKSAlPiUNCiAgbXV0YXRlKEFjdGlvbiA9ICJBY3RpdmF0ZWQiKSkgJT4lDQogIGZpbHRlcih5ZWFyIDwgMjAyMiAmIHllYXIgPiAyMDA2KSAlPiUNCiAgZ2dwbG90KCkrDQogIGdlb21fbGluZShhZXMoeSA9IG4sIHggPSB5ZWFyLCBjb2xvciA9IEFjdGlvbiksIHN0YXQgPSAiaWRlbnRpdHkiKSArDQogIGxhYnModGl0bGU9IlNwZWNpYWwgQXNzZW1ibHkgT2NjdXBhbmN5IExpY2Vuc2UgSXNzdWFuY2UgYW5kIENsb3N1cmUiLA0KICAgICAgIHN1YnRpdGxlPSAiRGF0YSB0aHJvdWdoIE1heSwgMjAyMi4gU291cmNlOiBQaGlsYWRlbHBoaWEgRGVwdC4gT2YgTGljZW5zZXMgJiBJbnNwZWN0aW9ucyIsDQogICAgICAgeD0iWWVhciIsIA0KICAgICAgIHk9Ik51bWJlciBvZiBMaWNlbnNlcyIpKw0KICBwbG90VGhlbWUNCg0KYGBgDQoNCmBgYHtyIGxpY2Vuc2VfdGltZWxpbmVfaW5hY3RpdmU0LCBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KbGljZW5zZXMgJT4lDQogIGZpbHRlcihsaWNlbnNldHlwZSA9PSAiU3BlY2lhbCBBc3NlbWJseSBPY2N1cGFuY3kiLA0KICAgICAgICAgbGljZW5zZXN0YXR1cyAhPSAiQWN0aXZlIikgJT4lDQogIG11dGF0ZSh5ZWFyID0geWVhcihhcy5EYXRlKGV4cGlyYXRpb25kYXRlKSkpICU+JQ0KICBhcy5kYXRhLmZyYW1lICU+JQ0KICBncm91cF9ieSh5ZWFyKSAlPiUNCiAgdGFsbHkoKSAlPiUNCiAgcmVuYW1lKGluYWN0aXZhdGVkID0gbikgJT4lDQogIGZ1bGxfam9pbiguLCANCiAgbGljZW5zZXMgJT4lDQogICAgZmlsdGVyKGxpY2Vuc2V0eXBlID09ICJTcGVjaWFsIEFzc2VtYmx5IE9jY3VwYW5jeSIpICU+JQ0KICBtdXRhdGUoeWVhciA9IHllYXIoYXMuRGF0ZShpbml0aWFsaXNzdWVkYXRlKSkpICU+JQ0KICAgIGFzLmRhdGEuZnJhbWUoKSAlPiUNCiAgZ3JvdXBfYnkoeWVhcikgJT4lDQogIHRhbGx5KCkgJT4lDQogIHJlbmFtZShhY3RpdmF0ZWQgPSBuKSkgJT4lDQogIGFycmFuZ2UoeWVhcikgJT4lDQogIG11dGF0ZShpbmFjdGl2YXRlZCA9IGlmZWxzZShpcy5uYShpbmFjdGl2YXRlZCkgPT0gVFJVRSwgMCwgaW5hY3RpdmF0ZWQpLA0KICAgIHllYXJseV9uZXQgPSBhY3RpdmF0ZWQgLSBpbmFjdGl2YXRlZCwNCiAgICAgICAgIGFjdGl2ZV9saWNlbnNlcyA9IGN1bXN1bSh5ZWFybHlfbmV0KSkgJT4lDQogIGZpbHRlcih5ZWFyID4yMDA5ICYgeWVhciA8IDIwMjMpICU+JQ0KICBnZ3Bsb3QoKSsNCiAgZ2VvbV9iYXIoYWVzKHkgPSBhY3RpdmVfbGljZW5zZXMsIHggPSB5ZWFyKSwgc3RhdCA9ICJpZGVudGl0eSIpICsNCiAgbGFicyh0aXRsZT0iQWN0aXZlIFNwZWNpYWwgQXNzZW1ibHkgT2NjdXBhbmN5IExpY2Vuc2VzIiwNCiAgICAgICBzdWJ0aXRsZT0gIkFjdGl2YXRpb25zIE1pbnVzIEV4cGlyYXRpb25zIEJ5IFllYXIgZnJvbSBSZWNvcmRzIDEvMjAwNSAtIDUvMjAyMi4gU291cmNlOiBQaGlsYWRlbHBoaWEgRGVwdC4gT2YgTGljZW5zZXMgJiBJbnNwZWN0aW9ucyIsDQogICAgICAgeD0iWWVhciIsIA0KICAgICAgIHk9Ik51bWJlciBvZiBMaWNlbnNlcyIpKw0KICBwbG90VGhlbWUNCg0KYGBgDQoNCiMjIDQuNC4gU0FPTHMgYW5kIEJ5LVJpZ2h0IFpvbmluZw0KDQpBbW9uZyBhY3RpdmUgU3BlY2lhbCBBc3NlbWJseSBPY2N1cGFuY3kgTGljZW5zZXMsIG9ubHkgMzUgKDI4JSkgd2VyZSBwZXJtaXR0ZWQgYnkgcmlnaHQgaW4gdGhlIHpvbmVzIHdoZXJlIHRoZXkgd2VyZSBjcmVhdGVkLg0KDQpgYGB7ciBsaWNlbnNlc19hbmRfem9uZXMxLCBlY2hvPUZBTFNFLCB3YXJuaW5nID0gRkFMU0UsIG1lc3NhZ2UgPSBGQUxTRX0NCmxpY2Vuc2VzICU+JSANCiAgZmlsdGVyKGxpY2Vuc2V0eXBlID09ICJTcGVjaWFsIEFzc2VtYmx5IE9jY3VwYW5jeSIsDQogICAgICAgICBsaWNlbnNlc3RhdHVzID09ICJBY3RpdmUiKSAlPiUgDQogIHN0X2pvaW4oLiwgem9uZXMpICU+JSANCiAgYXMuZGF0YS5mcmFtZSgpICU+JQ0KICBncm91cF9ieShhc3NlbWJseV9hbGxvd2VkLCBMT05HX0NPREUpICU+JSANCiAgdGFsbHkoKSAlPiUNCiAgcmVuYW1lKG5fbGljZW5zZXMgPSBuKSAlPiUNCiAgbGVmdF9qb2luKC4sIHpvbmVzICU+JQ0KICAgICAgICAgICAgICBhcy5kYXRhLmZyYW1lKCkgJT4lDQogICAgICAgICAgICAgIGdyb3VwX2J5KExPTkdfQ09ERSkgJT4lDQogICAgICAgICAgICAgIHRhbGx5KCkgJT4lDQogICAgICAgICAgICAgIHJlbmFtZSggdG90YWxfem9uZV9wYXJjZWxzID0gbikpICU+JQ0KICBncm91cF9ieShhc3NlbWJseV9hbGxvd2VkLCBMT05HX0NPREUpICU+JQ0KICBzdW1tYXJpemUobl9saWNlbnNlcyA9IHN1bShuX2xpY2Vuc2VzKSkgJT4lDQogIHVuZ3JvdXAoKSAlPiUNCiAgbXV0YXRlKHBjdCA9IHJvdW5kKDEwMCoobl9saWNlbnNlcyAvIHN1bShuX2xpY2Vuc2VzKSksMikpICU+JQ0KICBrYWJsZSgpICAlPiUNCiAga2FibGVfc3R5bGluZygpDQogIA0KYGBgDQpgYGB7ciBsaWNlbnNlc19hbmRfem9uZXMyLCBlY2hvPUZBTFNFLCB3YXJuaW5nID0gRkFMU0UsIG1lc3NhZ2UgPSBGQUxTRX0NCmxpY2Vuc2VzICU+JSANCiAgZmlsdGVyKGxpY2Vuc2V0eXBlID09ICJTcGVjaWFsIEFzc2VtYmx5IE9jY3VwYW5jeSIsDQogICAgICAgICBsaWNlbnNlc3RhdHVzID09ICJBY3RpdmUiKSAlPiUgDQogIHN0X2pvaW4oLiwgem9uZXMpICU+JSANCiAgYXMuZGF0YS5mcmFtZSgpICU+JQ0KICBncm91cF9ieShhc3NlbWJseV9hbGxvd2VkLCBMT05HX0NPREUpICU+JSANCiAgdGFsbHkoKSAlPiUNCiAgcmVuYW1lKG5fbGljZW5zZXMgPSBuKSAlPiUNCiAgbGVmdF9qb2luKC4sIHpvbmVzICU+JQ0KICAgICAgICAgICAgICBhcy5kYXRhLmZyYW1lKCkgJT4lDQogICAgICAgICAgICAgIGdyb3VwX2J5KExPTkdfQ09ERSkgJT4lDQogICAgICAgICAgICAgIHRhbGx5KCkgJT4lDQogICAgICAgICAgICAgIHJlbmFtZSggdG90YWxfem9uZV9wYXJjZWxzID0gbikpICU+JQ0KICBncm91cF9ieShhc3NlbWJseV9hbGxvd2VkKSAlPiUNCiAgc3VtbWFyaXplKG5fbGljZW5zZXMgPSBzdW0obl9saWNlbnNlcykpICU+JQ0KICB1bmdyb3VwKCkgJT4lDQogIG11dGF0ZShwY3QgPSByb3VuZCgxMDAqKG5fbGljZW5zZXMgLyBzdW0obl9saWNlbnNlcykpLDIpKSAlPiUNCiAga2FibGUoKSAlPiUNCiAga2FibGVfc3R5bGluZygpDQogIA0KYGBgDQoNCg0KSGFzIHRoaXMgcGhlbm9tZW5vbiBiZWVuIGNoYW5naW5nIG92ZXIgdGltZT8gTm90IG11Y2ggaW4gdGhlIGxhc3QgMTUgeWVhcnMhDQoNCmBgYHtyIGxpY2Vuc2VzX2FuZF96b25lczMsIGVjaG89RkFMU0UsIHdhcm5pbmcgPSBGQUxTRSwgbWVzc2FnZSA9IEZBTFNFfQ0KbGljZW5zZXMgJT4lIA0KICBmaWx0ZXIobGljZW5zZXR5cGUgPT0gIlNwZWNpYWwgQXNzZW1ibHkgT2NjdXBhbmN5IikgJT4lIA0KICBtdXRhdGUoeWVhcl9pc3N1ZWQgPSB5ZWFyKGFzLkRhdGUoaW5pdGlhbGlzc3VlZGF0ZSkpKSAlPiUNCiAgc3Rfam9pbiguLCB6b25lcykgJT4lIA0KICBhcy5kYXRhLmZyYW1lKCkgJT4lDQogIGdyb3VwX2J5KGFzc2VtYmx5X2FsbG93ZWQsIHllYXJfaXNzdWVkKSAlPiUgDQogIHRhbGx5KCkgJT4lDQogIHJlbmFtZShuX2xpY2Vuc2VzID0gbikgJT4lDQogIHVuZ3JvdXAoKSU+JQ0KICBsZWZ0X2pvaW4oLiwgbGljZW5zZXMgJT4lIA0KICAgIGZpbHRlcihsaWNlbnNldHlwZSA9PSAiU3BlY2lhbCBBc3NlbWJseSBPY2N1cGFuY3kiKSAlPiUgDQogICAgbXV0YXRlKHllYXJfaXNzdWVkID0geWVhcihhcy5EYXRlKGluaXRpYWxpc3N1ZWRhdGUpKSkgJT4lDQogICAgZ3JvdXBfYnkoeWVhcl9pc3N1ZWQpICU+JQ0KICAgIHRhbGx5KCkgJT4lDQogICAgICByZW5hbWUodG90YWxfbGljZW5zZXMgPSBuKSkgJT4lDQogIG11dGF0ZShwY3QgPSAxMDAqKG5fbGljZW5zZXMgLyB0b3RhbF9saWNlbnNlcykpICU+JQ0KICBmaWx0ZXIoYXNzZW1ibHlfYWxsb3dlZCA9PSAiQnktUmlnaHQiKSAlPiUNCiAgZ2dwbG90KCkrDQogIGdlb21fbGluZShhZXMoeCA9IHllYXJfaXNzdWVkLCB5ID0gcGN0KSkrDQogIGxhYnModGl0bGU9IlBjdCBvZiBTcGVjaWFsIEFzc2VtYmx5IE9jY3VwYW5jeSBMaWNlbnNlIElzc3VhbmNlIEJ5LVJpZ2h0IiwNCiAgICAgICB4PSJZZWFyIiwgDQogICAgICAgeT0iUGN0IG9mIHRvdGFsIFNBT0xzIikrDQogIHBsb3RUaGVtZQ0KICANCmBgYA0KDQojIDUuIEFtdXNlbWVudCBMaWNlbnNlcw0KDQpIZXJlIGlzIGFuIGFjdGl2YXRpb24vaW5hY3RpdmF0aW9uIHRpbWVsaW5lIGZvciBhbXVzZW1lbnQgbGljZW5zZXMgLSB0aGVzZSBkYXRhIGFwcGVhciB0byBzdGFydCBiZWluZyByZWxpYWJsZSBpbiBhYm91dCAyMDE1IC0gaW4gMjAxNCwgaHVuZHJlZHMgb2YgbGljZW5zZXMgd2VyZSBhZGRlZCB0byB0aGUgcmVnaXN0ZXIgKHBvc3NpYmx5IGR1ZSB0byBhIHJlY29yZGluZyBzcHJpbnQpLg0KDQpgYGB7ciBhbXVzZW1lbnRfbGljZW5zZV90aW1lbGluZV9pbmFjdGl2ZTMsIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQpsaWNlbnNlcyAlPiUNCiAgZmlsdGVyKGxpY2Vuc2V0eXBlID09ICJBbXVzZW1lbnQiLA0KICAgICAgICAgbGljZW5zZXN0YXR1cyAhPSAiQWN0aXZlIikgJT4lDQogIG11dGF0ZSh5ZWFyID0geWVhcihhcy5EYXRlKGV4cGlyYXRpb25kYXRlKSkpICU+JQ0KICBhcy5kYXRhLmZyYW1lICU+JQ0KICBncm91cF9ieSh5ZWFyKSAlPiUNCiAgdGFsbHkoKSAlPiUNCiAgcmVuYW1lKGluYWN0aXZhdGVkID0gbikgJT4lDQogIGZ1bGxfam9pbiguLCANCiAgbGljZW5zZXMgJT4lDQogICAgZmlsdGVyKGxpY2Vuc2V0eXBlID09ICJBbXVzZW1lbnQiKSAlPiUNCiAgbXV0YXRlKHllYXIgPSB5ZWFyKGFzLkRhdGUoaW5pdGlhbGlzc3VlZGF0ZSkpKSAlPiUNCiAgICBhcy5kYXRhLmZyYW1lKCkgJT4lDQogIGdyb3VwX2J5KHllYXIpICU+JQ0KICB0YWxseSgpICU+JQ0KICByZW5hbWUoYWN0aXZhdGVkID0gbikpICU+JQ0KICBhcnJhbmdlKHllYXIpICU+JQ0KICBtdXRhdGUoaW5hY3RpdmF0ZWQgPSBpZmVsc2UoaXMubmEoaW5hY3RpdmF0ZWQpID09IFRSVUUsIDAsIGluYWN0aXZhdGVkKSwNCiAgICB5ZWFybHlfbmV0ID0gYWN0aXZhdGVkIC0gaW5hY3RpdmF0ZWQsDQogICAgICAgICBhY3RpdmVfbGljZW5zZXMgPSBjdW1zdW0oeWVhcmx5X25ldCkpICU+JQ0KICBmaWx0ZXIoeWVhciA+MjAwNyApICU+JQ0KICBnZ3Bsb3QoKSsNCiAgZ2VvbV9iYXIoYWVzKHkgPSBhY3RpdmVfbGljZW5zZXMsIHggPSB5ZWFyKSwgc3RhdCA9ICJpZGVudGl0eSIpICsNCiAgbGFicyh0aXRsZT0iQWN0aXZlIEFtdXNlbWVudCBMaWNlbnNlcyIsDQogICAgICAgc3VidGl0bGU9ICJBY3RpdmF0aW9ucyBNaW51cyBFeHBpcmF0aW9ucyBCeSBZZWFyIGZyb20gUmVjb3JkcyAxLzIwMDUgLSA1LzIwMjIuIFNvdXJjZTogUGhpbGFkZWxwaGlhIERlcHQuIE9mIExpY2Vuc2VzICYgSW5zcGVjdGlvbnMiLA0KICAgICAgIHg9IlllYXIiLCANCiAgICAgICB5PSJOdW1iZXIgb2YgTGljZW5zZXMiKSsNCiAgcGxvdFRoZW1lDQoNCmBgYA0KDQpOZXh0IHN0ZXBzIC0gDQoNCkhvdyBpcyB0aGlzIHJlbGF0ZWQgdG8gcHJvcGVydHkgY29zdHMgLyB0YXggcmF0ZXMgLyB2YWx1YXRpb24/DQpIb3cgbWFueSBjYW4gd2UgdmVyaWZ5IGFyZSBtdXNpYyB2ZW51ZXMgdnMsIHNheSBhZHVsdCBlbnRlcnRhaW5tZW50Pw0KQXJlIHRlbXBvcmFyeSBhc3NlbWJseSBsaWNlbnNlcyBpbiB0aGUgZGF0YSBzZXQ/DQpIb3cgZ29vZCBhcmUgdGhlc2UgZGF0YSwgcmVhbGx5Pw0KDQoNCiMgNi4gRmlyZWFybSBJbmNpZGVudHMgYXQgTmlnaHQgaW4gUGhpbGFkZWxwaGlhDQoNClRoZXJlIGlzIG9uZ29pbmcgY29uY2VybiBhYm91dCBndW4gY3JpbWUgaW4gUGhpbGFkZWxwaGlhLiBHdW4gY3JpbWUgaXMgcmlzaW5nIGZvciB0aGUgY2l0eSBhcyBhIHdob2xlLiAyMDIxIHdhcyBhIHBhcnRpY3VsYXJseSBiYWQgeWVhciBmb3IgZ3VuIGNyaW1lLiBbQWNjb3JkaW5nIHRvIEZCSSdzIHVuaWZvcm0gY3JpbWUgcmVwb3J0XShodHRwczovL2NyaW1lLWRhdGEtZXhwbG9yZXIuYXBwLmNsb3VkLmdvdi9wYWdlcy9leHBsb3Jlci9jcmltZS9jcmltZS10cmVuZCksIG5hdGlvbmFsIHJhdGVzIG9mIHZpb2xlbnQgY3JpbWUgYXJlIGRvd24gc3Vic3RhbnRpYWxseSBmcm9tIHBlYWsgcmVjb3JkZWQgbGV2ZWxzIGluIHRoZSAxOTkwcy4NCg0KVGhpcyBzZWN0aW9uIGFuYWx5emVzIFtQaGlsYWRlbHBoaWEgUG9saWNlIERlcGFydG1lbnQgKFBQRCkgZmlyZWFybSBpbmNpZGVudCByZXBvcnRzXShodHRwczovL3d3dy5vcGVuZGF0YXBoaWxseS5vcmcvZGF0YXNldC9jcmltZS1pbmNpZGVudHMpIGZyb20gSmFudWFyeSwgMjAxNyB0byBKdW5lLCAyMDIyIGluIHJlbGF0aW9uIHRvIHRoZSBsb2NhdGlvbiBvZiBDb21tZXJjZSBEZXB0LiBkZXNpZ25hdGVkIFtjb21tZXJjaWFsIGNvcnJpZG9yc11odHRwczovL3d3dy5vcGVuZGF0YXBoaWxseS5vcmcvZGF0YXNldC9jb21tZXJjaWFsLWNvcnJpZG9ycywgYW5kIHRoZSBsb2NhdGlvbiBvZiBbZm9vZCBzZXJ2aWNlLCBzaWRld2FsayBjYWZlLCBzcGVjaWFsIGFzc2VtYmx5IG9jY3VwYW5jeSwgYW5kIGVudGVydGFpbm1lbnQgbGljZW5zZXNdKGh0dHBzOi8vd3d3Lm9wZW5kYXRhcGhpbGx5Lm9yZy9kYXRhc2V0L2xpY2Vuc2VzLWFuZC1pbnNwZWN0aW9ucy1idXNpbmVzcy1saWNlbnNlcykuIFdlIGRvIG5vdCBoYXZlIHNwZWNpZmljIGluZm9ybWF0aW9uIGFib3V0IHdoZW4gc3BlY2lmaWMgZXN0YWJsaXNobWVudHMgb3BlbiBvciBjbG9zZS4NCg0KS2VlcCBpbiBtaW5kIHRoYXQgdGhlc2UgYXJlIHJlcG9ydGVkIGluY2lkZW50cyAtIHN1YmplY3QgdG8gYmlhcyBpbiBvYnNlcnZhdGlvbiwgcmVwb3J0aW5nLCBhbmQgY2xhc3NpZmljYXRpb24uDQoNClRoZSBtYWpvciB0YWtlYXdheXMgZnJvbSBvdXIgYW5hbHlzaXMgYXJlIGFzIGZvbGxvd3M6DQoNCjEuIEZpcmVhcm0gaW5jaWRlbnRzIGFyZSByaXNpbmcgZm9yIHRoZSBjaXR5IGFzIGEgd2hvbGUuIA0KDQoyLiBNb3N0IGluY2lkZW50cyBoYXBwZW4gYXQgbmlnaHQsIGJldHdlZW4gYXBwcm94aW1hdGVseSAxMVBNIGFuZCAxQU0uIA0KDQozLiBHdW4gY3JpbWUgYXQgbmlnaHQgbW9zdGx5IGhhcHBlbnMgYXdheSBmcm9tIGVzdGFibGlzaG1lbnRzIGluIGNvbW1lcmNpYWwgY29ycmlkb3JzICh+ODglKSwgYW5kIG1vc3RseSBjb25jZW50cmF0ZWQgaW4gbmVpZ2hib3Job29kcyB3aXRoIGhpZ2ggdm9sdW1lcyBvZiBpbmNpZGVudHMuDQoNCjQuIElmIHlvdSBhcmUgbmVhciBhIGxpY2Vuc2VkIGVzdGFibGlzaG1lbnQgYXQgbmlnaHQgaW4gYSBwbGFjZSB3aXRoIHJlbGF0aXZlbHkgbG93IGd1biBjcmltZSwgeW91IGFyZSBtdWNoLCBtdWNoIGxlc3MgbGlrZWx5IHRvIGJlIGV4cG9zZWQgdG8gYW4gaW5jaWRlbnQgdGhhbiBpZiB5b3UgYXJlIGVsc2V3aGVyZS4NCg0KNS4gRWFzdGVybiBzZWdtZW50cyBvZiBTb3V0aCBTdHJlZXQgYXJlIHNvbWUgb2YgdGhlIGhpZ2hlc3QgdHJhZmZpYyBsb2NhbCBuaWdodGxpZmUgY29ycmlkb3JzIGFuZCBkcmF3IGEgdmVyeSB3aWRlIHNjb3BlIG9mIHZpc2l0b3JzLCBidXQgaGF2ZSBjb21wYXJhdGl2ZWx5IGxvdyBmcmVxdWVuY2llcyBvZiBpbmNpZGVudHMuDQoNCmBgYHtyIGxvYWRfY3JpbWVfZGF0YSwgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCiMgaHR0cHM6Ly9jaXR5b2ZwaGlsYWRlbHBoaWEuZ2l0aHViLmlvL2NhcnRvLWFwaS1leHBsb3Jlci8jaW5jaWRlbnRzX3BhcnQxX3BhcnQyDQojIEphbiAxLCAyMDE3IHRvIEp1bmUgMjcsIDIwMjINCnBoaWxhQ3JpbWUgPC0gcmVhZC5jc3YoImh0dHBzOi8vcGhsLmNhcnRvLmNvbS9hcGkvdjIvc3FsP2ZpbGVuYW1lPWluY2lkZW50c19wYXJ0MV9wYXJ0MiZmb3JtYXQ9Y3N2JnE9U0VMRUNUJTIwKiUyMCwlMjBTVF9ZKHRoZV9nZW9tKSUyMEFTJTIwbGF0LCUyMFNUX1godGhlX2dlb20pJTIwQVMlMjBsbmclMjBGUk9NJTIwaW5jaWRlbnRzX3BhcnQxX3BhcnQyJTIwV0hFUkUlMjBkaXNwYXRjaF9kYXRlX3RpbWUlMjAlM0U9JTIwJTI3MjAxNy0wMS0wMSUyNyUyMEFORCUyMGRpc3BhdGNoX2RhdGVfdGltZSUyMCUzQyUyMCUyNzIwMjItMDYtMjclMjciKQ0KDQojIEtlZXAgb25seSB2aW9sZW50IGNyaW1lIHR5cGVzLCBmaXggdHlwb3MgaW4gaG9taWNpZGUgZGF0YSBlbnRyeSwNCiMgQ3JlYXRlIHRpbWUgdmFyaWFibGVzDQojIEZpbHRlciBvdXQgZGF0YSB3aXRoIGJhZCBnZW9tZXRyeSBpbmZvcm1hdGlvbg0KDQp2aW9sZW50Q3JpbWUgPC0gcGhpbGFDcmltZSAlPiUgDQogIGZpbHRlcih0ZXh0X2dlbmVyYWxfY29kZSAlaW4lIGMoIk90aGVyIEFzc2F1bHRzIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUaGVmdHMiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFnZ3JhdmF0ZWQgQXNzYXVsdCBGaXJlYXJtIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBZ2dyYXZhdGVkIEFzc2F1bHQgTm8gRmlyZWFybSIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUm9iYmVyeSBGaXJlYXJtIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJSb2JiZXJ5IE5vIEZpcmVhcm0iLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhvbWljaWRlIC0gQ3JpbWluYWwiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhvbWljaWRlIC0gQ3JpbWluYWwgIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJSYXBlIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJPdGhlciBTZXggT2ZmZW5zZXMgKE5vdCBDb21tZXJjaWFsaXplZCIpKSAlPiUNCiAgbXV0YXRlKHRleHRfZ2VuZXJhbF9jb2RlID0gaWZlbHNlKHN0cl9kZXRlY3QodGV4dF9nZW5lcmFsX2NvZGUsICJIb21pY2lkZSIpID09IFRSVUUsDQogICAgICAgICAiSG9taWNpZGUgLSBDcmltaW5hbCIsIHRleHRfZ2VuZXJhbF9jb2RlKSkgJT4lDQogIG11dGF0ZShpbnRlcnZhbDYwID0gZmxvb3JfZGF0ZSh5bWQoZGlzcGF0Y2hfZGF0ZSksIHVuaXQgPSAiaG91ciIpLA0KICAgICAgICAgd2VlayA9IHdlZWsoaW50ZXJ2YWw2MCksDQogICAgICAgICBtb250aCA9IG1vbnRoKGludGVydmFsNjApLA0KICAgICAgICAgZG90dyA9IHdkYXkoaW50ZXJ2YWw2MCwgbGFiZWw9VFJVRSksDQogICAgICAgICB5ZWFyID0geWVhcihpbnRlcnZhbDYwKSwNCiAgICAgICAgIGhvdXIgPSBob3VyKGhtcyhkaXNwYXRjaF90aW1lKSkpICU+JQ0KICBtdXRhdGUoYWZ0ZXJfc2l4ID0gaWZlbHNlKGhvdXIgPiAxNyB8IGhvdXIgPCA3LCAiNlBNIC0gNkFNIiwgIjZBTSAtIDZQTSIpKQ0KDQojIFNwYXRpYWxpemUgZGF0YSwgZHJvcCBkYXRhIHdpdGhvdXQgc3BhdGlhbCBpbmZvDQoNCnZpb2xlbnRDcmltZV9zaHAgPC0gdmlvbGVudENyaW1lICU+JQ0KICBmaWx0ZXIocG9pbnRfeSA+IDEsDQogICAgICAgICBwb2ludF94ID4gLTc2LA0KICAgICAgICAgcG9pbnRfeCA8IC03MykgJT4lDQogIHN0X2FzX3NmKGNvb3JkcyA9IGMoImxuZyIsICJsYXQiKSwgY3JzID0gNDMyNikgJT4lDQogIHN0X3RyYW5zZm9ybSgyMjcyKQ0KDQojIFRha2UgdGhlIGxpY2Vuc2VzIGZvciByZXN0YXVyYW50cywgYW11c2VtZW50LCBhc3NlbWJseSwgZm9vZCBlc3RhYmxpc2htZW50DQojIENyZWF0ZSAyMDAgZnQgYnVmZmVycyBhcm91bmQgY3VycmVudCBsaWNlbnNlcw0KIyBUaGVuIGRvIGEgc2ltaWxhciB0aGluZyBmb3Igb2xkZXIgbGljZW5zZXMgZm9yIGNvbXBhcmlzb24gLSBtYXliZSAyMDE4IG9yIDE5DQoNCm5pZ2h0TGljZW5zZXMgPC0gc3RfcmVhZCgiaHR0cHM6Ly9waGwuY2FydG8uY29tL2FwaS92Mi9zcWw/cT1TRUxFQ1QrKitGUk9NK2J1c2luZXNzX2xpY2Vuc2VzJmZpbGVuYW1lPWJ1c2luZXNzX2xpY2Vuc2VzJmZvcm1hdD1nZW9qc29uJnNraXBmaWVsZHM9Y2FydG9kYl9pZCIpICU+JQ0KICBmaWx0ZXIobGljZW5zZXR5cGUgJWluJSBjKCJBbXVzZW1lbnQiLCAiU3BlY2lhbCBBc3NlbWJseSBPY2N1cGFuY3kiLCAiU2lkZXdhbGsgQ2FmZSIpIHwNCiAgICAgICAgICAgc3RyX2RldGVjdChsaWNlbnNldHlwZSwgIkZvb2QgRXN0YWIiKSkgJT4lDQogIHN0X3RyYW5zZm9ybShjcnMgPSAyMjcyKQ0KDQpjdXJyZW50X2J1ZmZlciA8LSBuaWdodExpY2Vuc2VzICU+JQ0KICBmaWx0ZXIobGljZW5zZXN0YXR1cyA9PSAiQWN0aXZlIikgJT4lDQogIHN0X3VuaW9uKCkgJT4lDQogIHN0X2J1ZmZlcigyMDApICU+JQ0KICBzdF9hc19zZihjcnMgPSAyMjcyKSAlPiUNCiAgbXV0YXRlKGluX2J1ZmZlciA9ICJpbiBidWZmZXIiKQ0KDQojIExvYWQgQ29ycmlkb3JzDQoNCmNvcnJpZG9ycyA8LSBzdF9yZWFkKCJodHRwczovL29wZW5kYXRhLmFyY2dpcy5jb20vZGF0YXNldHMvZjQzZTVmOTJkMzRlNDEyNDllN2ExMWYyNjk3OTJkMTFfMC5nZW9qc29uIikgJT4lDQogIHN0X2FzX3NmKCkgJT4lDQogIHN0X3RyYW5zZm9ybShjcnMgPSAyMjcyKQ0KDQpgYGANCg0KIyMgNi4xLiBUaW1lIHBhdHRlcm5zIG9mIGZpcmVhcm0gaW5jaWRlbnRzDQoNCldlIGV4YW1pbmVkIGEgY2F0ZWdvcnkgb2YgaW5jaWRlbnRzIHJlY29yZGVkIGJldHdlZW4gSmFudWFyeSAxLCAyMDE3IGFuZCBKdW5lIDI3LCAyMDIyIC0gaW5jaWRlbnRzIGNsYXNzaWZpZWQgYnkgdGhlIFBQRCBhcyBDcmltaW5hbCBIb21pY2lkZSwgUm9iYmVyeSB3aXRoIGEgRmlyZWFybSwgQWdncmF2YXRlZCBBc3NhdWx0IHdpdGggYSBGaXJlYXJtLg0KDQpgYGB7ciB0b3RhbF9ndW5faW5jaWRlbnRzLCBlY2hvPUZBTFNFLCB3YXJuaW5nID0gRkFMU0UsIG1lc3NhZ2UgPSBGQUxTRX0NCnZpb2xlbnRDcmltZSAlPiUNCiAgICBmaWx0ZXIodGV4dF9nZW5lcmFsX2NvZGUgJWluJSBjKCJBZ2dyYXZhdGVkIEFzc2F1bHQgRmlyZWFybSIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJvYmJlcnkgRmlyZWFybSIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhvbWljaWRlIC0gQ3JpbWluYWwiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJIb21pY2lkZSAtIENyaW1pbmFsICIpKSAlPiUNCiAgICBncm91cF9ieSh0ZXh0X2dlbmVyYWxfY29kZSwgeWVhciwgbW9udGgpICU+JQ0KICAgIHRhbGx5KCkgJT4lDQogICAgbXV0YXRlKGRhdGUgPSBsdWJyaWRhdGU6Om15KHBhc3RlKG1vbnRoLCB5ZWFyKSkpICU+JQ0KICAgIGdncGxvdCgpKw0KICAgIGdlb21fbGluZShhZXMoeCA9IGRhdGUsIHkgPSBuLCBjb2xvciA9IHRleHRfZ2VuZXJhbF9jb2RlKSkrDQogICAgeWxpbSgwLCA1MDApKw0KICAgIGxhYnModGl0bGU9Ik1vbnRobHkgRmlyZWFybSBJbmNpZGVudHMgQnkgVHlwZSwgMjAxNy0yMDIyIiwNCiAgICAgICAgIHN1YnRpdGxlPSAiU291cmNlOiBQaGlsYWRlbHBoaWEgUG9saWNlIERlcHQuIiwNCiAgICAgICAgIHg9IlllYXIiLCANCiAgICAgICAgIHk9Ik1vbnRobHkgUmVwb3J0ZWQgSW5jaWRlbnRzIikrDQogICAgcGxvdFRoZW1lDQoNCmBgYA0KDQpgYGB7ciBkYXlfYW5kX3RpbWUsIGVjaG89RkFMU0UsIHdhcm5pbmcgPSBGQUxTRSwgbWVzc2FnZSA9IEZBTFNFIH0NCg0KdmlvbGVudENyaW1lICU+JQ0KICBmaWx0ZXIodGV4dF9nZW5lcmFsX2NvZGUgJWluJSBjKCJBZ2dyYXZhdGVkIEFzc2F1bHQgRmlyZWFybSIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJSb2JiZXJ5IEZpcmVhcm0iLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSG9taWNpZGUgLSBDcmltaW5hbCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJIb21pY2lkZSAtIENyaW1pbmFsICIpKSAlPiUNCiAgZ3JvdXBfYnkoYWZ0ZXJfc2l4LCB5ZWFyLCBtb250aCkgJT4lDQogIHRhbGx5KCkgJT4lDQogIG11dGF0ZShkYXRlID0gbHVicmlkYXRlOjpteShwYXN0ZShtb250aCwgeWVhcikpKSAlPiUNCiAgZ2dwbG90KCkrDQogIGdlb21fbGluZShhZXMoeCA9IGRhdGUsIHkgPSBuLCBjb2xvciA9IGFmdGVyX3NpeCkpKw0KICAgIHlsaW0oMCwgNTAwKSsNCiAgbGFicyh0aXRsZT0iTW9udGhseSBGaXJlYXJtIEluY2lkZW50cyBCeSBUaW1lIG9mIERheSwgMjAxNy0yMDIyIiwNCiAgICAgICBzdWJ0aXRsZT0gIkhvbWljaWRlLCBBZ2dyYXZhdGVkIEFzc2F1bHQsIFJvYmJlcnkgd2l0aCBGaXJlYXJtcy5cbiBTb3VyY2U6IFBoaWxhZGVscGhpYSBQb2xpY2UgRGVwdC4iLA0KICAgICAgIHg9IlllYXIiLCANCiAgICAgICB5PSJNb250aGx5IFJlcG9ydGVkIEluY2lkZW50cyIpKw0KICBwbG90VGhlbWUNCmBgYA0KDQpNb3N0IGd1biBjcmltZSwgb3ZlcmFsbCwgaGFwcGVucyBpbiB0aGUgZXZlbmluZywgYmV0d2VlbiBhYm91dCAxMSBQTSBhbmQgMUFNLCB3aXRoIG11Y2ggb2YgaXQgY29uY2VudHJhdGVkIGFyb3VuZCBtaWRuaWdodC4gDQoNCmBgYHtyIGFsbF9jcmltZXNfZGF5LCBlY2hvPUZBTFNFLCB3YXJuaW5nID0gRkFMU0UsIG1lc3NhZ2UgPSBGQUxTRX0NCnZpb2xlbnRDcmltZSAlPiUNCiAgZmlsdGVyKHllYXIgPiAyMDIwKSAlPiUNCiAgZmlsdGVyKHRleHRfZ2VuZXJhbF9jb2RlICVpbiUgYygiQWdncmF2YXRlZCBBc3NhdWx0IEZpcmVhcm0iLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUm9iYmVyeSBGaXJlYXJtIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhvbWljaWRlIC0gQ3JpbWluYWwiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSG9taWNpZGUgLSBDcmltaW5hbCAiKSkgJT4lDQogIGdyb3VwX2J5KGhvdXIsIGRvdHcpICU+JQ0KICB0YWxseSgpICU+JQ0KICBnZ3Bsb3QoKSsNCiAgZ2VvbV9saW5lKGFlcyh4PSBob3VyLCB5ID0gbikpKw0KICBmYWNldF93cmFwKH5kb3R3KSsNCiAgbGFicyh0aXRsZT0iSG91cmx5IFJlcG9ydGVkIEZpcmVhcm0gSW5jaWRlbnRzLCAyMDE3LTIwMjIiLA0KICAgICAgIHN1YnRpdGxlPSAiSG9taWNpZGUgYW5kIEFnZ3JhdmF0ZWQgQXNzYXVsdCwgUm9iYmVyeSB3aXRoIEZpcmVhcm1zLlxuIFNvdXJjZTogUGhpbGFkZWxwaGlhIFBvbGljZSBEZXB0LiIsDQogICAgICAgeD0iSG91ciBvZiB0aGUgRGF5IiwgDQogICAgICAgeT0iSG91cmx5IFJlcG9ydGVkIEluY2lkZW50cyIpKw0KICBwbG90VGhlbWUNCg0KYGBgDQoNClRoZSBmb2xsb3dpbmcgcGxvdHMgc2hvdyBhbGwgZmlyZWFybSBpbmNpZGVudHMgc2luY2UgMjAyMCwgYnJva2VuIGRvd24gYnkgZGF5IG9mIHRoZSB3ZWVrIGFuZCBob3VyIHJlcG9ydGVkLiBUaGUgMTJQTSAoMGgpIHRpbWUgb2YgZGF5IGhhcyB0aGUgaGlnaGVzdCByZXBvcnRpbmcgY291bnQgYnkgZmFyIG9mIGFueSB0aW1lIG9mIGRheS4gSXQgaXMgdW5jbGVhciBob3cgbXVjaCBvZiB0aGF0IGlzIHJlbGF0ZWQgdG8gcmVjb3JkLWtlZXBpbmcgcHJhY3RpY2VzLCBidXQgaXQgZG9lc24ndCBzZWVtIGxpa2UgdGhlcmUncyBhIHBhdHRlcm4uDQoNCg0KIyMgNi4yLiBTcGF0aWFsIFBhdHRlcm4gb2YgTmlnaHR0aW1lIEluY2lkZW50cw0KDQpXZSByZWxhdGVkIHRoZXNlIGZpcmVhcm0gaW5jaWRlbnRzIChhbmQgb3RoZXIgdmlvbGVudCBjcmltZSBpbmNpZGVudHMpIHRvIHR3byB0eXBlcyBvZiBkYXRhLCB3YW50aW5nIHRvIGtub3cgaG93IGZyZXF1ZW50bHkgaW5jaWRlbnRzIHdlcmUgaGFwcGVuaW5nIG5lYXIgaG9zcGl0YWxpdHkgbG9jYXRpb25zIGF0IG5pZ2h0Lg0KDQoxLiBQaGlsYWRlbHBoaWEgTGljZW5zZXMgYW5kIEluc3BlY3Rpb25zIHJlY29yZHMgb2YgQW11c2VtZW50LCBTcGVjaWFsIEFzc2VtYmx5IE9jY3VwYW5jeSBMaWNlbnNlcywgU2lkZXdhbGsgQ2FmZSBsaWNlbnNlcywgYW5kIGFueSB0eXBlIG9mIEZvb2QgRXN0YWJsaXNobWVudCBMaWNlbnNlLiBhbmQgDQoNCjIuIENvbW1lcmNpYWwgY29ycmlkb3IgYm91bmRhcmllcyBrZXB0IGJ5IHRoZSBEZXBhcnRtZW50IG9mIENvbW1lcmNlLg0KDQpLZWVwIGluIG1pbmQgLSB3ZSBkbyBub3Qga25vdyBwYXJ0aWN1bGFybHkgd2hlbiB0aGVzZSBlc3RhYmxpc2htZW50cyBhcmUgb3BlbiBhbmQgY2xvc2VkLiBXZSBkb24ndCBrbm93IGlmIGFuIGluY2lkZW50IGF0IDExUE0gb3V0c2lkZSBhIHJlc3RhdXJhbnQgaGFwcGVucyB3aGlsZSB0aGF0IHJlc3RhdXJhbnQgaXMgaW4gYWN0aXZlIG9wZXJhdGlvbi4gV2UgZmlsdGVyZWQgb3V0IGluY2lkZW50cyB0aGF0IHRvb2sgcGxhY2UgbmVhciBsaWNlbnNlIGxvY2F0aW9ucyB3aGVuIHRob3NlIGxpY2Vuc2VzIHdlcmUgbm90IGFjdGl2ZSAoZS5nLiBiZWZvcmUgdGhleSB3ZXJlIGNyZWF0ZWQpLg0KDQotLS0tLQ0KDQpXZSBleGFtaW5lZCBhIHdpZGUgdmFyaWV0eSBvZiB2aW9sZW50IGNyaW1lcyBpbiBjb21tZXJjaWFsIGNvcnJpZG9ycyBhbmQgd2l0aGluIDIwMCBmZWV0IG9mIHJlc3RhdXJhbnRzLCBhc3NlbWJseSBhbmQgYW11c2VtZW50IGJ1c2luZXNzZXMuIFRoaXMgdGltZWxpbmUgc2hvd3MgdGhhdCBhdCBhbnkgdGltZSBvZiBkYXksIGFueSBkYXkgb2YgdGhlIHdlZWssIHRoZXJlIGFyZSBmYXIgbW9yZSBpbmNpZGVudHMgb2YgYWdncmF2YXRlZCBhc3NhdWx0LCByb2JiZXJ5LCB0aGVmdCwgcmFwZSwgc2V4dWFsIGNyaW1lcywgYW5kIGhvbWljaWRlIGF3YXkgZnJvbSBhcmVhcyBvZiBob3NwaXRhbGl0eSBhY3Rpdml0eS4NCg0KSXQgaXMgc3Vic3RhbnRpYWxseSBtb3JlIGxpa2VseSBvbmUgd2lsbCBiZSBleHBvc2VkIHRvIGEgdmlvbGVudCBjcmltZSBhdCBhbG1vc3QgYW55IGhvdXIgb2YgdGhlIGRheSBhd2F5IGZyb20gYSBsaWNlbnNlZCBlc3RhYmxpc2htZW50IGF0IGFueSB0aW1lIG9mIGRheSwgYXMgY29tcGFyZWQgdG8gYSB3ZWVrZW5kIG5pZ2h0IG5lYXIgYSBsaWNlbnNlZCBlc3RhYmxpc2htZW50Lg0KDQpgYGB7ciBhbGxfY3JpbWVzXzIwMF9mdCwgZWNobz1GQUxTRSwgd2FybmluZyA9IEZBTFNFLCBtZXNzYWdlID0gRkFMU0V9DQpzdF9qb2luKHZpb2xlbnRDcmltZV9zaHAgJT4lIA0KICAgICAgICAgIGZpbHRlcih5ZWFyID4gMjAyMCkgJT4lDQogICAgICAgICAgZmlsdGVyKHRleHRfZ2VuZXJhbF9jb2RlICVpbiUgYygiQWdncmF2YXRlZCBBc3NhdWx0IEZpcmVhcm0iLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBZ2dyYXZhdGVkIEFzc2F1bHQgTm8gRmlyZWFybSIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJvYmJlcnkgRmlyZWFybSIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJvYmJlcnkgTm8gRmlyZWFybSIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhvbWljaWRlIC0gQ3JpbWluYWwiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJIb21pY2lkZSAtIENyaW1pbmFsICIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJhcGUiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJPdGhlciBTZXggT2ZmZW5zZXMgKE5vdCBDb21tZXJjaWFsaXplZCkiKSksIGN1cnJlbnRfYnVmZmVyKSAlPiUNCiAgbXV0YXRlKFByb3hpbWF0ZV9Ub19MaWNlbnNlID0gaWZlbHNlKGlzLm5hKGluX2J1ZmZlcikgPT0gVFJVRSwgIk92ZXIgMjAwIGZ0IEF3YXkiLCAiV2l0aGluIDIwMCBmdCIpKSAlPiUNCiAgZ3JvdXBfYnkoUHJveGltYXRlX1RvX0xpY2Vuc2UsIGRvdHcsIGhvdXIpICU+JQ0KICB0YWxseSgpICU+JQ0KICAgIGdncGxvdCgpKw0KICAgIGdlb21fYmFyKGFlcyh4ID0gaG91ciwgeSA9IG4sIGZpbGwgPSBQcm94aW1hdGVfVG9fTGljZW5zZSksIA0KICAgICAgICAgICAgIHN0YXQgPSAiaWRlbnRpdHkiLCBwb3NpdGlvbiA9ICJkb2RnZSIpKw0KICBmYWNldF93cmFwKH5kb3R3KSsNCiAgbGFicyh0aXRsZT0iSG91cmx5IFJlcG9ydGVkIFZpb2xlbnQgQ3JpbWVzLCAyMDIxLTIwMjIgYnkgXG5Qcm94aW1pdHkgdG8gSG9wc2l0YWxpdHkgTGljZW5zZXMiLA0KICAgICAgIHN1YnRpdGxlPSAiSG9taWNpZGUsIEFnZ3JhdmF0ZWQgQXNzYXVsdCwgUmFwZSwgU2V4IE9mZmVuc2VzLCBSb2JiZXJ5IC0gd2l0aCBhbmQgd2l0aG91dCBGaXJlYXJtcy4gXG5Tb3VyY2U6IFBoaWxhZGVscGhpYSBEZXB0LiBPZiBDb21tZXJjZSwgRGVwdC4gTGljZW5zZXMgYW5kIEluc3BlY3Rpb25zLCBQaGlsYWRlbHBoaWEgUG9saWNlIERlcHQuIiwNCiAgICAgICB4PSJIb3VyIG9mIHRoZSBEYXkiLCANCiAgICAgICB5PSJOdW1iZXIgb2YgUmVwb3J0ZWQgSW5jaWRlbnRzIikrDQogIHBsb3RUaGVtZQ0KDQpgYGANCg0KT24gYXZlcmFnZSwgY29tbWVyY2lhbCBjb3JyaWRvcnMgaGF2ZSBhYm91dCBhcyBtYW55IGluY2lkZW50cyBjaXR5LXdpZGUgYXQgNFBNIGFzIHRoZXkgZG8gYXQgMTAgb3IgUE0uIEZvciB0aGUgbW9zdCBwYXJ0LCB2aW9sZW5jZSBvbiBjb3JyaWRvcnMgZG9lcyBub3Qgc3Bpa2Ugb24gd2Vla2VuZHMsIHN1cnByaXNpbmdseS4NCg0KSW5jaWRlbnRzIGluIGNvbW1lcmNpYWwgYXJlYXMsIG5lYXIgZXN0YWJsaXNobWVudHMgbWFrZSB1cCAxMC0xNSUgb2YgaW5jaWRlbnRzIGNpdHktd2lkZSBhdCBuaWdodCAtIGEgc3RlYWR5IHJhdGUgZm9yIG92ZXIgNSB5ZWFycy4gKEFzIG9mIDYvMTAsIDE5NTAgdG90YWwgaW5jaWRlbnRzIDZQTS02QU0sIDIyMiB3L2luIDIwMCBmdCBvZiBhIGJ1c2luZXNzIGluIGEgY29ycmlkb3IpLiBXZSBkb24ndCBoYXZlIGluZm8gYWJvdXQgc3BlY2lmaWMgb3Blbi9jbG9zZSBob3VycyB0byBrbm93IGV4YWN0bHkgd2hhdCBidXNpbmVzc2VzIG1pZ2h0IGhhdmUgYmVlbiBvcGVuIGR1cmluZyB3aGF0IGluY2lkZW50cy4NCg0KSW5jaWRlbnRzIGluIGNvcnJpZG9ycyB0cmFjayB0aGUgY2l0eSdzIG92ZXJhbGwgdHJlbmRzIHByZXR0eSBjbG9zZWx5Lg0KDQpgYGB7ciBjb3JyaWRvcl90aW1lc2VyaWVzLCBlY2hvPUZBTFNFLCB3YXJuaW5nID0gRkFMU0UsIG1lc3NhZ2UgPSBGQUxTRSAgfQ0Kc3Rfam9pbih2aW9sZW50Q3JpbWVfc2hwICU+JSANCiAgICAgICAgICBmaWx0ZXIodGV4dF9nZW5lcmFsX2NvZGUgJWluJSBjKCJBZ2dyYXZhdGVkIEFzc2F1bHQgRmlyZWFybSIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJvYmJlcnkgRmlyZWFybSIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhvbWljaWRlIC0gQ3JpbWluYWwiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJIb21pY2lkZSAtIENyaW1pbmFsICIgKSksIA0KICAgICAgICBjb3JyaWRvcnMpICU+JQ0KICBtdXRhdGUoaW5fQ29ycmlkb3IgPSBpZmVsc2UoaXMubmEoTkFNRSkgPT0gVFJVRSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiT3V0c2lkZSBDb3JyaWRvciIsICJJbnNpZGUgQ29ycmlkb3IiKSkgJT4lDQogIGdyb3VwX2J5KGluX0NvcnJpZG9yLCBhZnRlcl9zaXgsIHllYXIsIG1vbnRoKSAlPiUNCiAgdGFsbHkoKSAlPiUNCiAgbXV0YXRlKGRhdGUgPSBsdWJyaWRhdGU6Om15KHBhc3RlKG1vbnRoLCB5ZWFyKSkpICU+JQ0KICBmaWx0ZXIoYWZ0ZXJfc2l4ID09ICI2UE0gLSA2QU0iKSAlPiUNCiAgZ2dwbG90KCkrDQogIGdlb21fbGluZShhZXMoeCA9IGRhdGUsIHkgPSBuLCBjb2xvciA9IGluX0NvcnJpZG9yKSkrDQogICAgICB5bGltKDAsIDQwMCkrDQogIGxhYnModGl0bGU9Ik1vbnRobHkgTmlnaHR0aW1lIEZpcmVhcm0gSW5jaWRlbnRzIEluc2lkZSBhbmQgT3V0c2lkZSBDb21tZXJjaWFsIENvcnJpZG9ycywgMjAxNy0yMDIyIiwNCiAgICAgICBzdWJ0aXRsZT0gIkhvbWljaWRlIGFuZCBBZ2dyYXZhdGVkIEFzc2F1bHQsIFJvYmJlcnkgd2l0aCBGaXJlYXJtcy4gNlBNLTZBTS5cbiBTb3VyY2U6IFBoaWxhZGVscGhpYSBEZXB0LiBPZiBMaWNlbnNlcyAmIEluc3BlY3Rpb25zLCBQaGlsYWRlbHBoaWEgUG9saWNlIERlcHQuIiwNCiAgICAgICB4PSJZZWFyIiwgDQogICAgICAgeT0iTnVtYmVyIG9mIFJlcG9ydGVkIEluY2lkZW50cyIpKw0KICBwbG90VGhlbWUNCg0KYGBgDQoNCkluY2lkZW50cyB3aXRoaW4gMjAwIGZlZXQgb2YgYSBsaWNlbnNlZCBlc3RhYmxpc2htZW50IGFsc28gdHJhY2sgZ2VuZXJhbCB0cmVuZHMgLSBub3RpY2UgaG93IGZldyBpbmNpZGVudHMgdGFrZSBwbGFjZSBuZWFyIGVzdGFibGlzaG1lbnRzLg0KDQpgYGB7ciB3aXRoaW5fMjAwLCBlY2hvPUZBTFNFLCB3YXJuaW5nID0gRkFMU0UsIG1lc3NhZ2UgPSBGQUxTRSB9DQoNCnN0X2pvaW4odmlvbGVudENyaW1lX3NocCAlPiUgDQogICAgICAgICAgZmlsdGVyKHRleHRfZ2VuZXJhbF9jb2RlICVpbiUgYygiQWdncmF2YXRlZCBBc3NhdWx0IEZpcmVhcm0iLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJSb2JiZXJ5IEZpcmVhcm0iLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJIb21pY2lkZSAtIENyaW1pbmFsIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSG9taWNpZGUgLSBDcmltaW5hbCAiICkpLCANCiAgICAgICAgY3VycmVudF9idWZmZXIpICU+JQ0KICBhcy5kYXRhLmZyYW1lKCkgJT4lDQogIG11dGF0ZShQcm94aW1hdGVfVG9fTGljZW5zZSA9IGlmZWxzZShpcy5uYShpbl9idWZmZXIpID09IFRSVUUsICJPdmVyIDIwMCBmdCBBd2F5IiwgIldpdGhpbiAyMDAgZnQiKSkgJT4lDQogIGdyb3VwX2J5KFByb3hpbWF0ZV9Ub19MaWNlbnNlLCBhZnRlcl9zaXgsIHllYXIsIG1vbnRoKSAlPiUNCiAgdGFsbHkoKSAlPiUNCiAgbXV0YXRlKGRhdGUgPSBsdWJyaWRhdGU6Om15KHBhc3RlKG1vbnRoLCB5ZWFyKSkpICU+JQ0KICBmaWx0ZXIoYWZ0ZXJfc2l4ID09ICI2UE0gLSA2QU0iKSAlPiUNCiAgZ2dwbG90KCkrDQogIGdlb21fbGluZShhZXMoeCA9IGRhdGUsIHkgPSBuLCBjb2xvciA9IFByb3hpbWF0ZV9Ub19MaWNlbnNlKSkrDQogIGxhYnModGl0bGU9Ik1vbnRobHkgTmlnaHR0aW1lIEZpcmVhcm0gSW5jaWRlbnRzIEJ5IFByb3hpbWl0eSB0b1xuQXNzZW1ibHksIFJlc3RhdXJhbnQgb3IgQW11c2VtZW50IExpY2Vuc2UsIDIwMTgtMjAyMiIsDQogICAgICAgc3VidGl0bGU9ICJIb21pY2lkZSwgQWdncmF2YXRlZCBBc3NhdWx0LCBSb2JiZXJ5IHdpdGggIEZpcmVhcm1zLjZQTS02QU0uXG4gU291cmNlOiBQaGlsYWRlbHBoaWEgRGVwdC4gT2YgTGljZW5zZXMgJiBJbnNwZWN0aW9ucywgUGhpbGFkZWxwaGlhIFBvbGljZSBEZXB0LiIsDQogICAgICAgeD0iWWVhciIsIA0KICAgICAgIHk9Ik51bWJlciBvZiBSZXBvcnRlZCBJbmNpZGVudHMiKSsNCiAgcGxvdFRoZW1lDQoNCmBgYA0KDQojIyA2LjMuIEludGVyYWN0aXZlIE1hcCBvZiBDb21tZXJjaWFsIENvcnJpZG9ycw0KDQpUaGlzIGludGVyYWN0aXZlIG1hcCBzaG93cyB0aGUgdG90YWwgbnVtYmVyIG9mIGZpcmVhcm0gaW5jaWRlbnRzIDZQTS02QU0gc2luY2UgMjAxNyByZXBvcnRlZCBpbiB0aGUgQ2l0eSdzIGNvbW1lcmNpYWwgY29ycmlkb3JzLiBIb3ZlciBvdmVyIGVhY2ggc3BlY2lmaWMgYXJlYSB0byBzZWUgYSBicmVha2Rvd24gb2YgaW5jaWRlbnRzIGJ5IHllYXIuDQoNCmBgYHtyIGluY2lkZW50X21hcHZpZXcsIGVjaG89RkFMU0UsIHdhcm5pbmcgPSBGQUxTRSwgbWVzc2FnZSA9IEZBTFNFfQ0Kc3Rfam9pbih2aW9sZW50Q3JpbWVfc2hwICU+JSANCiAgICAgICAgICBmaWx0ZXIodGV4dF9nZW5lcmFsX2NvZGUgJWluJSBjKCJBZ2dyYXZhdGVkIEFzc2F1bHQgRmlyZWFybSIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJvYmJlcnkgRmlyZWFybSIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhvbWljaWRlIC0gQ3JpbWluYWwiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJIb21pY2lkZSAtIENyaW1pbmFsICIgKSksIA0KICAgICAgICBjb3JyaWRvcnMpICU+JQ0KICBmaWx0ZXIoaXMubmEoTkFNRSkgPT0gRkFMU0UpICU+JQ0KICAjIGZpbHRlcihzdHJfZGV0ZWN0KE5BTUUsICJTb3V0aCIpKSAlPiUNCiAgZmlsdGVyKGFmdGVyX3NpeCA9PSAiNlBNIC0gNkFNIikgJT4lDQogIGdyb3VwX2J5KE5BTUUsIHllYXIpICU+JQ0KICB0YWxseSgpICU+JQ0KICBhcy5kYXRhLmZyYW1lKCkgJT4lDQogIHNlbGVjdCgtZ2VvbWV0cnkpICU+JQ0KICBwaXZvdF93aWRlcihuYW1lc19mcm9tID0geWVhciwgdmFsdWVzX2Zyb20gPSBuKSAlPiUNCiAgbXV0YXRlKGAyMDE3YCA9IGlmZWxzZShpcy5uYShgMjAxN2ApID09IFRSVUUsIDAsIGAyMDE3YCksDQogICAgICAgICBgMjAxOGAgPSBpZmVsc2UoaXMubmEoYDIwMThgKSA9PSBUUlVFLCAwLCBgMjAxOGApLA0KICAgICAgICAgYDIwMTlgID0gaWZlbHNlKGlzLm5hKGAyMDE5YCkgPT0gVFJVRSwgMCwgYDIwMTlgKSwNCiAgICAgICAgIGAyMDIwYCA9IGlmZWxzZShpcy5uYShgMjAyMGApID09IFRSVUUsIDAsIGAyMDIwYCksDQogICAgICAgICBgMjAyMWAgPSBpZmVsc2UoaXMubmEoYDIwMjFgKSA9PSBUUlVFLCAwLCBgMjAyMWApLA0KICAgICAgICAgYDIwMjJgID0gaWZlbHNlKGlzLm5hKGAyMDIyYCkgPT0gVFJVRSwgMCwgYDIwMjJgKSklPiUNCiAgbGVmdF9qb2luKC4sIGNvcnJpZG9ycyAlPiUNCiAgICAgICAgICAgICAgc2VsZWN0KE5BTUUpLCBieSA9IGMoIk5BTUUiKSkgJT4lDQogbXV0YXRlKEluY2lkZW50c19TaW5jZV8yMDE3ID0gYDIwMTdgKyBgMjAxOGAgKyBgMjAxOWAgKyBgMjAyMGAgKyBgMjAyMWAgKyBgMjAyMmApICU+JQ0KICByZWxvY2F0ZShgMjAyMGAsIC5hZnRlciA9IGAyMDE5YCkgJT4lDQogIHN0X2FzX3NmKCkgJT4lDQogIHN0X3RyYW5zZm9ybSgyMjcyKSAlPiUNCiAgbWFwVmlldyh6Y29sID0gIkluY2lkZW50c19TaW5jZV8yMDE3IikNCg0KYGBgDQoNClNvbWUgY29tbWVudGFyeSByZWdhcmRpbmcgdGhpcyBtYXA6DQoNCkJ5IGZhciwgdGhlIGNvcnJpZG9ycyBpbiB0aGUgY2l0eSB3aXRoIHRoZSBtb3N0IGZpcmVhcm0gaW5jaWRlbnRzIChhZ2dyYXZhdGVkIGFzc2F1bHQsIHJvYmJlcnksIGhvbWljaWRlKSBhcmUgdGhlIG9uZXMgaW4gYXJlYXMgd2l0aCBlcGlkZW1pYyBndW4gdmlvbGVuY2UgKGUuZy4gS2Vuc2luZ3RvbiBhbmQgQWxsZWdoZW55LCBCcm9hZCBhbmQgSHVudGluZyBQYXJrLCA2MHRoIGFuZCBNYXJrZXQpLiBUaGlzIGludGVuc2l0eSBpcyBlc3BlY2lhbGx5IHByb25vdW5jZWQgd2hlbiB5b3UgY29uc2lkZXIgdGhlaXIgc2l6ZS4NCg0KU291dGggU3RyZWV0IGlzIG9uZSBvZiB0aGUgbW9zdCBwb3B1bGFyIG5pZ2h0dGltZSBkZXN0aW5hdGlvbnMgaW4gdGhlIENpdHkgLSBhdmVyYWdpbmcgYWJvdXQgMzMwJSBvZiB0aGUgbmlnaHR0aW1lIHZpc2l0b3JzIGNvbXBhcmVkIHRvIGFuIGF2ZXJhZ2UgUGhpbGx5IGNvcnJpZG9yLiBJdCBoYXMgb25lIG9mIHRoZSBoaWdoZXN0IGRpc3RhbmNlcyB0cmF2ZWxsZWQgYnkgdGhlIGF2ZXJhZ2UgdmlzaXRvci4gU3R1ZGVudHMgb2YgbWluZSBhbmFseXplZCBwaG9uZSBHUFMgZGF0YSBmcm9tIHRoaXJkIHBhcnRpZXMgdG8gdGhlc2UgY29ycmlkb3JzIGF0IG5pZ2h0IC0geW91IGNhbiBsb29rIGF0IGhvdyBtYW55IHBlb3BsZSBnbyB0byBlYWNoIGNvcnJpZG9yIGFuZCBmcm9tIHdoZXJlIHVzaW5nIHRoaXMgYXBwOiBodHRwczovL3NhYnJpbmFzbWxlZS5naXRodWIuaW8vZXhwbG9yYXRvcnlfcGFnZS9ob21lLmh0bWwNCg0KU291dGggU3RyZWV0IGhhcyBhIGZhaXJseSBsb3cgaW5jaWRlbmNlIG9mIHZpb2xlbnQgY3JpbWUgNlBNLTZBTSBnaXZlbiBpdHMgcG9wdWxhcml0eSBhcyBhIHJlZ2lvbmFsIGRlc3RpbmF0aW9uLiBQYXJ0cyBvZiBTb3V0aCBTdHJlZXQgd2VzdCBvZiA4dGggU3QgaGF2ZSBzZWVuIG11bHRpcGxlIHllYXJzIGluIHRoZSBsYXN0IDUgd2l0aG91dCBhIHNpbmdsZSBpbmNpZGVudC4gU291dGggJiA4dGggdG8gdGhlIFdhdGVyZnJvbnQgaXMgc2xpZ2h0bHkgaGlnaGVyIC0gd2l0aCA5IGZpcmVhcm0tcmVsYXRlZCBpbmNpZGVudHMgaW4gMjAyMSwgYnV0IGEgZ2VuZXJhbCBhdmVyYWdlIG9mIDItNiBwZXIgeWVhci4NCg0KQ2VudGVyIENpdHkgaGFzIGhhZCBzb21lIHVwdGljayBpbiBuaWdodHRpbWUgZ3VuIGNyaW1lIGluIDIwMjEgLSBidXQgYWJvdXQgMS8zcmQgb2YgdGhlc2UgaW5jaWRlbnRzIHdlcmUgbm90IG5lYXIgZXN0YWJsaXNobWVudHMuIEdpdmVuIGhvdyBtdWNoIHN0dWZmIHdhcyBjbG9zZWQsIEkgd291bGRuJ3QgYmUgc3VycHJpc2VkIGlmIGEgbG90IG9mIHRoaXMgd2FzIGhhcHBlbmluZyBpbiB0aGUgYWJzZW5jZSBvZiBuaWdodGxpZmUgcHJvZ3JhbW1pbmcuDQoNCg0KIyBOZXh0IHVwIGZvciBhbmFseXNpcw0KDQpvdmVybGF5cywgTW9iaWxpdHkgdHJlbmRzLCBQUFAgZGF0YSwgSWxsdW1pbmF0ZSB0aGUgQXJ0cyBncmFudHMNCg0KDQpCaWtlIFNoYXJlIGFuZCBNb2JpbGl0eQ0KDQpQaGlsYWRlbHBoaWEgQmlrZSBTaGFyZSBRMiwgMjAyMQ0KDQpgYGB7ciBsb2FkX21vYmlsaXR5LCBtZXNzYWdlPVRSVUUsIHdhcm5pbmc9RkFMU0UsIGluY2x1ZGU9RkFMU0UsIGV2YWwgPSBGQUxTRX0NCnVybCA8LSJodHRwczovL3U2MjZuMjZoNzRmMTZpZzFwM3B0MGYyZy13cGVuZ2luZS5uZXRkbmEtc3NsLmNvbS93cC1jb250ZW50L3VwbG9hZHMvMjAyMS8wNC9pbmRlZ28tdHJpcHMtMjAyMS1xMS56aXAiDQoNCnRlbXAgPC0gdGVtcGZpbGUoKQ0KdGVtcDIgPC0gdGVtcGZpbGUoKQ0KDQpkb3dubG9hZC5maWxlKHVybCwgdGVtcCkNCnVuemlwKHppcGZpbGUgPSB0ZW1wLCBleGRpciA9IHRlbXAyKQ0KcTFfMjAyMSA8LSByZWFkLmNzdihmaWxlLnBhdGgodGVtcDIsICJpbmRlZ28tdHJpcHMtMjAyMS1xMS5jc3YiKSkNCg0KdW5saW5rKGModGVtcCwgdGVtcDIpKQ0KDQp1cmwgPC0iaHR0cHM6Ly91NjI2bjI2aDc0ZjE2aWcxcDNwdDBmMmctd3BlbmdpbmUubmV0ZG5hLXNzbC5jb20vd3AtY29udGVudC91cGxvYWRzLzIwMjEvMDcvaW5kZWdvLXRyaXBzLTIwMjEtcTIuemlwIg0KDQp0ZW1wIDwtIHRlbXBmaWxlKCkNCnRlbXAyIDwtIHRlbXBmaWxlKCkNCg0KZG93bmxvYWQuZmlsZSh1cmwsIHRlbXApDQp1bnppcCh6aXBmaWxlID0gdGVtcCwgZXhkaXIgPSB0ZW1wMikNCnEyXzIwMjEgPC0gcmVhZC5jc3YoZmlsZS5wYXRoKHRlbXAyLCAiaW5kZWdvLXRyaXBzLTIwMjEtcTIuY3N2IikpDQoNCnVubGluayhjKHRlbXAsIHRlbXAyKSkNCg0KdXJsIDwtImh0dHBzOi8vdTYyNm4yNmg3NGYxNmlnMXAzcHQwZjJnLXdwZW5naW5lLm5ldGRuYS1zc2wuY29tL3dwLWNvbnRlbnQvdXBsb2Fkcy8yMDIxLzEwL2luZGVnby10cmlwcy0yMDIxLXEzLnppcCINCg0KdGVtcCA8LSB0ZW1wZmlsZSgpDQp0ZW1wMiA8LSB0ZW1wZmlsZSgpDQoNCmRvd25sb2FkLmZpbGUodXJsLCB0ZW1wKQ0KdW56aXAoemlwZmlsZSA9IHRlbXAsIGV4ZGlyID0gdGVtcDIpDQpxM18yMDIxIDwtIHJlYWQuY3N2KGZpbGUucGF0aCh0ZW1wMiwgImluZGVnby10cmlwcy0yMDIxLXEzLmNzdiIpKQ0KDQp1bmxpbmsoYyh0ZW1wLCB0ZW1wMikpDQoNCnVybCA8LSJodHRwczovL3U2MjZuMjZoNzRmMTZpZzFwM3B0MGYyZy13cGVuZ2luZS5uZXRkbmEtc3NsLmNvbS93cC1jb250ZW50L3VwbG9hZHMvMjAyMi8wMS9pbmRlZ28tdHJpcHMtMjAyMS1xNC56aXAiDQoNCnRlbXAgPC0gdGVtcGZpbGUoKQ0KdGVtcDIgPC0gdGVtcGZpbGUoKQ0KDQpkb3dubG9hZC5maWxlKHVybCwgdGVtcCkNCnVuemlwKHppcGZpbGUgPSB0ZW1wLCBleGRpciA9IHRlbXAyKQ0KcTRfMjAyMSA8LSByZWFkLmNzdihmaWxlLnBhdGgodGVtcDIsICJpbmRlZ28tdHJpcHMtMjAyMS1xNC5jc3YiKSkNCg0KdW5saW5rKGModGVtcCwgdGVtcDIpKQ0KDQpkYXQgPC0gcTFfMjAyMSAlPiUNCiAgcmJpbmQoLiwgcTJfMjAyMSkgJT4lDQogIHJiaW5kKC4sIHEzXzIwMjEpICU+JQ0KICByYmluZCguLCBxNF8yMDIxKQ0KDQpyZW1vdmUocTFfMjAyMSkNCnJlbW92ZShxMl8yMDIxKQ0KcmVtb3ZlKHEzXzIwMjEpDQpyZW1vdmUocTRfMjAyMSkNCg0KcGhpbGFfc2hwIDwtIGNvdW50aWVzKCJQQSIpICU+JQ0KICBmaWx0ZXIoTkFNRSA9PSAiUGhpbGFkZWxwaGlhIikgJT4lDQogIHN0X2FzX3NmKGNycyA9IDQzMjYpDQoNCmRhdDIgPC0gZGF0ICU+JQ0KICBtdXRhdGUoaW50ZXJ2YWw2MCA9IGZsb29yX2RhdGUobWR5X2htKHN0YXJ0X3RpbWUpLCB1bml0ID0gImhvdXIiKSwNCiAgICAgICAgIGludGVydmFsMTUgPSBmbG9vcl9kYXRlKG1keV9obShzdGFydF90aW1lKSwgdW5pdCA9ICIxNSBtaW5zIiksDQogICAgICAgICB3ZWVrID0gd2VlayhpbnRlcnZhbDYwKSwNCiAgICAgICAgIGRvdHcgPSB3ZGF5KGludGVydmFsNjAsIGxhYmVsPVRSVUUpKQ0KYGBgDQoNCg0KYGBge3IgbW9iaWxpdHlfdHJlbmRzLCB3YXJuaW5nID0gRkFMU0UsIGVjaG8gPSBUUlVFLCBtZXNzYWdlID0gRkFMU0UsIGV2YWwgPSBGQUxTRSwgaW5jbHVkZSA9IEZBTFNFfQ0KZ2dwbG90KGRhdDIgJT4lDQogICAgICAgICBncm91cF9ieSh3ZWVrKSAlPiUNCiAgICAgICAgIHRhbGx5KCkpKw0KICBnZW9tX2xpbmUoYWVzKHggPSB3ZWVrLCB5ID0gbikpKw0KICBsYWJzKHRpdGxlPSJCaWtlIHNoYXJlIHRyaXBzIHBlciB3ZWVrIFBoaWxhZGVscGhpYSwgMjAyMSIsDQogICAgICAgeD0iV2VlayAoMjAyMSkiLCANCiAgICAgICB5PSJUcmlwcyIpKw0KICBwbG90VGhlbWUNCg0KZ2dwbG90KGRhdDIgJT4lIG11dGF0ZShob3VyID0gaG91cihtZHlfaG0oc3RhcnRfdGltZSkpLA0KICAgICAgICAgICAgICAgICAgICAgICBtb250aCA9IG1vbnRoKG1keV9obShzdGFydF90aW1lKSksDQogICAgICAgICAgICAgICAgICAgICAgIGRheV90eXBlID0gaWZlbHNlKGRvdHcgJWluJSBjKCJTYXQiLCAiU3VuIiwgIkZyaSIpLCAiV2Vla2VuZCIsICJXZWVrZGF5IiksDQogICAgICAgICAgICAgICAgICAgICAgIG1vbnRoID0gY2FzZV93aGVuKG1vbnRoID09IDEgfiAiMDEtMjAyMSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vbnRoID09IDIgfiAiMDItMjAyMSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vbnRoID09IDMgfiAiMDMtMjAyMSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vbnRoID09IDQgfiAiMDQtMjAyMSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vbnRoID09IDUgfiAiMDUtMjAyMSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vbnRoID09IDYgfiAiMDYtMjAyMSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vbnRoID09IDcgfiAiMDctMjAyMSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vbnRoID09IDggfiAiMDgtMjAyMSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vbnRoID09IDkgfiAiMDktMjAyMSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vbnRoID09IDEwIH4gIjEwLTIwMjEiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb250aCA9PSAxMSB+ICIxMS0yMDIxIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9udGggPT0gMTIgfiAiMTItMjAyMSIpKSkrDQogIGdlb21fcmVjdChhZXMoeG1pbj0wLA0KICAgICAgICAgICAgICAgIHhtYXggPSA2LA0KICAgICAgICAgICAgICAgIHltaW4gPSAwLA0KICAgICAgICAgICAgICAgIHltYXggPSBJbmYpLCBmaWxsID0gJ2xpZ2h0IGdyZXknLCBhbHBoYSA9IDAuMDUpKw0KICBnZW9tX3JlY3QoYWVzKHhtaW49MTgsDQogICAgICAgICAgICAgICAgeG1heCA9IDI0LA0KICAgICAgICAgICAgICAgIHltaW4gPSAwLA0KICAgICAgICAgICAgICAgIHltYXggPSBJbmYpLCBmaWxsID0gJ2xpZ2h0IGdyZXknLCBhbHBoYSA9IDAuMDUpKw0KICBnZW9tX2ZyZXFwb2x5KGFlcyhob3VyLCBjb2xvciA9IGRheV90eXBlKSwgYmlud2lkdGggPSAxKSsNCiAgc2NhbGVfeF9jb250aW51b3VzKG5hbWU9IkhvdXIiLCBicmVha3M9c2VxKDAsMjQsNikpKw0KICBsYWJzKHRpdGxlPSJUb3RhbCBCaWtlIFNoYXJlIFRyaXBzIiwNCiAgICAgICBzdWJ0aXRsZSA9ICJQaGlsYWRlbHBoaWEsIDIwMjEiLA0KICAgICAgIHg9IkhvdXIiLCANCiAgICAgICB5PSJUcmlwcyIpKw0KICBmYWNldF93cmFwKH5tb250aCkrDQogIHRoZW1lKGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfYmxhbmsoKSkrDQogIHBsb3RUaGVtZQ0KYGBgDQoNCg0KDQpgYGB7ciBtb2JpbGl0eV9tYXAsIGV2YWw9RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGluY2x1ZGU9RkFMU0V9DQpnZ3Bsb3QoZGF0MiAlPiUNCiAgICAgICAgIG11dGF0ZSh0aW1lX29mX2RheSA9IGlmZWxzZShob3VyKGludGVydmFsNjApIDwgNCB8IA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaG91cihpbnRlcnZhbDYwKSA+IDIwLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTmlnaHQiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRGF5IiksDQogICAgICAgICAgICAgICAgbW9udGggPSBtb250aChtZHlfaG0oc3RhcnRfdGltZSkpLA0KICAgICAgICAgICAgICAgIG1vbnRoID0gY2FzZV93aGVuKG1vbnRoID09IDEgfiAiMDEtMjAyMSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9udGggPT0gMiB+ICIwMi0yMDIxIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb250aCA9PSAzIH4gIjAzLTIwMjEiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vbnRoID09IDQgfiAiMDQtMjAyMSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9udGggPT0gNSB+ICIwNS0yMDIxIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb250aCA9PSA2IH4gIjA2LTIwMjEiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vbnRoID09IDcgfiAiMDctMjAyMSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9udGggPT0gOCB+ICIwOC0yMDIxIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb250aCA9PSA5IH4gIjA5LTIwMjEiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vbnRoID09IDEwIH4gIjEwLTIwMjEiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vbnRoID09IDExIH4gIjExLTIwMjEiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vbnRoID09IDEyIH4gIjEyLTIwMjEiKSkgJT4lDQogICAgICAgICBncm91cF9ieShzdGFydF9zdGF0aW9uLCB0aW1lX29mX2RheSwgc3RhcnRfbG9uLCBzdGFydF9sYXQsIG1vbnRoKSAlPiUNCiAgICAgICAgIHRhbGx5KCkgJT4lDQogICAgICAgICBmaWx0ZXIodGltZV9vZl9kYXkgPT0gIk5pZ2h0IikpICsNCiAgZ2VvbV9zZihkYXRhID0gcGhpbGFfc2hwLCBmaWxsID0gImJsYWNrIikrDQogIGdlb21fcG9pbnQoYWVzKHggPSBzdGFydF9sb24sIHkgPSBzdGFydF9sYXQsIGNvbG9yID0gbiksIGFscGhhID0gMC44KSsNCiAgc2NhbGVfY29sb3JfdmlyaWRpc19jKCkrDQogIGd1aWRlcyhjb2xvcj1ndWlkZV9sZWdlbmQodGl0bGU9IlRyaXBzIikpKw0KICBsYWJzKHRpdGxlPSJHcm9zcyBCaWtlIFNoYXJlIFRyaXBzIEJ5IE9yaWdpbiAtIDIwOjAwLTQ6MDAsIFEyLCAyMDIxIikrDQogIGZhY2V0X3dyYXAofm1vbnRoKSsNCiAgbWFwVGhlbWUNCmBgYA==