LyoKICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgogICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMDkgU2FtIExhbnRpbmdhCgogICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KCiAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQogICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KCiAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQoKICAgIFNhbSBMYW50aW5nYQogICAgc2xvdWtlbkBsaWJzZGwub3JnCiovCiNpbmNsdWRlICJTRExfY29uZmlnLmgiCgovKgogKiBSTEUgZW5jb2RpbmcgZm9yIHNvZnR3YXJlIGNvbG9ya2V5IGFuZCBhbHBoYS1jaGFubmVsIGFjY2VsZXJhdGlvbgogKgogKiBPcmlnaW5hbCB2ZXJzaW9uIGJ5IFNhbSBMYW50aW5nYQogKgogKiBNYXR0aWFzIEVuZ2RlZ+VyZCAoWW9yaWNrKTogUmV3cml0ZS4gTmV3IGVuY29kaW5nIGZvcm1hdCwgZW5jb2RlciBhbmQKICogZGVjb2Rlci4gQWRkZWQgcGVyLXN1cmZhY2UgYWxwaGEgYmxpdHRlci4gQWRkZWQgcGVyLXBpeGVsIGFscGhhCiAqIGZvcm1hdCwgZW5jb2RlciBhbmQgYmxpdHRlci4KICoKICogTWFueSB0aGFua3MgdG8gWGFyayBhbmQgam9obnMgZm9yIGhpbnRzLCBiZW5jaG1hcmtzIGFuZCB1c2VmdWwgY29tbWVudHMKICogbGVhZGluZyB0byB0aGlzIGNvZGUuCiAqCiAqIFdlbGNvbWUgdG8gTWFjcm8gTWF5aGVtLgogKi8KCi8qCiAqIFRoZSBlbmNvZGluZyB0cmFuc2xhdGVzIHRoZSBpbWFnZSBkYXRhIHRvIGEgc3RyZWFtIG9mIHNlZ21lbnRzIG9mIHRoZSBmb3JtCiAqCiAqIDxza2lwPiA8cnVuPiA8ZGF0YT4KICoKICogd2hlcmUgPHNraXA+IGlzIHRoZSBudW1iZXIgb2YgdHJhbnNwYXJlbnQgcGl4ZWxzIHRvIHNraXAsCiAqICAgICAgIDxydW4+ICBpcyB0aGUgbnVtYmVyIG9mIG9wYXF1ZSBwaXhlbHMgdG8gYmxpdCwKICogYW5kICAgPGRhdGE+IGFyZSB0aGUgcGl4ZWxzIHRoZW1zZWx2ZXMuCiAqCiAqIFRoaXMgYmFzaWMgc3RydWN0dXJlIGlzIHVzZWQgYm90aCBmb3IgY29sb3JrZXllZCBzdXJmYWNlcywgdXNlZCBmb3Igc2ltcGxlCiAqIGJpbmFyeSB0cmFuc3BhcmVuY3kgYW5kIGZvciBwZXItc3VyZmFjZSBhbHBoYSBibGVuZGluZywgYW5kIGZvciBzdXJmYWNlcwogKiB3aXRoIHBlci1waXhlbCBhbHBoYS4gVGhlIGRldGFpbHMgZGlmZmVyLCBob3dldmVyOgogKgogKiBFbmNvZGluZyBvZiBjb2xvcmtleWVkIHN1cmZhY2VzOgogKgogKiAgIEVuY29kZWQgcGl4ZWxzIGFsd2F5cyBoYXZlIHRoZSBzYW1lIGZvcm1hdCBhcyB0aGUgdGFyZ2V0IHN1cmZhY2UuCiAqICAgPHNraXA+IGFuZCA8cnVuPiBhcmUgdW5zaWduZWQgOCBiaXQgaW50ZWdlcnMsIGV4Y2VwdCBmb3IgMzIgYml0IGRlcHRoCiAqICAgd2hlcmUgdGhleSBhcmUgMTYgYml0LiBUaGlzIG1ha2VzIHRoZSBwaXhlbCBkYXRhIGFsaWduZWQgYXQgYWxsIHRpbWVzLgogKiAgIFNlZ21lbnRzIG5ldmVyIHdyYXAgYXJvdW5kIGZyb20gb25lIHNjYW4gbGluZSB0byB0aGUgbmV4dC4KICoKICogICBUaGUgZW5kIG9mIHRoZSBzZXF1ZW5jZSBpcyBtYXJrZWQgYnkgYSB6ZXJvIDxza2lwPiw8cnVuPiBwYWlyIGF0IHRoZSAqCiAqICAgYmVnaW5uaW5nIG9mIGEgbGluZS4KICoKICogRW5jb2Rpbmcgb2Ygc3VyZmFjZXMgd2l0aCBwZXItcGl4ZWwgYWxwaGE6CiAqCiAqICAgVGhlIHNlcXVlbmNlIGJlZ2lucyB3aXRoIGEgc3RydWN0IFJMRURlc3RGb3JtYXQgZGVzY3JpYmluZyB0aGUgdGFyZ2V0CiAqICAgcGl4ZWwgZm9ybWF0LCB0byBwcm92aWRlIHJlbGlhYmxlIHVuLWVuY29kaW5nLgogKgogKiAgIEVhY2ggc2NhbiBsaW5lIGlzIGVuY29kZWQgdHdpY2U6IEZpcnN0IGFsbCBjb21wbGV0ZWx5IG9wYXF1ZSBwaXhlbHMsCiAqICAgZW5jb2RlZCBpbiB0aGUgdGFyZ2V0IGZvcm1hdCBhcyBkZXNjcmliZWQgYWJvdmUsIGFuZCB0aGVuIGFsbAogKiAgIHBhcnRpYWxseSB0cmFuc3BhcmVudCAodHJhbnNsdWNlbnQpIHBpeGVscyAod2hlcmUgMSA8PSBhbHBoYSA8PSAyNTQpLAogKiAgIGluIHRoZSBmb2xsb3dpbmcgMzItYml0IGZvcm1hdDoKICoKICogICBGb3IgMzItYml0IHRhcmdldHMsIGVhY2ggcGl4ZWwgaGFzIHRoZSB0YXJnZXQgUkdCIGZvcm1hdCBidXQgd2l0aAogKiAgIHRoZSBhbHBoYSB2YWx1ZSBvY2N1cHlpbmcgdGhlIGhpZ2hlc3QgOCBiaXRzLiBUaGUgPHNraXA+IGFuZCA8cnVuPgogKiAgIGNvdW50cyBhcmUgMTYgYml0LgogKiAKICogICBGb3IgMTYtYml0IHRhcmdldHMsIGVhY2ggcGl4ZWwgaGFzIHRoZSB0YXJnZXQgUkdCIGZvcm1hdCwgYnV0IHdpdGgKICogICB0aGUgbWlkZGxlIGNvbXBvbmVudCAodXN1YWxseSBncmVlbikgc2hpZnRlZCAxNiBzdGVwcyB0byB0aGUgbGVmdCwKICogICBhbmQgdGhlIGhvbGUgZmlsbGVkIHdpdGggdGhlIDUgbW9zdCBzaWduaWZpY2FudCBiaXRzIG9mIHRoZSBhbHBoYSB2YWx1ZS4KICogICBpLmUuIGlmIHRoZSB0YXJnZXQgaGFzIHRoZSBmb3JtYXQgICAgICAgICBycnJycmdnZ2dnZ2JiYmJiLAogKiAgIHRoZSBlbmNvZGVkIHBpeGVsIHdpbGwgYmUgMDAwMDBnZ2dnZ2cwMDAwMHJycnJyMGFhYWFhYmJiYmIuCiAqICAgVGhlIDxza2lwPiBhbmQgPHJ1bj4gY291bnRzIGFyZSA4IGJpdCBmb3IgdGhlIG9wYXF1ZSBsaW5lcywgMTYgYml0CiAqICAgZm9yIHRoZSB0cmFuc2x1Y2VudCBsaW5lcy4gVHdvIHBhZGRpbmcgYnl0ZXMgbWF5IGJlIGluc2VydGVkCiAqICAgYmVmb3JlIGVhY2ggdHJhbnNsdWNlbnQgbGluZSB0byBrZWVwIHRoZW0gMzItYml0IGFsaWduZWQuCiAqCiAqICAgVGhlIGVuZCBvZiB0aGUgc2VxdWVuY2UgaXMgbWFya2VkIGJ5IGEgemVybyA8c2tpcD4sPHJ1bj4gcGFpciBhdCB0aGUKICogICBiZWdpbm5pbmcgb2YgYW4gb3BhcXVlIGxpbmUuCiAqLwoKI2luY2x1ZGUgIlNETF92aWRlby5oIgojaW5jbHVkZSAiU0RMX3N5c3ZpZGVvLmgiCiNpbmNsdWRlICJTRExfYmxpdC5oIgojaW5jbHVkZSAiU0RMX1JMRWFjY2VsX2MuaCIKCiNpZiBkZWZpbmVkKF9fR05VQ19fKSAmJiAoZGVmaW5lZChfX2kzODZfXykgfHwgZGVmaW5lZChfX3g4Nl82NF9fKSkgJiYgU0RMX0FTU0VNQkxZX1JPVVRJTkVTCiNkZWZpbmUgTU1YX0FTTUJMSVQKI2VuZGlmCgojaWZkZWYgTU1YX0FTTUJMSVQKI2luY2x1ZGUgIm1teC5oIgojaW5jbHVkZSAiU0RMX2NwdWluZm8uaCIKI2VuZGlmCgojaWZuZGVmIE1BWAojZGVmaW5lIE1BWChhLCBiKSAoKGEpID4gKGIpID8gKGEpIDogKGIpKQojZW5kaWYKI2lmbmRlZiBNSU4KI2RlZmluZSBNSU4oYSwgYikgKChhKSA8IChiKSA/IChhKSA6IChiKSkKI2VuZGlmCgojZGVmaW5lIFBJWEVMX0NPUFkodG8sIGZyb20sIGxlbiwgYnBwKQkJCVwKZG8gewkJCQkJCQlcCiAgICBpZihicHAgPT0gNCkgewkJCQkJXAoJU0RMX21lbWNweTQodG8sIGZyb20sIChzaXplX3QpKGxlbikpOwkJXAogICAgfSBlbHNlIHsJCQkJCQlcCglTRExfbWVtY3B5KHRvLCBmcm9tLCAoc2l6ZV90KShsZW4pICogKGJwcCkpOwlcCiAgICB9CQkJCQkJCVwKfSB3aGlsZSgwKQoKLyoKICogVmFyaW91cyBjb2xvcmtleSBibGl0IG1ldGhvZHMsIGZvciBvcGFxdWUgYW5kIHBlci1zdXJmYWNlIGFscGhhCiAqLwoKI2RlZmluZSBPUEFRVUVfQkxJVCh0bywgZnJvbSwgbGVuZ3RoLCBicHAsIGFscGhhKQlcCiAgICBQSVhFTF9DT1BZKHRvLCBmcm9tLCBsZW5ndGgsIGJwcCkKCiNpZmRlZiBNTVhfQVNNQkxJVAoKI2RlZmluZSBBTFBIQV9CTElUMzJfODg4TU1YKHRvLCBmcm9tLCBsZW5ndGgsIGJwcCwgYWxwaGEpCVwKICAgIGRvIHsJCQkJCQkJXAoJVWludDMyICpzcmNwID0gKFVpbnQzMiAqKShmcm9tKTsJCQlcCglVaW50MzIgKmRzdHAgPSAoVWludDMyICopKHRvKTsJCQkJXAogICAgICAgIGludCBpID0gMHgwMEZGMDBGRjsJCQkJCVwKICAgICAgICBtb3ZkX20ycigqKCZpKSwgbW0zKTsJCQkJCVwKICAgICAgICBwdW5wY2tsZHFfcjJyKG1tMywgbW0zKTsJCQkJXAogICAgICAgIGkgPSAweEZGMDAwMDAwOwkJCQkJCVwKICAgICAgICBtb3ZkX20ycigqKCZpKSwgbW03KTsJCQkJCVwKICAgICAgICBwdW5wY2tsZHFfcjJyKG1tNywgbW03KTsJCQkJXAogICAgICAgIGkgPSBhbHBoYSB8IGFscGhhIDw8IDE2OwkJCQlcCiAgICAgICAgbW92ZF9tMnIoKigmaSksIG1tNCk7CQkJCQlcCiAgICAgICAgcHVucGNrbGRxX3IycihtbTQsIG1tNCk7CQkJCVwKCXBjbXBlcWRfcjJyKG1tNSxtbTUpOyAvKiBzZXQgbW01IHRvICIxIiAqLwkJXAoJcHhvcl9yMnIobW03LCBtbTUpOyAvKiBtYWtlIGNsZWFyIGFscGhhIG1hc2sgKi8JCVwKICAgICAgICBpID0gbGVuZ3RoOwkJCQkJCVwKCWlmKGkgJiAxKSB7CQkJCQkJXAogICAgICAgICAgbW92ZF9tMnIoKCpzcmNwKSwgbW0xKTsgLyogc3JjIC0+IG1tMSAqLwkJXAogICAgICAgICAgcHVucGNrbGJ3X3IycihtbTEsIG1tMSk7CQkJCVwKICAgICAgICAgIHBhbmRfcjJyKG1tMywgbW0xKTsJCQkJCVwKCSAgbW92ZF9tMnIoKCpkc3RwKSwgbW0yKTsgLyogZHN0IC0+IG1tMiAqLwkJXAogICAgICAgICAgcHVucGNrbGJ3X3IycihtbTIsIG1tMik7CQkJCVwKICAgICAgICAgIHBhbmRfcjJyKG1tMywgbW0yKTsJCQkJCVwKCSAgcHN1YndfcjJyKG1tMiwgbW0xKTsJCQkJCVwKCSAgcG11bGx3X3IycihtbTQsIG1tMSk7CQkJCQlcCgkgIHBzcmx3X2kycig4LCBtbTEpOwkJCQkJXAoJICBwYWRkd19yMnIobW0xLCBtbTIpOwkJCQkJXAoJICBwYW5kX3IycihtbTMsIG1tMik7CQkJCQlcCgkgIHBhY2t1c3diX3IycihtbTIsIG1tMik7CQkJCVwKCSAgcGFuZF9yMnIobW01LCBtbTIpOyAvKiAwMDAwMFJHQiAtPiBtbTIgKi8JCVwKCSAgbW92ZF9yMm0obW0yLCAqZHN0cCk7CQkJCQlcCgkgICsrc3JjcDsJCQkJCQlcCgkgICsrZHN0cDsJCQkJCQlcCgkgIGktLTsJCQkJCQkJXAoJfQkJCQkJCQlcCglmb3IoOyBpID4gMDsgLS1pKSB7CQkJCQlcCiAgICAgICAgICBtb3ZxX20ycigoKnNyY3ApLCBtbTApOwkJCQlcCgkgIG1vdnFfcjJyKG1tMCwgbW0xKTsJCQkJCVwKICAgICAgICAgIHB1bnBja2xid19yMnIobW0wLCBtbTApOwkJCQlcCgkgIG1vdnFfbTJyKCgqZHN0cCksIG1tMik7CQkJCVwKCSAgcHVucGNraGJ3X3IycihtbTEsIG1tMSk7CQkJCVwKCSAgbW92cV9yMnIobW0yLCBtbTYpOwkJCQkJXAogICAgICAgICAgcGFuZF9yMnIobW0zLCBtbTApOwkJCQkJXAogICAgICAgICAgcHVucGNrbGJ3X3IycihtbTIsIG1tMik7CQkJCVwKCSAgcGFuZF9yMnIobW0zLCBtbTEpOwkJCQkJXAoJICBwdW5wY2toYndfcjJyKG1tNiwgbW02KTsJCQkJXAogICAgICAgICAgcGFuZF9yMnIobW0zLCBtbTIpOwkJCQkJXAoJICBwc3Vid19yMnIobW0yLCBtbTApOwkJCQkJXAoJICBwbXVsbHdfcjJyKG1tNCwgbW0wKTsJCQkJCVwKCSAgcGFuZF9yMnIobW0zLCBtbTYpOwkJCQkJXAoJICBwc3Vid19yMnIobW02LCBtbTEpOwkJCQkJXAoJICBwbXVsbHdfcjJyKG1tNCwgbW0xKTsJCQkJCVwKCSAgcHNybHdfaTJyKDgsIG1tMCk7CQkJCQlcCgkgIHBhZGR3X3IycihtbTAsIG1tMik7CQkJCQlcCgkgIHBzcmx3X2kycig4LCBtbTEpOwkJCQkJXAoJICBwYWRkd19yMnIobW0xLCBtbTYpOwkJCQkJXAoJICBwYW5kX3IycihtbTMsIG1tMik7CQkJCQlcCgkgIHBhbmRfcjJyKG1tMywgbW02KTsJCQkJCVwKCSAgcGFja3Vzd2JfcjJyKG1tMiwgbW0yKTsJCQkJXAoJICBwYWNrdXN3Yl9yMnIobW02LCBtbTYpOwkJCQlcCgkgIHBzcmxxX2kycigzMiwgbW0yKTsJCQkJCVwKCSAgcHNsbHFfaTJyKDMyLCBtbTYpOwkJCQkJXAoJICBwb3JfcjJyKG1tNiwgbW0yKTsJCQkJCVwKCSAgcGFuZF9yMnIobW01LCBtbTIpOyAvKiAwMDAwMFJHQiAtPiBtbTIgKi8JCVwKICAgICAgICAgbW92cV9yMm0obW0yLCAqZHN0cCk7CQkJCQlcCgkgIHNyY3AgKz0gMjsJCQkJCQlcCgkgIGRzdHAgKz0gMjsJCQkJCQlcCgkgIGktLTsJCQkJCQkJXAoJfQkJCQkJCQlcCgllbW1zKCk7CQkJCQkJCVwKICAgIH0gd2hpbGUoMCkKCiNkZWZpbmUgQUxQSEFfQkxJVDE2XzU2NU1NWCh0bywgZnJvbSwgbGVuZ3RoLCBicHAsIGFscGhhKQlcCiAgICBkbyB7CQkJCQkJXAogICAgICAgIGludCBpLCBuID0gMDsJCQkJCVwKCVVpbnQxNiAqc3JjcCA9IChVaW50MTYgKikoZnJvbSk7CQlcCglVaW50MTYgKmRzdHAgPSAoVWludDE2ICopKHRvKTsJCQlcCiAgICAgICAgVWludDMyIEFMUEhBID0gMHhGODAwOwkJCQlcCgltb3ZkX20ycigqKCZBTFBIQSksIG1tMSk7CQkJXAogICAgICAgIHB1bnBja2x3ZF9yMnIobW0xLCBtbTEpOwkJCVwKICAgICAgICBwdW5wY2tsd2RfcjJyKG1tMSwgbW0xKTsJCQlcCglBTFBIQSA9IDB4MDdFMDsJCQkJCVwKCW1vdmRfbTJyKCooJkFMUEhBKSwgbW00KTsJCQlcCiAgICAgICAgcHVucGNrbHdkX3IycihtbTQsIG1tNCk7CQkJXAogICAgICAgIHB1bnBja2x3ZF9yMnIobW00LCBtbTQpOwkJCVwKCUFMUEhBID0gMHgwMDFGOwkJCQkJXAoJbW92ZF9tMnIoKigmQUxQSEEpLCBtbTcpOwkJCVwKICAgICAgICBwdW5wY2tsd2RfcjJyKG1tNywgbW03KTsJCQlcCiAgICAgICAgcHVucGNrbHdkX3IycihtbTcsIG1tNyk7CQkJXAoJYWxwaGEgJj0gfigxKzIrNCk7CQkJCVwKICAgICAgICBpID0gKFVpbnQzMilhbHBoYSB8IChVaW50MzIpYWxwaGEgPDwgMTY7CVwKICAgICAgICBtb3ZkX20ycigqKCZpKSwgbW0wKTsJCQkJXAogICAgICAgIHB1bnBja2xkcV9yMnIobW0wLCBtbTApOwkJCVwKICAgICAgICBBTFBIQSA9IGFscGhhID4+IDM7CQkJCVwKICAgICAgICBpID0gKChpbnQpKGxlbmd0aCkgJiAzKTsJCQlcCglmb3IoOyBpID4gMDsgLS1pKSB7CQkJCVwKCSAgICBVaW50MzIgcyA9ICpzcmNwKys7CQkJCVwKCSAgICBVaW50MzIgZCA9ICpkc3RwOwkJCQlcCgkgICAgcyA9IChzIHwgcyA8PCAxNikgJiAweDA3ZTBmODFmOwkJXAoJICAgIGQgPSAoZCB8IGQgPDwgMTYpICYgMHgwN2UwZjgxZjsJCVwKCSAgICBkICs9IChzIC0gZCkgKiBBTFBIQSA+PiA1OwkJCVwKCSAgICBkICY9IDB4MDdlMGY4MWY7CQkJCVwKCSAgICAqZHN0cCsrID0gZCB8IGQgPj4gMTY7CQkJXAoJICAgIG4rKzsJCQkJCVwKCX0JCQkJCQlcCglpID0gKGludCkobGVuZ3RoKSAtIG47CQkJCVwKCWZvcig7IGkgPiAwOyAtLWkpIHsJCQkJXAoJICBtb3ZxX20ycigoKmRzdHApLCBtbTMpOwkJCVwKCSAgbW92cV9tMnIoKCpzcmNwKSwgbW0yKTsJCQlcCgkgIG1vdnFfcjJyKG1tMiwgbW01KTsJCQkJXAoJICBwYW5kX3IycihtbTEgLCBtbTUpOwkJCQlcCgkgIHBzcmxxX2kycigxMSwgbW01KTsJCQkJXAoJICBtb3ZxX3IycihtbTMsIG1tNik7CQkJCVwKCSAgcGFuZF9yMnIobW0xICwgbW02KTsJCQkJXAoJICBwc3JscV9pMnIoMTEsIG1tNik7CQkJCVwKCSAgcHN1YndfcjJyKG1tNiwgbW01KTsJCQkJXAoJICBwbXVsbHdfcjJyKG1tMCwgbW01KTsJCQkJXAoJICBwc3Jsd19pMnIoOCwgbW01KTsJCQkJXAoJICBwYWRkd19yMnIobW01LCBtbTYpOwkJCQlcCgkgIHBzbGxxX2kycigxMSwgbW02KTsJCQkJXAoJICBwYW5kX3IycihtbTEsIG1tNik7CQkJCVwKCSAgbW92cV9yMnIobW00LCBtbTUpOwkJCQlcCgkgIHBvcl9yMnIobW03LCBtbTUpOwkJCQlcCgkgIHBhbmRfcjJyKG1tNSwgbW0zKTsJCQkJXAoJICBwb3JfcjJyKG1tNiwgbW0zKTsJCQkJXAoJICBtb3ZxX3IycihtbTIsIG1tNSk7CQkJCVwKCSAgcGFuZF9yMnIobW00ICwgbW01KTsJCQkJXAoJICBwc3JscV9pMnIoNSwgbW01KTsJCQkJXAoJICBtb3ZxX3IycihtbTMsIG1tNik7CQkJCVwKCSAgcGFuZF9yMnIobW00ICwgbW02KTsJCQkJXAoJICBwc3JscV9pMnIoNSwgbW02KTsJCQkJXAoJICBwc3Vid19yMnIobW02LCBtbTUpOwkJCQlcCgkgIHBtdWxsd19yMnIobW0wLCBtbTUpOwkJCQlcCgkgIHBzcmx3X2kycig4LCBtbTUpOwkJCQlcCgkgIHBhZGR3X3IycihtbTUsIG1tNik7CQkJCVwKCSAgcHNsbHFfaTJyKDUsIG1tNik7CQkJCVwKCSAgcGFuZF9yMnIobW00LCBtbTYpOwkJCQlcCgkgIG1vdnFfcjJyKG1tMSwgbW01KTsJCQkJXAoJICBwb3JfcjJyKG1tNywgbW01KTsJCQkJXAoJICBwYW5kX3IycihtbTUsIG1tMyk7CQkJCVwKCSAgcG9yX3IycihtbTYsIG1tMyk7CQkJCVwKCSAgbW92cV9yMnIobW0yLCBtbTUpOwkJCQlcCgkgIHBhbmRfcjJyKG1tNyAsIG1tNSk7CQkJCVwKICAgICAgICAgIG1vdnFfcjJyKG1tMywgbW02KTsJCQkJXAoJICBwYW5kX3IycihtbTcgLCBtbTYpOwkJCQlcCgkgIHBzdWJ3X3IycihtbTYsIG1tNSk7CQkJCVwKCSAgcG11bGx3X3IycihtbTAsIG1tNSk7CQkJCVwKCSAgcHNybHdfaTJyKDgsIG1tNSk7CQkJCVwKCSAgcGFkZHdfcjJyKG1tNSwgbW02KTsJCQkJXAoJICBwYW5kX3IycihtbTcsIG1tNik7CQkJCVwKCSAgbW92cV9yMnIobW0xLCBtbTUpOwkJCQlcCgkgIHBvcl9yMnIobW00LCBtbTUpOwkJCQlcCgkgIHBhbmRfcjJyKG1tNSwgbW0zKTsJCQkJXAoJICBwb3JfcjJyKG1tNiwgbW0zKTsJCQkJXAoJICBtb3ZxX3IybShtbTMsICpkc3RwKTsJCQkJXAoJICBzcmNwICs9IDQ7CQkJCQlcCgkgIGRzdHAgKz0gNDsJCQkJCVwKCSAgaSAtPSAzOwkJCQkJXAoJfQkJCQkJCVwKCWVtbXMoKTsJCQkJCQlcCiAgICB9IHdoaWxlKDApCgojZGVmaW5lIEFMUEhBX0JMSVQxNl81NTVNTVgodG8sIGZyb20sIGxlbmd0aCwgYnBwLCBhbHBoYSkJXAogICAgZG8gewkJCQkJCVwKICAgICAgICBpbnQgaSwgbiA9IDA7CQkJCQlcCglVaW50MTYgKnNyY3AgPSAoVWludDE2ICopKGZyb20pOwkJXAoJVWludDE2ICpkc3RwID0gKFVpbnQxNiAqKSh0byk7CQkJXAogICAgICAgIFVpbnQzMiBBTFBIQSA9IDB4N0MwMDsJCQkJXAoJbW92ZF9tMnIoKigmQUxQSEEpLCBtbTEpOwkJCVwKICAgICAgICBwdW5wY2tsd2RfcjJyKG1tMSwgbW0xKTsJCQlcCiAgICAgICAgcHVucGNrbHdkX3IycihtbTEsIG1tMSk7CQkJXAoJQUxQSEEgPSAweDAzRTA7CQkJCQlcCiAgICAgICAgbW92ZF9tMnIoKigmQUxQSEEpLCBtbTQpOwkJCVwKICAgICAgICBwdW5wY2tsd2RfcjJyKG1tNCwgbW00KTsJCQlcCiAgICAgICAgcHVucGNrbHdkX3IycihtbTQsIG1tNCk7CQkJXAoJQUxQSEEgPSAweDAwMUY7CQkJCQlcCgltb3ZkX20ycigqKCZBTFBIQSksIG1tNyk7CQkJXAogICAgICAgIHB1bnBja2x3ZF9yMnIobW03LCBtbTcpOwkJCVwKICAgICAgICBwdW5wY2tsd2RfcjJyKG1tNywgbW03KTsJCQlcCglhbHBoYSAmPSB+KDErMis0KTsJCQkJXAogICAgICAgIGkgPSAoVWludDMyKWFscGhhIHwgKFVpbnQzMilhbHBoYSA8PCAxNjsJXAogICAgICAgIG1vdmRfbTJyKCooJmkpLCBtbTApOwkJCQlcCiAgICAgICAgcHVucGNrbGRxX3IycihtbTAsIG1tMCk7CQkJXAogICAgICAgIGkgPSAoKGludCkobGVuZ3RoKSAmIDMpOwkJCQlcCiAgICAgICAgQUxQSEEgPSBhbHBoYSA+PiAzOwkJCQlcCglmb3IoOyBpID4gMDsgLS1pKSB7CQkJCVwKCSAgICBVaW50MzIgcyA9ICpzcmNwKys7CQkJCVwKCSAgICBVaW50MzIgZCA9ICpkc3RwOwkJCQlcCgkgICAgcyA9IChzIHwgcyA8PCAxNikgJiAweDAzZTA3YzFmOwkJXAoJICAgIGQgPSAoZCB8IGQgPDwgMTYpICYgMHgwM2UwN2MxZjsJCVwKCSAgICBkICs9IChzIC0gZCkgKiBBTFBIQSA+PiA1OwkJCVwKCSAgICBkICY9IDB4MDNlMDdjMWY7CQkJCVwKCSAgICAqZHN0cCsrID0gZCB8IGQgPj4gMTY7CQkJXAoJICAgIG4rKzsJCQkJCVwKCX0JCQkJCQlcCglpID0gKGludCkobGVuZ3RoKSAtIG47CQkJCVwKCWZvcig7IGkgPiAwOyAtLWkpIHsJCQkJXAoJICBtb3ZxX20ycigoKmRzdHApLCBtbTMpOwkJCVwKCSAgbW92cV9tMnIoKCpzcmNwKSwgbW0yKTsJCQlcCgkgIG1vdnFfcjJyKG1tMiwgbW01KTsJCQkJXAoJICBwYW5kX3IycihtbTEgLCBtbTUpOwkJCQlcCgkgIHBzcmxxX2kycigxMCwgbW01KTsJCQkJXAoJICBtb3ZxX3IycihtbTMsIG1tNik7CQkJCVwKCSAgcGFuZF9yMnIobW0xICwgbW02KTsJCQkJXAoJICBwc3JscV9pMnIoMTAsIG1tNik7CQkJCVwKCSAgcHN1YndfcjJyKG1tNiwgbW01KTsJCQkJXAoJICBwbXVsbHdfcjJyKG1tMCwgbW01KTsJCQkJXAoJICBwc3Jsd19pMnIoOCwgbW01KTsJCQkJXAoJICBwYWRkd19yMnIobW01LCBtbTYpOwkJCQlcCgkgIHBzbGxxX2kycigxMCwgbW02KTsJCQkJXAoJICBwYW5kX3IycihtbTEsIG1tNik7CQkJCVwKCSAgbW92cV9yMnIobW00LCBtbTUpOwkJCQlcCgkgIHBvcl9yMnIobW03LCBtbTUpOwkJCQlcCgkgIHBhbmRfcjJyKG1tNSwgbW0zKTsJCQkJXAoJICBwb3JfcjJyKG1tNiwgbW0zKTsJCQkJXAoJICBtb3ZxX3IycihtbTIsIG1tNSk7CQkJCVwKCSAgcGFuZF9yMnIobW00ICwgbW01KTsJCQkJXAoJICBwc3JscV9pMnIoNSwgbW01KTsJCQkJXAoJICBtb3ZxX3IycihtbTMsIG1tNik7CQkJCVwKCSAgcGFuZF9yMnIobW00ICwgbW02KTsJCQkJXAoJICBwc3JscV9pMnIoNSwgbW02KTsJCQkJXAoJICBwc3Vid19yMnIobW02LCBtbTUpOwkJCQlcCgkgIHBtdWxsd19yMnIobW0wLCBtbTUpOwkJCQlcCgkgIHBzcmx3X2kycig4LCBtbTUpOwkJCQlcCgkgIHBhZGR3X3IycihtbTUsIG1tNik7CQkJCVwKCSAgcHNsbHFfaTJyKDUsIG1tNik7CQkJCVwKCSAgcGFuZF9yMnIobW00LCBtbTYpOwkJCQlcCgkgIG1vdnFfcjJyKG1tMSwgbW01KTsJCQkJXAoJICBwb3JfcjJyKG1tNywgbW01KTsJCQkJXAoJICBwYW5kX3IycihtbTUsIG1tMyk7CQkJCVwKCSAgcG9yX3IycihtbTYsIG1tMyk7CQkJCVwKCSAgbW92cV9yMnIobW0yLCBtbTUpOwkJCQlcCgkgIHBhbmRfcjJyKG1tNyAsIG1tNSk7CQkJCVwKICAgICAgICAgIG1vdnFfcjJyKG1tMywgbW02KTsJCQkJXAoJICBwYW5kX3IycihtbTcgLCBtbTYpOwkJCQlcCgkgIHBzdWJ3X3IycihtbTYsIG1tNSk7CQkJCVwKCSAgcG11bGx3X3IycihtbTAsIG1tNSk7CQkJCVwKCSAgcHNybHdfaTJyKDgsIG1tNSk7CQkJCVwKCSAgcGFkZHdfcjJyKG1tNSwgbW02KTsJCQkJXAoJICBwYW5kX3IycihtbTcsIG1tNik7CQkJCVwKCSAgbW92cV9yMnIobW0xLCBtbTUpOwkJCQlcCgkgIHBvcl9yMnIobW00LCBtbTUpOwkJCQlcCgkgIHBhbmRfcjJyKG1tNSwgbW0zKTsJCQkJXAoJICBwb3JfcjJyKG1tNiwgbW0zKTsJCQkJXAoJICBtb3ZxX3IybShtbTMsICpkc3RwKTsJCQkJXAoJICBzcmNwICs9IDQ7CQkJCQlcCgkgIGRzdHAgKz0gNDsJCQkJCVwKCSAgaSAtPSAzOwkJCQkJXAoJfQkJCQkJCVwKCWVtbXMoKTsJCQkJCQlcCiAgICB9IHdoaWxlKDApCgojZW5kaWYKCi8qCiAqIEZvciAzMmJwcCBwaXhlbHMgb24gdGhlIGZvcm0gMHgwMHJyZ2diYjoKICogSWYgd2UgdHJlYXQgdGhlIG1pZGRsZSBjb21wb25lbnQgc2VwYXJhdGVseSwgd2UgY2FuIHByb2Nlc3MgdGhlIHR3bwogKiByZW1haW5pbmcgaW4gcGFyYWxsZWwuIFRoaXMgaXMgc2FmZSB0byBkbyBiZWNhdXNlIG9mIHRoZSBnYXAgdG8gdGhlIGxlZnQKICogb2YgZWFjaCBjb21wb25lbnQsIHNvIHRoZSBiaXRzIGZyb20gdGhlIG11bHRpcGxpY2F0aW9uIGRvbid0IGNvbGxpZGUuCiAqIFRoaXMgY2FuIGJlIHVzZWQgZm9yIGFueSBSR0IgcGVybXV0YXRpb24gb2YgY291cnNlLgogKi8KI2RlZmluZSBBTFBIQV9CTElUMzJfODg4KHRvLCBmcm9tLCBsZW5ndGgsIGJwcCwgYWxwaGEpCQlcCiAgICBkbyB7CQkJCQkJCVwKICAgICAgICBpbnQgaTsJCQkJCQkJXAoJVWludDMyICpzcmMgPSAoVWludDMyICopKGZyb20pOwkJCQlcCglVaW50MzIgKmRzdCA9IChVaW50MzIgKikodG8pOwkJCQlcCglmb3IoaSA9IDA7IGkgPCAoaW50KShsZW5ndGgpOyBpKyspIHsJCQlcCgkgICAgVWludDMyIHMgPSAqc3JjKys7CQkJCQlcCgkgICAgVWludDMyIGQgPSAqZHN0OwkJCQkJXAoJICAgIFVpbnQzMiBzMSA9IHMgJiAweGZmMDBmZjsJCQkJXAoJICAgIFVpbnQzMiBkMSA9IGQgJiAweGZmMDBmZjsJCQkJXAoJICAgIGQxID0gKGQxICsgKChzMSAtIGQxKSAqIGFscGhhID4+IDgpKSAmIDB4ZmYwMGZmOwlcCgkgICAgcyAmPSAweGZmMDA7CQkJCQlcCgkgICAgZCAmPSAweGZmMDA7CQkJCQlcCgkgICAgZCA9IChkICsgKChzIC0gZCkgKiBhbHBoYSA+PiA4KSkgJiAweGZmMDA7CQlcCgkgICAgKmRzdCsrID0gZDEgfCBkOwkJCQkJXAoJfQkJCQkJCQlcCiAgICB9IHdoaWxlKDApCgovKgogKiBGb3IgMTZicHAgcGl4ZWxzIHdlIGNhbiBnbyBhIHN0ZXAgZnVydGhlcjogcHV0IHRoZSBtaWRkbGUgY29tcG9uZW50CiAqIGluIHRoZSBoaWdoIDE2IGJpdHMgb2YgYSAzMiBiaXQgd29yZCwgYW5kIHByb2Nlc3MgYWxsIHRocmVlIFJHQgogKiBjb21wb25lbnRzIGF0IHRoZSBzYW1lIHRpbWUuIFNpbmNlIHRoZSBzbWFsbGVzdCBnYXAgaXMgaGVyZSBqdXN0CiAqIDUgYml0cywgd2UgaGF2ZSB0byBzY2FsZSBhbHBoYSBkb3duIHRvIDUgYml0cyBhcyB3ZWxsLgogKi8KI2RlZmluZSBBTFBIQV9CTElUMTZfNTY1KHRvLCBmcm9tLCBsZW5ndGgsIGJwcCwgYWxwaGEpCVwKICAgIGRvIHsJCQkJCQlcCiAgICAgICAgaW50IGk7CQkJCQkJXAoJVWludDE2ICpzcmMgPSAoVWludDE2ICopKGZyb20pOwkJCVwKCVVpbnQxNiAqZHN0ID0gKFVpbnQxNiAqKSh0byk7CQkJXAoJVWludDMyIEFMUEhBID0gYWxwaGEgPj4gMzsJCQlcCglmb3IoaSA9IDA7IGkgPCAoaW50KShsZW5ndGgpOyBpKyspIHsJCVwKCSAgICBVaW50MzIgcyA9ICpzcmMrKzsJCQkJXAoJICAgIFVpbnQzMiBkID0gKmRzdDsJCQkJXAoJICAgIHMgPSAocyB8IHMgPDwgMTYpICYgMHgwN2UwZjgxZjsJCVwKCSAgICBkID0gKGQgfCBkIDw8IDE2KSAmIDB4MDdlMGY4MWY7CQlcCgkgICAgZCArPSAocyAtIGQpICogQUxQSEEgPj4gNTsJCQlcCgkgICAgZCAmPSAweDA3ZTBmODFmOwkJCQlcCgkgICAgKmRzdCsrID0gKFVpbnQxNikoZCB8IGQgPj4gMTYpOwkJCVwKCX0JCQkJCQlcCiAgICB9IHdoaWxlKDApCgojZGVmaW5lIEFMUEhBX0JMSVQxNl81NTUodG8sIGZyb20sIGxlbmd0aCwgYnBwLCBhbHBoYSkJXAogICAgZG8gewkJCQkJCVwKICAgICAgICBpbnQgaTsJCQkJCQlcCglVaW50MTYgKnNyYyA9IChVaW50MTYgKikoZnJvbSk7CQkJXAoJVWludDE2ICpkc3QgPSAoVWludDE2ICopKHRvKTsJCQlcCglVaW50MzIgQUxQSEEgPSBhbHBoYSA+PiAzOwkJCVwKCWZvcihpID0gMDsgaSA8IChpbnQpKGxlbmd0aCk7IGkrKykgewkJXAoJICAgIFVpbnQzMiBzID0gKnNyYysrOwkJCQlcCgkgICAgVWludDMyIGQgPSAqZHN0OwkJCQlcCgkgICAgcyA9IChzIHwgcyA8PCAxNikgJiAweDAzZTA3YzFmOwkJXAoJICAgIGQgPSAoZCB8IGQgPDwgMTYpICYgMHgwM2UwN2MxZjsJCVwKCSAgICBkICs9IChzIC0gZCkgKiBBTFBIQSA+PiA1OwkJCVwKCSAgICBkICY9IDB4MDNlMDdjMWY7CQkJCVwKCSAgICAqZHN0KysgPSAoVWludDE2KShkIHwgZCA+PiAxNik7CQkJXAoJfQkJCQkJCVwKICAgIH0gd2hpbGUoMCkKCi8qCiAqIFRoZSBnZW5lcmFsIHNsb3cgY2F0Y2gtYWxsIGZ1bmN0aW9uLCBmb3IgcmVtYWluaW5nIGRlcHRocyBhbmQgZm9ybWF0cwogKi8KI2RlZmluZSBBTFBIQV9CTElUX0FOWSh0bywgZnJvbSwgbGVuZ3RoLCBicHAsIGFscGhhKQkJCVwKICAgIGRvIHsJCQkJCQkJCVwKICAgICAgICBpbnQgaTsJCQkJCQkJCVwKCVVpbnQ4ICpzcmMgPSBmcm9tOwkJCQkJCVwKCVVpbnQ4ICpkc3QgPSB0bzsJCQkJCQlcCglmb3IoaSA9IDA7IGkgPCAoaW50KShsZW5ndGgpOyBpKyspIHsJCQkJXAoJICAgIFVpbnQzMiBzLCBkOwkJCQkJCVwKCSAgICB1bnNpZ25lZCBycywgZ3MsIGJzLCByZCwgZ2QsIGJkOwkJCQlcCgkgICAgc3dpdGNoKGJwcCkgewkJCQkJCVwKCSAgICBjYXNlIDI6CQkJCQkJCVwKCQlzID0gKihVaW50MTYgKilzcmM7CQkJCQlcCgkJZCA9ICooVWludDE2ICopZHN0OwkJCQkJXAoJCWJyZWFrOwkJCQkJCQlcCgkgICAgY2FzZSAzOgkJCQkJCQlcCgkJaWYoU0RMX0JZVEVPUkRFUiA9PSBTRExfQklHX0VORElBTikgewkJCVwKCQkgICAgcyA9IChzcmNbMF0gPDwgMTYpIHwgKHNyY1sxXSA8PCA4KSB8IHNyY1syXTsJXAoJCSAgICBkID0gKGRzdFswXSA8PCAxNikgfCAoZHN0WzFdIDw8IDgpIHwgZHN0WzJdOwlcCgkJfSBlbHNlIHsJCQkJCQlcCgkJICAgIHMgPSAoc3JjWzJdIDw8IDE2KSB8IChzcmNbMV0gPDwgOCkgfCBzcmNbMF07CVwKCQkgICAgZCA9IChkc3RbMl0gPDwgMTYpIHwgKGRzdFsxXSA8PCA4KSB8IGRzdFswXTsJXAoJCX0JCQkJCQkJXAoJCWJyZWFrOwkJCQkJCQlcCgkgICAgY2FzZSA0OgkJCQkJCQlcCgkJcyA9ICooVWludDMyICopc3JjOwkJCQkJXAoJCWQgPSAqKFVpbnQzMiAqKWRzdDsJCQkJCVwKCQlicmVhazsJCQkJCQkJXAoJICAgIH0JCQkJCQkJCVwKCSAgICBSR0JfRlJPTV9QSVhFTChzLCBmbXQsIHJzLCBncywgYnMpOwkJCQlcCgkgICAgUkdCX0ZST01fUElYRUwoZCwgZm10LCByZCwgZ2QsIGJkKTsJCQkJXAoJICAgIHJkICs9IChycyAtIHJkKSAqIGFscGhhID4+IDg7CQkJCVwKCSAgICBnZCArPSAoZ3MgLSBnZCkgKiBhbHBoYSA+PiA4OwkJCQlcCgkgICAgYmQgKz0gKGJzIC0gYmQpICogYWxwaGEgPj4gODsJCQkJXAoJICAgIFBJWEVMX0ZST01fUkdCKGQsIGZtdCwgcmQsIGdkLCBiZCk7CQkJCVwKCSAgICBzd2l0Y2goYnBwKSB7CQkJCQkJXAoJICAgIGNhc2UgMjoJCQkJCQkJXAoJCSooVWludDE2ICopZHN0ID0gKFVpbnQxNilkOwkJCQkJXAoJCWJyZWFrOwkJCQkJCQlcCgkgICAgY2FzZSAzOgkJCQkJCQlcCgkJaWYoU0RMX0JZVEVPUkRFUiA9PSBTRExfQklHX0VORElBTikgewkJCVwKCQkgICAgZHN0WzBdID0gKFVpbnQ4KShkID4+IDE2KTsJCQkJCVwKCQkgICAgZHN0WzFdID0gKFVpbnQ4KShkID4+IDgpOwkJCQkJXAoJCSAgICBkc3RbMl0gPSAoVWludDgpKGQpOwkJCQkJCVwKCQl9IGVsc2UgewkJCQkJCVwKCQkgICAgZHN0WzBdID0gKFVpbnQ4KWQ7CQkJCQkJXAoJCSAgICBkc3RbMV0gPSAoVWludDgpKGQgPj4gOCk7CQkJCQlcCgkJICAgIGRzdFsyXSA9IChVaW50OCkoZCA+PiAxNik7CQkJCQlcCgkJfQkJCQkJCQlcCgkJYnJlYWs7CQkJCQkJCVwKCSAgICBjYXNlIDQ6CQkJCQkJCVwKCQkqKFVpbnQzMiAqKWRzdCA9IGQ7CQkJCQlcCgkJYnJlYWs7CQkJCQkJCVwKCSAgICB9CQkJCQkJCQlcCgkgICAgc3JjICs9IGJwcDsJCQkJCQkJXAoJICAgIGRzdCArPSBicHA7CQkJCQkJCVwKCX0JCQkJCQkJCVwKICAgIH0gd2hpbGUoMCkKCiNpZmRlZiBNTVhfQVNNQkxJVAoKI2RlZmluZSBBTFBIQV9CTElUMzJfODg4XzUwTU1YKHRvLCBmcm9tLCBsZW5ndGgsIGJwcCwgYWxwaGEpCQlcCiAgICBkbyB7CQkJCQkJCQlcCglVaW50MzIgKnNyY3AgPSAoVWludDMyICopKGZyb20pOwkJCQlcCglVaW50MzIgKmRzdHAgPSAoVWludDMyICopKHRvKTsJCQkJCVwKICAgICAgICBpbnQgaSA9IDB4MDBmZWZlZmU7CQkJCQkJXAogICAgICAgIG1vdmRfbTJyKCooJmkpLCBtbTQpOwkJCQkJCVwKICAgICAgICBwdW5wY2tsZHFfcjJyKG1tNCwgbW00KTsJCQkJCVwKICAgICAgICBpID0gMHgwMDAxMDEwMTsJCQkJCQkJXAogICAgICAgIG1vdmRfbTJyKCooJmkpLCBtbTMpOwkJCQkJCVwKICAgICAgICBwdW5wY2tsZHFfcjJyKG1tMywgbW0zKTsJCQkJCVwKICAgICAgICBpID0gKGludCkobGVuZ3RoKTsJCQkJCQlcCiAgICAgICAgaWYoIGkgJiAxICkgewkJCQkJCQlcCgkgIFVpbnQzMiBzID0gKnNyY3ArKzsJCQkJCQlcCgkgIFVpbnQzMiBkID0gKmRzdHA7CQkJCQkJXAoJICAqZHN0cCsrID0gKCgocyAmIDB4MDBmZWZlZmUpICsgKGQgJiAweDAwZmVmZWZlKSkgPj4gMSkJXAoJCSAgICAgKyAocyAmIGQgJiAweDAwMDEwMTAxKTsJCQkJXAoJICBpLS07CQkJCQkJCQlcCgl9CQkJCQkJCQlcCglmb3IoOyBpID4gMDsgLS1pKSB7CQkJCQkJXAoJICAgIG1vdnFfbTJyKCgqZHN0cCksIG1tMik7IC8qIGRzdCAtPiBtbTIgKi8JCQlcCgkgICAgbW92cV9yMnIobW0yLCBtbTYpOwkvKiBkc3QgLT4gbW02ICovCQkJXAoJICAgIG1vdnFfbTJyKCgqc3JjcCksIG1tMSk7IC8qIHNyYyAtPiBtbTEgKi8JCQlcCgkgICAgbW92cV9yMnIobW0xLCBtbTUpOwkvKiBzcmMgLT4gbW01ICovCQkJXAoJICAgIHBhbmRfcjJyKG1tNCwgbW02KTsJLyogZHN0ICYgMHgwMGZlZmVmZSAtPiBtbTYgKi8JCVwKCSAgICBwYW5kX3IycihtbTQsIG1tNSk7IC8qIHNyYyAmIDB4MDBmZWZlZmUgLT4gbW01ICovCQlcCgkgICAgcGFkZGRfcjJyKG1tNiwgbW01KTsgLyogKGRzdCAmIDB4MDBmZWZlZmUpICsgKGRzdCAmIDB4MDBmZWZlZmUpIC0+IG1tNSAqLwlcCgkgICAgcHNybGRfaTJyKDEsIG1tNSk7CQkJCQkJXAoJICAgIHBhbmRfcjJyKG1tMSwgbW0yKTsJLyogcyAmIGQgLT4gbW0yICovCQkJXAoJICAgIHBhbmRfcjJyKG1tMywgbW0yKTsJLyogcyAmIGQgJiAweDAwMDEwMTAxIC0+IG1tMiAqLwkJXAoJICAgIHBhZGRkX3IycihtbTUsIG1tMik7CQkJCQlcCgkgICAgbW92cV9yMm0obW0yLCAoKmRzdHApKTsJCQkJCVwKCSAgICBkc3RwICs9IDI7CQkJCQkJCVwKCSAgICBzcmNwICs9IDI7CQkJCQkJCVwKCSAgICBpLS07CQkJCQkJCVwKCX0JCQkJCQkJCVwKCWVtbXMoKTsJCQkJCQkJCVwKICAgIH0gd2hpbGUoMCkKCiNlbmRpZgogICAgCi8qCiAqIFNwZWNpYWwgY2FzZTogNTAlIGFscGhhIChhbHBoYT0xMjgpCiAqIFRoaXMgaXMgdHJlYXRlZCBzcGVjaWFsbHkgYmVjYXVzZSBpdCBjYW4gYmUgb3B0aW1pemVkIHZlcnkgd2VsbCwgYW5kCiAqIHNpbmNlIGl0IGlzIGdvb2QgZm9yIG1hbnkgY2FzZXMgb2Ygc2VtaS10cmFuc2x1Y2VuY3kuCiAqIFRoZSB0aGVvcnkgaXMgdG8gZG8gYWxsIHRocmVlIGNvbXBvbmVudHMgYXQgdGhlIHNhbWUgdGltZToKICogRmlyc3QgemVybyB0aGUgbG93ZXN0IGJpdCBvZiBlYWNoIGNvbXBvbmVudCwgd2hpY2ggZ2l2ZXMgdXMgcm9vbSB0bwogKiBhZGQgdGhlbS4gVGhlbiBzaGlmdCByaWdodCBhbmQgYWRkIHRoZSBzdW0gb2YgdGhlIGxvd2VzdCBiaXRzLgogKi8KI2RlZmluZSBBTFBIQV9CTElUMzJfODg4XzUwKHRvLCBmcm9tLCBsZW5ndGgsIGJwcCwgYWxwaGEpCQlcCiAgICBkbyB7CQkJCQkJCQlcCiAgICAgICAgaW50IGk7CQkJCQkJCQlcCglVaW50MzIgKnNyYyA9IChVaW50MzIgKikoZnJvbSk7CQkJCQlcCglVaW50MzIgKmRzdCA9IChVaW50MzIgKikodG8pOwkJCQkJXAoJZm9yKGkgPSAwOyBpIDwgKGludCkobGVuZ3RoKTsgaSsrKSB7CQkJCVwKCSAgICBVaW50MzIgcyA9ICpzcmMrKzsJCQkJCQlcCgkgICAgVWludDMyIGQgPSAqZHN0OwkJCQkJCVwKCSAgICAqZHN0KysgPSAoKChzICYgMHgwMGZlZmVmZSkgKyAoZCAmIDB4MDBmZWZlZmUpKSA+PiAxKQlcCgkJICAgICArIChzICYgZCAmIDB4MDAwMTAxMDEpOwkJCQlcCgl9CQkJCQkJCQlcCiAgICB9IHdoaWxlKDApCgovKgogKiBGb3IgMTZicHAsIHdlIGNhbiBhY3R1YWxseSBibGVuZCB0d28gcGl4ZWxzIGluIHBhcmFsbGVsLCBpZiB3ZSB0YWtlCiAqIGNhcmUgdG8gc2hpZnQgYmVmb3JlIHdlIGFkZCwgbm90IGFmdGVyLgogKi8KCi8qIGhlbHBlcjogYmxlbmQgYSBzaW5nbGUgMTYgYml0IHBpeGVsIGF0IDUwJSAqLwojZGVmaW5lIEJMRU5EMTZfNTAoZHN0LCBzcmMsIG1hc2spCQkJXAogICAgZG8gewkJCQkJCVwKCVVpbnQzMiBzID0gKnNyYysrOwkJCQlcCglVaW50MzIgZCA9ICpkc3Q7CQkJCVwKCSpkc3QrKyA9IChVaW50MTYpKCgoKHMgJiBtYXNrKSArIChkICYgbWFzaykpID4+IDEpICsJXAoJICAgICAgICAgICAgICAgICAgKHMgJiBkICYgKH5tYXNrICYgMHhmZmZmKSkpOwkJXAogICAgfSB3aGlsZSgwKQoKLyogYmFzaWMgMTZicHAgYmxlbmRlci4gbWFzayBpcyB0aGUgcGl4ZWxzIHRvIGtlZXAgd2hlbiBhZGRpbmcuICovCiNkZWZpbmUgQUxQSEFfQkxJVDE2XzUwKHRvLCBmcm9tLCBsZW5ndGgsIGJwcCwgYWxwaGEsIG1hc2spCQlcCiAgICBkbyB7CQkJCQkJCQlcCgl1bnNpZ25lZCBuID0gKGxlbmd0aCk7CQkJCQkJXAoJVWludDE2ICpzcmMgPSAoVWludDE2ICopKGZyb20pOwkJCQkJXAoJVWludDE2ICpkc3QgPSAoVWludDE2ICopKHRvKTsJCQkJCVwKCWlmKCgodWludHB0cl90KXNyYyBeICh1aW50cHRyX3QpZHN0KSAmIDMpIHsJCQlcCgkgICAgLyogc291cmNlIGFuZCBkZXN0aW5hdGlvbiBub3QgaW4gcGhhc2UsIGJsaXQgb25lIGJ5IG9uZSAqLwlcCgkgICAgd2hpbGUobi0tKQkJCQkJCQlcCgkJQkxFTkQxNl81MChkc3QsIHNyYywgbWFzayk7CQkJCVwKCX0gZWxzZSB7CQkJCQkJCVwKCSAgICBpZigodWludHB0cl90KXNyYyAmIDMpIHsJCQkJCVwKCQkvKiBmaXJzdCBvZGQgcGl4ZWwgKi8JCQkJCVwKCQlCTEVORDE2XzUwKGRzdCwgc3JjLCBtYXNrKTsJCQkJXAoJCW4tLTsJCQkJCQkJXAoJICAgIH0JCQkJCQkJCVwKCSAgICBmb3IoOyBuID4gMTsgbiAtPSAyKSB7CQkJCQlcCgkJVWludDMyIHMgPSAqKFVpbnQzMiAqKXNyYzsJCQkJXAoJCVVpbnQzMiBkID0gKihVaW50MzIgKilkc3Q7CQkJCVwKCQkqKFVpbnQzMiAqKWRzdCA9ICgocyAmIChtYXNrIHwgbWFzayA8PCAxNikpID4+IDEpCVwKCQkgICAgICAgICAgICAgICArICgoZCAmIChtYXNrIHwgbWFzayA8PCAxNikpID4+IDEpCVwKCQkgICAgICAgICAgICAgICArIChzICYgZCAmICh+KG1hc2sgfCBtYXNrIDw8IDE2KSkpOwlcCgkJc3JjICs9IDI7CQkJCQkJXAoJCWRzdCArPSAyOwkJCQkJCVwKCSAgICB9CQkJCQkJCQlcCgkgICAgaWYobikJCQkJCQkJXAoJCUJMRU5EMTZfNTAoZHN0LCBzcmMsIG1hc2spOyAvKiBsYXN0IG9kZCBwaXhlbCAqLwlcCgl9CQkJCQkJCQlcCiAgICB9IHdoaWxlKDApCgojZGVmaW5lIEFMUEhBX0JMSVQxNl81NjVfNTAodG8sIGZyb20sIGxlbmd0aCwgYnBwLCBhbHBoYSkJXAogICAgQUxQSEFfQkxJVDE2XzUwKHRvLCBmcm9tLCBsZW5ndGgsIGJwcCwgYWxwaGEsIDB4ZjdkZSkKCiNkZWZpbmUgQUxQSEFfQkxJVDE2XzU1NV81MCh0bywgZnJvbSwgbGVuZ3RoLCBicHAsIGFscGhhKQlcCiAgICBBTFBIQV9CTElUMTZfNTAodG8sIGZyb20sIGxlbmd0aCwgYnBwLCBhbHBoYSwgMHhmYmRlKQoKI2lmZGVmIE1NWF9BU01CTElUCgojZGVmaW5lIENIT09TRV9CTElUKGJsaXR0ZXIsIGFscGhhLCBmbXQpCQkJCVwKICAgIGRvIHsJCQkJCQkJCVwKICAgICAgICBpZihhbHBoYSA9PSAyNTUpIHsJCQkJCQlcCgkgICAgc3dpdGNoKGZtdC0+Qnl0ZXNQZXJQaXhlbCkgewkJCQlcCgkgICAgY2FzZSAxOiBibGl0dGVyKDEsIFVpbnQ4LCBPUEFRVUVfQkxJVCk7IGJyZWFrOwkJXAoJICAgIGNhc2UgMjogYmxpdHRlcigyLCBVaW50OCwgT1BBUVVFX0JMSVQpOyBicmVhazsJCVwKCSAgICBjYXNlIDM6IGJsaXR0ZXIoMywgVWludDgsIE9QQVFVRV9CTElUKTsgYnJlYWs7CQlcCgkgICAgY2FzZSA0OiBibGl0dGVyKDQsIFVpbnQxNiwgT1BBUVVFX0JMSVQpOyBicmVhazsJCVwKCSAgICB9CQkJCQkJCQlcCgl9IGVsc2UgewkJCQkJCQlcCgkgICAgc3dpdGNoKGZtdC0+Qnl0ZXNQZXJQaXhlbCkgewkJCQlcCgkgICAgY2FzZSAxOgkJCQkJCQlcCgkJLyogTm8gOGJwcCBhbHBoYSBibGl0dGluZyAqLwkJCQlcCgkJYnJlYWs7CQkJCQkJCVwKCQkJCQkJCQkJXAoJICAgIGNhc2UgMjoJCQkJCQkJXAoJCXN3aXRjaChmbXQtPlJtYXNrIHwgZm10LT5HbWFzayB8IGZtdC0+Qm1hc2spIHsJCVwKCQljYXNlIDB4ZmZmZjoJCQkJCQlcCgkJICAgIGlmKGZtdC0+R21hc2sgPT0gMHgwN2UwCQkJCVwKCQkgICAgICAgfHwgZm10LT5SbWFzayA9PSAweDA3ZTAJCQkJXAoJCSAgICAgICB8fCBmbXQtPkJtYXNrID09IDB4MDdlMCkgewkJCVwKCQkJaWYoYWxwaGEgPT0gMTI4KQkJCQlcCgkJCSAgICBibGl0dGVyKDIsIFVpbnQ4LCBBTFBIQV9CTElUMTZfNTY1XzUwKTsJXAoJCQllbHNlIHsJCQkJCQlcCgkJCSAgICBpZihTRExfSGFzTU1YKCkpCQkJCVwKCQkJCWJsaXR0ZXIoMiwgVWludDgsIEFMUEhBX0JMSVQxNl81NjVNTVgpOwlcCgkJCSAgICBlbHNlCQkJCQlcCgkJCQlibGl0dGVyKDIsIFVpbnQ4LCBBTFBIQV9CTElUMTZfNTY1KTsJXAoJCQl9CQkJCQkJXAoJCSAgICB9IGVsc2UJCQkJCQlcCgkJCWdvdG8gZ2VuZXJhbDE2OwkJCQkJXAoJCSAgICBicmVhazsJCQkJCQlcCgkJCQkJCQkJCVwKCQljYXNlIDB4N2ZmZjoJCQkJCQlcCgkJICAgIGlmKGZtdC0+R21hc2sgPT0gMHgwM2UwCQkJCVwKCQkgICAgICAgfHwgZm10LT5SbWFzayA9PSAweDAzZTAJCQkJXAoJCSAgICAgICB8fCBmbXQtPkJtYXNrID09IDB4MDNlMCkgewkJCVwKCQkJaWYoYWxwaGEgPT0gMTI4KQkJCQlcCgkJCSAgICBibGl0dGVyKDIsIFVpbnQ4LCBBTFBIQV9CTElUMTZfNTU1XzUwKTsJXAoJCQllbHNlIHsJCQkJCQlcCgkJCSAgICBpZihTRExfSGFzTU1YKCkpCQkJCVwKCQkJCWJsaXR0ZXIoMiwgVWludDgsIEFMUEhBX0JMSVQxNl81NTVNTVgpOwlcCgkJCSAgICBlbHNlCQkJCQlcCgkJCQlibGl0dGVyKDIsIFVpbnQ4LCBBTFBIQV9CTElUMTZfNTU1KTsJXAoJCQl9CQkJCQkJXAoJCQlicmVhazsJCQkJCQlcCgkJICAgIH0JCQkJCQkJXAoJCSAgICAvKiBmYWxsdGhyb3VnaCAqLwkJCQkJXAoJCQkJCQkJCQlcCgkJZGVmYXVsdDoJCQkJCQlcCgkJZ2VuZXJhbDE2OgkJCQkJCVwKCQkgICAgYmxpdHRlcigyLCBVaW50OCwgQUxQSEFfQkxJVF9BTlkpOwkJCVwKCQl9CQkJCQkJCVwKCQlicmVhazsJCQkJCQkJXAoJCQkJCQkJCQlcCgkgICAgY2FzZSAzOgkJCQkJCQlcCgkJYmxpdHRlcigzLCBVaW50OCwgQUxQSEFfQkxJVF9BTlkpOwkJCVwKCQlicmVhazsJCQkJCQkJXAoJCQkJCQkJCQlcCgkgICAgY2FzZSA0OgkJCQkJCQlcCgkJaWYoKGZtdC0+Um1hc2sgfCBmbXQtPkdtYXNrIHwgZm10LT5CbWFzaykgPT0gMHgwMGZmZmZmZglcCgkJICAgJiYgKGZtdC0+R21hc2sgPT0gMHhmZjAwIHx8IGZtdC0+Um1hc2sgPT0gMHhmZjAwCVwKCQkgICAgICAgfHwgZm10LT5CbWFzayA9PSAweGZmMDApKSB7CQkJXAoJCSAgICBpZihhbHBoYSA9PSAxMjgpCQkJCQlcCgkJICAgIHsJCQkJCQkJXAoJCQlpZihTRExfSGFzTU1YKCkpCQkJCVwKCQkJCWJsaXR0ZXIoNCwgVWludDE2LCBBTFBIQV9CTElUMzJfODg4XzUwTU1YKTtcCgkJCWVsc2UJCQkJCQlcCgkJCQlibGl0dGVyKDQsIFVpbnQxNiwgQUxQSEFfQkxJVDMyXzg4OF81MCk7XAoJCSAgICB9CQkJCQkJCVwKCQkgICAgZWxzZQkJCQkJCVwKCQkgICAgewkJCQkJCQlcCgkJCWlmKFNETF9IYXNNTVgoKSkJCQkJXAoJCQkJYmxpdHRlcig0LCBVaW50MTYsIEFMUEhBX0JMSVQzMl84ODhNTVgpO1wKCQkJZWxzZQkJCQkJCVwKCQkJCWJsaXR0ZXIoNCwgVWludDE2LCBBTFBIQV9CTElUMzJfODg4KTsJXAoJCSAgICB9CQkJCQkJCVwKCQl9IGVsc2UJCQkJCQkJXAoJCSAgICBibGl0dGVyKDQsIFVpbnQxNiwgQUxQSEFfQkxJVF9BTlkpOwkJCVwKCQlicmVhazsJCQkJCQkJXAoJICAgIH0JCQkJCQkJCVwKCX0JCQkJCQkJCVwKICAgIH0gd2hpbGUoMCkKCiNlbHNlCgkKI2RlZmluZSBDSE9PU0VfQkxJVChibGl0dGVyLCBhbHBoYSwgZm10KQkJCQlcCiAgICBkbyB7CQkJCQkJCQlcCiAgICAgICAgaWYoYWxwaGEgPT0gMjU1KSB7CQkJCQkJXAoJICAgIHN3aXRjaChmbXQtPkJ5dGVzUGVyUGl4ZWwpIHsJCQkJXAoJICAgIGNhc2UgMTogYmxpdHRlcigxLCBVaW50OCwgT1BBUVVFX0JMSVQpOyBicmVhazsJCVwKCSAgICBjYXNlIDI6IGJsaXR0ZXIoMiwgVWludDgsIE9QQVFVRV9CTElUKTsgYnJlYWs7CQlcCgkgICAgY2FzZSAzOiBibGl0dGVyKDMsIFVpbnQ4LCBPUEFRVUVfQkxJVCk7IGJyZWFrOwkJXAoJICAgIGNhc2UgNDogYmxpdHRlcig0LCBVaW50MTYsIE9QQVFVRV9CTElUKTsgYnJlYWs7CQlcCgkgICAgfQkJCQkJCQkJXAoJfSBlbHNlIHsJCQkJCQkJXAoJICAgIHN3aXRjaChmbXQtPkJ5dGVzUGVyUGl4ZWwpIHsJCQkJXAoJICAgIGNhc2UgMToJCQkJCQkJXAoJCS8qIE5vIDhicHAgYWxwaGEgYmxpdHRpbmcgKi8JCQkJXAoJCWJyZWFrOwkJCQkJCQlcCgkJCQkJCQkJCVwKCSAgICBjYXNlIDI6CQkJCQkJCVwKCQlzd2l0Y2goZm10LT5SbWFzayB8IGZtdC0+R21hc2sgfCBmbXQtPkJtYXNrKSB7CQlcCgkJY2FzZSAweGZmZmY6CQkJCQkJXAoJCSAgICBpZihmbXQtPkdtYXNrID09IDB4MDdlMAkJCQlcCgkJICAgICAgIHx8IGZtdC0+Um1hc2sgPT0gMHgwN2UwCQkJCVwKCQkgICAgICAgfHwgZm10LT5CbWFzayA9PSAweDA3ZTApIHsJCQlcCgkJCWlmKGFscGhhID09IDEyOCkJCQkJXAoJCQkgICAgYmxpdHRlcigyLCBVaW50OCwgQUxQSEFfQkxJVDE2XzU2NV81MCk7CVwKCQkJZWxzZSB7CQkJCQkJXAoJCQkgICAgYmxpdHRlcigyLCBVaW50OCwgQUxQSEFfQkxJVDE2XzU2NSk7CVwKCQkJfQkJCQkJCVwKCQkgICAgfSBlbHNlCQkJCQkJXAoJCQlnb3RvIGdlbmVyYWwxNjsJCQkJCVwKCQkgICAgYnJlYWs7CQkJCQkJXAoJCQkJCQkJCQlcCgkJY2FzZSAweDdmZmY6CQkJCQkJXAoJCSAgICBpZihmbXQtPkdtYXNrID09IDB4MDNlMAkJCQlcCgkJICAgICAgIHx8IGZtdC0+Um1hc2sgPT0gMHgwM2UwCQkJCVwKCQkgICAgICAgfHwgZm10LT5CbWFzayA9PSAweDAzZTApIHsJCQlcCgkJCWlmKGFscGhhID09IDEyOCkJCQkJXAoJCQkgICAgYmxpdHRlcigyLCBVaW50OCwgQUxQSEFfQkxJVDE2XzU1NV81MCk7CVwKCQkJZWxzZSB7CQkJCQkJXAoJCQkgICAgYmxpdHRlcigyLCBVaW50OCwgQUxQSEFfQkxJVDE2XzU1NSk7CVwKCQkJfQkJCQkJCVwKCQkJYnJlYWs7CQkJCQkJXAoJCSAgICB9CQkJCQkJCVwKCQkgICAgLyogZmFsbHRocm91Z2ggKi8JCQkJCVwKCQkJCQkJCQkJXAoJCWRlZmF1bHQ6CQkJCQkJXAoJCWdlbmVyYWwxNjoJCQkJCQlcCgkJICAgIGJsaXR0ZXIoMiwgVWludDgsIEFMUEhBX0JMSVRfQU5ZKTsJCQlcCgkJfQkJCQkJCQlcCgkJYnJlYWs7CQkJCQkJCVwKCQkJCQkJCQkJXAoJICAgIGNhc2UgMzoJCQkJCQkJXAoJCWJsaXR0ZXIoMywgVWludDgsIEFMUEhBX0JMSVRfQU5ZKTsJCQlcCgkJYnJlYWs7CQkJCQkJCVwKCQkJCQkJCQkJXAoJICAgIGNhc2UgNDoJCQkJCQkJXAoJCWlmKChmbXQtPlJtYXNrIHwgZm10LT5HbWFzayB8IGZtdC0+Qm1hc2spID09IDB4MDBmZmZmZmYJXAoJCSAgICYmIChmbXQtPkdtYXNrID09IDB4ZmYwMCB8fCBmbXQtPlJtYXNrID09IDB4ZmYwMAlcCgkJICAgICAgIHx8IGZtdC0+Qm1hc2sgPT0gMHhmZjAwKSkgewkJCVwKCQkgICAgaWYoYWxwaGEgPT0gMTI4KQkJCQkJXAoJCQlibGl0dGVyKDQsIFVpbnQxNiwgQUxQSEFfQkxJVDMyXzg4OF81MCk7CVwKCQkgICAgZWxzZQkJCQkJCVwKCQkJYmxpdHRlcig0LCBVaW50MTYsIEFMUEhBX0JMSVQzMl84ODgpOwkJXAoJCX0gZWxzZQkJCQkJCQlcCgkJICAgIGJsaXR0ZXIoNCwgVWludDE2LCBBTFBIQV9CTElUX0FOWSk7CQkJXAoJCWJyZWFrOwkJCQkJCQlcCgkgICAgfQkJCQkJCQkJXAoJfQkJCQkJCQkJXAogICAgfSB3aGlsZSgwKQoKI2VuZGlmCgovKgogKiBUaGlzIHRha2VzIGNhcmUgb2YgdGhlIGNhc2Ugd2hlbiB0aGUgc3VyZmFjZSBpcyBjbGlwcGVkIG9uIHRoZSBsZWZ0IGFuZC9vcgogKiByaWdodC4gVG9wIGNsaXBwaW5nIGhhcyBhbHJlYWR5IGJlZW4gdGFrZW4gY2FyZSBvZi4KICovCnN0YXRpYyB2b2lkIFJMRUNsaXBCbGl0KGludCB3LCBVaW50OCAqc3JjYnVmLCBTRExfU3VyZmFjZSAqZHN0LAoJCQlVaW50OCAqZHN0YnVmLCBTRExfUmVjdCAqc3JjcmVjdCwgdW5zaWduZWQgYWxwaGEpCnsKICAgIFNETF9QaXhlbEZvcm1hdCAqZm10ID0gZHN0LT5mb3JtYXQ7CgojZGVmaW5lIFJMRUNMSVBCTElUKGJwcCwgVHlwZSwgZG9fYmxpdCkJCQkJCSAgIFwKICAgIGRvIHsJCQkJCQkJCSAgIFwKCWludCBsaW5lY291bnQgPSBzcmNyZWN0LT5oOwkJCQkJICAgXAoJaW50IG9mcyA9IDA7CQkJCQkJCSAgIFwKCWludCBsZWZ0ID0gc3JjcmVjdC0+eDsJCQkJCQkgICBcCglpbnQgcmlnaHQgPSBsZWZ0ICsgc3JjcmVjdC0+dzsJCQkJCSAgIFwKCWRzdGJ1ZiAtPSBsZWZ0ICogYnBwOwkJCQkJCSAgIFwKCWZvcig7OykgewkJCQkJCQkgICBcCgkgICAgaW50IHJ1bjsJCQkJCQkJICAgXAoJICAgIG9mcyArPSAqKFR5cGUgKilzcmNidWY7CQkJCQkgICBcCgkgICAgcnVuID0gKChUeXBlICopc3JjYnVmKVsxXTsJCQkJCSAgIFwKCSAgICBzcmNidWYgKz0gMiAqIHNpemVvZihUeXBlKTsJCQkJCSAgIFwKCSAgICBpZihydW4pIHsJCQkJCQkJICAgXAoJCS8qIGNsaXAgdG8gbGVmdCBhbmQgcmlnaHQgYm9yZGVycyAqLwkJCSAgIFwKCQlpZihvZnMgPCByaWdodCkgewkJCQkJICAgXAoJCSAgICBpbnQgc3RhcnQgPSAwOwkJCQkJICAgXAoJCSAgICBpbnQgbGVuID0gcnVuOwkJCQkJICAgXAoJCSAgICBpbnQgc3RhcnRjb2w7CQkJCQkgICBcCgkJICAgIGlmKGxlZnQgLSBvZnMgPiAwKSB7CQkJCSAgIFwKCQkJc3RhcnQgPSBsZWZ0IC0gb2ZzOwkJCQkgICBcCgkJCWxlbiAtPSBzdGFydDsJCQkJCSAgIFwKCQkJaWYobGVuIDw9IDApCQkJCQkgICBcCgkJCSAgICBnb3RvIG5vY29weSAjIyBicHAgIyMgZG9fYmxpdDsJCSAgIFwKCQkgICAgfQkJCQkJCQkgICBcCgkJICAgIHN0YXJ0Y29sID0gb2ZzICsgc3RhcnQ7CQkJCSAgIFwKCQkgICAgaWYobGVuID4gcmlnaHQgLSBzdGFydGNvbCkJCQkJICAgXAoJCQlsZW4gPSByaWdodCAtIHN0YXJ0Y29sOwkJCQkgICBcCgkJICAgIGRvX2JsaXQoZHN0YnVmICsgc3RhcnRjb2wgKiBicHAsIHNyY2J1ZiArIHN0YXJ0ICogYnBwLCBcCgkJCSAgICBsZW4sIGJwcCwgYWxwaGEpOwkJCQkgICBcCgkJfQkJCQkJCQkgICBcCgkgICAgbm9jb3B5ICMjIGJwcCAjIyBkb19ibGl0OgkJCQkJICAgXAoJCXNyY2J1ZiArPSBydW4gKiBicHA7CQkJCQkgICBcCgkJb2ZzICs9IHJ1bjsJCQkJCQkgICBcCgkgICAgfSBlbHNlIGlmKCFvZnMpCQkJCQkJICAgXAoJCWJyZWFrOwkJCQkJCQkgICBcCgkgICAgaWYob2ZzID09IHcpIHsJCQkJCQkgICBcCgkJb2ZzID0gMDsJCQkJCQkgICBcCgkJZHN0YnVmICs9IGRzdC0+cGl0Y2g7CQkJCQkgICBcCgkJaWYoIS0tbGluZWNvdW50KQkJCQkJICAgXAoJCSAgICBicmVhazsJCQkJCQkgICBcCgkgICAgfQkJCQkJCQkJICAgXAoJfQkJCQkJCQkJICAgXAogICAgfSB3aGlsZSgwKQoKICAgIENIT09TRV9CTElUKFJMRUNMSVBCTElULCBhbHBoYSwgZm10KTsKCiN1bmRlZiBSTEVDTElQQkxJVAoKfQoKCi8qIGJsaXQgYSBjb2xvcmtleWVkIFJMRSBzdXJmYWNlICovCmludCBTRExfUkxFQmxpdChTRExfU3VyZmFjZSAqc3JjLCBTRExfUmVjdCAqc3JjcmVjdCwKCQlTRExfU3VyZmFjZSAqZHN0LCBTRExfUmVjdCAqZHN0cmVjdCkKewoJVWludDggKmRzdGJ1ZjsKCVVpbnQ4ICpzcmNidWY7CglpbnQgeCwgeTsKCWludCB3ID0gc3JjLT53OwoJdW5zaWduZWQgYWxwaGE7CgoJLyogTG9jayB0aGUgZGVzdGluYXRpb24gaWYgbmVjZXNzYXJ5ICovCglpZiAoIFNETF9NVVNUTE9DSyhkc3QpICkgewoJCWlmICggU0RMX0xvY2tTdXJmYWNlKGRzdCkgPCAwICkgewoJCQlyZXR1cm4oLTEpOwoJCX0KCX0KCgkvKiBTZXQgdXAgdGhlIHNvdXJjZSBhbmQgZGVzdGluYXRpb24gcG9pbnRlcnMgKi8KCXggPSBkc3RyZWN0LT54OwoJeSA9IGRzdHJlY3QtPnk7Cglkc3RidWYgPSAoVWludDggKilkc3QtPnBpeGVscwoJICAgICAgICAgKyB5ICogZHN0LT5waXRjaCArIHggKiBzcmMtPmZvcm1hdC0+Qnl0ZXNQZXJQaXhlbDsKCXNyY2J1ZiA9IChVaW50OCAqKXNyYy0+bWFwLT5zd19kYXRhLT5hdXhfZGF0YTsKCgl7CgkgICAgLyogc2tpcCBsaW5lcyBhdCB0aGUgdG9wIGlmIG5lY2Nlc3NhcnkgKi8KCSAgICBpbnQgdnNraXAgPSBzcmNyZWN0LT55OwoJICAgIGludCBvZnMgPSAwOwoJICAgIGlmKHZza2lwKSB7CgojZGVmaW5lIFJMRVNLSVAoYnBwLCBUeXBlKQkJCVwKCQlmb3IoOzspIHsJCQlcCgkJICAgIGludCBydW47CQkJXAoJCSAgICBvZnMgKz0gKihUeXBlICopc3JjYnVmOwlcCgkJICAgIHJ1biA9ICgoVHlwZSAqKXNyY2J1ZilbMV07CVwKCQkgICAgc3JjYnVmICs9IHNpemVvZihUeXBlKSAqIDI7CVwKCQkgICAgaWYocnVuKSB7CQkJXAoJCQlzcmNidWYgKz0gcnVuICogYnBwOwlcCgkJCW9mcyArPSBydW47CQlcCgkJICAgIH0gZWxzZSBpZighb2ZzKQkJXAoJCQlnb3RvIGRvbmU7CQlcCgkJICAgIGlmKG9mcyA9PSB3KSB7CQlcCgkJCW9mcyA9IDA7CQlcCgkJCWlmKCEtLXZza2lwKQkJXAoJCQkgICAgYnJlYWs7CQlcCgkJICAgIH0JCQkJXAoJCX0KCgkJc3dpdGNoKHNyYy0+Zm9ybWF0LT5CeXRlc1BlclBpeGVsKSB7CgkJY2FzZSAxOiBSTEVTS0lQKDEsIFVpbnQ4KTsgYnJlYWs7CgkJY2FzZSAyOiBSTEVTS0lQKDIsIFVpbnQ4KTsgYnJlYWs7CgkJY2FzZSAzOiBSTEVTS0lQKDMsIFVpbnQ4KTsgYnJlYWs7CgkJY2FzZSA0OiBSTEVTS0lQKDQsIFVpbnQxNik7IGJyZWFrOwoJCX0KCiN1bmRlZiBSTEVTS0lQCgoJICAgIH0KCX0KCglhbHBoYSA9IChzcmMtPmZsYWdzICYgU0RMX1NSQ0FMUEhBKSA9PSBTRExfU1JDQUxQSEEKCSAgICAgICAgPyBzcmMtPmZvcm1hdC0+YWxwaGEgOiAyNTU7CgkvKiBpZiBsZWZ0IG9yIHJpZ2h0IGVkZ2UgY2xpcHBpbmcgbmVlZGVkLCBjYWxsIGNsaXAgYmxpdCAqLwoJaWYgKCBzcmNyZWN0LT54IHx8IHNyY3JlY3QtPncgIT0gc3JjLT53ICkgewoJICAgIFJMRUNsaXBCbGl0KHcsIHNyY2J1ZiwgZHN0LCBkc3RidWYsIHNyY3JlY3QsIGFscGhhKTsKCX0gZWxzZSB7CgkgICAgU0RMX1BpeGVsRm9ybWF0ICpmbXQgPSBzcmMtPmZvcm1hdDsKCiNkZWZpbmUgUkxFQkxJVChicHAsIFR5cGUsIGRvX2JsaXQpCQkJCQkgICAgICBcCgkgICAgZG8gewkJCQkJCQkgICAgICBcCgkJaW50IGxpbmVjb3VudCA9IHNyY3JlY3QtPmg7CQkJCSAgICAgIFwKCQlpbnQgb2ZzID0gMDsJCQkJCQkgICAgICBcCgkJZm9yKDs7KSB7CQkJCQkJICAgICAgXAoJCSAgICB1bnNpZ25lZCBydW47CQkJCQkgICAgICBcCgkJICAgIG9mcyArPSAqKFR5cGUgKilzcmNidWY7CQkJCSAgICAgIFwKCQkgICAgcnVuID0gKChUeXBlICopc3JjYnVmKVsxXTsJCQkJICAgICAgXAoJCSAgICBzcmNidWYgKz0gMiAqIHNpemVvZihUeXBlKTsJCQkJICAgICAgXAoJCSAgICBpZihydW4pIHsJCQkJCQkgICAgICBcCgkJCWRvX2JsaXQoZHN0YnVmICsgb2ZzICogYnBwLCBzcmNidWYsIHJ1biwgYnBwLCBhbHBoYSk7IFwKCQkJc3JjYnVmICs9IHJ1biAqIGJwcDsJCQkJICAgICAgXAoJCQlvZnMgKz0gcnVuOwkJCQkJICAgICAgXAoJCSAgICB9IGVsc2UgaWYoIW9mcykJCQkJCSAgICAgIFwKCQkJYnJlYWs7CQkJCQkJICAgICAgXAoJCSAgICBpZihvZnMgPT0gdykgewkJCQkJICAgICAgXAoJCQlvZnMgPSAwOwkJCQkJICAgICAgXAoJCQlkc3RidWYgKz0gZHN0LT5waXRjaDsJCQkJICAgICAgXAoJCQlpZighLS1saW5lY291bnQpCQkJCSAgICAgIFwKCQkJICAgIGJyZWFrOwkJCQkJICAgICAgXAoJCSAgICB9CQkJCQkJCSAgICAgIFwKCQl9CQkJCQkJCSAgICAgIFwKCSAgICB9IHdoaWxlKDApCgoJICAgIENIT09TRV9CTElUKFJMRUJMSVQsIGFscGhhLCBmbXQpOwoKI3VuZGVmIFJMRUJMSVQKCX0KCmRvbmU6CgkvKiBVbmxvY2sgdGhlIGRlc3RpbmF0aW9uIGlmIG5lY2Vzc2FyeSAqLwoJaWYgKCBTRExfTVVTVExPQ0soZHN0KSApIHsKCQlTRExfVW5sb2NrU3VyZmFjZShkc3QpOwoJfQoJcmV0dXJuKDApOwp9CgojdW5kZWYgT1BBUVVFX0JMSVQKCi8qCiAqIFBlci1waXhlbCBibGl0dGluZyBtYWNyb3MgZm9yIHRyYW5zbHVjZW50IHBpeGVsczoKICogVGhlc2UgdXNlIHRoZSBzYW1lIHRlY2huaXF1ZXMgYXMgdGhlIHBlci1zdXJmYWNlIGJsaXR0aW5nIG1hY3JvcwogKi8KCi8qCiAqIEZvciAzMmJwcCBwaXhlbHMsIHdlIGhhdmUgbWFkZSBzdXJlIHRoZSBhbHBoYSBpcyBzdG9yZWQgaW4gdGhlIHRvcAogKiA4IGJpdHMsIHNvIHByb2NlZWQgYXMgdXN1YWwKICovCiNkZWZpbmUgQkxJVF9UUkFOU0xfODg4KHNyYywgZHN0KQkJCQlcCiAgICBkbyB7CQkJCQkJCVwKICAgICAgICBVaW50MzIgcyA9IHNyYzsJCQkJCQlcCglVaW50MzIgZCA9IGRzdDsJCQkJCQlcCgl1bnNpZ25lZCBhbHBoYSA9IHMgPj4gMjQ7CQkJCVwKCVVpbnQzMiBzMSA9IHMgJiAweGZmMDBmZjsJCQkJXAoJVWludDMyIGQxID0gZCAmIDB4ZmYwMGZmOwkJCQlcCglkMSA9IChkMSArICgoczEgLSBkMSkgKiBhbHBoYSA+PiA4KSkgJiAweGZmMDBmZjsJXAoJcyAmPSAweGZmMDA7CQkJCQkJXAoJZCAmPSAweGZmMDA7CQkJCQkJXAoJZCA9IChkICsgKChzIC0gZCkgKiBhbHBoYSA+PiA4KSkgJiAweGZmMDA7CQlcCglkc3QgPSBkMSB8IGQ7CQkJCQkJXAogICAgfSB3aGlsZSgwKQoKLyoKICogRm9yIDE2YnBwIHBpeGVscywgd2UgaGF2ZSBzdG9yZWQgdGhlIDUgbW9zdCBzaWduaWZpY2FudCBhbHBoYSBiaXRzIGluCiAqIGJpdHMgNS0xMC4gQXMgYmVmb3JlLCB3ZSBjYW4gcHJvY2VzcyBhbGwgMyBSR0IgY29tcG9uZW50cyBhdCB0aGUgc2FtZSB0aW1lLgogKi8KI2RlZmluZSBCTElUX1RSQU5TTF81NjUoc3JjLCBkc3QpCQlcCiAgICBkbyB7CQkJCQlcCglVaW50MzIgcyA9IHNyYzsJCQkJXAoJVWludDMyIGQgPSBkc3Q7CQkJCVwKCXVuc2lnbmVkIGFscGhhID0gKHMgJiAweDNlMCkgPj4gNTsJXAoJcyAmPSAweDA3ZTBmODFmOwkJCVwKCWQgPSAoZCB8IGQgPDwgMTYpICYgMHgwN2UwZjgxZjsJCVwKCWQgKz0gKHMgLSBkKSAqIGFscGhhID4+IDU7CQlcCglkICY9IDB4MDdlMGY4MWY7CQkJXAoJZHN0ID0gKFVpbnQxNikoZCB8IGQgPj4gMTYpOwkJCVwKICAgIH0gd2hpbGUoMCkKCiNkZWZpbmUgQkxJVF9UUkFOU0xfNTU1KHNyYywgZHN0KQkJXAogICAgZG8gewkJCQkJXAoJVWludDMyIHMgPSBzcmM7CQkJCVwKCVVpbnQzMiBkID0gZHN0OwkJCQlcCgl1bnNpZ25lZCBhbHBoYSA9IChzICYgMHgzZTApID4+IDU7CVwKCXMgJj0gMHgwM2UwN2MxZjsJCQlcCglkID0gKGQgfCBkIDw8IDE2KSAmIDB4MDNlMDdjMWY7CQlcCglkICs9IChzIC0gZCkgKiBhbHBoYSA+PiA1OwkJXAoJZCAmPSAweDAzZTA3YzFmOwkJCVwKCWRzdCA9IChVaW50MTYpKGQgfCBkID4+IDE2KTsJCQlcCiAgICB9IHdoaWxlKDApCgovKiB1c2VkIHRvIHNhdmUgdGhlIGRlc3RpbmF0aW9uIGZvcm1hdCBpbiB0aGUgZW5jb2RpbmcuIERlc2lnbmVkIHRvIGJlCiAgIG1hY3JvLWNvbXBhdGlibGUgd2l0aCBTRExfUGl4ZWxGb3JtYXQgYnV0IHdpdGhvdXQgdGhlIHVubmVlZGVkIGZpZWxkcyAqLwp0eXBlZGVmIHN0cnVjdCB7CglVaW50OCAgQnl0ZXNQZXJQaXhlbDsKCVVpbnQ4ICBSbG9zczsKCVVpbnQ4ICBHbG9zczsKCVVpbnQ4ICBCbG9zczsKCVVpbnQ4ICBSc2hpZnQ7CglVaW50OCAgR3NoaWZ0OwoJVWludDggIEJzaGlmdDsKCVVpbnQ4ICBBc2hpZnQ7CglVaW50MzIgUm1hc2s7CglVaW50MzIgR21hc2s7CglVaW50MzIgQm1hc2s7CglVaW50MzIgQW1hc2s7Cn0gUkxFRGVzdEZvcm1hdDsKCi8qIGJsaXQgYSBwaXhlbC1hbHBoYSBSTEUgc3VyZmFjZSBjbGlwcGVkIGF0IHRoZSByaWdodCBhbmQvb3IgbGVmdCBlZGdlcyAqLwpzdGF0aWMgdm9pZCBSTEVBbHBoYUNsaXBCbGl0KGludCB3LCBVaW50OCAqc3JjYnVmLCBTRExfU3VyZmFjZSAqZHN0LAoJCQkgICAgIFVpbnQ4ICpkc3RidWYsIFNETF9SZWN0ICpzcmNyZWN0KQp7CiAgICBTRExfUGl4ZWxGb3JtYXQgKmRmID0gZHN0LT5mb3JtYXQ7CiAgICAvKgogICAgICogY2xpcHBlZCBibGl0dGVyOiBQdHlwZSBpcyB0aGUgZGVzdGluYXRpb24gcGl4ZWwgdHlwZSwKICAgICAqIEN0eXBlIHRoZSB0cmFuc2x1Y2VudCBjb3VudCB0eXBlLCBhbmQgZG9fYmxlbmQgdGhlIG1hY3JvCiAgICAgKiB0byBibGVuZCBvbmUgcGl4ZWwuCiAgICAgKi8KI2RlZmluZSBSTEVBTFBIQUNMSVBCTElUKFB0eXBlLCBDdHlwZSwgZG9fYmxlbmQpCQkJICBcCiAgICBkbyB7CQkJCQkJCQkgIFwKCWludCBsaW5lY291bnQgPSBzcmNyZWN0LT5oOwkJCQkJICBcCglpbnQgbGVmdCA9IHNyY3JlY3QtPng7CQkJCQkJICBcCglpbnQgcmlnaHQgPSBsZWZ0ICsgc3JjcmVjdC0+dzsJCQkJCSAgXAoJZHN0YnVmIC09IGxlZnQgKiBzaXplb2YoUHR5cGUpOwkJCQkJICBcCglkbyB7CQkJCQkJCQkgIFwKCSAgICBpbnQgb2ZzID0gMDsJCQkJCQkgIFwKCSAgICAvKiBibGl0IG9wYXF1ZSBwaXhlbHMgb24gb25lIGxpbmUgKi8JCQkgIFwKCSAgICBkbyB7CQkJCQkJCSAgXAoJCXVuc2lnbmVkIHJ1bjsJCQkJCQkgIFwKCQlvZnMgKz0gKChDdHlwZSAqKXNyY2J1ZilbMF07CQkJCSAgXAoJCXJ1biA9ICgoQ3R5cGUgKilzcmNidWYpWzFdOwkJCQkgIFwKCQlzcmNidWYgKz0gMiAqIHNpemVvZihDdHlwZSk7CQkJCSAgXAoJCWlmKHJ1bikgewkJCQkJCSAgXAoJCSAgICAvKiBjbGlwIHRvIGxlZnQgYW5kIHJpZ2h0IGJvcmRlcnMgKi8JCSAgXAoJCSAgICBpbnQgY29mcyA9IG9mczsJCQkJCSAgXAoJCSAgICBpbnQgY3J1biA9IHJ1bjsJCQkJCSAgXAoJCSAgICBpZihsZWZ0IC0gY29mcyA+IDApIHsJCQkJICBcCgkJCWNydW4gLT0gbGVmdCAtIGNvZnM7CQkJCSAgXAoJCQljb2ZzID0gbGVmdDsJCQkJCSAgXAoJCSAgICB9CQkJCQkJCSAgXAoJCSAgICBpZihjcnVuID4gcmlnaHQgLSBjb2ZzKQkJCQkgIFwKCQkJY3J1biA9IHJpZ2h0IC0gY29mczsJCQkJICBcCgkJICAgIGlmKGNydW4gPiAwKQkJCQkJICBcCgkJCVBJWEVMX0NPUFkoZHN0YnVmICsgY29mcyAqIHNpemVvZihQdHlwZSksCSAgXAoJCQkJICAgc3JjYnVmICsgKGNvZnMgLSBvZnMpICogc2l6ZW9mKFB0eXBlKSwgXAoJCQkJICAgKHVuc2lnbmVkKWNydW4sIHNpemVvZihQdHlwZSkpOwkgIFwKCQkgICAgc3JjYnVmICs9IHJ1biAqIHNpemVvZihQdHlwZSk7CQkJICBcCgkJICAgIG9mcyArPSBydW47CQkJCQkJICBcCgkJfSBlbHNlIGlmKCFvZnMpCQkJCQkJICBcCgkJICAgIHJldHVybjsJCQkJCQkgIFwKCSAgICB9IHdoaWxlKG9mcyA8IHcpOwkJCQkJCSAgXAoJICAgIC8qIHNraXAgcGFkZGluZyBpZiBuZWNlc3NhcnkgKi8JCQkJICBcCgkgICAgaWYoc2l6ZW9mKFB0eXBlKSA9PSAyKQkJCQkJICBcCgkJc3JjYnVmICs9ICh1aW50cHRyX3Qpc3JjYnVmICYgMjsJCQkgIFwKCSAgICAvKiBibGl0IHRyYW5zbHVjZW50IHBpeGVscyBvbiB0aGUgc2FtZSBsaW5lICovCQkgIFwKCSAgICBvZnMgPSAwOwkJCQkJCQkgIFwKCSAgICBkbyB7CQkJCQkJCSAgXAoJCXVuc2lnbmVkIHJ1bjsJCQkJCQkgIFwKCQlvZnMgKz0gKChVaW50MTYgKilzcmNidWYpWzBdOwkJCQkgIFwKCQlydW4gPSAoKFVpbnQxNiAqKXNyY2J1ZilbMV07CQkJCSAgXAoJCXNyY2J1ZiArPSA0OwkJCQkJCSAgXAoJCWlmKHJ1bikgewkJCQkJCSAgXAoJCSAgICAvKiBjbGlwIHRvIGxlZnQgYW5kIHJpZ2h0IGJvcmRlcnMgKi8JCSAgXAoJCSAgICBpbnQgY29mcyA9IG9mczsJCQkJCSAgXAoJCSAgICBpbnQgY3J1biA9IHJ1bjsJCQkJCSAgXAoJCSAgICBpZihsZWZ0IC0gY29mcyA+IDApIHsJCQkJICBcCgkJCWNydW4gLT0gbGVmdCAtIGNvZnM7CQkJCSAgXAoJCQljb2ZzID0gbGVmdDsJCQkJCSAgXAoJCSAgICB9CQkJCQkJCSAgXAoJCSAgICBpZihjcnVuID4gcmlnaHQgLSBjb2ZzKQkJCQkgIFwKCQkJY3J1biA9IHJpZ2h0IC0gY29mczsJCQkJICBcCgkJICAgIGlmKGNydW4gPiAwKSB7CQkJCQkgIFwKCQkJUHR5cGUgKmRzdCA9IChQdHlwZSAqKWRzdGJ1ZiArIGNvZnM7CQkgIFwKCQkJVWludDMyICpzcmMgPSAoVWludDMyICopc3JjYnVmICsgKGNvZnMgLSBvZnMpOwkgIFwKCQkJaW50IGk7CQkJCQkJICBcCgkJCWZvcihpID0gMDsgaSA8IGNydW47IGkrKykJCQkgIFwKCQkJICAgIGRvX2JsZW5kKHNyY1tpXSwgZHN0W2ldKTsJCQkgIFwKCQkgICAgfQkJCQkJCQkgIFwKCQkgICAgc3JjYnVmICs9IHJ1biAqIDQ7CQkJCQkgIFwKCQkgICAgb2ZzICs9IHJ1bjsJCQkJCQkgIFwKCQl9CQkJCQkJCSAgXAoJICAgIH0gd2hpbGUob2ZzIDwgdyk7CQkJCQkJICBcCgkgICAgZHN0YnVmICs9IGRzdC0+cGl0Y2g7CQkJCQkgIFwKCX0gd2hpbGUoLS1saW5lY291bnQpOwkJCQkJCSAgXAogICAgfSB3aGlsZSgwKQoKICAgIHN3aXRjaChkZi0+Qnl0ZXNQZXJQaXhlbCkgewogICAgY2FzZSAyOgoJaWYoZGYtPkdtYXNrID09IDB4MDdlMCB8fCBkZi0+Um1hc2sgPT0gMHgwN2UwCgkgICB8fCBkZi0+Qm1hc2sgPT0gMHgwN2UwKQoJICAgIFJMRUFMUEhBQ0xJUEJMSVQoVWludDE2LCBVaW50OCwgQkxJVF9UUkFOU0xfNTY1KTsKCWVsc2UKCSAgICBSTEVBTFBIQUNMSVBCTElUKFVpbnQxNiwgVWludDgsIEJMSVRfVFJBTlNMXzU1NSk7CglicmVhazsKICAgIGNhc2UgNDoKCVJMRUFMUEhBQ0xJUEJMSVQoVWludDMyLCBVaW50MTYsIEJMSVRfVFJBTlNMXzg4OCk7CglicmVhazsKICAgIH0KfQoKLyogYmxpdCBhIHBpeGVsLWFscGhhIFJMRSBzdXJmYWNlICovCmludCBTRExfUkxFQWxwaGFCbGl0KFNETF9TdXJmYWNlICpzcmMsIFNETF9SZWN0ICpzcmNyZWN0LAoJCSAgICAgU0RMX1N1cmZhY2UgKmRzdCwgU0RMX1JlY3QgKmRzdHJlY3QpCnsKICAgIGludCB4LCB5OwogICAgaW50IHcgPSBzcmMtPnc7CiAgICBVaW50OCAqc3JjYnVmLCAqZHN0YnVmOwogICAgU0RMX1BpeGVsRm9ybWF0ICpkZiA9IGRzdC0+Zm9ybWF0OwoKICAgIC8qIExvY2sgdGhlIGRlc3RpbmF0aW9uIGlmIG5lY2Vzc2FyeSAqLwogICAgaWYgKCBTRExfTVVTVExPQ0soZHN0KSApIHsKCWlmICggU0RMX0xvY2tTdXJmYWNlKGRzdCkgPCAwICkgewoJICAgIHJldHVybiAtMTsKCX0KICAgIH0KCiAgICB4ID0gZHN0cmVjdC0+eDsKICAgIHkgPSBkc3RyZWN0LT55OwogICAgZHN0YnVmID0gKFVpbnQ4ICopZHN0LT5waXhlbHMKCSAgICAgKyB5ICogZHN0LT5waXRjaCArIHggKiBkZi0+Qnl0ZXNQZXJQaXhlbDsKICAgIHNyY2J1ZiA9IChVaW50OCAqKXNyYy0+bWFwLT5zd19kYXRhLT5hdXhfZGF0YSArIHNpemVvZihSTEVEZXN0Rm9ybWF0KTsKCiAgICB7CgkvKiBza2lwIGxpbmVzIGF0IHRoZSB0b3AgaWYgbmVjZXNzYXJ5ICovCglpbnQgdnNraXAgPSBzcmNyZWN0LT55OwoJaWYodnNraXApIHsKCSAgICBpbnQgb2ZzOwoJICAgIGlmKGRmLT5CeXRlc1BlclBpeGVsID09IDIpIHsKCQkvKiB0aGUgMTYvMzIgaW50ZXJsZWF2ZWQgZm9ybWF0ICovCgkJZG8gewoJCSAgICAvKiBza2lwIG9wYXF1ZSBsaW5lICovCgkJICAgIG9mcyA9IDA7CgkJICAgIGRvIHsKCQkJaW50IHJ1bjsKCQkJb2ZzICs9IHNyY2J1ZlswXTsKCQkJcnVuID0gc3JjYnVmWzFdOwoJCQlzcmNidWYgKz0gMjsKCQkJaWYocnVuKSB7CgkJCSAgICBzcmNidWYgKz0gMiAqIHJ1bjsKCQkJICAgIG9mcyArPSBydW47CgkJCX0gZWxzZSBpZighb2ZzKQoJCQkgICAgZ290byBkb25lOwoJCSAgICB9IHdoaWxlKG9mcyA8IHcpOwoKCQkgICAgLyogc2tpcCBwYWRkaW5nICovCgkJICAgIHNyY2J1ZiArPSAodWludHB0cl90KXNyY2J1ZiAmIDI7CgoJCSAgICAvKiBza2lwIHRyYW5zbHVjZW50IGxpbmUgKi8KCQkgICAgb2ZzID0gMDsKCQkgICAgZG8gewoJCQlpbnQgcnVuOwoJCQlvZnMgKz0gKChVaW50MTYgKilzcmNidWYpWzBdOwoJCQlydW4gPSAoKFVpbnQxNiAqKXNyY2J1ZilbMV07CgkJCXNyY2J1ZiArPSA0ICogKHJ1biArIDEpOwoJCQlvZnMgKz0gcnVuOwoJCSAgICB9IHdoaWxlKG9mcyA8IHcpOwoJCX0gd2hpbGUoLS12c2tpcCk7CgkgICAgfSBlbHNlIHsKCQkvKiB0aGUgMzIvMzIgaW50ZXJsZWF2ZWQgZm9ybWF0ICovCgkJdnNraXAgPDw9IDE7CS8qIG9wYXF1ZSBhbmQgdHJhbnNsdWNlbnQgaGF2ZSBzYW1lIGZvcm1hdCAqLwoJCWRvIHsKCQkgICAgb2ZzID0gMDsKCQkgICAgZG8gewoJCQlpbnQgcnVuOwoJCQlvZnMgKz0gKChVaW50MTYgKilzcmNidWYpWzBdOwoJCQlydW4gPSAoKFVpbnQxNiAqKXNyY2J1ZilbMV07CgkJCXNyY2J1ZiArPSA0OwoJCQlpZihydW4pIHsKCQkJICAgIHNyY2J1ZiArPSA0ICogcnVuOwoJCQkgICAgb2ZzICs9IHJ1bjsKCQkJfSBlbHNlIGlmKCFvZnMpCgkJCSAgICBnb3RvIGRvbmU7CgkJICAgIH0gd2hpbGUob2ZzIDwgdyk7CgkJfSB3aGlsZSgtLXZza2lwKTsKCSAgICB9Cgl9CiAgICB9CgogICAgLyogaWYgbGVmdCBvciByaWdodCBlZGdlIGNsaXBwaW5nIG5lZWRlZCwgY2FsbCBjbGlwIGJsaXQgKi8KICAgIGlmKHNyY3JlY3QtPnggfHwgc3JjcmVjdC0+dyAhPSBzcmMtPncpIHsKCVJMRUFscGhhQ2xpcEJsaXQodywgc3JjYnVmLCBkc3QsIGRzdGJ1Ziwgc3JjcmVjdCk7CiAgICB9IGVsc2UgewoKCS8qCgkgKiBub24tY2xpcHBlZCBibGl0dGVyLiBQdHlwZSBpcyB0aGUgZGVzdGluYXRpb24gcGl4ZWwgdHlwZSwKCSAqIEN0eXBlIHRoZSB0cmFuc2x1Y2VudCBjb3VudCB0eXBlLCBhbmQgZG9fYmxlbmQgdGhlCgkgKiBtYWNybyB0byBibGVuZCBvbmUgcGl4ZWwuCgkgKi8KI2RlZmluZSBSTEVBTFBIQUJMSVQoUHR5cGUsIEN0eXBlLCBkb19ibGVuZCkJCQkJIFwKCWRvIHsJCQkJCQkJCSBcCgkgICAgaW50IGxpbmVjb3VudCA9IHNyY3JlY3QtPmg7CQkJCQkgXAoJICAgIGRvIHsJCQkJCQkJIFwKCQlpbnQgb2ZzID0gMDsJCQkJCQkgXAoJCS8qIGJsaXQgb3BhcXVlIHBpeGVscyBvbiBvbmUgbGluZSAqLwkJCSBcCgkJZG8gewkJCQkJCQkgXAoJCSAgICB1bnNpZ25lZCBydW47CQkJCQkgXAoJCSAgICBvZnMgKz0gKChDdHlwZSAqKXNyY2J1ZilbMF07CQkJIFwKCQkgICAgcnVuID0gKChDdHlwZSAqKXNyY2J1ZilbMV07CQkJCSBcCgkJICAgIHNyY2J1ZiArPSAyICogc2l6ZW9mKEN0eXBlKTsJCQkgXAoJCSAgICBpZihydW4pIHsJCQkJCQkgXAoJCQlQSVhFTF9DT1BZKGRzdGJ1ZiArIG9mcyAqIHNpemVvZihQdHlwZSksIHNyY2J1ZiwgXAoJCQkJICAgcnVuLCBzaXplb2YoUHR5cGUpKTsJCQkgXAoJCQlzcmNidWYgKz0gcnVuICogc2l6ZW9mKFB0eXBlKTsJCQkgXAoJCQlvZnMgKz0gcnVuOwkJCQkJIFwKCQkgICAgfSBlbHNlIGlmKCFvZnMpCQkJCQkgXAoJCQlnb3RvIGRvbmU7CQkJCQkgXAoJCX0gd2hpbGUob2ZzIDwgdyk7CQkJCQkgXAoJCS8qIHNraXAgcGFkZGluZyBpZiBuZWNlc3NhcnkgKi8JCQkJIFwKCQlpZihzaXplb2YoUHR5cGUpID09IDIpCQkJCQkgXAoJCSAgICBzcmNidWYgKz0gKHVpbnRwdHJfdClzcmNidWYgJiAyOwkJIAkgXAoJCS8qIGJsaXQgdHJhbnNsdWNlbnQgcGl4ZWxzIG9uIHRoZSBzYW1lIGxpbmUgKi8JCSBcCgkJb2ZzID0gMDsJCQkJCQkgXAoJCWRvIHsJCQkJCQkJIFwKCQkgICAgdW5zaWduZWQgcnVuOwkJCQkJIFwKCQkgICAgb2ZzICs9ICgoVWludDE2ICopc3JjYnVmKVswXTsJCQkgXAoJCSAgICBydW4gPSAoKFVpbnQxNiAqKXNyY2J1ZilbMV07CQkJIFwKCQkgICAgc3JjYnVmICs9IDQ7CQkJCQkgXAoJCSAgICBpZihydW4pIHsJCQkJCQkgXAoJCQlQdHlwZSAqZHN0ID0gKFB0eXBlICopZHN0YnVmICsgb2ZzOwkJIFwKCQkJdW5zaWduZWQgaTsJCQkJCSBcCgkJCWZvcihpID0gMDsgaSA8IHJ1bjsgaSsrKSB7CQkJIFwKCQkJICAgIFVpbnQzMiBzcmMgPSAqKFVpbnQzMiAqKXNyY2J1ZjsJCSBcCgkJCSAgICBkb19ibGVuZChzcmMsICpkc3QpOwkJCSBcCgkJCSAgICBzcmNidWYgKz0gNDsJCQkJIFwKCQkJICAgIGRzdCsrOwkJCQkJIFwKCQkJfQkJCQkJCSBcCgkJCW9mcyArPSBydW47CQkJCQkgXAoJCSAgICB9CQkJCQkJCSBcCgkJfSB3aGlsZShvZnMgPCB3KTsJCQkJCSBcCgkJZHN0YnVmICs9IGRzdC0+cGl0Y2g7CQkJCQkgXAoJICAgIH0gd2hpbGUoLS1saW5lY291bnQpOwkJCQkJIFwKCX0gd2hpbGUoMCkKCglzd2l0Y2goZGYtPkJ5dGVzUGVyUGl4ZWwpIHsKCWNhc2UgMjoKCSAgICBpZihkZi0+R21hc2sgPT0gMHgwN2UwIHx8IGRmLT5SbWFzayA9PSAweDA3ZTAKCSAgICAgICB8fCBkZi0+Qm1hc2sgPT0gMHgwN2UwKQoJCVJMRUFMUEhBQkxJVChVaW50MTYsIFVpbnQ4LCBCTElUX1RSQU5TTF81NjUpOwoJICAgIGVsc2UKCQlSTEVBTFBIQUJMSVQoVWludDE2LCBVaW50OCwgQkxJVF9UUkFOU0xfNTU1KTsKCSAgICBicmVhazsKCWNhc2UgNDoKCSAgICBSTEVBTFBIQUJMSVQoVWludDMyLCBVaW50MTYsIEJMSVRfVFJBTlNMXzg4OCk7CgkgICAgYnJlYWs7Cgl9CiAgICB9CgogZG9uZToKICAgIC8qIFVubG9jayB0aGUgZGVzdGluYXRpb24gaWYgbmVjZXNzYXJ5ICovCiAgICBpZiAoIFNETF9NVVNUTE9DSyhkc3QpICkgewoJU0RMX1VubG9ja1N1cmZhY2UoZHN0KTsKICAgIH0KICAgIHJldHVybiAwOwp9CgovKgogKiBBdXhpbGlhcnkgZnVuY3Rpb25zOgogKiBUaGUgZW5jb2RpbmcgZnVuY3Rpb25zIHRha2UgMzJicHAgcmdiICsgYSwgYW5kCiAqIHJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIGNvcGllZCB0byB0aGUgZGVzdGluYXRpb24uCiAqIFRoZSBkZWNvZGluZyBmdW5jdGlvbnMgY29weSB0byAzMmJwcCByZ2IgKyBhLCBhbmQKICogcmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgY29waWVkIGZyb20gdGhlIHNvdXJjZS4KICogVGhlc2UgYXJlIG9ubHkgdXNlZCBpbiB0aGUgZW5jb2RlciBhbmQgdW4tUkxFIGNvZGUgYW5kIGFyZSB0aGVyZWZvcmUgbm90CiAqIGhpZ2hseSBvcHRpbWlzZWQuCiAqLwoKLyogZW5jb2RlIDMyYnBwIHJnYiArIGEgaW50byAxNmJwcCByZ2IsIGxvc2luZyBhbHBoYSAqLwpzdGF0aWMgaW50IGNvcHlfb3BhcXVlXzE2KHZvaWQgKmRzdCwgVWludDMyICpzcmMsIGludCBuLAoJCQkgIFNETF9QaXhlbEZvcm1hdCAqc2ZtdCwgU0RMX1BpeGVsRm9ybWF0ICpkZm10KQp7CiAgICBpbnQgaTsKICAgIFVpbnQxNiAqZCA9IGRzdDsKICAgIGZvcihpID0gMDsgaSA8IG47IGkrKykgewoJdW5zaWduZWQgciwgZywgYjsKCVJHQl9GUk9NX1BJWEVMKCpzcmMsIHNmbXQsIHIsIGcsIGIpOwoJUElYRUxfRlJPTV9SR0IoKmQsIGRmbXQsIHIsIGcsIGIpOwoJc3JjKys7CglkKys7CiAgICB9CiAgICByZXR1cm4gbiAqIDI7Cn0KCi8qIGRlY29kZSBvcGFxdWUgcGl4ZWxzIGZyb20gMTZicHAgdG8gMzJicHAgcmdiICsgYSAqLwpzdGF0aWMgaW50IHVuY29weV9vcGFxdWVfMTYoVWludDMyICpkc3QsIHZvaWQgKnNyYywgaW50IG4sCgkJCSAgICBSTEVEZXN0Rm9ybWF0ICpzZm10LCBTRExfUGl4ZWxGb3JtYXQgKmRmbXQpCnsKICAgIGludCBpOwogICAgVWludDE2ICpzID0gc3JjOwogICAgdW5zaWduZWQgYWxwaGEgPSBkZm10LT5BbWFzayA/IDI1NSA6IDA7CiAgICBmb3IoaSA9IDA7IGkgPCBuOyBpKyspIHsKCXVuc2lnbmVkIHIsIGcsIGI7CglSR0JfRlJPTV9QSVhFTCgqcywgc2ZtdCwgciwgZywgYik7CglQSVhFTF9GUk9NX1JHQkEoKmRzdCwgZGZtdCwgciwgZywgYiwgYWxwaGEpOwoJcysrOwoJZHN0Kys7CiAgICB9CiAgICByZXR1cm4gbiAqIDI7Cn0KCgoKLyogZW5jb2RlIDMyYnBwIHJnYiArIGEgaW50byAzMmJwcCBHMFJBQiBmb3JtYXQgZm9yIGJsaXR0aW5nIGludG8gNTY1ICovCnN0YXRpYyBpbnQgY29weV90cmFuc2xfNTY1KHZvaWQgKmRzdCwgVWludDMyICpzcmMsIGludCBuLAoJCQkgICBTRExfUGl4ZWxGb3JtYXQgKnNmbXQsIFNETF9QaXhlbEZvcm1hdCAqZGZtdCkKewogICAgaW50IGk7CiAgICBVaW50MzIgKmQgPSBkc3Q7CiAgICBmb3IoaSA9IDA7IGkgPCBuOyBpKyspIHsKCXVuc2lnbmVkIHIsIGcsIGIsIGE7CglVaW50MTYgcGl4OwoJUkdCQV9GUk9NXzg4ODgoKnNyYywgc2ZtdCwgciwgZywgYiwgYSk7CglQSVhFTF9GUk9NX1JHQihwaXgsIGRmbXQsIHIsIGcsIGIpOwoJKmQgPSAoKHBpeCAmIDB4N2UwKSA8PCAxNikgfCAocGl4ICYgMHhmODFmKSB8ICgoYSA8PCAyKSAmIDB4N2UwKTsKCXNyYysrOwoJZCsrOwogICAgfQogICAgcmV0dXJuIG4gKiA0Owp9CgovKiBlbmNvZGUgMzJicHAgcmdiICsgYSBpbnRvIDMyYnBwIEcwUkFCIGZvcm1hdCBmb3IgYmxpdHRpbmcgaW50byA1NTUgKi8Kc3RhdGljIGludCBjb3B5X3RyYW5zbF81NTUodm9pZCAqZHN0LCBVaW50MzIgKnNyYywgaW50IG4sCgkJCSAgIFNETF9QaXhlbEZvcm1hdCAqc2ZtdCwgU0RMX1BpeGVsRm9ybWF0ICpkZm10KQp7CiAgICBpbnQgaTsKICAgIFVpbnQzMiAqZCA9IGRzdDsKICAgIGZvcihpID0gMDsgaSA8IG47IGkrKykgewoJdW5zaWduZWQgciwgZywgYiwgYTsKCVVpbnQxNiBwaXg7CglSR0JBX0ZST01fODg4OCgqc3JjLCBzZm10LCByLCBnLCBiLCBhKTsKCVBJWEVMX0ZST01fUkdCKHBpeCwgZGZtdCwgciwgZywgYik7CgkqZCA9ICgocGl4ICYgMHgzZTApIDw8IDE2KSB8IChwaXggJiAweGZjMWYpIHwgKChhIDw8IDIpICYgMHgzZTApOwoJc3JjKys7CglkKys7CiAgICB9CiAgICByZXR1cm4gbiAqIDQ7Cn0KCi8qIGRlY29kZSB0cmFuc2x1Y2VudCBwaXhlbHMgZnJvbSAzMmJwcCBHT1JBQiB0byAzMmJwcCByZ2IgKyBhICovCnN0YXRpYyBpbnQgdW5jb3B5X3RyYW5zbF8xNihVaW50MzIgKmRzdCwgdm9pZCAqc3JjLCBpbnQgbiwKCQkJICAgIFJMRURlc3RGb3JtYXQgKnNmbXQsIFNETF9QaXhlbEZvcm1hdCAqZGZtdCkKewogICAgaW50IGk7CiAgICBVaW50MzIgKnMgPSBzcmM7CiAgICBmb3IoaSA9IDA7IGkgPCBuOyBpKyspIHsKCXVuc2lnbmVkIHIsIGcsIGIsIGE7CglVaW50MzIgcGl4ID0gKnMrKzsKCWEgPSAocGl4ICYgMHgzZTApID4+IDI7CglwaXggPSAocGl4ICYgfjB4M2UwKSB8IHBpeCA+PiAxNjsKCVJHQl9GUk9NX1BJWEVMKHBpeCwgc2ZtdCwgciwgZywgYik7CglQSVhFTF9GUk9NX1JHQkEoKmRzdCwgZGZtdCwgciwgZywgYiwgYSk7Cglkc3QrKzsKICAgIH0KICAgIHJldHVybiBuICogNDsKfQoKLyogZW5jb2RlIDMyYnBwIHJnYmEgaW50byAzMmJwcCByZ2JhLCBrZWVwaW5nIGFscGhhIChkdWFsIHB1cnBvc2UpICovCnN0YXRpYyBpbnQgY29weV8zMih2b2lkICpkc3QsIFVpbnQzMiAqc3JjLCBpbnQgbiwKCQkgICBTRExfUGl4ZWxGb3JtYXQgKnNmbXQsIFNETF9QaXhlbEZvcm1hdCAqZGZtdCkKewogICAgaW50IGk7CiAgICBVaW50MzIgKmQgPSBkc3Q7CiAgICBmb3IoaSA9IDA7IGkgPCBuOyBpKyspIHsKCXVuc2lnbmVkIHIsIGcsIGIsIGE7CglVaW50MzIgcGl4ZWw7CglSR0JBX0ZST01fODg4OCgqc3JjLCBzZm10LCByLCBnLCBiLCBhKTsKCVBJWEVMX0ZST01fUkdCKHBpeGVsLCBkZm10LCByLCBnLCBiKTsKCSpkKysgPSBwaXhlbCB8IGEgPDwgMjQ7CglzcmMrKzsKICAgIH0KICAgIHJldHVybiBuICogNDsKfQoKLyogZGVjb2RlIDMyYnBwIHJnYmEgaW50byAzMmJwcCByZ2JhLCBrZWVwaW5nIGFscGhhIChkdWFsIHB1cnBvc2UpICovCnN0YXRpYyBpbnQgdW5jb3B5XzMyKFVpbnQzMiAqZHN0LCB2b2lkICpzcmMsIGludCBuLAoJCSAgICAgUkxFRGVzdEZvcm1hdCAqc2ZtdCwgU0RMX1BpeGVsRm9ybWF0ICpkZm10KQp7CiAgICBpbnQgaTsKICAgIFVpbnQzMiAqcyA9IHNyYzsKICAgIGZvcihpID0gMDsgaSA8IG47IGkrKykgewoJdW5zaWduZWQgciwgZywgYiwgYTsKCVVpbnQzMiBwaXhlbCA9ICpzKys7CglSR0JfRlJPTV9QSVhFTChwaXhlbCwgc2ZtdCwgciwgZywgYik7CglhID0gcGl4ZWwgPj4gMjQ7CglQSVhFTF9GUk9NX1JHQkEoKmRzdCwgZGZtdCwgciwgZywgYiwgYSk7Cglkc3QrKzsKICAgIH0KICAgIHJldHVybiBuICogNDsKfQoKI2RlZmluZSBJU09QQVFVRShwaXhlbCwgZm10KSAoKCgocGl4ZWwpICYgZm10LT5BbWFzaykgPj4gZm10LT5Bc2hpZnQpID09IDI1NSkKCiNkZWZpbmUgSVNUUkFOU0wocGl4ZWwsIGZtdCkJXAogICAgKCh1bnNpZ25lZCkoKCgocGl4ZWwpICYgZm10LT5BbWFzaykgPj4gZm10LT5Bc2hpZnQpIC0gMVUpIDwgMjU0VSkKCi8qIGNvbnZlcnQgc3VyZmFjZSB0byBiZSBxdWlja2x5IGFscGhhLWJsaXR0YWJsZSBvbnRvIGRlc3QsIGlmIHBvc3NpYmxlICovCnN0YXRpYyBpbnQgUkxFQWxwaGFTdXJmYWNlKFNETF9TdXJmYWNlICpzdXJmYWNlKQp7CiAgICBTRExfU3VyZmFjZSAqZGVzdDsKICAgIFNETF9QaXhlbEZvcm1hdCAqZGY7CiAgICBpbnQgbWF4c2l6ZSA9IDA7CiAgICBpbnQgbWF4X29wYXF1ZV9ydW47CiAgICBpbnQgbWF4X3RyYW5zbF9ydW4gPSA2NTUzNTsKICAgIHVuc2lnbmVkIG1hc2tzdW07CiAgICBVaW50OCAqcmxlYnVmLCAqZHN0OwogICAgaW50ICgqY29weV9vcGFxdWUpKHZvaWQgKiwgVWludDMyICosIGludCwKCQkgICAgICAgU0RMX1BpeGVsRm9ybWF0ICosIFNETF9QaXhlbEZvcm1hdCAqKTsKICAgIGludCAoKmNvcHlfdHJhbnNsKSh2b2lkICosIFVpbnQzMiAqLCBpbnQsCgkJICAgICAgIFNETF9QaXhlbEZvcm1hdCAqLCBTRExfUGl4ZWxGb3JtYXQgKik7CgogICAgZGVzdCA9IHN1cmZhY2UtPm1hcC0+ZHN0OwogICAgaWYoIWRlc3QpCglyZXR1cm4gLTE7CiAgICBkZiA9IGRlc3QtPmZvcm1hdDsKICAgIGlmKHN1cmZhY2UtPmZvcm1hdC0+Qml0c1BlclBpeGVsICE9IDMyKQoJcmV0dXJuIC0xOwkJLyogb25seSAzMmJwcCBzb3VyY2Ugc3VwcG9ydGVkICovCgogICAgLyogZmluZCBvdXQgd2hldGhlciB0aGUgZGVzdGluYXRpb24gaXMgb25lIHdlIHN1cHBvcnQsCiAgICAgICBhbmQgZGV0ZXJtaW5lIHRoZSBtYXggc2l6ZSBvZiB0aGUgZW5jb2RlZCByZXN1bHQgKi8KICAgIG1hc2tzdW0gPSBkZi0+Um1hc2sgfCBkZi0+R21hc2sgfCBkZi0+Qm1hc2s7CiAgICBzd2l0Y2goZGYtPkJ5dGVzUGVyUGl4ZWwpIHsKICAgIGNhc2UgMjoKCS8qIDE2YnBwOiBvbmx5IHN1cHBvcnQgNTY1IGFuZCA1NTUgZm9ybWF0cyAqLwoJc3dpdGNoKG1hc2tzdW0pIHsKCWNhc2UgMHhmZmZmOgoJICAgIGlmKGRmLT5HbWFzayA9PSAweDA3ZTAKCSAgICAgICB8fCBkZi0+Um1hc2sgPT0gMHgwN2UwIHx8IGRmLT5CbWFzayA9PSAweDA3ZTApIHsKCQljb3B5X29wYXF1ZSA9IGNvcHlfb3BhcXVlXzE2OwoJCWNvcHlfdHJhbnNsID0gY29weV90cmFuc2xfNTY1OwoJICAgIH0gZWxzZQoJCXJldHVybiAtMTsKCSAgICBicmVhazsKCWNhc2UgMHg3ZmZmOgoJICAgIGlmKGRmLT5HbWFzayA9PSAweDAzZTAKCSAgICAgICB8fCBkZi0+Um1hc2sgPT0gMHgwM2UwIHx8IGRmLT5CbWFzayA9PSAweDAzZTApIHsKCQljb3B5X29wYXF1ZSA9IGNvcHlfb3BhcXVlXzE2OwoJCWNvcHlfdHJhbnNsID0gY29weV90cmFuc2xfNTU1OwoJICAgIH0gZWxzZQoJCXJldHVybiAtMTsKCSAgICBicmVhazsKCWRlZmF1bHQ6CgkgICAgcmV0dXJuIC0xOwoJfQoJbWF4X29wYXF1ZV9ydW4gPSAyNTU7CS8qIHJ1bnMgc3RvcmVkIGFzIGJ5dGVzICovCgoJLyogd29yc3QgY2FzZSBpcyBhbHRlcm5hdGluZyBvcGFxdWUgYW5kIHRyYW5zbHVjZW50IHBpeGVscywKCSAgIHdpdGggcm9vbSBmb3IgYWxpZ25tZW50IHBhZGRpbmcgYmV0d2VlbiBsaW5lcyAqLwoJbWF4c2l6ZSA9IHN1cmZhY2UtPmggKiAoMiArICg0ICsgMikgKiAoc3VyZmFjZS0+dyArIDEpKSArIDI7CglicmVhazsKICAgIGNhc2UgNDoKCWlmKG1hc2tzdW0gIT0gMHgwMGZmZmZmZikKCSAgICByZXR1cm4gLTE7CQkvKiByZXF1aXJlcyB1bnVzZWQgaGlnaCBieXRlICovCgljb3B5X29wYXF1ZSA9IGNvcHlfMzI7Cgljb3B5X3RyYW5zbCA9IGNvcHlfMzI7CgltYXhfb3BhcXVlX3J1biA9IDI1NTsJLyogcnVucyBzdG9yZWQgYXMgc2hvcnQgaW50cyAqLwoKCS8qIHdvcnN0IGNhc2UgaXMgYWx0ZXJuYXRpbmcgb3BhcXVlIGFuZCB0cmFuc2x1Y2VudCBwaXhlbHMgKi8KCW1heHNpemUgPSBzdXJmYWNlLT5oICogMiAqIDQgKiAoc3VyZmFjZS0+dyArIDEpICsgNDsKCWJyZWFrOwogICAgZGVmYXVsdDoKCXJldHVybiAtMTsJCS8qIGFueXRoaW5nIGVsc2UgdW5zdXBwb3J0ZWQgcmlnaHQgbm93ICovCiAgICB9CgogICAgbWF4c2l6ZSArPSBzaXplb2YoUkxFRGVzdEZvcm1hdCk7CiAgICBybGVidWYgPSAoVWludDggKilTRExfbWFsbG9jKG1heHNpemUpOwogICAgaWYoIXJsZWJ1ZikgewoJU0RMX091dE9mTWVtb3J5KCk7CglyZXR1cm4gLTE7CiAgICB9CiAgICB7CgkvKiBzYXZlIHRoZSBkZXN0aW5hdGlvbiBmb3JtYXQgc28gd2UgY2FuIHVuZG8gdGhlIGVuY29kaW5nIGxhdGVyICovCglSTEVEZXN0Rm9ybWF0ICpyID0gKFJMRURlc3RGb3JtYXQgKilybGVidWY7CglyLT5CeXRlc1BlclBpeGVsID0gZGYtPkJ5dGVzUGVyUGl4ZWw7CglyLT5SbG9zcyA9IGRmLT5SbG9zczsKCXItPkdsb3NzID0gZGYtPkdsb3NzOwoJci0+Qmxvc3MgPSBkZi0+Qmxvc3M7CglyLT5Sc2hpZnQgPSBkZi0+UnNoaWZ0OwoJci0+R3NoaWZ0ID0gZGYtPkdzaGlmdDsKCXItPkJzaGlmdCA9IGRmLT5Cc2hpZnQ7CglyLT5Bc2hpZnQgPSBkZi0+QXNoaWZ0OwoJci0+Um1hc2sgPSBkZi0+Um1hc2s7CglyLT5HbWFzayA9IGRmLT5HbWFzazsKCXItPkJtYXNrID0gZGYtPkJtYXNrOwoJci0+QW1hc2sgPSBkZi0+QW1hc2s7CiAgICB9CiAgICBkc3QgPSBybGVidWYgKyBzaXplb2YoUkxFRGVzdEZvcm1hdCk7CgogICAgLyogRG8gdGhlIGFjdHVhbCBlbmNvZGluZyAqLwogICAgewoJaW50IHgsIHk7CglpbnQgaCA9IHN1cmZhY2UtPmgsIHcgPSBzdXJmYWNlLT53OwoJU0RMX1BpeGVsRm9ybWF0ICpzZiA9IHN1cmZhY2UtPmZvcm1hdDsKCVVpbnQzMiAqc3JjID0gKFVpbnQzMiAqKXN1cmZhY2UtPnBpeGVsczsKCVVpbnQ4ICpsYXN0bGluZSA9IGRzdDsJLyogZW5kIG9mIGxhc3Qgbm9uLWJsYW5rIGxpbmUgKi8KCgkvKiBvcGFxdWUgY291bnRzIGFyZSA4IG9yIDE2IGJpdHMsIGRlcGVuZGluZyBvbiB0YXJnZXQgZGVwdGggKi8KI2RlZmluZSBBRERfT1BBUVVFX0NPVU5UUyhuLCBtKQkJCVwKCWlmKGRmLT5CeXRlc1BlclBpeGVsID09IDQpIHsJCVwKCSAgICAoKFVpbnQxNiAqKWRzdClbMF0gPSBuOwkJXAoJICAgICgoVWludDE2ICopZHN0KVsxXSA9IG07CQlcCgkgICAgZHN0ICs9IDQ7CQkJCVwKCX0gZWxzZSB7CQkJCVwKCSAgICBkc3RbMF0gPSBuOwkJCQlcCgkgICAgZHN0WzFdID0gbTsJCQkJXAoJICAgIGRzdCArPSAyOwkJCQlcCgl9CgoJLyogdHJhbnNsdWNlbnQgY291bnRzIGFyZSBhbHdheXMgMTYgYml0ICovCiNkZWZpbmUgQUREX1RSQU5TTF9DT1VOVFMobiwgbSkJCVwKCSgoKFVpbnQxNiAqKWRzdClbMF0gPSBuLCAoKFVpbnQxNiAqKWRzdClbMV0gPSBtLCBkc3QgKz0gNCkKCglmb3IoeSA9IDA7IHkgPCBoOyB5KyspIHsKCSAgICBpbnQgcnVuc3RhcnQsIHNraXBzdGFydDsKCSAgICBpbnQgYmxhbmtsaW5lID0gMDsKCSAgICAvKiBGaXJzdCBlbmNvZGUgYWxsIG9wYXF1ZSBwaXhlbHMgb2YgYSBzY2FuIGxpbmUgKi8KCSAgICB4ID0gMDsKCSAgICBkbyB7CgkJaW50IHJ1biwgc2tpcCwgbGVuOwoJCXNraXBzdGFydCA9IHg7CgkJd2hpbGUoeCA8IHcgJiYgIUlTT1BBUVVFKHNyY1t4XSwgc2YpKQoJCSAgICB4Kys7CgkJcnVuc3RhcnQgPSB4OwoJCXdoaWxlKHggPCB3ICYmIElTT1BBUVVFKHNyY1t4XSwgc2YpKQoJCSAgICB4Kys7CgkJc2tpcCA9IHJ1bnN0YXJ0IC0gc2tpcHN0YXJ0OwoJCWlmKHNraXAgPT0gdykKCQkgICAgYmxhbmtsaW5lID0gMTsKCQlydW4gPSB4IC0gcnVuc3RhcnQ7CgkJd2hpbGUoc2tpcCA+IG1heF9vcGFxdWVfcnVuKSB7CgkJICAgIEFERF9PUEFRVUVfQ09VTlRTKG1heF9vcGFxdWVfcnVuLCAwKTsKCQkgICAgc2tpcCAtPSBtYXhfb3BhcXVlX3J1bjsKCQl9CgkJbGVuID0gTUlOKHJ1biwgbWF4X29wYXF1ZV9ydW4pOwoJCUFERF9PUEFRVUVfQ09VTlRTKHNraXAsIGxlbik7CgkJZHN0ICs9IGNvcHlfb3BhcXVlKGRzdCwgc3JjICsgcnVuc3RhcnQsIGxlbiwgc2YsIGRmKTsKCQlydW5zdGFydCArPSBsZW47CgkJcnVuIC09IGxlbjsKCQl3aGlsZShydW4pIHsKCQkgICAgbGVuID0gTUlOKHJ1biwgbWF4X29wYXF1ZV9ydW4pOwoJCSAgICBBRERfT1BBUVVFX0NPVU5UUygwLCBsZW4pOwoJCSAgICBkc3QgKz0gY29weV9vcGFxdWUoZHN0LCBzcmMgKyBydW5zdGFydCwgbGVuLCBzZiwgZGYpOwoJCSAgICBydW5zdGFydCArPSBsZW47CgkJICAgIHJ1biAtPSBsZW47CgkJfQoJICAgIH0gd2hpbGUoeCA8IHcpOwoKCSAgICAvKiBNYWtlIHN1cmUgdGhlIG5leHQgb3V0cHV0IGFkZHJlc3MgaXMgMzItYml0IGFsaWduZWQgKi8KCSAgICBkc3QgKz0gKHVpbnRwdHJfdClkc3QgJiAyOwoKCSAgICAvKiBOZXh0LCBlbmNvZGUgYWxsIHRyYW5zbHVjZW50IHBpeGVscyBvZiB0aGUgc2FtZSBzY2FuIGxpbmUgKi8KCSAgICB4ID0gMDsKCSAgICBkbyB7CgkJaW50IHJ1biwgc2tpcCwgbGVuOwoJCXNraXBzdGFydCA9IHg7CgkJd2hpbGUoeCA8IHcgJiYgIUlTVFJBTlNMKHNyY1t4XSwgc2YpKQoJCSAgICB4Kys7CgkJcnVuc3RhcnQgPSB4OwoJCXdoaWxlKHggPCB3ICYmIElTVFJBTlNMKHNyY1t4XSwgc2YpKQoJCSAgICB4Kys7CgkJc2tpcCA9IHJ1bnN0YXJ0IC0gc2tpcHN0YXJ0OwoJCWJsYW5rbGluZSAmPSAoc2tpcCA9PSB3KTsKCQlydW4gPSB4IC0gcnVuc3RhcnQ7CgkJd2hpbGUoc2tpcCA+IG1heF90cmFuc2xfcnVuKSB7CgkJICAgIEFERF9UUkFOU0xfQ09VTlRTKG1heF90cmFuc2xfcnVuLCAwKTsKCQkgICAgc2tpcCAtPSBtYXhfdHJhbnNsX3J1bjsKCQl9CgkJbGVuID0gTUlOKHJ1biwgbWF4X3RyYW5zbF9ydW4pOwoJCUFERF9UUkFOU0xfQ09VTlRTKHNraXAsIGxlbik7CgkJZHN0ICs9IGNvcHlfdHJhbnNsKGRzdCwgc3JjICsgcnVuc3RhcnQsIGxlbiwgc2YsIGRmKTsKCQlydW5zdGFydCArPSBsZW47CgkJcnVuIC09IGxlbjsKCQl3aGlsZShydW4pIHsKCQkgICAgbGVuID0gTUlOKHJ1biwgbWF4X3RyYW5zbF9ydW4pOwoJCSAgICBBRERfVFJBTlNMX0NPVU5UUygwLCBsZW4pOwoJCSAgICBkc3QgKz0gY29weV90cmFuc2woZHN0LCBzcmMgKyBydW5zdGFydCwgbGVuLCBzZiwgZGYpOwoJCSAgICBydW5zdGFydCArPSBsZW47CgkJICAgIHJ1biAtPSBsZW47CgkJfQoJCWlmKCFibGFua2xpbmUpCgkJICAgIGxhc3RsaW5lID0gZHN0OwoJICAgIH0gd2hpbGUoeCA8IHcpOwoKCSAgICBzcmMgKz0gc3VyZmFjZS0+cGl0Y2ggPj4gMjsKCX0KCWRzdCA9IGxhc3RsaW5lOwkJLyogYmFjayB1cCBwYXN0IHRyYWlsaW5nIGJsYW5rIGxpbmVzICovCglBRERfT1BBUVVFX0NPVU5UUygwLCAwKTsKICAgIH0KCiN1bmRlZiBBRERfT1BBUVVFX0NPVU5UUwojdW5kZWYgQUREX1RSQU5TTF9DT1VOVFMKCiAgICAvKiBOb3cgdGhhdCB3ZSBoYXZlIGl0IGVuY29kZWQsIHJlbGVhc2UgdGhlIG9yaWdpbmFsIHBpeGVscyAqLwogICAgaWYoKHN1cmZhY2UtPmZsYWdzICYgU0RMX1BSRUFMTE9DKSAhPSBTRExfUFJFQUxMT0MKICAgICAgICYmIChzdXJmYWNlLT5mbGFncyAmIFNETF9IV1NVUkZBQ0UpICE9IFNETF9IV1NVUkZBQ0UpIHsKCVNETF9mcmVlKCBzdXJmYWNlLT5waXhlbHMgKTsKCXN1cmZhY2UtPnBpeGVscyA9IE5VTEw7CiAgICB9CgogICAgLyogcmVhbGxvYyB0aGUgYnVmZmVyIHRvIHJlbGVhc2UgdW51c2VkIG1lbW9yeSAqLwogICAgewoJVWludDggKnAgPSBTRExfcmVhbGxvYyhybGVidWYsIGRzdCAtIHJsZWJ1Zik7CglpZighcCkKCSAgICBwID0gcmxlYnVmOwoJc3VyZmFjZS0+bWFwLT5zd19kYXRhLT5hdXhfZGF0YSA9IHA7CiAgICB9CgogICAgcmV0dXJuIDA7Cn0KCnN0YXRpYyBVaW50MzIgZ2V0cGl4XzgoVWludDggKnNyY2J1ZikKewogICAgcmV0dXJuICpzcmNidWY7Cn0KCnN0YXRpYyBVaW50MzIgZ2V0cGl4XzE2KFVpbnQ4ICpzcmNidWYpCnsKICAgIHJldHVybiAqKFVpbnQxNiAqKXNyY2J1ZjsKfQoKc3RhdGljIFVpbnQzMiBnZXRwaXhfMjQoVWludDggKnNyY2J1ZikKewojaWYgU0RMX0JZVEVPUkRFUiA9PSBTRExfTElMX0VORElBTgogICAgcmV0dXJuIHNyY2J1ZlswXSArIChzcmNidWZbMV0gPDwgOCkgKyAoc3JjYnVmWzJdIDw8IDE2KTsKI2Vsc2UKICAgIHJldHVybiAoc3JjYnVmWzBdIDw8IDE2KSArIChzcmNidWZbMV0gPDwgOCkgKyBzcmNidWZbMl07CiNlbmRpZgp9CgpzdGF0aWMgVWludDMyIGdldHBpeF8zMihVaW50OCAqc3JjYnVmKQp7CiAgICByZXR1cm4gKihVaW50MzIgKilzcmNidWY7Cn0KCnR5cGVkZWYgVWludDMyICgqZ2V0cGl4X2Z1bmMpKFVpbnQ4ICopOwoKc3RhdGljIGdldHBpeF9mdW5jIGdldHBpeGVzWzRdID0gewogICAgZ2V0cGl4XzgsIGdldHBpeF8xNiwgZ2V0cGl4XzI0LCBnZXRwaXhfMzIKfTsKCnN0YXRpYyBpbnQgUkxFQ29sb3JrZXlTdXJmYWNlKFNETF9TdXJmYWNlICpzdXJmYWNlKQp7CiAgICAgICAgVWludDggKnJsZWJ1ZiwgKmRzdDsKCWludCBtYXhuOwoJaW50IHk7CglVaW50OCAqc3JjYnVmLCAqY3VyYnVmLCAqbGFzdGxpbmU7CglpbnQgbWF4c2l6ZSA9IDA7CglpbnQgc2tpcCwgcnVuOwoJaW50IGJwcCA9IHN1cmZhY2UtPmZvcm1hdC0+Qnl0ZXNQZXJQaXhlbDsKCWdldHBpeF9mdW5jIGdldHBpeDsKCVVpbnQzMiBja2V5LCByZ2JtYXNrOwoJaW50IHcsIGg7CgoJLyogY2FsY3VsYXRlIHRoZSB3b3JzdCBjYXNlIHNpemUgZm9yIHRoZSBjb21wcmVzc2VkIHN1cmZhY2UgKi8KCXN3aXRjaChicHApIHsKCWNhc2UgMToKCSAgICAvKiB3b3JzdCBjYXNlIGlzIGFsdGVybmF0aW5nIG9wYXF1ZSBhbmQgdHJhbnNwYXJlbnQgcGl4ZWxzLAoJICAgICAgIHN0YXJ0aW5nIHdpdGggYW4gb3BhcXVlIHBpeGVsICovCgkgICAgbWF4c2l6ZSA9IHN1cmZhY2UtPmggKiAzICogKHN1cmZhY2UtPncgLyAyICsgMSkgKyAyOwoJICAgIGJyZWFrOwoJY2FzZSAyOgoJY2FzZSAzOgoJICAgIC8qIHdvcnN0IGNhc2UgaXMgc29saWQgcnVucywgYXQgbW9zdCAyNTUgcGl4ZWxzIHdpZGUgKi8KCSAgICBtYXhzaXplID0gc3VyZmFjZS0+aCAqICgyICogKHN1cmZhY2UtPncgLyAyNTUgKyAxKQoJCQkJICAgICsgc3VyZmFjZS0+dyAqIGJwcCkgKyAyOwoJICAgIGJyZWFrOwoJY2FzZSA0OgoJICAgIC8qIHdvcnN0IGNhc2UgaXMgc29saWQgcnVucywgYXQgbW9zdCA2NTUzNSBwaXhlbHMgd2lkZSAqLwoJICAgIG1heHNpemUgPSBzdXJmYWNlLT5oICogKDQgKiAoc3VyZmFjZS0+dyAvIDY1NTM1ICsgMSkKCQkJCSAgICArIHN1cmZhY2UtPncgKiA0KSArIDQ7CgkgICAgYnJlYWs7Cgl9CgoJcmxlYnVmID0gKFVpbnQ4ICopU0RMX21hbGxvYyhtYXhzaXplKTsKCWlmICggcmxlYnVmID09IE5VTEwgKSB7CgkJU0RMX091dE9mTWVtb3J5KCk7CgkJcmV0dXJuKC0xKTsKCX0KCgkvKiBTZXQgdXAgdGhlIGNvbnZlcnNpb24gKi8KCXNyY2J1ZiA9IChVaW50OCAqKXN1cmZhY2UtPnBpeGVsczsKCWN1cmJ1ZiA9IHNyY2J1ZjsKCW1heG4gPSBicHAgPT0gNCA/IDY1NTM1IDogMjU1OwoJc2tpcCA9IHJ1biA9IDA7Cglkc3QgPSBybGVidWY7CglyZ2JtYXNrID0gfnN1cmZhY2UtPmZvcm1hdC0+QW1hc2s7Cglja2V5ID0gc3VyZmFjZS0+Zm9ybWF0LT5jb2xvcmtleSAmIHJnYm1hc2s7CglsYXN0bGluZSA9IGRzdDsKCWdldHBpeCA9IGdldHBpeGVzW2JwcCAtIDFdOwoJdyA9IHN1cmZhY2UtPnc7CgloID0gc3VyZmFjZS0+aDsKCiNkZWZpbmUgQUREX0NPVU5UUyhuLCBtKQkJCVwKCWlmKGJwcCA9PSA0KSB7CQkJCVwKCSAgICAoKFVpbnQxNiAqKWRzdClbMF0gPSBuOwkJXAoJICAgICgoVWludDE2ICopZHN0KVsxXSA9IG07CQlcCgkgICAgZHN0ICs9IDQ7CQkJCVwKCX0gZWxzZSB7CQkJCVwKCSAgICBkc3RbMF0gPSBuOwkJCQlcCgkgICAgZHN0WzFdID0gbTsJCQkJXAoJICAgIGRzdCArPSAyOwkJCQlcCgl9CgoJZm9yKHkgPSAwOyB5IDwgaDsgeSsrKSB7CgkgICAgaW50IHggPSAwOwoJICAgIGludCBibGFua2xpbmUgPSAwOwoJICAgIGRvIHsKCQlpbnQgcnVuLCBza2lwLCBsZW47CgkJaW50IHJ1bnN0YXJ0OwoJCWludCBza2lwc3RhcnQgPSB4OwoKCQkvKiBmaW5kIHJ1biBvZiB0cmFuc3BhcmVudCwgdGhlbiBvcGFxdWUgcGl4ZWxzICovCgkJd2hpbGUoeCA8IHcgJiYgKGdldHBpeChzcmNidWYgKyB4ICogYnBwKSAmIHJnYm1hc2spID09IGNrZXkpCgkJICAgIHgrKzsKCQlydW5zdGFydCA9IHg7CgkJd2hpbGUoeCA8IHcgJiYgKGdldHBpeChzcmNidWYgKyB4ICogYnBwKSAmIHJnYm1hc2spICE9IGNrZXkpCgkJICAgIHgrKzsKCQlza2lwID0gcnVuc3RhcnQgLSBza2lwc3RhcnQ7CgkJaWYoc2tpcCA9PSB3KQoJCSAgICBibGFua2xpbmUgPSAxOwoJCXJ1biA9IHggLSBydW5zdGFydDsKCgkJLyogZW5jb2RlIHNlZ21lbnQgKi8KCQl3aGlsZShza2lwID4gbWF4bikgewoJCSAgICBBRERfQ09VTlRTKG1heG4sIDApOwoJCSAgICBza2lwIC09IG1heG47CgkJfQoJCWxlbiA9IE1JTihydW4sIG1heG4pOwoJCUFERF9DT1VOVFMoc2tpcCwgbGVuKTsKCQlTRExfbWVtY3B5KGRzdCwgc3JjYnVmICsgcnVuc3RhcnQgKiBicHAsIGxlbiAqIGJwcCk7CgkJZHN0ICs9IGxlbiAqIGJwcDsKCQlydW4gLT0gbGVuOwoJCXJ1bnN0YXJ0ICs9IGxlbjsKCQl3aGlsZShydW4pIHsKCQkgICAgbGVuID0gTUlOKHJ1biwgbWF4bik7CgkJICAgIEFERF9DT1VOVFMoMCwgbGVuKTsKCQkgICAgU0RMX21lbWNweShkc3QsIHNyY2J1ZiArIHJ1bnN0YXJ0ICogYnBwLCBsZW4gKiBicHApOwoJCSAgICBkc3QgKz0gbGVuICogYnBwOwoJCSAgICBydW5zdGFydCArPSBsZW47CgkJICAgIHJ1biAtPSBsZW47CgkJfQoJCWlmKCFibGFua2xpbmUpCgkJICAgIGxhc3RsaW5lID0gZHN0OwoJICAgIH0gd2hpbGUoeCA8IHcpOwoKCSAgICBzcmNidWYgKz0gc3VyZmFjZS0+cGl0Y2g7Cgl9Cglkc3QgPSBsYXN0bGluZTsJCS8qIGJhY2sgdXAgYmFzdCB0cmFpbGluZyBibGFuayBsaW5lcyAqLwoJQUREX0NPVU5UUygwLCAwKTsKCiN1bmRlZiBBRERfQ09VTlRTCgoJLyogTm93IHRoYXQgd2UgaGF2ZSBpdCBlbmNvZGVkLCByZWxlYXNlIHRoZSBvcmlnaW5hbCBwaXhlbHMgKi8KCWlmKChzdXJmYWNlLT5mbGFncyAmIFNETF9QUkVBTExPQykgIT0gU0RMX1BSRUFMTE9DCgkgICAmJiAoc3VyZmFjZS0+ZmxhZ3MgJiBTRExfSFdTVVJGQUNFKSAhPSBTRExfSFdTVVJGQUNFKSB7CgkgICAgU0RMX2ZyZWUoIHN1cmZhY2UtPnBpeGVscyApOwoJICAgIHN1cmZhY2UtPnBpeGVscyA9IE5VTEw7Cgl9CgoJLyogcmVhbGxvYyB0aGUgYnVmZmVyIHRvIHJlbGVhc2UgdW51c2VkIG1lbW9yeSAqLwoJewoJICAgIC8qIElmIHJlYWxsb2MgcmV0dXJucyBOVUxMLCB0aGUgb3JpZ2luYWwgYmxvY2sgaXMgbGVmdCBpbnRhY3QgKi8KCSAgICBVaW50OCAqcCA9IFNETF9yZWFsbG9jKHJsZWJ1ZiwgZHN0IC0gcmxlYnVmKTsKCSAgICBpZighcCkKCQlwID0gcmxlYnVmOwoJICAgIHN1cmZhY2UtPm1hcC0+c3dfZGF0YS0+YXV4X2RhdGEgPSBwOwoJfQoKCXJldHVybigwKTsKfQoKaW50IFNETF9STEVTdXJmYWNlKFNETF9TdXJmYWNlICpzdXJmYWNlKQp7CglpbnQgcmV0Y29kZTsKCgkvKiBDbGVhciBhbnkgcHJldmlvdXMgUkxFIGNvbnZlcnNpb24gKi8KCWlmICggKHN1cmZhY2UtPmZsYWdzICYgU0RMX1JMRUFDQ0VMKSA9PSBTRExfUkxFQUNDRUwgKSB7CgkJU0RMX1VuUkxFU3VyZmFjZShzdXJmYWNlLCAxKTsKCX0KCgkvKiBXZSBkb24ndCBzdXBwb3J0IFJMRSBlbmNvZGluZyBvZiBiaXRtYXBzICovCglpZiAoIHN1cmZhY2UtPmZvcm1hdC0+Qml0c1BlclBpeGVsIDwgOCApIHsKCQlyZXR1cm4oLTEpOwoJfQoKCS8qIExvY2sgdGhlIHN1cmZhY2UgaWYgaXQncyBpbiBoYXJkd2FyZSAqLwoJaWYgKCBTRExfTVVTVExPQ0soc3VyZmFjZSkgKSB7CgkJaWYgKCBTRExfTG9ja1N1cmZhY2Uoc3VyZmFjZSkgPCAwICkgewoJCQlyZXR1cm4oLTEpOwoJCX0KCX0KCgkvKiBFbmNvZGUgKi8KCWlmKChzdXJmYWNlLT5mbGFncyAmIFNETF9TUkNDT0xPUktFWSkgPT0gU0RMX1NSQ0NPTE9SS0VZKSB7CgkgICAgcmV0Y29kZSA9IFJMRUNvbG9ya2V5U3VyZmFjZShzdXJmYWNlKTsKCX0gZWxzZSB7CgkgICAgaWYoKHN1cmZhY2UtPmZsYWdzICYgU0RMX1NSQ0FMUEhBKSA9PSBTRExfU1JDQUxQSEEKCSAgICAgICAmJiBzdXJmYWNlLT5mb3JtYXQtPkFtYXNrICE9IDApCgkJcmV0Y29kZSA9IFJMRUFscGhhU3VyZmFjZShzdXJmYWNlKTsKCSAgICBlbHNlCgkJcmV0Y29kZSA9IC0xOwkvKiBubyBSTEUgZm9yIHBlci1zdXJmYWNlIGFscGhhIHNhbnMgY2tleSAqLwoJfQoKCS8qIFVubG9jayB0aGUgc3VyZmFjZSBpZiBpdCdzIGluIGhhcmR3YXJlICovCglpZiAoIFNETF9NVVNUTE9DSyhzdXJmYWNlKSApIHsKCQlTRExfVW5sb2NrU3VyZmFjZShzdXJmYWNlKTsKCX0KCglpZihyZXRjb2RlIDwgMCkKCSAgICByZXR1cm4gLTE7CgoJLyogVGhlIHN1cmZhY2UgaXMgbm93IGFjY2VsZXJhdGVkICovCglzdXJmYWNlLT5mbGFncyB8PSBTRExfUkxFQUNDRUw7CgoJcmV0dXJuKDApOwp9CgovKgogKiBVbi1STEUgYSBzdXJmYWNlIHdpdGggcGl4ZWwgYWxwaGEKICogVGhpcyBtYXkgbm90IGdpdmUgYmFjayBleGFjdGx5IHRoZSBpbWFnZSBiZWZvcmUgUkxFLWVuY29kaW5nOyBhbGwKICogY29tcGxldGVseSB0cmFuc3BhcmVudCBwaXhlbHMgd2lsbCBiZSBsb3N0LCBhbmQgY29sb3VyIGFuZCBhbHBoYSBkZXB0aAogKiBtYXkgaGF2ZSBiZWVuIHJlZHVjZWQgKHdoZW4gZW5jb2RpbmcgZm9yIDE2YnBwIHRhcmdldHMpLgogKi8Kc3RhdGljIFNETF9ib29sIFVuUkxFQWxwaGEoU0RMX1N1cmZhY2UgKnN1cmZhY2UpCnsKICAgIFVpbnQ4ICpzcmNidWY7CiAgICBVaW50MzIgKmRzdDsKICAgIFNETF9QaXhlbEZvcm1hdCAqc2YgPSBzdXJmYWNlLT5mb3JtYXQ7CiAgICBSTEVEZXN0Rm9ybWF0ICpkZiA9IHN1cmZhY2UtPm1hcC0+c3dfZGF0YS0+YXV4X2RhdGE7CiAgICBpbnQgKCp1bmNvcHlfb3BhcXVlKShVaW50MzIgKiwgdm9pZCAqLCBpbnQsCgkJCSBSTEVEZXN0Rm9ybWF0ICosIFNETF9QaXhlbEZvcm1hdCAqKTsKICAgIGludCAoKnVuY29weV90cmFuc2wpKFVpbnQzMiAqLCB2b2lkICosIGludCwKCQkJIFJMRURlc3RGb3JtYXQgKiwgU0RMX1BpeGVsRm9ybWF0ICopOwogICAgaW50IHcgPSBzdXJmYWNlLT53OwogICAgaW50IGJwcCA9IGRmLT5CeXRlc1BlclBpeGVsOwoKICAgIGlmKGJwcCA9PSAyKSB7Cgl1bmNvcHlfb3BhcXVlID0gdW5jb3B5X29wYXF1ZV8xNjsKCXVuY29weV90cmFuc2wgPSB1bmNvcHlfdHJhbnNsXzE2OwogICAgfSBlbHNlIHsKCXVuY29weV9vcGFxdWUgPSB1bmNvcHlfdHJhbnNsID0gdW5jb3B5XzMyOwogICAgfQoKICAgIHN1cmZhY2UtPnBpeGVscyA9IFNETF9tYWxsb2Moc3VyZmFjZS0+aCAqIHN1cmZhY2UtPnBpdGNoKTsKICAgIGlmICggIXN1cmZhY2UtPnBpeGVscyApIHsKICAgICAgICByZXR1cm4oU0RMX0ZBTFNFKTsKICAgIH0KICAgIC8qIGZpbGwgYmFja2dyb3VuZCB3aXRoIHRyYW5zcGFyZW50IHBpeGVscyAqLwogICAgU0RMX21lbXNldChzdXJmYWNlLT5waXhlbHMsIDAsIHN1cmZhY2UtPmggKiBzdXJmYWNlLT5waXRjaCk7CgogICAgZHN0ID0gc3VyZmFjZS0+cGl4ZWxzOwogICAgc3JjYnVmID0gKFVpbnQ4ICopKGRmICsgMSk7CiAgICBmb3IoOzspIHsKCS8qIGNvcHkgb3BhcXVlIHBpeGVscyAqLwoJaW50IG9mcyA9IDA7CglkbyB7CgkgICAgdW5zaWduZWQgcnVuOwoJICAgIGlmKGJwcCA9PSAyKSB7CgkJb2ZzICs9IHNyY2J1ZlswXTsKCQlydW4gPSBzcmNidWZbMV07CgkJc3JjYnVmICs9IDI7CgkgICAgfSBlbHNlIHsKCQlvZnMgKz0gKChVaW50MTYgKilzcmNidWYpWzBdOwoJCXJ1biA9ICgoVWludDE2ICopc3JjYnVmKVsxXTsKCQlzcmNidWYgKz0gNDsKCSAgICB9CgkgICAgaWYocnVuKSB7CgkJc3JjYnVmICs9IHVuY29weV9vcGFxdWUoZHN0ICsgb2ZzLCBzcmNidWYsIHJ1biwgZGYsIHNmKTsKCQlvZnMgKz0gcnVuOwoJICAgIH0gZWxzZSBpZighb2ZzKQoJCXJldHVybihTRExfVFJVRSk7Cgl9IHdoaWxlKG9mcyA8IHcpOwoKCS8qIHNraXAgcGFkZGluZyBpZiBuZWVkZWQgKi8KCWlmKGJwcCA9PSAyKQoJICAgIHNyY2J1ZiArPSAodWludHB0cl90KXNyY2J1ZiAmIDI7CgkKCS8qIGNvcHkgdHJhbnNsdWNlbnQgcGl4ZWxzICovCglvZnMgPSAwOwoJZG8gewoJICAgIHVuc2lnbmVkIHJ1bjsKCSAgICBvZnMgKz0gKChVaW50MTYgKilzcmNidWYpWzBdOwoJICAgIHJ1biA9ICgoVWludDE2ICopc3JjYnVmKVsxXTsKCSAgICBzcmNidWYgKz0gNDsKCSAgICBpZihydW4pIHsKCQlzcmNidWYgKz0gdW5jb3B5X3RyYW5zbChkc3QgKyBvZnMsIHNyY2J1ZiwgcnVuLCBkZiwgc2YpOwoJCW9mcyArPSBydW47CgkgICAgfQoJfSB3aGlsZShvZnMgPCB3KTsKCWRzdCArPSBzdXJmYWNlLT5waXRjaCA+PiAyOwogICAgfQogICAgLyogTWFrZSB0aGUgY29tcGlsZXIgaGFwcHkgKi8KICAgIHJldHVybihTRExfVFJVRSk7Cn0KCnZvaWQgU0RMX1VuUkxFU3VyZmFjZShTRExfU3VyZmFjZSAqc3VyZmFjZSwgaW50IHJlY29kZSkKewogICAgaWYgKCAoc3VyZmFjZS0+ZmxhZ3MgJiBTRExfUkxFQUNDRUwpID09IFNETF9STEVBQ0NFTCApIHsKCXN1cmZhY2UtPmZsYWdzICY9IH5TRExfUkxFQUNDRUw7CgoJaWYocmVjb2RlICYmIChzdXJmYWNlLT5mbGFncyAmIFNETF9QUkVBTExPQykgIT0gU0RMX1BSRUFMTE9DCgkgICAmJiAoc3VyZmFjZS0+ZmxhZ3MgJiBTRExfSFdTVVJGQUNFKSAhPSBTRExfSFdTVVJGQUNFKSB7CgkgICAgaWYoKHN1cmZhY2UtPmZsYWdzICYgU0RMX1NSQ0NPTE9SS0VZKSA9PSBTRExfU1JDQ09MT1JLRVkpIHsKCQlTRExfUmVjdCBmdWxsOwoJCXVuc2lnbmVkIGFscGhhX2ZsYWc7CgoJCS8qIHJlLWNyZWF0ZSB0aGUgb3JpZ2luYWwgc3VyZmFjZSAqLwoJCXN1cmZhY2UtPnBpeGVscyA9IFNETF9tYWxsb2Moc3VyZmFjZS0+aCAqIHN1cmZhY2UtPnBpdGNoKTsKCQlpZiAoICFzdXJmYWNlLT5waXhlbHMgKSB7CgkJCS8qIE9oIGNyYXAuLi4gKi8KCQkJc3VyZmFjZS0+ZmxhZ3MgfD0gU0RMX1JMRUFDQ0VMOwoJCQlyZXR1cm47CgkJfQoKCQkvKiBmaWxsIGl0IHdpdGggdGhlIGJhY2tncm91bmQgY29sb3VyICovCgkJU0RMX0ZpbGxSZWN0KHN1cmZhY2UsIE5VTEwsIHN1cmZhY2UtPmZvcm1hdC0+Y29sb3JrZXkpOwoKCQkvKiBub3cgcmVuZGVyIHRoZSBlbmNvZGVkIHN1cmZhY2UgKi8KCQlmdWxsLnggPSBmdWxsLnkgPSAwOwoJCWZ1bGwudyA9IHN1cmZhY2UtPnc7CgkJZnVsbC5oID0gc3VyZmFjZS0+aDsKCQlhbHBoYV9mbGFnID0gc3VyZmFjZS0+ZmxhZ3MgJiBTRExfU1JDQUxQSEE7CgkJc3VyZmFjZS0+ZmxhZ3MgJj0gflNETF9TUkNBTFBIQTsgLyogb3BhcXVlIGJsaXQgKi8KCQlTRExfUkxFQmxpdChzdXJmYWNlLCAmZnVsbCwgc3VyZmFjZSwgJmZ1bGwpOwoJCXN1cmZhY2UtPmZsYWdzIHw9IGFscGhhX2ZsYWc7CgkgICAgfSBlbHNlIHsKCQlpZiAoICFVblJMRUFscGhhKHN1cmZhY2UpICkgewoJCSAgICAvKiBPaCBjcmFwLi4uICovCgkJICAgIHN1cmZhY2UtPmZsYWdzIHw9IFNETF9STEVBQ0NFTDsKCQkgICAgcmV0dXJuOwoJCX0KCSAgICB9Cgl9CgoJaWYgKCBzdXJmYWNlLT5tYXAgJiYgc3VyZmFjZS0+bWFwLT5zd19kYXRhLT5hdXhfZGF0YSApIHsKCSAgICBTRExfZnJlZShzdXJmYWNlLT5tYXAtPnN3X2RhdGEtPmF1eF9kYXRhKTsKCSAgICBzdXJmYWNlLT5tYXAtPnN3X2RhdGEtPmF1eF9kYXRhID0gTlVMTDsKCX0KICAgIH0KfQoKCg==