Food Security Cluster Myanmar homepage


Summary of achievements

Beneficiaries of humanitarian action formed 98.78% of the 2,230,628 beneficiaries in the first quarter of 2022. The remainder were reached through development interventions.

To recall, the Food Security Cluster’s strategic objectives for 2022 are:

  • SO1: IDPs have equitable access to sufficient, safe and nutritious food (either in-kind or through food assistance)
  • SO2: Vulnerable persons (excl. IDPs) have equitable access to sufficient, safe and nutritious food (either in-kind or through food assistance)
  • SO3: Restore, protect and improve livelihoods and resilience
2022/Q1 beneficiaries by strategic objective
strat_obj Humanitarian Development Total
SO_1 324,919 0 324,919
SO_2 1,839,902 0 1,839,902
SO_3 38,589 27,218 65,807
Total 2,203,410 27,218 2,230,628


In terms of activities, the number of beneficiaries reached is heavily skewed towards food distributions. More than 95% of beneficiaries in 2022/Q1 have been reached by this activity.

Breakdown of beneficiaries by activity in 2022/Q1
activity SO_1 SO_2 SO_3 unique_beneficiaries
crop, vegetable and seed kits 0 0 52,878 52,878
FFS and farmer training 0 0 300 150
food distribution 618,487 2,174,762 0 2,129,684
food_cash for work_assets 0 0 10,740 9,365
IGA and small grants 0 0 2,117 2,111
livestock kits 0 0 50 50
multi-purpose cash transfer 40,336 368 0 35,137
vocational training 0 0 1,853 1,253
Total 658,823 2,175,130 67,938 2,230,628
The sum of beneficiary frequencies does not equal the numvber of unique beneficiaries reached


57% of beneficiaries were reached by activities where nutrition was mainstreamed. This is highly encouraging. As the year progresses, it will be important to collect more details about how exactly nutrition has been mainstreamed so that coordination with the Nutrition Cluster may be improved.

Breakdown of benefeciaries by status of nutrition mainstreaming
was_nutrition_mainstreamed_in_activity SO_1 SO_2 SO_3 total_beneficiaries %_beneficiaries
Yes 210,643 1,018,696 40,782 1,270,121 56.94
No 114,276 821,206 25,025 960,507 43.06



Implementation of Information Sharing Protocols

The newly approved ICCG Information Sharing Protocols have been implemented in this report to support the safe, ethical and effective management of data within Myanmar. This implementation is most evident in the use of partner pseudonymisation in this report. Partner names have been replaced by tokens in this report. These tokens are stored in a secure translation table on OCHA servers outside of Myanmar, where they may not be requisitioned by authorities. For more information, please read the full text of the protocols in either English or Myanmar.




1. Geographies

1.1 Statewise breakdowns

As in 2021, the number of beneficiaries reached has been heavily biased towards relatively few areas, which is not appropriate for a unionwide response. A total of 73 townships have been reached across 13 states/regions.



The table below outlines the number of beneficiaries reached by state/region in both 2021 and 2022/Q1. In 2021, the response was heavily skewed towards Yangon and Rakhine. The bias is even more pronounced in 2022/Q1.

87.15% of beneficiaries reached in the first quarter of 2022 originated from Yangon or Rakhine.


Skew in Q1 2022 geographic reach, comparison with 2021 data
State Beneficiaries_2021 %_ben_2021 Beneficiaries_2022 %_ben_2022 %_target_2022
Yangon 2,011,575 61.83 1,598,366 71.66 66.53
Rakhine 530,202 16.30 345,655 15.50 126.66
Kachin 89,818 2.76 111,630 5.00 79.60
Kayah 17,746 0.55 48,951 2.19 76.01
Kayin 68,108 2.09 48,698 2.18 50.56
Mon 48,181 1.48 31,191 1.40 89.12
Shan (North) 66,220 2.04 15,662 0.70 7.64
Chin 17,005 0.52 14,939 0.67 11.82
Bago (East) 12,974 0.40 5,926 0.27 6.74
Shan (South) 15,511 0.48 5,490 0.25 75.31
Sagaing 31,985 0.98 3,450 0.15 3.96
Tanintharyi 4,476 0.14 395 0.02 0.73
Shan (East) 0 0.00 275 0.01 0.39
Ayeyarwady 99,481 3.06
Magway 96,767 2.97
Mandalay 143,526 4.41



1.2 Township-level breakdowns

Just 8 townships (listed in the table below) contained 83.07% of all beneficiaries. In contrast, in 2021, the top 10 townships contained 76% of all beneficiaries. Hlaingthayra East and West by themselves contained 36% of all beneficiaries reached.

Top 7 townships by beneficiaries reached (desc) in 2022/Q1
State Township Humanitarian Development Beneficiaries %_Total
Yangon Hlaingtharya (West) 461,878 0 461,878 20.71
Yangon Shwepyithar 382,031 0 382,031 17.13
55 other townships 350,681 27,034 377,715 16.93
Yangon Hlaingtharya (East) 339,882 0 339,882 15.24
Yangon North Okkalapa 269,720 0 269,720 12.09
Yangon Dala 144,855 0 144,855 6.49
Rakhine Buthidaung 132,642 0 132,642 5.95
Rakhine Sittwe 121,721 184 121,905 5.47
The 55 other townships are each less than 1.5% of the total



1.3 Locations

A location refers to either an village, ward, IDP site or industrial zone.

This first plot below is a histogram of location, by number of beneficiaries. The vast majority of locations have only one activity occurring within them. This is something to be monitored over the course of the year, as it is assumed that a range of activities are required to comprehensively meet the food security and livelihoods needs of targeted communities. As it currently stands, the response is very broad, with little depth.



This second plot of locations is faceted by the number of partners – this helps us check for potential overlaps. There are quite a large number of locations with 2 partners in them. Locations with multiple partners were from Rakhine, Kachin and Shan (North).



The greatest number of beneficiaries came from urban/peri-urban wards and villages. This runs counter to vulnerability patterns identified by in both the IFPRI Household Welfare Survey and the FAO-WFP Food Security Survey. Both surveys found that rural households were less food secure and less resilient than urban ones.

Breakdown of locations and beneficiaries by context
rural_or_urban location_type locations beneficiaries %_of_ben ben_per_location
Rural Camp/IDP site 536 185,798 8.33 347
Rural Industrial zone 3 606 0.03 202
Rural Village 1,030 354,539 15.90 344
Urban/Peri-Urban Camp/IDP site 403 83,120 3.73 206
Urban/Peri-Urban Village 32 496,550 22.27 15,517
Urban/Peri-Urban Ward 111 1,109,393 49.75 9,995




2. Activities

2.1 Progress by activity

The first grey line below shows the the approval of the IERP in June 2021 and the second red line shows the start of 2022.



Community infrastructure and equipment, fishery kits and kitchen garden kits have not been implemented in 2022/Q1. Income-generating activities, which were largely stagnant since the approval of the IERP, started to increase again in 2022/Q1. This might be due to the seasonality of the interventions under this category.

Food distributions (in-kind and CBT/CVA) continued to be the largest activity from 2021 into 2022/Q1. Multi-purpose cash transfers was new activity that was not present in 2021.

It should, however, be noted that the beneficiaries of food distributions in Yangon were provided with 50kg/household, typically a one-shot intervention. The sustainability of such interventions should be questioned, as, unlike Sagaing, Magway and other conflict-affected states, there are no access restrictions in Yangon preventing the implementation of longer-term livelihoods-focused interventions that would address the core causes of food insecurity.



2.2 Agricultural and livelihoods activities

Less than 2% of all beneficiary frequencies pertained to agricultural activities. As mentioned earlier, the vast majority of beneficiaries in Q1 2022 were related to food distributions.


Beneficiary frequencies reached by agricultural and non-agricultural activities
agricultural_activity beneficiaries %_beneficiaries state townships partners
no 2,846,546 98.09 13 66 34
yes 55,345 1.91 8 21 8


Although crop, vegetable and seed kits formed the largest group of agricultural activities, only reached 9,869 households (for a full breakdown by agricultural activity, please refer to the plot below).

It will be important to review the results from the second quarter in order to see if this pattern changes and agricultural household receive sufficient assistance prior to the main rice planting season which begins in May 2022. Still, the results are not encouraging and agricultural activities have had a very limited reach.




2.3 Delivery modalities

The plots below, faceted by delivery modality, show the breakdown of activities by delivery modality. All activities besides food distribution corresponded to only one type of delivery modality.

Percentage of beneficiaries reached by activity and delivery modality
Activity In-kind Service delivery CBT/CVA Hybrid Beneficiaries
food distribution 86.4% 11.4% 2.1% 2,129,684
crop, vegetable and seed kits 100.0% 52,878
multi-purpose cash transfer 100.0% 35,137
food_cash for work_assets 100.0% 9,365
IGA and small grants 100.0% 1,849
vocational training 100.0% 1,253
FFS and farmer training 100.0% 150
livestock kits 100.0% 50


There are also clear differences between the different location types and the delivery modalities employed with them. Rural areas were predominated by in-kind distributions whilst camps and IDP sites were mostly targeted with cash-based interventions.



This would perhaps imply that partners believe that markets were more accessible from camps and IDP sites than rural areas; this is certainly a possibility for the longer-standing and more developed camps. Other alternative assumptions include donor preferences and logistical challenges in bringing in-kind goods to camps and IDP sites. This remains a question to be explored by the broader Food Security Cluster.

Below is a breakdown of percentage of beneficiaries reached by the different delivery modalities, by state.





3. Cash-based programming

3.1 Cash transfer values per household


46% of households received less than USD 40/month per transfer. However, the most common transfer values were between USD 40/month and USD 70/month, with 47% of households receiving transfers in this range. This aligns fairly well with 50% of the Minimum Expenditure Basket for food expenditures (USD 52.28/household/month). It should be noted, however that the value of the Minimum Expenditure Basket (calculated for 2021) needs to be revised as the Food Security Cluster anticipates 40% inflation in 2022.

The table below shows the average USD values per transfer per household by and total transfer values per activity in the first quarter of 2022.

Average value (USD) of household package values per activity
activity hhd_frequencies total_value_usd avg_transfer_value
livestock kits 50 5,631 112.62
IGA and small grants 363 30,152 83.06
multi-purpose cash transfer 7,712 583,031 75.60
food_cash for work_assets 3,500 207,092 59.17
food distribution 162,193 6,598,313 40.68
Only households which were reached by cash, hybrid or voucher modalities are included



3.2 Cash transfer values by implementing partner

The plots below show average cash transfer values by activity of the partners who reached the most beneficiaries.

The x-axis shows the average value per person or per household, depending on the activity and the colour indicates the number of beneficiaries reached.



3.3 Cash transfer values per person

The boxplots above shows the range of cash transfer values (all values are per person, to facilitate comparability) by activity. The average for reach activity is marked by the thick line in the middle of each box. The leftmost and rightmost side of each box indicate the 25th and 75th percentile of transfer values, respectively. The length of each box is a gauge for how much variation there is in the transfer values of each activity.



Additionally, each of the bubbles indicate an individual distribution, with their position along the x-axis showing the USD per person value of the distribution and the size of each bubble indicates the number of beneficiaries reached.

Despite being the activity which reached the most beneficiaries, food distributions have one of the tightest ranges of transfer values, though, as will be explored further in the plot below and in the next section, there are substantial outliers.

In the interactive scatterplot below, the x-axis indicates the number of beneficiaries reached and the y-axis indicates the per person value of each transfer. Each point is a distribution and the size of each point indicates the number of beneficiaries reached. More details about each distribution can be seen by hovering your cursor over each point.



Food for work/cash for assets and multi-purpose cash transfers had the largest dispersions in the values of their transfers. For food for work/cash for assets, there is one cluster largely below USD 5/person in Sagaing and another of between USD 30 and USD 60 per person in Kachin and Shan North.

As mentioned, food distributions had the tightest range of transfer values, with the vast majority of distributions falling just below USD 10/person. However, it has outlying values that reached very large groups of beneficiaries. This will be explored in the next section.



3.4 A closer look at food distributions

The interactive plot below breaks down the range of USD per person cash transfer values by state. Similar to the plot above, each point is a distribution and more details about each distribution can be seen by hovering your mouse over each point.

The red line indicates 50% of the monthly expenditure basket (MEB) for food (divided by 5 to get the figure per person). The vast majority of transfers fall below this value.



Kachin and Shan notably have several extreme outliers much higher than the average for that state. Kayin, however, has a very large number of beneficiaries who received less the USD 1/person. Distributions in Chin had very consistent values as they were all implemented by the same implementing partner.

The table below compares the different bins for cash transfer values of food distributions with the minimum expenditure basket for food established by the Cash Working Group. They have established a floor of MMK 190,555 (or USD 114.55).

Overall, 1.44% of food distribution beneficiaries have received at least 100% of the MEB and 10.05% have received at least 50% of the MEB.

USD values of food distributions by percentage of MEB received
usd_person_bin avg_pc_of_meb avg_usd_month beneficiaries pc_of_hhd
<$2 5.39 1.23 20,923 5.99
>=$2_<$4 15.45 3.54 57,619 16.49
>=$4_<$6 20.58 4.72 156 0.04
>=$6_<$8 32.00 7.33 35,494 10.16
>=$8_<$10 40.19 9.21 191,024 54.68
>=$10_<$12 47.59 10.90 13,775 3.94
>=$12_<$14 54.74 12.54 4,882 1.40
>=$14_<$16 65.04 14.90 353 0.10
>=$16_<$18 74.24 17.01 6,705 1.92
>=$18_<$20 82.73 18.95 8,692 2.49
>=$20 163.81 37.53 9,757 2.79
Only persons reached through CBT/CVA/hybrid modalities are included


However, a very large proportion of the beneficiaries reached were between USD 8 and 10 per person, fairly close to 50% of the MEB. The 50% threshold is of interest because humanitarian assistance does not aim to cover the full MEB and is intended to meet acute needs.



With reference to the plot above, the per person USD values in 2022 are more consistent than in 2021, with more than 50% of beneficiary frequencies receiving between USD 8 and 10 per transfer. The average transfer value for food distributions in 2021 was USD 7.36; in 2022/Q1, it was USD 8.59.




4. Beneficiaries

4.1 Beneficiary types

74.71% of beneficiaries were from the host or local community. 14.58% beneficiaries were IDPs.




4.2 Evidence of food insecurity status

Very few of the beneficiaries reached had evidence of their food insecurity status. This makes it difficult to determine whether or not food security interventions are truly reaching those most in need.

Food insecurity status and evidence provided in 2022/Q1
food_insecurity_status beneficiaries %_benficiaries
Food secure 13,759 0.62
Moderately food insecure 38,081 1.71
Severely food insecure 116,513 5.22
No status provided 2,062,275 92.45


Though evidence of food insecurity was not provided by for the vast majority of beneficiaries reached, much of the evidence that was provided were reasonable justifications for targeting beneficiaries. Some good reasons included armed conflict, community-based beneficiary selection and the use of the food consumption score.

Breakdown of evidence of food insecurity status in 2022/Q1
evidence beneficiaries %_beneficiaries
Armed conflict 97,999 4.39
community-based beneficiary selection 21,315 0.96
Food consumption score 8,034 0.36
Food distribution certificate 1,040 0.05
Monthly distribution report 16,484 0.74
Village Profile 754 0.03
No evidence 2,085,002 93.47


The general lack of evidence of evidence of beneficiaries’ food insecurity status makes it difficult to justify to affected communities and donors that the Food Security Cluster is reaching the most in need. This highlights the need to promote a shared understanding of the response through the development of a common prioritisation tool for food security partners.




4.3 Beneficiary disaggregation

Due to the problems in reporting disaggregated beneficiary data, two tests have been applied to the submitted 5W data. The first involves a comparison to the proportions of disaggregation groups in the census to determine if values have been backfilled from the census.

The plots below show the breakdowns between the “real” values and those that have been backfilled from the census. Approximately 59% of beneficiaries reported were not backfilled from the census; this is an improvement from 2021, where only 44% of beneficiaries had “real” disaggregations.

In the “real” values, it can be seen that the proportion of adult females reached is much higher than adult males – this is in line with the Cluster’s understanding of several activities that specifically target women. The percentages of elderly persons actually reached is also much lower than what has been reported.



The second test applied is if the disaggregated numbers of beneficiaries reached have been copied and pasted. To do this, the proportions of each disaggregation group by partner have been compared to how close they were to the mean for the entire group. To explain: if partner A reported that 40% of beneficiaries in an activity were adult females, this percentage was then compared to the average percentage of adult females for all other activities reported by that partner. This measure whether or not the same proportions were copied and pasted throughout the 5W form.

It is extremely unlikely that these percentages would be similar across activities as implementing partners worked in an average of 32.39 locations.

In the plot below, the closer a value is to 0% on the x-axis, the more likely it is that it was copied and pasted. It is estimated that 89% of beneficiary disaggregation values were copied and pasted.





5. Partners

5.1 Reach by implementing partner

There are 36 partners that were involved in direct implementation that have reported achievements in first quarter of 2022. These implementing partners corresponded to a total of 15 reporting organisations. The largest reporting organisation, org_2690, had 21 implementing partners. All other reporting organisations had 1 or 2 implementing partners.

The interactive plot below shows the number of beneficiaries and townships reached by implementing partner.



In 2021, it was noted that whilst there was much variation in the numbers of beneficiaries reached by each implementing partner, their geographic footprints were quite limited. This pattern has continued into 2022/Q1. Only 6 partners (17% of the total) have a presence in more than 5 townships. The distribution of partners remains an impediment to the implementation of a countrywide response. And the following steps mentioned in the 2021 report are still very necessary:

  • Incentivise partners to expand their footprints

  • Identify new partners to reach vulnerable persons in areas recently affected by conflict

  • Encourage donors to support expansion of Food Security activities in areas recently affected by conflict (with sufficient support costs)



5.2 Monthly progress by partner


Overall, 13 implementing partners increased the number of beneficiaries reached over their 2021 totals by more than 50%; 29 partners who reported in 2021 also reported in 2022/Q1. 7 new implementing partners reported in 2022. And 28 partners who reported in 2021 but have not yet reached any beneficiaries in 2022.

Top implementing partners by beneficiaries reached in 2022/Q1
org_code ben_2021 rank_2021 ben_2022 rank_2022 total_ben
org_8540 565,398 1 380,478 1 945,876
org_5722 270,216 2 283,348 2 553,564
org_6827 165,538 5 206,710 3 372,248
org_4933 151,389 6 160,480 4 311,869
org_9693 12,094 24 160,449 5 172,543
org_1206 33,442 20 156,433 6 189,875
org_5440 11,567 25 143,505 7 155,072
org_6792 132,464 7 105,410 8 237,874
org_9566 95,999 9 95,999
org_8004 73,116 10 86,740 10 159,856
org_3486 77,301 9 61,257 11 138,558
org_3280 60,057 12 60,599 12 120,656
org_6130 71,467 11 59,547 13 131,014
org_5677 165,794 4 40,377 14 206,171
org_2825 49,692 15 39,572 15 89,264
org_2690 103,611 8 38,411 16 142,022
org_5604 40,279 17 24,298 17 64,577
org_7002 25,954 21 18,021 18 43,975
org_2807 1,001 48 14,463 19 15,464
org_6793 10,494 20 10,494



5.3 Donors

As shown by the table below, the majority of beneficiaries reported in the first quarter of 2022/Q1 were reported without any corresponding donor, as in 2021. The data in this column continues of limited utility in analysis.

Top donors by beneficiaries reached
donor beneficiaries %_beneficiaries
No donor specified 2,022,049 90.65
FCDO 76,391 3.42
CERF 33,157 1.49
WVI 20,843 0.93
Organizational own funds 19,721 0.88
BPRM 16,362 0.73
USAID 14,386 0.64
FCDO+BPRM 7,059 0.32
NZMFAT 4,854 0.22
LIFT 2,986 0.13
Other donors 2,945 0.13
MoFA Luxemburg 2,730 0.12
UN Women 2,238 0.10
Norad 2,070 0.09
ECHO 1,797 0.08
SIDA 1,040 0.05




6. Comparison with targets

6.2 Reached vs target by township

The specifics of each township can be reviewed with the interactive plot below. Each point is a township, with the size indicating the number of beneficiaries. The x-axis indicates the target population by township and the y-axis shows the number of beneficiaries reached in 2022/Q1.

The red line down the middle represents reaching 100% of the target. Townships above this line have reached more beneficiaries than their target and townships below the line have not met their target yet. The further away a township is from the red line, the further above or below its target it is. Mouse over each of the townships to see more details.

The 12 townships along the extreme left side of the plot have beneficiaries but do not have targets (their targets have just been coded as \(1\) so that they show up on the plot). 230 townships with targets have not been reached.




6.2 Map of beneficiaries reached in 2022/Q1 vs target


With the important exceptions of Yangon and the Southeast, beneficiaries are concentrated in the peripheral and border regions of the union, where humanitarian actors have traditionally been present. As mentioned in previous reports, this is not consistent with the current patterns of needs and vulnerability.




6.3 Interactive reference table

There was an overallocation of resources in these relatively few areas in 2021 and this has continued in the first quarter of 2022. In the interactive table below, is a list of townships sorted by the gap between the targeted population and beneficiaries reached in 2022. Any of the columns can be sort; the search bars above each column can also assist in filtering.


LS0tDQp0aXRsZTogIlJlcG9ydCBvbiA1V3MiDQpzdWJ0aXRsZTogIkZpcnN0IHF1YXJ0ZXIgMjAyMiINCmF1dGhvcjogIk15YW5tYXIgRm9vZCBTZWN1cml0eSBDbHVzdGVyIg0KZGF0ZTogIjIwMjItMDUtMDYiDQpvdXRwdXQ6DQogIGh0bWxfZG9jdW1lbnQ6DQogICAgY29kZV9kb3dubG9hZDogeWVzDQogICAgdGhlbWU6IHJlYWRhYmxlDQogICAgdG9jOiB5ZXMNCiAgICB0b2NfZGVwdGg6IDQNCiAgICB0b2NfZmxvYXQ6IHllcw0KICAgIG51bWJlcl9zZWN0aW9uczogbm8NCiAgICBjb2xsYXBzZWQ6IG5vDQphbHdheXNfYWxsb3dfaHRtbDogeWVzDQotLS0NCg0KPCEtLSBHbG9iYWwgc2l0ZSB0YWcgKGd0YWcuanMpIC0gR29vZ2xlIEFuYWx5dGljcyAtLT4NCjxzY3JpcHQgYXN5bmMgc3JjPSJodHRwczovL3d3dy5nb29nbGV0YWdtYW5hZ2VyLmNvbS9ndGFnL2pzP2lkPUctSk1ZM1ZEMVFCRCI+PC9zY3JpcHQ+DQo8c2NyaXB0Pg0KICB3aW5kb3cuZGF0YUxheWVyID0gd2luZG93LmRhdGFMYXllciB8fCBbXTsNCiAgZnVuY3Rpb24gZ3RhZygpe2RhdGFMYXllci5wdXNoKGFyZ3VtZW50cyk7fQ0KICBndGFnKCdqcycsIG5ldyBEYXRlKCkpOw0KDQogIGd0YWcoJ2NvbmZpZycsICdHLUpNWTNWRDFRQkQnKTsNCjwvc2NyaXB0Pg0KDQpgYGB7Y3NzLCBlY2hvPUZBTFNFfQ0KDQojVE9DOjpiZWZvcmUgew0KICBjb250ZW50OiAiIjsNCiAgZGlzcGxheTogYmxvY2s7DQogIGhlaWdodDogNzBweDsNCiAgbWFyZ2luOiAyZW0gMjBweCA0MHB4IDIwcHg7DQogIGJhY2tncm91bmQtaW1hZ2U6IHVybCgiTXlhbm1hcl9jbHVzdGVyX2JsdWUucG5nIik7DQogIGJhY2tncm91bmQtc2l6ZTogY29udGFpbjsNCiAgYmFja2dyb3VuZC1wb3NpdGlvbjogY2VudGVyIGNlbnRlcjsNCiAgYmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdDsNCn0NCmBgYA0KDQpgYGB7PWh0bWx9DQo8c3R5bGU+DQogICAgYm9keSAubWFpbi1jb250YWluZXIgew0KICAgICAgICBtYXgtd2lkdGg6IDEyODBweDsNCiAgICB9DQo8L3N0eWxlPg0KYGBgDQoNCg0KYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9DQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IEZBTFNFLCBmaWcud2lkdGg9OSwgbWVzc2FnZSA9IEZBTFNFLCB3YXJuaW5nPUZBTFNFKQ0KbGlicmFyeSh0aWR5dmVyc2UpDQpsaWJyYXJ5KHJlYWR4bCkNCmxpYnJhcnkobHVicmlkYXRlKQ0KbGlicmFyeShzdHJpbmdpKQ0KbGlicmFyeShwYW5kZXIpDQpsaWJyYXJ5KGphbml0b3IpDQpsaWJyYXJ5KGZ1enp5am9pbikNCmxpYnJhcnkoc2NhbGVzKQ0KbGlicmFyeShtYWdyaXR0cikNCmxpYnJhcnkoc2YpDQpsaWJyYXJ5KGthYmxlRXh0cmEpDQpsaWJyYXJ5KHZpcmlkaXMpDQpsaWJyYXJ5KHNraW1yKQ0KbGlicmFyeShwbG90bHkpDQpsaWJyYXJ5KHBhdGNod29yaykNCmxpYnJhcnkoYnJvb20pDQpsaWJyYXJ5KERUKQ0KDQp0aGVtZV9zZXQodGhlbWVfbGlnaHQoKSkNCg0KIyBkaXNhYmxpbmcgc2NpZW50aWZpYyBub3RhdGlvbg0Kb3B0aW9ucyhzY2lwZW4gPSAxMDApDQoNCiMgcGFuZGVyIHRhYmxlcyBhbGwgaW4gb25lIHJvdw0KcGFuZGVyT3B0aW9ucygndGFibGUuc3BsaXQudGFibGUnLCBJbmYpDQoNCiMgcGFuZGVyIHRob3VzYW5kcyBzZXBhcmF0b3INCnBhbmRlck9wdGlvbnMoImJpZy5tYXJrIiwgIiwiKQ0KDQojIHJlcGxhY2UgDQpvcHRzIDwtIG9wdGlvbnMoa25pdHIua2FibGUuTkEgPSAiIikNCg0KYCVvdXQlYCA8LSBOZWdhdGUoYCVpbiVgKQ0KDQojIGZ1bmN0aW9uIGZvciB0cmFuc3Bvc2luZyBkZg0KdHJhbnNwb3NlX2RmIDwtIGZ1bmN0aW9uKGRmKSB7DQogIHRfZGYgPC0gZGF0YS50YWJsZTo6dHJhbnNwb3NlKGRmKQ0KICBjb2xuYW1lcyh0X2RmKSA8LSByb3duYW1lcyhkZikNCiAgcm93bmFtZXModF9kZikgPC0gY29sbmFtZXMoZGYpDQogIHRfZGYgPC0gdF9kZiAlPiUNCiAgICB0aWJibGU6OnJvd25hbWVzX3RvX2NvbHVtbiguZGF0YSA9IC4pICU+JQ0KICAgIHRpYmJsZTo6YXNfdGliYmxlKC4pDQogIHJldHVybih0X2RmKQ0KfQ0KDQojIGZ1bmN0aW9uIGJlbmVmaWNpYXJ5IHN1bW1hcmllcw0Kc3VtX2JlbiA8LSBmdW5jdGlvbihkZiwgY29sdW1uX3Zhcil7DQogIA0KICBjb2x1bW5fdmFyIDwtIGVucXVvKGNvbHVtbl92YXIpDQogIA0KICBkZiAlPiUNCiAgICBncm91cF9ieSghIWNvbHVtbl92YXIpICU+JSAjIG11c3QgYWRkIGJhbmctYmFuZw0KICAgIHN1bW1hcmlzZShiZW5lZmljaWFyaWVzID0gc3VtKG5ld19iZW5lZmljaWFyaWVzLCBuYS5ybSA9IFRSVUUpKSAlPiUgDQogICAgYXJyYW5nZShkZXNjKGJlbmVmaWNpYXJpZXMpKQ0KICAgIA0KfQ0KDQojIGZ1bmN0aW9uIGJlbmVmaWNpYXJ5IHN1bW1hcmllcywgMiBncm91cGVkIHZhcmlhYmxlcw0Kc3VtX2JlbjIgPC0gZnVuY3Rpb24oZGYsIGNvbHVtbl92YXIxLCBjb2x1bW5fdmFyMil7DQogIA0KICBjb2x1bW5fdmFyMSA8LSBlbnF1byhjb2x1bW5fdmFyMSkNCiAgY29sdW1uX3ZhcjIgPC0gZW5xdW8oY29sdW1uX3ZhcjIpDQogIA0KICBkZiAlPiUNCiAgICBncm91cF9ieSghIWNvbHVtbl92YXIxLCAhIWNvbHVtbl92YXIyKSAlPiUgIyBtdXN0IGFkZCBiYW5nLWJhbmcNCiAgICBzdW1tYXJpc2UoYmVuZWZpY2lhcmllcyA9IHN1bShuZXdfYmVuZWZpY2lhcmllcywgbmEucm0gPSBUUlVFKSwgLmdyb3VwcyA9ICJkcm9wIikNCiAgICANCn0NCg0KIyBzY2FsaW5nIGZ1bmN0aW9ucyANCnJhbmdlMDEgPC0gZnVuY3Rpb24oeCl7KHgtbWluKHgpKS8obWF4KHgpLW1pbih4KSl9DQpyYW5nZV93bmEgPC0gZnVuY3Rpb24oeCl7KHgtbWluKHgsIG5hLnJtID0gVFJVRSkpLyhtYXgoeCwgbmEucm0gPSBUUlVFKS1taW4oeCwgbmEucm0gPSBUUlVFKSl9DQoNCiNtb2RlIGZ1bmN0aW9uIA0KbW9kZSA8LSBmdW5jdGlvbih4KSB7DQogIHV4IDwtIHVuaXF1ZSh4KQ0KICB1eFt3aGljaC5tYXgodGFidWxhdGUobWF0Y2goeCwgdXgpKSldDQp9DQoNCnBjb2RlNCA8LSByZWFkX2V4Y2VsKCIyMDIyX0ZTQ01ZQV81V190ZW1wbGF0ZS54bHN4IiwgDQogICAgICAgICAgIHNoZWV0ID0gIkdFT0FETUlOUyIpICU+JSANCiAgY2xlYW5fbmFtZXMoKSAlPiUgDQogIHNlbGVjdChhZG1pbjFwY29kZV85OmFkbWluMV8zKSAlPiUgDQogIHJlbmFtZShhZG1pbjFfcGNvZGUgPSBhZG1pbjFwY29kZV85LA0KICAgICAgICAgc3RhdGUgPSBzdGF0ZV8xMCwgDQogICAgICAgICB0b3duc2hpcCA9IHRvd25zaGlwXzExLA0KICAgICAgICAgYWRtaW4zX3Bjb2RlID0gYWRtaW4zcGNvZGVfMTIsIA0KICAgICAgICAgdnRfdG93biA9IHZ0X2FuZF90b3duXzEzLCANCiAgICAgICAgIGFkbWluNF9wY29kZSA9IHZ0X2FuZF90b3duX3Bjb2RlXzE0KSAlPiUgDQogIGZpbHRlcighaXMubmEoYWRtaW40X3Bjb2RlKSkNCiANCnZpbGxhZ2VzIDwtIHJlYWRfZXhjZWwoIjIwMjJfRlNDTVlBXzVXX3RlbXBsYXRlLnhsc3giLCANCiAgICAgICAgICAgc2hlZXQgPSAiR0VPQURNSU5TIikgJT4lIA0KICBjbGVhbl9uYW1lcygpICU+JQ0KICBzZWxlY3QoYWRtaW4xcGNvZGVfMTc6bG9jYXRpb25fdHlwZSkgJT4lIA0KICByZW5hbWUoYWRtaW4xX3Bjb2RlID0gYWRtaW4xcGNvZGVfMTcsDQogICAgICAgICBzdGF0ZSA9IHN0YXRlXzE4LCANCiAgICAgICAgIHRvd25zaGlwID0gdG93bnNoaXBfMTksDQogICAgICAgICBhZG1pbjNfcGNvZGUgPSBhZG1pbjNwY29kZV8yMCwgDQogICAgICAgICB2dF90b3duID0gdnRfYW5kX3Rvd25fMjEsIA0KICAgICAgICAgYWRtaW40X3Bjb2RlID0gdnRfYW5kX3Rvd25fcGNvZGVfMjIpICU+JSANCiAgZmlsdGVyKCFpcy5uYShsb2NhdGlvbikpDQoNCmNhbXBzIDwtIHJlYWRfZXhjZWwoIjIwMjJfRlNDTVlBXzVXX3RlbXBsYXRlLnhsc3giLCANCiAgICAgICAgICAgc2hlZXQgPSAiR0VPQURNSU5TIikgJT4lIA0KICBjbGVhbl9uYW1lcygpICU+JQ0KICBzZWxlY3QodG93bnNoaXAgPSB0b3duc2hpcF8yOSwgY2FtcF9uYW1lLCBwY29kZV9jYW1wID0gcF9jb2RlX2NhbXApICU+JSANCiAgZmlsdGVyKCFpcy5uYShjYW1wX25hbWUpKQ0KDQppbmR1c3RyaWFsX3pvbmVzIDwtIHJlYWRfZXhjZWwoIjIwMjJfRlNDTVlBXzVXX3RlbXBsYXRlLnhsc3giLCANCiAgICAgICAgICAgc2hlZXQgPSAiR0VPQURNSU5TIikgJT4lIA0KICBjbGVhbl9uYW1lcygpICU+JSANCiAgc2VsZWN0KHN0YXRlID0gc3RhdGVfMzYsIGFkbWluMV9wY29kZSA9IGFkbWluMXBjb2RlXzM3LCBpbmR1c3RyaWFsX3pvbmUgPSBpbmR1c3RyaWFsX3pvbmVzKSAlPiUgIA0KICBmaWx0ZXIoIWlzLm5hKGluZHVzdHJpYWxfem9uZSkpDQoNCmZzYyA8LSByZWFkX2NzdigiZnNjX2NvZGVzLmNzdiIpICU+JSANCiAgcmVuYW1lX2FsbCh+c3RyX3JlcGxhY2VfYWxsKC4sICJebnVtYmVyX29mXyIsICIiKSkgJT4lDQogIHJlbmFtZV9hbGwofnN0cl9yZXBsYWNlX2FsbCguLCAiXm51bWJlcl8iLCAiIikpICU+JQ0KICByZW5hbWUoc3BlY2lmeV9sb2NhdGlvbiA9IHNwZWNpZnlfbG9jYXRpb25faWZfdGhlX3RoZV9sb2NhdGlvbl9pc19ub3RfaW5fdGhlX2xpc3QpICU+JSANCiAgbXV0YXRlKGlkcF9jYW1wX3NpdGVfbmFtZT0gYXMuY2hhcmFjdGVyKGlkcF9jYW1wX3NpdGVfbmFtZSkpICU+JSANCiAgbXV0YXRlKGxvY2F0aW9uID0gY2FzZV93aGVuKCFpcy5uYShpZHBfY2FtcF9zaXRlX25hbWUpIH4gaWRwX2NhbXBfc2l0ZV9uYW1lLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIWlzLm5hKHZpbGxhZ2Vfd2FyZCkgfiB2aWxsYWdlX3dhcmQsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhaXMubmEoc3BlY2lmeV9sb2NhdGlvbikgfiBzcGVjaWZ5X2xvY2F0aW9uLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIWlzLm5hKHZpbGxhZ2VfdHJhY3RfdG93bikgfiB2aWxsYWdlX3RyYWN0X3Rvd24pKSAlPiUNCiAgbXV0YXRlKGRhdGUgPSBteShtb250aF9vZl9pbXBsZW1lbnRhdGlvbikpICU+JSANCiAgcmVuYW1lKGFjdGl2aXR5ID0gZnNjX21haW5fYWN0aXZpdHkpICU+JSANCiAgbXV0YXRlKHRvd25zaGlwID0gcmVjb2RlKHRvd25zaGlwLCAiUHV0YW8iID0gIlB1dGEtTyIpLCANCiAgICAgICAgIGFkbWluM19wY29kZSA9IGlmZWxzZSh0b3duc2hpcCA9PSAiUHV0YS1PIiwgIk1NUjAwMTAxNCIsIGFkbWluM19wY29kZSkpICU+JSANCiAgbGVmdF9qb2luKHBjb2RlNCAlPiUgc2VsZWN0KHRvd25zaGlwLCB2dF90b3duLCBhZG1pbjNfcGNvZGUsIGFkbWluNF9wY29kZSwgYWRtaW4xX3Bjb2RlKSwgYnkgPSANCiAgICAgICAgICAgICAgYygidmlsbGFnZV90cmFjdF90b3duIiA9ICJ2dF90b3duIiwgInRvd25zaGlwIiA9ICJ0b3duc2hpcCIsIA0KICAgICAgICAgICAgICAgICJhZG1pbjNfcGNvZGUiID0gImFkbWluM19wY29kZSIsICJhZG1pbjFfcGNvZGUiID0gImFkbWluMV9wY29kZSIpKSAlPiUgDQogIG11dGF0ZSh0b3RhbF92YWx1ZV91c2QgPSBjYXNlX3doZW4oY3VycmVuY3kgPT0gIk1NSyIgfiB0b3RhbF92YWx1ZSAvIDE3NzYsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbmN5ID09ICJVU0QiIH4gdG90YWxfdmFsdWUpKSAlPiUgDQogIHJlbmFtZShzdGF0ZSA9IHN0YXRlX3JlZ2lvbikgJT4lIA0KICBtdXRhdGUoYWRtaW4zX3Bjb2RlX29sZCA9IGNhc2Vfd2hlbihhZG1pbjNfcGNvZGUgJWluJSBjKCJNTVIwMTMwNDYiLCAiTU1SMDEzMDQ3IikgfiAiTU1SMDEzMDA4IiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRtaW4zX3Bjb2RlID09ICJNTVIwMTUyMDIiIH4gIk1NUjAxNTAyMiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRtaW4zX3Bjb2RlID09ICJNTVIwMTUzMTUiIH4gIk1NUjAxNTAxMCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkbWluM19wY29kZSA9PSAiTU1SMDE1MzEyIiB+ICJNTVIwMTUwMDYiLAkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZG1pbjNfcGNvZGUgPT0gIk1NUjAxNTMwOCIgfiAiTU1SMDE1MDA3IiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZG1pbjNfcGNvZGUgPT0gIk1NUjAxNjMyMSIgfiAiTU1SMDE2MDAzIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJVRSB+IGFkbWluM19wY29kZSkpICU+JSANCiAgIyByZW1vdmluZyBhIGR1cGxpY2F0ZSBlbnRyeSBmcm9tIHRoZSBsZWZ0IGpvaW4gDQogIG11dGF0ZShkcm9wID0gY2FzZV93aGVuKGFkbWluNF9wY29kZSA9PSAiTU1SMDA3MDA4MDU4IiB+IDEsIFRSVUUgfiAwKSkgJT4lDQogIGZpbHRlcihkcm9wICE9IDEpICU+JSBzZWxlY3QoLWRyb3ApICU+JQ0KICByZW5hbWUocmVzcG9uc2VfcGxhbiA9IHJlc3BvbnNlX3BsYW5faWZfcHJvamVjdF91bmRlcl9mdHMsIA0KICAgICAgICAgYmVuZWZpY2lhcmllcyA9IHJlYWNoZWRfYmVuZWZpY2lhcmllcywgDQogICAgICAgICBob3VzZWhvbGRzID0gcmVhY2hlZF9ob3VzZWhvbGRzKSAlPiUgDQogIHJlcGxhY2VfbmEobGlzdChuZXdfYmVuZWZpY2lhcmllcyA9IDApKSAlPiUgDQogIG11dGF0ZShhY3Rpdml0eV9yZWQgPSBjYXNlX3doZW4oYWN0aXZpdHkgJWluJSBjKCJmb29kIGRpc3RyaWJ1dGlvbnMgKGluIGtpbmQvdm91Y2hlci9jYXNoKSwgbW9kZXJhdGUiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImZvb2QgZGlzdHJpYnV0aW9ucyAoaW4ga2luZC92b3VjaGVyL2Nhc2gpLCBzZXZlcmUiKSB+IA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImZvb2QgZGlzdHJpYnV0aW9uIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3Rpdml0eSAlaW4lIGMoIm11bHRpLXB1cnBvc2UgY2FzaCB0cmFuc2ZlciAoTVBDKSwgbW9kZXJhdGUiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibXVsdGktcHVycG9zZSBjYXNoIHRyYW5zZmVyIChNUEMpLCBzZXZlcmUiKSB+IA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm11bHRpLXB1cnBvc2UgY2FzaCB0cmFuc2ZlciIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aXZpdHkgPT0gImxpdmVsaWhvb2RzIHZvY2F0aW9uYWwgdHJhaW5pbmciIH4gInZvY2F0aW9uYWwgdHJhaW5pbmciLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGl2aXR5ID09ICJmb29kL2Nhc2ggZm9yIHdvcmsvYXNzZXRzIiB+ICJmb29kX2Nhc2ggZm9yIHdvcmtfYXNzZXRzIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3Rpdml0eSA9PSAiaW5jb21lLWdlbmVyYXRpbmcgYWN0aXZpdGllcyBhbmQgc21hbGwgZ3JhbnRzIiB+ICJJR0EgYW5kIHNtYWxsIGdyYW50cyIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUgfiBhY3Rpdml0eSksIA0KICAgICAgICAgYWN0aXZpdHlfcmVkID0gc3RyX3JlbW92ZV9hbGwoYWN0aXZpdHlfcmVkLCAicHJvdmlzaW9uIG9mICIpKSAlPiUNCiAgbXV0YXRlKHN0cmF0X29iaiA9IGNhc2Vfd2hlbihhY3Rpdml0eV9yZWQgJWluJSBjKCJmb29kIGRpc3RyaWJ1dGlvbiIsICJtdWx0aS1wdXJwb3NlIGNhc2ggdHJhbnNmZXIiKSAmDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZW5lZmljaWFyeV90eXBlID09ICJJbnRlcm5hbGx5IERpc3BsYWNlZCIgfiANCiAgICAgICAgICAgICAgICAgICAgICAgICAgInNvXzEiLCANCiAgICAgICAgICAgICAgICAgICAgICAgIGFjdGl2aXR5X3JlZCAlaW4lIGMoImZvb2QgZGlzdHJpYnV0aW9uIiwgIm11bHRpLXB1cnBvc2UgY2FzaCB0cmFuc2ZlciIpICYgDQogICAgICAgICAgICAgICAgICAgICAgICAgIGJlbmVmaWNpYXJ5X3R5cGUgIT0gIkludGVybmFsbHkgRGlzcGxhY2VkIiB+IA0KICAgICAgICAgICAgICAgICAgICAgICAgICAic29fMiIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgVFJVRSB+ICJzb18zIikpICU+JSANCiAgICMgdGhlc2UgcGFydG5lcnMgZGlkIG5vdCBwcm92aWRlIHRoZSBudW1iZXJzIG9mIGhvdXNlaG9sZHMNCiAgbXV0YXRlKGhvdXNlaG9sZHMgPSBpZmVsc2UoaXMubmEoaG91c2Vob2xkcyksIGJlbmVmaWNpYXJpZXMsIGhvdXNlaG9sZHMpKSAlPiUgDQogIG11dGF0ZSh1c2RfcGVyX2hoZCA9IHRvdGFsX3ZhbHVlX3VzZCAvIGhvdXNlaG9sZHMsIA0KICAgICAgICAgdXNkX3Blcl9wZXJzb24gPSB0b3RhbF92YWx1ZV91c2QgLyBiZW5lZmljaWFyaWVzKSAlPiUgDQogIG11dGF0ZSh1c2RfaGhkX2JpbiA9IGNhc2Vfd2hlbih1c2RfcGVyX2hoZCA8IDEwIH4gIjwkMTAiLA0KICAgICAgICAgICAgICAgICAgICAgdXNkX3Blcl9oaGQgPj0gMTAgJiB1c2RfcGVyX2hoZCA8IDIwIH4gIj49JDEwXzwkMjAiLA0KICAgICAgICAgICAgICAgICAgICAgdXNkX3Blcl9oaGQgPj0gMjAgJiB1c2RfcGVyX2hoZCA8IDMwIH4gIj49JDIwXzwkMzAiLA0KICAgICAgICAgICAgICAgICAgICAgdXNkX3Blcl9oaGQgPj0gMzAgJiB1c2RfcGVyX2hoZCA8IDQwIH4gIj49JDMwXzwkNDAiLA0KICAgICAgICAgICAgICAgICAgICAgdXNkX3Blcl9oaGQgPj0gNDAgJiB1c2RfcGVyX2hoZCA8IDUwIH4gIj49JDQwXzwkNTAiLA0KICAgICAgICAgICAgICAgICAgICAgdXNkX3Blcl9oaGQgPj0gNTAgJiB1c2RfcGVyX2hoZCA8IDYwIH4gIj49JDUwXzwkNjAiLA0KICAgICAgICAgICAgICAgICAgICAgdXNkX3Blcl9oaGQgPj0gNjAgJiB1c2RfcGVyX2hoZCA8IDcwIH4gIj49JDYwXzwkNzAiLA0KICAgICAgICAgICAgICAgICAgICAgdXNkX3Blcl9oaGQgPj0gNzAgJiB1c2RfcGVyX2hoZCA8IDgwIH4gIj49JDcwXzwkODAiLA0KICAgICAgICAgICAgICAgICAgICAgdXNkX3Blcl9oaGQgPj0gODAgJiB1c2RfcGVyX2hoZCA8IDkwIH4gIj49JDgwXzwkOTAiLA0KICAgICAgICAgICAgICAgICAgICAgdXNkX3Blcl9oaGQgPj0gOTAgJiB1c2RfcGVyX2hoZCA8IDEwMCB+ICI+PSQ5MF88JDEwMCIsDQogICAgICAgICAgICAgICAgICAgICB1c2RfcGVyX2hoZCA+PSAxMDAgfiAiPj0kMTAwIiwNCiAgICAgICAgICAgICAgICAgICAgIFRSVUUgfiBOQV9jaGFyYWN0ZXJfKSwNCiAgICAgICAgIHVzZF9oaGRfYmluID0gZmN0X3JlbGV2ZWwodXNkX2hoZF9iaW4sIGMoIjwkMTAiLCAiPj0kMTBfPCQyMCIsICI+PSQyMF88JDMwIiwgIj49JDMwXzwkNDAiLCAiPj0kNDBfPCQ1MCIsIj49JDUwXzwkNjAiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIj49JDYwXzwkNzAiLCAiPj0kNzBfPCQ4MCIsICI+PSQ4MF88JDkwIiwiPj0kOTBfPCQxMDAiLCI+PSQxMDAiKSkpICU+JSANCiAgbXV0YXRlKHVzZF9wZXJzb25fYmluID0gY2FzZV93aGVuKHVzZF9wZXJfcGVyc29uIDwgMiB+ICI8JDIiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNkX3Blcl9wZXJzb24gPj0gMiAmIHVzZF9wZXJfcGVyc29uIDwgNCB+ICI+PSQyXzwkNCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2RfcGVyX3BlcnNvbiA+PSA0ICYgdXNkX3Blcl9wZXJzb24gPCA2IH4gIj49JDRfPCQ2IiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZF9wZXJfcGVyc29uID49IDYgJiB1c2RfcGVyX3BlcnNvbiA8IDggfiAiPj0kNl88JDgiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNkX3Blcl9wZXJzb24gPj0gOCAmIHVzZF9wZXJfcGVyc29uIDwgMTAgfiAiPj0kOF88JDEwIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZF9wZXJfcGVyc29uID49IDEwICYgdXNkX3Blcl9wZXJzb24gPCAxMiB+ICI+PSQxMF88JDEyIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZF9wZXJfcGVyc29uID49IDEyICYgdXNkX3Blcl9wZXJzb24gPCAxNCB+ICI+PSQxMl88JDE0IiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZF9wZXJfcGVyc29uID49IDE0ICYgdXNkX3Blcl9wZXJzb24gPCAxNiB+ICI+PSQxNF88JDE2IiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZF9wZXJfcGVyc29uID49IDE2ICYgdXNkX3Blcl9wZXJzb24gPCAxOCB+ICI+PSQxNl88JDE4IiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZF9wZXJfcGVyc29uID49IDE4ICYgdXNkX3Blcl9wZXJzb24gPCAyMCB+ICI+PSQxOF88JDIwIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZF9wZXJfcGVyc29uID49IDIwIH4gIj49JDIwIiwNCiAgICAgICAgICAgICAgICAgICAgIFRSVUUgfiBOQV9jaGFyYWN0ZXJfKSwgDQogICAgICAgICB1c2RfcGVyc29uX2JpbiA9IGZjdF9yZWxldmVsKHVzZF9wZXJzb25fYmluLCBjKCI8JDIiLCAiPj0kMl88JDQiLCAiPj0kNF88JDYiLCAiPj0kNl88JDgiLCAiPj0kOF88JDEwIiwiPj0kMTBfPCQxMiIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPj0kMTJfPCQxNCIsICI+PSQxNF88JDE2IiwgIj49JDE2XzwkMTgiLCAiPj0kMThfPCQyMCIsIj49MjAiKSkpICU+JSANCiAgbXV0YXRlKGxvY2F0aW9uX3R5cGUgPSByZWNvZGUobG9jYXRpb25fdHlwZSwgInZpbGxhZ2UiID0gIlZpbGxhZ2UiKSkNCiANCiAgDQpwaW4gPC0gcmVhZF9jc3YoImZzX3Bpbi5jc3YiKSAlPiUgDQogIHNlbGVjdCgtYWRtaW4xX3Bjb2RlKSAlPiUgDQogIGxlZnRfam9pbihwY29kZTQgJT4lIGRpc3RpbmN0KGFkbWluMV9wY29kZSwgc3RhdGUpLCBieSA9ICJzdGF0ZSIpDQoNCg0KZnNjXzIwMjEgPC0gcmVhZF9jc3YoImZzYzV3XzIwMjEuY3N2IikgJT4lDQogIG11dGF0ZShhY3Rpdml0eV9uZXcgPSANCiAgICAgICAgICAgY2FzZV93aGVuKHN0cl9kZXRlY3QoYWN0aXZpdHlfZGVzY3JpcHRpb24sICJMb2NhbCBDaGlja2VuIHN1cHBvcnQiKSB+DQogICAgICAgICAgICAgICAgICAgICAgICJwcm92aXNpb24gb2YgbGl2ZXN0b2NrIGtpdHMiLA0KICAgICAgICAgICAgICAgICAgICAgYWN0aXZpdHkgPT0gIkNhc2ggZm9yIFdvcmsgLyBGb29kIGZvciBBc3NldHMiIH4NCiAgICAgICAgICAgICAgICAgICAgICAgImZvb2QvY2FzaCBmb3Igd29yay9hc3NldHMiLA0KICAgICAgICAgICAgICAgICAgICAgc3RyX2RldGVjdChhY3Rpdml0eV9kZXNjcmlwdGlvbiwgImhvbWV8SG9tZSIpICYgDQogICAgICAgICAgICAgICAgICAgICAgICFzdHJfZGV0ZWN0KGFjdGl2aXR5X2Rlc2NyaXB0aW9uLCAidHJhaW5pbmd8VHJhaW5pbmd8VHJhaW5pbmcsIikgfg0KICAgICAgICAgICAgICAgICAgICAgICAicHJvdmlzaW9uIG9mIGtpdGNoZW4gZ2FyZGVuIGtpdHMiLA0KICAgICAgICAgICAgICAgICAgICAgYWN0aXZpdHkgPT0gIlByb3ZpZGUgY3JvcHMgJiB2ZWdldGFibGVzIGtpdHMiICYgDQogICAgICAgICAgICAgICAgICAgICAgIHN0cl9kZXRlY3QoYWN0aXZpdHlfZGVzY3JpcHRpb24sICJwdW1wc3x0aWxsfGRydW18VGlsbGVyfERydW0iKSB+IA0KICAgICAgICAgICAgICAgICAgICAgICAicHJvdmlzaW9uIG9mIGNvbW11bml0eSBpbmZyYXN0cnVjdHVyZSBhbmQgZXF1aXBtZW50IiwNCiAgICAgICAgICAgICAgICAgICAgIGFjdGl2aXR5ID09ICJQcm92aWRlIGNyb3BzICYgdmVnZXRhYmxlcyBraXRzIiB+IA0KICAgICAgICAgICAgICAgICAgICAgICAicHJvdmlzaW9uIG9mIGNyb3AsIHZlZ2V0YWJsZSBhbmQgc2VlZCBraXRzIiwNCiAgICAgICAgICAgICAgICAgICAgIGFjdGl2aXR5ID09ICJQcm92aWRlIGZpc2hlcnkga2l0cyIgfiANCiAgICAgICAgICAgICAgICAgICAgICAgInByb3Zpc2lvbiBvZiBmaXNoZXJ5IGtpdHMiLA0KICAgICAgICAgICAgICAgICAgICAgYWN0aXZpdHkgPT0gIlByb3ZpZGUgbGl2ZXN0b2NrIGtpdHMiIH4gDQogICAgICAgICAgICAgICAgICAgICAgICJwcm92aXNpb24gb2YgbGl2ZXN0b2NrIGtpdHMiLA0KICAgICAgICAgICAgICAgICAgICAgYWN0aXZpdHkgJWluJSBjKCJQcm92aWRlIG1vbnRobHkgY2FzaC1iYXNlZCB0cmFuc2ZlcnMiLCAiUHJvdmlkZSBtb250aGx5IGZvb2QgYmFza2V0cyIpICYgDQogICAgICAgICAgICAgICAgICAgICAgIHN0cl9kZXRlY3QoYWN0aXZpdHlfZGVzY3JpcHRpb24sICJMaWZlc2F2aW5nfGxpZmVzYXZpbmd8YWN1dGV8QWN1dGUiKSB+IA0KICAgICAgICAgICAgICAgICAgICAgICAiZm9vZCBkaXN0cmlidXRpb25zIChpbiBraW5kL3ZvdWNoZXIvY2FzaCksIHNldmVyZSIsDQogICAgICAgICAgICAgICAgICAgICAjIHdoYXQgdG8gZG8gYWJvdXQgTVZDLCBtYWxub3VyaXNoZWQgY2hpbGRyZW4gYW5kIFBMVz8NCiAgICAgICAgICAgICAgICAgICAgIGFjdGl2aXR5ICVpbiUgYygiUHJvdmlkZSBtb250aGx5IGNhc2gtYmFzZWQgdHJhbnNmZXJzIiwgIlByb3ZpZGUgbW9udGhseSBmb29kIGJhc2tldHMiKSAgfg0KICAgICAgICAgICAgICAgICAgICAgICAiZm9vZCBkaXN0cmlidXRpb25zIChpbiBraW5kL3ZvdWNoZXIvY2FzaCksIG1vZGVyYXRlIiwgIA0KICAgICAgICAgICAgICAgICAgICAgYWN0aXZpdHkgPT0gIlByb3ZpZGUgc3VwcG9ydCBmb3IgaW5jb21lIGdlbmVyYXRpb24iICYgDQogICAgICAgICAgICAgICAgICAgICAgICFzdHJfZGV0ZWN0KGFjdGl2aXR5X2Rlc2NyaXB0aW9uLCAiYWdyaWN1bHR1cmUgaW5wdXR8ZmFybWluZyIpIH4NCiAgICAgICAgICAgICAgICAgICAgICAgImluY29tZS1nZW5lcmF0aW5nIGFjdGl2aXRpZXMgYW5kIHNtYWxsIGdyYW50cyIsDQogICAgICAgICAgICAgICAgICAgICBhY3Rpdml0eSAgPT0gIlByb3ZpZGUgc3VwcG9ydCBmb3IgaW5jb21lIGdlbmVyYXRpb24iICB+DQogICAgICAgICAgICAgICAgICAgICAgICJpbmNvbWUtZ2VuZXJhdGluZyBhY3Rpdml0aWVzIGFuZCBzbWFsbCBncmFudHMiLA0KICAgICAgICAgICAgICAgICAgICAgYWN0aXZpdHkgPT0gIlByb3ZpZGUgdGVjaG5pY2FsIHRyYWluaW5nIiAmIHN0cl9kZXRlY3QoYWN0aXZpdHlfZGVzY3JpcHRpb24sDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmYXJtfEZhcm18RkZTfHBlc3RpY2lkZXxmZXJ0aXxhZ3JpfEFncml8Z2FyZGVuaW5nfFNlZWR8c2VlZHxTU0EiKSB+DQogICAgICAgICAgICAgICAgICAgICAgICJGRlMgYW5kIGZhcm1lciB0cmFpbmluZyIsDQogICAgICAgICAgICAgICAgICAgICBhY3Rpdml0eSA9PSAiUHJvdmlkZSB0ZWNobmljYWwgdHJhaW5pbmciIH4gInZvY2F0aW9uYWwgdHJhaW5pbmciLA0KICAgICAgICAgICAgICAgICAgICAgYWN0aXZpdHlfZGVzY3JpcHRpb24gJWluJSBjKCJQcm92aWRlIFZvdWNoZXIgQ2FyZHMgdG8gYnV5IGFncmljdWx0dXJlIGlucHV0cyBmb3IgdGhlaXIgYWdyaWN1bHR1cmFsIHdvcmtzIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ2FzaCBmb3IgZmFybWluZyAoTGl2ZXN0b2NrIGFuZCBBZ3JpKSIpIH4NCiAgICAgICAgICAgICAgICAgICAgICAgInByb3Zpc2lvbiBvZiBjcm9wLCB2ZWdldGFibGUgYW5kIHNlZWQga2l0cyIsIA0KICAgICAgICAgICAgICAgICAgICAgVFJVRSB+IE5BX2NoYXJhY3Rlcl8pKSAlPiUgDQogICBtdXRhdGUoYWN0aXZpdHlfcmVkID0gY2FzZV93aGVuKGFjdGl2aXR5X25ldyAlaW4lIGMoImZvb2QgZGlzdHJpYnV0aW9ucyAoaW4ga2luZC92b3VjaGVyL2Nhc2gpLCBtb2RlcmF0ZSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZm9vZCBkaXN0cmlidXRpb25zIChpbiBraW5kL3ZvdWNoZXIvY2FzaCksIHNldmVyZSIpIH4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZm9vZCBkaXN0cmlidXRpb24iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGl2aXR5X25ldyAlaW4lIGMoIm11bHRpLXB1cnBvc2UgY2FzaCB0cmFuc2ZlciAoTVBDKSwgbW9kZXJhdGUiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibXVsdGktcHVycG9zZSBjYXNoIHRyYW5zZmVyIChNUEMpLCBzZXZlcmUiKSB+IA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm11bHRpLXB1cnBvc2UgY2FzaCB0cmFuc2ZlciIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aXZpdHkgPT0gImxpdmVsaWhvb2RzIHZvY2F0aW9uYWwgdHJhaW5pbmciIH4gInZvY2F0aW9uYWwgdHJhaW5pbmciLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGl2aXR5ID09ICJmb29kL2Nhc2ggZm9yIHdvcmsvYXNzZXRzIiB+ICJmb29kX2Nhc2ggZm9yIHdvcmtfYXNzZXRzIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3Rpdml0eSA9PSAiaW5jb21lLWdlbmVyYXRpbmcgYWN0aXZpdGllcyBhbmQgc21hbGwgZ3JhbnRzIiB+ICJJR0EgYW5kIHNtYWxsIGdyYW50cyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJVRSB+IGFjdGl2aXR5X25ldykpICU+JSANCiAgbXV0YXRlKHN0cmF0X29iaiA9IGNhc2Vfd2hlbihhY3Rpdml0eV9yZWQgJWluJSBjKCJmb29kIGRpc3RyaWJ1dGlvbiIsICJtdWx0aS1wdXJwb3NlIGNhc2ggdHJhbnNmZXIiKSAmIA0KICAgICAgICAgICAgICAgICAgICAgICAgICBiZW5lZmljaWFyeV90eXBlID09ICJJbnRlcm5hbGx5IERpc3BsYWNlZCIgfiANCiAgICAgICAgICAgICAgICAgICAgICAgICAgInNvXzEiLCANCiAgICAgICAgICAgICAgICAgICAgICAgIGFjdGl2aXR5X3JlZCAlaW4lIGMoImZvb2QgZGlzdHJpYnV0aW9uIiwgIm11bHRpLXB1cnBvc2UgY2FzaCB0cmFuc2ZlciIpICYgDQogICAgICAgICAgICAgICAgICAgICAgICAgIGJlbmVmaWNpYXJ5X3R5cGUgIT0gIkludGVybmFsbHkgRGlzcGxhY2VkIiB+IA0KICAgICAgICAgICAgICAgICAgICAgICAgICAic29fMiIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgVFJVRSB+ICJzb18zIikpICU+JSANCiAgbXV0YXRlKGFjdGl2aXR5X3JlZCA9IHJlY29kZShhY3Rpdml0eV9yZWQsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImZvb2QvY2FzaCBmb3Igd29yay9hc3NldHMiID0gImZvb2RfY2FzaCBmb3Igd29ya19hc3NldHMiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwcm92aXNpb24gb2YgY3JvcCwgdmVnZXRhYmxlIGFuZCBzZWVkIGtpdHMiID0gImNyb3AsIHZlZ2V0YWJsZSBhbmQgc2VlZCBraXRzIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwcm92aXNpb24gb2YgbGl2ZXN0b2NrIGtpdHMiID0gImxpdmVzdG9jayBraXRzIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbmNvbWUtZ2VuZXJhdGluZyBhY3Rpdml0aWVzIGFuZCBzbWFsbCBncmFudHMiID0gIklHQSBhbmQgc21hbGwgZ3JhbnRzIiksIA0KICAgICAgICAgYWN0aXZpdHlfcmVkID0gc3RyX3JlbW92ZV9hbGwoYWN0aXZpdHlfcmVkLCAicHJvdmlzaW9uIG9mICIpKSAlPiUgDQogICBtdXRhdGUodXNkX3Blcl9oaGQgPSB0b3RhbF92YWx1ZV91c2QgLyBob3VzZWhvbGRzLCANCiAgICAgICAgIHVzZF9wZXJfcGVyc29uID0gdG90YWxfdmFsdWVfdXNkIC8gYmVuZWZpY2lhcmllcykgJT4lIA0KICBtdXRhdGUodXNkX2hoZF9iaW4gPSBjYXNlX3doZW4obmV3X3ZhbHVlX2hoZCA8IDEwIH4gIjwkMTAiLA0KICAgICAgICAgICAgICAgICAgICAgbmV3X3ZhbHVlX2hoZCA+PSAxMCAmIG5ld192YWx1ZV9oaGQgPCAyMCB+ICI+PSQxMF88JDIwIiwNCiAgICAgICAgICAgICAgICAgICAgIG5ld192YWx1ZV9oaGQgPj0gMjAgJiBuZXdfdmFsdWVfaGhkIDwgMzAgfiAiPj0kMjBfPCQzMCIsDQogICAgICAgICAgICAgICAgICAgICBuZXdfdmFsdWVfaGhkID49IDMwICYgbmV3X3ZhbHVlX2hoZCA8IDQwIH4gIj49JDMwXzwkNDAiLA0KICAgICAgICAgICAgICAgICAgICAgbmV3X3ZhbHVlX2hoZCA+PSA0MCAmIG5ld192YWx1ZV9oaGQgPCA1MCB+ICI+PSQ0MF88JDUwIiwNCiAgICAgICAgICAgICAgICAgICAgIG5ld192YWx1ZV9oaGQgPj0gNTAgJiBuZXdfdmFsdWVfaGhkIDwgNjAgfiAiPj0kNTBfPCQ2MCIsDQogICAgICAgICAgICAgICAgICAgICBuZXdfdmFsdWVfaGhkID49IDYwICYgbmV3X3ZhbHVlX2hoZCA8IDcwIH4gIj49JDYwXzwkNzAiLA0KICAgICAgICAgICAgICAgICAgICAgbmV3X3ZhbHVlX2hoZCA+PSA3MCAmIG5ld192YWx1ZV9oaGQgPCA4MCB+ICI+PSQ3MF88JDgwIiwNCiAgICAgICAgICAgICAgICAgICAgIG5ld192YWx1ZV9oaGQgPj0gODAgJiBuZXdfdmFsdWVfaGhkIDwgOTAgfiAiPj0kODBfPCQ5MCIsDQogICAgICAgICAgICAgICAgICAgICBuZXdfdmFsdWVfaGhkID49IDkwICYgbmV3X3ZhbHVlX2hoZCA8IDEwMCB+ICI+PSQ5MF88JDEwMCIsDQogICAgICAgICAgICAgICAgICAgICBuZXdfdmFsdWVfaGhkID49IDEwMCB+ICI+PSQxMDAiLA0KICAgICAgICAgICAgICAgICAgICAgVFJVRSB+IE5BX2NoYXJhY3Rlcl8pLA0KICAgICAgICAgdXNkX2hoZF9iaW4gPSBmY3RfcmVsZXZlbCh1c2RfaGhkX2JpbiwgYygiPCQxMCIsICI+PSQxMF88JDIwIiwgIj49JDIwXzwkMzAiLCAiPj0kMzBfPCQ0MCIsICI+PSQ0MF88JDUwIiwiPj0kNTBfPCQ2MCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPj0kNjBfPCQ3MCIsICI+PSQ3MF88JDgwIiwgIj49JDgwXzwkOTAiLCI+PSQ5MF88JDEwMCIsIj49JDEwMCIpKSkgJT4lIA0KICBtdXRhdGUodXNkX3BlcnNvbl9iaW4gPSBjYXNlX3doZW4obmV3X3ZhbHVlX3BlcnNvbiA8IDIgfiAiPCQyIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld192YWx1ZV9wZXJzb24gPj0gMiAmIG5ld192YWx1ZV9wZXJzb24gPCA0IH4gIj49JDJfPCQ0IiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld192YWx1ZV9wZXJzb24gPj0gNCAmIG5ld192YWx1ZV9wZXJzb24gPCA2IH4gIj49JDRfPCQ2IiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld192YWx1ZV9wZXJzb24gPj0gNiAmIG5ld192YWx1ZV9wZXJzb24gPCA4IH4gIj49JDZfPCQ4IiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld192YWx1ZV9wZXJzb24gPj0gOCAmIG5ld192YWx1ZV9wZXJzb24gPCAxMCB+ICI+PSQ4XzwkMTAiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3X3ZhbHVlX3BlcnNvbiA+PSAxMCAmIG5ld192YWx1ZV9wZXJzb24gPCAxMiB+ICI+PSQxMF88JDEyIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld192YWx1ZV9wZXJzb24gPj0gMTIgJiBuZXdfdmFsdWVfcGVyc29uIDwgMTQgfiAiPj0kMTJfPCQxNCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdfdmFsdWVfcGVyc29uID49IDE0ICYgbmV3X3ZhbHVlX3BlcnNvbiA8IDE2IH4gIj49JDE0XzwkMTYiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3X3ZhbHVlX3BlcnNvbiA+PSAxNiAmIG5ld192YWx1ZV9wZXJzb24gPCAxOCB+ICI+PSQxNl88JDE4IiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld192YWx1ZV9wZXJzb24gPj0gMTggJiBuZXdfdmFsdWVfcGVyc29uIDwgMjAgfiAiPj0kMThfPCQyMCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdfdmFsdWVfcGVyc29uID49IDIwIH4gIj49JDIwIiwNCiAgICAgICAgICAgICAgICAgICAgIFRSVUUgfiBOQV9jaGFyYWN0ZXJfKSwgDQogICAgICAgICB1c2RfcGVyc29uX2JpbiA9IGZjdF9yZWxldmVsKHVzZF9wZXJzb25fYmluLCBjKCI8JDIiLCAiPj0kMl88JDQiLCAiPj0kNF88JDYiLCAiPj0kNl88JDgiLCAiPj0kOF88JDEwIiwiPj0kMTBfPCQxMiIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPj0kMTJfPCQxNCIsICI+PSQxNF88JDE2IiwgIj49JDE2XzwkMTgiLCAiPj0kMThfPCQyMCIsIj49MjAiKSkpDQoNCiMgc2hhcGVmaWxlcw0KcGNvZGUzX3NoYXBlIDwtIHN0X3JlYWQoIi4vbW1yX3BvbGJuZGFfYWRtM19taW11XzI1MGsvbW1yX3BvbGJuZGFfYWRtM19taW11XzI1MGsuc2hwIiwgcXVpZXQgPSBUUlVFKSAlPiUNCiAgcmVuYW1lKHN0YXRlID0gU1QsIA0KICAgICAgICBhZG1pbjFfcGNvZGUgPSBTVF9QQ09ERSwNCiAgICAgICAgdG93bnNoaXAgPSBUUywNCiAgICAgICAgYWRtaW4zX3Bjb2RlID0gVFNfUENPREUpICU+JSANCiBtdXRhdGUoYWRtaW4zX3Bjb2RlID0gaWZlbHNlKHN0cl9kZXRlY3QodG93bnNoaXAsICJIbGFpbmd0aGFyeWEiKSwgIk1NUjAxMzAwOCIsIGFkbWluM19wY29kZSkpDQoNCnBjb2RlMV9zaGFwZSA8LSBzdF9yZWFkKCIuL21tcl9wb2xibmRhMl9hZG0xX21pbXVfMjUway9tbXJfcG9sYm5kYTJfYWRtMV9taW11XzI1MGsuc2hwIiwgcXVpZXQgPSBUUlVFKSAlPiUgDQogcmVuYW1lKHN0YXRlID0gU1QsIA0KICAgICAgICBhZG1pbjFfcGNvZGUgPSBTVF9QQ09ERSkgJT4lIHN0X2FzX3NmKCkNCmBgYA0KDQpbRm9vZCBTZWN1cml0eSBDbHVzdGVyIE15YW5tYXIgaG9tZXBhZ2VdKGh0dHBzOi8vZm9vZC1zZWN1cml0eS1jbHVzdGVyLW15YW5tYXIuZ2l0aHViLmlvLykNCg0KPGJyPg0KDQojIyBTdW1tYXJ5IG9mIGFjaGlldmVtZW50cw0KDQpCZW5lZmljaWFyaWVzIG9mIGh1bWFuaXRhcmlhbiBhY3Rpb24gZm9ybWVkIGByIHJvdW5kKGZpbHRlcihmc2MsIGh1bWFuaXRhcmlhbl9vcl9kZXZlbG9wbWVudCA9PSAiSHVtYW5pdGFyaWFuIikgJT4lIHtzdW0oLiRuZXdfYmVuZWZpY2lhcmllcywgbmEucm0gPSBUUlVFKX0gLyBzdW0oZnNjJG5ld19iZW5lZmljaWFyaWVzLCBuYS5ybSA9IFRSVUUpICogMTAwLCBkaWdpdHMgPSAyKWAlIG9mIHRoZSBgciBzdW0oZnNjJG5ld19iZW5lZmljaWFyaWVzKSAlPiUgZm9ybWF0KGJpZy5tYXJrID0gIiwiKWAgYmVuZWZpY2lhcmllcyBpbiB0aGUgZmlyc3QgcXVhcnRlciBvZiAyMDIyLiBUaGUgcmVtYWluZGVyIHdlcmUgcmVhY2hlZCB0aHJvdWdoIGRldmVsb3BtZW50IGludGVydmVudGlvbnMuIA0KDQpUbyByZWNhbGwsIHRoZSBGb29kIFNlY3VyaXR5IENsdXN0ZXIncyBzdHJhdGVnaWMgb2JqZWN0aXZlcyBmb3IgMjAyMiBhcmU6IA0KDQoqIFNPMTogSURQcyBoYXZlIGVxdWl0YWJsZSBhY2Nlc3MgdG8gc3VmZmljaWVudCwgc2FmZSBhbmQgbnV0cml0aW91cyBmb29kIChlaXRoZXIgaW4ta2luZCBvciB0aHJvdWdoIGZvb2QgYXNzaXN0YW5jZSkNCiogU08yOiBWdWxuZXJhYmxlIHBlcnNvbnMgKGV4Y2wuIElEUHMpIGhhdmUgZXF1aXRhYmxlIGFjY2VzcyB0byBzdWZmaWNpZW50LCBzYWZlIGFuZCBudXRyaXRpb3VzIGZvb2QgKGVpdGhlciBpbi1raW5kIG9yIHRocm91Z2ggZm9vZCBhc3Npc3RhbmNlKQ0KKiBTTzM6IFJlc3RvcmUsIHByb3RlY3QgYW5kIGltcHJvdmUgbGl2ZWxpaG9vZHMgYW5kIHJlc2lsaWVuY2UgDQoNCmBgYHtyIGJlbmVmaWNpYXJpZXMtYnktc299DQpmc2MgJT4lIA0KICBzdW1fYmVuMihzdHJhdF9vYmosIGh1bWFuaXRhcmlhbl9vcl9kZXZlbG9wbWVudCkgJT4lIA0KICB1bmdyb3VwKCkgJT4lDQogIHBpdm90X3dpZGVyKG5hbWVzX2Zyb20gPSBodW1hbml0YXJpYW5fb3JfZGV2ZWxvcG1lbnQsIHZhbHVlc19mcm9tID0gYmVuZWZpY2lhcmllcywgdmFsdWVzX2ZpbGwgPSAwKSAlPiUgDQogIG11dGF0ZShzdHJhdF9vYmogPSBmY3RfcmVsZXZlbChzdHJhdF9vYmosIGxldmVscyA9IGMoInNvXzEiLCAic29fMiIsICJzb18zIikpLCANCiAgICAgICAgIFRvdGFsID0gRGV2ZWxvcG1lbnQgKyBIdW1hbml0YXJpYW4sIA0KICAgICAgICAgc3RyYXRfb2JqID0gc3RyX3RvX3VwcGVyKHN0cmF0X29iaikpICU+JQ0KICBhZG9ybl90b3RhbHMoInJvdyIpICU+JSANCiAga2FibGUoY2FwdGlvbiA9ICIyMDIyL1ExIGJlbmVmaWNpYXJpZXMgYnkgc3RyYXRlZ2ljIG9iamVjdGl2ZSIsIGZvcm1hdC5hcmdzID0gbGlzdChiaWcubWFyayA9ICIsIikpICU+JSANCiAga2FibGVfY2xhc3NpY18yKCJzdHJpcGVkIiwgZnVsbF93aWR0aCA9IEZBTFNFKQ0KDQoNCmBgYA0KDQo8YnI+DQoNCkluIHRlcm1zIG9mIGFjdGl2aXRpZXMsIHRoZSBudW1iZXIgb2YgYmVuZWZpY2lhcmllcyByZWFjaGVkIGlzIGhlYXZpbHkgc2tld2VkIHRvd2FyZHMgZm9vZCBkaXN0cmlidXRpb25zLiBNb3JlIHRoYW4gOTUlIG9mIGJlbmVmaWNpYXJpZXMgaW4gMjAyMi9RMSBoYXZlIGJlZW4gcmVhY2hlZCBieSB0aGlzIGFjdGl2aXR5LiANCg0KYGBge3IgdGFibGUtYmVuZWZpY2lhcmllcy1hY3Rpdml0eX0NCmZzYyAlPiUgIA0KICAjIGZpbHRlcihodWIgPT0gIm5vcnRoZWFzdCIpICU+JQ0KICBtdXRhdGUoc3RyYXRfb2JqID0gc3RyX3RvX3VwcGVyKHN0cmF0X29iaikpICU+JQ0KICBncm91cF9ieShhY3Rpdml0eV9yZWQsIHN0cmF0X29iaikgJT4lIA0KICBzdW1tYXJpc2VfYXQoImJlbmVmaWNpYXJpZXMiLCBzdW0pICU+JSANCiAgcGl2b3Rfd2lkZXIobmFtZXNfZnJvbSA9IHN0cmF0X29iaiwgdmFsdWVzX2Zyb20gPSBiZW5lZmljaWFyaWVzLCB2YWx1ZXNfZmlsbCA9IDApICU+JSANCiAgbGVmdF9qb2luKA0KICAgIGZzYyAlPiUgDQogICAgICAjIGZpbHRlcihodWIgPT0gIm5vcnRoZWFzdCIpICU+JSANCiAgICAgIHN1bV9iZW4oYWN0aXZpdHlfcmVkKSAlPiUgDQogICAgICByZW5hbWUodW5pcXVlX2JlbmVmaWNpYXJpZXMgPSBiZW5lZmljaWFyaWVzKSwgDQogICAgYnkgPSAiYWN0aXZpdHlfcmVkIg0KICApICU+JSANCiAgcmVsb2NhdGUoU09fMywgLmFmdGVyID0gU09fMikgJT4lIA0KICByZW5hbWUoYWN0aXZpdHkgPSBhY3Rpdml0eV9yZWQpICU+JSANCiAgYWRvcm5fdG90YWxzKCJyb3ciKSAlPiUgDQogIGthYmxlKGNhcHRpb24gPSAiQnJlYWtkb3duIG9mIGJlbmVmaWNpYXJpZXMgYnkgYWN0aXZpdHkgaW4gMjAyMi9RMSIsIA0KICAgICAgICBmb3JtYXQuYXJncyA9IGxpc3QoYmlnLm1hcmsgPSAiLCIpKSAlPiUgDQogIGthYmxlX2NsYXNzaWNfMigic3RyaXBlZCIpICU+JSANCiAgZm9vdG5vdGUoIlRoZSBzdW0gb2YgYmVuZWZpY2lhcnkgZnJlcXVlbmNpZXMgZG9lcyBub3QgZXF1YWwgdGhlIG51bXZiZXIgb2YgdW5pcXVlIGJlbmVmaWNpYXJpZXMgcmVhY2hlZCIsIA0KICAgICAgICAgICBnZW5lcmFsX3RpdGxlID0gIiIpDQpgYGANCg0KPGJyPg0KDQo1NyUgb2YgYmVuZWZpY2lhcmllcyB3ZXJlIHJlYWNoZWQgYnkgYWN0aXZpdGllcyB3aGVyZSBudXRyaXRpb24gd2FzIG1haW5zdHJlYW1lZC4gVGhpcyBpcyBoaWdobHkgZW5jb3VyYWdpbmcuIEFzIHRoZSB5ZWFyIHByb2dyZXNzZXMsIGl0IHdpbGwgYmUgaW1wb3J0YW50IHRvIGNvbGxlY3QgbW9yZSBkZXRhaWxzIGFib3V0IGhvdyBleGFjdGx5IG51dHJpdGlvbiBoYXMgYmVlbiBtYWluc3RyZWFtZWQgc28gdGhhdCBjb29yZGluYXRpb24gd2l0aCB0aGUgTnV0cml0aW9uIENsdXN0ZXIgbWF5IGJlIGltcHJvdmVkLiANCg0KYGBge3IgdGFibGUtbnV0cml0aW9uLW1haW5zdHJlYW1pbmd9DQpmc2MgJT4lIA0KICBtdXRhdGUoc3RyYXRfb2JqID0gc3RyX3RvX3VwcGVyKHN0cmF0X29iaikpICU+JSANCiAgbXV0YXRlKHdhc19udXRyaXRpb25fbWFpbnN0cmVhbWVkX2luX2FjdGl2aXR5ID0gaWZlbHNlKGlzLm5hKHdhc19udXRyaXRpb25fbWFpbnN0cmVhbWVkX2luX2FjdGl2aXR5KSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTm8iLCB3YXNfbnV0cml0aW9uX21haW5zdHJlYW1lZF9pbl9hY3Rpdml0eSksIA0KICAgICAgICAgd2FzX251dHJpdGlvbl9tYWluc3RyZWFtZWRfaW5fYWN0aXZpdHkgPSBmY3RfcmVsZXZlbCh3YXNfbnV0cml0aW9uX21haW5zdHJlYW1lZF9pbl9hY3Rpdml0eSwgbGV2ZWxzID0gYygiWWVzIiwgIk5vIikpKSAlPiUgDQogIHN1bV9iZW4yKHN0cmF0X29iaiwgd2FzX251dHJpdGlvbl9tYWluc3RyZWFtZWRfaW5fYWN0aXZpdHkpICU+JSANCiAgcGl2b3Rfd2lkZXIobmFtZXNfZnJvbSA9IHN0cmF0X29iaiwgdmFsdWVzX2Zyb20gPSBiZW5lZmljaWFyaWVzKSAlPiUgDQogIG11dGF0ZSh0b3RhbF9iZW5lZmljaWFyaWVzID0gU09fMSArIFNPXzIgKyBTT18zLCANCiAgICAgICAgIGAlX2JlbmVmaWNpYXJpZXNgID0gcm91bmQodG90YWxfYmVuZWZpY2lhcmllcyAvIHN1bSh0b3RhbF9iZW5lZmljaWFyaWVzKSAqIDEwMCwgZGlnaXRzID0gMikpICU+JSANCiAga2FibGUoY2FwdGlvbiA9ICJCcmVha2Rvd24gb2YgYmVuZWZlY2lhcmllcyBieSBzdGF0dXMgb2YgbnV0cml0aW9uIG1haW5zdHJlYW1pbmciLCBmb3JtYXQuYXJncyA9IGxpc3QoYmlnLm1hcmsgPSAiLCIpKSAlPiUgDQogIGthYmxlX2NsYXNzaWNfMigic3RyaXBlZCIpDQogIA0KYGBgDQoNCjxicj48YnI+DQoNCiMjIyBJbXBsZW1lbnRhdGlvbiBvZiBJbmZvcm1hdGlvbiBTaGFyaW5nIFByb3RvY29scyANCg0KVGhlIG5ld2x5IGFwcHJvdmVkIElDQ0cgSW5mb3JtYXRpb24gU2hhcmluZyBQcm90b2NvbHMgaGF2ZSBiZWVuIGltcGxlbWVudGVkIGluIHRoaXMgcmVwb3J0IHRvIHN1cHBvcnQgdGhlIHNhZmUsIGV0aGljYWwgYW5kIGVmZmVjdGl2ZSBtYW5hZ2VtZW50IG9mIGRhdGEgd2l0aGluIE15YW5tYXIuIFRoaXMgaW1wbGVtZW50YXRpb24gaXMgbW9zdCBldmlkZW50IGluIHRoZSB1c2Ugb2YgcGFydG5lciBwc2V1ZG9ueW1pc2F0aW9uIGluIHRoaXMgcmVwb3J0LiBQYXJ0bmVyIG5hbWVzIGhhdmUgYmVlbiByZXBsYWNlZCBieSB0b2tlbnMgaW4gdGhpcyByZXBvcnQuIFRoZXNlIHRva2VucyBhcmUgc3RvcmVkIGluIGEgc2VjdXJlIHRyYW5zbGF0aW9uIHRhYmxlIG9uIE9DSEEgc2VydmVycyBvdXRzaWRlIG9mIE15YW5tYXIsIHdoZXJlIHRoZXkgbWF5IG5vdCBiZSByZXF1aXNpdGlvbmVkIGJ5IGF1dGhvcml0aWVzLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgcGxlYXNlIHJlYWQgdGhlIGZ1bGwgdGV4dCBvZiB0aGUgcHJvdG9jb2xzIGluIGVpdGhlciBbRW5nbGlzaF0oaHR0cHM6Ly93d3cuZHJvcGJveC5jb20vcy8xMWt2NmN2bmJ2eDloYmUvaW5mb3JtYXRpb25fc2hhcmluZ19wcm90b2NvbF8yMjAzMjMucGRmP2RsPTApIG9yIFtNeWFubWFyXShodHRwczovL3d3dy5kcm9wYm94LmNvbS9zL2xxd3ZvN2s4MHMxeG5qai9TRSUyMHBhcnRuZXIlMjBkYXRhJTIwcHJvdGVjdGlvbl9maW5hbF8yMjAzMjMlMjB0cmFuc2xhdGlvbi5wZGY/ZGw9MCkuIA0KDQo8YnI+PGJyPjxicj4NCg0KIyMgMS4gR2VvZ3JhcGhpZXMNCg0KIyMjIDEuMSBTdGF0ZXdpc2UgYnJlYWtkb3ducw0KDQpBcyBpbiAyMDIxLCB0aGUgbnVtYmVyIG9mIGJlbmVmaWNpYXJpZXMgcmVhY2hlZCBoYXMgYmVlbiBoZWF2aWx5IGJpYXNlZCB0b3dhcmRzIHJlbGF0aXZlbHkgZmV3IGFyZWFzLCB3aGljaCBpcyBub3QgYXBwcm9wcmlhdGUgZm9yIGEgdW5pb253aWRlIHJlc3BvbnNlLiBBIHRvdGFsIG9mIGByIGRpc3RpbmN0KGZzYywgYWRtaW4zX3Bjb2RlKSAlPiUgbnJvdygpYCB0b3duc2hpcHMgaGF2ZSBiZWVuIHJlYWNoZWQgYWNyb3NzIGByIGRpc3RpbmN0KGZzYywgYWRtaW4xX3Bjb2RlKSAlPiUgbnJvdygpYCBzdGF0ZXMvcmVnaW9ucy4gDQoNCjxicj4gDQoNCg0KYGBge3IgYmFycGxvdC1zdGF0ZS1yZWdpb259DQoNCmZzYyAlPiUgDQogIGdyb3VwX2J5KHN0YXRlLCBhZG1pbjFfcGNvZGUpICU+JSANCiAgc3VtbWFyaXNlKGJlbmVmaWNpYXJpZXMgPSBzdW0obmV3X2JlbmVmaWNpYXJpZXMpLCAuZ3JvdXBzID0gImRyb3AiKSAlPiUgDQogIHVuZ3JvdXAoKSAlPiUgDQogIGxlZnRfam9pbihwaW4gJT4lIGdyb3VwX2J5KGFkbWluMV9wY29kZSkgJT4lIHN1bW1hcmlzZSh0YXJnZXQgPSBzdW0oZnNfdGFyZ2V0ZWQsIG5hLnJtID0gVFJVRSkpLA0KICAgICAgICAgICAgYnkgPSAiYWRtaW4xX3Bjb2RlIikgJT4lIA0KICBtdXRhdGUoc3RhdGUgPSBmY3RfcmVvcmRlcihzdGF0ZSwgLWJlbmVmaWNpYXJpZXMpLA0KICAgICAgICAgcGNfcmVhY2hlZCA9IGJlbmVmaWNpYXJpZXMgLyB0YXJnZXQpICU+JQ0KICBhcnJhbmdlKGRlc2MocGNfcmVhY2hlZCkpICU+JSANCiAgZ2dwbG90KGFlcyh4ID0gc3RhdGUsIHkgPSBiZW5lZmljaWFyaWVzLCBmaWxsID0gcGNfcmVhY2hlZCkpICsgDQogIGdlb21fY29sKCkgKw0KICBnZW9tX3RleHQoYWVzKGxhYmVsID0gY29tbWEoYmVuZWZpY2lhcmllcykpLCBzaXplID0gMywgdmp1c3QgPSAtMC41KSArDQogIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBjb21tYSkgKw0KICBzY2FsZV9maWxsX3ZpcmlkaXMobGFiZWxzID0gcGVyY2VudCwgZGlyZWN0aW9uID0gLTEsIG9wdGlvbiA9ICJtYWtvIikgKw0KICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDMwLCB2anVzdCA9IDAuNykpICsNCiAgbGFicyh4ID0gIiIsIHkgPSAiQmVuZWZpY2lhcmllcyIsIGZpbGwgPSAiJSBvZlxudGFyZ2V0IiwNCiAgICAgICB0aXRsZSA9ICJOdW1iZXIgb2YgYmVuZWZpY2lhcmllcyByZWFjaGVkIGJ5IHN0YXRlLCBGb29kIFNlY3VyaXR5IENsdXN0ZXIiLA0KICAgICAgIHN1YnRpdGxlID0gImFuZCBwZXJjZW50YWdlIG9mIHRhcmdldCByZWFjaGVkIikgDQoNCiMgZ2dzYXZlKCJieV9zdGF0ZV9xMV8yMDIyLnBuZyIsIGRwaSA9IDMwMCwgaGVpZ2h0ID0gNSwgd2lkdGggPSA4LCB1bml0cyA9ICJpbiIpICANCmBgYA0KDQoNCjxicj4NCg0KVGhlIHRhYmxlIGJlbG93IG91dGxpbmVzIHRoZSBudW1iZXIgb2YgYmVuZWZpY2lhcmllcyByZWFjaGVkIGJ5IHN0YXRlL3JlZ2lvbiBpbiBib3RoIDIwMjEgYW5kIDIwMjIvUTEuIEluIDIwMjEsIHRoZSByZXNwb25zZSB3YXMgaGVhdmlseSBza2V3ZWQgdG93YXJkcyBZYW5nb24gYW5kIFJha2hpbmUuIFRoZSBiaWFzIGlzIGV2ZW4gbW9yZSBwcm9ub3VuY2VkIGluIDIwMjIvUTEuIA0KDQpgciByb3VuZChmaWx0ZXIoZnNjLCBzdGF0ZSAlaW4lIGMoIllhbmdvbiIsICJSYWtoaW5lIikpICU+JSB7c3VtKC4kbmV3X2JlbmVmaWNpYXJpZXMsIG5hLnJtID0gVFJVRSl9IC8gc3VtKGZzYyRuZXdfYmVuZWZpY2lhcmllcywgbmEucm0gPSBUUlVFKSAqIDEwMCwgZGlnaXRzID0gMilgJSBvZiBiZW5lZmljaWFyaWVzIHJlYWNoZWQgaW4gdGhlIGZpcnN0IHF1YXJ0ZXIgb2YgMjAyMiBvcmlnaW5hdGVkIGZyb20gWWFuZ29uIG9yIFJha2hpbmUuIA0KDQo8YnI+DQoNCmBgYHtyIHRhYmxlLXN0YXRld2lzZS1jb21wYXJpc29uLTIxLTIyfQ0Kc3RhdGVfb3JkIDwtIGZzYyAlPiUgDQogIGdyb3VwX2J5KHN0YXRlLCBhZG1pbjFfcGNvZGUpICU+JSANCiAgc3VtbWFyaXNlKGJlbmVmaWNpYXJpZXMgPSBzdW0obmV3X2JlbmVmaWNpYXJpZXMsIG5hLnJtID0gVFJVRSkpICU+JQ0KICBsZWZ0X2pvaW4ocGluICU+JSANCiAgICAgICAgICAgICAgZ3JvdXBfYnkoYWRtaW4xX3Bjb2RlKSAlPiUgDQogICAgICAgICAgICAgIHN1bW1hcmlzZSh0YXJnZXQgPSBzdW0oZnNfdGFyZ2V0ZWQsIG5hLnJtID0gVFJVRSkpKSAlPiUgDQogIG11dGF0ZShwY19yZWFjaGVkID0gcm91bmQoYmVuZWZpY2lhcmllcyAvIHRhcmdldCAqIDEwMCwgZGlnaXRzID0gMikpICU+JSANCiAgYXJyYW5nZShkZXNjKGJlbmVmaWNpYXJpZXMpKSAlPiUgDQogIHJiaW5kKHRyaWJibGUofnN0YXRlLCB+YWRtaW4xX3Bjb2RlLCB+YmVuZWZpY2lhcmllcywNCiAgICAgICAgICAgICAgICAiQXlleWFyd2FkeSIsIE5BX2NoYXJhY3Rlcl8sIE5BX3JlYWxfLA0KICAgICAgICAgICAgICAgICJNYWd3YXkiLCBOQV9jaGFyYWN0ZXJfLCBOQV9yZWFsXywNCiAgICAgICAgICAgICAgICAiTWFuZGFsYXkiLCBOQV9jaGFyYWN0ZXJfLCBOQV9yZWFsXykpDQoNCnN0YXRlX29yZF8yMDIxIDwtIGZzY18yMDIxICU+JSANCiAgZmlsdGVyKHVuaXF1ZV9iZW5lZmljaWFyaWVzID09ICJZZXMiKSAlPiUgDQogIGdyb3VwX2J5KHN0YXRlLCBhZG1pbjFfcGNvZGUpICU+JSANCiAgbXV0YXRlKGFkbWluMV9wY29kZSA9IGlmZWxzZShzdGF0ZSA9PSAiVGFuaW50aGFyeWkiLCAiTU1SMDA2IiwgYWRtaW4xX3Bjb2RlKSkgJT4lDQogIHN1bW1hcmlzZShiZW5lZmljaWFyaWVzID0gc3VtKGJlbmVmaWNpYXJpZXMpKSAlPiUgDQogIGxlZnRfam9pbihmc2MgJT4lIA0KICAgICAgICAgICAgICBncm91cF9ieShhZG1pbjFfcGNvZGUpICU+JQ0KICAgICAgICAgICAgICBzdW1tYXJpc2UoYmVuZWZpY2lhcmllc18yMDIyID0gc3VtKG5ld19iZW5lZmljaWFyaWVzLCBuYS5ybSA9IFRSVUUpKSwNCiAgICAgICAgICAgIGJ5ID0gImFkbWluMV9wY29kZSIpICU+JSANCiAgYXJyYW5nZShkZXNjKGJlbmVmaWNpYXJpZXNfMjAyMikpICU+JSANCiAgZmlsdGVyKHN0YXRlICVvdXQlIGMoIkJhZ28gKFdlc3QpIiwgIk5heSBQeWkgVGF3IikpDQoNCmZzYyAlPiUgDQogIGdyb3VwX2J5KHN0YXRlLCBhZG1pbjFfcGNvZGUpICU+JSANCiAgc3VtbWFyaXNlKGJlbmVmaWNpYXJpZXMgPSBzdW0obmV3X2JlbmVmaWNpYXJpZXMpLCAuZ3JvdXBzID0gImRyb3AiKSAlPiUgDQogIHVuZ3JvdXAoKSAlPiUgDQogIHJpZ2h0X2pvaW4ocGluICU+JSBncm91cF9ieShzdGF0ZSwgYWRtaW4xX3Bjb2RlKSAlPiUgDQogICAgICAgICAgICAgICBzdW1tYXJpc2UodGFyZ2V0ID0gc3VtKGZzX3RhcmdldGVkLCBuYS5ybSA9IFRSVUUpLA0KICAgICAgICAgICAgICAgICAgICAgICAgIGJlbmVmaWNpYXJpZXNfMjAyMSA9IHN1bShiZW5lZmljaWFyaWVzXzIwMjEsIG5hLnJtID0gVFJVRSksIC5ncm91cHMgPSAiZHJvcCIpLA0KICAgICAgICAgICAgYnkgPSBjKCJhZG1pbjFfcGNvZGUiLCAic3RhdGUiKSkgJT4lIA0KICBtdXRhdGUoc3RhdGUgPSBmY3RfcmVvcmRlcihzdGF0ZSwgLWJlbmVmaWNpYXJpZXMpLA0KICAgICAgICAgcGNfcmVhY2hlZCA9IHJvdW5kKGJlbmVmaWNpYXJpZXMgLyB0YXJnZXQgKiAxMDAsIGRpZ2l0cyA9IDIpKSAlPiUgDQogIG11dGF0ZShwY18yMDIyID0gcm91bmQoYmVuZWZpY2lhcmllcyAvIHN1bShiZW5lZmljaWFyaWVzLCBuYS5ybSA9IFRSVUUpICogMTAwLCBkaWdpdHMgPSAyKSwgDQogICAgICAgICBwY18yMDIxID0gcm91bmQoYmVuZWZpY2lhcmllc18yMDIxIC8gc3VtKGJlbmVmaWNpYXJpZXNfMjAyMSwgbmEucm0gPSBUUlVFKSAqIDEwMCwgZGlnaXRzID0gMikpICU+JQ0KICBhcnJhbmdlKGRlc2MocGNfMjAyMikpICU+JSANCiAgZmlsdGVyKHN0YXRlICVvdXQlIGMoIkJhZ28gKFdlc3QpIiwgIk5heSBQeWkgVGF3IikpICU+JSANCiAgc2VsZWN0KFN0YXRlID0gc3RhdGUsIEJlbmVmaWNpYXJpZXNfMjAyMSA9IGJlbmVmaWNpYXJpZXNfMjAyMSwgYCVfYmVuXzIwMjFgID0gcGNfMjAyMSwgDQogICAgICAgICBCZW5lZmljaWFyaWVzXzIwMjIgPSBiZW5lZmljaWFyaWVzLCBgJV9iZW5fMjAyMmAgPSBwY18yMDIyLCBgJV90YXJnZXRfMjAyMmAgPSBwY19yZWFjaGVkKSAlPiUNCiAga2FibGUoY2FwdGlvbiA9ICJTa2V3IGluIFExIDIwMjIgZ2VvZ3JhcGhpYyByZWFjaCwgY29tcGFyaXNvbiB3aXRoIDIwMjEgZGF0YSIsIGZvcm1hdC5hcmdzID0gbGlzdChiaWcubWFyayA9ICIsIikpICU+JQ0KICBjb2x1bW5fc3BlYygzLCBjb2xvciA9ICJ3aGl0ZSIsIGJhY2tncm91bmQgPSBzcGVjX2NvbG9yKHN0YXRlX29yZF8yMDIxJGJlbmVmaWNpYXJpZXNbMToxNl0sIGVuZCA9IDAuOCwgZGlyZWN0aW9uID0gLTEpKSAlPiUNCiAgY29sdW1uX3NwZWMoNSwgY29sb3IgPSAid2hpdGUiLCBiYWNrZ3JvdW5kID0gc3BlY19jb2xvcihzdGF0ZV9vcmQkYmVuZWZpY2lhcmllc1sxOjE2XSwgZW5kID0gMC44LCBkaXJlY3Rpb24gPSAtMSkpICU+JQ0KICBjb2x1bW5fc3BlYyg2LCBjb2xvciA9ICJ3aGl0ZSIsIGJhY2tncm91bmQgPSBzcGVjX2NvbG9yKHN0YXRlX29yZCRwY19yZWFjaGVkWzE6MTZdLCBvcHRpb24gPSAibWFrbyIsIGVuZCA9IC44LCBkaXJlY3Rpb24gPSAtMSkpICU+JSANCiAga2FibGVfY2xhc3NpY18yKCJzdHJpcGVkIikNCiAgDQoNCiAgDQpgYGANCg0KDQo8YnI+PGJyPg0KDQojIyMgMS4yIFRvd25zaGlwLWxldmVsIGJyZWFrZG93bnMNCg0KYGBge3IgZGYtdHNwLW9yZH0NCnRzcF9vcmQgPC0gZnNjICU+JQ0KICBncm91cF9ieSh0b3duc2hpcCkgJT4lIA0KICBzdW1tYXJpc2UoYmVuZWZpY2lhcmllcyA9IHN1bShuZXdfYmVuZWZpY2lhcmllcywgbmEucm0gPSBUUlVFKSkgJT4lIA0KICBtdXRhdGUodG93bnNoaXAgPSBjYXNlX3doZW4oYmVuZWZpY2lhcmllcyA8PSAzMDIxNSB+ICI1NSBvdGhlciB0b3duc2hpcHMiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUgfiB0b3duc2hpcCkpICU+JSANCiAgZ3JvdXBfYnkodG93bnNoaXApICU+JSANCiAgc3VtbWFyaXNlX2FsbCguZnVucyA9IHN1bSkgJT4lIGFycmFuZ2UoZGVzYyhiZW5lZmljaWFyaWVzKSkNCg0KYGBgDQoNCg0KSnVzdCA4IHRvd25zaGlwcyAobGlzdGVkIGluIHRoZSB0YWJsZSBiZWxvdykgY29udGFpbmVkIGByIHJvdW5kKCgxIC0gdHNwX29yZCAlPiUgYWRvcm5fcGVyY2VudGFnZXMoImNvbCIpICU+JSBmaWx0ZXIodG93bnNoaXAgPT0gIjU1IG90aGVyIHRvd25zaGlwcyIpICU+JSBwdWxsKGJlbmVmaWNpYXJpZXMpKSAqIDEwMCwgZGlnaXRzID0gMilgJSBvZiBhbGwgYmVuZWZpY2lhcmllcy4gSW4gY29udHJhc3QsIGluIDIwMjEsIHRoZSB0b3AgMTAgdG93bnNoaXBzIGNvbnRhaW5lZCA3NiUgb2YgYWxsIGJlbmVmaWNpYXJpZXMuIEhsYWluZ3RoYXlyYSBFYXN0IGFuZCBXZXN0IGJ5IHRoZW1zZWx2ZXMgY29udGFpbmVkIDM2JSBvZiBhbGwgYmVuZWZpY2lhcmllcyByZWFjaGVkLiANCg0KDQoNCmBgYHtyIHRhYmxlLXRvcC10b3duc2hpcHN9DQoNCmZzYyAlPiUgIA0KICBncm91cF9ieShzdGF0ZSwgdG93bnNoaXAsIGh1bWFuaXRhcmlhbl9vcl9kZXZlbG9wbWVudCkgJT4lIA0KICBzdW1tYXJpc2UoYmVuZWZpY2lhcmllcyA9IHN1bShuZXdfYmVuZWZpY2lhcmllcywgbmEucm0gPSBUUlVFKSwgLmdyb3VwcyA9ICJkcm9wIikgJT4lIA0KICBtdXRhdGUoaHVtYW5pdGFyaWFuX29yX2RldmVsb3BtZW50ID0gc3RyX3RvX2xvd2VyKGh1bWFuaXRhcmlhbl9vcl9kZXZlbG9wbWVudCkpICU+JQ0KICBwaXZvdF93aWRlcihuYW1lc19mcm9tID0gaHVtYW5pdGFyaWFuX29yX2RldmVsb3BtZW50LCB2YWx1ZXNfZnJvbSA9IGJlbmVmaWNpYXJpZXMpICU+JSANCiAgcm93d2lzZSgpICU+JSANCiAgbXV0YXRlKGJlbmVmaWNpYXJpZXMgPSBzdW0oZGV2ZWxvcG1lbnQsIGh1bWFuaXRhcmlhbiwgbmEucm0gPSBUUlVFKSkgJT4lIA0KICBtdXRhdGUodG93bnNoaXAgPSBjYXNlX3doZW4oYmVuZWZpY2lhcmllcyA8PSAzMDIxNSB+ICI1NSBvdGhlciB0b3duc2hpcHMiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUgfiB0b3duc2hpcCksIA0KICAgICAgICAgc3RhdGUgPSBjYXNlX3doZW4oYmVuZWZpY2lhcmllcyA8PSAzMDIxNSB+IE5BX2NoYXJhY3Rlcl8sIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJVRSB+IHN0YXRlKSkgJT4lIA0KICBncm91cF9ieShzdGF0ZSwgdG93bnNoaXApICU+JSANCiAgc3VtbWFyaXNlKGJlbmVmaWNpYXJpZXMgPSBzdW0oYmVuZWZpY2lhcmllcywgbmEucm0gPSBUUlVFKSwNCiAgICAgICAgICAgIGh1bWFuaXRhcmlhbiA9IHN1bShodW1hbml0YXJpYW4sIG5hLnJtID0gVFJVRSksDQogICAgICAgICAgICBkZXZlbG9wbWVudCA9IHN1bShkZXZlbG9wbWVudCwgbmEucm0gPSBUUlVFKSwgLmdyb3VwcyA9ICJkcm9wIikgJT4lIA0KICBtdXRhdGUocGN0X29mX3RvdGFsID0gcm91bmQoYmVuZWZpY2lhcmllcyAvIHN1bShiZW5lZmljaWFyaWVzKSAqIDEwMCwgZGlnaXRzID0gMikpICU+JSANCiAgYXJyYW5nZShkZXNjKHBjdF9vZl90b3RhbCkpICU+JSANCiAgc2VsZWN0KFN0YXRlID0gc3RhdGUsIFRvd25zaGlwID0gdG93bnNoaXAsIEh1bWFuaXRhcmlhbiA9IGh1bWFuaXRhcmlhbiwgRGV2ZWxvcG1lbnQgPSBkZXZlbG9wbWVudCwNCiAgICAgICAgIEJlbmVmaWNpYXJpZXMgPSBiZW5lZmljaWFyaWVzLCBgJV9Ub3RhbGAgPSBwY3Rfb2ZfdG90YWwpICU+JSANCiAga2JsKGNhcHRpb24gPSAiVG9wIDcgdG93bnNoaXBzIGJ5IGJlbmVmaWNpYXJpZXMgcmVhY2hlZCAoZGVzYykgaW4gMjAyMi9RMSIsIGZvcm1hdC5hcmdzID0gbGlzdChiaWcubWFyayA9ICIsIikpICU+JSANCiAgY29sdW1uX3NwZWMoNiwgY29sb3IgPSAid2hpdGUiLCBiYWNrZ3JvdW5kID0gc3BlY19jb2xvcih0c3Bfb3JkJGJlbmVmaWNpYXJpZXNbMTo4XSwgZW5kID0gMC44LCBkaXJlY3Rpb24gPSAtMSkpICU+JQ0KICBrYWJsZV9jbGFzc2ljXzIobGlnaHRhYmxlX29wdGlvbnMgPSBjKCJzdHJpcGVkIikpICU+JSANCiAgZm9vdG5vdGUoIlRoZSA1NSBvdGhlciB0b3duc2hpcHMgYXJlIGVhY2ggbGVzcyB0aGFuIDEuNSUgb2YgdGhlIHRvdGFsIiwgDQogICAgICAgICAgIGdlbmVyYWxfdGl0bGUgPSAiIikNCiANCg0KYGBgDQoNCjxicj48YnI+DQoNCiMjIyAxLjMgTG9jYXRpb25zIA0KDQpBIGxvY2F0aW9uIHJlZmVycyB0byBlaXRoZXIgYW4gdmlsbGFnZSwgd2FyZCwgSURQIHNpdGUgb3IgaW5kdXN0cmlhbCB6b25lLiANCg0KVGhpcyBmaXJzdCBwbG90IGJlbG93IGlzIGEgaGlzdG9ncmFtIG9mIGxvY2F0aW9uLCBieSBudW1iZXIgb2YgYmVuZWZpY2lhcmllcy4gVGhlIHZhc3QgbWFqb3JpdHkgb2YgbG9jYXRpb25zIGhhdmUgb25seSBvbmUgYWN0aXZpdHkgb2NjdXJyaW5nIHdpdGhpbiB0aGVtLiBUaGlzIGlzIHNvbWV0aGluZyB0byBiZSBtb25pdG9yZWQgb3ZlciB0aGUgY291cnNlIG9mIHRoZSB5ZWFyLCBhcyBpdCBpcyBhc3N1bWVkIHRoYXQgYSByYW5nZSBvZiBhY3Rpdml0aWVzIGFyZSByZXF1aXJlZCB0byBjb21wcmVoZW5zaXZlbHkgbWVldCB0aGUgZm9vZCBzZWN1cml0eSBhbmQgbGl2ZWxpaG9vZHMgbmVlZHMgb2YgdGFyZ2V0ZWQgY29tbXVuaXRpZXMuIEFzIGl0IGN1cnJlbnRseSBzdGFuZHMsIHRoZSByZXNwb25zZSBpcyB2ZXJ5IGJyb2FkLCB3aXRoIGxpdHRsZSBkZXB0aC4gDQoNCjxicj4gDQoNCmBgYHtyIGZhY2V0LWxvY2F0aW9ucy1hY3Rpdml0aWVzfQ0KZnNjICU+JSANCiAgZmlsdGVyKCFpcy5uYShsb2NhdGlvbikpICU+JSANCiAgZ3JvdXBfYnkobG9jYXRpb24sIHRvd25zaGlwKSAlPiUgIA0KICBzdW1tYXJpc2UoYmVuZWZpY2lhcmllcyA9IHN1bShiZW5lZmljaWFyaWVzKSwgDQogICAgICAgICAgICBhY3Rpdml0aWVzID0gbl9kaXN0aW5jdChhY3Rpdml0eSwgLmdyb3VwcyA9ICJkcm9wIikpICU+JSANCiAgYXJyYW5nZShkZXNjKGFjdGl2aXRpZXMpKSAlPiUgDQogIGdncGxvdChhZXMoeCA9IGJlbmVmaWNpYXJpZXMpKSArDQogIGdlb21faGlzdG9ncmFtKGJpbndpZHRoID0gMC4xKSArDQogIHNjYWxlX3hfY29udGludW91cyhsYWJlbHMgPSBjb21tYSwgdHJhbnMgPSAibG9nMTAiKSArDQogIGZhY2V0X3dyYXAofiBhY3Rpdml0aWVzKSArDQogIGxhYnMoeSA9ICJudW1iZXIgb2YgbG9jYXRpb25zIiwNCiAgICAgICB4ID0gIkJlbmVmaWNpYXJ5IGZyZXF1ZW5jaWVzIHBlciBsb2NhdGlvbiIsIA0KICAgICAgIHRpdGxlID0gIkhpc3RvZ3JhbXMgb2YgbG9jYXRpb25zLCBmYWNldGVkIGJ5IG51bWJlciBvZiBhY3Rpdml0aWVzIiwNCiAgICAgICBzdWJ0aXRsZSA9ICJYLWF4aXMgc2hvd3MgbnVtYmVyIG9mIGJlbmVmaWNpYXJpZXMiKQ0KYGBgDQoNCjxicj4NCg0KVGhpcyBzZWNvbmQgcGxvdCBvZiBsb2NhdGlvbnMgaXMgZmFjZXRlZCBieSB0aGUgbnVtYmVyIG9mIHBhcnRuZXJzIC0tIHRoaXMgaGVscHMgdXMgY2hlY2sgZm9yIHBvdGVudGlhbCBvdmVybGFwcy4gVGhlcmUgYXJlIHF1aXRlIGEgbGFyZ2UgbnVtYmVyIG9mIGxvY2F0aW9ucyB3aXRoIDIgcGFydG5lcnMgaW4gdGhlbS4gTG9jYXRpb25zIHdpdGggbXVsdGlwbGUgcGFydG5lcnMgd2VyZSBmcm9tIFJha2hpbmUsIEthY2hpbiBhbmQgU2hhbiAoTm9ydGgpLiANCg0KPGJyPg0KDQpgYGB7ciBoaXN0b2dyYW0tbG9jYXRpb25zLWJ5LXBhcnRuZXJ9DQoNCmZzYyAlPiUgDQogIGZpbHRlcighaXMubmEobG9jYXRpb24pKSAlPiUgDQogIGdyb3VwX2J5KGxvY2F0aW9uLCB0b3duc2hpcCkgJT4lICANCiAgc3VtbWFyaXNlKGJlbmVmaWNpYXJpZXMgPSBzdW0oYmVuZWZpY2lhcmllcyksIA0KICAgICAgICAgICAgcGFydG5lcnMgPSBuX2Rpc3RpbmN0KG9yZ19jb2RlKSwgLmdyb3VwcyA9ICJkcm9wIikgJT4lIA0KICBhcnJhbmdlKGRlc2MocGFydG5lcnMpKSAlPiUgDQogIGdncGxvdChhZXMoeCA9IGJlbmVmaWNpYXJpZXMpKSArDQogIGdlb21faGlzdG9ncmFtKGJpbndpZHRoID0gMC4xKSArDQogIHNjYWxlX3hfY29udGludW91cyhsYWJlbHMgPSBjb21tYSwgdHJhbnMgPSAibG9nMTAiKSArDQogIGZhY2V0X3dyYXAofiBwYXJ0bmVycykgKw0KICBsYWJzKHkgPSAibnVtYmVyIG9mIGxvY2F0aW9ucyIsDQogICAgICAgeCA9ICJiZW5lZmljaWFyaWVzIHBlciBsb2NhdGlvbiIsIA0KICAgICAgIHRpdGxlID0gIkhpc3RvZ3JhbXMgb2YgbG9jYXRpb25zLCBmYWNldGVkIGJ5IG51bWJlciBvZiBwYXJ0bmVycyIsDQogICAgICAgc3VidGl0bGUgPSAiWC1heGlzIHNob3dzIG51bWJlciBvZiBiZW5lZmljaWFyaWVzIikNCg0KYGBgDQoNCjxicj4NCg0KVGhlIGdyZWF0ZXN0IG51bWJlciBvZiBiZW5lZmljaWFyaWVzIGNhbWUgZnJvbSB1cmJhbi9wZXJpLXVyYmFuIHdhcmRzIGFuZCB2aWxsYWdlcy4gVGhpcyBydW5zIGNvdW50ZXIgdG8gdnVsbmVyYWJpbGl0eSBwYXR0ZXJucyBpZGVudGlmaWVkIGJ5IGluIGJvdGggdGhlIElGUFJJIEhvdXNlaG9sZCBXZWxmYXJlIFN1cnZleSBhbmQgdGhlIEZBTy1XRlAgRm9vZCBTZWN1cml0eSBTdXJ2ZXkuIEJvdGggc3VydmV5cyBmb3VuZCB0aGF0IHJ1cmFsIGhvdXNlaG9sZHMgd2VyZSBsZXNzIGZvb2Qgc2VjdXJlIGFuZCBsZXNzIHJlc2lsaWVudCB0aGFuIHVyYmFuIG9uZXMuIA0KPGJyPg0KDQpgYGB7ciB0YWJsZS1jb250ZXh0LWJyZWFrZG93bn0NCmZzYyAlPiUgDQogIGZpbHRlcighaXMubmEobG9jYXRpb25fdHlwZSkpICU+JSANCiAgZ3JvdXBfYnkocnVyYWxfb3JfdXJiYW4sIGxvY2F0aW9uX3R5cGUpICU+JSANCiAgc3VtbWFyaXNlKGxvY2F0aW9ucyA9IG4oKSwgDQogICAgICAgICAgICBiZW5lZmljaWFyaWVzID0gc3VtKG5ld19iZW5lZmljaWFyaWVzKSwgLmdyb3VwcyA9ICJkcm9wIikgJT4lDQogIG11dGF0ZShgJV9vZl9iZW5gID0gcm91bmQoYmVuZWZpY2lhcmllcyAvIHN1bShiZW5lZmljaWFyaWVzKSAqIDEwMCwgZGlnaXRzID0gMiksDQogICAgICAgICBiZW5fcGVyX2xvY2F0aW9uID0gcm91bmQoYmVuZWZpY2lhcmllcyAvIGxvY2F0aW9ucykpICU+JSANCiAga2FibGUoY2FwdGlvbiA9ICJCcmVha2Rvd24gb2YgbG9jYXRpb25zIGFuZCBiZW5lZmljaWFyaWVzIGJ5IGNvbnRleHQiLCANCiAgICAgICAgZm9ybWF0LmFyZ3MgPSBsaXN0KGJpZy5tYXJrID0gIiwiKSkgJT4lIA0KICBrYWJsZV9jbGFzc2ljXzIoInN0cmlwZWQiKQ0KYGBgDQoNCjxicj48YnI+PGJyPg0KDQojIyAyLiBBY3Rpdml0aWVzDQoNCiMjIyAyLjEgUHJvZ3Jlc3MgYnkgYWN0aXZpdHkgDQoNClRoZSBmaXJzdCBncmV5IGxpbmUgYmVsb3cgc2hvd3MgdGhlIHRoZSBhcHByb3ZhbCBvZiB0aGUgSUVSUCBpbiBKdW5lIDIwMjEgYW5kIHRoZSBzZWNvbmQgcmVkIGxpbmUgc2hvd3MgdGhlIHN0YXJ0IG9mIDIwMjIuIA0KDQo8YnI+DQoNCmBgYHtyIHByb2dyZXNzLWZhY2V0LWxpbmVwbG90fQ0KZnNjICU+JSANCiAgZ3JvdXBfYnkoZGF0ZSwgYWN0aXZpdHlfcmVkKSAlPiUgDQogIHN1bW1hcmlzZShiZW5lZmljaWFyaWVzID0gc3VtKGJlbmVmaWNpYXJpZXMpKSAlPiUgDQogIHJiaW5kKGZzY18yMDIxICU+JSANCiAgICAgICAgICAjIGZpbHRlcih1bmlxdWVfYmVuZWZpY2lhcmllcyA9PSAiWWVzIikgJT4lDQogICAgICAgICAgZ3JvdXBfYnkoZGF0ZSwgYWN0aXZpdHlfcmVkKSAlPiUgDQogICAgICAgICAgc3VtbWFyaXNlKGJlbmVmaWNpYXJpZXMgPSBzdW0oYmVuZWZpY2lhcmllcykpKSAlPiUgDQogIGdyb3VwX2J5KGFjdGl2aXR5X3JlZCkgJT4lIA0KICBhcnJhbmdlKGRhdGUpICU+JSANCiAgbXV0YXRlKGN1bV9iZW4gPSBjdW1zdW0oYmVuZWZpY2lhcmllcykpICU+JSANCiAgYXJyYW5nZShhY3Rpdml0eV9yZWQpICU+JSANCiAgbXV0YXRlKGFjdGl2aXR5X3JlZCA9IHN0cl9yZXBsYWNlX2FsbChhY3Rpdml0eV9yZWQsICJwcm92aXNpb24gb2YgIiwgIiIpKSAlPiUNCiAgZ2dwbG90KGFlcyh4ID0gZGF0ZSwgeSA9IGN1bV9iZW4sIGNvbG91ciA9IGFjdGl2aXR5X3JlZCkpICsNCiAgZ2VvbV92bGluZShjb2xvdXIgPSAiYmxhY2siLCBsdHkgPSAyLCB4aW50ZXJjZXB0ID0gYXMubnVtZXJpYyhhcy5EYXRlKCIyMDIyLTAxLTAxIikpLCBhbHBoYSA9IDAuNSkgKw0KICBnZW9tX3ZsaW5lKGNvbG91ciA9ICJibGFjayIsIGx0eSA9IDIsIHhpbnRlcmNlcHQgPSBhcy5udW1lcmljKGFzLkRhdGUoIjIwMjEtMDYtMDEiKSksIGFscGhhID0gMC41KSArDQogIGdlb21fc3RlcChzaXplID0gMC42KSArDQogIHNjYWxlX3hfZGF0ZShkYXRlX2JyZWFrcyA9ICIxIG1vbnRoIiwgZGF0ZV9sYWJlbHMgPSAiJWIiKSArDQogIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBjb21tYSkgKw0KICBmYWNldF93cmFwKH4gYWN0aXZpdHlfcmVkLCBzY2FsZXMgPSAiZnJlZV95IikgKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIsDQogICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemUgPSA1LCBhbmdsZSA9IDYwKSwgDQogICAgICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemUgPSA1KSkgKyAjIHNlZSBpZiB0aGlzIHdvcmtzIHdoZW4geW91IGtuaXQsIHRoZW4gZG8gaXQgZm9yIHRoZSBvdGhlciBwbG90cyANCiAgbGFicyh4ID0gIk1vbnRoIiwgDQogICAgICAgeSA9ICJDdW11bGF0aXZlIGJlbmVmaWNpYXJ5IGZyZXF1ZW5jaWVzIiwgDQogICAgICAgdGl0bGUgPSAiTW9udGhseSBwcm9ncmVzcyBieSBhY3Rpdml0eSwgMjAyMS0yMDIyKFExKSIsDQogICAgICAgc3VidGl0bGUgPSAiRmlndXJlcyBhcmUgaW4gY3VtdWxhdGl2ZSBiZW5lZmljaWFyeSBmcmVxdWVuY2llcyByZWFjaGVkIikgKyANCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIpKSANCiAgDQoNCmBgYA0KDQo8YnI+DQoNCkNvbW11bml0eSBpbmZyYXN0cnVjdHVyZSBhbmQgZXF1aXBtZW50LCBmaXNoZXJ5IGtpdHMgYW5kIGtpdGNoZW4gZ2FyZGVuIGtpdHMgaGF2ZSBub3QgYmVlbiBpbXBsZW1lbnRlZCBpbiAyMDIyL1ExLiBJbmNvbWUtZ2VuZXJhdGluZyBhY3Rpdml0aWVzLCB3aGljaCB3ZXJlIGxhcmdlbHkgc3RhZ25hbnQgc2luY2UgdGhlIGFwcHJvdmFsIG9mIHRoZSBJRVJQLCBzdGFydGVkIHRvIGluY3JlYXNlIGFnYWluIGluIDIwMjIvUTEuIFRoaXMgbWlnaHQgYmUgZHVlIHRvIHRoZSBzZWFzb25hbGl0eSBvZiB0aGUgaW50ZXJ2ZW50aW9ucyB1bmRlciB0aGlzIGNhdGVnb3J5LiANCg0KRm9vZCBkaXN0cmlidXRpb25zIChpbi1raW5kIGFuZCBDQlQvQ1ZBKSBjb250aW51ZWQgdG8gYmUgdGhlIGxhcmdlc3QgYWN0aXZpdHkgZnJvbSAyMDIxIGludG8gMjAyMi9RMS4gTXVsdGktcHVycG9zZSBjYXNoIHRyYW5zZmVycyB3YXMgbmV3IGFjdGl2aXR5IHRoYXQgd2FzIG5vdCBwcmVzZW50IGluIDIwMjEuIA0KDQpJdCBzaG91bGQsIGhvd2V2ZXIsIGJlIG5vdGVkIHRoYXQgdGhlIGJlbmVmaWNpYXJpZXMgb2YgZm9vZCBkaXN0cmlidXRpb25zIGluIFlhbmdvbiB3ZXJlIHByb3ZpZGVkIHdpdGggNTBrZy9ob3VzZWhvbGQsIHR5cGljYWxseSBhIG9uZS1zaG90IGludGVydmVudGlvbi4gVGhlIHN1c3RhaW5hYmlsaXR5IG9mIHN1Y2ggaW50ZXJ2ZW50aW9ucyBzaG91bGQgYmUgcXVlc3Rpb25lZCwgYXMsIHVubGlrZSBTYWdhaW5nLCBNYWd3YXkgYW5kIG90aGVyIGNvbmZsaWN0LWFmZmVjdGVkIHN0YXRlcywgdGhlcmUgYXJlIG5vIGFjY2VzcyByZXN0cmljdGlvbnMgaW4gWWFuZ29uIHByZXZlbnRpbmcgdGhlIGltcGxlbWVudGF0aW9uIG9mIGxvbmdlci10ZXJtIGxpdmVsaWhvb2RzLWZvY3VzZWQgaW50ZXJ2ZW50aW9ucyB0aGF0IHdvdWxkIGFkZHJlc3MgdGhlIGNvcmUgY2F1c2VzIG9mIGZvb2QgaW5zZWN1cml0eS4gDQoNCjxicj48YnI+DQoNCiMjIyAyLjIgQWdyaWN1bHR1cmFsIGFuZCBsaXZlbGlob29kcyBhY3Rpdml0aWVzDQoNCkxlc3MgdGhhbiAyJSBvZiBhbGwgYmVuZWZpY2lhcnkgZnJlcXVlbmNpZXMgcGVydGFpbmVkIHRvIGFncmljdWx0dXJhbCBhY3Rpdml0aWVzLiBBcyBtZW50aW9uZWQgZWFybGllciwgdGhlIHZhc3QgbWFqb3JpdHkgb2YgYmVuZWZpY2lhcmllcyBpbiBRMSAyMDIyIHdlcmUgcmVsYXRlZCB0byBmb29kIGRpc3RyaWJ1dGlvbnMuIA0KDQo8YnI+DQoNCmBgYHtyIHRhYmxlLWFncmljdWx0dXJhbC1hY3Rpdml0eX0NCmZzYyAlPiUgDQogIG11dGF0ZShhZ3JpY3VsdHVyYWxfYWN0aXZpdHkgPSBpZmVsc2UoYWN0aXZpdHlfcmVkICVpbiUgYygiY3JvcCwgdmVnZXRhYmxlIGFuZCBzZWVkIGtpdHMiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGRlMgYW5kIGZhcm1lciB0cmFpbmluZyIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIklHQSBhbmQgc21hbGwgZ3JhbnRzIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibGl2ZXN0b2NrIGtpdHMiKSwgInllcyIsICJubyIpKSAlPiUgDQogIGdyb3VwX2J5KGFncmljdWx0dXJhbF9hY3Rpdml0eSkgJT4lIA0KICBzdW1tYXJpc2UoYmVuZWZpY2lhcmllcyA9IHN1bShiZW5lZmljaWFyaWVzKSwNCiAgICAgICAgICAgIHN0YXRlID0gbl9kaXN0aW5jdChhZG1pbjFfcGNvZGUpLCANCiAgICAgICAgICAgIHRvd25zaGlwcyA9IG5fZGlzdGluY3QoYWRtaW4zX3Bjb2RlKSwNCiAgICAgICAgICAgIHBhcnRuZXJzID0gbl9kaXN0aW5jdChvcmdfY29kZSkpICU+JSAgDQogIG11dGF0ZShgJV9iZW5lZmljaWFyaWVzYCA9IHJvdW5kKGJlbmVmaWNpYXJpZXMgLyBzdW0oYmVuZWZpY2lhcmllcykgKiAxMDAsIGRpZ2l0cyA9IDIpLCANCiAgICAgICAgIGFncmljdWx0dXJhbF9hY3Rpdml0eSA9IGZjdF9yZXYoYWdyaWN1bHR1cmFsX2FjdGl2aXR5KSkgJT4lIA0KICByZWxvY2F0ZShgJV9iZW5lZmljaWFyaWVzYCwgLmFmdGVyID0gYmVuZWZpY2lhcmllcykgJT4lIA0KICBrYWJsZShjYXB0aW9uID0gIkJlbmVmaWNpYXJ5IGZyZXF1ZW5jaWVzIHJlYWNoZWQgYnkgYWdyaWN1bHR1cmFsIGFuZCBub24tYWdyaWN1bHR1cmFsIGFjdGl2aXRpZXMiLCANCiAgICAgICAgZm9ybWF0LmFyZ3MgPSBsaXN0KGJpZy5tYXJrID0gIiwiKSkgJT4lIA0KICBrYWJsZV9jbGFzc2ljXzIoInN0cmlwZWQiKQ0KYGBgDQoNCjxicj4NCg0KQWx0aG91Z2ggY3JvcCwgdmVnZXRhYmxlIGFuZCBzZWVkIGtpdHMgZm9ybWVkIHRoZSBsYXJnZXN0IGdyb3VwIG9mIGFncmljdWx0dXJhbCBhY3Rpdml0aWVzLCBvbmx5IHJlYWNoZWQgYHIgZmlsdGVyKGZzYywgYWN0aXZpdHlfcmVkID09ICJjcm9wLCB2ZWdldGFibGUgYW5kIHNlZWQga2l0cyIpICU+JSB7c3VtKC4kaG91c2Vob2xkcyl9ICU+JSBmb3JtYXQoYmlnLm1hcmsgPSAiLCIpYCBob3VzZWhvbGRzIChmb3IgYSBmdWxsIGJyZWFrZG93biBieSBhZ3JpY3VsdHVyYWwgYWN0aXZpdHksIHBsZWFzZSByZWZlciB0byB0aGUgcGxvdCBiZWxvdykuIA0KDQpJdCB3aWxsIGJlIGltcG9ydGFudCB0byByZXZpZXcgdGhlIHJlc3VsdHMgZnJvbSB0aGUgc2Vjb25kIHF1YXJ0ZXIgaW4gb3JkZXIgdG8gc2VlIGlmIHRoaXMgcGF0dGVybiBjaGFuZ2VzIGFuZCBhZ3JpY3VsdHVyYWwgaG91c2Vob2xkIHJlY2VpdmUgc3VmZmljaWVudCBhc3Npc3RhbmNlIHByaW9yIHRvIHRoZSBtYWluIHJpY2UgcGxhbnRpbmcgc2Vhc29uIHdoaWNoIGJlZ2lucyBpbiBNYXkgMjAyMi4gU3RpbGwsIHRoZSByZXN1bHRzIGFyZSBub3QgZW5jb3VyYWdpbmcgYW5kIGFncmljdWx0dXJhbCBhY3Rpdml0aWVzIGhhdmUgaGFkIGEgdmVyeSBsaW1pdGVkIHJlYWNoLiANCg0KPGJyPiANCg0KYGBge3IgYmFycGxvdC1hZy1hY3Rpdml0aWVzfQ0KDQphZ19sYWJlbHMgPC0gZnNjICU+JSANCiAgbXV0YXRlKGFncmljdWx0dXJhbF9hY3Rpdml0eSA9IGlmZWxzZShhY3Rpdml0eV9yZWQgJWluJSBjKCJjcm9wLCB2ZWdldGFibGUgYW5kIHNlZWQga2l0cyIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZGUyBhbmQgZmFybWVyIHRyYWluaW5nIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSUdBIGFuZCBzbWFsbCBncmFudHMiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJsaXZlc3RvY2sga2l0cyIpLCAieWVzIiwgIm5vIikpICU+JSANCiAgZmlsdGVyKGFncmljdWx0dXJhbF9hY3Rpdml0eSA9PSAieWVzIikgJT4lICANCiAgZ3JvdXBfYnkoc3RhdGUpICU+JSANCiAgc3VtbWFyaXNlKGJlbmVmaWNpYXJpZXMgPSBzdW0oYmVuZWZpY2lhcmllcykpICU+JSANCiAgbXV0YXRlKHN0YXRlID0gcmVvcmRlcihzdGF0ZSwgYmVuZWZpY2lhcmllcykpICU+JSBhcnJhbmdlKGRlc2MoYmVuZWZpY2lhcmllcykpDQogIA0KZnNjICU+JSANCiAgbXV0YXRlKGFncmljdWx0dXJhbF9hY3Rpdml0eSA9IGlmZWxzZShhY3Rpdml0eV9yZWQgJWluJSBjKCJjcm9wLCB2ZWdldGFibGUgYW5kIHNlZWQga2l0cyIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZGUyBhbmQgZmFybWVyIHRyYWluaW5nIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSUdBIGFuZCBzbWFsbCBncmFudHMiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJsaXZlc3RvY2sga2l0cyIpLCAieWVzIiwgIm5vIikpICU+JSANCiAgZmlsdGVyKGFncmljdWx0dXJhbF9hY3Rpdml0eSA9PSAieWVzIikgJT4lICANCiAgZ3JvdXBfYnkoc3RhdGUsIGFjdGl2aXR5X3JlZCkgJT4lIA0KICBzdW1tYXJpc2UoYmVuZWZpY2lhcmllcyA9IHN1bShiZW5lZmljaWFyaWVzKSkgJT4lIA0KICBnZ3Bsb3QoYWVzKHggPSBmY3RfcmVsZXZlbChzdGF0ZSwgYygiS2FjaGluIiwgIk1vbiIsICJLYXlhaCIsICJDaGluIiwgIktheWluIiwgIlNoYW4gKFNvdXRoKSIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUmFraGluZSIsICJTaGFuIChOb3J0aCIpKSwgDQogICAgICAgICAgICAgeSA9IGJlbmVmaWNpYXJpZXMsIGZpbGwgPSBhY3Rpdml0eV9yZWQpKSArIA0KICBnZW9tX2NvbCgpICsgDQogIGdlb21fdGV4dChkYXRhID0gYWdfbGFiZWxzLCBhZXMobGFiZWwgPSBjb21tYShiZW5lZmljaWFyaWVzKSwgZmlsbCA9IE5VTEwpLCBzaXplID0gMywgdmp1c3QgPSAtLjMpICsgDQogIGxhYnMoeCA9ICIiLCB5ID0gIkJlbmVmaWNpYXJ5IGZyZXF1ZW5jaWVzIiwgZmlsbCA9ICIiLCANCiAgICAgICB0aXRsZSA9ICJCcmVha2Rvd24gb2YgYmVuZWZpY2lhcmllcyBvZiBhZ3JpY3VsdHVyYWwgYWN0aXZpdGllcyBpbiAyMDIyL1ExIikNCg0KYGBgDQoNCjxicj48YnI+DQoNCiMjIyAyLjMgRGVsaXZlcnkgbW9kYWxpdGllcw0KDQpUaGUgcGxvdHMgYmVsb3csIGZhY2V0ZWQgYnkgZGVsaXZlcnkgbW9kYWxpdHksIHNob3cgdGhlIGJyZWFrZG93biBvZiBhY3Rpdml0aWVzIGJ5IGRlbGl2ZXJ5IG1vZGFsaXR5LiBBbGwgYWN0aXZpdGllcyBiZXNpZGVzIGZvb2QgZGlzdHJpYnV0aW9uIGNvcnJlc3BvbmRlZCB0byBvbmx5IG9uZSB0eXBlIG9mIGRlbGl2ZXJ5IG1vZGFsaXR5LiAgDQoNCmBgYHtyIGZhY2V0LWRlbGl2ZXJ5LW1vZGFsaXRpZXN9DQpmc2MgJT4lIA0KICBmaWx0ZXIoIWlzLm5hKGRlbGl2ZXJ5X21vZGFsaXR5KSkgJT4lIA0KICBtdXRhdGUoZGVsaXZlcnlfbW9kYWxpdHkgPSBjYXNlX3doZW4oc3RyX2RldGVjdChkZWxpdmVyeV9tb2RhbGl0eSwgIkh5YnJpZCIpIH4gIkh5YnJpZCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyX2RldGVjdChkZWxpdmVyeV9tb2RhbGl0eSwgIlNlcnZpY2UiKSB+ICJTZXJ2aWNlIGRlbGl2ZXJ5IiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUlVFIH4gZGVsaXZlcnlfbW9kYWxpdHkpKSAlPiUgDQogIGdyb3VwX2J5KGFjdGl2aXR5X3JlZCwgZGVsaXZlcnlfbW9kYWxpdHkpICU+JSANCiAgc3VtbWFyaXNlKGJlbmVmaWNpYXJpZXMgPSBzdW0obmV3X2JlbmVmaWNpYXJpZXMpKSAlPiUgDQogIHBpdm90X3dpZGVyKG5hbWVzX2Zyb20gPSBkZWxpdmVyeV9tb2RhbGl0eSwgdmFsdWVzX2Zyb20gPSBiZW5lZmljaWFyaWVzKSAlPiUgDQogIGFkb3JuX3BlcmNlbnRhZ2VzKCJyb3ciKSAlPiUgDQogIGFkb3JuX3BjdF9mb3JtYXR0aW5nKCkgJT4lIA0KICBsZWZ0X2pvaW4oZnNjICU+JQ0KICAgICAgICAgIGZpbHRlcighaXMubmEoZGVsaXZlcnlfbW9kYWxpdHkpKSAlPiUNCiAgICAgICAgICBtdXRhdGUoZGVsaXZlcnlfbW9kYWxpdHkgPSBjYXNlX3doZW4oc3RyX2RldGVjdChkZWxpdmVyeV9tb2RhbGl0eSwgIkh5YnJpZCIpIH4gIkh5YnJpZCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyX2RldGVjdChkZWxpdmVyeV9tb2RhbGl0eSwgIlNlcnZpY2UiKSB+ICJTZXJ2aWNlIGRlbGl2ZXJ5IiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUlVFIH4gZGVsaXZlcnlfbW9kYWxpdHkpKSAlPiUNCiAgICAgICAgICBncm91cF9ieShhY3Rpdml0eV9yZWQpICU+JQ0KICAgICAgICAgIHN1bW1hcmlzZShCZW5lZmljaWFyaWVzID0gc3VtKG5ld19iZW5lZmljaWFyaWVzKSksIA0KICAgICAgICAgIGJ5ID0gImFjdGl2aXR5X3JlZCIpICU+JQ0KICBhcnJhbmdlKGRlc2MoQmVuZWZpY2lhcmllcykpJT4lIA0KICByZW5hbWUoQWN0aXZpdHkgPSBhY3Rpdml0eV9yZWQpICU+JSANCiAgbXV0YXRlX2F0KHZhcnMoYEluLWtpbmRgLCBgU2VydmljZSBkZWxpdmVyeWAsIGBDQlQvQ1ZBYCwgYEh5YnJpZGApLCB+cmVjb2RlKC4sICItIiA9IE5BX2NoYXJhY3Rlcl8pKSAlPiUgDQogIGthYmxlKGNhcHRpb24gPSAiUGVyY2VudGFnZSBvZiBiZW5lZmljaWFyaWVzIHJlYWNoZWQgYnkgYWN0aXZpdHkgYW5kIGRlbGl2ZXJ5IG1vZGFsaXR5IiwgZm9ybWF0LmFyZ3MgPSBsaXN0KGJpZy5tYXJrID0gIiwiKSkgJT4lIA0KICBrYWJsZV9jbGFzc2ljXzIoInN0cmlwZWQiKQ0KICANCg0KYGBgDQoNCjxicj4NCg0KVGhlcmUgYXJlIGFsc28gY2xlYXIgZGlmZmVyZW5jZXMgYmV0d2VlbiB0aGUgZGlmZmVyZW50IGxvY2F0aW9uIHR5cGVzIGFuZCB0aGUgZGVsaXZlcnkgbW9kYWxpdGllcyBlbXBsb3llZCB3aXRoIHRoZW0uIFJ1cmFsIGFyZWFzIHdlcmUgcHJlZG9taW5hdGVkIGJ5IGluLWtpbmQgZGlzdHJpYnV0aW9ucyB3aGlsc3QgY2FtcHMgYW5kIElEUCBzaXRlcyB3ZXJlIG1vc3RseSB0YXJnZXRlZCB3aXRoIGNhc2gtYmFzZWQgaW50ZXJ2ZW50aW9ucy4gDQoNCjxicj4NCg0KYGBge3IgZmFjZXQtbG9jYXRpb259DQoNCmZzYyAlPiUgIA0KICAgbXV0YXRlKGRlbGl2ZXJ5X21vZGFsaXR5ID0gY2FzZV93aGVuKHN0cl9kZXRlY3QoZGVsaXZlcnlfbW9kYWxpdHksICJIeWJyaWQiKSB+ICJIeWJyaWQiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cl9kZXRlY3QoZGVsaXZlcnlfbW9kYWxpdHksICJTZXJ2aWNlIikgfiAiU2VydmljZSBkZWxpdmVyeSIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJVRSB+IGRlbGl2ZXJ5X21vZGFsaXR5KSkgJT4lIA0KICBmaWx0ZXIoIWlzLm5hKGRlbGl2ZXJ5X21vZGFsaXR5KSAmICFpcy5uYShsb2NhdGlvbl90eXBlKSkgJT4lIA0KICBzdW1fYmVuMihkZWxpdmVyeV9tb2RhbGl0eSwgbG9jYXRpb25fdHlwZSkgJT4lIA0KICBnZ3Bsb3QoYWVzKHggPSBkZWxpdmVyeV9tb2RhbGl0eSwgeSA9IGJlbmVmaWNpYXJpZXMsIGZpbGwgPSBkZWxpdmVyeV9tb2RhbGl0eSkpICsNCiAgZ2VvbV9jb2woKSArIA0KICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gY29tbWEpICsgDQogIGZhY2V0X3dyYXAofmxvY2F0aW9uX3R5cGUsIHNjYWxlcyA9ICJmcmVlIikgKyANCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSAyNSwgdmp1c3QgPSAuNywgaGp1c3QgPSAuNSkpICsNCiAgbGFicyh4ID0gIkRlbGl2ZXJ5IG1vZGFsaXR5IiwgeSA9ICJCZW5lZmljaWFyaWVzIiwNCiAgICAgICB0aXRsZSA9ICJEZWxpdmVyeSBtb2RhbGl0aWVzIGJ5IGxvY2F0aW9uIHR5cGUiKQ0KICANCg0KYGBgDQoNCjxicj4NCg0KVGhpcyB3b3VsZCBwZXJoYXBzIGltcGx5IHRoYXQgcGFydG5lcnMgYmVsaWV2ZSB0aGF0IG1hcmtldHMgd2VyZSBtb3JlIGFjY2Vzc2libGUgZnJvbSBjYW1wcyBhbmQgSURQIHNpdGVzIHRoYW4gcnVyYWwgYXJlYXM7IHRoaXMgaXMgY2VydGFpbmx5IGEgcG9zc2liaWxpdHkgZm9yIHRoZSBsb25nZXItc3RhbmRpbmcgYW5kIG1vcmUgZGV2ZWxvcGVkIGNhbXBzLiBPdGhlciBhbHRlcm5hdGl2ZSBhc3N1bXB0aW9ucyBpbmNsdWRlIGRvbm9yIHByZWZlcmVuY2VzIGFuZCBsb2dpc3RpY2FsIGNoYWxsZW5nZXMgaW4gYnJpbmdpbmcgaW4ta2luZCBnb29kcyB0byBjYW1wcyBhbmQgSURQIHNpdGVzLiBUaGlzIHJlbWFpbnMgYSBxdWVzdGlvbiB0byBiZSBleHBsb3JlZCBieSB0aGUgYnJvYWRlciBGb29kIFNlY3VyaXR5IENsdXN0ZXIuIA0KDQpCZWxvdyBpcyBhIGJyZWFrZG93biBvZiBwZXJjZW50YWdlIG9mIGJlbmVmaWNpYXJpZXMgcmVhY2hlZCBieSB0aGUgZGlmZmVyZW50IGRlbGl2ZXJ5IG1vZGFsaXRpZXMsIGJ5IHN0YXRlLiANCg0KPGJyPg0KDQoNCmBgYHtyIGRlbGl2ZXJ5LW1vZGFsaXRpZXMtc3RhY2tlZC1iYXJ9DQpzdGF0ZV90b3RhbHMgPC0gZnNjICU+JSANCiAgZmlsdGVyKCFpcy5uYShkZWxpdmVyeV9tb2RhbGl0eSkpICU+JSANCiAgZ3JvdXBfYnkoc3RhdGUpICU+JSANCiAgc3VtbWFyaXNlKHRvdGFsID0gc3VtKG5ld19iZW5lZmljaWFyaWVzKSkgJT4lIA0KICBtdXRhdGUocGMgPSAxLCANCiAgICAgICAgIHN0YXRlID0gZmN0X3Jlb3JkZXIoc3RhdGUsIHRvdGFsKSkNCg0KZnNjICU+JSAgDQogIGZpbHRlcighaXMubmEoZGVsaXZlcnlfbW9kYWxpdHkpKSAlPiUgIA0KICAgbXV0YXRlKGRlbGl2ZXJ5X21vZGFsaXR5ID0gY2FzZV93aGVuKHN0cl9kZXRlY3QoZGVsaXZlcnlfbW9kYWxpdHksICJIeWJyaWQiKSB+ICJIeWJyaWQiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cl9kZXRlY3QoZGVsaXZlcnlfbW9kYWxpdHksICJTZXJ2aWNlIikgfiAiU2VydmljZSBkZWxpdmVyeSIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJVRSB+IGRlbGl2ZXJ5X21vZGFsaXR5KSkgJT4lDQogIGdyb3VwX2J5KHN0YXRlLCBkZWxpdmVyeV9tb2RhbGl0eSkgJT4lIA0KICBzdW1tYXJpc2UoYmVuZWZpY2lhcmllcyA9IHN1bShiZW5lZmljaWFyaWVzKSkgJT4lIA0KICBncm91cF9ieShzdGF0ZSkgJT4lIA0KICBtdXRhdGUocGMgPSBiZW5lZmljaWFyaWVzIC8gc3VtKGJlbmVmaWNpYXJpZXMpLA0KICAgICAgICAgc3RhdGUgPSBmY3RfcmVvcmRlcihzdGF0ZSwgYmVuZWZpY2lhcmllcykpICU+JSANCiAgZ2dwbG90KGFlcyh4ID0gcGMsIHkgPSBmY3RfcmV2KHN0YXRlKSwgZmlsbCA9IGRlbGl2ZXJ5X21vZGFsaXR5KSkgKyANCiAgZ2VvbV9jb2woKSArDQogIHNjYWxlX3hfY29udGludW91cyhsYWJlbHMgPSBwZXJjZW50LCBicmVha3MgPSBzZXEoMCwgMSwgYnkgPSAuMikpICsgDQogIGdlb21fdGV4dChhZXMoeSA9IHN0YXRlLCB4ID0gcGMgKyAwLjEyNSwgbGFiZWwgPSBjb21tYSh0b3RhbCwgYWNjdXJhY3kgPSAxKSwgZmlsbCA9IE5VTEwpLCANCiAgICAgICAgICAgIGRhdGEgPSBzdGF0ZV90b3RhbHMsIGhqdXN0ID0gImlud2FyZCIsIHNpemUgPSAyLjUpICsNCiAgbGFicyh4ID0gIiUgb2YgdG90YWwiLCB5ID0gIiIsIGZpbGwgPSAiIiwgDQogICAgICAgdGl0bGUgPSAiUGVyY2VudGFnZSBvZiBiZW5lZmljaWFyaWVzIHJlYWNoZWQgYnkgZGVsaXZlcnkgbW9kYWxpdGllcyIsIA0KICAgICAgIHN1YnRpdGxlID0gIlN0YXRlIGJlbmVmaWNpYXJ5IHRvdGFscyBhdCB0aGUgZW5kIG9mIGVhY2ggYmFyIikNCg0KYGBgDQoNCg0KPGJyPjxicj48YnI+DQoNCiMjIDMuIENhc2gtYmFzZWQgcHJvZ3JhbW1pbmcNCg0KIyMjIDMuMSBDYXNoIHRyYW5zZmVyIHZhbHVlcyBwZXIgaG91c2Vob2xkDQoNCmBgYHtyIHVzZC1oaGQtYmluLWJhcnBsb3QsIGZpZy5oZWlnaHQ9Nn0NCg0KZnNjICU+JQ0KICBmaWx0ZXIoIWlzLm5hKHVzZF9wZXJfaGhkKSAmICFpcy5uYShuZXdfYmVuZWZpY2lhcmllcykpICU+JSANCiAgZmlsdGVyKGRlbGl2ZXJ5X21vZGFsaXR5ICVpbiUgYygiQ0JUL0NWQSIsICJIeWJyaWQgKEluLWtpbmQgJiBDQlQvQ1ZBKSIpKSAlPiUNCiAgZ3JvdXBfYnkodXNkX2hoZF9iaW4pICU+JSANCiAgc3VtbWFyaXNlKGhvdXNlaG9sZHMgPSBzdW0oaG91c2Vob2xkcykpICU+JSANCiAgbXV0YXRlKGAlX29mX2hoZGAgPSByb3VuZChob3VzZWhvbGRzIC8gc3VtKGhvdXNlaG9sZHMpICogMTAwLCBkaWdpdHMgPSAyKSkgJT4lIA0KICBnZ3Bsb3QoYWVzKHggPSB1c2RfaGhkX2JpbiwgeSA9IGhvdXNlaG9sZHMsIGZpbGwgPSB1c2RfaGhkX2JpbikpICsgDQogIGdlb21fY29sKCkgKyANCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IGAlX29mX2hoZGApLCB2anVzdCA9IC0wLjQsIHNpemUgPSAzKSArIA0KICBzY2FsZV9maWxsX3ZpcmlkaXNfZChvcHRpb24gPSAibWFrbyIsIGRpcmVjdGlvbiA9IC0xKSArIA0KICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gY29tbWEsIGJyZWFrcyA9IHNlcSgwLCA4MDAwMCwgYnkgPSAxMDAwMCkpICsgDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwgDQogICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gMzAsIGhqdXN0ID0gMC44LCB2anVzdCA9IDAuOSkpICsNCiAgbGFicyh4ID0gIlVTRCB2YWx1ZSBvZiBjYXNoIHRyYW5zZmVyIHBlciBob3VzZWhvbGQgcGVyIG1vbnRoIiwNCiAgICAgICB5ID0gIk51bWJlciBvZiBob3VzZWhvbGRzIiwNCiAgICAgICB0aXRsZSA9ICJOdW1iZXIgb2YgaG91c2Vob2xkcyBieSB2YWx1ZSBvZiBjYXNoIHRyYW5zZmVyIHBlciBob3VzZWhvbGQgKDIwMjIvUTEpIiwNCiAgICAgICBzdWJ0aXRsZSA9ICJGaWd1cmVzIGF0IHRoZSB0b3Agb2YgZWFjaCBiYXIgc2hvdyBwZXJjZW50YWdlIG9mIGhvdXNlaG9sZHNcbk9ubHkgaG91c2Vob2xkcyByZWFjaGVkIHRocm91Z2ggdGhlIGNhc2gsIGh5YnJpZCBvciB2b3VjaGVyIG1vZGFsaXRpZXMgYXJlIGluY2x1ZGVkIikNCiAgDQoNCmBgYA0KDQoNCg0KPGJyPg0KDQo0NiUgb2YgaG91c2Vob2xkcyByZWNlaXZlZCBsZXNzIHRoYW4gVVNEIDQwL21vbnRoIHBlciB0cmFuc2Zlci4gSG93ZXZlciwgdGhlIG1vc3QgY29tbW9uIHRyYW5zZmVyIHZhbHVlcyB3ZXJlIGJldHdlZW4gVVNEIDQwL21vbnRoIGFuZCBVU0QgNzAvbW9udGgsIHdpdGggNDclIG9mIGhvdXNlaG9sZHMgcmVjZWl2aW5nIHRyYW5zZmVycyBpbiB0aGlzIHJhbmdlLiBUaGlzIGFsaWducyBmYWlybHkgd2VsbCB3aXRoIDUwJSBvZiB0aGUgTWluaW11bSBFeHBlbmRpdHVyZSBCYXNrZXQgZm9yIGZvb2QgZXhwZW5kaXR1cmVzIChVU0QgNTIuMjgvaG91c2Vob2xkL21vbnRoKS4gSXQgc2hvdWxkIGJlIG5vdGVkLCBob3dldmVyIHRoYXQgdGhlIHZhbHVlIG9mIHRoZSBNaW5pbXVtIEV4cGVuZGl0dXJlIEJhc2tldCAoY2FsY3VsYXRlZCBmb3IgMjAyMSkgbmVlZHMgdG8gYmUgcmV2aXNlZCBhcyB0aGUgRm9vZCBTZWN1cml0eSBDbHVzdGVyIGFudGljaXBhdGVzIDQwJSBpbmZsYXRpb24gaW4gMjAyMi4gDQoNClRoZSB0YWJsZSBiZWxvdyBzaG93cyB0aGUgYXZlcmFnZSBVU0QgdmFsdWVzIHBlciB0cmFuc2ZlciBwZXIgaG91c2Vob2xkIGJ5IGFuZCB0b3RhbCB0cmFuc2ZlciB2YWx1ZXMgcGVyIGFjdGl2aXR5IGluIHRoZSBmaXJzdCBxdWFydGVyIG9mIDIwMjIuDQoNCmBgYHtyIHRhYmxlLXVzZC12YWx1ZXMtYWN0aXZpdHl9DQphdmdfdHJhbnNmZXJfdmFsdWUgPC0gZnNjICU+JQ0KICBmaWx0ZXIoZGVsaXZlcnlfbW9kYWxpdHkgJWluJSBjKCJDQlQvQ1ZBIiwgIkh5YnJpZCAoSW4ta2luZCAmIENCVC9DVkEpIikpICU+JQ0KICBncm91cF9ieShhY3Rpdml0eV9yZWQpICU+JSANCiAgc3VtbWFyaXNlKGhoZF9mcmVxdWVuY2llcyA9IHJvdW5kKHN1bShob3VzZWhvbGRzLCBuYS5ybSA9IFRSVUUpKSwNCiAgICAgICAgICAgIHRvdGFsX3ZhbHVlX3VzZCA9IHJvdW5kKHN1bSh0b3RhbF92YWx1ZV91c2QsIG5hLnJtID0gVFJVRSkpKSAlPiUgDQogIG11dGF0ZShhdmdfdHJhbnNmZXJfdmFsdWUgPSByb3VuZCh0b3RhbF92YWx1ZV91c2QgLyBoaGRfZnJlcXVlbmNpZXMsIGRpZ2l0cyA9IDIpKSAlPiUgDQogIHJlbmFtZShhY3Rpdml0eSA9IGFjdGl2aXR5X3JlZCkgJT4lIA0KICBhcnJhbmdlKGRlc2MoYXZnX3RyYW5zZmVyX3ZhbHVlKSkgDQoNCmF2Z190cmFuc2Zlcl92YWx1ZSAlPiUgIA0KICBrYWJsZShjYXB0aW9uID0gIkF2ZXJhZ2UgdmFsdWUgKFVTRCkgb2YgaG91c2Vob2xkIHBhY2thZ2UgdmFsdWVzIHBlciBhY3Rpdml0eSIsIA0KICAgICAgICBmb3JtYXQuYXJncyA9IGxpc3QoYmlnLm1hcmsgPSAiLCIpKSAlPiUgDQogIGthYmxlX2NsYXNzaWNfMihsaWdodGFibGVfb3B0aW9ucyA9ICJzdHJpcGVkIikgJT4lIA0KICBjb2x1bW5fc3BlYyg0LCBjb2xvciA9ICJ3aGl0ZSIsIGJhY2tncm91bmQgPSBzcGVjX2NvbG9yKGF2Z190cmFuc2Zlcl92YWx1ZSRhdmdfdHJhbnNmZXJfdmFsdWVbMTo3XSwgZW5kID0gMC44LCBkaXJlY3Rpb24gPSAtMSkpICU+JQ0KICBmb290bm90ZShnZW5lcmFsID0gIk9ubHkgaG91c2Vob2xkcyB3aGljaCB3ZXJlIHJlYWNoZWQgYnkgY2FzaCwgaHlicmlkIG9yIHZvdWNoZXIgbW9kYWxpdGllcyBhcmUgaW5jbHVkZWQiLCANCiAgICAgICAgICAgZ2VuZXJhbF90aXRsZSA9ICIiKQ0KIyBwYW5kZXIoY2FwdGlvbiA9ICJBdmVyYWdlIHZhbHVlIChVU0QpIG9mIGhvdXNlaG9sZCBwYWNrYWdlIHZhbHVlcyBwZXIgYWN0aXZpdHkiKQ0KDQpgYGANCg0KPGJyPjxicj4NCg0KIyMjIDMuMiBDYXNoIHRyYW5zZmVyIHZhbHVlcyBieSBpbXBsZW1lbnRpbmcgcGFydG5lcg0KDQpUaGUgcGxvdHMgYmVsb3cgc2hvdyBhdmVyYWdlIGNhc2ggdHJhbnNmZXIgdmFsdWVzIGJ5IGFjdGl2aXR5IG9mIHRoZSBwYXJ0bmVycyB3aG8gcmVhY2hlZCB0aGUgbW9zdCBiZW5lZmljaWFyaWVzLiAgDQoNClRoZSB4LWF4aXMgc2hvd3MgdGhlIGF2ZXJhZ2UgdmFsdWUgcGVyIHBlcnNvbiBvciBwZXIgaG91c2Vob2xkLCBkZXBlbmRpbmcgb24gdGhlIGFjdGl2aXR5IGFuZCB0aGUgY29sb3VyIGluZGljYXRlcyB0aGUgbnVtYmVyIG9mIGJlbmVmaWNpYXJpZXMgcmVhY2hlZC4gDQoNCjxicj4NCg0KYGBge3IgcGFydG5lci1jYXNoLXZhbHVlcywgZmlnLmhlaWdodD02LjV9DQpwYXJ0bmVyX21lYW5fdXNkIDwtIGZ1bmN0aW9uKHRibCwgbmFtZSl7DQoNCiAgdGJsICU+JSANCiAgICBmaWx0ZXIoIWlzLm5hKG5ld19iZW5lZmljaWFyaWVzKSAmICFpcy5uYSh1c2RfcGVyX2hoZCkpICU+JQ0KICAgIGZpbHRlcihkZWxpdmVyeV9tb2RhbGl0eSAlaW4lIGMoIkNCVC9DVkEiLCAiSHlicmlkIChJbi1raW5kICYgQ0JUL0NWQSkiKSkgJT4lDQogICAgZmlsdGVyKGFjdGl2aXR5X3JlZCA9PSB7e25hbWV9fSkgJT4lDQogICAgbXV0YXRlKGhvdXNlaG9sZHMgPSBpZmVsc2UoYWN0aXZpdHlfcmVkID09ICJmb29kIGRpc3RyaWJ1dGlvbiIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVuZWZpY2lhcmllcywgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBob3VzZWhvbGRzKSkgJT4lIA0KICAgIGdyb3VwX2J5KG9yZ19jb2RlKSAlPiUgDQogICAgc3VtbWFyaXNlKHRvdGFsX3ZhbHVlX3VzZCA9IHN1bSh0b3RhbF92YWx1ZV91c2QpLA0KICAgICAgICAgICAgICBiZW5lZmljaWFyaWVzID0gc3VtKG5ld19iZW5lZmljaWFyaWVzKSwgDQogICAgICAgICAgICAgIGhvdXNlaG9sZHMgPSBzdW0oaG91c2Vob2xkcykpICU+JSANCiAgICBtdXRhdGUobWVhbl91c2QgPSB0b3RhbF92YWx1ZV91c2QgLyBob3VzZWhvbGRzKSAlPiUgDQogICAgYXJyYW5nZShkZXNjKGJlbmVmaWNpYXJpZXMpKSAlPiUgIA0KICAgIHRvcF9uKDcpICU+JSANCiAgICBtdXRhdGUob3JnX2NvZGUgPSBmY3RfcmVvcmRlcihvcmdfY29kZSwgYmVuZWZpY2lhcmllcykpICU+JSANCiAgICBnZ3Bsb3QoYWVzKHggPSBtZWFuX3VzZCwgeSA9IG9yZ19jb2RlLCBmaWxsID0gYmVuZWZpY2lhcmllcykpICsgDQogICAgc2NhbGVfeF9jb250aW51b3VzKGxhYmVscyA9IGNvbW1hX2Zvcm1hdChhY2N1cmFjeSA9IDEpKSArIA0KICAgIHNjYWxlX2ZpbGxfdmlyaWRpcyhvcHRpb24gPSAibWFrbyIsIGRpcmVjdGlvbiA9IC0xLCBiZWdpbiA9IDAuMiwgDQogICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IG51bWJlcl9mb3JtYXQoc2NhbGUgPSAxIC8gMTAwMCwgc3VmZml4ID0gIksiLCBhY2N1cmFjeSA9IDEpKSArDQogICAgZ2VvbV9jb2woKSArDQogICAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IGRvbGxhcihtZWFuX3VzZCkpLCBzaXplID0gMiwgaGp1c3QgPSAiaW53YXJkIikgKyANCiAgICB0aGVtZShheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplID0gOCkpICsNCiAgbGFicyh4ID0gIkF2ZXJhZ2UgVVNEIHZhbHVlIG9mIHBhY2thZ2UgcGVyIHRyYW5zZmVyIiwgDQogICAgICAgeSA9ICIiKSArDQogICAgdGhlbWUobGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSA0KSwNCiAgICAgICAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gNC41KSwgDQogICAgICAgICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTApLA0KICAgICAgICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChzaXplID0gOCkpDQp9DQoNCmZzYyAlPiUgcGFydG5lcl9tZWFuX3VzZCgiZm9vZCBkaXN0cmlidXRpb24iKSArDQogIGxhYnModGl0bGUgPSAiRm9vZCBkaXN0cmlidXRpb25zIChwZXIgcGVyc29uKSIpICsNCmZzYyAlPiUgcGFydG5lcl9tZWFuX3VzZCgiZm9vZF9jYXNoIGZvciB3b3JrX2Fzc2V0cyIpICsgDQogIGxhYnModGl0bGUgPSAiRm9vZC9jYXNoIGZvciB3b3JrL2Fzc2V0cyAocGVyIGhoZCkiKSArIA0KZnNjICU+JSBwYXJ0bmVyX21lYW5fdXNkKCJtdWx0aS1wdXJwb3NlIGNhc2ggdHJhbnNmZXIiKSArDQogIGxhYnModGl0bGUgPSAiTXVsdGktcHVycG9zZSBjYXNoIHRyYW5zZmVyIChwZXIgaGhkKSIpICsgDQpmc2MgJT4lIHBhcnRuZXJfbWVhbl91c2QoIklHQSBhbmQgc21hbGwgZ3JhbnRzIikgKw0KICBsYWJzKHRpdGxlID0gIklHQSBhbmQgc21hbGwgZ3JhbnRzIChwZXIgaGhkKSIpICsgDQogIHBsb3RfYW5ub3RhdGlvbih0aXRsZSA9ICJDYXNoIHRyYW5zZmVyIHZhbHVlcyBvZiB0aGUgdG9wIGltcGxlbWVudGluZyBwYXJ0bmVycyAoYnkgYmVuZWZpY2lhcmllcyByZWFjaGVkKSIsIA0KICAgICAgICAgICAgICAgICAgc3VidGl0bGUgPSAiRmFjZXRlZCBieSBhY3Rpdml0eSIpDQoNCmdnc2F2ZSgiY2FzaF9mYWNldF9wYXJ0bmVyLnBuZyIsIGRwaSA9IDMwMCwgaGVpZ2h0ID0gNSwgd2lkdGggPSA4LCB1bml0cyA9ICJpbiIpICAgIA0KYGBgDQoNCjxicj4NCg0KIyMjIDMuMyBDYXNoIHRyYW5zZmVyIHZhbHVlcyBwZXIgcGVyc29uDQoNClRoZSBib3hwbG90cyBhYm92ZSBzaG93cyB0aGUgcmFuZ2Ugb2YgY2FzaCB0cmFuc2ZlciB2YWx1ZXMgKGFsbCB2YWx1ZXMgYXJlIHBlciBwZXJzb24sIHRvIGZhY2lsaXRhdGUgY29tcGFyYWJpbGl0eSkgYnkgYWN0aXZpdHkuIFRoZSBhdmVyYWdlIGZvciByZWFjaCBhY3Rpdml0eSBpcyBtYXJrZWQgYnkgdGhlIHRoaWNrIGxpbmUgaW4gdGhlIG1pZGRsZSBvZiBlYWNoIGJveC4gVGhlIGxlZnRtb3N0IGFuZCByaWdodG1vc3Qgc2lkZSBvZiBlYWNoIGJveCBpbmRpY2F0ZSB0aGUgMjV0aCBhbmQgNzV0aCBwZXJjZW50aWxlIG9mIHRyYW5zZmVyIHZhbHVlcywgcmVzcGVjdGl2ZWx5LiBUaGUgbGVuZ3RoIG9mIGVhY2ggYm94IGlzIGEgZ2F1Z2UgZm9yIGhvdyBtdWNoIHZhcmlhdGlvbiB0aGVyZSBpcyBpbiB0aGUgdHJhbnNmZXIgdmFsdWVzIG9mIGVhY2ggYWN0aXZpdHkuIA0KDQo8YnI+DQoNCmBgYHtyIGJveHBsb3QtYWN0aXZpdHktdXNkLXBlci1wZXJzb259DQoNCmZzYyAlPiUgZmlsdGVyKCFpcy5uYSh0b3RhbF92YWx1ZV91c2QpICYgYWN0aXZpdHlfcmVkICE9ICJsaXZlc3RvY2sga2l0cyIpICU+JQ0KICBnZ3Bsb3QoYWVzKHkgPSBhY3Rpdml0eV9yZWQsIHggPSB1c2RfcGVyX3BlcnNvbiwgY29sb3VyID0gYWN0aXZpdHlfcmVkKSkgKyANCiAgZ2VvbV9qaXR0ZXIoYWxwaGEgPSAuMSwgYWVzKHNpemUgPSBiZW5lZmljaWFyaWVzKSkgKw0KICBnZW9tX2JveHBsb3QoYWxwaGEgPSAuOCkgKyANCiAgc2NhbGVfeF9jb250aW51b3VzKHRyYW5zID0gImxvZzEwIiwgYnJlYWtzID0gYygwLCAxLCAzLCAxMCwgMzAsIDEwMCwgMzAwKSwgDQogICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBkb2xsYXJfZm9ybWF0KGFjY3VyYWN5ID0gMSkpICsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSArDQogIGxhYnMoeCA9ICJVU0QgcGVyIHBlcnNvbiIsIHkgPSAiIiwgDQogICAgICAgdGl0bGUgPSAiQm94cGxvdHMgb2YgVVNEIHRyYW5zZmVyIHZhbHVlcyBwZXIgcGVyc29uIGluIDIwMjIvUTEiLCANCiAgICAgICBzdWJ0aXRsZSA9ICJUaGljayBsaW5lIGluIGVhY2ggYm94IGlzIHRoZSBtZWFuO1xuIFBvaW50cyBhcmUgaW5kaXZpZHVhbCBkaXN0cmlidXRpb25zLCBzaXplcyBvZiBwb2ludHMgcmVmbGVjdCBiZW5lZmljaWFyaWVzIikNCiANCmBgYA0KDQo8YnI+DQoNCg0KQWRkaXRpb25hbGx5LCBlYWNoIG9mIHRoZSBidWJibGVzIGluZGljYXRlIGFuIGluZGl2aWR1YWwgZGlzdHJpYnV0aW9uLCB3aXRoIHRoZWlyIHBvc2l0aW9uIGFsb25nIHRoZSB4LWF4aXMgc2hvd2luZyB0aGUgVVNEIHBlciBwZXJzb24gdmFsdWUgb2YgdGhlIGRpc3RyaWJ1dGlvbiBhbmQgdGhlIHNpemUgb2YgZWFjaCBidWJibGUgaW5kaWNhdGVzIHRoZSBudW1iZXIgb2YgYmVuZWZpY2lhcmllcyByZWFjaGVkLiANCg0KRGVzcGl0ZSBiZWluZyB0aGUgYWN0aXZpdHkgd2hpY2ggcmVhY2hlZCB0aGUgbW9zdCBiZW5lZmljaWFyaWVzLCBmb29kIGRpc3RyaWJ1dGlvbnMgaGF2ZSBvbmUgb2YgdGhlIHRpZ2h0ZXN0IHJhbmdlcyBvZiB0cmFuc2ZlciB2YWx1ZXMsIHRob3VnaCwgYXMgd2lsbCBiZSBleHBsb3JlZCBmdXJ0aGVyIGluIHRoZSBwbG90IGJlbG93IGFuZCBpbiB0aGUgbmV4dCBzZWN0aW9uLCB0aGVyZSBhcmUgc3Vic3RhbnRpYWwgb3V0bGllcnMuIA0KDQpJbiB0aGUgaW50ZXJhY3RpdmUgc2NhdHRlcnBsb3QgYmVsb3csIHRoZSB4LWF4aXMgaW5kaWNhdGVzIHRoZSBudW1iZXIgb2YgYmVuZWZpY2lhcmllcyByZWFjaGVkIGFuZCB0aGUgeS1heGlzIGluZGljYXRlcyB0aGUgcGVyIHBlcnNvbiB2YWx1ZSBvZiBlYWNoIHRyYW5zZmVyLiBFYWNoIHBvaW50IGlzIGEgZGlzdHJpYnV0aW9uIGFuZCB0aGUgc2l6ZSBvZiBlYWNoIHBvaW50IGluZGljYXRlcyB0aGUgbnVtYmVyIG9mIGJlbmVmaWNpYXJpZXMgcmVhY2hlZC4gTW9yZSBkZXRhaWxzIGFib3V0IGVhY2ggZGlzdHJpYnV0aW9uIGNhbiBiZSBzZWVuIGJ5IGhvdmVyaW5nIHlvdXIgY3Vyc29yIG92ZXIgZWFjaCBwb2ludC4gDQoNCjxicj4NCg0KYGBge3IgcGxvdGx5LXRyYW5zZmVyLXZhbHVlLXNjYXR0ZXJ9DQoNCm1vbmV5X3NjYXR0ZXIgPC0gZnNjICU+JSANCiAgZmlsdGVyKCFpcy5uYSh0b3RhbF92YWx1ZV91c2QpICYgYWN0aXZpdHlfcmVkICE9ICJsaXZlc3RvY2sga2l0cyIpICU+JQ0KICBncm91cF9ieShzdGF0ZSwgdG93bnNoaXAsIGxvY2F0aW9uLCBvcmdfY29kZSwgYWN0aXZpdHlfcmVkKSAlPiUgDQogIHN1bW1hcmlzZShiZW5lZmljaWFyaWVzID0gc3VtKGJlbmVmaWNpYXJpZXMpLCANCiAgICAgICAgICAgIHRvdGFsX3ZhbHVlX3VzZCA9IHN1bSh0b3RhbF92YWx1ZV91c2QpLCANCiAgICAgICAgICAgIHJvdW5kcyA9IG5fZGlzdGluY3QoZGF0ZSkpICU+JSANCiAgbXV0YXRlKHBlcl9wZXJzb24gPSByb3VuZCh0b3RhbF92YWx1ZV91c2QgLyBiZW5lZmljaWFyaWVzLCBkaWdpdHMgPSAyKSkgJT4lIA0KICBmaWx0ZXIodG90YWxfdmFsdWVfdXNkID4gMCkgJT4lDQogIGdncGxvdChhZXMoeCA9IGJlbmVmaWNpYXJpZXMsIHkgPSBwZXJfcGVyc29uLCBjb2xvdXIgPSBhY3Rpdml0eV9yZWQsIA0KICAgICAgICAgICAgIHRleHQgPSBwYXN0ZTAob3JnX2NvZGUsICJcbiIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aXZpdHlfcmVkLCAiXG4iLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJiZW4uIGZyZXF1ZW5jaWVzOiAiLCBjb21tYShiZW5lZmljaWFyaWVzLCBhY2N1cmFjeSA9IDEpLCAiXG4iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIlVTRCBwZXIgcGVyc29uOiAiLCBkb2xsYXIocGVyX3BlcnNvbiksICJcbiIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgInRvdGFsIHZhbHVlOiAiLCBkb2xsYXIodG90YWxfdmFsdWVfdXNkLCBhY2N1cmFjeSA9IDEpLCAiXG4iLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJyb3VuZHM6ICIsIHJvdW5kcywgIlxuIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICB0b3duc2hpcCwgIiwgIiwgc3RhdGUpKSkgKyANCiAgZ2VvbV9qaXR0ZXIoYWVzKHNpemUgPSBiZW5lZmljaWFyaWVzKSwgYWxwaGEgPSAuNSkgKyANCiAgc2NhbGVfeV9jb250aW51b3VzKHRyYW5zID0gImxvZzEwIiwgYnJlYWtzID0gYygwLCAxLCAzLCAxMCwgMzAsIDEwMCwgMzAwKSwgbGFiZWxzID0gZG9sbGFyX2Zvcm1hdChhY2N1cmFjeSA9IDEpKSArIA0KICBzY2FsZV94X2NvbnRpbnVvdXModHJhbnMgPSAibG9nMTAiLCBsYWJlbHMgPSBjb21tYSwgYnJlYWtzID0gYygwLCAxMCwgMTAwLCAxMDAwLCAxMDAwMCwgMTAwMDAwLCAzMDAwMDApKSArIA0KICBzY2FsZV9zaXplX2NvbnRpbnVvdXMoZ3VpZGUgPSAibm9uZSIsIHJhbmdlID0gYygwLjMsIDEwKSkgKyANCiAgbGFicyh4ID0gIkJlbmVmaWNpYXJ5IGZyZXF1ZW5jaWVzIiwgDQogICAgICAgeSA9ICJVU0QgdHJhbnNmZXIgdmFsdWUgcGVyIHBlcnNvbiIsIA0KICAgICAgIHRpdGxlID0gIkF2ZXJhZ2UgVVNEIHRyYW5zZmVyIHZhbHVlIHBlciBwZXJzb24gaW4gMjAyMi9RMSIsIA0KICAgICAgIHN1YnRpdGxlID0gIkJ5IG9yZ2FuaXNhdGlvbiwgbG9jYXRpb24gYW5kIGFjdGl2aXR5IiwgDQogICAgICAgY29sb3VyID0gIiIpICsgDQogIHRoZW1lKGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSA1KSkgKyANCiAgZ3VpZGVzKGNvbG91ciA9IGd1aWRlX2xlZ2VuZChvdmVycmlkZS5hZXMgPSBsaXN0KHNpemUgPSAxLCBhbHBoYSA9IDEpKSkNCg0KZ2dwbG90bHkobW9uZXlfc2NhdHRlciwgdG9vbHRpcCA9IGMoInRleHQiKSwgd2lkdGggPSA4MjApICU+JSANCiAgbGF5b3V0KHRpdGxlID0gbGlzdCh0ZXh0ID0gcGFzdGUwKCJBdmVyYWdlIFVTRCB0cmFuc2ZlciB2YWx1ZSBwZXIgcGVyc29uIGluIDIwMjIvUTEiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxicj4iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxzdXA+IiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJCeSBvcmdhbmlzYXRpb24sIGxvY2F0aW9uIGFuZCBhY3Rpdml0eTsgZG91YmxlLWNsaWNrIG9uIGxlZ2VuZCB0byBzZWxlY3QiLCI8L3N1cD4iKSkpDQoNCg0KYGBgDQoNCjxicj4NCg0KRm9vZCBmb3Igd29yay9jYXNoIGZvciBhc3NldHMgYW5kIG11bHRpLXB1cnBvc2UgY2FzaCB0cmFuc2ZlcnMgaGFkIHRoZSBsYXJnZXN0IGRpc3BlcnNpb25zIGluIHRoZSB2YWx1ZXMgb2YgdGhlaXIgdHJhbnNmZXJzLiBGb3IgZm9vZCBmb3Igd29yay9jYXNoIGZvciBhc3NldHMsIHRoZXJlIGlzIG9uZSBjbHVzdGVyIGxhcmdlbHkgYmVsb3cgVVNEIDUvcGVyc29uIGluIFNhZ2FpbmcgYW5kIGFub3RoZXIgb2YgYmV0d2VlbiBVU0QgMzAgYW5kIFVTRCA2MCBwZXIgcGVyc29uIGluIEthY2hpbiBhbmQgU2hhbiBOb3J0aC4NCg0KQXMgbWVudGlvbmVkLCBmb29kIGRpc3RyaWJ1dGlvbnMgaGFkIHRoZSB0aWdodGVzdCByYW5nZSBvZiB0cmFuc2ZlciB2YWx1ZXMsIHdpdGggdGhlIHZhc3QgbWFqb3JpdHkgb2YgZGlzdHJpYnV0aW9ucyBmYWxsaW5nIGp1c3QgYmVsb3cgVVNEIDEwL3BlcnNvbi4gSG93ZXZlciwgaXQgaGFzIG91dGx5aW5nIHZhbHVlcyB0aGF0IHJlYWNoZWQgdmVyeSBsYXJnZSBncm91cHMgb2YgYmVuZWZpY2lhcmllcy4gVGhpcyB3aWxsIGJlIGV4cGxvcmVkIGluIHRoZSBuZXh0IHNlY3Rpb24uIA0KIA0KPGJyPjxicj4NCg0KIyMjIDMuNCBBIGNsb3NlciBsb29rIGF0IGZvb2QgZGlzdHJpYnV0aW9ucw0KDQpUaGUgaW50ZXJhY3RpdmUgcGxvdCBiZWxvdyBicmVha3MgZG93biB0aGUgcmFuZ2Ugb2YgVVNEIHBlciBwZXJzb24gY2FzaCB0cmFuc2ZlciB2YWx1ZXMgYnkgc3RhdGUuIFNpbWlsYXIgdG8gdGhlIHBsb3QgYWJvdmUsIGVhY2ggcG9pbnQgaXMgYSBkaXN0cmlidXRpb24gYW5kIG1vcmUgZGV0YWlscyBhYm91dCBlYWNoIGRpc3RyaWJ1dGlvbiBjYW4gYmUgc2VlbiBieSBob3ZlcmluZyB5b3VyIG1vdXNlIG92ZXIgZWFjaCBwb2ludC4gDQoNClRoZSByZWQgbGluZSBpbmRpY2F0ZXMgNTAlIG9mIHRoZSBtb250aGx5IGV4cGVuZGl0dXJlIGJhc2tldCAoTUVCKSBmb3IgZm9vZCAoZGl2aWRlZCBieSA1IHRvIGdldCB0aGUgZmlndXJlIHBlciBwZXJzb24pLiBUaGUgdmFzdCBtYWpvcml0eSBvZiB0cmFuc2ZlcnMgZmFsbCBiZWxvdyB0aGlzIHZhbHVlLiANCg0KPGJyPiANCg0KYGBge3IgcGxvdGx5LWZvb2QtZGlzdC1yYW5nZX0NCg0KZm9vZF9kaXN0X3JhbmdlIDwtIGZzYyAlPiUgDQogIGZpbHRlcighaXMubmEodXNkX3Blcl9wZXJzb24pKSAlPiUNCiAgZmlsdGVyKGFjdGl2aXR5X3JlZCA9PSAiZm9vZCBkaXN0cmlidXRpb24iICYgdXNkX3Blcl9wZXJzb24gPCA2MCkgJT4lIA0KICBnZ3Bsb3QoYWVzKHggPSB1c2RfcGVyX3BlcnNvbiwgeSA9IHN0YXRlLCBjb2xvdXIgPSBzdGF0ZSwgDQogICAgICAgICAgICAgdGV4dCA9IHBhc3RlMChvcmdfY29kZSwgIlxuIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICBhY3Rpdml0eV9yZWQsICJcbiIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgImJlbi4gZnJlcXVlbmNpZXM6ICIsIGNvbW1hKGJlbmVmaWNpYXJpZXMsIGFjY3VyYWN5ID0gMSksICJcbiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAiVVNEIHBlciBwZXJzb246ICIsIGRvbGxhcih1c2RfcGVyX3BlcnNvbiksICJcbiIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgInRvdGFsIHZhbHVlOiAiLCBkb2xsYXIodG90YWxfdmFsdWVfdXNkLCBhY2N1cmFjeSA9IDEpLCAiXG4iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgdG93bnNoaXAsICIsICIsIHN0YXRlKSkpICsgDQogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDExLjQ1NSwgbHR5ID0gMiwgY29sb3VyID0gInJlZCIsIGFscGhhID0gLjUsIHNpemUgPSAuMykgKyANCiAgZ2VvbV9qaXR0ZXIoYWxwaGEgPSAwLjMsIGFlcyhzaXplID0gYmVuZWZpY2lhcmllcykpICsNCiAgc2NhbGVfY29sb3VyX3ZpcmlkaXNfZCgpICsNCiAgc2NhbGVfc2l6ZV9jb250aW51b3VzKHJhbmdlID0gYygwLjMsIDEwKSkgKw0KICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDAsIDkwLCBieSA9IDEwKSwgbGFiZWxzID0gZG9sbGFyX2Zvcm1hdChhY2N1cmFjeSA9IDEpKSArDQogIGxhYnMoeCA9ICJVU0QgdmFsdWUgcGVyIHBlcnNvbiIsIA0KICAgICAgIHkgPSAiIiwgDQogICAgICAgdGl0bGUgPSAiRm9vZCBkaXN0cmlidXRpb246IHJhbmdlIG9mIFVTRCB2YWx1ZXMgcGVyIHBlcnNvbiBieSBzdGF0ZSBpbiAyMDIyL1ExIiwNCiAgICAgICBzaXplID0gIiIsIGNvbG91ciA9ICIiKSANCg0KZ2dwbG90bHkoZm9vZF9kaXN0X3JhbmdlLCB0b29sdGlwID0gYygidGV4dCIpLCB3aWR0aCA9IDgyMCwgaGVpZ2h0ID0gIDYwMCkgJT4lIA0KICBsYXlvdXQodGl0bGUgPSBsaXN0KHRleHQgPSBwYXN0ZTAoIkZvb2QgZGlzdHJpYnV0aW9uOiByYW5nZSBvZiBVU0QgdmFsdWVzIHBlciBwZXJzb24gYnkgc3RhdGUgaW4gMjAyMi9RMSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPGJyPiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPHN1cD4iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRoZSByZWQgbGluZSBpcyA1MCUgb2YgMS81IG9mIGZvb2QgTUVCOyBkb3VibGUtY2xpY2sgb24gbGVnZW5kIHRvIHNlbGVjdCIsIjwvc3VwPiIpKSwgDQogICAgICAgICBsZWdlbmQgPSBsaXN0KGZvbnQgPSBsaXN0KHNpemUgPSA3KSkpIA0KYGBgDQoNCjxicj4NCg0KS2FjaGluIGFuZCBTaGFuIG5vdGFibHkgaGF2ZSBzZXZlcmFsIGV4dHJlbWUgb3V0bGllcnMgbXVjaCBoaWdoZXIgdGhhbiB0aGUgYXZlcmFnZSBmb3IgdGhhdCBzdGF0ZS4gS2F5aW4sIGhvd2V2ZXIsIGhhcyBhIHZlcnkgbGFyZ2UgbnVtYmVyIG9mIGJlbmVmaWNpYXJpZXMgd2hvIHJlY2VpdmVkIGxlc3MgdGhlIFVTRCAxL3BlcnNvbi4gRGlzdHJpYnV0aW9ucyBpbiBDaGluIGhhZCB2ZXJ5IGNvbnNpc3RlbnQgdmFsdWVzIGFzIHRoZXkgd2VyZSBhbGwgaW1wbGVtZW50ZWQgYnkgdGhlIHNhbWUgaW1wbGVtZW50aW5nIHBhcnRuZXIuIA0KDQpUaGUgdGFibGUgYmVsb3cgY29tcGFyZXMgdGhlIGRpZmZlcmVudCBiaW5zIGZvciBjYXNoIHRyYW5zZmVyIHZhbHVlcyBvZiBmb29kIGRpc3RyaWJ1dGlvbnMgd2l0aCB0aGUgbWluaW11bSBleHBlbmRpdHVyZSBiYXNrZXQgZm9yIGZvb2QgZXN0YWJsaXNoZWQgYnkgdGhlIENhc2ggV29ya2luZyBHcm91cC4gVGhleSBoYXZlIGVzdGFibGlzaGVkIGEgZmxvb3Igb2YgTU1LIDE5MCw1NTUgKG9yIFVTRCAxMTQuNTUpLiANCg0KT3ZlcmFsbCwgYHIgcm91bmQoKGZpbHRlcihmc2MsIHVzZF9wZXJfcGVyc29uID49ICgxMTQuNTUgLyA1KSAmIGFjdGl2aXR5X3JlZCA9PSAiZm9vZCBkaXN0cmlidXRpb24iKSAlPiUge3N1bSguJG5ld19iZW5lZmljaWFyaWVzKX0pIC8gKGZpbHRlcihmc2MsICFpcy5uYSh1c2RfcGVyX3BlcnNvbikgJiBhY3Rpdml0eV9yZWQgPT0gImZvb2QgZGlzdHJpYnV0aW9uIikgJT4lIHtzdW0oLiRuZXdfYmVuZWZpY2lhcmllcyl9KSAqIDEwMCwgZGlnaXRzID0gMilgJSBvZiBmb29kIGRpc3RyaWJ1dGlvbiBiZW5lZmljaWFyaWVzIGhhdmUgcmVjZWl2ZWQgYXQgbGVhc3QgMTAwJSBvZiB0aGUgTUVCIGFuZCBgciByb3VuZCgoZmlsdGVyKGZzYywgdXNkX3Blcl9wZXJzb24gPj0gKDExNC41NSAvIDUgLyAyKSAmIGFjdGl2aXR5X3JlZCA9PSAiZm9vZCBkaXN0cmlidXRpb24iKSAlPiUge3N1bSguJG5ld19iZW5lZmljaWFyaWVzKX0pIC8gKGZpbHRlcihmc2MsICFpcy5uYSh1c2RfcGVyX3BlcnNvbikgJiBhY3Rpdml0eV9yZWQgPT0gImZvb2QgZGlzdHJpYnV0aW9uIikgJT4lIHtzdW0oLiRuZXdfYmVuZWZpY2lhcmllcyl9KSAqIDEwMCwgZGlnaXRzID0gMilgJSBoYXZlIHJlY2VpdmVkIGF0IGxlYXN0IDUwJSBvZiB0aGUgTUVCLiANCg0KDQpgYGB7ciB0YWJsZS1tZWItdXNkLWhoZC1iaW59DQoNCmZvb2RfYmlucyA8LSBmc2MgJT4lIGZpbHRlcihhY3Rpdml0eV9yZWQgJWluJSBjKCJmb29kIGRpc3RyaWJ1dGlvbiIpICYgDQogICAgICAgICAgICAgICAgICFpcy5uYSh1c2RfcGVyX3BlcnNvbikgJiANCiAgICAgICAgICAgICAgICAgIWlzLm5hKG5ld19iZW5lZmljaWFyaWVzKSkgJT4lIA0KICBjb3VudCh1c2RfcGVyc29uX2Jpbiwgd3QgPSBuZXdfYmVuZWZpY2lhcmllcykgJT4lIA0KICBtdXRhdGUocGNfb2ZfdG90YWwgPSByb3VuZChuIC8gc3VtKG4pICogMTAwLCBkaWdpdHMgPSAyKSkNCg0KZnNjICU+JSANCiAgZmlsdGVyKGFjdGl2aXR5X3JlZCAlaW4lIGMoImZvb2QgZGlzdHJpYnV0aW9uIikgJg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhaXMubmEodXNkX3Blcl9wZXJzb24pICYNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIWlzLm5hKG5ld19iZW5lZmljaWFyaWVzKSkgJT4lDQogIG11dGF0ZShwY19tZWIgPSB1c2RfcGVyX3BlcnNvbiAqIDUgLyAxMTQuNTUpICU+JSANCiAgZ3JvdXBfYnkodXNkX3BlcnNvbl9iaW4pICU+JSANCiAgc3VtbWFyaXNlKGF2Z19wY19vZl9tZWIgPSByb3VuZChtZWFuKHBjX21lYikgKiAxMDAsIGRpZ2l0cyA9IDIpLA0KICAgICAgICAgICAgYXZnX3VzZF9tb250aCA9IHJvdW5kKG1lYW4odXNkX3Blcl9wZXJzb24sIG5hLnJtID0gVFJVRSksIGRpZ2l0cyA9IDIpLA0KICAgICAgICAgICAgYmVuZWZpY2lhcmllcyA9IHJvdW5kKHN1bShuZXdfYmVuZWZpY2lhcmllcykpKSAlPiUgDQogIG11dGF0ZShwY19vZl9oaGQgPSByb3VuZChiZW5lZmljaWFyaWVzIC8gc3VtKGJlbmVmaWNpYXJpZXMpICogMTAwLCBkaWdpdHMgPSAyKSkgJT4lIA0KICBrYWJsZShjYXB0aW9uID0gIlVTRCB2YWx1ZXMgb2YgZm9vZCBkaXN0cmlidXRpb25zIGJ5IHBlcmNlbnRhZ2Ugb2YgTUVCIHJlY2VpdmVkIiwgZm9ybWF0LmFyZ3MgPSBsaXN0KGJpZy5tYXJrID0gIiwiKSkgJT4lIA0KICBrYWJsZV9jbGFzc2ljXzIoInN0cmlwZWQiKSAlPiUgDQogIGNvbHVtbl9zcGVjKDUsIGNvbG9yID0gIndoaXRlIiwgYmFja2dyb3VuZCA9IHNwZWNfY29sb3IoZm9vZF9iaW5zJHBjX29mX3RvdGFsWzE6MTFdLCBlbmQgPSAwLjksIGRpcmVjdGlvbiA9IC0xKSkgJT4lDQogIGZvb3Rub3RlKGdlbmVyYWwgPSAiT25seSBwZXJzb25zIHJlYWNoZWQgdGhyb3VnaCBDQlQvQ1ZBL2h5YnJpZCBtb2RhbGl0aWVzIGFyZSBpbmNsdWRlZCIsDQogICAgICAgICAgIGdlbmVyYWxfdGl0bGUgPSAiIikNCiMgcGFuZGVyKGNhcHRpb24gPSAiTW9udGhseSBjYXNoLWJhc2VkIHRyYW5zZmVyIHZhbHVlcyBieSBwZXJjZW50YWdlIG9mIE1FQiByZWNlaXZlZCIpDQoNCmBgYA0KPGJyPg0KDQpIb3dldmVyLCBhIHZlcnkgbGFyZ2UgcHJvcG9ydGlvbiBvZiB0aGUgYmVuZWZpY2lhcmllcyByZWFjaGVkIHdlcmUgYmV0d2VlbiBVU0QgOCBhbmQgMTAgcGVyIHBlcnNvbiwgZmFpcmx5IGNsb3NlIHRvIDUwJSBvZiB0aGUgTUVCLiBUaGUgNTAlIHRocmVzaG9sZCBpcyBvZiBpbnRlcmVzdCBiZWNhdXNlIGh1bWFuaXRhcmlhbiBhc3Npc3RhbmNlIGRvZXMgbm90IGFpbSB0byBjb3ZlciB0aGUgZnVsbCBNRUIgYW5kIGlzIGludGVuZGVkIHRvIG1lZXQgYWN1dGUgbmVlZHMuIA0KDQpgYGB7ciB2YWx1ZXMtYmVsb3csIGluY2x1ZGU9RkFMU0V9DQpmc2MgJT4lIA0KICBmaWx0ZXIoYWN0aXZpdHlfcmVkID09ICJmb29kIGRpc3RyaWJ1dGlvbiIgJiBuZXdfYmVuZWZpY2lhcmllcyA+IDAgJiAhaXMubmEodG90YWxfdmFsdWVfdXNkKSkgJT4lDQogIHN1bW1hcmlzZSh0b3RhbF92YWx1ZV91c2QgPSBzdW0odG90YWxfdmFsdWVfdXNkKSwgDQogICAgICAgICAgICBiZW5lZmljaWFyaWVzID0gc3VtKG5ld19iZW5lZmljaWFyaWVzKSkgJT4lIA0KICBtdXRhdGUodG90YWxfdmFsdWVfdXNkIC8gYmVuZWZpY2lhcmllcykNCg0KZnNjXzIwMjEgJT4lIA0KICBmaWx0ZXIoYWN0aXZpdHlfcmVkID09ICJmb29kIGRpc3RyaWJ1dGlvbiIgJiB1bmlxdWVfYmVuZWZpY2lhcmllcyA9PSAiWWVzIiAmICFpcy5uYSh0b3RhbF92YWx1ZV91c2QpKSAlPiUNCiAgc3VtbWFyaXNlKHRvdGFsX3ZhbHVlX3VzZCA9IHN1bSh0b3RhbF92YWx1ZV91c2QpLCANCiAgICAgICAgICAgIGJlbmVmaWNpYXJpZXMgPSBzdW0oYmVuZWZpY2lhcmllcykpICU+JSANCiAgbXV0YXRlKHRvdGFsX3ZhbHVlX3VzZCAvIGJlbmVmaWNpYXJpZXMpDQoNCmBgYA0KDQo8YnI+DQoNCmBgYHtyIGJhcnBsb3QtMjAyMS0yMDIyfQ0KZnNjICU+JSAgDQogIGZpbHRlcihhY3Rpdml0eV9yZWQgPT0gImZvb2QgZGlzdHJpYnV0aW9uIiAmIG5ld19iZW5lZmljaWFyaWVzID4gMCkgJT4lIA0KICBtdXRhdGUoeWVhciA9IHllYXIoZGF0ZSkpICU+JSANCiAgc2VsZWN0KHVzZF9wZXJzb25fYmluLCBiZW5lZmljaWFyaWVzLCB5ZWFyKSAlPiUgDQogIHJiaW5kKGZzY18yMDIxICU+JQ0KICAgICAgICAgIGZpbHRlcihhY3Rpdml0eV9yZWQgPT0gImZvb2QgZGlzdHJpYnV0aW9uIiAmIHVuaXF1ZV9iZW5lZmljaWFyaWVzID09ICJZZXMiKSAlPiUgDQogICAgICAgICAgbXV0YXRlKHllYXIgPSB5ZWFyKGRhdGUpKSAlPiUgDQogICAgICAgICAgc2VsZWN0KHVzZF9wZXJzb25fYmluLCBiZW5lZmljaWFyaWVzLCB5ZWFyKSkgJT4lIA0KICBmaWx0ZXIoIWlzLm5hKHVzZF9wZXJzb25fYmluKSkgJT4lICANCiAgbXV0YXRlKHllYXIgPSBhcy5jaGFyYWN0ZXIoeWVhcikpICU+JSANCiAgZ3JvdXBfYnkoeWVhciwgdXNkX3BlcnNvbl9iaW4pICU+JSANCiAgc3VtbWFyaXNlKGJlbmVmaWNpYXJpZXMgPSBzdW0oYmVuZWZpY2lhcmllcykpICU+JSANCiAgZ3JvdXBfYnkoeWVhcikgJT4lIA0KICBtdXRhdGUocGNfYmVuID0gYmVuZWZpY2lhcmllcyAvIHN1bShiZW5lZmljaWFyaWVzKSwgDQogICAgICAgICB1c2RfcGVyc29uX2JpbiA9IGZjdF9yZXYodXNkX3BlcnNvbl9iaW4pKSAlPiUNCiAgZ2dwbG90KGFlcyh5ID0gdXNkX3BlcnNvbl9iaW4sIHggPSBwY19iZW4sIGZpbGwgPSB5ZWFyKSkgKyANCiAgZ2VvbV9jb2wocG9zaXRpb24gPSAiZG9kZ2UiLCB3aWR0aCA9IC44KSArDQogIHNjYWxlX3hfY29udGludW91cyhsYWJlbHMgPSBwZXJjZW50X2Zvcm1hdChhY2N1cmFjeSA9IDEpLCBicmVha3MgPSBzZXEoMCwgMSwgLjEpKSArIA0KICBzY2FsZV9maWxsX3ZpcmlkaXNfZChvcHRpb24gPSAiY2l2aWRpcyIsIGd1aWRlID0gZ3VpZGVfbGVnZW5kKHJldmVyc2UgPSBUUlVFKSwgZGlyZWN0aW9uID0gLTEpICsNCiAgbGFicyh4ID0gIiUgb2YgYmVuZWZpY2lhcmllcyIsIHkgPSAiIiwgZmlsbCA9ICIiLCANCiAgICAgICB0aXRsZSA9ICJDb21wYXJpc29uIGJldHdlZW4gZm9vZCBkaXN0cmlidXRpb24gY2FzaCB0cmFuc2ZlciB2YWx1ZXMiLCANCiAgICAgICBzdWJ0aXRsZSA9ICIyMDIxIHZzIDIwMjIvUTEiKQ0KDQpgYGANCg0KPGJyPg0KDQpXaXRoIHJlZmVyZW5jZSB0byB0aGUgcGxvdCBhYm92ZSwgdGhlIHBlciBwZXJzb24gVVNEIHZhbHVlcyBpbiAyMDIyIGFyZSBtb3JlIGNvbnNpc3RlbnQgdGhhbiBpbiAyMDIxLCB3aXRoIG1vcmUgdGhhbiA1MCUgb2YgYmVuZWZpY2lhcnkgZnJlcXVlbmNpZXMgcmVjZWl2aW5nIGJldHdlZW4gVVNEIDggYW5kIDEwIHBlciB0cmFuc2Zlci4gVGhlIGF2ZXJhZ2UgdHJhbnNmZXIgdmFsdWUgZm9yIGZvb2QgZGlzdHJpYnV0aW9ucyBpbiAyMDIxIHdhcyBVU0QgNy4zNjsgaW4gMjAyMi9RMSwgaXQgd2FzIFVTRCA4LjU5LiANCg0KPGJyPjxicj48YnI+DQoNCg0KIyMgNC4gQmVuZWZpY2lhcmllcyANCg0KIyMjIDQuMSBCZW5lZmljaWFyeSB0eXBlcw0KDQpgciByb3VuZChmaWx0ZXIoZnNjLCBiZW5lZmljaWFyeV90eXBlID09ICJIb3N0L2xvY2FsIENvbW11bml0eSIpICU+JSAge3N1bSguJG5ld19iZW5lZmljaWFyaWVzKX0gLyBzdW0oZnNjJG5ld19iZW5lZmljaWFyaWVzKSAqIDEwMCwgZGlnaXRzID0gMilgJSBvZiBiZW5lZmljaWFyaWVzIHdlcmUgZnJvbSB0aGUgaG9zdCBvciBsb2NhbCBjb21tdW5pdHkuIGByIHJvdW5kKGZpbHRlcihmc2MsIGJlbmVmaWNpYXJ5X3R5cGUgPT0gIkludGVybmFsbHkgRGlzcGxhY2VkIikgJT4lICB7c3VtKC4kbmV3X2JlbmVmaWNpYXJpZXMpfSAvIHN1bShmc2MkbmV3X2JlbmVmaWNpYXJpZXMpICogMTAwLCBkaWdpdHMgPSAyKWAlIGJlbmVmaWNpYXJpZXMgd2VyZSBJRFBzLiANCg0KPGJyPg0KDQpgYGB7cn0NCmZzYyAlPiUgDQogIGdyb3VwX2J5KGJlbmVmaWNpYXJ5X3R5cGUpICU+JSANCiAgc3VtbWFyaXNlKGJlbmVmaWNpYXJpZXMgPSBzdW0obmV3X2JlbmVmaWNpYXJpZXMpKSAlPiUgDQogIG11dGF0ZShiZW5lZmljaWFyeV90eXBlID0gZmN0X3Jlb3JkZXIoYmVuZWZpY2lhcnlfdHlwZSwgLWJlbmVmaWNpYXJpZXMpKSAlPiUgDQogIGdncGxvdChhZXMoeCA9IGJlbmVmaWNpYXJ5X3R5cGUsIHkgPSBiZW5lZmljaWFyaWVzLCBmaWxsID0gYmVuZWZpY2lhcnlfdHlwZSkpICsgDQogIGdlb21fY29sKCkgKw0KICBnZW9tX3RleHQoYWVzKGxhYmVsID0gY29tbWEoYmVuZWZpY2lhcmllcykpLCBzaXplID0gMywgdmp1c3QgPSAtMC41KSArDQogIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBjb21tYSkgKw0KICBzY2FsZV9maWxsX2Rpc2NyZXRlKGd1aWRlID0gIm5vbmUiKSArDQogIGxhYnMoeCA9ICJCZW5lZmljaWFyeSB0eXBlIiwNCiAgICAgICB5ID0gIk51bWJlciBvZiBiZW5lZmljaWFyaWVzIiwgDQogICAgICAgc3VidGl0bGUgPSAiUGVyc29ucyByZWFjaGVkIGJ5IGJlbmVmaWNpYXJ5IHR5cGUgaW4gMjAyMi9RMSIpDQoNCiMgZ2dzYXZlKCJiZW5lZmljaWFyeV90eXBlX3ExXzIwMjIucG5nIiwgZHBpID0gMzAwLCBoZWlnaHQgPSA1LCB3aWR0aCA9IDgsIHVuaXRzID0gImluIikNCmBgYA0KDQo8YnI+PGJyPg0KDQojIyMgNC4yIEV2aWRlbmNlIG9mIGZvb2QgaW5zZWN1cml0eSBzdGF0dXMNCg0KVmVyeSBmZXcgb2YgdGhlIGJlbmVmaWNpYXJpZXMgcmVhY2hlZCBoYWQgZXZpZGVuY2Ugb2YgdGhlaXIgZm9vZCBpbnNlY3VyaXR5IHN0YXR1cy4gVGhpcyBtYWtlcyBpdCBkaWZmaWN1bHQgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgb3Igbm90IGZvb2Qgc2VjdXJpdHkgaW50ZXJ2ZW50aW9ucyBhcmUgdHJ1bHkgcmVhY2hpbmcgdGhvc2UgbW9zdCBpbiBuZWVkLiANCg0KYGBge3J9DQpmc2MgJT4lICANCiAgbXV0YXRlKGhhc19ldmlkZW5jZSA9IGlmZWxzZShpcy5uYShldmlkZW5jZSksICJubyIsICJ5ZXMiKSwgDQogICAgICAgICBmb29kX2luc2VjdXJpdHlfc3RhdHVzID0gaWZlbHNlKGlzLm5hKGZvb2RfaW5zZWN1cml0eV9zdGF0dXMpLCAiTm8gc3RhdHVzIHByb3ZpZGVkIiwgZm9vZF9pbnNlY3VyaXR5X3N0YXR1cyksIA0KICAgICAgICAgZm9vZF9pbnNlY3VyaXR5X3N0YXR1cyA9IGZjdF9yZWxldmVsKGZvb2RfaW5zZWN1cml0eV9zdGF0dXMsICJObyBzdGF0dXMgcHJvdmlkZWQiLCBhZnRlciA9IEluZikpICU+JSANCiAgZ3JvdXBfYnkoZm9vZF9pbnNlY3VyaXR5X3N0YXR1cykgJT4lIA0KICBzdW1tYXJpc2UoYmVuZWZpY2lhcmllcyA9IHN1bShuZXdfYmVuZWZpY2lhcmllcykpICU+JSANCiAgbXV0YXRlKGAlX2JlbmZpY2lhcmllc2AgPSByb3VuZChiZW5lZmljaWFyaWVzIC8gc3VtKGJlbmVmaWNpYXJpZXMpICogMTAwLCBkaWdpdHMgPSAyKSkgJT4lIA0KICBrYWJsZShjYXB0aW9uID0gIkZvb2QgaW5zZWN1cml0eSBzdGF0dXMgYW5kIGV2aWRlbmNlIHByb3ZpZGVkIGluIDIwMjIvUTEiLCANCiAgICAgICAgZm9ybWF0LmFyZ3MgPSBsaXN0KGJpZy5tYXJrID0gIiwiKSkgJT4lIA0KICBrYWJsZV9jbGFzc2ljXzIoZnVsbF93aWR0aCA9IEZBTFNFKQ0KICANCmBgYA0KDQo8YnI+DQoNClRob3VnaCBldmlkZW5jZSBvZiBmb29kIGluc2VjdXJpdHkgd2FzIG5vdCBwcm92aWRlZCBieSBmb3IgdGhlIHZhc3QgbWFqb3JpdHkgb2YgYmVuZWZpY2lhcmllcyByZWFjaGVkLCBtdWNoIG9mIHRoZSBldmlkZW5jZSB0aGF0IHdhcyBwcm92aWRlZCB3ZXJlIHJlYXNvbmFibGUganVzdGlmaWNhdGlvbnMgZm9yIHRhcmdldGluZyBiZW5lZmljaWFyaWVzLiBTb21lIGdvb2QgcmVhc29ucyBpbmNsdWRlZCBhcm1lZCBjb25mbGljdCwgY29tbXVuaXR5LWJhc2VkIGJlbmVmaWNpYXJ5IHNlbGVjdGlvbiBhbmQgdGhlIHVzZSBvZiB0aGUgZm9vZCBjb25zdW1wdGlvbiBzY29yZS4gDQogIA0KDQpgYGB7cn0NCmZzYyAlPiUgDQogIG11dGF0ZShldmlkZW5jZSA9IGNhc2Vfd2hlbihzdHJfZGV0ZWN0KGV2aWRlbmNlLCAiZm9vZCBjb25zdW1wdGlvbiBzY29yZSIpIH4gIkZvb2QgY29uc3VtcHRpb24gc2NvcmUiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZpZGVuY2UgPT0gIk1EUiIgfiAiTW9udGhseSBkaXN0cmlidXRpb24gcmVwb3J0IiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcy5uYShldmlkZW5jZSkgfiAiTm8gZXZpZGVuY2UiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUgfiBldmlkZW5jZSksIA0KICAgICAgICAgZXZpZGVuY2UgPSBpZmVsc2UoaXMubmEoZXZpZGVuY2UpLCAsIGV2aWRlbmNlKSwgDQogICAgICAgICBldmlkZW5jZSA9IGZjdF9yZWxldmVsKGV2aWRlbmNlLCAiTm8gZXZpZGVuY2UiLCBhZnRlciA9IEluZikpICU+JSANCiAgZ3JvdXBfYnkoZXZpZGVuY2UpICU+JSANCiAgc3VtbWFyaXNlKGJlbmVmaWNpYXJpZXMgPSBzdW0obmV3X2JlbmVmaWNpYXJpZXMpKSAlPiUgDQogIG11dGF0ZShgJV9iZW5lZmljaWFyaWVzYCA9IHJvdW5kKGJlbmVmaWNpYXJpZXMgLyBzdW0oYmVuZWZpY2lhcmllcykgKiAxMDAsIGRpZ2l0cyA9IDIpKSAlPiUgDQogIGthYmxlKGNhcHRpb24gPSAiQnJlYWtkb3duIG9mIGV2aWRlbmNlIG9mIGZvb2QgaW5zZWN1cml0eSBzdGF0dXMgaW4gMjAyMi9RMSIsIA0KICAgICAgICBmb3JtYXQuYXJncyA9IGxpc3QoYmlnLm1hcmsgPSAiLCIpKSAlPiUgDQogIGthYmxlX2NsYXNzaWNfMigic3RyaXBlZCIsIGZ1bGxfd2lkdGggPSBGQUxTRSkNCmBgYA0KPGJyPg0KDQpUaGUgZ2VuZXJhbCBsYWNrIG9mIGV2aWRlbmNlIG9mIGV2aWRlbmNlIG9mIGJlbmVmaWNpYXJpZXMnIGZvb2QgaW5zZWN1cml0eSBzdGF0dXMgbWFrZXMgaXQgZGlmZmljdWx0IHRvIGp1c3RpZnkgdG8gYWZmZWN0ZWQgY29tbXVuaXRpZXMgYW5kIGRvbm9ycyB0aGF0IHRoZSBGb29kIFNlY3VyaXR5IENsdXN0ZXIgaXMgcmVhY2hpbmcgdGhlIG1vc3QgaW4gbmVlZC4gVGhpcyBoaWdobGlnaHRzIHRoZSBuZWVkIHRvIHByb21vdGUgYSBzaGFyZWQgdW5kZXJzdGFuZGluZyBvZiB0aGUgcmVzcG9uc2UgdGhyb3VnaCB0aGUgZGV2ZWxvcG1lbnQgb2YgYSBjb21tb24gcHJpb3JpdGlzYXRpb24gdG9vbCBmb3IgZm9vZCBzZWN1cml0eSBwYXJ0bmVycy4gDQoNCjxicj48YnI+PGJyPg0KDQojIyMgNC4zIEJlbmVmaWNpYXJ5IGRpc2FnZ3JlZ2F0aW9uIA0KDQpgYGB7cn0NCmZzY19kaXNhZ2cgPC0gZnNjICU+JSANCiAgcGl2b3RfbG9uZ2VyKGNvbHMgPSBjKGNoaWxkX21hbGU6ZWxkZXJseV9mZW1hbGUpLCBuYW1lc190byA9ICJkaXNhZ2ciLCB2YWx1ZXNfdG8gPSAiYmVuX3N1YiIpICU+JSANCiAgbGVmdF9qb2luKHRyaWJibGUoDQogICAgfmFnZSwgfnNleCwgfmRpc2FnZywgfnZhbHVlLCANCiAgICAiY2hpbGQiLCAibWFsZSIsICJjaGlsZF9tYWxlIiwgMC4xNjI5ODk5ODksDQogICAgImNoaWxkIiwgImZlbWFsZSIsICJjaGlsZF9mZW1hbGUiLCAwLjE1ODkwMDg4MywNCiAgICAiYWR1bHQiLCAibWFsZSIsICJhZHVsdF9tYWxlIiwgMC4yNzE0NTA4MzEsDQogICAgImFkdWx0IiwgImZlbWFsZSIsICJhZHVsdF9mZW1hbGUiLCAwLjMwMDQ0NDU4NSwNCiAgICAiZWxkZXJseSIsICJtYWxlIiwgImVsZGVybHlfbWFsZSIsIDAuMDQ0MDI5NDIzLA0KICAgICJlbGRlcmx5IiwgImZlbWFsZSIsICJlbGRlcmx5X2ZlbWFsZSIsIDAuMDYyMTg0MjkNCiAgICApICU+JSANCiAgICAgICAgICAgICAgc2VsZWN0KGRpc2FnZywgY2Vuc3VzX3Byb3AgPSB2YWx1ZSksIGJ5ID0gImRpc2FnZyIpICU+JQ0KICBmaWx0ZXIoYmVuX3N1YiAhPSAwKSAlPiUgDQogIG11dGF0ZShiZW5fcHJvcCA9IGJlbl9zdWIgLyBiZW5lZmljaWFyaWVzLCANCiAgICAgICAgIGJlbl9wcm9wX2NvbXBhcmUgPSBhYnMoY2Vuc3VzX3Byb3AgLSBiZW5fcHJvcCksDQogICAgICAgICBzYW1lX2FzX2NlbnN1cyA9IGlmZWxzZShiZW5fcHJvcF9jb21wYXJlIDwgMC4wNSwgImJhY2tmaWxsZWQiLCAicmVhbCIpKQ0KDQpmc2NfZGlzYWdnX3ZhbHVlcyA8LSBmc2NfZGlzYWdnICU+JSANCiAgZmlsdGVyKG5ld19iZW5lZmljaWFyaWVzID4gMCkgJT4lIA0KICBncm91cF9ieShzYW1lX2FzX2NlbnN1cykgJT4lIA0KICBzdW1tYXJpc2UoYmVuX3N1YiA9IHN1bShiZW5fc3ViKSkgJT4lIA0KICBhZG9ybl9wZXJjZW50YWdlcygiY29sIikgJT4lICANCiAgbXV0YXRlKGJlbl9zdWIgPSByb3VuZChiZW5fc3ViICogMTAwLCBkaWdpdHMgPSAyKSkNCmBgYA0KDQpEdWUgdG8gdGhlIHByb2JsZW1zIGluIHJlcG9ydGluZyBkaXNhZ2dyZWdhdGVkIGJlbmVmaWNpYXJ5IGRhdGEsIHR3byB0ZXN0cyBoYXZlIGJlZW4gYXBwbGllZCB0byB0aGUgc3VibWl0dGVkIDVXIGRhdGEuIFRoZSBmaXJzdCBpbnZvbHZlcyBhIGNvbXBhcmlzb24gdG8gdGhlIHByb3BvcnRpb25zIG9mIGRpc2FnZ3JlZ2F0aW9uIGdyb3VwcyBpbiB0aGUgY2Vuc3VzIHRvIGRldGVybWluZSBpZiB2YWx1ZXMgaGF2ZSBiZWVuIGJhY2tmaWxsZWQgZnJvbSB0aGUgY2Vuc3VzLiAgDQoNClRoZSBwbG90cyBiZWxvdyBzaG93IHRoZSBicmVha2Rvd25zIGJldHdlZW4gdGhlICJyZWFsIiB2YWx1ZXMgYW5kIHRob3NlIHRoYXQgaGF2ZSBiZWVuIGJhY2tmaWxsZWQgZnJvbSB0aGUgY2Vuc3VzLiBBcHByb3hpbWF0ZWx5IDU5JSBvZiBiZW5lZmljaWFyaWVzIHJlcG9ydGVkIHdlcmUgbm90IGJhY2tmaWxsZWQgZnJvbSB0aGUgY2Vuc3VzOyB0aGlzIGlzIGFuIGltcHJvdmVtZW50IGZyb20gMjAyMSwgd2hlcmUgb25seSA0NCUgb2YgYmVuZWZpY2lhcmllcyBoYWQgInJlYWwiIGRpc2FnZ3JlZ2F0aW9ucy4gDQoNCkluIHRoZSAicmVhbCIgdmFsdWVzLCBpdCBjYW4gYmUgc2VlbiB0aGF0IHRoZSBwcm9wb3J0aW9uIG9mIGFkdWx0IGZlbWFsZXMgcmVhY2hlZCBpcyBtdWNoIGhpZ2hlciB0aGFuIGFkdWx0IG1hbGVzIC0tIHRoaXMgaXMgaW4gbGluZSB3aXRoIHRoZSBDbHVzdGVyJ3MgdW5kZXJzdGFuZGluZyBvZiBzZXZlcmFsIGFjdGl2aXRpZXMgdGhhdCBzcGVjaWZpY2FsbHkgdGFyZ2V0IHdvbWVuLiBUaGUgcGVyY2VudGFnZXMgb2YgZWxkZXJseSBwZXJzb25zIGFjdHVhbGx5IHJlYWNoZWQgaXMgYWxzbyBtdWNoIGxvd2VyIHRoYW4gd2hhdCBoYXMgYmVlbiByZXBvcnRlZC4gDQoNCjxicj4NCg0KYGBge3J9DQpmc2NfZGlzYWdnICU+JQ0KICBmaWx0ZXIobmV3X2JlbmVmaWNpYXJpZXMgPiAwKSAlPiUgDQogIGZpbHRlcihzYW1lX2FzX2NlbnN1cyA9PSAicmVhbCIpICU+JSANCiAgZ3JvdXBfYnkoZGlzYWdnKSAlPiUgDQogIHN1bW1hcmlzZShiZW5fZnJlcSA9IHN1bShiZW5fc3ViKSkgJT4lIA0KICBtdXRhdGUoZGlzYWdnID0gZmN0X3JlbGV2ZWwoZGlzYWdnLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMoImNoaWxkX21hbGUiLCAiY2hpbGRfZmVtYWxlIiwgImFkdWx0X21hbGUiLCAiYWR1bHRfZmVtYWxlIiwgImVsZGVybHlfbWFsZSIsICJlbGRlcmx5X2ZlbWFsZSIpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGMoImVsZGVybHlfZmVtYWxlIiwgImVsZGVybHlfbWFsZSIsICJhZHVsdF9mZW1hbGUiLCAiYWR1bHRfbWFsZSIsICJjaGlsZF9mZW1hbGUiLCAiY2hpbGRfbWFsZSIpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICApKSAlPiUgDQogIGFkb3JuX3BlcmNlbnRhZ2VzKCJjb2wiKSAlPiUgDQogIGdncGxvdChhZXMoeCA9IGRpc2FnZywgeSA9IGJlbl9mcmVxLCBmaWxsID0gZGlzYWdnKSkgKyANCiAgZ2VvbV9jb2woKSArIA0KICBnZW9tX3RleHQoYWVzKGxhYmVsID0gcm91bmQoYmVuX2ZyZXEgKiAxMDAsIGRpZ2l0cyA9IDEpKSwgc2l6ZSA9IDMsIHZqdXN0ID0gLTAuMykgKw0KICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gcGVyY2VudCwgYnJlYWtzID0gc2VxKDAsIDAuNCwgYnkgPSAwLjEpKSArDQogIGxhYnMoeCA9ICJEaXNhZ2dyZWdhdGlvbiBncm91cCIsIA0KICAgICAgIHkgPSAiUGVyY2VudGFnZSBvZiBiZW5lZmljaWFyaWVzIiwNCiAgICAgICB0aXRsZSA9ICIlIG9mIGJlbmVmaWNpYXJpZXMgYnkgZGlzYWdncmVnYXRpb24gZ3JvdXAiLCANCiAgICAgICBzdWJ0aXRsZSA9ICJPbmx5IGNvbnRhaW5zIHJlYWwqIHZhbHVlczsgNTklIG9mIGJlbmVmaWNpYXJpZXMiKSArDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwgDQogICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNjAsIGhqdXN0ID0gMSkpICsgDQogIA0KZnNjX2Rpc2FnZyAlPiUgDQogIGZpbHRlcihuZXdfYmVuZWZpY2lhcmllcyA+IDApICU+JSANCiAgIyBmaWx0ZXIoc2FtZV9hc19jZW5zdXMgPT0gImJhY2tmaWxsZWQiKSAlPiUgDQogIGdyb3VwX2J5KGRpc2FnZykgJT4lIA0KICBzdW1tYXJpc2UoYmVuX2ZyZXEgPSBzdW0oYmVuX3N1YikpICU+JSANCiAgbXV0YXRlKGRpc2FnZyA9IGZjdF9yZWxldmVsKGRpc2FnZywgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjKCJjaGlsZF9tYWxlIiwgImNoaWxkX2ZlbWFsZSIsICJhZHVsdF9tYWxlIiwgImFkdWx0X2ZlbWFsZSIsICJlbGRlcmx5X21hbGUiLCAiZWxkZXJseV9mZW1hbGUiKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBjKCJlbGRlcmx5X2ZlbWFsZSIsICJlbGRlcmx5X21hbGUiLCAiYWR1bHRfZmVtYWxlIiwgImFkdWx0X21hbGUiLCAiY2hpbGRfZmVtYWxlIiwgImNoaWxkX21hbGUiKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSkgJT4lIA0KICBhZG9ybl9wZXJjZW50YWdlcygiY29sIikgJT4lIA0KICBnZ3Bsb3QoYWVzKHggPSBkaXNhZ2csIHkgPSBiZW5fZnJlcSwgZmlsbCA9IGRpc2FnZykpICsgDQogIGdlb21fY29sKCkgKyANCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IHJvdW5kKGJlbl9mcmVxICogMTAwLCBkaWdpdHMgPSAxKSksIHNpemUgPSAzLCB2anVzdCA9IC0wLjMpICsNCiAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IHBlcmNlbnQsIGJyZWFrcyA9IHNlcSgwLCAwLjQsIGJ5ID0gMC4xKSkgKw0KICBsYWJzKHggPSAiRGlzYWdncmVnYXRpb24gZ3JvdXAiLCANCiAgICAgICB5ID0gIlBlcmNlbnRhZ2Ugb2YgYmVuZWZpY2lhcmllcyIsDQogICAgICAgdGl0bGUgPSAiJSBvZiBiZW5lZmljaWFyaWVzIGJ5IGRpc2FnZ3JlZ2F0aW9uIGdyb3VwIiwgDQogICAgICAgc3VidGl0bGUgPSAiQ29udGFpbnMgYWxsIHZhbHVlcywgaW5jbHVkaW5nIGJhY2tmaWxsZWQgdmFsdWVzIikgKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIsIA0KICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDYwLCBoanVzdCA9IDEpKQ0KYGBgDQoNCjxicj4NCg0KVGhlIHNlY29uZCB0ZXN0IGFwcGxpZWQgaXMgaWYgdGhlIGRpc2FnZ3JlZ2F0ZWQgbnVtYmVycyBvZiBiZW5lZmljaWFyaWVzIHJlYWNoZWQgaGF2ZSBiZWVuIGNvcGllZCBhbmQgcGFzdGVkLiBUbyBkbyB0aGlzLCB0aGUgcHJvcG9ydGlvbnMgb2YgZWFjaCBkaXNhZ2dyZWdhdGlvbiBncm91cCBieSBwYXJ0bmVyIGhhdmUgYmVlbiBjb21wYXJlZCB0byBob3cgY2xvc2UgdGhleSB3ZXJlIHRvIHRoZSBtZWFuIGZvciB0aGUgZW50aXJlIGdyb3VwLiBUbyBleHBsYWluOiBpZiBwYXJ0bmVyIEEgcmVwb3J0ZWQgdGhhdCA0MCUgb2YgYmVuZWZpY2lhcmllcyBpbiBhbiBhY3Rpdml0eSB3ZXJlIGFkdWx0IGZlbWFsZXMsIHRoaXMgcGVyY2VudGFnZSB3YXMgdGhlbiBjb21wYXJlZCB0byB0aGUgYXZlcmFnZSBwZXJjZW50YWdlIG9mIGFkdWx0IGZlbWFsZXMgZm9yIGFsbCBvdGhlciBhY3Rpdml0aWVzIHJlcG9ydGVkIGJ5IHRoYXQgcGFydG5lci4gVGhpcyBtZWFzdXJlIHdoZXRoZXIgb3Igbm90IHRoZSBzYW1lIHByb3BvcnRpb25zIHdlcmUgY29waWVkIGFuZCBwYXN0ZWQgdGhyb3VnaG91dCB0aGUgNVcgZm9ybS4gDQoNCkl0IGlzIGV4dHJlbWVseSB1bmxpa2VseSB0aGF0IHRoZXNlIHBlcmNlbnRhZ2VzIHdvdWxkIGJlIHNpbWlsYXIgYWNyb3NzIGFjdGl2aXRpZXMgYXMgaW1wbGVtZW50aW5nIHBhcnRuZXJzIHdvcmtlZCBpbiBhbiBhdmVyYWdlIG9mIGByIHJvdW5kKGZzYyAlPiUgZ3JvdXBfYnkob3JnX2NvZGUpICU+JSBzdW1tYXJpc2UobG9jYXRpb25zID0gbl9kaXN0aW5jdChsb2NhdGlvbikpICU+JSB7bWVhbiguJGxvY2F0aW9ucyl9LCBkaWdpdHMgPSAyKWAgbG9jYXRpb25zLiANCg0KSW4gdGhlIHBsb3QgYmVsb3csIHRoZSBjbG9zZXIgYSB2YWx1ZSBpcyB0byAwJSBvbiB0aGUgeC1heGlzLCB0aGUgbW9yZSBsaWtlbHkgaXQgaXMgdGhhdCBpdCB3YXMgY29waWVkIGFuZCBwYXN0ZWQuIEl0IGlzIGVzdGltYXRlZCB0aGF0IDg5JSBvZiBiZW5lZmljaWFyeSBkaXNhZ2dyZWdhdGlvbiB2YWx1ZXMgd2VyZSBjb3BpZWQgYW5kIHBhc3RlZC4gDQoNCjxicj4NCg0KYGBge3J9DQoNCmZzY19kaXNhZ2cgJT4lIA0KICBmaWx0ZXIobmV3X2JlbmVmaWNpYXJpZXMgPiAwKSAlPiUgDQogIG11dGF0ZShwY19kaXNhZ2cgPSBiZW5fc3ViIC8gYmVuZWZpY2lhcmllcykgJT4lIA0KICBncm91cF9ieShvcmdfY29kZSwgZGlzYWdnKSAlPiUgDQogIHN1bW1hcmlzZShtZWFuID0gbWVhbihwY19kaXNhZ2cpLCANCiAgICAgICAgICAgIHNkID0gc2QocGNfZGlzYWdnLCBuYS5ybSA9IFRSVUUpLA0KICAgICAgICAgICAgYmVuX3N1YiA9IHN1bShiZW5fc3ViLCBuYS5ybSA9IFRSVUUpKSAlPiUgDQogIG11dGF0ZShjYXQgPSBpZmVsc2Uoc2QgPj0gLjA1LCAicmVhbCIsICJmYWtlIikpICU+JSANCiAgZmlsdGVyKCFpcy5uYShjYXQpKSAlPiUgDQogICMgZ3JvdXBfYnkoY2F0KSAlPiUgDQogICMgc3VtbWFyaXNlKGJlbiA9IHN1bShiZW5fc3ViKSkgJT4lDQogICMgbXV0YXRlKHBjID0gYmVuIC8gc3VtKGJlbikpDQogIGdncGxvdChhZXMoeCA9IHNkKSkgKw0KICBnZW9tX2hpc3RvZ3JhbSgpICsgDQogIHNjYWxlX3hfY29udGludW91cyhsYWJlbHMgPSBwZXJjZW50X2Zvcm1hdChhY2N1cmFjeSA9IDEpKSArIA0KICBsYWJzKHggPSAiUGVyY2VudGFnZSBkaWZmZXJlbmNlIGZyb20gZ3JvdXAgbWVhbiIsIA0KICAgICAgIHRpdGxlID0gIkhpc3RvZ3JhbSBvZiBzdGFuZGFyZCBkZXZpYXRpb25zIGFjcm9zcyBiZW5lZmljaWFyeSBkaXNhZ2dyZWdhdGlvbnMiLCANCiAgICAgICBzdWJ0aXRsZSA9ICJUaGUgbG93ZXIgdGhlIHN0YW5kYXJkIGRldmlhdGlvbiwgdGhlIG1vcmUgbGlrZWx5IHRvIGJlIGNvcHkvcGFzdGVkIikNCiANCmBgYA0KDQoNCg0KPGJyPjxicj48YnI+DQoNCiMjIDUuIFBhcnRuZXJzDQoNCiMjIyA1LjEgUmVhY2ggYnkgaW1wbGVtZW50aW5nIHBhcnRuZXINCg0KVGhlcmUgYXJlIGByIGZzYyAlPiUgZGlzdGluY3Qob3JnX2NvZGUpICU+JSBucm93KClgIHBhcnRuZXJzIHRoYXQgd2VyZSBpbnZvbHZlZCBpbiBkaXJlY3QgaW1wbGVtZW50YXRpb24gdGhhdCBoYXZlIHJlcG9ydGVkIGFjaGlldmVtZW50cyBpbiBmaXJzdCBxdWFydGVyIG9mIDIwMjIuIFRoZXNlIGltcGxlbWVudGluZyBwYXJ0bmVycyBjb3JyZXNwb25kZWQgdG8gYSB0b3RhbCBvZiBgciBmc2MgJT4lICBkaXN0aW5jdChyZXBvcnRfb3JnX2NvZGUpICU+JSBucm93KClgIHJlcG9ydGluZyBvcmdhbmlzYXRpb25zLiBUaGUgbGFyZ2VzdCByZXBvcnRpbmcgb3JnYW5pc2F0aW9uLCBvcmdfMjY5MCwgaGFkIDIxIGltcGxlbWVudGluZyBwYXJ0bmVycy4gQWxsIG90aGVyIHJlcG9ydGluZyBvcmdhbmlzYXRpb25zIGhhZCAxIG9yIDIgaW1wbGVtZW50aW5nIHBhcnRuZXJzLiAgIA0KDQpUaGUgaW50ZXJhY3RpdmUgcGxvdCBiZWxvdyBzaG93cyB0aGUgbnVtYmVyIG9mIGJlbmVmaWNpYXJpZXMgYW5kIHRvd25zaGlwcyByZWFjaGVkIGJ5IGltcGxlbWVudGluZyBwYXJ0bmVyLiANCg0KPGJyPg0KDQpgYGB7ciBwbG90bHktcGFydG5lci1zY2F0dGVyfQ0KDQpwYXJ0bmVyX3NjYXR0ZXIgPC0gZnNjICU+JSAgDQogIGdyb3VwX2J5KG9yZ19jb2RlKSAlPiUgDQogIHN1bW1hcmlzZShzdGF0ZXMgPSBuX2Rpc3RpbmN0KHN0YXRlKSwgDQogICAgICAgICAgICB0b3duc2hpcHMgPSBuX2Rpc3RpbmN0KGFkbWluM19wY29kZSksIA0KICAgICAgICAgICAgYmVuZWZpY2lhcmllcyA9IHN1bShuZXdfYmVuZWZpY2lhcmllcykpICU+JSANCiAgZ2dwbG90KGFlcyh4ID0gYmVuZWZpY2lhcmllcywgeSA9IHRvd25zaGlwcywgDQogICAgICAgICAgICAgdGV4dCA9IHBhc3RlMChvcmdfY29kZSwgIlxuIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAic3RhdGVzOiAiLCBzdGF0ZXMsICJcbiIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgInRvd25zaGlwczogIiwgdG93bnNoaXBzLCAiXG4iLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJiZW5lZmljaWFyaWVzOiAiLCBjb21tYShiZW5lZmljaWFyaWVzLCBhY2N1cmFjeSA9IDEpKSkpICsgDQogIGdlb21fcG9pbnQoYWVzKHNpemUgPSBiZW5lZmljaWFyaWVzKSwgYWxwaGEgPSAuNykgKyANCiAgc2NhbGVfeF9jb250aW51b3VzKHRyYW5zID0gImxvZyIsIGxhYmVscyA9IGNvbW1hLCBicmVha3MgPSBjKDAsIDEwMCwgMzAwLCAxMDAwLCAzMDAwLCAxMDAwMCwgMzAwMDAsIDEwMDAwMCwgMzAwMDAwKSkgKw0KICBzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDAsIDI1LCA1KSkgKw0KICBsYWJzKHggPSAiTnVtYmVyIG9mIGJlbmVmaWNpYXJpZXMiLA0KICAgICAgIHkgPSAiTnVtYmVyIG9mIHRvd25zaGlwcyIsDQogICAgICAgdGl0bGUgPSAiUGxvdCBvZiBiZW5lZmljaWFyaWVzIGFuZCB0b3duc2hpcHMgcmVhY2hlZCwgYnkgaW1wbGVtZW50aW5nIHBhcnRuZXIiKSArDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikNCg0KZ2dwbG90bHkocGFydG5lcl9zY2F0dGVyLCB0b29sdGlwID0gYygidGV4dCIpLCB3aWR0aCA9IDgyMCkgJT4lDQogIGNvbmZpZyhkaXNwbGF5TW9kZUJhciA9IEZBTFNFKSAlPiUgDQogIGxheW91dCh0aXRsZSA9IGxpc3QodGV4dCA9IHBhc3RlMCgiUGxvdCBvZiBiZW5lZmljaWFyaWVzIGFuZCB0b3duc2hpcHMgcmVhY2hlZCwgYnkgaW1wbGVtZW50aW5nIHBhcnRuZXIiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxicj4iLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8c3VwPiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibW91c2Ugb3ZlciBmb3IgZGV0YWlscyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPC9zdXA+IikpKQ0KYGBgDQoNCjxicj4NCg0KSW4gMjAyMSwgaXQgd2FzIG5vdGVkIHRoYXQgd2hpbHN0IHRoZXJlIHdhcyBtdWNoIHZhcmlhdGlvbiBpbiB0aGUgbnVtYmVycyBvZiBiZW5lZmljaWFyaWVzIHJlYWNoZWQgYnkgZWFjaCBpbXBsZW1lbnRpbmcgcGFydG5lciwgdGhlaXIgZ2VvZ3JhcGhpYyBmb290cHJpbnRzIHdlcmUgcXVpdGUgbGltaXRlZC4gVGhpcyBwYXR0ZXJuIGhhcyBjb250aW51ZWQgaW50byAyMDIyL1ExLiBPbmx5IGByIGZzYyAlPiUgZ3JvdXBfYnkob3JnX2NvZGUpICU+JSBzdW1tYXJpc2UodG93bnNoaXBzID0gbl9kaXN0aW5jdChhZG1pbjNfcGNvZGUpKSAlPiUgZmlsdGVyKHRvd25zaGlwcyA+IDUpICU+JSBucm93KClgIHBhcnRuZXJzICgxNyUgb2YgdGhlIHRvdGFsKSBoYXZlIGEgcHJlc2VuY2UgaW4gbW9yZSB0aGFuIDUgdG93bnNoaXBzLiBUaGUgZGlzdHJpYnV0aW9uIG9mIHBhcnRuZXJzIHJlbWFpbnMgYW4gaW1wZWRpbWVudCB0byB0aGUgaW1wbGVtZW50YXRpb24gb2YgYSBjb3VudHJ5d2lkZSByZXNwb25zZS4gQW5kIHRoZSBmb2xsb3dpbmcgc3RlcHMgbWVudGlvbmVkIGluIHRoZSAyMDIxIHJlcG9ydCBhcmUgc3RpbGwgdmVyeSBuZWNlc3Nhcnk6IA0KDQoqIEluY2VudGl2aXNlIHBhcnRuZXJzIHRvIGV4cGFuZCB0aGVpciBmb290cHJpbnRzDQoNCiogSWRlbnRpZnkgbmV3IHBhcnRuZXJzIHRvIHJlYWNoIHZ1bG5lcmFibGUgcGVyc29ucyBpbiBhcmVhcyByZWNlbnRseSBhZmZlY3RlZCBieSBjb25mbGljdA0KDQoqIEVuY291cmFnZSBkb25vcnMgdG8gc3VwcG9ydCBleHBhbnNpb24gb2YgRm9vZCBTZWN1cml0eSBhY3Rpdml0aWVzIGluIGFyZWFzIHJlY2VudGx5IGFmZmVjdGVkIGJ5IGNvbmZsaWN0ICh3aXRoIHN1ZmZpY2llbnQgc3VwcG9ydCBjb3N0cykNCg0KPGJyPjxicj4NCg0KIyMjIDUuMiBNb250aGx5IHByb2dyZXNzIGJ5IHBhcnRuZXINCg0KYGBge3IgcGFydG5lci1wcm9ncmVzcy1mYWNldC1saW5lfQ0KDQpwYXJ0bmVyX3RvcCA8LSBmc2MgJT4lIA0KICBzdW1fYmVuKG9yZ19jb2RlKSAlPiUgYXJyYW5nZShkZXNjKGJlbmVmaWNpYXJpZXMpKSAlPiUgIG11dGF0ZShvcmdfY29kZSA9IHJlb3JkZXIob3JnX2NvZGUsIC1iZW5lZmljaWFyaWVzKSkgJT4lIHB1bGwob3JnX2NvZGUpICU+JSBoZWFkKDIwKQ0KDQpmc2MgJT4lDQogIGZpbHRlcihvcmdfY29kZSAlaW4lIHBhcnRuZXJfdG9wKSAlPiUNCiAgc2VsZWN0KGRhdGUsIG9yZ19jb2RlLCBiZW5lZmljaWFyaWVzID0gbmV3X2JlbmVmaWNpYXJpZXMsIGxvY2F0aW9uLCBhZG1pbjNfcGNvZGUpICU+JSANCiAgcmJpbmQoZnNjXzIwMjEgJT4lIA0KICAgICAgICAgIGZpbHRlcih1bmlxdWVfYmVuZWZpY2lhcmllcyA9PSAiWWVzIikgJT4lIA0KICAgICAgICAgIGZpbHRlcihvcmdfY29kZSAlaW4lIHBhcnRuZXJfdG9wKSAlPiUgDQogICAgICAgICAgc2VsZWN0KGRhdGUsIG9yZ19jb2RlLCBiZW5lZmljaWFyaWVzLCBsb2NhdGlvbiwgYWRtaW4zX3Bjb2RlKSkgJT4lIA0KICBncm91cF9ieShsb2NhdGlvbiwgYWRtaW4zX3Bjb2RlKSAlPiUgDQogIHNsaWNlKHdoaWNoLm1heChiZW5lZmljaWFyaWVzKSkgJT4lIA0KICBncm91cF9ieShvcmdfY29kZSkgJT4lIA0KICBhcnJhbmdlKGRhdGUpICU+JSANCiAgbXV0YXRlKGN1bV9iZW4gPSBjdW1zdW0oYmVuZWZpY2lhcmllcykpICU+JSANCiAgZ2dwbG90KGFlcyh4ID0gZGF0ZSwgeSA9IGN1bV9iZW4pKSArDQogIGdlb21fc3RlcChzaXplID0gMC41KSArIA0KICBzY2FsZV94X2RhdGUoZGF0ZV9icmVha3MgPSAiMSBtb250aCIsIGRhdGVfbGFiZWxzID0gIiViIikgKw0KICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gY29tbWEpICsNCiAgZ2VvbV92bGluZShjb2xvdXIgPSAicmVkIiwgbHR5ID0gMiwgeGludGVyY2VwdCA9IGFzLm51bWVyaWMoYXMuRGF0ZSgiMjAyMS0wNi0wMSIpKSwgYWxwaGEgPSAuNSkgKw0KICBnZW9tX3ZsaW5lKGNvbG91ciA9ICJyZWQiLCBsdHkgPSAyLCB4aW50ZXJjZXB0ID0gYXMubnVtZXJpYyhhcy5EYXRlKCIyMDIyLTAxLTAxIikpLCBhbHBoYSA9IC41KSArDQogIGZhY2V0X3dyYXAofiBmY3RfcmV2KGZjdF9yZW9yZGVyKG9yZ19jb2RlLCBjdW1fYmVuLCBtYXgpKSwgc2NhbGVzID0gImZyZWVfeSIpICsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiLA0KICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMy41LCBhbmdsZSA9IDYwKSwNCiAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDQpLA0KICAgICAgICBzdHJpcC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSA0LjUsIGZhY2UgPSAiYm9sZCIpKSArICMgc2VlIGlmIHRoaXMgd29ya3Mgd2hlbiB5b3Uga25pdCwgdGhlbiBkbyBpdCBmb3IgdGhlIG90aGVyIHBsb3RzIA0KICBsYWJzKHggPSAiTW9udGgiLCANCiAgICAgICB5ID0gIkN1bXVsYXRpdmUgYmVuZWZpY2lhcmllcyIsIA0KICAgICAgIHRpdGxlID0gIk1vbnRobHkgcHJvZ3Jlc3Mgb2YgdG9wIDIwIGltcGxlbWVudGluZyBwYXJ0bmVycywgMjAyMS0yMDIyL1ExIiwgDQogICAgICAgc3VidGl0bGUgPSAiRmlndXJlcyBzaG93IGN1bXVsYXRpdmUgdW5pcXVlIGJlbmVmaWNpYXJpZXMiKSArIA0KICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMSkpDQoNCiMgZ2dzYXZlKCJwYXJ0bmVyX2ZhY2V0X2xpbmUucG5nIiwgZHBpID0gMzAwLCBoZWlnaHQgPSA1LCB3aWR0aCA9IDgsIHVuaXRzID0gImluIikgIA0KYGBgDQoNCjxicj4NCg0KT3ZlcmFsbCwgMTMgaW1wbGVtZW50aW5nIHBhcnRuZXJzIGluY3JlYXNlZCB0aGUgbnVtYmVyIG9mIGJlbmVmaWNpYXJpZXMgcmVhY2hlZCBvdmVyIHRoZWlyIDIwMjEgdG90YWxzIGJ5IG1vcmUgdGhhbiA1MCU7IDI5IHBhcnRuZXJzIHdobyByZXBvcnRlZCBpbiAyMDIxIGFsc28gcmVwb3J0ZWQgaW4gMjAyMi9RMS4gNyBuZXcgaW1wbGVtZW50aW5nIHBhcnRuZXJzIHJlcG9ydGVkIGluIDIwMjIuIEFuZCAyOCBwYXJ0bmVycyB3aG8gcmVwb3J0ZWQgaW4gMjAyMSBidXQgaGF2ZSBub3QgeWV0IHJlYWNoZWQgYW55IGJlbmVmaWNpYXJpZXMgaW4gMjAyMi4gDQoNCmBgYHtyfQ0KZnNjICU+JQ0KICBzZWxlY3QoZGF0ZSwgb3JnX2NvZGUsIGJlbmVmaWNpYXJpZXMgPSBuZXdfYmVuZWZpY2lhcmllcywgbG9jYXRpb24sIGFkbWluM19wY29kZSkgJT4lIA0KICByYmluZChmc2NfMjAyMSAlPiUgDQogICAgICAgICAgZmlsdGVyKHVuaXF1ZV9iZW5lZmljaWFyaWVzID09ICJZZXMiKSAlPiUgDQogICAgICAgICAgc2VsZWN0KGRhdGUsIG9yZ19jb2RlLCBiZW5lZmljaWFyaWVzLCBsb2NhdGlvbiwgYWRtaW4zX3Bjb2RlKSkgJT4lIA0KICBncm91cF9ieShsb2NhdGlvbiwgYWRtaW4zX3Bjb2RlKSAlPiUgDQogIHNsaWNlKHdoaWNoLm1heChiZW5lZmljaWFyaWVzKSkgJT4lIA0KICBncm91cF9ieShvcmdfY29kZSwgeWVhciA9IHllYXIoZGF0ZSkpICU+JSANCiAgc3VtbWFyaXNlKGJlbmVmaWNpYXJpZXMgPSBzdW0oYmVuZWZpY2lhcmllcykpICU+JQ0KICBwaXZvdF93aWRlcihuYW1lc19mcm9tID0geWVhciwgdmFsdWVzX2Zyb20gPSBiZW5lZmljaWFyaWVzLCBuYW1lc19wcmVmaXggPSAiYmVuXyIpICU+JSANCiAgcm93d2lzZSgpICU+JSANCiAgbXV0YXRlKHRvdGFsX2JlbiA9IHN1bShiZW5fMjAyMSwgYmVuXzIwMjIsIG5hLnJtID0gVFJVRSkpICU+JSANCiAgdW5ncm91cCgpICU+JSANCiAgbXV0YXRlKHJhbmtfMjAyMSA9IGRlbnNlX3JhbmsoLWJlbl8yMDIxKSwgDQogICAgICAgICByYW5rXzIwMjIgPSBkZW5zZV9yYW5rKC1iZW5fMjAyMikpICU+JSANCiAgYXJyYW5nZShkZXNjKGJlbl8yMDIyKSkgJT4lIA0KICBzZWxlY3Qob3JnX2NvZGUsIGJlbl8yMDIxLCByYW5rXzIwMjEsIGJlbl8yMDIyLCByYW5rXzIwMjIsIHRvdGFsX2JlbikgJT4lIA0KICBoZWFkKDIwKSAlPiUgDQogIGthYmxlKGNhcHRpb24gPSAiVG9wIGltcGxlbWVudGluZyBwYXJ0bmVycyBieSBiZW5lZmljaWFyaWVzIHJlYWNoZWQgaW4gMjAyMi9RMSIsIGZvcm1hdC5hcmdzID0gbGlzdChiaWcubWFyayA9ICIsIikpICU+JSANCiAga2FibGVfY2xhc3NpY18yKCJzdHJpcGVkIikgDQpgYGANCg0KPGJyPjxicj4NCg0KIyMjIDUuMyBEb25vcnMNCg0KQXMgc2hvd24gYnkgdGhlIHRhYmxlIGJlbG93LCB0aGUgbWFqb3JpdHkgb2YgYmVuZWZpY2lhcmllcyByZXBvcnRlZCBpbiB0aGUgZmlyc3QgcXVhcnRlciBvZiAyMDIyL1ExIHdlcmUgcmVwb3J0ZWQgd2l0aG91dCBhbnkgY29ycmVzcG9uZGluZyBkb25vciwgYXMgaW4gMjAyMS4gVGhlIGRhdGEgaW4gdGhpcyBjb2x1bW4gY29udGludWVzIG9mIGxpbWl0ZWQgdXRpbGl0eSBpbiBhbmFseXNpcy4gDQoNCmBgYHtyIHRhYmxlLWRvbm9yc30NCmZzYyAlPiUgDQogIGdyb3VwX2J5KGRvbm9yKSAlPiUgDQogIHN1bW1hcmlzZShiZW5lZmljaWFyaWVzID0gc3VtKG5ld19iZW5lZmljaWFyaWVzKSkgJT4lIA0KICBtdXRhdGUoZG9ub3IgPSBpZmVsc2UoaXMubmEoZG9ub3IpLCAiTm8gZG9ub3Igc3BlY2lmaWVkIiwgZG9ub3IpLCANCiAgICAgICAgIGRvbm9yID0gaWZlbHNlKGJlbmVmaWNpYXJpZXMgPCAxMDAwLCAiT3RoZXIgZG9ub3JzIiwgZG9ub3IpKSAlPiUgDQogIGdyb3VwX2J5KGRvbm9yKSAlPiUgDQogIHN1bW1hcmlzZShiZW5lZmljaWFyaWVzID0gc3VtKGJlbmVmaWNpYXJpZXMpKSAlPiUgDQogIG11dGF0ZShgJV9iZW5lZmljaWFyaWVzYCA9IHJvdW5kKGJlbmVmaWNpYXJpZXMgLyBzdW0oYmVuZWZpY2lhcmllcykgKiAxMDAsIGRpZ2l0cyA9IDIpKSAlPiUgDQogIGFycmFuZ2UoZGVzYyhgJV9iZW5lZmljaWFyaWVzYCkpICU+JSANCiAga2FibGUoY2FwdGlvbiA9ICJUb3AgZG9ub3JzIGJ5IGJlbmVmaWNpYXJpZXMgcmVhY2hlZCIsIA0KICAgICAgICBmb3JtYXQuYXJncyA9IGxpc3QoYmlnLm1hcmsgPSAiLCIpKSAlPiUgDQogIGthYmxlX2NsYXNzaWNfMigic3RyaXBlZCIsIGZ1bGxfd2lkdGggPSBGQUxTRSkNCiANCmBgYA0KDQoNCg0KDQo8YnI+PGJyPjxicj4NCg0KIyMgNi4gQ29tcGFyaXNvbiB3aXRoIHRhcmdldHMgDQoNCiMjIyA2LjIgUmVhY2hlZCB2cyB0YXJnZXQgYnkgdG93bnNoaXANCg0KVGhlIHNwZWNpZmljcyBvZiBlYWNoIHRvd25zaGlwIGNhbiBiZSByZXZpZXdlZCB3aXRoIHRoZSBpbnRlcmFjdGl2ZSBwbG90IGJlbG93LiBFYWNoIHBvaW50IGlzIGEgdG93bnNoaXAsIHdpdGggdGhlIHNpemUgaW5kaWNhdGluZyB0aGUgbnVtYmVyIG9mIGJlbmVmaWNpYXJpZXMuIFRoZSB4LWF4aXMgaW5kaWNhdGVzIHRoZSB0YXJnZXQgcG9wdWxhdGlvbiBieSB0b3duc2hpcCBhbmQgdGhlIHktYXhpcyBzaG93cyB0aGUgbnVtYmVyIG9mIGJlbmVmaWNpYXJpZXMgcmVhY2hlZCBpbiAyMDIyL1ExLiANCg0KVGhlIHJlZCBsaW5lIGRvd24gdGhlIG1pZGRsZSByZXByZXNlbnRzIHJlYWNoaW5nIDEwMCUgb2YgdGhlIHRhcmdldC4gVG93bnNoaXBzIGFib3ZlIHRoaXMgbGluZSBoYXZlIHJlYWNoZWQgbW9yZSBiZW5lZmljaWFyaWVzIHRoYW4gdGhlaXIgdGFyZ2V0IGFuZCB0b3duc2hpcHMgYmVsb3cgdGhlIGxpbmUgaGF2ZSBub3QgbWV0IHRoZWlyIHRhcmdldCB5ZXQuIFRoZSBmdXJ0aGVyIGF3YXkgYSB0b3duc2hpcCBpcyBmcm9tIHRoZSByZWQgbGluZSwgdGhlIGZ1cnRoZXIgYWJvdmUgb3IgYmVsb3cgaXRzIHRhcmdldCBpdCBpcy4gTW91c2Ugb3ZlciBlYWNoIG9mIHRoZSB0b3duc2hpcHMgdG8gc2VlIG1vcmUgZGV0YWlscy4gDQoNClRoZSAxMiB0b3duc2hpcHMgYWxvbmcgdGhlIGV4dHJlbWUgbGVmdCBzaWRlIG9mIHRoZSBwbG90IGhhdmUgYmVuZWZpY2lhcmllcyBidXQgZG8gbm90IGhhdmUgdGFyZ2V0cyAodGhlaXIgdGFyZ2V0cyBoYXZlIGp1c3QgYmVlbiBjb2RlZCBhcyAkMSQgc28gdGhhdCB0aGV5IHNob3cgdXAgb24gdGhlIHBsb3QpLiAyMzAgdG93bnNoaXBzIHdpdGggdGFyZ2V0cyBoYXZlIG5vdCBiZWVuIHJlYWNoZWQuIA0KDQo8YnI+DQoNCmBgYHtyIHBsb3RseS10c3AtY29tcGFyaXNvbi1yZWFjaGVkLXRhcmdldH0NCg0KYmVuX3RhcmdldCA8LSBmc2MgJT4lIA0KICBncm91cF9ieShhZG1pbjNfcGNvZGVfb2xkKSAlPiUgDQogIHN1bW1hcmlzZShiZW5lZmljaWFyaWVzID0gc3VtKG5ld19iZW5lZmljaWFyaWVzKSwNCiAgICAgICAgICAgIHBhcnRuZXJzID0gbl9kaXN0aW5jdChvcmdfY29kZSkpICU+JSANCiAgbGVmdF9qb2luKHBpbiwgYnkgPSBjKCJhZG1pbjNfcGNvZGVfb2xkIiA9ICJhZG1pbjNfcGNvZGUiKSkgJT4lIA0KICBtdXRhdGUocmVhY2hlZF9wYyA9IGJlbmVmaWNpYXJpZXMgLyBmc190YXJnZXRlZCwNCiAgICAgICAgIHJlYWNoZWRfcGMgPSBpZmVsc2UoaXMuaW5maW5pdGUocmVhY2hlZF9wYyksIDEsIHJlYWNoZWRfcGMpLA0KICAgICAgICAgZnNfdGFyZ2V0ZWQgPSBpZmVsc2UoZnNfdGFyZ2V0ZWQgPT0gMCAmIGJlbmVmaWNpYXJpZXMgPiAwLCAxLCBmc190YXJnZXRlZCksDQogICAgICAgICBmc190YXJnZXRlZCA9IHJvdW5kKGZzX3RhcmdldGVkLCBkaWdpdHMgPSAwKSkgJT4lIA0KICBhcnJhbmdlKGRlc2MocmVhY2hlZF9wYykpICU+JSANCiAgc2VsZWN0KHN0YXRlLCB0b3duc2hpcCwgZnNfcGluLCBmc190YXJnZXRlZCwgYmVuZWZpY2lhcmllcywgcmVhY2hlZF9wYywgcGFydG5lcnMpICU+JQ0KICBnZ3Bsb3QoYWVzKHggPSBmc190YXJnZXRlZCwgeSA9IGJlbmVmaWNpYXJpZXMsIGNvbG91ciA9IHBhcnRuZXJzLCANCiAgICAgICAgICAgICB0ZXh0ID0gcGFzdGUwKHRvd25zaGlwLCAiLCIsICJcbiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSwgIiwiLCAiXG4iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgImJlbmVmaWNpYXJpZXM6ICIsIGNvbW1hKGJlbmVmaWNpYXJpZXMsIGFjY3VyYWN5ID0gMSksICJcbiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAidGFyZ2V0OiAiLCBjb21tYShmc190YXJnZXRlZCwgYWNjdXJhY3kgPSAxKSwgIlxuIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICIlIG9mIHRhcmdldDogIiwgcGVyY2VudChyZWFjaGVkX3BjLCBhY2N1cmFjeSA9IDIpLCAiXG4iLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJwYXJ0bmVyczogIiwgcGFydG5lcnMpKSkgKyANCiAgZ2VvbV9hYmxpbmUoaW50ZXJjZXB0ID0gMCwgc2xvcGUgPSAxLCBsdHkgPSAyLCBjb2xvdXIgPSAicmVkIikgKyANCiAgZ2VvbV9wb2ludChhZXMoc2l6ZSA9IGJlbmVmaWNpYXJpZXMpLCBhbHBoYSA9IDAuOCkgKw0KICBzY2FsZV9zaXplX2NvbnRpbnVvdXMoZ3VpZGUgPSAibm9uZSIpICsgDQogIHNjYWxlX3hfY29udGludW91cyh0cmFucyA9ICJsb2cxMCIsIGxhYmVscyA9IGNvbW1hKSArIA0KICBzY2FsZV95X2NvbnRpbnVvdXModHJhbnMgPSAibG9nMTAiLCBsYWJlbHMgPSBjb21tYSkgKw0KICBzY2FsZV9jb2xvdXJfdmlyaWRpcyhkaXJlY3Rpb24gPSAtMSkgKw0KICBsYWJzKHggPSAiVGFyZ2V0ZWQgcG9wdWxhdGlvbiIsIHkgPSAiQmVuZWZpY2lhcmllcyIsIA0KICAgICAgIHRpdGxlID0gIkJlbmVmaWNpYXJpZXMgcmVhY2hlZCB2cyB0YXJnZXRlZCBwb3B1bGF0aW9uIGJ5IHRvd25zaGlwLCBRMSAyMDIyIiwNCiAgICAgICBzdWJ0aXRsZSA9ICJUaGUgcmVkIGxpbmUgaXMgMTAwJSBvZiB0YXJnZXQiKSArIA0KICB0aGVtZShsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDcpKQ0KDQpnZ3Bsb3RseShiZW5fdGFyZ2V0LCB0b29sdGlwID0gYygidGV4dCIpLCB3aWR0aCA9IDgyMCwgaGVpZ2h0ID0gNTAwKSAlPiUgDQogIGNvbmZpZyhkaXNwbGF5TW9kZUJhciA9IEZBTFNFKSAlPiUgDQogIGxheW91dCh0aXRsZSA9IGxpc3QodGV4dCA9IHBhc3RlMCgiQmVuZWZpY2lhcmllcyByZWFjaGVkIHZzIHRhcmdldGVkIHBvcHVsYXRpb24gYnkgdG93bnNoaXAsIFExIDIwMjIiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxicj4iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxzdXA+IiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUaGUgcmVkIGxpbmUgaXMgMTAwJSBvZiB0YXJnZXQ7IHNpemUgaW5kaWNhdGVzIG51bWJlciBvZiBiZW5lZmljaWFyaWVzIiwiPC9zdXA+IikpLCANCiAgICAgICAgIGxlZ2VuZCA9IGxpc3QoZm9udCA9IGxpc3Qoc2l6ZSA9IDcpKSkNCg0KYGBgDQoNCjxicj48YnI+DQoNCiMjIyA2LjIgTWFwIG9mIGJlbmVmaWNpYXJpZXMgcmVhY2hlZCBpbiAyMDIyL1ExIHZzIHRhcmdldA0KDQpgYGB7ciBtYXBzLWJlbi10YXJnZXQsIGZpZy5oZWlnaHQ9OX0NCmZzYyAlPiUgDQogIGdyb3VwX2J5KGFkbWluM19wY29kZSA9IGFkbWluM19wY29kZV9vbGQpICU+JSANCiAgc3VtbWFyaXNlKGJlbmVmaWNpYXJpZXMgPSBzdW0oYmVuZWZpY2lhcmllcykpICU+JSANCiAgcmlnaHRfam9pbihwY29kZTNfc2hhcGUsIGJ5ID0gYygiYWRtaW4zX3Bjb2RlIikpICU+JSANCiAgc3RfYXNfc2YoKSAlPiUgDQogIGdncGxvdCgpICsNCiAgZ2VvbV9zZihhZXMoZmlsbCA9IGJlbmVmaWNpYXJpZXMpLCBzaXplID0gMC4xKSArDQogIHNjYWxlX2ZpbGxfdmlyaWRpc19jKGRpcmVjdGlvbiA9IC0xLCB0cmFucyA9ICJsb2cxMCIsIA0KICAgICAgICAgICAgICAgICAgICAgICBicmVha3MgPSBjKDEwMCwgMTAwMCwgMTAwMDAsIDEwMDAwMCwgNTAwMDAwKSwNCiAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gY29tbWEpICsgDQogIHRoZW1lX3ZvaWQoKSArDQogIHRoZW1lKGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMCksDQogICAgICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTApLA0KICAgICAgICBsZWdlbmQua2V5LnNpemUgPSB1bml0KDAuNywgJ2NtJyksIA0KICAgICAgICBwbG90LmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJ3aGl0ZSIsIGNvbG91ciA9ICJ3aGl0ZSIpKSArDQogIGxhYnModGl0bGUgPSAiQmVuZWZpY2lhcmllcyBieSB0b3duc2hpcCwgUTEgMjAyMiIsDQogICAgICAgc3VidGl0bGUgPSAidG93bnNoaXBzIGluIGdyZXkgZG8gbm90IGhhdmUgYW55IHBhcnRuZXJzIHByZXNlbnQiLCANCiAgICAgICBmaWxsID0gIkJlbmVmaWNpYXJpZXMiKSANCg0KIyBnZ3NhdmUoImJlbmVmaWNpYXJpZXNfYnlfdHNwLnBuZyIsIGRwaSA9IDMwMCwgaGVpZ2h0ID0gMTgsIHdpZHRoID0gMTEsIHVuaXRzID0gImluIikNCg0KcGluICU+JSANCiAgcmlnaHRfam9pbihwY29kZTNfc2hhcGUsIGJ5ID0gImFkbWluM19wY29kZSIpICU+JSANCiAgc3RfYXNfc2YoKSAlPiUgIA0KICBnZ3Bsb3QoKSArIA0KICBnZW9tX3NmKGFlcyhmaWxsID0gZnNfdGFyZ2V0ZWQpLCBzaXplID0gLjEpICsgDQogIHNjYWxlX2ZpbGxfdmlyaWRpc19jKGRpcmVjdGlvbiA9IC0xLCB0cmFucyA9ICJsb2cxMCIsICANCiAgICAgICAgICAgICAgICAgICAgICAgYnJlYWtzID0gYygxMDAsIDEwMDAsIDEwMDAwLCAxMDAwMDAsIDUwMDAwMCksDQogICAgICAgICAgICAgICAgICAgICAgIGxpbWl0cyA9IHJhbmdlKDU3LCA4MDE3NjApLCANCiAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gY29tbWEpICsgDQogIHRoZW1lX3ZvaWQoKSArIA0KICB0aGVtZShsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTApLA0KICAgICAgICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTApLA0KICAgICAgICAgIGxlZ2VuZC5rZXkuc2l6ZSA9IHVuaXQoMC43LCAnY20nKSwgDQogICAgICAgIHBsb3QuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gIndoaXRlIiwgY29sb3VyID0gIndoaXRlIikpICsNCiAgICBsYWJzKHRpdGxlID0gIjIwMjIgdGFyZ2V0IGJ5IHRvd25zaGlwIiwNCiAgICAgICAgIHN1YnRpdGxlID0gInRvd25zaGlwcyBpbiBncmV5IGRvIG5vdCBmb29kIHNlY3VyaXR5IHRhcmdldHMiLCANCiAgICAgICAgIGZpbGwgPSAidGFyZ2V0IikNCg0KIyBnZ3NhdmUoInRhcmdldF9ieV90c3AucG5nIiwgZHBpID0gMzAwLCBoZWlnaHQgPSAxOCwgd2lkdGggPSAxMSwgdW5pdHMgPSAiaW4iKQ0KDQoNCnBpbiAlPiUgDQogIHJpZ2h0X2pvaW4ocGNvZGUzX3NoYXBlLCBieSA9ICJhZG1pbjNfcGNvZGUiKSAlPiUgDQogIHN0X2FzX3NmKCkgJT4lICANCiAgZ2dwbG90KCkgKyANCiAgZ2VvbV9zZihhZXMoZmlsbCA9IGZzX3BpbiksIHNpemUgPSAuMSkgKyANCiAgc2NhbGVfZmlsbF92aXJpZGlzX2MoZGlyZWN0aW9uID0gLTEsIHRyYW5zID0gImxvZzEwIiwgIA0KICAgICAgICAgICAgICAgICAgICAgICBicmVha3MgPSBjKDEwMCwgMTAwMCwgMTAwMDAsIDEwMDAwMCwgNTAwMDAwKSwNCiAgICAgICAgICAgICAgICAgICAgICAgbGltaXRzID0gcmFuZ2UoNTcsIDgwMTc2MCksIA0KICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjb21tYSkgKyANCiAgdGhlbWVfdm9pZCgpICsgDQogIHRoZW1lKGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMCksDQogICAgICAgICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMCksDQogICAgICAgICAgbGVnZW5kLmtleS5zaXplID0gdW5pdCgwLjcsICdjbScpLCANCiAgICAgICAgcGxvdC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAid2hpdGUiLCBjb2xvdXIgPSAid2hpdGUiKSkgKw0KICAgIGxhYnModGl0bGUgPSAiMjAyMiBQSU4gYnkgdG93bnNoaXAiLA0KICAgICAgICAgc3VidGl0bGUgPSAidG93bnNoaXBzIGluIGdyZXkgaGF2ZSBub3QgeWV0IGhhZCBhIFBJTiBjYWxjdWxhdGVkIiwgDQogICAgICAgICBmaWxsID0gIlBJTiIpDQoNCiMgZ2dzYXZlKCJwaW5fYnlfdHNwLnBuZyIsIGRwaSA9IDMwMCwgaGVpZ2h0ID0gMTgsIHdpZHRoID0gMTEsIHVuaXRzID0gImluIikNCg0KYGBgDQo8YnI+DQoNCldpdGggdGhlIGltcG9ydGFudCBleGNlcHRpb25zIG9mIFlhbmdvbiBhbmQgdGhlIFNvdXRoZWFzdCwgYmVuZWZpY2lhcmllcyBhcmUgY29uY2VudHJhdGVkIGluIHRoZSBwZXJpcGhlcmFsIGFuZCBib3JkZXIgcmVnaW9ucyBvZiB0aGUgdW5pb24sIHdoZXJlIGh1bWFuaXRhcmlhbiBhY3RvcnMgaGF2ZSB0cmFkaXRpb25hbGx5IGJlZW4gcHJlc2VudC4gQXMgbWVudGlvbmVkIGluIHByZXZpb3VzIHJlcG9ydHMsIHRoaXMgaXMgbm90IGNvbnNpc3RlbnQgd2l0aCB0aGUgY3VycmVudCBwYXR0ZXJucyBvZiBuZWVkcyBhbmQgdnVsbmVyYWJpbGl0eS4NCg0KPGJyPjxicj48YnI+DQoNCiMjIyA2LjMgSW50ZXJhY3RpdmUgcmVmZXJlbmNlIHRhYmxlDQoNClRoZXJlIHdhcyBhbiBvdmVyYWxsb2NhdGlvbiBvZiByZXNvdXJjZXMgaW4gdGhlc2UgcmVsYXRpdmVseSBmZXcgYXJlYXMgaW4gMjAyMSBhbmQgdGhpcyBoYXMgY29udGludWVkIGluIHRoZSBmaXJzdCBxdWFydGVyIG9mIDIwMjIuIEluIHRoZSBpbnRlcmFjdGl2ZSB0YWJsZSBiZWxvdywgaXMgYSBsaXN0IG9mIHRvd25zaGlwcyBzb3J0ZWQgYnkgdGhlIGdhcCBiZXR3ZWVuIHRoZSB0YXJnZXRlZCBwb3B1bGF0aW9uIGFuZCBiZW5lZmljaWFyaWVzIHJlYWNoZWQgaW4gMjAyMi4gQW55IG9mIHRoZSBjb2x1bW5zIGNhbiBiZSBzb3J0OyB0aGUgc2VhcmNoIGJhcnMgYWJvdmUgZWFjaCBjb2x1bW4gY2FuIGFsc28gYXNzaXN0IGluIGZpbHRlcmluZy4gDQoNCjxicj4NCg0KYGBge3J9DQpmc2MgJT4lIA0KICBncm91cF9ieShhZG1pbjNfcGNvZGVfb2xkKSAlPiUgDQogIHN1bW1hcmlzZShiZW5lZmljaWFyaWVzID0gc3VtKG5ld19iZW5lZmljaWFyaWVzKSwNCiAgICAgICAgICAgIHBhcnRuZXJzID0gbl9kaXN0aW5jdChvcmdfY29kZSkpICU+JSANCiAgcmlnaHRfam9pbihwaW4sIGJ5ID0gYygiYWRtaW4zX3Bjb2RlX29sZCIgPSAiYWRtaW4zX3Bjb2RlIikpICU+JSANCiAgcmVwbGFjZV9uYShsaXN0KGJlbmVmaWNpYXJpZXMgPSAwKSkgJT4lDQogIG11dGF0ZShyZWFjaGVkX3BjID0gYmVuZWZpY2lhcmllcyAvIGZzX3RhcmdldGVkLA0KICAgICAgICAgcmVhY2hlZF9wYyA9IGlmZWxzZShpcy5pbmZpbml0ZShyZWFjaGVkX3BjKSwgMSwgcmVhY2hlZF9wYyksDQogICAgICAgICByZWFjaGVkX3BjID0gcm91bmQocmVhY2hlZF9wYyAqIDEwMCwgZGlnaXRzID0gMiksIA0KICAgICAgICAgZnNfdGFyZ2V0ZWQgPSByb3VuZChmc190YXJnZXRlZCwgZGlnaXRzID0gMCksIA0KICAgICAgICAgb3ZlcnJlYWNoID0gYmVuZWZpY2lhcmllcyAtIGZzX3RhcmdldGVkKSAlPiUgDQogIGFycmFuZ2UoZGVzYyhvdmVycmVhY2gpKSAlPiUgDQogIHNlbGVjdChzdGF0ZSwgdG93bnNoaXAsIHRhcmdldCA9IGZzX3RhcmdldGVkLCBiZW5lZmljaWFyaWVzLCBvdmVycmVhY2gsIGAlX3JlYWNoZWRgID0gcmVhY2hlZF9wYywgcGFydG5lcnMpICU+JSANCiAgZGF0YXRhYmxlKG9wdGlvbnMgPSBsaXN0KHBhZ2VMZW5ndGggPSAxNSwgc2Nyb2xsWCA9IFRSVUUpLCANCiAgICAgICAgICAgIGZpbHRlciA9IGxpc3QocG9zaXRpb24gPSAidG9wIiwgY2xlYXIgPSBGQUxTRSksDQogICAgICAgICAgICBjYXB0aW9uID0gaHRtbHRvb2xzOjp0YWdzJGNhcHRpb24oc3R5bGUgPSAnY2FwdGlvbi1zaWRlOiB0b3A7IA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyOyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yOmJsYWNrOyBmb250LXNpemU6MTIwJSA7JywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJSZWZlcmVuY2UgdGFibGUgLS0gdG93bnNoaXBzIikpICU+JSANCiAgZm9ybWF0Um91bmQoYygidGFyZ2V0IiwgImJlbmVmaWNpYXJpZXMiLCAib3ZlcnJlYWNoIiksIGRpZ2l0cyA9IDApICU+JSANCiAgZm9ybWF0U3R5bGUoMCwgdGFyZ2V0ID0gInJvdyIsIGxpbmVIZWlnaHQgPSAiODAlIiwgZm9udFNpemUgPSAiODAlIikNCg0KDQoNCmBgYA0KDQoNCg0K