forked from HeroxXd/Herox-BeastxScrap
-
Notifications
You must be signed in to change notification settings - Fork 1
/
main.py
3 lines (2 loc) · 54.7 KB
/
main.py
1
2
3
import base64
exec(base64.b64decode( b'ZnJvbSB0ZWxldGhvbi5zeW5jIGltcG9ydCBUZWxlZ3JhbUNsaWVudA0KZnJvbSB0ZWxldGhvbi50bC50eXBlcyBpbXBvcnQgSW5wdXRQZWVyQ2hhbm5lbA0KZnJvbSB0ZWxldGhvbi5lcnJvcnMucnBjZXJyb3JsaXN0IGltcG9ydCBQZWVyRmxvb2RFcnJvciwgVXNlclByaXZhY3lSZXN0cmljdGVkRXJyb3IsIFBob25lTnVtYmVyQmFubmVkRXJyb3IsIENoYXRBZG1pblJlcXVpcmVkRXJyb3INCmZyb20gdGVsZXRob24uZXJyb3JzLnJwY2Vycm9ybGlzdCBpbXBvcnQgQ2hhdFdyaXRlRm9yYmlkZGVuRXJyb3IsIFVzZXJCYW5uZWRJbkNoYW5uZWxFcnJvciwgVXNlckFscmVhZHlQYXJ0aWNpcGFudEVycm9yLCBGbG9vZFdhaXRFcnJvcg0KZnJvbSB0ZWxldGhvbi50bC5mdW5jdGlvbnMuY2hhbm5lbHMgaW1wb3J0IEludml0ZVRvQ2hhbm5lbFJlcXVlc3QNCmZyb20gdGVsZXRob24udGwuZnVuY3Rpb25zLm1lc3NhZ2VzIGltcG9ydCBHZXREaWFsb2dzUmVxdWVzdA0KZnJvbSB0ZWxldGhvbi50bC5mdW5jdGlvbnMubWVzc2FnZXMgaW1wb3J0IFJlcG9ydFNwYW1SZXF1ZXN0DQpmcm9tIHRlbGV0aG9uLnRsLnR5cGVzIGltcG9ydCBJbnB1dFBlZXJFbXB0eQ0KZnJvbSB0ZWxldGhvbi50bC5mdW5jdGlvbnMuY2hhbm5lbHMgaW1wb3J0IExlYXZlQ2hhbm5lbFJlcXVlc3QNCmltcG9ydCBzeXMNCmZyb20gdGVsZXRob24udGwuZnVuY3Rpb25zLnBob3RvcyBpbXBvcnQgVXBsb2FkUHJvZmlsZVBob3RvUmVxdWVzdA0KZnJvbSB0ZWxldGhvbi50bC5mdW5jdGlvbnMubWVzc2FnZXMgaW1wb3J0IEltcG9ydENoYXRJbnZpdGVSZXF1ZXN0LCBBZGRDaGF0VXNlclJlcXVlc3QNCmZyb20gdGVsZXRob24udGwuZnVuY3Rpb25zLmNoYW5uZWxzIGltcG9ydCBKb2luQ2hhbm5lbFJlcXVlc3QNCmZyb20gdGVsZXRob24udGwudHlwZXMgaW1wb3J0IFVzZXJTdGF0dXNSZWNlbnRseQ0KaW1wb3J0IHRpbWUNCmltcG9ydCByYW5kb20NCmltcG9ydCBvcw0KaW1wb3J0IHBpY2tsZQ0KZnJvbSB0ZWxldGhvbi5zeW5jIGltcG9ydCBUZWxlZ3JhbUNsaWVudA0KZnJvbSB0ZWxldGhvbi5lcnJvcnMucnBjZXJyb3JsaXN0IGltcG9ydCBQaG9uZU51bWJlckJhbm5lZEVycm9yDQpmcm9tIGNvbG9yYW1hIGltcG9ydCBpbml0LCBGb3JlDQpmcm9tIHRpbWUgaW1wb3J0IHNsZWVwDQppbXBvcnQgY3N2DQpzY2FtID0gJ0Bub3Rvc2NhbScNCmluaXQoKQ0KDQpuID0gRm9yZS5SRVNFVA0KbGcgPSBGb3JlLkxJR0hUR1JFRU5fRVgNCnIgPSBGb3JlLlJFRA0KdyA9IEZvcmUuV0hJVEUNCmN5ID0gRm9yZS5DWUFODQp5ZSA9IEZvcmUuWUVMTE9XDQpjb2xvcnMgPSBbbGcsIHIsIHcsIGN5LCB5ZV0NCg0KdHJ5Og0KICAgIGltcG9ydCByZXF1ZXN0cw0KZXhjZXB0IEltcG9ydEVycm9yOg0KICAgIHByaW50KGYne2xnfVtpXSBJbnN0YWxsaW5nIG1vZHVsZSAtIHJlcXVlc3RzLi4ue259JykNCiAgICBvcy5zeXN0ZW0oJ3BpcCBpbnN0YWxsIHJlcXVlc3RzJykNCg0KZGVmIGJhbm5lcigpOg0KICAgIGltcG9ydCByYW5kb20NCiAgICAjIGZhbmN5IGxvZ28NCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgICANCiAgICBiPSBbDQoNCiAgICAgJ+KWiOKWiOKWiOKWiOKWiOKWiOKVlyDilojilojilojilojilojilojilojilZcg4paI4paI4paI4paI4paI4pWXIOKWiOKWiOKWiOKWiOKWiOKWiOKWiOKVl+KWiOKWiOKWiOKWiOKWiOKWiOKWiOKWiOKVlycsDQogICAgICfilojilojilZTilZDilZDilojilojilZfilojilojilZTilZDilZDilZDilZDilZ3ilojilojilZTilZDilZDilojilojilZfilojilojilZTilZDilZDilZDilZDilZ3ilZrilZDilZDilojilojilZTilZDilZDilZ0nLA0KICAgICAn4paI4paI4paI4paI4paI4paI4pWU4pWd4paI4paI4paI4paI4paI4pWXICDilojilojilojilojilojilojilojilZHilojilojilojilojilojilojilojilZcgICDilojilojilZEnLA0KICAgICAn4paI4paI4pWU4pWQ4pWQ4paI4paI4pWX4paI4paI4pWU4pWQ4pWQ4pWdICDilojilojilZTilZDilZDilojilojilZHilZrilZDilZDilZDilZDilojilojilZEgICDilojilojilZEnLA0KICAgICAn4paI4paI4paI4paI4paI4paI4pWU4pWd4paI4paI4paI4paI4paI4paI4paI4pWX4paI4paI4pWRICDilojilojilZHilojilojilojilojilojilojilojilZEgICDilojilojilZEnLA0KICAgICAn4pWa4pWQ4pWQ4pWQ4pWQ4pWQ4pWdIOKVmuKVkOKVkOKVkOKVkOKVkOKVkOKVneKVmuKVkOKVnSAg4pWa4pWQ4pWd4pWa4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWdICAg4pWa4pWQ4pWdJywNCg0KICAgICAgJ+KWiOKWiOKWiOKWiOKWiOKVlyDilojilojilojilojilojilojilZcg4paI4paI4paI4paI4paI4paI4pWXIOKWiOKWiOKWiOKWiOKWiOKWiOKWiOKVl+KWiOKWiOKWiOKWiOKWiOKWiOKVlycsDQogICAgICfilojilojilZTilZDilZDilojilojilZfilojilojilZTilZDilZDilojilojilZfilojilojilZTilZDilZDilojilojilZfilojilojilZTilZDilZDilZDilZDilZ3ilojilojilZTilZDilZDilojilojilZcgJywNCiAgICAgJ+KWiOKWiOKWiOKWiOKWiOKWiOKWiOKVkeKWiOKWiOKVkSAg4paI4paI4pWR4paI4paI4pWRICDilojilojilZHilojilojilojilojilojilZcgIOKWiOKWiOKWiOKWiOKWiOKWiOKVlOKVnScsDQogICAgICfilojilojilZTilZDilZDilojilojilZHilojilojilZEgIOKWiOKWiOKVkeKWiOKWiOKVkSAg4paI4paI4pWR4paI4paI4pWU4pWQ4pWQ4pWdICDilojilojilZTilZDilZDilojilojilZcnLA0KICAgICAn4paI4paI4pWRICDilojilojilZHilojilojilojilojilojilojilZTilZ3ilojilojilojilojilojilojilZTilZ3ilojilojilojilojilojilojilojilZfilojilojilZEgIOKWiOKWiOKVkScsDQogICAgICfilZrilZDilZ0gIOKVmuKVkOKVneKVmuKVkOKVkOKVkOKVkOKVkOKVnSDilZrilZDilZDilZDilZDilZDilZ0g4pWa4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWd4pWa4pWQ4pWdICDilZrilZDilZ0nDQoNCiAgICBdDQogICAgZm9yIGNoYXIgaW4gYjoNCiAgICAgICAgcHJpbnQoZid7Y2hhcn17d30nKQ0KICAgIHByaW50KGYne3J9IEF1dGhvcjogZ2l0aHViLmNvbS9tc3kxNzE3e3J9JykNCiAgICBwcmludChmJ3tyfSBEZXZlbG9wZXIgOiBAR29kbXJ1bmFse3J9JykNCg0KZGVmIGNscigpOg0KICAgIGlmIG9zLm5hbWUgPT0gJ250JzoNCiAgICAgICAgb3Muc3lzdGVtKCdjbHMnKQ0KICAgIGVsc2U6DQogICAgICAgIG9zLnN5c3RlbSgnY2xlYXInKQ0KDQp3aGlsZSBUcnVlOg0KICAgIGNscigpDQogICAgYmFubmVyKCkNCiAgICBwcmludCh5ZSsnQ2hvb3NlIGEgT3B0aW9uOicrbikNCiAgICBwcmludChjeSsnICAgICAgICAgICAgWzFdIEFkZCBuZXcgYWNjb3VudHMnK24pDQogICAgcHJpbnQoY3krJyAgICAgICAgICAgIFsyXSBGaWx0ZXIgYWxsIGJhbm5lZCBhY2NvdW50cycrbikNCiAgICBwcmludChjeSsnICAgICAgICAgICAgWzNdIFJlbW92ZSBzcGVjaWZpYyBhY2NvdW50cycrbikNCiAgICBwcmludChjeSsnICAgICAgICAgICAgWzRdIE1lbWJlciBBZGRpbmcnK24pDQogICAgcHJpbnQoeWUrJ1NwZWNpYWwgT3B0aW9uczonK24pDQogICAgcHJpbnQoY3krJyAgICAgICAgICAgIFs1XSBTY2FtIFRhZyBbU3BlY2lhbF0nK24pDQogICAgcHJpbnQoY3krJyAgICAgICAgICAgIFs2XSBCdWxrIE1lc3NhZ2UgU2VuZGVyW3NwZWNpYWxdJytuKQ0KICAgIHByaW50KGN5KycgICAgICAgICAgICBbN10gU2V0IFByb2ZpbGUgUGljICAnK24pDQogICAgcHJpbnQoY3krJyAgICAgICAgICAgIFs4XSBSZXBvcnQgU3BhbSBBIFVzZXInK24pDQogICAgcHJpbnQoeWUrJ0FkZGl0aW9uYWwgT3B0aW9uczonK24pDQogICAgcHJpbnQoY3krJyAgICAgICAgICAgIFs5XSAgU2VuZCBETSBbcG0gc3BhbV0nK24pDQogICAgcHJpbnQoY3krJyAgICAgICAgICAgIFsxMV0gam9pbiBjaGFubmVsL2dyb3VwICcrbikNCiAgICBwcmludChjeSsnICAgICAgICAgICAgWzEyXSBsZWF2ZSBjaGFubmVsL2dyb3VwJytuKQ0KICAgIHByaW50KGN5KycgICAgICAgICAgICBbMTNdIFVwZGF0ZSBTY3JpcHQnK24pDQoNCiAgICBwcmludChjeSsnICAgICAgICAgICAgWzBdICBFeGl0JytuKQ0KDQoNCg0KICAgIGEgPSBpbnQoaW5wdXQoJ1xuRW50ZXIgeW91ciBjaG9pY2U6ICcpKQ0KICAgIGlmIGEgPT0gMToNCiAgICAgICAgbmV3X2FjY3MgPSBbXQ0KICAgICAgICB3aXRoIG9wZW4oJ3ZhcnMudHh0JywgJ2FiJykgYXMgZzoNCiAgICAgICAgICAgIG51bWJlcl90b19hZGQgPSBpbnQoaW5wdXQoZidcbntsZ30gW35dIEVudGVyIG51bWJlciBvZiBhY2NvdW50cyB0byBhZGQ6IHtyfScpKQ0KICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2UobnVtYmVyX3RvX2FkZCk6DQogICAgICAgICAgICAgICAgcGhvbmVfbnVtYmVyID0gc3RyKGlucHV0KGYnXG57bGd9IFt+XSBFbnRlciBQaG9uZSBOdW1iZXI6IHtyfScpKQ0KICAgICAgICAgICAgICAgIHBhcnNlZF9udW1iZXIgPSAnJy5qb2luKHBob25lX251bWJlci5zcGxpdCgpKQ0KICAgICAgICAgICAgICAgIHBpY2tsZS5kdW1wKFtwYXJzZWRfbnVtYmVyXSwgZykNCiAgICAgICAgICAgICAgICBuZXdfYWNjcy5hcHBlbmQocGFyc2VkX251bWJlcikNCiAgICAgICAgICAgIHByaW50KGYnXG57bGd9IFtpXSBTYXZlZCBhbGwgYWNjb3VudHMgaW4gdmFycy50eHQnKQ0KICAgICAgICAgICAgY2xyKCkNCiAgICAgICAgICAgIHByaW50KGYnXG57bGd9IFsqXSBMb2dnaW5nIGluIGZyb20gbmV3IGFjY291bnRzXG4nKQ0KICAgICAgICAgICAgZm9yIG51bWJlciBpbiBuZXdfYWNjczoNCiAgICAgICAgICAgICAgICBjID0gVGVsZWdyYW1DbGllbnQoZidzZXNzaW9ucy97bnVtYmVyfScsIDgwMjcxOTYgLCAnOWI3MGIyMGVmZDY3ZTliOTllZGMzOTVkNzg0MDdjZmEnKQ0KICAgICAgICAgICAgICAgIGMuc3RhcnQobnVtYmVyKQ0KICAgICAgICAgICAgICAgIHByaW50KGYne2xnfVsrXSBMb2dpbiBzdWNjZXNzZnVsJykNCiAgICAgICAgICAgICAgICBjLmRpc2Nvbm5lY3QoKQ0KICAgICAgICAgICAgaW5wdXQoZidcbiBQcmVzcyBlbnRlciB0byBnb3RvIG1haW4gbWVudS4uLicpDQoNCiAgICAgICAgZy5jbG9zZSgpDQogICAgZWxpZiBhID09IDI6DQogICAgICAgIGFjY291bnRzID0gW10NCiAgICAgICAgYmFubmVkX2FjY3MgPSBbXQ0KICAgICAgICBoID0gb3BlbigndmFycy50eHQnLCAncmInKQ0KICAgICAgICB3aGlsZSBUcnVlOg0KICAgICAgICAgICAgdHJ5Og0KICAgICAgICAgICAgICAgIGFjY291bnRzLmFwcGVuZChwaWNrbGUubG9hZChoKSkNCiAgICAgICAgICAgIGV4Y2VwdCBFT0ZFcnJvcjoNCiAgICAgICAgICAgICAgICBicmVhaw0KICAgICAgICBoLmNsb3NlKCkNCiAgICAgICAgaWYgbGVuKGFjY291bnRzKSA9PSAwOg0KICAgICAgICAgICAgcHJpbnQocisnWyFdIFRoZXJlIGFyZSBubyBhY2NvdW50cyEgUGxlYXNlIGFkZCBzb21lIGFuZCByZXRyeScpDQogICAgICAgICAgICBzbGVlcCgzKQ0KICAgICAgICBlbHNlOg0KICAgICAgICAgICAgZm9yIGFjY291bnQgaW4gYWNjb3VudHM6DQogICAgICAgICAgICAgICAgcGhvbmUgPSBzdHIoYWNjb3VudFswXSkNCiAgICAgICAgICAgICAgICBjbGllbnQgPSBUZWxlZ3JhbUNsaWVudChmJ3Nlc3Npb25zL3twaG9uZX0nLCA4MDI3MTk2ICwgJzliNzBiMjBlZmQ2N2U5Yjk5ZWRjMzk1ZDc4NDA3Y2ZhJykNCiAgICAgICAgICAgICAgICBjbGllbnQuY29ubmVjdCgpDQogICAgICAgICAgICAgICAgaWYgbm90IGNsaWVudC5pc191c2VyX2F1dGhvcml6ZWQoKToNCiAgICAgICAgICAgICAgICAgICAgdHJ5Og0KICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50LnNlbmRfY29kZV9yZXF1ZXN0KHBob25lKQ0KICAgICAgICAgICAgICAgICAgICAgICAgI2NsaWVudC5zaWduX2luKHBob25lLCBpbnB1dCgnWytdIEVudGVyIHRoZSBjb2RlOiAnKSkNCiAgICAgICAgICAgICAgICAgICAgICAgIHByaW50KGYne2xnfVsrXSB7cGhvbmV9IGlzIG5vdCBiYW5uZWR7bn0nKQ0KICAgICAgICAgICAgICAgICAgICBleGNlcHQgUGhvbmVOdW1iZXJCYW5uZWRFcnJvcjoNCiAgICAgICAgICAgICAgICAgICAgICAgIHByaW50KHIrc3RyKHBob25lKSArICcgaXMgYmFubmVkIScrbikNCiAgICAgICAgICAgICAgICAgICAgICAgIGJhbm5lZF9hY2NzLmFwcGVuZChhY2NvdW50KQ0KICAgICAgICAgICAgaWYgbGVuKGJhbm5lZF9hY2NzKSA9PSAwOg0KICAgICAgICAgICAgICAgIHByaW50KGxnKydDb25ncmF0cyEgTm8gYmFubmVkIGFjY291bnRzJykNCiAgICAgICAgICAgICAgICBpbnB1dCgnXG5QcmVzcyBlbnRlciB0byBnb3RvIG1haW4gbWVudS4uLicpDQogICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgIGZvciBtIGluIGJhbm5lZF9hY2NzOg0KICAgICAgICAgICAgICAgICAgICBhY2NvdW50cy5yZW1vdmUobSkNCiAgICAgICAgICAgICAgICB3aXRoIG9wZW4oJ3ZhcnMudHh0JywgJ3diJykgYXMgazoNCiAgICAgICAgICAgICAgICAgICAgZm9yIGEgaW4gYWNjb3VudHM6DQogICAgICAgICAgICAgICAgICAgICAgICBQaG9uZSA9IGFbMF0NCiAgICAgICAgICAgICAgICAgICAgICAgIHBpY2tsZS5kdW1wKFtQaG9uZV0sIGspDQogICAgICAgICAgICAgICAgay5jbG9zZSgpDQogICAgICAgICAgICAgICAgcHJpbnQobGcrJ1tpXSBBbGwgYmFubmVkIGFjY291bnRzIHJlbW92ZWQnK24pDQogICAgICAgICAgICAgICAgaW5wdXQoJ1xuUHJlc3MgZW50ZXIgdG8gZ290byBtYWluIG1lbnUuLi4nKQ0KDQogICAgZWxpZiBhID09IDM6DQogICAgICAgIGFjY3MgPSBbXQ0KICAgICAgICBmID0gb3BlbigndmFycy50eHQnLCAncmInKQ0KICAgICAgICB3aGlsZSBUcnVlOg0KICAgICAgICAgICAgdHJ5Og0KICAgICAgICAgICAgICAgIGFjY3MuYXBwZW5kKHBpY2tsZS5sb2FkKGYpKQ0KICAgICAgICAgICAgZXhjZXB0IEVPRkVycm9yOg0KICAgICAgICAgICAgICAgIGJyZWFrDQogICAgICAgIGYuY2xvc2UoKQ0KICAgICAgICBpID0gMA0KICAgICAgICBwcmludChmJ3tsZ31baV0gQ2hvb3NlIGFuIGFjY291bnQgdG8gZGVsZXRlXG4nKQ0KICAgICAgICBmb3IgYWNjIGluIGFjY3M6DQogICAgICAgICAgICBwcmludChmJ3tsZ31be2l9XSB7YWNjWzBdfXtufScpDQogICAgICAgICAgICBpICs9IDENCiAgICAgICAgaW5kZXggPSBpbnQoaW5wdXQoZidcbntsZ31bK10gRW50ZXIgYSBjaG9pY2U6IHtufScpKQ0KICAgICAgICBwaG9uZSA9IHN0cihhY2NzW2luZGV4XVswXSkNCiAgICAgICAgc2Vzc2lvbl9maWxlID0gcGhvbmUgKyAnLnNlc3Npb24nDQogICAgICAgIGlmIG9zLm5hbWUgPT0gJ250JzoNCiAgICAgICAgICAgIG9zLnN5c3RlbShmJ2RlbCBzZXNzaW9uc1xce3Nlc3Npb25fZmlsZX0nKQ0KICAgICAgICBlbHNlOg0KICAgICAgICAgICAgb3Muc3lzdGVtKGYncm0gc2Vzc2lvbnMve3Nlc3Npb25fZmlsZX0nKQ0KICAgICAgICBkZWwgYWNjc1tpbmRleF0NCiAgICAgICAgZiA9IG9wZW4oJ3ZhcnMudHh0JywgJ3diJykNCiAgICAgICAgZm9yIGFjY291bnQgaW4gYWNjczoNCiAgICAgICAgICAgIHBpY2tsZS5kdW1wKGFjY291bnQsIGYpDQogICAgICAgIHByaW50KGYnXG57bGd9WytdIEFjY291bnQgRGVsZXRlZHtufScpDQogICAgICAgIGlucHV0KGYnXG5QcmVzcyBlbnRlciB0byBnb3RvIG1haW4gbWVudS4uLicpDQogICAgICAgIGYuY2xvc2UoKQ0KICAgIGVsaWYgYSA9PSA0Og0KICAgICAgICBhY2NvdW50cyA9IFtdDQogICAgICAgIGYgPSBvcGVuKCd2YXJzLnR4dCcsICdyYicpDQogICAgICAgIHdoaWxlIFRydWU6DQogICAgICAgICAgICB0cnk6DQogICAgICAgICAgICAgICAgYWNjb3VudHMuYXBwZW5kKHBpY2tsZS5sb2FkKGYpKQ0KICAgICAgICAgICAgZXhjZXB0IEVPRkVycm9yOg0KICAgICAgICAgICAgICAgIGJyZWFrDQoNCiAgICAgICAgDQogICAgICAgICNwcmludCgnXG4nICsgaW5mbyArIGxnICsgJyBDaGVja2luZyBmb3IgYmFubmVkIGFjY291bnRzLi4uJyArIHJzKQ0KICAgICAgICBwcmludCgnXG4nICcgQ2hlY2tpbmcgZm9yIGJhbm5lZCBhY2NvdW50cy4uLicgKQ0KICAgICAgICBmb3IgYSBpbiBhY2NvdW50czoNCiAgICAgICAgICAgIHBobiA9IGFbMF0NCiAgICAgICAgICAgIHByaW50KGYnQ2hlY2tpbmcge2xnfXtwaG59JykNCiAgICAgICAgICAgIGNsbnQgPSBUZWxlZ3JhbUNsaWVudChmJ3Nlc3Npb25zL3twaG59JywgODAyNzE5NiAsICc5YjcwYjIwZWZkNjdlOWI5OWVkYzM5NWQ3ODQwN2NmYScpDQogICAgICAgICAgICBjbG50LmNvbm5lY3QoKQ0KICAgICAgICAgICAgYmFubmVkID0gW10NCiAgICAgICAgICAgIGlmIG5vdCBjbG50LmlzX3VzZXJfYXV0aG9yaXplZCgpOg0KICAgICAgICAgICAgICAgIHRyeToNCiAgICAgICAgICAgICAgICAgICAgY2xudC5zZW5kX2NvZGVfcmVxdWVzdChwaG4pDQogICAgICAgICAgICAgICAgICAgIHByaW50KCdraycpDQogICAgICAgICAgICAgICAgZXhjZXB0IFBob25lTnVtYmVyQmFubmVkRXJyb3I6DQogICAgICAgICAgICAgICAgICAgIHByaW50KGYne3d9e3Bobn0ge3J9aXMgYmFubmVkIXtyc30nKQ0KICAgICAgICAgICAgICAgICAgICBiYW5uZWQuYXBwZW5kKGEpDQogICAgICAgICAgICBmb3IgeiBpbiBiYW5uZWQ6DQogICAgICAgICAgICAgICAgYWNjb3VudHMucmVtb3ZlKHopDQogICAgICAgICAgICAgICAgcHJpbnQoJ3tsZ31CYW5uZWQgYWNjb3VudCByZW1vdmVkW1JlbW92ZSBwZXJtYW5lbnRseSB1c2luZyBtYW5hZ2VyLnB5XXtyc30nKQ0KICAgICAgICAgICAgdGltZS5zbGVlcCgwLjUpDQogICAgICAgICAgICBjbG50LmRpc2Nvbm5lY3QoKQ0KICAgICAgICBwcmludCgnIFNlc3Npb25zIGNyZWF0ZWQhJykNCiAgICAgICAgY2xyKCkNCiAgICAgICAgYmFubmVyKCkNCiMgZnVuYyB0byBsb2cgc2NyYXBpbmcgZGV0YWlscyhsaW5rIG9mIHRoZSBncnAgdG8gc2NyYXBlDQojIGFuZCBjdXJyZW50IGluZGV4KSBpbiBvcmRlciB0byByZXN1bWUgbGF0ZXINCiAgICAgICAgZGVmIGxvZ19zdGF0dXMoc2NyYXBlZCwgaW5kZXgpOg0KICAgICAgICAgICAgd2l0aCBvcGVuKCdzdGF0dXMuZGF0JywgJ3diJykgYXMgZjoNCiAgICAgICAgICAgICAgICBwaWNrbGUuZHVtcChbc2NyYXBlZCwgaW50KGluZGV4KV0sIGYpDQogICAgICAgICAgICAgICAgZi5jbG9zZSgpDQogICAgICAgICAgICBwcmludChmJ3tsZ30gU2Vzc2lvbiBzdG9yZWQgaW4ge3d9c3RhdHVzLmRhdHtsZ30nKQ0KICAgIA0KDQogICAgICAgIGRlZiBleGl0X3dpbmRvdygpOg0KICAgICAgICAgICAgaW5wdXQoZidcbntjeX0gUHJlc3MgZW50ZXIgdG8gZXhpdC4uLicpDQogICAgICAgICAgICBjbHIoKQ0KICAgICAgICAgICAgYmFubmVyKCkNCiAgICAgICAgICAgIHN5cy5leGl0KCkNCiAgICAgICAgdHJ5Og0KICAgICAgICAgICAgd2l0aCBvcGVuKCdzdGF0dXMuZGF0JywgJ3JiJykgYXMgZjoNCiAgICAgICAgICAgICAgICBzdGF0dXMgPSBwaWNrbGUubG9hZChmKQ0KICAgICAgICAgICAgICAgIGYuY2xvc2UoKQ0KICAgICAgICAgICAgICAgIGxvbCA9IGlucHV0KGYne2N5fSBSZXN1bWUgc2NyYXBpbmcgbWVtYmVycyBmcm9tIHt3fXtzdGF0dXNbMF19e2xnfT8gW3kvbl06IHtyfScpDQogICAgICAgICAgICAgICAgaWYgJ3knIGluIGxvbDoNCiAgICAgICAgICAgICAgICAgICAgc2NyYXBlZF9ncnAgPSBzdGF0dXNbMF0gOyBpbmRleCA9IGludChzdGF0dXNbMV0pDQogICAgICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICAgICAgaWYgb3MubmFtZSA9PSAnbnQnOg0KICAgICAgICAgICAgICAgICAgICAgICAgb3Muc3lzdGVtKCdkZWwgc3RhdHVzLmRhdCcpDQogICAgICAgICAgICAgICAgICAgIGVsc2U6IA0KICAgICAgICAgICAgICAgICAgICAgICAgb3Muc3lzdGVtKCdybSBzdGF0dXMuZGF0JykNCiAgICAgICAgICAgICAgICAgICAgc2NyYXBlZF9ncnAgPSBpbnB1dChmJ3tjeX0gUHVibGljL1ByaXZhdGUgZ3JvdXAgbGluayB0byBzY3JhcGUgbWVtYmVyczoge3J9JykNCiAgICAgICAgICAgICAgICAgICAgaW5kZXggPSAwDQogICAgICAgIGV4Y2VwdDoNCiAgICAgICAgICAgIHNjcmFwZWRfZ3JwID0gaW5wdXQoZid7Y3l9IFB1YmxpYy9Qcml2YXRlIGdyb3VwIGxpbmsgdG8gc2NyYXBlIG1lbWJlcnM6IHtyfScpDQogICAgICAgICAgICBpbmRleCA9IDANCiMgbG9hZCBhbGwgdGhlIGFjY291bnRzKHBob25lbnVtYmVycykNCiAgICAgICAgYWNjb3VudHMgPSBbXQ0KICAgICAgICBmID0gb3BlbigndmFycy50eHQnLCAncmInKQ0KICAgICAgICB3aGlsZSBUcnVlOg0KICAgICAgICAgICAgdHJ5Og0KICAgICAgICAgICAgICAgIGFjY291bnRzLmFwcGVuZChwaWNrbGUubG9hZChmKSkNCiAgICAgICAgICAgIGV4Y2VwdCBFT0ZFcnJvcjoNCiAgICAgICAgICAgICAgICBicmVhaw0KDQogICAgICAgIHByaW50KGYne2xnfSBUb3RhbCBhY2NvdW50czoge3d9e2xlbihhY2NvdW50cyl9JykNCiAgICAgICAgbnVtYmVyX29mX2FjY3MgPSBpbnQoaW5wdXQoZid7Y3l9IEVudGVyIG51bWJlciBvZiBhY2NvdW50cyB0byB1c2U6IHtyfScpKQ0KICAgICAgICBwcmludChmJ3tjeX0gQ2hvb3NlIGFuIG9wdGlvbntsZ30nKQ0KICAgICAgICBwcmludChmJ3tjeX1bMF17bGd9IEFkZCB0byBwdWJsaWMgZ3JvdXAnKQ0KICAgICAgICBwcmludChmJ3tjeX1bMV17bGd9IEFkZCB0byBwcml2YXRlIGdyb3VwJykNCiAgICAgICAgY2hvaWNlID0gaW50KGlucHV0KGYne2N5fSBFbnRlciBjaG9pY2U6IHtyfScpKQ0KICAgICAgICBpZiBjaG9pY2UgPT0gMDoNCiAgICAgICAgICAgIHRhcmdldCA9IHN0cihpbnB1dChmJ3tjeX0gRW50ZXIgcHVibGljIGdyb3VwIGxpbms6IHtyfScpKQ0KICAgICAgICBlbHNlOg0KICAgICAgICAgICAgdGFyZ2V0ID0gc3RyKGlucHV0KGYne2N5fSBFbnRlciBwcml2YXRlIGdyb3VwIGxpbms6IHtyfScpKQ0KDQogICAgICAgIHByaW50KGYnXycqNTApDQogICAgICAgIHN0YXR1c19jaG9pY2UgPSBzdHIoaW5wdXQoZid7Y3l9IERvIHlvdSB3YW5uYSBhZGQgYWN0aXZlIG1lbWJlcnM/W3kvbl06IHtyfScpKQ0KICAgICAgICB0b191c2UgPSBbeCBmb3IgeCBpbiBhY2NvdW50c1s6bnVtYmVyX29mX2FjY3NdXQ0KICAgICAgICBmb3IgbCBpbiB0b191c2U6IGFjY291bnRzLnJlbW92ZShsKQ0KICAgICAgICB3aXRoIG9wZW4oJ3ZhcnMudHh0JywgJ3diJykgYXMgZjoNCiAgICAgICAgICAgIGZvciBhIGluIGFjY291bnRzOg0KICAgICAgICAgICAgICAgIHBpY2tsZS5kdW1wKGEsIGYpDQogICAgICAgICAgICBmb3IgYWIgaW4gdG9fdXNlOg0KICAgICAgICAgICAgICAgIHBpY2tsZS5kdW1wKGFiLCBmKQ0KICAgICAgICAgICAgZi5jbG9zZSgpDQogICAgICAgIHNsZWVwX3RpbWUgPSBpbnQoaW5wdXQoZid7Y3l9IEVudGVyIGRlbGF5IHRpbWUgcGVyIHJlcXVlc3R7d31be2xnfTAgZm9yIE5vbmV7d31dOiB7cn0nKSkNCiAgICAgICAgcHJpbnQoZid7bGd9IEpvaW5pbmcgZ3JvdXAgZnJvbSB7d317bnVtYmVyX29mX2FjY3N9IGFjY291bnRzLi4uJykNCiAgICAgICAgcHJpbnQoZictJyo1MCkNCiAgICAgICAgcHJpbnQoZid7bGd9IC0tIEFkZGluZyBtZW1iZXJzIGZyb20ge3d9e2xlbih0b191c2UpfXtsZ30gYWNjb3VudChzKSAtLScpDQogICAgICAgIGFkZGluZ19zdGF0dXMgPSAwDQogICAgICAgIGFwcHJveF9tZW1iZXJzX2NvdW50ID0gMA0KICAgICAgICBmb3IgYWNjIGluIHRvX3VzZToNCiAgICAgICAgICAgIHN0b3AgPSBpbmRleCArIDYwDQogICAgICAgICAgICBjID0gVGVsZWdyYW1DbGllbnQoZidzZXNzaW9ucy97YWNjWzBdfScsIDgwMjcxOTYgLCAnOWI3MGIyMGVmZDY3ZTliOTllZGMzOTVkNzg0MDdjZmEnKQ0KICAgICAgICAgICAgcHJpbnQoZicgVXNlcjoge2N5fXthY2NbMF19e2xnfSAtLSB7Y3l9U3RhcnRpbmcgc2Vzc2lvbi4uLiAnKQ0KICAgICAgICAgICAgYy5zdGFydChhY2NbMF0pDQogICAgICAgICAgICBhY2NfbmFtZSA9IGMuZ2V0X21lKCkuZmlyc3RfbmFtZQ0KICAgICAgICAgICAgdHJ5Og0KICAgICAgICAgICAgICAgIGlmICcvam9pbmNoYXQvJyBpbiBzY3JhcGVkX2dycDoNCiAgICAgICAgICAgICAgICAgICAgZ19oYXNoID0gc2NyYXBlZF9ncnAuc3BsaXQoJy9qb2luY2hhdC8nKVsxXQ0KDQogICAgICAgICAgICAgICAgICAgIHRyeToNCiAgICAgICAgICAgICAgICAgICAgICAgIGMoSW1wb3J0Q2hhdEludml0ZVJlcXVlc3QoZ19oYXNoKSkNCiAgICAgICAgICAgICAgICAgICAgICAgIHByaW50KGYnVXNlcjoge2N5fXthY2NfbmFtZX17bGd9IC0tIEpvaW5lZCBncm91cCB0byBzY3JhcGUnKQ0KICAgICAgICAgICAgICAgICAgICBleGNlcHQgVXNlckFscmVhZHlQYXJ0aWNpcGFudEVycm9yOg0KICAgICAgICAgICAgICAgICAgICAgICAgcGFzcyANCiAgICAgICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgICAgICBjKEpvaW5DaGFubmVsUmVxdWVzdChzY3JhcGVkX2dycCkpDQogICAgICAgICAgICAgICAgICAgIHByaW50KGYnVXNlcjoge2N5fXthY2NfbmFtZX17bGd9IC0tIEpvaW5lZCBncm91cCB0byBzY3JhcGUnKQ0KICAgICAgICAgICAgICAgIHNjcmFwZWRfZ3JwX2VudGl0eSA9IGMuZ2V0X2VudGl0eShzY3JhcGVkX2dycCkNCiAgICAgICAgICAgICAgICBpZiBjaG9pY2UgPT0gMDoNCiAgICAgICAgICAgICAgICAgICAgYyhKb2luQ2hhbm5lbFJlcXVlc3QodGFyZ2V0KSkNCiAgICAgICAgICAgICAgICAgICAgcHJpbnQoZidVc2VyOiB7Y3l9e2FjY19uYW1lfXtsZ30gLS0gSm9pbmVkIGdyb3VwIHRvIGFkZCcpDQogICAgICAgICAgICAgICAgICAgIHRhcmdldF9lbnRpdHkgPSBjLmdldF9lbnRpdHkodGFyZ2V0KQ0KICAgICAgICAgICAgICAgICAgICB0YXJnZXRfZGV0YWlscyA9IElucHV0UGVlckNoYW5uZWwodGFyZ2V0X2VudGl0eS5pZCwgdGFyZ2V0X2VudGl0eS5hY2Nlc3NfaGFzaCkNCiAgICAgICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgICAgICB0cnk6DQogICAgICAgICAgICAgICAgICAgICAgICBncnBfaGFzaCA9IHRhcmdldC5zcGxpdCgnL2pvaW5jaGF0LycpWzFdDQogICAgICAgICAgICAgICAgICAgICAgICBjKEltcG9ydENoYXRJbnZpdGVSZXF1ZXN0KGdycF9oYXNoKSkNCiAgICAgICAgICAgICAgICAgICAgICAgIHByaW50KGYnVXNlcjoge2N5fXthY2NfbmFtZX17bGd9IC0tIEpvaW5lZCBncm91cCB0byBhZGQnKQ0KICAgICAgICAgICAgICAgICAgICBleGNlcHQgVXNlckFscmVhZHlQYXJ0aWNpcGFudEVycm9yOg0KICAgICAgICAgICAgICAgICAgICAgICAgcGFzcw0KICAgICAgICAgICAgICAgICAgICB0YXJnZXRfZW50aXR5ID0gYy5nZXRfZW50aXR5KHRhcmdldCkNCiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0X2RldGFpbHMgPSB0YXJnZXRfZW50aXR5DQogICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6DQogICAgICAgICAgICAgICAgcHJpbnQoZidVc2VyOiB7Y3l9e2FjY19uYW1lfXtsZ30gLS0gRmFpbGVkIHRvIGpvaW4gZ3JvdXAnKQ0KICAgICAgICAgICAgICAgIHByaW50KGYne2V9JykNCiAgICAgICAgICAgICAgICBjb250aW51ZQ0KICAgICAgICAgICAgcHJpbnQoZicgVXNlcjoge2N5fXthY2NfbmFtZX17bGd9IC0tIHtjeX1SZXRyaWV2aW5nIGVudGl0aWVzLi4uJykNCiAgICAjYy5nZXRfZGlhbG9ncygpDQogICAgICAgICAgICB0cnk6DQogICAgICAgICAgICAgICAgbWVtYmVycyA9IFtdDQogICAgICAgICAgICAgICAgbWVtYmVycyA9IGMuZ2V0X3BhcnRpY2lwYW50cyhzY3JhcGVkX2dycF9lbnRpdHksYWdncmVzc2l2ZT1GYWxzZSkNCiAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZToNCiAgICAgICAgICAgICAgICBwcmludChmJyBDb3VsZG5cJ3Qgc2NyYXBlIG1lbWJlcnMnKQ0KICAgICAgICAgICAgICAgIHByaW50KGYne2V9JykNCiAgICAgICAgICAgICAgICBjb250aW51ZQ0KICAgICAgICAgICAgYXBwcm94X21lbWJlcnNfY291bnQgPSBsZW4obWVtYmVycykNCiAgICAgICAgICAgIGFzc2VydCBhcHByb3hfbWVtYmVyc19jb3VudCAhPSAwDQogICAgICAgICAgICBpZiBpbmRleCA+PSBhcHByb3hfbWVtYmVyc19jb3VudDoNCiAgICAgICAgICAgICAgICBwcmludChmJ3tsZ30gTm8gbWVtYmVycyB0byBhZGQhJykNCiAgICAgICAgICAgICAgICBjb250aW51ZQ0KICAgICAgICAgICAgcHJpbnQoZid7bGd9IFN0YXJ0OiB7d317aW5kZXh9JykNCiAgICAjYWRkaW5nX3N0YXR1cyA9IDANCiAgICAgICAgICAgIHBlZXJfZmxvb2Rfc3RhdHVzID0gMA0KICAgICAgICAgICAgZm9yIHVzZXIgaW4gbWVtYmVyc1tpbmRleDpzdG9wXToNCiAgICAgICAgICAgICAgICBpbmRleCArPSAxDQogICAgICAgICAgICAgICAgaWYgcGVlcl9mbG9vZF9zdGF0dXMgPT0gMTA6DQogICAgICAgICAgICAgICAgICAgIHByaW50KGYnVG9vIG1hbnkgUGVlciBGbG9vZCBFcnJvcnMhIENsb3Npbmcgc2Vzc2lvbi4uLicpDQogICAgICAgICAgICAgICAgICAgIGJyZWFrDQogICAgICAgICAgICAgICAgdHJ5Og0KICAgICAgICAgICAgICAgICAgICBpZiBjaG9pY2UgPT0gMDoNCiAgICAgICAgICAgICAgICAgICAgICAgIGMoSW52aXRlVG9DaGFubmVsUmVxdWVzdCh0YXJnZXRfZGV0YWlscywgW3VzZXJdKSkNCiAgICAgICAgICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICAgICAgICAgIGMoQWRkQ2hhdFVzZXJSZXF1ZXN0KHRhcmdldF9kZXRhaWxzLmlkLCB1c2VyLCA0MikpDQogICAgICAgICAgICAgICAgICAgIHVzZXJfaWQgPSB1c2VyLmZpcnN0X25hbWUNCiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0X3RpdGxlID0gdGFyZ2V0X2VudGl0eS50aXRsZQ0KICAgICAgICAgICAgICAgICAgICBwcmludChmJ1VzZXI6IHtjeX17YWNjX25hbWV9e2xnfSA9PT4ge2N5fXt1c2VyX2lkfSB7bGd9PT0+IHtjeX17dGFyZ2V0X3RpdGxlfScpDQogICAgICAgICAgICAgICAgICAgICNwcmludChmJ1VzZXI6IHtjeX17YWNjX25hbWV9e2xnfSAtLSBTbGVlcCAxIHNlY29uZCcpDQogICAgICAgICAgICAgICAgICAgIGFkZGluZ19zdGF0dXMgKz0gMQ0KICAgICAgICAgICAgICAgICAgICBwcmludChmJ1VzZXI6IHtjeX17YWNjX25hbWV9e2xnfSAtLSBTbGVlcCB7d317c2xlZXBfdGltZX0ge2xnfXNlY29uZChzKScpDQogICAgICAgICAgICAgICAgICAgIHRpbWUuc2xlZXAoc2xlZXBfdGltZSkNCiAgICAgICAgICAgICAgICBleGNlcHQgVXNlclByaXZhY3lSZXN0cmljdGVkRXJyb3I6DQogICAgICAgICAgICAgICAgICAgIHByaW50KGYnVXNlcjoge2N5fXthY2NfbmFtZX17bGd9IC0tIHtyfVVzZXIgUHJpdmFjeSBSZXN0cmljdGVkIEVycm9yJykNCiAgICAgICAgICAgICAgICAgICAgY29udGludWUNCiAgICAgICAgICAgICAgICBleGNlcHQgUGVlckZsb29kRXJyb3I6DQogICAgICAgICAgICAgICAgICAgIHByaW50KGYnVXNlcjoge2N5fXthY2NfbmFtZX17bGd9IC0tIHtyfVBlZXIgRmxvb2QgRXJyb3IuJykNCiAgICAgICAgICAgICAgICAgICAgcGVlcl9mbG9vZF9zdGF0dXMgKz0gMQ0KICAgICAgICAgICAgICAgICAgICBjb250aW51ZQ0KICAgICAgICAgICAgICAgIGV4Y2VwdCBDaGF0V3JpdGVGb3JiaWRkZW5FcnJvcjoNCiAgICAgICAgICAgICAgICAgICAgcHJpbnQoZidDYW5cJ3QgYWRkIHRvIGdyb3VwLiBDb250YWN0IGdyb3VwIGFkbWluIHRvIGVuYWJsZSBtZW1iZXJzIGFkZGluZycpDQogICAgICAgICAgICAgICAgICAgIGlmIGluZGV4IDwgYXBwcm94X21lbWJlcnNfY291bnQ6DQogICAgICAgICAgICAgICAgICAgICAgICBsb2dfc3RhdHVzKHNjcmFwZWRfZ3JwLCBpbmRleCkNCiAgICAgICAgICAgICAgICAgICAgICAgIGV4aXRfd2luZG93KCkNCiAgICAgICAgICAgICAgICBleGNlcHQgVXNlckJhbm5lZEluQ2hhbm5lbEVycm9yOg0KICAgICAgICAgICAgICAgICAgICBwcmludChmJ1VzZXI6IHtjeX17YWNjX25hbWV9e2xnfSAtLSB7cn1CYW5uZWQgZnJvbSB3cml0aW5nIGluIGdyb3VwcycpDQogICAgICAgICAgICAgICAgICAgIGJyZWFrDQogICAgICAgICAgICAgICAgZXhjZXB0IENoYXRBZG1pblJlcXVpcmVkRXJyb3I6DQogICAgICAgICAgICAgICAgICAgIHByaW50KGYnVXNlcjoge2N5fXthY2NfbmFtZX17bGd9IC0tIHtyfUNoYXQgQWRtaW4gcmlnaHRzIG5lZWRlZCB0byBhZGQnKQ0KICAgICAgICAgICAgICAgICAgICBicmVhaw0KICAgICAgICAgICAgICAgIGV4Y2VwdCBVc2VyQWxyZWFkeVBhcnRpY2lwYW50RXJyb3I6DQogICAgICAgICAgICAgICAgICAgIHByaW50KGYnVXNlcjoge2N5fXthY2NfbmFtZX17bGd9IC0tIHtyfVVzZXIgaXMgYWxyZWFkeSBhIHBhcnRpY2lwYW50JykNCiAgICAgICAgICAgICAgICAgICAgY29udGludWUNCiAgICAgICAgICAgICAgICBleGNlcHQgRmxvb2RXYWl0RXJyb3IgYXMgZToNCiAgICAgICAgICAgICAgICAgICAgcHJpbnQoZid7ZX0nKQ0KICAgICAgICAgICAgICAgICAgICBicmVhaw0KICAgICAgICAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOg0KICAgICAgICAgICAgICAgICAgICBwcmludChmJ0Vycm9yIGluIEVudGl0eScpDQogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlDQogICAgICAgICAgICAgICAgZXhjZXB0IEtleWJvYXJkSW50ZXJydXB0Og0KICAgICAgICAgICAgICAgICAgICBwcmludChmJy0tLS0gQWRkaW5nIFRlcm1pbmF0ZWQgLS0tLScpDQogICAgICAgICAgICAgICAgICAgIGlmIGluZGV4IDwgbGVuKG1lbWJlcnMpOg0KICAgICAgICAgICAgICAgICAgICAgICAgbG9nX3N0YXR1cyhzY3JhcGVkX2dycCwgaW5kZXgpDQogICAgICAgICAgICAgICAgICAgICAgICBleGl0X3dpbmRvdygpDQogICAgICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBlOg0KICAgICAgICAgICAgICAgICAgICBwcmludChmJ3tlfScpDQogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlDQojZ2xvYmFsIGFkZGluZ19zdGF0dXMsIGFwcHJveF9tZW1iZXJzX2NvdW50DQogICAgICAgIGlmIGFkZGluZ19zdGF0dXMgIT0gMDoNCiAgICAgICAgICAgIHByaW50KGYiXG57bGd9IEFkZGluZyBzZXNzaW9uIGVuZGVkIikNCiAgICAgICAgICAgIHRyeToNCiAgICAgICAgICAgICAgICBpZiBpbmRleCA8IGFwcHJveF9tZW1iZXJzX2NvdW50Og0KICAgICAgICAgICAgICAgICAgICBsb2dfc3RhdHVzKHNjcmFwZWRfZ3JwLCBpbmRleCkNCiAgICAgICAgICAgICAgICAgICAgZXhpdF93aW5kb3coKQ0KICAgICAgICAgICAgZXhjZXB0Og0KICAgICAgICAgICAgICAgIGV4aXRfd2luZG93KCkNCiAgICBlbGlmIGEgPT0gNToNCiAgICAgICAgYWNjb3VudHMgPSBbXQ0KICAgICAgICBmID0gb3BlbigndmFycy50eHQnLCAncmInKQ0KICAgICAgICB3aGlsZSBUcnVlOg0KICAgICAgICAgICAgdHJ5Og0KICAgICAgICAgICAgICAgIGFjY291bnRzLmFwcGVuZChwaWNrbGUubG9hZChmKSkNCiAgICAgICAgICAgIGV4Y2VwdCBFT0ZFcnJvcjoNCiAgICAgICAgICAgICAgICBicmVhaw0KDQogICAgICAgIA0KICAgICAgICAjcHJpbnQoJ1xuJyArIGluZm8gKyBsZyArICcgQ2hlY2tpbmcgZm9yIGJhbm5lZCBhY2NvdW50cy4uLicgKyBycykNCiAgICAgICAgcHJpbnQoJ1xuJyAnIENoZWNraW5nIGZvciBiYW5uZWQgYWNjb3VudHMuLi4nICkNCiAgICAgICAgZm9yIGEgaW4gYWNjb3VudHM6DQogICAgICAgICAgICBwaG4gPSBhWzBdDQogICAgICAgICAgICBwcmludChmJ0NoZWNraW5nIHtsZ317cGhufScpDQogICAgICAgICAgICBjbG50ID0gVGVsZWdyYW1DbGllbnQoZidzZXNzaW9ucy97cGhufScsIDgwMjcxOTYgLCAnOWI3MGIyMGVmZDY3ZTliOTllZGMzOTVkNzg0MDdjZmEnKQ0KICAgICAgICAgICAgY2xudC5jb25uZWN0KCkNCiAgICAgICAgICAgIGJhbm5lZCA9IFtdDQogICAgICAgICAgICBpZiBub3QgY2xudC5pc191c2VyX2F1dGhvcml6ZWQoKToNCiAgICAgICAgICAgICAgICB0cnk6DQogICAgICAgICAgICAgICAgICAgIGNsbnQuc2VuZF9jb2RlX3JlcXVlc3QocGhuKQ0KICAgICAgICAgICAgICAgICAgICBwcmludCgna2snKQ0KICAgICAgICAgICAgICAgIGV4Y2VwdCBQaG9uZU51bWJlckJhbm5lZEVycm9yOg0KICAgICAgICAgICAgICAgICAgICBwcmludChmJ3tlcnJvcn0ge3d9e3Bobn0ge3J9aXMgYmFubmVkIXtyc30nKQ0KICAgICAgICAgICAgICAgICAgICBiYW5uZWQuYXBwZW5kKGEpDQogICAgICAgICAgICBmb3IgeiBpbiBiYW5uZWQ6DQogICAgICAgICAgICAgICAgYWNjb3VudHMucmVtb3ZlKHopDQogICAgICAgICAgICAgICAgcHJpbnQoJ3tsZ31CYW5uZWQgYWNjb3VudCByZW1vdmVkW1JlbW92ZSBwZXJtYW5lbnRseSB1c2luZyBtYW5hZ2VyLnB5XXtyc30nKQ0KICAgICAgICAgICAgdGltZS5zbGVlcCgwLjUpDQogICAgICAgICAgICBjbG50LmRpc2Nvbm5lY3QoKQ0KICAgICAgICBwcmludCgnIFNlc3Npb25zIGNyZWF0ZWQhJykNCiAgICAgICAgY2xyKCkNCiAgICAgICAgYmFubmVyKCkNCiAgICAgICAgYWNjb3VudHMgPSBbXQ0KICAgICAgICBmID0gb3BlbigndmFycy50eHQnLCAncmInKQ0KICAgICAgICB3aGlsZSBUcnVlOg0KICAgICAgICAgICAgdHJ5Og0KICAgICAgICAgICAgICAgIGFjY291bnRzLmFwcGVuZChwaWNrbGUubG9hZChmKSkNCiAgICAgICAgICAgIGV4Y2VwdCBFT0ZFcnJvcjoNCiAgICAgICAgICAgICAgICBicmVhaw0KICAgICAgICBwcmludChmJ3tsZ30gVG90YWwgYWNjb3VudHM6IHt3fXtsZW4oYWNjb3VudHMpfScpDQogICAgICAgIG51bWJlcl9vZl9hY2NzID0gaW50KGlucHV0KGYne2N5fSBFbnRlciBudW1iZXIgb2YgYWNjb3VudHMgdG8gUmVwb3J0OiB7cn0nKSkNCiAgICAgICAgY2hvaWNlID0gc3RyKGlucHV0KGYne2N5fSBTZW5kIE1lc3NhZ2UgRm9yIFJlcG9ydCB7cn0nKSkNCiAgICAgICAgdG9fdXNlID0gW3ggZm9yIHggaW4gYWNjb3VudHNbOm51bWJlcl9vZl9hY2NzXV0NCiAgICAgICAgZm9yIGwgaW4gdG9fdXNlOiBhY2NvdW50cy5yZW1vdmUobCkNCiAgICAgICAgd2l0aCBvcGVuKCd2YXJzLnR4dCcsICd3YicpIGFzIGY6DQogICAgICAgICAgICBmb3IgYSBpbiBhY2NvdW50czoNCiAgICAgICAgICAgICAgICBwaWNrbGUuZHVtcChhLCBmKQ0KICAgICAgICAgICAgZm9yIGFiIGluIHRvX3VzZToNCiAgICAgICAgICAgICAgICBwaWNrbGUuZHVtcChhYiwgZikNCiAgICAgICAgICAgIGYuY2xvc2UoKQ0KICAgICAgICBzbGVlcF90aW1lID0gMQ0KICAgICAgICBwcmludChmJ3tsZ30gLS0gU2VuZGluZyBSZXBvcnRzIGZyb20ge3d9e2xlbih0b191c2UpfXtsZ30gYWNjb3VudChzKSAtLScpICAgDQogICAgICAgIHNlbmRfc3RhdHVzID0gMA0KICAgICAgICANCiAgICAgICAgYXBwcm94X21lbWJlcnNfY291bnQgPSAwDQogICAgICAgIGluZGV4ID0gMA0KICAgICAgICBmb3IgYWNjIGluIHRvX3VzZToNCiAgICAgICAgICAgIHN0b3AgPSBpbmRleCArIDYwDQogICAgICAgICAgICBjID0gVGVsZWdyYW1DbGllbnQoZidzZXNzaW9ucy97YWNjWzBdfScsIDM5MTAzODkgLCAnODZmODYxMzUyZjBhYjc2YTI1MTg2NjA1OWE2YWRiZDYnKQ0KICAgICAgICAgICAgcHJpbnQoZidVc2VyOiB7Y3l9e2FjY1swXX17bGd9IC0tIHtjeX1TdGFydGluZyBzZXNzaW9uLi4uICcpDQogICAgICAgICAgICBjLnN0YXJ0KGFjY1swXSkNCiAgICAgICAgICAgIGFjY19uYW1lID0gYy5nZXRfbWUoKS5maXJzdF9uYW1lDQogICAgICAgICAgICB0cnk6DQogICAgICAgICAgICAgICAgYyhKb2luQ2hhbm5lbFJlcXVlc3QoJ0BCZWFzdF9TZWxsaW5nJykpIA0KICAgICAgICAgICAgICAgIGMuc2VuZF9tZXNzYWdlKHNjYW0sY2hvaWNlKQ0KICAgICAgICAgICAgICAgIHByaW50KGYnUmVwb3J0IERvbmUgRnJvbToge2N5fXthY2NfbmFtZX17bGd9ICBUbyBOb3Rvc2NhbS0tICcpDQogICAgICAgICAgICAgICAgc2VuZF9zdGF0dXMgKz0gMQ0KICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBlOg0KICAgICAgICAgICAgICAgIHByaW50KGYne2V9JykNCiAgICAgICAgICAgICAgICBjb250aW51ZQ0KICAgICAgICBpZiBzZW5kX3N0YXR1cyAhPSAwOg0KICAgICAgICAgICAgcHJpbnQoZiJcbntsZ31zZXNzaW9uIGVuZGVkIikNCiAgICAgICAgICAgIGlucHV0KGYnXG57Y3l9IFByZXNzIGVudGVyIHRvIGV4aXQuLi4nKQ0KICAgICAgICBlbHNlOg0KICAgICAgICAgICAgcHJpbnQoZiJcbntsZ31BbGwgcmVwb3J0cyBkb25lIHN1Y2VzZnVsbHkiKQ0KICAgICAgICAgICAgaW5wdXQoZidcbntjeX0gUHJlc3MgZW50ZXIgdG8gZXhpdC4uLicpDQoNCiAgICBlbGlmIGEgPT0gNjoNCiAgICAgICAgYWNjb3VudHMgPSBbXQ0KICAgICAgICBjaGF0cyA9IFtdDQogICAgICAgIGxhc3RfZGF0ZSA9IE5vbmUNCiAgICAgICAgY2h1bmtfc2l6ZSA9IDIwMA0KICAgICAgICBncm91cHMgPSBbXQ0KICAgICAgICBmID0gb3BlbigndmFycy50eHQnLCAncmInKQ0KICAgICAgICB3aGlsZSBUcnVlOg0KICAgICAgICAgICAgdHJ5Og0KICAgICAgICAgICAgICAgIGFjY291bnRzLmFwcGVuZChwaWNrbGUubG9hZChmKSkNCiAgICAgICAgICAgIGV4Y2VwdCBFT0ZFcnJvcjoNCiAgICAgICAgICAgICAgICBicmVhaw0KICAgICAgICBwcmludCgnXG4nICcgQ2hlY2tpbmcgZm9yIGJhbm5lZCBhY2NvdW50cy4uLicgKQ0KICAgICAgICBmb3IgYSBpbiBhY2NvdW50czoNCiAgICAgICAgICAgIHBobiA9IGFbMF0NCiAgICAgICAgICAgIHByaW50KGYnQ2hlY2tpbmcge2xnfXtwaG59JykNCiAgICAgICAgICAgIGNsbnQgPSBUZWxlZ3JhbUNsaWVudChmJ3Nlc3Npb25zL3twaG59JywgODAyNzE5NiAsICc5YjcwYjIwZWZkNjdlOWI5OWVkYzM5NWQ3ODQwN2NmYScpDQogICAgICAgICAgICBjbG50LmNvbm5lY3QoKQ0KICAgICAgICAgICAgYmFubmVkID0gW10NCiAgICAgICAgICAgIGlmIG5vdCBjbG50LmlzX3VzZXJfYXV0aG9yaXplZCgpOg0KICAgICAgICAgICAgICAgIHRyeToNCiAgICAgICAgICAgICAgICAgICAgY2xudC5zZW5kX2NvZGVfcmVxdWVzdChwaG4pDQogICAgICAgICAgICAgICAgICAgIHByaW50KCdraycpDQogICAgICAgICAgICAgICAgZXhjZXB0IFBob25lTnVtYmVyQmFubmVkRXJyb3I6DQogICAgICAgICAgICAgICAgICAgIHByaW50KGYne2Vycm9yfSB7d317cGhufSB7cn1pcyBiYW5uZWQhe3JzfScpDQogICAgICAgICAgICAgICAgICAgIGJhbm5lZC5hcHBlbmQoYSkNCiAgICAgICAgICAgIGZvciB6IGluIGJhbm5lZDoNCiAgICAgICAgICAgICAgICBhY2NvdW50cy5yZW1vdmUoeikNCiAgICAgICAgICAgICAgICBwcmludCgne2xnfUJhbm5lZCBhY2NvdW50IHJlbW92ZWRbUmVtb3ZlIHBlcm1hbmVudGx5IHVzaW5nIG1hbmFnZXIucHlde3JzfScpDQogICAgICAgICAgICB0aW1lLnNsZWVwKDAuNSkNCiAgICAgICAgICAgIyBjbG50LmRpc2Nvbm5lY3QoKQ0KICAgICAgICBwcmludCgnIFNlc3Npb25zIGNyZWF0ZWQhJykNCiAgICAgICAgY2xyKCkNCiAgICAgICAgYmFubmVyKCkNCiAgICAgICAgcmVzdWx0ID0gY2xudChHZXREaWFsb2dzUmVxdWVzdCgNCiAgICAgICAgb2Zmc2V0X2RhdGU9bGFzdF9kYXRlLA0KICAgICAgICBvZmZzZXRfaWQ9MCwNCiAgICAgICAgb2Zmc2V0X3BlZXI9SW5wdXRQZWVyRW1wdHkoKSwNCiAgICAgICAgbGltaXQ9Y2h1bmtfc2l6ZSwNCiAgICAgICAgaGFzaD0wDQogICAgICAgICkpDQogICAgICAgIGNoYXRzLmV4dGVuZChyZXN1bHQuY2hhdHMpDQogICAgICAgIGZvciBjaGF0IGluIGNoYXRzOg0KICAgICAgICAgICAgdHJ5Og0KICAgICAgICAgICAgICAgIGlmIGNoYXQubWVnYWdyb3VwID09IFRydWU6DQogICAgICAgICAgICAgICAgICAgIGdyb3Vwcy5hcHBlbmQoY2hhdCkNCiAgICAgICAgICAgIGV4Y2VwdDoNCiAgICAgICAgICAgICAgICBjb250aW51ZQ0KICAgICAgICBhY2NfbmFtZSA9IGNsbnQuZ2V0X21lKCkuZmlyc3RfbmFtZSANCg0KICAgICAgICBwcmludChmJ01lc3NhZ2Ugd2FzIHNlbmRpbmcgdGhyb3VoIHthY2NfbmFtZX0ge3llfScpDQogICAgICAgIHByaW50KGYnTWVzc2FnZSB3YXMgc2VuZGluZyB0aHJvdWgge2FjY19uYW1lfSB7eWV9JykNCiAgICAgICAgcHJpbnQoZidDaG9vc2UgYSBncm91cCB0byBzY3JhcGUgbWVtYmVycyBmcm9tOntsZ30nKQ0KICAgICAgICBpID0gMA0KICAgICAgICBmb3IgZyBpbiBncm91cHM6DQogICAgICAgICAgICBwcmludChzdHIoaSkgKyAnLSAnICsgZy50aXRsZSkNCiAgICAgICAgICAgIGkgKz0gMQ0KICAgICAgICBnX2luZGV4ID0gaW5wdXQoZiJFbnRlciBhIE51bWJlcjp7bGd9IikNCiAgICAgICAgdGFyZ2V0X2dyb3VwID0gZ3JvdXBzW2ludChnX2luZGV4KV0NCiAgICAgICAgcHJpbnQoJ0ZldGNoaW5nIE1lbWJlcnMuLi4nKQ0KICAgICAgICBhbGxfcGFydGljaXBhbnRzID0gW10NCiAgICAgICANCiAgICAgICAgYWxsX3BhcnRpY2lwYW50cyA9IGNsbnQuZ2V0X3BhcnRpY2lwYW50cyh0YXJnZXRfZ3JvdXAsIGFnZ3Jlc3NpdmU9VHJ1ZSkNCiAgICAgICAgDQogICAgICAgIHByaW50KCdTYXZpbmcgSW4gZmlsZS4uLicpDQogICAgICAgIHdpdGggb3BlbigibWVtYmVycy5jc3YiLCAidyIsIGVuY29kaW5nPSdVVEYtOCcpIGFzIGY6DQogICAgICAgICAgICB3cml0ZXIgPSBjc3Yud3JpdGVyKGYsIGRlbGltaXRlcj0iLCIsIGxpbmV0ZXJtaW5hdG9yPSJcbiIpDQogICAgICAgICAgICB3cml0ZXIud3JpdGVyb3coWyd1c2VybmFtZScsICd1c2VyIGlkJywgJ2FjY2VzcyBoYXNoJywgJ25hbWUnLCAnZ3JvdXAnLCAnZ3JvdXAgaWQnXSkNCiAgICAgICAgICAgIGZvciB1c2VyIGluIGFsbF9wYXJ0aWNpcGFudHM6DQogICAgICAgICAgICAgICAgaWYgdXNlci51c2VybmFtZToNCiAgICAgICAgICAgICAgICAgICAgdXNlcm5hbWUgPSB1c2VyLnVzZXJuYW1lDQogICAgICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICAgICAgdXNlcm5hbWUgPSAiIg0KICAgICAgICAgICAgICAgIGlmIHVzZXIuZmlyc3RfbmFtZToNCiAgICAgICAgICAgICAgICAgICAgZmlyc3RfbmFtZSA9IHVzZXIuZmlyc3RfbmFtZQ0KICAgICAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgICAgIGZpcnN0X25hbWUgPSAiIg0KICAgICAgICAgICAgICAgIGlmIHVzZXIubGFzdF9uYW1lOg0KICAgICAgICAgICAgICAgICAgICBsYXN0X25hbWUgPSB1c2VyLmxhc3RfbmFtZQ0KICAgICAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgICAgIGxhc3RfbmFtZSA9ICIiDQogICAgICAgICAgICAgICAgbmFtZSA9IChmaXJzdF9uYW1lICsgJyAnICsgbGFzdF9uYW1lKS5zdHJpcCgpDQogICAgICAgICAgICAgICAgd3JpdGVyLndyaXRlcm93KFt1c2VybmFtZSwgdXNlci5pZCwgdXNlci5hY2Nlc3NfaGFzaCwgbmFtZSwgdGFyZ2V0X2dyb3VwLnRpdGxlLCB0YXJnZXRfZ3JvdXAuaWRdKQ0KICAgICAgICBwcmludChmJ01lbWJlcnMgc2NyYXBlZCBzdWNjZXNzZnVsbHkue2xnfScpDQogICAgICAgIFNMRUVQX1RJTUVfMiA9IDE4MDANCiAgICAgICAgU0xFRVBfVElNRV8xID0gNDAwDQogICAgICAgIFNMRUVQX1RJTUUgPSBpbnQoaW5wdXQoZiJFbnRlciBzbGVlcCB0aW1lIGR1cmF0aW9uIGluIG1lc3NhZ2VzIDp7bGd9IikpDQogICAgICAgIHVzZXJzID0gW10NCiAgICAgICAgd2l0aCBvcGVuKHIibWVtYmVycy5jc3YiLCBlbmNvZGluZz0nVVRGLTgnKSBhcyBmOg0KICAgICAgICAgICAgcm93cyA9IGNzdi5yZWFkZXIoZixkZWxpbWl0ZXI9IiwiLGxpbmV0ZXJtaW5hdG9yPSJcbiIpDQogICAgICAgICAgICBuZXh0KHJvd3MsIE5vbmUpDQogICAgICAgICAgICBmb3Igcm93IGluIHJvd3M6DQogICAgICAgICAgICAgICAgdXNlciA9IHt9DQogICAgICAgICAgICAgICAgdXNlclsndXNlcm5hbWUnXSA9IHJvd1swXQ0KICAgICAgICAgICAgICAgIHVzZXJbJ2lkJ10gPSBpbnQocm93WzFdKQ0KICAgICAgICAgICAgICAgIHVzZXJbJ2FjY2Vzc19oYXNoJ10gPSBpbnQocm93WzJdKQ0KICAgICAgICAgICAgICAgIHVzZXJbJ25hbWUnXSA9IHJvd1szXQ0KICAgICAgICAgICAgICAgIHVzZXJzLmFwcGVuZCh1c2VyKQ0KICAgICAgICBtb2RlID0gaW50KGlucHV0KGYiRW50ZXIgMSB0byBzZW5kIGJ5IHVzZXIgSUQgb3IgMiB0byBzZW5kIGJ5IHVzZXJuYW1lOntsZ30iKSkNCiAgICAgICAgbWVzc2FnZSA9IHN0cihpbnB1dChmInNlbmQgeW91ciBtZXNzc2FnZXtsZ30iKSkgIA0KICAgICAgICBmb3IgdXNlciBpbiB1c2VyczoNCiAgICAgICAgICAgIGlmIG1vZGUgPT0gMjoNCiAgICAgICAgICAgICAgICBpZiB1c2VyWyd1c2VybmFtZSddID09ICIiOg0KICAgICAgICAgICAgICAgICAgICBjb250aW51ZQ0KICAgICAgICAgICAgICAgIHJlY2VpdmVyID0gY2xudC5nZXRfaW5wdXRfZW50aXR5KHVzZXJbJ3VzZXJuYW1lJ10pDQogICAgICAgICAgICBlbGlmIG1vZGUgPT0gMToNCiAgICAgICAgICAgICAgICByZWNlaXZlciA9IElucHV0UGVlclVzZXIodXNlclsnaWQnXSx1c2VyWydhY2Nlc3NfaGFzaCddKQ0KICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICBwcmludChmIkludmFsaWQgTW9kZS4gRXhpdGluZy57bGd9IikNCiAgICAgICAgICAgICAgICBjbG50LmRpc2Nvbm5lY3QoKQ0KICAgICAgICAgICAgICAgIHN5cy5leGl0KCkNCiAgICAgICAgICAgIHRyeToNCiAgICAgICAgICAgICAgICBwcmludChmIlNlbmRpbmcgTWVzc2FnZSB0bzp7bGd9IiwgdXNlclsnbmFtZSddKQ0KICAgICAgICAgICAgICAgIGNsbnQuc2VuZF9tZXNzYWdlKHJlY2VpdmVyLCBtZXNzYWdlLmZvcm1hdCh1c2VyWyduYW1lJ10pKQ0KICAgICAgICAgICAgICAgIHByaW50KCJXYWl0aW5nIHt9IHNlY29uZHN7bGd9Ii5mb3JtYXQoU0xFRVBfVElNRSkpDQogICAgICAgICAgICAgICAgdGltZS5zbGVlcChTTEVFUF9USU1FKQ0KICAgICAgICAgICAgZXhjZXB0IFBlZXJGbG9vZEVycm9yOg0KICAgICAgICAgICAgICAgIHByaW50KCJHZXR0aW5nIEZsb29kIEVycm9yIGZyb20gdGVsZWdyYW0uIFNjcmlwdCBpcyBzdG9wcGluZyBub3cuIFBsZWFzZSB0cnkgYWdhaW4gYWZ0ZXIgc29tZSB0aW1lLiIpDQogICAgICAgICAgICAgICAgcHJpbnQoIldhaXRpbmcge30gc2Vjb25kcyIuZm9ybWF0KFNMRUVQX1RJTUVfMikpDQogICAgICAgICAgICAgICAgdGltZS5zbGVlcChTTEVFUF9USU1FXzIpDQogICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6DQogICAgICAgICAgICAgICAgcHJpbnQoIkVycm9yOiIsIGUpDQogICAgICAgICAgICAgICAgcHJpbnQoIlRyeWluZyB0byBjb250aW51ZS4uLiIpDQogICAgICAgICAgICAgICAgcHJpbnQoIldhaXRpbmcge30gc2Vjb25kcyIuZm9ybWF0KFNMRUVQX1RJTUVfMSkpDQogICAgICAgICAgICAgICAgdGltZS5zbGVlcChTTEVFUF9USU1FXzEpDQogICAgICAgIGNsbnQuZGlzY29ubmVjdCgpDQogICAgICAgIHByaW50KGYiRG9uZS4gTWVzc2FnZSBzZW50IHRvIGFsbCB1c2Vycy57bGd9IikgDQogICAgICAgIGlucHV0KGYnXG4gUHJlc3MgZW50ZXIgdG8gZ290byBtYWluIG1lbnUuLi4nKQ0KICAgICAgDQogICAgZWxpZiBhID09IDc6DQogICAgICAgIGFjY291bnRzID0gW10NCiAgICAgICAgZiA9IG9wZW4oJ3ZhcnMudHh0JywgJ3JiJykNCiAgICAgICAgd2hpbGUgVHJ1ZToNCiAgICAgICAgICAgIHRyeToNCiAgICAgICAgICAgICAgICBhY2NvdW50cy5hcHBlbmQocGlja2xlLmxvYWQoZikpDQogICAgICAgICAgICBleGNlcHQgRU9GRXJyb3I6DQogICAgICAgICAgICAgICAgYnJlYWsNCg0KICAgICAgICANCiAgICAgICAgI3ByaW50KCdcbicgKyBpbmZvICsgbGcgKyAnIENoZWNraW5nIGZvciBiYW5uZWQgYWNjb3VudHMuLi4nICsgcnMpDQogICAgICAgIHByaW50KCdcbicgJyBDaGVja2luZyBmb3IgYmFubmVkIGFjY291bnRzLi4uJyApDQogICAgICAgIGZvciBhIGluIGFjY291bnRzOg0KICAgICAgICAgICAgcGhuID0gYVswXQ0KICAgICAgICAgICAgcHJpbnQoZidDaGVja2luZyB7bGd9e3Bobn0nKQ0KICAgICAgICAgICAgY2xudCA9IFRlbGVncmFtQ2xpZW50KGYnc2Vzc2lvbnMve3Bobn0nLCA4MDI3MTk2ICwgJzliNzBiMjBlZmQ2N2U5Yjk5ZWRjMzk1ZDc4NDA3Y2ZhJykNCiAgICAgICAgICAgIGNsbnQuY29ubmVjdCgpDQogICAgICAgICAgICBiYW5uZWQgPSBbXQ0KICAgICAgICAgICAgaWYgbm90IGNsbnQuaXNfdXNlcl9hdXRob3JpemVkKCk6DQogICAgICAgICAgICAgICAgdHJ5Og0KICAgICAgICAgICAgICAgICAgICBjbG50LnNlbmRfY29kZV9yZXF1ZXN0KHBobikNCiAgICAgICAgICAgICAgICAgICAgcHJpbnQoJ2trJykNCiAgICAgICAgICAgICAgICBleGNlcHQgUGhvbmVOdW1iZXJCYW5uZWRFcnJvcjoNCiAgICAgICAgICAgICAgICAgICAgcHJpbnQoZid7ZXJyb3J9IHt3fXtwaG59IHtyfWlzIGJhbm5lZCF7cnN9JykNCiAgICAgICAgICAgICAgICAgICAgYmFubmVkLmFwcGVuZChhKQ0KICAgICAgICAgICAgZm9yIHogaW4gYmFubmVkOg0KICAgICAgICAgICAgICAgIGFjY291bnRzLnJlbW92ZSh6KQ0KICAgICAgICAgICAgICAgIHByaW50KCd7bGd9QmFubmVkIGFjY291bnQgcmVtb3ZlZFtSZW1vdmUgcGVybWFuZW50bHkgdXNpbmcgbWFuYWdlci5weV17cnN9JykNCiAgICAgICAgICAgIHRpbWUuc2xlZXAoMC41KQ0KICAgICAgICAgICAgY2xudC5kaXNjb25uZWN0KCkNCiAgICAgICAgcHJpbnQoJyBTZXNzaW9ucyBjcmVhdGVkIScpDQogICAgICAgIGNscigpDQogICAgICAgIGJhbm5lcigpDQogICAgICAgIGFjY291bnRzID0gW10NCiAgICAgICAgZiA9IG9wZW4oJ3ZhcnMudHh0JywgJ3JiJykNCiAgICAgICAgd2hpbGUgVHJ1ZToNCiAgICAgICAgICAgIHRyeToNCiAgICAgICAgICAgICAgICBhY2NvdW50cy5hcHBlbmQocGlja2xlLmxvYWQoZikpDQogICAgICAgICAgICBleGNlcHQgRU9GRXJyb3I6DQogICAgICAgICAgICAgICAgYnJlYWsNCiAgICAgICAgcHJpbnQoZid7bGd9IFRvdGFsIGFjY291bnRzOiB7d317bGVuKGFjY291bnRzKX0nKQ0KICAgICAgICBudW1iZXJfb2ZfYWNjcyA9IGludChpbnB1dChmJ3tjeX0gRW50ZXIgbnVtYmVyIG9mIGFjY291bnMgdG8gY2hhbmdlIFBpYyB7cn0nKSkNCiAgICAgICAgdG9fdXNlID0gW3ggZm9yIHggaW4gYWNjb3VudHNbOm51bWJlcl9vZl9hY2NzXV0NCiAgICAgICAgZm9yIGwgaW4gdG9fdXNlOiBhY2NvdW50cy5yZW1vdmUobCkNCiAgICAgICAgd2l0aCBvcGVuKCd2YXJzLnR4dCcsICd3YicpIGFzIGY6DQogICAgICAgICAgICBmb3IgYSBpbiBhY2NvdW50czoNCiAgICAgICAgICAgICAgICBwaWNrbGUuZHVtcChhLCBmKQ0KICAgICAgICAgICAgZm9yIGFiIGluIHRvX3VzZToNCiAgICAgICAgICAgICAgICBwaWNrbGUuZHVtcChhYiwgZikNCiAgICAgICAgICAgIGYuY2xvc2UoKQ0KICAgICAgICBzbGVlcF90aW1lID0gMQ0KICAgICAgICBwcmludChmJ3tsZ30gLS1Qcm9maWUgU2V0IFN1Y2VzZnVsbHl7d317bGVuKHRvX3VzZSl9e2xnfSBhY2NvdW50IC0tJykgICANCiAgICAgICAgc2VuZF9zdGF0dXMgPSAwDQogICAgICAgIA0KICAgICAgICBhcHByb3hfbWVtYmVyc19jb3VudCA9IDANCiAgICAgICAgaW5kZXggPSAwDQogICAgICAgIGZvciBhY2MgaW4gdG9fdXNlOg0KICAgICAgICAgICAgc3RvcCA9IGluZGV4ICsgNjANCiAgICAgICAgICAgIGMgPSBUZWxlZ3JhbUNsaWVudChmJ3Nlc3Npb25zL3thY2NbMF19JywgMzkxMDM4OSAsICc4NmY4NjEzNTJmMGFiNzZhMjUxODY2MDU5YTZhZGJkNicpDQogICAgICAgICAgICBwcmludChmJ1VzZXI6IHtjeX17YWNjWzBdfXtsZ30gLS0ge2N5fVN0YXJ0aW5nIHNlc3Npb24uLi4gJykNCiAgICAgICAgICAgIGMuc3RhcnQoYWNjWzBdKQ0KICAgICAgICAgICAgYWNjX25hbWUgPSBjLmdldF9tZSgpLmZpcnN0X25hbWUNCiAgICAgICAgICAgIHRyeToNCiAgICAgICAgICAgICAgICBjKFVwbG9hZFByb2ZpbGVQaG90b1JlcXVlc3QoYy51cGxvYWRfZmlsZSgnYmVhc3QuanBnJykpKQ0KICAgICAgICAgICAgICAgIHByaW50KGYnUHJvZmlsZSBTZXQgU3VjZXNmdWxseSBUbzoge2N5fXthY2NfbmFtZX17bGd9ICBULS0gJykNCiAgICAgICAgICAgICAgICBzZW5kX3N0YXR1cyArPSAxDQogICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6DQogICAgICAgICAgICAgICAgcHJpbnQoZid7ZX0nKQ0KICAgICAgICAgICAgICAgIGNvbnRpbnVlDQogICAgICAgIGlmIHNlbmRfc3RhdHVzICE9IDA6DQogICAgICAgICAgICBwcmludChmIlxue2xnfXNlc3Npb24gZW5kZWQiKQ0KICAgICAgICAgICAgaW5wdXQoZidcbntjeX0gUHJlc3MgZW50ZXIgdG8gZXhpdC4uLicpDQogICAgICAgIGVsc2U6DQogICAgICAgICAgICBwcmludChmIlxue2xnfSBhbGwgcHJvZmlsZSBzZXR1cHBlZCBzdWNjZXNmdWxseSIpDQogICAgICAgICAgICBpbnB1dChmJ1xue2N5fSBQcmVzcyBlbnRlciB0byBleGl0Li4uJykNCiAgICAgICANCiAgICBlbGlmIGEgPT0gODoNCiAgICAgICAgYWNjb3VudHMgPSBbXQ0KICAgICAgICBmID0gb3BlbigndmFycy50eHQnLCAncmInKQ0KICAgICAgICB3aGlsZSBUcnVlOg0KICAgICAgICAgICAgdHJ5Og0KICAgICAgICAgICAgICAgIGFjY291bnRzLmFwcGVuZChwaWNrbGUubG9hZChmKSkNCiAgICAgICAgICAgIGV4Y2VwdCBFT0ZFcnJvcjoNCiAgICAgICAgICAgICAgICBicmVhaw0KDQogICAgICAgIA0KICAgICAgICAjcHJpbnQoJ1xuJyArIGluZm8gKyBsZyArICcgQ2hlY2tpbmcgZm9yIGJhbm5lZCBhY2NvdW50cy4uLicgKyBycykNCiAgICAgICAgcHJpbnQoJ1xuJyAnIENoZWNraW5nIGZvciBiYW5uZWQgYWNjb3VudHMuLi4nICkNCiAgICAgICAgZm9yIGEgaW4gYWNjb3VudHM6DQogICAgICAgICAgICBwaG4gPSBhWzBdDQogICAgICAgICAgICBwcmludChmJ0NoZWNraW5nIHtsZ317cGhufScpDQogICAgICAgICAgICBjbG50ID0gVGVsZWdyYW1DbGllbnQoZidzZXNzaW9ucy97cGhufScsIDgwMjcxOTYgLCAnOWI3MGIyMGVmZDY3ZTliOTllZGMzOTVkNzg0MDdjZmEnKQ0KICAgICAgICAgICAgY2xudC5jb25uZWN0KCkNCiAgICAgICAgICAgIGJhbm5lZCA9IFtdDQogICAgICAgICAgICBpZiBub3QgY2xudC5pc191c2VyX2F1dGhvcml6ZWQoKToNCiAgICAgICAgICAgICAgICB0cnk6DQogICAgICAgICAgICAgICAgICAgIGNsbnQuc2VuZF9jb2RlX3JlcXVlc3QocGhuKQ0KICAgICAgICAgICAgICAgICAgICBwcmludCgna2snKQ0KICAgICAgICAgICAgICAgIGV4Y2VwdCBQaG9uZU51bWJlckJhbm5lZEVycm9yOg0KICAgICAgICAgICAgICAgICAgICBwcmludChmJ3tlcnJvcn0ge3d9e3Bobn0ge3J9aXMgYmFubmVkIXtyc30nKQ0KICAgICAgICAgICAgICAgICAgICBiYW5uZWQuYXBwZW5kKGEpDQogICAgICAgICAgICBmb3IgeiBpbiBiYW5uZWQ6DQogICAgICAgICAgICAgICAgYWNjb3VudHMucmVtb3ZlKHopDQogICAgICAgICAgICAgICAgcHJpbnQoJ3tsZ31CYW5uZWQgYWNjb3VudCByZW1vdmVkW1JlbW92ZSBwZXJtYW5lbnRseSB1c2luZyBtYW5hZ2VyLnB5XXtyc30nKQ0KICAgICAgICAgICAgdGltZS5zbGVlcCgwLjUpDQogICAgICAgICAgICBjbG50LmRpc2Nvbm5lY3QoKQ0KICAgICAgICBwcmludCgnIFNlc3Npb25zIGNyZWF0ZWQhJykNCiAgICAgICAgY2xyKCkNCiAgICAgICAgYmFubmVyKCkNCiAgICAgICAgYWNjb3VudHMgPSBbXQ0KICAgICAgICBmID0gb3BlbigndmFycy50eHQnLCAncmInKQ0KICAgICAgICB3aGlsZSBUcnVlOg0KICAgICAgICAgICAgdHJ5Og0KICAgICAgICAgICAgICAgIGFjY291bnRzLmFwcGVuZChwaWNrbGUubG9hZChmKSkNCiAgICAgICAgICAgIGV4Y2VwdCBFT0ZFcnJvcjoNCiAgICAgICAgICAgICAgICBicmVhaw0KICAgICAgICBwcmludChmJ3tsZ30gVG90YWwgYWNjb3VudHM6IHt3fXtsZW4oYWNjb3VudHMpfScpDQogICAgICAgIG51bWJlcl9vZl9hY2NzID0gaW50KGlucHV0KGYne2N5fSBFbnRlciBudW1iZXIgb2YgYWNjb3VudHMgdG8gcmVwb3J0IHNwYW0gIHtyfScpKQ0KICAgICAgICB1c2VyID0gc3RyKGlucHV0KGYne2N5fSBFbnRlciBHcm91cCxDaGFubmVsIG9yIHVzZXIgdXNlcm5hbWV7cn0nKSkNCiAgICAgICAgdG9fdXNlID0gW3ggZm9yIHggaW4gYWNjb3VudHNbOm51bWJlcl9vZl9hY2NzXV0NCiAgICAgICAgZm9yIGwgaW4gdG9fdXNlOiBhY2NvdW50cy5yZW1vdmUobCkNCiAgICAgICAgd2l0aCBvcGVuKCd2YXJzLnR4dCcsICd3YicpIGFzIGY6DQogICAgICAgICAgICBmb3IgYSBpbiBhY2NvdW50czoNCiAgICAgICAgICAgICAgICBwaWNrbGUuZHVtcChhLCBmKQ0KICAgICAgICAgICAgZm9yIGFiIGluIHRvX3VzZToNCiAgICAgICAgICAgICAgICBwaWNrbGUuZHVtcChhYiwgZikNCiAgICAgICAgICAgIGYuY2xvc2UoKQ0KICAgICAgICBzbGVlcF90aW1lID0gMQ0KICAgICAgICBwcmludChmJ3tsZ30gLS1SZXBvcnQgU3BhbSBTdGFydGVkIFN1Y2VzZnVsbHl7dXNlcn17bGd9IGFjY291bnQgLS0nKSAgIA0KICAgICAgICBzZW5kX3N0YXR1cyA9IDANCiAgICAgICAgDQogICAgICAgIGFwcHJveF9tZW1iZXJzX2NvdW50ID0gMA0KICAgICAgICBpbmRleCA9IDANCiAgICAgICAgZm9yIGFjYyBpbiB0b191c2U6DQogICAgICAgICAgICBzdG9wID0gaW5kZXggKyA2MA0KICAgICAgICAgICAgYyA9IFRlbGVncmFtQ2xpZW50KGYnc2Vzc2lvbnMve2FjY1swXX0nLCAzOTEwMzg5ICwgJzg2Zjg2MTM1MmYwYWI3NmEyNTE4NjYwNTlhNmFkYmQ2JykNCiAgICAgICAgICAgIHByaW50KGYnVXNlcjoge2N5fXthY2NbMF19e2xnfSAtLSB7Y3l9U3RhcnRpbmcgc2Vzc2lvbi4uLiAnKQ0KICAgICAgICAgICAgYy5zdGFydChhY2NbMF0pDQogICAgICAgICAgICBhY2NfbmFtZSA9IGMuZ2V0X21lKCkuZmlyc3RfbmFtZQ0KICAgICAgICAgICAgdHJ5Og0KICAgICAgICAgICAgICAgIGMoUmVwb3J0U3BhbVJlcXVlc3QodXNlcikpDQogICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgcHJpbnQoZic9PT09PT09UmVwb3J0ZWQgc3BhbSB7dXNlcn06ZnJvbSB7Y3l9e2FjY19uYW1lfXtsZ309PT09PT09PSAnKQ0KICAgICAgICAgICAgICAgIHNlbmRfc3RhdHVzICs9IDENCiAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZToNCiAgICAgICAgICAgICAgICBwcmludChmJ3tlfScpDQogICAgICAgICAgICAgICAgY29udGludWUNCiAgICAgICAgaWYgc2VuZF9zdGF0dXMgIT0gMDoNCiAgICAgICAgICAgIHByaW50KGYiXG57bGd9c2Vzc2lvbiBlbmRlZCIpDQogICAgICAgICAgICBpbnB1dChmJ1xue2N5fSBQcmVzcyBlbnRlciB0byBleGl0Li4uJykNCiAgICAgICAgZWxzZToNCiAgICAgICAgICAgIHByaW50KGYiXG57bGd9IGFsbCByZXBvcnRzIGRvbmUgc3VjZXNzZnlsbHkiKQ0KICAgICAgICAgICAgaW5wdXQoZidcbntjeX0gUHJlc3MgZW50ZXIgdG8gZXhpdC4uLicpDQogICAgICAgIA0KICAgIGVsaWYgYSA9PSA5Og0KICAgICAgICBhY2NvdW50cyA9IFtdDQogICAgICAgIGYgPSBvcGVuKCd2YXJzLnR4dCcsICdyYicpDQogICAgICAgIHdoaWxlIFRydWU6DQogICAgICAgICAgICB0cnk6DQogICAgICAgICAgICAgICAgYWNjb3VudHMuYXBwZW5kKHBpY2tsZS5sb2FkKGYpKQ0KICAgICAgICAgICAgZXhjZXB0IEVPRkVycm9yOg0KICAgICAgICAgICAgICAgIGJyZWFrDQoNCiAgICAgICAgDQogICAgICAgICNwcmludCgnXG4nICsgaW5mbyArIGxnICsgJyBDaGVja2luZyBmb3IgYmFubmVkIGFjY291bnRzLi4uJyArIHJzKQ0KICAgICAgICBwcmludCgnXG4nICcgQ2hlY2tpbmcgZm9yIGJhbm5lZCBhY2NvdW50cy4uLicgKQ0KICAgICAgICBmb3IgYSBpbiBhY2NvdW50czoNCiAgICAgICAgICAgIHBobiA9IGFbMF0NCiAgICAgICAgICAgIHByaW50KGYnQ2hlY2tpbmcge2xnfXtwaG59JykNCiAgICAgICAgICAgIGNsbnQgPSBUZWxlZ3JhbUNsaWVudChmJ3Nlc3Npb25zL3twaG59JywgODAyNzE5NiAsICc5YjcwYjIwZWZkNjdlOWI5OWVkYzM5NWQ3ODQwN2NmYScpDQogICAgICAgICAgICBjbG50LmNvbm5lY3QoKQ0KICAgICAgICAgICAgYmFubmVkID0gW10NCiAgICAgICAgICAgIGlmIG5vdCBjbG50LmlzX3VzZXJfYXV0aG9yaXplZCgpOg0KICAgICAgICAgICAgICAgIHRyeToNCiAgICAgICAgICAgICAgICAgICAgY2xudC5zZW5kX2NvZGVfcmVxdWVzdChwaG4pDQogICAgICAgICAgICAgICAgICAgIHByaW50KCdraycpDQogICAgICAgICAgICAgICAgZXhjZXB0IFBob25lTnVtYmVyQmFubmVkRXJyb3I6DQogICAgICAgICAgICAgICAgICAgIHByaW50KGYne2Vycm9yfSB7d317cGhufSB7cn1pcyBiYW5uZWQhe3JzfScpDQogICAgICAgICAgICAgICAgICAgIGJhbm5lZC5hcHBlbmQoYSkNCiAgICAgICAgICAgIGZvciB6IGluIGJhbm5lZDoNCiAgICAgICAgICAgICAgICBhY2NvdW50cy5yZW1vdmUoeikNCiAgICAgICAgICAgICAgICBwcmludCgne2xnfUJhbm5lZCBhY2NvdW50IHJlbW92ZWRbUmVtb3ZlIHBlcm1hbmVudGx5IHVzaW5nIG1hbmFnZXIucHlde3JzfScpDQogICAgICAgICAgICB0aW1lLnNsZWVwKDAuNSkNCiAgICAgICAgICAgIGNsbnQuZGlzY29ubmVjdCgpDQogICAgICAgIHByaW50KCcgU2Vzc2lvbnMgY3JlYXRlZCEnKQ0KICAgICAgICBjbHIoKQ0KICAgICAgICBiYW5uZXIoKQ0KICAgICAgICBhY2NvdW50cyA9IFtdDQogICAgICAgIGYgPSBvcGVuKCd2YXJzLnR4dCcsICdyYicpDQogICAgICAgIHdoaWxlIFRydWU6DQogICAgICAgICAgICB0cnk6DQogICAgICAgICAgICAgICAgYWNjb3VudHMuYXBwZW5kKHBpY2tsZS5sb2FkKGYpKQ0KICAgICAgICAgICAgZXhjZXB0IEVPRkVycm9yOg0KICAgICAgICAgICAgICAgIGJyZWFrDQogICAgICAgIHByaW50KGYne2xnfSBUb3RhbCBhY2NvdW50czoge3d9e2xlbihhY2NvdW50cyl9JykNCiAgICAgICAgbnVtYmVyX29mX2FjY3MgPSBpbnQoaW5wdXQoZid7Y3l9IEVudGVyIG51bWJlciBvZiBhY2NvdW50cyBUbyBzZW5kIERtIHtyfScpKQ0KICAgICAgICB1c2UgPSBzdHIoaW5wdXQoZid7Y3l9IEVudGVyIHVzZXJuYW1lIG9mIGEgdXNlciB0byBzZW5kIGRtIGhpbS9oZXJ7cn0nKSkNCiAgICAgICAgbXNnX3RvcGkgPSBzdHIoaW5wdXQoZid7Y3l9IE5vdyBlbnRlciBNZXNzYWdlIHRvIHNlbmQgaGlte3J9JykpDQogICAgICAgIHRvX3VzZSA9IFt4IGZvciB4IGluIGFjY291bnRzWzpudW1iZXJfb2ZfYWNjc11dDQogICAgICAgIGZvciBsIGluIHRvX3VzZTogYWNjb3VudHMucmVtb3ZlKGwpDQogICAgICAgIHdpdGggb3BlbigndmFycy50eHQnLCAnd2InKSBhcyBmOg0KICAgICAgICAgICAgZm9yIGEgaW4gYWNjb3VudHM6DQogICAgICAgICAgICAgICAgcGlja2xlLmR1bXAoYSwgZikNCiAgICAgICAgICAgIGZvciBhYiBpbiB0b191c2U6DQogICAgICAgICAgICAgICAgcGlja2xlLmR1bXAoYWIsIGYpDQogICAgICAgICAgICBmLmNsb3NlKCkNCiAgICAgICAgc2xlZXBfdGltZSA9IDENCiAgICAgICAgcHJpbnQoZid7bGd9IC0tU2VuZGluZyBEbSB0byB7dXNlfXtsZ30uLi4uLiAtLScpICAgDQogICAgICAgIHNlbmRfc3RhdHVzID0gMA0KICAgICAgICANCiAgICAgICAgYXBwcm94X21lbWJlcnNfY291bnQgPSAwDQogICAgICAgIGluZGV4ID0gMA0KICAgICAgICBmb3IgYWNjIGluIHRvX3VzZToNCiAgICAgICAgICAgIHN0b3AgPSBpbmRleCArIDYwDQogICAgICAgICAgICBjID0gVGVsZWdyYW1DbGllbnQoZidzZXNzaW9ucy97YWNjWzBdfScsIDM5MTAzODkgLCAnODZmODYxMzUyZjBhYjc2YTI1MTg2NjA1OWE2YWRiZDYnKQ0KICAgICAgICAgICAgcHJpbnQoZidVc2VyOiB7Y3l9e2FjY1swXX17bGd9IC0tIHtjeX1TdGFydGluZyBzZXNzaW9uLi4uICcpDQogICAgICAgICAgICBjLnN0YXJ0KGFjY1swXSkNCiAgICAgICAgICAgIGFjY19uYW1lID0gYy5nZXRfbWUoKS5maXJzdF9uYW1lDQogICAgICAgICAgICB0cnk6DQogICAgICAgICAgICAgICAgYy5zZW5kX21lc3NhZ2UodXNlLG1zZ190b3BpKQ0KICAgICAgICAgICAgICAgIHByaW50KGYnPT09PT09PURtIHNlbnQge3VzZX06ZnJvbSB7Y3l9e2FjY19uYW1lfXtsZ309PT09PT09PSAnKQ0KICAgICAgICAgICAgICAgIHNlbmRfc3RhdHVzICs9IDENCiAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZToNCiAgICAgICAgICAgICAgICBwcmludChmJ3tlfScpDQogICAgICAgICAgICAgICAgY29udGludWUNCiAgICAgICAgaWYgc2VuZF9zdGF0dXMgIT0gMDoNCiAgICAgICAgICAgIHByaW50KGYiXG57bGd9c2Vzc2lvbiBlbmRlZCIpDQogICAgICAgICAgICBpbnB1dChmJ1xue2N5fSBQcmVzcyBlbnRlciB0byBleGl0Li4uJykNCiAgICAgICAgZWxzZToNCiAgICAgICAgICAgIHByaW50KGYiXG57bGd9IEFsbCBEbSBkb25lIHN1Y2Vzc2Z5bGx5IikNCiAgICAgICAgICAgIGlucHV0KGYnXG57Y3l9IFByZXNzIGVudGVyIHRvIGV4aXQuLi4nKQ0KDQogICAgZWxpZiBhID09IDExOg0KICAgICAgICBhY2NvdW50cyA9IFtdDQogICAgICAgIGYgPSBvcGVuKCd2YXJzLnR4dCcsICdyYicpDQogICAgICAgIHdoaWxlIFRydWU6DQogICAgICAgICAgICB0cnk6DQogICAgICAgICAgICAgICAgYWNjb3VudHMuYXBwZW5kKHBpY2tsZS5sb2FkKGYpKQ0KICAgICAgICAgICAgZXhjZXB0IEVPRkVycm9yOg0KICAgICAgICAgICAgICAgIGJyZWFrDQoNCiAgICAgICAgDQogICAgICAgICNwcmludCgnXG4nICsgaW5mbyArIGxnICsgJyBDaGVja2luZyBmb3IgYmFubmVkIGFjY291bnRzLi4uJyArIHJzKQ0KICAgICAgICBwcmludCgnXG4nICcgQ2hlY2tpbmcgZm9yIGJhbm5lZCBhY2NvdW50cy4uLicgKQ0KICAgICAgICBmb3IgYSBpbiBhY2NvdW50czoNCiAgICAgICAgICAgIHBobiA9IGFbMF0NCiAgICAgICAgICAgIHByaW50KGYnQ2hlY2tpbmcge2xnfXtwaG59JykNCiAgICAgICAgICAgIGNsbnQgPSBUZWxlZ3JhbUNsaWVudChmJ3Nlc3Npb25zL3twaG59JywgODAyNzE5NiAsICc5YjcwYjIwZWZkNjdlOWI5OWVkYzM5NWQ3ODQwN2NmYScpDQogICAgICAgICAgICBjbG50LmNvbm5lY3QoKQ0KICAgICAgICAgICAgYmFubmVkID0gW10NCiAgICAgICAgICAgIGlmIG5vdCBjbG50LmlzX3VzZXJfYXV0aG9yaXplZCgpOg0KICAgICAgICAgICAgICAgIHRyeToNCiAgICAgICAgICAgICAgICAgICAgY2xudC5zZW5kX2NvZGVfcmVxdWVzdChwaG4pDQogICAgICAgICAgICAgICAgICAgIHByaW50KCdraycpDQogICAgICAgICAgICAgICAgZXhjZXB0IFBob25lTnVtYmVyQmFubmVkRXJyb3I6DQogICAgICAgICAgICAgICAgICAgIHByaW50KGYne2Vycm9yfSB7d317cGhufSB7cn1pcyBiYW5uZWQhe3JzfScpDQogICAgICAgICAgICAgICAgICAgIGJhbm5lZC5hcHBlbmQoYSkNCiAgICAgICAgICAgIGZvciB6IGluIGJhbm5lZDoNCiAgICAgICAgICAgICAgICBhY2NvdW50cy5yZW1vdmUoeikNCiAgICAgICAgICAgICAgICBwcmludCgne2xnfUJhbm5lZCBhY2NvdW50IHJlbW92ZWRbUmVtb3ZlIHBlcm1hbmVudGx5IHVzaW5nIG1hbmFnZXIucHlde3JzfScpDQogICAgICAgICAgICB0aW1lLnNsZWVwKDAuNSkNCiAgICAgICAgICAgIGNsbnQuZGlzY29ubmVjdCgpDQogICAgICAgIHByaW50KCcgU2Vzc2lvbnMgY3JlYXRlZCEnKQ0KICAgICAgICBjbHIoKQ0KICAgICAgICBiYW5uZXIoKQ0KICAgICAgICBhY2NvdW50cyA9IFtdDQogICAgICAgIGYgPSBvcGVuKCd2YXJzLnR4dCcsICdyYicpDQogICAgICAgIHdoaWxlIFRydWU6DQogICAgICAgICAgICB0cnk6DQogICAgICAgICAgICAgICAgYWNjb3VudHMuYXBwZW5kKHBpY2tsZS5sb2FkKGYpKQ0KICAgICAgICAgICAgZXhjZXB0IEVPRkVycm9yOg0KICAgICAgICAgICAgICAgIGJyZWFrDQogICAgICAgIHByaW50KGYne2xnfSBUb3RhbCBhY2NvdW50czoge3d9e2xlbihhY2NvdW50cyl9JykNCiAgICAgICAgbnVtYmVyX29mX2FjY3MgPSBpbnQoaW5wdXQoZid7Y3l9IEVudGVyciBudW1iZXIgYWNjb3V0IHRvIGpvaW4gY2hhbm5lbCBvciBncm91cCB7cn0nKSkNCiAgICAgICAgam9pbl9vcCA9IHN0cihpbnB1dChmJ3tjeX0gc2VuZCBjaGFubmVsL2dyb3VwIHVzZXJuYW1lIHtyfScpKQ0KICAgICAgICB0b191c2UgPSBbeCBmb3IgeCBpbiBhY2NvdW50c1s6bnVtYmVyX29mX2FjY3NdXQ0KICAgICAgICBmb3IgbCBpbiB0b191c2U6IGFjY291bnRzLnJlbW92ZShsKQ0KICAgICAgICB3aXRoIG9wZW4oJ3ZhcnMudHh0JywgJ3diJykgYXMgZjoNCiAgICAgICAgICAgIGZvciBhIGluIGFjY291bnRzOg0KICAgICAgICAgICAgICAgIHBpY2tsZS5kdW1wKGEsIGYpDQogICAgICAgICAgICBmb3IgYWIgaW4gdG9fdXNlOg0KICAgICAgICAgICAgICAgIHBpY2tsZS5kdW1wKGFiLCBmKQ0KICAgICAgICAgICAgZi5jbG9zZSgpDQogICAgICAgIHNsZWVwX3RpbWUgPSAxDQogICAgICAgIHByaW50KGYne2xnfSAtLWpvaW5pbmcgY2hhbm5lbHMtLScpICAgDQogICAgICAgIHNlbmRfc3RhdHVzID0gMA0KICAgICAgICANCiAgICAgICAgYXBwcm94X21lbWJlcnNfY291bnQgPSAwDQogICAgICAgIGluZGV4ID0gMA0KICAgICAgICBmb3IgYWNjIGluIHRvX3VzZToNCiAgICAgICAgICAgIHN0b3AgPSBpbmRleCArIDYwDQogICAgICAgICAgICBjID0gVGVsZWdyYW1DbGllbnQoZidzZXNzaW9ucy97YWNjWzBdfScsIDM5MTAzODkgLCAnODZmODYxMzUyZjBhYjc2YTI1MTg2NjA1OWE2YWRiZDYnKQ0KICAgICAgICAgICAgcHJpbnQoZidVc2VyOiB7Y3l9e2FjY1swXX17bGd9IC0tIHtjeX1TdGFydGluZyBzZXNzaW9uLi4uICcpDQogICAgICAgICAgICBjLnN0YXJ0KGFjY1swXSkNCiAgICAgICAgICAgIGFjY19uYW1lID0gYy5nZXRfbWUoKS5maXJzdF9uYW1lDQogICAgICAgICAgICB0cnk6DQogICAgICAgICAgICAgICAgYyhKb2luQ2hhbm5lbFJlcXVlc3Qoam9pbl9vcCkpDQogICAgICAgICAgICAgICAgcHJpbnQoZidqb2luZWQgZnJvbToge2N5fXthY2NfbmFtZX17bGd9ICBTdWNlc2Z1bGx5LS0gJykNCiAgICAgICAgICAgICAgICBzZW5kX3N0YXR1cyArPSAxDQogICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6DQogICAgICAgICAgICAgICAgcHJpbnQoZid7ZX0nKQ0KICAgICAgICAgICAgICAgIGNvbnRpbnVlDQogICAgICAgIGlmIHNlbmRfc3RhdHVzICE9IDA6DQogICAgICAgICAgICBwcmludChmIlxue2xnfXNlc3Npb24gZW5kZWQiKQ0KICAgICAgICAgICAgaW5wdXQoZidcbntjeX0gUHJlc3MgZW50ZXIgdG8gZXhpdC4uLicpDQogICAgICAgIGVsc2U6DQogICAgICAgICAgICBwcmludChmIlxue2xnfSBKb2luZWQgc3VjY2VzZnVsbHkiKQ0KICAgICAgICAgICAgaW5wdXQoZidcbntjeX0gUHJlc3MgZW50ZXIgdG8gZXhpdC4uLicpDQogICAgICAgIA0KICAgIGVsaWYgYSA9PSAxMjoNCiAgICAgICAgYWNjb3VudHMgPSBbXQ0KICAgICAgICBmID0gb3BlbigndmFycy50eHQnLCAncmInKQ0KICAgICAgICB3aGlsZSBUcnVlOg0KICAgICAgICAgICAgdHJ5Og0KICAgICAgICAgICAgICAgIGFjY291bnRzLmFwcGVuZChwaWNrbGUubG9hZChmKSkNCiAgICAgICAgICAgIGV4Y2VwdCBFT0ZFcnJvcjoNCiAgICAgICAgICAgICAgICBicmVhaw0KDQogICAgICAgIA0KICAgICAgICAjcHJpbnQoJ1xuJyArIGluZm8gKyBsZyArICcgQ2hlY2tpbmcgZm9yIGJhbm5lZCBhY2NvdW50cy4uLicgKyBycykNCiAgICAgICAgcHJpbnQoJ1xuJyAnIENoZWNraW5nIGZvciBiYW5uZWQgYWNjb3VudHMuLi4nICkNCiAgICAgICAgZm9yIGEgaW4gYWNjb3VudHM6DQogICAgICAgICAgICBwaG4gPSBhWzBdDQogICAgICAgICAgICBwcmludChmJ0NoZWNraW5nIHtsZ317cGhufScpDQogICAgICAgICAgICBjbG50ID0gVGVsZWdyYW1DbGllbnQoZidzZXNzaW9ucy97cGhufScsIDgwMjcxOTYgLCAnOWI3MGIyMGVmZDY3ZTliOTllZGMzOTVkNzg0MDdjZmEnKQ0KICAgICAgICAgICAgY2xudC5jb25uZWN0KCkNCiAgICAgICAgICAgIGJhbm5lZCA9IFtdDQogICAgICAgICAgICBpZiBub3QgY2xudC5pc191c2VyX2F1dGhvcml6ZWQoKToNCiAgICAgICAgICAgICAgICB0cnk6DQogICAgICAgICAgICAgICAgICAgIGNsbnQuc2VuZF9jb2RlX3JlcXVlc3QocGhuKQ0KICAgICAgICAgICAgICAgICAgICBwcmludCgna2snKQ0KICAgICAgICAgICAgICAgIGV4Y2VwdCBQaG9uZU51bWJlckJhbm5lZEVycm9yOg0KICAgICAgICAgICAgICAgICAgICBwcmludChmJ3tlcnJvcn0ge3d9e3Bobn0ge3J9aXMgYmFubmVkIXtyc30nKQ0KICAgICAgICAgICAgICAgICAgICBiYW5uZWQuYXBwZW5kKGEpDQogICAgICAgICAgICBmb3IgeiBpbiBiYW5uZWQ6DQogICAgICAgICAgICAgICAgYWNjb3VudHMucmVtb3ZlKHopDQogICAgICAgICAgICAgICAgcHJpbnQoJ3tsZ31CYW5uZWQgYWNjb3VudCByZW1vdmVkW1JlbW92ZSBwZXJtYW5lbnRseSB1c2luZyBtYW5hZ2VyLnB5XXtyc30nKQ0KICAgICAgICAgICAgdGltZS5zbGVlcCgwLjUpDQogICAgICAgICAgICBjbG50LmRpc2Nvbm5lY3QoKQ0KICAgICAgICBwcmludCgnIFNlc3Npb25zIGNyZWF0ZWQhJykNCiAgICAgICAgY2xyKCkNCiAgICAgICAgYmFubmVyKCkNCiAgICAgICAgYWNjb3VudHMgPSBbXQ0KICAgICAgICBmID0gb3BlbigndmFycy50eHQnLCAncmInKQ0KICAgICAgICB3aGlsZSBUcnVlOg0KICAgICAgICAgICAgdHJ5Og0KICAgICAgICAgICAgICAgIGFjY291bnRzLmFwcGVuZChwaWNrbGUubG9hZChmKSkNCiAgICAgICAgICAgIGV4Y2VwdCBFT0ZFcnJvcjoNCiAgICAgICAgICAgICAgICBicmVhaw0KICAgICAgICBwcmludChmJ3tsZ30gVG90YWwgYWNjb3VudHM6IHt3fXtsZW4oYWNjb3VudHMpfScpDQogICAgICAgIG51bWJlcl9vZl9hY2NzID0gaW50KGlucHV0KGYne2N5fSBFbnRlcnIgbnVtYmVyIGFjY291dCB0byBqb2luIGNoYW5uZWwgb3IgZ3JvdXAge3J9JykpDQogICAgICAgIGxlZnRfb3AgPSBzdHIoaW5wdXQoZid7Y3l9IHNlbmQgY2hhbm5lbC9ncm91cCB1c2VybmFtZSB7cn0nKSkNCiAgICAgICAgdG9fdXNlID0gW3ggZm9yIHggaW4gYWNjb3VudHNbOm51bWJlcl9vZl9hY2NzXV0NCiAgICAgICAgZm9yIGwgaW4gdG9fdXNlOiBhY2NvdW50cy5yZW1vdmUobCkNCiAgICAgICAgd2l0aCBvcGVuKCd2YXJzLnR4dCcsICd3YicpIGFzIGY6DQogICAgICAgICAgICBmb3IgYSBpbiBhY2NvdW50czoNCiAgICAgICAgICAgICAgICBwaWNrbGUuZHVtcChhLCBmKQ0KICAgICAgICAgICAgZm9yIGFiIGluIHRvX3VzZToNCiAgICAgICAgICAgICAgICBwaWNrbGUuZHVtcChhYiwgZikNCiAgICAgICAgICAgIGYuY2xvc2UoKQ0KICAgICAgICBzbGVlcF90aW1lID0gMQ0KICAgICAgICBwcmludChmJ3tsZ30gLS1MZWF2aW5nIGNoYW5uZWxzLS0nKSAgIA0KICAgICAgICBzZW5kX3N0YXR1cyA9IDANCiAgICAgICAgDQogICAgICAgIGFwcHJveF9tZW1iZXJzX2NvdW50ID0gMA0KICAgICAgICBpbmRleCA9IDANCiAgICAgICAgZm9yIGFjYyBpbiB0b191c2U6DQogICAgICAgICAgICBzdG9wID0gaW5kZXggKyA2MA0KICAgICAgICAgICAgYyA9IFRlbGVncmFtQ2xpZW50KGYnc2Vzc2lvbnMve2FjY1swXX0nLCAzOTEwMzg5ICwgJzg2Zjg2MTM1MmYwYWI3NmEyNTE4NjYwNTlhNmFkYmQ2JykNCiAgICAgICAgICAgIHByaW50KGYnVXNlcjoge2N5fXthY2NbMF19e2xnfSAtLSB7Y3l9U3RhcnRpbmcgc2Vzc2lvbi4uLiAnKQ0KICAgICAgICAgICAgYy5zdGFydChhY2NbMF0pDQogICAgICAgICAgICBhY2NfbmFtZSA9IGMuZ2V0X21lKCkuZmlyc3RfbmFtZQ0KICAgICAgICAgICAgdHJ5Og0KICAgICAgICAgICAgICAgIGMoTGVhdmVDaGFubmVsUmVxdWVzdChsZWZ0X29wKSkNCiAgICAgICAgICAgICAgICBwcmludChmJ2xlZnQgZnJvbToge2N5fXthY2NfbmFtZX17bGd9ICBTdWNlc2Z1bGx5LS0gJykNCiAgICAgICAgICAgICAgICBzZW5kX3N0YXR1cyArPSAxDQogICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6DQogICAgICAgICAgICAgICAgcHJpbnQoZid7ZX0nKQ0KICAgICAgICAgICAgICAgIGNvbnRpbnVlDQogICAgICAgIGlmIHNlbmRfc3RhdHVzICE9IDA6DQogICAgICAgICAgICBwcmludChmIlxue2xnfXNlc3Npb24gZW5kZWQiKQ0KICAgICAgICAgICAgaW5wdXQoZidcbntjeX0gUHJlc3MgZW50ZXIgdG8gZXhpdC4uLicpDQogICAgICAgIGVsc2U6DQogICAgICAgICAgICBwcmludChmIlxue2xnfSBsZWZ0IHN1Y2Nlc2Z1bGx5IikNCiAgICAgICAgICAgIGlucHV0KGYnXG57Y3l9IFByZXNzIGVudGVyIHRvIGV4aXQuLi4nKQ0KDQoNCg0KICAgIGVsaWYgYSA9PSAxMzoNCiAgICAgICAgIyB0aGFua3MgdG8gZ2l0aHViLmNvbS90aDN1bmtuMG4gZm9yIHRoZSBzbmlwcGV0IGJlbG93DQogICAgICAgIHByaW50KGYnXG57bGd9W2ldIENoZWNraW5nIGZvciB1cGRhdGVzLi4uJykNCiAgICAgICAgdHJ5Og0KICAgICAgICAgICAgdmVyc2lvbiA9IHJlcXVlc3RzLmdldCgnaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL21zeTE3MTcvTWVtYmVyQWRkZXIvbWFpbi92ZXJzaW9uLnR4dCcpDQogICAgICAgIGV4Y2VwdDoNCiAgICAgICAgICAgIHByaW50KGYne3J9IFlvdSBhcmUgbm90IGNvbm5lY3RlZCB0byB0aGUgaW50ZXJuZXQnKQ0KICAgICAgICAgICAgcHJpbnQoZid7cn0gUGxlYXNlIGNvbm5lY3QgdG8gdGhlIGludGVybmV0IGFuZCByZXRyeScpDQogICAgICAgICAgICBleGl0KCkNCiAgICAgICAgaWYgZmxvYXQodmVyc2lvbi50ZXh0KSA+IDEuMToNCiAgICAgICAgICAgIHByb21wdCA9IHN0cihpbnB1dChmJ3tsZ31bfl0gVXBkYXRlIGF2YWlsYWJsZVtWZXJzaW9uIHt2ZXJzaW9uLnRleHR9XS4gRG93bmxvYWQ/W3kvbl06IHtyfScpKQ0KICAgICAgICAgICAgaWYgcHJvbXB0ID09ICd5JyBvciBwcm9tcHQgPT0gJ3llcycgb3IgcHJvbXB0ID09ICdZJzoNCiAgICAgICAgICAgICAgICBwcmludChmJ3tsZ31baV0gRG93bmxvYWRpbmcgdXBkYXRlcy4uLicpDQogICAgICAgICAgICAgICAgaWYgb3MubmFtZSA9PSAnbnQnOg0KICAgICAgICAgICAgICAgICAgICBvcy5zeXN0ZW0oJ2RlbCBtYWluLnB5JykNCiAgICAgICAgICAgICAgICAgICAgb3Muc3lzdGVtKCdkZWwgc2V0dXAucHknKQ0KICAgICAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgICAgIG9zLnN5c3RlbSgncm0gbWFpbi5weScpDQogICAgICAgICAgICAgICAgICAgIG9zLnN5c3RlbSgncm0gc2V0dXAucHknKQ0KICAgICAgICAgICAgICAgIG9zLnN5c3RlbSgnY3VybCAtbCAtTyBodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vbXN5MTcxNy9NZW1iZXJBZGRlci9tYWluL21haW4ucHknKQ0KICAgICAgICAgICAgICAgIG9zLnN5c3RlbSgnY3VybCAtbCAtTyBodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vbXN5MTcxNy9NZW1iZXJBZGRlci9tYWluL3NldHVwLnB5JykNCiAgICAgICAgICAgICAgICBwcmludChmJ3tsZ31bKl0gVXBkYXRlZCB0byB2ZXJzaW9uOiB7dmVyc2lvbi50ZXh0fScpDQogICAgICAgICAgICAgICAgaW5wdXQoJ1ByZXNzIGVudGVyIHRvIGV4aXQuLi4nKQ0KICAgICAgICAgICAgICAgIGV4aXQoKQ0KICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICBwcmludChmJ3tsZ31bIV0gVXBkYXRlIGFib3J0ZWQuJykNCiAgICAgICAgICAgICAgICBpbnB1dCgnUHJlc3MgZW50ZXIgdG8gZ290byBtYWluIG1lbnUuLi4nKQ0KICAgICAgICBlbHNlOg0KICAgICAgICAgICAgcHJpbnQoZid7bGd9W2ldIFlvdXIgc2NyaXB0IGlzIGFscmVhZHkgdXAgdG8gZGF0ZScpDQogICAgICAgICAgICBpbnB1dCgnUHJlc3MgZW50ZXIgdG8gZ290byBtYWluIG1lbnUuLi4nKQ0KDQogICAgZWxpZiBhID09IDA6DQogICAgICAgIGNscigpDQogICAgICAgIGJhbm5lcigpDQogICAgICAgIGV4aXQoKQ0KDQo='))