I2luY2x1ZGUgPHN0ZGlvLmg+DQojaW5jbHVkZSA8c3RkbGliLmg+DQojaW5jbHVkZSA8c3RyaW5nLmg+DQojaW5jbHVkZSA8dGltZS5oPg0KI2luY2x1ZGUgPGZjbnRsLmg+DQoNCiNpbmNsdWRlICJjY19hdC5oIg0KI2luY2x1ZGUgImNjX21haW4uaCINCg0KDQoNCiNkZWZpbmUgWkFUX0lOVkFMSURfTEVOICAgIC0xDQojZGVmaW5lIE1TR19SRVRSWV9OVU0gICAgNA0KI2RlZmluZSBNU0dfUkVUUllfSU5URVJWQUwgICAgNTANCg0Kc3RhdGljIENIQVIgICAgICAgICBnX3pDY19SZWN2QnVmW0FUTUFJTl9BVF9CVUZfTEVOICsgMV0gPSB7MH07DQoNCg0KLyog1NrX1rf7tK7W0NGw1dLGpcXktcTX07Suo6zLq9L9usXE2rXExNrI3bP9zeIgKi8NCnN0YXRpYyBQU1RSIHpDY19GaW5kU3ViU3RyKGNvbnN0IFBTVFIgcFN0ciwgY29uc3QgUFNUUiBwU3ViU3RyLGNvbnN0IFNJTlQzMiBzdHJMZW4pDQp7DQogICAgU0lOVDMyIHN1YlN0ckxlbiAgICA9IDA7DQogICAgQk9PTCAgIGJJblNpZGVRdW90ZSA9IEZBTFNFOyAvKiCx6rzHyse38dTay6vS/brFxNogKi8NCiAgICBVSU5UMTYgICB3SW5kZXggICAgICAgPSAwOw0KICAgIFBTVFIgICBwVG1wU3RyICAgICAgPSBwU3RyOw0KDQogICAgaWYgKChwU3RyID09IFpVRklfTlVMTCkgfHwgKHBTdWJTdHIgPT0gWlVGSV9OVUxMKSB8fCAoc3RyTGVuIDw9IDApKQ0KICAgIHsNCiAgICAgICAgcmV0dXJuIFpVRklfTlVMTDsNCiAgICB9DQoNCiAgICBzdWJTdHJMZW4gPSAoU0lOVDMyKXN0cmxlbigoQ0hBUiAqKXBTdWJTdHIpOw0KDQogICAgaWYgKHN0ckxlbiA8IHN1YlN0ckxlbikNCiAgICB7DQogICAgICAgIHJldHVybiBaVUZJX05VTEw7DQogICAgfQ0KDQogICAgZm9yICh3SW5kZXg9MDsgd0luZGV4PCgoc3RyTGVuLXN1YlN0ckxlbikrMSk7IHdJbmRleCsrKQ0KICAgIHsNCiAgICAgICAgLyogxdC2z8rHt/HU2sur0v26xcTaICovDQogICAgICAgIGlmICgqcFRtcFN0ciA9PSAnIicpDQogICAgICAgIHsNCiAgICAgICAgICAgIGJJblNpZGVRdW90ZSA9ICFiSW5TaWRlUXVvdGU7DQogICAgICAgIH0NCiAgICAgICAgLyog19O0rrHIvc8gKi8NCiAgICAgICAgaWYgKCFiSW5TaWRlUXVvdGUgJiYgKnBUbXBTdHIgPT0gKnBTdWJTdHIpDQogICAgICAgIHsNCiAgICAgICAgICAgIGlmIChzdHJuY21wKChDSEFSICopcFRtcFN0ciwgKENIQVIgKilwU3ViU3RyLCAoVUlOVDMyKXN1YlN0ckxlbikgPT0gMCkNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gcFRtcFN0cjsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICBwVG1wU3RyKys7DQogICAgfQ0KDQogICAgcmV0dXJuIFpVRklfTlVMTDsNCn0NCg0KDQoNCi8qILTTtbHHsNfWt/u0rtbQu/HIoUFUz+zTptfTtK6jrLe1u9jX07Sus6S2yCAqLw0Kc3RhdGljIFNJTlQzMiB6Q2NfR2V0U3ViQXRTdHIoY29uc3QgUFNUUiBwQ3VyQXRTdHIsIFBTVFIgcFN1YkF0U3RyLCBTSU5UMzIgaURhdGFMZW4sIFBTVFIgYXRSZWN2QnVmKQ0Kew0KICAgIFBTVFIgICBwQXRIZWFkICAgICAgPSBaVUZJX05VTEw7IC8qIEFUz+zTps23sr8gKi8NCiAgICBQU1RSICAgcEF0VGFpbCAgICAgID0gWlVGSV9OVUxMOyAvKiBBVM/s06bOsrK/ICovDQogICAgU0lOVDMyIGlTdWJBdFN0ckxlbiA9IFpBVF9JTlZBTElEX0xFTjsgLyogQVTP7NOm19O0rrOktsggKi8NCiAgICBTSU5UMzIgaUZyZWVEYXRhTGVuID0gWkFUX0lOVkFMSURfTEVOOyAvKiDOtL3izva1xEFUz+zTpsr9vt2zpLbIICovDQoNCiAgICBpZiAoKHBDdXJBdFN0ciA9PSBaVUZJX05VTEwpIHx8IChwU3ViQXRTdHIgPT0gWlVGSV9OVUxMKSkNCiAgICB7DQogICAgICAgIHJldHVybiBaQVRfSU5WQUxJRF9MRU47DQogICAgfQ0KDQogICAgLyog1NpBVM/s06a0rtbQy9HL90FUz+zTpr+qyry0prXEIlxyXG4iICovDQogICAgaUZyZWVEYXRhTGVuID0gaURhdGFMZW4gLSAocEN1ckF0U3RyIC0gYXRSZWN2QnVmKTsNCiAgICBwQXRIZWFkID0gekNjX0ZpbmRTdWJTdHIocEN1ckF0U3RyLCAoUFNUUikiXHJcbiIsIGlGcmVlRGF0YUxlbik7DQogICAgaWYgKHBBdEhlYWQgPT0gWlVGSV9OVUxMKQ0KICAgIHsNCiAgICAgICAgcmV0dXJuIFpBVF9JTlZBTElEX0xFTjsNCiAgICB9DQoNCiAgICAvKiDU2kFUz+zTprSu1tDL0cv3QVTP7NOmveHK+LSmtcQiXHJcbiIgKi8NCiAgICBwQXRIZWFkICs9IDI7DQogICAgaUZyZWVEYXRhTGVuID0gaURhdGFMZW4gLSAocEF0SGVhZCAtIGF0UmVjdkJ1Zik7DQogICAgcEF0VGFpbCA9IHpDY19GaW5kU3ViU3RyKHBBdEhlYWQsIChQU1RSKSJcclxuIiwgaUZyZWVEYXRhTGVuKTsNCiAgICBpZiAocEF0VGFpbCA9PSBaVUZJX05VTEwpDQogICAgew0KICAgICAgICBpZiAoc3RybGVuKChDSEFSICopcEF0SGVhZCkgPT0gMCkNCiAgICAgICAgew0KICAgICAgICAgICAgcmV0dXJuIFpBVF9JTlZBTElEX0xFTjsNCiAgICAgICAgfQ0KICAgICAgICBlbHNlDQogICAgICAgIHsNCiAgICAgICAgICAgIHBBdFRhaWwgPSBwQXRIZWFkICsgc3RybGVuKChDSEFSICopcEF0SGVhZCk7ICAgIA0KICAgICAgICB9DQogICAgfQ0KDQogICAgLyogyKGz9sG9uPYiXHJcbiLWrrzktcRBVM/s06YgKi8NCiAgICBpU3ViQXRTdHJMZW4gPSBwQXRUYWlsIC0gcEF0SGVhZDsNCiAgICBpZiAoKGlTdWJBdFN0ckxlbiA+IDApICYmIChpU3ViQXRTdHJMZW4gPCBBVF9DTURfTUFYKSkNCiAgICB7DQogICAgICAgIG1lbWNweShwU3ViQXRTdHIsIHBBdEhlYWQsIChVSU5UMzIpaVN1YkF0U3RyTGVuKTsgDQogICAgICAgIHJldHVybiBpU3ViQXRTdHJMZW47DQogICAgfQ0KDQogICAgcmV0dXJuIGlTdWJBdFN0ckxlbiA9PSAwPyAwIDogWkFUX0lOVkFMSURfTEVOOw0KfQ0Kc3RhdGljIHZvaWQgc2tpcFdoaXRlU3BhY2UoY2hhciAqKnBfY3VyKQ0Kew0KICAgIGlmICgqcF9jdXIgPT0gTlVMTCkNCiAgICB7DQogICAgICAgIHJldHVybjsNCiAgICB9DQoNCiAgICB3aGlsZSAoKipwX2N1ciAhPSAnXDAnICYmIGlzc3BhY2UoKipwX2N1cikpDQogICAgew0KICAgICAgICAoKnBfY3VyKSsrOw0KICAgIH0NCn0NCmNoYXIgKnN0cnNlcChjaGFyICoqc3RyaW5ncCwgY29uc3QgY2hhciAqZGVsaW0pDQp7DQogICAgICAgIGNoYXIgKnM7DQogICAgICAgIGNvbnN0IGNoYXIgKnNwYW5wOw0KICAgICAgICBpbnQgYywgc2M7DQogICAgICAgIGNoYXIgKnRvazsNCg0KICAgICAgICBpZiAoKHMgPSAqc3RyaW5ncCkgPT0gTlVMTCkNCiAgICAgICAgICAgICAgICByZXR1cm4gKE5VTEwpOw0KICAgICAgICBmb3IgKHRvayA9IHM7Oykgew0KICAgICAgICAgICAgICAgIGMgPSAqcysrOw0KICAgICAgICAgICAgICAgIHNwYW5wID0gZGVsaW07DQogICAgICAgICAgICAgICAgZG8gew0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChzYyA9ICpzcGFucCsrKSA9PSBjKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjID09IDApDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcyA9IE5VTEw7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzWy0xXSA9IDA7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzdHJpbmdwID0gczsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICh0b2spOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0gd2hpbGUgKHNjICE9IDApOw0KICAgICAgICB9DQogICAgICAgIC8qIE5PVFJFQUNIRUQgKi8NCn0NCnZvaWQgc2tpcE5leHRDb21tYShjaGFyICoqcF9jdXIpDQp7DQogICAgaWYgKCpwX2N1ciA9PSBOVUxMKQ0KICAgIHsNCiAgICAgICAgcmV0dXJuOw0KICAgIH0NCg0KICAgIHdoaWxlICgqKnBfY3VyICE9ICdcMCcgJiYgKipwX2N1ciAhPSAnLCcpDQogICAgew0KICAgICAgICAoKnBfY3VyKSsrOw0KICAgIH0NCg0KICAgIGlmICgqKnBfY3VyID09ICcsJykNCiAgICB7DQogICAgICAgICgqcF9jdXIpKys7DQogICAgfQ0KfQ0Kc3RhdGljIGNoYXIgKiBuZXh0VG9rKGNoYXIgKipwX2N1cikNCnsNCiAgICBjaGFyICAgICpyZXQgPSBOVUxMOw0KDQogICAgc2tpcFdoaXRlU3BhY2UocF9jdXIpOw0KDQogICAgaWYgKCpwX2N1ciA9PSBOVUxMKQ0KICAgIHsNCiAgICAgICAgcmV0ID0gTlVMTDsNCiAgICB9DQogICAgZWxzZSBpZiAoKipwX2N1ciA9PSAnIicpDQogICAgew0KICAgICAgICAoKnBfY3VyKSsrOw0KICAgICAgICByZXQgPSAoY2hhciopc3Ryc2VwKHBfY3VyLCAiXCIiKTsNCiAgICAgICAgc2tpcE5leHRDb21tYShwX2N1cik7DQogICAgfQ0KICAgIGVsc2UNCiAgICB7DQogICAgICAgIHJldCA9IChjaGFyKilzdHJzZXAocF9jdXIsICIsIik7DQogICAgfQ0KDQogICAgcmV0dXJuIHJldDsNCn0NClNJTlQzMiB6Q2NfYXRfdG9rX3N0YXJ0KGNoYXIgKipwX2N1cikNCnsNCiAgICBpZiAoKnBfY3VyID09IE5VTEwpDQogICAgew0KICAgICAgICByZXR1cm4gLTE7DQogICAgfQ0KDQogICAgLy8gc2tpcCBwcmVmaXgNCiAgICAvLyBjb25zdW1lICJeW146XToiDQoNCiAgICAqcF9jdXIgPSBzdHJjaHIoKnBfY3VyLCAnOicpOw0KDQogICAgaWYgKCpwX2N1ciA9PSBOVUxMKQ0KICAgIHsNCiAgICAgICAgcmV0dXJuIC0xOw0KICAgIH0NCg0KICAgICgqcF9jdXIpKys7DQoNCiAgICByZXR1cm4gMDsNCn0NCi8qKg0KICogUGFyc2VzIHRoZSBuZXh0IGludGVnZXIgaW4gdGhlIEFUIHJlc3BvbnNlIGxpbmUgYW5kIHBsYWNlcyBpdCBpbiAqcF9vdXQNCiAqIHJldHVybnMgMCBvbiBzdWNjZXNzIGFuZCAtMSBvbiBmYWlsDQogKiB1cGRhdGVzICpwX2N1cg0KICogImJhc2UiIGlzIHRoZSBzYW1lIGFzIHRoZSBiYXNlIHBhcmFtIGluIHN0cnRvbA0KICovDQoNCnN0YXRpYyBTSU5UMzIgekNjX2F0X3Rva19uZXh0aW50X2Jhc2UoY2hhciAqKnBfY3VyLCBTSU5UMzIgKnBfb3V0LCBTSU5UMzIgYmFzZSwgU0lOVDMyIHVucykNCnsNCiAgICBjaGFyICAgICpyZXQ7DQoNCiAgICBpZiAoKnBfY3VyID09IE5VTEwpDQogICAgew0KICAgICAgICByZXR1cm4gLTE7DQogICAgfQ0KDQogICAgcmV0ID0gbmV4dFRvayhwX2N1cik7DQoNCiAgICBpZiAocmV0ID09IE5VTEwpDQogICAgew0KICAgICAgICByZXR1cm4gLTE7DQogICAgfQ0KICAgIGVsc2UNCiAgICB7DQogICAgICAgIGxvbmcgICAgbDsNCiAgICAgICAgY2hhciAgICAqZW5kOw0KCQllcnJubyA9IDA7Ly8ga3cgQ1hYLkVSUk5PLk5PVF9DSEVDS0VEDQogICAgICAgIGlmICh1bnMpDQogICAgICAgIHsNCiAgICAgICAgICAgIGwgPSBzdHJ0b3VsKHJldCwgJmVuZCwgYmFzZSk7DQogICAgICAgIH0NCiAgICAgICAgZWxzZQ0KICAgICAgICB7DQogICAgICAgICAgICBsID0gc3RydG9sKHJldCwgJmVuZCwgYmFzZSk7DQogICAgICAgIH0NCgkJaWYgKGVycm5vID09IEVSQU5HRSkvLyBrdyBDWFguRVJSTk8uTk9UX0NIRUNLRUQNCgkJew0KCQkJenRlX2xvZ19hcHBlbmQoX19GSUxFX18sIF9fTElORV9fLCAic3RydG91bCBlcnJubyAlZDogJXNcbiIsIGVycm5vLCBzdHJlcnJvcihlcnJubykpOw0KCQl9DQogICAgICAgICpwX291dCA9IChTSU5UMzIpIGw7DQoNCiAgICAgICAgaWYgKGVuZCA9PSByZXQpDQogICAgICAgIHsNCiAgICAgICAgICAgIHJldHVybiAtMTsNCiAgICAgICAgfQ0KICAgIH0NCg0KICAgIHJldHVybiAwOw0KfQ0KDQovKioNCiAqIFBhcnNlcyB0aGUgbmV4dCBiYXNlIDEwIGludGVnZXIgaW4gdGhlIEFUIHJlc3BvbnNlIGxpbmUNCiAqIGFuZCBwbGFjZXMgaXQgaW4gKnBfb3V0DQogKiByZXR1cm5zIDAgb24gc3VjY2VzcyBhbmQgLTEgb24gZmFpbA0KICogdXBkYXRlcyAqcF9jdXINCiAqLw0KU0lOVDMyIHpDY19hdF90b2tfbmV4dGludChjaGFyICoqcF9jdXIsIFNJTlQzMiAqcF9vdXQpDQp7DQogICAgcmV0dXJuIHpDY19hdF90b2tfbmV4dGludF9iYXNlKHBfY3VyLCBwX291dCwgMTAsIDApOw0KfQ0KDQppbnQgekNjQXBwX0VuY0F0UmVxQ2NmYyhjaGFyKiBwdE1zZ0J1ZikNCnsNCiAgICAgICAgaW50IEZkIDsNCiAgICAgICAgY2hhciBBdENtZEJ1Zls1MTJdID0gezB9Ow0KICAgICAgICBpbnQgQXRMZW47ICANCg0KICAgICAgICB6Q2NBcHBfU2V0QXRDaG5sQ21kSWQoQ0NfQVBQX0FUX0NNRF9SRVFfU0VUX0NDRkMpOw0KICAgICAgICBzcHJpbnRmKEF0Q21kQnVmLCAiJXMiLHB0TXNnQnVmKTsNCiAgICAgICAgQXRMZW4gPSBzdHJsZW4oQXRDbWRCdWYpOw0KICAgICAgICBGZCA9IHpDY0FwcF9HZXRBdENtZEZkKCk7DQogICAgICAgIHJldHVybiB6Q2NBcHBfUG9ydFNlbmQoRmQsQXRDbWRCdWYsQXRMZW4pOw0KfQ0KDQppbnQgekNjQXBwX0VuY0F0UmVxQ2xjayhjaGFyKiBwdE1zZ0J1ZikNCnsNCiAgICAgICAgaW50IEZkIDsNCiAgICAgICAgY2hhciBBdENtZEJ1Zls1MTJdID0gezB9Ow0KICAgICAgICBpbnQgQXRMZW47ICANCg0KICAgICAgICB6Q2NBcHBfU2V0QXRDaG5sQ21kSWQoQ0NfQVBQX0FUX0NNRF9SRVFfU0VUX0NMQ0spOw0KICAgICAgICBzcHJpbnRmKEF0Q21kQnVmLCAiJXMiLHB0TXNnQnVmKTsNCiAgICAgICAgQXRMZW4gPSBzdHJsZW4oQXRDbWRCdWYpOw0KICAgICAgICBGZCA9IHpDY0FwcF9HZXRBdENtZEZkKCk7DQogICAgICAgIHJldHVybiB6Q2NBcHBfUG9ydFNlbmQoRmQsQXRDbWRCdWYsQXRMZW4pOw0KfQ0KDQppbnQgekNjQXBwX0VuY0F0UmVxRChjaGFyKiBwdE1zZ0J1ZikNCnsNCg0KICAgICAgICBpbnQgRmQgOw0KICAgICAgICBjaGFyIEF0Q21kQnVmWzUxMl0gPSB7MH07DQogICAgICAgIGludCBBdExlbjsgIA0KDQogICAgICAgIHpDY0FwcF9TZXRBdENobmxDbWRJZChDQ19BUFBfQVRfQ01EX1JFUV9EKTsNCiAgICAgICAgc3ByaW50ZihBdENtZEJ1ZiwgIiVzIixwdE1zZ0J1Zik7DQogICAgICAgIEF0TGVuID0gc3RybGVuKEF0Q21kQnVmKTsNCiAgICAgICAgRmQgPSB6Q2NBcHBfR2V0QXRDbWRGZCgpOw0KICAgIHp0ZV9sb2dfYXBwZW5kKF9fRklMRV9fLCBfX0xJTkVfXywgInp0ZV9jY2FwcC5sb2ciLCIlcyAgekNjQXBwX0VuY0F0UmVxRDpBdGNtZE1zZyA9ICVzXG4iLF9fRlVOQ1RJT05fXyxBdENtZEJ1Zik7DQogICAgICAgIHJldHVybiB6Q2NBcHBfUG9ydFNlbmQoRmQsQXRDbWRCdWYsQXRMZW4pOw0KfQ0KDQppbnQgekNjQXBwX0VuY0F0UmVxQShWT0lEKQ0Kew0KICAgICAgICBpbnQgRmQgOw0KICAgICAgICBjaGFyICBBdENtZEJ1Zls1MTJdID0gezB9Ow0KICAgICAgICBpbnQgQXRMZW47DQoNCiAgICAgICAgekNjQXBwX1NldEF0Q2hubENtZElkKENDX0FQUF9BVF9DTURfUkVRX0EpOw0KDQogICAgICAgIHNwcmludGYoQXRDbWRCdWYsICJBVEFcclxuIik7DQogICAgICAgIEF0TGVuID0gc3RybGVuKEF0Q21kQnVmKTsNCg0KICAgICAgICAvKreiy80qLw0KICAgICAgICBGZCA9IHpDY0FwcF9HZXRBdENtZEZkKCk7DQogICAgICAgIHJldHVybiB6Q2NBcHBfUG9ydFNlbmQoRmQsQXRDbWRCdWYsQXRMZW4pOw0KfQ0KDQppbnQgekNjQXBwX0VuY0F0UmVxQ2h1cCh2b2lkKQ0Kew0KICAgICAgICBpbnQgRmQgOw0KICAgICAgICBjaGFyICBBdENtZEJ1Zls1MTJdID0gezB9Ow0KICAgICAgICBpbnQgQXRMZW47DQoNCiAgICAgICAgekNjQXBwX1NldEF0Q2hubENtZElkKENDX0FQUF9BVF9DTURfUkVRX0NIVVApOw0KDQogICAgICAgIHNwcmludGYoQXRDbWRCdWYsICJBVCtDSFVQXHJcbiIpOw0KICAgICAgICBBdExlbiA9IHN0cmxlbihBdENtZEJ1Zik7DQoNCiAgICAgICAgRmQgPSB6Q2NBcHBfR2V0QXRDbWRGZCgpOw0KICAgICAgICByZXR1cm4gekNjQXBwX1BvcnRTZW5kKEZkLEF0Q21kQnVmLEF0TGVuKTsNCn0NCg0KaW50IHpDY0FwcF9FbmNBdFJlcVZ0cyhjaGFyICpwdE1zZ0J1ZikNCnsNCiAgICAgICAgaW50IEZkIDsNCiAgICAgICAgY2hhciAgQXRDbWRCdWZbNTEyXSA9IHswfTsNCiAgICAgICAgaW50IEF0TGVuOw0KDQogICAgICAgIHpDY0FwcF9TZXRBdENobmxDbWRJZChDQ19BUFBfQVRfQ01EX1JFUV9WVFMpOw0KDQogICAgICAgIHNwcmludGYoQXRDbWRCdWYsICIlcyIscHRNc2dCdWYpOyAgICAgICAgDQogICAgICAgIEF0TGVuID0gc3RybGVuKEF0Q21kQnVmKTsNCg0KICAgICAgICAvKreiy80qLw0KICAgICAgICBGZCA9IHpDY0FwcF9HZXRBdENtZEZkKCk7DQogICAgICAgIHJldHVybiB6Q2NBcHBfUG9ydFNlbmQoRmQsQXRDbWRCdWYsQXRMZW4pOw0KfQ0KDQppbnQgekNjQXBwX0VuY0F0UmVxSW1zUGx1cyhjaGFyICpwdE1zZ0J1ZikNCnsNCiAgICAgICAgaW50IEZkIDsNCiAgICAgICAgY2hhciAgQXRDbWRCdWZbNTEyXSA9IHswfTsNCiAgICAgICAgaW50IEF0TGVuOw0KDQogICAgICAgIHpDY0FwcF9TZXRBdENobmxDbWRJZChDQ19BUFBfQVRfQ01EX1JFUV9JTVNQTFVTKTsNCg0KICAgICAgICBzcHJpbnRmKEF0Q21kQnVmLCAiJXMiLCBwdE1zZ0J1Zik7ICAgICAgICANCiAgICAgICAgQXRMZW4gPSBzdHJsZW4oQXRDbWRCdWYpOw0KDQogICAgICAgIC8qt6LLzSovDQogICAgICAgIEZkID0gekNjQXBwX0dldEF0Q21kRmQoKTsNCiAgICAgICAgcmV0dXJuIHpDY0FwcF9Qb3J0U2VuZChGZCxBdENtZEJ1ZixBdExlbik7DQp9DQoNCmludCB6Q2NBcHBfRW5jQXRSZXFDaGxkKGNoYXIgKkF0Y21kTXNnKQ0Kew0KICAgICAgICBpbnQgRmQgOw0KICAgICAgICBpbnQgQXRMZW47ICAgICAgICANCg0KICAgICAgICB6Q2NBcHBfU2V0QXRDaG5sQ21kSWQoQ0NfQVBQX0FUX0NNRF9SRVFfU0VUX0NITEQpOw0KICAgICAgICBBdExlbiA9IHN0cmxlbihBdGNtZE1zZyk7DQoNCiAgICAgICAgLyq3osvNKi8NCiAgICAgICAgRmQgPSB6Q2NBcHBfR2V0QXRDbWRGZCgpOw0KICAgICAgICByZXR1cm4gekNjQXBwX1BvcnRTZW5kKEZkLEF0Y21kTXNnLEF0TGVuKTsNCn0NCg0K