I conducted an analysis of how much content from junk news websites is spread by public Facebook pages and groups that support US Presidential Candidates Donald Trump and Joe Biden. For the purposes of this analysis, “junk news” websites are domains that posted false or misleading content in the past according to FactCheck.org
To identify pages and groups that support the candidates, I used the CrowdTangle API to search for pages and groups that have shared posts from the official Facebook pages of the candidates any time in the past year (October 2018 and October 2019). Below is the number of pages that were found which comprise the support “ecosystems” of pro-Trump and pro-Biden used in this analysis:
- 100 pro-Trump Pages (299,996 Posts)
- 216 pro-Trump Groups (299,974 Posts)
- 48 pro-Biden Pages (86,387 Posts)
- 77 pro-Biden Groups (299,995 Posts)
Of the nearly one million posts in the data, here are the number of posts that shared links of any kind (excluding links to Facebook posts):
- pro-Trump Pages: 50,222 Links
- pro-Trump Groups: 114,032 Links
- pro-Biden Pages: 12,680 Links
- pro-Biden Groups: 128,008 Links
Here are the number of links to “junk news” websites that were found in each ecosystem:
- pro-Trump Pages: 248 Total Links (0.5% of all links)
- pro-Trump Groups: 1,343 Total Links (1.1% of all links)
- pro-Biden Pages: 0 Total Links (0% of all Links)
- pro-Biden Groups: 38 Total Links (0.02% of all links)
In the pro-Trump Pages Ecosystem, there were 213 unique links shared from 10 “junk news” websites. Of the 213 links, 163 of them came from the Geller Report, which according to FactCheck.org “is run by Pamela Geller, an anti-Islamic activist.” Other sources of “junk news” that were shared were:
- “puppetstringnews.com”, which per its homepage was “created by a US NAVY vet, who served four years in the military, got out because he was tired of the world and it’s current state. Decided to get into alternative news to tell the truth to best of ability.”
- “neonnettle.com”, which is a British website with an “About Us” page that states: “we believe the mainstream has become less valid as it continues its ongoing practices of censorship and engineered narratives.”
- “newspunch.com”, which FactCheck.org says “is the new site for Yournewswire.com, which has been a prolific poster of misinformation and conspiracy theories.”
The links from “junk news” websites that were most shared within the pro-Trump Pages ecosystem were as follows:
A text analysis of the Descriptions accompanying the links highlights the dominant topics of the “junk news” shared: borders and Islam. Mentions of Islam are correlated with prominent Democratic congresswomen Ilhan Omar and Rashida Tlaib as well as sharia and jihad.

Of the 100 pages in the pro-Trump Pages ecosystem, 34 of them shared a “junk news” link. The most prolific sharer is “Wake Up America, the Original”, which was responsible for nearly one-third of the “junk news” links and has more than 500,000 followers.
Only a handful of junk news links (nine) were shared by multiple pages so it is difficult to assess widespread coordinated behavior among pages. However, a social network analysis of “junk news” links that were shared indicates apparent coordination among four pro-Trump pages to amplify content:
- Silence is Consent - US Border Invasion
- Stand With Illinois Against The Illegal Alien Invasion
- Stand With North Dakota Against The Illegal Alien Invasion
- Stand With South Dakota Against The Illegal Alien Invasion
A time-series analysis indicates that the “Stand With [blank] Against the Illegal Alien Invasion” pages are clearly coordinating to share junk news links related to immigration. The x axis represents the time elapsed between posts (in seconds), thus the more vertical the line, the shorter the time between posts of the same link. A lesser substantial trend (given so few data points) is seen in relation to junk news links that reference Jeffrey Epstein and Elijah Cummings, indicating that the “Trump ‘The People’s President’” page may be an influencor of at least two other pages: “Republicans For Trump” and “Trump, American Patriot.”

In the pro-Trump Groups Ecosystem, there were 506 unique links shared from different 16 “junk news” websites. Of the 506 links, 129 were from “neonnettle.com.” Multiple “junk news” websites found in the pro-Trump Pages ecosystem, e.g. “puppetstringnews.com”, “newspunch.com”, “gellerreport.com” - were widely shared in pro-Trump Groups. Three other “junk news” websites also featured prominently:
- “conservativetreehouse.com”, which notes on its “About Us” page that “fear is at the core of liberalism, and love/trust is at the core of conservatism. Liberalism is about control. Conservatism is about self-empowerment.”
- “infowars.com”, which is the website for the popular conspiracy theory radio show by the same name hosted by Alex Jones.
- “rightwingtribune.com”, which FactCheck.org says “doesn’t have a disclaimer, but it does say on one of at least five associated Facebook pages: ‘If You Are A Right Winger And PISSED You’re In The Right Place. We Provide High Quality Journalism With Viral Memes and Video In Between! So Give Us A Like! You Won’t Be Dissapointed.’”
The links from “junk news” websites that were most shared within the pro-Trump Groups ecosystem were as follows:
A text analysis of the Descriptions accompanying the links highlights Ukraine as a key topic of conversation, specifically in relation to the Bidens. Other “junk news” topics relate to the ongoing impeachment inquiry and two prominent House Democrats - Speaker Nancy Pelosi and Intelligence Committee Chairman Adam Schiff. The Clintons are less prominent topics of “junk news”" circulating in pro-Trump groups.

Of the 226 groups in the pro-Trump Groups ecosystem, at least one “junk news” links was found to have been posted in 162 of them. Two large groups with the name “Drain The Swamp” are particularly rife with junk news links.
A social network analysis of “junk news” links posted within the pro-Trump Groups ecosystem indicates a lot of overlap in “junk news” content from group to group although it is unclear how much coordination, if any, exists.
Note: With consideration to privacy protection of Facebook users, CrowdTangle does not permit you to see which specific user accounts posted to groups or whether the link was shared from a particular page. Thus it is not possible to definitively determine whether specific accounts are engaging in coordinated behavior to amplify content across groups. However, it is possible to see what content is shared within groups by timestamp, providing some insight as to whether there may be some coordination among users across groups.

A further analysis of nine of the top 10 junk news links shared in pro-Trump Groups indicates that there is seemingly little coordination. Instead, the sharing of junk news links, while pervasive, appears to be more or less organic. However, it is not possible to definitively say whether there is some level of coordination among specific group members given that the identities of members are privacy protected.

In the pro-Biden Groups Ecosystem, there were 26 unique links shared from six different “junk news” websites - all of which appear in the pro-Trump Pages or pro-Trump Groups ecosystems. Of the 26 links, 13 were from “neonnettle.com”, seven were from “newspunch.com”, two from “yournewswire.com” and one each from “conservativepost.com”, “gellerreport.com”, “infowars.com”, and “puppetstringnews.com”.
The links from “junk news” websites that were most shared within the pro-Biden Groups ecosystem were as follows:
Of the 77 groups in the pro-Biden Groups ecosystem, at least one “junk news” link was posted in 18 of them. Most links were only posted one time in a single group. In six groups, two “junk news” links were found. The outlier is a group named “Biden for president”, in which 13 different “junk news” links were found.
The “junk news” links in the “Biden for President” group feature links to anti-Biden, anti-Democrat, anti-immigrant and anti-Islam content, which suggests that the “Biden for president” group is actually an anti-Biden group.
LS0tCnRpdGxlOiAiSnVuayBOZXdzIFNoYXJpbmcgaW4gUHJvLVRydW1wICYgUHJvLUJpZGVuIEZhY2Vib29rIEVjb3N5c3RlbXMiCm91dHB1dDogaHRtbF9ub3RlYm9vawotLS0KCkkgY29uZHVjdGVkIGFuIGFuYWx5c2lzIG9mIGhvdyBtdWNoIGNvbnRlbnQgZnJvbSBqdW5rIG5ld3Mgd2Vic2l0ZXMgaXMgc3ByZWFkIGJ5IHB1YmxpYyBGYWNlYm9vayBwYWdlcyBhbmQgZ3JvdXBzIHRoYXQgc3VwcG9ydCBVUyBQcmVzaWRlbnRpYWwgQ2FuZGlkYXRlcyBEb25hbGQgVHJ1bXAgYW5kIEpvZSBCaWRlbi4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGFuYWx5c2lzLCAianVuayBuZXdzIiB3ZWJzaXRlcyBhcmUgZG9tYWlucyB0aGF0IHBvc3RlZCBmYWxzZSBvciBtaXNsZWFkaW5nIGNvbnRlbnQgaW4gdGhlIHBhc3QgYWNjb3JkaW5nIHRvIFtGYWN0Q2hlY2sub3JnXShodHRwczovL3d3dy5mYWN0Y2hlY2sub3JnLzIwMTcvMDcvd2Vic2l0ZXMtcG9zdC1mYWtlLXNhdGlyaWNhbC1zdG9yaWVzLykgCgpUbyBpZGVudGlmeSBwYWdlcyBhbmQgZ3JvdXBzIHRoYXQgc3VwcG9ydCB0aGUgY2FuZGlkYXRlcywgSSB1c2VkIHRoZSBDcm93ZFRhbmdsZSBBUEkgdG8gc2VhcmNoIGZvciBwYWdlcyBhbmQgZ3JvdXBzIHRoYXQgaGF2ZSBzaGFyZWQgcG9zdHMgZnJvbSB0aGUgb2ZmaWNpYWwgRmFjZWJvb2sgcGFnZXMgb2YgdGhlIGNhbmRpZGF0ZXMgYW55IHRpbWUgaW4gdGhlIHBhc3QgeWVhciAoT2N0b2JlciAyMDE4IGFuZCBPY3RvYmVyIDIwMTkpLiBCZWxvdyBpcyB0aGUgbnVtYmVyIG9mIHBhZ2VzIHRoYXQgd2VyZSBmb3VuZCB3aGljaCBjb21wcmlzZSB0aGUgc3VwcG9ydCAiZWNvc3lzdGVtcyIgb2YgcHJvLVRydW1wIGFuZCBwcm8tQmlkZW4gdXNlZCBpbiB0aGlzIGFuYWx5c2lzOiAKCiogMTAwIHByby1UcnVtcCBQYWdlcyAoMjk5LDk5NiBQb3N0cykKKiAyMTYgcHJvLVRydW1wIEdyb3VwcyAoMjk5LDk3NCBQb3N0cykKKiA0OCBwcm8tQmlkZW4gUGFnZXMgKDg2LDM4NyBQb3N0cykKKiA3NyBwcm8tQmlkZW4gR3JvdXBzICgyOTksOTk1IFBvc3RzKQoKYGBge3IsIGVjaG89RkFMU0UsIGV2YWw9RkFMU0UsIGV2YWw9RkFMU0V9CiMwX0xPQUQgUEFDS0FHRVMKcmVxdWlyZSgiZHBseXIiKQpyZXF1aXJlKCJzdHJpbmdyIikKcmVxdWlyZSgiZ2dwbG90MiIpCnJlcXVpcmUoImdyaWRFeHRyYSIpCnJlcXVpcmUoInNjYWxlcyIpCnJlcXVpcmUoIkRUIikKcmVxdWlyZSgiaWdyYXBoIikKcmVxdWlyZSgiZ2dyYXBoIikKI3JlcXVpcmUoInJzY29ubmVjdCIpCmBgYAoKYGBge3IsIGVjaG89RkFMU0UsIGV2YWw9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CiMxX1JFQUQgSU4gREFUQSBBTkQgTE9BRCBORUVERUQgRlVOQ1RJT05TCmR0cGFnZXMgPC0gcmVhZFJEUyhmaWxlPSJkdHBhZ2VzX29jdDE4LW9jdDE5LnJkYSIpCmR0Z3JvdXBzIDwtIHJlYWRSRFMoZmlsZT0iZHRncm91cHNfb2N0MTgtb2N0MTkucmRhIikKamJwYWdlcyA8LSByZWFkUkRTKGZpbGU9ImpicGFnZXNfb2N0MTgtb2N0MTkucmRhIikKamJncm91cHMgPC0gcmVhZFJEUyhmaWxlPSJqYmdyb3Vwc19vY3QxOC1vY3QxOS5yZGEiKQoKI0Z1bmN0aW9uIGZvciBEb21haW4gRXh0cmFjdGlvbgpkb21haW4gPC0gZnVuY3Rpb24oeCkgc3Ryc3BsaXQoZ3N1YigiaHR0cDovL3xodHRwczovL3x3d3dcXC4iLCAiIiwgeCksICIvIilbW2MoMSwgMSldXQoKI0RvbWFpbnMgdG8gZXhjbHVkZSB0aHJvdWdoIGZpbHRlcmluZwpleGNsdWRlIDwtIGMoImZhY2Vib29rLmNvbSIsICJ5b3V0dWJlLmNvbSIsICJ5b3V0dS5iZSIsICJ0d2l0dGVyLmNvbSIsICJyZXV0ZXJzLmNvbSIsICJ0cmliLmFsIiwgImJpdC5seSIsICJtLnlvdXR1YmUuY29tIiwgImRsdnIuaXQiLCAidC5jbyIsICJvdy5seSIsICJidWZmLmx5IiwgIm5ld3N0ZWFtLnJvIiwgInJldmVyYm5hdGlvbi5jb20iKQoKI0RvbWFpbnMgS25vd24gVG8gUGVkZGxlICJGYWtlIE5ld3MiCiNzb3VyY2UgPSBodHRwczovL3d3dy5mYWN0Y2hlY2sub3JnLzIwMTcvMDcvd2Vic2l0ZXMtcG9zdC1mYWtlLXNhdGlyaWNhbC1zdG9yaWVzLwpmYWtlbmV3cyA8LSBjKCJhbWVyaWNhc2ZyZWVkb21maWdodGVycy5jb20iLCAiYW1lcmljYXNsYXN0bGluZW9mZGVmZW5zZS5vcmciLCAidHJ1bXBiZXRyYXllZC51cyIsICJ3b3JzdHBvdC51cyIsICJub2Zha2VuZXdzb25saW5lLnVzIiwgInRoZWFtZXJpY2FuZXdzLmNvIiwgImFtZXJpY2Fuam91cm5hbHJldmlldy5jb20iLCAiYW1lcmljYXRhbGtzLmNvbSIsICJ0aGVwZWRvZ2F0ZS5jb20iLCAiYmFubmVkaW5mb3JtYXRpb24uY29tIiwgImJsaW5nbmV3cy5jb20iLCAiY2JpbmZvMjQuY29tIiwiY2hhbm5lbDIzbmV3cy5jb20iLCJjb25zZXJ2YXRpdmVhbmdsZS5jb20iLCAiY29uc25hdGlvbi5jb20iLCAiY29uc2VydmF0aXZlcG9zdC5jb20iLCJ0aGVjb25zZXJ2YXRpdmV0cmVlaG91c2UuY29tIiwgImRhaWx5LXZpbmUuY29tIiwgImVtcGlyZW5ld3MubmV0IiwgImVuLXZvbHZlLmNvbSIsICJmYm5ld3NjeWNsZS5jb20iLCAiZmVsbG93c2hpcG9mdGhlbWluZHMuY29tIiwgImdlbGxlcnJlcG9ydC5jb20iLCAiaW5mb3dhcnMuY29tIiwgImthZ2ZlZWQuY29tIiwgInRoZWxpYmVydHlyYWlzZS5jb20iLCAibG9uZG9ud2VibmV3cy5jb20iLCAibW1pbmZvMjQuY29tIiwgIm5lb25uZXR0bGUuY29tIiwgIm5ld3NwdW5jaC5jb20iLCAieW91cm5ld3N3aXJlLmNvbSIsICJwb2xpdGljb3BzLmNvbSIsICJwb2xpdGljb3QuY29tIiwgIm55ZXZlbmluZ25ld3MuY29tIiwgInBhdHJpb3Rzd2Fsay51cyIsICJwb2xpY2V0YXNrLmNvbSIsICJwb2xpdGljc2ZvY3VzLmNvbSIsICJ0aGUtcG9zdGlsbG9uLmNvbSIsICJwdXBwZXRzdHJpbmduZXdzLmNvbSIsICJyZWFsbmV3c3JpZ2h0bm93LmNvbSIsICJyaWdodHdpbmd0cmlidW5lLmNvbSIsICJyd25vZmZpY2lhbC5jb20iLCAidGhlcmlnaHRpc3RzLmNvbSIsICJzcGVjaWFsbmV3c3VzZS5jb20iLCAiN25ld3Nwb2xpdGljYWwuc2l0ZSIsICJzdGdlb3JnZWdhemV0dGUuY29tIiwgInRlZGR5c3RpY2suY29tIiwgInRvcGFsZXJ0bmV3cy5jb20iLCAidHJ1dGhmZWVkbmV3cy5jb20iLCAidW5pdmVyc2FsZWluZm8uY29tIiwgInVzc2FuZXdzLmNvbSIsICJ2aXJhbGNvcmRzLmNvbSIsICJ2aXJhbG5ld3NwYnMuc2l0ZSIsICJ2aXJhbGl0eXRoaW5ncy51cyIsICJ3ZWJ2aW5lcnMuY29tIiwgIndvcmxkbmV3c2RhaWx5cmVwb3J0LmNvbSIpCgp0ZXh0X2NsZWFuIDwtIGZ1bmN0aW9uKGRhdGEsIHRleHQpIHsKICByZXF1aXJlKCJkcGx5ciIpCiAgdGV4dCA8LSBlbnF1byh0ZXh0KQogIGRhdGEgPC0gZGF0YSAlPiUgc2VsZWN0KCEhdGV4dCkgJT4lIGZpbHRlcighIXRleHQgIT0gIiIpICNyZW1vdmUgZW1wdHkgbWVzc2FnZXMKICBkYXRhIDwtIGRhdGEgJT4lIG11dGF0ZSh0ZXh0PWFzLmNoYXJhY3RlcighIXRleHQpKQogIGRhdGEgPC0gZGF0YSAlPiUgbXV0YXRlKHRleHQ9Z3N1YigiaHR0cFteWzpzcGFjZTpdXSoiLCAnJywgdGV4dCkpCiAgZGF0YSA8LSBkYXRhICU+JSBtdXRhdGUodGV4dD1nc3ViKCIjXFx3KyAqIiwgJycsIHRleHQpKQogIGRhdGEgPC0gZGF0YSAlPiUgbXV0YXRlKHRleHQ9Z3N1YigiQFxcdysgKiIsICcnLCB0ZXh0KSkKICBkYXRhIDwtIGRhdGEgJT4lIG11dGF0ZSh0ZXh0PWdzdWIoIlJUXFx3KyAqOiIsICcnLCB0ZXh0KSkgCiAgZGF0YSA8LSBkYXRhICU+JSBtdXRhdGUodGV4dD1nc3ViKCJbWzpkaWdpdDpdXSsiLCAnJywgdGV4dCkpCiAgZGF0YSA8LSBkYXRhICU+JSBtdXRhdGUodGV4dD1nc3ViKCJbWzpwdW5jdDpdXSsiLCAnJywgdGV4dCkpIAogIGRhdGEgPC0gZGF0YSAlPiUgbXV0YXRlKHRleHQ9Z3N1YigiW15bOmFsbnVtOl1dIiwnICcsIHRleHQpKQogIGRhdGEgPC0gZGF0YSAlPiUgZmlsdGVyKHRleHQgIT0gIiIpICU+JSBtdXRhdGUoaWQgPSByb3dfbnVtYmVyKCkpICU+JSB0cmFuc211dGUoaWQ9aWQsIHRleHQ9dGV4dCkgIAogIHJldHVybihkYXRhKQp9Cgp0ZXh0X3Rva2VuaXplIDwtIGZ1bmN0aW9uKGRhdGEsIHRleHQsIHN0b3B3b3Jkcz1OVUxMLCBuPU5VTEwpIHsKICByZXF1aXJlKCJkcGx5ciIpCiAgcmVxdWlyZSgidGlkeXIiKQogIHJlcXVpcmUoInRpZHl0ZXh0IikKICB0ZXh0PWVucXVvKHRleHQpCiAgaWYoaXMubnVsbChzdG9wd29yZHMpKSB7IHN0b3B3b3JkcyA8LSB0aWR5dGV4dDo6c3RvcF93b3JkcyB9CiAgaWYoaXMubnVsbChuKSkgeyBuIDwtIDEgfQogIHRva2VucyA8LSBkYXRhICU+JSB1bm5lc3RfdG9rZW5zKHdvcmQsICEhdGV4dCkKICB0b2tlbnMgPC0gdG9rZW5zICU+JSBmaWx0ZXIoIShuY2hhcih3b3JkKT09MSkpICU+JSBhbnRpX2pvaW4oc3RvcHdvcmRzKSAKICB0b2tlbnMgPC0gdG9rZW5zICU+JSBtdXRhdGUoaW5kPXJvd19udW1iZXIoKSkKICB0b2tlbnMgPC0gdG9rZW5zICU+JSBncm91cF9ieShpZCkgJT4lIG11dGF0ZShpbmQ9cm93X251bWJlcigpKSAlPiUgc3ByZWFkKGtleT1pbmQsIHZhbHVlPXdvcmQpIAogIHRva2Vuc1tpcy5uYSh0b2tlbnMpXSA8LSAiIgogIHRva2VucyA8LSB1bml0ZSh0b2tlbnMsIHRleHQsIC1pZCwgc2VwPSIgIikKICB0b2tlbnMkdGV4dCA8LSB0cmltd3ModG9rZW5zJHRleHQpCiAgdG9rZW5zIDwtIHRva2VucyAlPiUgdW5uZXN0X3Rva2VucyhuZ3JhbSwgdGV4dCwgdG9rZW49Im5ncmFtcyIsIG49bikKICByZXR1cm4odG9rZW5zKQp9Cgp0ZXh0X2NvcnJlbGF0aW9uIDwtIGZ1bmN0aW9uKGRhdGEsIG5ncmFtLCB0b3A9TlVMTCwgbWVudGlvbnM9TlVMTCkgewogIHJlcXVpcmUoImRwbHlyIikKICByZXF1aXJlKCJ3aWR5ciIpCiAgbmdyYW0gPC0gZW5xdW8obmdyYW0pCiAgaWYoaXMubnVsbCh0b3ApKSB7IHRvcCA8LSAyMCB9CiAgaWYoaXMubnVsbChtZW50aW9ucykpIHsgbWVudGlvbnMgPC0gMSB9CiAgdG9wX25ncmFtcyA8LSBkYXRhICU+JSBncm91cF9ieSghIW5ncmFtKSAlPiUgY291bnQoKSAlPiUgYXJyYW5nZShkZXNjKG4pKSAlPiUgaGVhZCh0b3ApCiAgdG9wX25ncmFtcyA8LSB0b3BfbmdyYW1zJG5ncmFtCiAgY29ycmVsYXRpb24gPC0gZGF0YSAlPiUgZ3JvdXBfYnkoISFuZ3JhbSkgJT4lIGZpbHRlcihuKCkgPj0gbWVudGlvbnMpICU+JSBwYWlyd2lzZV9jb3IobmdyYW0sIGlkLCBzb3J0PVQpCiAgdG9wX3RvcGljcyA8LSBjb3JyZWxhdGlvbiAlPiUgZmlsdGVyKGl0ZW0xICVpbiUgdG9wX25ncmFtcykgJT4lIHRyYW5zbXV0ZSh0b3BpYz1pdGVtMSwgbWVudGlvbj1pdGVtMiwgY29ycmVsYXRpb249Y29ycmVsYXRpb24pCiAgcmV0dXJuKHRvcF90b3BpY3MpCn0KCnRvcGljX3JlZHVjZSA8LSBmdW5jdGlvbihkYXRhLCB0b3BpYywgbWVudGlvbnM9TlVMTCkgewogIHJlcXVpcmUoImRwbHlyIikKICB0b3BpYyA8LSBlbnF1byh0b3BpYykKICAjc29ydCA8LSBlbnF1byhzb3J0KQogICNpZihpcy5udWxsKHNvcnQpKSB7IHNvcnQgPC0gY29ycmVsYXRpb24gfQogIGlmKGlzLm51bGwobWVudGlvbnMpKSB7IG1lbnRpb25zIDwtIDEwIH0KICBjbGVhbiA8LSBkYXRhICU+JSBncm91cF9ieSghIXRvcGljKSAlPiUgdG9wX24obWVudGlvbnMsIHd0PWNvcnJlbGF0aW9uKSAlPiUgdW5ncm91cCgpICU+JSBhcnJhbmdlKCEhdG9waWMsIGNvcnJlbGF0aW9uKSAlPiUgbXV0YXRlKC5yID0gcm93X251bWJlcigpKQogIHJldHVybihjbGVhbikKfQpgYGAKCk9mIHRoZSBuZWFybHkgb25lIG1pbGxpb24gcG9zdHMgaW4gdGhlIGRhdGEsIGhlcmUgYXJlIHRoZSBudW1iZXIgb2YgcG9zdHMgdGhhdCBzaGFyZWQgbGlua3Mgb2YgYW55IGtpbmQgKGV4Y2x1ZGluZyBsaW5rcyB0byBGYWNlYm9vayBwb3N0cyk6IAoKKiBwcm8tVHJ1bXAgUGFnZXM6IDUwLDIyMiBMaW5rcwoqIHByby1UcnVtcCBHcm91cHM6IDExNCwwMzIgTGlua3MKKiBwcm8tQmlkZW4gUGFnZXM6IDEyLDY4MCBMaW5rcwoqIHByby1CaWRlbiBHcm91cHM6IDEyOCwwMDggTGlua3MKCmBgYHtyLCBlY2hvPUZBTFNFLCBldmFsPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQojVHJ1bXAgUGFnZXMKZHRwYWdlc19qdW5rX2RvbSA8LSBkdHBhZ2VzICU+JSBmaWx0ZXIoRmluYWwuTGluayE9IiIpCmR0cGFnZXNfanVua19kb20kZG9tYWluIDwtIHNhcHBseShkdHBhZ2VzX2p1bmtfZG9tJEZpbmFsLkxpbmssIGRvbWFpbikKZHRwYWdlc19qdW5rX2RvbSRkb21haW4gPC0gdG9sb3dlcihkdHBhZ2VzX2p1bmtfZG9tJGRvbWFpbikKcm0oZHRwYWdlcykKCiNUcnVtcCBHcm91cHMKZHRncm91cHNfanVua19kb20gPC0gZHRncm91cHMgJT4lIGZpbHRlcihMaW5rIT0iIikKZHRncm91cHNfanVua19kb20kZG9tYWluIDwtIHNhcHBseShkdGdyb3Vwc19qdW5rX2RvbSRMaW5rLCBkb21haW4pCmR0Z3JvdXBzX2p1bmtfZG9tJGRvbWFpbiA8LSB0b2xvd2VyKGR0Z3JvdXBzX2p1bmtfZG9tJGRvbWFpbikKZHRncm91cHNfanVua19kb21fbm9mYiA8LSBkdGdyb3Vwc19qdW5rX2RvbSAlPiUgZmlsdGVyKGRvbWFpbiAhPSAiZmFjZWJvb2suY29tIikKcm0oZHRncm91cHMpCgojQmlkZW4gUGFnZXMKamJwYWdlc19qdW5rX2RvbSA8LSBqYnBhZ2VzICU+JSBmaWx0ZXIoRmluYWwuTGluayE9IiIpCmpicGFnZXNfanVua19kb20kZG9tYWluIDwtIHNhcHBseShqYnBhZ2VzX2p1bmtfZG9tJEZpbmFsLkxpbmssIGRvbWFpbikKamJwYWdlc19qdW5rX2RvbSRkb21haW4gPC0gdG9sb3dlcihqYnBhZ2VzX2p1bmtfZG9tJGRvbWFpbikgCnJtKGpicGFnZXMpCgojQmlkZW4gR3JvdXBzCmpiZ3JvdXBzX2p1bmtfZG9tIDwtIGpiZ3JvdXBzICU+JSBmaWx0ZXIoTGluayE9IiIpCmpiZ3JvdXBzX2p1bmtfZG9tJGRvbWFpbiA8LSBzYXBwbHkoamJncm91cHNfanVua19kb20kTGluaywgZG9tYWluKQpqYmdyb3Vwc19qdW5rX2RvbSRkb21haW4gPC0gdG9sb3dlcihqYmdyb3Vwc19qdW5rX2RvbSRkb21haW4pCmpiZ3JvdXBzX2p1bmtfZG9tX25vZmIgPC0gamJncm91cHNfanVua19kb20gJT4lIGZpbHRlcihkb21haW4gIT0gImZhY2Vib29rLmNvbSIpCnJtKGR0Z3JvdXBzKQpgYGAKSGVyZSBhcmUgdGhlIG51bWJlciBvZiBsaW5rcyB0byAianVuayBuZXdzIiB3ZWJzaXRlcyB0aGF0IHdlcmUgZm91bmQgaW4gZWFjaCBlY29zeXN0ZW06CgoqIHByby1UcnVtcCBQYWdlczogMjQ4IFRvdGFsIExpbmtzICgwLjUlIG9mIGFsbCBsaW5rcykKKiBwcm8tVHJ1bXAgR3JvdXBzOiAxLDM0MyBUb3RhbCBMaW5rcyAoMS4xJSBvZiBhbGwgbGlua3MpCiogcHJvLUJpZGVuIFBhZ2VzOiAwIFRvdGFsIExpbmtzICgwJSBvZiBhbGwgTGlua3MpCiogcHJvLUJpZGVuIEdyb3VwczogMzggVG90YWwgTGlua3MgKDAuMDIlIG9mIGFsbCBsaW5rcykgCgpgYGB7ciwgZWNobz1GQUxTRSwgZXZhbD1GQUxTRSwgd2FybmluZz1GQUxTRX0KI0FsbCBKdW5rIE5ld3MgTGlua3MgCmR0cGFnZXNfanVua19kb20gJT4lIHNlbGVjdChQYWdlLk5hbWUsIENyZWF0ZWQsIGRvbWFpbiwgTGluay5UZXh0LCBQYWdlLkxpa2VzLmF0LlBvc3RpbmcpICU+JSBmaWx0ZXIoZG9tYWluICVpbiUgZmFrZW5ld3MpICU+JSBncm91cF9ieShMaW5rLlRleHQpICU+JSBhcnJhbmdlKENyZWF0ZWQpICU+JSBtdXRhdGUocmVhY2g9Y3Vtc3VtKFBhZ2UuTGlrZXMuYXQuUG9zdGluZyksIGluZGV4PXNlcV9hbG9uZyhMaW5rLlRleHQpKSAlPiUgYXJyYW5nZShMaW5rLlRleHQsIGluZGV4KQoKamJwYWdlc19qdW5rX2RvbSAlPiUgc2VsZWN0KFBhZ2UuTmFtZSwgQ3JlYXRlZCwgZG9tYWluLCBMaW5rLlRleHQsIFBhZ2UuTGlrZXMuYXQuUG9zdGluZykgJT4lIGZpbHRlcihkb21haW4gJWluJSBmYWtlbmV3cykgJT4lIGdyb3VwX2J5KExpbmsuVGV4dCkgJT4lIGFycmFuZ2UoQ3JlYXRlZCkgJT4lIG11dGF0ZShyZWFjaD1jdW1zdW0oUGFnZS5MaWtlcy5hdC5Qb3N0aW5nKSwgaW5kZXg9c2VxX2Fsb25nKExpbmsuVGV4dCkpICU+JSBhcnJhbmdlKExpbmsuVGV4dCwgaW5kZXgpCmBgYAoKSW4gdGhlICoqcHJvLVRydW1wIFBhZ2VzIEVjb3N5c3RlbSoqLCB0aGVyZSB3ZXJlIDIxMyB1bmlxdWUgbGlua3Mgc2hhcmVkIGZyb20gMTAgImp1bmsgbmV3cyIgd2Vic2l0ZXMuIE9mIHRoZSAyMTMgbGlua3MsIDE2MyBvZiB0aGVtIGNhbWUgZnJvbSB0aGUgR2VsbGVyIFJlcG9ydCwgd2hpY2ggYWNjb3JkaW5nIHRvIEZhY3RDaGVjay5vcmcgImlzIHJ1biBieSBQYW1lbGEgR2VsbGVyLCBhbiBhbnRpLUlzbGFtaWMgYWN0aXZpc3QuIiBPdGhlciBzb3VyY2VzIG9mICJqdW5rIG5ld3MiIHRoYXQgd2VyZSBzaGFyZWQgd2VyZTogCgoqICJwdXBwZXRzdHJpbmduZXdzLmNvbSIsIHdoaWNoIHBlciBpdHMgaG9tZXBhZ2Ugd2FzICJjcmVhdGVkIGJ5IGEgVVMgTkFWWSB2ZXQsIHdobyBzZXJ2ZWQgZm91ciB5ZWFycyBpbiB0aGUgbWlsaXRhcnksIGdvdCBvdXQgYmVjYXVzZSBoZSB3YXMgdGlyZWQgb2YgdGhlIHdvcmxkIGFuZCBpdOKAmXMgY3VycmVudCBzdGF0ZS4gRGVjaWRlZCB0byBnZXQgaW50byBhbHRlcm5hdGl2ZSBuZXdzIHRvIHRlbGwgdGhlIHRydXRoIHRvIGJlc3Qgb2YgYWJpbGl0eS4iCiogIm5lb25uZXR0bGUuY29tIiwgd2hpY2ggaXMgYSBCcml0aXNoIHdlYnNpdGUgd2l0aCBhbiAiQWJvdXQgVXMiIHBhZ2UgdGhhdCBzdGF0ZXM6ICJ3ZSBiZWxpZXZlIHRoZSBtYWluc3RyZWFtIGhhcyBiZWNvbWUgbGVzcyB2YWxpZCBhcyBpdCBjb250aW51ZXMgaXRzIG9uZ29pbmcgcHJhY3RpY2VzIG9mIGNlbnNvcnNoaXAgYW5kIGVuZ2luZWVyZWQgbmFycmF0aXZlcy4iCiogIm5ld3NwdW5jaC5jb20iLCB3aGljaCBGYWN0Q2hlY2sub3JnIHNheXMgImlzIHRoZSBuZXcgc2l0ZSBmb3IgWW91cm5ld3N3aXJlLmNvbSwgd2hpY2ggaGFzIGJlZW4gYSBwcm9saWZpYyBwb3N0ZXIgb2YgbWlzaW5mb3JtYXRpb24gYW5kIGNvbnNwaXJhY3kgdGhlb3JpZXMuIgoKVGhlIGxpbmtzIGZyb20gImp1bmsgbmV3cyIgd2Vic2l0ZXMgdGhhdCB3ZXJlIG1vc3Qgc2hhcmVkIHdpdGhpbiB0aGUgcHJvLVRydW1wIFBhZ2VzIGVjb3N5c3RlbSB3ZXJlIGFzIGZvbGxvd3M6CgpgYGB7ciwgZWNobz1GQUxTRSwgZXZhbD1UUlVFLCB3YXJuaW5nPUZBTFNFfQojTW9zdCBTaGFyZWQgIkp1bmsgTmV3cyIgTGlua3MgKG4gPiAxKQoKI2R0cGFnZXNfanVua19kb20gJT4lIGZpbHRlcihkb21haW4gJWluJSBmYWtlbmV3cykgJT4lIGdyb3VwX2J5KGRvbWFpbikgJT4lIGNvdW50KCkgJT4lIGFycmFuZ2UoZGVzYyhuKSkgJT4lIGhlYWQoMjUpCm9kZGJhbGwgPC0gYygiUGFtZWxhIEdlbGxlciIsICJ8IE5lb24gTmV0dGxlIiwgCiJDb25zZXJ2YXRpdmUgUG9zdCIsICJBbmdlbCIsICJEZW5uaXMiLCAiTGFycnkiLCAiTGVlIiwgIlNob3cgQXJjaGl2ZXMiLCAiQnJpYW4gS29sZmFnZSIpCmR0cF9kdCA8LSBkdHBhZ2VzX2p1bmtfZG9tICU+JSBzZWxlY3QoUGFnZS5OYW1lLCBDcmVhdGVkLCBkb21haW4sIExpbmsuVGV4dCwgUGFnZS5MaWtlcy5hdC5Qb3N0aW5nKSAlPiUgZmlsdGVyKGRvbWFpbiAlaW4lIGZha2VuZXdzKSAlPiUgZmlsdGVyKCFMaW5rLlRleHQgJWluJSBvZGRiYWxsKSAlPiUgZ3JvdXBfYnkoTGluay5UZXh0LCBkb21haW4pICU+JSBjb3VudCgpICU+JSBhcnJhbmdlKGRlc2MobikpCgojZHRwX2R0ICU+JSBncm91cF9ieShkb21haW4pICU+JSBjb3VudCgpICU+JSBhcnJhbmdlKGRlc2MobikpCgpkYXRhdGFibGUoZHRwX2R0LCBvcHRpb25zPWxpc3Qob3JkZXI9bGlzdChsaXN0KDMsICdkZXNjJykpKSkKYGBgCgpBIHRleHQgYW5hbHlzaXMgb2YgdGhlIERlc2NyaXB0aW9ucyBhY2NvbXBhbnlpbmcgdGhlIGxpbmtzIGhpZ2hsaWdodHMgdGhlIGRvbWluYW50IHRvcGljcyBvZiB0aGUgImp1bmsgbmV3cyIgc2hhcmVkOiBib3JkZXJzIGFuZCBJc2xhbS4gTWVudGlvbnMgb2YgSXNsYW0gYXJlIGNvcnJlbGF0ZWQgd2l0aCBwcm9taW5lbnQgRGVtb2NyYXRpYyBjb25ncmVzc3dvbWVuIElsaGFuIE9tYXIgYW5kIFJhc2hpZGEgVGxhaWIgYXMgd2VsbCBhcyBzaGFyaWEgYW5kIGppaGFkLiAKCmBgYHtyLCBlY2hvPUZBTFNFLCBldmFsPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpkdHBhZ2VzX2p1bmtfZG9tICU+JSBmaWx0ZXIoZG9tYWluICVpbiUgZmFrZW5ld3MpICU+JSBzZWxlY3QoTGluay5UZXh0LCBEZXNjcmlwdGlvbikgJT4lIGhlYWQoMTAwKQoKZHRwYWdlc19qdW5rX2xpbmt0ZXh0IDwtIGR0cGFnZXNfanVua19kb20gJT4lIGZpbHRlcihkb21haW4gJWluJSBmYWtlbmV3cykgJT4lIGdyb3VwX2J5KFBhZ2UuTmFtZSkgJT4lIHVuZ3JvdXAoKSAlPiUgbXV0YXRlKGlkPXJvd19udW1iZXIoKSwgRGVzY3JpcHRpb249YXMuY2hhcmFjdGVyKERlc2NyaXB0aW9uKSkgJT4lIHNlbGVjdChpZCwgRGVzY3JpcHRpb24pCmR0cGFnZXNfanVua19saW5rdGV4dCA8LSB0ZXh0X2NsZWFuKGRhdGE9ZHRwYWdlc19qdW5rX2xpbmt0ZXh0LCB0ZXh0PURlc2NyaXB0aW9uKQpkdHBhZ2VzX2p1bmtfbGlua3Rva2VucyA8LSB0ZXh0X3Rva2VuaXplKGRhdGE9ZHRwYWdlc19qdW5rX2xpbmt0ZXh0LCB0ZXh0PXRleHQsIHN0b3B3b3Jkcz1OVUxMLCBuPTEpIAojZHRwYWdlc19saW5rdG9rZW5zMiA8LSB0ZXh0X3Rva2VuaXplKGRhdGE9ZHRwYWdlc19saW5rdGV4dCwgdGV4dD10ZXh0LCBzdG9wd29yZHM9TlVMTCwgbj0yKSAKZHRwYWdlc19qdW5rX2xpbmtjb3JyZWxhdGlvbiA8LSB0ZXh0X2NvcnJlbGF0aW9uKGRhdGE9ZHRwYWdlc19qdW5rX2xpbmt0b2tlbnMsIG5ncmFtPW5ncmFtLCB0b3A9MjAsIG1lbnRpb25zPTUpCgojQ2xlYW4gVGV4dCBmb3IgV29yZHMgVGhhdCBBcmUgTm90IFJlbGV2YW50CmR0cGFnZXNfanVua19saW5rY29ycmVsYXRpb24gJT4lIGdyb3VwX2J5KHRvcGljKSAlPiUgdG9wX24obj0xMCwgd3Q9Y29ycmVsYXRpb24pICU+JSBhcnJhbmdlKHRvcGljKQpkdHBhZ2VzX2p1bmtfbGlua3RvcGljc19jbGVhbiA8LSBkdHBhZ2VzX2p1bmtfbGlua2NvcnJlbGF0aW9uICU+JSBmaWx0ZXIoIXRvcGljICVpbiUgYygibmV0dGxlIiwgIm5lb24iLCAidHJ1ZSIsICJwdW5kaXQiKSB8ICFtZW50aW9uICVpbiUgIGMoIm5ldHRsZSIsICJuZW9uIiwgInRydWUiLCAicHVuZGl0IikpIAojZHRwYWdlc19saW5rY29ycmVsYXRpb24yICU+JSBncm91cF9ieSh0b3BpYykgJT4lIHRvcF9uKG49MTAsIHd0PWNvcnJlbGF0aW9uKSAlPiUgYXJyYW5nZSh0b3BpYykKI1JlZHVjZSBUb3BpY3MgJiBQcmVwIEZvciBQbG90dGluZwpkdHBhZ2VzX2p1bmtfbGlua3RvcGljcyA8LSB0b3BpY19yZWR1Y2UoZHRwYWdlc19qdW5rX2xpbmt0b3BpY3NfY2xlYW4sIHRvcGljPXRvcGljLCBtZW50aW9ucz0xMCkKYGBgCgpgYGB7ciwgZWNobz1GQUxTRSwgd2FybmluZz1GQUxTRSwgZXZhbD1UUlVFfQpzZXQuc2VlZCgyMDE5KQpkdHBhZ2VzX2p1bmtfbGlua3RvcGljcyAlPiUKICBmaWx0ZXIoY29ycmVsYXRpb24gPiAuMTMpICU+JQogIGdyYXBoX2Zyb21fZGF0YV9mcmFtZSgpICU+JQogIGdncmFwaChsYXlvdXQgPSAia2siKSArCiAgZ2VvbV9lZGdlX2xpbmsoYWVzKGVkZ2VfYWxwaGEgPSBjb3JyZWxhdGlvbiksIHNob3cubGVnZW5kID0gRkFMU0UpICsKICBnZW9tX25vZGVfcG9pbnQoY29sb3IgPSAicmVkIiwgc2l6ZSA9IDIpICsKICBnZW9tX25vZGVfdGV4dChhZXMobGFiZWwgPSBuYW1lKSwgcmVwZWwgPSBUUlVFKSArCiAgdGhlbWVfdm9pZCgpCgpgYGAKCk9mIHRoZSAxMDAgcGFnZXMgaW4gdGhlIHByby1UcnVtcCBQYWdlcyBlY29zeXN0ZW0sIDM0IG9mIHRoZW0gc2hhcmVkIGEgImp1bmsgbmV3cyIgbGluay4gVGhlIG1vc3QgcHJvbGlmaWMgc2hhcmVyIGlzICJXYWtlIFVwIEFtZXJpY2EsIHRoZSBPcmlnaW5hbCIsIHdoaWNoIHdhcyByZXNwb25zaWJsZSBmb3IgbmVhcmx5IG9uZS10aGlyZCBvZiB0aGUgImp1bmsgbmV3cyIgbGlua3MgYW5kIGhhcyBtb3JlIHRoYW4gNTAwLDAwMCBmb2xsb3dlcnMuICAgICAKCmBgYHtyLCBlY2hvPUZBTFNFLCBldmFsPVRSVUUsIHdhcm5pbmc9RkFMU0V9CiNCaWdnZXN0IFNoYXJlcnMgb2YgIkp1bmsgTmV3cyBEb21haW5zIiAtIEFycmFuZ2VkIGJ5IG51bWJlciBvZiBwb3N0cyBzaGFyZWQgdGhlbiBmb2xsb3dlcnMgCmR0cF9kdF9sZWFkZXJzIDwtIGR0cGFnZXNfanVua19kb20gJT4lIHNlbGVjdChQYWdlLk5hbWUsIENyZWF0ZWQsIGRvbWFpbiwgTGluay5UZXh0LCBQYWdlLkxpa2VzLmF0LlBvc3RpbmcpICU+JSBmaWx0ZXIoZG9tYWluICVpbiUgZmFrZW5ld3MpICU+JSBncm91cF9ieShQYWdlLk5hbWUpICU+JSBtdXRhdGUoUG9zdHM9bGVuZ3RoKFBhZ2UuTmFtZSksIEZvbGxvd2Vycz1tYXgoUGFnZS5MaWtlcy5hdC5Qb3N0aW5nKSkgJT4lIHNlbGVjdChQYWdlLk5hbWUsIEZvbGxvd2VycywgUG9zdHMpICU+JSBkaXN0aW5jdCgpICU+JSBhcnJhbmdlKGRlc2MoUG9zdHMpLCBkZXNjKEZvbGxvd2VycykpCgpkYXRhdGFibGUoZHRwX2R0X2xlYWRlcnMsIG9wdGlvbnM9bGlzdChvcmRlcj1saXN0KGxpc3QoMywgJ2Rlc2MnKSkpKQoKCmBgYAoKT25seSBhIGhhbmRmdWwgb2YganVuayBuZXdzIGxpbmtzIChuaW5lKSB3ZXJlIHNoYXJlZCBieSBtdWx0aXBsZSBwYWdlcyBzbyBpdCBpcyBkaWZmaWN1bHQgdG8gYXNzZXNzIHdpZGVzcHJlYWQgY29vcmRpbmF0ZWQgYmVoYXZpb3IgYW1vbmcgcGFnZXMuIEhvd2V2ZXIsIGEgc29jaWFsIG5ldHdvcmsgYW5hbHlzaXMgb2YgImp1bmsgbmV3cyIgbGlua3MgdGhhdCB3ZXJlIHNoYXJlZCBpbmRpY2F0ZXMgYXBwYXJlbnQgY29vcmRpbmF0aW9uIGFtb25nIGZvdXIgcHJvLVRydW1wIHBhZ2VzIHRvIGFtcGxpZnkgY29udGVudDogCgorIFNpbGVuY2UgaXMgQ29uc2VudCAtIFVTIEJvcmRlciBJbnZhc2lvbgorIFN0YW5kIFdpdGggSWxsaW5vaXMgQWdhaW5zdCBUaGUgSWxsZWdhbCBBbGllbiBJbnZhc2lvbgorIFN0YW5kIFdpdGggTm9ydGggRGFrb3RhIEFnYWluc3QgVGhlIElsbGVnYWwgQWxpZW4gSW52YXNpb24KKyBTdGFuZCBXaXRoIFNvdXRoIERha290YSBBZ2FpbnN0IFRoZSBJbGxlZ2FsIEFsaWVuIEludmFzaW9uCgpgYGB7ciwgZWNobz1GQUxTRSwgd2FybmluZz1GQUxTRSwgZXZhbD1GQUxTRSwgaW5jbHVkZT1GQUxTRX0KZHRwYWdlc19qdW5rX2ZhY2Vib29rIDwtIGR0cGFnZXNfanVua19kb20gJT4lIGZpbHRlcihkb21haW4gJWluJSBmYWtlbmV3cykgJT4lIHVuZ3JvdXAoKSAlPiUgc2VsZWN0KExpbmsuVGV4dCwgUGFnZS5OYW1lLCBDcmVhdGVkKQpkdHBhZ2VzX2p1bmtfZmFjZWJvb2tfbmV0d29yayA8LSBkdHBhZ2VzX2p1bmtfZmFjZWJvb2sgJT4lIGdyb3VwX2J5KExpbmsuVGV4dCkgJT4lIGFycmFuZ2UoQ3JlYXRlZCkgJT4lIG11dGF0ZShmaXJzdD1QYWdlLk5hbWUsIHNlY29uZD1sZWFkKFBhZ2UuTmFtZSwxKSwgaW5kZXg9cm93X251bWJlcigpKSAlPiUgZmlsdGVyKHNlY29uZCAhPSAiIiAmIGZpcnN0ICE9IHNlY29uZCkgJT4lIHVuZ3JvdXAoTGluay5UZXh0KSAlPiUgc2VsZWN0KGZpcnN0LCBzZWNvbmQpICU+JSBtdXRhdGUoc2Vjb25kPWFzLmNoYXJhY3RlcihzZWNvbmQpKQojZHRwYWdlc19qdW5rX2ZhY2Vib29rX25ldHdvcmsgJT4lIGhlYWQoMjApOyAjZGltKGR0Z3JvdXBzX2p1bmtfZmFjZWJvb2tfbmV0d29yaykKZHRwYWdlc19qdW5rX2NvdW50cyA8LSBkdHBhZ2VzX2p1bmtfZmFjZWJvb2tfbmV0d29yayAlPiUgY291bnQoZmlyc3QpICU+JSBhcnJhbmdlKGRlc2MobikpCiNkdHBhZ2VzX2p1bmtfY291bnRzICU+JSBoZWFkKDIwKQpkdHBhZ2VzX2p1bmtfY29ycmVsYXRpb25zIDwtIGR0cGFnZXNfanVua19mYWNlYm9va19uZXR3b3JrICU+JSBzZW1pX2pvaW4oZHRwYWdlc19qdW5rX2NvdW50cykKI2R0cGFnZXNfanVua19jb3JyZWxhdGlvbnMgJT4lIGhlYWQoMjApCmR0cGFnZXNfanVua19jb3JyZWxhdGlvbnMxIDwtIGR0cGFnZXNfanVua19jb3JyZWxhdGlvbnMgJT4lIHBhaXJ3aXNlX2NvcihmaXJzdCwgc2Vjb25kLCBzb3J0PVQsIHVwcGVyPUYpCmR0cGFnZXNfanVua19jb3JyZWxhdGlvbnMxCmBgYAoKYGBge3IsIGVjaG89RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGV2YWw9RkFMU0V9CnNldC5zZWVkKDIwMTkpCmR0cGFnZXNfanVua19jb3JyZWxhdGlvbnMxICU+JQogIGZpbHRlcihjb3JyZWxhdGlvbiA+IC4xNSkgJT4lCiAgZ3JhcGhfZnJvbV9kYXRhX2ZyYW1lKGRpcmVjdGVkPVQpICU+JQogIGdncmFwaChsYXlvdXQgPSAia2siKSArCiAgZ2VvbV9lZGdlX2xpbmsoYWVzKGVkZ2VfYWxwaGEgPSBjb3JyZWxhdGlvbiksIHNob3cubGVnZW5kID0gRkFMU0UpICsKICBnZW9tX25vZGVfcG9pbnQoY29sb3IgPSAicmVkIiwgc2l6ZSA9IDIpICsKICBnZW9tX25vZGVfdGV4dChhZXMobGFiZWwgPSBuYW1lKSwgcmVwZWwgPSBUUlVFKSArCiAgdGhlbWVfdm9pZCgpCgojZHRwYWdlc19qdW5rX2NvcnJlbGF0aW9uczEgJT4lCiMgIGZpbHRlcihjb3JyZWxhdGlvbiA+IC4yKSAlPiUKIyAgZ3JhcGhfZnJvbV9kYXRhX2ZyYW1lKGRpcmVjdGVkPVQpICU+JQojICBnZ3JhcGgobGF5b3V0ID0gImxpbmVhciIpICsKIyAgZ2VvbV9lZGdlX2FyYyhhZXMoYWxwaGE9Y29ycmVsYXRpb24pLCBjb2xvcj0iZ3JheSIsIHdpZHRoPTAuNSkgKwogICNnZW9tX2VkZ2VfYXJjKGVkZ2VfY29sb3VyPSJibGFjayIsIGVkZ2VfYWxwaGE9MC4yLCBlZGdlX3dpZHRoPTAuMywgZm9sZD1UKSArIy4uaW5kZXguLikpICsKICAjZ2VvbV9lZGdlX2xpbmsoYWVzKGVkZ2VfYWxwaGEgPSBjb3JyZWxhdGlvbiksIHNob3cubGVnZW5kID0gRkFMU0UpICsKIyAgZ2VvbV9ub2RlX3BvaW50KGNvbG9yID0gInJlZCIsIHNpemUgPSAxKSArCiMgIGdlb21fbm9kZV90ZXh0KGFlcyhsYWJlbD1uYW1lKSwgYW5nbGU9OTAsIGhqdXN0PTAuMSwgbnVkZ2VfeSA9IC0wLjUsIHNpemU9MSwgY29sb3I9InJlZCIpICsKIyAgdGhlbWUoYXhpcy50aXRsZS54ID0gZWxlbWVudF9ibGFuaygpLAojICAgICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF9ibGFuaygpLAojICAgICAgICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfYmxhbmsoKSwKIyAgICAgICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfYmxhbmsoKSwKIyAgICAgICAgICBsZWdlbmQudGl0bGU9IGVsZW1lbnRfYmxhbmsoKSwKIyAgICAgICAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfYmxhbmsoKSwKIyAgICAgICAgICBsZWdlbmQucG9zaXRpb24gPSAibm9uZSIsCiMgICAgICAgICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChmYWNlID0gImJvbGQiLCBzaXplPTgpLAojICAgICAgICAgIHBsb3Quc3VidGl0bGUgPSBlbGVtZW50X3RleHQoZmFjZSA9ICJib2xkIiwgc2l6ZT04KSwKIyAgICAgICAgICBwbG90LmNhcHRpb24gPSBlbGVtZW50X3RleHQoZmFjZSA9ICJpdGFsaWMiLCBzaXplPTgpLAojICAgICAgICAgIHBhbmVsLmdyaWQubWlub3I9ZWxlbWVudF9ibGFuaygpLAojICAgICAgICAgIHBhbmVsLmdyaWQubWFqb3I9ZWxlbWVudF9ibGFuaygpLAojICAgICAgICAgIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X2JsYW5rKCksIAojICAgICAgICAgIGF4aXMubGluZSA9IGVsZW1lbnRfYmxhbmsoKSwKIyAgICAgICAgICBheGlzLnRpY2tzID0gZWxlbWVudF9ibGFuaygpKQpgYGAKCkEgdGltZS1zZXJpZXMgYW5hbHlzaXMgaW5kaWNhdGVzIHRoYXQgdGhlICJTdGFuZCBXaXRoIFtibGFua10gQWdhaW5zdCB0aGUgSWxsZWdhbCBBbGllbiBJbnZhc2lvbiIgcGFnZXMgYXJlIGNsZWFybHkgY29vcmRpbmF0aW5nIHRvIHNoYXJlIGp1bmsgbmV3cyBsaW5rcyByZWxhdGVkIHRvIGltbWlncmF0aW9uLiBUaGUgeCBheGlzIHJlcHJlc2VudHMgdGhlIHRpbWUgZWxhcHNlZCBiZXR3ZWVuIHBvc3RzIChpbiBzZWNvbmRzKSwgdGh1cyB0aGUgbW9yZSB2ZXJ0aWNhbCB0aGUgbGluZSwgdGhlIHNob3J0ZXIgdGhlIHRpbWUgYmV0d2VlbiBwb3N0cyBvZiB0aGUgc2FtZSBsaW5rLiBBIGxlc3NlciBzdWJzdGFudGlhbCB0cmVuZCAoZ2l2ZW4gc28gZmV3IGRhdGEgcG9pbnRzKSBpcyBzZWVuIGluIHJlbGF0aW9uIHRvIGp1bmsgbmV3cyBsaW5rcyB0aGF0IHJlZmVyZW5jZSBKZWZmcmV5IEVwc3RlaW4gYW5kIEVsaWphaCBDdW1taW5ncywgaW5kaWNhdGluZyB0aGF0IHRoZSAiVHJ1bXAgJ1RoZSBQZW9wbGUncyBQcmVzaWRlbnQnIiBwYWdlIG1heSBiZSBhbiBpbmZsdWVuY29yIG9mIGF0IGxlYXN0IHR3byBvdGhlciBwYWdlczogIlJlcHVibGljYW5zIEZvciBUcnVtcCIgYW5kICJUcnVtcCwgQW1lcmljYW4gUGF0cmlvdC4iIApgYGB7ciwgZWNobz1GQUxTRSwgd2FybmluZz1GQUxTRSwgZXZhbD1UUlVFfQojLCBlbGFwc2VkPWlmZWxzZShpcy5uYShlbGFwc2VkKSwgMCwgZWxhcHNlZCkpICU+JSBhcnJhbmdlKExpbmsuVGV4dCwgaW5kZXgpICAKZHRwYWdlc19qdW5rX3Bsb3QgPC0gZHRwYWdlc19qdW5rX2RvbSAlPiUgc2VsZWN0KFBhZ2UuTmFtZSwgQ3JlYXRlZCwgZG9tYWluLCBMaW5rLlRleHQsIFBhZ2UuTGlrZXMuYXQuUG9zdGluZykgJT4lIGZpbHRlcihkb21haW4gJWluJSBmYWtlbmV3cyAmICFMaW5rLlRleHQgJWluJSBjKCJQYW1lbGEgR2VsbGVyIiwgIkNvbnNlcnZhdGl2ZSBQb3N0IikpICU+JSBncm91cF9ieShMaW5rLlRleHQsIGRvbWFpbikgJT4lIGFycmFuZ2UoQ3JlYXRlZCkgJT4lIG11dGF0ZShyZWFjaD1jdW1zdW0oUGFnZS5MaWtlcy5hdC5Qb3N0aW5nKSwgaW5kZXg9c2VxX2Fsb25nKHJlYWNoKSwgbj1tYXgoaW5kZXgpKSAlPiUgZmlsdGVyKG4gPiAxKSAlPiUgbXV0YXRlKEFydGljbGU9aWZlbHNlKGluZGV4PT1uLCBhcy5jaGFyYWN0ZXIoTGluay5UZXh0KSwgIiIpKSAKCmR0cGFnZXNfanVua19wbG90IDwtIGR0cGFnZXNfanVua19wbG90ICU+JSBncm91cF9ieShMaW5rLlRleHQpICU+JSBhcnJhbmdlKENyZWF0ZWQpICU+JSBtdXRhdGUocHJldmlvdXM9bGFnKENyZWF0ZWQsIDEpLCBlbGFwc2VkPUNyZWF0ZWQtbGFnKENyZWF0ZWQsMSksIGVsYXBzZWQ9aWZlbHNlKGlzLm5hKGVsYXBzZWQpLCAwLCBhcy5pbnRlZ2VyKGVsYXBzZWQpKSwgdGltZT1jdW1zdW0oZWxhcHNlZCksIE5hbWU9UGFnZS5OYW1lKQojZHRwYWdlc19qdW5rX3Bsb3QKCmR0cGFnZXNfanVua19wbG90ICU+JSBnZ3Bsb3QoYWVzKHg9dGltZSwgeT1yZWFjaCkpICsKICBnZW9tX2ppdHRlcihhZXMoY29sb3I9ZG9tYWluKSkgKyAKICBnZW9tX3BhdGgoYWVzKGNvbG91cj1kb21haW4pLCBzaXplPTAuNSwgYWxwaGE9MC41KSArCiAgZ2VvbV90ZXh0KGFlcyh4PXRpbWUsIHk9cmVhY2gsIGxhYmVsPU5hbWUpLCBzaXplPTEsIGhqdXN0PSJpbndhcmQiKSArCiAgI3hsaW0oMCwgNTAwMDAwMCkgKwogIGxhYnMoeD0iVGltZSBFbGFwc2VkIChpbiBTZWNvbmRzKSIsIHk9IkZvbGxvd2VycyIsIGNvbG91cj0iRG9tYWluIikgKyAgCiAgZmFjZXRfd3JhcCh+IExpbmsuVGV4dCwgc2NhbGVzPSJmcmVlX3kiLCBsYWJlbGxlciA9IGxhYmVsX3dyYXBfZ2VuKHdpZHRoID0gNzUsIG11bHRpX2xpbmUgPVQpKSArCiAgc2NhbGVfeF9jb250aW51b3VzKGxhYmVscyA9IGNvbW1hKSArCiAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IGNvbW1hKSArCiAgdGhlbWUoYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KGZhY2UgPSAiYm9sZCIsIHNpemU9NCksCiAgICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChmYWNlID0gImJvbGQiLCBzaXplPTQpLAogICAgICAgICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KGZhY2UgPSAiYm9sZCIsIHNpemU9NCksCiAgICAgICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChmYWNlID0gImJvbGQiLCBzaXplPTQpLAogICAgICAgICAgc3RyaXAudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMyksCiAgICAgICAgICAjcGFuZWwubWFyZ2luLnkgPSB1bml0KC0zLCAnY20nKSwKICAgICAgICAgIGxlZ2VuZC50aXRsZT1lbGVtZW50X3RleHQoZmFjZSA9ICJib2xkIiwgc2l6ZT00KSwKICAgICAgICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KGZhY2UgPSAiYm9sZCIsIHNpemU9NCksCiAgICAgICAgICBsZWdlbmQucG9zaXRpb24gPSAibm9uZSIsCiAgICAgICAgICBwbG90LnRpdGxlID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgICAgcGxvdC5zdWJ0aXRsZSA9IGVsZW1lbnRfdGV4dChmYWNlID0gImJvbGQiLCBzaXplPTQpLAogICAgICAgICAgcGxvdC5jYXB0aW9uID0gZWxlbWVudF90ZXh0KGZhY2UgPSAiaXRhbGljIiwgc2l6ZT00KSwKICAgICAgICAgICNwYW5lbC5ncmlkLm1pbm9yPWVsZW1lbnRfYmxhbmsoKSwKICAgICAgICAgICNwYW5lbC5ncmlkLm1ham9yPWVsZW1lbnRfYmxhbmsoKSwKICAgICAgICAgIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X2JsYW5rKCksIAogICAgICAgICAgI2F4aXMubGluZSA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICAgICNwbG90Lm1hcmdpbiA9IG1hcmdpbigtMC4yNSwgLTAuMjUsIC0wLjI1LCAtMC4yNSwgImNtIiksCiAgICAgICAgICBheGlzLnRpY2tzLnk9ZWxlbWVudF9ibGFuaygpKSAKCmBgYAoKSW4gdGhlICoqcHJvLVRydW1wIEdyb3VwcyBFY29zeXN0ZW0qKiwgdGhlcmUgd2VyZSA1MDYgdW5pcXVlIGxpbmtzIHNoYXJlZCBmcm9tIGRpZmZlcmVudCAxNiAianVuayBuZXdzIiB3ZWJzaXRlcy4gT2YgdGhlIDUwNiBsaW5rcywgMTI5IHdlcmUgZnJvbSAibmVvbm5ldHRsZS5jb20uIiBNdWx0aXBsZSAianVuayBuZXdzIiB3ZWJzaXRlcyBmb3VuZCBpbiB0aGUgcHJvLVRydW1wIFBhZ2VzIGVjb3N5c3RlbSwgZS5nLiAicHVwcGV0c3RyaW5nbmV3cy5jb20iLCAibmV3c3B1bmNoLmNvbSIsICJnZWxsZXJyZXBvcnQuY29tIiAtIHdlcmUgd2lkZWx5IHNoYXJlZCBpbiBwcm8tVHJ1bXAgR3JvdXBzLiBUaHJlZSBvdGhlciAianVuayBuZXdzIiB3ZWJzaXRlcyBhbHNvIGZlYXR1cmVkIHByb21pbmVudGx5OiAgIAoKKiAiY29uc2VydmF0aXZldHJlZWhvdXNlLmNvbSIsIHdoaWNoIG5vdGVzIG9uIGl0cyAiQWJvdXQgVXMiIHBhZ2UgdGhhdCDigJxmZWFyIGlzIGF0IHRoZSBjb3JlIG9mIGxpYmVyYWxpc20sIGFuZCBsb3ZlL3RydXN0IGlzIGF0IHRoZSBjb3JlIG9mIGNvbnNlcnZhdGlzbS4gTGliZXJhbGlzbSBpcyBhYm91dCBjb250cm9sLiBDb25zZXJ2YXRpc20gaXMgYWJvdXQgc2VsZi1lbXBvd2VybWVudC7igJ0KKiAiaW5mb3dhcnMuY29tIiwgd2hpY2ggaXMgdGhlIHdlYnNpdGUgZm9yIHRoZSBwb3B1bGFyIGNvbnNwaXJhY3kgdGhlb3J5IHJhZGlvIHNob3cgYnkgdGhlIHNhbWUgbmFtZSBob3N0ZWQgYnkgQWxleCBKb25lcy4gCiogInJpZ2h0d2luZ3RyaWJ1bmUuY29tIiwgd2hpY2ggRmFjdENoZWNrLm9yZyBzYXlzICJkb2VzbuKAmXQgaGF2ZSBhIGRpc2NsYWltZXIsIGJ1dCBpdCBkb2VzIHNheSBvbiBvbmUgb2YgYXQgbGVhc3QgZml2ZSBhc3NvY2lhdGVkIEZhY2Vib29rIHBhZ2VzOiAnSWYgWW91IEFyZSBBIFJpZ2h0IFdpbmdlciBBbmQgUElTU0VEIFlvdeKAmXJlIEluIFRoZSBSaWdodCBQbGFjZS4gV2UgUHJvdmlkZSBIaWdoIFF1YWxpdHkgSm91cm5hbGlzbSBXaXRoIFZpcmFsIE1lbWVzIGFuZCBWaWRlbyBJbiBCZXR3ZWVuISBTbyBHaXZlIFVzIEEgTGlrZSEgWW91IFdvbuKAmXQgQmUgRGlzc2Fwb2ludGVkLiciCgpUaGUgbGlua3MgZnJvbSAianVuayBuZXdzIiB3ZWJzaXRlcyB0aGF0IHdlcmUgbW9zdCBzaGFyZWQgd2l0aGluIHRoZSBwcm8tVHJ1bXAgR3JvdXBzIGVjb3N5c3RlbSB3ZXJlIGFzIGZvbGxvd3M6CgpgYGB7ciwgZWNobz1GQUxTRSwgZXZhbD1UUlVFLCB3YXJuaW5nPUZBTFNFfQojTW9zdCBTaGFyZWQgIkp1bmsgTmV3cyIgTGlua3MgKG4gPiAxKQojZHRncm91cHNfanVua19kb21fbm9mYiAlPiUgc2VsZWN0KEdyb3VwLk5hbWUsIENyZWF0ZWQsIGRvbWFpbiwgTGluay5UZXh0LCBNZW1iZXJzLmF0LlBvc3RpbmcpICU+JSBmaWx0ZXIoZG9tYWluICVpbiUgZmFrZW5ld3MpICU+JSBncm91cF9ieShMaW5rLlRleHQpICU+JSBhcnJhbmdlKENyZWF0ZWQpICU+JSBtdXRhdGUocmVhY2g9Y3Vtc3VtKE1lbWJlcnMuYXQuUG9zdGluZyksIGluZGV4PXNlcV9hbG9uZyhMaW5rLlRleHQpKSAlPiUgYXJyYW5nZShMaW5rLlRleHQsIGluZGV4KQoKI2R0Z3JvdXBzX2p1bmtfZG9tX25vZmIgJT4lIHNlbGVjdChHcm91cC5OYW1lLCBDcmVhdGVkLCBkb21haW4sIExpbmsuVGV4dCwgTWVtYmVycy5hdC5Qb3N0aW5nKSAlPiUgZmlsdGVyKGRvbWFpbiAlaW4lIGZha2VuZXdzKSAlPiUgZ3JvdXBfYnkoTGluay5UZXh0KSAlPiUgY291bnQoKSAlPiUgYXJyYW5nZShkZXNjKG4pKQoKI2R0Z3JvdXBzX2p1bmtfZG9tICU+JSBmaWx0ZXIoZG9tYWluICVpbiUgZmFrZW5ld3MpICU+JSBncm91cF9ieShkb21haW4pICU+JSBjb3VudCgpICU+JSBhcnJhbmdlKGRlc2MobikpICU+JSBoZWFkKDI1KQpvZGRiYWxsIDwtIGMoIlBhbWVsYSBHZWxsZXIiLCAifCBOZW9uIE5ldHRsZSIsICJDb25zZXJ2YXRpdmUgUG9zdCIsICJBbmdlbCIsICJEZW5uaXMiLCAiTGFycnkiLCAiTGVlIiwgIlNob3cgQXJjaGl2ZXMiLCAiQnJpYW4gS29sZmFnZSIsICJEaW5hIiwgIkRpbm8iLCAiTGlzYSIsICJDaG9uIiwgIk1lcnJpbGwiLCAiUGF0IiwgIlNhcmFoIiwgIkJpbGwiLCAiRGFuaWVsIiwgIkVsaXphYmV0aCIsICJNaWNreSIsICJLaW1iZXJsZXkiLCAiUm9uIiwgIkRhcmxlbmUiLCAiSmVycnkiLCAiSm9obiIsICJNYXJrIiwgIkRhbiIsICJGcmFuayIsICJHYXlsZSIsICJHZW5lIiwgIkdyZWdnIiwgIkthcmVuIiwgICJMaW5kYSIsICJNaWNoZWFsaW5hIiwgIlJveGFubmUiLCAiVGhlcmVzYSIsICJBbGljZSIsICJBbGljaWEiLCAiQXN0cmlkIiwgIkNhdGh5IiwgIkNoZXIiLCAiQ2xpbnQiLCAiRGF2aWQiLCAiRGFuaWVsIiwgIkRlbmlzZSIsICJEaWFuZSIsICJEb25uYSIsICJEb3VnIiwgIkdhcnkiLCAiR2VubmFkeSIsICJIZWxlbiIsICJIb2x0b24iLCAiSmFtZXMtQ2hyaXN0aW5hIiwgIkphbmUiLCAiSmVubmlmZXIiLCAiSmVyaSIsICJKZXdlbCIsICJKb3NlIiwgICJLYXRpZSIsICJLZW4iLCAiS2VubmV0aCIsICJLZXZpbiIsICJNYXJpZSIsICJNYXJ5IiwgIk1lbCIsICJNaWNoYWVsIiwgICJNb250eSIsICJQYXRyaWNrIiwgIlBhdHR5IiwgIlJhbHBoIFdpbGxpYW0iLCAiUmFuZHkiLCAiU2VuY2VyaWEiLCAiU2FsbWFuIiwgIlNoYXJvbiIsICJTdGFjaWUiLCAiU2hhbmthciIsICJTdGVwaGVuIiwgIlN0ZXZlbiIsICJTdGV2ZSIsICJUaGVyZXNhIiwgIlRvbW15IiwgIlRyZWciLCAiV2FsdGVyIikKZHRnX2R0IDwtIGR0Z3JvdXBzX2p1bmtfZG9tICU+JSBzZWxlY3QoR3JvdXAuTmFtZSwgQ3JlYXRlZCwgZG9tYWluLCBMaW5rLlRleHQsIE1lbWJlcnMuYXQuUG9zdGluZykgJT4lIGZpbHRlcihkb21haW4gJWluJSBmYWtlbmV3cykgJT4lIGZpbHRlcighTGluay5UZXh0ICVpbiUgb2RkYmFsbCkgJT4lIGdyb3VwX2J5KExpbmsuVGV4dCwgZG9tYWluKSAlPiUgY291bnQoKSAlPiUgYXJyYW5nZShkZXNjKG4pKQoKI2R0Z19kdCAlPiUgZ3JvdXBfYnkoZG9tYWluKSAlPiUgY291bnQoKSAlPiUgYXJyYW5nZShkZXNjKG4pKQoKZGF0YXRhYmxlKGR0Z19kdCwgb3B0aW9ucz1saXN0KG9yZGVyPWxpc3QobGlzdCgzLCAnZGVzYycpKSkpCmBgYAoKQSB0ZXh0IGFuYWx5c2lzIG9mIHRoZSBEZXNjcmlwdGlvbnMgYWNjb21wYW55aW5nIHRoZSBsaW5rcyBoaWdobGlnaHRzIFVrcmFpbmUgYXMgYSBrZXkgdG9waWMgb2YgY29udmVyc2F0aW9uLCBzcGVjaWZpY2FsbHkgaW4gcmVsYXRpb24gdG8gdGhlIEJpZGVucy4gT3RoZXIg4oCcanVuayBuZXdz4oCdIHRvcGljcyByZWxhdGUgdG8gdGhlIG9uZ29pbmcgaW1wZWFjaG1lbnQgaW5xdWlyeSBhbmQgdHdvIHByb21pbmVudCBIb3VzZSBEZW1vY3JhdHMgLSBTcGVha2VyIE5hbmN5IFBlbG9zaSBhbmQgSW50ZWxsaWdlbmNlIENvbW1pdHRlZSBDaGFpcm1hbiBBZGFtIFNjaGlmZi4gVGhlIENsaW50b25zIGFyZSBsZXNzIHByb21pbmVudCB0b3BpY3Mgb2YgImp1bmsgbmV3cyIiIGNpcmN1bGF0aW5nIGluIHByby1UcnVtcCBncm91cHMuIAoKYGBge3IsIGluY2x1ZGU9RkFMU0V9CiNkdGdyb3Vwc19qdW5rX2RvbSAlPiUgZmlsdGVyKGRvbWFpbiAlaW4lIGZha2VuZXdzKSAlPiUgc2VsZWN0KExpbmsuVGV4dCwgRGVzY3JpcHRpb24pICU+JSBoZWFkKDEwMCkKCmR0Z3JvdXBzX2p1bmtfbGlua3RleHQgPC0gZHRncm91cHNfanVua19kb20gJT4lIGZpbHRlcihkb21haW4gJWluJSBmYWtlbmV3cyAmIExpbmsuVGV4dCAhPSJQZXRpdGlvbiB0byDigJhJbXBlYWNoIE5hbmN5IFBlbG9zaSBmb3IgVHJlYXNvbuKAmSBHb2VzIFZpcmFsIikgJT4lIGdyb3VwX2J5KEdyb3VwLk5hbWUpICU+JSB1bmdyb3VwKCkgJT4lIG11dGF0ZShpZD1yb3dfbnVtYmVyKCksIERlc2NyaXB0aW9uPWFzLmNoYXJhY3RlcihEZXNjcmlwdGlvbikpICU+JSBzZWxlY3QoaWQsIERlc2NyaXB0aW9uKQpkdGdyb3Vwc19qdW5rX2xpbmt0ZXh0IDwtIHRleHRfY2xlYW4oZGF0YT1kdGdyb3Vwc19qdW5rX2xpbmt0ZXh0LCB0ZXh0PURlc2NyaXB0aW9uKQpkdGdyb3Vwc19qdW5rX2xpbmt0b2tlbnMgPC0gdGV4dF90b2tlbml6ZShkYXRhPWR0Z3JvdXBzX2p1bmtfbGlua3RleHQsIHRleHQ9dGV4dCwgc3RvcHdvcmRzPU5VTEwsIG49MSkgCiNkdGdyb3Vwc19saW5rdG9rZW5zMiA8LSB0ZXh0X3Rva2VuaXplKGRhdGE9ZHRncm91cHNfbGlua3RleHQsIHRleHQ9dGV4dCwgc3RvcHdvcmRzPU5VTEwsIG49MikgCmR0Z3JvdXBzX2p1bmtfbGlua2NvcnJlbGF0aW9uIDwtIHRleHRfY29ycmVsYXRpb24oZGF0YT1kdGdyb3Vwc19qdW5rX2xpbmt0b2tlbnMsIG5ncmFtPW5ncmFtLCB0b3A9MjAsIG1lbnRpb25zPTEwKQoKI0NsZWFuIFRleHQgZm9yIFdvcmRzIFRoYXQgQXJlIE5vdCBSZWxldmFudAojZHRncm91cHNfanVua19saW5rY29ycmVsYXRpb24gJT4lIGdyb3VwX2J5KHRvcGljKSAlPiUgdG9wX24obj0xMCwgd3Q9Y29ycmVsYXRpb24pICU+JSBhcnJhbmdlKHRvcGljKQpkdGdyb3Vwc19qdW5rX2xpbmt0b3BpY3NfY2xlYW4gPC0gZHRncm91cHNfanVua19saW5rY29ycmVsYXRpb24gJT4lIGZpbHRlcighdG9waWMgJWluJSBjKCJuZXR0bGUiLCAibmVvbiIsICJuZXdzIiwgInJlcG9ydCIpIHwgIW1lbnRpb24gJWluJSAgYygiZ2F0ZXdheSIsICJwdW5kaXQiLCAibmV0dGxlIiwgIm5lb24iLCAidHJ1ZSIsICJwdW5kaXQiKSkgCiNkdGdyb3Vwc19saW5rY29ycmVsYXRpb24yICU+JSBncm91cF9ieSh0b3BpYykgJT4lIHRvcF9uKG49MTAsIHd0PWNvcnJlbGF0aW9uKSAlPiUgYXJyYW5nZSh0b3BpYykKI1JlZHVjZSBUb3BpY3MgJiBQcmVwIEZvciBQbG90dGluZwpkdGdyb3Vwc19qdW5rX2xpbmt0b3BpY3MgPC0gdG9waWNfcmVkdWNlKGR0Z3JvdXBzX2p1bmtfbGlua3RvcGljc19jbGVhbiwgdG9waWM9dG9waWMsIG1lbnRpb25zPTEwKQoKYGBgCgpgYGB7ciwgZWNobz1GQUxTRSwgd2FybmluZz1GQUxTRSwgZXZhbD1UUlVFfQpzZXQuc2VlZCgyMDE5KQpkdGdyb3Vwc19qdW5rX2xpbmt0b3BpY3MgJT4lCiAgZmlsdGVyKGNvcnJlbGF0aW9uID4gLjM1KSAlPiUKICBncmFwaF9mcm9tX2RhdGFfZnJhbWUoKSAlPiUKICBnZ3JhcGgobGF5b3V0ID0gImtrIikgKwogIGdlb21fZWRnZV9saW5rKGFlcyhlZGdlX2FscGhhID0gY29ycmVsYXRpb24pLCBzaG93LmxlZ2VuZCA9IEZBTFNFKSArCiAgZ2VvbV9ub2RlX3BvaW50KGNvbG9yID0gInJlZCIsIHNpemUgPSAyKSArCiAgZ2VvbV9ub2RlX3RleHQoYWVzKGxhYmVsID0gbmFtZSksIHJlcGVsID0gVFJVRSkgKwogIHRoZW1lX3ZvaWQoKQoKYGBgCgpPZiB0aGUgMjI2IGdyb3VwcyBpbiB0aGUgcHJvLVRydW1wIEdyb3VwcyBlY29zeXN0ZW0sIGF0IGxlYXN0IG9uZSAianVuayBuZXdzIiBsaW5rcyB3YXMgZm91bmQgdG8gaGF2ZSBiZWVuIHBvc3RlZCBpbiAxNjIgb2YgdGhlbS4gVHdvIGxhcmdlIGdyb3VwcyB3aXRoIHRoZSBuYW1lICJEcmFpbiBUaGUgU3dhbXAiIGFyZSBwYXJ0aWN1bGFybHkgcmlmZSB3aXRoIGp1bmsgbmV3cyBsaW5rcy4KCmBgYHtyLCBlY2hvPUZBTFNFLCBldmFsPVRSVUUsIHdhcm5pbmc9RkFMU0V9CiNCaWdnZXN0IFNoYXJlcnMgb2YgIkp1bmsgTmV3cyBEb21haW5zIiAtIEFycmFuZ2VkIGJ5IG51bWJlciBvZiBwb3N0cyBzaGFyZWQgdGhlbiBmb2xsb3dlcnMgCmR0Z19kdF9sZWFkZXJzIDwtIGR0Z3JvdXBzX2p1bmtfZG9tICU+JSBzZWxlY3QoR3JvdXAuTmFtZSwgQ3JlYXRlZCwgZG9tYWluLCBMaW5rLlRleHQsIE1lbWJlcnMuYXQuUG9zdGluZykgJT4lIGZpbHRlcihkb21haW4gJWluJSBmYWtlbmV3cykgJT4lIGdyb3VwX2J5KEdyb3VwLk5hbWUpICU+JSBtdXRhdGUoUG9zdHM9bGVuZ3RoKEdyb3VwLk5hbWUpLCBNZW1iZXJzPW1heChNZW1iZXJzLmF0LlBvc3RpbmcpKSAlPiUgc2VsZWN0KEdyb3VwLk5hbWUsIE1lbWJlcnMsIFBvc3RzKSAlPiUgZGlzdGluY3QoKSAlPiUgYXJyYW5nZShkZXNjKFBvc3RzKSwgZGVzYyhNZW1iZXJzKSkKCmRhdGF0YWJsZShkdGdfZHRfbGVhZGVycywgb3B0aW9ucz1saXN0KG9yZGVyPWxpc3QobGlzdCgzLCAnZGVzYycpKSkpCgpgYGAKCkEgc29jaWFsIG5ldHdvcmsgYW5hbHlzaXMgb2YgImp1bmsgbmV3cyIgbGlua3MgcG9zdGVkIHdpdGhpbiB0aGUgcHJvLVRydW1wIEdyb3VwcyBlY29zeXN0ZW0gaW5kaWNhdGVzIGEgbG90IG9mIG92ZXJsYXAgaW4gImp1bmsgbmV3cyIgY29udGVudCBmcm9tIGdyb3VwIHRvIGdyb3VwIGFsdGhvdWdoIGl0IGlzIHVuY2xlYXIgaG93IG11Y2ggY29vcmRpbmF0aW9uLCBpZiBhbnksIGV4aXN0cy4gICAKCk5vdGU6IFdpdGggY29uc2lkZXJhdGlvbiB0byBwcml2YWN5IHByb3RlY3Rpb24gb2YgRmFjZWJvb2sgdXNlcnMsIENyb3dkVGFuZ2xlIGRvZXMgbm90IHBlcm1pdCB5b3UgdG8gc2VlIHdoaWNoIHNwZWNpZmljIHVzZXIgYWNjb3VudHMgcG9zdGVkIHRvIGdyb3VwcyBvciB3aGV0aGVyIHRoZSBsaW5rIHdhcyBzaGFyZWQgZnJvbSBhIHBhcnRpY3VsYXIgcGFnZS4gVGh1cyBpdCBpcyBub3QgcG9zc2libGUgdG8gZGVmaW5pdGl2ZWx5IGRldGVybWluZSB3aGV0aGVyIHNwZWNpZmljIGFjY291bnRzIGFyZSBlbmdhZ2luZyBpbiBjb29yZGluYXRlZCBiZWhhdmlvciB0byBhbXBsaWZ5IGNvbnRlbnQgYWNyb3NzIGdyb3Vwcy4gSG93ZXZlciwgaXQgaXMgcG9zc2libGUgdG8gc2VlIHdoYXQgY29udGVudCBpcyBzaGFyZWQgd2l0aGluIGdyb3VwcyBieSB0aW1lc3RhbXAsIHByb3ZpZGluZyBzb21lIGluc2lnaHQgYXMgdG8gd2hldGhlciB0aGVyZSBtYXkgYmUgc29tZSBjb29yZGluYXRpb24gYW1vbmcgdXNlcnMgYWNyb3NzIGdyb3Vwcy4KCmBgYHtyLCBpbmNsdWRlPUZBTFNFfQpkdGdyb3Vwc19qdW5rX2ZhY2Vib29rIDwtIGR0Z3JvdXBzX2p1bmtfZG9tICU+JSBmaWx0ZXIoZG9tYWluICVpbiUgZmFrZW5ld3MpICU+JSB1bmdyb3VwKCkgJT4lIHNlbGVjdChMaW5rLlRleHQsIEdyb3VwLk5hbWUsIENyZWF0ZWQpCmR0Z3JvdXBzX2p1bmtfZmFjZWJvb2tfbmV0d29yayA8LSBkdGdyb3Vwc19qdW5rX2ZhY2Vib29rICU+JSBncm91cF9ieShMaW5rLlRleHQpICU+JSBhcnJhbmdlKENyZWF0ZWQpICU+JSBtdXRhdGUoZmlyc3Q9R3JvdXAuTmFtZSwgc2Vjb25kPWxlYWQoR3JvdXAuTmFtZSwxKSwgaW5kZXg9cm93X251bWJlcigpKSAlPiUgZmlsdGVyKHNlY29uZCAhPSAiIiAmIGZpcnN0ICE9IHNlY29uZCkgJT4lIHVuZ3JvdXAoTGluay5UZXh0KSAlPiUgc2VsZWN0KGZpcnN0LCBzZWNvbmQpICU+JSBtdXRhdGUoc2Vjb25kPWFzLmNoYXJhY3RlcihzZWNvbmQpKQojZHRwYWdlc19qdW5rX2ZhY2Vib29rX25ldHdvcmsgJT4lIGhlYWQoMjApOyAjZGltKGR0Z3JvdXBzX2p1bmtfZmFjZWJvb2tfbmV0d29yaykKZHRncm91cHNfanVua19jb3VudHMgPC0gZHRncm91cHNfanVua19mYWNlYm9va19uZXR3b3JrICU+JSBjb3VudChmaXJzdCkgJT4lIGFycmFuZ2UoZGVzYyhuKSkKI2R0cGFnZXNfanVua19jb3VudHMgJT4lIGhlYWQoMjApCmR0Z3JvdXBzX2p1bmtfY29ycmVsYXRpb25zIDwtIGR0Z3JvdXBzX2p1bmtfZmFjZWJvb2tfbmV0d29yayAlPiUgc2VtaV9qb2luKGR0Z3JvdXBzX2p1bmtfY291bnRzKQpkdGdyb3Vwc19qdW5rX2NvcnJlbGF0aW9ucyAlPiUgaGVhZCgyMCkKZHRncm91cHNfanVua19jb3JyZWxhdGlvbnMxIDwtIGR0Z3JvdXBzX2p1bmtfY29ycmVsYXRpb25zICU+JSBwYWlyd2lzZV9jb3IoZmlyc3QsIHNlY29uZCwgc29ydD1ULCB1cHBlcj1GKQpgYGAKCmBgYHtyLCBlY2hvPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBldmFsPVRSVUV9CnNldC5zZWVkKDIwMTkpCmR0Z3JvdXBzX2p1bmtfY29ycmVsYXRpb25zMSAlPiUKICBmaWx0ZXIoY29ycmVsYXRpb24gPiAuMikgJT4lCiAgZ3JhcGhfZnJvbV9kYXRhX2ZyYW1lKGRpcmVjdGVkPVQpICU+JQogIGdncmFwaChsYXlvdXQgPSAibGluZWFyIikgKwogIGdlb21fZWRnZV9hcmMoYWVzKGFscGhhPWNvcnJlbGF0aW9uKSwgY29sb3I9ImdyYXkiLCB3aWR0aD0wLjUpICsKICAjZ2VvbV9lZGdlX2FyYyhlZGdlX2NvbG91cj0iYmxhY2siLCBlZGdlX2FscGhhPTAuMiwgZWRnZV93aWR0aD0wLjMsIGZvbGQ9VCkgKyMuLmluZGV4Li4pKSArCiAgI2dlb21fZWRnZV9saW5rKGFlcyhlZGdlX2FscGhhID0gY29ycmVsYXRpb24pLCBzaG93LmxlZ2VuZCA9IEZBTFNFKSArCiAgZ2VvbV9ub2RlX3BvaW50KGNvbG9yID0gInJlZCIsIHNpemUgPSAxKSArCiAgZ2VvbV9ub2RlX3RleHQoYWVzKGxhYmVsPW5hbWUpLCBhbmdsZT05MCwgaGp1c3Q9MSwgbnVkZ2VfeSA9IC0wLjUsIHNpemU9MSwgY29sb3I9InJlZCIpICsKICB0aGVtZShheGlzLnRpdGxlLnggPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgICAgbGVnZW5kLnRpdGxlPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwKICAgICAgICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoZmFjZSA9ICJib2xkIiwgc2l6ZT04KSwKICAgICAgICAgIHBsb3Quc3VidGl0bGUgPSBlbGVtZW50X3RleHQoZmFjZSA9ICJib2xkIiwgc2l6ZT04KSwKICAgICAgICAgIHBsb3QuY2FwdGlvbiA9IGVsZW1lbnRfdGV4dChmYWNlID0gIml0YWxpYyIsIHNpemU9OCksCiAgICAgICAgICBwYW5lbC5ncmlkLm1pbm9yPWVsZW1lbnRfYmxhbmsoKSwKICAgICAgICAgIHBhbmVsLmdyaWQubWFqb3I9ZWxlbWVudF9ibGFuaygpLAogICAgICAgICAgcGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfYmxhbmsoKSwgCiAgICAgICAgICBheGlzLmxpbmUgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgICBheGlzLnRpY2tzID0gZWxlbWVudF9ibGFuaygpKQoKYGBgCmBgYHtyLCBpbmNsdWRlPUZBTFNFfQpkdGdyb3Vwc19qdW5rX3Bsb3QgPC0gZHRncm91cHNfanVua19kb20gJT4lIHNlbGVjdChHcm91cC5OYW1lLCBDcmVhdGVkLCBkb21haW4sIExpbmsuVGV4dCwgTWVtYmVycy5hdC5Qb3N0aW5nKSAlPiUgZmlsdGVyKGRvbWFpbiAlaW4lIGZha2VuZXdzICYgIUxpbmsuVGV4dCAlaW4lIGMoIlNhcmFoIiwgIkRpbm8iLCAiUGF0IiwgIkxpc2EiKSkgJT4lIGdyb3VwX2J5KExpbmsuVGV4dCwgZG9tYWluKSAlPiUgYXJyYW5nZShDcmVhdGVkKSAlPiUgbXV0YXRlKHJlYWNoPWN1bXN1bShNZW1iZXJzLmF0LlBvc3RpbmcpLCBpbmRleD1zZXFfYWxvbmcocmVhY2gpLCBuPW1heChpbmRleCkpICU+JSBmaWx0ZXIobiA+IDEpICU+JSBtdXRhdGUoQXJ0aWNsZT1pZmVsc2UoaW5kZXg9PW4sIGFzLmNoYXJhY3RlcihMaW5rLlRleHQpLCAiIikpIAoKZHRncm91cHNfanVua19wbG90IDwtIGR0Z3JvdXBzX2p1bmtfcGxvdCAlPiUgZ3JvdXBfYnkoTGluay5UZXh0KSAlPiUgYXJyYW5nZShDcmVhdGVkKSAlPiUgbXV0YXRlKHByZXZpb3VzPWxhZyhDcmVhdGVkLCAxKSwgZWxhcHNlZD1DcmVhdGVkLWxhZyhDcmVhdGVkLDEpLCBlbGFwc2VkPWlmZWxzZShpcy5uYShlbGFwc2VkKSwgMCwgYXMuaW50ZWdlcihlbGFwc2VkKSksIHRpbWU9Y3Vtc3VtKGVsYXBzZWQpLCBOYW1lPUdyb3VwLk5hbWUpCmBgYApBIGZ1cnRoZXIgYW5hbHlzaXMgb2YgbmluZSBvZiB0aGUgdG9wIDEwIGp1bmsgbmV3cyBsaW5rcyBzaGFyZWQgaW4gcHJvLVRydW1wIEdyb3VwcyBpbmRpY2F0ZXMgdGhhdCB0aGVyZSBpcyBzZWVtaW5nbHkgbGl0dGxlIGNvb3JkaW5hdGlvbi4gSW5zdGVhZCwgdGhlIHNoYXJpbmcgb2YganVuayBuZXdzIGxpbmtzLCB3aGlsZSBwZXJ2YXNpdmUsIGFwcGVhcnMgdG8gYmUgbW9yZSBvciBsZXNzIG9yZ2FuaWMuIEhvd2V2ZXIsIGl0IGlzIG5vdCBwb3NzaWJsZSB0byBkZWZpbml0aXZlbHkgc2F5IHdoZXRoZXIgdGhlcmUgaXMgc29tZSBsZXZlbCBvZiBjb29yZGluYXRpb24gYW1vbmcgc3BlY2lmaWMgZ3JvdXAgbWVtYmVycyBnaXZlbiB0aGF0IHRoZSBpZGVudGl0aWVzIG9mIG1lbWJlcnMgYXJlIHByaXZhY3kgcHJvdGVjdGVkLgoKYGBge3IsIGVjaG89RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGV2YWw9VFJVRX0KdG9wZHRqdW5rIDwtIGR0Z3JvdXBzX2p1bmtfcGxvdCAlPiUgZ3JvdXBfYnkoTGluay5UZXh0KSAlPiUgY291bnQoKSAlPiUgYXJyYW5nZShkZXNjKG4pKSAlPiUgaGVhZCgxMCkKdG9wZHRqdW5rIDwtIHRvcGR0anVua1stMSxdCnRvcGR0anVuayA8LSB0b3BkdGp1bmskTGluay5UZXh0CgpkdGdyb3Vwc19qdW5rX3Bsb3QgJT4lIGZpbHRlcihMaW5rLlRleHQgJWluJSB0b3BkdGp1bmspICU+JSBnZ3Bsb3QoYWVzKHg9dGltZSwgeT1yZWFjaCkpICsKICBnZW9tX2ppdHRlcihhZXMoY29sb3I9ZG9tYWluKSkgKyAKICBnZW9tX3BhdGgoYWVzKGNvbG91cj1kb21haW4pLCBzaXplPTAuNSwgYWxwaGE9MC41KSArCiAgZ2VvbV90ZXh0KGFlcyh4PXRpbWUsIHk9cmVhY2gsIGxhYmVsPU5hbWUpLCBzaXplPTEsIGhqdXN0PSJpbndhcmQiKSArCiAgI3hsaW0oMCwgNTAwMDAwMCkgKwogIGxhYnMoeD0iVGltZSBFbGFwc2VkIChpbiBTZWNvbmRzKSIsIHk9IkZvbGxvd2VycyIsIGNvbG91cj0iRG9tYWluIikgKyAgCiAgZmFjZXRfd3JhcCh+IExpbmsuVGV4dCwgc2NhbGVzPSJmcmVlX3kiLCBsYWJlbGxlciA9IGxhYmVsX3dyYXBfZ2VuKHdpZHRoID0gNzUsIG11bHRpX2xpbmUgPVQpKSArCiAgc2NhbGVfeF9jb250aW51b3VzKGxhYmVscyA9IGNvbW1hKSArCiAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IGNvbW1hKSArCiAgdGhlbWUoYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KGZhY2UgPSAiYm9sZCIsIHNpemU9NCksCiAgICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChmYWNlID0gImJvbGQiLCBzaXplPTQpLAogICAgICAgICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KGZhY2UgPSAiYm9sZCIsIHNpemU9NCksCiAgICAgICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChmYWNlID0gImJvbGQiLCBzaXplPTQpLAogICAgICAgICAgc3RyaXAudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMyksCiAgICAgICAgICAjcGFuZWwubWFyZ2luLnkgPSB1bml0KC0zLCAnY20nKSwKICAgICAgICAgIGxlZ2VuZC50aXRsZT1lbGVtZW50X3RleHQoZmFjZSA9ICJib2xkIiwgc2l6ZT00KSwKICAgICAgICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KGZhY2UgPSAiYm9sZCIsIHNpemU9NCksCiAgICAgICAgICBsZWdlbmQucG9zaXRpb24gPSAibm9uZSIsCiAgICAgICAgICBwbG90LnRpdGxlID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgICAgcGxvdC5zdWJ0aXRsZSA9IGVsZW1lbnRfdGV4dChmYWNlID0gImJvbGQiLCBzaXplPTQpLAogICAgICAgICAgcGxvdC5jYXB0aW9uID0gZWxlbWVudF90ZXh0KGZhY2UgPSAiaXRhbGljIiwgc2l6ZT00KSwKICAgICAgICAgICNwYW5lbC5ncmlkLm1pbm9yPWVsZW1lbnRfYmxhbmsoKSwKICAgICAgICAgICNwYW5lbC5ncmlkLm1ham9yPWVsZW1lbnRfYmxhbmsoKSwKICAgICAgICAgIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X2JsYW5rKCksIAogICAgICAgICAgI2F4aXMubGluZSA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICAgICNwbG90Lm1hcmdpbiA9IG1hcmdpbigtMC4yNSwgLTAuMjUsIC0wLjI1LCAtMC4yNSwgImNtIiksCiAgICAgICAgICBheGlzLnRpY2tzLnk9ZWxlbWVudF9ibGFuaygpKSAKCmBgYAoKSW4gdGhlICoqcHJvLUJpZGVuIEdyb3VwcyBFY29zeXN0ZW0qKiwgdGhlcmUgd2VyZSAyNiB1bmlxdWUgbGlua3Mgc2hhcmVkIGZyb20gc2l4IGRpZmZlcmVudCAianVuayBuZXdzIiB3ZWJzaXRlcyAtIGFsbCBvZiB3aGljaCBhcHBlYXIgaW4gdGhlIHByby1UcnVtcCBQYWdlcyBvciBwcm8tVHJ1bXAgR3JvdXBzIGVjb3N5c3RlbXMuIE9mIHRoZSAyNiBsaW5rcywgMTMgd2VyZSBmcm9tICJuZW9ubmV0dGxlLmNvbSIsIHNldmVuIHdlcmUgZnJvbSAibmV3c3B1bmNoLmNvbSIsIHR3byBmcm9tICJ5b3VybmV3c3dpcmUuY29tIiBhbmQgb25lIGVhY2ggZnJvbSAiY29uc2VydmF0aXZlcG9zdC5jb20iLCAiZ2VsbGVycmVwb3J0LmNvbSIsICJpbmZvd2Fycy5jb20iLCBhbmQgInB1cHBldHN0cmluZ25ld3MuY29tIi4KClRoZSBsaW5rcyBmcm9tICJqdW5rIG5ld3MiIHdlYnNpdGVzIHRoYXQgd2VyZSBtb3N0IHNoYXJlZCB3aXRoaW4gdGhlIHByby1CaWRlbiBHcm91cHMgZWNvc3lzdGVtIHdlcmUgYXMgZm9sbG93czoKCmBgYHtyLCBlY2hvPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBldmFsPVRSVUV9CiNBbGwgSnVuayBOZXdzIExpbmtzIAojamJncm91cHNfanVua19kb21fbm9mYiAlPiUgc2VsZWN0KEdyb3VwLk5hbWUsIENyZWF0ZWQsIGRvbWFpbiwgTGluay5UZXh0LCBNZW1iZXJzLmF0LlBvc3RpbmcpICU+JSBmaWx0ZXIoZG9tYWluICVpbiUgZmFrZW5ld3MpICU+JSBncm91cF9ieShMaW5rLlRleHQpICU+JSBmaWx0ZXIoIUdyb3VwLk5hbWUgJWluJSBjKCJXZSBBcmUgUSIsICJVTklURUQgREVNT0NSQVRTLCBSRVBVQkxJQ0FOUyAmIExJQkVSVEFSSUFOUyA0IFRSVU1QICh0YWtpbmcgYmFjayB0aGUgVVNBKSIpKSAlPiUgYXJyYW5nZShDcmVhdGVkKSAlPiUgbXV0YXRlKHJlYWNoPWN1bXN1bShNZW1iZXJzLmF0LlBvc3RpbmcpLCBpbmRleD1zZXFfYWxvbmcoTGluay5UZXh0KSkgJT4lIGFycmFuZ2UoTGluay5UZXh0LCBpbmRleCkKCm9kZGJhbGwgPC0gYygiUGFtZWxhIEdlbGxlciIsICJ8IE5lb24gTmV0dGxlIiwgIkNvbnNlcnZhdGl2ZSBQb3N0IiwgIkFuZ2VsIiwgIkRlbm5pcyIsICJMYXJyeSIsICJMZWUiLCAiU2hvdyBBcmNoaXZlcyIsICJCcmlhbiBLb2xmYWdlIiwgIkRpbmEiLCAiRGlubyIsICJMaXNhIiwgIkNob24iLCAiTWVycmlsbCIsICJQYXQiLCAiU2FyYWgiLCAiQmlsbCIsICJEYW5pZWwiLCAiRWxpemFiZXRoIiwgIk1pY2t5IiwgIktpbWJlcmxleSIsICJSb24iLCAiRGFybGVuZSIsICJKZXJyeSIsICJKb2huIiwgIk1hcmsiLCAiRGFuIiwgIkZyYW5rIiwgIkdheWxlIiwgIkdlbmUiLCAiR3JlZ2ciLCAiS2FyZW4iLCAgIkxpbmRhIiwgIk1pY2hlYWxpbmEiLCAiUm94YW5uZSIsICJUaGVyZXNhIiwgIkFsaWNlIiwgIkFsaWNpYSIsICJBc3RyaWQiLCAiQ2F0aHkiLCAiQ2hlciIsICJDbGludCIsICJEYXZpZCIsICJEYW5pZWwiLCAiRGVuaXNlIiwgIkRpYW5lIiwgIkRvbm5hIiwgIkRvdWciLCAiR2FyeSIsICJHZW5uYWR5IiwgIkhlbGVuIiwgIkhvbHRvbiIsICJKYW1lcy1DaHJpc3RpbmEiLCAiSmFuZSIsICJKZW5uaWZlciIsICJKZXJpIiwgIkpld2VsIiwgIkpvc2UiLCAgIkthdGllIiwgIktlbiIsICJLZW5uZXRoIiwgIktldmluIiwgIk1hcmllIiwgIk1hcnkiLCAiTWVsIiwgIk1pY2hhZWwiLCAgIk1vbnR5IiwgIlBhdHJpY2siLCAiUGF0dHkiLCAiUmFscGggV2lsbGlhbSIsICJSYW5keSIsICJTZW5jZXJpYSIsICJTYWxtYW4iLCAiU2hhcm9uIiwgIlN0YWNpZSIsICJTaGFua2FyIiwgIlN0ZXBoZW4iLCAiU3RldmVuIiwgIlN0ZXZlIiwgIlRoZXJlc2EiLCAiVG9tbXkiLCAiVHJlZyIsICJXYWx0ZXIiLCAiV2lsbGlzIikKamJnX2R0IDwtIGpiZ3JvdXBzX2p1bmtfZG9tICU+JSBzZWxlY3QoR3JvdXAuTmFtZSwgQ3JlYXRlZCwgZG9tYWluLCBMaW5rLlRleHQsIE1lbWJlcnMuYXQuUG9zdGluZykgJT4lIGZpbHRlcihkb21haW4gJWluJSBmYWtlbmV3cykgJT4lIGZpbHRlcighTGluay5UZXh0ICVpbiUgb2RkYmFsbCAmICFHcm91cC5OYW1lICVpbiUgYygiV2UgQXJlIFEiLCAiVU5JVEVEIERFTU9DUkFUUywgUkVQVUJMSUNBTlMgJiBMSUJFUlRBUklBTlMgNCBUUlVNUCAodGFraW5nIGJhY2sgdGhlIFVTQSkiKSkgJT4lIGdyb3VwX2J5KExpbmsuVGV4dCwgZG9tYWluKSAlPiUgY291bnQoKSAlPiUgYXJyYW5nZShkZXNjKG4pKQoKI2piZ3JvdXBzX2p1bmtfZG9tICU+JSBzZWxlY3QoR3JvdXAuTmFtZSwgQ3JlYXRlZCwgZG9tYWluLCBMaW5rLlRleHQsIE1lbWJlcnMuYXQuUG9zdGluZykgJT4lIGZpbHRlcihkb21haW4gJWluJSBmYWtlbmV3cykgJT4lIGZpbHRlcighTGluay5UZXh0ICVpbiUgb2RkYmFsbCAmICFHcm91cC5OYW1lICVpbiUgYygiV2UgQXJlIFEiLCAiVU5JVEVEIERFTU9DUkFUUywgUkVQVUJMSUNBTlMgJiBMSUJFUlRBUklBTlMgNCBUUlVNUCAodGFraW5nIGJhY2sgdGhlIFVTQSkiKSkgJT4lIHVuZ3JvdXAoKSAlPiUgc2VsZWN0KGRvbWFpbiwgTGluay5UZXh0KSAlPiUgZGlzdGluY3QoKSAlPiUgZ3JvdXBfYnkoZG9tYWluKSAlPiUgY291bnQoKSAlPiUgYXJyYW5nZShkZXNjKG4pKQoKZGF0YXRhYmxlKGpiZ19kdCwgb3B0aW9ucz1saXN0KG9yZGVyPWxpc3QobGlzdCgzLCAnZGVzYycpKSkpCmBgYAoKT2YgdGhlIDc3IGdyb3VwcyBpbiB0aGUgcHJvLUJpZGVuIEdyb3VwcyBlY29zeXN0ZW0sIGF0IGxlYXN0IG9uZSAianVuayBuZXdzIiBsaW5rIHdhcyBwb3N0ZWQgaW4gMTggb2YgdGhlbS4gTW9zdCBsaW5rcyB3ZXJlIG9ubHkgcG9zdGVkIG9uZSB0aW1lIGluIGEgc2luZ2xlIGdyb3VwLiBJbiBzaXggZ3JvdXBzLCB0d28gImp1bmsgbmV3cyIgbGlua3Mgd2VyZSBmb3VuZC4gVGhlIG91dGxpZXIgaXMgYSBncm91cCBuYW1lZCAiQmlkZW4gZm9yIHByZXNpZGVudCIsIGluIHdoaWNoIDEzIGRpZmZlcmVudCAianVuayBuZXdzIiBsaW5rcyB3ZXJlIGZvdW5kLiAgICAKYGBge3IsIGVjaG89RkFMU0UsIGV2YWw9VFJVRSwgd2FybmluZz1GQUxTRX0KI0JpZ2dlc3QgU2hhcmVycyBvZiAiSnVuayBOZXdzIERvbWFpbnMiIC0gQXJyYW5nZWQgYnkgbnVtYmVyIG9mIHBvc3RzIHNoYXJlZCB0aGVuIGZvbGxvd2VycyAKamJnX2R0X2xlYWRlcnMgPC0gamJncm91cHNfanVua19kb20gJT4lIHNlbGVjdChHcm91cC5OYW1lLCBDcmVhdGVkLCBkb21haW4sIExpbmsuVGV4dCwgTWVtYmVycy5hdC5Qb3N0aW5nKSAlPiUgZmlsdGVyKGRvbWFpbiAlaW4lIGZha2VuZXdzICYgIUxpbmsuVGV4dCAlaW4lIG9kZGJhbGwgJiAhR3JvdXAuTmFtZSAlaW4lIGMoIldlIEFyZSBRIiwgIlVOSVRFRCBERU1PQ1JBVFMsIFJFUFVCTElDQU5TICYgTElCRVJUQVJJQU5TIDQgVFJVTVAgKHRha2luZyBiYWNrIHRoZSBVU0EpIikpICU+JSBncm91cF9ieShHcm91cC5OYW1lKSAlPiUgbXV0YXRlKFBvc3RzPWxlbmd0aChHcm91cC5OYW1lKSwgTWVtYmVycz1tYXgoTWVtYmVycy5hdC5Qb3N0aW5nKSkgJT4lIHNlbGVjdChHcm91cC5OYW1lLCBNZW1iZXJzLCBQb3N0cykgJT4lIGRpc3RpbmN0KCkgJT4lIGFycmFuZ2UoZGVzYyhQb3N0cyksIGRlc2MoTWVtYmVycykpCgpkYXRhdGFibGUoamJnX2R0X2xlYWRlcnMsIG9wdGlvbnM9bGlzdChvcmRlcj1saXN0KGxpc3QoMywgJ2Rlc2MnKSkpKQoKYGBgCgpUaGUgImp1bmsgbmV3cyIgbGlua3MgaW4gdGhlICJCaWRlbiBmb3IgUHJlc2lkZW50IiBncm91cCBmZWF0dXJlIGxpbmtzIHRvICBhbnRpLUJpZGVuLCBhbnRpLURlbW9jcmF0LCBhbnRpLWltbWlncmFudCBhbmQgYW50aS1Jc2xhbSBjb250ZW50LCB3aGljaCBzdWdnZXN0cyB0aGF0IHRoZSAiQmlkZW4gZm9yIHByZXNpZGVudCIgZ3JvdXAgaXMgYWN0dWFsbHkgYW4gYW50aS1CaWRlbiBncm91cC4gCgpgYGB7ciwgaW5jbHVkZT1GQUxTRX0KamJnX2R0X2I0cCA8LSBqYmdyb3Vwc19qdW5rX2RvbSAlPiUgZmlsdGVyKGRvbWFpbiAlaW4lIGZha2VuZXdzICYgR3JvdXAuTmFtZT09IkJpZGVuIGZvciBwcmVzaWRlbnQiICYgIUxpbmsuVGV4dD09IlJhbHBoIFdpbGxpYW0iKSAlPiUgYXJyYW5nZShDcmVhdGVkKSAlPiUgc2VsZWN0KExpbmsuVGV4dCwgTGluaykgCmBgYAoKYGBge3IsIGVjaG89RkFMU0UsIGV2YWw9VFJVRSwgd2FybmluZz1GQUxTRX0KZGF0YXRhYmxlKGpiZ19kdF9iNHAsIG9wdGlvbnM9bGlzdChvcmRlcj1saXN0KGxpc3QoMSwgJ2Rlc2MnKSkpKQoKYGBgCg==