diff --git a/dist/prober.php b/dist/prober.php index 2dd442c5..3fb88200 100644 --- a/dist/prober.php +++ b/dist/prober.php @@ -2,7 +2,7 @@ namespace InnStudio\Prober\PreDefine; \define('TIMER', \microtime(true)); \define('DEBUG', false); -\define('LANG', 'eyJodHRwczpcL1wvZ2l0aHViLmNvbVwva212YW5cL3gtcHJvYmVyIjp7InpoLUNOIjoiaHR0cDpcL1wvZ2l0aHViLmNvbVwva212YW5cL3gtcHJvYmVyIiwiemgtVFciOiJodHRwOlwvXC9naXRodWIuY29tXC9rbXZhblwveC1wcm9iZXIiLCJ6aC1ISyI6Imh0dHA6XC9cL2dpdGh1Yi5jb21cL2ttdmFuXC94LXByb2JlciJ9LCJJTk4gU1RVRElPIjp7InpoLUNOIjoiSU5OIFNUVURJTyIsInpoLVRXIjoiSU5OIFNUVURJTyIsInpoLUhLIjoiSU5OIFNUVURJTyJ9LCJodHRwczpcL1wvaW5uLXN0dWRpby5jb21cL3Byb2JlciI6eyJ6aC1DTiI6Imh0dHBzOlwvXC9pbm4tc3R1ZGlvLmNvbVwvcHJvYmVyIiwiemgtVFciOiJodHRwczpcL1wvaW5uLXN0dWRpby5jb21cL3Byb2JlciIsInpoLUhLIjoiaHR0cHM6XC9cL2lubi1zdHVkaW8uY29tXC9wcm9iZXIifSwiWCBQcm9iZXIiOnsiemgtQ04iOiJYIFx1NjNhMlx1OTQ4OCIsInpoLVRXIjoiWCBcdTYzYTJcdTkxZGQiLCJ6aC1ISyI6IlggXHU2M2EyXHU5MWRkIn0sIntBUFBfTkFNRX0gZm91bmQgdXBkYXRlISBWZXJzaW9uIHtBUFBfT0xEX1ZFUlNJT059ICZyYXJyOyB7QVBQX05FV19WRVJTSU9OfSI6eyJ6aC1DTiI6IntBUFBfTkFNRX1cdTUzZDFcdTczYjBcdTY2ZjRcdTY1YjBcdWZmMDFcdTcyNDhcdTY3MmMge0FQUF9PTERfVkVSU0lPTn0gJnJhcnI7IHtBUFBfTkVXX1ZFUlNJT059IiwiemgtVFciOiJ7QVBQX05BTUV9XHU3NjdjXHU3M2ZlXHU2NmY0XHU2NWIwXHVmZjAxXHU3MjQ4XHU2NzJjIHtBUFBfT0xEX1ZFUlNJT059ICZyYXJyOyB7QVBQX05FV19WRVJTSU9OfSIsInpoLUhLIjoie0FQUF9OQU1FfVx1NzY3Y1x1NzNmZVx1NjZmNFx1NjViMFx1ZmYwMVx1NzI0OFx1NjcyYyB7QVBQX09MRF9WRVJTSU9OfSAmcmFycjsge0FQUF9ORVdfVkVSU0lPTn0ifSwiVW5hdmFpbGFibGUiOnsiemgtQ04iOiJcdTRlMGRcdTUzZWZcdTc1MjgiLCJ6aC1UVyI6Ilx1NGUwZFx1NTNlZlx1NzUyOCIsInpoLUhLIjoiXHU0ZTBkXHU1M2VmXHU3NTI4In0sIkZpbGUgY2FuIG5vdCB1cGRhdGUuIjp7InpoLUNOIjoiXHU2NTg3XHU0ZWY2XHU2NWUwXHU2Y2Q1XHU4OGFiXHU2NmY0XHU2NWIwXHUzMDAyIiwiemgtVFciOiJcdTZhOTRcdTY4NDhcdTcxMjFcdTZjZDVcdTg4YWJcdTY2ZjRcdTY1YjBcdTMwMDIiLCJ6aC1ISyI6Ilx1NmE5NFx1Njg0OFx1NzEyMVx1NmNkNVx1ODhhYlx1NjZmNFx1NjViMFx1MzAwMiJ9LCJVcGRhdGUgZmlsZSBub3QgZm91bmQuIjp7InpoLUNOIjoiXHU2NzJhXHU1M2QxXHU3M2IwXHU2NmY0XHU2NWIwXHU2NTg3XHU0ZWY2XHUzMDAyIiwiemgtVFciOiJcdTY3MmFcdTc2N2NcdTczZmVcdTY2ZjRcdTY1YjBcdTZhOTRcdTY4NDhcdTMwMDIiLCJ6aC1ISyI6Ilx1NjcyYVx1NzY3Y1x1NzNmZVx1NjZmNFx1NjViMFx1NmE5NFx1Njg0OFx1MzAwMiJ9LCJVcGRhdGUgc3VjY2Vzcy4uLiI6eyJ6aC1DTiI6Ilx1NjZmNFx1NjViMFx1NjIxMFx1NTI5Zi4uLiIsInpoLVRXIjoiXHU2NmY0XHU2NWIwXHU2MjEwXHU1MjlmLi4uIiwiemgtSEsiOiJcdTY2ZjRcdTY1YjBcdTYyMTBcdTUyOWYuLi4ifSwiVXBkYXRlIGVycm9yLiI6eyJ6aC1DTiI6Ilx1NjZmNFx1NjViMFx1NTFmYVx1OTUxOVx1MzAwMiIsInpoLVRXIjoiXHU2NmY0XHU2NWIwXHU1MWZhXHU5MzJmXHUzMDAyIiwiemgtSEsiOiJcdTY2ZjRcdTY1YjBcdTUxZmFcdTkzMmZcdTMwMDIifSwiVXBkYXRpbmcuLi4iOnsiemgtQ04iOiJcdTY2ZjRcdTY1YjBcdTRlMmQuLi4iLCJ6aC1UVyI6Ilx1NjZmNFx1NjViMFx1NGUyZC4uLiIsInpoLUhLIjoiXHU2NmY0XHU2NWIwXHU0ZTJkLi4uIn0sIlNlcnZlciBzdGF0dXMiOnsiemgtQ04iOiJcdTY3MGRcdTUyYTFcdTU2NjhcdTcyYjZcdTYwMDEiLCJ6aC1UVyI6Ilx1NGYzYVx1NjcwZFx1NTY2OFx1NzJjMFx1NjE0YiIsInpoLUhLIjoiXHU0ZjNhXHU2NzBkXHU1NjY4XHU3MmMwXHU2MTRiIn0sIlN5c3RlbSBsb2FkIjp7InpoLUNOIjoiXHU3Y2ZiXHU3ZWRmXHU4ZDFmXHU4ZjdkIiwiemgtVFciOiJcdTdjZmJcdTdkNzFcdThjYTBcdThmMDkiLCJ6aC1ISyI6Ilx1N2NmYlx1N2Q3MVx1OGNhMFx1OGYwOSJ9LCJOb3Qgc3VwcG9ydCBvbiBXaW5kb3dzIjp7InpoLUNOIjoiV2luZG93cyBcdTdjZmJcdTdlZGZcdTVjMWFcdTY3MmFcdTY1MmZcdTYzMDFcdThiZTVcdTUyOWZcdTgwZmQiLCJ6aC1UVyI6IldpbmRvd3MgXHU3Y2ZiXHU3ZDcxXHU1YzFhXHU2NzJhXHU2NTJmXHU2M2Y0XHU4YTcyXHU1MjlmXHU4MGZkIiwiemgtSEsiOiJXaW5kb3dzIFx1N2NmYlx1N2Q3MVx1NWMxYVx1NjcyYVx1NjUyZlx1NjNmNFx1OGE3Mlx1NTI5Zlx1ODBmZCJ9LCJDUFUgdXNhZ2UiOnsiemgtQ04iOiJDUFUgXHU0ZjdmXHU3NTI4XHU3Mzg3IiwiemgtVFciOiJDUFUgXHU0ZjdmXHU3NTI4XHU3Mzg3IiwiemgtSEsiOiJDUFUgXHU0ZjdmXHU3NTI4XHU3Mzg3In0sIlJlYWwgbWVtb3J5IHVzYWdlIjp7InpoLUNOIjoiXHU3NzFmXHU1YjllXHU1MTg1XHU1YjU4XHU0ZjdmXHU3NTI4IiwiemgtVFciOiJcdTc3MWZcdTViZTZcdThhMThcdTYxYjZcdTlhZDRcdTRmN2ZcdTc1MjgiLCJ6aC1ISyI6Ilx1NzcxZlx1NWJlNlx1OGExOFx1NjFiNlx1OWFkNFx1NGY3Zlx1NzUyOCJ9LCJSZWFsIHN3YXAgdXNhZ2UiOnsiemgtQ04iOiJTV0FQIFx1NGY3Zlx1NzUyOCIsInpoLVRXIjoiU1dBUCBcdTRmN2ZcdTc1MjgiLCJ6aC1ISyI6IlNXQVAgXHU0ZjdmXHU3NTI4In0sIk5ldHdvcmsgc3RhdHMiOnsiemgtQ04iOiJcdTZkNDFcdTkxY2ZcdTdlZGZcdThiYTEiLCJ6aC1UVyI6Ilx1NmQ0MVx1OTFjZlx1N2Q3MVx1OGEwOCIsInpoLUhLIjoiXHU2ZDQxXHU5MWNmXHU3ZDcxXHU4YTA4In0sIlNlcnZlciBpbmZvcm1hdGlvbiI6eyJ6aC1DTiI6Ilx1NjcwZFx1NTJhMVx1NTY2OFx1NGZlMVx1NjA2ZiIsInpoLVRXIjoiXHU0ZjNhXHU2NzBkXHU1NjY4XHU4YTBhXHU2MDZmIiwiemgtSEsiOiJcdTRmM2FcdTY3MGRcdTU2NjhcdThhMGFcdTYwNmYifSwiU2VydmVyIHRpbWUiOnsiemgtQ04iOiJcdTY3MGRcdTUyYTFcdTU2NjhcdTY1ZjZcdTk1ZjQiLCJ6aC1UVyI6Ilx1NGYzYVx1NjcwZFx1NTY2OFx1NjY0Mlx1OTU5MyIsInpoLUhLIjoiXHU0ZjNhXHU2NzBkXHU1NjY4XHU2NjQyXHU5NTkzIn0sIlNlcnZlciB1cHRpbWUiOnsiemgtQ04iOiJcdTYzMDFcdTdlZWRcdThmZDBcdTg4NGNcdTY1ZjZcdTk1ZjQiLCJ6aC1UVyI6Ilx1NjMwMVx1N2U4Y1x1NGUwYVx1N2RkYVx1NjY0Mlx1OTU5MyIsInpoLUhLIjoiXHU2MzAxXHU3ZThjXHU0ZTBhXHU3ZGRhXHU2NjQyXHU5NTkzIn0sIlNlcnZlciBJUCI6eyJ6aC1DTiI6Ilx1NjcwZFx1NTJhMVx1NTY2OCBJUCIsInpoLVRXIjoiXHU0ZjNhXHU2NzBkXHU1NjY4IElQIiwiemgtSEsiOiJcdTRmM2FcdTY3MGRcdTU2NjggSVAifSwiU2VydmVyIG5hbWUiOnsiemgtQ04iOiJcdTY3MGRcdTUyYTFcdTU2NjhcdTU0MGQiLCJ6aC1UVyI6Ilx1NGYzYVx1NjcwZFx1NTY2OFx1NTQwZCIsInpoLUhLIjoiXHU0ZjNhXHU2NzBkXHU1NjY4XHU1NDBkIn0sIlNlcnZlciBzb2Z0d2FyZSI6eyJ6aC1DTiI6Ilx1NjcwZFx1NTJhMVx1NTY2OFx1OGY2Zlx1NGVmNiIsInpoLVRXIjoiXHU0ZjNhXHU2NzBkXHU1NjY4XHU4ZWRmXHU5YWQ0IiwiemgtSEsiOiJcdTRmM2FcdTY3MGRcdTU2NjhcdThlZGZcdTlhZDQifSwiQ1BVIG1vZGVsIjp7InpoLUNOIjoiQ1BVIFx1NTc4Ylx1NTNmNyIsInpoLVRXIjoiQ1BVIFx1NTc4Ylx1ODY1ZiIsInpoLUhLIjoiQ1BVIFx1NTc4Ylx1ODY1ZiJ9LCJTZXJ2ZXIgT1MiOnsiemgtQ04iOiJcdTY3MGRcdTUyYTFcdTU2NjhcdTdjZmJcdTdlZGYiLCJ6aC1UVyI6Ilx1NGYzYVx1NjcwZFx1NTY2OFx1N2NmYlx1N2Q3MSIsInpoLUhLIjoiXHU0ZjNhXHU2NzBkXHU1NjY4XHU3Y2ZiXHU3ZDcxIn0sIlNjcmlwdCBwYXRoIjp7InpoLUNOIjoiXHU4MTFhXHU2NzJjXHU4ZGVmXHU1Zjg0IiwiemgtVFciOiJcdTgxNzNcdTY3MmNcdThkZWZcdTVmOTEiLCJ6aC1ISyI6Ilx1ODE3M1x1NjcyY1x1OGRlZlx1NWY5MSJ9LCJEaXNrIHVzYWdlIjp7InpoLUNOIjoiXHU3OGMxXHU3NmQ4XHU0ZjdmXHU3NTI4IiwiemgtVFciOiJcdTc4YzFcdTc4OWZcdTRmN2ZcdTc1MjgiLCJ6aC1ISyI6Ilx1NzhjMVx1Nzg5Zlx1NGY3Zlx1NzUyOCJ9LCJQSFAgdmVyc2lvbiI6eyJ6aC1DTiI6IlBIUCBcdTcyNDhcdTY3MmMiLCJ6aC1UVyI6IlBIUCBcdTcyNDhcdTY3MmMiLCJ6aC1ISyI6IlBIUCBcdTcyNDhcdTY3MmMifSwiUEhQIGluZm9ybWF0aW9uIjp7InpoLUNOIjoiUEhQIFx1NGZlMVx1NjA2ZiIsInpoLVRXIjoiUEhQIFx1OGEwYVx1NjA2ZiIsInpoLUhLIjoiUEhQIFx1OGEwYVx1NjA2ZiJ9LCJQSFAgaW5mbyBkZXRhaWwiOnsiemgtQ04iOiJQSFAgXHU4YmU2XHU3ZWM2XHU0ZmUxXHU2MDZmIiwiemgtVFciOiJQSFAgXHU4YTczXHU3ZDMwXHU4YTBhXHU2MDZmIiwiemgtIjoiUEhQIFx1OGE3M1x1N2QzMFx1OGEwYVx1NjA2ZiJ9LCJDbGljayB0byBjaGVjayI6eyJ6aC1DTiI6Ilx1NzBiOVx1NTFmYlx1NjdlNVx1NzcwYiIsInpoLVRXIjoiXHU5ZWRlXHU2NGNhXHU2N2U1XHU3NzBiIiwiemgtSEsiOiJcdTllZGVcdTY0Y2FcdTY3ZTVcdTc3MGIifSwiVmVyc2lvbiI6eyJ6aC1DTiI6Ilx1NzI0OFx1NjcyYyIsInpoLVRXIjoiXHU3MjQ4XHU2NzJjIiwiemgtSEsiOiJcdTcyNDhcdTY3MmMifSwiU0FQSSBpbnRlcmZhY2UiOnsiemgtQ04iOiJTQVBJIFx1NjNhNVx1NTNlMyIsInpoLVRXIjoiU0FQSSBcdTRlY2JcdTk3NjIiLCJ6aC1ISyI6IlNBUEkgXHU0ZWNiXHU5NzYyIn0sIkVycm9yIHJlcG9ydGluZyI6eyJ6aC1DTiI6Ilx1OTUxOVx1OGJlZlx1NjJhNVx1NTQ0YSIsInpoLVRXIjoiXHU5MzJmXHU4YWE0XHU1ODMxXHU1NDRhIiwiemgtSEsiOiJcdTkzMmZcdThhYTRcdTU4MzFcdTU0NGEifSwiTWF4IG1lbW9yeSBsaW1pdCI6eyJ6aC1DTiI6Ilx1OGZkMFx1ODg0Y1x1NTE4NVx1NWI1OFx1OTY1MFx1NTIzNiIsInpoLVRXIjoiXHU1N2Y3XHU4ODRjXHU4YTE4XHU2MWI2XHU5YWQ0XHU5NjUwXHU1MjM2IiwiemgtSEsiOiJcdTU3ZjdcdTg4NGNcdThhMThcdTYxYjZcdTlhZDRcdTk2NTBcdTUyMzYifSwiTWF4IFBPU1Qgc2l6ZSI6eyJ6aC1DTiI6IlBPU1QgXHU2M2QwXHU0ZWE0XHU5NjUwXHU1MjM2IiwiemgtVFciOiJQT1NUIFx1NjNkMFx1NGVhNFx1OTY1MFx1NTIzNiIsInpoLUhLIjoiUE9TVCBcdTYzZDBcdTRlYTRcdTk2NTBcdTUyMzYifSwiTWF4IHVwbG9hZCBzaXplIjp7InpoLUNOIjoiXHU0ZTBhXHU0ZjIwXHU2NTg3XHU0ZWY2XHU5NjUwXHU1MjM2IiwiemgtVFciOiJcdTRlMGFcdTUwYjNcdTZhOTRcdTY4NDhcdTk2NTBcdTUyMzYiLCJ6aC1ISyI6Ilx1NGUwYVx1NTBiM1x1NmE5NFx1Njg0OFx1OTY1MFx1NTIzNiJ9LCJNYXggaW5wdXQgdmFyaWFibGVzIjp7InpoLUNOIjoiXHU2M2QwXHU0ZWE0XHU4ODY4XHU1MzU1XHU5NjUwXHU1MjM2IiwiemgtVFciOiJcdTYzZDBcdTRlYTRcdTg4NjhcdTU1YWVcdTk2NTBcdTUyMzYiLCJ6aC1ISyI6Ilx1NjNkMFx1NGVhNFx1ODg2OFx1NTVhZVx1OTY1MFx1NTIzNiJ9LCJNYXggZXhlY3V0aW9uIHRpbWUiOnsiemgtQ04iOiJcdThmZDBcdTg4NGNcdThkODVcdTY1ZjZcdTc5ZDJcdTY1NzAiLCJ6aC1UVyI6Ilx1NTdmN1x1ODg0Y1x1OGQ4NVx1NjY0Mlx1NzlkMlx1NjU3OCIsInpoLUhLIjoiXHU1N2Y3XHU4ODRjXHU4ZDg1XHU2NjQyXHU3OWQyXHU2NTc4In0sIlRpbWVvdXQgZm9yIHNvY2tldCI6eyJ6aC1DTiI6IlNvY2tldCBcdThkODVcdTY1ZjZcdTc5ZDJcdTY1NzAiLCJ6aC1UVyI6IlNvY2tldCBcdThkODVcdTY2NDJcdTc5ZDJcdTY1NzgiLCJ6aC1ISyI6IlNvY2tldCBcdThkODVcdTY2NDJcdTc5ZDJcdTY1NzgifSwiRGlzcGxheSBlcnJvcnMiOnsiemgtQ04iOiJcdTY2M2VcdTc5M2FcdTk1MTlcdThiZWYiLCJ6aC1UVyI6Ilx1OTg2Zlx1NzkzYVx1OTMyZlx1OGFhNCIsInpoLUhLIjoiXHU5ODZmXHU3OTNhXHU5MzJmXHU4YWE0In0sIlRyZWF0bWVudCBVUkxzIGZpbGUiOnsiemgtQ04iOiJcdTY1ODdcdTRlZjZcdThmZGNcdTdhZWZcdTYyNTNcdTVmMDAiLCJ6aC1UVyI6Ilx1NmE5NFx1Njg0OFx1OTA2MFx1N2FlZlx1NjI1M1x1OTU4YiIsInpoLUhLIjoiXHU2YTk0XHU2ODQ4XHU5MDYwXHU3YWVmXHU2MjUzXHU5NThiIn0sIlNNVFAgc3VwcG9ydCI6eyJ6aC1DTiI6IlNNVFAgXHU2NTJmXHU2MzAxIiwiemgtVFciOiJTTVRQIFx1NjUyZlx1NjNmNCIsInpoLUhLIjoiU01UUCBcdTY1MmZcdTYzZjQifSwiRGlzYWJsZWQgZnVuY3Rpb25zIjp7InpoLUNOIjoiXHU3OTgxXHU3NTI4XHU3Njg0XHU1MWZkXHU2NTcwIiwiemgtVFciOiJcdTc5ODFcdTc1MjhcdTc2ODRcdTUxZmRcdTY1NzgiLCJ6aC1ISyI6Ilx1Nzk4MVx1NzUyOFx1NzY4NFx1NTFmZFx1NjU3OCJ9LCJQSFAgZXh0ZW5zaW9ucyI6eyJ6aC1DTiI6IlBIUCBcdTYyNjlcdTVjNTUiLCJ6aC1UVyI6IlBIUCBcdTY0ZjRcdTVjNTUiLCJ6aC1ISyI6IlBIUCBcdTY0ZjRcdTVjNTUifSwiJXMgZXh0ZW5zaW9uIjp7InpoLUNOIjoiJXMgXHU2MjY5XHU1YzU1IiwiemgtVFciOiIlcyBcdTY0ZjRcdTVjNTUiLCJ6aC1ISyI6IiVzIFx1NjRmNFx1NWM1NSJ9LCIlcyBlbmFibGVkIjp7InpoLUNOIjoiJXMgXHU1NDJmXHU3NTI4IiwiemgtVFciOiIlcyBcdTU1NWZcdTc1MjgiLCJ6aC1ISyI6IiVzIFx1NTU1Zlx1NzUyOCJ9LCJMb2FkZWQgZXh0ZW5zaW9ucyI6eyJ6aC1DTiI6Ilx1NTJhMFx1OGY3ZFx1NzY4NCBQSFAgXHU2MjY5XHU1YzU1IiwiemgtVFciOiJcdThmMDlcdTUxNjVcdTc2ODQgUEhQIFx1NjRmNFx1NWM1NSIsInpoLUhLIjoiXHU4ZjA5XHU1MTY1XHU3Njg0IFBIUCBcdTY0ZjRcdTVjNTUifSwiRGF0YWJhc2UiOnsiemgtQ04iOiJcdTY1NzBcdTYzNmVcdTVlOTMiLCJ6aC1UVyI6Ilx1OGNjN1x1NjU5OVx1NWVhYiIsInpoLUhLIjoiXHU4Y2M3XHU2NTk5XHU1ZWFiIn0sIlNlcnZlciBCZW5jaG1hcmsiOnsiemgtQ04iOiJcdTY3MGRcdTUyYTFcdTU2NjhcdTYwMjdcdTgwZmRcdThkZDFcdTUyMDYiLCJ6aC1UVyI6Ilx1NGYzYVx1NjcwZFx1NTY2OFx1NjAyN1x1ODBmZFx1OGRkMVx1NTIwNiIsInpoLUhLIjoiXHU0ZjNhXHU2NzBkXHU1NjY4XHU2MDI3XHU4MGZkXHU4ZGQxXHU1MjA2In0sIkJlbmNobWFyayI6eyJ6aC1DTiI6Ilx1OGRkMVx1NTIwNiIsInpoLVRXIjoiXHU4ZGQxXHU1MjA2IiwiemgtSEsiOiJcdThkZDFcdTUyMDYifSwiXHVkODNkXHVkY2ExIEhpZ2hlciBpcyBiZXR0ZXIuIE5vdGU6IHRoZSBiZW5jaG1hcmsgbWFya3MgYXJlIG5vdCB0aGUgb25seSBjcml0ZXJpb24gZm9yIGV2YWx1YXRpbmcgdGhlIHF1YWxpdHkgb2YgYSBob3N0XC9zZXJ2ZXIuIjp7InpoLUNOIjoiXHVkODNkXHVkY2ExIFx1NTIwNlx1NjU3MFx1OGQ4YVx1OWFkOFx1OGQ4YVx1NTk3ZFx1MzAwMlx1NmNlOFx1ZmYxYVx1OGRkMVx1NTIwNlx1NjU3MFx1NTAzY1x1NWU3Nlx1NGUwZFx1NjYyZlx1OGJjNFx1NGVmN1x1NGUwMFx1NTNmMFx1NGUzYlx1NjczYVx1NjIxNlx1NjcwZFx1NTJhMVx1NTY2OFx1NzY4NFx1NTUyZlx1NGUwMFx1NjgwN1x1NTFjNlx1MzAwMiIsInpoLVRXIjoiXHVkODNkXHVkY2ExIFx1NTIwNlx1NjU3OFx1OGQ4YVx1OWFkOFx1OGQ4YVx1NTk3ZFx1MzAwMlx1NmNlOFx1ZmYxYVx1OGRkMVx1NTIwNlx1NjU3OFx1NTAzY1x1NGUyNlx1NGUwZFx1NjYyZlx1OGE1NVx1NTBmOVx1NGUwMFx1ODFmYVx1NGUzYlx1NmE1Zlx1NjIxNlx1NGYzYVx1NjcwZFx1NTY2OFx1NzY4NFx1NTUyZlx1NGUwMFx1NmU5Nlx1NTI0N1x1MzAwMiIsInpoLUhLIjoiXHVkODNkXHVkY2ExIFx1NTIwNlx1NjU3OFx1OGQ4YVx1OWFkOFx1OGQ4YVx1NTk3ZFx1MzAwMlx1NmNlOFx1ZmYxYVx1OGRkMVx1NTIwNlx1NjU3OFx1NTAzY1x1NGUyNlx1NGUwZFx1NjYyZlx1OGE1NVx1NTBmOVx1NGUwMFx1ODFmYVx1NGUzYlx1NmE1Zlx1NjIxNlx1NGYzYVx1NjcwZFx1NTY2OFx1NzY4NFx1NTUyZlx1NGUwMFx1NmU5Nlx1NTI0N1x1MzAwMiJ9LCJFcnJvciwgY2xpY2sgdG8gcmV0cnkuIjp7InpoLUNOIjoiXHU5NTE5XHU4YmVmXHVmZjBjXHU3MGI5XHU1MWZiXHU5MWNkXHU4YmQ1IiwiemgtVFciOiJcdTkzMmZcdThhYTRcdWZmMGNcdTllZGVcdTY0Y2FcdTkxY2RcdThhNjYiLCJ6aC1ISyI6Ilx1OTMyZlx1OGFhNFx1ZmYwY1x1OWVkZVx1NjRjYVx1OTFjZFx1OGE2NiJ9LCJQbGVhc2Ugd2FpdCAlZCBzZWNvbmRzIjp7InpoLUNOIjoiXHU4YmY3XHU3YjQ5XHU1Zjg1ICVkIFx1NzlkMiIsInpoLVRXIjoiXHU4YWNiXHU3YjQ5XHU1Zjg1ICVkIFx1NzlkMiIsInpoLUhLIjoiXHU4YWNiXHU3YjQ5XHU1Zjg1ICVkIFx1NzlkMiJ9LCJMb2FkaW5nLi4uIjp7InpoLUNOIjoiXHU1MmEwXHU4ZjdkXHU0ZTJkXHUyMDI2XHUyMDI2IiwiemgtVFciOiJcdThmMDlcdTUxNjVcdTRlMmRcdTIwMjZcdTIwMjYiLCJ6aC1ISyI6Ilx1OGYwOVx1NTE2NVx1NGUyZFx1MjAyNlx1MjAyNiJ9LCJNeSBzZXJ2ZXIiOnsiemgtQ04iOiJcdTYyMTFcdTc2ODRcdTY3MGRcdTUyYTFcdTU2NjgiLCJ6aC1UVyI6Ilx1NjIxMVx1NzY4NFx1NGYzYVx1NjcwZFx1NTY2OCJ9LCJDbGljayB0byB0ZXN0Ijp7InpoLUNOIjoiXHU3MGI5XHU1MWZiXHU2ZDRiXHU4YmQ1IiwiemgtVFciOiJcdTllZGVcdTY0Y2FcdTZlMmNcdThhNjYiLCJ6aC1ISyI6Ilx1OWVkZVx1NjRjYVx1NmUyY1x1OGE2NiJ9LCJBbGl5dW5cL0VDUyI6eyJ6aC1DTiI6Ilx1OTYzZlx1OTFjY1x1NGU5MVwvRUNTIiwiemgtVFciOiJcdTk2M2ZcdTkxY2NcdTk2ZjJcL0VDUyIsInpoLUhLIjoiXHU5NjNmXHU5MWNjXHU5NmYyXC9FQ1MifSwiU3BhcnRhbkhvc3RcL0tWTSI6eyJ6aC1DTiI6Ilx1NjVhZlx1NWRmNFx1OGZiZVwvS1ZNIiwiemgtVFciOiJcdTY1YWZcdTVkZjRcdTkwNTRcL0tWTSIsInpoLUhLIjoiXHU2NWFmXHU1ZGY0XHU5MDU0XC9LVk0ifSwiVnVsdHIiOnsiemgtQ04iOiJWdWx0ciIsInpoLVRXIjoiVnVsdHIiLCJ6aC1ISyI6IlZ1bHRyIn0sIkFueU5vZGVcL0hERCI6eyJ6aC1DTiI6IkFueU5vZGVcL0hERCIsInpoLVRXIjoiQW55Tm9kZVwvSEREIiwiemgtSEsiOiJBbnlOb2RlXC9IREQifSwiVGVuY2VudCI6eyJ6aC1DTiI6Ilx1ODE3ZVx1OGJhZlx1NGU5MSIsInpoLVRXIjoiXHU5YTMwXHU4YTBhXHU5NmYyIiwiemgtSEsiOiJcdTlhMzBcdThhMGFcdTk2ZjIifSwiQW1hem9uXC9FQzIiOnsiemgtQ04iOiJcdTRlOWFcdTlhNmNcdTkwMGFcL0VDMiIsInpoLVRXIjoiXHU0ZTllXHU5OWFjXHU5MDVjXC9FQzIiLCJ6aC1ISyI6Ilx1NGU5ZVx1OTlhY1x1OTA1Y1wvRUMyIn0sIk15IGluZm9ybWF0aW9uIjp7InpoLUNOIjoiXHU2MjExXHU3Njg0XHU0ZmUxXHU2MDZmIiwiemgtVFciOiJcdTYyMTFcdTc2ODRcdThhMGFcdTYwNmYiLCJ6aC1ISyI6Ilx1NjIxMVx1NzY4NFx1OGEwYVx1NjA2ZiJ9LCJNeSBJUCI6eyJ6aC1DTiI6Ilx1NjIxMVx1NzY4NCBJUCIsInpoLVRXIjoiXHU2MjExXHU3Njg0IElQIiwiemgtSEsiOiJcdTYyMTFcdTc2ODQgSVAifSwiTXkgYnJvd3NlciBVQSI6eyJ6aC1DTiI6Ilx1NjIxMVx1NzY4NFx1NmQ0Zlx1ODljOFx1NTY2OCBVQSIsInpoLVRXIjoiXHU2MjExXHU3Njg0XHU3MDBmXHU4OWJkXHU1NjY4IFVBIiwiemgtSEsiOiJcdTYyMTFcdTc2ODRcdTcwMGZcdTg5YmRcdTU2NjggVUEifSwiTXkgYnJvd3NlciBsYW5ndWFnZSI6eyJ6aC1DTiI6Ilx1NjIxMVx1NzY4NFx1NmQ0Zlx1ODljOFx1NTY2OFx1OGJlZFx1OGEwMCIsInpoLVRXIjoiXHU2MjExXHU3Njg0XHU3MDBmXHU4OWJkXHU1NjY4XHU4YTllXHU4YTAwIiwiemgtSEsiOiJcdTYyMTFcdTc2ODRcdTcwMGZcdTg5YmRcdTU2NjhcdThhOWVcdThhMDAifSwiR2VuZXJhdG9yICVzIjp7InpoLUNOIjoiXHU4YmU1XHU5ODc1XHU5NzYyXHU3NTMxICVzIFx1NzUxZlx1NjIxMCIsInpoLVRXIjoiXHU4YTcyXHU5ODAxXHU5NzYyXHU3NTMxICVzIFx1NzUxZlx1NjIxMCIsInpoLUhLIjoiXHU4YTcyXHU5ODAxXHU5NzYyXHU3NTMxICVzIFx1NzUxZlx1NjIxMCJ9LCJBdXRob3IgJXMiOnsiemgtQ04iOiJcdTRmNWNcdTgwMDVcdTRlM2EgJXMiLCJ6aC1UVyI6Ilx1NGY1Y1x1ODAwNVx1NzBiYSAlcyIsInpoLUhLIjoiXHU0ZjVjXHU4MDA1XHU3MGJhICVzIn19'); +\define('LANG', 'eyJ6aF9DTiI6eyJQbGVhc2Ugd2FpdCAlZCBzZWNvbmRzIjoiXHU4YmY3XHU3YjQ5XHU1Zjg1ICVkIFx1NzlkMiIsIkRhdGFiYXNlIjoiXHU2NTcwXHU2MzZlXHU1ZTkzIiwiREIiOiJcdTY1NzBcdTYzNmVcdTVlOTMiLCJTUUxpdGUzIjoiIiwiU1FMaXRlIjoiIiwiTXlTUUxpIGNsaWVudCI6IiIsIk1vbmdvIjoiIiwiTW9uZ29EQiI6IiIsIlBvc3RncmVTUUwiOiIiLCJQYXJhZG94IjoiUGFyIiwiTWljcm9zb2Z0IFNRTCBTZXJ2ZXIgRHJpdmVyIGZvciBQSFAiOiIiLCJNUyBTUUwiOiIiLCJGaWxlIFBybyI6IiIsIk1heERCIGNsaWVudCI6IiIsIk1heERCIHNlcnZlciI6IiIsIkdlbmVyYXRvciAlcyI6Ilx1OGJlNVx1OTg3NVx1OTc2Mlx1NzUzMSAlcyBcdTc1MWZcdTYyMTAiLCJBdXRob3IgJXMiOiJcdTRmNWNcdTgwMDVcdTRlM2EgJXMiLCJVbmF2YWlsYWJsZSI6Ilx1NGUwZFx1NTNlZlx1NzUyOCIsIiVzIGNhY2hlIjoiJXMgXHU3ZjEzXHU1YjU4IiwiJTEkZGQgJTIkZGggJTMkZG0gJTQkZHMiOiIlMSRkIFx1NTkyOSAlMiRkIFx1NjVmNiAlMyRkIFx1NTIwNiAlNCRkIFx1NzlkMiIsIk5vdCBzdXBwb3J0IG9uIFdpbmRvd3MiOiJXaW5kb3dzIFx1N2NmYlx1N2VkZlx1NWMxYVx1NjcyYVx1NjUyZlx1NjMwMVx1OGJlNVx1NTI5Zlx1ODBmZCIsIiVkIG1pbjoiOiIlZCBcdTUyMDZcdWZmMWEiLCJNeSBpbmZvcm1hdGlvbiI6Ilx1NjIxMVx1NzY4NFx1NGZlMVx1NjA2ZiIsIk1pbmUiOiJcdTYyMTFcdTc2ODQiLCJOZXR3b3JrIHN0YXRzIjoiXHU2ZDQxXHU5MWNmXHU3ZWRmXHU4YmExIiwiTmV0IjoiXHU3ZjUxXHU3ZWRjIiwiUEhQIGV4dGVuc2lvbnMiOiJQSFAgXHU2MjY5XHU1YzU1IiwiRXh0IjoiXHU2MjY5XHU1YzU1IiwiJXMgZXh0ZW5zaW9uIjoiJXMgXHU2MjY5XHU1YzU1IiwiJXMgZW5hYmxlZCI6IiVzIFx1NWRmMlx1NTQyZlx1NzUyOCIsIlplbmQgT3B0aW1pemVyIjoiWmVuZCBcdTRmMThcdTUzMTZcdTU2NjgiLCJMb2FkZWQgZXh0ZW5zaW9ucyI6Ilx1NWRmMlx1NTJhMFx1OGY3ZFx1NzY4NFx1NjI2OVx1NWM1NSIsIlBIUCBpbmZvcm1hdGlvbiI6IlBIUCBcdTRmZTFcdTYwNmYiLCJQSFAiOiJQSFAiLCJQSFAgaW5mbyBkZXRhaWwiOiJQSFAgXHU4YmU2XHU3ZWM2XHU0ZmUxXHU2MDZmIiwiVmVyc2lvbiI6Ilx1NzI0OFx1NjcyYyIsIlNBUEkgaW50ZXJmYWNlIjoiU0FQSSBcdTYzYTVcdTUzZTMiLCJFcnJvciByZXBvcnRpbmciOiJcdTk1MTlcdThiZWZcdTYyYTVcdTU0NGEiLCJNYXggbWVtb3J5IGxpbWl0IjoiXHU4ZmQwXHU4ODRjXHU1MTg1XHU1YjU4XHU5NjUwXHU1MjM2IiwiTWF4IFBPU1Qgc2l6ZSI6IlBPU1QgXHU2M2QwXHU0ZWE0XHU5NjUwXHU1MjM2IiwiTWF4IHVwbG9hZCBzaXplIjoiXHU0ZTBhXHU0ZjIwXHU2NTg3XHU0ZWY2XHU5NjUwXHU1MjM2IiwiTWF4IGlucHV0IHZhcmlhYmxlcyI6Ilx1NjNkMFx1NGVhNFx1ODg2OFx1NTM1NVx1OTY1MFx1NTIzNiIsIk1heCBleGVjdXRpb24gdGltZSI6Ilx1OGZkMFx1ODg0Y1x1OGQ4NVx1NjVmNlx1NzlkMlx1NjU3MCIsIlRpbWVvdXQgZm9yIHNvY2tldCI6IlNvY2tldCBcdThkODVcdTY1ZjZcdTc5ZDJcdTY1NzAiLCJEaXNwbGF5IGVycm9ycyI6Ilx1NjYzZVx1NzkzYVx1OTUxOVx1OGJlZiIsIlRyZWF0bWVudCBVUkxzIGZpbGUiOiJcdTY1ODdcdTRlZjZcdThmZGNcdTdhZWZcdTYyNTNcdTVmMDAiLCJTTVRQIHN1cHBvcnQiOiJTTVRQIFx1NjUyZlx1NjMwMSIsIkRpc2FibGVkIGZ1bmN0aW9ucyI6Ilx1NWRmMlx1Nzk4MVx1NzUyOFx1NzY4NFx1NTFmZFx1NjU3MCIsIlNlcnZlciBCZW5jaG1hcmsiOiJcdTY3MGRcdTUyYTFcdTU2NjhcdThkZDFcdTUyMDYiLCJCZW5jaG1hcmsiOiJcdThkZDFcdTUyMDYiLCJcdWQ4M2RcdWRjYTEgSGlnaGVyIGlzIGJldHRlci4gTm90ZTogdGhlIGJlbmNobWFyayBtYXJrcyBhcmUgbm90IHRoZSBvbmx5IGNyaXRlcmlvbiBmb3IgZXZhbHVhdGluZyB0aGUgcXVhbGl0eSBvZiBhIGhvc3RcL3NlcnZlci4iOiJcdWQ4M2RcdWRjYTEgXHU1MjA2XHU2NTcwXHU4ZDhhXHU5YWQ4XHU4ZDhhXHU1OTdkXHUzMDAyXHU2Y2U4XHU2MTBmXHVmZjFhXHU4ZGQxXHU1MjA2XHU3ZWQzXHU2NzljXHU0ZTBkXHU2NjJmXHU4YmM0XHU0ZWY3XHU2NzBkXHU1MmExXHU1NjY4XHU0ZjE4XHU1MmEzXHU3Njg0XHU1NTJmXHU0ZTAwXHU2ODA3XHU1MWM2XHUzMDAyIiwiRXJyb3IsIGNsaWNrIHRvIHJldHJ5IjoiXHU5NTE5XHU4YmVmXHVmZjBjXHU3MGI5XHU1MWZiXHU5MWNkXHU4YmQ1IiwiTG9hZGluZy4uLiI6Ilx1NTJhMFx1OGY3ZFx1NGUyZFx1MjAyNlx1MjAyNiIsIkFtYXpvblwvRUMyIjoiXHU0ZTlhXHU5YTZjXHU5MDBhXC9FQzIiLCJWUFNTRVJWRVJcL0tWTSI6IlZQU1NFUlZFUlwvS1ZNIiwiU3BhcnRhbkhvc3RcL0tWTSI6Ilx1NjVhZlx1NWRmNFx1OGZiZVwvS1ZNIiwiQWxpeXVuXC9FQ1MiOiJcdTk2M2ZcdTkxY2NcdTRlOTFcL0VDUyIsIlZ1bHRyIjoiVnVsdHIiLCJSYW1Ob2RlIjoiUmFtTm9kZSIsIkxpbm9kZSI6Ikxpbm9kZSIsIlRlbmNlbnQiOiJcdTgxN2VcdThiYWZcdTRlOTEiLCJBbnlOb2RlXC9IREQiOiJBbnlOb2RlXC9IREQiLCJCYW5kd2Fnb25IT1NUXC9TU0QiOiJcdTY0MmNcdTc0ZTZcdTVkZTVcL1NTRCIsIk15IHNlcnZlciI6Ilx1NjIxMVx1NzY4NFx1NjcwZFx1NTJhMVx1NTY2OCIsIkNsaWNrIHRvIHRlc3QiOiJcdTcwYjlcdTUxZmJcdTZkNGJcdThiZDUiLCJTZXJ2ZXIgaW5mb3JtYXRpb24iOiJcdTY3MGRcdTUyYTFcdTU2NjhcdTRmZTFcdTYwNmYiLCJJbmZvIjoiXHU0ZmUxXHU2MDZmIiwiU2VydmVyIG5hbWUiOiJcdTY3MGRcdTUyYTFcdTU2NjhcdTU0MGQiLCJTZXJ2ZXIgdGltZSI6Ilx1NjcwZFx1NTJhMVx1NTY2OFx1NjVmNlx1OTVmNCIsIlNlcnZlciB1cHRpbWUiOiJcdTYzMDFcdTdlZWRcdThmZDBcdTRmNWNcdTY1ZjZcdTk1ZjQiLCJTZXJ2ZXIgSVAiOiJcdTY3MGRcdTUyYTFcdTU2NjggSVAiLCJTZXJ2ZXIgc29mdHdhcmUiOiJcdTY3MGRcdTUyYTFcdTU2NjhcdThmNmZcdTRlZjYiLCJQSFAgdmVyc2lvbiI6IlBIUCBcdTcyNDhcdTY3MmMiLCJDUFUgbW9kZWwiOiJDUFUgXHU1NzhiXHU1M2Y3IiwiU2VydmVyIE9TIjoiXHU2NzBkXHU1MmExXHU1NjY4XHU3Y2ZiXHU3ZWRmIiwiU2NyaXB0IHBhdGgiOiJcdTgxMWFcdTY3MmNcdThkZWZcdTVmODQiLCJEaXNrIHVzYWdlIjoiXHU3OGMxXHU3NmQ4XHU0ZjdmXHU3NTI4XHU5MWNmIiwiU2VydmVyIHN0YXR1cyI6Ilx1NjcwZFx1NTJhMVx1NTY2OFx1NzJiNlx1NjAwMSIsIlN0YXR1cyI6Ilx1NzJiNlx1NjAwMSIsIlN5c3RlbSBsb2FkIjoiXHU3Y2ZiXHU3ZWRmXHU4ZDFmXHU4ZjdkIiwiQ1BVIHVzYWdlIjoiQ1BVIFx1NGY3Zlx1NzUyOFx1NzM4NyIsIlJlYWwgbWVtb3J5IHVzYWdlIjoiXHU3NzFmXHU1YjllXHU1MTg1XHU1YjU4XHU0ZjdmXHU3NTI4IiwiUmVhbCBzd2FwIHVzYWdlIjoiU1dBUCBcdTRmN2ZcdTc1MjgiLCJGaWxlIGNhbiBub3QgdXBkYXRlLiI6Ilx1NjVlMFx1NmNkNVx1NjZmNFx1NjViMFx1NjU4N1x1NGVmNlx1MzAwMiIsIlVwZGF0ZSBmaWxlIG5vdCBmb3VuZC4iOiJcdTY3MmFcdTYyN2VcdTUyMzBcdTY2ZjRcdTY1YjBcdTY1ODdcdTRlZjZcdTMwMDIiLCJVcGRhdGUgc3VjY2Vzcy4uLiI6Ilx1NjZmNFx1NjViMFx1NjIxMFx1NTI5Zlx1MjAyNlx1MjAyNiIsIlVwZGF0ZSBlcnJvci4iOiJcdTY2ZjRcdTY1YjBcdTUxZmFcdTk1MTlcdTMwMDIifSwiemhfVFciOnsiUGxlYXNlIHdhaXQgJWQgc2Vjb25kcyI6Ilx1OGFjYlx1N2I0OVx1NWY4NSAlZCBcdTc5ZDIiLCJEYXRhYmFzZSI6Ilx1OGNjN1x1NjU5OVx1NWVhYiIsIkRCIjoiXHU4Y2M3XHU2NTk5XHU1ZWFiIiwiU1FMaXRlMyI6IiIsIlNRTGl0ZSI6IiIsIk15U1FMaSBjbGllbnQiOiIiLCJNb25nbyI6IiIsIk1vbmdvREIiOiIiLCJQb3N0Z3JlU1FMIjoiIiwiUGFyYWRveCI6IiIsIk1pY3Jvc29mdCBTUUwgU2VydmVyIERyaXZlciBmb3IgUEhQIjoiIiwiTVMgU1FMIjoiIiwiRmlsZSBQcm8iOiIiLCJNYXhEQiBjbGllbnQiOiIiLCJNYXhEQiBzZXJ2ZXIiOiIiLCJHZW5lcmF0b3IgJXMiOiJcdThhNzJcdTk4MDFcdTk3NjJcdTc1MzEgJXMgXHU3NTFmXHU2MjEwIiwiQXV0aG9yICVzIjoiXHU0ZjVjXHU4MDA1XHU3MGJhICVzIiwiVW5hdmFpbGFibGUiOiJcdTRlMGRcdTUzZWZcdTc1MjgiLCIlcyBjYWNoZSI6IiIsIiUxJGRkICUyJGRoICUzJGRtICU0JGRzIjoiIiwiTm90IHN1cHBvcnQgb24gV2luZG93cyI6IldpbmRvd3MgXHU3Y2ZiXHU3ZDcxXHU1YzFhXHU2NzJhXHU2NTJmXHU2M2Y0XHU4YTcyXHU1MjlmXHU4MGZkXHQiLCIlZCBtaW46IjoiIiwiTXkgaW5mb3JtYXRpb24iOiJcdTYyMTFcdTc2ODRcdThhMGFcdTYwNmYiLCJNaW5lIjoiXHU2MjExXHU3Njg0IiwiTmV0d29yayBzdGF0cyI6Ilx1NmQ0MVx1OTFjZlx1N2Q3MVx1OGEwOCIsIk5ldCI6Ilx1NmQ0MVx1OTFjZiIsIlBIUCBleHRlbnNpb25zIjoiUEhQIFx1NjRmNFx1NWM1NSIsIkV4dCI6Ilx1NjRmNFx1NWM1NSIsIiVzIGV4dGVuc2lvbiI6IiVzIFx1NjRmNFx1NWM1NSIsIiVzIGVuYWJsZWQiOiIlcyBcdTU1NWZcdTc1MjgiLCJaZW5kIE9wdGltaXplciI6IiIsIkxvYWRlZCBleHRlbnNpb25zIjoiXHU4ZjA5XHU1MTY1XHU3Njg0IFBIUCBcdTY0ZjRcdTVjNTUiLCJQSFAgaW5mb3JtYXRpb24iOiJQSFAgXHU4YTBhXHU2MDZmIiwiUEhQIjoiUEhQIiwiUEhQIGluZm8gZGV0YWlsIjoiUEhQIFx1OGE3M1x1N2QzMFx1OGEwYVx1NjA2ZiIsIlZlcnNpb24iOiJcdTcyNDhcdTY3MmMiLCJTQVBJIGludGVyZmFjZSI6IlNBUEkgXHU0ZWNiXHU5NzYyIiwiRXJyb3IgcmVwb3J0aW5nIjoiXHU5MzJmXHU4YWE0XHU1ODMxXHU1NDRhIiwiTWF4IG1lbW9yeSBsaW1pdCI6Ilx1NTdmN1x1ODg0Y1x1OGExOFx1NjFiNlx1OWFkNFx1OTY1MFx1NTIzNiIsIk1heCBQT1NUIHNpemUiOiJQT1NUIFx1NjNkMFx1NGVhNFx1OTY1MFx1NTIzNiIsIk1heCB1cGxvYWQgc2l6ZSI6Ilx1NGUwYVx1NTBiM1x1NmE5NFx1Njg0OFx1OTY1MFx1NTIzNiIsIk1heCBpbnB1dCB2YXJpYWJsZXMiOiJcdTYzZDBcdTRlYTRcdTg4NjhcdTU1YWVcdTk2NTBcdTUyMzYiLCJNYXggZXhlY3V0aW9uIHRpbWUiOiJcdTU3ZjdcdTg4NGNcdThkODVcdTY2NDJcdTc5ZDJcdTY1NzgiLCJUaW1lb3V0IGZvciBzb2NrZXQiOiJTb2NrZXQgXHU4ZDg1XHU2NjQyXHU3OWQyXHU2NTc4IiwiRGlzcGxheSBlcnJvcnMiOiJcdTk4NmZcdTc5M2FcdTkzMmZcdThhYTQiLCJUcmVhdG1lbnQgVVJMcyBmaWxlIjoiXHU2YTk0XHU2ODQ4XHU5MDYwXHU3YWVmXHU2MjUzXHU5NThiIiwiU01UUCBzdXBwb3J0IjoiU01UUCBcdTY1MmZcdTYzZjQiLCJEaXNhYmxlZCBmdW5jdGlvbnMiOiJcdTc5ODFcdTc1MjhcdTc2ODRcdTUxZmRcdTY1NzgiLCJTZXJ2ZXIgQmVuY2htYXJrIjoiXHU0ZjNhXHU2NzBkXHU1NjY4XHU2MDI3XHU4MGZkXHU4ZGQxXHU1MjA2IiwiQmVuY2htYXJrIjoiXHU4ZGQxXHU1MjA2IiwiXHVkODNkXHVkY2ExIEhpZ2hlciBpcyBiZXR0ZXIuIE5vdGU6IHRoZSBiZW5jaG1hcmsgbWFya3MgYXJlIG5vdCB0aGUgb25seSBjcml0ZXJpb24gZm9yIGV2YWx1YXRpbmcgdGhlIHF1YWxpdHkgb2YgYSBob3N0XC9zZXJ2ZXIuIjoiXHVkODNkXHVkY2ExIFx1NTIwNlx1NjU3OFx1OGQ4YVx1OWFkOFx1OGQ4YVx1NTk3ZFx1MzAwMlx1NmNlOFx1ZmYxYVx1OGRkMVx1NTIwNlx1NjU3OFx1NTAzY1x1NGUyNlx1NGUwZFx1NjYyZlx1OGE1NVx1NTBmOVx1NGUwMFx1ODFmYVx1NGUzYlx1NmE1Zlx1NjIxNlx1NGYzYVx1NjcwZFx1NTY2OFx1NzY4NFx1NTUyZlx1NGUwMFx1NmU5Nlx1NTI0N1x1MzAwMiIsIkVycm9yLCBjbGljayB0byByZXRyeSI6Ilx1OTMyZlx1OGFhNFx1ZmYwY1x1OWVkZVx1NjRjYVx1OTFjZFx1OGE2NiIsIkxvYWRpbmcuLi4iOiJcdThmMDlcdTUxNjVcdTRlMmRcdTIwMjZcdTIwMjYiLCJBbWF6b25cL0VDMiI6Ilx1NGU5ZVx1OTlhY1x1OTA1Y1wvRUMyIiwiVlBTU0VSVkVSXC9LVk0iOiJWUFNTRVJWRVJcL0tWTSIsIlNwYXJ0YW5Ib3N0XC9LVk0iOiJcdTY1YWZcdTVkZjRcdTkwNTRcL0tWTSIsIkFsaXl1blwvRUNTIjoiXHU5NjNmXHU5MWNjXHU5NmYyXC9FQ1MiLCJWdWx0ciI6IlZ1bHRyIiwiUmFtTm9kZSI6IlJhbU5vZGUiLCJMaW5vZGUiOiJMaW5vZGUiLCJUZW5jZW50IjoiXHU5YTMwXHU4YTBhXHU5NmYyIiwiQW55Tm9kZVwvSEREIjoiQW55Tm9kZVwvSEREIiwiQmFuZHdhZ29uSE9TVFwvU1NEIjoiIiwiTXkgc2VydmVyIjoiXHU2MjExXHU3Njg0XHU0ZjNhXHU2NzBkXHU1NjY4IiwiQ2xpY2sgdG8gdGVzdCI6Ilx1OWVkZVx1NjRjYVx1NmUyY1x1OGE2NiIsIlNlcnZlciBpbmZvcm1hdGlvbiI6Ilx1NGYzYVx1NjcwZFx1NTY2OFx1OGEwYVx1NjA2ZiIsIkluZm8iOiJcdThhMGFcdTYwNmYiLCJTZXJ2ZXIgbmFtZSI6Ilx1NGYzYVx1NjcwZFx1NTY2OFx1NTQwZCIsIlNlcnZlciB0aW1lIjoiXHU2MzAxXHU3ZThjXHU0ZTBhXHU3ZGRhXHU2NjQyXHU5NTkzIiwiU2VydmVyIHVwdGltZSI6Ilx1NjMwMVx1N2U4Y1x1NGUwYVx1N2RkYVx1NjY0Mlx1OTU5MyIsIlNlcnZlciBJUCI6Ilx1NGYzYVx1NjcwZFx1NTY2OCBJUCIsIlNlcnZlciBzb2Z0d2FyZSI6Ilx1NGYzYVx1NjcwZFx1NTY2OFx1OGVkZlx1OWFkNCIsIlBIUCB2ZXJzaW9uIjoiUEhQIFx1NzI0OFx1NjcyYyIsIkNQVSBtb2RlbCI6IkNQVSBcdTU3OGJcdTg2NWYiLCJTZXJ2ZXIgT1MiOiJcdTRmM2FcdTY3MGRcdTU2NjhcdTdjZmJcdTdkNzEiLCJTY3JpcHQgcGF0aCI6Ilx1ODE3M1x1NjcyY1x1OGRlZlx1NWY5MSIsIkRpc2sgdXNhZ2UiOiJcdTc4YzFcdTc4OWZcdTRmN2ZcdTc1MjgiLCJTZXJ2ZXIgc3RhdHVzIjoiXHU0ZjNhXHU2NzBkXHU1NjY4XHU3MmMwXHU2MTRiIiwiU3RhdHVzIjoiXHU3MmMwXHU2MTRiIiwiU3lzdGVtIGxvYWQiOiJcdTdjZmJcdTdkNzFcdThjYTBcdThmMDkiLCJDUFUgdXNhZ2UiOiJDUFUgXHU0ZjdmXHU3NTI4XHU3Mzg3IiwiUmVhbCBtZW1vcnkgdXNhZ2UiOiJcdTc3MWZcdTViZTZcdThhMThcdTYxYjZcdTlhZDRcdTRmN2ZcdTc1MjgiLCJSZWFsIHN3YXAgdXNhZ2UiOiJTV0FQIFx1NGY3Zlx1NzUyOCIsIkZpbGUgY2FuIG5vdCB1cGRhdGUuIjoiXHU2YTk0XHU2ODQ4XHU3MTIxXHU2Y2Q1XHU4OGFiXHU2NmY0XHU2NWIwXHUzMDAyIiwiVXBkYXRlIGZpbGUgbm90IGZvdW5kLiI6Ilx1NjcyYVx1NzY3Y1x1NzNmZVx1NjZmNFx1NjViMFx1NmE5NFx1Njg0OFx1MzAwMiIsIlVwZGF0ZSBzdWNjZXNzLi4uIjoiXHU2NmY0XHU2NWIwXHU2MjEwXHU1MjlmXHUyMDI2XHUyMDI2IiwiVXBkYXRlIGVycm9yLiI6Ilx1NjZmNFx1NjViMFx1NTFmYVx1OTMyZlx1MzAwMiJ9fQ=='); namespace InnStudio\Prober\Nav; use InnStudio\Prober\Events\Api as Events; class Nav { private $ID = 'nav'; public function __construct() { Events::on('script', array($this, 'filterScript')); Events::on('style', array($this, 'filterStyle')); } public function filterStyle() { echo << .nav { @@ -71,12 +71,12 @@ HTML; } } -namespace InnStudio\Prober\PhpExtensionInfo; use InnStudio\Prober\Events\Api as Events; use InnStudio\Prober\Helper\Api as Helper; use InnStudio\Prober\I18n\Api as I18n; class PhpExtensionInfo { private $ID = 'phpExtensionInfo'; public function __construct() { Events::patch('mods', array($this, 'filter'), 400); } public function filter($mods) { $mods[$this->ID] = array( 'title' => I18n::_('PHP extensions'), 'tinyTitle' => I18n::_('Ext'), 'display' => array($this, 'display'), ); return $mods; } public function display() { echo <<ID] = array( 'title' => I18nApi::_('PHP extensions'), 'tinyTitle' => I18nApi::_('Ext'), 'display' => array($this, 'display'), ); return $mods; } public function display() { echo << {$this->getContent()} HTML; -} private function getContent() { $items = array( array( 'label' => \sprintf(I18n::_('%s extension'), 'Memcache'), 'content' => Helper::getIni(0, \extension_loaded('memcache') && \class_exists('\\Memcache')), ), array( 'label' => \sprintf(I18n::_('%s extension'), 'Memcached'), 'content' => Helper::getIni(0, \extension_loaded('memcached') && \class_exists('\\Memcached')), ), array( 'label' => \sprintf(I18n::_('%s extension'), 'Redis'), 'content' => Helper::getIni(0, \extension_loaded('redis') && \class_exists('\\Redis')), ), array( 'label' => \sprintf(I18n::_('%s extension'), 'Opcache'), 'content' => Helper::getIni(0, \function_exists('\\opcache_get_configuration')), ), array( 'label' => \sprintf(I18n::_('%s enabled'), 'Opcache'), 'content' => Helper::getIni(0, $this->isOpcEnabled()), ), array( 'label' => \sprintf(I18n::_('%s extension'), 'Swoole'), 'content' => Helper::getIni(0, \extension_loaded('Swoole') && \function_exists('\\swoole_version')), ), array( 'label' => \sprintf(I18n::_('%s extension'), 'Imagick'), 'content' => Helper::getIni(0, \extension_loaded('Imagick') && \class_exists('\\Imagick')), ), array( 'label' => \sprintf(I18n::_('%s extension'), 'Exif'), 'content' => Helper::getIni(0, \extension_loaded('Exif') && \function_exists('\\exif_imagetype')), ), array( 'label' => \sprintf(I18n::_('%s extension'), 'Sockets'), 'content' => Helper::getIni(0, \extension_loaded('Sockets') && \function_exists('\\socket_accept')), ), array( 'label' => \sprintf(I18n::_('%s extension'), 'MySQLi'), 'content' => Helper::getIni(0, \extension_loaded('MySQLi') && \class_exists('\\mysqli')), ), array( 'label' => \sprintf(I18n::_('%s extension'), 'Zip'), 'content' => Helper::getIni(0, \extension_loaded('Zip') && \class_exists('\\ZipArchive')), ), array( 'label' => \sprintf(I18n::_('%s extension'), 'Multibyte String'), 'content' => Helper::getIni(0, \extension_loaded('mbstring') && \function_exists('\\mb_substr')), ), array( 'label' => I18n::_('Zend Optimizer'), 'content' => Helper::getIni(0, \function_exists('zend_optimizer_version')), ), array( 'col' => '1-1', 'label' => I18n::_('Loaded extensions'), 'title' => 'loaded_extensions', 'content' => \implode(', ', $this->getLoadedExtensions(true)) ?: '-', ), ); $itemsOrder = array(); foreach ($items as $item) { $itemsOrder[] = $item['label']; } \array_multisort($items, $itemsOrder); $content = ''; foreach ($items as $item) { $title = isset($item['title']) ? "title=\"{$item['title']}\"" : ''; $col = isset($item['col']) ? $item['col'] : '1-3'; $id = isset($item['id']) ? "id=\"{$item['id']}\"" : ''; $content .= << \sprintf(I18nApi::_('%s extension'), 'Memcache'), 'content' => Helper::getIni(0, \extension_loaded('memcache') && \class_exists('\\Memcache')), ), array( 'label' => \sprintf(I18nApi::_('%s extension'), 'Memcached'), 'content' => Helper::getIni(0, \extension_loaded('memcached') && \class_exists('\\Memcached')), ), array( 'label' => \sprintf(I18nApi::_('%s extension'), 'Redis'), 'content' => Helper::getIni(0, \extension_loaded('redis') && \class_exists('\\Redis')), ), array( 'label' => \sprintf(I18nApi::_('%s extension'), 'Opcache'), 'content' => Helper::getIni(0, \function_exists('\\opcache_get_configuration')), ), array( 'label' => \sprintf(I18nApi::_('%s enabled'), 'Opcache'), 'content' => Helper::getIni(0, $this->isOpcEnabled()), ), array( 'label' => \sprintf(I18nApi::_('%s extension'), 'Swoole'), 'content' => Helper::getIni(0, \extension_loaded('Swoole') && \function_exists('\\swoole_version')), ), array( 'label' => \sprintf(I18nApi::_('%s extension'), 'Imagick'), 'content' => Helper::getIni(0, \extension_loaded('Imagick') && \class_exists('\\Imagick')), ), array( 'label' => \sprintf(I18nApi::_('%s extension'), 'Exif'), 'content' => Helper::getIni(0, \extension_loaded('Exif') && \function_exists('\\exif_imagetype')), ), array( 'label' => \sprintf(I18nApi::_('%s extension'), 'Sockets'), 'content' => Helper::getIni(0, \extension_loaded('Sockets') && \function_exists('\\socket_accept')), ), array( 'label' => \sprintf(I18nApi::_('%s extension'), 'MySQLi'), 'content' => Helper::getIni(0, \extension_loaded('MySQLi') && \class_exists('\\mysqli')), ), array( 'label' => \sprintf(I18nApi::_('%s extension'), 'Zip'), 'content' => Helper::getIni(0, \extension_loaded('Zip') && \class_exists('\\ZipArchive')), ), array( 'label' => \sprintf(I18nApi::_('%s extension'), 'Multibyte String'), 'content' => Helper::getIni(0, \extension_loaded('mbstring') && \function_exists('\\mb_substr')), ), array( 'label' => I18nApi::_('Zend Optimizer'), 'content' => Helper::getIni(0, \function_exists('zend_optimizer_version')), ), array( 'col' => '1-1', 'label' => I18nApi::_('Loaded extensions'), 'title' => 'loaded_extensions', 'content' => \implode(', ', $this->getLoadedExtensions(true)) ?: '-', ), ); $itemsOrder = array(); foreach ($items as $item) { $itemsOrder[] = $item['label']; } \array_multisort($items, $itemsOrder); $content = ''; foreach ($items as $item) { $title = isset($item['title']) ? "title=\"{$item['title']}\"" : ''; $col = isset($item['col']) ? $item['col'] : '1-3'; $id = isset($item['id']) ? "id=\"{$item['id']}\"" : ''; $content .= <<
{$item['label']}
@@ -85,10 +85,10 @@
HTML; } return $content; } private function getLoadedExtensions($sorted = false) { $exts = \get_loaded_extensions(); if ($sorted) { \sort($exts); } return $exts; } private function isOpcEnabled() { $isOpcEnabled = \function_exists('\\opcache_get_configuration'); if ($isOpcEnabled) { $isOpcEnabled = \opcache_get_configuration(); $isOpcEnabled = isset($isOpcEnabled['directives']['opcache.enable']) && true === $isOpcEnabled['directives']['opcache.enable']; } return $isOpcEnabled; } } -namespace InnStudio\Prober\Helper; use InnStudio\Prober\I18n\Api as I18n; class Api { public static function dieJson($data) { \header('Content-Type: application/json'); die(\json_encode($data)); } public static function isAction($action) { return \filter_input(INPUT_GET, 'action', FILTER_SANITIZE_STRING) === $action; } public static function getWinCpuUsage() { $cpus = array(); if (\class_exists('\\COM')) { $wmi = new \COM('Winmgmts://'); $server = $wmi->execquery('SELECT LoadPercentage FROM Win32_Processor'); $cpus = array(); foreach ($server as $cpu) { $total += (int) $cpu->loadpercentage; } $total = (int) $total / \count($server); $cpus['idle'] = 100 - $total; $cpus['user'] = $total; } else { \exec('wmic cpu get LoadPercentage', $p); if (isset($p[1])) { $percent = (int) $p[1]; $cpus['idle'] = 100 - $percent; $cpus['user'] = $percent; } } return $cpus; } public static function getNetworkStats() { $filePath = '/proc/net/dev'; if ( ! \is_readable($filePath)) { return I18n::_('Unavailable'); } static $eths = null; if (null !== $eths) { return $eths; } $lines = \file($filePath); unset($lines[0], $lines[1]); $eths = array(); foreach ($lines as $line) { $line = \preg_replace('/\s+/', ' ', \trim($line)); $lineArr = \explode(':', $line); $numberArr = \explode(' ', \trim($lineArr[1])); $eths[$lineArr[0]] = array( 'rx' => (int) $numberArr[0], 'tx' => (int) $numberArr[8], ); } return $eths; } public static function getBtn($tx, $url) { return <<execquery('SELECT LoadPercentage FROM Win32_Processor'); $cpus = array(); foreach ($server as $cpu) { $total += (int) $cpu->loadpercentage; } $total = (int) $total / \count($server); $cpus['idle'] = 100 - $total; $cpus['user'] = $total; } else { \exec('wmic cpu get LoadPercentage', $p); if (isset($p[1])) { $percent = (int) $p[1]; $cpus['idle'] = 100 - $percent; $cpus['user'] = $percent; } } return $cpus; } public static function getNetworkStats() { $filePath = '/proc/net/dev'; if ( ! \is_readable($filePath)) { return I18nApi::_('Unavailable'); } static $eths = null; if (null !== $eths) { return $eths; } $lines = \file($filePath); unset($lines[0], $lines[1]); $eths = array(); foreach ($lines as $line) { $line = \preg_replace('/\s+/', ' ', \trim($line)); $lineArr = \explode(':', $line); $numberArr = \explode(' ', \trim($lineArr[1])); $eths[$lineArr[0]] = array( 'rx' => (int) $numberArr[0], 'tx' => (int) $numberArr[8], ); } return $eths; } public static function getBtn($tx, $url) { return <<{$tx} HTML; -} public static function getDiskTotalSpace($human = false) { static $space = null; if (null === $space) { $dir = self::isWin() ? 'C:' : '/'; if (!is_readable($dir)) { $space = 0; return 0; } $space = \disk_total_space($dir); } if ( ! $space) { return 0; } if (true === $human) { return self::formatBytes($space); } return $space; } public static function getDiskFreeSpace($human = false) { static $space = null; if (null === $space) { try { $space = \disk_free_space('/'); } catch (\Exception $e) { $space = 0; } } if ( ! $space) { return 0; } if (true === $human) { return self::formatBytes($space); } return $space; } public static function getCpuModel() { $filePath = '/proc/cpuinfo'; if ( ! \is_readable($filePath)) { return I18n::_('Unavailable'); } $content = \file_get_contents($filePath); $cores = \substr_count($content, 'cache size'); $lines = \explode("\n", $content); $modelName = \explode(':', $lines[4]); $modelName = \trim($modelName[1]); $cacheSize = \explode(':', $lines[8]); $cacheSize = \trim($cacheSize[1]); return "{$cores} x {$modelName} / " . \sprintf(I18n::_('%s cache'), $cacheSize); } public static function getServerTime() { return \date('Y-m-d H:i:s'); } public static function getServerUpTime() { $filePath = '/proc/uptime'; if ( ! \is_readable($filePath)) { return I18n::_('Unavailable'); } $str = \file_get_contents($filePath); $num = (float) $str; $secs = \fmod($num, 60); $num = (int) ($num / 60); $mins = $num % 60; $num = (int) ($num / 60); $hours = $num % 24; $num = (int) ($num / 24); $days = $num; return \sprintf( I18n::_('%1$dd %2$dh %3$dm %4$ds'), $days, $hours, $mins, $secs ); } public static function getErrNameByCode($code) { switch ($code) { case E_ERROR: return 'E_ERROR'; case E_WARNING: return 'E_WARNING'; case E_PARSE: return 'E_PARSE'; case E_NOTICE: return 'E_NOTICE'; case E_CORE_ERROR: return 'E_CORE_ERROR'; case E_CORE_WARNING: return 'E_CORE_WARNING'; case E_COMPILE_ERROR: return 'E_COMPILE_ERROR'; case E_COMPILE_WARNING: return 'E_COMPILE_WARNING'; case E_USER_ERROR: return 'E_USER_ERROR'; case E_USER_WARNING: return 'E_USER_WARNING'; case E_USER_NOTICE: return 'E_USER_NOTICE'; case E_STRICT: return 'E_STRICT'; case E_RECOVERABLE_ERROR: return 'E_RECOVERABLE_ERROR'; case E_DEPRECATED: return 'E_DEPRECATED'; case E_USER_DEPRECATED: return 'E_USER_DEPRECATED'; case E_ALL: return 'E_ALL'; } return $code; } public static function getIni($id, $forceSet = null) { if (true === $forceSet) { $ini = 1; } elseif (false === $forceSet) { $ini = 0; } else { $ini = \ini_get($id); } if ( ! \is_numeric($ini) && '' !== (string) $ini) { return $ini; } if (1 === (int) $ini) { return << 'E_ALL', \E_USER_DEPRECATED => 'E_USER_DEPRECATED', \E_DEPRECATED => 'E_DEPRECATED', \E_RECOVERABLE_ERROR => 'E_RECOVERABLE_ERROR', \E_STRICT => 'E_STRICT', \E_USER_NOTICE => 'E_USER_NOTICE', \E_USER_WARNING => 'E_USER_WARNING', \E_USER_ERROR => 'E_USER_ERROR', \E_COMPILE_WARNING => 'E_COMPILE_WARNING', \E_COMPILE_ERROR => 'E_COMPILE_ERROR', \E_CORE_WARNING => 'E_CORE_WARNING', \E_CORE_ERROR => 'E_CORE_ERROR', \E_NOTICE => 'E_NOTICE', \E_PARSE => 'E_PARSE', \E_WARNING => 'E_WARNING', \E_ERROR => 'E_ERROR', ); $result = ''; foreach ($levels as $number => $name) { if (($code & $number) == $number) { $result .= ('' != $result ? ', ' : '') . $name; } } return $result; } public static function getIni($id, $forceSet = null) { if (true === $forceSet) { $ini = 1; } elseif (false === $forceSet) { $ini = 0; } else { $ini = \ini_get($id); } if ( ! \is_numeric($ini) && '' !== (string) $ini) { return $ini; } if (1 === (int) $ini) { return <<✓ HTML; } elseif (0 === (int) $ini) { return <<{$k} {$v} HTML; -} return $html; } public static function getHumanCpuUsage() { $cpu = self::getCpuUsage(); return $cpu ?: array(); } public static function getSysLoadAvg() { if (self::isWin()) { return I18n::_('Not support on Windows'); } $avg = \sys_getloadavg(); $langMin = function ($n) { return \sprintf(I18n::_('%d min:'), $n); }; $avg[0] = << -{$langMin(1)} -{$avg[0]} +{$load} HTML; -$avg[1] = << -{$langMin(5)} -{$avg[1]} - -HTML; -$avg[2] = << -{$langMin(15)} -{$avg[2]} - -HTML; -return \implode('', $avg); } public static function getMemoryUsage($key) { $key = \ucfirst($key); if (self::isWin()) { return 0; } static $memInfo = null; if (null === $memInfo) { $memInfoFile = '/proc/meminfo'; if ( ! \is_readable($memInfoFile)) { $memInfo = 0; return 0; } $memInfo = \file_get_contents($memInfoFile); $memInfo = \str_replace(array( ' kB', ' ', ), '', $memInfo); $lines = array(); foreach (\explode("\n", $memInfo) as $line) { if ( ! $line) { continue; } $line = \explode(':', $line); $lines[$line[0]] = (int) $line[1]; } $memInfo = $lines; } switch ($key) { case 'MemRealUsage': $memAvailable = 0; if (isset($memInfo['MemAvailable'])) { $memAvailable = $memInfo['MemAvailable']; } elseif (isset($memInfo['MemFree'])) { $memAvailable = $memInfo['MemFree']; } return $memInfo['MemTotal'] - $memAvailable; case 'SwapRealUsage': if ( ! isset($memInfo['SwapTotal']) || ! isset($memInfo['SwapFree']) || ! isset($memInfo['SwapCached'])) { return 0; } return $memInfo['SwapTotal'] - $memInfo['SwapFree'] - $memInfo['SwapCached']; } return isset($memInfo[$key]) ? (int) $memInfo[$key] : 0; } public static function formatBytes($bytes, $precision = 2) { if ( ! $bytes) { return 0; } $base = \log($bytes, 1024); $suffixes = array('', ' K', ' M', ' G', ' T'); return \round(\pow(1024, $base - \floor($base)), $precision) . $suffixes[\floor($base)]; } public static function getHumamMemUsage($key) { return self::formatBytes(self::getMemoryUsage($key) * 1024); } } -namespace InnStudio\Prober\Benchmark; use InnStudio\Prober\Events\Api as Events; use InnStudio\Prober\Helper\Api as Helper; use InnStudio\Prober\I18n\Api as I18n; class Benchmark { private $EXPIRED = 60; public function __construct() { Events::on('init', array($this, 'filter')); } public function filter() { if ( ! Helper::isAction('benchmark')) { return; } $this->display(); } private function getTmpRecorderPath() { return \sys_get_temp_dir() . \DIRECTORY_SEPARATOR . 'xproberBenchmarkTimer'; } private function saveTmpRecorder() { return (bool) \file_put_contents($this->getTmpRecorderPath(), \json_encode(array( 'expired' => (int) $_SERVER['REQUEST_TIME'] + $this->EXPIRED, ))); } private function getRemainingSeconds() { $path = $this->getTmpRecorderPath(); if ( ! \is_readable($path)) { return 0; } $data = (string) \file_get_contents($this->getTmpRecorderPath()); if ( ! $data) { return 0; } $data = \json_decode($data, true); if ( ! $data) { return 0; } $expired = isset($data['expired']) ? (int) $data['expired'] : 0; if ( ! $expired) { return 0; } return $expired > (int) $_SERVER['REQUEST_TIME'] ? $expired - (int) $_SERVER['REQUEST_TIME'] : 0; } private function getPointsByTime($time) { return \pow(10, 3) - (int) ($time * \pow(10, 3)); } private function getHashPoints() { $data = 'inn-studio.com'; $hash = array('md5', 'sha512', 'sha256', 'crc32'); $count = \pow(10, 5); $start = \microtime(true); for ($i = 0; $i < $count; ++$i) { foreach ($hash as $v) { \hash($v, $data); } } return $this->getPointsByTime(\microtime(true) - $start); } private function getIntLoopPoints() { $j = 0; $count = \pow(10, 7); $start = \microtime(true); for ($i = 0; $i < $count; ++$i) { ++$j; } return $this->getPointsByTime(\microtime(true) - $start); } private function getFloatLoopPoints() { $j = 1 / 3; $count = \pow(10, 7); $start = \microtime(true); for ($i = 0; $i < $count; ++$i) { ++$j; } return $this->getPointsByTime(\microtime(true) - $start); } private function getIoLoopPoints() { $tmpDir = \sys_get_temp_dir(); if ( ! \is_writable($tmpDir)) { return 0; } $count = \pow(10, 4); $start = \microtime(true); for ($i = 0; $i < $count; ++$i) { $filePath = "{$tmpDir}/innStudioIoBenchmark:{$i}"; \file_put_contents($filePath, $filePath); \unlink($filePath); } return $this->getPointsByTime(\microtime(true) - $start); } private function getPoints() { return array( 'hash' => $this->getHashPoints(), 'intLoop' => $this->getIntLoopPoints(), 'floatLoop' => $this->getFloatLoopPoints(), 'ioLoop' => $this->getIoLoopPoints(), ); } private function display() { $remainingSeconds = $this->getRemainingSeconds(); if ($remainingSeconds) { Helper::dieJson(array( 'code' => -1, 'msg' => \sprintf(I18n::_('Please wait %d seconds'), $remainingSeconds), )); } $this->saveTmpRecorder(); \set_time_limit(0); Helper::dieJson(array( 'code' => 0, 'data' => array( 'points' => $this->getPoints(), ), )); } } +}, $avg); return \implode('', $avg); } public static function getMemoryUsage($key) { $key = \ucfirst($key); if (self::isWin()) { return 0; } static $memInfo = null; if (null === $memInfo) { $memInfoFile = '/proc/meminfo'; if ( ! \is_readable($memInfoFile)) { $memInfo = 0; return 0; } $memInfo = \file_get_contents($memInfoFile); $memInfo = \str_replace(array( ' kB', ' ', ), '', $memInfo); $lines = array(); foreach (\explode("\n", $memInfo) as $line) { if ( ! $line) { continue; } $line = \explode(':', $line); $lines[$line[0]] = (int) $line[1]; } $memInfo = $lines; } switch ($key) { case 'MemRealUsage': $memAvailable = 0; if (isset($memInfo['MemAvailable'])) { $memAvailable = $memInfo['MemAvailable']; } elseif (isset($memInfo['MemFree'])) { $memAvailable = $memInfo['MemFree']; } return $memInfo['MemTotal'] - $memAvailable; case 'SwapRealUsage': if ( ! isset($memInfo['SwapTotal']) || ! isset($memInfo['SwapFree']) || ! isset($memInfo['SwapCached'])) { return 0; } return $memInfo['SwapTotal'] - $memInfo['SwapFree'] - $memInfo['SwapCached']; } return isset($memInfo[$key]) ? (int) $memInfo[$key] : 0; } public static function formatBytes($bytes, $precision = 2) { if ( ! $bytes) { return 0; } $base = \log($bytes, 1024); $suffixes = array('', ' K', ' M', ' G', ' T'); return \round(\pow(1024, $base - \floor($base)), $precision) . $suffixes[\floor($base)]; } public static function getHumamMemUsage($key) { return self::formatBytes(self::getMemoryUsage($key) * 1024); } public static function strcut($str, $len = 20) { if (\strlen($str) > $len) { return \mb_strcut($str, 0, $len) . '...'; } return $str; } } +namespace InnStudio\Prober\Benchmark; use InnStudio\Prober\Events\Api as Events; use InnStudio\Prober\Helper\Api as Helper; use InnStudio\Prober\I18n\I18nApi; class Benchmark { private $EXPIRED = 60; public function __construct() { Events::on('init', array($this, 'filter')); } public function filter() { if ( ! Helper::isAction('benchmark')) { return; } $this->display(); } private function getTmpRecorderPath() { return \sys_get_temp_dir() . \DIRECTORY_SEPARATOR . 'xproberBenchmarkTimer'; } private function saveTmpRecorder() { return (bool) \file_put_contents($this->getTmpRecorderPath(), \json_encode(array( 'expired' => (int) $_SERVER['REQUEST_TIME'] + $this->EXPIRED, ))); } private function getRemainingSeconds() { $path = $this->getTmpRecorderPath(); if ( ! \is_readable($path)) { return 0; } $data = (string) \file_get_contents($this->getTmpRecorderPath()); if ( ! $data) { return 0; } $data = \json_decode($data, true); if ( ! $data) { return 0; } $expired = isset($data['expired']) ? (int) $data['expired'] : 0; if ( ! $expired) { return 0; } return $expired > (int) $_SERVER['REQUEST_TIME'] ? $expired - (int) $_SERVER['REQUEST_TIME'] : 0; } private function getPointsByTime($time) { return \pow(10, 3) - (int) ($time * \pow(10, 3)); } private function getHashPoints() { $data = 'inn-studio.com'; $hash = array('md5', 'sha512', 'sha256', 'crc32'); $count = \pow(10, 5); $start = \microtime(true); for ($i = 0; $i < $count; ++$i) { foreach ($hash as $v) { \hash($v, $data); } } return $this->getPointsByTime(\microtime(true) - $start); } private function getIntLoopPoints() { $j = 0; $count = \pow(10, 7); $start = \microtime(true); for ($i = 0; $i < $count; ++$i) { ++$j; } return $this->getPointsByTime(\microtime(true) - $start); } private function getFloatLoopPoints() { $j = 1 / 3; $count = \pow(10, 7); $start = \microtime(true); for ($i = 0; $i < $count; ++$i) { ++$j; } return $this->getPointsByTime(\microtime(true) - $start); } private function getIoLoopPoints() { $tmpDir = \sys_get_temp_dir(); if ( ! \is_writable($tmpDir)) { return 0; } $count = \pow(10, 4); $start = \microtime(true); for ($i = 0; $i < $count; ++$i) { $filePath = "{$tmpDir}/innStudioIoBenchmark:{$i}"; \file_put_contents($filePath, $filePath); \unlink($filePath); } return $this->getPointsByTime(\microtime(true) - $start); } private function getPoints() { return array( 'hash' => $this->getHashPoints(), 'intLoop' => $this->getIntLoopPoints(), 'floatLoop' => $this->getFloatLoopPoints(), 'ioLoop' => $this->getIoLoopPoints(), ); } private function display() { $remainingSeconds = $this->getRemainingSeconds(); if ($remainingSeconds) { Helper::dieJson(array( 'code' => -1, 'msg' => \sprintf(I18nApi::_('Please wait %d seconds'), $remainingSeconds), )); } $this->saveTmpRecorder(); \set_time_limit(0); Helper::dieJson(array( 'code' => 0, 'data' => array( 'points' => $this->getPoints(), ), )); } } namespace InnStudio\Prober\PhpInfoDetail; use InnStudio\Prober\Events\Api as Events; use InnStudio\Prober\Helper\Api as Helper; class PhpInfoDetail { public function __construct() { Events::on('init', array($this, 'filter')); } public function filter() { if (Helper::isAction('phpInfo')) { \phpinfo(); die; } } } -namespace InnStudio\Prober\Entry; use InnStudio\Prober\Config\Api as Config; use InnStudio\Prober\Events\Api as Events; use InnStudio\Prober\Helper\Api as Helper; use InnStudio\Prober\I18n\Api as I18n; class Entry { public function __construct() { Events::emit('init'); if (DEBUG === true) { $this->display(); } else { \ob_start(); $this->display(); $content = \ob_get_contents(); \ob_end_clean(); echo Helper::htmlMinify($content); } } private function displayContent() { $mods = Events::apply('mods', array()); if ( ! $mods) { return; } foreach ($mods as $id => $mod) { ?> +namespace InnStudio\Prober\Entry; use InnStudio\Prober\Config\Api as Config; use InnStudio\Prober\Events\Api as Events; use InnStudio\Prober\Helper\Api as Helper; use InnStudio\Prober\I18n\I18nApi; class Entry { public function __construct() { Events::emit('init'); if (DEBUG === true) { $this->display(); } else { \ob_start(); $this->display(); $content = \ob_get_contents(); \ob_end_clean(); echo Helper::htmlMinify($content); } } private function displayContent() { $mods = Events::apply('mods', array()); if ( ! $mods) { return; } foreach ($mods as $id => $mod) { ?>
@@ -135,12 +122,12 @@ -<?php echo I18n::_(Config::$APP_NAME); ?> v<?php echo Config::$APP_VERSION; ?> +<?php echo I18nApi::_(Config::$APP_NAME); ?> v<?php echo Config::$APP_VERSION; ?>
-

v

+

v

displayContent(); ?>
@@ -149,12 +136,12 @@ ID] = array( 'title' => I18n::_('Database'), 'tinyTitle' => I18n::_('DB'), 'display' => array($this, 'display'), ); return $mods; } public function display() { ?> +namespace InnStudio\Prober\Database; use InnStudio\Prober\Events\Api as Events; use InnStudio\Prober\Helper\Api as Helper; use InnStudio\Prober\I18n\I18nApi; class Database { private $ID = 'database'; public function __construct() { Events::patch('mods', array($this, 'filter'), 500); } public function filter($mods) { $mods[$this->ID] = array( 'title' => I18nApi::_('Database'), 'tinyTitle' => I18nApi::_('DB'), 'display' => array($this, 'display'), ); return $mods; } public function display() { ?>
getContent(); ?>
I18n::_('SQLite3'), 'content' => $sqlite3Version, ), array( 'title' => 'sqlite_libversion', 'label' => I18n::_('SQLite'), 'content' => \function_exists('\\sqlite_libversion') ? Helper::getIni(0, true) . ' ' . \sqlite_libversion() : Helper::getIni(0, false), ), array( 'title' => 'mysqli_get_client_version', 'label' => I18n::_('MySQLi client'), 'content' => \function_exists('\\mysqli_get_client_version') ? Helper::getIni(0, true) . ' ' . \mysqli_get_client_version() : Helper::getIni(0, false), ), array( 'label' => I18n::_('Mongo'), 'content' => \class_exists('\\Mongo') ? \MongoClient::VERSION : Helper::getIni(0, false), ), array( 'label' => I18n::_('MongoDB'), 'content' => \class_exists('\\MongoDB') ? Helper::getIni(0, true) : Helper::getIni(0, false), ), array( 'label' => I18n::_('PostgreSQL'), 'content' => \function_exists('\\pg_connect') ? Helper::getIni(0, true) : Helper::getIni(0, false), ), array( 'label' => I18n::_('Paradox'), 'content' => \function_exists('\\px_new') ? Helper::getIni(0, true) : Helper::getIni(0, false), ), array( 'title' => I18n::_('Microsoft SQL Server Driver for PHP'), 'label' => I18n::_('MS SQL'), 'content' => \function_exists('\\sqlsrv_server_info') ? Helper::getIni(0, true) : Helper::getIni(0, false), ), array( 'label' => I18n::_('File Pro'), 'content' => \function_exists('\\filepro') ? Helper::getIni(0, true) : Helper::getIni(0, false), ), array( 'label' => I18n::_('MaxDB client'), 'content' => \function_exists('\\maxdb_get_client_version') ? \maxdb_get_client_version() : Helper::getIni(0, false), ), array( 'label' => I18n::_('MaxDB server'), 'content' => \function_exists('\\maxdb_get_server_version') ? Helper::getIni(0, true) : Helper::getIni(0, false), ), ); $content = ''; foreach ($items as $item) { $title = isset($item['title']) ? "title=\"{$item['title']}\"" : ''; $col = isset($item['col']) ? $item['col'] : '1-3'; $id = isset($item['id']) ? "id=\"{$item['id']}\"" : ''; echo << I18nApi::_('SQLite3'), 'content' => $sqlite3Version, ), array( 'title' => 'sqlite_libversion', 'label' => I18nApi::_('SQLite'), 'content' => \function_exists('\\sqlite_libversion') ? Helper::getIni(0, true) . ' ' . \sqlite_libversion() : Helper::getIni(0, false), ), array( 'title' => 'mysqli_get_client_version', 'label' => I18nApi::_('MySQLi client'), 'content' => \function_exists('\\mysqli_get_client_version') ? Helper::getIni(0, true) . ' ' . \mysqli_get_client_version() : Helper::getIni(0, false), ), array( 'label' => I18nApi::_('Mongo'), 'content' => \class_exists('\\Mongo') ? \MongoClient::VERSION : Helper::getIni(0, false), ), array( 'label' => I18nApi::_('MongoDB'), 'content' => \class_exists('\\MongoDB') ? Helper::getIni(0, true) : Helper::getIni(0, false), ), array( 'label' => I18nApi::_('PostgreSQL'), 'content' => \function_exists('\\pg_connect') ? Helper::getIni(0, true) : Helper::getIni(0, false), ), array( 'label' => I18nApi::_('Paradox'), 'content' => \function_exists('\\px_new') ? Helper::getIni(0, true) : Helper::getIni(0, false), ), array( 'title' => I18nApi::_('Microsoft SQL Server Driver for PHP'), 'label' => I18nApi::_('MS SQL'), 'content' => \function_exists('\\sqlsrv_server_info') ? Helper::getIni(0, true) : Helper::getIni(0, false), ), array( 'label' => I18nApi::_('File Pro'), 'content' => \function_exists('\\filepro') ? Helper::getIni(0, true) : Helper::getIni(0, false), ), array( 'label' => I18nApi::_('MaxDB client'), 'content' => \function_exists('\\maxdb_get_client_version') ? \maxdb_get_client_version() : Helper::getIni(0, false), ), array( 'label' => I18nApi::_('MaxDB server'), 'content' => \function_exists('\\maxdb_get_server_version') ? Helper::getIni(0, true) : Helper::getIni(0, false), ), ); $content = ''; foreach ($items as $item) { $title = isset($item['title']) ? "title=\"{$item['title']}\"" : ''; $col = isset($item['col']) ? $item['col'] : '1-3'; $id = isset($item['id']) ? "id=\"{$item['id']}\"" : ''; echo <<
{$item['label']}
@@ -163,12 +150,12 @@
HTML; } } } -namespace InnStudio\Prober\PhpInfo; use InnStudio\Prober\Events\Api as Events; use InnStudio\Prober\Helper\Api as Helper; use InnStudio\Prober\I18n\Api as I18n; class PhpInfo { private $ID = 'phpInfo'; public function __construct() { Events::patch('mods', array($this, 'filter'), 300); } public function filter($mods) { $mods[$this->ID] = array( 'title' => I18n::_('PHP information'), 'tinyTitle' => I18n::_('PHP'), 'display' => array($this, 'display'), ); return $mods; } public function display() { ?> +namespace InnStudio\Prober\PhpInfo; use InnStudio\Prober\Events\Api as Events; use InnStudio\Prober\Helper\Api as Helper; use InnStudio\Prober\I18n\I18nApi; class PhpInfo { private $ID = 'phpInfo'; public function __construct() { Events::patch('mods', array($this, 'filter'), 300); } public function filter($mods) { $mods[$this->ID] = array( 'title' => I18nApi::_('PHP information'), 'tinyTitle' => I18nApi::_('PHP'), 'display' => array($this, 'display'), ); return $mods; } public function display() { ?>
getContent(); ?>
$this->_('PHP info detail'), 'content' => Helper::getBtn("👆 {$this->_('Click to check')}", '?action=phpInfo'), ), array( 'label' => $this->_('Version'), 'content' => PHP_VERSION, ), array( 'label' => $this->_('SAPI interface'), 'content' => PHP_SAPI, ), array( 'label' => $this->_('Error reporting'), 'title' => 'error_reporting', 'content' => Helper::getErrNameByCode(\ini_get('error_reporting')), ), array( 'label' => $this->_('Max memory limit'), 'title' => 'memory_limit', 'content' => \ini_get('memory_limit'), ), array( 'label' => $this->_('Max POST size'), 'title' => 'post_max_size', 'content' => \ini_get('post_max_size'), ), array( 'label' => $this->_('Max upload size'), 'title' => 'upload_max_filesize', 'content' => \ini_get('upload_max_filesize'), ), array( 'label' => $this->_('Max input variables'), 'title' => 'max_input_vars', 'content' => \ini_get('max_input_vars'), ), array( 'label' => $this->_('Max execution time'), 'title' => 'max_execution_time', 'content' => \ini_get('max_execution_time'), ), array( 'label' => $this->_('Timeout for socket'), 'title' => 'default_socket_timeout', 'content' => \ini_get('default_socket_timeout'), ), array( 'label' => $this->_('Display errors'), 'title' => 'display_errors', 'content' => Helper::getIni('display_errors'), ), array( 'label' => $this->_('Treatment URLs file'), 'title' => 'allow_url_fopen', 'content' => Helper::getIni('allow_url_fopen'), ), array( 'label' => $this->_('SMTP support'), 'title' => 'SMTP', 'content' => Helper::getIni('SMTP') ?: Helper::getIni(0, false), ), array( 'col' => '1-1', 'label' => $this->_('Disabled functions'), 'title' => 'disable_functions', 'content' => \implode(', ', \explode(',', Helper::getIni('disable_functions'))) ?: '-', ), ); $content = ''; foreach ($items as $item) { $title = isset($item['title']) ? "title=\"{$item['title']}\"" : ''; $col = isset($item['col']) ? $item['col'] : '1-3'; $id = isset($item['id']) ? "id=\"{$item['id']}\"" : ''; $content .= << $this->_('PHP info detail'), 'content' => Helper::getBtn("👆 {$this->_('Click to check')}", '?action=phpInfo'), ), array( 'label' => $this->_('Version'), 'content' => PHP_VERSION, ), array( 'label' => $this->_('SAPI interface'), 'content' => PHP_SAPI, ), array( 'label' => $this->_('Error reporting'), 'title' => "error_reporting: {$errLevels}", 'content' => Helper::strcut($errLevels), ), array( 'label' => $this->_('Max memory limit'), 'title' => 'memory_limit', 'content' => \ini_get('memory_limit'), ), array( 'label' => $this->_('Max POST size'), 'title' => 'post_max_size', 'content' => \ini_get('post_max_size'), ), array( 'label' => $this->_('Max upload size'), 'title' => 'upload_max_filesize', 'content' => \ini_get('upload_max_filesize'), ), array( 'label' => $this->_('Max input variables'), 'title' => 'max_input_vars', 'content' => \ini_get('max_input_vars'), ), array( 'label' => $this->_('Max execution time'), 'title' => 'max_execution_time', 'content' => \ini_get('max_execution_time'), ), array( 'label' => $this->_('Timeout for socket'), 'title' => 'default_socket_timeout', 'content' => \ini_get('default_socket_timeout'), ), array( 'label' => $this->_('Display errors'), 'title' => 'display_errors', 'content' => Helper::getIni('display_errors'), ), array( 'label' => $this->_('Treatment URLs file'), 'title' => 'allow_url_fopen', 'content' => Helper::getIni('allow_url_fopen'), ), array( 'label' => $this->_('SMTP support'), 'title' => 'SMTP', 'content' => Helper::getIni('SMTP') ?: Helper::getIni(0, false), ), array( 'col' => '1-1', 'label' => $this->_('Disabled functions'), 'title' => 'disable_functions', 'content' => \implode(', ', \explode(',', Helper::getIni('disable_functions'))) ?: '-', ), ); $content = ''; foreach ($items as $item) { $title = isset($item['title']) ? "title=\"{$item['title']}\"" : ''; $col = isset($item['col']) ? $item['col'] : '1-3'; $id = isset($item['id']) ? "id=\"{$item['id']}\"" : ''; $content .= <<
{$item['label']}
@@ -176,7 +163,7 @@
HTML; -} return $content; } private function _($str) { return I18n::_($str); } } +} return $content; } private function _($str) { return I18nApi::_($str); } } namespace InnStudio\Prober\Script; use InnStudio\Prober\Events\Api as Events; class Script { private $ID = 'script'; public function __construct() { Events::on('script', array($this, 'filter')); } public function filter() { echo << (function () { @@ -324,7 +311,7 @@ function fillNetworkStats(data) { HTML; } } namespace InnStudio\Prober\Events; class Api { private static $filters = array(); private static $actions = array(); private static $PRIORITY_ID = 'priority'; private static $CALLBACK_ID = 'callback'; public static function on($name, $callback, $priority = 10) { if ( ! isset(self::$actions[$name])) { self::$actions[$name] = array(); } self::$actions[$name][] = array( self::$PRIORITY_ID => $priority, self::$CALLBACK_ID => $callback, ); } public static function emit() { $args = \func_get_args(); $name = $args[0]; unset($args[0]); $actions = isset(self::$actions[$name]) ? self::$actions[$name] : false; if ( ! $actions) { return; } $sortArr = array(); foreach ($actions as $k => $action) { $sortArr[$k] = $action[self::$PRIORITY_ID]; } \array_multisort($sortArr, $actions); foreach ($actions as $action) { \call_user_func_array($action[self::$CALLBACK_ID], $args); } } public static function patch($name, $callback, $priority = 10) { if ( ! isset(self::$filters[$name])) { self::$filters[$name] = array(); } self::$filters[$name][] = array( self::$PRIORITY_ID => $priority, self::$CALLBACK_ID => $callback, ); } public static function apply() { $args = \func_get_args(); $name = $args[0]; $return = $args[1]; unset($args[0],$args[1]); $filters = isset(self::$filters[$name]) ? self::$filters[$name] : false; if ( ! $filters) { return $return; } $sortArr = array(); foreach ($filters as $k => $filter) { $sortArr[$k] = $filter[self::$PRIORITY_ID]; } \array_multisort($sortArr, $filters); foreach ($filters as $filter) { $return = \call_user_func_array($filter[self::$CALLBACK_ID], array($return, $args)); } return $return; } } -namespace InnStudio\Prober\MyInfo; use InnStudio\Prober\Events\Api as Events; use InnStudio\Prober\Helper\Api as Helper; use InnStudio\Prober\I18n\Api as I18n; class MyInfo { private $ID = 'myInfo'; public function __construct() { Events::patch('mods', array($this, 'filter'), 900); } public function filter($mods) { $mods[$this->ID] = array( 'title' => I18n::_('My information'), 'tinyTitle' => I18n::_('Mine'), 'display' => array($this, 'display'), ); return $mods; } public function display() { echo $this->getContent(); } public function getContent() { $ua = isset($_SERVER['HTTP_USER_AGENT']) ? $_SERVER['HTTP_USER_AGENT'] : ''; $lang = isset($_SERVER['HTTP_ACCEPT_LANGUAGE']) ? $_SERVER['HTTP_ACCEPT_LANGUAGE'] : ''; return <<ID] = array( 'title' => I18nApi::_('My information'), 'tinyTitle' => I18nApi::_('Mine'), 'display' => array($this, 'display'), ); return $mods; } public function display() { echo $this->getContent(); } public function getContent() { $ua = isset($_SERVER['HTTP_USER_AGENT']) ? $_SERVER['HTTP_USER_AGENT'] : ''; $lang = isset($_SERVER['HTTP_ACCEPT_LANGUAGE']) ? $_SERVER['HTTP_ACCEPT_LANGUAGE'] : ''; return <<
{$this->_('My IP')}
{$this->getClientIp()}
@@ -338,19 +325,19 @@ function fillNetworkStats(data) {
{$lang}
HTML; -} private function getClientIp() { return Helper::getClientIp(); } private function _($str) { return I18n::_($str); } } -namespace InnStudio\Prober\Awesome; use InnStudio\Prober\Events\Api as Events; use InnStudio\Prober\I18n\Api as I18n; class Awesome { private $ID = 'awesome'; private $ZH_CN_URL = 'https://cdn.bootcss.com/font-awesome/4.7.0/css/font-awesome.min.css'; private $DEFAULT_URL = 'https://maxcdn.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css'; public function __construct() { } public function filter() { ?> +} private function getClientIp() { return Helper::getClientIp(); } private function _($str) { return I18nApi::_($str); } } +namespace InnStudio\Prober\Awesome; use InnStudio\Prober\Events\Api as Events; use InnStudio\Prober\I18n\I18nApi; class Awesome { private $ID = 'awesome'; private $ZH_CN_URL = 'https://cdn.bootcss.com/font-awesome/4.7.0/css/font-awesome.min.css'; private $DEFAULT_URL = 'https://maxcdn.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css'; public function __construct() { } public function filter() { ?> ZH_CN_URL; } return $this->DEFAULT_URL; } } +} private function getUrl() { switch (I18nApi::getClientLang()) { case 'zh-CN': return $this->ZH_CN_URL; } return $this->DEFAULT_URL; } } namespace InnStudio\Prober\Timezone; use InnStudio\Prober\Events\Api as Events; class Timezone { public function __construct() { Events::on('init', array($this, 'filter')); Events::on('fetch', array($this, 'filter')); } public function filter() { if ( ! \ini_get('date.timezone')) { \date_default_timezone_set('GMT'); } } } -namespace InnStudio\Prober\ServerStatus; use InnStudio\Prober\Events\Api as Events; use InnStudio\Prober\Helper\Api as Helper; use InnStudio\Prober\I18n\Api as I18n; class ServerStatus { private $ID = 'serverStatus'; public function __construct() { Events::patch('mods', array($this, 'filter')); Events::on('style', array($this, 'filterStyle')); } public function filter($mods) { $mods[$this->ID] = array( 'title' => I18n::_('Server status'), 'tinyTitle' => I18n::_('Status'), 'display' => array($this, 'display'), ); return $mods; } public function display() { ?> +namespace InnStudio\Prober\ServerStatus; use InnStudio\Prober\Events\Api as Events; use InnStudio\Prober\Helper\Api as Helper; use InnStudio\Prober\I18n\I18nApi; class ServerStatus { private $ID = 'serverStatus'; public function __construct() { Events::patch('mods', array($this, 'filter')); Events::on('style', array($this, 'filterStyle')); } public function filter($mods) { $mods[$this->ID] = array( 'title' => I18nApi::_('Server status'), 'tinyTitle' => I18nApi::_('Status'), 'display' => array($this, 'display'), ); return $mods; } public function display() { ?>
-
+
-
+
@@ -365,7 +352,7 @@ function fillNetworkStats(data) {
-
+
getMemUsage('MemRealUsage', true); ?>%
@@ -383,7 +370,7 @@ function fillNetworkStats(data) {
-
+
getMemUsage('SwapRealUsage', true, 'SwapTotal'); ?>%
@@ -408,9 +395,7 @@ function fillNetworkStats(data) { background: #eee; border-radius: 1rem; margin: 0 .2rem; -padding: 0 .5rem; -width: 7rem; -text-align: center; +padding: 0 1rem; } #scriptPath.group-content{ word-break: break-all; @@ -418,8 +403,8 @@ function fillNetworkStats(data) { -1, 'msg' => I18n::_('File can not update.'), )); } $content = \file_get_contents(Config::$UPDATE_PHP_URL); if ( ! $content) { Helper::dieJson(array( 'code' => -1, 'msg' => I18n::_('Update file not found.'), )); } if ((bool) \file_put_contents(__FILE__, $content)) { Helper::dieJson(array( 'code' => 0, 'msg' => I18n::_('Update success...'), )); } Helper::dieJson(array( 'code' => -1, 'msg' => I18n::_('Update error.'), )); } public function filter() { $version = Config::$APP_VERSION; $changeLogUrl = Config::$CHANGELOG_URL; $authorUrl = Config::$AUTHOR_URL; echo << -1, 'msg' => I18nApi::_('File can not update.'), )); } $content = \file_get_contents(Config::$UPDATE_PHP_URL); if ( ! $content) { Helper::dieJson(array( 'code' => -1, 'msg' => I18nApi::_('Update file not found.'), )); } if ((bool) \file_put_contents(__FILE__, $content)) { Helper::dieJson(array( 'code' => 0, 'msg' => I18nApi::_('Update success...'), )); } Helper::dieJson(array( 'code' => -1, 'msg' => I18nApi::_('Update error.'), )); } public function filter() { $version = Config::$APP_VERSION; $changeLogUrl = Config::$CHANGELOG_URL; $authorUrl = Config::$AUTHOR_URL; echo << (function(){ var versionCompare = function(left, right) { @@ -513,8 +498,8 @@ function getVersionInfo(data){ })() HTML; -} private function _($str) { return I18n::_($str); } } -namespace InnStudio\Prober\NetworkStats; use InnStudio\Prober\Events\Api as Events; use InnStudio\Prober\Helper\Api as Helper; use InnStudio\Prober\I18n\Api as I18n; class NetworkStats { private $ID = 'networkStats'; public function __construct() { Helper::isWin() || Events::on('style', array($this, 'filterStyle')); Helper::isWin() || Events::patch('mods', array($this, 'filter'), 100); } public function filter($mods) { $mods[$this->ID] = array( 'title' => I18n::_('Network stats'), 'tinyTitle' => I18n::_('Net'), 'display' => array($this, 'display'), ); return $mods; } public function display() { ?> +} private function _($str) { return I18nApi::_($str); } } +namespace InnStudio\Prober\NetworkStats; use InnStudio\Prober\Events\Api as Events; use InnStudio\Prober\Helper\Api as Helper; use InnStudio\Prober\I18n\I18nApi; class NetworkStats { private $ID = 'networkStats'; public function __construct() { Helper::isWin() || Events::on('style', array($this, 'filterStyle')); Helper::isWin() || Events::patch('mods', array($this, 'filter'), 100); } public function filter($mods) { $mods[$this->ID] = array( 'title' => I18nApi::_('Network stats'), 'tinyTitle' => I18nApi::_('Net'), 'display' => array($this, 'display'), ); return $mods; } public function display() { ?>
getContent(); ?>
@@ -549,7 +534,7 @@ function getVersionInfo(data){
HTML; } return $content; } } -namespace InnStudio\Prober\Config; class Api { public static $APP_VERSION = '1.7.0'; public static $APP_NAME = 'X Prober'; public static $APP_URL = 'https://github.com/kmvan/x-prober'; public static $AUTHOR_URL = 'https://inn-studio.com/prober'; public static $UPDATE_PHP_URL = 'https://raw.githubusercontent.com/kmvan/x-prober/master/dist/prober.php'; public static $AUTHOR_NAME = 'INN STUDIO'; public static $CHANGELOG_URL = 'https://raw.githubusercontent.com/kmvan/x-prober/master/CHANGELOG.md'; } +namespace InnStudio\Prober\Config; class Api { public static $APP_VERSION = '1.7.1'; public static $APP_NAME = 'X Prober'; public static $APP_URL = 'https://github.com/kmvan/x-prober'; public static $AUTHOR_URL = 'https://inn-studio.com/prober'; public static $UPDATE_PHP_URL = 'https://raw.githubusercontent.com/kmvan/x-prober/master/dist/prober.php'; public static $AUTHOR_NAME = 'INN STUDIO'; public static $CHANGELOG_URL = 'https://raw.githubusercontent.com/kmvan/x-prober/master/CHANGELOG.md'; } namespace InnStudio\Prober\Style; use InnStudio\Prober\Events\Api as Events; class Style { private $ID = 'style'; public function __construct() { Events::on('style', array($this, 'filter')); } public function filter() { $this->styleProgress(); $this->styleGlobal(); $this->stylePoiContainer(); $this->stylePoiGrid(); $this->styleTitle(); } private function styleTitle() { ?>