LyogUG9ydGlvbnMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29weXJpZ2h0KHMpLiAgU2VlCiAqIHRoZSBOZXQtU05NUCdzIENPUFlJTkcgZmlsZSBmb3IgbW9yZSBkZXRhaWxzIGFuZCBvdGhlciBjb3B5cmlnaHRzCiAqIHRoYXQgbWF5IGFwcGx5OgogKi8KLyoKICogUG9ydGlvbnMgb2YgdGhpcyBmaWxlIGFyZSBjb3B5cmlnaHRlZCBieToKICogQ29weXJpZ2h0IKkgMjAwMyBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAqIFVzZSBpcyBzdWJqZWN0IHRvIGxpY2Vuc2UgdGVybXMgc3BlY2lmaWVkIGluIHRoZSBDT1BZSU5HIGZpbGUKICogZGlzdHJpYnV0ZWQgd2l0aCB0aGUgTmV0LVNOTVAgcGFja2FnZS4KICovCgojaW5jbHVkZSA8bmV0LXNubXAvbmV0LXNubXAtY29uZmlnLmg+CgojaW5jbHVkZSA8c3RkaW8uaD4KI2luY2x1ZGUgPGVycm5vLmg+CiNpZiBIQVZFX1NURExJQl9ICiNpbmNsdWRlIDxzdGRsaWIuaD4KI2VuZGlmCiNpZiBIQVZFX1NUUklOR19ICiNpbmNsdWRlIDxzdHJpbmcuaD4KI2Vsc2UKI2luY2x1ZGUgPHN0cmluZ3MuaD4KI2VuZGlmCiNpZiBIQVZFX1VOSVNURF9ICiNpbmNsdWRlIDx1bmlzdGQuaD4KI2VuZGlmCiNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KI2lmIFRJTUVfV0lUSF9TWVNfVElNRQojIGlmZGVmIFdJTjMyCiMgIGluY2x1ZGUgPHN5cy90aW1lYi5oPgojIGVsc2UKIyAgaW5jbHVkZSA8c3lzL3RpbWUuaD4KIyBlbmRpZgojIGluY2x1ZGUgPHRpbWUuaD4KI2Vsc2UKIyBpZiBIQVZFX1NZU19USU1FX0gKIyAgaW5jbHVkZSA8c3lzL3RpbWUuaD4KIyBlbHNlCiMgIGluY2x1ZGUgPHRpbWUuaD4KIyBlbmRpZgojZW5kaWYKI2lmIEhBVkVfTkVUSU5FVF9JTl9ICiNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CiNlbmRpZgojaWYgSEFWRV9BUlBBX0lORVRfSAojaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CiNlbmRpZgoKI2lmIEhBVkVfV0lOU09DS19ICiNpbmNsdWRlIDx3aW5zb2NrLmg+CiNlbmRpZgoKI2luY2x1ZGUgPG5ldC1zbm1wL25ldC1zbm1wLWluY2x1ZGVzLmg+CgojaW5jbHVkZSAiYWdlbnR4L3Byb3RvY29sLmgiCgpjb25zdCBjaGFyICAgICAqCmFnZW50eF9jbWQodV9jaGFyIGNvZGUpCnsKICAgIHN3aXRjaCAoY29kZSkgewogICAgY2FzZSBBR0VOVFhfTVNHX09QRU46CiAgICAgICAgcmV0dXJuICJPcGVuIjsKICAgIGNhc2UgQUdFTlRYX01TR19DTE9TRToKICAgICAgICByZXR1cm4gIkNsb3NlIjsKICAgIGNhc2UgQUdFTlRYX01TR19SRUdJU1RFUjoKICAgICAgICByZXR1cm4gIlJlZ2lzdGVyIjsKICAgIGNhc2UgQUdFTlRYX01TR19VTlJFR0lTVEVSOgogICAgICAgIHJldHVybiAiVW5yZWdpc3RlciI7CiAgICBjYXNlIEFHRU5UWF9NU0dfR0VUOgogICAgICAgIHJldHVybiAiR2V0IjsKICAgIGNhc2UgQUdFTlRYX01TR19HRVRORVhUOgogICAgICAgIHJldHVybiAiR2V0IE5leHQiOwogICAgY2FzZSBBR0VOVFhfTVNHX0dFVEJVTEs6CiAgICAgICAgcmV0dXJuICJHZXQgQnVsayI7CiAgICBjYXNlIEFHRU5UWF9NU0dfVEVTVFNFVDoKICAgICAgICByZXR1cm4gIlRlc3QgU2V0IjsKICAgIGNhc2UgQUdFTlRYX01TR19DT01NSVRTRVQ6CiAgICAgICAgcmV0dXJuICJDb21taXQgU2V0IjsKICAgIGNhc2UgQUdFTlRYX01TR19VTkRPU0VUOgogICAgICAgIHJldHVybiAiVW5kbyBTZXQiOwogICAgY2FzZSBBR0VOVFhfTVNHX0NMRUFOVVBTRVQ6CiAgICAgICAgcmV0dXJuICJDbGVhbnVwIFNldCI7CiAgICBjYXNlIEFHRU5UWF9NU0dfTk9USUZZOgogICAgICAgIHJldHVybiAiTm90aWZ5IjsKICAgIGNhc2UgQUdFTlRYX01TR19QSU5HOgogICAgICAgIHJldHVybiAiUGluZyI7CiAgICBjYXNlIEFHRU5UWF9NU0dfSU5ERVhfQUxMT0NBVEU6CiAgICAgICAgcmV0dXJuICJJbmRleCBBbGxvY2F0ZSI7CiAgICBjYXNlIEFHRU5UWF9NU0dfSU5ERVhfREVBTExPQ0FURToKICAgICAgICByZXR1cm4gIkluZGV4IERlYWxsb2NhdGUiOwogICAgY2FzZSBBR0VOVFhfTVNHX0FERF9BR0VOVF9DQVBTOgogICAgICAgIHJldHVybiAiQWRkIEFnZW50IENhcHMiOwogICAgY2FzZSBBR0VOVFhfTVNHX1JFTU9WRV9BR0VOVF9DQVBTOgogICAgICAgIHJldHVybiAiUmVtb3ZlIEFnZW50IENhcHMiOwogICAgY2FzZSBBR0VOVFhfTVNHX1JFU1BPTlNFOgogICAgICAgIHJldHVybiAiUmVzcG9uc2UiOwogICAgZGVmYXVsdDoKICAgICAgICByZXR1cm4gIlVua25vd24iOwogICAgfQp9CgppbnQKYWdlbnR4X3JlYWxsb2NfYnVpbGRfaW50KHVfY2hhciAqKiBidWYsIHNpemVfdCAqIGJ1Zl9sZW4sIHNpemVfdCAqIG91dF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCB2YWx1ZSwgaW50IG5ldHdvcmtfb3JkZXIpCnsKICAgIHVuc2lnbmVkIGludCAgICBpdmFsdWUgPSB2YWx1ZTsKICAgIHNpemVfdCAgICAgICAgICBpbGVuID0gKm91dF9sZW47CiNpZmRlZiBXT1JEU19CSUdFTkRJQU4KICAgIHVuc2lnbmVkIGludCAgICBpID0gMDsKI2VuZGlmCgogICAgd2hpbGUgKCgqb3V0X2xlbiArIDQpID49ICpidWZfbGVuKSB7CiAgICAgICAgaWYgKCEoYWxsb3dfcmVhbGxvYyAmJiBzbm1wX3JlYWxsb2MoYnVmLCBidWZfbGVuKSkpIHsKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQogICAgfQoKICAgIGlmIChuZXR3b3JrX29yZGVyKSB7CiNpZm5kZWYgV09SRFNfQklHRU5ESUFOCiAgICAgICAgdmFsdWUgPSBudG9obCh2YWx1ZSk7CiNlbmRpZgogICAgICAgIG1lbW1vdmUoKCpidWYgKyAqb3V0X2xlbiksICZ2YWx1ZSwgNCk7CiAgICAgICAgKm91dF9sZW4gKz0gNDsKICAgIH0gZWxzZSB7CiNpZm5kZWYgV09SRFNfQklHRU5ESUFOCiAgICAgICAgbWVtbW92ZSgoKmJ1ZiArICpvdXRfbGVuKSwgJnZhbHVlLCA0KTsKICAgICAgICAqb3V0X2xlbiArPSA0OwojZWxzZQogICAgICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKICAgICAgICAgICAgKigqYnVmICsgKm91dF9sZW4pID0gKHVfY2hhcikgdmFsdWUgJiAweGZmOwogICAgICAgICAgICAoKm91dF9sZW4pKys7CiAgICAgICAgICAgIHZhbHVlID4+PSA4OwogICAgICAgIH0KI2VuZGlmCiAgICB9CiAgICBERUJVR0RVTVBTRVRVUCgic2VuZCIsICgqYnVmICsgaWxlbiksIDQpOwogICAgREVCVUdNU0coKCJkdW1wdl9zZW5kIiwgIiAgSW50ZWdlcjpcdCV1ICgweCUuMlgpXG4iLCBpdmFsdWUsCiAgICAgICAgICAgICAgaXZhbHVlKSk7CiAgICByZXR1cm4gMTsKfQoKdm9pZAphZ2VudHhfYnVpbGRfaW50KHVfY2hhciAqIGJ1ZnAsIHVfaW50IHZhbHVlLCBpbnQgbmV0d29ya19ieXRlX29yZGVyKQp7CiAgICB1X2NoYXIgICAgICAgICAqb3JpZ19idWZwID0gYnVmcDsKICAgIHVfaW50ICAgICAgICAgICBvcmlnX3ZhbCA9IHZhbHVlOwoKICAgIGlmIChuZXR3b3JrX2J5dGVfb3JkZXIpIHsKI2lmbmRlZiBXT1JEU19CSUdFTkRJQU4KICAgICAgICB2YWx1ZSA9IG50b2hsKHZhbHVlKTsKI2VuZGlmCiAgICAgICAgbWVtbW92ZShidWZwLCAmdmFsdWUsIDQpOwogICAgfSBlbHNlIHsKI2lmbmRlZiBXT1JEU19CSUdFTkRJQU4KICAgICAgICBtZW1tb3ZlKGJ1ZnAsICZ2YWx1ZSwgNCk7CiNlbHNlCiAgICAgICAgKmJ1ZnAgPSAodV9jaGFyKSB2YWx1ZSAmIDB4ZmY7CiAgICAgICAgdmFsdWUgPj49IDg7CiAgICAgICAgYnVmcCsrOwogICAgICAgICpidWZwID0gKHVfY2hhcikgdmFsdWUgJiAweGZmOwogICAgICAgIHZhbHVlID4+PSA4OwogICAgICAgIGJ1ZnArKzsKICAgICAgICAqYnVmcCA9ICh1X2NoYXIpIHZhbHVlICYgMHhmZjsKICAgICAgICB2YWx1ZSA+Pj0gODsKICAgICAgICBidWZwKys7CiAgICAgICAgKmJ1ZnAgPSAodV9jaGFyKSB2YWx1ZSAmIDB4ZmY7CiNlbmRpZgogICAgfQogICAgREVCVUdEVU1QU0VUVVAoInNlbmQiLCBvcmlnX2J1ZnAsIDQpOwogICAgREVCVUdNU0coKCJkdW1wdl9zZW5kIiwgIiAgSW50ZWdlcjpcdCV1ICgweCUuMlgpXG4iLCBvcmlnX3ZhbCwKICAgICAgICAgICAgICBvcmlnX3ZhbCkpOwp9CgppbnQKYWdlbnR4X3JlYWxsb2NfYnVpbGRfc2hvcnQodV9jaGFyICoqIGJ1Ziwgc2l6ZV90ICogYnVmX2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICogb3V0X2xlbiwgaW50IGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIHNob3J0IHZhbHVlLCBpbnQgbmV0d29ya19vcmRlcikKewogICAgdW5zaWduZWQgc2hvcnQgIGl2YWx1ZSA9IHZhbHVlOwogICAgc2l6ZV90ICAgICAgICAgIGlsZW4gPSAqb3V0X2xlbjsKI2lmZGVmIFdPUkRTX0JJR0VORElBTgogICAgdW5zaWduZWQgc2hvcnQgIGkgPSAwOwojZW5kaWYKCiAgICB3aGlsZSAoKCpvdXRfbGVuICsgMikgPj0gKmJ1Zl9sZW4pIHsKICAgICAgICBpZiAoIShhbGxvd19yZWFsbG9jICYmIHNubXBfcmVhbGxvYyhidWYsIGJ1Zl9sZW4pKSkgewogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CiAgICB9CgogICAgaWYgKG5ldHdvcmtfb3JkZXIpIHsKI2lmbmRlZiBXT1JEU19CSUdFTkRJQU4KICAgICAgICB2YWx1ZSA9IG50b2hzKHZhbHVlKTsKI2VuZGlmCiAgICAgICAgbWVtbW92ZSgoKmJ1ZiArICpvdXRfbGVuKSwgJnZhbHVlLCAyKTsKICAgICAgICAqb3V0X2xlbiArPSAyOwogICAgfSBlbHNlIHsKI2lmbmRlZiBXT1JEU19CSUdFTkRJQU4KICAgICAgICBtZW1tb3ZlKCgqYnVmICsgKm91dF9sZW4pLCAmdmFsdWUsIDIpOwogICAgICAgICpvdXRfbGVuICs9IDI7CiNlbHNlCiAgICAgICAgZm9yIChpID0gMDsgaSA8IDI7IGkrKykgewogICAgICAgICAgICAqKCpidWYgKyAqb3V0X2xlbikgPSAodV9jaGFyKSB2YWx1ZSAmIDB4ZmY7CiAgICAgICAgICAgICgqb3V0X2xlbikrKzsKICAgICAgICAgICAgdmFsdWUgPj49IDg7CiAgICAgICAgfQojZW5kaWYKICAgIH0KICAgIERFQlVHRFVNUFNFVFVQKCJzZW5kIiwgKCpidWYgKyBpbGVuKSwgMik7CiAgICBERUJVR01TRygoImR1bXB2X3NlbmQiLCAiICBTaG9ydDpcdCVodSAoMHglLjJoWClcbiIsIGl2YWx1ZSwgaXZhbHVlKSk7CiAgICByZXR1cm4gMTsKfQoKaW50CmFnZW50eF9yZWFsbG9jX2J1aWxkX29pZCh1X2NoYXIgKiogYnVmLCBzaXplX3QgKiBidWZfbGVuLCBzaXplX3QgKiBvdXRfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5jbHVzaXZlLCBvaWQgKiBuYW1lLCBzaXplX3QgbmFtZV9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbmV0d29ya19vcmRlcikKewogICAgc2l6ZV90ICAgICAgICAgIGlsZW4gPSAqb3V0X2xlbiwgaSA9IDA7CiAgICBpbnQgICAgICAgICAgICAgcHJlZml4ID0gMDsKCiAgICBERUJVR1BSSU5USU5ERU5UKCJkdW1wdl9zZW5kIik7CiAgICBERUJVR01TRygoImR1bXB2X3NlbmQiLCAiT0lEOiAiKSk7CiAgICBERUJVR01TR09JRCgoImR1bXB2X3NlbmQiLCBuYW1lLCBuYW1lX2xlbikpOwogICAgREVCVUdNU0coKCJkdW1wdl9zZW5kIiwgIlxuIikpOwoKICAgIC8qCiAgICAgKiBVcGRhdGVkIGNsYXJpZmljYXRpb24gZnJvbSB0aGUgQWdlbnRYIG1haWxpbmcgbGlzdC4KICAgICAqIFRoZSAibnVsbCBPYmplY3QgSWRlbnRpZmllciIgbWVudGlvbmVkIGluIFJGQyAyNDcxLAogICAgICogc2VjdGlvbiA1LjEgaXMgYSBzcGVjaWFsIHBsYWNlaG9sZGVyIHZhbHVlLCBhbmQKICAgICAqIHNob3VsZCBvbmx5IGJlIHVzZWQgd2hlbiBleHBsaWNpdGx5IG1lbnRpb25lZCBpbgogICAgICogdGhpcyBSRkMuICBJbiBwYXJ0aWN1bGFyLCBpdCBkb2VzICpub3QqIG1lYW4gezAsIDB9CiAgICAgKi8KICAgIGlmIChuYW1lX2xlbiA9PSAwKQogICAgICAgIGluY2x1c2l2ZSA9IDA7CgogICAgLyoKICAgICAqICdDb21wYWN0JyBpbnRlcm5ldCBPSURzIAogICAgICovCiAgICBpZiAobmFtZV9sZW4gPj0gNSAmJiAobmFtZVswXSA9PSAxICYmIG5hbWVbMV0gPT0gMyAmJgogICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVbMl0gPT0gNiAmJiBuYW1lWzNdID09IDEgJiYKICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lWzRdID4gMCAmJiBuYW1lWzRdIDwgMjU2KSkgewogICAgICAgIHByZWZpeCA9IG5hbWVbNF07CiAgICAgICAgbmFtZSArPSA1OwogICAgICAgIG5hbWVfbGVuIC09IDU7CiAgICB9CgogICAgd2hpbGUgKCgqb3V0X2xlbiArIDQgKyAoNCAqIG5hbWVfbGVuKSkgPj0gKmJ1Zl9sZW4pIHsKICAgICAgICBpZiAoIShhbGxvd19yZWFsbG9jICYmIHNubXBfcmVhbGxvYyhidWYsIGJ1Zl9sZW4pKSkgewogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CiAgICB9CgogICAgKigqYnVmICsgKm91dF9sZW4pID0gKHVfY2hhcikgbmFtZV9sZW47CiAgICAoKm91dF9sZW4pKys7CiAgICAqKCpidWYgKyAqb3V0X2xlbikgPSAodV9jaGFyKSBwcmVmaXg7CiAgICAoKm91dF9sZW4pKys7CiAgICAqKCpidWYgKyAqb3V0X2xlbikgPSAodV9jaGFyKSBpbmNsdXNpdmU7CiAgICAoKm91dF9sZW4pKys7CiAgICAqKCpidWYgKyAqb3V0X2xlbikgPSAodV9jaGFyKSAweDAwOwogICAgKCpvdXRfbGVuKSsrOwoKICAgIERFQlVHRFVNUEhFQURFUigic2VuZCIsICJPSUQgSGVhZGVyIik7CiAgICBERUJVR0RVTVBTRVRVUCgic2VuZCIsICgqYnVmICsgaWxlbiksIDQpOwogICAgREVCVUdNU0coKCJkdW1wdl9zZW5kIiwgIiAgIyBzdWJpZHM6XHQlZCAoMHglLjJYKVxuIiwgKGludCluYW1lX2xlbiwKICAgICAgICAgICAgICAodW5zaWduZWQgaW50KW5hbWVfbGVuKSk7CiAgICBERUJVR1BSSU5USU5ERU5UKCJkdW1wdl9zZW5kIik7CiAgICBERUJVR01TRygoImR1bXB2X3NlbmQiLCAiICBwcmVmaXg6XHQlZCAoMHglLjJYKVxuIiwgcHJlZml4LCBwcmVmaXgpKTsKICAgIERFQlVHUFJJTlRJTkRFTlQoImR1bXB2X3NlbmQiKTsKICAgIERFQlVHTVNHKCgiZHVtcHZfc2VuZCIsICIgIGluY2x1c2l2ZTpcdCVkICgweCUuMlgpXG4iLCBpbmNsdXNpdmUsCiAgICAgICAgICAgICAgaW5jbHVzaXZlKSk7CiAgICBERUJVR0lOREVOVExFU1MoKTsKICAgIERFQlVHRFVNUEhFQURFUigic2VuZCIsICJPSUQgU2VnbWVudHMiKTsKCiAgICBmb3IgKGkgPSAwOyBpIDwgbmFtZV9sZW47IGkrKykgewogICAgICAgIGlmICghYWdlbnR4X3JlYWxsb2NfYnVpbGRfaW50KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lW2ldLCBuZXR3b3JrX29yZGVyKSkgewogICAgICAgICAgICBERUJVR0lOREVOVExFU1MoKTsKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQogICAgfQogICAgREVCVUdJTkRFTlRMRVNTKCk7CgogICAgcmV0dXJuIDE7Cn0KCmludAphZ2VudHhfcmVhbGxvY19idWlsZF9zdHJpbmcodV9jaGFyICoqIGJ1Ziwgc2l6ZV90ICogYnVmX2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAqIG91dF9sZW4sIGludCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdV9jaGFyICogc3RyaW5nLCBzaXplX3Qgc3RyaW5nX2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuZXR3b3JrX29yZGVyKQp7CiAgICBzaXplX3QgICAgICAgICAgaWxlbiA9ICpvdXRfbGVuLCBpID0gMDsKCiAgICB3aGlsZSAoKCpvdXRfbGVuICsgNCArICg0ICogKChzdHJpbmdfbGVuICsgMykgLyA0KSkpID49ICpidWZfbGVuKSB7CiAgICAgICAgaWYgKCEoYWxsb3dfcmVhbGxvYyAmJiBzbm1wX3JlYWxsb2MoYnVmLCBidWZfbGVuKSkpIHsKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQogICAgfQoKICAgIERFQlVHRFVNUEhFQURFUigic2VuZCIsICJCdWlsZCBTdHJpbmciKTsKICAgIERFQlVHRFVNUEhFQURFUigic2VuZCIsICJsZW5ndGgiKTsKICAgIGlmICghYWdlbnR4X3JlYWxsb2NfYnVpbGRfaW50KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ19sZW4sIG5ldHdvcmtfb3JkZXIpKSB7CiAgICAgICAgREVCVUdJTkRFTlRMRVNTKCk7CiAgICAgICAgREVCVUdJTkRFTlRMRVNTKCk7CiAgICAgICAgcmV0dXJuIDA7CiAgICB9CgogICAgaWYgKHN0cmluZ19sZW4gPT0gMCkgewogICAgICAgIERFQlVHTVNHKCgiZHVtcHZfc2VuZCIsICIgIFN0cmluZzogPGVtcHR5PlxuIikpOwogICAgICAgIERFQlVHSU5ERU5UTEVTUygpOwogICAgICAgIERFQlVHSU5ERU5UTEVTUygpOwogICAgICAgIHJldHVybiAxOwogICAgfQoKICAgIG1lbW1vdmUoKCpidWYgKyAqb3V0X2xlbiksIHN0cmluZywgc3RyaW5nX2xlbik7CiAgICAqb3V0X2xlbiArPSBzdHJpbmdfbGVuOwoKICAgIC8qCiAgICAgKiBQYWQgdG8gYSBtdWx0aXBsZSBvZiA0IGJ5dGVzIGlmIG5lY2Vzc2FyeSAocGVyIFJGQyAyNzQxKS4gIAogICAgICovCgogICAgaWYgKHN0cmluZ19sZW4gJSA0ICE9IDApIHsKICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNCAtIChzdHJpbmdfbGVuICUgNCk7IGkrKykgewogICAgICAgICAgICAqKCpidWYgKyAqb3V0X2xlbikgPSAwOwogICAgICAgICAgICAoKm91dF9sZW4pKys7CiAgICAgICAgfQogICAgfQoKICAgIERFQlVHRFVNUFNFVFVQKCJzZW5kIiwgKCpidWYgKyBpbGVuICsgNCksICgoc3RyaW5nX2xlbiArIDMpIC8gNCkgKiA0KTsKICAgIERFQlVHTVNHKCgiZHVtcHZfc2VuZCIsICIgIFN0cmluZzpcdCVzXG4iLCBzdHJpbmcpKTsKICAgIERFQlVHSU5ERU5UTEVTUygpOwogICAgREVCVUdJTkRFTlRMRVNTKCk7CiAgICByZXR1cm4gMTsKfQoKI2lmZGVmIE5FVFNOTVBfV0lUSF9PUEFRVUVfU1BFQ0lBTF9UWVBFUwppbnQKYWdlbnR4X3JlYWxsb2NfYnVpbGRfZG91YmxlKHVfY2hhciAqKiBidWYsIHNpemVfdCAqIGJ1Zl9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgKiBvdXRfbGVuLCBpbnQgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBkb3VibGVfdmFsLCBpbnQgbmV0d29ya19vcmRlcikKewogICAgdW5pb24gewogICAgICAgIGRvdWJsZSAgICAgICAgICBkb3VibGVWYWw7CiAgICAgICAgaW50ICAgICAgICAgICAgIGludFZhbFsyXTsKICAgICAgICBjaGFyICAgICAgICAgICAgY1tzaXplb2YoZG91YmxlKV07CiAgICB9IGR1OwogICAgaW50ICAgICAgICAgICAgIHRtcDsKICAgIHVfY2hhciAgICAgICAgICBvcGFxdWVfYnVmZmVyWzMgKyBzaXplb2YoZG91YmxlKV07CgogICAgb3BhcXVlX2J1ZmZlclswXSA9IEFTTl9PUEFRVUVfVEFHMTsKICAgIG9wYXF1ZV9idWZmZXJbMV0gPSBBU05fT1BBUVVFX0RPVUJMRTsKICAgIG9wYXF1ZV9idWZmZXJbMl0gPSBzaXplb2YoZG91YmxlKTsKCiAgICBkdS5kb3VibGVWYWwgPSBkb3VibGVfdmFsOwogICAgdG1wID0gaHRvbmwoZHUuaW50VmFsWzBdKTsKICAgIGR1LmludFZhbFswXSA9IGh0b25sKGR1LmludFZhbFsxXSk7CiAgICBkdS5pbnRWYWxbMV0gPSB0bXA7CiAgICBtZW1jcHkoJm9wYXF1ZV9idWZmZXJbM10sICZkdS5jWzBdLCBzaXplb2YoZG91YmxlKSk7CgogICAgcmV0dXJuIGFnZW50eF9yZWFsbG9jX2J1aWxkX3N0cmluZyhidWYsIGJ1Zl9sZW4sIG91dF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93X3JlYWxsb2MsIG9wYXF1ZV9idWZmZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMgKyBzaXplb2YoZG91YmxlKSwgbmV0d29ya19vcmRlcik7Cn0KCmludAphZ2VudHhfcmVhbGxvY19idWlsZF9mbG9hdCh1X2NoYXIgKiogYnVmLCBzaXplX3QgKiBidWZfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgKiBvdXRfbGVuLCBpbnQgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgZmxvYXRfdmFsLCBpbnQgbmV0d29ya19vcmRlcikKewogICAgdW5pb24gewogICAgICAgIGZsb2F0ICAgICAgICAgICBmbG9hdFZhbDsKICAgICAgICBpbnQgICAgICAgICAgICAgaW50VmFsOwogICAgICAgIGNoYXIgICAgICAgICAgICBjW3NpemVvZihmbG9hdCldOwogICAgfSBmdTsKICAgIHVfY2hhciAgICAgICAgICBvcGFxdWVfYnVmZmVyWzMgKyBzaXplb2YoZmxvYXQpXTsKCiAgICBvcGFxdWVfYnVmZmVyWzBdID0gQVNOX09QQVFVRV9UQUcxOwogICAgb3BhcXVlX2J1ZmZlclsxXSA9IEFTTl9PUEFRVUVfRkxPQVQ7CiAgICBvcGFxdWVfYnVmZmVyWzJdID0gc2l6ZW9mKGZsb2F0KTsKCiAgICBmdS5mbG9hdFZhbCA9IGZsb2F0X3ZhbDsKICAgIGZ1LmludFZhbCA9IGh0b25sKGZ1LmludFZhbCk7CiAgICBtZW1jcHkoJm9wYXF1ZV9idWZmZXJbM10sICZmdS5jWzBdLCBzaXplb2YoZmxvYXQpKTsKCiAgICByZXR1cm4gYWdlbnR4X3JlYWxsb2NfYnVpbGRfc3RyaW5nKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dfcmVhbGxvYywgb3BhcXVlX2J1ZmZlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMyArIHNpemVvZihmbG9hdCksIG5ldHdvcmtfb3JkZXIpOwp9CiNlbmRpZgoKaW50CmFnZW50eF9yZWFsbG9jX2J1aWxkX3ZhcmJpbmQodV9jaGFyICoqIGJ1Ziwgc2l6ZV90ICogYnVmX2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgKiBvdXRfbGVuLCBpbnQgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXRzbm1wX3ZhcmlhYmxlX2xpc3QgKiB2cCwgaW50IG5ldHdvcmtfb3JkZXIpCnsKICAgIERFQlVHRFVNUEhFQURFUigic2VuZCIsICJWYXJCaW5kIik7CiAgICBERUJVR0RVTVBIRUFERVIoInNlbmQiLCAidHlwZSIpOwojaWZkZWYgTkVUU05NUF9XSVRIX09QQVFVRV9TUEVDSUFMX1RZUEVTCiAgICBpZiAoKHZwLT50eXBlID09IEFTTl9PUEFRVUVfRkxPQVQpIHx8ICh2cC0+dHlwZSA9PSBBU05fT1BBUVVFX0RPVUJMRSkKICAgICAgICB8fCAodnAtPnR5cGUgPT0gQVNOX09QQVFVRV9JNjQpIHx8ICh2cC0+dHlwZSA9PSBBU05fT1BBUVVFX1U2NCkKICAgICAgICB8fCAodnAtPnR5cGUgPT0gQVNOX09QQVFVRV9DT1VOVEVSNjQpKSB7CiAgICAgICAgaWYgKCFhZ2VudHhfcmVhbGxvY19idWlsZF9zaG9ydAogICAgICAgICAgICAoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgKHVuc2lnbmVkIHNob3J0KSBBU05fT1BBUVVFLCBuZXR3b3JrX29yZGVyKSkgewogICAgICAgICAgICBERUJVR0lOREVOVExFU1MoKTsKICAgICAgICAgICAgREVCVUdJTkRFTlRMRVNTKCk7CiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KICAgIH0gZWxzZQojZW5kaWYKICAgIGlmICh2cC0+dHlwZSA9PSBBU05fUFJJVl9JTkNMX1JBTkdFIHx8IHZwLT50eXBlID09IEFTTl9QUklWX0VYQ0xfUkFOR0UpIHsKICAgICAgICBpZiAoIWFnZW50eF9yZWFsbG9jX2J1aWxkX3Nob3J0CiAgICAgICAgICAgIChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAodW5zaWduZWQgc2hvcnQpIEFTTl9PQkpFQ1RfSUQsIG5ldHdvcmtfb3JkZXIpKSB7CiAgICAgICAgICAgIERFQlVHSU5ERU5UTEVTUygpOwogICAgICAgICAgICBERUJVR0lOREVOVExFU1MoKTsKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgICBpZiAoIWFnZW50eF9yZWFsbG9jX2J1aWxkX3Nob3J0CiAgICAgICAgICAgIChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAodW5zaWduZWQgc2hvcnQpIHZwLT50eXBlLCBuZXR3b3JrX29yZGVyKSkgewogICAgICAgICAgICBERUJVR0lOREVOVExFU1MoKTsKICAgICAgICAgICAgREVCVUdJTkRFTlRMRVNTKCk7CiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KICAgIH0KCiAgICB3aGlsZSAoKCpvdXRfbGVuICsgMikgPj0gKmJ1Zl9sZW4pIHsKICAgICAgICBpZiAoIShhbGxvd19yZWFsbG9jICYmIHNubXBfcmVhbGxvYyhidWYsIGJ1Zl9sZW4pKSkgewogICAgICAgICAgICBERUJVR0lOREVOVExFU1MoKTsKICAgICAgICAgICAgREVCVUdJTkRFTlRMRVNTKCk7CiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KICAgIH0KCiAgICAqKCpidWYgKyAqb3V0X2xlbikgPSAwOwogICAgKCpvdXRfbGVuKSsrOwogICAgKigqYnVmICsgKm91dF9sZW4pID0gMDsKICAgICgqb3V0X2xlbikrKzsKICAgIERFQlVHSU5ERU5UTEVTUygpOwoKICAgIERFQlVHRFVNUEhFQURFUigic2VuZCIsICJuYW1lIik7CiAgICBpZiAoIWFnZW50eF9yZWFsbG9jX2J1aWxkX29pZChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2cC0+bmFtZSwgdnAtPm5hbWVfbGVuZ3RoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV0d29ya19vcmRlcikpIHsKICAgICAgICBERUJVR0lOREVOVExFU1MoKTsKICAgICAgICBERUJVR0lOREVOVExFU1MoKTsKICAgICAgICByZXR1cm4gMDsKICAgIH0KICAgIERFQlVHSU5ERU5UTEVTUygpOwoKICAgIERFQlVHRFVNUEhFQURFUigic2VuZCIsICJ2YWx1ZSIpOwogICAgc3dpdGNoICh2cC0+dHlwZSkgewoKICAgIGNhc2UgQVNOX0lOVEVHRVI6CiAgICBjYXNlIEFTTl9DT1VOVEVSOgogICAgY2FzZSBBU05fR0FVR0U6CiAgICBjYXNlIEFTTl9USU1FVElDS1M6CiAgICBjYXNlIEFTTl9VSU5URUdFUjoKICAgICAgICBpZiAoIWFnZW50eF9yZWFsbG9jX2J1aWxkX2ludChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKih2cC0+dmFsLmludGVnZXIpLCBuZXR3b3JrX29yZGVyKSkgewogICAgICAgICAgICBERUJVR0lOREVOVExFU1MoKTsKICAgICAgICAgICAgREVCVUdJTkRFTlRMRVNTKCk7CiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KICAgICAgICBicmVhazsKCiNpZmRlZiBORVRTTk1QX1dJVEhfT1BBUVVFX1NQRUNJQUxfVFlQRVMKICAgIGNhc2UgQVNOX09QQVFVRV9GTE9BVDoKICAgICAgICBERUJVR0RVTVBIRUFERVIoInNlbmQiLCAiQnVpbGQgT3BhcXVlIEZsb2F0Iik7CiAgICAgICAgREVCVUdQUklOVElOREVOVCgiZHVtcHZfc2VuZCIpOwogICAgICAgIERFQlVHTVNHKCgiZHVtcHZfc2VuZCIsICIgIEZsb2F0Olx0JWZcbiIsICoodnAtPnZhbC5mbG9hdFZhbCkpKTsKICAgICAgICBpZiAoIWFnZW50eF9yZWFsbG9jX2J1aWxkX2Zsb2F0CiAgICAgICAgICAgIChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsICoodnAtPnZhbC5mbG9hdFZhbCksCiAgICAgICAgICAgICBuZXR3b3JrX29yZGVyKSkgewogICAgICAgICAgICBERUJVR0lOREVOVExFU1MoKTsKICAgICAgICAgICAgREVCVUdJTkRFTlRMRVNTKCk7CiAgICAgICAgICAgIERFQlVHSU5ERU5UTEVTUygpOwogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CiAgICAgICAgREVCVUdJTkRFTlRMRVNTKCk7CiAgICAgICAgYnJlYWs7CgogICAgY2FzZSBBU05fT1BBUVVFX0RPVUJMRToKICAgICAgICBERUJVR0RVTVBIRUFERVIoInNlbmQiLCAiQnVpbGQgT3BhcXVlIERvdWJsZSIpOwogICAgICAgIERFQlVHUFJJTlRJTkRFTlQoImR1bXB2X3NlbmQiKTsKICAgICAgICBERUJVR01TRygoImR1bXB2X3NlbmQiLCAiICBEb3VibGU6XHQlZlxuIiwgKih2cC0+dmFsLmRvdWJsZVZhbCkpKTsKICAgICAgICBpZiAoIWFnZW50eF9yZWFsbG9jX2J1aWxkX2RvdWJsZQogICAgICAgICAgICAoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCAqKHZwLT52YWwuZG91YmxlVmFsKSwKICAgICAgICAgICAgIG5ldHdvcmtfb3JkZXIpKSB7CiAgICAgICAgICAgIERFQlVHSU5ERU5UTEVTUygpOwogICAgICAgICAgICBERUJVR0lOREVOVExFU1MoKTsKICAgICAgICAgICAgREVCVUdJTkRFTlRMRVNTKCk7CiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KICAgICAgICBERUJVR0lOREVOVExFU1MoKTsKICAgICAgICBicmVhazsKCiAgICBjYXNlIEFTTl9PUEFRVUVfSTY0OgogICAgY2FzZSBBU05fT1BBUVVFX1U2NDoKICAgIGNhc2UgQVNOX09QQVFVRV9DT1VOVEVSNjQ6CiAgICAgICAgLyoKICAgICAgICAgKiBYWFggLSBUT0RPIC0gZW5jb2RlIGFzIHJhdyBPUEFRVUUgZm9yIG5vdyAoc28gZmFsbCB0aHJvdWdoCiAgICAgICAgICogaGVyZSkuICAKICAgICAgICAgKi8KI2VuZGlmCgogICAgY2FzZSBBU05fT0NURVRfU1RSOgogICAgY2FzZSBBU05fSVBBRERSRVNTOgogICAgY2FzZSBBU05fT1BBUVVFOgogICAgICAgIGlmICghYWdlbnR4X3JlYWxsb2NfYnVpbGRfc3RyaW5nCiAgICAgICAgICAgIChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsIHZwLT52YWwuc3RyaW5nLAogICAgICAgICAgICAgdnAtPnZhbF9sZW4sIG5ldHdvcmtfb3JkZXIpKSB7CiAgICAgICAgICAgIERFQlVHSU5ERU5UTEVTUygpOwogICAgICAgICAgICBERUJVR0lOREVOVExFU1MoKTsKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQogICAgICAgIGJyZWFrOwoKICAgIGNhc2UgQVNOX09CSkVDVF9JRDoKICAgIGNhc2UgQVNOX1BSSVZfRVhDTF9SQU5HRToKICAgIGNhc2UgQVNOX1BSSVZfSU5DTF9SQU5HRToKICAgICAgICBpZiAoIWFnZW50eF9yZWFsbG9jX2J1aWxkX29pZAogICAgICAgICAgICAoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCAxLCB2cC0+dmFsLm9iamlkLAogICAgICAgICAgICAgdnAtPnZhbF9sZW4gLyBzaXplb2Yob2lkKSwgbmV0d29ya19vcmRlcikpIHsKICAgICAgICAgICAgREVCVUdJTkRFTlRMRVNTKCk7CiAgICAgICAgICAgIERFQlVHSU5ERU5UTEVTUygpOwogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CiAgICAgICAgYnJlYWs7CgogICAgY2FzZSBBU05fQ09VTlRFUjY0OgogICAgICAgIGlmIChuZXR3b3JrX29yZGVyKSB7CiAgICAgICAgICAgIERFQlVHRFVNUEhFQURFUigic2VuZCIsICJCdWlsZCBDb3VudGVyNjQgKGhpZ2gsIGxvdykiKTsKICAgICAgICAgICAgaWYgKCFhZ2VudHhfcmVhbGxvY19idWlsZF9pbnQKICAgICAgICAgICAgICAgIChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgdnAtPnZhbC5jb3VudGVyNjQtPmhpZ2gsIG5ldHdvcmtfb3JkZXIpCiAgICAgICAgICAgICAgICB8fCAhYWdlbnR4X3JlYWxsb2NfYnVpbGRfaW50KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdnAtPnZhbC5jb3VudGVyNjQtPmxvdywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV0d29ya19vcmRlcikpIHsKICAgICAgICAgICAgICAgIERFQlVHSU5ERU5UTEVTUygpOwogICAgICAgICAgICAgICAgREVCVUdJTkRFTlRMRVNTKCk7CiAgICAgICAgICAgICAgICBERUJVR0lOREVOVExFU1MoKTsKICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICB9CiAgICAgICAgICAgIERFQlVHSU5ERU5UTEVTUygpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIERFQlVHRFVNUEhFQURFUigic2VuZCIsICJCdWlsZCBDb3VudGVyNjQgKGxvdywgaGlnaCkiKTsKICAgICAgICAgICAgaWYgKCFhZ2VudHhfcmVhbGxvY19idWlsZF9pbnQKICAgICAgICAgICAgICAgIChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgdnAtPnZhbC5jb3VudGVyNjQtPmxvdywgbmV0d29ya19vcmRlcikKICAgICAgICAgICAgICAgIHx8ICFhZ2VudHhfcmVhbGxvY19idWlsZF9pbnQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2cC0+dmFsLmNvdW50ZXI2NC0+aGlnaCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV0d29ya19vcmRlcikpIHsKICAgICAgICAgICAgICAgIERFQlVHSU5ERU5UTEVTUygpOwogICAgICAgICAgICAgICAgREVCVUdJTkRFTlRMRVNTKCk7CiAgICAgICAgICAgICAgICBERUJVR0lOREVOVExFU1MoKTsKICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICB9CiAgICAgICAgICAgIERFQlVHSU5ERU5UTEVTUygpOwogICAgICAgIH0KICAgICAgICBicmVhazsKCiAgICBjYXNlIEFTTl9OVUxMOgogICAgY2FzZSBTTk1QX05PU1VDSE9CSkVDVDoKICAgIGNhc2UgU05NUF9OT1NVQ0hJTlNUQU5DRToKICAgIGNhc2UgU05NUF9FTkRPRk1JQlZJRVc6CiAgICAgICAgYnJlYWs7CgogICAgZGVmYXVsdDoKICAgICAgICBERUJVR01TR1RMKCgiYWdlbnR4X2J1aWxkX3ZhcmJpbmQiLCAidW5rbm93biB0eXBlICVkICgweCUwMngpXG4iLAogICAgICAgICAgICAgICAgICAgIHZwLT50eXBlLCB2cC0+dHlwZSkpOwogICAgICAgIERFQlVHSU5ERU5UTEVTUygpOwogICAgICAgIERFQlVHSU5ERU5UTEVTUygpOwogICAgICAgIHJldHVybiAwOwogICAgfQogICAgREVCVUdJTkRFTlRMRVNTKCk7CiAgICBERUJVR0lOREVOVExFU1MoKTsKICAgIHJldHVybiAxOwp9CgppbnQKYWdlbnR4X3JlYWxsb2NfYnVpbGRfaGVhZGVyKHVfY2hhciAqKiBidWYsIHNpemVfdCAqIGJ1Zl9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgKiBvdXRfbGVuLCBpbnQgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldHNubXBfcGR1ICpwZHUpCnsKICAgIHNpemVfdCAgICAgICAgICBpbGVuID0gKm91dF9sZW47CiAgICBjb25zdCBpbnQgICAgICAgbmV0d29ya19vcmRlciA9CiAgICAgICAgcGR1LT5mbGFncyAmIEFHRU5UWF9GTEFHU19ORVRXT1JLX0JZVEVfT1JERVI7CgogICAgd2hpbGUgKCgqb3V0X2xlbiArIDQpID49ICpidWZfbGVuKSB7CiAgICAgICAgaWYgKCEoYWxsb3dfcmVhbGxvYyAmJiBzbm1wX3JlYWxsb2MoYnVmLCBidWZfbGVuKSkpIHsKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQogICAgfQoKICAgIC8qCiAgICAgKiBGaXJzdCA0IGJ5dGVzIGFyZSB2ZXJzaW9uLCBwZHUgdHlwZSwgZmxhZ3MsIGFuZCBhIDAgcmVzZXJ2ZWQgYnl0ZS4gIAogICAgICovCgogICAgKigqYnVmICsgKm91dF9sZW4pID0gMTsKICAgICgqb3V0X2xlbikrKzsKICAgICooKmJ1ZiArICpvdXRfbGVuKSA9IHBkdS0+Y29tbWFuZDsKICAgICgqb3V0X2xlbikrKzsKICAgICooKmJ1ZiArICpvdXRfbGVuKSA9ICh1X2NoYXIpIChwZHUtPmZsYWdzICYgQUdFTlRYX01TR19GTEFHU19NQVNLKTsKICAgICgqb3V0X2xlbikrKzsKICAgICooKmJ1ZiArICpvdXRfbGVuKSA9IDA7CiAgICAoKm91dF9sZW4pKys7CgogICAgREVCVUdEVU1QSEVBREVSKCJzZW5kIiwgIkFnZW50WCBIZWFkZXIiKTsKICAgIERFQlVHRFVNUFNFVFVQKCJzZW5kIiwgKCpidWYgKyBpbGVuKSwgNCk7CiAgICBERUJVR01TRygoImR1bXB2X3NlbmQiLCAiICBWZXJzaW9uOlx0JWRcbiIsIChpbnQpICooKmJ1ZiArIGlsZW4pKSk7CiAgICBERUJVR1BSSU5USU5ERU5UKCJkdW1wdl9zZW5kIik7CiAgICBERUJVR01TRygoImR1bXB2X3NlbmQiLCAiICBDb21tYW5kOlx0JWQgKCVzKVxuIiwgcGR1LT5jb21tYW5kLAogICAgICAgICAgICAgIGFnZW50eF9jbWQoKHVfY2hhcilwZHUtPmNvbW1hbmQpKSk7CiAgICBERUJVR1BSSU5USU5ERU5UKCJkdW1wdl9zZW5kIik7CiAgICBERUJVR01TRygoImR1bXB2X3NlbmQiLCAiICBGbGFnczpcdCUwMnhcbiIsIChpbnQpICooKmJ1ZiArIGlsZW4gKyAyKSkpOwoKICAgIERFQlVHRFVNUEhFQURFUigic2VuZCIsICJTZXNzaW9uIElEIik7CiAgICBpZiAoIWFnZW50eF9yZWFsbG9jX2J1aWxkX2ludChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZHUtPnNlc3NpZCwgbmV0d29ya19vcmRlcikpIHsKICAgICAgICBERUJVR0lOREVOVExFU1MoKTsKICAgICAgICBERUJVR0lOREVOVExFU1MoKTsKICAgICAgICByZXR1cm4gMDsKICAgIH0KICAgIERFQlVHSU5ERU5UTEVTUygpOwoKICAgIERFQlVHRFVNUEhFQURFUigic2VuZCIsICJUcmFuc2FjdGlvbiBJRCIpOwogICAgaWYgKCFhZ2VudHhfcmVhbGxvY19idWlsZF9pbnQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGR1LT50cmFuc2lkLCBuZXR3b3JrX29yZGVyKSkgewogICAgICAgIERFQlVHSU5ERU5UTEVTUygpOwogICAgICAgIERFQlVHSU5ERU5UTEVTUygpOwogICAgICAgIHJldHVybiAwOwogICAgfQogICAgREVCVUdJTkRFTlRMRVNTKCk7CgogICAgREVCVUdEVU1QSEVBREVSKCJzZW5kIiwgIlJlcXVlc3QgSUQiKTsKICAgIGlmICghYWdlbnR4X3JlYWxsb2NfYnVpbGRfaW50KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBkdS0+cmVxaWQsIG5ldHdvcmtfb3JkZXIpKSB7CiAgICAgICAgREVCVUdJTkRFTlRMRVNTKCk7CiAgICAgICAgREVCVUdJTkRFTlRMRVNTKCk7CiAgICAgICAgcmV0dXJuIDA7CiAgICB9CiAgICBERUJVR0lOREVOVExFU1MoKTsKCiAgICBERUJVR0RVTVBIRUFERVIoInNlbmQiLCAiRHVtbXkgTGVuZ3RoIDotKCIpOwogICAgaWYgKCFhZ2VudHhfcmVhbGxvY19idWlsZF9pbnQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgbmV0d29ya19vcmRlcikpIHsKICAgICAgICBERUJVR0lOREVOVExFU1MoKTsKICAgICAgICBERUJVR0lOREVOVExFU1MoKTsKICAgICAgICByZXR1cm4gMDsKICAgIH0KICAgIERFQlVHSU5ERU5UTEVTUygpOwoKICAgIGlmIChwZHUtPmZsYWdzICYgQUdFTlRYX01TR19GTEFHX05PTl9ERUZBVUxUX0NPTlRFWFQpIHsKICAgICAgICBERUJVR0RVTVBIRUFERVIoInNlbmQiLCAiQ29tbXVuaXR5Iik7CiAgICAgICAgaWYgKCFhZ2VudHhfcmVhbGxvY19idWlsZF9zdHJpbmcKICAgICAgICAgICAgKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgcGR1LT5jb21tdW5pdHksCiAgICAgICAgICAgICBwZHUtPmNvbW11bml0eV9sZW4sIG5ldHdvcmtfb3JkZXIpKSB7CiAgICAgICAgICAgIERFQlVHSU5ERU5UTEVTUygpOwogICAgICAgICAgICBERUJVR0lOREVOVExFU1MoKTsKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQogICAgICAgIERFQlVHSU5ERU5UTEVTUygpOwogICAgfQoKICAgIERFQlVHSU5ERU5UTEVTUygpOwogICAgcmV0dXJuIDE7Cn0KCnN0YXRpYyBpbnQKX2FnZW50eF9yZWFsbG9jX2J1aWxkKHVfY2hhciAqKiBidWYsIHNpemVfdCAqIGJ1Zl9sZW4sIHNpemVfdCAqIG91dF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgIG5ldHNubXBfc2Vzc2lvbiAqIHNlc3Npb24sIG5ldHNubXBfcGR1ICpwZHUpCnsKICAgIHNpemVfdCAgICAgICAgICBpbGVuID0gKm91dF9sZW47CiAgICBuZXRzbm1wX3ZhcmlhYmxlX2xpc3QgKnZwOwogICAgaW50ICAgICAgICAgICAgIGluYywgaSA9IDA7CiAgICBjb25zdCBpbnQgICAgICAgbmV0d29ya19vcmRlciA9CiAgICAgICAgcGR1LT5mbGFncyAmIEFHRU5UWF9GTEFHU19ORVRXT1JLX0JZVEVfT1JERVI7CgogICAgc2Vzc2lvbi0+c19zbm1wX2Vycm5vID0gMDsKICAgIHNlc3Npb24tPnNfZXJybm8gPSAwOwoKICAgIC8qCiAgICAgKiBWYXJpb3VzIFBEVSB0eXBlcyBkb24ndCBpbmNsdWRlIGNvbnRleHQgaW5mb3JtYXRpb24gKFJGQyAyNzQxLCBwLiAyMCkuIAogICAgICovCiAgICBzd2l0Y2ggKHBkdS0+Y29tbWFuZCkgewogICAgY2FzZSBBR0VOVFhfTVNHX09QRU46CiAgICBjYXNlIEFHRU5UWF9NU0dfQ0xPU0U6CiAgICBjYXNlIEFHRU5UWF9NU0dfUkVTUE9OU0U6CiAgICBjYXNlIEFHRU5UWF9NU0dfQ09NTUlUU0VUOgogICAgY2FzZSBBR0VOVFhfTVNHX1VORE9TRVQ6CiAgICBjYXNlIEFHRU5UWF9NU0dfQ0xFQU5VUFNFVDoKICAgICAgICBwZHUtPmZsYWdzICY9IH4oQUdFTlRYX01TR19GTEFHX05PTl9ERUZBVUxUX0NPTlRFWFQpOwogICAgfQoKCS8qIFdlJ3ZlIHJlY2VpdmVkIGEgUERVIHRoYXQgaGFzIHNwZWNpZmllZCBhIGNvbnRleHQuICBOZXRTTk1QIGhvd2V2ZXIsIHVzZXMKCSAqIHRoZSBwZHUtPmNvbW11bml0eSBmaWVsZCB0byBzcGVjaWZ5IGNvbnRleHQgd2hlbiB1c2luZyB0aGUgQWdlbnRYCgkgKiBwcm90b2NvbC4gIFRoZXJlZm9yZSB3ZSBuZWVkIHRvIGNvcHkgdGhlIGNvbnRleHQgbmFtZSBhbmQgbGVuZ3RoIGludG8gdGhlCgkgKiBwZHUtPmNvbW11bml0eSBhbmQgcGR1LT5jb21tdW5pdHlfbGVuIGZpZWxkcywgcmVzcGVjdGl2ZWx5LiAqLwoJaWYgKHBkdS0+Y29udGV4dE5hbWUgIT0gTlVMTCAmJiBwZHUtPmNvbW11bml0eSA9PSBOVUxMKQoJewkKCQlwZHUtPmNvbW11bml0eSAgICAgPSBzdHJkdXAocGR1LT5jb250ZXh0TmFtZSk7CgkJcGR1LT5jb21tdW5pdHlfbGVuID0gcGR1LT5jb250ZXh0TmFtZUxlbjsKCQlwZHUtPmZsYWdzIHw9IEFHRU5UWF9NU0dfRkxBR19OT05fREVGQVVMVF9DT05URVhUOwoJfQoKICAgIC8qCiAgICAgKiBCdWlsZCB0aGUgaGVhZGVyIChhbmQgY29udGV4dCBpZiBhcHByb3ByaWF0ZSkuICAKICAgICAqLwogICAgaWYgKCFhZ2VudHhfcmVhbGxvY19idWlsZF9oZWFkZXIKICAgICAgICAoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCBwZHUpKSB7CiAgICAgICAgcmV0dXJuIDA7CiAgICB9CgogICAgLyoKICAgICAqIEV2ZXJ5dGhpbmcgY2F1c2VzIGEgcmVzcG9uc2UsIGV4Y2VwdCBmb3IgYWdlbnR4LVJlc3BvbnNlLVBEVSBhbmQKICAgICAqIGFnZW50eC1DbGVhbnVwU2V0LVBEVS4gIAogICAgICovCgogICAgcGR1LT5mbGFncyB8PSBVQ0RfTVNHX0ZMQUdfRVhQRUNUX1JFU1BPTlNFOwoKICAgIERFQlVHRFVNUEhFQURFUigic2VuZCIsICJBZ2VudFggUGF5bG9hZCIpOwogICAgc3dpdGNoIChwZHUtPmNvbW1hbmQpIHsKCiAgICBjYXNlIEFHRU5UWF9NU0dfT1BFTjoKICAgICAgICAvKgogICAgICAgICAqIFRpbWVvdXQgIAogICAgICAgICAqLwogICAgICAgIHdoaWxlICgoKm91dF9sZW4gKyA0KSA+PSAqYnVmX2xlbikgewogICAgICAgICAgICBpZiAoIShhbGxvd19yZWFsbG9jICYmIHNubXBfcmVhbGxvYyhidWYsIGJ1Zl9sZW4pKSkgewogICAgICAgICAgICAgICAgREVCVUdJTkRFTlRMRVNTKCk7CiAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAqKCpidWYgKyAqb3V0X2xlbikgPSAodV9jaGFyKSBwZHUtPnRpbWU7CiAgICAgICAgKCpvdXRfbGVuKSsrOwogICAgICAgIGZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsKICAgICAgICAgICAgKigqYnVmICsgKm91dF9sZW4pID0gMDsKICAgICAgICAgICAgKCpvdXRfbGVuKSsrOwogICAgICAgIH0KICAgICAgICBERUJVR0RVTVBIRUFERVIoInNlbmQiLCAiT3BlbiBUaW1lb3V0Iik7CiAgICAgICAgREVCVUdEVU1QU0VUVVAoInNlbmQiLCAoKmJ1ZiArICpvdXRfbGVuIC0gNCksIDQpOwogICAgICAgIERFQlVHTVNHKCgiZHVtcHZfc2VuZCIsICIgIFRpbWVvdXQ6XHQlZFxuIiwKICAgICAgICAgICAgICAgICAgKGludCkgKigqYnVmICsgKm91dF9sZW4gLSA0KSkpOwogICAgICAgIERFQlVHSU5ERU5UTEVTUygpOwoKICAgICAgICBERUJVR0RVTVBIRUFERVIoInNlbmQiLCAiT3BlbiBJRCIpOwogICAgICAgIGlmICghYWdlbnR4X3JlYWxsb2NfYnVpbGRfb2lkCiAgICAgICAgICAgIChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsIDAsIHBkdS0+dmFyaWFibGVzLT5uYW1lLAogICAgICAgICAgICAgcGR1LT52YXJpYWJsZXMtPm5hbWVfbGVuZ3RoLCBuZXR3b3JrX29yZGVyKSkgewogICAgICAgICAgICBERUJVR0lOREVOVExFU1MoKTsKICAgICAgICAgICAgREVCVUdJTkRFTlRMRVNTKCk7CiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KICAgICAgICBERUJVR0lOREVOVExFU1MoKTsKICAgICAgICBERUJVR0RVTVBIRUFERVIoInNlbmQiLCAiT3BlbiBEZXNjcmlwdGlvbiIpOwogICAgICAgIGlmICghYWdlbnR4X3JlYWxsb2NfYnVpbGRfc3RyaW5nCiAgICAgICAgICAgIChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICBwZHUtPnZhcmlhYmxlcy0+dmFsLnN0cmluZywgcGR1LT52YXJpYWJsZXMtPnZhbF9sZW4sCiAgICAgICAgICAgICBuZXR3b3JrX29yZGVyKSkgewogICAgICAgICAgICBERUJVR0lOREVOVExFU1MoKTsKICAgICAgICAgICAgREVCVUdJTkRFTlRMRVNTKCk7CiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KICAgICAgICBERUJVR0lOREVOVExFU1MoKTsKICAgICAgICBicmVhazsKCiAgICBjYXNlIEFHRU5UWF9NU0dfQ0xPU0U6CiAgICAgICAgLyoKICAgICAgICAgKiBSZWFzb24gIAogICAgICAgICAqLwogICAgICAgIHdoaWxlICgoKm91dF9sZW4gKyA0KSA+PSAqYnVmX2xlbikgewogICAgICAgICAgICBpZiAoIShhbGxvd19yZWFsbG9jICYmIHNubXBfcmVhbGxvYyhidWYsIGJ1Zl9sZW4pKSkgewogICAgICAgICAgICAgICAgREVCVUdJTkRFTlRMRVNTKCk7CiAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAqKCpidWYgKyAqb3V0X2xlbikgPSAodV9jaGFyKSBwZHUtPmVycnN0YXQ7CiAgICAgICAgKCpvdXRfbGVuKSsrOwogICAgICAgIGZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsKICAgICAgICAgICAgKigqYnVmICsgKm91dF9sZW4pID0gMDsKICAgICAgICAgICAgKCpvdXRfbGVuKSsrOwogICAgICAgIH0KICAgICAgICBERUJVR0RVTVBIRUFERVIoInNlbmQiLCAiQ2xvc2UgUmVhc29uIik7CiAgICAgICAgREVCVUdEVU1QU0VUVVAoInNlbmQiLCAoKmJ1ZiArICpvdXRfbGVuIC0gNCksIDQpOwogICAgICAgIERFQlVHTVNHKCgiZHVtcHZfc2VuZCIsICIgIFJlYXNvbjpcdCVkXG4iLAogICAgICAgICAgICAgICAgICAoaW50KSAqKCpidWYgKyAqb3V0X2xlbiAtIDQpKSk7CiAgICAgICAgREVCVUdJTkRFTlRMRVNTKCk7CiAgICAgICAgYnJlYWs7CgogICAgY2FzZSBBR0VOVFhfTVNHX1JFR0lTVEVSOgogICAgY2FzZSBBR0VOVFhfTVNHX1VOUkVHSVNURVI6CiAgICAgICAgd2hpbGUgKCgqb3V0X2xlbiArIDQpID49ICpidWZfbGVuKSB7CiAgICAgICAgICAgIGlmICghKGFsbG93X3JlYWxsb2MgJiYgc25tcF9yZWFsbG9jKGJ1ZiwgYnVmX2xlbikpKSB7CiAgICAgICAgICAgICAgICBERUJVR0lOREVOVExFU1MoKTsKICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmIChwZHUtPmNvbW1hbmQgPT0gQUdFTlRYX01TR19SRUdJU1RFUikgewogICAgICAgICAgICAqKCpidWYgKyAqb3V0X2xlbikgPSAodV9jaGFyKSBwZHUtPnRpbWU7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgKigqYnVmICsgKm91dF9sZW4pID0gMDsKICAgICAgICB9CiAgICAgICAgKCpvdXRfbGVuKSsrOwogICAgICAgICooKmJ1ZiArICpvdXRfbGVuKSA9ICh1X2NoYXIpIHBkdS0+cHJpb3JpdHk7CiAgICAgICAgKCpvdXRfbGVuKSsrOwogICAgICAgICooKmJ1ZiArICpvdXRfbGVuKSA9ICh1X2NoYXIpIHBkdS0+cmFuZ2Vfc3ViaWQ7CiAgICAgICAgKCpvdXRfbGVuKSsrOwogICAgICAgICooKmJ1ZiArICpvdXRfbGVuKSA9ICh1X2NoYXIpIDA7CiAgICAgICAgKCpvdXRfbGVuKSsrOwoKICAgICAgICBERUJVR0RVTVBIRUFERVIoInNlbmQiLCAiKFVuKVJlZ2lzdGVyIEhlYWRlciIpOwogICAgICAgIERFQlVHRFVNUFNFVFVQKCJzZW5kIiwgKCpidWYgKyAqb3V0X2xlbiAtIDQpLCA0KTsKICAgICAgICBpZiAocGR1LT5jb21tYW5kID09IEFHRU5UWF9NU0dfUkVHSVNURVIpIHsKICAgICAgICAgICAgREVCVUdNU0coKCJkdW1wdl9zZW5kIiwgIiAgVGltZW91dDpcdCVkXG4iLAogICAgICAgICAgICAgICAgICAgICAgKGludCkgKigqYnVmICsgKm91dF9sZW4gLSA0KSkpOwogICAgICAgICAgICBERUJVR1BSSU5USU5ERU5UKCJkdW1wdl9zZW5kIik7CiAgICAgICAgfQogICAgICAgIERFQlVHTVNHKCgiZHVtcHZfc2VuZCIsICIgIFByaW9yaXR5Olx0JWRcbiIsCiAgICAgICAgICAgICAgICAgIChpbnQpICooKmJ1ZiArICpvdXRfbGVuIC0gMykpKTsKICAgICAgICBERUJVR1BSSU5USU5ERU5UKCJkdW1wdl9zZW5kIik7CiAgICAgICAgREVCVUdNU0coKCJkdW1wdl9zZW5kIiwgIiAgUmFuZ2UgU3ViSUQ6XHQlZFxuIiwKICAgICAgICAgICAgICAgICAgKGludCkgKigqYnVmICsgKm91dF9sZW4gLSAyKSkpOwogICAgICAgIERFQlVHSU5ERU5UTEVTUygpOwoKICAgICAgICB2cCA9IHBkdS0+dmFyaWFibGVzOwogICAgICAgIERFQlVHRFVNUEhFQURFUigic2VuZCIsICIoVW4pUmVnaXN0ZXIgUHJlZml4Iik7CiAgICAgICAgaWYgKCFhZ2VudHhfcmVhbGxvY19idWlsZF9vaWQKICAgICAgICAgICAgKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgMCwgdnAtPm5hbWUsCiAgICAgICAgICAgICB2cC0+bmFtZV9sZW5ndGgsIG5ldHdvcmtfb3JkZXIpKSB7CgogICAgICAgICAgICBERUJVR0lOREVOVExFU1MoKTsKICAgICAgICAgICAgREVCVUdJTkRFTlRMRVNTKCk7CiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KICAgICAgICBERUJVR0lOREVOVExFU1MoKTsKCiAgICAgICAgaWYgKHBkdS0+cmFuZ2Vfc3ViaWQpIHsKICAgICAgICAgICAgREVCVUdEVU1QSEVBREVSKCJzZW5kIiwgIihVbilSZWdpc3RlciBSYW5nZSIpOwogICAgICAgICAgICBpZiAoIWFnZW50eF9yZWFsbG9jX2J1aWxkX2ludAogICAgICAgICAgICAgICAgKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICB2cC0+dmFsLm9iamlkW3BkdS0+cmFuZ2Vfc3ViaWQgLSAxXSwgbmV0d29ya19vcmRlcikpIHsKICAgICAgICAgICAgICAgIERFQlVHSU5ERU5UTEVTUygpOwogICAgICAgICAgICAgICAgREVCVUdJTkRFTlRMRVNTKCk7CiAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgfQogICAgICAgICAgICBERUJVR0lOREVOVExFU1MoKTsKICAgICAgICB9CiAgICAgICAgYnJlYWs7CgogICAgY2FzZSBBR0VOVFhfTVNHX0dFVEJVTEs6CiAgICAgICAgREVCVUdEVU1QSEVBREVSKCJzZW5kIiwgIkdldEJ1bGsgTm9uLVJlcGVhdGVycyIpOwogICAgICAgIGlmICghYWdlbnR4X3JlYWxsb2NfYnVpbGRfc2hvcnQKICAgICAgICAgICAgKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgCiAgICAgICAgICAgICh1X3Nob3J0KXBkdS0+bm9uX3JlcGVhdGVycywKICAgICAgICAgICAgIG5ldHdvcmtfb3JkZXIpKSB7CiAgICAgICAgICAgIERFQlVHSU5ERU5UTEVTUygpOwogICAgICAgICAgICBERUJVR0lOREVOVExFU1MoKTsKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQogICAgICAgIERFQlVHSU5ERU5UTEVTUygpOwoKICAgICAgICBERUJVR0RVTVBIRUFERVIoInNlbmQiLCAiR2V0QnVsayBNYXgtUmVwZXRpdGlvbnMiKTsKICAgICAgICBpZiAoIWFnZW50eF9yZWFsbG9jX2J1aWxkX3Nob3J0CiAgICAgICAgICAgIChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsIAogICAgICAgICAgICAodV9zaG9ydClwZHUtPm1heF9yZXBldGl0aW9ucywKICAgICAgICAgICAgIG5ldHdvcmtfb3JkZXIpKSB7CiAgICAgICAgICAgIERFQlVHSU5ERU5UTEVTUygpOwogICAgICAgICAgICBERUJVR0lOREVOVExFU1MoKTsKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQogICAgICAgIERFQlVHSU5ERU5UTEVTUygpOwoKICAgICAgICAvKgogICAgICAgICAqIEZhbGx0aHJvdWdoICAKICAgICAgICAgKi8KCiAgICBjYXNlIEFHRU5UWF9NU0dfR0VUOgogICAgY2FzZSBBR0VOVFhfTVNHX0dFVE5FWFQ6CiAgICAgICAgREVCVUdEVU1QSEVBREVSKCJzZW5kIiwgIkdldCogVmFyaWFibGUgTGlzdCIpOwogICAgICAgIGZvciAodnAgPSBwZHUtPnZhcmlhYmxlczsgdnAgIT0gTlVMTDsgdnAgPSB2cC0+bmV4dF92YXJpYWJsZSkgewogICAgICAgICAgICBpbmMgPSAodnAtPnR5cGUgPT0gQVNOX1BSSVZfSU5DTF9SQU5HRSk7CiAgICAgICAgICAgIGlmICghYWdlbnR4X3JlYWxsb2NfYnVpbGRfb2lkCiAgICAgICAgICAgICAgICAoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCBpbmMsIHZwLT5uYW1lLAogICAgICAgICAgICAgICAgIHZwLT5uYW1lX2xlbmd0aCwgbmV0d29ya19vcmRlcikpIHsKICAgICAgICAgICAgICAgIERFQlVHSU5ERU5UTEVTUygpOwogICAgICAgICAgICAgICAgREVCVUdJTkRFTlRMRVNTKCk7CiAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIWFnZW50eF9yZWFsbG9jX2J1aWxkX29pZAogICAgICAgICAgICAgICAgKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgMCwgdnAtPnZhbC5vYmppZCwKICAgICAgICAgICAgICAgICB2cC0+dmFsX2xlbiAvIHNpemVvZihvaWQpLCBuZXR3b3JrX29yZGVyKSkgewogICAgICAgICAgICAgICAgREVCVUdJTkRFTlRMRVNTKCk7CiAgICAgICAgICAgICAgICBERUJVR0lOREVOVExFU1MoKTsKICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIERFQlVHSU5ERU5UTEVTUygpOwogICAgICAgIGJyZWFrOwoKICAgIGNhc2UgQUdFTlRYX01TR19SRVNQT05TRToKICAgICAgICBwZHUtPmZsYWdzICY9IH4oVUNEX01TR19GTEFHX0VYUEVDVF9SRVNQT05TRSk7CiAgICAgICAgaWYgKCFhZ2VudHhfcmVhbGxvY19idWlsZF9pbnQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBkdS0+dGltZSwgbmV0d29ya19vcmRlcikpIHsKICAgICAgICAgICAgREVCVUdJTkRFTlRMRVNTKCk7CiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KICAgICAgICBERUJVR0RVTVBIRUFERVIoInNlbmQiLCAiUmVzcG9uc2UiKTsKICAgICAgICBERUJVR0RVTVBTRVRVUCgic2VuZCIsICgqYnVmICsgKm91dF9sZW4gLSA0KSwgNCk7CiAgICAgICAgREVCVUdNU0coKCJkdW1wdl9zZW5kIiwgIiAgc3lzVXBUaW1lOlx0JWx1XG4iLCBwZHUtPnRpbWUpKTsKICAgICAgICBERUJVR0lOREVOVExFU1MoKTsKCiAgICAgICAgaWYgKCFhZ2VudHhfcmVhbGxvY19idWlsZF9zaG9ydAogICAgICAgICAgICAoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCAKICAgICAgICAgICAgKHVfc2hvcnQpcGR1LT5lcnJzdGF0LAogICAgICAgICAgICAgbmV0d29ya19vcmRlcikKICAgICAgICAgICAgfHwgIWFnZW50eF9yZWFsbG9jX2J1aWxkX3Nob3J0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93X3JlYWxsb2MsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVfc2hvcnQpcGR1LT5lcnJpbmRleCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldHdvcmtfb3JkZXIpKSB7CiAgICAgICAgICAgIERFQlVHSU5ERU5UTEVTUygpOwogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CiAgICAgICAgREVCVUdEVU1QSEVBREVSKCJzZW5kIiwgIlJlc3BvbnNlIGVycm9ycyIpOwogICAgICAgIERFQlVHRFVNUFNFVFVQKCJzZW5kIiwgKCpidWYgKyAqb3V0X2xlbiAtIDQpLCA0KTsKICAgICAgICBERUJVR01TRygoImR1bXB2X3NlbmQiLCAiICBlcnJzdGF0Olx0JWxkXG4iLCBwZHUtPmVycnN0YXQpKTsKICAgICAgICBERUJVR1BSSU5USU5ERU5UKCJkdW1wdl9zZW5kIik7CiAgICAgICAgREVCVUdNU0coKCJkdW1wdl9zZW5kIiwgIiAgZXJyaW5kZXg6XHQlbGRcbiIsIHBkdS0+ZXJyaW5kZXgpKTsKICAgICAgICBERUJVR0lOREVOVExFU1MoKTsKCiAgICAgICAgLyoKICAgICAgICAgKiBGYWxsdGhyb3VnaCAgCiAgICAgICAgICovCgogICAgY2FzZSBBR0VOVFhfTVNHX0lOREVYX0FMTE9DQVRFOgogICAgY2FzZSBBR0VOVFhfTVNHX0lOREVYX0RFQUxMT0NBVEU6CiAgICBjYXNlIEFHRU5UWF9NU0dfTk9USUZZOgogICAgY2FzZSBBR0VOVFhfTVNHX1RFU1RTRVQ6CiAgICAgICAgREVCVUdEVU1QSEVBREVSKCJzZW5kIiwgIkdldCogVmFyaWFibGUgTGlzdCIpOwogICAgICAgIGZvciAodnAgPSBwZHUtPnZhcmlhYmxlczsgdnAgIT0gTlVMTDsgdnAgPSB2cC0+bmV4dF92YXJpYWJsZSkgewogICAgICAgICAgICBpZiAoIWFnZW50eF9yZWFsbG9jX2J1aWxkX3ZhcmJpbmQKICAgICAgICAgICAgICAgIChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsIHZwLAogICAgICAgICAgICAgICAgIG5ldHdvcmtfb3JkZXIpKSB7CiAgICAgICAgICAgICAgICBERUJVR0lOREVOVExFU1MoKTsKICAgICAgICAgICAgICAgIERFQlVHSU5ERU5UTEVTUygpOwogICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgREVCVUdJTkRFTlRMRVNTKCk7CiAgICAgICAgYnJlYWs7CgogICAgY2FzZSBBR0VOVFhfTVNHX0NPTU1JVFNFVDoKICAgIGNhc2UgQUdFTlRYX01TR19VTkRPU0VUOgogICAgY2FzZSBBR0VOVFhfTVNHX1BJTkc6CiAgICAgICAgLyoKICAgICAgICAgKiAiRW1wdHkiIHBhY2tldC4gIAogICAgICAgICAqLwogICAgICAgIGJyZWFrOwoKICAgIGNhc2UgQUdFTlRYX01TR19DTEVBTlVQU0VUOgogICAgICAgIHBkdS0+ZmxhZ3MgJj0gfihVQ0RfTVNHX0ZMQUdfRVhQRUNUX1JFU1BPTlNFKTsKICAgICAgICBicmVhazsKCiAgICBjYXNlIEFHRU5UWF9NU0dfQUREX0FHRU5UX0NBUFM6CiAgICAgICAgREVCVUdEVU1QSEVBREVSKCJzZW5kIiwgIkFnZW50Q2FwcyBPSUQiKTsKICAgICAgICBpZiAoIWFnZW50eF9yZWFsbG9jX2J1aWxkX29pZAogICAgICAgICAgICAoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCAwLCBwZHUtPnZhcmlhYmxlcy0+bmFtZSwKICAgICAgICAgICAgIHBkdS0+dmFyaWFibGVzLT5uYW1lX2xlbmd0aCwgbmV0d29ya19vcmRlcikpIHsKICAgICAgICAgICAgREVCVUdJTkRFTlRMRVNTKCk7CiAgICAgICAgICAgIERFQlVHSU5ERU5UTEVTUygpOwogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CiAgICAgICAgREVCVUdJTkRFTlRMRVNTKCk7CgogICAgICAgIERFQlVHRFVNUEhFQURFUigic2VuZCIsICJBZ2VudENhcHMgRGVzY3JpcHRpb24iKTsKICAgICAgICBpZiAoIWFnZW50eF9yZWFsbG9jX2J1aWxkX3N0cmluZwogICAgICAgICAgICAoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgcGR1LT52YXJpYWJsZXMtPnZhbC5zdHJpbmcsIHBkdS0+dmFyaWFibGVzLT52YWxfbGVuLAogICAgICAgICAgICAgbmV0d29ya19vcmRlcikpIHsKICAgICAgICAgICAgREVCVUdJTkRFTlRMRVNTKCk7CiAgICAgICAgICAgIERFQlVHSU5ERU5UTEVTUygpOwogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CiAgICAgICAgREVCVUdJTkRFTlRMRVNTKCk7CiAgICAgICAgYnJlYWs7CgogICAgY2FzZSBBR0VOVFhfTVNHX1JFTU9WRV9BR0VOVF9DQVBTOgogICAgICAgIERFQlVHRFVNUEhFQURFUigic2VuZCIsICJBZ2VudENhcHMgT0lEIik7CiAgICAgICAgaWYgKCFhZ2VudHhfcmVhbGxvY19idWlsZF9vaWQKICAgICAgICAgICAgKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgMCwgcGR1LT52YXJpYWJsZXMtPm5hbWUsCiAgICAgICAgICAgICBwZHUtPnZhcmlhYmxlcy0+bmFtZV9sZW5ndGgsIG5ldHdvcmtfb3JkZXIpKSB7CiAgICAgICAgICAgIERFQlVHSU5ERU5UTEVTUygpOwogICAgICAgICAgICBERUJVR0lOREVOVExFU1MoKTsKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQogICAgICAgIERFQlVHSU5ERU5UTEVTUygpOwogICAgICAgIGJyZWFrOwoKICAgIGRlZmF1bHQ6CiAgICAgICAgc2Vzc2lvbi0+c19zbm1wX2Vycm5vID0gU05NUEVSUl9VTktOT1dOX1BEVTsKICAgICAgICByZXR1cm4gMDsKICAgIH0KICAgIERFQlVHSU5ERU5UTEVTUygpOwoKICAgIC8qCiAgICAgKiBGaXggdGhlIHBheWxvYWQgbGVuZ3RoIChpZ25vcmluZyB0aGUgMjAtYnl0ZSBoZWFkZXIpLiAgCiAgICAgKi8KCiAgICBhZ2VudHhfYnVpbGRfaW50KCgqYnVmICsgMTYpLCAoKm91dF9sZW4gLSBpbGVuKSAtIDIwLCBuZXR3b3JrX29yZGVyKTsKCiAgICBERUJVR01TR1RMKCgiYWdlbnR4X2J1aWxkIiwgInBhY2tldCBidWlsdCBva2F5XG4iKSk7CiAgICByZXR1cm4gMTsKfQoKaW50CmFnZW50eF9yZWFsbG9jX2J1aWxkKG5ldHNubXBfc2Vzc2lvbiAqIHNlc3Npb24sIG5ldHNubXBfcGR1ICpwZHUsCiAgICAgICAgICAgICAgICAgICAgIHVfY2hhciAqKiBidWYsIHNpemVfdCAqIGJ1Zl9sZW4sIHNpemVfdCAqIG91dF9sZW4pCnsKICAgIGlmIChzZXNzaW9uID09IE5VTEwgfHwgYnVmX2xlbiA9PSBOVUxMIHx8CiAgICAgICAgb3V0X2xlbiA9PSBOVUxMIHx8IHBkdSA9PSBOVUxMIHx8IGJ1ZiA9PSBOVUxMKSB7CiAgICAgICAgcmV0dXJuIC0xOwogICAgfQogICAgaWYgKCFfYWdlbnR4X3JlYWxsb2NfYnVpbGQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCAxLCBzZXNzaW9uLCBwZHUpKSB7CiAgICAgICAgaWYgKHNlc3Npb24tPnNfc25tcF9lcnJubyA9PSAwKSB7CiAgICAgICAgICAgIHNlc3Npb24tPnNfc25tcF9lcnJubyA9IFNOTVBFUlJfQkFEX0FTTjFfQlVJTEQ7CiAgICAgICAgfQogICAgICAgIHJldHVybiAtMTsKICAgIH0KCiAgICByZXR1cm4gMDsKfQoKICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioKCSoKCSogIFV0aWxpdHkgZnVuY3Rpb25zIGZvciBwYXJzaW5nIGFuIEFnZW50WCBwYWNrZXQKCSoKCSoqKioqKioqKioqKioqKioqKioqKioqLwoKaW50CmFnZW50eF9wYXJzZV9pbnQodV9jaGFyICogZGF0YSwgdV9pbnQgbmV0d29ya19ieXRlX29yZGVyKQp7CiAgICB1X2ludCAgICAgICAgICAgdmFsdWUgPSAwOwoKICAgIC8qCiAgICAgKiAgTm90ZSAtIHRoaXMgZG9lc24ndCBoYW5kbGUgJ1BEUF9FTkRJQU4nIHN5c3RlbXMKICAgICAqICAgICAgSWYgYW55b25lIG5lZWRzIHRoaXMgYWRkZWQsIGNvbnRhY3QgdGhlIGNvZGVycyBsaXN0CiAgICAgKi8KICAgIERFQlVHRFVNUFNFVFVQKCJyZWN2IiwgZGF0YSwgNCk7CiAgICBpZiAobmV0d29ya19ieXRlX29yZGVyKSB7CiAgICAgICAgbWVtbW92ZSgmdmFsdWUsIGRhdGEsIDQpOwojaWZuZGVmIFdPUkRTX0JJR0VORElBTgogICAgICAgIHZhbHVlID0gbnRvaGwodmFsdWUpOwojZW5kaWYKICAgIH0gZWxzZSB7CiNpZm5kZWYgV09SRFNfQklHRU5ESUFOCiAgICAgICAgbWVtbW92ZSgmdmFsdWUsIGRhdGEsIDQpOwojZWxzZQogICAgICAgIC8qCiAgICAgICAgICogVGhlIGVxdWl2YWxlbnQgb2YgdGhlICdudG9obCgpJyBtYWNybywKICAgICAgICAgKiBleGNlcHQgdGhpcyBtYWNybyBpcyBudWxsIG9uIGJpZy1lbmRpYW4gc3lzdGVtcyAKICAgICAgICAgKi8KICAgICAgICB2YWx1ZSArPSBkYXRhWzNdOwogICAgICAgIHZhbHVlIDw8PSA4OwogICAgICAgIHZhbHVlICs9IGRhdGFbMl07CiAgICAgICAgdmFsdWUgPDw9IDg7CiAgICAgICAgdmFsdWUgKz0gZGF0YVsxXTsKICAgICAgICB2YWx1ZSA8PD0gODsKICAgICAgICB2YWx1ZSArPSBkYXRhWzBdOwojZW5kaWYKICAgIH0KICAgIERFQlVHTVNHKCgiZHVtcHZfcmVjdiIsICIgIEludGVnZXI6XHQldSAoMHglLjJYKVxuIiwgdmFsdWUsIHZhbHVlKSk7CgogICAgcmV0dXJuIHZhbHVlOwp9CgoKaW50CmFnZW50eF9wYXJzZV9zaG9ydCh1X2NoYXIgKiBkYXRhLCB1X2ludCBuZXR3b3JrX2J5dGVfb3JkZXIpCnsKICAgIHVfc2hvcnQgICAgICAgICB2YWx1ZSA9IDA7CgogICAgaWYgKG5ldHdvcmtfYnl0ZV9vcmRlcikgewogICAgICAgIG1lbW1vdmUoJnZhbHVlLCBkYXRhLCAyKTsKI2lmbmRlZiBXT1JEU19CSUdFTkRJQU4KICAgICAgICB2YWx1ZSA9IG50b2hzKHZhbHVlKTsKI2VuZGlmCiAgICB9IGVsc2UgewojaWZuZGVmIFdPUkRTX0JJR0VORElBTgogICAgICAgIG1lbW1vdmUoJnZhbHVlLCBkYXRhLCAyKTsKI2Vsc2UKICAgICAgICAvKgogICAgICAgICAqIFRoZSBlcXVpdmFsZW50IG9mIHRoZSAnbnRvaHMoKScgbWFjcm8sCiAgICAgICAgICogZXhjZXB0IHRoaXMgbWFjcm8gaXMgbnVsbCBvbiBiaWctZW5kaWFuIHN5c3RlbXMgCiAgICAgICAgICovCiAgICAgICAgdmFsdWUgKz0gZGF0YVsxXTsKICAgICAgICB2YWx1ZSA8PD0gODsKICAgICAgICB2YWx1ZSArPSBkYXRhWzBdOwojZW5kaWYKICAgIH0KCiAgICBERUJVR0RVTVBTRVRVUCgicmVjdiIsIGRhdGEsIDIpOwogICAgREVCVUdNU0coKCJkdW1wdl9yZWN2IiwgIiAgU2hvcnQ6XHQlaHUgKDB4JS4yWClcbiIsIHZhbHVlLCB2YWx1ZSkpOwogICAgcmV0dXJuIHZhbHVlOwp9CgoKdV9jaGFyICAgICAgICAgKgphZ2VudHhfcGFyc2Vfb2lkKHVfY2hhciAqIGRhdGEsIHNpemVfdCAqIGxlbmd0aCwgaW50ICppbmMsCiAgICAgICAgICAgICAgICAgb2lkICogb2lkX2J1Ziwgc2l6ZV90ICogb2lkX2xlbiwgdV9pbnQgbmV0d29ya19ieXRlX29yZGVyKQp7CiAgICB1X2ludCAgICAgICAgICAgbl9zdWJpZDsKICAgIHVfaW50ICAgICAgICAgICBwcmVmaXg7CiAgICB1X2ludCAgICAgICAgICAgdG1wX29pZF9sZW47CiAgICBpbnQgICAgICAgICAgICAgaTsKICAgIGludCAgICAgICAgICAgICBpbnRfb2Zmc2V0OwogICAgdV9pbnQgICAgICAgICAgKmludF9wdHIgPSAodV9pbnQgKilvaWRfYnVmOwogICAgdV9jaGFyICAgICAgICAgKmJ1Zl9wdHIgPSBkYXRhOwoKICAgIGlmICgqbGVuZ3RoIDwgNCkgewogICAgICAgIERFQlVHTVNHVEwoKCJhZ2VudHgiLCAiSW5jb21wbGV0ZSBPYmplY3QgSURcbiIpKTsKICAgICAgICByZXR1cm4gTlVMTDsKICAgIH0KCiAgICBERUJVR0RVTVBIRUFERVIoInJlY3YiLCAiT0lEIEhlYWRlciIpOwogICAgREVCVUdEVU1QU0VUVVAoInJlY3YiLCBkYXRhLCA0KTsKICAgIERFQlVHTVNHKCgiZHVtcHZfcmVjdiIsICIgICMgc3ViaWRzOlx0JWQgKDB4JS4yWClcbiIsIGRhdGFbMF0sCiAgICAgICAgICAgICAgZGF0YVswXSkpOwogICAgREVCVUdQUklOVElOREVOVCgiZHVtcHZfcmVjdiIpOwogICAgREVCVUdNU0coKCJkdW1wdl9yZWN2IiwgIiAgcHJlZml4OiBcdCVkICgweCUuMlgpXG4iLCBkYXRhWzFdLAogICAgICAgICAgICAgIGRhdGFbMV0pKTsKICAgIERFQlVHUFJJTlRJTkRFTlQoImR1bXB2X3JlY3YiKTsKICAgIERFQlVHTVNHKCgiZHVtcHZfcmVjdiIsICIgIGluY2x1c2l2ZTpcdCVkICgweCUuMlgpXG4iLCBkYXRhWzJdLAogICAgICAgICAgICAgIGRhdGFbMl0pKTsKCiAgICBERUJVR0lOREVOVExFU1MoKTsKICAgIERFQlVHRFVNUEhFQURFUigicmVjdiIsICJPSUQgU2VnbWVudHMiKTsKCiAgICBuX3N1YmlkID0gZGF0YVswXTsKICAgIHByZWZpeCA9IGRhdGFbMV07CiAgICBpZiAoaW5jKQogICAgICAgICppbmMgPSBkYXRhWzJdOwogICAgaW50X29mZnNldCA9IHNpemVvZihvaWQpLzQ7CgogICAgYnVmX3B0ciArPSA0OwogICAgKmxlbmd0aCAtPSA0OwoKICAgIERFQlVHTVNHKCgiZGpwIiwgIiAgcGFyc2Vfb2lkXG4iKSk7CiAgICBERUJVR01TRygoImRqcCIsICIgIHNpemVvZihvaWQpID0gJWRcbiIsIChpbnQpc2l6ZW9mKG9pZCkpKTsKICAgIGlmIChuX3N1YmlkID09IDAgJiYgcHJlZml4ID09IDApIHsKICAgICAgICAvKgogICAgICAgICAqIE51bGwgT0lEIAogICAgICAgICAqLwogICAgICAgIG1lbXNldChpbnRfcHRyLCAwLCAyICogc2l6ZW9mKG9pZCkpOwogICAgICAgICpvaWRfbGVuID0gMjsKICAgICAgICBERUJVR1BSSU5USU5ERU5UKCJkdW1wdl9yZWN2Iik7CiAgICAgICAgREVCVUdNU0coKCJkdW1wdl9yZWN2IiwgIk9JRDogTlVMTCAoMC4wKVxuIikpOwogICAgICAgIERFQlVHSU5ERU5UTEVTUygpOwogICAgICAgIHJldHVybiBidWZfcHRyOwogICAgfQoKICAgIC8qCiAgICAgKiBDaGVjayB0aGF0IHRoZSBleHBhbmRlZCBPSUQgd2lsbCBmaXQgaW4gdGhlIGJ1ZmZlciBwcm92aWRlZAogICAgICovCiAgICB0bXBfb2lkX2xlbiA9IChwcmVmaXggPyBuX3N1YmlkICsgNSA6IG5fc3ViaWQpOwogICAgaWYgKCpvaWRfbGVuIDwgdG1wX29pZF9sZW4pIHsKICAgICAgICBERUJVR01TR1RMKCgiYWdlbnR4IiwgIk92ZXJzaXplZCBPYmplY3QgSUQgKGJ1Zj0lZCBwZHU9JWQpXG4iLAoJCSAgICAoaW50KSAqb2lkX2xlbiwgdG1wX29pZF9sZW4pKTsKICAgICAgICBERUJVR0lOREVOVExFU1MoKTsKICAgICAgICByZXR1cm4gTlVMTDsKICAgIH0KCiNpZmRlZiBXT1JEU19CSUdFTkRJQU4KIyBkZWZpbmUgZW5kaWFub2ZmIDEKI2Vsc2UKIyBkZWZpbmUgZW5kaWFub2ZmIDAKI2VuZGlmCiAgICBpZiAoKmxlbmd0aCA8IDQgKiBuX3N1YmlkKSB7CiAgICAgICAgREVCVUdNU0dUTCgoImFnZW50eCIsICJJbmNvbXBsZXRlIE9iamVjdCBJRFxuIikpOwogICAgICAgIERFQlVHSU5ERU5UTEVTUygpOwogICAgICAgIHJldHVybiBOVUxMOwogICAgfQoKICAgIGlmIChwcmVmaXgpIHsJIAogICAgICAgIGlmIChpbnRfb2Zmc2V0ID09IDIpIHsgIAkvKiBhbGlnbiBPSUQgdmFsdWVzIGluIDY0IGJpdCBhZ2VudCAqLyAgCgkgICAgbWVtc2V0KGludF9wdHIsIDAsIDEwKnNpemVvZihpbnRfcHRyWzBdKSk7IAoJICAgIGludF9wdHJbMCtlbmRpYW5vZmZdID0gMTsKCSAgICBpbnRfcHRyWzIrZW5kaWFub2ZmXSA9IDM7CgkgICAgaW50X3B0cls0K2VuZGlhbm9mZl0gPSA2OwoJICAgIGludF9wdHJbNitlbmRpYW5vZmZdID0gMTsKCSAgICBpbnRfcHRyWzgrZW5kaWFub2ZmXSA9IHByZWZpeDsKICAgICAgICB9IGVsc2UgeyAvKiBhc3N1bWUgaW50X29mZnNldCA9PSAxICovCgkgICAgaW50X3B0clswXSA9IDE7CgkgICAgaW50X3B0clsxXSA9IDM7CgkgICAgaW50X3B0clsyXSA9IDY7CgkgICAgaW50X3B0clszXSA9IDE7CgkgICAgaW50X3B0cls0XSA9IHByZWZpeDsKICAgICAgICB9CiAgICAgICAgaW50X3B0ciA9IGludF9wdHIgKyAoaW50X29mZnNldCAqIDUpOwogICAgfQoKICAgIGZvciAoaSA9IDA7IGkgPCAoaW50KSAoaW50X29mZnNldCAqIG5fc3ViaWQpOyBpID0gaSArIGludF9vZmZzZXQpIHsKCWludCB4OwoKCXggPSBhZ2VudHhfcGFyc2VfaW50KGJ1Zl9wdHIsIG5ldHdvcmtfYnl0ZV9vcmRlcik7CglpZiAoaW50X29mZnNldCA9PSAyKSB7CiAgICAgICAgICAgIGludF9wdHJbaSswXSA9IDA7CgkgICAgaW50X3B0cltpKzFdID0gMDsKCSAgICBpbnRfcHRyW2krZW5kaWFub2ZmXT14OwogICAgICAgIH0gZWxzZSB7CgkgICAgaW50X3B0cltpXSA9IHg7CiAgICAgICAgfQogICAgICAgIGJ1Zl9wdHIgKz0gNDsKICAgICAgICAqbGVuZ3RoIC09IDQ7CiAgICB9CgogICAgKm9pZF9sZW4gPSB0bXBfb2lkX2xlbjsKCiAgICBERUJVR0lOREVOVExFU1MoKTsKICAgIERFQlVHUFJJTlRJTkRFTlQoImR1bXB2X3JlY3YiKTsKICAgIERFQlVHTVNHKCgiZHVtcHZfcmVjdiIsICJPSUQ6ICIpKTsKICAgIERFQlVHTVNHT0lEKCgiZHVtcHZfcmVjdiIsIG9pZF9idWYsICpvaWRfbGVuKSk7CiAgICBERUJVR01TRygoImR1bXB2X3JlY3YiLCAiXG4iKSk7CgogICAgcmV0dXJuIGJ1Zl9wdHI7Cn0KCgoKdV9jaGFyICAgICAgICAgKgphZ2VudHhfcGFyc2Vfc3RyaW5nKHVfY2hhciAqIGRhdGEsIHNpemVfdCAqIGxlbmd0aCwKICAgICAgICAgICAgICAgICAgICB1X2NoYXIgKiBzdHJpbmcsIHNpemVfdCAqIHN0cl9sZW4sCiAgICAgICAgICAgICAgICAgICAgdV9pbnQgbmV0d29ya19ieXRlX29yZGVyKQp7CiAgICB1X2ludCAgICAgICAgICAgbGVuOwoKICAgIGlmICgqbGVuZ3RoIDwgNCkgewogICAgICAgIERFQlVHTVNHVEwoKCJhZ2VudHgiLCAiSW5jb21wbGV0ZSBzdHJpbmcgKHRvbyBzaG9ydDogJWQpXG4iLAogICAgICAgICAgICAgICAgICAgIChpbnQpKmxlbmd0aCkpOwogICAgICAgIHJldHVybiBOVUxMOwogICAgfQoKICAgIGxlbiA9IGFnZW50eF9wYXJzZV9pbnQoZGF0YSwgbmV0d29ya19ieXRlX29yZGVyKTsKICAgIGlmICgqbGVuZ3RoIDwgbGVuICsgNCkgewogICAgICAgIERFQlVHTVNHVEwoKCJhZ2VudHgiLCAiSW5jb21wbGV0ZSBzdHJpbmcgKHN0aWxsIHRvbyBzaG9ydDogJWQpXG4iLAogICAgICAgICAgICAgICAgICAgIChpbnQpKmxlbmd0aCkpOwogICAgICAgIHJldHVybiBOVUxMOwogICAgfQogICAgaWYgKGxlbiA+ICpzdHJfbGVuKSB7CiAgICAgICAgREVCVUdNU0dUTCgoImFnZW50eCIsICJTdHJpbmcgdG9vIGxvbmcgKHRvbyBsb25nKVxuIikpOwogICAgICAgIHJldHVybiBOVUxMOwogICAgfQogICAgbWVtbW92ZShzdHJpbmcsIGRhdGEgKyA0LCBsZW4pOwogICAgc3RyaW5nW2xlbl0gPSAnXDAnOwogICAgKnN0cl9sZW4gPSBsZW47CgogICAgbGVuICs9IDM7ICAgICAgICAgICAgICAgICAgIC8qIEV4dGVuZCB0aGUgc3RyaW5nIGxlbmd0aCB0byBpbmNsdWRlIHRoZSBwYWRkaW5nICovCiAgICBsZW4gPj49IDI7CiAgICBsZW4gPDw9IDI7CgogICAgKmxlbmd0aCAtPSAobGVuICsgNCk7CiAgICBERUJVR0RVTVBTRVRVUCgicmVjdiIsIGRhdGEsIChsZW4gKyA0KSk7CiAgICBERUJVR0lGKCJkdW1wdl9yZWN2IikgewogICAgICAgIHVfY2hhciAgICAgICAgICpidWYgPSBOVUxMOwogICAgICAgIHNpemVfdCAgICAgICAgICBidWZfbGVuID0gMCwgb3V0X2xlbiA9IDA7CgogICAgICAgIGlmIChzcHJpbnRfcmVhbGxvY19hc2NpaXN0cmluZygmYnVmLCAmYnVmX2xlbiwgJm91dF9sZW4sIDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZywgbGVuKSkgewogICAgICAgICAgICBERUJVR01TRygoImR1bXB2X3JlY3YiLCAiU3RyaW5nOiAlc1xuIiwgYnVmKSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgREVCVUdNU0coKCJkdW1wdl9yZWN2IiwgIlN0cmluZzogJXMgW1RSVU5DQVRFRF1cbiIsIGJ1ZikpOwogICAgICAgIH0KICAgICAgICBpZiAoYnVmICE9IE5VTEwpIHsKICAgICAgICAgICAgZnJlZShidWYpOwogICAgICAgIH0KICAgIH0KICAgIHJldHVybiBkYXRhICsgKGxlbiArIDQpOwp9Cgp1X2NoYXIgICAgICAgICAqCmFnZW50eF9wYXJzZV9vcGFxdWUodV9jaGFyICogZGF0YSwgc2l6ZV90ICogbGVuZ3RoLCBpbnQgKnR5cGUsCiAgICAgICAgICAgICAgICAgICAgdV9jaGFyICogb3BhcXVlX2J1Ziwgc2l6ZV90ICogb3BhcXVlX2xlbiwKICAgICAgICAgICAgICAgICAgICB1X2ludCBuZXR3b3JrX2J5dGVfb3JkZXIpCnsKI2lmZGVmIE5FVFNOTVBfV0lUSF9PUEFRVUVfU1BFQ0lBTF9UWVBFUwogICAgdW5pb24gewogICAgICAgIGZsb2F0ICAgICAgICAgICBmbG9hdFZhbDsKICAgICAgICBkb3VibGUgICAgICAgICAgZG91YmxlVmFsOwogICAgICAgIGludCAgICAgICAgICAgICBpbnRWYWxbMl07CiAgICAgICAgY2hhciAgICAgICAgICAgIGNbc2l6ZW9mKGRvdWJsZSldOwogICAgfSBmdTsKICAgIGludCAgICAgICAgICAgICB0bXA7CiAgICB1X2NoYXIgICAgICAgICAqYnVmOwojZW5kaWYKICAgIHVfY2hhciAgICAgICAgICpjb25zdCBjcCA9CiAgICAgICAgYWdlbnR4X3BhcnNlX3N0cmluZyhkYXRhLCBsZW5ndGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGFxdWVfYnVmLCBvcGFxdWVfbGVuLCBuZXR3b3JrX2J5dGVfb3JkZXIpOwoKI2lmZGVmIE5FVFNOTVBfV0lUSF9PUEFRVUVfU1BFQ0lBTF9UWVBFUwogICAgaWYgKGNwID09IE5VTEwpCiAgICAgICAgcmV0dXJuIE5VTEw7CgogICAgYnVmID0gb3BhcXVlX2J1ZjsKCiAgICBpZiAoKCpvcGFxdWVfbGVuIDw9IDMpIHx8IChidWZbMF0gIT0gQVNOX09QQVFVRV9UQUcxKSkKICAgICAgICByZXR1cm4gY3A7ICAgICAgICAgICAgICAvKiBVbnJlY29nbmlzZWQgb3BhcXVlIHR5cGUgKi8KCiAgICBzd2l0Y2ggKGJ1ZlsxXSkgewogICAgY2FzZSBBU05fT1BBUVVFX0ZMT0FUOgogICAgICAgIGlmICgoKm9wYXF1ZV9sZW4gIT0gKDMgKyBzaXplb2YoZmxvYXQpKSkgfHwKICAgICAgICAgICAgKGJ1ZlsyXSAhPSBzaXplb2YoZmxvYXQpKSkKICAgICAgICAgICAgcmV0dXJuIGNwOyAgICAgICAgICAvKiBFbmNvZGluZyBpc24ndCByaWdodCBmb3IgRkxPQVQgKi8KCiAgICAgICAgbWVtY3B5KCZmdS5jWzBdLCAmYnVmWzNdLCBzaXplb2YoZmxvYXQpKTsKICAgICAgICBmdS5pbnRWYWxbMF0gPSBudG9obChmdS5pbnRWYWxbMF0pOwogICAgICAgICpvcGFxdWVfbGVuID0gc2l6ZW9mKGZsb2F0KTsKICAgICAgICBtZW1jcHkob3BhcXVlX2J1ZiwgJmZ1LmNbMF0sIHNpemVvZihmbG9hdCkpOwogICAgICAgICp0eXBlID0gQVNOX09QQVFVRV9GTE9BVDsKICAgICAgICBERUJVR01TRygoImR1bXB2X3JlY3YiLCAiRmxvYXQ6ICVmXG4iLCBmdS5mbG9hdFZhbCkpOwogICAgICAgIHJldHVybiBjcDsKCiAgICBjYXNlIEFTTl9PUEFRVUVfRE9VQkxFOgogICAgICAgIGlmICgoKm9wYXF1ZV9sZW4gIT0gKDMgKyBzaXplb2YoZG91YmxlKSkpIHx8CiAgICAgICAgICAgIChidWZbMl0gIT0gc2l6ZW9mKGRvdWJsZSkpKQogICAgICAgICAgICByZXR1cm4gY3A7ICAgICAgICAgIC8qIEVuY29kaW5nIGlzbid0IHJpZ2h0IGZvciBET1VCTEUgKi8KCiAgICAgICAgbWVtY3B5KCZmdS5jWzBdLCAmYnVmWzNdLCBzaXplb2YoZG91YmxlKSk7CiAgICAgICAgdG1wID0gbnRvaGwoZnUuaW50VmFsWzFdKTsKICAgICAgICBmdS5pbnRWYWxbMV0gPSBudG9obChmdS5pbnRWYWxbMF0pOwogICAgICAgIGZ1LmludFZhbFswXSA9IHRtcDsKICAgICAgICAqb3BhcXVlX2xlbiA9IHNpemVvZihkb3VibGUpOwogICAgICAgIG1lbWNweShvcGFxdWVfYnVmLCAmZnUuY1swXSwgc2l6ZW9mKGRvdWJsZSkpOwogICAgICAgICp0eXBlID0gQVNOX09QQVFVRV9ET1VCTEU7CiAgICAgICAgREVCVUdNU0coKCJkdW1wdl9yZWN2IiwgIkRvdWJsZTogJWZcbiIsIGZ1LmRvdWJsZVZhbCkpOwogICAgICAgIHJldHVybiBjcDsKCiAgICBjYXNlIEFTTl9PUEFRVUVfSTY0OgogICAgY2FzZSBBU05fT1BBUVVFX1U2NDoKICAgIGNhc2UgQVNOX09QQVFVRV9DT1VOVEVSNjQ6CiAgICBkZWZhdWx0OgogICAgICAgIHJldHVybiBjcDsgICAgICAgICAgICAgIC8qIFVucmVjb2duaXNlZCBvcGFxdWUgc3ViLXR5cGUgKi8KICAgIH0KI2Vsc2UKICAgIHJldHVybiBjcDsKI2VuZGlmCn0KCgp1X2NoYXIgICAgICAgICAqCmFnZW50eF9wYXJzZV92YXJiaW5kKHVfY2hhciAqIGRhdGEsIHNpemVfdCAqIGxlbmd0aCwgaW50ICp0eXBlLAogICAgICAgICAgICAgICAgICAgICBvaWQgKiBvaWRfYnVmLCBzaXplX3QgKiBvaWRfbGVuLAogICAgICAgICAgICAgICAgICAgICB1X2NoYXIgKiBkYXRhX2J1Ziwgc2l6ZV90ICogZGF0YV9sZW4sCiAgICAgICAgICAgICAgICAgICAgIHVfaW50IG5ldHdvcmtfYnl0ZV9vcmRlcikKewogICAgdV9jaGFyICAgICAgICAgKmJ1ZnAgPSBkYXRhOwogICAgdV9pbnQgICAgICAgICAgIGludF92YWw7CiAgICBzdHJ1Y3QgY291bnRlcjY0IHRtcDY0OwoKICAgIERFQlVHRFVNUEhFQURFUigicmVjdiIsICJWYXJCaW5kOiIpOwogICAgREVCVUdEVU1QSEVBREVSKCJyZWN2IiwgIlR5cGUiKTsKICAgICp0eXBlID0gYWdlbnR4X3BhcnNlX3Nob3J0KGJ1ZnAsIG5ldHdvcmtfYnl0ZV9vcmRlcik7CiAgICBERUJVR0lOREVOVExFU1MoKTsKICAgIGJ1ZnAgKz0gNDsKICAgICpsZW5ndGggLT0gNDsKCiAgICBidWZwID0gYWdlbnR4X3BhcnNlX29pZChidWZwLCBsZW5ndGgsIE5VTEwsIG9pZF9idWYsIG9pZF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXR3b3JrX2J5dGVfb3JkZXIpOwogICAgaWYgKGJ1ZnAgPT0gTlVMTCkgewogICAgICAgIERFQlVHSU5ERU5UTEVTUygpOwogICAgICAgIHJldHVybiBOVUxMOwogICAgfQoKICAgIHN3aXRjaCAoKnR5cGUpIHsKICAgIGNhc2UgQVNOX0lOVEVHRVI6CiAgICBjYXNlIEFTTl9DT1VOVEVSOgogICAgY2FzZSBBU05fR0FVR0U6CiAgICBjYXNlIEFTTl9USU1FVElDS1M6CiAgICBjYXNlIEFTTl9VSU5URUdFUjoKICAgICAgICBpbnRfdmFsID0gYWdlbnR4X3BhcnNlX2ludChidWZwLCBuZXR3b3JrX2J5dGVfb3JkZXIpOwogICAgICAgIG1lbW1vdmUoZGF0YV9idWYsICZpbnRfdmFsLCA0KTsKICAgICAgICAqZGF0YV9sZW4gPSA0OwogICAgICAgIGJ1ZnAgKz0gNDsKICAgICAgICAqbGVuZ3RoIC09IDQ7CiAgICAgICAgYnJlYWs7CgogICAgY2FzZSBBU05fT0NURVRfU1RSOgogICAgY2FzZSBBU05fSVBBRERSRVNTOgogICAgICAgIGJ1ZnAgPSBhZ2VudHhfcGFyc2Vfc3RyaW5nKGJ1ZnAsIGxlbmd0aCwgZGF0YV9idWYsIGRhdGFfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldHdvcmtfYnl0ZV9vcmRlcik7CiAgICAgICAgYnJlYWs7CgogICAgY2FzZSBBU05fT1BBUVVFOgogICAgICAgIGJ1ZnAgPSBhZ2VudHhfcGFyc2Vfb3BhcXVlKGJ1ZnAsIGxlbmd0aCwgdHlwZSwgZGF0YV9idWYsIGRhdGFfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldHdvcmtfYnl0ZV9vcmRlcik7CiAgICAgICAgYnJlYWs7CgogICAgY2FzZSBBU05fUFJJVl9JTkNMX1JBTkdFOgogICAgY2FzZSBBU05fUFJJVl9FWENMX1JBTkdFOgogICAgY2FzZSBBU05fT0JKRUNUX0lEOgogICAgICAgIGJ1ZnAgPQogICAgICAgICAgICBhZ2VudHhfcGFyc2Vfb2lkKGJ1ZnAsIGxlbmd0aCwgTlVMTCwgKG9pZCAqKSBkYXRhX2J1ZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhX2xlbiwgbmV0d29ya19ieXRlX29yZGVyKTsKICAgICAgICAqZGF0YV9sZW4gKj0gc2l6ZW9mKG9pZCk7CiAgICAgICAgLyoKICAgICAgICAgKiAnYWdlbnR4X3BhcnNlX29pZCgpJyByZXR1cm5zIHRoZSBudW1iZXIgb2Ygc3ViX2lkcyAKICAgICAgICAgKi8KICAgICAgICBicmVhazsKCiAgICBjYXNlIEFTTl9DT1VOVEVSNjQ6CiAgICAgICAgbWVtc2V0KCZ0bXA2NCwgMCwgc2l6ZW9mKHRtcDY0KSk7CglpZiAobmV0d29ya19ieXRlX29yZGVyKSB7CgkgICAgdG1wNjQuaGlnaCA9IGFnZW50eF9wYXJzZV9pbnQoYnVmcCwgICBuZXR3b3JrX2J5dGVfb3JkZXIpOwoJICAgIHRtcDY0LmxvdyAgPSBhZ2VudHhfcGFyc2VfaW50KGJ1ZnArNCwgbmV0d29ya19ieXRlX29yZGVyKTsKCX0gZWxzZSB7CgkgICAgdG1wNjQuaGlnaCA9IGFnZW50eF9wYXJzZV9pbnQoYnVmcCs0LCBuZXR3b3JrX2J5dGVfb3JkZXIpOwoJICAgIHRtcDY0LmxvdyAgPSBhZ2VudHhfcGFyc2VfaW50KGJ1ZnAsICAgbmV0d29ya19ieXRlX29yZGVyKTsKCX0KCiAgICAgICAgbWVtY3B5KGRhdGFfYnVmLCAmdG1wNjQsIHNpemVvZih0bXA2NCkpOwoJKmRhdGFfbGVuID0gc2l6ZW9mKHRtcDY0KTsKCWJ1ZnAgICAgKz0gODsKCSpsZW5ndGggLT0gODsKICAgICAgICBicmVhazsKCiAgICBjYXNlIEFTTl9OVUxMOgogICAgY2FzZSBTTk1QX05PU1VDSE9CSkVDVDoKICAgIGNhc2UgU05NUF9OT1NVQ0hJTlNUQU5DRToKICAgIGNhc2UgU05NUF9FTkRPRk1JQlZJRVc6CiAgICAgICAgLyoKICAgICAgICAgKiBObyBkYXRhIGFzc29jaWF0ZWQgd2l0aCB0aGVzZSB0eXBlcy4gCiAgICAgICAgICovCiAgICAgICAgKmRhdGFfbGVuID0gMDsKICAgICAgICBicmVhazsKCiAgICBkZWZhdWx0OgogICAgICAgIERFQlVHTVNHKCgicmVjdiIsICJDYW4gbm90IHBhcnNlIHR5cGUgJXgiLCAqdHlwZSkpOwogICAgICAgIERFQlVHSU5ERU5UTEVTUygpOwogICAgICAgIHJldHVybiBOVUxMOwogICAgfQogICAgREVCVUdJTkRFTlRMRVNTKCk7CiAgICByZXR1cm4gYnVmcDsKfQoKLyoKICogIEFnZW50WCBoZWFkZXI6CiAqCiAqICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCiAqIHwgICAgaC52ZXJzaW9uICB8ICAgaC50eXBlICAgICAgfCAgIGguZmxhZ3MgICAgIHwgIDxyZXNlcnZlZD4gICB8CiAqICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCiAqIHwgICAgICAgICAgICAgICAgICAgICAgIGguc2Vzc2lvbklEICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CiAqICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCiAqIHwgICAgICAgICAgICAgICAgICAgICBoLnRyYW5zYWN0aW9uSUQgICAgICAgICAgICAgICAgICAgICAgICAgICB8CiAqICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCiAqIHwgICAgICAgICAgICAgICAgICAgICAgIGgucGFja2V0SUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CiAqICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCiAqIHwgICAgICAgICAgICAgICAgICAgICBoLnBheWxvYWRfbGVuZ3RoICAgICAgICAgICAgICAgICAgICAgICAgICB8CiAqICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCiAqCiAqICAgIFRvdGFsIGxlbmd0aCA9IDIwIGJ5dGVzCiAqCiAqICBJZiB3ZSBkb24ndCBzZWVtIHRvIGhhdmUgdGhlIGZ1bGwgcGFja2V0LCByZXR1cm4gTlVMTAogKiAgICBhbmQgbGV0IHRoZSBkcml2aW5nIGNvZGUgZ28gYmFjayBmb3IgdGhlIHJlc3QuCiAqICBEb24ndCByZXBvcnQgdGhpcyBhcyBhbiBlcnJvciwgYXMgaXQncyBxdWl0ZSAibm9ybWFsIgogKiAgICB3aXRoIGEgY29ubmVjdGlvbi1vcmllbnRlZCBzZXJ2aWNlLgogKgogKiAgTm90ZSB0aGF0IG9uY2UgdGhlIGhlYWRlciBoYXMgYmVlbiBzdWNjZXNzZnVsbHkgcHJvY2Vzc2VkCiAqICAgIChhbmQgaGVuY2Ugd2Ugc2hvdWxkIGhhdmUgdGhlIGZ1bGwgcGFja2V0KSwgYW55IHN1YnNlcXVlbnQKICogICAgInJ1bm5pbmcgb3V0IG9mIHJvb20iIGlzIGluZGVlZCBhbiBlcnJvci4KICovCnVfY2hhciAgICAgICAgICoKYWdlbnR4X3BhcnNlX2hlYWRlcihuZXRzbm1wX3BkdSAqcGR1LCB1X2NoYXIgKiBkYXRhLCBzaXplX3QgKiBsZW5ndGgpCnsKICAgIHJlZ2lzdGVyIHVfY2hhciAqYnVmcCA9IGRhdGE7CiAgICBzaXplX3QgICAgICAgICAgcGF5bG9hZDsKCiAgICBpZiAoKmxlbmd0aCA8IDIwKSB7ICAgICAgICAgLyogSW5jb21wbGV0ZSBoZWFkZXIgKi8KICAgICAgICByZXR1cm4gTlVMTDsKICAgIH0KCiAgICBERUJVR0RVTVBIRUFERVIoInJlY3YiLCAiQWdlbnRYIEhlYWRlciIpOwogICAgREVCVUdEVU1QSEVBREVSKCJyZWN2IiwgIlZlcnNpb24iKTsKICAgIERFQlVHRFVNUFNFVFVQKCJyZWN2IiwgYnVmcCwgMSk7CiAgICBwZHUtPnZlcnNpb24gPSBBR0VOVFhfVkVSU0lPTl9CQVNFIHwgKmJ1ZnA7CiAgICBERUJVR01TRygoImR1bXB2X3JlY3YiLCAiICBWZXJzaW9uOlx0JWRcbiIsICpidWZwKSk7CiAgICBERUJVR0lOREVOVExFU1MoKTsKICAgIGJ1ZnArKzsKCiAgICBERUJVR0RVTVBIRUFERVIoInJlY3YiLCAiQ29tbWFuZCIpOwogICAgREVCVUdEVU1QU0VUVVAoInJlY3YiLCBidWZwLCAxKTsKICAgIHBkdS0+Y29tbWFuZCA9ICpidWZwOwogICAgREVCVUdNU0coKCJkdW1wdl9yZWN2IiwgIiAgQ29tbWFuZDpcdCVkICglcylcbiIsICpidWZwLAogICAgICAgICAgICAgIGFnZW50eF9jbWQoKmJ1ZnApKSk7CiAgICBERUJVR0lOREVOVExFU1MoKTsKICAgIGJ1ZnArKzsKCiAgICBERUJVR0RVTVBIRUFERVIoInJlY3YiLCAiRmxhZ3MiKTsKICAgIERFQlVHRFVNUFNFVFVQKCJyZWN2IiwgYnVmcCwgMSk7CiAgICBwZHUtPmZsYWdzIHw9ICpidWZwOwogICAgREVCVUdNU0coKCJkdW1wdl9yZWN2IiwgIiAgRmxhZ3M6XHQweCV4XG4iLCAqYnVmcCkpOwogICAgREVCVUdJTkRFTlRMRVNTKCk7CiAgICBidWZwKys7CgogICAgREVCVUdEVU1QSEVBREVSKCJyZWN2IiwgIlJlc2VydmVkIEJ5dGUiKTsKICAgIERFQlVHRFVNUFNFVFVQKCJyZWN2IiwgYnVmcCwgMSk7CiAgICBERUJVR01TRygoImR1bXB2X3JlY3YiLCAiICBSZXNlcnZlZDpcdDB4JXhcbiIsICpidWZwKSk7CiAgICBERUJVR0lOREVOVExFU1MoKTsKICAgIGJ1ZnArKzsKCiAgICBERUJVR0RVTVBIRUFERVIoInJlY3YiLCAiU2Vzc2lvbiBJRCIpOwogICAgcGR1LT5zZXNzaWQgPSBhZ2VudHhfcGFyc2VfaW50KGJ1ZnAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGR1LT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncyAmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUdFTlRYX0ZMQUdTX05FVFdPUktfQllURV9PUkRFUik7CiAgICBERUJVR0lOREVOVExFU1MoKTsKICAgIGJ1ZnAgKz0gNDsKCiAgICBERUJVR0RVTVBIRUFERVIoInJlY3YiLCAiVHJhbnNhY3Rpb24gSUQiKTsKICAgIHBkdS0+dHJhbnNpZCA9IGFnZW50eF9wYXJzZV9pbnQoYnVmcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGR1LT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MgJgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBR0VOVFhfRkxBR1NfTkVUV09SS19CWVRFX09SREVSKTsKICAgIERFQlVHSU5ERU5UTEVTUygpOwogICAgYnVmcCArPSA0OwoKICAgIERFQlVHRFVNUEhFQURFUigicmVjdiIsICJQYWNrZXQgSUQiKTsKICAgIHBkdS0+cmVxaWQgPSBhZ2VudHhfcGFyc2VfaW50KGJ1ZnAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZHUtPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MgJiBBR0VOVFhfRkxBR1NfTkVUV09SS19CWVRFX09SREVSKTsKICAgIERFQlVHSU5ERU5UTEVTUygpOwogICAgYnVmcCArPSA0OwoKICAgIERFQlVHRFVNUEhFQURFUigicmVjdiIsICJQYXlsb2FkIExlbmd0aCIpOwogICAgcGF5bG9hZCA9IGFnZW50eF9wYXJzZV9pbnQoYnVmcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBkdS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncyAmIEFHRU5UWF9GTEFHU19ORVRXT1JLX0JZVEVfT1JERVIpOwogICAgREVCVUdJTkRFTlRMRVNTKCk7CiAgICBidWZwICs9IDQ7CgogICAgREVCVUdJTkRFTlRMRVNTKCk7CiAgICAqbGVuZ3RoIC09IDIwOwogICAgaWYgKCpsZW5ndGggIT0gcGF5bG9hZCkgeyAgIC8qIFNob3J0IHBheWxvYWQgKi8KICAgICAgICByZXR1cm4gTlVMTDsKICAgIH0KICAgIHJldHVybiBidWZwOwp9CgoKaW50CmFnZW50eF9wYXJzZShuZXRzbm1wX3Nlc3Npb24gKiBzZXNzaW9uLCBuZXRzbm1wX3BkdSAqcGR1LCB1X2NoYXIgKiBkYXRhLAogICAgICAgICAgICAgc2l6ZV90IGxlbikKewogICAgcmVnaXN0ZXIgdV9jaGFyICpidWZwID0gZGF0YTsKICAgIHVfY2hhciAgICAgICAgICBidWZmZXJbU05NUF9NQVhfTVNHX1NJWkVdOwogICAgb2lkICAgICAgICAgICAgIG9pZF9idWZmZXJbTUFYX09JRF9MRU5dLCBlbmRfb2lkX2J1ZltNQVhfT0lEX0xFTl07CiAgICBzaXplX3QgICAgICAgICAgYnVmX2xlbiA9IHNpemVvZihidWZmZXIpOwogICAgc2l6ZV90ICAgICAgICAgIG9pZF9idWZfbGVuID0gTUFYX09JRF9MRU47CiAgICBzaXplX3QgICAgICAgICAgZW5kX29pZF9idWZfbGVuID0gTUFYX09JRF9MRU47CgogICAgaW50ICAgICAgICAgICAgIHJhbmdlX2JvdW5kOyAgICAgICAgLyogT0lELXJhbmdlIHVwcGVyIGJvdW5kICovCiAgICBpbnQgICAgICAgICAgICAgaW5jOyAgICAgICAgLyogSW5jbHVzaXZlIFNlYXJjaFJhbmdlIGZsYWcgKi8KICAgIGludCAgICAgICAgICAgICB0eXBlOyAgICAgICAvKiBWYXJCaW5kIGRhdGEgdHlwZSAqLwogICAgc2l6ZV90ICAgICAgICAgKmxlbmd0aCA9ICZsZW47CgogICAgaWYgKHBkdSA9PSBOVUxMKQogICAgICAgIHJldHVybiAoMCk7CiAKICAgIGlmICghSVNfQUdFTlRYX1ZFUlNJT04oc2Vzc2lvbi0+dmVyc2lvbikpCiAgICAgICAgcmV0dXJuIFNOTVBFUlJfQkFEX1ZFUlNJT047CgojaWZuZGVmIFNOTVBFUlJfSU5DT01QTEVURV9QQUNLRVQKICAgIC8qCiAgICAgKiAgSWRlYWxseSwgInNob3J0IiBwYWNrZXRzIG9uIHN0cmVhbSBjb25uZWN0aW9ucyBzaG91bGQKICAgICAqICAgIGJlIGhhbmRsZWQgc3BlY2lhbGx5LCBhbmQgdGhlIGRyaXZpbmcgY29kZSBzZXQgdXAgdG8KICAgICAqICAgIGtlZXAgcmVhZGluZyB1bnRpbCB0aGUgZnVsbCBwYWNrZXQgaXMgcmVjZWl2ZWQuCiAgICAgKgogICAgICogIEZvciBub3csIGxldHMgYXNzdW1lIHRoYXQgYWxsIHBhY2tldHMgYXJlIHJlYWQgaW4gb25lIGdvLgogICAgICogICAgSSd2ZSBwcm9iYWJseSBpbmZsaWN0ZWQgZW5vdWdoIGRhbWFnZSBvbiB0aGUgVUNEIGxpYnJhcnkKICAgICAqICAgIGZvciBvbmUgd2VlayEKICAgICAqCiAgICAgKiAgSSdsbCBjb21lIGJhY2sgdG8gdGhpcyBvbmNlIFdlcyBpcyBzcGVha2luZyB0byBtZSBhZ2Fpbi4KICAgICAqLwojZGVmaW5lIFNOTVBFUlJfSU5DT01QTEVURV9QQUNLRVQgU05NUEVSUl9BU05fUEFSU0VfRVJSCiNlbmRpZgoKCiAgICAvKgogICAgICogIEhhbmRsZSAoY29tbW9uKSBoZWFkZXIgLi4uLgogICAgICovCiAgICBidWZwID0gYWdlbnR4X3BhcnNlX2hlYWRlcihwZHUsIGJ1ZnAsIGxlbmd0aCk7CiAgICBpZiAoYnVmcCA9PSBOVUxMKQogICAgICAgIHJldHVybiBTTk1QRVJSX0lOQ09NUExFVEVfUEFDS0VUOyAgICAgICAvKiBpLmUuIHdhaXQgZm9yIHRoZSByZXN0ICovCgogICAgLyoKICAgICAqIENvbnRyb2wgUERVIGhhbmRsaW5nIAogICAgICovCiAgICBwZHUtPmZsYWdzIHw9IFVDRF9NU0dfRkxBR19BTFdBWVNfSU5fVklFVzsKICAgIHBkdS0+ZmxhZ3MgfD0gVUNEX01TR19GTEFHX0ZPUkNFX1BEVV9DT1BZOwogICAgcGR1LT5mbGFncyAmPSAoflVDRF9NU0dfRkxBR19SRVNQT05TRV9QRFUpOwoKICAgIC8qCiAgICAgKiAgLi4uIGFuZCAobm90LXVuLWNvbW1vbikgY29udGV4dAogICAgICovCiAgICBpZiAocGR1LT5mbGFncyAmIEFHRU5UWF9NU0dfRkxBR19OT05fREVGQVVMVF9DT05URVhUKSB7CiAgICAgICAgREVCVUdEVU1QSEVBREVSKCJyZWN2IiwgIkNvbnRleHQiKTsKICAgICAgICBidWZwID0gYWdlbnR4X3BhcnNlX3N0cmluZyhidWZwLCBsZW5ndGgsIGJ1ZmZlciwgJmJ1Zl9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGR1LT5mbGFncyAmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUdFTlRYX0ZMQUdTX05FVFdPUktfQllURV9PUkRFUik7CiAgICAgICAgREVCVUdJTkRFTlRMRVNTKCk7CiAgICAgICAgaWYgKGJ1ZnAgPT0gTlVMTCkKICAgICAgICAgICAgcmV0dXJuIFNOTVBFUlJfQVNOX1BBUlNFX0VSUjsKCiAgICAgICAgcGR1LT5jb21tdW5pdHlfbGVuID0gYnVmX2xlbjsKICAgICAgICBzbm1wX2Nsb25lX21lbSgodm9pZCAqKikgJnBkdS0+Y29tbXVuaXR5LAogICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopIGJ1ZmZlciwgKHVuc2lnbmVkKSBidWZfbGVuKTsKCQkKCQkvKiBUaGUgTmV0U05NUCBBUEkgc3R1ZmZzIHRoZSBjb250ZXh0IGludG8gdGhlIFBEVSdzIGNvbW11bml0eSBzdHJpbmcKCQkgKiBmaWVsZCwgd2hlbiB1c2luZyB0aGUgQWdlbnRYIFByb3RvY29sLiAgVGhlIHJlc3Qgb2YgdGhlIGNvZGUgaG93ZXZlciwKCQkgKiBleHBlY3RzIHRvIGZpbmQgdGhlIGNvbnRleHQgaW4gdGhlIFBEVSdzIGNvbnRleHQgZmllbGQuICBUaGVyZWZvcmUgd2UKCQkgKiBuZWVkIHRvIGNvcHkgdGhlIGNvbnRleHQgaW50byB0aGUgUERVJ3MgY29udGV4dCBmaWVsZHMuICAqLwoJCWlmIChwZHUtPmNvbW11bml0eV9sZW4gPiAwICYmIHBkdS0+Y29udGV4dE5hbWUgPT0gTlVMTCkKCQl7CgkJCXBkdS0+Y29udGV4dE5hbWUgICAgPSBzdHJkdXAocGR1LT5jb21tdW5pdHkpOwoJCQlwZHUtPmNvbnRleHROYW1lTGVuID0gcGR1LT5jb21tdW5pdHlfbGVuOwoJCX0KCiAgICAgICAgYnVmX2xlbiA9IHNpemVvZihidWZmZXIpOwogICAgfQoKICAgIERFQlVHRFVNUEhFQURFUigicmVjdiIsICJQRFUiKTsKICAgIHN3aXRjaCAocGR1LT5jb21tYW5kKSB7CiAgICBjYXNlIEFHRU5UWF9NU0dfT1BFTjoKICAgICAgICBwZHUtPnRpbWUgPSAqYnVmcDsgICAgICAvKiBUaW1lb3V0ICovCiAgICAgICAgYnVmcCArPSA0OwogICAgICAgICpsZW5ndGggLT0gNDsKCiAgICAgICAgLyoKICAgICAgICAgKiBTdG9yZSBzdWJhZ2VudCBPSUQgJiBkZXNjcmlwdGlvbiBpbiBhIFZhckJpbmQgCiAgICAgICAgICovCiAgICAgICAgREVCVUdEVU1QSEVBREVSKCJyZWN2IiwgIlN1YmFnZW50IE9JRCIpOwogICAgICAgIGJ1ZnAgPSBhZ2VudHhfcGFyc2Vfb2lkKGJ1ZnAsIGxlbmd0aCwgTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvaWRfYnVmZmVyLCAmb2lkX2J1Zl9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGR1LT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncyAmIEFHRU5UWF9GTEFHU19ORVRXT1JLX0JZVEVfT1JERVIpOwogICAgICAgIERFQlVHSU5ERU5UTEVTUygpOwogICAgICAgIGlmIChidWZwID09IE5VTEwpIHsKICAgICAgICAgICAgREVCVUdJTkRFTlRMRVNTKCk7CiAgICAgICAgICAgIHJldHVybiBTTk1QRVJSX0FTTl9QQVJTRV9FUlI7CiAgICAgICAgfQogICAgICAgIERFQlVHRFVNUEhFQURFUigicmVjdiIsICJTdWJhZ2VudCBEZXNjcmlwdGlvbiIpOwogICAgICAgIGJ1ZnAgPSBhZ2VudHhfcGFyc2Vfc3RyaW5nKGJ1ZnAsIGxlbmd0aCwgYnVmZmVyLCAmYnVmX2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZHUtPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzICYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBR0VOVFhfRkxBR1NfTkVUV09SS19CWVRFX09SREVSKTsKICAgICAgICBERUJVR0lOREVOVExFU1MoKTsKICAgICAgICBpZiAoYnVmcCA9PSBOVUxMKSB7CiAgICAgICAgICAgIERFQlVHSU5ERU5UTEVTUygpOwogICAgICAgICAgICByZXR1cm4gU05NUEVSUl9BU05fUEFSU0VfRVJSOwogICAgICAgIH0KICAgICAgICBzbm1wX3BkdV9hZGRfdmFyaWFibGUocGR1LCBvaWRfYnVmZmVyLCBvaWRfYnVmX2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVNOX09DVEVUX1NUUiwgYnVmZmVyLCBidWZfbGVuKTsKCiAgICAgICAgb2lkX2J1Zl9sZW4gPSBNQVhfT0lEX0xFTjsKICAgICAgICBidWZfbGVuID0gc2l6ZW9mKGJ1ZmZlcik7CiAgICAgICAgYnJlYWs7CgogICAgY2FzZSBBR0VOVFhfTVNHX0NMT1NFOgogICAgICAgIHBkdS0+ZXJyc3RhdCA9ICpidWZwOyAgIC8qIFJlYXNvbiAqLwogICAgICAgIGJ1ZnAgKz0gNDsKICAgICAgICAqbGVuZ3RoIC09IDQ7CgogICAgICAgIGJyZWFrOwoKICAgIGNhc2UgQUdFTlRYX01TR19VTlJFR0lTVEVSOgogICAgY2FzZSBBR0VOVFhfTVNHX1JFR0lTVEVSOgogICAgICAgIERFQlVHRFVNUEhFQURFUigicmVjdiIsICJSZWdpc3RyYXRpb24gSGVhZGVyIik7CiAgICAgICAgaWYgKHBkdS0+Y29tbWFuZCA9PSBBR0VOVFhfTVNHX1JFR0lTVEVSKSB7CiAgICAgICAgICAgIHBkdS0+dGltZSA9ICpidWZwOyAgLyogVGltZW91dCAoUmVnaXN0ZXIgb25seSkgKi8KICAgICAgICAgICAgREVCVUdEVU1QU0VUVVAoInJlY3YiLCBidWZwLCAxKTsKICAgICAgICAgICAgREVCVUdNU0coKCJkdW1wdl9yZWN2IiwgIiAgVGltZW91dDogICAgIFx0JWRcbiIsICpidWZwKSk7CiAgICAgICAgfQogICAgICAgIGJ1ZnArKzsKICAgICAgICBwZHUtPnByaW9yaXR5ID0gKmJ1ZnA7CiAgICAgICAgREVCVUdEVU1QU0VUVVAoInJlY3YiLCBidWZwLCAxKTsKICAgICAgICBERUJVR01TRygoImR1bXB2X3JlY3YiLCAiICBQcmlvcml0eTogICAgXHQlZFxuIiwgKmJ1ZnApKTsKICAgICAgICBidWZwKys7CiAgICAgICAgcGR1LT5yYW5nZV9zdWJpZCA9ICpidWZwOwogICAgICAgIERFQlVHRFVNUFNFVFVQKCJyZWN2IiwgYnVmcCwgMSk7CiAgICAgICAgREVCVUdNU0coKCJkdW1wdl9yZWN2IiwgIiAgUmFuZ2UgU3ViLUlkOlx0JWRcbiIsICpidWZwKSk7CiAgICAgICAgYnVmcCsrOwogICAgICAgIGJ1ZnArKzsKICAgICAgICAqbGVuZ3RoIC09IDQ7CiAgICAgICAgREVCVUdJTkRFTlRMRVNTKCk7CgogICAgICAgIERFQlVHRFVNUEhFQURFUigicmVjdiIsICJSZWdpc3RyYXRpb24gT0lEIik7CiAgICAgICAgYnVmcCA9IGFnZW50eF9wYXJzZV9vaWQoYnVmcCwgbGVuZ3RoLCBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9pZF9idWZmZXIsICZvaWRfYnVmX2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZHUtPmZsYWdzICYgQUdFTlRYX0ZMQUdTX05FVFdPUktfQllURV9PUkRFUik7CiAgICAgICAgREVCVUdJTkRFTlRMRVNTKCk7CiAgICAgICAgaWYgKGJ1ZnAgPT0gTlVMTCkgewogICAgICAgICAgICBERUJVR0lOREVOVExFU1MoKTsKICAgICAgICAgICAgcmV0dXJuIFNOTVBFUlJfQVNOX1BBUlNFX0VSUjsKICAgICAgICB9CgogICAgICAgIGlmIChwZHUtPnJhbmdlX3N1YmlkKSB7CiAgICAgICAgICAgIHJhbmdlX2JvdW5kID0gYWdlbnR4X3BhcnNlX2ludChidWZwLCBwZHUtPmZsYWdzICYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFHRU5UWF9GTEFHU19ORVRXT1JLX0JZVEVfT1JERVIpOwogICAgICAgICAgICBidWZwICs9IDQ7CiAgICAgICAgICAgICpsZW5ndGggLT0gNDsKCiAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAqIENvbnN0cnVjdCB0aGUgZW5kLU9JRC4gIAogICAgICAgICAgICAgKi8KICAgICAgICAgICAgZW5kX29pZF9idWZfbGVuID0gb2lkX2J1Zl9sZW4gKiBzaXplb2Yob2lkKTsKICAgICAgICAgICAgbWVtY3B5KGVuZF9vaWRfYnVmLCBvaWRfYnVmZmVyLCBlbmRfb2lkX2J1Zl9sZW4pOwogICAgICAgICAgICBlbmRfb2lkX2J1ZltwZHUtPnJhbmdlX3N1YmlkIC0gMV0gPSByYW5nZV9ib3VuZDsKCiAgICAgICAgICAgIHNubXBfcGR1X2FkZF92YXJpYWJsZShwZHUsIG9pZF9idWZmZXIsIG9pZF9idWZfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVNOX1BSSVZfSU5DTF9SQU5HRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1X2NoYXIgKikgZW5kX29pZF9idWYsIGVuZF9vaWRfYnVmX2xlbik7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgc25tcF9hZGRfbnVsbF92YXIocGR1LCBvaWRfYnVmZmVyLCBvaWRfYnVmX2xlbik7CiAgICAgICAgfQoKICAgICAgICBvaWRfYnVmX2xlbiA9IE1BWF9PSURfTEVOOwogICAgICAgIGJyZWFrOwoKICAgIGNhc2UgQUdFTlRYX01TR19HRVRCVUxLOgogICAgICAgIERFQlVHRFVNUEhFQURFUigicmVjdiIsICJOb24tcmVwZWF0ZXJzIik7CiAgICAgICAgcGR1LT5ub25fcmVwZWF0ZXJzID0gYWdlbnR4X3BhcnNlX3Nob3J0KGJ1ZnAsIHBkdS0+ZmxhZ3MgJgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBR0VOVFhfRkxBR1NfTkVUV09SS19CWVRFX09SREVSKTsKICAgICAgICBERUJVR0lOREVOVExFU1MoKTsKICAgICAgICBERUJVR0RVTVBIRUFERVIoInJlY3YiLCAiTWF4LXJlcGVhdGVycyIpOwogICAgICAgIHBkdS0+bWF4X3JlcGV0aXRpb25zID0gYWdlbnR4X3BhcnNlX3Nob3J0KGJ1ZnAgKyAyLCBwZHUtPmZsYWdzICYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBR0VOVFhfRkxBR1NfTkVUV09SS19CWVRFX09SREVSKTsKICAgICAgICBERUJVR0lOREVOVExFU1MoKTsKICAgICAgICBidWZwICs9IDQ7CiAgICAgICAgKmxlbmd0aCAtPSA0OwogICAgICAgIC8qCiAgICAgICAgICogRmFsbHRocm91Z2ggLSBTZWFyY2hSYW5nZSBoYW5kbGluZyBpcyB0aGUgc2FtZSAKICAgICAgICAgKi8KCiAgICBjYXNlIEFHRU5UWF9NU0dfR0VUTkVYVDoKICAgIGNhc2UgQUdFTlRYX01TR19HRVQ6CgogICAgICAgIC8qCiAgICAgICAgICogKiAgU2VhcmNoUmFuZ2UgTGlzdAogICAgICAgICAqICogIEtlZXAgZ29pbmcgd2hpbGUgd2UgaGF2ZSBkYXRhIGxlZnQKICAgICAgICAgKi8KICAgICAgICBERUJVR0RVTVBIRUFERVIoInJlY3YiLCAiU2VhcmNoIFJhbmdlIik7CiAgICAgICAgd2hpbGUgKCpsZW5ndGggPiAwKSB7CiAgICAgICAgICAgIGJ1ZnAgPSBhZ2VudHhfcGFyc2Vfb2lkKGJ1ZnAsIGxlbmd0aCwgJmluYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2lkX2J1ZmZlciwgJm9pZF9idWZfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZHUtPmZsYWdzICYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUdFTlRYX0ZMQUdTX05FVFdPUktfQllURV9PUkRFUik7CiAgICAgICAgICAgIGlmIChidWZwID09IE5VTEwpIHsKICAgICAgICAgICAgICAgIERFQlVHSU5ERU5UTEVTUygpOwogICAgICAgICAgICAgICAgREVCVUdJTkRFTlRMRVNTKCk7CiAgICAgICAgICAgICAgICByZXR1cm4gU05NUEVSUl9BU05fUEFSU0VfRVJSOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGJ1ZnAgPSBhZ2VudHhfcGFyc2Vfb2lkKGJ1ZnAsIGxlbmd0aCwgTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kX29pZF9idWYsICZlbmRfb2lkX2J1Zl9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBkdS0+ZmxhZ3MgJgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBR0VOVFhfRkxBR1NfTkVUV09SS19CWVRFX09SREVSKTsKICAgICAgICAgICAgaWYgKGJ1ZnAgPT0gTlVMTCkgewogICAgICAgICAgICAgICAgREVCVUdJTkRFTlRMRVNTKCk7CiAgICAgICAgICAgICAgICBERUJVR0lOREVOVExFU1MoKTsKICAgICAgICAgICAgICAgIHJldHVybiBTTk1QRVJSX0FTTl9QQVJTRV9FUlI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZW5kX29pZF9idWZfbGVuICo9IHNpemVvZihvaWQpOwogICAgICAgICAgICAvKgogICAgICAgICAgICAgKiAnYWdlbnR4X3BhcnNlX29pZCgpJyByZXR1cm5zIHRoZSBudW1iZXIgb2Ygc3ViX2lkcyAKICAgICAgICAgICAgICovCgogICAgICAgICAgICBpZiAoaW5jKSB7CiAgICAgICAgICAgICAgICBzbm1wX3BkdV9hZGRfdmFyaWFibGUocGR1LCBvaWRfYnVmZmVyLCBvaWRfYnVmX2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBU05fUFJJVl9JTkNMX1JBTkdFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1X2NoYXIgKikgZW5kX29pZF9idWYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kX29pZF9idWZfbGVuKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHNubXBfcGR1X2FkZF92YXJpYWJsZShwZHUsIG9pZF9idWZmZXIsIG9pZF9idWZfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFTTl9QUklWX0VYQ0xfUkFOR0UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVfY2hhciAqKSBlbmRfb2lkX2J1ZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmRfb2lkX2J1Zl9sZW4pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIG9pZF9idWZfbGVuID0gTUFYX09JRF9MRU47CiAgICAgICAgICAgIGVuZF9vaWRfYnVmX2xlbiA9IE1BWF9PSURfTEVOOwogICAgICAgIH0KCiAgICAgICAgREVCVUdJTkRFTlRMRVNTKCk7CiAgICAgICAgYnJlYWs7CgoKICAgIGNhc2UgQUdFTlRYX01TR19SRVNQT05TRToKCiAgICAgICAgcGR1LT5mbGFncyB8PSBVQ0RfTVNHX0ZMQUdfUkVTUE9OU0VfUERVOwoKICAgICAgICAvKgogICAgICAgICAqIHN5c1VwVGltZSAKICAgICAgICAgKi8KICAgICAgICBwZHUtPnRpbWUgPSBhZ2VudHhfcGFyc2VfaW50KGJ1ZnAsIHBkdS0+ZmxhZ3MgJgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUdFTlRYX0ZMQUdTX05FVFdPUktfQllURV9PUkRFUik7CiAgICAgICAgYnVmcCArPSA0OwogICAgICAgICpsZW5ndGggLT0gNDsKCiAgICAgICAgcGR1LT5lcnJzdGF0ID0gYWdlbnR4X3BhcnNlX3Nob3J0KGJ1ZnAsIHBkdS0+ZmxhZ3MgJgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBR0VOVFhfRkxBR1NfTkVUV09SS19CWVRFX09SREVSKTsKICAgICAgICBwZHUtPmVycmluZGV4ID0KICAgICAgICAgICAgYWdlbnR4X3BhcnNlX3Nob3J0KGJ1ZnAgKyAyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGR1LT5mbGFncyAmIEFHRU5UWF9GTEFHU19ORVRXT1JLX0JZVEVfT1JERVIpOwogICAgICAgIGJ1ZnAgKz0gNDsKICAgICAgICAqbGVuZ3RoIC09IDQ7CiAgICAgICAgLyoKICAgICAgICAgKiBGYWxsdGhyb3VnaCAtIFZhckJpbmQgaGFuZGxpbmcgaXMgdGhlIHNhbWUgCiAgICAgICAgICovCgogICAgY2FzZSBBR0VOVFhfTVNHX0lOREVYX0FMTE9DQVRFOgogICAgY2FzZSBBR0VOVFhfTVNHX0lOREVYX0RFQUxMT0NBVEU6CiAgICBjYXNlIEFHRU5UWF9NU0dfTk9USUZZOgogICAgY2FzZSBBR0VOVFhfTVNHX1RFU1RTRVQ6CgogICAgICAgIC8qCiAgICAgICAgICogKiAgVmFyQmluZCBMaXN0CiAgICAgICAgICogKiAgS2VlcCBnb2luZyB3aGlsZSB3ZSBoYXZlIGRhdGEgbGVmdAogICAgICAgICAqLwoKICAgICAgICBERUJVR0RVTVBIRUFERVIoInJlY3YiLCAiVmFyQmluZExpc3QiKTsKICAgICAgICB3aGlsZSAoKmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgYnVmcCA9IGFnZW50eF9wYXJzZV92YXJiaW5kKGJ1ZnAsIGxlbmd0aCwgJnR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvaWRfYnVmZmVyLCAmb2lkX2J1Zl9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIsICZidWZfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGR1LT5mbGFncyAmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBR0VOVFhfRkxBR1NfTkVUV09SS19CWVRFX09SREVSKTsKICAgICAgICAgICAgaWYgKGJ1ZnAgPT0gTlVMTCkgewogICAgICAgICAgICAgICAgREVCVUdJTkRFTlRMRVNTKCk7CiAgICAgICAgICAgICAgICBERUJVR0lOREVOVExFU1MoKTsKICAgICAgICAgICAgICAgIHJldHVybiBTTk1QRVJSX0FTTl9QQVJTRV9FUlI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc25tcF9wZHVfYWRkX3ZhcmlhYmxlKHBkdSwgb2lkX2J1ZmZlciwgb2lkX2J1Zl9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodV9jaGFyKSB0eXBlLCBidWZmZXIsIGJ1Zl9sZW4pOwoKICAgICAgICAgICAgb2lkX2J1Zl9sZW4gPSBNQVhfT0lEX0xFTjsKICAgICAgICAgICAgYnVmX2xlbiA9IHNpemVvZihidWZmZXIpOwogICAgICAgIH0KICAgICAgICBERUJVR0lOREVOVExFU1MoKTsKICAgICAgICBicmVhazsKCiAgICBjYXNlIEFHRU5UWF9NU0dfQ09NTUlUU0VUOgogICAgY2FzZSBBR0VOVFhfTVNHX1VORE9TRVQ6CiAgICBjYXNlIEFHRU5UWF9NU0dfQ0xFQU5VUFNFVDoKICAgIGNhc2UgQUdFTlRYX01TR19QSU5HOgoKICAgICAgICAvKgogICAgICAgICAqICJFbXB0eSIgcGFja2V0IAogICAgICAgICAqLwogICAgICAgIGJyZWFrOwoKCiAgICBjYXNlIEFHRU5UWF9NU0dfQUREX0FHRU5UX0NBUFM6CiAgICAgICAgLyoKICAgICAgICAgKiBTdG9yZSBBZ2VudENhcCBPSUQgJiBkZXNjcmlwdGlvbiBpbiBhIFZhckJpbmQgCiAgICAgICAgICovCiAgICAgICAgYnVmcCA9IGFnZW50eF9wYXJzZV9vaWQoYnVmcCwgbGVuZ3RoLCBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9pZF9idWZmZXIsICZvaWRfYnVmX2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZHUtPmZsYWdzICYgQUdFTlRYX0ZMQUdTX05FVFdPUktfQllURV9PUkRFUik7CiAgICAgICAgaWYgKGJ1ZnAgPT0gTlVMTCkKICAgICAgICAgICAgcmV0dXJuIFNOTVBFUlJfQVNOX1BBUlNFX0VSUjsKICAgICAgICBidWZwID0gYWdlbnR4X3BhcnNlX3N0cmluZyhidWZwLCBsZW5ndGgsIGJ1ZmZlciwgJmJ1Zl9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGR1LT5mbGFncyAmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUdFTlRYX0ZMQUdTX05FVFdPUktfQllURV9PUkRFUik7CiAgICAgICAgaWYgKGJ1ZnAgPT0gTlVMTCkKICAgICAgICAgICAgcmV0dXJuIFNOTVBFUlJfQVNOX1BBUlNFX0VSUjsKICAgICAgICBzbm1wX3BkdV9hZGRfdmFyaWFibGUocGR1LCBvaWRfYnVmZmVyLCBvaWRfYnVmX2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVNOX09DVEVUX1NUUiwgYnVmZmVyLCBidWZfbGVuKTsKCiAgICAgICAgb2lkX2J1Zl9sZW4gPSBNQVhfT0lEX0xFTjsKICAgICAgICBidWZfbGVuID0gc2l6ZW9mKGJ1ZmZlcik7CiAgICAgICAgYnJlYWs7CgogICAgY2FzZSBBR0VOVFhfTVNHX1JFTU9WRV9BR0VOVF9DQVBTOgogICAgICAgIC8qCiAgICAgICAgICogU3RvcmUgQWdlbnRDYXAgT0lEICYgZGVzY3JpcHRpb24gaW4gYSBWYXJCaW5kIAogICAgICAgICAqLwogICAgICAgIGJ1ZnAgPSBhZ2VudHhfcGFyc2Vfb2lkKGJ1ZnAsIGxlbmd0aCwgTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvaWRfYnVmZmVyLCAmb2lkX2J1Zl9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGR1LT5mbGFncyAmIEFHRU5UWF9GTEFHU19ORVRXT1JLX0JZVEVfT1JERVIpOwogICAgICAgIGlmIChidWZwID09IE5VTEwpCiAgICAgICAgICAgIHJldHVybiBTTk1QRVJSX0FTTl9QQVJTRV9FUlI7CiAgICAgICAgc25tcF9hZGRfbnVsbF92YXIocGR1LCBvaWRfYnVmZmVyLCBvaWRfYnVmX2xlbik7CgogICAgICAgIG9pZF9idWZfbGVuID0gTUFYX09JRF9MRU47CiAgICAgICAgYnJlYWs7CgogICAgZGVmYXVsdDoKICAgICAgICBERUJVR0lOREVOVExFU1MoKTsKICAgICAgICBERUJVR01TR1RMKCgiYWdlbnR4IiwgIlVucmVjb2duaXNlZCBQRFUgdHlwZTogJWRcbiIsCiAgICAgICAgICAgICAgICAgICAgcGR1LT5jb21tYW5kKSk7CiAgICAgICAgcmV0dXJuIFNOTVBFUlJfVU5LTk9XTl9QRFU7CiAgICB9CiAgICBERUJVR0lOREVOVExFU1MoKTsKICAgIHJldHVybiBTTk1QX0VSUl9OT0VSUk9SOwp9CgoKCgojaWZkZWYgVEVTVElORwoKdGVzdGl0KG5ldHNubXBfcGR1ICpwZHUxKQp7CiAgICBjaGFyICAgICAgICAgICAgcGFja2V0MVtCVUZTSVpdOwogICAgY2hhciAgICAgICAgICAgIHBhY2tldDJbQlVGU0laXTsKICAgIGludCAgICAgICAgICAgICBsZW4xLCBsZW4yOwogICAgbmV0c25tcF9wZHUgICAgIHBkdTI7CiAgICBuZXRzbm1wX3Nlc3Npb24gc2VzczsKCiAgICBtZW1zZXQoJnBkdTIsIDAsIHNpemVvZihuZXRzbm1wX3BkdSkpOwogICAgbWVtc2V0KHBhY2tldDEsIDAsIEJVRlNJWik7CiAgICBtZW1zZXQocGFja2V0MiwgMCwgQlVGU0laKTsKCiAgICAvKgogICAgICogRW5jb2RlIHRoaXMgaW50byBhICJwYWNrZXQiIAogICAgICovCiAgICBsZW4xID0gQlVGU0laOwogICAgaWYgKGFnZW50eF9idWlsZCgmc2VzcywgcGR1MSwgcGFja2V0MSwgJmxlbjEpIDwgMCkgewogICAgICAgIERFQlVHTVNHVEwoKCJhZ2VudHgiLCAiRmlyc3QgYnVpbGQgZmFpbGVkXG4iKSk7CiAgICAgICAgZXhpdCgxKTsKICAgIH0KCiAgICBERUJVR01TR1RMKCgiYWdlbnR4IiwgIkZpcnN0IGJ1aWxkIHN1Y2NlZWRlZDpcbiIpKTsKICAgIHhkdW1wKHBhY2tldDEsIGxlbjEsICJBeDE+ICIpOwoKICAgIC8qCiAgICAgKiBVbnBhY2sgdGhpcyBpbnRvIGEgUERVIAogICAgICovCiAgICBsZW4yID0gbGVuMTsKICAgIGlmIChhZ2VudHhfcGFyc2UoJnBkdTIsIHBhY2tldDEsICZsZW4yLCAodV9jaGFyICoqKSBOVUxMKSA8IDApIHsKICAgICAgICBERUJVR01TR1RMKCgiYWdlbnR4IiwgIkZpcnN0IHBhcnNlIGZhaWxlZFxuIikpOwogICAgICAgIGV4aXQoMSk7CiAgICB9CiAgICBERUJVR01TR1RMKCgiYWdlbnR4IiwgIkZpcnN0IHBhcnNlIHN1Y2NlZWRlZDpcbiIpKTsKICAgIGlmIChsZW4yICE9IDApCiAgICAgICAgREVCVUdNU0dUTCgoImFnZW50eCIsCiAgICAgICAgICAgICAgICAgICAgIldhcm5pbmcgLSBwYXJzZWQgcGFja2V0IGhhcyAlZCBieXRlcyBsZWZ0XG4iLCBsZW4yKSk7CgogICAgLyoKICAgICAqIEVuY29kZSB0aGlzIGludG8gYW5vdGhlciAicGFja2V0IiAKICAgICAqLwogICAgbGVuMiA9IEJVRlNJWjsKICAgIGlmIChhZ2VudHhfYnVpbGQoJnNlc3MsICZwZHUyLCBwYWNrZXQyLCAmbGVuMikgPCAwKSB7CiAgICAgICAgREVCVUdNU0dUTCgoImFnZW50eCIsICJTZWNvbmQgYnVpbGQgZmFpbGVkXG4iKSk7CiAgICAgICAgZXhpdCgxKTsKICAgIH0KCiAgICBERUJVR01TR1RMKCgiYWdlbnR4IiwgIlNlY29uZCBidWlsZCBzdWNjZWVkZWQ6XG4iKSk7CiAgICB4ZHVtcChwYWNrZXQyLCBsZW4yLCAiQXgyPiAiKTsKCiAgICAvKgogICAgICogQ29tcGFyZSB0aGUgcmVzdWx0cyAKICAgICAqLwogICAgaWYgKGxlbjEgIT0gbGVuMikgewogICAgICAgIERFQlVHTVNHVEwoKCJhZ2VudHgiLAogICAgICAgICAgICAgICAgICAgICJFcnJvcjogZmlyc3QgYnVpbGQgKCVkKSBpcyBkaWZmZXJlbnQgdG8gc2Vjb25kICglZClcbiIsCiAgICAgICAgICAgICAgICAgICAgbGVuMSwgbGVuMikpOwogICAgICAgIGV4aXQoMSk7CiAgICB9CiAgICBpZiAobWVtY21wKHBhY2tldDEsIHBhY2tldDIsIGxlbjEpICE9IDApIHsKICAgICAgICBERUJVR01TR1RMKCgiYWdlbnR4IiwKICAgICAgICAgICAgICAgICAgICAiRXJyb3I6IGZpcnN0IGJ1aWxkIGRhdGEgaXMgZGlmZmVyZW50IHRvIHNlY29uZFxuIikpOwogICAgICAgIGV4aXQoMSk7CiAgICB9CgogICAgREVCVUdNU0dUTCgoImFnZW50eCIsICJPS1xuIikpOwp9CgoKCm1haW4oKQp7CiAgICBuZXRzbm1wX3BkdSAgICAgcGR1MTsKICAgIG9pZCAgICAgICAgICAgICBvaWRfYnVmW10gPSB7IDEsIDMsIDYsIDEsIDIsIDEsIDEwIH07CiAgICBvaWQgICAgICAgICAgICAgb2lkX2J1ZjJbXSA9IHsgMSwgMywgNiwgMSwgMiwgMSwgMjAgfTsKICAgIG9pZCAgICAgICAgICAgICBudWxsX29pZFtdID0geyAwLCAwIH07CiAgICBjaGFyICAgICAgICAgICAqc3RyaW5nID0gIkV4YW1wbGUgc3RyaW5nIjsKICAgIGNoYXIgICAgICAgICAgICpjb250ZXh0ID0gIkxVQ1MiOwoKCiAgICAvKgogICAgICogQ3JlYXRlIGFuIGV4YW1wbGUgQWdlbnRYIHBkdSBzdHJ1Y3R1cmUgCiAgICAgKi8KCiAgICBtZW1zZXQoJnBkdTEsIDAsIHNpemVvZihuZXRzbm1wX3BkdSkpOwogICAgcGR1MS5jb21tYW5kID0gQUdFTlRYX01TR19URVNUU0VUOwogICAgcGR1MS5mbGFncyA9IDA7CiAgICBwZHUxLnNlc3NpZCA9IDE2OwogICAgcGR1MS50cmFuc2lkID0gMjQ7CiAgICBwZHUxLnJlcWlkID0gMTMyOwoKICAgIHBkdTEudGltZSA9IDEwOwogICAgcGR1MS5ub25fcmVwZWF0ZXJzID0gMzsKICAgIHBkdTEubWF4X3JlcGV0aXRpb25zID0gMzI7CiAgICBwZHUxLnByaW9yaXR5ID0gNTsKICAgIHBkdTEucmFuZ2Vfc3ViaWQgPSAwOwoKICAgIHNubXBfcGR1X2FkZF92YXJpYWJsZSgmcGR1MSwgb2lkX2J1Ziwgc2l6ZW9mKG9pZF9idWYpIC8gc2l6ZW9mKG9pZCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgQVNOX09CSkVDVF9JRCwgKGNoYXIgKikgb2lkX2J1ZjIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKG9pZF9idWYyKSk7CiAgICBzbm1wX3BkdV9hZGRfdmFyaWFibGUoJnBkdTEsIG9pZF9idWYsIHNpemVvZihvaWRfYnVmKSAvIHNpemVvZihvaWQpLAogICAgICAgICAgICAgICAgICAgICAgICAgIEFTTl9JTlRFR0VSLCAoY2hhciAqKSAmcGR1MS5yZXFpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YocGR1MS5yZXFpZCkpOwogICAgc25tcF9wZHVfYWRkX3ZhcmlhYmxlKCZwZHUxLCBvaWRfYnVmLCBzaXplb2Yob2lkX2J1ZikgLyBzaXplb2Yob2lkKSwKICAgICAgICAgICAgICAgICAgICAgICAgICBBU05fT0NURVRfU1RSLCAoY2hhciAqKSBzdHJpbmcsIHN0cmxlbihzdHJpbmcpKTsKCiAgICBwcmludGYoIlRlc3Qgd2l0aCBub24tbmV0d29yayBvcmRlci4uLi4uXG4iKTsKICAgIHRlc3RpdCgmcGR1MSk7CgogICAgcHJpbnRmKCJcblRlc3Qgd2l0aCBuZXR3b3JrIG9yZGVyLi4uLi5cbiIpOwogICAgcGR1MS5mbGFncyB8PSBBR0VOVFhfRkxBR1NfTkVUV09SS19CWVRFX09SREVSOwogICAgdGVzdGl0KCZwZHUxKTsKCiAgICBwZHUxLmNvbW11bml0eSA9IGNvbnRleHQ7CiAgICBwZHUxLmNvbW11bml0eV9sZW4gPSBzdHJsZW4oY29udGV4dCk7CiAgICBwZHUxLmZsYWdzIHw9IEFHRU5UWF9GTEFHU19OT05fREVGQVVMVF9DT05URVhUOwogICAgcHJpbnRmKCJUZXN0IHdpdGggbm9uLWRlZmF1bHQgY29udGV4dC4uLi4uXG4iKTsKICAgIHRlc3RpdCgmcGR1MSk7CgoKfQojZW5kaWYKCi8qCiAqIHJldHVybnMgdGhlIHByb3BlciBsZW5ndGggb2YgYW4gaW5jb21pbmcgYWdlbnR4IHBhY2tldC4gCiAqLwovKgogKiAgICArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKwogKiAgICB8ICAgaC52ZXJzaW9uICAgfCAgICBoLnR5cGUgICAgIHwgICAgaC5mbGFncyAgICB8ICA8cmVzZXJ2ZWQ+ICAgfAogKiAgICArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKwogKiAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICBoLnNlc3Npb25JRCAgICAgICAgICAgICAgICAgICAgICAgICAgfAogKiAgICArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKwogKiAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgaC50cmFuc2FjdGlvbklEICAgICAgICAgICAgICAgICAgICAgICAgfAogKiAgICArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKwogKiAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICBoLnBhY2tldElEICAgICAgICAgICAgICAgICAgICAgICAgICAgfAogKiAgICArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKwogKiAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgaC5wYXlsb2FkX2xlbmd0aCAgICAgICAgICAgICAgICAgICAgICAgfAogKiAgICArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKwogKiAgICAyMCBieXRlcyBpbiBoZWFkZXIKICovCgppbnQKYWdlbnR4X2NoZWNrX3BhY2tldCh1X2NoYXIgKiBwYWNrZXQsIHNpemVfdCBwYWNrZXRfbGVuKQp7CgogICAgaWYgKHBhY2tldF9sZW4gPCAyMCkKICAgICAgICByZXR1cm4gMDsgICAgICAgICAgICAgICAvKiBtaW5pbXVtIGhlYWRlciBsZW5ndGggPT0gMjAgKi8KCiAgICByZXR1cm4gYWdlbnR4X3BhcnNlX2ludChwYWNrZXQgKyAxNiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICoocGFja2V0ICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMikgJiBBR0VOVFhfRkxBR1NfTkVUV09SS19CWVRFX09SREVSKSArIDIwOwp9Cg==