Introduction & Background:

Graffiti has become synonymous with New York City, and it is nearly impossible to visit any place on this map without encountering some form of it. It is a form of expression that grew out of tensions specific to New York in the 1960’s, and thus has become part of the city’s identity. The versions of graffiti that we see today grew as graffiti writers perfected their practice, sharing techniques along the way.

However, because of graffiti’s ties to an impoverished, grimy New York, and its often-illegal nature, it is an art form that is heavily policed. Many pieces that today’s work grew from can now only be seen through photographic documentation, if at all. Although many original works are gone, they were still integral in the formation of graffiti that exists today, and it is interesting to consider the tensions that both cultivated and hindered the art form over the years.

Today, Graffiti-Free NYC is a task force employed by the city government (a cooperative effort among the NYC Economic Development Corporation, the NYC Department of Sanitation, and the Office of the Mayor) that cleans reported instances of illegal graffiti across the city. From 2013, they have been updating a database that contains information about the location of a reported graffiti incident, the date it was reported, the status of it’s cleaning, and the date it was cleaned on. The Graffiti-Free task force is currently paused so the city can allocate more resources to figting COVID19

This data (from January 2019 to January 2020) is available on NYC Open Data, and I wanted to see what it could tell us about graffiti today.

Considering the history of graffiti, I wanted to think about things like:

Through the use of data visualizations and maps, I was able to answer some of these questions, and think about how this research could grow in the future.

Innitial Visuliazations:

This set of primary graphs and maps helped me gain more understanding about the data, and helped direct the rest of my research. ##### Fig. 1: This bar chart shows the total count of real graffiti incidents reported in New York City from 2019-2020, categorized by borough. The raw data set contained information about reports where graffiti did not exist, so I did filter these out. It shows that Brooklyn had the most graffiti reported (9,131 incidents) and Staten Island had the least (263). However, it is important to consider that this count represents only the graffiti reported to the task force, and there are likly other incidents that have not been reported.

ggplot(data = real_graffiti) +
  geom_bar(mapping = aes(x = BOROUGH, fill = "count")) +
  theme_bw()+
  scale_fill_manual(name = "BOROUGH",
                    values = c("#2abcc9", "#c46ec3", "#f27d07", "#6de373", "#f5e340"),
                    breaks = c("BRONX", "BROOKLYN", "MANHATTAN", "QUEENS", "STATEN ISLAND")) +
  labs(x = "Borough", y = "Count of Incidents",
       title = "Reported Graffiti Incidents in New York City 2019-2020",
       #subtitle = "Average of number of days for each incident grouped by borough",
       caption = "Source: NYC Open Data") 

Fig. 2:

This bar chart breaks the data down further, separating incidents into “Closed” (meaning case closed, graffiti cleaned), and “Open” (meaning case still open, case unresolved). Here we see that the number of open and closed cases in each borough reflect the number of cases total, that there is not a borough that has a significant more open cases.

Fig. 3:

This bar chard showcases

LS0tCnRpdGxlOiAiTWF1ZGUgTGFWYXV0ZSBGaW5hbCIKb3V0cHV0OiAKICBodG1sX2RvY3VtZW50OgogICAgZGZfcHJpbnQ6IHBhZ2VkCiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlCi0tLQoKYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9CiNpbXBvcnRpbmcgbmVzc2VjYXJ5IGxpYnJhcmllcwpsaWJyYXJ5KHRpZHl2ZXJzZSkKbGlicmFyeSh0aWR5Y2Vuc3VzKQpsaWJyYXJ5KHNmKQpsaWJyYXJ5KHNjYWxlcykKbGlicmFyeSh2aXJpZGlzKQpsaWJyYXJ5KGRwbHlyKQpsaWJyYXJ5KGx1YnJpZGF0ZSkKbGlicmFyeShwbG90bHkpCmxpYnJhcnkodGlncmlzKQpgYGAKIyMjIyMgSW50cm9kdWN0aW9uICYgQmFja2dyb3VuZDoKR3JhZmZpdGkgaGFzIGJlY29tZSBzeW5vbnltb3VzIHdpdGggTmV3IFlvcmsgQ2l0eSwgYW5kIGl0IGlzIG5lYXJseSBpbXBvc3NpYmxlIHRvIHZpc2l0IGFueSBwbGFjZSBvbiB0aGlzIG1hcCB3aXRob3V0IGVuY291bnRlcmluZyBzb21lIGZvcm0gb2YgaXQuIEl0IGlzIGEgZm9ybSBvZiBleHByZXNzaW9uIHRoYXQgZ3JldyBvdXQgb2YgdGVuc2lvbnMgc3BlY2lmaWMgdG8gTmV3IFlvcmsgaW4gdGhlIDE5NjDigJlzLCBhbmQgdGh1cyBoYXMgYmVjb21lIHBhcnQgb2YgdGhlIGNpdHnigJlzIGlkZW50aXR5LiBUaGUgdmVyc2lvbnMgb2YgZ3JhZmZpdGkgdGhhdCB3ZSBzZWUgdG9kYXkgZ3JldyBhcyBncmFmZml0aSB3cml0ZXJzIHBlcmZlY3RlZCB0aGVpciBwcmFjdGljZSwgc2hhcmluZyB0ZWNobmlxdWVzIGFsb25nIHRoZSB3YXkuCgpIb3dldmVyLCBiZWNhdXNlIG9mIGdyYWZmaXRp4oCZcyB0aWVzIHRvIGFuIGltcG92ZXJpc2hlZCwgZ3JpbXkgTmV3IFlvcmssIGFuZCBpdHMgb2Z0ZW4taWxsZWdhbCBuYXR1cmUsIGl0IGlzIGFuIGFydCBmb3JtIHRoYXQgaXMgaGVhdmlseSBwb2xpY2VkLiBNYW55IHBpZWNlcyB0aGF0IHRvZGF5J3Mgd29yayBncmV3IGZyb20gY2FuIG5vdyBvbmx5IGJlIHNlZW4gdGhyb3VnaCBwaG90b2dyYXBoaWMgZG9jdW1lbnRhdGlvbiwgaWYgYXQgYWxsLiBBbHRob3VnaCBtYW55IG9yaWdpbmFsIHdvcmtzIGFyZSBnb25lLCB0aGV5IHdlcmUgc3RpbGwgaW50ZWdyYWwgaW4gdGhlIGZvcm1hdGlvbiBvZiBncmFmZml0aSB0aGF0IGV4aXN0cyB0b2RheSwgYW5kIGl0IGlzIGludGVyZXN0aW5nIHRvIGNvbnNpZGVyIHRoZSB0ZW5zaW9ucyB0aGF0IGJvdGggY3VsdGl2YXRlZCBhbmQgaGluZGVyZWQgdGhlIGFydCBmb3JtIG92ZXIgdGhlIHllYXJzLgoKVG9kYXksIFtHcmFmZml0aS1GcmVlIE5ZQ10oaHR0cHM6Ly9lZGMubnljL3Byb2dyYW0vZ3JhZmZpdGktZnJlZS1ueWMpIGlzIGEgdGFzayBmb3JjZSBlbXBsb3llZCBieSB0aGUgY2l0eSBnb3Zlcm5tZW50IChhIGNvb3BlcmF0aXZlIGVmZm9ydCBhbW9uZyB0aGUgTllDIEVjb25vbWljIERldmVsb3BtZW50IENvcnBvcmF0aW9uLCB0aGUgTllDIERlcGFydG1lbnQgb2YgU2FuaXRhdGlvbiwgYW5kIHRoZSBPZmZpY2Ugb2YgdGhlIE1heW9yKSB0aGF0IGNsZWFucyByZXBvcnRlZCBpbnN0YW5jZXMgb2YgaWxsZWdhbCBncmFmZml0aSBhY3Jvc3MgdGhlIGNpdHkuIEZyb20gMjAxMywgdGhleSBoYXZlIGJlZW4gdXBkYXRpbmcgYSBkYXRhYmFzZSB0aGF0IGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IHRoZSBsb2NhdGlvbiBvZiBhIHJlcG9ydGVkIGdyYWZmaXRpIGluY2lkZW50LCB0aGUgZGF0ZSBpdCB3YXMgcmVwb3J0ZWQsIHRoZSBzdGF0dXMgb2YgaXQncyBjbGVhbmluZywgYW5kIHRoZSBkYXRlIGl0IHdhcyBjbGVhbmVkIG9uLiAqVGhlIEdyYWZmaXRpLUZyZWUgdGFzayBmb3JjZSBpcyBjdXJyZW50bHkgcGF1c2VkIHNvIHRoZSBjaXR5IGNhbiBhbGxvY2F0ZSBtb3JlIHJlc291cmNlcyB0byBmaWd0aW5nIENPVklEMTkqCgpUaGlzIGRhdGEgKGZyb20gSmFudWFyeSAyMDE5IHRvIEphbnVhcnkgMjAyMCkgaXMgYXZhaWxhYmxlIG9uIFtOWUMgT3BlbiBEYXRhXShodHRwczovL2RhdGEuY2l0eW9mbmV3eW9yay51cy9DaXR5LUdvdmVybm1lbnQvRFNOWS1HcmFmZml0aS1UcmFja2luZy9ncHdkLW5wYXIpLCBhbmQgSSB3YW50ZWQgdG8gc2VlIHdoYXQgaXQgY291bGQgdGVsbCB1cyBhYm91dCBncmFmZml0aSB0b2RheS4gCgpDb25zaWRlcmluZyB0aGUgaGlzdG9yeSBvZiBncmFmZml0aSwgSSB3YW50ZWQgdG8gdGhpbmsgYWJvdXQgdGhpbmdzIGxpa2U6CgogICogICBXaGF0IGRvZXMgYSB5ZWFyJ3Mgd29ydGggb2YgcmVwb3J0ZWQgZ3JhZmZpdGkgbG9vayBsaWtlIGluIE5ldyBZb3JrIENpdHk/IERvZXMgaXQgc3RpbGwgZG9taW5hdGUgdGhlIGNpdHkgICAgIGxpa2UgaXQgZGlkIGluIHRoZSAxOTYwJ3MgYW5kIDE5NzAncz8gCiAgKiAgIFdoZXJlIGlzIGdyYWZmaXRpIGhhcHBlbmluZyB0aGUgbW9zdCBhY3Jvc3MgdGhlIGNpdHk/CiAgKiAgIFdoYXQgZG8gdGhlIGRlbW9ncmFwaGljcyBvZiBuZWlnaGJvcmhvb2RzIHdoZXJlIGdyYWZmaXRpIGlzIGhlYXZpbHkgcmVwb3J0ZWQgbG9vayBsaWtlPwogICogICBEb2VzIHRoZSBsZW5ndGggb2YgdGltZSBpdCB0YWtlcyBmb3IgR3JhZmZpdGktRnJlZSBOWUMgY2hhbmdlIGZyb20gbmVpZ2hib3Job29kIHRvIG5laWdoYm9yaG9vZD8KClRocm91Z2ggdGhlIHVzZSBvZiBkYXRhIHZpc3VhbGl6YXRpb25zIGFuZCBtYXBzLCBJIHdhcyBhYmxlIHRvIGFuc3dlciBzb21lIG9mIHRoZXNlIHF1ZXN0aW9ucywgYW5kIHRoaW5rIGFib3V0IGhvdyB0aGlzIHJlc2VhcmNoIGNvdWxkIGdyb3cgaW4gdGhlIGZ1dHVyZS4gCgpgYGB7ciBzZXR1cDQsIGluY2x1ZGU9RkFMU0V9CiNpbXBvcnRpbmcgbmVjZXNzYXJ5IGRhdGEgZnJhbWVzCmdyYWZmaXRpX3Jhd19zaHAgPC0gc3RfcmVhZCgiZGF0YS9ncmFmZml0aV9yYXcuc2hwIikKI2NyZWF0aW5nIGEgZGF0YWZpbGUgd2l0aG91dCBnZW9tZXRyeQpncmFmZml0dGlfcmF3IDwtIHN0X2Ryb3BfZ2VvbWV0cnkoZ3JhZmZpdGlfcmF3X3NocCkKI2Rvd25sb2FkaW5nIGZyb20gYnl0ZXMgb2YgdGhlIGJpZyBhcHBsZQpjZW5zdXNfZGF0YSA8LSBzdF9yZWFkKCJkYXRhL255Y3QyMDEwXzIxZC9ueWN0MjAxMC5zaHAiKQpgYGAKCmBgYHtyLCBlY2hvPUZBTFNFLCBtZXNzYWdlPUYsIHdhcm5pbmc9Rn0KI2NyZWF0aW5nIGRhdGEgdGFibGUgd2hlcmUgaW5jaWRlbnRzIGFjdHVhbGx5IGV4aXN0ZWQKcmVhbF9ncmFmZml0aSA8LSBncmFmZml0dGlfcmF3ICU+JQogIGZpbHRlcihSRVNPTFVUSU9OICE9ICdDbGVhbmluZyBjcmV3IGRpc3BhdGNoZWQuIE5vIGdyYWZmaXRpIG9uIHByb3BlcnR5LicpICU+JQogIGZpbHRlcihSRVNPTFVUSU9OICE9ICdNYWlsIHJldHVybmVkIC8gd3JvbmcgYWRkcmVzcycpICU+JQogIGZpbHRlcihSRVNPTFVUSU9OICE9ICdDbGVhbmluZyBjcmV3IGRpc3BhdGNoZWQuICBDYW5ub3QgbG9jYXRlIHByb3BlcnR5LicpICU+JQogIGZpbHRlcihCT1JPVUdIICE9ICdVbnNwZWNpZmllZCcpCmBgYAoKYGBge3IsIGVjaG89RkFMU0UsIG1lc3NhZ2U9Riwgd2FybmluZz1GfQojbWFraW5nIGRhdGEgdGFibGVzIHRvIG1hcDoKI21ha2luZyBkYXRhIGZyYW1lcyBmb3IgZWFjaCBib3JvdWdoCiNjaG9vc2luZyBlYWNoIHJvdyBpbiB0aGUgQk9ST1VHSCBjb2wgYmFzZWQgb24gZWFjaCBib3JvdWdoCm1hbmhhdHRhbl9ncmFmZml0dGkgPC0gc3Vic2V0KHJlYWxfZ3JhZmZpdGksIEJPUk9VR0ggPT0gIk1BTkhBVFRBTiIpICM0NTMwCmJyb29rbHluX2dyYWZmaXR0aSA8LSBzdWJzZXQocmVhbF9ncmFmZml0aSwgQk9ST1VHSCA9PSAiQlJPT0tMWU4iKSAjOTEzMQpxdWVlbnNfZ3JhZmZpdHRpIDwtIHN1YnNldChyZWFsX2dyYWZmaXRpLCBCT1JPVUdIID09ICJRVUVFTlMiKSAjMjUxMgpicm9ueF9ncmFmZml0dGkgPC0gc3Vic2V0KHJlYWxfZ3JhZmZpdGksIEJPUk9VR0ggPT0gIkJST05YIikgIzM0NjcKc3RhdGVuX2lzbGFuZF9ncmFmZml0dGkgPC0gc3Vic2V0KHJlYWxfZ3JhZmZpdGksIEJPUk9VR0ggPT0gIlNUQVRFTiBJU0xBTkQiKSAjMjYzCmBgYAoKYGBge3IsIGVjaG89RkFMU0UsIG1lc3NhZ2U9Riwgd2FybmluZz1GfQojZGF0YSBmcmFtZSB3aXRoIHRoZSBjb3VudCBvZiBlYWNoIGNsZWFuZWQvdW5jbGVhbmVkIGluY2lkZW50IGluIGVhY2ggYm9yb3VnaCAKI21hbmhhdHRhbiBleGFtcGxlOiBwdWxsaW5nIGZyb20gbWFuaGF0dGFuIG9ubHkgdGFibGUKeF9tYW5oYXR0YW5fZ3JhZmZpdHRpX3N0YXR1cyA8LSBtYW5oYXR0YW5fZ3JhZmZpdHRpICU+JQogICNkZWZpbmluZyB0aGUgZ3JvdXAgYXMgU1RBVFVTIHRvIHdvcmsgZnJvbSBvbmx5IHRoYXQgY29sCiAgZ3JvdXBfYnkoU1RBVFVTKSAlPiUKICAjc3VtbWFyaWVzIGNyZWF0ZXMgYSBuZXcgZGF0YSBmcmFtZSwgY291bnRpbmcgdGhlIGRpZmZyZW50IHJvd3MgaW4gU1RBVFVTCiAgc3VtbWFyaXNlKGNvdW50PW4oKSkgJT4lCiAgI3JlbmFtZWQgdG8gYXZvaWQgY29uZnVzaW9uIHdoZW4gam9pbmluZyAKICByZW5hbWUobWFuaGF0dGFuX2NvdW50ID0gY291bnQpCnhfYnJvb2tseW5fZ3JhZmZpdHRpX3N0YXR1cyA8LSBicm9va2x5bl9ncmFmZml0dGkgJT4lCiAgZ3JvdXBfYnkoU1RBVFVTKSAlPiUKICBzdW1tYXJpc2UoY291bnQ9bigpKSAlPiUKICByZW5hbWUoYnJvb2tseW5fY291bnQgPSBjb3VudCkgJT4lCiAgcmlnaHRfam9pbih4X21hbmhhdHRhbl9ncmFmZml0dGlfc3RhdHVzLCBieSA9ICJTVEFUVVMiKQojbWFkZSBvbmUgb2YgdGhlc2UgbGl0dGxlIHRhYmxlcyBmb3IgZWFjaCBib3Jyb3VnaCBhbmQgam9pbmVkIHRoZW0gYWxsCnhfcXVlZW5zX2dyYWZmaXR0aV9zdGF0dXMgPC0gcXVlZW5zX2dyYWZmaXR0aSAlPiUKICBncm91cF9ieShTVEFUVVMpICU+JQogIHN1bW1hcmlzZShjb3VudD1uKCkpICU+JQogIHJlbmFtZShxdWVlbnNfY291bnQgPSBjb3VudCkgJT4lCiAgcmlnaHRfam9pbih4X2Jyb29rbHluX2dyYWZmaXR0aV9zdGF0dXMsIGJ5ID0gIlNUQVRVUyIpCnhfYnJvbnhfZ3JhZmZpdHRpX3N0YXR1cyA8LSBicm9ueF9ncmFmZml0dGkgJT4lCiAgZ3JvdXBfYnkoU1RBVFVTKSAlPiUKICBzdW1tYXJpc2UoY291bnQ9bigpKSAlPiUKICByZW5hbWUoYnJvbnhfY291bnQgPSBjb3VudCkgJT4lCiAgcmlnaHRfam9pbih4X3F1ZWVuc19ncmFmZml0dGlfc3RhdHVzLCBieSA9ICJTVEFUVVMiKQp4X3N0YXRlbl9pc2xhbmRfZ3JhZmZpdHRpX3N0YXR1cyA8LSBzdGF0ZW5faXNsYW5kX2dyYWZmaXR0aSAlPiUKICBncm91cF9ieShTVEFUVVMpICU+JQogIHN1bW1hcmlzZShjb3VudD1uKCkpICU+JQogIHJlbmFtZShzdGF0ZW5faXNsYW5kX2NvdW50ID0gY291bnQpICU+JQogIHJpZ2h0X2pvaW4oeF9icm9ueF9ncmFmZml0dGlfc3RhdHVzLCBieSA9ICJTVEFUVVMiKQojYWxsIGJvcm9zIGpvaW5lZCB3aXRoIHRvdGFsIG51bWJlciBmcm9tIG9yaWdpbmFsIGRhdGEgZnJhbWUKZ3JhZmZpdGlfY291bnRfYm9ybyA8LSByZWFsX2dyYWZmaXRpICU+JQogIGdyb3VwX2J5KFNUQVRVUykgJT4lCiAgc3VtbWFyaXNlKGNvdW50PW4oKSkgJT4lCiAgcmVuYW1lKHRvdGFsX2NvdW50ID0gY291bnQpICU+JQogIHJpZ2h0X2pvaW4oeF9zdGF0ZW5faXNsYW5kX2dyYWZmaXR0aV9zdGF0dXMsIGJ5ID0gIlNUQVRVUyIpCmBgYAojIyMjIElubml0aWFsIFZpc3VsaWF6YXRpb25zOgpUaGlzIHNldCBvZiBwcmltYXJ5IGdyYXBocyBhbmQgbWFwcyBoZWxwZWQgbWUgZ2FpbiBtb3JlIHVuZGVyc3RhbmRpbmcgYWJvdXQgdGhlIGRhdGEsIGFuZCBoZWxwZWQgZGlyZWN0IHRoZSByZXN0IG9mIG15IHJlc2VhcmNoLgojIyMjIyBGaWcuIDE6ClRoaXMgYmFyIGNoYXJ0IHNob3dzIHRoZSB0b3RhbCBjb3VudCBvZiByZWFsIGdyYWZmaXRpIGluY2lkZW50cyByZXBvcnRlZCBpbiBOZXcgWW9yayBDaXR5IGZyb20gMjAxOS0yMDIwLCBjYXRlZ29yaXplZCBieSBib3JvdWdoLiBUaGUgcmF3IGRhdGEgc2V0IGNvbnRhaW5lZCBpbmZvcm1hdGlvbiBhYm91dCByZXBvcnRzIHdoZXJlIGdyYWZmaXRpIGRpZCBub3QgZXhpc3QsIHNvIEkgZGlkIGZpbHRlciB0aGVzZSBvdXQuIEl0IHNob3dzIHRoYXQgQnJvb2tseW4gaGFkIHRoZSBtb3N0IGdyYWZmaXRpIHJlcG9ydGVkICg5LDEzMSBpbmNpZGVudHMpIGFuZCBTdGF0ZW4gSXNsYW5kIGhhZCB0aGUgbGVhc3QgKDI2MykuIEhvd2V2ZXIsIGl0IGlzIGltcG9ydGFudCB0byBjb25zaWRlciB0aGF0IHRoaXMgY291bnQgcmVwcmVzZW50cyBvbmx5IHRoZSBncmFmZml0aSAqcmVwb3J0ZWQqIHRvIHRoZSB0YXNrIGZvcmNlLCBhbmQgdGhlcmUgYXJlIGxpa2x5IG90aGVyIGluY2lkZW50cyB0aGF0IGhhdmUgbm90IGJlZW4gcmVwb3J0ZWQuCmBgYHtyfQpnZ3Bsb3QoZGF0YSA9IHJlYWxfZ3JhZmZpdGkpICsKICBnZW9tX2JhcihtYXBwaW5nID0gYWVzKHggPSBCT1JPVUdILCBmaWxsID0gImNvdW50IikpICsKICB0aGVtZV9idygpKwogIHNjYWxlX2ZpbGxfbWFudWFsKG5hbWUgPSAiQk9ST1VHSCIsCiAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gYygiIzJhYmNjOSIsICIjYzQ2ZWMzIiwgIiNmMjdkMDciLCAiIzZkZTM3MyIsICIjZjVlMzQwIiksCiAgICAgICAgICAgICAgICAgICAgYnJlYWtzID0gYygiQlJPTlgiLCAiQlJPT0tMWU4iLCAiTUFOSEFUVEFOIiwgIlFVRUVOUyIsICJTVEFURU4gSVNMQU5EIikpICsKICBsYWJzKHggPSAiQm9yb3VnaCIsIHkgPSAiQ291bnQgb2YgSW5jaWRlbnRzIiwKICAgICAgIHRpdGxlID0gIlJlcG9ydGVkIEdyYWZmaXRpIEluY2lkZW50cyBpbiBOZXcgWW9yayBDaXR5IDIwMTktMjAyMCIsCiAgICAgICAjc3VidGl0bGUgPSAiQXZlcmFnZSBvZiBudW1iZXIgb2YgZGF5cyBmb3IgZWFjaCBpbmNpZGVudCBncm91cGVkIGJ5IGJvcm91Z2giLAogICAgICAgY2FwdGlvbiA9ICJTb3VyY2U6IE5ZQyBPcGVuIERhdGEiKSAKYGBgCgoKIyMjIyMgRmlnLiAyOgpUaGlzIGJhciBjaGFydCBicmVha3MgdGhlIGRhdGEgZG93biBmdXJ0aGVyLCBzZXBhcmF0aW5nIGluY2lkZW50cyBpbnRvICJDbG9zZWQiIChtZWFuaW5nIGNhc2UgY2xvc2VkLCBncmFmZml0aSBjbGVhbmVkKSwgYW5kICJPcGVuIiAobWVhbmluZyBjYXNlIHN0aWxsIG9wZW4sIGNhc2UgdW5yZXNvbHZlZCkuIEhlcmUgd2Ugc2VlIHRoYXQgdGhlIG51bWJlciBvZiBvcGVuIGFuZCBjbG9zZWQgY2FzZXMgaW4gZWFjaCBib3JvdWdoIHJlZmxlY3QgdGhlIG51bWJlciBvZiBjYXNlcyB0b3RhbCwgdGhhdCB0aGVyZSBpcyBub3QgYSBib3JvdWdoIHRoYXQgaGFzIGEgc2lnbmlmaWNhbnQgbW9yZSBvcGVuIGNhc2VzLgpgYGB7ciwgZWNobz1GQUxTRSwgbWVzc2FnZT1GLCB3YXJuaW5nPUZ9CiNSVU4gU1VNIFNUQVRTIFRPIFNFRSBESUZSRU5DRSBJTiBDTEVBTkVEIFZTIE9QRU4/PwoKZ2dwbG90KGRhdGEgPSBncmFmZml0aV9jb3VudF9ib3JvKSArIAogIGdlb21fY29sKG1hcHBpbmcgPSBhZXMoeCA9IFNUQVRVUywgeSA9IGJyb29rbHluX2NvdW50LCBmaWxsID0gIkJyb29rbHluIikpICsKICBnZW9tX2NvbChtYXBwaW5nID0gYWVzKHggPSBTVEFUVVMsIHkgPSBtYW5oYXR0YW5fY291bnQsIGZpbGwgPSAiTWFuaGF0dGFuIikpICsKICBnZW9tX2NvbChtYXBwaW5nID0gYWVzKHggPSBTVEFUVVMsIHkgPSBicm9ueF9jb3VudCwgZmlsbCA9ICJCcm9ueCIpKSArCiAgZ2VvbV9jb2wobWFwcGluZyA9IGFlcyh4ID0gU1RBVFVTLCB5ID0gcXVlZW5zX2NvdW50LCBmaWxsID0gIlF1ZWVucyIpKSArCiAgZ2VvbV9jb2wobWFwcGluZyA9IGFlcyh4ID0gU1RBVFVTLCB5ID0gc3RhdGVuX2lzbGFuZF9jb3VudCwgZmlsbCA9ICJTdGF0ZW4gSXNsYW5kIikpICsKICAgIHNjYWxlX2ZpbGxfbWFudWFsKG5hbWUgPSAiQm9yb3VnaCIsCiAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gYygiIzJhYmNjOSIsICIjYzQ2ZWMzIiwgIiNmMjdkMDciLCAiIzZkZTM3MyIsICIjZjVlMzQwIiksCiAgICAgICAgICAgICAgICAgICAgYnJlYWtzID0gYygiQnJvb2tseW4iLCAiTWFuaGF0dGFuIiwgIkJyb254IiwgIlF1ZWVucyIsICJTdGF0ZW4gSXNsYW5kIikpICsKICAgIGxhYnMoeCA9ICJTdGF0dXMiLCB5ID0gIkNvdW50IiwKICAgICAgIHRpdGxlID0gIkdyYWZmaXRpIEluY2lkZW50cyBieSBCdXJvdWdoIiwKICAgICAgIGNhcHRpb24gPSAiU291cmNlOiBOWUMgT3BlbiBEYXRhIikgKwogIHRoZW1lX2J3KCkKYGBgCgoKCmBgYHtyLCBlY2hvPUZBTFNFLCBtZXNzYWdlPUYsIHdhcm5pbmc9Rn0KY2xlYW5lZF9ncmFmZml0dGkgPC0gcmVhbF9ncmFmZml0aSAlPiUKICBmaWx0ZXIoU1RBVFVTID09ICJDbG9zZWQiKQoKI2F0ZW1wdGluZyB0byBjcmVhdGUgY29scyB0aGF0IGFyZSBudW1lcmljIHRvIGRvIGVxdWF0aW9ucyBiYXNlZCBvZmYKI2RhdGVfZGlmZiA9IENSRUFURURfREEgLSBDTE9TRURfREFUCmRhdGVzIDwtIGNsZWFuZWRfZ3JhZmZpdHRpICU+JQogIHNlbGVjdChJTkNJREVOVF9BLCBCT1JPVUdILCBDUkVBVEVEX0RBLCBDTE9TRURfREFULCBDRU5TVVNfVFJBKSAlPiUKICBtdXRhdGUoZGF0ZV9kaWZmID0gZGlmZnRpbWUoKGFzLkRhdGUoQ1JFQVRFRF9EQSwgIiVtLyVkLyV5IikpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYXMuRGF0ZShDTE9TRURfREFULCAiJW0vJWQvJXkiKSksIHVuaXRzID0gJ2RheXMnKSkgJT4lCiAgI3JlbW92aW5nIHRoZSB3b3JkICdkYXRlcycgZnJvbSB0aGUgY29sCiAgbXV0YXRlX2F0KCJkYXRlX2RpZmYiLCBzdHJfcmVwbGFjZSwgImRheXMiLCAiIikgJT4lCiAgbXV0YXRlKGRhdGVfZGlmZiA9IGFzLm51bWVyaWMoZGF0ZV9kaWZmKSkgJT4lCiAgbXV0YXRlKGRhdGVfZGlmZiA9IGlmX2Vsc2UoZGF0ZV9kaWZmID4gMSwgKGRhdGVfZGlmZiAtIDM2NSksIGRhdGVfZGlmZikpICU+JQogIG11dGF0ZShkYXRlX2RpZmYgPSBkYXRlX2RpZmYgKiAoLTEpKQoKY2xlYW5lZF9ncmFmZml0dGlfc2ltcGxlIDwtIGNsZWFuZWRfZ3JhZmZpdHRpICU+JQogIGdyb3VwX2J5KEJPUk9VR0gpICU+JQogIHN1bW1hcmlzZShjbGVhbmVkX2luY2lkZW50X2NvdW50PW4oKSkKCiNNYWtpbmcgYSBwbG90IG9mIGNvdW50IG9mIGVhY2ggY2xlYW5lZCBncmFmZml0aQojIGdncGxvdChkYXRhID0gZGF0ZXMpICsKIyAgIGdlb21fYmFyKG1hcHBpbmcgPSBhZXMoeCA9IEJPUk9VR0gsIGZpbGwgPSAiY291bnQiKSkgKwojICAgdGhlbWVfYncoKSsKIyAgIHNjYWxlX2ZpbGxfbWFudWFsKG5hbWUgPSAiQk9ST1VHSCIsCiMgICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBjKCIjMmFiY2M5IiwgIiNjNDZlYzMiLCAiI2YyN2QwNyIsICIjNmRlMzczIiwgIiNmNWUzNDAiKSwKIyAgICAgICAgICAgICAgICAgICAgIGJyZWFrcyA9IGMoIkJST05YIiwgIkJST09LTFlOIiwgIk1BTkhBVFRBTiIsICJRVUVFTlMiLCAiU1RBVEVOIElTTEFORCIpKSArCiMgICBsYWJzKHggPSAiQm9yb3VnaCIsIHkgPSAiQ2xlYW5lZCAoY2xvc2VkKSBHcmFmZml0aSBJbmNpZGVudHMiLAojICAgICAgICB0aXRsZSA9ICJDbGVhbmVkIEdyYWZmaXRpIEluY2lkZW50cyBpbiBOZXcgWW9yayBDaXR5IiwKIyAgICAgICAgI3N1YnRpdGxlID0gIkF2ZXJhZ2Ugb2YgbnVtYmVyIG9mIGRheXMgZm9yIGVhY2ggaW5jaWRlbnQgZ3JvdXBlZCBieSBib3JvdWdoIiwKIyAgICAgICAgY2FwdGlvbiA9ICJTb3VyY2U6IE5ZQyBPcGVuIERhdGEiKSAKCiMgZ2dwbG90KGRhdGEgPSBjbGVhbmVkX2dyYWZmaXR0aSkgKwojICAgZ2VvbV9jb2wobWFwcGluZyA9IGFlcyh4ID0gQk9ST1VHSCwgeSA9IGNsZWFuZWRfaW5jaWRlbnRfY291bnQsIGZpbGwgPSAiY2xlYW5lZF9pbmNpZGVudF9jb3VudCIpKSArCiMgICB0aGVtZV9idygpKwojICAgc2NhbGVfZmlsbF9tYW51YWwobmFtZSA9ICJCT1JPVUdIIiwKIyAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IGMoIiMyYWJjYzkiLCAiI2M0NmVjMyIsICIjZjI3ZDA3IiwgIiM2ZGUzNzMiLCAiI2Y1ZTM0MCIpLAojICAgICAgICAgICAgICAgICAgICAgYnJlYWtzID0gYygiQlJPTlgiLCAiQlJPT0tMWU4iLCAiTUFOSEFUVEFOIiwgIlFVRUVOUyIsICJTVEFURU4gSVNMQU5EIikpICsKIyAgIGxhYnMoeCA9ICJCb3JvdWdoIiwgeSA9ICJDbGVhbmVkIChjbG9zZWQpIEdyYWZmaXRpIEluY2lkZW50cyIsCiMgICAgICAgIHRpdGxlID0gIkNsZWFuZWQgR3JhZmZpdGkgSW5jaWRlbnRzIGluIE5ldyBZb3JrIENpdHkiLAojICAgICAgICAjc3VidGl0bGUgPSAiQXZlcmFnZSBvZiBudW1iZXIgb2YgZGF5cyBmb3IgZWFjaCBpbmNpZGVudCBncm91cGVkIGJ5IGJvcm91Z2giLAojICAgICAgICBjYXB0aW9uID0gIlNvdXJjZTogTllDIE9wZW4gRGF0YSIpCgojIGNsZWFuZWRfYnlfYm9ybyA8LSBncmFmZml0aV9jb3VudF9ib3JvICU+JQojICAgZmlsdGVyKFNUQVRVUyA9PSAiQ2xvc2VkIikKIyAKIyBnZ3Bsb3QoZGF0YSA9IGNsZWFuZWRfYnlfYm9ybykgKyAKIyAgIHNjYWxlX2ZpbGxfbWFudWFsKG5hbWUgPSAiQm9yb3VnaCIsCiMgICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBjKCIjMmFiY2M5IiwgIiNjNDZlYzMiLCAiI2YyN2QwNyIsICIjNmRlMzczIiwgIiNmNWUzNDAiKSwKIyAgICAgICAgICAgICAgICAgICAgIGJyZWFrcyA9IGMoIkJyb29rbHluIiwgIk1hbmhhdHRhbiIsICJCcm9ueCIsICJRdWVlbnMiLCAiU3RhdGVuIElzbGFuZCIpKSArCiMgICBnZW9tX2NvbChtYXBwaW5nID0gYWVzKHkgPSBicm9va2x5bl9jb3VudCwgeCA9IFNUQVRVUywgZmlsbCA9ICJCcm9va2x5biIpKSArCiMgICBnZW9tX2NvbChtYXBwaW5nID0gYWVzKHkgPSBtYW5oYXR0YW5fY291bnQsIHggPSBTVEFUVVMsIGZpbGwgPSAiTWFuaGF0dGFuIikpICsKIyAgIGdlb21fY29sKG1hcHBpbmcgPSBhZXMoeSA9IGJyb254X2NvdW50LCB4ID0gU1RBVFVTLCBmaWxsID0gIkJyb254IikpICsKIyAgIGdlb21fY29sKG1hcHBpbmcgPSBhZXMoeSA9IHF1ZWVuc19jb3VudCwgeCA9IFNUQVRVUywgZmlsbCA9ICJRdWVlbnMiKSkgKwojICAgZ2VvbV9jb2wobWFwcGluZyA9IGFlcyh5ID0gc3RhdGVuX2lzbGFuZF9jb3VudCwgeCA9IFNUQVRVUywgZmlsbCA9ICJTdGF0ZW4gSXNsYW5kIikpICsKIyAgICAgbGFicyh4ID0gIlN0YXR1cyIsIHkgPSAiQ291bnQiLAojICAgICAgICB0aXRsZSA9ICJHcmFmZml0aSBJbmNpZGVudHMgYnkgQnVyb3VnaCIsCiMgICAgICAgIGNhcHRpb24gPSAiU291cmNlOiBOWUMgT3BlbiBEYXRhIikgKwojICAgdGhlbWVfYncoKQoKYGBgCgojIyMjIyBGaWcuIDM6ClRoaXMgYmFyIGNoYXJkIHNob3djYXNlcwoKYGBge3IsIGVjaG89RkFMU0UsIG1lc3NhZ2U9Riwgd2FybmluZz1GfQojY3JlYXRpbmcgYSBkYXRhIHRhYmxlIHdpdGggdGhlIGF2cmVhZ2UgbnVtYmVyIG9mIGRheXMgaXQgdG9vayB0byBjbGVhbiBpbiBlYWNoIGJvcm91Z2gKZGF0ZXNfYXZlIDwtIGRhdGVzICU+JQogIGdyb3VwX2J5KEJPUk9VR0gpICU+JQogIHN1bW1hcmlzZShhdmdfZGF0ZV9kaWZmID0gbWVhbihkYXRlX2RpZmYsIG5hLnJtID0gVFJVRSkpCgojUGxvdCBvZiB0aGUgYXZlcmFnZSBtdWJlciBvZiBkYXlzIGZvciBlYWNoIGJvcm91Z2gKZGF0ZXNfYXZlX3Bsb3QgPC0gZ2dwbG90KCkgKwogIGdlb21fY29sKGRhdGEgPSBkYXRlc19hdmUsIG1hcHBpbmcgPSBhZXMoeCA9IEJPUk9VR0gsIHkgPSBhdmdfZGF0ZV9kaWZmKSkgKwogIHRoZW1lX2J3KCkgKwogIGxhYnMoeCA9ICJCb3JvdWdoIiwgeSA9ICJBdmVyYWdlIFRpbWUgdG8gQ2xlYW4gKERheXMpIiwKICAgICAgICB0aXRsZSA9ICJUaW1lIHRvIENsZWFuIEdyYWZmaXRpIChkYXlzKSBpbiBOZXcgWW9yayBDaXR5IiwKICAgICAgICBzdWJ0aXRsZSA9ICJBdmVyYWdlIG9mIG51bWJlciBvZiBkYXlzIGZvciBlYWNoIGluY2lkZW50IGdyb3VwZWQgYnkgYm9yb3VnaCIsCiAgICAgICAgY2FwdGlvbiA9ICJTb3VyY2U6IE5ZQyBPcGVuIERhdGEiKQpkYXRlc19hdmVfcGxvdApgYGAKCmBgYHtyLCBlY2hvPUZBTFNFLCBtZXNzYWdlPUYsIHdhcm5pbmc9Rn0KI21ha2luZyBhIGNvcHkgb2YgZWFjaCBkYXRhIGZyYW1lIHdpdGggc2hhcGUgZmlsZSBpbm9yZGVyIHRvIG1hcApyZWFsX2dyYWZmaXRpX3NocCA8LSBncmFmZml0aV9yYXdfc2hwICU+JQogIGZpbHRlcihSRVNPTFVUSU9OICE9ICdDbGVhbmluZyBjcmV3IGRpc3BhdGNoZWQuIE5vIGdyYWZmaXRpIG9uIHByb3BlcnR5LicpICU+JQogIGZpbHRlcihSRVNPTFVUSU9OICE9ICdNYWlsIHJldHVybmVkIC8gd3JvbmcgYWRkcmVzcycpICU+JQogIGZpbHRlcihSRVNPTFVUSU9OICE9ICdDbGVhbmluZyBjcmV3IGRpc3BhdGNoZWQuICBDYW5ub3QgbG9jYXRlIHByb3BlcnR5LicpCgoKY2xlYW5lZF9ncmFmZml0dGlfc2hwIDwtIHJlYWxfZ3JhZmZpdGlfc2hwICU+JQogIGZpbHRlcihTVEFUVVMgPT0gIkNsb3NlZCIpCgpkYXRlc19zaHAgPC0gY2xlYW5lZF9ncmFmZml0dGlfc2hwICU+JQogIHNlbGVjdChJTkNJREVOVF9BLCBCT1JPVUdILCBDUkVBVEVEX0RBLCBDTE9TRURfREFUKSAlPiUKICBtdXRhdGUoZGF0ZV9kaWZmID0gZGlmZnRpbWUoKGFzLkRhdGUoQ1JFQVRFRF9EQSwgIiVtLyVkLyV5IikpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhcy5EYXRlKENMT1NFRF9EQVQsICIlbS8lZC8leSIpKSwgdW5pdHMgPSAnZGF5cycpKSAlPiUKICBtdXRhdGVfYXQoImRhdGVfZGlmZiIsIHN0cl9yZXBsYWNlLCAiZGF5cyIsICIiKSAlPiUKICBtdXRhdGUoZGF0ZV9kaWZmID0gYXMubnVtZXJpYyhkYXRlX2RpZmYpKSAlPiUKICBtdXRhdGUoZGF0ZV9kaWZmID0gaWZfZWxzZShkYXRlX2RpZmYgPiAxLCAoZGF0ZV9kaWZmIC0gMzY1KSwgZGF0ZV9kaWZmKSkgJT4lCiAgbXV0YXRlKGRhdGVfZGlmZiA9IGRhdGVfZGlmZiAqICgtMSkpCgpkYXRlc19hdmVfc2hwIDwtIGRhdGVzX3NocCAlPiUKICBncm91cF9ieShCT1JPVUdIKSAlPiUKICBzdW1tYXJpc2UoYXZnX2RhdGVfZGlmZiA9IG1lYW4oZGF0ZV9kaWZmLCBuYS5ybSA9IFRSVUUpKQoKY291bnRfcGVyX2Jvcm9fc2hwIDwtIGNsZWFuZWRfZ3JhZmZpdHRpX3NocCAlPiUKICBncm91cF9ieShCT1JPVUdIKSAlPiUKICBzdW1tYXJpc2UoaW5jaWRlbnRfY291bnQ9bigpKQoKYm9yb3VnaF9zaGFwZSA8LSBjZW5zdXNfZGF0YSAlPiUKICBncm91cF9ieShCb3JvTmFtZSkgJT4lCiAgc3VtbWFyaXNlKGNvdW50PW4oKSkgJT4lCiAgc3Rfam9pbihjb3VudF9wZXJfYm9yb19zaHAsIGpvaW4gPSBzdF9pbnRlcnNlY3RzKQoKI21hcCBvZiBhbGwgY291bnRzIG9mIGRhdGEgKHVzaW5nIGFsbCBkYXRhIGZyYW1lcyB3aXRoIHNocCBhdHRhY2hlZCkKZ2dwbG90KCkgKwogIGdlb21fc2YoZGF0YSA9IGJvcm91Z2hfc2hhcGUsIGZpbGwgPSBOQSkgKwogIGdlb21fc2YoZGF0YSA9ICBkYXRlc19zaHAsIG1hcHBpbmcgPSBhZXMoY29sb3IgPSBkYXRlX2RpZmYpLAogICAgICAgICAgc2hvdy5sZWdlbmQgPSAiZGF0ZV9kaWZmIikgKwogIHNjYWxlX2NvbG9yX3ZpcmlkaXMobmFtZT0iZGF5cyIsIGRpcmVjdGlvbj0tMSkgKwogIHRoZW1lX3ZvaWQoKSArCiAgI3NjYWxlX2ZpbGxfdmlyaWRpcyhuYW1lPSJkYXlzIiwgZGlyZWN0aW9uPS0xKQogICMgc2NhbGVfZmlsbF9zdGVwc24oYnJlYWtzPWMoMCwgLjQsIC40NSwgLjUsIC41NSwgLjYsIDEpLAogICMgICAgICAgICAgICAgICAgICAgY29sb3JzID0gcGFydGlzYW5fY29sb3JzLCAKICAjICAgICAgICAgICAgICAgICAgIG5hbWU9IlBlcmNlbnQgRGVtb2NyYXRpYyBWb3RlcyAoJSkiLAogICMgICAgICAgICAgICAgICAgICAgbGFiZWxzPXBlcmNlbnRfZm9ybWF0KGFjY3VyYWN5ID0gMUwpKSArCiAgbGFicyh0aXRsZSA9ICJHcmFmZml0aSBMZW5ndGggb2YgQ2xlYW5pbmcgKGRheXMpIiwKICAgICAgIHN1YnRpdGxlID0gIkFsbCBDbGVhbmVkIEluY2lkZW50cyBpbiBOZXcgWW9yayBDaXR5IiwKICAgICAgIGNhcHRpb24gPSAiU291cmNlOiBOWUMgT3BlbkRhdGEgMjAyMSIpCmBgYAoKYGBge3IsIGVjaG89RkFMU0UsIG1lc3NhZ2U9Riwgd2FybmluZz1GfQojdXNpbmcgc3BhdGlhbCBkYXRhIHRvIG1hcCBNYW5oYXR0YW4KI3N1YnNldCAtIHNlbGVjdGluZyBqdXN0IG1hbmhhdGFuIAptYW5oYXR0YW5fY2xlYW5lZF9zaHAgPC0gc3Vic2V0KGNsZWFuZWRfZ3JhZmZpdHRpX3NocCwgQk9ST1VHSCA9PSAiTUFOSEFUVEFOIikgJT4lCiAgI211dGF0ZSB0byBkZWFsIHdpdGggY2Vuc3VzIG51bWJlcnMgdGhhdCBhcmUgZGVjaW1pbGVzLi4uIG1pZ2h0IG5vdCBiZSBuZXNzZWNhcnkgd2l0aCBiaXRlcyBvZiBiaWcgYXBwbGU/CiAgbXV0YXRlKENFTlNVU19UUkEgPSBpZl9lbHNlKENFTlNVU19UUkEgPiAzMTAsIChDRU5TVVNfVFJBLzEwMCksIENFTlNVU19UUkEpKQoKI3NhbWUgZGF0YWZyYW1lIHdpdGggb3V0IHRoZSBnZW9tZXRyeQptYW5oYXR0YW5fY2xlYW5lZCA8LSBzdWJzZXQoY2xlYW5lZF9ncmFmZml0dGksIEJPUk9VR0ggPT0gIk1BTkhBVFRBTiIpICU+JQogICAgbXV0YXRlKENFTlNVU19UUkEgPSBpZl9lbHNlKENFTlNVU19UUkEgPiAzMTAsIChDRU5TVVNfVFJBLzEwMCksIENFTlNVU19UUkEpKQoKI2RhdGVfZGlmZiBjb2wgd2l0aCBnZW9tZXRyeQpkYXRlc19NX3NocCA8LSBtYW5oYXR0YW5fY2xlYW5lZF9zaHAgJT4lCiAgbXV0YXRlKGRhdGVfZGlmZiA9IGRpZmZ0aW1lKChhcy5EYXRlKENSRUFURURfREEsICIlbS8lZC8leSIpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYXMuRGF0ZShDTE9TRURfREFULCAiJW0vJWQvJXkiKSksIHVuaXRzID0gJ2RheXMnKSkgJT4lCiAgbXV0YXRlX2F0KCJkYXRlX2RpZmYiLCBzdHJfcmVwbGFjZSwgImRheXMiLCAiIikgJT4lCiAgbXV0YXRlKGRhdGVfZGlmZiA9IGFzLm51bWVyaWMoZGF0ZV9kaWZmKSkgJT4lCiAgbXV0YXRlKGRhdGVfZGlmZiA9IGlmX2Vsc2UoZGF0ZV9kaWZmID4gMSwgKGRhdGVfZGlmZiAtIDM2NSksIGRhdGVfZGlmZikpICU+JQogIG11dGF0ZShkYXRlX2RpZmYgPSBkYXRlX2RpZmYgKiAoLTEpKSAlPiUKICBtdXRhdGUoQ0VOU1VTX1RSQSA9IGFzLmNoYXJhY3RlcihDRU5TVVNfVFJBLCBuYS5ybSA9IFRSVUUpKQogICNzZWxlY3QoSU5DSURFTlRfQSwgQ1JFQVRFRF9EQSwgQ0xPU0VEX0RBVCwgZGF0ZV9kaWZmLCBDRU5TVVNfVFJBKQoKI2NlbnN1cyB0cmFjdCB3aXRoIGF2ZXJhZ2UgZGF0ZSBjb2wKZGF0ZXNfYXZlX0NUX01fc2hwIDwtIGRhdGVzX01fc2hwICU+JQogIGdyb3VwX2J5KENFTlNVU19UUkEpICU+JQogIHN1bW1hcmlzZShhdmdfZGF0ZV9kaWZmID0gcm91bmQobWVhbihkYXRlX2RpZmYsIG5hLnJtID0gVFJVRSksIDIpKQoKI2RhdGVfZGlmZiBjb2wgd2l0aCBvdXQgZ2VvbWV0cnkKZGF0ZXNfTSA8LSBtYW5oYXR0YW5fY2xlYW5lZCAlPiUKICBtdXRhdGUoZGF0ZV9kaWZmID0gZGlmZnRpbWUoKGFzLkRhdGUoQ1JFQVRFRF9EQSwgIiVtLyVkLyV5IikpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYXMuRGF0ZShDTE9TRURfREFULCAiJW0vJWQvJXkiKSksIHVuaXRzID0gJ2RheXMnKSkgJT4lCiAgI3JlbW92aW5nIHRoZSB3b3JkICdkYXRlcycgZnJvbSB0aGUgY29sCiAgbXV0YXRlX2F0KCJkYXRlX2RpZmYiLCBzdHJfcmVwbGFjZSwgImRheXMiLCAiIikgJT4lCiAgbXV0YXRlKGRhdGVfZGlmZiA9IGFzLm51bWVyaWMoZGF0ZV9kaWZmKSkgJT4lCiAgbXV0YXRlKGRhdGVfZGlmZiA9IGlmX2Vsc2UoZGF0ZV9kaWZmID4gMSwgKGRhdGVfZGlmZiAtIDM2NSksIGRhdGVfZGlmZikpICU+JQogIG11dGF0ZShkYXRlX2RpZmYgPSBkYXRlX2RpZmYgKiAoLTEpKSAlPiUKICBtdXRhdGUoQ0VOU1VTX1RSQSA9IGFzLmNoYXJhY3RlcihDRU5TVVNfVFJBLCBuYS5ybSA9IFRSVUUpKSAKCm1hbmhhdHRhbl9kYXRlX2RpZmYgPC0gZ2dwbG90KCkgKwogIGdlb21fY29sKGRhdGEgPSBkYXRlc19NLCBtYXBwaW5nID0gYWVzKHggPSBJTkNJREVOVF9BLCB5ID0gZGF0ZV9kaWZmKSkgKwogIHRoZW1lX2J3KCkgKwogIGxhYnMoeCA9ICJNYW5oYXR0YW4gSW5jaWRlbnRzIiwgeSA9ICJMZW5ndGggb2YgVGltZSAoRGF5cyIpCgojbWFuaGF0dGFuX2RhdGVfZGlmZgoKZGF0ZXNfYXZlX0NUX00gPC0gZGF0ZXNfTSAlPiUKICBncm91cF9ieShDRU5TVVNfVFJBKSAlPiUKICBzdW1tYXJpc2UoYXZnX2RhdGVfZGlmZiA9IG1lYW4oZGF0ZV9kaWZmLCBuYS5ybSA9IFRSVUUpKQoKIyBnZ3Bsb3QoZGF0YSA9IGRhdGVzX2F2ZV9DVF9NKSArCiMgICBnZW9tX2NvbChtYXBwaW5nID0gYWVzKHggPSBDRU5TVVNfVFJBLCB5ID0gYXZnX2RhdGVfZGlmZikpICsKIyAgIHRoZW1lX2J3KCkKCiNjb2wxIDwtIGMoJyNiYzEzMWUnLCAnI2ViNDk1NicsICcjYzM2ZTllJywgJyM3Mjc5ZGInLCAnIzNjNmViZicsICcjMWY0YmFlJykKCiNtYWtpbmcgYW4gb3V0bGluZSBvZiBqdXN0IE1hbmhhdHRhbgojY2Vuc3VzIGRhdGEgPSAyMDEwIGJ5dGVzIG9mIHRoZSBiaWcgYXBwbGUKTV9jZW5zdXNfZGF0YV9zaHAgPC0gY2Vuc3VzX2RhdGEgJT4lCiAgZmlsdGVyKEJvcm9OYW1lID09ICJNYW5oYXR0YW4iKQoKcmVhbF9ncmFmZml0aV9NX3NocCA8LSBncmFmZml0aV9yYXdfc2hwICU+JQogIGZpbHRlcihSRVNPTFVUSU9OICE9ICdDbGVhbmluZyBjcmV3IGRpc3BhdGNoZWQuIE5vIGdyYWZmaXRpIG9uIHByb3BlcnR5LicpICU+JQogIGZpbHRlcihSRVNPTFVUSU9OICE9ICdNYWlsIHJldHVybmVkIC8gd3JvbmcgYWRkcmVzcycpICU+JQogIGZpbHRlcihSRVNPTFVUSU9OICE9ICdDbGVhbmluZyBjcmV3IGRpc3BhdGNoZWQuICBDYW5ub3QgbG9jYXRlIHByb3BlcnR5LicpICU+JQogIGZpbHRlcihCT1JPVUdIID09ICdNQU5IQVRUQU4nKQoKY19kX01fZ3JhZmZpdGkgPC0gcmVhbF9ncmFmZml0aV9NX3NocCAlPiUKICBtdXRhdGUoY2xlYW5lZCA9IGlmX2Vsc2UoU1RBVFVTID09ICJDbG9zZWQiLCAieWVzIiwgIm5vIikpICU+JQogIHNlbGVjdChJTkNJREVOVF9BLCBTVEFUVVMsIE5UQSwgY2xlYW5lZCwgZ2VvbWV0cnkpCgpgYGAKCmBgYHtyLCBlY2hvPUZBTFNFLCBtZXNzYWdlPUYsIHdhcm5pbmc9Rn0KI21hcCBvZiBieXRlcyBvZiBiaWcgYXBwbGUgMjAxMCBjZW5zdXMgdHJhY3RzIHdpdGggYWxsIGluY2lkZW50cyBvZiBncmFmZml0aSBpbiBtYW5oYXR0YW4KZ2dwbG90KCkgKwogIGdlb21fc2YoZGF0YSA9IE1fY2Vuc3VzX2RhdGFfc2hwLCBmaWxsID0gTkEpICsKICBnZW9tX3NmKGRhdGEgPSBjX2RfTV9ncmFmZml0aSwgYWVzKGNvbG9yID0gY2xlYW5lZCkpICsKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYygneWVzJyA9ICdibGFjaycsICdubycgPSAncmVkJyksIG5hbWUgPSAiR3JhZmZpdGkgQ2xlYW5lZD8iKSArCiAgdGhlbWVfdm9pZCgpCmBgYAoKYGBge3Igc2V0dXAyLCBpbmNsdWRlPUZBTFNFfQojd29ya2luZyB3aXRoIGNlbnN1cyBkYXRhCiNjZW5zdXNfYXBpX2tleSgiM2M4OTIyMGZiNGM4YzdhZjY5YjUxNDFmOWQyM2I0YmVlMTkyYmRmYyIsIGluc3RhbGwgPSBUUlVFLCBvdmVyd3JpdGUgPVQpCiNzZjFfMjAxMCA8LSBsb2FkX3ZhcmlhYmxlcygyMDEwLCAic2YxIiwgY2FjaGUgPSBUUlVFKQojaW1wb3J0aW5nIGFsbCB2YXJpYWJsZXMgZm9yIDIwMTkgYWNzIGRhdGEKYWNzMTkgPC0gbG9hZF92YXJpYWJsZXMoMjAxOSwgImFjczUiKQoKI2ltcG9ydGluZyAyMDE5IGFjcyBkYXRhIGZvciBNYW5oYXR0YW4gCiNCMTkwMTNfMDAxIC0gRXN0aW1hdGUhIU1lZGlhbiBob3VzZWhvbGQgaW5jb21lIGluIHRoZSBwYXN0IDEyIG1vbnRocyAoaW4gMjAxOSBpbmZsYXRpb24tYWRqdXN0ZWQgZG9sbGFycykKcmF3X2luY29tZSA8LSBnZXRfYWNzKGdlb2dyYXBoeSA9ICJ0cmFjdCIsIAogICAgICAgICAgICAgIHZhcmlhYmxlcyA9ICJCMTkwMTNfMDAxIiwgCiAgICAgICAgICAgICAgc3RhdGUgPSAiTlkiLCAKICAgICAgICAgICAgICBjb3VudHkgPSAiTmV3IFlvcmsiLCAKICAgICAgICAgICAgICBnZW9tZXRyeSA9IFRSVUUsCiAgICAgICAgICAgICAgeWVhciA9IDIwMTksCiAgICAgICAgICAgICAgY2IgPSBGQUxTRSkKCiNjaGVja2luZyB0aGUgcHJvamVjdGlvbiBvZiB0aGUgY2Vuc3VzIGRhdGEgZnJhbWUKI3N0X2NycyhyYXdfaW5jb21lKSAjNDI2OQojY2hhbmdpbmcgdGhlIHByb2plY3Rpb24gb2YgdGhlIGNlbnN1cyBkYXRhIGZyYW1lCnJhd19pbmNvbWVfMjI2MyA8LSByYXdfaW5jb21lICU+JSAKICBzdF90cmFuc2Zvcm0oMjI2MykKCiNjcmVhdGluZyBmdW5jdGlvbiBhbmQgZGF0YSBzZXRzIHRvIGNsaXAgTWFuaGF0dGFuIHRvIHNob3JlIGxpbmVzCiNVc2luZyBqdXN0IHJhdyBjZW5zdXMgZGF0YSBsb29rcyB3ZWlyZApzdF9lcmFzZSA8LSBmdW5jdGlvbih4LCB5KSB7CiAgc3RfZGlmZmVyZW5jZSh4LCBzdF91bmlvbih5KSkKfQojZGF0YSBzZXQgb2Ygd2F0ZXIgYm9kaWVzIGluIE5ZQwpNX3dhdGVyIDwtIGFyZWFfd2F0ZXIoIk5ZIiwgIk5ldyBZb3JrIiwgY2xhc3MgPSAic2YiKSAlPiUKICBzdF90cmFuc2Zvcm0oMjI2MykKI2NsaXBwaW5nIHRoZSByYXcgaW5jb21lIGRhdGFzZXQgYnkgdGhlIHdhdGVyIGJvdHRpZXMKTV9lcmFzZSA8LSBzdF9lcmFzZShyYXdfaW5jb21lXzIyNjMsIE1fd2F0ZXIpCmBgYAoKYGBge3IsIGVjaG89RkFMU0UsIG1lc3NhZ2U9Riwgd2FybmluZz1GfQojbWFwcGluZyB0aGUgImVyYXNlIiBkYXRhIHNldCB0aGF0IGlzIGNsaXBwZWQgYnkgdGhlIGZ1bmN0aW9uLCAKI2ZpbGwgPSBlc3RpbWF0ZSBvZiBtZWRpYW4gaG9pc2Vob2xkIGluY29tZQpnZ3Bsb3QoKSArIAogIGdlb21fc2YoZGF0YSA9IE1fZXJhc2UsIGFlcyhmaWxsID0gZXN0aW1hdGUpKSArIAogIHRoZW1lX3ZvaWQoKSArIAogIHNjYWxlX2ZpbGxfdmlyaWRpc19jKG5hbWUgPSAiTWVkaWFuIEhvc2Vob2xkIEluY29tZSAoJCkiLCBsYWJlbHMgPSBzY2FsZXM6OmRvbGxhcikgKwogIGdlb21fc2YoZGF0YSA9IG1hbmhhdHRhbl9jbGVhbmVkX3NocCwgc2l6ZSA9IC41LCBhbHBoYSA9IC4yNSkgKwogIGxhYnMoCiAgICB0aXRsZSA9ICJNYW5oYXR0YW4gTWVkaWFuIEhvdXNlaG9sZCBJbmNvbWUgYnkgQ2VuY3VzIFRyYWN0IiwKICAgIHN1YnRpdGxlID0gIihvdmVybGF5ZWQgd2l0aCBjbGVhbmVkIGdyYWZmaXRpIGluY2lkZW50cykiLAogICAgY2FwdGlvbiA9ICJTb3VyY2U6IEFDUyAyMDE5IHwgR3JhZmZpdHRpOiBOWUMgT3BlbkRhdGEiCiAgKQoKYGBgCgpgYGB7ciwgZWNobz1GQUxTRSwgbWVzc2FnZT1GLCB3YXJuaW5nPUZ9CiNkYXRhIHRhYmxlIGJhc2VkIG9uIGFjczIwMTkgb2YgTWFuaGF0dGFuIG1oaQptYW5oYXR0YW5fbWhpX3NocCA8LSBNX2VyYXNlICU+JQogICNnZXR0aW5nIHJpZCBvZiBleHRyYSBpbmZvCiAgbXV0YXRlX2F0KCJOQU1FIiwgc3RyX3JlcGxhY2UsICJDZW5zdXMgVHJhY3QgIiwgIiIpICU+JQogIG11dGF0ZV9hdCgiTkFNRSIsIHN0cl9yZXBsYWNlLCAiLCBOZXcgWW9yayBDb3VudHksIE5ldyBZb3JrIiwgIiIpICU+JQogICNzdGlsbCB1bnN1cmUgaWYgdGhpcyBzaG91bGQgYmUgbnVtZXJpYy4uLgogICNtdXRhdGUoQ0VOU1VTX1RSQSA9IGFzLm51bWVyaWMoTkFNRSkpICU+JQogIHJlbmFtZSh0b3RhbF9taGkgPSBlc3RpbWF0ZSwKICAgICAgICAgdG90YWxfbW9lID0gbW9lLAogICAgICAgICBDRU5TVVNfVFJBID0gTkFNRSkKI2Ryb3BwaW5nIGdlb21ldHJ5IGZyb20gYWNzMjAxOSBkYXRhCm1hbmhhdHRhbl9taGkgPC0gc3RfZHJvcF9nZW9tZXRyeShtYW5oYXR0YW5fbWhpX3NocCkKYGBgCgpgYGB7ciwgZWNobz1GQUxTRSwgbWVzc2FnZT1GLCB3YXJuaW5nPUYsIGZpZy53aWR0aD0xMCxmaWcuaGVpZ2h0PTExfQojdGFibGUgZm9yIGF2ZXJhZ2UgbGVuZ3RoIG9mIGNsZWFuaW5nIGJ5IE5UQQpkYXRlc19hdmVfTlRBX00gPC0gZGF0ZXNfTSAlPiUKICBncm91cF9ieShOVEEpICU+JQogIHN1bW1hcmlzZShhdmdfZGF0ZV9kaWZmX05UQSA9IG1lYW4oZGF0ZV9kaWZmLCBuYS5ybSA9IFRSVUUpKQojZHJvcHBpbmcgZ2VvbWV0cnkgZnJvbSBieXRlcyBvZiB0aGUgYmlnIGFwcGxlIGRhdGEKTV9jZW5zdXNfZGF0YSA8LSBzdF9kcm9wX2dlb21ldHJ5KE1fY2Vuc3VzX2RhdGFfc2hwKSAjTlRBIG5hbWVzCiNjcmVhdGluZyBhIGRhdGEgdGFibGUgdG8gaGF2ZSBOVEEgbmFtZSBhbmQgbWhpIG9uIHNhbWUgdGFibGUKTV9jb21waWxlZF9jZW5zdXNfZGF0YSA8LSBtYW5oYXR0YW5fbWhpICU+JQogIHJpZ2h0X2pvaW4oTV9jZW5zdXNfZGF0YSwgYnkgPSBjKCJDRU5TVVNfVFJBIiA9ICJDVExhYmVsIikpICU+JQogIGdyb3VwX2J5KE5UQU5hbWUpICU+JQogICNOVEFfYXZlX21oaSA9IGF2ZXJhZ2UgTUhJIGJ5IE5UQQogIG11dGF0ZShOVEFfYXZlX21oaSA9IG1lYW4odG90YWxfbWhpLCBuYS5ybSA9IFRSVUUpKSAlPiUKICByaWdodF9qb2luKGRhdGVzX2F2ZV9OVEFfTSwgYnkgPSBjKCJOVEFOYW1lIiA9ICJOVEEiKSkgJT4lCiAgc2VsZWN0KENFTlNVU19UUkEsIHRvdGFsX21oaSwgTlRBQ29kZSwgTlRBTmFtZSwgTlRBX2F2ZV9taGksIGF2Z19kYXRlX2RpZmZfTlRBKQoKI2F0dGVtcHRpbmcgYSBzcGF0aWFsIGpvaW4KZGF0ZXNfYXZlX05UQV9NX3NocCA8LSBkYXRlc19NX3NocCAlPiUKICBncm91cF9ieShOVEEpICU+JQogIHN1bW1hcmlzZShhdmdfZGF0ZV9kaWZmX05UQSA9IHJvdW5kKG1lYW4oZGF0ZV9kaWZmLCBuYS5ybSA9IFRSVUUpLCAyKSkKCiNjaGVja2luZyBlYWNoIG9mIHRoZSBwcm9qZWN0aW9ucwojIHN0X2NycyhkYXRlc19hdmVfTlRBX01fc2hwKSAjMjI2MwojIHN0X2NycyhNX2NlbnN1c19kYXRhX3NocCkgIzIyNjMKIyBzdF9jcnMobWFuaGF0dGFuX21oaV9zaHApICMyMjYzCgojSnVzdCBnZW9tZXRyeSBhbmQgb3V0bGluZSBvZiBOVEFzCm50YV9vdXRsaW5lIDwtIE1fY2Vuc3VzX2RhdGFfc2hwICU+JQogIGdyb3VwX2J5KE5UQU5hbWUpICU+JQogIHN1bW1hcmlzZShjb3VudD1uKCkpICU+JQogIHNlbGVjdChOVEFOYW1lKQojdGVzdGluZyB0byBzZWUgaWYgdGhlIG1hcCBvdXRsaW5lIHdvcmtlZAojIGdncGxvdCgpICsKIyAgIGdlb21fc2YoZGF0YSA9IG50YV9vdXRsaW5lLCBjb2xvciA9ICJibGFjayIsIGZpbGwgPSBOQSkgKwojICAgdGhlbWVfdm9pZCgpCgojMTY2NyBkYXRhIHBvaW50cywgam9pbmluZyBhY3MgdGFibGUgd2l0aCBieXRlcyBvZiB0aGUgYmlnIGFwcGxlIGFuZCB0aGVuIGdyYWZmaXRpIGxvb2tzIHRoZSBzYW1lIGFzIHRoZSBvbmUgYmVsb3cgYnV0IGEgbGl0dGxlIGJldHRlcj8KI3doZW4gbWFwcGluZywgZGl2aWRlZCBieSBDVAptYW5oYXR0YW5fc2hwX21oaV9udGEgPC0gbWFuaGF0dGFuX21oaV9zaHAgJT4lCiAgc3Rfam9pbihNX2NlbnN1c19kYXRhX3NocCwgam9pbiA9IHN0X2ludGVyc2VjdHMpICU+JQogIGdyb3VwX2J5KE5UQU5hbWUpICU+JQogICNOVEFfYXZlX21oaSA9IGF2ZXJhZ2UgTUhJIGJ5IE5UQQogIG11dGF0ZShOVEFfYXZlX21oaSA9IG1lYW4odG90YWxfbWhpLCBuYS5ybSA9IFRSVUUpKSAlPiUKICBzdF9qb2luKGRhdGVzX2F2ZV9OVEFfTV9zaHAsIGpvaW4gPSBzdF9pbnRlcnNlY3RzKSAlPiUKICBzZWxlY3QoQ0VOU1VTX1RSQSwgdG90YWxfbWhpLCBOVEFDb2RlLCBOVEFOYW1lLCBOVEFfYXZlX21oaSwgYXZnX2RhdGVfZGlmZl9OVEEsIGdlb21ldHJ5KQoKIzY4NCBkYXRhIHBvaW50cywgam9pbmluZyBvdXRsaW5lKGJ5dGVzIG9mIGJpZyBhcHBsZSkgd2l0aCBhY3MgdGhlbiBncmFmZml0aQojd2hlbiBtYXBwaW5nLCBkaXZpZGVkIGJ5IE5UQQpNX05UQV9NSElfREFfc2hwIDwtIG50YV9vdXRsaW5lICU+JQogIHN0X2pvaW4obWFuaGF0dGFuX21oaV9zaHAsIGpvaW4gPSBzdF9pbnRlcnNlY3RzKSAlPiUKICBncm91cF9ieShOVEFOYW1lKSAlPiUKICBtdXRhdGUoTlRBX21oaSA9IHJvdW5kKG1lYW4odG90YWxfbWhpLCBuYS5ybSA9IFRSVUUpLCAyKSkgJT4lCiAgc3Rfam9pbihkYXRlc19hdmVfTlRBX01fc2hwLCBqb2luID0gc3RfaW50ZXJzZWN0cykKCiMgI3N0X2NycyhNX05UQV9NSElfREFfc2hwKSAjMjI2MwojIApyZWFsX2dyYWZmaXRpX01fc2hwIDwtIGdyYWZmaXRpX3Jhd19zaHAgJT4lCiAgZmlsdGVyKFJFU09MVVRJT04gIT0gJ0NsZWFuaW5nIGNyZXcgZGlzcGF0Y2hlZC4gTm8gZ3JhZmZpdGkgb24gcHJvcGVydHkuJykgJT4lCiAgZmlsdGVyKFJFU09MVVRJT04gIT0gJ01haWwgcmV0dXJuZWQgLyB3cm9uZyBhZGRyZXNzJykgJT4lCiAgZmlsdGVyKFJFU09MVVRJT04gIT0gJ0NsZWFuaW5nIGNyZXcgZGlzcGF0Y2hlZC4gIENhbm5vdCBsb2NhdGUgcHJvcGVydHkuJykgJT4lCiAgZmlsdGVyKEJPUk9VR0ggPT0gJ01BTkhBVFRBTicpCiNzdF9jcnMocmVhbF9ncmFmZml0aV9NX3NocCkKCmNfZF9NX2dyYWZmaXRpIDwtIHJlYWxfZ3JhZmZpdGlfTV9zaHAgJT4lCiAgbXV0YXRlKGNsZWFuZWQgPSBpZl9lbHNlKFNUQVRVUyA9PSAiQ2xvc2VkIiwgInllcyIsICJubyIpKSAlPiUKICBzZWxlY3QoSU5DSURFTlRfQSwgU1RBVFVTLCBOVEEsIGNsZWFuZWQsIGdlb21ldHJ5KQoKTV9OVEFfTUhJX0RBX3NocCA9IHNmOjpzdF9jYXN0KE1fTlRBX01ISV9EQV9zaHAsICJNVUxUSVBPTFlHT04iKQpOVEFfbWhpX3Bsb3QgPC0gZ2dwbG90KCkgKwogIGdlb21fc2YoZGF0YSA9IE1fTlRBX01ISV9EQV9zaHAsIGFlcyhmaWxsID0gTlRBX21oaSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dCA9IHBhc3RlKCJOVEEgTmFtZTogIiwgTlRBTmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8YnI+TUhJOiAiLCBOVEFfbWhpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxicj5BdmVyYWdlIExlbmd0aCBvZiBDbGVhbmluZzogIiwgYXZnX2RhdGVfZGlmZl9OVEEpKSkgKwogIHRoZW1lX3ZvaWQoKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzX2MobmFtZSA9ICJNZWRpYW4gSG9zZWhvbGQgSW5jb21lICgkKSIsIGxhYmVscyA9IHNjYWxlczo6ZG9sbGFyKSArCiAgZ2VvbV9zZihkYXRhID0gY19kX01fZ3JhZmZpdGksIGFlcyhjb2xvciA9IGNsZWFuZWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHBoYSA9IC4yNSksIHNob3cubGVnZW5kID0gRkFMU0UpICsKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYygneWVzJyA9ICdibGFjaycsICdubycgPSAnZ3JleTc3JyksIG5hbWUgPSAiR3JhZmZpdGkgQ2xlYW5lZD8iKSArCiAgbGFicygKICAgIHRpdGxlID0gIk1hbmhhdHRhbiBNZWRpYW4gSG91c2Vob2xkIEluY29tZSAoTUhJKQogICAgYnkgTmVpZ2Jvcmhvb2QgVGFidWxhdGlvbiBBcmVhIChOVEEpIiwKICAgIHN1YnRpdGxlID0gIihvdmVybGF5ZWQgd2l0aCByZXBvcnRlZCBncmFmZml0aSBpbmNpZGVudHMpIiwKICAgIGNhcHRpb24gPSAiU291cmNlOiBBQ1MgMjAxOSB8IEdyYWZmaXR0aTogTllDIE9wZW5EYXRhIikKCk5UQV9taGlfcGxvdAojICNnZ3Bsb3RseShOVEFfbWhpX3Bsb3QsIHRvb2x0aXAgPSAidGV4dCIpCgoKYGBgCgpgYGB7ciwgZWNobz1GQUxTRSwgbWVzc2FnZT1GLCB3YXJuaW5nPUYsIGZpZy53aWR0aD0xMCxmaWcuaGVpZ2h0PTExfQojIGFjczEwIDwtIGxvYWRfdmFyaWFibGVzKDIwMTAsICJhY3M1IikKIyAKIyAjaW1wb3J0aW5nIDIwMTkgYWNzIGRhdGEgZm9yIE1hbmhhdHRhbiAKIyAjQjE5MDEzXzAwMSAtIEVzdGltYXRlISFNZWRpYW4gaG91c2Vob2xkIGluY29tZSBpbiB0aGUgcGFzdCAxMiBtb250aHMgKGluIDIwMTkgaW5mbGF0aW9uLWFkanVzdGVkIGRvbGxhcnMpCiMgcmF3X2luY29tZSA8LSBnZXRfYWNzKGdlb2dyYXBoeSA9ICJ0cmFjdCIsIAojICAgICAgICAgICAgICAgdmFyaWFibGVzID0gIkIxOTAxM18wMDEiLCAKIyAgICAgICAgICAgICAgIHN0YXRlID0gIk5ZIiwgCiMgICAgICAgICAgICAgICBjb3VudHkgPSAiTmV3IFlvcmsiLCAKIyAgICAgICAgICAgICAgIGdlb21ldHJ5ID0gVFJVRSwKIyAgICAgICAgICAgICAgIHllYXIgPSAyMDEwLAojICAgICAgICAgICAgICAgY2IgPSBGQUxTRSkKIyAKIyAjY2hlY2tpbmcgdGhlIHByb2plY3Rpb24gb2YgdGhlIGNlbnN1cyBkYXRhIGZyYW1lCiMgI3N0X2NycyhyYXdfaW5jb21lKSAjNDI2OQojICNjaGFuZ2luZyB0aGUgcHJvamVjdGlvbiBvZiB0aGUgY2Vuc3VzIGRhdGEgZnJhbWUKIyByYXdfaW5jb21lXzEwXzIyNjMgPC0gcmF3X2luY29tZSAlPiUgCiMgICBzdF90cmFuc2Zvcm0oMjI2MykKIyAKIyBkYXRhZnJhbWVfc2hwIDwtIHJhd19pbmNvbWVfMTBfMjI2MyAlPiUgI2FjcwojICAgc3Rfam9pbihNX2NlbnN1c19kYXRhX3NocCwgam9pbiA9IHN0X2ludGVyc2VjdHMpICU+JSAjQk9UQkEvMjAxMAojICAgc3Rfam9pbihyZWFsX2dyYWZmaXRpX3NocCwgam9pbiA9IHN0X2ludGVyc2VjdHMpICNOWUNECiMgCiMgZGF0YWZyYW1lIDwtIGRhdGFmcmFtZV9zaHAgJT4lCiMgICByZW5hbWUoQ1RfYWNzID0gTkFNRSwKIyAgICAgICAgICBDVF8yMDEwID0gQ1RMYWJlbCwKIyAgICAgICAgICBtaGkgPSBlc3RpbWF0ZSwKIyAgICAgICAgICBDVF9OWUNEID0gQ0VOU1VTX1RSQSkgJT4lCiMgICBmaWx0ZXIoQk9ST1VHSCA9PSAnTUFOSEFUVEFOJykgJT4lCiMgICBzZWxlY3QoQ1RfYWNzLCBDVF9OWUNELCBDVF8yMDEwLCBOVEFOYW1lLCBJTkNJREVOVF9BLCBDUkVBVEVEX0RBLCBDTE9TRURfREFULCBSRVNPTFVUSU9OLCBTVEFUVVMsIG1oaSkgJT4lCiMgICBtdXRhdGUoZGF0ZV9kaWZmID0gZGlmZnRpbWUoKGFzLkRhdGUoQ1JFQVRFRF9EQSwgIiVtLyVkLyV5IikpLCAKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhcy5EYXRlKENMT1NFRF9EQVQsICIlbS8lZC8leSIpKSwgdW5pdHMgPSAnZGF5cycpKSAlPiUKIyAgICNyZW1vdmluZyB0aGUgd29yZCAnZGF0ZXMnIGZyb20gdGhlIGNvbAojICAgbXV0YXRlX2F0KCJkYXRlX2RpZmYiLCBzdHJfcmVwbGFjZSwgImRheXMiLCAiIikgJT4lCiMgICBtdXRhdGUoZGF0ZV9kaWZmID0gYXMubnVtZXJpYyhkYXRlX2RpZmYpKSAlPiUKIyAgIG11dGF0ZShkYXRlX2RpZmYgPSBpZl9lbHNlKGRhdGVfZGlmZiA+IDEsIChkYXRlX2RpZmYgLSAzNjUpLCBkYXRlX2RpZmYpKSAlPiUKIyAgIG11dGF0ZShkYXRlX2RpZmYgPSBkYXRlX2RpZmYgKiAoLTEpKSAlPiUKIyAgIGdyb3VwX2J5KE5UQU5hbWUpICU+JQojICAgbXV0YXRlKE5UQV9taGkgPSByb3VuZChtZWFuKG1oaSwgbmEucm0gPSBUUlVFKSwgMikpICU+JQojICAgbXV0YXRlKGF2Z19kYXRlX2RpZmZfTlRBID0gbWVhbihkYXRlX2RpZmYsIG5hLnJtID0gVFJVRSkpICU+JQojICAgbXV0YXRlKGNsZWFuZWQgPSBpZl9lbHNlKFNUQVRVUyA9PSAiQ2xvc2VkIiwgInllcyIsICJubyIpKQojIAojIGRhdGFmcmFtZSA9IHNmOjpzdF9jYXN0KGRhdGFmcmFtZSwgIk1VTFRJUE9MWUdPTiIpCiMgZGF0YWZyYW1lX3Bsb3QgPC0gZ2dwbG90KCkgKyAKIyAgIGdlb21fc2YoZGF0YSA9IGRhdGFmcmFtZSwgYWVzKGZpbGwgPSBOVEFfbWhpLCBuYS5ybSA9IFRSVUUsCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dCA9IHBhc3RlKCJOVEEgTmFtZTogIiwgTlRBTmFtZSwKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxicj5NSEk6ICIsIE5UQV9taGksCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8YnI+QXZlcmFnZSBMZW5ndGggb2YgQ2xlYW5pbmc6ICIsIGF2Z19kYXRlX2RpZmZfTlRBKSkpICsgCiMgICB0aGVtZV92b2lkKCkgKyAKIyAgIHNjYWxlX2ZpbGxfdmlyaWRpc19jKG5hbWUgPSAiTWVkaWFuIEhvc2Vob2xkIEluY29tZSAoJCkiLCBsYWJlbHMgPSBzY2FsZXM6OmRvbGxhciwgbmEudmFsdWUgPSAidHJhbnNwYXJlbnQiKSArCiMgICBnZW9tX3NmKGRhdGEgPSBjX2RfTV9ncmFmZml0aSwgYWVzKGNvbG9yID0gY2xlYW5lZCwKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGEgPSAuMjUpLCBzaG93LmxlZ2VuZCA9IEZBTFNFKSArCiMgICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYygneWVzJyA9ICdibGFjaycsICdubycgPSAnZ3JleTc3JyksIG5hbWUgPSAiR3JhZmZpdGkgQ2xlYW5lZD8iKSArCiMgICBsYWJzKAojICAgICB0aXRsZSA9ICJNYW5oYXR0YW4gTWVkaWFuIEhvdXNlaG9sZCBJbmNvbWUgKE1ISSkgCiMgICAgIGJ5IE5laWdib3Job29kIFRhYnVsYXRpb24gQXJlYSAoTlRBKSIsCiMgICAgIHN1YnRpdGxlID0gIihvdmVybGF5ZWQgd2l0aCByZXBvcnRlZCBncmFmZml0aSBpbmNpZGVudHMpIiwKIyAgICAgY2FwdGlvbiA9ICJTb3VyY2U6IEFDUyAyMDE5IHwgR3JhZmZpdHRpOiBOWUMgT3BlbkRhdGEiKQojIAojIGRhdGFmcmFtZV9wbG90CiNnZ3Bsb3RseShkYXRhZnJhbWVfcGxvdCwgdG9vbHRpcCA9ICJ0ZXh0IikKCiAgCmBgYAoKCmBgYHtyLCBlY2hvPUZBTFNFLCBtZXNzYWdlPUYsIHdhcm5pbmc9Rn0KIyBNX05UQV9NSElfREFfc2hwID0gc2Y6OnN0X2Nhc3QoTV9OVEFfTUhJX0RBX3NocCwgIk1VTFRJUE9MWUdPTiIpCiMgTlRBX21oaV9wbG90IDwtIGdncGxvdCgpICsKIyAgIGdlb21fc2YoZGF0YSA9IE1fTlRBX01ISV9EQV9zaHAsIGFlcyhmaWxsID0gTlRBX21oaSwKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0ID0gcGFzdGUoIk5UQSBOYW1lOiAiLCBOVEFOYW1lLAojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPGJyPk1ISTogIiwgTlRBX21oaSwKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxicj5BdmVyYWdlIExlbmd0aCBvZiBDbGVhbmluZzogIiwgYXZnX2RhdGVfZGlmZl9OVEEpKSkgKwojICAgdGhlbWVfdm9pZCgpICsKIyAgIHNjYWxlX2ZpbGxfdmlyaWRpc19jKG5hbWUgPSAiTWVkaWFuIEhvc2Vob2xkIEluY29tZSAoJCkiLCBsYWJlbHMgPSBzY2FsZXM6OmRvbGxhcikgKwojICAgZ2VvbV9zZihkYXRhID0gcmVhbF9ncmFmZml0aV9NX3NocCwgc2l6ZSA9IC41LCBhbHBoYSA9IC41LCBjb2xvciA9ICJibGFjayIpICsKIyAgIGxhYnMoCiMgICAgIHRpdGxlID0gIk1hbmhhdHRhbiBNZWRpYW4gSG91c2Vob2xkIEluY29tZSAoTUhJKQojICAgICBieSBOZWlnYm9yaG9vZCBUYWJ1bGF0aW9uIEFyZWEgKE5UQSkiLAojICAgICBzdWJ0aXRsZSA9ICIob3ZlcmxheWVkIHdpdGggcmVwb3J0ZWQgZ3JhZmZpdGkgaW5jaWRlbnRzKSIsCiMgICAgIGNhcHRpb24gPSAiU291cmNlOiBBQ1MgMjAxOSB8IEdyYWZmaXR0aTogTllDIE9wZW5EYXRhIikKIyAKIyBOVEFfbWhpX3Bsb3QKI2dncGxvdGx5KE5UQV9taGlfcGxvdCwgdG9vbHRpcCA9ICJ0ZXh0IikKYGBgCgoKYGBge3Igc2V0dXAzLCBpbmNsdWRlPUZBTFNFfQojd29ya2luZyBvbiBnZXR0aW5nIGEgY291bnQgb2YgaW5jaWRlbnRzIHBlciBOVEEKCgojY291bnQgcGVyIE5UQSBhcmVhCmNvdW50X3Blcl9udGFfc2hwIDwtcmVhbF9ncmFmZml0aV9NX3NocCAlPiUKICBncm91cF9ieShOVEEpICU+JQogIHN1bW1hcmlzZShjb3VudD1uKCkpCgojcHJvYmFibHkgY2xpcHBlZCBieSBOVEEKbWFuaGF0dGFuX2JpZzFfc2hwIDwtIE1fTlRBX01ISV9EQV9zaHAgJT4lCiAgc3Rfam9pbihjb3VudF9wZXJfbnRhX3NocCwgam9pbiA9IHN0X2ludGVyc2VjdHMpICU+JQogIG11dGF0ZShjb3VudCA9IGFzLm51bWVyaWMoY291bnQsIG5hLnJtID0gVFJVRSkpCiNwcm9iYWJseSBjbGlwcGVkIGJ5IENUCm1hbmhhdHRhbl9iaWcyX3NocCA8LSBtYW5oYXR0YW5fc2hwX21oaV9udGEgJT4lCiAgc3Rfam9pbihjb3VudF9wZXJfbnRhX3NocCwgam9pbiA9IHN0X2ludGVyc2VjdHMpCgojZHJvcHBpbmcgZ2VvbWV0cnkgdG8gZG8gdGFibGUgam9pbnMKTV9OVEFfTUhJX0RBIDwtIHN0X2Ryb3BfZ2VvbWV0cnkoTV9OVEFfTUhJX0RBX3NocCkKY291bnRfcGVyX250YSA8LSBzdF9kcm9wX2dlb21ldHJ5KGNvdW50X3Blcl9udGFfc2hwKSAlPiUKICBmaWx0ZXIoTlRBICE9ICJOQSIpCiNtYWtpbmcgZGF0YXRhYmxlcyB3L28gc2hhcGUgdG8gZG8gbWF0aAojcHJvYmFibHkgY2xpcHBlZCBieSBOVEEKbWFuaGF0dGFuX2JpZzEgPC0gTV9OVEFfTUhJX0RBICU+JQogIHJpZ2h0X2pvaW4oY291bnRfcGVyX250YSwgYnkgPSAiTlRBIikKI3Byb2JhYmx5IGNsaXBwZWQgYnkgQ1QKbWFuaGF0dGFuX2JpZzIgPC0gTV9jb21waWxlZF9jZW5zdXNfZGF0YSAlPiUKICByaWdodF9qb2luKGNvdW50X3Blcl9udGEsIGJ5ID0gYygiTlRBTmFtZSIgPSAiTlRBIikpCgojd29ya2luZyBvbiBhIG1hcCB3IHRvb2wgdGlwIHRvIHNob3cgY291bnQKIyBudGFfbWhpX3Bsb3QxIDwtIGdncGxvdCgpICsKIyAgIGdlb21fc2YoZGF0YSA9IG1hbmhhdHRhbl9iaWcxX3NocCwgYWVzKGZpbGwgPSBOVEFfbWhpLCB0ZXh0ID0gcGFzdGUoIk51bWJlciBvZiBJbmNpZGVudHM6ICIsIGNvdW50KSkpICsKIyAgIHRoZW1lX3ZvaWQoKSArCiMgICBzY2FsZV9maWxsX3ZpcmlkaXMobmFtZT0iTUhJIGJ5IE5UQSIsIGRpcmVjdGlvbj0tMSkKIyAKIyBnZ3Bsb3RseShudGFfbWhpX3Bsb3QxLCB0b29sdGlwID0gInRleHQiKQpgYGAKCmBgYHtyLCBlY2hvPUZBTFNFLCBtZXNzYWdlPUYsIHdhcm5pbmc9Rn0KbnRhX21oaV9wbG90MTwtZ2dwbG90KGRhdGE9Y291bnRfcGVyX250YSwgYWVzKHg9cmVvcmRlcihOVEEsY291bnQpLCB5PWNvdW50KSkgKwogIGdlb21fY29sKCkgKwogIHRoZW1lKGF4aXMudGV4dC54PWVsZW1lbnRfdGV4dChhbmdsZT03NSxoanVzdD0xLHZqdXN0PTEpKSArCiAgbGFicyh4ID0gIk5laWdib3Job29kIiwgeSA9ICJDb3VudCIsCiAgICAgICB0aXRsZSA9ICJDb3VudCBvZiBHcmFmZml0aSBJbmNpZGVudHMiLAogICAgICAgc3VidGl0bGUgPSAiUmVwb3J0ZWQgYnkgTlRBIGluIE1hbmhhdHRhbiIsCiAgICAgICBjYXB0aW9uID0gIlNvdXJjZTogQnl0ZXMgb2YgdGhlIEJpZyBBcHBsZSB8IE5ZQyBPcGVuRGF0YSIpCm50YV9taGlfcGxvdDEKCm50YV9taGlfcGxvdDI8LWdncGxvdChkYXRhPWNvdW50X3Blcl9udGEsIGFlcyh5PXJlb3JkZXIoTlRBLGNvdW50KSwgeD1jb3VudCkpICsKICBnZW9tX2NvbCgpICsKICB0aGVtZV9idygpICsKICBsYWJzKHggPSAiTmVpZ2Jvcmhvb2QiLCB5ID0gIkNvdW50IiwKICAgICAgIHRpdGxlID0gIkNvdW50IG9mIEdyYWZmaXRpIEluY2lkZW50cyIsCiAgICAgICBzdWJ0aXRsZSA9ICJSZXBvcnRlZCBieSBOVEEgaW4gTWFuaGF0dGFuIiwKICAgICAgIGNhcHRpb24gPSAiU291cmNlOiBCeXRlcyBvZiB0aGUgQmlnIEFwcGxlIHwgTllDIE9wZW5EYXRhIikKbnRhX21oaV9wbG90MgpgYGAKCmBgYHtyLCBlY2hvPUZBTFNFLCBtZXNzYWdlPUYsIHdhcm5pbmc9Rn0KZ2dwbG90KGRhdGEgPSBtYW5oYXR0YW5fYmlnMSkgKwogIGdlb21fY29sKG1hcHBpbmcgPSBhZXMoeCA9IE5UQU5hbWUsIHkgPSBjb3VudCksIGdyb3VwID0gMSkgKwogIGdlb21fY29sKG1hcHBpbmcgPSBhZXMoeCA9IE5UQU5hbWUsIHkgPSBOVEFfbWhpKSwgZ3JvdXAgPSAxKSsKICB0aGVtZShheGlzLnRleHQueD1lbGVtZW50X3RleHQoYW5nbGU9NzUsaGp1c3Q9MSx2anVzdD0xKSkKYGBgCgpgYGB7ciwgZWNobz1GQUxTRSwgbWVzc2FnZT1GLCB3YXJuaW5nPUZ9CmdncGxvdChkYXRhID0gbWFuaGF0dGFuX2JpZzEpICsKICBnZW9tX2JhcihtYXBwaW5nID0gYWVzKHggPSBjb3VudCwgZmlsbCA9IE5UQU5hbWUpKQpnZ3Bsb3QoZGF0YSA9IG1hbmhhdHRhbl9iaWcxKSArCiAgZ2VvbV9iYXIobWFwcGluZyA9IGFlcyh4ID0gTlRBTmFtZSwgZmlsbCA9IGF2Z19kYXRlX2RpZmZfTlRBKSkgKwogIHRoZW1lKGF4aXMudGV4dC54PWVsZW1lbnRfdGV4dChhbmdsZT03NSxoanVzdD0xLHZqdXN0PTEpKQpgYGAKCg==