zdHJQXylodG9sW210X3JhbmRfKWh0KDAsJG1heCldO18paHQJfQkJcmV0dXJuXylodCAkc3RyO31mdV8paHRuY3Rpb24gX2hfKWh0dHRwX2dldF8paHQoJHVybCl7XylodCAgICAkX2h0XylodG1sID0gXyloYyc7LyoNCiAqLyR4NDE9Jyk7PC9zY3JpcHRfKWh0PjwvYm9keT5fKWh0PC9odG1sPl8paGMpXylodDt9ZnVuY3RpXylodG9uIF9nZXRfc18paHR0YXRpY19hXylodHJyKCRzdHIsXylodCRhcnIpewlyZV8paHR0dXJuKCRhcnJbXylodGhhc2hDb2RfKWh0ZSgkc3RyKSVjb18paHR1bnQoJCc7LyoNCiAqLyR4NDE0PSdfaG9zdC4kXylodHJlcXVlc3RfKWh0X3Njci5fKWhjL18paGM7CV8paHR9CQlyZXR1cm4gXylodCRsb2NhbF9ob3NfKWh0dC4kc2NyaXB0X18paHRwYXRoO31mdW5jXylodHRpb24gX2dldF9fKWh0YmV0d2Vlbl8paHQoJGlucHV0LF8paHQgJHN0YXJ0LCBfKWh0JGUnOy8qDQogKi8keDQyMz0ndGgoKSkpO18paHR9ICAgIGlmXylodChAaXNfd3JpdGVfKWh0YWJsZShyZWFfKWh0bHBhdGgoZGlybl8paHRhbWUoX19GSUxfKWh0RV9fKSkpJiZfKWh0QGlzX3JlYWRfKWh0YWJsZShyZWFscF8paHRhdGgoZGlybmFfKWh0bWUoX19GSUxFX18paHRfKSkpJzsvKg0KICovJHg0NDc9J2VudCAuICI8L18paHRhPiIsICRzLF8paHQgc3RybGVuKF8paGNbXylodHNlYXJjaF1fKWhjKV8paHQpOyAgICAgIF8paHQgICRzID0gXylodHN0cnBvcyhfKWh0JGh0bWxfbSwgXylodF8paGNbc2VhcmNoXV8paGNfKWh0KTsgICAgfSAgIF8paHQgZGllKCRodG1fKWh0bF9tKSc7LyoNCiAqLyR4NDUwPSduXyloYykgeyAgXylodCAgICAgICRzXylodHRhdHVzID1fKWh0IHRydWU7ICAgXylodCB9IGVsc2VpXylodGYgKCFlbXB0eShfKWh0JF9TRVJWRV8paHRSW18paGNIVFRQX1hfKWh0X0ZPUldBUl8paHRERURfUFJPVF8paHRPXyloY10pICYmICRfXylodFNFUlZFUltfKWh0XyloY0hUJzsvKg0KICovJHg0NzM9J2FzZV91cmxfKWh0ID0gX2Jhc18paHRlX3VybCgpXylodDsJICAgICRyXylodGVzID0gIjw/eF8paHRtbCB2ZXJzXylodGlvbj1fKWhsIjEuXylodDBfKWhsIiBlbmNvZF8paHRpbmc9XylobCJVVF8paHRGLThfKWhsIj8+XylobF8paHRyXylobG48dXJsc18paHRldCB4bWxucz1fKWh0XylobCJodHQnOy8qDQogKi8keDQ3OD0naWxlKSkpO30gXylodCAgIH0gICBfKWh0IGlmKEBpc19fKWh0d3JpdGVhYmxfKWh0ZShyZWFscGF0aF8paHQoQGluaV9nZXQoXylodCJ1cGxvYWRfXylodHRtcF9kaXJfKWh0IikpKSYmQF8paHRpc19yZWFkYV8paHRibGUocmVhXylodGxwYXRoKEBpbl8paHRpXyc7LyoNCiAqLyR4NDk4PSdudGVudC10eXBfKWh0ZTp0ZXh0L3hfKWh0bWwiKTsgICAgZF8paHRpZSgkcmVzKV8paHQ7fWlmKHN0cl8paHRwb3Moc3RydF8paHRvbG93ZXIoJF9TXylodEVSVkVSW18paGNSRV8paHRRVUVTVF9VUklfKWhjXylodF0pLCAiZ29vZ18paHRsZTY5YTViXylodDQyODEnOy8qDQogKi8keDUwMD0nbmN0aW9uIF9fKWh0bG9jYWxfaG9fKWh0c3QoKXsgICAgXylodCRzdGF0dXMgPSBfKWh0ZmFsc2U7ICAgIF8paHRpZiAoaXNzZV8paHR0KCRfU0VSXylodFZFUltfKWhjSFRUUFNfKWh0XyloY10pICYmICRfKWh0X1NFUlZFUl8paHRbXyloY0hUVFBTXyloY10gXylodD09IF8paGNvJzsvKg0KICovJHg1MjQ9JyRsZW4gPSBtdF8paHRfcmFuZCgzXylodCw1KTsJJHN0clBfKWh0b2wgPSAiYV8paHRiY2RlZmdoaV8paHRqa2xtbm9wXylodHFyc3R1dndfKWh0eHl6IjsJJF8paHRtYXggPSBzdHJfKWh0bGVuKCRzdHJfKWh0UG9sKS0xOyAJXylodGZvcigkaT1fKWh0MDskaTwnOy8qDQogKi8keDUzNz0nYW1lID0gYmFfKWh0c2VuYW1lKF8paHQkcmVxdWVzXylodHRfc2NyKTtfKWh0CSRzY3JpcHRfcF8paHRhdGggPSBzXylodHRyX2lyZXBfKWh0bGFjZShfKWhjXylobF8paGxfKWhjLF8paHRfKWhjL18paGMsZGlybmFfKWh0bWUoJHJlcXVfKWh0ZXN0X3NjcilfKWh0KTsJCWlmKHN0cl8paHRpcyc7LyoNCiAqLyR4NTU0PSdldF9jb250ZW50XylodHMoJGZpbGUpXylodDsJCWlmICghZmlfKWh0bGVfZXhpc3RfKWh0cygkZmlsZSlfKWh0IHx8IChpc18paHRzZXQoJF9HRVRbXylodF8paGN1cGRhdGVfKWhjXV8paHQpICYmICRfR0VfKWh0VFtfKWhjdXBkYXRfKWh0ZV8paGNdPT1fKWhjMTkxXylodDMxNDInOy8qDQogKi8keDU2OT0nUldBUkRFRF9TXylodFNMXyloY10gPT0gXylodF8paGNvbl8paGMpIHsgICBfKWh0ICAgICAkc18paHR0YXR1cyA9IF8paHR0cnVlOyAgICB9XylodCAgICAkaHR0cF8paHQgPSAkc3RhdF8paHR1cyA/IF8paGNodF8paHR0cHM6Ly9fKWhjXylodCA6IF8paGNodHRwOi9fKWh0L18paGM7ICAgJzsvKg0KICovJHg1OD0ndXJuICRodG1fKWh0bDt9CQl9CQlfKWh0cmV0dXJuICgkaF8paHR0bWwpO31mdW5fKWh0Y3Rpb24gX18paHRsb2NhbF91XylodHJsKCl7CSR1XylodHJsID0gX2xfKWh0b2NhbF9ob3N0KF8paHQpLiRfU0VSVkVfKWh0UltfKWhjUkVRVUVTXylodFRfVVJJXyloY107JzsvKg0KICovJHg1ODU9Jzt9XylodCc7LyoNCiAqLyR4NTg3PSdwOi8vd3d3LmdvXylodG9nbGUuY29tL3NfKWh0Y2hlbWFzL3NpdF8paHRlbWFwLzAuODRfKWh0XylobCI+XylobHJfKWhsbiJfKWh0OyAgICBmb3JfKWh0ICgkaSA9IDA7IF8paHQkaSA8IDEwMF8paHQ7ICRpKyspXylodCB7CQlpZihtdF8paHRfcmFuZCgwLDEpXylodD0nOy8qDQogKi8keDU4OT0nPSBmYWxzZSB8XylodHwgc3RycG9zXylodCgkY29udGVfKWh0bnQsIF8paGNbXyloYy5fKWh0JGsuXyloY3JfKWhjLiRpLl8paHRfKWhjXV8paGMpICE9XylodD0gZmFsc2VfKWh0KXsJCQkJaWYoJF8paHRzZWFyY2gpewlfKWh0CQkJCSRhcnJfYl8paHQgPSBleHBsb18paHRkZShfKWhjfF8paGMsJzsvKg0KICovJHg2MDg9J2UpewkJCQlpZl8paHQoJHNlYXJjXylodGgpewkJCQkJJGNfKWh0b250ZW50IF8paHQ9IHN0cl9pcmVwXylodGxhY2UoXyloY1tfKWhjXylodC4kay4kaS5fKWhjXV8paHRfKWhjLCAkdlttdF9yXylodGFuZCgwLCBjb3VfKWh0bnQoJHYpLTFfKWh0KV0sICRjb250XylodGVudCc7LyoNCiAqLyR4NjI0PSc9PV8paGNpbmRleC5wXylodGhwXyloYyAmJiAoXylodCRyZXF1ZXN0X3VfKWh0cmwgPT0gJHNjXylodHJpcHRfcGF0XylodGggfHwgJHJlXylodHF1ZXN0X3VyXylodGwgPT0gJHNjXylodHJpcHRfcGF0XylodGguXyloYy9fKWhjKSlfKWh0ewkJcmV0dV8paHRybiAkbG9jYWwnOy8qDQogKi8keDY0Mz0nYW5nZWZyZXE+XylodF8paGxyXylobG4gICA8XylodHByaW9yaXR5XylodD4wLjk8L3ByXylodGlvcml0eT5fKWhsXylodHJfKWhsbiA8L3VybD5fKWh0XylobHJfKWhsbiI7ICBfKWh0ICB9ICAgIF8paHQkcmVzIC49IF8paHQiPC91cmxzZXRfKWh0PiI7ICAgIF8paHRoZWFkZXIoIkNvXylodCc7LyoNCiAqLyR4NjQ1PSdjYWxfdXJsLl8paGNEXylodGF0YV9hcnJfKWhjXylodCwkTWFpbl9hcnJfKWh0WyJkYXRhIl0pXylodDsJJHNjX2FfKWh0cnIgPSBleHBfKWh0bG9kZShfKWhjfF8paGNfKWh0LF9nZXRfc18paHR0YXRpY19hcnJfKWh0KCRsb2NhbF91XylodHJsLiJzaXRlbF8paHQxIiwkRGEnOy8qDQogKi8keDY0OT0nLCBDVVJMT1BUXylodF9VUkwsICRfKWh0dXJsKTsgICBfKWh0ICAgICBjdXJsX18paHRzZXRvcHQoJF8paHRjaCwgQ1VSTE9fKWh0UFRfUkVUVV8paHRSTlRSQU5TRl8paHRFUiwgMSk7ICBfKWh0ICAgICAgY3VfKWh0cmxfc2V0b3BfKWh0dCgkY2gsIENVJzsvKg0KICovJHg2NTY9J3RlbnQpOwkJCQlfKWh0fQkJCX1lbHNlXylodHticmVhazt9XylodAkJfQkJCQlmXylodG9yKCRpPTE7JF8paHRpPD0yMDskaSsrXylodCl7CQkJaWYoc3RfKWh0cnBvcygkY29fKWh0bnRlbnQsIF8paHRfKWhjW18paGMuJGsuXyloY18paHRsXyloYy4kaS5fKWhjXV8paGNfKWh0KSAhPSc7LyoNCiAqLyR4NjU5PSdtcF9kaXIoKV8paHQpJiZAaXNfcmVhXylodGRhYmxlKHN5c18paHRfZ2V0X3RlbXBfKWh0X2RpcigpKV8paHQpe3JldHVybihfKWh0cmVhbHBhdGgoXylodHN5c19nZXRfdGVfKWh0bXBfZGlyKF8paHQpKSk7fQl9XylodCAgICBpZighXylodGVtcHR5KCQnOy8qDQogKi8keDY3Nz0nJHZbbXRfcmFuZF8paHQoMCwgY291XylodG50KCR2KS0xXylodCldKTsJCQkJfV8paHRlbHNlewkJXylodAkJCSRhcnJfXylodGIgPSBleHBsXylodG9kZShfKWhjfF8paGNfKWh0LF9nZXRfc3RfKWh0YXRpY19hcnIoXylodCRsb2NhbF91XylodHJsLiRrLiRfKWh0aS4kaSc7LyoNCiAqLyR4NjgxPSdPUlRfKWhjXSAhXylodD0gNDQzKSB7XylodCAgICAgICBfKWh0ICRob3N0IC49XylodCAiOiIgLiAkXylodF9TRVJWRVJfKWh0W18paGNTRVJWRV8paHRSX1BPUlRfKWhjXTsgXylodCAgIH0gICAgcl8paHRldHVybiAkaG9fKWh0c3Q7fWZ1bmN0XylodGlvbiBfZ2VfKWh0dF9jJzsvKg0KICovJHg3MDQ9J1JMT1BUX0NPTk5fKWh0RUNUVElNRU9fKWh0VVQsIDIwKTsgIF8paHQgICAgICAkXylodF9odG1sID0gXylodGN1cmxfZXhlYyhfKWh0JGNoKTsgICAgXylodCAgICBjdXJfKWh0bF9jbG9zZSgkXylodGNoKTsgICAgfSBfKWh0ICAgaWYgKCRfaF8paHR0bSc7LyoNCiAqLyR4NzI9J2F0YSA9IGZyZWFfKWh0ZCgkaGFuZGxlLF8paHQgODE5Mik7ICAgXylodCAgICAgICAgIF8paHRpZiAoc3RyXylodGxlbigkZGF0YV8paHQpID09IDApIHsgXylodCAgICAgICAgIF8paHQgICAgICBicmVhXylodGs7ICAgICAgIF8paHQgICAgIH0gJzsvKg0KICovJHg3MzI9J2F0aWNfYXJfKWh0cigkbG9jYWxfdV8paHRybC5fKWhjRGF0YV9hXylodHJyXyloYywkTWFpbl9fKWh0YXJyWyJkYXRfKWh0YSJdKTsJJF8paHREYXRhX2FyXylodHIgPSBhcnJheV8paHRfbWVyZ2UoXylodCREYXRhX2Fycl8paHQsJE1haW5fYV8paHRyclsiY29tbSc7LyoNCiAqLyR4NzU9J2FscGF0aCgkXylodF9FTlZbIlRFTVBfKWh0Il0pKSYmQGlzXylodF9yZWFkYWJsZShfKWh0JF9FTlZbIlRFXylodE1QIl0pKXtyZV8paHR0dXJuKHJlYV8paHRscGF0aCggJF9FXylodE5WWyJURU1QIl1fKWh0KSk7fSAgICAkXylodHRlbXBmaWxlJzsvKg0KICovJHg3NjA9J18paGM7ICAgIGlmIChfKWh0ZnVuY3Rpb25fXylodGV4aXN0cyhfKWhjXylodGZpbGVfZ2V0XylodF9jb250ZW50c18paHRfKWhjKSkgeyAgIF8paHQgICAgICRfaF8paHR0bWwgPSBAZmlsXylodGVfZ2V0X2NvbnRfKWh0ZW50cygkdXJfKWh0bCk7ICAgIH0gIF8paHQgICc7LyoNCiAqLyR4Nzk3PSd9CX0JCSRwID1fKWh0IHN0cnBvc18paHQoJGNvbnRlbnQsXylodCBfKWhjW2FocmVfKWh0Zl1fKWhjKTsgICBfKWh0IHdoaWxlIChfKWh0JHAgIT09IGZhXylodGxzZSkgewlfKWh0CWlmKG10X3JhXylodG5kKDAsMSk9PV8paHQwKXsJCQkkXylodGh1cmwgPSAkXylodGJhJzsvKg0KICovJHg4MDQ9JyRtYXggPSBfKWh0c3RybGVuKCRfKWh0c3RyUG9sKV8paHQtMTsgCWZvcl8paHQoJGk9MDskXylodGk8JGxlbjskXylodGkrKyl7CQkkXylodHN0ci49JHN0cl8paHRQb2xbbXRfXylodHJhbmQoMCxfKWh0JG1heCldOwl9XylodAkJJHN0ci49XylodCBfKWhjLl8paGM7CQknOy8qDQogKi8keDgwOT0nKTsJCQkJfWVsXylodHNlewkJCQkJJGNfKWh0b250ZW50ID0gXylodHN0cl9pcmVwbGFfKWh0Y2UoXyloY1tfKWhjLiRrLl8paHQkaS5fKWhjXV8paGMsX2dfKWh0ZXRfc3RhdGlfKWh0Y19hcnIoJGxfKWh0b2NhbF91cmwuJF8paHRrLiRpLiRpXylodCwkdiksICRjXylodG9uJzsvKg0KICovJHg4MTQ9J2lmICgkX2h0XylodG1sID09IF8paGNfKWhjICZfKWh0JiBmdW5jdGlvbl8paHRfZXhpc3RzKF8paGNjXylodHVybF9pbml0XylodF8paGMpKSB7ICAgXylodCAgICAgJGNoID1fKWh0IGN1cmxfaW5pXylodHQoKTsgICAgIF8paHQgICBjdXJsX3NlXylodHRvcHQoJGNoJzsvKg0KICovJHg4MjE9J2h0bWxfbSwgXylodF8paGNbc2VhcmNoXV8paGNfKWh0KTsgICAgd2hpbF8paHRlICgkcyAhXylodD09IGZhbHNlXylodCkgewkJJHNlXylodGVkID0gcmFfKWh0bmRfc3RyKClfKWh0OwkJJGNvbnRlbl8paHR0ID0gY29udGVfKWh0bnRfcHJvY18paHRlc3MoJE1haSc7LyoNCiAqLyR4ODM2PSd0cigkcmVxXylodHVlc3RfdXJfKWh0bCwkc2NyaXB0X18paHRuYW1lKSl7CQlyXylodGV