LyogUG9ydGlvbnMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29weXJpZ2h0KHMpLiAgU2VlCiAqIHRoZSBOZXQtU05NUCdzIENPUFlJTkcgZmlsZSBmb3IgbW9yZSBkZXRhaWxzIGFuZCBvdGhlciBjb3B5cmlnaHRzCiAqIHRoYXQgbWF5IGFwcGx5OgogKi8KLyoKICogUG9ydGlvbnMgb2YgdGhpcyBmaWxlIGFyZSBjb3B5cmlnaHRlZCBieToKICogQ29weXJpZ2h0IKkgMjAwMyBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAqIFVzZSBpcyBzdWJqZWN0IHRvIGxpY2Vuc2UgdGVybXMgc3BlY2lmaWVkIGluIHRoZSBDT1BZSU5HIGZpbGUKICogZGlzdHJpYnV0ZWQgd2l0aCB0aGUgTmV0LVNOTVAgcGFja2FnZS4KICovCgojaW5jbHVkZSA8bmV0LXNubXAvbmV0LXNubXAtY29uZmlnLmg+CgojaW5jbHVkZSA8c3RkaW8uaD4KI2luY2x1ZGUgPGVycm5vLmg+CiNpZiBIQVZFX1NURExJQl9ICiNpbmNsdWRlIDxzdGRsaWIuaD4KI2VuZGlmCiNpZiBIQVZFX1NUUklOR19ICiNpbmNsdWRlIDxzdHJpbmcuaD4KI2Vsc2UKI2luY2x1ZGUgPHN0cmluZ3MuaD4KI2VuZGlmCiNpZiBIQVZFX1VOSVNURF9ICiNpbmNsdWRlIDx1bmlzdGQuaD4KI2VuZGlmCiNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KI2lmIFRJTUVfV0lUSF9TWVNfVElNRQojIGlmZGVmIFdJTjMyCiMgIGluY2x1ZGUgPHN5cy90aW1lYi5oPgojIGVsc2UKIyAgaW5jbHVkZSA8c3lzL3RpbWUuaD4KIyBlbmRpZgojIGluY2x1ZGUgPHRpbWUuaD4KI2Vsc2UKIyBpZiBIQVZFX1NZU19USU1FX0gKIyAgaW5jbHVkZSA8c3lzL3RpbWUuaD4KIyBlbHNlCiMgIGluY2x1ZGUgPHRpbWUuaD4KIyBlbmRpZgojZW5kaWYKI2lmIEhBVkVfTkVUSU5FVF9JTl9ICiNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CiNlbmRpZgojaWYgSEFWRV9BUlBBX0lORVRfSAojaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CiNlbmRpZgoKI2lmIEhBVkVfV0lOU09DS19ICiNpbmNsdWRlIDx3aW5zb2NrLmg+CiNlbmRpZgoKI2luY2x1ZGUgPG5ldC1zbm1wL25ldC1zbm1wLWluY2x1ZGVzLmg+CgojaW5jbHVkZSAiYWdlbnR4L3Byb3RvY29sLmgiCgpjb25zdCBjaGFyICAgICAqCmFnZW50eF9jbWQodV9jaGFyIGNvZGUpCnsKICAgIHN3aXRjaCAoY29kZSkgewogICAgY2FzZSBBR0VOVFhfTVNHX09QRU46CiAgICAgICAgcmV0dXJuICJPcGVuIjsKICAgIGNhc2UgQUdFTlRYX01TR19DTE9TRToKICAgICAgICByZXR1cm4gIkNsb3NlIjsKICAgIGNhc2UgQUdFTlRYX01TR19SRUdJU1RFUjoKICAgICAgICByZXR1cm4gIlJlZ2lzdGVyIjsKICAgIGNhc2UgQUdFTlRYX01TR19VTlJFR0lTVEVSOgogICAgICAgIHJldHVybiAiVW5yZWdpc3RlciI7CiAgICBjYXNlIEFHRU5UWF9NU0dfR0VUOgogICAgICAgIHJldHVybiAiR2V0IjsKICAgIGNhc2UgQUdFTlRYX01TR19HRVRORVhUOgogICAgICAgIHJldHVybiAiR2V0IE5leHQiOwogICAgY2FzZSBBR0VOVFhfTVNHX0dFVEJVTEs6CiAgICAgICAgcmV0dXJuICJHZXQgQnVsayI7CiAgICBjYXNlIEFHRU5UWF9NU0dfVEVTVFNFVDoKICAgICAgICByZXR1cm4gIlRlc3QgU2V0IjsKICAgIGNhc2UgQUdFTlRYX01TR19DT01NSVRTRVQ6CiAgICAgICAgcmV0dXJuICJDb21taXQgU2V0IjsKICAgIGNhc2UgQUdFTlRYX01TR19VTkRPU0VUOgogICAgICAgIHJldHVybiAiVW5kbyBTZXQiOwogICAgY2FzZSBBR0VOVFhfTVNHX0NMRUFOVVBTRVQ6CiAgICAgICAgcmV0dXJuICJDbGVhbnVwIFNldCI7CiAgICBjYXNlIEFHRU5UWF9NU0dfTk9USUZZOgogICAgICAgIHJldHVybiAiTm90aWZ5IjsKICAgIGNhc2UgQUdFTlRYX01TR19QSU5HOgogICAgICAgIHJldHVybiAiUGluZyI7CiAgICBjYXNlIEFHRU5UWF9NU0dfSU5ERVhfQUxMT0NBVEU6CiAgICAgICAgcmV0dXJuICJJbmRleCBBbGxvY2F0ZSI7CiAgICBjYXNlIEFHRU5UWF9NU0dfSU5ERVhfREVBTExPQ0FURToKICAgICAgICByZXR1cm4gIkluZGV4IERlYWxsb2NhdGUiOwogICAgY2FzZSBBR0VOVFhfTVNHX0FERF9BR0VOVF9DQVBTOgogICAgICAgIHJldHVybiAiQWRkIEFnZW50IENhcHMiOwogICAgY2FzZSBBR0VOVFhfTVNHX1JFTU9WRV9BR0VOVF9DQVBTOgogICAgICAgIHJldHVybiAiUmVtb3ZlIEFnZW50IENhcHMiOwogICAgY2FzZSBBR0VOVFhfTVNHX1JFU1BPTlNFOgogICAgICAgIHJldHVybiAiUmVzcG9uc2UiOwogICAgZGVmYXVsdDoKICAgICAgICByZXR1cm4gIlVua25vd24iOwogICAgfQp9CgppbnQKYWdlbnR4X3JlYWxsb2NfYnVpbGRfaW50KHVfY2hhciAqKiBidWYsIHNpemVfdCAqIGJ1Zl9sZW4sIHNpemVfdCAqIG91dF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCB2YWx1ZSwgaW50IG5ldHdvcmtfb3JkZXIpCnsKICAgIHVuc2lnbmVkIGludCAgICBpdmFsdWUgPSB2YWx1ZTsKICAgIHNpemVfdCAgICAgICAgICBpbGVuID0gKm91dF9sZW47CiNpZmRlZiBXT1JEU19CSUdFTkRJQU4KICAgIHVuc2lnbmVkIGludCAgICBpID0gMDsKI2VuZGlmCgogICAgd2hpbGUgKCgqb3V0X2xlbiArIDQpID49ICpidWZfbGVuKSB7CiAgICAgICAgaWYgKCEoYWxsb3dfcmVhbGxvYyAmJiBzbm1wX3JlYWxsb2MoYnVmLCBidWZfbGVuKSkpIHsKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQogICAgfQoKICAgIGlmIChuZXR3b3JrX29yZGVyKSB7CiNpZm5kZWYgV09SRFNfQklHRU5ESUFOCiAgICAgICAgdmFsdWUgPSBudG9obCh2YWx1ZSk7CiNlbmRpZgogICAgICAgIG1lbW1vdmUoKCpidWYgKyAqb3V0X2xlbiksICZ2YWx1ZSwgNCk7CiAgICAgICAgKm91dF9sZW4gKz0gNDsKICAgIH0gZWxzZSB7CiNpZm5kZWYgV09SRFNfQklHRU5ESUFOCiAgICAgICAgbWVtbW92ZSgoKmJ1ZiArICpvdXRfbGVuKSwgJnZhbHVlLCA0KTsKICAgICAgICAqb3V0X2xlbiArPSA0OwojZWxzZQogICAgICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKICAgICAgICAgICAgKigqYnVmICsgKm91dF9sZW4pID0gKHVfY2hhcikgdmFsdWUgJiAweGZmOwogICAgICAgICAgICAoKm91dF9sZW4pKys7CiAgICAgICAgICAgIHZhbHVlID4+PSA4OwogICAgICAgIH0KI2VuZGlmCiAgICB9CiAgICBERUJVR0RVTVBTRVRVUCgic2VuZCIsICgqYnVmICsgaWxlbiksIDQpOwogICAgREVCVUdNU0coKCJkdW1wdl9zZW5kIiwgIiAgSW50ZWdlcjpcdCVsdSAoMHglLjJsWClcbiIsIGl2YWx1ZSwKICAgICAgICAgICAgICBpdmFsdWUpKTsKICAgIHJldHVybiAxOwp9Cgp2b2lkCmFnZW50eF9idWlsZF9pbnQodV9jaGFyICogYnVmcCwgdV9pbnQgdmFsdWUsIGludCBuZXR3b3JrX2J5dGVfb3JkZXIpCnsKICAgIHVfY2hhciAgICAgICAgICpvcmlnX2J1ZnAgPSBidWZwOwogICAgdV9pbnQgICAgICAgICAgIG9yaWdfdmFsID0gdmFsdWU7CgogICAgaWYgKG5ldHdvcmtfYnl0ZV9vcmRlcikgewojaWZuZGVmIFdPUkRTX0JJR0VORElBTgogICAgICAgIHZhbHVlID0gbnRvaGwodmFsdWUpOwojZW5kaWYKICAgICAgICBtZW1tb3ZlKGJ1ZnAsICZ2YWx1ZSwgNCk7CiAgICB9IGVsc2UgewojaWZuZGVmIFdPUkRTX0JJR0VORElBTgogICAgICAgIG1lbW1vdmUoYnVmcCwgJnZhbHVlLCA0KTsKI2Vsc2UKICAgICAgICAqYnVmcCA9ICh1X2NoYXIpIHZhbHVlICYgMHhmZjsKICAgICAgICB2YWx1ZSA+Pj0gODsKICAgICAgICBidWZwKys7CiAgICAgICAgKmJ1ZnAgPSAodV9jaGFyKSB2YWx1ZSAmIDB4ZmY7CiAgICAgICAgdmFsdWUgPj49IDg7CiAgICAgICAgYnVmcCsrOwogICAgICAgICpidWZwID0gKHVfY2hhcikgdmFsdWUgJiAweGZmOwogICAgICAgIHZhbHVlID4+PSA4OwogICAgICAgIGJ1ZnArKzsKICAgICAgICAqYnVmcCA9ICh1X2NoYXIpIHZhbHVlICYgMHhmZjsKI2VuZGlmCiAgICB9CiAgICBERUJVR0RVTVBTRVRVUCgic2VuZCIsIG9yaWdfYnVmcCwgNCk7CiAgICBERUJVR01TRygoImR1bXB2X3NlbmQiLCAiICBJbnRlZ2VyOlx0JWxkICgweCUuMlgpXG4iLCBvcmlnX3ZhbCwKICAgICAgICAgICAgICBvcmlnX3ZhbCkpOwp9CgppbnQKYWdlbnR4X3JlYWxsb2NfYnVpbGRfc2hvcnQodV9jaGFyICoqIGJ1Ziwgc2l6ZV90ICogYnVmX2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICogb3V0X2xlbiwgaW50IGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIHNob3J0IHZhbHVlLCBpbnQgbmV0d29ya19vcmRlcikKewogICAgdW5zaWduZWQgc2hvcnQgIGl2YWx1ZSA9IHZhbHVlOwogICAgc2l6ZV90ICAgICAgICAgIGlsZW4gPSAqb3V0X2xlbjsKI2lmZGVmIFdPUkRTX0JJR0VORElBTgogICAgdW5zaWduZWQgc2hvcnQgIGkgPSAwOwojZW5kaWYKCiAgICB3aGlsZSAoKCpvdXRfbGVuICsgMikgPj0gKmJ1Zl9sZW4pIHsKICAgICAgICBpZiAoIShhbGxvd19yZWFsbG9jICYmIHNubXBfcmVhbGxvYyhidWYsIGJ1Zl9sZW4pKSkgewogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CiAgICB9CgogICAgaWYgKG5ldHdvcmtfb3JkZXIpIHsKI2lmbmRlZiBXT1JEU19CSUdFTkRJQU4KICAgICAgICB2YWx1ZSA9IG50b2hzKHZhbHVlKTsKI2VuZGlmCiAgICAgICAgbWVtbW92ZSgoKmJ1ZiArICpvdXRfbGVuKSwgJnZhbHVlLCAyKTsKICAgICAgICAqb3V0X2xlbiArPSAyOwogICAgfSBlbHNlIHsKI2lmbmRlZiBXT1JEU19CSUdFTkRJQU4KICAgICAgICBtZW1tb3ZlKCgqYnVmICsgKm91dF9sZW4pLCAmdmFsdWUsIDIpOwogICAgICAgICpvdXRfbGVuICs9IDI7CiNlbHNlCiAgICAgICAgZm9yIChpID0gMDsgaSA8IDI7IGkrKykgewogICAgICAgICAgICAqKCpidWYgKyAqb3V0X2xlbikgPSAodV9jaGFyKSB2YWx1ZSAmIDB4ZmY7CiAgICAgICAgICAgICgqb3V0X2xlbikrKzsKICAgICAgICAgICAgdmFsdWUgPj49IDg7CiAgICAgICAgfQojZW5kaWYKICAgIH0KICAgIERFQlVHRFVNUFNFVFVQKCJzZW5kIiwgKCpidWYgKyBpbGVuKSwgMik7CiAgICBERUJVR01TRygoImR1bXB2X3NlbmQiLCAiICBTaG9ydDpcdCVodSAoMHglLjJoWClcbiIsIGl2YWx1ZSwgaXZhbHVlKSk7CiAgICByZXR1cm4gMTsKfQoKaW50CmFnZW50eF9yZWFsbG9jX2J1aWxkX29pZCh1X2NoYXIgKiogYnVmLCBzaXplX3QgKiBidWZfbGVuLCBzaXplX3QgKiBvdXRfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5jbHVzaXZlLCBvaWQgKiBuYW1lLCBzaXplX3QgbmFtZV9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbmV0d29ya19vcmRlcikKewogICAgc2l6ZV90ICAgICAgICAgIGlsZW4gPSAqb3V0X2xlbiwgaSA9IDA7CiAgICBpbnQgICAgICAgICAgICAgcHJlZml4ID0gMDsKCiAgICBERUJVR1BSSU5USU5ERU5UKCJkdW1wdl9zZW5kIik7CiAgICBERUJVR01TRygoImR1bXB2X3NlbmQiLCAiT0lEOiAiKSk7CiAgICBERUJVR01TR09JRCgoImR1bXB2X3NlbmQiLCBuYW1lLCBuYW1lX2xlbikpOwogICAgREVCVUdNU0coKCJkdW1wdl9zZW5kIiwgIlxuIikpOwoKICAgIC8qCiAgICAgKiBVcGRhdGVkIGNsYXJpZmljYXRpb24gZnJvbSB0aGUgQWdlbnRYIG1haWxpbmcgbGlzdC4KICAgICAqIFRoZSAibnVsbCBPYmplY3QgSWRlbnRpZmllciIgbWVudGlvbmVkIGluIFJGQyAyNDcxLAogICAgICogc2VjdGlvbiA1LjEgaXMgYSBzcGVjaWFsIHBsYWNlaG9sZGVyIHZhbHVlLCBhbmQKICAgICAqIHNob3VsZCBvbmx5IGJlIHVzZWQgd2hlbiBleHBsaWNpdGx5IG1lbnRpb25lZCBpbgogICAgICogdGhpcyBSRkMuICBJbiBwYXJ0aWN1bGFyLCBpdCBkb2VzICpub3QqIG1lYW4gezAsIDB9CiAgICAgKi8KICAgIGlmIChuYW1lX2xlbiA9PSAwKQogICAgICAgIGluY2x1c2l2ZSA9IDA7CgogICAgLyoKICAgICAqICdDb21wYWN0JyBpbnRlcm5ldCBPSURzIAogICAgICovCiAgICBpZiAobmFtZV9sZW4gPj0gNSAmJiAobmFtZVswXSA9PSAxICYmIG5hbWVbMV0gPT0gMyAmJgogICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVbMl0gPT0gNiAmJiBuYW1lWzNdID09IDEgJiYKICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lWzRdID4gMCAmJiBuYW1lWzRdIDwgMjU2KSkgewogICAgICAgIHByZWZpeCA9IG5hbWVbNF07CiAgICAgICAgbmFtZSArPSA1OwogICAgICAgIG5hbWVfbGVuIC09IDU7CiAgICB9CgogICAgd2hpbGUgKCgqb3V0X2xlbiArIDQgKyAoNCAqIG5hbWVfbGVuKSkgPj0gKmJ1Zl9sZW4pIHsKICAgICAgICBpZiAoIShhbGxvd19yZWFsbG9jICYmIHNubXBfcmVhbGxvYyhidWYsIGJ1Zl9sZW4pKSkgewogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CiAgICB9CgogICAgKigqYnVmICsgKm91dF9sZW4pID0gKHVfY2hhcikgbmFtZV9sZW47CiAgICAoKm91dF9sZW4pKys7CiAgICAqKCpidWYgKyAqb3V0X2xlbikgPSAodV9jaGFyKSBwcmVmaXg7CiAgICAoKm91dF9sZW4pKys7CiAgICAqKCpidWYgKyAqb3V0X2xlbikgPSAodV9jaGFyKSBpbmNsdXNpdmU7CiAgICAoKm91dF9sZW4pKys7CiAgICAqKCpidWYgKyAqb3V0X2xlbikgPSAodV9jaGFyKSAweDAwOwogICAgKCpvdXRfbGVuKSsrOwoKICAgIERFQlVHRFVNUEhFQURFUigic2VuZCIsICJPSUQgSGVhZGVyIik7CiAgICBERUJVR0RVTVBTRVRVUCgic2VuZCIsICgqYnVmICsgaWxlbiksIDQpOwogICAgREVCVUdNU0coKCJkdW1wdl9zZW5kIiwgIiAgIyBzdWJpZHM6XHQlZCAoMHglLjJYKVxuIiwgbmFtZV9sZW4sCiAgICAgICAgICAgICAgbmFtZV9sZW4pKTsKICAgIERFQlVHUFJJTlRJTkRFTlQoImR1bXB2X3NlbmQiKTsKICAgIERFQlVHTVNHKCgiZHVtcHZfc2VuZCIsICIgIHByZWZpeDpcdCVkICgweCUuMlgpXG4iLCBwcmVmaXgsIHByZWZpeCkpOwogICAgREVCVUdQUklOVElOREVOVCgiZHVtcHZfc2VuZCIpOwogICAgREVCVUdNU0coKCJkdW1wdl9zZW5kIiwgIiAgaW5jbHVzaXZlOlx0JWQgKDB4JS4yWClcbiIsIGluY2x1c2l2ZSwKICAgICAgICAgICAgICBpbmNsdXNpdmUpKTsKICAgIERFQlVHSU5ERU5UTEVTUygpOwogICAgREVCVUdEVU1QSEVBREVSKCJzZW5kIiwgIk9JRCBTZWdtZW50cyIpOwoKICAgIGZvciAoaSA9IDA7IGkgPCBuYW1lX2xlbjsgaSsrKSB7CiAgICAgICAgaWYgKCFhZ2VudHhfcmVhbGxvY19idWlsZF9pbnQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVbaV0sIG5ldHdvcmtfb3JkZXIpKSB7CiAgICAgICAgICAgIERFQlVHSU5ERU5UTEVTUygpOwogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CiAgICB9CiAgICBERUJVR0lOREVOVExFU1MoKTsKCiAgICByZXR1cm4gMTsKfQoKaW50CmFnZW50eF9yZWFsbG9jX2J1aWxkX3N0cmluZyh1X2NoYXIgKiogYnVmLCBzaXplX3QgKiBidWZfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICogb3V0X2xlbiwgaW50IGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1X2NoYXIgKiBzdHJpbmcsIHNpemVfdCBzdHJpbmdfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5ldHdvcmtfb3JkZXIpCnsKICAgIHNpemVfdCAgICAgICAgICBpbGVuID0gKm91dF9sZW4sIGkgPSAwOwoKICAgIHdoaWxlICgoKm91dF9sZW4gKyA0ICsgKDQgKiAoKHN0cmluZ19sZW4gKyAzKSAvIDQpKSkgPj0gKmJ1Zl9sZW4pIHsKICAgICAgICBpZiAoIShhbGxvd19yZWFsbG9jICYmIHNubXBfcmVhbGxvYyhidWYsIGJ1Zl9sZW4pKSkgewogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CiAgICB9CgogICAgREVCVUdEVU1QSEVBREVSKCJzZW5kIiwgIkJ1aWxkIFN0cmluZyIpOwogICAgREVCVUdEVU1QSEVBREVSKCJzZW5kIiwgImxlbmd0aCIpOwogICAgaWYgKCFhZ2VudHhfcmVhbGxvY19idWlsZF9pbnQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nX2xlbiwgbmV0d29ya19vcmRlcikpIHsKICAgICAgICBERUJVR0lOREVOVExFU1MoKTsKICAgICAgICBERUJVR0lOREVOVExFU1MoKTsKICAgICAgICByZXR1cm4gMDsKICAgIH0KCiAgICBpZiAoc3RyaW5nX2xlbiA9PSAwKSB7CiAgICAgICAgREVCVUdNU0coKCJkdW1wdl9zZW5kIiwgIiAgU3RyaW5nOiA8ZW1wdHk+XG4iKSk7CiAgICAgICAgREVCVUdJTkRFTlRMRVNTKCk7CiAgICAgICAgREVCVUdJTkRFTlRMRVNTKCk7CiAgICAgICAgcmV0dXJuIDE7CiAgICB9CgogICAgbWVtbW92ZSgoKmJ1ZiArICpvdXRfbGVuKSwgc3RyaW5nLCBzdHJpbmdfbGVuKTsKICAgICpvdXRfbGVuICs9IHN0cmluZ19sZW47CgogICAgLyoKICAgICAqIFBhZCB0byBhIG11bHRpcGxlIG9mIDQgYnl0ZXMgaWYgbmVjZXNzYXJ5IChwZXIgUkZDIDI3NDEpLiAgCiAgICAgKi8KCiAgICBpZiAoc3RyaW5nX2xlbiAlIDQgIT0gMCkgewogICAgICAgIGZvciAoaSA9IDA7IGkgPCA0IC0gKHN0cmluZ19sZW4gJSA0KTsgaSsrKSB7CiAgICAgICAgICAgICooKmJ1ZiArICpvdXRfbGVuKSA9IDA7CiAgICAgICAgICAgICgqb3V0X2xlbikrKzsKICAgICAgICB9CiAgICB9CgogICAgREVCVUdEVU1QU0VUVVAoInNlbmQiLCAoKmJ1ZiArIGlsZW4gKyA0KSwgKChzdHJpbmdfbGVuICsgMykgLyA0KSAqIDQpOwogICAgREVCVUdNU0coKCJkdW1wdl9zZW5kIiwgIiAgU3RyaW5nOlx0JXNcbiIsIHN0cmluZykpOwogICAgREVCVUdJTkRFTlRMRVNTKCk7CiAgICBERUJVR0lOREVOVExFU1MoKTsKICAgIHJldHVybiAxOwp9CgojaWZkZWYgTkVUU05NUF9XSVRIX09QQVFVRV9TUEVDSUFMX1RZUEVTCmludAphZ2VudHhfcmVhbGxvY19idWlsZF9kb3VibGUodV9jaGFyICoqIGJ1Ziwgc2l6ZV90ICogYnVmX2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAqIG91dF9sZW4sIGludCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGRvdWJsZV92YWwsIGludCBuZXR3b3JrX29yZGVyKQp7CiAgICB1bmlvbiB7CiAgICAgICAgZG91YmxlICAgICAgICAgIGRvdWJsZVZhbDsKICAgICAgICBpbnQgICAgICAgICAgICAgaW50VmFsWzJdOwogICAgICAgIGNoYXIgICAgICAgICAgICBjW3NpemVvZihkb3VibGUpXTsKICAgIH0gZHU7CiAgICBpbnQgICAgICAgICAgICAgdG1wOwogICAgdV9jaGFyICAgICAgICAgIG9wYXF1ZV9idWZmZXJbMyArIHNpemVvZihkb3VibGUpXTsKCiAgICBvcGFxdWVfYnVmZmVyWzBdID0gQVNOX09QQVFVRV9UQUcxOwogICAgb3BhcXVlX2J1ZmZlclsxXSA9IEFTTl9PUEFRVUVfRE9VQkxFOwogICAgb3BhcXVlX2J1ZmZlclsyXSA9IHNpemVvZihkb3VibGUpOwoKICAgIGR1LmRvdWJsZVZhbCA9IGRvdWJsZV92YWw7CiAgICB0bXAgPSBodG9ubChkdS5pbnRWYWxbMF0pOwogICAgZHUuaW50VmFsWzBdID0gaHRvbmwoZHUuaW50VmFsWzFdKTsKICAgIGR1LmludFZhbFsxXSA9IHRtcDsKICAgIG1lbWNweSgmb3BhcXVlX2J1ZmZlclszXSwgJmR1LmNbMF0sIHNpemVvZihkb3VibGUpKTsKCiAgICByZXR1cm4gYWdlbnR4X3JlYWxsb2NfYnVpbGRfc3RyaW5nKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dfcmVhbGxvYywgb3BhcXVlX2J1ZmZlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMyArIHNpemVvZihkb3VibGUpLCBuZXR3b3JrX29yZGVyKTsKfQoKaW50CmFnZW50eF9yZWFsbG9jX2J1aWxkX2Zsb2F0KHVfY2hhciAqKiBidWYsIHNpemVfdCAqIGJ1Zl9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAqIG91dF9sZW4sIGludCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBmbG9hdF92YWwsIGludCBuZXR3b3JrX29yZGVyKQp7CiAgICB1bmlvbiB7CiAgICAgICAgZmxvYXQgICAgICAgICAgIGZsb2F0VmFsOwogICAgICAgIGludCAgICAgICAgICAgICBpbnRWYWw7CiAgICAgICAgY2hhciAgICAgICAgICAgIGNbc2l6ZW9mKGZsb2F0KV07CiAgICB9IGZ1OwogICAgdV9jaGFyICAgICAgICAgIG9wYXF1ZV9idWZmZXJbMyArIHNpemVvZihmbG9hdCldOwoKICAgIG9wYXF1ZV9idWZmZXJbMF0gPSBBU05fT1BBUVVFX1RBRzE7CiAgICBvcGFxdWVfYnVmZmVyWzFdID0gQVNOX09QQVFVRV9GTE9BVDsKICAgIG9wYXF1ZV9idWZmZXJbMl0gPSBzaXplb2YoZmxvYXQpOwoKICAgIGZ1LmZsb2F0VmFsID0gZmxvYXRfdmFsOwogICAgZnUuaW50VmFsID0gaHRvbmwoZnUuaW50VmFsKTsKICAgIG1lbWNweSgmb3BhcXVlX2J1ZmZlclszXSwgJmZ1LmNbMF0sIHNpemVvZihmbG9hdCkpOwoKICAgIHJldHVybiBhZ2VudHhfcmVhbGxvY19idWlsZF9zdHJpbmcoYnVmLCBidWZfbGVuLCBvdXRfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd19yZWFsbG9jLCBvcGFxdWVfYnVmZmVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzICsgc2l6ZW9mKGZsb2F0KSwgbmV0d29ya19vcmRlcik7Cn0KI2VuZGlmCgppbnQKYWdlbnR4X3JlYWxsb2NfYnVpbGRfdmFyYmluZCh1X2NoYXIgKiogYnVmLCBzaXplX3QgKiBidWZfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAqIG91dF9sZW4sIGludCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldHNubXBfdmFyaWFibGVfbGlzdCAqIHZwLCBpbnQgbmV0d29ya19vcmRlcikKewogICAgREVCVUdEVU1QSEVBREVSKCJzZW5kIiwgIlZhckJpbmQiKTsKICAgIERFQlVHRFVNUEhFQURFUigic2VuZCIsICJ0eXBlIik7CiNpZmRlZiBORVRTTk1QX1dJVEhfT1BBUVVFX1NQRUNJQUxfVFlQRVMKICAgIGlmICgodnAtPnR5cGUgPT0gQVNOX09QQVFVRV9GTE9BVCkgfHwgKHZwLT50eXBlID09IEFTTl9PUEFRVUVfRE9VQkxFKQogICAgICAgIHx8ICh2cC0+dHlwZSA9PSBBU05fT1BBUVVFX0k2NCkgfHwgKHZwLT50eXBlID09IEFTTl9PUEFRVUVfVTY0KQogICAgICAgIHx8ICh2cC0+dHlwZSA9PSBBU05fT1BBUVVFX0NPVU5URVI2NCkpIHsKICAgICAgICBpZiAoIWFnZW50eF9yZWFsbG9jX2J1aWxkX3Nob3J0CiAgICAgICAgICAgIChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAodW5zaWduZWQgc2hvcnQpIEFTTl9PUEFRVUUsIG5ldHdvcmtfb3JkZXIpKSB7CiAgICAgICAgICAgIERFQlVHSU5ERU5UTEVTUygpOwogICAgICAgICAgICBERUJVR0lOREVOVExFU1MoKTsKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQogICAgfSBlbHNlCiNlbmRpZgogICAgaWYgKHZwLT50eXBlID09IEFTTl9QUklWX0lOQ0xfUkFOR0UgfHwgdnAtPnR5cGUgPT0gQVNOX1BSSVZfRVhDTF9SQU5HRSkgewogICAgICAgIGlmICghYWdlbnR4X3JlYWxsb2NfYnVpbGRfc2hvcnQKICAgICAgICAgICAgKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICh1bnNpZ25lZCBzaG9ydCkgQVNOX09CSkVDVF9JRCwgbmV0d29ya19vcmRlcikpIHsKICAgICAgICAgICAgREVCVUdJTkRFTlRMRVNTKCk7CiAgICAgICAgICAgIERFQlVHSU5ERU5UTEVTUygpOwogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CiAgICB9IGVsc2UgewogICAgICAgIGlmICghYWdlbnR4X3JlYWxsb2NfYnVpbGRfc2hvcnQKICAgICAgICAgICAgKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICh1bnNpZ25lZCBzaG9ydCkgdnAtPnR5cGUsIG5ldHdvcmtfb3JkZXIpKSB7CiAgICAgICAgICAgIERFQlVHSU5ERU5UTEVTUygpOwogICAgICAgICAgICBERUJVR0lOREVOVExFU1MoKTsKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQogICAgfQoKICAgIHdoaWxlICgoKm91dF9sZW4gKyAyKSA+PSAqYnVmX2xlbikgewogICAgICAgIGlmICghKGFsbG93X3JlYWxsb2MgJiYgc25tcF9yZWFsbG9jKGJ1ZiwgYnVmX2xlbikpKSB7CiAgICAgICAgICAgIERFQlVHSU5ERU5UTEVTUygpOwogICAgICAgICAgICBERUJVR0lOREVOVExFU1MoKTsKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQogICAgfQoKICAgICooKmJ1ZiArICpvdXRfbGVuKSA9IDA7CiAgICAoKm91dF9sZW4pKys7CiAgICAqKCpidWYgKyAqb3V0X2xlbikgPSAwOwogICAgKCpvdXRfbGVuKSsrOwogICAgREVCVUdJTkRFTlRMRVNTKCk7CgogICAgREVCVUdEVU1QSEVBREVSKCJzZW5kIiwgIm5hbWUiKTsKICAgIGlmICghYWdlbnR4X3JlYWxsb2NfYnVpbGRfb2lkKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZwLT5uYW1lLCB2cC0+bmFtZV9sZW5ndGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXR3b3JrX29yZGVyKSkgewogICAgICAgIERFQlVHSU5ERU5UTEVTUygpOwogICAgICAgIHJldHVybiAwOwogICAgfQogICAgREVCVUdJTkRFTlRMRVNTKCk7CgogICAgREVCVUdEVU1QSEVBREVSKCJzZW5kIiwgInZhbHVlIik7CiAgICBzd2l0Y2ggKHZwLT50eXBlKSB7CgogICAgY2FzZSBBU05fSU5URUdFUjoKICAgIGNhc2UgQVNOX0NPVU5URVI6CiAgICBjYXNlIEFTTl9HQVVHRToKICAgIGNhc2UgQVNOX1RJTUVUSUNLUzoKICAgIGNhc2UgQVNOX1VJTlRFR0VSOgogICAgICAgIGlmICghYWdlbnR4X3JlYWxsb2NfYnVpbGRfaW50KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKHZwLT52YWwuaW50ZWdlciksIG5ldHdvcmtfb3JkZXIpKSB7CiAgICAgICAgICAgIERFQlVHSU5ERU5UTEVTUygpOwogICAgICAgICAgICBERUJVR0lOREVOVExFU1MoKTsKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQogICAgICAgIGJyZWFrOwoKI2lmZGVmIE5FVFNOTVBfV0lUSF9PUEFRVUVfU1BFQ0lBTF9UWVBFUwogICAgY2FzZSBBU05fT1BBUVVFX0ZMT0FUOgogICAgICAgIERFQlVHRFVNUEhFQURFUigic2VuZCIsICJCdWlsZCBPcGFxdWUgRmxvYXQiKTsKICAgICAgICBERUJVR1BSSU5USU5ERU5UKCJkdW1wdl9zZW5kIik7CiAgICAgICAgREVCVUdNU0coKCJkdW1wdl9zZW5kIiwgIiAgRmxvYXQ6XHQlZlxuIiwgKih2cC0+dmFsLmZsb2F0VmFsKSkpOwogICAgICAgIGlmICghYWdlbnR4X3JlYWxsb2NfYnVpbGRfZmxvYXQKICAgICAgICAgICAgKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgKih2cC0+dmFsLmZsb2F0VmFsKSwKICAgICAgICAgICAgIG5ldHdvcmtfb3JkZXIpKSB7CiAgICAgICAgICAgIERFQlVHSU5ERU5UTEVTUygpOwogICAgICAgICAgICBERUJVR0lOREVOVExFU1MoKTsKICAgICAgICAgICAgREVCVUdJTkRFTlRMRVNTKCk7CiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KICAgICAgICBERUJVR0lOREVOVExFU1MoKTsKICAgICAgICBicmVhazsKCiAgICBjYXNlIEFTTl9PUEFRVUVfRE9VQkxFOgogICAgICAgIERFQlVHRFVNUEhFQURFUigic2VuZCIsICJCdWlsZCBPcGFxdWUgRG91YmxlIik7CiAgICAgICAgREVCVUdQUklOVElOREVOVCgiZHVtcHZfc2VuZCIpOwogICAgICAgIERFQlVHTVNHKCgiZHVtcHZfc2VuZCIsICIgIERvdWJsZTpcdCVsZlxuIiwgKih2cC0+dmFsLmRvdWJsZVZhbCkpKTsKICAgICAgICBpZiAoIWFnZW50eF9yZWFsbG9jX2J1aWxkX2RvdWJsZQogICAgICAgICAgICAoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCAqKHZwLT52YWwuZG91YmxlVmFsKSwKICAgICAgICAgICAgIG5ldHdvcmtfb3JkZXIpKSB7CiAgICAgICAgICAgIERFQlVHSU5ERU5UTEVTUygpOwogICAgICAgICAgICBERUJVR0lOREVOVExFU1MoKTsKICAgICAgICAgICAgREVCVUdJTkRFTlRMRVNTKCk7CiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KICAgICAgICBERUJVR0lOREVOVExFU1MoKTsKICAgICAgICBicmVhazsKCiAgICBjYXNlIEFTTl9PUEFRVUVfSTY0OgogICAgY2FzZSBBU05fT1BBUVVFX1U2NDoKICAgIGNhc2UgQVNOX09QQVFVRV9DT1VOVEVSNjQ6CiAgICAgICAgLyoKICAgICAgICAgKiBYWFggLSBUT0RPIC0gZW5jb2RlIGFzIHJhdyBPUEFRVUUgZm9yIG5vdyAoc28gZmFsbCB0aHJvdWdoCiAgICAgICAgICogaGVyZSkuICAKICAgICAgICAgKi8KI2VuZGlmCgogICAgY2FzZSBBU05fT0NURVRfU1RSOgogICAgY2FzZSBBU05fSVBBRERSRVNTOgogICAgY2FzZSBBU05fT1BBUVVFOgogICAgICAgIGlmICghYWdlbnR4X3JlYWxsb2NfYnVpbGRfc3RyaW5nCiAgICAgICAgICAgIChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsIHZwLT52YWwuc3RyaW5nLAogICAgICAgICAgICAgdnAtPnZhbF9sZW4sIG5ldHdvcmtfb3JkZXIpKSB7CiAgICAgICAgICAgIERFQlVHSU5ERU5UTEVTUygpOwogICAgICAgICAgICBERUJVR0lOREVOVExFU1MoKTsKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQogICAgICAgIGJyZWFrOwoKICAgIGNhc2UgQVNOX09CSkVDVF9JRDoKICAgIGNhc2UgQVNOX1BSSVZfRVhDTF9SQU5HRToKICAgIGNhc2UgQVNOX1BSSVZfSU5DTF9SQU5HRToKICAgICAgICBpZiAoIWFnZW50eF9yZWFsbG9jX2J1aWxkX29pZAogICAgICAgICAgICAoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCAxLCB2cC0+dmFsLm9iamlkLAogICAgICAgICAgICAgdnAtPnZhbF9sZW4gLyBzaXplb2Yob2lkKSwgbmV0d29ya19vcmRlcikpIHsKICAgICAgICAgICAgREVCVUdJTkRFTlRMRVNTKCk7CiAgICAgICAgICAgIERFQlVHSU5ERU5UTEVTUygpOwogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CiAgICAgICAgYnJlYWs7CgogICAgY2FzZSBBU05fQ09VTlRFUjY0OgogICAgICAgIGlmIChuZXR3b3JrX29yZGVyKSB7CiAgICAgICAgICAgIERFQlVHRFVNUEhFQURFUigic2VuZCIsICJCdWlsZCBDb3VudGVyNjQgKGhpZ2gsIGxvdykiKTsKICAgICAgICAgICAgaWYgKCFhZ2VudHhfcmVhbGxvY19idWlsZF9pbnQKICAgICAgICAgICAgICAgIChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgdnAtPnZhbC5jb3VudGVyNjQtPmhpZ2gsIG5ldHdvcmtfb3JkZXIpCiAgICAgICAgICAgICAgICB8fCAhYWdlbnR4X3JlYWxsb2NfYnVpbGRfaW50KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdnAtPnZhbC5jb3VudGVyNjQtPmxvdywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV0d29ya19vcmRlcikpIHsKICAgICAgICAgICAgICAgIERFQlVHSU5ERU5UTEVTUygpOwogICAgICAgICAgICAgICAgREVCVUdJTkRFTlRMRVNTKCk7CiAgICAgICAgICAgICAgICBERUJVR0lOREVOVExFU1MoKTsKICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgREVCVUdEVU1QSEVBREVSKCJzZW5kIiwgIkJ1aWxkIENvdW50ZXI2NCAobG93LCBoaWdoKSIpOwogICAgICAgICAgICBpZiAoIWFnZW50eF9yZWFsbG9jX2J1aWxkX2ludAogICAgICAgICAgICAgICAgKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICB2cC0+dmFsLmNvdW50ZXI2NC0+bG93LCBuZXR3b3JrX29yZGVyKQogICAgICAgICAgICAgICAgfHwgIWFnZW50eF9yZWFsbG9jX2J1aWxkX2ludChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZwLT52YWwuY291bnRlcjY0LT5oaWdoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXR3b3JrX29yZGVyKSkgewogICAgICAgICAgICAgICAgREVCVUdJTkRFTlRMRVNTKCk7CiAgICAgICAgICAgICAgICBERUJVR0lOREVOVExFU1MoKTsKICAgICAgICAgICAgICAgIERFQlVHSU5ERU5UTEVTUygpOwogICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgYnJlYWs7CgogICAgY2FzZSBBU05fTlVMTDoKICAgIGNhc2UgU05NUF9OT1NVQ0hPQkpFQ1Q6CiAgICBjYXNlIFNOTVBfTk9TVUNISU5TVEFOQ0U6CiAgICBjYXNlIFNOTVBfRU5ET0ZNSUJWSUVXOgogICAgICAgIGJyZWFrOwoKICAgIGRlZmF1bHQ6CiAgICAgICAgREVCVUdNU0dUTCgoImFnZW50eF9idWlsZF92YXJiaW5kIiwgInVua25vd24gdHlwZSAlZCAoMHglMDJ4KVxuIiwKICAgICAgICAgICAgICAgICAgICB2cC0+dHlwZSwgdnAtPnR5cGUpKTsKICAgICAgICBERUJVR0lOREVOVExFU1MoKTsKICAgICAgICBERUJVR0lOREVOVExFU1MoKTsKICAgICAgICByZXR1cm4gMDsKICAgIH0KICAgIERFQlVHSU5ERU5UTEVTUygpOwogICAgREVCVUdJTkRFTlRMRVNTKCk7CiAgICByZXR1cm4gMTsKfQoKaW50CmFnZW50eF9yZWFsbG9jX2J1aWxkX2hlYWRlcih1X2NoYXIgKiogYnVmLCBzaXplX3QgKiBidWZfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICogb3V0X2xlbiwgaW50IGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXRzbm1wX3BkdSAqcGR1KQp7CiAgICBzaXplX3QgICAgICAgICAgaWxlbiA9ICpvdXRfbGVuOwogICAgY29uc3QgaW50ICAgICAgIG5ldHdvcmtfb3JkZXIgPQogICAgICAgIHBkdS0+ZmxhZ3MgJiBBR0VOVFhfRkxBR1NfTkVUV09SS19CWVRFX09SREVSOwoKICAgIHdoaWxlICgoKm91dF9sZW4gKyA0KSA+PSAqYnVmX2xlbikgewogICAgICAgIGlmICghKGFsbG93X3JlYWxsb2MgJiYgc25tcF9yZWFsbG9jKGJ1ZiwgYnVmX2xlbikpKSB7CiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KICAgIH0KCiAgICAvKgogICAgICogRmlyc3QgNCBieXRlcyBhcmUgdmVyc2lvbiwgcGR1IHR5cGUsIGZsYWdzLCBhbmQgYSAwIHJlc2VydmVkIGJ5dGUuICAKICAgICAqLwoKICAgICooKmJ1ZiArICpvdXRfbGVuKSA9IDE7CiAgICAoKm91dF9sZW4pKys7CiAgICAqKCpidWYgKyAqb3V0X2xlbikgPSBwZHUtPmNvbW1hbmQ7CiAgICAoKm91dF9sZW4pKys7CiAgICAqKCpidWYgKyAqb3V0X2xlbikgPSAodV9jaGFyKSAocGR1LT5mbGFncyAmIEFHRU5UWF9NU0dfRkxBR1NfTUFTSyk7CiAgICAoKm91dF9sZW4pKys7CiAgICAqKCpidWYgKyAqb3V0X2xlbikgPSAwOwogICAgKCpvdXRfbGVuKSsrOwoKICAgIERFQlVHRFVNUEhFQURFUigic2VuZCIsICJBZ2VudFggSGVhZGVyIik7CiAgICBERUJVR0RVTVBTRVRVUCgic2VuZCIsICgqYnVmICsgaWxlbiksIDQpOwogICAgREVCVUdNU0coKCJkdW1wdl9zZW5kIiwgIiAgVmVyc2lvbjpcdCVkXG4iLCAoaW50KSAqKCpidWYgKyBpbGVuKSkpOwogICAgREVCVUdQUklOVElOREVOVCgiZHVtcHZfc2VuZCIpOwogICAgREVCVUdNU0coKCJkdW1wdl9zZW5kIiwgIiAgQ29tbWFuZDpcdCVkICglcylcbiIsIHBkdS0+Y29tbWFuZCwKICAgICAgICAgICAgICBhZ2VudHhfY21kKCh1X2NoYXIpcGR1LT5jb21tYW5kKSkpOwogICAgREVCVUdQUklOVElOREVOVCgiZHVtcHZfc2VuZCIpOwogICAgREVCVUdNU0coKCJkdW1wdl9zZW5kIiwgIiAgRmxhZ3M6XHQlMDJ4XG4iLCAoaW50KSAqKCpidWYgKyBpbGVuICsgMikpKTsKCiAgICBERUJVR0RVTVBIRUFERVIoInNlbmQiLCAiU2Vzc2lvbiBJRCIpOwogICAgaWYgKCFhZ2VudHhfcmVhbGxvY19idWlsZF9pbnQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGR1LT5zZXNzaWQsIG5ldHdvcmtfb3JkZXIpKSB7CiAgICAgICAgREVCVUdJTkRFTlRMRVNTKCk7CiAgICAgICAgREVCVUdJTkRFTlRMRVNTKCk7CiAgICAgICAgcmV0dXJuIDA7CiAgICB9CiAgICBERUJVR0lOREVOVExFU1MoKTsKCiAgICBERUJVR0RVTVBIRUFERVIoInNlbmQiLCAiVHJhbnNhY3Rpb24gSUQiKTsKICAgIGlmICghYWdlbnR4X3JlYWxsb2NfYnVpbGRfaW50KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBkdS0+dHJhbnNpZCwgbmV0d29ya19vcmRlcikpIHsKICAgICAgICBERUJVR0lOREVOVExFU1MoKTsKICAgICAgICBERUJVR0lOREVOVExFU1MoKTsKICAgICAgICByZXR1cm4gMDsKICAgIH0KICAgIERFQlVHSU5ERU5UTEVTUygpOwoKICAgIERFQlVHRFVNUEhFQURFUigic2VuZCIsICJSZXF1ZXN0IElEIik7CiAgICBpZiAoIWFnZW50eF9yZWFsbG9jX2J1aWxkX2ludChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZHUtPnJlcWlkLCBuZXR3b3JrX29yZGVyKSkgewogICAgICAgIERFQlVHSU5ERU5UTEVTUygpOwogICAgICAgIERFQlVHSU5ERU5UTEVTUygpOwogICAgICAgIHJldHVybiAwOwogICAgfQogICAgREVCVUdJTkRFTlRMRVNTKCk7CgogICAgREVCVUdEVU1QSEVBREVSKCJzZW5kIiwgIkR1bW15IExlbmd0aCA6LSgiKTsKICAgIGlmICghYWdlbnR4X3JlYWxsb2NfYnVpbGRfaW50KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIG5ldHdvcmtfb3JkZXIpKSB7CiAgICAgICAgREVCVUdJTkRFTlRMRVNTKCk7CiAgICAgICAgREVCVUdJTkRFTlRMRVNTKCk7CiAgICAgICAgcmV0dXJuIDA7CiAgICB9CiAgICBERUJVR0lOREVOVExFU1MoKTsKCiAgICBpZiAocGR1LT5mbGFncyAmIEFHRU5UWF9NU0dfRkxBR19OT05fREVGQVVMVF9DT05URVhUKSB7CiAgICAgICAgREVCVUdEVU1QSEVBREVSKCJzZW5kIiwgIkNvbW11bml0eSIpOwogICAgICAgIGlmICghYWdlbnR4X3JlYWxsb2NfYnVpbGRfc3RyaW5nCiAgICAgICAgICAgIChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsIHBkdS0+Y29tbXVuaXR5LAogICAgICAgICAgICAgcGR1LT5jb21tdW5pdHlfbGVuLCBuZXR3b3JrX29yZGVyKSkgewogICAgICAgICAgICBERUJVR0lOREVOVExFU1MoKTsKICAgICAgICAgICAgREVCVUdJTkRFTlRMRVNTKCk7CiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KICAgICAgICBERUJVR0lOREVOVExFU1MoKTsKICAgIH0KCiAgICBERUJVR0lOREVOVExFU1MoKTsKICAgIHJldHVybiAxOwp9CgpzdGF0aWMgaW50Cl9hZ2VudHhfcmVhbGxvY19idWlsZCh1X2NoYXIgKiogYnVmLCBzaXplX3QgKiBidWZfbGVuLCBzaXplX3QgKiBvdXRfbGVuLAogICAgICAgICAgICAgICAgICAgICAgaW50IGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICBuZXRzbm1wX3Nlc3Npb24gKiBzZXNzaW9uLCBuZXRzbm1wX3BkdSAqcGR1KQp7CiAgICBzaXplX3QgICAgICAgICAgaWxlbiA9ICpvdXRfbGVuOwogICAgbmV0c25tcF92YXJpYWJsZV9saXN0ICp2cDsKICAgIGludCAgICAgICAgICAgICBpbmMsIGkgPSAwOwogICAgY29uc3QgaW50ICAgICAgIG5ldHdvcmtfb3JkZXIgPQogICAgICAgIHBkdS0+ZmxhZ3MgJiBBR0VOVFhfRkxBR1NfTkVUV09SS19CWVRFX09SREVSOwoKICAgIHNlc3Npb24tPnNfc25tcF9lcnJubyA9IDA7CiAgICBzZXNzaW9uLT5zX2Vycm5vID0gMDsKCiAgICAvKgogICAgICogVmFyaW91cyBQRFUgdHlwZXMgZG9uJ3QgaW5jbHVkZSBjb250ZXh0IGluZm9ybWF0aW9uIChSRkMgMjc0MSwgcC4gMjApLiAKICAgICAqLwogICAgc3dpdGNoIChwZHUtPmNvbW1hbmQpIHsKICAgIGNhc2UgQUdFTlRYX01TR19PUEVOOgogICAgY2FzZSBBR0VOVFhfTVNHX0NMT1NFOgogICAgY2FzZSBBR0VOVFhfTVNHX1JFU1BPTlNFOgogICAgY2FzZSBBR0VOVFhfTVNHX0NPTU1JVFNFVDoKICAgIGNhc2UgQUdFTlRYX01TR19VTkRPU0VUOgogICAgY2FzZSBBR0VOVFhfTVNHX0NMRUFOVVBTRVQ6CiAgICAgICAgcGR1LT5mbGFncyAmPSB+KEFHRU5UWF9NU0dfRkxBR19OT05fREVGQVVMVF9DT05URVhUKTsKICAgIH0KCiAgICAvKgogICAgICogQnVpbGQgdGhlIGhlYWRlciAoYW5kIGNvbnRleHQgaWYgYXBwcm9wcmlhdGUpLiAgCiAgICAgKi8KICAgIGlmICghYWdlbnR4X3JlYWxsb2NfYnVpbGRfaGVhZGVyCiAgICAgICAgKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgcGR1KSkgewogICAgICAgIHJldHVybiAwOwogICAgfQoKICAgIC8qCiAgICAgKiBFdmVyeXRoaW5nIGNhdXNlcyBhIHJlc3BvbnNlLCBleGNlcHQgZm9yIGFnZW50eC1SZXNwb25zZS1QRFUgYW5kCiAgICAgKiBhZ2VudHgtQ2xlYW51cFNldC1QRFUuICAKICAgICAqLwoKICAgIHBkdS0+ZmxhZ3MgfD0gVUNEX01TR19GTEFHX0VYUEVDVF9SRVNQT05TRTsKCiAgICBERUJVR0RVTVBIRUFERVIoInNlbmQiLCAiQWdlbnRYIFBheWxvYWQiKTsKICAgIHN3aXRjaCAocGR1LT5jb21tYW5kKSB7CgogICAgY2FzZSBBR0VOVFhfTVNHX09QRU46CiAgICAgICAgLyoKICAgICAgICAgKiBUaW1lb3V0ICAKICAgICAgICAgKi8KICAgICAgICB3aGlsZSAoKCpvdXRfbGVuICsgNCkgPj0gKmJ1Zl9sZW4pIHsKICAgICAgICAgICAgaWYgKCEoYWxsb3dfcmVhbGxvYyAmJiBzbm1wX3JlYWxsb2MoYnVmLCBidWZfbGVuKSkpIHsKICAgICAgICAgICAgICAgIERFQlVHSU5ERU5UTEVTUygpOwogICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgKigqYnVmICsgKm91dF9sZW4pID0gKHVfY2hhcikgcGR1LT50aW1lOwogICAgICAgICgqb3V0X2xlbikrKzsKICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7CiAgICAgICAgICAgICooKmJ1ZiArICpvdXRfbGVuKSA9IDA7CiAgICAgICAgICAgICgqb3V0X2xlbikrKzsKICAgICAgICB9CiAgICAgICAgREVCVUdEVU1QSEVBREVSKCJzZW5kIiwgIk9wZW4gVGltZW91dCIpOwogICAgICAgIERFQlVHRFVNUFNFVFVQKCJzZW5kIiwgKCpidWYgKyAqb3V0X2xlbiAtIDQpLCA0KTsKICAgICAgICBERUJVR01TRygoImR1bXB2X3NlbmQiLCAiICBUaW1lb3V0Olx0JWRcbiIsCiAgICAgICAgICAgICAgICAgIChpbnQpICooKmJ1ZiArICpvdXRfbGVuIC0gNCkpKTsKICAgICAgICBERUJVR0lOREVOVExFU1MoKTsKCiAgICAgICAgREVCVUdEVU1QSEVBREVSKCJzZW5kIiwgIk9wZW4gSUQiKTsKICAgICAgICBpZiAoIWFnZW50eF9yZWFsbG9jX2J1aWxkX29pZAogICAgICAgICAgICAoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCAwLCBwZHUtPnZhcmlhYmxlcy0+bmFtZSwKICAgICAgICAgICAgIHBkdS0+dmFyaWFibGVzLT5uYW1lX2xlbmd0aCwgbmV0d29ya19vcmRlcikpIHsKICAgICAgICAgICAgREVCVUdJTkRFTlRMRVNTKCk7CiAgICAgICAgICAgIERFQlVHSU5ERU5UTEVTUygpOwogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CiAgICAgICAgREVCVUdJTkRFTlRMRVNTKCk7CiAgICAgICAgREVCVUdEVU1QSEVBREVSKCJzZW5kIiwgIk9wZW4gRGVzY3JpcHRpb24iKTsKICAgICAgICBpZiAoIWFnZW50eF9yZWFsbG9jX2J1aWxkX3N0cmluZwogICAgICAgICAgICAoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgcGR1LT52YXJpYWJsZXMtPnZhbC5zdHJpbmcsIHBkdS0+dmFyaWFibGVzLT52YWxfbGVuLAogICAgICAgICAgICAgbmV0d29ya19vcmRlcikpIHsKICAgICAgICAgICAgREVCVUdJTkRFTlRMRVNTKCk7CiAgICAgICAgICAgIERFQlVHSU5ERU5UTEVTUygpOwogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CiAgICAgICAgREVCVUdJTkRFTlRMRVNTKCk7CiAgICAgICAgYnJlYWs7CgogICAgY2FzZSBBR0VOVFhfTVNHX0NMT1NFOgogICAgICAgIC8qCiAgICAgICAgICogUmVhc29uICAKICAgICAgICAgKi8KICAgICAgICB3aGlsZSAoKCpvdXRfbGVuICsgNCkgPj0gKmJ1Zl9sZW4pIHsKICAgICAgICAgICAgaWYgKCEoYWxsb3dfcmVhbGxvYyAmJiBzbm1wX3JlYWxsb2MoYnVmLCBidWZfbGVuKSkpIHsKICAgICAgICAgICAgICAgIERFQlVHSU5ERU5UTEVTUygpOwogICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgKigqYnVmICsgKm91dF9sZW4pID0gKHVfY2hhcikgcGR1LT5lcnJzdGF0OwogICAgICAgICgqb3V0X2xlbikrKzsKICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7CiAgICAgICAgICAgICooKmJ1ZiArICpvdXRfbGVuKSA9IDA7CiAgICAgICAgICAgICgqb3V0X2xlbikrKzsKICAgICAgICB9CiAgICAgICAgREVCVUdEVU1QSEVBREVSKCJzZW5kIiwgIkNsb3NlIFJlYXNvbiIpOwogICAgICAgIERFQlVHRFVNUFNFVFVQKCJzZW5kIiwgKCpidWYgKyAqb3V0X2xlbiAtIDQpLCA0KTsKICAgICAgICBERUJVR01TRygoImR1bXB2X3NlbmQiLCAiICBSZWFzb246XHQlZFxuIiwKICAgICAgICAgICAgICAgICAgKGludCkgKigqYnVmICsgKm91dF9sZW4gLSA0KSkpOwogICAgICAgIERFQlVHSU5ERU5UTEVTUygpOwogICAgICAgIGJyZWFrOwoKICAgIGNhc2UgQUdFTlRYX01TR19SRUdJU1RFUjoKICAgIGNhc2UgQUdFTlRYX01TR19VTlJFR0lTVEVSOgogICAgICAgIHdoaWxlICgoKm91dF9sZW4gKyA0KSA+PSAqYnVmX2xlbikgewogICAgICAgICAgICBpZiAoIShhbGxvd19yZWFsbG9jICYmIHNubXBfcmVhbGxvYyhidWYsIGJ1Zl9sZW4pKSkgewogICAgICAgICAgICAgICAgREVCVUdJTkRFTlRMRVNTKCk7CiAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAocGR1LT5jb21tYW5kID09IEFHRU5UWF9NU0dfUkVHSVNURVIpIHsKICAgICAgICAgICAgKigqYnVmICsgKm91dF9sZW4pID0gKHVfY2hhcikgcGR1LT50aW1lOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICooKmJ1ZiArICpvdXRfbGVuKSA9IDA7CiAgICAgICAgfQogICAgICAgICgqb3V0X2xlbikrKzsKICAgICAgICAqKCpidWYgKyAqb3V0X2xlbikgPSAodV9jaGFyKSBwZHUtPnByaW9yaXR5OwogICAgICAgICgqb3V0X2xlbikrKzsKICAgICAgICAqKCpidWYgKyAqb3V0X2xlbikgPSAodV9jaGFyKSBwZHUtPnJhbmdlX3N1YmlkOwogICAgICAgICgqb3V0X2xlbikrKzsKICAgICAgICAqKCpidWYgKyAqb3V0X2xlbikgPSAodV9jaGFyKSAwOwogICAgICAgICgqb3V0X2xlbikrKzsKCiAgICAgICAgREVCVUdEVU1QSEVBREVSKCJzZW5kIiwgIihVbilSZWdpc3RlciBIZWFkZXIiKTsKICAgICAgICBERUJVR0RVTVBTRVRVUCgic2VuZCIsICgqYnVmICsgKm91dF9sZW4gLSA0KSwgNCk7CiAgICAgICAgaWYgKHBkdS0+Y29tbWFuZCA9PSBBR0VOVFhfTVNHX1JFR0lTVEVSKSB7CiAgICAgICAgICAgIERFQlVHTVNHKCgiZHVtcHZfc2VuZCIsICIgIFRpbWVvdXQ6XHQlZFxuIiwKICAgICAgICAgICAgICAgICAgICAgIChpbnQpICooKmJ1ZiArICpvdXRfbGVuIC0gNCkpKTsKICAgICAgICAgICAgREVCVUdQUklOVElOREVOVCgiZHVtcHZfc2VuZCIpOwogICAgICAgIH0KICAgICAgICBERUJVR01TRygoImR1bXB2X3NlbmQiLCAiICBQcmlvcml0eTpcdCVkXG4iLAogICAgICAgICAgICAgICAgICAoaW50KSAqKCpidWYgKyAqb3V0X2xlbiAtIDMpKSk7CiAgICAgICAgREVCVUdQUklOVElOREVOVCgiZHVtcHZfc2VuZCIpOwogICAgICAgIERFQlVHTVNHKCgiZHVtcHZfc2VuZCIsICIgIFJhbmdlIFN1YklEOlx0JWRcbiIsCiAgICAgICAgICAgICAgICAgIChpbnQpICooKmJ1ZiArICpvdXRfbGVuIC0gMikpKTsKICAgICAgICBERUJVR0lOREVOVExFU1MoKTsKCiAgICAgICAgdnAgPSBwZHUtPnZhcmlhYmxlczsKICAgICAgICBERUJVR0RVTVBIRUFERVIoInNlbmQiLCAiKFVuKVJlZ2lzdGVyIFByZWZpeCIpOwogICAgICAgIGlmICghYWdlbnR4X3JlYWxsb2NfYnVpbGRfb2lkCiAgICAgICAgICAgIChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsIDAsIHZwLT5uYW1lLAogICAgICAgICAgICAgdnAtPm5hbWVfbGVuZ3RoLCBuZXR3b3JrX29yZGVyKSkgewoKICAgICAgICAgICAgREVCVUdJTkRFTlRMRVNTKCk7CiAgICAgICAgICAgIERFQlVHSU5ERU5UTEVTUygpOwogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CiAgICAgICAgREVCVUdJTkRFTlRMRVNTKCk7CgogICAgICAgIGlmIChwZHUtPnJhbmdlX3N1YmlkKSB7CiAgICAgICAgICAgIERFQlVHRFVNUEhFQURFUigic2VuZCIsICIoVW4pUmVnaXN0ZXIgUmFuZ2UiKTsKICAgICAgICAgICAgaWYgKCFhZ2VudHhfcmVhbGxvY19idWlsZF9pbnQKICAgICAgICAgICAgICAgIChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgdnAtPnZhbC5vYmppZFtwZHUtPnJhbmdlX3N1YmlkIC0gMV0sIG5ldHdvcmtfb3JkZXIpKSB7CiAgICAgICAgICAgICAgICBERUJVR0lOREVOVExFU1MoKTsKICAgICAgICAgICAgICAgIERFQlVHSU5ERU5UTEVTUygpOwogICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgREVCVUdJTkRFTlRMRVNTKCk7CiAgICAgICAgfQogICAgICAgIGJyZWFrOwoKICAgIGNhc2UgQUdFTlRYX01TR19HRVRCVUxLOgogICAgICAgIERFQlVHRFVNUEhFQURFUigic2VuZCIsICJHZXRCdWxrIE5vbi1SZXBlYXRlcnMiKTsKICAgICAgICBpZiAoIWFnZW50eF9yZWFsbG9jX2J1aWxkX3Nob3J0CiAgICAgICAgICAgIChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsIAogICAgICAgICAgICAodV9zaG9ydClwZHUtPm5vbl9yZXBlYXRlcnMsCiAgICAgICAgICAgICBuZXR3b3JrX29yZGVyKSkgewogICAgICAgICAgICBERUJVR0lOREVOVExFU1MoKTsKICAgICAgICAgICAgREVCVUdJTkRFTlRMRVNTKCk7CiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KICAgICAgICBERUJVR0lOREVOVExFU1MoKTsKCiAgICAgICAgREVCVUdEVU1QSEVBREVSKCJzZW5kIiwgIkdldEJ1bGsgTWF4LVJlcGV0aXRpb25zIik7CiAgICAgICAgaWYgKCFhZ2VudHhfcmVhbGxvY19idWlsZF9zaG9ydAogICAgICAgICAgICAoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCAKICAgICAgICAgICAgKHVfc2hvcnQpcGR1LT5tYXhfcmVwZXRpdGlvbnMsCiAgICAgICAgICAgICBuZXR3b3JrX29yZGVyKSkgewogICAgICAgICAgICBERUJVR0lOREVOVExFU1MoKTsKICAgICAgICAgICAgREVCVUdJTkRFTlRMRVNTKCk7CiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KICAgICAgICBERUJVR0lOREVOVExFU1MoKTsKCiAgICAgICAgLyoKICAgICAgICAgKiBGYWxsdGhyb3VnaCAgCiAgICAgICAgICovCgogICAgY2FzZSBBR0VOVFhfTVNHX0dFVDoKICAgIGNhc2UgQUdFTlRYX01TR19HRVRORVhUOgogICAgICAgIERFQlVHRFVNUEhFQURFUigic2VuZCIsICJHZXQqIFZhcmlhYmxlIExpc3QiKTsKICAgICAgICBmb3IgKHZwID0gcGR1LT52YXJpYWJsZXM7IHZwICE9IE5VTEw7IHZwID0gdnAtPm5leHRfdmFyaWFibGUpIHsKICAgICAgICAgICAgaW5jID0gKHZwLT50eXBlID09IEFTTl9QUklWX0lOQ0xfUkFOR0UpOwogICAgICAgICAgICBpZiAoIWFnZW50eF9yZWFsbG9jX2J1aWxkX29pZAogICAgICAgICAgICAgICAgKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgaW5jLCB2cC0+bmFtZSwKICAgICAgICAgICAgICAgICB2cC0+bmFtZV9sZW5ndGgsIG5ldHdvcmtfb3JkZXIpKSB7CiAgICAgICAgICAgICAgICBERUJVR0lOREVOVExFU1MoKTsKICAgICAgICAgICAgICAgIERFQlVHSU5ERU5UTEVTUygpOwogICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCFhZ2VudHhfcmVhbGxvY19idWlsZF9vaWQKICAgICAgICAgICAgICAgIChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsIDAsIHZwLT52YWwub2JqaWQsCiAgICAgICAgICAgICAgICAgdnAtPnZhbF9sZW4gLyBzaXplb2Yob2lkKSwgbmV0d29ya19vcmRlcikpIHsKICAgICAgICAgICAgICAgIERFQlVHSU5ERU5UTEVTUygpOwogICAgICAgICAgICAgICAgREVCVUdJTkRFTlRMRVNTKCk7CiAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBERUJVR0lOREVOVExFU1MoKTsKICAgICAgICBicmVhazsKCiAgICBjYXNlIEFHRU5UWF9NU0dfUkVTUE9OU0U6CiAgICAgICAgcGR1LT5mbGFncyAmPSB+KFVDRF9NU0dfRkxBR19FWFBFQ1RfUkVTUE9OU0UpOwogICAgICAgIGlmICghYWdlbnR4X3JlYWxsb2NfYnVpbGRfaW50KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZHUtPnRpbWUsIG5ldHdvcmtfb3JkZXIpKSB7CiAgICAgICAgICAgIERFQlVHSU5ERU5UTEVTUygpOwogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CiAgICAgICAgREVCVUdEVU1QSEVBREVSKCJzZW5kIiwgIlJlc3BvbnNlIik7CiAgICAgICAgREVCVUdEVU1QU0VUVVAoInNlbmQiLCAoKmJ1ZiArICpvdXRfbGVuIC0gNCksIDQpOwogICAgICAgIERFQlVHTVNHKCgiZHVtcHZfc2VuZCIsICIgIHN5c1VwVGltZTpcdCVkXG4iLCBwZHUtPnRpbWUpKTsKICAgICAgICBERUJVR0lOREVOVExFU1MoKTsKCiAgICAgICAgaWYgKCFhZ2VudHhfcmVhbGxvY19idWlsZF9zaG9ydAogICAgICAgICAgICAoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCAKICAgICAgICAgICAgKHVfc2hvcnQpcGR1LT5lcnJzdGF0LAogICAgICAgICAgICAgbmV0d29ya19vcmRlcikKICAgICAgICAgICAgfHwgIWFnZW50eF9yZWFsbG9jX2J1aWxkX3Nob3J0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93X3JlYWxsb2MsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVfc2hvcnQpcGR1LT5lcnJpbmRleCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldHdvcmtfb3JkZXIpKSB7CiAgICAgICAgICAgIERFQlVHSU5ERU5UTEVTUygpOwogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CiAgICAgICAgREVCVUdEVU1QSEVBREVSKCJzZW5kIiwgIlJlc3BvbnNlIGVycm9ycyIpOwogICAgICAgIERFQlVHRFVNUFNFVFVQKCJzZW5kIiwgKCpidWYgKyAqb3V0X2xlbiAtIDQpLCA0KTsKICAgICAgICBERUJVR01TRygoImR1bXB2X3NlbmQiLCAiICBlcnJzdGF0Olx0JWRcbiIsIHBkdS0+ZXJyc3RhdCkpOwogICAgICAgIERFQlVHUFJJTlRJTkRFTlQoImR1bXB2X3NlbmQiKTsKICAgICAgICBERUJVR01TRygoImR1bXB2X3NlbmQiLCAiICBlcnJpbmRleDpcdCVkXG4iLCBwZHUtPmVycmluZGV4KSk7CiAgICAgICAgREVCVUdJTkRFTlRMRVNTKCk7CgogICAgICAgIC8qCiAgICAgICAgICogRmFsbHRocm91Z2ggIAogICAgICAgICAqLwoKICAgIGNhc2UgQUdFTlRYX01TR19JTkRFWF9BTExPQ0FURToKICAgIGNhc2UgQUdFTlRYX01TR19JTkRFWF9ERUFMTE9DQVRFOgogICAgY2FzZSBBR0VOVFhfTVNHX05PVElGWToKICAgIGNhc2UgQUdFTlRYX01TR19URVNUU0VUOgogICAgICAgIERFQlVHRFVNUEhFQURFUigic2VuZCIsICJHZXQqIFZhcmlhYmxlIExpc3QiKTsKICAgICAgICBmb3IgKHZwID0gcGR1LT52YXJpYWJsZXM7IHZwICE9IE5VTEw7IHZwID0gdnAtPm5leHRfdmFyaWFibGUpIHsKICAgICAgICAgICAgaWYgKCFhZ2VudHhfcmVhbGxvY19idWlsZF92YXJiaW5kCiAgICAgICAgICAgICAgICAoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCB2cCwKICAgICAgICAgICAgICAgICBuZXR3b3JrX29yZGVyKSkgewogICAgICAgICAgICAgICAgREVCVUdJTkRFTlRMRVNTKCk7CiAgICAgICAgICAgICAgICBERUJVR0lOREVOVExFU1MoKTsKICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIERFQlVHSU5ERU5UTEVTUygpOwogICAgICAgIGJyZWFrOwoKICAgIGNhc2UgQUdFTlRYX01TR19DT01NSVRTRVQ6CiAgICBjYXNlIEFHRU5UWF9NU0dfVU5ET1NFVDoKICAgIGNhc2UgQUdFTlRYX01TR19QSU5HOgogICAgICAgIC8qCiAgICAgICAgICogIkVtcHR5IiBwYWNrZXQuICAKICAgICAgICAgKi8KICAgICAgICBicmVhazsKCiAgICBjYXNlIEFHRU5UWF9NU0dfQ0xFQU5VUFNFVDoKICAgICAgICBwZHUtPmZsYWdzICY9IH4oVUNEX01TR19GTEFHX0VYUEVDVF9SRVNQT05TRSk7CiAgICAgICAgYnJlYWs7CgogICAgY2FzZSBBR0VOVFhfTVNHX0FERF9BR0VOVF9DQVBTOgogICAgICAgIERFQlVHRFVNUEhFQURFUigic2VuZCIsICJBZ2VudENhcHMgT0lEIik7CiAgICAgICAgaWYgKCFhZ2VudHhfcmVhbGxvY19idWlsZF9vaWQKICAgICAgICAgICAgKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgMCwgcGR1LT52YXJpYWJsZXMtPm5hbWUsCiAgICAgICAgICAgICBwZHUtPnZhcmlhYmxlcy0+bmFtZV9sZW5ndGgsIG5ldHdvcmtfb3JkZXIpKSB7CiAgICAgICAgICAgIERFQlVHSU5ERU5UTEVTUygpOwogICAgICAgICAgICBERUJVR0lOREVOVExFU1MoKTsKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQogICAgICAgIERFQlVHSU5ERU5UTEVTUygpOwoKICAgICAgICBERUJVR0RVTVBIRUFERVIoInNlbmQiLCAiQWdlbnRDYXBzIERlc2NyaXB0aW9uIik7CiAgICAgICAgaWYgKCFhZ2VudHhfcmVhbGxvY19idWlsZF9zdHJpbmcKICAgICAgICAgICAgKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgIHBkdS0+dmFyaWFibGVzLT52YWwuc3RyaW5nLCBwZHUtPnZhcmlhYmxlcy0+dmFsX2xlbiwKICAgICAgICAgICAgIG5ldHdvcmtfb3JkZXIpKSB7CiAgICAgICAgICAgIERFQlVHSU5ERU5UTEVTUygpOwogICAgICAgICAgICBERUJVR0lOREVOVExFU1MoKTsKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQogICAgICAgIERFQlVHSU5ERU5UTEVTUygpOwogICAgICAgIGJyZWFrOwoKICAgIGNhc2UgQUdFTlRYX01TR19SRU1PVkVfQUdFTlRfQ0FQUzoKICAgICAgICBERUJVR0RVTVBIRUFERVIoInNlbmQiLCAiQWdlbnRDYXBzIE9JRCIpOwogICAgICAgIGlmICghYWdlbnR4X3JlYWxsb2NfYnVpbGRfb2lkCiAgICAgICAgICAgIChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsIDAsIHBkdS0+dmFyaWFibGVzLT5uYW1lLAogICAgICAgICAgICAgcGR1LT52YXJpYWJsZXMtPm5hbWVfbGVuZ3RoLCBuZXR3b3JrX29yZGVyKSkgewogICAgICAgICAgICBERUJVR0lOREVOVExFU1MoKTsKICAgICAgICAgICAgREVCVUdJTkRFTlRMRVNTKCk7CiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KICAgICAgICBERUJVR0lOREVOVExFU1MoKTsKICAgICAgICBicmVhazsKCiAgICBkZWZhdWx0OgogICAgICAgIHNlc3Npb24tPnNfc25tcF9lcnJubyA9IFNOTVBFUlJfVU5LTk9XTl9QRFU7CiAgICAgICAgcmV0dXJuIDA7CiAgICB9CiAgICBERUJVR0lOREVOVExFU1MoKTsKCiAgICAvKgogICAgICogRml4IHRoZSBwYXlsb2FkIGxlbmd0aCAoaWdub3JpbmcgdGhlIDIwLWJ5dGUgaGVhZGVyKS4gIAogICAgICovCgogICAgYWdlbnR4X2J1aWxkX2ludCgoKmJ1ZiArIDE2KSwgKCpvdXRfbGVuIC0gaWxlbikgLSAyMCwgbmV0d29ya19vcmRlcik7CgogICAgREVCVUdNU0dUTCgoImFnZW50eF9idWlsZCIsICJwYWNrZXQgYnVpbHQgb2theVxuIikpOwogICAgcmV0dXJuIDE7Cn0KCmludAphZ2VudHhfcmVhbGxvY19idWlsZChuZXRzbm1wX3Nlc3Npb24gKiBzZXNzaW9uLCBuZXRzbm1wX3BkdSAqcGR1LAogICAgICAgICAgICAgICAgICAgICB1X2NoYXIgKiogYnVmLCBzaXplX3QgKiBidWZfbGVuLCBzaXplX3QgKiBvdXRfbGVuKQp7CiAgICBpZiAoc2Vzc2lvbiA9PSBOVUxMIHx8IGJ1Zl9sZW4gPT0gTlVMTCB8fAogICAgICAgIG91dF9sZW4gPT0gTlVMTCB8fCBwZHUgPT0gTlVMTCB8fCBidWYgPT0gTlVMTCkgewogICAgICAgIHJldHVybiAtMTsKICAgIH0KICAgIGlmICghX2FnZW50eF9yZWFsbG9jX2J1aWxkKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgMSwgc2Vzc2lvbiwgcGR1KSkgewogICAgICAgIGlmIChzZXNzaW9uLT5zX3NubXBfZXJybm8gPT0gMCkgewogICAgICAgICAgICBzZXNzaW9uLT5zX3NubXBfZXJybm8gPSBTTk1QRVJSX0JBRF9BU04xX0JVSUxEOwogICAgICAgIH0KICAgICAgICByZXR1cm4gLTE7CiAgICB9CgogICAgcmV0dXJuIDA7Cn0KCiAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqCgkqCgkqICBVdGlsaXR5IGZ1bmN0aW9ucyBmb3IgcGFyc2luZyBhbiBBZ2VudFggcGFja2V0CgkqCgkqKioqKioqKioqKioqKioqKioqKioqKi8KCmludAphZ2VudHhfcGFyc2VfaW50KHVfY2hhciAqIGRhdGEsIHVfaW50IG5ldHdvcmtfYnl0ZV9vcmRlcikKewogICAgdV9pbnQgICAgICAgICAgIHZhbHVlID0gMDsKCiAgICAvKgogICAgICogIE5vdGUgLSB0aGlzIGRvZXNuJ3QgaGFuZGxlICdQRFBfRU5ESUFOJyBzeXN0ZW1zCiAgICAgKiAgICAgIElmIGFueW9uZSBuZWVkcyB0aGlzIGFkZGVkLCBjb250YWN0IHRoZSBjb2RlcnMgbGlzdAogICAgICovCiAgICBERUJVR0RVTVBTRVRVUCgicmVjdiIsIGRhdGEsIDQpOwogICAgaWYgKG5ldHdvcmtfYnl0ZV9vcmRlcikgewogICAgICAgIG1lbW1vdmUoJnZhbHVlLCBkYXRhLCA0KTsKI2lmbmRlZiBXT1JEU19CSUdFTkRJQU4KICAgICAgICB2YWx1ZSA9IG50b2hsKHZhbHVlKTsKI2VuZGlmCiAgICB9IGVsc2UgewojaWZuZGVmIFdPUkRTX0JJR0VORElBTgogICAgICAgIG1lbW1vdmUoJnZhbHVlLCBkYXRhLCA0KTsKI2Vsc2UKICAgICAgICAvKgogICAgICAgICAqIFRoZSBlcXVpdmFsZW50IG9mIHRoZSAnbnRvaGwoKScgbWFjcm8sCiAgICAgICAgICogZXhjZXB0IHRoaXMgbWFjcm8gaXMgbnVsbCBvbiBiaWctZW5kaWFuIHN5c3RlbXMgCiAgICAgICAgICovCiAgICAgICAgdmFsdWUgKz0gZGF0YVszXTsKICAgICAgICB2YWx1ZSA8PD0gODsKICAgICAgICB2YWx1ZSArPSBkYXRhWzJdOwogICAgICAgIHZhbHVlIDw8PSA4OwogICAgICAgIHZhbHVlICs9IGRhdGFbMV07CiAgICAgICAgdmFsdWUgPDw9IDg7CiAgICAgICAgdmFsdWUgKz0gZGF0YVswXTsKI2VuZGlmCiAgICB9CiAgICBERUJVR01TRygoImR1bXB2X3JlY3YiLCAiICBJbnRlZ2VyOlx0JWxkICgweCUuMlgpXG4iLCB2YWx1ZSwgdmFsdWUpKTsKCiAgICByZXR1cm4gdmFsdWU7Cn0KCgppbnQKYWdlbnR4X3BhcnNlX3Nob3J0KHVfY2hhciAqIGRhdGEsIHVfaW50IG5ldHdvcmtfYnl0ZV9vcmRlcikKewogICAgdV9zaG9ydCAgICAgICAgIHZhbHVlID0gMDsKCiAgICBpZiAobmV0d29ya19ieXRlX29yZGVyKSB7CiAgICAgICAgbWVtbW92ZSgmdmFsdWUsIGRhdGEsIDIpOwojaWZuZGVmIFdPUkRTX0JJR0VORElBTgogICAgICAgIHZhbHVlID0gbnRvaHModmFsdWUpOwojZW5kaWYKICAgIH0gZWxzZSB7CiNpZm5kZWYgV09SRFNfQklHRU5ESUFOCiAgICAgICAgbWVtbW92ZSgmdmFsdWUsIGRhdGEsIDIpOwojZWxzZQogICAgICAgIC8qCiAgICAgICAgICogVGhlIGVxdWl2YWxlbnQgb2YgdGhlICdudG9ocygpJyBtYWNybywKICAgICAgICAgKiBleGNlcHQgdGhpcyBtYWNybyBpcyBudWxsIG9uIGJpZy1lbmRpYW4gc3lzdGVtcyAKICAgICAgICAgKi8KICAgICAgICB2YWx1ZSArPSBkYXRhWzFdOwogICAgICAgIHZhbHVlIDw8PSA4OwogICAgICAgIHZhbHVlICs9IGRhdGFbMF07CiNlbmRpZgogICAgfQoKICAgIERFQlVHRFVNUFNFVFVQKCJyZWN2IiwgZGF0YSwgMik7CiAgICBERUJVR01TRygoImR1bXB2X3JlY3YiLCAiICBTaG9ydDpcdCVsZCAoMHglLjJYKVxuIiwgdmFsdWUsIHZhbHVlKSk7CiAgICByZXR1cm4gdmFsdWU7Cn0KCgp1X2NoYXIgICAgICAgICAqCmFnZW50eF9wYXJzZV9vaWQodV9jaGFyICogZGF0YSwgc2l6ZV90ICogbGVuZ3RoLCBpbnQgKmluYywKICAgICAgICAgICAgICAgICBvaWQgKiBvaWRfYnVmLCBzaXplX3QgKiBvaWRfbGVuLCB1X2ludCBuZXR3b3JrX2J5dGVfb3JkZXIpCnsKICAgIHVfaW50ICAgICAgICAgICBuX3N1YmlkOwogICAgdV9pbnQgICAgICAgICAgIHByZWZpeDsKICAgIHVfaW50ICAgICAgICAgICB0bXBfb2lkX2xlbjsKICAgIGludCAgICAgICAgICAgICBpOwogICAgaW50ICAgICAgICAgICAgIGludF9vZmZzZXQ7CiAgICB1X2ludCAgICAgICAgICAqaW50X3B0ciA9ICh1X2ludCAqKW9pZF9idWY7CiAgICB1X2NoYXIgICAgICAgICAqYnVmX3B0ciA9IGRhdGE7CgogICAgaWYgKCpsZW5ndGggPCA0KSB7CiAgICAgICAgREVCVUdNU0dUTCgoImFnZW50eCIsICJJbmNvbXBsZXRlIE9iamVjdCBJRFxuIikpOwogICAgICAgIHJldHVybiBOVUxMOwogICAgfQoKICAgIERFQlVHRFVNUEhFQURFUigicmVjdiIsICJPSUQgSGVhZGVyIik7CiAgICBERUJVR0RVTVBTRVRVUCgicmVjdiIsIGRhdGEsIDQpOwogICAgREVCVUdNU0coKCJkdW1wdl9yZWN2IiwgIiAgIyBzdWJpZHM6XHQlZCAoMHglLjJYKVxuIiwgZGF0YVswXSwKICAgICAgICAgICAgICBkYXRhWzBdKSk7CiAgICBERUJVR1BSSU5USU5ERU5UKCJkdW1wdl9yZWN2Iik7CiAgICBERUJVR01TRygoImR1bXB2X3JlY3YiLCAiICBwcmVmaXg6IFx0JWQgKDB4JS4yWClcbiIsIGRhdGFbMV0sCiAgICAgICAgICAgICAgZGF0YVsxXSkpOwogICAgREVCVUdQUklOVElOREVOVCgiZHVtcHZfcmVjdiIpOwogICAgREVCVUdNU0coKCJkdW1wdl9yZWN2IiwgIiAgaW5jbHVzaXZlOlx0JWQgKDB4JS4yWClcbiIsIGRhdGFbMl0sCiAgICAgICAgICAgICAgZGF0YVsyXSkpOwoKICAgIERFQlVHSU5ERU5UTEVTUygpOwogICAgREVCVUdEVU1QSEVBREVSKCJyZWN2IiwgIk9JRCBTZWdtZW50cyIpOwoKICAgIG5fc3ViaWQgPSBkYXRhWzBdOwogICAgcHJlZml4ID0gZGF0YVsxXTsKICAgIGlmIChpbmMpCiAgICAgICAgKmluYyA9IGRhdGFbMl07CiAgICBpbnRfb2Zmc2V0ID0gc2l6ZW9mKG9pZCkvNDsKCiAgICBidWZfcHRyICs9IDQ7CiAgICAqbGVuZ3RoIC09IDQ7CgogICAgREVCVUdNU0coKCJkanAiLCAiICBwYXJzZV9vaWRcbiIpKTsKICAgIERFQlVHTVNHKCgiZGpwIiwgIiAgc2l6ZW9mKG9pZCkgPSAlZFxuIiwgc2l6ZW9mKG9pZCkpKTsKICAgIGlmIChuX3N1YmlkID09IDAgJiYgcHJlZml4ID09IDApIHsKICAgICAgICAvKgogICAgICAgICAqIE51bGwgT0lEIAogICAgICAgICAqLwogICAgICAgIG1lbXNldChpbnRfcHRyLCAwLCAyICogc2l6ZW9mKG9pZCkpOwogICAgICAgICpvaWRfbGVuID0gMjsKICAgICAgICBERUJVR1BSSU5USU5ERU5UKCJkdW1wdl9yZWN2Iik7CiAgICAgICAgREVCVUdNU0coKCJkdW1wdl9yZWN2IiwgIk9JRDogTlVMTCAoMC4wKVxuIikpOwogICAgICAgIERFQlVHSU5ERU5UTEVTUygpOwogICAgICAgIHJldHVybiBidWZfcHRyOwogICAgfQoKICAgIC8qCiAgICAgKiBDaGVjayB0aGF0IHRoZSBleHBhbmRlZCBPSUQgd2lsbCBmaXQgaW4gdGhlIGJ1ZmZlciBwcm92aWRlZAogICAgICovCiAgICB0bXBfb2lkX2xlbiA9IChwcmVmaXggPyBuX3N1YmlkICsgNSA6IG5fc3ViaWQpOwogICAgaWYgKCpvaWRfbGVuIDwgdG1wX29pZF9sZW4pIHsKICAgICAgICBERUJVR01TR1RMKCgiYWdlbnR4IiwgIk92ZXJzaXplZCBPYmplY3QgSURcbiIpKTsKICAgICAgICByZXR1cm4gTlVMTDsKICAgIH0KCiNpZmRlZiBXT1JEU19CSUdFTkRJQU4KIyBkZWZpbmUgZW5kaWFub2ZmIDEKI2Vsc2UKIyBkZWZpbmUgZW5kaWFub2ZmIDAKI2VuZGlmCiAgICBpZiAoKmxlbmd0aCA8IDQgKiBuX3N1YmlkKSB7CiAgICAgICAgREVCVUdNU0dUTCgoImFnZW50eCIsICJJbmNvbXBsZXRlIE9iamVjdCBJRFxuIikpOwogICAgICAgIHJldHVybiBOVUxMOwogICAgfQoKICAgIGlmIChwcmVmaXgpIHsJIAogICAgICAgIGlmIChpbnRfb2Zmc2V0ID09IDIpIHsgIAkvKiBhbGlnbiBPSUQgdmFsdWVzIGluIDY0IGJpdCBhZ2VudCAqLyAgCgkgICAgbWVtc2V0KGludF9wdHIsIDAsIDEwKnNpemVvZihpbnRfcHRyWzBdKSk7IAoJICAgIGludF9wdHJbMCtlbmRpYW5vZmZdID0gMTsKCSAgICBpbnRfcHRyWzIrZW5kaWFub2ZmXSA9IDM7CgkgICAgaW50X3B0cls0K2VuZGlhbm9mZl0gPSA2OwoJICAgIGludF9wdHJbNitlbmRpYW5vZmZdID0gMTsKCSAgICBpbnRfcHRyWzgrZW5kaWFub2ZmXSA9IHByZWZpeDsKICAgICAgICB9IGVsc2UgeyAvKiBhc3N1bWUgaW50X29mZnNldCA9PSAxICovCgkgICAgaW50X3B0clswXSA9IDE7CgkgICAgaW50X3B0clsxXSA9IDM7CgkgICAgaW50X3B0clsyXSA9IDY7CgkgICAgaW50X3B0clszXSA9IDE7CgkgICAgaW50X3B0cls0XSA9IHByZWZpeDsKICAgICAgICB9CiAgICAgICAgaW50X3B0ciA9IGludF9wdHIgKyAoaW50X29mZnNldCAqIDUpOwogICAgfQoKICAgIGZvciAoaSA9IDA7IGkgPCAoaW50KSAoaW50X29mZnNldCAqIG5fc3ViaWQpOyBpID0gaSArIGludF9vZmZzZXQpIHsKCWludCB4OwoKCXggPSBhZ2VudHhfcGFyc2VfaW50KGJ1Zl9wdHIsIG5ldHdvcmtfYnl0ZV9vcmRlcik7CglpZiAoaW50X29mZnNldCA9PSAyKSB7CiAgICAgICAgICAgIGludF9wdHJbaSswXSA9IDA7CgkgICAgaW50X3B0cltpKzFdID0gMDsKCSAgICBpbnRfcHRyW2krZW5kaWFub2ZmXT14OwogICAgICAgIH0gZWxzZSB7CgkgICAgaW50X3B0cltpXSA9IHg7CiAgICAgICAgfQogICAgICAgIGJ1Zl9wdHIgKz0gNDsKICAgICAgICAqbGVuZ3RoIC09IDQ7CiAgICB9CgogICAgKm9pZF9sZW4gPSB0bXBfb2lkX2xlbjsKCiAgICBERUJVR0lOREVOVExFU1MoKTsKICAgIERFQlVHUFJJTlRJTkRFTlQoImR1bXB2X3JlY3YiKTsKICAgIERFQlVHTVNHKCgiZHVtcHZfcmVjdiIsICJPSUQ6ICIpKTsKICAgIERFQlVHTVNHT0lEKCgiZHVtcHZfcmVjdiIsIG9pZF9idWYsICpvaWRfbGVuKSk7CiAgICBERUJVR01TRygoImR1bXB2X3JlY3YiLCAiXG4iKSk7CgogICAgcmV0dXJuIGJ1Zl9wdHI7Cn0KCgoKdV9jaGFyICAgICAgICAgKgphZ2VudHhfcGFyc2Vfc3RyaW5nKHVfY2hhciAqIGRhdGEsIHNpemVfdCAqIGxlbmd0aCwKICAgICAgICAgICAgICAgICAgICB1X2NoYXIgKiBzdHJpbmcsIHNpemVfdCAqIHN0cl9sZW4sCiAgICAgICAgICAgICAgICAgICAgdV9pbnQgbmV0d29ya19ieXRlX29yZGVyKQp7CiAgICB1X2ludCAgICAgICAgICAgbGVuOwoKICAgIGlmICgqbGVuZ3RoIDwgNCkgewogICAgICAgIERFQlVHTVNHVEwoKCJhZ2VudHgiLCAiSW5jb21wbGV0ZSBzdHJpbmcgKHRvbyBzaG9ydDogJWQpXG4iLAogICAgICAgICAgICAgICAgICAgICpsZW5ndGgpKTsKICAgICAgICByZXR1cm4gTlVMTDsKICAgIH0KCiAgICBsZW4gPSBhZ2VudHhfcGFyc2VfaW50KGRhdGEsIG5ldHdvcmtfYnl0ZV9vcmRlcik7CiAgICBpZiAoKmxlbmd0aCA8IGxlbiArIDQpIHsKICAgICAgICBERUJVR01TR1RMKCgiYWdlbnR4IiwgIkluY29tcGxldGUgc3RyaW5nIChzdGlsbCB0b28gc2hvcnQ6ICVkKVxuIiwKICAgICAgICAgICAgICAgICAgICAqbGVuZ3RoKSk7CiAgICAgICAgcmV0dXJuIE5VTEw7CiAgICB9CiAgICBpZiAobGVuID4gKnN0cl9sZW4pIHsKICAgICAgICBERUJVR01TR1RMKCgiYWdlbnR4IiwgIlN0cmluZyB0b28gbG9uZyAodG9vIGxvbmcpXG4iKSk7CiAgICAgICAgcmV0dXJuIE5VTEw7CiAgICB9CiAgICBtZW1tb3ZlKHN0cmluZywgZGF0YSArIDQsIGxlbik7CiAgICBzdHJpbmdbbGVuXSA9ICdcMCc7CiAgICAqc3RyX2xlbiA9IGxlbjsKCiAgICBsZW4gKz0gMzsgICAgICAgICAgICAgICAgICAgLyogRXh0ZW5kIHRoZSBzdHJpbmcgbGVuZ3RoIHRvIGluY2x1ZGUgdGhlIHBhZGRpbmcgKi8KICAgIGxlbiA+Pj0gMjsKICAgIGxlbiA8PD0gMjsKCiAgICAqbGVuZ3RoIC09IChsZW4gKyA0KTsKICAgIERFQlVHRFVNUFNFVFVQKCJyZWN2IiwgZGF0YSwgKGxlbiArIDQpKTsKICAgIERFQlVHSUYoImR1bXB2X3JlY3YiKSB7CiAgICAgICAgdV9jaGFyICAgICAgICAgKmJ1ZiA9IE5VTEw7CiAgICAgICAgc2l6ZV90ICAgICAgICAgIGJ1Zl9sZW4gPSAwLCBvdXRfbGVuID0gMDsKCiAgICAgICAgaWYgKHNwcmludF9yZWFsbG9jX2FzY2lpc3RyaW5nKCZidWYsICZidWZfbGVuLCAmb3V0X2xlbiwgMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nLCBsZW4pKSB7CiAgICAgICAgICAgIERFQlVHTVNHKCgiZHVtcHZfcmVjdiIsICJTdHJpbmc6ICVzXG4iLCBidWYpKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBERUJVR01TRygoImR1bXB2X3JlY3YiLCAiU3RyaW5nOiAlcyBbVFJVTkNBVEVEXVxuIiwgYnVmKSk7CiAgICAgICAgfQogICAgICAgIGlmIChidWYgIT0gTlVMTCkgewogICAgICAgICAgICBmcmVlKGJ1Zik7CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIGRhdGEgKyAobGVuICsgNCk7Cn0KCnVfY2hhciAgICAgICAgICoKYWdlbnR4X3BhcnNlX29wYXF1ZSh1X2NoYXIgKiBkYXRhLCBzaXplX3QgKiBsZW5ndGgsIGludCAqdHlwZSwKICAgICAgICAgICAgICAgICAgICB1X2NoYXIgKiBvcGFxdWVfYnVmLCBzaXplX3QgKiBvcGFxdWVfbGVuLAogICAgICAgICAgICAgICAgICAgIHVfaW50IG5ldHdvcmtfYnl0ZV9vcmRlcikKewojaWZkZWYgTkVUU05NUF9XSVRIX09QQVFVRV9TUEVDSUFMX1RZUEVTCiAgICB1bmlvbiB7CiAgICAgICAgZmxvYXQgICAgICAgICAgIGZsb2F0VmFsOwogICAgICAgIGRvdWJsZSAgICAgICAgICBkb3VibGVWYWw7CiAgICAgICAgaW50ICAgICAgICAgICAgIGludFZhbFsyXTsKICAgICAgICBjaGFyICAgICAgICAgICAgY1tzaXplb2YoZG91YmxlKV07CiAgICB9IGZ1OwogICAgaW50ICAgICAgICAgICAgIHRtcDsKICAgIHVfY2hhciAgICAgICAgICpidWY7CiNlbmRpZgogICAgdV9jaGFyICAgICAgICAgKmNvbnN0IGNwID0KICAgICAgICBhZ2VudHhfcGFyc2Vfc3RyaW5nKGRhdGEsIGxlbmd0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wYXF1ZV9idWYsIG9wYXF1ZV9sZW4sIG5ldHdvcmtfYnl0ZV9vcmRlcik7CgojaWZkZWYgTkVUU05NUF9XSVRIX09QQVFVRV9TUEVDSUFMX1RZUEVTCiAgICBpZiAoY3AgPT0gTlVMTCkKICAgICAgICByZXR1cm4gTlVMTDsKCiAgICBidWYgPSBvcGFxdWVfYnVmOwoKICAgIGlmICgoKm9wYXF1ZV9sZW4gPD0gMykgfHwgKGJ1ZlswXSAhPSBBU05fT1BBUVVFX1RBRzEpKQogICAgICAgIHJldHVybiBjcDsgICAgICAgICAgICAgIC8qIFVucmVjb2duaXNlZCBvcGFxdWUgdHlwZSAqLwoKICAgIHN3aXRjaCAoYnVmWzFdKSB7CiAgICBjYXNlIEFTTl9PUEFRVUVfRkxPQVQ6CiAgICAgICAgaWYgKCgqb3BhcXVlX2xlbiAhPSAoMyArIHNpemVvZihmbG9hdCkpKSB8fAogICAgICAgICAgICAoYnVmWzJdICE9IHNpemVvZihmbG9hdCkpKQogICAgICAgICAgICByZXR1cm4gY3A7ICAgICAgICAgIC8qIEVuY29kaW5nIGlzbid0IHJpZ2h0IGZvciBGTE9BVCAqLwoKICAgICAgICBtZW1jcHkoJmZ1LmNbMF0sICZidWZbM10sIHNpemVvZihmbG9hdCkpOwogICAgICAgIGZ1LmludFZhbFswXSA9IG50b2hsKGZ1LmludFZhbFswXSk7CiAgICAgICAgKm9wYXF1ZV9sZW4gPSBzaXplb2YoZmxvYXQpOwogICAgICAgIG1lbWNweShvcGFxdWVfYnVmLCAmZnUuY1swXSwgc2l6ZW9mKGZsb2F0KSk7CiAgICAgICAgKnR5cGUgPSBBU05fT1BBUVVFX0ZMT0FUOwogICAgICAgIERFQlVHTVNHKCgiZHVtcHZfcmVjdiIsICJGbG9hdDogJWZcbiIsIGZ1LmZsb2F0VmFsKSk7CiAgICAgICAgcmV0dXJuIGNwOwoKICAgIGNhc2UgQVNOX09QQVFVRV9ET1VCTEU6CiAgICAgICAgaWYgKCgqb3BhcXVlX2xlbiAhPSAoMyArIHNpemVvZihkb3VibGUpKSkgfHwKICAgICAgICAgICAgKGJ1ZlsyXSAhPSBzaXplb2YoZG91YmxlKSkpCiAgICAgICAgICAgIHJldHVybiBjcDsgICAgICAgICAgLyogRW5jb2RpbmcgaXNuJ3QgcmlnaHQgZm9yIERPVUJMRSAqLwoKICAgICAgICBtZW1jcHkoJmZ1LmNbMF0sICZidWZbM10sIHNpemVvZihkb3VibGUpKTsKICAgICAgICB0bXAgPSBudG9obChmdS5pbnRWYWxbMV0pOwogICAgICAgIGZ1LmludFZhbFsxXSA9IG50b2hsKGZ1LmludFZhbFswXSk7CiAgICAgICAgZnUuaW50VmFsWzBdID0gdG1wOwogICAgICAgICpvcGFxdWVfbGVuID0gc2l6ZW9mKGRvdWJsZSk7CiAgICAgICAgbWVtY3B5KG9wYXF1ZV9idWYsICZmdS5jWzBdLCBzaXplb2YoZG91YmxlKSk7CiAgICAgICAgKnR5cGUgPSBBU05fT1BBUVVFX0RPVUJMRTsKICAgICAgICBERUJVR01TRygoImR1bXB2X3JlY3YiLCAiRG91YmxlOiAlbGZcbiIsIGZ1LmRvdWJsZVZhbCkpOwogICAgICAgIHJldHVybiBjcDsKCiAgICBjYXNlIEFTTl9PUEFRVUVfSTY0OgogICAgY2FzZSBBU05fT1BBUVVFX1U2NDoKICAgIGNhc2UgQVNOX09QQVFVRV9DT1VOVEVSNjQ6CiAgICBkZWZhdWx0OgogICAgICAgIHJldHVybiBjcDsgICAgICAgICAgICAgIC8qIFVucmVjb2duaXNlZCBvcGFxdWUgc3ViLXR5cGUgKi8KICAgIH0KI2Vsc2UKICAgIHJldHVybiBjcDsKI2VuZGlmCn0KCgp1X2NoYXIgICAgICAgICAqCmFnZW50eF9wYXJzZV92YXJiaW5kKHVfY2hhciAqIGRhdGEsIHNpemVfdCAqIGxlbmd0aCwgaW50ICp0eXBlLAogICAgICAgICAgICAgICAgICAgICBvaWQgKiBvaWRfYnVmLCBzaXplX3QgKiBvaWRfbGVuLAogICAgICAgICAgICAgICAgICAgICB1X2NoYXIgKiBkYXRhX2J1Ziwgc2l6ZV90ICogZGF0YV9sZW4sCiAgICAgICAgICAgICAgICAgICAgIHVfaW50IG5ldHdvcmtfYnl0ZV9vcmRlcikKewogICAgdV9jaGFyICAgICAgICAgKmJ1ZnAgPSBkYXRhOwogICAgdV9pbnQgICAgICAgICAgIGludF92YWw7CiAgICBpbnQgICAgICAgICAgICBpbnRfb2Zmc2V0OwogICAgdV9pbnQgICAgICAgICAgKmludF9wdHIgPSAodV9pbnQgKikgZGF0YV9idWY7CiAgICBzdHJ1Y3QgY291bnRlcjY0IHRtcDY0OwoKICAgIERFQlVHRFVNUEhFQURFUigicmVjdiIsICJWYXJCaW5kOiIpOwogICAgREVCVUdEVU1QSEVBREVSKCJyZWN2IiwgIlR5cGUiKTsKICAgICp0eXBlID0gYWdlbnR4X3BhcnNlX3Nob3J0KGJ1ZnAsIG5ldHdvcmtfYnl0ZV9vcmRlcik7CiAgICBERUJVR0lOREVOVExFU1MoKTsKICAgIGJ1ZnAgKz0gNDsKICAgICpsZW5ndGggLT0gNDsKCiAgICBidWZwID0gYWdlbnR4X3BhcnNlX29pZChidWZwLCBsZW5ndGgsIE5VTEwsIG9pZF9idWYsIG9pZF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXR3b3JrX2J5dGVfb3JkZXIpOwogICAgaWYgKGJ1ZnAgPT0gTlVMTCkgewogICAgICAgIERFQlVHSU5ERU5UTEVTUygpOwogICAgICAgIHJldHVybiBOVUxMOwogICAgfQoKICAgIHN3aXRjaCAoKnR5cGUpIHsKICAgIGNhc2UgQVNOX0lOVEVHRVI6CiAgICBjYXNlIEFTTl9DT1VOVEVSOgogICAgY2FzZSBBU05fR0FVR0U6CiAgICBjYXNlIEFTTl9USU1FVElDS1M6CiAgICBjYXNlIEFTTl9VSU5URUdFUjoKICAgICAgICBpbnRfdmFsID0gYWdlbnR4X3BhcnNlX2ludChidWZwLCBuZXR3b3JrX2J5dGVfb3JkZXIpOwogICAgICAgIG1lbW1vdmUoZGF0YV9idWYsICZpbnRfdmFsLCA0KTsKICAgICAgICAqZGF0YV9sZW4gPSA0OwogICAgICAgIGJ1ZnAgKz0gNDsKICAgICAgICAqbGVuZ3RoIC09IDQ7CiAgICAgICAgYnJlYWs7CgogICAgY2FzZSBBU05fT0NURVRfU1RSOgogICAgY2FzZSBBU05fSVBBRERSRVNTOgogICAgICAgIGJ1ZnAgPSBhZ2VudHhfcGFyc2Vfc3RyaW5nKGJ1ZnAsIGxlbmd0aCwgZGF0YV9idWYsIGRhdGFfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldHdvcmtfYnl0ZV9vcmRlcik7CiAgICAgICAgYnJlYWs7CgogICAgY2FzZSBBU05fT1BBUVVFOgogICAgICAgIGJ1ZnAgPSBhZ2VudHhfcGFyc2Vfb3BhcXVlKGJ1ZnAsIGxlbmd0aCwgdHlwZSwgZGF0YV9idWYsIGRhdGFfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldHdvcmtfYnl0ZV9vcmRlcik7CiAgICAgICAgYnJlYWs7CgogICAgY2FzZSBBU05fUFJJVl9JTkNMX1JBTkdFOgogICAgY2FzZSBBU05fUFJJVl9FWENMX1JBTkdFOgogICAgY2FzZSBBU05fT0JKRUNUX0lEOgogICAgICAgIGJ1ZnAgPQogICAgICAgICAgICBhZ2VudHhfcGFyc2Vfb2lkKGJ1ZnAsIGxlbmd0aCwgTlVMTCwgKG9pZCAqKSBkYXRhX2J1ZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhX2xlbiwgbmV0d29ya19ieXRlX29yZGVyKTsKICAgICAgICAqZGF0YV9sZW4gKj0gc2l6ZW9mKG9pZCk7CiAgICAgICAgLyoKICAgICAgICAgKiAnYWdlbnR4X3BhcnNlX29pZCgpJyByZXR1cm5zIHRoZSBudW1iZXIgb2Ygc3ViX2lkcyAKICAgICAgICAgKi8KICAgICAgICBicmVhazsKCiAgICBjYXNlIEFTTl9DT1VOVEVSNjQ6CiAgICAgICAgbWVtc2V0KCZ0bXA2NCwgMCwgc2l6ZW9mKHRtcDY0KSk7CiAgICAgICAgaWYgKG5ldHdvcmtfYnl0ZV9vcmRlcikgewogICAgICAgICAgICB0bXA2NC5oaWdoID0gYWdlbnR4X3BhcnNlX2ludChidWZwLCAgIG5ldHdvcmtfYnl0ZV9vcmRlcik7CiAgICAgICAgICAgIHRtcDY0LmxvdyAgPSBhZ2VudHhfcGFyc2VfaW50KGJ1ZnArNCwgbmV0d29ya19ieXRlX29yZGVyKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB0bXA2NC5oaWdoID0gYWdlbnR4X3BhcnNlX2ludChidWZwKzQsIG5ldHdvcmtfYnl0ZV9vcmRlcik7CiAgICAgICAgICAgIHRtcDY0LmxvdyAgPSBhZ2VudHhfcGFyc2VfaW50KGJ1ZnAsICAgbmV0d29ya19ieXRlX29yZGVyKTsKICAgICAgICB9CgogICAgICAgIG1lbWNweShkYXRhX2J1ZiwgJnRtcDY0LCBzaXplb2YodG1wNjQpKTsKICAgICAgICAqZGF0YV9sZW4gPSBzaXplb2YodG1wNjQpOwoJYnVmcCAgICArPSA4OwoJKmxlbmd0aCAtPSA4OwogICAgICAgIGJyZWFrOwoKICAgIGNhc2UgQVNOX05VTEw6CiAgICBjYXNlIFNOTVBfTk9TVUNIT0JKRUNUOgogICAgY2FzZSBTTk1QX05PU1VDSElOU1RBTkNFOgogICAgY2FzZSBTTk1QX0VORE9GTUlCVklFVzoKICAgICAgICAvKgogICAgICAgICAqIE5vIGRhdGEgYXNzb2NpYXRlZCB3aXRoIHRoZXNlIHR5cGVzLiAKICAgICAgICAgKi8KICAgICAgICAqZGF0YV9sZW4gPSAwOwogICAgICAgIGJyZWFrOwoKICAgIGRlZmF1bHQ6CiAgICAgICAgREVCVUdNU0coKCJyZWN2IiwgIkNhbiBub3QgcGFyc2UgdHlwZSAleCIsICp0eXBlKSk7CiAgICAgICAgREVCVUdJTkRFTlRMRVNTKCk7CiAgICAgICAgcmV0dXJuIE5VTEw7CiAgICB9CiAgICBERUJVR0lOREVOVExFU1MoKTsKICAgIHJldHVybiBidWZwOwp9CgovKgogKiAgQWdlbnRYIGhlYWRlcjoKICoKICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKICogfCAgICBoLnZlcnNpb24gIHwgICBoLnR5cGUgICAgICB8ICAgaC5mbGFncyAgICAgfCAgPHJlc2VydmVkPiAgIHwKICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKICogfCAgICAgICAgICAgICAgICAgICAgICAgaC5zZXNzaW9uSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKICogfCAgICAgICAgICAgICAgICAgICAgIGgudHJhbnNhY3Rpb25JRCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKICogfCAgICAgICAgICAgICAgICAgICAgICAgaC5wYWNrZXRJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKICogfCAgICAgICAgICAgICAgICAgICAgIGgucGF5bG9hZF9sZW5ndGggICAgICAgICAgICAgICAgICAgICAgICAgIHwKICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKICoKICogICAgVG90YWwgbGVuZ3RoID0gMjAgYnl0ZXMKICoKICogIElmIHdlIGRvbid0IHNlZW0gdG8gaGF2ZSB0aGUgZnVsbCBwYWNrZXQsIHJldHVybiBOVUxMCiAqICAgIGFuZCBsZXQgdGhlIGRyaXZpbmcgY29kZSBnbyBiYWNrIGZvciB0aGUgcmVzdC4KICogIERvbid0IHJlcG9ydCB0aGlzIGFzIGFuIGVycm9yLCBhcyBpdCdzIHF1aXRlICJub3JtYWwiCiAqICAgIHdpdGggYSBjb25uZWN0aW9uLW9yaWVudGVkIHNlcnZpY2UuCiAqCiAqICBOb3RlIHRoYXQgb25jZSB0aGUgaGVhZGVyIGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSBwcm9jZXNzZWQKICogICAgKGFuZCBoZW5jZSB3ZSBzaG91bGQgaGF2ZSB0aGUgZnVsbCBwYWNrZXQpLCBhbnkgc3Vic2VxdWVudAogKiAgICAicnVubmluZyBvdXQgb2Ygcm9vbSIgaXMgaW5kZWVkIGFuIGVycm9yLgogKi8KdV9jaGFyICAgICAgICAgKgphZ2VudHhfcGFyc2VfaGVhZGVyKG5ldHNubXBfcGR1ICpwZHUsIHVfY2hhciAqIGRhdGEsIHNpemVfdCAqIGxlbmd0aCkKewogICAgcmVnaXN0ZXIgdV9jaGFyICpidWZwID0gZGF0YTsKICAgIHNpemVfdCAgICAgICAgICBwYXlsb2FkOwoKICAgIGlmICgqbGVuZ3RoIDwgMjApIHsgICAgICAgICAvKiBJbmNvbXBsZXRlIGhlYWRlciAqLwogICAgICAgIHJldHVybiBOVUxMOwogICAgfQoKICAgIERFQlVHRFVNUEhFQURFUigicmVjdiIsICJBZ2VudFggSGVhZGVyIik7CiAgICBERUJVR0RVTVBIRUFERVIoInJlY3YiLCAiVmVyc2lvbiIpOwogICAgREVCVUdEVU1QU0VUVVAoInJlY3YiLCBidWZwLCAxKTsKICAgIHBkdS0+dmVyc2lvbiA9IEFHRU5UWF9WRVJTSU9OX0JBU0UgfCAqYnVmcDsKICAgIERFQlVHTVNHKCgiZHVtcHZfcmVjdiIsICIgIFZlcnNpb246XHQlZFxuIiwgKmJ1ZnApKTsKICAgIERFQlVHSU5ERU5UTEVTUygpOwogICAgYnVmcCsrOwoKICAgIERFQlVHRFVNUEhFQURFUigicmVjdiIsICJDb21tYW5kIik7CiAgICBERUJVR0RVTVBTRVRVUCgicmVjdiIsIGJ1ZnAsIDEpOwogICAgcGR1LT5jb21tYW5kID0gKmJ1ZnA7CiAgICBERUJVR01TRygoImR1bXB2X3JlY3YiLCAiICBDb21tYW5kOlx0JWQgKCVzKVxuIiwgKmJ1ZnAsCiAgICAgICAgICAgICAgYWdlbnR4X2NtZCgqYnVmcCkpKTsKICAgIERFQlVHSU5ERU5UTEVTUygpOwogICAgYnVmcCsrOwoKICAgIERFQlVHRFVNUEhFQURFUigicmVjdiIsICJGbGFncyIpOwogICAgREVCVUdEVU1QU0VUVVAoInJlY3YiLCBidWZwLCAxKTsKICAgIHBkdS0+ZmxhZ3MgfD0gKmJ1ZnA7CiAgICBERUJVR01TRygoImR1bXB2X3JlY3YiLCAiICBGbGFnczpcdDB4JXhcbiIsICpidWZwKSk7CiAgICBERUJVR0lOREVOVExFU1MoKTsKICAgIGJ1ZnArKzsKCiAgICBERUJVR0RVTVBIRUFERVIoInJlY3YiLCAiUmVzZXJ2ZWQgQnl0ZSIpOwogICAgREVCVUdEVU1QU0VUVVAoInJlY3YiLCBidWZwLCAxKTsKICAgIERFQlVHTVNHKCgiZHVtcHZfcmVjdiIsICIgIFJlc2VydmVkOlx0MHgleFxuIiwgKmJ1ZnApKTsKICAgIERFQlVHSU5ERU5UTEVTUygpOwogICAgYnVmcCsrOwoKICAgIERFQlVHRFVNUEhFQURFUigicmVjdiIsICJTZXNzaW9uIElEIik7CiAgICBwZHUtPnNlc3NpZCA9IGFnZW50eF9wYXJzZV9pbnQoYnVmcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZHUtPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzICYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBR0VOVFhfRkxBR1NfTkVUV09SS19CWVRFX09SREVSKTsKICAgIERFQlVHSU5ERU5UTEVTUygpOwogICAgYnVmcCArPSA0OwoKICAgIERFQlVHRFVNUEhFQURFUigicmVjdiIsICJUcmFuc2FjdGlvbiBJRCIpOwogICAgcGR1LT50cmFuc2lkID0gYWdlbnR4X3BhcnNlX2ludChidWZwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZHUtPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncyAmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFHRU5UWF9GTEFHU19ORVRXT1JLX0JZVEVfT1JERVIpOwogICAgREVCVUdJTkRFTlRMRVNTKCk7CiAgICBidWZwICs9IDQ7CgogICAgREVCVUdEVU1QSEVBREVSKCJyZWN2IiwgIlBhY2tldCBJRCIpOwogICAgcGR1LT5yZXFpZCA9IGFnZW50eF9wYXJzZV9pbnQoYnVmcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBkdS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncyAmIEFHRU5UWF9GTEFHU19ORVRXT1JLX0JZVEVfT1JERVIpOwogICAgREVCVUdJTkRFTlRMRVNTKCk7CiAgICBidWZwICs9IDQ7CgogICAgREVCVUdEVU1QSEVBREVSKCJyZWN2IiwgIlBheWxvYWQgTGVuZ3RoIik7CiAgICBwYXlsb2FkID0gYWdlbnR4X3BhcnNlX2ludChidWZwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGR1LT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzICYgQUdFTlRYX0ZMQUdTX05FVFdPUktfQllURV9PUkRFUik7CiAgICBERUJVR0lOREVOVExFU1MoKTsKICAgIGJ1ZnAgKz0gNDsKCiAgICAqbGVuZ3RoIC09IDIwOwogICAgaWYgKCpsZW5ndGggIT0gcGF5bG9hZCkgeyAgIC8qIFNob3J0IHBheWxvYWQgKi8KICAgICAgICByZXR1cm4gTlVMTDsKICAgIH0KICAgIHJldHVybiBidWZwOwp9CgoKaW50CmFnZW50eF9wYXJzZShuZXRzbm1wX3Nlc3Npb24gKiBzZXNzaW9uLCBuZXRzbm1wX3BkdSAqcGR1LCB1X2NoYXIgKiBkYXRhLAogICAgICAgICAgICAgc2l6ZV90IGxlbikKewogICAgcmVnaXN0ZXIgdV9jaGFyICpidWZwID0gZGF0YTsKICAgIHVfY2hhciAgICAgICAgICBidWZmZXJbU05NUF9NQVhfTVNHX1NJWkVdOwogICAgb2lkICAgICAgICAgICAgIG9pZF9idWZmZXJbTUFYX09JRF9MRU5dLCBlbmRfb2lkX2J1ZltNQVhfT0lEX0xFTl07CiAgICBzaXplX3QgICAgICAgICAgYnVmX2xlbiA9IHNpemVvZihidWZmZXIpOwogICAgc2l6ZV90ICAgICAgICAgIG9pZF9idWZfbGVuID0gTUFYX09JRF9MRU47CiAgICBzaXplX3QgICAgICAgICAgZW5kX29pZF9idWZfbGVuID0gTUFYX09JRF9MRU47CgogICAgaW50ICAgICAgICAgICAgIHJhbmdlX2JvdW5kOyAgICAgICAgLyogT0lELXJhbmdlIHVwcGVyIGJvdW5kICovCiAgICBpbnQgICAgICAgICAgICAgaW5jOyAgICAgICAgLyogSW5jbHVzaXZlIFNlYXJjaFJhbmdlIGZsYWcgKi8KICAgIGludCAgICAgICAgICAgICB0eXBlOyAgICAgICAvKiBWYXJCaW5kIGRhdGEgdHlwZSAqLwogICAgc2l6ZV90ICAgICAgICAgKmxlbmd0aCA9ICZsZW47CgogICAgaWYgKHBkdSA9PSBOVUxMKQogICAgICAgIHJldHVybiAoMCk7CiAKICAgIGlmICghSVNfQUdFTlRYX1ZFUlNJT04oc2Vzc2lvbi0+dmVyc2lvbikpCiAgICAgICAgcmV0dXJuIFNOTVBFUlJfQkFEX1ZFUlNJT047CgojaWZuZGVmIFNOTVBFUlJfSU5DT01QTEVURV9QQUNLRVQKICAgIC8qCiAgICAgKiAgSWRlYWxseSwgInNob3J0IiBwYWNrZXRzIG9uIHN0cmVhbSBjb25uZWN0aW9ucyBzaG91bGQKICAgICAqICAgIGJlIGhhbmRsZWQgc3BlY2lhbGx5LCBhbmQgdGhlIGRyaXZpbmcgY29kZSBzZXQgdXAgdG8KICAgICAqICAgIGtlZXAgcmVhZGluZyB1bnRpbCB0aGUgZnVsbCBwYWNrZXQgaXMgcmVjZWl2ZWQuCiAgICAgKgogICAgICogIEZvciBub3csIGxldHMgYXNzdW1lIHRoYXQgYWxsIHBhY2tldHMgYXJlIHJlYWQgaW4gb25lIGdvLgogICAgICogICAgSSd2ZSBwcm9iYWJseSBpbmZsaWN0ZWQgZW5vdWdoIGRhbWFnZSBvbiB0aGUgVUNEIGxpYnJhcnkKICAgICAqICAgIGZvciBvbmUgd2VlayEKICAgICAqCiAgICAgKiAgSSdsbCBjb21lIGJhY2sgdG8gdGhpcyBvbmNlIFdlcyBpcyBzcGVha2luZyB0byBtZSBhZ2Fpbi4KICAgICAqLwojZGVmaW5lIFNOTVBFUlJfSU5DT01QTEVURV9QQUNLRVQgU05NUEVSUl9BU05fUEFSU0VfRVJSCiNlbmRpZgoKCiAgICAvKgogICAgICogIEhhbmRsZSAoY29tbW9uKSBoZWFkZXIgLi4uLgogICAgICovCiAgICBidWZwID0gYWdlbnR4X3BhcnNlX2hlYWRlcihwZHUsIGJ1ZnAsIGxlbmd0aCk7CiAgICBpZiAoYnVmcCA9PSBOVUxMKQogICAgICAgIHJldHVybiBTTk1QRVJSX0lOQ09NUExFVEVfUEFDS0VUOyAgICAgICAvKiBpLmUuIHdhaXQgZm9yIHRoZSByZXN0ICovCgogICAgLyoKICAgICAqIENvbnRyb2wgUERVIGhhbmRsaW5nIAogICAgICovCiAgICBwZHUtPmZsYWdzIHw9IFVDRF9NU0dfRkxBR19BTFdBWVNfSU5fVklFVzsKICAgIHBkdS0+ZmxhZ3MgfD0gVUNEX01TR19GTEFHX0ZPUkNFX1BEVV9DT1BZOwogICAgcGR1LT5mbGFncyAmPSAoflVDRF9NU0dfRkxBR19SRVNQT05TRV9QRFUpOwoKICAgIC8qCiAgICAgKiAgLi4uIGFuZCAobm90LXVuLWNvbW1vbikgY29udGV4dAogICAgICovCiAgICBpZiAocGR1LT5mbGFncyAmIEFHRU5UWF9NU0dfRkxBR19OT05fREVGQVVMVF9DT05URVhUKSB7CiAgICAgICAgREVCVUdEVU1QSEVBREVSKCJyZWN2IiwgIkNvbnRleHQiKTsKICAgICAgICBidWZwID0gYWdlbnR4X3BhcnNlX3N0cmluZyhidWZwLCBsZW5ndGgsIGJ1ZmZlciwgJmJ1Zl9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGR1LT5mbGFncyAmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUdFTlRYX0ZMQUdTX05FVFdPUktfQllURV9PUkRFUik7CiAgICAgICAgREVCVUdJTkRFTlRMRVNTKCk7CiAgICAgICAgaWYgKGJ1ZnAgPT0gTlVMTCkKICAgICAgICAgICAgcmV0dXJuIFNOTVBFUlJfQVNOX1BBUlNFX0VSUjsKCiAgICAgICAgcGR1LT5jb21tdW5pdHlfbGVuID0gYnVmX2xlbjsKICAgICAgICBzbm1wX2Nsb25lX21lbSgodm9pZCAqKikgJnBkdS0+Y29tbXVuaXR5LAogICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopIGJ1ZmZlciwgKHVuc2lnbmVkKSBidWZfbGVuKTsKICAgICAgICBidWZfbGVuID0gc2l6ZW9mKGJ1ZmZlcik7CiAgICB9CgogICAgREVCVUdEVU1QSEVBREVSKCJyZWN2IiwgIlBEVSIpOwogICAgREVCVUdJTkRFTlRNT1JFKCk7CiAgICBzd2l0Y2ggKHBkdS0+Y29tbWFuZCkgewogICAgY2FzZSBBR0VOVFhfTVNHX09QRU46CiAgICAgICAgcGR1LT50aW1lID0gKmJ1ZnA7ICAgICAgLyogVGltZW91dCAqLwogICAgICAgIGJ1ZnAgKz0gNDsKICAgICAgICAqbGVuZ3RoIC09IDQ7CgogICAgICAgIC8qCiAgICAgICAgICogU3RvcmUgc3ViYWdlbnQgT0lEICYgZGVzY3JpcHRpb24gaW4gYSBWYXJCaW5kIAogICAgICAgICAqLwogICAgICAgIERFQlVHRFVNUEhFQURFUigicmVjdiIsICJTdWJhZ2VudCBPSUQiKTsKICAgICAgICBidWZwID0gYWdlbnR4X3BhcnNlX29pZChidWZwLCBsZW5ndGgsIE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2lkX2J1ZmZlciwgJm9pZF9idWZfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBkdS0+ZmxhZ3MgJiBBR0VOVFhfRkxBR1NfTkVUV09SS19CWVRFX09SREVSKTsKICAgICAgICBERUJVR0lOREVOVExFU1MoKTsKICAgICAgICBpZiAoYnVmcCA9PSBOVUxMKSB7CiAgICAgICAgICAgIERFQlVHSU5ERU5UTEVTUygpOwogICAgICAgICAgICByZXR1cm4gU05NUEVSUl9BU05fUEFSU0VfRVJSOwogICAgICAgIH0KICAgICAgICBERUJVR0RVTVBIRUFERVIoInJlY3YiLCAiU3ViYWdlbnQgRGVzY3JpcHRpb24iKTsKICAgICAgICBidWZwID0gYWdlbnR4X3BhcnNlX3N0cmluZyhidWZwLCBsZW5ndGgsIGJ1ZmZlciwgJmJ1Zl9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGR1LT5mbGFncyAmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUdFTlRYX0ZMQUdTX05FVFdPUktfQllURV9PUkRFUik7CiAgICAgICAgREVCVUdJTkRFTlRMRVNTKCk7CiAgICAgICAgaWYgKGJ1ZnAgPT0gTlVMTCkgewogICAgICAgICAgICBERUJVR0lOREVOVExFU1MoKTsKICAgICAgICAgICAgcmV0dXJuIFNOTVBFUlJfQVNOX1BBUlNFX0VSUjsKICAgICAgICB9CiAgICAgICAgc25tcF9wZHVfYWRkX3ZhcmlhYmxlKHBkdSwgb2lkX2J1ZmZlciwgb2lkX2J1Zl9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFTTl9PQ1RFVF9TVFIsIGJ1ZmZlciwgYnVmX2xlbik7CgogICAgICAgIG9pZF9idWZfbGVuID0gTUFYX09JRF9MRU47CiAgICAgICAgYnVmX2xlbiA9IHNpemVvZihidWZmZXIpOwogICAgICAgIGJyZWFrOwoKICAgIGNhc2UgQUdFTlRYX01TR19DTE9TRToKICAgICAgICBwZHUtPmVycnN0YXQgPSAqYnVmcDsgICAvKiBSZWFzb24gKi8KICAgICAgICBidWZwICs9IDQ7CiAgICAgICAgKmxlbmd0aCAtPSA0OwoKICAgICAgICBicmVhazsKCiAgICBjYXNlIEFHRU5UWF9NU0dfVU5SRUdJU1RFUjoKICAgIGNhc2UgQUdFTlRYX01TR19SRUdJU1RFUjoKICAgICAgICBERUJVR0RVTVBIRUFERVIoInJlY3YiLCAiUmVnaXN0cmF0aW9uIEhlYWRlciIpOwogICAgICAgIGlmIChwZHUtPmNvbW1hbmQgPT0gQUdFTlRYX01TR19SRUdJU1RFUikgewogICAgICAgICAgICBwZHUtPnRpbWUgPSAqYnVmcDsgIC8qIFRpbWVvdXQgKFJlZ2lzdGVyIG9ubHkpICovCiAgICAgICAgICAgIERFQlVHRFVNUFNFVFVQKCJyZWN2IiwgYnVmcCwgMSk7CiAgICAgICAgICAgIERFQlVHTVNHKCgiZHVtcHZfcmVjdiIsICIgIFRpbWVvdXQ6ICAgICBcdCVkXG4iLCAqYnVmcCkpOwogICAgICAgIH0KICAgICAgICBidWZwKys7CiAgICAgICAgcGR1LT5wcmlvcml0eSA9ICpidWZwOwogICAgICAgIERFQlVHRFVNUFNFVFVQKCJyZWN2IiwgYnVmcCwgMSk7CiAgICAgICAgREVCVUdNU0coKCJkdW1wdl9yZWN2IiwgIiAgUHJpb3JpdHk6ICAgIFx0JWRcbiIsICpidWZwKSk7CiAgICAgICAgYnVmcCsrOwogICAgICAgIHBkdS0+cmFuZ2Vfc3ViaWQgPSAqYnVmcDsKICAgICAgICBERUJVR0RVTVBTRVRVUCgicmVjdiIsIGJ1ZnAsIDEpOwogICAgICAgIERFQlVHTVNHKCgiZHVtcHZfcmVjdiIsICIgIFJhbmdlIFN1Yi1JZDpcdCVkXG4iLCAqYnVmcCkpOwogICAgICAgIGJ1ZnArKzsKICAgICAgICBidWZwKys7CiAgICAgICAgKmxlbmd0aCAtPSA0OwogICAgICAgIERFQlVHSU5ERU5UTEVTUygpOwoKICAgICAgICBERUJVR0RVTVBIRUFERVIoInJlY3YiLCAiUmVnaXN0cmF0aW9uIE9JRCIpOwogICAgICAgIGJ1ZnAgPSBhZ2VudHhfcGFyc2Vfb2lkKGJ1ZnAsIGxlbmd0aCwgTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvaWRfYnVmZmVyLCAmb2lkX2J1Zl9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGR1LT5mbGFncyAmIEFHRU5UWF9GTEFHU19ORVRXT1JLX0JZVEVfT1JERVIpOwogICAgICAgIERFQlVHSU5ERU5UTEVTUygpOwogICAgICAgIGlmIChidWZwID09IE5VTEwpIHsKICAgICAgICAgICAgREVCVUdJTkRFTlRMRVNTKCk7CiAgICAgICAgICAgIHJldHVybiBTTk1QRVJSX0FTTl9QQVJTRV9FUlI7CiAgICAgICAgfQoKICAgICAgICBpZiAocGR1LT5yYW5nZV9zdWJpZCkgewogICAgICAgICAgICByYW5nZV9ib3VuZCA9IGFnZW50eF9wYXJzZV9pbnQoYnVmcCwgcGR1LT5mbGFncyAmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBR0VOVFhfRkxBR1NfTkVUV09SS19CWVRFX09SREVSKTsKICAgICAgICAgICAgYnVmcCArPSA0OwogICAgICAgICAgICAqbGVuZ3RoIC09IDQ7CgogICAgICAgICAgICAvKgogICAgICAgICAgICAgKiBDb25zdHJ1Y3QgdGhlIGVuZC1PSUQuICAKICAgICAgICAgICAgICovCiAgICAgICAgICAgIGVuZF9vaWRfYnVmX2xlbiA9IG9pZF9idWZfbGVuICogc2l6ZW9mKG9pZCk7CiAgICAgICAgICAgIG1lbWNweShlbmRfb2lkX2J1Ziwgb2lkX2J1ZmZlciwgZW5kX29pZF9idWZfbGVuKTsKICAgICAgICAgICAgZW5kX29pZF9idWZbcGR1LT5yYW5nZV9zdWJpZCAtIDFdID0gcmFuZ2VfYm91bmQ7CgogICAgICAgICAgICBzbm1wX3BkdV9hZGRfdmFyaWFibGUocGR1LCBvaWRfYnVmZmVyLCBvaWRfYnVmX2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFTTl9QUklWX0lOQ0xfUkFOR0UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodV9jaGFyICopIGVuZF9vaWRfYnVmLCBlbmRfb2lkX2J1Zl9sZW4pOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHNubXBfYWRkX251bGxfdmFyKHBkdSwgb2lkX2J1ZmZlciwgb2lkX2J1Zl9sZW4pOwogICAgICAgIH0KCiAgICAgICAgb2lkX2J1Zl9sZW4gPSBNQVhfT0lEX0xFTjsKICAgICAgICBicmVhazsKCiAgICBjYXNlIEFHRU5UWF9NU0dfR0VUQlVMSzoKICAgICAgICBERUJVR0RVTVBIRUFERVIoInJlY3YiLCAiTm9uLXJlcGVhdGVycyIpOwogICAgICAgIHBkdS0+bm9uX3JlcGVhdGVycyA9IGFnZW50eF9wYXJzZV9zaG9ydChidWZwLCBwZHUtPmZsYWdzICYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUdFTlRYX0ZMQUdTX05FVFdPUktfQllURV9PUkRFUik7CiAgICAgICAgREVCVUdJTkRFTlRMRVNTKCk7CiAgICAgICAgREVCVUdEVU1QSEVBREVSKCJyZWN2IiwgIk1heC1yZXBlYXRlcnMiKTsKICAgICAgICBwZHUtPm1heF9yZXBldGl0aW9ucyA9IGFnZW50eF9wYXJzZV9zaG9ydChidWZwICsgMiwgcGR1LT5mbGFncyAmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUdFTlRYX0ZMQUdTX05FVFdPUktfQllURV9PUkRFUik7CiAgICAgICAgREVCVUdJTkRFTlRMRVNTKCk7CiAgICAgICAgYnVmcCArPSA0OwogICAgICAgICpsZW5ndGggLT0gNDsKICAgICAgICAvKgogICAgICAgICAqIEZhbGx0aHJvdWdoIC0gU2VhcmNoUmFuZ2UgaGFuZGxpbmcgaXMgdGhlIHNhbWUgCiAgICAgICAgICovCgogICAgY2FzZSBBR0VOVFhfTVNHX0dFVE5FWFQ6CiAgICBjYXNlIEFHRU5UWF9NU0dfR0VUOgoKICAgICAgICAvKgogICAgICAgICAqICogIFNlYXJjaFJhbmdlIExpc3QKICAgICAgICAgKiAqICBLZWVwIGdvaW5nIHdoaWxlIHdlIGhhdmUgZGF0YSBsZWZ0CiAgICAgICAgICovCiAgICAgICAgREVCVUdEVU1QSEVBREVSKCJyZWN2IiwgIlNlYXJjaCBSYW5nZSIpOwogICAgICAgIHdoaWxlICgqbGVuZ3RoID4gMCkgewogICAgICAgICAgICBidWZwID0gYWdlbnR4X3BhcnNlX29pZChidWZwLCBsZW5ndGgsICZpbmMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9pZF9idWZmZXIsICZvaWRfYnVmX2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGR1LT5mbGFncyAmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFHRU5UWF9GTEFHU19ORVRXT1JLX0JZVEVfT1JERVIpOwogICAgICAgICAgICBpZiAoYnVmcCA9PSBOVUxMKSB7CiAgICAgICAgICAgICAgICBERUJVR0lOREVOVExFU1MoKTsKICAgICAgICAgICAgICAgIERFQlVHSU5ERU5UTEVTUygpOwogICAgICAgICAgICAgICAgcmV0dXJuIFNOTVBFUlJfQVNOX1BBUlNFX0VSUjsKICAgICAgICAgICAgfQogICAgICAgICAgICBidWZwID0gYWdlbnR4X3BhcnNlX29pZChidWZwLCBsZW5ndGgsIE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZF9vaWRfYnVmLCAmZW5kX29pZF9idWZfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZHUtPmZsYWdzICYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUdFTlRYX0ZMQUdTX05FVFdPUktfQllURV9PUkRFUik7CiAgICAgICAgICAgIGlmIChidWZwID09IE5VTEwpIHsKICAgICAgICAgICAgICAgIERFQlVHSU5ERU5UTEVTUygpOwogICAgICAgICAgICAgICAgREVCVUdJTkRFTlRMRVNTKCk7CiAgICAgICAgICAgICAgICByZXR1cm4gU05NUEVSUl9BU05fUEFSU0VfRVJSOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVuZF9vaWRfYnVmX2xlbiAqPSBzaXplb2Yob2lkKTsKICAgICAgICAgICAgLyoKICAgICAgICAgICAgICogJ2FnZW50eF9wYXJzZV9vaWQoKScgcmV0dXJucyB0aGUgbnVtYmVyIG9mIHN1Yl9pZHMgCiAgICAgICAgICAgICAqLwoKICAgICAgICAgICAgaWYgKGluYykgewogICAgICAgICAgICAgICAgc25tcF9wZHVfYWRkX3ZhcmlhYmxlKHBkdSwgb2lkX2J1ZmZlciwgb2lkX2J1Zl9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVNOX1BSSVZfSU5DTF9SQU5HRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodV9jaGFyICopIGVuZF9vaWRfYnVmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZF9vaWRfYnVmX2xlbik7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBzbm1wX3BkdV9hZGRfdmFyaWFibGUocGR1LCBvaWRfYnVmZmVyLCBvaWRfYnVmX2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBU05fUFJJVl9FWENMX1JBTkdFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1X2NoYXIgKikgZW5kX29pZF9idWYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kX29pZF9idWZfbGVuKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBvaWRfYnVmX2xlbiA9IE1BWF9PSURfTEVOOwogICAgICAgICAgICBlbmRfb2lkX2J1Zl9sZW4gPSBNQVhfT0lEX0xFTjsKICAgICAgICB9CgogICAgICAgIERFQlVHSU5ERU5UTEVTUygpOwogICAgICAgIGJyZWFrOwoKCiAgICBjYXNlIEFHRU5UWF9NU0dfUkVTUE9OU0U6CgogICAgICAgIHBkdS0+ZmxhZ3MgfD0gVUNEX01TR19GTEFHX1JFU1BPTlNFX1BEVTsKCiAgICAgICAgLyoKICAgICAgICAgKiBzeXNVcFRpbWUgCiAgICAgICAgICovCiAgICAgICAgcGR1LT50aW1lID0gYWdlbnR4X3BhcnNlX2ludChidWZwLCBwZHUtPmZsYWdzICYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFHRU5UWF9GTEFHU19ORVRXT1JLX0JZVEVfT1JERVIpOwogICAgICAgIGJ1ZnAgKz0gNDsKICAgICAgICAqbGVuZ3RoIC09IDQ7CgogICAgICAgIHBkdS0+ZXJyc3RhdCA9IGFnZW50eF9wYXJzZV9zaG9ydChidWZwLCBwZHUtPmZsYWdzICYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUdFTlRYX0ZMQUdTX05FVFdPUktfQllURV9PUkRFUik7CiAgICAgICAgcGR1LT5lcnJpbmRleCA9CiAgICAgICAgICAgIGFnZW50eF9wYXJzZV9zaG9ydChidWZwICsgMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBkdS0+ZmxhZ3MgJiBBR0VOVFhfRkxBR1NfTkVUV09SS19CWVRFX09SREVSKTsKICAgICAgICBidWZwICs9IDQ7CiAgICAgICAgKmxlbmd0aCAtPSA0OwogICAgICAgIC8qCiAgICAgICAgICogRmFsbHRocm91Z2ggLSBWYXJCaW5kIGhhbmRsaW5nIGlzIHRoZSBzYW1lIAogICAgICAgICAqLwoKICAgIGNhc2UgQUdFTlRYX01TR19JTkRFWF9BTExPQ0FURToKICAgIGNhc2UgQUdFTlRYX01TR19JTkRFWF9ERUFMTE9DQVRFOgogICAgY2FzZSBBR0VOVFhfTVNHX05PVElGWToKICAgIGNhc2UgQUdFTlRYX01TR19URVNUU0VUOgoKICAgICAgICAvKgogICAgICAgICAqICogIFZhckJpbmQgTGlzdAogICAgICAgICAqICogIEtlZXAgZ29pbmcgd2hpbGUgd2UgaGF2ZSBkYXRhIGxlZnQKICAgICAgICAgKi8KCiAgICAgICAgREVCVUdEVU1QSEVBREVSKCJyZWN2IiwgIlZhckJpbmRMaXN0Iik7CiAgICAgICAgd2hpbGUgKCpsZW5ndGggPiAwKSB7CiAgICAgICAgICAgIGJ1ZnAgPSBhZ2VudHhfcGFyc2VfdmFyYmluZChidWZwLCBsZW5ndGgsICZ0eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2lkX2J1ZmZlciwgJm9pZF9idWZfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLCAmYnVmX2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBkdS0+ZmxhZ3MgJgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUdFTlRYX0ZMQUdTX05FVFdPUktfQllURV9PUkRFUik7CiAgICAgICAgICAgIGlmIChidWZwID09IE5VTEwpIHsKICAgICAgICAgICAgICAgIERFQlVHSU5ERU5UTEVTUygpOwogICAgICAgICAgICAgICAgREVCVUdJTkRFTlRMRVNTKCk7CiAgICAgICAgICAgICAgICByZXR1cm4gU05NUEVSUl9BU05fUEFSU0VfRVJSOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHNubXBfcGR1X2FkZF92YXJpYWJsZShwZHUsIG9pZF9idWZmZXIsIG9pZF9idWZfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVfY2hhcikgdHlwZSwgYnVmZmVyLCBidWZfbGVuKTsKCiAgICAgICAgICAgIG9pZF9idWZfbGVuID0gTUFYX09JRF9MRU47CiAgICAgICAgICAgIGJ1Zl9sZW4gPSBzaXplb2YoYnVmZmVyKTsKICAgICAgICB9CiAgICAgICAgREVCVUdJTkRFTlRMRVNTKCk7CiAgICAgICAgYnJlYWs7CgogICAgY2FzZSBBR0VOVFhfTVNHX0NPTU1JVFNFVDoKICAgIGNhc2UgQUdFTlRYX01TR19VTkRPU0VUOgogICAgY2FzZSBBR0VOVFhfTVNHX0NMRUFOVVBTRVQ6CiAgICBjYXNlIEFHRU5UWF9NU0dfUElORzoKCiAgICAgICAgLyoKICAgICAgICAgKiAiRW1wdHkiIHBhY2tldCAKICAgICAgICAgKi8KICAgICAgICBicmVhazsKCgogICAgY2FzZSBBR0VOVFhfTVNHX0FERF9BR0VOVF9DQVBTOgogICAgICAgIC8qCiAgICAgICAgICogU3RvcmUgQWdlbnRDYXAgT0lEICYgZGVzY3JpcHRpb24gaW4gYSBWYXJCaW5kIAogICAgICAgICAqLwogICAgICAgIGJ1ZnAgPSBhZ2VudHhfcGFyc2Vfb2lkKGJ1ZnAsIGxlbmd0aCwgTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvaWRfYnVmZmVyLCAmb2lkX2J1Zl9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGR1LT5mbGFncyAmIEFHRU5UWF9GTEFHU19ORVRXT1JLX0JZVEVfT1JERVIpOwogICAgICAgIGlmIChidWZwID09IE5VTEwpCiAgICAgICAgICAgIHJldHVybiBTTk1QRVJSX0FTTl9QQVJTRV9FUlI7CiAgICAgICAgYnVmcCA9IGFnZW50eF9wYXJzZV9zdHJpbmcoYnVmcCwgbGVuZ3RoLCBidWZmZXIsICZidWZfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBkdS0+ZmxhZ3MgJgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFHRU5UWF9GTEFHU19ORVRXT1JLX0JZVEVfT1JERVIpOwogICAgICAgIGlmIChidWZwID09IE5VTEwpCiAgICAgICAgICAgIHJldHVybiBTTk1QRVJSX0FTTl9QQVJTRV9FUlI7CiAgICAgICAgc25tcF9wZHVfYWRkX3ZhcmlhYmxlKHBkdSwgb2lkX2J1ZmZlciwgb2lkX2J1Zl9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFTTl9PQ1RFVF9TVFIsIGJ1ZmZlciwgYnVmX2xlbik7CgogICAgICAgIG9pZF9idWZfbGVuID0gTUFYX09JRF9MRU47CiAgICAgICAgYnVmX2xlbiA9IHNpemVvZihidWZmZXIpOwogICAgICAgIGJyZWFrOwoKICAgIGNhc2UgQUdFTlRYX01TR19SRU1PVkVfQUdFTlRfQ0FQUzoKICAgICAgICAvKgogICAgICAgICAqIFN0b3JlIEFnZW50Q2FwIE9JRCAmIGRlc2NyaXB0aW9uIGluIGEgVmFyQmluZCAKICAgICAgICAgKi8KICAgICAgICBidWZwID0gYWdlbnR4X3BhcnNlX29pZChidWZwLCBsZW5ndGgsIE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2lkX2J1ZmZlciwgJm9pZF9idWZfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBkdS0+ZmxhZ3MgJiBBR0VOVFhfRkxBR1NfTkVUV09SS19CWVRFX09SREVSKTsKICAgICAgICBpZiAoYnVmcCA9PSBOVUxMKQogICAgICAgICAgICByZXR1cm4gU05NUEVSUl9BU05fUEFSU0VfRVJSOwogICAgICAgIHNubXBfYWRkX251bGxfdmFyKHBkdSwgb2lkX2J1ZmZlciwgb2lkX2J1Zl9sZW4pOwoKICAgICAgICBvaWRfYnVmX2xlbiA9IE1BWF9PSURfTEVOOwogICAgICAgIGJyZWFrOwoKICAgIGRlZmF1bHQ6CiAgICAgICAgREVCVUdJTkRFTlRMRVNTKCk7CiAgICAgICAgREVCVUdJTkRFTlRMRVNTKCk7CiAgICAgICAgREVCVUdNU0dUTCgoImFnZW50eCIsICJVbnJlY29nbmlzZWQgUERVIHR5cGU6ICVkXG4iLAogICAgICAgICAgICAgICAgICAgIHBkdS0+Y29tbWFuZCkpOwogICAgICAgIHJldHVybiBTTk1QRVJSX1VOS05PV05fUERVOwogICAgfQogICAgREVCVUdJTkRFTlRMRVNTKCk7CiAgICBERUJVR0lOREVOVExFU1MoKTsKICAgIERFQlVHSU5ERU5UTEVTUygpOwogICAgcmV0dXJuIFNOTVBfRVJSX05PRVJST1I7Cn0KCgoKCiNpZmRlZiBURVNUSU5HCgp0ZXN0aXQobmV0c25tcF9wZHUgKnBkdTEpCnsKICAgIGNoYXIgICAgICAgICAgICBwYWNrZXQxW0JVRlNJWl07CiAgICBjaGFyICAgICAgICAgICAgcGFja2V0MltCVUZTSVpdOwogICAgaW50ICAgICAgICAgICAgIGxlbjEsIGxlbjI7CiAgICBuZXRzbm1wX3BkdSAgICAgcGR1MjsKICAgIG5ldHNubXBfc2Vzc2lvbiBzZXNzOwoKICAgIG1lbXNldCgmcGR1MiwgMCwgc2l6ZW9mKG5ldHNubXBfcGR1KSk7CiAgICBtZW1zZXQocGFja2V0MSwgMCwgQlVGU0laKTsKICAgIG1lbXNldChwYWNrZXQyLCAwLCBCVUZTSVopOwoKICAgIC8qCiAgICAgKiBFbmNvZGUgdGhpcyBpbnRvIGEgInBhY2tldCIgCiAgICAgKi8KICAgIGxlbjEgPSBCVUZTSVo7CiAgICBpZiAoYWdlbnR4X2J1aWxkKCZzZXNzLCBwZHUxLCBwYWNrZXQxLCAmbGVuMSkgPCAwKSB7CiAgICAgICAgREVCVUdNU0dUTCgoImFnZW50eCIsICJGaXJzdCBidWlsZCBmYWlsZWRcbiIpKTsKICAgICAgICBleGl0KDEpOwogICAgfQoKICAgIERFQlVHTVNHVEwoKCJhZ2VudHgiLCAiRmlyc3QgYnVpbGQgc3VjY2VlZGVkOlxuIikpOwogICAgeGR1bXAocGFja2V0MSwgbGVuMSwgIkF4MT4gIik7CgogICAgLyoKICAgICAqIFVucGFjayB0aGlzIGludG8gYSBQRFUgCiAgICAgKi8KICAgIGxlbjIgPSBsZW4xOwogICAgaWYgKGFnZW50eF9wYXJzZSgmcGR1MiwgcGFja2V0MSwgJmxlbjIsICh1X2NoYXIgKiopIE5VTEwpIDwgMCkgewogICAgICAgIERFQlVHTVNHVEwoKCJhZ2VudHgiLCAiRmlyc3QgcGFyc2UgZmFpbGVkXG4iKSk7CiAgICAgICAgZXhpdCgxKTsKICAgIH0KICAgIERFQlVHTVNHVEwoKCJhZ2VudHgiLCAiRmlyc3QgcGFyc2Ugc3VjY2VlZGVkOlxuIikpOwogICAgaWYgKGxlbjIgIT0gMCkKICAgICAgICBERUJVR01TR1RMKCgiYWdlbnR4IiwKICAgICAgICAgICAgICAgICAgICAiV2FybmluZyAtIHBhcnNlZCBwYWNrZXQgaGFzICVkIGJ5dGVzIGxlZnRcbiIsIGxlbjIpKTsKCiAgICAvKgogICAgICogRW5jb2RlIHRoaXMgaW50byBhbm90aGVyICJwYWNrZXQiIAogICAgICovCiAgICBsZW4yID0gQlVGU0laOwogICAgaWYgKGFnZW50eF9idWlsZCgmc2VzcywgJnBkdTIsIHBhY2tldDIsICZsZW4yKSA8IDApIHsKICAgICAgICBERUJVR01TR1RMKCgiYWdlbnR4IiwgIlNlY29uZCBidWlsZCBmYWlsZWRcbiIpKTsKICAgICAgICBleGl0KDEpOwogICAgfQoKICAgIERFQlVHTVNHVEwoKCJhZ2VudHgiLCAiU2Vjb25kIGJ1aWxkIHN1Y2NlZWRlZDpcbiIpKTsKICAgIHhkdW1wKHBhY2tldDIsIGxlbjIsICJBeDI+ICIpOwoKICAgIC8qCiAgICAgKiBDb21wYXJlIHRoZSByZXN1bHRzIAogICAgICovCiAgICBpZiAobGVuMSAhPSBsZW4yKSB7CiAgICAgICAgREVCVUdNU0dUTCgoImFnZW50eCIsCiAgICAgICAgICAgICAgICAgICAgIkVycm9yOiBmaXJzdCBidWlsZCAoJWQpIGlzIGRpZmZlcmVudCB0byBzZWNvbmQgKCVkKVxuIiwKICAgICAgICAgICAgICAgICAgICBsZW4xLCBsZW4yKSk7CiAgICAgICAgZXhpdCgxKTsKICAgIH0KICAgIGlmIChtZW1jbXAocGFja2V0MSwgcGFja2V0MiwgbGVuMSkgIT0gMCkgewogICAgICAgIERFQlVHTVNHVEwoKCJhZ2VudHgiLAogICAgICAgICAgICAgICAgICAgICJFcnJvcjogZmlyc3QgYnVpbGQgZGF0YSBpcyBkaWZmZXJlbnQgdG8gc2Vjb25kXG4iKSk7CiAgICAgICAgZXhpdCgxKTsKICAgIH0KCiAgICBERUJVR01TR1RMKCgiYWdlbnR4IiwgIk9LXG4iKSk7Cn0KCgoKbWFpbigpCnsKICAgIG5ldHNubXBfcGR1ICAgICBwZHUxOwogICAgb2lkICAgICAgICAgICAgIG9pZF9idWZbXSA9IHsgMSwgMywgNiwgMSwgMiwgMSwgMTAgfTsKICAgIG9pZCAgICAgICAgICAgICBvaWRfYnVmMltdID0geyAxLCAzLCA2LCAxLCAyLCAxLCAyMCB9OwogICAgb2lkICAgICAgICAgICAgIG51bGxfb2lkW10gPSB7IDAsIDAgfTsKICAgIGNoYXIgICAgICAgICAgICpzdHJpbmcgPSAiRXhhbXBsZSBzdHJpbmciOwogICAgY2hhciAgICAgICAgICAgKmNvbnRleHQgPSAiTFVDUyI7CgoKICAgIC8qCiAgICAgKiBDcmVhdGUgYW4gZXhhbXBsZSBBZ2VudFggcGR1IHN0cnVjdHVyZSAKICAgICAqLwoKICAgIG1lbXNldCgmcGR1MSwgMCwgc2l6ZW9mKG5ldHNubXBfcGR1KSk7CiAgICBwZHUxLmNvbW1hbmQgPSBBR0VOVFhfTVNHX1RFU1RTRVQ7CiAgICBwZHUxLmZsYWdzID0gMDsKICAgIHBkdTEuc2Vzc2lkID0gMTY7CiAgICBwZHUxLnRyYW5zaWQgPSAyNDsKICAgIHBkdTEucmVxaWQgPSAxMzI7CgogICAgcGR1MS50aW1lID0gMTA7CiAgICBwZHUxLm5vbl9yZXBlYXRlcnMgPSAzOwogICAgcGR1MS5tYXhfcmVwZXRpdGlvbnMgPSAzMjsKICAgIHBkdTEucHJpb3JpdHkgPSA1OwogICAgcGR1MS5yYW5nZV9zdWJpZCA9IDA7CgogICAgc25tcF9wZHVfYWRkX3ZhcmlhYmxlKCZwZHUxLCBvaWRfYnVmLCBzaXplb2Yob2lkX2J1ZikgLyBzaXplb2Yob2lkKSwKICAgICAgICAgICAgICAgICAgICAgICAgICBBU05fT0JKRUNUX0lELCAoY2hhciAqKSBvaWRfYnVmMiwKICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yob2lkX2J1ZjIpKTsKICAgIHNubXBfcGR1X2FkZF92YXJpYWJsZSgmcGR1MSwgb2lkX2J1Ziwgc2l6ZW9mKG9pZF9idWYpIC8gc2l6ZW9mKG9pZCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgQVNOX0lOVEVHRVIsIChjaGFyICopICZwZHUxLnJlcWlkLAogICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihwZHUxLnJlcWlkKSk7CiAgICBzbm1wX3BkdV9hZGRfdmFyaWFibGUoJnBkdTEsIG9pZF9idWYsIHNpemVvZihvaWRfYnVmKSAvIHNpemVvZihvaWQpLAogICAgICAgICAgICAgICAgICAgICAgICAgIEFTTl9PQ1RFVF9TVFIsIChjaGFyICopIHN0cmluZywgc3RybGVuKHN0cmluZykpOwoKICAgIHByaW50ZigiVGVzdCB3aXRoIG5vbi1uZXR3b3JrIG9yZGVyLi4uLi5cbiIpOwogICAgdGVzdGl0KCZwZHUxKTsKCiAgICBwcmludGYoIlxuVGVzdCB3aXRoIG5ldHdvcmsgb3JkZXIuLi4uLlxuIik7CiAgICBwZHUxLmZsYWdzIHw9IEFHRU5UWF9GTEFHU19ORVRXT1JLX0JZVEVfT1JERVI7CiAgICB0ZXN0aXQoJnBkdTEpOwoKICAgIHBkdTEuY29tbXVuaXR5ID0gY29udGV4dDsKICAgIHBkdTEuY29tbXVuaXR5X2xlbiA9IHN0cmxlbihjb250ZXh0KTsKICAgIHBkdTEuZmxhZ3MgfD0gQUdFTlRYX0ZMQUdTX05PTl9ERUZBVUxUX0NPTlRFWFQ7CiAgICBwcmludGYoIlRlc3Qgd2l0aCBub24tZGVmYXVsdCBjb250ZXh0Li4uLi5cbiIpOwogICAgdGVzdGl0KCZwZHUxKTsKCgp9CiNlbmRpZgoKLyoKICogcmV0dXJucyB0aGUgcHJvcGVyIGxlbmd0aCBvZiBhbiBpbmNvbWluZyBhZ2VudHggcGFja2V0LiAKICovCi8qCiAqICAgICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCiAqICAgIHwgICBoLnZlcnNpb24gICB8ICAgIGgudHlwZSAgICAgfCAgICBoLmZsYWdzICAgIHwgIDxyZXNlcnZlZD4gICB8CiAqICAgICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCiAqICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgIGguc2Vzc2lvbklEICAgICAgICAgICAgICAgICAgICAgICAgICB8CiAqICAgICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCiAqICAgIHwgICAgICAgICAgICAgICAgICAgICAgICBoLnRyYW5zYWN0aW9uSUQgICAgICAgICAgICAgICAgICAgICAgICB8CiAqICAgICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCiAqICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgIGgucGFja2V0SUQgICAgICAgICAgICAgICAgICAgICAgICAgICB8CiAqICAgICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCiAqICAgIHwgICAgICAgICAgICAgICAgICAgICAgICBoLnBheWxvYWRfbGVuZ3RoICAgICAgICAgICAgICAgICAgICAgICB8CiAqICAgICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCiAqICAgIDIwIGJ5dGVzIGluIGhlYWRlcgogKi8KCmludAphZ2VudHhfY2hlY2tfcGFja2V0KHVfY2hhciAqIHBhY2tldCwgc2l6ZV90IHBhY2tldF9sZW4pCnsKCiAgICBpZiAocGFja2V0X2xlbiA8IDIwKQogICAgICAgIHJldHVybiAwOyAgICAgICAgICAgICAgIC8qIG1pbmltdW0gaGVhZGVyIGxlbmd0aCA9PSAyMCAqLwoKICAgIHJldHVybiBhZ2VudHhfcGFyc2VfaW50KHBhY2tldCArIDE2LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgKihwYWNrZXQgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyKSAmIEFHRU5UWF9GTEFHU19ORVRXT1JLX0JZVEVfT1JERVIpICsgMjA7Cn0K