mipMIP支持插件https://www.zblogcn.comMIP支持插件main.phpinclude.php1zsxzsx@zsxsoft.com1516261.12018-04-182020-03-1805.2
mip/components/article_viewnum/
mip/components/comment/
mip/components/
mip/template/
mip/components/article_viewnum/article_viewnum.phpPD9waHAKZnVuY3Rpb24gYXJ0aWNsZV92aWV3bnVtX2luZGV4ICgpIHsKICBnbG9iYWwgJHpicDsKICAkdXBkYXRlcyA9IGV4cGxvZGUoJywnLCB0cmltKChzdHJpbmcpIEdldFZhcnMoJ3VwZGF0ZXMnLCAnR0VUJykpKTsKICAkZ2V0cyA9IGV4cGxvZGUoJywnLCB0cmltKChzdHJpbmcpIEdldFZhcnMoJ2dldHMnLCAnR0VUJykpKTsKICAkcXVlcmllcyA9IGFycmF5KCk7CiAgJHVwZGF0ZXNGb3JTUUwgPSBhcnJheSgpOwogICRyZWZlcmVyID0gR2V0VmFycygnSFRUUF9SRUZFUkVSJywgJ1NFUlZFUicpOwogIGlmIChzdHJwb3MoJHJlZmVyZXIsICR6YnAtPmhvc3QpID49IDApIHsgLy8g6Ziy5q2i5LqM5qyh57uf6K6hCiAgICAkdXBkYXRlcyA9IGFycmF5KCk7CiAgfQoKICBmb3JlYWNoICgkdXBkYXRlcyBhcyAkaXRlbSkgewogICAgJHRleHQgPSB0cmltKCR6YnAtPmRiLT5Fc2NhcGVTdHJpbmcoJGl0ZW0pKTsKICAgIGlmICgkdGV4dCAhPT0gJycpIHsKICAgICAgYXJyYXlfcHVzaCgkdXBkYXRlc0ZvclNRTCwgIiciIC4gJHRleHQgIC4gIiciKTsKICAgICAgYXJyYXlfcHVzaCgkcXVlcmllcywgJHRleHQpOwogICAgfQogIH0KICBmb3JlYWNoICgkZ2V0cyBhcyAkaXRlbSkgewogICAgJHRleHQgPSB0cmltKCRpdGVtKTsKICAgIGlmICgkdGV4dCAhPT0gJycpIHsKICAgICAgYXJyYXlfcHVzaCgkcXVlcmllcywgJHRleHQpOwogICAgfQogIH0KCiAgaWYgKGlzc2V0KCR6YnAtPm9wdGlvblsnWkNfVklFV05VTVNfVFVSTk9GRiddKSAmJiAkemJwLT5vcHRpb25bJ1pDX1ZJRVdOVU1TX1RVUk5PRkYnXSA9PSBmYWxzZSAmJiBjb3VudCgkdXBkYXRlc0ZvclNRTCkgPiAwKSB7CiAgICAkc3FsID0gJ1VQREFURSAnIC4gJHpicC0+dGFibGVbJ1Bvc3QnXTsKICAgICRzcWwgLj0gJyBTRVQgbG9nX1ZpZXdOdW1zID0gbG9nX1ZpZXdOdW1zICsgMSc7CiAgICAkc3FsIC49ICcgV0hFUkUgbG9nX0lEIGluICgnIC4gaW1wbG9kZSgnLCcsICR1cGRhdGVzRm9yU1FMKSAuICcpJzsKICAgICR6YnAtPmRiLT5VcGRhdGUoJHNxbCk7CiAgfQoKICAkbGlzdCA9ICR6YnAtPkdldEFydGljbGVMaXN0KCdsb2dfSUQsIGxvZ19WaWV3TnVtcycsIGFycmF5KGFycmF5KCdJTicsICdsb2dfSUQnLCAkcXVlcmllcykpLCBudWxsLCAkemJwLT5vcHRpb25bJ1pDX0RJU1BMQVlfQ09VTlQnXSwgbnVsbCwgZmFsc2UpOwogICRyZXQgPSBhcnJheSgpOwogIGZvcmVhY2ggKCRsaXN0IGFzICRpdGVtKSB7CiAgICAkcmV0WyRpdGVtLT5JRF0gPSAkaXRlbS0+Vmlld051bXM7CiAgfQogIGhlYWRlcignQWNjZXNzLUNvbnRyb2wtQWxsb3ctT3JpZ2luOiAqJyk7CiAgZWNobyBqc29uX2VuY29kZSgkcmV0LCBKU09OX0ZPUkNFX09CSkVDVCk7CiAgZXhpdDsKfQo=
mip/components/comment/comment.phpPD9waHAKZnVuY3Rpb24gY29tbWVudF9pbmRleCgpIHsKICBnbG9iYWwgJHpicDsKICBBZGRfRmlsdGVyX1BsdWdpbignRmlsdGVyX1BsdWdpbl9WaWV3UG9zdF9UZW1wbGF0ZScsICdtaXBfY29tbWVudF92aWV3cG9zdF90ZW1wbGF0ZScpOwogIFZpZXdQb3N0KEdldFZhcnMoJ2lkJywgJ0dFVCcpLCAnJyk7CiAgZXhpdDsKfQoKZnVuY3Rpb24gbWlwX2NvbW1lbnRfdmlld3Bvc3RfdGVtcGxhdGUoJiR0ZW1wbGF0ZSkgewogICR0ZW1wbGF0ZS0+U2V0VGVtcGxhdGUoJ21pcC1jb21tZW50Jyk7Cn0K
mip/components/comment/mip-comment-footer.phpPHNjcmlwdD4KICAoZnVuY3Rpb24gKCkgewogICAgZnVuY3Rpb24gcG9zdE1lc3NhZ2UgKGRhdGEpIHsKICAgICAgd2luZG93LnRvcC5wb3N0TWVzc2FnZShPYmplY3QuYXNzaWduKHsKICAgICAgICBmcm9tOiAnemJsb2dwaHAnCiAgICAgIH0sIGRhdGEpLCAnKicpOwogICAgfQogICAgZnVuY3Rpb24gcmVzaXplKCkgewogICAgICBwb3N0TWVzc2FnZSh7ZXZlbnQ6ICdyZXNpemUnLCBoZWlnaHQ6IHdpbmRvdy5kb2N1bWVudC5ib2R5LnNjcm9sbEhlaWdodH0pOwogICAgfQogICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInJlc2l6ZSIsIGZ1bmN0aW9uICgpIHsgcmVzaXplKCkgfSkKICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJsb2FkIiwgZnVuY3Rpb24gKCkgeyByZXNpemUoKSB9KQogICAgcG9zdE1lc3NhZ2Uoe2V2ZW50OiAndmlld251bXMnLCBpZDogJ3skYXJ0aWNsZS5JRH0nLCB2YWx1ZTogJ3skYXJ0aWNsZS5WaWV3TnVtc30nfSkKICB9KSgpCgo8L3NjcmlwdD4K
mip/components/comment/mip-comment.phpeyogVGVtcGxhdGUgTmFtZTpNSVDor4TorrogKn0KPD9waHAgZXhpdDs/Pnt0ZW1wbGF0ZTpoZWFkZXJ9CnsqIOatpOWkhOWPr+S7peS9v+eUqOS7u+S9leS4nOilv++8jOWMheaLrGpRdWVyeeetie+8jOS4jeWPl01JUOmZkOWItiAqfQo8ZGl2IGNsYXNzPSJtaXAtY29tbWVudHMiPgp7dGVtcGxhdGU6Y29tbWVudHN9CjwvZGl2Pgp7dGVtcGxhdGU6bWlwLWNvbW1lbnQtZm9vdGVyfQp7dGVtcGxhdGU6Zm9vdGVyfQo=
mip/include.phpPD9waHANCiPms6jlhozmj5Lku7YNClJlZ2lzdGVyUGx1Z2luKCJtaXAiLCAiQWN0aXZlUGx1Z2luX21pcCIpOw0KRGVmaW5lUGx1Z2luRmlsdGVyKCdGaWx0ZXJfUGx1Z2luX01JUF9UZW1wbGF0ZScpOw0KRGVmaW5lUGx1Z2luRmlsdGVyKCdGaWx0ZXJfUGx1Z2luX01JUF9WaWV3SW5kZXhfQmVnaW4nKTsNCg0KLyoqDQogKiDmmK/lkKblhYHorrjlhoXltYznmoRNSVDkuLvpopjov5DooYwNCiAqIOW9k+ajgOa1i+WIsOebruWJjeeahOS4u+mimOWQr+eUqOS6hm1pcF9hY3RpdmXlh73mlbDvvIzliJnoh6rliqjlhbPpl63mraTlip/og70NCiAqLw0KJG1pcF9hbGxvd19zZWxmX3RoZW1lX3N0YXJ0ID0gdHJ1ZTsNCi8qKg0KICog5b2T5YmN6L+Q6KGM5qih5byP5piv5ZCm5Li65YaF5bWM55qETUlQ5Li76aKYDQogKi8NCiRtaXBfaW5fc2VsZl90aGVtZV9tb2RlID0gZmFsc2U7DQovKioNCiAqIOW9k+WJjeaYr+WQpui/kOihjOS6jk1JUOaooeW8j+S4iw0KICovDQokbWlwX3N0YXJ0ID0gZmFsc2U7DQoNCmZ1bmN0aW9uIEFjdGl2ZVBsdWdpbl9taXAoKSB7DQogIGdsb2JhbCAkemJwOw0KICBBZGRfRmlsdGVyX1BsdWdpbignRmlsdGVyX1BsdWdpbl9JbmRleF9CZWdpbicsICdtaXBfSW5kZXhfQmVnaW5fRm9yX1N3aXRjaF9Ub19NSVAnKTsNCiAgQWRkX0ZpbHRlcl9QbHVnaW4oJ0ZpbHRlcl9QbHVnaW5fSW5kZXhfQmVnaW4nLCAnbWlwX0luZGV4X0JlZ2luX0Zvcl9BUEknKTsNCiAgQWRkX0ZpbHRlcl9QbHVnaW4oJ0ZpbHRlcl9QbHVnaW5fSW5kZXhfQmVnaW4nLCAnbWlwX0luZGV4X0JlZ2luX0Zvcl9IZWFkZXInKTsNCiAgQWRkX0ZpbHRlcl9QbHVnaW4oJ0ZpbHRlcl9QbHVnaW5fUG9zdF9DYWxsJywgJ21pcF9DYWxsX0dldF9NSVBfVVJMJyk7DQp9DQpmdW5jdGlvbiBJbnN0YWxsUGx1Z2luX21pcCgpIHsNCiAgZ2xvYmFsICR6YnA7DQogICR6YnAtPkNvbmZpZygnbWlwJyktPmVuYWJsZV9oZWFkZXJfY2Fub25pY2FsID0gMTsNCiAgJHpicC0+Q29uZmlnKCdtaXAnKS0+cmVtb3ZlX2FsbF9wbHVnaW5faGVhZGVycyA9IDE7DQogICR6YnAtPlNhdmVDb25maWcoJ21pcCcpOw0KICBtaXBfaW5pdGlhbGl6ZV9taXBfcGFnZSgpOw0KICAkemJwLT50ZW1wbGF0ZS0+QnVpbGRUZW1wbGF0ZSgpOw0KfQ0KZnVuY3Rpb24gVW5pbnN0YWxsUGx1Z2luX21pcCgpIHt9DQoNCi8qKg0KICogTUlQ5Yqf6IO95r+A5rS75Ye95pWwDQogKiDov5vlhaXmraTlh73mlbDvvIzljbPku6Pooajnm67liY3lkK/nlKjkuoZNSVDkuLvpopgNCiAqLw0KZnVuY3Rpb24gbWlwX2FjdGl2ZSAoJGFsbG93X290aGVyX21pcF90ZW1wbGF0ZSA9IGZhbHNlKSB7DQogIGdsb2JhbCAkemJwLCAkbWlwX3N0YXJ0Ow0KICAkbWlwX3N0YXJ0ID0gdHJ1ZTsNCiAgQWRkX0ZpbHRlcl9QbHVnaW4oJ0ZpbHRlcl9QbHVnaW5fWmJwX0J1aWxkVGVtcGxhdGUnLCAnbWlwX1picF9Mb2FkVGVtcGxhdGUnKTsNCiAgQWRkX0ZpbHRlcl9QbHVnaW4oJ0ZpbHRlcl9QbHVnaW5fVmlld0xpc3RfVGVtcGxhdGUnLCAnbWlwX1ZpZXdMaXN0X1RlbXBsYXRlJyk7DQogIEFkZF9GaWx0ZXJfUGx1Z2luKCdGaWx0ZXJfUGx1Z2luX1ZpZXdQb3N0X1RlbXBsYXRlJywgJ21pcF9WaWV3UG9zdF9UZW1wbGF0ZScpOw0KICAkR0xPQkFMU1snbWlwX2FsbG93X3NlbGZfdGhlbWVfc3RhcnQnXSA9ICRhbGxvd19vdGhlcl9taXBfdGVtcGxhdGU7DQp9DQoNCmZ1bmN0aW9uIG1pcF90aGVtZV9nZXRfb3JpZ2luYWxfdXJsICgkdXJsKSB7DQogIHJldHVybiBzdHJfcmVwbGFjZSgnbWlwLycsICcnLCAkdXJsKTsNCn0NCg0KZnVuY3Rpb24gbWlwX3RoZW1lX2dldF9taXBfdXJsICgkdXJsKSB7DQogIGdsb2JhbCAkemJwOw0KICByZXR1cm4gc3RyX3JlcGxhY2UoJHpicC0+aG9zdCwgJHpicC0+aG9zdCAuICdtaXAvJywgJHVybCk7DQp9DQoNCmZ1bmN0aW9uIG1pcF9DYWxsX0dldF9NSVBfVVJMKCYkY2xhenosICRtZXRob2QsICRhcmdzKSB7DQogIGlmICgkbWV0aG9kID09PSAnTUlQVXJsJykgew0KICAgICRHTE9CQUxTWydob29rcyddWydGaWx0ZXJfUGx1Z2luX1Bvc3RfQ2FsbCddWydtaXBfQ2FsbF9HZXRfTUlQX1VSTCddID0gUExVR0lOX0VYSVRTSUdOQUxfUkVUVVJOOw0KICAgIHJldHVybiBtaXBfdGhlbWVfZ2V0X21pcF91cmwoJGNsYXp6LT5VcmwpOw0KICB9IGVsc2UgaWYgKCRtZXRob2QgPT09ICdPcmlnVXJsJykgew0KICAgICRHTE9CQUxTWydob29rcyddWydGaWx0ZXJfUGx1Z2luX1Bvc3RfQ2FsbCddWydtaXBfQ2FsbF9HZXRfTUlQX1VSTCddID0gUExVR0lOX0VYSVRTSUdOQUxfUkVUVVJOOw0KICAgIHJldHVybiBtaXBfdGhlbWVfZ2V0X29yaWdpbmFsX3VybCgkY2xhenotPlVybCk7DQogIH0NCn0NCg0KZnVuY3Rpb24gbWlwX2dldF9jYW5vbmljYWxfaHRtbCAoJHVybCkgew0KICByZXR1cm4gJzxsaW5rIHJlbD0iY2Fub25pY2FsIiBocmVmPSInIC4gaHRtbHNwZWNpYWxjaGFycygkdXJsKSAuICciIC8+JzsNCn0NCg0KZnVuY3Rpb24gbWlwX2dldF9taXBodG1sX2h0bWwgKCR1cmwpIHsNCiAgcmV0dXJuICc8bGluayByZWw9Im1pcGh0bWwiIGhyZWY9IicgLiBodG1sc3BlY2lhbGNoYXJzKCR1cmwpIC4gJyIgLz4nOw0KfQ0KDQpmdW5jdGlvbiBtaXBfSW5kZXhfQmVnaW5fRm9yX0hlYWRlciAoKSB7DQogIGdsb2JhbCAkemJwLCAkbWlwX3N0YXJ0LCAkbWlwX2luX3NlbGZfdGhlbWVfbW9kZTsNCiAgaWYgKCRtaXBfc3RhcnQpIHsNCiAgICBpZiAoJHpicC0+Q29uZmlnKCdtaXAnKS0+cmVtb3ZlX2FsbF9wbHVnaW5faGVhZGVycyA9PSAnMScpIHsNCiAgICAgICR6YnAtPmhlYWRlciA9ICcnOyAvLyDmraTlpITlv4XpobvlvLrliLbmuIXnqbrvvIzku6Xpgb/lhY3lhbbku5bmj5Lku7bpgKDmiJDnmoTlvbHlk40NCiAgICAgICR6YnAtPmZvb3RlciA9ICcnOw0KICAgIH0NCiAgICBpZiAoJG1pcF9pbl9zZWxmX3RoZW1lX21vZGUpIHsNCiAgICAgICR6YnAtPmhlYWRlciAuPSBtaXBfZ2V0X2Nhbm9uaWNhbF9odG1sKG1pcF90aGVtZV9nZXRfb3JpZ2luYWxfdXJsKCR6YnAtPmZ1bGxjdXJyZW50dXJsKSk7DQogICAgfSBlbHNlIHsNCiAgICAgIGlmICgkemJwLT5Db25maWcoJ21pcCcpLT5lbmFibGVfaGVhZGVyX2Nhbm9uaWNhbCA9PSAnMScpIHsNCiAgICAgICAgJHpicC0+aGVhZGVyIC49IG1pcF9nZXRfY2Fub25pY2FsX2h0bWwoJHpicC0+ZnVsbGN1cnJlbnR1cmwpOw0KICAgICAgfQ0KICAgIH0NCiAgfSBlbHNlIHsNCiAgICBpZiAoJHpicC0+Q29uZmlnKCdtaXAnKS0+ZW5hYmxlX2hlYWRlcl9jYW5vbmljYWwgPT0gJzEnKSB7DQogICAgICAkemJwLT5oZWFkZXIgLj0gbWlwX2dldF9taXBodG1sX2h0bWwobWlwX3RoZW1lX2dldF9taXBfdXJsKCR6YnAtPmZ1bGxjdXJyZW50dXJsKSk7DQogICAgfQ0KICB9DQp9DQoNCmZ1bmN0aW9uIG1pcF9JbmRleF9CZWdpbl9Gb3JfU3dpdGNoX1RvX01JUCgpIHsNCiAgZ2xvYmFsICR6YnAsICRtaXBfYWxsb3dfc2VsZl90aGVtZV9zdGFydCwgJG1pcF9pbl9zZWxmX3RoZW1lX21vZGU7DQogIGlmICghJG1pcF9hbGxvd19zZWxmX3RoZW1lX3N0YXJ0KSByZXR1cm47DQogICRtaXBfaW5fc2VsZl90aGVtZV9tb2RlID0gdHJ1ZTsNCiAgJHVyaSA9IEdldFZhcnMoJ1JFUVVFU1RfVVJJJywgJ1NFUlZFUicpOw0KICAkaG9zdCA9IHBhcnNlX3VybCgkemJwLT5ob3N0KTsNCiAgJGNoZWNrVXJpID0gc3RyX3JlcGxhY2UoJGhvc3RbJ3BhdGgnXSwgJycsICR1cmkpOw0KICBpZiAocHJlZ19tYXRjaCgiL14oaW5kZXgucGhwXC9taXB8bWlwKS8iLCAkY2hlY2tVcmkpKSB7DQogICAgbWlwX2luaXRpYWxpemVfbWlwX3BhZ2UoKTsNCiAgfQ0KfQ0KDQpmdW5jdGlvbiBtaXBfaW5pdGlhbGl6ZV9taXBfcGFnZSgpIHsNCiAgZ2xvYmFsICR6YnAsICRibG9naG9zdDsNCiAgbWlwX2FjdGl2ZSh0cnVlKTsNCiAgJGJsb2dob3N0IC49ICdtaXAvJzsNCiAgJHpicC0+dGhlbWUgPSAnbWlwJzsNCiAgJHpicC0+dGVtcGxhdGUgPSAkemJwLT5QcmVwYXJlVGVtcGxhdGUoKTsNCg0KICAkZmlsZXMgPSBHZXRGaWxlc0luRGlyKCR6YnAtPnBhdGggLiAnemJfc3lzdGVtL2RlZmVuZC9kZWZhdWx0LycsICdwaHAnKTsNCiAgZm9yZWFjaCAoJGZpbGVzIGFzICRzb3J0bmFtZSA9PiAkZnVsbG5hbWUpIHsNCiAgICAkemJwLT50ZW1wbGF0ZS0+dGVtcGxhdGVzWyRzb3J0bmFtZV0gPSBmaWxlX2dldF9jb250ZW50cygkZnVsbG5hbWUpOw0KICB9DQoNCiAgJGZpbGVzID0gR2V0RmlsZXNJbkRpcihkaXJuYW1lKF9fRklMRV9fKSAuICcvdGVtcGxhdGUnLCAncGhwJyk7DQogIGZvcmVhY2ggKCRmaWxlcyBhcyAkc29ydG5hbWUgPT4gJGZ1bGxuYW1lKSB7DQogICAgICAkemJwLT50ZW1wbGF0ZS0+dGVtcGxhdGVzWyRzb3J0bmFtZV0gPSBmaWxlX2dldF9jb250ZW50cygkZnVsbG5hbWUpOw0KICB9DQoNCiAgZm9yZWFjaCAoJEdMT0JBTFNbJ2hvb2tzJ11bJ0ZpbHRlcl9QbHVnaW5fTUlQX1RlbXBsYXRlJ10gYXMgJGZwbmFtZSA9PiAmJGZwc2lnbmFsKSB7DQogICAgJGZwbmFtZSgkemJwLT50ZW1wbGF0ZSk7DQogIH0NCg0KICBpZiAoaXNzZXQoJHpicC0+b3B0aW9uWydaQ19ERUJVR19NT0RFJ10pICYmICR6YnAtPm9wdGlvblsnWkNfREVCVUdfTU9ERSddKSB7DQogICAgJHpicC0+dGVtcGxhdGUtPkJ1aWxkVGVtcGxhdGUoKTsNCiAgfQ0KDQogIEFkZF9GaWx0ZXJfUGx1Z2luKCdGaWx0ZXJfUGx1Z2luX1ZpZXdJbmRleF9CZWdpbicsICdtaXBfVmlld0luZGV4X0JlZ2luJyk7DQp9DQoNCmZ1bmN0aW9uIG1pcF92aWV3bGlzdF90ZW1wbGF0ZV9mb3JjZV9zZXRfdGVtcGxhdGUoJiR0ZW1wbGF0ZSkgew0KICAkdGVtcGxhdGUtPlNldFRlbXBsYXRlKCdpbmRleCcpOw0KfQ0KDQpmdW5jdGlvbiBtaXBfdmlld3Bvc3RfdGVtcGxhdGVfZm9yY2Vfc2V0X3RlbXBsYXRlKCYkdGVtcGxhdGUpIHsNCiAgJHRlbXBsYXRlLT5TZXRUZW1wbGF0ZSgnc2luZ2xlJyk7DQp9DQoNCmZ1bmN0aW9uIG1pcF9WaWV3SW5kZXhfQmVnaW4gKCYkdXJsKSB7DQogIGdsb2JhbCAkemJwOw0KICBBZGRfRmlsdGVyX1BsdWdpbignRmlsdGVyX1BsdWdpbl9WaWV3TGlzdF9UZW1wbGF0ZScsICdtaXBfdmlld2xpc3RfdGVtcGxhdGVfZm9yY2Vfc2V0X3RlbXBsYXRlJyk7DQogIEFkZF9GaWx0ZXJfUGx1Z2luKCdGaWx0ZXJfUGx1Z2luX1ZpZXdQb3N0X1RlbXBsYXRlJywgJ21pcF92aWV3cG9zdF90ZW1wbGF0ZV9mb3JjZV9zZXRfdGVtcGxhdGUnKTsNCg0KICAkdXJsID0gbWlwX3RoZW1lX2dldF9vcmlnaW5hbF91cmwoJHVybCk7DQogIGlmIChwcmVnX21hdGNoKCcvbWlwLmNzcyQvJywgJHVybCkpIHsNCiAgICBoZWFkZXIoJ0NvbnRlbnQtVHlwZTogdGV4dC9jc3MnKTsNCiAgICBlY2hvIGZpbGVfZ2V0X2NvbnRlbnRzKGRpcm5hbWUoX19GSUxFX18pIC4gJy90ZW1wbGF0ZS9taXAuY3NzJyk7DQogICAgZXhpdDsNCiAgfQ0KICAvLyBSZWdpc3RlciBhbGwgc3RhdGljIHRlbXBsYXRlIGhlcmUNCiAgZm9yZWFjaCAoJEdMT0JBTFNbJ2hvb2tzJ11bJ0ZpbHRlcl9QbHVnaW5fTUlQX1ZpZXdJbmRleF9CZWdpbiddIGFzICRmcG5hbWUgPT4gJiRmcHNpZ25hbCkgew0KICAgICRmcG5hbWUoJHVybCk7DQogIH0NCn0NCg0KZnVuY3Rpb24gbWlwX0luZGV4X0JlZ2luX0Zvcl9BUEkoKSB7DQogICRjb21wb25lbnRzID0gYXJyYXkoJ2NvbW1lbnQnLCAnYXJ0aWNsZV92aWV3bnVtJyk7DQogIGlmICghaXNzZXQoJF9HRVRbJ21pcCddKSkgcmV0dXJuOw0KICAkY29tcG9uZW50ID0gR2V0VmFycygnY29tcG9uZW50JywgJ0dFVCcpOw0KICBpZiAoIWluX2FycmF5KCRjb21wb25lbnQsICRjb21wb25lbnRzKSkgcmV0dXJuOw0KICByZXF1aXJlX29uY2UoZGlybmFtZShfX0ZJTEVfXykgLiAnL2NvbXBvbmVudHMvJyAuICRjb21wb25lbnQgLiAnLycgLiAkY29tcG9uZW50IC4gJy5waHAnKTsNCiAgJGZ1bmN0aW9uX25hbWUgPSAkY29tcG9uZW50IC4gJ19pbmRleCc7DQogICRmdW5jdGlvbl9uYW1lKCk7DQp9DQoNCmZ1bmN0aW9uIG1pcF9aYnBfTG9hZFRlbXBsYXRlKCYkdGVtcGxhdGVzKSB7DQogICR0ZW1wbGF0ZUxpc3QgPSBhcnJheSgNCiAgICAnbWlwLWNvbW1lbnQnID0+ICcvY29tcG9uZW50cy9jb21tZW50L21pcC1jb21tZW50LnBocCcsDQogICAgJ21pcC1jb21tZW50LWZvb3RlcicgPT4gJy9jb21wb25lbnRzL2NvbW1lbnQvbWlwLWNvbW1lbnQtZm9vdGVyLnBocCcNCiAgKTsNCiAgZm9yZWFjaCAoJHRlbXBsYXRlTGlzdCBhcyAka2V5ID0+ICR0ZW1wbGF0ZSkgew0KICAgIGlmICghaXNzZXQoJHRlbXBsYXRlc1ska2V5XSkpIHsNCiAgICAgICR0ZW1wbGF0ZXNbJGtleV0gPSBmaWxlX2dldF9jb250ZW50cyhkaXJuYW1lKF9fRklMRV9fKSAuICR0ZW1wbGF0ZSk7DQogICAgfQ0KICB9DQp9DQoNCmZ1bmN0aW9uIG1pcF9WaWV3TGlzdF9UZW1wbGF0ZSAgKCYkdGVtcGxhdGUpIHsNCiAgZ2xvYmFsICR6YnA7DQogICRhcnRpY2xlcyA9ICR0ZW1wbGF0ZS0+R2V0VGFncygnYXJ0aWNsZXMnKTsNCiAgcmVxdWlyZV9vbmNlIGRpcm5hbWUoX19GSUxFX18pIC4gJy9taXBfZm9ybWF0dGVyLnBocCc7DQogICRmb3JtYXR0ZXIgPSBuZXcgTUlQX0Zvcm1hdHRlcigpOw0KICBmb3JlYWNoICgkYXJ0aWNsZXMgYXMgJGFydGljbGUpIHsNCiAgICAkYXJ0aWNsZS0+SW50cm8gPSAkZm9ybWF0dGVyLT5mb3JtYXQoJGFydGljbGUtPkludHJvKTsNCiAgICAkYXJ0aWNsZS0+Q29udGVudCA9ICRmb3JtYXR0ZXItPmZvcm1hdCgkYXJ0aWNsZS0+Q29udGVudCk7DQogIH0NCiAgJHRlbXBsYXRlLT5TZXRUYWdzKCdjb3B5cmlnaHQnLCAkZm9ybWF0dGVyLT5mb3JtYXQoJHRlbXBsYXRlLT5HZXRUYWdzKCdjb3B5cmlnaHQnKSkpOw0KICBtaXBfZm9ybWF0X3NpZGViYXJzKCR0ZW1wbGF0ZSwgJGZvcm1hdHRlcik7DQogICR0ZW1wbGF0ZS0+U2V0VGFncygnbWlwc3R5bGUnLCAkZm9ybWF0dGVyLT5jc3MoKSk7DQp9DQoNCg0KZnVuY3Rpb24gbWlwX1ZpZXdQb3N0X1RlbXBsYXRlICgmJHRlbXBsYXRlKSB7DQogIGdsb2JhbCAkemJwOw0KICAkYXJ0aWNsZSA9ICR0ZW1wbGF0ZS0+R2V0VGFncygnYXJ0aWNsZScpOw0KICByZXF1aXJlX29uY2UgZGlybmFtZShfX0ZJTEVfXykgLiAnL21pcF9mb3JtYXR0ZXIucGhwJzsNCiAgJGZvcm1hdHRlciA9IG5ldyBNSVBfRm9ybWF0dGVyKCk7DQogICRhcnRpY2xlLT5JbnRybyA9ICRmb3JtYXR0ZXItPmZvcm1hdCgkYXJ0aWNsZS0+SW50cm8pOw0KICAkYXJ0aWNsZS0+Q29udGVudCA9ICRmb3JtYXR0ZXItPmZvcm1hdCgkYXJ0aWNsZS0+Q29udGVudCk7DQogIG1pcF9mb3JtYXRfc2lkZWJhcnMoJHRlbXBsYXRlLCAkZm9ybWF0dGVyKTsNCiAgJHRlbXBsYXRlLT5TZXRUYWdzKCdjb3B5cmlnaHQnLCAkZm9ybWF0dGVyLT5mb3JtYXQoJHRlbXBsYXRlLT5HZXRUYWdzKCdjb3B5cmlnaHQnKSkpOw0KICAkdGVtcGxhdGUtPlNldFRhZ3MoJ21pcHN0eWxlJywgJGZvcm1hdHRlci0+Y3NzKCkpOw0KfQ0KDQpmdW5jdGlvbiBtaXBfZm9ybWF0X3NpZGViYXJzICgkdGVtcGxhdGUsICYkZm9ybWF0dGVyKSB7DQogICRzaWRlYmFyTmFtZXMgPSBhcnJheSgnc2lkZWJhcicsICdzaWRlYmFyMicsICdzaWRlYmFyMycsICdzaWRlYmFyNCcsICdzaWRlYmFyNScpOw0KICBmb3JlYWNoICgkc2lkZWJhck5hbWVzIGFzICRzaWRlYmFyTmFtZSkgew0KICAgICRzaWRlYmFycyA9ICR0ZW1wbGF0ZS0+R2V0VGFncygkc2lkZWJhck5hbWUpOw0KICAgIGZvcmVhY2ggKCRzaWRlYmFycyBhcyAkc2lkZWJhcikgew0KICAgICAgJHNpZGViYXItPkNvbnRlbnQgPSAkZm9ybWF0dGVyLT5mb3JtYXQoJHNpZGViYXItPkNvbnRlbnQpOw0KICAgIH0NCiAgfQ0KfQ0K
mip/index.php
mip/logo.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
mip/main.phpPD9waHANCmlmIChmaWxlX2V4aXN0cygnLi4vLi4vLi4vemJfc3lzdGVtL2Z1bmN0aW9uL2Nfc3lzdGVtX2Jhc2UucGhwJykpIHsNCiAgICByZXF1aXJlICcuLi8uLi8uLi96Yl9zeXN0ZW0vZnVuY3Rpb24vY19zeXN0ZW1fYmFzZS5waHAnOw0KICAgIHJlcXVpcmUgJy4uLy4uLy4uL3piX3N5c3RlbS9mdW5jdGlvbi9jX3N5c3RlbV9hZG1pbi5waHAnOw0KfSBlbHNlIHsgLy8gZm9yIGRlYnVnZ2luZywgdXNlbGVzcw0KICAgIHJlcXVpcmUgJy4uLy4uLy4uL3dlYnNpdGUvemJwaHAvemJfc3lzdGVtL2Z1bmN0aW9uL2Nfc3lzdGVtX2Jhc2UucGhwJzsNCiAgICByZXF1aXJlICcuLi8uLi8uLi93ZWJzaXRlL3picGhwL3piX3N5c3RlbS9mdW5jdGlvbi9jX3N5c3RlbV9hZG1pbi5waHAnOw0KfQ0KDQokemJwLT5Mb2FkKCk7DQokYWN0aW9uID0gJ3Jvb3QnOw0KaWYgKCEkemJwLT5DaGVja1JpZ2h0cygkYWN0aW9uKSkgew0KICAgICR6YnAtPlNob3dFcnJvcig2KTsNCiAgICBkaWUoKTsNCn0NCmlmICghJHpicC0+Q2hlY2tQbHVnaW4oJ21pcCcpKSB7DQogICAgJHpicC0+U2hvd0Vycm9yKDQ4KTsNCiAgICBkaWUoKTsNCn0NCg0KJGJsb2d0aXRsZSA9ICdNSVDmlK/mjIHmj5Lku7YnOw0KDQppZiAoY291bnQoJF9QT1NUKSA+IDApIHsNCiAgICBDaGVja0lzUmVmZXJlclZhbGlkKCk7DQogICAgJHpicC0+Q29uZmlnKCdtaXAnKS0+ZW5hYmxlX2hlYWRlcl9jYW5vbmljYWwgPSAkX1BPU1RbJ2VuYWJsZV9oZWFkZXJfY2Fub25pY2FsJ107DQogICAgJHpicC0+Q29uZmlnKCdtaXAnKS0+cmVtb3ZlX2FsbF9wbHVnaW5faGVhZGVycyA9ICRfUE9TVFsncmVtb3ZlX2FsbF9wbHVnaW5faGVhZGVycyddOw0KDQogICAgbWlwX2luaXRpYWxpemVfbWlwX3BhZ2UoKTsNCiAgICAkemJwLT50ZW1wbGF0ZS0+QnVpbGRUZW1wbGF0ZSgpOw0KICAgICR6YnAtPlNhdmVDb25maWcoJ21pcCcpOw0KICAgICR6YnAtPlNldEhpbnQoJ2dvb2QnKTsNCiAgICBSZWRpcmVjdCgnLi9tYWluLnBocCcpOw0KfQ0KDQpyZXF1aXJlICRibG9ncGF0aCAuICd6Yl9zeXN0ZW0vYWRtaW4vYWRtaW5faGVhZGVyLnBocCc7DQpyZXF1aXJlICRibG9ncGF0aCAuICd6Yl9zeXN0ZW0vYWRtaW4vYWRtaW5fdG9wLnBocCc7DQoNCj8+DQo8ZGl2IGlkPSJkaXZNYWluIj4NCiAgPGRpdiBjbGFzcz0iZGl2SGVhZGVyIj48P3BocCBlY2hvICRibG9ndGl0bGU7ID8+PC9kaXY+DQogIDxkaXYgY2xhc3M9IlN1Yk1lbnUiPjwvZGl2Pg0KICA8ZGl2IGlkPSJkaXZNYWluMiI+DQogICAgPGZvcm0gaWQ9ImVkaXQiIG5hbWU9ImVkaXQiIG1ldGhvZD0icG9zdCIgYWN0aW9uPSIjIj4NCiAgICAgICAgPD9waHAgZWNobyAnPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iY3NyZlRva2VuIiB2YWx1ZT0iJyAuICR6YnAtPkdldENTUkZUb2tlbigpIC4gJyI+Jzs/Pg0KICAgICAgICA8cD7lpoLmnpzmgqjmlrDlronoo4XkuobpgILphY3mnKzmj5Lku7bnmoTkuLvpopjvvIzngrnlh7vigJzmj5DkuqTigJ3ljbPlj6/mv4DmtLvjgII8L3A+DQogICAgICAgIDx0YWJsZSBib3JkZXI9IjEiIGNsYXNzPSJ0YWJsZUZ1bGwgdGFibGVCb3JkZXIgdGFibGVCb3JkZXItdGhjZW50ZXIiPg0KICAgICAgICA8dHI+DQogICAgICAgICAgICA8dGggY2xhc3M9InRkMjUiPjwvdGg+DQogICAgICAgICAgICA8dGg+6K6+572uPC90aD4NCiAgICAgICAgPC90cj4NCiAgICAgICAgPHRyPg0KICAgICAgICAgICAgPHRkPjxwPjxiPsK3IOiHquWKqOaPkuWFpSBDYW5vbmljYWwg5qCH562+PC9iPjxici8+PHNwYW4gY2xhc3M9Im5vdGUiPuWmguaenOaCqOW9k+WJjea/gOa0u+eahOS4u+mimDw/cGhwIGVjaG8gJHpicC0+dGhlbWU7ID8+5LiN5pSv5oyBIE1JUO+8jOivt+aJk+W8gOWug+OAgjwvc3Bhbj48L3A+PC90ZD4NCiAgICAgICAgICAgIDx0ZD48cD48aW5wdXQgaWQ9ImVuYWJsZV9oZWFkZXJfY2Fub25pY2FsIiBuYW1lPSJlbmFibGVfaGVhZGVyX2Nhbm9uaWNhbCIgY2xhc3M9ImNoZWNrYm94IiB0eXBlPSJ0ZXh0IiB2YWx1ZT0nPD9waHAgZWNobyAkemJwLT5Db25maWcoJ21pcCcpLT5lbmFibGVfaGVhZGVyX2Nhbm9uaWNhbCA/PicgLz48L3A+PC90ZD4NCiAgICAgICAgPC90cj4NCiAgICAgICAgPHRyPg0KICAgICAgICAgICAgPHRkPjxwPjxiPsK3IE1JUOaooeW8j+S4i+emgeeUqOaPkuS7tjwvYj48YnIvPjxzcGFuIGNsYXNzPSJub3RlIj7lpoLkuI3npoHnlKjvvIzlj6/og73lr7zoh7RNSVDop4TliJnmoKHpqozlh7rnjrDpl67popjjgII8L3NwYW4+PC9wPjwvdGQ+DQogICAgICAgICAgICA8dGQ+PHA+PGlucHV0IGlkPSJyZW1vdmVfYWxsX3BsdWdpbl9oZWFkZXJzIiBuYW1lPSJyZW1vdmVfYWxsX3BsdWdpbl9oZWFkZXJzIiBjbGFzcz0iY2hlY2tib3giIHR5cGU9InRleHQiIHZhbHVlPSc8P3BocCBlY2hvICR6YnAtPkNvbmZpZygnbWlwJyktPnJlbW92ZV9hbGxfcGx1Z2luX2hlYWRlcnMgPz4nIC8+PC9wPjwvdGQ+DQogICAgICAgIDwvdHI+DQogICAgICA8L3RhYmxlPg0KICAgICAgPGhyLz4NCiAgICAgIDxwPg0KICAgICAgICA8aW5wdXQgdHlwZT0ic3VibWl0IiBjbGFzcz0iYnV0dG9uIiB2YWx1ZT0iPD9waHAgZWNobyAkbGFuZ1snbXNnJ11bJ3N1Ym1pdCddID8+IiAvPg0KICAgICAgPC9wPg0KICAgIDwvZm9ybT4NCiAgICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+QWN0aXZlTGVmdE1lbnUoImFQbHVnaW5NbmciKTs8L3NjcmlwdD4NCiAgICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+QWRkSGVhZGVySWNvbigiPD9waHAgZWNobyAkYmxvZ2hvc3QgLiAnemJfdXNlcnMvcGx1Z2luL21pcC9sb2dvLnBuZyc7ID8+Iik7PC9zY3JpcHQ+DQogIDwvZGl2Pg0KPC9kaXY+DQoNCjw/cGhwDQpyZXF1aXJlICRibG9ncGF0aCAuICd6Yl9zeXN0ZW0vYWRtaW4vYWRtaW5fZm9vdGVyLnBocCc7DQoNClJ1blRpbWUoKTsNCj8+DQo=
mip/mip_formatter.phpPD9waHAKcmVxdWlyZV9vbmNlIGRpcm5hbWUoX19GSUxFX18pIC4gJy9zaW1wbGVfaHRtbF9kb20ucGhwJzsKCmNsYXNzIE1JUF9Gb3JtYXR0ZXIgewogICAgLyoqCiAgICAgKiBAdmFyIHN0cmluZ1tdCiAgICAgKi8KICAgIHB1YmxpYyAkc3R5bGVzOwogICAgLyoqCiAgICAgKiBAdmFyIHN0cmluZwogICAgICovCiAgICBwdWJsaWMgJHdhcm5pbmdzOwoKICAgIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgkc3R5bGVzID0gYXJyYXkoKSkKICAgIHsKICAgICAgICAkdGhpcy0+c3R5bGVzID0gJHN0eWxlczsKICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtICRjb250ZW50CiAgICAgKiBAcmV0dXJuIHN0cmluZwogICAgICogQHRocm93cyBcRXhjZXB0aW9uCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBmb3JtYXQgKCRjb250ZW50KSB7CiAgICAgICAgJGRvbSA9IG5ldyBzaW1wbGVfaHRtbF9kb20oKTsKICAgICAgICAkZG9tLT5sb2FkKCRjb250ZW50KTsKICAgICAgICAkdGhpcy0+cmVtb3ZlRm9yYmlkVGFncygkZG9tKTsKICAgICAgICAkdGhpcy0+Zm9ybWF0VGFncygkZG9tKTsKICAgICAgICAkdGhpcy0+Zm9ybWF0SHRtbFN0eWxlcygkZG9tKTsKICAgICAgICBpZiAoJEdMT0JBTFNbJ21pcF9hbGxvd19zZWxmX3RoZW1lX3N0YXJ0J10pIHsKICAgICAgICAgICAgJHRoaXMtPmZpeEluY29ycmVudFVybCgkZG9tKTsKICAgICAgICB9CiAgICAgICAgJGh0bWwgPSAkZG9tLT5pbm5lcnRleHQ7CiAgICAgICAgcmV0dXJuICRodG1sOwogICAgfQogICAgLyoqCiAgICAgKiBHZXQgQ1NTIG9mIHByb2NlZWQgSFRNTAogICAgICogQHJldHVybiBzdHJpbmcKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGNzcyAoKSB7CiAgICAgICAgJHJldCA9IGFycmF5KCcnKTsKICAgICAgICBmb3JlYWNoICgkdGhpcy0+c3R5bGVzIGFzICRrZXkgPT4gJHZhbHVlKSB7CiAgICAgICAgICAgICRyZXRbXSA9ICcuJyAuICRrZXkgLiAneycgLiBodG1sX2VudGl0eV9kZWNvZGUoJHZhbHVlKSAuICd9JzsKICAgICAgICB9CiAgICAgICAgJHRleHQgPSBpbXBsb2RlKCcnLCAkcmV0KTsKICAgICAgICAkdGV4dCA9IFRyYW5zZmVySFRNTCgkdGV4dCwgJ1tub2h0bWxdJyk7CiAgICAgICAgcmV0dXJuICR0ZXh0OwogICAgfQogICAgLyoqCiAgICAgKiBGaXggaW5jb3JyZWN0IHVybHMKICAgICAqIEBwYXJhbSBcc2ltcGxlX2h0bWxfZG9tICRkb20KICAgICAqLwogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIGZpeEluY29ycmVudFVybCAoJGRvbSkgewogICAgICAgICR1cmxBdHRycyA9IGFycmF5KCdzcmMnLCAnaHJlZicpOwogICAgICAgIGZvcmVhY2ggKCR1cmxBdHRycyBhcyAkYXR0cikgewogICAgICAgICAgICAkaXRlbXMgPSAkZG9tLT5maW5kKCJbJGF0dHJdIik7CiAgICAgICAgICAgIGZvcmVhY2ggKCRpdGVtcyBhcyAkaXRlbSkgewogICAgICAgICAgICAgICAgJGl0ZW0tPiRhdHRyID0gbWlwX3RoZW1lX2dldF9vcmlnaW5hbF91cmwoJGl0ZW0tPiRhdHRyKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogR2V0IGhhc2ggb2YgYSBzdHlsZQogICAgICogQHBhcmFtICR0ZXh0CiAgICAgKiBAcmV0dXJuIHN0cmluZwogICAgICovCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gc3R5bGVIYXNoICgkdGV4dCkgewogICAgICAgICR0ZXh0ID0gbWQ1KCR0ZXh0KTsKICAgICAgICByZXR1cm4gJ3MnIC4gc3Vic3RyKCR0ZXh0LCAwLCA2KTsKICAgIH0KICAgIC8qKgogICAgICogRXh0cmFjdCBhbGwgc3R5bGVzIHRvIG9uZSBzdHlsZQogICAgICogQHBhcmFtIFxzaW1wbGVfaHRtbF9kb20gJGRvbQogICAgICogQHJldHVybiBcc2ltcGxlX2h0bWxfZG9tCiAgICAgKi8KICAgIHByb3RlY3RlZCBmdW5jdGlvbiBmb3JtYXRIdG1sU3R5bGVzICgkZG9tKSB7CiAgICAgICAgJGVsZW1lbnRzID0gJGRvbS0+ZmluZCgnW3N0eWxlXScpOwogICAgICAgIGZvcmVhY2ggKCRlbGVtZW50cyBhcyAkZWxlbWVudCkgewogICAgICAgICAgICAkc3R5bGVOYW1lID0gJHRoaXMtPnN0eWxlSGFzaCgkZWxlbWVudC0+c3R5bGUpOwogICAgICAgICAgICAkc3R5bGUgPSBwcmVnX3JlcGxhY2UoJy8od2lkdGh8aGVpZ2h0KTouKj9bO3wkXS8nLCAnJywgJGVsZW1lbnQtPnN0eWxlKTsKICAgICAgICAgICAgJHRoaXMtPnN0eWxlc1skc3R5bGVOYW1lXSA9ICRzdHlsZTsKICAgICAgICAgICAgJGVsZW1lbnQtPnN0eWxlID0gbnVsbDsKICAgICAgICAgICAgaWYgKCRlbGVtZW50LT5jbGFzcykgewogICAgICAgICAgICAgICAgJGVsZW1lbnQtPmNsYXNzIC49ICcgJyAuICRzdHlsZU5hbWU7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAkZWxlbWVudC0+Y2xhc3MgPSAkc3R5bGVOYW1lOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiAkZG9tOwogICAgfQogICAgCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gcmVtb3ZlRm9yYmlkVGFncyAoJGRvbSkgewogICAgICAkcmVwbGFjZUFycmF5ID0gYXJyYXkoJ2ltZycsICd2aWRlbycsICdhdWRpbycsICdpZnJhbWUnLCAnZm9ybScpOwogICAgICAkcmVtb3ZlQXJyYXkgPSBhcnJheSgnZnJhbWUnLCAnZnJhbWVzZXQnLCAnb2JqZWN0JywgJ3BhcmFtJywgJ2FwcGxldCcsICdlbWJlZCcsICdzdHlsZScsICdzY3JpcHQnKTsKICAgICAgZm9yZWFjaCAoJHJlcGxhY2VBcnJheSBhcyAkdGFnKSB7CiAgICAgICAgJGl0ZW1zID0gJGRvbS0+ZmluZCgkdGFnKTsKICAgICAgICBmb3JlYWNoICgkaXRlbXMgYXMgJGl0ZW0pIHsKICAgICAgICAgICRpdGVtLT50YWcgPSAnbWlwLScgLiAkdGFnOwogICAgICAgICAgaWYgKCR0YWcgPT0gJ2Zvcm0nICYmICRpdGVtLT5hY3Rpb24pIHsKICAgICAgICAgICAgJGl0ZW0tPnVybCA9ICRpdGVtLT5hY3Rpb247CiAgICAgICAgICAgICRpdGVtLT5hY3Rpb24gPSBudWxsOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgICBmb3JlYWNoICgkcmVtb3ZlQXJyYXkgYXMgJHRhZykgewogICAgICAgICRpdGVtcyA9ICRkb20tPmZpbmQoJHRhZyk7CiAgICAgICAgZm9yZWFjaCAoJGl0ZW1zIGFzICRpdGVtKSB7CiAgICAgICAgICAkaXRlbS0+dGFnID0gJ3AnOwogICAgICAgIH0KICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogQ29udmVydCBzb21lIEhUTUwgdGFncyB0byA8c3Bhbj4gd2l0aCBzdHlsZQogICAgICogQHBhcmFtIFxzaW1wbGVfaHRtbF9kb20gJGRvbQogICAgICovCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gZm9ybWF0VGFncyAoJGRvbSkgewogICAgICAgICRzdHlsZXMgPSBhcnJheSgKICAgICAgICAgICAgJ2VtJyA9PiAnZm9udC1zdHlsZTppdGFsaWM7JywKICAgICAgICAgICAgJ3N0cm9uZycgPT4gJ2ZvbnQtd2VpZ2h0OmJvbGQ7JywKICAgICAgICAgICAgJ2InID0+ICdmb250LXdlaWdodDpib2xkOycsCiAgICAgICAgICAgICdzdXAnID0+ICd2ZXJ0aWNhbC1hbGlnbjpzdXBlcjtmb250LXNpemU6c21hbGxlcjsnLAogICAgICAgICAgICAnc3ViJyA9PiAndmVydGljYWwtYWxpZ246c3ViO2ZvbnQtc2l6ZTogc21hbGxlcjsnCiAgICAgICAgKTsKICAgICAgICBmb3JlYWNoICgkc3R5bGVzIGFzICR0YWcgPT4gJHN0eWxlKSB7CiAgICAgICAgICAgICRpdGVtcyA9ICRkb20tPmZpbmQoJHRhZyk7CiAgICAgICAgICAgIGZvcmVhY2ggKCRpdGVtcyBhcyAkaXRlbSkgewogICAgICAgICAgICAgICAgJGl0ZW0tPnRhZyA9ICdzcGFuJzsKICAgICAgICAgICAgICAgIGlmICgkaXRlbS0+c3R5bGUpIHsKICAgICAgICAgICAgICAgICAgICAkaXRlbS0+c3R5bGUgLj0gJzsnIC4gJHN0eWxlOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAkaXRlbS0+c3R5bGUgPSAkc3R5bGU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9Cgp9Cg==
mip/plugin.xmlPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjxwbHVnaW4gdmVyc2lvbj0icGhwIj4NCjxpZD5taXA8L2lkPg0KPG5hbWU+TUlQ5pSv5oyB5o+S5Lu2PC9uYW1lPg0KPHVybD5odHRwczovL3d3dy56YmxvZ2NuLmNvbTwvdXJsPg0KPG5vdGU+TUlQ5pSv5oyB5o+S5Lu2PC9ub3RlPg0KPGRlc2NyaXB0aW9uPjwvZGVzY3JpcHRpb24+DQo8cGF0aD5tYWluLnBocDwvcGF0aD4NCjxpbmNsdWRlPmluY2x1ZGUucGhwPC9pbmNsdWRlPg0KPGxldmVsPjE8L2xldmVsPg0KPGF1dGhvcj4NCiAgPG5hbWU+enN4PC9uYW1lPg0KICA8ZW1haWw+enN4QHpzeHNvZnQuY29tPC9lbWFpbD4NCiAgPHVybD48L3VybD4NCjwvYXV0aG9yPg0KPHNvdXJjZT4NCiAgPG5hbWU+PC9uYW1lPg0KICA8ZW1haWw+PC9lbWFpbD4NCiAgPHVybD48L3VybD4NCjwvc291cmNlPg0KPGFkYXB0ZWQ+MTUxNjI2PC9hZGFwdGVkPg0KPHZlcnNpb24+MS4xPC92ZXJzaW9uPg0KPHB1YmRhdGU+MjAxOC0wNC0xODwvcHViZGF0ZT4NCjxtb2RpZmllZD4yMDIwLTAzLTE4PC9tb2RpZmllZD4NCjxwcmljZT4wPC9wcmljZT4NCjxwaHB2ZXI+NS4yPC9waHB2ZXI+DQo8YWR2YW5jZWQ+DQogIDxkZXBlbmRlbmN5PjwvZGVwZW5kZW5jeT4NCiAgPHJld3JpdGVmdW5jdGlvbnM+PC9yZXdyaXRlZnVuY3Rpb25zPg0KICA8ZXhpc3RzZnVuY3Rpb25zPjwvZXhpc3RzZnVuY3Rpb25zPg0KICA8Y29uZmxpY3Q+PC9jb25mbGljdD4NCjwvYWR2YW5jZWQ+DQo8c2lkZWJhcnM+DQogIDxzaWRlYmFyMT48L3NpZGViYXIxPg0KICA8c2lkZWJhcjI+PC9zaWRlYmFyMj4NCiAgPHNpZGViYXIzPjwvc2lkZWJhcjM+DQogIDxzaWRlYmFyND48L3NpZGViYXI0Pg0KICA8c2lkZWJhcjU+PC9zaWRlYmFyNT4NCiAgPHNpZGViYXI2Pjwvc2lkZWJhcjY+DQogIDxzaWRlYmFyNz48L3NpZGViYXI3Pg0KICA8c2lkZWJhcjg+PC9zaWRlYmFyOD4NCiAgPHNpZGViYXI5Pjwvc2lkZWJhcjk+DQo8L3NpZGViYXJzPg0KPC9wbHVnaW4+
mip/simple_html_dom.phpPD9waHAKLyoqCiAqIFdlYnNpdGU6IGh0dHA6Ly9zb3VyY2Vmb3JnZS5uZXQvcHJvamVjdHMvc2ltcGxlaHRtbGRvbS8KICogQWNrbm93bGVkZ2U6IEpvc2UgU29sb3J6YW5vIChodHRwczovL3NvdXJjZWZvcmdlLm5ldC9wcm9qZWN0cy9waHAtaHRtbC8pCiAqIENvbnRyaWJ1dGlvbnMgYnk6CiAqICAgICBZb3VzdWtlIEt1bWFrdXJhIChBdHRyaWJ1dGUgZmlsdGVycykKICogICAgIFZhZGltIFZvaXR1ayAoTmVnYXRpdmUgaW5kZXhlcyBzdXBwb3J0cyBvZiAiZmluZCIgbWV0aG9kKQogKiAgICAgQW50Y3MgKENvbnN0cnVjdG9yIHdpdGggYXV0b21hdGljYWxseSBsb2FkIGNvbnRlbnRzIGVpdGhlciB0ZXh0IG9yIGZpbGUvdXJsKQogKgogKiBhbGwgYWZmZWN0ZWQgc2VjdGlvbnMgaGF2ZSBjb21tZW50cyBzdGFydGluZyB3aXRoICJQYXBlckciCiAqCiAqIFBhcGVyZyAtIEFkZGVkIGNhc2UgaW5zZW5zaXRpdmUgdGVzdGluZyBvZiB0aGUgdmFsdWUgb2YgdGhlIHNlbGVjdG9yLgogKiBQYXBlcmcgLSBBZGRlZCB0YWdfc3RhcnQgZm9yIHRoZSBzdGFydGluZyBpbmRleCBvZiB0YWdzIC0gTk9URTogVGhpcyB3b3JrcyBidXQgbm90IGFjY3VyYXRlbHkuCiAqICBUaGlzIHRhZ19zdGFydCBnZXRzIGNvdW50ZWQgQUZURVIgXHJcbiBoYXZlIGJlZW4gY3J1c2hlZCBvdXQsIGFuZCBhZnRlciB0aGUgcmVtb3ZlX25vaWNlIGNhbGxzIHNvIGl0IHdpbGwgbm90IHJlZmxlY3QgdGhlIFJFQUwgcG9zaXRpb24gb2YgdGhlIHRhZyBpbiB0aGUgc291cmNlLAogKiAgaXQgd2lsbCBhbG1vc3QgYWx3YXlzIGJlIHNtYWxsZXIgYnkgc29tZSBhbW91bnQuCiAqICBXZSB1c2UgdGhpcyB0byBkZXRlcm1pbmUgaG93IGZhciBpbnRvIHRoZSBmaWxlIHRoZSB0YWcgaW4gcXVlc3Rpb24gaXMuICBUaGlzICJwZXJjZW50YWdlIHdpbGwgbmV2ZXIgYmUgYWNjdXJhdGUgYXMgdGhlICRkb20tPnNpemUgaXMgdGhlICJyZWFsIiBudW1iZXIgb2YgYnl0ZXMgdGhlIGRvbSB3YXMgY3JlYXRlZCBmcm9tLgogKiAgYnV0IGZvciBtb3N0IHB1cnBvc2VzLCBpdCdzIGEgcmVhbGx5IGdvb2QgZXN0aW1hdGlvbi4KICogUGFwZXJnIC0gQWRkZWQgdGhlIGZvcmNlVGFnc0Nsb3NlZCB0byB0aGUgZG9tIGNvbnN0cnVjdG9yLiAgRm9yY2luZyB0YWdzIGNsb3NlZCBpcyBncmVhdCBmb3IgbWFsZm9ybWVkIGh0bWwsIGJ1dCBpdCBDQU4gbGVhZCB0byBwYXJzaW5nIGVycm9ycy4KICogQWxsb3cgdGhlIHVzZXIgdG8gdGVsbCB1cyBob3cgbXVjaCB0aGV5IHRydXN0IHRoZSBodG1sLgogKiBQYXBlcmcgYWRkIHRoZSB0ZXh0IGFuZCBwbGFpbnRleHQgdG8gdGhlIHNlbGVjdG9ycyBmb3IgdGhlIGZpbmQgc3ludGF4LiAgcGxhaW50ZXh0IGltcGxpZXMgdGV4dCBpbiB0aGUgaW5uZXJ0ZXh0IG9mIGEgbm9kZS4gIHRleHQgaW1wbGllcyB0aGF0IHRoZSB0YWcgaXMgYSB0ZXh0IG5vZGUuCiAqIFRoaXMgYWxsb3dzIGZvciB1cyB0byBmaW5kIHRhZ3MgYmFzZWQgb24gdGhlIHRleHQgdGhleSBjb250YWluLgogKiBDcmVhdGUgZmluZF9hbmNlc3Rvcl90YWcgdG8gc2VlIGlmIGEgdGFnIGlzIC0gYXQgYW55IGxldmVsIC0gaW5zaWRlIG9mIGFub3RoZXIgc3BlY2lmaWMgdGFnLgogKiBQYXBlcmc6IGFkZGVkIHBhcnNlX2NoYXJzZXQgc28gdGhhdCB3ZSBrbm93IGFib3V0IHRoZSBjaGFyYWN0ZXIgc2V0IG9mIHRoZSBzb3VyY2UgZG9jdW1lbnQuCiAqICBOT1RFOiAgSWYgdGhlIHVzZXIncyBzeXN0ZW0gaGFzIGEgcm91dGluZSBjYWxsZWQgZ2V0X2xhc3RfcmV0cmlldmVfdXJsX2NvbnRlbnRzX2NvbnRlbnRfdHlwZSBhdmFpbGFsYmUsIHdlIHdpbGwgYXNzdW1lIGl0J3MgcmV0dXJuaW5nIHRoZSBjb250ZW50LXR5cGUgaGVhZGVyIGZyb20gdGhlCiAqICBsYXN0IHRyYW5zZmVyIG9yIGN1cmxfZXhlYywgYW5kIHdlIHdpbGwgcGFyc2UgdGhhdCBhbmQgdXNlIGl0IGluIHByZWZlcmVuY2UgdG8gYW55IG90aGVyIG1ldGhvZCBvZiBjaGFyc2V0IGRldGVjdGlvbi4KICoKICogRm91bmQgaW5maW5pdGUgbG9vcCBpbiB0aGUgY2FzZSBvZiBicm9rZW4gaHRtbCBpbiByZXN0b3JlX25vaXNlLiAgUmV3cm90ZSB0byBwcm90ZWN0IGZyb20gdGhhdC4KICogUGFwZXJHIChKb2huIFNjaGxpY2spIEFkZGVkIGdldF9kaXNwbGF5X3NpemUgZm9yICJJTUciIHRhZ3MuCiAqCiAqIExpY2Vuc2VkIHVuZGVyIFRoZSBNSVQgTGljZW5zZQogKiBSZWRpc3RyaWJ1dGlvbnMgb2YgZmlsZXMgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UuCiAqCiAqIEBhdXRob3IgUy5DLiBDaGVuIDxtZTU3ODAyMkBnbWFpbC5jb20+CiAqIEBhdXRob3IgSm9obiBTY2hsaWNrCiAqIEBhdXRob3IgUnVzIENhcnJvbGwKICogQHZlcnNpb24gMS41ICgkUmV2OiAxOTYgJCkKICogQHBhY2thZ2UgUGxhY2VMb2NhbEluY2x1ZGUKICogQHN1YnBhY2thZ2Ugc2ltcGxlX2h0bWxfZG9tCiAqLwoKLyoqCiAqIEFsbCBvZiB0aGUgRGVmaW5lcyBmb3IgdGhlIGNsYXNzZXMgYmVsb3cuCiAqIEBhdXRob3IgUy5DLiBDaGVuIDxtZTU3ODAyMkBnbWFpbC5jb20+CiAqLwpkZWZpbmUoJ0hET01fVFlQRV9FTEVNRU5UJywgMSk7CmRlZmluZSgnSERPTV9UWVBFX0NPTU1FTlQnLCAyKTsKZGVmaW5lKCdIRE9NX1RZUEVfVEVYVCcsICAgIDMpOwpkZWZpbmUoJ0hET01fVFlQRV9FTkRUQUcnLCAgNCk7CmRlZmluZSgnSERPTV9UWVBFX1JPT1QnLCAgICA1KTsKZGVmaW5lKCdIRE9NX1RZUEVfVU5LTk9XTicsIDYpOwpkZWZpbmUoJ0hET01fUVVPVEVfRE9VQkxFJywgMCk7CmRlZmluZSgnSERPTV9RVU9URV9TSU5HTEUnLCAxKTsKZGVmaW5lKCdIRE9NX1FVT1RFX05PJywgICAgIDMpOwpkZWZpbmUoJ0hET01fSU5GT19CRUdJTicsICAgMCk7CmRlZmluZSgnSERPTV9JTkZPX0VORCcsICAgICAxKTsKZGVmaW5lKCdIRE9NX0lORk9fUVVPVEUnLCAgIDIpOwpkZWZpbmUoJ0hET01fSU5GT19TUEFDRScsICAgMyk7CmRlZmluZSgnSERPTV9JTkZPX1RFWFQnLCAgICA0KTsKZGVmaW5lKCdIRE9NX0lORk9fSU5ORVInLCAgIDUpOwpkZWZpbmUoJ0hET01fSU5GT19PVVRFUicsICAgNik7CmRlZmluZSgnSERPTV9JTkZPX0VORFNQQUNFJyw3KTsKZGVmaW5lKCdERUZBVUxUX1RBUkdFVF9DSEFSU0VUJywgJ1VURi04Jyk7CmRlZmluZSgnREVGQVVMVF9CUl9URVhUJywgIlxyXG4iKTsKZGVmaW5lKCdERUZBVUxUX1NQQU5fVEVYVCcsICIgIik7CmlmICghZGVmaW5lZCgnTUFYX0ZJTEVfU0laRScpKSB7CiAgICBkZWZpbmUoJ01BWF9GSUxFX1NJWkUnLCA2MDAwMDApOwp9CgovLyBoZWxwZXIgZnVuY3Rpb25zCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vIGdldCBodG1sIGRvbSBmcm9tIGZpbGUKLy8gJG1heGxlbiBpcyBkZWZpbmVkIGluIHRoZSBjb2RlIGFzIFBIUF9TVFJFQU1fQ09QWV9BTEwgd2hpY2ggaXMgZGVmaW5lZCBhcyAtMS4KZnVuY3Rpb24gZmlsZV9nZXRfaHRtbCgkdXJsLCAkdXNlX2luY2x1ZGVfcGF0aCA9IGZhbHNlLCAkY29udGV4dD1udWxsLCAkb2Zmc2V0ID0gLTEsICRtYXhMZW49LTEsICRsb3dlcmNhc2UgPSB0cnVlLCAkZm9yY2VUYWdzQ2xvc2VkPXRydWUsICR0YXJnZXRfY2hhcnNldCA9IERFRkFVTFRfVEFSR0VUX0NIQVJTRVQsICRzdHJpcFJOPXRydWUsICRkZWZhdWx0QlJUZXh0PURFRkFVTFRfQlJfVEVYVCwgJGRlZmF1bHRTcGFuVGV4dD1ERUZBVUxUX1NQQU5fVEVYVCkKewogICAgLy8gV2UgRE8gZm9yY2UgdGhlIHRhZ3MgdG8gYmUgdGVybWluYXRlZC4KICAgICRkb20gPSBuZXcgc2ltcGxlX2h0bWxfZG9tKG51bGwsICRsb3dlcmNhc2UsICRmb3JjZVRhZ3NDbG9zZWQsICR0YXJnZXRfY2hhcnNldCwgJHN0cmlwUk4sICRkZWZhdWx0QlJUZXh0LCAkZGVmYXVsdFNwYW5UZXh0KTsKCglkbyB7CgkJJHJlcGVhdCA9IGZhbHNlOwoJCWlmICgkY29udGV4dCE9PU5VTEwpCgkJewoJCQkvLyBUZXN0IGlmICJBY2NlcHQtRW5jb2Rpbmc6IGd6aXAiIGhhcyBiZWVuIHNldCBpbiAkY29udGV4dAoJCQkkcGFyYW1zID0gc3RyZWFtX2NvbnRleHRfZ2V0X3BhcmFtcygkY29udGV4dCk7CgkJCWlmIChpc3NldCgkcGFyYW1zWydvcHRpb25zJ11bJ2h0dHAnXVsnaGVhZGVyJ10pICYmIHByZWdfbWF0Y2goJy9nemlwLycsICRwYXJhbXNbJ29wdGlvbnMnXVsnaHR0cCddWydoZWFkZXInXSkgIT09IGZhbHNlKQoJCQl7CgkJCQkkY29udGVudHMgPSBmaWxlX2dldF9jb250ZW50cygnY29tcHJlc3MuemxpYjovLycuJHVybCwgJHVzZV9pbmNsdWRlX3BhdGgsICRjb250ZXh0LCAkb2Zmc2V0KTsKCQkJfQoJCQllbHNlCgkJCXsKCQkJCSRjb250ZW50cyA9IGZpbGVfZ2V0X2NvbnRlbnRzKCR1cmwsICR1c2VfaW5jbHVkZV9wYXRoLCAkY29udGV4dCwgJG9mZnNldCk7CgkJCX0KCQl9CgkJZWxzZQoJCXsKCQkgIAkkY29udGVudHMgPSBmaWxlX2dldF9jb250ZW50cygkdXJsLCAkdXNlX2luY2x1ZGVfcGF0aCwgTlVMTCwgJG9mZnNldCk7CgkJfQoKCQkvLyB0ZXN0IGlmIHRoZSBVUkwgZG9lc24ndCByZXR1cm4gYSAyMDAgc3RhdHVzCgkJaWYgKGlzc2V0KCRodHRwX3Jlc3BvbnNlX2hlYWRlcikgJiYgc3RycG9zKCRodHRwX3Jlc3BvbnNlX2hlYWRlclswXSwgJzIwMCcpID09PSBmYWxzZSkgewoJCQkvLyBoYXMgYSAzMDEgcmVkaXJlY3QgaGVhZGVyIGJlZW4gc2VudD8KCQkJJHBhdHRlcm4gPSAiL15Mb2NhdGlvbjpccyooLiopJC9pIjsKCQkJJGxvY2F0aW9uX2hlYWRlcnMgPSBwcmVnX2dyZXAoJHBhdHRlcm4sICRodHRwX3Jlc3BvbnNlX2hlYWRlcik7CgoJCQkkZGF0YSA9IGFycmF5X3ZhbHVlcygkbG9jYXRpb25faGVhZGVycyk7CgkJCWlmICghZW1wdHkoJGxvY2F0aW9uX2hlYWRlcnMpICYmIHByZWdfbWF0Y2goJHBhdHRlcm4sICRkYXRhWzBdLCAkbWF0Y2hlcykpIHsKCQkJCS8vIHNldCB0aGUgVVJMIHRvIHRoYXQgcmV0dXJuZWQgdmlhIHRoZSByZWRpcmVjdCBoZWFkZXIgYW5kIHJlcGVhdCB0aGlzIGxvb3AKCQkJCSR1cmwgPSAkbWF0Y2hlc1sxXTsKCQkJCSRyZXBlYXQgPSB0cnVlOwoJCQl9CgkJfQogIAl9IHdoaWxlICgkcmVwZWF0KTsKCgkvLyBzdG9wIHByb2Nlc3NpbmcgaWYgdGhlIGhlYWRlciBpc24ndCBhIGdvb2QgcmVzcG9uY2UKICAJaWYgKGlzc2V0KCRodHRwX3Jlc3BvbnNlX2hlYWRlcikgJiYgc3RycG9zKCRodHRwX3Jlc3BvbnNlX2hlYWRlclswXSwgJzIwMCcpID09PSBmYWxzZSkKCXsKICAJCXJldHVybiBmYWxzZTsKICAJfQoKCS8vIHN0b3AgcHJvY2Vzc2luZyBpZiB0aGUgY29udGVudHMgYXJlIHRvbyBiaWcKICAgIGlmIChlbXB0eSgkY29udGVudHMpIHx8IHN0cmxlbigkY29udGVudHMpID4gTUFYX0ZJTEVfU0laRSkKICAgIHsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICAvLyBUaGUgc2Vjb25kIHBhcmFtZXRlciBjYW4gZm9yY2UgdGhlIHNlbGVjdG9ycyB0byBhbGwgYmUgbG93ZXJjYXNlLgogICAgJGRvbS0+bG9hZCgkY29udGVudHMsICRsb3dlcmNhc2UsICRzdHJpcFJOKTsKICAgIHJldHVybiAkZG9tOwp9CgovLyBnZXQgaHRtbCBkb20gZnJvbSBzdHJpbmcKZnVuY3Rpb24gc3RyX2dldF9odG1sKCRzdHIsICRsb3dlcmNhc2U9dHJ1ZSwgJGZvcmNlVGFnc0Nsb3NlZD10cnVlLCAkdGFyZ2V0X2NoYXJzZXQgPSBERUZBVUxUX1RBUkdFVF9DSEFSU0VULCAkc3RyaXBSTj10cnVlLCAkZGVmYXVsdEJSVGV4dD1ERUZBVUxUX0JSX1RFWFQsICRkZWZhdWx0U3BhblRleHQ9REVGQVVMVF9TUEFOX1RFWFQpCnsKICAgICRkb20gPSBuZXcgc2ltcGxlX2h0bWxfZG9tKG51bGwsICRsb3dlcmNhc2UsICRmb3JjZVRhZ3NDbG9zZWQsICR0YXJnZXRfY2hhcnNldCwgJHN0cmlwUk4sICRkZWZhdWx0QlJUZXh0LCAkZGVmYXVsdFNwYW5UZXh0KTsKICAgIGlmIChlbXB0eSgkc3RyKSB8fCBzdHJsZW4oJHN0cikgPiBNQVhfRklMRV9TSVpFKQogICAgewogICAgICAgICRkb20tPmNsZWFyKCk7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgJGRvbS0+bG9hZCgkc3RyLCAkbG93ZXJjYXNlLCAkc3RyaXBSTik7CiAgICByZXR1cm4gJGRvbTsKfQoKLy8gZHVtcCBodG1sIGRvbSB0cmVlCmZ1bmN0aW9uIGR1bXBfaHRtbF90cmVlKCRub2RlLCAkc2hvd19hdHRyPXRydWUsICRkZWVwPTApCnsKICAgICRub2RlLT5kdW1wKCRub2RlKTsKfQoKCi8qKgogKiBzaW1wbGUgaHRtbCBkb20gbm9kZQogKiBQYXBlckcgLSBhZGRlZCBhYmlsaXR5IGZvciAiZmluZCIgcm91dGluZSB0byBsb3dlcmNhc2UgdGhlIHZhbHVlIG9mIHRoZSBzZWxlY3Rvci4KICogUGFwZXJHIC0gYWRkZWQgJHRhZ19zdGFydCB0byB0cmFjayB0aGUgc3RhcnQgcG9zaXRpb24gb2YgdGhlIHRhZyBpbiB0aGUgdG90YWwgYnl0ZSBpbmRleAogKgogKiBAcGFja2FnZSBQbGFjZUxvY2FsSW5jbHVkZQogKi8KY2xhc3Mgc2ltcGxlX2h0bWxfZG9tX25vZGUKewogICAgcHVibGljICRub2RldHlwZSA9IEhET01fVFlQRV9URVhUOwogICAgcHVibGljICR0YWcgPSAndGV4dCc7CiAgICBwdWJsaWMgJGF0dHIgPSBhcnJheSgpOwogICAgcHVibGljICRjaGlsZHJlbiA9IGFycmF5KCk7CiAgICBwdWJsaWMgJG5vZGVzID0gYXJyYXkoKTsKICAgIHB1YmxpYyAkcGFyZW50ID0gbnVsbDsKICAgIC8vIFRoZSAiaW5mbyIgYXJyYXkgLSBzZWUgSERPTV9JTkZPXy4uLiBmb3Igd2hhdCBlYWNoIGVsZW1lbnQgY29udGFpbnMuCiAgICBwdWJsaWMgJF8gPSBhcnJheSgpOwogICAgcHVibGljICR0YWdfc3RhcnQgPSAwOwogICAgcHJpdmF0ZSAkZG9tID0gbnVsbDsKCiAgICBmdW5jdGlvbiBfX2NvbnN0cnVjdCgkZG9tKQogICAgewogICAgICAgICR0aGlzLT5kb20gPSAkZG9tOwogICAgICAgICRkb20tPm5vZGVzW10gPSAkdGhpczsKICAgIH0KCiAgICBmdW5jdGlvbiBfX2Rlc3RydWN0KCkKICAgIHsKICAgICAgICAkdGhpcy0+Y2xlYXIoKTsKICAgIH0KCiAgICBmdW5jdGlvbiBfX3RvU3RyaW5nKCkKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPm91dGVydGV4dCgpOwogICAgfQoKICAgIC8vIGNsZWFuIHVwIG1lbW9yeSBkdWUgdG8gcGhwNSBjaXJjdWxhciByZWZlcmVuY2VzIG1lbW9yeSBsZWFrLi4uCiAgICBmdW5jdGlvbiBjbGVhcigpCiAgICB7CiAgICAgICAgJHRoaXMtPmRvbSA9IG51bGw7CiAgICAgICAgJHRoaXMtPm5vZGVzID0gbnVsbDsKICAgICAgICAkdGhpcy0+cGFyZW50ID0gbnVsbDsKICAgICAgICAkdGhpcy0+Y2hpbGRyZW4gPSBudWxsOwogICAgfQoKICAgIC8vIGR1bXAgbm9kZSdzIHRyZWUKICAgIGZ1bmN0aW9uIGR1bXAoJHNob3dfYXR0cj10cnVlLCAkZGVlcD0wKQogICAgewogICAgICAgICRsZWFkID0gc3RyX3JlcGVhdCgnICAgICcsICRkZWVwKTsKCiAgICAgICAgZWNobyAkbGVhZC4kdGhpcy0+dGFnOwogICAgICAgIGlmICgkc2hvd19hdHRyICYmIGNvdW50KCR0aGlzLT5hdHRyKT4wKQogICAgICAgIHsKICAgICAgICAgICAgZWNobyAnKCc7CiAgICAgICAgICAgIGZvcmVhY2ggKCR0aGlzLT5hdHRyIGFzICRrPT4kdikKICAgICAgICAgICAgICAgIGVjaG8gIlska109PlwiIi4kdGhpcy0+JGsuJyIsICc7CiAgICAgICAgICAgIGVjaG8gJyknOwogICAgICAgIH0KICAgICAgICBlY2hvICJcbiI7CgogICAgICAgIGlmICgkdGhpcy0+bm9kZXMpCiAgICAgICAgewogICAgICAgICAgICBmb3JlYWNoICgkdGhpcy0+bm9kZXMgYXMgJGMpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICRjLT5kdW1wKCRzaG93X2F0dHIsICRkZWVwKzEpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKCiAgICAvLyBEZWJ1Z2dpbmcgZnVuY3Rpb24gdG8gZHVtcCBhIHNpbmdsZSBkb20gbm9kZSB3aXRoIGEgYnVuY2ggb2YgaW5mb3JtYXRpb24gYWJvdXQgaXQuCiAgICBmdW5jdGlvbiBkdW1wX25vZGUoJGVjaG89dHJ1ZSkKICAgIHsKCiAgICAgICAgJHN0cmluZyA9ICR0aGlzLT50YWc7CiAgICAgICAgaWYgKGNvdW50KCR0aGlzLT5hdHRyKT4wKQogICAgICAgIHsKICAgICAgICAgICAgJHN0cmluZyAuPSAnKCc7CiAgICAgICAgICAgIGZvcmVhY2ggKCR0aGlzLT5hdHRyIGFzICRrPT4kdikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJHN0cmluZyAuPSAiWyRrXT0+XCIiLiR0aGlzLT4kay4nIiwgJzsKICAgICAgICAgICAgfQogICAgICAgICAgICAkc3RyaW5nIC49ICcpJzsKICAgICAgICB9CiAgICAgICAgaWYgKGNvdW50KCR0aGlzLT5fKT4wKQogICAgICAgIHsKICAgICAgICAgICAgJHN0cmluZyAuPSAnICRfICgnOwogICAgICAgICAgICBmb3JlYWNoICgkdGhpcy0+XyBhcyAkaz0+JHYpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmIChpc19hcnJheSgkdikpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgJHN0cmluZyAuPSAiWyRrXT0+KCI7CiAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCAoJHYgYXMgJGsyPT4kdjIpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAkc3RyaW5nIC49ICJbJGsyXT0+XCIiLiR2Mi4nIiwgJzsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgJHN0cmluZyAuPSAiKSI7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICRzdHJpbmcgLj0gIlska109PlwiIi4kdi4nIiwgJzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICAkc3RyaW5nIC49ICIpIjsKICAgICAgICB9CgogICAgICAgIGlmIChpc3NldCgkdGhpcy0+dGV4dCkpCiAgICAgICAgewogICAgICAgICAgICAkc3RyaW5nIC49ICIgdGV4dDogKCIgLiAkdGhpcy0+dGV4dCAuICIpIjsKICAgICAgICB9CgogICAgICAgICRzdHJpbmcgLj0gIiBIRE9NX0lOTkVSX0lORk86ICciOwogICAgICAgIGlmIChpc3NldCgkbm9kZS0+X1tIRE9NX0lORk9fSU5ORVJdKSkKICAgICAgICB7CiAgICAgICAgICAgICRzdHJpbmcgLj0gJG5vZGUtPl9bSERPTV9JTkZPX0lOTkVSXSAuICInIjsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgJHN0cmluZyAuPSAnIE5VTEwgJzsKICAgICAgICB9CgogICAgICAgICRzdHJpbmcgLj0gIiBjaGlsZHJlbjogIiAuIGNvdW50KCR0aGlzLT5jaGlsZHJlbik7CiAgICAgICAgJHN0cmluZyAuPSAiIG5vZGVzOiAiIC4gY291bnQoJHRoaXMtPm5vZGVzKTsKICAgICAgICAkc3RyaW5nIC49ICIgdGFnX3N0YXJ0OiAiIC4gJHRoaXMtPnRhZ19zdGFydDsKICAgICAgICAkc3RyaW5nIC49ICJcbiI7CgogICAgICAgIGlmICgkZWNobykKICAgICAgICB7CiAgICAgICAgICAgIGVjaG8gJHN0cmluZzsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gJHN0cmluZzsKICAgICAgICB9CiAgICB9CgogICAgLy8gcmV0dXJucyB0aGUgcGFyZW50IG9mIG5vZGUKICAgIC8vIElmIGEgbm9kZSBpcyBwYXNzZWQgaW4sIGl0IHdpbGwgcmVzZXQgdGhlIHBhcmVudCBvZiB0aGUgY3VycmVudCBub2RlIHRvIHRoYXQgb25lLgogICAgZnVuY3Rpb24gcGFyZW50KCRwYXJlbnQ9bnVsbCkKICAgIHsKICAgICAgICAvLyBJIGFtIFNVUkUgdGhhdCB0aGlzIGRvZXNuJ3Qgd29yayBwcm9wZXJseS4KICAgICAgICAvLyBJdCBmYWlscyB0byB1bnNldCB0aGUgY3VycmVudCBub2RlIGZyb20gaXQncyBjdXJyZW50IHBhcmVudHMgbm9kZXMgb3IgY2hpbGRyZW4gbGlzdCBmaXJzdC4KICAgICAgICBpZiAoJHBhcmVudCAhPT0gbnVsbCkKICAgICAgICB7CiAgICAgICAgICAgICR0aGlzLT5wYXJlbnQgPSAkcGFyZW50OwogICAgICAgICAgICAkdGhpcy0+cGFyZW50LT5ub2Rlc1tdID0gJHRoaXM7CiAgICAgICAgICAgICR0aGlzLT5wYXJlbnQtPmNoaWxkcmVuW10gPSAkdGhpczsKICAgICAgICB9CgogICAgICAgIHJldHVybiAkdGhpcy0+cGFyZW50OwogICAgfQoKICAgIC8vIHZlcmlmeSB0aGF0IG5vZGUgaGFzIGNoaWxkcmVuCiAgICBmdW5jdGlvbiBoYXNfY2hpbGQoKQogICAgewogICAgICAgIHJldHVybiAhZW1wdHkoJHRoaXMtPmNoaWxkcmVuKTsKICAgIH0KCiAgICAvLyByZXR1cm5zIGNoaWxkcmVuIG9mIG5vZGUKICAgIGZ1bmN0aW9uIGNoaWxkcmVuKCRpZHg9LTEpCiAgICB7CiAgICAgICAgaWYgKCRpZHg9PT0tMSkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiAkdGhpcy0+Y2hpbGRyZW47CiAgICAgICAgfQogICAgICAgIGlmIChpc3NldCgkdGhpcy0+Y2hpbGRyZW5bJGlkeF0pKSByZXR1cm4gJHRoaXMtPmNoaWxkcmVuWyRpZHhdOwogICAgICAgIHJldHVybiBudWxsOwogICAgfQoKICAgIC8vIHJldHVybnMgdGhlIGZpcnN0IGNoaWxkIG9mIG5vZGUKICAgIGZ1bmN0aW9uIGZpcnN0X2NoaWxkKCkKICAgIHsKICAgICAgICBpZiAoY291bnQoJHRoaXMtPmNoaWxkcmVuKT4wKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuICR0aGlzLT5jaGlsZHJlblswXTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICB9CgogICAgLy8gcmV0dXJucyB0aGUgbGFzdCBjaGlsZCBvZiBub2RlCiAgICBmdW5jdGlvbiBsYXN0X2NoaWxkKCkKICAgIHsKICAgICAgICBpZiAoKCRjb3VudD1jb3VudCgkdGhpcy0+Y2hpbGRyZW4pKT4wKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuICR0aGlzLT5jaGlsZHJlblskY291bnQtMV07CiAgICAgICAgfQogICAgICAgIHJldHVybiBudWxsOwogICAgfQoKICAgIC8vIHJldHVybnMgdGhlIG5leHQgc2libGluZyBvZiBub2RlCiAgICBmdW5jdGlvbiBuZXh0X3NpYmxpbmcoKQogICAgewogICAgICAgIGlmICgkdGhpcy0+cGFyZW50PT09bnVsbCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KCiAgICAgICAgJGlkeCA9IDA7CiAgICAgICAgJGNvdW50ID0gY291bnQoJHRoaXMtPnBhcmVudC0+Y2hpbGRyZW4pOwogICAgICAgIHdoaWxlICgkaWR4PCRjb3VudCAmJiAkdGhpcyE9PSR0aGlzLT5wYXJlbnQtPmNoaWxkcmVuWyRpZHhdKQogICAgICAgIHsKICAgICAgICAgICAgKyskaWR4OwogICAgICAgIH0KICAgICAgICBpZiAoKyskaWR4Pj0kY291bnQpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9CiAgICAgICAgcmV0dXJuICR0aGlzLT5wYXJlbnQtPmNoaWxkcmVuWyRpZHhdOwogICAgfQoKICAgIC8vIHJldHVybnMgdGhlIHByZXZpb3VzIHNpYmxpbmcgb2Ygbm9kZQogICAgZnVuY3Rpb24gcHJldl9zaWJsaW5nKCkKICAgIHsKICAgICAgICBpZiAoJHRoaXMtPnBhcmVudD09PW51bGwpIHJldHVybiBudWxsOwogICAgICAgICRpZHggPSAwOwogICAgICAgICRjb3VudCA9IGNvdW50KCR0aGlzLT5wYXJlbnQtPmNoaWxkcmVuKTsKICAgICAgICB3aGlsZSAoJGlkeDwkY291bnQgJiYgJHRoaXMhPT0kdGhpcy0+cGFyZW50LT5jaGlsZHJlblskaWR4XSkKICAgICAgICAgICAgKyskaWR4OwogICAgICAgIGlmICgtLSRpZHg8MCkgcmV0dXJuIG51bGw7CiAgICAgICAgcmV0dXJuICR0aGlzLT5wYXJlbnQtPmNoaWxkcmVuWyRpZHhdOwogICAgfQoKICAgIC8vIGZ1bmN0aW9uIHRvIGxvY2F0ZSBhIHNwZWNpZmljIGFuY2VzdG9yIHRhZyBpbiB0aGUgcGF0aCB0byB0aGUgcm9vdC4KICAgIGZ1bmN0aW9uIGZpbmRfYW5jZXN0b3JfdGFnKCR0YWcpCiAgICB7CiAgICAgICAgZ2xvYmFsICRkZWJ1Z09iamVjdDsKICAgICAgICBpZiAoaXNfb2JqZWN0KCRkZWJ1Z09iamVjdCkpIHsgJGRlYnVnT2JqZWN0LT5kZWJ1Z0xvZ0VudHJ5KDEpOyB9CgogICAgICAgIC8vIFN0YXJ0IGJ5IGluY2x1ZGluZyBvdXJzZWx2ZXMgaW4gdGhlIGNvbXBhcmlzb24uCiAgICAgICAgJHJldHVybkRvbSA9ICR0aGlzOwoKICAgICAgICB3aGlsZSAoIWlzX251bGwoJHJldHVybkRvbSkpCiAgICAgICAgewogICAgICAgICAgICBpZiAoaXNfb2JqZWN0KCRkZWJ1Z09iamVjdCkpIHsgJGRlYnVnT2JqZWN0LT5kZWJ1Z0xvZygyLCAiQ3VycmVudCB0YWcgaXM6ICIgLiAkcmV0dXJuRG9tLT50YWcpOyB9CgogICAgICAgICAgICBpZiAoJHJldHVybkRvbS0+dGFnID09ICR0YWcpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICAgICRyZXR1cm5Eb20gPSAkcmV0dXJuRG9tLT5wYXJlbnQ7CiAgICAgICAgfQogICAgICAgIHJldHVybiAkcmV0dXJuRG9tOwogICAgfQoKICAgIC8vIGdldCBkb20gbm9kZSdzIGlubmVyIGh0bWwKICAgIGZ1bmN0aW9uIGlubmVydGV4dCgpCiAgICB7CiAgICAgICAgaWYgKGlzc2V0KCR0aGlzLT5fW0hET01fSU5GT19JTk5FUl0pKSByZXR1cm4gJHRoaXMtPl9bSERPTV9JTkZPX0lOTkVSXTsKICAgICAgICBpZiAoaXNzZXQoJHRoaXMtPl9bSERPTV9JTkZPX1RFWFRdKSkgcmV0dXJuICR0aGlzLT5kb20tPnJlc3RvcmVfbm9pc2UoJHRoaXMtPl9bSERPTV9JTkZPX1RFWFRdKTsKCiAgICAgICAgJHJldCA9ICcnOwogICAgICAgIGZvcmVhY2ggKCR0aGlzLT5ub2RlcyBhcyAkbikKICAgICAgICAgICAgJHJldCAuPSAkbi0+b3V0ZXJ0ZXh0KCk7CiAgICAgICAgcmV0dXJuICRyZXQ7CiAgICB9CgogICAgLy8gZ2V0IGRvbSBub2RlJ3Mgb3V0ZXIgdGV4dCAod2l0aCB0YWcpCiAgICBmdW5jdGlvbiBvdXRlcnRleHQoKQogICAgewogICAgICAgIGdsb2JhbCAkZGVidWdPYmplY3Q7CiAgICAgICAgaWYgKGlzX29iamVjdCgkZGVidWdPYmplY3QpKQogICAgICAgIHsKICAgICAgICAgICAgJHRleHQgPSAnJzsKICAgICAgICAgICAgaWYgKCR0aGlzLT50YWcgPT0gJ3RleHQnKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoIWVtcHR5KCR0aGlzLT50ZXh0KSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAkdGV4dCA9ICIgd2l0aCB0ZXh0OiAiIC4gJHRoaXMtPnRleHQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJGRlYnVnT2JqZWN0LT5kZWJ1Z0xvZygxLCAnSW5uZXJ0ZXh0IG9mIHRhZzogJyAuICR0aGlzLT50YWcgLiAkdGV4dCk7CiAgICAgICAgfQoKICAgICAgICBpZiAoJHRoaXMtPnRhZz09PSdyb290JykgcmV0dXJuICR0aGlzLT5pbm5lcnRleHQoKTsKCiAgICAgICAgLy8gdHJpZ2dlciBjYWxsYmFjawogICAgICAgIGlmICgkdGhpcy0+ZG9tICYmICR0aGlzLT5kb20tPmNhbGxiYWNrIT09bnVsbCkKICAgICAgICB7CiAgICAgICAgICAgIGNhbGxfdXNlcl9mdW5jX2FycmF5KCR0aGlzLT5kb20tPmNhbGxiYWNrLCBhcnJheSgkdGhpcykpOwogICAgICAgIH0KCiAgICAgICAgaWYgKGlzc2V0KCR0aGlzLT5fW0hET01fSU5GT19PVVRFUl0pKSByZXR1cm4gJHRoaXMtPl9bSERPTV9JTkZPX09VVEVSXTsKICAgICAgICBpZiAoaXNzZXQoJHRoaXMtPl9bSERPTV9JTkZPX1RFWFRdKSkgcmV0dXJuICR0aGlzLT5kb20tPnJlc3RvcmVfbm9pc2UoJHRoaXMtPl9bSERPTV9JTkZPX1RFWFRdKTsKCiAgICAgICAgLy8gcmVuZGVyIGJlZ2luIHRhZwogICAgICAgIGlmICgkdGhpcy0+ZG9tICYmICR0aGlzLT5kb20tPm5vZGVzWyR0aGlzLT5fW0hET01fSU5GT19CRUdJTl1dKQogICAgICAgIHsKICAgICAgICAgICAgJHJldCA9ICR0aGlzLT5kb20tPm5vZGVzWyR0aGlzLT5fW0hET01fSU5GT19CRUdJTl1dLT5tYWtldXAoKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAkcmV0ID0gIiI7CiAgICAgICAgfQoKICAgICAgICAvLyByZW5kZXIgaW5uZXIgdGV4dAogICAgICAgIGlmIChpc3NldCgkdGhpcy0+X1tIRE9NX0lORk9fSU5ORVJdKSkKICAgICAgICB7CiAgICAgICAgICAgIC8vIElmIGl0J3MgYSBiciB0YWcuLi4gIGRvbid0IHJldHVybiB0aGUgSERPTV9JTk5FUl9JTkZPIHRoYXQgd2UgbWF5IG9yIG1heSBub3QgaGF2ZSBhZGRlZC4KICAgICAgICAgICAgaWYgKCR0aGlzLT50YWcgIT0gImJyIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJHJldCAuPSAkdGhpcy0+X1tIRE9NX0lORk9fSU5ORVJdOwogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgaWYgKCR0aGlzLT5ub2RlcykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgZm9yZWFjaCAoJHRoaXMtPm5vZGVzIGFzICRuKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICRyZXQgLj0gJHRoaXMtPmNvbnZlcnRfdGV4dCgkbi0+b3V0ZXJ0ZXh0KCkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvLyByZW5kZXIgZW5kIHRhZwogICAgICAgIGlmIChpc3NldCgkdGhpcy0+X1tIRE9NX0lORk9fRU5EXSkgJiYgJHRoaXMtPl9bSERPTV9JTkZPX0VORF0hPTApCiAgICAgICAgICAgICRyZXQgLj0gJzwvJy4kdGhpcy0+dGFnLic+JzsKICAgICAgICByZXR1cm4gJHJldDsKICAgIH0KCiAgICAvLyBnZXQgZG9tIG5vZGUncyBwbGFpbiB0ZXh0CiAgICBmdW5jdGlvbiB0ZXh0KCkKICAgIHsKICAgICAgICBpZiAoaXNzZXQoJHRoaXMtPl9bSERPTV9JTkZPX0lOTkVSXSkpIHJldHVybiAkdGhpcy0+X1tIRE9NX0lORk9fSU5ORVJdOwogICAgICAgIHN3aXRjaCAoJHRoaXMtPm5vZGV0eXBlKQogICAgICAgIHsKICAgICAgICAgICAgY2FzZSBIRE9NX1RZUEVfVEVYVDogcmV0dXJuICR0aGlzLT5kb20tPnJlc3RvcmVfbm9pc2UoJHRoaXMtPl9bSERPTV9JTkZPX1RFWFRdKTsKICAgICAgICAgICAgY2FzZSBIRE9NX1RZUEVfQ09NTUVOVDogcmV0dXJuICcnOwogICAgICAgICAgICBjYXNlIEhET01fVFlQRV9VTktOT1dOOiByZXR1cm4gJyc7CiAgICAgICAgfQogICAgICAgIGlmIChzdHJjYXNlY21wKCR0aGlzLT50YWcsICdzY3JpcHQnKT09PTApIHJldHVybiAnJzsKICAgICAgICBpZiAoc3RyY2FzZWNtcCgkdGhpcy0+dGFnLCAnc3R5bGUnKT09PTApIHJldHVybiAnJzsKCiAgICAgICAgJHJldCA9ICcnOwogICAgICAgIC8vIEluIHJhcmUgY2FzZXMsIChhbHdheXMgbm9kZSB0eXBlIDEgb3IgSERPTV9UWVBFX0VMRU1FTlQgLSBvYnNlcnZlZCBmb3Igc29tZSBzcGFuIHRhZ3MsIGFuZCBzb21lIHAgdGFncykgJHRoaXMtPm5vZGVzIGlzIHNldCB0byBOVUxMLgogICAgICAgIC8vIE5PVEU6IFRoaXMgaW5kaWNhdGVzIHRoYXQgdGhlcmUgaXMgYSBwcm9ibGVtIHdoZXJlIGl0J3Mgc2V0IHRvIE5VTEwgd2l0aG91dCBhIGNsZWFyIGhhcHBlbmluZy4KICAgICAgICAvLyBXSFkgaXMgdGhpcyBoYXBwZW5pbmc/CiAgICAgICAgaWYgKCFpc19udWxsKCR0aGlzLT5ub2RlcykpCiAgICAgICAgewogICAgICAgICAgICBmb3JlYWNoICgkdGhpcy0+bm9kZXMgYXMgJG4pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICRyZXQgLj0gJHRoaXMtPmNvbnZlcnRfdGV4dCgkbi0+dGV4dCgpKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gSWYgdGhpcyBub2RlIGlzIGEgc3Bhbi4uLiBhZGQgYSBzcGFjZSBhdCB0aGUgZW5kIG9mIGl0IHNvIG11bHRpcGxlIHNwYW5zIGRvbid0IHJ1biBpbnRvIGVhY2ggb3RoZXIuICBUaGlzIGlzIHBsYWludGV4dCBhZnRlciBhbGwuCiAgICAgICAgICAgIGlmICgkdGhpcy0+dGFnID09ICJzcGFuIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJHJldCAuPSAkdGhpcy0+ZG9tLT5kZWZhdWx0X3NwYW5fdGV4dDsKICAgICAgICAgICAgfQoKCiAgICAgICAgfQogICAgICAgIHJldHVybiAkcmV0OwogICAgfQoKICAgIGZ1bmN0aW9uIHhtbHRleHQoKQogICAgewogICAgICAgICRyZXQgPSAkdGhpcy0+aW5uZXJ0ZXh0KCk7CiAgICAgICAgJHJldCA9IHN0cl9pcmVwbGFjZSgnPCFbQ0RBVEFbJywgJycsICRyZXQpOwogICAgICAgICRyZXQgPSBzdHJfcmVwbGFjZSgnXV0+JywgJycsICRyZXQpOwogICAgICAgIHJldHVybiAkcmV0OwogICAgfQoKICAgIC8vIGJ1aWxkIG5vZGUncyB0ZXh0IHdpdGggdGFnCiAgICBmdW5jdGlvbiBtYWtldXAoKQogICAgewogICAgICAgIC8vIHRleHQsIGNvbW1lbnQsIHVua25vd24KICAgICAgICBpZiAoaXNzZXQoJHRoaXMtPl9bSERPTV9JTkZPX1RFWFRdKSkgcmV0dXJuICR0aGlzLT5kb20tPnJlc3RvcmVfbm9pc2UoJHRoaXMtPl9bSERPTV9JTkZPX1RFWFRdKTsKCiAgICAgICAgJHJldCA9ICc8Jy4kdGhpcy0+dGFnOwogICAgICAgICRpID0gLTE7CgogICAgICAgIGZvcmVhY2ggKCR0aGlzLT5hdHRyIGFzICRrZXk9PiR2YWwpCiAgICAgICAgewogICAgICAgICAgICArKyRpOwoKICAgICAgICAgICAgLy8gc2tpcCByZW1vdmVkIGF0dHJpYnV0ZQogICAgICAgICAgICBpZiAoJHZhbD09PW51bGwgfHwgJHZhbD09PWZhbHNlKQogICAgICAgICAgICAgICAgY29udGludWU7CgogICAgICAgICAgICAkcmV0IC49ICR0aGlzLT5fW0hET01fSU5GT19TUEFDRV1bJGldWzBdOwogICAgICAgICAgICAvL25vIHZhbHVlIGF0dHI6IG5vd3JhcCwgY2hlY2tlZCBzZWxlY3RlZC4uLgogICAgICAgICAgICBpZiAoJHZhbD09PXRydWUpCiAgICAgICAgICAgICAgICAkcmV0IC49ICRrZXk7CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgc3dpdGNoICgkdGhpcy0+X1tIRE9NX0lORk9fUVVPVEVdWyRpXSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjYXNlIEhET01fUVVPVEVfRE9VQkxFOiAkcXVvdGUgPSAnIic7IGJyZWFrOwogICAgICAgICAgICAgICAgICAgIGNhc2UgSERPTV9RVU9URV9TSU5HTEU6ICRxdW90ZSA9ICdcJyc7IGJyZWFrOwogICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6ICRxdW90ZSA9ICcnOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgJHJldCAuPSAka2V5LiR0aGlzLT5fW0hET01fSU5GT19TUEFDRV1bJGldWzFdLic9Jy4kdGhpcy0+X1tIRE9NX0lORk9fU1BBQ0VdWyRpXVsyXS4kcXVvdGUuJHZhbC4kcXVvdGU7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgJHJldCA9ICR0aGlzLT5kb20tPnJlc3RvcmVfbm9pc2UoJHJldCk7CiAgICAgICAgcmV0dXJuICRyZXQgLiAkdGhpcy0+X1tIRE9NX0lORk9fRU5EU1BBQ0VdIC4gJz4nOwogICAgfQoKICAgIC8vIGZpbmQgZWxlbWVudHMgYnkgY3NzIHNlbGVjdG9yCiAgICAvL1BhcGVyRyAtIGFkZGVkIGFiaWxpdHkgZm9yIGZpbmQgdG8gbG93ZXJjYXNlIHRoZSB2YWx1ZSBvZiB0aGUgc2VsZWN0b3IuCiAgICBmdW5jdGlvbiBmaW5kKCRzZWxlY3RvciwgJGlkeD1udWxsLCAkbG93ZXJjYXNlPWZhbHNlKQogICAgewogICAgICAgICRzZWxlY3RvcnMgPSAkdGhpcy0+cGFyc2Vfc2VsZWN0b3IoJHNlbGVjdG9yKTsKICAgICAgICBpZiAoKCRjb3VudD1jb3VudCgkc2VsZWN0b3JzKSk9PT0wKSByZXR1cm4gYXJyYXkoKTsKICAgICAgICAkZm91bmRfa2V5cyA9IGFycmF5KCk7CgogICAgICAgIC8vIGZpbmQgZWFjaCBzZWxlY3RvcgogICAgICAgIGZvciAoJGM9MDsgJGM8JGNvdW50OyArKyRjKQogICAgICAgIHsKICAgICAgICAgICAgLy8gVGhlIGNoYW5nZSBvbiB0aGUgYmVsb3cgbGluZSB3YXMgZG9jdW1lbnRlZCBvbiB0aGUgc291cmNlZm9yZ2UgY29kZSB0cmFja2VyIGlkIDI3ODgwMDkKICAgICAgICAgICAgLy8gdXNlZCB0byBiZTogaWYgKCgkbGV2bGU9Y291bnQoJHNlbGVjdG9yc1swXSkpPT09MCkgcmV0dXJuIGFycmF5KCk7CiAgICAgICAgICAgIGlmICgoJGxldmxlPWNvdW50KCRzZWxlY3RvcnNbJGNdKSk9PT0wKSByZXR1cm4gYXJyYXkoKTsKICAgICAgICAgICAgaWYgKCFpc3NldCgkdGhpcy0+X1tIRE9NX0lORk9fQkVHSU5dKSkgcmV0dXJuIGFycmF5KCk7CgogICAgICAgICAgICAkaGVhZCA9IGFycmF5KCR0aGlzLT5fW0hET01fSU5GT19CRUdJTl09PjEpOwoKICAgICAgICAgICAgLy8gaGFuZGxlIGRlc2NlbmRhbnQgc2VsZWN0b3JzLCBubyByZWN1cnNpdmUhCiAgICAgICAgICAgIGZvciAoJGw9MDsgJGw8JGxldmxlOyArKyRsKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkcmV0ID0gYXJyYXkoKTsKICAgICAgICAgICAgICAgIGZvcmVhY2ggKCRoZWFkIGFzICRrPT4kdikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAkbiA9ICgkaz09PS0xKSA/ICR0aGlzLT5kb20tPnJvb3QgOiAkdGhpcy0+ZG9tLT5ub2Rlc1ska107CiAgICAgICAgICAgICAgICAgICAgLy9QYXBlckcgLSBQYXNzIHRoaXMgb3B0aW9uYWwgcGFyYW1ldGVyIG9uIHRvIHRoZSBzZWVrIGZ1bmN0aW9uLgogICAgICAgICAgICAgICAgICAgICRuLT5zZWVrKCRzZWxlY3RvcnNbJGNdWyRsXSwgJHJldCwgJGxvd2VyY2FzZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAkaGVhZCA9ICRyZXQ7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGZvcmVhY2ggKCRoZWFkIGFzICRrPT4kdikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKCFpc3NldCgkZm91bmRfa2V5c1ska10pKQogICAgICAgICAgICAgICAgICAgICRmb3VuZF9rZXlzWyRrXSA9IDE7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8vIHNvcnQga2V5cwogICAgICAgIGtzb3J0KCRmb3VuZF9rZXlzKTsKCiAgICAgICAgJGZvdW5kID0gYXJyYXkoKTsKICAgICAgICBmb3JlYWNoICgkZm91bmRfa2V5cyBhcyAkaz0+JHYpCiAgICAgICAgICAgICRmb3VuZFtdID0gJHRoaXMtPmRvbS0+bm9kZXNbJGtdOwoKICAgICAgICAvLyByZXR1cm4gbnRoLWVsZW1lbnQgb3IgYXJyYXkKICAgICAgICBpZiAoaXNfbnVsbCgkaWR4KSkgcmV0dXJuICRmb3VuZDsKICAgICAgICBlbHNlIGlmICgkaWR4PDApICRpZHggPSBjb3VudCgkZm91bmQpICsgJGlkeDsKICAgICAgICByZXR1cm4gKGlzc2V0KCRmb3VuZFskaWR4XSkpID8gJGZvdW5kWyRpZHhdIDogbnVsbDsKICAgIH0KCiAgICAvLyBzZWVrIGZvciBnaXZlbiBjb25kaXRpb25zCiAgICAvLyBQYXBlckcgLSBhZGRlZCBwYXJhbWV0ZXIgdG8gYWxsb3cgZm9yIGNhc2UgaW5zZW5zaXRpdmUgdGVzdGluZyBvZiB0aGUgdmFsdWUgb2YgYSBzZWxlY3Rvci4KICAgIHByb3RlY3RlZCBmdW5jdGlvbiBzZWVrKCRzZWxlY3RvciwgJiRyZXQsICRsb3dlcmNhc2U9ZmFsc2UpCiAgICB7CiAgICAgICAgZ2xvYmFsICRkZWJ1Z09iamVjdDsKICAgICAgICBpZiAoaXNfb2JqZWN0KCRkZWJ1Z09iamVjdCkpIHsgJGRlYnVnT2JqZWN0LT5kZWJ1Z0xvZ0VudHJ5KDEpOyB9CgogICAgICAgIGxpc3QoJHRhZywgJGtleSwgJHZhbCwgJGV4cCwgJG5vX2tleSkgPSAkc2VsZWN0b3I7CgogICAgICAgIC8vIHhwYXRoIGluZGV4CiAgICAgICAgaWYgKCR0YWcgJiYgJGtleSAmJiBpc19udW1lcmljKCRrZXkpKQogICAgICAgIHsKICAgICAgICAgICAgJGNvdW50ID0gMDsKICAgICAgICAgICAgZm9yZWFjaCAoJHRoaXMtPmNoaWxkcmVuIGFzICRjKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoJHRhZz09PScqJyB8fCAkdGFnPT09JGMtPnRhZykgewogICAgICAgICAgICAgICAgICAgIGlmICgrKyRjb3VudD09JGtleSkgewogICAgICAgICAgICAgICAgICAgICAgICAkcmV0WyRjLT5fW0hET01fSU5GT19CRUdJTl1dID0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICAkZW5kID0gKCFlbXB0eSgkdGhpcy0+X1tIRE9NX0lORk9fRU5EXSkpID8gJHRoaXMtPl9bSERPTV9JTkZPX0VORF0gOiAwOwogICAgICAgIGlmICgkZW5kPT0wKSB7CiAgICAgICAgICAgICRwYXJlbnQgPSAkdGhpcy0+cGFyZW50OwogICAgICAgICAgICB3aGlsZSAoIWlzc2V0KCRwYXJlbnQtPl9bSERPTV9JTkZPX0VORF0pICYmICRwYXJlbnQhPT1udWxsKSB7CiAgICAgICAgICAgICAgICAkZW5kIC09IDE7CiAgICAgICAgICAgICAgICAkcGFyZW50ID0gJHBhcmVudC0+cGFyZW50OwogICAgICAgICAgICB9CiAgICAgICAgICAgICRlbmQgKz0gJHBhcmVudC0+X1tIRE9NX0lORk9fRU5EXTsKICAgICAgICB9CgogICAgICAgIGZvciAoJGk9JHRoaXMtPl9bSERPTV9JTkZPX0JFR0lOXSsxOyAkaTwkZW5kOyArKyRpKSB7CiAgICAgICAgICAgICRub2RlID0gJHRoaXMtPmRvbS0+bm9kZXNbJGldOwoKICAgICAgICAgICAgJHBhc3MgPSB0cnVlOwoKICAgICAgICAgICAgaWYgKCR0YWc9PT0nKicgJiYgISRrZXkpIHsKICAgICAgICAgICAgICAgIGlmIChpbl9hcnJheSgkbm9kZSwgJHRoaXMtPmNoaWxkcmVuLCB0cnVlKSkKICAgICAgICAgICAgICAgICAgICAkcmV0WyRpXSA9IDE7CiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gY29tcGFyZSB0YWcKICAgICAgICAgICAgaWYgKCR0YWcgJiYgJHRhZyE9JG5vZGUtPnRhZyAmJiAkdGFnIT09JyonKSB7JHBhc3M9ZmFsc2U7fQogICAgICAgICAgICAvLyBjb21wYXJlIGtleQogICAgICAgICAgICBpZiAoJHBhc3MgJiYgJGtleSkgewogICAgICAgICAgICAgICAgaWYgKCRub19rZXkpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoaXNzZXQoJG5vZGUtPmF0dHJbJGtleV0pKSAkcGFzcz1mYWxzZTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCgka2V5ICE9ICJwbGFpbnRleHQiKSAmJiAhaXNzZXQoJG5vZGUtPmF0dHJbJGtleV0pKSAkcGFzcz1mYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBjb21wYXJlIHZhbHVlCiAgICAgICAgICAgIGlmICgkcGFzcyAmJiAka2V5ICYmICR2YWwgICYmICR2YWwhPT0nKicpIHsKICAgICAgICAgICAgICAgIC8vIElmIHRoZXkgaGF2ZSB0b2xkIHVzIHRoYXQgdGhpcyBpcyBhICJwbGFpbnRleHQiIHNlYXJjaCB0aGVuIHdlIHdhbnQgdGhlIHBsYWludGV4dCBvZiB0aGUgbm9kZSAtIHJpZ2h0PwogICAgICAgICAgICAgICAgaWYgKCRrZXkgPT0gInBsYWludGV4dCIpIHsKICAgICAgICAgICAgICAgICAgICAvLyAkbm9kZS0+cGxhaW50ZXh0IGFjdHVhbGx5IHJldHVybnMgJG5vZGUtPnRleHQoKTsKICAgICAgICAgICAgICAgICAgICAkbm9kZUtleVZhbHVlID0gJG5vZGUtPnRleHQoKTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyBpcyBhIG5vcm1hbCBzZWFyY2gsIHdlIHdhbnQgdGhlIHZhbHVlIG9mIHRoYXQgYXR0cmlidXRlIG9mIHRoZSB0YWcuCiAgICAgICAgICAgICAgICAgICAgJG5vZGVLZXlWYWx1ZSA9ICRub2RlLT5hdHRyWyRrZXldOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKGlzX29iamVjdCgkZGVidWdPYmplY3QpKSB7JGRlYnVnT2JqZWN0LT5kZWJ1Z0xvZygyLCAidGVzdGluZyBub2RlOiAiIC4gJG5vZGUtPnRhZyAuICIgZm9yIGF0dHJpYnV0ZTogIiAuICRrZXkgLiAkZXhwIC4gJHZhbCAuICIgd2hlcmUgbm9kZXMgdmFsdWUgaXM6ICIgLiAkbm9kZUtleVZhbHVlKTt9CgogICAgICAgICAgICAgICAgLy9QYXBlckcgLSBJZiBsb3dlcmNhc2UgaXMgc2V0LCBkbyBhIGNhc2UgaW5zZW5zaXRpdmUgdGVzdCBvZiB0aGUgdmFsdWUgb2YgdGhlIHNlbGVjdG9yLgogICAgICAgICAgICAgICAgaWYgKCRsb3dlcmNhc2UpIHsKICAgICAgICAgICAgICAgICAgICAkY2hlY2sgPSAkdGhpcy0+bWF0Y2goJGV4cCwgc3RydG9sb3dlcigkdmFsKSwgc3RydG9sb3dlcigkbm9kZUtleVZhbHVlKSk7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICRjaGVjayA9ICR0aGlzLT5tYXRjaCgkZXhwLCAkdmFsLCAkbm9kZUtleVZhbHVlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChpc19vYmplY3QoJGRlYnVnT2JqZWN0KSkgeyRkZWJ1Z09iamVjdC0+ZGVidWdMb2coMiwgImFmdGVyIG1hdGNoOiAiIC4gKCRjaGVjayA/ICJ0cnVlIiA6ICJmYWxzZSIpKTt9CgogICAgICAgICAgICAgICAgLy8gaGFuZGxlIG11bHRpcGxlIGNsYXNzCiAgICAgICAgICAgICAgICBpZiAoISRjaGVjayAmJiBzdHJjYXNlY21wKCRrZXksICdjbGFzcycpPT09MCkgewogICAgICAgICAgICAgICAgICAgIGZvcmVhY2ggKGV4cGxvZGUoJyAnLCRub2RlLT5hdHRyWyRrZXldKSBhcyAkaykgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBXaXRob3V0IHRoaXMsIHRoZXJlIHdlcmUgY2FzZXMgd2hlcmUgbGVhZGluZywgdHJhaWxpbmcsIG9yIGRvdWJsZSBzcGFjZXMgbGVhZCB0byBvdXIgY29tcGFyaW5nIGJsYW5rcyAtIGJhZCBmb3JtLgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWVtcHR5KCRrKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRsb3dlcmNhc2UpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkY2hlY2sgPSAkdGhpcy0+bWF0Y2goJGV4cCwgc3RydG9sb3dlcigkdmFsKSwgc3RydG9sb3dlcigkaykpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkY2hlY2sgPSAkdGhpcy0+bWF0Y2goJGV4cCwgJHZhbCwgJGspOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRjaGVjaykgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoISRjaGVjaykgJHBhc3MgPSBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoJHBhc3MpICRyZXRbJGldID0gMTsKICAgICAgICAgICAgdW5zZXQoJG5vZGUpOwogICAgICAgIH0KICAgICAgICAvLyBJdCdzIHBhc3NlZCBieSByZWZlcmVuY2Ugc28gdGhpcyBpcyBhY3R1YWxseSB3aGF0IHRoaXMgZnVuY3Rpb24gcmV0dXJucy4KICAgICAgICBpZiAoaXNfb2JqZWN0KCRkZWJ1Z09iamVjdCkpIHskZGVidWdPYmplY3QtPmRlYnVnTG9nKDEsICJFWElUIC0gcmV0OiAiLCAkcmV0KTt9CiAgICB9CgogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIG1hdGNoKCRleHAsICRwYXR0ZXJuLCAkdmFsdWUpIHsKICAgICAgICBnbG9iYWwgJGRlYnVnT2JqZWN0OwogICAgICAgIGlmIChpc19vYmplY3QoJGRlYnVnT2JqZWN0KSkgeyRkZWJ1Z09iamVjdC0+ZGVidWdMb2dFbnRyeSgxKTt9CgogICAgICAgIHN3aXRjaCAoJGV4cCkgewogICAgICAgICAgICBjYXNlICc9JzoKICAgICAgICAgICAgICAgIHJldHVybiAoJHZhbHVlPT09JHBhdHRlcm4pOwogICAgICAgICAgICBjYXNlICchPSc6CiAgICAgICAgICAgICAgICByZXR1cm4gKCR2YWx1ZSE9PSRwYXR0ZXJuKTsKICAgICAgICAgICAgY2FzZSAnXj0nOgogICAgICAgICAgICAgICAgcmV0dXJuIHByZWdfbWF0Y2goIi9eIi5wcmVnX3F1b3RlKCRwYXR0ZXJuLCcvJykuIi8iLCAkdmFsdWUpOwogICAgICAgICAgICBjYXNlICckPSc6CiAgICAgICAgICAgICAgICByZXR1cm4gcHJlZ19tYXRjaCgiLyIucHJlZ19xdW90ZSgkcGF0dGVybiwnLycpLiIkLyIsICR2YWx1ZSk7CiAgICAgICAgICAgIGNhc2UgJyo9JzoKICAgICAgICAgICAgICAgIGlmICgkcGF0dGVyblswXT09Jy8nKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHByZWdfbWF0Y2goJHBhdHRlcm4sICR2YWx1ZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gcHJlZ19tYXRjaCgiLyIuJHBhdHRlcm4uIi9pIiwgJHZhbHVlKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQoKICAgIHByb3RlY3RlZCBmdW5jdGlvbiBwYXJzZV9zZWxlY3Rvcigkc2VsZWN0b3Jfc3RyaW5nKSB7CiAgICAgICAgZ2xvYmFsICRkZWJ1Z09iamVjdDsKICAgICAgICBpZiAoaXNfb2JqZWN0KCRkZWJ1Z09iamVjdCkpIHskZGVidWdPYmplY3QtPmRlYnVnTG9nRW50cnkoMSk7fQoKICAgICAgICAvLyBwYXR0ZXJuIG9mIENTUyBzZWxlY3RvcnMsIG1vZGlmaWVkIGZyb20gbW9vdG9vbHMKICAgICAgICAvLyBQYXBlcmc6IEFkZCB0aGUgY29sb24gdG8gdGhlIGF0dHJidXRlLCBzbyB0aGF0IGl0IHByb3Blcmx5IGZpbmRzIDx0YWcgYXR0cjppYnV0ZT0ic29tZXRoaW5nIiA+IGxpa2UgZ29vZ2xlIGRvZXMuCiAgICAgICAgLy8gTm90ZTogaWYgeW91IHRyeSB0byBsb29rIGF0IHRoaXMgYXR0cmlidXRlLCB5byBNVVNUIHVzZSBnZXRBdHRyaWJ1dGUgc2luY2UgJGRvbS0+eDp5IHdpbGwgZmFpbCB0aGUgcGhwIHN5bnRheCBjaGVjay4KLy8gTm90aWNlIHRoZSBcWyBzdGFydGluZyB0aGUgYXR0YnV0ZT8gIGFuZCB0aGUgQD8gZm9sbG93aW5nPyAgVGhpcyBpbXBsaWVzIHRoYXQgYW4gYXR0cmlidXRlIGNhbiBiZWdpbiB3aXRoIGFuIEAgc2lnbiB0aGF0IGlzIG5vdCBjYXB0dXJlZC4KLy8gVGhpcyBpbXBsaWVzIHRoYXQgYW4gaHRtbCBhdHRyaWJ1dGUgc3BlY2lmaWVyIG1heSBzdGFydCB3aXRoIGFuIEAgc2lnbiB0aGF0IGlzIE5PVCBjYXB0dXJlZCBieSB0aGUgZXhwcmVzc2lvbi4KLy8gZmFydGhlciBzdHVkeSBpcyByZXF1aXJlZCB0byBkZXRlcm1pbmUgb2YgdGhpcyBzaG91bGQgYmUgZG9jdW1lbnRlZCBvciByZW1vdmVkLgovLyAgICAgICAgJHBhdHRlcm4gPSAiLyhbXHctOlwqXSopKD86XCMoW1x3LV0rKXxcLihbXHctXSspKT8oPzpcW0A/KCE/W1x3LV0rKSg/OihbISpeJF0/PSlbXCInXT8oLio/KVtcIiddPyk/XF0pPyhbXC8sIF0rKS9pcyI7CiAgICAgICAgJHBhdHRlcm4gPSAiLyhbXHdcLTpcKl0qKSg/OlwjKFtcd1wtXSspfFwuKFtcd1wtXSspKT8oPzpcW0A/KCE/W1x3XC06XSspKD86KFshKl4kXT89KVtcIiddPyguKj8pW1wiJ10/KT9cXSk/KFtcLywgXSspL2lzIjsKICAgICAgICBwcmVnX21hdGNoX2FsbCgkcGF0dGVybiwgdHJpbSgkc2VsZWN0b3Jfc3RyaW5nKS4nICcsICRtYXRjaGVzLCBQUkVHX1NFVF9PUkRFUik7CiAgICAgICAgaWYgKGlzX29iamVjdCgkZGVidWdPYmplY3QpKSB7JGRlYnVnT2JqZWN0LT5kZWJ1Z0xvZygyLCAiTWF0Y2hlcyBBcnJheTogIiwgJG1hdGNoZXMpO30KCiAgICAgICAgJHNlbGVjdG9ycyA9IGFycmF5KCk7CiAgICAgICAgJHJlc3VsdCA9IGFycmF5KCk7CiAgICAgICAgLy9wcmludF9yKCRtYXRjaGVzKTsKCiAgICAgICAgZm9yZWFjaCAoJG1hdGNoZXMgYXMgJG0pIHsKICAgICAgICAgICAgJG1bMF0gPSB0cmltKCRtWzBdKTsKICAgICAgICAgICAgaWYgKCRtWzBdPT09JycgfHwgJG1bMF09PT0nLycgfHwgJG1bMF09PT0nLy8nKSBjb250aW51ZTsKICAgICAgICAgICAgLy8gZm9yIGJyb3dzZXIgZ2VuZXJhdGVkIHhwYXRoCiAgICAgICAgICAgIGlmICgkbVsxXT09PSd0Ym9keScpIGNvbnRpbnVlOwoKICAgICAgICAgICAgbGlzdCgkdGFnLCAka2V5LCAkdmFsLCAkZXhwLCAkbm9fa2V5KSA9IGFycmF5KCRtWzFdLCBudWxsLCBudWxsLCAnPScsIGZhbHNlKTsKICAgICAgICAgICAgaWYgKCFlbXB0eSgkbVsyXSkpIHska2V5PSdpZCc7ICR2YWw9JG1bMl07fQogICAgICAgICAgICBpZiAoIWVtcHR5KCRtWzNdKSkgeyRrZXk9J2NsYXNzJzsgJHZhbD0kbVszXTt9CiAgICAgICAgICAgIGlmICghZW1wdHkoJG1bNF0pKSB7JGtleT0kbVs0XTt9CiAgICAgICAgICAgIGlmICghZW1wdHkoJG1bNV0pKSB7JGV4cD0kbVs1XTt9CiAgICAgICAgICAgIGlmICghZW1wdHkoJG1bNl0pKSB7JHZhbD0kbVs2XTt9CgogICAgICAgICAgICAvLyBjb252ZXJ0IHRvIGxvd2VyY2FzZQogICAgICAgICAgICBpZiAoJHRoaXMtPmRvbS0+bG93ZXJjYXNlKSB7JHRhZz1zdHJ0b2xvd2VyKCR0YWcpOyAka2V5PXN0cnRvbG93ZXIoJGtleSk7fQogICAgICAgICAgICAvL2VsZW1lbnRzIHRoYXQgZG8gTk9UIGhhdmUgdGhlIHNwZWNpZmllZCBhdHRyaWJ1dGUKICAgICAgICAgICAgaWYgKGlzc2V0KCRrZXlbMF0pICYmICRrZXlbMF09PT0nIScpIHska2V5PXN1YnN0cigka2V5LCAxKTsgJG5vX2tleT10cnVlO30KCiAgICAgICAgICAgICRyZXN1bHRbXSA9IGFycmF5KCR0YWcsICRrZXksICR2YWwsICRleHAsICRub19rZXkpOwogICAgICAgICAgICBpZiAodHJpbSgkbVs3XSk9PT0nLCcpIHsKICAgICAgICAgICAgICAgICRzZWxlY3RvcnNbXSA9ICRyZXN1bHQ7CiAgICAgICAgICAgICAgICAkcmVzdWx0ID0gYXJyYXkoKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoY291bnQoJHJlc3VsdCk+MCkKICAgICAgICAgICAgJHNlbGVjdG9yc1tdID0gJHJlc3VsdDsKICAgICAgICByZXR1cm4gJHNlbGVjdG9yczsKICAgIH0KCiAgICBmdW5jdGlvbiBfX2dldCgkbmFtZSkgewogICAgICAgIGlmIChpc3NldCgkdGhpcy0+YXR0clskbmFtZV0pKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuICR0aGlzLT5jb252ZXJ0X3RleHQoJHRoaXMtPmF0dHJbJG5hbWVdKTsKICAgICAgICB9CiAgICAgICAgc3dpdGNoICgkbmFtZSkgewogICAgICAgICAgICBjYXNlICdvdXRlcnRleHQnOiByZXR1cm4gJHRoaXMtPm91dGVydGV4dCgpOwogICAgICAgICAgICBjYXNlICdpbm5lcnRleHQnOiByZXR1cm4gJHRoaXMtPmlubmVydGV4dCgpOwogICAgICAgICAgICBjYXNlICdwbGFpbnRleHQnOiByZXR1cm4gJHRoaXMtPnRleHQoKTsKICAgICAgICAgICAgY2FzZSAneG1sdGV4dCc6IHJldHVybiAkdGhpcy0+eG1sdGV4dCgpOwogICAgICAgICAgICBkZWZhdWx0OiByZXR1cm4gYXJyYXlfa2V5X2V4aXN0cygkbmFtZSwgJHRoaXMtPmF0dHIpOwogICAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiBfX3NldCgkbmFtZSwgJHZhbHVlKSB7CiAgICAgICAgc3dpdGNoICgkbmFtZSkgewogICAgICAgICAgICBjYXNlICdvdXRlcnRleHQnOiByZXR1cm4gJHRoaXMtPl9bSERPTV9JTkZPX09VVEVSXSA9ICR2YWx1ZTsKICAgICAgICAgICAgY2FzZSAnaW5uZXJ0ZXh0JzoKICAgICAgICAgICAgICAgIGlmIChpc3NldCgkdGhpcy0+X1tIRE9NX0lORk9fVEVYVF0pKSByZXR1cm4gJHRoaXMtPl9bSERPTV9JTkZPX1RFWFRdID0gJHZhbHVlOwogICAgICAgICAgICAgICAgcmV0dXJuICR0aGlzLT5fW0hET01fSU5GT19JTk5FUl0gPSAkdmFsdWU7CiAgICAgICAgfQogICAgICAgIGlmICghaXNzZXQoJHRoaXMtPmF0dHJbJG5hbWVdKSkgewogICAgICAgICAgICAkdGhpcy0+X1tIRE9NX0lORk9fU1BBQ0VdW10gPSBhcnJheSgnICcsICcnLCAnJyk7CiAgICAgICAgICAgICR0aGlzLT5fW0hET01fSU5GT19RVU9URV1bXSA9IEhET01fUVVPVEVfRE9VQkxFOwogICAgICAgIH0KICAgICAgICAkdGhpcy0+YXR0clskbmFtZV0gPSAkdmFsdWU7CiAgICB9CgogICAgZnVuY3Rpb24gX19pc3NldCgkbmFtZSkgewogICAgICAgIHN3aXRjaCAoJG5hbWUpIHsKICAgICAgICAgICAgY2FzZSAnb3V0ZXJ0ZXh0JzogcmV0dXJuIHRydWU7CiAgICAgICAgICAgIGNhc2UgJ2lubmVydGV4dCc6IHJldHVybiB0cnVlOwogICAgICAgICAgICBjYXNlICdwbGFpbnRleHQnOiByZXR1cm4gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgLy9ubyB2YWx1ZSBhdHRyOiBub3dyYXAsIGNoZWNrZWQgc2VsZWN0ZWQuLi4KICAgICAgICByZXR1cm4gKGFycmF5X2tleV9leGlzdHMoJG5hbWUsICR0aGlzLT5hdHRyKSkgPyB0cnVlIDogaXNzZXQoJHRoaXMtPmF0dHJbJG5hbWVdKTsKICAgIH0KCiAgICBmdW5jdGlvbiBfX3Vuc2V0KCRuYW1lKSB7CiAgICAgICAgaWYgKGlzc2V0KCR0aGlzLT5hdHRyWyRuYW1lXSkpCiAgICAgICAgICAgIHVuc2V0KCR0aGlzLT5hdHRyWyRuYW1lXSk7CiAgICB9CgogICAgLy8gUGFwZXJHIC0gRnVuY3Rpb24gdG8gY29udmVydCB0aGUgdGV4dCBmcm9tIG9uZSBjaGFyYWN0ZXIgc2V0IHRvIGFub3RoZXIgaWYgdGhlIHR3byBzZXRzIGFyZSBub3QgdGhlIHNhbWUuCiAgICBmdW5jdGlvbiBjb252ZXJ0X3RleHQoJHRleHQpCiAgICB7CiAgICAgICAgZ2xvYmFsICRkZWJ1Z09iamVjdDsKICAgICAgICBpZiAoaXNfb2JqZWN0KCRkZWJ1Z09iamVjdCkpIHskZGVidWdPYmplY3QtPmRlYnVnTG9nRW50cnkoMSk7fQoKICAgICAgICAkY29udmVydGVkX3RleHQgPSAkdGV4dDsKCiAgICAgICAgJHNvdXJjZUNoYXJzZXQgPSAiIjsKICAgICAgICAkdGFyZ2V0Q2hhcnNldCA9ICIiOwoKICAgICAgICBpZiAoJHRoaXMtPmRvbSkKICAgICAgICB7CiAgICAgICAgICAgICRzb3VyY2VDaGFyc2V0ID0gc3RydG91cHBlcigkdGhpcy0+ZG9tLT5fY2hhcnNldCk7CiAgICAgICAgICAgICR0YXJnZXRDaGFyc2V0ID0gc3RydG91cHBlcigkdGhpcy0+ZG9tLT5fdGFyZ2V0X2NoYXJzZXQpOwogICAgICAgIH0KICAgICAgICBpZiAoaXNfb2JqZWN0KCRkZWJ1Z09iamVjdCkpIHskZGVidWdPYmplY3QtPmRlYnVnTG9nKDMsICJzb3VyY2UgY2hhcnNldDogIiAuICRzb3VyY2VDaGFyc2V0IC4gIiB0YXJnZXQgY2hhcmFzZXQ6ICIgLiAkdGFyZ2V0Q2hhcnNldCk7fQoKICAgICAgICBpZiAoIWVtcHR5KCRzb3VyY2VDaGFyc2V0KSAmJiAhZW1wdHkoJHRhcmdldENoYXJzZXQpICYmIChzdHJjYXNlY21wKCRzb3VyY2VDaGFyc2V0LCAkdGFyZ2V0Q2hhcnNldCkgIT0gMCkpCiAgICAgICAgewogICAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgcmVwb3J0ZWQgZW5jb2RpbmcgY291bGQgaGF2ZSBiZWVuIGluY29ycmVjdCBhbmQgdGhlIHRleHQgaXMgYWN0dWFsbHkgYWxyZWFkeSBVVEYtOAogICAgICAgICAgICBpZiAoKHN0cmNhc2VjbXAoJHRhcmdldENoYXJzZXQsICdVVEYtOCcpID09IDApICYmICgkdGhpcy0+aXNfdXRmOCgkdGV4dCkpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkY29udmVydGVkX3RleHQgPSAkdGV4dDsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICRjb252ZXJ0ZWRfdGV4dCA9IGljb252KCRzb3VyY2VDaGFyc2V0LCAkdGFyZ2V0Q2hhcnNldCwgJHRleHQpOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvLyBMZXRzIG1ha2Ugc3VyZSB0aGF0IHdlIGRvbid0IGhhdmUgdGhhdCBzaWxseSBCT00gaXNzdWUgd2l0aCBhbnkgb2YgdGhlIHV0Zi04IHRleHQgd2Ugb3V0cHV0LgogICAgICAgIGlmICgkdGFyZ2V0Q2hhcnNldCA9PSAnVVRGLTgnKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKHN1YnN0cigkY29udmVydGVkX3RleHQsIDAsIDMpID09ICJceGVmXHhiYlx4YmYiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkY29udmVydGVkX3RleHQgPSBzdWJzdHIoJGNvbnZlcnRlZF90ZXh0LCAzKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoc3Vic3RyKCRjb252ZXJ0ZWRfdGV4dCwgLTMpID09ICJceGVmXHhiYlx4YmYiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkY29udmVydGVkX3RleHQgPSBzdWJzdHIoJGNvbnZlcnRlZF90ZXh0LCAwLCAtMyk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHJldHVybiAkY29udmVydGVkX3RleHQ7CiAgICB9CgogICAgLyoqCiAgICAqIFJldHVybnMgdHJ1ZSBpZiAkc3RyaW5nIGlzIHZhbGlkIFVURi04IGFuZCBmYWxzZSBvdGhlcndpc2UuCiAgICAqCiAgICAqIEBwYXJhbSBtaXhlZCAkc3RyIFN0cmluZyB0byBiZSB0ZXN0ZWQKICAgICogQHJldHVybiBib29sZWFuCiAgICAqLwogICAgc3RhdGljIGZ1bmN0aW9uIGlzX3V0ZjgoJHN0cikKICAgIHsKICAgICAgICAkYz0wOyAkYj0wOwogICAgICAgICRiaXRzPTA7CiAgICAgICAgJGxlbj1zdHJsZW4oJHN0cik7CiAgICAgICAgZm9yKCRpPTA7ICRpPCRsZW47ICRpKyspCiAgICAgICAgewogICAgICAgICAgICAkYz1vcmQoJHN0clskaV0pOwogICAgICAgICAgICBpZigkYyA+IDEyOCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYoKCRjID49IDI1NCkpIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIGVsc2VpZigkYyA+PSAyNTIpICRiaXRzPTY7CiAgICAgICAgICAgICAgICBlbHNlaWYoJGMgPj0gMjQ4KSAkYml0cz01OwogICAgICAgICAgICAgICAgZWxzZWlmKCRjID49IDI0MCkgJGJpdHM9NDsKICAgICAgICAgICAgICAgIGVsc2VpZigkYyA+PSAyMjQpICRiaXRzPTM7CiAgICAgICAgICAgICAgICBlbHNlaWYoJGMgPj0gMTkyKSAkYml0cz0yOwogICAgICAgICAgICAgICAgZWxzZSByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICBpZigoJGkrJGJpdHMpID4gJGxlbikgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgd2hpbGUoJGJpdHMgPiAxKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICRpKys7CiAgICAgICAgICAgICAgICAgICAgJGI9b3JkKCRzdHJbJGldKTsKICAgICAgICAgICAgICAgICAgICBpZigkYiA8IDEyOCB8fCAkYiA+IDE5MSkgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgICAgICRiaXRzLS07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgICAvKgogICAgZnVuY3Rpb24gaXNfdXRmOCgkc3RyaW5nKQogICAgewogICAgICAgIC8vdGhpcyBpcyBidWdneQogICAgICAgIHJldHVybiAodXRmOF9lbmNvZGUodXRmOF9kZWNvZGUoJHN0cmluZykpID09ICRzdHJpbmcpOwogICAgfQogICAgKi8KCiAgICAvKioKICAgICAqIEZ1bmN0aW9uIHRvIHRyeSBhIGZldyB0cmlja3MgdG8gZGV0ZXJtaW5lIHRoZSBkaXNwbGF5ZWQgc2l6ZSBvZiBhbiBpbWcgb24gdGhlIHBhZ2UuCiAgICAgKiBOT1RFOiBUaGlzIHdpbGwgT05MWSB3b3JrIG9uIGFuIElNRyB0YWcuIFJldHVybnMgRkFMU0Ugb24gYWxsIG90aGVyIHRhZyB0eXBlcy4KICAgICAqCiAgICAgKiBAYXV0aG9yIEpvaG4gU2NobGljawogICAgICogQHZlcnNpb24gQXByaWwgMTkgMjAxMgogICAgICogQHJldHVybiBhcnJheSBhbiBhcnJheSBjb250YWluaW5nIHRoZSAnaGVpZ2h0JyBhbmQgJ3dpZHRoJyBvZiB0aGUgaW1hZ2Ugb24gdGhlIHBhZ2Ugb3IgLTEgaWYgd2UgY2FuJ3QgZmlndXJlIGl0IG91dC4KICAgICAqLwogICAgZnVuY3Rpb24gZ2V0X2Rpc3BsYXlfc2l6ZSgpCiAgICB7CiAgICAgICAgZ2xvYmFsICRkZWJ1Z09iamVjdDsKCiAgICAgICAgJHdpZHRoID0gLTE7CiAgICAgICAgJGhlaWdodCA9IC0xOwoKICAgICAgICBpZiAoJHRoaXMtPnRhZyAhPT0gJ2ltZycpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQoKICAgICAgICAvLyBTZWUgaWYgdGhlcmUgaXMgYWhlaWdodCBvciB3aWR0aCBhdHRyaWJ1dGUgaW4gdGhlIHRhZyBpdHNlbGYuCiAgICAgICAgaWYgKGlzc2V0KCR0aGlzLT5hdHRyWyd3aWR0aCddKSkKICAgICAgICB7CiAgICAgICAgICAgICR3aWR0aCA9ICR0aGlzLT5hdHRyWyd3aWR0aCddOwogICAgICAgIH0KCiAgICAgICAgaWYgKGlzc2V0KCR0aGlzLT5hdHRyWydoZWlnaHQnXSkpCiAgICAgICAgewogICAgICAgICAgICAkaGVpZ2h0ID0gJHRoaXMtPmF0dHJbJ2hlaWdodCddOwogICAgICAgIH0KCiAgICAgICAgLy8gTm93IGxvb2sgZm9yIGFuIGlubGluZSBzdHlsZS4KICAgICAgICBpZiAoaXNzZXQoJHRoaXMtPmF0dHJbJ3N0eWxlJ10pKQogICAgICAgIHsKICAgICAgICAgICAgLy8gVGhhbmtzIHRvIHVzZXIgZ25hcmYgZnJvbSBzdGFja292ZXJmbG93IGZvciB0aGlzIHJlZ3VsYXIgZXhwcmVzc2lvbi4KICAgICAgICAgICAgJGF0dHJpYnV0ZXMgPSBhcnJheSgpOwogICAgICAgICAgICBwcmVnX21hdGNoX2FsbCgiLyhbXHdcLV0rKVxzKjpccyooW147XSspXHMqOz8vIiwgJHRoaXMtPmF0dHJbJ3N0eWxlJ10sICRtYXRjaGVzLCBQUkVHX1NFVF9PUkRFUik7CiAgICAgICAgICAgIGZvcmVhY2ggKCRtYXRjaGVzIGFzICRtYXRjaCkgewogICAgICAgICAgICAgICRhdHRyaWJ1dGVzWyRtYXRjaFsxXV0gPSAkbWF0Y2hbMl07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIElmIHRoZXJlIGlzIGEgd2lkdGggaW4gdGhlIHN0eWxlIGF0dHJpYnV0ZXM6CiAgICAgICAgICAgIGlmIChpc3NldCgkYXR0cmlidXRlc1snd2lkdGgnXSkgJiYgJHdpZHRoID09IC0xKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBjaGVjayB0aGF0IHRoZSBsYXN0IHR3byBjaGFyYWN0ZXJzIGFyZSBweCAocGl4ZWxzKQogICAgICAgICAgICAgICAgaWYgKHN0cnRvbG93ZXIoc3Vic3RyKCRhdHRyaWJ1dGVzWyd3aWR0aCddLCAtMikpID09ICdweCcpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgJHByb3Bvc2VkX3dpZHRoID0gc3Vic3RyKCRhdHRyaWJ1dGVzWyd3aWR0aCddLCAwLCAtMik7CiAgICAgICAgICAgICAgICAgICAgLy8gTm93IG1ha2Ugc3VyZSB0aGF0IGl0J3MgYW4gaW50ZWdlciBhbmQgbm90IHNvbWV0aGluZyBzdHVwaWQuCiAgICAgICAgICAgICAgICAgICAgaWYgKGZpbHRlcl92YXIoJHByb3Bvc2VkX3dpZHRoLCBGSUxURVJfVkFMSURBVEVfSU5UKSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICR3aWR0aCA9ICRwcm9wb3NlZF93aWR0aDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIElmIHRoZXJlIGlzIGEgd2lkdGggaW4gdGhlIHN0eWxlIGF0dHJpYnV0ZXM6CiAgICAgICAgICAgIGlmIChpc3NldCgkYXR0cmlidXRlc1snaGVpZ2h0J10pICYmICRoZWlnaHQgPT0gLTEpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIGNoZWNrIHRoYXQgdGhlIGxhc3QgdHdvIGNoYXJhY3RlcnMgYXJlIHB4IChwaXhlbHMpCiAgICAgICAgICAgICAgICBpZiAoc3RydG9sb3dlcihzdWJzdHIoJGF0dHJpYnV0ZXNbJ2hlaWdodCddLCAtMikpID09ICdweCcpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgJHByb3Bvc2VkX2hlaWdodCA9IHN1YnN0cigkYXR0cmlidXRlc1snaGVpZ2h0J10sIDAsIC0yKTsKICAgICAgICAgICAgICAgICAgICAvLyBOb3cgbWFrZSBzdXJlIHRoYXQgaXQncyBhbiBpbnRlZ2VyIGFuZCBub3Qgc29tZXRoaW5nIHN0dXBpZC4KICAgICAgICAgICAgICAgICAgICBpZiAoZmlsdGVyX3ZhcigkcHJvcG9zZWRfaGVpZ2h0LCBGSUxURVJfVkFMSURBVEVfSU5UKSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICRoZWlnaHQgPSAkcHJvcG9zZWRfaGVpZ2h0OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICB9CgogICAgICAgIC8vIEZ1dHVyZSBlbmhhbmNlbWVudDoKICAgICAgICAvLyBMb29rIGluIHRoZSB0YWcgdG8gc2VlIGlmIHRoZXJlIGlzIGEgY2xhc3Mgb3IgaWQgc3BlY2lmaWVkIHRoYXQgaGFzIGEgaGVpZ2h0IG9yIHdpZHRoIGF0dHJpYnV0ZSB0byBpdC4KCiAgICAgICAgLy8gRmFyIGZ1dHVyZSBlbmhhbmNlbWVudAogICAgICAgIC8vIExvb2sgYXQgYWxsIHRoZSBwYXJlbnQgdGFncyBvZiB0aGlzIGltYWdlIHRvIHNlZSBpZiB0aGV5IHNwZWNpZnkgYSBjbGFzcyBvciBpZCB0aGF0IGhhcyBhbiBpbWcgc2VsZWN0b3IgdGhhdCBzcGVjaWZpZXMgYSBoZWlnaHQgb3Igd2lkdGgKICAgICAgICAvLyBOb3RlIHRoYXQgaW4gdGhpcyBjYXNlLCB0aGUgY2xhc3Mgb3IgaWQgd2lsbCBoYXZlIHRoZSBpbWcgc3Vic2VsZWN0b3IgZm9yIGl0IHRvIGFwcGx5IHRvIHRoZSBpbWFnZS4KCiAgICAgICAgLy8gcmlkaWN1bG91c2x5IGZhciBmdXR1cmUgZGV2ZWxvcG1lbnQKICAgICAgICAvLyBJZiB0aGUgY2xhc3Mgb3IgaWQgaXMgc3BlY2lmaWVkIGluIGEgU0VQQVJBVEUgY3NzIGZpbGUgdGhhdHMgbm90IG9uIHRoZSBwYWdlLCBnbyBnZXQgaXQgYW5kIGRvIHdoYXQgd2Ugd2VyZSBqdXN0IGRvaW5nIGZvciB0aGUgb25lcyBvbiB0aGUgcGFnZS4KCiAgICAgICAgJHJlc3VsdCA9IGFycmF5KCdoZWlnaHQnID0+ICRoZWlnaHQsCiAgICAgICAgICAgICAgICAgICAgICAgICd3aWR0aCcgPT4gJHdpZHRoKTsKICAgICAgICByZXR1cm4gJHJlc3VsdDsKICAgIH0KCiAgICAvLyBjYW1lbCBuYW1pbmcgY29udmVudGlvbnMKICAgIGZ1bmN0aW9uIGdldEFsbEF0dHJpYnV0ZXMoKSB7cmV0dXJuICR0aGlzLT5hdHRyO30KICAgIGZ1bmN0aW9uIGdldEF0dHJpYnV0ZSgkbmFtZSkge3JldHVybiAkdGhpcy0+X19nZXQoJG5hbWUpO30KICAgIGZ1bmN0aW9uIHNldEF0dHJpYnV0ZSgkbmFtZSwgJHZhbHVlKSB7JHRoaXMtPl9fc2V0KCRuYW1lLCAkdmFsdWUpO30KICAgIGZ1bmN0aW9uIGhhc0F0dHJpYnV0ZSgkbmFtZSkge3JldHVybiAkdGhpcy0+X19pc3NldCgkbmFtZSk7fQogICAgZnVuY3Rpb24gcmVtb3ZlQXR0cmlidXRlKCRuYW1lKSB7JHRoaXMtPl9fc2V0KCRuYW1lLCBudWxsKTt9CiAgICBmdW5jdGlvbiBnZXRFbGVtZW50QnlJZCgkaWQpIHtyZXR1cm4gJHRoaXMtPmZpbmQoIiMkaWQiLCAwKTt9CiAgICBmdW5jdGlvbiBnZXRFbGVtZW50c0J5SWQoJGlkLCAkaWR4PW51bGwpIHtyZXR1cm4gJHRoaXMtPmZpbmQoIiMkaWQiLCAkaWR4KTt9CiAgICBmdW5jdGlvbiBnZXRFbGVtZW50QnlUYWdOYW1lKCRuYW1lKSB7cmV0dXJuICR0aGlzLT5maW5kKCRuYW1lLCAwKTt9CiAgICBmdW5jdGlvbiBnZXRFbGVtZW50c0J5VGFnTmFtZSgkbmFtZSwgJGlkeD1udWxsKSB7cmV0dXJuICR0aGlzLT5maW5kKCRuYW1lLCAkaWR4KTt9CiAgICBmdW5jdGlvbiBwYXJlbnROb2RlKCkge3JldHVybiAkdGhpcy0+cGFyZW50KCk7fQogICAgZnVuY3Rpb24gY2hpbGROb2RlcygkaWR4PS0xKSB7cmV0dXJuICR0aGlzLT5jaGlsZHJlbigkaWR4KTt9CiAgICBmdW5jdGlvbiBmaXJzdENoaWxkKCkge3JldHVybiAkdGhpcy0+Zmlyc3RfY2hpbGQoKTt9CiAgICBmdW5jdGlvbiBsYXN0Q2hpbGQoKSB7cmV0dXJuICR0aGlzLT5sYXN0X2NoaWxkKCk7fQogICAgZnVuY3Rpb24gbmV4dFNpYmxpbmcoKSB7cmV0dXJuICR0aGlzLT5uZXh0X3NpYmxpbmcoKTt9CiAgICBmdW5jdGlvbiBwcmV2aW91c1NpYmxpbmcoKSB7cmV0dXJuICR0aGlzLT5wcmV2X3NpYmxpbmcoKTt9CiAgICBmdW5jdGlvbiBoYXNDaGlsZE5vZGVzKCkge3JldHVybiAkdGhpcy0+aGFzX2NoaWxkKCk7fQogICAgZnVuY3Rpb24gbm9kZU5hbWUoKSB7cmV0dXJuICR0aGlzLT50YWc7fQogICAgZnVuY3Rpb24gYXBwZW5kQ2hpbGQoJG5vZGUpIHskbm9kZS0+cGFyZW50KCR0aGlzKTsgcmV0dXJuICRub2RlO30KCn0KCi8qKgogKiBzaW1wbGUgaHRtbCBkb20gcGFyc2VyCiAqIFBhcGVyZyAtIGluIHRoZSBmaW5kIHJvdXRpbmU6IGFsbG93IHVzIHRvIHNwZWNpZnkgdGhhdCB3ZSB3YW50IGNhc2UgaW5zZW5zaXRpdmUgdGVzdGluZyBvZiB0aGUgdmFsdWUgb2YgdGhlIHNlbGVjdG9yLgogKiBQYXBlcmcgLSBjaGFuZ2UgJHNpemUgZnJvbSBwcm90ZWN0ZWQgdG8gcHVibGljIHNvIHdlIGNhbiBlYXNpbHkgYWNjZXNzIGl0CiAqIFBhcGVyZyAtIGFkZGVkIEZvcmNlVGFnc0Nsb3NlZCBpbiB0aGUgY29uc3RydWN0b3Igd2hpY2ggdGVsbHMgdXMgd2hldGhlciB3ZSB0cnVzdCB0aGUgaHRtbCBvciBub3QuICBEZWZhdWx0IGlzIHRvIE5PVCB0cnVzdCBpdC4KICoKICogQHBhY2thZ2UgUGxhY2VMb2NhbEluY2x1ZGUKICovCmNsYXNzIHNpbXBsZV9odG1sX2RvbQp7CiAgICBwdWJsaWMgJHJvb3QgPSBudWxsOwogICAgcHVibGljICRub2RlcyA9IGFycmF5KCk7CiAgICBwdWJsaWMgJGNhbGxiYWNrID0gbnVsbDsKICAgIHB1YmxpYyAkbG93ZXJjYXNlID0gZmFsc2U7CiAgICAvLyBVc2VkIHRvIGtlZXAgdHJhY2sgb2YgaG93IGxhcmdlIHRoZSB0ZXh0IHdhcyB3aGVuIHdlIHN0YXJ0ZWQuCiAgICBwdWJsaWMgJG9yaWdpbmFsX3NpemU7CiAgICBwdWJsaWMgJHNpemU7CiAgICBwcm90ZWN0ZWQgJHBvczsKICAgIHByb3RlY3RlZCAkZG9jOwogICAgcHJvdGVjdGVkICRjaGFyOwogICAgcHJvdGVjdGVkICRjdXJzb3I7CiAgICBwcm90ZWN0ZWQgJHBhcmVudDsKICAgIHByb3RlY3RlZCAkbm9pc2UgPSBhcnJheSgpOwogICAgcHJvdGVjdGVkICR0b2tlbl9ibGFuayA9ICIgXHRcclxuIjsKICAgIHByb3RlY3RlZCAkdG9rZW5fZXF1YWwgPSAnID0vPic7CiAgICBwcm90ZWN0ZWQgJHRva2VuX3NsYXNoID0gIiAvPlxyXG5cdCI7CiAgICBwcm90ZWN0ZWQgJHRva2VuX2F0dHIgPSAnID4nOwogICAgLy8gTm90ZSB0aGF0IHRoaXMgaXMgcmVmZXJlbmNlZCBieSBhIGNoaWxkIG5vZGUsIGFuZCBzbyBpdCBuZWVkcyB0byBiZSBwdWJsaWMgZm9yIHRoYXQgbm9kZSB0byBzZWUgdGhpcyBpbmZvcm1hdGlvbi4KICAgIHB1YmxpYyAkX2NoYXJzZXQgPSAnJzsKICAgIHB1YmxpYyAkX3RhcmdldF9jaGFyc2V0ID0gJyc7CiAgICBwcm90ZWN0ZWQgJGRlZmF1bHRfYnJfdGV4dCA9ICIiOwogICAgcHVibGljICRkZWZhdWx0X3NwYW5fdGV4dCA9ICIiOwoKICAgIC8vIHVzZSBpc3NldCBpbnN0ZWFkIG9mIGluX2FycmF5LCBwZXJmb3JtYW5jZSBib29zdCBhYm91dCAzMCUuLi4KICAgIHByb3RlY3RlZCAkc2VsZl9jbG9zaW5nX3RhZ3MgPSBhcnJheSgnaW1nJz0+MSwgJ2JyJz0+MSwgJ2lucHV0Jz0+MSwgJ21ldGEnPT4xLCAnbGluayc9PjEsICdocic9PjEsICdiYXNlJz0+MSwgJ2VtYmVkJz0+MSwgJ3NwYWNlcic9PjEpOwogICAgcHJvdGVjdGVkICRibG9ja190YWdzID0gYXJyYXkoJ3Jvb3QnPT4xLCAnYm9keSc9PjEsICdmb3JtJz0+MSwgJ2Rpdic9PjEsICdzcGFuJz0+MSwgJ3RhYmxlJz0+MSk7CiAgICAvLyBLbm93biBzb3VyY2Vmb3JnZSBpc3N1ZSAjMjk3NzM0MQogICAgLy8gQiB0YWdzIHRoYXQgYXJlIG5vdCBjbG9zZWQgY2F1c2UgdXMgdG8gcmV0dXJuIGV2ZXJ5dGhpbmcgdG8gdGhlIGVuZCBvZiB0aGUgZG9jdW1lbnQuCiAgICBwcm90ZWN0ZWQgJG9wdGlvbmFsX2Nsb3NpbmdfdGFncyA9IGFycmF5KAogICAgICAgICd0cic9PmFycmF5KCd0cic9PjEsICd0ZCc9PjEsICd0aCc9PjEpLAogICAgICAgICd0aCc9PmFycmF5KCd0aCc9PjEpLAogICAgICAgICd0ZCc9PmFycmF5KCd0ZCc9PjEpLAogICAgICAgICdsaSc9PmFycmF5KCdsaSc9PjEpLAogICAgICAgICdkdCc9PmFycmF5KCdkdCc9PjEsICdkZCc9PjEpLAogICAgICAgICdkZCc9PmFycmF5KCdkZCc9PjEsICdkdCc9PjEpLAogICAgICAgICdkbCc9PmFycmF5KCdkZCc9PjEsICdkdCc9PjEpLAogICAgICAgICdwJz0+YXJyYXkoJ3AnPT4xKSwKICAgICAgICAnbm9icic9PmFycmF5KCdub2JyJz0+MSksCiAgICAgICAgJ2InPT5hcnJheSgnYic9PjEpLAoJCSdvcHRpb24nPT5hcnJheSgnb3B0aW9uJz0+MSksCiAgICApOwoKICAgIGZ1bmN0aW9uIF9fY29uc3RydWN0KCRzdHI9bnVsbCwgJGxvd2VyY2FzZT10cnVlLCAkZm9yY2VUYWdzQ2xvc2VkPXRydWUsICR0YXJnZXRfY2hhcnNldD1ERUZBVUxUX1RBUkdFVF9DSEFSU0VULCAkc3RyaXBSTj10cnVlLCAkZGVmYXVsdEJSVGV4dD1ERUZBVUxUX0JSX1RFWFQsICRkZWZhdWx0U3BhblRleHQ9REVGQVVMVF9TUEFOX1RFWFQpCiAgICB7CiAgICAgICAgaWYgKCRzdHIpCiAgICAgICAgewogICAgICAgICAgICBpZiAocHJlZ19tYXRjaCgiL15odHRwOlwvXC8vaSIsJHN0cikgfHwgaXNfZmlsZSgkc3RyKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJHRoaXMtPmxvYWRfZmlsZSgkc3RyKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICR0aGlzLT5sb2FkKCRzdHIsICRsb3dlcmNhc2UsICRzdHJpcFJOLCAkZGVmYXVsdEJSVGV4dCwgJGRlZmF1bHRTcGFuVGV4dCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLy8gRm9yY2luZyB0YWdzIHRvIGJlIGNsb3NlZCBpbXBsaWVzIHRoYXQgd2UgZG9uJ3QgdHJ1c3QgdGhlIGh0bWwsIGJ1dCBpdCBjYW4gbGVhZCB0byBwYXJzaW5nIGVycm9ycyBpZiB3ZSBTSE9VTEQgdHJ1c3QgdGhlIGh0bWwuCiAgICAgICAgaWYgKCEkZm9yY2VUYWdzQ2xvc2VkKSB7CiAgICAgICAgICAgICR0aGlzLT5vcHRpb25hbF9jbG9zaW5nX2FycmF5PWFycmF5KCk7CiAgICAgICAgfQogICAgICAgICR0aGlzLT5fdGFyZ2V0X2NoYXJzZXQgPSAkdGFyZ2V0X2NoYXJzZXQ7CiAgICB9CgogICAgZnVuY3Rpb24gX19kZXN0cnVjdCgpCiAgICB7CiAgICAgICAgJHRoaXMtPmNsZWFyKCk7CiAgICB9CgogICAgLy8gbG9hZCBodG1sIGZyb20gc3RyaW5nCiAgICBmdW5jdGlvbiBsb2FkKCRzdHIsICRsb3dlcmNhc2U9dHJ1ZSwgJHN0cmlwUk49dHJ1ZSwgJGRlZmF1bHRCUlRleHQ9REVGQVVMVF9CUl9URVhULCAkZGVmYXVsdFNwYW5UZXh0PURFRkFVTFRfU1BBTl9URVhUKQogICAgewogICAgICAgIGdsb2JhbCAkZGVidWdPYmplY3Q7CgogICAgICAgIC8vIHByZXBhcmUKICAgICAgICAkdGhpcy0+cHJlcGFyZSgkc3RyLCAkbG93ZXJjYXNlLCAkc3RyaXBSTiwgJGRlZmF1bHRCUlRleHQsICRkZWZhdWx0U3BhblRleHQpOwogICAgICAgIC8vIHN0cmlwIG91dCBjb21tZW50cwogICAgICAgICR0aGlzLT5yZW1vdmVfbm9pc2UoIic8IS0tKC4qPyktLT4naXMiKTsKICAgICAgICAvLyBzdHJpcCBvdXQgY2RhdGEKICAgICAgICAkdGhpcy0+cmVtb3ZlX25vaXNlKCInPCFcW0NEQVRBXFsoLio/KVxdXF0+J2lzIiwgdHJ1ZSk7CiAgICAgICAgLy8gUGVyIHNvdXJjZWZvcmdlIGh0dHA6Ly9zb3VyY2Vmb3JnZS5uZXQvdHJhY2tlci8/ZnVuYz1kZXRhaWwmYWlkPTI5NDkwOTcmZ3JvdXBfaWQ9MjE4NTU5JmF0aWQ9MTA0NDAzNwogICAgICAgIC8vIFNjcmlwdCB0YWdzIHJlbW92YWwgbm93IHByZWNlZWRzIHN0eWxlIHRhZyByZW1vdmFsLgogICAgICAgIC8vIHN0cmlwIG91dCA8c2NyaXB0PiB0YWdzCiAgICAgICAgJHRoaXMtPnJlbW92ZV9ub2lzZSgiJzxccypzY3JpcHRbXj5dKlteL10+KC4qPyk8XHMqL1xzKnNjcmlwdFxzKj4naXMiKTsKICAgICAgICAkdGhpcy0+cmVtb3ZlX25vaXNlKCInPFxzKnNjcmlwdFxzKj4oLio/KTxccyovXHMqc2NyaXB0XHMqPidpcyIpOwogICAgICAgIC8vIHN0cmlwIG91dCA8c3R5bGU+IHRhZ3MKICAgICAgICAkdGhpcy0+cmVtb3ZlX25vaXNlKCInPFxzKnN0eWxlW14+XSpbXi9dPiguKj8pPFxzKi9ccypzdHlsZVxzKj4naXMiKTsKICAgICAgICAkdGhpcy0+cmVtb3ZlX25vaXNlKCInPFxzKnN0eWxlXHMqPiguKj8pPFxzKi9ccypzdHlsZVxzKj4naXMiKTsKICAgICAgICAvLyBzdHJpcCBvdXQgcHJlZm9ybWF0dGVkIHRhZ3MKICAgICAgICAkdGhpcy0+cmVtb3ZlX25vaXNlKCInPFxzKig/OmNvZGUpW14+XSo+KC4qPyk8XHMqL1xzKig/OmNvZGUpXHMqPidpcyIpOwogICAgICAgIC8vIHN0cmlwIG91dCBzZXJ2ZXIgc2lkZSBzY3JpcHRzCiAgICAgICAgJHRoaXMtPnJlbW92ZV9ub2lzZSgiJyg8XD8pKC4qPykoXD8+KSdzIiwgdHJ1ZSk7CiAgICAgICAgLy8gc3RyaXAgc21hcnR5IHNjcmlwdHMKICAgICAgICAkdGhpcy0+cmVtb3ZlX25vaXNlKCInKFx7XHcpKC4qPykoXH0pJ3MiLCB0cnVlKTsKCiAgICAgICAgLy8gcGFyc2luZwogICAgICAgIHdoaWxlICgkdGhpcy0+cGFyc2UoKSk7CiAgICAgICAgLy8gZW5kCiAgICAgICAgJHRoaXMtPnJvb3QtPl9bSERPTV9JTkZPX0VORF0gPSAkdGhpcy0+Y3Vyc29yOwogICAgICAgICR0aGlzLT5wYXJzZV9jaGFyc2V0KCk7CgogICAgICAgIC8vIG1ha2UgbG9hZCBmdW5jdGlvbiBjaGFpbmFibGUKICAgICAgICByZXR1cm4gJHRoaXM7CgogICAgfQoKICAgIC8vIGxvYWQgaHRtbCBmcm9tIGZpbGUKICAgIGZ1bmN0aW9uIGxvYWRfZmlsZSgpCiAgICB7CiAgICAgICAgJGFyZ3MgPSBmdW5jX2dldF9hcmdzKCk7CiAgICAgICAgJHRoaXMtPmxvYWQoY2FsbF91c2VyX2Z1bmNfYXJyYXkoJ2ZpbGVfZ2V0X2NvbnRlbnRzJywgJGFyZ3MpLCB0cnVlKTsKICAgICAgICAvLyBUaHJvdyBhbiBlcnJvciBpZiB3ZSBjYW4ndCBwcm9wZXJseSBsb2FkIHRoZSBkb20uCiAgICAgICAgaWYgKCgkZXJyb3I9ZXJyb3JfZ2V0X2xhc3QoKSkhPT1udWxsKSB7CiAgICAgICAgICAgICR0aGlzLT5jbGVhcigpOwogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgfQoKICAgIC8vIHNldCBjYWxsYmFjayBmdW5jdGlvbgogICAgZnVuY3Rpb24gc2V0X2NhbGxiYWNrKCRmdW5jdGlvbl9uYW1lKQogICAgewogICAgICAgICR0aGlzLT5jYWxsYmFjayA9ICRmdW5jdGlvbl9uYW1lOwogICAgfQoKICAgIC8vIHJlbW92ZSBjYWxsYmFjayBmdW5jdGlvbgogICAgZnVuY3Rpb24gcmVtb3ZlX2NhbGxiYWNrKCkKICAgIHsKICAgICAgICAkdGhpcy0+Y2FsbGJhY2sgPSBudWxsOwogICAgfQoKICAgIC8vIHNhdmUgZG9tIGFzIHN0cmluZwogICAgZnVuY3Rpb24gc2F2ZSgkZmlsZXBhdGg9JycpCiAgICB7CiAgICAgICAgJHJldCA9ICR0aGlzLT5yb290LT5pbm5lcnRleHQoKTsKICAgICAgICBpZiAoJGZpbGVwYXRoIT09JycpIGZpbGVfcHV0X2NvbnRlbnRzKCRmaWxlcGF0aCwgJHJldCwgTE9DS19FWCk7CiAgICAgICAgcmV0dXJuICRyZXQ7CiAgICB9CgogICAgLy8gZmluZCBkb20gbm9kZSBieSBjc3Mgc2VsZWN0b3IKICAgIC8vIFBhcGVyZyAtIGFsbG93IHVzIHRvIHNwZWNpZnkgdGhhdCB3ZSB3YW50IGNhc2UgaW5zZW5zaXRpdmUgdGVzdGluZyBvZiB0aGUgdmFsdWUgb2YgdGhlIHNlbGVjdG9yLgogICAgZnVuY3Rpb24gZmluZCgkc2VsZWN0b3IsICRpZHg9bnVsbCwgJGxvd2VyY2FzZT1mYWxzZSkKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPnJvb3QtPmZpbmQoJHNlbGVjdG9yLCAkaWR4LCAkbG93ZXJjYXNlKTsKICAgIH0KCiAgICAvLyBjbGVhbiB1cCBtZW1vcnkgZHVlIHRvIHBocDUgY2lyY3VsYXIgcmVmZXJlbmNlcyBtZW1vcnkgbGVhay4uLgogICAgZnVuY3Rpb24gY2xlYXIoKQogICAgewogICAgICAgIGZvcmVhY2ggKCR0aGlzLT5ub2RlcyBhcyAkbikgeyRuLT5jbGVhcigpOyAkbiA9IG51bGw7fQogICAgICAgIC8vIFRoaXMgYWRkIG5leHQgbGluZSBpcyBkb2N1bWVudGVkIGluIHRoZSBzb3VyY2Vmb3JnZSByZXBvc2l0b3J5LiAyOTc3MjQ4IGFzIGEgZml4IGZvciBvbmdvaW5nIG1lbW9yeSBsZWFrcyB0aGF0IG9jY3VyIGV2ZW4gd2l0aCB0aGUgdXNlIG9mIGNsZWFyLgogICAgICAgIGlmIChpc3NldCgkdGhpcy0+Y2hpbGRyZW4pKSBmb3JlYWNoICgkdGhpcy0+Y2hpbGRyZW4gYXMgJG4pIHskbi0+Y2xlYXIoKTsgJG4gPSBudWxsO30KICAgICAgICBpZiAoaXNzZXQoJHRoaXMtPnBhcmVudCkpIHskdGhpcy0+cGFyZW50LT5jbGVhcigpOyB1bnNldCgkdGhpcy0+cGFyZW50KTt9CiAgICAgICAgaWYgKGlzc2V0KCR0aGlzLT5yb290KSkgeyR0aGlzLT5yb290LT5jbGVhcigpOyB1bnNldCgkdGhpcy0+cm9vdCk7fQogICAgICAgIHVuc2V0KCR0aGlzLT5kb2MpOwogICAgICAgIHVuc2V0KCR0aGlzLT5ub2lzZSk7CiAgICB9CgogICAgZnVuY3Rpb24gZHVtcCgkc2hvd19hdHRyPXRydWUpCiAgICB7CiAgICAgICAgJHRoaXMtPnJvb3QtPmR1bXAoJHNob3dfYXR0cik7CiAgICB9CgogICAgLy8gcHJlcGFyZSBIVE1MIGRhdGEgYW5kIGluaXQgZXZlcnl0aGluZwogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIHByZXBhcmUoJHN0ciwgJGxvd2VyY2FzZT10cnVlLCAkc3RyaXBSTj10cnVlLCAkZGVmYXVsdEJSVGV4dD1ERUZBVUxUX0JSX1RFWFQsICRkZWZhdWx0U3BhblRleHQ9REVGQVVMVF9TUEFOX1RFWFQpCiAgICB7CiAgICAgICAgJHRoaXMtPmNsZWFyKCk7CgogICAgICAgIC8vIHNldCB0aGUgbGVuZ3RoIG9mIGNvbnRlbnQgYmVmb3JlIHdlIGRvIGFueXRoaW5nIHRvIGl0LgogICAgICAgICR0aGlzLT5zaXplID0gc3RybGVuKCRzdHIpOwogICAgICAgIC8vIFNhdmUgdGhlIG9yaWdpbmFsIHNpemUgb2YgdGhlIGh0bWwgdGhhdCB3ZSBnb3QgaW4uICBJdCBtaWdodCBiZSB1c2VmdWwgdG8gc29tZW9uZS4KICAgICAgICAkdGhpcy0+b3JpZ2luYWxfc2l6ZSA9ICR0aGlzLT5zaXplOwoKICAgICAgICAvL2JlZm9yZSB3ZSBzYXZlIHRoZSBzdHJpbmcgYXMgdGhlIGRvYy4uLiAgc3RyaXAgb3V0IHRoZSBcciBcbidzIGlmIHdlIGFyZSB0b2xkIHRvLgogICAgICAgIGlmICgkc3RyaXBSTikgewogICAgICAgICAgICAkc3RyID0gc3RyX3JlcGxhY2UoIlxyIiwgIiAiLCAkc3RyKTsKICAgICAgICAgICAgJHN0ciA9IHN0cl9yZXBsYWNlKCJcbiIsICIgIiwgJHN0cik7CgogICAgICAgICAgICAvLyBzZXQgdGhlIGxlbmd0aCBvZiBjb250ZW50IHNpbmNlIHdlIGhhdmUgY2hhbmdlZCBpdC4KICAgICAgICAgICAgJHRoaXMtPnNpemUgPSBzdHJsZW4oJHN0cik7CiAgICAgICAgfQoKICAgICAgICAkdGhpcy0+ZG9jID0gJHN0cjsKICAgICAgICAkdGhpcy0+cG9zID0gMDsKICAgICAgICAkdGhpcy0+Y3Vyc29yID0gMTsKICAgICAgICAkdGhpcy0+bm9pc2UgPSBhcnJheSgpOwogICAgICAgICR0aGlzLT5ub2RlcyA9IGFycmF5KCk7CiAgICAgICAgJHRoaXMtPmxvd2VyY2FzZSA9ICRsb3dlcmNhc2U7CiAgICAgICAgJHRoaXMtPmRlZmF1bHRfYnJfdGV4dCA9ICRkZWZhdWx0QlJUZXh0OwogICAgICAgICR0aGlzLT5kZWZhdWx0X3NwYW5fdGV4dCA9ICRkZWZhdWx0U3BhblRleHQ7CiAgICAgICAgJHRoaXMtPnJvb3QgPSBuZXcgc2ltcGxlX2h0bWxfZG9tX25vZGUoJHRoaXMpOwogICAgICAgICR0aGlzLT5yb290LT50YWcgPSAncm9vdCc7CiAgICAgICAgJHRoaXMtPnJvb3QtPl9bSERPTV9JTkZPX0JFR0lOXSA9IC0xOwogICAgICAgICR0aGlzLT5yb290LT5ub2RldHlwZSA9IEhET01fVFlQRV9ST09UOwogICAgICAgICR0aGlzLT5wYXJlbnQgPSAkdGhpcy0+cm9vdDsKICAgICAgICBpZiAoJHRoaXMtPnNpemU+MCkgJHRoaXMtPmNoYXIgPSAkdGhpcy0+ZG9jWzBdOwogICAgfQoKICAgIC8vIHBhcnNlIGh0bWwgY29udGVudAogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIHBhcnNlKCkKICAgIHsKICAgICAgICBpZiAoKCRzID0gJHRoaXMtPmNvcHlfdW50aWxfY2hhcignPCcpKT09PScnKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuICR0aGlzLT5yZWFkX3RhZygpOwogICAgICAgIH0KCiAgICAgICAgLy8gdGV4dAogICAgICAgICRub2RlID0gbmV3IHNpbXBsZV9odG1sX2RvbV9ub2RlKCR0aGlzKTsKICAgICAgICArKyR0aGlzLT5jdXJzb3I7CiAgICAgICAgJG5vZGUtPl9bSERPTV9JTkZPX1RFWFRdID0gJHM7CiAgICAgICAgJHRoaXMtPmxpbmtfbm9kZXMoJG5vZGUsIGZhbHNlKTsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KCiAgICAvLyBQQVBFUkcgLSBka2Nob3UgLSBhZGRlZCB0aGlzIHRvIHRyeSB0byBpZGVudGlmeSB0aGUgY2hhcmFjdGVyIHNldCBvZiB0aGUgcGFnZSB3ZSBoYXZlIGp1c3QgcGFyc2VkIHNvIHdlIGtub3cgYmV0dGVyIGhvdyB0byBzcGl0IGl0IG91dCBsYXRlci4KICAgIC8vIE5PVEU6ICBJRiB5b3UgcHJvdmlkZSBhIHJvdXRpbmUgY2FsbGVkIGdldF9sYXN0X3JldHJpZXZlX3VybF9jb250ZW50c19jb250ZW50X3R5cGUgd2hpY2ggcmV0dXJucyB0aGUgQ1VSTElORk9fQ09OVEVOVF9UWVBFIGZyb20gdGhlIGxhc3QgY3VybF9leGVjCiAgICAvLyAob3IgdGhlIGNvbnRlbnRfdHlwZSBoZWFkZXIgZnJvbSB0aGUgbGFzdCB0cmFuc2ZlciksIHdlIHdpbGwgcGFyc2UgVEhBVCwgYW5kIGlmIGEgY2hhcnNldCBpcyBzcGVjaWZpZWQsIHdlIHdpbGwgdXNlIGl0IG92ZXIgYW55IG90aGVyIG1lY2hhbmlzbS4KICAgIHByb3RlY3RlZCBmdW5jdGlvbiBwYXJzZV9jaGFyc2V0KCkKICAgIHsKICAgICAgICBnbG9iYWwgJGRlYnVnT2JqZWN0OwoKICAgICAgICAkY2hhcnNldCA9IG51bGw7CgogICAgICAgIGlmIChmdW5jdGlvbl9leGlzdHMoJ2dldF9sYXN0X3JldHJpZXZlX3VybF9jb250ZW50c19jb250ZW50X3R5cGUnKSkKICAgICAgICB7CiAgICAgICAgICAgICRjb250ZW50VHlwZUhlYWRlciA9IGdldF9sYXN0X3JldHJpZXZlX3VybF9jb250ZW50c19jb250ZW50X3R5cGUoKTsKICAgICAgICAgICAgJHN1Y2Nlc3MgPSBwcmVnX21hdGNoKCcvY2hhcnNldD0oLispLycsICRjb250ZW50VHlwZUhlYWRlciwgJG1hdGNoZXMpOwogICAgICAgICAgICBpZiAoJHN1Y2Nlc3MpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICRjaGFyc2V0ID0gJG1hdGNoZXNbMV07CiAgICAgICAgICAgICAgICBpZiAoaXNfb2JqZWN0KCRkZWJ1Z09iamVjdCkpIHskZGVidWdPYmplY3QtPmRlYnVnTG9nKDIsICdoZWFkZXIgY29udGVudC10eXBlIGZvdW5kIGNoYXJzZXQgb2Y6ICcgLiAkY2hhcnNldCk7fQogICAgICAgICAgICB9CgogICAgICAgIH0KCiAgICAgICAgaWYgKGVtcHR5KCRjaGFyc2V0KSkKICAgICAgICB7CiAgICAgICAgICAgICRlbCA9ICR0aGlzLT5yb290LT5maW5kKCdtZXRhW2h0dHAtZXF1aXY9Q29udGVudC1UeXBlXScsMCk7CiAgICAgICAgICAgIGlmICghZW1wdHkoJGVsKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJGZ1bGx2YWx1ZSA9ICRlbC0+Y29udGVudDsKICAgICAgICAgICAgICAgIGlmIChpc19vYmplY3QoJGRlYnVnT2JqZWN0KSkgeyRkZWJ1Z09iamVjdC0+ZGVidWdMb2coMiwgJ21ldGEgY29udGVudC10eXBlIHRhZyBmb3VuZCcgLiAkZnVsbHZhbHVlKTt9CgogICAgICAgICAgICAgICAgaWYgKCFlbXB0eSgkZnVsbHZhbHVlKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAkc3VjY2VzcyA9IHByZWdfbWF0Y2goJy9jaGFyc2V0PSguKykvJywgJGZ1bGx2YWx1ZSwgJG1hdGNoZXMpOwogICAgICAgICAgICAgICAgICAgIGlmICgkc3VjY2VzcykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICRjaGFyc2V0ID0gJG1hdGNoZXNbMV07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZXJlIGlzIGEgbWV0YSB0YWcsIGFuZCB0aGV5IGRvbid0IHNwZWNpZnkgdGhlIGNoYXJhY3RlciBzZXQsIHJlc2VhcmNoIHNheXMgdGhhdCBpdCdzIHR5cGljYWxseSBJU08tODg1OS0xCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc19vYmplY3QoJGRlYnVnT2JqZWN0KSkgeyRkZWJ1Z09iamVjdC0+ZGVidWdMb2coMiwgJ21ldGEgY29udGVudC10eXBlIHRhZyBjb3VsZG5cJ3QgYmUgcGFyc2VkLiB1c2luZyBpc28tODg1OSBkZWZhdWx0LicpO30KICAgICAgICAgICAgICAgICAgICAgICAgJGNoYXJzZXQgPSAnSVNPLTg4NTktMSc7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvLyBJZiB3ZSBjb3VsZG4ndCBmaW5kIGEgY2hhcnNldCBhYm92ZSwgdGhlbiBsZXRzIHRyeSB0byBkZXRlY3Qgb25lIGJhc2VkIG9uIHRoZSB0ZXh0IHdlIGdvdC4uLgogICAgICAgIGlmIChlbXB0eSgkY2hhcnNldCkpCiAgICAgICAgewogICAgICAgICAgICAvLyBIYXZlIHBocCB0cnkgdG8gZGV0ZWN0IHRoZSBlbmNvZGluZyBmcm9tIHRoZSB0ZXh0IGdpdmVuIHRvIHVzLgogICAgICAgICAgICAkY2hhcnNldCA9IG1iX2RldGVjdF9lbmNvZGluZygkdGhpcy0+cm9vdC0+cGxhaW50ZXh0IC4gImFzY2lpIiwgJGVuY29kaW5nX2xpc3QgPSBhcnJheSggIlVURi04IiwgIkNQMTI1MiIgKSApOwogICAgICAgICAgICBpZiAoaXNfb2JqZWN0KCRkZWJ1Z09iamVjdCkpIHskZGVidWdPYmplY3QtPmRlYnVnTG9nKDIsICdtYl9kZXRlY3QgZm91bmQ6ICcgLiAkY2hhcnNldCk7fQoKICAgICAgICAgICAgLy8gYW5kIGlmIHRoaXMgZG9lc24ndCB3b3JrLi4uICB0aGVuIHdlIG5lZWQgdG8ganVzdCB3cm9uZ2hlYWRlZGx5IGFzc3VtZSBpdCdzIFVURi04IHNvIHRoYXQgd2UgY2FuIG1vdmUgb24gLSBjYXVzZSB0aGlzIHdpbGwgdXN1YWxseSBnaXZlIHVzIG1vc3Qgb2Ygd2hhdCB3ZSBuZWVkLi4uCiAgICAgICAgICAgIGlmICgkY2hhcnNldCA9PT0gZmFsc2UpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmIChpc19vYmplY3QoJGRlYnVnT2JqZWN0KSkgeyRkZWJ1Z09iamVjdC0+ZGVidWdMb2coMiwgJ3NpbmNlIG1iX2RldGVjdCBmYWlsZWQgLSB1c2luZyBkZWZhdWx0IG9mIHV0Zi04Jyk7fQogICAgICAgICAgICAgICAgJGNoYXJzZXQgPSAnVVRGLTgnOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvLyBTaW5jZSBDUDEyNTIgaXMgYSBzdXBlcnNldCwgaWYgd2UgZ2V0IG9uZSBvZiBpdCdzIHN1YnNldHMsIHdlIHdhbnQgaXQgaW5zdGVhZC4KICAgICAgICBpZiAoKHN0cnRvbG93ZXIoJGNoYXJzZXQpID09IHN0cnRvbG93ZXIoJ0lTTy04ODU5LTEnKSkgfHwgKHN0cnRvbG93ZXIoJGNoYXJzZXQpID09IHN0cnRvbG93ZXIoJ0xhdGluMScpKSB8fCAoc3RydG9sb3dlcigkY2hhcnNldCkgPT0gc3RydG9sb3dlcignTGF0aW4tMScpKSkKICAgICAgICB7CiAgICAgICAgICAgIGlmIChpc19vYmplY3QoJGRlYnVnT2JqZWN0KSkgeyRkZWJ1Z09iamVjdC0+ZGVidWdMb2coMiwgJ3JlcGxhY2luZyAnIC4gJGNoYXJzZXQgLiAnIHdpdGggQ1AxMjUyIGFzIGl0cyBhIHN1cGVyc2V0Jyk7fQogICAgICAgICAgICAkY2hhcnNldCA9ICdDUDEyNTInOwogICAgICAgIH0KCiAgICAgICAgaWYgKGlzX29iamVjdCgkZGVidWdPYmplY3QpKSB7JGRlYnVnT2JqZWN0LT5kZWJ1Z0xvZygxLCAnRVhJVCAtICcgLiAkY2hhcnNldCk7fQoKICAgICAgICByZXR1cm4gJHRoaXMtPl9jaGFyc2V0ID0gJGNoYXJzZXQ7CiAgICB9CgogICAgLy8gcmVhZCB0YWcgaW5mbwogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIHJlYWRfdGFnKCkKICAgIHsKICAgICAgICBpZiAoJHRoaXMtPmNoYXIhPT0nPCcpCiAgICAgICAgewogICAgICAgICAgICAkdGhpcy0+cm9vdC0+X1tIRE9NX0lORk9fRU5EXSA9ICR0aGlzLT5jdXJzb3I7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICAgICAgJGJlZ2luX3RhZ19wb3MgPSAkdGhpcy0+cG9zOwogICAgICAgICR0aGlzLT5jaGFyID0gKCsrJHRoaXMtPnBvczwkdGhpcy0+c2l6ZSkgPyAkdGhpcy0+ZG9jWyR0aGlzLT5wb3NdIDogbnVsbDsgLy8gbmV4dAoKICAgICAgICAvLyBlbmQgdGFnCiAgICAgICAgaWYgKCR0aGlzLT5jaGFyPT09Jy8nKQogICAgICAgIHsKICAgICAgICAgICAgJHRoaXMtPmNoYXIgPSAoKyskdGhpcy0+cG9zPCR0aGlzLT5zaXplKSA/ICR0aGlzLT5kb2NbJHRoaXMtPnBvc10gOiBudWxsOyAvLyBuZXh0CiAgICAgICAgICAgIC8vIFRoaXMgcmVwcmVzZW50cyB0aGUgY2hhbmdlIGluIHRoZSBzaW1wbGVfaHRtbF9kb20gdHJ1bmsgZnJvbSByZXZpc2lvbiAxODAgdG8gMTgxLgogICAgICAgICAgICAvLyAkdGhpcy0+c2tpcCgkdGhpcy0+dG9rZW5fYmxhbmtfdCk7CiAgICAgICAgICAgICR0aGlzLT5za2lwKCR0aGlzLT50b2tlbl9ibGFuayk7CiAgICAgICAgICAgICR0YWcgPSAkdGhpcy0+Y29weV91bnRpbF9jaGFyKCc+Jyk7CgogICAgICAgICAgICAvLyBza2lwIGF0dHJpYnV0ZXMgaW4gZW5kIHRhZwogICAgICAgICAgICBpZiAoKCRwb3MgPSBzdHJwb3MoJHRhZywgJyAnKSkhPT1mYWxzZSkKICAgICAgICAgICAgICAgICR0YWcgPSBzdWJzdHIoJHRhZywgMCwgJHBvcyk7CgogICAgICAgICAgICAkcGFyZW50X2xvd2VyID0gc3RydG9sb3dlcigkdGhpcy0+cGFyZW50LT50YWcpOwogICAgICAgICAgICAkdGFnX2xvd2VyID0gc3RydG9sb3dlcigkdGFnKTsKCiAgICAgICAgICAgIGlmICgkcGFyZW50X2xvd2VyIT09JHRhZ19sb3dlcikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKGlzc2V0KCR0aGlzLT5vcHRpb25hbF9jbG9zaW5nX3RhZ3NbJHBhcmVudF9sb3dlcl0pICYmIGlzc2V0KCR0aGlzLT5ibG9ja190YWdzWyR0YWdfbG93ZXJdKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAkdGhpcy0+cGFyZW50LT5fW0hET01fSU5GT19FTkRdID0gMDsKICAgICAgICAgICAgICAgICAgICAkb3JnX3BhcmVudCA9ICR0aGlzLT5wYXJlbnQ7CgogICAgICAgICAgICAgICAgICAgIHdoaWxlICgoJHRoaXMtPnBhcmVudC0+cGFyZW50KSAmJiBzdHJ0b2xvd2VyKCR0aGlzLT5wYXJlbnQtPnRhZykhPT0kdGFnX2xvd2VyKQogICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+cGFyZW50ID0gJHRoaXMtPnBhcmVudC0+cGFyZW50OwoKICAgICAgICAgICAgICAgICAgICBpZiAoc3RydG9sb3dlcigkdGhpcy0+cGFyZW50LT50YWcpIT09JHRhZ19sb3dlcikgewogICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+cGFyZW50ID0gJG9yZ19wYXJlbnQ7IC8vIHJlc3RvcmUgb3JpZ29uYWwgcGFyZW50CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkdGhpcy0+cGFyZW50LT5wYXJlbnQpICR0aGlzLT5wYXJlbnQgPSAkdGhpcy0+cGFyZW50LT5wYXJlbnQ7CiAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5wYXJlbnQtPl9bSERPTV9JTkZPX0VORF0gPSAkdGhpcy0+Y3Vyc29yOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJHRoaXMtPmFzX3RleHRfbm9kZSgkdGFnKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmICgoJHRoaXMtPnBhcmVudC0+cGFyZW50KSAmJiBpc3NldCgkdGhpcy0+YmxvY2tfdGFnc1skdGFnX2xvd2VyXSkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPnBhcmVudC0+X1tIRE9NX0lORk9fRU5EXSA9IDA7CiAgICAgICAgICAgICAgICAgICAgJG9yZ19wYXJlbnQgPSAkdGhpcy0+cGFyZW50OwoKICAgICAgICAgICAgICAgICAgICB3aGlsZSAoKCR0aGlzLT5wYXJlbnQtPnBhcmVudCkgJiYgc3RydG9sb3dlcigkdGhpcy0+cGFyZW50LT50YWcpIT09JHRhZ19sb3dlcikKICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPnBhcmVudCA9ICR0aGlzLT5wYXJlbnQtPnBhcmVudDsKCiAgICAgICAgICAgICAgICAgICAgaWYgKHN0cnRvbG93ZXIoJHRoaXMtPnBhcmVudC0+dGFnKSE9PSR0YWdfbG93ZXIpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+cGFyZW50ID0gJG9yZ19wYXJlbnQ7IC8vIHJlc3RvcmUgb3JpZ29uYWwgcGFyZW50CiAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5wYXJlbnQtPl9bSERPTV9JTkZPX0VORF0gPSAkdGhpcy0+Y3Vyc29yOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJHRoaXMtPmFzX3RleHRfbm9kZSgkdGFnKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmICgoJHRoaXMtPnBhcmVudC0+cGFyZW50KSAmJiBzdHJ0b2xvd2VyKCR0aGlzLT5wYXJlbnQtPnBhcmVudC0+dGFnKT09PSR0YWdfbG93ZXIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPnBhcmVudC0+X1tIRE9NX0lORk9fRU5EXSA9IDA7CiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPnBhcmVudCA9ICR0aGlzLT5wYXJlbnQtPnBhcmVudDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJHRoaXMtPmFzX3RleHRfbm9kZSgkdGFnKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJHRoaXMtPnBhcmVudC0+X1tIRE9NX0lORk9fRU5EXSA9ICR0aGlzLT5jdXJzb3I7CiAgICAgICAgICAgIGlmICgkdGhpcy0+cGFyZW50LT5wYXJlbnQpICR0aGlzLT5wYXJlbnQgPSAkdGhpcy0+cGFyZW50LT5wYXJlbnQ7CgogICAgICAgICAgICAkdGhpcy0+Y2hhciA9ICgrKyR0aGlzLT5wb3M8JHRoaXMtPnNpemUpID8gJHRoaXMtPmRvY1skdGhpcy0+cG9zXSA6IG51bGw7IC8vIG5leHQKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfQoKICAgICAgICAkbm9kZSA9IG5ldyBzaW1wbGVfaHRtbF9kb21fbm9kZSgkdGhpcyk7CiAgICAgICAgJG5vZGUtPl9bSERPTV9JTkZPX0JFR0lOXSA9ICR0aGlzLT5jdXJzb3I7CiAgICAgICAgKyskdGhpcy0+Y3Vyc29yOwogICAgICAgICR0YWcgPSAkdGhpcy0+Y29weV91bnRpbCgkdGhpcy0+dG9rZW5fc2xhc2gpOwogICAgICAgICRub2RlLT50YWdfc3RhcnQgPSAkYmVnaW5fdGFnX3BvczsKCiAgICAgICAgLy8gZG9jdHlwZSwgY2RhdGEgJiBjb21tZW50cy4uLgogICAgICAgIGlmIChpc3NldCgkdGFnWzBdKSAmJiAkdGFnWzBdPT09JyEnKSB7CiAgICAgICAgICAgICRub2RlLT5fW0hET01fSU5GT19URVhUXSA9ICc8JyAuICR0YWcgLiAkdGhpcy0+Y29weV91bnRpbF9jaGFyKCc+Jyk7CgogICAgICAgICAgICBpZiAoaXNzZXQoJHRhZ1syXSkgJiYgJHRhZ1sxXT09PSctJyAmJiAkdGFnWzJdPT09Jy0nKSB7CiAgICAgICAgICAgICAgICAkbm9kZS0+bm9kZXR5cGUgPSBIRE9NX1RZUEVfQ09NTUVOVDsKICAgICAgICAgICAgICAgICRub2RlLT50YWcgPSAnY29tbWVudCc7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAkbm9kZS0+bm9kZXR5cGUgPSBIRE9NX1RZUEVfVU5LTk9XTjsKICAgICAgICAgICAgICAgICRub2RlLT50YWcgPSAndW5rbm93bic7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCR0aGlzLT5jaGFyPT09Jz4nKSAkbm9kZS0+X1tIRE9NX0lORk9fVEVYVF0uPSc+JzsKICAgICAgICAgICAgJHRoaXMtPmxpbmtfbm9kZXMoJG5vZGUsIHRydWUpOwogICAgICAgICAgICAkdGhpcy0+Y2hhciA9ICgrKyR0aGlzLT5wb3M8JHRoaXMtPnNpemUpID8gJHRoaXMtPmRvY1skdGhpcy0+cG9zXSA6IG51bGw7IC8vIG5leHQKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfQoKICAgICAgICAvLyB0ZXh0CiAgICAgICAgaWYgKCRwb3M9c3RycG9zKCR0YWcsICc8JykhPT1mYWxzZSkgewogICAgICAgICAgICAkdGFnID0gJzwnIC4gc3Vic3RyKCR0YWcsIDAsIC0xKTsKICAgICAgICAgICAgJG5vZGUtPl9bSERPTV9JTkZPX1RFWFRdID0gJHRhZzsKICAgICAgICAgICAgJHRoaXMtPmxpbmtfbm9kZXMoJG5vZGUsIGZhbHNlKTsKICAgICAgICAgICAgJHRoaXMtPmNoYXIgPSAkdGhpcy0+ZG9jWy0tJHRoaXMtPnBvc107IC8vIHByZXYKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfQoKICAgICAgICBpZiAoIXByZWdfbWF0Y2goIi9eW1x3XC06XSskLyIsICR0YWcpKSB7CiAgICAgICAgICAgICRub2RlLT5fW0hET01fSU5GT19URVhUXSA9ICc8JyAuICR0YWcgLiAkdGhpcy0+Y29weV91bnRpbCgnPD4nKTsKICAgICAgICAgICAgaWYgKCR0aGlzLT5jaGFyPT09JzwnKSB7CiAgICAgICAgICAgICAgICAkdGhpcy0+bGlua19ub2Rlcygkbm9kZSwgZmFsc2UpOwogICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICgkdGhpcy0+Y2hhcj09PSc+JykgJG5vZGUtPl9bSERPTV9JTkZPX1RFWFRdLj0nPic7CiAgICAgICAgICAgICR0aGlzLT5saW5rX25vZGVzKCRub2RlLCBmYWxzZSk7CiAgICAgICAgICAgICR0aGlzLT5jaGFyID0gKCsrJHRoaXMtPnBvczwkdGhpcy0+c2l6ZSkgPyAkdGhpcy0+ZG9jWyR0aGlzLT5wb3NdIDogbnVsbDsgLy8gbmV4dAogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CgogICAgICAgIC8vIGJlZ2luIHRhZwogICAgICAgICRub2RlLT5ub2RldHlwZSA9IEhET01fVFlQRV9FTEVNRU5UOwogICAgICAgICR0YWdfbG93ZXIgPSBzdHJ0b2xvd2VyKCR0YWcpOwogICAgICAgICRub2RlLT50YWcgPSAoJHRoaXMtPmxvd2VyY2FzZSkgPyAkdGFnX2xvd2VyIDogJHRhZzsKCiAgICAgICAgLy8gaGFuZGxlIG9wdGlvbmFsIGNsb3NpbmcgdGFncwogICAgICAgIGlmIChpc3NldCgkdGhpcy0+b3B0aW9uYWxfY2xvc2luZ190YWdzWyR0YWdfbG93ZXJdKSApCiAgICAgICAgewogICAgICAgICAgICB3aGlsZSAoaXNzZXQoJHRoaXMtPm9wdGlvbmFsX2Nsb3NpbmdfdGFnc1skdGFnX2xvd2VyXVtzdHJ0b2xvd2VyKCR0aGlzLT5wYXJlbnQtPnRhZyldKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJHRoaXMtPnBhcmVudC0+X1tIRE9NX0lORk9fRU5EXSA9IDA7CiAgICAgICAgICAgICAgICAkdGhpcy0+cGFyZW50ID0gJHRoaXMtPnBhcmVudC0+cGFyZW50OwogICAgICAgICAgICB9CiAgICAgICAgICAgICRub2RlLT5wYXJlbnQgPSAkdGhpcy0+cGFyZW50OwogICAgICAgIH0KCiAgICAgICAgJGd1YXJkID0gMDsgLy8gcHJldmVudCBpbmZpbml0eSBsb29wCiAgICAgICAgJHNwYWNlID0gYXJyYXkoJHRoaXMtPmNvcHlfc2tpcCgkdGhpcy0+dG9rZW5fYmxhbmspLCAnJywgJycpOwoKICAgICAgICAvLyBhdHRyaWJ1dGVzCiAgICAgICAgZG8KICAgICAgICB7CiAgICAgICAgICAgIGlmICgkdGhpcy0+Y2hhciE9PW51bGwgJiYgJHNwYWNlWzBdPT09JycpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICAgICRuYW1lID0gJHRoaXMtPmNvcHlfdW50aWwoJHRoaXMtPnRva2VuX2VxdWFsKTsKICAgICAgICAgICAgaWYgKCRndWFyZD09PSR0aGlzLT5wb3MpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICR0aGlzLT5jaGFyID0gKCsrJHRoaXMtPnBvczwkdGhpcy0+c2l6ZSkgPyAkdGhpcy0+ZG9jWyR0aGlzLT5wb3NdIDogbnVsbDsgLy8gbmV4dAogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJGd1YXJkID0gJHRoaXMtPnBvczsKCiAgICAgICAgICAgIC8vIGhhbmRsZSBlbmRsZXNzICc8JwogICAgICAgICAgICBpZiAoJHRoaXMtPnBvcz49JHRoaXMtPnNpemUtMSAmJiAkdGhpcy0+Y2hhciE9PSc+JykgewogICAgICAgICAgICAgICAgJG5vZGUtPm5vZGV0eXBlID0gSERPTV9UWVBFX1RFWFQ7CiAgICAgICAgICAgICAgICAkbm9kZS0+X1tIRE9NX0lORk9fRU5EXSA9IDA7CiAgICAgICAgICAgICAgICAkbm9kZS0+X1tIRE9NX0lORk9fVEVYVF0gPSAnPCcuJHRhZyAuICRzcGFjZVswXSAuICRuYW1lOwogICAgICAgICAgICAgICAgJG5vZGUtPnRhZyA9ICd0ZXh0JzsKICAgICAgICAgICAgICAgICR0aGlzLT5saW5rX25vZGVzKCRub2RlLCBmYWxzZSk7CiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gaGFuZGxlIG1pc21hdGNoICc8JwogICAgICAgICAgICBpZiAoJHRoaXMtPmRvY1skdGhpcy0+cG9zLTFdPT0nPCcpIHsKICAgICAgICAgICAgICAgICRub2RlLT5ub2RldHlwZSA9IEhET01fVFlQRV9URVhUOwogICAgICAgICAgICAgICAgJG5vZGUtPnRhZyA9ICd0ZXh0JzsKICAgICAgICAgICAgICAgICRub2RlLT5hdHRyID0gYXJyYXkoKTsKICAgICAgICAgICAgICAgICRub2RlLT5fW0hET01fSU5GT19FTkRdID0gMDsKICAgICAgICAgICAgICAgICRub2RlLT5fW0hET01fSU5GT19URVhUXSA9IHN1YnN0cigkdGhpcy0+ZG9jLCAkYmVnaW5fdGFnX3BvcywgJHRoaXMtPnBvcy0kYmVnaW5fdGFnX3Bvcy0xKTsKICAgICAgICAgICAgICAgICR0aGlzLT5wb3MgLT0gMjsKICAgICAgICAgICAgICAgICR0aGlzLT5jaGFyID0gKCsrJHRoaXMtPnBvczwkdGhpcy0+c2l6ZSkgPyAkdGhpcy0+ZG9jWyR0aGlzLT5wb3NdIDogbnVsbDsgLy8gbmV4dAogICAgICAgICAgICAgICAgJHRoaXMtPmxpbmtfbm9kZXMoJG5vZGUsIGZhbHNlKTsKICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoJG5hbWUhPT0nLycgJiYgJG5hbWUhPT0nJykgewogICAgICAgICAgICAgICAgJHNwYWNlWzFdID0gJHRoaXMtPmNvcHlfc2tpcCgkdGhpcy0+dG9rZW5fYmxhbmspOwogICAgICAgICAgICAgICAgJG5hbWUgPSAkdGhpcy0+cmVzdG9yZV9ub2lzZSgkbmFtZSk7CiAgICAgICAgICAgICAgICBpZiAoJHRoaXMtPmxvd2VyY2FzZSkgJG5hbWUgPSBzdHJ0b2xvd2VyKCRuYW1lKTsKICAgICAgICAgICAgICAgIGlmICgkdGhpcy0+Y2hhcj09PSc9JykgewogICAgICAgICAgICAgICAgICAgICR0aGlzLT5jaGFyID0gKCsrJHRoaXMtPnBvczwkdGhpcy0+c2l6ZSkgPyAkdGhpcy0+ZG9jWyR0aGlzLT5wb3NdIDogbnVsbDsgLy8gbmV4dAogICAgICAgICAgICAgICAgICAgICR0aGlzLT5wYXJzZV9hdHRyKCRub2RlLCAkbmFtZSwgJHNwYWNlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIC8vbm8gdmFsdWUgYXR0cjogbm93cmFwLCBjaGVja2VkIHNlbGVjdGVkLi4uCiAgICAgICAgICAgICAgICAgICAgJG5vZGUtPl9bSERPTV9JTkZPX1FVT1RFXVtdID0gSERPTV9RVU9URV9OTzsKICAgICAgICAgICAgICAgICAgICAkbm9kZS0+YXR0clskbmFtZV0gPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIGlmICgkdGhpcy0+Y2hhciE9Jz4nKSAkdGhpcy0+Y2hhciA9ICR0aGlzLT5kb2NbLS0kdGhpcy0+cG9zXTsgLy8gcHJldgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgJG5vZGUtPl9bSERPTV9JTkZPX1NQQUNFXVtdID0gJHNwYWNlOwogICAgICAgICAgICAgICAgJHNwYWNlID0gYXJyYXkoJHRoaXMtPmNvcHlfc2tpcCgkdGhpcy0+dG9rZW5fYmxhbmspLCAnJywgJycpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0gd2hpbGUgKCR0aGlzLT5jaGFyIT09Jz4nICYmICR0aGlzLT5jaGFyIT09Jy8nKTsKCiAgICAgICAgJHRoaXMtPmxpbmtfbm9kZXMoJG5vZGUsIHRydWUpOwogICAgICAgICRub2RlLT5fW0hET01fSU5GT19FTkRTUEFDRV0gPSAkc3BhY2VbMF07CgogICAgICAgIC8vIGNoZWNrIHNlbGYgY2xvc2luZwogICAgICAgIGlmICgkdGhpcy0+Y29weV91bnRpbF9jaGFyX2VzY2FwZSgnPicpPT09Jy8nKQogICAgICAgIHsKICAgICAgICAgICAgLy8kbm9kZS0+X1tIRE9NX0lORk9fRU5EU1BBQ0VdIC49ICcvJzsKICAgICAgICAgICAgJG5vZGUtPl9bSERPTV9JTkZPX0VORF0gPSAxOyAvLyBEaXNhYmxlIGZ1Y2tpbmcgc2VsZi1jbG9zaW5nCiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgIC8vIHJlc2V0IHBhcmVudAogICAgICAgICAgICBpZiAoIWlzc2V0KCR0aGlzLT5zZWxmX2Nsb3NpbmdfdGFnc1tzdHJ0b2xvd2VyKCRub2RlLT50YWcpXSkpICR0aGlzLT5wYXJlbnQgPSAkbm9kZTsKICAgICAgICB9CiAgICAgICAgJHRoaXMtPmNoYXIgPSAoKyskdGhpcy0+cG9zPCR0aGlzLT5zaXplKSA/ICR0aGlzLT5kb2NbJHRoaXMtPnBvc10gOiBudWxsOyAvLyBuZXh0CgogICAgICAgIC8vIElmIGl0J3MgYSBCUiB0YWcsIHdlIG5lZWQgdG8gc2V0IGl0J3MgdGV4dCB0byB0aGUgZGVmYXVsdCB0ZXh0LgogICAgICAgIC8vIFRoaXMgd2F5IHdoZW4gd2Ugc2VlIGl0IGluIHBsYWludGV4dCwgd2UgY2FuIGdlbmVyYXRlIGZvcm1hdHRpbmcgdGhhdCB0aGUgdXNlciB3YW50cy4KICAgICAgICAvLyBzaW5jZSBhIGJyIHRhZyBuZXZlciBoYXMgc3ViIG5vZGVzLCB0aGlzIHdvcmtzIHdlbGwuCiAgICAgICAgaWYgKCRub2RlLT50YWcgPT0gImJyIikKICAgICAgICB7CiAgICAgICAgICAgICRub2RlLT5fW0hET01fSU5GT19JTk5FUl0gPSAkdGhpcy0+ZGVmYXVsdF9icl90ZXh0OwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIHRydWU7CiAgICB9CgogICAgLy8gcGFyc2UgYXR0cmlidXRlcwogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIHBhcnNlX2F0dHIoJG5vZGUsICRuYW1lLCAmJHNwYWNlKQogICAgewogICAgICAgIC8vIFBlciBzb3VyY2Vmb3JnZTogaHR0cDovL3NvdXJjZWZvcmdlLm5ldC90cmFja2VyLz9mdW5jPWRldGFpbCZhaWQ9MzA2MTQwOCZncm91cF9pZD0yMTg1NTkmYXRpZD0xMDQ0MDM3CiAgICAgICAgLy8gSWYgdGhlIGF0dHJpYnV0ZSBpcyBhbHJlYWR5IGRlZmluZWQgaW5zaWRlIGEgdGFnLCBvbmx5IHBheSBhdGV0bnRpb24gdG8gdGhlIGZpcnN0IG9uZSBhcyBvcHBvc2VkIHRvIHRoZSBsYXN0IG9uZS4KICAgICAgICBpZiAoaXNzZXQoJG5vZGUtPmF0dHJbJG5hbWVdKSkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgICRzcGFjZVsyXSA9ICR0aGlzLT5jb3B5X3NraXAoJHRoaXMtPnRva2VuX2JsYW5rKTsKICAgICAgICBzd2l0Y2ggKCR0aGlzLT5jaGFyKSB7CiAgICAgICAgICAgIGNhc2UgJyInOgogICAgICAgICAgICAgICAgJG5vZGUtPl9bSERPTV9JTkZPX1FVT1RFXVtdID0gSERPTV9RVU9URV9ET1VCTEU7CiAgICAgICAgICAgICAgICAkdGhpcy0+Y2hhciA9ICgrKyR0aGlzLT5wb3M8JHRoaXMtPnNpemUpID8gJHRoaXMtPmRvY1skdGhpcy0+cG9zXSA6IG51bGw7IC8vIG5leHQKICAgICAgICAgICAgICAgICRub2RlLT5hdHRyWyRuYW1lXSA9ICR0aGlzLT5yZXN0b3JlX25vaXNlKCR0aGlzLT5jb3B5X3VudGlsX2NoYXJfZXNjYXBlKCciJykpOwogICAgICAgICAgICAgICAgJHRoaXMtPmNoYXIgPSAoKyskdGhpcy0+cG9zPCR0aGlzLT5zaXplKSA/ICR0aGlzLT5kb2NbJHRoaXMtPnBvc10gOiBudWxsOyAvLyBuZXh0CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAnXCcnOgogICAgICAgICAgICAgICAgJG5vZGUtPl9bSERPTV9JTkZPX1FVT1RFXVtdID0gSERPTV9RVU9URV9TSU5HTEU7CiAgICAgICAgICAgICAgICAkdGhpcy0+Y2hhciA9ICgrKyR0aGlzLT5wb3M8JHRoaXMtPnNpemUpID8gJHRoaXMtPmRvY1skdGhpcy0+cG9zXSA6IG51bGw7IC8vIG5leHQKICAgICAgICAgICAgICAgICRub2RlLT5hdHRyWyRuYW1lXSA9ICR0aGlzLT5yZXN0b3JlX25vaXNlKCR0aGlzLT5jb3B5X3VudGlsX2NoYXJfZXNjYXBlKCdcJycpKTsKICAgICAgICAgICAgICAgICR0aGlzLT5jaGFyID0gKCsrJHRoaXMtPnBvczwkdGhpcy0+c2l6ZSkgPyAkdGhpcy0+ZG9jWyR0aGlzLT5wb3NdIDogbnVsbDsgLy8gbmV4dAogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAkbm9kZS0+X1tIRE9NX0lORk9fUVVPVEVdW10gPSBIRE9NX1FVT1RFX05POwogICAgICAgICAgICAgICAgJG5vZGUtPmF0dHJbJG5hbWVdID0gJHRoaXMtPnJlc3RvcmVfbm9pc2UoJHRoaXMtPmNvcHlfdW50aWwoJHRoaXMtPnRva2VuX2F0dHIpKTsKICAgICAgICB9CiAgICAgICAgLy8gUGFwZXJHOiBBdHRyaWJ1dGVzIHNob3VsZCBub3QgaGF2ZSBcciBvciBcbiBpbiB0aGVtLCB0aGF0IGNvdW50cyBhcyBodG1sIHdoaXRlc3BhY2UuCiAgICAgICAgJG5vZGUtPmF0dHJbJG5hbWVdID0gc3RyX3JlcGxhY2UoIlxyIiwgIiIsICRub2RlLT5hdHRyWyRuYW1lXSk7CiAgICAgICAgJG5vZGUtPmF0dHJbJG5hbWVdID0gc3RyX3JlcGxhY2UoIlxuIiwgIiIsICRub2RlLT5hdHRyWyRuYW1lXSk7CiAgICAgICAgLy8gUGFwZXJHOiBJZiB0aGlzIGlzIGEgImNsYXNzIiBzZWxlY3RvciwgbGV0cyBnZXQgcmlkIG9mIHRoZSBwcmVjZWVkaW5nIGFuZCB0cmFpbGluZyBzcGFjZSBzaW5jZSBzb21lIHBlb3BsZSBsZWF2ZSBpdCBpbiB0aGUgbXVsdGkgY2xhc3MgY2FzZS4KICAgICAgICBpZiAoJG5hbWUgPT0gImNsYXNzIikgewogICAgICAgICAgICAkbm9kZS0+YXR0clskbmFtZV0gPSB0cmltKCRub2RlLT5hdHRyWyRuYW1lXSk7CiAgICAgICAgfQogICAgfQoKICAgIC8vIGxpbmsgbm9kZSdzIHBhcmVudAogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIGxpbmtfbm9kZXMoJiRub2RlLCAkaXNfY2hpbGQpCiAgICB7CiAgICAgICAgJG5vZGUtPnBhcmVudCA9ICR0aGlzLT5wYXJlbnQ7CiAgICAgICAgJHRoaXMtPnBhcmVudC0+bm9kZXNbXSA9ICRub2RlOwogICAgICAgIGlmICgkaXNfY2hpbGQpCiAgICAgICAgewogICAgICAgICAgICAkdGhpcy0+cGFyZW50LT5jaGlsZHJlbltdID0gJG5vZGU7CiAgICAgICAgfQogICAgfQoKICAgIC8vIGFzIGEgdGV4dCBub2RlCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gYXNfdGV4dF9ub2RlKCR0YWcpCiAgICB7CiAgICAgICAgJG5vZGUgPSBuZXcgc2ltcGxlX2h0bWxfZG9tX25vZGUoJHRoaXMpOwogICAgICAgICsrJHRoaXMtPmN1cnNvcjsKICAgICAgICAkbm9kZS0+X1tIRE9NX0lORk9fVEVYVF0gPSAnPC8nIC4gJHRhZyAuICc+JzsKICAgICAgICAkdGhpcy0+bGlua19ub2Rlcygkbm9kZSwgZmFsc2UpOwogICAgICAgICR0aGlzLT5jaGFyID0gKCsrJHRoaXMtPnBvczwkdGhpcy0+c2l6ZSkgPyAkdGhpcy0+ZG9jWyR0aGlzLT5wb3NdIDogbnVsbDsgLy8gbmV4dAogICAgICAgIHJldHVybiB0cnVlOwogICAgfQoKICAgIHByb3RlY3RlZCBmdW5jdGlvbiBza2lwKCRjaGFycykKICAgIHsKICAgICAgICAkdGhpcy0+cG9zICs9IHN0cnNwbigkdGhpcy0+ZG9jLCAkY2hhcnMsICR0aGlzLT5wb3MpOwogICAgICAgICR0aGlzLT5jaGFyID0gKCR0aGlzLT5wb3M8JHRoaXMtPnNpemUpID8gJHRoaXMtPmRvY1skdGhpcy0+cG9zXSA6IG51bGw7IC8vIG5leHQKICAgIH0KCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gY29weV9za2lwKCRjaGFycykKICAgIHsKICAgICAgICAkcG9zID0gJHRoaXMtPnBvczsKICAgICAgICAkbGVuID0gc3Ryc3BuKCR0aGlzLT5kb2MsICRjaGFycywgJHBvcyk7CiAgICAgICAgJHRoaXMtPnBvcyArPSAkbGVuOwogICAgICAgICR0aGlzLT5jaGFyID0gKCR0aGlzLT5wb3M8JHRoaXMtPnNpemUpID8gJHRoaXMtPmRvY1skdGhpcy0+cG9zXSA6IG51bGw7IC8vIG5leHQKICAgICAgICBpZiAoJGxlbj09PTApIHJldHVybiAnJzsKICAgICAgICByZXR1cm4gc3Vic3RyKCR0aGlzLT5kb2MsICRwb3MsICRsZW4pOwogICAgfQoKICAgIHByb3RlY3RlZCBmdW5jdGlvbiBjb3B5X3VudGlsKCRjaGFycykKICAgIHsKICAgICAgICAkcG9zID0gJHRoaXMtPnBvczsKICAgICAgICAkbGVuID0gc3RyY3NwbigkdGhpcy0+ZG9jLCAkY2hhcnMsICRwb3MpOwogICAgICAgICR0aGlzLT5wb3MgKz0gJGxlbjsKICAgICAgICAkdGhpcy0+Y2hhciA9ICgkdGhpcy0+cG9zPCR0aGlzLT5zaXplKSA/ICR0aGlzLT5kb2NbJHRoaXMtPnBvc10gOiBudWxsOyAvLyBuZXh0CiAgICAgICAgcmV0dXJuIHN1YnN0cigkdGhpcy0+ZG9jLCAkcG9zLCAkbGVuKTsKICAgIH0KCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gY29weV91bnRpbF9jaGFyKCRjaGFyKQogICAgewogICAgICAgIGlmICgkdGhpcy0+Y2hhcj09PW51bGwpIHJldHVybiAnJzsKCiAgICAgICAgaWYgKCgkcG9zID0gc3RycG9zKCR0aGlzLT5kb2MsICRjaGFyLCAkdGhpcy0+cG9zKSk9PT1mYWxzZSkgewogICAgICAgICAgICAkcmV0ID0gc3Vic3RyKCR0aGlzLT5kb2MsICR0aGlzLT5wb3MsICR0aGlzLT5zaXplLSR0aGlzLT5wb3MpOwogICAgICAgICAgICAkdGhpcy0+Y2hhciA9IG51bGw7CiAgICAgICAgICAgICR0aGlzLT5wb3MgPSAkdGhpcy0+c2l6ZTsKICAgICAgICAgICAgcmV0dXJuICRyZXQ7CiAgICAgICAgfQoKICAgICAgICBpZiAoJHBvcz09PSR0aGlzLT5wb3MpIHJldHVybiAnJzsKICAgICAgICAkcG9zX29sZCA9ICR0aGlzLT5wb3M7CiAgICAgICAgJHRoaXMtPmNoYXIgPSAkdGhpcy0+ZG9jWyRwb3NdOwogICAgICAgICR0aGlzLT5wb3MgPSAkcG9zOwogICAgICAgIHJldHVybiBzdWJzdHIoJHRoaXMtPmRvYywgJHBvc19vbGQsICRwb3MtJHBvc19vbGQpOwogICAgfQoKICAgIHByb3RlY3RlZCBmdW5jdGlvbiBjb3B5X3VudGlsX2NoYXJfZXNjYXBlKCRjaGFyKQogICAgewogICAgICAgIGlmICgkdGhpcy0+Y2hhcj09PW51bGwpIHJldHVybiAnJzsKCiAgICAgICAgJHN0YXJ0ID0gJHRoaXMtPnBvczsKICAgICAgICB3aGlsZSAoMSkKICAgICAgICB7CiAgICAgICAgICAgIGlmICgoJHBvcyA9IHN0cnBvcygkdGhpcy0+ZG9jLCAkY2hhciwgJHN0YXJ0KSk9PT1mYWxzZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJHJldCA9IHN1YnN0cigkdGhpcy0+ZG9jLCAkdGhpcy0+cG9zLCAkdGhpcy0+c2l6ZS0kdGhpcy0+cG9zKTsKICAgICAgICAgICAgICAgICR0aGlzLT5jaGFyID0gbnVsbDsKICAgICAgICAgICAgICAgICR0aGlzLT5wb3MgPSAkdGhpcy0+c2l6ZTsKICAgICAgICAgICAgICAgIHJldHVybiAkcmV0OwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoJHBvcz09PSR0aGlzLT5wb3MpIHJldHVybiAnJzsKCiAgICAgICAgICAgIGlmICgkdGhpcy0+ZG9jWyRwb3MtMV09PT0nXFwnKSB7CiAgICAgICAgICAgICAgICAkc3RhcnQgPSAkcG9zKzE7CiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJHBvc19vbGQgPSAkdGhpcy0+cG9zOwogICAgICAgICAgICAkdGhpcy0+Y2hhciA9ICR0aGlzLT5kb2NbJHBvc107CiAgICAgICAgICAgICR0aGlzLT5wb3MgPSAkcG9zOwogICAgICAgICAgICByZXR1cm4gc3Vic3RyKCR0aGlzLT5kb2MsICRwb3Nfb2xkLCAkcG9zLSRwb3Nfb2xkKTsKICAgICAgICB9CiAgICB9CgogICAgLy8gcmVtb3ZlIG5vaXNlIGZyb20gaHRtbCBjb250ZW50CiAgICAvLyBzYXZlIHRoZSBub2lzZSBpbiB0aGUgJHRoaXMtPm5vaXNlIGFycmF5LgogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIHJlbW92ZV9ub2lzZSgkcGF0dGVybiwgJHJlbW92ZV90YWc9ZmFsc2UpCiAgICB7CiAgICAgICAgZ2xvYmFsICRkZWJ1Z09iamVjdDsKICAgICAgICBpZiAoaXNfb2JqZWN0KCRkZWJ1Z09iamVjdCkpIHsgJGRlYnVnT2JqZWN0LT5kZWJ1Z0xvZ0VudHJ5KDEpOyB9CgogICAgICAgICRjb3VudCA9IHByZWdfbWF0Y2hfYWxsKCRwYXR0ZXJuLCAkdGhpcy0+ZG9jLCAkbWF0Y2hlcywgUFJFR19TRVRfT1JERVJ8UFJFR19PRkZTRVRfQ0FQVFVSRSk7CgogICAgICAgIGZvciAoJGk9JGNvdW50LTE7ICRpPi0xOyAtLSRpKQogICAgICAgIHsKICAgICAgICAgICAgJGtleSA9ICdfX19ub2lzZV9fXycuc3ByaW50ZignJSA1ZCcsIGNvdW50KCR0aGlzLT5ub2lzZSkrMTAwMCk7CiAgICAgICAgICAgIGlmIChpc19vYmplY3QoJGRlYnVnT2JqZWN0KSkgeyAkZGVidWdPYmplY3QtPmRlYnVnTG9nKDIsICdrZXkgaXM6ICcgLiAka2V5KTsgfQogICAgICAgICAgICAkaWR4ID0gKCRyZW1vdmVfdGFnKSA/IDAgOiAxOwogICAgICAgICAgICAkdGhpcy0+bm9pc2VbJGtleV0gPSAkbWF0Y2hlc1skaV1bJGlkeF1bMF07CiAgICAgICAgICAgICR0aGlzLT5kb2MgPSBzdWJzdHJfcmVwbGFjZSgkdGhpcy0+ZG9jLCAka2V5LCAkbWF0Y2hlc1skaV1bJGlkeF1bMV0sIHN0cmxlbigkbWF0Y2hlc1skaV1bJGlkeF1bMF0pKTsKICAgICAgICB9CgogICAgICAgIC8vIHJlc2V0IHRoZSBsZW5ndGggb2YgY29udGVudAogICAgICAgICR0aGlzLT5zaXplID0gc3RybGVuKCR0aGlzLT5kb2MpOwogICAgICAgIGlmICgkdGhpcy0+c2l6ZT4wKQogICAgICAgIHsKICAgICAgICAgICAgJHRoaXMtPmNoYXIgPSAkdGhpcy0+ZG9jWzBdOwogICAgICAgIH0KICAgIH0KCiAgICAvLyByZXN0b3JlIG5vaXNlIHRvIGh0bWwgY29udGVudAogICAgZnVuY3Rpb24gcmVzdG9yZV9ub2lzZSgkdGV4dCkKICAgIHsKICAgICAgICBnbG9iYWwgJGRlYnVnT2JqZWN0OwogICAgICAgIGlmIChpc19vYmplY3QoJGRlYnVnT2JqZWN0KSkgeyAkZGVidWdPYmplY3QtPmRlYnVnTG9nRW50cnkoMSk7IH0KCiAgICAgICAgd2hpbGUgKCgkcG9zPXN0cnBvcygkdGV4dCwgJ19fX25vaXNlX19fJykpIT09ZmFsc2UpCiAgICAgICAgewogICAgICAgICAgICAvLyBTb21ldGltZXMgdGhlcmUgaXMgYSBicm9rZW4gcGllY2Ugb2YgbWFya3VwLCBhbmQgd2UgZG9uJ3QgR0VUIHRoZSBwb3MrMTEgZXRjLi4uIHRva2VuIHdoaWNoIGluZGljYXRlcyBhIHByb2JsZW0gb3V0c2lkZSBvZiB1cy4uLgogICAgICAgICAgICBpZiAoc3RybGVuKCR0ZXh0KSA+ICRwb3MrMTUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICRrZXkgPSAnX19fbm9pc2VfX18nLiR0ZXh0WyRwb3MrMTFdLiR0ZXh0WyRwb3MrMTJdLiR0ZXh0WyRwb3MrMTNdLiR0ZXh0WyRwb3MrMTRdLiR0ZXh0WyRwb3MrMTVdOwogICAgICAgICAgICAgICAgaWYgKGlzX29iamVjdCgkZGVidWdPYmplY3QpKSB7ICRkZWJ1Z09iamVjdC0+ZGVidWdMb2coMiwgJ2xvY2F0ZWQga2V5IG9mOiAnIC4gJGtleSk7IH0KCiAgICAgICAgICAgICAgICBpZiAoaXNzZXQoJHRoaXMtPm5vaXNlWyRrZXldKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAkdGV4dCA9IHN1YnN0cigkdGV4dCwgMCwgJHBvcykuJHRoaXMtPm5vaXNlWyRrZXldLnN1YnN0cigkdGV4dCwgJHBvcysxNik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gZG8gdGhpcyB0byBwcmV2ZW50IGFuIGluZmluaXRlIGxvb3AuCiAgICAgICAgICAgICAgICAgICAgJHRleHQgPSBzdWJzdHIoJHRleHQsIDAsICRwb3MpLidVTkRFRklORUQgTk9JU0UgRk9SIEtFWTogJy4ka2V5IC4gc3Vic3RyKCR0ZXh0LCAkcG9zKzE2KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIFRoZXJlIGlzIG5vIHZhbGlkIGtleSBiZWluZyBnaXZlbiBiYWNrIHRvIHVzLi4uIFdlIG11c3QgZ2V0IHJpZCBvZiB0aGUgX19fbm9pc2VfX18gb3Igd2Ugd2lsbCBoYXZlIGEgcHJvYmxlbS4KICAgICAgICAgICAgICAgICR0ZXh0ID0gc3Vic3RyKCR0ZXh0LCAwLCAkcG9zKS4nTk8gTlVNRVJJQyBOT0lTRSBLRVknIC4gc3Vic3RyKCR0ZXh0LCAkcG9zKzExKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gJHRleHQ7CiAgICB9CgogICAgLy8gU29tZXRpbWVzIHdlIE5FRUQgb25lIG9mIHRoZSBub2lzZSBlbGVtZW50cy4KICAgIGZ1bmN0aW9uIHNlYXJjaF9ub2lzZSgkdGV4dCkKICAgIHsKICAgICAgICBnbG9iYWwgJGRlYnVnT2JqZWN0OwogICAgICAgIGlmIChpc19vYmplY3QoJGRlYnVnT2JqZWN0KSkgeyAkZGVidWdPYmplY3QtPmRlYnVnTG9nRW50cnkoMSk7IH0KCiAgICAgICAgZm9yZWFjaCgkdGhpcy0+bm9pc2UgYXMgJG5vaXNlRWxlbWVudCkKICAgICAgICB7CiAgICAgICAgICAgIGlmIChzdHJwb3MoJG5vaXNlRWxlbWVudCwgJHRleHQpIT09ZmFsc2UpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiAkbm9pc2VFbGVtZW50OwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb24gX190b1N0cmluZygpCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5yb290LT5pbm5lcnRleHQoKTsKICAgIH0KCiAgICBmdW5jdGlvbiBfX2dldCgkbmFtZSkKICAgIHsKICAgICAgICBzd2l0Y2ggKCRuYW1lKQogICAgICAgIHsKICAgICAgICAgICAgY2FzZSAnb3V0ZXJ0ZXh0JzoKICAgICAgICAgICAgICAgIHJldHVybiAkdGhpcy0+cm9vdC0+aW5uZXJ0ZXh0KCk7CiAgICAgICAgICAgIGNhc2UgJ2lubmVydGV4dCc6CiAgICAgICAgICAgICAgICByZXR1cm4gJHRoaXMtPnJvb3QtPmlubmVydGV4dCgpOwogICAgICAgICAgICBjYXNlICdwbGFpbnRleHQnOgogICAgICAgICAgICAgICAgcmV0dXJuICR0aGlzLT5yb290LT50ZXh0KCk7CiAgICAgICAgICAgIGNhc2UgJ2NoYXJzZXQnOgogICAgICAgICAgICAgICAgcmV0dXJuICR0aGlzLT5fY2hhcnNldDsKICAgICAgICAgICAgY2FzZSAndGFyZ2V0X2NoYXJzZXQnOgogICAgICAgICAgICAgICAgcmV0dXJuICR0aGlzLT5fdGFyZ2V0X2NoYXJzZXQ7CiAgICAgICAgfQogICAgfQoKICAgIC8vIGNhbWVsIG5hbWluZyBjb252ZW50aW9ucwogICAgZnVuY3Rpb24gY2hpbGROb2RlcygkaWR4PS0xKSB7cmV0dXJuICR0aGlzLT5yb290LT5jaGlsZE5vZGVzKCRpZHgpO30KICAgIGZ1bmN0aW9uIGZpcnN0Q2hpbGQoKSB7cmV0dXJuICR0aGlzLT5yb290LT5maXJzdF9jaGlsZCgpO30KICAgIGZ1bmN0aW9uIGxhc3RDaGlsZCgpIHtyZXR1cm4gJHRoaXMtPnJvb3QtPmxhc3RfY2hpbGQoKTt9CiAgICBmdW5jdGlvbiBjcmVhdGVFbGVtZW50KCRuYW1lLCAkdmFsdWU9bnVsbCkge3JldHVybiBAc3RyX2dldF9odG1sKCI8JG5hbWU+JHZhbHVlPC8kbmFtZT4iKS8qLT5maXJzdF9jaGlsZCgpKi87fQogICAgZnVuY3Rpb24gY3JlYXRlVGV4dE5vZGUoJHZhbHVlKSB7cmV0dXJuIEBlbmQoc3RyX2dldF9odG1sKCR2YWx1ZSktPm5vZGVzKTt9CiAgICBmdW5jdGlvbiBnZXRFbGVtZW50QnlJZCgkaWQpIHtyZXR1cm4gJHRoaXMtPmZpbmQoIiMkaWQiLCAwKTt9CiAgICBmdW5jdGlvbiBnZXRFbGVtZW50c0J5SWQoJGlkLCAkaWR4PW51bGwpIHtyZXR1cm4gJHRoaXMtPmZpbmQoIiMkaWQiLCAkaWR4KTt9CiAgICBmdW5jdGlvbiBnZXRFbGVtZW50QnlUYWdOYW1lKCRuYW1lKSB7cmV0dXJuICR0aGlzLT5maW5kKCRuYW1lLCAwKTt9CiAgICBmdW5jdGlvbiBnZXRFbGVtZW50c0J5VGFnTmFtZSgkbmFtZSwgJGlkeD0tMSkge3JldHVybiAkdGhpcy0+ZmluZCgkbmFtZSwgJGlkeCk7fQogICAgZnVuY3Rpb24gbG9hZEZpbGUoKSB7JGFyZ3MgPSBmdW5jX2dldF9hcmdzKCk7JHRoaXMtPmxvYWRfZmlsZSgkYXJncyk7fQp9Cg==
mip/template/footer.phpPGZvb3Rlcj4NCiAgPHA+PGEgaHJlZj0ie2h0bWxzcGVjaWFsY2hhcnMobWlwX3RoZW1lX2dldF9vcmlnaW5hbF91cmwoJHpicC0+ZnVsbGN1cnJlbnR1cmwpKX0iPui/lOWbnuWujOaVtOeJiDwvYT48L3A+DQogIDxoND57JGNvcHlyaWdodH08L2g0Pg0KICA8aDU+UG93ZXJlZCBCeSB7JHpibG9ncGhwaHRtbH08L2g1Pg0KDQo8L2Zvb3Rlcj4NCjxzY3JpcHQgc3JjPSJodHRwczovL2MubWlwY2RuLmNvbS9zdGF0aWMvdjEvbWlwLmpzIj48L3NjcmlwdD4NCjxzY3JpcHQgc3JjPSJodHRwczovL2MubWlwY2RuLmNvbS9zdGF0aWMvdjEvbWlwLXpibG9ncGhwLWFydGljbGUtdmlld251bS9taXAtemJsb2dwaHAtYXJ0aWNsZS12aWV3bnVtLmpzIj48L3NjcmlwdD4NCjwvYm9keT4NCjwvaHRtbD4NCg==
mip/template/header.phpPCFkb2N0eXBlIGh0bWw+DQo8aHRtbCBtaXA+DQo8aGVhZD4NCgk8bWV0YSBjaGFyc2V0PSJ1dGYtOCIgLz4NCgk8bWV0YSBuYW1lPSJibG9naG9zdCIgY29udGVudD0ieyRob3N0fSI+DQoJPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJ7JHpibG9ncGhwfSIgLz4NCgk8bWV0YSBuYW1lPSJyZW5kZXJlciIgY29udGVudD0id2Via2l0IiAvPg0KCTxtZXRhIG5hbWU9InZpZXdwb3J0IiBjb250ZW50PSJ3aWR0aD1kZXZpY2Utd2lkdGgsaW5pdGlhbC1zY2FsZT0xIiAvPg0KCTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Imh0dHBzOi8vYy5taXBjZG4uY29tL3N0YXRpYy92MS9taXAuY3NzIj4NCgk8bGluayByZWw9InN0eWxlc2hlZXQiIHJldj0ic3R5bGVzaGVldCIgaHJlZj0ieyRob3N0fW1pcC5jc3MiIHR5cGU9InRleHQvY3NzIiBtZWRpYT0iYWxsIi8+DQoJPHN0eWxlIG1pcC1jdXN0b20+eyRtaXBzdHlsZX08L3N0eWxlPg0KCTx0aXRsZT57JG5hbWV9IC0geyR0aXRsZX08L3RpdGxlPg0KPC9oZWFkPg0K
mip/template/index.phpe3RlbXBsYXRlOmhlYWRlcn0NCjxib2R5IGNsYXNzPSJtdWx0aSI+DQo8aGVhZGVyPg0KPGgyPjxhIGhyZWY9InskaG9zdH0iPnskbmFtZX08L2E+IDxzdXA+eyRzdWJuYW1lfTwvc3VwPjwvaDI+DQo8L2hlYWRlcj4NCjxzZWN0aW9uPg0KICA8c2VjdGlvbiBpZD0ibWFpbiI+DQogICAgPHNlY3Rpb24+DQp7Zm9yZWFjaCAkYXJ0aWNsZXMgYXMgJGFydGljbGV9DQp7aWYgJGFydGljbGUuSXNUb3B9DQp7dGVtcGxhdGU6cG9zdC1pc3RvcH0NCntlbHNlfQ0Ke3RlbXBsYXRlOnBvc3QtbXVsdGl9DQp7L2lmfQ0Key9mb3JlYWNofQ0KICAgICAgPG5hdj57dGVtcGxhdGU6cGFnZWJhcn08L25hdj4NCiAgICA8L3NlY3Rpb24+DQogIDwvc2VjdGlvbj4NCjwvc2VjdGlvbj4NCnt0ZW1wbGF0ZTpmb290ZXJ9DQo=
mip/template/mip.cssLyogLS0tLS1jb3B5cmlnaHQtLS0tLS0NCiBUaGVtZSBOYW1lOiBIdG1sNUNTUzMNCiBBdXRob3I6IGpncHkuY24NCiBQdWIgRGF0ZTogMjAxMy0xLTE2DQogTGFzdCBNb2RpZmllZDogMjAxMy0xLTI5DQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi8qPW1pcCovDQptaXAtemJsb2dwaHAtYXJ0aWNsZS12aWV3bnVtLm1pcC1lbGVtZW50IHtkaXNwbGF5OiBpbmxpbmU7fQ0KDQovKj1nbG9iYWwqLw0KYm9keXtiYWNrZ3JvdW5kOiNkZWY7Zm9udDoxNHB4ICLlvq7ova/pm4Xpu5EiLEFyaWFsO3RleHQtc2hhZG93OjFweCAxcHggcmdiYSgyNTUsMjU1LDI1NSwuOCk7Y29sb3I6IzQ1Njt3b3JkLWJyZWFrOmJyZWFrLWFsbDtwYWRkaW5nOjMwcHg7bWFyZ2luOjA7fQ0KaW1ne2JvcmRlcjpub25lO3ZlcnRpY2FsLWFsaWduOnRleHQtYm90dG9tfQ0KdWwsb2x7bGlzdC1zdHlsZTpub25lO30NCmlucyxhe3RleHQtZGVjb3JhdGlvbjpub25lfQ0KYXtjb2xvcjojM0E2RUE1fQ0KYTpob3Zlcntjb2xvcjojMzlDfQ0KaW5wdXQsDQp0ZXh0YXJlYSwNCnNlbGVjdHtvdXRsaW5lOm5vbmU7Ym9yZGVyOjFweCBzb2xpZCAjZGRkO2JvcmRlci1yYWRpdXM6M3B4O2JveC1zaGFkb3c6MCAwIDJweCAycHggI2VlZSBpbnNldDtiYWNrZ3JvdW5kOiNmOWY5Zjk7cGFkZGluZzowIDVweDtmb250OjE0cHgvMzJweCAi5b6u6L2v6ZuF6buRIixBcmlhbDtjb2xvcjojNjY2O30NCnRleHRhcmVhe2xpbmUtaGVpZ2h0OjI0cHg7cGFkZGluZzo1cHg7b3ZlcmZsb3c6YXV0b30NCmlucHV0OmZvY3VzLA0KdGV4dGFyZWE6Zm9jdXN7Ym9yZGVyLWNvbG9yOiMzOUM7YmFja2dyb3VuZDojZmZmO2NvbG9yOiMxMjN9DQppbnB1dC5lcnIsDQp0ZXh0YXJlYS5lcnJ7Ym9yZGVyLWNvbG9yOiNDMzM7Ym94LXNoYWRvdzowIDAgM3B4IDNweCAjRkZFRUY3IGluc2V0O30NCmlucHV0W3R5cGU9J3RleHQnXXtoZWlnaHQ6MzBweDt9DQppbnB1dFt0eXBlPSdjaGVja2JveCddLA0KaW5wdXRbdHlwZT0ncmFkaW8nXXtib3JkZXI6bm9uZTtiYWNrZ3JvdW5kOm5vbmU7fQ0Kc2VsZWN0e3BhZGRpbmc6NXB4IDVweCA1cHggMXB4O30NCmJ1dHRvbiwNCmlucHV0W3R5cGU9J3N1Ym1pdCddLA0KLmJ0bntvdXRsaW5lOm5vbmU7Ym9yZGVyOjFweCBzb2xpZCAjMDY5O2JveC1zaGFkb3c6MCAtMTBweCAxMHB4IHJnYmEoMCwwLDAsLjIpIGluc2V0LCAwIDAgMXB4ICNmZmYgaW5zZXQ7YmFja2dyb3VuZDojM0E2RUE1O2NvbG9yOiNmZmY7Ym9yZGVyLXJhZGl1czo2cHg7dGV4dC1zaGFkb3c6MCAtMXB4IHJnYmEoMCwwLDAsLjUpO2N1cnNvcjpwb2ludGVyO2hlaWdodDozNHB4O3BhZGRpbmc6MCAxNXB4O2ZvbnQ6Ym9sZCAxNHB4ICLlvq7ova/pm4Xpu5EiLEFyaWFsO21hcmdpbjowIDEwcHggMCAwO30NCg0KLyo9bm9odG1sNSovDQojbm9odG1sNXtwb3NpdGlvbjpmaXhlZDt6LWluZGV4Ojk5OTk5O3RvcDowO2xlZnQ6MDtwYWRkaW5nOjAgMSU7d2lkdGg6OTglO2NvbG9yOiNGMzA7YmFja2dyb3VuZDojRkZDO2xpbmUtaGVpZ2h0OjI7dGV4dC1hbGlnbjpjZW50ZXI7Zm9udC1zaXplOjFlbTttYXJnaW46MDt9DQo6cm9vdCBoZ3JvdXA+I25vaHRtbDV7ZGlzcGxheTpub25lfQ0KDQovKj1oZWFkZXIqLw0KYm9keT5oZWFkZXJ7YmFja2dyb3VuZDojM0E2RUE1O2NvbG9yOiNmZmY7cGFkZGluZzoyMHB4O21hcmdpbjowIGF1dG87dGV4dC1zaGFkb3c6MXB4IDFweCByZ2JhKDAsMCwwLC41KTtwb3NpdGlvbjpyZWxhdGl2ZTt9DQpib2R5PmhlYWRlciBhLA0KYm9keT5oZWFkZXIgYTpob3Zlcntjb2xvcjojZmZmfQ0KYm9keT5oZWFkZXIgaDJ7ZmxvYXQ6bGVmdDtmb250LXNpemU6Mi4yZW07bGV0dGVyLXNwYWNpbmc6LTNweDtsaW5lLWhlaWdodDo0MHB4O21hcmdpbjowfQ0KYm9keT5oZWFkZXIgaDIgc3Vwe2Rpc3BsYXk6YmxvY2s7Zm9udC1zaXplOi41ZW07Zm9udC13ZWlnaHQ6MTAwO2xldHRlci1zcGFjaW5nOjA7bGluZS1oZWlnaHQ6MjBweDt9DQpib2R5PmhlYWRlciBuYXZ7ZmxvYXQ6cmlnaHQ7bGluZS1oZWlnaHQ6MS44O21hcmdpbjoxN3B4IDAgMH0NCmJvZHk+aGVhZGVyIG5hdiB1bHttYXJnaW46MDtwYWRkaW5nOjA7fQ0KYm9keT5oZWFkZXIgbmF2IGxpe2Zsb2F0OmxlZnQ7bWFyZ2luOjAgMCAwIDEwcHg7aGVpZ2h0OjI2cHg7fQ0KYm9keT5oZWFkZXIgbmF2IGxpOmJlZm9yZXtjb250ZW50OiIgLyAiO2NvbG9yOnJnYmEoMCwwLDAsLjMpO21hcmdpbjowIDhweCAwIDA7dGV4dC1zaGFkb3c6bm9uZX0NCmJvZHk+aGVhZGVyIG5hdiBsaTpmaXJzdC1jaGlsZDo6YmVmb3Jle2Rpc3BsYXk6bm9uZX0NCmJvZHk+aGVhZGVyOmFmdGVye2Rpc3BsYXk6YmxvY2s7Y29udGVudDoiLiI7Y2xlYXI6Ym90aDtoZWlnaHQ6MDtvdmVyZmxvdzpoaWRkZW47fQ0KYm9keT5oZWFkZXI6YmVmb3JlLA0KYm9keT5oZWFkZXIgbmF2OmFmdGVyLA0KI21haW4+c2VjdGlvbjpiZWZvcmUsDQojbWFpbj5zZWN0aW9uOmFmdGVye3dpZHRoOjQ1JTtoZWlnaHQ6MDtvdmVyZmxvdzpoaWRkZW47ZGlzcGxheTpibG9jaztjbGVhcjpib3RoO2NvbnRlbnQ6Ii4iOy13ZWJraXQtYm94LXNoYWRvdzowIDAgMTVweCAyMHB4IHJnYmEoMCwwLDAsLjQpO2JveC1zaGFkb3c6MCAwIDE1cHggMjBweCByZ2JhKDAsMCwwLC40KTtib3JkZXItcmFkaXVzOjNweDstd2Via2l0LXRyYW5zZm9ybTpyb3RhdGUoLTJkZWcpO3RyYW5zZm9ybTpyb3RhdGUoLTJkZWcpO3otaW5kZXg6LTE7cG9zaXRpb246YWJzb2x1dGU7bGVmdDo1MHB4O2JvdHRvbToyMHB4O30NCmJvZHk+aGVhZGVyIG5hdjphZnRlciwNCiNtYWluPnNlY3Rpb246YWZ0ZXJ7bWFyZ2luOjAgMCAwIDMwcHg7LXdlYmtpdC10cmFuc2Zvcm06cm90YXRlKDJkZWcpO3RyYW5zZm9ybTpyb3RhdGUoMmRlZyk7bGVmdDphdXRvO3JpZ2h0OjUwcHg7fQ0KDQovKj13cmFwKi8NCmJvZHk+c2VjdGlvbnt3aWR0aDogMTAwJTttYXJnaW46MzBweCBhdXRvO3Bvc2l0aW9uOnJlbGF0aXZlO30NCmJvZHk+aGVhZGVyIHVsOmFmdGVyLA0KYm9keT5zZWN0aW9uOmFmdGVyLA0KI21haW46YWZ0ZXIsDQojZXh0cmE+ZGw6Zmlyc3QtY2hpbGQgZGQ6YWZ0ZXJ7Y29udGVudDoiLiI7aGVpZ2h0OjA7Y2xlYXI6Ym90aDtvdmVyZmxvdzpoaWRkZW47Zm9udDowcHgvMCBhcmlhbDtkaXNwbGF5OmJsb2NrfQ0KDQovKj1nbG9iYWwgbGF5b3V0Ki8NCiNtYWluPnNlY3Rpb257YmFja2dyb3VuZDojZmVmZWZlOy13ZWJraXQtYm94LXNoYWRvdzowIDAgMnB4IHJnYmEoMCwwLDAsLjIpO2JveC1zaGFkb3c6MCAwIDJweCByZ2JhKDAsMCwwLC4yKTt9DQoNCnNlY3Rpb24+YXJ0aWNsZSwNCnNlY3Rpb24+bmF2LA0KYXJ0aWNsZX5kbCwNCmFzaWRlPmRse3BhZGRpbmc6MjBweCAwO21hcmdpbjowIDIwcHg7bGluZS1oZWlnaHQ6Mjt9DQovKj1tYWluKi8NCiNtYWluOjphZnRlcntkaXNwbGF5OmlubGluZS1ibG9jaztjb250ZW50OiItLS0tLS0tLSI7Zm9udC1zaXplOjIwZW19DQojbWFpbj5zZWN0aW9ue2Zsb2F0OmxlZnQ7cG9zaXRpb246cmVsYXRpdmU7d2lkdGg6MTAwJTttYXJnaW46MCAwIC0xNHB4fQ0KI21haW4+c2VjdGlvbj5uYXZ7Ym9yZGVyOm5vbmV9DQovKj1uYXYqLw0KI21haW4gbmF2e3RleHQtYWxpZ246Y2VudGVyO30NCiNtYWluIG5hdj5zcGFuLA0KI21haW4gbmF2IGF7bWFyZ2luOjAgNXB4O30NCiNtYWluIG5hdiBzcGFue2Rpc3BsYXk6aW5saW5lLWJsb2NrO2hlaWdodDoyNHB4O2xpbmUtaGVpZ2h0OjI0cHg7cGFkZGluZzowIDhweDtib3JkZXI6MXB4IHNvbGlkICNlZWU7Ym9yZGVyLXJhZGl1czozcHh9DQojbWFpbiBuYXY+c3BhbntiYWNrZ3JvdW5kOiNkZWY7Ym94LXNoYWRvdzowIDAgMnB4IHJnYmEoMCwwLDAsLjIpIGluc2V0O2JvcmRlci1jb2xvcjojYWJjO30NCi8qPWFydGljbGUqLw0KYXJ0aWNsZXtib3JkZXItYm90dG9tOjFweCBzb2xpZCAjZWVlO2JvcmRlci10b3A6MXB4IHNvbGlkICNmZmY7b3ZlcmZsb3c6aGlkZGVufQ0KYXJ0aWNsZT5oZWFkZXIgaDEsDQphcnRpY2xlPmhlYWRlciBoM3tmb250LXNpemU6MmVtO2NvbG9yOiMzQTZFQTU7Zm9udC13ZWlnaHQ6MTAwO2xpbmUtaGVpZ2h0OjEuNTttYXJnaW46MH0NCmFydGljbGU+aGVhZGVyIGg0e2ZvbnQtc2l6ZToxLjVlbTttYXJnaW46MDtmb250LXdlaWdodDoxMDA7fQ0KYXJ0aWNsZT5oZWFkZXIgaDV7bWFyZ2luOjAgMCAtMTBweDtmb250LXdlaWdodDoxMDA7Y29sb3I6IzM5Q30NCmFydGljbGU+aGVhZGVyIHRpbWV7Y29sb3I6I2FiYztmbG9hdDpyaWdodDtsaW5lLWhlaWdodDozO21hcmdpbjowIDAgMCAyMHB4fQ0KYXJ0aWNsZT5zZWN0aW9ue21hcmdpbjoxMHB4IDB9DQphcnRpY2xlPnNlY3Rpb24gdWx7Ym9yZGVyLWxlZnQ6NXB4IHNvbGlkICNlZWU7bGlzdC1zdHlsZTpkaXNjIG91dHNpZGUgbm9uZTt9DQphcnRpY2xlPnNlY3Rpb24gb2x7YmFja2dyb3VuZDojZjVmNWY1O2JvcmRlcjoxcHggc29saWQgI2VlZTttYXJnaW46MTBweCAwO2JvcmRlci1yYWRpdXM6NXB4O2xpc3Qtc3R5bGU6IGRlY2ltYWwgb3V0c2lkZSBub25lO30NCmFydGljbGU+c2VjdGlvbiBsaXtiYWNrZ3JvdW5kOiNmZmY7cGFkZGluZzowIDAgMCAxMHB4O2NvbG9yOiM3ODk7fQ0KYXJ0aWNsZT5zZWN0aW9uIGxpIHB7Y29sb3I6IzQ1NjttYXJnaW46MH0NCmFydGljbGU+c2VjdGlvbiBvbCBsaTpudGgtY2hpbGQoZXZlbil7YmFja2dyb3VuZDojZjlmOWY5fQ0KYXJ0aWNsZT5zZWN0aW9uIGltZywNCmFydGljbGU+c2VjdGlvbiBwcmV7bWF4LXdpZHRoOjQwMHB4O30NCmFydGljbGU+c2VjdGlvbj5hcnRpY2xle21hcmdpbjowfQ0KYXJ0aWNsZT5mb290ZXJ7Y29sb3I6Izc4OTt9DQphcnRpY2xlPmZvb3RlciBoNCwNCmFydGljbGU+Zm9vdGVyIGg1e2ZvbnQtd2VpZ2h0OjEwMDtmb250LXNpemU6LjllbTttYXJnaW46MH0NCmFydGljbGU+Zm9vdGVyIGg0IGF7bWFyZ2luOjAgNXB4IDAgMH0NCmFydGljbGU+Zm9vdGVyIGg1e3RleHQtYWxpZ246cmlnaHQ7d29yZC1zcGFjaW5nOjVweH0NCmFydGljbGU+Zm9vdGVyIGg1IGVte2ZvbnQtc3R5bGU6bm9ybWFsO2JvcmRlci1sZWZ0OjFweCBkb3R0ZWQgI2RkZDtwYWRkaW5nOjAgMCAwIDhweDt9DQphcnRpY2xlPmZvb3RlciBoNSBlbTpmaXJzdC1jaGlsZHtib3JkZXI6bm9uZTtwYWRkaW5nOjB9DQphcnRpY2xlPm5hdnttYXJnaW46MjBweCAwIDA7fQ0KYXJ0aWNsZT5uYXYgcHttYXJnaW46MDt0ZXh0LWFsaWduOmxlZnR9DQphcnRpY2xlPnNlY3Rpb24gLnRhZy1uYW1le21hcmdpbjowIDEwcHggMCAwfQ0KLyo9aGlsaXRlY29kZSovDQphcnRpY2xlIC5zeW50YXhoaWdobGlnaHRlcnt3aWR0aDoxMDAlIWltcG9ydGFudH0NCi8qPW1haW4gZGwqLw0KYXJ0aWNsZX5kbHtib3JkZXItdG9wOjFweCBzb2xpZCAjZmZmO2JvcmRlci1ib3R0b206MXB4IHNvbGlkICNlZWU7fQ0KYXJ0aWNsZX5kbDpsYXN0LWNoaWxke2JvcmRlci1ib3R0b206bm9uZX0NCiNyZWxhdGVkIGxpIHRpbWV7ZmxvYXQ6cmlnaHQ7Y29sb3I6I2FiY30NCmJsb2NrcXVvdGUgdGV4dGFyZWF7YmFja2dyb3VuZDp3aGl0ZSFpbXBvcnRhbnQ7cG9zaXRpb246cmVsYXRpdmUhaW1wb3J0YW50O3dpZHRoOjk1JSFpbXBvcnRhbnQ7fQ0KYmxvY2txdW90ZSBpbnB1dHtiYWNrZ3JvdW5kOndoaXRlIWltcG9ydGFudDt3aWR0aDo5NSUhaW1wb3J0YW50O30NCi8qPWZvb3RlciovDQpib2R5PmZvb3Rlcntjb2xvcjojM0E2RUE1O3RleHQtYWxpZ246Y2VudGVyO2NsZWFyOmJvdGg7fQ0KYm9keT5mb290ZXIgKntmb250LXNpemU6MWVtO2ZvbnQtd2VpZ2h0OjEwMDt9DQpib2R5PmZvb3RlciBoNXtmb250LXNpemU6LjhlbTttYXJnaW46MTBweCAwIDB9DQpib2R5PmZvb3RlciBhe2NvbG9yOiMzQTZFQTV9DQoNCi8qZm9yIG1vYmlsZSB1c2VyKi8NCkBtZWRpYSBvbmx5IHNjcmVlbiBhbmQgKG1heC13aWR0aDogMTAyNHB4KSB7DQpib2R5PnNlY3Rpb257cGFkZGluZzowO30NCiNtYWlue2Zsb2F0Om5vbmU7fQ0KI21haW46OmFmdGVye2Rpc3BsYXk6YmxvY2s7Zm9udC1zaXplOjA7fQ0KI21haW4+c2VjdGlvbnttYXJnaW46MDt9DQphcnRpY2xlPnNlY3Rpb24gaW1ne21heC13aWR0aDoxMDAlfQ0KfQ0KQG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiA4MDBweCkgew0KYm9keXtwYWRkaW5nOjIwcHggMjBweCAzMHB4fQ0KYm9keT5oZWFkZXJ7aGVpZ2h0OmF1dG87fQ0KYm9keT5oZWFkZXIgaDJ7ZmxvYXQ6bm9uZX0NCmJvZHk+aGVhZGVyIG5hdntmbG9hdDpub25lO2xpbmUtaGVpZ2h0OjI7bWFyZ2luOjEwcHggMCAwIC0xMHB4O30NCiNtYWluey13ZWJraXQtYm94LXNoYWRvdzowIDAgMTVweCAyMHB4IHJnYmEoMCwwLDAsLjIpO2JveC1zaGFkb3c6MCAwIDJweCByZ2JhKDAsMCwwLC4yKTtiYWNrZ3JvdW5kOiNmZWZlZmU7cG9zaXRpb246cmVsYXRpdmU7fQ0KI21haW4+c2VjdGlvbiwgey13ZWJraXQtYm94LXNoYWRvdzpub25lO2JveC1zaGFkb3c6bm9uZTtwb3NpdGlvbjpzdGF0aWN9DQp9DQpAbWVkaWEgb25seSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6IDYwMHB4KSB7DQpib2R5e3BhZGRpbmc6MTBweCAxMHB4IDIwcHh9DQpib2R5PmhlYWRlcntwYWRkaW5nOjEwcHg7fQ0KYm9keT5oZWFkZXIgaDJ7ZmxvYXQ6bm9uZTtmb250LXNpemU6MS42ZW07aGVpZ2h0OjEuNmVtO292ZXJmbG93OmhpZGRlbjtsaW5lLWhlaWdodDoxLjZlbTt9DQpib2R5PmhlYWRlciBoMiBzdXB7ZGlzcGxheTppbmxpbmU7fQ0KYm9keT5oZWFkZXIgbmF2IGxpe2ZvbnQtc2l6ZToxLjFlbX0NCmJvZHk+c2VjdGlvbnttYXJnaW46MjBweCBhdXRvO30NCiNtYWlue3BhZGRpbmc6MDtiYWNrZ3JvdW5kOm5vbmU7LXdlYmtpdC1ib3gtc2hhZG93Om5vbmU7Ym94LXNoYWRvdzpub25lfQ0KI21haW4+c2VjdGlvbntmbG9hdDpub25lO2JveC1zaGFkb3c6MCAwIDJweCByZ2JhKDAsMCwwLC4yKTtwb3NpdGlvbjpyZWxhdGl2ZTt9DQojbWFpbj5zZWN0aW9uPmFydGljbGUsDQphcnRpY2xlfmRsLA0KI2V4dHJhPmRsLA0KI2V4dHJhPmRsOmZpcnN0LWNoaWxke21hcmdpbjowIDEwcHg7fQ0KYXJ0aWNsZT5oZWFkZXIgdGltZXtmb250LXNpemU6LjllbX0NCmFydGljbGU+aGVhZGVyIGgxLA0KYXJ0aWNsZT5oZWFkZXIgaDN7Zm9udC1zaXplOjEuNWVtfQ0KYXJ0aWNsZT5zZWN0aW9ue2ZvbnQtc2l6ZToxLjFlbX0NCmFydGljbGU+Zm9vdGVyIGg1e3dvcmQtc3BhY2luZzowO2ZvbnQtc2l6ZTouOGVtfQ0KfQ0KQG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiA0ODBweCkgew0KYm9keXtwYWRkaW5nOjVweH0NCmJvZHk+aGVhZGVye3BhZGRpbmc6MTBweCA0MHB4IDEwcHggMTBweDt9DQpib2R5PmhlYWRlciBoMntmb250LXNpemU6MWVtO2xldHRlci1zcGFjaW5nOjA7bGluZS1oZWlnaHQ6MjtoZWlnaHQ6MjhweDtvdmVyZmxvdzpoaWRkZW59DQpib2R5PmhlYWRlciBoMiBzdXB7ZGlzcGxheTpub25lfQ0KYm9keT5oZWFkZXIgbmF2e3Bvc2l0aW9uOmFic29sdXRlO3JpZ2h0OjA7dG9wOjA7ei1pbmRleDoxMDttYXJnaW46MDt0ZXh0LWFsaWduOmNlbnRlcjt9DQpib2R5PmhlYWRlciBuYXY6YmVmb3Jle3Bvc2l0aW9uOmFic29sdXRlO3JpZ2h0OjEwcHg7dG9wOjEwcHg7Y29udGVudDoi5LiJIjtib3JkZXI6MnB4IHNvbGlkICNmZmY7aGVpZ2h0OjI0cHg7d2lkdGg6MjRweDtmb250LXNpemU6MjBweDtmb250LXdlaWdodDpib2xkO2xpbmUtaGVpZ2h0OjIzcHg7Ym9yZGVyLXJhZGl1czo1cHg7LXdlYmtpdC1ib3gtc2hhZG93OjFweCAxcHggcmdiYSgwLDAsMCwuNSksMXB4IDFweCByZ2JhKDAsMCwwLC41KSBpbnNldDtib3gtc2hhZG93OjFweCAxcHggcmdiYSgwLDAsMCwuNSksMXB4IDFweCByZ2JhKDAsMCwwLC41KSBpbnNldDtmbG9hdDpyaWdodDtvdmVyZmxvdzpoaWRkZW59DQpib2R5PmhlYWRlciBuYXYgdWx7YmFja2dyb3VuZDojZmZmOy13ZWJraXQtYm94LXNoYWRvdzowIDAgNXB4IDFweCByZ2JhKDAsMCwwLC41KTtib3gtc2hhZG93OjAgMCA1cHggMXB4IHJnYmEoMCwwLDAsLjUpO2JvcmRlci1yYWRpdXM6NXB4O3otaW5kZXg6MTA7cGFkZGluZzoxMHB4O3RleHQtc2hhZG93Om5vbmU7bWFyZ2luOjAgMjBweDtkaXNwbGF5Om5vbmV9DQpib2R5PmhlYWRlciBuYXY6aG92ZXJ7bGVmdDowO3BhZGRpbmc6NjBweCAwIDA7fQ0KYm9keT5oZWFkZXIgbmF2OmhvdmVyIHVse2Rpc3BsYXk6YmxvY2s7fQ0KYm9keT5oZWFkZXIgbmF2IGxpe2Zsb2F0Om5vbmU7ZGlzcGxheTpibG9jazttYXJnaW46MDtib3JkZXItdG9wOjFweCBzb2xpZCAjZWVlO2ZvbnQtc2l6ZToxLjRlbTtoZWlnaHQ6YXV0b30NCmJvZHk+aGVhZGVyIG5hdiBsaTpiZWZvcmV7ZGlzcGxheTpub25lfQ0KYm9keT5oZWFkZXIgbmF2IGxpOmZpcnN0LWNoaWxke2JvcmRlcjpub25lfQ0KYm9keT5oZWFkZXIgbmF2IGF7Y29sb3I6IzNBNkVBNX0NCmJvZHk+aGVhZGVyIG5hdiBhOmhvdmVye2NvbG9yOiMzOWN9DQpib2R5PnNlY3Rpb257bWFyZ2luOjB9DQojbWFpbj5zZWN0aW9uLA0KI21haW4+YXNpZGUsDQojZXh0cmF7LXdlYmtpdC1ib3gtc2hhZG93Om5vbmU7Ym94LXNoYWRvdzpub25lO21hcmdpbjoycHggMCAwfQ0KYm9keT5oZWFkZXI6YmVmb3JlLA0KYm9keT5oZWFkZXIgbmF2OmFmdGVyLA0KI21haW4+c2VjdGlvbjpiZWZvcmUsDQojbWFpbj5zZWN0aW9uOmFmdGVyLA0KI21haW4+YXNpZGU6YmVmb3JlLA0KI21haW4+YXNpZGU6YWZ0ZXIsDQojZXh0cmE6YmVmb3JlLA0KI2V4dHJhOmFmdGVye2Rpc3BsYXk6bm9uZX0NCmFydGljbGU+aGVhZGVyIHRpbWV7ZmxvYXQ6bm9uZTttYXJnaW46MDtsaW5lLWhlaWdodDoxfQ0KI21haW4+YXNpZGUgbGl7ZmxvYXQ6bm9uZTt3aWR0aDphdXRvfQ0KYm9keT5mb290ZXIgaDV7bWFyZ2luOjAgMCA1cHg7fQ0KfQ0K
mip/template/post-istop.phpPGFydGljbGUgY2xhc3M9InRvcCBjYXRleyRhcnRpY2xlLkNhdGVnb3J5LklEfSBhdXRoeyRhcnRpY2xlLkF1dGhvci5JRH0iPg0KICA8aGVhZGVyPg0KICAgIDx0aW1lPnskYXJ0aWNsZS5UaW1lKCdZ5bm0beaciGTml6UnKX08L3RpbWU+DQogICAgPGgyPjxhIGhyZWY9InskYXJ0aWNsZS5Vcmx9Ij5b572u6aG2XSB7JGFydGljbGUuVGl0bGV9PC9hPjwvaDI+DQogIDwvaGVhZGVyPg0KPC9hcnRpY2xlPg==
mip/template/post-multi.phpPGFydGljbGUgaWQ9ImxvZ3skYXJ0aWNsZS5JRH0iIGNsYXNzPSJ0b3AgY2F0ZXskYXJ0aWNsZS5DYXRlZ29yeS5JRH0gYXV0aHskYXJ0aWNsZS5BdXRob3IuSUR9Ij4NCiAgPGhlYWRlcj4NCiAgICA8dGltZT57JGFydGljbGUuVGltZSgnWeW5tG3mnIhk5pelJyl9PC90aW1lPg0KICAgIDxoMj48YSBocmVmPSJ7JGFydGljbGUuVXJsfSI+eyRhcnRpY2xlLlRpdGxlfTwvYT48L2gyPg0KICA8L2hlYWRlcj4NCiAgPHNlY3Rpb24+eyRhcnRpY2xlLkludHJvfTwvc2VjdGlvbj4NCiAgPGZvb3Rlcj4NCntpZiAkYXJ0aWNsZS5UYWdzfQ0KICAgIDxoND7moIfnrb46IHtmb3JlYWNoICRhcnRpY2xlLlRhZ3MgYXMgJHRhZ308YSBocmVmPSJ7JHRhZy5Vcmx9Ij57JHRhZy5OYW1lfTwvYT57L2ZvcmVhY2h9PC9oND4NCnsvaWZ9DQogICAgPGg1PjxlbT7kvZzogIU6eyRhcnRpY2xlLkF1dGhvci5TdGF0aWNOYW1lfTwvZW0+IDxlbT7liIbnsbs6eyRhcnRpY2xlLkNhdGVnb3J5Lk5hbWV9PC9lbT4gPGVtPua1j+iniDo8bWlwLXpibG9ncGhwLWFydGljbGUtdmlld251bSBwb3N0LWlkPSJ7JGFydGljbGUuSUR9IiBkZWZhdWx0PSJ7JGFydGljbGUuVmlld051bXN9IiB1cGRhdGU9IjAiID48L21pcC16YmxvZ3BocC1hcnRpY2xlLXZpZXdudW0+PC9lbT4gPC9oNT4NCiAgPC9mb290ZXI+DQo8L2FydGljbGU+DQoNCg==
mip/template/post-page.phpPGFydGljbGUgaWQ9ImxvZ3skYXJ0aWNsZS5JRH0iPg0KICA8aGVhZGVyPg0KICAgIDxoMj57JGFydGljbGUuVGl0bGV9PC9oMj4NCiAgPC9oZWFkZXI+DQogIDxzZWN0aW9uPnskYXJ0aWNsZS5Db250ZW50fTwvc2VjdGlvbj4NCiAgPGZvb3Rlcj48L2Zvb3Rlcj4NCjwvYXJ0aWNsZT4NCg==
mip/template/post-single.phpPGFydGljbGUgaWQ9ImxvZ3skYXJ0aWNsZS5JRH0iIGNsYXNzPSJ0b3AgY2F0ZXskYXJ0aWNsZS5DYXRlZ29yeS5JRH0gYXV0aHskYXJ0aWNsZS5BdXRob3IuSUR9Ij4NCiAgPGhlYWRlcj4NCiAgICA8dGltZT57JGFydGljbGUuVGltZSgnWeW5tG3mnIhk5pelIEg6aTpzJyl9PC90aW1lPg0KICAgIDxoMj57JGFydGljbGUuVGl0bGV9PC9oMj4NCiAgPC9oZWFkZXI+DQogIDxzZWN0aW9uPnskYXJ0aWNsZS5Db250ZW50fTwvc2VjdGlvbj4NCiAgPGZvb3Rlcj4NCntpZiAkYXJ0aWNsZS5UYWdzfQ0KICAgIDxoND7moIfnrb46IHtmb3JlYWNoICRhcnRpY2xlLlRhZ3MgYXMgJHRhZ308YSBocmVmPSJ7JHRhZy5Vcmx9Ij57JHRhZy5OYW1lfTwvYT57L2ZvcmVhY2h9PC9oND4NCnsvaWZ9DQogICAgPGg1PjxlbT7kvZzogIU6eyRhcnRpY2xlLkF1dGhvci5TdGF0aWNOYW1lfTwvZW0+IDxlbT7liIbnsbs6eyRhcnRpY2xlLkNhdGVnb3J5Lk5hbWV9PC9lbT4gPGVtPua1j+iniDo8bWlwLXpibG9ncGhwLWFydGljbGUtdmlld251bSBwb3N0LWlkPSJ7JGFydGljbGUuSUR9IiBkZWZhdWx0PSJ7JGFydGljbGUuQ29tbU51bXN9IiB1cGRhdGU9IjEiPjwvbWlwLXpibG9ncGhwLWFydGljbGUtdmlld251bT48L2VtPiA8L2g1Pg0KICA8L2Zvb3Rlcj4NCiAgPG5hdj4NCntpZiAkYXJ0aWNsZS5QcmV2fQ0KPGEgY2xhc3M9ImwiIGhyZWY9InskYXJ0aWNsZS5QcmV2LlVybH0iIHRpdGxlPSJ7JGFydGljbGUuUHJldi5UaXRsZX0iPsKrIOS4iuS4gOevhzwvYT4NCnsvaWZ9DQp7aWYgJGFydGljbGUuTmV4dH0NCjxhIGNsYXNzPSJyIiBocmVmPSJ7JGFydGljbGUuTmV4dC5Vcmx9IiB0aXRsZT0ieyRhcnRpY2xlLk5leHQuVGl0bGV9Ij4g5LiL5LiA56+HIMK7PC9hPg0Key9pZn0NCiAgPC9uYXY+DQo8L2FydGljbGU+DQo=
mip/template/single.phpe3RlbXBsYXRlOmhlYWRlcn0NCjxib2R5IGNsYXNzPSJzaW5nbGUiPg0KPGhlYWRlcj4NCjxoMj48YSBocmVmPSJ7JGhvc3R9Ij57JG5hbWV9PC9hPiA8c3VwPnskc3VibmFtZX08L3N1cD48L2gyPg0KPC9oZWFkZXI+DQo8c2VjdGlvbj4NCiAgPHNlY3Rpb24gaWQ9Im1haW4iPg0KICAgIDxzZWN0aW9uPg0Ke2lmICRhcnRpY2xlLlR5cGU9PVpDX1BPU1RfVFlQRV9BUlRJQ0xFfQ0Ke3RlbXBsYXRlOnBvc3Qtc2luZ2xlfQ0Ke2Vsc2V9DQp7dGVtcGxhdGU6cG9zdC1wYWdlfQ0Key9pZn0NCiAgICA8L3NlY3Rpb24+DQogIDwvc2VjdGlvbj4NCjwvc2VjdGlvbj4NCnt0ZW1wbGF0ZTpmb290ZXJ9DQo=
aHR0cDovL3Rlc3QuenN4c29mdC5jb20vemJwaHAvCi9Vc2Vycy9zeC93ZWJzaXRlL3picGhwLw==