Section 1: Evolution of Australia’s Electricity Fuel Mix

This stacked area plot shows Australia’s annual electricity generation by different kinds of fuel from 1999 to 2024. The height of the stacked areas represents total generation each year. I also use different color indicating the contributions of coal, natural gas, hydro, wind, solar and other renewables. The plot shows how the overall mix has gradually shifted from coal-dominated generation towards a more diversified and more renewable-based generation mix.

Fuel mix were dominated by coal for a long time, but clearly decrease in recent years: In early years, coal is a major fuel, which reflects Australia historically relied on coal power. Over time, the coal area become smaller year by year, which indicates a structural decrease in coal generation rather than short-term fluctuations.

Some renewables grow from zero to a significant share: Wind and especially solar start from zero in early years, but their areas expand extremely fast from the 2010s. This shows that renewable technologies have grown from a small role to a major part of generation mix.

So, we want to know why solar power develop so quickly and since solar power is not available at night, we also want to explore how Australia’s electricity supply mix differs between day and night.

Section 2: Day vs Night Generation Composition (NSW, last 7 days)

As before we have already shown the long-term changes in the fuel mix for 20 years: Coal power declined with wind/photovoltaic power/PV rising. After the review of long-term energy mix changes in the previous section, then we focus on daily data. It can Reveal the structural changes in the power system throughout the day after the massive penetration of renewable energy.

This set of charts clearly shows the evolution of the intraday power generation structure in New South Wales over the past seven days. It focus on showing how renewable energy is reshaping the power system over different time periods.

The stacked area map on the left depicts a typical “average 24-hour generation curve,” . It revealing significant differences in the power generation structure during the day versus night. As the early morning light intensifies, solar – including rooftop PV and large ground-based power plants – quickly climbs to a peak between 10 and 16 o’clock, creating the noticeable mid-section bulge in the image. This shows that solar energy has become an important pillar of daytime power generation, and has led to a characteristic “duck curve” at noon for the overall load, which is a direct reflection of the increasing proportion of photovoltaics in the power system.

However, as the sun gradually sets westward, the power generation structure changes rapidly in a short period of time. After 5 p.m., due to a sharp drop in solar output, coal power and some natural gas units need to quickly increase output to fill the gap, resulting in a noticeable ramp-up in the evening, which is also one of the most challenging times for the current NEM system in terms of scheduling and stability. After entering the night, solar energy completely exited the system, and the power generation structure was again dominated by coal power, indicating that the power supply at night is still highly dependent on fossil energy.

The two pie charts on the right further reinforce this conclusion. solar energy has become the main force in the proportion of daytime power generation, making fossil fuels significantly abdicate during the day; The power generation structure at night is almost entirely supported by coal, gas, and a small amount of wind power. This stark contrast shows a key paradox in Australia’s energy transition. Renewable energy penetration is already very high during the day, but there are not enough fossil-free alternatives at night. That means the energy system still needs to rely on traditional baseload power sources.

On the one hand, the development of photovoltaics significantly changed the power pattern and promoted the marginalization of coal power. On the other hand, the intermittent nature of solar energy highlights the need for energy storage, battery conditioning technology, and flexible gas-electricity.

Section 3: The Rapid Growth of Rooftop Solar in Australia

Australia’s initial growth stage (around 2011 to 2012) saw substantial growth in rooftop solar adoption in Australia. The establishment of various incentives such as Solar Homes and Communities Program (SHCP) and Renewable Energy Target (RET) policy from the Australian Government, with supplementary support from Feed-in Tariff subsidies in several Australian States, contributed to such growth.

But with the massive support in 2010-2012, there was tremendous pressure on state expenditures, such that each state was forced to take drastic steps to curb its momentum. Withdrawal of such favorable subsidies caused a short-term slow-down in their installation in the years that followed (2013-2016).

But perhaps most dramatically, the situation evolved in New South Wales, with installation costs escalating out of control, far in excess of expectations. Accordingly, in July 2011, applications for the heavily subsidized Solar Bonus Scheme were suddenly closed by the government. But this acted as a catalyst for seizing “the last train out,” inevitably followed by market collapse. Also, in July 2012, in Queensland, governments drastically reduced their 44 cents/kWh fee to just 8 cents. But again, after such drastic changes, with prolonged wait times, consumers showed less enthusiasm, while in late 2011, in Victoria, their Premium FiT scheme was suddenly ended. Without these subsidies, suddenly, there was talk about living with “winter” in the market (2013–2016), during which consumers had to wait on the sidelines.

During these years, deprived of substantial subsidies, consumers had to wait for further declines in the technological costs of solar panels until systems became economically viable without generous subsidies.

Just when all hopes seemed lost, with the market on the precipice of reaching its peak, there came a turning point, with innovation being the new savior, not the government. From 2016 onwards, innovation in the photovoltaic market reached its maturity, with costs for solar cell production being significantly reduced to less than half for a 5kW capacity in a short span, while innovations also increased their capacity to be utilized on residential scales (average capacity from 4kW to above 6kW).

But then, people realized: Solar installation was economical, even in no-subsidy scenarios! And so, again, there was a tremendous growth in the graphic, increasing steadily, yet reaching levels far exceeding those in the initial stage. Now, there was no bubble growth based on any policy, but ‘hard growth’ based on its economic appeal. Of Australia’s solar panels, finally, there was no need for subsidies, signifying full maturity.

Although 2025 appears to dip, but it’s just because the year has not ended yet. Of course, the tale for 2025 has yet to be told, and its demand looks promising.

Section 4: State-by-State Fuel Mix Changes

Australia’s energy transition is not uniform around the country, according to state-level charts. Black coal still dominates NSW and QLD, but solar and wind power are gaining popularity. With the majority of its power generated by renewable sources, particularly wind, SA provides the most advanced transition. VIC has the slowest transition to cleaner sources, continuing to rely on brown coal.

Black and brown coal together contribute to the majority of Australia’s energy generation, according to the national mix in 2015. Natural gas is smaller, and hydro, wind and solar only take a small share. This shows that the system was still mostly fossil-fuel based at that time.

By the latest year, the share of renewables increases significantly. Wind and solar expand their contributions, while coal’s share declines compared to the earlier period. This shows that Australia is slowly moving toward more renewable energy.

Section 5 – Key Insights and Outlook

Our visual story links four views of Australia’s electricity transition and shows some key insights:

• Long-term shift in the fuel mix (Section 1): Australia’s generation structure has gradually moved away from coal-dominated and now wind and solar take a larger share.

• Day vs night imbalance (Section 2): In New South Wales, solar has become a main source of daytime electricity, which replace part of coal generation during the day. However, at night, the system still relies heavily on coal and gas, which shows that it is still have a problem to run a grid with a high share of solar at night.

• Drivers of the rooftop solar boom (Section 3): Annual rooftop solar installations are very high in 2011–2012, fall to a much lower level in 2013–2016 after policy changes, and then increase again from 2017 and stay high in recent years. This shows that the rooftop solar market has moved from a short subsidy boom to a stable stage mainly due to lower costs.

• Uneven transition across states (Section 4): Some states, such as SA, already get most of their electricity from renewables. Others, like NSW and QLD, still rely heavily on coal, so the national transition is slower overall.

In general, these visualizations describe that Australia’s electricity system that is moving from coal-dominated to more solar and other kinds of renewable energy. In the future, Australia may need to manage night-time supply better and reduce regional gaps. These methods can increase a higher share of renewables.

LS0tDQp0aXRsZTogIkF1c3RyYWxpYW4gRWxlY3RyaWNpdHkgR3Jvd3RoIg0Kb3V0cHV0OiBodG1sX25vdGVib29rDQphdXRob3I6ICJHcm91cCAtLSBTbGVlcGxlc3MiDQotLS0NCg0KYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9DQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IEZBTFNFKQ0KYGBgDQoNCiMjIFNlY3Rpb24gMTogRXZvbHV0aW9uIG9mIEF1c3RyYWxpYeKAmXMgRWxlY3RyaWNpdHkgRnVlbCBNaXgNCmBgYHtyIGZpZy53aWR0aD0xNCwgZmlnLmhlaWdodD02fQ0KIyBTZWN0aW9uIDE6IEV2b2x1dGlvbiBvZiBBdXN0cmFsaWHigJlzIEVsZWN0cmljaXR5IEZ1ZWwgTWl4DQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCmxpYnJhcnkobHVicmlkYXRlKQ0KbGlicmFyeShzY2FsZXMpDQoNCmRmIDwtIHJlYWQuY3N2KCJHZW5lcmF0aW9uX0Z1ZWxNaXhfMTk5OS0yMDI1LmNzdiIpDQpkZiRkYXRlIDwtIGFzLkRhdGUoZGYkZGF0ZSkNCmRmJHllYXIgPC0geWVhcihkZiRkYXRlKQ0KDQpmdWVsX2RhdGEgPC0gZGYgJT4lDQogIHNlbGVjdCgNCiAgICB5ZWFyLA0KICAgIENvYWxfQnJvd24gPSBgQ29hbC4uQnJvd24uLi4uLkdXaGAsDQogICAgQ29hbF9CbGFjayA9IGBDb2FsLi5CbGFjay4uLi4uR1doYCwNCiAgICBHYXNfQ0NHVCA9IGBHYXMuLkNDR1QuLi4uLkdXaGAsDQogICAgR2FzX1N0ZWFtID0gYEdhcy4uU3RlYW0uLi4uLkdXaGAsDQogICAgR2FzX09DR1QgPSBgR2FzLi5PQ0dULi4uLi5HV2hgLA0KICAgIEdhc19SZWNpcHJvY2F0aW5nID0gYEdhcy4uUmVjaXByb2NhdGluZy4uLi4uR1doYCwNCiAgICBIeWRybyA9IGBIeWRyby4uLi5HV2hgLA0KICAgIFdpbmQgPSBgV2luZC4uLi5HV2hgLA0KICAgIFNvbGFyX1V0aWxpdHkgPSBgU29sYXIuLlV0aWxpdHkuLi4uLkdXaGAsDQogICAgU29sYXJfUm9vZnRvcCA9IGBTb2xhci4uUm9vZnRvcC4uLi4uR1doYCwNCiAgICBCaW9lbmVyZ3kgPSBgQmlvZW5lcmd5Li5CaW9tYXNzLi4uLi5HV2hgLA0KICAgIEJhdHRlcnkgPSBgQmF0dGVyeS4uRGlzY2hhcmdpbmcuLi4uLkdXaGANCiAgKSAlPiUNCiAgbXV0YXRlKA0KICAgIENvYWwgPSBDb2FsX0Jyb3duICsgQ29hbF9CbGFjaywNCiAgICBHYXMgPSBHYXNfQ0NHVCArIEdhc19TdGVhbSArIEdhc19PQ0dUICsgR2FzX1JlY2lwcm9jYXRpbmcsDQogICAgU29sYXIgPSBTb2xhcl9VdGlsaXR5ICsgU29sYXJfUm9vZnRvcCwNCiAgICBPdGhlciA9IEJpb2VuZXJneSArIEJhdHRlcnkNCiAgKSAlPiUNCiAgc2VsZWN0KHllYXIsIENvYWwsIEdhcywgSHlkcm8sIFdpbmQsIFNvbGFyLCBPdGhlcikNCg0KeWVhcmx5X2Z1ZWwgPC0gZnVlbF9kYXRhICU+JQ0KICBmaWx0ZXIoeWVhciA+PSAxOTk5ICYgeWVhciA8PSAyMDI0KSAlPiUNCiAgcGl2b3RfbG9uZ2VyKGNvbHMgPSAteWVhciwgbmFtZXNfdG8gPSAiZnVlbF90eXBlIiwgdmFsdWVzX3RvID0gImdlbmVyYXRpb24iKSAlPiUNCiAgZ3JvdXBfYnkoeWVhciwgZnVlbF90eXBlKSAlPiUNCiAgc3VtbWFyaXNlKHRvdGFsID0gc3VtKGdlbmVyYXRpb24pLCAuZ3JvdXBzID0gImRyb3AiKQ0KDQp5ZWFybHlfZnVlbCRmdWVsX3R5cGUgPC0gZmFjdG9yKHllYXJseV9mdWVsJGZ1ZWxfdHlwZSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSBjKCJDb2FsIiwgIkdhcyIsICJIeWRybyIsICJXaW5kIiwgIlNvbGFyIiwgIk90aGVyIikpDQoNCmdncGxvdCh5ZWFybHlfZnVlbCwgYWVzKHggPSB5ZWFyLCB5ID0gdG90YWwsIGZpbGwgPSBmdWVsX3R5cGUpKSArDQogIGdlb21fYXJlYShhbHBoYSA9IDAuODUpICsNCiAgc2NhbGVfZmlsbF9tYW51YWwoDQogICAgdmFsdWVzID0gYygiQ29hbCIgPSAiIzJDM0U1MCIsICJHYXMiID0gIiM5NUE1QTYiLCAiSHlkcm8iID0gIiMzNDk4REIiLCANCiAgICAgICAgICAgICAgICJXaW5kIiA9ICIjOUI1OUI2IiwgIlNvbGFyIiA9ICIjRjM5QzEyIiwgIk90aGVyIiA9ICIjMjdBRTYwIiksDQogICAgbmFtZSA9ICJGdWVsIFR5cGUiLA0KICAgIGxhYmVscyA9IGMoIkNvYWwiLCAiTmF0dXJhbCBHYXMiLCAiSHlkcm8iLCAiV2luZCIsICJTb2xhciIsICJPdGhlciBSZW5ld2FibGVzIikNCiAgKSArDQogIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSBzZXEoMTk5OSwgMjAyNCwgYnkgPSAxKSkgKw0KICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gY29tbWEpICsNCiAgbGFicyh0aXRsZSA9ICJFdm9sdXRpb24gb2YgQXVzdHJhbGlhJ3MgRWxlY3RyaWNpdHkgRnVlbCBNaXgiLA0KICAgICAgIHggPSAiWWVhciIsDQogICAgICAgeSA9ICJBbm51YWwgR2VuZXJhdGlvbiAoR1doKSIpICsNCiAgdGhlbWVfbWluaW1hbChiYXNlX3NpemUgPSAxNSkgKw0KICB0aGVtZSgNCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAyMiksDQogICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiksDQogICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEwKSwNCiAgICBsZWdlbmQua2V5LnNpemUgPSB1bml0KDEsICJjbSIpLA0KICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSkNCiAgKQ0KYGBgDQpUaGlzIHN0YWNrZWQgYXJlYSBwbG90IHNob3dzIEF1c3RyYWxpYeKAmXMgYW5udWFsIGVsZWN0cmljaXR5IGdlbmVyYXRpb24gYnkgZGlmZmVyZW50IGtpbmRzIG9mIGZ1ZWwgZnJvbSAxOTk5IHRvIDIwMjQuIFRoZSBoZWlnaHQgb2YgdGhlIHN0YWNrZWQgYXJlYXMgcmVwcmVzZW50cyB0b3RhbCBnZW5lcmF0aW9uIGVhY2ggeWVhci4gSSBhbHNvIHVzZSBkaWZmZXJlbnQgY29sb3IgaW5kaWNhdGluZyB0aGUgY29udHJpYnV0aW9ucyBvZiBjb2FsLCBuYXR1cmFsIGdhcywgaHlkcm8sIHdpbmQsIHNvbGFyIGFuZCBvdGhlciByZW5ld2FibGVzLiBUaGUgcGxvdCBzaG93cyBob3cgdGhlIG92ZXJhbGwgbWl4IGhhcyBncmFkdWFsbHkgc2hpZnRlZCBmcm9tIGNvYWwtZG9taW5hdGVkIGdlbmVyYXRpb24gdG93YXJkcyBhIG1vcmUgZGl2ZXJzaWZpZWQgYW5kIG1vcmUgcmVuZXdhYmxlLWJhc2VkIGdlbmVyYXRpb24gbWl4Lg0KDQpGdWVsIG1peCB3ZXJlIGRvbWluYXRlZCBieSBjb2FsIGZvciBhIGxvbmcgdGltZSwgYnV0IGNsZWFybHkgZGVjcmVhc2UgaW4gcmVjZW50IHllYXJzOiBJbiBlYXJseSB5ZWFycywgY29hbCBpcyBhIG1ham9yIGZ1ZWwsIHdoaWNoIHJlZmxlY3RzIEF1c3RyYWxpYSBoaXN0b3JpY2FsbHkgcmVsaWVkIG9uIGNvYWwgcG93ZXIuIE92ZXIgdGltZSwgdGhlIGNvYWwgYXJlYSBiZWNvbWUgc21hbGxlciB5ZWFyIGJ5IHllYXIsIHdoaWNoIGluZGljYXRlcyBhIHN0cnVjdHVyYWwgZGVjcmVhc2UgaW4gY29hbCBnZW5lcmF0aW9uIHJhdGhlciB0aGFuIHNob3J0LXRlcm0gZmx1Y3R1YXRpb25zLg0KDQpTb21lIHJlbmV3YWJsZXMgZ3JvdyBmcm9tIHplcm8gdG8gYSBzaWduaWZpY2FudCBzaGFyZTogV2luZCBhbmQgZXNwZWNpYWxseSBzb2xhciBzdGFydCBmcm9tIHplcm8gaW4gZWFybHkgeWVhcnMsIGJ1dCB0aGVpciBhcmVhcyBleHBhbmQgZXh0cmVtZWx5IGZhc3QgZnJvbSB0aGUgMjAxMHMuIFRoaXMgc2hvd3MgdGhhdCByZW5ld2FibGUgdGVjaG5vbG9naWVzIGhhdmUgZ3Jvd24gZnJvbSBhIHNtYWxsIHJvbGUgdG8gYSBtYWpvciBwYXJ0IG9mIGdlbmVyYXRpb24gbWl4Lg0KDQpTbywgd2Ugd2FudCB0byBrbm93IHdoeSBzb2xhciBwb3dlciBkZXZlbG9wIHNvIHF1aWNrbHkgYW5kIHNpbmNlIHNvbGFyIHBvd2VyIGlzIG5vdCBhdmFpbGFibGUgYXQgbmlnaHQsIHdlIGFsc28gd2FudCB0byBleHBsb3JlIGhvdyBBdXN0cmFsaWHigJlzIGVsZWN0cmljaXR5IHN1cHBseSBtaXggZGlmZmVycyBiZXR3ZWVuIGRheSBhbmQgbmlnaHQuDQoNCiMjIFNlY3Rpb24gMjogRGF5IHZzIE5pZ2h0IEdlbmVyYXRpb24gQ29tcG9zaXRpb24gKE5TVywgbGFzdCA3IGRheXMpDQpgYGB7cn0NCiMgU2VjdGlvbiAyOiBEYXkgdnMgTmlnaHQgR2VuZXJhdGlvbiBDb21wb3NpdGlvbiAoTlNXLCBsYXN0IDcgZGF5cykNCmxpYnJhcnkodGlkeXZlcnNlKQ0KbGlicmFyeShsdWJyaWRhdGUpDQpsaWJyYXJ5KGphbml0b3IpDQpsaWJyYXJ5KHBhdGNod29yaykNCg0KcmF3IDwtIHJlYWRyOjpyZWFkX2NzdigiMjAyNTExMTIgTmV3IFNvdXRoIFdhbGVzLmNzdiIpICU+JQ0KICBjbGVhbl9uYW1lcygpICU+JQ0KICBtdXRhdGUoDQogICAgdGltZV91dGMgPSB5bWRfaG1zKGRhdGUsIHR6ID0gIlVUQyIsIHF1aWV0ID0gVFJVRSkNCiAgKSAlPiUNCiAgZmlsdGVyKCFpcy5uYSh0aW1lX3V0YykpICU+JQ0KICBtdXRhdGUoDQogICAgdGltZSA9IHdpdGhfdHoodGltZV91dGMsICJBdXN0cmFsaWEvU3lkbmV5IiksDQogICAgaG9kICA9IGhvdXIodGltZSkgKyBtaW51dGUodGltZSkgLyA2MCAgICMgMH4yNCDlsI/ml7YNCiAgKQ0KDQpnZW5fbG9uZyA8LSByYXcgJT4lDQogIHBpdm90X2xvbmdlcigNCiAgICBjb2xzID0gYygNCiAgICAgIGNvYWxfYmxhY2tfbXcsDQogICAgICBiaW9lbmVyZ3lfYmlvbWFzc19tdywNCiAgICAgIGdhc19jY2d0X213LA0KICAgICAgZ2FzX29jZ3RfbXcsDQogICAgICBoeWRyb19tdywNCiAgICAgIHdpbmRfbXcsDQogICAgICBzb2xhcl91dGlsaXR5X213LA0KICAgICAgc29sYXJfcm9vZnRvcF9tdywNCiAgICAgIGJhdHRlcnlfZGlzY2hhcmdpbmdfbXcNCiAgICApLA0KICAgIG5hbWVzX3RvID0gImZ1ZWwiLA0KICAgIHZhbHVlc190byA9ICJtdyINCiAgKSAlPiUNCiAgZmlsdGVyKCFpcy5uYShtdykpICU+JQ0KICBtdXRhdGUoDQogICAgZnVlbCA9IHJlY29kZSgNCiAgICAgIGZ1ZWwsDQogICAgICBjb2FsX2JsYWNrX213ICAgICAgICAgID0gIkNvYWwgKGJsYWNrKSIsDQogICAgICBiaW9lbmVyZ3lfYmlvbWFzc19tdyAgID0gIkJpb2VuZXJneSIsDQogICAgICBnYXNfY2NndF9tdyAgICAgICAgICAgID0gIkdhcyBDQ0dUIiwNCiAgICAgIGdhc19vY2d0X213ICAgICAgICAgICAgPSAiR2FzIE9DR1QiLA0KICAgICAgaHlkcm9fbXcgICAgICAgICAgICAgICA9ICJIeWRybyIsDQogICAgICB3aW5kX213ICAgICAgICAgICAgICAgID0gIldpbmQiLA0KICAgICAgc29sYXJfdXRpbGl0eV9tdyAgICAgICA9ICJTb2xhciAodXRpbGl0eSkiLA0KICAgICAgc29sYXJfcm9vZnRvcF9tdyAgICAgICA9ICJTb2xhciAocm9vZnRvcCkiLA0KICAgICAgYmF0dGVyeV9kaXNjaGFyZ2luZ19tdyA9ICJCYXR0ZXJ5IChkaXNjaGFyZ2UpIg0KICAgICkNCiAgKQ0KDQpwcm9maWxlX2hvdXJseSA8LSBnZW5fbG9uZyAlPiUNCiAgbXV0YXRlKGhvdXIgPSBmbG9vcihob2QpKSAlPiUgICAgICAgICMgMCwxLC4uLiwyMw0KICBncm91cF9ieShmdWVsLCBob3VyKSAlPiUNCiAgc3VtbWFyaXNlKA0KICAgIG13ID0gbWVhbihtdywgbmEucm0gPSBUUlVFKSwNCiAgICAuZ3JvdXBzID0gImRyb3AiDQogICkNCg0KcF9hcmVhIDwtIGdncGxvdChwcm9maWxlX2hvdXJseSwNCiAgICAgICAgICAgICAgICAgYWVzKHggPSBob3VyLCB5ID0gbXcsIGZpbGwgPSBmdWVsKSkgKw0KICBnZW9tX2FyZWEoKSArDQogIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSBzZXEoMCwgMjQsIGJ5ID0gMiksIGV4cGFuZCA9IGMoMCwgMCkpICsNCiAgbGFicygNCiAgICB0aXRsZSA9ICJBdmVyYWdlIDI0LWhvdXIgZ2VuZXJhdGlvbiBwcm9maWxlIGJ5IGZ1ZWxcbihOU1csIGxhc3QgNyBkYXlzKSIsDQogICAgeCA9ICJIb3VyIG9mIGRheSIsDQogICAgeSA9ICJBdmVyYWdlIGdlbmVyYXRpb24gKE1XKSIsDQogICAgZmlsbCA9ICJGdWVsIg0KICApICsNCiAgdGhlbWVfbWluaW1hbCgpDQoNCmRheV9uaWdodF9taXggPC0gZ2VuX2xvbmcgJT4lDQogIG11dGF0ZSgNCiAgICBwZXJpb2QgPSBpZl9lbHNlKA0KICAgICAgaG9kID49IDcgJiBob2QgPCAxNywNCiAgICAgICJEYXkgKDA3OjAw4oCTMTc6MDApIiwNCiAgICAgICJOaWdodCAoMTc6MDDigJMwNzowMCkiDQogICAgKQ0KICApICU+JQ0KICBncm91cF9ieShwZXJpb2QsIGZ1ZWwpICU+JQ0KICBzdW1tYXJpc2UoDQogICAgZW5lcmd5X213aCA9IHN1bShtdyAqIDAuNSwgbmEucm0gPSBUUlVFKSwgICMgMzBtaW4gPSAwLjVoDQogICAgLmdyb3VwcyA9ICJkcm9wIg0KICApDQoNCnBfcGllX2RheSA8LSBkYXlfbmlnaHRfbWl4ICU+JQ0KICBmaWx0ZXIocGVyaW9kID09ICJEYXkgKDA3OjAw4oCTMTc6MDApIikgJT4lDQogIGdncGxvdChhZXMoeCA9ICIiLCB5ID0gZW5lcmd5X213aCwgZmlsbCA9IGZ1ZWwpKSArDQogIGdlb21fY29sKHdpZHRoID0gMSkgKw0KICBjb29yZF9wb2xhcih0aGV0YSA9ICJ5IikgKw0KICBsYWJzKHRpdGxlID0gIkRheXRpbWUgZ2VuZXJhdGlvbiBtaXgiKSArDQogIHRoZW1lX3ZvaWQoKSArDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikNCg0KcF9waWVfbmlnaHQgPC0gZGF5X25pZ2h0X21peCAlPiUNCiAgZmlsdGVyKHBlcmlvZCA9PSAiTmlnaHQgKDE3OjAw4oCTMDc6MDApIikgJT4lDQogIGdncGxvdChhZXMoeCA9ICIiLCB5ID0gZW5lcmd5X213aCwgZmlsbCA9IGZ1ZWwpKSArDQogIGdlb21fY29sKHdpZHRoID0gMSkgKw0KICBjb29yZF9wb2xhcih0aGV0YSA9ICJ5IikgKw0KICBsYWJzKHRpdGxlID0gIk5pZ2h0LXRpbWUgZ2VuZXJhdGlvbiBtaXgiKSArDQogIHRoZW1lX3ZvaWQoKQ0KDQpwX3BpZV9kYXkgIDwtIHBfcGllX2RheSAgKyB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpDQpwX3BpZV9uaWdodCA8LSBwX3BpZV9uaWdodCArIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikNCg0KKHBfYXJlYSB8IChwX3BpZV9kYXkgLyBwX3BpZV9uaWdodCkpICsNCiAgcGxvdF9sYXlvdXQod2lkdGhzID0gYygyLCAxKSkNCg0KYGBgDQpBcyBiZWZvcmUgd2UgaGF2ZSBhbHJlYWR5IHNob3duIHRoZSBsb25nLXRlcm0gY2hhbmdlcyBpbiB0aGUgZnVlbCBtaXggZm9yIDIwIHllYXJzOiBDb2FsIHBvd2VyIGRlY2xpbmVkIHdpdGggd2luZC9waG90b3ZvbHRhaWMgcG93ZXIvUFYgcmlzaW5nLiBBZnRlciB0aGUgcmV2aWV3IG9mIGxvbmctdGVybSBlbmVyZ3kgbWl4IGNoYW5nZXMgaW4gdGhlIHByZXZpb3VzIHNlY3Rpb24sIHRoZW4gd2UgZm9jdXMgb24gZGFpbHkgZGF0YS4gSXQgY2FuIFJldmVhbCB0aGUgc3RydWN0dXJhbCBjaGFuZ2VzIGluIHRoZSBwb3dlciBzeXN0ZW0gdGhyb3VnaG91dCB0aGUgZGF5IGFmdGVyIHRoZSBtYXNzaXZlIHBlbmV0cmF0aW9uIG9mIHJlbmV3YWJsZSBlbmVyZ3kuDQoNClRoaXMgc2V0IG9mIGNoYXJ0cyBjbGVhcmx5IHNob3dzIHRoZSBldm9sdXRpb24gb2YgdGhlIGludHJhZGF5IHBvd2VyIGdlbmVyYXRpb24gc3RydWN0dXJlIGluIE5ldyBTb3V0aCBXYWxlcyBvdmVyIHRoZSBwYXN0IHNldmVuIGRheXMuIEl0IGZvY3VzIG9uIHNob3dpbmcgaG93IHJlbmV3YWJsZSBlbmVyZ3kgaXMgcmVzaGFwaW5nIHRoZSBwb3dlciBzeXN0ZW0gb3ZlciBkaWZmZXJlbnQgdGltZSBwZXJpb2RzLg0KDQpUaGUgc3RhY2tlZCBhcmVhIG1hcCBvbiB0aGUgbGVmdCBkZXBpY3RzIGEgdHlwaWNhbCAiYXZlcmFnZSAyNC1ob3VyIGdlbmVyYXRpb24gY3VydmUsIiAuIEl0IHJldmVhbGluZyBzaWduaWZpY2FudCBkaWZmZXJlbmNlcyBpbiB0aGUgcG93ZXIgZ2VuZXJhdGlvbiBzdHJ1Y3R1cmUgZHVyaW5nIHRoZSBkYXkgdmVyc3VzIG5pZ2h0LiBBcyB0aGUgZWFybHkgbW9ybmluZyBsaWdodCBpbnRlbnNpZmllcywgc29sYXIg4oCTIGluY2x1ZGluZyByb29mdG9wIFBWIGFuZCBsYXJnZSBncm91bmQtYmFzZWQgcG93ZXIgcGxhbnRzIOKAkyBxdWlja2x5IGNsaW1icyB0byBhIHBlYWsgYmV0d2VlbiAxMCBhbmQgMTYgbydjbG9jaywgY3JlYXRpbmcgdGhlIG5vdGljZWFibGUgbWlkLXNlY3Rpb24gYnVsZ2UgaW4gdGhlIGltYWdlLiBUaGlzIHNob3dzIHRoYXQgc29sYXIgZW5lcmd5IGhhcyBiZWNvbWUgYW4gaW1wb3J0YW50IHBpbGxhciBvZiBkYXl0aW1lIHBvd2VyIGdlbmVyYXRpb24sIGFuZCBoYXMgbGVkIHRvIGEgY2hhcmFjdGVyaXN0aWMgImR1Y2sgY3VydmUiIGF0IG5vb24gZm9yIHRoZSBvdmVyYWxsIGxvYWQsIHdoaWNoIGlzIGEgZGlyZWN0IHJlZmxlY3Rpb24gb2YgdGhlIGluY3JlYXNpbmcgcHJvcG9ydGlvbiBvZiBwaG90b3ZvbHRhaWNzIGluIHRoZSBwb3dlciBzeXN0ZW0uDQoNCkhvd2V2ZXIsIGFzIHRoZSBzdW4gZ3JhZHVhbGx5IHNldHMgd2VzdHdhcmQsIHRoZSBwb3dlciBnZW5lcmF0aW9uIHN0cnVjdHVyZSBjaGFuZ2VzIHJhcGlkbHkgaW4gYSBzaG9ydCBwZXJpb2Qgb2YgdGltZS4gQWZ0ZXIgNSBwLm0uLCBkdWUgdG8gYSBzaGFycCBkcm9wIGluIHNvbGFyIG91dHB1dCwgY29hbCBwb3dlciBhbmQgc29tZSBuYXR1cmFsIGdhcyB1bml0cyBuZWVkIHRvIHF1aWNrbHkgaW5jcmVhc2Ugb3V0cHV0IHRvIGZpbGwgdGhlIGdhcCwgcmVzdWx0aW5nIGluIGEgbm90aWNlYWJsZSByYW1wLXVwIGluIHRoZSBldmVuaW5nLCB3aGljaCBpcyBhbHNvIG9uZSBvZiB0aGUgbW9zdCBjaGFsbGVuZ2luZyB0aW1lcyBmb3IgdGhlIGN1cnJlbnQgTkVNIHN5c3RlbSBpbiB0ZXJtcyBvZiBzY2hlZHVsaW5nIGFuZCBzdGFiaWxpdHkuIEFmdGVyIGVudGVyaW5nIHRoZSBuaWdodCwgc29sYXIgZW5lcmd5IGNvbXBsZXRlbHkgZXhpdGVkIHRoZSBzeXN0ZW0sIGFuZCB0aGUgcG93ZXIgZ2VuZXJhdGlvbiBzdHJ1Y3R1cmUgd2FzIGFnYWluIGRvbWluYXRlZCBieSBjb2FsIHBvd2VyLCBpbmRpY2F0aW5nIHRoYXQgdGhlIHBvd2VyIHN1cHBseSBhdCBuaWdodCBpcyBzdGlsbCBoaWdobHkgZGVwZW5kZW50IG9uIGZvc3NpbCBlbmVyZ3kuDQoNClRoZSB0d28gcGllIGNoYXJ0cyBvbiB0aGUgcmlnaHQgZnVydGhlciByZWluZm9yY2UgdGhpcyBjb25jbHVzaW9uLiBzb2xhciBlbmVyZ3kgaGFzIGJlY29tZSB0aGUgbWFpbiBmb3JjZSBpbiB0aGUgcHJvcG9ydGlvbiBvZiBkYXl0aW1lIHBvd2VyIGdlbmVyYXRpb24sIG1ha2luZyBmb3NzaWwgZnVlbHMgc2lnbmlmaWNhbnRseSBhYmRpY2F0ZSBkdXJpbmcgdGhlIGRheTsgVGhlIHBvd2VyIGdlbmVyYXRpb24gc3RydWN0dXJlIGF0IG5pZ2h0IGlzIGFsbW9zdCBlbnRpcmVseSBzdXBwb3J0ZWQgYnkgY29hbCwgZ2FzLCBhbmQgYSBzbWFsbCBhbW91bnQgb2Ygd2luZCBwb3dlci4gVGhpcyBzdGFyayBjb250cmFzdCBzaG93cyBhIGtleSBwYXJhZG94IGluIEF1c3RyYWxpYSdzIGVuZXJneSB0cmFuc2l0aW9uLiBSZW5ld2FibGUgZW5lcmd5IHBlbmV0cmF0aW9uIGlzIGFscmVhZHkgdmVyeSBoaWdoIGR1cmluZyB0aGUgZGF5LCBidXQgdGhlcmUgYXJlIG5vdCBlbm91Z2ggZm9zc2lsLWZyZWUgYWx0ZXJuYXRpdmVzIGF0IG5pZ2h0LiBUaGF0IG1lYW5zICB0aGUgZW5lcmd5IHN5c3RlbSBzdGlsbCBuZWVkcyB0byByZWx5IG9uIHRyYWRpdGlvbmFsIGJhc2Vsb2FkIHBvd2VyIHNvdXJjZXMuDQoNCk9uIHRoZSBvbmUgaGFuZCwgdGhlIGRldmVsb3BtZW50IG9mIHBob3Rvdm9sdGFpY3Mgc2lnbmlmaWNhbnRseSBjaGFuZ2VkIHRoZSBwb3dlciBwYXR0ZXJuIGFuZCBwcm9tb3RlZCB0aGUgbWFyZ2luYWxpemF0aW9uIG9mIGNvYWwgcG93ZXIuIE9uIHRoZSBvdGhlciBoYW5kLCB0aGUgaW50ZXJtaXR0ZW50IG5hdHVyZSBvZiBzb2xhciBlbmVyZ3kgaGlnaGxpZ2h0cyB0aGUgbmVlZCBmb3IgZW5lcmd5IHN0b3JhZ2UsIGJhdHRlcnkgY29uZGl0aW9uaW5nIHRlY2hub2xvZ3ksIGFuZCBmbGV4aWJsZSBnYXMtZWxlY3RyaWNpdHkuDQoNCiMjIFNlY3Rpb24gMzogVGhlIFJhcGlkIEdyb3d0aCBvZiBSb29mdG9wIFNvbGFyIGluIEF1c3RyYWxpYQ0KYGBge3J9DQojIFNlY3Rpb24gMy4gIFRoZSBSYXBpZCBHcm93dGggb2YgUm9vZnRvcCBTb2xhciBpbiBBdXN0cmFsaWEgDQojIExpbmUgY2hhcnQgc2hvd2luZyB0b3RhbCByb29mdG9wIHNvbGFyIGluc3RhbGxhdGlvbnMgb3ZlciB0aW1lcyANCg0KIyAxLiBsb2FkIHBhY2thZ2VzDQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCmxpYnJhcnkoc2NhbGVzKQ0KDQojIDIuIGxvYWQgZGF0YQ0KZmlsZV9wYXRoIDwtICJzZ3Utc29sYXItaW5zdGFsbGF0aW9ucy0yMDExLXRvLXByZXNlbnQtYW5kLXRvdGFscy5jc3YiDQpkZiA8LSByZWFkX2NzdihmaWxlX3BhdGgpDQoNCiMgMy4gRGF0YSBwcm9jZXNzDQp5ZWFybHlfZGF0YSA8LSBkZiAlPiUNCiAgc2VsZWN0KG1hdGNoZXMoIkluc3RhbGxhdGlvbiBRdWFudGl0eSIpKSAlPiUNCiAgc2VsZWN0KC1gVG90YWwgSW5zdGFsbGF0aW9uIFF1YW50aXR5YCwgLWBIaXN0b3JpYyBUb3RhbCBJbnN0YWxsYXRpb24gUXVhbnRpdHkgKDIwMDEgLSAyMDEwKWApICU+JQ0KICBzdW1tYXJpc2UoYWNyb3NzKGV2ZXJ5dGhpbmcoKSwgc3VtLCBuYS5ybSA9IFRSVUUpKSAlPiUNCiAgcGl2b3RfbG9uZ2VyKGNvbHMgPSBldmVyeXRoaW5nKCksIG5hbWVzX3RvID0gIlBlcmlvZCIsIHZhbHVlc190byA9ICJNb250aGx5X0NvdW50IikgJT4lDQogIG11dGF0ZShZZWFyID0gYXMubnVtZXJpYyhzdHJfZXh0cmFjdChQZXJpb2QsICJcXGR7NH0iKSkpICU+JQ0KICBncm91cF9ieShZZWFyKSAlPiUNCiAgc3VtbWFyaXNlKFllYXJseV9OZXdfSW5zdGFsbGF0aW9ucyA9IHN1bShNb250aGx5X0NvdW50KSkgJT4lDQogIGFycmFuZ2UoWWVhcikgJT4lDQogIHVuZ3JvdXAoKQ0KDQojIDQuIFRvdGFsIG5ldyBpbnN0YWxsYXRpb25zIHBlciB5ZWFyDQpnZ3Bsb3QoeWVhcmx5X2RhdGEsIGFlcyh4ID0gZmFjdG9yKFllYXIpLCB5ID0gWWVhcmx5X05ld19JbnN0YWxsYXRpb25zKSkgKw0KICBnZW9tX2NvbChmaWxsID0gIiMwMDcyQjIiKSArIA0KICBnZW9tX3RleHQoYWVzKGxhYmVsID0gY29tbWEoWWVhcmx5X05ld19JbnN0YWxsYXRpb25zKSksIA0KICAgICAgICAgICAgdmp1c3QgPSAtMC41LCANCiAgICAgICAgICAgIHNpemUgPSAzKSArDQogIGxhYnMoDQogICAgdGl0bGUgPSAiQW5udWFsIFJvb2Z0b3AgU29sYXIgSW5zdGFsbGF0aW9ucyBpbiBBdXN0cmFsaWEiLA0KICAgIHN1YnRpdGxlID0gIlRvdGFsIG5ldyBpbnN0YWxsYXRpb25zIHBlciB5ZWFyIiwNCiAgICB4ID0gIlllYXIiLA0KICAgIHkgPSAiQW5udWFsIEluc3RhbGxhdGlvbnMiDQogICkgKw0KICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gY29tbWEpICsgDQogIHRoZW1lX21pbmltYWwoKSArDQogIHRoZW1lKA0KICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSkgDQogICkNCmBgYA0KDQoNCmBgYHtyfQ0KIyA1LiBOdW1iZXIgb2YgbmV3IGluc3RhbGxhdGlvbnMgcGVyIHllYXINCmdncGxvdCh5ZWFybHlfZGF0YSwgYWVzKHggPSBZZWFyLCB5ID0gWWVhcmx5X05ld19JbnN0YWxsYXRpb25zKSkgKw0KICBnZW9tX2xpbmUoY29sb3IgPSAiIzAwNzJCMiIsIGxpbmV3aWR0aCA9IDEuMikgKyANCiAgZ2VvbV9wb2ludChjb2xvciA9ICIjMDA3MkIyIiwgc2l6ZSA9IDMpICsgICANCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IGNvbW1hKFllYXJseV9OZXdfSW5zdGFsbGF0aW9ucykpLCANCiAgICAgICAgICAgIHZqdXN0ID0gLTEsIHNpemUgPSAzLjUpICsNCiAgbGFicygNCiAgICB0aXRsZSA9ICJBbm51YWwgUm9vZnRvcCBTb2xhciBJbnN0YWxsYXRpb25zIGluIEF1c3RyYWxpYSAoVHJlbmQpIiwNCiAgICBzdWJ0aXRsZSA9ICJOdW1iZXIgb2YgbmV3IGluc3RhbGxhdGlvbnMgcGVyIHllYXIiLA0KICAgIHggPSAiWWVhciIsDQogICAgeSA9ICJBbm51YWwgSW5zdGFsbGF0aW9ucyINCiAgKSArDQogIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSBzZXEobWluKHllYXJseV9kYXRhJFllYXIpLCBtYXgoeWVhcmx5X2RhdGEkWWVhciksIGJ5ID0gMSkpICsNCiAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IGNvbW1hLCBleHBhbmQgPSBleHBhbnNpb24obXVsdCA9IGMoMC4xLCAwLjE1KSkpICsgDQogIHRoZW1lX21pbmltYWwoKSArDQogIHRoZW1lKA0KICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSksDQogICAgcGFuZWwuZ3JpZC5taW5vci54ID0gZWxlbWVudF9ibGFuaygpIA0KICApDQpgYGANCg0KYGBge3J9DQojIEdyb3d0aCBvZiB0b3RhbCBpbnN0YWxsZWQgdW5pdHMgb3ZlciB0aW1lICgyMDEwIC0gUHJlc2VudCkNCmhpc3RvcmljX3RvdGFsIDwtIGRmICU+JQ0KICBwdWxsKGBIaXN0b3JpYyBUb3RhbCBJbnN0YWxsYXRpb24gUXVhbnRpdHkgKDIwMDEgLSAyMDEwKWApICU+JQ0KICBzdW0obmEucm0gPSBUUlVFKQ0KDQp5ZWFybHlfY3VtdWxhdGl2ZV9kYXRhIDwtIGRmICU+JQ0KICBzZWxlY3QobWF0Y2hlcygiSW5zdGFsbGF0aW9uIFF1YW50aXR5IikpICU+JQ0KICBzZWxlY3QoLWBUb3RhbCBJbnN0YWxsYXRpb24gUXVhbnRpdHlgLCAtYEhpc3RvcmljIFRvdGFsIEluc3RhbGxhdGlvbiBRdWFudGl0eSAoMjAwMSAtIDIwMTApYCkgJT4lDQogIHN1bW1hcmlzZShhY3Jvc3MoZXZlcnl0aGluZygpLCBzdW0sIG5hLnJtID0gVFJVRSkpICU+JQ0KICBwaXZvdF9sb25nZXIoY29scyA9IGV2ZXJ5dGhpbmcoKSwgbmFtZXNfdG8gPSAiUGVyaW9kIiwgdmFsdWVzX3RvID0gIk1vbnRobHlfQ291bnQiKSAlPiUNCiAgbXV0YXRlKFllYXIgPSBhcy5udW1lcmljKHN0cl9leHRyYWN0KFBlcmlvZCwgIlxcZHs0fSIpKSkgJT4lDQogIGdyb3VwX2J5KFllYXIpICU+JQ0KICBzdW1tYXJpc2UoWWVhcmx5X05ldyA9IHN1bShNb250aGx5X0NvdW50KSkgJT4lDQogIGFycmFuZ2UoWWVhcikgJT4lDQogIHVuZ3JvdXAoKSAlPiUNCiAgbXV0YXRlKFRvdGFsX0N1bXVsYXRpdmUgPSBoaXN0b3JpY190b3RhbCArIGN1bXN1bShZZWFybHlfTmV3KSkNCg0Kc3RhcnRfcG9pbnQgPC0gdGliYmxlKA0KICBZZWFyID0gMjAxMCwNCiAgWWVhcmx5X05ldyA9IDAsDQogIFRvdGFsX0N1bXVsYXRpdmUgPSBoaXN0b3JpY190b3RhbA0KKQ0KDQpmaW5hbF9wbG90X2RhdGEgPC0gYmluZF9yb3dzKHN0YXJ0X3BvaW50LCB5ZWFybHlfY3VtdWxhdGl2ZV9kYXRhKQ0KDQpnZ3Bsb3QoZmluYWxfcGxvdF9kYXRhLCBhZXMoeCA9IFllYXIsIHkgPSBUb3RhbF9DdW11bGF0aXZlKSkgKw0KICBnZW9tX2xpbmUoY29sb3IgPSAiI0Q1NUUwMCIsIGxpbmV3aWR0aCA9IDEuMikgKyANCiAgZ2VvbV9wb2ludChjb2xvciA9ICIjRDU1RTAwIiwgc2l6ZSA9IDMpICsNCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IGNvbW1hKFRvdGFsX0N1bXVsYXRpdmUpKSwgDQogICAgICAgICAgICB2anVzdCA9IC0xLCBzaXplID0gMywgY2hlY2tfb3ZlcmxhcCA9IFRSVUUpICsNCiAgbGFicygNCiAgICB0aXRsZSA9ICJUb3RhbCBDdW11bGF0aXZlIFJvb2Z0b3AgU29sYXIgSW5zdGFsbGF0aW9ucyBpbiBBdXN0cmFsaWEiLA0KICAgIHN1YnRpdGxlID0gIkdyb3d0aCBvZiB0b3RhbCBpbnN0YWxsZWQgdW5pdHMgb3ZlciB0aW1lICgyMDEwIC0gUHJlc2VudCkiLA0KICAgIHggPSAiWWVhciIsDQogICAgeSA9ICJUb3RhbCBDdW11bGF0aXZlIEluc3RhbGxhdGlvbnMgKFVuaXRzKSINCiAgKSArDQogIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSBzZXEoMjAxMCwgbWF4KGZpbmFsX3Bsb3RfZGF0YSRZZWFyKSwgYnkgPSAxKSkgKw0KICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gY29tbWEsIGV4cGFuZCA9IGV4cGFuc2lvbihtdWx0ID0gYygwLjA1LCAwLjE1KSkpICsNCiAgdGhlbWVfbWluaW1hbCgpICsNCiAgdGhlbWUoDQogICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxKSwgDQogICAgcGFuZWwuZ3JpZC5taW5vci54ID0gZWxlbWVudF9ibGFuaygpIA0KICApDQpgYGANCkF1c3RyYWxpYSdzIGluaXRpYWwgZ3Jvd3RoIHN0YWdlIChhcm91bmQgMjAxMSB0byAyMDEyKSBzYXcgc3Vic3RhbnRpYWwgZ3Jvd3RoIGluIHJvb2Z0b3Agc29sYXIgYWRvcHRpb24gaW4gQXVzdHJhbGlhLiBUaGUgZXN0YWJsaXNobWVudCBvZiB2YXJpb3VzIGluY2VudGl2ZXMgc3VjaCBhcyBTb2xhciBIb21lcyBhbmQgQ29tbXVuaXRpZXMgUHJvZ3JhbSAoU0hDUCkgYW5kIFJlbmV3YWJsZSBFbmVyZ3kgVGFyZ2V0IChSRVQpIHBvbGljeSBmcm9tIHRoZSBBdXN0cmFsaWFuIEdvdmVybm1lbnQsIHdpdGggc3VwcGxlbWVudGFyeSBzdXBwb3J0IGZyb20gRmVlZC1pbiBUYXJpZmYgc3Vic2lkaWVzIGluIHNldmVyYWwgQXVzdHJhbGlhbiBTdGF0ZXMsIGNvbnRyaWJ1dGVkIHRvIHN1Y2ggZ3Jvd3RoLg0KDQpCdXQgd2l0aCB0aGUgbWFzc2l2ZSBzdXBwb3J0IGluIDIwMTAtMjAxMiwgdGhlcmUgd2FzIHRyZW1lbmRvdXMgcHJlc3N1cmUgb24gc3RhdGUgZXhwZW5kaXR1cmVzLCBzdWNoIHRoYXQgZWFjaCBzdGF0ZSB3YXMgZm9yY2VkIHRvIHRha2UgZHJhc3RpYyBzdGVwcyB0byBjdXJiIGl0cyBtb21lbnR1bS4gV2l0aGRyYXdhbCBvZiBzdWNoIGZhdm9yYWJsZSBzdWJzaWRpZXMgY2F1c2VkIGEgc2hvcnQtdGVybSBzbG93LWRvd24gaW4gdGhlaXIgaW5zdGFsbGF0aW9uIGluIHRoZSB5ZWFycyB0aGF0IGZvbGxvd2VkICgyMDEzLTIwMTYpLg0KDQpCdXQgcGVyaGFwcyBtb3N0IGRyYW1hdGljYWxseSwgdGhlIHNpdHVhdGlvbiBldm9sdmVkIGluIE5ldyBTb3V0aCBXYWxlcywgd2l0aCBpbnN0YWxsYXRpb24gY29zdHMgZXNjYWxhdGluZyBvdXQgb2YgY29udHJvbCwgZmFyIGluIGV4Y2VzcyBvZiBleHBlY3RhdGlvbnMuIEFjY29yZGluZ2x5LCBpbiBKdWx5IDIwMTEsIGFwcGxpY2F0aW9ucyBmb3IgdGhlIGhlYXZpbHkgc3Vic2lkaXplZCBTb2xhciBCb251cyBTY2hlbWUgd2VyZSBzdWRkZW5seSBjbG9zZWQgYnkgdGhlIGdvdmVybm1lbnQuIEJ1dCB0aGlzIGFjdGVkIGFzIGEgY2F0YWx5c3QgZm9yIHNlaXppbmcgInRoZSBsYXN0IHRyYWluIG91dCwiIGluZXZpdGFibHkgZm9sbG93ZWQgYnkgbWFya2V0IGNvbGxhcHNlLiBBbHNvLCBpbiBKdWx5IDIwMTIsIGluIFF1ZWVuc2xhbmQsIGdvdmVybm1lbnRzIGRyYXN0aWNhbGx5IHJlZHVjZWQgdGhlaXIgNDQgY2VudHMva1doIGZlZSB0byBqdXN0IDggY2VudHMuIEJ1dCBhZ2FpbiwgYWZ0ZXIgc3VjaCBkcmFzdGljIGNoYW5nZXMsIHdpdGggcHJvbG9uZ2VkIHdhaXQgdGltZXMsIGNvbnN1bWVycyBzaG93ZWQgbGVzcyBlbnRodXNpYXNtLCB3aGlsZSBpbiBsYXRlIDIwMTEsIGluIFZpY3RvcmlhLCB0aGVpciBQcmVtaXVtIEZpVCBzY2hlbWUgd2FzIHN1ZGRlbmx5IGVuZGVkLiBXaXRob3V0IHRoZXNlIHN1YnNpZGllcywgc3VkZGVubHksIHRoZXJlIHdhcyB0YWxrIGFib3V0IGxpdmluZyB3aXRoICJ3aW50ZXIiIGluIHRoZSBtYXJrZXQgKDIwMTPigJMyMDE2KSwgZHVyaW5nIHdoaWNoIGNvbnN1bWVycyBoYWQgdG8gd2FpdCBvbiB0aGUgc2lkZWxpbmVzLg0KDQpEdXJpbmcgdGhlc2UgeWVhcnMsIGRlcHJpdmVkIG9mIHN1YnN0YW50aWFsIHN1YnNpZGllcywgY29uc3VtZXJzIGhhZCB0byB3YWl0IGZvciBmdXJ0aGVyIGRlY2xpbmVzIGluIHRoZSB0ZWNobm9sb2dpY2FsIGNvc3RzIG9mIHNvbGFyIHBhbmVscyB1bnRpbCBzeXN0ZW1zIGJlY2FtZSBlY29ub21pY2FsbHkgdmlhYmxlIHdpdGhvdXQgZ2VuZXJvdXMgc3Vic2lkaWVzLg0KDQpKdXN0IHdoZW4gYWxsIGhvcGVzIHNlZW1lZCBsb3N0LCB3aXRoIHRoZSBtYXJrZXQgb24gdGhlIHByZWNpcGljZSBvZiByZWFjaGluZyBpdHMgcGVhaywgdGhlcmUgY2FtZSBhIHR1cm5pbmcgcG9pbnQsIHdpdGggaW5ub3ZhdGlvbiBiZWluZyB0aGUgbmV3IHNhdmlvciwgbm90IHRoZSBnb3Zlcm5tZW50LiBGcm9tIDIwMTYgb253YXJkcywgaW5ub3ZhdGlvbiBpbiB0aGUgcGhvdG92b2x0YWljIG1hcmtldCByZWFjaGVkIGl0cyBtYXR1cml0eSwgd2l0aCBjb3N0cyBmb3Igc29sYXIgY2VsbCBwcm9kdWN0aW9uIGJlaW5nIHNpZ25pZmljYW50bHkgcmVkdWNlZCB0byBsZXNzIHRoYW4gaGFsZiBmb3IgYSA1a1cgY2FwYWNpdHkgaW4gYSBzaG9ydCBzcGFuLCB3aGlsZSBpbm5vdmF0aW9ucyBhbHNvIGluY3JlYXNlZCB0aGVpciBjYXBhY2l0eSB0byBiZSB1dGlsaXplZCBvbiByZXNpZGVudGlhbCBzY2FsZXMgKGF2ZXJhZ2UgY2FwYWNpdHkgZnJvbSA0a1cgdG8gYWJvdmUgNmtXKS4NCg0KQnV0IHRoZW4sIHBlb3BsZSByZWFsaXplZDogU29sYXIgaW5zdGFsbGF0aW9uIHdhcyBlY29ub21pY2FsLCBldmVuIGluIG5vLXN1YnNpZHkgc2NlbmFyaW9zISBBbmQgc28sIGFnYWluLCB0aGVyZSB3YXMgYSB0cmVtZW5kb3VzIGdyb3d0aCBpbiB0aGUgZ3JhcGhpYywgaW5jcmVhc2luZyBzdGVhZGlseSwgeWV0IHJlYWNoaW5nIGxldmVscyBmYXIgZXhjZWVkaW5nIHRob3NlIGluIHRoZSBpbml0aWFsIHN0YWdlLiBOb3csIHRoZXJlIHdhcyBubyBidWJibGUgZ3Jvd3RoIGJhc2VkIG9uIGFueSBwb2xpY3ksIGJ1dCDigJhoYXJkIGdyb3d0aOKAmSBiYXNlZCBvbiBpdHMgZWNvbm9taWMgYXBwZWFsLiBPZiBBdXN0cmFsaWHigJlzIHNvbGFyIHBhbmVscywgZmluYWxseSwgdGhlcmUgd2FzIG5vIG5lZWQgZm9yIHN1YnNpZGllcywgc2lnbmlmeWluZyBmdWxsIG1hdHVyaXR5Lg0KDQpBbHRob3VnaCAyMDI1IGFwcGVhcnMgdG8gZGlwLCBidXQgaXQncyBqdXN0IGJlY2F1c2UgdGhlIHllYXIgaGFzIG5vdCBlbmRlZCB5ZXQuIE9mIGNvdXJzZSwgdGhlIHRhbGUgZm9yIDIwMjUgaGFzIHlldCB0byBiZSB0b2xkLCBhbmQgaXRzIGRlbWFuZCBsb29rcyBwcm9taXNpbmcuDQoNCg0KIyMgU2VjdGlvbiA0OiBTdGF0ZS1ieS1TdGF0ZSBGdWVsIE1peCBDaGFuZ2VzDQpgYGB7cn0NCiMgU2VjdGlvbiA0OiBTdGF0ZS1ieS1TdGF0ZSBGdWVsIE1peCBDaGFuZ2VzIA0KbGlicmFyeShkcGx5cikNCmxpYnJhcnkodGlkeXIpDQpsaWJyYXJ5KG1hZ3JpdHRyKQ0KbGlicmFyeShyZWFkeGwpDQpsaWJyYXJ5KGdncGxvdDIpDQpsaWJyYXJ5KHNjYWxlcykNCg0KYWVzX2ZpbGUgPC0gIkF1c3RyYWxpYW4gRW5lcmd5IFN0YXRpc3RpY3MgMjAyNSBUYWJsZSBPLnhsc3giDQoNCmxvYWRfc3RhdGVfY3kgPC0gZnVuY3Rpb24oc3RhdGVfY29kZSkgew0KICBzaGVldF9uYW1lIDwtIHBhc3RlKHN0YXRlX2NvZGUsICJDWSIpDQogIHJhdyA8LSByZWFkX2V4Y2VsKGFlc19maWxlLA0KICAgICAgICAgICAgICAgICAgICBzaGVldCA9IHNoZWV0X25hbWUsDQogICAgICAgICAgICAgICAgICAgIHNraXAgPSA0KQ0KICBmdWVsX2NvbF9uYW1lIDwtIG5hbWVzKHJhdylbMV0NCiAgZGYgPC0gcmF3ICU+JQ0KICAgIHJlbmFtZShGdWVsID0gYWxsX29mKGZ1ZWxfY29sX25hbWUpKSAlPiUNCiAgICBmaWx0ZXIoIWlzLm5hKEZ1ZWwpKSAlPiUNCiAgICBmaWx0ZXIoIUZ1ZWwgJWluJSBjKA0KICAgICAgIlRvdGFsIG5vbi1yZW5ld2FibGUiLCAiVG90YWwgcmVuZXdhYmxlIiwgIlRvdGFsIiwNCiAgICAgICJOb24tcmVuZXdhYmxlIGZ1ZWxzIiwgIlJlbmV3YWJsZSBmdWVscyIsICJOb3RlcyINCiAgICApKSAlPiUNCiAgICBwaXZvdF9sb25nZXIoDQogICAgICBjb2xzID0gLUZ1ZWwsDQogICAgICBuYW1lc190byA9ICJZZWFyIiwNCiAgICAgIHZhbHVlc190byA9ICJHV2giDQogICAgKSAlPiUNCiAgICBtdXRhdGUoDQogICAgICBZZWFyID0gZ3N1YigiIC4qIiwgIiIsIFllYXIpLA0KICAgICAgWWVhciA9IGFzLmludGVnZXIoWWVhciksDQogICAgICBHV2ggPSBhcy5udW1lcmljKEdXaCksDQogICAgICBTdGF0ZSA9IHN0YXRlX2NvZGUNCiAgICApICU+JQ0KICAgIGZpbHRlcighaXMubmEoR1doKSkNCiAgcmV0dXJuKGRmKQ0KfQ0KDQpzdGF0ZXMgPC0gYygiTlNXIiwgIlFMRCIsICJTQSIsICJWSUMiKQ0Kc3RhdGVfZGF0YSA8LSBiaW5kX3Jvd3MobGFwcGx5KHN0YXRlcywgbG9hZF9zdGF0ZV9jeSkpDQpzdGF0ZV9zaGFyZSA8LSBzdGF0ZV9kYXRhICU+JQ0KICBncm91cF9ieShTdGF0ZSwgWWVhcikgJT4lDQogIG11dGF0ZShTaGFyZSA9IEdXaCAvIHN1bShHV2gsIG5hLnJtID0gVFJVRSkpICU+JQ0KICB1bmdyb3VwKCkNCg0KcF9hcmVhIDwtIGdncGxvdChzdGF0ZV9zaGFyZSwNCiAgICAgICAgICAgICAgICAgYWVzKHggPSBZZWFyLA0KICAgICAgICAgICAgICAgICAgICAgeSA9IFNoYXJlLA0KICAgICAgICAgICAgICAgICAgICAgZmlsbCA9IEZ1ZWwpKSArDQogIGdlb21fYXJlYShhbHBoYSA9IDAuOSkgKw0KICBmYWNldF93cmFwKH4gU3RhdGUsIG5jb2wgPSAyKSArDQogIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBwZXJjZW50X2Zvcm1hdChhY2N1cmFjeSA9IDEpKSArDQogIHNjYWxlX2ZpbGxfbWFudWFsKA0KICAgIHZhbHVlcyA9IGMoDQogICAgICAiQmxhY2sgY29hbCIgPSAiIzFmNzhiNCIsDQogICAgICAiQnJvd24gY29hbCIgPSAiI2E2Y2VlMyIsDQogICAgICAiTmF0dXJhbCBnYXMiID0gIiMzM2EwMmMiLA0KICAgICAgIkdhcyIgICAgICAgID0gIiMzM2EwMmMiLA0KICAgICAgIkh5ZHJvIiAgICAgID0gIiNiMmRmOGEiLA0KICAgICAgIldpbmQiICAgICAgID0gIiM2YTNkOWEiLA0KICAgICAgIlNvbGFyIiAgICAgID0gIiNmZjdmMDAiLA0KICAgICAgIk90aGVyIiAgICAgID0gIiNmYjlhOTkiDQogICAgKQ0KICApICsNCiAgbGFicygNCiAgICB0aXRsZSA9ICJTdGF0ZS1ieS1zdGF0ZSBlbGVjdHJpY2l0eSBnZW5lcmF0aW9uIG1peCAoQ2FsZW5kYXIgWWVhcikiLA0KICAgIHggPSAiWWVhciIsDQogICAgeSA9ICJTaGFyZSBvZiB0b3RhbCBnZW5lcmF0aW9uIiwNCiAgICBmaWxsID0gIkZ1ZWwgdHlwZSINCiAgKSArDQogIHRoZW1lX21pbmltYWwoKSArDQogIHRoZW1lKA0KICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUsIGZhY2UgPSAiYm9sZCIpLA0KICAgIHN0cmlwLnRleHQgPSBlbGVtZW50X3RleHQoZmFjZSA9ICJib2xkIiksDQogICAgbGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSINCiAgKQ0KDQpwX2FyZWEgICANCg0KYXVzX2RhdGEgPC0gbG9hZF9zdGF0ZV9jeSgiQVVTIikNCg0KYXVzX3NoYXJlIDwtIGF1c19kYXRhICU+JQ0KICBncm91cF9ieShZZWFyKSAlPiUNCiAgbXV0YXRlKFNoYXJlID0gR1doIC8gc3VtKEdXaCwgbmEucm0gPSBUUlVFKSkgJT4lDQogIHVuZ3JvdXAoKQ0KDQplYXJsaWVzdF95ZWFyIDwtIG1pbihhdXNfc2hhcmUkWWVhciwgbmEucm0gPSBUUlVFKQ0KbGF0ZXN0X3llYXIgICA8LSBtYXgoYXVzX3NoYXJlJFllYXIsIG5hLnJtID0gVFJVRSkNCg0KbWl4X2VhcmxpZXN0IDwtIGF1c19zaGFyZSAlPiUgZmlsdGVyKFllYXIgPT0gZWFybGllc3RfeWVhcikNCm1peF9sYXRlc3QgICA8LSBhdXNfc2hhcmUgJT4lIGZpbHRlcihZZWFyID09IGxhdGVzdF95ZWFyKQ0KDQpwbG90X3BpZSA8LSBmdW5jdGlvbihkZiwgdGl0bGVfdGV4dCkgew0KICBnZ3Bsb3QoZGYsIGFlcyh4ID0gIiIsIHkgPSBTaGFyZSwgZmlsbCA9IEZ1ZWwpKSArDQogICAgZ2VvbV9jb2wod2lkdGggPSAxLCBjb2xvciA9ICJ3aGl0ZSIpICsNCiAgICBjb29yZF9wb2xhcih0aGV0YSA9ICJ5IikgKw0KICAgIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBwZXJjZW50X2Zvcm1hdChhY2N1cmFjeSA9IDEpKSArDQogICAgc2NhbGVfZmlsbF9tYW51YWwoDQogICAgICB2YWx1ZXMgPSBjKA0KICAgICAgICAiQmxhY2sgY29hbCIgPSAiIzFmNzhiNCIsDQogICAgICAgICJCcm93biBjb2FsIiA9ICIjYTZjZWUzIiwNCiAgICAgICAgIk5hdHVyYWwgZ2FzIiA9ICIjMzNhMDJjIiwNCiAgICAgICAgIkdhcyIgICAgICAgID0gIiMzM2EwMmMiLA0KICAgICAgICAiSHlkcm8iICAgICAgPSAiI2IyZGY4YSIsDQogICAgICAgICJXaW5kIiAgICAgICA9ICIjNmEzZDlhIiwNCiAgICAgICAgIlNvbGFyIiAgICAgID0gIiNmZjdmMDAiLA0KICAgICAgICAiT3RoZXIiICAgICAgPSAiI2ZiOWE5OSINCiAgICAgICkNCiAgICApICsNCiAgICBsYWJzKA0KICAgICAgdGl0bGUgPSB0aXRsZV90ZXh0LA0KICAgICAgZmlsbCAgPSAiRnVlbCB0eXBlIg0KICAgICkgKw0KICAgIHRoZW1lX3ZvaWQoKSArDQogICAgdGhlbWUoDQogICAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41LCBmYWNlID0gImJvbGQiKSwNCiAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJyaWdodCINCiAgICApDQp9DQoNCnBpZV9lYXJsaWVzdCA8LSBwbG90X3BpZShtaXhfZWFybGllc3QsDQogICAgICAgICAgICAgICAgICAgICAgICAgcGFzdGUwKCJBdXN0cmFsaWFuIGZ1ZWwgbWl4IGluICIsIGVhcmxpZXN0X3llYXIpKQ0KDQpwaWVfbGF0ZXN0IDwtIHBsb3RfcGllKG1peF9sYXRlc3QsDQogICAgICAgICAgICAgICAgICAgICAgIHBhc3RlMCgiQXVzdHJhbGlhbiBmdWVsIG1peCBpbiAiLCBsYXRlc3RfeWVhcikpDQoNCnBpZV9lYXJsaWVzdA0KcGllX2xhdGVzdA0KYGBgDQpBdXN0cmFsaWEncyBlbmVyZ3kgdHJhbnNpdGlvbiBpcyBub3QgdW5pZm9ybSBhcm91bmQgdGhlIGNvdW50cnksIGFjY29yZGluZyB0byBzdGF0ZS1sZXZlbCBjaGFydHMuIEJsYWNrIGNvYWwgc3RpbGwgZG9taW5hdGVzIE5TVyBhbmQgUUxELCBidXQgc29sYXIgYW5kIHdpbmQgcG93ZXIgYXJlIGdhaW5pbmcgcG9wdWxhcml0eS4gV2l0aCB0aGUgbWFqb3JpdHkgb2YgaXRzIHBvd2VyIGdlbmVyYXRlZCBieSByZW5ld2FibGUgc291cmNlcywgcGFydGljdWxhcmx5IHdpbmQsIFNBIHByb3ZpZGVzIHRoZSBtb3N0IGFkdmFuY2VkIHRyYW5zaXRpb24uIFZJQyBoYXMgdGhlIHNsb3dlc3QgdHJhbnNpdGlvbiB0byBjbGVhbmVyIHNvdXJjZXMsIGNvbnRpbnVpbmcgdG8gcmVseSBvbiBicm93biBjb2FsLg0KDQpCbGFjayBhbmQgYnJvd24gY29hbCB0b2dldGhlciBjb250cmlidXRlIHRvIHRoZSBtYWpvcml0eSBvZiBBdXN0cmFsaWEncyBlbmVyZ3kgZ2VuZXJhdGlvbiwgYWNjb3JkaW5nIHRvIHRoZSBuYXRpb25hbCBtaXggaW4gMjAxNS4gTmF0dXJhbCBnYXMgaXMgc21hbGxlciwgYW5kIGh5ZHJvLCB3aW5kIGFuZCBzb2xhciBvbmx5IHRha2UgYSBzbWFsbCBzaGFyZS4gVGhpcyBzaG93cyB0aGF0IHRoZSBzeXN0ZW0gd2FzIHN0aWxsIG1vc3RseSBmb3NzaWwtZnVlbCBiYXNlZCBhdCB0aGF0IHRpbWUuDQoNCkJ5IHRoZSBsYXRlc3QgeWVhciwgdGhlIHNoYXJlIG9mIHJlbmV3YWJsZXMgaW5jcmVhc2VzIHNpZ25pZmljYW50bHkuIFdpbmQgYW5kIHNvbGFyIGV4cGFuZCB0aGVpciBjb250cmlidXRpb25zLCB3aGlsZSBjb2Fs4oCZcyBzaGFyZSBkZWNsaW5lcyBjb21wYXJlZCB0byB0aGUgZWFybGllciBwZXJpb2QuIFRoaXMgc2hvd3MgdGhhdCBBdXN0cmFsaWEgaXMgc2xvd2x5IG1vdmluZyB0b3dhcmQgbW9yZSByZW5ld2FibGUgZW5lcmd5Lg0KDQojIyBTZWN0aW9uIDUg4oCTIEtleSBJbnNpZ2h0cyBhbmQgT3V0bG9vaw0KT3VyIHZpc3VhbCBzdG9yeSBsaW5rcyBmb3VyIHZpZXdzIG9mIEF1c3RyYWxpYeKAmXMgZWxlY3RyaWNpdHkgdHJhbnNpdGlvbiBhbmQgc2hvd3Mgc29tZSBrZXkgaW5zaWdodHM6DQoNCuKAoglMb25nLXRlcm0gc2hpZnQgaW4gdGhlIGZ1ZWwgbWl4IChTZWN0aW9uIDEpOiBBdXN0cmFsaWHigJlzIGdlbmVyYXRpb24gc3RydWN0dXJlIGhhcyBncmFkdWFsbHkgbW92ZWQgYXdheSBmcm9tIGNvYWwtZG9taW5hdGVkIGFuZCBub3cgd2luZCBhbmQgc29sYXIgdGFrZSBhIGxhcmdlciBzaGFyZS4NCg0K4oCiCURheSB2cyBuaWdodCBpbWJhbGFuY2UgKFNlY3Rpb24gMik6IEluIE5ldyBTb3V0aCBXYWxlcywgc29sYXIgaGFzIGJlY29tZSBhIG1haW4gc291cmNlIG9mIGRheXRpbWUgZWxlY3RyaWNpdHksIHdoaWNoIHJlcGxhY2UgcGFydCBvZiBjb2FsIGdlbmVyYXRpb24gZHVyaW5nIHRoZSBkYXkuIEhvd2V2ZXIsIGF0IG5pZ2h0LCB0aGUgc3lzdGVtIHN0aWxsIHJlbGllcyBoZWF2aWx5IG9uIGNvYWwgYW5kIGdhcywgd2hpY2ggc2hvd3MgdGhhdCBpdCBpcyBzdGlsbCBoYXZlIGEgcHJvYmxlbSB0byBydW4gYSBncmlkIHdpdGggYSBoaWdoIHNoYXJlIG9mIHNvbGFyIGF0IG5pZ2h0Lg0KDQrigKIJRHJpdmVycyBvZiB0aGUgcm9vZnRvcCBzb2xhciBib29tIChTZWN0aW9uIDMpOiBBbm51YWwgcm9vZnRvcCBzb2xhciBpbnN0YWxsYXRpb25zIGFyZSB2ZXJ5IGhpZ2ggaW4gMjAxMeKAkzIwMTIsIGZhbGwgdG8gYSBtdWNoIGxvd2VyIGxldmVsIGluIDIwMTPigJMyMDE2IGFmdGVyIHBvbGljeSBjaGFuZ2VzLCBhbmQgdGhlbiBpbmNyZWFzZSBhZ2FpbiBmcm9tIDIwMTcgYW5kIHN0YXkgaGlnaCBpbiByZWNlbnQgeWVhcnMuIFRoaXMgc2hvd3MgdGhhdCB0aGUgcm9vZnRvcCBzb2xhciBtYXJrZXQgaGFzIG1vdmVkIGZyb20gYSBzaG9ydCBzdWJzaWR5IGJvb20gdG8gYSBzdGFibGUgc3RhZ2UgbWFpbmx5IGR1ZSB0byBsb3dlciBjb3N0cy4NCg0K4oCiCVVuZXZlbiB0cmFuc2l0aW9uIGFjcm9zcyBzdGF0ZXMgKFNlY3Rpb24gNCk6IFNvbWUgc3RhdGVzLCBzdWNoIGFzIFNBLCBhbHJlYWR5IGdldCBtb3N0IG9mIHRoZWlyIGVsZWN0cmljaXR5IGZyb20gcmVuZXdhYmxlcy4gT3RoZXJzLCBsaWtlIE5TVyBhbmQgUUxELCBzdGlsbCByZWx5IGhlYXZpbHkgb24gY29hbCwgc28gdGhlIG5hdGlvbmFsIHRyYW5zaXRpb24gaXMgc2xvd2VyIG92ZXJhbGwuDQoNCkluIGdlbmVyYWwsIHRoZXNlIHZpc3VhbGl6YXRpb25zIGRlc2NyaWJlIHRoYXQgQXVzdHJhbGlh4oCZcyBlbGVjdHJpY2l0eSBzeXN0ZW0gdGhhdCBpcyBtb3ZpbmcgZnJvbSBjb2FsLWRvbWluYXRlZCB0byBtb3JlIHNvbGFyIGFuZCBvdGhlciBraW5kcyBvZiByZW5ld2FibGUgZW5lcmd5LiBJbiB0aGUgZnV0dXJlLCBBdXN0cmFsaWEgbWF5IG5lZWQgdG8gbWFuYWdlIG5pZ2h0LXRpbWUgc3VwcGx5IGJldHRlciBhbmQgcmVkdWNlIHJlZ2lvbmFsIGdhcHMuIFRoZXNlIG1ldGhvZHMgY2FuIGluY3JlYXNlIGEgaGlnaGVyIHNoYXJlIG9mIHJlbmV3YWJsZXMuDQo=