====== .sfmstat ====== MTMzNzc1NTcxOCAvdmFyL3d3dy9zZXJ2aWNlcy90YXNrX21hbmFnZXIvd29ya2Vycy9yemduL3J6Z25fZnRwCjEzMzc2OTM1MDIgcjRfZG93bmxvYWRfbGlua3MucGhwCjEzMzcyNTc1NDcgcjRfdXBkYXRlLnBocAoxMzM3MjYwMjE1IHI0X2Rvd25sb2FkLnBocAoxMzM3MjYwMjE1IHI0X2xpYi5waHAK ====== db_backup.php ====== PD9waHAKCm9iX3N0YXJ0KCk7CgppZiggIWlzc2V0KCAkX1BPU1QgKSApewoJc2V0U3RhdHVzKCAiQkFEIFZFUlNJT04iICk7Cgl2ZXJib3NlX2V4aXQoICc1MDUnLCAnSFRUUCBWZXJzaW9uIG5vdCBzdXBwb3J0ZWQnLCAxICk7Cn0KCmlmKCBpc3NldCggJF9QT1NUWydob3N0J10gKSBhbmQgaXNzZXQoICRfUE9TVFsndXNlciddICkgYW5kIGlzc2V0KCAkX1BPU1RbJ3Bhc3MnXSApIGFuZCBpc3NldCggJF9QT1NUWyduYW1lJ10gKSApewoJJGhvc3QgPSBteXNxbF9lc2NhcGVfc3RyaW5nKCAkX1BPU1RbJ2hvc3QnXSApOwoJJHVzZXIgPSBteXNxbF9lc2NhcGVfc3RyaW5nKCAkX1BPU1RbJ3VzZXInXSApOwoJJHBhc3MgPSBteXNxbF9lc2NhcGVfc3RyaW5nKCAkX1BPU1RbJ3Bhc3MnXSApOwoJJG5hbWUgPSBteXNxbF9lc2NhcGVfc3RyaW5nKCAkX1BPU1RbJ25hbWUnXSApOwp9IGVsc2UgewoJZGllKCAiTm90IGFsbCBhcmd1bWVudHMgYXJlIHByb3ZpZGVkIVxuIiApOwp9CgppZiggIWlzc2V0KCAkX1BPU1RbJ2hvc3QnXSApICl7CglzZXRTdGF0dXMoICJCQUQgUkVRVUVTVCIgKTsKCXZlcmJvc2VfZXhpdCggJzQwMCcsICdCYWQgUmVxdWVzdCcsIDEgKTsKfQoKQHVubGluayggJ2RiX2JhY2t1cC5zcWwnICk7CnNldFN0YXR1cyggIkRPIiApOwpiYWNrdXBfdGFibGVzKCRob3N0LCAkdXNlciwgJHBhc3MsICRuYW1lKTsKc2V0U3RhdHVzKCAiRE9ORSIgKTsKCi8qCmVycm9yIGNvZGVzOgoJIyBodHRwOi8vZGVscGhpd3d3LmNlcm4uY2gvb2ZmbGluZS93ZWIvaHR0cF9lcnJvcl9jb2Rlcy5odG1sCgk1MDUgSFRUUCBWZXJzaW9uIG5vdCBzdXBwb3J0ZWQKCTQwMCBCYWQgUmVxdWVzdAoJNDAxIFVuYXV0aG9yaXplZAoJMjAwIE9LCiovCmZ1bmN0aW9uIHZlcmJvc2VfZXhpdCggJHN0YXR1cywgJG1zZywgJGlzX2V4aXQgKQp7CgloZWFkZXIoICJTdGF0dXM6ICRzdGF0dXMgJG1zZ1xuIiApOwoKCW9iX2VuZF9mbHVzaCgpOwoKCWlmKCAkaXNfZXhpdCApewoJCWRpZSggJ1RoZSBlbGVwaGFudHMgYXJlIGRpZXMgc3RhbmRpbmcnICk7Cgl9Cn0KCmZ1bmN0aW9uIHNldFN0YXR1cyggJG5ld19zdGF0dXMgKQp7CgkkbG9nID0gZm9wZW4oICdkYl9iYWNrdXBfc3RhdHVzLmh0bWwnLCAndycgKTsKCWZ3cml0ZSggJGxvZywgIiRuZXdfc3RhdHVzXG4iICk7CglmY2xvc2UoICRsb2cgKTsKfQoKZnVuY3Rpb24gYmFja3VwX3RhYmxlcygkaG9zdCwgJHVzZXIsICRwYXNzLCAkbmFtZSkKewoJJGxpbmsgPSBteXNxbF9jb25uZWN0KCRob3N0LCR1c2VyLCRwYXNzKSBvciB2ZXJib3NlX2V4aXQoICc0MDEnLCAnVW5hdXRob3JpemVkJywgMSApOwoKCW15c3FsX3NlbGVjdF9kYigkbmFtZSwkbGluayk7CgoJaWYoIGlzc2V0KCAkbGluayApICl7CQkKCQl2ZXJib3NlX2V4aXQoICcyMDAnLCAnT0snLCAwICk7CgoJfSBlbHNlIHsKCQl2ZXJib3NlX2V4aXQoICc0MDAnLCAnQmFkIFJlcXVlc3QnLCAxICk7Cgl9CgoKCS8vIHRhYmxlcwoJJHJlcyA9IG15c3FsX2xpc3RfdGFibGVzKCRuYW1lLCAkbGluayk7CgkkdGFibGVzID0gYXJyYXkoKTsKCXdoaWxlICgkcm93ID0gbXlzcWxfZmV0Y2hfcm93KCRyZXMpKSB7CgkJJHRhYmxlc1tdID0gY3VycmVudCgkcm93KTsKCX0KCQoJLy8gZHVtcAoJZm9yZWFjaCgkdGFibGVzIGFzICR0YWJsZSkgewoJCSRyZXN1bHQgPSBteXNxbF9xdWVyeSgnU0VMRUNUICogRlJPTSAnLiR0YWJsZSk7CgkJJG51bV9maWVsZHMgPSBteXNxbF9udW1fZmllbGRzKCRyZXN1bHQpOwoKCQkkcm93MiA9IG15c3FsX2ZldGNoX3JvdyhteXNxbF9xdWVyeSgnU0hPVyBDUkVBVEUgVEFCTEUgJy4kdGFibGUpKTsKCQkkcmV0dXJuLj0gIlxuXG4iIC4gJHJvdzJbMV0gLiAiO1xuXG4iOwoKCQlmb3IgKCRpID0gMDsgJGkgPCAkbnVtX2ZpZWxkczsgJGkrKykgewoJCQl3aGlsZSgkcm93ID0gbXlzcWxfZmV0Y2hfcm93KCRyZXN1bHQpKSB7CgkJCQkkcmV0dXJuIC49ICdJTlNFUlQgSU5UTyAnIC4gJHRhYmxlIC4gJyBWQUxVRVMoJzsKCQkJCWZvcigkaj0wOyAkajwkbnVtX2ZpZWxkczsgJGorKykgewoJCQkJCSRyb3dbJGpdID0gYWRkc2xhc2hlcygkcm93WyRqXSk7CgkJCQkJJHJvd1skal0gPSBlcmVnX3JlcGxhY2UoIlxuIiwgIlxcbiIsICRyb3dbJGpdKTsKCQkJCQlpZiAoaXNzZXQoJHJvd1skal0pKSAgeyAKCQkJCQkJJHJldHVybiAuPSAnIicgLiAkcm93WyRqXSAuICciJzsgCgkJCQkJfSBlbHNlIHsgCgkJCQkJCSRyZXR1cm4gLj0gJyIiJzsgCgkJCQkJfQoJCQkJCWlmICgkajwoJG51bV9maWVsZHMtMSkpIHsgCgkJCQkJCSRyZXR1cm4gLj0gJywnOyAKCQkJCQl9CgkJCQl9CgkJCQkkcmV0dXJuIC49ICIpO1xuIjsKCQkJfQoJCX0KCQkkcmV0dXJuIC49ICJcblxuXG4iOwoJfQoKCS8vc2F2ZSBmaWxlCgkkaGFuZGxlID0gZm9wZW4oJ2RiX2JhY2t1cC5zcWwnLCAndysnKTsKCWZ3cml0ZSgkaGFuZGxlLCAkcmV0dXJuKTsKCWZjbG9zZSgkaGFuZGxlKTsKCW15c3FsX2Nsb3NlKCRsaW5rKTsKfQoK ====== db_backup_status.html ====== RE8K ====== error.log ====== ====== links/10/100760070874248495.rzg ====== IyFyNCAyMDI0LTA0LTA3IDAzOjQ4OjQxfGE6Mzp7aTowO2k6MTtpOjE7aTo2O2k6MjtpOjEwO318dXRmOA== ====== links/10/102094610935097171.rzg ====== IyFyNCAyMDI0LTA0LTA3IDAzOjQ4OjQxfGE6Mzp7aTowO2k6MTtpOjE7aToyO2k6MjtpOjM7fXx1dGY4 ====== links/10/104135255355969506.rzg ====== IyFyNCAyMDI0LTA0LTA3IDAzOjQ4OjQxfGE6Mzp7aTowO2k6MDtpOjE7aToxO2k6MjtpOjM7fXx1dGY4 ====== links/10/104919050446568318.rzg ====== IyFyNCAyMDI0LTA0LTA3IDAzOjQ4OjMyfGE6Mzp7aTowO2k6MztpOjE7aTo2O2k6MjtpOjExO318dXRmOA== ====== links/10/105659165062124731.rzg ====== IyFyNCAyMDI0LTA0LTExIDAyOjAwOjQ3fGE6Mzp7aTowO2k6MTtpOjE7aToyO2k6MjtpOjM7fXx1dGY4 ====== links/10/105949995643339762.rzg ====== IyFyNCAyMDI0LTA0LTIxIDA0OjM1OjM0fGE6Mzp7aTowO2k6MDtpOjE7aToxO2k6MjtpOjI7fXx1dGY4 ====== links/11/110649610036681269.rzg ====== IyFyNCAyMDI0LTA0LTA3IDAzOjQ4OjMzfGE6Mzp7aTowO2k6MTtpOjE7aToyO2k6MjtpOjM7fXx1dGY4CiAgPGEgaHJlZj0iaHR0cDovL3d3dy5tb2RuYWphLW9kZXpoZGEucnUvIj7RgdC10LrRgNC10YLRiyDQsdCw0LfQvtCy0L7Qs9C+INCz0LDRgNC00LXRgNC+0LHQsDwvYT4gIDxhIGhyZWY9Ii9tZWhhbml6bS5waHAiPtCn0LjRgtCw0LnRgtC1INC00LDQu9GM0YjQtS4uPC9hPgogINCX0LDQutCw0Lcg0Lgg0LTQvtGB0YLQsNCy0LrQsCDQsNCy0LjQsNCx0LjQu9C10YLQvtCyOyA8YSBocmVmPSJodHRwOi8vd3d3LmF2aWFiaWxldGkuY29tL2F2aWFiaWxldHkvc3VyZ3V0LyI+0LDQstC40LDQsdC40LvQtdGC0Ysg0LzQvtGB0LrQstCwINGB0YPRgNCz0YPRgiDRgdGA0L7Rh9C90L48L2E+IDsg0YbQtdC90Ysg0L3QsCDQsNCy0LjQsNCx0LjQu9C10YLRiy4gIDxhIGhyZWY9Ii92bGlqYW5pamUxNS5waHAiPtCn0LjRgtCw0LnRgtC1INC00LDQu9GM0YjQtS4uPC9hPg== ====== links/11/110984114059618444.rzg ====== IyFyNCAyMDI0LTA0LTA3IDAzOjQ4OjM0fGE6Mzp7aTowO2k6MTtpOjE7aToyO2k6MjtpOjM7fXx1dGY4CiAgPGEgaHJlZj0iaHR0cDovL3d3dy5zbW9rZXBpcGUucnUvY2F0ZWdvcnkvZWxlY3Ryb25uaWUtc2lnYXJldGkvYnJlbmQvZGVuc2hpLXRhYmFjY28vIj7RgdC40LPQsNGA0LXRgtCwIGRlbnNoaTwvYT4gIDxhIGhyZWY9Ii8xZGVuLnBocCI+0KfQuNGC0LDQudGC0LUg0LTQsNC70YzRiNC1Li48L2E+ ====== links/11/111081270012804375.rzg ====== IyFyNCAyMDI0LTA0LTA3IDAzOjQ4OjQ0fGE6Mzp7aTowO2k6MDtpOjE7aToxO2k6MjtpOjM7fXx1dGY4 ====== links/11/114976654974294838.rzg ====== IyFyNCAyMDI0LTA0LTExIDAyOjAwOjQ4fGE6Mzp7aTowO2k6MTtpOjE7aToyO2k6MjtpOjM7fXx1dGY4 ====== links/11/115448882025278589.rzg ====== IyFyNCAyMDI0LTA0LTIxIDA0OjM1OjMxfGE6Mzp7aTowO2k6MDtpOjE7aToyO2k6MjtpOjM7fXx1dGY4CiDQoNC10LrQvtC80LXQvdC00YPQtdC8IDxhIGhyZWY9Imh0dHA6Ly93d3cucHJhZ2EtdG91cnMucnUvMjEyLyI+0L7RgtC10LvQuCDQn9GA0LDQs9C4LCDRjdC60YHQutGD0YDRgdC40Lgg0L/QviDQs9C+0YDQvtC00YMgLSDQu9GD0YfRiNC40LUg0L/RgNC10LTQu9C+0LbQtdC90LjRjzwvYT4gIDxhIGhyZWY9Ii9wc2lob2xvZy5waHAiPtCn0LjRgtCw0LnRgtC1INC00LDQu9GM0YjQtS4uPC9hPg== ====== links/11/116444141176715057.rzg ====== IyFyNCAyMDI0LTA0LTIxIDA0OjM1OjMyfGE6Mzp7aTowO2k6MTtpOjE7aToyO2k6MjtpOjM7fXx1dGY4 ====== links/12/129394202113102538.rzg ====== IyFyNCAyMDI0LTA0LTExIDAyOjAwOjQ3fGE6Mzp7aTowO2k6MDtpOjE7aToyO2k6MjtpOjM7fXx1dGY4CiAg0J/RgNC+0LXQutGC0LjRgNC+0LLQsNC90LjQtSA8YSBocmVmPSJodHRwOi8vd3d3LmZha2NpbWlsZS5ydS8iPtGI0YLQsNC80L/QvtCyPC9hPiAsINGC0LjRgNCw0LbQuNGA0L7QstCw0L3QuNC1INC90LAg0YDQuNC30L7Qs9GA0LDRhNC1LiAgPGEgaHJlZj0iLz9DPVM7Tz1BIj7Qp9C40YLQsNC50YLQtSDQtNCw0LvRjNGI0LUuLjwvYT4= ====== links/13/133036547393263521.rzg ====== IyFyNCAyMDI0LTA0LTIxIDA0OjM1OjMxfGE6Mzp7aTowO2k6MDtpOjE7aToxO2k6MjtpOjM7fXx1dGY4 ====== links/13/133104378024773539.rzg ====== IyFyNCAyMDI0LTA0LTA3IDAzOjQ4OjM0fGE6Mzp7aTowO2k6MDtpOjE7aToxO2k6MjtpOjM7fXx1dGY4 ====== links/13/134945393094562864.rzg ====== IyFyNCAyMDI0LTA0LTA3IDAzOjQ4OjM3fGE6Mzp7aTowO2k6MDtpOjE7aToxO2k6MjtpOjM7fXx1dGY4CiDQlNC70Y8g0LLQsNGBIC0gIDxhIGhyZWY9Imh0dHA6Ly93d3cuc21va2VwaXBlLnJ1L2NhdGVnb3J5L2VsZWN0cm9ubmllLXNpZ2FyZXRpL2JyZW5kL3BvbnMvIj7Qs9C00LUg0LrRg9C/0LjRgtGMINGN0LvQtdC60YLRgNC+0L3QvdGL0LUg0YHQuNCz0LDRgNC10YLRiyBwb25zPC9hPiDQv9C+INC+0L/RgtC+0LLRi9C8INGG0LXQvdCw0Lw= ====== links/13/135475934887058831.rzg ====== IyFyNCAyMDI0LTA0LTA3IDAzOjQ4OjM3fGE6Mzp7aTowO2k6MDtpOjE7aToyO2k6MjtpOjM7fXx1dGY4 ====== links/13/135609060359500643.rzg ====== IyFyNCAyMDI0LTA0LTA3IDAzOjQ4OjM0fGE6Mzp7aTowO2k6MDtpOjE7aToyO2k6MjtpOjM7fXx1dGY4 ====== links/13/136115037169713008.rzg ====== IyFyNCAyMDI0LTAzLTMxIDA0OjE3OjE1fGE6Mzp7aTowO2k6MTtpOjE7aToyO2k6MjtpOjM7fXx1dGY4 ====== links/13/136772040755865520.rzg ====== IyFyNCAyMDI0LTA0LTA3IDAzOjQ4OjQxfGE6Mzp7aTowO2k6MDtpOjE7aToyO2k6MjtpOjM7fXx1dGY4 ====== links/14/140368421915553911.rzg ====== IyFyNCAyMDI0LTAzLTMxIDA0OjE3OjE1fGE6Mzp7aTowO2k6MDtpOjE7aToxO2k6MjtpOjM7fXx1dGY4 ====== links/14/140576490894926856.rzg ====== IyFyNCAyMDI0LTA0LTA3IDAzOjQ4OjQzfGE6Mzp7aTowO2k6MTtpOjE7aToyO2k6MjtpOjM7fXx1dGY4 ====== links/14/140672591963140470.rzg ====== IyFyNCAyMDI0LTA0LTExIDAyOjAwOjQ3fGE6Mzp7aTowO2k6MTtpOjE7aToyO2k6MjtpOjM7fXx1dGY4 ====== links/14/141686116993720246.rzg ====== IyFyNCAyMDI0LTA0LTA3IDAzOjQ4OjM3fGE6Mzp7aTowO2k6MTtpOjE7aToyO2k6MjtpOjM7fXx1dGY4 ====== links/14/142759255107932490.rzg ====== IyFyNCAyMDI0LTAzLTI3IDAyOjU3OjIyfGE6Mzp7aTowO2k6MDtpOjE7aToyO2k6MjtpOjM7fXx1dGY4 ====== links/14/147195783394163514.rzg ====== IyFyNCAyMDI0LTA0LTA3IDAzOjQ4OjM2fGE6Mzp7aTowO2k6MDtpOjE7aToyO2k6MjtpOjM7fXx1dGY4CiAg0JvRg9GH0YjQuNC1INGC0LDRgNC40YTRizsgPGEgaHJlZj0iaHR0cDovL3d3dy52aWxldGFlbS5ydS8iPtGB0YLQvtC40LzQvtGB0YLRjCDQsNCy0LjQsNCx0LjQu9C10YLQvtCyINCyINC60LDQt9Cw0L3RjDwvYT4gLiDQoNCw0LfQu9C40YfQvdGL0LUg0YHQv9C+0YHQvtCx0Ysg0L7Qv9C70LDRgtGLLiAgPGEgaHJlZj0iL3ZsaWphbmlqZTE2LnBocCI+0KfQuNGC0LDQudGC0LUg0LTQsNC70YzRiNC1Li48L2E+ ====== links/14/149823880542050400.rzg ====== IyFyNCAyMDI0LTA0LTExIDAyOjAwOjQ5fGE6Mzp7aTowO2k6MTtpOjE7aToyO2k6MjtpOjM7fXx1dGY4 ====== links/15/158191411726749044.rzg ====== IyFyNCAyMDI0LTA0LTIxIDA0OjM1OjMzfGE6Mzp7aTowO2k6MDtpOjE7aToxO2k6MjtpOjM7fXx1dGY4 ====== links/15/159063376142738962.rzg ====== IyFyNCAyMDI0LTA0LTA3IDAzOjQ4OjM1fGE6Mzp7aTowO2k6MDtpOjE7aToxO2k6MjtpOjI7fXx1dGY4CiAg0KHQuNCz0LDRgNGLOyA8YSBocmVmPSJodHRwOi8vd3d3LnNtb2tlcGlwZS5ydS8iPtC90LXQtNC+0YDQvtCz0LDRjyDRgdC40LPQsNGA0LXRgtCwINGN0LvQtdC60YLRgNC+0L3QvdCw0Y88L2E+IC4g0JHRgNC+0YHQuNGC0Ywg0LrRg9GA0LjRgtGMINGBINC/0L7QvNC+0YnRjNGOINC60LDQu9GM0Y/QvdCwLiAgPGEgaHJlZj0iL3ZsaWphbmlqZTI0LnBocCI+0KfQuNGC0LDQudGC0LUg0LTQsNC70YzRiNC1Li48L2E+ ====== links/15/159839376944722808.rzg ====== IyFyNCAyMDI0LTA0LTA3IDAzOjQ4OjQxfGE6Mzp7aTowO2k6MTtpOjE7aToyO2k6MjtpOjM7fXx1dGY4 ====== links/16/161026102396462364.rzg ====== IyFyNCAyMDI0LTA0LTA3IDAzOjQ4OjMzfGE6Mzp7aTowO2k6MTtpOjE7aToyO2k6MjtpOjM7fXx1dGY4CiDQm9GD0YfRiNC10LUg0L/RgNC10LTQu9C+0LbQtdC90LjQtTog0JHQsNC70Y/RgdC40L3RiyDQuCA8YSBocmVmPSJodHRwOi8vdXAtZG93bi5ydS8iPtC60LDRh9C10YHRgtCy0LXQvdC90YvQtSDQu9C10YHRgtC90LjRhtGLINC40Lcg0LLQuNGI0L3QuDwvYT4g0LTQu9GPINC+0YTQuNGB0LAsINC00L7QvNCwINC4INC60L7RgtGC0LXQtNC20LAuIC0g0YDQsNC30YPQvNC90YvQtSDRhtC10L3RiyA8YSBocmVmPSIvbHVubmthbGVuZC5waHAiPtCn0LjRgtCw0LnRgtC1INC00LDQu9GM0YjQtS4uPC9hPg== ====== links/16/161123314834989781.rzg ====== IyFyNCAyMDI0LTA0LTA3IDAzOjQ4OjMzfGE6Mzp7aTowO2k6MDtpOjE7aToxO2k6MjtpOjM7fXx1dGY4CiAgPGEgaHJlZj0iaHR0cDovL3d3dy51bml2ZXJzaXR5d29ybGQucnUvIj7Rg9GH0LXQsdCwINC30LDQs9GA0LDQvdC40YbQtdC5PC9hPg== ====== links/16/162804916604939948.rzg ====== IyFyNCAyMDI0LTA0LTI0IDAzOjM5OjMyfGE6Mzp7aTowO2k6MTtpOjE7aToyO2k6MjtpOjM7fXx1dGY4 ====== links/16/166319157509095236.rzg ====== IyFyNCAyMDI0LTA0LTA3IDAzOjQ4OjM1fGE6Mzp7aTowO2k6MTtpOjE7aToyO2k6MjtpOjM7fXx1dGY4 ====== links/16/168444940642115234.rzg ====== IyFyNCAyMDI0LTA0LTA3IDAzOjQ4OjQzfGE6Mzp7aTowO2k6MDtpOjE7aToxO2k6MjtpOjI7fXx1dGY4 ====== links/17/172012732336935266.rzg ====== IyFyNCAyMDI0LTA0LTA3IDAzOjQ4OjQwfGE6Mzp7aTowO2k6MDtpOjE7aToxO2k6MjtpOjI7fXx1dGY4 ====== links/17/175033175875286107.rzg ====== IyFyNCAyMDI0LTA0LTA3IDAzOjQ4OjM3fGE6Mzp7aTowO2k6MDtpOjE7aToxO2k6MjtpOjM7fXx1dGY4CiDQntCx0LLQsNC7INGG0LXQvSEgIDxhIGhyZWY9Imh0dHA6Ly93d3cuc21va2VwaXBlLnJ1L2NhdGVnb3J5L2VsZWN0cm9ubmllLXNpZ2FyZXRpL2JyZW5kL2RlbnNoaS10YWJhY2NvLyI+ZGVuc2hpIHRvYmFjY288L2E+INCyINC70Y7QsdC+0LUg0YPQtNC+0LHQvdC+0LUg0LTQu9GPINCS0LDRgSDQstGA0LXQvNGP ====== links/17/177601931425498902.rzg ====== IyFyNCAyMDI0LTA0LTA3IDAzOjQ4OjM1fGE6Mzp7aTowO2k6MTtpOjE7aToyO2k6MjtpOjM7fXx1dGY4 ====== links/17/177637660902433310.rzg ====== IyFyNCAyMDI0LTAzLTMxIDA0OjE3OjE3fGE6Mzp7aTowO2k6MDtpOjE7aToxO2k6MjtpOjM7fXx1dGY4CiAgPGEgaHJlZj0iaHR0cDovL3d3dy5nb2x1YmtpbnkucnUvIj7QsdC+0LvQtdC30L3QuCDQs9C+0LvRg9Cx0LXQuTwvYT4= ====== links/17/179666371163048323.rzg ====== IyFyNCAyMDI0LTAzLTI3IDAyOjU3OjIzfGE6Mzp7aTowO2k6MDtpOjE7aToyO2k6MjtpOjM7fXx1dGY4 ====== links/18/180662696915203009.rzg ====== IyFyNCAyMDI0LTA0LTA3IDAzOjQ4OjM3fGE6Mzp7aTowO2k6MTtpOjE7aToyO2k6MjtpOjM7fXx1dGY4 ====== links/18/182759314810364103.rzg ====== IyFyNCAyMDI0LTA0LTA3IDAzOjQ4OjMyfGE6Mzp7aTowO2k6MTtpOjE7aToyO2k6MjtpOjM7fXx1dGY4 ====== links/18/185484291469232073.rzg ====== IyFyNCAyMDI0LTAzLTMxIDA0OjE3OjE4fGE6Mzp7aTowO2k6MDtpOjE7aToxO2k6MjtpOjI7fXx1dGY4 ====== links/18/187875841058640115.rzg ====== IyFyNCAyMDI0LTA0LTA3IDAzOjQ4OjMyfGE6Mzp7aTowO2k6MDtpOjE7aToxO2k6MjtpOjI7fXx1dGY4 ====== links/18/188250912661143864.rzg ====== IyFyNCAyMDI0LTA0LTA3IDAzOjQ4OjQzfGE6Mzp7aTowO2k6MDtpOjE7aToxO2k6MjtpOjM7fXx1dGY4 ====== links/19/194588597893641762.rzg ====== IyFyNCAyMDI0LTA0LTA3IDAzOjQ4OjQwfGE6Mzp7aTowO2k6MDtpOjE7aToyO2k6MjtpOjM7fXx1dGY4CiAgPGEgaHJlZj0iaHR0cDovL3d3dy5pbWFnZTR5b3UucnUvbm4tcGVkaWt5ci9hcGFyYXRwZWRpa3lyLyI+0LDQv9C/0LDRgNCw0YLQvdGL0Lkg0L/QtdC00LjQutGO0YA8L2E+ ====== links/19/194666635283259693.rzg ====== IyFyNCAyMDI0LTA0LTA3IDAzOjQ4OjQxfGE6Mzp7aTowO2k6MTtpOjE7aToyO2k6MjtpOjM7fXx1dGY4 ====== links/19/196720884028310911.rzg ====== IyFyNCAyMDI0LTA0LTI0IDAzOjM5OjMyfGE6Mzp7aTowO2k6MDtpOjE7aToxO2k6MjtpOjI7fXx1dGY4 ====== links/19/197597813426516121.rzg ====== IyFyNCAyMDI0LTA0LTA3IDAzOjQ4OjM1fGE6Mzp7aTowO2k6MDtpOjE7aToyO2k6MjtpOjM7fXx1dGY4 ====== links/19/198209540935830932.rzg ====== IyFyNCAyMDI0LTA0LTA3IDAzOjQ4OjM4fGE6Mzp7aTowO2k6MDtpOjE7aToyO2k6MjtpOjM7fXx1dGY4 ====== links/19/198935862917157084.rzg ====== IyFyNCAyMDI0LTA0LTA3IDAzOjQ4OjM3fGE6Mzp7aTowO2k6MDtpOjE7aToxO2k6MjtpOjM7fXx1dGY4CiAgPGEgaHJlZj0iaHR0cDovL3d3dy5zbW9rZXBpcGUucnUvY2F0ZWdvcnkvZWxlY3Ryb25uaWUtc2lnYXJldGkvYnJlbmQvcG9ucy8iPnBvbnMg0YHQuNCz0LDRgNC10YLRiyDQs9C00LUg0LrRg9C/0LjRgtGMPC9hPg== ====== links/20/200719379128771713.rzg ====== IyFyNCAyMDI0LTA0LTA3IDAzOjQ4OjQwfGE6Mzp7aTowO2k6MDtpOjE7aToxO2k6MjtpOjI7fXx1dGY4 ====== links/20/204744944937816555.rzg ====== IyFyNCAyMDI0LTA0LTA3IDAzOjQ4OjM1fGE6Mzp7aTowO2k6MTtpOjE7aToyO2k6MjtpOjM7fXx1dGY4 ====== links/20/207681467446613791.rzg ====== IyFyNCAyMDI0LTA0LTExIDAyOjAwOjUwfGE6Mzp7aTowO2k6MTtpOjE7aToyO2k6MjtpOjM7fXx1dGY4CiDQn9GA0L7QtNCw0LbQsDogPGEgaHJlZj0iaHR0cDovL3d3dy5jaW5lcmdldGlrYS5ydS8iPtC+0YHQvtCx0LXQvdC90L7RgdGC0Lgg0YHQuNC90LXRgNCz0LXRgtC40LrQuDwvYT4gIDxhIGhyZWY9Ii90ZW1wbF92dWQucGhwIj7Qp9C40YLQsNC50YLQtSDQtNCw0LvRjNGI0LUuLjwvYT4KICA8YSBocmVmPSJodHRwOi8vbWFrdmFyZWwucnUvIj7QtNCy0LXRgNC4INC80LXQttC60L7QvNC90LDRgtC90YvQtTwvYT4= ====== links/20/209757679694327366.rzg ====== IyFyNCAyMDI0LTA0LTI0IDAzOjM5OjMzfGE6Mzp7aTowO2k6MTtpOjE7aToyO2k6MjtpOjM7fXx1dGY4 ====== links/21/210613759816932294.rzg ====== IyFyNCAyMDI0LTA0LTExIDAyOjAwOjQ5fGE6Mzp7aTowO2k6MDtpOjE7aToyO2k6MjtpOjM7fXx1dGY4 ====== links/21/211102932282173164.rzg ====== IyFyNCAyMDI0LTA0LTIxIDA0OjM1OjM0fGE6Mzp7aTowO2k6MTtpOjE7aToyO2k6MjtpOjM7fXx1dGY4 ====== links/21/219992001450249862.rzg ====== IyFyNCAyMDI0LTA0LTI0IDAzOjM5OjMyfGE6Mzp7aTowO2k6MDtpOjE7aToxO2k6MjtpOjI7fXx1dGY4 ====== links/22/220746836296472213.rzg ====== IyFyNCAyMDI0LTA0LTA3IDAzOjQ4OjM4fGE6Mzp7aTowO2k6MDtpOjE7aToxO2k6MjtpOjI7fXx1dGY4 ====== links/22/221071362589231985.rzg ====== IyFyNCAyMDI0LTA0LTA3IDAzOjQ4OjM0fGE6Mzp7aTowO2k6MDtpOjE7aToxO2k6MjtpOjM7fXx1dGY4CiDQmNC90YTQvtGA0LzQsNGG0LjRjzog0KHQuNCz0LDRgNGLOyA8YSBocmVmPSJodHRwOi8vd3d3LnNtb2tlcGlwZS5ydS9jYXRlZ29yeS9lbGVjdHJvbm5pZS1zaWdhcmV0aS8iPtGB0LjQs9Cw0YDQtdGC0YMg0LHQtdC3INC00YvQvNCwINC60YPQv9C40YLRjDwvYT4gLiDQktGA0LXQtCDQutGD0YDQtdC90LjRjyDRgdC40LPQsNGA0LXRgiDQtNC70Y8g0L7RgNCz0LDQvdC40LfQvNCwLg== ====== links/22/225473500220693935.rzg ====== IyFyNCAyMDI0LTA0LTA3IDAzOjQ4OjQyfGE6Mzp7aTowO2k6MDtpOjE7aToxO2k6MjtpOjM7fXx1dGY4 ====== links/22/225580114798004868.rzg ====== IyFyNCAyMDI0LTA0LTA3IDAzOjQ4OjQwfGE6Mzp7aTowO2k6MTtpOjE7aToyO2k6MjtpOjM7fXx1dGY4 ====== links/23/230856206452022693.rzg ====== IyFyNCAyMDI0LTA0LTI0IDAzOjM5OjMyfGE6Mzp7aTowO2k6MTtpOjE7aToyO2k6MjtpOjM7fXx1dGY4 ====== links/23/232637981742670249.rzg ====== IyFyNCAyMDI0LTA0LTExIDAyOjAwOjQ5fGE6Mzp7aTowO2k6MDtpOjE7aToyO2k6MjtpOjM7fXx1dGY4 ====== links/23/234127678454617563.rzg ====== IyFyNCAyMDI0LTA0LTA3IDAzOjQ4OjQzfGE6Mzp7aTowO2k6MDtpOjE7aToyO2k6MjtpOjM7fXx1dGY4 ====== links/23/235284452517147170.rzg ====== IyFyNCAyMDI0LTA0LTIxIDA0OjM1OjMxfGE6Mzp7aTowO2k6MDtpOjE7aToyO2k6MjtpOjM7fXx1dGY4CiDQndC+0LLQvtGB0YLQuCDQv9Cw0YDRgtC90LXRgNC+0LI6IDxhIGhyZWY9Imh0dHA6Ly9ob2trZWlzdG8ucnUvIj7RhdC+0LrQutC10LnQvdGL0LUg0LrQu9GD0LHRizwvYT4= ====== links/23/239016691829357422.rzg ====== IyFyNCAyMDI0LTA0LTA3IDAzOjQ4OjM4fGE6Mzp7aTowO2k6MDtpOjE7aToxO2k6MjtpOjM7fXx1dGY4 ====== links/23/239078346271381737.rzg ====== IyFyNCAyMDI0LTA0LTI0IDAzOjM5OjMyfGE6Mzp7aTowO2k6MDtpOjE7aToxO2k6MjtpOjI7fXx1dGY4 ====== links/23/239401343716286195.rzg ====== IyFyNCAyMDI0LTA0LTA3IDAzOjQ4OjMzfGE6Mzp7aTowO2k6MDtpOjE7aToyO2k6MjtpOjM7fXx1dGY4 ====== links/23/239483567768213515.rzg ====== IyFyNCAyMDI0LTA0LTA3IDAzOjQ4OjM2fGE6Mzp7aTowO2k6MDtpOjE7aToyO2k6MjtpOjM7fXx1dGY4 ====== links/24/246125910694024476.rzg ====== IyFyNCAyMDI0LTA0LTA3IDAzOjQ4OjM0fGE6Mzp7aTowO2k6MTtpOjE7aToyO2k6MjtpOjM7fXx1dGY4 ====== links/24/247040066522097550.rzg ====== IyFyNCAyMDI0LTA0LTExIDAyOjAwOjQ4fGE6Mzp7aTowO2k6MTtpOjE7aToyO2k6MjtpOjM7fXx1dGY4 ====== links/24/248164457214993469.rzg ====== IyFyNCAyMDI0LTA0LTA3IDAzOjQ4OjM5fGE6Mzp7aTowO2k6MDtpOjE7aToyO2k6MjtpOjM7fXx1dGY4CiAgPGEgaHJlZj0iaHR0cDovL3d3dy5zbW9rZXBpcGUucnUvY2F0ZWdvcnkvZWxlY3Ryb25uaWUtc2lnYXJldGkvYnJlbmQvcG9ucy8iPtGN0LvQtdC60YLRgNC+0L3QvdGL0LUg0YHQuNCz0LDRgNC10YLRiyBwb25zINC60YPQv9C40YLRjDwvYT4= ====== links/25/250662370991242510.rzg ====== IyFyNCAyMDI0LTA0LTA3IDAzOjQ4OjQzfGE6Mzp7aTowO2k6MDtpOjE7aToxO2k6MjtpOjI7fXx1dGY4 ====== links/25/258194847760725170.rzg ====== IyFyNCAyMDI0LTA0LTA3IDAzOjQ4OjQyfGE6Mzp7aTowO2k6MDtpOjE7aToxO2k6MjtpOjI7fXx1dGY4 ====== links/26/261681809539750491.rzg ====== IyFyNCAyMDI0LTA0LTA3IDAzOjQ4OjMzfGE6Mzp7aTowO2k6MDtpOjE7aToxO2k6MjtpOjI7fXx1dGY4CiDQodC/0LXRhtC40LDQu9GM0L3QsNGPINCw0LrRhtC40Y8hIDxhIGhyZWY9Imh0dHA6Ly9hdnRvY29zc21ldGljLnJ1LyI+0LDQstGC0L7QutC+0YHQvNC10YLQuNC60LA8L2E+INC/0L4g0LvRg9GH0YjQuNC8INGG0LXQvdCw0Lw= ====== links/26/262967380023328183.rzg ====== IyFyNCAyMDI0LTA0LTA3IDAzOjQ4OjQ0fGE6Mzp7aTowO2k6MTtpOjE7aToyO2k6MjtpOjM7fXx1dGY4 ====== links/26/263706694247111121.rzg ====== IyFyNCAyMDI0LTA0LTA3IDAzOjQ4OjQ0fGE6Mzp7aTowO2k6MDtpOjE7aToxO2k6MjtpOjI7fXx1dGY4 ====== links/26/264354833302687506.rzg ====== IyFyNCAyMDI0LTA0LTA3IDAzOjQ4OjM3fGE6Mzp7aTowO2k6MDtpOjE7aToxO2k6MjtpOjI7fXx1dGY4CiAgPGEgaHJlZj0iaHR0cDovL3d3dy5zbW9rZXBpcGUucnUvY2F0ZWdvcnkvZWxlY3Ryb25uaWUtc2lnYXJldGkvYnJlbmQvcG9ucy8iPtC+0LTQvdC+0YDQsNC30L7QstGL0LUg0Y3Qu9C10LrRgtGA0L7QvdC90YvQtSDRgdC40LPQsNGA0LXRgtGLINC/0L7QvdGBPC9hPiAgPGEgaHJlZj0iL2ZhemEucGhwIj7Qp9C40YLQsNC50YLQtSDQtNCw0LvRjNGI0LUuLjwvYT4= ====== links/26/268578499039426262.rzg ====== IyFyNCAyMDI0LTAzLTMxIDA0OjE3OjE2fGE6Mzp7aTowO2k6MDtpOjE7aToxO2k6MjtpOjM7fXx1dGY4CiAg0J/Rg9GC0LXRiNC10YHRgtCy0LjRjzsgPGEgaHJlZj0iaHR0cDovL3d3dy5maW5seWFuZGlqYS5ydS8iPtC00LXRgtGB0LrQuNC5INC+0YLQtNGL0YUg0LIg0YTQuNC90LvRj9C90LTQuNC4PC9hPiAuINCh0L/Qu9Cw0L3QuNGA0L7QstCw0YLRjCDQvtGC0L/Rg9GB0LouINGB0L4g0YHQutC40LTQutC+0Lk= ====== links/26/269919012302280438.rzg ====== IyFyNCAyMDI0LTA0LTA3IDAzOjQ4OjQzfGE6Mzp7aTowO2k6MDtpOjE7aToyO2k6MjtpOjM7fXx1dGY4 ====== links/27/271779913203434400.rzg ====== IyFyNCAyMDI0LTA0LTA3IDAzOjQ4OjQwfGE6Mzp7aTowO2k6MDtpOjE7aToyO2k6MjtpOjM7fXx1dGY4CiAg0JvQtdGH0LXQvdC40LUg0LPQuNC90LPQuNCy0LjRgtCwLCA8YSBocmVmPSJodHRwOi8vd3d3LmxlY2hpbXp1YmlrLnJ1L3Byb3Rlemlyb3ZhbmllLXp1Ym92LnBocCI+0L3QtdGB0YrQtdC80L3QvtC1INC/0YDQvtGC0LXQt9C40YDQvtCy0LDQvdC40LUg0LfRg9Cx0L7QsjwvYT4gLCDQvdC+0LLQtdC50YjQuNC1INGC0LXRhdC90L7Qu9C+0LPQuNC4Lg== ====== links/27/274122793042678858.rzg ====== IyFyNCAyMDI0LTA0LTExIDAyOjAwOjQ4fGE6Mzp7aTowO2k6MDtpOjE7aToxO2k6MjtpOjI7fXx1dGY4 ====== links/27/274892582923466156.rzg ====== IyFyNCAyMDI0LTA0LTIxIDA0OjM1OjM0fGE6Mzp7aTowO2k6MDtpOjE7aToxO2k6MjtpOjM7fXx1dGY4CiAgPGEgaHJlZj0iaHR0cDovL3d3dy5wYXJpc2lhbmJlaXJ1dC5ydS8iPtC/0LDRgNC40LYg0LLQvtGB0YLQvtC60LA8L2E+ ====== links/27/275610984368691159.rzg ====== IyFyNCAyMDI0LTA0LTA3IDAzOjQ4OjQyfGE6Mzp7aTowO2k6MDtpOjE7aToxO2k6MjtpOjM7fXx1dGY4 ====== links/27/278382990818196265.rzg ====== IyFyNCAyMDI0LTAzLTI3IDAyOjU3OjIyfGE6Mzp7aTowO2k6MDtpOjE7aToxO2k6MjtpOjI7fXx1dGY4CiAgPGEgaHJlZj0iaHR0cDovL3d3dy5tZXRyby1taXJhLnJ1LyI+0LHQtdGA0LvQuNC90YHQutC+0LUg0LzQtdGC0YDQvjwvYT4gIDxhIGhyZWY9Ii9zdWljaWQucGhwIj7Qp9C40YLQsNC50YLQtSDQtNCw0LvRjNGI0LUuLjwvYT4= ====== links/27/278843012190017607.rzg ====== IyFyNCAyMDI0LTA0LTA3IDAzOjQ4OjQyfGE6Mzp7aTowO2k6MDtpOjE7aToxO2k6MjtpOjM7fXx1dGY4 ====== links/27/279045368909673897.rzg ====== IyFyNCAyMDI0LTA0LTA3IDAzOjQ4OjM5fGE6Mzp7aTowO2k6MDtpOjE7aToyO2k6MjtpOjM7fXx1dGY4CiDQotC+0LvRjNC60L4g0LIg0Y/QvdCy0LDRgNC1LiA8YSBocmVmPSJodHRwOi8vd3d3LnNtb2tlcGlwZS5ydS9jYXRlZ29yeS9lbGVjdHJvbm5pZS1zaWdhcmV0aS9icmVuZC9vMi8iPtGB0LjQs9Cw0YDQtdGC0YsgbzI8L2E+ ====== links/28/284057578925553916.rzg ====== IyFyNCAyMDI0LTA0LTExIDAyOjAwOjQ4fGE6Mzp7aTowO2k6MDtpOjE7aToyO2k6MjtpOjM7fXx1dGY4 ====== links/28/285198528165787504.rzg ====== IyFyNCAyMDI0LTA0LTA3IDAzOjQ4OjQyfGE6Mzp7aTowO2k6MTtpOjE7aToyO2k6MjtpOjM7fXx1dGY4 ====== links/28/286167288726412434.rzg ====== IyFyNCAyMDI0LTA0LTI0IDAzOjM5OjMzfGE6Mzp7aTowO2k6MDtpOjE7aToxO2k6MjtpOjI7fXx1dGY4 ====== links/28/289907541064166861.rzg ====== IyFyNCAyMDI0LTA0LTA3IDAzOjQ4OjM1fGE6Mzp7aTowO2k6MDtpOjE7aToxO2k6MjtpOjI7fXx1dGY4 ====== links/29/296479225349008204.rzg ====== IyFyNCAyMDI0LTAzLTMxIDA0OjE3OjE2fGE6Mzp7aTowO2k6MDtpOjE7aToxO2k6MjtpOjI7fXx1dGY4CiAgPGEgaHJlZj0iaHR0cDovL3d3dy55YXp5a21pcmEucnUvIj7QsdGA0LjRgtCw0L3RgdC60LjQuSDQsNC90LPQu9C40LnRgdC60LjQuTwvYT4gIDxhIGhyZWY9Ii9sdW5raS5waHAiPtCn0LjRgtCw0LnRgtC1INC00LDQu9GM0YjQtS4uPC9hPg== ====== links/29/296746383890514403.rzg ====== IyFyNCAyMDI0LTA0LTExIDAyOjAwOjQ5fGE6Mzp7aTowO2k6MTtpOjE7aToyO2k6MjtpOjM7fXx1dGY4 ====== links/29/297383444526926506.rzg ====== IyFyNCAyMDI0LTA0LTA3IDAzOjQ4OjM2fGE6Mzp7aTowO2k6MDtpOjE7aToxO2k6MjtpOjI7fXx1dGY4 ====== links/29/297529117988288579.rzg ====== IyFyNCAyMDI0LTA0LTA3IDAzOjQ4OjM4fGE6Mzp7aTowO2k6MDtpOjE7aToxO2k6MjtpOjI7fXx1dGY4CiDQk9C+0YDRj9GH0LXQtSDQv9GA0LXQtNC70L7QttC10L3QuNC1OiA8YSBocmVmPSJodHRwOi8vd3d3LnNtb2tlcGlwZS5ydS9jYXRlZ29yeS9lbGVjdHJvbm5pZS1zaWdhcmV0aS9icmVuZC9wb25zLyI+cG9ucyDRgdC40LPQsNGA0LXRgtGLPC9hPiDQvdC10LTQvtGA0L7Qs9C+IDxhIGhyZWY9Ii9wc2lob2xvZzUucGhwIj7Qp9C40YLQsNC50YLQtSDQtNCw0LvRjNGI0LUuLjwvYT4= ====== links/29/298564314120187610.rzg ====== IyFyNCAyMDI0LTA0LTIxIDA0OjM1OjMzfGE6Mzp7aTowO2k6MDtpOjE7aToxO2k6MjtpOjM7fXx1dGY4 ====== links/29/299248462951815338.rzg ====== IyFyNCAyMDI0LTA0LTI0IDAzOjM5OjMzfGE6Mzp7aTowO2k6MDtpOjE7aToxO2k6MjtpOjI7fXx1dGY4 ====== links/29/299689483140127496.rzg ====== IyFyNCAyMDI0LTA0LTExIDAyOjAwOjQ4fGE6Mzp7aTowO2k6MDtpOjE7aToxO2k6MjtpOjI7fXx1dGY4CiAgPGEgaHJlZj0iaHR0cDovL3d3dy5mYXJmb3JpbmZvLnJ1LyI+0YTQsNGA0YTQvtGA0L7QstGL0LUg0LfQsNCy0L7QtNGLPC9hPg== ====== links/30/300193194177390543.rzg ====== IyFyNCAyMDI0LTA0LTA3IDAzOjQ4OjM4fGE6Mzp7aTowO2k6MDtpOjE7aToyO2k6MjtpOjM7fXx1dGY4CiAgPGEgaHJlZj0iaHR0cDovL3d3dy5zbW9rZXBpcGUucnUvY2F0ZWdvcnkvZWxlY3Ryb25uaWUtc2lnYXJldGkvYnJlbmQvcG9ucy8iPtC/0L7QvdGBINGB0LjQs9Cw0YDQtdGC0Ysg0Y3Qu9C10LrRgtGA0L7QvdC90YvQtTwvYT4gIDxhIGhyZWY9Ii9rYW1lbi5waHAiPtCn0LjRgtCw0LnRgtC1INC00LDQu9GM0YjQtS4uPC9hPg== ====== links/30/300826899075778818.rzg ====== IyFyNCAyMDI0LTAzLTMxIDA0OjE3OjE2fGE6Mzp7aTowO2k6MDtpOjE7aToxO2k6MjtpOjM7fXx1dGY4CiAgPGEgaHJlZj0iaHR0cDovL3d3dy5vZGVuZW0tbm9na2kucnUvIj7Rh9GD0LvQutC4PC9hPg== ====== links/30/301476613439106249.rzg ====== IyFyNCAyMDI0LTA0LTA3IDAzOjQ4OjM2fGE6Mzp7aTowO2k6MTtpOjE7aToyO2k6MjtpOjM7fXx1dGY4 ====== links/30/302955589048581541.rzg ====== IyFyNCAyMDI0LTA0LTIxIDA0OjM1OjMyfGE6Mzp7aTowO2k6MTtpOjE7aToyO2k6MjtpOjM7fXx1dGY4CiAg0JHRgNC+0L3QuNGA0L7QstCw0L3QuNC1INC4INC00L7RgdGC0LDQstC60LAg0LDQstC40LDQsdC40LvQtdGC0L7QsjsgPGEgaHJlZj0iaHR0cDovL3d3dy52aWxldGFlbS5ydS9hdmlhYmlsZXR5L3NvZml5dS5waHAiPtCw0LLQuNCw0LHQuNC70LXRgtGLINCyINGB0L7RhNC40Y48L2E+IDsg0LDQutGG0LjQvtC90L3Ri9C1INC/0YDQtdC00LvQvtC20LXQvdC40Y8uINC60YDRg9Cz0LvQvtGB0YPRgtC+0YfQvdC+CiAg0J/QvtGA0YLRgdC40LPQsNGA0Ys7IDxhIGhyZWY9Imh0dHA6Ly93d3cuc21va2VwaXBlLnJ1L2luZm9ybWF0aW9uL21uZW5pZS12cmFjaGVpLyI+0Y3Qu9C10LrRgtGA0L7QvdC90YvQtSDRgdC40LPQsNGA0LXRgtGLINC+0L/QsNGB0L3RizwvYT4gLiDQmtCw0Log0LHRgNC+0YHQuNGC0Ywg0LrRg9GA0LjRgtGMLiDQvdCwINGB0L/QtdGG0LjQsNC70YzQvdGL0YUg0YPRgdC70L7QstC40Y/RhQ== ====== links/30/303012198138184450.rzg ====== IyFyNCAyMDI0LTA0LTA3IDAzOjQ4OjMyfGE6Mzp7aTowO2k6MDtpOjE7aToxO2k6MjtpOjI7fXx1dGY4 ====== links/30/304953966862320185.rzg ====== IyFyNCAyMDI0LTA0LTIxIDA0OjM1OjMzfGE6Mzp7aTowO2k6MDtpOjE7aToyO2k6MjtpOjM7fXx1dGY4 ====== links/30/309862387003064558.rzg ====== IyFyNCAyMDI0LTAzLTMxIDA0OjE3OjE1fGE6Mzp7aTowO2k6MDtpOjE7aToxO2k6MjtpOjI7fXx1dGY4CiAgPGEgaHJlZj0iaHR0cDovL3d3dy5zdHJvaW1uYXZla2EucnUvIj7Qv9GA0LjQs9C+0YDQvtC00L3Ri9C1INC00L7QvNCwINC4INC60L7RgtGC0LXQtNC20Lg8L2E+ ====== links/30/308695987179326585.rzg ====== IyFyNCAyMDI0LTA0LTA3IDAzOjQ4OjQyfGE6Mzp7aTowO2k6MDtpOjE7aToxO2k6MjtpOjM7fXx1dGY4 ====== links/31/319300742696262332.rzg ====== IyFyNCAyMDI0LTA0LTA3IDAzOjQ4OjQ0fGE6Mzp7aTowO2k6MTtpOjE7aToyO2k6MjtpOjM7fXx1dGY4 ====== links/32/321340149068884424.rzg ====== IyFyNCAyMDI0LTA0LTA3IDAzOjQ4OjM1fGE6Mzp7aTowO2k6MDtpOjE7aToxO2k6MjtpOjI7fXx1dGY4CiAgPGEgaHJlZj0iaHR0cDovL3d3dy5zdHJhbmFraXRhaS5ydS8iPtC+0YHRgtGA0L7QsiDRhdCw0LnQvdCw0L3RjDwvYT4= ====== links/32/321903752055220431.rzg ====== IyFyNCAyMDI0LTA0LTExIDAyOjAwOjQ5fGE6Mzp7aTowO2k6MDtpOjE7aToxO2k6MjtpOjM7fXx1dGY4 ====== links/32/324012681700749465.rzg ====== IyFyNCAyMDI0LTA0LTA3IDAzOjQ4OjQzfGE6Mzp7aTowO2k6MTtpOjE7aToyO2k6MjtpOjM7fXx1dGY4 ====== links/32/324293776707986426.rzg ====== IyFyNCAyMDI0LTA0LTA3IDAzOjQ4OjM0fGE6Mzp7aTowO2k6MDtpOjE7aToyO2k6MjtpOjM7fXx1dGY4 ====== links/32/324792466204856387.rzg ====== IyFyNCAyMDI0LTA0LTA3IDAzOjQ4OjQxfGE6Mzp7aTowO2k6MDtpOjE7aToxO2k6MjtpOjM7fXx1dGY4 ====== links/32/327451737728797096.rzg ====== IyFyNCAyMDI0LTA0LTExIDAyOjAwOjQ3fGE6Mzp7aTowO2k6MDtpOjE7aToxO2k6MjtpOjI7fXx1dGY4 ====== links/32/329684381197680871.rzg ====== IyFyNCAyMDI0LTA0LTIxIDA0OjM1OjMzfGE6Mzp7aTowO2k6MDtpOjE7aToxO2k6MjtpOjI7fXx1dGY4 ====== links/32/329714440222657058.rzg ====== IyFyNCAyMDI0LTA0LTA3IDAzOjQ4OjM4fGE6Mzp7aTowO2k6MDtpOjE7aToyO2k6MjtpOjM7fXx1dGY4 ====== links/33/330391390689360063.rzg ====== IyFyNCAyMDI0LTA0LTA3IDAzOjQ4OjQyfGE6Mzp7aTowO2k6MDtpOjE7aToxO2k6MjtpOjI7fXx1dGY4 ====== links/33/333110192179273590.rzg ====== IyFyNCAyMDI0LTA0LTI0IDAzOjM5OjMyfGE6Mzp7aTowO2k6MTtpOjE7aToyO2k6MjtpOjM7fXx1dGY4 ====== links/33/335559040424666547.rzg ====== IyFyNCAyMDI0LTA0LTA3IDAzOjQ4OjMzfGE6Mzp7aTowO2k6MDtpOjE7aToxO2k6MjtpOjM7fXx1dGY4 ====== links/33/338226149419143489.rzg ====== IyFyNCAyMDI0LTA0LTA3IDAzOjQ4OjQzfGE6Mzp7aTowO2k6MDtpOjE7aToyO2k6MjtpOjM7fXx1dGY4 ====== links/33/338528581489013917.rzg ====== IyFyNCAyMDI0LTA0LTA3IDAzOjQ4OjQwfGE6Mzp7aTowO2k6MDtpOjE7aToyO2k6MjtpOjM7fXx1dGY4CiDQodC/0LXRhtC40LDQu9GM0L3QsNGPINCw0LrRhtC40Y8hINCn0LjRgdGC0LrQsCDQt9GD0LHQvtCyLCA8YSBocmVmPSJodHRwOi8vd3d3LmxlY2hpbXp1YmlrLnJ1LyI+0L/RgNC+0YLQtdC30LjRgNC+0LLQsNC90LjQtSDQt9GD0LHQvtCyINGB0YLQvtC40LzQvtGB0YLRjCDQsiDRgtGD0YjQuNC90L48L2E+ICwg0YEg0L/RgNC+0LLQvtC00L3QuNC60L7QstC+0Lkg0LDQvdC10YHRgtC10LfQuNC10LkuICA8YSBocmVmPSIvbWVuZ2lyLnBocCI+0KfQuNGC0LDQudGC0LUg0LTQsNC70YzRiNC1Li48L2E+ ====== links/39/395509661384905037.rzg ====== IyFyNCAyMDI0LTA0LTA3IDAzOjQ4OjQyfGE6Mzp7aTowO2k6MDtpOjE7aToxO2k6MjtpOjM7fXx1dGY4 ====== links/40/402497189359004314.rzg ====== IyFyNCAyMDI0LTA0LTA3IDAzOjQ4OjM2fGE6Mzp7aTowO2k6MDtpOjE7aToyO2k6MjtpOjM7fXx1dGY4CiDQlNC70Y8g0LjQvdGE0L7RgNC80LDRhtC40Lg6IDxhIGhyZWY9Imh0dHA6Ly93d3cuc21va2VwaXBlLnJ1L2NhdGVnb3J5L2VsZWN0cm9ubmllLXNpZ2FyZXRpL2JyZW5kL2RlbnNoaS10YWJhY2NvLyI+ZGVuc2hpPC9hPg== ====== links/41/418713109030606795.rzg ====== IyFyNCAyMDI0LTA0LTA3IDAzOjQ4OjM5fGE6Mzp7aTowO2k6MDtpOjE7aToxO2k6MjtpOjI7fXx1dGY4CiAg0J/RgNC+0LTQsNC10LwgPGEgaHJlZj0iaHR0cDovL3d3dy5zbW9rZXBpcGUucnUvY2F0ZWdvcnkvZWxlY3Ryb25uaWUtc2lnYXJldGkvYnJlbmQvR2FtdWNjaS8iPtC90LXQtNC+0YDQvtCz0L4g0YHQuNCz0LDRgNC10YLRiyBnYW11Y2NpPC9hPiAuINCf0YDQvtGG0LXRgdGBINC/0L7QtNCx0L7RgNCwINGC0LDQsdCw0LrQsC4g0LTQvdC10Lwg0Lgg0L3QvtGH0YzRjiA8YSBocmVmPSIvbmV0b2Nobm9zdGkucGhwIj7Qp9C40YLQsNC50YLQtSDQtNCw0LvRjNGI0LUuLjwvYT4= ====== links/42/426218180997557507.rzg ====== IyFyNCAyMDI0LTAzLTMxIDA0OjE3OjE3fGE6Mzp7aTowO2k6MDtpOjE7aToyO2k6MjtpOjM7fXx1dGY4CiAgPGEgaHJlZj0iaHR0cDovL3d3dy5jcnlzdGFsamV3ZWxsZXJ5LnJ1LyI+0YPQutGA0LDRiNC10L3QuNGPPC9hPg== ====== links/46/464463878295906247.rzg ====== IyFyNCAyMDI0LTAzLTI3IDAyOjU3OjIxfGE6Mzp7aTowO2k6MDtpOjE7aToxO2k6MjtpOjM7fXx1dGY4 ====== links/49/494437090436512993.rzg ====== IyFyNCAyMDI0LTA0LTIxIDA0OjM1OjMxfGE6Mzp7aTowO2k6MTtpOjE7aToyO2k6MjtpOjM7fXx1dGY4 ====== links/50/502913093582342907.rzg ====== IyFyNCAyMDI0LTA0LTI0IDAzOjM5OjMzfGE6Mzp7aTowO2k6MTtpOjE7aToyO2k6MjtpOjM7fXx1dGY4 ====== links/52/522616022054905814.rzg ====== IyFyNCAyMDI0LTA0LTA3IDAzOjQ4OjM5fGE6Mzp7aTowO2k6MDtpOjE7aToyO2k6MjtpOjM7fXx1dGY4 ====== links/52/527109954979799163.rzg ====== IyFyNCAyMDI0LTA0LTA3IDAzOjQ4OjM2fGE6Mzp7aTowO2k6MDtpOjE7aToxO2k6MjtpOjM7fXx1dGY4CiAgPGEgaHJlZj0iaHR0cDovL3d3dy5iaWxldGVyb3YubmV0LyI+0YLQtWHRgtGAINC7YSDRgdC6YdC7YTwvYT4KINCb0YPRh9GI0LjQtSDRhtC10L3RiyAtICA8YSBocmVmPSJodHRwOi8vd3d3LnNtb2tlcGlwZS5ydS9jYXRlZ29yeS9lbGVjdHJvbm5pZS1zaWdhcmV0aS9icmVuZC9GcmVzaC8iPtGE0YDQtdGIINGN0LvQtdC60YLRgNC+0L3QvdGL0LUg0YHQuNCz0LDRgNC10YLRizwvYT4g0L3QtdC00L7RgNC+0LPQvg== ====== links/53/533220425203215115.rzg ====== IyFyNCAyMDI0LTA0LTA3IDAzOjQ4OjQ0fGE6Mzp7aTowO2k6MDtpOjE7aToxO2k6MjtpOjM7fXx1dGY4 ====== links/54/540365920045079008.rzg ====== IyFyNCAyMDI0LTA0LTI0IDAzOjM5OjMyfGE6Mzp7aTowO2k6MDtpOjE7aToxO2k6MjtpOjI7fXx1dGY4 ====== links/55/553360050514858038.rzg ====== IyFyNCAyMDI0LTA0LTIxIDA0OjM1OjM0fGE6Mzp7aTowO2k6MDtpOjE7aToyO2k6MjtpOjM7fXx1dGY4 ====== links/61/615281134240639317.rzg ====== IyFyNCAyMDI0LTA0LTExIDAyOjAwOjQ4fGE6Mzp7aTowO2k6MDtpOjE7aToxO2k6MjtpOjI7fXx1dGY4 ====== links/62/627984140223912954.rzg ====== IyFyNCAyMDI0LTA0LTA3IDAzOjQ4OjM2fGE6Mzp7aTowO2k6MDtpOjE7aToxO2k6MjtpOjI7fXx1dGY4CiAgPGEgaHJlZj0iaHR0cDovL3d3dy5teS1pa2VhLnJ1LyI+0YHQv9Cw0LvRjNC90LggaWtlYTwvYT4KIHd3dy5zbW9rZXBpcGUucnUgPGEgaHJlZj0iaHR0cDovL3d3dy5zbW9rZXBpcGUucnUvY2F0ZWdvcnkvZWxlY3Ryb25uaWUtc2lnYXJldGkvYnJlbmQvRnJlc2gvIj7QutGD0L/QuNGC0Ywg0Y3Qu9C10LrRgtGA0L7QvdC90YPRjiDRgdC40LPQsNGA0LXRgtGDIGZyZXNoPC9hPiDQs9Cw0YDQsNC90YLQuNGPINC60LDRh9C10YHRgtCy0LA= ====== links/65/652370439103189289.rzg ====== IyFyNCAyMDI0LTA0LTExIDAyOjAwOjQ4fGE6Mzp7aTowO2k6MTtpOjE7aToyO2k6MjtpOjM7fXx1dGY4CiAg0JPQvtGA0Y/RidC40LUg0YLRg9GA0Ys7IDxhIGhyZWY9Imh0dHA6Ly93d3cuZmlubHlhbmRpamEucnUvdHVyaS12LWZpbmxqYW5kaWp1LyI+0LTQtdGI0LXQstGL0LUg0YLRg9GA0Ysg0LIg0YTQuNC90LvRj9C90LTQuNGOPC9hPiAuINCh0L/Qu9Cw0L3QuNGA0L7QstCw0YLRjCDQvtGC0L/Rg9GB0LouINGB0L4g0YHQutC40LTQutC+0LkgPGEgaHJlZj0iL3ZsaWphbmlqZTE4LnBocCI+0KfQuNGC0LDQudGC0LUg0LTQsNC70YzRiNC1Li48L2E+ ====== links/65/657439558352499307.rzg ====== IyFyNCAyMDI0LTA0LTIxIDA0OjM1OjMyfGE6Mzp7aTowO2k6MTtpOjE7aToyO2k6MjtpOjM7fXx1dGY4 ====== links/66/660034416903052933.rzg ====== IyFyNCAyMDI0LTA0LTExIDAyOjAwOjQ5fGE6Mzp7aTowO2k6MTtpOjE7aToyO2k6MjtpOjM7fXx1dGY4CiDQoNC10LDQu9C40LfQsNGG0LjRjzog0J3QsNGA0LDRidC40LLQsNC90LjQtSDQstC+0LvQvtGBINCyINC/0LDRgNC40LrQvNCw0YXQtdGA0YHQutC+0Lk7IDxhIGhyZWY9Imh0dHA6Ly93d3cuaW1hZ2U0eW91LnJ1L25uLW1hbmlreXIvIj7QvNCw0L3QuNC60Y7RgCDQsNC00YDQtdGBPC9hPiAuINCh0LTQtdC70LDRgtGMINC/0LXQtNC40LrRjtGALiAgPGEgaHJlZj0iL2RyZXZuLnBocCI+0KfQuNGC0LDQudGC0LUg0LTQsNC70YzRiNC1Li48L2E+ ====== links/67/670236750528642875.rzg ====== IyFyNCAyMDI0LTA0LTA3IDAzOjQ4OjM2fGE6Mzp7aTowO2k6MDtpOjE7aToxO2k6MjtpOjI7fXx1dGY4 ====== links/67/679765967889623950.rzg ====== IyFyNCAyMDI0LTA0LTA3IDAzOjQ4OjM4fGE6Mzp7aTowO2k6MDtpOjE7aToxO2k6MjtpOjI7fXx1dGY4CiAgPGEgaHJlZj0iaHR0cDovL3d3dy5ta25ub3YucnUvIj7QvdC40LbQtdCz0L7RgNC+0LTRgdC60L7QtSDQvNCw0YHQu9C+PC9hPiDQsdC10YHQv9C70LDRgtC90L4= ====== links/69/693527789277775971.rzg ====== IyFyNCAyMDI0LTA0LTA3IDAzOjQ4OjM5fGE6Mzp7aTowO2k6MTtpOjE7aToyO2k6MjtpOjM7fXx1dGY4CiAgPGEgaHJlZj0iaHR0cDovL3d3dy5zbW9rZXBpcGUucnUvY2F0ZWdvcnkvZWxlY3Ryb25uaWUtc2lnYXJldGkvYnJlbmQvTklDT1RFQy8iPtGB0LjQs9Cw0YDQtdGC0Ysgbmljb3RlYzwvYT4= ====== links/71/715564348694827768.rzg ====== IyFyNCAyMDI0LTA0LTA3IDAzOjQ4OjQwfGE6Mzp7aTowO2k6MDtpOjE7aToxO2k6MjtpOjI7fXx1dGY4CiDQn9C+0YHQu9C10LTQvdC40LUg0YHQutC40LTQutC4ISDQo9C00LDQu9C10L3QuNC1INC30YPQsdC90L7Qs9C+INC60LDQvNC90Y8sIDxhIGhyZWY9Imh0dHA6Ly93d3cubGVjaGltenViaWsucnUvb3RiZWxpdmFuaWVfenVib3YucGhwIj7QvtGC0LHQtdC70LjQstCw0L3QuNC1INC30YPQsdC+0LIg0L3QtdC00L7RgNC+0LPQvjwvYT4gLCDQu9C10YfQtdC90LjQtSDQsdC10Lcg0LHQvtC70LguINGB0L4g0YHQutC70LDQtNCwINCyINCd0LjQttC90LXQvCDQndC+0LLQs9C+0YDQvtC00LUgPGEgaHJlZj0iLzMwZG5leTQucGhwIj7Qp9C40YLQsNC50YLQtSDQtNCw0LvRjNGI0LUuLjwvYT4= ====== links/73/731035043150235878.rzg ====== IyFyNCAyMDI0LTA0LTA3IDAzOjQ4OjQzfGE6Mzp7aTowO2k6MDtpOjE7aToyO2k6MjtpOjM7fXx1dGY4 ====== links/73/736759532506949057.rzg ====== IyFyNCAyMDI0LTA0LTExIDAyOjAwOjQ3fGE6Mzp7aTowO2k6MDtpOjE7aToyO2k6MjtpOjM7fXx1dGY4 ====== links/73/739690104528623127.rzg ====== IyFyNCAyMDI0LTA0LTIxIDA0OjM1OjM0fGE6Mzp7aTowO2k6MTtpOjE7aToyO2k6MjtpOjM7fXx1dGY4CiDQntCx0YDQsNGC0LjRgtC1INCy0L3QuNC80LDQvdC40LUhIDxhIGhyZWY9Imh0dHA6Ly93d3cuc3RhcnMtbm5vdi5ydS8iPtC90LjQttC10LPQvtGA0L7QtNGB0LrQuNC1INCw0YDRgtC40YHRgtGLPC9hPiDQsiDQu9GO0LHQvtC1INCy0YDQtdC80Y8= ====== links/74/743498469027257820.rzg ====== IyFyNCAyMDI0LTA0LTIxIDA0OjM1OjMyfGE6Mzp7aTowO2k6MDtpOjE7aToyO2k6MjtpOjM7fXx1dGY4 ====== links/78/789076761371760315.rzg ====== IyFyNCAyMDI0LTA0LTA3IDAzOjQ4OjQxfGE6Mzp7aTowO2k6MDtpOjE7aToxO2k6MjtpOjI7fXx1dGY4 ====== links/83/834560301375054924.rzg ====== IyFyNCAyMDI0LTA0LTA3IDAzOjQ4OjM3fGE6Mzp7aTowO2k6MDtpOjE7aToxO2k6MjtpOjI7fXx1dGY4 ====== links/84/845703840903330280.rzg ====== IyFyNCAyMDI0LTAzLTI3IDAyOjU3OjIxfGE6Mzp7aTowO2k6MDtpOjE7aToyO2k6MjtpOjM7fXx1dGY4 ====== links/91/911816751137462739.rzg ====== IyFyNCAyMDI0LTA0LTA3IDAzOjQ4OjQ0fGE6Mzp7aTowO2k6MDtpOjE7aToxO2k6MjtpOjI7fXx1dGY4 ====== links/92/920035525365169293.rzg ====== IyFyNCAyMDI0LTAzLTMxIDA0OjE3OjE2fGE6Mzp7aTowO2k6MTtpOjE7aToyO2k6MjtpOjM7fXx1dGY4CiDQkNC60YbQuNGPOiDQrtGA0LjQtNC40YfQtdGB0LrQsNGPIDxhIGhyZWY9Imh0dHA6Ly93d3cuYml6Y29tcGFueS5ydS8iPtGA0LXQs9C40YHRgtGA0LDRhtC40Y8g0L7QvtC+INGB0L4g0YHRh9C10YLQvtC8LjwvYT4g0YHQviDRgdC80LXQvdC+0Lkg0LTQuNGA0LXQutGC0L7RgNCwLiDQtNC+0YHRgtGD0L/QvdC+INC4INC60LDRh9C10YHRgtCy0LXQvdC90L4KINCm0LXQvdGLINGB0L3QuNC20LXQvdGLISA8YSBocmVmPSJodHRwOi8vd3d3LjR0b3Rha29lLnJ1LyI+0YfQtdC70L7QstC10Lo8L2E+IHd3dy40dG90YWtvZS5ydSA8YSBocmVmPSIvdmxpamFuaWplMjEucGhwIj7Qp9C40YLQsNC50YLQtSDQtNCw0LvRjNGI0LUuLjwvYT4= ====== links/99/990796220454960279.rzg ====== IyFyNCAyMDI0LTA0LTIxIDA0OjM1OjMzfGE6Mzp7aTowO2k6MDtpOjE7aToxO2k6MjtpOjM7fXx1dGY4CiAgPGEgaHJlZj0iaHR0cDovL3NpZ2Fycm8ucnUvIj7RgdC40LPQsNGA0LjQu9C70Ys8L2E+ ====== r4_api.php ====== PD9waHAKCiRyNF9lcnJvcl9yZXBvcnRpbmcgPSBlcnJvcl9yZXBvcnRpbmcoMCk7CgppbmNsdWRlKCJ7JHI0X2NmZ19yb290fXI0X3ZhcnMucGhwIik7CgovLyDQntCx0YDQsNCx0L7RgtC60LAg0L7RiNC40LHQvtC6INC00LvRjyDQkNCf0Jgg0L7RgtC60LvRjtGH0LXQvdCwLgovLyDQktGB0LXQs9C00LAgZXJyb3JfcmVwb3J0aW5nKDApOwovLyDQrdGC0L4g0L/QvtC30LLQvtC70LjRgiDQuNC30LHQtdC20LDRgtGMINC+0YjQuNCx0L7Quiwg0LIg0YLQvtC8INGH0LjRgdC70LUsINC/0YDQuCDQvtGC0YHRg9GC0YHRgtCy0LjQuCDRhNCw0LnQu9C+0LIg0LTQu9GPIGluY2x1ZGUuCgokcjRfY2ZnX3Jvb3QgPSBkaXJuYW1lKF9fRklMRV9fKTsKJHI0X2NmZ19yb290IC49ICcvJzsKJHI0X2NmZ19yb290ID0gcHJlZ19yZXBsYWNlKCd8KFsvXSspfGlzJywgJy8nLCAkcjRfY2ZnX3Jvb3QpOwoKaW5jbHVkZV9vbmNlKCJ7JHI0X2NmZ19yb290fXI0X2xpYnMucGhwIik7CgokcmVzdWx0ID0gYXJyYXkoKTsKCi8vINCh0L/QsNGB0LXQvdC40LUg0LTQu9GPICLRgtC+0LvRgdGC0YvRhSIg0YHQsNC50YLQvtCyINGBINCx0L7Qu9GM0YjQuNC8INC60L7Qu9C40YfQtdGB0YLQstC+0Lwg0YHRgtGA0LDQvdC40YYKaWYgKGlzc2V0KCRyNF9jZmdfc2tpcF9maWxlc19jaGVjaykpIHsKICAgICRyNF9za2lwX2ZpbGVzX2NoZWNrID0gJHI0X2NmZ19za2lwX2ZpbGVzX2NoZWNrOwp9CmVsc2UgewogICAgJHI0X3NraXBfZmlsZXNfY2hlY2sgPSBmYWxzZTsKfQoKJHI0X2NmZ19jbXMgPSBpc3NldCgkcjRfY2ZnX2NtcykgPyAkcjRfY2ZnX2NtcyA6ICcnOwokcjRfY2ZnX211bHRpZG9tYWluID0gaXNzZXQoJHI0X2NmZ19tdWx0aWRvbWFpbikgPyAkcjRfY2ZnX211bHRpZG9tYWluIDogZmFsc2U7CgppZiAoIWluX2FycmF5KHN0cnRvbG93ZXIoJHI0X2NmZ19jbXMpLCBhcnJheSgnZWxpdG9pZCcpKSkgewogICAgLy8g0J/RgNC+0LLQtdGA0LrQsCDQutC70Y7Rh9CwINC00LvRjyDQtNC+0YHRgtGD0L/QsCDQuiBBUEkuCiAgICBpZiAoIWVtcHR5KCRfR0VUWydhcGlrZXknXSkpIHsKICAgICAgICBpZiAobWQ1KCdyNGFwaWtleScpICE9PSAkX0dFVFsnYXBpa2V5J10pIHsKICAgICAgICAgICAgcjRfZmFpbCgkcmVzdWx0LCAnQXBpS2V5IGlzIGludmFsaWQnKTsKICAgICAgICB9CiAgICB9CiAgICBlbHNlIHsKICAgICAgICByNF9mYWlsKCRyZXN1bHQsICdBcGlLZXkgcmVxdWlyZWQnKTsKICAgIH0KCiAgICAvLyDQn9GA0L7QstC10YDQutCwINC30LDRidC40YLQvdC+0LPQviDQutC70Y7Rh9CwINGBINC/0YDQuNCy0Y/Qt9C60L7QuSDQuiDRgdCw0LnRgtGDLgogICAgaWYgKGZpbGVfZXhpc3RzKCJ7JHI0X2NmZ19yb290fXI0X3ZhcnMucGhwIikpIHsKICAgICAgICBpZiAoIWVtcHR5KCRfR0VUWydkb25nbGUnXSkgJiYgIWVtcHR5KCRyNF9jZmdfZG9uZ2xlKSkgewogICAgICAgICAgICBpZiAoJHI0X2NmZ19kb25nbGUgIT09ICRfR0VUWydkb25nbGUnXSkgewogICAgICAgICAgICAgICAgcjRfZmFpbCgkcmVzdWx0LCAnRG9uZ2xlIGlzIGludmFsaWQnKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgcjRfZmFpbCgkcmVzdWx0LCAnRG9uZ2xlIHJlcXVpcmVkJyk7CiAgICAgICAgfQogICAgfQp9CgovLyDQn9GA0L7QstC10YDQutCwINGA0LXQttC40LzQsCBTQUZFIE1PREUuCiRzYWZlX21vZGUgPSBjaGVja19zYWZlX21vZGUoJHI0X2NmZ19yb290KTsKCmlmICgkc2FmZV9tb2RlKSB7CiAgICBpbmNsdWRlX29uY2UoInskcjRfY2ZnX3Jvb3R9cGNsZXJyb3IubGliLnBocDMiKTsKICAgIGluY2x1ZGVfb25jZSgieyRyNF9jZmdfcm9vdH1wY2x0cmFjZS5saWIucGhwMyIpOwogICAgaW5jbHVkZV9vbmNlKCJ7JHI0X2NmZ19yb290fXBjbHRhci5saWIucGhwMyIpOwp9CgokaHR0cF9ob3N0ID0gaXNzZXQoJF9TRVJWRVJbJ0hUVFBfSE9TVCddKSA/ICRfU0VSVkVSWydIVFRQX0hPU1QnXSA6ICRfU0VSVkVSWydTRVJWRVJfTkFNRSddOwoKLy8g0JzRg9C70YzRgtC40LTQvtC80LXQvdGLLgppZiAoJHI0X2NmZ19tdWx0aWRvbWFpbiAmJiAhJHNhZmVfbW9kZSkgewogICAgJHI0X2RvbWFpbiA9IHN0cnRvbG93ZXIocHJlZ19yZXBsYWNlKCcjXnd3d1wuI2lzbScsICcnLCAkaHR0cF9ob3N0KS4nLycpOwoKICAgIGlmICghZmlsZV9leGlzdHMoInskcjRfY2ZnX3Jvb3R9eyRyNF9kb21haW59IikpIHsKICAgICAgICBta2RpcigieyRyNF9jZmdfcm9vdH17JHI0X2RvbWFpbn0iLCAwNzU1KTsKICAgICAgICBjaG1vZCgieyRyNF9jZmdfcm9vdH17JHI0X2RvbWFpbn0iLCAwNzU1KTsKICAgIH0KCiAgICAkc2FmZV9tb2RlX2xpbmtzX2ZpbGUgPSAieyRyNF9jZmdfcm9vdH17JHI0X2RvbWFpbn1saW5rcy50YXIiOwogICAgJHNhZmVfbW9kZV90YWdzX2ZpbGUgPSAieyRyNF9jZmdfcm9vdH17JHI0X2RvbWFpbn10YWdzLnRhciI7Cn0KZWxzZWlmICgkcjRfY2ZnX211bHRpZG9tYWluKSB7CiAgICAkcjRfZG9tYWluID0gc3RydG9sb3dlcihwcmVnX3JlcGxhY2UoJyNed3d3XC4jaXNtJywgJycsICRodHRwX2hvc3QpLidfJyk7CiAgICAkc2FmZV9tb2RlX2xpbmtzX2ZpbGUgPSAieyRyNF9jZmdfcm9vdH17JHI0X2RvbWFpbn1saW5rcy50YXIiOwogICAgJHNhZmVfbW9kZV90YWdzX2ZpbGUgPSAieyRyNF9jZmdfcm9vdH17JHI0X2RvbWFpbn10YWdzLnRhciI7CiAgICAkcjRfZG9tYWluID0gJyc7Cn0KZWxzZSB7CiAgICAkcjRfZG9tYWluID0gJyc7CiAgICAkc2FmZV9tb2RlX2xpbmtzX2ZpbGUgPSAieyRyNF9jZmdfcm9vdH17JHI0X2RvbWFpbn1saW5rcy50YXIiOwogICAgJHNhZmVfbW9kZV90YWdzX2ZpbGUgPSAieyRyNF9jZmdfcm9vdH17JHI0X2RvbWFpbn10YWdzLnRhciI7Cn0KCi8vINCX0LDQs9GA0YPQt9C60LAg0LjQu9C4INC+0LHQvdC+0LLQu9C10L3QuNC1INGE0LDQudC70L7QsiAo0LHRi9Cy0YjQuNC5IHI0LnB1dGZpbGUucGhwKS4KaWYgKGlzc2V0KCRfR0VUWyd1cGxvYWQnXSkgfHwgaXNzZXQoJF9HRVRbJ3B1dGZpbGUnXSkpIHsKCiAgICBpZiAoZW1wdHkoJF9HRVRbJ2tleSddKSkgewogICAgICAgIHI0X2ZhaWwoJHJlc3VsdCwgJ1NpZ25hdHVyZSByZXF1aXJlZCcpOwogICAgfQoKICAgIGlmICghaXNzZXQoJF9QT1NUWydyJ10pKSB7CiAgICAgICAgcjRfZmFpbCgkcmVzdWx0LCAnTm8gZmlsZSBjb250ZW50cycpOwogICAgfQoKICAgICR1cGxvYWRfZGF0YV90eXBlID0gdHJpbSgkX0dFVFsndXBsb2FkJ10pOwoKICAgIGlmKCR1cGxvYWRfZGF0YV90eXBlID09ICcnKSB7CiAgICAgICAgJHVwbG9hZF9kYXRhX3R5cGUgPSAnbGlua3MnOwogICAgfQoKICAgIGlmKCFpbl9hcnJheSgkdXBsb2FkX2RhdGFfdHlwZSwgYXJyYXkoJ2xpbmtzJywgJ3RhZ3MnKSkpIHsKICAgICAgICByNF9mYWlsKCRyZXN1bHQsICdCYWQgdXBsb2FkIGRhdGEgdHlwZScpOwogICAgfQoKICAgICRycSA9ICRfUE9TVFsnciddOwoKICAgIGlmICghaXNzZXQoJF9HRVRbJ2ZuJ10pKSB7CiAgICAgICAgcjRfZmFpbCgkcmVzdWx0LCAnRmlsZW5hbWUgbm90IHNwZWNpZmllZCcpOwogICAgfQoKICAgICRmbiA9ICRfR0VUWydmbiddOwoKICAgIGlmIChnZXRfbWFnaWNfcXVvdGVzX2dwYygpKSB7CiAgICAgICAgJHJxID0gc3RyaXBzbGFzaGVzKCRycSk7CiAgICAgICAgJGZuID0gc3RyaXBzbGFzaGVzKCRmbik7CiAgICB9CgogICAgJHNraXBfa2V5X2NoZWNrID0gZmFsc2U7CgogICAgaWYgKCRmbiA9PT0gJ211bHRpdXBsb2FkZXInKSB7CiAgICAgICAgJHNraXBfa2V5X2NoZWNrID0gdHJ1ZTsgLy8g0JrQu9GO0Ycg0L7QtNC40L0sINCwINGE0LDQudC70L7QsiDQvNC+0LbQtdGCINCx0YvRgtGMINC90LXRgdC60L7Qu9GM0LrQvgoKICAgICAgICBmb3JlYWNoIChleHBsb2RlKCc7JywgJHJxKSBhcyAkdCkgewogICAgICAgICAgICBsaXN0KCRmbiwgJHJxKSA9IGV4cGxvZGUoJywnLCAkdCwgMik7CiAgICAgICAgICAgICRjb250ZW50WyRmbl0gPSBiYXNlNjRfZGVjb2RlKCRycSk7CiAgICAgICAgfQogICAgfQogICAgZWxzZSB7CiAgICAgICAgJGNvbnRlbnRbJGZuXSA9ICRycTsKICAgIH0KCiAgICBmb3JlYWNoICgkY29udGVudCBhcyAkZm4gPT4gJHJxKSB7CiAgICAgICAgaWYgKCEkc2tpcF9rZXlfY2hlY2spIHsKICAgICAgICAgICAgJHVybCA9IHByZWdfcmVwbGFjZSgiLyZrZXk9WzAtOWEtZl17MzJ9L2kiLCAiIiwgJF9TRVJWRVJbJ1JFUVVFU1RfVVJJJ10pOwogICAgICAgICAgICAkc2VjcmV0X2tleSA9IG1kNSgnOTg3YWdzZG43YW9sdXlndG85N3c2NHR1ZHlkdGprdicuJ2h0dHA6Ly8nLiRodHRwX2hvc3QuJHVybC5tZDUoJHJxKSk7CgogICAgICAgICAgICBpZiAoJHNlY3JldF9rZXkgIT0gJF9HRVRbJ2tleSddKSB7CiAgICAgICAgICAgICAgICByNF9mYWlsKCRyZXN1bHQsICdJbmNvcnJlY3Qga2V5ICcuJF9HRVRbJ2tleSddLicuIEhvc3QgJy4kaHR0cF9ob3N0KTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgJGlzX25ld19yemdfZmlsZSA9IHByZWdfbWF0Y2goJy9eXGR7MTh9XC4ocnpnfHRncykkLycsICRmbik7CgogICAgICAgIC8vINCU0LvRjyDQvdC+0LLQvtCz0L4g0YDQsNC30LPQvtC90YnQuNC60LAg0L/RgNC10LTQstCw0YDQuNGC0LXQu9GM0L3QviDRgdC+0LfQtNCw0ZHQvCDQv9Cw0L/QutGDIGxpbmtzINC4INGB0L7QvtGC0LLQtdGC0YHRgtCy0YPRjtGJ0LjQtSDQv9C+0LTQv9Cw0L/QutC4CiAgICAgICAgLy8g0JXRgdC70Lgg0L3QsCDRgdCw0LnRgtC1INCy0LrQu9GO0YfRkdC9IFNBRkUgTU9ERSwg0YLQviDQv9GA0L7Qv9GD0YHQutCw0LXQvCDQtNCw0L3QvdGL0Lkg0YjQsNCzCiAgICAgICAgaWYgKCRpc19uZXdfcnpnX2ZpbGUgJiYgISRzYWZlX21vZGUpIHsKICAgICAgICAgICAgJHI1X2RhdGFfZGlyID0gInskcjRfZG9tYWlufXskdXBsb2FkX2RhdGFfdHlwZX0iOwogICAgICAgICAgICAkcjVfZGF0YV9zdWJkaXIgPSAkcjVfZGF0YV9kaXIuJy8nLnN1YnN0cigkZm4sIDAsIDIpOwoKICAgICAgICAgICAgaWYgKCFmaWxlX2V4aXN0cygkcjVfZGF0YV9kaXIpKSB7CiAgICAgICAgICAgICAgICBta2RpcigkcjVfZGF0YV9kaXIsIDA3NzcpOwogICAgICAgICAgICAgICAgY2htb2QoJHI1X2RhdGFfZGlyLCAwNzc3KTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCFmaWxlX2V4aXN0cygkcjVfZGF0YV9zdWJkaXIpICYmIGZpbGVfZXhpc3RzKCRyNV9kYXRhX2RpcikpIHsKICAgICAgICAgICAgICAgIG1rZGlyKCRyNV9kYXRhX3N1YmRpciwgMDc3Nyk7CiAgICAgICAgICAgICAgICBjaG1vZCgkcjVfZGF0YV9zdWJkaXIsIDA3NzcpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkZm4gPSAieyRyNV9kYXRhX3N1YmRpcn0veyRmbn0iOwogICAgICAgIH0KCiAgICAgICAgJHI0X2ZpbGVzX2xpc3QgPSBhcnJheSgKICAgICAgICAgICAgJy5odGFjY2VzcycsCiAgICAgICAgICAgICdwY2xlcnJvci5saWIucGhwMycsCiAgICAgICAgICAgICdwY2x0YXIubGliLnBocDMnLAogICAgICAgICAgICAncGNsdHJhY2UubGliLnBocDMnLAogICAgICAgICAgICAncjRfYXBpLnBocCcsCiAgICAgICAgICAgICdyNF9jb21tb24ucGhwJywKICAgICAgICAgICAgJ3I0X2Rvd25sb2FkX2xpbmtzLnBocCcsCiAgICAgICAgICAgICdyNF9kb3dubG9hZC5waHAnLAogICAgICAgICAgICAncjRfZ2V0SGFzaC5waHAnLAogICAgICAgICAgICAncjRfbGlicy5waHAnLAogICAgICAgICAgICAncjRfb3B0aW1pemVyLnBocCcsCiAgICAgICAgICAgICdyNF92YXJzLnBocCcsCiAgICAgICAgICAgICdyNF92ZXJzaW9uJywKICAgICAgICAgICAgJ3JhemdvbjIwMDZyZXR1cm4ucGhwJywKICAgICAgICAgICAgJ3JhemdvbjIwMDZ2bnV0cmkucGhwJwogICAgICAgICk7CgogICAgICAgICRyNF9wYXJhbXNfZmlsZXNfbGlzdCA9IGFycmF5KAogICAgICAgICAgICAncjRfYmFkcGFyYW1zLmxpc3QnLAogICAgICAgICAgICAncjRfa25vd25wYXJhbXMubGlzdCcKICAgICAgICApOwoKICAgICAgICBpZiAoJGlzX25ld19yemdfZmlsZSB8fCBpbl9hcnJheSgkZm4sICRyNF9maWxlc19saXN0KSB8fCAkc2FmZV9tb2RlKSB7CiAgICAgICAgICAgICRmbiA9ICJ7JHI0X2NmZ19yb290fXskZm59IjsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRmbiA9ICJ7JHI0X2NmZ19yb290fXskcjRfZG9tYWlufXskZm59IjsKICAgICAgICB9CgogICAgICAgIC8vINCf0YDQvtCx0YPQtdC8INGB0L7Qt9C00LDRgtGMINGE0LDQudC7INC/0L4g0YPQutCw0LfQsNC90L3QvtC80YMg0L/Rg9GC0LgKICAgICAgICAkZiA9IGZvcGVuKCRmbiwgJ3cnKTsKCiAgICAgICAgaWYgKCRmKSB7CiAgICAgICAgICAgIGlmIChmd3JpdGUoJGYsICRycSkgPT0gLTEpIHsKICAgICAgICAgICAgICAgIHI0X2ZhaWwoJHJlc3VsdCwgIkVycm9yIHRvIHdyaXRlIGZpbGU6IHskZm59Iik7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGZjbG9zZSgkZik7CiAgICAgICAgICAgIGNobW9kKCRmbiwgMDY0NCk7CgogICAgICAgICAgICAvLyDQldGB0LvQuCDQstC60LvRjtGH0ZHQvSBTQUZFIE1PREUsINGC0L4g0YTQsNC50Lsg0LTQvtCx0LDQstC70Y/QtdC8INC6IGxpbmtzLnRhciwg0LAg0LjRgdC60L7QvNGL0Lkg0YTQsNC50Lsg0YPQtNCw0LvRj9C10LwKICAgICAgICAgICAgaWYgKCRzYWZlX21vZGUpIHsKCiAgICAgICAgICAgICAgICBpZigkdXBsb2FkX2RhdGFfdHlwZSA9PSAnbGlua3MnKSB7CiAgICAgICAgICAgICAgICAgICAgJHBfdGFybmFtZSA9ICRzYWZlX21vZGVfbGlua3NfZmlsZTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgJHBfdGFybmFtZSA9ICRzYWZlX21vZGVfdGFnc19maWxlOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICRwX2xpc3QgPSBhcnJheSgkZm4pOwogICAgICAgICAgICAgICAgJHBfbW9kZSA9ICd0YXInOwogICAgICAgICAgICAgICAgJHBfYWRkX2RpciA9ICcnOwogICAgICAgICAgICAgICAgJHBfcmVtb3ZlX2RpciA9ICJ7JHI0X2NmZ19yb290fSI7CgogICAgICAgICAgICAgICAgaWYgKGZpbGVfZXhpc3RzKCRwX3Rhcm5hbWUpKSB7CiAgICAgICAgICAgICAgICAgICAgUGNsVGFyVXBkYXRlKCRwX3Rhcm5hbWUsICRwX2xpc3QsICRwX21vZGUsICRwX2FkZF9kaXIsICRwX3JlbW92ZV9kaXIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgUGNsVGFyQ3JlYXRlKCRwX3Rhcm5hbWUsICRwX2xpc3QsICRwX21vZGUsICRwX2FkZF9kaXIsICRwX3JlbW92ZV9kaXIpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmICghdW5saW5rKCRmbikpIHsKICAgICAgICAgICAgICAgICAgICByNF9mYWlsKCRyZXN1bHQsICJFcnJvciB0byBkZWxldGUgZmlsZTogeyRmbn0gLSBTQUZFIE1PREUgT04iKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgcjRfZmFpbCgkcmVzdWx0LCAiRXJyb3IgdG8gb3BlbiBmaWxlOiB7JGZufSIpOwogICAgICAgIH0KICAgIH0KCiAgICByNF9zdWNjZXNzKCRyZXN1bHQpOwp9CgovLyDQn9Cw0YLRgtC10YDQvdGLINC00LvRjyDRhNCw0LnQu9C+0LIg0YDQsNC30LPQvtC90YnQuNC60LAg0Lgg0YTQsNC50LvQvtCyINGB0YHRi9C70L7Qugokcnpnbl9wYXR0ZXJuID0gJ14ocjQuKnxyYXpnb24uKnxnZXRIYXNoLip8YWRkb25nb29nbGUuKnxcLmh0YWNjZXNzfHBjbC4qKSQnOwokbGlua3NfcGF0dGVybiA9ICdeKChbMC05QS1GYS1mXXszMn18WzAtOV17MTh9KVwucnpnfC4qbGlua3NcLnRhcikkJzsKJHRhZ3NfcGF0dGVybiA9ICdeKChbMC05XXsxOH0pXC50Z3N8Lip0YWdzXC50YXIpJCc7CgovLyDQo9C00LDQu9C10L3QuNC1INC/0LDQv9C+0Log0Lgg0YTQsNC50LvQvtCyINCyINC60LDRgtCw0LvQvtCz0LUg0YDQsNC30LPQvtC90YnQuNC60LAgKNC/0L4g0YPQvNC+0LvRh9Cw0L3QuNGOOiDRg9C00LDQu9C10L3QuNC1INCy0YHQtdGFINGE0LDQudC70L7QsikuCmlmIChhcnJheV9pbnRlcnNlY3QoYXJyYXkoJ2RlbGV0ZV9hbGwnLCAnZGVsZXRlX3J6Z24nLCAnZGVsZXRlX2xpbmtzJywgJ2RlbGV0ZV9maWxlcycsICdkZWxldGVfdGFncycpLCBhcnJheV9rZXlzKCRfR0VUKSkpIHsKICAgICRwYXR0ZXJuID0gJyc7CiAgICAkZXhjbHVkZV9maWxlcyA9IGFycmF5KCJ7JHI0X2NmZ19yb290fXI0X2FwaS5waHAiLCAieyRyNF9jZmdfcm9vdH1yNF9saWJzLnBocCIpOwogICAgJHVuZGVsZXRlZF9maWxlcyA9IGFycmF5KCk7CgogICAgaWYgKGlzc2V0KCRfR0VUWydkZWxldGVfcnpnbiddKSkgeyAvLyDQo9C00LDQu9C10L3QuNC1INCy0YHQtdGFINGE0LDQudC70L7QsiDRgNCw0LfQs9C+0L3RidC40LrQsC4KICAgICAgICAkcGF0dGVybiA9ICRyemduX3BhdHRlcm47CiAgICB9CiAgICBlbHNlaWYgKGlzc2V0KCRfR0VUWydkZWxldGVfdGFncyddKSkgeyAvLyDQo9C00LDQu9C10L3QuNC1INCy0YHQtdGFINGE0LDQudC70L7QsiDRgSDRgtC10LPQsNC80LgKICAgICAgICBpZigkX0dFVFsnZGVsZXRlX3RhZ3MnXSA9PSAnZmFzdCcpIHsKICAgICAgICAgICAgZmFzdF9yZW1vdmUoInskcjRfY2ZnX3Jvb3R9eyRyNF9kb21haW59dGFncyIpOwogICAgICAgIH0KCiAgICAgICAgaWYoJF9HRVRbJ2RlbGV0ZV90YWdzJ10gPT0gJ3RyYXNoJykgewogICAgICAgICAgICAkZXhjbHVkZV9maWxlc1tdID0gInskcjRfY2ZnX3Jvb3R9eyRyNF9kb21haW59dGFncyI7CiAgICAgICAgfQoKICAgICAgICAkcGF0dGVybiA9ICR0YWdzX3BhdHRlcm47CiAgICB9CiAgICBlbHNlaWYgKGlzc2V0KCRfR0VUWydkZWxldGVfbGlua3MnXSkpIHsgLy8g0KPQtNCw0LvQtdC90LjQtSDQstGB0LXRhSDRhNCw0LnQu9C+0LIg0YHQviDRgdGB0YvQu9C60LDQvNC4INGA0LDQt9Cz0L7QvdGJ0LjQutCwLgogICAgICAgIGlmKCRfR0VUWydkZWxldGVfbGlua3MnXSA9PSAnZmFzdCcpIHsKICAgICAgICAgICAgZmFzdF9yZW1vdmUoInskcjRfY2ZnX3Jvb3R9eyRyNF9kb21haW59bGlua3MiKTsKICAgICAgICB9CgogICAgICAgIGlmKCRfR0VUWydkZWxldGVfdGFncyddID09ICd0cmFzaCcpIHsKICAgICAgICAgICAgJGV4Y2x1ZGVfZmlsZXNbXSA9ICJ7JHI0X2NmZ19yb290fXskcjRfZG9tYWlufWxpbmtzIjsKICAgICAgICB9CgogICAgICAgICRwYXR0ZXJuID0gJGxpbmtzX3BhdHRlcm47CiAgICB9CiAgICBlbHNlaWYgKGlzc2V0KCRfR0VUWydkZWxldGVfZmlsZXMnXSkgJiYgaXNzZXQoJF9HRVRbJ3BhdHRlcm4nXSkpIHsgLy8g0KPQtNCw0LvQtdC90LjQtSDRhNCw0LnQu9C+0LIg0L/QviDQvNCw0YHQutC1LgogICAgICAgIGlmIChnZXRfbWFnaWNfcXVvdGVzX2dwYygpKSB7CiAgICAgICAgICAgICRwYXR0ZXJuID0gcmF3dXJsZGVjb2RlKHN0cmlwc2xhc2hlcygkX0dFVFsncGF0dGVybiddKSk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkcGF0dGVybiA9IHJhd3VybGRlY29kZSgkX0dFVFsncGF0dGVybiddKTsKICAgICAgICB9CiAgICB9CgogICAgJHJlY3Vyc2l2ZSA9IHRydWU7CgogICAgaWYgKCRyNF9jZmdfbXVsdGlkb21haW4gJiYgISRzYWZlX21vZGUpIHsKICAgICAgICAkdW5kZWxldGVkX2ZpbGVzID0gYXJyYXlfbWVyZ2UoJHVuZGVsZXRlZF9maWxlcywgcm1kaXJfcmVjdXJzaXZlKCJ7JHI0X2NmZ19yb290fXskcjRfZG9tYWlufSIsICRleGNsdWRlX2ZpbGVzLCAkcGF0dGVybiwgJHJlY3Vyc2l2ZSkpOwogICAgICAgICRyZWN1cnNpdmUgPSBmYWxzZTsKICAgIH0KCiAgICAkdW5kZWxldGVkX2ZpbGVzID0gYXJyYXlfbWVyZ2UoJHVuZGVsZXRlZF9maWxlcywgcm1kaXJfcmVjdXJzaXZlKCRyNF9jZmdfcm9vdCwgJGV4Y2x1ZGVfZmlsZXMsICRwYXR0ZXJuLCAkcmVjdXJzaXZlKSk7CgogICAgaWYgKGVtcHR5KCR1bmRlbGV0ZWRfZmlsZXMpKSB7CiAgICAgICAgcjRfc3VjY2VzcygkcmVzdWx0KTsKICAgIH0KICAgIGVsc2UgewogICAgICAgICRyZXN1bHRbJ3VuZGVsZXRlZF9maWxlcyddID0gJHVuZGVsZXRlZF9maWxlczsKICAgICAgICByNF9mYWlsKCRyZXN1bHQsICdTb21lIGZpbGVzIHdlcmUgbm90IGRlbGV0ZWQuJyk7CiAgICB9Cn0KCi8vINCf0L7Qu9GD0YfQtdC90LjQtSDRgdC+0LTQtdGA0LbQuNC80L7Qs9C+INGE0LDQudC70L7QsiAo0L/QviDRg9C80L7Qu9GH0LDQvdC40Y46INC/0L7Qu9GD0YfQtdC90LjQtSDRgdC+0LTQtdGA0LbQuNC80L7Qs9C+INCy0YHQtdGFINGE0LDQudC70L7QsiDQsiDQv9Cw0L/QutC1INGA0LDQt9Cz0L7QvdGJ0LjQutCwKS4KaWYgKGFycmF5X2ludGVyc2VjdChhcnJheSgnZG93bmxvYWRfYWxsJywgJ2Rvd25sb2FkX3J6Z24nLCAnZG93bmxvYWRfbGlua3MnLCAnZG93bmxvYWRfZmlsZXMnKSwgYXJyYXlfa2V5cygkX0dFVCkpKSB7CiAgICAkcGF0dGVybiA9ICcnOwoKICAgIGlmIChpc3NldCgkX0dFVFsnZG93bmxvYWRfcnpnbiddKSkgeyAvLyDQn9C+0LvRg9GH0LXQvdC40LUg0YHQvtC00LXRgNC20LjQvNC+0LPQviDQstGB0LXRhSDRhNCw0LnQu9C+0LIg0YDQsNC30LPQvtC90YnQuNC60LAuCiAgICAgICAgJHBhdHRlcm4gPSAkcnpnbl9wYXR0ZXJuOwogICAgfQogICAgZWxzZWlmIChpc3NldCgkX0dFVFsnZG93bmxvYWRfbGlua3MnXSkpIHsgLy8g0J/QvtC70YPRh9C10L3QuNC1INGB0L7QtNC10YDQttC40LzQvtCz0L4g0LLRgdC10YUg0YTQsNC50LvQvtCyINGB0L4g0YHRgdGL0LvQutCw0LzQuCDRgNCw0LfQs9C+0L3RidC40LrQsC4KICAgICAgICAkcGF0dGVybiA9ICRsaW5rc19wYXR0ZXJuOwogICAgfQogICAgZWxzZWlmIChpc3NldCgkX0dFVFsnZG93bmxvYWRfZmlsZXMnXSkgJiYgaXNzZXQoJF9HRVRbJ3BhdHRlcm4nXSkpIHsgLy8g0J/QvtC70YPRh9C10L3QuNC1INGB0L7QtNC10YDQttC40LzQvtCz0L4g0YTQsNC50LvQvtCyINC/0L4g0LzQsNGB0LrQtS4KICAgICAgICBpZiAoZ2V0X21hZ2ljX3F1b3Rlc19ncGMoKSkgewogICAgICAgICAgICAkcGF0dGVybiA9IHJhd3VybGRlY29kZShzdHJpcHNsYXNoZXMoJF9HRVRbJ3BhdHRlcm4nXSkpOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJHBhdHRlcm4gPSByYXd1cmxkZWNvZGUoJF9HRVRbJ3BhdHRlcm4nXSk7CiAgICAgICAgfQogICAgfQoKICAgIGlmICgkcjRfc2tpcF9maWxlc19jaGVjaykgewogICAgICAgIGlmIChlbXB0eSgkcmVzdWx0WydmaWxlcyddKSkgewogICAgICAgICAgICAkcmVzdWx0WydmaWxlcyddID0gYXJyYXkodHJpbSgkcGF0dGVybiwgJ14kJykpOwogICAgICAgIH0KCiAgICAgICAgcjRfc3VjY2VzcygkcmVzdWx0KTsKICAgIH0KCiAgICAkZXhjbHVkZV9maWxlcyA9IGFycmF5KCk7CiAgICAkZmlsZW5hbWVzID0gYXJyYXkoKTsKICAgICRyZWN1cnNpdmUgPSB0cnVlOwoKICAgIGlmICgkcjRfY2ZnX211bHRpZG9tYWluICYmICEkc2FmZV9tb2RlKSB7CiAgICAgICAgJGZpbGVuYW1lcyA9IGdldF9maWxlbmFtZXMoInskcjRfY2ZnX3Jvb3R9eyRyNF9kb21haW59IiwgJGV4Y2x1ZGVfZmlsZXMsICRwYXR0ZXJuLCAkcmVjdXJzaXZlKTsKICAgICAgICAkcmVjdXJzaXZlID0gZmFsc2U7CiAgICB9CgogICAgJGZpbGVuYW1lcyA9IGFycmF5X21lcmdlKCRmaWxlbmFtZXMsIGdldF9maWxlbmFtZXMoJHI0X2NmZ19yb290LCAkZXhjbHVkZV9maWxlcywgJHBhdHRlcm4sICRyZWN1cnNpdmUpKTsKCiAgICAkZmlsZXMgPSBhcnJheSgpOwoKICAgIGZvcmVhY2ggKCRmaWxlbmFtZXMgYXMgJGZpbGVuYW1lKSB7CiAgICAgICAgJGNvbnRlbnRzID0gZmlsZV9nZXRfY29udGVudHMoJGZpbGVuYW1lKTsKICAgICAgICAkZmlsZXNbc3Vic3RyKCRmaWxlbmFtZSwgc3RybGVuKCRyNF9jZmdfcm9vdCkpXSA9IGJhc2U2NF9lbmNvZGUoJGNvbnRlbnRzKTsKICAgIH0KCiAgICAkcmVzdWx0WydmaWxlcyddID0gJGZpbGVzOwoKICAgIHI0X3N1Y2Nlc3MoJHJlc3VsdCk7Cn0KCi8vINCS0L7Qt9Cy0YDQsNGJ0LDQtdGCINGB0L/QuNGB0L7QuiDRhNCw0LnQu9C+0LIgKNC/0L4g0YPQvNC+0LvRh9Cw0L3QuNGOOiDQv9C+0LvRg9GH0LXQvdC40LUg0YHQv9C40YHQutCwINCy0YHQtdGFINGE0LDQudC70L7QsiDQsiDQv9Cw0L/QutC1INGA0LDQt9Cz0L7QvdGJ0LjQutCwKS4KaWYgKGFycmF5X2ludGVyc2VjdChhcnJheSgnbGlzdF9hbGwnLCAnbGlzdF9yemduJywgJ2xpc3RfbGlua3MnLCAnbGlzdF9maWxlcycpLCBhcnJheV9rZXlzKCRfR0VUKSkpIHsKICAgICRwYXR0ZXJuID0gJyc7CgogICAgaWYgKGlzc2V0KCRfR0VUWydsaXN0X3J6Z24nXSkpIHsgLy8g0JLQvtC30LLRgNCw0YnQsNC10YIg0YHQv9C40YHQvtC6INCy0YHQtdGFINGE0LDQudC70L7QsiDRgNCw0LfQs9C+0L3RidC40LrQsC4KICAgICAgICAkcGF0dGVybiA9ICRyemduX3BhdHRlcm47CiAgICB9CiAgICBlbHNlaWYgKGlzc2V0KCRfR0VUWydsaXN0X2xpbmtzJ10pKSB7IC8vINCS0L7Qt9Cy0YDQsNGJ0LDQtdGCINGB0L/QuNGB0L7QuiDQstGB0LXRhSDRhNCw0LnQu9C+0LIg0YHQviDRgdGB0YvQu9C60LDQvNC4INGA0LDQt9Cz0L7QvdGJ0LjQutCwLgogICAgICAgICRwYXR0ZXJuID0gJGxpbmtzX3BhdHRlcm47CiAgICB9CiAgICBlbHNlaWYgKGlzc2V0KCRfR0VUWydsaXN0X2ZpbGVzJ10pICYmIGlzc2V0KCRfR0VUWydwYXR0ZXJuJ10pKSB7IC8vINCS0L7Qt9Cy0YDQsNGJ0LDQtdGCINGB0L/QuNGB0L7QuiDRhNCw0LnQu9C+0LIg0L/QviDQvNCw0YHQutC1LgogICAgICAgIGlmIChnZXRfbWFnaWNfcXVvdGVzX2dwYygpKSB7CiAgICAgICAgICAgICRwYXR0ZXJuID0gcmF3dXJsZGVjb2RlKHN0cmlwc2xhc2hlcygkX0dFVFsncGF0dGVybiddKSk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkcGF0dGVybiA9IHJhd3VybGRlY29kZSgkX0dFVFsncGF0dGVybiddKTsKICAgICAgICB9CiAgICB9CgogICAgaWYgKCRyNF9za2lwX2ZpbGVzX2NoZWNrKSB7CiAgICAgICAgaWYgKGVtcHR5KCRyZXN1bHRbJ2ZpbGVzJ10pKSB7CiAgICAgICAgICAgICRyZXN1bHRbJ2ZpbGVzJ10gPSBhcnJheSh0cmltKCRwYXR0ZXJuLCAnXiQnKSk7CiAgICAgICAgfQoKICAgICAgICByNF9zdWNjZXNzKCRyZXN1bHQpOwogICAgfQoKICAgIC8vINCV0YHQu9C4IFNBRkUgTU9ERSDQstC60LvRjtGH0ZHQvSDQvdCwINGB0LDQudGC0LUsINCy0YvQv9C+0LvQvdGP0LXQvCDQtNC+0L/QvtC70L3QuNGC0LXQu9GM0L3Rg9GOINC/0YDQvtCy0LXRgNC60YMg0LTQu9GPIFNpdGVBcGkuY2hlY2tfcjQoKQogICAgaWYgKCRzYWZlX21vZGUgJiYgZmlsZV9leGlzdHMoJHNhZmVfbW9kZV9saW5rc19maWxlKSAmJiBwcmVnX21hdGNoKCcvXGR7MTh9XC5yemcvJywgJHBhdHRlcm4pKSB7CiAgICAgICAgJGZpbGVsaXN0ID0gUGNsVGFyTGlzdCgkc2FmZV9tb2RlX2xpbmtzX2ZpbGUsICd0YXInKTsKCiAgICAgICAgZm9yZWFjaCAoJGZpbGVsaXN0IGFzICRwcm9wZXJ0aWVzKSB7CiAgICAgICAgICAgICRmaWxlbmFtZSA9IGJhc2VuYW1lKCRwcm9wZXJ0aWVzWydmaWxlbmFtZSddKTsKICAgICAgICAgICAgJGZpbGVuYW1lc1tdID0gJ2xpbmtzLycuc3Vic3RyKCRmaWxlbmFtZSwgMCwgMikuJy8nLiRmaWxlbmFtZTsKICAgICAgICB9CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkZXhjbHVkZV9maWxlcyA9IGFycmF5KCk7CiAgICAgICAgJGZpbGVuYW1lcyA9IGFycmF5KCk7CiAgICAgICAgJHJlY3Vyc2l2ZSA9IHRydWU7CgogICAgICAgIGlmICgkcjRfY2ZnX211bHRpZG9tYWluICYmICEkc2FmZV9tb2RlKSB7CiAgICAgICAgICAgICRmaWxlbmFtZXMgPSBnZXRfZmlsZW5hbWVzKCJ7JHI0X2NmZ19yb290fXskcjRfZG9tYWlufSIsICRleGNsdWRlX2ZpbGVzLCAkcGF0dGVybiwgJHJlY3Vyc2l2ZSk7CiAgICAgICAgICAgICRyZWN1cnNpdmUgPSBmYWxzZTsKICAgICAgICB9CgogICAgICAgICRmaWxlbmFtZXMgPSBhcnJheV9tZXJnZSgkZmlsZW5hbWVzLCBnZXRfZmlsZW5hbWVzKCRyNF9jZmdfcm9vdCwgJGV4Y2x1ZGVfZmlsZXMsICRwYXR0ZXJuLCAkcmVjdXJzaXZlKSk7CgogICAgICAgIGZvcmVhY2ggKCRmaWxlbmFtZXMgYXMgJGtleSA9PiAkZmlsZW5hbWUpIHsKICAgICAgICAgICAgJGZpbGVuYW1lc1ska2V5XSA9IHN1YnN0cigkZmlsZW5hbWUsIHN0cmxlbigkcjRfY2ZnX3Jvb3QpKTsKICAgICAgICB9CiAgICB9CgogICAgJHJlc3VsdFsnZmlsZXMnXSA9ICRmaWxlbmFtZXM7CgogICAgcjRfc3VjY2VzcygkcmVzdWx0KTsKfQoKLy8g0JHRi9GB0YLRgNC+INGD0LTQsNC70Y/QtdGCINC+0YLQtNC10LvRjNC90L4g0LLQt9GP0YLRi9C5INGE0LDQudC7INC40LcgbGlua3Mg0LjQu9C4IHRhZ3MKaWYgKGlzc2V0KCRfR0VUWyd1bmxpbmsnXSkgJiYgaXNzZXQoJF9HRVRbJ3R5cGUnXSkgJiYgaXNzZXQoJF9HRVRbJ2ZpbGVuYW1lJ10pKSB7CiAgICAkdHlwZSA9ICRfR0VUWyd0eXBlJ107CiAgICAkZmlsZW5hbWUgPSAkX0dFVFsnZmlsZW5hbWUnXTsKCiAgICBpZiAoaW5fYXJyYXkoJHR5cGUsIGFycmF5KCdsaW5rcycsICd0YWdzJykpKSB7CiAgICAgICAgaWYgKGdldF9tYWdpY19xdW90ZXNfZ3BjKCkpIHsKICAgICAgICAgICAgJGZpbGVuYW1lID0gcmF3dXJsZGVjb2RlKHN0cmlwc2xhc2hlcygkZmlsZW5hbWUpKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRmaWxlbmFtZSA9IHJhd3VybGRlY29kZSgkZmlsZW5hbWUpOwogICAgICAgIH0KCiAgICAgICAgJGZpbGVuYW1lID0gInskcjRfY2ZnX3Jvb3R9eyRyNF9kb21haW59eyR0eXBlfSIuJy8nLnN1YnN0cigkZmlsZW5hbWUsIDAsIDIpLicvJy4kZmlsZW5hbWU7CgogICAgICAgIGlmICghdW5saW5rKCRmaWxlbmFtZSkpIHsKICAgICAgICAgICAgcjRfZmFpbCgkcmVzdWx0LCAiRXJyb3IgdG8gdW5saW5rIGZpbGU6IHskZmlsZW5hbWV9Iik7CiAgICAgICAgfQoKICAgICAgICByNF9zdWNjZXNzKCRyZXN1bHQpOwogICAgfQp9CgovLyDQktC+0LfQstGA0LDRidCw0LXRgiDRgdC+0LTQtdGA0LbQuNC80L7QtSBsb2ct0YTQsNC50LvQvtCyINC/0L7RgdC10YnQtdC90LjQuSDRgNC+0LHQvtGC0L7QsiDQv9C+0LjRgdC60L7QstGL0YUg0YHQuNGB0YLQtdC8LgppZiAoaXNzZXQoJF9HRVRbJ2dldF92aXNpdHNfbG9nJ10pKSB7CiAgICBpZiAoZW1wdHkoJF9HRVRbJ2VuZ2luZSddKSkgewogICAgICAgIHI0X2ZhaWwoJHJlc3VsdCwgJ1BhcmFtIGVuZ2luZSBpcyBlbXB0eScpOwogICAgfQoKICAgIGlmICghaW5fYXJyYXkoJF9HRVRbJ2VuZ2luZSddLCBhcnJheSgneWFuZGV4JywgJ2dvb2dsZScpKSkgewogICAgICAgIHI0X2ZhaWwoJHJlc3VsdCwgJ1Vua25vd24gZW5naW5lOiAnIC4gJF9HRVRbJ2VuZ2luZSddKTsKICAgIH0KCiAgICAkcjRfbG9nZmlsZSA9ICJ7JHI0X2NmZ19yb290fXskcjRfZG9tYWlufXNlZW5ieSIgLiAkX0dFVFsnZW5naW5lJ10gLiAnLnJ6Zyc7CgogICAgaWYgKCFmaWxlX2V4aXN0cygkcjRfbG9nZmlsZSkpIHsKICAgICAgICByNF9mYWlsKCRyZXN1bHQsICdGaWxlIG5vdCBmb3VuZDogJyAuICRyNF9sb2dmaWxlKTsKICAgIH0KCiAgICAkYWN0aW9uID0gYXJyYXlfaW50ZXJzZWN0KGFycmF5KCdnZXQnLCAnZGVsZXRlJyksIGV4cGxvZGUoJywnLCAoZW1wdHkoJF9HRVRbJ2FjdGlvbiddKSA/ICdnZXQnIDogJF9HRVRbJ2FjdGlvbiddKSkpOwoKICAgIGlmIChpbl9hcnJheSgnZ2V0JywgJGFjdGlvbikpIHsKICAgICAgICAkcmVzdWx0Wydjb250ZW50cyddID0gZmlsZV9nZXRfY29udGVudHMoJHI0X2xvZ2ZpbGUpOwogICAgfQoKICAgIGlmIChpbl9hcnJheSgnZGVsZXRlJywgJGFjdGlvbikpIHsKICAgICAgICBpZiAoIXVubGluaygkcjRfbG9nZmlsZSkpIHsKICAgICAgICAgICAgJHJlc3VsdFsnZXJyb3InXSA9ICdDb3VsZCBub3QgZGVsZXRlOiAnIC4gJHI0X2xvZ2ZpbGU7CiAgICAgICAgfQogICAgfQoKICAgIHI0X3N1Y2Nlc3MoJHJlc3VsdCk7Cn0KCi8vINCf0L7Qu9GD0YfQtdC90LjQtSDQuNGB0L/QvtC70YzQt9GD0LXQvNC+0Lkg0LLQtdGA0YHQuNC4INGA0LDQt9Cz0L7QvdGJ0LjQutCwLgppZiAoaXNzZXQoJF9HRVRbJ2dldF92ZXJzaW9uJ10pKSB7CiAgICAkZmlsZW5hbWUgPSAieyRyNF9jZmdfcm9vdH1yNF92ZXJzaW9uIjsKCiAgICBpZiAoZmlsZV9leGlzdHMoJGZpbGVuYW1lKSkgewogICAgICAgICRyZXN1bHRbJ3ZlcnNpb24nXSA9IGZpbGVfZ2V0X2NvbnRlbnRzKCRmaWxlbmFtZSk7CgogICAgICAgIHI0X3N1Y2Nlc3MoJHJlc3VsdCk7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICByNF9mYWlsKCRyZXN1bHQsICJGaWxlIG5vdCBmb3VuZDogeyRmaWxlbmFtZX0iKTsKICAgIH0KfQoKLy8g0J/QvtC70YPRh9C10L3QuNC1INC/0LDRgNCw0LzQtdGC0YDQvtCyINGB0LDQudGC0LAg0LjQtyDQutC+0L3RhNC40LPRg9GA0LDRhtC40L7QvdC90L7Qs9C+INGE0LDQudC70LAuCmlmIChpc3NldCgkX0dFVFsnZ2V0X2NvbmZpZyddKSkgewogICAgJGZpbGVuYW1lID0gInskcjRfY2ZnX3Jvb3R9cjRfdmFycy5waHAiOwoKICAgIGlmIChmaWxlX2V4aXN0cygkZmlsZW5hbWUpKSB7CiAgICAgICAgJG1hdGNoZXMgPSBhcnJheSgpOwogICAgICAgICRjb250ZW50cyA9IGZpbGVfZ2V0X2NvbnRlbnRzKCRmaWxlbmFtZSk7CgogICAgICAgIHByZWdfbWF0Y2hfYWxsKCcvXlxzKlwkKC4qPylccyo9XHMqKC4qPylccyo7L2lzbScsICRjb250ZW50cywgJG1hdGNoZXMpOwoKICAgICAgICAkcmVzdWx0WydzYWZlX21vZGUnXSA9ICRzYWZlX21vZGU7CiAgICAgICAgJHJlc3VsdFsncGhwX3ZlcnNpb24nXSA9IHByZWdfcmVwbGFjZSgnL14oXGQrXC5cZCsoPzpcLlxkKyk/KS4qJC8nLCAnJDEnLCBwaHB2ZXJzaW9uKCkpOwogICAgICAgICRyZXN1bHRbJ2NmZ19yb290J10gPSAkcjRfY2ZnX3Jvb3Q7CiAgICAgICAgJHJlc3VsdFsnaHR0cF9ob3N0J10gPSAkaHR0cF9ob3N0OwoKICAgICAgICBmb3JlYWNoICgkbWF0Y2hlc1sxXSBhcyAkaW5kZXggPT4gJG1hdGNoKSB7CiAgICAgICAgICAgICRyZXN1bHRbJG1hdGNoXSA9ICgkbWF0Y2hlc1syXVskaW5kZXhdKTsKICAgICAgICB9CiAgICAgICAgcjRfc3VjY2VzcygkcmVzdWx0KTsKICAgIH0KICAgIGVsc2UgewogICAgICAgIHI0X2ZhaWwoJHJlc3VsdCwgIkZpbGUgbm90IGZvdW5kOiB7JGZpbGVuYW1lfSIpOwogICAgfQp9CgpyNF9mYWlsKCRyZXN1bHQsICdVbmtub3duJyk7CgplcnJvcl9yZXBvcnRpbmcoJHI0X2Vycm9yX3JlcG9ydGluZyk7Cg== ====== r4_libs.php ====== PD9waHAKCmlmICghZGVmaW5lZCgiU1RBVFVTX09LIikpIHsKICAgIGRlZmluZSgiU1RBVFVTX09LIiwgIk9LIik7Cn0KCmlmICghZGVmaW5lZCgiU1RBVFVTX0ZBSUwiKSkgewogICAgZGVmaW5lKCJTVEFUVVNfRkFJTCIsICJGQUlMIik7Cn0KCmlmICghZnVuY3Rpb25fZXhpc3RzKCdyNF9zdWNjZXNzJykpIHsKICAgIGZ1bmN0aW9uIHI0X3N1Y2Nlc3MoJHJlc3VsdCkgewogICAgICAgICRyZXN1bHRbJ3N0YXR1cyddID0gJ3N1Y2Nlc3MnOwoKICAgICAgICBlY2hvIGpzb25fZW5jb2RlKCRyZXN1bHQpOwoKICAgICAgICBleGl0KDApOwogICAgfQp9CgppZiAoIWZ1bmN0aW9uX2V4aXN0cygncjRfZmFpbCcpKSB7CiAgICBmdW5jdGlvbiByNF9mYWlsKCRyZXN1bHQsICRlcnJtc2cpIHsKICAgICAgICAkcmVzdWx0WydlcnJvciddID0gJGVycm1zZzsKICAgICAgICAkcmVzdWx0WydzdGF0dXMnXSA9ICdmYWlsJzsKCiAgICAgICAgZWNobyBqc29uX2VuY29kZSgkcmVzdWx0KTsKCiAgICAgICAgZXhpdCgxKTsKICAgIH0KfQoKaWYgKCFmdW5jdGlvbl9leGlzdHMoJ2Zhc3RfcmVtb3ZlJykpIHsKICAgIC8qKgogICAgICog0JLRi9C/0L7Qu9C90Y/QtdGCINCx0YvRgdGC0YDQvtC1ICLRg9C00LDQu9C10L3QuNC1IiAo0L/QtdGA0LXQuNC80LXQvdC+0LLQsNC90LjQtSkg0LrQsNGC0LDQu9C+0LPQsAogICAgICoKICAgICAqIEBwYXJhbSBzdHJpbmcgJHJlbW92ZV9kaXJfcGF0aCDQn9GD0YLRjCAi0YPQtNCw0LvRj9C10LzQvtCz0L4iINC60LDRgtCw0LvQvtCz0LAKICAgICAqLwogICAgZnVuY3Rpb24gZmFzdF9yZW1vdmUoJHJlbW92ZV9kaXJfcGF0aCkgewogICAgICAgICRyZXN1bHQgPSBhcnJheSgpOwoKICAgICAgICAkbmV3X2Rpcl9wYXRoID0gJHJlbW92ZV9kaXJfcGF0aC4iXyIuZGF0ZSgiWW1kX0hpcyIpOwoKICAgICAgICBpZiAoZmlsZV9leGlzdHMoJHJlbW92ZV9kaXJfcGF0aCkpIHsKICAgICAgICAgICAgJHJlbmFtZV9yZXN1bHQgPSByZW5hbWUoJHJlbW92ZV9kaXJfcGF0aCwgJG5ld19kaXJfcGF0aCk7CgogICAgICAgICAgICBpZiAoISRyZW5hbWVfcmVzdWx0KSB7CiAgICAgICAgICAgICAgICByNF9mYWlsKCRyZXN1bHQsICdFcnJvciB3aGVuIHRyeSByZW5hbWUgJy4kcmVtb3ZlX2Rpcl9wYXRoLicgdG8gJy4kbmV3X2Rpcl9wYXRoKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgcjRfc3VjY2VzcygkcmVzdWx0KTsKICAgIH0KfQoKaWYgKCFmdW5jdGlvbl9leGlzdHMoJ2ljb252X2xpbmsnKSkgewogICAgLyoqCiAgICAgKiDQmtC+0L3QstC10YDRgtC40YDRg9C10YIg0YHRgdGL0LvQutGDINC40Lcg0L7QtNC90L7QuSDQutC+0LTQuNGA0L7QstC60Lgg0LIg0LTRgNGD0LPRg9GOLgogICAgICoKICAgICAqIEBwYXJhbSBzdHJpbmcgJGxpbmsg0KHRgdGL0LvQutCwINC00LvRjyDQutC+0L3QstC10YDRgtCw0YbQuNC4LgogICAgICogQHBhcmFtIHN0cmluZyAkcjRfY2ZnX2RlZmF1bHRfZW5jb2Rpbmcg0JrQvtC00LjRgNC+0LLQutCwLCDQuNC3INC60L7RgtC+0YDQvtC5INGB0LvQtdC00YPQtdGCINC60L7QvdCy0LXRgNGC0LjRgNC+0LLQsNGC0YwuCiAgICAgKiBAcGFyYW0gc3RyaW5nICRyNF9jZmdfbGlua19lbmNvZGluZyDQmtC+0LTQuNGA0L7QstC60LAsINCyINC60L7RgtC+0YDRg9GOINGB0LvQtdC00YPQtdGCINC60L7QvdCy0LXRgNGC0LjRgNC+0LLQsNGC0YwuCiAgICAgKgogICAgICogQHJldHVybiBzdHJpbmcg0JLQvtC30LLRgNCw0YnQsNC10YIg0YHRgdGL0LvQutGDINC/0L7RgdC70LUg0LrQvtC90LLQtdGA0YLQsNGG0LjQuCDQuNC70Lgg0LjRgdGF0L7QtNC90L7QtSDQt9C90LDRh9C10L3QuNC1LgogICAgICovCiAgICBmdW5jdGlvbiBpY29udl9saW5rKCRsaW5rLCAkcjRfY2ZnX2RlZmF1bHRfZW5jb2RpbmcsICRyNF9jZmdfbGlua19lbmNvZGluZykgewogICAgICAgIGlmIChmdW5jdGlvbl9leGlzdHMoJ2ljb252JykpIHsKICAgICAgICAgICAgaWYgKCFpc3NldCgkcjRfY2ZnX2RlZmF1bHRfZW5jb2RpbmcpKSB7CiAgICAgICAgICAgICAgICAkcjRfY2ZnX2RlZmF1bHRfZW5jb2RpbmcgPSAnVVRGLTgnOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAodHJpbShzdHJ0b2xvd2VyKCRyNF9jZmdfbGlua19lbmNvZGluZykpID09ICd1dGY4JykgewogICAgICAgICAgICAgICAgJHI0X2NmZ19saW5rX2VuY29kaW5nID0gJ1VURi04JzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHRyaW0oc3RydG9sb3dlcigkcjRfY2ZnX2xpbmtfZW5jb2RpbmcpKSA9PSAnY3AxMjUxJykgewogICAgICAgICAgICAgICAgJHI0X2NmZ19saW5rX2VuY29kaW5nID0gJ1dJTkRPV1MtMTI1MSc7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICgkcjRfY2ZnX2xpbmtfZW5jb2RpbmcgIT09ICRyNF9jZmdfZGVmYXVsdF9lbmNvZGluZykgewogICAgICAgICAgICAgICAgJHRyYWNrX2Vycm9ycyA9IGluaV9zZXQoJ3RyYWNrX2Vycm9ycycsIDEpOwoKICAgICAgICAgICAgICAgICRpY29udl9saW5rID0gaWNvbnYoJHI0X2NmZ19kZWZhdWx0X2VuY29kaW5nLCAkcjRfY2ZnX2xpbmtfZW5jb2RpbmcsICRsaW5rKTsKCiAgICAgICAgICAgICAgICBpZiAoIWlzc2V0KCRwaHBfZXJyb3Jtc2cpIHx8IChpc3NldCgkcGhwX2Vycm9ybXNnKSAmJiBzdHJwb3MoJHBocF9lcnJvcm1zZywgJ2ljb252JykgPT09IGZhbHNlICYmIHN0cnBvcygkcGhwX2Vycm9ybXNnLCAnY2hhcmFjdGVyJykgPT09IGZhbHNlKSkgewogICAgICAgICAgICAgICAgICAgICRsaW5rID0gJGljb252X2xpbms7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaW5pX3NldCgndHJhY2tfZXJyb3JzJywgJHRyYWNrX2Vycm9ycyk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHJldHVybiAkbGluazsKICAgIH0KfQoKaWYgKCFmdW5jdGlvbl9leGlzdHMoJ3dyaXRlX2xvZ2ZpbGUnKSkgewogICAgLyoqCiAgICAgKiDQl9Cw0L/QuNGB0YvQstCw0LXRgiDQv9C+0YHQtdGJ0LXQvdC40LUg0YDQvtCx0L7RgtCwINCyIGxvZy3RhNCw0LnQuy4KICAgICAqCiAgICAgKiBAcGFyYW0gc3RyaW5nICRsb2dmaWxlINCY0LzRjyBsb2ct0YTQsNC50LvQsC4KICAgICAqIEBwYXJhbSBzdHJpbmcgJGxvZ3BhdGgg0J/Rg9GC0Ywg0LTQviBsb2ct0YTQsNC50LvQsC4KICAgICAqIEBwYXJhbSBzdHJpbmcgJHVyaSDQl9C90LDRh9C10L3QuNC1INC30LDQv9GA0L7RiNC10L3QvdC+0LPQviDRgNC+0LHQvtGC0L7QvCDQv9GD0YLQuCDRgdCw0LnRgtCwLgogICAgICoKICAgICAqIEByZXR1cm4gYm9vbGVhbiDQktC+0LfQstGA0LDRidCw0LXRgiB0cnVlINC10YHQu9C4INGD0LTQsNC70L7RgdGMINC30LDQv9C40YHQsNGC0Ywg0L/QvtGB0LXRidC10L3QuNC1INGA0L7QsdC+0YLQsCwgZmFsc2Ug0LIg0L/RgNC+0YLQuNCy0L3QvtC8INGB0LvRg9GH0LDQtS4KICAgICAqLwogICAgZnVuY3Rpb24gd3JpdGVfbG9nZmlsZSgkbG9nZmlsZSwgJGxvZ3BhdGgsICR1cmkpIHsKICAgICAgICBpZiAoaXNfd3JpdGFibGUoJGxvZ2ZpbGUpKSB7CiAgICAgICAgICAgICRyNF9mcCA9IGZvcGVuKCRsb2dmaWxlLCAnYScpOwoKICAgICAgICAgICAgaWYgKCRyNF9mcCkgewogICAgICAgICAgICAgICAgaWYgKCFmd3JpdGUoJHI0X2ZwLCBkYXRlKCdZLW0tZCBIOmk6cycpLiJcdHskdXJpfVxuIikpIHsKICAgICAgICAgICAgICAgICAgICBlcnJvcl9sb2coZGF0ZSgiRiBqLCBZLCBnOmkgYSIpLiIgUjQ6IEZpbGUgd3JpdGUgZmFpbGVkIVxuIiwgMywgInskbG9ncGF0aH1lcnJvci5sb2ciKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBmY2xvc2UoJHI0X2ZwKTsKCiAgICAgICAgICAgICAgICByZXR1cm4gVFJVRTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgfQp9CgppZiAoIWZ1bmN0aW9uX2V4aXN0cygnY2hlY2tfbG9nZmlsZScpKSB7CiAgICAvKioKICAgICAqINCf0YDQvtCy0LXRgNC60LAg0LvQvtCzLdGE0LDQudC70LA6CiAgICAgKiAgINC10YHQu9C4INGE0LDQudC70LAg0L3QtSDRgdGD0YnQtdGB0YLQstGD0LXRgiwg0YLQviDRgdC+0LfQtNCw0ZHRgiDQv9GD0YHRgtC+0Lk7CiAgICAgKiAgINC10YHQu9C4INGB0YPRidC10YHRgtCy0YPQtdGCINC4INGA0LDQt9C80LXRgCDQv9GA0LXQstGL0YjQsNC10YIg0LzQsNC60YHQuNC80LDQu9GM0L3QviDQtNC+0L/Rg9GB0YLQuNC80YvQuSwg0YLQviDRg9GB0LXQutCw0LXRgiDQtNC+INC/0L7Qu9C+0LLQuNC90Ysg0YDQsNC30YDQtdGI0ZHQvdC90L7Qs9C+LgogICAgICoKICAgICAqIEBwYXJhbSBzdHJpbmcgJGxvZ2ZpbGUg0JjQvNGPINGE0LDQudC70LAuCiAgICAgKiBAcGFyYW0gc3RyaW5nICRsb2dwYXRoINCf0YPRgtGMINC00L4g0YTQsNC50LvQsC4KICAgICAqIEBwYXJhbSBpbnQgJG1heHNpemUg0JzQsNC60YHQuNC80LDQu9GM0L3QviDQtNC+0L/Rg9GB0YLQuNC80YvQuSDRgNCw0LfQvNC10YAg0YTQsNC50LvQsCDQsiDQvNC10LPQsNCx0LDQudGC0LDRhS4KICAgICAqLwogICAgZnVuY3Rpb24gY2hlY2tfbG9nZmlsZSgkbG9nZmlsZSwgJGxvZ3BhdGgsICRtYXhzaXplKSB7CiAgICAgICAgaWYgKCFmaWxlX2V4aXN0cygkbG9nZmlsZSkpIHsKICAgICAgICAgICAgdG91Y2goJGxvZ2ZpbGUpOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgaWYgKGZpbGVzaXplKCRsb2dmaWxlKSA+ICRtYXhzaXplICogMTAyNCAqIDEwMjQpIHsKICAgICAgICAgICAgICAgICR0bXBfZmlsZW5hbWUgPSAkbG9ncGF0aC5tZDUodGltZSgpKS4ncjQudG1wJzsKICAgICAgICAgICAgICAgICR0bXBfZiA9IGZvcGVuKCR0bXBfZmlsZW5hbWUsICd3Jyk7CgogICAgICAgICAgICAgICAgJGYgPSBmb3BlbigkbG9nZmlsZSwgJ3InKTsKICAgICAgICAgICAgICAgICRjdXJzb3IgPSAkbWF4c2l6ZSAvIDIgKiAxMDI0ICogMTAyNDsKICAgICAgICAgICAgICAgIGZzZWVrKCRmLCAtJGN1cnNvciwgU0VFS19FTkQpOwoKICAgICAgICAgICAgICAgIHdoaWxlICgoJGJ1ZmZlciA9IGZnZXRzKCRmLCA0MDk2KSkgIT09IGZhbHNlKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHByZWdfbWF0Y2goJy9eXGR7NH0tXGR7Mn0tXGR7Mn0vJywgJGJ1ZmZlcikpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZnB1dHMoJHRtcF9mLCAkYnVmZmVyLCA0MDk2KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgZmNsb3NlKCRmKTsKICAgICAgICAgICAgICAgIGZjbG9zZSgkdG1wX2YpOwoKICAgICAgICAgICAgICAgIGlmIChmaWxlX2V4aXN0cygkdG1wX2ZpbGVuYW1lKSkgewogICAgICAgICAgICAgICAgICAgIHJlbmFtZSgkdG1wX2ZpbGVuYW1lLCAkbG9nZmlsZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9Cn0KCmlmICghZnVuY3Rpb25fZXhpc3RzKCdpc19kaXJfZW1wdHknKSkgewogICAgLyoqCiAgICAgKiDQn9GA0L7QstC10YDRj9C10YIsINGH0YLQviDQutCw0YLQsNC70L7QsyDQv9GD0YHRgtC+0LkuCiAgICAgKgogICAgICogQHBhcmFtIHN0cmluZyAkcGF0aCDQn9GD0YLRjCDQtNC+INC60LDRgtCw0LvQvtCz0LAuCiAgICAgKgogICAgICogQHJldHVybiBib29sZWFufG51bGwgVHJ1ZSwg0LXRgdC70Lgg0LrQsNGC0LDQu9C+0LMg0L/Rg9GB0YLQvtC5LCDQuNC90LDRh9C1IC0gZmFsc2UuINCV0YHQu9C4INC60LDRgtCw0LvQvtCzINC90LUg0LTQvtGB0YLRg9C/0LXQvSDQtNC70Y8g0YfRgtC10L3QuNGPLCAtIG51bGwuCiAgICAgKi8KICAgIGZ1bmN0aW9uIGlzX2Rpcl9lbXB0eSgkcGF0aCkgewogICAgICAgIGlmICgoJGRpciA9IG9wZW5kaXIoJHBhdGgpKSAhPT0gZmFsc2UpIHsKICAgICAgICAgICAgd2hpbGUgKCgkZmlsZSA9IHJlYWRkaXIoJGRpcikpICE9PSBmYWxzZSkgewogICAgICAgICAgICAgICAgaWYgKCRmaWxlICE9ICIuIiAmJiAkZmlsZSAhPSAiLi4iKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBjbG9zZWRpcigkZGlyKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIHRydWU7CiAgICB9Cn0KCmlmICghZnVuY3Rpb25fZXhpc3RzKCdybWRpcl9yZWN1cnNpdmUnKSkgewogICAgLyoqCiAgICAgKiDQoNC10LrRg9GA0YHQuNCy0L3QvtC1INGD0LTQsNC70LXQvdC40LUg0LrQsNGC0LDQu9C+0LPQvtCyINC4INGE0LDQudC70L7Qsi4KICAgICAqCiAgICAgKiBAcGFyYW0gc3RyaW5nICRwYXRoINCf0YPRgtGMINC00L4g0YPQtNCw0LvRj9C10LzQvtCz0L4g0LrQsNGC0LDQu9C+0LPQsC4KICAgICAqIEBwYXJhbSBhcnJheSAkZXhjbHVkZSDQnNCw0YHRgdC40LIg0LrQsNGC0LDQu9C+0LPQvtCyINC4INGE0LDQudC70L7Qsiwg0LrQvtGC0L7RgNGL0LUg0L3QtSDRgdC70LXQtNGD0LXRgiDRg9C00LDQu9GP0YLRjC4KICAgICAqCiAgICAgKiBAcmV0dXJuIGFycmF5CiAgICAgKi8KICAgIGZ1bmN0aW9uIHJtZGlyX3JlY3Vyc2l2ZSgkcGF0aCwgJGV4Y2x1ZGU9YXJyYXkoKSwgJHBhdHRlcm49JycsICRyZWN1cnNpdmU9dHJ1ZSkgewogICAgICAgICRwYXRoID0gcnRyaW0oJHBhdGgsICcvJyk7CiAgICAgICAgJHVuZGVsZXRlZF9maWxlcyA9IGFycmF5KCk7CgogICAgICAgIGlmIChpc19kaXIoJHBhdGgpKSB7CiAgICAgICAgICAgIGlmICgoJGRpciA9IG9wZW5kaXIoJHBhdGgpKSAhPT0gRkFMU0UpIHsKICAgICAgICAgICAgICAgIHdoaWxlICgoJGZpbGUgPSByZWFkZGlyKCRkaXIpKSAhPT0gRkFMU0UpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoJGZpbGUgIT0gIi4iICYmICRmaWxlICE9ICIuLiIgJiYgIWluX2FycmF5KCJ7JHBhdGh9L3skZmlsZX0iLCAkZXhjbHVkZSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzX2RpcigieyRwYXRofS97JGZpbGV9IikgJiYgJHJlY3Vyc2l2ZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJHVuZGVsZXRlZF9maWxlcyA9IGFycmF5X21lcmdlKCR1bmRlbGV0ZWRfZmlsZXMsIHJtZGlyX3JlY3Vyc2l2ZSgieyRwYXRofS97JGZpbGV9IiwgJGV4Y2x1ZGUsICRwYXR0ZXJuKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZWlmIChpc19maWxlKCJ7JHBhdGh9L3skZmlsZX0iKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVtcHR5KCRwYXR0ZXJuKSB8fCBwcmVnX21hdGNoKCIveyRwYXR0ZXJufS8iLCAieyRmaWxlfSIpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF1bmxpbmsoInskcGF0aH0veyRmaWxlfSIpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR1bmRlbGV0ZWRfZmlsZXNbXSA9ICJ7JHBhdGh9L3skZmlsZX0iOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlaWYgKGlzX2xpbmsoInskcGF0aH0veyRmaWxlfSIpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsgLy8g0KHQuNC80LLQvtC70LjRh9C10YHQutC40LUg0YHRgdGL0LvQutC4INGD0LTQsNC70Y/RgtGMINC90LUg0LHRg9C00LXQvDog0LjRhSDQvdC1INC00L7Qu9C20L3QviDQsdGL0YLRjCDQstC+0LLRgdC1CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsgLy8g0J/RgNC+0L/Rg9GB0LrQsNC10Lwg0LTQuNGA0LXQutGC0L7RgNC40Y4sINC10YHQu9C4INC90LUg0YPRgdGC0LDQvdC+0LLQu9C10L0g0YTQu9Cw0LMgJHJlY3Vyc2l2ZQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGNsb3NlZGlyKCRkaXIpOwoKICAgICAgICAgICAgICAgIC8vIGlmICghaW5fYXJyYXkoInskcGF0aH0iLCAkZXhjbHVkZSkpIHsKICAgICAgICAgICAgICAgICAgICAvLyBpZiAoaXNfZGlyX2VtcHR5KCRwYXRoKSAmJiAhcm1kaXIoJHBhdGgpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vICR1bmRlbGV0ZWRfZmlsZXNbXSA9ICRwYXRoOwogICAgICAgICAgICAgICAgICAgIC8vIH0KICAgICAgICAgICAgICAgIC8vIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlaWYgKGlzX2ZpbGUoJHBhdGgpKSB7CiAgICAgICAgICAgIGlmICghaW5fYXJyYXkoInskcGF0aH0iLCAkZXhjbHVkZSkpIHsKICAgICAgICAgICAgICAgIGlmIChlbXB0eSgkcGF0dGVybikgfHwgcHJlZ19tYXRjaCgiL3skcGF0dGVybn0vIiwgInskZmlsZX0iKSkgewogICAgICAgICAgICAgICAgICAgIGlmICghdW5saW5rKCRwYXRoKSkgewogICAgICAgICAgICAgICAgICAgICAgICAkdW5kZWxldGVkX2ZpbGVzW10gPSAkcGF0aDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHJldHVybiAkdW5kZWxldGVkX2ZpbGVzOwogICAgfQp9CgppZiAoIWZ1bmN0aW9uX2V4aXN0cygnZ2V0X2ZpbGVuYW1lcycpKSB7CiAgICAvKioKICAgICAqINCf0L7Qu9GD0YfQsNC10YIg0YHQv9C40YHQvtC6INC90LDQt9Cy0LDQvdC40Lkg0LLRgdC10YUg0YTQsNC50LvQvtCyINCyINC00LjRgNC10LrRgtC+0YDQuNC4INC4INC/0L7QtNC00LjRgNC10LrRgtC+0YDQuNGP0YUKICAgICAqCiAgICAgKiBAcGFyYW0gc3RyaW5nICRwYXRoINCa0LDRgtCw0LvQvtCzLCDQsiDQutC+0YLQvtGA0L7QvCDRgNC10LrRg9GA0YHQuNCy0L3QviDQv9GA0L7QuNC30LLQvtC00LjRgtGB0Y8g0L/QvtC40YHQuiDRhNCw0LnQu9C+0LIuCiAgICAgKiBAcGFyYW0gYXJyYXkgJGV4Y2x1ZGUg0JzQsNGB0YHQuNCyINC60LDRgtCw0LvQvtCz0L7QsiDQuCDRhNCw0LnQu9C+0LIsINC60L7RgtC+0YDRi9C1INC90LUg0YHQu9C10LTRg9C10YIg0LLRi9Cy0L7QtNC40YLRjC4KICAgICAqIEBwYXJhbSBzdHJpbmcgJHBhdHRlcm4g0JzQsNGB0LrQsCAo0YDQtdCz0YPQu9GP0YDQvdC+0LUg0LLRi9GA0LDQttC10L3QuNC1KSDRhNCw0LnQu9C+0LIuCiAgICAgKgogICAgICogQHJldHVybiBhcnJheSDQnNCw0YHRgdC40LIg0YHRgtGA0L7Quiwg0YHQvtC00LXRgNC20LDRidC40Lkg0YHQv9C40YHQvtC6INGE0LDQudC70L7QsiDQv9C+INC80LDRgdC60LUuCiAgICAgKi8KICAgIGZ1bmN0aW9uIGdldF9maWxlbmFtZXMoJHBhdGgsICRleGNsdWRlPWFycmF5KCksICRwYXR0ZXJuPScnLCAkcmVjdXJzaXZlPXRydWUpIHsKICAgICAgICAkZmlsZW5hbWVzID0gYXJyYXkoKTsKICAgICAgICAkcGF0aCA9IHJ0cmltKCRwYXRoLCAnLycpOwoKICAgICAgICBpZiAoaXNfZGlyKCRwYXRoKSkgewogICAgICAgICAgICBpZiAoKCRkaXIgPSBvcGVuZGlyKCRwYXRoKSkgIT09IGZhbHNlKSB7CiAgICAgICAgICAgICAgICB3aGlsZSAoKCRmaWxlbmFtZSA9IHJlYWRkaXIoJGRpcikpICE9PSBmYWxzZSkgewogICAgICAgICAgICAgICAgICAgIGlmICgkZmlsZW5hbWUgPT0gJy4nIHx8ICRmaWxlbmFtZSA9PSAnLi4nIHx8IGluX2FycmF5KCJ7JHBhdGh9L3skZmlsZW5hbWV9IiwgJGV4Y2x1ZGUpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgaWYgKGlzX2RpcigieyRwYXRofS97JGZpbGVuYW1lfSIpICYmICRyZWN1cnNpdmUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJGZpbGVuYW1lcyA9IGFycmF5X21lcmdlKCRmaWxlbmFtZXMsIGdldF9maWxlbmFtZXMoInskcGF0aH0veyRmaWxlbmFtZX0iLCAkZXhjbHVkZSwgJHBhdHRlcm4pKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZWlmIChpc19maWxlKCJ7JHBhdGh9L3skZmlsZW5hbWV9IikgJiYgcHJlZ19tYXRjaCgiL3skcGF0dGVybn0vIiwgInskZmlsZW5hbWV9IikpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJGZpbGVuYW1lc1tdID0gInskcGF0aH0veyRmaWxlbmFtZX0iOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlaWYgKGlzX2xpbmsoInskcGF0aH0veyRmaWxlbmFtZX0iKSkgewogICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBjbG9zZWRpcigkZGlyKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlaWYgKGlzX2ZpbGUoJHBhdGgpKSB7CiAgICAgICAgICAgICRmaWxlbmFtZXNbXSA9ICRwYXRoOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICRmaWxlbmFtZXM7CiAgICB9Cn0KCmlmICghZnVuY3Rpb25fZXhpc3RzKCdqc29uX2VuY29kZScpKSB7CiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIEpTT04gcmVwcmVzZW50YXRpb24gb2YgYSB2YWx1ZS4KICAgICAqCiAgICAgKiBAcGFyYW0gcmVzb3VyY2UgJHZhbHVlIFRoZSB2YWx1ZSBiZWluZyBlbmNvZGVkLiBDYW4gYmUgYW55IHR5cGUgZXhjZXB0IGEgcmVzb3VyY2UuCiAgICAgKgogICAgICogQHJldHVybiBzdHJpbmcgUmV0dXJucyBhIEpTT04gZW5jb2RlZCBzdHJpbmcgb24gc3VjY2VzcyBvciBGQUxTRSBvbiBmYWlsdXJlLgogICAgICovCiAgICBmdW5jdGlvbiBqc29uX2VuY29kZSgkdmFsdWU9ZmFsc2UpIHsKICAgICAgICBpZiAoaXNfbnVsbCgkdmFsdWUpKSB7CiAgICAgICAgICAgIHJldHVybiAnbnVsbCc7CiAgICAgICAgfQoKICAgICAgICBpZiAoJHZhbHVlID09PSBmYWxzZSkgewogICAgICAgICAgICByZXR1cm4gJ2ZhbHNlJzsKICAgICAgICB9CgogICAgICAgIGlmICgkdmFsdWUgPT09IHRydWUpIHsKICAgICAgICAgICAgcmV0dXJuICd0cnVlJzsKICAgICAgICB9CgogICAgICAgIGlmIChpc19zY2FsYXIoJHZhbHVlKSkgewogICAgICAgICAgICBpZiAoaXNfZmxvYXQoJHZhbHVlKSkgewogICAgICAgICAgICAgICAgcmV0dXJuIGZsb2F0dmFsKHN0cl9yZXBsYWNlKCIsIiwgIi4iLCBzdHJ2YWwoJHZhbHVlKSkpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoaXNfc3RyaW5nKCR2YWx1ZSkpIHsKICAgICAgICAgICAgICAgIHN0YXRpYyAkanNvbl9yZXBsYWNlcyA9IGFycmF5KGFycmF5KCJcXCIsICIvIiwgIlxuIiwgIlx0IiwgIlxyIiwgIlxiIiwgIlxmIiwgJyInKSwgYXJyYXkoJ1xcXFwnLCAnXFwvJywgJ1xcbicsICdcXHQnLCAnXFxyJywgJ1xcYicsICdcXGYnLCAnXCInKSk7CiAgICAgICAgICAgICAgICByZXR1cm4gJyInIC4gc3RyX3JlcGxhY2UoJGpzb25fcmVwbGFjZXNbMF0sICRqc29uX3JlcGxhY2VzWzFdLCAkdmFsdWUpIC4gJyInOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgcmV0dXJuICR2YWx1ZTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgJGlzX2xpc3QgPSB0cnVlOwoKICAgICAgICBmb3IgKCRpID0gMCwgcmVzZXQoJHZhbHVlKTsgJGkgPCBjb3VudCgkdmFsdWUpOyAkaSsrLCBuZXh0KCR2YWx1ZSkpIHsKICAgICAgICAgICAgaWYgKGtleSgkdmFsdWUpICE9PSAkaSkgewogICAgICAgICAgICAgICAgJGlzX2xpc3QgPSBmYWxzZTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAkcmVzdWx0ID0gYXJyYXkoKTsKCiAgICAgICAgaWYgKCRpc19saXN0KSB7CiAgICAgICAgICAgIGZvcmVhY2ggKCR2YWx1ZSBhcyAkdikgewogICAgICAgICAgICAgICAgJHJlc3VsdFtdID0ganNvbl9lbmNvZGUoJHYpOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gJ1snIC4gam9pbignLCcsICRyZXN1bHQpIC4gJ10nOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgZm9yZWFjaCAoJHZhbHVlIGFzICRrID0+ICR2KSB7CiAgICAgICAgICAgICAgICAkcmVzdWx0W10gPSBqc29uX2VuY29kZSgkaykuJzonLmpzb25fZW5jb2RlKCR2KTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuICd7JyAuIGpvaW4oJywnLCAkcmVzdWx0KSAuICd9JzsKICAgICAgICB9CiAgICB9Cn0KCmlmICghZnVuY3Rpb25fZXhpc3RzKCdzdHJfc3BsaXQnKSkgewogICAgLyoqCiAgICAgKiDQktC10YDRgdC40Y8gaHR0cDovL3d3dy5waHAubmV0L21hbnVhbC9lbi9mdW5jdGlvbi5zdHItc3BsaXQucGhwINC00LvRjyBQSFAgNC4KICAgICAqCiAgICAgKiBDb252ZXJ0cyBhIHN0cmluZyB0byBhbiBhcnJheS4KICAgICAqCiAgICAgKiBAcGFyYW0gc3RyaW5nICRzdHJpbmcgVGhlIGlucHV0IHN0cmluZy4KICAgICAqCiAgICAgKiBAcmV0dXJuIGFycmF5IFRoZSByZXR1cm5lZCBhcnJheSB3aWxsIGJlIG9uZSBjaGFyYWN0ZXIgaW4gbGVuZ3RoLgogICAgICovCiAgICBmdW5jdGlvbiBzdHJfc3BsaXQoJHN0cmluZyl7CiAgICAgICAgcmV0dXJuIHByZWdfc3BsaXQoJy8vJywgJHN0cmluZywgLTEsIFBSRUdfU1BMSVRfTk9fRU1QVFkpOwogICAgfQp9CgppZiAoIWZ1bmN0aW9uX2V4aXN0cygnY2hlY2tfc2FmZV9tb2RlJykpIHsKICAgIC8qKgogICAgICog0J7Qv9GA0LXQtNC10LvRj9C10YIsINCy0LrQu9GO0YfRkdC9INC70Lgg0L3QsCDRgdCw0LnRgtC1IFNBRkUgTU9ERS4KICAgICAqCiAgICAgKiBAcmV0dXJuIGJvb2xlYW4gVHJ1ZSwg0LXRgdC70LggU0FGRSBNT0RFINCy0LrQu9GO0YfRkdC9LCDQuNC90LDRh9C1IC0gZmFsc2UuCiAgICAgKi8KICAgIGZ1bmN0aW9uIGNoZWNrX3NhZmVfbW9kZSgkcjRfY2ZnX3Jvb3Q9JycpIHsKICAgICAgICAkZGlzYWJsZV9mdW5jdGlvbnMgPSBpbmlfZ2V0KCdkaXNhYmxlX2Z1bmN0aW9ucycpOwoKICAgICAgICBpZiAoaXNzZXQoJGRpc2FibGVfZnVuY3Rpb25zKSAmJiBwcmVnX21hdGNoKCcvXGJybWRpclxiL2knLCAkZGlzYWJsZV9mdW5jdGlvbnMpKSB7CiAgICAgICAgICAgIGlmIChwcmVnX21hdGNoKCcvXGJta2RpclxiL2knLCAkZGlzYWJsZV9mdW5jdGlvbnMpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgJHRyYWNrX2Vycm9ycyA9IGluaV9zZXQoJ3RyYWNrX2Vycm9ycycsIDEpOwoKICAgICAgICAkdG1wX2Rpcl9uYW1lID0gdW5pcWlkKCcnKTsKCiAgICAgICAgJHRtcF9kaXJzID0gYXJyYXkoInskcjRfY2ZnX3Jvb3R9eyR0bXBfZGlyX25hbWV9IiwgInskcjRfY2ZnX3Jvb3R9eyR0bXBfZGlyX25hbWV9L3skdG1wX2Rpcl9uYW1lfSIpOwogICAgICAgICRybV9kaXJzID0gYXJyYXkoKTsKCiAgICAgICAgZm9yZWFjaCAoJHRtcF9kaXJzIGFzICR0bXBfZGlyKSB7CiAgICAgICAgICAgIG1rZGlyKCR0bXBfZGlyLCAwNzc3KTsKCiAgICAgICAgICAgIGlmIChpc3NldCgkcGhwX2Vycm9ybXNnKSAmJiBzdHJwb3MoJHBocF9lcnJvcm1zZywgJ1NBRkUgTU9ERScpICE9PSBmYWxzZSkgewogICAgICAgICAgICAgICAgZm9yZWFjaCAoYXJyYXlfcmV2ZXJzZSgkcm1fZGlycykgYXMgJHJtX2RpcikgewogICAgICAgICAgICAgICAgICAgIHJtZGlyKCRybV9kaXIpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGluaV9zZXQoJ3RyYWNrX2Vycm9ycycsICR0cmFja19lcnJvcnMpOwoKICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJHJtX2RpcnNbXSA9ICR0bXBfZGlyOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBmb3JlYWNoIChhcnJheV9yZXZlcnNlKCRybV9kaXJzKSBhcyAkcm1fZGlyKSB7CiAgICAgICAgICAgIHJtZGlyKCRybV9kaXIpOwogICAgICAgIH0KCiAgICAgICAgaW5pX3NldCgndHJhY2tfZXJyb3JzJywgJHRyYWNrX2Vycm9ycyk7CgogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KfQo= ====== razgon2006return.php ====== PD9waHAKJF9kYXRhX3R5cGUgPSAnbGlua3MnOwppbmNsdWRlKCJ7JHI0X2NmZ19yb290fXI0X2NvbW1vbi5waHAiKTsKcmV0dXJuICRsaW5rOwo= ====== pcltrace.lib.php3 ====== PD8NCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLyBQaHBDb25jZXB0IExpYnJhcnkgKFBDTCkgVHJhY2UgMS4wDQovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8gTGljZW5zZSBHTlUvR1BMIC0gVmluY2VudCBCbGF2ZXQgLSBKYW52aWVyIDIwMDENCi8vIGh0dHA6Ly93d3cucGhwY29uY2VwdC5uZXQgJiBodHRwOi8vcGhwY29uY2VwdC5mcmVlLmZyDQovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8gRnJhbudhaXMgOg0KLy8gICBMYSBkZXNjcmlwdGlvbiBkZSBsJ3VzYWdlIGRlIGxhIGxpYnJhaXJpZSBQQ0wgVHJhY2UgMS4wIG4nZXN0IHBhcyBlbmNvcmUNCi8vICAgZGlzcG9uaWJsZS4gQ2VsbGUtY2kgbidlc3QgcG91ciBsZSBtb21lbnQgZGlzdHJpYnXpZSBxdSdhdmVjIGwnYXBwbGljYXRpb24NCi8vICAgZXQgbGEgbGlicmFpcmllIFBocFppcC4NCi8vICAgVW5lIHZlcnNpb24gaW5k6XBlbmRhbnRlIHNlcmEgYmllbnRvdCBkaXNwb25pYmxlIHN1ciBodHRwOi8vd3d3LnBocGNvbmNlcHQubmV0DQovLw0KLy8gRW5nbGlzaCA6DQovLyAgIFRoZSBQQ0wgVHJhY2UgMS4wIGxpYnJhcnkgZGVzY3JpcHRpb24gaXMgbm90IGF2YWlsYWJsZSB5ZXQuIFRoaXMgbGlicmFyeSBpcw0KLy8gICByZWxlYXNlZCBvbmx5IHdpdGggUGhwWmlwIGFwcGxpY2F0aW9uIGFuZCBsaWJyYXJ5Lg0KLy8gICBBbiBpbmRlcGVuZGFudCByZWxlYXNlIHdpbGwgYmUgc29vbiBhdmFpbGFibGUgb24gaHR0cDovL3d3dy5waHBjb25jZXB0Lm5ldA0KLy8NCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLw0KLy8gICAqIEF2ZXJ0aXNzZW1lbnQgOg0KLy8NCi8vICAgQ2V0dGUgbGlicmFpcmllIGEg6XTpIGNy6ellIGRlIGZh529uIG5vbiBwcm9mZXNzaW9ubmVsbGUuDQovLyAgIFNvbiB1c2FnZSBlc3QgYXUgcmlzcXVlIGV0IHDpcmlsIGRlIGNlbHVpIHF1aSBsJ3V0aWxpc2UsIGVuIGF1Y3VuIGNhcyBsJ2F1dGV1cg0KLy8gICBkZSBjZSBjb2RlIG5lIHBvdXJyYSDqdHJlIHRlbnUgcG91ciByZXNwb25zYWJsZSBkZXMg6XZlbnR1ZWxzIGTpZ2F0cyBxdSdpbCBwb3VycmFpdA0KLy8gICBlbmdlbmRyZXIuDQovLyAgIElsIGVzdCBlbnRlbmR1IGNlcGVuZGFudCBxdWUgbCdhdXRldXIgYSBy6WFsaXPpIGNlIGNvZGUgcGFyIHBsYWlzaXIgZXQgbid5IGENCi8vICAgY2FjaOkgYXVjdW4gdmlydXMsIG5pIG1hbHZlaWxsYW5jZS4NCi8vICAgQ2V0dGUgbGliYWlyaWUgZXN0IGRpc3RyaWJ16WUgc291cyBsYSBsaWNlbnNlIEdOVS9HUEwgKGh0dHA6Ly93d3cuZ251Lm9yZykNCi8vDQovLyAgICogQXV0ZXVyIDoNCi8vDQovLyAgIENlIGNvZGUgYSDpdOkg6WNyaXQgcGFyIFZpbmNlbnQgQmxhdmV0ICh2aW5jZW50QGJsYXZldC5uZXQpIHN1ciBzb24gdGVtcHMNCi8vICAgZGUgbG9pc2lyLg0KLy8NCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCi8vIC0tLS0tIExvb2sgZm9yIGRvdWJsZSBpbmNsdWRlDQppZiAoIWRlZmluZWQoIlBDTFRSQUNFX0xJQiIpKQ0Kew0KICBkZWZpbmUoICJQQ0xUUkFDRV9MSUIiLCAxICk7DQoNCiAgLy8gLS0tLS0gVmVyc2lvbg0KICAkZ19wY2xfdHJhY2VfdmVyc2lvbiA9ICIxLjAiOw0KDQogIC8vIC0tLS0tIEludGVybmFsIHZhcmlhYmxlcw0KICAvLyBUaGVzZSB2YWx1ZXMgbXVzdCBiZSBjaGFuZ2UgYnkgUGNsVHJhY2UgbGlicmFyeSBmdW5jdGlvbnMNCiAgJGdfcGNsX3RyYWNlX21vZGUgPSAibWVtb3J5IjsNCiAgJGdfcGNsX3RyYWNlX2ZpbGVuYW1lID0gInRyYWNlLnR4dCI7DQogICRnX3BjbF90cmFjZV9uYW1lID0gYXJyYXkoKTsNCiAgJGdfcGNsX3RyYWNlX2luZGV4ID0gMDsNCiAgJGdfcGNsX3RyYWNlX2xldmVsID0gMDsNCiAgLy8kZ19wY2xfdHJhY2VfZW50cmllcyA9IGFycmF5KCk7DQoNCg0KICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KICAvLyBGdW5jdGlvbiA6IFRyT24oJHBfbGV2ZWwsICRwX21vZGUsICRwX2ZpbGVuYW1lKQ0KICAvLyBEZXNjcmlwdGlvbiA6DQogIC8vIFBhcmFtZXRlcnMgOg0KICAvLyAgICRwX2xldmVsIDogVHJhY2UgbGV2ZWwNCiAgLy8gICAkcF9tb2RlIDogTW9kZSBvZiB0cmFjZSBkaXNwbGF5aW5nIDoNCiAgLy8gICAgICAgICAgICAgJ25vcm1hbCcgOiBtZXNzYWdlcyBhcmUgZGlzcGxheWVkIGF0IGZ1bmN0aW9uIGNhbGwNCiAgLy8gICAgICAgICAgICAgJ21lbW9yeScgOiBtZXNzYWdlcyBhcmUgbWVtb3JpemVkIGluIGEgdGFibGUgYW5kIGNhbiBiZSBkaXNwbGF5IGJ5DQogIC8vICAgICAgICAgICAgICAgICAgICAgICAgVHJEaXNwbGF5KCkgZnVuY3Rpb24uIChkZWZhdWx0KQ0KICAvLyAgICAgICAgICAgICAnbG9nJyAgICA6IG1lc3NhZ2VzIGFyZSB3cml0ZWQgaW4gdGhlIGZpbGUgJHBfZmlsZW5hbWUNCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiAgZnVuY3Rpb24gVHJPbigkcF9sZXZlbD0xLCAkcF9tb2RlPSJtZW1vcnkiLCAkcF9maWxlbmFtZT0idHJhY2UudHh0IikNCiAgew0KICAgIGdsb2JhbCAkZ19wY2xfdHJhY2VfbGV2ZWw7DQogICAgZ2xvYmFsICRnX3BjbF90cmFjZV9tb2RlOw0KICAgIGdsb2JhbCAkZ19wY2xfdHJhY2VfZmlsZW5hbWU7DQogICAgZ2xvYmFsICRnX3BjbF90cmFjZV9uYW1lOw0KICAgIGdsb2JhbCAkZ19wY2xfdHJhY2VfaW5kZXg7DQogICAgZ2xvYmFsICRnX3BjbF90cmFjZV9lbnRyaWVzOw0KDQogICAgLy8gLS0tLS0gRW5hYmxlIHRyYWNlIG1vZGUNCiAgICAkZ19wY2xfdHJhY2VfbGV2ZWwgPSAkcF9sZXZlbDsNCg0KICAgIC8vIC0tLS0tIE1lbW9yaXplIG1vZGUgYW5kIGZpbGVuYW1lDQogICAgc3dpdGNoICgkcF9tb2RlKSB7DQogICAgICBjYXNlICJub3JtYWwiIDoNCiAgICAgIGNhc2UgIm1lbW9yeSIgOg0KICAgICAgY2FzZSAibG9nIiA6DQogICAgICAgICRnX3BjbF90cmFjZV9tb2RlID0gJHBfbW9kZTsNCiAgICAgIGJyZWFrOw0KICAgICAgZGVmYXVsdCA6DQogICAgICAgICRnX3BjbF90cmFjZV9tb2RlID0gImxvZ2dlZCI7DQogICAgfQ0KDQogICAgLy8gLS0tLS0gTWVtb3JpemUgZmlsZW5hbWUNCiAgICAkZ19wY2xfdHJhY2VfZmlsZW5hbWUgPSAkcF9maWxlbmFtZTsNCiAgfQ0KICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KDQogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQogIC8vIEZ1bmN0aW9uIDogSXNUck9uKCkNCiAgLy8gRGVzY3JpcHRpb24gOg0KICAvLyBSZXR1cm4gdmFsdWUgOg0KICAvLyAgIFRoZSB0cmFjZSBsZXZlbCAoMCBmb3IgZGlzYWJsZSkuDQogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQogIGZ1bmN0aW9uIElzVHJPbigpDQogIHsNCiAgICBnbG9iYWwgJGdfcGNsX3RyYWNlX2xldmVsOw0KDQogICAgcmV0dXJuKCRnX3BjbF90cmFjZV9sZXZlbCk7DQogIH0NCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KICAvLyBGdW5jdGlvbiA6IFRyT2ZmKCkNCiAgLy8gRGVzY3JpcHRpb24gOg0KICAvLyBQYXJhbWV0ZXJzIDoNCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiAgZnVuY3Rpb24gVHJPZmYoKQ0KICB7DQogICAgZ2xvYmFsICRnX3BjbF90cmFjZV9sZXZlbDsNCiAgICBnbG9iYWwgJGdfcGNsX3RyYWNlX21vZGU7DQogICAgZ2xvYmFsICRnX3BjbF90cmFjZV9maWxlbmFtZTsNCiAgICBnbG9iYWwgJGdfcGNsX3RyYWNlX25hbWU7DQogICAgZ2xvYmFsICRnX3BjbF90cmFjZV9pbmRleDsNCg0KICAgIC8vIC0tLS0tIENsZWFuDQogICAgJGdfcGNsX3RyYWNlX21vZGUgPSAibWVtb3J5IjsNCiAgICB1bnNldCgkZ19wY2xfdHJhY2VfZW50cmllcyk7DQogICAgdW5zZXQoJGdfcGNsX3RyYWNlX25hbWUpOw0KICAgIHVuc2V0KCRnX3BjbF90cmFjZV9pbmRleCk7DQoNCiAgICAvLyAtLS0tLSBTd2l0Y2ggb2ZmIHRyYWNlDQogICAgJGdfcGNsX3RyYWNlX2xldmVsID0gMDsNCiAgfQ0KICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KDQoNCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiAgLy8gRnVuY3Rpb24gOiBUckZjdFN0YXJ0KCkNCiAgLy8gRGVzY3JpcHRpb24gOg0KICAvLyAgIEp1c3QgYSB0cmFjZSBmdW5jdGlvbiBmb3IgZGViYnVnZ2luZyBwdXJwb3NlIGJlZm9yZSBJIHVzZSBhIGJldHRlciB0b29sICEhISENCiAgLy8gICBTdGFydCBhbmQgc3RvcCBvZiB0aGlzIGZ1bmN0aW9uIGlzIGJ5ICRnX3BjbF90cmFjZV9sZXZlbCBnbG9iYWwgdmFyaWFibGUuDQogIC8vIFBhcmFtZXRlcnMgOg0KICAvLyAgICRwX2xldmVsIDogTGV2ZWwgb2YgdHJhY2UgcmVxdWlyZWQuDQogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQogIGZ1bmN0aW9uIFRyRmN0U3RhcnQoJHBfZmlsZSwgJHBfbGluZSwgJHBfbmFtZSwgJHBfcGFyYW09IiIsICRwX21lc3NhZ2U9IiIpDQogIHsNCiAgICBnbG9iYWwgJGdfcGNsX3RyYWNlX2xldmVsOw0KICAgIGdsb2JhbCAkZ19wY2xfdHJhY2VfbW9kZTsNCiAgICBnbG9iYWwgJGdfcGNsX3RyYWNlX2ZpbGVuYW1lOw0KICAgIGdsb2JhbCAkZ19wY2xfdHJhY2VfbmFtZTsNCiAgICBnbG9iYWwgJGdfcGNsX3RyYWNlX2luZGV4Ow0KICAgIGdsb2JhbCAkZ19wY2xfdHJhY2VfZW50cmllczsNCg0KICAgIC8vIC0tLS0tIExvb2sgZm9yIGRpc2FibGVkIHRyYWNlDQogICAgaWYgKCRnX3BjbF90cmFjZV9sZXZlbCA8IDEpDQogICAgICByZXR1cm47DQoNCiAgICAvLyAtLS0tLSBBZGQgdGhlIGZ1bmN0aW9uIG5hbWUgaW4gdGhlIGxpc3QNCiAgICBpZiAoIWlzc2V0KCRnX3BjbF90cmFjZV9uYW1lKSkNCiAgICAgICRnX3BjbF90cmFjZV9uYW1lID0gJHBfbmFtZTsNCiAgICBlbHNlDQogICAgICAkZ19wY2xfdHJhY2VfbmFtZSAuPSAiLCIuJHBfbmFtZTsNCg0KICAgIC8vIC0tLS0tIFVwZGF0ZSB0aGUgZnVuY3Rpb24gZW50cnkNCiAgICAkaSA9IHNpemVvZigkZ19wY2xfdHJhY2VfZW50cmllcyk7DQogICAgJGdfcGNsX3RyYWNlX2VudHJpZXNbJGldW25hbWVdID0gJHBfbmFtZTsNCiAgICAkZ19wY2xfdHJhY2VfZW50cmllc1skaV1bcGFyYW1dID0gJHBfcGFyYW07DQogICAgJGdfcGNsX3RyYWNlX2VudHJpZXNbJGldW21lc3NhZ2VdID0gIiI7DQogICAgJGdfcGNsX3RyYWNlX2VudHJpZXNbJGldW2ZpbGVdID0gJHBfZmlsZTsNCiAgICAkZ19wY2xfdHJhY2VfZW50cmllc1skaV1bbGluZV0gPSAkcF9saW5lOw0KICAgICRnX3BjbF90cmFjZV9lbnRyaWVzWyRpXVtpbmRleF0gPSAkZ19wY2xfdHJhY2VfaW5kZXg7DQogICAgJGdfcGNsX3RyYWNlX2VudHJpZXNbJGldW3R5cGVdID0gIjEiOyAvLyBtZWFucyBzdGFydCBvZiBmdW5jdGlvbg0KDQogICAgLy8gLS0tLS0gVXBkYXRlIHRoZSBtZXNzYWdlIGVudHJ5DQogICAgaWYgKCRwX21lc3NhZ2UgIT0gIiIpDQogICAgew0KICAgICRpID0gc2l6ZW9mKCRnX3BjbF90cmFjZV9lbnRyaWVzKTsNCiAgICAkZ19wY2xfdHJhY2VfZW50cmllc1skaV1bbmFtZV0gPSAiIjsNCiAgICAkZ19wY2xfdHJhY2VfZW50cmllc1skaV1bcGFyYW1dID0gIiI7DQogICAgJGdfcGNsX3RyYWNlX2VudHJpZXNbJGldW21lc3NhZ2VdID0gJHBfbWVzc2FnZTsNCiAgICAkZ19wY2xfdHJhY2VfZW50cmllc1skaV1bZmlsZV0gPSAkcF9maWxlOw0KICAgICRnX3BjbF90cmFjZV9lbnRyaWVzWyRpXVtsaW5lXSA9ICRwX2xpbmU7DQogICAgJGdfcGNsX3RyYWNlX2VudHJpZXNbJGldW2luZGV4XSA9ICRnX3BjbF90cmFjZV9pbmRleDsNCiAgICAkZ19wY2xfdHJhY2VfZW50cmllc1skaV1bdHlwZV0gPSAiMyI7IC8vIG1lYW5zIG1lc3NhZ2UNCiAgICB9DQoNCiAgICAvLyAtLS0tLSBBY3Rpb24gZGVwZW5kaW5nIG9uIG1vZGUNCiAgICBQY2xUcmFjZUFjdGlvbigkZ19wY2xfdHJhY2VfZW50cmllc1skaV0pOw0KDQogICAgLy8gLS0tLS0gSW5jcmVtZW50IHRoZSBpbmRleA0KICAgICRnX3BjbF90cmFjZV9pbmRleCsrOw0KICB9DQogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiAgLy8gRnVuY3Rpb24gOiBUckZjdEVuZCgpDQogIC8vIERlc2NyaXB0aW9uIDoNCiAgLy8gICBKdXN0IGEgdHJhY2UgZnVuY3Rpb24gZm9yIGRlYmJ1Z2dpbmcgcHVycG9zZSBiZWZvcmUgSSB1c2UgYSBiZXR0ZXIgdG9vbCAhISEhDQogIC8vICAgU3RhcnQgYW5kIHN0b3Agb2YgdGhpcyBmdW5jdGlvbiBpcyBieSAkZ19wY2xfdHJhY2VfbGV2ZWwgZ2xvYmFsIHZhcmlhYmxlLg0KICAvLyBQYXJhbWV0ZXJzIDoNCiAgLy8gICAkcF9sZXZlbCA6IExldmVsIG9mIHRyYWNlIHJlcXVpcmVkLg0KICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KICBmdW5jdGlvbiBUckZjdEVuZCgkcF9maWxlLCAkcF9saW5lLCAkcF9yZXR1cm49MSwgJHBfbWVzc2FnZT0iIikNCiAgew0KICAgIGdsb2JhbCAkZ19wY2xfdHJhY2VfbGV2ZWw7DQogICAgZ2xvYmFsICRnX3BjbF90cmFjZV9tb2RlOw0KICAgIGdsb2JhbCAkZ19wY2xfdHJhY2VfZmlsZW5hbWU7DQogICAgZ2xvYmFsICRnX3BjbF90cmFjZV9uYW1lOw0KICAgIGdsb2JhbCAkZ19wY2xfdHJhY2VfaW5kZXg7DQogICAgZ2xvYmFsICRnX3BjbF90cmFjZV9lbnRyaWVzOw0KDQogICAgLy8gLS0tLS0gTG9vayBmb3IgZGlzYWJsZWQgdHJhY2UNCiAgICBpZiAoJGdfcGNsX3RyYWNlX2xldmVsIDwgMSkNCiAgICAgIHJldHVybjsNCg0KICAgIC8vIC0tLS0tIEV4dHJhY3QgdGhlIGZ1bmN0aW9uIG5hbWUgaW4gdGhlIGxpc3QNCiAgICAvLyAtLS0tLSBSZW1vdmUgdGhlIGZ1bmN0aW9uIG5hbWUgaW4gdGhlIGxpc3QNCiAgICBpZiAoISgkdl9uYW1lID0gc3RycmNocigkZ19wY2xfdHJhY2VfbmFtZSwgIiwiKSkpDQogICAgew0KICAgICAgJHZfbmFtZSA9ICRnX3BjbF90cmFjZV9uYW1lOw0KICAgICAgJGdfcGNsX3RyYWNlX25hbWUgPSAiIjsNCiAgICB9DQogICAgZWxzZQ0KICAgIHsNCiAgICAgICRnX3BjbF90cmFjZV9uYW1lID0gc3Vic3RyKCRnX3BjbF90cmFjZV9uYW1lLCAwLCBzdHJsZW4oJGdfcGNsX3RyYWNlX25hbWUpLXN0cmxlbigkdl9uYW1lKSk7DQogICAgICAkdl9uYW1lID0gc3Vic3RyKCR2X25hbWUsIC1zdHJsZW4oJHZfbmFtZSkrMSk7DQogICAgfQ0KDQogICAgLy8gLS0tLS0gRGVjcmVtZW50IHRoZSBpbmRleA0KICAgICRnX3BjbF90cmFjZV9pbmRleC0tOw0KDQogICAgLy8gLS0tLS0gVXBkYXRlIHRoZSBtZXNzYWdlIGVudHJ5DQogICAgaWYgKCRwX21lc3NhZ2UgIT0gIiIpDQogICAgew0KICAgICRpID0gc2l6ZW9mKCRnX3BjbF90cmFjZV9lbnRyaWVzKTsNCiAgICAkZ19wY2xfdHJhY2VfZW50cmllc1skaV1bbmFtZV0gPSAiIjsNCiAgICAkZ19wY2xfdHJhY2VfZW50cmllc1skaV1bcGFyYW1dID0gIiI7DQogICAgJGdfcGNsX3RyYWNlX2VudHJpZXNbJGldW21lc3NhZ2VdID0gJHBfbWVzc2FnZTsNCiAgICAkZ19wY2xfdHJhY2VfZW50cmllc1skaV1bZmlsZV0gPSAkcF9maWxlOw0KICAgICRnX3BjbF90cmFjZV9lbnRyaWVzWyRpXVtsaW5lXSA9ICRwX2xpbmU7DQogICAgJGdfcGNsX3RyYWNlX2VudHJpZXNbJGldW2luZGV4XSA9ICRnX3BjbF90cmFjZV9pbmRleDsNCiAgICAkZ19wY2xfdHJhY2VfZW50cmllc1skaV1bdHlwZV0gPSAiMyI7IC8vIG1lYW5zIG1lc3NhZ2UNCiAgICB9DQoNCiAgICAvLyAtLS0tLSBVcGRhdGUgdGhlIGZ1bmN0aW9uIGVudHJ5DQogICAgJGkgPSBzaXplb2YoJGdfcGNsX3RyYWNlX2VudHJpZXMpOw0KICAgICRnX3BjbF90cmFjZV9lbnRyaWVzWyRpXVtuYW1lXSA9ICR2X25hbWU7DQogICAgJGdfcGNsX3RyYWNlX2VudHJpZXNbJGldW3BhcmFtXSA9ICRwX3JldHVybjsNCiAgICAkZ19wY2xfdHJhY2VfZW50cmllc1skaV1bbWVzc2FnZV0gPSAiIjsNCiAgICAkZ19wY2xfdHJhY2VfZW50cmllc1skaV1bZmlsZV0gPSAkcF9maWxlOw0KICAgICRnX3BjbF90cmFjZV9lbnRyaWVzWyRpXVtsaW5lXSA9ICRwX2xpbmU7DQogICAgJGdfcGNsX3RyYWNlX2VudHJpZXNbJGldW2luZGV4XSA9ICRnX3BjbF90cmFjZV9pbmRleDsNCiAgICAkZ19wY2xfdHJhY2VfZW50cmllc1skaV1bdHlwZV0gPSAiMiI7IC8vIG1lYW5zIGVuZCBvZiBmdW5jdGlvbg0KDQogICAgLy8gLS0tLS0gQWN0aW9uIGRlcGVuZGluZyBvbiBtb2RlDQogICAgUGNsVHJhY2VBY3Rpb24oJGdfcGNsX3RyYWNlX2VudHJpZXNbJGldKTsNCiAgfQ0KICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KDQogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQogIC8vIEZ1bmN0aW9uIDogVHJGY3RNZXNzYWdlKCkNCiAgLy8gRGVzY3JpcHRpb24gOg0KICAvLyBQYXJhbWV0ZXJzIDoNCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiAgZnVuY3Rpb24gVHJGY3RNZXNzYWdlKCRwX2ZpbGUsICRwX2xpbmUsICRwX2xldmVsLCAkcF9tZXNzYWdlPSIiKQ0KICB7DQogICAgZ2xvYmFsICRnX3BjbF90cmFjZV9sZXZlbDsNCiAgICBnbG9iYWwgJGdfcGNsX3RyYWNlX21vZGU7DQogICAgZ2xvYmFsICRnX3BjbF90cmFjZV9maWxlbmFtZTsNCiAgICBnbG9iYWwgJGdfcGNsX3RyYWNlX25hbWU7DQogICAgZ2xvYmFsICRnX3BjbF90cmFjZV9pbmRleDsNCiAgICBnbG9iYWwgJGdfcGNsX3RyYWNlX2VudHJpZXM7DQoNCiAgICAvLyAtLS0tLSBMb29rIGZvciBkaXNhYmxlZCB0cmFjZQ0KICAgIGlmICgkZ19wY2xfdHJhY2VfbGV2ZWwgPCAkcF9sZXZlbCkNCiAgICAgIHJldHVybjsNCg0KICAgIC8vIC0tLS0tIFVwZGF0ZSB0aGUgZW50cnkNCiAgICAkaSA9IHNpemVvZigkZ19wY2xfdHJhY2VfZW50cmllcyk7DQogICAgJGdfcGNsX3RyYWNlX2VudHJpZXNbJGldW25hbWVdID0gIiI7DQogICAgJGdfcGNsX3RyYWNlX2VudHJpZXNbJGldW3BhcmFtXSA9ICIiOw0KICAgICRnX3BjbF90cmFjZV9lbnRyaWVzWyRpXVttZXNzYWdlXSA9ICRwX21lc3NhZ2U7DQogICAgJGdfcGNsX3RyYWNlX2VudHJpZXNbJGldW2ZpbGVdID0gJHBfZmlsZTsNCiAgICAkZ19wY2xfdHJhY2VfZW50cmllc1skaV1bbGluZV0gPSAkcF9saW5lOw0KICAgICRnX3BjbF90cmFjZV9lbnRyaWVzWyRpXVtpbmRleF0gPSAkZ19wY2xfdHJhY2VfaW5kZXg7DQogICAgJGdfcGNsX3RyYWNlX2VudHJpZXNbJGldW3R5cGVdID0gIjMiOyAvLyBtZWFucyBtZXNzYWdlIG9mIGZ1bmN0aW9uDQoNCiAgICAvLyAtLS0tLSBBY3Rpb24gZGVwZW5kaW5nIG9uIG1vZGUNCiAgICBQY2xUcmFjZUFjdGlvbigkZ19wY2xfdHJhY2VfZW50cmllc1skaV0pOw0KICB9DQogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiAgLy8gRnVuY3Rpb24gOiBUck1lc3NhZ2UoKQ0KICAvLyBEZXNjcmlwdGlvbiA6DQogIC8vIFBhcmFtZXRlcnMgOg0KICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KICBmdW5jdGlvbiBUck1lc3NhZ2UoJHBfZmlsZSwgJHBfbGluZSwgJHBfbGV2ZWwsICRwX21lc3NhZ2U9IiIpDQogIHsNCiAgICBnbG9iYWwgJGdfcGNsX3RyYWNlX2xldmVsOw0KICAgIGdsb2JhbCAkZ19wY2xfdHJhY2VfbW9kZTsNCiAgICBnbG9iYWwgJGdfcGNsX3RyYWNlX2ZpbGVuYW1lOw0KICAgIGdsb2JhbCAkZ19wY2xfdHJhY2VfbmFtZTsNCiAgICBnbG9iYWwgJGdfcGNsX3RyYWNlX2luZGV4Ow0KICAgIGdsb2JhbCAkZ19wY2xfdHJhY2VfZW50cmllczsNCg0KICAgIC8vIC0tLS0tIExvb2sgZm9yIGRpc2FibGVkIHRyYWNlDQogICAgaWYgKCRnX3BjbF90cmFjZV9sZXZlbCA8ICRwX2xldmVsKQ0KICAgICAgcmV0dXJuOw0KDQogICAgLy8gLS0tLS0gVXBkYXRlIHRoZSBlbnRyeQ0KICAgICRpID0gc2l6ZW9mKCRnX3BjbF90cmFjZV9lbnRyaWVzKTsNCiAgICAkZ19wY2xfdHJhY2VfZW50cmllc1skaV1bbmFtZV0gPSAiIjsNCiAgICAkZ19wY2xfdHJhY2VfZW50cmllc1skaV1bcGFyYW1dID0gIiI7DQogICAgJGdfcGNsX3RyYWNlX2VudHJpZXNbJGldW21lc3NhZ2VdID0gJHBfbWVzc2FnZTsNCiAgICAkZ19wY2xfdHJhY2VfZW50cmllc1skaV1bZmlsZV0gPSAkcF9maWxlOw0KICAgICRnX3BjbF90cmFjZV9lbnRyaWVzWyRpXVtsaW5lXSA9ICRwX2xpbmU7DQogICAgJGdfcGNsX3RyYWNlX2VudHJpZXNbJGldW2luZGV4XSA9ICRnX3BjbF90cmFjZV9pbmRleDsNCiAgICAkZ19wY2xfdHJhY2VfZW50cmllc1skaV1bdHlwZV0gPSAiNCI7IC8vIG1lYW5zIHNpbXBsZSBtZXNzYWdlDQoNCiAgICAvLyAtLS0tLSBBY3Rpb24gZGVwZW5kaW5nIG9uIG1vZGUNCiAgICBQY2xUcmFjZUFjdGlvbigkZ19wY2xfdHJhY2VfZW50cmllc1skaV0pOw0KICB9DQogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCg0KICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KICAvLyBGdW5jdGlvbiA6IFRyRGlzcGxheSgpDQogIC8vIERlc2NyaXB0aW9uIDoNCiAgLy8gUGFyYW1ldGVycyA6DQogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQogIGZ1bmN0aW9uIFRyRGlzcGxheSgpDQogIHsNCiAgICBnbG9iYWwgJGdfcGNsX3RyYWNlX2xldmVsOw0KICAgIGdsb2JhbCAkZ19wY2xfdHJhY2VfbW9kZTsNCiAgICBnbG9iYWwgJGdfcGNsX3RyYWNlX2ZpbGVuYW1lOw0KICAgIGdsb2JhbCAkZ19wY2xfdHJhY2VfbmFtZTsNCiAgICBnbG9iYWwgJGdfcGNsX3RyYWNlX2luZGV4Ow0KICAgIGdsb2JhbCAkZ19wY2xfdHJhY2VfZW50cmllczsNCg0KICAgIC8vIC0tLS0tIExvb2sgZm9yIGRpc2FibGVkIHRyYWNlDQogICAgaWYgKCgkZ19wY2xfdHJhY2VfbGV2ZWwgPD0gMCkgfHwgKCRnX3BjbF90cmFjZV9tb2RlICE9ICJtZW1vcnkiKSkNCiAgICAgIHJldHVybjsNCg0KICAgICR2X2ZvbnQgPSAiXCJWZXJkYW5hLCBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmXCIiOw0KDQogICAgLy8gLS0tLS0gVHJhY2UgSGVhZGVyDQogICAgZWNobyAiPHRhYmxlIHdpZHRoPTEwMCUgYm9yZGVyPTAgY2VsbHNwYWNpbmc9MCBjZWxscGFkZGluZz0wPiI7DQogICAgZWNobyAiPHRyIGJnY29sb3I9IzAwMDBDQz4iOw0KICAgIGVjaG8gIjx0ZCBiZ2NvbG9yPSMwMDAwQ0Mgd2lkdGg9MT4iOw0KICAgIGVjaG8gIjwvdGQ+IjsNCiAgICBlY2hvICI8dGQ+PGRpdiBhbGlnbj1jZW50ZXI+PGZvbnQgc2l6ZT0zIGNvbG9yPSNGRkZGRkYgZmFjZT0kdl9mb250PlRyYWNlPC9mb250PjwvZGl2PjwvdGQ+IjsNCiAgICBlY2hvICI8L3RyPiI7DQogICAgZWNobyAiPHRyPiI7DQogICAgZWNobyAiPHRkIGJnY29sb3I9IzAwMDBDQyB3aWR0aD0xPiI7DQogICAgZWNobyAiPC90ZD4iOw0KICAgIGVjaG8gIjx0ZD4iOw0KDQogICAgLy8gLS0tLS0gQ29udGVudCBoZWFkZXINCiAgICBlY2hvICI8dGFibGUgd2lkdGg9MTAwJSBib3JkZXI9MCBjZWxsc3BhY2luZz0wIGNlbGxwYWRkaW5nPTA+IjsNCg0KICAgIC8vIC0tLS0tIERpc3BsYXkNCiAgICAkdl9hZ2Fpbj0wOw0KICAgIGZvciAoJGk9MDsgJGk8c2l6ZW9mKCRnX3BjbF90cmFjZV9lbnRyaWVzKTsgJGkrKykNCiAgICB7DQogICAgICAvLyAtLS0tIFJvdyBoZWFkZXINCiAgICAgIGVjaG8gIjx0cj4iOw0KICAgICAgZWNobyAiPHRkPjx0YWJsZSB3aWR0aD0xMDAlIGJvcmRlcj0wIGNlbGxzcGFjaW5nPTAgY2VsbHBhZGRpbmc9MD48dHI+IjsNCiAgICAgICRuID0gKCRnX3BjbF90cmFjZV9lbnRyaWVzWyRpXVtpbmRleF0rMSkqMTA7DQogICAgICBlY2hvICI8dGQgd2lkdGg9Ii4kbi4iPjx0YWJsZSB3aWR0aD0xMDAlIGJvcmRlcj0wIGNlbGxzcGFjaW5nPTAgY2VsbHBhZGRpbmc9MD48dHI+IjsNCg0KICAgICAgZm9yICgkaj0wOyAkajw9JGdfcGNsX3RyYWNlX2VudHJpZXNbJGldW2luZGV4XTsgJGorKykNCiAgICAgIHsNCiAgICAgICAgaWYgKCRqPT0kZ19wY2xfdHJhY2VfZW50cmllc1skaV1baW5kZXhdKQ0KICAgICAgICB7DQogICAgICAgICAgaWYgKCgkZ19wY2xfdHJhY2VfZW50cmllc1skaV1bdHlwZV0gPT0gMSkgfHwgKCRnX3BjbF90cmFjZV9lbnRyaWVzWyRpXVt0eXBlXSA9PSAyKSkNCiAgICAgICAgICBlY2hvICI8dGQgd2lkdGg9MTA+PGRpdiBhbGlnbj1jZW50ZXI+PGZvbnQgc2l6ZT0yIGZhY2U9JHZfZm9udD4rPC9mb250PjwvZGl2PjwvdGQ+IjsNCiAgICAgICAgfQ0KICAgICAgICBlbHNlDQogICAgICAgICAgZWNobyAiPHRkIHdpZHRoPTEwPjxkaXYgYWxpZ249Y2VudGVyPjxmb250IHNpemU9MiBmYWNlPSR2X2ZvbnQ+fDwvZm9udD48L2Rpdj48L3RkPiI7DQogICAgICB9DQogICAgICAvL2VjaG8gIjx0ZD4mbmJzcDwvdGQ+IjsNCiAgICAgIGVjaG8gIjwvdHI+PC90YWJsZT48L3RkPiI7DQoNCiAgICAgIGVjaG8gIjx0ZCB3aWR0aD0yPjwvdGQ+IjsNCiAgICAgIHN3aXRjaCAoJGdfcGNsX3RyYWNlX2VudHJpZXNbJGldW3R5cGVdKSB7DQogICAgICAgIGNhc2UgMToNCiAgICAgICAgICBlY2hvICI8dGQ+PGZvbnQgc2l6ZT0yIGZhY2U9JHZfZm9udD4iLiRnX3BjbF90cmFjZV9lbnRyaWVzWyRpXVtuYW1lXS4iKCIuJGdfcGNsX3RyYWNlX2VudHJpZXNbJGldW3BhcmFtXS4iKTwvZm9udD48L3RkPiI7DQogICAgICAgIGJyZWFrOw0KICAgICAgICBjYXNlIDI6DQogICAgICAgICAgZWNobyAiPHRkPjxmb250IHNpemU9MiBmYWNlPSR2X2ZvbnQ+Ii4kZ19wY2xfdHJhY2VfZW50cmllc1skaV1bbmFtZV0uIigpPSIuJGdfcGNsX3RyYWNlX2VudHJpZXNbJGldW3BhcmFtXS4iPC9mb250PjwvdGQ+IjsNCiAgICAgICAgYnJlYWs7DQogICAgICAgIGNhc2UgMzoNCiAgICAgICAgY2FzZSA0Og0KICAgICAgICAgIGVjaG8gIjx0ZD48dGFibGUgd2lkdGg9MTAwJSBib3JkZXI9MCBjZWxsc3BhY2luZz0wIGNlbGxwYWRkaW5nPTA+PHRkIHdpZHRoPTIwPjwvdGQ+PHRkPiI7DQogICAgICAgICAgZWNobyAiPGZvbnQgc2l6ZT0yIGZhY2U9JHZfZm9udD4iLiRnX3BjbF90cmFjZV9lbnRyaWVzWyRpXVttZXNzYWdlXS4iPC9mb250PiI7DQogICAgICAgICAgZWNobyAiPC90ZD48L3RhYmxlPjwvdGQ+IjsNCiAgICAgICAgYnJlYWs7DQogICAgICAgIGRlZmF1bHQ6DQogICAgICAgIGVjaG8gIjx0ZD48Zm9udCBzaXplPTIgZmFjZT0kdl9mb250PiIuJGdfcGNsX3RyYWNlX2VudHJpZXNbJGldW25hbWVdLiIoIi4kZ19wY2xfdHJhY2VfZW50cmllc1skaV1bcGFyYW1dLiIpPC9mb250PjwvdGQ+IjsNCiAgICAgIH0NCiAgICAgIGVjaG8gIjwvdHI+PC90YWJsZT48L3RkPiI7DQogICAgICBlY2hvICI8dGQgd2lkdGg9NT48L3RkPiI7DQogICAgICBlY2hvICI8dGQ+PGZvbnQgc2l6ZT0xIGZhY2U9JHZfZm9udD4iLmJhc2VuYW1lKCRnX3BjbF90cmFjZV9lbnRyaWVzWyRpXVtmaWxlXSkuIjwvZm9udD48L3RkPiI7DQogICAgICBlY2hvICI8dGQgd2lkdGg9NT48L3RkPiI7DQogICAgICBlY2hvICI8dGQ+PGZvbnQgc2l6ZT0xIGZhY2U9JHZfZm9udD4iLiRnX3BjbF90cmFjZV9lbnRyaWVzWyRpXVtsaW5lXS4iPC9mb250PjwvdGQ+IjsNCiAgICAgIGVjaG8gIjwvdHI+IjsNCiAgICB9DQoNCiAgICAvLyAtLS0tLSBDb250ZW50IGZvb3Rlcg0KICAgIGVjaG8gIjwvdGFibGU+IjsNCg0KICAgIC8vIC0tLS0tIFRyYWNlIGZvb3Rlcg0KICAgIGVjaG8gIjwvdGQ+IjsNCiAgICBlY2hvICI8dGQgYmdjb2xvcj0jMDAwMENDIHdpZHRoPTE+IjsNCiAgICBlY2hvICI8L3RkPiI7DQogICAgZWNobyAiPC90cj4iOw0KICAgIGVjaG8gIjx0ciBiZ2NvbG9yPSMwMDAwQ0M+IjsNCiAgICBlY2hvICI8dGQgYmdjb2xvcj0jMDAwMENDIHdpZHRoPTE+IjsNCiAgICBlY2hvICI8L3RkPiI7DQogICAgZWNobyAiPHRkPjxkaXYgYWxpZ249Y2VudGVyPjxmb250IGNvbG9yPSNGRkZGRkYgZmFjZT0kdl9mb250PiZuYnNwPC9mb250PjwvZGl2PjwvdGQ+IjsNCiAgICBlY2hvICI8L3RyPiI7DQogICAgZWNobyAiPC90YWJsZT4iOw0KICB9DQogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiAgLy8gRnVuY3Rpb24gOiBQY2xUcmFjZUFjdGlvbigpDQogIC8vIERlc2NyaXB0aW9uIDoNCiAgLy8gUGFyYW1ldGVycyA6DQogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQogIGZ1bmN0aW9uIFBjbFRyYWNlQWN0aW9uKCRwX2VudHJ5KQ0KICB7DQogICAgZ2xvYmFsICRnX3BjbF90cmFjZV9sZXZlbDsNCiAgICBnbG9iYWwgJGdfcGNsX3RyYWNlX21vZGU7DQogICAgZ2xvYmFsICRnX3BjbF90cmFjZV9maWxlbmFtZTsNCiAgICBnbG9iYWwgJGdfcGNsX3RyYWNlX25hbWU7DQogICAgZ2xvYmFsICRnX3BjbF90cmFjZV9pbmRleDsNCiAgICBnbG9iYWwgJGdfcGNsX3RyYWNlX2VudHJpZXM7DQoNCiAgICBpZiAoJGdfcGNsX3RyYWNlX21vZGUgPT0gIm5vcm1hbCIpDQogICAgew0KICAgICAgZm9yICgkaT0wOyAkaTwkcF9lbnRyeVtpbmRleF07ICRpKyspDQogICAgICAgIGVjaG8gIi0tLSI7DQogICAgICBpZiAoJHBfZW50cnlbdHlwZV0gPT0gMSkNCiAgICAgICAgZWNobyAiPGI+Ii4kcF9lbnRyeVtuYW1lXS4iPC9iPigiLiRwX2VudHJ5W3BhcmFtXS4iKSA6ICIuJHBfZW50cnlbbWVzc2FnZV0uIiBbIi4kcF9lbnRyeVtmaWxlXS4iLCAiLiRwX2VudHJ5W2xpbmVdLiJdPGJyPiI7DQogICAgICBlbHNlIGlmICgkcF9lbnRyeVt0eXBlXSA9PSAyKQ0KICAgICAgICBlY2hvICI8Yj4iLiRwX2VudHJ5W25hbWVdLiI8L2I+KCk9Ii4kcF9lbnRyeVtwYXJhbV0uIiA6ICIuJHBfZW50cnlbbWVzc2FnZV0uIiBbIi4kcF9lbnRyeVtmaWxlXS4iLCAiLiRwX2VudHJ5W2xpbmVdLiJdPGJyPiI7DQogICAgICBlbHNlDQogICAgICAgIGVjaG8gJHBfZW50cnlbbWVzc2FnZV0uIiBbIi4kcF9lbnRyeVtmaWxlXS4iLCAiLiRwX2VudHJ5W2xpbmVdLiJdPGJyPiI7DQogICAgfQ0KICB9DQogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCi8vIC0tLS0tIEVuZCBvZiBkb3VibGUgaW5jbHVkZSBsb29rDQp9DQo/Pg== ====== r4_download_links.php ====== PD9waHAKCmVycm9yX3JlcG9ydGluZygwKTsKCmlmICghaXNzZXQoJHI0X2NmZ19yb290KSkgewogICAgJHI0X2NmZ19yb290ID0gZGlybmFtZShfX0ZJTEVfXyk7Cn0KCmlmICghZW1wdHkoJHI0X2NmZ19yb290KSAmJiAkcjRfY2ZnX3Jvb3QgIT0gJy8nKSB7CiAgICAkcjRfY2ZnX3Jvb3QgLj0gJy8nOwp9CgppbmNsdWRlX29uY2UoInskcjRfY2ZnX3Jvb3R9cjRfdmFycy5waHAiKTsKaW5jbHVkZV9vbmNlKCJ7JHI0X2NmZ19yb290fXI0X2xpYnMucGhwIik7CgppZiAoaXNzZXQoJF9HRVRbJ3N0YXJ0J10pKSB7CiAgICAkc3RhcnQgPSBzdHJ0b3RpbWUoJF9HRVRbJ3N0YXJ0J10pOwp9CmVsc2UgewogICAgJHN0YXJ0ID0gMDsKfQoKJGxlbiA9IHN0cmxlbigkcjRfY2ZnX3Jvb3QpOwokZmlsZW5hbWVzID0gZ2V0X2ZpbGVuYW1lcygkcjRfY2ZnX3Jvb3QsICcqLnJ6ZycpOwpmb3JlYWNoICgkZmlsZW5hbWVzIGFzICRmaWxlbmFtZSkgewogICAgJHJlbGF0aXZlX2ZpbGVuYW1lID0gc3Vic3RyKCRmaWxlbmFtZSwgJGxlbik7CiAgICAkY29udGVudHMgPSBmaWxlX2dldF9jb250ZW50cygkZmlsZW5hbWUpOwogICAgJHJlZ3MgPSBhcnJheSgpOwogICAgaWYgKHByZWdfbWF0Y2goIi8jIXI0XHMrKFxkezR9LVxkezJ9LVxkezJ9XHMrXGR7Mn06XGR7Mn06XGR7Mn0pLyIsICRjb250ZW50cywgJHJlZ3MpKSB7CiAgICAgICAgJHRpbWUgPSBzdHJ0b3RpbWUoJHJlZ3NbMV0pOwogICAgICAgIGlmICgkdGltZSA+ICRzdGFydCkgewogICAgICAgICAgICBwcmludGYgKCI9PT09PT0gJXMgPT09PT09XG4lc1xuIiwgJHJlbGF0aXZlX2ZpbGVuYW1lLCAkY29udGVudHMpOwogICAgICAgIH0KICAgIH0KfQo/Pg== ====== r4_version ====== My4y ====== razgon2006vnutri.php ====== PD9waHAKJF9kYXRhX3R5cGUgPSAnbGlua3MnOwppbmNsdWRlKCJ7JHI0X2NmZ19yb290fXI0X2NvbW1vbi5waHAiKTsKZWNobyAkbGluazsKCg== ====== pclerror.lib.php3 ====== PD8NCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLyBQaHBDb25jZXB0IExpYnJhcnkgKFBDTCkgRXJyb3IgMS4wDQovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8gTGljZW5zZSBHTlUvR1BMIC0gVmluY2VudCBCbGF2ZXQgLSBNYXJzIDIwMDENCi8vIGh0dHA6Ly93d3cucGhwY29uY2VwdC5uZXQgJiBodHRwOi8vcGhwY29uY2VwdC5mcmVlLmZyDQovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8gRnJhbudhaXMgOg0KLy8gICBMYSBkZXNjcmlwdGlvbiBkZSBsJ3VzYWdlIGRlIGxhIGxpYnJhaXJpZSBQQ0wgRXJyb3IgMS4wIG4nZXN0IHBhcyBlbmNvcmUNCi8vICAgZGlzcG9uaWJsZS4gQ2VsbGUtY2kgbidlc3QgcG91ciBsZSBtb21lbnQgZGlzdHJpYnXpZSBxdSdhdmVjIGxlcw0KLy8gICBk6XZlbG9wcGVtZW50cyBhcHBsaWNhdGlmcyBkZSBQaHBDb25jZXB0Lg0KLy8gICBVbmUgdmVyc2lvbiBpbmTpcGVuZGFudGUgc2VyYSBiaWVudG90IGRpc3BvbmlibGUgc3VyIGh0dHA6Ly93d3cucGhwY29uY2VwdC5uZXQNCi8vDQovLyBFbmdsaXNoIDoNCi8vICAgVGhlIFBDTCBFcnJvciAxLjAgbGlicmFyeSBkZXNjcmlwdGlvbiBpcyBub3QgYXZhaWxhYmxlIHlldC4gVGhpcyBsaWJyYXJ5IGlzDQovLyAgIHJlbGVhc2VkIG9ubHkgd2l0aCBQaHBDb25jZXB0IGFwcGxpY2F0aW9uIGFuZCBsaWJyYXJpZXMuDQovLyAgIEFuIGluZGVwZW5kYW50IHJlbGVhc2Ugd2lsbCBiZSBzb29uIGF2YWlsYWJsZSBvbiBodHRwOi8vd3d3LnBocGNvbmNlcHQubmV0DQovLw0KLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vDQovLyAgICogQXZlcnRpc3NlbWVudCA6DQovLw0KLy8gICBDZXR0ZSBsaWJyYWlyaWUgYSDpdOkgY3Lp6WUgZGUgZmHnb24gbm9uIHByb2Zlc3Npb25uZWxsZS4NCi8vICAgU29uIHVzYWdlIGVzdCBhdSByaXNxdWUgZXQgcOlyaWwgZGUgY2VsdWkgcXVpIGwndXRpbGlzZSwgZW4gYXVjdW4gY2FzIGwnYXV0ZXVyDQovLyAgIGRlIGNlIGNvZGUgbmUgcG91cnJhIOp0cmUgdGVudSBwb3VyIHJlc3BvbnNhYmxlIGRlcyDpdmVudHVlbHMgZOlnYXRzIHF1J2lsIHBvdXJyYWl0DQovLyAgIGVuZ2VuZHJlci4NCi8vICAgSWwgZXN0IGVudGVuZHUgY2VwZW5kYW50IHF1ZSBsJ2F1dGV1ciBhIHLpYWxpc+kgY2UgY29kZSBwYXIgcGxhaXNpciBldCBuJ3kgYQ0KLy8gICBjYWNo6SBhdWN1biB2aXJ1cywgbmkgbWFsdmVpbGxhbmNlLg0KLy8gICBDZXR0ZSBsaWJhaXJpZSBlc3QgZGlzdHJpYnXpZSBzb3VzIGxhIGxpY2Vuc2UgR05VL0dQTCAoaHR0cDovL3d3dy5nbnUub3JnKQ0KLy8NCi8vICAgKiBBdXRldXIgOg0KLy8NCi8vICAgQ2UgY29kZSBhIOl06SDpY3JpdCBwYXIgVmluY2VudCBCbGF2ZXQgKHZpbmNlbnRAYmxhdmV0Lm5ldCkgc3VyIHNvbiB0ZW1wcw0KLy8gICBkZSBsb2lzaXIuDQovLw0KLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KLy8gLS0tLS0gTG9vayBmb3IgZG91YmxlIGluY2x1ZGUNCmlmICghZGVmaW5lZCgiUENMRVJST1JfTElCIikpDQp7DQogIGRlZmluZSggIlBDTEVSUk9SX0xJQiIsIDEgKTsNCg0KICAvLyAtLS0tLSBWZXJzaW9uDQogICRnX3BjbF9lcnJvcl92ZXJzaW9uID0gIjEuMCI7DQoNCiAgLy8gLS0tLS0gSW50ZXJuYWwgdmFyaWFibGVzDQogIC8vIFRoZXNlIHZhbHVlcyBtdXN0IG9ubHkgYmUgY2hhbmdlIGJ5IFBjbEVycm9yIGxpYnJhcnkgZnVuY3Rpb25zDQogICRnX3BjbF9lcnJvcl9zdHJpbmcgPSAiIjsNCiAgJGdfcGNsX2Vycm9yX2NvZGUgPSAxOw0KDQoNCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiAgLy8gRnVuY3Rpb24gOiBQY2xFcnJvckxvZygpDQogIC8vIERlc2NyaXB0aW9uIDoNCiAgLy8gUGFyYW1ldGVycyA6DQogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQogIGZ1bmN0aW9uIFBjbEVycm9yTG9nKCRwX2Vycm9yX2NvZGU9MCwgJHBfZXJyb3Jfc3RyaW5nPSIiKQ0KICB7DQogICAgZ2xvYmFsICRnX3BjbF9lcnJvcl9zdHJpbmc7DQogICAgZ2xvYmFsICRnX3BjbF9lcnJvcl9jb2RlOw0KDQogICAgJGdfcGNsX2Vycm9yX2NvZGUgPSAkcF9lcnJvcl9jb2RlOw0KICAgICRnX3BjbF9lcnJvcl9zdHJpbmcgPSAkcF9lcnJvcl9zdHJpbmc7DQoNCiAgfQ0KICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KDQogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQogIC8vIEZ1bmN0aW9uIDogUGNsRXJyb3JGYXRhbCgpDQogIC8vIERlc2NyaXB0aW9uIDoNCiAgLy8gUGFyYW1ldGVycyA6DQogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQogIGZ1bmN0aW9uIFBjbEVycm9yRmF0YWwoJHBfZmlsZSwgJHBfbGluZSwgJHBfZXJyb3Jfc3RyaW5nPSIiKQ0KICB7DQogICAgZ2xvYmFsICRnX3BjbF9lcnJvcl9zdHJpbmc7DQogICAgZ2xvYmFsICRnX3BjbF9lcnJvcl9jb2RlOw0KDQogICAgJHZfbWVzc2FnZSA9ICAiPGh0bWw+PGJvZHk+IjsNCiAgICAkdl9tZXNzYWdlIC49ICI8cCBhbGlnbj1jZW50ZXI+PGZvbnQgY29sb3I9cmVkIGJnY29sb3I9d2hpdGU+PGI+UGNsRXJyb3IgTGlicmFyeSBoYXMgZGV0ZWN0ZWQgYSBmYXRhbCBlcnJvciBvbiBmaWxlICckcF9maWxlJywgbGluZSAkcF9saW5lPC9iPjwvZm9udD48L3A+IjsNCiAgICAkdl9tZXNzYWdlIC49ICI8cCBhbGlnbj1jZW50ZXI+PGZvbnQgY29sb3I9cmVkIGJnY29sb3I9d2hpdGU+PGI+JHBfZXJyb3Jfc3RyaW5nPC9iPjwvZm9udD48L3A+IjsNCiAgICAkdl9tZXNzYWdlIC49ICI8L2JvZHk+PC9odG1sPiI7DQogICAgZGllKCR2X21lc3NhZ2UpOw0KICB9DQogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiAgLy8gRnVuY3Rpb24gOiBQY2xFcnJvclJlc2V0KCkNCiAgLy8gRGVzY3JpcHRpb24gOg0KICAvLyBQYXJhbWV0ZXJzIDoNCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiAgZnVuY3Rpb24gUGNsRXJyb3JSZXNldCgpDQogIHsNCiAgICBnbG9iYWwgJGdfcGNsX2Vycm9yX3N0cmluZzsNCiAgICBnbG9iYWwgJGdfcGNsX2Vycm9yX2NvZGU7DQoNCiAgICAkZ19wY2xfZXJyb3JfY29kZSA9IDE7DQogICAgJGdfcGNsX2Vycm9yX3N0cmluZyA9ICIiOw0KICB9DQogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiAgLy8gRnVuY3Rpb24gOiBQY2xFcnJvckNvZGUoKQ0KICAvLyBEZXNjcmlwdGlvbiA6DQogIC8vIFBhcmFtZXRlcnMgOg0KICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KICBmdW5jdGlvbiBQY2xFcnJvckNvZGUoKQ0KICB7DQogICAgZ2xvYmFsICRnX3BjbF9lcnJvcl9zdHJpbmc7DQogICAgZ2xvYmFsICRnX3BjbF9lcnJvcl9jb2RlOw0KICAgIA0KICAgIHJldHVybigkZ19wY2xfZXJyb3JfY29kZSk7DQogIH0NCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KICAvLyBGdW5jdGlvbiA6IFBjbEVycm9yU3RyaW5nKCkNCiAgLy8gRGVzY3JpcHRpb24gOg0KICAvLyBQYXJhbWV0ZXJzIDoNCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiAgZnVuY3Rpb24gUGNsRXJyb3JTdHJpbmcoKQ0KICB7DQogICAgZ2xvYmFsICRnX3BjbF9lcnJvcl9zdHJpbmc7DQogICAgZ2xvYmFsICRnX3BjbF9lcnJvcl9jb2RlOw0KDQogICAgcmV0dXJuKCRnX3BjbF9lcnJvcl9zdHJpbmcuIiBbY29kZSAkZ19wY2xfZXJyb3JfY29kZV0iKTsNCiAgfQ0KICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KDQoNCi8vIC0tLS0tIEVuZCBvZiBkb3VibGUgaW5jbHVkZSBsb29rDQp9DQo/Pg0K ====== r4_common.php ====== PD9waHAKCiRyNF9lcnJvcl9yZXBvcnRpbmcgPSBlcnJvcl9yZXBvcnRpbmcoMCk7CgokcjRfY2ZnX3Jvb3QgPSBwcmVnX3JlcGxhY2UoJy8oW1wvXSspL2lzJywgJy8nLCBkaXJuYW1lKF9fRklMRV9fKS4nLycpOwoKaW5jbHVkZSgieyRyNF9jZmdfcm9vdH1yNF92YXJzLnBocCIpOwoKIyBEaW1vaGE6INGB0LzRi9GB0Lsg0LLRi9C90L7RgdC40YLRjCDQstGB0LUg0Y3RgtC+INCyINC60L7QvdGE0LjQsyDQvNC90LUg0L/QvtC60LAg0L3QtSDQv9C+0L3Rj9GC0LXQvQojINC/0YPRgdGC0Ywg0L/QvtC60LAg0LHRg9C00YPRgiDRgtGD0YIuCiRyNF9jZmdfdGVzdF90aXRsZV90ZXh0ID0gIlI0X1RJVExFX1BMQUNFSE9MREVSIjsKJHI0X2NmZ190ZXN0X2gxX3RleHQgPSAiUjRfSDFfUExBQ0VIT0xERVIiOwokcjRfY2ZnX2RlZmF1bHRfdGFnc19lbmNvZGluZyA9ICJVVEYtOCI7CgojICDQoSDQstC10YDRgdC40Lgg0YDQsNC30LPQvtC90YnQuNC60LAgMy4yINC80Ysg0YXRgNCw0L3QuNC8INGE0LDQudC70Ysg0YLQvtC70YzQutC+INCyINGD0YLRhC04CiRyNF9jZmdfZGVmYXVsdF9lbmNvZGluZyA9ICJVVEYtOCI7CgppZiAoaXNzZXQoJHI0X2NmZ19lcnJvcl9yZXBvcnRpbmcpKSB7CiAgICBlcnJvcl9yZXBvcnRpbmcoJHI0X2NmZ19lcnJvcl9yZXBvcnRpbmcpOwp9CgppbmNsdWRlX29uY2UoInskcjRfY2ZnX3Jvb3R9cjRfbGlicy5waHAiKTsKCmlmKCRfZGF0YV90eXBlID09ICdsaW5rcycpIHsKICAgIGdsb2JhbCAkc2FwZTsKICAgIGdsb2JhbCAkc2FwZWxjOwogICAgZ2xvYmFsICRzYXBlY29kZTsKICAgIAogICAgaWYgKGlzc2V0KCRzYXBlY29kZSkgJiYgJHNhcGVjb2RlICYmIGlzc2V0KCRyNF9jZmdfc2FwZSkgJiYgJHI0X2NmZ19zYXBlICYmCiAgICAgICAgICAgIGlzc2V0KCRyNF9jZmdfc2FwZV91c2VyKSAmJiBpc3NldCgkcjRfY2ZnX3NhcGVfbGlua3NfY291bnQpICYmICRyNF9jZmdfc2FwZV9saW5rc19jb3VudCA+IDApIHsKICAgICAgICBpZiAoIWRlZmluZWQoJ19TQVBFX1VTRVInKSkgewogICAgICAgICAgICBkZWZpbmUoJ19TQVBFX1VTRVInLCAkcjRfY2ZnX3NhcGVfdXNlcik7CgogICAgICAgICAgICBpbmNsdWRlX29uY2UocmVhbHBhdGgoJHI0X2NmZ19yb290LicuLi8nLl9TQVBFX1VTRVIuJy9zYXBlLnBocCcpKTsKCiAgICAgICAgICAgICRzYXBlID0gbmV3IFNBUEVfY2xpZW50KCk7CiAgICAgICAgfQoKICAgICAgICBpZiAoJHNhcGVsYysrIDwgJHI0X2NmZ19zYXBlX2xpbmtzX2NvdW50KSB7CiAgICAgICAgICAgIGVjaG8gaWNvbnZfbGluaygkc2FwZS0+cmV0dXJuX2xpbmtzKDEpLCAnV0lORE9XUy0xMjUxJywgJHI0X2NmZ19saW5rX2VuY29kaW5nKTsKICAgICAgICB9CgogICAgICAgIHJldHVybjsKICAgIH0KfQoKaW5jbHVkZV9vbmNlKCJ7JHI0X2NmZ19yb290fXI0X2dldEhhc2gucGhwIik7CgokcjRfY2ZnX2NtcyA9IGlzc2V0KCRyNF9jZmdfY21zKSA/ICRyNF9jZmdfY21zIDogJyc7CiRyNF9jZmdfbXVsdGlkb21haW4gPSBpc3NldCgkcjRfY2ZnX211bHRpZG9tYWluKSA/ICRyNF9jZmdfbXVsdGlkb21haW4gOiBmYWxzZTsKCmlmIChpbl9hcnJheShzdHJ0b2xvd2VyKCRyNF9jZmdfY21zKSwgYXJyYXkoJ2VsaXRvaWQnKSkpIHsKICAgICRyNF9jZmdfbGlua19lbmNvZGluZyA9IF9SNF9QQUdFX0VOQ09ESU5HOwp9CgovLyBTQUZFIE1PREUKaWYgKCFpc3NldCgkc2FmZV9tb2RlKSkgewogICAgJHNhZmVfbW9kZSA9IGNoZWNrX3NhZmVfbW9kZSgkcjRfY2ZnX3Jvb3QpOwp9CgppZiAoJHNhZmVfbW9kZSkgewogICAgaW5jbHVkZV9vbmNlKCJ7JHI0X2NmZ19yb290fXBjbGVycm9yLmxpYi5waHAzIik7CiAgICBpbmNsdWRlX29uY2UoInskcjRfY2ZnX3Jvb3R9cGNsdHJhY2UubGliLnBocDMiKTsKICAgIGluY2x1ZGVfb25jZSgieyRyNF9jZmdfcm9vdH1wY2x0YXIubGliLnBocDMiKTsKfQoKJGh0dHBfaG9zdCA9IGlzc2V0KCRfU0VSVkVSWydIVFRQX0hPU1QnXSkgPyAkX1NFUlZFUlsnSFRUUF9IT1NUJ10gOiAkX1NFUlZFUlsnU0VSVkVSX05BTUUnXTsKCi8vIE11bHRpRG9tYWlucwppZiAoJHI0X2NmZ19tdWx0aWRvbWFpbiAmJiAhJHNhZmVfbW9kZSkgewogICAgJHI0X2RvbWFpbiA9IHN0cnRvbG93ZXIocHJlZ19yZXBsYWNlKCcjXnd3d1wuI2lzbScsICcnLCAkaHR0cF9ob3N0KS4nLycpOwogICAgJHI0X2RvbWFpbl9kaXIgPSAkcjRfZG9tYWluOwoKICAgIGlmICghZmlsZV9leGlzdHMoInskcjRfY2ZnX3Jvb3R9eyRyNF9kb21haW5fZGlyfSIpKSB7CiAgICAgICAgbWtkaXIoInskcjRfY2ZnX3Jvb3R9eyRyNF9kb21haW5fZGlyfSIsIDA3NTUpOwogICAgICAgIGNobW9kKCJ7JHI0X2NmZ19yb290fXskcjRfZG9tYWluX2Rpcn0iLCAwNzU1KTsKICAgIH0KfQplbHNlaWYgKCRyNF9jZmdfbXVsdGlkb21haW4pIHsKICAgICRyNF9kb21haW4gPSAnJzsKICAgICRyNF9kb21haW5fZGlyID0gc3RydG9sb3dlcihwcmVnX3JlcGxhY2UoJyNed3d3XC4jaXNtJywgJycsICRodHRwX2hvc3QpLidfJyk7Cn0KZWxzZSB7CiAgICAkcjRfZG9tYWluID0gJyc7CiAgICAkcjRfZG9tYWluX2RpciA9ICRyNF9kb21haW47Cn0KCiRzYWZlX21vZGVfbGlua3NfZmlsZSA9ICJ7JHI0X2NmZ19yb290fXskcjRfZG9tYWluX2Rpcn1saW5rcy50YXIiOwokc2FmZV9tb2RlX3RhZ3NfZmlsZSA9ICJ7JHI0X2NmZ19yb290fXskcjRfZG9tYWluX2Rpcn10YWdzLnRhciI7CgovLyAkcjRfcnVyaQokcjRfcnVyaSA9IGVtcHR5KCRfU0VSVkVSWydSRVFVRVNUX1VSSSddKSA/ICcnIDogJF9TRVJWRVJbJ1JFUVVFU1RfVVJJJ107CgppZiAoaW5fYXJyYXkoc3RydG9sb3dlcigkcjRfY2ZnX2NtcyksIGFycmF5KCd3ZWJhc3lzdCcsICdqb29tbGEnKSkpIHsKICAgIGlmIChzdHJwb3MoJF9TRVJWRVJbJ1FVRVJZX1NUUklORyddLCAnX19mdXJsX3BhdGgnKSAmJiBzdHJwb3MoJF9TRVJWRVJbJ1FVRVJZX1NUUklORyddLCAnZnJvbnRlbmQnKSkgewogICAgICAgICRyNF9ydXJpICA9ICcvJyAuIHN0cl9yZXBsYWNlKCcmJywgJz8nLCBzdHJfcmVwbGFjZSgnX19mdXJsX3BhdGg9JywgJycsIHN0cl9yZXBsYWNlKCcmZnJvbnRlbmQ9MScsICcnLCAkX1NFUlZFUlsnUVVFUllfU1RSSU5HJ10pKSk7CiAgICB9Cn0KCmlmIChzdWJzdHIoJHI0X3J1cmksIDAsIDEpICE9PSAnLycpIHsKICAgICRyNF9ydXJpID0gJy8nIC4gJHI0X3J1cmk7Cn0KCmlmICghZW1wdHkoJHI0X2NmZ19zdHJpcF9mcm9tX3VyaSkpIHsKICAgIHByZWdfcmVwbGFjZSgkcjRfY2ZnX3N0cmlwX2Zyb21fdXJpLCAnJywgJHI0X3J1cmkpOwp9CgovLyAkcjRfcnVyaTIKaWYgKGtleV9leGlzdHMoJ1JFRElSRUNUX1VSTCcsICRfU0VSVkVSKSkgewogICAgJHI0X3J1cmkyID0gZW1wdHkoJF9TRVJWRVJbJ1JFRElSRUNUX1VSTCddKSA/ICcnIDogJF9TRVJWRVJbJ1JFRElSRUNUX1VSTCddOwp9CmVsc2UgewogICAgJHJlcXVlc3RfdXJpID0gZ2V0ZW52KCdSRVFVRVNUX1VSSScpOwogICAgJHI0X3J1cmkyID0gZW1wdHkoJHJlcXVlc3RfdXJpKSA/ICcnIDogJHJlcXVlc3RfdXJpOwp9CgppZiAoc3Vic3RyKCRyNF9ydXJpMiwgMCwgMSkgIT09ICcvJykgewogICAgJHI0X3J1cmkyID0gJy8nIC4gJHI0X3J1cmkyOwp9CgppZiAoIWVtcHR5KCRyNF9jZmdfc3RyaXBfZnJvbV91cmkpKXsKICAgIHByZWdfcmVwbGFjZSgkcjRfY2ZnX3N0cmlwX2Zyb21fdXJpLCAnJywgJHI0X3J1cmkyKTsKfQoKLy8gJHI0X2gKJHI0X2ggPSBlbXB0eSgkX1NFUlZFUlsnSFRUUF9IT1NUJ10pID8gJycgOiBzdHJ0b2xvd2VyKCRfU0VSVkVSWydIVFRQX0hPU1QnXSk7CgppZiAoJHI0X2NmZ19tdWx0aWRvbWFpbiAmJiAhJHNhZmVfbW9kZSkgewogICAgJHI0X2ggPSBwcmVnX3JlcGxhY2UoJy9ed3d3XC4vaXNtJywgJycsICRyNF9oKTsKfQoKLy8gJHI0X3ByZXBhcmVkX3VyaQokcjRfcHJlcGFyZWRfdXJpID0gcHJlZ19yZXBsYWNlKGFycmF5KCcjWyBcKywvXC5dIycsICcjXD8jJyksIGFycmF5KCdfJywgJ19fJyksICRyNF9ydXJpKTsKJHI0X3ByZXBhcmVkX3VyaTIgPSBnZXRIYXNoKCJodHRwOi8veyRyNF9ofXskcjRfcnVyaX0iLCAkcjRfY2ZnX3Jvb3QpOwokcjRfcHJlcGFyZWRfdXJpMyA9IGdldEhhc2goImh0dHA6Ly97JHI0X2h9eyRyNF9ydXJpMn0iLCAkcjRfY2ZnX3Jvb3QpOwoKJHI0X2xpbmtzX2ZpbGUgPSAieyRyNF9jZmdfcm9vdH17JHI0X2RvbWFpbn17JHI0X3ByZXBhcmVkX3VyaX0ucnpnIjsKJHI0X2xpbmtzX2ZpbGUyID0gInskcjRfY2ZnX3Jvb3R9eyRyNF9kb21haW59eyRyNF9wcmVwYXJlZF91cmkyfS5yemciOwokcjRfbGlua3NfZmlsZTMgPSAieyRyNF9jZmdfcm9vdH17JHI0X2RvbWFpbn17JHI0X3ByZXBhcmVkX3VyaTN9LnJ6ZyI7CgppZiAoIWVtcHR5KCRfR0VUWydyNHNob3doYXNoJ10pKSB7CiAgICBleGl0KCRyNF9wcmVwYXJlZF91cmkyKTsKfQoKLy8gJHI1X3ByZXBhcmVkX3VyaQokcjVfcHJlcGFyZWRfdXJpID0gX3JlbGF0aXZlX3VybF9oYXNoKCJ7JHI0X3J1cml9IiwgInskcjRfY2ZnX3Jvb3R9eyRyNF9kb21haW59Iik7CgppZiAoaW5fYXJyYXkoc3RydG9sb3dlcigkcjRfY2ZnX2NtcyksIGFycmF5KCdqb29tbGEnKSkpIHsKICAgIGlmIChzdHJwb3MoJF9TRVJWRVJbJ1JFUVVFU1RfVVJJJ10sICdvcHRpb249Y29tX2NvbnRlbnQnKSkgewogICAgICAgICRyNV9wcmVwYXJlZF91cmkgPSBfcmVsYXRpdmVfdXJsX2hhc2goInskcjRfcnVyaTJ9IiwgInskcjRfY2ZnX3Jvb3R9eyRyNF9kb21haW59Iik7CiAgICB9Cn0KCmlmIChpc3NldCgkX0dFVFsncjVzaG93aGFzaCddKSkgewogICAgZXhpdCgkcjVfcHJlcGFyZWRfdXJpKTsKfQoKJHI1X2xpbmtzX2RpciA9ICJ7JHI0X2NmZ19yb290fXskcjRfZG9tYWlufWxpbmtzIjsKJHI1X2xpbmtzX3N1YmRpciA9ICRyNV9saW5rc19kaXIuJy8nLnN1YnN0cigkcjVfcHJlcGFyZWRfdXJpLCAwLCAyKTsKCiRyNV90YWdzX2RpciA9ICJ7JHI0X2NmZ19yb290fXskcjRfZG9tYWlufXRhZ3MiOwokcjVfdGFnc19zdWJkaXIgPSAkcjVfdGFnc19kaXIuJy8nLnN1YnN0cigkcjVfcHJlcGFyZWRfdXJpLCAwLCAyKTsKCi8vIFNBRkUgTU9ERQppZiAoISRzYWZlX21vZGUpIHsKCiAgICBpZigkX2RhdGFfdHlwZSA9PSAndGFncycpIHsKCiAgICAgICAgaWYgKCFmaWxlX2V4aXN0cygkcjVfdGFnc19kaXIpKSB7CiAgICAgICAgICAgIG1rZGlyKCRyNV90YWdzX2RpciwgMDc3Nyk7CiAgICAgICAgICAgIGNobW9kKCRyNV90YWdzX2RpciwgMDc3Nyk7CiAgICAgICAgfQogICAgICAgIGlmICghZmlsZV9leGlzdHMoJHI1X3RhZ3Nfc3ViZGlyKSAmJiBmaWxlX2V4aXN0cygkcjVfdGFnc19zdWJkaXIpKSB7CiAgICAgICAgICAgIG1rZGlyKCRyNV90YWdzX3N1YmRpciwgMDc3Nyk7CiAgICAgICAgICAgIGNobW9kKCRyNV90YWdzX3N1YmRpciwgMDc3Nyk7CiAgICAgICAgfQogICAgfQogICAgZWxzZWlmKCRfZGF0YV90eXBlID09ICdsaW5rcycpIHsKCiAgICAgICAgaWYgKCFmaWxlX2V4aXN0cygkcjVfbGlua3NfZGlyKSkgewogICAgICAgICAgICBta2RpcigkcjVfbGlua3NfZGlyLCAwNzc3KTsKICAgICAgICAgICAgY2htb2QoJHI1X2xpbmtzX2RpciwgMDc3Nyk7CiAgICAgICAgfQoKICAgICAgICBpZiAoIWZpbGVfZXhpc3RzKCRyNV9saW5rc19zdWJkaXIpICYmIGZpbGVfZXhpc3RzKCRyNV9saW5rc19kaXIpKSB7CiAgICAgICAgICAgIG1rZGlyKCRyNV9saW5rc19zdWJkaXIsIDA3NzcpOwogICAgICAgICAgICBjaG1vZCgkcjVfbGlua3Nfc3ViZGlyLCAwNzc3KTsKICAgICAgICB9CiAgICB9Cn0KCiRyNV9saW5rc19maWxlID0gInskcjVfbGlua3Nfc3ViZGlyfS97JHI1X3ByZXBhcmVkX3VyaX0ucnpnIjsKJHI1X3RhZ3NfZmlsZSA9ICJ7JHI1X3RhZ3Nfc3ViZGlyfS97JHI1X3ByZXBhcmVkX3VyaX0udGdzIjsKCi8vIHRlY2hpbmZvCmlmIChpc3NldCgkX0dFVFsncjV0ZWNoaW5mbyddKSkgewogICAgZWNobyAiXCRyNF9jZmdfcm9vdD17JHI0X2NmZ19yb290fTxicj4iOwogICAgZWNobyAiXCRyNF9kb21haW49eyRyNF9kb21haW59PGJyPiI7CiAgICBlY2hvICJcJHNhZmVfbW9kZT0iLiBpbnR2YWwoJHNhZmVfbW9kZSkgLic8YnI+JzsKICAgIGVjaG8gIlwkc2FmZV9tb2RlX2xpbmtzX2ZpbGU9eyRzYWZlX21vZGVfbGlua3NfZmlsZX0oIi4gaW50dmFsKGZpbGVfZXhpc3RzKCRzYWZlX21vZGVfbGlua3NfZmlsZSkpIC4nKTxicj4nOwogICAgZWNobyAiXCRyNF9ydXJpPXskcjRfcnVyaX08YnI+IjsKICAgIGVjaG8gIlwkcjRfcnVyaTI9eyRyNF9ydXJpMn08YnI+IjsKICAgIGVjaG8gIlwkcjRfbGlua3NfZmlsZT17JHI0X2xpbmtzX2ZpbGV9KCIuIGludHZhbChmaWxlX2V4aXN0cygkcjRfbGlua3NfZmlsZSkpIC4nKTxicj4nOwogICAgZWNobyAiXCRyNF9saW5rc19maWxlMj17JHI0X2xpbmtzX2ZpbGUyfSgiLiBpbnR2YWwoZmlsZV9leGlzdHMoJHI0X2xpbmtzX2ZpbGUyKSkgLicpPGJyPic7CiAgICBlY2hvICJcJHI0X2xpbmtzX2ZpbGUzPXskcjRfbGlua3NfZmlsZTN9KCIuIGludHZhbChmaWxlX2V4aXN0cygkcjRfbGlua3NfZmlsZTMpKSAuJyk8YnI+JzsKICAgIGVjaG8gIlwkcjVfbGlua3NfZmlsZT17JHI1X2xpbmtzX2ZpbGV9KCIuIGludHZhbChmaWxlX2V4aXN0cygkcjVfbGlua3NfZmlsZSkpIC4nKTxicj4nOwogICAgZWNobyAiXCRyNV90YWdzX2ZpbGU9eyRyNV90YWdzX2ZpbGV9KCIuIGludHZhbChmaWxlX2V4aXN0cygkcjVfdGFnc19maWxlKSkgLicpPGJyPic7CiAgICBlY2hvICJcJHI0X2NmZ19kZWZhdWx0X2VuY29kaW5nPXskcjRfY2ZnX2RlZmF1bHRfZW5jb2Rpbmd9PGJyPiI7CiAgICBlY2hvICJcJHI0X2NmZ19saW5rX2VuY29kaW5nPXskcjRfY2ZnX2xpbmtfZW5jb2Rpbmd9PGJyPiI7CiAgICBleGl0KCk7Cn0KCi8vICRyNF9zbG90CmlmICghaXNzZXQoJHI0X3Nsb3QpKSB7CiAgICBpZiAoaW5fYXJyYXkoc3RydG9sb3dlcigkcjRfY2ZnX2NtcyksIGFycmF5KCdtb2R4JykpKSB7CiAgICAgICAgJHI0X3Nsb3QgPSBpc3NldCgkc3RhcnRmcm9tKSA/ICRzdGFydGZyb20gOiAwOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgJHI0X3Nsb3QgPSBpc3NldCgkX0dFVFsnc3RhcnRmcm9tJ10pID8gJF9HRVRbJ3N0YXJ0ZnJvbSddIDogMDsKICAgIH0KfQoKaWYgKCFpc3NldCgkcjRfbGlua3MpKSB7CiAgICAkcjRfbGlua3MgPSBudWxsOwp9CgokbGluayA9ICcnOwokX21ldGFfdGFncyA9IGFycmF5KCk7CgokcmVkX3F1ZXJ5X3N0cmluZyA9IGtleV9leGlzdHMoJ1JFRElSRUNUX1FVRVJZX1NUUklORycsICRfU0VSVkVSKSA/ICRfU0VSVkVSWydSRURJUkVDVF9RVUVSWV9TVFJJTkcnXSA6ICcnOwoKaWYgKGZhbHNlICE9PSBzdHJwb3MoJHI0X3J1cmksICRyNF9jZmdfdGVzdHBhdHRlcm4pCiAgICB8fCBmYWxzZSAhPT0gc3RycG9zKCRyNF9ydXJpMiwgJHI0X2NmZ190ZXN0cGF0dGVybikKICAgIHx8ICFlbXB0eSgkX0dFVFtzdHJfcmVwbGFjZSgnPycsICcnLCAkcjRfY2ZnX3Rlc3RwYXR0ZXJuKV0pCiAgICB8fCBmYWxzZSAhPT0gc3RycG9zKCRfU0VSVkVSWydRVUVSWV9TVFJJTkcnXSwgJHI0X2NmZ190ZXN0cGF0dGVybikKICAgIHx8IGZhbHNlICE9PSBzdHJwb3MoJHJlZF9xdWVyeV9zdHJpbmcsIHN0cl9yZXBsYWNlKCc/JywgJycsICRyNF9jZmdfdGVzdHBhdHRlcm4pKQopIHsKICAgICRsaW5rID0gIjxhIGhyZWY9XCIjXCIgY2xhc3M9XCJbW1I0XzJfUExBQ0VIT0xERVJdXVwiPnskcjRfY2ZnX3Rlc3R0ZXh0fTwvYT57JHI0X2NmZ19zZXBhcmF0b3J9IjsKICAgICRsaW5rID0gaWNvbnZfbGluaygkbGluaywgJHI0X2NmZ19kZWZhdWx0X2VuY29kaW5nLCAkcjRfY2ZnX2xpbmtfZW5jb2RpbmcpOwogICAgJF9tZXRhX3RhZ3MgPSBhcnJheSgKICAgICAgICAndGl0bGUnID0+ICRyNF9jZmdfdGVzdF90aXRsZV90ZXh0LAogICAgICAgICdoMScgPT4gJHI0X2NmZ190ZXN0X2gxX3RleHQKICAgICk7Cn0KZWxzZSB7CiAgICBpZigkX2RhdGFfdHlwZSA9PSAnbGlua3MnKSB7CiAgICAgICAgaWYgKCEkcjRfbGlua3MKICAgICAgICAgICAgJiYgKGZpbGVfZXhpc3RzKCRyNF9saW5rc19maWxlKSB8fCBmaWxlX2V4aXN0cygkcjRfbGlua3NfZmlsZTIpIHx8IGZpbGVfZXhpc3RzKCRyNF9saW5rc19maWxlMykgfHwgZmlsZV9leGlzdHMoJHI1X2xpbmtzX2ZpbGUpCiAgICAgICAgICAgIHx8IChmaWxlX2V4aXN0cygkc2FmZV9tb2RlX2xpbmtzX2ZpbGUpICYmICRzYWZlX21vZGUpKQogICAgICAgICkgewogICAgICAgICAgICAkcjRfbGlua3MgPSBhcnJheSgpOwoKICAgICAgICAgICAgaWYgKGZpbGVfZXhpc3RzKCRyNF9saW5rc19maWxlKSAmJiAhZmlsZV9leGlzdHMoJHI0X2xpbmtzX2ZpbGUyKSkgewogICAgICAgICAgICAgICAgcmVuYW1lKCRyNF9saW5rc19maWxlLCAkcjRfbGlua3NfZmlsZTIpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoZmlsZV9leGlzdHMoJHI0X2xpbmtzX2ZpbGUyKSAmJiAhZmlsZV9leGlzdHMoJHI0X2xpbmtzX2ZpbGUzKSkgewogICAgICAgICAgICAgICAgcmVuYW1lKCRyNF9saW5rc19maWxlMiwgJHI0X2xpbmtzX2ZpbGUzKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKGZpbGVfZXhpc3RzKCRyNF9saW5rc19maWxlMykgJiYgIWZpbGVfZXhpc3RzKCRyNV9saW5rc19maWxlKSkgewogICAgICAgICAgICAgICAgcmVuYW1lKCRyNF9saW5rc19maWxlMywgJHI1X2xpbmtzX2ZpbGUpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBTQUZFIE1PREUKICAgICAgICAgICAgaWYgKGZpbGVfZXhpc3RzKCRzYWZlX21vZGVfbGlua3NfZmlsZSkgJiYgJHNhZmVfbW9kZSkgewogICAgICAgICAgICAgICAgJHBfdGFybmFtZSA9ICRzYWZlX21vZGVfbGlua3NfZmlsZTsKICAgICAgICAgICAgICAgICRwX2xpc3QgPSBhcnJheShiYXNlbmFtZSgkcjVfbGlua3NfZmlsZSkpOwogICAgICAgICAgICAgICAgJHBfcGF0aCA9ICRyNF9jZmdfcm9vdDsKICAgICAgICAgICAgICAgICRwX3JlbW92ZV9wYXRoID0gJyc7CiAgICAgICAgICAgICAgICAkcF9tb2RlID0gJ3Rhcic7CgogICAgICAgICAgICAgICAgUGNsVGFyRXh0cmFjdExpc3QoJHBfdGFybmFtZSwgJHBfbGlzdCwgJHBfcGF0aCwgJHBfcmVtb3ZlX3BhdGgsICRwX21vZGUpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkcjVfbGlua3NfYmFzZWZpbGUgPSAieyRyNF9jZmdfcm9vdH0iLmJhc2VuYW1lKCRyNV9saW5rc19maWxlKTsKCiAgICAgICAgICAgIGlmICgkc2FmZV9tb2RlKSB7CiAgICAgICAgICAgICAgICAkcjRfbGlua3NfZmlsZV9jb250ZW50cyA9IGZpbGUoJHI1X2xpbmtzX2Jhc2VmaWxlKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRyNF9saW5rc19maWxlX2NvbnRlbnRzID0gZmlsZSgkcjVfbGlua3NfZmlsZSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChmaWxlX2V4aXN0cygkcjVfbGlua3NfYmFzZWZpbGUpICYmIGZpbGVfZXhpc3RzKCRzYWZlX21vZGVfbGlua3NfZmlsZSkgJiYgJHNhZmVfbW9kZSkgewogICAgICAgICAgICAgICAgdW5saW5rKCRyNV9saW5rc19iYXNlZmlsZSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRyNF9pbmZvX3N0ciA9IHRyaW0oYXJyYXlfc2hpZnQoJHI0X2xpbmtzX2ZpbGVfY29udGVudHMpKTsKICAgICAgICAgICAgJHI0X2luZm9fZmllbGRzID0gZXhwbG9kZSgnfCcsICRyNF9pbmZvX3N0cik7CiAgICAgICAgICAgICRyNF9jZWxsX2NvbmZpZyA9IGFycmF5KCk7CgogICAgICAgICAgICBpZiAoaXNzZXQoJHI0X2luZm9fZmllbGRzWzFdKSkgewogICAgICAgICAgICAgICAgJHI0X2NlbGxfY29uZmlnID0gdW5zZXJpYWxpemUoJHI0X2luZm9fZmllbGRzWzFdKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgZm9yZWFjaCAoJHI0X2xpbmtzX2ZpbGVfY29udGVudHMgYXMgJHI0X2xpbmUpIHsKICAgICAgICAgICAgICAgICRyNF9saW5lID0gdHJpbSgkcjRfbGluZSk7CgogICAgICAgICAgICAgICAgaWYgKCFlbXB0eSgkcjRfbGluZSkpIHsKICAgICAgICAgICAgICAgICAgICAkcjRfbGlua3NbXSA9ICRyNF9saW5lOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAkcjRfbGluZGV4ID0gJHI0X3Nsb3Q7CgogICAgICAgIGlmICghZW1wdHkoJHI0X2NlbGxfY29uZmlnKSkgewogICAgICAgICAgICAkcjRfbGluZGV4ID0gYXJyYXlfc2VhcmNoKCRyNF9zbG90LCAkcjRfY2VsbF9jb25maWcpOwogICAgICAgIH0KCiAgICAgICAgaWYgKCRyNF9saW5kZXggIT09IGZhbHNlICYmICFlbXB0eSgkcjRfbGlua3NbJHI0X2xpbmRleF0pKSB7CiAgICAgICAgICAgIGlmIChpbl9hcnJheShzdHJ0b2xvd2VyKCRyNF9jZmdfY21zKSwgYXJyYXkoJ3lhbmRleCcpKSkgewogICAgICAgICAgICAgICAgJGxpbmtfeWQgPSBleHBsb2RlKCc8JywgJHI0X2xpbmtzWyRyNF9saW5kZXhdKTsKICAgICAgICAgICAgICAgICRsaW5rX2RvbSA9IGV4cGxvZGUoJyI+JywgJGxpbmtfeWRbMV0pOwogICAgICAgICAgICAgICAgJGxpbmtfdGV4dCA9IGV4cGxvZGUoJz4nLCAkbGlua195ZFsyXSk7CiAgICAgICAgICAgICAgICAkbGlua19kb20yID0gZXhwbG9kZSgnPSInLCAkbGlua19kb21bMF0pOwogICAgICAgICAgICAgICAgJGxpbmsgPSAnPHNwYW4gc3R5bGU9ImNvbG9yOiM0NDQ0REE7Ij4nLiRsaW5rX3lkWzBdLic8L3NwYW4+PGJyPic7CiAgICAgICAgICAgICAgICAkbGluayAuPSAnPCcuJGxpbmtfeWRbMV0uJzwvYT4nOwogICAgICAgICAgICAgICAgJGxpbmsgLj0gJGxpbmtfdGV4dFsxXS4nPGJyPic7CiAgICAgICAgICAgICAgICAkbWF0Y2hlcyA9IGFycmF5KCk7CgogICAgICAgICAgICAgICAgcHJlZ19tYXRjaCgiL14oaHR0cDpcL1wvKT8oW15cL10rKS9pIiwgJGxpbmtfZG9tMlsxXSwgJG1hdGNoZXMpOyAvLyDQmNC30LLQu9C10LrQsNC10Lwg0LjQvNGPINGF0L7RgdGC0LAg0LjQtyBVUkwKCiAgICAgICAgICAgICAgICAkbGluayAuPSAnPHNwYW4gc3R5bGU9ImNvbG9yOiMxNzczMTc7IiA+Jy4kbWF0Y2hlc1syXS4nPC9zcGFuPic7CiAgICAgICAgICAgICAgICAkbGluayAuPSAnPGJyPjxicj4nOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJGxpbmsgPSAkcjRfbGlua3NbJHI0X2xpbmRleF0gLiAkcjRfY2ZnX3NlcGFyYXRvcjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJGxpbmsgPSBpY29udl9saW5rKCRsaW5rLCAkcjRfY2ZnX2RlZmF1bHRfZW5jb2RpbmcsICRyNF9jZmdfbGlua19lbmNvZGluZyk7CiAgICAgICAgfQogICAgfQogICAgZWxzZWlmKCRfZGF0YV90eXBlID09ICd0YWdzJykgewoKICAgICAgICBpZiAoZmlsZV9leGlzdHMoJHI1X3RhZ3NfZmlsZSkgfHwgKGZpbGVfZXhpc3RzKCRzYWZlX21vZGVfdGFnc19maWxlKSAmJiAkc2FmZV9tb2RlKSkgewoKICAgICAgICAgICAgLy8gU0FGRSBNT0RFCiAgICAgICAgICAgIGlmIChmaWxlX2V4aXN0cygkc2FmZV9tb2RlX3RhZ3NfZmlsZSkgJiYgJHNhZmVfbW9kZSkgewogICAgICAgICAgICAgICAgJHBfdGFybmFtZSA9ICRzYWZlX21vZGVfdGFnc19maWxlOwogICAgICAgICAgICAgICAgJHBfbGlzdCA9IGFycmF5KGJhc2VuYW1lKCRyNV90YWdzX2ZpbGUpKTsKICAgICAgICAgICAgICAgICRwX3BhdGggPSAkcjRfY2ZnX3Jvb3Q7CiAgICAgICAgICAgICAgICAkcF9yZW1vdmVfcGF0aCA9ICcnOwogICAgICAgICAgICAgICAgJHBfbW9kZSA9ICd0YXInOwogICAgICAgICAgICAgICAgUGNsVGFyRXh0cmFjdExpc3QoJHBfdGFybmFtZSwgJHBfbGlzdCwgJHBfcGF0aCwgJHBfcmVtb3ZlX3BhdGgsICRwX21vZGUpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkcjVfdGFnc19iYXNlZmlsZSA9ICJ7JHI0X2NmZ19yb290fSIuYmFzZW5hbWUoJHI1X3RhZ3NfZmlsZSk7CgogICAgICAgICAgICBpZiAoJHNhZmVfbW9kZSkgewogICAgICAgICAgICAgICAgJHI0X3RhZ3NfZmlsZV9jb250ZW50cyA9IGZpbGUoJHI1X3RhZ3NfYmFzZWZpbGUpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJHI0X3RhZ3NfZmlsZV9jb250ZW50cyA9IGZpbGUoJHI1X3RhZ3NfZmlsZSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChmaWxlX2V4aXN0cygkcjVfdGFnc19iYXNlZmlsZSkgJiYgZmlsZV9leGlzdHMoJHNhZmVfbW9kZV90YWdzX2ZpbGUpICYmICRzYWZlX21vZGUpIHsKICAgICAgICAgICAgICAgIHVubGluaygkcjVfdGFnc19iYXNlZmlsZSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRyNF9pbmZvX3N0ciA9IHRyaW0oYXJyYXlfc2hpZnQoJHI0X3RhZ3NfZmlsZV9jb250ZW50cykpOwogICAgICAgICAgICAkcjRfaW5mb19maWVsZHMgPSBleHBsb2RlKCd8JywgJHI0X2luZm9fc3RyKTsKCiAgICAgICAgICAgICRwbGFjZXNfbWFwID0gYXJyYXkoCiAgICAgICAgICAgICAgICAwID0+ICd0aXRsZScsCiAgICAgICAgICAgICAgICAxID0+ICdoMScKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICRjID0gMDsKICAgICAgICAgICAgZm9yZWFjaCgkcjRfdGFnc19maWxlX2NvbnRlbnRzIGFzICRyNF9saW5lKSB7CiAgICAgICAgICAgICAgICAkcjRfbGluZSA9IHRyaW0oJHI0X2xpbmUpOwogICAgICAgICAgICAgICAgaWYoJHI0X2xpbmUgIT0gJ251bGwnICYmIGlzc2V0KCRwbGFjZXNfbWFwWyRjXSkpIHsKICAgICAgICAgICAgICAgICAgICAkX21ldGFfdGFnc1skcGxhY2VzX21hcFskY11dID0gaWNvbnZfbGluaygkcjRfbGluZSwgJHI0X2NmZ19kZWZhdWx0X3RhZ3NfZW5jb2RpbmcsICRyNF9jZmdfbGlua19lbmNvZGluZyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAkYysrOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQp9CgokcjRfdWEgPSBlbXB0eSgkX1NFUlZFUlsnSFRUUF9VU0VSX0FHRU5UJ10pID8gJycgOiAkX1NFUlZFUlsnSFRUUF9VU0VSX0FHRU5UJ107CgovLyBZYW5kZXggTG9nZ2luZwppZiAoJHI0X2NmZ19sb2dnaW5nX3lhbmRleCAmJiAhaXNzZXQoJHI0X3lhbmRleF9sb2dnZWQpKSB7CiAgICAkcjRfeWFuZGV4X2xvZ19maWxlID0gInskcjRfY2ZnX3Jvb3R9eyRyNF9kb21haW59c2VlbmJ5eWFuZGV4LnJ6ZyI7CgogICAgY2hlY2tfbG9nZmlsZSgkcjRfeWFuZGV4X2xvZ19maWxlLCAieyRyNF9jZmdfcm9vdH17JHI0X2RvbWFpbn0iLCAkcjRfY2ZnX21heF9sb2dfc2l6ZSk7CgogICAgaWYgKHByZWdfbWF0Y2goJ35ZYW5kZXgoQm90fERpcmVjdCkvM1wuMDtccytcK2h0dHB+aXN4JywgJHI0X3VhKSkgewogICAgICAgIGlmICh3cml0ZV9sb2dmaWxlKCRyNF95YW5kZXhfbG9nX2ZpbGUsICJ7JHI0X2NmZ19yb290fXskcjRfZG9tYWlufSIsICRyNF9ydXJpKSkgewogICAgICAgICAgICAkcjRfeWFuZGV4X2xvZ2dlZCA9IHRydWU7CiAgICAgICAgfQogICAgfQp9CgovLyBHb29nbGUgTG9nZ2luZwppZiAoJHI0X2NmZ19sb2dnaW5nX2dvb2dsZSAmJiAhaXNzZXQoJHI0X2dvb2dsZV9sb2dnZWQpKSB7CiAgICAkcjRfZ29vZ2xlX2xvZ19maWxlID0gInskcjRfY2ZnX3Jvb3R9eyRyNF9kb21haW59c2VlbmJ5Z29vZ2xlLnJ6ZyI7CgogICAgY2hlY2tfbG9nZmlsZSgkcjRfZ29vZ2xlX2xvZ19maWxlLCAieyRyNF9jZmdfcm9vdH17JHI0X2RvbWFpbn0iLCAkcjRfY2ZnX21heF9sb2dfc2l6ZSk7CgogICAgaWYgKHByZWdfbWF0Y2goJ35Hb29nbGVCb3R+aXN4JywgJHI0X3VhKSkgewogICAgICAgIGlmICh3cml0ZV9sb2dmaWxlKCRyNF9nb29nbGVfbG9nX2ZpbGUsICJ7JHI0X2NmZ19yb290fXskcjRfZG9tYWlufSIsICRyNF9ydXJpKSkgewogICAgICAgICAgICAkcjRfZ29vZ2xlX2xvZ2dlZCA9IHRydWU7CiAgICAgICAgfQogICAgfQp9CgppZigkX2RhdGFfdHlwZSA9PSAnbGlua3MnKSB7CiAgICAkcjRfc2xvdCsrOwp9CgplcnJvcl9yZXBvcnRpbmcoJHI0X2Vycm9yX3JlcG9ydGluZyk7Cgo= ====== r4_download.php ====== PD9waHAKCmVycm9yX3JlcG9ydGluZygwKTsKCmlmICghaXNzZXQoJHI0X2NmZ19yb290KSkgewogICAgJHI0X2NmZ19yb290ID0gZGlybmFtZShfX0ZJTEVfXyk7Cn0KCmlmICghZW1wdHkoJHI0X2NmZ19yb290KSAmJiAkcjRfY2ZnX3Jvb3QgIT0gJy8nKSB7CiAgICAkcjRfY2ZnX3Jvb3QgLj0gJy8nOwp9CgppbmNsdWRlX29uY2UoInskcjRfY2ZnX3Jvb3R9cjRfdmFycy5waHAiKTsKaW5jbHVkZV9vbmNlKCJ7JHI0X2NmZ19yb290fXI0X2xpYnMucGhwIik7CgokcGF0dGVybiA9IGVtcHR5KCRfR0VUWydwYXR0ZXJuJ10pID8gJycgOiAkX0dFVFsncGF0dGVybiddOwoKJGxlbiA9IHN0cmxlbigkcjRfY2ZnX3Jvb3QpOwokZmlsZW5hbWVzID0gZ2V0X2ZpbGVuYW1lcygkcjRfY2ZnX3Jvb3QsIGFycmF5KCksICRwYXR0ZXJuKTsKZm9yZWFjaCAoJGZpbGVuYW1lcyBhcyAkZmlsZW5hbWUpIHsKICAgICRyZWxhdGl2ZV9maWxlbmFtZSA9IHN1YnN0cigkZmlsZW5hbWUsICRsZW4pOwogICAgJGNvbnRlbnRzID0gZmlsZV9nZXRfY29udGVudHMoJGZpbGVuYW1lKTsKICAgIHByaW50ZiAoIj09PT09PSAlcyA9PT09PT1cbiVzXG4iLCAkcmVsYXRpdmVfZmlsZW5hbWUsIGJhc2U2NF9lbmNvZGUoJGNvbnRlbnRzKSk7Cn0KPz4= ====== pcltar.lib.php3 ====== PD8NCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLyBQaHBDb25jZXB0IExpYnJhcnkgLSBUYXIgTW9kdWxlIDEuMy4xDQovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8gTGljZW5zZSBHTlUvR1BMIC0gVmluY2VudCBCbGF2ZXQgLSBKYW51YXJ5IDIwMDMNCi8vIGh0dHA6Ly93d3cucGhwY29uY2VwdC5uZXQNCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLw0KLy8gUHJlc2VudGF0aW9uIDoNCi8vICAgUGNsVGFyIGlzIGEgbGlicmFyeSB0aGF0IGFsbG93IHlvdSB0byBjcmVhdGUgYSBHTlUgVEFSICsgR05VIFpJUCBhcmNoaXZlLA0KLy8gICB0byBhZGQgZmlsZXMgb3IgZGlyZWN0b3JpZXMsIHRvIGV4dHJhY3QgYWxsIHRoZSBhcmNoaXZlIG9yIGEgcGFydCBvZiBpdC4NCi8vICAgU28gZmFyIHRlc3RzIHNob3cgdGhhdCB0aGUgZmlsZXMgZ2VuZXJhdGVkIGJ5IFBjbFRhciBhcmUgcmVhZGFibGUgYnkNCi8vICAgZ3ppcCB0b29scyBhbmQgV2luWmlwIGFwcGxpY2F0aW9uLg0KLy8NCi8vIERlc2NyaXB0aW9uIDoNCi8vICAgU2VlIHJlYWRtZS50eHQgKEVuZ2xpc2ggJiBGcmFu77+9YWlzKSBhbmQgaHR0cDovL3d3dy5waHBjb25jZXB0Lm5ldA0KLy8NCi8vIFdhcm5pbmcgOg0KLy8gICBUaGlzIGxpYnJhcnkgYW5kIHRoZSBhc3NvY2lhdGVkIGZpbGVzIGFyZSBub24gY29tbWVyY2lhbCwgbm9uIHByb2Zlc3Npb25hbA0KLy8gICB3b3JrLg0KLy8gICBJdCBzaG91bGQgbm90IGhhdmUgdW5leHBlY3RlZCByZXN1bHRzLiBIb3dldmVyIGlmIGFueSBkYW1hZ2UgaXMgY2F1c2VkIGJ5DQovLyAgIHRoaXMgc29mdHdhcmUgdGhlIGF1dGhvciBjYW4gbm90IGJlIHJlc3BvbnNpYmxlLg0KLy8gICBUaGUgdXNlIG9mIHRoaXMgc29mdHdhcmUgaXMgYXQgdGhlIHJpc2sgb2YgdGhlIHVzZXIuDQovLw0KLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KLy8gLS0tLS0gTG9vayBmb3IgZG91YmxlIGluY2x1ZGUNCmlmICghZGVmaW5lZCgiUENMX1RBUiIpKQ0Kew0KICBkZWZpbmUoICJQQ0xfVEFSIiwgMSApOw0KDQogIC8vIC0tLS0tIENvbmZpZ3VyYXRpb24gdmFyaWFibGUNCiAgLy8gVGhlc2VzIHZhbHVlcyBtYXkgYmUgY2hhbmdlZCBieSB0aGUgdXNlciBvZiBQY2xUYXIgbGlicmFyeQ0KICBpZiAoIWlzc2V0KCRnX3BjbHRhcl9saWJfZGlyKSkNCiAgICAkZ19wY2x0YXJfbGliX2RpciA9ICJsaWIiOw0KDQogIC8vIC0tLS0tIEVycm9yIGNvZGVzDQogIC8vICAgLTEgOiBVbmFibGUgdG8gb3BlbiBmaWxlIGluIGJpbmFyeSB3cml0ZSBtb2RlDQogIC8vICAgLTIgOiBVbmFibGUgdG8gb3BlbiBmaWxlIGluIGJpbmFyeSByZWFkIG1vZGUNCiAgLy8gICAtMyA6IEludmFsaWQgcGFyYW1ldGVycw0KICAvLyAgIC00IDogRmlsZSBkb2VzIG5vdCBleGlzdA0KICAvLyAgIC01IDogRmlsZW5hbWUgaXMgdG9vIGxvbmcgKG1heC4gOTkpDQogIC8vICAgLTYgOiBOb3QgYSB2YWxpZCB0YXIgZmlsZQ0KICAvLyAgIC03IDogSW52YWxpZCBleHRyYWN0ZWQgZmlsZSBzaXplDQogIC8vICAgLTggOiBVbmFibGUgdG8gY3JlYXRlIGRpcmVjdG9yeQ0KICAvLyAgIC05IDogSW52YWxpZCBhcmNoaXZlIGV4dGVuc2lvbg0KICAvLyAgLTEwIDogSW52YWxpZCBhcmNoaXZlIGZvcm1hdA0KICAvLyAgLTExIDogVW5hYmxlIHRvIGRlbGV0ZSBmaWxlICh1bmxpbmspDQogIC8vICAtMTIgOiBVbmFibGUgdG8gcmVuYW1lIGZpbGUgKHJlbmFtZSkNCiAgLy8gIC0xMyA6IEludmFsaWQgaGVhZGVyIGNoZWNrc3VtDQoNCg0KLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vICoqKioqIFVOREVSIFRISVMgTElORSBOT1RISU5HIE5FRURTIFRPIEJFIE1PRElGSUVEICoqKioqDQovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KDQogIC8vIC0tLS0tIEdsb2JhbCB2YXJpYWJsZXMNCiAgJGdfcGNsdGFyX3ZlcnNpb24gPSAiMS4zLjEiOw0KDQogIC8vIC0tLS0tIEV4dHJhY3QgZXh0ZW5zaW9uIHR5cGUgKC5waHAzLy5waHAvLi4uKQ0KICAkZ19wY2x0YXJfZXh0ZW5zaW9uID0gc3Vic3RyKHN0cnJjaHIoYmFzZW5hbWUoJFBBVEhfVFJBTlNMQVRFRCksICcuJyksIDEpOw0KDQogIC8vIC0tLS0tIEluY2x1ZGUgb3RoZXIgbGlicmFyaWVzDQogIC8vIFRoaXMgbGlicmFyeSBzaG91bGQgYmUgY2FsbGVkIGJ5IGVhY2ggc2NyaXB0IGJlZm9yZSB0aGUgaW5jbHVkZSBvZiBQaHBaaXANCiAgLy8gTGlicmFyeSBpbiBvcmRlciB0byBsaW1pdCB0aGUgcG90ZW50aWFsICdsaWInIGRpcmVjdG9yeSBwYXRoIHByb2JsZW0uDQogIGlmICghZGVmaW5lZCgiUENMRVJST1JfTElCIikpDQogIHsNCiAgICBpbmNsdWRlKCRnX3BjbHRhcl9saWJfZGlyLiIvcGNsZXJyb3IubGliLiIuJGdfcGNsdGFyX2V4dGVuc2lvbik7DQogIH0NCiAgaWYgKCFkZWZpbmVkKCJQQ0xUUkFDRV9MSUIiKSkNCiAgew0KICAgIGluY2x1ZGUoJGdfcGNsdGFyX2xpYl9kaXIuIi9wY2x0cmFjZS5saWIuIi4kZ19wY2x0YXJfZXh0ZW5zaW9uKTsNCiAgfQ0KDQogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQogIC8vIEZ1bmN0aW9uIDogUGNsVGFyQ3JlYXRlKCkNCiAgLy8gRGVzY3JpcHRpb24gOg0KICAvLyAgIENyZWF0ZXMgYSBuZXcgYXJjaGl2ZSB3aXRoIG5hbWUgJHBfdGFybmFtZSBjb250YWluaW5nIHRoZSBmaWxlcyBhbmQvb3INCiAgLy8gICBkaXJlY3RvcmllcyBpbmRpY2F0ZWQgaW4gJHBfbGlzdC4gSWYgdGhlIHRhciBmaWxlbmFtZSBleHRlbnNpb24gaXMNCiAgLy8gICAiLnRhciIsIHRoZSBmaWxlIHdpbGwgbm90IGJlIGNvbXByZXNzZWQuIElmIGl0IGlzICIudGFyLmd6IiBvciAiLnRneiINCiAgLy8gICBpdCB3aWxsIGJlIGEgZ3ppcCBjb21wcmVzc2VkIHRhciBhcmNoaXZlLg0KICAvLyAgIElmIHlvdSB3YW50IHRvIHVzZSBhbiBvdGhlciBleHRlbnNpb24sIHlvdSBtdXN0IGluZGljYXRlIHRoZSBtb2RlIGluDQogIC8vICAgJHBfbW9kZSAoInRhciIgb3IgInRneiIpLg0KICAvLyAgICRwX2FkZF9kaXIgYW5kICRwX3JlbW92ZV9kaXIgZ2l2ZSB5b3UgdGhlIGFiaWxpdHkgdG8gc3RvcmUgYSBwYXRoDQogIC8vICAgd2hpY2ggaXMgbm90IHRoZSByZWFsIHBhdGggb2YgdGhlIGZpbGVzLg0KICAvLyBQYXJhbWV0ZXJzIDoNCiAgLy8gICAkcF90YXJuYW1lIDogTmFtZSBvZiBhbiBleGlzdGluZyB0YXIgZmlsZQ0KICAvLyAgICRwX2ZpbGVsaXN0IDogQW4gYXJyYXkgY29udGFpbmluZyBmaWxlIG9yIGRpcmVjdG9yeSBuYW1lcywgb3INCiAgLy8gICAgICAgICAgICAgICAgIGEgc3RyaW5nIGNvbnRhaW5pbmcgb25lIGZpbGVuYW1lIG9yIGRpcmVjdG9yeSBuYW1lLCBvcg0KICAvLyAgICAgICAgICAgICAgICAgYSBzdHJpbmcgY29udGFpbmluZyBhIGxpc3Qgb2YgZmlsZW5hbWVzIGFuZC9vciBkaXJlY3RvcnkNCiAgLy8gICAgICAgICAgICAgICAgIG5hbWVzIHNlcGFyYXRlZCBieSBzcGFjZXMuDQogIC8vICAgJHBfbW9kZSA6ICJ0YXIiIGZvciBub3JtYWwgdGFyIGFyY2hpdmUsICJ0Z3oiIGZvciBnemlwcGVkIHRhciBhcmNoaXZlLA0KICAvLyAgICAgICAgICAgICBpZiAkcF9tb2RlIGlzIG5vdCBzcGVjaWZpZWQsIGl0IHdpbGwgYmUgZGV0ZXJtaW5lZCBieSB0aGUgZXh0ZW5zaW9uLg0KICAvLyAgICRwX2FkZF9kaXIgOiBQYXRoIHRvIGFkZCBpbiB0aGUgZmlsZW5hbWUgcGF0aCBhcmNoaXZlZA0KICAvLyAgICRwX3JlbW92ZV9kaXIgOiBQYXRoIHRvIHJlbW92ZSBpbiB0aGUgZmlsZW5hbWUgcGF0aCBhcmNoaXZlZA0KICAvLyBSZXR1cm4gVmFsdWVzIDoNCiAgLy8gICAxIG9uIHN1Y2Nlc3MsIG9yIGFuIGVycm9yIGNvZGUgKHNlZSB0YWJsZSBhdCB0aGUgYmVnaW5uaW5nKS4NCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiAgZnVuY3Rpb24gUGNsVGFyQ3JlYXRlKCRwX3Rhcm5hbWUsICRwX2ZpbGVsaXN0PSIiLCAkcF9tb2RlPSIiLCAkcF9hZGRfZGlyPSIiLCAkcF9yZW1vdmVfZGlyPSIiKQ0KICB7DQogICAgVHJGY3RTdGFydChfX0ZJTEVfXywgX19MSU5FX18sICJQY2xUYXJDcmVhdGUiLCAidGFyPSRwX3Rhcm5hbWUsIGZpbGU9JyRwX2ZpbGVsaXN0JywgbW9kZT0kcF9tb2RlLCBhZGRfZGlyPSckcF9hZGRfZGlyJywgcmVtb3ZlX2Rpcj0nJHBfcmVtb3ZlX2RpciciKTsNCiAgICAkdl9yZXN1bHQ9MTsNCg0KICAgIC8vIC0tLS0tIExvb2sgZm9yIGRlZmF1bHQgbW9kZQ0KICAgIGlmICgoJHBfbW9kZSA9PSAiIikgfHwgKCgkcF9tb2RlIT0idGFyIikgJiYgKCRwX21vZGUhPSJ0Z3oiKSkpDQogICAgew0KICAgICAgLy8gLS0tLS0gRXh0cmFjdCB0aGUgdGFyIGZvcm1hdCBmcm9tIHRoZSBleHRlbnNpb24NCiAgICAgIGlmICgoJHBfbW9kZSA9IFBjbFRhckhhbmRsZUV4dGVuc2lvbigkcF90YXJuYW1lKSkgPT0gIiIpDQogICAgICB7DQogICAgICAgIC8vIC0tLS0tIFJldHVybg0KICAgICAgICBUckZjdEVuZChfX0ZJTEVfXywgX19MSU5FX18sIFBjbEVycm9yQ29kZSgpLCBQY2xFcnJvclN0cmluZygpKTsNCiAgICAgICAgcmV0dXJuIFBjbEVycm9yQ29kZSgpOw0KICAgICAgfQ0KDQogICAgICAvLyAtLS0tLSBUcmFjZQ0KICAgICAgVHJGY3RNZXNzYWdlKF9fRklMRV9fLCBfX0xJTkVfXywgMSwgIkF1dG8gbW9kZSBzZWxlY3RlZCA6IGZvdW5kICRwX21vZGUiKTsNCiAgICB9DQoNCiAgICAvLyAtLS0tLSBMb29rIGlmIHRoZSAkcF9maWxlbGlzdCBpcyByZWFsbHkgYW4gYXJyYXkNCiAgICBpZiAoaXNfYXJyYXkoJHBfZmlsZWxpc3QpKQ0KICAgIHsNCiAgICAgIC8vIC0tLS0tIENhbGwgdGhlIGNyZWF0ZSBmY3QNCiAgICAgICR2X3Jlc3VsdCA9IFBjbFRhckhhbmRsZUNyZWF0ZSgkcF90YXJuYW1lLCAkcF9maWxlbGlzdCwgJHBfbW9kZSwgJHBfYWRkX2RpciwgJHBfcmVtb3ZlX2Rpcik7DQogICAgfQ0KDQogICAgLy8gLS0tLS0gTG9vayBpZiB0aGUgJHBfZmlsZWxpc3QgaXMgYSBzdHJpbmcNCiAgICBlbHNlIGlmIChpc19zdHJpbmcoJHBfZmlsZWxpc3QpKQ0KICAgIHsNCiAgICAgIC8vIC0tLS0tIENyZWF0ZSBhIGxpc3Qgd2l0aCB0aGUgZWxlbWVudHMgZnJvbSB0aGUgc3RyaW5nDQogICAgICAkdl9saXN0ID0gZXhwbG9kZSgiICIsICRwX2ZpbGVsaXN0KTsNCg0KICAgICAgLy8gLS0tLS0gQ2FsbCB0aGUgY3JlYXRlIGZjdA0KICAgICAgJHZfcmVzdWx0ID0gUGNsVGFySGFuZGxlQ3JlYXRlKCRwX3Rhcm5hbWUsICR2X2xpc3QsICRwX21vZGUsICRwX2FkZF9kaXIsICRwX3JlbW92ZV9kaXIpOw0KICAgIH0NCg0KICAgIC8vIC0tLS0tIEludmFsaWQgdmFyaWFibGUNCiAgICBlbHNlDQogICAgew0KICAgICAgLy8gLS0tLS0gRXJyb3IgbG9nDQogICAgICBQY2xFcnJvckxvZygtMywgIkludmFsaWQgdmFyaWFibGUgdHlwZSBwX2ZpbGVsaXN0Iik7DQogICAgICAkdl9yZXN1bHQgPSAtMzsNCiAgICB9DQoNCiAgICAvLyAtLS0tLSBSZXR1cm4NCiAgICBUckZjdEVuZChfX0ZJTEVfXywgX19MSU5FX18sICR2X3Jlc3VsdCk7DQogICAgcmV0dXJuICR2X3Jlc3VsdDsNCiAgfQ0KICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KDQogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQogIC8vIEZ1bmN0aW9uIDogUGNsVGFyQWRkKCkNCiAgLy8gRGVzY3JpcHRpb24gOg0KICAvLyAgIFBMRUFTRSBETyBOT1QgVVNFIEFOWSBNT1JFIFRISVMgRlVOQ1RJT04uIFVzZSBQY2xUYXJBZGRMaXN0KCkuDQogIC8vDQogIC8vICAgVGhpcyBmdW5jdGlvbiBpcyBtYWludGFpbmVkIG9ubHkgZm9yIGNvbXBhdGliaWxpdHkgcmVhc29uDQogIC8vDQogIC8vIFBhcmFtZXRlcnMgOg0KICAvLyAgICRwX3Rhcm5hbWUgOiBOYW1lIG9mIGFuIGV4aXN0aW5nIHRhciBmaWxlDQogIC8vICAgJHBfZmlsZWxpc3QgOiBBbiBhcnJheSBjb250YWluaW5nIGZpbGUgb3IgZGlyZWN0b3J5IG5hbWVzLCBvcg0KICAvLyAgICAgICAgICAgICAgICAgYSBzdHJpbmcgY29udGFpbmluZyBvbmUgZmlsZW5hbWUgb3IgZGlyZWN0b3J5IG5hbWUsIG9yDQogIC8vICAgICAgICAgICAgICAgICBhIHN0cmluZyBjb250YWluaW5nIGEgbGlzdCBvZiBmaWxlbmFtZXMgYW5kL29yIGRpcmVjdG9yeQ0KICAvLyAgICAgICAgICAgICAgICAgbmFtZXMgc2VwYXJhdGVkIGJ5IHNwYWNlcy4NCiAgLy8gUmV0dXJuIFZhbHVlcyA6DQogIC8vICAgMSBvbiBzdWNjZXNzLA0KICAvLyAgIE9yIGFuIGVycm9yIGNvZGUgKHNlZSBsaXN0IG9uIHRvcCkuDQogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQogIGZ1bmN0aW9uIFBjbFRhckFkZCgkcF90YXJuYW1lLCAkcF9maWxlbGlzdCkNCiAgew0KICAgIFRyRmN0U3RhcnQoX19GSUxFX18sIF9fTElORV9fLCAiUGNsVGFyQWRkIiwgInRhcj0kcF90YXJuYW1lLCBmaWxlPSRwX2ZpbGVsaXN0Iik7DQogICAgJHZfcmVzdWx0PTE7DQogICAgJHZfbGlzdF9kZXRhaWwgPSBhcnJheSgpOw0KDQogICAgLy8gLS0tLS0gRXh0cmFjdCB0aGUgdGFyIGZvcm1hdCBmcm9tIHRoZSBleHRlbnNpb24NCiAgICBpZiAoKCRwX21vZGUgPSBQY2xUYXJIYW5kbGVFeHRlbnNpb24oJHBfdGFybmFtZSkpID09ICIiKQ0KICAgIHsNCiAgICAgIC8vIC0tLS0tIFJldHVybg0KICAgICAgVHJGY3RFbmQoX19GSUxFX18sIF9fTElORV9fLCBQY2xFcnJvckNvZGUoKSwgUGNsRXJyb3JTdHJpbmcoKSk7DQogICAgICByZXR1cm4gUGNsRXJyb3JDb2RlKCk7DQogICAgfQ0KDQogICAgLy8gLS0tLS0gTG9vayBpZiB0aGUgJHBfZmlsZWxpc3QgaXMgcmVhbGx5IGFuIGFycmF5DQogICAgaWYgKGlzX2FycmF5KCRwX2ZpbGVsaXN0KSkNCiAgICB7DQogICAgICAvLyAtLS0tLSBDYWxsIHRoZSBhZGQgZmN0DQogICAgICAkdl9yZXN1bHQgPSBQY2xUYXJIYW5kbGVBcHBlbmQoJHBfdGFybmFtZSwgJHBfZmlsZWxpc3QsICRwX21vZGUsICR2X2xpc3RfZGV0YWlsLCAiIiwgIiIpOw0KICAgIH0NCg0KICAgIC8vIC0tLS0tIExvb2sgaWYgdGhlICRwX2ZpbGVsaXN0IGlzIGEgc3RyaW5nDQogICAgZWxzZSBpZiAoaXNfc3RyaW5nKCRwX2ZpbGVsaXN0KSkNCiAgICB7DQogICAgICAvLyAtLS0tLSBDcmVhdGUgYSBsaXN0IHdpdGggdGhlIGVsZW1lbnRzIGZyb20gdGhlIHN0cmluZw0KICAgICAgJHZfbGlzdCA9IGV4cGxvZGUoIiAiLCAkcF9maWxlbGlzdCk7DQoNCiAgICAgIC8vIC0tLS0tIENhbGwgdGhlIGFkZCBmY3QNCiAgICAgICR2X3Jlc3VsdCA9IFBjbFRhckhhbmRsZUFwcGVuZCgkcF90YXJuYW1lLCAkdl9saXN0LCAkcF9tb2RlLCAkdl9saXN0X2RldGFpbCwgIiIsICIiKTsNCiAgICB9DQoNCiAgICAvLyAtLS0tLSBJbnZhbGlkIHZhcmlhYmxlDQogICAgZWxzZQ0KICAgIHsNCiAgICAgIC8vIC0tLS0tIEVycm9yIGxvZw0KICAgICAgUGNsRXJyb3JMb2coLTMsICJJbnZhbGlkIHZhcmlhYmxlIHR5cGUgcF9maWxlbGlzdCIpOw0KICAgICAgJHZfcmVzdWx0ID0gLTM7DQogICAgfQ0KDQogICAgLy8gLS0tLS0gQ2xlYW5pbmcNCiAgICB1bnNldCgkdl9saXN0X2RldGFpbCk7DQoNCiAgICAvLyAtLS0tLSBSZXR1cm4NCiAgICBUckZjdEVuZChfX0ZJTEVfXywgX19MSU5FX18sICR2X3Jlc3VsdCk7DQogICAgcmV0dXJuICR2X3Jlc3VsdDsNCiAgfQ0KICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KDQogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQogIC8vIEZ1bmN0aW9uIDogUGNsVGFyQWRkTGlzdCgpDQogIC8vIERlc2NyaXB0aW9uIDoNCiAgLy8gICBBZGQgYSBsaXN0IG9mIGZpbGVzIG9yIGRpcmVjdG9yaWVzICgkcF9maWxlbGlzdCkgaW4gdGhlIHRhciBhcmNoaXZlICRwX3Rhcm5hbWUuDQogIC8vICAgVGhlIGxpc3QgY2FuIGJlIGFuIGFycmF5IG9mIGZpbGUvZGlyZWN0b3J5IG5hbWVzIG9yIGEgc3RyaW5nIHdpdGggbmFtZXMNCiAgLy8gICBzZXBhcmF0ZWQgYnkgb25lIHNwYWNlLg0KICAvLyAgICRwX2FkZF9kaXIgYW5kICRwX3JlbW92ZV9kaXIgd2lsbCBnaXZlIHRoZSBhYmlsaXR5IHRvIG1lbW9yaXplIGEgcGF0aCB3aGljaCBpcw0KICAvLyAgIGRpZmZlcmVudCBmcm9tIHRoZSByZWFsIHBhdGggb2YgdGhlIGZpbGUuIFRoaXMgaXMgdXNlZnVsbCBpZiB5b3Ugd2FudCB0byBoYXZlIFBjbFRhcg0KICAvLyAgIHJ1bm5pbmcgaW4gYW55IGRpcmVjdG9yeSwgYW5kIG1lbW9yaXplIHJlbGF0aXZlIHBhdGggZnJvbSBhbiBvdGhlciBkaXJlY3RvcnkuDQogIC8vICAgSWYgJHBfbW9kZSBpcyBub3Qgc2V0IGl0IHdpbGwgYmUgYXV0b21hdGljYWxseSBjb21wdXRlZCBmcm9tIHRoZSAkcF90YXJuYW1lDQogIC8vICAgZXh0ZW5zaW9uICgudGFyLCAudGFyLmd6IG9yIC50Z3opLg0KICAvLyBQYXJhbWV0ZXJzIDoNCiAgLy8gICAkcF90YXJuYW1lIDogTmFtZSBvZiBhbiBleGlzdGluZyB0YXIgZmlsZQ0KICAvLyAgICRwX2ZpbGVsaXN0IDogQW4gYXJyYXkgY29udGFpbmluZyBmaWxlIG9yIGRpcmVjdG9yeSBuYW1lcywgb3INCiAgLy8gICAgICAgICAgICAgICAgIGEgc3RyaW5nIGNvbnRhaW5pbmcgb25lIGZpbGVuYW1lIG9yIGRpcmVjdG9yeSBuYW1lLCBvcg0KICAvLyAgICAgICAgICAgICAgICAgYSBzdHJpbmcgY29udGFpbmluZyBhIGxpc3Qgb2YgZmlsZW5hbWVzIGFuZC9vciBkaXJlY3RvcnkNCiAgLy8gICAgICAgICAgICAgICAgIG5hbWVzIHNlcGFyYXRlZCBieSBzcGFjZXMuDQogIC8vICAgJHBfYWRkX2RpciA6IFBhdGggdG8gYWRkIGluIHRoZSBmaWxlbmFtZSBwYXRoIGFyY2hpdmVkDQogIC8vICAgJHBfcmVtb3ZlX2RpciA6IFBhdGggdG8gcmVtb3ZlIGluIHRoZSBmaWxlbmFtZSBwYXRoIGFyY2hpdmVkDQogIC8vICAgJHBfbW9kZSA6ICd0YXInIG9yICd0Z3onLCBpZiBub3Qgc2V0LCB3aWxsIGJlIGRldGVybWluZWQgYnkgJHBfdGFybmFtZSBleHRlbnNpb24NCiAgLy8gUmV0dXJuIFZhbHVlcyA6DQogIC8vICAgMSBvbiBzdWNjZXNzLA0KICAvLyAgIE9yIGFuIGVycm9yIGNvZGUgKHNlZSBsaXN0IG9uIHRvcCkuDQogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQogIGZ1bmN0aW9uIFBjbFRhckFkZExpc3QoJHBfdGFybmFtZSwgJHBfZmlsZWxpc3QsICRwX2FkZF9kaXI9IiIsICRwX3JlbW92ZV9kaXI9IiIsICRwX21vZGU9IiIpDQogIHsNCiAgICBUckZjdFN0YXJ0KF9fRklMRV9fLCBfX0xJTkVfXywgIlBjbFRhckFkZExpc3QiLCAidGFyPSRwX3Rhcm5hbWUsIGZpbGU9JHBfZmlsZWxpc3QsIHBfYWRkX2Rpcj0nJHBfYWRkX2RpcicsIHBfcmVtb3ZlX2Rpcj0nJHBfcmVtb3ZlX2RpcicsIG1vZGU9JHBfbW9kZSIpOw0KICAgICR2X3Jlc3VsdD0xOw0KICAgICRwX2xpc3RfZGV0YWlsID0gYXJyYXkoKTsNCg0KICAgIC8vIC0tLS0tIEV4dHJhY3QgdGhlIHRhciBmb3JtYXQgZnJvbSB0aGUgZXh0ZW5zaW9uDQogICAgaWYgKCgkcF9tb2RlID09ICIiKSB8fCAoKCRwX21vZGUhPSJ0YXIiKSAmJiAoJHBfbW9kZSE9InRneiIpKSkNCiAgICB7DQogICAgICBpZiAoKCRwX21vZGUgPSBQY2xUYXJIYW5kbGVFeHRlbnNpb24oJHBfdGFybmFtZSkpID09ICIiKQ0KICAgICAgew0KICAgICAgICAvLyAtLS0tLSBSZXR1cm4NCiAgICAgICAgVHJGY3RFbmQoX19GSUxFX18sIF9fTElORV9fLCBQY2xFcnJvckNvZGUoKSwgUGNsRXJyb3JTdHJpbmcoKSk7DQogICAgICAgIHJldHVybiBQY2xFcnJvckNvZGUoKTsNCiAgICAgIH0NCiAgICB9DQoNCiAgICAvLyAtLS0tLSBMb29rIGlmIHRoZSAkcF9maWxlbGlzdCBpcyByZWFsbHkgYW4gYXJyYXkNCiAgICBpZiAoaXNfYXJyYXkoJHBfZmlsZWxpc3QpKQ0KICAgIHsNCiAgICAgIC8vIC0tLS0tIENhbGwgdGhlIGFkZCBmY3QNCiAgICAgICR2X3Jlc3VsdCA9IFBjbFRhckhhbmRsZUFwcGVuZCgkcF90YXJuYW1lLCAkcF9maWxlbGlzdCwgJHBfbW9kZSwgJHBfbGlzdF9kZXRhaWwsICRwX2FkZF9kaXIsICRwX3JlbW92ZV9kaXIpOw0KICAgIH0NCg0KICAgIC8vIC0tLS0tIExvb2sgaWYgdGhlICRwX2ZpbGVsaXN0IGlzIGEgc3RyaW5nDQogICAgZWxzZSBpZiAoaXNfc3RyaW5nKCRwX2ZpbGVsaXN0KSkNCiAgICB7DQogICAgICAvLyAtLS0tLSBDcmVhdGUgYSBsaXN0IHdpdGggdGhlIGVsZW1lbnRzIGZyb20gdGhlIHN0cmluZw0KICAgICAgJHZfbGlzdCA9IGV4cGxvZGUoIiAiLCAkcF9maWxlbGlzdCk7DQoNCiAgICAgIC8vIC0tLS0tIENhbGwgdGhlIGFkZCBmY3QNCiAgICAgICR2X3Jlc3VsdCA9IFBjbFRhckhhbmRsZUFwcGVuZCgkcF90YXJuYW1lLCAkdl9saXN0LCAkcF9tb2RlLCAkcF9saXN0X2RldGFpbCwgJHBfYWRkX2RpciwgJHBfcmVtb3ZlX2Rpcik7DQogICAgfQ0KDQogICAgLy8gLS0tLS0gSW52YWxpZCB2YXJpYWJsZQ0KICAgIGVsc2UNCiAgICB7DQogICAgICAvLyAtLS0tLSBFcnJvciBsb2cNCiAgICAgIFBjbEVycm9yTG9nKC0zLCAiSW52YWxpZCB2YXJpYWJsZSB0eXBlIHBfZmlsZWxpc3QiKTsNCiAgICAgICR2X3Jlc3VsdCA9IC0zOw0KICAgIH0NCg0KICAgIC8vIC0tLS0tIFJldHVybg0KICAgIGlmICgkdl9yZXN1bHQgIT0gMSkNCiAgICB7DQogICAgICBUckZjdEVuZChfX0ZJTEVfXywgX19MSU5FX18sIDApOw0KICAgICAgcmV0dXJuIDA7DQogICAgfQ0KICAgIFRyRmN0RW5kKF9fRklMRV9fLCBfX0xJTkVfXywgJHBfbGlzdF9kZXRhaWwpOw0KICAgIHJldHVybiAkcF9saXN0X2RldGFpbDsNCiAgfQ0KICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KDQogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQogIC8vIEZ1bmN0aW9uIDogUGNsVGFyTGlzdCgpDQogIC8vIERlc2NyaXB0aW9uIDoNCiAgLy8gICBHaXZlcyB0aGUgbGlzdCBvZiBhbGwgdGhlIGZpbGVzIHByZXNlbnQgaW4gdGhlIHRhciBhcmNoaXZlICRwX3Rhcm5hbWUuDQogIC8vICAgVGhlIGxpc3QgaXMgdGhlIGZ1bmN0aW9uIHJlc3VsdCwgaXQgd2lsbCBiZSAwIG9uIGVycm9yLg0KICAvLyAgIERlcGVuZGluZyBvbiB0aGUgJHBfdGFybmFtZSBleHRlbnNpb24gKC50YXIsIC50YXIuZ3ogb3IgLnRneikgdGhlDQogIC8vICAgZnVuY3Rpb24gd2lsbCBkZXRlcm1pbmUgdGhlIHR5cGUgb2YgdGhlIGFyY2hpdmUuDQogIC8vIFBhcmFtZXRlcnMgOg0KICAvLyAgICRwX3Rhcm5hbWUgOiBOYW1lIG9mIGFuIGV4aXN0aW5nIHRhciBmaWxlDQogIC8vICAgJHBfbW9kZSA6ICd0YXInIG9yICd0Z3onLCBpZiBub3Qgc2V0LCB3aWxsIGJlIGRldGVybWluZWQgYnkgJHBfdGFybmFtZSBleHRlbnNpb24NCiAgLy8gUmV0dXJuIFZhbHVlcyA6DQogIC8vICAwIG9uIGVycm9yIChVc2UgUGNsRXJyb3JDb2RlKCkgYW5kIFBjbEVycm9yU3RyaW5nKCkgZm9yIG1vcmUgaW5mbykNCiAgLy8gIG9yDQogIC8vICBBbiBhcnJheSBjb250YWluaW5nIGZpbGUgcHJvcGVydGllcy4gRWFjaCBmaWxlIHByb3BlcnRpZXMgaXMgYW4gYXJyYXkgb2YNCiAgLy8gIHByb3BlcnRpZXMuDQogIC8vICBUaGUgcHJvcGVydGllcyAoYXJyYXkgZmllbGQgbmFtZXMpIGFyZSA6DQogIC8vICAgIGZpbGVuYW1lLCBzaXplLCBtb2RlLCB1aWQsIGdpZCwgbXRpbWUsIHR5cGVmbGFnLCBzdGF0dXMNCiAgLy8gIEV4ZW1wbGUgOiAkdl9saXN0ID0gUGNsVGFyTGlzdCgibXkudGFyIik7DQogIC8vICAgICAgICAgICAgZm9yICgkaT0wOyAkaTxzaXplb2YoJHZfbGlzdCk7ICRpKyspDQogIC8vICAgICAgICAgICAgICBlY2hvICJGaWxlbmFtZSA6JyIuJHZfbGlzdFskaV1bZmlsZW5hbWVdLiInPGJyPiI7DQogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQogIGZ1bmN0aW9uIFBjbFRhckxpc3QoJHBfdGFybmFtZSwgJHBfbW9kZT0iIikNCiAgew0KICAgIFRyRmN0U3RhcnQoX19GSUxFX18sIF9fTElORV9fLCAiUGNsVGFyTGlzdCIsICJ0YXI9JHBfdGFybmFtZSwgbW9kZT0nJHBfbW9kZSciKTsNCiAgICAkdl9yZXN1bHQ9MTsNCg0KICAgIC8vIC0tLS0tIEV4dHJhY3QgdGhlIHRhciBmb3JtYXQgZnJvbSB0aGUgZXh0ZW5zaW9uDQogICAgaWYgKCgkcF9tb2RlID09ICIiKSB8fCAoKCRwX21vZGUhPSJ0YXIiKSAmJiAoJHBfbW9kZSE9InRneiIpKSkNCiAgICB7DQogICAgICBpZiAoKCRwX21vZGUgPSBQY2xUYXJIYW5kbGVFeHRlbnNpb24oJHBfdGFybmFtZSkpID09ICIiKQ0KICAgICAgew0KICAgICAgICAvLyAtLS0tLSBSZXR1cm4NCiAgICAgICAgVHJGY3RFbmQoX19GSUxFX18sIF9fTElORV9fLCBQY2xFcnJvckNvZGUoKSwgUGNsRXJyb3JTdHJpbmcoKSk7DQogICAgICAgIHJldHVybiAwOw0KICAgICAgfQ0KICAgIH0NCg0KICAgIC8vIC0tLS0tIENhbGwgdGhlIGV4dHJhY3RpbmcgZmN0DQogICAgJHBfbGlzdCA9IGFycmF5KCk7DQogICAgaWYgKCgkdl9yZXN1bHQgPSBQY2xUYXJIYW5kbGVFeHRyYWN0KCRwX3Rhcm5hbWUsIDAsICRwX2xpc3QsICJsaXN0IiwgIiIsICRwX21vZGUsICIiKSkgIT0gMSkNCiAgICB7DQogICAgICB1bnNldCgkcF9saXN0KTsNCiAgICAgIFRyRmN0RW5kKF9fRklMRV9fLCBfX0xJTkVfXywgMCwgUGNsRXJyb3JTdHJpbmcoKSk7DQogICAgICByZXR1cm4oMCk7DQogICAgfQ0KDQogICAgLy8gLS0tLS0gUmV0dXJuDQogICAgVHJGY3RFbmQoX19GSUxFX18sIF9fTElORV9fLCAkcF9saXN0KTsNCiAgICByZXR1cm4gJHBfbGlzdDsNCiAgfQ0KICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KDQogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQogIC8vIEZ1bmN0aW9uIDogUGNsVGFyRXh0cmFjdCgpDQogIC8vIERlc2NyaXB0aW9uIDoNCiAgLy8gICBFeHRyYWN0IGFsbCB0aGUgZmlsZXMgcHJlc2VudCBpbiB0aGUgYXJjaGl2ZSAkcF90YXJuYW1lLCBpbiB0aGUgZGlyZWN0b3J5DQogIC8vICAgJHBfcGF0aC4gVGhlIHJlbGF0aXZlIHBhdGggb2YgdGhlIGFyY2hpdmVkIGZpbGVzIGFyZSBrZWVwIGFuZCBiZWNvbWUNCiAgLy8gICByZWxhdGl2ZSB0byAkcF9wYXRoLg0KICAvLyAgIElmIGEgZmlsZSB3aXRoIHRoZSBzYW1lIG5hbWUgYWxyZWFkeSBleGlzdHMgaXQgd2lsbCBiZSByZXBsYWNlZC4NCiAgLy8gICBJZiB0aGUgcGF0aCB0byB0aGUgZmlsZSBkb2VzIG5vdCBleGlzdCwgaXQgd2lsbCBiZSBjcmVhdGVkLg0KICAvLyAgIERlcGVuZGluZyBvbiB0aGUgJHBfdGFybmFtZSBleHRlbnNpb24gKC50YXIsIC50YXIuZ3ogb3IgLnRneikgdGhlDQogIC8vICAgZnVuY3Rpb24gd2lsbCBkZXRlcm1pbmUgdGhlIHR5cGUgb2YgdGhlIGFyY2hpdmUuDQogIC8vIFBhcmFtZXRlcnMgOg0KICAvLyAgICRwX3Rhcm5hbWUgOiBOYW1lIG9mIGFuIGV4aXN0aW5nIHRhciBmaWxlLg0KICAvLyAgICRwX3BhdGggOiBQYXRoIHdoZXJlIHRoZSBmaWxlcyB3aWxsIGJlIGV4dHJhY3RlZC4gVGhlIGZpbGVzIHdpbGwgdXNlDQogIC8vICAgICAgICAgICAgIHRoZWlyIG1lbW9yaXplZCBwYXRoIGZyb20gJHBfcGF0aC4NCiAgLy8gICAgICAgICAgICAgSWYgJHBfcGF0aCBpcyAiIiwgZmlsZXMgd2lsbCBiZSBleHRyYWN0ZWQgaW4gIi4vIi4NCiAgLy8gICAkcF9yZW1vdmVfcGF0aCA6IFBhdGggdG8gcmVtb3ZlIChmcm9tIHRoZSBmaWxlIG1lbW9yaXplZCBwYXRoKSB3aGlsZSB3cml0aW5nIHRoZQ0KICAvLyAgICAgICAgICAgICAgICAgICAgZXh0cmFjdGVkIGZpbGVzLiBJZiB0aGUgcGF0aCBkb2VzIG5vdCBtYXRjaCB0aGUgZmlsZSBwYXRoLA0KICAvLyAgICAgICAgICAgICAgICAgICAgdGhlIGZpbGUgaXMgZXh0cmFjdGVkIHdpdGggaXRzIG1lbW9yaXplZCBwYXRoLg0KICAvLyAgICAgICAgICAgICAgICAgICAgJHBfcGF0aCBhbmQgJHBfcmVtb3ZlX3BhdGggYXJlIGNvbW11bGF0aXZlLg0KICAvLyAgICRwX21vZGUgOiAndGFyJyBvciAndGd6JywgaWYgbm90IHNldCwgd2lsbCBiZSBkZXRlcm1pbmVkIGJ5ICRwX3Rhcm5hbWUgZXh0ZW5zaW9uDQogIC8vIFJldHVybiBWYWx1ZXMgOg0KICAvLyAgIFNhbWUgYXMgUGNsVGFyTGlzdCgpDQogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQogIGZ1bmN0aW9uIFBjbFRhckV4dHJhY3QoJHBfdGFybmFtZSwgJHBfcGF0aD0iLi8iLCAkcF9yZW1vdmVfcGF0aD0iIiwgJHBfbW9kZT0iIikNCiAgew0KICAgIFRyRmN0U3RhcnQoX19GSUxFX18sIF9fTElORV9fLCAiUGNsVGFyRXh0cmFjdCIsICJ0YXI9JyRwX3Rhcm5hbWUnLCBwYXRoPSckcF9wYXRoJywgcmVtb3ZlX3BhdGg9JyRwX3JlbW92ZV9wYXRoJywgbW9kZT0nJHBfbW9kZSciKTsNCiAgICAkdl9yZXN1bHQ9MTsNCg0KICAgIC8vIC0tLS0tIEV4dHJhY3QgdGhlIHRhciBmb3JtYXQgZnJvbSB0aGUgZXh0ZW5zaW9uDQogICAgaWYgKCgkcF9tb2RlID09ICIiKSB8fCAoKCRwX21vZGUhPSJ0YXIiKSAmJiAoJHBfbW9kZSE9InRneiIpKSkNCiAgICB7DQogICAgICBpZiAoKCRwX21vZGUgPSBQY2xUYXJIYW5kbGVFeHRlbnNpb24oJHBfdGFybmFtZSkpID09ICIiKQ0KICAgICAgew0KICAgICAgICAvLyAtLS0tLSBSZXR1cm4NCiAgICAgICAgVHJGY3RFbmQoX19GSUxFX18sIF9fTElORV9fLCBQY2xFcnJvckNvZGUoKSwgUGNsRXJyb3JTdHJpbmcoKSk7DQogICAgICAgIHJldHVybiAwOw0KICAgICAgfQ0KICAgIH0NCg0KICAgIC8vIC0tLS0tIENhbGwgdGhlIGV4dHJhY3RpbmcgZmN0DQogICAgaWYgKCgkdl9yZXN1bHQgPSBQY2xUYXJIYW5kbGVFeHRyYWN0KCRwX3Rhcm5hbWUsIDAsICRwX2xpc3QsICJjb21wbGV0ZSIsICRwX3BhdGgsICR2X3Rhcl9tb2RlLCAkcF9yZW1vdmVfcGF0aCkpICE9IDEpDQogICAgew0KICAgICAgVHJGY3RFbmQoX19GSUxFX18sIF9fTElORV9fLCAwLCBQY2xFcnJvclN0cmluZygpKTsNCiAgICAgIHJldHVybigwKTsNCiAgICB9DQoNCiAgICAvLyAtLS0tLSBSZXR1cm4NCiAgICBUckZjdEVuZChfX0ZJTEVfXywgX19MSU5FX18sICRwX2xpc3QpOw0KICAgIHJldHVybiAkcF9saXN0Ow0KICB9DQogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiAgLy8gRnVuY3Rpb24gOiBQY2xUYXJFeHRyYWN0TGlzdCgpDQogIC8vIERlc2NyaXB0aW9uIDoNCiAgLy8gICBFeHRyYWN0IHRoZSBmaWxlcyBwcmVzZW50IGluIHRoZSBhcmNoaXZlICRwX3Rhcm5hbWUgYW5kIHNwZWNpZmllZCBpbg0KICAvLyAgICRwX2ZpbGVsaXN0LCBpbiB0aGUgZGlyZWN0b3J5DQogIC8vICAgJHBfcGF0aC4gVGhlIHJlbGF0aXZlIHBhdGggb2YgdGhlIGFyY2hpdmVkIGZpbGVzIGFyZSBrZWVwIGFuZCBiZWNvbWUNCiAgLy8gICByZWxhdGl2ZSB0byAkcF9wYXRoLg0KICAvLyAgIElmIGEgZGlyZWN0b3J5IGlzIHNw77+9Y2lmaWVkIGluIHRoZSBsaXN0LCBhbGwgdGhlIGZpbGVzIGZyb20gdGhpcyBkaXJlY3RvcnkNCiAgLy8gICB3aWxsIGJlIGV4dHJhY3RlZC4NCiAgLy8gICBJZiBhIGZpbGUgd2l0aCB0aGUgc2FtZSBuYW1lIGFscmVhZHkgZXhpc3RzIGl0IHdpbGwgYmUgcmVwbGFjZWQuDQogIC8vICAgSWYgdGhlIHBhdGggdG8gdGhlIGZpbGUgZG9lcyBub3QgZXhpc3QsIGl0IHdpbGwgYmUgY3JlYXRlZC4NCiAgLy8gICBEZXBlbmRpbmcgb24gdGhlICRwX3Rhcm5hbWUgZXh0ZW5zaW9uICgudGFyLCAudGFyLmd6IG9yIC50Z3opIHRoZQ0KICAvLyAgIGZ1bmN0aW9uIHdpbGwgZGV0ZXJtaW5lIHRoZSB0eXBlIG9mIHRoZSBhcmNoaXZlLg0KICAvLyBQYXJhbWV0ZXJzIDoNCiAgLy8gICAkcF90YXJuYW1lIDogTmFtZSBvZiBhbiBleGlzdGluZyB0YXIgZmlsZQ0KICAvLyAgICRwX2ZpbGVsaXN0IDogQW4gYXJyYXkgY29udGFpbmluZyBmaWxlIG9yIGRpcmVjdG9yeSBuYW1lcywgb3INCiAgLy8gICAgICAgICAgICAgICAgIGEgc3RyaW5nIGNvbnRhaW5pbmcgb25lIGZpbGVuYW1lIG9yIGRpcmVjdG9yeSBuYW1lLCBvcg0KICAvLyAgICAgICAgICAgICAgICAgYSBzdHJpbmcgY29udGFpbmluZyBhIGxpc3Qgb2YgZmlsZW5hbWVzIGFuZC9vciBkaXJlY3RvcnkNCiAgLy8gICAgICAgICAgICAgICAgIG5hbWVzIHNlcGFyYXRlZCBieSBzcGFjZXMuDQogIC8vICAgJHBfcGF0aCA6IFBhdGggd2hlcmUgdGhlIGZpbGVzIHdpbGwgYmUgZXh0cmFjdGVkLiBUaGUgZmlsZXMgd2lsbCB1c2UNCiAgLy8gICAgICAgICAgICAgdGhlaXIgbWVtb3JpemVkIHBhdGggZnJvbSAkcF9wYXRoLg0KICAvLyAgICAgICAgICAgICBJZiAkcF9wYXRoIGlzICIiLCBmaWxlcyB3aWxsIGJlIGV4dHJhY3RlZCBpbiAiLi8iLg0KICAvLyAgICRwX3JlbW92ZV9wYXRoIDogUGF0aCB0byByZW1vdmUgKGZyb20gdGhlIGZpbGUgbWVtb3JpemVkIHBhdGgpIHdoaWxlIHdyaXRpbmcgdGhlDQogIC8vICAgICAgICAgICAgICAgICAgICBleHRyYWN0ZWQgZmlsZXMuIElmIHRoZSBwYXRoIGRvZXMgbm90IG1hdGNoIHRoZSBmaWxlIHBhdGgsDQogIC8vICAgICAgICAgICAgICAgICAgICB0aGUgZmlsZSBpcyBleHRyYWN0ZWQgd2l0aCBpdHMgbWVtb3JpemVkIHBhdGguDQogIC8vICAgICAgICAgICAgICAgICAgICAkcF9wYXRoIGFuZCAkcF9yZW1vdmVfcGF0aCBhcmUgY29tbXVsYXRpdmUuDQogIC8vICAgJHBfbW9kZSA6ICd0YXInIG9yICd0Z3onLCBpZiBub3Qgc2V0LCB3aWxsIGJlIGRldGVybWluZWQgYnkgJHBfdGFybmFtZSBleHRlbnNpb24NCiAgLy8gUmV0dXJuIFZhbHVlcyA6DQogIC8vICAgU2FtZSBhcyBQY2xUYXJMaXN0KCkNCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiAgZnVuY3Rpb24gUGNsVGFyRXh0cmFjdExpc3QoJHBfdGFybmFtZSwgJHBfZmlsZWxpc3QsICRwX3BhdGg9Ii4vIiwgJHBfcmVtb3ZlX3BhdGg9IiIsICRwX21vZGU9IiIpDQogIHsNCiAgICBUckZjdFN0YXJ0KF9fRklMRV9fLCBfX0xJTkVfXywgIlBjbFRhckV4dHJhY3RMaXN0IiwgInRhcj0kcF90YXJuYW1lLCBsaXN0LCBwYXRoPSRwX3BhdGgsIHJlbW92ZV9wYXRoPSckcF9yZW1vdmVfcGF0aCcsIG1vZGU9JyRwX21vZGUnIik7DQogICAgJHZfcmVzdWx0PTE7DQoNCiAgICAvLyAtLS0tLSBFeHRyYWN0IHRoZSB0YXIgZm9ybWF0IGZyb20gdGhlIGV4dGVuc2lvbg0KICAgIGlmICgoJHBfbW9kZSA9PSAiIikgfHwgKCgkcF9tb2RlIT0idGFyIikgJiYgKCRwX21vZGUhPSJ0Z3oiKSkpDQogICAgew0KICAgICAgaWYgKCgkcF9tb2RlID0gUGNsVGFySGFuZGxlRXh0ZW5zaW9uKCRwX3Rhcm5hbWUpKSA9PSAiIikNCiAgICAgIHsNCiAgICAgICAgLy8gLS0tLS0gUmV0dXJuDQogICAgICAgIFRyRmN0RW5kKF9fRklMRV9fLCBfX0xJTkVfXywgUGNsRXJyb3JDb2RlKCksIFBjbEVycm9yU3RyaW5nKCkpOw0KICAgICAgICByZXR1cm4gMDsNCiAgICAgIH0NCiAgICB9DQoNCiAgICAvLyAtLS0tLSBMb29rIGlmIHRoZSAkcF9maWxlbGlzdCBpcyByZWFsbHkgYW4gYXJyYXkNCiAgICBpZiAoaXNfYXJyYXkoJHBfZmlsZWxpc3QpKQ0KICAgIHsNCiAgICAgIC8vIC0tLS0tIENhbGwgdGhlIGV4dHJhY3RpbmcgZmN0DQogICAgICBpZiAoKCR2X3Jlc3VsdCA9IFBjbFRhckhhbmRsZUV4dHJhY3QoJHBfdGFybmFtZSwgJHBfZmlsZWxpc3QsICRwX2xpc3QsICJwYXJ0aWFsIiwgJHBfcGF0aCwgJHZfdGFyX21vZGUsICRwX3JlbW92ZV9wYXRoKSkgIT0gMSkNCiAgICAgIHsNCiAgICAgICAgVHJGY3RFbmQoX19GSUxFX18sIF9fTElORV9fLCAwLCBQY2xFcnJvclN0cmluZygpKTsNCiAgICAgICAgcmV0dXJuKDApOw0KICAgICAgfQ0KICAgIH0NCg0KICAgIC8vIC0tLS0tIExvb2sgaWYgdGhlICRwX2ZpbGVsaXN0IGlzIGEgc3RyaW5nDQogICAgZWxzZSBpZiAoaXNfc3RyaW5nKCRwX2ZpbGVsaXN0KSkNCiAgICB7DQogICAgICAvLyAtLS0tLSBDcmVhdGUgYSBsaXN0IHdpdGggdGhlIGVsZW1lbnRzIGZyb20gdGhlIHN0cmluZw0KICAgICAgJHZfbGlzdCA9IGV4cGxvZGUoIiAiLCAkcF9maWxlbGlzdCk7DQoNCiAgICAgIC8vIC0tLS0tIENhbGwgdGhlIGV4dHJhY3RpbmcgZmN0DQogICAgICBpZiAoKCR2X3Jlc3VsdCA9IFBjbFRhckhhbmRsZUV4dHJhY3QoJHBfdGFybmFtZSwgJHZfbGlzdCwgJHBfbGlzdCwgInBhcnRpYWwiLCAkcF9wYXRoLCAkdl90YXJfbW9kZSwgJHBfcmVtb3ZlX3BhdGgpKSAhPSAxKQ0KICAgICAgew0KICAgICAgICBUckZjdEVuZChfX0ZJTEVfXywgX19MSU5FX18sIDAsIFBjbEVycm9yU3RyaW5nKCkpOw0KICAgICAgICByZXR1cm4oMCk7DQogICAgICB9DQogICAgfQ0KDQogICAgLy8gLS0tLS0gSW52YWxpZCB2YXJpYWJsZQ0KICAgIGVsc2UNCiAgICB7DQogICAgICAvLyAtLS0tLSBFcnJvciBsb2cNCiAgICAgIFBjbEVycm9yTG9nKC0zLCAiSW52YWxpZCB2YXJpYWJsZSB0eXBlIHBfZmlsZWxpc3QiKTsNCg0KICAgICAgLy8gLS0tLS0gUmV0dXJuDQogICAgICBUckZjdEVuZChfX0ZJTEVfXywgX19MSU5FX18sIFBjbEVycm9yQ29kZSgpLCBQY2xFcnJvclN0cmluZygpKTsNCiAgICAgIHJldHVybiAwOw0KICAgIH0NCg0KICAgIC8vIC0tLS0tIFJldHVybg0KICAgIFRyRmN0RW5kKF9fRklMRV9fLCBfX0xJTkVfXywgJHBfbGlzdCk7DQogICAgcmV0dXJuICRwX2xpc3Q7DQogIH0NCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KICAvLyBGdW5jdGlvbiA6IFBjbFRhckV4dHJhY3RJbmRleCgpDQogIC8vIERlc2NyaXB0aW9uIDoNCiAgLy8gICBFeHRyYWN0IHRoZSBmaWxlcyBwcmVzZW50IGluIHRoZSBhcmNoaXZlICRwX3Rhcm5hbWUgYW5kIHNwZWNpZmllZCBhdA0KICAvLyAgIHRoZSBpbmRleGVzIGluICRwX2luZGV4LCBpbiB0aGUgZGlyZWN0b3J5DQogIC8vICAgJHBfcGF0aC4gVGhlIHJlbGF0aXZlIHBhdGggb2YgdGhlIGFyY2hpdmVkIGZpbGVzIGFyZSBrZWVwIGFuZCBiZWNvbWUNCiAgLy8gICByZWxhdGl2ZSB0byAkcF9wYXRoLg0KICAvLyAgIElmIGEgZGlyZWN0b3J5IGlzIHNwZWNpZmllZCBpbiB0aGUgbGlzdCwgdGhlIGRpcmVjdG9yeSBvbmx5IGlzIGNyZWF0ZWQuIEFsbA0KICAvLyAgIHRoZSBmaWxlIHN0b3JlZCBpbiB0aGlzIGFyY2hpdmUgZm9yIHRoaXMgZGlyZWN0b3J5DQogIC8vICAgYXJlIG5vdCBleHRyYWN0ZWQuDQogIC8vICAgSWYgYSBmaWxlIHdpdGggdGhlIHNhbWUgbmFtZSBhbHJlYWR5IGV4aXN0cyBpdCB3aWxsIGJlIHJlcGxhY2VkLg0KICAvLyAgIElmIHRoZSBwYXRoIHRvIHRoZSBmaWxlIGRvZXMgbm90IGV4aXN0LCBpdCB3aWxsIGJlIGNyZWF0ZWQuDQogIC8vICAgRGVwZW5kaW5nIG9uIHRoZSAkcF90YXJuYW1lIGV4dGVuc2lvbiAoLnRhciwgLnRhci5neiBvciAudGd6KSB0aGUNCiAgLy8gICBmdW5jdGlvbiB3aWxsIGRldGVybWluZSB0aGUgdHlwZSBvZiB0aGUgYXJjaGl2ZS4NCiAgLy8gUGFyYW1ldGVycyA6DQogIC8vICAgJHBfdGFybmFtZSA6IE5hbWUgb2YgYW4gZXhpc3RpbmcgdGFyIGZpbGUNCiAgLy8gICAkcF9pbmRleCA6IEEgc2luZ2xlIGluZGV4IChpbnRlZ2VyKSBvciBhIHN0cmluZyBvZiBpbmRleGVzIG9mIGZpbGVzIHRvDQogIC8vICAgICAgICAgICAgICBleHRyYWN0LiBUaGUgZm9ybSBvZiB0aGUgc3RyaW5nIGlzICIwLDQtNiw4LTEyIiB3aXRoIG9ubHkgbnVtYmVycw0KICAvLyAgICAgICAgICAgICAgYW5kICctJyBmb3IgcmFuZ2Ugb3IgJywnIHRvIHNlcGFyYXRlIHJhbmdlcy4gTm8gc3BhY2VzIG9yICc7Jw0KICAvLyAgICAgICAgICAgICAgYXJlIGFsbG93ZWQuDQogIC8vICAgJHBfcGF0aCA6IFBhdGggd2hlcmUgdGhlIGZpbGVzIHdpbGwgYmUgZXh0cmFjdGVkLiBUaGUgZmlsZXMgd2lsbCB1c2UNCiAgLy8gICAgICAgICAgICAgdGhlaXIgbWVtb3JpemVkIHBhdGggZnJvbSAkcF9wYXRoLg0KICAvLyAgICAgICAgICAgICBJZiAkcF9wYXRoIGlzICIiLCBmaWxlcyB3aWxsIGJlIGV4dHJhY3RlZCBpbiAiLi8iLg0KICAvLyAgICRwX3JlbW92ZV9wYXRoIDogUGF0aCB0byByZW1vdmUgKGZyb20gdGhlIGZpbGUgbWVtb3JpemVkIHBhdGgpIHdoaWxlIHdyaXRpbmcgdGhlDQogIC8vICAgICAgICAgICAgICAgICAgICBleHRyYWN0ZWQgZmlsZXMuIElmIHRoZSBwYXRoIGRvZXMgbm90IG1hdGNoIHRoZSBmaWxlIHBhdGgsDQogIC8vICAgICAgICAgICAgICAgICAgICB0aGUgZmlsZSBpcyBleHRyYWN0ZWQgd2l0aCBpdHMgbWVtb3JpemVkIHBhdGguDQogIC8vICAgICAgICAgICAgICAgICAgICAkcF9wYXRoIGFuZCAkcF9yZW1vdmVfcGF0aCBhcmUgY29tbXVsYXRpdmUuDQogIC8vICAgJHBfbW9kZSA6ICd0YXInIG9yICd0Z3onLCBpZiBub3Qgc2V0LCB3aWxsIGJlIGRldGVybWluZWQgYnkgJHBfdGFybmFtZSBleHRlbnNpb24NCiAgLy8gUmV0dXJuIFZhbHVlcyA6DQogIC8vICAgU2FtZSBhcyBQY2xUYXJMaXN0KCkNCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiAgZnVuY3Rpb24gUGNsVGFyRXh0cmFjdEluZGV4KCRwX3Rhcm5hbWUsICRwX2luZGV4LCAkcF9wYXRoPSIuLyIsICRwX3JlbW92ZV9wYXRoPSIiLCAkcF9tb2RlPSIiKQ0KICB7DQogICAgVHJGY3RTdGFydChfX0ZJTEVfXywgX19MSU5FX18sICJQY2xUYXJFeHRyYWN0SW5kZXgiLCAidGFyPSRwX3Rhcm5hbWUsIGluZGV4PSckcF9pbmRleCcsIHBhdGg9JHBfcGF0aCwgcmVtb3ZlX3BhdGg9JyRwX3JlbW92ZV9wYXRoJywgbW9kZT0nJHBfbW9kZSciKTsNCiAgICAkdl9yZXN1bHQ9MTsNCg0KICAgIC8vIC0tLS0tIEV4dHJhY3QgdGhlIHRhciBmb3JtYXQgZnJvbSB0aGUgZXh0ZW5zaW9uDQogICAgaWYgKCgkcF9tb2RlID09ICIiKSB8fCAoKCRwX21vZGUhPSJ0YXIiKSAmJiAoJHBfbW9kZSE9InRneiIpKSkNCiAgICB7DQogICAgICBpZiAoKCRwX21vZGUgPSBQY2xUYXJIYW5kbGVFeHRlbnNpb24oJHBfdGFybmFtZSkpID09ICIiKQ0KICAgICAgew0KICAgICAgICAvLyAtLS0tLSBSZXR1cm4NCiAgICAgICAgVHJGY3RFbmQoX19GSUxFX18sIF9fTElORV9fLCBQY2xFcnJvckNvZGUoKSwgUGNsRXJyb3JTdHJpbmcoKSk7DQogICAgICAgIHJldHVybiAwOw0KICAgICAgfQ0KICAgIH0NCg0KICAgIC8vIC0tLS0tIExvb2sgaWYgdGhlICRwX2luZGV4IGlzIHJlYWxseSBhbiBpbnRlZ2VyDQogICAgaWYgKGlzX2ludGVnZXIoJHBfaW5kZXgpKQ0KICAgIHsNCiAgICAgIC8vIC0tLS0tIENhbGwgdGhlIGV4dHJhY3RpbmcgZmN0DQogICAgICBpZiAoKCR2X3Jlc3VsdCA9IFBjbFRhckhhbmRsZUV4dHJhY3RCeUluZGV4TGlzdCgkcF90YXJuYW1lLCAiJHBfaW5kZXgiLCAkcF9saXN0LCAkcF9wYXRoLCAkcF9yZW1vdmVfcGF0aCwgJHZfdGFyX21vZGUpKSAhPSAxKQ0KICAgICAgew0KICAgICAgICBUckZjdEVuZChfX0ZJTEVfXywgX19MSU5FX18sIDAsIFBjbEVycm9yU3RyaW5nKCkpOw0KICAgICAgICByZXR1cm4oMCk7DQogICAgICB9DQogICAgfQ0KDQogICAgLy8gLS0tLS0gTG9vayBpZiB0aGUgJHBfZmlsZWxpc3QgaXMgYSBzdHJpbmcNCiAgICBlbHNlIGlmIChpc19zdHJpbmcoJHBfaW5kZXgpKQ0KICAgIHsNCiAgICAgIC8vIC0tLS0tIENhbGwgdGhlIGV4dHJhY3RpbmcgZmN0DQogICAgICBpZiAoKCR2X3Jlc3VsdCA9IFBjbFRhckhhbmRsZUV4dHJhY3RCeUluZGV4TGlzdCgkcF90YXJuYW1lLCAkcF9pbmRleCwgJHBfbGlzdCwgJHBfcGF0aCwgJHBfcmVtb3ZlX3BhdGgsICR2X3Rhcl9tb2RlKSkgIT0gMSkNCiAgICAgIHsNCiAgICAgICAgVHJGY3RFbmQoX19GSUxFX18sIF9fTElORV9fLCAwLCBQY2xFcnJvclN0cmluZygpKTsNCiAgICAgICAgcmV0dXJuKDApOw0KICAgICAgfQ0KICAgIH0NCg0KICAgIC8vIC0tLS0tIEludmFsaWQgdmFyaWFibGUNCiAgICBlbHNlDQogICAgew0KICAgICAgLy8gLS0tLS0gRXJyb3IgbG9nDQogICAgICBQY2xFcnJvckxvZygtMywgIkludmFsaWQgdmFyaWFibGUgdHlwZSAkcF9pbmRleCIpOw0KDQogICAgICAvLyAtLS0tLSBSZXR1cm4NCiAgICAgIFRyRmN0RW5kKF9fRklMRV9fLCBfX0xJTkVfXywgUGNsRXJyb3JDb2RlKCksIFBjbEVycm9yU3RyaW5nKCkpOw0KICAgICAgcmV0dXJuIDA7DQogICAgfQ0KDQogICAgLy8gLS0tLS0gUmV0dXJuDQogICAgVHJGY3RFbmQoX19GSUxFX18sIF9fTElORV9fLCAkcF9saXN0KTsNCiAgICByZXR1cm4gJHBfbGlzdDsNCiAgfQ0KICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KDQogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQogIC8vIEZ1bmN0aW9uIDogUGNsVGFyRGVsZXRlKCkNCiAgLy8gRGVzY3JpcHRpb24gOg0KICAvLyAgIFRoaXMgZnVuY3Rpb24gZGVsZXRlcyBmcm9tIHRoZSBhcmNoaXZlICRwX3Rhcm5hbWUgdGhlIGZpbGVzIHdoaWNoIGFyZSBsaXN0ZWQNCiAgLy8gICBpbiAkcF9maWxlbGlzdC4gJHBfZmlsZWxpc3QgY2FuIGJlIGEgc3RyaW5nIHdpdGggZmlsZSBuYW1lcyBzZXBhcmF0ZWQgYnkNCiAgLy8gICBzcGFjZXMsIG9yIGFuIGFycmF5IGNvbnRhaW5pbmcgdGhlIGZpbGUgbmFtZXMuDQogIC8vIFBhcmFtZXRlcnMgOg0KICAvLyAgICRwX3Rhcm5hbWUgOiBOYW1lIG9mIGFuIGV4aXN0aW5nIHRhciBmaWxlDQogIC8vICAgJHBfZmlsZWxpc3QgOiBBbiBhcnJheSBvciBhIHN0cmluZyBjb250YWluaW5nIGZpbGUgbmFtZXMgdG8gcmVtb3ZlIGZyb20gdGhlDQogIC8vICAgICAgICAgICAgICAgICBhcmNoaXZlLg0KICAvLyAgICRwX21vZGUgOiAndGFyJyBvciAndGd6JywgaWYgbm90IHNldCwgd2lsbCBiZSBkZXRlcm1pbmVkIGJ5ICRwX3Rhcm5hbWUgZXh0ZW5zaW9uDQogIC8vIFJldHVybiBWYWx1ZXMgOg0KICAvLyAgIExpc3Qgb2YgdGhlIGZpbGVzIHdoaWNoIGFyZSBrZXB0IGluIHRoZSBhcmNoaXZlIChzYW1lIGZvcm1hdCBhcyBQY2xUYXJMaXN0KCkpDQogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQogIGZ1bmN0aW9uIFBjbFRhckRlbGV0ZSgkcF90YXJuYW1lLCAkcF9maWxlbGlzdCwgJHBfbW9kZT0iIikNCiAgew0KICAgIFRyRmN0U3RhcnQoX19GSUxFX18sIF9fTElORV9fLCAiUGNsVGFyRGVsZXRlIiwgInRhcj0nJHBfdGFybmFtZScsIGxpc3Q9JyRwX2ZpbGVsaXN0JywgbW9kZT0nJHBfbW9kZSciKTsNCiAgICAkdl9yZXN1bHQ9MTsNCg0KICAgIC8vIC0tLS0tIEV4dHJhY3QgdGhlIHRhciBmb3JtYXQgZnJvbSB0aGUgZXh0ZW5zaW9uDQogICAgaWYgKCgkcF9tb2RlID09ICIiKSB8fCAoKCRwX21vZGUhPSJ0YXIiKSAmJiAoJHBfbW9kZSE9InRneiIpKSkNCiAgICB7DQogICAgICBpZiAoKCRwX21vZGUgPSBQY2xUYXJIYW5kbGVFeHRlbnNpb24oJHBfdGFybmFtZSkpID09ICIiKQ0KICAgICAgew0KICAgICAgICAvLyAtLS0tLSBSZXR1cm4NCiAgICAgICAgVHJGY3RFbmQoX19GSUxFX18sIF9fTElORV9fLCBQY2xFcnJvckNvZGUoKSwgUGNsRXJyb3JTdHJpbmcoKSk7DQogICAgICAgIHJldHVybiAwOw0KICAgICAgfQ0KICAgIH0NCg0KICAgIC8vIC0tLS0tIExvb2sgaWYgdGhlICRwX2ZpbGVsaXN0IGlzIHJlYWxseSBhbiBhcnJheQ0KICAgIGlmIChpc19hcnJheSgkcF9maWxlbGlzdCkpDQogICAgew0KICAgICAgLy8gLS0tLS0gQ2FsbCB0aGUgZXh0cmFjdGluZyBmY3QNCiAgICAgIGlmICgoJHZfcmVzdWx0ID0gUGNsVGFySGFuZGxlRGVsZXRlKCRwX3Rhcm5hbWUsICRwX2ZpbGVsaXN0LCAkcF9saXN0LCAkcF9tb2RlKSkgIT0gMSkNCiAgICAgIHsNCiAgICAgICAgVHJGY3RFbmQoX19GSUxFX18sIF9fTElORV9fLCAwLCBQY2xFcnJvclN0cmluZygpKTsNCiAgICAgICAgcmV0dXJuKDApOw0KICAgICAgfQ0KICAgIH0NCg0KICAgIC8vIC0tLS0tIExvb2sgaWYgdGhlICRwX2ZpbGVsaXN0IGlzIGEgc3RyaW5nDQogICAgZWxzZSBpZiAoaXNfc3RyaW5nKCRwX2ZpbGVsaXN0KSkNCiAgICB7DQogICAgICAvLyAtLS0tLSBDcmVhdGUgYSBsaXN0IHdpdGggdGhlIGVsZW1lbnRzIGZyb20gdGhlIHN0cmluZw0KICAgICAgJHZfbGlzdCA9IGV4cGxvZGUoIiAiLCAkcF9maWxlbGlzdCk7DQoNCiAgICAgIC8vIC0tLS0tIENhbGwgdGhlIGV4dHJhY3RpbmcgZmN0DQogICAgICBpZiAoKCR2X3Jlc3VsdCA9IFBjbFRhckhhbmRsZURlbGV0ZSgkcF90YXJuYW1lLCAkdl9saXN0LCAkcF9saXN0LCAkcF9tb2RlKSkgIT0gMSkNCiAgICAgIHsNCiAgICAgICAgVHJGY3RFbmQoX19GSUxFX18sIF9fTElORV9fLCAwLCBQY2xFcnJvclN0cmluZygpKTsNCiAgICAgICAgcmV0dXJuKDApOw0KICAgICAgfQ0KICAgIH0NCg0KICAgIC8vIC0tLS0tIEludmFsaWQgdmFyaWFibGUNCiAgICBlbHNlDQogICAgew0KICAgICAgLy8gLS0tLS0gRXJyb3IgbG9nDQogICAgICBQY2xFcnJvckxvZygtMywgIkludmFsaWQgdmFyaWFibGUgdHlwZSBwX2ZpbGVsaXN0Iik7DQoNCiAgICAgIC8vIC0tLS0tIFJldHVybg0KICAgICAgVHJGY3RFbmQoX19GSUxFX18sIF9fTElORV9fLCBQY2xFcnJvckNvZGUoKSwgUGNsRXJyb3JTdHJpbmcoKSk7DQogICAgICByZXR1cm4gMDsNCiAgICB9DQoNCiAgICAvLyAtLS0tLSBSZXR1cm4NCiAgICBUckZjdEVuZChfX0ZJTEVfXywgX19MSU5FX18sICRwX2xpc3QpOw0KICAgIHJldHVybiAkcF9saXN0Ow0KICB9DQogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiAgLy8gRnVuY3Rpb24gOiBQY2xUYXJVcGRhdGUoKQ0KICAvLyBEZXNjcmlwdGlvbiA6DQogIC8vICAgVGhpcyBmdW5jdGlvbiB1cGRhdGVzIHRoZSBmaWxlcyBpbiAkcF9maWxlbGlzdCB3aGljaCBhcmUgYWxyZWFkeSBpbiB0aGUNCiAgLy8gICAkcF90YXJuYW1lIGFyY2hpdmUgd2l0aCBhbiBvbGRlciBsYXN0IG1vZGlmaWVkIGRhdGUuIElmIHRoZSBmaWxlIGRvZXMgbm90DQogIC8vICAgZXhpc3QsIGl0IGlzIGFkZGVkIGF0IHRoZSBlbmQgb2YgdGhlIGFyY2hpdmUuDQogIC8vIFBhcmFtZXRlcnMgOg0KICAvLyAgICRwX3Rhcm5hbWUgOiBOYW1lIG9mIGFuIGV4aXN0aW5nIHRhciBmaWxlDQogIC8vICAgJHBfZmlsZWxpc3QgOiBBbiBhcnJheSBvciBhIHN0cmluZyBjb250YWluaW5nIGZpbGUgbmFtZXMgdG8gdXBkYXRlIGZyb20gdGhlDQogIC8vICAgICAgICAgICAgICAgICBhcmNoaXZlLg0KICAvLyAgICRwX21vZGUgOiAndGFyJyBvciAndGd6JywgaWYgbm90IHNldCwgd2lsbCBiZSBkZXRlcm1pbmVkIGJ5ICRwX3Rhcm5hbWUgZXh0ZW5zaW9uDQogIC8vIFJldHVybiBWYWx1ZXMgOg0KICAvLyAgIExpc3Qgb2YgdGhlIGZpbGVzIGNvbnRhaW5lZCBpbiB0aGUgYXJjaGl2ZS4gVGhlIGZpZWxkIHN0YXR1cyBjb250YWlucw0KICAvLyAgICJ1cGRhdGVkIiwgIm5vdF91cGRhdGVkIiwgImFkZGVkIiBvciAib2siIGZvciB0aGUgZmlsZXMgbm90IGNvbmNlcm5lZC4NCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiAgZnVuY3Rpb24gUGNsVGFyVXBkYXRlKCRwX3Rhcm5hbWUsICRwX2ZpbGVsaXN0LCAkcF9tb2RlPSIiLCAkcF9hZGRfZGlyPSIiLCAkcF9yZW1vdmVfZGlyPSIiKQ0KICB7DQogICAgVHJGY3RTdGFydChfX0ZJTEVfXywgX19MSU5FX18sICJQY2xUYXJVcGRhdGUiLCAidGFyPSckcF90YXJuYW1lJywgbGlzdD0nJHBfZmlsZWxpc3QnLCBtb2RlPSckcF9tb2RlJyIpOw0KICAgICR2X3Jlc3VsdD0xOw0KDQogICAgLy8gLS0tLS0gRXh0cmFjdCB0aGUgdGFyIGZvcm1hdCBmcm9tIHRoZSBleHRlbnNpb24NCiAgICBpZiAoKCRwX21vZGUgPT0gIiIpIHx8ICgoJHBfbW9kZSE9InRhciIpICYmICgkcF9tb2RlIT0idGd6IikpKQ0KICAgIHsNCiAgICAgIGlmICgoJHBfbW9kZSA9IFBjbFRhckhhbmRsZUV4dGVuc2lvbigkcF90YXJuYW1lKSkgPT0gIiIpDQogICAgICB7DQogICAgICAgIC8vIC0tLS0tIFJldHVybg0KICAgICAgICBUckZjdEVuZChfX0ZJTEVfXywgX19MSU5FX18sIFBjbEVycm9yQ29kZSgpLCBQY2xFcnJvclN0cmluZygpKTsNCiAgICAgICAgcmV0dXJuIDA7DQogICAgICB9DQogICAgfQ0KDQogICAgLy8gLS0tLS0gTG9vayBpZiB0aGUgJHBfZmlsZWxpc3QgaXMgcmVhbGx5IGFuIGFycmF5DQogICAgaWYgKGlzX2FycmF5KCRwX2ZpbGVsaXN0KSkNCiAgICB7DQogICAgICAvLyAtLS0tLSBDYWxsIHRoZSBleHRyYWN0aW5nIGZjdA0KICAgICAgaWYgKCgkdl9yZXN1bHQgPSBQY2xUYXJIYW5kbGVVcGRhdGUoJHBfdGFybmFtZSwgJHBfZmlsZWxpc3QsICRwX2xpc3QsICRwX21vZGUsICRwX2FkZF9kaXIsICRwX3JlbW92ZV9kaXIpKSAhPSAxKQ0KICAgICAgew0KICAgICAgICBUckZjdEVuZChfX0ZJTEVfXywgX19MSU5FX18sIDAsIFBjbEVycm9yU3RyaW5nKCkpOw0KICAgICAgICByZXR1cm4oMCk7DQogICAgICB9DQogICAgfQ0KDQogICAgLy8gLS0tLS0gTG9vayBpZiB0aGUgJHBfZmlsZWxpc3QgaXMgYSBzdHJpbmcNCiAgICBlbHNlIGlmIChpc19zdHJpbmcoJHBfZmlsZWxpc3QpKQ0KICAgIHsNCiAgICAgIC8vIC0tLS0tIENyZWF0ZSBhIGxpc3Qgd2l0aCB0aGUgZWxlbWVudHMgZnJvbSB0aGUgc3RyaW5nDQogICAgICAkdl9saXN0ID0gZXhwbG9kZSgiICIsICRwX2ZpbGVsaXN0KTsNCg0KICAgICAgLy8gLS0tLS0gQ2FsbCB0aGUgZXh0cmFjdGluZyBmY3QNCiAgICAgIGlmICgoJHZfcmVzdWx0ID0gUGNsVGFySGFuZGxlVXBkYXRlKCRwX3Rhcm5hbWUsICR2X2xpc3QsICRwX2xpc3QsICRwX21vZGUsICRwX2FkZF9kaXIsICRwX3JlbW92ZV9kaXIpKSAhPSAxKQ0KICAgICAgew0KICAgICAgICBUckZjdEVuZChfX0ZJTEVfXywgX19MSU5FX18sIDAsIFBjbEVycm9yU3RyaW5nKCkpOw0KICAgICAgICByZXR1cm4oMCk7DQogICAgICB9DQogICAgfQ0KDQogICAgLy8gLS0tLS0gSW52YWxpZCB2YXJpYWJsZQ0KICAgIGVsc2UNCiAgICB7DQogICAgICAvLyAtLS0tLSBFcnJvciBsb2cNCiAgICAgIFBjbEVycm9yTG9nKC0zLCAiSW52YWxpZCB2YXJpYWJsZSB0eXBlIHBfZmlsZWxpc3QiKTsNCg0KICAgICAgLy8gLS0tLS0gUmV0dXJuDQogICAgICBUckZjdEVuZChfX0ZJTEVfXywgX19MSU5FX18sIFBjbEVycm9yQ29kZSgpLCBQY2xFcnJvclN0cmluZygpKTsNCiAgICAgIHJldHVybiAwOw0KICAgIH0NCg0KICAgIC8vIC0tLS0tIFJldHVybg0KICAgIFRyRmN0RW5kKF9fRklMRV9fLCBfX0xJTkVfXywgJHBfbGlzdCk7DQogICAgcmV0dXJuICRwX2xpc3Q7DQogIH0NCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KDQogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQogIC8vIEZ1bmN0aW9uIDogUGNsVGFyTWVyZ2UoKQ0KICAvLyBEZXNjcmlwdGlvbiA6DQogIC8vICAgVGhpcyBmdW5jdGlvbiBhZGQgdGhlIGNvbnRlbnQgb2YgJHBfdGFybmFtZV9hZGQgYXQgdGhlIGVuZCBvZiAkcF90YXJuYW1lLg0KICAvLyBQYXJhbWV0ZXJzIDoNCiAgLy8gICAkcF90YXJuYW1lIDogTmFtZSBvZiBhbiBleGlzdGluZyB0YXIgZmlsZQ0KICAvLyAgICRwX3Rhcm5hbWVfYWRkIDogTmFtZSBvZiBhbiBleGlzdGluZyB0YXIgZmlsZSB0YWh0IHdpbGwgYmUgYWRkZWQgYXQgdGhlIGVuZA0KICAvLyAgICAgICAgICAgICAgICAgICAgb2YgJHBfdGFybmFtZS4NCiAgLy8gICAkcF9tb2RlIDogJ3Rhcicgb3IgJ3RneicsIGlmIG5vdCBzZXQsIHdpbGwgYmUgZGV0ZXJtaW5lZCBieSAkcF90YXJuYW1lIGV4dGVuc2lvbg0KICAvLyAgICRwX21vZGVfYWRkIDogJ3Rhcicgb3IgJ3RneicsIGlmIG5vdCBzZXQsIHdpbGwgYmUgZGV0ZXJtaW5lZCBieSAkcF90YXJuYW1lX2FkZA0KICAvLyAgICAgICAgICAgICAgICAgZXh0ZW5zaW9uDQogIC8vIFJldHVybiBWYWx1ZXMgOg0KICAvLyAgIExpc3Qgb2YgdGhlIGZpbGVzIGNvbnRhaW5lZCBpbiB0aGUgYXJjaGl2ZS4gVGhlIGZpZWxkIHN0YXR1cyBjb250YWlucw0KICAvLyAgICJ1cGRhdGVkIiwgIm5vdF91cGRhdGVkIiwgImFkZGVkIiBvciAib2siIGZvciB0aGUgZmlsZXMgbm90IGNvbmNlcm5lZC4NCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiAgZnVuY3Rpb24gUGNsVGFyTWVyZ2UoJHBfdGFybmFtZSwgJHBfdGFybmFtZV9hZGQsICRwX21vZGU9IiIsICRwX21vZGVfYWRkPSIiKQ0KICB7DQogICAgVHJGY3RTdGFydChfX0ZJTEVfXywgX19MSU5FX18sICJQY2xUYXJNZXJnZSIsICJ0YXI9JyRwX3Rhcm5hbWUnLCB0YXJfYWRkPSckcF90YXJuYW1lX2FkZCcsIG1vZGU9JyRwX21vZGUnLCBtb2RlX2FkZD0nJHBfbW9kZV9hZGQnIik7DQogICAgJHZfcmVzdWx0PTE7DQoNCiAgICAvLyAtLS0tLSBDaGVjayB0aGUgcGFyYW1ldGVycw0KICAgIGlmICgoJHBfdGFybmFtZSA9PSAiIikgfHwgKCRwX3Rhcm5hbWVfYWRkID09ICIiKSkNCiAgICB7DQogICAgICAvLyAtLS0tLSBFcnJvciBsb2cNCiAgICAgIFBjbEVycm9yTG9nKC0zLCAiSW52YWxpZCBlbXB0eSBhcmNoaXZlIG5hbWUiKTsNCg0KICAgICAgLy8gLS0tLS0gUmV0dXJuDQogICAgICBUckZjdEVuZChfX0ZJTEVfXywgX19MSU5FX18sIFBjbEVycm9yQ29kZSgpLCBQY2xFcnJvclN0cmluZygpKTsNCiAgICAgIHJldHVybiBQY2xFcnJvckNvZGUoKTsNCiAgICB9DQoNCiAgICAvLyAtLS0tLSBFeHRyYWN0IHRoZSB0YXIgZm9ybWF0IGZyb20gdGhlIGV4dGVuc2lvbg0KICAgIGlmICgoJHBfbW9kZSA9PSAiIikgfHwgKCgkcF9tb2RlIT0idGFyIikgJiYgKCRwX21vZGUhPSJ0Z3oiKSkpDQogICAgew0KICAgICAgaWYgKCgkcF9tb2RlID0gUGNsVGFySGFuZGxlRXh0ZW5zaW9uKCRwX3Rhcm5hbWUpKSA9PSAiIikNCiAgICAgIHsNCiAgICAgICAgLy8gLS0tLS0gUmV0dXJuDQogICAgICAgIFRyRmN0RW5kKF9fRklMRV9fLCBfX0xJTkVfXywgUGNsRXJyb3JDb2RlKCksIFBjbEVycm9yU3RyaW5nKCkpOw0KICAgICAgICByZXR1cm4gMDsNCiAgICAgIH0NCiAgICB9DQogICAgaWYgKCgkcF9tb2RlX2FkZCA9PSAiIikgfHwgKCgkcF9tb2RlX2FkZCE9InRhciIpICYmICgkcF9tb2RlX2FkZCE9InRneiIpKSkNCiAgICB7DQogICAgICBpZiAoKCRwX21vZGVfYWRkID0gUGNsVGFySGFuZGxlRXh0ZW5zaW9uKCRwX3Rhcm5hbWVfYWRkKSkgPT0gIiIpDQogICAgICB7DQogICAgICAgIC8vIC0tLS0tIFJldHVybg0KICAgICAgICBUckZjdEVuZChfX0ZJTEVfXywgX19MSU5FX18sIFBjbEVycm9yQ29kZSgpLCBQY2xFcnJvclN0cmluZygpKTsNCiAgICAgICAgcmV0dXJuIDA7DQogICAgICB9DQogICAgfQ0KDQogICAgLy8gLS0tLS0gQ2xlYXIgZmlsZWNhY2hlDQogICAgY2xlYXJzdGF0Y2FjaGUoKTsNCg0KICAgIC8vIC0tLS0tIENoZWNrIHRoZSBmaWxlIHNpemUNCiAgICBpZiAoKCFpc19maWxlKCRwX3Rhcm5hbWUpKSB8fA0KICAgICAgICAoKCgoJHZfc2l6ZSA9IGZpbGVzaXplKCRwX3Rhcm5hbWUpKSAlIDUxMikgIT0gMCkgJiYgKCRwX21vZGU9PSJ0YXIiKSkpDQogICAgew0KICAgICAgLy8gLS0tLS0gRXJyb3IgbG9nDQogICAgICBpZiAoIWlzX2ZpbGUoJHBfdGFybmFtZSkpDQogICAgICAgIFBjbEVycm9yTG9nKC00LCAiQXJjaGl2ZSAnJHBfdGFybmFtZScgZG9lcyBub3QgZXhpc3QiKTsNCiAgICAgIGVsc2UNCiAgICAgICAgUGNsRXJyb3JMb2coLTYsICJBcmNoaXZlICckcF90YXJuYW1lJyBoYXMgaW52YWxpZCBzaXplICIuZmlsZXNpemUoJHBfdGFybmFtZSkuIihub3QgYSA1MTIgYmxvY2sgbXVsdGlwbGUpIik7DQoNCiAgICAgIC8vIC0tLS0tIFJldHVybg0KICAgICAgVHJGY3RFbmQoX19GSUxFX18sIF9fTElORV9fLCBQY2xFcnJvckNvZGUoKSwgUGNsRXJyb3JTdHJpbmcoKSk7DQogICAgICByZXR1cm4gUGNsRXJyb3JDb2RlKCk7DQogICAgfQ0KICAgIGlmICgoIWlzX2ZpbGUoJHBfdGFybmFtZV9hZGQpKSB8fA0KICAgICAgICAoKCgoJHZfc2l6ZV9hZGQgPSBmaWxlc2l6ZSgkcF90YXJuYW1lX2FkZCkpICUgNTEyKSAhPSAwKSAmJiAoJHBfbW9kZV9hZGQ9PSJ0YXIiKSkpDQogICAgew0KICAgICAgLy8gLS0tLS0gRXJyb3IgbG9nDQogICAgICBpZiAoIWlzX2ZpbGUoJHBfdGFybmFtZV9hZGQpKQ0KICAgICAgICBQY2xFcnJvckxvZygtNCwgIkFyY2hpdmUgJyRwX3Rhcm5hbWVfYWRkJyBkb2VzIG5vdCBleGlzdCIpOw0KICAgICAgZWxzZQ0KICAgICAgICBQY2xFcnJvckxvZygtNiwgIkFyY2hpdmUgJyRwX3Rhcm5hbWVfYWRkJyBoYXMgaW52YWxpZCBzaXplICIuZmlsZXNpemUoJHBfdGFybmFtZV9hZGQpLiIobm90IGEgNTEyIGJsb2NrIG11bHRpcGxlKSIpOw0KDQogICAgICAvLyAtLS0tLSBSZXR1cm4NCiAgICAgIFRyRmN0RW5kKF9fRklMRV9fLCBfX0xJTkVfXywgUGNsRXJyb3JDb2RlKCksIFBjbEVycm9yU3RyaW5nKCkpOw0KICAgICAgcmV0dXJuIFBjbEVycm9yQ29kZSgpOw0KICAgIH0NCg0KICAgIC8vIC0tLS0tIExvb2sgZm9yIGNvbXByZXNzZWQgYXJjaGl2ZQ0KICAgIGlmICgkcF9tb2RlID09ICJ0Z3oiKQ0KICAgIHsNCiAgICAgIC8vIC0tLS0tIE9wZW4gdGhlIGZpbGUgaW4gcmVhZCBtb2RlDQogICAgICBpZiAoKCRwX3RhciA9IEBnem9wZW4oJHBfdGFybmFtZSwgInJiIikpID09IDApDQogICAgICB7DQogICAgICAgIC8vIC0tLS0tIEVycm9yIGxvZw0KICAgICAgICBQY2xFcnJvckxvZygtMiwgIlVuYWJsZSB0byBvcGVuIGZpbGUgJyRwX3Rhcm5hbWUnIGluIGJpbmFyeSByZWFkIG1vZGUiKTsNCg0KICAgICAgICAvLyAtLS0tLSBSZXR1cm4NCiAgICAgICAgVHJGY3RFbmQoX19GSUxFX18sIF9fTElORV9fLCBQY2xFcnJvckNvZGUoKSwgUGNsRXJyb3JTdHJpbmcoKSk7DQogICAgICAgIHJldHVybiBQY2xFcnJvckNvZGUoKTsNCiAgICAgIH0NCg0KICAgICAgLy8gLS0tLS0gT3BlbiBhIHRlbXBvcmFyeSBmaWxlIGluIHdyaXRlIG1vZGUNCiAgICAgICR2X3RlbXBfdGFybmFtZSA9IHVuaXFpZCgicGNsdGFyLSIpLiIudG1wIjsNCiAgICAgIFRyRmN0TWVzc2FnZShfX0ZJTEVfXywgX19MSU5FX18sIDIsICJDcmVhdGluZyB0ZW1wb3JhcnkgYXJjaGl2ZSBmaWxlICR2X3RlbXBfdGFybmFtZSIpOw0KICAgICAgaWYgKCgkdl90ZW1wX3RhciA9IEBnem9wZW4oJHZfdGVtcF90YXJuYW1lLCAid2IiKSkgPT0gMCkNCiAgICAgIHsNCiAgICAgICAgLy8gLS0tLS0gQ2xvc2UgdGFyIGZpbGUNCiAgICAgICAgZ3pjbG9zZSgkcF90YXIpOw0KDQogICAgICAgIC8vIC0tLS0tIEVycm9yIGxvZw0KICAgICAgICBQY2xFcnJvckxvZygtMSwgIlVuYWJsZSB0byBvcGVuIGZpbGUgJyR2X3RlbXBfdGFybmFtZScgaW4gYmluYXJ5IHdyaXRlIG1vZGUiKTsNCg0KICAgICAgICAvLyAtLS0tLSBSZXR1cm4NCiAgICAgICAgVHJGY3RFbmQoX19GSUxFX18sIF9fTElORV9fLCBQY2xFcnJvckNvZGUoKSwgUGNsRXJyb3JTdHJpbmcoKSk7DQogICAgICAgIHJldHVybiBQY2xFcnJvckNvZGUoKTsNCiAgICAgIH0NCg0KICAgICAgLy8gLS0tLS0gUmVhZCB0aGUgZmlyc3QgNTEyIGJ5dGVzIGJsb2NrDQogICAgICAkdl9idWZmZXIgPSBnenJlYWQoJHBfdGFyLCA1MTIpOw0KDQogICAgICAvLyAtLS0tLSBSZWFkIHRoZSBmb2xsb3dpbmcgYmxvY2tzIGJ1dCBub3QgdGhlIGxhc3Qgb25lDQogICAgICBpZiAoIWd6ZW9mKCRwX3RhcikpDQogICAgICB7DQogICAgICAgIFRyRmN0TWVzc2FnZShfX0ZJTEVfXywgX19MSU5FX18sIDMsICJNb3JlIHRoYW4gb25lIDUxMiBibG9jayBmaWxlIik7DQogICAgICAgICRpPTE7DQoNCiAgICAgICAgLy8gLS0tLS0gUmVhZCBuZXcgNTEyIGJsb2NrIGFuZCB3cml0ZSB0aGUgYWxyZWFkeSByZWFkDQogICAgICAgIGRvew0KICAgICAgICAgIC8vIC0tLS0tIFdyaXRlIHRoZSBhbHJlYWR5IHJlYWQgYmxvY2sNCiAgICAgICAgICAkdl9iaW5hcnlfZGF0YSA9IHBhY2soImE1MTIiLCAiJHZfYnVmZmVyIik7DQogICAgICAgICAgZ3pwdXRzKCR2X3RlbXBfdGFyLCAkdl9iaW5hcnlfZGF0YSk7DQoNCiAgICAgICAgICAkaSsrOw0KICAgICAgICAgIFRyRmN0TWVzc2FnZShfX0ZJTEVfXywgX19MSU5FX18sIDMsICJSZWFkaW5nIGJsb2NrICRpIik7DQoNCiAgICAgICAgICAvLyAtLS0tLSBSZWFkIG5leHQgYmxvY2sNCiAgICAgICAgICAkdl9idWZmZXIgPSBnenJlYWQoJHBfdGFyLCA1MTIpOw0KDQogICAgICAgIH0gd2hpbGUgKCFnemVvZigkcF90YXIpKTsNCg0KICAgICAgICBUckZjdE1lc3NhZ2UoX19GSUxFX18sIF9fTElORV9fLCAzLCAiJGkgNTEyIGJ5dGVzIGJsb2NrcyIpOw0KICAgICAgfQ0KICAgIH0NCg0KICAgIC8vIC0tLS0tIExvb2sgZm9yIHVuY29tcHJlc3NlZCB0YXIgZmlsZQ0KICAgIGVsc2UgaWYgKCRwX21vZGU9PSJ0YXIiKQ0KICAgIHsNCiAgICAgIC8vIC0tLS0tIE9wZW4gdGhlIHRhciBmaWxlDQogICAgICBpZiAoKCRwX3RhciA9IGZvcGVuKCRwX3Rhcm5hbWUsICJyK2IiKSkgPT0gMCkNCiAgICAgIHsNCiAgICAgICAgLy8gLS0tLS0gRXJyb3IgbG9nDQogICAgICAgIFBjbEVycm9yTG9nKC0xLCAiVW5hYmxlIHRvIG9wZW4gZmlsZSAnJHBfdGFybmFtZScgaW4gYmluYXJ5IHdyaXRlIG1vZGUiKTsNCg0KICAgICAgICAvLyAtLS0tLSBSZXR1cm4NCiAgICAgICAgVHJGY3RFbmQoX19GSUxFX18sIF9fTElORV9fLCBQY2xFcnJvckNvZGUoKSwgUGNsRXJyb3JTdHJpbmcoKSk7DQogICAgICAgIHJldHVybiBQY2xFcnJvckNvZGUoKTsNCiAgICAgIH0NCg0KICAgICAgLy8gLS0tLS0gR28gdG8gdGhlIGJlZ2lubmluZyBvZiBsYXN0IGJsb2NrDQogICAgICBUckZjdE1lc3NhZ2UoX19GSUxFX18sIF9fTElORV9fLCA0LCAiUG9zaXRpb24gYmVmb3JlIDoiLigkcF9tb2RlPT0idGFyIj9mdGVsbCgkcF90YXIpOmd6dGVsbCgkcF90YXIpKSk7DQogICAgICBmc2VlaygkcF90YXIsICR2X3NpemUtNTEyKTsNCiAgICAgIFRyRmN0TWVzc2FnZShfX0ZJTEVfXywgX19MSU5FX18sIDQsICJQb3NpdGlvbiBhZnRlciA6Ii4oJHBfbW9kZT09InRhciI/ZnRlbGwoJHBfdGFyKTpnenRlbGwoJHBfdGFyKSkpOw0KICAgIH0NCg0KICAgIC8vIC0tLS0tIExvb2sgZm9yIHVua25vd24gdHlwZQ0KICAgIGVsc2UNCiAgICB7DQogICAgICAvLyAtLS0tLSBFcnJvciBsb2cNCiAgICAgIFBjbEVycm9yTG9nKC0zLCAiSW52YWxpZCB0YXIgbW9kZSAkcF9tb2RlIik7DQoNCiAgICAgIC8vIC0tLS0tIFJldHVybg0KICAgICAgVHJGY3RFbmQoX19GSUxFX18sIF9fTElORV9fLCBQY2xFcnJvckNvZGUoKSwgUGNsRXJyb3JTdHJpbmcoKSk7DQogICAgICByZXR1cm4gUGNsRXJyb3JDb2RlKCk7DQogICAgfQ0KDQogICAgLy8gLS0tLS0gTG9vayBmb3IgdHlwZSBvZiBhcmNoaXZlIHRvIGFkZA0KICAgIGlmICgkcF9tb2RlX2FkZCA9PSAidGd6IikNCiAgICB7DQogICAgICBUckZjdE1lc3NhZ2UoX19GSUxFX18sIF9fTElORV9fLCA0LCAiT3BlbmluZyBmaWxlICRwX3Rhcm5hbWVfYWRkIik7DQoNCiAgICAgIC8vIC0tLS0tIE9wZW4gdGhlIGZpbGUgaW4gcmVhZCBtb2RlDQogICAgICBpZiAoKCRwX3Rhcl9hZGQgPSBAZ3pvcGVuKCRwX3Rhcm5hbWVfYWRkLCAicmIiKSkgPT0gMCkNCiAgICAgIHsNCiAgICAgICAgLy8gLS0tLS0gRXJyb3IgbG9nDQogICAgICAgIFBjbEVycm9yTG9nKC0yLCAiVW5hYmxlIHRvIG9wZW4gZmlsZSAnJHBfdGFybmFtZV9hZGQnIGluIGJpbmFyeSByZWFkIG1vZGUiKTsNCg0KICAgICAgICAvLyAtLS0tLSBSZXR1cm4NCiAgICAgICAgVHJGY3RFbmQoX19GSUxFX18sIF9fTElORV9fLCBQY2xFcnJvckNvZGUoKSwgUGNsRXJyb3JTdHJpbmcoKSk7DQogICAgICAgIHJldHVybiBQY2xFcnJvckNvZGUoKTsNCiAgICAgIH0NCg0KICAgICAgLy8gLS0tLS0gUmVhZCB0aGUgZmlyc3QgNTEyIGJ5dGVzIGJsb2NrDQogICAgICAkdl9idWZmZXIgPSBnenJlYWQoJHBfdGFyX2FkZCwgNTEyKTsNCg0KICAgICAgLy8gLS0tLS0gUmVhZCB0aGUgZm9sbG93aW5nIGJsb2NrcyBidXQgbm90IHRoZSBsYXN0IG9uZQ0KICAgICAgaWYgKCFnemVvZigkcF90YXJfYWRkKSkNCiAgICAgIHsNCiAgICAgICAgVHJGY3RNZXNzYWdlKF9fRklMRV9fLCBfX0xJTkVfXywgMywgIk1vcmUgdGhhbiBvbmUgNTEyIGJsb2NrIGZpbGUiKTsNCiAgICAgICAgJGk9MTsNCg0KICAgICAgICAvLyAtLS0tLSBSZWFkIG5ldyA1MTIgYmxvY2sgYW5kIHdyaXRlIHRoZSBhbHJlYWR5IHJlYWQNCiAgICAgICAgZG97DQogICAgICAgICAgLy8gLS0tLS0gV3JpdGUgdGhlIGFscmVhZHkgcmVhZCBibG9jaw0KICAgICAgICAgICR2X2JpbmFyeV9kYXRhID0gcGFjaygiYTUxMiIsICIkdl9idWZmZXIiKTsNCiAgICAgICAgICBpZiAoJHBfbW9kZT09InRhciIpDQogICAgICAgICAgICBmcHV0cygkcF90YXIsICR2X2JpbmFyeV9kYXRhKTsNCiAgICAgICAgICBlbHNlDQogICAgICAgICAgICBnenB1dHMoJHZfdGVtcF90YXIsICR2X2JpbmFyeV9kYXRhKTsNCg0KICAgICAgICAgICRpKys7DQogICAgICAgICAgVHJGY3RNZXNzYWdlKF9fRklMRV9fLCBfX0xJTkVfXywgMywgIlJlYWRpbmcgYmxvY2sgJGkiKTsNCg0KICAgICAgICAgIC8vIC0tLS0tIFJlYWQgbmV4dCBibG9jaw0KICAgICAgICAgICR2X2J1ZmZlciA9IGd6cmVhZCgkcF90YXJfYWRkLCA1MTIpOw0KDQogICAgICAgIH0gd2hpbGUgKCFnemVvZigkcF90YXJfYWRkKSk7DQoNCiAgICAgICAgVHJGY3RNZXNzYWdlKF9fRklMRV9fLCBfX0xJTkVfXywgMywgIiRpIDUxMiBieXRlcyBibG9ja3MiKTsNCiAgICAgIH0NCg0KICAgICAgLy8gLS0tLS0gQ2xvc2UgdGhlIGZpbGVzDQogICAgICBnemNsb3NlKCRwX3Rhcl9hZGQpOw0KICAgIH0NCg0KICAgIC8vIC0tLS0tIExvb2sgZm9yIHVuY29tcHJlc3NlZCB0YXIgZmlsZQ0KICAgIGVsc2UgaWYgKCRwX21vZGU9PSJ0YXIiKQ0KICAgIHsNCiAgICAgIC8vIC0tLS0tIE9wZW4gdGhlIGZpbGUgaW4gcmVhZCBtb2RlDQogICAgICBpZiAoKCRwX3Rhcl9hZGQgPSBAZm9wZW4oJHBfdGFybmFtZV9hZGQsICJyYiIpKSA9PSAwKQ0KICAgICAgew0KICAgICAgICAvLyAtLS0tLSBFcnJvciBsb2cNCiAgICAgICAgUGNsRXJyb3JMb2coLTIsICJVbmFibGUgdG8gb3BlbiBmaWxlICckcF90YXJuYW1lX2FkZCcgaW4gYmluYXJ5IHJlYWQgbW9kZSIpOw0KDQogICAgICAgIC8vIC0tLS0tIFJldHVybg0KICAgICAgICBUckZjdEVuZChfX0ZJTEVfXywgX19MSU5FX18sIFBjbEVycm9yQ29kZSgpLCBQY2xFcnJvclN0cmluZygpKTsNCiAgICAgICAgcmV0dXJuIFBjbEVycm9yQ29kZSgpOw0KICAgICAgfQ0KDQogICAgICAvLyAtLS0tLSBSZWFkIHRoZSBmaXJzdCA1MTIgYnl0ZXMgYmxvY2sNCiAgICAgICR2X2J1ZmZlciA9IGZyZWFkKCRwX3Rhcl9hZGQsIDUxMik7DQoNCiAgICAgIC8vIC0tLS0tIFJlYWQgdGhlIGZvbGxvd2luZyBibG9ja3MgYnV0IG5vdCB0aGUgbGFzdCBvbmUNCiAgICAgIGlmICghZmVvZigkcF90YXJfYWRkKSkNCiAgICAgIHsNCiAgICAgICAgVHJGY3RNZXNzYWdlKF9fRklMRV9fLCBfX0xJTkVfXywgMywgIk1vcmUgdGhhbiBvbmUgNTEyIGJsb2NrIGZpbGUiKTsNCiAgICAgICAgJGk9MTsNCg0KICAgICAgICAvLyAtLS0tLSBSZWFkIG5ldyA1MTIgYmxvY2sgYW5kIHdyaXRlIHRoZSBhbHJlYWR5IHJlYWQNCiAgICAgICAgZG97DQogICAgICAgICAgLy8gLS0tLS0gV3JpdGUgdGhlIGFscmVhZHkgcmVhZCBibG9jaw0KICAgICAgICAgICR2X2JpbmFyeV9kYXRhID0gcGFjaygiYTUxMiIsICIkdl9idWZmZXIiKTsNCiAgICAgICAgICBpZiAoJHBfbW9kZT09InRhciIpDQogICAgICAgICAgICBmcHV0cygkcF90YXIsICR2X2JpbmFyeV9kYXRhKTsNCiAgICAgICAgICBlbHNlDQogICAgICAgICAgICBnenB1dHMoJHZfdGVtcF90YXIsICR2X2JpbmFyeV9kYXRhKTsNCg0KICAgICAgICAgICRpKys7DQogICAgICAgICAgVHJGY3RNZXNzYWdlKF9fRklMRV9fLCBfX0xJTkVfXywgMywgIlJlYWRpbmcgYmxvY2sgJGkiKTsNCg0KICAgICAgICAgIC8vIC0tLS0tIFJlYWQgbmV4dCBibG9jaw0KICAgICAgICAgICR2X2J1ZmZlciA9IGZyZWFkKCRwX3Rhcl9hZGQsIDUxMik7DQoNCiAgICAgICAgfSB3aGlsZSAoIWZlb2YoJHBfdGFyX2FkZCkpOw0KDQogICAgICAgIFRyRmN0TWVzc2FnZShfX0ZJTEVfXywgX19MSU5FX18sIDMsICIkaSA1MTIgYnl0ZXMgYmxvY2tzIik7DQogICAgICB9DQoNCiAgICAgIC8vIC0tLS0tIENsb3NlIHRoZSBmaWxlcw0KICAgICAgZmNsb3NlKCRwX3Rhcl9hZGQpOw0KICAgIH0NCg0KICAgIC8vIC0tLS0tIENhbGwgdGhlIGZvb3RlciBvZiB0aGUgdGFyIGFyY2hpdmUNCiAgICAkdl9yZXN1bHQgPSBQY2xUYXJIYW5kbGVGb290ZXIoJHBfdGFyLCAkcF9tb2RlKTsNCg0KICAgIC8vIC0tLS0tIExvb2sgZm9yIGNsb3NpbmcgY29tcHJlc3NlZCBhcmNoaXZlDQogICAgaWYgKCRwX21vZGUgPT0gInRneiIpDQogICAgew0KICAgICAgLy8gLS0tLS0gQ2xvc2UgdGhlIGZpbGVzDQogICAgICBnemNsb3NlKCRwX3Rhcik7DQogICAgICBnemNsb3NlKCR2X3RlbXBfdGFyKTsNCg0KICAgICAgLy8gLS0tLS0gVW5saW5rIHRhciBmaWxlDQogICAgICBpZiAoIUB1bmxpbmsoJHBfdGFybmFtZSkpDQogICAgICB7DQogICAgICAgIC8vIC0tLS0tIEVycm9yIGxvZw0KICAgICAgICBQY2xFcnJvckxvZygtMTEsICJFcnJvciB3aGlsZSBkZWxldGluZyBhcmNoaXZlIG5hbWUgJHBfdGFybmFtZSIpOw0KICAgICAgfQ0KDQogICAgICAvLyAtLS0tLSBSZW5hbWUgdGFyIGZpbGUNCiAgICAgIGlmICghQHJlbmFtZSgkdl90ZW1wX3Rhcm5hbWUsICRwX3Rhcm5hbWUpKQ0KICAgICAgew0KICAgICAgICAvLyAtLS0tLSBFcnJvciBsb2cNCiAgICAgICAgUGNsRXJyb3JMb2coLTEyLCAiRXJyb3Igd2hpbGUgcmVuYW1pbmcgdGVtcG9yYXJ5IGZpbGUgJHZfdGVtcF90YXJuYW1lIHRvIGFyY2hpdmUgbmFtZSAkcF90YXJuYW1lIik7DQoNCiAgICAgICAgLy8gLS0tLS0gUmV0dXJuDQogICAgICAgIFRyRmN0RW5kKF9fRklMRV9fLCBfX0xJTkVfXywgUGNsRXJyb3JDb2RlKCksIFBjbEVycm9yU3RyaW5nKCkpOw0KICAgICAgICByZXR1cm4gUGNsRXJyb3JDb2RlKCk7DQogICAgICB9DQoNCiAgICAgIC8vIC0tLS0tIFJldHVybg0KICAgICAgVHJGY3RFbmQoX19GSUxFX18sIF9fTElORV9fLCAkdl9yZXN1bHQpOw0KICAgICAgcmV0dXJuICR2X3Jlc3VsdDsNCiAgICB9DQoNCiAgICAvLyAtLS0tLSBMb29rIGZvciBjbG9zaW5nIHVuY29tcHJlc3NlZCB0YXIgZmlsZQ0KICAgIGVsc2UgaWYgKCRwX21vZGU9PSJ0YXIiKQ0KICAgIHsNCiAgICAgIC8vIC0tLS0tIENsb3NlIHRoZSB0YXJmaWxlDQogICAgICBmY2xvc2UoJHBfdGFyKTsNCiAgICB9DQoNCiAgICAvLyAtLS0tLSBSZXR1cm4NCiAgICBUckZjdEVuZChfX0ZJTEVfXywgX19MSU5FX18sICR2X3Jlc3VsdCk7DQogICAgcmV0dXJuICR2X3Jlc3VsdDsNCiAgfQ0KICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KDQoNCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLyAqKioqKiBVTkRFUiBUSElTIExJTkUgQVJFIERFRklORUQgUFJJVkFURSBJTlRFUk5BTCBGVU5DVElPTlMgKioqKioNCi8vICoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKg0KLy8gKioqKiogICAgICAgVEhFU0VTIEZVTkNUSU9OUyBNVVNUIE5PVCBCRSBVU0VEIERJUkVDVExZICAgICAgICoqKioqDQovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KDQoNCg0KICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KICAvLyBGdW5jdGlvbiA6IFBjbFRhckhhbmRsZUNyZWF0ZSgpDQogIC8vIERlc2NyaXB0aW9uIDoNCiAgLy8gUGFyYW1ldGVycyA6DQogIC8vICAgJHBfdGFybmFtZSA6IE5hbWUgb2YgdGhlIHRhciBmaWxlDQogIC8vICAgJHBfbGlzdCA6IEFuIGFycmF5IGNvbnRhaW5pbmcgdGhlIGZpbGUgb3IgZGlyZWN0b3J5IG5hbWVzIHRvIGFkZCBpbiB0aGUgdGFyDQogIC8vICAgJHBfbW9kZSA6ICJ0YXIiIGZvciBub3JtYWwgdGFyIGFyY2hpdmUsICJ0Z3oiIGZvciBnemlwcGVkIHRhciBhcmNoaXZlDQogIC8vIFJldHVybiBWYWx1ZXMgOg0KICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KICBmdW5jdGlvbiBQY2xUYXJIYW5kbGVDcmVhdGUoJHBfdGFybmFtZSwgJHBfbGlzdCwgJHBfbW9kZSwgJHBfYWRkX2Rpcj0iIiwgJHBfcmVtb3ZlX2Rpcj0iIikNCiAgew0KICAgIFRyRmN0U3RhcnQoX19GSUxFX18sIF9fTElORV9fLCAiUGNsVGFySGFuZGxlQ3JlYXRlIiwgInRhcj0kcF90YXJuYW1lLCBsaXN0LCBtb2RlPSRwX21vZGUsIGFkZF9kaXI9JyRwX2FkZF9kaXInLCByZW1vdmVfZGlyPSckcF9yZW1vdmVfZGlyJyIpOw0KICAgICR2X3Jlc3VsdD0xOw0KICAgICR2X2xpc3RfZGV0YWlsID0gYXJyYXkoKTsNCg0KICAgIC8vIC0tLS0tIENoZWNrIHRoZSBwYXJhbWV0ZXJzDQogICAgaWYgKCgkcF90YXJuYW1lID09ICIiKSB8fCAoKCRwX21vZGUgIT0gInRhciIpICYmICgkcF9tb2RlICE9ICJ0Z3oiKSkpDQogICAgew0KICAgICAgLy8gLS0tLS0gRXJyb3IgbG9nDQogICAgICBpZiAoJHBfdGFybmFtZSA9PSAiIikNCiAgICAgICAgUGNsRXJyb3JMb2coLTMsICJJbnZhbGlkIGVtcHR5IGFyY2hpdmUgbmFtZSIpOw0KICAgICAgZWxzZQ0KICAgICAgICBQY2xFcnJvckxvZygtMywgIlVua25vd24gbW9kZSAnJHBfbW9kZSciKTsNCg0KICAgICAgLy8gLS0tLS0gUmV0dXJuDQogICAgICBUckZjdEVuZChfX0ZJTEVfXywgX19MSU5FX18sIFBjbEVycm9yQ29kZSgpLCBQY2xFcnJvclN0cmluZygpKTsNCiAgICAgIHJldHVybiBQY2xFcnJvckNvZGUoKTsNCiAgICB9DQoNCiAgICAvLyAtLS0tLSBMb29rIGZvciB0YXIgZmlsZQ0KICAgIGlmICgkcF9tb2RlID09ICJ0YXIiKQ0KICAgIHsNCiAgICAgIC8vIC0tLS0tIE9wZW4gdGhlIHRhciBmaWxlDQogICAgICBpZiAoKCRwX3RhciA9IGZvcGVuKCRwX3Rhcm5hbWUsICJ3YiIpKSA9PSAwKQ0KICAgICAgew0KICAgICAgICAvLyAtLS0tLSBFcnJvciBsb2cNCiAgICAgICAgUGNsRXJyb3JMb2coLTEsICJVbmFibGUgdG8gb3BlbiBmaWxlIFskcF90YXJuYW1lXSBpbiBiaW5hcnkgd3JpdGUgbW9kZSIpOw0KDQogICAgICAgIC8vIC0tLS0tIFJldHVybg0KICAgICAgICBUckZjdEVuZChfX0ZJTEVfXywgX19MSU5FX18sIFBjbEVycm9yQ29kZSgpLCBQY2xFcnJvclN0cmluZygpKTsNCiAgICAgICAgcmV0dXJuIFBjbEVycm9yQ29kZSgpOw0KICAgICAgfQ0KDQogICAgICAvLyAtLS0tLSBDYWxsIHRoZSBhZGRpbmcgZmN0IGluc2lkZSB0aGUgdGFyDQogICAgICBpZiAoKCR2X3Jlc3VsdCA9IFBjbFRhckhhbmRsZUFkZExpc3QoJHBfdGFyLCAkcF9saXN0LCAkcF9tb2RlLCAkdl9saXN0X2RldGFpbCwgJHBfYWRkX2RpciwgJHBfcmVtb3ZlX2RpcikpID09IDEpDQogICAgICB7DQogICAgICAgIC8vIC0tLS0tIENhbGwgdGhlIGZvb3RlciBvZiB0aGUgdGFyIGFyY2hpdmUNCiAgICAgICAgJHZfcmVzdWx0ID0gUGNsVGFySGFuZGxlRm9vdGVyKCRwX3RhciwgJHBfbW9kZSk7DQogICAgICB9DQoNCiAgICAgIC8vIC0tLS0tIENsb3NlIHRoZSB0YXJmaWxlDQogICAgICBmY2xvc2UoJHBfdGFyKTsNCiAgICB9DQogICAgLy8gLS0tLS0gTG9vayBmb3IgdGd6IGZpbGUNCiAgICBlbHNlDQogICAgew0KICAgICAgLy8gLS0tLS0gT3BlbiB0aGUgdGFyIGZpbGUNCiAgICAgIGlmICgoJHBfdGFyID0gQGd6b3BlbigkcF90YXJuYW1lLCAid2IiKSkgPT0gMCkNCiAgICAgIHsNCiAgICAgICAgLy8gLS0tLS0gRXJyb3IgbG9nDQogICAgICAgIFBjbEVycm9yTG9nKC0xLCAiVW5hYmxlIHRvIG9wZW4gZmlsZSBbJHBfdGFybmFtZV0gaW4gYmluYXJ5IHdyaXRlIG1vZGUiKTsNCg0KICAgICAgICAvLyAtLS0tLSBSZXR1cm4NCiAgICAgICAgVHJGY3RFbmQoX19GSUxFX18sIF9fTElORV9fLCBQY2xFcnJvckNvZGUoKSwgUGNsRXJyb3JTdHJpbmcoKSk7DQogICAgICAgIHJldHVybiBQY2xFcnJvckNvZGUoKTsNCiAgICAgIH0NCg0KICAgICAgLy8gLS0tLS0gQ2FsbCB0aGUgYWRkaW5nIGZjdCBpbnNpZGUgdGhlIHRhcg0KICAgICAgaWYgKCgkdl9yZXN1bHQgPSBQY2xUYXJIYW5kbGVBZGRMaXN0KCRwX3RhciwgJHBfbGlzdCwgJHBfbW9kZSwgJHZfbGlzdF9kZXRhaWwsICRwX2FkZF9kaXIsICRwX3JlbW92ZV9kaXIpKSA9PSAxKQ0KICAgICAgew0KICAgICAgICAvLyAtLS0tLSBDYWxsIHRoZSBmb290ZXIgb2YgdGhlIHRhciBhcmNoaXZlDQogICAgICAgICR2X3Jlc3VsdCA9IFBjbFRhckhhbmRsZUZvb3RlcigkcF90YXIsICRwX21vZGUpOw0KICAgICAgfQ0KDQogICAgICAvLyAtLS0tLSBDbG9zZSB0aGUgdGFyZmlsZQ0KICAgICAgZ3pjbG9zZSgkcF90YXIpOw0KICAgIH0NCg0KICAgIC8vIC0tLS0tIFJldHVybg0KICAgIFRyRmN0RW5kKF9fRklMRV9fLCBfX0xJTkVfXywgJHZfcmVzdWx0KTsNCiAgICByZXR1cm4gJHZfcmVzdWx0Ow0KICB9DQogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiAgLy8gRnVuY3Rpb24gOiBQY2xUYXJIYW5kbGVBcHBlbmQoKQ0KICAvLyBEZXNjcmlwdGlvbiA6DQogIC8vIFBhcmFtZXRlcnMgOg0KICAvLyAgICRwX3Rhcm5hbWUgOiBOYW1lIG9mIHRoZSB0YXIgZmlsZQ0KICAvLyAgICRwX2xpc3QgOiBBbiBhcnJheSBjb250YWluaW5nIHRoZSBmaWxlIG9yIGRpcmVjdG9yeSBuYW1lcyB0byBhZGQgaW4gdGhlIHRhcg0KICAvLyAgICRwX21vZGUgOiAidGFyIiBmb3Igbm9ybWFsIHRhciBhcmNoaXZlLCAidGd6IiBmb3IgZ3ppcHBlZCB0YXIgYXJjaGl2ZQ0KICAvLyBSZXR1cm4gVmFsdWVzIDoNCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiAgZnVuY3Rpb24gUGNsVGFySGFuZGxlQXBwZW5kKCRwX3Rhcm5hbWUsICRwX2xpc3QsICRwX21vZGUsICYkcF9saXN0X2RldGFpbCwgJHBfYWRkX2RpciwgJHBfcmVtb3ZlX2RpcikNCiAgew0KICAgIFRyRmN0U3RhcnQoX19GSUxFX18sIF9fTElORV9fLCAiUGNsVGFySGFuZGxlQXBwZW5kIiwgInRhcj0kcF90YXJuYW1lLCBsaXN0LCBtb2RlPSRwX21vZGUiKTsNCiAgICAkdl9yZXN1bHQ9MTsNCg0KICAgIC8vIC0tLS0tIENoZWNrIHRoZSBwYXJhbWV0ZXJzDQogICAgaWYgKCRwX3Rhcm5hbWUgPT0gIiIpDQogICAgew0KICAgICAgLy8gLS0tLS0gRXJyb3IgbG9nDQogICAgICBQY2xFcnJvckxvZygtMywgIkludmFsaWQgZW1wdHkgYXJjaGl2ZSBuYW1lIik7DQoNCiAgICAgIC8vIC0tLS0tIFJldHVybg0KICAgICAgVHJGY3RFbmQoX19GSUxFX18sIF9fTElORV9fLCBQY2xFcnJvckNvZGUoKSwgUGNsRXJyb3JTdHJpbmcoKSk7DQogICAgICByZXR1cm4gUGNsRXJyb3JDb2RlKCk7DQogICAgfQ0KDQogICAgY2xlYXJzdGF0Y2FjaGUoKTsNCg0KICAgIC8vIC0tLS0tIENoZWNrIHRoZSBmaWxlIHNpemUNCiAgICBpZiAoKCFpc19maWxlKCRwX3Rhcm5hbWUpKSB8fA0KICAgICAgICAoKCgoJHZfc2l6ZSA9IGZpbGVzaXplKCRwX3Rhcm5hbWUpKSAlIDUxMikgIT0gMCkgJiYgKCRwX21vZGU9PSJ0YXIiKSkpDQogICAgew0KICAgICAgLy8gLS0tLS0gRXJyb3IgbG9nDQogICAgICBpZiAoIWlzX2ZpbGUoJHBfdGFybmFtZSkpDQogICAgICAgIFBjbEVycm9yTG9nKC00LCAiQXJjaGl2ZSAnJHBfdGFybmFtZScgZG9lcyBub3QgZXhpc3QiKTsNCiAgICAgIGVsc2UNCiAgICAgICAgUGNsRXJyb3JMb2coLTYsICJBcmNoaXZlICckcF90YXJuYW1lJyBoYXMgaW52YWxpZCBzaXplICIuZmlsZXNpemUoJHBfdGFybmFtZSkuIihub3QgYSA1MTIgYmxvY2sgbXVsdGlwbGUpIik7DQoNCiAgICAgIC8vIC0tLS0tIFJldHVybg0KICAgICAgVHJGY3RFbmQoX19GSUxFX18sIF9fTElORV9fLCBQY2xFcnJvckNvZGUoKSwgUGNsRXJyb3JTdHJpbmcoKSk7DQogICAgICByZXR1cm4gUGNsRXJyb3JDb2RlKCk7DQogICAgfQ0KDQogICAgLy8gLS0tLS0gTG9vayBmb3IgY29tcHJlc3NlZCBhcmNoaXZlDQogICAgaWYgKCRwX21vZGUgPT0gInRneiIpDQogICAgew0KICAgICAgLy8gLS0tLS0gT3BlbiB0aGUgZmlsZSBpbiByZWFkIG1vZGUNCiAgICAgIGlmICgoJHBfdGFyID0gQGd6b3BlbigkcF90YXJuYW1lLCAicmIiKSkgPT0gMCkNCiAgICAgIHsNCiAgICAgICAgLy8gLS0tLS0gRXJyb3IgbG9nDQogICAgICAgIFBjbEVycm9yTG9nKC0yLCAiVW5hYmxlIHRvIG9wZW4gZmlsZSAnJHBfdGFybmFtZScgaW4gYmluYXJ5IHJlYWQgbW9kZSIpOw0KDQogICAgICAgIC8vIC0tLS0tIFJldHVybg0KICAgICAgICBUckZjdEVuZChfX0ZJTEVfXywgX19MSU5FX18sIFBjbEVycm9yQ29kZSgpLCBQY2xFcnJvclN0cmluZygpKTsNCiAgICAgICAgcmV0dXJuIFBjbEVycm9yQ29kZSgpOw0KICAgICAgfQ0KDQogICAgICAvLyAtLS0tLSBPcGVuIGEgdGVtcG9yYXJ5IGZpbGUgaW4gd3JpdGUgbW9kZQ0KICAgICAgJHZfdGVtcF90YXJuYW1lID0gdW5pcWlkKCJwY2x0YXItIikuIi50bXAiOw0KICAgICAgVHJGY3RNZXNzYWdlKF9fRklMRV9fLCBfX0xJTkVfXywgMiwgIkNyZWF0aW5nIHRlbXBvcmFyeSBhcmNoaXZlIGZpbGUgJHZfdGVtcF90YXJuYW1lIik7DQogICAgICBpZiAoKCR2X3RlbXBfdGFyID0gQGd6b3Blbigkdl90ZW1wX3Rhcm5hbWUsICJ3YiIpKSA9PSAwKQ0KICAgICAgew0KICAgICAgICAvLyAtLS0tLSBDbG9zZSB0YXIgZmlsZQ0KICAgICAgICBnemNsb3NlKCRwX3Rhcik7DQoNCiAgICAgICAgLy8gLS0tLS0gRXJyb3IgbG9nDQogICAgICAgIFBjbEVycm9yTG9nKC0xLCAiVW5hYmxlIHRvIG9wZW4gZmlsZSAnJHZfdGVtcF90YXJuYW1lJyBpbiBiaW5hcnkgd3JpdGUgbW9kZSIpOw0KDQogICAgICAgIC8vIC0tLS0tIFJldHVybg0KICAgICAgICBUckZjdEVuZChfX0ZJTEVfXywgX19MSU5FX18sIFBjbEVycm9yQ29kZSgpLCBQY2xFcnJvclN0cmluZygpKTsNCiAgICAgICAgcmV0dXJuIFBjbEVycm9yQ29kZSgpOw0KICAgICAgfQ0KDQogICAgICAvLyAtLS0tLSBSZWFkIHRoZSBmaXJzdCA1MTIgYnl0ZXMgYmxvY2sNCiAgICAgICR2X2J1ZmZlciA9IGd6cmVhZCgkcF90YXIsIDUxMik7DQoNCiAgICAgIC8vIC0tLS0tIFJlYWQgdGhlIGZvbGxvd2luZyBibG9ja3MgYnV0IG5vdCB0aGUgbGFzdCBvbmUNCiAgICAgIGlmICghZ3plb2YoJHBfdGFyKSkNCiAgICAgIHsNCiAgICAgICAgVHJGY3RNZXNzYWdlKF9fRklMRV9fLCBfX0xJTkVfXywgMywgIk1vcmUgdGhhbiBvbmUgNTEyIGJsb2NrIGZpbGUiKTsNCiAgICAgICAgJGk9MTsNCg0KICAgICAgICAvLyAtLS0tLSBSZWFkIG5ldyA1MTIgYmxvY2sgYW5kIHdyaXRlIHRoZSBhbHJlYWR5IHJlYWQNCiAgICAgICAgZG97DQogICAgICAgICAgLy8gLS0tLS0gV3JpdGUgdGhlIGFscmVhZHkgcmVhZCBibG9jaw0KICAgICAgICAgICR2X2JpbmFyeV9kYXRhID0gcGFjaygiYTUxMiIsICIkdl9idWZmZXIiKTsNCiAgICAgICAgICBnenB1dHMoJHZfdGVtcF90YXIsICR2X2JpbmFyeV9kYXRhKTsNCg0KICAgICAgICAgICRpKys7DQogICAgICAgICAgVHJGY3RNZXNzYWdlKF9fRklMRV9fLCBfX0xJTkVfXywgMywgIlJlYWRpbmcgYmxvY2sgJGkiKTsNCg0KICAgICAgICAgIC8vIC0tLS0tIFJlYWQgbmV4dCBibG9jaw0KICAgICAgICAgICR2X2J1ZmZlciA9IGd6cmVhZCgkcF90YXIsIDUxMik7DQoNCiAgICAgICAgfSB3aGlsZSAoIWd6ZW9mKCRwX3RhcikpOw0KDQogICAgICAgIFRyRmN0TWVzc2FnZShfX0ZJTEVfXywgX19MSU5FX18sIDMsICIkaSA1MTIgYnl0ZXMgYmxvY2tzIik7DQogICAgICB9DQoNCiAgICAgIC8vIC0tLS0tIENhbGwgdGhlIGFkZGluZyBmY3QgaW5zaWRlIHRoZSB0YXINCiAgICAgIGlmICgoJHZfcmVzdWx0ID0gUGNsVGFySGFuZGxlQWRkTGlzdCgkdl90ZW1wX3RhciwgJHBfbGlzdCwgJHBfbW9kZSwgJHBfbGlzdF9kZXRhaWwsICRwX2FkZF9kaXIsICRwX3JlbW92ZV9kaXIpKSA9PSAxKQ0KICAgICAgew0KICAgICAgICAvLyAtLS0tLSBDYWxsIHRoZSBmb290ZXIgb2YgdGhlIHRhciBhcmNoaXZlDQogICAgICAgICR2X3Jlc3VsdCA9IFBjbFRhckhhbmRsZUZvb3Rlcigkdl90ZW1wX3RhciwgJHBfbW9kZSk7DQogICAgICB9DQoNCiAgICAgIC8vIC0tLS0tIENsb3NlIHRoZSBmaWxlcw0KICAgICAgZ3pjbG9zZSgkcF90YXIpOw0KICAgICAgZ3pjbG9zZSgkdl90ZW1wX3Rhcik7DQoNCiAgICAgIC8vIC0tLS0tIFVubGluayB0YXIgZmlsZQ0KICAgICAgaWYgKCFAdW5saW5rKCRwX3Rhcm5hbWUpKQ0KICAgICAgew0KICAgICAgICAvLyAtLS0tLSBFcnJvciBsb2cNCiAgICAgICAgUGNsRXJyb3JMb2coLTExLCAiRXJyb3Igd2hpbGUgZGVsZXRpbmcgYXJjaGl2ZSBuYW1lICRwX3Rhcm5hbWUiKTsNCiAgICAgIH0NCg0KICAgICAgLy8gLS0tLS0gUmVuYW1lIHRhciBmaWxlDQogICAgICBpZiAoIUByZW5hbWUoJHZfdGVtcF90YXJuYW1lLCAkcF90YXJuYW1lKSkNCiAgICAgIHsNCiAgICAgICAgLy8gLS0tLS0gRXJyb3IgbG9nDQogICAgICAgIFBjbEVycm9yTG9nKC0xMiwgIkVycm9yIHdoaWxlIHJlbmFtaW5nIHRlbXBvcmFyeSBmaWxlICR2X3RlbXBfdGFybmFtZSB0byBhcmNoaXZlIG5hbWUgJHBfdGFybmFtZSIpOw0KDQogICAgICAgIC8vIC0tLS0tIFJldHVybg0KICAgICAgICBUckZjdEVuZChfX0ZJTEVfXywgX19MSU5FX18sIFBjbEVycm9yQ29kZSgpLCBQY2xFcnJvclN0cmluZygpKTsNCiAgICAgICAgcmV0dXJuIFBjbEVycm9yQ29kZSgpOw0KICAgICAgfQ0KDQogICAgICAvLyAtLS0tLSBSZXR1cm4NCiAgICAgIFRyRmN0RW5kKF9fRklMRV9fLCBfX0xJTkVfXywgJHZfcmVzdWx0KTsNCiAgICAgIHJldHVybiAkdl9yZXN1bHQ7DQogICAgfQ0KDQogICAgLy8gLS0tLS0gTG9vayBmb3IgdW5jb21wcmVzc2VkIHRhciBmaWxlDQogICAgZWxzZSBpZiAoJHBfbW9kZT09InRhciIpDQogICAgew0KICAgICAgLy8gLS0tLS0gT3BlbiB0aGUgdGFyIGZpbGUNCiAgICAgIGlmICgoJHBfdGFyID0gZm9wZW4oJHBfdGFybmFtZSwgInIrYiIpKSA9PSAwKQ0KICAgICAgew0KICAgICAgICAvLyAtLS0tLSBFcnJvciBsb2cNCiAgICAgICAgUGNsRXJyb3JMb2coLTEsICJVbmFibGUgdG8gb3BlbiBmaWxlICckcF90YXJuYW1lJyBpbiBiaW5hcnkgd3JpdGUgbW9kZSIpOw0KDQogICAgICAgIC8vIC0tLS0tIFJldHVybg0KICAgICAgICBUckZjdEVuZChfX0ZJTEVfXywgX19MSU5FX18sIFBjbEVycm9yQ29kZSgpLCBQY2xFcnJvclN0cmluZygpKTsNCiAgICAgICAgcmV0dXJuIFBjbEVycm9yQ29kZSgpOw0KICAgICAgfQ0KDQogICAgICAvLyAtLS0tLSBHbyB0byB0aGUgYmVnaW5uaW5nIG9mIGxhc3QgYmxvY2sNCiAgICAgIFRyRmN0TWVzc2FnZShfX0ZJTEVfXywgX19MSU5FX18sIDQsICJQb3NpdGlvbiBiZWZvcmUgOiIuKCRwX21vZGU9PSJ0YXIiP2Z0ZWxsKCRwX3Rhcik6Z3p0ZWxsKCRwX3RhcikpKTsNCiAgICAgIGZzZWVrKCRwX3RhciwgJHZfc2l6ZS01MTIpOw0KICAgICAgVHJGY3RNZXNzYWdlKF9fRklMRV9fLCBfX0xJTkVfXywgNCwgIlBvc2l0aW9uIGFmdGVyIDoiLigkcF9tb2RlPT0idGFyIj9mdGVsbCgkcF90YXIpOmd6dGVsbCgkcF90YXIpKSk7DQoNCiAgICAgIC8vIC0tLS0tIENhbGwgdGhlIGFkZGluZyBmY3QgaW5zaWRlIHRoZSB0YXINCiAgICAgIGlmICgoJHZfcmVzdWx0ID0gUGNsVGFySGFuZGxlQWRkTGlzdCgkcF90YXIsICRwX2xpc3QsICRwX21vZGUsICRwX2xpc3RfZGV0YWlsLCAkcF9hZGRfZGlyLCAkcF9yZW1vdmVfZGlyKSkgPT0gMSkNCiAgICAgIHsNCiAgICAgICAgLy8gLS0tLS0gQ2FsbCB0aGUgZm9vdGVyIG9mIHRoZSB0YXIgYXJjaGl2ZQ0KICAgICAgICAkdl9yZXN1bHQgPSBQY2xUYXJIYW5kbGVGb290ZXIoJHBfdGFyLCAkcF9tb2RlKTsNCiAgICAgIH0NCg0KICAgICAgLy8gLS0tLS0gQ2xvc2UgdGhlIHRhcmZpbGUNCiAgICAgIGZjbG9zZSgkcF90YXIpOw0KICAgIH0NCg0KICAgIC8vIC0tLS0tIExvb2sgZm9yIHVua25vd24gdHlwZQ0KICAgIGVsc2UNCiAgICB7DQogICAgICAvLyAtLS0tLSBFcnJvciBsb2cNCiAgICAgIFBjbEVycm9yTG9nKC0zLCAiSW52YWxpZCB0YXIgbW9kZSAkcF9tb2RlIik7DQoNCiAgICAgIC8vIC0tLS0tIFJldHVybg0KICAgICAgVHJGY3RFbmQoX19GSUxFX18sIF9fTElORV9fLCBQY2xFcnJvckNvZGUoKSwgUGNsRXJyb3JTdHJpbmcoKSk7DQogICAgICByZXR1cm4gUGNsRXJyb3JDb2RlKCk7DQogICAgfQ0KDQogICAgLy8gLS0tLS0gUmV0dXJuDQogICAgVHJGY3RFbmQoX19GSUxFX18sIF9fTElORV9fLCAkdl9yZXN1bHQpOw0KICAgIHJldHVybiAkdl9yZXN1bHQ7DQogIH0NCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KICAvLyBGdW5jdGlvbiA6IFBjbFRhckhhbmRsZUFkZExpc3QoKQ0KICAvLyBEZXNjcmlwdGlvbiA6DQogIC8vICAgJHBfYWRkX2RpciBhbmQgJHBfcmVtb3ZlX2RpciB3aWxsIGdpdmUgdGhlIGFiaWxpdHkgdG8gbWVtb3JpemUgYSBwYXRoIHdoaWNoIGlzDQogIC8vICAgZGlmZmVyZW50IGZyb20gdGhlIHJlYWwgcGF0aCBvZiB0aGUgZmlsZS4gVGhpcyBpcyB1c2VmdWxsIGlmIHlvdSB3YW50IHRvIGhhdmUgUGNsVGFyDQogIC8vICAgcnVubmluZyBpbiBhbnkgZGlyZWN0b3J5LCBhbmQgbWVtb3JpemUgcmVsYXRpdmUgcGF0aCBmcm9tIGFuIG90aGVyIGRpcmVjdG9yeS4NCiAgLy8gUGFyYW1ldGVycyA6DQogIC8vICAgJHBfdGFyIDogRmlsZSBkZXNjcmlwdG9yIG9mIHRoZSB0YXIgYXJjaGl2ZQ0KICAvLyAgICRwX2xpc3QgOiBBbiBhcnJheSBjb250YWluaW5nIHRoZSBmaWxlIG9yIGRpcmVjdG9yeSBuYW1lcyB0byBhZGQgaW4gdGhlIHRhcg0KICAvLyAgICRwX21vZGUgOiAidGFyIiBmb3Igbm9ybWFsIHRhciBhcmNoaXZlLCAidGd6IiBmb3IgZ3ppcHBlZCB0YXIgYXJjaGl2ZQ0KICAvLyAgICRwX2xpc3RfZGV0YWlsIDogbGlzdCBvZiBhZGRlZCBmaWxlcyB3aXRoIHRoZWlyIHByb3BlcnRpZXMgKHNwZWNpYWxseSB0aGUgc3RhdHVzIGZpZWxkKQ0KICAvLyAgICRwX2FkZF9kaXIgOiBQYXRoIHRvIGFkZCBpbiB0aGUgZmlsZW5hbWUgcGF0aCBhcmNoaXZlZA0KICAvLyAgICRwX3JlbW92ZV9kaXIgOiBQYXRoIHRvIHJlbW92ZSBpbiB0aGUgZmlsZW5hbWUgcGF0aCBhcmNoaXZlZA0KICAvLyBSZXR1cm4gVmFsdWVzIDoNCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiAgZnVuY3Rpb24gUGNsVGFySGFuZGxlQWRkTGlzdCgkcF90YXIsICRwX2xpc3QsICRwX21vZGUsICYkcF9saXN0X2RldGFpbCwgJHBfYWRkX2RpciwgJHBfcmVtb3ZlX2RpcikNCiAgew0KICAgIFRyRmN0U3RhcnQoX19GSUxFX18sIF9fTElORV9fLCAiUGNsVGFySGFuZGxlQWRkTGlzdCIsICJ0YXI9JyRwX3RhcicsIGxpc3QsIG1vZGU9JyRwX21vZGUnLCBhZGRfZGlyPSckcF9hZGRfZGlyJywgcmVtb3ZlX2Rpcj0nJHBfcmVtb3ZlX2RpciciKTsNCiAgICAkdl9yZXN1bHQ9MTsNCiAgICAkdl9oZWFkZXIgPSBhcnJheSgpOw0KDQogICAgLy8gLS0tLS0gUmVjdXBlcmF0ZSB0aGUgY3VycmVudCBudW1iZXIgb2YgZWx0IGluIGxpc3QNCiAgICAkdl9uYiA9IHNpemVvZigkcF9saXN0X2RldGFpbCk7DQoNCiAgICAvLyAtLS0tLSBDaGVjayB0aGUgcGFyYW1ldGVycw0KICAgIGlmICgkcF90YXIgPT0gMCkNCiAgICB7DQogICAgICAvLyAtLS0tLSBFcnJvciBsb2cNCiAgICAgIFBjbEVycm9yTG9nKC0zLCAiSW52YWxpZCBmaWxlIGRlc2NyaXB0b3IgaW4gZmlsZSAiLl9fRklMRV9fLiIsIGxpbmUgIi5fX0xJTkVfXyk7DQoNCiAgICAgIC8vIC0tLS0tIFJldHVybg0KICAgICAgVHJGY3RFbmQoX19GSUxFX18sIF9fTElORV9fLCBQY2xFcnJvckNvZGUoKSwgUGNsRXJyb3JTdHJpbmcoKSk7DQogICAgICByZXR1cm4gUGNsRXJyb3JDb2RlKCk7DQogICAgfQ0KDQogICAgLy8gLS0tLS0gQ2hlY2sgdGhlIGFyZ3VtZW50cw0KICAgIGlmIChzaXplb2YoJHBfbGlzdCkgPT0gMCkNCiAgICB7DQogICAgICAvLyAtLS0tLSBFcnJvciBsb2cNCiAgICAgIFBjbEVycm9yTG9nKC0zLCAiSW52YWxpZCBmaWxlIGxpc3QgcGFyYW1ldGVyIChpbnZhbGlkIG9yIGVtcHR5IGxpc3QpIik7DQoNCiAgICAgIC8vIC0tLS0tIFJldHVybg0KICAgICAgVHJGY3RFbmQoX19GSUxFX18sIF9fTElORV9fLCBQY2xFcnJvckNvZGUoKSwgUGNsRXJyb3JTdHJpbmcoKSk7DQogICAgICByZXR1cm4gUGNsRXJyb3JDb2RlKCk7DQogICAgfQ0KDQogICAgLy8gLS0tLS0gTG9vcCBvbiB0aGUgZmlsZXMNCiAgICBmb3IgKCRqPTA7ICgkajxjb3VudCgkcF9saXN0KSkgJiYgKCR2X3Jlc3VsdD09MSk7ICRqKyspDQogICAgew0KICAgICAgLy8gLS0tLS0gUmVjdXBlcmF0ZSB0aGUgZmlsZW5hbWUNCiAgICAgICRwX2ZpbGVuYW1lID0gJHBfbGlzdFskal07DQoNCiAgICAgIFRyRmN0TWVzc2FnZShfX0ZJTEVfXywgX19MSU5FX18sIDIsICJMb29raW5nIGZvciBmaWxlIFskcF9maWxlbmFtZV0iKTsNCg0KICAgICAgLy8gLS0tLS0gU2tpcCBlbXB0eSBmaWxlIG5hbWVzDQogICAgICBpZiAoJHBfZmlsZW5hbWUgPT0gIiIpDQogICAgICB7DQogICAgICAgIFRyRmN0TWVzc2FnZShfX0ZJTEVfXywgX19MSU5FX18sIDIsICJTa2lwIGVtcHR5IGZpbGVuYW1lIik7DQogICAgICAgIGNvbnRpbnVlOw0KICAgICAgfQ0KDQogICAgICAvLyAtLS0tLSBDaGVjayB0aGUgZmlsZW5hbWUNCiAgICAgIGlmICghZmlsZV9leGlzdHMoJHBfZmlsZW5hbWUpKQ0KICAgICAgew0KICAgICAgICAvLyAtLS0tLSBFcnJvciBsb2cNCiAgICAgICAgVHJGY3RNZXNzYWdlKF9fRklMRV9fLCBfX0xJTkVfXywgMiwgIkZpbGUgJyRwX2ZpbGVuYW1lJyBkb2VzIG5vdCBleGlzdHMiKTsNCiAgICAgICAgUGNsRXJyb3JMb2coLTQsICJGaWxlICckcF9maWxlbmFtZScgZG9lcyBub3QgZXhpc3RzIik7DQoNCiAgICAgICAgLy8gLS0tLS0gUmV0dXJuDQogICAgICAgIFRyRmN0RW5kKF9fRklMRV9fLCBfX0xJTkVfXywgUGNsRXJyb3JDb2RlKCksIFBjbEVycm9yU3RyaW5nKCkpOw0KICAgICAgICByZXR1cm4gUGNsRXJyb3JDb2RlKCk7DQogICAgICB9DQoNCiAgICAgIC8vIC0tLS0tIENoZWNrIHRoZSBwYXRoIGxlbmd0aA0KICAgICAgaWYgKHN0cmxlbigkcF9maWxlbmFtZSkgPiA5OSkNCiAgICAgIHsNCiAgICAgICAgLy8gLS0tLS0gRXJyb3IgbG9nDQogICAgICAgIFBjbEVycm9yTG9nKC01LCAiRmlsZSBuYW1lIGlzIHRvbyBsb25nIChtYXguIDk5KSA6ICckcF9maWxlbmFtZSciKTsNCg0KICAgICAgICAvLyAtLS0tLSBSZXR1cm4NCiAgICAgICAgVHJGY3RFbmQoX19GSUxFX18sIF9fTElORV9fLCBQY2xFcnJvckNvZGUoKSwgUGNsRXJyb3JTdHJpbmcoKSk7DQogICAgICAgIHJldHVybiBQY2xFcnJvckNvZGUoKTsNCiAgICAgIH0NCg0KICAgICAgVHJGY3RNZXNzYWdlKF9fRklMRV9fLCBfX0xJTkVfXywgNCwgIkZpbGUgcG9zaXRpb24gYmVmb3JlIGhlYWRlciA9Ii4oJHBfbW9kZT09InRhciI/ZnRlbGwoJHBfdGFyKTpnenRlbGwoJHBfdGFyKSkpOw0KDQogICAgICAvLyAtLS0tLSBBZGQgdGhlIGZpbGUNCiAgICAgIGlmICgoJHZfcmVzdWx0ID0gUGNsVGFySGFuZGxlQWRkRmlsZSgkcF90YXIsICRwX2ZpbGVuYW1lLCAkcF9tb2RlLCAkdl9oZWFkZXIsICRwX2FkZF9kaXIsICRwX3JlbW92ZV9kaXIpKSAhPSAxKQ0KICAgICAgew0KICAgICAgICAvLyAtLS0tLSBSZXR1cm4gc3RhdHVzDQogICAgICAgIFRyRmN0RW5kKF9fRklMRV9fLCBfX0xJTkVfXywgJHZfcmVzdWx0KTsNCiAgICAgICAgcmV0dXJuICR2X3Jlc3VsdDsNCiAgICAgIH0NCg0KICAgICAgLy8gLS0tLS0gU3RvcmUgdGhlIGZpbGUgaW5mb3MNCiAgICAgICRwX2xpc3RfZGV0YWlsWyR2X25iKytdID0gJHZfaGVhZGVyOw0KDQogICAgICAvLyAtLS0tLSBMb29rIGZvciBkaXJlY3RvcnkNCiAgICAgIGlmIChpc19kaXIoJHBfZmlsZW5hbWUpKQ0KICAgICAgew0KICAgICAgICBUckZjdE1lc3NhZ2UoX19GSUxFX18sIF9fTElORV9fLCAyLCAiJHBfZmlsZW5hbWUgaXMgYSBkaXJlY3RvcnkiKTsNCg0KICAgICAgICAvLyAtLS0tLSBMb29rIGZvciBwYXRoDQogICAgICAgIGlmICgkcF9maWxlbmFtZSAhPSAiLiIpDQogICAgICAgICAgJHZfcGF0aCA9ICRwX2ZpbGVuYW1lLiIvIjsNCiAgICAgICAgZWxzZQ0KICAgICAgICAgICR2X3BhdGggPSAiIjsNCg0KICAgICAgICAvLyAtLS0tLSBSZWFkIHRoZSBkaXJlY3RvcnkgZm9yIGZpbGVzIGFuZCBzdWItZGlyZWN0b3JpZXMNCiAgICAgICAgJHBfaGRpciA9IG9wZW5kaXIoJHBfZmlsZW5hbWUpOw0KICAgICAgICAkcF9oaXRlbSA9IHJlYWRkaXIoJHBfaGRpcik7IC8vICcuJyBkaXJlY3RvcnkNCiAgICAgICAgJHBfaGl0ZW0gPSByZWFkZGlyKCRwX2hkaXIpOyAvLyAnLi4nIGRpcmVjdG9yeQ0KICAgICAgICB3aGlsZSAoJHBfaGl0ZW0gPSByZWFkZGlyKCRwX2hkaXIpKQ0KICAgICAgICB7DQogICAgICAgICAgLy8gLS0tLS0gTG9vayBmb3IgYSBmaWxlDQogICAgICAgICAgaWYgKGlzX2ZpbGUoJHZfcGF0aC4kcF9oaXRlbSkpDQogICAgICAgICAgew0KICAgICAgICAgICAgVHJGY3RNZXNzYWdlKF9fRklMRV9fLCBfX0xJTkVfXywgNCwgIkFkZCB0aGUgZmlsZSAnIi4kdl9wYXRoLiRwX2hpdGVtLiInIik7DQoNCiAgICAgICAgICAgIC8vIC0tLS0tIEFkZCB0aGUgZmlsZQ0KICAgICAgICAgICAgaWYgKCgkdl9yZXN1bHQgPSBQY2xUYXJIYW5kbGVBZGRGaWxlKCRwX3RhciwgJHZfcGF0aC4kcF9oaXRlbSwgJHBfbW9kZSwgJHZfaGVhZGVyLCAkcF9hZGRfZGlyLCAkcF9yZW1vdmVfZGlyKSkgIT0gMSkNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgLy8gLS0tLS0gUmV0dXJuIHN0YXR1cw0KICAgICAgICAgICAgICBUckZjdEVuZChfX0ZJTEVfXywgX19MSU5FX18sICR2X3Jlc3VsdCk7DQogICAgICAgICAgICAgIHJldHVybiAkdl9yZXN1bHQ7DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIC8vIC0tLS0tIFN0b3JlIHRoZSBmaWxlIGluZm9zDQogICAgICAgICAgICAkcF9saXN0X2RldGFpbFskdl9uYisrXSA9ICR2X2hlYWRlcjsNCiAgICAgICAgICB9DQoNCiAgICAgICAgICAvLyAtLS0tLSBSZWN1cnNpdmUgY2FsbCB0byBQY2xUYXJIYW5kbGVBZGRGaWxlKCkNCiAgICAgICAgICBlbHNlDQogICAgICAgICAgew0KICAgICAgICAgICAgVHJGY3RNZXNzYWdlKF9fRklMRV9fLCBfX0xJTkVfXywgNCwgIiciLiR2X3BhdGguJHBfaGl0ZW0uIicgaXMgYSBkaXJlY3RvcnkiKTsNCg0KICAgICAgICAgICAgLy8gLS0tLS0gTmVlZCBhbiBhcnJheSBhcyBwYXJhbWV0ZXINCiAgICAgICAgICAgICRwX3RlbXBfbGlzdFswXSA9ICR2X3BhdGguJHBfaGl0ZW07DQogICAgICAgICAgICAkdl9yZXN1bHQgPSBQY2xUYXJIYW5kbGVBZGRMaXN0KCRwX3RhciwgJHBfdGVtcF9saXN0LCAkcF9tb2RlLCAkcF9saXN0X2RldGFpbCwgJHBfYWRkX2RpciwgJHBfcmVtb3ZlX2Rpcik7DQogICAgICAgICAgfQ0KICAgICAgICB9DQoNCiAgICAgICAgLy8gLS0tLS0gRnJlZSBtZW1vcnkgZm9yIHRoZSByZWN1cnNpdmUgbG9vcA0KICAgICAgICB1bnNldCgkcF90ZW1wX2xpc3QpOw0KICAgICAgICB1bnNldCgkcF9oZGlyKTsNCiAgICAgICAgdW5zZXQoJHBfaGl0ZW0pOw0KICAgICAgfQ0KICAgICAgZWxzZQ0KICAgICAgew0KICAgICAgICBUckZjdE1lc3NhZ2UoX19GSUxFX18sIF9fTElORV9fLCA0LCAiRmlsZSBwb3NpdGlvbiBhZnRlciBibG9ja3MgPSIuKCRwX21vZGU9PSJ0YXIiP2Z0ZWxsKCRwX3Rhcik6Z3p0ZWxsKCRwX3RhcikpKTsNCiAgICAgIH0NCiAgICB9DQoNCiAgICAvLyAtLS0tLSBSZXR1cm4NCiAgICBUckZjdEVuZChfX0ZJTEVfXywgX19MSU5FX18sICR2X3Jlc3VsdCk7DQogICAgcmV0dXJuICR2X3Jlc3VsdDsNCiAgfQ0KICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KDQogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQogIC8vIEZ1bmN0aW9uIDogUGNsVGFySGFuZGxlQWRkRmlsZSgpDQogIC8vIERlc2NyaXB0aW9uIDoNCiAgLy8gUGFyYW1ldGVycyA6DQogIC8vIFJldHVybiBWYWx1ZXMgOg0KICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KICBmdW5jdGlvbiBQY2xUYXJIYW5kbGVBZGRGaWxlKCRwX3RhciwgJHBfZmlsZW5hbWUsICRwX21vZGUsICYkcF9oZWFkZXIsICRwX2FkZF9kaXIsICRwX3JlbW92ZV9kaXIpDQogIHsNCiAgICBUckZjdFN0YXJ0KF9fRklMRV9fLCBfX0xJTkVfXywgIlBjbFRhckhhbmRsZUFkZEZpbGUiLCAidGFyPSckcF90YXInLCBmaWxlbmFtZT0nJHBfZmlsZW5hbWUnLCBwX21vZGU9JyRwX21vZGUnLCBhZGRfZGlyPSckcF9hZGRfZGlyJywgcmVtb3ZlX2Rpcj0nJHBfcmVtb3ZlX2RpciciKTsNCiAgICAkdl9yZXN1bHQ9MTsNCg0KICAgIC8vIC0tLS0tIENoZWNrIHRoZSBwYXJhbWV0ZXJzDQogICAgaWYgKCRwX3RhciA9PSAwKQ0KICAgIHsNCiAgICAgIC8vIC0tLS0tIEVycm9yIGxvZw0KICAgICAgUGNsRXJyb3JMb2coLTMsICJJbnZhbGlkIGZpbGUgZGVzY3JpcHRvciBpbiBmaWxlICIuX19GSUxFX18uIiwgbGluZSAiLl9fTElORV9fKTsNCg0KICAgICAgLy8gLS0tLS0gUmV0dXJuDQogICAgICBUckZjdEVuZChfX0ZJTEVfXywgX19MSU5FX18sIFBjbEVycm9yQ29kZSgpLCBQY2xFcnJvclN0cmluZygpKTsNCiAgICAgIHJldHVybiBQY2xFcnJvckNvZGUoKTsNCiAgICB9DQoNCiAgICAvLyAtLS0tLSBTa2lwIGVtcHR5IGZpbGUgbmFtZXMNCiAgICBpZiAoJHBfZmlsZW5hbWUgPT0gIiIpDQogICAgew0KICAgICAgLy8gLS0tLS0gRXJyb3IgbG9nDQogICAgICBQY2xFcnJvckxvZygtMywgIkludmFsaWQgZmlsZSBsaXN0IHBhcmFtZXRlciAoaW52YWxpZCBvciBlbXB0eSBsaXN0KSIpOw0KDQogICAgICAvLyAtLS0tLSBSZXR1cm4NCiAgICAgIFRyRmN0RW5kKF9fRklMRV9fLCBfX0xJTkVfXywgUGNsRXJyb3JDb2RlKCksIFBjbEVycm9yU3RyaW5nKCkpOw0KICAgICAgcmV0dXJuIFBjbEVycm9yQ29kZSgpOw0KICAgIH0NCg0KICAgIC8vIC0tLS0tIENhbGN1bGF0ZSB0aGUgc3RvcmVkIGZpbGVuYW1lDQogICAgJHZfc3RvcmVkX2ZpbGVuYW1lID0gJHBfZmlsZW5hbWU7DQogICAgaWYgKCRwX3JlbW92ZV9kaXIgIT0gIiIpDQogICAgew0KICAgICAgaWYgKHN1YnN0cigkcF9yZW1vdmVfZGlyLCAtMSkgIT0gJy8nKQ0KICAgICAgICAkcF9yZW1vdmVfZGlyIC49ICIvIjsNCg0KICAgICAgaWYgKChzdWJzdHIoJHBfZmlsZW5hbWUsIDAsIDIpID09ICIuLyIpIHx8IChzdWJzdHIoJHBfcmVtb3ZlX2RpciwgMCwgMikgPT0gIi4vIikpDQogICAgICB7DQogICAgICAgIGlmICgoc3Vic3RyKCRwX2ZpbGVuYW1lLCAwLCAyKSA9PSAiLi8iKSAmJiAoc3Vic3RyKCRwX3JlbW92ZV9kaXIsIDAsIDIpICE9ICIuLyIpKQ0KICAgICAgICAgICRwX3JlbW92ZV9kaXIgPSAiLi8iLiRwX3JlbW92ZV9kaXI7DQogICAgICAgIGlmICgoc3Vic3RyKCRwX2ZpbGVuYW1lLCAwLCAyKSAhPSAiLi8iKSAmJiAoc3Vic3RyKCRwX3JlbW92ZV9kaXIsIDAsIDIpID09ICIuLyIpKQ0KICAgICAgICAgICRwX3JlbW92ZV9kaXIgPSBzdWJzdHIoJHBfcmVtb3ZlX2RpciwgMik7DQogICAgICB9DQoNCiAgICAgIGlmIChzdWJzdHIoJHBfZmlsZW5hbWUsIDAsIHN0cmxlbigkcF9yZW1vdmVfZGlyKSkgPT0gJHBfcmVtb3ZlX2RpcikNCiAgICAgIHsNCiAgICAgICAgJHZfc3RvcmVkX2ZpbGVuYW1lID0gc3Vic3RyKCRwX2ZpbGVuYW1lLCBzdHJsZW4oJHBfcmVtb3ZlX2RpcikpOw0KICAgICAgICBUckZjdE1lc3NhZ2UoX19GSUxFX18sIF9fTElORV9fLCAzLCAiUmVtb3ZlIHBhdGggJyRwX3JlbW92ZV9kaXInIGluIGZpbGUgJyRwX2ZpbGVuYW1lJyA9ICckdl9zdG9yZWRfZmlsZW5hbWUnIik7DQogICAgICB9DQogICAgfQ0KICAgIGlmICgkcF9hZGRfZGlyICE9ICIiKQ0KICAgIHsNCiAgICAgIGlmIChzdWJzdHIoJHBfYWRkX2RpciwgLTEpID09ICIvIikNCiAgICAgICAgJHZfc3RvcmVkX2ZpbGVuYW1lID0gJHBfYWRkX2Rpci4kdl9zdG9yZWRfZmlsZW5hbWU7DQogICAgICBlbHNlDQogICAgICAgICR2X3N0b3JlZF9maWxlbmFtZSA9ICRwX2FkZF9kaXIuIi8iLiR2X3N0b3JlZF9maWxlbmFtZTsNCiAgICAgIFRyRmN0TWVzc2FnZShfX0ZJTEVfXywgX19MSU5FX18sIDMsICJBZGQgcGF0aCAnJHBfYWRkX2RpcicgaW4gZmlsZSAnJHBfZmlsZW5hbWUnID0gJyR2X3N0b3JlZF9maWxlbmFtZSciKTsNCiAgICB9DQoNCiAgICAvLyAtLS0tLSBDaGVjayB0aGUgcGF0aCBsZW5ndGgNCiAgICBpZiAoc3RybGVuKCR2X3N0b3JlZF9maWxlbmFtZSkgPiA5OSkNCiAgICB7DQogICAgICAvLyAtLS0tLSBFcnJvciBsb2cNCiAgICAgIFBjbEVycm9yTG9nKC01LCAiU3RvcmVkIGZpbGUgbmFtZSBpcyB0b28gbG9uZyAobWF4LiA5OSkgOiAnJHZfc3RvcmVkX2ZpbGVuYW1lJyIpOw0KDQogICAgICAvLyAtLS0tLSBSZXR1cm4NCiAgICAgIFRyRmN0RW5kKF9fRklMRV9fLCBfX0xJTkVfXywgUGNsRXJyb3JDb2RlKCksIFBjbEVycm9yU3RyaW5nKCkpOw0KICAgICAgcmV0dXJuIFBjbEVycm9yQ29kZSgpOw0KICAgIH0NCg0KICAgIC8vIC0tLS0tIExvb2sgZm9yIGEgZmlsZQ0KICAgIGlmIChpc19maWxlKCRwX2ZpbGVuYW1lKSkNCiAgICB7DQogICAgICAvLyAtLS0tLSBPcGVuIHRoZSBzb3VyY2UgZmlsZQ0KICAgICAgaWYgKCgkdl9maWxlID0gZm9wZW4oJHBfZmlsZW5hbWUsICJyYiIpKSA9PSAwKQ0KICAgICAgew0KICAgICAgICAvLyAtLS0tLSBFcnJvciBsb2cNCiAgICAgICAgUGNsRXJyb3JMb2coLTIsICJVbmFibGUgdG8gb3BlbiBmaWxlICckcF9maWxlbmFtZScgaW4gYmluYXJ5IHJlYWQgbW9kZSIpOw0KDQogICAgICAgIC8vIC0tLS0tIFJldHVybg0KICAgICAgICBUckZjdEVuZChfX0ZJTEVfXywgX19MSU5FX18sIFBjbEVycm9yQ29kZSgpLCBQY2xFcnJvclN0cmluZygpKTsNCiAgICAgICAgcmV0dXJuIFBjbEVycm9yQ29kZSgpOw0KICAgICAgfQ0KDQogICAgICAvLyAtLS0tLSBDYWxsIHRoZSBoZWFkZXIgZ2VuZXJhdGlvbg0KICAgICAgaWYgKCgkdl9yZXN1bHQgPSBQY2xUYXJIYW5kbGVIZWFkZXIoJHBfdGFyLCAkcF9maWxlbmFtZSwgJHBfbW9kZSwgJHBfaGVhZGVyLCAkdl9zdG9yZWRfZmlsZW5hbWUpKSAhPSAxKQ0KICAgICAgew0KICAgICAgICAvLyAtLS0tLSBSZXR1cm4gc3RhdHVzDQogICAgICAgIFRyRmN0RW5kKF9fRklMRV9fLCBfX0xJTkVfXywgJHZfcmVzdWx0KTsNCiAgICAgICAgcmV0dXJuICR2X3Jlc3VsdDsNCiAgICAgIH0NCg0KICAgICAgVHJGY3RNZXNzYWdlKF9fRklMRV9fLCBfX0xJTkVfXywgNCwgIkZpbGUgcG9zaXRpb24gYWZ0ZXIgaGVhZGVyID0iLigkcF9tb2RlPT0idGFyIj9mdGVsbCgkcF90YXIpOmd6dGVsbCgkcF90YXIpKSk7DQoNCiAgICAgIC8vIC0tLS0tIFJlYWQgdGhlIGZpbGUgYnkgNTEyIG9jdGV0cyBibG9ja3MNCiAgICAgICRpPTA7DQogICAgICB3aGlsZSAoKCR2X2J1ZmZlciA9IGZyZWFkKCR2X2ZpbGUsIDUxMikpICE9ICIiKQ0KICAgICAgew0KICAgICAgICAkdl9iaW5hcnlfZGF0YSA9IHBhY2soImE1MTIiLCAiJHZfYnVmZmVyIik7DQogICAgICAgIGlmICgkcF9tb2RlID09ICJ0YXIiKQ0KICAgICAgICAgIGZwdXRzKCRwX3RhciwgJHZfYmluYXJ5X2RhdGEpOw0KICAgICAgICBlbHNlDQogICAgICAgICAgZ3pwdXRzKCRwX3RhciwgJHZfYmluYXJ5X2RhdGEpOw0KICAgICAgICAkaSsrOw0KICAgICAgfQ0KICAgICAgVHJGY3RNZXNzYWdlKF9fRklMRV9fLCBfX0xJTkVfXywgMiwgIiRpIDUxMiBieXRlcyBibG9ja3MiKTsNCg0KICAgICAgLy8gLS0tLS0gQ2xvc2UgdGhlIGZpbGUNCiAgICAgIGZjbG9zZSgkdl9maWxlKTsNCg0KICAgICAgVHJGY3RNZXNzYWdlKF9fRklMRV9fLCBfX0xJTkVfXywgNCwgIkZpbGUgcG9zaXRpb24gYWZ0ZXIgYmxvY2tzID0iLigkcF9tb2RlPT0idGFyIj9mdGVsbCgkcF90YXIpOmd6dGVsbCgkcF90YXIpKSk7DQogICAgfQ0KDQogICAgLy8gLS0tLS0gTG9vayBmb3IgYSBkaXJlY3RvcnkNCiAgICBlbHNlDQogICAgew0KICAgICAgLy8gLS0tLS0gQ2FsbCB0aGUgaGVhZGVyIGdlbmVyYXRpb24NCiAgICAgIGlmICgoJHZfcmVzdWx0ID0gUGNsVGFySGFuZGxlSGVhZGVyKCRwX3RhciwgJHBfZmlsZW5hbWUsICRwX21vZGUsICRwX2hlYWRlciwgJHZfc3RvcmVkX2ZpbGVuYW1lKSkgIT0gMSkNCiAgICAgIHsNCiAgICAgICAgLy8gLS0tLS0gUmV0dXJuIHN0YXR1cw0KICAgICAgICBUckZjdEVuZChfX0ZJTEVfXywgX19MSU5FX18sICR2X3Jlc3VsdCk7DQogICAgICAgIHJldHVybiAkdl9yZXN1bHQ7DQogICAgICB9DQoNCiAgICAgIFRyRmN0TWVzc2FnZShfX0ZJTEVfXywgX19MSU5FX18sIDQsICJGaWxlIHBvc2l0aW9uIGFmdGVyIGhlYWRlciA9Ii4oJHBfbW9kZT09InRhciI/ZnRlbGwoJHBfdGFyKTpnenRlbGwoJHBfdGFyKSkpOw0KICAgIH0NCg0KICAgIC8vIC0tLS0tIFJldHVybg0KICAgIFRyRmN0RW5kKF9fRklMRV9fLCBfX0xJTkVfXywgJHZfcmVzdWx0KTsNCiAgICByZXR1cm4gJHZfcmVzdWx0Ow0KICB9DQogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiAgLy8gRnVuY3Rpb24gOiBQY2xUYXJIYW5kbGVIZWFkZXIoKQ0KICAvLyBEZXNjcmlwdGlvbiA6DQogIC8vICAgVGhpcyBmdW5jdGlvbiBjcmVhdGVzIGluIHRoZSBUQVIgJHBfdGFyLCB0aGUgVEFSIGhlYWRlciBmb3IgdGhlIGZpbGUNCiAgLy8gICAkcF9maWxlbmFtZS4NCiAgLy8NCiAgLy8gICAxLiBUaGUgaW5mb3JtYXRpb25zIG5lZWRlZCB0byBjb21wb3NlIHRoZSBoZWFkZXIgYXJlIHJlY3VwZXJhdGVkIGFuZCBmb3JtYXR0ZWQNCiAgLy8gICAyLiBUd28gYmluYXJ5IHN0cmluZ3MgYXJlIGNvbXBvc2VkIGZvciB0aGUgZmlyc3QgcGFydCBvZiB0aGUgaGVhZGVyLCBiZWZvcmUNCiAgLy8gICAgICBhbmQgYWZ0ZXIgY2hlY2tzdW0gZmllbGQuDQogIC8vICAgMy4gVGhlIGNoZWNrc3VtIGlzIGNhbGN1bGF0ZWQgZnJvbSB0aGUgdHdvIGJpbmFyeSBzdHJpbmdzDQogIC8vICAgNC4gVGhlIGhlYWRlciBpcyB3cml0ZSBpbiB0aGUgdGFyIGZpbGUgKGZpcnN0IGJpbmFyeSBzdHJpbmcsIGJpbmFyeSBzdHJpbmcNCiAgLy8gICAgICBmb3IgY2hlY2tzdW0gYW5kIGxhc3QgYmluYXJ5IHN0cmluZykuDQogIC8vIFBhcmFtZXRlcnMgOg0KICAvLyAgICRwX3RhciA6IGEgdmFsaWQgZmlsZSBkZXNjcmlwdG9yLCBvcGVuZWQgaW4gd3JpdGUgbW9kZSwNCiAgLy8gICAkcF9maWxlbmFtZSA6IFRoZSBuYW1lIG9mIHRoZSBmaWxlIHRoZSBoZWFkZXIgaXMgZm9yLA0KICAvLyAgICRwX21vZGUgOiBUaGUgbW9kZSBvZiB0aGUgYXJjaGl2ZSAoInRhciIgb3IgInRneiIpLg0KICAvLyAgICRwX2hlYWRlciA6IEEgcG9pbnRlciB0byBhIGFycmF5IHdoZXJlIHdpbGwgYmUgc2V0IHRoZSBmaWxlIHByb3BlcnRpZXMNCiAgLy8gUmV0dXJuIFZhbHVlcyA6DQogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQogIGZ1bmN0aW9uIFBjbFRhckhhbmRsZUhlYWRlcigkcF90YXIsICRwX2ZpbGVuYW1lLCAkcF9tb2RlLCAmJHBfaGVhZGVyLCAkcF9zdG9yZWRfZmlsZW5hbWUpDQogIHsNCiAgICBUckZjdFN0YXJ0KF9fRklMRV9fLCBfX0xJTkVfXywgIlBjbFRhckhhbmRsZUhlYWRlciIsICJ0YXI9JHBfdGFyLCBmaWxlPSckcF9maWxlbmFtZScsIG1vZGU9JyRwX21vZGUnLCBzdG9yZWRfZmlsZW5hbWU9JyRwX3N0b3JlZF9maWxlbmFtZSciKTsNCiAgICAkdl9yZXN1bHQ9MTsNCg0KICAgIC8vIC0tLS0tIENoZWNrIHRoZSBwYXJhbWV0ZXJzDQogICAgaWYgKCgkcF90YXIgPT0gMCkgfHwgKCRwX2ZpbGVuYW1lID09ICIiKSkNCiAgICB7DQogICAgICAvLyAtLS0tLSBFcnJvciBsb2cNCiAgICAgIFBjbEVycm9yTG9nKC0zLCAiSW52YWxpZCBmaWxlIGRlc2NyaXB0b3IgaW4gZmlsZSAiLl9fRklMRV9fLiIsIGxpbmUgIi5fX0xJTkVfXyk7DQoNCiAgICAgIC8vIC0tLS0tIFJldHVybg0KICAgICAgVHJGY3RFbmQoX19GSUxFX18sIF9fTElORV9fLCBQY2xFcnJvckNvZGUoKSwgUGNsRXJyb3JTdHJpbmcoKSk7DQogICAgICByZXR1cm4gUGNsRXJyb3JDb2RlKCk7DQogICAgfQ0KDQogICAgLy8gLS0tLS0gRmlsZW5hbWUgKHJlZHVjZSB0aGUgcGF0aCBvZiBzdG9yZWQgbmFtZSkNCiAgICBpZiAoJHBfc3RvcmVkX2ZpbGVuYW1lID09ICIiKQ0KICAgICAgJHBfc3RvcmVkX2ZpbGVuYW1lID0gJHBfZmlsZW5hbWU7DQogICAgJHZfcmVkdWNlX2ZpbGVuYW1lID0gUGNsVGFySGFuZGxlUGF0aFJlZHVjdGlvbigkcF9zdG9yZWRfZmlsZW5hbWUpOw0KICAgIFRyRmN0TWVzc2FnZShfX0ZJTEVfXywgX19MSU5FX18sIDIsICJGaWxlbmFtZSAocmVkdWNlZCkgJyR2X3JlZHVjZV9maWxlbmFtZScsIHN0cmxlbiAiLnN0cmxlbigkdl9yZWR1Y2VfZmlsZW5hbWUpKTsNCg0KICAgIC8vIC0tLS0tIEdldCBmaWxlIGluZm8NCiAgICAkdl9pbmZvID0gc3RhdCgkcF9maWxlbmFtZSk7DQogICAgJHZfdWlkID0gc3ByaW50ZigiJTZzICIsIERlY09jdCgkdl9pbmZvWzRdKSk7DQogICAgJHZfZ2lkID0gc3ByaW50ZigiJTZzICIsIERlY09jdCgkdl9pbmZvWzVdKSk7DQogICAgVHJGY3RNZXNzYWdlKF9fRklMRV9fLCBfX0xJTkVfXywgMywgInVpZD0kdl91aWQsIGdpZD0kdl9naWQiKTsNCiAgICAkdl9wZXJtcyA9IHNwcmludGYoIiU2cyAiLCBEZWNPY3QoZmlsZXBlcm1zKCRwX2ZpbGVuYW1lKSkpOw0KICAgIFRyRmN0TWVzc2FnZShfX0ZJTEVfXywgX19MSU5FX18sIDMsICJmaWxlIHBlcm1pc3Npb25zICR2X3Blcm1zIik7DQoNCiAgICAvLyAtLS0tLSBGaWxlIG10aW1lDQogICAgJHZfbXRpbWVfZGF0YSA9IGZpbGVtdGltZSgkcF9maWxlbmFtZSk7DQogICAgVHJGY3RNZXNzYWdlKF9fRklMRV9fLCBfX0xJTkVfXywgMiwgIkZpbGUgbXRpbWUgOiAkdl9tdGltZV9kYXRhIik7DQogICAgJHZfbXRpbWUgPSBzcHJpbnRmKCIlMTFzIiwgRGVjT2N0KCR2X210aW1lX2RhdGEpKTsNCg0KICAgIC8vIC0tLS0tIEZpbGUgdHlwZWZsYWcNCiAgICAvLyAnMCcgb3IgJ1wwJyBpcyB0aGUgY29kZSBmb3IgcmVndWxhciBmaWxlDQogICAgLy8gJzUnIGlzIGRpcmVjdG9yeQ0KICAgIGlmIChpc19kaXIoJHBfZmlsZW5hbWUpKQ0KICAgIHsNCiAgICAgICR2X3R5cGVmbGFnID0gIjUiOw0KICAgICAgJHZfc2l6ZSA9IDA7DQogICAgfQ0KICAgIGVsc2UNCiAgICB7DQogICAgICAkdl90eXBlZmxhZyA9ICIiOw0KDQogICAgICAvLyAtLS0tLSBHZXQgdGhlIGZpbGUgc2l6ZQ0KICAgICAgY2xlYXJzdGF0Y2FjaGUoKTsNCiAgICAgICR2X3NpemUgPSBmaWxlc2l6ZSgkcF9maWxlbmFtZSk7DQogICAgfQ0KDQogICAgVHJGY3RNZXNzYWdlKF9fRklMRV9fLCBfX0xJTkVfXywgMiwgIkZpbGUgc2l6ZSA6ICR2X3NpemUiKTsNCiAgICAkdl9zaXplID0gc3ByaW50ZigiJTExcyAiLCBEZWNPY3QoJHZfc2l6ZSkpOw0KDQogICAgVHJGY3RNZXNzYWdlKF9fRklMRV9fLCBfX0xJTkVfXywgMiwgIkZpbGUgdHlwZWZsYWcgOiAkdl90eXBlZmxhZyIpOw0KDQogICAgLy8gLS0tLS0gTGlua25hbWUNCiAgICAkdl9saW5rbmFtZSA9ICIiOw0KDQogICAgLy8gLS0tLS0gTWFnaWMNCiAgICAkdl9tYWdpYyA9ICIiOw0KDQogICAgLy8gLS0tLS0gVmVyc2lvbg0KICAgICR2X3ZlcnNpb24gPSAiIjsNCg0KICAgIC8vIC0tLS0tIHVuYW1lDQogICAgJHZfdW5hbWUgPSAiIjsNCg0KICAgIC8vIC0tLS0tIGduYW1lDQogICAgJHZfZ25hbWUgPSAiIjsNCg0KICAgIC8vIC0tLS0tIGRldm1ham9yDQogICAgJHZfZGV2bWFqb3IgPSAiIjsNCg0KICAgIC8vIC0tLS0tIGRldm1pbm9yDQogICAgJHZfZGV2bWlub3IgPSAiIjsNCg0KICAgIC8vIC0tLS0tIHByZWZpeA0KICAgICR2X3ByZWZpeCA9ICIiOw0KDQogICAgLy8gLS0tLS0gQ29tcG9zZSB0aGUgYmluYXJ5IHN0cmluZyBvZiB0aGUgaGVhZGVyIGluIHR3byBwYXJ0cyBhcnJvdW5kIHRoZSBjaGVja3N1bSBwb3NpdGlvbg0KICAgICR2X2JpbmFyeV9kYXRhX2ZpcnN0ID0gcGFjaygiYTEwMGE4YThhOGExMkExMiIsICR2X3JlZHVjZV9maWxlbmFtZSwgJHZfcGVybXMsICR2X3VpZCwgJHZfZ2lkLCAkdl9zaXplLCAkdl9tdGltZSk7DQogICAgJHZfYmluYXJ5X2RhdGFfbGFzdCA9IHBhY2soImExYTEwMGE2YTJhMzJhMzJhOGE4YTE1NWExMiIsICR2X3R5cGVmbGFnLCAkdl9saW5rbmFtZSwgJHZfbWFnaWMsICR2X3ZlcnNpb24sICR2X3VuYW1lLCAkdl9nbmFtZSwgJHZfZGV2bWFqb3IsICR2X2Rldm1pbm9yLCAkdl9wcmVmaXgsICIiKTsNCg0KICAgIC8vIC0tLS0tIENhbGN1bGF0ZSB0aGUgY2hlY2tzdW0NCiAgICAkdl9jaGVja3N1bSA9IDA7DQogICAgLy8gLi4uLi4gRmlyc3QgcGFydCBvZiB0aGUgaGVhZGVyDQogICAgZm9yICgkaT0wOyAkaTwxNDg7ICRpKyspDQogICAgew0KICAgICAgJHZfY2hlY2tzdW0gKz0gb3JkKHN1YnN0cigkdl9iaW5hcnlfZGF0YV9maXJzdCwkaSwxKSk7DQogICAgfQ0KICAgIC8vIC4uLi4uIElnbm9yZSB0aGUgY2hlY2tzdW0gdmFsdWUgYW5kIHJlcGxhY2UgaXQgYnkgJyAnIChzcGFjZSkNCiAgICBmb3IgKCRpPTE0ODsgJGk8MTU2OyAkaSsrKQ0KICAgIHsNCiAgICAgICR2X2NoZWNrc3VtICs9IG9yZCgnICcpOw0KICAgIH0NCiAgICAvLyAuLi4uLiBMYXN0IHBhcnQgb2YgdGhlIGhlYWRlcg0KICAgIGZvciAoJGk9MTU2LCAkaj0wOyAkaTw1MTI7ICRpKyssICRqKyspDQogICAgew0KICAgICAgJHZfY2hlY2tzdW0gKz0gb3JkKHN1YnN0cigkdl9iaW5hcnlfZGF0YV9sYXN0LCRqLDEpKTsNCiAgICB9DQogICAgVHJGY3RNZXNzYWdlKF9fRklMRV9fLCBfX0xJTkVfXywgMywgIkNhbGN1bGF0ZWQgY2hlY2tzdW0gOiAkdl9jaGVja3N1bSIpOw0KDQogICAgLy8gLS0tLS0gV3JpdGUgdGhlIGZpcnN0IDE0OCBieXRlcyBvZiB0aGUgaGVhZGVyIGluIHRoZSBhcmNoaXZlDQogICAgaWYgKCRwX21vZGUgPT0gInRhciIpDQogICAgICBmcHV0cygkcF90YXIsICR2X2JpbmFyeV9kYXRhX2ZpcnN0LCAxNDgpOw0KICAgIGVsc2UNCiAgICAgIGd6cHV0cygkcF90YXIsICR2X2JpbmFyeV9kYXRhX2ZpcnN0LCAxNDgpOw0KDQogICAgLy8gLS0tLS0gV3JpdGUgdGhlIGNhbGN1bGF0ZWQgY2hlY2tzdW0NCiAgICAkdl9jaGVja3N1bSA9IHNwcmludGYoIiU2cyAiLCBEZWNPY3QoJHZfY2hlY2tzdW0pKTsNCiAgICAkdl9iaW5hcnlfZGF0YSA9IHBhY2soImE4IiwgJHZfY2hlY2tzdW0pOw0KICAgIGlmICgkcF9tb2RlID09ICJ0YXIiKQ0KICAgICAgZnB1dHMoJHBfdGFyLCAkdl9iaW5hcnlfZGF0YSwgOCk7DQogICAgZWxzZQ0KICAgICAgZ3pwdXRzKCRwX3RhciwgJHZfYmluYXJ5X2RhdGEsIDgpOw0KDQogICAgLy8gLS0tLS0gV3JpdGUgdGhlIGxhc3QgMzU2IGJ5dGVzIG9mIHRoZSBoZWFkZXIgaW4gdGhlIGFyY2hpdmUNCiAgICBpZiAoJHBfbW9kZSA9PSAidGFyIikNCiAgICAgIGZwdXRzKCRwX3RhciwgJHZfYmluYXJ5X2RhdGFfbGFzdCwgMzU2KTsNCiAgICBlbHNlDQogICAgICBnenB1dHMoJHBfdGFyLCAkdl9iaW5hcnlfZGF0YV9sYXN0LCAzNTYpOw0KDQogICAgLy8gLS0tLS0gU2V0IHRoZSBwcm9wZXJ0aWVzIGluIHRoZSBoZWFkZXIgInN0cnVjdHVyZSINCiAgICAkcF9oZWFkZXJbZmlsZW5hbWVdID0gJHZfcmVkdWNlX2ZpbGVuYW1lOw0KICAgICRwX2hlYWRlclttb2RlXSA9ICR2X3Blcm1zOw0KICAgICRwX2hlYWRlclt1aWRdID0gJHZfdWlkOw0KICAgICRwX2hlYWRlcltnaWRdID0gJHZfZ2lkOw0KICAgICRwX2hlYWRlcltzaXplXSA9ICR2X3NpemU7DQogICAgJHBfaGVhZGVyW210aW1lXSA9ICR2X210aW1lOw0KICAgICRwX2hlYWRlclt0eXBlZmxhZ10gPSAkdl90eXBlZmxhZzsNCiAgICAkcF9oZWFkZXJbc3RhdHVzXSA9ICJhZGRlZCI7DQoNCiAgICAvLyAtLS0tLSBSZXR1cm4NCiAgICBUckZjdEVuZChfX0ZJTEVfXywgX19MSU5FX18sICR2X3Jlc3VsdCk7DQogICAgcmV0dXJuICR2X3Jlc3VsdDsNCiAgfQ0KICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KDQogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQogIC8vIEZ1bmN0aW9uIDogUGNsVGFySGFuZGxlRm9vdGVyKCkNCiAgLy8gRGVzY3JpcHRpb24gOg0KICAvLyBQYXJhbWV0ZXJzIDoNCiAgLy8gUmV0dXJuIFZhbHVlcyA6DQogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQogIGZ1bmN0aW9uIFBjbFRhckhhbmRsZUZvb3RlcigkcF90YXIsICRwX21vZGUpDQogIHsNCiAgICBUckZjdFN0YXJ0KF9fRklMRV9fLCBfX0xJTkVfXywgIlBjbFRhckhhbmRsZUZvb3RlciIsICJ0YXI9JyRwX3RhcicsIHBfbW9kZT0kcF9tb2RlIik7DQogICAgJHZfcmVzdWx0PTE7DQoNCiAgICAvLyAtLS0tLSBXcml0ZSB0aGUgbGFzdCAwIGZpbGxlZCBibG9jayBmb3IgZW5kIG9mIGFyY2hpdmUNCiAgICAkdl9iaW5hcnlfZGF0YSA9IHBhY2soImE1MTIiLCAiIik7DQogICAgaWYgKCRwX21vZGUgPT0gInRhciIpDQogICAgICBmcHV0cygkcF90YXIsICR2X2JpbmFyeV9kYXRhKTsNCiAgICBlbHNlDQogICAgICBnenB1dHMoJHBfdGFyLCAkdl9iaW5hcnlfZGF0YSk7DQoNCiAgICAvLyAtLS0tLSBSZXR1cm4NCiAgICBUckZjdEVuZChfX0ZJTEVfXywgX19MSU5FX18sICR2X3Jlc3VsdCk7DQogICAgcmV0dXJuICR2X3Jlc3VsdDsNCiAgfQ0KICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KDQogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQogIC8vIEZ1bmN0aW9uIDogUGNsVGFySGFuZGxlRXh0cmFjdCgpDQogIC8vIERlc2NyaXB0aW9uIDoNCiAgLy8gUGFyYW1ldGVycyA6DQogIC8vICAgJHBfdGFybmFtZSA6IEZpbGVuYW1lIG9mIHRoZSB0YXIgKG9yIHRneikgYXJjaGl2ZQ0KICAvLyAgICRwX2ZpbGVfbGlzdCA6IEFuIGFycmF5IHdoaWNoIGNvbnRhaW5zIHRoZSBsaXN0IG9mIGZpbGVzIHRvIGV4dHJhY3QsIHRoaXMNCiAgLy8gICAgICAgICAgICAgICAgICBhcnJheSBtYXkgYmUgZW1wdHkgd2hlbiAkcF9tb2RlIGlzICdjb21wbGV0ZScNCiAgLy8gICAkcF9saXN0X2RldGFpbCA6IEFuIGFycmF5IHdoZXJlIHdpbGwgYmUgcGxhY2VkIHRoZSBwcm9wZXJ0aWVzIG9mICBlYWNoIGV4dHJhY3RlZC9saXN0ZWQgZmlsZQ0KICAvLyAgICRwX21vZGUgOiAnY29tcGxldGUnIHdpbGwgZXh0cmFjdCBhbGwgZmlsZXMgZnJvbSB0aGUgYXJjaGl2ZSwNCiAgLy8gICAgICAgICAgICAgJ3BhcnRpYWwnIHdpbGwgbG9vayBmb3IgZmlsZXMgaW4gJHBfZmlsZV9saXN0DQogIC8vICAgICAgICAgICAgICdsaXN0JyB3aWxsIG9ubHkgbGlzdCB0aGUgZmlsZXMgZnJvbSB0aGUgYXJjaGl2ZSB3aXRob3V0IGFueSBleHRyYWN0DQogIC8vICAgJHBfcGF0aCA6IFBhdGggdG8gYWRkIHdoaWxlIHdyaXRpbmcgdGhlIGV4dHJhY3RlZCBmaWxlcw0KICAvLyAgICRwX3Rhcl9tb2RlIDogJ3RhcicgZm9yIEdOVSBUQVIgYXJjaGl2ZSwgJ3RneicgZm9yIGNvbXByZXNzZWQgYXJjaGl2ZQ0KICAvLyAgICRwX3JlbW92ZV9wYXRoIDogUGF0aCB0byByZW1vdmUgKGZyb20gdGhlIGZpbGUgbWVtb3JpemVkIHBhdGgpIHdoaWxlIHdyaXRpbmcgdGhlDQogIC8vICAgICAgICAgICAgICAgICAgICBleHRyYWN0ZWQgZmlsZXMuIElmIHRoZSBwYXRoIGRvZXMgbm90IG1hdGNoIHRoZSBmaWxlIHBhdGgsDQogIC8vICAgICAgICAgICAgICAgICAgICB0aGUgZmlsZSBpcyBleHRyYWN0ZWQgd2l0aCBpdHMgbWVtb3JpemVkIHBhdGguDQogIC8vICAgICAgICAgICAgICAgICAgICAkcF9yZW1vdmVfcGF0aCBkb2VzIG5vdCBhcHBseSB0byAnbGlzdCcgbW9kZS4NCiAgLy8gICAgICAgICAgICAgICAgICAgICRwX3BhdGggYW5kICRwX3JlbW92ZV9wYXRoIGFyZSBjb21tdWxhdGl2ZS4NCiAgLy8gUmV0dXJuIFZhbHVlcyA6DQogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQogIGZ1bmN0aW9uIFBjbFRhckhhbmRsZUV4dHJhY3QoJHBfdGFybmFtZSwgJHBfZmlsZV9saXN0LCAmJHBfbGlzdF9kZXRhaWwsICRwX21vZGUsICRwX3BhdGgsICRwX3Rhcl9tb2RlLCAkcF9yZW1vdmVfcGF0aCkNCiAgew0KICAgIFRyRmN0U3RhcnQoX19GSUxFX18sIF9fTElORV9fLCAiUGNsVGFySGFuZGxlRXh0cmFjdCIsICJhcmNoaXZlPSckcF90YXJuYW1lJywgbGlzdCwgbW9kZT0kcF9tb2RlLCBwYXRoPSRwX3BhdGgsIHRhcl9tb2RlPSRwX3Rhcl9tb2RlLCByZW1vdmVfcGF0aD0nJHBfcmVtb3ZlX3BhdGgnIik7DQogICAgJHZfcmVzdWx0PTE7DQogICAgJHZfbmIgPSAwOw0KICAgICR2X2V4dHJhY3RfYWxsID0gVFJVRTsNCiAgICAkdl9saXN0aW5nID0gRkFMU0U7DQoNCiAgICAvLyAtLS0tLSBDaGVjayB0aGUgcGF0aA0KICAgIGlmICgoJHBfcGF0aCA9PSAiIikgfHwgKChzdWJzdHIoJHBfcGF0aCwgMCwgMSkgIT0gIi8iKSAmJiAoc3Vic3RyKCRwX3BhdGgsIDAsIDMpICE9ICIuLi8iKSkpDQogICAgICAkcF9wYXRoID0gIi4vIi4kcF9wYXRoOw0KDQogICAgLy8gLS0tLS0gTG9vayBmb3IgcGF0aCB0byByZW1vdmUgZm9ybWF0IChzaG91bGQgZW5kIGJ5IC8pDQogICAgaWYgKCgkcF9yZW1vdmVfcGF0aCAhPSAiIikgJiYgKHN1YnN0cigkcF9yZW1vdmVfcGF0aCwgLTEpICE9ICcvJykpDQogICAgew0KICAgICAgJHBfcmVtb3ZlX3BhdGggLj0gJy8nOw0KICAgIH0NCiAgICAkcF9yZW1vdmVfcGF0aF9zaXplID0gc3RybGVuKCRwX3JlbW92ZV9wYXRoKTsNCg0KICAgIC8vIC0tLS0tIFN0dWR5IHRoZSBtb2RlDQogICAgc3dpdGNoICgkcF9tb2RlKSB7DQogICAgICBjYXNlICJjb21wbGV0ZSIgOg0KICAgICAgICAvLyAtLS0tLSBGbGFnIGV4dHJhY3Qgb2YgYWxsIGZpbGVzDQogICAgICAgICR2X2V4dHJhY3RfYWxsID0gVFJVRTsNCiAgICAgICAgJHZfbGlzdGluZyA9IEZBTFNFOw0KICAgICAgYnJlYWs7DQogICAgICBjYXNlICJwYXJ0aWFsIiA6DQogICAgICAgICAgLy8gLS0tLS0gRmxhZyBleHRyYWN0IG9mIHNwZWNpZmljIGZpbGVzDQogICAgICAgICAgJHZfZXh0cmFjdF9hbGwgPSBGQUxTRTsNCiAgICAgICAgICAkdl9saXN0aW5nID0gRkFMU0U7DQogICAgICBicmVhazsNCiAgICAgIGNhc2UgImxpc3QiIDoNCiAgICAgICAgICAvLyAtLS0tLSBGbGFnIGxpc3Qgb2YgYWxsIGZpbGVzDQogICAgICAgICAgJHZfZXh0cmFjdF9hbGwgPSBGQUxTRTsNCiAgICAgICAgICAkdl9saXN0aW5nID0gVFJVRTsNCiAgICAgIGJyZWFrOw0KICAgICAgZGVmYXVsdCA6DQogICAgICAgIC8vIC0tLS0tIEVycm9yIGxvZw0KICAgICAgICBQY2xFcnJvckxvZygtMywgIkludmFsaWQgZXh0cmFjdCBtb2RlICgkcF9tb2RlKSIpOw0KDQogICAgICAgIC8vIC0tLS0tIFJldHVybg0KICAgICAgICBUckZjdEVuZChfX0ZJTEVfXywgX19MSU5FX18sIFBjbEVycm9yQ29kZSgpLCBQY2xFcnJvclN0cmluZygpKTsNCiAgICAgICAgcmV0dXJuIFBjbEVycm9yQ29kZSgpOw0KICAgIH0NCg0KICAgIC8vIC0tLS0tIE9wZW4gdGhlIHRhciBmaWxlDQogICAgaWYgKCRwX3Rhcl9tb2RlID09ICJ0YXIiKQ0KICAgIHsNCiAgICAgIFRyRmN0TWVzc2FnZShfX0ZJTEVfXywgX19MSU5FX18sIDMsICJPcGVuIGZpbGUgaW4gYmluYXJ5IHJlYWQgbW9kZSIpOw0KICAgICAgJHZfdGFyID0gZm9wZW4oJHBfdGFybmFtZSwgInJiIik7DQogICAgfQ0KICAgIGVsc2UNCiAgICB7DQogICAgICBUckZjdE1lc3NhZ2UoX19GSUxFX18sIF9fTElORV9fLCAzLCAiT3BlbiBmaWxlIGluIGd6aXAgYmluYXJ5IHJlYWQgbW9kZSIpOw0KICAgICAgJHZfdGFyID0gQGd6b3BlbigkcF90YXJuYW1lLCAicmIiKTsNCiAgICB9DQoNCiAgICAvLyAtLS0tLSBDaGVjayB0aGF0IHRoZSBhcmNoaXZlIGlzIG9wZW4NCiAgICBpZiAoJHZfdGFyID09IDApDQogICAgew0KICAgICAgLy8gLS0tLS0gRXJyb3IgbG9nDQogICAgICBQY2xFcnJvckxvZygtMiwgIlVuYWJsZSB0byBvcGVuIGFyY2hpdmUgJyRwX3Rhcm5hbWUnIGluIGJpbmFyeSByZWFkIG1vZGUiKTsNCg0KICAgICAgLy8gLS0tLS0gUmV0dXJuDQogICAgICBUckZjdEVuZChfX0ZJTEVfXywgX19MSU5FX18sIFBjbEVycm9yQ29kZSgpLCBQY2xFcnJvclN0cmluZygpKTsNCiAgICAgIHJldHVybiBQY2xFcnJvckNvZGUoKTsNCiAgICB9DQoNCiAgICAvLyAtLS0tLSBSZWFkIHRoZSBibG9ja3MNCiAgICBXaGlsZSAoISgkdl9lbmRfb2ZfZmlsZSA9ICgkcF90YXJfbW9kZSA9PSAidGFyIj9mZW9mKCR2X3Rhcik6Z3plb2YoJHZfdGFyKSkpKQ0KICAgIHsNCiAgICAgIFRyRmN0TWVzc2FnZShfX0ZJTEVfXywgX19MSU5FX18sIDMsICJMb29raW5nIGZvciBuZXh0IGhlYWRlciAuLi4iKTsNCg0KICAgICAgLy8gLS0tLS0gQ2xlYXIgY2FjaGUgb2YgZmlsZSBpbmZvcw0KICAgICAgY2xlYXJzdGF0Y2FjaGUoKTsNCg0KICAgICAgLy8gLS0tLS0gUmVzZXQgZXh0cmFjdCB0YWcNCiAgICAgICR2X2V4dHJhY3RfZmlsZSA9IEZBTFNFOw0KICAgICAgJHZfZXh0cmFjdGlvbl9zdG9wcGVkID0gMDsNCg0KICAgICAgLy8gLS0tLS0gUmVhZCB0aGUgNTEyIGJ5dGVzIGhlYWRlcg0KICAgICAgaWYgKCRwX3Rhcl9tb2RlID09ICJ0YXIiKQ0KICAgICAgICAkdl9iaW5hcnlfZGF0YSA9IGZyZWFkKCR2X3RhciwgNTEyKTsNCiAgICAgIGVsc2UNCiAgICAgICAgJHZfYmluYXJ5X2RhdGEgPSBnenJlYWQoJHZfdGFyLCA1MTIpOw0KDQogICAgICAvLyAtLS0tLSBSZWFkIHRoZSBoZWFkZXIgcHJvcGVydGllcw0KICAgICAgaWYgKCgkdl9yZXN1bHQgPSBQY2xUYXJIYW5kbGVSZWFkSGVhZGVyKCR2X2JpbmFyeV9kYXRhLCAkdl9oZWFkZXIpKSAhPSAxKQ0KICAgICAgew0KICAgICAgICAvLyAtLS0tLSBDbG9zZSB0aGUgYXJjaGl2ZSBmaWxlDQogICAgICAgIGlmICgkcF90YXJfbW9kZSA9PSAidGFyIikNCiAgICAgICAgICBmY2xvc2UoJHZfdGFyKTsNCiAgICAgICAgZWxzZQ0KICAgICAgICAgIGd6Y2xvc2UoJHZfdGFyKTsNCg0KICAgICAgICAvLyAtLS0tLSBSZXR1cm4NCiAgICAgICAgVHJGY3RFbmQoX19GSUxFX18sIF9fTElORV9fLCAkdl9yZXN1bHQpOw0KICAgICAgICByZXR1cm4gJHZfcmVzdWx0Ow0KICAgICAgfQ0KDQogICAgICAvLyAtLS0tLSBMb29rIGZvciBlbXB0eSBibG9ja3MgdG8gc2tpcA0KICAgICAgaWYgKCR2X2hlYWRlcltmaWxlbmFtZV0gPT0gIiIpDQogICAgICB7DQogICAgICAgIFRyRmN0TWVzc2FnZShfX0ZJTEVfXywgX19MSU5FX18sIDIsICJFbXB0eSBibG9jayBmb3VuZC4gRW5kIG9mIGFyY2hpdmUgPyIpOw0KICAgICAgICBjb250aW51ZTsNCiAgICAgIH0NCg0KICAgICAgVHJGY3RNZXNzYWdlKF9fRklMRV9fLCBfX0xJTkVfXywgMiwgIkZvdW5kIGZpbGUgJyR2X2hlYWRlcltmaWxlbmFtZV0nLCBzaXplICckdl9oZWFkZXJbc2l6ZV0nIik7DQoNCiAgICAgIC8vIC0tLS0tIExvb2sgZm9yIHBhcnRpYWwgZXh0cmFjdA0KICAgICAgaWYgKCghJHZfZXh0cmFjdF9hbGwpICYmIChpc19hcnJheSgkcF9maWxlX2xpc3QpKSkNCiAgICAgIHsNCiAgICAgICAgVHJGY3RNZXNzYWdlKF9fRklMRV9fLCBfX0xJTkVfXywgMiwgIkxvb2sgaWYgdGhlIGZpbGUgJyR2X2hlYWRlcltmaWxlbmFtZV0nIG5lZWQgdG8gYmUgZXh0cmFjdGVkIik7DQoNCiAgICAgICAgLy8gLS0tLS0gQnkgZGVmYXVsdCBubyB1bnppcCBpZiB0aGUgZmlsZSBpcyBub3QgZm91bmQNCiAgICAgICAgJHZfZXh0cmFjdF9maWxlID0gRkFMU0U7DQoNCiAgICAgICAgLy8gLS0tLS0gTG9vayBpbnRvIHRoZSBmaWxlIGxpc3QNCiAgICAgICAgZm9yICgkaT0wOyAkaTxzaXplb2YoJHBfZmlsZV9saXN0KTsgJGkrKykNCiAgICAgICAgew0KICAgICAgICAgIFRyRmN0TWVzc2FnZShfX0ZJTEVfXywgX19MSU5FX18sIDIsICJDb21wYXJlIGFyY2hpdmVkIGZpbGUgJyR2X2hlYWRlcltmaWxlbmFtZV0nIGZyb20gYXNrZWQgbGlzdCBmaWxlICciLiRwX2ZpbGVfbGlzdFskaV0uIiciKTsNCg0KICAgICAgICAgIC8vIC0tLS0tIExvb2sgaWYgaXQgaXMgYSBkaXJlY3RvcnkNCiAgICAgICAgICBpZiAoc3Vic3RyKCRwX2ZpbGVfbGlzdFskaV0sIC0xKSA9PSAiLyIpDQogICAgICAgICAgew0KICAgICAgICAgICAgVHJGY3RNZXNzYWdlKF9fRklMRV9fLCBfX0xJTkVfXywgMywgIkNvbXBhcmUgZmlsZSAnJHZfaGVhZGVyW2ZpbGVuYW1lXScgd2l0aCBkaXJlY3RvcnkgJyRwX2ZpbGVfbGlzdFskaV0nIik7DQoNCiAgICAgICAgICAgIC8vIC0tLS0tIExvb2sgaWYgdGhlIGRpcmVjdG9yeSBpcyBpbiB0aGUgZmlsZW5hbWUgcGF0aA0KICAgICAgICAgICAgaWYgKChzdHJsZW4oJHZfaGVhZGVyW2ZpbGVuYW1lXSkgPiBzdHJsZW4oJHBfZmlsZV9saXN0WyRpXSkpICYmIChzdWJzdHIoJHZfaGVhZGVyW2ZpbGVuYW1lXSwgMCwgc3RybGVuKCRwX2ZpbGVfbGlzdFskaV0pKSA9PSAkcF9maWxlX2xpc3RbJGldKSkNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgLy8gLS0tLS0gVGhlIGZpbGUgaXMgaW4gdGhlIGRpcmVjdG9yeSwgc28gZXh0cmFjdCBpdA0KICAgICAgICAgICAgICBUckZjdE1lc3NhZ2UoX19GSUxFX18sIF9fTElORV9fLCAyLCAiRmlsZSAnJHZfaGVhZGVyW2ZpbGVuYW1lXScgaXMgaW4gZGlyZWN0b3J5ICckcF9maWxlX2xpc3RbJGldJyA6IGV4dHJhY3QgaXQiKTsNCiAgICAgICAgICAgICAgJHZfZXh0cmFjdF9maWxlID0gVFJVRTsNCg0KICAgICAgICAgICAgICAvLyAtLS0tLSBFbmQgb2YgbG9vcA0KICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICB9DQoNCiAgICAgICAgICAvLyAtLS0tLSBJdCBpcyBhIGZpbGUsIHNvIGNvbXBhcmUgdGhlIGZpbGUgbmFtZXMNCiAgICAgICAgICBlbHNlIGlmICgkcF9maWxlX2xpc3RbJGldID09ICR2X2hlYWRlcltmaWxlbmFtZV0pDQogICAgICAgICAgew0KICAgICAgICAgICAgLy8gLS0tLS0gRmlsZSBmb3VuZA0KICAgICAgICAgICAgVHJGY3RNZXNzYWdlKF9fRklMRV9fLCBfX0xJTkVfXywgMiwgIkZpbGUgJyR2X2hlYWRlcltmaWxlbmFtZV0nIHNob3VsZCBiZSBleHRyYWN0ZWQiKTsNCiAgICAgICAgICAgICR2X2V4dHJhY3RfZmlsZSA9IFRSVUU7DQoNCiAgICAgICAgICAgIC8vIC0tLS0tIEVuZCBvZiBsb29wDQogICAgICAgICAgICBicmVhazsNCiAgICAgICAgICB9DQogICAgICAgIH0NCg0KICAgICAgICAvLyAtLS0tLSBUcmFjZQ0KICAgICAgICBpZiAoISR2X2V4dHJhY3RfZmlsZSkNCiAgICAgICAgew0KICAgICAgICAgIFRyRmN0TWVzc2FnZShfX0ZJTEVfXywgX19MSU5FX18sIDIsICJGaWxlICckdl9oZWFkZXJbZmlsZW5hbWVdJyBzaG91bGQgbm90IGJlIGV4dHJhY3RlZCIpOw0KICAgICAgICB9DQogICAgICB9DQogICAgICBlbHNlDQogICAgICB7DQogICAgICAgIC8vIC0tLS0tIEFsbCBmaWxlcyBuZWVkIHRvIGJlIGV4dHJhY3RlZA0KICAgICAgICAkdl9leHRyYWN0X2ZpbGUgPSBUUlVFOw0KICAgICAgfQ0KDQogICAgICAvLyAtLS0tLSBMb29rIGlmIHRoaXMgZmlsZSBuZWVkIHRvIGJlIGV4dHJhY3RlZA0KICAgICAgaWYgKCgkdl9leHRyYWN0X2ZpbGUpICYmICghJHZfbGlzdGluZykpDQogICAgICB7DQogICAgICAgIC8vIC0tLS0tIExvb2sgZm9yIHBhdGggdG8gcmVtb3ZlDQogICAgICAgIGlmICgoJHBfcmVtb3ZlX3BhdGggIT0gIiIpDQogICAgICAgICAgICAmJiAoc3Vic3RyKCR2X2hlYWRlcltmaWxlbmFtZV0sIDAsICRwX3JlbW92ZV9wYXRoX3NpemUpID09ICRwX3JlbW92ZV9wYXRoKSkNCiAgICAgICAgew0KICAgICAgICAgIFRyRmN0TWVzc2FnZShfX0ZJTEVfXywgX19MSU5FX18sIDMsICJGb3VuZCBwYXRoICckcF9yZW1vdmVfcGF0aCcgdG8gcmVtb3ZlIGluIGZpbGUgJyR2X2hlYWRlcltmaWxlbmFtZV0nIik7DQogICAgICAgICAgLy8gLS0tLS0gUmVtb3ZlIHRoZSBwYXRoDQogICAgICAgICAgJHZfaGVhZGVyW2ZpbGVuYW1lXSA9IHN1YnN0cigkdl9oZWFkZXJbZmlsZW5hbWVdLCAkcF9yZW1vdmVfcGF0aF9zaXplKTsNCiAgICAgICAgICBUckZjdE1lc3NhZ2UoX19GSUxFX18sIF9fTElORV9fLCAzLCAiUmVzbHRpbmcgZmlsZSBpcyAnJHZfaGVhZGVyW2ZpbGVuYW1lXSciKTsNCiAgICAgICAgfQ0KDQogICAgICAgIC8vIC0tLS0tIEFkZCB0aGUgcGF0aCB0byB0aGUgZmlsZQ0KICAgICAgICBpZiAoKCRwX3BhdGggIT0gIi4vIikgJiYgKCRwX3BhdGggIT0gIi8iKSkNCiAgICAgICAgew0KICAgICAgICAgIC8vIC0tLS0tIExvb2sgZm9yIHRoZSBwYXRoIGVuZCAnLycNCiAgICAgICAgICB3aGlsZSAoc3Vic3RyKCRwX3BhdGgsIC0xKSA9PSAiLyIpDQogICAgICAgICAgew0KICAgICAgICAgICAgVHJGY3RNZXNzYWdlKF9fRklMRV9fLCBfX0xJTkVfXywgMywgIkRlc3RpbmF0aW9uIHBhdGggWyRwX3BhdGhdIGVuZHMgYnkgJy8nIik7DQogICAgICAgICAgICAkcF9wYXRoID0gc3Vic3RyKCRwX3BhdGgsIDAsIHN0cmxlbigkcF9wYXRoKS0xKTsNCiAgICAgICAgICAgIFRyRmN0TWVzc2FnZShfX0ZJTEVfXywgX19MSU5FX18sIDMsICJNb2RpZmllZCB0byBbJHBfcGF0aF0iKTsNCiAgICAgICAgICB9DQoNCiAgICAgICAgICAvLyAtLS0tLSBBZGQgdGhlIHBhdGgNCiAgICAgICAgICBpZiAoc3Vic3RyKCR2X2hlYWRlcltmaWxlbmFtZV0sIDAsIDEpID09ICIvIikNCiAgICAgICAgICAgICAgJHZfaGVhZGVyW2ZpbGVuYW1lXSA9ICRwX3BhdGguJHZfaGVhZGVyW2ZpbGVuYW1lXTsNCiAgICAgICAgICBlbHNlDQogICAgICAgICAgICAkdl9oZWFkZXJbZmlsZW5hbWVdID0gJHBfcGF0aC4iLyIuJHZfaGVhZGVyW2ZpbGVuYW1lXTsNCiAgICAgICAgfQ0KDQogICAgICAgIC8vIC0tLS0tIFRyYWNlDQogICAgICAgIFRyRmN0TWVzc2FnZShfX0ZJTEVfXywgX19MSU5FX18sIDIsICJFeHRyYWN0aW5nIGZpbGUgKHdpdGggcGF0aCkgJyR2X2hlYWRlcltmaWxlbmFtZV0nLCBzaXplICckdl9oZWFkZXJbc2l6ZV0nIik7DQoNCiAgICAgICAgLy8gLS0tLS0gQ2hlY2sgdGhhdCB0aGUgZmlsZSBkb2VzIG5vdCBleGlzdHMNCiAgICAgICAgaWYgKGZpbGVfZXhpc3RzKCR2X2hlYWRlcltmaWxlbmFtZV0pKQ0KICAgICAgICB7DQogICAgICAgICAgVHJGY3RNZXNzYWdlKF9fRklMRV9fLCBfX0xJTkVfXywgMiwgIkZpbGUgJyR2X2hlYWRlcltmaWxlbmFtZV0nIGFscmVhZHkgZXhpc3RzIik7DQoNCiAgICAgICAgICAvLyAtLS0tLSBMb29rIGlmIGZpbGUgaXMgYSBkaXJlY3RvcnkNCiAgICAgICAgICBpZiAoaXNfZGlyKCR2X2hlYWRlcltmaWxlbmFtZV0pKQ0KICAgICAgICAgIHsNCiAgICAgICAgICAgIFRyRmN0TWVzc2FnZShfX0ZJTEVfXywgX19MSU5FX18sIDIsICJFeGlzdGluZyBmaWxlICckdl9oZWFkZXJbZmlsZW5hbWVdJyBpcyBhIGRpcmVjdG9yeSIpOw0KDQogICAgICAgICAgICAvLyAtLS0tLSBDaGFuZ2UgdGhlIGZpbGUgc3RhdHVzDQogICAgICAgICAgICAkdl9oZWFkZXJbc3RhdHVzXSA9ICJhbHJlYWR5X2FfZGlyZWN0b3J5IjsNCg0KICAgICAgICAgICAgLy8gLS0tLS0gU2tpcCB0aGUgZXh0cmFjdA0KICAgICAgICAgICAgJHZfZXh0cmFjdGlvbl9zdG9wcGVkID0gMTsNCiAgICAgICAgICAgICR2X2V4dHJhY3RfZmlsZSA9IDA7DQogICAgICAgICAgfQ0KICAgICAgICAgIC8vIC0tLS0tIExvb2sgaWYgZmlsZSBpcyB3cml0ZSBwcm90ZWN0ZWQNCiAgICAgICAgICBlbHNlIGlmICghaXNfd3JpdGVhYmxlKCR2X2hlYWRlcltmaWxlbmFtZV0pKQ0KICAgICAgICAgIHsNCiAgICAgICAgICAgIFRyRmN0TWVzc2FnZShfX0ZJTEVfXywgX19MSU5FX18sIDIsICJFeGlzdGluZyBmaWxlICckdl9oZWFkZXJbZmlsZW5hbWVdJyBpcyB3cml0ZSBwcm90ZWN0ZWQiKTsNCg0KICAgICAgICAgICAgLy8gLS0tLS0gQ2hhbmdlIHRoZSBmaWxlIHN0YXR1cw0KICAgICAgICAgICAgJHZfaGVhZGVyW3N0YXR1c10gPSAid3JpdGVfcHJvdGVjdGVkIjsNCg0KICAgICAgICAgICAgLy8gLS0tLS0gU2tpcCB0aGUgZXh0cmFjdA0KICAgICAgICAgICAgJHZfZXh0cmFjdGlvbl9zdG9wcGVkID0gMTsNCiAgICAgICAgICAgICR2X2V4dHJhY3RfZmlsZSA9IDA7DQogICAgICAgICAgfQ0KICAgICAgICAgIC8vIC0tLS0tIExvb2sgaWYgdGhlIGV4dHJhY3RlZCBmaWxlIGlzIG9sZGVyDQogICAgICAgICAgZWxzZSBpZiAoZmlsZW10aW1lKCR2X2hlYWRlcltmaWxlbmFtZV0pID4gJHZfaGVhZGVyW210aW1lXSkNCiAgICAgICAgICB7DQogICAgICAgICAgICBUckZjdE1lc3NhZ2UoX19GSUxFX18sIF9fTElORV9fLCAyLCAiRXhpc3RpbmcgZmlsZSAnJHZfaGVhZGVyW2ZpbGVuYW1lXScgaXMgbmV3ZXIgKCIuZGF0ZSgibCBkUyBvZiBGIFkgaDppOnMgQSIsIGZpbGVtdGltZSgkdl9oZWFkZXJbZmlsZW5hbWVdKSkuIikgdGhhbiB0aGUgZXh0cmFjdGVkIGZpbGUgKCIuZGF0ZSgibCBkUyBvZiBGIFkgaDppOnMgQSIsICR2X2hlYWRlclttdGltZV0pLiIpIik7DQoNCiAgICAgICAgICAgIC8vIC0tLS0tIENoYW5nZSB0aGUgZmlsZSBzdGF0dXMNCiAgICAgICAgICAgICR2X2hlYWRlcltzdGF0dXNdID0gIm5ld2VyX2V4aXN0IjsNCg0KICAgICAgICAgICAgLy8gLS0tLS0gU2tpcCB0aGUgZXh0cmFjdA0KICAgICAgICAgICAgJHZfZXh0cmFjdGlvbl9zdG9wcGVkID0gMTsNCiAgICAgICAgICAgICR2X2V4dHJhY3RfZmlsZSA9IDA7DQogICAgICAgICAgfQ0KICAgICAgICB9DQoNCiAgICAgICAgLy8gLS0tLS0gQ2hlY2sgdGhlIGRpcmVjdG9yeSBhdmFpbGFiaWxpdHkgYW5kIGNyZWF0ZSBpdCBpZiBuZWNlc3NhcnkNCiAgICAgICAgZWxzZQ0KICAgICAgICB7DQogICAgICAgICAgaWYgKCR2X2hlYWRlclt0eXBlZmxhZ109PSI1IikNCiAgICAgICAgICAgICR2X2Rpcl90b19jaGVjayA9ICR2X2hlYWRlcltmaWxlbmFtZV07DQogICAgICAgICAgZWxzZSBpZiAoIXN0cnN0cigkdl9oZWFkZXJbZmlsZW5hbWVdLCAiLyIpKQ0KICAgICAgICAgICAgJHZfZGlyX3RvX2NoZWNrID0gIiI7DQogICAgICAgICAgZWxzZQ0KICAgICAgICAgICAgJHZfZGlyX3RvX2NoZWNrID0gZGlybmFtZSgkdl9oZWFkZXJbZmlsZW5hbWVdKTsNCg0KICAgICAgICAgIGlmICgoJHZfcmVzdWx0ID0gUGNsVGFySGFuZGxlckRpckNoZWNrKCR2X2Rpcl90b19jaGVjaykpICE9IDEpDQogICAgICAgICAgew0KICAgICAgICAgICAgVHJGY3RNZXNzYWdlKF9fRklMRV9fLCBfX0xJTkVfXywgMiwgIlVuYWJsZSB0byBjcmVhdGUgcGF0aCBmb3IgJyR2X2hlYWRlcltmaWxlbmFtZV0nIik7DQoNCiAgICAgICAgICAgIC8vIC0tLS0tIENoYW5nZSB0aGUgZmlsZSBzdGF0dXMNCiAgICAgICAgICAgICR2X2hlYWRlcltzdGF0dXNdID0gInBhdGhfY3JlYXRpb25fZmFpbCI7DQoNCiAgICAgICAgICAgIC8vIC0tLS0tIFNraXAgdGhlIGV4dHJhY3QNCiAgICAgICAgICAgICR2X2V4dHJhY3Rpb25fc3RvcHBlZCA9IDE7DQogICAgICAgICAgICAkdl9leHRyYWN0X2ZpbGUgPSAwOw0KICAgICAgICAgIH0NCiAgICAgICAgfQ0KDQogICAgICAgIC8vIC0tLS0tIERvIHRoZSBleHRyYWN0aW9uDQogICAgICAgIGlmICgoJHZfZXh0cmFjdF9maWxlKSAmJiAoJHZfaGVhZGVyW3R5cGVmbGFnXSE9IjUiKSkNCiAgICAgICAgew0KICAgICAgICAgIC8vIC0tLS0tIE9wZW4gdGhlIGRlc3RpbmF0aW9uIGZpbGUgaW4gd3JpdGUgbW9kZQ0KICAgICAgICAgIGlmICgoJHZfZGVzdF9maWxlID0gQGZvcGVuKCR2X2hlYWRlcltmaWxlbmFtZV0sICJ3YiIpKSA9PSAwKQ0KICAgICAgICAgIHsNCiAgICAgICAgICAgIFRyRmN0TWVzc2FnZShfX0ZJTEVfXywgX19MSU5FX18sIDIsICJFcnJvciB3aGlsZSBvcGVuaW5nICckdl9oZWFkZXJbZmlsZW5hbWVdJyBpbiB3cml0ZSBiaW5hcnkgbW9kZSIpOw0KDQogICAgICAgICAgICAvLyAtLS0tLSBDaGFuZ2UgdGhlIGZpbGUgc3RhdHVzDQogICAgICAgICAgICAkdl9oZWFkZXJbc3RhdHVzXSA9ICJ3cml0ZV9lcnJvciI7DQoNCiAgICAgICAgICAgIC8vIC0tLS0tIEp1bXAgdG8gbmV4dCBmaWxlDQogICAgICAgICAgICBUckZjdE1lc3NhZ2UoX19GSUxFX18sIF9fTElORV9fLCAyLCAiSnVtcCB0byBuZXh0IGZpbGUiKTsNCiAgICAgICAgICAgIGlmICgkcF90YXJfbW9kZSA9PSAidGFyIikNCiAgICAgICAgICAgICAgZnNlZWsoJHZfdGFyLCBmdGVsbCgkdl90YXIpKyhjZWlsKCgkdl9oZWFkZXJbc2l6ZV0vNTEyKSkqNTEyKSk7DQogICAgICAgICAgICBlbHNlDQogICAgICAgICAgICAgIGd6c2Vlaygkdl90YXIsIGd6dGVsbCgkdl90YXIpKyhjZWlsKCgkdl9oZWFkZXJbc2l6ZV0vNTEyKSkqNTEyKSk7DQogICAgICAgICAgfQ0KICAgICAgICAgIGVsc2UNCiAgICAgICAgICB7DQogICAgICAgICAgICBUckZjdE1lc3NhZ2UoX19GSUxFX18sIF9fTElORV9fLCAyLCAiU3RhcnQgZXh0cmFjdGlvbiBvZiAnJHZfaGVhZGVyW2ZpbGVuYW1lXSciKTsNCg0KICAgICAgICAgICAgLy8gLS0tLS0gUmVhZCBkYXRhDQogICAgICAgICAgICAkbiA9IGZsb29yKCR2X2hlYWRlcltzaXplXS81MTIpOw0KICAgICAgICAgICAgZm9yICgkaT0wOyAkaTwkbjsgJGkrKykNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgVHJGY3RNZXNzYWdlKF9fRklMRV9fLCBfX0xJTkVfXywgMywgIlJlYWQgY29tcGxldGUgNTEyIGJ5dGVzIGJsb2NrIG51bWJlciAiLigkaSsxKSk7DQogICAgICAgICAgICAgIGlmICgkcF90YXJfbW9kZSA9PSAidGFyIikNCiAgICAgICAgICAgICAgICAkdl9jb250ZW50ID0gZnJlYWQoJHZfdGFyLCA1MTIpOw0KICAgICAgICAgICAgICBlbHNlDQogICAgICAgICAgICAgICAgJHZfY29udGVudCA9IGd6cmVhZCgkdl90YXIsIDUxMik7DQogICAgICAgICAgICAgIGZ3cml0ZSgkdl9kZXN0X2ZpbGUsICR2X2NvbnRlbnQsIDUxMik7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBpZiAoKCR2X2hlYWRlcltzaXplXSAlIDUxMikgIT0gMCkNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgVHJGY3RNZXNzYWdlKF9fRklMRV9fLCBfX0xJTkVfXywgMywgIlJlYWQgbGFzdCAiLigkdl9oZWFkZXJbc2l6ZV0gJSA1MTIpLiIgYnl0ZXMgaW4gYSA1MTIgYmxvY2siKTsNCiAgICAgICAgICAgICAgaWYgKCRwX3Rhcl9tb2RlID09ICJ0YXIiKQ0KICAgICAgICAgICAgICAgICR2X2NvbnRlbnQgPSBmcmVhZCgkdl90YXIsIDUxMik7DQogICAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgICAgICAkdl9jb250ZW50ID0gZ3pyZWFkKCR2X3RhciwgNTEyKTsNCiAgICAgICAgICAgICAgZndyaXRlKCR2X2Rlc3RfZmlsZSwgJHZfY29udGVudCwgKCR2X2hlYWRlcltzaXplXSAlIDUxMikpOw0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAvLyAtLS0tLSBDbG9zZSB0aGUgZGVzdGluYXRpb24gZmlsZQ0KICAgICAgICAgICAgZmNsb3NlKCR2X2Rlc3RfZmlsZSk7DQoNCiAgICAgICAgICAgIC8vIC0tLS0tIENoYW5nZSB0aGUgZmlsZSBtb2RlLCBtdGltZQ0KICAgICAgICAgICAgdG91Y2goJHZfaGVhZGVyW2ZpbGVuYW1lXSwgJHZfaGVhZGVyW210aW1lXSk7DQogICAgICAgICAgICAvL2NobW9kKCR2X2hlYWRlcltmaWxlbmFtZV0sIERlY09jdCgkdl9oZWFkZXJbbW9kZV0pKTsNCiAgICAgICAgICB9DQoNCiAgICAgICAgICAvLyAtLS0tLSBDaGVjayB0aGUgZmlsZSBzaXplDQogICAgICAgICAgY2xlYXJzdGF0Y2FjaGUoKTsNCiAgICAgICAgICBpZiAoZmlsZXNpemUoJHZfaGVhZGVyW2ZpbGVuYW1lXSkgIT0gJHZfaGVhZGVyW3NpemVdKQ0KICAgICAgICAgIHsNCiAgICAgICAgICAgIC8vIC0tLS0tIENsb3NlIHRoZSBhcmNoaXZlIGZpbGUNCiAgICAgICAgICAgIGlmICgkcF90YXJfbW9kZSA9PSAidGFyIikNCiAgICAgICAgICAgICAgZmNsb3NlKCR2X3Rhcik7DQogICAgICAgICAgICBlbHNlDQogICAgICAgICAgICAgIGd6Y2xvc2UoJHZfdGFyKTsNCg0KICAgICAgICAgICAgLy8gLS0tLS0gRXJyb3IgbG9nDQogICAgICAgICAgICBQY2xFcnJvckxvZygtNywgIkV4dHJhY3RlZCBmaWxlICckdl9oZWFkZXJbZmlsZW5hbWVdJyBkb2VzIG5vdCBoYXZlIHRoZSBjb3JyZWN0IGZpbGUgc2l6ZSAnIi5maWxlc2l6ZSgkdl9maWxlbmFtZSkuIicgKCckdl9oZWFkZXJbc2l6ZV0nIGV4cGVjdGVkKS4gQXJjaGl2ZSBtYXkgYmUgY29ycnVwdGVkLiIpOw0KDQogICAgICAgICAgICAvLyAtLS0tLSBSZXR1cm4NCiAgICAgICAgICAgIFRyRmN0RW5kKF9fRklMRV9fLCBfX0xJTkVfXywgUGNsRXJyb3JDb2RlKCksIFBjbEVycm9yU3RyaW5nKCkpOw0KICAgICAgICAgICAgcmV0dXJuIFBjbEVycm9yQ29kZSgpOw0KICAgICAgICAgIH0NCg0KICAgICAgICAgIC8vIC0tLS0tIFRyYWNlDQogICAgICAgICAgVHJGY3RNZXNzYWdlKF9fRklMRV9fLCBfX0xJTkVfXywgMiwgIkV4dHJhY3Rpb24gZG9uZSIpOw0KICAgICAgICB9DQoNCiAgICAgICAgZWxzZQ0KICAgICAgICB7DQogICAgICAgICAgVHJGY3RNZXNzYWdlKF9fRklMRV9fLCBfX0xJTkVfXywgMiwgIkV4dHJhY3Rpb24gb2YgZmlsZSAnJHZfaGVhZGVyW2ZpbGVuYW1lXScgc2tpcHBlZC4iKTsNCg0KICAgICAgICAgIC8vIC0tLS0tIEp1bXAgdG8gbmV4dCBmaWxlDQogICAgICAgICAgVHJGY3RNZXNzYWdlKF9fRklMRV9fLCBfX0xJTkVfXywgMiwgIkp1bXAgdG8gbmV4dCBmaWxlIik7DQogICAgICAgICAgaWYgKCRwX3Rhcl9tb2RlID09ICJ0YXIiKQ0KICAgICAgICAgICAgZnNlZWsoJHZfdGFyLCBmdGVsbCgkdl90YXIpKyhjZWlsKCgkdl9oZWFkZXJbc2l6ZV0vNTEyKSkqNTEyKSk7DQogICAgICAgICAgZWxzZQ0KICAgICAgICAgICAgZ3pzZWVrKCR2X3RhciwgZ3p0ZWxsKCR2X3RhcikrKGNlaWwoKCR2X2hlYWRlcltzaXplXS81MTIpKSo1MTIpKTsNCiAgICAgICAgfQ0KICAgICAgfQ0KDQogICAgICAvLyAtLS0tLSBMb29rIGZvciBmaWxlIHRoYXQgaXMgbm90IHRvIGJlIHVuemlwcGVkDQogICAgICBlbHNlDQogICAgICB7DQogICAgICAgIC8vIC0tLS0tIFRyYWNlDQogICAgICAgIFRyRmN0TWVzc2FnZShfX0ZJTEVfXywgX19MSU5FX18sIDIsICJKdW1wIGZpbGUgJyR2X2hlYWRlcltmaWxlbmFtZV0nIik7DQogICAgICAgIFRyRmN0TWVzc2FnZShfX0ZJTEVfXywgX19MSU5FX18sIDQsICJQb3NpdGlvbiBhdmFudCBqdW1wIFsiLigkcF90YXJfbW9kZT09InRhciI/ZnRlbGwoJHZfdGFyKTpnenRlbGwoJHZfdGFyKSkuIl0iKTsNCg0KICAgICAgICAvLyAtLS0tLSBKdW1wIHRvIG5leHQgZmlsZQ0KICAgICAgICBpZiAoJHBfdGFyX21vZGUgPT0gInRhciIpDQogICAgICAgICAgZnNlZWsoJHZfdGFyLCAoJHBfdGFyX21vZGU9PSJ0YXIiP2Z0ZWxsKCR2X3Rhcik6Z3p0ZWxsKCR2X3RhcikpKyhjZWlsKCgkdl9oZWFkZXJbc2l6ZV0vNTEyKSkqNTEyKSk7DQogICAgICAgIGVsc2UNCiAgICAgICAgICBnenNlZWsoJHZfdGFyLCBnenRlbGwoJHZfdGFyKSsoY2VpbCgoJHZfaGVhZGVyW3NpemVdLzUxMikpKjUxMikpOw0KDQogICAgICAgIFRyRmN0TWVzc2FnZShfX0ZJTEVfXywgX19MSU5FX18sIDQsICJQb3NpdGlvbiBhcHLvv71zIGp1bXAgWyIuKCRwX3Rhcl9tb2RlPT0idGFyIj9mdGVsbCgkdl90YXIpOmd6dGVsbCgkdl90YXIpKS4iXSIpOw0KICAgICAgfQ0KDQogICAgICBpZiAoJHBfdGFyX21vZGUgPT0gInRhciIpDQogICAgICAgICR2X2VuZF9vZl9maWxlID0gZmVvZigkdl90YXIpOw0KICAgICAgZWxzZQ0KICAgICAgICAkdl9lbmRfb2ZfZmlsZSA9IGd6ZW9mKCR2X3Rhcik7DQoNCiAgICAgIC8vIC0tLS0tIEZpbGUgbmFtZSBhbmQgcHJvcGVydGllcyBhcmUgbG9nZ2VkIGlmIGxpc3RpbmcgbW9kZSBvciBmaWxlIGlzIGV4dHJhY3RlZA0KICAgICAgaWYgKCR2X2xpc3RpbmcgfHwgJHZfZXh0cmFjdF9maWxlIHx8ICR2X2V4dHJhY3Rpb25fc3RvcHBlZCkNCiAgICAgIHsNCiAgICAgICAgVHJGY3RNZXNzYWdlKF9fRklMRV9fLCBfX0xJTkVfXywgMiwgIk1lbW9yaXplIGluZm8gYWJvdXQgZmlsZSAnJHZfaGVhZGVyW2ZpbGVuYW1lXSciKTsNCg0KICAgICAgICAvLyAtLS0tLSBMb2cgZXh0cmFjdGVkIGZpbGVzDQogICAgICAgIGlmICgoJHZfZmlsZV9kaXIgPSBkaXJuYW1lKCR2X2hlYWRlcltmaWxlbmFtZV0pKSA9PSAkdl9oZWFkZXJbZmlsZW5hbWVdKQ0KICAgICAgICAgICR2X2ZpbGVfZGlyID0gIiI7DQogICAgICAgIGlmICgoc3Vic3RyKCR2X2hlYWRlcltmaWxlbmFtZV0sIDAsIDEpID09ICIvIikgJiYgKCR2X2ZpbGVfZGlyID09ICIiKSkNCiAgICAgICAgICAkdl9maWxlX2RpciA9ICIvIjsNCg0KICAgICAgICAvLyAtLS0tLSBBZGQgdGhlIGFycmF5IGRlc2NyaWJpbmcgdGhlIGZpbGUgaW50byB0aGUgbGlzdA0KICAgICAgICAkcF9saXN0X2RldGFpbFskdl9uYl0gPSAkdl9oZWFkZXI7DQoNCiAgICAgICAgLy8gLS0tLS0gSW5jcmVtZW50DQogICAgICAgICR2X25iKys7DQogICAgICB9DQogICAgfQ0KDQogICAgLy8gLS0tLS0gQ2xvc2UgdGhlIHRhcmZpbGUNCiAgICBpZiAoJHBfdGFyX21vZGUgPT0gInRhciIpDQogICAgICBmY2xvc2UoJHZfdGFyKTsNCiAgICBlbHNlDQogICAgICBnemNsb3NlKCR2X3Rhcik7DQoNCiAgICAvLyAtLS0tLSBSZXR1cm4NCiAgICBUckZjdEVuZChfX0ZJTEVfXywgX19MSU5FX18sICR2X3Jlc3VsdCk7DQogICAgcmV0dXJuICR2X3Jlc3VsdDsNCiAgfQ0KICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KDQogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQogIC8vIEZ1bmN0aW9uIDogUGNsVGFySGFuZGxlRXh0cmFjdEJ5SW5kZXhMaXN0KCkNCiAgLy8gRGVzY3JpcHRpb24gOg0KICAvLyAgIEV4dHJhY3QgdGhlIGZpbGVzIHdoaWNoIGFyZSBhdCB0aGUgaW5kZXhlcyBzcGVjaWZpZWQuIElmIHRoZSAnZmlsZScgYXQgdGhlDQogIC8vICAgaW5kZXggaXMgYSBkaXJlY3RvcnksIHRoZSBkaXJlY3Rvcnkgb25seSBpcyBjcmVhdGVkLCBub3QgYWxsIHRoZSBmaWxlcyBzdG9yZWQNCiAgLy8gICBmb3IgdGhhdCBkaXJlY3RvcnkuDQogIC8vIFBhcmFtZXRlcnMgOg0KICAvLyAgICRwX2luZGV4X3N0cmluZyA6IFN0cmluZyBvZiBpbmRleGVzIG9mIGZpbGVzIHRvIGV4dHJhY3QuIFRoZSBmb3JtIG9mIHRoZQ0KICAvLyAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBpcyAiMCw0LTYsOC0xMiIgd2l0aCBvbmx5IG51bWJlcnMgYW5kICctJyBmb3INCiAgLy8gICAgICAgICAgICAgICAgICAgICBmb3IgcmFuZ2UsIGFuZCAnLCcgdG8gc2VwYXJhdGUgcmFuZ2VzLiBObyBzcGFjZXMgb3IgJzsnDQogIC8vICAgICAgICAgICAgICAgICAgICAgYXJlIGFsbG93ZWQuDQogIC8vIFJldHVybiBWYWx1ZXMgOg0KICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KICBmdW5jdGlvbiBQY2xUYXJIYW5kbGVFeHRyYWN0QnlJbmRleExpc3QoJHBfdGFybmFtZSwgJHBfaW5kZXhfc3RyaW5nLCAmJHBfbGlzdF9kZXRhaWwsICRwX3BhdGgsICRwX3JlbW92ZV9wYXRoLCAkcF90YXJfbW9kZSkNCiAgew0KICAgIFRyRmN0U3RhcnQoX19GSUxFX18sIF9fTElORV9fLCAiUGNsVGFySGFuZGxlRXh0cmFjdEJ5SW5kZXhMaXN0IiwgImFyY2hpdmU9JyRwX3Rhcm5hbWUnLCBpbmRleF9zdHJpbmc9JyRwX2luZGV4X3N0cmluZycsIGxpc3QsIHBhdGg9JHBfcGF0aCwgcmVtb3ZlX3BhdGg9JyRwX3JlbW92ZV9wYXRoJywgdGFyX21vZGU9JHBfdGFyX21vZGUiKTsNCiAgICAkdl9yZXN1bHQ9MTsNCiAgICAkdl9uYiA9IDA7DQoNCiAgICAvLyAtLS0tLSBUQkMgOiBJIHNob3VsZCBjaGVjayB0aGUgc3RyaW5nIGJ5IGEgcmVnZXhwDQoNCiAgICAvLyAtLS0tLSBDaGVjayB0aGUgcGF0aA0KICAgIGlmICgoJHBfcGF0aCA9PSAiIikgfHwgKChzdWJzdHIoJHBfcGF0aCwgMCwgMSkgIT0gIi8iKSAmJiAoc3Vic3RyKCRwX3BhdGgsIDAsIDMpICE9ICIuLi8iKSAmJiAoc3Vic3RyKCRwX3BhdGgsIDAsIDIpICE9ICIuLyIpKSkNCiAgICAgICRwX3BhdGggPSAiLi8iLiRwX3BhdGg7DQoNCiAgICAvLyAtLS0tLSBMb29rIGZvciBwYXRoIHRvIHJlbW92ZSBmb3JtYXQgKHNob3VsZCBlbmQgYnkgLykNCiAgICBpZiAoKCRwX3JlbW92ZV9wYXRoICE9ICIiKSAmJiAoc3Vic3RyKCRwX3JlbW92ZV9wYXRoLCAtMSkgIT0gJy8nKSkNCiAgICB7DQogICAgICAkcF9yZW1vdmVfcGF0aCAuPSAnLyc7DQogICAgfQ0KICAgICRwX3JlbW92ZV9wYXRoX3NpemUgPSBzdHJsZW4oJHBfcmVtb3ZlX3BhdGgpOw0KDQogICAgLy8gLS0tLS0gT3BlbiB0aGUgdGFyIGZpbGUNCiAgICBpZiAoJHBfdGFyX21vZGUgPT0gInRhciIpDQogICAgew0KICAgICAgVHJGY3RNZXNzYWdlKF9fRklMRV9fLCBfX0xJTkVfXywgMywgIk9wZW4gZmlsZSBpbiBiaW5hcnkgcmVhZCBtb2RlIik7DQogICAgICAkdl90YXIgPSBAZm9wZW4oJHBfdGFybmFtZSwgInJiIik7DQogICAgfQ0KICAgIGVsc2UNCiAgICB7DQogICAgICBUckZjdE1lc3NhZ2UoX19GSUxFX18sIF9fTElORV9fLCAzLCAiT3BlbiBmaWxlIGluIGd6aXAgYmluYXJ5IHJlYWQgbW9kZSIpOw0KICAgICAgJHZfdGFyID0gQGd6b3BlbigkcF90YXJuYW1lLCAicmIiKTsNCiAgICB9DQoNCiAgICAvLyAtLS0tLSBDaGVjayB0aGF0IHRoZSBhcmNoaXZlIGlzIG9wZW4NCiAgICBpZiAoJHZfdGFyID09IDApDQogICAgew0KICAgICAgLy8gLS0tLS0gRXJyb3IgbG9nDQogICAgICBQY2xFcnJvckxvZygtMiwgIlVuYWJsZSB0byBvcGVuIGFyY2hpdmUgJyRwX3Rhcm5hbWUnIGluIGJpbmFyeSByZWFkIG1vZGUiKTsNCg0KICAgICAgLy8gLS0tLS0gUmV0dXJuDQogICAgICBUckZjdEVuZChfX0ZJTEVfXywgX19MSU5FX18sIFBjbEVycm9yQ29kZSgpLCBQY2xFcnJvclN0cmluZygpKTsNCiAgICAgIHJldHVybiBQY2xFcnJvckNvZGUoKTsNCiAgICB9DQoNCiAgICAvLyAtLS0tLSBNYW5pcHVsYXRlIHRoZSBpbmRleCBsaXN0DQogICAgJHZfbGlzdCA9IGV4cGxvZGUoIiwiLCAkcF9pbmRleF9zdHJpbmcpOw0KICAgIHNvcnQoJHZfbGlzdCk7DQoNCiAgICAvLyAtLS0tLSBMb29wIG9uIHRoZSBpbmRleCBsaXN0DQogICAgJHZfaW5kZXg9MDsNCiAgICBmb3IgKCRpPTA7ICgkaTxzaXplb2YoJHZfbGlzdCkpICYmICgkdl9yZXN1bHQpOyAkaSsrKQ0KICAgIHsNCiAgICAgIFRyRmN0TWVzc2FnZShfX0ZJTEVfXywgX19MSU5FX18sIDMsICJMb29raW5nIGZvciBpbmRleCBwYXJ0ICckdl9saXN0WyRpXSciKTsNCg0KICAgICAgLy8gLS0tLS0gRXh0cmFjdCByYW5nZQ0KICAgICAgJHZfaW5kZXhfbGlzdCA9IGV4cGxvZGUoIi0iLCAkdl9saXN0WyRpXSk7DQogICAgICAkdl9zaXplX2luZGV4X2xpc3QgPSBzaXplb2YoJHZfaW5kZXhfbGlzdCk7DQogICAgICBpZiAoJHZfc2l6ZV9pbmRleF9saXN0ID09IDEpDQogICAgICB7DQogICAgICAgIFRyRmN0TWVzc2FnZShfX0ZJTEVfXywgX19MSU5FX18sIDMsICJPbmx5IG9uZSBpbmRleCAnJHZfaW5kZXhfbGlzdFswXSciKTsNCg0KICAgICAgICAvLyAtLS0tLSBEbyB0aGUgZXh0cmFjdGlvbg0KICAgICAgICAkdl9yZXN1bHQgPSBQY2xUYXJIYW5kbGVFeHRyYWN0QnlJbmRleCgkdl90YXIsICR2X2luZGV4LCAkdl9pbmRleF9saXN0WzBdLCAkdl9pbmRleF9saXN0WzBdLCAkcF9saXN0X2RldGFpbCwgJHBfcGF0aCwgJHBfcmVtb3ZlX3BhdGgsICRwX3Rhcl9tb2RlKTsNCiAgICAgIH0NCiAgICAgIGVsc2UgaWYgKCR2X3NpemVfaW5kZXhfbGlzdCA9PSAyKQ0KICAgICAgew0KICAgICAgICBUckZjdE1lc3NhZ2UoX19GSUxFX18sIF9fTElORV9fLCAzLCAiVHdvIGluZGV4ZXMgJyR2X2luZGV4X2xpc3RbMF0nIGFuZCAnJHZfaW5kZXhfbGlzdFsxXSciKTsNCg0KICAgICAgICAvLyAtLS0tLSBEbyB0aGUgZXh0cmFjdGlvbg0KICAgICAgICAkdl9yZXN1bHQgPSBQY2xUYXJIYW5kbGVFeHRyYWN0QnlJbmRleCgkdl90YXIsICR2X2luZGV4LCAkdl9pbmRleF9saXN0WzBdLCAkdl9pbmRleF9saXN0WzFdLCAkcF9saXN0X2RldGFpbCwgJHBfcGF0aCwgJHBfcmVtb3ZlX3BhdGgsICRwX3Rhcl9tb2RlKTsNCiAgICAgIH0NCiAgICB9DQoNCiAgICAvLyAtLS0tLSBDbG9zZSB0aGUgdGFyZmlsZQ0KICAgIGlmICgkcF90YXJfbW9kZSA9PSAidGFyIikNCiAgICAgIGZjbG9zZSgkdl90YXIpOw0KICAgIGVsc2UNCiAgICAgIGd6Y2xvc2UoJHZfdGFyKTsNCg0KICAgIC8vIC0tLS0tIFJldHVybg0KICAgIFRyRmN0RW5kKF9fRklMRV9fLCBfX0xJTkVfXywgJHZfcmVzdWx0KTsNCiAgICByZXR1cm4gJHZfcmVzdWx0Ow0KICB9DQogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiAgLy8gRnVuY3Rpb24gOiBQY2xUYXJIYW5kbGVFeHRyYWN0QnlJbmRleCgpDQogIC8vIERlc2NyaXB0aW9uIDoNCiAgLy8gUGFyYW1ldGVycyA6DQogIC8vIFJldHVybiBWYWx1ZXMgOg0KICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KICBmdW5jdGlvbiBQY2xUYXJIYW5kbGVFeHRyYWN0QnlJbmRleCgkcF90YXIsICYkcF9pbmRleF9jdXJyZW50LCAkcF9pbmRleF9zdGFydCwgJHBfaW5kZXhfc3RvcCwgJiRwX2xpc3RfZGV0YWlsLCAkcF9wYXRoLCAkcF9yZW1vdmVfcGF0aCwgJHBfdGFyX21vZGUpDQogIHsNCiAgICBUckZjdFN0YXJ0KF9fRklMRV9fLCBfX0xJTkVfXywgIlBjbFRhckhhbmRsZUV4dHJhY3RCeUluZGV4IiwgImFyY2hpdmVfZGVzY3I9JyRwX3RhcicsIGluZGV4X2N1cnJlbnQ9JHBfaW5kZXhfY3VycmVudCwgaW5kZXhfc3RhcnQ9JyRwX2luZGV4X3N0YXJ0JywgaW5kZXhfc3RvcD0nJHBfaW5kZXhfc3RvcCcsIGxpc3QsIHBhdGg9JHBfcGF0aCwgcmVtb3ZlX3BhdGg9JyRwX3JlbW92ZV9wYXRoJywgdGFyX21vZGU9JHBfdGFyX21vZGUiKTsNCiAgICAkdl9yZXN1bHQ9MTsNCiAgICAkdl9uYiA9IDA7DQoNCiAgICAvLyBUQkMgOiBJIHNob3VsZCByZXBsYWNlIGFsbCAkdl90YXIgYnkgJHBfdGFyIGluIHRoaXMgZnVuY3Rpb24gLi4uLg0KICAgICR2X3RhciA9ICRwX3RhcjsNCg0KICAgIC8vIC0tLS0tIExvb2sgdGhlIG51bWJlciBvZiBlbGVtZW50cyBhbHJlYWR5IGluICRwX2xpc3RfZGV0YWlsDQogICAgJHZfbmIgPSBzaXplb2YoJHBfbGlzdF9kZXRhaWwpOw0KDQogICAgLy8gLS0tLS0gUmVhZCB0aGUgYmxvY2tzDQogICAgV2hpbGUgKCEoJHZfZW5kX29mX2ZpbGUgPSAoJHBfdGFyX21vZGUgPT0gInRhciI/ZmVvZigkdl90YXIpOmd6ZW9mKCR2X3RhcikpKSkNCiAgICB7DQogICAgICBUckZjdE1lc3NhZ2UoX19GSUxFX18sIF9fTElORV9fLCAzLCAiTG9va2luZyBmb3IgbmV4dCBmaWxlIC4uLiIpOw0KICAgICAgVHJGY3RNZXNzYWdlKF9fRklMRV9fLCBfX0xJTkVfXywgMywgIkluZGV4IGN1cnJlbnQ9JHBfaW5kZXhfY3VycmVudCwgcmFuZ2U9WyRwX2luZGV4X3N0YXJ0LCAkcF9pbmRleF9zdG9wXSkiKTsNCg0KICAgICAgaWYgKCRwX2luZGV4X2N1cnJlbnQgPiAkcF9pbmRleF9zdG9wKQ0KICAgICAgew0KICAgICAgICBUckZjdE1lc3NhZ2UoX19GSUxFX18sIF9fTElORV9fLCAyLCAiU3RvcCBleHRyYWN0aW9uLCBwYXN0IHN0b3AgaW5kZXgiKTsNCiAgICAgICAgYnJlYWs7DQogICAgICB9DQoNCiAgICAgIC8vIC0tLS0tIENsZWFyIGNhY2hlIG9mIGZpbGUgaW5mb3MNCiAgICAgIGNsZWFyc3RhdGNhY2hlKCk7DQoNCiAgICAgIC8vIC0tLS0tIFJlc2V0IGV4dHJhY3QgdGFnDQogICAgICAkdl9leHRyYWN0X2ZpbGUgPSBGQUxTRTsNCiAgICAgICR2X2V4dHJhY3Rpb25fc3RvcHBlZCA9IDA7DQoNCiAgICAgIC8vIC0tLS0tIFJlYWQgdGhlIDUxMiBieXRlcyBoZWFkZXINCiAgICAgIGlmICgkcF90YXJfbW9kZSA9PSAidGFyIikNCiAgICAgICAgJHZfYmluYXJ5X2RhdGEgPSBmcmVhZCgkdl90YXIsIDUxMik7DQogICAgICBlbHNlDQogICAgICAgICR2X2JpbmFyeV9kYXRhID0gZ3pyZWFkKCR2X3RhciwgNTEyKTsNCg0KICAgICAgLy8gLS0tLS0gUmVhZCB0aGUgaGVhZGVyIHByb3BlcnRpZXMNCiAgICAgIGlmICgoJHZfcmVzdWx0ID0gUGNsVGFySGFuZGxlUmVhZEhlYWRlcigkdl9iaW5hcnlfZGF0YSwgJHZfaGVhZGVyKSkgIT0gMSkNCiAgICAgIHsNCiAgICAgICAgLy8gLS0tLS0gUmV0dXJuDQogICAgICAgIFRyRmN0RW5kKF9fRklMRV9fLCBfX0xJTkVfXywgJHZfcmVzdWx0KTsNCiAgICAgICAgcmV0dXJuICR2X3Jlc3VsdDsNCiAgICAgIH0NCg0KICAgICAgLy8gLS0tLS0gTG9vayBmb3IgZW1wdHkgYmxvY2tzIHRvIHNraXANCiAgICAgIGlmICgkdl9oZWFkZXJbZmlsZW5hbWVdID09ICIiKQ0KICAgICAgew0KICAgICAgICBUckZjdE1lc3NhZ2UoX19GSUxFX18sIF9fTElORV9fLCAyLCAiRW1wdHkgYmxvY2sgZm91bmQuIEVuZCBvZiBhcmNoaXZlID8iKTsNCiAgICAgICAgY29udGludWU7DQogICAgICB9DQoNCiAgICAgIFRyRmN0TWVzc2FnZShfX0ZJTEVfXywgX19MSU5FX18sIDIsICJGb3VuZCBmaWxlICckdl9oZWFkZXJbZmlsZW5hbWVdJywgc2l6ZSAnJHZfaGVhZGVyW3NpemVdJyIpOw0KDQogICAgICAvLyAtLS0tLSBMb29rIGlmIGZpbGUgaXMgaW4gdGhlIHJhbmdlIHRvIGJlIGV4dHJhY3RlZA0KICAgICAgaWYgKCgkcF9pbmRleF9jdXJyZW50ID49ICRwX2luZGV4X3N0YXJ0KSAmJiAoJHBfaW5kZXhfY3VycmVudCA8PSAkcF9pbmRleF9zdG9wKSkNCiAgICAgIHsNCiAgICAgICAgVHJGY3RNZXNzYWdlKF9fRklMRV9fLCBfX0xJTkVfXywgMiwgIkZpbGUgJyR2X2hlYWRlcltmaWxlbmFtZV0nIGlzIGluIHRoZSByYW5nZSB0byBiZSBleHRyYWN0ZWQiKTsNCiAgICAgICAgJHZfZXh0cmFjdF9maWxlID0gVFJVRTsNCiAgICAgIH0NCiAgICAgIGVsc2UNCiAgICAgIHsNCiAgICAgICAgVHJGY3RNZXNzYWdlKF9fRklMRV9fLCBfX0xJTkVfXywgMiwgIkZpbGUgJyR2X2hlYWRlcltmaWxlbmFtZV0nIGlzIG91dCBvZiB0aGUgcmFuZ2UiKTsNCiAgICAgICAgJHZfZXh0cmFjdF9maWxlID0gRkFMU0U7DQogICAgICB9DQoNCiAgICAgIC8vIC0tLS0tIExvb2sgaWYgdGhpcyBmaWxlIG5lZWQgdG8gYmUgZXh0cmFjdGVkDQogICAgICBpZiAoJHZfZXh0cmFjdF9maWxlKQ0KICAgICAgew0KICAgICAgICBpZiAoKCR2X3Jlc3VsdCA9IFBjbFRhckhhbmRsZUV4dHJhY3RGaWxlKCR2X3RhciwgJHZfaGVhZGVyLCAkcF9wYXRoLCAkcF9yZW1vdmVfcGF0aCwgJHBfdGFyX21vZGUpKSAhPSAxKQ0KICAgICAgICB7DQogICAgICAgICAgLy8gLS0tLS0gUmV0dXJuDQogICAgICAgICAgVHJGY3RFbmQoX19GSUxFX18sIF9fTElORV9fLCAkdl9yZXN1bHQpOw0KICAgICAgICAgIHJldHVybiAkdl9yZXN1bHQ7DQogICAgICAgIH0NCiAgICAgIH0NCg0KICAgICAgLy8gLS0tLS0gTG9vayBmb3IgZmlsZSB0aGF0IGlzIG5vdCB0byBiZSBleHRyYWN0ZWQNCiAgICAgIGVsc2UNCiAgICAgIHsNCiAgICAgICAgLy8gLS0tLS0gVHJhY2UNCiAgICAgICAgVHJGY3RNZXNzYWdlKF9fRklMRV9fLCBfX0xJTkVfXywgMiwgIkp1bXAgZmlsZSAnJHZfaGVhZGVyW2ZpbGVuYW1lXSciKTsNCiAgICAgICAgVHJGY3RNZXNzYWdlKF9fRklMRV9fLCBfX0xJTkVfXywgNCwgIlBvc2l0aW9uIGF2YW50IGp1bXAgWyIuKCRwX3Rhcl9tb2RlPT0idGFyIj9mdGVsbCgkdl90YXIpOmd6dGVsbCgkdl90YXIpKS4iXSIpOw0KDQogICAgICAgIC8vIC0tLS0tIEp1bXAgdG8gbmV4dCBmaWxlDQogICAgICAgIGlmICgkcF90YXJfbW9kZSA9PSAidGFyIikNCiAgICAgICAgICBmc2Vlaygkdl90YXIsICgkcF90YXJfbW9kZT09InRhciI/ZnRlbGwoJHZfdGFyKTpnenRlbGwoJHZfdGFyKSkrKGNlaWwoKCR2X2hlYWRlcltzaXplXS81MTIpKSo1MTIpKTsNCiAgICAgICAgZWxzZQ0KICAgICAgICAgIGd6c2Vlaygkdl90YXIsIGd6dGVsbCgkdl90YXIpKyhjZWlsKCgkdl9oZWFkZXJbc2l6ZV0vNTEyKSkqNTEyKSk7DQoNCiAgICAgICAgVHJGY3RNZXNzYWdlKF9fRklMRV9fLCBfX0xJTkVfXywgNCwgIlBvc2l0aW9uIGFwcu+/vXMganVtcCBbIi4oJHBfdGFyX21vZGU9PSJ0YXIiP2Z0ZWxsKCR2X3Rhcik6Z3p0ZWxsKCR2X3RhcikpLiJdIik7DQogICAgICB9DQoNCiAgICAgIGlmICgkcF90YXJfbW9kZSA9PSAidGFyIikNCiAgICAgICAgJHZfZW5kX29mX2ZpbGUgPSBmZW9mKCR2X3Rhcik7DQogICAgICBlbHNlDQogICAgICAgICR2X2VuZF9vZl9maWxlID0gZ3plb2YoJHZfdGFyKTsNCg0KICAgICAgLy8gLS0tLS0gRmlsZSBuYW1lIGFuZCBwcm9wZXJ0aWVzIGFyZSBsb2dnZWQgaWYgbGlzdGluZyBtb2RlIG9yIGZpbGUgaXMgZXh0cmFjdGVkDQogICAgICBpZiAoJHZfZXh0cmFjdF9maWxlKQ0KICAgICAgew0KICAgICAgICBUckZjdE1lc3NhZ2UoX19GSUxFX18sIF9fTElORV9fLCAyLCAiTWVtb3JpemUgaW5mbyBhYm91dCBmaWxlICckdl9oZWFkZXJbZmlsZW5hbWVdJyIpOw0KDQogICAgICAgIC8vIC0tLS0tIExvZyBleHRyYWN0ZWQgZmlsZXMNCiAgICAgICAgaWYgKCgkdl9maWxlX2RpciA9IGRpcm5hbWUoJHZfaGVhZGVyW2ZpbGVuYW1lXSkpID09ICR2X2hlYWRlcltmaWxlbmFtZV0pDQogICAgICAgICAgJHZfZmlsZV9kaXIgPSAiIjsNCiAgICAgICAgaWYgKChzdWJzdHIoJHZfaGVhZGVyW2ZpbGVuYW1lXSwgMCwgMSkgPT0gIi8iKSAmJiAoJHZfZmlsZV9kaXIgPT0gIiIpKQ0KICAgICAgICAgICR2X2ZpbGVfZGlyID0gIi8iOw0KDQogICAgICAgIC8vIC0tLS0tIEFkZCB0aGUgYXJyYXkgZGVzY3JpYmluZyB0aGUgZmlsZSBpbnRvIHRoZSBsaXN0DQogICAgICAgICRwX2xpc3RfZGV0YWlsWyR2X25iXSA9ICR2X2hlYWRlcjsNCg0KICAgICAgICAvLyAtLS0tLSBJbmNyZW1lbnQNCiAgICAgICAgJHZfbmIrKzsNCiAgICAgIH0NCg0KICAgICAgLy8gLS0tLS0gSW5jcmVtZW50IHRoZSBjdXJyZW50IGZpbGUgaW5kZXgNCiAgICAgICRwX2luZGV4X2N1cnJlbnQrKzsNCiAgICB9DQoNCiAgICAvLyAtLS0tLSBSZXR1cm4NCiAgICBUckZjdEVuZChfX0ZJTEVfXywgX19MSU5FX18sICR2X3Jlc3VsdCk7DQogICAgcmV0dXJuICR2X3Jlc3VsdDsNCiAgfQ0KICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KDQogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQogIC8vIEZ1bmN0aW9uIDogUGNsVGFySGFuZGxlRXh0cmFjdEZpbGUoKQ0KICAvLyBEZXNjcmlwdGlvbiA6DQogIC8vIFBhcmFtZXRlcnMgOg0KICAvLyBSZXR1cm4gVmFsdWVzIDoNCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiAgZnVuY3Rpb24gUGNsVGFySGFuZGxlRXh0cmFjdEZpbGUoJHBfdGFyLCAmJHZfaGVhZGVyLCAkcF9wYXRoLCAkcF9yZW1vdmVfcGF0aCwgJHBfdGFyX21vZGUpDQogIHsNCiAgICBUckZjdFN0YXJ0KF9fRklMRV9fLCBfX0xJTkVfXywgIlBjbFRhckhhbmRsZUV4dHJhY3RGaWxlIiwgImFyY2hpdmVfZGVzY3I9JyRwX3RhcicsIHBhdGg9JHBfcGF0aCwgcmVtb3ZlX3BhdGg9JyRwX3JlbW92ZV9wYXRoJywgdGFyX21vZGU9JHBfdGFyX21vZGUiKTsNCiAgICAkdl9yZXN1bHQ9MTsNCg0KICAgIC8vIFRCQyA6IEkgc2hvdWxkIHJlcGxhY2UgYWxsICR2X3RhciBieSAkcF90YXIgaW4gdGhpcyBmdW5jdGlvbiAuLi4uDQogICAgJHZfdGFyID0gJHBfdGFyOw0KICAgICR2X2V4dHJhY3RfZmlsZSA9IDE7DQoNCiAgICAkcF9yZW1vdmVfcGF0aF9zaXplID0gc3RybGVuKCRwX3JlbW92ZV9wYXRoKTsNCg0KICAgICAgICAvLyAtLS0tLSBMb29rIGZvciBwYXRoIHRvIHJlbW92ZQ0KICAgICAgICBpZiAoKCRwX3JlbW92ZV9wYXRoICE9ICIiKQ0KICAgICAgICAgICAgJiYgKHN1YnN0cigkdl9oZWFkZXJbZmlsZW5hbWVdLCAwLCAkcF9yZW1vdmVfcGF0aF9zaXplKSA9PSAkcF9yZW1vdmVfcGF0aCkpDQogICAgICAgIHsNCiAgICAgICAgICBUckZjdE1lc3NhZ2UoX19GSUxFX18sIF9fTElORV9fLCAzLCAiRm91bmQgcGF0aCAnJHBfcmVtb3ZlX3BhdGgnIHRvIHJlbW92ZSBpbiBmaWxlICckdl9oZWFkZXJbZmlsZW5hbWVdJyIpOw0KICAgICAgICAgIC8vIC0tLS0tIFJlbW92ZSB0aGUgcGF0aA0KICAgICAgICAgICR2X2hlYWRlcltmaWxlbmFtZV0gPSBzdWJzdHIoJHZfaGVhZGVyW2ZpbGVuYW1lXSwgJHBfcmVtb3ZlX3BhdGhfc2l6ZSk7DQogICAgICAgICAgVHJGY3RNZXNzYWdlKF9fRklMRV9fLCBfX0xJTkVfXywgMywgIlJlc3VsdGluZyBmaWxlIGlzICckdl9oZWFkZXJbZmlsZW5hbWVdJyIpOw0KICAgICAgICB9DQoNCiAgICAgICAgLy8gLS0tLS0gQWRkIHRoZSBwYXRoIHRvIHRoZSBmaWxlDQogICAgICAgIGlmICgoJHBfcGF0aCAhPSAiLi8iKSAmJiAoJHBfcGF0aCAhPSAiLyIpKQ0KICAgICAgICB7DQogICAgICAgICAgLy8gLS0tLS0gTG9vayBmb3IgdGhlIHBhdGggZW5kICcvJw0KICAgICAgICAgIHdoaWxlIChzdWJzdHIoJHBfcGF0aCwgLTEpID09ICIvIikNCiAgICAgICAgICB7DQogICAgICAgICAgICBUckZjdE1lc3NhZ2UoX19GSUxFX18sIF9fTElORV9fLCAzLCAiRGVzdGluYXRpb24gcGF0aCBbJHBfcGF0aF0gZW5kcyBieSAnLyciKTsNCiAgICAgICAgICAgICRwX3BhdGggPSBzdWJzdHIoJHBfcGF0aCwgMCwgc3RybGVuKCRwX3BhdGgpLTEpOw0KICAgICAgICAgICAgVHJGY3RNZXNzYWdlKF9fRklMRV9fLCBfX0xJTkVfXywgMywgIk1vZGlmaWVkIHRvIFskcF9wYXRoXSIpOw0KICAgICAgICAgIH0NCg0KICAgICAgICAgIC8vIC0tLS0tIEFkZCB0aGUgcGF0aA0KICAgICAgICAgIGlmIChzdWJzdHIoJHZfaGVhZGVyW2ZpbGVuYW1lXSwgMCwgMSkgPT0gIi8iKQ0KICAgICAgICAgICAgICAkdl9oZWFkZXJbZmlsZW5hbWVdID0gJHBfcGF0aC4kdl9oZWFkZXJbZmlsZW5hbWVdOw0KICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgICR2X2hlYWRlcltmaWxlbmFtZV0gPSAkcF9wYXRoLiIvIi4kdl9oZWFkZXJbZmlsZW5hbWVdOw0KICAgICAgICB9DQoNCiAgICAgICAgLy8gLS0tLS0gVHJhY2UNCiAgICAgICAgVHJGY3RNZXNzYWdlKF9fRklMRV9fLCBfX0xJTkVfXywgMiwgIkV4dHJhY3RpbmcgZmlsZSAod2l0aCBwYXRoKSAnJHZfaGVhZGVyW2ZpbGVuYW1lXScsIHNpemUgJyR2X2hlYWRlcltzaXplXSciKTsNCg0KICAgICAgICAvLyAtLS0tLSBDaGVjayB0aGF0IHRoZSBmaWxlIGRvZXMgbm90IGV4aXN0cw0KICAgICAgICBpZiAoZmlsZV9leGlzdHMoJHZfaGVhZGVyW2ZpbGVuYW1lXSkpDQogICAgICAgIHsNCiAgICAgICAgICBUckZjdE1lc3NhZ2UoX19GSUxFX18sIF9fTElORV9fLCAyLCAiRmlsZSAnJHZfaGVhZGVyW2ZpbGVuYW1lXScgYWxyZWFkeSBleGlzdHMiKTsNCg0KICAgICAgICAgIC8vIC0tLS0tIExvb2sgaWYgZmlsZSBpcyBhIGRpcmVjdG9yeQ0KICAgICAgICAgIGlmIChpc19kaXIoJHZfaGVhZGVyW2ZpbGVuYW1lXSkpDQogICAgICAgICAgew0KICAgICAgICAgICAgVHJGY3RNZXNzYWdlKF9fRklMRV9fLCBfX0xJTkVfXywgMiwgIkV4aXN0aW5nIGZpbGUgJyR2X2hlYWRlcltmaWxlbmFtZV0nIGlzIGEgZGlyZWN0b3J5Iik7DQoNCiAgICAgICAgICAgIC8vIC0tLS0tIENoYW5nZSB0aGUgZmlsZSBzdGF0dXMNCiAgICAgICAgICAgICR2X2hlYWRlcltzdGF0dXNdID0gImFscmVhZHlfYV9kaXJlY3RvcnkiOw0KDQogICAgICAgICAgICAvLyAtLS0tLSBTa2lwIHRoZSBleHRyYWN0DQogICAgICAgICAgICAkdl9leHRyYWN0aW9uX3N0b3BwZWQgPSAxOw0KICAgICAgICAgICAgJHZfZXh0cmFjdF9maWxlID0gMDsNCiAgICAgICAgICB9DQogICAgICAgICAgLy8gLS0tLS0gTG9vayBpZiBmaWxlIGlzIHdyaXRlIHByb3RlY3RlZA0KICAgICAgICAgIGVsc2UgaWYgKCFpc193cml0ZWFibGUoJHZfaGVhZGVyW2ZpbGVuYW1lXSkpDQogICAgICAgICAgew0KICAgICAgICAgICAgVHJGY3RNZXNzYWdlKF9fRklMRV9fLCBfX0xJTkVfXywgMiwgIkV4aXN0aW5nIGZpbGUgJyR2X2hlYWRlcltmaWxlbmFtZV0nIGlzIHdyaXRlIHByb3RlY3RlZCIpOw0KDQogICAgICAgICAgICAvLyAtLS0tLSBDaGFuZ2UgdGhlIGZpbGUgc3RhdHVzDQogICAgICAgICAgICAkdl9oZWFkZXJbc3RhdHVzXSA9ICJ3cml0ZV9wcm90ZWN0ZWQiOw0KDQogICAgICAgICAgICAvLyAtLS0tLSBTa2lwIHRoZSBleHRyYWN0DQogICAgICAgICAgICAkdl9leHRyYWN0aW9uX3N0b3BwZWQgPSAxOw0KICAgICAgICAgICAgJHZfZXh0cmFjdF9maWxlID0gMDsNCiAgICAgICAgICB9DQogICAgICAgICAgLy8gLS0tLS0gTG9vayBpZiB0aGUgZXh0cmFjdGVkIGZpbGUgaXMgb2xkZXINCiAgICAgICAgICBlbHNlIGlmIChmaWxlbXRpbWUoJHZfaGVhZGVyW2ZpbGVuYW1lXSkgPiAkdl9oZWFkZXJbbXRpbWVdKQ0KICAgICAgICAgIHsNCiAgICAgICAgICAgIFRyRmN0TWVzc2FnZShfX0ZJTEVfXywgX19MSU5FX18sIDIsICJFeGlzdGluZyBmaWxlICckdl9oZWFkZXJbZmlsZW5hbWVdJyBpcyBuZXdlciAoIi5kYXRlKCJsIGRTIG9mIEYgWSBoOmk6cyBBIiwgZmlsZW10aW1lKCR2X2hlYWRlcltmaWxlbmFtZV0pKS4iKSB0aGFuIHRoZSBleHRyYWN0ZWQgZmlsZSAoIi5kYXRlKCJsIGRTIG9mIEYgWSBoOmk6cyBBIiwgJHZfaGVhZGVyW210aW1lXSkuIikiKTsNCg0KICAgICAgICAgICAgLy8gLS0tLS0gQ2hhbmdlIHRoZSBmaWxlIHN0YXR1cw0KICAgICAgICAgICAgJHZfaGVhZGVyW3N0YXR1c10gPSAibmV3ZXJfZXhpc3QiOw0KDQogICAgICAgICAgICAvLyAtLS0tLSBTa2lwIHRoZSBleHRyYWN0DQogICAgICAgICAgICAkdl9leHRyYWN0aW9uX3N0b3BwZWQgPSAxOw0KICAgICAgICAgICAgJHZfZXh0cmFjdF9maWxlID0gMDsNCiAgICAgICAgICB9DQogICAgICAgIH0NCg0KICAgICAgICAvLyAtLS0tLSBDaGVjayB0aGUgZGlyZWN0b3J5IGF2YWlsYWJpbGl0eSBhbmQgY3JlYXRlIGl0IGlmIG5lY2Vzc2FyeQ0KICAgICAgICBlbHNlDQogICAgICAgIHsNCiAgICAgICAgICBpZiAoJHZfaGVhZGVyW3R5cGVmbGFnXT09IjUiKQ0KICAgICAgICAgICAgJHZfZGlyX3RvX2NoZWNrID0gJHZfaGVhZGVyW2ZpbGVuYW1lXTsNCiAgICAgICAgICBlbHNlIGlmICghc3Ryc3RyKCR2X2hlYWRlcltmaWxlbmFtZV0sICIvIikpDQogICAgICAgICAgICAkdl9kaXJfdG9fY2hlY2sgPSAiIjsNCiAgICAgICAgICBlbHNlDQogICAgICAgICAgICAkdl9kaXJfdG9fY2hlY2sgPSBkaXJuYW1lKCR2X2hlYWRlcltmaWxlbmFtZV0pOw0KDQogICAgICAgICAgaWYgKCgkdl9yZXN1bHQgPSBQY2xUYXJIYW5kbGVyRGlyQ2hlY2soJHZfZGlyX3RvX2NoZWNrKSkgIT0gMSkNCiAgICAgICAgICB7DQogICAgICAgICAgICBUckZjdE1lc3NhZ2UoX19GSUxFX18sIF9fTElORV9fLCAyLCAiVW5hYmxlIHRvIGNyZWF0ZSBwYXRoIGZvciAnJHZfaGVhZGVyW2ZpbGVuYW1lXSciKTsNCg0KICAgICAgICAgICAgLy8gLS0tLS0gQ2hhbmdlIHRoZSBmaWxlIHN0YXR1cw0KICAgICAgICAgICAgJHZfaGVhZGVyW3N0YXR1c10gPSAicGF0aF9jcmVhdGlvbl9mYWlsIjsNCg0KICAgICAgICAgICAgLy8gLS0tLS0gU2tpcCB0aGUgZXh0cmFjdA0KICAgICAgICAgICAgJHZfZXh0cmFjdGlvbl9zdG9wcGVkID0gMTsNCiAgICAgICAgICAgICR2X2V4dHJhY3RfZmlsZSA9IDA7DQogICAgICAgICAgfQ0KICAgICAgICB9DQoNCiAgICAgICAgLy8gLS0tLS0gRG8gdGhlIHJlYWwgYnl0ZXMgZXh0cmFjdGlvbiAoaWYgbm90IGEgZGlyZWN0b3J5KQ0KICAgICAgICBpZiAoKCR2X2V4dHJhY3RfZmlsZSkgJiYgKCR2X2hlYWRlclt0eXBlZmxhZ10hPSI1IikpDQogICAgICAgIHsNCiAgICAgICAgICAvLyAtLS0tLSBPcGVuIHRoZSBkZXN0aW5hdGlvbiBmaWxlIGluIHdyaXRlIG1vZGUNCiAgICAgICAgICBpZiAoKCR2X2Rlc3RfZmlsZSA9IEBmb3Blbigkdl9oZWFkZXJbZmlsZW5hbWVdLCAid2IiKSkgPT0gMCkNCiAgICAgICAgICB7DQogICAgICAgICAgICBUckZjdE1lc3NhZ2UoX19GSUxFX18sIF9fTElORV9fLCAyLCAiRXJyb3Igd2hpbGUgb3BlbmluZyAnJHZfaGVhZGVyW2ZpbGVuYW1lXScgaW4gd3JpdGUgYmluYXJ5IG1vZGUiKTsNCg0KICAgICAgICAgICAgLy8gLS0tLS0gQ2hhbmdlIHRoZSBmaWxlIHN0YXR1cw0KICAgICAgICAgICAgJHZfaGVhZGVyW3N0YXR1c10gPSAid3JpdGVfZXJyb3IiOw0KDQogICAgICAgICAgICAvLyAtLS0tLSBKdW1wIHRvIG5leHQgZmlsZQ0KICAgICAgICAgICAgVHJGY3RNZXNzYWdlKF9fRklMRV9fLCBfX0xJTkVfXywgMiwgIkp1bXAgdG8gbmV4dCBmaWxlIik7DQogICAgICAgICAgICBpZiAoJHBfdGFyX21vZGUgPT0gInRhciIpDQogICAgICAgICAgICAgIGZzZWVrKCR2X3RhciwgZnRlbGwoJHZfdGFyKSsoY2VpbCgoJHZfaGVhZGVyW3NpemVdLzUxMikpKjUxMikpOw0KICAgICAgICAgICAgZWxzZQ0KICAgICAgICAgICAgICBnenNlZWsoJHZfdGFyLCBnenRlbGwoJHZfdGFyKSsoY2VpbCgoJHZfaGVhZGVyW3NpemVdLzUxMikpKjUxMikpOw0KICAgICAgICAgIH0NCiAgICAgICAgICBlbHNlDQogICAgICAgICAgew0KICAgICAgICAgICAgVHJGY3RNZXNzYWdlKF9fRklMRV9fLCBfX0xJTkVfXywgMiwgIlN0YXJ0IGV4dHJhY3Rpb24gb2YgJyR2X2hlYWRlcltmaWxlbmFtZV0nIik7DQoNCiAgICAgICAgICAgIC8vIC0tLS0tIFJlYWQgZGF0YQ0KICAgICAgICAgICAgJG4gPSBmbG9vcigkdl9oZWFkZXJbc2l6ZV0vNTEyKTsNCiAgICAgICAgICAgIGZvciAoJGk9MDsgJGk8JG47ICRpKyspDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgIFRyRmN0TWVzc2FnZShfX0ZJTEVfXywgX19MSU5FX18sIDMsICJSZWFkIGNvbXBsZXRlIDUxMiBieXRlcyBibG9jayBudW1iZXIgIi4oJGkrMSkpOw0KICAgICAgICAgICAgICBpZiAoJHBfdGFyX21vZGUgPT0gInRhciIpDQogICAgICAgICAgICAgICAgJHZfY29udGVudCA9IGZyZWFkKCR2X3RhciwgNTEyKTsNCiAgICAgICAgICAgICAgZWxzZQ0KICAgICAgICAgICAgICAgICR2X2NvbnRlbnQgPSBnenJlYWQoJHZfdGFyLCA1MTIpOw0KICAgICAgICAgICAgICBmd3JpdGUoJHZfZGVzdF9maWxlLCAkdl9jb250ZW50LCA1MTIpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgaWYgKCgkdl9oZWFkZXJbc2l6ZV0gJSA1MTIpICE9IDApDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgIFRyRmN0TWVzc2FnZShfX0ZJTEVfXywgX19MSU5FX18sIDMsICJSZWFkIGxhc3QgIi4oJHZfaGVhZGVyW3NpemVdICUgNTEyKS4iIGJ5dGVzIGluIGEgNTEyIGJsb2NrIik7DQogICAgICAgICAgICAgIGlmICgkcF90YXJfbW9kZSA9PSAidGFyIikNCiAgICAgICAgICAgICAgICAkdl9jb250ZW50ID0gZnJlYWQoJHZfdGFyLCA1MTIpOw0KICAgICAgICAgICAgICBlbHNlDQogICAgICAgICAgICAgICAgJHZfY29udGVudCA9IGd6cmVhZCgkdl90YXIsIDUxMik7DQogICAgICAgICAgICAgIGZ3cml0ZSgkdl9kZXN0X2ZpbGUsICR2X2NvbnRlbnQsICgkdl9oZWFkZXJbc2l6ZV0gJSA1MTIpKTsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgLy8gLS0tLS0gQ2xvc2UgdGhlIGRlc3RpbmF0aW9uIGZpbGUNCiAgICAgICAgICAgIGZjbG9zZSgkdl9kZXN0X2ZpbGUpOw0KDQogICAgICAgICAgICAvLyAtLS0tLSBDaGFuZ2UgdGhlIGZpbGUgbW9kZSwgbXRpbWUNCiAgICAgICAgICAgIHRvdWNoKCR2X2hlYWRlcltmaWxlbmFtZV0sICR2X2hlYWRlclttdGltZV0pOw0KICAgICAgICAgICAgLy9jaG1vZCgkdl9oZWFkZXJbZmlsZW5hbWVdLCBEZWNPY3QoJHZfaGVhZGVyW21vZGVdKSk7DQogICAgICAgICAgfQ0KDQogICAgICAgICAgLy8gLS0tLS0gQ2hlY2sgdGhlIGZpbGUgc2l6ZQ0KICAgICAgICAgIGNsZWFyc3RhdGNhY2hlKCk7DQogICAgICAgICAgaWYgKGZpbGVzaXplKCR2X2hlYWRlcltmaWxlbmFtZV0pICE9ICR2X2hlYWRlcltzaXplXSkNCiAgICAgICAgICB7DQogICAgICAgICAgICAvLyAtLS0tLSBFcnJvciBsb2cNCiAgICAgICAgICAgIFBjbEVycm9yTG9nKC03LCAiRXh0cmFjdGVkIGZpbGUgJyR2X2hlYWRlcltmaWxlbmFtZV0nIGRvZXMgbm90IGhhdmUgdGhlIGNvcnJlY3QgZmlsZSBzaXplICciLmZpbGVzaXplKCR2X2ZpbGVuYW1lKS4iJyAoJyR2X2hlYWRlcltzaXplXScgZXhwZWN0ZWQpLiBBcmNoaXZlIG1heSBiZSBjb3JydXB0ZWQuIik7DQoNCiAgICAgICAgICAgIC8vIC0tLS0tIFJldHVybg0KICAgICAgICAgICAgVHJGY3RFbmQoX19GSUxFX18sIF9fTElORV9fLCBQY2xFcnJvckNvZGUoKSwgUGNsRXJyb3JTdHJpbmcoKSk7DQogICAgICAgICAgICByZXR1cm4gUGNsRXJyb3JDb2RlKCk7DQogICAgICAgICAgfQ0KDQogICAgICAgICAgLy8gLS0tLS0gVHJhY2UNCiAgICAgICAgICBUckZjdE1lc3NhZ2UoX19GSUxFX18sIF9fTElORV9fLCAyLCAiRXh0cmFjdGlvbiBkb25lIik7DQogICAgICAgIH0NCiAgICAgICAgZWxzZQ0KICAgICAgICB7DQogICAgICAgICAgVHJGY3RNZXNzYWdlKF9fRklMRV9fLCBfX0xJTkVfXywgMiwgIkV4dHJhY3Rpb24gb2YgZmlsZSAnJHZfaGVhZGVyW2ZpbGVuYW1lXScgc2tpcHBlZC4iKTsNCg0KICAgICAgICAgIC8vIC0tLS0tIEp1bXAgdG8gbmV4dCBmaWxlDQogICAgICAgICAgVHJGY3RNZXNzYWdlKF9fRklMRV9fLCBfX0xJTkVfXywgMiwgIkp1bXAgdG8gbmV4dCBmaWxlIik7DQogICAgICAgICAgaWYgKCRwX3Rhcl9tb2RlID09ICJ0YXIiKQ0KICAgICAgICAgICAgZnNlZWsoJHZfdGFyLCBmdGVsbCgkdl90YXIpKyhjZWlsKCgkdl9oZWFkZXJbc2l6ZV0vNTEyKSkqNTEyKSk7DQogICAgICAgICAgZWxzZQ0KICAgICAgICAgICAgZ3pzZWVrKCR2X3RhciwgZ3p0ZWxsKCR2X3RhcikrKGNlaWwoKCR2X2hlYWRlcltzaXplXS81MTIpKSo1MTIpKTsNCiAgICAgICAgfQ0KDQogICAgLy8gLS0tLS0gUmV0dXJuDQogICAgVHJGY3RFbmQoX19GSUxFX18sIF9fTElORV9fLCAkdl9yZXN1bHQpOw0KICAgIHJldHVybiAkdl9yZXN1bHQ7DQogIH0NCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KICAvLyBGdW5jdGlvbiA6IFBjbFRhckhhbmRsZURlbGV0ZSgpDQogIC8vIERlc2NyaXB0aW9uIDoNCiAgLy8gUGFyYW1ldGVycyA6DQogIC8vIFJldHVybiBWYWx1ZXMgOg0KICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KICBmdW5jdGlvbiBQY2xUYXJIYW5kbGVEZWxldGUoJHBfdGFybmFtZSwgJHBfZmlsZV9saXN0LCAmJHBfbGlzdF9kZXRhaWwsICRwX3Rhcl9tb2RlKQ0KICB7DQogICAgVHJGY3RTdGFydChfX0ZJTEVfXywgX19MSU5FX18sICJQY2xUYXJIYW5kbGVEZWxldGUiLCAiYXJjaGl2ZT0nJHBfdGFybmFtZScsIGxpc3QsIHRhcl9tb2RlPSRwX3Rhcl9tb2RlIik7DQogICAgJHZfcmVzdWx0PTE7DQogICAgJHZfbmI9MDsNCg0KICAgIC8vIC0tLS0tIExvb2sgZm9yIHJlZ3VsYXIgdGFyIGZpbGUNCiAgICBpZiAoJHBfdGFyX21vZGUgPT0gInRhciIpDQogICAgew0KICAgICAgLy8gLS0tLS0gT3BlbiBmaWxlDQogICAgICBUckZjdE1lc3NhZ2UoX19GSUxFX18sIF9fTElORV9fLCAzLCAiT3BlbiBmaWxlIGluIGJpbmFyeSByZWFkIG1vZGUiKTsNCiAgICAgIGlmICgoJHZfdGFyID0gQGZvcGVuKCRwX3Rhcm5hbWUsICJyYiIpKSA9PSAwKQ0KICAgICAgew0KICAgICAgICAvLyAtLS0tLSBFcnJvciBsb2cNCiAgICAgICAgUGNsRXJyb3JMb2coLTIsICJVbmFibGUgdG8gb3BlbiBmaWxlICckcF90YXJuYW1lJyBpbiBiaW5hcnkgcmVhZCBtb2RlIik7DQoNCiAgICAgICAgLy8gLS0tLS0gUmV0dXJuDQogICAgICAgIFRyRmN0RW5kKF9fRklMRV9fLCBfX0xJTkVfXywgUGNsRXJyb3JDb2RlKCksIFBjbEVycm9yU3RyaW5nKCkpOw0KICAgICAgICByZXR1cm4gUGNsRXJyb3JDb2RlKCk7DQogICAgICB9DQoNCiAgICAgIC8vIC0tLS0tIE9wZW4gYSB0ZW1wb3JhcnkgZmlsZSBpbiB3cml0ZSBtb2RlDQogICAgICAkdl90ZW1wX3Rhcm5hbWUgPSB1bmlxaWQoInBjbHRhci0iKS4iLnRtcCI7DQogICAgICBUckZjdE1lc3NhZ2UoX19GSUxFX18sIF9fTElORV9fLCAyLCAiQ3JlYXRpbmcgdGVtcG9yYXJ5IGFyY2hpdmUgZmlsZSAkdl90ZW1wX3Rhcm5hbWUiKTsNCiAgICAgIGlmICgoJHZfdGVtcF90YXIgPSBAZm9wZW4oJHZfdGVtcF90YXJuYW1lLCAid2IiKSkgPT0gMCkNCiAgICAgIHsNCiAgICAgICAgLy8gLS0tLS0gQ2xvc2UgdGFyIGZpbGUNCiAgICAgICAgZmNsb3NlKCR2X3Rhcik7DQoNCiAgICAgICAgLy8gLS0tLS0gRXJyb3IgbG9nDQogICAgICAgIFBjbEVycm9yTG9nKC0xLCAiVW5hYmxlIHRvIG9wZW4gZmlsZSAnJHZfdGVtcF90YXJuYW1lJyBpbiBiaW5hcnkgd3JpdGUgbW9kZSIpOw0KDQogICAgICAgIC8vIC0tLS0tIFJldHVybg0KICAgICAgICBUckZjdEVuZChfX0ZJTEVfXywgX19MSU5FX18sIFBjbEVycm9yQ29kZSgpLCBQY2xFcnJvclN0cmluZygpKTsNCiAgICAgICAgcmV0dXJuIFBjbEVycm9yQ29kZSgpOw0KICAgICAgfQ0KICAgIH0NCg0KICAgIC8vIC0tLS0tIExvb2sgZm9yIGNvbXByZXNzZWQgdGFyIGZpbGUNCiAgICBlbHNlDQogICAgew0KICAgICAgLy8gLS0tLS0gT3BlbiB0aGUgZmlsZSBpbiByZWFkIG1vZGUNCiAgICAgIFRyRmN0TWVzc2FnZShfX0ZJTEVfXywgX19MSU5FX18sIDMsICJPcGVuIGZpbGUgaW4gZ3ppcCBiaW5hcnkgcmVhZCBtb2RlIik7DQogICAgICBpZiAoKCR2X3RhciA9IEBnem9wZW4oJHBfdGFybmFtZSwgInJiIikpID09IDApDQogICAgICB7DQogICAgICAgIC8vIC0tLS0tIEVycm9yIGxvZw0KICAgICAgICBQY2xFcnJvckxvZygtMiwgIlVuYWJsZSB0byBvcGVuIGZpbGUgJyRwX3Rhcm5hbWUnIGluIGJpbmFyeSByZWFkIG1vZGUiKTsNCg0KICAgICAgICAvLyAtLS0tLSBSZXR1cm4NCiAgICAgICAgVHJGY3RFbmQoX19GSUxFX18sIF9fTElORV9fLCBQY2xFcnJvckNvZGUoKSwgUGNsRXJyb3JTdHJpbmcoKSk7DQogICAgICAgIHJldHVybiBQY2xFcnJvckNvZGUoKTsNCiAgICAgIH0NCg0KICAgICAgLy8gLS0tLS0gT3BlbiBhIHRlbXBvcmFyeSBmaWxlIGluIHdyaXRlIG1vZGUNCiAgICAgICR2X3RlbXBfdGFybmFtZSA9IHVuaXFpZCgicGNsdGFyLSIpLiIudG1wIjsNCiAgICAgIFRyRmN0TWVzc2FnZShfX0ZJTEVfXywgX19MSU5FX18sIDIsICJDcmVhdGluZyB0ZW1wb3JhcnkgYXJjaGl2ZSBmaWxlICR2X3RlbXBfdGFybmFtZSIpOw0KICAgICAgaWYgKCgkdl90ZW1wX3RhciA9IEBnem9wZW4oJHZfdGVtcF90YXJuYW1lLCAid2IiKSkgPT0gMCkNCiAgICAgIHsNCiAgICAgICAgLy8gLS0tLS0gQ2xvc2UgdGFyIGZpbGUNCiAgICAgICAgZ3pjbG9zZSgkdl90YXIpOw0KDQogICAgICAgIC8vIC0tLS0tIEVycm9yIGxvZw0KICAgICAgICBQY2xFcnJvckxvZygtMSwgIlVuYWJsZSB0byBvcGVuIGZpbGUgJyR2X3RlbXBfdGFybmFtZScgaW4gYmluYXJ5IHdyaXRlIG1vZGUiKTsNCg0KICAgICAgICAvLyAtLS0tLSBSZXR1cm4NCiAgICAgICAgVHJGY3RFbmQoX19GSUxFX18sIF9fTElORV9fLCBQY2xFcnJvckNvZGUoKSwgUGNsRXJyb3JTdHJpbmcoKSk7DQogICAgICAgIHJldHVybiBQY2xFcnJvckNvZGUoKTsNCiAgICAgIH0NCiAgICB9DQoNCiAgICAvLyAtLS0tLSBSZWFkIHRoZSBibG9ja3MNCiAgICBXaGlsZSAoISgkdl9lbmRfb2ZfZmlsZSA9ICgkcF90YXJfbW9kZSA9PSAidGFyIj9mZW9mKCR2X3Rhcik6Z3plb2YoJHZfdGFyKSkpKQ0KICAgIHsNCiAgICAgIFRyRmN0TWVzc2FnZShfX0ZJTEVfXywgX19MSU5FX18sIDMsICJMb29raW5nIGZvciBuZXh0IGhlYWRlciAuLi4iKTsNCg0KICAgICAgLy8gLS0tLS0gQ2xlYXIgY2FjaGUgb2YgZmlsZSBpbmZvcw0KICAgICAgY2xlYXJzdGF0Y2FjaGUoKTsNCg0KICAgICAgLy8gLS0tLS0gUmVzZXQgZGVsZXRlIHRhZw0KICAgICAgJHZfZGVsZXRlX2ZpbGUgPSBGQUxTRTsNCg0KICAgICAgLy8gLS0tLS0gUmVhZCB0aGUgZmlyc3QgNTEyIGJsb2NrIGhlYWRlcg0KICAgICAgaWYgKCRwX3Rhcl9tb2RlID09ICJ0YXIiKQ0KICAgICAgICAkdl9iaW5hcnlfZGF0YSA9IGZyZWFkKCR2X3RhciwgNTEyKTsNCiAgICAgIGVsc2UNCiAgICAgICAgJHZfYmluYXJ5X2RhdGEgPSBnenJlYWQoJHZfdGFyLCA1MTIpOw0KDQogICAgICAvLyAtLS0tLSBSZWFkIHRoZSBoZWFkZXIgcHJvcGVydGllcw0KICAgICAgaWYgKCgkdl9yZXN1bHQgPSBQY2xUYXJIYW5kbGVSZWFkSGVhZGVyKCR2X2JpbmFyeV9kYXRhLCAkdl9oZWFkZXIpKSAhPSAxKQ0KICAgICAgew0KICAgICAgICAvLyAtLS0tLSBDbG9zZSB0aGUgYXJjaGl2ZSBmaWxlDQogICAgICAgIGlmICgkcF90YXJfbW9kZSA9PSAidGFyIikNCiAgICAgICAgew0KICAgICAgICAgIGZjbG9zZSgkdl90YXIpOw0KICAgICAgICAgIGZjbG9zZSgkdl90ZW1wX3Rhcik7DQogICAgICAgIH0NCiAgICAgICAgZWxzZQ0KICAgICAgICB7DQogICAgICAgICAgZ3pjbG9zZSgkdl90YXIpOw0KICAgICAgICAgIGd6Y2xvc2UoJHZfdGVtcF90YXIpOw0KICAgICAgICB9DQogICAgICAgIEB1bmxpbmsoJHZfdGVtcF90YXJuYW1lKTsNCg0KICAgICAgICAvLyAtLS0tLSBSZXR1cm4NCiAgICAgICAgVHJGY3RFbmQoX19GSUxFX18sIF9fTElORV9fLCAkdl9yZXN1bHQpOw0KICAgICAgICByZXR1cm4gJHZfcmVzdWx0Ow0KICAgICAgfQ0KDQogICAgICAvLyAtLS0tLSBMb29rIGZvciBlbXB0eSBibG9ja3MgdG8gc2tpcA0KICAgICAgaWYgKCR2X2hlYWRlcltmaWxlbmFtZV0gPT0gIiIpDQogICAgICB7DQogICAgICAgIFRyRmN0TWVzc2FnZShfX0ZJTEVfXywgX19MSU5FX18sIDIsICJFbXB0eSBibG9jayBmb3VuZC4gRW5kIG9mIGFyY2hpdmUgPyIpOw0KICAgICAgICBjb250aW51ZTsNCiAgICAgIH0NCg0KICAgICAgVHJGY3RNZXNzYWdlKF9fRklMRV9fLCBfX0xJTkVfXywgMiwgIkZvdW5kIGZpbGUgJyR2X2hlYWRlcltmaWxlbmFtZV0nLCBzaXplICckdl9oZWFkZXJbc2l6ZV0nIik7DQoNCiAgICAgIC8vIC0tLS0tIExvb2sgZm9yIGZpbGVuYW1lcyB0byBkZWxldGUNCiAgICAgIGZvciAoJGk9MCwgJHZfZGVsZXRlX2ZpbGU9RkFMU0U7ICgkaTxzaXplb2YoJHBfZmlsZV9saXN0KSkgJiYgKCEkdl9kZWxldGVfZmlsZSk7ICRpKyspDQogICAgICB7DQogICAgICAgIC8vIC0tLS0tIENvbXBhcmUgdGhlIGZpbGUgbmFtZXMNCi8vICAgICAgICBpZiAoJHBfZmlsZV9saXN0WyRpXSA9PSAkdl9oZWFkZXJbZmlsZW5hbWVdKQ0KICAgICAgICBpZiAoKCR2X2xlbiA9IHN0cmNtcCgkcF9maWxlX2xpc3RbJGldLCAkdl9oZWFkZXJbZmlsZW5hbWVdKSkgPD0gMCkNCiAgICAgICAgew0KICAgICAgICAgIGlmICgkdl9sZW49PTApDQogICAgICAgICAgew0KICAgICAgICAgICAgVHJGY3RNZXNzYWdlKF9fRklMRV9fLCBfX0xJTkVfXywgMywgIkZvdW5kIHRoYXQgJyR2X2hlYWRlcltmaWxlbmFtZV0nIG5lZWQgdG8gYmUgZGVsZXRlZCIpOw0KICAgICAgICAgICAgJHZfZGVsZXRlX2ZpbGUgPSBUUlVFOw0KICAgICAgICAgIH0NCiAgICAgICAgICBlbHNlDQogICAgICAgICAgew0KICAgICAgICAgICAgVHJGY3RNZXNzYWdlKF9fRklMRV9fLCBfX0xJTkVfXywgMywgIkxvb2sgaWYgJyR2X2hlYWRlcltmaWxlbmFtZV0nIGlzIGEgZmlsZSBpbiAkcF9maWxlX2xpc3RbJGldIik7DQogICAgICAgICAgICBpZiAoc3Vic3RyKCR2X2hlYWRlcltmaWxlbmFtZV0sIHN0cmxlbigkcF9maWxlX2xpc3RbJGldKSwgMSkgPT0gIi8iKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICBUckZjdE1lc3NhZ2UoX19GSUxFX18sIF9fTElORV9fLCAzLCAiJyR2X2hlYWRlcltmaWxlbmFtZV0nIGlzIGEgZmlsZSBpbiAkcF9maWxlX2xpc3RbJGldIik7DQogICAgICAgICAgICAgICR2X2RlbGV0ZV9maWxlID0gVFJVRTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgIH0NCg0KICAgICAgLy8gLS0tLS0gQ29weSBmaWxlcyB0aGF0IGRvIG5vdCBuZWVkIHRvIGJlIGRlbGV0ZWQNCiAgICAgIGlmICghJHZfZGVsZXRlX2ZpbGUpDQogICAgICB7DQogICAgICAgIFRyRmN0TWVzc2FnZShfX0ZJTEVfXywgX19MSU5FX18sIDIsICJLZWVwIGZpbGUgJyR2X2hlYWRlcltmaWxlbmFtZV0nIik7DQoNCiAgICAgICAgLy8gLS0tLS0gV3JpdGUgdGhlIGZpbGUgaGVhZGVyDQogICAgICAgIGlmICgkcF90YXJfbW9kZSA9PSAidGFyIikNCiAgICAgICAgew0KICAgICAgICAgIGZwdXRzKCR2X3RlbXBfdGFyLCAkdl9iaW5hcnlfZGF0YSwgNTEyKTsNCiAgICAgICAgfQ0KICAgICAgICBlbHNlDQogICAgICAgIHsNCiAgICAgICAgICBnenB1dHMoJHZfdGVtcF90YXIsICR2X2JpbmFyeV9kYXRhLCA1MTIpOw0KICAgICAgICB9DQoNCiAgICAgICAgLy8gLS0tLS0gV3JpdGUgdGhlIGZpbGUgZGF0YQ0KICAgICAgICAkbiA9IGNlaWwoJHZfaGVhZGVyW3NpemVdLzUxMik7DQogICAgICAgIGZvciAoJGk9MDsgJGk8JG47ICRpKyspDQogICAgICAgIHsNCiAgICAgICAgICBUckZjdE1lc3NhZ2UoX19GSUxFX18sIF9fTElORV9fLCAzLCAiUmVhZCBjb21wbGV0ZSA1MTIgYnl0ZXMgYmxvY2sgbnVtYmVyICIuKCRpKzEpKTsNCiAgICAgICAgICBpZiAoJHBfdGFyX21vZGUgPT0gInRhciIpDQogICAgICAgICAgew0KICAgICAgICAgICAgJHZfY29udGVudCA9IGZyZWFkKCR2X3RhciwgNTEyKTsNCiAgICAgICAgICAgIGZ3cml0ZSgkdl90ZW1wX3RhciwgJHZfY29udGVudCwgNTEyKTsNCiAgICAgICAgICB9DQogICAgICAgICAgZWxzZQ0KICAgICAgICAgIHsNCiAgICAgICAgICAgICR2X2NvbnRlbnQgPSBnenJlYWQoJHZfdGFyLCA1MTIpOw0KICAgICAgICAgICAgZ3p3cml0ZSgkdl90ZW1wX3RhciwgJHZfY29udGVudCwgNTEyKTsNCiAgICAgICAgICB9DQogICAgICAgIH0NCg0KICAgICAgICAvLyAtLS0tLSBGaWxlIG5hbWUgYW5kIHByb3BlcnRpZXMgYXJlIGxvZ2dlZCBpZiBsaXN0aW5nIG1vZGUgb3IgZmlsZSBpcyBleHRyYWN0ZWQNCiAgICAgICAgVHJGY3RNZXNzYWdlKF9fRklMRV9fLCBfX0xJTkVfXywgMiwgIk1lbW9yaXplIGluZm8gYWJvdXQgZmlsZSAnJHZfaGVhZGVyW2ZpbGVuYW1lXSciKTsNCg0KICAgICAgICAvLyAtLS0tLSBBZGQgdGhlIGFycmF5IGRlc2NyaWJpbmcgdGhlIGZpbGUgaW50byB0aGUgbGlzdA0KICAgICAgICAkcF9saXN0X2RldGFpbFskdl9uYl0gPSAkdl9oZWFkZXI7DQogICAgICAgICRwX2xpc3RfZGV0YWlsWyR2X25iXVtzdGF0dXNdID0gIm9rIjsNCg0KICAgICAgICAvLyAtLS0tLSBJbmNyZW1lbnQNCiAgICAgICAgJHZfbmIrKzsNCiAgICAgIH0NCg0KICAgICAgLy8gLS0tLS0gTG9vayBmb3IgZmlsZSB0aGF0IGlzIHRvIGJlIGRlbGV0ZWQNCiAgICAgIGVsc2UNCiAgICAgIHsNCiAgICAgICAgLy8gLS0tLS0gVHJhY2UNCiAgICAgICAgVHJGY3RNZXNzYWdlKF9fRklMRV9fLCBfX0xJTkVfXywgMiwgIlN0YXJ0IGRlbGV0aW9uIG9mICckdl9oZWFkZXJbZmlsZW5hbWVdJyIpOw0KICAgICAgICBUckZjdE1lc3NhZ2UoX19GSUxFX18sIF9fTElORV9fLCA0LCAiUG9zaXRpb24gYXZhbnQganVtcCBbIi4oJHBfdGFyX21vZGU9PSJ0YXIiP2Z0ZWxsKCR2X3Rhcik6Z3p0ZWxsKCR2X3RhcikpLiJdIik7DQoNCiAgICAgICAgLy8gLS0tLS0gSnVtcCB0byBuZXh0IGZpbGUNCiAgICAgICAgaWYgKCRwX3Rhcl9tb2RlID09ICJ0YXIiKQ0KICAgICAgICAgIGZzZWVrKCR2X3RhciwgZnRlbGwoJHZfdGFyKSsoY2VpbCgoJHZfaGVhZGVyW3NpemVdLzUxMikpKjUxMikpOw0KICAgICAgICBlbHNlDQogICAgICAgICAgZ3pzZWVrKCR2X3RhciwgZ3p0ZWxsKCR2X3RhcikrKGNlaWwoKCR2X2hlYWRlcltzaXplXS81MTIpKSo1MTIpKTsNCg0KICAgICAgICBUckZjdE1lc3NhZ2UoX19GSUxFX18sIF9fTElORV9fLCA0LCAiUG9zaXRpb24gYXBy77+9cyBqdW1wIFsiLigkcF90YXJfbW9kZT09InRhciI/ZnRlbGwoJHZfdGFyKTpnenRlbGwoJHZfdGFyKSkuIl0iKTsNCiAgICAgIH0NCg0KICAgICAgLy8gLS0tLS0gTG9vayBmb3IgZW5kIG9mIGZpbGUNCiAgICAgIGlmICgkcF90YXJfbW9kZSA9PSAidGFyIikNCiAgICAgICAgJHZfZW5kX29mX2ZpbGUgPSBmZW9mKCR2X3Rhcik7DQogICAgICBlbHNlDQogICAgICAgICR2X2VuZF9vZl9maWxlID0gZ3plb2YoJHZfdGFyKTsNCiAgICB9DQoNCiAgICAvLyAtLS0tLSBXcml0ZSB0aGUgbGFzdCBlbXB0eSBidWZmZXINCiAgICBQY2xUYXJIYW5kbGVGb290ZXIoJHZfdGVtcF90YXIsICRwX3Rhcl9tb2RlKTsNCg0KICAgIC8vIC0tLS0tIENsb3NlIHRoZSB0YXJmaWxlDQogICAgaWYgKCRwX3Rhcl9tb2RlID09ICJ0YXIiKQ0KICAgIHsNCiAgICAgIGZjbG9zZSgkdl90YXIpOw0KICAgICAgZmNsb3NlKCR2X3RlbXBfdGFyKTsNCiAgICB9DQogICAgZWxzZQ0KICAgIHsNCiAgICAgIGd6Y2xvc2UoJHZfdGFyKTsNCiAgICAgIGd6Y2xvc2UoJHZfdGVtcF90YXIpOw0KICAgIH0NCg0KICAgIC8vIC0tLS0tIFVubGluayB0YXIgZmlsZQ0KICAgIGlmICghQHVubGluaygkcF90YXJuYW1lKSkNCiAgICB7DQogICAgICAvLyAtLS0tLSBFcnJvciBsb2cNCiAgICAgIFBjbEVycm9yTG9nKC0xMSwgIkVycm9yIHdoaWxlIGRlbGV0aW5nIGFyY2hpdmUgbmFtZSAkcF90YXJuYW1lIik7DQogICAgfQ0KDQoNCiAgICAvLyAtLS0tLSBSZW5hbWUgdGFyIGZpbGUNCiAgICBpZiAoIUByZW5hbWUoJHZfdGVtcF90YXJuYW1lLCAkcF90YXJuYW1lKSkNCiAgICB7DQogICAgICAvLyAtLS0tLSBFcnJvciBsb2cNCiAgICAgIFBjbEVycm9yTG9nKC0xMiwgIkVycm9yIHdoaWxlIHJlbmFtaW5nIHRlbXBvcmFyeSBmaWxlICR2X3RlbXBfdGFybmFtZSB0byBhcmNoaXZlIG5hbWUgJHBfdGFybmFtZSIpOw0KDQogICAgICAvLyAtLS0tLSBSZXR1cm4NCiAgICAgIFRyRmN0RW5kKF9fRklMRV9fLCBfX0xJTkVfXywgUGNsRXJyb3JDb2RlKCksIFBjbEVycm9yU3RyaW5nKCkpOw0KICAgICAgcmV0dXJuIFBjbEVycm9yQ29kZSgpOw0KICAgIH0NCg0KICAgIC8vIC0tLS0tIFJldHVybg0KICAgIFRyRmN0RW5kKF9fRklMRV9fLCBfX0xJTkVfXywgJHZfcmVzdWx0KTsNCiAgICByZXR1cm4gJHZfcmVzdWx0Ow0KICB9DQogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiAgLy8gRnVuY3Rpb24gOiBQY2xUYXJIYW5kbGVVcGRhdGUoKQ0KICAvLyBEZXNjcmlwdGlvbiA6DQogIC8vIFBhcmFtZXRlcnMgOg0KICAvLyBSZXR1cm4gVmFsdWVzIDoNCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiAgZnVuY3Rpb24gUGNsVGFySGFuZGxlVXBkYXRlKCRwX3Rhcm5hbWUsICRwX2ZpbGVfbGlzdCwgJiRwX2xpc3RfZGV0YWlsLCAkcF90YXJfbW9kZSwgJHBfYWRkX2RpciwgJHBfcmVtb3ZlX2RpcikNCiAgew0KICAgIFRyRmN0U3RhcnQoX19GSUxFX18sIF9fTElORV9fLCAiUGNsVGFySGFuZGxlVXBkYXRlIiwgImFyY2hpdmU9JyRwX3Rhcm5hbWUnLCBsaXN0LCB0YXJfbW9kZT0kcF90YXJfbW9kZSIpOw0KICAgICR2X3Jlc3VsdD0xOw0KICAgICR2X25iPTA7DQogICAgJHZfZm91bmRfbGlzdCA9IGFycmF5KCk7DQoNCiAgICAvLyAtLS0tLSBMb29rIGZvciByZWd1bGFyIHRhciBmaWxlDQogICAgaWYgKCRwX3Rhcl9tb2RlID09ICJ0YXIiKQ0KICAgIHsNCiAgICAgIC8vIC0tLS0tIE9wZW4gZmlsZQ0KICAgICAgVHJGY3RNZXNzYWdlKF9fRklMRV9fLCBfX0xJTkVfXywgMywgIk9wZW4gZmlsZSBpbiBiaW5hcnkgcmVhZCBtb2RlIik7DQogICAgICBpZiAoKCR2X3RhciA9IEBmb3BlbigkcF90YXJuYW1lLCAicmIiKSkgPT0gMCkNCiAgICAgIHsNCiAgICAgICAgLy8gLS0tLS0gRXJyb3IgbG9nDQogICAgICAgIFBjbEVycm9yTG9nKC0yLCAiVW5hYmxlIHRvIG9wZW4gZmlsZSAnJHBfdGFybmFtZScgaW4gYmluYXJ5IHJlYWQgbW9kZSIpOw0KDQogICAgICAgIC8vIC0tLS0tIFJldHVybg0KICAgICAgICBUckZjdEVuZChfX0ZJTEVfXywgX19MSU5FX18sIFBjbEVycm9yQ29kZSgpLCBQY2xFcnJvclN0cmluZygpKTsNCiAgICAgICAgcmV0dXJuIFBjbEVycm9yQ29kZSgpOw0KICAgICAgfQ0KDQogICAgICAvLyAtLS0tLSBPcGVuIGEgdGVtcG9yYXJ5IGZpbGUgaW4gd3JpdGUgbW9kZQ0KICAgICAgJHZfdGVtcF90YXJuYW1lID0gdW5pcWlkKCJwY2x0YXItIikuIi50bXAiOw0KICAgICAgVHJGY3RNZXNzYWdlKF9fRklMRV9fLCBfX0xJTkVfXywgMiwgIkNyZWF0aW5nIHRlbXBvcmFyeSBhcmNoaXZlIGZpbGUgJHZfdGVtcF90YXJuYW1lIik7DQogICAgICBpZiAoKCR2X3RlbXBfdGFyID0gQGZvcGVuKCR2X3RlbXBfdGFybmFtZSwgIndiIikpID09IDApDQogICAgICB7DQogICAgICAgIC8vIC0tLS0tIENsb3NlIHRhciBmaWxlDQogICAgICAgIGZjbG9zZSgkdl90YXIpOw0KDQogICAgICAgIC8vIC0tLS0tIEVycm9yIGxvZw0KICAgICAgICBQY2xFcnJvckxvZygtMSwgIlVuYWJsZSB0byBvcGVuIGZpbGUgJyR2X3RlbXBfdGFybmFtZScgaW4gYmluYXJ5IHdyaXRlIG1vZGUiKTsNCg0KICAgICAgICAvLyAtLS0tLSBSZXR1cm4NCiAgICAgICAgVHJGY3RFbmQoX19GSUxFX18sIF9fTElORV9fLCBQY2xFcnJvckNvZGUoKSwgUGNsRXJyb3JTdHJpbmcoKSk7DQogICAgICAgIHJldHVybiBQY2xFcnJvckNvZGUoKTsNCiAgICAgIH0NCiAgICB9DQoNCiAgICAvLyAtLS0tLSBMb29rIGZvciBjb21wcmVzc2VkIHRhciBmaWxlDQogICAgZWxzZQ0KICAgIHsNCiAgICAgIC8vIC0tLS0tIE9wZW4gdGhlIGZpbGUgaW4gcmVhZCBtb2RlDQogICAgICBUckZjdE1lc3NhZ2UoX19GSUxFX18sIF9fTElORV9fLCAzLCAiT3BlbiBmaWxlIGluIGd6aXAgYmluYXJ5IHJlYWQgbW9kZSIpOw0KICAgICAgaWYgKCgkdl90YXIgPSBAZ3pvcGVuKCRwX3Rhcm5hbWUsICJyYiIpKSA9PSAwKQ0KICAgICAgew0KICAgICAgICAvLyAtLS0tLSBFcnJvciBsb2cNCiAgICAgICAgUGNsRXJyb3JMb2coLTIsICJVbmFibGUgdG8gb3BlbiBmaWxlICckcF90YXJuYW1lJyBpbiBiaW5hcnkgcmVhZCBtb2RlIik7DQoNCiAgICAgICAgLy8gLS0tLS0gUmV0dXJuDQogICAgICAgIFRyRmN0RW5kKF9fRklMRV9fLCBfX0xJTkVfXywgUGNsRXJyb3JDb2RlKCksIFBjbEVycm9yU3RyaW5nKCkpOw0KICAgICAgICByZXR1cm4gUGNsRXJyb3JDb2RlKCk7DQogICAgICB9DQoNCiAgICAgIC8vIC0tLS0tIE9wZW4gYSB0ZW1wb3JhcnkgZmlsZSBpbiB3cml0ZSBtb2RlDQogICAgICAkdl90ZW1wX3Rhcm5hbWUgPSB1bmlxaWQoInBjbHRhci0iKS4iLnRtcCI7DQogICAgICBUckZjdE1lc3NhZ2UoX19GSUxFX18sIF9fTElORV9fLCAyLCAiQ3JlYXRpbmcgdGVtcG9yYXJ5IGFyY2hpdmUgZmlsZSAkdl90ZW1wX3Rhcm5hbWUiKTsNCiAgICAgIGlmICgoJHZfdGVtcF90YXIgPSBAZ3pvcGVuKCR2X3RlbXBfdGFybmFtZSwgIndiIikpID09IDApDQogICAgICB7DQogICAgICAgIC8vIC0tLS0tIENsb3NlIHRhciBmaWxlDQogICAgICAgIGd6Y2xvc2UoJHZfdGFyKTsNCg0KICAgICAgICAvLyAtLS0tLSBFcnJvciBsb2cNCiAgICAgICAgUGNsRXJyb3JMb2coLTEsICJVbmFibGUgdG8gb3BlbiBmaWxlICckdl90ZW1wX3Rhcm5hbWUnIGluIGJpbmFyeSB3cml0ZSBtb2RlIik7DQoNCiAgICAgICAgLy8gLS0tLS0gUmV0dXJuDQogICAgICAgIFRyRmN0RW5kKF9fRklMRV9fLCBfX0xJTkVfXywgUGNsRXJyb3JDb2RlKCksIFBjbEVycm9yU3RyaW5nKCkpOw0KICAgICAgICByZXR1cm4gUGNsRXJyb3JDb2RlKCk7DQogICAgICB9DQogICAgfQ0KDQogICAgLy8gLS0tLS0gUHJlcGFyZSB0aGUgbGlzdCBvZiBmaWxlcw0KICAgIGZvciAoJGk9MDsgJGk8c2l6ZW9mKCRwX2ZpbGVfbGlzdCk7ICRpKyspDQogICAgew0KICAgICAgLy8gLS0tLS0gUmVzZXQgdGhlIGZvdW5kIGxpc3QNCiAgICAgICR2X2ZvdW5kX2xpc3RbJGldID0gMDsNCg0KICAgIC8vIC0tLS0tIENhbGN1bGF0ZSB0aGUgc3RvcmVkIGZpbGVuYW1lDQogICAgJHZfc3RvcmVkX2xpc3RbJGldID0gJHBfZmlsZV9saXN0WyRpXTsNCiAgICBpZiAoJHBfcmVtb3ZlX2RpciAhPSAiIikNCiAgICB7DQogICAgICBpZiAoc3Vic3RyKCRwX3JlbW92ZV9kaXIsIC0xKSAhPSAnLycpIC8vIEZJWE1FOiBpZiAoc3Vic3RyKCRwX2ZpbGVfbGlzdFskaV0sIC0xKSAhPSAnLycpDQogICAgICAgICRwX3JlbW92ZV9kaXIgLj0gIi8iOw0KDQogICAgICBpZiAoc3Vic3RyKCRwX2ZpbGVfbGlzdFskaV0sIDAsIHN0cmxlbigkcF9yZW1vdmVfZGlyKSkgPT0gJHBfcmVtb3ZlX2RpcikNCiAgICAgIHsNCiAgICAgICAgJHZfc3RvcmVkX2xpc3RbJGldID0gc3Vic3RyKCRwX2ZpbGVfbGlzdFskaV0sIHN0cmxlbigkcF9yZW1vdmVfZGlyKSk7DQogICAgICAgIFRyRmN0TWVzc2FnZShfX0ZJTEVfXywgX19MSU5FX18sIDMsICJSZW1vdmUgcGF0aCAnJHBfcmVtb3ZlX2RpcicgaW4gZmlsZSAnJHBfZmlsZV9saXN0WyRpXScgPSAnJHZfc3RvcmVkX2xpc3RbJGldJyIpOw0KICAgICAgfQ0KICAgIH0NCiAgICBpZiAoJHBfYWRkX2RpciAhPSAiIikNCiAgICB7DQogICAgICBpZiAoc3Vic3RyKCRwX2FkZF9kaXIsIC0xKSA9PSAiLyIpDQogICAgICAgICR2X3N0b3JlZF9saXN0WyRpXSA9ICRwX2FkZF9kaXIuJHZfc3RvcmVkX2xpc3RbJGldOw0KICAgICAgZWxzZQ0KICAgICAgICAkdl9zdG9yZWRfbGlzdFskaV0gPSAkcF9hZGRfZGlyLiIvIi4kdl9zdG9yZWRfbGlzdFskaV07DQogICAgICBUckZjdE1lc3NhZ2UoX19GSUxFX18sIF9fTElORV9fLCAzLCAiQWRkIHBhdGggJyRwX2FkZF9kaXInIGluIGZpbGUgJyRwX2ZpbGVfbGlzdFskaV0nID0gJyR2X3N0b3JlZF9saXN0WyRpXSciKTsNCiAgICB9DQogICAgJHZfc3RvcmVkX2xpc3RbJGldID0gUGNsVGFySGFuZGxlUGF0aFJlZHVjdGlvbigkdl9zdG9yZWRfbGlzdFskaV0pOw0KICAgICAgVHJGY3RNZXNzYWdlKF9fRklMRV9fLCBfX0xJTkVfXywgMywgIkFmdGVyIHJlZHVjdGlvbiAnJHZfc3RvcmVkX2xpc3RbJGldJyIpOw0KICAgIH0NCg0KDQogICAgLy8gLS0tLS0gVXBkYXRlIGZpbGUgY2FjaGUNCiAgICBjbGVhcnN0YXRjYWNoZSgpOw0KDQogICAgLy8gLS0tLS0gUmVhZCB0aGUgYmxvY2tzDQogICAgV2hpbGUgKCEoJHZfZW5kX29mX2ZpbGUgPSAoJHBfdGFyX21vZGUgPT0gInRhciI/ZmVvZigkdl90YXIpOmd6ZW9mKCR2X3RhcikpKSkNCiAgICB7DQogICAgICBUckZjdE1lc3NhZ2UoX19GSUxFX18sIF9fTElORV9fLCAzLCAiTG9va2luZyBmb3IgbmV4dCBoZWFkZXIgLi4uIik7DQoNCiAgICAgIC8vIC0tLS0tIENsZWFyIGNhY2hlIG9mIGZpbGUgaW5mb3MNCiAgICAgIGNsZWFyc3RhdGNhY2hlKCk7DQoNCiAgICAgIC8vIC0tLS0tIFJlc2V0IGN1cnJlbnQgZm91bmQgZmlsZW5hbWUNCiAgICAgICR2X2N1cnJlbnRfZmlsZW5hbWUgPSAiIjsNCg0KICAgICAgLy8gLS0tLS0gUmVzZXQgZGVsZXRlIHRhZw0KICAgICAgJHZfZGVsZXRlX2ZpbGUgPSBGQUxTRTsNCg0KICAgICAgLy8gLS0tLS0gUmVhZCB0aGUgZmlyc3QgNTEyIGJsb2NrIGhlYWRlcg0KICAgICAgaWYgKCRwX3Rhcl9tb2RlID09ICJ0YXIiKQ0KICAgICAgICAkdl9iaW5hcnlfZGF0YSA9IGZyZWFkKCR2X3RhciwgNTEyKTsNCiAgICAgIGVsc2UNCiAgICAgICAgJHZfYmluYXJ5X2RhdGEgPSBnenJlYWQoJHZfdGFyLCA1MTIpOw0KDQogICAgICAvLyAtLS0tLSBSZWFkIHRoZSBoZWFkZXIgcHJvcGVydGllcw0KICAgICAgaWYgKCgkdl9yZXN1bHQgPSBQY2xUYXJIYW5kbGVSZWFkSGVhZGVyKCR2X2JpbmFyeV9kYXRhLCAkdl9oZWFkZXIpKSAhPSAxKQ0KICAgICAgew0KICAgICAgICAvLyAtLS0tLSBDbG9zZSB0aGUgYXJjaGl2ZSBmaWxlDQogICAgICAgIGlmICgkcF90YXJfbW9kZSA9PSAidGFyIikNCiAgICAgICAgew0KICAgICAgICAgIGZjbG9zZSgkdl90YXIpOw0KICAgICAgICAgIGZjbG9zZSgkdl90ZW1wX3Rhcik7DQogICAgICAgIH0NCiAgICAgICAgZWxzZQ0KICAgICAgICB7DQogICAgICAgICAgZ3pjbG9zZSgkdl90YXIpOw0KICAgICAgICAgIGd6Y2xvc2UoJHZfdGVtcF90YXIpOw0KICAgICAgICB9DQogICAgICAgIEB1bmxpbmsoJHZfdGVtcF90YXJuYW1lKTsNCg0KICAgICAgICAvLyAtLS0tLSBSZXR1cm4NCiAgICAgICAgVHJGY3RFbmQoX19GSUxFX18sIF9fTElORV9fLCAkdl9yZXN1bHQpOw0KICAgICAgICByZXR1cm4gJHZfcmVzdWx0Ow0KICAgICAgfQ0KDQogICAgICAvLyAtLS0tLSBMb29rIGZvciBlbXB0eSBibG9ja3MgdG8gc2tpcA0KICAgICAgaWYgKCR2X2hlYWRlcltmaWxlbmFtZV0gPT0gIiIpDQogICAgICB7DQogICAgICAgIFRyRmN0TWVzc2FnZShfX0ZJTEVfXywgX19MSU5FX18sIDIsICJFbXB0eSBibG9jayBmb3VuZC4gRW5kIG9mIGFyY2hpdmUgPyIpOw0KICAgICAgICBjb250aW51ZTsNCiAgICAgIH0NCg0KICAgICAgVHJGY3RNZXNzYWdlKF9fRklMRV9fLCBfX0xJTkVfXywgMiwgIkZvdW5kIGZpbGUgJyR2X2hlYWRlcltmaWxlbmFtZV0nLCBzaXplICckdl9oZWFkZXJbc2l6ZV0nIik7DQoNCiAgICAgIC8vIC0tLS0tIExvb2sgZm9yIGZpbGVuYW1lcyB0byB1cGRhdGUNCiAgICAgIGZvciAoJGk9MCwgJHZfdXBkYXRlX2ZpbGU9RkFMU0UsICR2X2ZvdW5kX2ZpbGU9RkFMU0U7ICgkaTxzaXplb2YoJHZfc3RvcmVkX2xpc3QpKSAmJiAoISR2X3VwZGF0ZV9maWxlKTsgJGkrKykNCiAgICAgIHsNCiAgICAgICAgVHJGY3RNZXNzYWdlKF9fRklMRV9fLCBfX0xJTkVfXywgNCwgIkNvbXBhcmUgd2l0aCBmaWxlICckdl9zdG9yZWRfbGlzdFskaV0nIik7DQoNCiAgICAgICAgLy8gLS0tLS0gQ29tcGFyZSB0aGUgZmlsZSBuYW1lcw0KICAgICAgICBpZiAoJHZfc3RvcmVkX2xpc3RbJGldID09ICR2X2hlYWRlcltmaWxlbmFtZV0pDQogICAgICAgIHsNCiAgICAgICAgICBUckZjdE1lc3NhZ2UoX19GSUxFX18sIF9fTElORV9fLCAzLCAiRmlsZSAnJHZfc3RvcmVkX2xpc3RbJGldJyBpcyBwcmVzZW50IGluIGFyY2hpdmUiKTsNCiAgICAgICAgICBUckZjdE1lc3NhZ2UoX19GSUxFX18sIF9fTElORV9fLCAzLCAiRmlsZSAnJHZfc3RvcmVkX2xpc3RbJGldJyBtdGltZT0iLmZpbGVtdGltZSgkcF9maWxlX2xpc3RbJGldKS4iICIuZGF0ZSgibCBkUyBvZiBGIFkgaDppOnMgQSIsIGZpbGVtdGltZSgkcF9maWxlX2xpc3RbJGldKSkpOw0KICAgICAgICAgIFRyRmN0TWVzc2FnZShfX0ZJTEVfXywgX19MSU5FX18sIDMsICJBcmNoaXZlZCBtdGltZT0iLiR2X2hlYWRlclttdGltZV0uIiAiLmRhdGUoImwgZFMgb2YgRiBZIGg6aTpzIEEiLCAkdl9oZWFkZXJbbXRpbWVdKSk7DQoNCiAgICAgICAgICAvLyAtLS0tLSBTdG9yZSBmb3VuZCBpbmZvcm1hdGlvbnMNCiAgICAgICAgICAkdl9mb3VuZF9maWxlID0gVFJVRTsNCiAgICAgICAgICAkdl9jdXJyZW50X2ZpbGVuYW1lID0gJHBfZmlsZV9saXN0WyRpXTsNCg0KICAgICAgICAgIC8vIC0tLS0tIExvb2sgaWYgdGhlIGZpbGUgbmVlZCB0byBiZSB1cGRhdGVkDQogICAgICAgICAgaWYgKGZpbGVtdGltZSgkcF9maWxlX2xpc3RbJGldKSA+ICR2X2hlYWRlclttdGltZV0pDQogICAgICAgICAgew0KICAgICAgICAgICAgVHJGY3RNZXNzYWdlKF9fRklMRV9fLCBfX0xJTkVfXywgMywgIkZpbGUgJyRwX2ZpbGVfbGlzdFskaV0nIG5lZWQgdG8gYmUgdXBkYXRlZCIpOw0KICAgICAgICAgICAgJHZfdXBkYXRlX2ZpbGUgPSBUUlVFOw0KICAgICAgICAgIH0NCiAgICAgICAgICBlbHNlDQogICAgICAgICAgew0KICAgICAgICAgICAgVHJGY3RNZXNzYWdlKF9fRklMRV9fLCBfX0xJTkVfXywgMywgIkZpbGUgJyRwX2ZpbGVfbGlzdFskaV0nIGRvZXMgbm90IG5lZWQgdG8gYmUgdXBkYXRlZCIpOw0KICAgICAgICAgICAgJHZfdXBkYXRlX2ZpbGUgPSBGQUxTRTsNCiAgICAgICAgICB9DQoNCiAgICAgICAgICAvLyAtLS0tLSBGbGFnIHRoZSBuYW1lIGluIG9yZGVyIG5vdCB0byBhZGQgdGhlIGZpbGUgYXQgdGhlIGVuZA0KICAgICAgICAgICR2X2ZvdW5kX2xpc3RbJGldID0gMTsNCiAgICAgICAgfQ0KICAgICAgICBlbHNlDQogICAgICAgIHsNCiAgICAgICAgICBUckZjdE1lc3NhZ2UoX19GSUxFX18sIF9fTElORV9fLCA0LCAiRmlsZSAnJHBfZmlsZV9saXN0WyRpXScgaXMgbm90ICckdl9oZWFkZXJbZmlsZW5hbWVdJyIpOw0KICAgICAgICB9DQogICAgICB9DQoNCiAgICAgIC8vIC0tLS0tIENvcHkgZmlsZXMgdGhhdCBkbyBub3QgbmVlZCB0byBiZSB1cGRhdGVkDQogICAgICBpZiAoISR2X3VwZGF0ZV9maWxlKQ0KICAgICAgew0KICAgICAgICBUckZjdE1lc3NhZ2UoX19GSUxFX18sIF9fTElORV9fLCAyLCAiS2VlcCBmaWxlICckdl9oZWFkZXJbZmlsZW5hbWVdJyIpOw0KDQogICAgICAgIC8vIC0tLS0tIFdyaXRlIHRoZSBmaWxlIGhlYWRlcg0KICAgICAgICBpZiAoJHBfdGFyX21vZGUgPT0gInRhciIpDQogICAgICAgIHsNCiAgICAgICAgICBmcHV0cygkdl90ZW1wX3RhciwgJHZfYmluYXJ5X2RhdGEsIDUxMik7DQogICAgICAgIH0NCiAgICAgICAgZWxzZQ0KICAgICAgICB7DQogICAgICAgICAgZ3pwdXRzKCR2X3RlbXBfdGFyLCAkdl9iaW5hcnlfZGF0YSwgNTEyKTsNCiAgICAgICAgfQ0KDQogICAgICAgIC8vIC0tLS0tIFdyaXRlIHRoZSBmaWxlIGRhdGENCiAgICAgICAgJG4gPSBjZWlsKCR2X2hlYWRlcltzaXplXS81MTIpOw0KICAgICAgICBmb3IgKCRqPTA7ICRqPCRuOyAkaisrKQ0KICAgICAgICB7DQogICAgICAgICAgVHJGY3RNZXNzYWdlKF9fRklMRV9fLCBfX0xJTkVfXywgMywgIlJlYWQgY29tcGxldGUgNTEyIGJ5dGVzIGJsb2NrIG51bWJlciAiLigkaisxKSk7DQogICAgICAgICAgaWYgKCRwX3Rhcl9tb2RlID09ICJ0YXIiKQ0KICAgICAgICAgIHsNCiAgICAgICAgICAgICR2X2NvbnRlbnQgPSBmcmVhZCgkdl90YXIsIDUxMik7DQogICAgICAgICAgICBmd3JpdGUoJHZfdGVtcF90YXIsICR2X2NvbnRlbnQsIDUxMik7DQogICAgICAgICAgfQ0KICAgICAgICAgIGVsc2UNCiAgICAgICAgICB7DQogICAgICAgICAgICAkdl9jb250ZW50ID0gZ3pyZWFkKCR2X3RhciwgNTEyKTsNCiAgICAgICAgICAgIGd6d3JpdGUoJHZfdGVtcF90YXIsICR2X2NvbnRlbnQsIDUxMik7DQogICAgICAgICAgfQ0KICAgICAgICB9DQoNCiAgICAgICAgLy8gLS0tLS0gRmlsZSBuYW1lIGFuZCBwcm9wZXJ0aWVzIGFyZSBsb2dnZWQgaWYgbGlzdGluZyBtb2RlIG9yIGZpbGUgaXMgZXh0cmFjdGVkDQogICAgICAgIFRyRmN0TWVzc2FnZShfX0ZJTEVfXywgX19MSU5FX18sIDIsICJNZW1vcml6ZSBpbmZvIGFib3V0IGZpbGUgJyR2X2hlYWRlcltmaWxlbmFtZV0nIik7DQoNCiAgICAgICAgLy8gLS0tLS0gQWRkIHRoZSBhcnJheSBkZXNjcmliaW5nIHRoZSBmaWxlIGludG8gdGhlIGxpc3QNCiAgICAgICAgJHBfbGlzdF9kZXRhaWxbJHZfbmJdID0gJHZfaGVhZGVyOw0KICAgICAgICAkcF9saXN0X2RldGFpbFskdl9uYl1bc3RhdHVzXSA9ICgkdl9mb3VuZF9maWxlPyJub3RfdXBkYXRlZCI6Im9rIik7DQoNCiAgICAgICAgLy8gLS0tLS0gSW5jcmVtZW50DQogICAgICAgICR2X25iKys7DQogICAgICB9DQoNCiAgICAgIC8vIC0tLS0tIExvb2sgZm9yIGZpbGUgdGhhdCBuZWVkIHRvIGJlIHVwZGF0ZWQNCiAgICAgIGVsc2UNCiAgICAgIHsNCiAgICAgICAgLy8gLS0tLS0gVHJhY2UNCiAgICAgICAgVHJGY3RNZXNzYWdlKF9fRklMRV9fLCBfX0xJTkVfXywgMiwgIlN0YXJ0IHVwZGF0ZSBvZiBmaWxlICckdl9jdXJyZW50X2ZpbGVuYW1lJyIpOw0KDQogICAgICAgIC8vIC0tLS0tIFN0b3JlIHRoZSBvbGQgZmlsZSBzaXplDQogICAgICAgICR2X29sZF9zaXplID0gJHZfaGVhZGVyW3NpemVdOw0KDQogICAgICAgIC8vIC0tLS0tIEFkZCB0aGUgZmlsZQ0KICAgICAgICBpZiAoKCR2X3Jlc3VsdCA9IFBjbFRhckhhbmRsZUFkZEZpbGUoJHZfdGVtcF90YXIsICR2X2N1cnJlbnRfZmlsZW5hbWUsICRwX3Rhcl9tb2RlLCAkdl9oZWFkZXIsICRwX2FkZF9kaXIsICRwX3JlbW92ZV9kaXIpKSAhPSAxKQ0KICAgICAgICB7DQogICAgICAgICAgLy8gLS0tLS0gQ2xvc2UgdGhlIHRhcmZpbGUNCiAgICAgICAgICBpZiAoJHBfdGFyX21vZGUgPT0gInRhciIpDQogICAgICAgICAgew0KICAgICAgICAgICAgZmNsb3NlKCR2X3Rhcik7DQogICAgICAgICAgICBmY2xvc2UoJHZfdGVtcF90YXIpOw0KICAgICAgICAgIH0NCiAgICAgICAgICBlbHNlDQogICAgICAgICAgew0KICAgICAgICAgICAgZ3pjbG9zZSgkdl90YXIpOw0KICAgICAgICAgICAgZ3pjbG9zZSgkdl90ZW1wX3Rhcik7DQogICAgICAgICAgfQ0KICAgICAgICAgIEB1bmxpbmsoJHBfdGVtcF90YXJuYW1lKTsNCg0KICAgICAgICAgIC8vIC0tLS0tIFJldHVybiBzdGF0dXMNCiAgICAgICAgICBUckZjdEVuZChfX0ZJTEVfXywgX19MSU5FX18sICR2X3Jlc3VsdCk7DQogICAgICAgICAgcmV0dXJuICR2X3Jlc3VsdDsNCiAgICAgICAgfQ0KDQogICAgICAgIC8vIC0tLS0tIFRyYWNlDQogICAgICAgIFRyRmN0TWVzc2FnZShfX0ZJTEVfXywgX19MSU5FX18sIDIsICJTa2lwIG9sZCBmaWxlICckdl9oZWFkZXJbZmlsZW5hbWVdJyIpOw0KDQogICAgICAgIC8vIC0tLS0tIEp1bXAgdG8gbmV4dCBmaWxlDQogICAgICAgIGlmICgkcF90YXJfbW9kZSA9PSAidGFyIikNCiAgICAgICAgICBmc2Vlaygkdl90YXIsIGZ0ZWxsKCR2X3RhcikrKGNlaWwoKCR2X29sZF9zaXplLzUxMikpKjUxMikpOw0KICAgICAgICBlbHNlDQogICAgICAgICAgZ3pzZWVrKCR2X3RhciwgZ3p0ZWxsKCR2X3RhcikrKGNlaWwoKCR2X29sZF9zaXplLzUxMikpKjUxMikpOw0KDQogICAgICAgIC8vIC0tLS0tIEFkZCB0aGUgYXJyYXkgZGVzY3JpYmluZyB0aGUgZmlsZSBpbnRvIHRoZSBsaXN0DQogICAgICAgICRwX2xpc3RfZGV0YWlsWyR2X25iXSA9ICR2X2hlYWRlcjsNCiAgICAgICAgJHBfbGlzdF9kZXRhaWxbJHZfbmJdW3N0YXR1c10gPSAidXBkYXRlZCI7DQoNCiAgICAgICAgLy8gLS0tLS0gSW5jcmVtZW50DQogICAgICAgICR2X25iKys7DQogICAgICB9DQoNCiAgICAgIC8vIC0tLS0tIExvb2sgZm9yIGVuZCBvZiBmaWxlDQogICAgICBpZiAoJHBfdGFyX21vZGUgPT0gInRhciIpDQogICAgICAgICR2X2VuZF9vZl9maWxlID0gZmVvZigkdl90YXIpOw0KICAgICAgZWxzZQ0KICAgICAgICAkdl9lbmRfb2ZfZmlsZSA9IGd6ZW9mKCR2X3Rhcik7DQogICAgfQ0KDQogICAgLy8gLS0tLS0gTG9vayBmb3IgZmlsZXMgdGhhdCBkb2VzIG5vdCBleGlzdHMgaW4gdGhlIGFyY2hpdmUgYW5kIG5lZWQgdG8gYmUgYWRkZWQNCiAgICBmb3IgKCRpPTA7ICRpPHNpemVvZigkcF9maWxlX2xpc3QpOyAkaSsrKQ0KICAgIHsNCiAgICAgIC8vIC0tLS0tIExvb2sgaWYgZmlsZSBub3QgZm91bmQgaW4gdGhlIGFyY2hpdmUNCiAgICAgIGlmICghJHZfZm91bmRfbGlzdFskaV0pDQogICAgICB7DQogICAgICAgIFRyRmN0TWVzc2FnZShfX0ZJTEVfXywgX19MSU5FX18sIDMsICJGaWxlICckcF9maWxlX2xpc3RbJGldJyBuZWVkIHRvIGJlIGFkZGVkIik7DQoNCiAgICAgICAgLy8gLS0tLS0gQWRkIHRoZSBmaWxlDQogICAgICAgIGlmICgoJHZfcmVzdWx0ID0gUGNsVGFySGFuZGxlQWRkRmlsZSgkdl90ZW1wX3RhciwgJHBfZmlsZV9saXN0WyRpXSwgJHBfdGFyX21vZGUsICR2X2hlYWRlciwgJHBfYWRkX2RpciwgJHBfcmVtb3ZlX2RpcikpICE9IDEpDQogICAgICAgIHsNCiAgICAgICAgICAvLyAtLS0tLSBDbG9zZSB0aGUgdGFyZmlsZQ0KICAgICAgICAgIGlmICgkcF90YXJfbW9kZSA9PSAidGFyIikNCiAgICAgICAgICB7DQogICAgICAgICAgICBmY2xvc2UoJHZfdGFyKTsNCiAgICAgICAgICAgIGZjbG9zZSgkdl90ZW1wX3Rhcik7DQogICAgICAgICAgfQ0KICAgICAgICAgIGVsc2UNCiAgICAgICAgICB7DQogICAgICAgICAgICBnemNsb3NlKCR2X3Rhcik7DQogICAgICAgICAgICBnemNsb3NlKCR2X3RlbXBfdGFyKTsNCiAgICAgICAgICB9DQogICAgICAgICAgQHVubGluaygkcF90ZW1wX3Rhcm5hbWUpOw0KDQogICAgICAgICAgLy8gLS0tLS0gUmV0dXJuIHN0YXR1cw0KICAgICAgICAgIFRyRmN0RW5kKF9fRklMRV9fLCBfX0xJTkVfXywgJHZfcmVzdWx0KTsNCiAgICAgICAgICByZXR1cm4gJHZfcmVzdWx0Ow0KICAgICAgICB9DQoNCiAgICAgICAgLy8gLS0tLS0gQWRkIHRoZSBhcnJheSBkZXNjcmliaW5nIHRoZSBmaWxlIGludG8gdGhlIGxpc3QNCiAgICAgICAgJHBfbGlzdF9kZXRhaWxbJHZfbmJdID0gJHZfaGVhZGVyOw0KICAgICAgICAkcF9saXN0X2RldGFpbFskdl9uYl1bc3RhdHVzXSA9ICJhZGRlZCI7DQoNCiAgICAgICAgLy8gLS0tLS0gSW5jcmVtZW50DQogICAgICAgICR2X25iKys7DQogICAgICB9DQogICAgICBlbHNlDQogICAgICB7DQogICAgICAgIFRyRmN0TWVzc2FnZShfX0ZJTEVfXywgX19MSU5FX18sIDMsICJGaWxlICckcF9maWxlX2xpc3RbJGldJyB3YXMgYWxyZWFkeSB1cGRhdGVkIGlmIG5lZWRlZCIpOw0KICAgICAgfQ0KICAgIH0NCg0KICAgIC8vIC0tLS0tIFdyaXRlIHRoZSBsYXN0IGVtcHR5IGJ1ZmZlcg0KICAgIFBjbFRhckhhbmRsZUZvb3Rlcigkdl90ZW1wX3RhciwgJHBfdGFyX21vZGUpOw0KDQogICAgLy8gLS0tLS0gQ2xvc2UgdGhlIHRhcmZpbGUNCiAgICBpZiAoJHBfdGFyX21vZGUgPT0gInRhciIpDQogICAgew0KICAgICAgZmNsb3NlKCR2X3Rhcik7DQogICAgICBmY2xvc2UoJHZfdGVtcF90YXIpOw0KICAgIH0NCiAgICBlbHNlDQogICAgew0KICAgICAgZ3pjbG9zZSgkdl90YXIpOw0KICAgICAgZ3pjbG9zZSgkdl90ZW1wX3Rhcik7DQogICAgfQ0KDQogICAgLy8gLS0tLS0gVW5saW5rIHRhciBmaWxlDQogICAgaWYgKCFAdW5saW5rKCRwX3Rhcm5hbWUpKQ0KICAgIHsNCiAgICAgIC8vIC0tLS0tIEVycm9yIGxvZw0KICAgICAgUGNsRXJyb3JMb2coLTExLCAiRXJyb3Igd2hpbGUgZGVsZXRpbmcgYXJjaGl2ZSBuYW1lICRwX3Rhcm5hbWUiKTsNCiAgICB9DQoNCg0KICAgIC8vIC0tLS0tIFJlbmFtZSB0YXIgZmlsZQ0KICAgIGlmICghQHJlbmFtZSgkdl90ZW1wX3Rhcm5hbWUsICRwX3Rhcm5hbWUpKQ0KICAgIHsNCiAgICAgIC8vIC0tLS0tIEVycm9yIGxvZw0KICAgICAgUGNsRXJyb3JMb2coLTEyLCAiRXJyb3Igd2hpbGUgcmVuYW1pbmcgdGVtcG9yYXJ5IGZpbGUgJHZfdGVtcF90YXJuYW1lIHRvIGFyY2hpdmUgbmFtZSAkcF90YXJuYW1lIik7DQoNCiAgICAgIC8vIC0tLS0tIFJldHVybg0KICAgICAgVHJGY3RFbmQoX19GSUxFX18sIF9fTElORV9fLCBQY2xFcnJvckNvZGUoKSwgUGNsRXJyb3JTdHJpbmcoKSk7DQogICAgICByZXR1cm4gUGNsRXJyb3JDb2RlKCk7DQogICAgfQ0KDQogICAgLy8gLS0tLS0gUmV0dXJuDQogICAgVHJGY3RFbmQoX19GSUxFX18sIF9fTElORV9fLCAkdl9yZXN1bHQpOw0KICAgIHJldHVybiAkdl9yZXN1bHQ7DQogIH0NCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KICAvLyBGdW5jdGlvbiA6IFBjbFRhckhhbmRsZVJlYWRIZWFkZXIoKQ0KICAvLyBEZXNjcmlwdGlvbiA6DQogIC8vIFBhcmFtZXRlcnMgOg0KICAvLyBSZXR1cm4gVmFsdWVzIDoNCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiAgZnVuY3Rpb24gUGNsVGFySGFuZGxlUmVhZEhlYWRlcigkdl9iaW5hcnlfZGF0YSwgJiR2X2hlYWRlcikNCiAgew0KICAgIFRyRmN0U3RhcnQoX19GSUxFX18sIF9fTElORV9fLCAiUGNsVGFySGFuZGxlUmVhZEhlYWRlciIsICIiKTsNCiAgICAkdl9yZXN1bHQ9MTsNCg0KICAgIC8vIC0tLS0tIFJlYWQgdGhlIDUxMiBieXRlcyBoZWFkZXINCiAgICAvKg0KICAgIGlmICgkcF90YXJfbW9kZSA9PSAidGFyIikNCiAgICAgICR2X2JpbmFyeV9kYXRhID0gZnJlYWQoJHBfdGFyLCA1MTIpOw0KICAgIGVsc2UNCiAgICAgICR2X2JpbmFyeV9kYXRhID0gZ3pyZWFkKCRwX3RhciwgNTEyKTsNCiAgICAqLw0KDQogICAgLy8gLS0tLS0gTG9vayBmb3Igbm8gbW9yZSBibG9jaw0KICAgIGlmIChzdHJsZW4oJHZfYmluYXJ5X2RhdGEpPT0wKQ0KICAgIHsNCiAgICAgICR2X2hlYWRlcltmaWxlbmFtZV0gPSAiIjsNCiAgICAgICR2X2hlYWRlcltzdGF0dXNdID0gImVtcHR5IjsNCg0KICAgICAgLy8gLS0tLS0gUmV0dXJuDQogICAgICBUckZjdEVuZChfX0ZJTEVfXywgX19MSU5FX18sICR2X3Jlc3VsdCwgIkVuZCBvZiBhcmNoaXZlIGZvdW5kIik7DQogICAgICByZXR1cm4gJHZfcmVzdWx0Ow0KICAgIH0NCg0KICAgIC8vIC0tLS0tIExvb2sgZm9yIGludmFsaWQgYmxvY2sgc2l6ZQ0KICAgIGlmIChzdHJsZW4oJHZfYmluYXJ5X2RhdGEpICE9IDUxMikNCiAgICB7DQogICAgICAkdl9oZWFkZXJbZmlsZW5hbWVdID0gIiI7DQogICAgICAkdl9oZWFkZXJbc3RhdHVzXSA9ICJpbnZhbGlkX2hlYWRlciI7DQogICAgICBUckZjdE1lc3NhZ2UoX19GSUxFX18sIF9fTElORV9fLCAyLCAiSW52YWxpZCBibG9jayBzaXplIDogIi5zdHJsZW4oJHZfYmluYXJ5X2RhdGEpKTsNCg0KICAgICAgLy8gLS0tLS0gRXJyb3IgbG9nDQogICAgICBQY2xFcnJvckxvZygtMTAsICJJbnZhbGlkIGJsb2NrIHNpemUgOiAiLnN0cmxlbigkdl9iaW5hcnlfZGF0YSkpOw0KDQogICAgICAvLyAtLS0tLSBSZXR1cm4NCiAgICAgIFRyRmN0RW5kKF9fRklMRV9fLCBfX0xJTkVfXywgUGNsRXJyb3JDb2RlKCksIFBjbEVycm9yU3RyaW5nKCkpOw0KICAgICAgcmV0dXJuIFBjbEVycm9yQ29kZSgpOw0KICAgIH0NCg0KICAgIC8vIC0tLS0tIENhbGN1bGF0ZSB0aGUgY2hlY2tzdW0NCiAgICAkdl9jaGVja3N1bSA9IDA7DQogICAgLy8gLi4uLi4gRmlyc3QgcGFydCBvZiB0aGUgaGVhZGVyDQogICAgZm9yICgkaT0wOyAkaTwxNDg7ICRpKyspDQogICAgew0KICAgICAgJHZfY2hlY2tzdW0rPW9yZChzdWJzdHIoJHZfYmluYXJ5X2RhdGEsJGksMSkpOw0KICAgIH0NCiAgICAvLyAuLi4uLiBJZ25vcmUgdGhlIGNoZWNrc3VtIHZhbHVlIGFuZCByZXBsYWNlIGl0IGJ5ICcgJyAoc3BhY2UpDQogICAgZm9yICgkaT0xNDg7ICRpPDE1NjsgJGkrKykNCiAgICB7DQogICAgICAkdl9jaGVja3N1bSArPSBvcmQoJyAnKTsNCiAgICB9DQogICAgLy8gLi4uLi4gTGFzdCBwYXJ0IG9mIHRoZSBoZWFkZXINCiAgICBmb3IgKCRpPTE1NjsgJGk8NTEyOyAkaSsrKQ0KICAgIHsNCiAgICAgICR2X2NoZWNrc3VtKz1vcmQoc3Vic3RyKCR2X2JpbmFyeV9kYXRhLCRpLDEpKTsNCiAgICB9DQogICAgVHJGY3RNZXNzYWdlKF9fRklMRV9fLCBfX0xJTkVfXywgMywgIkNhbGN1bGF0ZWQgY2hlY2tzdW0gOiAkdl9jaGVja3N1bSIpOw0KDQogICAgLy8gLS0tLS0gRXh0cmFjdCB0aGUgdmFsdWVzDQogICAgVHJGY3RNZXNzYWdlKF9fRklMRV9fLCBfX0xJTkVfXywgMiwgIkhlYWRlciA6ICckdl9iaW5hcnlfZGF0YSciKTsNCiAgICAkdl9kYXRhID0gdW5wYWNrKCJhMTAwZmlsZW5hbWUvYThtb2RlL2E4dWlkL2E4Z2lkL2ExMnNpemUvYTEybXRpbWUvYThjaGVja3N1bS9hMXR5cGVmbGFnL2ExMDBsaW5rL2E2bWFnaWMvYTJ2ZXJzaW9uL2EzMnVuYW1lL2EzMmduYW1lL2E4ZGV2bWFqb3IvYThkZXZtaW5vciIsICR2X2JpbmFyeV9kYXRhKTsNCg0KICAgIC8vIC0tLS0tIEV4dHJhY3QgdGhlIGNoZWNrc3VtIGZvciBjaGVjaw0KICAgICR2X2hlYWRlcltjaGVja3N1bV0gPSBPY3REZWModHJpbSgkdl9kYXRhW2NoZWNrc3VtXSkpOw0KICAgIFRyRmN0TWVzc2FnZShfX0ZJTEVfXywgX19MSU5FX18sIDMsICJGaWxlIGNoZWNrc3VtIDogJHZfaGVhZGVyW2NoZWNrc3VtXSIpOw0KICAgIGlmICgkdl9oZWFkZXJbY2hlY2tzdW1dICE9ICR2X2NoZWNrc3VtKQ0KICAgIHsNCiAgICAgIFRyRmN0TWVzc2FnZShfX0ZJTEVfXywgX19MSU5FX18sIDIsICJGaWxlIGNoZWNrc3VtIGlzIGludmFsaWQgOiAkdl9jaGVja3N1bSBjYWxjdWxhdGVkLCAkdl9oZWFkZXJbY2hlY2tzdW1dIGV4cGVjdGVkIik7DQoNCiAgICAgICR2X2hlYWRlcltmaWxlbmFtZV0gPSAiIjsNCiAgICAgICR2X2hlYWRlcltzdGF0dXNdID0gImludmFsaWRfaGVhZGVyIjsNCg0KICAgICAgLy8gLS0tLS0gTG9vayBmb3IgbGFzdCBibG9jayAoZW1wdHkgYmxvY2spDQogICAgICBpZiAoKCR2X2NoZWNrc3VtID09IDI1NikgJiYgKCR2X2hlYWRlcltjaGVja3N1bV0gPT0gMCkpDQogICAgICB7DQogICAgICAgICR2X2hlYWRlcltzdGF0dXNdID0gImVtcHR5IjsNCiAgICAgICAgLy8gLS0tLS0gUmV0dXJuDQogICAgICAgIFRyRmN0RW5kKF9fRklMRV9fLCBfX0xJTkVfXywgJHZfcmVzdWx0LCAiRW5kIG9mIGFyY2hpdmUgZm91bmQiKTsNCiAgICAgICAgcmV0dXJuICR2X3Jlc3VsdDsNCiAgICAgIH0NCg0KICAgICAgLy8gLS0tLS0gRXJyb3IgbG9nDQogICAgICBQY2xFcnJvckxvZygtMTMsICJJbnZhbGlkIGNoZWNrc3VtIDogJHZfY2hlY2tzdW0gY2FsY3VsYXRlZCwgJHZfaGVhZGVyW2NoZWNrc3VtXSBleHBlY3RlZCIpOw0KDQogICAgICAvLyAtLS0tLSBSZXR1cm4NCiAgICAgIFRyRmN0RW5kKF9fRklMRV9fLCBfX0xJTkVfXywgUGNsRXJyb3JDb2RlKCksIFBjbEVycm9yU3RyaW5nKCkpOw0KICAgICAgcmV0dXJuIFBjbEVycm9yQ29kZSgpOw0KICAgIH0NCiAgICBUckZjdE1lc3NhZ2UoX19GSUxFX18sIF9fTElORV9fLCAyLCAiRmlsZSBjaGVja3N1bSBpcyB2YWxpZCAoJHZfY2hlY2tzdW0pIik7DQoNCiAgICAvLyAtLS0tLSBFeHRyYWN0IHRoZSBwcm9wZXJ0aWVzDQogICAgJHZfaGVhZGVyW2ZpbGVuYW1lXSA9IHRyaW0oJHZfZGF0YVtmaWxlbmFtZV0pOw0KICAgIFRyRmN0TWVzc2FnZShfX0ZJTEVfXywgX19MSU5FX18sIDIsICJOYW1lIDogJyR2X2hlYWRlcltmaWxlbmFtZV0nIik7DQogICAgJHZfaGVhZGVyW21vZGVdID0gT2N0RGVjKHRyaW0oJHZfZGF0YVttb2RlXSkpOw0KICAgIFRyRmN0TWVzc2FnZShfX0ZJTEVfXywgX19MSU5FX18sIDIsICJNb2RlIDogJyIuRGVjT2N0KCR2X2hlYWRlclttb2RlXSkuIiciKTsNCiAgICAkdl9oZWFkZXJbdWlkXSA9IE9jdERlYyh0cmltKCR2X2RhdGFbdWlkXSkpOw0KICAgIFRyRmN0TWVzc2FnZShfX0ZJTEVfXywgX19MSU5FX18sIDIsICJVaWQgOiAnJHZfaGVhZGVyW3VpZF0nIik7DQogICAgJHZfaGVhZGVyW2dpZF0gPSBPY3REZWModHJpbSgkdl9kYXRhW2dpZF0pKTsNCiAgICBUckZjdE1lc3NhZ2UoX19GSUxFX18sIF9fTElORV9fLCAyLCAiR2lkIDogJyR2X2hlYWRlcltnaWRdJyIpOw0KICAgICR2X2hlYWRlcltzaXplXSA9IE9jdERlYyh0cmltKCR2X2RhdGFbc2l6ZV0pKTsNCiAgICBUckZjdE1lc3NhZ2UoX19GSUxFX18sIF9fTElORV9fLCAyLCAiU2l6ZSA6ICckdl9oZWFkZXJbc2l6ZV0nIik7DQogICAgJHZfaGVhZGVyW210aW1lXSA9IE9jdERlYyh0cmltKCR2X2RhdGFbbXRpbWVdKSk7DQogICAgVHJGY3RNZXNzYWdlKF9fRklMRV9fLCBfX0xJTkVfXywgMiwgIkRhdGUgOiAiLmRhdGUoImwgZFMgb2YgRiBZIGg6aTpzIEEiLCAkdl9oZWFkZXJbbXRpbWVdKSk7DQogICAgaWYgKCgkdl9oZWFkZXJbdHlwZWZsYWddID0gJHZfZGF0YVt0eXBlZmxhZ10pID09ICI1IikNCiAgICB7DQogICAgICAkdl9oZWFkZXJbc2l6ZV0gPSAwOw0KICAgICAgVHJGY3RNZXNzYWdlKF9fRklMRV9fLCBfX0xJTkVfXywgMiwgIlNpemUgKGZvbGRlcikgOiAnJHZfaGVhZGVyW3NpemVdJyIpOw0KICAgIH0NCiAgICBUckZjdE1lc3NhZ2UoX19GSUxFX18sIF9fTElORV9fLCAyLCAiRmlsZSB0eXBlZmxhZyA6ICR2X2hlYWRlclt0eXBlZmxhZ10iKTsNCiAgICAvKiAtLS0tLSBBbGwgdGhlc2UgZmllbGRzIGFyZSByZW1vdmVkIGZvcm0gdGhlIGhlYWRlciBiZWNhdXNlIHRoZXkgZG8gbm90IGNhcnJ5IGludGVyZXN0aW5nIGluZm8NCiAgICAkdl9oZWFkZXJbbGlua10gPSB0cmltKCR2X2RhdGFbbGlua10pOw0KICAgIFRyRmN0TWVzc2FnZShfX0ZJTEVfXywgX19MSU5FX18sIDIsICJMaW5rbmFtZSA6ICR2X2hlYWRlcltsaW5rbmFtZV0iKTsNCiAgICAkdl9oZWFkZXJbbWFnaWNdID0gdHJpbSgkdl9kYXRhW21hZ2ljXSk7DQogICAgVHJGY3RNZXNzYWdlKF9fRklMRV9fLCBfX0xJTkVfXywgMiwgIk1hZ2ljIDogJHZfaGVhZGVyW21hZ2ljXSIpOw0KICAgICR2X2hlYWRlclt2ZXJzaW9uXSA9IHRyaW0oJHZfZGF0YVt2ZXJzaW9uXSk7DQogICAgVHJGY3RNZXNzYWdlKF9fRklMRV9fLCBfX0xJTkVfXywgMiwgIlZlcnNpb24gOiAkdl9oZWFkZXJbdmVyc2lvbl0iKTsNCiAgICAkdl9oZWFkZXJbdW5hbWVdID0gdHJpbSgkdl9kYXRhW3VuYW1lXSk7DQogICAgVHJGY3RNZXNzYWdlKF9fRklMRV9fLCBfX0xJTkVfXywgMiwgIlVuYW1lIDogJHZfaGVhZGVyW3VuYW1lXSIpOw0KICAgICR2X2hlYWRlcltnbmFtZV0gPSB0cmltKCR2X2RhdGFbZ25hbWVdKTsNCiAgICBUckZjdE1lc3NhZ2UoX19GSUxFX18sIF9fTElORV9fLCAyLCAiR25hbWUgOiAkdl9oZWFkZXJbZ25hbWVdIik7DQogICAgJHZfaGVhZGVyW2Rldm1ham9yXSA9IHRyaW0oJHZfZGF0YVtkZXZtYWpvcl0pOw0KICAgIFRyRmN0TWVzc2FnZShfX0ZJTEVfXywgX19MSU5FX18sIDIsICJEZXZtYWpvciA6ICR2X2hlYWRlcltkZXZtYWpvcl0iKTsNCiAgICAkdl9oZWFkZXJbZGV2bWlub3JdID0gdHJpbSgkdl9kYXRhW2Rldm1pbm9yXSk7DQogICAgVHJGY3RNZXNzYWdlKF9fRklMRV9fLCBfX0xJTkVfXywgMiwgIkRldm1pbm9yIDogJHZfaGVhZGVyW2Rldm1pbm9yXSIpOw0KICAgICovDQoNCiAgICAvLyAtLS0tLSBTZXQgdGhlIHN0YXR1cyBmaWVsZA0KICAgICR2X2hlYWRlcltzdGF0dXNdID0gIm9rIjsNCg0KICAgIC8vIC0tLS0tIFJldHVybg0KICAgIFRyRmN0RW5kKF9fRklMRV9fLCBfX0xJTkVfXywgJHZfcmVzdWx0KTsNCiAgICByZXR1cm4gJHZfcmVzdWx0Ow0KICB9DQogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiAgLy8gRnVuY3Rpb24gOiBQY2xUYXJIYW5kbGVyRGlyQ2hlY2soKQ0KICAvLyBEZXNjcmlwdGlvbiA6DQogIC8vICAgQ2hlY2sgaWYgYSBkaXJlY3RvcnkgZXhpc3RzLCBpZiBub3QgaXQgY3JlYXRlcyBpdCBhbmQgYWxsIHRoZSBwYXJlbnRzIGRpcmVjdG9yeQ0KICAvLyAgIHdoaWNoIG1heSBiZSB1c2VmdWwuDQogIC8vIFBhcmFtZXRlcnMgOg0KICAvLyAgICRwX2RpciA6IERpcmVjdG9yeSBwYXRoIHRvIGNoZWNrICh3aXRob3V0IC8gYXQgdGhlIGVuZCkuDQogIC8vIFJldHVybiBWYWx1ZXMgOg0KICAvLyAgICAxIDogT0sNCiAgLy8gICAtMSA6IFVuYWJsZSB0byBjcmVhdGUgZGlyZWN0b3J5DQogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQogIGZ1bmN0aW9uIFBjbFRhckhhbmRsZXJEaXJDaGVjaygkcF9kaXIpDQogIHsNCiAgICAkdl9yZXN1bHQgPSAxOw0KDQogICAgVHJGY3RTdGFydChfX0ZJTEVfXywgX19MSU5FX18sICJQY2xUYXJIYW5kbGVyRGlyQ2hlY2siLCAiJHBfZGlyIik7DQoNCiAgICAvLyAtLS0tLSBDaGVjayB0aGUgZGlyZWN0b3J5IGF2YWlsYWJpbGl0eQ0KICAgIGlmICgoaXNfZGlyKCRwX2RpcikpIHx8ICgkcF9kaXIgPT0gIiIpKQ0KICAgIHsNCiAgICAgIFRyRmN0RW5kKF9fRklMRV9fLCBfX0xJTkVfXywgIickcF9kaXInIGlzIGEgZGlyZWN0b3J5Iik7DQogICAgICByZXR1cm4gMTsNCiAgICB9DQoNCiAgICAvLyAtLS0tLSBMb29rIGZvciBmaWxlIGFsb25lDQogICAgLyoNCiAgICBpZiAoIXN0cnN0cigiJHBfZGlyIiwgIi8iKSkNCiAgICB7DQogICAgICBUckZjdEVuZChfX0ZJTEVfXywgX19MSU5FX18sICAiJyRwX2RpcicgaXMgYSBmaWxlIHdpdGggbm8gZGlyZWN0b3J5Iik7DQogICAgICByZXR1cm4gMTsNCiAgICB9DQogICAgKi8NCg0KICAgIC8vIC0tLS0tIEV4dHJhY3QgcGFyZW50IGRpcmVjdG9yeQ0KICAgICRwX3BhcmVudF9kaXIgPSBkaXJuYW1lKCRwX2Rpcik7DQogICAgVHJGY3RNZXNzYWdlKF9fRklMRV9fLCBfX0xJTkVfXywgMywgIlBhcmVudCBkaXJlY3RvcnkgaXMgJyRwX3BhcmVudF9kaXInIik7DQoNCiAgICAvLyAtLS0tLSBKdXN0IGEgY2hlY2sNCiAgICBpZiAoJHBfcGFyZW50X2RpciAhPSAkcF9kaXIpDQogICAgew0KICAgICAgLy8gLS0tLS0gTG9vayBmb3IgcGFyZW50IGRpcmVjdG9yeQ0KICAgICAgaWYgKCRwX3BhcmVudF9kaXIgIT0gIiIpDQogICAgICB7DQogICAgICAgIGlmICgoJHZfcmVzdWx0ID0gUGNsVGFySGFuZGxlckRpckNoZWNrKCRwX3BhcmVudF9kaXIpKSAhPSAxKQ0KICAgICAgICB7DQogICAgICAgICAgVHJGY3RFbmQoX19GSUxFX18sIF9fTElORV9fLCAkdl9yZXN1bHQpOw0KICAgICAgICAgIHJldHVybiAkdl9yZXN1bHQ7DQogICAgICAgIH0NCiAgICAgIH0NCiAgICB9DQoNCiAgICAvLyAtLS0tLSBDcmVhdGUgdGhlIGRpcmVjdG9yeQ0KICAgIFRyRmN0TWVzc2FnZShfX0ZJTEVfXywgX19MSU5FX18sIDMsICJDcmVhdGUgZGlyZWN0b3J5ICckcF9kaXInIik7DQogICAgaWYgKCFAbWtkaXIoJHBfZGlyLCAwNzc3KSkNCiAgICB7DQogICAgICAvLyAtLS0tLSBFcnJvciBsb2cNCiAgICAgIFBjbEVycm9yTG9nKC04LCAiVW5hYmxlIHRvIGNyZWF0ZSBkaXJlY3RvcnkgJyRwX2RpciciKTsNCg0KICAgICAgLy8gLS0tLS0gUmV0dXJuDQogICAgICBUckZjdEVuZChfX0ZJTEVfXywgX19MSU5FX18sIFBjbEVycm9yQ29kZSgpLCBQY2xFcnJvclN0cmluZygpKTsNCiAgICAgIHJldHVybiBQY2xFcnJvckNvZGUoKTsNCiAgICB9DQoNCiAgICAvLyAtLS0tLSBSZXR1cm4NCiAgICBUckZjdEVuZChfX0ZJTEVfXywgX19MSU5FX18sICR2X3Jlc3VsdCwgIkRpcmVjdG9yeSAnJHBfZGlyJyBjcmVhdGVkIik7DQogICAgcmV0dXJuICR2X3Jlc3VsdDsNCiAgfQ0KICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KDQogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQogIC8vIEZ1bmN0aW9uIDogUGNsVGFySGFuZGxlRXh0ZW5zaW9uKCkNCiAgLy8gRGVzY3JpcHRpb24gOg0KICAvLyBQYXJhbWV0ZXJzIDoNCiAgLy8gUmV0dXJuIFZhbHVlcyA6DQogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQogIGZ1bmN0aW9uIFBjbFRhckhhbmRsZUV4dGVuc2lvbigkcF90YXJuYW1lKQ0KICB7DQogICAgVHJGY3RTdGFydChfX0ZJTEVfXywgX19MSU5FX18sICJQY2xUYXJIYW5kbGVFeHRlbnNpb24iLCAidGFyPSRwX3Rhcm5hbWUiKTsNCg0KICAgIC8vIC0tLS0tIExvb2sgZm9yIGZpbGUgZXh0ZW5zaW9uDQogICAgaWYgKChzdWJzdHIoJHBfdGFybmFtZSwgLTcpID09ICIudGFyLmd6IikgfHwgKHN1YnN0cigkcF90YXJuYW1lLCAtNCkgPT0gIi50Z3oiKSkNCiAgICB7DQogICAgICBUckZjdE1lc3NhZ2UoX19GSUxFX18sIF9fTElORV9fLCAyLCAiQXJjaGl2ZSBpcyBhIGd6aXAgdGFyIik7DQogICAgICAkdl90YXJfbW9kZSA9ICJ0Z3oiOw0KICAgIH0NCiAgICBlbHNlIGlmIChzdWJzdHIoJHBfdGFybmFtZSwgLTQpID09ICIudGFyIikNCiAgICB7DQogICAgICBUckZjdE1lc3NhZ2UoX19GSUxFX18sIF9fTElORV9fLCAyLCAiQXJjaGl2ZSBpcyBhIHRhciIpOw0KICAgICAgJHZfdGFyX21vZGUgPSAidGFyIjsNCiAgICB9DQogICAgZWxzZQ0KICAgIHsNCiAgICAgIC8vIC0tLS0tIEVycm9yIGxvZw0KICAgICAgUGNsRXJyb3JMb2coLTksICJJbnZhbGlkIGFyY2hpdmUgZXh0ZW5zaW9uIik7DQoNCiAgICAgIFRyRmN0TWVzc2FnZShfX0ZJTEVfXywgX19MSU5FX18sIFBjbEVycm9yQ29kZSgpLCBQY2xFcnJvclN0cmluZygpKTsNCg0KICAgICAgJHZfdGFyX21vZGUgPSAiIjsNCiAgICB9DQoNCiAgICAvLyAtLS0tLSBSZXR1cm4NCiAgICBUckZjdEVuZChfX0ZJTEVfXywgX19MSU5FX18sICR2X3Rhcl9tb2RlKTsNCiAgICByZXR1cm4gJHZfdGFyX21vZGU7DQogIH0NCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KDQogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQogIC8vIEZ1bmN0aW9uIDogUGNsVGFySGFuZGxlUGF0aFJlZHVjdGlvbigpDQogIC8vIERlc2NyaXB0aW9uIDoNCiAgLy8gUGFyYW1ldGVycyA6DQogIC8vIFJldHVybiBWYWx1ZXMgOg0KICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KICBmdW5jdGlvbiBQY2xUYXJIYW5kbGVQYXRoUmVkdWN0aW9uKCRwX2RpcikNCiAgew0KICAgIFRyRmN0U3RhcnQoX19GSUxFX18sIF9fTElORV9fLCAiUGNsVGFySGFuZGxlUGF0aFJlZHVjdGlvbiIsICJkaXI9JyRwX2RpciciKTsNCiAgICAkdl9yZXN1bHQgPSAiIjsNCg0KICAgIC8vIC0tLS0tIExvb2sgZm9yIG5vdCBlbXB0eSBwYXRoDQogICAgaWYgKCRwX2RpciAhPSAiIikNCiAgICB7DQogICAgICAvLyAtLS0tLSBFeHBsb2RlIHBhdGggYnkgZGlyZWN0b3J5IG5hbWVzDQogICAgICAkdl9saXN0ID0gZXhwbG9kZSgiLyIsICRwX2Rpcik7DQoNCiAgICAgIC8vIC0tLS0tIFN0dWR5IGRpcmVjdG9yaWVzIGZyb20gbGFzdCB0byBmaXJzdA0KICAgICAgZm9yICgkaT1zaXplb2YoJHZfbGlzdCktMTsgJGk+PTA7ICRpLS0pDQogICAgICB7DQogICAgICAgIC8vIC0tLS0tIExvb2sgZm9yIGN1cnJlbnQgcGF0aA0KICAgICAgICBpZiAoJHZfbGlzdFskaV0gPT0gIi4iKQ0KICAgICAgICB7DQogICAgICAgICAgLy8gLS0tLS0gSWdub3JlIHRoaXMgZGlyZWN0b3J5DQogICAgICAgICAgLy8gU2hvdWxkIGJlIHRoZSBmaXJzdCAkaT0wLCBidXQgbm8gY2hlY2sgaXMgZG9uZQ0KICAgICAgICB9DQogICAgICAgIGVsc2UgaWYgKCR2X2xpc3RbJGldID09ICIuLiIpDQogICAgICAgIHsNCiAgICAgICAgICAvLyAtLS0tLSBJZ25vcmUgaXQgYW5kIGlnbm9yZSB0aGUgJGktMQ0KICAgICAgICAgICRpLS07DQogICAgICAgIH0NCiAgICAgICAgZWxzZSBpZiAoKCR2X2xpc3RbJGldID09ICIiKSAmJiAoJGkhPShzaXplb2YoJHZfbGlzdCktMSkpICYmICgkaSE9MCkpDQogICAgICAgIHsNCiAgICAgICAgICAvLyAtLS0tLSBJZ25vcmUgb25seSB0aGUgZG91YmxlICcvLycgaW4gcGF0aCwNCiAgICAgICAgICAvLyBidXQgbm90IHRoZSBmaXJzdCBhbmQgbGFzdCAnLycNCiAgICAgICAgfQ0KICAgICAgICBlbHNlDQogICAgICAgIHsNCiAgICAgICAgICAkdl9yZXN1bHQgPSAkdl9saXN0WyRpXS4oJGkhPShzaXplb2YoJHZfbGlzdCktMSk/Ii8iLiR2X3Jlc3VsdDoiIik7DQogICAgICAgIH0NCiAgICAgIH0NCiAgICB9DQoNCiAgICAvLyAtLS0tLSBSZXR1cm4NCiAgICBUckZjdEVuZChfX0ZJTEVfXywgX19MSU5FX18sICR2X3Jlc3VsdCk7DQogICAgcmV0dXJuICR2X3Jlc3VsdDsNCiAgfQ0KICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KDQoNCi8vIC0tLS0tIEVuZCBvZiBkb3VibGUgaW5jbHVkZSBsb29rDQp9DQo/Pg== ====== r4_optimizer.php ====== PD9waHAKJF9kYXRhX3R5cGUgPSAndGFncyc7CmluY2x1ZGUoInskcjRfY2ZnX3Jvb3R9cjRfY29tbW9uLnBocCIpOwokX09QVElNSVpFUiA9ICRfbWV0YV90YWdzOw== ====== r4_getHash.php ====== PD9waHAKCmlmICghZGVmaW5lZCgiRU5UX05PUVVPVEVTIikpIHsKICAgIGRlZmluZSgiRU5UX05PUVVPVEVTIiwgMCk7Cn0KCmlmICghZGVmaW5lZCgiRU5UX0NPTVBBVCIpKSB7CiAgICBkZWZpbmUoIkVOVF9DT01QQVQiLCAyKTsKfQoKaWYgKCFkZWZpbmVkKCJFTlRfUVVPVEVTIikpIHsKICAgIGRlZmluZSgiRU5UX1FVT1RFUyIsIDMpOwp9CgppZiAoIWZ1bmN0aW9uX2V4aXN0cygnaHRtbF9lbnRpdHlfZGVjb2RlJykpIHsKICAgIC8qKgogICAgICog0JLQtdGA0YHQuNGPIGh0dHA6Ly93d3cucGhwLm5ldC9tYW51YWwvZW4vZnVuY3Rpb24uaHRtbC1lbnRpdHktZGVjb2RlLnBocCDQtNC70Y8gUEhQIDQKICAgICAqCiAgICAgKiBAcmV0dXJuIHN0cmluZyBSZXR1cm5zIHRoZSBkZWNvZGVkIHN0cmluZwogICAgICovCiAgICBmdW5jdGlvbiBodG1sX2VudGl0eV9kZWNvZGUoJHN0cmluZywgJG9wdD1FTlRfQ09NUEFUKSB7CiAgICAgICAgJHRyYW5zX3RibCA9IGdldF9odG1sX3RyYW5zbGF0aW9uX3RhYmxlKEhUTUxfRU5USVRJRVMpOwogICAgICAgICR0cmFuc190YmwgPSBhcnJheV9mbGlwKCR0cmFuc190YmwpOwoKICAgICAgICBpZiAoJG9wdCAmIDEpIHsgLy8gVHJhbnNsYXRpbmcgc2luZ2xlIHF1b3RlcwogICAgICAgICAgICAvLyBBZGQgc2luZ2xlIHF1b3RlIHRvIHRyYW5zbGF0aW9uIHRhYmxlOyBkb2Vzbid0IGFwcGVhciB0byBiZSB0aGVyZSBieSBkZWZhdWx0CiAgICAgICAgICAgICR0cmFuc190YmxbIiZhcG9zOyJdID0gIiciOwogICAgICAgIH0KCiAgICAgICAgaWYgKCEoJG9wdCAmIDIpKSB7IC8vIE5vdCB0cmFuc2xhdGluZyBkb3VibGUgcXVvdGVzCiAgICAgICAgICAgIC8vIFJlbW92ZSBkb3VibGUgcXVvdGUgZnJvbSB0cmFuc2xhdGlvbiB0YWJsZQogICAgICAgICAgICB1bnNldCgkdHJhbnNfdGJsWyImcXVvdDsiXSk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gc3RydHIoJHN0cmluZywgJHRyYW5zX3RibCk7CiAgICB9Cn0KCi8qKgogKiDQn9GA0LXQvtCx0YDQsNC30YPQtdGCINCy0YHQtSBIVE1MLdGB0YPRidC90L7RgdGC0Lgg0LIg0YHQvtC+0YLQstC10YLRgdGC0LLRg9GO0YnQuNC1INGB0LjQvNCy0L7Qu9GLLgogKgogKiBAcmV0dXJuIHN0cmluZyBSZXR1cm5zIHRoZSBkZWNvZGVkIHN0cmluZwogKi8KZnVuY3Rpb24gX3VuZXNjYXBlKCRkYXRhKSB7CiAgICByZXR1cm4gaHRtbF9lbnRpdHlfZGVjb2RlKCRkYXRhKTsKfQoKLyoqCiAqINCg0LDQt9Cx0LjRgNCw0LXRgiBVUkwg0Lgg0LLQvtC30LLRgNCw0YnQsNC10YIg0LXQs9C+INC60L7QvNC/0L7QvdC10L3RgtGLICjQsiDRgdC+0L7RgtCy0LXRgtGB0YLQstC40Lgg0YEgUkZDIDE4MDgpOgogKiA8c2NoZW1lPjovLzxuZXRsb2M+LzxwYXRoPjs8cGFyYW1zPj88cXVlcnk+IzxmcmFnbWVudD4KICoKICogQHJldHVybiBhcnJheSDQnNCw0YHRgdC40LIg0LrQvtC80L/QvtC90LXQvdGC0L7QsiDRgNCw0LfQvtCx0YDQsNC90L3QvtCz0L4gVVJMCiAqLwpmdW5jdGlvbiBfcGFyc2VfdXJsKCR1cmwpIHsKICAgICRwYXJzZWRfdXJsID0gcGFyc2VfdXJsKCR1cmwpOwogICAgJHBhcnNlZF91cmxbJ3BhdGgnXSA9IGlzc2V0KCRwYXJzZWRfdXJsWydwYXRoJ10pID8gJHBhcnNlZF91cmxbJ3BhdGgnXSA6ICcnOwogICAgJHBhcnNlZF91cmxbJ3NjaGVtZSddID0gaXNzZXQoJHBhcnNlZF91cmxbJ3NjaGVtZSddKSA/ICRwYXJzZWRfdXJsWydzY2hlbWUnXSA6ICcnOwogICAgJHBhcnNlZF91cmxbJ25ldGxvYyddID0gaXNzZXQoJHBhcnNlZF91cmxbJ2hvc3QnXSkgPyAkcGFyc2VkX3VybFsnaG9zdCddIDogJyc7CiAgICAkcGFyc2VkX3VybFsncGFyYW1zJ10gPSBpc3NldCgkcGFyc2VkX3VybFsncGFyYW1zJ10pID8gJHBhcnNlZF91cmxbJ3BhcmFtcyddIDogJyc7CiAgICAkcGFyc2VkX3VybFsncXVlcnknXSA9IGlzc2V0KCRwYXJzZWRfdXJsWydxdWVyeSddKSA/ICRwYXJzZWRfdXJsWydxdWVyeSddIDogJyc7CiAgICAkcGFyc2VkX3VybFsnZnJhZ21lbnQnXSA9IGlzc2V0KCRwYXJzZWRfdXJsWydmcmFnbWVudCddKSA/ICRwYXJzZWRfdXJsWydmcmFnbWVudCddIDogJyc7CgogICAgbGlzdCgkcGFyc2VkX3VybFsncGF0aCddLCAkcGFyc2VkX3VybFsncGFyYW1zJ10pID0gYXJyYXlfcGFkKGV4cGxvZGUoJzsnLCAkcGFyc2VkX3VybFsncGF0aCddLCAyKSwgMiwgJycpOwoKICAgIHJldHVybiBhcnJheSgkcGFyc2VkX3VybFsnc2NoZW1lJ10sICRwYXJzZWRfdXJsWyduZXRsb2MnXSwgJHBhcnNlZF91cmxbJ3BhdGgnXSwKICAgICAgICAkcGFyc2VkX3VybFsncGFyYW1zJ10sICRwYXJzZWRfdXJsWydxdWVyeSddLCAkcGFyc2VkX3VybFsnZnJhZ21lbnQnXSk7Cn0KCi8qKgogKiBUaGlzIGNhbiBiZSBjb25mdXNpbmcgZm9yIGFueW9uZSB3aG8ncyB1c2VkIHRvIHRoZSBDR0kgc3RhbmRhcmQsIHNvIGtlZXAgaXQgaW4gbWluZC4KICoKICogQHJldHVybiBhcnJheSDQnNCw0YHRgdC40LIg0YDQsNC30L7QsdGA0LDQvdC90L7Qs9C+INC90LAg0YTRgNCw0LPQvNC10L3RgtGLINC/0L4gJyYnINC4ICc7JyDQuCAnPScgVVJMCiAqLwpmdW5jdGlvbiBwcm9wZXJfcGFyc2Vfc3RyKCRxcykgewogICAgJHBhaXJzID0gYXJyYXkoKTsKCiAgICBmb3JlYWNoIChleHBsb2RlKCcmJywgJHFzKSBhcyAkczEpIHsKICAgICAgICBmb3JlYWNoIChleHBsb2RlKCc7JywgJHMxKSBhcyAkczIpIHsKICAgICAgICAgICAgJHBhaXJzW10gPSAkczI7CiAgICAgICAgfQogICAgfQoKICAgICRhcnIgPSBhcnJheSgpOwoKICAgIGZvcmVhY2ggKCRwYWlycyBhcyAkcGFpcikgewogICAgICAgIGxpc3QoJG5hbWUsICR2YWx1ZSkgPSBhcnJheV9wYWQoZXhwbG9kZSgnPScsICRwYWlyLCAyKSwgMiwgTlVMTCk7CiAgICAgICAgJG5hbWUgPSBpc3NldCgkbmFtZSkgPyByYXd1cmxkZWNvZGUoJG5hbWUpIDogJG5hbWU7CiAgICAgICAgJHZhbHVlID0gaXNzZXQoJHZhbHVlKSA/IHJhd3VybGRlY29kZSgkdmFsdWUpIDogJHZhbHVlOwoKICAgICAgICBpZiAoaXNzZXQoJGFyclskbmFtZV0pKSB7CiAgICAgICAgICAgIGlmIChpc19hcnJheSgkYXJyWyRuYW1lXSkpIHsKICAgICAgICAgICAgICAgICRhcnJbJG5hbWVdW10gPSAkdmFsdWU7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAkYXJyWyRuYW1lXSA9IGFycmF5KCRhcnJbJG5hbWVdLCAkdmFsdWUpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkYXJyWyRuYW1lXSA9ICR2YWx1ZTsKICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuICRhcnI7Cn0KCi8qKgogKiDQoNCw0LfQsdC40YDQsNC10YIg0YHRgtGA0L7QutGDLCDQutC+0YLQvtGA0LDRjyDQtNC+0LvQttC90LAg0LjQvNC10YLRjCDRhNC+0YDQvNCw0YIg0LfQsNC/0YDQvtGB0LAgVVJMLCDQsiDQv9C10YDQtdC80LXQvdC90YvQtS4KICoKICogQHJldHVybiBhcnJheSDQnNCw0YHRgdC40LIg0YDQsNC30L7QsdGA0LDQvdC90L7QuSDRgdGC0YDQvtC60Lgg0LIg0L/QtdGA0LXQvNC10L3QvdGL0LUKICovCmZ1bmN0aW9uIF9wYXJzZV9xc2woJHF1ZXJ5LCAka2VlcF9ibGFua192YWx1ZXM9ZmFsc2UpIHsKICAgICRhcnIgPSBhcnJheSgpOwogICAgJGFyciA9IHByb3Blcl9wYXJzZV9zdHIoJHF1ZXJ5KTsKCiAgICBmb3JlYWNoICgkYXJyIGFzICRrZXkgPT4gJHZhbHVlKSB7CiAgICAgICAgaWYgKCR2YWx1ZSA9PSAnJykgewogICAgICAgICAgICBpZiAoISRrZWVwX2JsYW5rX3ZhbHVlcykgewogICAgICAgICAgICAgICAgdW5zZXQoJGFyclska2V5XSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIGlmIChpc19hcnJheSgkdmFsdWUpKSB7CiAgICAgICAgICAgICAgICBmb3JlYWNoICgkdmFsdWUgYXMgJGsgPT4gJHYpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoJHYgPT0gJycpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEka2VlcF9ibGFua192YWx1ZXMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2V0KCR2YWx1ZVska10pOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmIChlbXB0eSgkdmFsdWUpKSB7CiAgICAgICAgICAgICAgICAgICAgdW5zZXQoJGFyclska2V5XSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuICRhcnI7Cn0KCi8qKgogKiDQntGB0YLQsNCy0LvRj9C10YIg0YLQvtC70YzQutC+INC/0LDRgNCw0LzQtdGC0YDRiywg0YPQutCw0LfQsNC90L3Ri9C1INCyICRhdHRyaWJ1dGVzIChyNF9rbm93bnBhcmFtcy5saXN0KS4KICog0KPQtNCw0LvRj9C10YIg0L/QsNGA0LDQvNC10YLRgNGLINC40Lcg0LfQsNC00LDQvdC90L7Qs9C+INGB0L/QuNGB0LrQsCDQuCAkZXhjbHVkZV9hdHRyaWJ1dGVzICjQv9C+INGC0L7Rh9C90L7QvNGDINGB0L7QstC/0LDQtNC10L3QuNGOKS4KICoKICogQHJldHVybiBhcnJheQogKi8KZnVuY3Rpb24gX2RlbGV0ZV90cmFzaF9rZXl2YWxzKCRrZXl2YWxzLCAkYXR0cmlidXRlcz1hcnJheSgpLCAkZXhjbHVkZV9hdHRyaWJ1dGVzPWFycmF5KCksICRhbGxvd192YWx1ZV9saXN0PXRydWUpIHsKICAgICRyNF9leGNsdWRlX2F0dHJpYnV0ZXMgPSBhcnJheSgncjVzaG93aGFzaCcsICdyNXRlY2hpbmZvJyk7CiAgICAkZXhjbHVkZV9hdHRyaWJ1dGVzID0gYXJyYXlfbWVyZ2UoJHI0X2V4Y2x1ZGVfYXR0cmlidXRlcywgJGV4Y2x1ZGVfYXR0cmlidXRlcyk7CgogICAgZm9yZWFjaCAoYXJyYXlfa2V5cygka2V5dmFscykgYXMgJGtleSkgewogICAgICAgIGlmICghZW1wdHkoJGF0dHJpYnV0ZXMpICYmICFpbl9hcnJheSgka2V5LCAkYXR0cmlidXRlcykpIHsKICAgICAgICAgICAgdW5zZXQoJGtleXZhbHNbJGtleV0pOwogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CgogICAgICAgIGZvcmVhY2ggKCRleGNsdWRlX2F0dHJpYnV0ZXMgYXMgJGV4Y2x1ZGVfYXR0cmlidXRlKSB7CiAgICAgICAgICAgICRtYXRjaGVzID0gYXJyYXkoKTsKCiAgICAgICAgICAgIGlmIChwcmVnX21hdGNoKCcve3soLiopfX0vJywgJGV4Y2x1ZGVfYXR0cmlidXRlLCAkbWF0Y2hlcykpIHsKICAgICAgICAgICAgICAgIGlmIChwcmVnX21hdGNoKCIveyRtYXRjaGVzWzFdfS8iLCAka2V5KSkgewogICAgICAgICAgICAgICAgICAgIHVuc2V0KCRrZXl2YWxzWyRrZXldKTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIGlmICgka2V5ID09PSAkZXhjbHVkZV9hdHRyaWJ1dGUpIHsKICAgICAgICAgICAgICAgICAgICB1bnNldCgka2V5dmFsc1ska2V5XSk7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmICghJGFsbG93X3ZhbHVlX2xpc3QgJiYgaXNfYXJyYXkoJGtleXZhbHNbJGtleV0pKSB7CiAgICAgICAgICAgICRrZXl2YWxzWyRrZXldID0gZW5kKCRrZXl2YWxzWyRrZXldKTsKICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuICRrZXl2YWxzOwp9CgppZiAoIWZ1bmN0aW9uX2V4aXN0cygnaHR0cF9idWlsZF9xdWVyeScpKSB7CiAgICAvKioKICAgICAqINCS0LXRgNGB0LjRjyBodHRwOi8vd3d3LnBocC5uZXQvbWFudWFsL3J1L2Z1bmN0aW9uLmh0dHAtYnVpbGQtcXVlcnkucGhwINC00LvRjyBQSFAgNAogICAgICoKICAgICAqIEByZXR1cm4gc3RyaW5nINCS0L7Qt9Cy0YDQsNGJ0LDQtdGCIFVSTC3QutC+0LTQuNGA0L7QstCw0L3QvdGD0Y4g0YHRgtGA0L7QutGDCiAgICAgKi8KICAgIGZ1bmN0aW9uIGh0dHBfYnVpbGRfcXVlcnkoJHBhcmFtcywgJHByZWZpeD0nJywgJHJlbW92ZV9maW5hbF9hbXA9VFJVRSwgJHJlbW92ZV9udWxsX3ZhbHVlPVRSVUUpIHsKICAgICAgICAkcXVlcnlfc3RyaW5nID0gJyc7CgogICAgICAgIGlmIChpc19hcnJheSgkcGFyYW1zKSkgewogICAgICAgICAgICBmb3JlYWNoICgkcGFyYW1zIGFzICRrZXkgPT4gJHZhbHVlKSB7CiAgICAgICAgICAgICAgICAkY29ycmVjdF9rZXkgPSAkcHJlZml4OwoKICAgICAgICAgICAgICAgIGlmICgkcHJlZml4ID09PSAnJykgewogICAgICAgICAgICAgICAgICAgICRjb3JyZWN0X2tleSAuPSAka2V5OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgJGNvcnJlY3Rfa2V5IC49ICJbIiAuICRrZXkgLiAiXSI7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKCEkcmVtb3ZlX251bGxfdmFsdWUgfHwgaXNzZXQoJHZhbHVlKSkgewogICAgICAgICAgICAgICAgICAgIGlmICghaXNfYXJyYXkoJHZhbHVlKSkgewogICAgICAgICAgICAgICAgICAgICAgICAkcXVlcnlfc3RyaW5nIC49IHVybGVuY29kZSgkY29ycmVjdF9rZXkpIC4gIj0iIC4gdXJsZW5jb2RlKCR2YWx1ZSkgLiAiJiI7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAkcXVlcnlfc3RyaW5nIC49IGh0dHBfYnVpbGRfcXVlcnkoJHZhbHVlLCAkY29ycmVjdF9rZXksIEZBTFNFLCAkcmVtb3ZlX251bGxfdmFsdWUpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgaWYgKCRyZW1vdmVfZmluYWxfYW1wID09PSB0cnVlKSB7CiAgICAgICAgICAgIHJldHVybiBzdWJzdHIoJHF1ZXJ5X3N0cmluZywgMCwgc3RybGVuKCRxdWVyeV9zdHJpbmcpIC0gMSk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICByZXR1cm4gJHF1ZXJ5X3N0cmluZzsKICAgICAgICB9CiAgICB9Cn0KCi8qKgogKiDQk9C10L3QtdGA0LjRgNGD0LXRgiBVUkwt0LrQvtC00LjRgNC+0LLQsNC90L3Rg9GOINGB0YLRgNC+0LrRgyDQt9Cw0L/RgNC+0YHQsC4KICoKICogQHJldHVybiBzdHJpbmcg0JLQvtC30LLRgNCw0YnQsNC10YIgVVJMLdC60L7QtNC40YDQvtCy0LDQvdC90YPRjiDRgdGC0YDQvtC60YMKICovCmZ1bmN0aW9uIF91cmxlbmNvZGUoJHF1ZXJ5KSB7CiAgICBmb3JlYWNoICgkcXVlcnkgYXMgJGsgPT4gJHYpewogICAgICAgIGlmICghaXNzZXQoJHYpICYmICRrICE9ICcnKSB7CiAgICAgICAgICAgICRxdWVyeVska10gPSAnJzsKICAgICAgICB9CiAgICB9CgogICAgJHF1ZXJ5ID0gcHJlZ19yZXBsYWNlKCcjJTVCXGQrJTVEI2knLCAnJywgaHR0cF9idWlsZF9xdWVyeSgkcXVlcnkpKTsKICAgICRxdWVyeSA9IHN0cl9yZXBsYWNlKCcrJywgJyUyMCcsICRxdWVyeSk7CgogICAgcmV0dXJuICRxdWVyeTsKfQoKLyoqCiAqINCg0LXQt9C10YDQstC40YDRg9C10YIg0LfQsNC00LDQvdC90YvQuSDQvdCw0LHQvtGAIGVuY29kZS3Qv9C+0YHQu9C10LTQvtCy0LDRgtC10LvRjNC90L7RgdGC0LXQuS4KICoKICogQHJldHVybiBzdHJpbmcg0JLQvtC30LLRgNCw0YnQsNC10YIg0LTQtdC60L7QtNC40YDQvtCy0LDQvdC90YvQuSBVUkwg0LIg0LLQuNC00LUg0YHRgtGA0L7QutC4CiAqLwpmdW5jdGlvbiBfdW5xdW90ZXBhdGgoJHBhdGgpIHsKICAgIGZvcmVhY2ggKGFycmF5KCcyZicsICcyRicsICczZicsICczRicpIGFzICRyZXNlcnZlZCkgewogICAgICAgICRwYXRoID0gc3RyX3JlcGxhY2UoJyUnLiRyZXNlcnZlZCwgJyUyNScuc3RydG91cHBlcigkcmVzZXJ2ZWQpLCAkcGF0aCk7CiAgICB9CiAgICByZXR1cm4gcmF3dXJsZGVjb2RlKCRwYXRoKTsKfQoKLyoqCiAqINCf0YDQtdC+0LHRgNCw0LfRg9C10YIg0LDQtNGA0LXRgSDQsiDQutC+0YDRgNC10LrRgtC90YvQuSBVUkwuCiAqIFVuc2FmZS3RgdC40LzQstC+0LvRiyAo0YHQvC4gaHR0cDovL3d3dy5hc2NpaXRhYmxlLmNvbS8pINC/0YDQtdC+0LHRgNCw0LfRg9GO0YLRgdGPINCyINGB0L7QvtGC0LLQtdGC0YHRgtCy0LjQuCDRgSBSRkMtMzk4Ni4KICoKICogQHJldHVybiBzdHJpbmcg0JrQvtGA0YDQtdC60YLQvdGL0LkgVVJMCiAqLwpmdW5jdGlvbiBfc2FmZV91cmxfc3RyaW5nKCR1cmwpIHsKICAgIGlmICghZnVuY3Rpb25fZXhpc3RzKCdfc2FmZV91cmxfc3RyaW5nX2NhbGxiYWNrJykpIHsKICAgICAgICBmdW5jdGlvbiBfc2FmZV91cmxfc3RyaW5nX2NhbGxiYWNrKCRtYXRjaGVzKSB7CiAgICAgICAgICAgIHJldHVybiAiJSIuc3RydG91cHBlcihiaW4yaGV4KCRtYXRjaGVzWzFdKSk7CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiBwcmVnX3JlcGxhY2VfY2FsbGJhY2soJyMoW1x4MDAtXHgyMFx4MjJceDNDXHgzRVx4NUItXHg1RVx4NjBceDdCXHg3RFx4N0ZceDgwLVx4RkZdKSNpJywgJ19zYWZlX3VybF9zdHJpbmdfY2FsbGJhY2snLCAkdXJsKTsKfQoKLyoqCiAqINCS0L7Qt9Cy0YDQsNGJ0LDQtdGCINGB0L7RgdGC0LDQstC70LXQvdC90YvQuSBVUkwuCiAqCiAqIEByZXR1cm4gc3RyaW5nINCh0L7RgdGC0LDQstC70LXQvdC90YvQuSDQuNC3INGE0YDQsNCz0LzQtdC90YLQvtCyIFVSTAogKi8KZnVuY3Rpb24gX3VybHVucGFyc2UoJGRhdGEpIHsKICAgICRzY2hlbWUgPSBpc3NldCgkZGF0YVsnc2NoZW1lJ10pICYmICRkYXRhWydzY2hlbWUnXSAhPSAnJyA/ICRkYXRhWydzY2hlbWUnXS4nOi8vJyA6ICcnOwogICAgJG5ldGxvYyA9IGlzc2V0KCRkYXRhWyduZXRsb2MnXSkgJiYgJGRhdGFbJ25ldGxvYyddICE9ICcnID8gJGRhdGFbJ25ldGxvYyddIDogJyc7CiAgICAkcGF0aCA9IGlzc2V0KCRkYXRhWydwYXRoJ10pICYmICRkYXRhWydwYXRoJ10gIT0gJycgPyAkZGF0YVsncGF0aCddIDogJyc7CiAgICAkcGFyYW1zID0gaXNzZXQoJGRhdGFbJ3BhcmFtcyddKSAmJiAkZGF0YVsncGFyYW1zJ10gIT0gJycgPyAnOycuJGRhdGFbJ3BhcmFtcyddIDogJyc7CiAgICAkcXVlcnkgPSBpc3NldCgkZGF0YVsncXVlcnknXSkgJiYgJGRhdGFbJ3F1ZXJ5J10gIT0gJycgPyAnPycuJGRhdGFbJ3F1ZXJ5J10gOiAnJzsKICAgICRmcmFnbWVudCA9IGlzc2V0KCRkYXRhWydmcmFnbWVudCddKSAmJiAkZGF0YVsnZnJhZ21lbnQnXSAhPSAnJyA/ICcjJy4kZGF0YVsnZnJhZ21lbnQnXSA6ICcnOwoKICAgIHJldHVybiAkc2NoZW1lLiRuZXRsb2MuJHBhdGguJHBhcmFtcy4kcXVlcnkuJGZyYWdtZW50Owp9CgovKioKICog0J/RgNC40LLQvtC00LjRgiDRg9GA0Lsg0Log0LrQsNC90L7QvdC40YfQtdGB0LrQvtC80YMg0LLQuNC00YMg0L/RgNC40LzQtdC90Y/RjyDRgdC70LXQtNGD0Y7RidC40LUg0L/RgNC+0YbQtdC00YPRgNGLOgogKgogKiAtIHVuZXNjYXBlINGB0LjQvNCy0L7Qu9C+0LIg0LIg0YPRgNC70LUKICogLSDRgdC+0YDRgtC40YDRg9C10YIgZ2V0LdC/0LDRgNCw0LzQtdGC0YDRiyDQt9Cw0L/RgNC+0YHQsCwg0YLQvtC70YzQutC+INC/0L4g0LrQu9GO0YfRgwogKiAtINC/0YDQvtGG0LXQvdGC0L3QvtC1INC60L7QtNC40YDQvtCy0LDQvdC40LUg0L/Rg9GC0LjQuSDQuCDQsNGA0LPRg9C80LXQvdGC0L7QsiDQt9Cw0L/RgNC+0YHQsCwgbm9uLUFTQ0lJINGB0LjQvNCy0L7Qu9GLINC/0YDQvtGG0LXQvdGC0L3QviDQutC+0LTRg9GA0YPRjtGC0YHRjyDRgSDQv9C+0LzQvtGJ0YzRjiBVVEYtOCAoUkZDLTM5ODYpCiAqIC0g0LLRgdC1INC/0YDQvtCx0LXQu9GLINC/0YDQtdCy0YDQsNGJ0LDRjtGC0YHRjyDQsiAnJTIwJyAo0L/QviDQtNC+0LrRg9C80LXQvdGC0LDRhtC40Lgg0YLQsNC6INC/0YDQsNCy0LjQu9GM0L3QviDQtNC10LvQsNGC0Ywg0LTQu9GPINCy0YHQtdGFINGD0YDQu9C+0LIsINC60YDQvtC80LUg0YPRgNC70L7QsiDQuNC3INGE0L7RgNC8KQogKiAtINC/0YDQuNCy0L7QtNC40YIg0L/RgNC+0YbQtdC90YLQvdC+0LUg0LrQvtC00LjRgNC+0LLQsNC90LjQtSDQuiDQtdC00LjQvdC+0LzRgyDRgNC10LPQuNGB0YLRgNGDICglMmYgLT4gJTJGKQogKiAtINGB0L7RhdGA0LDQvdGP0YLRjCBnZXQt0L/QsNGA0LDQvNC10YLRgNGLINGBINC/0YPRgdGC0YvQvCDQt9C90LDRh9C10L3QuNC10LwgKNC00L4g0YLQtdGFINC/0L7RgCDQv9C+0LrQsCBrZWVwX2JsYW5rX3ZhbHVlcyDQvdC1INCx0YPQtNC10YIg0LLRi9GB0YLQsNCy0LvQtdC9INCyIGZhbHNlKQogKiAtINGD0LTQsNC70Y/QtdGCINGE0YDQsNCz0LzQtdC90YLRiyAo0Y/QutC+0YDQuCkgKNC00L4g0YLQtdGFINC/0L7RgCDQv9C+0LrQsCBrZWVwX2ZyYWdtZW50cyDQvdC1INCx0YPQtNC10YIg0LLRi9GB0YLQsNCy0LvQtdC9INCyIHRydWUpCiAqIC0g0LTQvtCx0LDQstC70Y/QtdGCINGB0LvRjdGIINCyINC60L7QvdGG0LUg0L/Rg9GC0LXQuQogKgogKiBAcGFyYW0gc3RyaW5nICR1cmwg0JjRgdC60L7QvNGL0LkgVVJMCiAqIEBwYXJhbSBib29sICRrZWVwX2JsYW5rX3ZhbHVlcyDQodC+0YXRgNCw0L3QuNGC0Ywg0L/Rg9GB0YLRi9C1INC/0LDRgNCw0LzQtdGC0YDRiwogKiBAcGFyYW0gYm9vbCAka2VlcF9mcmFnbWVudHMg0KHQvtGF0YDQsNC90LjRgtGMINGE0YDQsNCz0LzQtdC90YLRiyAo0Y/QutC+0YDRjykKICogQHBhcmFtIGFycmF5ICRhdHRyaWJ1dGVzINCh0L/QuNGB0L7QuiDQv9Cw0YDQsNC80LXRgtGA0L7QsiDQutC+0YLQvtGA0YvQtSDQtNC+0LvQttC90Ysg0L7RgdGC0LDRgtGM0YHRjyDQsiDRg9GA0LvQtQogKiBAcGFyYW0gYXJyYXkgJGV4Y2x1ZGVfYXR0cmlidXRlcyDQodC/0LjRgdC+0Log0L/QsNGA0LDQvNC10YLRgNC+0LIg0LrQvtGC0L7RgNGL0LUg0L3Rg9C20L3QviDRg9Cx0YDQsNGC0Ywg0LjQtyDRg9GA0LvQsAogKiBAcGFyYW0gYm9vbCAkYWxsb3dfdmFsdWVfbGlzdCDQntGB0YLQsNCy0LjRgtGMINC00YPQsdC70LjRgNGD0Y7RidC40LXRgdGPIEdFVC3Qv9Cw0YDQsNC80LXRgtGA0Ysg0LIg0YPRgNC70LUKICoKICogQHJldHVybiBzdHJpbmcgVVJMINCyINC60LDQvdC+0L3QuNGH0LXRgdC60L7QvCDQstC40LTQtQogKi8KZnVuY3Rpb24gX2Nhbm9uaWNhbGl6ZV91cmwoJHVybCwgJGtlZXBfYmxhbmtfdmFsdWVzPXRydWUsICRrZWVwX2ZyYWdtZW50cz1mYWxzZSwKICAgICAgICAkZW5jb2Rpbmc9J1VURi04JywgJGF0dHJpYnV0ZXM9YXJyYXkoKSwgJGV4Y2x1ZGVfYXR0cmlidXRlcz1hcnJheSgpLCAkYWxsb3dfdmFsdWVfbGlzdD10cnVlKSB7CiAgICBpZiAoIWZ1bmN0aW9uX2V4aXN0cygnX2Nhbm9uaWNhbGl6ZV91cmxfY2FsbGJhY2snKSkgewogICAgICAgIGZ1bmN0aW9uIF9jYW5vbmljYWxpemVfdXJsX2NhbGxiYWNrKCRtYXRjaGVzKSB7CiAgICAgICAgICAgIHJldHVybiBjaHIoaGV4ZGVjKCRtYXRjaGVzWzFdKSk7CiAgICAgICAgfQogICAgfQoKICAgICR1cmwgPSBwcmVnX3JlcGxhY2VfY2FsbGJhY2soJyMoXFxceFswLTlBLUZdezJ9KSNpJywgJ19jYW5vbmljYWxpemVfdXJsX2NhbGxiYWNrJywgJHVybCk7CgogICAgaWYgKGZ1bmN0aW9uX2V4aXN0cygnbWJfY2hlY2tfZW5jb2RpbmcnKSkgewogICAgICAgIGlmICghbWJfY2hlY2tfZW5jb2RpbmcoJHVybCwgJGVuY29kaW5nKSkgewogICAgICAgICAgICAkdXJsID0gbWJfY29udmVydF9lbmNvZGluZygkdXJsLCAkZW5jb2RpbmcpOwogICAgICAgIH0KICAgIH0KICAgIGVsc2VpZiAoZnVuY3Rpb25fZXhpc3RzKCdtYl9kZXRlY3RfZW5jb2RpbmcnKSkgewogICAgICAgIGlmIChtYl9kZXRlY3RfZW5jb2RpbmcoJHVybCkgIT0gJGVuY29kaW5nKSB7CiAgICAgICAgICAgICR1cmwgPSBtYl9jb252ZXJ0X2VuY29kaW5nKCR1cmwsICRlbmNvZGluZyk7CiAgICAgICAgfQogICAgfQoKICAgICR1cmwgPSBfdW5lc2NhcGUodHJpbSgkdXJsKSk7CgogICAgbGlzdCgkc2NoZW1lLCAkbmV0bG9jLCAkcGF0aCwgJHBhcmFtcywgJHF1ZXJ5LCAkZnJhZ21lbnQpID0gX3BhcnNlX3VybCgkdXJsKTsKCiAgICAka2V5dmFscyA9IF9wYXJzZV9xc2woJHF1ZXJ5LCAka2VlcF9ibGFua192YWx1ZXMpOwogICAgJGtleXZhbHMgPSBfZGVsZXRlX3RyYXNoX2tleXZhbHMoJGtleXZhbHMsICRhdHRyaWJ1dGVzLCAkZXhjbHVkZV9hdHRyaWJ1dGVzLCAkYWxsb3dfdmFsdWVfbGlzdCk7CiAgICBrc29ydCgka2V5dmFscyk7CgogICAgJHF1ZXJ5ID0gX3VybGVuY29kZSgka2V5dmFscyk7CgogICAgJHBhdGggPSBfc2FmZV91cmxfc3RyaW5nKF91bnF1b3RlcGF0aCgkcGF0aCkpIHwgJy8nOwogICAgJHBhdGggPSBwcmVnX3JlcGxhY2UoJyMvKyMnLCAnLycsICRwYXRoKTsKCiAgICAkZnJhZ21lbnQgPSAka2VlcF9mcmFnbWVudHMgPyAkZnJhZ21lbnQgOiAnJzsKCiAgICAkZGF0YSA9IGFycmF5KAogICAgICAgICdzY2hlbWUnID0+IHN0cnRvbG93ZXIoJHNjaGVtZSksCiAgICAgICAgJ25ldGxvYycgPT4gc3RydG9sb3dlcigkbmV0bG9jKSwKICAgICAgICAncGF0aCcgPT4gJHBhdGgsCiAgICAgICAgJ3BhcmFtcycgPT4gJHBhcmFtcywKICAgICAgICAncXVlcnknID0+ICRxdWVyeSwKICAgICAgICAnZnJhZ21lbnQnID0+ICRmcmFnbWVudAogICAgKTsKCiAgICByZXR1cm4gX3VybHVucGFyc2UoJGRhdGEpOwp9CgovKioKICog0JLQvtC30LLRgNCw0YnQsNC10YIg0L7RgtC90L7RgdC40YLQtdC70YzQvdGL0Lkg0L/Rg9GC0YwgVVJMLgogKgogKiBAcmV0dXJuIHN0cmluZyDQntGC0L3QvtGB0LjRgtC10LvRjNC90YvQuSDQv9GD0YLRjAogKi8KZnVuY3Rpb24gX2dldF9yZWxhdGl2ZV91cmwoJHVybCkgewogICAgJHVybCA9IHByZWdfcmVwbGFjZSgnI2h0dHBzPzovLy4qPyg/Oi98JCkjaScsICcvJywgJHVybCwgMSk7CiAgICAkdXJsID0gbHRyaW0oJHVybCwgJy8nKTsKCiAgICByZXR1cm4gJy8nLiR1cmw7Cn0KCi8qKgogKiBDdXN0b20gaGV4ZGVjIGZ1bmN0aW9uIGZvciBncmVhdGVyIG51bWJlcnMgdXNpbmcgQkMgTWF0aC4KICoKICogQGxpbmsgaHR0cDovL3d3dy5waHAubmV0L21hbnVhbC9lbi9ib29rLmJjLnBocCBCQ01hdGggQXJiaXRyYXJ5IFByZWNpc2lvbiBNYXRoZW1hdGljcwogKgogKiBAcmV0dXJuIHN0cmluZwogKi8KZnVuY3Rpb24gYmNoZXhkZWMoJGhleCkgewogICAgJGRlYyA9IDA7CiAgICAkbGVuID0gc3RybGVuKCRoZXgpOwoKICAgIGZvciAoJGkgPSAxOyAkaSA8PSAkbGVuOyAkaSsrKSB7CiAgICAgICAgJGRlYyA9IGJjYWRkKCRkZWMsIGJjbXVsKHN0cnZhbChoZXhkZWMoJGhleFskaSAtIDFdKSksIGJjcG93KCcxNicsIHN0cnZhbCgkbGVuIC0gJGkpKSkpOwogICAgfQoKICAgIHJldHVybiAkZGVjOwp9CgovKioKICogQ3VzdG9tIGhleGRlYyBmdW5jdGlvbiBmb3IgZ3JlYXRlciBudW1iZXJzIHVzaW5nIEdNUC4KICoKICogQGxpbmsgaHR0cDovL3d3dy5waHAubmV0L21hbnVhbC9lbi9ib29rLmdtcC5waHAgR05VIE11bHRpcGxlIFByZWNpc2lvbgogKgogKiBAcmV0dXJuIHN0cmluZwogKi8KZnVuY3Rpb24gZ21wX2hleGRlYygkaGV4KSB7CiAgICAkZ21wID0gZ21wX2luaXQoMCk7CiAgICAkbXVsdCA9IGdtcF9pbml0KDEpOwoKICAgIGZvciAoJGkgPSBzdHJsZW4oJGhleCkgLSAxOyAkaSA+PSAwOyAkaS0tLCAkbXVsdCA9IGdtcF9tdWwoJG11bHQsIDE2KSkgewogICAgICAgICRnbXAgPSBnbXBfYWRkKCRnbXAsIGdtcF9tdWwoJG11bHQsIGhleGRlYygkaGV4WyRpXSkpKTsKICAgIH0KCiAgICByZXR1cm4gZ21wX3N0cnZhbCgkZ21wKTsKfQoKCi8qKgogKiBDdXN0b20gaGV4ZGVjIGZ1bmN0aW9uIGZvciBncmVhdGVyIG51bWJlcnMuCiAqCiAqIEByZXR1cm4gc3RyaW5nCiAqLwpmdW5jdGlvbiBoZXgyZGVjKCRzKSB7CiAgICBpZiAoIWZ1bmN0aW9uX2V4aXN0cygnbnVtYmVyJykpIHsKICAgICAgICBmdW5jdGlvbiBudW1iZXIoJHBhcmFtKSB7CiAgICAgICAgICAgIHJldHVybiBpbnR2YWwoJHBhcmFtKTsKICAgICAgICB9CiAgICB9CgogICAgaWYgKCFmdW5jdGlvbl9leGlzdHMoJ2FkZCcpKSB7CiAgICAgICAgZnVuY3Rpb24gYWRkKCR4LCAkeSkgewogICAgICAgICAgICAkYyA9IDA7CiAgICAgICAgICAgICRyID0gYXJyYXkoKTsKICAgICAgICAgICAgJHggPSBhcnJheV9tYXAoJ251bWJlcicsIHN0cl9zcGxpdCgkeCkpOwogICAgICAgICAgICAkeSA9IGFycmF5X21hcCgnbnVtYmVyJywgc3RyX3NwbGl0KCR5KSk7CgogICAgICAgICAgICB3aGlsZSAoY291bnQoJHgpIHx8IGNvdW50KCR5KSkgewogICAgICAgICAgICAgICAgJHMgPSAoYXJyYXlfcG9wKCR4KSkgKyAoYXJyYXlfcG9wKCR5KSkgKyAkYzsKICAgICAgICAgICAgICAgIGFycmF5X3Vuc2hpZnQoJHIsICRzIDwgMTAgPyAkcyA6ICRzIC0gMTApOwogICAgICAgICAgICAgICAgJGMgPSAkcyA8IDEwID8gMCA6IDE7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICgkYykgewogICAgICAgICAgICAgICAgYXJyYXlfdW5zaGlmdCgkciwgJGMpOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gaW1wbG9kZSgnJywgJHIpOwogICAgICAgIH0KICAgIH0KCiAgICAkZGVjID0gJzAnOwogICAgJHMgPSBzdHJfc3BsaXQoJHMpOwoKICAgIGZvcmVhY2goJHMgYXMgJGNocikgewogICAgICAgICRuID0gaW50dmFsKCRjaHIsIDE2KTsKCiAgICAgICAgZm9yICgkdCA9IDg7ICR0OyAkdCA+Pj0gMSkgewogICAgICAgICAgICAkZGVjID0gKHN0cmluZylhZGQoJGRlYywgJGRlYyk7CgogICAgICAgICAgICBpZiAoJG4gJiAkdCkgewogICAgICAgICAgICAgICAgJGRlYyA9IChzdHJpbmcpYWRkKCRkZWMsICcxJyk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuICRkZWM7Cn0KCi8qKgogKiDQpdGN0YjQuNGA0YPQtdGCINGB0YLRgNC+0LrRgyDQuCDRg9GB0LXQutCw0LXRgiDQtNC+IDIwINGB0LjQvNCy0L7Qu9C+0LIKICoKICogQHJldHVybiBzdHJpbmcg0KPRgdC10YfQtdC90L3QsNGPINGF0LXRiNC40YDQvtCy0LDQvdC90LDRjyDRgdGC0YDQvtC60LAKICovCmZ1bmN0aW9uIF9oYXNoX3N0cmluZygkc3RyaW5nKSB7CiAgICAkc3RyaW5nID0gc3RyX3JlcGxhY2UoJyZhbXA7JywgJyYnLCBzdHJfcmVwbGFjZSgnJmFtcDsnLCAnJicsICRzdHJpbmcpKTsgIC8vINCV0YHQu9C4INC40YHQv9C+0LvRjNC30YPQtdGC0YHRjyBwaHBfdmFsdWUgYXJnX3NlcGFyYXRvciAiJmFtcDsiCgogICAgaWYgKGZ1bmN0aW9uX2V4aXN0cygnYmNhZGQnKSkgewogICAgICAgICRzdHJpbmdfaGFzaCA9IGJjaGV4ZGVjKG1kNSgkc3RyaW5nKSk7CiAgICB9CiAgICBlbHNlaWYgKGZ1bmN0aW9uX2V4aXN0cygnZ21wX2FkZCcpKSB7CiAgICAgICAgJHN0cmluZ19oYXNoID0gZ21wX2hleGRlYyhtZDUoJHN0cmluZykpOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgJHN0cmluZ19oYXNoID0gaGV4MmRlYyhtZDUoJHN0cmluZykpOwogICAgfQoKICAgIHJldHVybiBzdWJzdHIoJHN0cmluZ19oYXNoLCAwLCAxOCk7Cn0KCi8qKgogKiDQktC+0LfQstGA0LDRidCw0LXRgiDRhdC10Ygg0L7RgtC90L7RgdC40YLQtdC70YzQvdC+0LPQviBVUkwuCiAqINCd0L7QstCw0Y8g0YTRg9C90LrRhtC40Y8sINGB0L7Qt9C00LDQvdC90LDRjyDQtNC70Y8g0L/QvtC70YPRh9C10L3QuNGPINC40LTQtdC90YLQuNGH0L3Ri9GFINC00LDQvdC90YvRhSDRgSBweXRob24g0LjQtyDQmtCY0KIuCiAqCiAqIEByZXR1cm4gc3RyaW5nINCl0LXRiCDQvtGC0L3QvtGB0LjRgtC10LvRjNC90L7Qs9C+IFVSTAogKi8KZnVuY3Rpb24gX3JlbGF0aXZlX3VybF9oYXNoKCR1cmwsICRyNF9jZmdfcm9vdD0nJywgJGV4Y2x1ZGVfYXR0cmlidXRlcz1hcnJheSgpKSB7CiAgICAkYXR0cmlidXRlcyA9IGFycmF5KCk7CgogICAgJHI0X2tub3ducGFyYW1zID0gInskcjRfY2ZnX3Jvb3R9cjRfa25vd25wYXJhbXMubGlzdCI7CgogICAgaWYgKGZpbGVfZXhpc3RzKCRyNF9rbm93bnBhcmFtcykpIHsKICAgICAgICAkYXR0cmlidXRlcyA9IGZpbGUoJHI0X2tub3ducGFyYW1zKTsKCiAgICAgICAgaWYgKGlzX2FycmF5KCRhdHRyaWJ1dGVzKSkgewogICAgICAgICAgICBmb3JlYWNoICgkYXR0cmlidXRlcyBhcyAka2V5ID0+ICRhdHRyaWJ1dGUpIHsKICAgICAgICAgICAgICAgICRhdHRyaWJ1dGVzWyRrZXldID0gdHJpbSgkYXR0cmlidXRlKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICBpZiAoZW1wdHkoJGV4Y2x1ZGVfYXR0cmlidXRlcykpIHsKICAgICAgICAkcjRfYmFkcGFyYW1zID0gInskcjRfY2ZnX3Jvb3R9cjRfYmFkcGFyYW1zLmxpc3QiOwoKICAgICAgICBpZiAoZmlsZV9leGlzdHMoJHI0X2JhZHBhcmFtcykpIHsKICAgICAgICAgICAgJGV4Y2x1ZGVfYXR0cmlidXRlcyA9IGZpbGUoJHI0X2JhZHBhcmFtcyk7CgogICAgICAgICAgICBpZiAoaXNfYXJyYXkoJGV4Y2x1ZGVfYXR0cmlidXRlcykpIHsKICAgICAgICAgICAgICAgIGZvcmVhY2ggKCRleGNsdWRlX2F0dHJpYnV0ZXMgYXMgJGtleSA9PiAkZXhjbHVkZV9hdHRyaWJ1dGUpIHsKICAgICAgICAgICAgICAgICAgICAkZXhjbHVkZV9hdHRyaWJ1dGVzWyRrZXldID0gdHJpbSgkZXhjbHVkZV9hdHRyaWJ1dGUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgICRjYW5vbmljYWxfdXJsID0gX2Nhbm9uaWNhbGl6ZV91cmwoJHVybCwgdHJ1ZSwgZmFsc2UsICdVVEYtOCcsICRhdHRyaWJ1dGVzLCAkZXhjbHVkZV9hdHRyaWJ1dGVzKTsKICAgICRyZWxhdGl2ZV9jYW5vbmljYWxfdXJsID0gX2dldF9yZWxhdGl2ZV91cmwoJGNhbm9uaWNhbF91cmwpOwoKICAgIHJldHVybiBfaGFzaF9zdHJpbmcoJHJlbGF0aXZlX2Nhbm9uaWNhbF91cmwpOwp9CgovKioKICog0KHRgtCw0YDQsNGPINGE0YPQvdC60YbQuNGPCiAqCiAqIEByZXR1cm4gc3RyaW5nINCl0LXRiCBtZDUg0L7RgiAkdXJsINC4INC10LPQviDQv9Cw0YDQsNC80LXRgtGA0L7QsgogKi8KZnVuY3Rpb24gZ2V0SGFzaCgkdXJsLCAkcjRfY2ZnX3Jvb3QpIHsKICAgICR1ID0gcGFyc2VfdXJsKHN0cl9yZXBsYWNlKCcmYW1wOycsICcmJywgJHVybCkpOwoKICAgICRyNF9rbm93bnBhcmFtcyA9ICJ7JHI0X2NmZ19yb290fXI0X2tub3ducGFyYW1zLmxpc3QiOwoKICAgIGlmIChmaWxlX2V4aXN0cygkcjRfa25vd25wYXJhbXMpKSB7CiAgICAgICAgJGtwID0gZmlsZSgkcjRfa25vd25wYXJhbXMpOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgJGtwID0gYXJyYXkoKTsKICAgIH0KCiAgICAka25vd25fcGFyYW1zID0gYXJyYXkoKTsKCiAgICBmb3JlYWNoICgka3AgYXMgJEspIHsKICAgICAgICAka25vd25fcGFyYW1zW10gPSB0cmltKCRLKTsKICAgIH0KCiAgICBpZiAoZW1wdHkoJHVbJ3BhdGgnXSkpIHsKICAgICAgICAkdVsncGF0aCddID0gJy8nOwogICAgfQoKICAgICRoYXNoID0gYXJyYXkoKTsKICAgICRoYXNoWyc9cCddID0gJHVbJ3BhdGgnXTsKCiAgICBpZiAoIWVtcHR5KCR1WydxdWVyeSddKSkgewogICAgICAgICRhcyA9IGV4cGxvZGUoJyYnLCAkdVsncXVlcnknXSk7CgogICAgICAgIGZvcmVhY2ggKCRhcyBhcyAkYXR0cikgewogICAgICAgICAgICAkcGFpciA9IGV4cGxvZGUoJz0nLCAkYXR0cik7CgogICAgICAgICAgICBpZiAoIWVtcHR5KCRwYWlyKSkgewogICAgICAgICAgICAgICAgJHYgPSAnJzsKICAgICAgICAgICAgICAgICRrID0gJyc7CgogICAgICAgICAgICAgICAgaWYgKCFlbXB0eSgkcGFpclsxXSkpIHsKICAgICAgICAgICAgICAgICAgICBpZiAocHJlZ19tYXRjaCgnL1swLTlhLWZBLUZdezMyfS8nLCAkcGFpclsxXSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAkdiA9ICRwYWlyWzFdOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmICghZW1wdHkoJHBhaXJbMF0pKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCFpbl9hcnJheSgkcGFpclswXSwgJGtub3duX3BhcmFtcykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAkayA9ICRwYWlyWzBdOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmICghaXNzZXQoJGhhc2hbJGtdKSkgewogICAgICAgICAgICAgICAgICAgICRoYXNoWyRrXSA9IGFycmF5KCk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgJGhhc2hbJGtdW10gPSAkdjsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICBrc29ydCgkaGFzaCk7CiAgICAkaGFzaCA9IG1kNShzZXJpYWxpemUoJGhhc2gpKTsKCiAgICByZXR1cm4gJGhhc2g7Cn0K ====== r4_vars.php ====== PD9waHAKCiAgICAkcjRfY2ZnX3N0cmlwX2Zyb21fdXJpID0gIiI7CgogICAgJHI0X2NmZ19tYXhfbG9nX3NpemUgPSA0OwoKICAgICRyNF9jZmdfZXJyb3JfcmVwb3J0aW5nID0gRV9BTEw7CgogICAgJHI0X2NmZ190ZXN0cGF0dGVybiA9ICI/eHp4IjsKCiAgICAkcjRfY2ZnX3NlcGFyYXRvciA9ICI8YnI+IjsKCiAgICAkcjRfY2ZnX2xpbmtfZW5jb2RpbmcgPSAiVVRGLTgiOwoKICAgICRyNF9jZmdfbGlua19lbmNvZGluZyA9ICJ1dGYtOCI7CgogICAgJHI0X2NmZ19jbXMgPSAiZGVmYXVsdCI7CgogICAgJHI0X2NmZ190ZXN0dGV4dCA9ICJbW1I0X1BMQUNFSE9MREVSXV0iOwoKICAgICRyNF9jZmdfbG9nZ2luZ195YW5kZXggPSBUcnVlOwoKICAgICRyNF9jZmdfbG9nZ2luZ19nb29nbGUgPSBUcnVlOwoKICAgICRyNF9jZmdfZGVmYXVsdF9lbmNvZGluZyA9ICJDUDEyNTEiOwoKICAgICRyNF9jZmdfZG9uZ2xlID0gImRlYjU4MTNiNDE3ZDM4Yzc3MzJlM2I3OTc0ZGY2OWNlIjsKCiAgICAkcjRfY2ZnX211bHRpZG9tYWluID0gRmFsc2U7Cgo= ====== r4_badparams.list ====== UEhQU0VTU0lECl9vcGVuc3RhdAphbGxpbnVybApiYWNrCm9zY3NpZApwaHBzZXNzaWQKcHJpbnQKc2Vzc2UKc2Vzc2lvbmlkCnV0bQp2aWV3Cnt7XnV0bV9fLip9fQ== ====== .htaccess ====== CiNPcHRpb25zIC1JbmRleGVzCg== ====== seenbyyandex.rzg ====== MjAyNC0wNC0wOCAxMzozMjozNwkvCg== ====== seenbygoogle.rzg ======