LyogUG9ydGlvbnMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29weXJpZ2h0KHMpLiAgU2VlCiAqIHRoZSBOZXQtU05NUCdzIENPUFlJTkcgZmlsZSBmb3IgbW9yZSBkZXRhaWxzIGFuZCBvdGhlciBjb3B5cmlnaHRzCiAqIHRoYXQgbWF5IGFwcGx5OgogKi8KLyoKICogUG9ydGlvbnMgb2YgdGhpcyBmaWxlIGFyZSBjb3B5cmlnaHRlZCBieToKICogQ29weXJpZ2h0IKkgMjAwMyBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAqIFVzZSBpcyBzdWJqZWN0IHRvIGxpY2Vuc2UgdGVybXMgc3BlY2lmaWVkIGluIHRoZSBDT1BZSU5HIGZpbGUKICogZGlzdHJpYnV0ZWQgd2l0aCB0aGUgTmV0LVNOTVAgcGFja2FnZS4KICovCgojaW5jbHVkZSA8bmV0LXNubXAvbmV0LXNubXAtY29uZmlnLmg+CgojaW5jbHVkZSA8c3RkaW8uaD4KI2luY2x1ZGUgPGVycm5vLmg+CiNpZiBIQVZFX1NURExJQl9ICiNpbmNsdWRlIDxzdGRsaWIuaD4KI2VuZGlmCiNpZiBIQVZFX1NUUklOR19ICiNpbmNsdWRlIDxzdHJpbmcuaD4KI2Vsc2UKI2luY2x1ZGUgPHN0cmluZ3MuaD4KI2VuZGlmCiNpZiBIQVZFX1VOSVNURF9ICiNpbmNsdWRlIDx1bmlzdGQuaD4KI2VuZGlmCiNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KI2lmIFRJTUVfV0lUSF9TWVNfVElNRQojIGluY2x1ZGUgPHN5cy90aW1lLmg+CiMgaW5jbHVkZSA8dGltZS5oPgojZWxzZQojIGlmIEhBVkVfU1lTX1RJTUVfSAojICBpbmNsdWRlIDxzeXMvdGltZS5oPgojIGVsc2UKIyAgaW5jbHVkZSA8dGltZS5oPgojIGVuZGlmCiNlbmRpZgojaWYgSEFWRV9ORVRJTkVUX0lOX0gKI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KI2VuZGlmCiNpZiBIQVZFX0FSUEFfSU5FVF9ICiNpbmNsdWRlIDxhcnBhL2luZXQuaD4KI2VuZGlmCgojaW5jbHVkZSA8bmV0LXNubXAvbmV0LXNubXAtaW5jbHVkZXMuaD4KCiNpbmNsdWRlICJhZ2VudHgvcHJvdG9jb2wuaCIKCmNvbnN0IGNoYXIgICAgICoKYWdlbnR4X2NtZCh1X2NoYXIgY29kZSkKewogICAgc3dpdGNoIChjb2RlKSB7CiAgICBjYXNlIEFHRU5UWF9NU0dfT1BFTjoKICAgICAgICByZXR1cm4gIk9wZW4iOwogICAgY2FzZSBBR0VOVFhfTVNHX0NMT1NFOgogICAgICAgIHJldHVybiAiQ2xvc2UiOwogICAgY2FzZSBBR0VOVFhfTVNHX1JFR0lTVEVSOgogICAgICAgIHJldHVybiAiUmVnaXN0ZXIiOwogICAgY2FzZSBBR0VOVFhfTVNHX1VOUkVHSVNURVI6CiAgICAgICAgcmV0dXJuICJVbnJlZ2lzdGVyIjsKICAgIGNhc2UgQUdFTlRYX01TR19HRVQ6CiAgICAgICAgcmV0dXJuICJHZXQiOwogICAgY2FzZSBBR0VOVFhfTVNHX0dFVE5FWFQ6CiAgICAgICAgcmV0dXJuICJHZXQgTmV4dCI7CiAgICBjYXNlIEFHRU5UWF9NU0dfR0VUQlVMSzoKICAgICAgICByZXR1cm4gIkdldCBCdWxrIjsKICAgIGNhc2UgQUdFTlRYX01TR19URVNUU0VUOgogICAgICAgIHJldHVybiAiVGVzdCBTZXQiOwogICAgY2FzZSBBR0VOVFhfTVNHX0NPTU1JVFNFVDoKICAgICAgICByZXR1cm4gIkNvbW1pdCBTZXQiOwogICAgY2FzZSBBR0VOVFhfTVNHX1VORE9TRVQ6CiAgICAgICAgcmV0dXJuICJVbmRvIFNldCI7CiAgICBjYXNlIEFHRU5UWF9NU0dfQ0xFQU5VUFNFVDoKICAgICAgICByZXR1cm4gIkNsZWFudXAgU2V0IjsKICAgIGNhc2UgQUdFTlRYX01TR19OT1RJRlk6CiAgICAgICAgcmV0dXJuICJOb3RpZnkiOwogICAgY2FzZSBBR0VOVFhfTVNHX1BJTkc6CiAgICAgICAgcmV0dXJuICJQaW5nIjsKICAgIGNhc2UgQUdFTlRYX01TR19JTkRFWF9BTExPQ0FURToKICAgICAgICByZXR1cm4gIkluZGV4IEFsbG9jYXRlIjsKICAgIGNhc2UgQUdFTlRYX01TR19JTkRFWF9ERUFMTE9DQVRFOgogICAgICAgIHJldHVybiAiSW5kZXggRGVhbGxvY2F0ZSI7CiAgICBjYXNlIEFHRU5UWF9NU0dfQUREX0FHRU5UX0NBUFM6CiAgICAgICAgcmV0dXJuICJBZGQgQWdlbnQgQ2FwcyI7CiAgICBjYXNlIEFHRU5UWF9NU0dfUkVNT1ZFX0FHRU5UX0NBUFM6CiAgICAgICAgcmV0dXJuICJSZW1vdmUgQWdlbnQgQ2FwcyI7CiAgICBjYXNlIEFHRU5UWF9NU0dfUkVTUE9OU0U6CiAgICAgICAgcmV0dXJuICJSZXNwb25zZSI7CiAgICBkZWZhdWx0OgogICAgICAgIHJldHVybiAiVW5rbm93biI7CiAgICB9Cn0KCmludAphZ2VudHhfcmVhbGxvY19idWlsZF9pbnQodV9jaGFyICoqIGJ1Ziwgc2l6ZV90ICogYnVmX2xlbiwgc2l6ZV90ICogb3V0X2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IHZhbHVlLCBpbnQgbmV0d29ya19vcmRlcikKewogICAgdW5zaWduZWQgaW50ICAgIGl2YWx1ZSA9IHZhbHVlOwogICAgc2l6ZV90ICAgICAgICAgIGlsZW4gPSAqb3V0X2xlbjsKI2lmZGVmIFdPUkRTX0JJR0VORElBTgogICAgdW5zaWduZWQgaW50ICAgIGkgPSAwOwojZW5kaWYKCiAgICB3aGlsZSAoKCpvdXRfbGVuICsgNCkgPj0gKmJ1Zl9sZW4pIHsKICAgICAgICBpZiAoIShhbGxvd19yZWFsbG9jICYmIHNubXBfcmVhbGxvYyhidWYsIGJ1Zl9sZW4pKSkgewogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CiAgICB9CgogICAgaWYgKG5ldHdvcmtfb3JkZXIpIHsKI2lmbmRlZiBXT1JEU19CSUdFTkRJQU4KICAgICAgICB2YWx1ZSA9IG50b2hsKHZhbHVlKTsKI2VuZGlmCiAgICAgICAgbWVtbW92ZSgoKmJ1ZiArICpvdXRfbGVuKSwgJnZhbHVlLCA0KTsKICAgICAgICAqb3V0X2xlbiArPSA0OwogICAgfSBlbHNlIHsKI2lmbmRlZiBXT1JEU19CSUdFTkRJQU4KICAgICAgICBtZW1tb3ZlKCgqYnVmICsgKm91dF9sZW4pLCAmdmFsdWUsIDQpOwogICAgICAgICpvdXRfbGVuICs9IDQ7CiNlbHNlCiAgICAgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgewogICAgICAgICAgICAqKCpidWYgKyAqb3V0X2xlbikgPSAodV9jaGFyKSB2YWx1ZSAmIDB4ZmY7CiAgICAgICAgICAgICgqb3V0X2xlbikrKzsKICAgICAgICAgICAgdmFsdWUgPj49IDg7CiAgICAgICAgfQojZW5kaWYKICAgIH0KICAgIERFQlVHRFVNUFNFVFVQKCJzZW5kIiwgKCpidWYgKyBpbGVuKSwgNCk7CiAgICBERUJVR01TRygoImR1bXB2X3NlbmQiLCAiICBJbnRlZ2VyOlx0JXUgKDB4JS4yWClcbiIsIGl2YWx1ZSwKICAgICAgICAgICAgICBpdmFsdWUpKTsKICAgIHJldHVybiAxOwp9Cgp2b2lkCmFnZW50eF9idWlsZF9pbnQodV9jaGFyICogYnVmcCwgdV9pbnQgdmFsdWUsIGludCBuZXR3b3JrX2J5dGVfb3JkZXIpCnsKICAgIHVfY2hhciAgICAgICAgICpvcmlnX2J1ZnAgPSBidWZwOwogICAgdV9pbnQgICAgICAgICAgIG9yaWdfdmFsID0gdmFsdWU7CgogICAgaWYgKG5ldHdvcmtfYnl0ZV9vcmRlcikgewojaWZuZGVmIFdPUkRTX0JJR0VORElBTgogICAgICAgIHZhbHVlID0gbnRvaGwodmFsdWUpOwojZW5kaWYKICAgICAgICBtZW1tb3ZlKGJ1ZnAsICZ2YWx1ZSwgNCk7CiAgICB9IGVsc2UgewojaWZuZGVmIFdPUkRTX0JJR0VORElBTgogICAgICAgIG1lbW1vdmUoYnVmcCwgJnZhbHVlLCA0KTsKI2Vsc2UKICAgICAgICAqYnVmcCA9ICh1X2NoYXIpIHZhbHVlICYgMHhmZjsKICAgICAgICB2YWx1ZSA+Pj0gODsKICAgICAgICBidWZwKys7CiAgICAgICAgKmJ1ZnAgPSAodV9jaGFyKSB2YWx1ZSAmIDB4ZmY7CiAgICAgICAgdmFsdWUgPj49IDg7CiAgICAgICAgYnVmcCsrOwogICAgICAgICpidWZwID0gKHVfY2hhcikgdmFsdWUgJiAweGZmOwogICAgICAgIHZhbHVlID4+PSA4OwogICAgICAgIGJ1ZnArKzsKICAgICAgICAqYnVmcCA9ICh1X2NoYXIpIHZhbHVlICYgMHhmZjsKI2VuZGlmCiAgICB9CiAgICBERUJVR0RVTVBTRVRVUCgic2VuZCIsIG9yaWdfYnVmcCwgNCk7CiAgICBERUJVR01TRygoImR1bXB2X3NlbmQiLCAiICBJbnRlZ2VyOlx0JXUgKDB4JS4yWClcbiIsIG9yaWdfdmFsLAogICAgICAgICAgICAgIG9yaWdfdmFsKSk7Cn0KCmludAphZ2VudHhfcmVhbGxvY19idWlsZF9zaG9ydCh1X2NoYXIgKiogYnVmLCBzaXplX3QgKiBidWZfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgKiBvdXRfbGVuLCBpbnQgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgc2hvcnQgdmFsdWUsIGludCBuZXR3b3JrX29yZGVyKQp7CiAgICB1bnNpZ25lZCBzaG9ydCAgaXZhbHVlID0gdmFsdWU7CiAgICBzaXplX3QgICAgICAgICAgaWxlbiA9ICpvdXRfbGVuOwojaWZkZWYgV09SRFNfQklHRU5ESUFOCiAgICB1bnNpZ25lZCBzaG9ydCAgaSA9IDA7CiNlbmRpZgoKICAgIHdoaWxlICgoKm91dF9sZW4gKyAyKSA+PSAqYnVmX2xlbikgewogICAgICAgIGlmICghKGFsbG93X3JlYWxsb2MgJiYgc25tcF9yZWFsbG9jKGJ1ZiwgYnVmX2xlbikpKSB7CiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KICAgIH0KCiAgICBpZiAobmV0d29ya19vcmRlcikgewojaWZuZGVmIFdPUkRTX0JJR0VORElBTgogICAgICAgIHZhbHVlID0gbnRvaHModmFsdWUpOwojZW5kaWYKICAgICAgICBtZW1tb3ZlKCgqYnVmICsgKm91dF9sZW4pLCAmdmFsdWUsIDIpOwogICAgICAgICpvdXRfbGVuICs9IDI7CiAgICB9IGVsc2UgewojaWZuZGVmIFdPUkRTX0JJR0VORElBTgogICAgICAgIG1lbW1vdmUoKCpidWYgKyAqb3V0X2xlbiksICZ2YWx1ZSwgMik7CiAgICAgICAgKm91dF9sZW4gKz0gMjsKI2Vsc2UKICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKSB7CiAgICAgICAgICAgICooKmJ1ZiArICpvdXRfbGVuKSA9ICh1X2NoYXIpIHZhbHVlICYgMHhmZjsKICAgICAgICAgICAgKCpvdXRfbGVuKSsrOwogICAgICAgICAgICB2YWx1ZSA+Pj0gODsKICAgICAgICB9CiNlbmRpZgogICAgfQogICAgREVCVUdEVU1QU0VUVVAoInNlbmQiLCAoKmJ1ZiArIGlsZW4pLCAyKTsKICAgIERFQlVHTVNHKCgiZHVtcHZfc2VuZCIsICIgIFNob3J0Olx0JWh1ICgweCUuMmhYKVxuIiwgaXZhbHVlLCBpdmFsdWUpKTsKICAgIHJldHVybiAxOwp9CgppbnQKYWdlbnR4X3JlYWxsb2NfYnVpbGRfb2lkKHVfY2hhciAqKiBidWYsIHNpemVfdCAqIGJ1Zl9sZW4sIHNpemVfdCAqIG91dF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmNsdXNpdmUsIG9pZCAqIG5hbWUsIHNpemVfdCBuYW1lX2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuZXR3b3JrX29yZGVyKQp7CiAgICBzaXplX3QgICAgICAgICAgaWxlbiA9ICpvdXRfbGVuLCBpID0gMDsKICAgIGludCAgICAgICAgICAgICBwcmVmaXggPSAwOwoKICAgIERFQlVHUFJJTlRJTkRFTlQoImR1bXB2X3NlbmQiKTsKICAgIERFQlVHTVNHKCgiZHVtcHZfc2VuZCIsICJPSUQ6ICIpKTsKICAgIERFQlVHTVNHT0lEKCgiZHVtcHZfc2VuZCIsIG5hbWUsIG5hbWVfbGVuKSk7CiAgICBERUJVR01TRygoImR1bXB2X3NlbmQiLCAiXG4iKSk7CgogICAgLyoKICAgICAqIFVwZGF0ZWQgY2xhcmlmaWNhdGlvbiBmcm9tIHRoZSBBZ2VudFggbWFpbGluZyBsaXN0LgogICAgICogVGhlICJudWxsIE9iamVjdCBJZGVudGlmaWVyIiBtZW50aW9uZWQgaW4gUkZDIDI0NzEsCiAgICAgKiBzZWN0aW9uIDUuMSBpcyBhIHNwZWNpYWwgcGxhY2Vob2xkZXIgdmFsdWUsIGFuZAogICAgICogc2hvdWxkIG9ubHkgYmUgdXNlZCB3aGVuIGV4cGxpY2l0bHkgbWVudGlvbmVkIGluCiAgICAgKiB0aGlzIFJGQy4gIEluIHBhcnRpY3VsYXIsIGl0IGRvZXMgKm5vdCogbWVhbiB7MCwgMH0KICAgICAqLwogICAgaWYgKG5hbWVfbGVuID09IDApCiAgICAgICAgaW5jbHVzaXZlID0gMDsKCiAgICAvKgogICAgICogJ0NvbXBhY3QnIGludGVybmV0IE9JRHMgCiAgICAgKi8KICAgIGlmIChuYW1lX2xlbiA+PSA1ICYmIChuYW1lWzBdID09IDEgJiYgbmFtZVsxXSA9PSAzICYmCiAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZVsyXSA9PSA2ICYmIG5hbWVbM10gPT0gMSAmJgogICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVbNF0gPiAwICYmIG5hbWVbNF0gPCAyNTYpKSB7CiAgICAgICAgcHJlZml4ID0gbmFtZVs0XTsKICAgICAgICBuYW1lICs9IDU7CiAgICAgICAgbmFtZV9sZW4gLT0gNTsKICAgIH0KCiAgICB3aGlsZSAoKCpvdXRfbGVuICsgNCArICg0ICogbmFtZV9sZW4pKSA+PSAqYnVmX2xlbikgewogICAgICAgIGlmICghKGFsbG93X3JlYWxsb2MgJiYgc25tcF9yZWFsbG9jKGJ1ZiwgYnVmX2xlbikpKSB7CiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KICAgIH0KCiAgICAqKCpidWYgKyAqb3V0X2xlbikgPSAodV9jaGFyKSBuYW1lX2xlbjsKICAgICgqb3V0X2xlbikrKzsKICAgICooKmJ1ZiArICpvdXRfbGVuKSA9ICh1X2NoYXIpIHByZWZpeDsKICAgICgqb3V0X2xlbikrKzsKICAgICooKmJ1ZiArICpvdXRfbGVuKSA9ICh1X2NoYXIpIGluY2x1c2l2ZTsKICAgICgqb3V0X2xlbikrKzsKICAgICooKmJ1ZiArICpvdXRfbGVuKSA9ICh1X2NoYXIpIDB4MDA7CiAgICAoKm91dF9sZW4pKys7CgogICAgREVCVUdEVU1QSEVBREVSKCJzZW5kIiwgIk9JRCBIZWFkZXIiKTsKICAgIERFQlVHRFVNUFNFVFVQKCJzZW5kIiwgKCpidWYgKyBpbGVuKSwgNCk7CiAgICBERUJVR01TRygoImR1bXB2X3NlbmQiLCAiICAjIHN1YmlkczpcdCVkICgweCUuMlgpXG4iLCAoaW50KW5hbWVfbGVuLAogICAgICAgICAgICAgICh1bnNpZ25lZCBpbnQpbmFtZV9sZW4pKTsKICAgIERFQlVHUFJJTlRJTkRFTlQoImR1bXB2X3NlbmQiKTsKICAgIERFQlVHTVNHKCgiZHVtcHZfc2VuZCIsICIgIHByZWZpeDpcdCVkICgweCUuMlgpXG4iLCBwcmVmaXgsIHByZWZpeCkpOwogICAgREVCVUdQUklOVElOREVOVCgiZHVtcHZfc2VuZCIpOwogICAgREVCVUdNU0coKCJkdW1wdl9zZW5kIiwgIiAgaW5jbHVzaXZlOlx0JWQgKDB4JS4yWClcbiIsIGluY2x1c2l2ZSwKICAgICAgICAgICAgICBpbmNsdXNpdmUpKTsKICAgIERFQlVHSU5ERU5UTEVTUygpOwogICAgREVCVUdEVU1QSEVBREVSKCJzZW5kIiwgIk9JRCBTZWdtZW50cyIpOwoKICAgIGZvciAoaSA9IDA7IGkgPCBuYW1lX2xlbjsgaSsrKSB7CiAgICAgICAgaWYgKCFhZ2VudHhfcmVhbGxvY19idWlsZF9pbnQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVbaV0sIG5ldHdvcmtfb3JkZXIpKSB7CiAgICAgICAgICAgIERFQlVHSU5ERU5UTEVTUygpOwogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CiAgICB9CiAgICBERUJVR0lOREVOVExFU1MoKTsKCiAgICByZXR1cm4gMTsKfQoKaW50CmFnZW50eF9yZWFsbG9jX2J1aWxkX3N0cmluZyh1X2NoYXIgKiogYnVmLCBzaXplX3QgKiBidWZfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICogb3V0X2xlbiwgaW50IGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1X2NoYXIgKiBzdHJpbmcsIHNpemVfdCBzdHJpbmdfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5ldHdvcmtfb3JkZXIpCnsKICAgIHNpemVfdCAgICAgICAgICBpbGVuID0gKm91dF9sZW4sIGkgPSAwOwoKICAgIHdoaWxlICgoKm91dF9sZW4gKyA0ICsgKDQgKiAoKHN0cmluZ19sZW4gKyAzKSAvIDQpKSkgPj0gKmJ1Zl9sZW4pIHsKICAgICAgICBpZiAoIShhbGxvd19yZWFsbG9jICYmIHNubXBfcmVhbGxvYyhidWYsIGJ1Zl9sZW4pKSkgewogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CiAgICB9CgogICAgREVCVUdEVU1QSEVBREVSKCJzZW5kIiwgIkJ1aWxkIFN0cmluZyIpOwogICAgREVCVUdEVU1QSEVBREVSKCJzZW5kIiwgImxlbmd0aCIpOwogICAgaWYgKCFhZ2VudHhfcmVhbGxvY19idWlsZF9pbnQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nX2xlbiwgbmV0d29ya19vcmRlcikpIHsKICAgICAgICBERUJVR0lOREVOVExFU1MoKTsKICAgICAgICBERUJVR0lOREVOVExFU1MoKTsKICAgICAgICByZXR1cm4gMDsKICAgIH0KCiAgICBpZiAoc3RyaW5nX2xlbiA9PSAwKSB7CiAgICAgICAgREVCVUdNU0coKCJkdW1wdl9zZW5kIiwgIiAgU3RyaW5nOiA8ZW1wdHk+XG4iKSk7CiAgICAgICAgREVCVUdJTkRFTlRMRVNTKCk7CiAgICAgICAgREVCVUdJTkRFTlRMRVNTKCk7CiAgICAgICAgcmV0dXJuIDE7CiAgICB9CgogICAgbWVtbW92ZSgoKmJ1ZiArICpvdXRfbGVuKSwgc3RyaW5nLCBzdHJpbmdfbGVuKTsKICAgICpvdXRfbGVuICs9IHN0cmluZ19sZW47CgogICAgLyoKICAgICAqIFBhZCB0byBhIG11bHRpcGxlIG9mIDQgYnl0ZXMgaWYgbmVjZXNzYXJ5IChwZXIgUkZDIDI3NDEpLiAgCiAgICAgKi8KCiAgICBpZiAoc3RyaW5nX2xlbiAlIDQgIT0gMCkgewogICAgICAgIGZvciAoaSA9IDA7IGkgPCA0IC0gKHN0cmluZ19sZW4gJSA0KTsgaSsrKSB7CiAgICAgICAgICAgICooKmJ1ZiArICpvdXRfbGVuKSA9IDA7CiAgICAgICAgICAgICgqb3V0X2xlbikrKzsKICAgICAgICB9CiAgICB9CgogICAgREVCVUdEVU1QU0VUVVAoInNlbmQiLCAoKmJ1ZiArIGlsZW4gKyA0KSwgKChzdHJpbmdfbGVuICsgMykgLyA0KSAqIDQpOwogICAgREVCVUdNU0coKCJkdW1wdl9zZW5kIiwgIiAgU3RyaW5nOlx0JXNcbiIsIHN0cmluZykpOwogICAgREVCVUdJTkRFTlRMRVNTKCk7CiAgICBERUJVR0lOREVOVExFU1MoKTsKICAgIHJldHVybiAxOwp9CgojaWZkZWYgTkVUU05NUF9XSVRIX09QQVFVRV9TUEVDSUFMX1RZUEVTCmludAphZ2VudHhfcmVhbGxvY19idWlsZF9kb3VibGUodV9jaGFyICoqIGJ1Ziwgc2l6ZV90ICogYnVmX2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAqIG91dF9sZW4sIGludCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGRvdWJsZV92YWwsIGludCBuZXR3b3JrX29yZGVyKQp7CiAgICB1bmlvbiB7CiAgICAgICAgZG91YmxlICAgICAgICAgIGRvdWJsZVZhbDsKICAgICAgICBpbnQgICAgICAgICAgICAgaW50VmFsWzJdOwogICAgICAgIGNoYXIgICAgICAgICAgICBjW3NpemVvZihkb3VibGUpXTsKICAgIH0gZHU7CiAgICBpbnQgICAgICAgICAgICAgdG1wOwogICAgdV9jaGFyICAgICAgICAgIG9wYXF1ZV9idWZmZXJbMyArIHNpemVvZihkb3VibGUpXTsKCiAgICBvcGFxdWVfYnVmZmVyWzBdID0gQVNOX09QQVFVRV9UQUcxOwogICAgb3BhcXVlX2J1ZmZlclsxXSA9IEFTTl9PUEFRVUVfRE9VQkxFOwogICAgb3BhcXVlX2J1ZmZlclsyXSA9IHNpemVvZihkb3VibGUpOwoKICAgIGR1LmRvdWJsZVZhbCA9IGRvdWJsZV92YWw7CiAgICB0bXAgPSBodG9ubChkdS5pbnRWYWxbMF0pOwogICAgZHUuaW50VmFsWzBdID0gaHRvbmwoZHUuaW50VmFsWzFdKTsKICAgIGR1LmludFZhbFsxXSA9IHRtcDsKICAgIG1lbWNweSgmb3BhcXVlX2J1ZmZlclszXSwgJmR1LmNbMF0sIHNpemVvZihkb3VibGUpKTsKCiAgICByZXR1cm4gYWdlbnR4X3JlYWxsb2NfYnVpbGRfc3RyaW5nKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dfcmVhbGxvYywgb3BhcXVlX2J1ZmZlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMyArIHNpemVvZihkb3VibGUpLCBuZXR3b3JrX29yZGVyKTsKfQoKaW50CmFnZW50eF9yZWFsbG9jX2J1aWxkX2Zsb2F0KHVfY2hhciAqKiBidWYsIHNpemVfdCAqIGJ1Zl9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAqIG91dF9sZW4sIGludCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBmbG9hdF92YWwsIGludCBuZXR3b3JrX29yZGVyKQp7CiAgICB1bmlvbiB7CiAgICAgICAgZmxvYXQgICAgICAgICAgIGZsb2F0VmFsOwogICAgICAgIGludCAgICAgICAgICAgICBpbnRWYWw7CiAgICAgICAgY2hhciAgICAgICAgICAgIGNbc2l6ZW9mKGZsb2F0KV07CiAgICB9IGZ1OwogICAgdV9jaGFyICAgICAgICAgIG9wYXF1ZV9idWZmZXJbMyArIHNpemVvZihmbG9hdCldOwoKICAgIG9wYXF1ZV9idWZmZXJbMF0gPSBBU05fT1BBUVVFX1RBRzE7CiAgICBvcGFxdWVfYnVmZmVyWzFdID0gQVNOX09QQVFVRV9GTE9BVDsKICAgIG9wYXF1ZV9idWZmZXJbMl0gPSBzaXplb2YoZmxvYXQpOwoKICAgIGZ1LmZsb2F0VmFsID0gZmxvYXRfdmFsOwogICAgZnUuaW50VmFsID0gaHRvbmwoZnUuaW50VmFsKTsKICAgIG1lbWNweSgmb3BhcXVlX2J1ZmZlclszXSwgJmZ1LmNbMF0sIHNpemVvZihmbG9hdCkpOwoKICAgIHJldHVybiBhZ2VudHhfcmVhbGxvY19idWlsZF9zdHJpbmcoYnVmLCBidWZfbGVuLCBvdXRfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd19yZWFsbG9jLCBvcGFxdWVfYnVmZmVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzICsgc2l6ZW9mKGZsb2F0KSwgbmV0d29ya19vcmRlcik7Cn0KI2VuZGlmCgppbnQKYWdlbnR4X3JlYWxsb2NfYnVpbGRfdmFyYmluZCh1X2NoYXIgKiogYnVmLCBzaXplX3QgKiBidWZfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAqIG91dF9sZW4sIGludCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldHNubXBfdmFyaWFibGVfbGlzdCAqIHZwLCBpbnQgbmV0d29ya19vcmRlcikKewogICAgREVCVUdEVU1QSEVBREVSKCJzZW5kIiwgIlZhckJpbmQiKTsKICAgIERFQlVHRFVNUEhFQURFUigic2VuZCIsICJ0eXBlIik7CiNpZmRlZiBORVRTTk1QX1dJVEhfT1BBUVVFX1NQRUNJQUxfVFlQRVMKICAgIGlmICgodnAtPnR5cGUgPT0gQVNOX09QQVFVRV9GTE9BVCkgfHwgKHZwLT50eXBlID09IEFTTl9PUEFRVUVfRE9VQkxFKQogICAgICAgIHx8ICh2cC0+dHlwZSA9PSBBU05fT1BBUVVFX0k2NCkgfHwgKHZwLT50eXBlID09IEFTTl9PUEFRVUVfVTY0KQogICAgICAgIHx8ICh2cC0+dHlwZSA9PSBBU05fT1BBUVVFX0NPVU5URVI2NCkpIHsKICAgICAgICBpZiAoIWFnZW50eF9yZWFsbG9jX2J1aWxkX3Nob3J0CiAgICAgICAgICAgIChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAodW5zaWduZWQgc2hvcnQpIEFTTl9PUEFRVUUsIG5ldHdvcmtfb3JkZXIpKSB7CiAgICAgICAgICAgIERFQlVHSU5ERU5UTEVTUygpOwogICAgICAgICAgICBERUJVR0lOREVOVExFU1MoKTsKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQogICAgfSBlbHNlCiNlbmRpZgogICAgaWYgKHZwLT50eXBlID09IEFTTl9QUklWX0lOQ0xfUkFOR0UgfHwgdnAtPnR5cGUgPT0gQVNOX1BSSVZfRVhDTF9SQU5HRSkgewogICAgICAgIGlmICghYWdlbnR4X3JlYWxsb2NfYnVpbGRfc2hvcnQKICAgICAgICAgICAgKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICh1bnNpZ25lZCBzaG9ydCkgQVNOX09CSkVDVF9JRCwgbmV0d29ya19vcmRlcikpIHsKICAgICAgICAgICAgREVCVUdJTkRFTlRMRVNTKCk7CiAgICAgICAgICAgIERFQlVHSU5ERU5UTEVTUygpOwogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CiAgICB9IGVsc2UgewogICAgICAgIGlmICghYWdlbnR4X3JlYWxsb2NfYnVpbGRfc2hvcnQKICAgICAgICAgICAgKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICh1bnNpZ25lZCBzaG9ydCkgdnAtPnR5cGUsIG5ldHdvcmtfb3JkZXIpKSB7CiAgICAgICAgICAgIERFQlVHSU5ERU5UTEVTUygpOwogICAgICAgICAgICBERUJVR0lOREVOVExFU1MoKTsKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQogICAgfQoKICAgIHdoaWxlICgoKm91dF9sZW4gKyAyKSA+PSAqYnVmX2xlbikgewogICAgICAgIGlmICghKGFsbG93X3JlYWxsb2MgJiYgc25tcF9yZWFsbG9jKGJ1ZiwgYnVmX2xlbikpKSB7CiAgICAgICAgICAgIERFQlVHSU5ERU5UTEVTUygpOwogICAgICAgICAgICBERUJVR0lOREVOVExFU1MoKTsKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQogICAgfQoKICAgICooKmJ1ZiArICpvdXRfbGVuKSA9IDA7CiAgICAoKm91dF9sZW4pKys7CiAgICAqKCpidWYgKyAqb3V0X2xlbikgPSAwOwogICAgKCpvdXRfbGVuKSsrOwogICAgREVCVUdJTkRFTlRMRVNTKCk7CgogICAgREVCVUdEVU1QSEVBREVSKCJzZW5kIiwgIm5hbWUiKTsKICAgIGlmICghYWdlbnR4X3JlYWxsb2NfYnVpbGRfb2lkKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZwLT5uYW1lLCB2cC0+bmFtZV9sZW5ndGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXR3b3JrX29yZGVyKSkgewogICAgICAgIERFQlVHSU5ERU5UTEVTUygpOwogICAgICAgIERFQlVHSU5ERU5UTEVTUygpOwogICAgICAgIHJldHVybiAwOwogICAgfQogICAgREVCVUdJTkRFTlRMRVNTKCk7CgogICAgREVCVUdEVU1QSEVBREVSKCJzZW5kIiwgInZhbHVlIik7CiAgICBzd2l0Y2ggKHZwLT50eXBlKSB7CgogICAgY2FzZSBBU05fSU5URUdFUjoKICAgIGNhc2UgQVNOX0NPVU5URVI6CiAgICBjYXNlIEFTTl9HQVVHRToKICAgIGNhc2UgQVNOX1RJTUVUSUNLUzoKICAgIGNhc2UgQVNOX1VJTlRFR0VSOgogICAgICAgIGlmICghYWdlbnR4X3JlYWxsb2NfYnVpbGRfaW50KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKHZwLT52YWwuaW50ZWdlciksIG5ldHdvcmtfb3JkZXIpKSB7CiAgICAgICAgICAgIERFQlVHSU5ERU5UTEVTUygpOwogICAgICAgICAgICBERUJVR0lOREVOVExFU1MoKTsKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQogICAgICAgIGJyZWFrOwoKI2lmZGVmIE5FVFNOTVBfV0lUSF9PUEFRVUVfU1BFQ0lBTF9UWVBFUwogICAgY2FzZSBBU05fT1BBUVVFX0ZMT0FUOgogICAgICAgIERFQlVHRFVNUEhFQURFUigic2VuZCIsICJCdWlsZCBPcGFxdWUgRmxvYXQiKTsKICAgICAgICBERUJVR1BSSU5USU5ERU5UKCJkdW1wdl9zZW5kIik7CiAgICAgICAgREVCVUdNU0coKCJkdW1wdl9zZW5kIiwgIiAgRmxvYXQ6XHQlZlxuIiwgKih2cC0+dmFsLmZsb2F0VmFsKSkpOwogICAgICAgIGlmICghYWdlbnR4X3JlYWxsb2NfYnVpbGRfZmxvYXQKICAgICAgICAgICAgKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgKih2cC0+dmFsLmZsb2F0VmFsKSwKICAgICAgICAgICAgIG5ldHdvcmtfb3JkZXIpKSB7CiAgICAgICAgICAgIERFQlVHSU5ERU5UTEVTUygpOwogICAgICAgICAgICBERUJVR0lOREVOVExFU1MoKTsKICAgICAgICAgICAgREVCVUdJTkRFTlRMRVNTKCk7CiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KICAgICAgICBERUJVR0lOREVOVExFU1MoKTsKICAgICAgICBicmVhazsKCiAgICBjYXNlIEFTTl9PUEFRVUVfRE9VQkxFOgogICAgICAgIERFQlVHRFVNUEhFQURFUigic2VuZCIsICJCdWlsZCBPcGFxdWUgRG91YmxlIik7CiAgICAgICAgREVCVUdQUklOVElOREVOVCgiZHVtcHZfc2VuZCIpOwogICAgICAgIERFQlVHTVNHKCgiZHVtcHZfc2VuZCIsICIgIERvdWJsZTpcdCVmXG4iLCAqKHZwLT52YWwuZG91YmxlVmFsKSkpOwogICAgICAgIGlmICghYWdlbnR4X3JlYWxsb2NfYnVpbGRfZG91YmxlCiAgICAgICAgICAgIChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsICoodnAtPnZhbC5kb3VibGVWYWwpLAogICAgICAgICAgICAgbmV0d29ya19vcmRlcikpIHsKICAgICAgICAgICAgREVCVUdJTkRFTlRMRVNTKCk7CiAgICAgICAgICAgIERFQlVHSU5ERU5UTEVTUygpOwogICAgICAgICAgICBERUJVR0lOREVOVExFU1MoKTsKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQogICAgICAgIERFQlVHSU5ERU5UTEVTUygpOwogICAgICAgIGJyZWFrOwoKICAgIGNhc2UgQVNOX09QQVFVRV9JNjQ6CiAgICBjYXNlIEFTTl9PUEFRVUVfVTY0OgogICAgY2FzZSBBU05fT1BBUVVFX0NPVU5URVI2NDoKICAgICAgICAvKgogICAgICAgICAqIFhYWCAtIFRPRE8gLSBlbmNvZGUgYXMgcmF3IE9QQVFVRSBmb3Igbm93IChzbyBmYWxsIHRocm91Z2gKICAgICAgICAgKiBoZXJlKS4gIAogICAgICAgICAqLwojZW5kaWYKCiAgICBjYXNlIEFTTl9PQ1RFVF9TVFI6CiAgICBjYXNlIEFTTl9JUEFERFJFU1M6CiAgICBjYXNlIEFTTl9PUEFRVUU6CiAgICAgICAgaWYgKCFhZ2VudHhfcmVhbGxvY19idWlsZF9zdHJpbmcKICAgICAgICAgICAgKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgdnAtPnZhbC5zdHJpbmcsCiAgICAgICAgICAgICB2cC0+dmFsX2xlbiwgbmV0d29ya19vcmRlcikpIHsKICAgICAgICAgICAgREVCVUdJTkRFTlRMRVNTKCk7CiAgICAgICAgICAgIERFQlVHSU5ERU5UTEVTUygpOwogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CiAgICAgICAgYnJlYWs7CgogICAgY2FzZSBBU05fT0JKRUNUX0lEOgogICAgY2FzZSBBU05fUFJJVl9FWENMX1JBTkdFOgogICAgY2FzZSBBU05fUFJJVl9JTkNMX1JBTkdFOgogICAgICAgIGlmICghYWdlbnR4X3JlYWxsb2NfYnVpbGRfb2lkCiAgICAgICAgICAgIChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsIDEsIHZwLT52YWwub2JqaWQsCiAgICAgICAgICAgICB2cC0+dmFsX2xlbiAvIHNpemVvZihvaWQpLCBuZXR3b3JrX29yZGVyKSkgewogICAgICAgICAgICBERUJVR0lOREVOVExFU1MoKTsKICAgICAgICAgICAgREVCVUdJTkRFTlRMRVNTKCk7CiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KICAgICAgICBicmVhazsKCiAgICBjYXNlIEFTTl9DT1VOVEVSNjQ6CiAgICAgICAgaWYgKG5ldHdvcmtfb3JkZXIpIHsKICAgICAgICAgICAgREVCVUdEVU1QSEVBREVSKCJzZW5kIiwgIkJ1aWxkIENvdW50ZXI2NCAoaGlnaCwgbG93KSIpOwogICAgICAgICAgICBpZiAoIWFnZW50eF9yZWFsbG9jX2J1aWxkX2ludAogICAgICAgICAgICAgICAgKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICB2cC0+dmFsLmNvdW50ZXI2NC0+aGlnaCwgbmV0d29ya19vcmRlcikKICAgICAgICAgICAgICAgIHx8ICFhZ2VudHhfcmVhbGxvY19idWlsZF9pbnQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2cC0+dmFsLmNvdW50ZXI2NC0+bG93LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXR3b3JrX29yZGVyKSkgewogICAgICAgICAgICAgICAgREVCVUdJTkRFTlRMRVNTKCk7CiAgICAgICAgICAgICAgICBERUJVR0lOREVOVExFU1MoKTsKICAgICAgICAgICAgICAgIERFQlVHSU5ERU5UTEVTUygpOwogICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgREVCVUdJTkRFTlRMRVNTKCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgREVCVUdEVU1QSEVBREVSKCJzZW5kIiwgIkJ1aWxkIENvdW50ZXI2NCAobG93LCBoaWdoKSIpOwogICAgICAgICAgICBpZiAoIWFnZW50eF9yZWFsbG9jX2J1aWxkX2ludAogICAgICAgICAgICAgICAgKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICB2cC0+dmFsLmNvdW50ZXI2NC0+bG93LCBuZXR3b3JrX29yZGVyKQogICAgICAgICAgICAgICAgfHwgIWFnZW50eF9yZWFsbG9jX2J1aWxkX2ludChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZwLT52YWwuY291bnRlcjY0LT5oaWdoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXR3b3JrX29yZGVyKSkgewogICAgICAgICAgICAgICAgREVCVUdJTkRFTlRMRVNTKCk7CiAgICAgICAgICAgICAgICBERUJVR0lOREVOVExFU1MoKTsKICAgICAgICAgICAgICAgIERFQlVHSU5ERU5UTEVTUygpOwogICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgREVCVUdJTkRFTlRMRVNTKCk7CiAgICAgICAgfQogICAgICAgIGJyZWFrOwoKICAgIGNhc2UgQVNOX05VTEw6CiAgICBjYXNlIFNOTVBfTk9TVUNIT0JKRUNUOgogICAgY2FzZSBTTk1QX05PU1VDSElOU1RBTkNFOgogICAgY2FzZSBTTk1QX0VORE9GTUlCVklFVzoKICAgICAgICBicmVhazsKCiAgICBkZWZhdWx0OgogICAgICAgIERFQlVHTVNHVEwoKCJhZ2VudHhfYnVpbGRfdmFyYmluZCIsICJ1bmtub3duIHR5cGUgJWQgKDB4JTAyeClcbiIsCiAgICAgICAgICAgICAgICAgICAgdnAtPnR5cGUsIHZwLT50eXBlKSk7CiAgICAgICAgREVCVUdJTkRFTlRMRVNTKCk7CiAgICAgICAgREVCVUdJTkRFTlRMRVNTKCk7CiAgICAgICAgcmV0dXJuIDA7CiAgICB9CiAgICBERUJVR0lOREVOVExFU1MoKTsKICAgIERFQlVHSU5ERU5UTEVTUygpOwogICAgcmV0dXJuIDE7Cn0KCmludAphZ2VudHhfcmVhbGxvY19idWlsZF9oZWFkZXIodV9jaGFyICoqIGJ1Ziwgc2l6ZV90ICogYnVmX2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAqIG91dF9sZW4sIGludCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV0c25tcF9wZHUgKnBkdSkKewogICAgc2l6ZV90ICAgICAgICAgIGlsZW4gPSAqb3V0X2xlbjsKICAgIGNvbnN0IGludCAgICAgICBuZXR3b3JrX29yZGVyID0KICAgICAgICBwZHUtPmZsYWdzICYgQUdFTlRYX0ZMQUdTX05FVFdPUktfQllURV9PUkRFUjsKCiAgICB3aGlsZSAoKCpvdXRfbGVuICsgNCkgPj0gKmJ1Zl9sZW4pIHsKICAgICAgICBpZiAoIShhbGxvd19yZWFsbG9jICYmIHNubXBfcmVhbGxvYyhidWYsIGJ1Zl9sZW4pKSkgewogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CiAgICB9CgogICAgLyoKICAgICAqIEZpcnN0IDQgYnl0ZXMgYXJlIHZlcnNpb24sIHBkdSB0eXBlLCBmbGFncywgYW5kIGEgMCByZXNlcnZlZCBieXRlLiAgCiAgICAgKi8KCiAgICAqKCpidWYgKyAqb3V0X2xlbikgPSAxOwogICAgKCpvdXRfbGVuKSsrOwogICAgKigqYnVmICsgKm91dF9sZW4pID0gcGR1LT5jb21tYW5kOwogICAgKCpvdXRfbGVuKSsrOwogICAgKigqYnVmICsgKm91dF9sZW4pID0gKHVfY2hhcikgKHBkdS0+ZmxhZ3MgJiBBR0VOVFhfTVNHX0ZMQUdTX01BU0spOwogICAgKCpvdXRfbGVuKSsrOwogICAgKigqYnVmICsgKm91dF9sZW4pID0gMDsKICAgICgqb3V0X2xlbikrKzsKCiAgICBERUJVR0RVTVBIRUFERVIoInNlbmQiLCAiQWdlbnRYIEhlYWRlciIpOwogICAgREVCVUdEVU1QU0VUVVAoInNlbmQiLCAoKmJ1ZiArIGlsZW4pLCA0KTsKICAgIERFQlVHTVNHKCgiZHVtcHZfc2VuZCIsICIgIFZlcnNpb246XHQlZFxuIiwgKGludCkgKigqYnVmICsgaWxlbikpKTsKICAgIERFQlVHUFJJTlRJTkRFTlQoImR1bXB2X3NlbmQiKTsKICAgIERFQlVHTVNHKCgiZHVtcHZfc2VuZCIsICIgIENvbW1hbmQ6XHQlZCAoJXMpXG4iLCBwZHUtPmNvbW1hbmQsCiAgICAgICAgICAgICAgYWdlbnR4X2NtZCgodV9jaGFyKXBkdS0+Y29tbWFuZCkpKTsKICAgIERFQlVHUFJJTlRJTkRFTlQoImR1bXB2X3NlbmQiKTsKICAgIERFQlVHTVNHKCgiZHVtcHZfc2VuZCIsICIgIEZsYWdzOlx0JTAyeFxuIiwgKGludCkgKigqYnVmICsgaWxlbiArIDIpKSk7CgogICAgREVCVUdEVU1QSEVBREVSKCJzZW5kIiwgIlNlc3Npb24gSUQiKTsKICAgIGlmICghYWdlbnR4X3JlYWxsb2NfYnVpbGRfaW50KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBkdS0+c2Vzc2lkLCBuZXR3b3JrX29yZGVyKSkgewogICAgICAgIERFQlVHSU5ERU5UTEVTUygpOwogICAgICAgIERFQlVHSU5ERU5UTEVTUygpOwogICAgICAgIHJldHVybiAwOwogICAgfQogICAgREVCVUdJTkRFTlRMRVNTKCk7CgogICAgREVCVUdEVU1QSEVBREVSKCJzZW5kIiwgIlRyYW5zYWN0aW9uIElEIik7CiAgICBpZiAoIWFnZW50eF9yZWFsbG9jX2J1aWxkX2ludChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZHUtPnRyYW5zaWQsIG5ldHdvcmtfb3JkZXIpKSB7CiAgICAgICAgREVCVUdJTkRFTlRMRVNTKCk7CiAgICAgICAgREVCVUdJTkRFTlRMRVNTKCk7CiAgICAgICAgcmV0dXJuIDA7CiAgICB9CiAgICBERUJVR0lOREVOVExFU1MoKTsKCiAgICBERUJVR0RVTVBIRUFERVIoInNlbmQiLCAiUmVxdWVzdCBJRCIpOwogICAgaWYgKCFhZ2VudHhfcmVhbGxvY19idWlsZF9pbnQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGR1LT5yZXFpZCwgbmV0d29ya19vcmRlcikpIHsKICAgICAgICBERUJVR0lOREVOVExFU1MoKTsKICAgICAgICBERUJVR0lOREVOVExFU1MoKTsKICAgICAgICByZXR1cm4gMDsKICAgIH0KICAgIERFQlVHSU5ERU5UTEVTUygpOwoKICAgIERFQlVHRFVNUEhFQURFUigic2VuZCIsICJEdW1teSBMZW5ndGggOi0oIik7CiAgICBpZiAoIWFnZW50eF9yZWFsbG9jX2J1aWxkX2ludChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCBuZXR3b3JrX29yZGVyKSkgewogICAgICAgIERFQlVHSU5ERU5UTEVTUygpOwogICAgICAgIERFQlVHSU5ERU5UTEVTUygpOwogICAgICAgIHJldHVybiAwOwogICAgfQogICAgREVCVUdJTkRFTlRMRVNTKCk7CgogICAgaWYgKHBkdS0+ZmxhZ3MgJiBBR0VOVFhfTVNHX0ZMQUdfTk9OX0RFRkFVTFRfQ09OVEVYVCkgewogICAgICAgIERFQlVHRFVNUEhFQURFUigic2VuZCIsICJDb21tdW5pdHkiKTsKICAgICAgICBpZiAoIWFnZW50eF9yZWFsbG9jX2J1aWxkX3N0cmluZwogICAgICAgICAgICAoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCBwZHUtPmNvbW11bml0eSwKICAgICAgICAgICAgIHBkdS0+Y29tbXVuaXR5X2xlbiwgbmV0d29ya19vcmRlcikpIHsKICAgICAgICAgICAgREVCVUdJTkRFTlRMRVNTKCk7CiAgICAgICAgICAgIERFQlVHSU5ERU5UTEVTUygpOwogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CiAgICAgICAgREVCVUdJTkRFTlRMRVNTKCk7CiAgICB9CgogICAgREVCVUdJTkRFTlRMRVNTKCk7CiAgICByZXR1cm4gMTsKfQoKc3RhdGljIGludApfYWdlbnR4X3JlYWxsb2NfYnVpbGQodV9jaGFyICoqIGJ1Ziwgc2l6ZV90ICogYnVmX2xlbiwgc2l6ZV90ICogb3V0X2xlbiwKICAgICAgICAgICAgICAgICAgICAgIGludCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgbmV0c25tcF9zZXNzaW9uICogc2Vzc2lvbiwgbmV0c25tcF9wZHUgKnBkdSkKewogICAgc2l6ZV90ICAgICAgICAgIGlsZW4gPSAqb3V0X2xlbjsKICAgIG5ldHNubXBfdmFyaWFibGVfbGlzdCAqdnA7CiAgICBpbnQgICAgICAgICAgICAgaW5jLCBpID0gMDsKICAgIGNvbnN0IGludCAgICAgICBuZXR3b3JrX29yZGVyID0KICAgICAgICBwZHUtPmZsYWdzICYgQUdFTlRYX0ZMQUdTX05FVFdPUktfQllURV9PUkRFUjsKCiAgICBzZXNzaW9uLT5zX3NubXBfZXJybm8gPSAwOwogICAgc2Vzc2lvbi0+c19lcnJubyA9IDA7CgogICAgLyoKICAgICAqIFZhcmlvdXMgUERVIHR5cGVzIGRvbid0IGluY2x1ZGUgY29udGV4dCBpbmZvcm1hdGlvbiAoUkZDIDI3NDEsIHAuIDIwKS4gCiAgICAgKi8KICAgIHN3aXRjaCAocGR1LT5jb21tYW5kKSB7CiAgICBjYXNlIEFHRU5UWF9NU0dfT1BFTjoKICAgIGNhc2UgQUdFTlRYX01TR19DTE9TRToKICAgIGNhc2UgQUdFTlRYX01TR19SRVNQT05TRToKICAgIGNhc2UgQUdFTlRYX01TR19DT01NSVRTRVQ6CiAgICBjYXNlIEFHRU5UWF9NU0dfVU5ET1NFVDoKICAgIGNhc2UgQUdFTlRYX01TR19DTEVBTlVQU0VUOgogICAgICAgIHBkdS0+ZmxhZ3MgJj0gfihBR0VOVFhfTVNHX0ZMQUdfTk9OX0RFRkFVTFRfQ09OVEVYVCk7CiAgICB9CgoJLyogV2UndmUgcmVjZWl2ZWQgYSBQRFUgdGhhdCBoYXMgc3BlY2lmaWVkIGEgY29udGV4dC4gIE5ldFNOTVAgaG93ZXZlciwgdXNlcwoJICogdGhlIHBkdS0+Y29tbXVuaXR5IGZpZWxkIHRvIHNwZWNpZnkgY29udGV4dCB3aGVuIHVzaW5nIHRoZSBBZ2VudFgKCSAqIHByb3RvY29sLiAgVGhlcmVmb3JlIHdlIG5lZWQgdG8gY29weSB0aGUgY29udGV4dCBuYW1lIGFuZCBsZW5ndGggaW50byB0aGUKCSAqIHBkdS0+Y29tbXVuaXR5IGFuZCBwZHUtPmNvbW11bml0eV9sZW4gZmllbGRzLCByZXNwZWN0aXZlbHkuICovCglpZiAocGR1LT5jb250ZXh0TmFtZSAhPSBOVUxMICYmIHBkdS0+Y29tbXVuaXR5ID09IE5VTEwpCgl7CQoJCXBkdS0+Y29tbXVuaXR5ICAgICA9ICh1X2NoYXIgKikgc3RyZHVwKHBkdS0+Y29udGV4dE5hbWUpOwoJCXBkdS0+Y29tbXVuaXR5X2xlbiA9IHBkdS0+Y29udGV4dE5hbWVMZW47CgkJcGR1LT5mbGFncyB8PSBBR0VOVFhfTVNHX0ZMQUdfTk9OX0RFRkFVTFRfQ09OVEVYVDsKCX0KCiAgICAvKgogICAgICogQnVpbGQgdGhlIGhlYWRlciAoYW5kIGNvbnRleHQgaWYgYXBwcm9wcmlhdGUpLiAgCiAgICAgKi8KICAgIGlmICghYWdlbnR4X3JlYWxsb2NfYnVpbGRfaGVhZGVyCiAgICAgICAgKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgcGR1KSkgewogICAgICAgIHJldHVybiAwOwogICAgfQoKICAgIC8qCiAgICAgKiBFdmVyeXRoaW5nIGNhdXNlcyBhIHJlc3BvbnNlLCBleGNlcHQgZm9yIGFnZW50eC1SZXNwb25zZS1QRFUgYW5kCiAgICAgKiBhZ2VudHgtQ2xlYW51cFNldC1QRFUuICAKICAgICAqLwoKICAgIHBkdS0+ZmxhZ3MgfD0gVUNEX01TR19GTEFHX0VYUEVDVF9SRVNQT05TRTsKCiAgICBERUJVR0RVTVBIRUFERVIoInNlbmQiLCAiQWdlbnRYIFBheWxvYWQiKTsKICAgIHN3aXRjaCAocGR1LT5jb21tYW5kKSB7CgogICAgY2FzZSBBR0VOVFhfTVNHX09QRU46CiAgICAgICAgLyoKICAgICAgICAgKiBUaW1lb3V0ICAKICAgICAgICAgKi8KICAgICAgICB3aGlsZSAoKCpvdXRfbGVuICsgNCkgPj0gKmJ1Zl9sZW4pIHsKICAgICAgICAgICAgaWYgKCEoYWxsb3dfcmVhbGxvYyAmJiBzbm1wX3JlYWxsb2MoYnVmLCBidWZfbGVuKSkpIHsKICAgICAgICAgICAgICAgIERFQlVHSU5ERU5UTEVTUygpOwogICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgKigqYnVmICsgKm91dF9sZW4pID0gKHVfY2hhcikgcGR1LT50aW1lOwogICAgICAgICgqb3V0X2xlbikrKzsKICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7CiAgICAgICAgICAgICooKmJ1ZiArICpvdXRfbGVuKSA9IDA7CiAgICAgICAgICAgICgqb3V0X2xlbikrKzsKICAgICAgICB9CiAgICAgICAgREVCVUdEVU1QSEVBREVSKCJzZW5kIiwgIk9wZW4gVGltZW91dCIpOwogICAgICAgIERFQlVHRFVNUFNFVFVQKCJzZW5kIiwgKCpidWYgKyAqb3V0X2xlbiAtIDQpLCA0KTsKICAgICAgICBERUJVR01TRygoImR1bXB2X3NlbmQiLCAiICBUaW1lb3V0Olx0JWRcbiIsCiAgICAgICAgICAgICAgICAgIChpbnQpICooKmJ1ZiArICpvdXRfbGVuIC0gNCkpKTsKICAgICAgICBERUJVR0lOREVOVExFU1MoKTsKCiAgICAgICAgREVCVUdEVU1QSEVBREVSKCJzZW5kIiwgIk9wZW4gSUQiKTsKICAgICAgICBpZiAoIWFnZW50eF9yZWFsbG9jX2J1aWxkX29pZAogICAgICAgICAgICAoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCAwLCBwZHUtPnZhcmlhYmxlcy0+bmFtZSwKICAgICAgICAgICAgIHBkdS0+dmFyaWFibGVzLT5uYW1lX2xlbmd0aCwgbmV0d29ya19vcmRlcikpIHsKICAgICAgICAgICAgREVCVUdJTkRFTlRMRVNTKCk7CiAgICAgICAgICAgIERFQlVHSU5ERU5UTEVTUygpOwogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CiAgICAgICAgREVCVUdJTkRFTlRMRVNTKCk7CiAgICAgICAgREVCVUdEVU1QSEVBREVSKCJzZW5kIiwgIk9wZW4gRGVzY3JpcHRpb24iKTsKICAgICAgICBpZiAoIWFnZW50eF9yZWFsbG9jX2J1aWxkX3N0cmluZwogICAgICAgICAgICAoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgcGR1LT52YXJpYWJsZXMtPnZhbC5zdHJpbmcsIHBkdS0+dmFyaWFibGVzLT52YWxfbGVuLAogICAgICAgICAgICAgbmV0d29ya19vcmRlcikpIHsKICAgICAgICAgICAgREVCVUdJTkRFTlRMRVNTKCk7CiAgICAgICAgICAgIERFQlVHSU5ERU5UTEVTUygpOwogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CiAgICAgICAgREVCVUdJTkRFTlRMRVNTKCk7CiAgICAgICAgYnJlYWs7CgogICAgY2FzZSBBR0VOVFhfTVNHX0NMT1NFOgogICAgICAgIC8qCiAgICAgICAgICogUmVhc29uICAKICAgICAgICAgKi8KICAgICAgICB3aGlsZSAoKCpvdXRfbGVuICsgNCkgPj0gKmJ1Zl9sZW4pIHsKICAgICAgICAgICAgaWYgKCEoYWxsb3dfcmVhbGxvYyAmJiBzbm1wX3JlYWxsb2MoYnVmLCBidWZfbGVuKSkpIHsKICAgICAgICAgICAgICAgIERFQlVHSU5ERU5UTEVTUygpOwogICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgKigqYnVmICsgKm91dF9sZW4pID0gKHVfY2hhcikgcGR1LT5lcnJzdGF0OwogICAgICAgICgqb3V0X2xlbikrKzsKICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7CiAgICAgICAgICAgICooKmJ1ZiArICpvdXRfbGVuKSA9IDA7CiAgICAgICAgICAgICgqb3V0X2xlbikrKzsKICAgICAgICB9CiAgICAgICAgREVCVUdEVU1QSEVBREVSKCJzZW5kIiwgIkNsb3NlIFJlYXNvbiIpOwogICAgICAgIERFQlVHRFVNUFNFVFVQKCJzZW5kIiwgKCpidWYgKyAqb3V0X2xlbiAtIDQpLCA0KTsKICAgICAgICBERUJVR01TRygoImR1bXB2X3NlbmQiLCAiICBSZWFzb246XHQlZFxuIiwKICAgICAgICAgICAgICAgICAgKGludCkgKigqYnVmICsgKm91dF9sZW4gLSA0KSkpOwogICAgICAgIERFQlVHSU5ERU5UTEVTUygpOwogICAgICAgIGJyZWFrOwoKICAgIGNhc2UgQUdFTlRYX01TR19SRUdJU1RFUjoKICAgIGNhc2UgQUdFTlRYX01TR19VTlJFR0lTVEVSOgogICAgICAgIHdoaWxlICgoKm91dF9sZW4gKyA0KSA+PSAqYnVmX2xlbikgewogICAgICAgICAgICBpZiAoIShhbGxvd19yZWFsbG9jICYmIHNubXBfcmVhbGxvYyhidWYsIGJ1Zl9sZW4pKSkgewogICAgICAgICAgICAgICAgREVCVUdJTkRFTlRMRVNTKCk7CiAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAocGR1LT5jb21tYW5kID09IEFHRU5UWF9NU0dfUkVHSVNURVIpIHsKICAgICAgICAgICAgKigqYnVmICsgKm91dF9sZW4pID0gKHVfY2hhcikgcGR1LT50aW1lOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICooKmJ1ZiArICpvdXRfbGVuKSA9IDA7CiAgICAgICAgfQogICAgICAgICgqb3V0X2xlbikrKzsKICAgICAgICAqKCpidWYgKyAqb3V0X2xlbikgPSAodV9jaGFyKSBwZHUtPnByaW9yaXR5OwogICAgICAgICgqb3V0X2xlbikrKzsKICAgICAgICAqKCpidWYgKyAqb3V0X2xlbikgPSAodV9jaGFyKSBwZHUtPnJhbmdlX3N1YmlkOwogICAgICAgICgqb3V0X2xlbikrKzsKICAgICAgICAqKCpidWYgKyAqb3V0X2xlbikgPSAodV9jaGFyKSAwOwogICAgICAgICgqb3V0X2xlbikrKzsKCiAgICAgICAgREVCVUdEVU1QSEVBREVSKCJzZW5kIiwgIihVbilSZWdpc3RlciBIZWFkZXIiKTsKICAgICAgICBERUJVR0RVTVBTRVRVUCgic2VuZCIsICgqYnVmICsgKm91dF9sZW4gLSA0KSwgNCk7CiAgICAgICAgaWYgKHBkdS0+Y29tbWFuZCA9PSBBR0VOVFhfTVNHX1JFR0lTVEVSKSB7CiAgICAgICAgICAgIERFQlVHTVNHKCgiZHVtcHZfc2VuZCIsICIgIFRpbWVvdXQ6XHQlZFxuIiwKICAgICAgICAgICAgICAgICAgICAgIChpbnQpICooKmJ1ZiArICpvdXRfbGVuIC0gNCkpKTsKICAgICAgICAgICAgREVCVUdQUklOVElOREVOVCgiZHVtcHZfc2VuZCIpOwogICAgICAgIH0KICAgICAgICBERUJVR01TRygoImR1bXB2X3NlbmQiLCAiICBQcmlvcml0eTpcdCVkXG4iLAogICAgICAgICAgICAgICAgICAoaW50KSAqKCpidWYgKyAqb3V0X2xlbiAtIDMpKSk7CiAgICAgICAgREVCVUdQUklOVElOREVOVCgiZHVtcHZfc2VuZCIpOwogICAgICAgIERFQlVHTVNHKCgiZHVtcHZfc2VuZCIsICIgIFJhbmdlIFN1YklEOlx0JWRcbiIsCiAgICAgICAgICAgICAgICAgIChpbnQpICooKmJ1ZiArICpvdXRfbGVuIC0gMikpKTsKICAgICAgICBERUJVR0lOREVOVExFU1MoKTsKCiAgICAgICAgdnAgPSBwZHUtPnZhcmlhYmxlczsKICAgICAgICBERUJVR0RVTVBIRUFERVIoInNlbmQiLCAiKFVuKVJlZ2lzdGVyIFByZWZpeCIpOwogICAgICAgIGlmICghYWdlbnR4X3JlYWxsb2NfYnVpbGRfb2lkCiAgICAgICAgICAgIChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsIDAsIHZwLT5uYW1lLAogICAgICAgICAgICAgdnAtPm5hbWVfbGVuZ3RoLCBuZXR3b3JrX29yZGVyKSkgewoKICAgICAgICAgICAgREVCVUdJTkRFTlRMRVNTKCk7CiAgICAgICAgICAgIERFQlVHSU5ERU5UTEVTUygpOwogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CiAgICAgICAgREVCVUdJTkRFTlRMRVNTKCk7CgogICAgICAgIGlmIChwZHUtPnJhbmdlX3N1YmlkKSB7CiAgICAgICAgICAgIERFQlVHRFVNUEhFQURFUigic2VuZCIsICIoVW4pUmVnaXN0ZXIgUmFuZ2UiKTsKICAgICAgICAgICAgaWYgKCFhZ2VudHhfcmVhbGxvY19idWlsZF9pbnQKICAgICAgICAgICAgICAgIChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgdnAtPnZhbC5vYmppZFtwZHUtPnJhbmdlX3N1YmlkIC0gMV0sIG5ldHdvcmtfb3JkZXIpKSB7CiAgICAgICAgICAgICAgICBERUJVR0lOREVOVExFU1MoKTsKICAgICAgICAgICAgICAgIERFQlVHSU5ERU5UTEVTUygpOwogICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgREVCVUdJTkRFTlRMRVNTKCk7CiAgICAgICAgfQogICAgICAgIGJyZWFrOwoKICAgIGNhc2UgQUdFTlRYX01TR19HRVRCVUxLOgogICAgICAgIERFQlVHRFVNUEhFQURFUigic2VuZCIsICJHZXRCdWxrIE5vbi1SZXBlYXRlcnMiKTsKICAgICAgICBpZiAoIWFnZW50eF9yZWFsbG9jX2J1aWxkX3Nob3J0CiAgICAgICAgICAgIChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsIAogICAgICAgICAgICAodV9zaG9ydClwZHUtPm5vbl9yZXBlYXRlcnMsCiAgICAgICAgICAgICBuZXR3b3JrX29yZGVyKSkgewogICAgICAgICAgICBERUJVR0lOREVOVExFU1MoKTsKICAgICAgICAgICAgREVCVUdJTkRFTlRMRVNTKCk7CiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KICAgICAgICBERUJVR0lOREVOVExFU1MoKTsKCiAgICAgICAgREVCVUdEVU1QSEVBREVSKCJzZW5kIiwgIkdldEJ1bGsgTWF4LVJlcGV0aXRpb25zIik7CiAgICAgICAgaWYgKCFhZ2VudHhfcmVhbGxvY19idWlsZF9zaG9ydAogICAgICAgICAgICAoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCAKICAgICAgICAgICAgKHVfc2hvcnQpcGR1LT5tYXhfcmVwZXRpdGlvbnMsCiAgICAgICAgICAgICBuZXR3b3JrX29yZGVyKSkgewogICAgICAgICAgICBERUJVR0lOREVOVExFU1MoKTsKICAgICAgICAgICAgREVCVUdJTkRFTlRMRVNTKCk7CiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KICAgICAgICBERUJVR0lOREVOVExFU1MoKTsKCiAgICAgICAgLyoKICAgICAgICAgKiBGYWxsdGhyb3VnaCAgCiAgICAgICAgICovCgogICAgY2FzZSBBR0VOVFhfTVNHX0dFVDoKICAgIGNhc2UgQUdFTlRYX01TR19HRVRORVhUOgogICAgICAgIERFQlVHRFVNUEhFQURFUigic2VuZCIsICJHZXQqIFZhcmlhYmxlIExpc3QiKTsKICAgICAgICBmb3IgKHZwID0gcGR1LT52YXJpYWJsZXM7IHZwICE9IE5VTEw7IHZwID0gdnAtPm5leHRfdmFyaWFibGUpIHsKICAgICAgICAgICAgaW5jID0gKHZwLT50eXBlID09IEFTTl9QUklWX0lOQ0xfUkFOR0UpOwogICAgICAgICAgICBpZiAoIWFnZW50eF9yZWFsbG9jX2J1aWxkX29pZAogICAgICAgICAgICAgICAgKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgaW5jLCB2cC0+bmFtZSwKICAgICAgICAgICAgICAgICB2cC0+bmFtZV9sZW5ndGgsIG5ldHdvcmtfb3JkZXIpKSB7CiAgICAgICAgICAgICAgICBERUJVR0lOREVOVExFU1MoKTsKICAgICAgICAgICAgICAgIERFQlVHSU5ERU5UTEVTUygpOwogICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCFhZ2VudHhfcmVhbGxvY19idWlsZF9vaWQKICAgICAgICAgICAgICAgIChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsIDAsIHZwLT52YWwub2JqaWQsCiAgICAgICAgICAgICAgICAgdnAtPnZhbF9sZW4gLyBzaXplb2Yob2lkKSwgbmV0d29ya19vcmRlcikpIHsKICAgICAgICAgICAgICAgIERFQlVHSU5ERU5UTEVTUygpOwogICAgICAgICAgICAgICAgREVCVUdJTkRFTlRMRVNTKCk7CiAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBERUJVR0lOREVOVExFU1MoKTsKICAgICAgICBicmVhazsKCiAgICBjYXNlIEFHRU5UWF9NU0dfUkVTUE9OU0U6CiAgICAgICAgcGR1LT5mbGFncyAmPSB+KFVDRF9NU0dfRkxBR19FWFBFQ1RfUkVTUE9OU0UpOwogICAgICAgIGlmICghYWdlbnR4X3JlYWxsb2NfYnVpbGRfaW50KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZHUtPnRpbWUsIG5ldHdvcmtfb3JkZXIpKSB7CiAgICAgICAgICAgIERFQlVHSU5ERU5UTEVTUygpOwogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CiAgICAgICAgREVCVUdEVU1QSEVBREVSKCJzZW5kIiwgIlJlc3BvbnNlIik7CiAgICAgICAgREVCVUdEVU1QU0VUVVAoInNlbmQiLCAoKmJ1ZiArICpvdXRfbGVuIC0gNCksIDQpOwogICAgICAgIERFQlVHTVNHKCgiZHVtcHZfc2VuZCIsICIgIHN5c1VwVGltZTpcdCVsdVxuIiwgcGR1LT50aW1lKSk7CiAgICAgICAgREVCVUdJTkRFTlRMRVNTKCk7CgogICAgICAgIGlmICghYWdlbnR4X3JlYWxsb2NfYnVpbGRfc2hvcnQKICAgICAgICAgICAgKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgCiAgICAgICAgICAgICh1X3Nob3J0KXBkdS0+ZXJyc3RhdCwKICAgICAgICAgICAgIG5ldHdvcmtfb3JkZXIpCiAgICAgICAgICAgIHx8ICFhZ2VudHhfcmVhbGxvY19idWlsZF9zaG9ydChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd19yZWFsbG9jLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1X3Nob3J0KXBkdS0+ZXJyaW5kZXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXR3b3JrX29yZGVyKSkgewogICAgICAgICAgICBERUJVR0lOREVOVExFU1MoKTsKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQogICAgICAgIERFQlVHRFVNUEhFQURFUigic2VuZCIsICJSZXNwb25zZSBlcnJvcnMiKTsKICAgICAgICBERUJVR0RVTVBTRVRVUCgic2VuZCIsICgqYnVmICsgKm91dF9sZW4gLSA0KSwgNCk7CiAgICAgICAgREVCVUdNU0coKCJkdW1wdl9zZW5kIiwgIiAgZXJyc3RhdDpcdCVsZFxuIiwgcGR1LT5lcnJzdGF0KSk7CiAgICAgICAgREVCVUdQUklOVElOREVOVCgiZHVtcHZfc2VuZCIpOwogICAgICAgIERFQlVHTVNHKCgiZHVtcHZfc2VuZCIsICIgIGVycmluZGV4Olx0JWxkXG4iLCBwZHUtPmVycmluZGV4KSk7CiAgICAgICAgREVCVUdJTkRFTlRMRVNTKCk7CgogICAgICAgIC8qCiAgICAgICAgICogRmFsbHRocm91Z2ggIAogICAgICAgICAqLwoKICAgIGNhc2UgQUdFTlRYX01TR19JTkRFWF9BTExPQ0FURToKICAgIGNhc2UgQUdFTlRYX01TR19JTkRFWF9ERUFMTE9DQVRFOgogICAgY2FzZSBBR0VOVFhfTVNHX05PVElGWToKICAgIGNhc2UgQUdFTlRYX01TR19URVNUU0VUOgogICAgICAgIERFQlVHRFVNUEhFQURFUigic2VuZCIsICJHZXQqIFZhcmlhYmxlIExpc3QiKTsKICAgICAgICBmb3IgKHZwID0gcGR1LT52YXJpYWJsZXM7IHZwICE9IE5VTEw7IHZwID0gdnAtPm5leHRfdmFyaWFibGUpIHsKICAgICAgICAgICAgaWYgKCFhZ2VudHhfcmVhbGxvY19idWlsZF92YXJiaW5kCiAgICAgICAgICAgICAgICAoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCB2cCwKICAgICAgICAgICAgICAgICBuZXR3b3JrX29yZGVyKSkgewogICAgICAgICAgICAgICAgREVCVUdJTkRFTlRMRVNTKCk7CiAgICAgICAgICAgICAgICBERUJVR0lOREVOVExFU1MoKTsKICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIERFQlVHSU5ERU5UTEVTUygpOwogICAgICAgIGJyZWFrOwoKICAgIGNhc2UgQUdFTlRYX01TR19DT01NSVRTRVQ6CiAgICBjYXNlIEFHRU5UWF9NU0dfVU5ET1NFVDoKICAgIGNhc2UgQUdFTlRYX01TR19QSU5HOgogICAgICAgIC8qCiAgICAgICAgICogIkVtcHR5IiBwYWNrZXQuICAKICAgICAgICAgKi8KICAgICAgICBicmVhazsKCiAgICBjYXNlIEFHRU5UWF9NU0dfQ0xFQU5VUFNFVDoKICAgICAgICBwZHUtPmZsYWdzICY9IH4oVUNEX01TR19GTEFHX0VYUEVDVF9SRVNQT05TRSk7CiAgICAgICAgYnJlYWs7CgogICAgY2FzZSBBR0VOVFhfTVNHX0FERF9BR0VOVF9DQVBTOgogICAgICAgIERFQlVHRFVNUEhFQURFUigic2VuZCIsICJBZ2VudENhcHMgT0lEIik7CiAgICAgICAgaWYgKCFhZ2VudHhfcmVhbGxvY19idWlsZF9vaWQKICAgICAgICAgICAgKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgMCwgcGR1LT52YXJpYWJsZXMtPm5hbWUsCiAgICAgICAgICAgICBwZHUtPnZhcmlhYmxlcy0+bmFtZV9sZW5ndGgsIG5ldHdvcmtfb3JkZXIpKSB7CiAgICAgICAgICAgIERFQlVHSU5ERU5UTEVTUygpOwogICAgICAgICAgICBERUJVR0lOREVOVExFU1MoKTsKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQogICAgICAgIERFQlVHSU5ERU5UTEVTUygpOwoKICAgICAgICBERUJVR0RVTVBIRUFERVIoInNlbmQiLCAiQWdlbnRDYXBzIERlc2NyaXB0aW9uIik7CiAgICAgICAgaWYgKCFhZ2VudHhfcmVhbGxvY19idWlsZF9zdHJpbmcKICAgICAgICAgICAgKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgIHBkdS0+dmFyaWFibGVzLT52YWwuc3RyaW5nLCBwZHUtPnZhcmlhYmxlcy0+dmFsX2xlbiwKICAgICAgICAgICAgIG5ldHdvcmtfb3JkZXIpKSB7CiAgICAgICAgICAgIERFQlVHSU5ERU5UTEVTUygpOwogICAgICAgICAgICBERUJVR0lOREVOVExFU1MoKTsKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQogICAgICAgIERFQlVHSU5ERU5UTEVTUygpOwogICAgICAgIGJyZWFrOwoKICAgIGNhc2UgQUdFTlRYX01TR19SRU1PVkVfQUdFTlRfQ0FQUzoKICAgICAgICBERUJVR0RVTVBIRUFERVIoInNlbmQiLCAiQWdlbnRDYXBzIE9JRCIpOwogICAgICAgIGlmICghYWdlbnR4X3JlYWxsb2NfYnVpbGRfb2lkCiAgICAgICAgICAgIChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsIDAsIHBkdS0+dmFyaWFibGVzLT5uYW1lLAogICAgICAgICAgICAgcGR1LT52YXJpYWJsZXMtPm5hbWVfbGVuZ3RoLCBuZXR3b3JrX29yZGVyKSkgewogICAgICAgICAgICBERUJVR0lOREVOVExFU1MoKTsKICAgICAgICAgICAgREVCVUdJTkRFTlRMRVNTKCk7CiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KICAgICAgICBERUJVR0lOREVOVExFU1MoKTsKICAgICAgICBicmVhazsKCiAgICBkZWZhdWx0OgogICAgICAgIHNlc3Npb24tPnNfc25tcF9lcnJubyA9IFNOTVBFUlJfVU5LTk9XTl9QRFU7CiAgICAgICAgcmV0dXJuIDA7CiAgICB9CiAgICBERUJVR0lOREVOVExFU1MoKTsKCiAgICAvKgogICAgICogRml4IHRoZSBwYXlsb2FkIGxlbmd0aCAoaWdub3JpbmcgdGhlIDIwLWJ5dGUgaGVhZGVyKS4gIAogICAgICovCgogICAgYWdlbnR4X2J1aWxkX2ludCgoKmJ1ZiArIDE2KSwgKCpvdXRfbGVuIC0gaWxlbikgLSAyMCwgbmV0d29ya19vcmRlcik7CgogICAgREVCVUdNU0dUTCgoImFnZW50eF9idWlsZCIsICJwYWNrZXQgYnVpbHQgb2theVxuIikpOwogICAgcmV0dXJuIDE7Cn0KCmludAphZ2VudHhfcmVhbGxvY19idWlsZChuZXRzbm1wX3Nlc3Npb24gKiBzZXNzaW9uLCBuZXRzbm1wX3BkdSAqcGR1LAogICAgICAgICAgICAgICAgICAgICB1X2NoYXIgKiogYnVmLCBzaXplX3QgKiBidWZfbGVuLCBzaXplX3QgKiBvdXRfbGVuKQp7CiAgICBpZiAoc2Vzc2lvbiA9PSBOVUxMIHx8IGJ1Zl9sZW4gPT0gTlVMTCB8fAogICAgICAgIG91dF9sZW4gPT0gTlVMTCB8fCBwZHUgPT0gTlVMTCB8fCBidWYgPT0gTlVMTCkgewogICAgICAgIHJldHVybiAtMTsKICAgIH0KICAgIGlmICghX2FnZW50eF9yZWFsbG9jX2J1aWxkKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgMSwgc2Vzc2lvbiwgcGR1KSkgewogICAgICAgIGlmIChzZXNzaW9uLT5zX3NubXBfZXJybm8gPT0gMCkgewogICAgICAgICAgICBzZXNzaW9uLT5zX3NubXBfZXJybm8gPSBTTk1QRVJSX0JBRF9BU04xX0JVSUxEOwogICAgICAgIH0KICAgICAgICByZXR1cm4gLTE7CiAgICB9CgogICAgcmV0dXJuIDA7Cn0KCiAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqCgkqCgkqICBVdGlsaXR5IGZ1bmN0aW9ucyBmb3IgcGFyc2luZyBhbiBBZ2VudFggcGFja2V0CgkqCgkqKioqKioqKioqKioqKioqKioqKioqKi8KCmludAphZ2VudHhfcGFyc2VfaW50KHVfY2hhciAqIGRhdGEsIHVfaW50IG5ldHdvcmtfYnl0ZV9vcmRlcikKewogICAgdV9pbnQgICAgICAgICAgIHZhbHVlID0gMDsKCiAgICAvKgogICAgICogIE5vdGUgLSB0aGlzIGRvZXNuJ3QgaGFuZGxlICdQRFBfRU5ESUFOJyBzeXN0ZW1zCiAgICAgKiAgICAgIElmIGFueW9uZSBuZWVkcyB0aGlzIGFkZGVkLCBjb250YWN0IHRoZSBjb2RlcnMgbGlzdAogICAgICovCiAgICBERUJVR0RVTVBTRVRVUCgicmVjdiIsIGRhdGEsIDQpOwogICAgaWYgKG5ldHdvcmtfYnl0ZV9vcmRlcikgewogICAgICAgIG1lbW1vdmUoJnZhbHVlLCBkYXRhLCA0KTsKI2lmbmRlZiBXT1JEU19CSUdFTkRJQU4KICAgICAgICB2YWx1ZSA9IG50b2hsKHZhbHVlKTsKI2VuZGlmCiAgICB9IGVsc2UgewojaWZuZGVmIFdPUkRTX0JJR0VORElBTgogICAgICAgIG1lbW1vdmUoJnZhbHVlLCBkYXRhLCA0KTsKI2Vsc2UKICAgICAgICAvKgogICAgICAgICAqIFRoZSBlcXVpdmFsZW50IG9mIHRoZSAnbnRvaGwoKScgbWFjcm8sCiAgICAgICAgICogZXhjZXB0IHRoaXMgbWFjcm8gaXMgbnVsbCBvbiBiaWctZW5kaWFuIHN5c3RlbXMgCiAgICAgICAgICovCiAgICAgICAgdmFsdWUgKz0gZGF0YVszXTsKICAgICAgICB2YWx1ZSA8PD0gODsKICAgICAgICB2YWx1ZSArPSBkYXRhWzJdOwogICAgICAgIHZhbHVlIDw8PSA4OwogICAgICAgIHZhbHVlICs9IGRhdGFbMV07CiAgICAgICAgdmFsdWUgPDw9IDg7CiAgICAgICAgdmFsdWUgKz0gZGF0YVswXTsKI2VuZGlmCiAgICB9CiAgICBERUJVR01TRygoImR1bXB2X3JlY3YiLCAiICBJbnRlZ2VyOlx0JXUgKDB4JS4yWClcbiIsIHZhbHVlLCB2YWx1ZSkpOwoKICAgIHJldHVybiB2YWx1ZTsKfQoKCmludAphZ2VudHhfcGFyc2Vfc2hvcnQodV9jaGFyICogZGF0YSwgdV9pbnQgbmV0d29ya19ieXRlX29yZGVyKQp7CiAgICB1X3Nob3J0ICAgICAgICAgdmFsdWUgPSAwOwoKICAgIGlmIChuZXR3b3JrX2J5dGVfb3JkZXIpIHsKICAgICAgICBtZW1tb3ZlKCZ2YWx1ZSwgZGF0YSwgMik7CiNpZm5kZWYgV09SRFNfQklHRU5ESUFOCiAgICAgICAgdmFsdWUgPSBudG9ocyh2YWx1ZSk7CiNlbmRpZgogICAgfSBlbHNlIHsKI2lmbmRlZiBXT1JEU19CSUdFTkRJQU4KICAgICAgICBtZW1tb3ZlKCZ2YWx1ZSwgZGF0YSwgMik7CiNlbHNlCiAgICAgICAgLyoKICAgICAgICAgKiBUaGUgZXF1aXZhbGVudCBvZiB0aGUgJ250b2hzKCknIG1hY3JvLAogICAgICAgICAqIGV4Y2VwdCB0aGlzIG1hY3JvIGlzIG51bGwgb24gYmlnLWVuZGlhbiBzeXN0ZW1zIAogICAgICAgICAqLwogICAgICAgIHZhbHVlICs9IGRhdGFbMV07CiAgICAgICAgdmFsdWUgPDw9IDg7CiAgICAgICAgdmFsdWUgKz0gZGF0YVswXTsKI2VuZGlmCiAgICB9CgogICAgREVCVUdEVU1QU0VUVVAoInJlY3YiLCBkYXRhLCAyKTsKICAgIERFQlVHTVNHKCgiZHVtcHZfcmVjdiIsICIgIFNob3J0Olx0JWh1ICgweCUuMlgpXG4iLCB2YWx1ZSwgdmFsdWUpKTsKICAgIHJldHVybiB2YWx1ZTsKfQoKCnVfY2hhciAgICAgICAgICoKYWdlbnR4X3BhcnNlX29pZCh1X2NoYXIgKiBkYXRhLCBzaXplX3QgKiBsZW5ndGgsIGludCAqaW5jLAogICAgICAgICAgICAgICAgIG9pZCAqIG9pZF9idWYsIHNpemVfdCAqIG9pZF9sZW4sIHVfaW50IG5ldHdvcmtfYnl0ZV9vcmRlcikKewogICAgdV9pbnQgICAgICAgICAgIG5fc3ViaWQ7CiAgICB1X2ludCAgICAgICAgICAgcHJlZml4OwogICAgdV9pbnQgICAgICAgICAgIHRtcF9vaWRfbGVuOwogICAgaW50ICAgICAgICAgICAgIGk7CiAgICBpbnQgICAgICAgICAgICAgaW50X29mZnNldDsKICAgIHVfaW50ICAgICAgICAgICppbnRfcHRyID0gKHVfaW50ICopb2lkX2J1ZjsKICAgIHVfY2hhciAgICAgICAgICpidWZfcHRyID0gZGF0YTsKCiAgICBpZiAoKmxlbmd0aCA8IDQpIHsKICAgICAgICBERUJVR01TR1RMKCgiYWdlbnR4IiwgIkluY29tcGxldGUgT2JqZWN0IElEXG4iKSk7CiAgICAgICAgcmV0dXJuIE5VTEw7CiAgICB9CgogICAgREVCVUdEVU1QSEVBREVSKCJyZWN2IiwgIk9JRCBIZWFkZXIiKTsKICAgIERFQlVHRFVNUFNFVFVQKCJyZWN2IiwgZGF0YSwgNCk7CiAgICBERUJVR01TRygoImR1bXB2X3JlY3YiLCAiICAjIHN1YmlkczpcdCVkICgweCUuMlgpXG4iLCBkYXRhWzBdLAogICAgICAgICAgICAgIGRhdGFbMF0pKTsKICAgIERFQlVHUFJJTlRJTkRFTlQoImR1bXB2X3JlY3YiKTsKICAgIERFQlVHTVNHKCgiZHVtcHZfcmVjdiIsICIgIHByZWZpeDogXHQlZCAoMHglLjJYKVxuIiwgZGF0YVsxXSwKICAgICAgICAgICAgICBkYXRhWzFdKSk7CiAgICBERUJVR1BSSU5USU5ERU5UKCJkdW1wdl9yZWN2Iik7CiAgICBERUJVR01TRygoImR1bXB2X3JlY3YiLCAiICBpbmNsdXNpdmU6XHQlZCAoMHglLjJYKVxuIiwgZGF0YVsyXSwKICAgICAgICAgICAgICBkYXRhWzJdKSk7CgogICAgREVCVUdJTkRFTlRMRVNTKCk7CiAgICBERUJVR0RVTVBIRUFERVIoInJlY3YiLCAiT0lEIFNlZ21lbnRzIik7CgogICAgbl9zdWJpZCA9IGRhdGFbMF07CiAgICBwcmVmaXggPSBkYXRhWzFdOwogICAgaWYgKGluYykKICAgICAgICAqaW5jID0gZGF0YVsyXTsKICAgIGludF9vZmZzZXQgPSBzaXplb2Yob2lkKS80OwoKICAgIGJ1Zl9wdHIgKz0gNDsKICAgICpsZW5ndGggLT0gNDsKCiAgICBERUJVR01TRygoImRqcCIsICIgIHBhcnNlX29pZFxuIikpOwogICAgREVCVUdNU0coKCJkanAiLCAiICBzaXplb2Yob2lkKSA9ICVkXG4iLCAoaW50KXNpemVvZihvaWQpKSk7CiAgICBpZiAobl9zdWJpZCA9PSAwICYmIHByZWZpeCA9PSAwKSB7CiAgICAgICAgLyoKICAgICAgICAgKiBOdWxsIE9JRCAKICAgICAgICAgKi8KICAgICAgICBtZW1zZXQoaW50X3B0ciwgMCwgMiAqIHNpemVvZihvaWQpKTsKICAgICAgICAqb2lkX2xlbiA9IDI7CiAgICAgICAgREVCVUdQUklOVElOREVOVCgiZHVtcHZfcmVjdiIpOwogICAgICAgIERFQlVHTVNHKCgiZHVtcHZfcmVjdiIsICJPSUQ6IE5VTEwgKDAuMClcbiIpKTsKICAgICAgICBERUJVR0lOREVOVExFU1MoKTsKICAgICAgICByZXR1cm4gYnVmX3B0cjsKICAgIH0KCiAgICAvKgogICAgICogQ2hlY2sgdGhhdCB0aGUgZXhwYW5kZWQgT0lEIHdpbGwgZml0IGluIHRoZSBidWZmZXIgcHJvdmlkZWQKICAgICAqLwogICAgdG1wX29pZF9sZW4gPSAocHJlZml4ID8gbl9zdWJpZCArIDUgOiBuX3N1YmlkKTsKICAgIGlmICgqb2lkX2xlbiA8IHRtcF9vaWRfbGVuKSB7CiAgICAgICAgREVCVUdNU0dUTCgoImFnZW50eCIsICJPdmVyc2l6ZWQgT2JqZWN0IElEIChidWY9JSIgTkVUU05NUF9QUkl6ICJkIgoJCSAgICAiIHBkdT0lZClcbiIsICpvaWRfbGVuLCB0bXBfb2lkX2xlbikpOwogICAgICAgIERFQlVHSU5ERU5UTEVTUygpOwogICAgICAgIHJldHVybiBOVUxMOwogICAgfQoKI2lmZGVmIFdPUkRTX0JJR0VORElBTgojIGRlZmluZSBlbmRpYW5vZmYgMQojZWxzZQojIGRlZmluZSBlbmRpYW5vZmYgMAojZW5kaWYKICAgIGlmICgqbGVuZ3RoIDwgNCAqIG5fc3ViaWQpIHsKICAgICAgICBERUJVR01TR1RMKCgiYWdlbnR4IiwgIkluY29tcGxldGUgT2JqZWN0IElEXG4iKSk7CiAgICAgICAgREVCVUdJTkRFTlRMRVNTKCk7CiAgICAgICAgcmV0dXJuIE5VTEw7CiAgICB9CgogICAgaWYgKHByZWZpeCkgewkgCiAgICAgICAgaWYgKGludF9vZmZzZXQgPT0gMikgeyAgCS8qIGFsaWduIE9JRCB2YWx1ZXMgaW4gNjQgYml0IGFnZW50ICovICAKCSAgICBtZW1zZXQoaW50X3B0ciwgMCwgMTAqc2l6ZW9mKGludF9wdHJbMF0pKTsgCgkgICAgaW50X3B0clswK2VuZGlhbm9mZl0gPSAxOwoJICAgIGludF9wdHJbMitlbmRpYW5vZmZdID0gMzsKCSAgICBpbnRfcHRyWzQrZW5kaWFub2ZmXSA9IDY7CgkgICAgaW50X3B0cls2K2VuZGlhbm9mZl0gPSAxOwoJICAgIGludF9wdHJbOCtlbmRpYW5vZmZdID0gcHJlZml4OwogICAgICAgIH0gZWxzZSB7IC8qIGFzc3VtZSBpbnRfb2Zmc2V0ID09IDEgKi8KCSAgICBpbnRfcHRyWzBdID0gMTsKCSAgICBpbnRfcHRyWzFdID0gMzsKCSAgICBpbnRfcHRyWzJdID0gNjsKCSAgICBpbnRfcHRyWzNdID0gMTsKCSAgICBpbnRfcHRyWzRdID0gcHJlZml4OwogICAgICAgIH0KICAgICAgICBpbnRfcHRyID0gaW50X3B0ciArIChpbnRfb2Zmc2V0ICogNSk7CiAgICB9CgogICAgZm9yIChpID0gMDsgaSA8IChpbnQpIChpbnRfb2Zmc2V0ICogbl9zdWJpZCk7IGkgPSBpICsgaW50X29mZnNldCkgewoJaW50IHg7CgoJeCA9IGFnZW50eF9wYXJzZV9pbnQoYnVmX3B0ciwgbmV0d29ya19ieXRlX29yZGVyKTsKCWlmIChpbnRfb2Zmc2V0ID09IDIpIHsKICAgICAgICAgICAgaW50X3B0cltpKzBdID0gMDsKCSAgICBpbnRfcHRyW2krMV0gPSAwOwoJICAgIGludF9wdHJbaStlbmRpYW5vZmZdPXg7CiAgICAgICAgfSBlbHNlIHsKCSAgICBpbnRfcHRyW2ldID0geDsKICAgICAgICB9CiAgICAgICAgYnVmX3B0ciArPSA0OwogICAgICAgICpsZW5ndGggLT0gNDsKICAgIH0KCiAgICAqb2lkX2xlbiA9IHRtcF9vaWRfbGVuOwoKICAgIERFQlVHSU5ERU5UTEVTUygpOwogICAgREVCVUdQUklOVElOREVOVCgiZHVtcHZfcmVjdiIpOwogICAgREVCVUdNU0coKCJkdW1wdl9yZWN2IiwgIk9JRDogIikpOwogICAgREVCVUdNU0dPSUQoKCJkdW1wdl9yZWN2Iiwgb2lkX2J1ZiwgKm9pZF9sZW4pKTsKICAgIERFQlVHTVNHKCgiZHVtcHZfcmVjdiIsICJcbiIpKTsKCiAgICByZXR1cm4gYnVmX3B0cjsKfQoKCgp1X2NoYXIgICAgICAgICAqCmFnZW50eF9wYXJzZV9zdHJpbmcodV9jaGFyICogZGF0YSwgc2l6ZV90ICogbGVuZ3RoLAogICAgICAgICAgICAgICAgICAgIHVfY2hhciAqIHN0cmluZywgc2l6ZV90ICogc3RyX2xlbiwKICAgICAgICAgICAgICAgICAgICB1X2ludCBuZXR3b3JrX2J5dGVfb3JkZXIpCnsKICAgIHVfaW50ICAgICAgICAgICBsZW47CgogICAgaWYgKCpsZW5ndGggPCA0KSB7CiAgICAgICAgREVCVUdNU0dUTCgoImFnZW50eCIsICJJbmNvbXBsZXRlIHN0cmluZyAodG9vIHNob3J0OiAlZClcbiIsCiAgICAgICAgICAgICAgICAgICAgKGludCkqbGVuZ3RoKSk7CiAgICAgICAgcmV0dXJuIE5VTEw7CiAgICB9CgogICAgbGVuID0gYWdlbnR4X3BhcnNlX2ludChkYXRhLCBuZXR3b3JrX2J5dGVfb3JkZXIpOwogICAgaWYgKCpsZW5ndGggPCBsZW4gKyA0KSB7CiAgICAgICAgREVCVUdNU0dUTCgoImFnZW50eCIsICJJbmNvbXBsZXRlIHN0cmluZyAoc3RpbGwgdG9vIHNob3J0OiAlZClcbiIsCiAgICAgICAgICAgICAgICAgICAgKGludCkqbGVuZ3RoKSk7CiAgICAgICAgcmV0dXJuIE5VTEw7CiAgICB9CiAgICBpZiAobGVuID4gKnN0cl9sZW4pIHsKICAgICAgICBERUJVR01TR1RMKCgiYWdlbnR4IiwgIlN0cmluZyB0b28gbG9uZyAodG9vIGxvbmcpXG4iKSk7CiAgICAgICAgcmV0dXJuIE5VTEw7CiAgICB9CiAgICBtZW1tb3ZlKHN0cmluZywgZGF0YSArIDQsIGxlbik7CiAgICBzdHJpbmdbbGVuXSA9ICdcMCc7CiAgICAqc3RyX2xlbiA9IGxlbjsKCiAgICBsZW4gKz0gMzsgICAgICAgICAgICAgICAgICAgLyogRXh0ZW5kIHRoZSBzdHJpbmcgbGVuZ3RoIHRvIGluY2x1ZGUgdGhlIHBhZGRpbmcgKi8KICAgIGxlbiA+Pj0gMjsKICAgIGxlbiA8PD0gMjsKCiAgICAqbGVuZ3RoIC09IChsZW4gKyA0KTsKICAgIERFQlVHRFVNUFNFVFVQKCJyZWN2IiwgZGF0YSwgKGxlbiArIDQpKTsKICAgIERFQlVHSUYoImR1bXB2X3JlY3YiKSB7CiAgICAgICAgdV9jaGFyICAgICAgICAgKmJ1ZiA9IE5VTEw7CiAgICAgICAgc2l6ZV90ICAgICAgICAgIGJ1Zl9sZW4gPSAwLCBvdXRfbGVuID0gMDsKCiAgICAgICAgaWYgKHNwcmludF9yZWFsbG9jX2FzY2lpc3RyaW5nKCZidWYsICZidWZfbGVuLCAmb3V0X2xlbiwgMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nLCBsZW4pKSB7CiAgICAgICAgICAgIERFQlVHTVNHKCgiZHVtcHZfcmVjdiIsICJTdHJpbmc6ICVzXG4iLCBidWYpKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBERUJVR01TRygoImR1bXB2X3JlY3YiLCAiU3RyaW5nOiAlcyBbVFJVTkNBVEVEXVxuIiwgYnVmKSk7CiAgICAgICAgfQogICAgICAgIGlmIChidWYgIT0gTlVMTCkgewogICAgICAgICAgICBmcmVlKGJ1Zik7CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIGRhdGEgKyAobGVuICsgNCk7Cn0KCnVfY2hhciAgICAgICAgICoKYWdlbnR4X3BhcnNlX29wYXF1ZSh1X2NoYXIgKiBkYXRhLCBzaXplX3QgKiBsZW5ndGgsIGludCAqdHlwZSwKICAgICAgICAgICAgICAgICAgICB1X2NoYXIgKiBvcGFxdWVfYnVmLCBzaXplX3QgKiBvcGFxdWVfbGVuLAogICAgICAgICAgICAgICAgICAgIHVfaW50IG5ldHdvcmtfYnl0ZV9vcmRlcikKewojaWZkZWYgTkVUU05NUF9XSVRIX09QQVFVRV9TUEVDSUFMX1RZUEVTCiAgICB1bmlvbiB7CiAgICAgICAgZmxvYXQgICAgICAgICAgIGZsb2F0VmFsOwogICAgICAgIGRvdWJsZSAgICAgICAgICBkb3VibGVWYWw7CiAgICAgICAgaW50ICAgICAgICAgICAgIGludFZhbFsyXTsKICAgICAgICBjaGFyICAgICAgICAgICAgY1tzaXplb2YoZG91YmxlKV07CiAgICB9IGZ1OwogICAgaW50ICAgICAgICAgICAgIHRtcDsKICAgIHVfY2hhciAgICAgICAgICpidWY7CiNlbmRpZgogICAgdV9jaGFyICAgICAgICAgKmNvbnN0IGNwID0KICAgICAgICBhZ2VudHhfcGFyc2Vfc3RyaW5nKGRhdGEsIGxlbmd0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wYXF1ZV9idWYsIG9wYXF1ZV9sZW4sIG5ldHdvcmtfYnl0ZV9vcmRlcik7CgojaWZkZWYgTkVUU05NUF9XSVRIX09QQVFVRV9TUEVDSUFMX1RZUEVTCiAgICBpZiAoY3AgPT0gTlVMTCkKICAgICAgICByZXR1cm4gTlVMTDsKCiAgICBidWYgPSBvcGFxdWVfYnVmOwoKICAgIGlmICgoKm9wYXF1ZV9sZW4gPD0gMykgfHwgKGJ1ZlswXSAhPSBBU05fT1BBUVVFX1RBRzEpKQogICAgICAgIHJldHVybiBjcDsgICAgICAgICAgICAgIC8qIFVucmVjb2duaXNlZCBvcGFxdWUgdHlwZSAqLwoKICAgIHN3aXRjaCAoYnVmWzFdKSB7CiAgICBjYXNlIEFTTl9PUEFRVUVfRkxPQVQ6CiAgICAgICAgaWYgKCgqb3BhcXVlX2xlbiAhPSAoMyArIHNpemVvZihmbG9hdCkpKSB8fAogICAgICAgICAgICAoYnVmWzJdICE9IHNpemVvZihmbG9hdCkpKQogICAgICAgICAgICByZXR1cm4gY3A7ICAgICAgICAgIC8qIEVuY29kaW5nIGlzbid0IHJpZ2h0IGZvciBGTE9BVCAqLwoKICAgICAgICBtZW1jcHkoJmZ1LmNbMF0sICZidWZbM10sIHNpemVvZihmbG9hdCkpOwogICAgICAgIGZ1LmludFZhbFswXSA9IG50b2hsKGZ1LmludFZhbFswXSk7CiAgICAgICAgKm9wYXF1ZV9sZW4gPSBzaXplb2YoZmxvYXQpOwogICAgICAgIG1lbWNweShvcGFxdWVfYnVmLCAmZnUuY1swXSwgc2l6ZW9mKGZsb2F0KSk7CiAgICAgICAgKnR5cGUgPSBBU05fT1BBUVVFX0ZMT0FUOwogICAgICAgIERFQlVHTVNHKCgiZHVtcHZfcmVjdiIsICJGbG9hdDogJWZcbiIsIGZ1LmZsb2F0VmFsKSk7CiAgICAgICAgcmV0dXJuIGNwOwoKICAgIGNhc2UgQVNOX09QQVFVRV9ET1VCTEU6CiAgICAgICAgaWYgKCgqb3BhcXVlX2xlbiAhPSAoMyArIHNpemVvZihkb3VibGUpKSkgfHwKICAgICAgICAgICAgKGJ1ZlsyXSAhPSBzaXplb2YoZG91YmxlKSkpCiAgICAgICAgICAgIHJldHVybiBjcDsgICAgICAgICAgLyogRW5jb2RpbmcgaXNuJ3QgcmlnaHQgZm9yIERPVUJMRSAqLwoKICAgICAgICBtZW1jcHkoJmZ1LmNbMF0sICZidWZbM10sIHNpemVvZihkb3VibGUpKTsKICAgICAgICB0bXAgPSBudG9obChmdS5pbnRWYWxbMV0pOwogICAgICAgIGZ1LmludFZhbFsxXSA9IG50b2hsKGZ1LmludFZhbFswXSk7CiAgICAgICAgZnUuaW50VmFsWzBdID0gdG1wOwogICAgICAgICpvcGFxdWVfbGVuID0gc2l6ZW9mKGRvdWJsZSk7CiAgICAgICAgbWVtY3B5KG9wYXF1ZV9idWYsICZmdS5jWzBdLCBzaXplb2YoZG91YmxlKSk7CiAgICAgICAgKnR5cGUgPSBBU05fT1BBUVVFX0RPVUJMRTsKICAgICAgICBERUJVR01TRygoImR1bXB2X3JlY3YiLCAiRG91YmxlOiAlZlxuIiwgZnUuZG91YmxlVmFsKSk7CiAgICAgICAgcmV0dXJuIGNwOwoKICAgIGNhc2UgQVNOX09QQVFVRV9JNjQ6CiAgICBjYXNlIEFTTl9PUEFRVUVfVTY0OgogICAgY2FzZSBBU05fT1BBUVVFX0NPVU5URVI2NDoKICAgIGRlZmF1bHQ6CiAgICAgICAgcmV0dXJuIGNwOyAgICAgICAgICAgICAgLyogVW5yZWNvZ25pc2VkIG9wYXF1ZSBzdWItdHlwZSAqLwogICAgfQojZWxzZQogICAgcmV0dXJuIGNwOwojZW5kaWYKfQoKCnVfY2hhciAgICAgICAgICoKYWdlbnR4X3BhcnNlX3ZhcmJpbmQodV9jaGFyICogZGF0YSwgc2l6ZV90ICogbGVuZ3RoLCBpbnQgKnR5cGUsCiAgICAgICAgICAgICAgICAgICAgIG9pZCAqIG9pZF9idWYsIHNpemVfdCAqIG9pZF9sZW4sCiAgICAgICAgICAgICAgICAgICAgIHVfY2hhciAqIGRhdGFfYnVmLCBzaXplX3QgKiBkYXRhX2xlbiwKICAgICAgICAgICAgICAgICAgICAgdV9pbnQgbmV0d29ya19ieXRlX29yZGVyKQp7CiAgICB1X2NoYXIgICAgICAgICAqYnVmcCA9IGRhdGE7CiAgICB1X2ludCAgICAgICAgICAgaW50X3ZhbDsKICAgIHN0cnVjdCBjb3VudGVyNjQgdG1wNjQ7CgogICAgREVCVUdEVU1QSEVBREVSKCJyZWN2IiwgIlZhckJpbmQ6Iik7CiAgICBERUJVR0RVTVBIRUFERVIoInJlY3YiLCAiVHlwZSIpOwogICAgKnR5cGUgPSBhZ2VudHhfcGFyc2Vfc2hvcnQoYnVmcCwgbmV0d29ya19ieXRlX29yZGVyKTsKICAgIERFQlVHSU5ERU5UTEVTUygpOwogICAgYnVmcCArPSA0OwogICAgKmxlbmd0aCAtPSA0OwoKICAgIGJ1ZnAgPSBhZ2VudHhfcGFyc2Vfb2lkKGJ1ZnAsIGxlbmd0aCwgTlVMTCwgb2lkX2J1Ziwgb2lkX2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldHdvcmtfYnl0ZV9vcmRlcik7CiAgICBpZiAoYnVmcCA9PSBOVUxMKSB7CiAgICAgICAgREVCVUdJTkRFTlRMRVNTKCk7CiAgICAgICAgcmV0dXJuIE5VTEw7CiAgICB9CgogICAgc3dpdGNoICgqdHlwZSkgewogICAgY2FzZSBBU05fSU5URUdFUjoKICAgIGNhc2UgQVNOX0NPVU5URVI6CiAgICBjYXNlIEFTTl9HQVVHRToKICAgIGNhc2UgQVNOX1RJTUVUSUNLUzoKICAgIGNhc2UgQVNOX1VJTlRFR0VSOgogICAgICAgIGludF92YWwgPSBhZ2VudHhfcGFyc2VfaW50KGJ1ZnAsIG5ldHdvcmtfYnl0ZV9vcmRlcik7CiAgICAgICAgbWVtbW92ZShkYXRhX2J1ZiwgJmludF92YWwsIDQpOwogICAgICAgICpkYXRhX2xlbiA9IDQ7CiAgICAgICAgYnVmcCArPSA0OwogICAgICAgICpsZW5ndGggLT0gNDsKICAgICAgICBicmVhazsKCiAgICBjYXNlIEFTTl9PQ1RFVF9TVFI6CiAgICBjYXNlIEFTTl9JUEFERFJFU1M6CiAgICAgICAgYnVmcCA9IGFnZW50eF9wYXJzZV9zdHJpbmcoYnVmcCwgbGVuZ3RoLCBkYXRhX2J1ZiwgZGF0YV9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV0d29ya19ieXRlX29yZGVyKTsKICAgICAgICBicmVhazsKCiAgICBjYXNlIEFTTl9PUEFRVUU6CiAgICAgICAgYnVmcCA9IGFnZW50eF9wYXJzZV9vcGFxdWUoYnVmcCwgbGVuZ3RoLCB0eXBlLCBkYXRhX2J1ZiwgZGF0YV9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV0d29ya19ieXRlX29yZGVyKTsKICAgICAgICBicmVhazsKCiAgICBjYXNlIEFTTl9QUklWX0lOQ0xfUkFOR0U6CiAgICBjYXNlIEFTTl9QUklWX0VYQ0xfUkFOR0U6CiAgICBjYXNlIEFTTl9PQkpFQ1RfSUQ6CiAgICAgICAgYnVmcCA9CiAgICAgICAgICAgIGFnZW50eF9wYXJzZV9vaWQoYnVmcCwgbGVuZ3RoLCBOVUxMLCAob2lkICopIGRhdGFfYnVmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFfbGVuLCBuZXR3b3JrX2J5dGVfb3JkZXIpOwogICAgICAgICpkYXRhX2xlbiAqPSBzaXplb2Yob2lkKTsKICAgICAgICAvKgogICAgICAgICAqICdhZ2VudHhfcGFyc2Vfb2lkKCknIHJldHVybnMgdGhlIG51bWJlciBvZiBzdWJfaWRzIAogICAgICAgICAqLwogICAgICAgIGJyZWFrOwoKICAgIGNhc2UgQVNOX0NPVU5URVI2NDoKICAgICAgICBtZW1zZXQoJnRtcDY0LCAwLCBzaXplb2YodG1wNjQpKTsKCWlmIChuZXR3b3JrX2J5dGVfb3JkZXIpIHsKCSAgICB0bXA2NC5oaWdoID0gYWdlbnR4X3BhcnNlX2ludChidWZwLCAgIG5ldHdvcmtfYnl0ZV9vcmRlcik7CgkgICAgdG1wNjQubG93ICA9IGFnZW50eF9wYXJzZV9pbnQoYnVmcCs0LCBuZXR3b3JrX2J5dGVfb3JkZXIpOwoJfSBlbHNlIHsKCSAgICB0bXA2NC5oaWdoID0gYWdlbnR4X3BhcnNlX2ludChidWZwKzQsIG5ldHdvcmtfYnl0ZV9vcmRlcik7CgkgICAgdG1wNjQubG93ICA9IGFnZW50eF9wYXJzZV9pbnQoYnVmcCwgICBuZXR3b3JrX2J5dGVfb3JkZXIpOwoJfQoKICAgICAgICBtZW1jcHkoZGF0YV9idWYsICZ0bXA2NCwgc2l6ZW9mKHRtcDY0KSk7CgkqZGF0YV9sZW4gPSBzaXplb2YodG1wNjQpOwoJYnVmcCAgICArPSA4OwoJKmxlbmd0aCAtPSA4OwogICAgICAgIGJyZWFrOwoKICAgIGNhc2UgQVNOX05VTEw6CiAgICBjYXNlIFNOTVBfTk9TVUNIT0JKRUNUOgogICAgY2FzZSBTTk1QX05PU1VDSElOU1RBTkNFOgogICAgY2FzZSBTTk1QX0VORE9GTUlCVklFVzoKICAgICAgICAvKgogICAgICAgICAqIE5vIGRhdGEgYXNzb2NpYXRlZCB3aXRoIHRoZXNlIHR5cGVzLiAKICAgICAgICAgKi8KICAgICAgICAqZGF0YV9sZW4gPSAwOwogICAgICAgIGJyZWFrOwoKICAgIGRlZmF1bHQ6CiAgICAgICAgREVCVUdNU0coKCJyZWN2IiwgIkNhbiBub3QgcGFyc2UgdHlwZSAleCIsICp0eXBlKSk7CiAgICAgICAgREVCVUdJTkRFTlRMRVNTKCk7CiAgICAgICAgcmV0dXJuIE5VTEw7CiAgICB9CiAgICBERUJVR0lOREVOVExFU1MoKTsKICAgIHJldHVybiBidWZwOwp9CgovKgogKiAgQWdlbnRYIGhlYWRlcjoKICoKICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKICogfCAgICBoLnZlcnNpb24gIHwgICBoLnR5cGUgICAgICB8ICAgaC5mbGFncyAgICAgfCAgPHJlc2VydmVkPiAgIHwKICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKICogfCAgICAgICAgICAgICAgICAgICAgICAgaC5zZXNzaW9uSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKICogfCAgICAgICAgICAgICAgICAgICAgIGgudHJhbnNhY3Rpb25JRCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKICogfCAgICAgICAgICAgICAgICAgICAgICAgaC5wYWNrZXRJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKICogfCAgICAgICAgICAgICAgICAgICAgIGgucGF5bG9hZF9sZW5ndGggICAgICAgICAgICAgICAgICAgICAgICAgIHwKICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKICoKICogICAgVG90YWwgbGVuZ3RoID0gMjAgYnl0ZXMKICoKICogIElmIHdlIGRvbid0IHNlZW0gdG8gaGF2ZSB0aGUgZnVsbCBwYWNrZXQsIHJldHVybiBOVUxMCiAqICAgIGFuZCBsZXQgdGhlIGRyaXZpbmcgY29kZSBnbyBiYWNrIGZvciB0aGUgcmVzdC4KICogIERvbid0IHJlcG9ydCB0aGlzIGFzIGFuIGVycm9yLCBhcyBpdCdzIHF1aXRlICJub3JtYWwiCiAqICAgIHdpdGggYSBjb25uZWN0aW9uLW9yaWVudGVkIHNlcnZpY2UuCiAqCiAqICBOb3RlIHRoYXQgb25jZSB0aGUgaGVhZGVyIGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSBwcm9jZXNzZWQKICogICAgKGFuZCBoZW5jZSB3ZSBzaG91bGQgaGF2ZSB0aGUgZnVsbCBwYWNrZXQpLCBhbnkgc3Vic2VxdWVudAogKiAgICAicnVubmluZyBvdXQgb2Ygcm9vbSIgaXMgaW5kZWVkIGFuIGVycm9yLgogKi8KdV9jaGFyICAgICAgICAgKgphZ2VudHhfcGFyc2VfaGVhZGVyKG5ldHNubXBfcGR1ICpwZHUsIHVfY2hhciAqIGRhdGEsIHNpemVfdCAqIGxlbmd0aCkKewogICAgcmVnaXN0ZXIgdV9jaGFyICpidWZwID0gZGF0YTsKICAgIHNpemVfdCAgICAgICAgICBwYXlsb2FkOwoKICAgIGlmICgqbGVuZ3RoIDwgMjApIHsgICAgICAgICAvKiBJbmNvbXBsZXRlIGhlYWRlciAqLwogICAgICAgIHJldHVybiBOVUxMOwogICAgfQoKICAgIERFQlVHRFVNUEhFQURFUigicmVjdiIsICJBZ2VudFggSGVhZGVyIik7CiAgICBERUJVR0RVTVBIRUFERVIoInJlY3YiLCAiVmVyc2lvbiIpOwogICAgREVCVUdEVU1QU0VUVVAoInJlY3YiLCBidWZwLCAxKTsKICAgIHBkdS0+dmVyc2lvbiA9IEFHRU5UWF9WRVJTSU9OX0JBU0UgfCAqYnVmcDsKICAgIERFQlVHTVNHKCgiZHVtcHZfcmVjdiIsICIgIFZlcnNpb246XHQlZFxuIiwgKmJ1ZnApKTsKICAgIERFQlVHSU5ERU5UTEVTUygpOwogICAgYnVmcCsrOwoKICAgIERFQlVHRFVNUEhFQURFUigicmVjdiIsICJDb21tYW5kIik7CiAgICBERUJVR0RVTVBTRVRVUCgicmVjdiIsIGJ1ZnAsIDEpOwogICAgcGR1LT5jb21tYW5kID0gKmJ1ZnA7CiAgICBERUJVR01TRygoImR1bXB2X3JlY3YiLCAiICBDb21tYW5kOlx0JWQgKCVzKVxuIiwgKmJ1ZnAsCiAgICAgICAgICAgICAgYWdlbnR4X2NtZCgqYnVmcCkpKTsKICAgIERFQlVHSU5ERU5UTEVTUygpOwogICAgYnVmcCsrOwoKICAgIERFQlVHRFVNUEhFQURFUigicmVjdiIsICJGbGFncyIpOwogICAgREVCVUdEVU1QU0VUVVAoInJlY3YiLCBidWZwLCAxKTsKICAgIHBkdS0+ZmxhZ3MgfD0gKmJ1ZnA7CiAgICBERUJVR01TRygoImR1bXB2X3JlY3YiLCAiICBGbGFnczpcdDB4JXhcbiIsICpidWZwKSk7CiAgICBERUJVR0lOREVOVExFU1MoKTsKICAgIGJ1ZnArKzsKCiAgICBERUJVR0RVTVBIRUFERVIoInJlY3YiLCAiUmVzZXJ2ZWQgQnl0ZSIpOwogICAgREVCVUdEVU1QU0VUVVAoInJlY3YiLCBidWZwLCAxKTsKICAgIERFQlVHTVNHKCgiZHVtcHZfcmVjdiIsICIgIFJlc2VydmVkOlx0MHgleFxuIiwgKmJ1ZnApKTsKICAgIERFQlVHSU5ERU5UTEVTUygpOwogICAgYnVmcCsrOwoKICAgIERFQlVHRFVNUEhFQURFUigicmVjdiIsICJTZXNzaW9uIElEIik7CiAgICBwZHUtPnNlc3NpZCA9IGFnZW50eF9wYXJzZV9pbnQoYnVmcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZHUtPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzICYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBR0VOVFhfRkxBR1NfTkVUV09SS19CWVRFX09SREVSKTsKICAgIERFQlVHSU5ERU5UTEVTUygpOwogICAgYnVmcCArPSA0OwoKICAgIERFQlVHRFVNUEhFQURFUigicmVjdiIsICJUcmFuc2FjdGlvbiBJRCIpOwogICAgcGR1LT50cmFuc2lkID0gYWdlbnR4X3BhcnNlX2ludChidWZwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZHUtPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncyAmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFHRU5UWF9GTEFHU19ORVRXT1JLX0JZVEVfT1JERVIpOwogICAgREVCVUdJTkRFTlRMRVNTKCk7CiAgICBidWZwICs9IDQ7CgogICAgREVCVUdEVU1QSEVBREVSKCJyZWN2IiwgIlBhY2tldCBJRCIpOwogICAgcGR1LT5yZXFpZCA9IGFnZW50eF9wYXJzZV9pbnQoYnVmcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBkdS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncyAmIEFHRU5UWF9GTEFHU19ORVRXT1JLX0JZVEVfT1JERVIpOwogICAgREVCVUdJTkRFTlRMRVNTKCk7CiAgICBidWZwICs9IDQ7CgogICAgREVCVUdEVU1QSEVBREVSKCJyZWN2IiwgIlBheWxvYWQgTGVuZ3RoIik7CiAgICBwYXlsb2FkID0gYWdlbnR4X3BhcnNlX2ludChidWZwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGR1LT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzICYgQUdFTlRYX0ZMQUdTX05FVFdPUktfQllURV9PUkRFUik7CiAgICBERUJVR0lOREVOVExFU1MoKTsKICAgIGJ1ZnAgKz0gNDsKCiAgICBERUJVR0lOREVOVExFU1MoKTsKICAgICpsZW5ndGggLT0gMjA7CiAgICBpZiAoKmxlbmd0aCAhPSBwYXlsb2FkKSB7ICAgLyogU2hvcnQgcGF5bG9hZCAqLwogICAgICAgIHJldHVybiBOVUxMOwogICAgfQogICAgcmV0dXJuIGJ1ZnA7Cn0KCgppbnQKYWdlbnR4X3BhcnNlKG5ldHNubXBfc2Vzc2lvbiAqIHNlc3Npb24sIG5ldHNubXBfcGR1ICpwZHUsIHVfY2hhciAqIGRhdGEsCiAgICAgICAgICAgICBzaXplX3QgbGVuKQp7CiAgICByZWdpc3RlciB1X2NoYXIgKmJ1ZnAgPSBkYXRhOwogICAgdV9jaGFyICAgICAgICAgIGJ1ZmZlcltTTk1QX01BWF9NU0dfU0laRV07CiAgICBvaWQgICAgICAgICAgICAgb2lkX2J1ZmZlcltNQVhfT0lEX0xFTl0sIGVuZF9vaWRfYnVmW01BWF9PSURfTEVOXTsKICAgIHNpemVfdCAgICAgICAgICBidWZfbGVuID0gc2l6ZW9mKGJ1ZmZlcik7CiAgICBzaXplX3QgICAgICAgICAgb2lkX2J1Zl9sZW4gPSBNQVhfT0lEX0xFTjsKICAgIHNpemVfdCAgICAgICAgICBlbmRfb2lkX2J1Zl9sZW4gPSBNQVhfT0lEX0xFTjsKCiAgICBpbnQgICAgICAgICAgICAgcmFuZ2VfYm91bmQ7ICAgICAgICAvKiBPSUQtcmFuZ2UgdXBwZXIgYm91bmQgKi8KICAgIGludCAgICAgICAgICAgICBpbmM7ICAgICAgICAvKiBJbmNsdXNpdmUgU2VhcmNoUmFuZ2UgZmxhZyAqLwogICAgaW50ICAgICAgICAgICAgIHR5cGU7ICAgICAgIC8qIFZhckJpbmQgZGF0YSB0eXBlICovCiAgICBzaXplX3QgICAgICAgICAqbGVuZ3RoID0gJmxlbjsKCiAgICBpZiAocGR1ID09IE5VTEwpCiAgICAgICAgcmV0dXJuICgwKTsKIAogICAgaWYgKCFJU19BR0VOVFhfVkVSU0lPTihzZXNzaW9uLT52ZXJzaW9uKSkKICAgICAgICByZXR1cm4gU05NUEVSUl9CQURfVkVSU0lPTjsKCiNpZm5kZWYgU05NUEVSUl9JTkNPTVBMRVRFX1BBQ0tFVAogICAgLyoKICAgICAqICBJZGVhbGx5LCAic2hvcnQiIHBhY2tldHMgb24gc3RyZWFtIGNvbm5lY3Rpb25zIHNob3VsZAogICAgICogICAgYmUgaGFuZGxlZCBzcGVjaWFsbHksIGFuZCB0aGUgZHJpdmluZyBjb2RlIHNldCB1cCB0bwogICAgICogICAga2VlcCByZWFkaW5nIHVudGlsIHRoZSBmdWxsIHBhY2tldCBpcyByZWNlaXZlZC4KICAgICAqCiAgICAgKiAgRm9yIG5vdywgbGV0cyBhc3N1bWUgdGhhdCBhbGwgcGFja2V0cyBhcmUgcmVhZCBpbiBvbmUgZ28uCiAgICAgKiAgICBJJ3ZlIHByb2JhYmx5IGluZmxpY3RlZCBlbm91Z2ggZGFtYWdlIG9uIHRoZSBVQ0QgbGlicmFyeQogICAgICogICAgZm9yIG9uZSB3ZWVrIQogICAgICoKICAgICAqICBJJ2xsIGNvbWUgYmFjayB0byB0aGlzIG9uY2UgV2VzIGlzIHNwZWFraW5nIHRvIG1lIGFnYWluLgogICAgICovCiNkZWZpbmUgU05NUEVSUl9JTkNPTVBMRVRFX1BBQ0tFVCBTTk1QRVJSX0FTTl9QQVJTRV9FUlIKI2VuZGlmCgoKICAgIC8qCiAgICAgKiAgSGFuZGxlIChjb21tb24pIGhlYWRlciAuLi4uCiAgICAgKi8KICAgIGJ1ZnAgPSBhZ2VudHhfcGFyc2VfaGVhZGVyKHBkdSwgYnVmcCwgbGVuZ3RoKTsKICAgIGlmIChidWZwID09IE5VTEwpCiAgICAgICAgcmV0dXJuIFNOTVBFUlJfSU5DT01QTEVURV9QQUNLRVQ7ICAgICAgIC8qIGkuZS4gd2FpdCBmb3IgdGhlIHJlc3QgKi8KCiAgICAvKgogICAgICogQ29udHJvbCBQRFUgaGFuZGxpbmcgCiAgICAgKi8KICAgIHBkdS0+ZmxhZ3MgfD0gVUNEX01TR19GTEFHX0FMV0FZU19JTl9WSUVXOwogICAgcGR1LT5mbGFncyB8PSBVQ0RfTVNHX0ZMQUdfRk9SQ0VfUERVX0NPUFk7CiAgICBwZHUtPmZsYWdzICY9ICh+VUNEX01TR19GTEFHX1JFU1BPTlNFX1BEVSk7CgogICAgLyoKICAgICAqICAuLi4gYW5kIChub3QtdW4tY29tbW9uKSBjb250ZXh0CiAgICAgKi8KICAgIGlmIChwZHUtPmZsYWdzICYgQUdFTlRYX01TR19GTEFHX05PTl9ERUZBVUxUX0NPTlRFWFQpIHsKICAgICAgICBERUJVR0RVTVBIRUFERVIoInJlY3YiLCAiQ29udGV4dCIpOwogICAgICAgIGJ1ZnAgPSBhZ2VudHhfcGFyc2Vfc3RyaW5nKGJ1ZnAsIGxlbmd0aCwgYnVmZmVyLCAmYnVmX2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZHUtPmZsYWdzICYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBR0VOVFhfRkxBR1NfTkVUV09SS19CWVRFX09SREVSKTsKICAgICAgICBERUJVR0lOREVOVExFU1MoKTsKICAgICAgICBpZiAoYnVmcCA9PSBOVUxMKQogICAgICAgICAgICByZXR1cm4gU05NUEVSUl9BU05fUEFSU0VfRVJSOwoKICAgICAgICBwZHUtPmNvbW11bml0eV9sZW4gPSBidWZfbGVuOwogICAgICAgIHNubXBfY2xvbmVfbWVtKCh2b2lkICoqKSAmcGR1LT5jb21tdW5pdHksCiAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKikgYnVmZmVyLCAodW5zaWduZWQpIGJ1Zl9sZW4pOwoJCQoJCS8qIFRoZSBOZXRTTk1QIEFQSSBzdHVmZnMgdGhlIGNvbnRleHQgaW50byB0aGUgUERVJ3MgY29tbXVuaXR5IHN0cmluZwoJCSAqIGZpZWxkLCB3aGVuIHVzaW5nIHRoZSBBZ2VudFggUHJvdG9jb2wuICBUaGUgcmVzdCBvZiB0aGUgY29kZSBob3dldmVyLAoJCSAqIGV4cGVjdHMgdG8gZmluZCB0aGUgY29udGV4dCBpbiB0aGUgUERVJ3MgY29udGV4dCBmaWVsZC4gIFRoZXJlZm9yZSB3ZQoJCSAqIG5lZWQgdG8gY29weSB0aGUgY29udGV4dCBpbnRvIHRoZSBQRFUncyBjb250ZXh0IGZpZWxkcy4gICovCgkJaWYgKHBkdS0+Y29tbXVuaXR5X2xlbiA+IDAgJiYgcGR1LT5jb250ZXh0TmFtZSA9PSBOVUxMKQoJCXsKCQkJcGR1LT5jb250ZXh0TmFtZSAgICA9IHN0cmR1cCgoY2hhciAqKSBwZHUtPmNvbW11bml0eSk7CgkJCXBkdS0+Y29udGV4dE5hbWVMZW4gPSBwZHUtPmNvbW11bml0eV9sZW47CgkJfQoKICAgICAgICBidWZfbGVuID0gc2l6ZW9mKGJ1ZmZlcik7CiAgICB9CgogICAgREVCVUdEVU1QSEVBREVSKCJyZWN2IiwgIlBEVSIpOwogICAgc3dpdGNoIChwZHUtPmNvbW1hbmQpIHsKICAgIGNhc2UgQUdFTlRYX01TR19PUEVOOgogICAgICAgIHBkdS0+dGltZSA9ICpidWZwOyAgICAgIC8qIFRpbWVvdXQgKi8KICAgICAgICBidWZwICs9IDQ7CiAgICAgICAgKmxlbmd0aCAtPSA0OwoKICAgICAgICAvKgogICAgICAgICAqIFN0b3JlIHN1YmFnZW50IE9JRCAmIGRlc2NyaXB0aW9uIGluIGEgVmFyQmluZCAKICAgICAgICAgKi8KICAgICAgICBERUJVR0RVTVBIRUFERVIoInJlY3YiLCAiU3ViYWdlbnQgT0lEIik7CiAgICAgICAgYnVmcCA9IGFnZW50eF9wYXJzZV9vaWQoYnVmcCwgbGVuZ3RoLCBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9pZF9idWZmZXIsICZvaWRfYnVmX2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZHUtPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzICYgQUdFTlRYX0ZMQUdTX05FVFdPUktfQllURV9PUkRFUik7CiAgICAgICAgREVCVUdJTkRFTlRMRVNTKCk7CiAgICAgICAgaWYgKGJ1ZnAgPT0gTlVMTCkgewogICAgICAgICAgICBERUJVR0lOREVOVExFU1MoKTsKICAgICAgICAgICAgcmV0dXJuIFNOTVBFUlJfQVNOX1BBUlNFX0VSUjsKICAgICAgICB9CiAgICAgICAgREVCVUdEVU1QSEVBREVSKCJyZWN2IiwgIlN1YmFnZW50IERlc2NyaXB0aW9uIik7CiAgICAgICAgYnVmcCA9IGFnZW50eF9wYXJzZV9zdHJpbmcoYnVmcCwgbGVuZ3RoLCBidWZmZXIsICZidWZfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBkdS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MgJgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFHRU5UWF9GTEFHU19ORVRXT1JLX0JZVEVfT1JERVIpOwogICAgICAgIERFQlVHSU5ERU5UTEVTUygpOwogICAgICAgIGlmIChidWZwID09IE5VTEwpIHsKICAgICAgICAgICAgREVCVUdJTkRFTlRMRVNTKCk7CiAgICAgICAgICAgIHJldHVybiBTTk1QRVJSX0FTTl9QQVJTRV9FUlI7CiAgICAgICAgfQogICAgICAgIHNubXBfcGR1X2FkZF92YXJpYWJsZShwZHUsIG9pZF9idWZmZXIsIG9pZF9idWZfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBU05fT0NURVRfU1RSLCBidWZmZXIsIGJ1Zl9sZW4pOwoKICAgICAgICBvaWRfYnVmX2xlbiA9IE1BWF9PSURfTEVOOwogICAgICAgIGJ1Zl9sZW4gPSBzaXplb2YoYnVmZmVyKTsKICAgICAgICBicmVhazsKCiAgICBjYXNlIEFHRU5UWF9NU0dfQ0xPU0U6CiAgICAgICAgcGR1LT5lcnJzdGF0ID0gKmJ1ZnA7ICAgLyogUmVhc29uICovCiAgICAgICAgYnVmcCArPSA0OwogICAgICAgICpsZW5ndGggLT0gNDsKCiAgICAgICAgYnJlYWs7CgogICAgY2FzZSBBR0VOVFhfTVNHX1VOUkVHSVNURVI6CiAgICBjYXNlIEFHRU5UWF9NU0dfUkVHSVNURVI6CiAgICAgICAgREVCVUdEVU1QSEVBREVSKCJyZWN2IiwgIlJlZ2lzdHJhdGlvbiBIZWFkZXIiKTsKICAgICAgICBpZiAocGR1LT5jb21tYW5kID09IEFHRU5UWF9NU0dfUkVHSVNURVIpIHsKICAgICAgICAgICAgcGR1LT50aW1lID0gKmJ1ZnA7ICAvKiBUaW1lb3V0IChSZWdpc3RlciBvbmx5KSAqLwogICAgICAgICAgICBERUJVR0RVTVBTRVRVUCgicmVjdiIsIGJ1ZnAsIDEpOwogICAgICAgICAgICBERUJVR01TRygoImR1bXB2X3JlY3YiLCAiICBUaW1lb3V0OiAgICAgXHQlZFxuIiwgKmJ1ZnApKTsKICAgICAgICB9CiAgICAgICAgYnVmcCsrOwogICAgICAgIHBkdS0+cHJpb3JpdHkgPSAqYnVmcDsKICAgICAgICBERUJVR0RVTVBTRVRVUCgicmVjdiIsIGJ1ZnAsIDEpOwogICAgICAgIERFQlVHTVNHKCgiZHVtcHZfcmVjdiIsICIgIFByaW9yaXR5OiAgICBcdCVkXG4iLCAqYnVmcCkpOwogICAgICAgIGJ1ZnArKzsKICAgICAgICBwZHUtPnJhbmdlX3N1YmlkID0gKmJ1ZnA7CiAgICAgICAgREVCVUdEVU1QU0VUVVAoInJlY3YiLCBidWZwLCAxKTsKICAgICAgICBERUJVR01TRygoImR1bXB2X3JlY3YiLCAiICBSYW5nZSBTdWItSWQ6XHQlZFxuIiwgKmJ1ZnApKTsKICAgICAgICBidWZwKys7CiAgICAgICAgYnVmcCsrOwogICAgICAgICpsZW5ndGggLT0gNDsKICAgICAgICBERUJVR0lOREVOVExFU1MoKTsKCiAgICAgICAgREVCVUdEVU1QSEVBREVSKCJyZWN2IiwgIlJlZ2lzdHJhdGlvbiBPSUQiKTsKICAgICAgICBidWZwID0gYWdlbnR4X3BhcnNlX29pZChidWZwLCBsZW5ndGgsIE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2lkX2J1ZmZlciwgJm9pZF9idWZfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBkdS0+ZmxhZ3MgJiBBR0VOVFhfRkxBR1NfTkVUV09SS19CWVRFX09SREVSKTsKICAgICAgICBERUJVR0lOREVOVExFU1MoKTsKICAgICAgICBpZiAoYnVmcCA9PSBOVUxMKSB7CiAgICAgICAgICAgIERFQlVHSU5ERU5UTEVTUygpOwogICAgICAgICAgICByZXR1cm4gU05NUEVSUl9BU05fUEFSU0VfRVJSOwogICAgICAgIH0KCiAgICAgICAgaWYgKHBkdS0+cmFuZ2Vfc3ViaWQpIHsKICAgICAgICAgICAgcmFuZ2VfYm91bmQgPSBhZ2VudHhfcGFyc2VfaW50KGJ1ZnAsIHBkdS0+ZmxhZ3MgJgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUdFTlRYX0ZMQUdTX05FVFdPUktfQllURV9PUkRFUik7CiAgICAgICAgICAgIGJ1ZnAgKz0gNDsKICAgICAgICAgICAgKmxlbmd0aCAtPSA0OwoKICAgICAgICAgICAgLyoKICAgICAgICAgICAgICogQ29uc3RydWN0IHRoZSBlbmQtT0lELiAgCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBlbmRfb2lkX2J1Zl9sZW4gPSBvaWRfYnVmX2xlbiAqIHNpemVvZihvaWQpOwogICAgICAgICAgICBtZW1jcHkoZW5kX29pZF9idWYsIG9pZF9idWZmZXIsIGVuZF9vaWRfYnVmX2xlbik7CiAgICAgICAgICAgIGVuZF9vaWRfYnVmW3BkdS0+cmFuZ2Vfc3ViaWQgLSAxXSA9IHJhbmdlX2JvdW5kOwoKICAgICAgICAgICAgc25tcF9wZHVfYWRkX3ZhcmlhYmxlKHBkdSwgb2lkX2J1ZmZlciwgb2lkX2J1Zl9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBU05fUFJJVl9JTkNMX1JBTkdFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVfY2hhciAqKSBlbmRfb2lkX2J1ZiwgZW5kX29pZF9idWZfbGVuKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBzbm1wX2FkZF9udWxsX3ZhcihwZHUsIG9pZF9idWZmZXIsIG9pZF9idWZfbGVuKTsKICAgICAgICB9CgogICAgICAgIG9pZF9idWZfbGVuID0gTUFYX09JRF9MRU47CiAgICAgICAgYnJlYWs7CgogICAgY2FzZSBBR0VOVFhfTVNHX0dFVEJVTEs6CiAgICAgICAgREVCVUdEVU1QSEVBREVSKCJyZWN2IiwgIk5vbi1yZXBlYXRlcnMiKTsKICAgICAgICBwZHUtPm5vbl9yZXBlYXRlcnMgPSBhZ2VudHhfcGFyc2Vfc2hvcnQoYnVmcCwgcGR1LT5mbGFncyAmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFHRU5UWF9GTEFHU19ORVRXT1JLX0JZVEVfT1JERVIpOwogICAgICAgIERFQlVHSU5ERU5UTEVTUygpOwogICAgICAgIERFQlVHRFVNUEhFQURFUigicmVjdiIsICJNYXgtcmVwZWF0ZXJzIik7CiAgICAgICAgcGR1LT5tYXhfcmVwZXRpdGlvbnMgPSBhZ2VudHhfcGFyc2Vfc2hvcnQoYnVmcCArIDIsIHBkdS0+ZmxhZ3MgJgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFHRU5UWF9GTEFHU19ORVRXT1JLX0JZVEVfT1JERVIpOwogICAgICAgIERFQlVHSU5ERU5UTEVTUygpOwogICAgICAgIGJ1ZnAgKz0gNDsKICAgICAgICAqbGVuZ3RoIC09IDQ7CiAgICAgICAgLyoKICAgICAgICAgKiBGYWxsdGhyb3VnaCAtIFNlYXJjaFJhbmdlIGhhbmRsaW5nIGlzIHRoZSBzYW1lIAogICAgICAgICAqLwoKICAgIGNhc2UgQUdFTlRYX01TR19HRVRORVhUOgogICAgY2FzZSBBR0VOVFhfTVNHX0dFVDoKCiAgICAgICAgLyoKICAgICAgICAgKiAqICBTZWFyY2hSYW5nZSBMaXN0CiAgICAgICAgICogKiAgS2VlcCBnb2luZyB3aGlsZSB3ZSBoYXZlIGRhdGEgbGVmdAogICAgICAgICAqLwogICAgICAgIERFQlVHRFVNUEhFQURFUigicmVjdiIsICJTZWFyY2ggUmFuZ2UiKTsKICAgICAgICB3aGlsZSAoKmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgYnVmcCA9IGFnZW50eF9wYXJzZV9vaWQoYnVmcCwgbGVuZ3RoLCAmaW5jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvaWRfYnVmZmVyLCAmb2lkX2J1Zl9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBkdS0+ZmxhZ3MgJgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBR0VOVFhfRkxBR1NfTkVUV09SS19CWVRFX09SREVSKTsKICAgICAgICAgICAgaWYgKGJ1ZnAgPT0gTlVMTCkgewogICAgICAgICAgICAgICAgREVCVUdJTkRFTlRMRVNTKCk7CiAgICAgICAgICAgICAgICBERUJVR0lOREVOVExFU1MoKTsKICAgICAgICAgICAgICAgIHJldHVybiBTTk1QRVJSX0FTTl9QQVJTRV9FUlI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYnVmcCA9IGFnZW50eF9wYXJzZV9vaWQoYnVmcCwgbGVuZ3RoLCBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmRfb2lkX2J1ZiwgJmVuZF9vaWRfYnVmX2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGR1LT5mbGFncyAmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFHRU5UWF9GTEFHU19ORVRXT1JLX0JZVEVfT1JERVIpOwogICAgICAgICAgICBpZiAoYnVmcCA9PSBOVUxMKSB7CiAgICAgICAgICAgICAgICBERUJVR0lOREVOVExFU1MoKTsKICAgICAgICAgICAgICAgIERFQlVHSU5ERU5UTEVTUygpOwogICAgICAgICAgICAgICAgcmV0dXJuIFNOTVBFUlJfQVNOX1BBUlNFX0VSUjsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbmRfb2lkX2J1Zl9sZW4gKj0gc2l6ZW9mKG9pZCk7CiAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAqICdhZ2VudHhfcGFyc2Vfb2lkKCknIHJldHVybnMgdGhlIG51bWJlciBvZiBzdWJfaWRzIAogICAgICAgICAgICAgKi8KCiAgICAgICAgICAgIGlmIChpbmMpIHsKICAgICAgICAgICAgICAgIHNubXBfcGR1X2FkZF92YXJpYWJsZShwZHUsIG9pZF9idWZmZXIsIG9pZF9idWZfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFTTl9QUklWX0lOQ0xfUkFOR0UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVfY2hhciAqKSBlbmRfb2lkX2J1ZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmRfb2lkX2J1Zl9sZW4pOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgc25tcF9wZHVfYWRkX3ZhcmlhYmxlKHBkdSwgb2lkX2J1ZmZlciwgb2lkX2J1Zl9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVNOX1BSSVZfRVhDTF9SQU5HRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodV9jaGFyICopIGVuZF9vaWRfYnVmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZF9vaWRfYnVmX2xlbik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgb2lkX2J1Zl9sZW4gPSBNQVhfT0lEX0xFTjsKICAgICAgICAgICAgZW5kX29pZF9idWZfbGVuID0gTUFYX09JRF9MRU47CiAgICAgICAgfQoKICAgICAgICBERUJVR0lOREVOVExFU1MoKTsKICAgICAgICBicmVhazsKCgogICAgY2FzZSBBR0VOVFhfTVNHX1JFU1BPTlNFOgoKICAgICAgICBwZHUtPmZsYWdzIHw9IFVDRF9NU0dfRkxBR19SRVNQT05TRV9QRFU7CgogICAgICAgIC8qCiAgICAgICAgICogc3lzVXBUaW1lIAogICAgICAgICAqLwogICAgICAgIHBkdS0+dGltZSA9IGFnZW50eF9wYXJzZV9pbnQoYnVmcCwgcGR1LT5mbGFncyAmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBR0VOVFhfRkxBR1NfTkVUV09SS19CWVRFX09SREVSKTsKICAgICAgICBidWZwICs9IDQ7CiAgICAgICAgKmxlbmd0aCAtPSA0OwoKICAgICAgICBwZHUtPmVycnN0YXQgPSBhZ2VudHhfcGFyc2Vfc2hvcnQoYnVmcCwgcGR1LT5mbGFncyAmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFHRU5UWF9GTEFHU19ORVRXT1JLX0JZVEVfT1JERVIpOwogICAgICAgIHBkdS0+ZXJyaW5kZXggPQogICAgICAgICAgICBhZ2VudHhfcGFyc2Vfc2hvcnQoYnVmcCArIDIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZHUtPmZsYWdzICYgQUdFTlRYX0ZMQUdTX05FVFdPUktfQllURV9PUkRFUik7CiAgICAgICAgYnVmcCArPSA0OwogICAgICAgICpsZW5ndGggLT0gNDsKICAgICAgICAvKgogICAgICAgICAqIEZhbGx0aHJvdWdoIC0gVmFyQmluZCBoYW5kbGluZyBpcyB0aGUgc2FtZSAKICAgICAgICAgKi8KCiAgICBjYXNlIEFHRU5UWF9NU0dfSU5ERVhfQUxMT0NBVEU6CiAgICBjYXNlIEFHRU5UWF9NU0dfSU5ERVhfREVBTExPQ0FURToKICAgIGNhc2UgQUdFTlRYX01TR19OT1RJRlk6CiAgICBjYXNlIEFHRU5UWF9NU0dfVEVTVFNFVDoKCiAgICAgICAgLyoKICAgICAgICAgKiAqICBWYXJCaW5kIExpc3QKICAgICAgICAgKiAqICBLZWVwIGdvaW5nIHdoaWxlIHdlIGhhdmUgZGF0YSBsZWZ0CiAgICAgICAgICovCgogICAgICAgIERFQlVHRFVNUEhFQURFUigicmVjdiIsICJWYXJCaW5kTGlzdCIpOwogICAgICAgIHdoaWxlICgqbGVuZ3RoID4gMCkgewogICAgICAgICAgICBidWZwID0gYWdlbnR4X3BhcnNlX3ZhcmJpbmQoYnVmcCwgbGVuZ3RoLCAmdHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9pZF9idWZmZXIsICZvaWRfYnVmX2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciwgJmJ1Zl9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZHUtPmZsYWdzICYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFHRU5UWF9GTEFHU19ORVRXT1JLX0JZVEVfT1JERVIpOwogICAgICAgICAgICBpZiAoYnVmcCA9PSBOVUxMKSB7CiAgICAgICAgICAgICAgICBERUJVR0lOREVOVExFU1MoKTsKICAgICAgICAgICAgICAgIERFQlVHSU5ERU5UTEVTUygpOwogICAgICAgICAgICAgICAgcmV0dXJuIFNOTVBFUlJfQVNOX1BBUlNFX0VSUjsKICAgICAgICAgICAgfQogICAgICAgICAgICBzbm1wX3BkdV9hZGRfdmFyaWFibGUocGR1LCBvaWRfYnVmZmVyLCBvaWRfYnVmX2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1X2NoYXIpIHR5cGUsIGJ1ZmZlciwgYnVmX2xlbik7CgogICAgICAgICAgICBvaWRfYnVmX2xlbiA9IE1BWF9PSURfTEVOOwogICAgICAgICAgICBidWZfbGVuID0gc2l6ZW9mKGJ1ZmZlcik7CiAgICAgICAgfQogICAgICAgIERFQlVHSU5ERU5UTEVTUygpOwogICAgICAgIGJyZWFrOwoKICAgIGNhc2UgQUdFTlRYX01TR19DT01NSVRTRVQ6CiAgICBjYXNlIEFHRU5UWF9NU0dfVU5ET1NFVDoKICAgIGNhc2UgQUdFTlRYX01TR19DTEVBTlVQU0VUOgogICAgY2FzZSBBR0VOVFhfTVNHX1BJTkc6CgogICAgICAgIC8qCiAgICAgICAgICogIkVtcHR5IiBwYWNrZXQgCiAgICAgICAgICovCiAgICAgICAgYnJlYWs7CgoKICAgIGNhc2UgQUdFTlRYX01TR19BRERfQUdFTlRfQ0FQUzoKICAgICAgICAvKgogICAgICAgICAqIFN0b3JlIEFnZW50Q2FwIE9JRCAmIGRlc2NyaXB0aW9uIGluIGEgVmFyQmluZCAKICAgICAgICAgKi8KICAgICAgICBidWZwID0gYWdlbnR4X3BhcnNlX29pZChidWZwLCBsZW5ndGgsIE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2lkX2J1ZmZlciwgJm9pZF9idWZfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBkdS0+ZmxhZ3MgJiBBR0VOVFhfRkxBR1NfTkVUV09SS19CWVRFX09SREVSKTsKICAgICAgICBpZiAoYnVmcCA9PSBOVUxMKQogICAgICAgICAgICByZXR1cm4gU05NUEVSUl9BU05fUEFSU0VfRVJSOwogICAgICAgIGJ1ZnAgPSBhZ2VudHhfcGFyc2Vfc3RyaW5nKGJ1ZnAsIGxlbmd0aCwgYnVmZmVyLCAmYnVmX2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZHUtPmZsYWdzICYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBR0VOVFhfRkxBR1NfTkVUV09SS19CWVRFX09SREVSKTsKICAgICAgICBpZiAoYnVmcCA9PSBOVUxMKQogICAgICAgICAgICByZXR1cm4gU05NUEVSUl9BU05fUEFSU0VfRVJSOwogICAgICAgIHNubXBfcGR1X2FkZF92YXJpYWJsZShwZHUsIG9pZF9idWZmZXIsIG9pZF9idWZfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBU05fT0NURVRfU1RSLCBidWZmZXIsIGJ1Zl9sZW4pOwoKICAgICAgICBvaWRfYnVmX2xlbiA9IE1BWF9PSURfTEVOOwogICAgICAgIGJ1Zl9sZW4gPSBzaXplb2YoYnVmZmVyKTsKICAgICAgICBicmVhazsKCiAgICBjYXNlIEFHRU5UWF9NU0dfUkVNT1ZFX0FHRU5UX0NBUFM6CiAgICAgICAgLyoKICAgICAgICAgKiBTdG9yZSBBZ2VudENhcCBPSUQgJiBkZXNjcmlwdGlvbiBpbiBhIFZhckJpbmQgCiAgICAgICAgICovCiAgICAgICAgYnVmcCA9IGFnZW50eF9wYXJzZV9vaWQoYnVmcCwgbGVuZ3RoLCBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9pZF9idWZmZXIsICZvaWRfYnVmX2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZHUtPmZsYWdzICYgQUdFTlRYX0ZMQUdTX05FVFdPUktfQllURV9PUkRFUik7CiAgICAgICAgaWYgKGJ1ZnAgPT0gTlVMTCkKICAgICAgICAgICAgcmV0dXJuIFNOTVBFUlJfQVNOX1BBUlNFX0VSUjsKICAgICAgICBzbm1wX2FkZF9udWxsX3ZhcihwZHUsIG9pZF9idWZmZXIsIG9pZF9idWZfbGVuKTsKCiAgICAgICAgb2lkX2J1Zl9sZW4gPSBNQVhfT0lEX0xFTjsKICAgICAgICBicmVhazsKCiAgICBkZWZhdWx0OgogICAgICAgIERFQlVHSU5ERU5UTEVTUygpOwogICAgICAgIERFQlVHTVNHVEwoKCJhZ2VudHgiLCAiVW5yZWNvZ25pc2VkIFBEVSB0eXBlOiAlZFxuIiwKICAgICAgICAgICAgICAgICAgICBwZHUtPmNvbW1hbmQpKTsKICAgICAgICByZXR1cm4gU05NUEVSUl9VTktOT1dOX1BEVTsKICAgIH0KICAgIERFQlVHSU5ERU5UTEVTUygpOwogICAgcmV0dXJuIFNOTVBfRVJSX05PRVJST1I7Cn0KCgoKCiNpZmRlZiBURVNUSU5HCgp0ZXN0aXQobmV0c25tcF9wZHUgKnBkdTEpCnsKICAgIGNoYXIgICAgICAgICAgICBwYWNrZXQxW0JVRlNJWl07CiAgICBjaGFyICAgICAgICAgICAgcGFja2V0MltCVUZTSVpdOwogICAgaW50ICAgICAgICAgICAgIGxlbjEsIGxlbjI7CiAgICBuZXRzbm1wX3BkdSAgICAgcGR1MjsKICAgIG5ldHNubXBfc2Vzc2lvbiBzZXNzOwoKICAgIG1lbXNldCgmcGR1MiwgMCwgc2l6ZW9mKG5ldHNubXBfcGR1KSk7CiAgICBtZW1zZXQocGFja2V0MSwgMCwgQlVGU0laKTsKICAgIG1lbXNldChwYWNrZXQyLCAwLCBCVUZTSVopOwoKICAgIC8qCiAgICAgKiBFbmNvZGUgdGhpcyBpbnRvIGEgInBhY2tldCIgCiAgICAgKi8KICAgIGxlbjEgPSBCVUZTSVo7CiAgICBpZiAoYWdlbnR4X2J1aWxkKCZzZXNzLCBwZHUxLCBwYWNrZXQxLCAmbGVuMSkgPCAwKSB7CiAgICAgICAgREVCVUdNU0dUTCgoImFnZW50eCIsICJGaXJzdCBidWlsZCBmYWlsZWRcbiIpKTsKICAgICAgICBleGl0KDEpOwogICAgfQoKICAgIERFQlVHTVNHVEwoKCJhZ2VudHgiLCAiRmlyc3QgYnVpbGQgc3VjY2VlZGVkOlxuIikpOwogICAgeGR1bXAocGFja2V0MSwgbGVuMSwgIkF4MT4gIik7CgogICAgLyoKICAgICAqIFVucGFjayB0aGlzIGludG8gYSBQRFUgCiAgICAgKi8KICAgIGxlbjIgPSBsZW4xOwogICAgaWYgKGFnZW50eF9wYXJzZSgmcGR1MiwgcGFja2V0MSwgJmxlbjIsICh1X2NoYXIgKiopIE5VTEwpIDwgMCkgewogICAgICAgIERFQlVHTVNHVEwoKCJhZ2VudHgiLCAiRmlyc3QgcGFyc2UgZmFpbGVkXG4iKSk7CiAgICAgICAgZXhpdCgxKTsKICAgIH0KICAgIERFQlVHTVNHVEwoKCJhZ2VudHgiLCAiRmlyc3QgcGFyc2Ugc3VjY2VlZGVkOlxuIikpOwogICAgaWYgKGxlbjIgIT0gMCkKICAgICAgICBERUJVR01TR1RMKCgiYWdlbnR4IiwKICAgICAgICAgICAgICAgICAgICAiV2FybmluZyAtIHBhcnNlZCBwYWNrZXQgaGFzICVkIGJ5dGVzIGxlZnRcbiIsIGxlbjIpKTsKCiAgICAvKgogICAgICogRW5jb2RlIHRoaXMgaW50byBhbm90aGVyICJwYWNrZXQiIAogICAgICovCiAgICBsZW4yID0gQlVGU0laOwogICAgaWYgKGFnZW50eF9idWlsZCgmc2VzcywgJnBkdTIsIHBhY2tldDIsICZsZW4yKSA8IDApIHsKICAgICAgICBERUJVR01TR1RMKCgiYWdlbnR4IiwgIlNlY29uZCBidWlsZCBmYWlsZWRcbiIpKTsKICAgICAgICBleGl0KDEpOwogICAgfQoKICAgIERFQlVHTVNHVEwoKCJhZ2VudHgiLCAiU2Vjb25kIGJ1aWxkIHN1Y2NlZWRlZDpcbiIpKTsKICAgIHhkdW1wKHBhY2tldDIsIGxlbjIsICJBeDI+ICIpOwoKICAgIC8qCiAgICAgKiBDb21wYXJlIHRoZSByZXN1bHRzIAogICAgICovCiAgICBpZiAobGVuMSAhPSBsZW4yKSB7CiAgICAgICAgREVCVUdNU0dUTCgoImFnZW50eCIsCiAgICAgICAgICAgICAgICAgICAgIkVycm9yOiBmaXJzdCBidWlsZCAoJWQpIGlzIGRpZmZlcmVudCB0byBzZWNvbmQgKCVkKVxuIiwKICAgICAgICAgICAgICAgICAgICBsZW4xLCBsZW4yKSk7CiAgICAgICAgZXhpdCgxKTsKICAgIH0KICAgIGlmIChtZW1jbXAocGFja2V0MSwgcGFja2V0MiwgbGVuMSkgIT0gMCkgewogICAgICAgIERFQlVHTVNHVEwoKCJhZ2VudHgiLAogICAgICAgICAgICAgICAgICAgICJFcnJvcjogZmlyc3QgYnVpbGQgZGF0YSBpcyBkaWZmZXJlbnQgdG8gc2Vjb25kXG4iKSk7CiAgICAgICAgZXhpdCgxKTsKICAgIH0KCiAgICBERUJVR01TR1RMKCgiYWdlbnR4IiwgIk9LXG4iKSk7Cn0KCgoKbWFpbigpCnsKICAgIG5ldHNubXBfcGR1ICAgICBwZHUxOwogICAgb2lkICAgICAgICAgICAgIG9pZF9idWZbXSA9IHsgMSwgMywgNiwgMSwgMiwgMSwgMTAgfTsKICAgIG9pZCAgICAgICAgICAgICBvaWRfYnVmMltdID0geyAxLCAzLCA2LCAxLCAyLCAxLCAyMCB9OwogICAgb2lkICAgICAgICAgICAgIG51bGxfb2lkW10gPSB7IDAsIDAgfTsKICAgIGNoYXIgICAgICAgICAgICpzdHJpbmcgPSAiRXhhbXBsZSBzdHJpbmciOwogICAgY2hhciAgICAgICAgICAgKmNvbnRleHQgPSAiTFVDUyI7CgoKICAgIC8qCiAgICAgKiBDcmVhdGUgYW4gZXhhbXBsZSBBZ2VudFggcGR1IHN0cnVjdHVyZSAKICAgICAqLwoKICAgIG1lbXNldCgmcGR1MSwgMCwgc2l6ZW9mKG5ldHNubXBfcGR1KSk7CiAgICBwZHUxLmNvbW1hbmQgPSBBR0VOVFhfTVNHX1RFU1RTRVQ7CiAgICBwZHUxLmZsYWdzID0gMDsKICAgIHBkdTEuc2Vzc2lkID0gMTY7CiAgICBwZHUxLnRyYW5zaWQgPSAyNDsKICAgIHBkdTEucmVxaWQgPSAxMzI7CgogICAgcGR1MS50aW1lID0gMTA7CiAgICBwZHUxLm5vbl9yZXBlYXRlcnMgPSAzOwogICAgcGR1MS5tYXhfcmVwZXRpdGlvbnMgPSAzMjsKICAgIHBkdTEucHJpb3JpdHkgPSA1OwogICAgcGR1MS5yYW5nZV9zdWJpZCA9IDA7CgogICAgc25tcF9wZHVfYWRkX3ZhcmlhYmxlKCZwZHUxLCBvaWRfYnVmLCBzaXplb2Yob2lkX2J1ZikgLyBzaXplb2Yob2lkKSwKICAgICAgICAgICAgICAgICAgICAgICAgICBBU05fT0JKRUNUX0lELCAoY2hhciAqKSBvaWRfYnVmMiwKICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yob2lkX2J1ZjIpKTsKICAgIHNubXBfcGR1X2FkZF92YXJpYWJsZSgmcGR1MSwgb2lkX2J1Ziwgc2l6ZW9mKG9pZF9idWYpIC8gc2l6ZW9mKG9pZCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgQVNOX0lOVEVHRVIsIChjaGFyICopICZwZHUxLnJlcWlkLAogICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihwZHUxLnJlcWlkKSk7CiAgICBzbm1wX3BkdV9hZGRfdmFyaWFibGUoJnBkdTEsIG9pZF9idWYsIHNpemVvZihvaWRfYnVmKSAvIHNpemVvZihvaWQpLAogICAgICAgICAgICAgICAgICAgICAgICAgIEFTTl9PQ1RFVF9TVFIsIChjaGFyICopIHN0cmluZywgc3RybGVuKHN0cmluZykpOwoKICAgIHByaW50ZigiVGVzdCB3aXRoIG5vbi1uZXR3b3JrIG9yZGVyLi4uLi5cbiIpOwogICAgdGVzdGl0KCZwZHUxKTsKCiAgICBwcmludGYoIlxuVGVzdCB3aXRoIG5ldHdvcmsgb3JkZXIuLi4uLlxuIik7CiAgICBwZHUxLmZsYWdzIHw9IEFHRU5UWF9GTEFHU19ORVRXT1JLX0JZVEVfT1JERVI7CiAgICB0ZXN0aXQoJnBkdTEpOwoKICAgIHBkdTEuY29tbXVuaXR5ID0gY29udGV4dDsKICAgIHBkdTEuY29tbXVuaXR5X2xlbiA9IHN0cmxlbihjb250ZXh0KTsKICAgIHBkdTEuZmxhZ3MgfD0gQUdFTlRYX0ZMQUdTX05PTl9ERUZBVUxUX0NPTlRFWFQ7CiAgICBwcmludGYoIlRlc3Qgd2l0aCBub24tZGVmYXVsdCBjb250ZXh0Li4uLi5cbiIpOwogICAgdGVzdGl0KCZwZHUxKTsKCgp9CiNlbmRpZgoKLyoKICogcmV0dXJucyB0aGUgcHJvcGVyIGxlbmd0aCBvZiBhbiBpbmNvbWluZyBhZ2VudHggcGFja2V0LiAKICovCi8qCiAqICAgICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCiAqICAgIHwgICBoLnZlcnNpb24gICB8ICAgIGgudHlwZSAgICAgfCAgICBoLmZsYWdzICAgIHwgIDxyZXNlcnZlZD4gICB8CiAqICAgICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCiAqICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgIGguc2Vzc2lvbklEICAgICAgICAgICAgICAgICAgICAgICAgICB8CiAqICAgICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCiAqICAgIHwgICAgICAgICAgICAgICAgICAgICAgICBoLnRyYW5zYWN0aW9uSUQgICAgICAgICAgICAgICAgICAgICAgICB8CiAqICAgICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCiAqICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgIGgucGFja2V0SUQgICAgICAgICAgICAgICAgICAgICAgICAgICB8CiAqICAgICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCiAqICAgIHwgICAgICAgICAgICAgICAgICAgICAgICBoLnBheWxvYWRfbGVuZ3RoICAgICAgICAgICAgICAgICAgICAgICB8CiAqICAgICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCiAqICAgIDIwIGJ5dGVzIGluIGhlYWRlcgogKi8KCmludAphZ2VudHhfY2hlY2tfcGFja2V0KHVfY2hhciAqIHBhY2tldCwgc2l6ZV90IHBhY2tldF9sZW4pCnsKCiAgICBpZiAocGFja2V0X2xlbiA8IDIwKQogICAgICAgIHJldHVybiAwOyAgICAgICAgICAgICAgIC8qIG1pbmltdW0gaGVhZGVyIGxlbmd0aCA9PSAyMCAqLwoKICAgIHJldHVybiBhZ2VudHhfcGFyc2VfaW50KHBhY2tldCArIDE2LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgKihwYWNrZXQgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyKSAmIEFHRU5UWF9GTEFHU19ORVRXT1JLX0JZVEVfT1JERVIpICsgMjA7Cn0K