U3VibWl0dGVkIEJ5OiBKaW0gR2lmZm9yZCAocGF0Y2hlcyBhdCBqZzU1NSBkb3QgY29tKQpEYXRlOiAyMDA1LTA4LTMxCkluaXRpYWwgUGFja2FnZSBWZXJzaW9uOiAwLjk3Ck9yaWdpbjogT3BlblNvbGFyaXMsIEpvZSBDaWNjb25lLCBKaW0gR2lmZm9yZApVcHN0cmVhbSBTdGF0dXM6IE4vQQpEZXNjcmlwdGlvbjogQWRkcyBzdXBwb3J0IGZvciBGb3JjZWRldGggYW5kIG90aGVyIE5JQydzCgkgICAgIEZpeGVzIGZvciBHQ0MgNC54CgkgICAgIFJlbW92YWwgb2YgYmFkIG5ldHdvcmsgZHJpdmVycwogCmRpZmYgLU5hdXIgZ3J1Yi0wLjk3Lm9yaWcvY29uZmlndXJlIGdydWItMC45Ny9jb25maWd1cmUKLS0tIGdydWItMC45Ny5vcmlnL2NvbmZpZ3VyZQkyMDA1LTA1LTA4IDAyOjQ4OjEyLjAwMDAwMDAwMCArMDAwMAorKysgZ3J1Yi0wLjk3L2NvbmZpZ3VyZQkyMDA1LTA5LTAxIDAwOjE1OjQ4LjAwMDAwMDAwMCArMDAwMApAQCAtODcyLDQ3ICs4NzIsMzIgQEAKICAgLS1kaXNhYmxlLXBhY2tldC1yZXRyYW5zbWlzc2lvbgogICAgICAgICAgICAgICAgICAgICAgICAgICB0dXJuIG9mZiBwYWNrZXQgcmV0cmFuc21pc3Npb24KICAgLS1lbmFibGUtcGNpLWRpcmVjdCAgICAgYWNjZXNzIFBDSSBkaXJlY3RseSBpbnN0ZWFkIG9mIHVzaW5nIEJJT1MKLSAgLS1lbmFibGUtM2M1MDkgICAgICAgICAgZW5hYmxlIDNDb201MDkgZHJpdmVyCi0gIC0tZW5hYmxlLTNjNTI5ICAgICAgICAgIGVuYWJsZSAzQ29tNTI5IGRyaXZlcgogICAtLWVuYWJsZS0zYzU5NSAgICAgICAgICBlbmFibGUgM0NvbTU5NSBkcml2ZXIKICAgLS1lbmFibGUtM2M5MHggICAgICAgICAgZW5hYmxlIDNDb205MHggZHJpdmVyCi0gIC0tZW5hYmxlLWNzODl4MCAgICAgICAgIGVuYWJsZSBDUzg5eDAgZHJpdmVyCiAgIC0tZW5hYmxlLWRhdmljb20gICAgICAgIGVuYWJsZSBEYXZpY29tIGRyaXZlcgotICAtLWVuYWJsZS1kZXBjYSAgICAgICAgICBlbmFibGUgREVQQ0EgYW5kIEV0aGVyV09SS1MgZHJpdmVyCi0gIC0tZW5hYmxlLWVlcHJvICAgICAgICAgIGVuYWJsZSBFdGhlcmV4cHJlc3MgUHJvLzEwIGRyaXZlcgorICAtLWVuYWJsZS1lMTAwMCAgICAgICAgICBlbmFibGUgRXRoZXJleHByZXNzIFByby8xMDAwIGRyaXZlcgogICAtLWVuYWJsZS1lZXBybzEwMCAgICAgICBlbmFibGUgRXRoZXJleHByZXNzIFByby8xMDAgZHJpdmVyCiAgIC0tZW5hYmxlLWVwaWMxMDAgICAgICAgIGVuYWJsZSBTTUMgODNjMTcwIEVQSUMvMTAwIGRyaXZlcgotICAtLWVuYWJsZS0zYzUwNyAgICAgICAgICBlbmFibGUgM0NvbTUwNyBkcml2ZXIKLSAgLS1lbmFibGUtZXhvczIwNSAgICAgICAgZW5hYmxlIEVYT1MyMDUgZHJpdmVyCi0gIC0tZW5hYmxlLW5pNTIxMCAgICAgICAgIGVuYWJsZSBSYWNhbC1JbnRlcmxhbiBOSTUyMTAgZHJpdmVyCi0gIC0tZW5hYmxlLWxhbmNlICAgICAgICAgIGVuYWJsZSBMYW5jZSBQQ0kgUENOZXQvMzIgZHJpdmVyCi0gIC0tZW5hYmxlLW5lMjEwMCAgICAgICAgIGVuYWJsZSBOb3ZlbGwgTkUyMTAwIGRyaXZlcgotICAtLWVuYWJsZS1uaTY1MTAgICAgICAgICBlbmFibGUgUmFjYWwtSW50ZXJsYW4gTkk2NTEwIGRyaXZlcgorICAtLWVuYWJsZS1mb3JjZWRldGggICAgICBlbmFibGUgTnZpZGlhIEdlZm9yY2UgZHJpdmVyCiAgIC0tZW5hYmxlLW5hdHNlbWkgICAgICAgIGVuYWJsZSBOYXRTZW1pIERQODM4MXggZHJpdmVyCi0gIC0tZW5hYmxlLW5pNTAxMCAgICAgICAgIGVuYWJsZSBSYWNhbC1JbnRlcmxhbiBOSTUwMTAgZHJpdmVyCi0gIC0tZW5hYmxlLTNjNTAzICAgICAgICAgIGVuYWJsZSAzQ29tNTAzIGRyaXZlcgotICAtLWVuYWJsZS1uZSAgICAgICAgICAgICBlbmFibGUgTkUxMDAwLzIwMDAgSVNBIGRyaXZlcgorICAtLWVuYWJsZS1uczgzODIwICAgICAgICBlbmFibGUgTlM4MzgyMCBkcml2ZXIKICAgLS1lbmFibGUtbnM4MzkwICAgICAgICAgZW5hYmxlIE5FMjAwMCBQQ0kgZHJpdmVyCi0gIC0tZW5hYmxlLXdkICAgICAgICAgICAgIGVuYWJsZSBXRDgwMDMvODAxMywgU01DODIxNi84NDE2IGRyaXZlcgotICAtLWVuYWJsZS1vdHVsaXAgICAgICAgICBlbmFibGUgb2xkIFR1bGlwIGRyaXZlcgorICAtLWVuYWJsZS1wY25ldDMyICAgICAgICBlbmFibGUgQU1EIExhbmNlL1BDSSBQQ05ldC8zMiBkcml2ZXIKKyAgLS1lbmFibGUtcG5pYyAgICAgICAgICAgZW5hYmxlIEJvY2hzIFBzZXVkbyBOaWMgZHJpdmVyCiAgIC0tZW5hYmxlLXJ0bDgxMzkgICAgICAgIGVuYWJsZSBSZWFsdGVrIDgxMzkgZHJpdmVyCisgIC0tZW5hYmxlLXI4MTY5ICAgICAgICAgIGVuYWJsZSBSZWFsdGVrIDgxNjkgZHJpdmVyCiAgIC0tZW5hYmxlLXNpczkwMCAgICAgICAgIGVuYWJsZSBTSVMgOTAwIGFuZCBTSVMgNzAxNiBkcml2ZXIKLSAgLS1lbmFibGUtc2stZzE2ICAgICAgICAgZW5hYmxlIFNjaG5laWRlciBhbmQgS29jaCBHMTYgZHJpdmVyCi0gIC0tZW5hYmxlLXNtYzkwMDAgICAgICAgIGVuYWJsZSBTTUM5MDAwIGRyaXZlcgotICAtLWVuYWJsZS10aWFyYSAgICAgICAgICBlbmFibGUgVGlhcmEgZHJpdmVyCisgIC0tZW5hYmxlLXRnMyAgICAgICAgICAgIGVuYWJsZSBCcm9hZGNvbSBUaWdvbjMgZHJpdmVyCiAgIC0tZW5hYmxlLXR1bGlwICAgICAgICAgIGVuYWJsZSBUdWxpcCBkcml2ZXIKKyAgLS1lbmFibGUtdGxhbiAgICAgICAgICAgZW5hYmxlIFRJIFRodW5kZXJMQU4gZHJpdmVyCisgIC0tZW5hYmxlLXVuZGkgICAgICAgICAgIGVuYWJsZSBQWEUgVU5ESSBkcml2ZXIKICAgLS1lbmFibGUtdmlhLXJoaW5lICAgICAgZW5hYmxlIFJoaW5lLUkvSUkgZHJpdmVyCi0gIC0tZW5hYmxlLXc4OWM4NDAgICAgICAgIGVuYWJsZSBXaW5ib25kIFc4OWM4NDAsIENvbXBleCBSTDEwMC1BVFggZHJpdmVyCi0gIC0tZW5hYmxlLTNjNTAzLXNobWVtICAgIHVzZSAzYzUwMyBzaGFyZWQgbWVtb3J5IG1vZGUKLSAgLS1lbmFibGUtM2M1MDMtYXVpICAgICAgdXNlIEFVSSBieSBkZWZhdWx0IG9uIDNjNTAzIGNhcmRzCisgIC0tZW5hYmxlLXc4OWM4NDAgICAgICAgIGVuYWJsZSBXaW5ib25kIFc4OWM4NDAgZHJpdmVyCiAgIC0tZW5hYmxlLWNvbXBleC1ybDIwMDAtZml4CiAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNpZnkgdGhpcyBpZiB5b3UgaGF2ZSBhIENvbXBleCBSTDIwMDAgUENJCi0gIC0tZW5hYmxlLXNtYzkwMDAtc2Nhbj1MSVNUCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHByb2JlIGZvciBTTUM5MDAwIEkvTyBhZGRyZXNzZXMgdXNpbmcgTElTVAogICAtLWVuYWJsZS1uZS1zY2FuPUxJU1QgICBwcm9iZSBmb3IgTkUgYmFzZSBhZGRyZXNzIHVzaW5nIExJU1QKICAgLS1lbmFibGUtd2QtZGVmYXVsdC1tZW09TUVNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldCB0aGUgZGVmYXVsdCBtZW1vcnkgbG9jYXRpb24gZm9yIFdEL1NNQwotICAtLWVuYWJsZS1jcy1zY2FuPUxJU1QgICBwcm9iZSBmb3IgQ1M4OXgwIGJhc2UgYWRkcmVzcyB1c2luZyBMSVNUCiAgIC0tZW5hYmxlLWRpc2tsZXNzICAgICAgIGVuYWJsZSBkaXNrbGVzcyBzdXBwb3J0CiAgIC0tZGlzYWJsZS1oZXJjdWxlcyAgICAgIGRpc2FibGUgaGVyY3VsZXMgdGVybWluYWwgc3VwcG9ydAogICAtLWRpc2FibGUtc2VyaWFsICAgICAgICBkaXNhYmxlIHNlcmlhbCB0ZXJtaW5hbCBzdXBwb3J0CkBAIC01NTU5LDcgKzU1NDQsNyBAQAogCiBmaTsKIGlmIHRlc3QgIngkZW5hYmxlX3BhY2tldF9yZXRyYW5zbWlzc2lvbiIgIT0geG5vOyB0aGVuCi0gIE5FVF9FWFRSQUZMQUdTPSIkTkVUX0VYVFJBRkxBR1MgLURDT05HRVNURUQ9MSIKKyAgTkVUX0VYVFJBRkxBR1M9IiRORVRfRVhUUkFGTEFHUyAtRENPTkdFU1RFRD0xIC1EQ09ORklHX1BDSSIKIGZpCiAKICMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1wY2ktZGlyZWN0IG9yIC0tZGlzYWJsZS1wY2ktZGlyZWN0IHdhcyBnaXZlbi4KQEAgLTU1NzEsMjYgKzU1NTYsNiBAQAogICBORVRfRVhUUkFGTEFHUz0iJE5FVF9FWFRSQUZMQUdTIC1EQ09ORklHX1BDSV9ESVJFQ1Q9MSIKIGZpCiAKLSMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS0zYzUwOSBvciAtLWRpc2FibGUtM2M1MDkgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHtlbmFibGVfM2M1MDkrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZW5hYmxldmFsPSIkZW5hYmxlXzNjNTA5IgotCi1maTsKLWlmIHRlc3QgIngkZW5hYmxlXzNjNTA5IiA9IHh5ZXM7IHRoZW4KLSAgTkVUX0NGTEFHUz0iJE5FVF9DRkxBR1MgLURJTkNMVURFXzNDNTA5IgotICBORVRCT09UX0RSSVZFUlM9IiRORVRCT09UX0RSSVZFUlMgM2M1MDkubyIKLWZpCi0KLSMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS0zYzUyOSBvciAtLWRpc2FibGUtM2M1Mjkgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHtlbmFibGVfM2M1Mjkrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZW5hYmxldmFsPSIkZW5hYmxlXzNjNTI5IgotCi1maTsKLWlmIHRlc3QgIngkZW5hYmxlXzNjNTI5IiA9IHh5ZXM7IHRoZW4KLSAgTkVUX0NGTEFHUz0iJE5FVF9DRkxBR1MgLURJTkNMVURFXzNDNTI5PTEiCi0gIE5FVEJPT1RfRFJJVkVSUz0iJE5FVEJPT1RfRFJJVkVSUyAzYzUyOS5vIgotZmkKLQogIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLTNjNTk1IG9yIC0tZGlzYWJsZS0zYzU5NSB3YXMgZ2l2ZW4uCiBpZiB0ZXN0ICIke2VuYWJsZV8zYzU5NStzZXR9IiA9IHNldDsgdGhlbgogICBlbmFibGV2YWw9IiRlbmFibGVfM2M1OTUiCkBAIC01NjExLDE2ICs1NTc2LDYgQEAKICAgTkVUQk9PVF9EUklWRVJTPSIkTkVUQk9PVF9EUklWRVJTIDNjOTB4Lm8iCiBmaQogCi0jIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtY3M4OXgwIG9yIC0tZGlzYWJsZS1jczg5eDAgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHtlbmFibGVfY3M4OXgwK3NldH0iID0gc2V0OyB0aGVuCi0gIGVuYWJsZXZhbD0iJGVuYWJsZV9jczg5eDAiCi0KLWZpOwotaWYgdGVzdCAieCRlbmFibGVfY3M4OXgwIiA9IHh5ZXM7IHRoZW4KLSAgTkVUX0NGTEFHUz0iJE5FVF9DRkxBR1MgLURJTkNMVURFX0NTODlYMD0xIgotICBORVRCT09UX0RSSVZFUlM9IiRORVRCT09UX0RSSVZFUlMgY3M4OXgwLm8iCi1maQotCiAjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtZGF2aWNvbSBvciAtLWRpc2FibGUtZGF2aWNvbSB3YXMgZ2l2ZW4uCiBpZiB0ZXN0ICIke2VuYWJsZV9kYXZpY29tK3NldH0iID0gc2V0OyB0aGVuCiAgIGVuYWJsZXZhbD0iJGVuYWJsZV9kYXZpY29tIgpAQCAtNTYzMSwyNCArNTU4NiwxNCBAQAogICBORVRCT09UX0RSSVZFUlM9IiRORVRCT09UX0RSSVZFUlMgZGF2aWNvbS5vIgogZmkKIAotIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLWRlcGNhIG9yIC0tZGlzYWJsZS1kZXBjYSB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke2VuYWJsZV9kZXBjYStzZXR9IiA9IHNldDsgdGhlbgotICBlbmFibGV2YWw9IiRlbmFibGVfZGVwY2EiCisjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtZTEwMDAgb3IgLS1kaXNhYmxlLWUxMDAwIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7ZW5hYmxlX2UxMDAwK3NldH0iID0gc2V0OyB0aGVuCisgIGVuYWJsZXZhbD0iJGVuYWJsZV9lMTAwMCIKIAogZmk7Ci1pZiB0ZXN0ICJ4JGVuYWJsZV9kZXBjYSIgPSB4eWVzOyB0aGVuCi0gIE5FVF9DRkxBR1M9IiRORVRfQ0ZMQUdTIC1ESU5DTFVERV9ERVBDQT0xIgotICBORVRCT09UX0RSSVZFUlM9IiRORVRCT09UX0RSSVZFUlMgZGVwY2EubyIKLWZpCi0KLSMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1lZXBybyBvciAtLWRpc2FibGUtZWVwcm8gd2FzIGdpdmVuLgotaWYgdGVzdCAiJHtlbmFibGVfZWVwcm8rc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZW5hYmxldmFsPSIkZW5hYmxlX2VlcHJvIgotCi1maTsKLWlmIHRlc3QgIngkZW5hYmxlX2VlcHJvIiA9IHh5ZXM7IHRoZW4KLSAgTkVUX0NGTEFHUz0iJE5FVF9DRkxBR1MgLURJTkNMVURFX0VFUFJPPTEiCi0gIE5FVEJPT1RfRFJJVkVSUz0iJE5FVEJPT1RfRFJJVkVSUyBlZXByby5vIgoraWYgdGVzdCAieCRlbmFibGVfZTEwMDAiID0geHllczsgdGhlbgorICBORVRfQ0ZMQUdTPSIkTkVUX0NGTEFHUyAtRElOQ0xVREVfRTEwMDA9MSIKKyAgTkVUQk9PVF9EUklWRVJTPSIkTkVUQk9PVF9EUklWRVJTIGUxMDAwLm8iCiBmaQogCiAjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtZWVwcm8xMDAgb3IgLS1kaXNhYmxlLWVlcHJvMTAwIHdhcyBnaXZlbi4KQEAgLTU2NzEsNjQgKzU2MTYsMTQgQEAKICAgTkVUQk9PVF9EUklWRVJTPSIkTkVUQk9PVF9EUklWRVJTIGVwaWMxMDAubyIKIGZpCiAKLSMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS0zYzUwNyBvciAtLWRpc2FibGUtM2M1MDcgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHtlbmFibGVfM2M1MDcrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZW5hYmxldmFsPSIkZW5hYmxlXzNjNTA3IgotCi1maTsKLWlmIHRlc3QgIngkZW5hYmxlXzNjNTA3IiA9IHh5ZXM7IHRoZW4KLSAgTkVUX0NGTEFHUz0iJE5FVF9DRkxBR1MgLURJTkNMVURFXzNDNTA3PTEiCi0gIE5FVEJPT1RfRFJJVkVSUz0iJE5FVEJPT1RfRFJJVkVSUyAzYzUwNy5vIgotZmkKLQotIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLWV4b3MyMDUgb3IgLS1kaXNhYmxlLWV4b3MyMDUgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHtlbmFibGVfZXhvczIwNStzZXR9IiA9IHNldDsgdGhlbgotICBlbmFibGV2YWw9IiRlbmFibGVfZXhvczIwNSIKLQotZmk7Ci1pZiB0ZXN0ICJ4JGVuYWJsZV9leG9zMjA1IiA9IHh5ZXM7IHRoZW4KLSAgTkVUX0NGTEFHUz0iJE5FVF9DRkxBR1MgLURJTkNMVURFX0VYT1MyMDU9MSIKLSAgTkVUQk9PVF9EUklWRVJTPSIkTkVUQk9PVF9EUklWRVJTIGV4b3MyMDUubyIKLWZpCi0KLSMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1uaTUyMTAgb3IgLS1kaXNhYmxlLW5pNTIxMCB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke2VuYWJsZV9uaTUyMTArc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZW5hYmxldmFsPSIkZW5hYmxlX25pNTIxMCIKLQotZmk7Ci1pZiB0ZXN0ICJ4JGVuYWJsZV9uaTUyMTAiID0geHllczsgdGhlbgotICBORVRfQ0ZMQUdTPSIkTkVUX0NGTEFHUyAtRElOQ0xVREVfTkk1MjEwPTEiCi0gIE5FVEJPT1RfRFJJVkVSUz0iJE5FVEJPT1RfRFJJVkVSUyBuaTUyMTAubyIKLWZpCi0KLSMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1sYW5jZSBvciAtLWRpc2FibGUtbGFuY2Ugd2FzIGdpdmVuLgotaWYgdGVzdCAiJHtlbmFibGVfbGFuY2Urc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZW5hYmxldmFsPSIkZW5hYmxlX2xhbmNlIgotCi1maTsKLWlmIHRlc3QgIngkZW5hYmxlX2xhbmNlIiA9IHh5ZXM7IHRoZW4KLSAgTkVUX0NGTEFHUz0iJE5FVF9DRkxBR1MgLURJTkNMVURFX0xBTkNFPTEiCi0gIE5FVEJPT1RfRFJJVkVSUz0iJE5FVEJPT1RfRFJJVkVSUyBsYW5jZS5vIgotZmkKLQotIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLW5lMjEwMCBvciAtLWRpc2FibGUtbmUyMTAwIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7ZW5hYmxlX25lMjEwMCtzZXR9IiA9IHNldDsgdGhlbgotICBlbmFibGV2YWw9IiRlbmFibGVfbmUyMTAwIgotCi1maTsKLWlmIHRlc3QgIngkZW5hYmxlX25lMjEwMCIgPSB4eWVzOyB0aGVuCi0gIE5FVF9DRkxBR1M9IiRORVRfQ0ZMQUdTIC1ESU5DTFVERV9ORTIxMDA9MSIKLSAgTkVUQk9PVF9EUklWRVJTPSIkTkVUQk9PVF9EUklWRVJTIG5lMjEwMC5vIgotZmkKLQotIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLW5pNjUxMCBvciAtLWRpc2FibGUtbmk2NTEwIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7ZW5hYmxlX25pNjUxMCtzZXR9IiA9IHNldDsgdGhlbgotICBlbmFibGV2YWw9IiRlbmFibGVfbmk2NTEwIgorIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLWZvcmNlZGV0aCBvciAtLWRpc2FibGUtZm9yY2VkZXRoIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7ZW5hYmxlX2ZvcmNlZGV0aCtzZXR9IiA9IHNldDsgdGhlbgorICBlbmFibGV2YWw9IiRlbmFibGVfZm9yY2VkZXRoIgogCiBmaTsKLWlmIHRlc3QgIngkZW5hYmxlX25pNjUxMCIgPSB4eWVzOyB0aGVuCi0gIE5FVF9DRkxBR1M9IiRORVRfQ0ZMQUdTIC1ESU5DTFVERV9OSTY1MTA9MSIKLSAgTkVUQk9PVF9EUklWRVJTPSIkTkVUQk9PVF9EUklWRVJTIG5pNjUxMC5vIgoraWYgdGVzdCAieCRlbmFibGVfZm9yY2VkZXRoIiA9IHh5ZXM7IHRoZW4KKyAgTkVUX0NGTEFHUz0iJE5FVF9DRkxBR1MgLURJTkNMVURFX0ZPUkNFREVUSD0xIgorICBORVRCT09UX0RSSVZFUlM9IiRORVRCT09UX0RSSVZFUlMgZm9yY2VkZXRoLm8iCiBmaQogCiAjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtbmF0c2VtaSBvciAtLWRpc2FibGUtbmF0c2VtaSB3YXMgZ2l2ZW4uCkBAIC01NzQxLDM0ICs1NjM2LDE0IEBACiAgIE5FVEJPT1RfRFJJVkVSUz0iJE5FVEJPT1RfRFJJVkVSUyBuYXRzZW1pLm8iCiBmaQogCi0jIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtbmk1MDEwIG9yIC0tZGlzYWJsZS1uaTUwMTAgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHtlbmFibGVfbmk1MDEwK3NldH0iID0gc2V0OyB0aGVuCi0gIGVuYWJsZXZhbD0iJGVuYWJsZV9uaTUwMTAiCisjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtbnM4MzgyMCBvciAtLWRpc2FibGUtbnM4MzgyMCB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke2VuYWJsZV9uczgzODIwK3NldH0iID0gc2V0OyB0aGVuCisgIGVuYWJsZXZhbD0iJGVuYWJsZV9uczgzODIwIgogCiBmaTsKLWlmIHRlc3QgIngkZW5hYmxlX25pNTAxMCIgPSB4eWVzOyB0aGVuCi0gIE5FVF9DRkxBR1M9IiRORVRfQ0ZMQUdTIC1ESU5DTFVERV9OSTUwMTA9MSIKLSAgTkVUQk9PVF9EUklWRVJTPSIkTkVUQk9PVF9EUklWRVJTIG5pNTAxMC5vIgotZmkKLQotIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLTNjNTAzIG9yIC0tZGlzYWJsZS0zYzUwMyB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke2VuYWJsZV8zYzUwMytzZXR9IiA9IHNldDsgdGhlbgotICBlbmFibGV2YWw9IiRlbmFibGVfM2M1MDMiCi0KLWZpOwotaWYgdGVzdCAieCRlbmFibGVfM2M1MDMiID0geHllczsgdGhlbgotICBORVRfQ0ZMQUdTPSIkTkVUX0NGTEFHUyAtRElOQ0xVREVfM0M1MDM9MSIKLSAgTkVUQk9PVF9EUklWRVJTPSIkTkVUQk9PVF9EUklWRVJTIDNjNTAzLm8iCi1maQotCi0jIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtbmUgb3IgLS1kaXNhYmxlLW5lIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7ZW5hYmxlX25lK3NldH0iID0gc2V0OyB0aGVuCi0gIGVuYWJsZXZhbD0iJGVuYWJsZV9uZSIKLQotZmk7Ci1pZiB0ZXN0ICJ4JGVuYWJsZV9uZSIgPSB4eWVzOyB0aGVuCi0gIE5FVF9DRkxBR1M9IiRORVRfQ0ZMQUdTIC1ESU5DTFVERV9ORT0xIgotICBORVRCT09UX0RSSVZFUlM9IiRORVRCT09UX0RSSVZFUlMgbmUubyIKK2lmIHRlc3QgIngkZW5hYmxlX25zODM4MjAiID0geHllczsgdGhlbgorICBORVRfQ0ZMQUdTPSIkTkVUX0NGTEFHUyAtRElOQ0xVREVfTlM4MzgyMD0xIgorICBORVRCT09UX0RSSVZFUlM9IiRORVRCT09UX0RSSVZFUlMgbnM4MzgyMC5vIgogZmkKIAogIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLW5zODM5MCBvciAtLWRpc2FibGUtbnM4MzkwIHdhcyBnaXZlbi4KQEAgLTU3ODEsMjQgKzU2NTYsMjQgQEAKICAgTkVUQk9PVF9EUklWRVJTPSIkTkVUQk9PVF9EUklWRVJTIG5zODM5MC5vIgogZmkKIAotIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXdkIG9yIC0tZGlzYWJsZS13ZCB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke2VuYWJsZV93ZCtzZXR9IiA9IHNldDsgdGhlbgotICBlbmFibGV2YWw9IiRlbmFibGVfd2QiCisjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtcGNuZXQzMiBvciAtLWRpc2FibGUtcGNuZXQzMiB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke2VuYWJsZV9wY25ldDMyK3NldH0iID0gc2V0OyB0aGVuCisgIGVuYWJsZXZhbD0iJGVuYWJsZV9wY25ldDMyIgogCiBmaTsKLWlmIHRlc3QgIngkZW5hYmxlX3dkIiA9IHh5ZXM7IHRoZW4KLSAgTkVUX0NGTEFHUz0iJE5FVF9DRkxBR1MgLURJTkNMVURFX1dEPTEiCi0gIE5FVEJPT1RfRFJJVkVSUz0iJE5FVEJPT1RfRFJJVkVSUyB3ZC5vIgoraWYgdGVzdCAieCRlbmFibGVfcGNuZXQzMiIgPSB4eWVzOyB0aGVuCisgIE5FVF9DRkxBR1M9IiRORVRfQ0ZMQUdTIC1ESU5DTFVERV9QQ05FVDMyPTEiCisgIE5FVEJPT1RfRFJJVkVSUz0iJE5FVEJPT1RfRFJJVkVSUyBwY25ldDMyLm8iCiBmaQogCi0jIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtb3R1bGlwIG9yIC0tZGlzYWJsZS1vdHVsaXAgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHtlbmFibGVfb3R1bGlwK3NldH0iID0gc2V0OyB0aGVuCi0gIGVuYWJsZXZhbD0iJGVuYWJsZV9vdHVsaXAiCisjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtcG5pYyBvciAtLWRpc2FibGUtcG5pYyB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke2VuYWJsZV9wbmljK3NldH0iID0gc2V0OyB0aGVuCisgIGVuYWJsZXZhbD0iJGVuYWJsZV9wbmljIgogCiBmaTsKLWlmIHRlc3QgIngkZW5hYmxlX290dWxpcCIgPSB4eWVzOyB0aGVuCi0gIE5FVF9DRkxBR1M9IiRORVRfQ0ZMQUdTIC1ESU5DTFVERV9PVFVMSVA9MSIKLSAgTkVUQk9PVF9EUklWRVJTPSIkTkVUQk9PVF9EUklWRVJTIG90dWxpcC5vIgoraWYgdGVzdCAieCRlbmFibGVfcG5pYyIgPSB4eWVzOyB0aGVuCisgIE5FVF9DRkxBR1M9IiRORVRfQ0ZMQUdTIC1ESU5DTFVERV9QTklDPTEiCisgIE5FVEJPT1RfRFJJVkVSUz0iJE5FVEJPT1RfRFJJVkVSUyBwbmljLm8iCiBmaQogCiAjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtcnRsODEzOSBvciAtLWRpc2FibGUtcnRsODEzOSB3YXMgZ2l2ZW4uCkBAIC01ODExLDYgKzU2ODYsMTYgQEAKICAgTkVUQk9PVF9EUklWRVJTPSIkTkVUQk9PVF9EUklWRVJTIHJ0bDgxMzkubyIKIGZpCiAKKyMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1yODE2OSBvciAtLWRpc2FibGUtcjgxNjkgd2FzIGdpdmVuLgoraWYgdGVzdCAiJHtlbmFibGVfcjgxNjkrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZW5hYmxldmFsPSIkZW5hYmxlX3I4MTY5IgorCitmaTsKK2lmIHRlc3QgIngkZW5hYmxlX3I4MTY5IiA9IHh5ZXM7IHRoZW4KKyAgTkVUX0NGTEFHUz0iJE5FVF9DRkxBR1MgLURJTkNMVURFX1I4MTY5PTEiCisgIE5FVEJPT1RfRFJJVkVSUz0iJE5FVEJPT1RfRFJJVkVSUyByODE2OS5vIgorZmkKKwogIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXNpczkwMCBvciAtLWRpc2FibGUtc2lzOTAwIHdhcyBnaXZlbi4KIGlmIHRlc3QgIiR7ZW5hYmxlX3NpczkwMCtzZXR9IiA9IHNldDsgdGhlbgogICBlbmFibGV2YWw9IiRlbmFibGVfc2lzOTAwIgpAQCAtNTgyMSwzNCArNTcwNiwxNCBAQAogICBORVRCT09UX0RSSVZFUlM9IiRORVRCT09UX0RSSVZFUlMgc2lzOTAwLm8iCiBmaQogCi0jIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtc2stZzE2IG9yIC0tZGlzYWJsZS1zay1nMTYgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHtlbmFibGVfc2tfZzE2K3NldH0iID0gc2V0OyB0aGVuCi0gIGVuYWJsZXZhbD0iJGVuYWJsZV9za19nMTYiCi0KLWZpOwotaWYgdGVzdCAieCRlbmFibGVfc2tfZzE2IiA9IHh5ZXM7IHRoZW4KLSAgTkVUX0NGTEFHUz0iJE5FVF9DRkxBR1MgLURJTkNMVURFX1NLX0cxNj0xIgotICBORVRCT09UX0RSSVZFUlM9IiRORVRCT09UX0RSSVZFUlMgc2tfZzE2Lm8iCi1maQotCi0jIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtc21jOTAwMCBvciAtLWRpc2FibGUtc21jOTAwMCB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke2VuYWJsZV9zbWM5MDAwK3NldH0iID0gc2V0OyB0aGVuCi0gIGVuYWJsZXZhbD0iJGVuYWJsZV9zbWM5MDAwIgotCi1maTsKLWlmIHRlc3QgIngkZW5hYmxlX3NtYzkwMDAiID0geHllczsgdGhlbgotICBORVRfQ0ZMQUdTPSIkTkVUX0NGTEFHUyAtRElOQ0xVREVfU01DOTAwMD0xIgotICBORVRCT09UX0RSSVZFUlM9IiRORVRCT09UX0RSSVZFUlMgc21jOTAwMC5vIgotZmkKLQotIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXRpYXJhIG9yIC0tZGlzYWJsZS10aWFyYSB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke2VuYWJsZV90aWFyYStzZXR9IiA9IHNldDsgdGhlbgotICBlbmFibGV2YWw9IiRlbmFibGVfdGlhcmEiCisjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtdGczIG9yIC0tZGlzYWJsZS10ZzMgd2FzIGdpdmVuLgoraWYgdGVzdCAiJHtlbmFibGVfdGczK3NldH0iID0gc2V0OyB0aGVuCisgIGVuYWJsZXZhbD0iJGVuYWJsZV90ZzMiCiAKIGZpOwotaWYgdGVzdCAieCRlbmFibGVfdGlhcmEiID0geHllczsgdGhlbgotICBORVRfQ0ZMQUdTPSIkTkVUX0NGTEFHUyAtRElOQ0xVREVfVElBUkE9MSIKLSAgTkVUQk9PVF9EUklWRVJTPSIkTkVUQk9PVF9EUklWRVJTIHRpYXJhLm8iCitpZiB0ZXN0ICJ4JGVuYWJsZV90ZzMiID0geHllczsgdGhlbgorICBORVRfQ0ZMQUdTPSIkTkVUX0NGTEFHUyAtRElOQ0xVREVfVEczPTEiCisgIE5FVEJPT1RfRFJJVkVSUz0iJE5FVEJPT1RfRFJJVkVSUyB0ZzMubyIKIGZpCiAKICMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS10dWxpcCBvciAtLWRpc2FibGUtdHVsaXAgd2FzIGdpdmVuLgpAQCAtNTg2MSw2ICs1NzI2LDE2IEBACiAgIE5FVEJPT1RfRFJJVkVSUz0iJE5FVEJPT1RfRFJJVkVSUyB0dWxpcC5vIgogZmkKIAorIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXRsYW4gb3IgLS1kaXNhYmxlLXRsYW4gd2FzIGdpdmVuLgoraWYgdGVzdCAiJHtlbmFibGVfdGxhbitzZXR9IiA9IHNldDsgdGhlbgorICBlbmFibGV2YWw9IiRlbmFibGVfdGxhbiIKKworZmk7CitpZiB0ZXN0ICJ4JGVuYWJsZV90bGFuIiA9IHh5ZXM7IHRoZW4KKyAgTkVUX0NGTEFHUz0iJE5FVF9DRkxBR1MgLURJTkNMVURFX1RMQU49MSIKKyAgTkVUQk9PVF9EUklWRVJTPSIkTkVUQk9PVF9EUklWRVJTIHRsYW4ubyIKK2ZpCisKICMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS12aWEtcmhpbmUgb3IgLS1kaXNhYmxlLXZpYS1yaGluZSB3YXMgZ2l2ZW4uCiBpZiB0ZXN0ICIke2VuYWJsZV92aWFfcmhpbmUrc2V0fSIgPSBzZXQ7IHRoZW4KICAgZW5hYmxldmFsPSIkZW5hYmxlX3ZpYV9yaGluZSIKQEAgLTU4OTUsMjQgKzU3NzAsNiBAQAogICBGU1lTX0NGTEFHUz0iJEZTWVNfQ0ZMQUdTIC1ERlNZU19URlRQPTEiCiBmaQogCi0jIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtM2M1MDMtc2htZW0gb3IgLS1kaXNhYmxlLTNjNTAzLXNobWVtIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7ZW5hYmxlXzNjNTAzX3NobWVtK3NldH0iID0gc2V0OyB0aGVuCi0gIGVuYWJsZXZhbD0iJGVuYWJsZV8zYzUwM19zaG1lbSIKLQotZmk7Ci1pZiB0ZXN0ICJ4JGVuYWJsZV8zYzUwM19zaG1lbSIgPSB4eWVzOyB0aGVuCi0gIE5FVF9FWFRSQUZMQUdTPSIkTkVUX0VYVFJBRkxBR1MgLURUNTAzX1NITUVNPTEiCi1maQotCi0jIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtM2M1MDMtYXVpIG9yIC0tZGlzYWJsZS0zYzUwMy1hdWkgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHtlbmFibGVfM2M1MDNfYXVpK3NldH0iID0gc2V0OyB0aGVuCi0gIGVuYWJsZXZhbD0iJGVuYWJsZV8zYzUwM19hdWkiCi0KLWZpOwotaWYgdGVzdCAieCRlbmFibGVfM2M1MDNfYXVpIiA9IHh5ZXM7IHRoZW4KLSAgTkVUX0VYVFJBRkxBR1M9IiRORVRfRVhUUkFGTEFHUyAtRFQ1MDNfQVVJPTEiCi1maQotCiAjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtY29tcGV4LXJsMjAwMC1maXggb3IgLS1kaXNhYmxlLWNvbXBleC1ybDIwMDAtZml4IHdhcyBnaXZlbi4KIGlmIHRlc3QgIiR7ZW5hYmxlX2NvbXBleF9ybDIwMDBfZml4K3NldH0iID0gc2V0OyB0aGVuCiAgIGVuYWJsZXZhbD0iJGVuYWJsZV9jb21wZXhfcmwyMDAwX2ZpeCIKQEAgLTU5MjIsMTIgKzU3NzksNiBAQAogICBORVRfRVhUUkFGTEFHUz0iJE5FVF9FWFRSQUZMQUdTIC1EQ09NUEVYX1JMMjAwMF9GSVg9MSIKIGZpCiAKLSMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1zbWM5MDAwLXNjYW4gb3IgLS1kaXNhYmxlLXNtYzkwMDAtc2NhbiB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke2VuYWJsZV9zbWM5MDAwX3NjYW4rc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZW5hYmxldmFsPSIkZW5hYmxlX3NtYzkwMDBfc2NhbiIKLSAgTkVUX0VYVFJBRkxBR1M9IiRORVRfRVhUUkFGTEFHUyAtRFNNQzkwMDBfU0NBTj0kZW5hYmxlX3NtYzkwMDBfc2NhbiIKLWZpOwotCiAjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtbmUtc2NhbiBvciAtLWRpc2FibGUtbmUtc2NhbiB3YXMgZ2l2ZW4uCiBpZiB0ZXN0ICIke2VuYWJsZV9uZV9zY2FuK3NldH0iID0gc2V0OyB0aGVuCiAgIGVuYWJsZXZhbD0iJGVuYWJsZV9uZV9zY2FuIgpAQCAtNTk0NCwxMiArNTc5NSw2IEBACiAgIE5FVF9FWFRSQUZMQUdTPSIkTkVUX0VYVFJBRkxBR1MgLURXRF9ERUZBVUxUX01FTT0weENDMDAwIgogZmk7CiAKLSMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1jcy1zY2FuIG9yIC0tZGlzYWJsZS1jcy1zY2FuIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7ZW5hYmxlX2NzX3NjYW4rc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZW5hYmxldmFsPSIkZW5hYmxlX2NzX3NjYW4iCi0gIE5FVF9FWFRSQUZMQUdTPSIkTkVUX0VYVFJBRkxBR1MgLURDU19TQ0FOPSRlbmFibGVfY3Nfc2NhbiIKLWZpOwotCiAjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtZGlza2xlc3Mgb3IgLS1kaXNhYmxlLWRpc2tsZXNzIHdhcyBnaXZlbi4KIGlmIHRlc3QgIiR7ZW5hYmxlX2Rpc2tsZXNzK3NldH0iID0gc2V0OyB0aGVuCiAgIGVuYWJsZXZhbD0iJGVuYWJsZV9kaXNrbGVzcyIKZGlmZiAtTmF1ciBncnViLTAuOTcub3JpZy9jb25maWd1cmUuYWMgZ3J1Yi0wLjk3L2NvbmZpZ3VyZS5hYwotLS0gZ3J1Yi0wLjk3Lm9yaWcvY29uZmlndXJlLmFjCTIwMDUtMDUtMDggMDI6MzY6MDMuMDAwMDAwMDAwICswMDAwCisrKyBncnViLTAuOTcvY29uZmlndXJlLmFjCTIwMDUtMDktMDEgMDA6MTY6MDUuMDAwMDAwMDAwICswMDAwCkBAIC0zMTcsNyArMzE3LDcgQEAKICAgWyAgLS1kaXNhYmxlLXBhY2tldC1yZXRyYW5zbWlzc2lvbgogICAgICAgICAgICAgICAgICAgICAgICAgICB0dXJuIG9mZiBwYWNrZXQgcmV0cmFuc21pc3Npb25dKQogaWYgdGVzdCAieCRlbmFibGVfcGFja2V0X3JldHJhbnNtaXNzaW9uIiAhPSB4bm87IHRoZW4KLSAgTkVUX0VYVFJBRkxBR1M9IiRORVRfRVhUUkFGTEFHUyAtRENPTkdFU1RFRD0xIgorICBORVRfRVhUUkFGTEFHUz0iJE5FVF9FWFRSQUZMQUdTIC1EQ09OR0VTVEVEPTEgLURDT05GSUdfUENJIgogZmkKIAogQUNfQVJHX0VOQUJMRShwY2ktZGlyZWN0LApAQCAtMzI3LDIwICszMjcsNiBAQAogZmkKIAogZG5sIERldmljZSBkcml2ZXJzLgotQUNfQVJHX0VOQUJMRSgzYzUwOSwKLSAgWyAgLS1lbmFibGUtM2M1MDkgICAgICAgICAgZW5hYmxlIDNDb201MDkgZHJpdmVyXSkKLWlmIHRlc3QgIngkZW5hYmxlXzNjNTA5IiA9IHh5ZXM7IHRoZW4KLSAgTkVUX0NGTEFHUz0iJE5FVF9DRkxBR1MgLURJTkNMVURFXzNDNTA5IgotICBORVRCT09UX0RSSVZFUlM9IiRORVRCT09UX0RSSVZFUlMgM2M1MDkubyIKLWZpCi0KLUFDX0FSR19FTkFCTEUoM2M1MjksCi0gIFsgIC0tZW5hYmxlLTNjNTI5ICAgICAgICAgIGVuYWJsZSAzQ29tNTI5IGRyaXZlcl0pCi1pZiB0ZXN0ICJ4JGVuYWJsZV8zYzUyOSIgPSB4eWVzOyB0aGVuCi0gIE5FVF9DRkxBR1M9IiRORVRfQ0ZMQUdTIC1ESU5DTFVERV8zQzUyOT0xIgotICBORVRCT09UX0RSSVZFUlM9IiRORVRCT09UX0RSSVZFUlMgM2M1MjkubyIKLWZpCi0KIEFDX0FSR19FTkFCTEUoM2M1OTUsCiAgIFsgIC0tZW5hYmxlLTNjNTk1ICAgICAgICAgIGVuYWJsZSAzQ29tNTk1IGRyaXZlcl0pCiBpZiB0ZXN0ICJ4JGVuYWJsZV8zYzU5NSIgPSB4eWVzOyB0aGVuCkBAIC0zNTUsMTMgKzM0MSw2IEBACiAgIE5FVEJPT1RfRFJJVkVSUz0iJE5FVEJPT1RfRFJJVkVSUyAzYzkweC5vIgogZmkKIAotQUNfQVJHX0VOQUJMRShjczg5eDAsCi0gIFsgIC0tZW5hYmxlLWNzODl4MCAgICAgICAgIGVuYWJsZSBDUzg5eDAgZHJpdmVyXSkKLWlmIHRlc3QgIngkZW5hYmxlX2NzODl4MCIgPSB4eWVzOyB0aGVuCi0gIE5FVF9DRkxBR1M9IiRORVRfQ0ZMQUdTIC1ESU5DTFVERV9DUzg5WDA9MSIKLSAgTkVUQk9PVF9EUklWRVJTPSIkTkVUQk9PVF9EUklWRVJTIGNzODl4MC5vIgotZmkKLQogQUNfQVJHX0VOQUJMRShkYXZpY29tLAogICBbICAtLWVuYWJsZS1kYXZpY29tICAgICAgICBlbmFibGUgRGF2aWNvbSBkcml2ZXJdKQogaWYgdGVzdCAieCRlbmFibGVfZGF2aWNvbSIgPSB4eWVzOyB0aGVuCkBAIC0zNjksMTggKzM0OCwxMSBAQAogICBORVRCT09UX0RSSVZFUlM9IiRORVRCT09UX0RSSVZFUlMgZGF2aWNvbS5vIgogZmkKIAotQUNfQVJHX0VOQUJMRShkZXBjYSwKLSAgWyAgLS1lbmFibGUtZGVwY2EgICAgICAgICAgZW5hYmxlIERFUENBIGFuZCBFdGhlcldPUktTIGRyaXZlcl0pCi1pZiB0ZXN0ICJ4JGVuYWJsZV9kZXBjYSIgPSB4eWVzOyB0aGVuCi0gIE5FVF9DRkxBR1M9IiRORVRfQ0ZMQUdTIC1ESU5DTFVERV9ERVBDQT0xIgotICBORVRCT09UX0RSSVZFUlM9IiRORVRCT09UX0RSSVZFUlMgZGVwY2EubyIKLWZpCi0KLUFDX0FSR19FTkFCTEUoZWVwcm8sCi0gIFsgIC0tZW5hYmxlLWVlcHJvICAgICAgICAgIGVuYWJsZSBFdGhlcmV4cHJlc3MgUHJvLzEwIGRyaXZlcl0pCi1pZiB0ZXN0ICJ4JGVuYWJsZV9lZXBybyIgPSB4eWVzOyB0aGVuCi0gIE5FVF9DRkxBR1M9IiRORVRfQ0ZMQUdTIC1ESU5DTFVERV9FRVBSTz0xIgotICBORVRCT09UX0RSSVZFUlM9IiRORVRCT09UX0RSSVZFUlMgZWVwcm8ubyIKK0FDX0FSR19FTkFCTEUoZTEwMDAsCisgIFsgIC0tZW5hYmxlLWUxMDAwICAgICAgICAgIGVuYWJsZSBFdGhlcmV4cHJlc3MgUHJvLzEwMDAgZHJpdmVyXSkKK2lmIHRlc3QgIngkZW5hYmxlX2UxMDAwIiA9IHh5ZXM7IHRoZW4KKyAgTkVUX0NGTEFHUz0iJE5FVF9DRkxBR1MgLURJTkNMVURFX0UxMDAwPTEiCisgIE5FVEJPT1RfRFJJVkVSUz0iJE5FVEJPT1RfRFJJVkVSUyBlMTAwMC5vIgogZmkKIAogQUNfQVJHX0VOQUJMRShlZXBybzEwMCwKQEAgLTM5Nyw0NiArMzY5LDExIEBACiAgIE5FVEJPT1RfRFJJVkVSUz0iJE5FVEJPT1RfRFJJVkVSUyBlcGljMTAwLm8iCiBmaQogCi1BQ19BUkdfRU5BQkxFKDNjNTA3LAotICBbICAtLWVuYWJsZS0zYzUwNyAgICAgICAgICBlbmFibGUgM0NvbTUwNyBkcml2ZXJdKQotaWYgdGVzdCAieCRlbmFibGVfM2M1MDciID0geHllczsgdGhlbgotICBORVRfQ0ZMQUdTPSIkTkVUX0NGTEFHUyAtRElOQ0xVREVfM0M1MDc9MSIKLSAgTkVUQk9PVF9EUklWRVJTPSIkTkVUQk9PVF9EUklWRVJTIDNjNTA3Lm8iCi1maQotCi1BQ19BUkdfRU5BQkxFKGV4b3MyMDUsCi0gIFsgIC0tZW5hYmxlLWV4b3MyMDUgICAgICAgIGVuYWJsZSBFWE9TMjA1IGRyaXZlcl0pCi1pZiB0ZXN0ICJ4JGVuYWJsZV9leG9zMjA1IiA9IHh5ZXM7IHRoZW4KLSAgTkVUX0NGTEFHUz0iJE5FVF9DRkxBR1MgLURJTkNMVURFX0VYT1MyMDU9MSIKLSAgTkVUQk9PVF9EUklWRVJTPSIkTkVUQk9PVF9EUklWRVJTIGV4b3MyMDUubyIKLWZpCi0KLUFDX0FSR19FTkFCTEUobmk1MjEwLAotICBbICAtLWVuYWJsZS1uaTUyMTAgICAgICAgICBlbmFibGUgUmFjYWwtSW50ZXJsYW4gTkk1MjEwIGRyaXZlcl0pCi1pZiB0ZXN0ICJ4JGVuYWJsZV9uaTUyMTAiID0geHllczsgdGhlbgotICBORVRfQ0ZMQUdTPSIkTkVUX0NGTEFHUyAtRElOQ0xVREVfTkk1MjEwPTEiCi0gIE5FVEJPT1RfRFJJVkVSUz0iJE5FVEJPT1RfRFJJVkVSUyBuaTUyMTAubyIKLWZpCi0KLUFDX0FSR19FTkFCTEUobGFuY2UsCi0gIFsgIC0tZW5hYmxlLWxhbmNlICAgICAgICAgIGVuYWJsZSBMYW5jZSBQQ0kgUENOZXQvMzIgZHJpdmVyXSkKLWlmIHRlc3QgIngkZW5hYmxlX2xhbmNlIiA9IHh5ZXM7IHRoZW4KLSAgTkVUX0NGTEFHUz0iJE5FVF9DRkxBR1MgLURJTkNMVURFX0xBTkNFPTEiCi0gIE5FVEJPT1RfRFJJVkVSUz0iJE5FVEJPT1RfRFJJVkVSUyBsYW5jZS5vIgotZmkKLQotQUNfQVJHX0VOQUJMRShuZTIxMDAsCi0gIFsgIC0tZW5hYmxlLW5lMjEwMCAgICAgICAgIGVuYWJsZSBOb3ZlbGwgTkUyMTAwIGRyaXZlcl0pCi1pZiB0ZXN0ICJ4JGVuYWJsZV9uZTIxMDAiID0geHllczsgdGhlbgotICBORVRfQ0ZMQUdTPSIkTkVUX0NGTEFHUyAtRElOQ0xVREVfTkUyMTAwPTEiCi0gIE5FVEJPT1RfRFJJVkVSUz0iJE5FVEJPT1RfRFJJVkVSUyBuZTIxMDAubyIKLWZpCi0KLUFDX0FSR19FTkFCTEUobmk2NTEwLAotICBbICAtLWVuYWJsZS1uaTY1MTAgICAgICAgICBlbmFibGUgUmFjYWwtSW50ZXJsYW4gTkk2NTEwIGRyaXZlcl0pCi1pZiB0ZXN0ICJ4JGVuYWJsZV9uaTY1MTAiID0geHllczsgdGhlbgotICBORVRfQ0ZMQUdTPSIkTkVUX0NGTEFHUyAtRElOQ0xVREVfTkk2NTEwPTEiCi0gIE5FVEJPT1RfRFJJVkVSUz0iJE5FVEJPT1RfRFJJVkVSUyBuaTY1MTAubyIKK0FDX0FSR19FTkFCTEUoZm9yY2VkZXRoLAorICBbICAtLWVuYWJsZS1mb3JjZWRldGggICAgICBlbmFibGUgTnZpZGlhIEdlZm9yY2UgZHJpdmVyXSkKK2lmIHRlc3QgIngkZW5hYmxlX2ZvcmNlZGV0aCIgPSB4eWVzOyB0aGVuCisgIE5FVF9DRkxBR1M9IiRORVRfQ0ZMQUdTIC1ESU5DTFVERV9GT1JDRURFVEg9MSIKKyAgTkVUQk9PVF9EUklWRVJTPSIkTkVUQk9PVF9EUklWRVJTIGZvcmNlZGV0aC5vIgogZmkKIAogQUNfQVJHX0VOQUJMRShuYXRzZW1pLApAQCAtNDQ2LDI1ICszODMsMTEgQEAKICAgTkVUQk9PVF9EUklWRVJTPSIkTkVUQk9PVF9EUklWRVJTIG5hdHNlbWkubyIKIGZpCiAKLUFDX0FSR19FTkFCTEUobmk1MDEwLAotICBbICAtLWVuYWJsZS1uaTUwMTAgICAgICAgICBlbmFibGUgUmFjYWwtSW50ZXJsYW4gTkk1MDEwIGRyaXZlcl0pCi1pZiB0ZXN0ICJ4JGVuYWJsZV9uaTUwMTAiID0geHllczsgdGhlbgotICBORVRfQ0ZMQUdTPSIkTkVUX0NGTEFHUyAtRElOQ0xVREVfTkk1MDEwPTEiCi0gIE5FVEJPT1RfRFJJVkVSUz0iJE5FVEJPT1RfRFJJVkVSUyBuaTUwMTAubyIKLWZpCi0KLUFDX0FSR19FTkFCTEUoM2M1MDMsCi0gIFsgIC0tZW5hYmxlLTNjNTAzICAgICAgICAgIGVuYWJsZSAzQ29tNTAzIGRyaXZlcl0pCi1pZiB0ZXN0ICJ4JGVuYWJsZV8zYzUwMyIgPSB4eWVzOyB0aGVuCi0gIE5FVF9DRkxBR1M9IiRORVRfQ0ZMQUdTIC1ESU5DTFVERV8zQzUwMz0xIgotICBORVRCT09UX0RSSVZFUlM9IiRORVRCT09UX0RSSVZFUlMgM2M1MDMubyIKLWZpCi0KLUFDX0FSR19FTkFCTEUobmUsCi0gIFsgIC0tZW5hYmxlLW5lICAgICAgICAgICAgIGVuYWJsZSBORTEwMDAvMjAwMCBJU0EgZHJpdmVyXSkKLWlmIHRlc3QgIngkZW5hYmxlX25lIiA9IHh5ZXM7IHRoZW4KLSAgTkVUX0NGTEFHUz0iJE5FVF9DRkxBR1MgLURJTkNMVURFX05FPTEiCi0gIE5FVEJPT1RfRFJJVkVSUz0iJE5FVEJPT1RfRFJJVkVSUyBuZS5vIgorQUNfQVJHX0VOQUJMRShuczgzODIwLAorICBbICAtLWVuYWJsZS1uczgzODIwICAgICAgICBlbmFibGUgTlM4MzgyMCBkcml2ZXJdKQoraWYgdGVzdCAieCRlbmFibGVfbnM4MzgyMCIgPSB4eWVzOyB0aGVuCisgIE5FVF9DRkxBR1M9IiRORVRfQ0ZMQUdTIC1ESU5DTFVERV9OUzgzODIwPTEiCisgIE5FVEJPT1RfRFJJVkVSUz0iJE5FVEJPT1RfRFJJVkVSUyBuczgzODIwLm8iCiBmaQogCiBBQ19BUkdfRU5BQkxFKG5zODM5MCwKQEAgLTQ3NCwxOCArMzk3LDE4IEBACiAgIE5FVEJPT1RfRFJJVkVSUz0iJE5FVEJPT1RfRFJJVkVSUyBuczgzOTAubyIKIGZpCiAKLUFDX0FSR19FTkFCTEUod2QsCi0gIFsgIC0tZW5hYmxlLXdkICAgICAgICAgICAgIGVuYWJsZSBXRDgwMDMvODAxMywgU01DODIxNi84NDE2IGRyaXZlcl0pCi1pZiB0ZXN0ICJ4JGVuYWJsZV93ZCIgPSB4eWVzOyB0aGVuCi0gIE5FVF9DRkxBR1M9IiRORVRfQ0ZMQUdTIC1ESU5DTFVERV9XRD0xIgotICBORVRCT09UX0RSSVZFUlM9IiRORVRCT09UX0RSSVZFUlMgd2QubyIKK0FDX0FSR19FTkFCTEUocGNuZXQzMiwKKyAgWyAgLS1lbmFibGUtcGNuZXQzMiAgICAgICAgZW5hYmxlIEFNRCBMYW5jZS9QQ0kgUENOZXQvMzIgZHJpdmVyXSkKK2lmIHRlc3QgIngkZW5hYmxlX3BjbmV0MzIiID0geHllczsgdGhlbgorICBORVRfQ0ZMQUdTPSIkTkVUX0NGTEFHUyAtRElOQ0xVREVfUENORVQzMj0xIgorICBORVRCT09UX0RSSVZFUlM9IiRORVRCT09UX0RSSVZFUlMgcGNuZXQzMi5vIgogZmkKIAotQUNfQVJHX0VOQUJMRShvdHVsaXAsCi0gIFsgIC0tZW5hYmxlLW90dWxpcCAgICAgICAgIGVuYWJsZSBvbGQgVHVsaXAgZHJpdmVyXSkKLWlmIHRlc3QgIngkZW5hYmxlX290dWxpcCIgPSB4eWVzOyB0aGVuCi0gIE5FVF9DRkxBR1M9IiRORVRfQ0ZMQUdTIC1ESU5DTFVERV9PVFVMSVA9MSIKLSAgTkVUQk9PVF9EUklWRVJTPSIkTkVUQk9PVF9EUklWRVJTIG90dWxpcC5vIgorQUNfQVJHX0VOQUJMRShwbmljLAorICBbICAtLWVuYWJsZS1wbmljICAgICAgICAgICBlbmFibGUgQm9jaHMgUHNldWRvIE5pYyBkcml2ZXJdKQoraWYgdGVzdCAieCRlbmFibGVfcG5pYyIgPSB4eWVzOyB0aGVuCisgIE5FVF9DRkxBR1M9IiRORVRfQ0ZMQUdTIC1ESU5DTFVERV9QTklDPTEiCisgIE5FVEJPT1RfRFJJVkVSUz0iJE5FVEJPT1RfRFJJVkVSUyBwbmljLm8iCiBmaQogCiBBQ19BUkdfRU5BQkxFKHJ0bDgxMzksCkBAIC00OTUsNiArNDE4LDEzIEBACiAgIE5FVEJPT1RfRFJJVkVSUz0iJE5FVEJPT1RfRFJJVkVSUyBydGw4MTM5Lm8iCiBmaQogCitBQ19BUkdfRU5BQkxFKHI4MTY5LAorICBbICAtLWVuYWJsZS1yODE2OSAgICAgICAgICBlbmFibGUgUmVhbHRlayA4MTY5IGRyaXZlcl0pCitpZiB0ZXN0ICJ4JGVuYWJsZV9yODE2OSIgPSB4eWVzOyB0aGVuCisgIE5FVF9DRkxBR1M9IiRORVRfQ0ZMQUdTIC1ESU5DTFVERV9SODE2OT0xIgorICBORVRCT09UX0RSSVZFUlM9IiRORVRCT09UX0RSSVZFUlMgcjgxNjkubyIKK2ZpCisKIEFDX0FSR19FTkFCTEUoc2lzOTAwLAogICBbICAtLWVuYWJsZS1zaXM5MDAgICAgICAgICBlbmFibGUgU0lTIDkwMCBhbmQgU0lTIDcwMTYgZHJpdmVyXSkKIGlmIHRlc3QgIngkZW5hYmxlX3NpczkwMCIgPSB4eWVzOyB0aGVuCkBAIC01MDIsMjUgKzQzMiwxMSBAQAogICBORVRCT09UX0RSSVZFUlM9IiRORVRCT09UX0RSSVZFUlMgc2lzOTAwLm8iCiBmaQogCi1BQ19BUkdfRU5BQkxFKHNrLWcxNiwKLSAgWyAgLS1lbmFibGUtc2stZzE2ICAgICAgICAgZW5hYmxlIFNjaG5laWRlciBhbmQgS29jaCBHMTYgZHJpdmVyXSkKLWlmIHRlc3QgIngkZW5hYmxlX3NrX2cxNiIgPSB4eWVzOyB0aGVuCi0gIE5FVF9DRkxBR1M9IiRORVRfQ0ZMQUdTIC1ESU5DTFVERV9TS19HMTY9MSIKLSAgTkVUQk9PVF9EUklWRVJTPSIkTkVUQk9PVF9EUklWRVJTIHNrX2cxNi5vIgotZmkKLQotQUNfQVJHX0VOQUJMRShzbWM5MDAwLAotICBbICAtLWVuYWJsZS1zbWM5MDAwICAgICAgICBlbmFibGUgU01DOTAwMCBkcml2ZXJdKQotaWYgdGVzdCAieCRlbmFibGVfc21jOTAwMCIgPSB4eWVzOyB0aGVuCi0gIE5FVF9DRkxBR1M9IiRORVRfQ0ZMQUdTIC1ESU5DTFVERV9TTUM5MDAwPTEiCi0gIE5FVEJPT1RfRFJJVkVSUz0iJE5FVEJPT1RfRFJJVkVSUyBzbWM5MDAwLm8iCi1maQotCi1BQ19BUkdfRU5BQkxFKHRpYXJhLAotICBbICAtLWVuYWJsZS10aWFyYSAgICAgICAgICBlbmFibGUgVGlhcmEgZHJpdmVyXSkKLWlmIHRlc3QgIngkZW5hYmxlX3RpYXJhIiA9IHh5ZXM7IHRoZW4KLSAgTkVUX0NGTEFHUz0iJE5FVF9DRkxBR1MgLURJTkNMVURFX1RJQVJBPTEiCi0gIE5FVEJPT1RfRFJJVkVSUz0iJE5FVEJPT1RfRFJJVkVSUyB0aWFyYS5vIgorQUNfQVJHX0VOQUJMRSh0ZzMsCisgIFsgIC0tZW5hYmxlLXRnMyAgICAgICAgICAgIGVuYWJsZSBCcm9hZGNvbSBUaWdvbjMgZHJpdmVyXSkKK2lmIHRlc3QgIngkZW5hYmxlX3RnMyIgPSB4eWVzOyB0aGVuCisgIE5FVF9DRkxBR1M9IiRORVRfQ0ZMQUdTIC1ESU5DTFVERV9URzM9MSIKKyAgTkVUQk9PVF9EUklWRVJTPSIkTkVUQk9PVF9EUklWRVJTIHRnMy5vIgogZmkKIAogQUNfQVJHX0VOQUJMRSh0dWxpcCwKQEAgLTUzMCw2ICs0NDYsMTMgQEAKICAgTkVUQk9PVF9EUklWRVJTPSIkTkVUQk9PVF9EUklWRVJTIHR1bGlwLm8iCiBmaQogCitBQ19BUkdfRU5BQkxFKHRsYW4sCisgIFsgIC0tZW5hYmxlLXRsYW4gICAgICAgICAgIGVuYWJsZSBUSSBUaHVuZGVyTEFOIGRyaXZlcl0pCitpZiB0ZXN0ICJ4JGVuYWJsZV90bGFuIiA9IHh5ZXM7IHRoZW4KKyAgTkVUX0NGTEFHUz0iJE5FVF9DRkxBR1MgLURJTkNMVURFX1RMQU49MSIKKyAgTkVUQk9PVF9EUklWRVJTPSIkTkVUQk9PVF9EUklWRVJTIHRsYW4ubyIKK2ZpCisKIEFDX0FSR19FTkFCTEUodmlhLXJoaW5lLAogICBbICAtLWVuYWJsZS12aWEtcmhpbmUgICAgICBlbmFibGUgUmhpbmUtSS9JSSBkcml2ZXJdKQogaWYgdGVzdCAieCRlbmFibGVfdmlhX3JoaW5lIiA9IHh5ZXM7IHRoZW4KQEAgLTUzOCw3ICs0NjEsNyBAQAogZmkKIAogQUNfQVJHX0VOQUJMRSh3ODljODQwLAotICBbICAtLWVuYWJsZS13ODljODQwICAgICAgICBlbmFibGUgV2luYm9uZCBXODljODQwLCBDb21wZXggUkwxMDAtQVRYIGRyaXZlcl0pCisgIFsgIC0tZW5hYmxlLXc4OWM4NDAgICAgICAgIGVuYWJsZSBXaW5ib25kIFc4OWM4NDAgZHJpdmVyXSkKIGlmIHRlc3QgIngkZW5hYmxlX3c4OWM4NDAiID0geHllczsgdGhlbgogICBORVRfQ0ZMQUdTPSIkTkVUX0NGTEFHUyAtRElOQ0xVREVfVzg5Qzg0MD0xIgogICBORVRCT09UX0RSSVZFUlM9IiRORVRCT09UX0RSSVZFUlMgdzg5Yzg0MC5vIgpAQCAtNTUwLDE5ICs0NzMsNyBAQAogICBGU1lTX0NGTEFHUz0iJEZTWVNfQ0ZMQUdTIC1ERlNZU19URlRQPTEiCiBmaQogCi1kbmwgRXh0cmEgb3B0aW9ucy4KLUFDX0FSR19FTkFCTEUoM2M1MDMtc2htZW0sCi0gIFsgIC0tZW5hYmxlLTNjNTAzLXNobWVtICAgIHVzZSAzYzUwMyBzaGFyZWQgbWVtb3J5IG1vZGVdKQotaWYgdGVzdCAieCRlbmFibGVfM2M1MDNfc2htZW0iID0geHllczsgdGhlbgotICBORVRfRVhUUkFGTEFHUz0iJE5FVF9FWFRSQUZMQUdTIC1EVDUwM19TSE1FTT0xIgotZmkKLQotQUNfQVJHX0VOQUJMRSgzYzUwMy1hdWksCi0gIFsgIC0tZW5hYmxlLTNjNTAzLWF1aSAgICAgIHVzZSBBVUkgYnkgZGVmYXVsdCBvbiAzYzUwMyBjYXJkc10pCi1pZiB0ZXN0ICJ4JGVuYWJsZV8zYzUwM19hdWkiID0geHllczsgdGhlbgotICBORVRfRVhUUkFGTEFHUz0iJE5FVF9FWFRSQUZMQUdTIC1EVDUwM19BVUk9MSIKLWZpCi0KK2RubCBleHRyYSBmbGFnIGZvciBuczgzOTAuYwogQUNfQVJHX0VOQUJMRShjb21wZXgtcmwyMDAwLWZpeCwKICAgWyAgLS1lbmFibGUtY29tcGV4LXJsMjAwMC1maXgKICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BlY2lmeSB0aGlzIGlmIHlvdSBoYXZlIGEgQ29tcGV4IFJMMjAwMCBQQ0ldKQpAQCAtNTcwLDExICs0ODEsNiBAQAogICBORVRfRVhUUkFGTEFHUz0iJE5FVF9FWFRSQUZMQUdTIC1EQ09NUEVYX1JMMjAwMF9GSVg9MSIKIGZpCiAKLUFDX0FSR19FTkFCTEUoc21jOTAwMC1zY2FuLAotICBbICAtLWVuYWJsZS1zbWM5MDAwLXNjYW49TElTVAotICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9iZSBmb3IgU01DOTAwMCBJL08gYWRkcmVzc2VzIHVzaW5nIExJU1RdLAotICBbTkVUX0VYVFJBRkxBR1M9IiRORVRfRVhUUkFGTEFHUyAtRFNNQzkwMDBfU0NBTj0kZW5hYmxlX3NtYzkwMDBfc2NhbiJdKQotCiBBQ19BUkdfRU5BQkxFKG5lLXNjYW4sCiAgIFsgIC0tZW5hYmxlLW5lLXNjYW49TElTVCAgIHByb2JlIGZvciBORSBiYXNlIGFkZHJlc3MgdXNpbmcgTElTVF0sCiAgIFtORVRfRVhUUkFGTEFHUz0iJE5FVF9FWFRSQUZMQUdTIC1ETkVfU0NBTj0kZW5hYmxlX25lX3NjYW4iXSwKQEAgLTU4NiwxMCArNDkyLDYgQEAKICAgW05FVF9FWFRSQUZMQUdTPSIkTkVUX0VYVFJBRkxBR1MgLURXRF9ERUZBVUxUX01FTT0kZW5hYmxlX3dkX2RlZmF1bHRfbWVtIl0sCiAgIFtORVRfRVhUUkFGTEFHUz0iJE5FVF9FWFRSQUZMQUdTIC1EV0RfREVGQVVMVF9NRU09MHhDQzAwMCJdKQogCi1BQ19BUkdfRU5BQkxFKGNzLXNjYW4sCi0gIFsgIC0tZW5hYmxlLWNzLXNjYW49TElTVCAgIHByb2JlIGZvciBDUzg5eDAgYmFzZSBhZGRyZXNzIHVzaW5nIExJU1RdLAotICBbTkVUX0VYVFJBRkxBR1M9IiRORVRfRVhUUkFGTEFHUyAtRENTX1NDQU49JGVuYWJsZV9jc19zY2FuIl0pCi0KIGRubCBEaXNrbGVzcwogQUNfQVJHX0VOQUJMRShkaXNrbGVzcywKICAgWyAgLS1lbmFibGUtZGlza2xlc3MgICAgICAgZW5hYmxlIGRpc2tsZXNzIHN1cHBvcnRdKQpkaWZmIC1OYXVyIGdydWItMC45Ny5vcmlnL25ldGJvb3QvM2M1MDkuaCBncnViLTAuOTcvbmV0Ym9vdC8zYzUwOS5oCi0tLSBncnViLTAuOTcub3JpZy9uZXRib290LzNjNTA5LmgJMjAwMy0wNy0wOSAxMTo0NTozNy4wMDAwMDAwMDAgKzAwMDAKKysrIGdydWItMC45Ny9uZXRib290LzNjNTA5LmgJMTk3MC0wMS0wMSAwMDowMDowMC4wMDAwMDAwMDAgKzAwMDAKQEAgLTEsMzk3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTMgSGVyYiBQZXllcmwgKGhwZXllcmxAbm92YXRlbC5jYSkgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLSAqIG1ldDogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gMi4gVGhlIG5hbWUKLSAqIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLSAqIHRoaXMgc29mdHdhcmUgd2l0aG91Z2ggc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKLSAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PCi0gKiBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQKLSAqIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKLSAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YKLSAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HCi0gKiBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMKLSAqIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICoKLSAqIGlmX2VwcmVnLmgsdiAxLjQgMTk5NC8xMS8xMyAxMDoxMjozNyBnaWJicyBFeHAgTW9kaWZpZWQgYnk6Ci0gKgotIE9jdG9iZXIgMiwgMTk5NAotCi0gTW9kaWZpZWQgYnk6IEFuZHJlcyBWZWdhIEdhcmNpYQotCi0gSU5SSUEgLSBTb3BoaWEgQW50aXBvbGlzLCBGcmFuY2UKLSBlLW1haWw6IGF2ZWdhQHNvcGhpYS5pbnJpYS5mcgotIGZpbmdlcjogYXZlZ2FAcGF4LmlucmlhLmZyCi0KLSAqLwotCi0vKgotICogRXRoZXJuZXQgc29mdHdhcmUgc3RhdHVzIHBlciBpbnRlcmZhY2UuCi0gKi8KLS8qCi0gKiBTb21lIGdsb2JhbCBjb25zdGFudHMKLSAqLwotCi0jZGVmaW5lIFRYX0lOSVRfUkFURQkJMTYKLSNkZWZpbmUgVFhfSU5JVF9NQVhfUkFURQk2NAotI2RlZmluZSBSWF9JTklUX0xBVEVOQ1kJCTY0Ci0jZGVmaW5lIFJYX0lOSVRfRUFSTFlfVEhSRVNICTY0Ci0jZGVmaW5lIE1JTl9SWF9FQVJMWV9USFJFU0hGCTE2CS8qIG5vdCBsZXNzIHRoYW4gZXRoZXJfaGVhZGVyICovCi0jZGVmaW5lIE1JTl9SWF9FQVJMWV9USFJFU0hMCTQKLQotI2RlZmluZSBFRVBST01TSVpFCTB4NDAKLSNkZWZpbmUgTUFYX0VFUFJPTUJVU1kJMTAwMAotI2RlZmluZSBFUF9MQVNUX1RBRwkweGQ3Ci0jZGVmaW5lIEVQX01BWF9CT0FSRFMJMTYKLSNkZWZpbmUgRVBfSURfUE9SVAkweDEwMAotCi0vKgotICogc29tZSBtYWNyb3MgdG8gYWNjZXMgbG9uZyBuYW1lZCBmaWVsZHMKLSAqLwotI2RlZmluZSBJU19CQVNFIChldGhfbmljX2Jhc2UpCi0jZGVmaW5lIEJBU0UJKGV0aF9uaWNfYmFzZSkKLQotLyoKLSAqIENvbW1hbmRzIHRvIHJlYWQvd3JpdGUgRUVQUk9NIHRyb3VnaCBFRVBST00gY29tbWFuZCByZWdpc3RlciAoV2luZG93IDAsCi0gKiBPZmZzZXQgMHhhKQotICovCi0jZGVmaW5lIEVFUFJPTV9DTURfUkQJMHgwMDgwCS8qIFJlYWQ6ICBBZGRyZXNzIHJlcXVpcmVkICg1IGJpdHMpICovCi0jZGVmaW5lIEVFUFJPTV9DTURfV1IJMHgwMDQwCS8qIFdyaXRlOiBBZGRyZXNzIHJlcXVpcmVkICg1IGJpdHMpICovCi0jZGVmaW5lIEVFUFJPTV9DTURfRVJBU0UgMHgwMGMwCS8qIEVyYXNlOiBBZGRyZXNzIHJlcXVpcmVkICg1IGJpdHMpICovCi0jZGVmaW5lIEVFUFJPTV9DTURfRVdFTgkweDAwMzAJLyogRXJhc2UvV3JpdGUgRW5hYmxlOiBObyBkYXRhIHJlcXVpcmVkICovCi0KLSNkZWZpbmUgRUVQUk9NX0JVU1kJCSgxPDwxNSkKLSNkZWZpbmUgRUVQUk9NX1RTVF9NT0RFCQkoMTw8MTQpCi0KLS8qCi0gKiBTb21lIHNob3J0IGZ1bmN0aW9ucywgd29ydGggdG8gbGV0IHRoZW0gYmUgYSBtYWNybwotICovCi0jZGVmaW5lIGlzX2VlcHJvbV9idXN5KGIpIChpbncoKGIpK0VQX1cwX0VFUFJPTV9DT01NQU5EKSZFRVBST01fQlVTWSkKLSNkZWZpbmUgR09fV0lORE9XKHgpCW91dHcoV0lORE9XX1NFTEVDVHwoeCksIEJBU0UrRVBfQ09NTUFORCkKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogVGhlc2UgZGVmaW5lIHRoZSBFRVBST00gZGF0YSBzdHJ1Y3R1cmUuICBUaGV5IGFyZSB1c2VkIGluIHRoZSBwcm9iZQotICogZnVuY3Rpb24gdG8gdmVyaWZ5IHRoZSBleGlzdGFuY2Ugb2YgdGhlIGFkYXB0ZXIgYWZ0ZXIgaGF2aW5nIHNlbnQKLSAqIHRoZSBJRF9TZXF1ZW5jZS4KLSAqCi0gKiBUaGVyZSBhcmUgb3RoZXJzIGJ1dCBvbmx5IHRoZSBvbmVzIHdlIHVzZSBhcmUgZGVmaW5lZCBoZXJlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2RlZmluZSBFRVBST01fTk9ERV9BRERSXzAJMHgwCS8qIFdvcmQgKi8KLSNkZWZpbmUgRUVQUk9NX05PREVfQUREUl8xCTB4MQkvKiBXb3JkICovCi0jZGVmaW5lIEVFUFJPTV9OT0RFX0FERFJfMgkweDIJLyogV29yZCAqLwotI2RlZmluZSBFRVBST01fUFJPRF9JRAkJMHgzCS8qIDB4OVswLWZdNTAgKi8KLSNkZWZpbmUgRUVQUk9NX01GR19JRAkJMHg3CS8qIDB4NmQ1MCAqLwotI2RlZmluZSBFRVBST01fQUREUl9DRkcJCTB4OAkvKiBCYXNlIGFkZHIgKi8KLSNkZWZpbmUgRUVQUk9NX1JFU09VUkNFX0NGRwkweDkJLyogSVJRLiBCaXRzIDEyLTE1ICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIFRoZXNlIGFyZSB0aGUgcmVnaXN0ZXJzIGZvciB0aGUgM0NvbSAzYzUwOSBhbmQgdGhlaXIgYml0IHBhdHRlcm5zIHdoZW4KLSAqIGFwcGxpY2FibGUuICBUaGV5IGhhdmUgYmVlbiB0YWtlbiBvdXQgdGhlIHRoZSAiRXRoZXJMaW5rIElJSSBQYXJhbGxlbAotICogVGFza2luZyBFSVNBIGFuZCBJU0EgVGVjaG5pY2FsIFJlZmVyZW5jZSIgIkJldGEgRHJhZnQgMTAvMzAvOTIiIG1hbnVhbAotICogZnJvbSAzY29tLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2RlZmluZSBFUF9DT01NQU5ECQkweDBlCS8qIFdyaXRlLiBCQVNFKzB4MGUgaXMgYWx3YXlzIGEKLQkJCQkJICogY29tbWFuZCByZWcuICovCi0jZGVmaW5lIEVQX1NUQVRVUwkJMHgwZQkvKiBSZWFkLiBCQVNFKzB4MGUgaXMgYWx3YXlzIHN0YXR1cwotCQkJCQkgKiByZWcuICovCi0jZGVmaW5lIEVQX1dJTkRPVwkJMHgwZgkvKiBSZWFkLiBCQVNFKzB4MGYgaXMgYWx3YXlzIHdpbmRvdwotCQkJCQkgKiByZWcuICovCi0vKgotICogV2luZG93IDAgcmVnaXN0ZXJzLiBTZXR1cC4KLSAqLwotLyogV3JpdGUgKi8KLSNkZWZpbmUgRVBfVzBfRUVQUk9NX0RBVEEJMHgwYwotI2RlZmluZSBFUF9XMF9FRVBST01fQ09NTUFORAkweDBhCi0jZGVmaW5lIEVQX1cwX1JFU09VUkNFX0NGRwkweDA4Ci0jZGVmaW5lIEVQX1cwX0FERFJFU1NfQ0ZHCTB4MDYKLSNkZWZpbmUgRVBfVzBfQ09ORklHX0NUUkwJMHgwNAotLyogUmVhZCAqLwotI2RlZmluZSBFUF9XMF9QUk9EVUNUX0lECTB4MDIKLSNkZWZpbmUgRVBfVzBfTUZHX0lECQkweDAwCi0KLS8qCi0gKiBXaW5kb3cgMSByZWdpc3RlcnMuIE9wZXJhdGluZyBTZXQuCi0gKi8KLS8qIFdyaXRlICovCi0jZGVmaW5lIEVQX1cxX1RYX1BJT19XUl8yCTB4MDIKLSNkZWZpbmUgRVBfVzFfVFhfUElPX1dSXzEJMHgwMAotLyogUmVhZCAqLwotI2RlZmluZSBFUF9XMV9GUkVFX1RYCQkweDBjCi0jZGVmaW5lIEVQX1cxX1RYX1NUQVRVUwkJMHgwYgkvKiBieXRlICovCi0jZGVmaW5lIEVQX1cxX1RJTUVSCQkweDBhCS8qIGJ5dGUgKi8KLSNkZWZpbmUgRVBfVzFfUlhfU1RBVFVTCQkweDA4Ci0jZGVmaW5lIEVQX1cxX1JYX1BJT19SRF8yCTB4MDIKLSNkZWZpbmUgRVBfVzFfUlhfUElPX1JEXzEJMHgwMAotCi0vKgotICogV2luZG93IDIgcmVnaXN0ZXJzLiBTdGF0aW9uIEFkZHJlc3MgU2V0dXAvUmVhZAotICovCi0vKiBSZWFkL1dyaXRlICovCi0jZGVmaW5lIEVQX1cyX0FERFJfNQkJMHgwNQotI2RlZmluZSBFUF9XMl9BRERSXzQJCTB4MDQKLSNkZWZpbmUgRVBfVzJfQUREUl8zCQkweDAzCi0jZGVmaW5lIEVQX1cyX0FERFJfMgkJMHgwMgotI2RlZmluZSBFUF9XMl9BRERSXzEJCTB4MDEKLSNkZWZpbmUgRVBfVzJfQUREUl8wCQkweDAwCi0KLS8qCi0gKiBXaW5kb3cgMyByZWdpc3RlcnMuICBGSUZPIE1hbmFnZW1lbnQuCi0gKi8KLS8qIFJlYWQgKi8KLSNkZWZpbmUgRVBfVzNfRlJFRV9UWAkJMHgwYwotI2RlZmluZSBFUF9XM19GUkVFX1JYCQkweDBhCi0KLS8qCi0gKiBXaW5kb3cgNCByZWdpc3RlcnMuIERpYWdub3N0aWNzLgotICovCi0vKiBSZWFkL1dyaXRlICovCi0jZGVmaW5lIEVQX1c0X01FRElBX1RZUEUJMHgwYQotI2RlZmluZSBFUF9XNF9DVFJMUl9TVEFUVVMJMHgwOAotI2RlZmluZSBFUF9XNF9ORVRfRElBRwkJMHgwNgotI2RlZmluZSBFUF9XNF9GSUZPX0RJQUcJCTB4MDQKLSNkZWZpbmUgRVBfVzRfSE9TVF9ESUFHCQkweDAyCi0jZGVmaW5lIEVQX1c0X1RYX0RJQUcJCTB4MDAKLQotLyoKLSAqIFdpbmRvdyA1IFJlZ2lzdGVycy4gIFJlc3VsdHMgYW5kIEludGVybmFsIHN0YXR1cy4KLSAqLwotLyogUmVhZCAqLwotI2RlZmluZSBFUF9XNV9SRUFEXzBfTUFTSwkweDBjCi0jZGVmaW5lIEVQX1c1X0lOVFJfTUFTSwkJMHgwYQotI2RlZmluZSBFUF9XNV9SWF9GSUxURVIJCTB4MDgKLSNkZWZpbmUgRVBfVzVfUlhfRUFSTFlfVEhSRVNICTB4MDYKLSNkZWZpbmUgRVBfVzVfVFhfQVZBSUxfVEhSRVNICTB4MDIKLSNkZWZpbmUgRVBfVzVfVFhfU1RBUlRfVEhSRVNICTB4MDAKLQotLyoKLSAqIFdpbmRvdyA2IHJlZ2lzdGVycy4gU3RhdGlzdGljcy4KLSAqLwotLyogUmVhZC9Xcml0ZSAqLwotI2RlZmluZSBUWF9UT1RBTF9PSwkJMHgwYwotI2RlZmluZSBSWF9UT1RBTF9PSwkJMHgwYQotI2RlZmluZSBUWF9ERUZFUlJBTFMJCTB4MDgKLSNkZWZpbmUgUlhfRlJBTUVTX09LCQkweDA3Ci0jZGVmaW5lIFRYX0ZSQU1FU19PSwkJMHgwNgotI2RlZmluZSBSWF9PVkVSUlVOUwkJMHgwNQotI2RlZmluZSBUWF9DT0xMSVNJT05TCQkweDA0Ci0jZGVmaW5lIFRYX0FGVEVSXzFfQ09MTElTSU9OCTB4MDMKLSNkZWZpbmUgVFhfQUZURVJfWF9DT0xMSVNJT05TCTB4MDIKLSNkZWZpbmUgVFhfTk9fU1FFCQkweDAxCi0jZGVmaW5lIFRYX0NEX0xPU1QJCTB4MDAKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBSZWdpc3RlciBkZWZpbml0aW9ucy4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoKLSAqIENvbW1hbmQgcmVnaXN0ZXIuIEFsbCB3aW5kb3dzLgotICoKLSAqIDE2IGJpdCByZWdpc3Rlci4KLSAqICAgICAxNS0xMTogIDUtYml0IGNvZGUgZm9yIGNvbW1hbmQgdG8gYmUgZXhlY3V0ZWQuCi0gKiAgICAgMTAtMDogICAxMS1iaXQgYXJnIGlmIGFueS4gRm9yIGNvbW1hbmRzIHdpdGggbm8gYXJnczsKLSAqCSAgICAgIHRoaXMgY2FuIGJlIHNldCB0byBhbnl0aGluZy4KLSAqLwotI2RlZmluZSBHTE9CQUxfUkVTRVQJCSh1bnNpZ25lZCBzaG9ydCkgMHgwMDAwCS8qIFdhaXQgYXQgbGVhc3QgMW1zCi0JCQkJCQkJICogYWZ0ZXIgaXNzdWluZyAqLwotI2RlZmluZSBXSU5ET1dfU0VMRUNUCQkodW5zaWduZWQgc2hvcnQpICgweDE8PDExKQotI2RlZmluZSBTVEFSVF9UUkFOU0NFSVZFUgkodW5zaWduZWQgc2hvcnQpICgweDI8PDExKQkvKiBSZWFkIEFERFJfQ0ZHIHJlZyB0bwotCQkJCQkJCSAqIGRldGVybWluZSB3aGV0aGVyCi0JCQkJCQkJICogdGhpcyBpcyBuZWVkZWQuIElmCi0JCQkJCQkJICogc287IHdhaXQgODAwIHVTZWMKLQkJCQkJCQkgKiBiZWZvcmUgdXNpbmcgdHJhbnMtCi0JCQkJCQkJICogY2VpdmVyLiAqLwotI2RlZmluZSBSWF9ESVNBQkxFCQkodW5zaWduZWQgc2hvcnQpICgweDM8PDExKQkvKiBzdGF0ZSBkaXNhYmxlZCBvbgotCQkJCQkJCSAqIHBvd2VyLXVwICovCi0jZGVmaW5lIFJYX0VOQUJMRQkJKHVuc2lnbmVkIHNob3J0KSAoMHg0PDwxMSkKLSNkZWZpbmUgUlhfUkVTRVQJCSh1bnNpZ25lZCBzaG9ydCkgKDB4NTw8MTEpCi0jZGVmaW5lIFJYX0RJU0NBUkRfVE9QX1BBQ0sJKHVuc2lnbmVkIHNob3J0KSAoMHg4PDwxMSkKLSNkZWZpbmUgVFhfRU5BQkxFCQkodW5zaWduZWQgc2hvcnQpICgweDk8PDExKQotI2RlZmluZSBUWF9ESVNBQkxFCQkodW5zaWduZWQgc2hvcnQpICgweGE8PDExKQotI2RlZmluZSBUWF9SRVNFVAkJKHVuc2lnbmVkIHNob3J0KSAoMHhiPDwxMSkKLSNkZWZpbmUgUkVRX0lOVFIJCSh1bnNpZ25lZCBzaG9ydCkgKDB4Yzw8MTEpCi0jZGVmaW5lIFNFVF9JTlRSX01BU0sJCSh1bnNpZ25lZCBzaG9ydCkgKDB4ZTw8MTEpCi0jZGVmaW5lIFNFVF9SRF8wX01BU0sJCSh1bnNpZ25lZCBzaG9ydCkgKDB4Zjw8MTEpCi0jZGVmaW5lIFNFVF9SWF9GSUxURVIJCSh1bnNpZ25lZCBzaG9ydCkgKDB4MTA8PDExKQotI2RlZmluZSBGSUxfSU5ESVZJRFVBTAkodW5zaWduZWQgc2hvcnQpICgweDEpCi0jZGVmaW5lIEZJTF9HUk9VUAkJKHVuc2lnbmVkIHNob3J0KSAoMHgyKQotI2RlZmluZSBGSUxfQlJEQ1NUCSh1bnNpZ25lZCBzaG9ydCkgKDB4NCkKLSNkZWZpbmUgRklMX0FMTAkJKHVuc2lnbmVkIHNob3J0KSAoMHg4KQotI2RlZmluZSBTRVRfUlhfRUFSTFlfVEhSRVNICSh1bnNpZ25lZCBzaG9ydCkgKDB4MTE8PDExKQotI2RlZmluZSBTRVRfVFhfQVZBSUxfVEhSRVNICSh1bnNpZ25lZCBzaG9ydCkgKDB4MTI8PDExKQotI2RlZmluZSBTRVRfVFhfU1RBUlRfVEhSRVNICSh1bnNpZ25lZCBzaG9ydCkgKDB4MTM8PDExKQotI2RlZmluZSBTVEFUU19FTkFCTEUJCSh1bnNpZ25lZCBzaG9ydCkgKDB4MTU8PDExKQotI2RlZmluZSBTVEFUU19ESVNBQkxFCQkodW5zaWduZWQgc2hvcnQpICgweDE2PDwxMSkKLSNkZWZpbmUgU1RPUF9UUkFOU0NFSVZFUgkodW5zaWduZWQgc2hvcnQpICgweDE3PDwxMSkKLS8qCi0gKiBUaGUgZm9sbG93aW5nIENfKiBhY2tub3dsZWRnZSB0aGUgdmFyaW91cyBpbnRlcnJ1cHRzLiBTb21lIG9mIHRoZW0gZG9uJ3QKLSAqIGRvIGFueXRoaW5nLiAgU2VlIHRoZSBtYW51YWwuCi0gKi8KLSNkZWZpbmUgQUNLX0lOVFIJCSh1bnNpZ25lZCBzaG9ydCkgKDB4NjgwMCkKLSNkZWZpbmUgQ19JTlRSX0xBVENICSh1bnNpZ25lZCBzaG9ydCkgKEFDS19JTlRSfDB4MSkKLSNkZWZpbmUgQ19DQVJEX0ZBSUxVUkUJKHVuc2lnbmVkIHNob3J0KSAoQUNLX0lOVFJ8MHgyKQotI2RlZmluZSBDX1RYX0NPTVBMRVRFCSh1bnNpZ25lZCBzaG9ydCkgKEFDS19JTlRSfDB4NCkKLSNkZWZpbmUgQ19UWF9BVkFJTAkodW5zaWduZWQgc2hvcnQpIChBQ0tfSU5UUnwweDgpCi0jZGVmaW5lIENfUlhfQ09NUExFVEUJKHVuc2lnbmVkIHNob3J0KSAoQUNLX0lOVFJ8MHgxMCkKLSNkZWZpbmUgQ19SWF9FQVJMWQkodW5zaWduZWQgc2hvcnQpIChBQ0tfSU5UUnwweDIwKQotI2RlZmluZSBDX0lOVF9SUUQJCSh1bnNpZ25lZCBzaG9ydCkgKEFDS19JTlRSfDB4NDApCi0jZGVmaW5lIENfVVBEX1NUQVRTCSh1bnNpZ25lZCBzaG9ydCkgKEFDS19JTlRSfDB4ODApCi0KLS8qCi0gKiBTdGF0dXMgcmVnaXN0ZXIuIEFsbCB3aW5kb3dzLgotICoKLSAqICAgICAxNS0xMzogIFdpbmRvdyBudW1iZXIoMC03KS4KLSAqICAgICAxMjogICAgIENvbW1hbmRfaW5fcHJvZ3Jlc3MuCi0gKiAgICAgMTE6ICAgICByZXNlcnZlZC4KLSAqICAgICAxMDogICAgIHJlc2VydmVkLgotICogICAgIDk6ICAgICAgcmVzZXJ2ZWQuCi0gKiAgICAgODogICAgICByZXNlcnZlZC4KLSAqICAgICA3OiAgICAgIFVwZGF0ZSBTdGF0aXN0aWNzLgotICogICAgIDY6ICAgICAgSW50ZXJydXB0IFJlcXVlc3RlZC4KLSAqICAgICA1OiAgICAgIFJYIEVhcmx5LgotICogICAgIDQ6ICAgICAgUlggQ29tcGxldGUuCi0gKiAgICAgMzogICAgICBUWCBBdmFpbGFibGUuCi0gKiAgICAgMjogICAgICBUWCBDb21wbGV0ZS4KLSAqICAgICAxOiAgICAgIEFkYXB0ZXIgRmFpbHVyZS4KLSAqICAgICAwOiAgICAgIEludGVycnVwdCBMYXRjaC4KLSAqLwotI2RlZmluZSBTX0lOVFJfTEFUQ0gJCSh1bnNpZ25lZCBzaG9ydCkgKDB4MSkKLSNkZWZpbmUgU19DQVJEX0ZBSUxVUkUJCSh1bnNpZ25lZCBzaG9ydCkgKDB4MikKLSNkZWZpbmUgU19UWF9DT01QTEVURQkJKHVuc2lnbmVkIHNob3J0KSAoMHg0KQotI2RlZmluZSBTX1RYX0FWQUlMCQkodW5zaWduZWQgc2hvcnQpICgweDgpCi0jZGVmaW5lIFNfUlhfQ09NUExFVEUJCSh1bnNpZ25lZCBzaG9ydCkgKDB4MTApCi0jZGVmaW5lIFNfUlhfRUFSTFkJCSh1bnNpZ25lZCBzaG9ydCkgKDB4MjApCi0jZGVmaW5lIFNfSU5UX1JRRAkJKHVuc2lnbmVkIHNob3J0KSAoMHg0MCkKLSNkZWZpbmUgU19VUERfU1RBVFMJCSh1bnNpZ25lZCBzaG9ydCkgKDB4ODApCi0jZGVmaW5lIFNfNV9JTlRTCQkoU19DQVJEX0ZBSUxVUkV8U19UWF9DT01QTEVURXxcCi0JCQkJIFNfVFhfQVZBSUx8U19SWF9DT01QTEVURXxTX1JYX0VBUkxZKQotI2RlZmluZSBTX0NPTU1BTkRfSU5fUFJPR1JFU1MJKHVuc2lnbmVkIHNob3J0KSAoMHgxMDAwKQotCi0vKgotICogRklGTyBSZWdpc3RlcnMuCi0gKiBSWCBTdGF0dXMuIFdpbmRvdyAxL1BvcnQgMDgKLSAqCi0gKiAgICAgMTU6ICAgICBJbmNvbXBsZXRlIG9yIEZJRk8gZW1wdHkuCi0gKiAgICAgMTQ6ICAgICAxOiBFcnJvciBpbiBSWCBQYWNrZXQgICAwOiBJbmNvbXBsZXRlIG9yIG5vIGVycm9yLgotICogICAgIDEzLTExOiAgVHlwZSBvZiBlcnJvci4KLSAqCSAgICAgIDEwMDAgPSBPdmVycnVuLgotICoJICAgICAgMTAxMSA9IFJ1biBQYWNrZXQgRXJyb3IuCi0gKgkgICAgICAxMTAwID0gQWxpZ25tZW50IEVycm9yLgotICoJICAgICAgMTEwMSA9IENSQyBFcnJvci4KLSAqCSAgICAgIDEwMDEgPSBPdmVyc2l6ZSBQYWNrZXQgRXJyb3IgKD4xNTE0IGJ5dGVzKQotICoJICAgICAgMDAxMCA9IERyaWJibGUgQml0cy4KLSAqCSAgICAgIChhbGwgb3RoZXIgZXJyb3IgY29kZXMsIG5vIGVycm9ycy4pCi0gKgotICogICAgIDEwLTA6ICAgUlggQnl0ZXMgKDAtMTUxNCkKLSAqLwotI2RlZmluZSBFUlJfUlhfSU5DT01QTEVURQkodW5zaWduZWQgc2hvcnQpICgweDE8PDE1KQotI2RlZmluZSBFUlJfUlgJCQkodW5zaWduZWQgc2hvcnQpICgweDE8PDE0KQotI2RlZmluZSBFUlJfUlhfT1ZFUlJVTgkJKHVuc2lnbmVkIHNob3J0KSAoMHg4PDwxMSkKLSNkZWZpbmUgRVJSX1JYX1JVTl9QS1QJCSh1bnNpZ25lZCBzaG9ydCkgKDB4Yjw8MTEpCi0jZGVmaW5lIEVSUl9SWF9BTElHTgkJKHVuc2lnbmVkIHNob3J0KSAoMHhjPDwxMSkKLSNkZWZpbmUgRVJSX1JYX0NSQwkJKHVuc2lnbmVkIHNob3J0KSAoMHhkPDwxMSkKLSNkZWZpbmUgRVJSX1JYX09WRVJTSVpFCQkodW5zaWduZWQgc2hvcnQpICgweDk8PDExKQotI2RlZmluZSBFUlJfUlhfRFJJQkJMRQkJKHVuc2lnbmVkIHNob3J0KSAoMHgyPDwxMSkKLQotLyoKLSAqIEZJRk8gUmVnaXN0ZXJzLgotICogVFggU3RhdHVzLiBXaW5kb3cgMS9Qb3J0IDBCCi0gKgotICogICBSZXBvcnRzIHRoZSB0cmFuc21pdCBzdGF0dXMgb2YgYSBjb21wbGV0ZWQgdHJhbnNtaXNzaW9uLiBXcml0aW5nIHRoaXMKLSAqICAgcmVnaXN0ZXIgcG9wcyB0aGUgdHJhbnNtaXQgY29tcGxldGlvbiBzdGFjay4KLSAqCi0gKiAgIFdpbmRvdyAxL1BvcnQgMHgwYi4KLSAqCi0gKiAgICAgNzogICAgICBDb21wbGV0ZQotICogICAgIDY6ICAgICAgSW50ZXJydXB0IG9uIHN1Y2Nlc3NmdWwgdHJhbnNtaXNzaW9uIHJlcXVlc3RlZC4KLSAqICAgICA1OiAgICAgIEphYmJlciBFcnJvciAoVFAgT25seSwgVFggUmVzZXQgcmVxdWlyZWQuICkKLSAqICAgICA0OiAgICAgIFVuZGVycnVuIChUWCBSZXNldCByZXF1aXJlZC4gKQotICogICAgIDM6ICAgICAgTWF4aW11bSBDb2xsaXNpb25zLgotICogICAgIDI6ICAgICAgVFggU3RhdHVzIE92ZXJmbG93LgotICogICAgIDEtMDogICAgVW5kZWZpbmVkLgotICoKLSAqLwotI2RlZmluZSBUWFNfQ09NUExFVEUJCTB4ODAKLSNkZWZpbmUgVFhTX1NVQ0NFU19JTlRSX1JFUQkJMHg0MAotI2RlZmluZSBUWFNfSkFCQkVSCQkweDIwCi0jZGVmaW5lIFRYU19VTkRFUlJVTgkJMHgxMAotI2RlZmluZSBUWFNfTUFYX0NPTExJU0lPTgkweDgKLSNkZWZpbmUgVFhTX1NUQVRVU19PVkVSRkxPVwkweDQKLQotLyoKLSAqIENvbmZpZ3VyYXRpb24gY29udHJvbCByZWdpc3Rlci4KLSAqIFdpbmRvdyAwL1BvcnQgMDQKLSAqLwotLyogUmVhZCAqLwotI2RlZmluZSBJU19BVUkJCQkJKDE8PDEzKQotI2RlZmluZSBJU19CTkMJCQkJKDE8PDEyKQotI2RlZmluZSBJU19VVFAJCQkJKDE8PDkpCi0vKiBXcml0ZSAqLwotI2RlZmluZSBFTkFCTEVfRFJRX0lSUQkJCTB4MDAwMQotI2RlZmluZSBXMF9QNF9DTURfUkVTRVRfQURBUFRFUgkJMHg0Ci0jZGVmaW5lIFcwX1A0X0NNRF9FTkFCTEVfQURBUFRFUgkweDEKLS8qCi0gKiBNZWRpYSB0eXBlIGFuZCBzdGF0dXMuCi0gKiBXaW5kb3cgNC9Qb3J0IDBBCi0gKi8KLSNkZWZpbmUgRU5BQkxFX1VUUAkJCTB4YzAKLSNkZWZpbmUgRElTQUJMRV9VVFAJCQkweDAKLQotLyoKLSAqIFJlc291cmNlIGNvbnRyb2wgcmVnaXN0ZXIKLSAqLwotCi0jZGVmaW5lIFNFVF9JUlEoaSkJKCAoKGkpPDwxMikgfCAweEYwMCkgLyogc2V0IElSUSBpICovCi0KLS8qCi0gKiBSZWNlaXZlIHN0YXR1cyByZWdpc3RlcgotICovCi0KLSNkZWZpbmUgUlhfQllURVNfTUFTSwkJCSh1bnNpZ25lZCBzaG9ydCkgKDB4MDdmZikKLSNkZWZpbmUgUlhfRVJST1IJMHg0MDAwCi0jZGVmaW5lIFJYX0lOQ09NUExFVEUJMHg4MDAwCi0KLQotLyoKLSAqIE1pc2MgZGVmaW5lcyBmb3IgdmFyaW91cyB0aGluZ3MuCi0gKi8KLSNkZWZpbmUgQUNUSVZBVEVfQURBUFRFUl9UT19DT05GSUcJMHhmZiAvKiB0byB0aGUgaWRfcG9ydCAqLwotI2RlZmluZSBNRkdfSUQJCQkJMHg2ZDUwIC8qIGluIEVFUFJPTSBhbmQgVzAgQUREUl9DT05GSUcgKi8KLSNkZWZpbmUgUFJPRF9JRAkJCQkweDkxNTAKLQotI2RlZmluZSBBVUkJCQkJMHgxCi0jZGVmaW5lIEJOQwkJCQkweDIKLSNkZWZpbmUgVVRQCQkJCTB4NAotCi0jZGVmaW5lIFJYX0JZVEVTX01BU0sJCQkodW5zaWduZWQgc2hvcnQpICgweDA3ZmYpCi0KLSAvKiBFSVNBIHN1cHBvcnQgKi8KLSNkZWZpbmUgRVBfRUlTQV9TVEFSVAkJCTB4MTAwMAotI2RlZmluZSBFUF9FSVNBX1cwCQkJMHgwYzgwCi0KLSNpZmRlZglJTkNMVURFXzNDNTI5Ci0gLyogTUNBIHN1cHBvcnQgKi8KLSNkZWZpbmUgTUNBX01PVEhFUkJPQVJEX1NFVFVQX1JFRwkweDk0Ci0jZGVmaW5lIE1DQV9BREFQVEVSX1NFVFVQX1JFRwkJMHg5NgotI2RlZmluZSBNQ0FfTUFYX1NMT1RfTlIJCQk4Ci0jZGVmaW5lIE1DQV9QT1NfUkVHKG4pCQkJKDB4MTAwKyhuKSkKLSNlbmRpZgotCi0vKgotICogTG9jYWwgdmFyaWFibGVzOgotICogIGMtYmFzaWMtb2Zmc2V0OiA4Ci0gKiBFbmQ6Ci0gKi8KZGlmZiAtTmF1ciBncnViLTAuOTcub3JpZy9uZXRib290LzNjNTk1LmMgZ3J1Yi0wLjk3L25ldGJvb3QvM2M1OTUuYwotLS0gZ3J1Yi0wLjk3Lm9yaWcvbmV0Ym9vdC8zYzU5NS5jCTIwMDMtMDctMDkgMTE6NDU6MzcuMDAwMDAwMDAwICswMDAwCisrKyBncnViLTAuOTcvbmV0Ym9vdC8zYzU5NS5jCTIwMDUtMDgtMzEgMTk6MDM6MzUuMDAwMDAwMDAwICswMDAwCkBAIC0yMCw2ICsyMCw3IEBACiAqCiAqICBDb3B5cmlnaHQgKGMpIDE5OTQgSGVyYiBQZXllcmwgPGhwZXllcmxAbm92YXRlbC5jYT4KICoKKyogdGltbGVnZ2UJMDgtMjQtMjAwMwlBZGQgTXVsdGljYXN0IFN1cHBvcnQKICovCiAKIC8qICNkZWZpbmUgRURFQlVHICovCkBAIC0zMCw3ICszMSw3IEBACiAjaW5jbHVkZSAiM2M1OTUuaCIKICNpbmNsdWRlICJ0aW1lci5oIgogCi1zdGF0aWMgdW5zaWduZWQgc2hvcnQJZXRoX25pY19iYXNlLCBldGhfYXNpY19iYXNlOworc3RhdGljIHVuc2lnbmVkIHNob3J0CWV0aF9uaWNfYmFzZTsKIHN0YXRpYyB1bnNpZ25lZCBzaG9ydAl2eF9jb25uZWN0b3IsIHZ4X2Nvbm5lY3RvcnM7CiAKIHN0YXRpYyBzdHJ1Y3QgY29ubmVjdG9yX2VudHJ5IHsKQEAgLTU3LDE0ICs1OCwxMiBAQAogc3RhdGljIHZvaWQgdnhnZXRsaW5rKHZvaWQpOwogc3RhdGljIHZvaWQgdnhzZXRsaW5rKHZvaWQpOwogCi0jZGVmaW5lCXVkZWxheShuKQl3YWl0b25fdGltZXIyKCgobikqVElDS1NfUEVSX01TKS8xMDAwKQotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIEVUSF9SRVNFVCAtIFJlc2V0IGFkYXB0ZXIKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHN0YXRpYyB2b2lkIHQ1OTVfcmVzZXQoc3RydWN0IG5pYyAqbmljKQogewotCWludCBpLCBqOworCWludCBpOwogCiAJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAJCQlSZXNldCAzQ29tIDU5NSBjYXJkCkBAIC0xMzMsNyArMTMyLDcgQEAKIAlvdXR3KEFDS19JTlRSIHwgMHhmZiwgQkFTRSArIFZYX0NPTU1BTkQpOwogCiAJb3V0dyhTRVRfUlhfRklMVEVSIHwgRklMX0lORElWSURVQUwgfAotCSAgICBGSUxfQlJEQ1NULCBCQVNFICsgVlhfQ09NTUFORCk7CisJICAgIEZJTF9CUkRDU1R8RklMX01VTFRJQ0FTVCwgQkFTRSArIFZYX0NPTU1BTkQpOwogCiAJdnhzZXRsaW5rKCk7CiAvKnsKQEAgLTIyNSwxMCArMjI0LDkgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogRVRIX1BPTEwgLSBXYWl0IGZvciBhIGZyYW1lCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgaW50IHQ1OTVfcG9sbChzdHJ1Y3QgbmljICpuaWMpCitzdGF0aWMgaW50IHQ1OTVfcG9sbChzdHJ1Y3QgbmljICpuaWMsIGludCByZXRyaWV2ZSkKIHsKIAkvKiBjb21tb24gdmFyaWFibGVzICovCi0JdW5zaWduZWQgc2hvcnQgdHlwZSA9IDA7CS8qIHVzZWQgYnkgRURFQlVHICovCiAJLyogdmFyaWFibGVzIGZvciAzQzU5NSAqLwogCXNob3J0IHN0YXR1cywgY3N0OwogCXJlZ2lzdGVyIHNob3J0IHJ4X2ZpZm87CkBAIC0yNjIsNiArMjYwLDggQEAKIAlpZiAocnhfZmlmbz09MCkKIAkJcmV0dXJuIDA7CiAKKwlpZiAoICEgcmV0cmlldmUgKSByZXR1cm4gMTsKKwogCQkvKiByZWFkIHBhY2tldCAqLwogI2lmZGVmIEVERUJVRwogCXByaW50ZigiW2w9JWQiLHJ4X2ZpZm8pOwpAQCAtMzAwLDEyICszMDAsMTUgQEAKIAlvdXR3KFJYX0RJU0NBUkRfVE9QX1BBQ0ssIEJBU0UgKyBWWF9DT01NQU5EKTsKIAl3aGlsZSAoaW53KEJBU0UgKyBWWF9TVEFUVVMpICYgU19DT01NQU5EX0lOX1BST0dSRVNTKTsKICNpZmRlZiBFREVCVUcKK3sKKwl1bnNpZ25lZCBzaG9ydCB0eXBlID0gMDsJLyogdXNlZCBieSBFREVCVUcgKi8KIAl0eXBlID0gKG5pYy0+cGFja2V0WzEyXTw8OCkgfCBuaWMtPnBhY2tldFsxM107CiAJaWYobmljLT5wYWNrZXRbMF0rbmljLT5wYWNrZXRbMV0rbmljLT5wYWNrZXRbMl0rbmljLT5wYWNrZXRbM10rbmljLT5wYWNrZXRbNF0rCiAJICAgIG5pYy0+cGFja2V0WzVdID09IDB4RkYqRVRIX0FMRU4pCiAJCXByaW50ZigiLHQ9JWhYLGJdIix0eXBlKTsKIAllbHNlCiAJCXByaW50ZigiLHQ9JWhYXSIsdHlwZSk7Cit9CiAjZW5kaWYKIAlyZXR1cm4gMTsKIH0KQEAgLTM4Miw5ICszODUsOCBAQAogc3RhdGljIHZvaWQgICAgICAgICAgICAKIHZ4c2V0bGluayh2b2lkKQogeyAgICAgICAKLSAgICBpbnQgaSwgaiwgazsKKyAgICBpbnQgaSwgajsKICAgICBjaGFyICpyZWFzb24sICp3YXJuaW5nOwotICAgIHN0YXRpYyBzaG9ydCBwcmV2X2ZsYWdzOwogICAgIHN0YXRpYyBjaGFyIHByZXZfY29ubiA9IC0xOwogCiAgICAgaWYgKHByZXZfY29ubiA9PSAtMSkgewpAQCAtNDM4LDI4ICs0NDAsNDcgQEAKICAgICBHT19XSU5ET1coMSk7IAogfQogCi1zdGF0aWMgdm9pZCB0NTk1X2Rpc2FibGUoc3RydWN0IG5pYyAqbmljKQorc3RhdGljIHZvaWQgdDU5NV9kaXNhYmxlKHN0cnVjdCBkZXYgKmRldikKIHsKLSAgICBvdXR3KFNUT1BfVFJBTlNDRUlWRVIsIEJBU0UgKyBWWF9DT01NQU5EKTsKLSAgICB1ZGVsYXkoODAwMCk7Ci0gICAgR09fV0lORE9XKDQpOwotICAgIG91dHcoMCwgQkFTRSArIFZYX1c0X01FRElBX1RZUEUpOwotICAgIEdPX1dJTkRPVygxKTsKKwlzdHJ1Y3QgbmljICpuaWMgPSAoc3RydWN0IG5pYyAqKWRldjsKKwl0NTk1X3Jlc2V0KG5pYyk7CisKKwlvdXR3KFNUT1BfVFJBTlNDRUlWRVIsIEJBU0UgKyBWWF9DT01NQU5EKTsKKwl1ZGVsYXkoODAwMCk7CisJR09fV0lORE9XKDQpOworCW91dHcoMCwgQkFTRSArIFZYX1c0X01FRElBX1RZUEUpOworCUdPX1dJTkRPVygxKTsKK30KKworc3RhdGljIHZvaWQgdDU5NV9pcnEoc3RydWN0IG5pYyAqbmljIF9fdW51c2VkLCBpcnFfYWN0aW9uX3QgYWN0aW9uIF9fdW51c2VkKQoreworICBzd2l0Y2ggKCBhY3Rpb24gKSB7CisgIGNhc2UgRElTQUJMRSA6CisgICAgYnJlYWs7CisgIGNhc2UgRU5BQkxFIDoKKyAgICBicmVhazsKKyAgY2FzZSBGT1JDRSA6CisgICAgYnJlYWs7CisgIH0KIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiBFVEhfUFJPQkUgLSBMb29rIGZvciBhbiBhZGFwdGVyCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdHJ1Y3QgbmljICp0NTk1X3Byb2JlKHN0cnVjdCBuaWMgKm5pYywgdW5zaWduZWQgc2hvcnQgKnByb2JlYWRkcnMsIHN0cnVjdCBwY2lfZGV2aWNlICpwY2kpCitzdGF0aWMgaW50IHQ1OTVfcHJvYmUoc3RydWN0IGRldiAqZGV2LCBzdHJ1Y3QgcGNpX2RldmljZSAqcGNpKQogeworCXN0cnVjdCBuaWMgKm5pYyA9IChzdHJ1Y3QgbmljICopZGV2OwogCWludCBpOwogCXVuc2lnbmVkIHNob3J0ICpwOwogCi0JaWYgKHByb2JlYWRkcnMgPT0gMCB8fCBwcm9iZWFkZHJzWzBdID09IDApCisJaWYgKHBjaS0+aW9hZGRyID09IDApCiAJCXJldHVybiAwOwogLyoJZXRoX25pY19iYXNlID0gcHJvYmVhZGRyc1swXSAmIH4zOyAqLwogCWV0aF9uaWNfYmFzZSA9IHBjaS0+aW9hZGRyOwogCisJbmljLT5pcnFubyAgPSAwOworCW5pYy0+aW9hZGRyID0gcGNpLT5pb2FkZHIgJiB+MzsKKwogCUdPX1dJTkRPVygwKTsKIAlvdXR3KEdMT0JBTF9SRVNFVCwgQkFTRSArIFZYX0NPTU1BTkQpOwogCVZYX0JVU1lfV0FJVDsKQEAgLTQ4NywxNCArNTA4LDQwIEBACiAJcHJpbnRmKCJFdGhlcm5ldCBhZGRyZXNzOiAlIVxuIiwgbmljLT5ub2RlX2FkZHIpOwogCiAJdDU5NV9yZXNldChuaWMpOwotCW5pYy0+cmVzZXQgPSB0NTk1X3Jlc2V0OwotCW5pYy0+cG9sbCA9IHQ1OTVfcG9sbDsKKwlkZXYtPmRpc2FibGUgID0gdDU5NV9kaXNhYmxlOworCW5pYy0+cG9sbCAgICAgPSB0NTk1X3BvbGw7CiAJbmljLT50cmFuc21pdCA9IHQ1OTVfdHJhbnNtaXQ7Ci0JbmljLT5kaXNhYmxlID0gdDU5NV9kaXNhYmxlOwotCXJldHVybiBuaWM7CisJbmljLT5pcnEgICAgICA9IHQ1OTVfaXJxOworCXJldHVybiAxOwogCiB9CiAKK3N0YXRpYyBzdHJ1Y3QgcGNpX2lkIHQ1OTVfbmljc1tdID0geworUENJX1JPTSgweDEwYjcsIDB4NTkwMCwgIjNjNTkwIiwgICAgICAgICAgICIzQ29tNTkwIiksCQkvKiBWb3J0ZXggMTBNYnBzICovCitQQ0lfUk9NKDB4MTBiNywgMHg1OTUwLCAiM2M1OTUiLCAgICAgICAgICAgIjNDb201OTUiKSwJCS8qIFZvcnRleCAxMDBiYXNlVHggKi8KK1BDSV9ST00oMHgxMGI3LCAweDU5NTEsICIzYzU5NS0xIiwgICAgICAgICAiM0NvbTU5NSIpLAkJLyogVm9ydGV4IDEwMGJhc2VUNCAqLworUENJX1JPTSgweDEwYjcsIDB4NTk1MiwgIjNjNTk1LTIiLCAgICAgICAgICIzQ29tNTk1IiksCQkvKiBWb3J0ZXggMTAwYmFzZS1NSUkgKi8KK1BDSV9ST00oMHgxMGI3LCAweDkwMDAsICIzYzkwMC10cG8iLCAgICAgICAiM0NvbTkwMC1UUE8iKSwJLyogMTAgQmFzZSBUUE8gKi8KK1BDSV9ST00oMHgxMGI3LCAweDkwMDEsICIzYzkwMC10NCIsICAgICAgICAiM0NvbTkwMC1Db21ibyIpLAkvKiAxMC8xMDAgVDQgKi8KK1BDSV9ST00oMHgxMGI3LCAweDkwMDQsICIzYzkwMGItdHBvIiwgICAgICAiM0NvbTkwMEItVFBPIiksCS8qIDEwIEJhc2UgVFBPICovCitQQ0lfUk9NKDB4MTBiNywgMHg5MDA1LCAiM2M5MDBiLWNvbWJvIiwgICAgIjNDb205MDBCLUNvbWJvIiksCS8qIDEwIEJhc2UgQ29tYm8gKi8KK1BDSV9ST00oMHgxMGI3LCAweDkwMDYsICIzYzkwMGItdHBiMiIsICAgICAiM0NvbTkwMEItMi9UIiksCS8qIDEwIEJhc2UgVFAgYW5kIEJhc2UyICovCitQQ0lfUk9NKDB4MTBiNywgMHg5MDBhLCAiM2M5MDBiLWZsIiwgICAgICAgIjNDb205MDBCLUZMIiksCS8qIDEwIEJhc2UgRiAqLworUENJX1JPTSgweDEwYjcsIDB4OTgwMCwgIjNjOTgwLWN5Y2xvbmUtMSIsICIzQ29tOTgwLUN5Y2xvbmUiKSwJLyogQ3ljbG9uZSAqLworUENJX1JPTSgweDEwYjcsIDB4OTgwNSwgIjNjOTgwNS0xIiwgICAgICAgICIzQ29tOTgwNSIpLAkJLyogRHVhbCBQb3J0IFNlcnZlciBDeWNsb25lICovCitQQ0lfUk9NKDB4MTBiNywgMHg3NjQ2LCAiM2Nzb2hvMTAwLXR4LTEiLCAgIjNDU09ITzEwMC1UWCIpLAkvKiBIdXJyaWNhbmUgKi8KK1BDSV9ST00oMHgxMGI3LCAweDQ1MDAsICIzYzQ1MC0xIiwgICAgICAgICAiM0NvbTQ1MCBIb21lUE5BIFRvcm5hZG8iKSwKK307CisKK3N0cnVjdCBwY2lfZHJpdmVyIHQ1OTVfZHJpdmVyID0geworCS50eXBlICAgICA9IE5JQ19EUklWRVIsCisJLm5hbWUgICAgID0gIjNDNTk1IiwKKwkucHJvYmUgICAgPSB0NTk1X3Byb2JlLAorCS5pZHMgICAgICA9IHQ1OTVfbmljcywKKwkuaWRfY291bnQgPSBzaXplb2YodDU5NV9uaWNzKS9zaXplb2YodDU5NV9uaWNzWzBdKSwKKwkuY2xhc3MgICAgPSAwLAorfTsKKwogLyoKICAqIExvY2FsIHZhcmlhYmxlczoKICAqICBjLWJhc2ljLW9mZnNldDogOApkaWZmIC1OYXVyIGdydWItMC45Ny5vcmlnL25ldGJvb3QvM2M5MHguYyBncnViLTAuOTcvbmV0Ym9vdC8zYzkweC5jCi0tLSBncnViLTAuOTcub3JpZy9uZXRib290LzNjOTB4LmMJMjAwMy0wNy0wOSAxMTo0NTozNy4wMDAwMDAwMDAgKzAwMDAKKysrIGdydWItMC45Ny9uZXRib290LzNjOTB4LmMJMjAwNS0wOC0zMSAxOTowMzozNS4wMDAwMDAwMDAgKzAwMDAKQEAgLTEsNyArMSw3IEBACiAvKgogICogM2M5MHguYyAtLSBUaGlzIGZpbGUgaW1wbGVtZW50cyB0aGUgM2M5MHggZHJpdmVyIGZvciBldGhlcmJvb3QuICBXcml0dGVuCiAgKiBieSBHcmVnIEJlZWxleSwgR3JlZy5CZWVsZXlATGlnaHRTeXMub3JnLiAgTW9kaWZpZWQgYnkgU3RldmUgU21pdGgsCi0gKiBTdGV2ZS5TbWl0aEBKdW5vLkNvbQorICogU3RldmUuU21pdGhASnVuby5Db20uIEFsaWdubWVudCBidWcgZml4IE5laWwgTmV3ZWxsIChubkBpY2Vub2lyLm5ldCkuCiAgKgogICogVGhpcyBwcm9ncmFtIENvcHlyaWdodCAoQykgMTk5OSBMaWdodFN5cyBUZWNobm9sb2d5IFNlcnZpY2VzLCBJbmMuCiAgKiBQb3J0aW9ucyBDb3B5cmlnaHQgKEMpIDE5OTkgU3RldmUgU21pdGgKQEAgLTMxLDEzICszMSwxNSBAQAogICoJCQkJCVJlLXdyb3RlIHBvbGwgYW5kIHRyYW5zbWl0IGZvcgogICoJCQkJCWJldHRlciBlcnJvciByZWNvdmVyeSBhbmQgaGVhdnkKICAqCQkJCQluZXR3b3JrIHRyYWZmaWMgb3BlcmF0aW9uCisgKiB2Mi4wMSAgICA1LTI2LTIwMDMgTk4gRml4ZWQgZHJpdmVyIGFsaWdubWVudCBpc3N1ZSB3aGljaAorICogICAgICAgICAgICAgICAgICBjYXVzZWQgc3lzdGVtIGxvY2t1cHMgaWYgZHJpdmVyIHN0cnVjdHVyZXMKKyAqICAgICAgICAgICAgICAgICAgbm90IDgtYnl0ZSBhbGlnbmVkLgogICoKICAqLwogCiAjaW5jbHVkZSAiZXRoZXJib290LmgiCiAjaW5jbHVkZSAibmljLmgiCiAjaW5jbHVkZSAicGNpLmgiCi0jaW5jbHVkZSAiY2FyZHMuaCIKICNpbmNsdWRlICJ0aW1lci5oIgogCiAjZGVmaW5lCVhDVlJfTUFHSUMJKDB4NUEwMCkKQEAgLTQ3LDkgKzQ5LDYgQEAKICAqKi8KICNkZWZpbmUJWE1JVF9SRVRSSUVTCTI1MAogCi0jdW5kZWYJdmlydF90b19idXMKLSNkZWZpbmUJdmlydF90b19idXMoeCkJKCh1bnNpZ25lZCBsb25nKXgpCi0KIC8qKiogUmVnaXN0ZXIgZGVmaW5pdGlvbnMgZm9yIHRoZSAzYzkwNSAqKiovCiBlbnVtIFJlZ2lzdGVycwogICAgIHsKQEAgLTIyNSw3ICsyMjQsNyBAQAogICAgIHVuc2lnbmVkIGludAlEYXRhQWRkcjsKICAgICB1bnNpZ25lZCBpbnQJRGF0YUxlbmd0aDsKICAgICB9Ci0gICAgVFhEOworICAgIFRYRCBfX2F0dHJpYnV0ZV9fICgoYWxpZ25lZCg4KSkpOyAvKiA2NC1iaXQgYWxpZ25lZCBmb3IgYnVzIG1hc3RlcmluZyAqLwogCiAvKioqIFJYIGRlc2NyaXB0b3IgKioqLwogdHlwZWRlZiBzdHJ1Y3QKQEAgLTIzNSw3ICsyMzQsNyBAQAogICAgIHVuc2lnbmVkIGludAlEYXRhQWRkcjsKICAgICB1bnNpZ25lZCBpbnQJRGF0YUxlbmd0aDsKICAgICB9Ci0gICAgUlhEOworICAgIFJYRCBfX2F0dHJpYnV0ZV9fICgoYWxpZ25lZCg4KSkpOyAvKiA2NC1iaXQgYWxpZ25lZCBmb3IgYnVzIG1hc3RlcmluZyAqLwogCiAvKioqIEdsb2JhbCB2YXJpYWJsZXMgKioqLwogc3RhdGljIHN0cnVjdApAQCAtMzExLDYgKzMxMCw3IEBACiAgICAgfQogCiAKKyNpZiAwCiAvKioqIGEzYzkweF9pbnRlcm5hbF9Xcml0ZUVlcHJvbVdvcmQgLSB3cml0ZSBhIHBoeXNpY2FsIHdvcmQgb2YKICAqKiogZGF0YSB0byB0aGUgb25ib2FyZCBzZXJpYWwgZWVwcm9tIChub3QgdGhlIEJJT1MgcHJvbSwgYnV0IHRoZQogICoqKiBudnJhbSBpbiB0aGUgY2FyZCB0aGF0IHN0b3JlcywgYW1vbmcgb3RoZXIgdGhpbmdzLCB0aGUgTUFDCkBAIC0zNDQsOCArMzQ0LDkgQEAKIAogICAgIHJldHVybiAwOwogICAgIH0KKyNlbmRpZgogCi0KKyNpZiAwCiAvKioqIGEzYzkweF9pbnRlcm5hbF9Xcml0ZUVlcHJvbSAtIHdyaXRlIGRhdGEgdG8gdGhlIHNlcmlhbCBlZXByb20sCiAgKioqIGFuZCByZS1jb21wdXRlIHRoZSBlZXByb20gY2hlY2tzdW0uCiAgKioqLwpAQCAtMzg0LDggKzM4NSw3IEBACiAKICAgICByZXR1cm4gMDsKICAgICB9Ci0KLQorI2VuZGlmCiAKIC8qKiogYTNjOTB4X3Jlc2V0OiBleHBvcnRlZCBmdW5jdGlvbiB0aGF0IHJlc2V0cyB0aGUgY2FyZCB0byBpdHMgZGVmYXVsdAogICoqKiBzdGF0ZS4gIFRoaXMgaXMgc28gdGhlIExpbnV4IGRyaXZlciBjYW4gcmUtc2V0IHRoZSBjYXJkIHVwIHRoZSB3YXkKQEAgLTM5MywxMiArMzkzLDEwIEBACiAgKioqIG5vdCBhbHRlciB0aGUgc2VsZWN0ZWQgdHJhbnNjZWl2ZXIgdGhhdCB3ZSB1c2VkIHRvIGRvd25sb2FkIHRoZSBib290CiAgKioqIGltYWdlLgogICoqKi8KLXN0YXRpYyB2b2lkCi1hM2M5MHhfcmVzZXQoc3RydWN0IG5pYyAqbmljKQorc3RhdGljIHZvaWQgYTNjOTB4X3Jlc2V0KHZvaWQpCiAgICAgewotICAgIGludCBjZmc7Ci0KICNpZmRlZglDRkdfM0M5MFhfUFJFU0VSVkVfWENWUgorICAgIGludCBjZmc7CiAgICAgLyoqIFJlYWQgdGhlIGN1cnJlbnQgSW50ZXJuYWxDb25maWcgdmFsdWUuICoqLwogICAgIGEzYzkweF9pbnRlcm5hbF9TZXRXaW5kb3coSU5GXzNDOTBYLklPQWRkciwgd2luVHhSeE9wdGlvbnMzKTsKICAgICBjZmcgPSBpbmwoSU5GXzNDOTBYLklPQWRkciArIHJlZ0ludGVybmFsQ29uZmlnXzNfbCk7CkBAIC00NzMsNyArNDcxLDcgQEAKICAqKiogcCAtIHRoZSBwb2ludGVyIHRvIHRoZSBwYWNrZXQgZGF0YSBpdHNlbGYuCiAgKioqLwogc3RhdGljIHZvaWQKLWEzYzkweF90cmFuc21pdChzdHJ1Y3QgbmljICpuaWMsIGNvbnN0IGNoYXIgKmQsIHVuc2lnbmVkIGludCB0LAorYTNjOTB4X3RyYW5zbWl0KHN0cnVjdCBuaWMgKm5pYyBfX3VudXNlZCwgY29uc3QgY2hhciAqZCwgdW5zaWduZWQgaW50IHQsCiAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IHMsIGNvbnN0IGNoYXIgKnApCiAgICAgewogCkBAIC01NTMsNyArNTUxLDcgQEAKIAlpZiAoc3RhdHVzICYgMHgwMikKIAkgICAgewogCSAgICBwcmludGYoIjNDOTBYOiBUeCBSZWNsYWltIEVycm9yICglaGhYKVxuIiwgc3RhdHVzKTsKLQkgICAgYTNjOTB4X3Jlc2V0KE5VTEwpOworCSAgICBhM2M5MHhfcmVzZXQoKTsKIAkgICAgfQogCWVsc2UgaWYgKHN0YXR1cyAmIDB4MDQpCiAJICAgIHsKQEAgLTU3MiwxOCArNTcwLDE4IEBACiAJZWxzZSBpZiAoc3RhdHVzICYgMHgxMCkKIAkgICAgewogCSAgICBwcmludGYoIjNDOTBYOiBUeCBVbmRlcnJ1biAoJWhoWClcbiIsIHN0YXR1cyk7Ci0JICAgIGEzYzkweF9yZXNldChOVUxMKTsKKwkgICAgYTNjOTB4X3Jlc2V0KCk7CiAJICAgIH0KIAllbHNlIGlmIChzdGF0dXMgJiAweDIwKQogCSAgICB7CiAJICAgIHByaW50ZigiM0M5MFg6IFR4IEphYmJlciAoJWhoWClcbiIsIHN0YXR1cyk7Ci0JICAgIGEzYzkweF9yZXNldChOVUxMKTsKKwkgICAgYTNjOTB4X3Jlc2V0KCk7CiAJICAgIH0KIAllbHNlIGlmICgoc3RhdHVzICYgMHg4MCkgIT0gMHg4MCkKIAkgICAgewogCSAgICBwcmludGYoIjNDOTBYOiBJbnRlcm5hbCBFcnJvciAtIEluY29tcGxldGUgVHJhbnNtaXNzaW9uICglaGhYKVxuIiwKIAkgICAgICAgICAgIHN0YXR1cyk7Ci0JICAgIGEzYzkweF9yZXNldChOVUxMKTsKKwkgICAgYTNjOTB4X3Jlc2V0KCk7CiAJICAgIH0KIAl9CiAKQEAgLTYwMSw3ICs1OTksNyBAQAogICoqKiBpbiBuaWMtPnBhY2tldGxlbi4gIFJldHVybiAxIGlmIGEgcGFja2V0IHdhcyBmb3VuZC4KICAqKiovCiBzdGF0aWMgaW50Ci1hM2M5MHhfcG9sbChzdHJ1Y3QgbmljICpuaWMpCithM2M5MHhfcG9sbChzdHJ1Y3QgbmljICpuaWMsIGludCByZXRyaWV2ZSkKICAgICB7CiAgICAgaW50IGksIGVycmNvZGU7CiAKQEAgLTYxMCw2ICs2MDgsOCBAQAogCXJldHVybiAwOwogCX0KIAorICAgIGlmICggISByZXRyaWV2ZSApIHJldHVybiAxOworCiAgICAgLyoqIHdlIGRvbid0IG5lZWQgdG8gYWNrbm93bGVkZ2UgcnhDb21wbGV0ZSAtLSB0aGUgdXBsb2FkIGVuZ2luZQogICAgICAqKiBkb2VzIGl0IGZvciB1cy4KICAgICAgKiovCkBAIC02NjMsMzQgKzY2Myw1MSBAQAogICoqKiBbS2VuXQogICoqKi8KIHN0YXRpYyB2b2lkCi1hM2M5MHhfZGlzYWJsZShzdHJ1Y3QgbmljICpuaWMpCi0gICAgeworYTNjOTB4X2Rpc2FibGUoc3RydWN0IGRldiAqZGV2IF9fdW51c2VkKQoreworCS8qIHJlc2V0IGFuZCBkaXNhYmxlIG1lcmdlICovCisJYTNjOTB4X3Jlc2V0KCk7CiAJLyogRGlzYWJsZSB0aGUgcmVjZWl2ZXIgYW5kIHRyYW5zbWl0dGVyLiAqLwogCW91dHcoY21kUnhEaXNhYmxlLCBJTkZfM0M5MFguSU9BZGRyICsgcmVnQ29tbWFuZEludFN0YXR1c193KTsKIAlvdXR3KGNtZFR4RGlzYWJsZSwgSU5GXzNDOTBYLklPQWRkciArIHJlZ0NvbW1hbmRJbnRTdGF0dXNfdyk7Ci0gICAgfQotCit9CiAKK3N0YXRpYyB2b2lkIGEzYzkweF9pcnEoc3RydWN0IG5pYyAqbmljIF9fdW51c2VkLCBpcnFfYWN0aW9uX3QgYWN0aW9uIF9fdW51c2VkKQoreworICBzd2l0Y2ggKCBhY3Rpb24gKSB7CisgIGNhc2UgRElTQUJMRSA6CisgICAgYnJlYWs7CisgIGNhc2UgRU5BQkxFIDoKKyAgICBicmVhazsKKyAgY2FzZSBGT1JDRSA6CisgICAgYnJlYWs7CisgIH0KK30KIAogLyoqKiBhM2M5MHhfcHJvYmU6IGV4cG9ydGVkIHJvdXRpbmUgdG8gcHJvYmUgZm9yIHRoZSAzYzkwNSBjYXJkIGFuZCBwZXJmb3JtCiAgKioqIGluaXRpYWxpemF0aW9uLiAgSWYgdGhpcyByb3V0aW5lIGlzIGNhbGxlZCwgdGhlIHBjaSBmdW5jdGlvbnMgZGlkIGZpbmQgdGhlCiAgKioqIGNhcmQuICBXZSBqdXN0IGhhdmUgdG8gaW5pdCBpdCBoZXJlLgogICoqKi8KLXN0cnVjdCBuaWMqCi1hM2M5MHhfcHJvYmUoc3RydWN0IG5pYyAqbmljLCB1bnNpZ25lZCBzaG9ydCAqcHJvYmVhZGRycywgc3RydWN0IHBjaV9kZXZpY2UgKnBjaSkKLSAgICB7CitzdGF0aWMgaW50IGEzYzkweF9wcm9iZShzdHJ1Y3QgZGV2ICpkZXYsIHN0cnVjdCBwY2lfZGV2aWNlICpwY2kpCit7CisgICAgc3RydWN0IG5pYyAqbmljID0gKHN0cnVjdCBuaWMgKilkZXY7CiAgICAgaW50IGksIGM7CiAgICAgdW5zaWduZWQgc2hvcnQgZWVwcm9tWzB4MjFdOwogICAgIHVuc2lnbmVkIGludCBjZmc7CiAgICAgdW5zaWduZWQgaW50IG1vcHQ7CisgICAgdW5zaWduZWQgaW50IG1zdGF0OwogICAgIHVuc2lnbmVkIHNob3J0IGxpbmt0eXBlOworI2RlZmluZQlIV0FERFJfT0ZGU0VUCTEwCiAKLSAgICBpZiAocHJvYmVhZGRycyA9PSAwIHx8IHByb2JlYWRkcnNbMF0gPT0gMCkKKyAgICBpZiAocGNpLT5pb2FkZHIgPT0gMCkKICAgICAgICAgICByZXR1cm4gMDsKIAogICAgIGFkanVzdF9wY2lfZGV2aWNlKHBjaSk7CiAKLSAgICBJTkZfM0M5MFguSU9BZGRyID0gcHJvYmVhZGRyc1swXSAmIH4zOworICAgIG5pYy0+aW9hZGRyID0gcGNpLT5pb2FkZHIgJiB+MzsKKyAgICBuaWMtPmlycW5vID0gMDsKKworICAgIElORl8zQzkwWC5JT0FkZHIgPSBwY2ktPmlvYWRkciAmIH4zOwogICAgIElORl8zQzkwWC5DdXJyZW50V2luZG93ID0gMjU1OwogICAgIHN3aXRjaCAoYTNjOTB4X2ludGVybmFsX1JlYWRFZXByb20oSU5GXzNDOTBYLklPQWRkciwgMHgwMykpCiAJewpAQCAtNzU2LDMwICs3NzMsNDUgQEAKICAgICAgICAgICAgIkNvcHlyaWdodCAxOTk5IExpZ2h0U3lzIFRlY2hub2xvZ3kgU2VydmljZXMsIEluYy5cbiIKICAgICAgICAgICAgIlBvcnRpb25zIENvcHlyaWdodCAxOTk5IFN0ZXZlIFNtaXRoXG4iKTsKICAgICBwcmludGYoIlByb3ZpZGVkIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS5cbiIpOworI2lmZGVmCUNGR18zQzkwWF9CT09UUk9NX0ZJWAorICAgIGlmIChJTkZfM0M5MFguaXNCcmV2KQorICAgICAgICB7CisgICAgICAgIHByaW50ZigiTk9URTogM2M5MDViIGJvb3Ryb20gZml4IGVuYWJsZWQ7IGhhcyBzaWRlICIKKwkgICAiZWZmZWN0cy4gIFNlZSAzYzkweC50eHQgZm9yIGluZm8uXG4iKTsKKwl9CisjZW5kaWYKICAgICBwcmludGYoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iCiAgICAgICAgICAgICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIpOwogCiAgICAgLyoqIFJldHJpZXZlIHRoZSBIYXJkd2FyZSBhZGRyZXNzIGFuZCBwcmludCBpdCBvbiB0aGUgc2NyZWVuLiAqKi8KLSAgICBJTkZfM0M5MFguSFdBZGRyWzBdID0gZWVwcm9tWzBdPj44OwotICAgIElORl8zQzkwWC5IV0FkZHJbMV0gPSBlZXByb21bMF0mMHhGRjsKLSAgICBJTkZfM0M5MFguSFdBZGRyWzJdID0gZWVwcm9tWzFdPj44OwotICAgIElORl8zQzkwWC5IV0FkZHJbM10gPSBlZXByb21bMV0mMHhGRjsKLSAgICBJTkZfM0M5MFguSFdBZGRyWzRdID0gZWVwcm9tWzJdPj44OwotICAgIElORl8zQzkwWC5IV0FkZHJbNV0gPSBlZXByb21bMl0mMHhGRjsKKyAgICBJTkZfM0M5MFguSFdBZGRyWzBdID0gZWVwcm9tW0hXQUREUl9PRkZTRVQgKyAwXT4+ODsKKyAgICBJTkZfM0M5MFguSFdBZGRyWzFdID0gZWVwcm9tW0hXQUREUl9PRkZTRVQgKyAwXSYweEZGOworICAgIElORl8zQzkwWC5IV0FkZHJbMl0gPSBlZXByb21bSFdBRERSX09GRlNFVCArIDFdPj44OworICAgIElORl8zQzkwWC5IV0FkZHJbM10gPSBlZXByb21bSFdBRERSX09GRlNFVCArIDFdJjB4RkY7CisgICAgSU5GXzNDOTBYLkhXQWRkcls0XSA9IGVlcHJvbVtIV0FERFJfT0ZGU0VUICsgMl0+Pjg7CisgICAgSU5GXzNDOTBYLkhXQWRkcls1XSA9IGVlcHJvbVtIV0FERFJfT0ZGU0VUICsgMl0mMHhGRjsKICAgICBwcmludGYoIk1BQyBBZGRyZXNzID0gJSFcbiIsIElORl8zQzkwWC5IV0FkZHIpOwogCisgICAgLyogVGVzdCBpZiB0aGUgbGluayBpcyBnb29kLCBpZiBub3QgY29udGludWUgKi8KKyAgICBhM2M5MHhfaW50ZXJuYWxfU2V0V2luZG93KElORl8zQzkwWC5JT0FkZHIsIHdpbkRpYWdub3N0aWNzNCk7CisgICAgbXN0YXQgPSBpbncoSU5GXzNDOTBYLklPQWRkciArIHJlZ01lZGlhU3RhdHVzXzRfdyk7CisgICAgaWYoKG1zdGF0ICYgKDE8PDExKSkgPT0gMCkgeworCXByaW50ZigiVmFsaWQgbGluayBub3QgZXN0YWJsaXNoZWRcbiIpOworCXJldHVybiAwOworICAgIH0KKwogICAgIC8qKiBQcm9ncmFtIHRoZSBNQUMgYWRkcmVzcyBpbnRvIHRoZSBzdGF0aW9uIGFkZHJlc3MgcmVnaXN0ZXJzICoqLwogICAgIGEzYzkweF9pbnRlcm5hbF9TZXRXaW5kb3coSU5GXzNDOTBYLklPQWRkciwgd2luQWRkcmVzc2luZzIpOwotICAgIG91dHcoaHRvbnMoZWVwcm9tWzBdKSwgSU5GXzNDOTBYLklPQWRkciArIHJlZ1N0YXRpb25BZGRyZXNzXzJfM3cpOwotICAgIG91dHcoaHRvbnMoZWVwcm9tWzFdKSwgSU5GXzNDOTBYLklPQWRkciArIHJlZ1N0YXRpb25BZGRyZXNzXzJfM3crMik7Ci0gICAgb3V0dyhodG9ucyhlZXByb21bMl0pLCBJTkZfM0M5MFguSU9BZGRyICsgcmVnU3RhdGlvbkFkZHJlc3NfMl8zdys0KTsKKyAgICBvdXR3KGh0b25zKGVlcHJvbVtIV0FERFJfT0ZGU0VUICsgMF0pLCBJTkZfM0M5MFguSU9BZGRyICsgcmVnU3RhdGlvbkFkZHJlc3NfMl8zdyk7CisgICAgb3V0dyhodG9ucyhlZXByb21bSFdBRERSX09GRlNFVCArIDFdKSwgSU5GXzNDOTBYLklPQWRkciArIHJlZ1N0YXRpb25BZGRyZXNzXzJfM3crMik7CisgICAgb3V0dyhodG9ucyhlZXByb21bSFdBRERSX09GRlNFVCArIDJdKSwgSU5GXzNDOTBYLklPQWRkciArIHJlZ1N0YXRpb25BZGRyZXNzXzJfM3crNCk7CiAgICAgb3V0dygwLCBJTkZfM0M5MFguSU9BZGRyICsgcmVnU3RhdGlvbk1hc2tfMl8zdyswKTsKICAgICBvdXR3KDAsIElORl8zQzkwWC5JT0FkZHIgKyByZWdTdGF0aW9uTWFza18yXzN3KzIpOwogICAgIG91dHcoMCwgSU5GXzNDOTBYLklPQWRkciArIHJlZ1N0YXRpb25NYXNrXzJfM3crNCk7CiAKICAgICAvKiogRmlsbCBpbiBvdXIgZW50cnkgaW4gdGhlIGV0aGVyYm9vdCBhcnAgdGFibGUgKiovCiAgICAgZm9yKGk9MDtpPEVUSF9BTEVOO2krKykKLQluaWMtPm5vZGVfYWRkcltpXSA9IChlZXByb21baS8yXSA+PiAoOCooKGkmMSleMSkpKSAmIDB4ZmY7CisJbmljLT5ub2RlX2FkZHJbaV0gPSAoZWVwcm9tW0hXQUREUl9PRkZTRVQgKyBpLzJdID4+ICg4KigoaSYxKV4xKSkpICYgMHhmZjsKIAogICAgIC8qKiBSZWFkIHRoZSBtZWRpYSBvcHRpb25zIHJlZ2lzdGVyLCBwcmludCBhIG1lc3NhZ2UgYW5kIHNldCBkZWZhdWx0CiAgICAgICoqIHhjdnIuCkBAIC05MDMsOCArOTM1LDggQEAKICAgICB3aGlsZSAoaW53KElORl8zQzkwWC5JT0FkZHIgKyByZWdDb21tYW5kSW50U3RhdHVzX3cpICYgSU5UX0NNRElOUFJPR1JFU1MpCiAJOwogCi0gICAgLyoqIFNldCB0aGUgUlggZmlsdGVyID0gcmVjZWl2ZSBvbmx5IGluZGl2aWR1YWwgcGt0cyAmIGJjYXN0LiAqKi8KLSAgICBhM2M5MHhfaW50ZXJuYWxfSXNzdWVDb21tYW5kKElORl8zQzkwWC5JT0FkZHIsIGNtZFNldFJ4RmlsdGVyLCAweDAxICsgMHgwNCk7CisgICAgLyoqIFNldCB0aGUgUlggZmlsdGVyID0gcmVjZWl2ZSBvbmx5IGluZGl2aWR1YWwgcGt0cyAmIG11bHRpY2FzdCAmIGJjYXN0LiAqKi8KKyAgICBhM2M5MHhfaW50ZXJuYWxfSXNzdWVDb21tYW5kKElORl8zQzkwWC5JT0FkZHIsIGNtZFNldFJ4RmlsdGVyLCAweDAxICsgMHgwMiArIDB4MDQpOwogICAgIGEzYzkweF9pbnRlcm5hbF9Jc3N1ZUNvbW1hbmQoSU5GXzNDOTBYLklPQWRkciwgY21kUnhFbmFibGUsIDApOwogCiAKQEAgLTkxOCwxMiArOTUwLDQ2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbWRBY2tub3dsZWRnZUludGVycnVwdCwgMHg2NjEpOwogCiAgICAgLyoqIFNldCBvdXIgZXhwb3J0ZWQgZnVuY3Rpb25zICoqLwotICAgIG5pYy0+cmVzZXQgICAgPSBhM2M5MHhfcmVzZXQ7CisgICAgZGV2LT5kaXNhYmxlICA9IGEzYzkweF9kaXNhYmxlOwogICAgIG5pYy0+cG9sbCAgICAgPSBhM2M5MHhfcG9sbDsKICAgICBuaWMtPnRyYW5zbWl0ID0gYTNjOTB4X3RyYW5zbWl0OwotICAgIG5pYy0+ZGlzYWJsZSAgPSBhM2M5MHhfZGlzYWJsZTsKKyAgICBuaWMtPmlycSAgICAgID0gYTNjOTB4X2lycTsKIAotICAgIHJldHVybiBuaWM7Ci0gICAgfQorICAgIHJldHVybiAxOworfQogCiAKK3N0YXRpYyBzdHJ1Y3QgcGNpX2lkIGEzYzkweF9uaWNzW10gPSB7CisvKiBPcmlnaW5hbCA5MHggcmV2aXNpb25zOiAqLworUENJX1JPTSgweDEwYjcsIDB4OTAwMCwgIjNjOTA1LXRwbyIsICAgICAiM0NvbTkwMC1UUE8iKSwJLyogMTAgQmFzZSBUUE8gKi8KK1BDSV9ST00oMHgxMGI3LCAweDkwMDEsICIzYzkwNS10NCIsICAgICAgIjNDb205MDAtQ29tYm8iKSwJLyogMTAvMTAwIFQ0ICovCitQQ0lfUk9NKDB4MTBiNywgMHg5MDUwLCAiM2M5MDUtdHBvMTAwIiwgICIzQ29tOTA1LVRYIiksCQkvKiAxMDAgQmFzZSBUWCAvIDEwLzEwMCBUUE8gKi8KK1BDSV9ST00oMHgxMGI3LCAweDkwNTEsICIzYzkwNS1jb21ibyIsICAgIjNDb205MDUtVDQiKSwJCS8qIDEwMCBCYXNlIFQ0IC8gMTAgQmFzZSBDb21ibyAqLworLyogTmV3ZXIgOTB4QiByZXZpc2lvbnM6ICovCitQQ0lfUk9NKDB4MTBiNywgMHg5MDA0LCAiM2M5MDViLXRwbyIsICAgICIzQ29tOTAwQi1UUE8iKSwJLyogMTAgQmFzZSBUUE8gKi8KK1BDSV9ST00oMHgxMGI3LCAweDkwMDUsICIzYzkwNWItY29tYm8iLCAgIjNDb205MDBCLUNvbWJvIiksCS8qIDEwIEJhc2UgQ29tYm8gKi8KK1BDSV9ST00oMHgxMGI3LCAweDkwMDYsICIzYzkwNWItdHBiMiIsICAgIjNDb205MDBCLTIvVCIpLAkvKiAxMCBCYXNlIFRQIGFuZCBCYXNlMiAqLworUENJX1JPTSgweDEwYjcsIDB4OTAwYSwgIjNjOTA1Yi1mbCIsICAgICAiM0NvbTkwMEItRkwiKSwJLyogMTAgQmFzZSBGTCAqLworUENJX1JPTSgweDEwYjcsIDB4OTA1NSwgIjNjOTA1Yi10cG8xMDAiLCAiM0NvbTkwNUItVFgiKSwJLyogMTAvMTAwIFRQTyAqLworUENJX1JPTSgweDEwYjcsIDB4OTA1NiwgIjNjOTA1Yi10NCIsICAgICAiM0NvbTkwNUItVDQiKSwJLyogMTAvMTAwIFQ0ICovCitQQ0lfUk9NKDB4MTBiNywgMHg5MDU4LCAiM2M5MDViLTkwNTgiLCAgICIzQ29tOTA1Qi05MDU4IiksCS8qIEN5Y2xvbmUgMTAvMTAwL0JOQyAqLworUENJX1JPTSgweDEwYjcsIDB4OTA1YSwgIjNjOTA1Yi1meCIsICAgICAiM0NvbTkwNUItRkwiKSwJLyogMTAwIEJhc2UgRlggLyAxMCBCYXNlIEZYICovCisvKiBOZXdlciA5MHhDIHJldmlzaW9uOiAqLworUENJX1JPTSgweDEwYjcsIDB4OTIwMCwgIjNjOTA1Yy10cG8iLCAgICAiM0NvbTkwNUMtVFhNIiksCS8qIDEwLzEwMCBUUE8gKDNDOTA1Qy1UWE0pICovCitQQ0lfUk9NKDB4MTBiNywgMHg5MjEwLCAiM2M5MjBiLWVtYi13bm0iLCIzQ29tMjBCLUVNQiBXTk0iKSwKK1BDSV9ST00oMHgxMGI3LCAweDk4MDAsICIzYzk4MCIsICAgICAgICAgIjNDb205ODAtQ3ljbG9uZSIpLAkvKiBDeWNsb25lICovCitQQ0lfUk9NKDB4MTBiNywgMHg5ODA1LCAiM2M5ODA1IiwgICAgICAgICIzQ29tOTgwNSIpLAkJLyogRHVhbCBQb3J0IFNlcnZlciBDeWNsb25lICovCitQQ0lfUk9NKDB4MTBiNywgMHg3NjQ2LCAiM2Nzb2hvMTAwLXR4IiwgICIzQ1NPSE8xMDAtVFgiKSwJLyogSHVycmljYW5lICovCitQQ0lfUk9NKDB4MTBiNywgMHg0NTAwLCAiM2M0NTAiLCAgICAgICAgICIzQ29tNDUwIEhvbWVQTkEgVG9ybmFkbyIpLAorUENJX1JPTSgweDEwYjcsIDB4MTIwMSwgIjNjOTgyYSIsICAgICAgICAiM0NvbTk4MkEiKSwKK1BDSV9ST00oMHgxMGI3LCAweDEyMDIsICIzYzk4MmIiLCAgICAgICAgIjNDb205ODJCIiksCit9OworCitzdHJ1Y3QgcGNpX2RyaXZlciBhM2M5MHhfZHJpdmVyID0geworCS50eXBlICAgICA9IE5JQ19EUklWRVIsCisJLm5hbWUgICAgID0gIjNDOTBYIiwKKwkucHJvYmUgICAgPSBhM2M5MHhfcHJvYmUsCisJLmlkcyAgICAgID0gYTNjOTB4X25pY3MsCisJLmlkX2NvdW50ID0gc2l6ZW9mKGEzYzkweF9uaWNzKS9zaXplb2YoYTNjOTB4X25pY3NbMF0pLAorCS5jbGFzcyAgICA9IDAsCit9OwpkaWZmIC1OYXVyIGdydWItMC45Ny5vcmlnL25ldGJvb3QvM2M5MHgudHh0IGdydWItMC45Ny9uZXRib290LzNjOTB4LnR4dAotLS0gZ3J1Yi0wLjk3Lm9yaWcvbmV0Ym9vdC8zYzkweC50eHQJMjAwMy0wNy0wOSAxMTo0NTozNy4wMDAwMDAwMDAgKzAwMDAKKysrIGdydWItMC45Ny9uZXRib290LzNjOTB4LnR4dAkxOTcwLTAxLTAxIDAwOjAwOjAwLjAwMDAwMDAwMCArMDAwMApAQCAtMSwzMDcgKzAsMCBAQAotCi0JSW5zdHJ1Y3Rpb25zIGZvciB1c2Ugb2YgdGhlIDNDOTBYIGRyaXZlciBmb3IgRXRoZXJCb290Ci0KLQkJT3JpZ2luYWwgM0M5MDVCIHN1cHBvcnQgYnk6Ci0JCQlHcmVnIEJlZWxleSAoR3JlZy5CZWVsZXlATGlnaHRTeXMub3JnKSwKLQkJCUxpZ2h0U3lzIFRlY2hub2xvZ3kgU2VydmljZXMsIEluYy4KLQkJCUZlYnJ1YXJ5IDExLCAxOTk5Ci0KLQkJVXBkYXRlcyBmb3IgM0M5MFggZmFtaWx5IGJ5OgotCQkJU3RldmUgU21pdGggKHN0ZXZlLnNtaXRoQGp1bm8uY29tKQotCQkJT2N0b2JlciAxLCAxOTk5Ci0KLQkJTWlub3IgZG9jdW1lbnRhdGlvbiB1cGRhdGVzIGJ5Ci0JCQlHcmVnIEJlZWxleSAoR3JlZy5CZWVsZXlATGlnaHRTeXMub3JnKQotCQkJTWFyY2ggMjksIDIwMDAKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1JICAgT1ZFUlZJRVcKLQotICAgIFRoZSAzYzkwWCBzZXJpZXMgZXRoZXJuZXQgY2FyZHMgYXJlIGEgZ3JvdXAgb2YgaGlnaC1wZXJmb3JtYW5jZSBidXNtYXN0ZXIKLSAgICBETUEgY2FyZHMgZnJvbSAzQ29tLiAgVGhpcyBwYXJ0aWN1bGFyIGRyaXZlciBzdXBwb3J0cyBib3RoIHRoZSAzYzkweCBhbmQKLSAgICB0aGUgM2M5MHhCIHJldmlzaW9uIGNhcmRzLiAgM0M5MHhDIGZhbWlseSBzdXBwb3J0IGhhcyBiZWVuIHRlc3RlZCB0byBzb21lCi0gICAgZGVncmVlIGJ1dCBub3QgZXh0ZW5zaXZlbHkuCi0KLSAgICBIZXJlJ3MgdGhlIGxpY2Vuc2luZyBpbmZvcm1hdGlvbjoKLQotICAgIFRoaXMgcHJvZ3JhbSBDb3B5cmlnaHQgKEMpIDE5OTkgTGlnaHRTeXMgVGVjaG5vbG9neSBTZXJ2aWNlcywgSW5jLgotICAgIFBvcnRpb25zIENvcHlyaWdodCAoQykgMTk5OSBTdGV2ZSBTbWl0aC4KLQotICAgIFRoaXMgcHJvZ3JhbSBtYXkgYmUgcmUtZGlzdHJpYnV0ZWQgaW4gc291cmNlIG9yIGJpbmFyeSBmb3JtLCBtb2RpZmllZCwKLSAgICBzb2xkLCBvciBjb3BpZWQgZm9yIGFueSBwdXJwb3NlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbWVzc2FnZQotICAgIGFuZCB0aGlzIHRleHQgYXJlIGluY2x1ZGVkIHdpdGggYWxsIHNvdXJjZSBjb3BpZXMgb3IgZGVyaXZhdGl2ZSB3b3JrcywgYW5kCi0gICAgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG1lc3NhZ2UgYW5kIHRoaXMgdGV4dCBhcmUgaW5jbHVkZWQgaW4gdGhlCi0gICAgZG9jdW1lbnRhdGlvbiBvZiBhbnkgYmluYXJ5LW9ubHkgZGlzdHJpYnV0aW9ucy4gIFRoaXMgcHJvZ3JhbSBpcwotICAgIGRpc3RyaWJ1dGVkIFdJVEhPVVQgQU5ZIFdBUlJBTlRZLCB3aXRob3V0IGV2ZW4gdGhlIHdhcnJhbnR5IG9mIEZJVE5FU1MgRk9SCi0gICAgQSBQQVJUSUNVTEFSIFBVUlBPU0Ugb3IgTUVSQ0hBTlRBQklMSVRZLiAgUGxlYXNlIHJlYWQgdGhlIGFzc29jaWF0ZWQKLSAgICBkb2N1bWVudGF0aW9uICIzYzkweC50eHQiIGJlZm9yZSBjb21waWxpbmcgYW5kIHVzaW5nIHRoaXMgZHJpdmVyLgotCi0KLUlJICBGTEFTSCBQUk9NUwotCi0gICAgVGhlIDNjOTB4QiBjYXJkcywgYWNjb3JkaW5nIHRvIHRoZSAzQ29tIGRvY3VtZW50YXRpb24sIG9ubHkgYWNjZXB0IHRoZQotICAgIGZvbGxvd2luZyBmbGFzaCBtZW1vcnkgY2hpcHM6Ci0KLQlBdG1lbCBBVDI5QzUxMiAoNjQga2lsb2J5dGUpCi0JQXRtZWwgQVQyOUMwMTAgKDEyOCBraWxvYnl0ZSkKLQotICAgIFRoZSAzYzkweCBjYXJkcywgYWNjb3JkaW5nIHRvIHRoZSAzQ29tIGRvY3VtZW50YXRpb24sIGFjY2VwdCB0aGUKLSAgICBmb2xsb3dpbmcgZmxhc2ggbWVtb3J5IGNoaXBzIGNhcGFjaXRpZXM6Ci0KLQk2NCAga2IgKDgga0IpCi0JMTI4IGtiICgxNiBrQikKLQkyNTYga2IgKDMyIGtCKSBhbmQKLQk1MTIga2IgKDY0IGtCKQotCi0gICAgQXRtZWwgQVQyOUM1MTIgKDY0IGtpbG9ieXRlKSBjaGlwcyBhcmUgc3BlY2lmaWNhbGx5IGxpc3RlZCBmb3IgYm90aAotICAgIGFkYXB0ZXJzLCBidXQgZmxhc2hpbmcgb24gdGhlIDNjOTA1YiBjYXJkcyB3b3VsZCBvbmx5IGJlIHN1cHBvcnRlZAotICAgIHRocm91Z2ggdGhlIEF0bWVsIHBhcnRzLiAgQW55IGRldmljZSwgb2YgdGhlIHN1cHBvcnRlZCBzaXplLCBzaG91bGQKLSAgICBiZSBzdXBwb3J0ZWQgd2hlbiBwcm9ncmFtbWVkIGJ5IGEgZGVkaWNhdGVkIFBST00gcHJvZ3JhbW1lciAoZS5nLgotICAgIG5vdCB0aGUgY2FyZCkuCi0KLSAgICBUbyB1c2UgdGhpcyBkcml2ZXIgaW4gc3VjaCBhIFBST00sIHZpc2l0IEF0bWVsJ3Mgd2ViIHNpdGUgYW5kIGRvd25sb2FkCi0gICAgdGhlaXIgLlBERiBmaWxlIGNvbnRhaW5pbmcgYSBsaXN0IG9mIHRoZWlyIGRpc3RyaWJ1dG9ycy4gIENvbnRhY3QgdGhlCi0gICAgZGlzdHJpYnV0b3JzIGZvciBwcmljaW5nIGluZm9ybWF0aW9uLiAgVGhlIHByaWNlcyBhcmUgcXVpdGUgcmVhc29uYWJsZQotICAgIChhYm91dCAkMyBVUyBlYWNoIGZvciB0aGUgNjQga0IgcGFydCksIGFuZCBhcmUgY29tcGFyYWJsZSB0byB3aGF0IG9uZSB3b3VsZAotICAgIGV4cGVjdCBmb3Igc2ltaWxhcmx5IHNpemVkIHN0YW5kYXJkIEVQUk9Ncy4gIEFuZCwgdGhlIGZsYXNoIGNoaXBzIGFyZSBtdWNoCi0gICAgZWFzaWVyIHRvIHdvcmsgd2l0aCwgYXMgdGhleSBkb24ndCBuZWVkIHRvIGJlIFVWLWVyYXNlZCB0byBiZSByZXByb2dyYW1tZWQuCi0gICAgVGhlIDNDOTA1QiBjYXJkIGFjdHVhbGx5IHByb3ZpZGVzIGEgbWV0aG9kIHRvIHByb2dyYW0gdGhlIGZsYXNoIG1lbW9yeQotICAgIHdoaWxlIGl0IGlzIHJlc2lkZW50IG9uIGJvYXJkIHRoZSBjYXJkIGl0c2VsZjsgaWYgc29tZW9uZSB3b3VsZCBsaWtlIHRvCi0gICAgd3JpdGUgYSBzbWFsbCBET1MgcHJvZ3JhbSB0byBkbyB0aGUgcHJvZ3JhbW1pbmcsIEkgY2FuIHByb3ZpZGUgdGhlCi0gICAgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHJlZ2lzdGVycyBhbmQgc28gZm9ydGguCi0KLSAgICBBIHV0aWxpdHkgcHJvZ3JhbSwgM2M5MHh1dGlsLCBpcyBwcm92aWRlZCB3aXRoIEV0aGVyYm9vdCBpbiB0aGUgJ2NvbnRyaWInCi0gICAgZGlyZWN0b3J5IHRoYXQgYWxsb3dzIGZvciB0aGUgb24tYm9hcmQgZmxhc2hpbmcgb2YgdGhlIFJPTSB3aGlsZSBMaW51eAotICAgIGlzIHJ1bm5pbmcuICBUaGUgcHJvZ3JhbSBoYXMgYmVlbiBzdWNjZXNzZnVsbHkgdXNlZCB1bmRlciBMaW51eCwgYnV0IEkKLSAgICBoYXZlIGhlYXJkIHByb2JsZW0gcmVwb3J0cyBvZiBpdHMgdXNlIHVuZGVyIEZyZWVCU0QuICBBbnlvbmUgd2lsbGluZyB0bwotICAgIG1ha2UgaXQgd29yayB1bmRlciBGcmVlQlNEIGlzIG1vcmUgdGhhbiB3ZWxjb21lIHRvIGRvIHNvIQotCi0gICAgWW91IGFsc28gaGF2ZSB0aGUgb3B0aW9uIG9mIHVzaW5nIEVQUk9NIGNoaXBzIC0gdGhlIDNDOTA1Qi1UWC1OTSBoYXMgYmVlbgotICAgIHN1Y2Nlc3NmdWxseSB0ZXN0ZWQgd2l0aCAyN0MyNTYgKDMya0IpIGFuZCAyN0M1MTIgKDY0a0IpIGNoaXBzIHdpdGggYQotICAgIHNwZWNpZmllZCBhY2Nlc3MgdGltZSBvZiAxMDBucyBhbmQgZmFzdGVyLgotCi0KLUlJSSBHRU5FUkFMIFVTRQotCi0gICAgTm9ybWFsbHksIHRoZSBiYXNpYyBwcm9jZWR1cmUgZm9yIHVzaW5nIHRoaXMgZHJpdmVyIGlzIGFzIGZvbGxvd3M6Ci0KLQkxLiAgUnVuIHRoZSAzYzkweGNmZyBwcm9ncmFtIG9uIHRoZSBkcml2ZXIgZGlza2V0dGUgdG8gZW5hYmxlIHRoZQotCWJvb3QgUFJPTSBhbmQgc2V0IGl0IHRvIDY0ayBvciAxMjhrLCBhcyBhcHByb3ByaWF0ZS4KLQkyLiAgQnVpbGQgdGhlIGFwcHJvcHJpYXRlIDNjOTB4LmZkMCBvciAzYzkweC5mZDAgZmxvcHB5IGltYWdlIHdpdGgKLQlwb3NzaWJseSB0aGUgdmFsdWUgQ0ZHXzNDOTBYX1hDVlIgZGVmaW5lZCB0byB0aGUgdHJhbnNjZWl2ZXIgdHlwZSB0aGF0Ci0JeW91IHdhbnQgdG8gdXNlIChpLmUuLCAxMC8xMDAgcmo0NSwgQVVJLCBjb2F4LCBNSUkpLgotCTMuICBSdW4gdGhlIGZsb3BweSBpbWFnZSBvbiB0aGUgUEMgdG8gYmUgbmV0d29yayBib290ZWQsIHRvIGdldAotCWl0IGNvbmZpZ3VyZWQsIGFuZCB0byB2ZXJpZnkgdGhhdCBpdCB3aWxsIGJvb3QgcHJvcGVybHkuCi0JNC4gIEJ1aWxkIHRoZSAzYzkweC5yb20gb3IgM2M5MHgubHpyb20gUFJPTSBpbWFnZSBhbmQgcHJvZ3JhbQotCWl0IGludG8gdGhlIGZsYXNoIG9yIEVQUk9NIG1lbW9yeSBjaGlwLgotCTUuICBQdXQgdGhlIFBST00gaW4gdGhlIGV0aGVybmV0IGNhcmQsIGJvb3QgYW5kIGVuYWJsZSAnYm9vdCBmcm9tCi0JbmV0d29yayBmaXJzdCcgaW4gdGhlIHN5c3RlbSBCSU9TLCBzYXZlIGFuZCByZWJvb3QuCi0KLSAgICBIZXJlIGFyZSBzb21lIGlzc3VlcyB0byBiZSBhd2FyZSBvZjoKLQotCTEuICBJZiB5b3UgZXhwZXJpZW5jZSBjcmFzaGVzIG9yIGRpZmZlcmVudCBiZWhhdmlvdXIgd2hlbiB1c2luZyB0aGUKLQlib290IFBST00sIGFkZCB0aGUgc2V0dGluZyBDRkdfM0M5MFhfQk9PVFJPTV9GSVggYW5kIGdvIHRocm91Z2ggdGhlCi0Jc3RlcHMgMi01IGFib3ZlLiAgVGhpcyB3b3JrcyBhcm91bmQgYSBidWcgaW4gc29tZSAzYzkwNUIgY2FyZHMgKHNlZQotCWJlbG93KSwgYnV0IGhhcyBzb21lIHNpZGUtZWZmZWN0cyB3aGljaCBtYXkgbm90IGJlIGRlc2lyYWJsZS4KLSAgICAgICAgUGxlYXNlIG5vdGUgdGhhdCB5b3UgaGF2ZSB0byBib290IG9mZiBhIGZsb3BweSAobm90IFBST00hKSBvbmNlIGZvcgotICAgICAgICB0aGlzIGZpeCB0byB0YWtlIGVmZmVjdC4KLQkyLiAgVGhlIHBvc3NpYmxlIG5lZWQgdG8gbWFudWFsbHkgc2V0IHRoZSBDRkdfM0M5MFhfWENWUiB2YWx1ZSB0bwotCWNvbmZpZ3VyZSB0aGUgdHJhbnNjZWl2ZXIgdHlwZS4gIFZhbHVlcyBhcmUgbGlzdGVkIGJlbG93LgotCTMuICBUaGUgcG9zc2libGUgbmVlZCB0byBkZWZpbmUgQ0ZHXzNDOTBYX1BSRVNFUlZFX1hDVlIgZm9yIHVzZSBpbgotCW9wZXJhdGluZyBzeXN0ZW1zIHRoYXQgZG9uJ3QgaW50ZWxsaWdlbnRseSBkZXRlcm1pbmUgdGhlCi0JdHJhbnNjZWl2ZXIgdHlwZS4KLQotICAgIFNvbWUgdGhpbmdzIHRoYXQgYXJlIG9uIHRoZSAnVG8tRG8nIGxpc3QsIHBlcmhhcHMgZm9yIG1lLCBidXQgcGVyaGFwcwotICAgIGZvciBhbnkgb3RoZXIgdm9sdW50ZWVycyBvdXQgdGhlcmU6Ci0KLQkxLiAgRXh0ZW5kIHRoZSBkcml2ZXIgdG8gZnVsbHkgaW1wbGVtZW50IHRoZSBhdXRvLXNlbGVjdAotCWFsZ29yaXRobSBpZiB0aGUgY2FyZCBoYXMgbXVsdGlwbGUgbWVkaWEgcG9ydHMuCi0JMi4gIEZpeCBhbnkgYnVncyBpbiB0aGUgY29kZSA8Z3Jpbj4uLi4uCi0JMy4gIEV4dGVuZCB0aGUgZHJpdmVyIHRvIHN1cHBvcnQgdGhlIDNjOTA1YyByZXZpc2lvbiBjYXJkcwotCSJvZmZpY2lhbGx5Ii4gIFJpZ2h0IG5vdywgdGhlIHN1cHBvcnQgaGFzIGJlZW4gcHJpbWFyaWx5IGVtcGlyaWNhbAotCWFuZCBub3QgYmFzZWQgb24gM2M5MDVDIGRvY3VtZW50YXRpb24uCi0KLSAgICBOb3cgZm9yIHRoZSBkZXRhaWxzLi4uLgotCi0gICAgVGhpcyBkcml2ZXIgaGFzIGJlZW4gdGVzdGVkIG9uIHJvdWdobHkgMzAwIHN5c3RlbXMuICBUaGUgbWFpbiB0d28KLSAgICBjb25maWd1cmF0aW9uIGlzc3VlcyB0byBjb250ZW5kIHdpdGggYXJlOgotCi0JMS4gIEVuc3VyZSB0aGF0IFBDSSBCdXNtYXN0ZXJpbmcgaXMgZW5hYmxlZCBmb3IgdGhlIGFkYXB0ZXIgKGNvbmZpZ3VyZWQKLQlpbiB0aGUgQ01PUyBzZXR1cCkKLQkyLiAgU29tZSBzeXN0ZW1zIGRvbid0IHdvcmsgcHJvcGVybHkgd2l0aCB0aGUgYWRhcHRlciB3aGVuIHBsdWcgYW5kCi0JcGxheSBPUyBpcyBlbmFibGVkOyBJIGFsd2F5cyBzZXQgaXQgdG8gIk5vIiBvciAiRGlzYWJsZWQiIC0tIHRoaXMgbWFrZXMKLQlpdCBlYXNpZXIgYW5kIHJlYWxseSBkb2Vzbid0IGFkdmVyc2VseSBhZmZlY3QgYW55dGhpbmcuCi0KLSAgICBSb3VnaGx5IDk1JSBvZiB0aGUgc3lzdGVtcyB3b3JrZWQgd2hlbiBjb25maWd1cmVkIHByb3Blcmx5LiAgQSBmZXcKLSAgICBoYXZlIGlzc3VlcyB3aXRoIGJvb3RpbmcgbG9jYWxseSBvbmNlIHRoZSBib290IFBST00gaGFzIGJlZW4gaW5zdGFsbGVkCi0gICAgKHRoaXMgbnVtYmVyIGhhcyBiZWVuIGxlc3MgdGhhbiAyJSkuICBPdGhlciBjb25maWd1cmF0aW9uIGlzc3VlcyB0aGF0Ci0gICAgdG8gY2hlY2s6Ci0KLQkxLiAgTmV3ZXIgQklPUydzIGFjdHVhbGx5IHdvcmsgY29ycmVjdGx5IHdpdGggdGhlIG5ldHdvcmsgYm9vdCBvcmRlci4KLQlTZXQgdGhlIG5ldHdvcmsgYWRhcHRlciBmaXJzdC4gIE1vc3Qgb2xkZXIgQklPUydzIGF1dG9tYXRpY2FsbHkgZ28gdG8KLQl0aGUgbmV0d29yayBib290IFBST00gZmlyc3QuCi0JMi4gIEZvciBzeXN0ZW1zIHdoZXJlIHRoZSBhZGFwdGVyIHdhcyBhbHJlYWR5IGluc3RhbGxlZCBhbmQgaXMganVzdAotCWhhdmluZyB0aGUgUFJPTSBpbnN0YWxsZWQsIHRyeSBzZXR0aW5nIHRoZSAicmVzZXQgY29uZmlndXJhdGlvbiBkYXRhIgotCXRvIHllcyBpbiB0aGUgQ01PUyBzZXR1cCBpZiB0aGUgQklPUyBpc24ndCBzZWVuIGF0IGZpcnN0LiAgSWYgeW91ciBCSU9TCi0JZG9lc24ndCBoYXZlIHRoaXMgb3B0aW9uLCByZW1vdmUgdGhlIGNhcmQsIHN0YXJ0IHRoZSBzeXN0ZW0sIHNodXQgZG93biwKLQlpbnN0YWxsIHRoZSBjYXJkIGFuZCByZXN0YXJ0IChvciBzd2l0Y2ggdG8gYSBkaWZmZXJlbnQgUENJIHNsb3QpLgotCTMuICBNYWtlIHN1cmUgdGhlIENNT1Mgc2VjdXJpdHkgc2V0dGluZ3MgYXJlbid0IHByZXZlbnRpbmcgYSBib290LgotCi0gICAgVGhlIDNjOTA1QiBjYXJkcyBoYXZlIGEgc2lnbmlmaWNhbnQgJ2J1ZycgdGhhdCByZWxhdGVzIHRvIHRoZSBmbGFzaCBwcm9tOgotICAgIHVubGVzcyB0aGUgY2FyZCBpcyBzZXQgaW50ZXJuYWxseSB0byB0aGUgTUlJIHRyYW5zY2VpdmVyLCBpdCB3aWxsIG9ubHkKLSAgICByZWFkIHRoZSBmaXJzdCA4ayBvZiB0aGUgUFJPTSBpbWFnZS4gIERvbid0IGFzayB3aHkgLS0gaXQgc2VlbXMgcmVhbGx5Ci0gICAgb2JzY3VyZSwgYnV0IGl0IGhhcyB0byBkbyB3aXRoIHRoZSB3YXkgdGhleSBtdXgnZCB0aGUgYWRkcmVzcyBsaW5lcwotICAgIGZyb20gdGhlIFBDSSBidXMgdG8gdGhlIFJPTS4gIFVuZm9ydHVuYXRlbHksIG1vc3Qgb2YgdXMgYXJlIG5vdCB1c2luZwotICAgIE1JSSB0cmFuc2NlaXZlcnMsIGFuZCBldmVuIHRoZSAubHpyb20gaW1hZ2UgZW5kcyB1cCBiZWluZyBqdXN0IGEgbGl0dGxlCi0gICAgYml0IGxhcmdlciB0aGFuIDhrLiAgTm90ZSB0aGF0IHRoZSB3b3JrYXJvdW5kIGZvciB0aGlzIGlzIGRpc2FibGVkIGJ5Ci0gICAgZGVmYXVsdCwgYmVjYXVzZSB0aGUgV2luZG93cyBOVCA0LjAgZHJpdmVyIGRvZXMgbm90IGxpa2UgaXQgKG5vIHBhY2tldHMKLSAgICBhcmUgdHJhbnNtaXR0ZWQpLgotCi0gICAgU28sIHRoZSBzb2x1dGlvbiB0aGF0IEkndmUgdXNlZCBpcyB0byBpbnRlcm5hbGx5IHNldCB0aGUgY2FyZCdzIG52cmFtCi0gICAgY29uZmlndXJhdGlvbiB0byB1c2UgTUlJIHdoZW4gaXQgYm9vdHMuICBUaGUgM2M5MDViIGRyaXZlciBkb2VzIHRoaXMKLSAgICBhdXRvbWF0aWNhbGx5LiAgVGhpcyB3YXksIHRoZSAxNmsgcHJvbSBpbWFnZSBjYW4gYmUgbG9hZGVkIGludG8gbWVtb3J5LAotICAgIGFuZCB0aGVuIHRoZSAzYzkwNWIgZHJpdmVyIGNhbiBzZXQgdGhlIHRlbXBvcmFyeSBjb25maWd1cmF0aW9uIG9mIHRoZQotICAgIGNhcmQgdG8gYW4gYXBwcm9wcmlhdGUgdmFsdWUsIGVpdGhlciBjb25maWd1cmFibGUgYnkgdGhlIHVzZXIgb3IgY2hvc2VuCi0gICAgYnkgdGhlIGRyaXZlci4KLQotICAgIFRvIGVuYWJsZSB0aGUgM2M5MDVCIGJ1Z2ZpeCwgd2hpY2ggaXMgbmVjZXNzYXJ5IGZvciB0aGVzZSBjYXJkcyB3aGVuIAotICAgIGJvb3RpbmcgZnJvbSB0aGUgRmxhc2ggUk9NLCBkZWZpbmUgLURDRkdfM0M5MFhfQk9PVFJPTV9GSVggd2hlbiBidWlsZGluZywKLSAgICBjcmVhdGUgYSBmbG9wcHkgaW1hZ2UgYW5kIGJvb3QgaXQgb25jZS4KLSAgICBUaGVyZWFmdGVyLCB0aGUgY2FyZCBzaG91bGQgYWNjZXB0IHRoZSBsYXJnZXIgcHJvbSBpbWFnZS4KLQotICAgIFRoZSBkcml2ZXIgc2hvdWxkIGNob29zZSBhbiBhcHByb3ByaWF0ZSB0cmFuc2NlaXZlciBvbiB0aGUgY2FyZC4gIEhvd2V2ZXIsCi0gICAgaWYgaXQgZG9lc24ndCBvbiB5b3VyIGNhcmQgb3IgaWYgeW91IG5lZWQgdG8sIGZvciBpbnN0YW5jZSwgc2V0IHlvdXIKLSAgICBjYXJkIHRvIDEwbWJwcyB3aGVuIGNvbm5lY3RlZCB0byBhbiB1bm1hbmFnZWQgMTAvMTAwIGh1YiwgeW91IGNhbiBzcGVjaWZ5Ci0gICAgd2hpY2ggdHJhbnNjZWl2ZXIgeW91IHdhbnQgdG8gdXNlLiAgVG8gZG8gdGhpcywgYnVpbGQgdGhlIDNjOTA1Yi5mZDAKLSAgICBpbWFnZSB3aXRoIC1EQ0ZHXzNDOTBYX1hDVlI9eCwgd2hlcmUgJ3gnIGlzIG9uZSBvZiB0aGUgZm9sbG93aW5nCi0gICAgdmFsdWVzOgotCi0JMAkxMEJhc2UtVAotCTEJMTBtYnBzIEFVSQotCTMJMTBCYXNlLTIgKHRoaW5uZXQvY29heCkKLQk0CTEwMEJhc2UtVFgKLQk1CTEwMEJhc2UtRlgKLQk2CU1JSQotCTgJQXV0by1uZWdvdGlhdGlvbiAxMEJhc2UtVCAvIDEwMEJhc2UtVFggKHVzdWFsbHkgdGhlIGRlZmF1bHQpCi0JOQlNSUkgRXh0ZXJuYWwgTUFDIE1vZGUKLQkyNTUJQWxsb3cgZHJpdmVyIHRvIGNob29zZSBhbiAnYXBwcm9wcmlhdGUnIG1lZGlhIHBvcnQuCi0KLSAgICBUaGVuIHByb2NlZWQgZnJvbSBzdGVwIDIgaW4gdGhlIGFib3ZlICdnZW5lcmFsIHVzZScgaW5zdHJ1Y3Rpb25zLiAgVGhlCi0gICAgLnJvbSBpbWFnZSBjYW4gYmUgYnVpbHQgd2l0aCBDRkdfM0M5MFhfWENWUiBzZXQgdG8gYSB2YWx1ZSwgYnV0IHlvdQotICAgIG5vcm1hbGx5IGRvbid0IHdhbnQgdG8gZG8gdGhpcywgc2luY2UgaXQgaXMgZWFzaWVyIHRvIGNoYW5nZSB0aGUKLSAgICB0cmFuc2NlaXZlciB0eXBlIGJ5IHJlYnVpbGRpbmcgYSBuZXcgZmxvcHB5LCBjaGFuZ2luZyB0aGUgQklPUyB0byBmbG9wcHkKLSAgICBib290LCBib290aW5nLCBhbmQgdGhlbiBjaGFuZ2luZyB0aGUgQklPUyBiYWNrIHRvIG5ldHdvcmsgYm9vdC4gIElmCi0gICAgQ0ZHXzNDOTBYX1hDVlIgaXMgbm90IHNldCBpbiBhIHBhcnRpY3VsYXIgYnVpbGQsIGl0IGp1c3QgdXNlcyB0aGUKLSAgICBjdXJyZW50IGNvbmZpZ3VyYXRpb24gKGVpdGhlciBpdHMgJ2Jlc3QgZ3Vlc3MnIG9yIHdoYXRldmVyIHRoZSBzdG9yZWQKLSAgICBDRkdfM0M5MFhfWENWUiB2YWx1ZSB3YXMgZnJvbSB0aGUgbGFzdCB0aW1lIGl0IHdhcyBzZXQpLgotCi0gICAgW1sgTm90ZSBmb3IgdGhlIG1vcmUgdGVjaG5pY2FsbHkgaW5jbGluZWQ6ICBUaGUgQ0ZHXzNDOTBYX1hDVlIgdmFsdWUgaXMKLSAgICBwcm9ncmFtbWVkIGludG8gYSByZWdpc3RlciBpbiB0aGUgY2FyZCdzIE5WUkFNIHRoYXQgd2FzIHJlc2VydmVkIGZvcgotICAgIExhbldvcmtzIFBST00gaW1hZ2VzIHRvIHVzZS4gIFdoZW4gdGhlIGRyaXZlciBib290cywgdGhlIGNhcmQgY29tZXMKLSAgICB1cCBpbiBNSUkgbW9kZSwgYW5kIHRoZSBkcml2ZXIgY2hlY2tzIHRoZSBMYW5Xb3JrcyByZWdpc3RlciB0byBmaW5kCi0gICAgb3V0IGlmIHRoZSB1c2VyIHNwZWNpZmllZCBhIHRyYW5zY2VpdmVyIHR5cGUuICBJZiBpdCBmaW5kcyB0aGF0Ci0gICAgaW5mb3JtYXRpb24sIGl0IHVzZXMgdGhhdCwgb3RoZXJ3aXNlIGl0IHBpY2tzIGEgdHJhbnNjZWl2ZXIgdGhhdCB0aGUKLSAgICBjYXJkIGhhcyBiYXNlZCBvbiB0aGUgM2M5MDViJ3MgTWVkaWFPcHRpb25zIHJlZ2lzdGVyLiAgVGhpcyBkcml2ZXIgaXNuJ3QKLSAgICBxdWl0ZSBzbWFydCBlbm91Z2ggdG8gYWx3YXlzIGRldGVybWluZSB3aGljaCBtZWRpYSBwb3J0IGlzIGFjdHVhbGx5Ci0gICAgX2Nvbm5lY3RlZF87IG1heWJlIHNvbWVvbmUgZWxzZSB3b3VsZCBsaWtlIHRvIHRha2Ugb24gdGhhdCB0YXNrIChpdAotICAgIGFjdHVhbGx5IGludm9sdmVzIHNlbmRpbmcgYSBzZWxmLWRpcmVjdGVkIHBhY2tldCBhbmQgc2VlaW5nIGlmIGl0Ci0gICAgY29tZXMgYmFjay4gIElGIGl0IGRvZXMsIHRoYXQgcG9ydCBpcyBjb25uZWN0ZWQpLiBdXQotCi0gICAgQW5vdGhlciBpc3N1ZSB0byBrZWVwIGluIG1pbmQgaXMgdGhhdCBpdCBpcyBwb3NzaWJsZSB0aGF0IHNvbWUgT1MnZXMKLSAgICBtaWdodCBub3QgYmUgaGFwcHkgd2l0aCB0aGUgd2F5IEkndmUgaGFuZGxlZCB0aGUgUFJPTS1pbWFnZSBoYWNrIHdpdGgKLSAgICBzZXR0aW5nIE1JSSBtb2RlIG9uIGJvb3R1cC4gIExpbnV4IDIuMC4zNSBkb2VzIG5vdCBoYXZlIHRoaXMgcHJvYmxlbS4KLSAgICBCZWhhdmlvciBvZiBvdGhlciBzeXN0ZW1zIG1heSB2YXJ5LiAgVGhlIDNjb20gZG9jdW1lbnRhdGlvbiBzcGVjaWZpY2FsbHkKLSAgICBzYXlzIHRoYXQsIGF0IGxlYXN0IHdpdGggdGhlIGNhcmQgdGhhdCBJIGhhdmUsIHRoZSBkZXZpY2UgZHJpdmVyIGluIHRoZQotICAgIE9TIHNob3VsZCBhdXRvLXNlbGVjdCB0aGUgbWVkaWEgcG9ydCwgc28gb3RoZXIgZHJpdmVycyBzaG91bGQgd29yayBmaW5lCi0gICAgd2l0aCB0aGlzICdoYWNrJy4gIEhvd2V2ZXIsIGlmIHlvdXJzIGRvZXNuJ3Qgc2VlbSB0bywgeW91IGNhbiB0cnkgZGVmaW5pbmcKLSAgICBDRkdfM0M5MFhfUFJFU0VSVkVfWENWUiB3aGVuIGJ1aWxkaW5nIHRvIGNhdXNlIEV0aGVyYm9vdCB0byBrZWVwIHRoZQotICAgIHdvcmtpbmcgc2V0dGluZyAodGhhdCBhbGxvd2VkIHRoZSBib290cC90ZnRwIHByb2Nlc3MpIGFjcm9zcyB0aGUgZXRoX3Jlc2V0Ci0gICAgb3BlcmF0aW9uLgotCi0KLUlWICBGT1IgREVWRUxPUEVSUy4uLi4KLQotICAgIElmIHlvdSB3b3VsZCBsaWtlIHRvIGZpeC9leHRlbmQvZXRjLiB0aGlzIGRyaXZlciwgZmVlbCBmcmVlIHRvIGRvIHNvOyBqdXN0Ci0gICAgYmUgc3VyZSB5b3UgY2FuIHRlc3QgdGhlIG1vZGlmaWVkIHZlcnNpb24gb24gdGhlIDNjOTA1Qi1UWCBjYXJkcyB0aGF0IHRoZQotICAgIGRyaXZlciB3YXMgb3JpZ2luYWxseSBkZXNpZ25lZCBmb3IuICBUaGlzIHNlY3Rpb24gb2YgdGhpcyBkb2N1bWVudCBnaXZlcwotICAgIHNvbWUgaW5mb3JtYXRpb24gdGhhdCBtaWdodCBiZSByZWxldmFudCB0byBhIHByb2dyYW1tZXIuCi0KLSAgICBBLiAgTWFpbiBFbnRyeSBQb2ludAotCi0JYTNjOTB4X3Byb2JlIGlzIHRoZSBtYWluIGVudHJ5IHBvaW50IGZvciB0aGlzIGRyaXZlci4gIEl0IGlzIHJlZmVycmVkCi0JdG8gaW4gYW4gYXJyYXkgaW4gJ2NvbmZpZy5jJy4KLQotICAgIEIuICBPdGhlciBJbXBvcnRhbnQgRnVuY3Rpb25zCi0KLQlUaGUgZnVuY3Rpb25zIGEzYzkweF90cmFuc21pdCwgYTNjOTB4X3BvbGwsIGEzYzkweF9yZXNldCwgYW5kCi0JYTNjOTB4X2Rpc2FibGUgYXJlIHN0YXRpYyBmdW5jdGlvbnMgdGhhdCBFdGhlckJvb3QgZmluZHMgb3V0IGFib3V0Ci0JYXMgYSAgcmVzdWx0IG9mIGEzYzkweF9wcm9iZSBzZXR0aW5nIGVudHJpZXMgaW4gdGhlIG5pYyBzdHJ1Y3R1cmUKLQlmb3IgdGhlbS4gIFRoZSBFdGhlckJvb3QgZnJhbWV3b3JrIGRvZXMgbm90IHVzZSBpbnRlcnJ1cHRzLiAgSXQgaXMKLQlwb2xsZWQuICBBbGwgdHJhbnNtaXQgYW5kIHJlY2VpdmUgb3BlcmF0aW9ucyBhcmUgaW5pdGlhdGVkIGJ5IHRoZQotCWV0aGVyYm9vdCBmcmFtZXdvcmssIG5vdCBieSBhbiBpbnRlcnJ1cHQgb3IgYnkgdGhlIGRyaXZlci4KLQotICAgIEMuICBJbnRlcm5hbCBGdW5jdGlvbnMKLQotCVRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIGFyZSBpbnRlcm5hbCB0byB0aGUgZHJpdmVyOgotCi0JYTNjOTB4X2ludGVybmFsX0lzc3VlQ29tbWFuZCAtIHNlbmRzIGEgY29tbWFuZCB0byB0aGUgM2M5MDViIGNhcmQuCi0JYTNjOTB4X2ludGVybmFsX1NldFdpbmRvdyAtIHNoaWZ0cyBiZXR3ZWVuIG9uZSBvZiBlaWdodCByZWdpc3RlcgotCXdpbmRvd3Mgb25ib2FyZCB0aGUgM2M5MHguICBUaGUgYm90dG9tIDE2IGJ5dGVzIG9mIHRoZSBjYXJkJ3MKLQlJL08gc3BhY2UgYXJlIG11bHRpcGxleGVkIGFtb25nIDEyOCBieXRlcywgb25seSAxNiBvZiB3aGljaCBhcmUKLQl2aXNpYmxlIGF0IGFueSBvbmUgdGltZS4gIFRoaXMgU2V0V2luZG93IGZ1bmN0aW9uIHNlbGVjdHMgb25lIG9mCi0JdGhlIGVpZ2h0IHNldHMuCi0JYTNjOTB4X2ludGVybmFsX1JlYWRFZXByb20gLSByZWFkcyBhIHdvcmQgKDE2IGJpdHMpIGZyb20gdGhlCi0JY2FyZCdzIG9uYm9hcmQgbnZyYW0uICBUaGlzIGlzIE5PVCB0aGUgQklPUyBib290IHJvbS4gIFRoaXMgaXMKLQl3aGVyZSB0aGUgY2FyZCBzdG9yZXMgc3VjaCB0aGluZ3MgYXMgaXRzIGhhcmR3YXJlIGFkZHJlc3MuCi0JYTNjOTB4X2ludGVybmFsX1dyaXRlRWVwcm9tIC0gd3JpdGVzIGEgd29yZCAoMTYgYml0cykgdG8gdGhlCi0JY2FyZCdzIG52cmFtLCBhbmQgcmVjb21wdXRlcyB0aGUgZWVwcm9tIGNoZWNrc3VtLgotCWEzYzkweF9pbnRlcm5hbF9Xcml0ZUVlcHJvbVdvcmQgLSB3cml0ZXMgYSB3b3JkICgxNiBiaXRzKSB0byB0aGUKLQljYXJkJ3MgbnZyYW0uICBVc2VkIGJ5IHRoZSBhYm92ZSByb3V0aW5lLgotCWEzYzkweF9pbnRlcm5hbF9Xcml0ZUVlcHJvbVdvcmQgLSB3cml0ZXMgYSB3b3JkICgxNiBiaXRzKSB0byB0aGUKLQljYXJkJ3MgbnZyYW0uICBVc2VkIGJ5IHRoZSBhYm92ZSByb3V0aW5lLgotCi0gICAgRC4gIEdsb2JhbHMKLQotCUFsbCBnbG9iYWwgdmFyaWFibGVzIGFyZSBpbnNpZGUgYSBnbG9iYWwgc3RydWN0dXJlIG5hbWVkIElORl8zQzkwWC4KLQlTbywgd2hlcmV2ZXIgeW91IHNlZSB0aGF0IHN0cnVjdHVyZSByZWZlcmVuY2VkLCB5b3Uga25vdyB0aGUgdmFyaWFibGUKLQlpcyBhIGdsb2JhbC4gIEp1c3Qga2VlcHMgdGhpbmdzIGEgbGl0dGxlIG5lYXRlci4KLQotICAgIEUuICBFbnVtZXJhdGlvbnMKLQotCVRoZXJlIGFyZSBxdWl0ZSBhIGZldyBlbnVtZXJhdGVkIHR5cGUgZGVmaW5pdGlvbnMgZm9yIHJlZ2lzdGVycyBhbmQKLQlzbyBmb3J0aCwgbWFueSBmb3IgcmVnaXN0ZXJzIHRoYXQgSSBkaWRuJ3QgZXZlbiB0b3VjaCBpbiB0aGUgZHJpdmVyLgotCVJlZ2lzdGVyIHR5cGVzIHN0YXJ0IHdpdGggJ3JlZycsIHdpbmRvdyBudW1iZXJzIChmb3IgU2V0V2luZG93KQotCXN0YXJ0IHdpdGggJ3dpbicsIGFuZCBjb21tYW5kcyAoZm9yIElzc3VlQ29tbWFuZCkgc3RhcnQgd2l0aCAnY21kJy4KLQlSZWdpc3RlciBvZmZzZXRzIGFsc28gaW5jbHVkZSBhbiBpbmRpY2F0aW9uIGluIHRoZSBuYW1lIGFzIHRvIHRoZQotCXNpemUgb2YgdGhlIHJlZ2lzdGVyIChfYiA9IGJ5dGUsIF93ID0gd29yZCwgX2wgPSBsb25nKSwgYW5kIHdoaWNoCi0Jd2luZG93IHRoZSByZWdpc3RlciBpcyBpbiwgaWYgaXQgaXMgd2luZG93ZWQgKDAtNykuCi0KLSAgICBGLiAgV2h5IHRoZSAnYTNjOTB4JyBuYW1lPwotCi0JSSBoYWQgdG8gY29tZSB1cCB3aXRoIGEgbGV0dGVyIGF0IHRoZSBiZWdpbm5pbmcgb2YgYWxsIG9mIHRoZQotCWlkZW50aWZpZXJzLCBzaW5jZSAzY29tIHNvIGNvbnZlbmllbnRseSBoYWQgdGhlaXIgbmFtZSBzdGFydCB3aXRoIGEKLQludW1iZXIuICBBbm90aGVyIGRyaXZlciB1c2VkICd0JyAoZm9yICd0aHJlZSc/KTsgSSBjaG9zZSAnYScgZm9yCi0Jbm8gcmVhc29uIGF0IGFsbC4KLQotQWRkZW5kdW0gYnkgSm9yZ2UgTC4gZGVMeXJhIDxkZWx5cmFAbGF0dC5pZi51c3AuYnI+LCAyMk5vdjIwMDAgcmUKLXdvcmtpbmcgYXJvdW5kIHRoZSAzQzkwNSBoYXJkd2FyZSBidWcgbWVudGlvbmVkIGFib3ZlOgotCi1Vc2UgdGhpcyBmbG9wcHkgdG8gZml4IGFueSAzQ09NIG1vZGVsIDNDOTA1QiBQQ0kgMTAvMTAwIEV0aGVybmV0IGNhcmRzCi10aGF0IGZhaWwgdG8gbG9hZCBhbmQgcnVuIHRoZSBib290IHByb2dyYW0gdGhlIGZpcnN0IHRpbWUgYXJvdW5kLiBJZgotdGhleSBoYXZlIGEgIkx1Y2VudCIgcmF0aGVyIHRoYW4gYSAiQnJvYWRjb20iIGNoaXBzZXQgdGhlc2UgY2FyZHMgaGF2ZQotYSBjb25maWd1cmF0aW9uIGJ1ZyB0aGF0IGNhdXNlcyBhIGhhbmcgd2hlbiB0cnlpbmcgdG8gbG9hZCB0aGUgYm9vdAotcHJvZ3JhbSBmcm9tIHRoZSBQUk9NLCBpZiB5b3UgdHJ5IHRvIHVzZSB0aGVtIHJpZ2h0IG91dCBvZiB0aGUgYm94LgotCi1UaGUgYm9vdCBwcm9ncmFtIGluIHRoaXMgZmxvcHB5IGlzIHRoZSBmaWxlIG5hbWVkIDNjOTA1Yi10cG8xMDAucm9tCi1mcm9tIEV0aGVyYm9vdCB2ZXJzaW9uIDQuNi4xMCwgY29tcGlsZWQgd2l0aCB0aGUgYnVnZml4IHBhcmFtZXRlcgotCi0JCQlDRkdfM0M5MFhfQk9PVFJPTV9GSVgKLQotWW91IGhhdmUgdG8gdGFrZSB0aGUgY2hpcCBvZmYgdGhlIGNhcmQgYW5kIGJvb3QgdGhlIHN5c3RlbSBvbmNlIHVzaW5nCi10aGlzIGZsb3BweS4gT25jZSBsb2FkZWQgZnJvbSB0aGUgZmxvcHB5LCB0aGUgYm9vdCBwcm9ncmFtIHdpbGwgYWNjZXNzCi10aGUgY2FyZCBhbmQgY2hhbmdlIHNvbWUgc2V0dGluZyBpbiBpdCwgY29ycmVjdGluZyB0aGUgcHJvYmxlbS4gQWZ0ZXIKLXRoYXQgeW91IG1heSB1c2UgZWl0aGVyIHRoaXMgYm9vdCBwcm9ncmFtIG9yIHRoZSBub3JtYWwgb25lLCBjb21waWxlZAotd2l0aG91dCB0aGlzIGJ1Z2ZpeCBwYXJhbWV0ZXIsIHRvIGJvb3QgdGhlIG1hY2hpbmUgZnJvbSB0aGUgUFJPTSBjaGlwLgotCi1bQW55IHJlY2VudCBFdGhlcmJvb3QgdmVyc2lvbiBzaG91bGQgZG8sIG5vdCBqdXN0IDQuNi4xMCAtIEVkLl0KZGlmZiAtTmF1ciBncnViLTAuOTcub3JpZy9uZXRib290L01ha2VmaWxlLmFtIGdydWItMC45Ny9uZXRib290L01ha2VmaWxlLmFtCi0tLSBncnViLTAuOTcub3JpZy9uZXRib290L01ha2VmaWxlLmFtCTIwMDMtMDctMDkgMTE6NDU6MzcuMDAwMDAwMDAwICswMDAwCisrKyBncnViLTAuOTcvbmV0Ym9vdC9NYWtlZmlsZS5hbQkyMDA1LTA4LTMxIDE5OjAzOjM1LjAwMDAwMDAwMCArMDAwMApAQCAtMTAsNTggKzEwLDcyIEBACiAKIG5vaW5zdF9MSUJSQVJJRVMgPSAkKExJQkRSSVZFUlMpCiAKLWxpYmRyaXZlcnNfYV9TT1VSQ0VTID0gY2FyZHMuaCBjb25maWcuYyBldGhlcmJvb3QuaCBcCi0JZnN5c190ZnRwLmMgbGludXgtYXNtLWlvLmggbGludXgtYXNtLXN0cmluZy5oIFwKLQltYWluLmMgbWlzYy5jIG5pYy5oIG9zZGVwLmggcGNpLmMgcGNpLmggdGltZXIuYyB0aW1lci5oCi1FWFRSQV9saWJkcml2ZXJzX2FfU09VUkNFUyA9IDNjNTA5LmMgM2M1MDkuaCAzYzU5NS5jIDNjNTk1LmggM2M5MHguYyBcCi0JY3M4OXgwLmMgY3M4OXgwLmggZGF2aWNvbS5jIGRlcGNhLmMgZWVwcm8uYyBlZXBybzEwMC5jIFwKLQllcGljMTAwLmMgZXBpYzEwMC5oIGZhMzExLmMgaTgyNTg2LmMgbGFuY2UuYyBuYXRzZW1pLmMgXAotCW5pNTAxMC5jIG5zODM5MC5jIG5zODM5MC5oIG90dWxpcC5jIG90dWxpcC5oIHJ0bDgxMzkuYyBcCi0Jc2lzOTAwLmMgc2lzOTAwLmggc2tfZzE2LmMgc2tfZzE2Lmggc21jOTAwMC5jIHNtYzkwMDAuaCBcCi0JdGlhcmEuYyB0bGFuLmMgdHVsaXAuYyB2aWEtcmhpbmUuYyB3ODljODQwLmMKK2xpYmRyaXZlcnNfYV9TT1VSQ0VTID0gYmlnX2Jzd2FwLmggYm9vdHAuaCBieXRlc3dhcC5oIGNvbmZpZy5jIGNwdS5oIFwKKwlkZXYuaCBlbGYuaCBlbmRpYW4uaCBldGhlcmJvb3QuaCBmc3lzX3RmdHAuYyBncnViLmggXAorCWkzODZfYnl0ZXN3YXAuaCBpMzg2X2VsZi5oIGkzODZfZW5kaWFuLmggaTM4Nl90aW1lci5jIFwKKwlpZl9hcnAuaCBpZl9ldGhlci5oIGlnbXAuaCBpbi5oIGlvLmggaXAuaCBpc2EuaCBsYXRjaC5oIFwKKwlsaXR0bGVfYnN3YXAuaCBtaXNjLmMgbmljLmMgbmljLmggb3NkZXAuaCBwY2kuYyBwY2kuaCBcCisJcGNpX2lkcy5oIHBjaV9pby5jIHN0ZGludC5oIHRmdHAuaCB0aW1lci5jIHRpbWVyLmggXAorCXR5cGVzLmggdWRwLmggbWlpLmggcGljODI1OS5jIHBpYzgyNTkuaCBweGUuaCBiYXNlbWVtLmMgc2Vnb2ZmLmgKK0VYVFJBX2xpYmRyaXZlcnNfYV9TT1VSQ0VTID0gM2M1OTUuYyAzYzU5NS5oIDNjOTB4LmMgZGF2aWNvbS5jIFwKKwllMTAwMC5jIGUxMDAwX2h3LmggZWVwcm8xMDAuYyBlcGljMTAwLmMgZXBpYzEwMC5oIG5hdHNlbWkuYyBcCisJbnM4MzkwLmMgbnM4MzkwLmggcGNuZXQzMi5jIHJ0bDgxMzkuYyBzaXM5MDAuYyBzaXM5MDAuaCBcCisJc3VuZGFuY2UuYyB0ZzMuYyB0ZzMuaCB0bGFuLmMgdGxhbi5oIHR1bGlwLmMgdmlhLXJoaW5lLmMgXAorCXc4OWM4NDAuYyByODE2OS5jIGZvcmNlZGV0aC5jIG5zODM4MjAuYyBwbmljLmMgcG5pY19hcGkuYyBcCisJdW5kaS5jIHVuZGkuaAogbGliZHJpdmVyc19hX0NGTEFHUyA9ICQoU1RBR0UyX0NGTEFHUykgLWZuby1idWlsdGluIC1ub3N0ZGluYyBcCiAJLURGU1lTX1RGVFA9MSAkKE5FVF9DRkxBR1MpICQoTkVUX0VYVFJBRkxBR1MpCiAjIEZpbGxlZCBieSBjb25maWd1cmUuCiBsaWJkcml2ZXJzX2FfTElCQUREID0gQE5FVEJPT1RfRFJJVkVSU0AKIGxpYmRyaXZlcnNfYV9ERVBFTkRFTkNJRVMgPSAkKGxpYmRyaXZlcnNfYV9MSUJBREQpCiAKLUVYVFJBX0RJU1QgPSBSRUFETUUubmV0Ym9vdCAzYzkweC50eHQgY3M4OXgwLnR4dCBzaXM5MDAudHh0IHR1bGlwLnR4dAorRVhUUkFfRElTVCA9IFJFQURNRS5uZXRib290CiAKICMgVGhlc2UgYmVsb3cgYXJlIHNldmVyYWwgc3BlY2lhbCBydWxlcyBmb3IgdGhlIGRldmljZSBkcml2ZXJzLgogIyBXZSBjYW5ub3QgdXNlIGEgc2ltcGxlIHJ1bGUgZm9yIHRoZW0uLi4KIAogIyBXaGF0IG9iamVjdHMgYXJlIGRlcml2ZWQgZnJvbSBhIGRyaXZlcj8KLTNjNTA5X2RyaXZlcnMgPSAzYzUwOS5vIDNjNTI5Lm8KKyMzYzUwOV9kcml2ZXJzID0gM2M1MDkubyAzYzUyOS5vCiAzYzU5NV9kcml2ZXJzID0gM2M1OTUubwogM2M5MHhfZHJpdmVycyA9IDNjOTB4Lm8KLWNzODl4MF9kcml2ZXJzID0gY3M4OXgwLm8KKyNjczg5eDBfZHJpdmVycyA9IGNzODl4MC5vCiBkYXZpY29tX2RyaXZlcnMgPSBkYXZpY29tLm8KLWRlcGNhX2RyaXZlcnMgPSBkZXBjYS5vCi1lZXByb19kcml2ZXJzID0gZWVwcm8ubworI2RlcGNhX2RyaXZlcnMgPSBkZXBjYS5vCisjZWVwcm9fZHJpdmVycyA9IGVlcHJvLm8KK2UxMDAwX2RyaXZlcnMgPSBlMTAwMC5vCiBlZXBybzEwMF9kcml2ZXJzID0gZWVwcm8xMDAubwogZXBpYzEwMF9kcml2ZXJzID0gZXBpYzEwMC5vCiAjZmEzMTFfZHJpdmVycyA9IGZhMzExLm8KLWk4MjU4Nl9kcml2ZXJzID0gM2M1MDcubyBleG9zMjA1Lm8gbmk1MjEwLm8KLWxhbmNlX2RyaXZlcnMgPSBsYW5jZS5vIG5lMjEwMC5vIG5pNjUxMC5vCitmb3JjZWRldGhfZHJpdmVycyA9IGZvcmNlZGV0aC5vCisjaTgyNTg2X2RyaXZlcnMgPSAzYzUwNy5vIGV4b3MyMDUubyBuaTUyMTAubworI2xhbmNlX2RyaXZlcnMgPSBsYW5jZS5vIG5lMjEwMC5vIG5pNjUxMC5vCiBuYXRzZW1pX2RyaXZlcnMgPSBuYXRzZW1pLm8KLW5pNTAxMF9kcml2ZXJzID0gbmk1MDEwLm8KKyNuaTUwMTBfZHJpdmVycyA9IG5pNTAxMC5vCituczgzODIwX2RyaXZlcnMgPSBuczgzODIwLm8KIG5zODM5MF9kcml2ZXJzID0gM2M1MDMubyBuZS5vIG5zODM5MC5vIHdkLm8KLW90dWxpcF9kcml2ZXJzID0gb3R1bGlwLm8KKyNvdHVsaXBfZHJpdmVycyA9IG90dWxpcC5vCitwY25ldDMyX2RyaXZlcnMgPSBwY25ldDMyLm8KK3BuaWNfZHJpdmVycyA9IHBuaWMubworcjgxNjlfZHJpdmVycyA9IHI4MTY5Lm8KIHJ0bDgxMzlfZHJpdmVycyA9IHJ0bDgxMzkubwogc2lzOTAwX2RyaXZlcnMgPSBzaXM5MDAubwotc2tfZzE2X2RyaXZlcnMgPSBza19nMTYubwotc21jOTAwMF9kcml2ZXJzID0gc21jOTAwMC5vCi10aWFyYV9kcml2ZXJzID0gdGlhcmEubwotI3RsYW5fZHJpdmVycyA9IHRsYW4ubworI3NrX2cxNl9kcml2ZXJzID0gc2tfZzE2Lm8KK3N1bmRhbmNlX2RyaXZlciA9IHN1bmRhbmNlLm8KKyNzbWM5MDAwX2RyaXZlcnMgPSBzbWM5MDAwLm8KK3RnM19kcml2ZXJzID0gdGczLm8KKyN0aWFyYV9kcml2ZXJzID0gdGlhcmEubwordGxhbl9kcml2ZXJzID0gdGxhbi5vCiB0dWxpcF9kcml2ZXJzID0gdHVsaXAubwordW5kaV9kcml2ZXJzID0gdW5kaS5vCiB2aWFfcmhpbmVfZHJpdmVycyA9IHZpYV9yaGluZS5vCiB3ODljODQwX2RyaXZlcnMgPSB3ODljODQwLm8KIAorCiAjIElzIGl0IHJlYWxseSBuZWNlc3NhcnkgdG8gc3BlY2lmeSBkZXBlbmRlY2llcyBleHBsaWNpdGx5PwotJCgzYzUwOV9kcml2ZXJzKTogM2M1MDkuYyAzYzUwOS5oCi0kKDNjNTA5X2RyaXZlcnMpOiAlLm86IDNjNTA5LmMKLQkkKENPTVBJTEUpICQoU1RBR0UyX0NGTEFHUykgLWZuby1idWlsdGluIC1ub3N0ZGluYyBcCi0JICAkKE5FVF9FWFRSQUZMQUdTKSAkKCQoYmFzZW5hbWUgJEApX29fQ0ZMQUdTKSAtbyAkQCAtYyAkPAorIyQoM2M1MDlfZHJpdmVycyk6IDNjNTA5LmMgM2M1MDkuaAorIyQoM2M1MDlfZHJpdmVycyk6ICUubzogM2M1MDkuYworIwkkKENPTVBJTEUpICQoU1RBR0UyX0NGTEFHUykgLWZuby1idWlsdGluIC1ub3N0ZGluYyBcCisjCSAgJChORVRfRVhUUkFGTEFHUykgJCgkKGJhc2VuYW1lICRAKV9vX0NGTEFHUykgLW8gJEAgLWMgJDwKIAogJCgzYzU5NV9kcml2ZXJzKTogM2M1OTUuYyAzYzU5NS5oCiAkKDNjNTk1X2RyaXZlcnMpOiAlLm86IDNjNTk1LmMKQEAgLTczLDIzICs4NywyOCBAQAogCSQoQ09NUElMRSkgJChTVEFHRTJfQ0ZMQUdTKSAtZm5vLWJ1aWx0aW4gLW5vc3RkaW5jIFwKIAkgICQoTkVUX0VYVFJBRkxBR1MpICQoJChiYXNlbmFtZSAkQClfb19DRkxBR1MpIC1vICRAIC1jICQ8CiAKLSQoY3M4OXgwX2RyaXZlcnMpOiBjczg5eDAuYyBjczg5eDAuaAotJChjczg5eDBfZHJpdmVycyk6ICUubzogY3M4OXgwLmMKLQkkKENPTVBJTEUpICQoU1RBR0UyX0NGTEFHUykgLWZuby1idWlsdGluIC1ub3N0ZGluYyBcCi0JICAkKE5FVF9FWFRSQUZMQUdTKSAkKCQoYmFzZW5hbWUgJEApX29fQ0ZMQUdTKSAtbyAkQCAtYyAkPAorIyQoY3M4OXgwX2RyaXZlcnMpOiBjczg5eDAuYyBjczg5eDAuaAorIyQoY3M4OXgwX2RyaXZlcnMpOiAlLm86IGNzODl4MC5jCisjCSQoQ09NUElMRSkgJChTVEFHRTJfQ0ZMQUdTKSAtZm5vLWJ1aWx0aW4gLW5vc3RkaW5jIFwKKyMJICAkKE5FVF9FWFRSQUZMQUdTKSAkKCQoYmFzZW5hbWUgJEApX29fQ0ZMQUdTKSAtbyAkQCAtYyAkPAogCiAkKGRhdmljb21fZHJpdmVycyk6IGRhdmljb20uYwogJChkYXZpY29tX2RyaXZlcnMpOiAlLm86IGRhdmljb20uYwogCSQoQ09NUElMRSkgJChTVEFHRTJfQ0ZMQUdTKSAtZm5vLWJ1aWx0aW4gLW5vc3RkaW5jIFwKIAkgICQoTkVUX0VYVFJBRkxBR1MpICQoJChiYXNlbmFtZSAkQClfb19DRkxBR1MpIC1vICRAIC1jICQ8CiAKLSQoZGVwY2FfZHJpdmVycyk6IGRlcGNhLmMKLSQoZGVwY2FfZHJpdmVycyk6ICUubzogZGVwY2EuYwotCSQoQ09NUElMRSkgJChTVEFHRTJfQ0ZMQUdTKSAtZm5vLWJ1aWx0aW4gLW5vc3RkaW5jIFwKLQkgICQoTkVUX0VYVFJBRkxBR1MpICQoJChiYXNlbmFtZSAkQClfb19DRkxBR1MpIC1vICRAIC1jICQ8CisjJChkZXBjYV9kcml2ZXJzKTogZGVwY2EuYworIyQoZGVwY2FfZHJpdmVycyk6ICUubzogZGVwY2EuYworIwkkKENPTVBJTEUpICQoU1RBR0UyX0NGTEFHUykgLWZuby1idWlsdGluIC1ub3N0ZGluYyBcCisjCSAgJChORVRfRVhUUkFGTEFHUykgJCgkKGJhc2VuYW1lICRAKV9vX0NGTEFHUykgLW8gJEAgLWMgJDwKKworIyQoZWVwcm9fZHJpdmVycyk6IGVlcHJvLmMKKyMkKGVlcHJvX2RyaXZlcnMpOiAlLm86IGVlcHJvLmMKKyMJJChDT01QSUxFKSAkKFNUQUdFMl9DRkxBR1MpIC1mbm8tYnVpbHRpbiAtbm9zdGRpbmMgXAorIwkgICQoTkVUX0VYVFJBRkxBR1MpICQoJChiYXNlbmFtZSAkQClfb19DRkxBR1MpIC1vICRAIC1jICQ8CiAKLSQoZWVwcm9fZHJpdmVycyk6IGVlcHJvLmMKLSQoZWVwcm9fZHJpdmVycyk6ICUubzogZWVwcm8uYworJChlMTAwMF9kcml2ZXJzKTogZTEwMDAuYyBlMTAwMF9ody5oCiskKGUxMDAwX2RyaXZlcnMpOiAlLm86IGUxMDAwLmMKIAkkKENPTVBJTEUpICQoU1RBR0UyX0NGTEFHUykgLWZuby1idWlsdGluIC1ub3N0ZGluYyBcCiAJICAkKE5FVF9FWFRSQUZMQUdTKSAkKCQoYmFzZW5hbWUgJEApX29fQ0ZMQUdTKSAtbyAkQCAtYyAkPAogCkBAIC0xMDMsMjggKzEyMiwzOCBAQAogCSQoQ09NUElMRSkgJChTVEFHRTJfQ0ZMQUdTKSAtZm5vLWJ1aWx0aW4gLW5vc3RkaW5jIFwKIAkgICQoTkVUX0VYVFJBRkxBR1MpICQoJChiYXNlbmFtZSAkQClfb19DRkxBR1MpIC1vICRAIC1jICQ8CiAKKyQoZm9yY2VkZXRoX2RyaXZlcnMpOiBmb3JjZWRldGguYworJChmb3JjZWRldGhfZHJpdmVycyk6ICUubzogZm9yY2VkZXRoLmMKKwkkKENPTVBJTEUpICQoU1RBR0UyX0NGTEFHUykgLWZuby1idWlsdGluIC1ub3N0ZGluYyBcCisJICAkKE5FVF9FWFRSQUZMQUdTKSAkKCQoYmFzZW5hbWUgJEApX29fQ0ZMQUdTKSAtbyAkQCAtYyAkPAorCiAjJChmYTMxMV9kcml2ZXJzKTogZmEzMTEuYwogIyQoZmEzMTFfZHJpdmVycyk6ICUubzogZmEzMTEuYwogIwkkKENPTVBJTEUpICQoU1RBR0UyX0NGTEFHUykgLWZuby1idWlsdGluIC1ub3N0ZGluYyBcCiAjCSAgJChORVRfRVhUUkFGTEFHUykgJCgkKGJhc2VuYW1lICRAKV9vX0NGTEFHUykgLW8gJEAgLWMgJDwKIAotJChpODI1ODZfZHJpdmVycyk6IGk4MjU4Ni5jCi0kKGk4MjU4Nl9kcml2ZXJzKTogJS5vOiBpODI1ODYuYwotCSQoQ09NUElMRSkgJChTVEFHRTJfQ0ZMQUdTKSAtZm5vLWJ1aWx0aW4gLW5vc3RkaW5jIFwKLQkgICQoTkVUX0VYVFJBRkxBR1MpICQoJChiYXNlbmFtZSAkQClfb19DRkxBR1MpIC1vICRAIC1jICQ8CisjJChpODI1ODZfZHJpdmVycyk6IGk4MjU4Ni5jCisjJChpODI1ODZfZHJpdmVycyk6ICUubzogaTgyNTg2LmMKKyMJJChDT01QSUxFKSAkKFNUQUdFMl9DRkxBR1MpIC1mbm8tYnVpbHRpbiAtbm9zdGRpbmMgXAorIwkgICQoTkVUX0VYVFJBRkxBR1MpICQoJChiYXNlbmFtZSAkQClfb19DRkxBR1MpIC1vICRAIC1jICQ8CiAKLSQobGFuY2VfZHJpdmVycyk6IGxhbmNlLmMKLSQobGFuY2VfZHJpdmVycyk6ICUubzogbGFuY2UuYwotCSQoQ09NUElMRSkgJChTVEFHRTJfQ0ZMQUdTKSAtZm5vLWJ1aWx0aW4gLW5vc3RkaW5jIFwKLQkgICQoTkVUX0VYVFJBRkxBR1MpICQoJChiYXNlbmFtZSAkQClfb19DRkxBR1MpIC1vICRAIC1jICQ8CisjJChsYW5jZV9kcml2ZXJzKTogbGFuY2UuYworIyQobGFuY2VfZHJpdmVycyk6ICUubzogbGFuY2UuYworIwkkKENPTVBJTEUpICQoU1RBR0UyX0NGTEFHUykgLWZuby1idWlsdGluIC1ub3N0ZGluYyBcCisjCSAgJChORVRfRVhUUkFGTEFHUykgJCgkKGJhc2VuYW1lICRAKV9vX0NGTEFHUykgLW8gJEAgLWMgJDwKIAogJChuYXRzZW1pX2RyaXZlcnMpOiBuYXRzZW1pLmMKICQobmF0c2VtaV9kcml2ZXJzKTogJS5vOiBuYXRzZW1pLmMKIAkkKENPTVBJTEUpICQoU1RBR0UyX0NGTEFHUykgLWZuby1idWlsdGluIC1ub3N0ZGluYyBcCiAJICAkKE5FVF9FWFRSQUZMQUdTKSAkKCQoYmFzZW5hbWUgJEApX29fQ0ZMQUdTKSAtbyAkQCAtYyAkPAogCi0kKG5pNTAxMF9kcml2ZXJzKTogbmk1MDEwLmMKLSQobmk1MDEwX2RyaXZlcnMpOiAlLm86IG5pNTAxMC5jCisjJChuaTUwMTBfZHJpdmVycyk6IG5pNTAxMC5jCisjJChuaTUwMTBfZHJpdmVycyk6ICUubzogbmk1MDEwLmMKKyMJJChDT01QSUxFKSAkKFNUQUdFMl9DRkxBR1MpIC1mbm8tYnVpbHRpbiAtbm9zdGRpbmMgXAorIwkgICQoTkVUX0VYVFJBRkxBR1MpICQoJChiYXNlbmFtZSAkQClfb19DRkxBR1MpIC1vICRAIC1jICQ8CisKKyQobnM4MzgyMF9kcml2ZXJzKTogbnM4MzgyMC5jCiskKG5zODM4MjBfZHJpdmVycyk6ICUubzogbnM4MzgyMC5jCiAJJChDT01QSUxFKSAkKFNUQUdFMl9DRkxBR1MpIC1mbm8tYnVpbHRpbiAtbm9zdGRpbmMgXAogCSAgJChORVRfRVhUUkFGTEFHUykgJCgkKGJhc2VuYW1lICRAKV9vX0NGTEFHUykgLW8gJEAgLWMgJDwKIApAQCAtMTMzLDggKzE2MiwxOCBAQAogCSQoQ09NUElMRSkgJChTVEFHRTJfQ0ZMQUdTKSAtZm5vLWJ1aWx0aW4gLW5vc3RkaW5jIFwKIAkgICQoTkVUX0VYVFJBRkxBR1MpICQoJChiYXNlbmFtZSAkQClfb19DRkxBR1MpIC1vICRAIC1jICQ8CiAKLSQob3R1bGlwX2RyaXZlcnMpOiBvdHVsaXAuYyBvdHVsaXAuaAotJChvdHVsaXBfZHJpdmVycyk6ICUubzogb3R1bGlwLmMKKyMkKG90dWxpcF9kcml2ZXJzKTogb3R1bGlwLmMgb3R1bGlwLmgKKyMkKG90dWxpcF9kcml2ZXJzKTogJS5vOiBvdHVsaXAuYworIwkkKENPTVBJTEUpICQoU1RBR0UyX0NGTEFHUykgLWZuby1idWlsdGluIC1ub3N0ZGluYyBcCisjCSAgJChORVRfRVhUUkFGTEFHUykgJCgkKGJhc2VuYW1lICRAKV9vX0NGTEFHUykgLW8gJEAgLWMgJDwKKworJChwY25ldDMyX2RyaXZlcnMpOiBwY25ldDMyLmMKKyQocGNuZXQzMl9kcml2ZXJzKTogJS5vOiBwY25ldDMyLmMKKwkkKENPTVBJTEUpICQoU1RBR0UyX0NGTEFHUykgLWZuby1idWlsdGluIC1ub3N0ZGluYyBcCisJICAkKE5FVF9FWFRSQUZMQUdTKSAkKCQoYmFzZW5hbWUgJEApX29fQ0ZMQUdTKSAtbyAkQCAtYyAkPAorCiskKHBuaWNfZHJpdmVycyk6IHBuaWMuYworJChwbmljX2RyaXZlcnMpOiAlLm86IHBuaWMuYyBwbmljX2FwaS5oCiAJJChDT01QSUxFKSAkKFNUQUdFMl9DRkxBR1MpIC1mbm8tYnVpbHRpbiAtbm9zdGRpbmMgXAogCSAgJChORVRfRVhUUkFGTEFHUykgJCgkKGJhc2VuYW1lICRAKV9vX0NGTEFHUykgLW8gJEAgLWMgJDwKIApAQCAtMTQzLDM2ICsxODIsNTYgQEAKIAkkKENPTVBJTEUpICQoU1RBR0UyX0NGTEFHUykgLWZuby1idWlsdGluIC1ub3N0ZGluYyBcCiAJICAkKE5FVF9FWFRSQUZMQUdTKSAkKCQoYmFzZW5hbWUgJEApX29fQ0ZMQUdTKSAtbyAkQCAtYyAkPAogCi0kKHNpczkwMF9kcml2ZXJzKTogc2lzOTAwLmMKLSQoc2lzOTAwX2RyaXZlcnMpOiAlLm86IHNpczkwMC5jIHNpczkwMC5oCiskKHI4MTY5X2RyaXZlcnMpOiByODE2OS5jCiskKHI4MTY5X2RyaXZlcnMpOiAlLm86IHI4MTY5LmMKIAkkKENPTVBJTEUpICQoU1RBR0UyX0NGTEFHUykgLWZuby1idWlsdGluIC1ub3N0ZGluYyBcCiAJICAkKE5FVF9FWFRSQUZMQUdTKSAkKCQoYmFzZW5hbWUgJEApX29fQ0ZMQUdTKSAtbyAkQCAtYyAkPAogCi0kKHNrX2cxNl9kcml2ZXJzKTogc2tfZzE2LmMgc2tfZzE2LmgKLSQoc2tfZzE2X2RyaXZlcnMpOiAlLm86IHNrX2cxNi5jCiskKHNpczkwMF9kcml2ZXJzKTogc2lzOTAwLmMgc2lzOTAwLmgKKyQoc2lzOTAwX2RyaXZlcnMpOiAlLm86IHNpczkwMC5jCiAJJChDT01QSUxFKSAkKFNUQUdFMl9DRkxBR1MpIC1mbm8tYnVpbHRpbiAtbm9zdGRpbmMgXAogCSAgJChORVRfRVhUUkFGTEFHUykgJCgkKGJhc2VuYW1lICRAKV9vX0NGTEFHUykgLW8gJEAgLWMgJDwKIAotJChzbWM5MDAwX2RyaXZlcnMpOiBzbWM5MDAwLmMgc21jOTAwMC5oCi0kKHNtYzkwMDBfZHJpdmVycyk6ICUubzogc21jOTAwMC5jCisjJChza19nMTZfZHJpdmVycyk6IHNrX2cxNi5jIHNrX2cxNi5oCisjJChza19nMTZfZHJpdmVycyk6ICUubzogc2tfZzE2LmMKKyMJJChDT01QSUxFKSAkKFNUQUdFMl9DRkxBR1MpIC1mbm8tYnVpbHRpbiAtbm9zdGRpbmMgXAorIwkgICQoTkVUX0VYVFJBRkxBR1MpICQoJChiYXNlbmFtZSAkQClfb19DRkxBR1MpIC1vICRAIC1jICQ8CisKKyMkKHNtYzkwMDBfZHJpdmVycyk6IHNtYzkwMDAuYyBzbWM5MDAwLmgKKyMkKHNtYzkwMDBfZHJpdmVycyk6ICUubzogc21jOTAwMC5jCisjCSQoQ09NUElMRSkgJChTVEFHRTJfQ0ZMQUdTKSAtZm5vLWJ1aWx0aW4gLW5vc3RkaW5jIFwKKyMJICAkKE5FVF9FWFRSQUZMQUdTKSAkKCQoYmFzZW5hbWUgJEApX29fQ0ZMQUdTKSAtbyAkQCAtYyAkPAorCiskKHN1bmRhbmNlX2RyaXZlcnMpOiBzdW5kYW5jZS5jCiskKHN1bmRhbmNlX2RyaXZlcnMpOiAlLm86IHN1bmRhbmNlLmMKIAkkKENPTVBJTEUpICQoU1RBR0UyX0NGTEFHUykgLWZuby1idWlsdGluIC1ub3N0ZGluYyBcCiAJICAkKE5FVF9FWFRSQUZMQUdTKSAkKCQoYmFzZW5hbWUgJEApX29fQ0ZMQUdTKSAtbyAkQCAtYyAkPAogCi0kKHRpYXJhX2RyaXZlcnMpOiB0aWFyYS5jCi0kKHRpYXJhX2RyaXZlcnMpOiAlLm86IHRpYXJhLmMKKyQodGczX2RyaXZlcnMpOiB0ZzMuYyB0ZzMuaAorJCh0ZzNfZHJpdmVycyk6ICUubzogdGczLmMKIAkkKENPTVBJTEUpICQoU1RBR0UyX0NGTEFHUykgLWZuby1idWlsdGluIC1ub3N0ZGluYyBcCiAJICAkKE5FVF9FWFRSQUZMQUdTKSAkKCQoYmFzZW5hbWUgJEApX29fQ0ZMQUdTKSAtbyAkQCAtYyAkPAogCi0jJCh0bGFuX2RyaXZlcnMpOiB0bGFuLmMKLSMkKHRsYW5fZHJpdmVycyk6ICUubzogdGxhbi5jCisjJCh0aWFyYV9kcml2ZXJzKTogdGlhcmEuYworIyQodGlhcmFfZHJpdmVycyk6ICUubzogdGlhcmEuYwogIwkkKENPTVBJTEUpICQoU1RBR0UyX0NGTEFHUykgLWZuby1idWlsdGluIC1ub3N0ZGluYyBcCiAjCSAgJChORVRfRVhUUkFGTEFHUykgJCgkKGJhc2VuYW1lICRAKV9vX0NGTEFHUykgLW8gJEAgLWMgJDwKIAorJCh0bGFuX2RyaXZlcnMpOiB0bGFuLmMgdGxhbi5oCiskKHRsYW5fZHJpdmVycyk6ICUubzogdGxhbi5jCisJJChDT01QSUxFKSAkKFNUQUdFMl9DRkxBR1MpIC1mbm8tYnVpbHRpbiAtbm9zdGRpbmMgXAorCSAgJChORVRfRVhUUkFGTEFHUykgJCgkKGJhc2VuYW1lICRAKV9vX0NGTEFHUykgLW8gJEAgLWMgJDwKKwogJCh0dWxpcF9kcml2ZXJzKTogdHVsaXAuYwogJCh0dWxpcF9kcml2ZXJzKTogJS5vOiB0dWxpcC5jCiAJJChDT01QSUxFKSAkKFNUQUdFMl9DRkxBR1MpIC1mbm8tYnVpbHRpbiAtbm9zdGRpbmMgXAogCSAgJChORVRfRVhUUkFGTEFHUykgJCgkKGJhc2VuYW1lICRAKV9vX0NGTEFHUykgLW8gJEAgLWMgJDwKIAorJCh1bmRpX2RyaXZlcnMpOiB1bmRpLmMgdW5kaS5oCiskKHVuZGlfZHJpdmVycyk6ICUubzogdW5kaS5jCisJJChDT01QSUxFKSAkKFNUQUdFMl9DRkxBR1MpIC1mbm8tYnVpbHRpbiAtbm9zdGRpbmMgXAorICAgICAgICAgICQoTkVUX0VYVFJBRkxBR1MpICQoJChiYXNlbmFtZSAkQClfb19DRkxBR1MpIC1vICRAIC1jICQ8CisKICQodmlhX3JoaW5lX2RyaXZlcnMpOiB2aWEtcmhpbmUuYwogJCh2aWFfcmhpbmVfZHJpdmVycyk6ICUubzogdmlhLXJoaW5lLmMKIAkkKENPTVBJTEUpICQoU1RBR0UyX0NGTEFHUykgLWZuby1idWlsdGluIC1ub3N0ZGluYyBcCkBAIC0xODQsMzYgKzI0Myw0NSBAQAogCSAgJChORVRfRVhUUkFGTEFHUykgJCgkKGJhc2VuYW1lICRAKV9vX0NGTEFHUykgLW8gJEAgLWMgJDwKIAogIyBQZXItb2JqZWN0IGZsYWdzLgotM2M1MDlfb19DRkxBR1MgPSAtRElOQ0xVREVfM0M1MDk9MQotM2M1Mjlfb19DRkxBR1MgPSAtRElOQ0xVREVfM0M1Mjk9MQorIzNjNTA5X29fQ0ZMQUdTID0gLURJTkNMVURFXzNDNTA5PTEKKyMzYzUyOV9vX0NGTEFHUyA9IC1ESU5DTFVERV8zQzUyOT0xCiAzYzU5NV9vX0NGTEFHUyA9IC1ESU5DTFVERV8zQzU5NT0xCiAzYzkweF9vX0NGTEFHUyA9IC1ESU5DTFVERV8zQzkwWD0xCi1jczg5eDBfb19DRkxBR1MgPSAtRElOQ0xVREVfQ1M4OVgwPTEKKyNjczg5eDBfb19DRkxBR1MgPSAtRElOQ0xVREVfQ1M4OVgwPTEKIGRhdmljb21fb19DRkxBR1MgPSAtRElOQ0xVREVfREFWSUNPTT0xCi1kZXBjYV9vX0NGTEFHUyA9IC1ESU5DTFVERV9ERVBDQT0xCi1lZXByb19vX0NGTEFHUyA9IC1ESU5DTFVERV9FRVBSTz0xCisjZGVwY2Ffb19DRkxBR1MgPSAtRElOQ0xVREVfREVQQ0E9MQorI2VlcHJvX29fQ0ZMQUdTID0gLURJTkNMVURFX0VFUFJPPTEKK2UxMDAwX29fQ0ZMQUdTID0gLURJTkNMVURFX0UxMDAwPTEKIGVlcHJvMTAwX29fQ0ZMQUdTID0gLURJTkNMVURFX0VFUFJPMTAwPTEKIGVwaWMxMDBfb19DRkxBR1MgPSAtRElOQ0xVREVfRVBJQzEwMD0xCiAjZmEzMTFfb19DRkxBR1MgPSAtRElOQ0xVREVfRkEzMTE9MQotM2M1MDdfb19DRkxBR1MgPSAtRElOQ0xVREVfM0M1MDc9MQotZXhvczIwNV9vX0NGTEFHUyA9IC1ESU5DTFVERV9FWE9TMjA1PTEKLW5pNTIxMF9vX0NGTEFHUyA9IC1ESU5DTFVERV9OSTUyMTA9MQotbGFuY2Vfb19DRkxBR1MgPSAtRElOQ0xVREVfTEFOQ0U9MQotbmUyMTAwX29fQ0ZMQUdTID0gLURJTkNMVURFX05FMjEwMD0xCi1uaTY1MTBfb19DRkxBR1MgPSAtRElOQ0xVREVfTkk2NTEwPTEKK2ZvcmNlZGV0aF9vX0NGTEFHUyA9IC1ESU5DTFVERV9GT1JDRURFVEg9MQorIzNjNTA3X29fQ0ZMQUdTID0gLURJTkNMVURFXzNDNTA3PTEKKyNleG9zMjA1X29fQ0ZMQUdTID0gLURJTkNMVURFX0VYT1MyMDU9MQorI25pNTIxMF9vX0NGTEFHUyA9IC1ESU5DTFVERV9OSTUyMTA9MQorI2xhbmNlX29fQ0ZMQUdTID0gLURJTkNMVURFX0xBTkNFPTEKKyNuZTIxMDBfb19DRkxBR1MgPSAtRElOQ0xVREVfTkUyMTAwPTEKKyNuaTY1MTBfb19DRkxBR1MgPSAtRElOQ0xVREVfTkk2NTEwPTEKIG5hdHNlbWlfb19DRkxBR1MgPSAtRElOQ0xVREVfTkFUU0VNST0xCi1uaTUwMTBfb19DRkxBR1MgPSAtRElOQ0xVREVfTkk1MDEwPTEKLTNjNTAzX29fQ0ZMQUdTID0gLURJTkNMVURFXzNDNTAzPTEKLW5lX29fQ0ZMQUdTID0gLURJTkNMVURFX05FPTEKKyNuaTUwMTBfb19DRkxBR1MgPSAtRElOQ0xVREVfTkk1MDEwPTEKKyMzYzUwM19vX0NGTEFHUyA9IC1ESU5DTFVERV8zQzUwMz0xCisjbmVfb19DRkxBR1MgPSAtRElOQ0xVREVfTkU9MQorbnM4MzgyMF9vX0NGTEFHUyA9IC1ESU5DTFVERV9OUzgzODIwPTEKIG5zODM5MF9vX0NGTEFHUyA9IC1ESU5DTFVERV9OUzgzOTA9MQotd2Rfb19DRkxBR1MgPSAtRElOQ0xVREVfV0Q9MQotb3R1bGlwX29fQ0ZMQUdTID0gLURJTkNMVURFX09UVUxJUD0xCisjd2Rfb19DRkxBR1MgPSAtRElOQ0xVREVfV0Q9MQorI290dWxpcF9vX0NGTEFHUyA9IC1ESU5DTFVERV9PVFVMSVA9MQorcGNuZXQzMl9vX0NGTEFHUyA9IC1ESU5DTFVERV9QQ05FVDMyPTEKK3BuaWNfb19DRkxBR1MgPSAtRElOQ0xVREVfUE5JQz0xCityODE2OV9vX0NGTEFHUyA9IC1ESU5DTFVERV9SODE2OT0xCiBydGw4MTM5X29fQ0ZMQUdTID0gLURJTkNMVURFX1JUTDgxMzk9MQogc2lzOTAwX29fQ0ZMQUdTID0gLURJTkNMVURFX1NJUzkwMD0xCi1za19nMTZfb19DRkxBR1MgPSAtRElOQ0xVREVfU0tfRzE2PTEKLXNtYzkwMDBfb19DRkxBR1MgPSAtRElOQ0xVREVfU01DOTAwMD0xCi10aWFyYV9vX0NGTEFHUyA9IC1ESU5DTFVERV9USUFSQT0xCi0jdGxhbl9vX0NGTEFHUyA9IC1ESU5DTFVERV9UTEFOPTEKKyNza19nMTZfb19DRkxBR1MgPSAtRElOQ0xVREVfU0tfRzE2PTEKKyNzbWM5MDAwX29fQ0ZMQUdTID0gLURJTkNMVURFX1NNQzkwMDA9MQorc3VuZGFuY2Vfb19DRkxBR1MgPSAtRElOQ0xVREVfU1VOREFOQ0U9MQorI3RpYXJhX29fQ0ZMQUdTID0gLURJTkNMVURFX1RJQVJBPTEKK3RnM19vX0NGTEFHUyA9IC1ESU5DTFVERV9URzM9MQordGxhbl9vX0NGTEFHUyA9IC1ESU5DTFVERV9UTEFOPTEKIHR1bGlwX29fQ0ZMQUdTID0gLURJTkNMVURFX1RVTElQPTEKK3VuZGlfb19DRkxBR1MgPSAtRElOQ0xVREVfVU5EST0xCiB2aWFfcmhpbmVfb19DRkxBR1MgPSAtRElOQ0xVREVfVklBX1JISU5FPTEKIHc4OWM4NDBfb19DRkxBR1MgPSAtRElOQ0xVREVfVzg5Qzg0MD0xCmRpZmYgLU5hdXIgZ3J1Yi0wLjk3Lm9yaWcvbmV0Ym9vdC9NYWtlZmlsZS5pbiBncnViLTAuOTcvbmV0Ym9vdC9NYWtlZmlsZS5pbgotLS0gZ3J1Yi0wLjk3Lm9yaWcvbmV0Ym9vdC9NYWtlZmlsZS5pbgkyMDA1LTA1LTA4IDAyOjQyOjM1LjAwMDAwMDAwMCArMDAwMAorKysgZ3J1Yi0wLjk3L25ldGJvb3QvTWFrZWZpbGUuaW4JMjAwNS0wOS0wMSAwMDoxNDoxNS4wMDAwMDAwMDAgKzAwMDAKQEAgLTQ4LDE4ICs0Nyw1MSBAQAogbWtpbnN0YWxsZGlycyA9ICQoU0hFTEwpICQodG9wX3NyY2RpcikvbWtpbnN0YWxsZGlycwogQ09ORklHX0hFQURFUiA9ICQodG9wX2J1aWxkZGlyKS9jb25maWcuaAogQ09ORklHX0NMRUFOX0ZJTEVTID0KLUxJQlJBUklFUyA9ICQobm9pbnN0X0xJQlJBUklFUykKIEFSID0gYXIKIEFSRkxBR1MgPSBjcnUKK0xJQlJBUklFUyA9ICQobm9pbnN0X0xJQlJBUklFUykKIGxpYmRyaXZlcnNfYV9BUiA9ICQoQVIpICQoQVJGTEFHUykKIGFtX2xpYmRyaXZlcnNfYV9PQkpFQ1RTID0gbGliZHJpdmVyc19hLWNvbmZpZy4kKE9CSkVYVCkgXAotCWxpYmRyaXZlcnNfYS1mc3lzX3RmdHAuJChPQkpFWFQpIGxpYmRyaXZlcnNfYS1tYWluLiQoT0JKRVhUKSBcCi0JbGliZHJpdmVyc19hLW1pc2MuJChPQkpFWFQpIGxpYmRyaXZlcnNfYS1wY2kuJChPQkpFWFQpIFwKLQlsaWJkcml2ZXJzX2EtdGltZXIuJChPQkpFWFQpCisJbGliZHJpdmVyc19hLWZzeXNfdGZ0cC4kKE9CSkVYVCkgXAorCWxpYmRyaXZlcnNfYS1pMzg2X3RpbWVyLiQoT0JKRVhUKSBsaWJkcml2ZXJzX2EtbWlzYy4kKE9CSkVYVCkgXAorCWxpYmRyaXZlcnNfYS1uaWMuJChPQkpFWFQpIGxpYmRyaXZlcnNfYS1wY2kuJChPQkpFWFQpIFwKKwlsaWJkcml2ZXJzX2EtcGNpX2lvLiQoT0JKRVhUKSBsaWJkcml2ZXJzX2EtdGltZXIuJChPQkpFWFQpIFwKKwlsaWJkcml2ZXJzX2EtcGljODI1OS4kKE9CSkVYVCkgbGliZHJpdmVyc19hLWJhc2VtZW0uJChPQkpFWFQpCiBsaWJkcml2ZXJzX2FfT0JKRUNUUyA9ICQoYW1fbGliZHJpdmVyc19hX09CSkVDVFMpCiBERUZBVUxUX0lOQ0xVREVTID0gLUkuIC1JJChzcmNkaXIpIC1JJCh0b3BfYnVpbGRkaXIpCiBkZXBjb21wID0gJChTSEVMTCkgJCh0b3Bfc3JjZGlyKS9kZXBjb21wCiBhbV9fZGVwZmlsZXNfbWF5YmUgPSBkZXBmaWxlcworQEFNREVQX1RSVUVAREVQX0ZJTEVTID0gLi8kKERFUERJUikvbGliZHJpdmVyc19hLTNjNTk1LlBvIFwKK0BBTURFUF9UUlVFQAkuLyQoREVQRElSKS9saWJkcml2ZXJzX2EtM2M5MHguUG8gXAorQEFNREVQX1RSVUVACS4vJChERVBESVIpL2xpYmRyaXZlcnNfYS1iYXNlbWVtLlBvIFwKK0BBTURFUF9UUlVFQAkuLyQoREVQRElSKS9saWJkcml2ZXJzX2EtY29uZmlnLlBvIFwKK0BBTURFUF9UUlVFQAkuLyQoREVQRElSKS9saWJkcml2ZXJzX2EtZGF2aWNvbS5QbyBcCitAQU1ERVBfVFJVRUAJLi8kKERFUERJUikvbGliZHJpdmVyc19hLWUxMDAwLlBvIFwKK0BBTURFUF9UUlVFQAkuLyQoREVQRElSKS9saWJkcml2ZXJzX2EtZWVwcm8xMDAuUG8gXAorQEFNREVQX1RSVUVACS4vJChERVBESVIpL2xpYmRyaXZlcnNfYS1lcGljMTAwLlBvIFwKK0BBTURFUF9UUlVFQAkuLyQoREVQRElSKS9saWJkcml2ZXJzX2EtZm9yY2VkZXRoLlBvIFwKK0BBTURFUF9UUlVFQAkuLyQoREVQRElSKS9saWJkcml2ZXJzX2EtZnN5c190ZnRwLlBvIFwKK0BBTURFUF9UUlVFQAkuLyQoREVQRElSKS9saWJkcml2ZXJzX2EtaTM4Nl90aW1lci5QbyBcCitAQU1ERVBfVFJVRUAJLi8kKERFUERJUikvbGliZHJpdmVyc19hLW1pc2MuUG8gXAorQEFNREVQX1RSVUVACS4vJChERVBESVIpL2xpYmRyaXZlcnNfYS1uYXRzZW1pLlBvIFwKK0BBTURFUF9UUlVFQAkuLyQoREVQRElSKS9saWJkcml2ZXJzX2EtbmljLlBvIFwKK0BBTURFUF9UUlVFQAkuLyQoREVQRElSKS9saWJkcml2ZXJzX2EtbnM4MzgyMC5QbyBcCitAQU1ERVBfVFJVRUAJLi8kKERFUERJUikvbGliZHJpdmVyc19hLW5zODM5MC5QbyBcCitAQU1ERVBfVFJVRUAJLi8kKERFUERJUikvbGliZHJpdmVyc19hLXBjaS5QbyBcCitAQU1ERVBfVFJVRUAJLi8kKERFUERJUikvbGliZHJpdmVyc19hLXBjaV9pby5QbyBcCitAQU1ERVBfVFJVRUAJLi8kKERFUERJUikvbGliZHJpdmVyc19hLXBjbmV0MzIuUG8gXAorQEFNREVQX1RSVUVACS4vJChERVBESVIpL2xpYmRyaXZlcnNfYS1waWM4MjU5LlBvIFwKK0BBTURFUF9UUlVFQAkuLyQoREVQRElSKS9saWJkcml2ZXJzX2EtcG5pYy5QbyBcCitAQU1ERVBfVFJVRUAJLi8kKERFUERJUikvbGliZHJpdmVyc19hLXBuaWNfYXBpLlBvIFwKK0BBTURFUF9UUlVFQAkuLyQoREVQRElSKS9saWJkcml2ZXJzX2EtcjgxNjkuUG8gXAorQEFNREVQX1RSVUVACS4vJChERVBESVIpL2xpYmRyaXZlcnNfYS1ydGw4MTM5LlBvIFwKK0BBTURFUF9UUlVFQAkuLyQoREVQRElSKS9saWJkcml2ZXJzX2Etc2lzOTAwLlBvIFwKK0BBTURFUF9UUlVFQAkuLyQoREVQRElSKS9saWJkcml2ZXJzX2EtdGczLlBvIFwKK0BBTURFUF9UUlVFQAkuLyQoREVQRElSKS9saWJkcml2ZXJzX2EtdGltZXIuUG8gXAorQEFNREVQX1RSVUVACS4vJChERVBESVIpL2xpYmRyaXZlcnNfYS10bGFuLlBvIFwKK0BBTURFUF9UUlVFQAkuLyQoREVQRElSKS9saWJkcml2ZXJzX2EtdHVsaXAuUG8gXAorQEFNREVQX1RSVUVACS4vJChERVBESVIpL2xpYmRyaXZlcnNfYS12aWEtcmhpbmUuUG8gXAorQEFNREVQX1RSVUVACS4vJChERVBESVIpL2xpYmRyaXZlcnNfYS13ODljODQwLlBvCiBDT01QSUxFID0gJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpIFwKIAkkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpCiBDQ0xEID0gJChDQykKQEAgLTE0OCw4ICsxODAsNiBAQAogYW1fX2luY2x1ZGUgPSBAYW1fX2luY2x1ZGVACiBhbV9fbGVhZGluZ19kb3QgPSBAYW1fX2xlYWRpbmdfZG90QAogYW1fX3F1b3RlID0gQGFtX19xdW90ZUAKLWFtX190YXIgPSBAYW1fX3RhckAKLWFtX191bnRhciA9IEBhbV9fdW50YXJACiBiaW5kaXIgPSBAYmluZGlyQAogYnVpbGQgPSBAYnVpbGRACiBidWlsZF9hbGlhcyA9IEBidWlsZF9hbGlhc0AKQEAgLTE4NiwxNiArMjE2LDE5IEBACiAjIERvbid0IGJ1aWxkIHRoZSBuZXRib290IHN1cHBvcnQgYnkgZGVmYXVsdC4KIEBORVRCT09UX1NVUFBPUlRfVFJVRUBMSUJEUklWRVJTID0gbGliZHJpdmVycy5hCiBub2luc3RfTElCUkFSSUVTID0gJChMSUJEUklWRVJTKQotbGliZHJpdmVyc19hX1NPVVJDRVMgPSBjYXJkcy5oIGNvbmZpZy5jIGV0aGVyYm9vdC5oIFwKLQlmc3lzX3RmdHAuYyBsaW51eC1hc20taW8uaCBsaW51eC1hc20tc3RyaW5nLmggXAotCW1haW4uYyBtaXNjLmMgbmljLmggb3NkZXAuaCBwY2kuYyBwY2kuaCB0aW1lci5jIHRpbWVyLmgKLQotRVhUUkFfbGliZHJpdmVyc19hX1NPVVJDRVMgPSAzYzUwOS5jIDNjNTA5LmggM2M1OTUuYyAzYzU5NS5oIDNjOTB4LmMgXAotCWNzODl4MC5jIGNzODl4MC5oIGRhdmljb20uYyBkZXBjYS5jIGVlcHJvLmMgZWVwcm8xMDAuYyBcCi0JZXBpYzEwMC5jIGVwaWMxMDAuaCBmYTMxMS5jIGk4MjU4Ni5jIGxhbmNlLmMgbmF0c2VtaS5jIFwKLQluaTUwMTAuYyBuczgzOTAuYyBuczgzOTAuaCBvdHVsaXAuYyBvdHVsaXAuaCBydGw4MTM5LmMgXAotCXNpczkwMC5jIHNpczkwMC5oIHNrX2cxNi5jIHNrX2cxNi5oIHNtYzkwMDAuYyBzbWM5MDAwLmggXAotCXRpYXJhLmMgdGxhbi5jIHR1bGlwLmMgdmlhLXJoaW5lLmMgdzg5Yzg0MC5jCitsaWJkcml2ZXJzX2FfU09VUkNFUyA9IGJpZ19ic3dhcC5oIGJvb3RwLmggYnl0ZXN3YXAuaCBjb25maWcuYyBjcHUuaCBcCisJZGV2LmggZWxmLmggZW5kaWFuLmggZXRoZXJib290LmggZnN5c190ZnRwLmMgZ3J1Yi5oIFwKKwlpMzg2X2J5dGVzd2FwLmggaTM4Nl9lbGYuaCBpMzg2X2VuZGlhbi5oIGkzODZfdGltZXIuYyBcCisJaWZfYXJwLmggaWZfZXRoZXIuaCBpZ21wLmggaW4uaCBpby5oIGlwLmggaXNhLmggbGF0Y2guaCBcCisJbGl0dGxlX2Jzd2FwLmggbWlzYy5jIG5pYy5jIG5pYy5oIG9zZGVwLmggcGNpLmMgcGNpLmggXAorCXBjaV9pZHMuaCBwY2lfaW8uYyBzdGRpbnQuaCB0ZnRwLmggdGltZXIuYyB0aW1lci5oIFwKKwl0eXBlcy5oIHVkcC5oIG1paS5oIHBpYzgyNTkuYyBwaWM4MjU5LmggcHhlLmggYmFzZW1lbS5jIHNlZ29mZi5oCisKK0VYVFJBX2xpYmRyaXZlcnNfYV9TT1VSQ0VTID0gM2M1OTUuYyAzYzU5NS5oIDNjOTB4LmMgZGF2aWNvbS5jIFwKKwllMTAwMC5jIGUxMDAwX2h3LmggZWVwcm8xMDAuYyBlcGljMTAwLmMgZXBpYzEwMC5oIG5hdHNlbWkuYyBcCisJbnM4MzkwLmMgbnM4MzkwLmggcGNuZXQzMi5jIHJ0bDgxMzkuYyBzaXM5MDAuYyBzaXM5MDAuaCBcCisJdGczLmMgdGczLmggdGxhbi5jIHRsYW4uaCB0dWxpcC5jIHZpYS1yaGluZS5jIFwKKwl3ODljODQwLmMgcjgxNjkuYyBmb3JjZWRldGguYyBuczgzODIwLmMgcG5pYy5jIHBuaWNfYXBpLmMgCiAKIGxpYmRyaXZlcnNfYV9DRkxBR1MgPSAkKFNUQUdFMl9DRkxBR1MpIC1mbm8tYnVpbHRpbiAtbm9zdGRpbmMgXAogCS1ERlNZU19URlRQPTEgJChORVRfQ0ZMQUdTKSAkKE5FVF9FWFRSQUZMQUdTKQpAQCAtMjAzLDY5ICsyMzYsODMgQEAKICMgRmlsbGVkIGJ5IGNvbmZpZ3VyZS4KIGxpYmRyaXZlcnNfYV9MSUJBREQgPSBATkVUQk9PVF9EUklWRVJTQAogbGliZHJpdmVyc19hX0RFUEVOREVOQ0lFUyA9ICQobGliZHJpdmVyc19hX0xJQkFERCkKLUVYVFJBX0RJU1QgPSBSRUFETUUubmV0Ym9vdCAzYzkweC50eHQgY3M4OXgwLnR4dCBzaXM5MDAudHh0IHR1bGlwLnR4dAorRVhUUkFfRElTVCA9IFJFQURNRS5uZXRib290CiAKICMgVGhlc2UgYmVsb3cgYXJlIHNldmVyYWwgc3BlY2lhbCBydWxlcyBmb3IgdGhlIGRldmljZSBkcml2ZXJzLgogIyBXZSBjYW5ub3QgdXNlIGEgc2ltcGxlIHJ1bGUgZm9yIHRoZW0uLi4KIAogIyBXaGF0IG9iamVjdHMgYXJlIGRlcml2ZWQgZnJvbSBhIGRyaXZlcj8KLTNjNTA5X2RyaXZlcnMgPSAzYzUwOS5vIDNjNTI5Lm8KKyMzYzUwOV9kcml2ZXJzID0gM2M1MDkubyAzYzUyOS5vCiAzYzU5NV9kcml2ZXJzID0gM2M1OTUubwogM2M5MHhfZHJpdmVycyA9IDNjOTB4Lm8KLWNzODl4MF9kcml2ZXJzID0gY3M4OXgwLm8KKyNjczg5eDBfZHJpdmVycyA9IGNzODl4MC5vCiBkYXZpY29tX2RyaXZlcnMgPSBkYXZpY29tLm8KLWRlcGNhX2RyaXZlcnMgPSBkZXBjYS5vCi1lZXByb19kcml2ZXJzID0gZWVwcm8ubworI2RlcGNhX2RyaXZlcnMgPSBkZXBjYS5vCisjZWVwcm9fZHJpdmVycyA9IGVlcHJvLm8KK2UxMDAwX2RyaXZlcnMgPSBlMTAwMC5vCiBlZXBybzEwMF9kcml2ZXJzID0gZWVwcm8xMDAubwogZXBpYzEwMF9kcml2ZXJzID0gZXBpYzEwMC5vCiAjZmEzMTFfZHJpdmVycyA9IGZhMzExLm8KLWk4MjU4Nl9kcml2ZXJzID0gM2M1MDcubyBleG9zMjA1Lm8gbmk1MjEwLm8KLWxhbmNlX2RyaXZlcnMgPSBsYW5jZS5vIG5lMjEwMC5vIG5pNjUxMC5vCitmb3JjZWRldGhfZHJpdmVycyA9IGZvcmNlZGV0aC5vCisjaTgyNTg2X2RyaXZlcnMgPSAzYzUwNy5vIGV4b3MyMDUubyBuaTUyMTAubworI2xhbmNlX2RyaXZlcnMgPSBsYW5jZS5vIG5lMjEwMC5vIG5pNjUxMC5vCiBuYXRzZW1pX2RyaXZlcnMgPSBuYXRzZW1pLm8KLW5pNTAxMF9kcml2ZXJzID0gbmk1MDEwLm8KKyNuaTUwMTBfZHJpdmVycyA9IG5pNTAxMC5vCituczgzODIwX2RyaXZlcnMgPSBuczgzODIwLm8KIG5zODM5MF9kcml2ZXJzID0gM2M1MDMubyBuZS5vIG5zODM5MC5vIHdkLm8KLW90dWxpcF9kcml2ZXJzID0gb3R1bGlwLm8KKyNvdHVsaXBfZHJpdmVycyA9IG90dWxpcC5vCitwY25ldDMyX2RyaXZlcnMgPSBwY25ldDMyLm8KK3BuaWNfZHJpdmVycyA9IHBuaWMubworcjgxNjlfZHJpdmVycyA9IHI4MTY5Lm8KIHJ0bDgxMzlfZHJpdmVycyA9IHJ0bDgxMzkubwogc2lzOTAwX2RyaXZlcnMgPSBzaXM5MDAubwotc2tfZzE2X2RyaXZlcnMgPSBza19nMTYubwotc21jOTAwMF9kcml2ZXJzID0gc21jOTAwMC5vCi10aWFyYV9kcml2ZXJzID0gdGlhcmEubwotI3RsYW5fZHJpdmVycyA9IHRsYW4ubworI3NrX2cxNl9kcml2ZXJzID0gc2tfZzE2Lm8KKyNzbWM5MDAwX2RyaXZlcnMgPSBzbWM5MDAwLm8KK3RnM19kcml2ZXJzID0gdGczLm8KKyN0aWFyYV9kcml2ZXJzID0gdGlhcmEubwordGxhbl9kcml2ZXJzID0gdGxhbi5vCiB0dWxpcF9kcml2ZXJzID0gdHVsaXAubwogdmlhX3JoaW5lX2RyaXZlcnMgPSB2aWFfcmhpbmUubwogdzg5Yzg0MF9kcml2ZXJzID0gdzg5Yzg0MC5vCiAKICMgUGVyLW9iamVjdCBmbGFncy4KLTNjNTA5X29fQ0ZMQUdTID0gLURJTkNMVURFXzNDNTA5PTEKLTNjNTI5X29fQ0ZMQUdTID0gLURJTkNMVURFXzNDNTI5PTEKKyMzYzUwOV9vX0NGTEFHUyA9IC1ESU5DTFVERV8zQzUwOT0xCisjM2M1Mjlfb19DRkxBR1MgPSAtRElOQ0xVREVfM0M1Mjk9MQogM2M1OTVfb19DRkxBR1MgPSAtRElOQ0xVREVfM0M1OTU9MQogM2M5MHhfb19DRkxBR1MgPSAtRElOQ0xVREVfM0M5MFg9MQotY3M4OXgwX29fQ0ZMQUdTID0gLURJTkNMVURFX0NTODlYMD0xCisjY3M4OXgwX29fQ0ZMQUdTID0gLURJTkNMVURFX0NTODlYMD0xCiBkYXZpY29tX29fQ0ZMQUdTID0gLURJTkNMVURFX0RBVklDT009MQotZGVwY2Ffb19DRkxBR1MgPSAtRElOQ0xVREVfREVQQ0E9MQotZWVwcm9fb19DRkxBR1MgPSAtRElOQ0xVREVfRUVQUk89MQorI2RlcGNhX29fQ0ZMQUdTID0gLURJTkNMVURFX0RFUENBPTEKKyNlZXByb19vX0NGTEFHUyA9IC1ESU5DTFVERV9FRVBSTz0xCitlMTAwMF9vX0NGTEFHUyA9IC1ESU5DTFVERV9FMTAwMD0xCiBlZXBybzEwMF9vX0NGTEFHUyA9IC1ESU5DTFVERV9FRVBSTzEwMD0xCiBlcGljMTAwX29fQ0ZMQUdTID0gLURJTkNMVURFX0VQSUMxMDA9MQogI2ZhMzExX29fQ0ZMQUdTID0gLURJTkNMVURFX0ZBMzExPTEKLTNjNTA3X29fQ0ZMQUdTID0gLURJTkNMVURFXzNDNTA3PTEKLWV4b3MyMDVfb19DRkxBR1MgPSAtRElOQ0xVREVfRVhPUzIwNT0xCi1uaTUyMTBfb19DRkxBR1MgPSAtRElOQ0xVREVfTkk1MjEwPTEKLWxhbmNlX29fQ0ZMQUdTID0gLURJTkNMVURFX0xBTkNFPTEKLW5lMjEwMF9vX0NGTEFHUyA9IC1ESU5DTFVERV9ORTIxMDA9MQotbmk2NTEwX29fQ0ZMQUdTID0gLURJTkNMVURFX05JNjUxMD0xCitmb3JjZWRldGhfb19DRkxBR1MgPSAtRElOQ0xVREVfRk9SQ0VERVRIPTEKKyMzYzUwN19vX0NGTEFHUyA9IC1ESU5DTFVERV8zQzUwNz0xCisjZXhvczIwNV9vX0NGTEFHUyA9IC1ESU5DTFVERV9FWE9TMjA1PTEKKyNuaTUyMTBfb19DRkxBR1MgPSAtRElOQ0xVREVfTkk1MjEwPTEKKyNsYW5jZV9vX0NGTEFHUyA9IC1ESU5DTFVERV9MQU5DRT0xCisjbmUyMTAwX29fQ0ZMQUdTID0gLURJTkNMVURFX05FMjEwMD0xCisjbmk2NTEwX29fQ0ZMQUdTID0gLURJTkNMVURFX05JNjUxMD0xCiBuYXRzZW1pX29fQ0ZMQUdTID0gLURJTkNMVURFX05BVFNFTUk9MQotbmk1MDEwX29fQ0ZMQUdTID0gLURJTkNMVURFX05JNTAxMD0xCi0zYzUwM19vX0NGTEFHUyA9IC1ESU5DTFVERV8zQzUwMz0xCi1uZV9vX0NGTEFHUyA9IC1ESU5DTFVERV9ORT0xCisjbmk1MDEwX29fQ0ZMQUdTID0gLURJTkNMVURFX05JNTAxMD0xCisjM2M1MDNfb19DRkxBR1MgPSAtRElOQ0xVREVfM0M1MDM9MQorI25lX29fQ0ZMQUdTID0gLURJTkNMVURFX05FPTEKK25zODM4MjBfb19DRkxBR1MgPSAtRElOQ0xVREVfTlM4MzgyMD0xCiBuczgzOTBfb19DRkxBR1MgPSAtRElOQ0xVREVfTlM4MzkwPTEKLXdkX29fQ0ZMQUdTID0gLURJTkNMVURFX1dEPTEKLW90dWxpcF9vX0NGTEFHUyA9IC1ESU5DTFVERV9PVFVMSVA9MQorI3dkX29fQ0ZMQUdTID0gLURJTkNMVURFX1dEPTEKKyNvdHVsaXBfb19DRkxBR1MgPSAtRElOQ0xVREVfT1RVTElQPTEKK3BjbmV0MzJfb19DRkxBR1MgPSAtRElOQ0xVREVfUENORVQzMj0xCitwbmljX29fQ0ZMQUdTID0gLURJTkNMVURFX1BOSUM9MQorcjgxNjlfb19DRkxBR1MgPSAtRElOQ0xVREVfUjgxNjk9MQogcnRsODEzOV9vX0NGTEFHUyA9IC1ESU5DTFVERV9SVEw4MTM5PTEKIHNpczkwMF9vX0NGTEFHUyA9IC1ESU5DTFVERV9TSVM5MDA9MQotc2tfZzE2X29fQ0ZMQUdTID0gLURJTkNMVURFX1NLX0cxNj0xCi1zbWM5MDAwX29fQ0ZMQUdTID0gLURJTkNMVURFX1NNQzkwMDA9MQotdGlhcmFfb19DRkxBR1MgPSAtRElOQ0xVREVfVElBUkE9MQotI3RsYW5fb19DRkxBR1MgPSAtRElOQ0xVREVfVExBTj0xCisjc2tfZzE2X29fQ0ZMQUdTID0gLURJTkNMVURFX1NLX0cxNj0xCisjc21jOTAwMF9vX0NGTEFHUyA9IC1ESU5DTFVERV9TTUM5MDAwPTEKKyN0aWFyYV9vX0NGTEFHUyA9IC1ESU5DTFVERV9USUFSQT0xCit0ZzNfb19DRkxBR1MgPSAtRElOQ0xVREVfVEczPTEKK3RsYW5fb19DRkxBR1MgPSAtRElOQ0xVREVfVExBTj0xCiB0dWxpcF9vX0NGTEFHUyA9IC1ESU5DTFVERV9UVUxJUD0xCiB2aWFfcmhpbmVfb19DRkxBR1MgPSAtRElOQ0xVREVfVklBX1JISU5FPTEKIHc4OWM4NDBfb19DRkxBR1MgPSAtRElOQ0xVREVfVzg5Qzg0MD0xCkBAIC0zMTYsMzIgKzM2MywzMiBAQAogZGlzdGNsZWFuLWNvbXBpbGU6CiAJLXJtIC1mICoudGFiLmMKIAotQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL2xpYmRyaXZlcnNfYS0zYzUwOS5Qb0BhbV9fcXVvdGVACiBAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvbGliZHJpdmVyc19hLTNjNTk1LlBvQGFtX19xdW90ZUAKIEBBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9saWJkcml2ZXJzX2EtM2M5MHguUG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL2xpYmRyaXZlcnNfYS1iYXNlbWVtLlBvQGFtX19xdW90ZUAKIEBBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9saWJkcml2ZXJzX2EtY29uZmlnLlBvQGFtX19xdW90ZUAKLUBBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9saWJkcml2ZXJzX2EtY3M4OXgwLlBvQGFtX19xdW90ZUAKIEBBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9saWJkcml2ZXJzX2EtZGF2aWNvbS5Qb0BhbV9fcXVvdGVACi1AQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvbGliZHJpdmVyc19hLWRlcGNhLlBvQGFtX19xdW90ZUAKLUBBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9saWJkcml2ZXJzX2EtZWVwcm8uUG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL2xpYmRyaXZlcnNfYS1lMTAwMC5Qb0BhbV9fcXVvdGVACiBAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvbGliZHJpdmVyc19hLWVlcHJvMTAwLlBvQGFtX19xdW90ZUAKIEBBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9saWJkcml2ZXJzX2EtZXBpYzEwMC5Qb0BhbV9fcXVvdGVACi1AQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvbGliZHJpdmVyc19hLWZhMzExLlBvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9saWJkcml2ZXJzX2EtZm9yY2VkZXRoLlBvQGFtX19xdW90ZUAKIEBBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9saWJkcml2ZXJzX2EtZnN5c190ZnRwLlBvQGFtX19xdW90ZUAKLUBBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9saWJkcml2ZXJzX2EtaTgyNTg2LlBvQGFtX19xdW90ZUAKLUBBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9saWJkcml2ZXJzX2EtbGFuY2UuUG9AYW1fX3F1b3RlQAotQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL2xpYmRyaXZlcnNfYS1tYWluLlBvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9saWJkcml2ZXJzX2EtaTM4Nl90aW1lci5Qb0BhbV9fcXVvdGVACiBAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvbGliZHJpdmVyc19hLW1pc2MuUG9AYW1fX3F1b3RlQAogQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL2xpYmRyaXZlcnNfYS1uYXRzZW1pLlBvQGFtX19xdW90ZUAKLUBBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9saWJkcml2ZXJzX2Etbmk1MDEwLlBvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9saWJkcml2ZXJzX2EtbmljLlBvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9saWJkcml2ZXJzX2EtbnM4MzgyMC5Qb0BhbV9fcXVvdGVACiBAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvbGliZHJpdmVyc19hLW5zODM5MC5Qb0BhbV9fcXVvdGVACi1AQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvbGliZHJpdmVyc19hLW90dWxpcC5Qb0BhbV9fcXVvdGVACiBAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvbGliZHJpdmVyc19hLXBjaS5Qb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvbGliZHJpdmVyc19hLXBjaV9pby5Qb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvbGliZHJpdmVyc19hLXBjbmV0MzIuUG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL2xpYmRyaXZlcnNfYS1waWM4MjU5LlBvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9saWJkcml2ZXJzX2EtcG5pYy5Qb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvbGliZHJpdmVyc19hLXBuaWNfYXBpLlBvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9saWJkcml2ZXJzX2EtcjgxNjkuUG9AYW1fX3F1b3RlQAogQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL2xpYmRyaXZlcnNfYS1ydGw4MTM5LlBvQGFtX19xdW90ZUAKIEBBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9saWJkcml2ZXJzX2Etc2lzOTAwLlBvQGFtX19xdW90ZUAKLUBBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9saWJkcml2ZXJzX2Etc2tfZzE2LlBvQGFtX19xdW90ZUAKLUBBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9saWJkcml2ZXJzX2Etc21jOTAwMC5Qb0BhbV9fcXVvdGVACi1AQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvbGliZHJpdmVyc19hLXRpYXJhLlBvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9saWJkcml2ZXJzX2EtdGczLlBvQGFtX19xdW90ZUAKIEBBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9saWJkcml2ZXJzX2EtdGltZXIuUG9AYW1fX3F1b3RlQAogQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL2xpYmRyaXZlcnNfYS10bGFuLlBvQGFtX19xdW90ZUAKIEBBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9saWJkcml2ZXJzX2EtdHVsaXAuUG9AYW1fX3F1b3RlQApAQCAtMzUyLDQ1MCArMzk5LDUxMyBAQAogQGFtX19mYXN0ZGVwQ0NfVFJVRUAJaWYgJChDT01QSUxFKSAtTVQgJEAgLU1EIC1NUCAtTUYgIiQoREVQRElSKS8kKi5UcG8iIC1jIC1vICRAICQ8OyBcCiBAYW1fX2Zhc3RkZXBDQ19UUlVFQAl0aGVuIG12IC1mICIkKERFUERJUikvJCouVHBvIiAiJChERVBESVIpLyQqLlBvIjsgZWxzZSBybSAtZiAiJChERVBESVIpLyQqLlRwbyI7IGV4aXQgMTsgZmkKIEBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9JyQ8JyBvYmplY3Q9JyRAJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlkZXBmaWxlPSckKERFUERJUikvJCouUG8nIHRtcGRlcGZpbGU9JyQoREVQRElSKS8kKi5UUG8nIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACiBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDT01QSUxFKSAtYyAkPAogCiAuYy5vYmo6CiBAYW1fX2Zhc3RkZXBDQ19UUlVFQAlpZiAkKENPTVBJTEUpIC1NVCAkQCAtTUQgLU1QIC1NRiAiJChERVBESVIpLyQqLlRwbyIgLWMgLW8gJEAgYCQoQ1lHUEFUSF9XKSAnJDwnYDsgXAogQGFtX19mYXN0ZGVwQ0NfVFJVRUAJdGhlbiBtdiAtZiAiJChERVBESVIpLyQqLlRwbyIgIiQoREVQRElSKS8kKi5QbyI7IGVsc2Ugcm0gLWYgIiQoREVQRElSKS8kKi5UcG8iOyBleGl0IDE7IGZpCiBAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSckPCcgb2JqZWN0PSckQCcgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJZGVwZmlsZT0nJChERVBESVIpLyQqLlBvJyB0bXBkZXBmaWxlPSckKERFUERJUikvJCouVFBvJyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAogQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ09NUElMRSkgLWMgYCQoQ1lHUEFUSF9XKSAnJDwnYAogCiBsaWJkcml2ZXJzX2EtY29uZmlnLm86IGNvbmZpZy5jCiBAYW1fX2Zhc3RkZXBDQ19UUlVFQAlpZiAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJkcml2ZXJzX2FfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGxpYmRyaXZlcnNfYS1jb25maWcubyAtTUQgLU1QIC1NRiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS1jb25maWcuVHBvIiAtYyAtbyBsaWJkcml2ZXJzX2EtY29uZmlnLm8gYHRlc3QgLWYgJ2NvbmZpZy5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bjb25maWcuYzsgXAogQGFtX19mYXN0ZGVwQ0NfVFJVRUAJdGhlbiBtdiAtZiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS1jb25maWcuVHBvIiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS1jb25maWcuUG8iOyBlbHNlIHJtIC1mICIkKERFUERJUikvbGliZHJpdmVyc19hLWNvbmZpZy5UcG8iOyBleGl0IDE7IGZpCiBAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdjb25maWcuYycgb2JqZWN0PSdsaWJkcml2ZXJzX2EtY29uZmlnLm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACWRlcGZpbGU9JyQoREVQRElSKS9saWJkcml2ZXJzX2EtY29uZmlnLlBvJyB0bXBkZXBmaWxlPSckKERFUERJUikvbGliZHJpdmVyc19hLWNvbmZpZy5UUG8nIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACiBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliZHJpdmVyc19hX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGxpYmRyaXZlcnNfYS1jb25maWcubyBgdGVzdCAtZiAnY29uZmlnLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGNvbmZpZy5jCiAKIGxpYmRyaXZlcnNfYS1jb25maWcub2JqOiBjb25maWcuYwogQGFtX19mYXN0ZGVwQ0NfVFJVRUAJaWYgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliZHJpdmVyc19hX0NGTEFHUykgJChDRkxBR1MpIC1NVCBsaWJkcml2ZXJzX2EtY29uZmlnLm9iaiAtTUQgLU1QIC1NRiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS1jb25maWcuVHBvIiAtYyAtbyBsaWJkcml2ZXJzX2EtY29uZmlnLm9iaiBgaWYgdGVzdCAtZiAnY29uZmlnLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnY29uZmlnLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2NvbmZpZy5jJzsgZmlgOyBcCiBAYW1fX2Zhc3RkZXBDQ19UUlVFQAl0aGVuIG12IC1mICIkKERFUERJUikvbGliZHJpdmVyc19hLWNvbmZpZy5UcG8iICIkKERFUERJUikvbGliZHJpdmVyc19hLWNvbmZpZy5QbyI7IGVsc2Ugcm0gLWYgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtY29uZmlnLlRwbyI7IGV4aXQgMTsgZmkKIEBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J2NvbmZpZy5jJyBvYmplY3Q9J2xpYmRyaXZlcnNfYS1jb25maWcub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlkZXBmaWxlPSckKERFUERJUikvbGliZHJpdmVyc19hLWNvbmZpZy5QbycgdG1wZGVwZmlsZT0nJChERVBESVIpL2xpYmRyaXZlcnNfYS1jb25maWcuVFBvJyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAogQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYmRyaXZlcnNfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBsaWJkcml2ZXJzX2EtY29uZmlnLm9iaiBgaWYgdGVzdCAtZiAnY29uZmlnLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnY29uZmlnLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2NvbmZpZy5jJzsgZmlgCiAKIGxpYmRyaXZlcnNfYS1mc3lzX3RmdHAubzogZnN5c190ZnRwLmMKIEBhbV9fZmFzdGRlcENDX1RSVUVACWlmICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYmRyaXZlcnNfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgbGliZHJpdmVyc19hLWZzeXNfdGZ0cC5vIC1NRCAtTVAgLU1GICIkKERFUERJUikvbGliZHJpdmVyc19hLWZzeXNfdGZ0cC5UcG8iIC1jIC1vIGxpYmRyaXZlcnNfYS1mc3lzX3RmdHAubyBgdGVzdCAtZiAnZnN5c190ZnRwLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGZzeXNfdGZ0cC5jOyBcCiBAYW1fX2Zhc3RkZXBDQ19UUlVFQAl0aGVuIG12IC1mICIkKERFUERJUikvbGliZHJpdmVyc19hLWZzeXNfdGZ0cC5UcG8iICIkKERFUERJUikvbGliZHJpdmVyc19hLWZzeXNfdGZ0cC5QbyI7IGVsc2Ugcm0gLWYgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtZnN5c190ZnRwLlRwbyI7IGV4aXQgMTsgZmkKIEBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J2ZzeXNfdGZ0cC5jJyBvYmplY3Q9J2xpYmRyaXZlcnNfYS1mc3lzX3RmdHAubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJZGVwZmlsZT0nJChERVBESVIpL2xpYmRyaXZlcnNfYS1mc3lzX3RmdHAuUG8nIHRtcGRlcGZpbGU9JyQoREVQRElSKS9saWJkcml2ZXJzX2EtZnN5c190ZnRwLlRQbycgQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKIEBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJkcml2ZXJzX2FfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gbGliZHJpdmVyc19hLWZzeXNfdGZ0cC5vIGB0ZXN0IC1mICdmc3lzX3RmdHAuYycgfHwgZWNobyAnJChzcmNkaXIpLydgZnN5c190ZnRwLmMKIAogbGliZHJpdmVyc19hLWZzeXNfdGZ0cC5vYmo6IGZzeXNfdGZ0cC5jCiBAYW1fX2Zhc3RkZXBDQ19UUlVFQAlpZiAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJkcml2ZXJzX2FfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGxpYmRyaXZlcnNfYS1mc3lzX3RmdHAub2JqIC1NRCAtTVAgLU1GICIkKERFUERJUikvbGliZHJpdmVyc19hLWZzeXNfdGZ0cC5UcG8iIC1jIC1vIGxpYmRyaXZlcnNfYS1mc3lzX3RmdHAub2JqIGBpZiB0ZXN0IC1mICdmc3lzX3RmdHAuYyc7IHRoZW4gJChDWUdQQVRIX1cpICdmc3lzX3RmdHAuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZnN5c190ZnRwLmMnOyBmaWA7IFwKIEBhbV9fZmFzdGRlcENDX1RSVUVACXRoZW4gbXYgLWYgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtZnN5c190ZnRwLlRwbyIgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtZnN5c190ZnRwLlBvIjsgZWxzZSBybSAtZiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS1mc3lzX3RmdHAuVHBvIjsgZXhpdCAxOyBmaQogQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nZnN5c190ZnRwLmMnIG9iamVjdD0nbGliZHJpdmVyc19hLWZzeXNfdGZ0cC5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACWRlcGZpbGU9JyQoREVQRElSKS9saWJkcml2ZXJzX2EtZnN5c190ZnRwLlBvJyB0bXBkZXBmaWxlPSckKERFUERJUikvbGliZHJpdmVyc19hLWZzeXNfdGZ0cC5UUG8nIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACiBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliZHJpdmVyc19hX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGxpYmRyaXZlcnNfYS1mc3lzX3RmdHAub2JqIGBpZiB0ZXN0IC1mICdmc3lzX3RmdHAuYyc7IHRoZW4gJChDWUdQQVRIX1cpICdmc3lzX3RmdHAuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZnN5c190ZnRwLmMnOyBmaWAKIAotbGliZHJpdmVyc19hLW1haW4ubzogbWFpbi5jCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAlpZiAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJkcml2ZXJzX2FfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGxpYmRyaXZlcnNfYS1tYWluLm8gLU1EIC1NUCAtTUYgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtbWFpbi5UcG8iIC1jIC1vIGxpYmRyaXZlcnNfYS1tYWluLm8gYHRlc3QgLWYgJ21haW4uYycgfHwgZWNobyAnJChzcmNkaXIpLydgbWFpbi5jOyBcCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAl0aGVuIG12IC1mICIkKERFUERJUikvbGliZHJpdmVyc19hLW1haW4uVHBvIiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS1tYWluLlBvIjsgZWxzZSBybSAtZiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS1tYWluLlRwbyI7IGV4aXQgMTsgZmkKLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J21haW4uYycgb2JqZWN0PSdsaWJkcml2ZXJzX2EtbWFpbi5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKLUBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJkcml2ZXJzX2FfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gbGliZHJpdmVyc19hLW1haW4ubyBgdGVzdCAtZiAnbWFpbi5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BtYWluLmMKLQotbGliZHJpdmVyc19hLW1haW4ub2JqOiBtYWluLmMKLUBhbV9fZmFzdGRlcENDX1RSVUVACWlmICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYmRyaXZlcnNfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgbGliZHJpdmVyc19hLW1haW4ub2JqIC1NRCAtTVAgLU1GICIkKERFUERJUikvbGliZHJpdmVyc19hLW1haW4uVHBvIiAtYyAtbyBsaWJkcml2ZXJzX2EtbWFpbi5vYmogYGlmIHRlc3QgLWYgJ21haW4uYyc7IHRoZW4gJChDWUdQQVRIX1cpICdtYWluLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL21haW4uYyc7IGZpYDsgXAotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJdGhlbiBtdiAtZiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS1tYWluLlRwbyIgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtbWFpbi5QbyI7IGVsc2Ugcm0gLWYgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtbWFpbi5UcG8iOyBleGl0IDE7IGZpCi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdtYWluLmMnIG9iamVjdD0nbGliZHJpdmVyc19hLW1haW4ub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKLUBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJkcml2ZXJzX2FfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gbGliZHJpdmVyc19hLW1haW4ub2JqIGBpZiB0ZXN0IC1mICdtYWluLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnbWFpbi5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9tYWluLmMnOyBmaWAKK2xpYmRyaXZlcnNfYS1pMzg2X3RpbWVyLm86IGkzODZfdGltZXIuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJaWYgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliZHJpdmVyc19hX0NGTEFHUykgJChDRkxBR1MpIC1NVCBsaWJkcml2ZXJzX2EtaTM4Nl90aW1lci5vIC1NRCAtTVAgLU1GICIkKERFUERJUikvbGliZHJpdmVyc19hLWkzODZfdGltZXIuVHBvIiAtYyAtbyBsaWJkcml2ZXJzX2EtaTM4Nl90aW1lci5vIGB0ZXN0IC1mICdpMzg2X3RpbWVyLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGkzODZfdGltZXIuYzsgXAorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJdGhlbiBtdiAtZiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS1pMzg2X3RpbWVyLlRwbyIgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtaTM4Nl90aW1lci5QbyI7IGVsc2Ugcm0gLWYgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtaTM4Nl90aW1lci5UcG8iOyBleGl0IDE7IGZpCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdpMzg2X3RpbWVyLmMnIG9iamVjdD0nbGliZHJpdmVyc19hLWkzODZfdGltZXIubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJZGVwZmlsZT0nJChERVBESVIpL2xpYmRyaXZlcnNfYS1pMzg2X3RpbWVyLlBvJyB0bXBkZXBmaWxlPSckKERFUERJUikvbGliZHJpdmVyc19hLWkzODZfdGltZXIuVFBvJyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYmRyaXZlcnNfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBsaWJkcml2ZXJzX2EtaTM4Nl90aW1lci5vIGB0ZXN0IC1mICdpMzg2X3RpbWVyLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGkzODZfdGltZXIuYworCitsaWJkcml2ZXJzX2EtaTM4Nl90aW1lci5vYmo6IGkzODZfdGltZXIuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJaWYgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliZHJpdmVyc19hX0NGTEFHUykgJChDRkxBR1MpIC1NVCBsaWJkcml2ZXJzX2EtaTM4Nl90aW1lci5vYmogLU1EIC1NUCAtTUYgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtaTM4Nl90aW1lci5UcG8iIC1jIC1vIGxpYmRyaXZlcnNfYS1pMzg2X3RpbWVyLm9iaiBgaWYgdGVzdCAtZiAnaTM4Nl90aW1lci5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ2kzODZfdGltZXIuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvaTM4Nl90aW1lci5jJzsgZmlgOyBcCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAl0aGVuIG12IC1mICIkKERFUERJUikvbGliZHJpdmVyc19hLWkzODZfdGltZXIuVHBvIiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS1pMzg2X3RpbWVyLlBvIjsgZWxzZSBybSAtZiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS1pMzg2X3RpbWVyLlRwbyI7IGV4aXQgMTsgZmkKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J2kzODZfdGltZXIuYycgb2JqZWN0PSdsaWJkcml2ZXJzX2EtaTM4Nl90aW1lci5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACWRlcGZpbGU9JyQoREVQRElSKS9saWJkcml2ZXJzX2EtaTM4Nl90aW1lci5QbycgdG1wZGVwZmlsZT0nJChERVBESVIpL2xpYmRyaXZlcnNfYS1pMzg2X3RpbWVyLlRQbycgQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJkcml2ZXJzX2FfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gbGliZHJpdmVyc19hLWkzODZfdGltZXIub2JqIGBpZiB0ZXN0IC1mICdpMzg2X3RpbWVyLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnaTM4Nl90aW1lci5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9pMzg2X3RpbWVyLmMnOyBmaWAKIAogbGliZHJpdmVyc19hLW1pc2MubzogbWlzYy5jCiBAYW1fX2Zhc3RkZXBDQ19UUlVFQAlpZiAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJkcml2ZXJzX2FfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGxpYmRyaXZlcnNfYS1taXNjLm8gLU1EIC1NUCAtTUYgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtbWlzYy5UcG8iIC1jIC1vIGxpYmRyaXZlcnNfYS1taXNjLm8gYHRlc3QgLWYgJ21pc2MuYycgfHwgZWNobyAnJChzcmNkaXIpLydgbWlzYy5jOyBcCiBAYW1fX2Zhc3RkZXBDQ19UUlVFQAl0aGVuIG12IC1mICIkKERFUERJUikvbGliZHJpdmVyc19hLW1pc2MuVHBvIiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS1taXNjLlBvIjsgZWxzZSBybSAtZiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS1taXNjLlRwbyI7IGV4aXQgMTsgZmkKIEBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J21pc2MuYycgb2JqZWN0PSdsaWJkcml2ZXJzX2EtbWlzYy5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlkZXBmaWxlPSckKERFUERJUikvbGliZHJpdmVyc19hLW1pc2MuUG8nIHRtcGRlcGZpbGU9JyQoREVQRElSKS9saWJkcml2ZXJzX2EtbWlzYy5UUG8nIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACiBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliZHJpdmVyc19hX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGxpYmRyaXZlcnNfYS1taXNjLm8gYHRlc3QgLWYgJ21pc2MuYycgfHwgZWNobyAnJChzcmNkaXIpLydgbWlzYy5jCiAKIGxpYmRyaXZlcnNfYS1taXNjLm9iajogbWlzYy5jCiBAYW1fX2Zhc3RkZXBDQ19UUlVFQAlpZiAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJkcml2ZXJzX2FfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGxpYmRyaXZlcnNfYS1taXNjLm9iaiAtTUQgLU1QIC1NRiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS1taXNjLlRwbyIgLWMgLW8gbGliZHJpdmVyc19hLW1pc2Mub2JqIGBpZiB0ZXN0IC1mICdtaXNjLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnbWlzYy5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9taXNjLmMnOyBmaWA7IFwKIEBhbV9fZmFzdGRlcENDX1RSVUVACXRoZW4gbXYgLWYgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtbWlzYy5UcG8iICIkKERFUERJUikvbGliZHJpdmVyc19hLW1pc2MuUG8iOyBlbHNlIHJtIC1mICIkKERFUERJUikvbGliZHJpdmVyc19hLW1pc2MuVHBvIjsgZXhpdCAxOyBmaQogQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nbWlzYy5jJyBvYmplY3Q9J2xpYmRyaXZlcnNfYS1taXNjLm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJZGVwZmlsZT0nJChERVBESVIpL2xpYmRyaXZlcnNfYS1taXNjLlBvJyB0bXBkZXBmaWxlPSckKERFUERJUikvbGliZHJpdmVyc19hLW1pc2MuVFBvJyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAogQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYmRyaXZlcnNfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBsaWJkcml2ZXJzX2EtbWlzYy5vYmogYGlmIHRlc3QgLWYgJ21pc2MuYyc7IHRoZW4gJChDWUdQQVRIX1cpICdtaXNjLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL21pc2MuYyc7IGZpYAogCitsaWJkcml2ZXJzX2EtbmljLm86IG5pYy5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAlpZiAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJkcml2ZXJzX2FfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGxpYmRyaXZlcnNfYS1uaWMubyAtTUQgLU1QIC1NRiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS1uaWMuVHBvIiAtYyAtbyBsaWJkcml2ZXJzX2EtbmljLm8gYHRlc3QgLWYgJ25pYy5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BuaWMuYzsgXAorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJdGhlbiBtdiAtZiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS1uaWMuVHBvIiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS1uaWMuUG8iOyBlbHNlIHJtIC1mICIkKERFUERJUikvbGliZHJpdmVyc19hLW5pYy5UcG8iOyBleGl0IDE7IGZpCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSduaWMuYycgb2JqZWN0PSdsaWJkcml2ZXJzX2EtbmljLm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACWRlcGZpbGU9JyQoREVQRElSKS9saWJkcml2ZXJzX2EtbmljLlBvJyB0bXBkZXBmaWxlPSckKERFUERJUikvbGliZHJpdmVyc19hLW5pYy5UUG8nIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliZHJpdmVyc19hX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGxpYmRyaXZlcnNfYS1uaWMubyBgdGVzdCAtZiAnbmljLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYG5pYy5jCisKK2xpYmRyaXZlcnNfYS1uaWMub2JqOiBuaWMuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJaWYgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliZHJpdmVyc19hX0NGTEFHUykgJChDRkxBR1MpIC1NVCBsaWJkcml2ZXJzX2EtbmljLm9iaiAtTUQgLU1QIC1NRiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS1uaWMuVHBvIiAtYyAtbyBsaWJkcml2ZXJzX2EtbmljLm9iaiBgaWYgdGVzdCAtZiAnbmljLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnbmljLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL25pYy5jJzsgZmlgOyBcCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAl0aGVuIG12IC1mICIkKERFUERJUikvbGliZHJpdmVyc19hLW5pYy5UcG8iICIkKERFUERJUikvbGliZHJpdmVyc19hLW5pYy5QbyI7IGVsc2Ugcm0gLWYgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtbmljLlRwbyI7IGV4aXQgMTsgZmkKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J25pYy5jJyBvYmplY3Q9J2xpYmRyaXZlcnNfYS1uaWMub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlkZXBmaWxlPSckKERFUERJUikvbGliZHJpdmVyc19hLW5pYy5QbycgdG1wZGVwZmlsZT0nJChERVBESVIpL2xpYmRyaXZlcnNfYS1uaWMuVFBvJyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYmRyaXZlcnNfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBsaWJkcml2ZXJzX2EtbmljLm9iaiBgaWYgdGVzdCAtZiAnbmljLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnbmljLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL25pYy5jJzsgZmlgCisKIGxpYmRyaXZlcnNfYS1wY2kubzogcGNpLmMKIEBhbV9fZmFzdGRlcENDX1RSVUVACWlmICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYmRyaXZlcnNfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgbGliZHJpdmVyc19hLXBjaS5vIC1NRCAtTVAgLU1GICIkKERFUERJUikvbGliZHJpdmVyc19hLXBjaS5UcG8iIC1jIC1vIGxpYmRyaXZlcnNfYS1wY2kubyBgdGVzdCAtZiAncGNpLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYHBjaS5jOyBcCiBAYW1fX2Zhc3RkZXBDQ19UUlVFQAl0aGVuIG12IC1mICIkKERFUERJUikvbGliZHJpdmVyc19hLXBjaS5UcG8iICIkKERFUERJUikvbGliZHJpdmVyc19hLXBjaS5QbyI7IGVsc2Ugcm0gLWYgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtcGNpLlRwbyI7IGV4aXQgMTsgZmkKIEBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J3BjaS5jJyBvYmplY3Q9J2xpYmRyaXZlcnNfYS1wY2kubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJZGVwZmlsZT0nJChERVBESVIpL2xpYmRyaXZlcnNfYS1wY2kuUG8nIHRtcGRlcGZpbGU9JyQoREVQRElSKS9saWJkcml2ZXJzX2EtcGNpLlRQbycgQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKIEBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJkcml2ZXJzX2FfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gbGliZHJpdmVyc19hLXBjaS5vIGB0ZXN0IC1mICdwY2kuYycgfHwgZWNobyAnJChzcmNkaXIpLydgcGNpLmMKIAogbGliZHJpdmVyc19hLXBjaS5vYmo6IHBjaS5jCiBAYW1fX2Zhc3RkZXBDQ19UUlVFQAlpZiAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJkcml2ZXJzX2FfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGxpYmRyaXZlcnNfYS1wY2kub2JqIC1NRCAtTVAgLU1GICIkKERFUERJUikvbGliZHJpdmVyc19hLXBjaS5UcG8iIC1jIC1vIGxpYmRyaXZlcnNfYS1wY2kub2JqIGBpZiB0ZXN0IC1mICdwY2kuYyc7IHRoZW4gJChDWUdQQVRIX1cpICdwY2kuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvcGNpLmMnOyBmaWA7IFwKIEBhbV9fZmFzdGRlcENDX1RSVUVACXRoZW4gbXYgLWYgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtcGNpLlRwbyIgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtcGNpLlBvIjsgZWxzZSBybSAtZiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS1wY2kuVHBvIjsgZXhpdCAxOyBmaQogQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0ncGNpLmMnIG9iamVjdD0nbGliZHJpdmVyc19hLXBjaS5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACWRlcGZpbGU9JyQoREVQRElSKS9saWJkcml2ZXJzX2EtcGNpLlBvJyB0bXBkZXBmaWxlPSckKERFUERJUikvbGliZHJpdmVyc19hLXBjaS5UUG8nIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACiBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliZHJpdmVyc19hX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGxpYmRyaXZlcnNfYS1wY2kub2JqIGBpZiB0ZXN0IC1mICdwY2kuYyc7IHRoZW4gJChDWUdQQVRIX1cpICdwY2kuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvcGNpLmMnOyBmaWAKIAorbGliZHJpdmVyc19hLXBjaV9pby5vOiBwY2lfaW8uYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJaWYgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliZHJpdmVyc19hX0NGTEFHUykgJChDRkxBR1MpIC1NVCBsaWJkcml2ZXJzX2EtcGNpX2lvLm8gLU1EIC1NUCAtTUYgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtcGNpX2lvLlRwbyIgLWMgLW8gbGliZHJpdmVyc19hLXBjaV9pby5vIGB0ZXN0IC1mICdwY2lfaW8uYycgfHwgZWNobyAnJChzcmNkaXIpLydgcGNpX2lvLmM7IFwKK0BhbV9fZmFzdGRlcENDX1RSVUVACXRoZW4gbXYgLWYgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtcGNpX2lvLlRwbyIgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtcGNpX2lvLlBvIjsgZWxzZSBybSAtZiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS1wY2lfaW8uVHBvIjsgZXhpdCAxOyBmaQorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0ncGNpX2lvLmMnIG9iamVjdD0nbGliZHJpdmVyc19hLXBjaV9pby5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlkZXBmaWxlPSckKERFUERJUikvbGliZHJpdmVyc19hLXBjaV9pby5QbycgdG1wZGVwZmlsZT0nJChERVBESVIpL2xpYmRyaXZlcnNfYS1wY2lfaW8uVFBvJyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYmRyaXZlcnNfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBsaWJkcml2ZXJzX2EtcGNpX2lvLm8gYHRlc3QgLWYgJ3BjaV9pby5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BwY2lfaW8uYworCitsaWJkcml2ZXJzX2EtcGNpX2lvLm9iajogcGNpX2lvLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACWlmICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYmRyaXZlcnNfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgbGliZHJpdmVyc19hLXBjaV9pby5vYmogLU1EIC1NUCAtTUYgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtcGNpX2lvLlRwbyIgLWMgLW8gbGliZHJpdmVyc19hLXBjaV9pby5vYmogYGlmIHRlc3QgLWYgJ3BjaV9pby5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ3BjaV9pby5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9wY2lfaW8uYyc7IGZpYDsgXAorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJdGhlbiBtdiAtZiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS1wY2lfaW8uVHBvIiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS1wY2lfaW8uUG8iOyBlbHNlIHJtIC1mICIkKERFUERJUikvbGliZHJpdmVyc19hLXBjaV9pby5UcG8iOyBleGl0IDE7IGZpCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdwY2lfaW8uYycgb2JqZWN0PSdsaWJkcml2ZXJzX2EtcGNpX2lvLm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJZGVwZmlsZT0nJChERVBESVIpL2xpYmRyaXZlcnNfYS1wY2lfaW8uUG8nIHRtcGRlcGZpbGU9JyQoREVQRElSKS9saWJkcml2ZXJzX2EtcGNpX2lvLlRQbycgQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJkcml2ZXJzX2FfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gbGliZHJpdmVyc19hLXBjaV9pby5vYmogYGlmIHRlc3QgLWYgJ3BjaV9pby5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ3BjaV9pby5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9wY2lfaW8uYyc7IGZpYAorCiBsaWJkcml2ZXJzX2EtdGltZXIubzogdGltZXIuYwogQGFtX19mYXN0ZGVwQ0NfVFJVRUAJaWYgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliZHJpdmVyc19hX0NGTEFHUykgJChDRkxBR1MpIC1NVCBsaWJkcml2ZXJzX2EtdGltZXIubyAtTUQgLU1QIC1NRiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS10aW1lci5UcG8iIC1jIC1vIGxpYmRyaXZlcnNfYS10aW1lci5vIGB0ZXN0IC1mICd0aW1lci5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2B0aW1lci5jOyBcCiBAYW1fX2Zhc3RkZXBDQ19UUlVFQAl0aGVuIG12IC1mICIkKERFUERJUikvbGliZHJpdmVyc19hLXRpbWVyLlRwbyIgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtdGltZXIuUG8iOyBlbHNlIHJtIC1mICIkKERFUERJUikvbGliZHJpdmVyc19hLXRpbWVyLlRwbyI7IGV4aXQgMTsgZmkKIEBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J3RpbWVyLmMnIG9iamVjdD0nbGliZHJpdmVyc19hLXRpbWVyLm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACWRlcGZpbGU9JyQoREVQRElSKS9saWJkcml2ZXJzX2EtdGltZXIuUG8nIHRtcGRlcGZpbGU9JyQoREVQRElSKS9saWJkcml2ZXJzX2EtdGltZXIuVFBvJyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAogQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYmRyaXZlcnNfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBsaWJkcml2ZXJzX2EtdGltZXIubyBgdGVzdCAtZiAndGltZXIuYycgfHwgZWNobyAnJChzcmNkaXIpLydgdGltZXIuYwogCiBsaWJkcml2ZXJzX2EtdGltZXIub2JqOiB0aW1lci5jCiBAYW1fX2Zhc3RkZXBDQ19UUlVFQAlpZiAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJkcml2ZXJzX2FfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGxpYmRyaXZlcnNfYS10aW1lci5vYmogLU1EIC1NUCAtTUYgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtdGltZXIuVHBvIiAtYyAtbyBsaWJkcml2ZXJzX2EtdGltZXIub2JqIGBpZiB0ZXN0IC1mICd0aW1lci5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ3RpbWVyLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL3RpbWVyLmMnOyBmaWA7IFwKIEBhbV9fZmFzdGRlcENDX1RSVUVACXRoZW4gbXYgLWYgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtdGltZXIuVHBvIiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS10aW1lci5QbyI7IGVsc2Ugcm0gLWYgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtdGltZXIuVHBvIjsgZXhpdCAxOyBmaQogQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0ndGltZXIuYycgb2JqZWN0PSdsaWJkcml2ZXJzX2EtdGltZXIub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlkZXBmaWxlPSckKERFUERJUikvbGliZHJpdmVyc19hLXRpbWVyLlBvJyB0bXBkZXBmaWxlPSckKERFUERJUikvbGliZHJpdmVyc19hLXRpbWVyLlRQbycgQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKIEBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJkcml2ZXJzX2FfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gbGliZHJpdmVyc19hLXRpbWVyLm9iaiBgaWYgdGVzdCAtZiAndGltZXIuYyc7IHRoZW4gJChDWUdQQVRIX1cpICd0aW1lci5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS90aW1lci5jJzsgZmlgCiAKLWxpYmRyaXZlcnNfYS0zYzUwOS5vOiAzYzUwOS5jCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAlpZiAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJkcml2ZXJzX2FfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGxpYmRyaXZlcnNfYS0zYzUwOS5vIC1NRCAtTVAgLU1GICIkKERFUERJUikvbGliZHJpdmVyc19hLTNjNTA5LlRwbyIgLWMgLW8gbGliZHJpdmVyc19hLTNjNTA5Lm8gYHRlc3QgLWYgJzNjNTA5LmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYDNjNTA5LmM7IFwKLUBhbV9fZmFzdGRlcENDX1RSVUVACXRoZW4gbXYgLWYgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtM2M1MDkuVHBvIiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS0zYzUwOS5QbyI7IGVsc2Ugcm0gLWYgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtM2M1MDkuVHBvIjsgZXhpdCAxOyBmaQotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nM2M1MDkuYycgb2JqZWN0PSdsaWJkcml2ZXJzX2EtM2M1MDkubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACi1AYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliZHJpdmVyc19hX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGxpYmRyaXZlcnNfYS0zYzUwOS5vIGB0ZXN0IC1mICczYzUwOS5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2AzYzUwOS5jCi0KLWxpYmRyaXZlcnNfYS0zYzUwOS5vYmo6IDNjNTA5LmMKLUBhbV9fZmFzdGRlcENDX1RSVUVACWlmICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYmRyaXZlcnNfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgbGliZHJpdmVyc19hLTNjNTA5Lm9iaiAtTUQgLU1QIC1NRiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS0zYzUwOS5UcG8iIC1jIC1vIGxpYmRyaXZlcnNfYS0zYzUwOS5vYmogYGlmIHRlc3QgLWYgJzNjNTA5LmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnM2M1MDkuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvM2M1MDkuYyc7IGZpYDsgXAotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJdGhlbiBtdiAtZiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS0zYzUwOS5UcG8iICIkKERFUERJUikvbGliZHJpdmVyc19hLTNjNTA5LlBvIjsgZWxzZSBybSAtZiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS0zYzUwOS5UcG8iOyBleGl0IDE7IGZpCi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSczYzUwOS5jJyBvYmplY3Q9J2xpYmRyaXZlcnNfYS0zYzUwOS5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAotQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYmRyaXZlcnNfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBsaWJkcml2ZXJzX2EtM2M1MDkub2JqIGBpZiB0ZXN0IC1mICczYzUwOS5jJzsgdGhlbiAkKENZR1BBVEhfVykgJzNjNTA5LmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpLzNjNTA5LmMnOyBmaWAKK2xpYmRyaXZlcnNfYS1waWM4MjU5Lm86IHBpYzgyNTkuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJaWYgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliZHJpdmVyc19hX0NGTEFHUykgJChDRkxBR1MpIC1NVCBsaWJkcml2ZXJzX2EtcGljODI1OS5vIC1NRCAtTVAgLU1GICIkKERFUERJUikvbGliZHJpdmVyc19hLXBpYzgyNTkuVHBvIiAtYyAtbyBsaWJkcml2ZXJzX2EtcGljODI1OS5vIGB0ZXN0IC1mICdwaWM4MjU5LmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYHBpYzgyNTkuYzsgXAorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJdGhlbiBtdiAtZiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS1waWM4MjU5LlRwbyIgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtcGljODI1OS5QbyI7IGVsc2Ugcm0gLWYgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtcGljODI1OS5UcG8iOyBleGl0IDE7IGZpCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdwaWM4MjU5LmMnIG9iamVjdD0nbGliZHJpdmVyc19hLXBpYzgyNTkubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJZGVwZmlsZT0nJChERVBESVIpL2xpYmRyaXZlcnNfYS1waWM4MjU5LlBvJyB0bXBkZXBmaWxlPSckKERFUERJUikvbGliZHJpdmVyc19hLXBpYzgyNTkuVFBvJyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYmRyaXZlcnNfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBsaWJkcml2ZXJzX2EtcGljODI1OS5vIGB0ZXN0IC1mICdwaWM4MjU5LmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYHBpYzgyNTkuYworCitsaWJkcml2ZXJzX2EtcGljODI1OS5vYmo6IHBpYzgyNTkuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJaWYgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliZHJpdmVyc19hX0NGTEFHUykgJChDRkxBR1MpIC1NVCBsaWJkcml2ZXJzX2EtcGljODI1OS5vYmogLU1EIC1NUCAtTUYgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtcGljODI1OS5UcG8iIC1jIC1vIGxpYmRyaXZlcnNfYS1waWM4MjU5Lm9iaiBgaWYgdGVzdCAtZiAncGljODI1OS5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ3BpYzgyNTkuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvcGljODI1OS5jJzsgZmlgOyBcCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAl0aGVuIG12IC1mICIkKERFUERJUikvbGliZHJpdmVyc19hLXBpYzgyNTkuVHBvIiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS1waWM4MjU5LlBvIjsgZWxzZSBybSAtZiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS1waWM4MjU5LlRwbyI7IGV4aXQgMTsgZmkKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J3BpYzgyNTkuYycgb2JqZWN0PSdsaWJkcml2ZXJzX2EtcGljODI1OS5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACWRlcGZpbGU9JyQoREVQRElSKS9saWJkcml2ZXJzX2EtcGljODI1OS5QbycgdG1wZGVwZmlsZT0nJChERVBESVIpL2xpYmRyaXZlcnNfYS1waWM4MjU5LlRQbycgQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJkcml2ZXJzX2FfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gbGliZHJpdmVyc19hLXBpYzgyNTkub2JqIGBpZiB0ZXN0IC1mICdwaWM4MjU5LmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAncGljODI1OS5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9waWM4MjU5LmMnOyBmaWAKKworbGliZHJpdmVyc19hLWJhc2VtZW0ubzogYmFzZW1lbS5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAlpZiAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJkcml2ZXJzX2FfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGxpYmRyaXZlcnNfYS1iYXNlbWVtLm8gLU1EIC1NUCAtTUYgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtYmFzZW1lbS5UcG8iIC1jIC1vIGxpYmRyaXZlcnNfYS1iYXNlbWVtLm8gYHRlc3QgLWYgJ2Jhc2VtZW0uYycgfHwgZWNobyAnJChzcmNkaXIpLydgYmFzZW1lbS5jOyBcCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAl0aGVuIG12IC1mICIkKERFUERJUikvbGliZHJpdmVyc19hLWJhc2VtZW0uVHBvIiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS1iYXNlbWVtLlBvIjsgZWxzZSBybSAtZiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS1iYXNlbWVtLlRwbyI7IGV4aXQgMTsgZmkKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J2Jhc2VtZW0uYycgb2JqZWN0PSdsaWJkcml2ZXJzX2EtYmFzZW1lbS5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlkZXBmaWxlPSckKERFUERJUikvbGliZHJpdmVyc19hLWJhc2VtZW0uUG8nIHRtcGRlcGZpbGU9JyQoREVQRElSKS9saWJkcml2ZXJzX2EtYmFzZW1lbS5UUG8nIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliZHJpdmVyc19hX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGxpYmRyaXZlcnNfYS1iYXNlbWVtLm8gYHRlc3QgLWYgJ2Jhc2VtZW0uYycgfHwgZWNobyAnJChzcmNkaXIpLydgYmFzZW1lbS5jCisKK2xpYmRyaXZlcnNfYS1iYXNlbWVtLm9iajogYmFzZW1lbS5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAlpZiAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJkcml2ZXJzX2FfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGxpYmRyaXZlcnNfYS1iYXNlbWVtLm9iaiAtTUQgLU1QIC1NRiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS1iYXNlbWVtLlRwbyIgLWMgLW8gbGliZHJpdmVyc19hLWJhc2VtZW0ub2JqIGBpZiB0ZXN0IC1mICdiYXNlbWVtLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnYmFzZW1lbS5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9iYXNlbWVtLmMnOyBmaWA7IFwKK0BhbV9fZmFzdGRlcENDX1RSVUVACXRoZW4gbXYgLWYgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtYmFzZW1lbS5UcG8iICIkKERFUERJUikvbGliZHJpdmVyc19hLWJhc2VtZW0uUG8iOyBlbHNlIHJtIC1mICIkKERFUERJUikvbGliZHJpdmVyc19hLWJhc2VtZW0uVHBvIjsgZXhpdCAxOyBmaQorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nYmFzZW1lbS5jJyBvYmplY3Q9J2xpYmRyaXZlcnNfYS1iYXNlbWVtLm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJZGVwZmlsZT0nJChERVBESVIpL2xpYmRyaXZlcnNfYS1iYXNlbWVtLlBvJyB0bXBkZXBmaWxlPSckKERFUERJUikvbGliZHJpdmVyc19hLWJhc2VtZW0uVFBvJyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYmRyaXZlcnNfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBsaWJkcml2ZXJzX2EtYmFzZW1lbS5vYmogYGlmIHRlc3QgLWYgJ2Jhc2VtZW0uYyc7IHRoZW4gJChDWUdQQVRIX1cpICdiYXNlbWVtLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2Jhc2VtZW0uYyc7IGZpYAogCiBsaWJkcml2ZXJzX2EtM2M1OTUubzogM2M1OTUuYwogQGFtX19mYXN0ZGVwQ0NfVFJVRUAJaWYgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliZHJpdmVyc19hX0NGTEFHUykgJChDRkxBR1MpIC1NVCBsaWJkcml2ZXJzX2EtM2M1OTUubyAtTUQgLU1QIC1NRiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS0zYzU5NS5UcG8iIC1jIC1vIGxpYmRyaXZlcnNfYS0zYzU5NS5vIGB0ZXN0IC1mICczYzU5NS5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2AzYzU5NS5jOyBcCiBAYW1fX2Zhc3RkZXBDQ19UUlVFQAl0aGVuIG12IC1mICIkKERFUERJUikvbGliZHJpdmVyc19hLTNjNTk1LlRwbyIgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtM2M1OTUuUG8iOyBlbHNlIHJtIC1mICIkKERFUERJUikvbGliZHJpdmVyc19hLTNjNTk1LlRwbyI7IGV4aXQgMTsgZmkKIEBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9JzNjNTk1LmMnIG9iamVjdD0nbGliZHJpdmVyc19hLTNjNTk1Lm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACWRlcGZpbGU9JyQoREVQRElSKS9saWJkcml2ZXJzX2EtM2M1OTUuUG8nIHRtcGRlcGZpbGU9JyQoREVQRElSKS9saWJkcml2ZXJzX2EtM2M1OTUuVFBvJyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAogQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYmRyaXZlcnNfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBsaWJkcml2ZXJzX2EtM2M1OTUubyBgdGVzdCAtZiAnM2M1OTUuYycgfHwgZWNobyAnJChzcmNkaXIpLydgM2M1OTUuYwogCiBsaWJkcml2ZXJzX2EtM2M1OTUub2JqOiAzYzU5NS5jCiBAYW1fX2Zhc3RkZXBDQ19UUlVFQAlpZiAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJkcml2ZXJzX2FfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGxpYmRyaXZlcnNfYS0zYzU5NS5vYmogLU1EIC1NUCAtTUYgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtM2M1OTUuVHBvIiAtYyAtbyBsaWJkcml2ZXJzX2EtM2M1OTUub2JqIGBpZiB0ZXN0IC1mICczYzU5NS5jJzsgdGhlbiAkKENZR1BBVEhfVykgJzNjNTk1LmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpLzNjNTk1LmMnOyBmaWA7IFwKIEBhbV9fZmFzdGRlcENDX1RSVUVACXRoZW4gbXYgLWYgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtM2M1OTUuVHBvIiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS0zYzU5NS5QbyI7IGVsc2Ugcm0gLWYgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtM2M1OTUuVHBvIjsgZXhpdCAxOyBmaQogQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nM2M1OTUuYycgb2JqZWN0PSdsaWJkcml2ZXJzX2EtM2M1OTUub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlkZXBmaWxlPSckKERFUERJUikvbGliZHJpdmVyc19hLTNjNTk1LlBvJyB0bXBkZXBmaWxlPSckKERFUERJUikvbGliZHJpdmVyc19hLTNjNTk1LlRQbycgQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKIEBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJkcml2ZXJzX2FfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gbGliZHJpdmVyc19hLTNjNTk1Lm9iaiBgaWYgdGVzdCAtZiAnM2M1OTUuYyc7IHRoZW4gJChDWUdQQVRIX1cpICczYzU5NS5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS8zYzU5NS5jJzsgZmlgCiAKIGxpYmRyaXZlcnNfYS0zYzkweC5vOiAzYzkweC5jCiBAYW1fX2Zhc3RkZXBDQ19UUlVFQAlpZiAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJkcml2ZXJzX2FfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGxpYmRyaXZlcnNfYS0zYzkweC5vIC1NRCAtTVAgLU1GICIkKERFUERJUikvbGliZHJpdmVyc19hLTNjOTB4LlRwbyIgLWMgLW8gbGliZHJpdmVyc19hLTNjOTB4Lm8gYHRlc3QgLWYgJzNjOTB4LmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYDNjOTB4LmM7IFwKIEBhbV9fZmFzdGRlcENDX1RSVUVACXRoZW4gbXYgLWYgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtM2M5MHguVHBvIiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS0zYzkweC5QbyI7IGVsc2Ugcm0gLWYgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtM2M5MHguVHBvIjsgZXhpdCAxOyBmaQogQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nM2M5MHguYycgb2JqZWN0PSdsaWJkcml2ZXJzX2EtM2M5MHgubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJZGVwZmlsZT0nJChERVBESVIpL2xpYmRyaXZlcnNfYS0zYzkweC5QbycgdG1wZGVwZmlsZT0nJChERVBESVIpL2xpYmRyaXZlcnNfYS0zYzkweC5UUG8nIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACiBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliZHJpdmVyc19hX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGxpYmRyaXZlcnNfYS0zYzkweC5vIGB0ZXN0IC1mICczYzkweC5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2AzYzkweC5jCiAKIGxpYmRyaXZlcnNfYS0zYzkweC5vYmo6IDNjOTB4LmMKIEBhbV9fZmFzdGRlcENDX1RSVUVACWlmICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYmRyaXZlcnNfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgbGliZHJpdmVyc19hLTNjOTB4Lm9iaiAtTUQgLU1QIC1NRiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS0zYzkweC5UcG8iIC1jIC1vIGxpYmRyaXZlcnNfYS0zYzkweC5vYmogYGlmIHRlc3QgLWYgJzNjOTB4LmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnM2M5MHguYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvM2M5MHguYyc7IGZpYDsgXAogQGFtX19mYXN0ZGVwQ0NfVFJVRUAJdGhlbiBtdiAtZiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS0zYzkweC5UcG8iICIkKERFUERJUikvbGliZHJpdmVyc19hLTNjOTB4LlBvIjsgZWxzZSBybSAtZiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS0zYzkweC5UcG8iOyBleGl0IDE7IGZpCiBAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSczYzkweC5jJyBvYmplY3Q9J2xpYmRyaXZlcnNfYS0zYzkweC5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACWRlcGZpbGU9JyQoREVQRElSKS9saWJkcml2ZXJzX2EtM2M5MHguUG8nIHRtcGRlcGZpbGU9JyQoREVQRElSKS9saWJkcml2ZXJzX2EtM2M5MHguVFBvJyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAogQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYmRyaXZlcnNfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBsaWJkcml2ZXJzX2EtM2M5MHgub2JqIGBpZiB0ZXN0IC1mICczYzkweC5jJzsgdGhlbiAkKENZR1BBVEhfVykgJzNjOTB4LmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpLzNjOTB4LmMnOyBmaWAKIAotbGliZHJpdmVyc19hLWNzODl4MC5vOiBjczg5eDAuYwotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJaWYgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliZHJpdmVyc19hX0NGTEFHUykgJChDRkxBR1MpIC1NVCBsaWJkcml2ZXJzX2EtY3M4OXgwLm8gLU1EIC1NUCAtTUYgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtY3M4OXgwLlRwbyIgLWMgLW8gbGliZHJpdmVyc19hLWNzODl4MC5vIGB0ZXN0IC1mICdjczg5eDAuYycgfHwgZWNobyAnJChzcmNkaXIpLydgY3M4OXgwLmM7IFwKLUBhbV9fZmFzdGRlcENDX1RSVUVACXRoZW4gbXYgLWYgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtY3M4OXgwLlRwbyIgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtY3M4OXgwLlBvIjsgZWxzZSBybSAtZiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS1jczg5eDAuVHBvIjsgZXhpdCAxOyBmaQotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nY3M4OXgwLmMnIG9iamVjdD0nbGliZHJpdmVyc19hLWNzODl4MC5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKLUBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJkcml2ZXJzX2FfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gbGliZHJpdmVyc19hLWNzODl4MC5vIGB0ZXN0IC1mICdjczg5eDAuYycgfHwgZWNobyAnJChzcmNkaXIpLydgY3M4OXgwLmMKLQotbGliZHJpdmVyc19hLWNzODl4MC5vYmo6IGNzODl4MC5jCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAlpZiAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJkcml2ZXJzX2FfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGxpYmRyaXZlcnNfYS1jczg5eDAub2JqIC1NRCAtTVAgLU1GICIkKERFUERJUikvbGliZHJpdmVyc19hLWNzODl4MC5UcG8iIC1jIC1vIGxpYmRyaXZlcnNfYS1jczg5eDAub2JqIGBpZiB0ZXN0IC1mICdjczg5eDAuYyc7IHRoZW4gJChDWUdQQVRIX1cpICdjczg5eDAuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvY3M4OXgwLmMnOyBmaWA7IFwKLUBhbV9fZmFzdGRlcENDX1RSVUVACXRoZW4gbXYgLWYgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtY3M4OXgwLlRwbyIgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtY3M4OXgwLlBvIjsgZWxzZSBybSAtZiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS1jczg5eDAuVHBvIjsgZXhpdCAxOyBmaQotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nY3M4OXgwLmMnIG9iamVjdD0nbGliZHJpdmVyc19hLWNzODl4MC5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAotQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYmRyaXZlcnNfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBsaWJkcml2ZXJzX2EtY3M4OXgwLm9iaiBgaWYgdGVzdCAtZiAnY3M4OXgwLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnY3M4OXgwLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2NzODl4MC5jJzsgZmlgCi0KIGxpYmRyaXZlcnNfYS1kYXZpY29tLm86IGRhdmljb20uYwogQGFtX19mYXN0ZGVwQ0NfVFJVRUAJaWYgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliZHJpdmVyc19hX0NGTEFHUykgJChDRkxBR1MpIC1NVCBsaWJkcml2ZXJzX2EtZGF2aWNvbS5vIC1NRCAtTVAgLU1GICIkKERFUERJUikvbGliZHJpdmVyc19hLWRhdmljb20uVHBvIiAtYyAtbyBsaWJkcml2ZXJzX2EtZGF2aWNvbS5vIGB0ZXN0IC1mICdkYXZpY29tLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGRhdmljb20uYzsgXAogQGFtX19mYXN0ZGVwQ0NfVFJVRUAJdGhlbiBtdiAtZiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS1kYXZpY29tLlRwbyIgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtZGF2aWNvbS5QbyI7IGVsc2Ugcm0gLWYgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtZGF2aWNvbS5UcG8iOyBleGl0IDE7IGZpCiBAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdkYXZpY29tLmMnIG9iamVjdD0nbGliZHJpdmVyc19hLWRhdmljb20ubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJZGVwZmlsZT0nJChERVBESVIpL2xpYmRyaXZlcnNfYS1kYXZpY29tLlBvJyB0bXBkZXBmaWxlPSckKERFUERJUikvbGliZHJpdmVyc19hLWRhdmljb20uVFBvJyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAogQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYmRyaXZlcnNfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBsaWJkcml2ZXJzX2EtZGF2aWNvbS5vIGB0ZXN0IC1mICdkYXZpY29tLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGRhdmljb20uYwogCiBsaWJkcml2ZXJzX2EtZGF2aWNvbS5vYmo6IGRhdmljb20uYwogQGFtX19mYXN0ZGVwQ0NfVFJVRUAJaWYgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliZHJpdmVyc19hX0NGTEFHUykgJChDRkxBR1MpIC1NVCBsaWJkcml2ZXJzX2EtZGF2aWNvbS5vYmogLU1EIC1NUCAtTUYgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtZGF2aWNvbS5UcG8iIC1jIC1vIGxpYmRyaXZlcnNfYS1kYXZpY29tLm9iaiBgaWYgdGVzdCAtZiAnZGF2aWNvbS5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ2Rhdmljb20uYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZGF2aWNvbS5jJzsgZmlgOyBcCiBAYW1fX2Zhc3RkZXBDQ19UUlVFQAl0aGVuIG12IC1mICIkKERFUERJUikvbGliZHJpdmVyc19hLWRhdmljb20uVHBvIiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS1kYXZpY29tLlBvIjsgZWxzZSBybSAtZiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS1kYXZpY29tLlRwbyI7IGV4aXQgMTsgZmkKIEBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J2Rhdmljb20uYycgb2JqZWN0PSdsaWJkcml2ZXJzX2EtZGF2aWNvbS5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACWRlcGZpbGU9JyQoREVQRElSKS9saWJkcml2ZXJzX2EtZGF2aWNvbS5QbycgdG1wZGVwZmlsZT0nJChERVBESVIpL2xpYmRyaXZlcnNfYS1kYXZpY29tLlRQbycgQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKIEBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJkcml2ZXJzX2FfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gbGliZHJpdmVyc19hLWRhdmljb20ub2JqIGBpZiB0ZXN0IC1mICdkYXZpY29tLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZGF2aWNvbS5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9kYXZpY29tLmMnOyBmaWAKIAotbGliZHJpdmVyc19hLWRlcGNhLm86IGRlcGNhLmMKLUBhbV9fZmFzdGRlcENDX1RSVUVACWlmICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYmRyaXZlcnNfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgbGliZHJpdmVyc19hLWRlcGNhLm8gLU1EIC1NUCAtTUYgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtZGVwY2EuVHBvIiAtYyAtbyBsaWJkcml2ZXJzX2EtZGVwY2EubyBgdGVzdCAtZiAnZGVwY2EuYycgfHwgZWNobyAnJChzcmNkaXIpLydgZGVwY2EuYzsgXAotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJdGhlbiBtdiAtZiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS1kZXBjYS5UcG8iICIkKERFUERJUikvbGliZHJpdmVyc19hLWRlcGNhLlBvIjsgZWxzZSBybSAtZiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS1kZXBjYS5UcG8iOyBleGl0IDE7IGZpCi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdkZXBjYS5jJyBvYmplY3Q9J2xpYmRyaXZlcnNfYS1kZXBjYS5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKLUBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJkcml2ZXJzX2FfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gbGliZHJpdmVyc19hLWRlcGNhLm8gYHRlc3QgLWYgJ2RlcGNhLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGRlcGNhLmMKLQotbGliZHJpdmVyc19hLWRlcGNhLm9iajogZGVwY2EuYwotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJaWYgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliZHJpdmVyc19hX0NGTEFHUykgJChDRkxBR1MpIC1NVCBsaWJkcml2ZXJzX2EtZGVwY2Eub2JqIC1NRCAtTVAgLU1GICIkKERFUERJUikvbGliZHJpdmVyc19hLWRlcGNhLlRwbyIgLWMgLW8gbGliZHJpdmVyc19hLWRlcGNhLm9iaiBgaWYgdGVzdCAtZiAnZGVwY2EuYyc7IHRoZW4gJChDWUdQQVRIX1cpICdkZXBjYS5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9kZXBjYS5jJzsgZmlgOyBcCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAl0aGVuIG12IC1mICIkKERFUERJUikvbGliZHJpdmVyc19hLWRlcGNhLlRwbyIgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtZGVwY2EuUG8iOyBlbHNlIHJtIC1mICIkKERFUERJUikvbGliZHJpdmVyc19hLWRlcGNhLlRwbyI7IGV4aXQgMTsgZmkKLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J2RlcGNhLmMnIG9iamVjdD0nbGliZHJpdmVyc19hLWRlcGNhLm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACi1AYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliZHJpdmVyc19hX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGxpYmRyaXZlcnNfYS1kZXBjYS5vYmogYGlmIHRlc3QgLWYgJ2RlcGNhLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZGVwY2EuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZGVwY2EuYyc7IGZpYAotCi1saWJkcml2ZXJzX2EtZWVwcm8ubzogZWVwcm8uYwotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJaWYgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliZHJpdmVyc19hX0NGTEFHUykgJChDRkxBR1MpIC1NVCBsaWJkcml2ZXJzX2EtZWVwcm8ubyAtTUQgLU1QIC1NRiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS1lZXByby5UcG8iIC1jIC1vIGxpYmRyaXZlcnNfYS1lZXByby5vIGB0ZXN0IC1mICdlZXByby5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BlZXByby5jOyBcCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAl0aGVuIG12IC1mICIkKERFUERJUikvbGliZHJpdmVyc19hLWVlcHJvLlRwbyIgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtZWVwcm8uUG8iOyBlbHNlIHJtIC1mICIkKERFUERJUikvbGliZHJpdmVyc19hLWVlcHJvLlRwbyI7IGV4aXQgMTsgZmkKLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J2VlcHJvLmMnIG9iamVjdD0nbGliZHJpdmVyc19hLWVlcHJvLm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAotQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYmRyaXZlcnNfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBsaWJkcml2ZXJzX2EtZWVwcm8ubyBgdGVzdCAtZiAnZWVwcm8uYycgfHwgZWNobyAnJChzcmNkaXIpLydgZWVwcm8uYwotCi1saWJkcml2ZXJzX2EtZWVwcm8ub2JqOiBlZXByby5jCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAlpZiAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJkcml2ZXJzX2FfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGxpYmRyaXZlcnNfYS1lZXByby5vYmogLU1EIC1NUCAtTUYgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtZWVwcm8uVHBvIiAtYyAtbyBsaWJkcml2ZXJzX2EtZWVwcm8ub2JqIGBpZiB0ZXN0IC1mICdlZXByby5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ2VlcHJvLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2VlcHJvLmMnOyBmaWA7IFwKLUBhbV9fZmFzdGRlcENDX1RSVUVACXRoZW4gbXYgLWYgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtZWVwcm8uVHBvIiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS1lZXByby5QbyI7IGVsc2Ugcm0gLWYgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtZWVwcm8uVHBvIjsgZXhpdCAxOyBmaQotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nZWVwcm8uYycgb2JqZWN0PSdsaWJkcml2ZXJzX2EtZWVwcm8ub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKLUBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJkcml2ZXJzX2FfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gbGliZHJpdmVyc19hLWVlcHJvLm9iaiBgaWYgdGVzdCAtZiAnZWVwcm8uYyc7IHRoZW4gJChDWUdQQVRIX1cpICdlZXByby5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9lZXByby5jJzsgZmlgCitsaWJkcml2ZXJzX2EtZTEwMDAubzogZTEwMDAuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJaWYgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliZHJpdmVyc19hX0NGTEFHUykgJChDRkxBR1MpIC1NVCBsaWJkcml2ZXJzX2EtZTEwMDAubyAtTUQgLU1QIC1NRiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS1lMTAwMC5UcG8iIC1jIC1vIGxpYmRyaXZlcnNfYS1lMTAwMC5vIGB0ZXN0IC1mICdlMTAwMC5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BlMTAwMC5jOyBcCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAl0aGVuIG12IC1mICIkKERFUERJUikvbGliZHJpdmVyc19hLWUxMDAwLlRwbyIgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtZTEwMDAuUG8iOyBlbHNlIHJtIC1mICIkKERFUERJUikvbGliZHJpdmVyc19hLWUxMDAwLlRwbyI7IGV4aXQgMTsgZmkKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J2UxMDAwLmMnIG9iamVjdD0nbGliZHJpdmVyc19hLWUxMDAwLm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACWRlcGZpbGU9JyQoREVQRElSKS9saWJkcml2ZXJzX2EtZTEwMDAuUG8nIHRtcGRlcGZpbGU9JyQoREVQRElSKS9saWJkcml2ZXJzX2EtZTEwMDAuVFBvJyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYmRyaXZlcnNfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBsaWJkcml2ZXJzX2EtZTEwMDAubyBgdGVzdCAtZiAnZTEwMDAuYycgfHwgZWNobyAnJChzcmNkaXIpLydgZTEwMDAuYworCitsaWJkcml2ZXJzX2EtZTEwMDAub2JqOiBlMTAwMC5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAlpZiAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJkcml2ZXJzX2FfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGxpYmRyaXZlcnNfYS1lMTAwMC5vYmogLU1EIC1NUCAtTUYgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtZTEwMDAuVHBvIiAtYyAtbyBsaWJkcml2ZXJzX2EtZTEwMDAub2JqIGBpZiB0ZXN0IC1mICdlMTAwMC5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ2UxMDAwLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2UxMDAwLmMnOyBmaWA7IFwKK0BhbV9fZmFzdGRlcENDX1RSVUVACXRoZW4gbXYgLWYgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtZTEwMDAuVHBvIiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS1lMTAwMC5QbyI7IGVsc2Ugcm0gLWYgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtZTEwMDAuVHBvIjsgZXhpdCAxOyBmaQorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nZTEwMDAuYycgb2JqZWN0PSdsaWJkcml2ZXJzX2EtZTEwMDAub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlkZXBmaWxlPSckKERFUERJUikvbGliZHJpdmVyc19hLWUxMDAwLlBvJyB0bXBkZXBmaWxlPSckKERFUERJUikvbGliZHJpdmVyc19hLWUxMDAwLlRQbycgQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJkcml2ZXJzX2FfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gbGliZHJpdmVyc19hLWUxMDAwLm9iaiBgaWYgdGVzdCAtZiAnZTEwMDAuYyc7IHRoZW4gJChDWUdQQVRIX1cpICdlMTAwMC5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9lMTAwMC5jJzsgZmlgCiAKIGxpYmRyaXZlcnNfYS1lZXBybzEwMC5vOiBlZXBybzEwMC5jCiBAYW1fX2Zhc3RkZXBDQ19UUlVFQAlpZiAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJkcml2ZXJzX2FfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGxpYmRyaXZlcnNfYS1lZXBybzEwMC5vIC1NRCAtTVAgLU1GICIkKERFUERJUikvbGliZHJpdmVyc19hLWVlcHJvMTAwLlRwbyIgLWMgLW8gbGliZHJpdmVyc19hLWVlcHJvMTAwLm8gYHRlc3QgLWYgJ2VlcHJvMTAwLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGVlcHJvMTAwLmM7IFwKIEBhbV9fZmFzdGRlcENDX1RSVUVACXRoZW4gbXYgLWYgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtZWVwcm8xMDAuVHBvIiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS1lZXBybzEwMC5QbyI7IGVsc2Ugcm0gLWYgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtZWVwcm8xMDAuVHBvIjsgZXhpdCAxOyBmaQogQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nZWVwcm8xMDAuYycgb2JqZWN0PSdsaWJkcml2ZXJzX2EtZWVwcm8xMDAubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJZGVwZmlsZT0nJChERVBESVIpL2xpYmRyaXZlcnNfYS1lZXBybzEwMC5QbycgdG1wZGVwZmlsZT0nJChERVBESVIpL2xpYmRyaXZlcnNfYS1lZXBybzEwMC5UUG8nIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACiBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliZHJpdmVyc19hX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGxpYmRyaXZlcnNfYS1lZXBybzEwMC5vIGB0ZXN0IC1mICdlZXBybzEwMC5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BlZXBybzEwMC5jCiAKIGxpYmRyaXZlcnNfYS1lZXBybzEwMC5vYmo6IGVlcHJvMTAwLmMKIEBhbV9fZmFzdGRlcENDX1RSVUVACWlmICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYmRyaXZlcnNfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgbGliZHJpdmVyc19hLWVlcHJvMTAwLm9iaiAtTUQgLU1QIC1NRiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS1lZXBybzEwMC5UcG8iIC1jIC1vIGxpYmRyaXZlcnNfYS1lZXBybzEwMC5vYmogYGlmIHRlc3QgLWYgJ2VlcHJvMTAwLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZWVwcm8xMDAuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZWVwcm8xMDAuYyc7IGZpYDsgXAogQGFtX19mYXN0ZGVwQ0NfVFJVRUAJdGhlbiBtdiAtZiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS1lZXBybzEwMC5UcG8iICIkKERFUERJUikvbGliZHJpdmVyc19hLWVlcHJvMTAwLlBvIjsgZWxzZSBybSAtZiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS1lZXBybzEwMC5UcG8iOyBleGl0IDE7IGZpCiBAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdlZXBybzEwMC5jJyBvYmplY3Q9J2xpYmRyaXZlcnNfYS1lZXBybzEwMC5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACWRlcGZpbGU9JyQoREVQRElSKS9saWJkcml2ZXJzX2EtZWVwcm8xMDAuUG8nIHRtcGRlcGZpbGU9JyQoREVQRElSKS9saWJkcml2ZXJzX2EtZWVwcm8xMDAuVFBvJyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAogQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYmRyaXZlcnNfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBsaWJkcml2ZXJzX2EtZWVwcm8xMDAub2JqIGBpZiB0ZXN0IC1mICdlZXBybzEwMC5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ2VlcHJvMTAwLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2VlcHJvMTAwLmMnOyBmaWAKIAogbGliZHJpdmVyc19hLWVwaWMxMDAubzogZXBpYzEwMC5jCiBAYW1fX2Zhc3RkZXBDQ19UUlVFQAlpZiAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJkcml2ZXJzX2FfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGxpYmRyaXZlcnNfYS1lcGljMTAwLm8gLU1EIC1NUCAtTUYgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtZXBpYzEwMC5UcG8iIC1jIC1vIGxpYmRyaXZlcnNfYS1lcGljMTAwLm8gYHRlc3QgLWYgJ2VwaWMxMDAuYycgfHwgZWNobyAnJChzcmNkaXIpLydgZXBpYzEwMC5jOyBcCiBAYW1fX2Zhc3RkZXBDQ19UUlVFQAl0aGVuIG12IC1mICIkKERFUERJUikvbGliZHJpdmVyc19hLWVwaWMxMDAuVHBvIiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS1lcGljMTAwLlBvIjsgZWxzZSBybSAtZiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS1lcGljMTAwLlRwbyI7IGV4aXQgMTsgZmkKIEBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J2VwaWMxMDAuYycgb2JqZWN0PSdsaWJkcml2ZXJzX2EtZXBpYzEwMC5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlkZXBmaWxlPSckKERFUERJUikvbGliZHJpdmVyc19hLWVwaWMxMDAuUG8nIHRtcGRlcGZpbGU9JyQoREVQRElSKS9saWJkcml2ZXJzX2EtZXBpYzEwMC5UUG8nIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACiBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliZHJpdmVyc19hX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGxpYmRyaXZlcnNfYS1lcGljMTAwLm8gYHRlc3QgLWYgJ2VwaWMxMDAuYycgfHwgZWNobyAnJChzcmNkaXIpLydgZXBpYzEwMC5jCiAKIGxpYmRyaXZlcnNfYS1lcGljMTAwLm9iajogZXBpYzEwMC5jCiBAYW1fX2Zhc3RkZXBDQ19UUlVFQAlpZiAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJkcml2ZXJzX2FfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGxpYmRyaXZlcnNfYS1lcGljMTAwLm9iaiAtTUQgLU1QIC1NRiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS1lcGljMTAwLlRwbyIgLWMgLW8gbGliZHJpdmVyc19hLWVwaWMxMDAub2JqIGBpZiB0ZXN0IC1mICdlcGljMTAwLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZXBpYzEwMC5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9lcGljMTAwLmMnOyBmaWA7IFwKIEBhbV9fZmFzdGRlcENDX1RSVUVACXRoZW4gbXYgLWYgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtZXBpYzEwMC5UcG8iICIkKERFUERJUikvbGliZHJpdmVyc19hLWVwaWMxMDAuUG8iOyBlbHNlIHJtIC1mICIkKERFUERJUikvbGliZHJpdmVyc19hLWVwaWMxMDAuVHBvIjsgZXhpdCAxOyBmaQogQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nZXBpYzEwMC5jJyBvYmplY3Q9J2xpYmRyaXZlcnNfYS1lcGljMTAwLm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJZGVwZmlsZT0nJChERVBESVIpL2xpYmRyaXZlcnNfYS1lcGljMTAwLlBvJyB0bXBkZXBmaWxlPSckKERFUERJUikvbGliZHJpdmVyc19hLWVwaWMxMDAuVFBvJyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAogQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYmRyaXZlcnNfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBsaWJkcml2ZXJzX2EtZXBpYzEwMC5vYmogYGlmIHRlc3QgLWYgJ2VwaWMxMDAuYyc7IHRoZW4gJChDWUdQQVRIX1cpICdlcGljMTAwLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2VwaWMxMDAuYyc7IGZpYAogCi1saWJkcml2ZXJzX2EtZmEzMTEubzogZmEzMTEuYwotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJaWYgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliZHJpdmVyc19hX0NGTEFHUykgJChDRkxBR1MpIC1NVCBsaWJkcml2ZXJzX2EtZmEzMTEubyAtTUQgLU1QIC1NRiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS1mYTMxMS5UcG8iIC1jIC1vIGxpYmRyaXZlcnNfYS1mYTMxMS5vIGB0ZXN0IC1mICdmYTMxMS5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BmYTMxMS5jOyBcCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAl0aGVuIG12IC1mICIkKERFUERJUikvbGliZHJpdmVyc19hLWZhMzExLlRwbyIgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtZmEzMTEuUG8iOyBlbHNlIHJtIC1mICIkKERFUERJUikvbGliZHJpdmVyc19hLWZhMzExLlRwbyI7IGV4aXQgMTsgZmkKLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J2ZhMzExLmMnIG9iamVjdD0nbGliZHJpdmVyc19hLWZhMzExLm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAotQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYmRyaXZlcnNfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBsaWJkcml2ZXJzX2EtZmEzMTEubyBgdGVzdCAtZiAnZmEzMTEuYycgfHwgZWNobyAnJChzcmNkaXIpLydgZmEzMTEuYwotCi1saWJkcml2ZXJzX2EtZmEzMTEub2JqOiBmYTMxMS5jCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAlpZiAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJkcml2ZXJzX2FfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGxpYmRyaXZlcnNfYS1mYTMxMS5vYmogLU1EIC1NUCAtTUYgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtZmEzMTEuVHBvIiAtYyAtbyBsaWJkcml2ZXJzX2EtZmEzMTEub2JqIGBpZiB0ZXN0IC1mICdmYTMxMS5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ2ZhMzExLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2ZhMzExLmMnOyBmaWA7IFwKLUBhbV9fZmFzdGRlcENDX1RSVUVACXRoZW4gbXYgLWYgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtZmEzMTEuVHBvIiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS1mYTMxMS5QbyI7IGVsc2Ugcm0gLWYgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtZmEzMTEuVHBvIjsgZXhpdCAxOyBmaQotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nZmEzMTEuYycgb2JqZWN0PSdsaWJkcml2ZXJzX2EtZmEzMTEub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKLUBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJkcml2ZXJzX2FfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gbGliZHJpdmVyc19hLWZhMzExLm9iaiBgaWYgdGVzdCAtZiAnZmEzMTEuYyc7IHRoZW4gJChDWUdQQVRIX1cpICdmYTMxMS5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9mYTMxMS5jJzsgZmlgCi0KLWxpYmRyaXZlcnNfYS1pODI1ODYubzogaTgyNTg2LmMKLUBhbV9fZmFzdGRlcENDX1RSVUVACWlmICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYmRyaXZlcnNfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgbGliZHJpdmVyc19hLWk4MjU4Ni5vIC1NRCAtTVAgLU1GICIkKERFUERJUikvbGliZHJpdmVyc19hLWk4MjU4Ni5UcG8iIC1jIC1vIGxpYmRyaXZlcnNfYS1pODI1ODYubyBgdGVzdCAtZiAnaTgyNTg2LmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGk4MjU4Ni5jOyBcCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAl0aGVuIG12IC1mICIkKERFUERJUikvbGliZHJpdmVyc19hLWk4MjU4Ni5UcG8iICIkKERFUERJUikvbGliZHJpdmVyc19hLWk4MjU4Ni5QbyI7IGVsc2Ugcm0gLWYgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtaTgyNTg2LlRwbyI7IGV4aXQgMTsgZmkKLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J2k4MjU4Ni5jJyBvYmplY3Q9J2xpYmRyaXZlcnNfYS1pODI1ODYubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACi1AYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliZHJpdmVyc19hX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGxpYmRyaXZlcnNfYS1pODI1ODYubyBgdGVzdCAtZiAnaTgyNTg2LmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGk4MjU4Ni5jCi0KLWxpYmRyaXZlcnNfYS1pODI1ODYub2JqOiBpODI1ODYuYwotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJaWYgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliZHJpdmVyc19hX0NGTEFHUykgJChDRkxBR1MpIC1NVCBsaWJkcml2ZXJzX2EtaTgyNTg2Lm9iaiAtTUQgLU1QIC1NRiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS1pODI1ODYuVHBvIiAtYyAtbyBsaWJkcml2ZXJzX2EtaTgyNTg2Lm9iaiBgaWYgdGVzdCAtZiAnaTgyNTg2LmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnaTgyNTg2LmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2k4MjU4Ni5jJzsgZmlgOyBcCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAl0aGVuIG12IC1mICIkKERFUERJUikvbGliZHJpdmVyc19hLWk4MjU4Ni5UcG8iICIkKERFUERJUikvbGliZHJpdmVyc19hLWk4MjU4Ni5QbyI7IGVsc2Ugcm0gLWYgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtaTgyNTg2LlRwbyI7IGV4aXQgMTsgZmkKLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J2k4MjU4Ni5jJyBvYmplY3Q9J2xpYmRyaXZlcnNfYS1pODI1ODYub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKLUBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJkcml2ZXJzX2FfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gbGliZHJpdmVyc19hLWk4MjU4Ni5vYmogYGlmIHRlc3QgLWYgJ2k4MjU4Ni5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ2k4MjU4Ni5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9pODI1ODYuYyc7IGZpYAotCi1saWJkcml2ZXJzX2EtbGFuY2UubzogbGFuY2UuYwotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJaWYgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliZHJpdmVyc19hX0NGTEFHUykgJChDRkxBR1MpIC1NVCBsaWJkcml2ZXJzX2EtbGFuY2UubyAtTUQgLU1QIC1NRiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS1sYW5jZS5UcG8iIC1jIC1vIGxpYmRyaXZlcnNfYS1sYW5jZS5vIGB0ZXN0IC1mICdsYW5jZS5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BsYW5jZS5jOyBcCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAl0aGVuIG12IC1mICIkKERFUERJUikvbGliZHJpdmVyc19hLWxhbmNlLlRwbyIgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtbGFuY2UuUG8iOyBlbHNlIHJtIC1mICIkKERFUERJUikvbGliZHJpdmVyc19hLWxhbmNlLlRwbyI7IGV4aXQgMTsgZmkKLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J2xhbmNlLmMnIG9iamVjdD0nbGliZHJpdmVyc19hLWxhbmNlLm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAotQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYmRyaXZlcnNfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBsaWJkcml2ZXJzX2EtbGFuY2UubyBgdGVzdCAtZiAnbGFuY2UuYycgfHwgZWNobyAnJChzcmNkaXIpLydgbGFuY2UuYwotCi1saWJkcml2ZXJzX2EtbGFuY2Uub2JqOiBsYW5jZS5jCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAlpZiAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJkcml2ZXJzX2FfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGxpYmRyaXZlcnNfYS1sYW5jZS5vYmogLU1EIC1NUCAtTUYgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtbGFuY2UuVHBvIiAtYyAtbyBsaWJkcml2ZXJzX2EtbGFuY2Uub2JqIGBpZiB0ZXN0IC1mICdsYW5jZS5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ2xhbmNlLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2xhbmNlLmMnOyBmaWA7IFwKLUBhbV9fZmFzdGRlcENDX1RSVUVACXRoZW4gbXYgLWYgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtbGFuY2UuVHBvIiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS1sYW5jZS5QbyI7IGVsc2Ugcm0gLWYgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtbGFuY2UuVHBvIjsgZXhpdCAxOyBmaQotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nbGFuY2UuYycgb2JqZWN0PSdsaWJkcml2ZXJzX2EtbGFuY2Uub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKLUBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJkcml2ZXJzX2FfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gbGliZHJpdmVyc19hLWxhbmNlLm9iaiBgaWYgdGVzdCAtZiAnbGFuY2UuYyc7IHRoZW4gJChDWUdQQVRIX1cpICdsYW5jZS5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9sYW5jZS5jJzsgZmlgCi0KIGxpYmRyaXZlcnNfYS1uYXRzZW1pLm86IG5hdHNlbWkuYwogQGFtX19mYXN0ZGVwQ0NfVFJVRUAJaWYgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliZHJpdmVyc19hX0NGTEFHUykgJChDRkxBR1MpIC1NVCBsaWJkcml2ZXJzX2EtbmF0c2VtaS5vIC1NRCAtTVAgLU1GICIkKERFUERJUikvbGliZHJpdmVyc19hLW5hdHNlbWkuVHBvIiAtYyAtbyBsaWJkcml2ZXJzX2EtbmF0c2VtaS5vIGB0ZXN0IC1mICduYXRzZW1pLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYG5hdHNlbWkuYzsgXAogQGFtX19mYXN0ZGVwQ0NfVFJVRUAJdGhlbiBtdiAtZiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS1uYXRzZW1pLlRwbyIgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtbmF0c2VtaS5QbyI7IGVsc2Ugcm0gLWYgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtbmF0c2VtaS5UcG8iOyBleGl0IDE7IGZpCiBAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSduYXRzZW1pLmMnIG9iamVjdD0nbGliZHJpdmVyc19hLW5hdHNlbWkubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJZGVwZmlsZT0nJChERVBESVIpL2xpYmRyaXZlcnNfYS1uYXRzZW1pLlBvJyB0bXBkZXBmaWxlPSckKERFUERJUikvbGliZHJpdmVyc19hLW5hdHNlbWkuVFBvJyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAogQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYmRyaXZlcnNfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBsaWJkcml2ZXJzX2EtbmF0c2VtaS5vIGB0ZXN0IC1mICduYXRzZW1pLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYG5hdHNlbWkuYwogCiBsaWJkcml2ZXJzX2EtbmF0c2VtaS5vYmo6IG5hdHNlbWkuYwogQGFtX19mYXN0ZGVwQ0NfVFJVRUAJaWYgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliZHJpdmVyc19hX0NGTEFHUykgJChDRkxBR1MpIC1NVCBsaWJkcml2ZXJzX2EtbmF0c2VtaS5vYmogLU1EIC1NUCAtTUYgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtbmF0c2VtaS5UcG8iIC1jIC1vIGxpYmRyaXZlcnNfYS1uYXRzZW1pLm9iaiBgaWYgdGVzdCAtZiAnbmF0c2VtaS5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ25hdHNlbWkuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvbmF0c2VtaS5jJzsgZmlgOyBcCiBAYW1fX2Zhc3RkZXBDQ19UUlVFQAl0aGVuIG12IC1mICIkKERFUERJUikvbGliZHJpdmVyc19hLW5hdHNlbWkuVHBvIiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS1uYXRzZW1pLlBvIjsgZWxzZSBybSAtZiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS1uYXRzZW1pLlRwbyI7IGV4aXQgMTsgZmkKIEBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J25hdHNlbWkuYycgb2JqZWN0PSdsaWJkcml2ZXJzX2EtbmF0c2VtaS5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACWRlcGZpbGU9JyQoREVQRElSKS9saWJkcml2ZXJzX2EtbmF0c2VtaS5QbycgdG1wZGVwZmlsZT0nJChERVBESVIpL2xpYmRyaXZlcnNfYS1uYXRzZW1pLlRQbycgQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKIEBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJkcml2ZXJzX2FfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gbGliZHJpdmVyc19hLW5hdHNlbWkub2JqIGBpZiB0ZXN0IC1mICduYXRzZW1pLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnbmF0c2VtaS5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9uYXRzZW1pLmMnOyBmaWAKIAotbGliZHJpdmVyc19hLW5pNTAxMC5vOiBuaTUwMTAuYwotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJaWYgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliZHJpdmVyc19hX0NGTEFHUykgJChDRkxBR1MpIC1NVCBsaWJkcml2ZXJzX2Etbmk1MDEwLm8gLU1EIC1NUCAtTUYgIiQoREVQRElSKS9saWJkcml2ZXJzX2Etbmk1MDEwLlRwbyIgLWMgLW8gbGliZHJpdmVyc19hLW5pNTAxMC5vIGB0ZXN0IC1mICduaTUwMTAuYycgfHwgZWNobyAnJChzcmNkaXIpLydgbmk1MDEwLmM7IFwKLUBhbV9fZmFzdGRlcENDX1RSVUVACXRoZW4gbXYgLWYgIiQoREVQRElSKS9saWJkcml2ZXJzX2Etbmk1MDEwLlRwbyIgIiQoREVQRElSKS9saWJkcml2ZXJzX2Etbmk1MDEwLlBvIjsgZWxzZSBybSAtZiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS1uaTUwMTAuVHBvIjsgZXhpdCAxOyBmaQotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nbmk1MDEwLmMnIG9iamVjdD0nbGliZHJpdmVyc19hLW5pNTAxMC5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKLUBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJkcml2ZXJzX2FfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gbGliZHJpdmVyc19hLW5pNTAxMC5vIGB0ZXN0IC1mICduaTUwMTAuYycgfHwgZWNobyAnJChzcmNkaXIpLydgbmk1MDEwLmMKLQotbGliZHJpdmVyc19hLW5pNTAxMC5vYmo6IG5pNTAxMC5jCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAlpZiAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJkcml2ZXJzX2FfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGxpYmRyaXZlcnNfYS1uaTUwMTAub2JqIC1NRCAtTVAgLU1GICIkKERFUERJUikvbGliZHJpdmVyc19hLW5pNTAxMC5UcG8iIC1jIC1vIGxpYmRyaXZlcnNfYS1uaTUwMTAub2JqIGBpZiB0ZXN0IC1mICduaTUwMTAuYyc7IHRoZW4gJChDWUdQQVRIX1cpICduaTUwMTAuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2Rpcikvbmk1MDEwLmMnOyBmaWA7IFwKLUBhbV9fZmFzdGRlcENDX1RSVUVACXRoZW4gbXYgLWYgIiQoREVQRElSKS9saWJkcml2ZXJzX2Etbmk1MDEwLlRwbyIgIiQoREVQRElSKS9saWJkcml2ZXJzX2Etbmk1MDEwLlBvIjsgZWxzZSBybSAtZiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS1uaTUwMTAuVHBvIjsgZXhpdCAxOyBmaQotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nbmk1MDEwLmMnIG9iamVjdD0nbGliZHJpdmVyc19hLW5pNTAxMC5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAotQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYmRyaXZlcnNfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBsaWJkcml2ZXJzX2Etbmk1MDEwLm9iaiBgaWYgdGVzdCAtZiAnbmk1MDEwLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnbmk1MDEwLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL25pNTAxMC5jJzsgZmlgCi0KIGxpYmRyaXZlcnNfYS1uczgzOTAubzogbnM4MzkwLmMKIEBhbV9fZmFzdGRlcENDX1RSVUVACWlmICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYmRyaXZlcnNfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgbGliZHJpdmVyc19hLW5zODM5MC5vIC1NRCAtTVAgLU1GICIkKERFUERJUikvbGliZHJpdmVyc19hLW5zODM5MC5UcG8iIC1jIC1vIGxpYmRyaXZlcnNfYS1uczgzOTAubyBgdGVzdCAtZiAnbnM4MzkwLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYG5zODM5MC5jOyBcCiBAYW1fX2Zhc3RkZXBDQ19UUlVFQAl0aGVuIG12IC1mICIkKERFUERJUikvbGliZHJpdmVyc19hLW5zODM5MC5UcG8iICIkKERFUERJUikvbGliZHJpdmVyc19hLW5zODM5MC5QbyI7IGVsc2Ugcm0gLWYgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtbnM4MzkwLlRwbyI7IGV4aXQgMTsgZmkKIEBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J25zODM5MC5jJyBvYmplY3Q9J2xpYmRyaXZlcnNfYS1uczgzOTAubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJZGVwZmlsZT0nJChERVBESVIpL2xpYmRyaXZlcnNfYS1uczgzOTAuUG8nIHRtcGRlcGZpbGU9JyQoREVQRElSKS9saWJkcml2ZXJzX2EtbnM4MzkwLlRQbycgQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKIEBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJkcml2ZXJzX2FfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gbGliZHJpdmVyc19hLW5zODM5MC5vIGB0ZXN0IC1mICduczgzOTAuYycgfHwgZWNobyAnJChzcmNkaXIpLydgbnM4MzkwLmMKIAogbGliZHJpdmVyc19hLW5zODM5MC5vYmo6IG5zODM5MC5jCiBAYW1fX2Zhc3RkZXBDQ19UUlVFQAlpZiAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJkcml2ZXJzX2FfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGxpYmRyaXZlcnNfYS1uczgzOTAub2JqIC1NRCAtTVAgLU1GICIkKERFUERJUikvbGliZHJpdmVyc19hLW5zODM5MC5UcG8iIC1jIC1vIGxpYmRyaXZlcnNfYS1uczgzOTAub2JqIGBpZiB0ZXN0IC1mICduczgzOTAuYyc7IHRoZW4gJChDWUdQQVRIX1cpICduczgzOTAuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvbnM4MzkwLmMnOyBmaWA7IFwKIEBhbV9fZmFzdGRlcENDX1RSVUVACXRoZW4gbXYgLWYgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtbnM4MzkwLlRwbyIgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtbnM4MzkwLlBvIjsgZWxzZSBybSAtZiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS1uczgzOTAuVHBvIjsgZXhpdCAxOyBmaQogQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nbnM4MzkwLmMnIG9iamVjdD0nbGliZHJpdmVyc19hLW5zODM5MC5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACWRlcGZpbGU9JyQoREVQRElSKS9saWJkcml2ZXJzX2EtbnM4MzkwLlBvJyB0bXBkZXBmaWxlPSckKERFUERJUikvbGliZHJpdmVyc19hLW5zODM5MC5UUG8nIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACiBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliZHJpdmVyc19hX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGxpYmRyaXZlcnNfYS1uczgzOTAub2JqIGBpZiB0ZXN0IC1mICduczgzOTAuYyc7IHRoZW4gJChDWUdQQVRIX1cpICduczgzOTAuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvbnM4MzkwLmMnOyBmaWAKIAotbGliZHJpdmVyc19hLW90dWxpcC5vOiBvdHVsaXAuYwotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJaWYgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliZHJpdmVyc19hX0NGTEFHUykgJChDRkxBR1MpIC1NVCBsaWJkcml2ZXJzX2Etb3R1bGlwLm8gLU1EIC1NUCAtTUYgIiQoREVQRElSKS9saWJkcml2ZXJzX2Etb3R1bGlwLlRwbyIgLWMgLW8gbGliZHJpdmVyc19hLW90dWxpcC5vIGB0ZXN0IC1mICdvdHVsaXAuYycgfHwgZWNobyAnJChzcmNkaXIpLydgb3R1bGlwLmM7IFwKLUBhbV9fZmFzdGRlcENDX1RSVUVACXRoZW4gbXYgLWYgIiQoREVQRElSKS9saWJkcml2ZXJzX2Etb3R1bGlwLlRwbyIgIiQoREVQRElSKS9saWJkcml2ZXJzX2Etb3R1bGlwLlBvIjsgZWxzZSBybSAtZiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS1vdHVsaXAuVHBvIjsgZXhpdCAxOyBmaQotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nb3R1bGlwLmMnIG9iamVjdD0nbGliZHJpdmVyc19hLW90dWxpcC5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKLUBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJkcml2ZXJzX2FfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gbGliZHJpdmVyc19hLW90dWxpcC5vIGB0ZXN0IC1mICdvdHVsaXAuYycgfHwgZWNobyAnJChzcmNkaXIpLydgb3R1bGlwLmMKLQotbGliZHJpdmVyc19hLW90dWxpcC5vYmo6IG90dWxpcC5jCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAlpZiAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJkcml2ZXJzX2FfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGxpYmRyaXZlcnNfYS1vdHVsaXAub2JqIC1NRCAtTVAgLU1GICIkKERFUERJUikvbGliZHJpdmVyc19hLW90dWxpcC5UcG8iIC1jIC1vIGxpYmRyaXZlcnNfYS1vdHVsaXAub2JqIGBpZiB0ZXN0IC1mICdvdHVsaXAuYyc7IHRoZW4gJChDWUdQQVRIX1cpICdvdHVsaXAuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2Rpcikvb3R1bGlwLmMnOyBmaWA7IFwKLUBhbV9fZmFzdGRlcENDX1RSVUVACXRoZW4gbXYgLWYgIiQoREVQRElSKS9saWJkcml2ZXJzX2Etb3R1bGlwLlRwbyIgIiQoREVQRElSKS9saWJkcml2ZXJzX2Etb3R1bGlwLlBvIjsgZWxzZSBybSAtZiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS1vdHVsaXAuVHBvIjsgZXhpdCAxOyBmaQotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nb3R1bGlwLmMnIG9iamVjdD0nbGliZHJpdmVyc19hLW90dWxpcC5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAotQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYmRyaXZlcnNfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBsaWJkcml2ZXJzX2Etb3R1bGlwLm9iaiBgaWYgdGVzdCAtZiAnb3R1bGlwLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnb3R1bGlwLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL290dWxpcC5jJzsgZmlgCitsaWJkcml2ZXJzX2EtcGNuZXQzMi5vOiBwY25ldDMyLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACWlmICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYmRyaXZlcnNfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgbGliZHJpdmVyc19hLXBjbmV0MzIubyAtTUQgLU1QIC1NRiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS1wY25ldDMyLlRwbyIgLWMgLW8gbGliZHJpdmVyc19hLXBjbmV0MzIubyBgdGVzdCAtZiAncGNuZXQzMi5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BwY25ldDMyLmM7IFwKK0BhbV9fZmFzdGRlcENDX1RSVUVACXRoZW4gbXYgLWYgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtcGNuZXQzMi5UcG8iICIkKERFUERJUikvbGliZHJpdmVyc19hLXBjbmV0MzIuUG8iOyBlbHNlIHJtIC1mICIkKERFUERJUikvbGliZHJpdmVyc19hLXBjbmV0MzIuVHBvIjsgZXhpdCAxOyBmaQorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0ncGNuZXQzMi5jJyBvYmplY3Q9J2xpYmRyaXZlcnNfYS1wY25ldDMyLm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACWRlcGZpbGU9JyQoREVQRElSKS9saWJkcml2ZXJzX2EtcGNuZXQzMi5QbycgdG1wZGVwZmlsZT0nJChERVBESVIpL2xpYmRyaXZlcnNfYS1wY25ldDMyLlRQbycgQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJkcml2ZXJzX2FfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gbGliZHJpdmVyc19hLXBjbmV0MzIubyBgdGVzdCAtZiAncGNuZXQzMi5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BwY25ldDMyLmMKKworbGliZHJpdmVyc19hLXBjbmV0MzIub2JqOiBwY25ldDMyLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACWlmICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYmRyaXZlcnNfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgbGliZHJpdmVyc19hLXBjbmV0MzIub2JqIC1NRCAtTVAgLU1GICIkKERFUERJUikvbGliZHJpdmVyc19hLXBjbmV0MzIuVHBvIiAtYyAtbyBsaWJkcml2ZXJzX2EtcGNuZXQzMi5vYmogYGlmIHRlc3QgLWYgJ3BjbmV0MzIuYyc7IHRoZW4gJChDWUdQQVRIX1cpICdwY25ldDMyLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL3BjbmV0MzIuYyc7IGZpYDsgXAorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJdGhlbiBtdiAtZiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS1wY25ldDMyLlRwbyIgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtcGNuZXQzMi5QbyI7IGVsc2Ugcm0gLWYgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtcGNuZXQzMi5UcG8iOyBleGl0IDE7IGZpCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdwY25ldDMyLmMnIG9iamVjdD0nbGliZHJpdmVyc19hLXBjbmV0MzIub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlkZXBmaWxlPSckKERFUERJUikvbGliZHJpdmVyc19hLXBjbmV0MzIuUG8nIHRtcGRlcGZpbGU9JyQoREVQRElSKS9saWJkcml2ZXJzX2EtcGNuZXQzMi5UUG8nIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliZHJpdmVyc19hX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGxpYmRyaXZlcnNfYS1wY25ldDMyLm9iaiBgaWYgdGVzdCAtZiAncGNuZXQzMi5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ3BjbmV0MzIuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvcGNuZXQzMi5jJzsgZmlgCiAKIGxpYmRyaXZlcnNfYS1ydGw4MTM5Lm86IHJ0bDgxMzkuYwogQGFtX19mYXN0ZGVwQ0NfVFJVRUAJaWYgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliZHJpdmVyc19hX0NGTEFHUykgJChDRkxBR1MpIC1NVCBsaWJkcml2ZXJzX2EtcnRsODEzOS5vIC1NRCAtTVAgLU1GICIkKERFUERJUikvbGliZHJpdmVyc19hLXJ0bDgxMzkuVHBvIiAtYyAtbyBsaWJkcml2ZXJzX2EtcnRsODEzOS5vIGB0ZXN0IC1mICdydGw4MTM5LmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYHJ0bDgxMzkuYzsgXAogQGFtX19mYXN0ZGVwQ0NfVFJVRUAJdGhlbiBtdiAtZiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS1ydGw4MTM5LlRwbyIgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtcnRsODEzOS5QbyI7IGVsc2Ugcm0gLWYgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtcnRsODEzOS5UcG8iOyBleGl0IDE7IGZpCiBAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdydGw4MTM5LmMnIG9iamVjdD0nbGliZHJpdmVyc19hLXJ0bDgxMzkubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJZGVwZmlsZT0nJChERVBESVIpL2xpYmRyaXZlcnNfYS1ydGw4MTM5LlBvJyB0bXBkZXBmaWxlPSckKERFUERJUikvbGliZHJpdmVyc19hLXJ0bDgxMzkuVFBvJyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAogQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYmRyaXZlcnNfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBsaWJkcml2ZXJzX2EtcnRsODEzOS5vIGB0ZXN0IC1mICdydGw4MTM5LmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYHJ0bDgxMzkuYwogCiBsaWJkcml2ZXJzX2EtcnRsODEzOS5vYmo6IHJ0bDgxMzkuYwogQGFtX19mYXN0ZGVwQ0NfVFJVRUAJaWYgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliZHJpdmVyc19hX0NGTEFHUykgJChDRkxBR1MpIC1NVCBsaWJkcml2ZXJzX2EtcnRsODEzOS5vYmogLU1EIC1NUCAtTUYgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtcnRsODEzOS5UcG8iIC1jIC1vIGxpYmRyaXZlcnNfYS1ydGw4MTM5Lm9iaiBgaWYgdGVzdCAtZiAncnRsODEzOS5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ3J0bDgxMzkuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvcnRsODEzOS5jJzsgZmlgOyBcCiBAYW1fX2Zhc3RkZXBDQ19UUlVFQAl0aGVuIG12IC1mICIkKERFUERJUikvbGliZHJpdmVyc19hLXJ0bDgxMzkuVHBvIiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS1ydGw4MTM5LlBvIjsgZWxzZSBybSAtZiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS1ydGw4MTM5LlRwbyI7IGV4aXQgMTsgZmkKIEBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J3J0bDgxMzkuYycgb2JqZWN0PSdsaWJkcml2ZXJzX2EtcnRsODEzOS5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACWRlcGZpbGU9JyQoREVQRElSKS9saWJkcml2ZXJzX2EtcnRsODEzOS5QbycgdG1wZGVwZmlsZT0nJChERVBESVIpL2xpYmRyaXZlcnNfYS1ydGw4MTM5LlRQbycgQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKIEBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJkcml2ZXJzX2FfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gbGliZHJpdmVyc19hLXJ0bDgxMzkub2JqIGBpZiB0ZXN0IC1mICdydGw4MTM5LmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAncnRsODEzOS5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9ydGw4MTM5LmMnOyBmaWAKIAogbGliZHJpdmVyc19hLXNpczkwMC5vOiBzaXM5MDAuYwogQGFtX19mYXN0ZGVwQ0NfVFJVRUAJaWYgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliZHJpdmVyc19hX0NGTEFHUykgJChDRkxBR1MpIC1NVCBsaWJkcml2ZXJzX2Etc2lzOTAwLm8gLU1EIC1NUCAtTUYgIiQoREVQRElSKS9saWJkcml2ZXJzX2Etc2lzOTAwLlRwbyIgLWMgLW8gbGliZHJpdmVyc19hLXNpczkwMC5vIGB0ZXN0IC1mICdzaXM5MDAuYycgfHwgZWNobyAnJChzcmNkaXIpLydgc2lzOTAwLmM7IFwKIEBhbV9fZmFzdGRlcENDX1RSVUVACXRoZW4gbXYgLWYgIiQoREVQRElSKS9saWJkcml2ZXJzX2Etc2lzOTAwLlRwbyIgIiQoREVQRElSKS9saWJkcml2ZXJzX2Etc2lzOTAwLlBvIjsgZWxzZSBybSAtZiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS1zaXM5MDAuVHBvIjsgZXhpdCAxOyBmaQogQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nc2lzOTAwLmMnIG9iamVjdD0nbGliZHJpdmVyc19hLXNpczkwMC5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlkZXBmaWxlPSckKERFUERJUikvbGliZHJpdmVyc19hLXNpczkwMC5QbycgdG1wZGVwZmlsZT0nJChERVBESVIpL2xpYmRyaXZlcnNfYS1zaXM5MDAuVFBvJyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAogQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYmRyaXZlcnNfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBsaWJkcml2ZXJzX2Etc2lzOTAwLm8gYHRlc3QgLWYgJ3NpczkwMC5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BzaXM5MDAuYwogCiBsaWJkcml2ZXJzX2Etc2lzOTAwLm9iajogc2lzOTAwLmMKIEBhbV9fZmFzdGRlcENDX1RSVUVACWlmICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYmRyaXZlcnNfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgbGliZHJpdmVyc19hLXNpczkwMC5vYmogLU1EIC1NUCAtTUYgIiQoREVQRElSKS9saWJkcml2ZXJzX2Etc2lzOTAwLlRwbyIgLWMgLW8gbGliZHJpdmVyc19hLXNpczkwMC5vYmogYGlmIHRlc3QgLWYgJ3NpczkwMC5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ3NpczkwMC5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9zaXM5MDAuYyc7IGZpYDsgXAogQGFtX19mYXN0ZGVwQ0NfVFJVRUAJdGhlbiBtdiAtZiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS1zaXM5MDAuVHBvIiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS1zaXM5MDAuUG8iOyBlbHNlIHJtIC1mICIkKERFUERJUikvbGliZHJpdmVyc19hLXNpczkwMC5UcG8iOyBleGl0IDE7IGZpCiBAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdzaXM5MDAuYycgb2JqZWN0PSdsaWJkcml2ZXJzX2Etc2lzOTAwLm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJZGVwZmlsZT0nJChERVBESVIpL2xpYmRyaXZlcnNfYS1zaXM5MDAuUG8nIHRtcGRlcGZpbGU9JyQoREVQRElSKS9saWJkcml2ZXJzX2Etc2lzOTAwLlRQbycgQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKIEBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJkcml2ZXJzX2FfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gbGliZHJpdmVyc19hLXNpczkwMC5vYmogYGlmIHRlc3QgLWYgJ3NpczkwMC5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ3NpczkwMC5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9zaXM5MDAuYyc7IGZpYAogCi1saWJkcml2ZXJzX2Etc2tfZzE2Lm86IHNrX2cxNi5jCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAlpZiAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJkcml2ZXJzX2FfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGxpYmRyaXZlcnNfYS1za19nMTYubyAtTUQgLU1QIC1NRiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS1za19nMTYuVHBvIiAtYyAtbyBsaWJkcml2ZXJzX2Etc2tfZzE2Lm8gYHRlc3QgLWYgJ3NrX2cxNi5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bza19nMTYuYzsgXAotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJdGhlbiBtdiAtZiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS1za19nMTYuVHBvIiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS1za19nMTYuUG8iOyBlbHNlIHJtIC1mICIkKERFUERJUikvbGliZHJpdmVyc19hLXNrX2cxNi5UcG8iOyBleGl0IDE7IGZpCi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdza19nMTYuYycgb2JqZWN0PSdsaWJkcml2ZXJzX2Etc2tfZzE2Lm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAotQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYmRyaXZlcnNfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBsaWJkcml2ZXJzX2Etc2tfZzE2Lm8gYHRlc3QgLWYgJ3NrX2cxNi5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bza19nMTYuYwotCi1saWJkcml2ZXJzX2Etc2tfZzE2Lm9iajogc2tfZzE2LmMKLUBhbV9fZmFzdGRlcENDX1RSVUVACWlmICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYmRyaXZlcnNfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgbGliZHJpdmVyc19hLXNrX2cxNi5vYmogLU1EIC1NUCAtTUYgIiQoREVQRElSKS9saWJkcml2ZXJzX2Etc2tfZzE2LlRwbyIgLWMgLW8gbGliZHJpdmVyc19hLXNrX2cxNi5vYmogYGlmIHRlc3QgLWYgJ3NrX2cxNi5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ3NrX2cxNi5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9za19nMTYuYyc7IGZpYDsgXAotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJdGhlbiBtdiAtZiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS1za19nMTYuVHBvIiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS1za19nMTYuUG8iOyBlbHNlIHJtIC1mICIkKERFUERJUikvbGliZHJpdmVyc19hLXNrX2cxNi5UcG8iOyBleGl0IDE7IGZpCi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdza19nMTYuYycgb2JqZWN0PSdsaWJkcml2ZXJzX2Etc2tfZzE2Lm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACi1AYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliZHJpdmVyc19hX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGxpYmRyaXZlcnNfYS1za19nMTYub2JqIGBpZiB0ZXN0IC1mICdza19nMTYuYyc7IHRoZW4gJChDWUdQQVRIX1cpICdza19nMTYuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2Rpcikvc2tfZzE2LmMnOyBmaWAKLQotbGliZHJpdmVyc19hLXNtYzkwMDAubzogc21jOTAwMC5jCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAlpZiAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJkcml2ZXJzX2FfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGxpYmRyaXZlcnNfYS1zbWM5MDAwLm8gLU1EIC1NUCAtTUYgIiQoREVQRElSKS9saWJkcml2ZXJzX2Etc21jOTAwMC5UcG8iIC1jIC1vIGxpYmRyaXZlcnNfYS1zbWM5MDAwLm8gYHRlc3QgLWYgJ3NtYzkwMDAuYycgfHwgZWNobyAnJChzcmNkaXIpLydgc21jOTAwMC5jOyBcCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAl0aGVuIG12IC1mICIkKERFUERJUikvbGliZHJpdmVyc19hLXNtYzkwMDAuVHBvIiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS1zbWM5MDAwLlBvIjsgZWxzZSBybSAtZiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS1zbWM5MDAwLlRwbyI7IGV4aXQgMTsgZmkKLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J3NtYzkwMDAuYycgb2JqZWN0PSdsaWJkcml2ZXJzX2Etc21jOTAwMC5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKLUBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJkcml2ZXJzX2FfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gbGliZHJpdmVyc19hLXNtYzkwMDAubyBgdGVzdCAtZiAnc21jOTAwMC5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BzbWM5MDAwLmMKLQotbGliZHJpdmVyc19hLXNtYzkwMDAub2JqOiBzbWM5MDAwLmMKLUBhbV9fZmFzdGRlcENDX1RSVUVACWlmICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYmRyaXZlcnNfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgbGliZHJpdmVyc19hLXNtYzkwMDAub2JqIC1NRCAtTVAgLU1GICIkKERFUERJUikvbGliZHJpdmVyc19hLXNtYzkwMDAuVHBvIiAtYyAtbyBsaWJkcml2ZXJzX2Etc21jOTAwMC5vYmogYGlmIHRlc3QgLWYgJ3NtYzkwMDAuYyc7IHRoZW4gJChDWUdQQVRIX1cpICdzbWM5MDAwLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL3NtYzkwMDAuYyc7IGZpYDsgXAotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJdGhlbiBtdiAtZiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS1zbWM5MDAwLlRwbyIgIiQoREVQRElSKS9saWJkcml2ZXJzX2Etc21jOTAwMC5QbyI7IGVsc2Ugcm0gLWYgIiQoREVQRElSKS9saWJkcml2ZXJzX2Etc21jOTAwMC5UcG8iOyBleGl0IDE7IGZpCi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdzbWM5MDAwLmMnIG9iamVjdD0nbGliZHJpdmVyc19hLXNtYzkwMDAub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKLUBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJkcml2ZXJzX2FfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gbGliZHJpdmVyc19hLXNtYzkwMDAub2JqIGBpZiB0ZXN0IC1mICdzbWM5MDAwLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnc21jOTAwMC5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9zbWM5MDAwLmMnOyBmaWAKLQotbGliZHJpdmVyc19hLXRpYXJhLm86IHRpYXJhLmMKLUBhbV9fZmFzdGRlcENDX1RSVUVACWlmICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYmRyaXZlcnNfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgbGliZHJpdmVyc19hLXRpYXJhLm8gLU1EIC1NUCAtTUYgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtdGlhcmEuVHBvIiAtYyAtbyBsaWJkcml2ZXJzX2EtdGlhcmEubyBgdGVzdCAtZiAndGlhcmEuYycgfHwgZWNobyAnJChzcmNkaXIpLydgdGlhcmEuYzsgXAotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJdGhlbiBtdiAtZiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS10aWFyYS5UcG8iICIkKERFUERJUikvbGliZHJpdmVyc19hLXRpYXJhLlBvIjsgZWxzZSBybSAtZiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS10aWFyYS5UcG8iOyBleGl0IDE7IGZpCi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSd0aWFyYS5jJyBvYmplY3Q9J2xpYmRyaXZlcnNfYS10aWFyYS5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKLUBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJkcml2ZXJzX2FfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gbGliZHJpdmVyc19hLXRpYXJhLm8gYHRlc3QgLWYgJ3RpYXJhLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYHRpYXJhLmMKLQotbGliZHJpdmVyc19hLXRpYXJhLm9iajogdGlhcmEuYwotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJaWYgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliZHJpdmVyc19hX0NGTEFHUykgJChDRkxBR1MpIC1NVCBsaWJkcml2ZXJzX2EtdGlhcmEub2JqIC1NRCAtTVAgLU1GICIkKERFUERJUikvbGliZHJpdmVyc19hLXRpYXJhLlRwbyIgLWMgLW8gbGliZHJpdmVyc19hLXRpYXJhLm9iaiBgaWYgdGVzdCAtZiAndGlhcmEuYyc7IHRoZW4gJChDWUdQQVRIX1cpICd0aWFyYS5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS90aWFyYS5jJzsgZmlgOyBcCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAl0aGVuIG12IC1mICIkKERFUERJUikvbGliZHJpdmVyc19hLXRpYXJhLlRwbyIgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtdGlhcmEuUG8iOyBlbHNlIHJtIC1mICIkKERFUERJUikvbGliZHJpdmVyc19hLXRpYXJhLlRwbyI7IGV4aXQgMTsgZmkKLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J3RpYXJhLmMnIG9iamVjdD0nbGliZHJpdmVyc19hLXRpYXJhLm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACi1AYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliZHJpdmVyc19hX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGxpYmRyaXZlcnNfYS10aWFyYS5vYmogYGlmIHRlc3QgLWYgJ3RpYXJhLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAndGlhcmEuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvdGlhcmEuYyc7IGZpYAorbGliZHJpdmVyc19hLXRnMy5vOiB0ZzMuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJaWYgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliZHJpdmVyc19hX0NGTEFHUykgJChDRkxBR1MpIC1NVCBsaWJkcml2ZXJzX2EtdGczLm8gLU1EIC1NUCAtTUYgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtdGczLlRwbyIgLWMgLW8gbGliZHJpdmVyc19hLXRnMy5vIGB0ZXN0IC1mICd0ZzMuYycgfHwgZWNobyAnJChzcmNkaXIpLydgdGczLmM7IFwKK0BhbV9fZmFzdGRlcENDX1RSVUVACXRoZW4gbXYgLWYgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtdGczLlRwbyIgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtdGczLlBvIjsgZWxzZSBybSAtZiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS10ZzMuVHBvIjsgZXhpdCAxOyBmaQorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0ndGczLmMnIG9iamVjdD0nbGliZHJpdmVyc19hLXRnMy5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlkZXBmaWxlPSckKERFUERJUikvbGliZHJpdmVyc19hLXRnMy5QbycgdG1wZGVwZmlsZT0nJChERVBESVIpL2xpYmRyaXZlcnNfYS10ZzMuVFBvJyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYmRyaXZlcnNfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBsaWJkcml2ZXJzX2EtdGczLm8gYHRlc3QgLWYgJ3RnMy5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2B0ZzMuYworCitsaWJkcml2ZXJzX2EtdGczLm9iajogdGczLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACWlmICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYmRyaXZlcnNfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgbGliZHJpdmVyc19hLXRnMy5vYmogLU1EIC1NUCAtTUYgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtdGczLlRwbyIgLWMgLW8gbGliZHJpdmVyc19hLXRnMy5vYmogYGlmIHRlc3QgLWYgJ3RnMy5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ3RnMy5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS90ZzMuYyc7IGZpYDsgXAorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJdGhlbiBtdiAtZiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS10ZzMuVHBvIiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS10ZzMuUG8iOyBlbHNlIHJtIC1mICIkKERFUERJUikvbGliZHJpdmVyc19hLXRnMy5UcG8iOyBleGl0IDE7IGZpCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSd0ZzMuYycgb2JqZWN0PSdsaWJkcml2ZXJzX2EtdGczLm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJZGVwZmlsZT0nJChERVBESVIpL2xpYmRyaXZlcnNfYS10ZzMuUG8nIHRtcGRlcGZpbGU9JyQoREVQRElSKS9saWJkcml2ZXJzX2EtdGczLlRQbycgQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJkcml2ZXJzX2FfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gbGliZHJpdmVyc19hLXRnMy5vYmogYGlmIHRlc3QgLWYgJ3RnMy5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ3RnMy5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS90ZzMuYyc7IGZpYAogCiBsaWJkcml2ZXJzX2EtdGxhbi5vOiB0bGFuLmMKIEBhbV9fZmFzdGRlcENDX1RSVUVACWlmICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYmRyaXZlcnNfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgbGliZHJpdmVyc19hLXRsYW4ubyAtTUQgLU1QIC1NRiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS10bGFuLlRwbyIgLWMgLW8gbGliZHJpdmVyc19hLXRsYW4ubyBgdGVzdCAtZiAndGxhbi5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2B0bGFuLmM7IFwKIEBhbV9fZmFzdGRlcENDX1RSVUVACXRoZW4gbXYgLWYgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtdGxhbi5UcG8iICIkKERFUERJUikvbGliZHJpdmVyc19hLXRsYW4uUG8iOyBlbHNlIHJtIC1mICIkKERFUERJUikvbGliZHJpdmVyc19hLXRsYW4uVHBvIjsgZXhpdCAxOyBmaQogQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0ndGxhbi5jJyBvYmplY3Q9J2xpYmRyaXZlcnNfYS10bGFuLm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACWRlcGZpbGU9JyQoREVQRElSKS9saWJkcml2ZXJzX2EtdGxhbi5QbycgdG1wZGVwZmlsZT0nJChERVBESVIpL2xpYmRyaXZlcnNfYS10bGFuLlRQbycgQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKIEBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJkcml2ZXJzX2FfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gbGliZHJpdmVyc19hLXRsYW4ubyBgdGVzdCAtZiAndGxhbi5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2B0bGFuLmMKIAogbGliZHJpdmVyc19hLXRsYW4ub2JqOiB0bGFuLmMKIEBhbV9fZmFzdGRlcENDX1RSVUVACWlmICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYmRyaXZlcnNfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgbGliZHJpdmVyc19hLXRsYW4ub2JqIC1NRCAtTVAgLU1GICIkKERFUERJUikvbGliZHJpdmVyc19hLXRsYW4uVHBvIiAtYyAtbyBsaWJkcml2ZXJzX2EtdGxhbi5vYmogYGlmIHRlc3QgLWYgJ3RsYW4uYyc7IHRoZW4gJChDWUdQQVRIX1cpICd0bGFuLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL3RsYW4uYyc7IGZpYDsgXAogQGFtX19mYXN0ZGVwQ0NfVFJVRUAJdGhlbiBtdiAtZiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS10bGFuLlRwbyIgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtdGxhbi5QbyI7IGVsc2Ugcm0gLWYgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtdGxhbi5UcG8iOyBleGl0IDE7IGZpCiBAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSd0bGFuLmMnIG9iamVjdD0nbGliZHJpdmVyc19hLXRsYW4ub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlkZXBmaWxlPSckKERFUERJUikvbGliZHJpdmVyc19hLXRsYW4uUG8nIHRtcGRlcGZpbGU9JyQoREVQRElSKS9saWJkcml2ZXJzX2EtdGxhbi5UUG8nIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACiBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliZHJpdmVyc19hX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGxpYmRyaXZlcnNfYS10bGFuLm9iaiBgaWYgdGVzdCAtZiAndGxhbi5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ3RsYW4uYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvdGxhbi5jJzsgZmlgCiAKIGxpYmRyaXZlcnNfYS10dWxpcC5vOiB0dWxpcC5jCiBAYW1fX2Zhc3RkZXBDQ19UUlVFQAlpZiAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJkcml2ZXJzX2FfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGxpYmRyaXZlcnNfYS10dWxpcC5vIC1NRCAtTVAgLU1GICIkKERFUERJUikvbGliZHJpdmVyc19hLXR1bGlwLlRwbyIgLWMgLW8gbGliZHJpdmVyc19hLXR1bGlwLm8gYHRlc3QgLWYgJ3R1bGlwLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYHR1bGlwLmM7IFwKIEBhbV9fZmFzdGRlcENDX1RSVUVACXRoZW4gbXYgLWYgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtdHVsaXAuVHBvIiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS10dWxpcC5QbyI7IGVsc2Ugcm0gLWYgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtdHVsaXAuVHBvIjsgZXhpdCAxOyBmaQogQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0ndHVsaXAuYycgb2JqZWN0PSdsaWJkcml2ZXJzX2EtdHVsaXAubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJZGVwZmlsZT0nJChERVBESVIpL2xpYmRyaXZlcnNfYS10dWxpcC5QbycgdG1wZGVwZmlsZT0nJChERVBESVIpL2xpYmRyaXZlcnNfYS10dWxpcC5UUG8nIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACiBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliZHJpdmVyc19hX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGxpYmRyaXZlcnNfYS10dWxpcC5vIGB0ZXN0IC1mICd0dWxpcC5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2B0dWxpcC5jCiAKIGxpYmRyaXZlcnNfYS10dWxpcC5vYmo6IHR1bGlwLmMKIEBhbV9fZmFzdGRlcENDX1RSVUVACWlmICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYmRyaXZlcnNfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgbGliZHJpdmVyc19hLXR1bGlwLm9iaiAtTUQgLU1QIC1NRiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS10dWxpcC5UcG8iIC1jIC1vIGxpYmRyaXZlcnNfYS10dWxpcC5vYmogYGlmIHRlc3QgLWYgJ3R1bGlwLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAndHVsaXAuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvdHVsaXAuYyc7IGZpYDsgXAogQGFtX19mYXN0ZGVwQ0NfVFJVRUAJdGhlbiBtdiAtZiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS10dWxpcC5UcG8iICIkKERFUERJUikvbGliZHJpdmVyc19hLXR1bGlwLlBvIjsgZWxzZSBybSAtZiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS10dWxpcC5UcG8iOyBleGl0IDE7IGZpCiBAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSd0dWxpcC5jJyBvYmplY3Q9J2xpYmRyaXZlcnNfYS10dWxpcC5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACWRlcGZpbGU9JyQoREVQRElSKS9saWJkcml2ZXJzX2EtdHVsaXAuUG8nIHRtcGRlcGZpbGU9JyQoREVQRElSKS9saWJkcml2ZXJzX2EtdHVsaXAuVFBvJyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAogQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYmRyaXZlcnNfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBsaWJkcml2ZXJzX2EtdHVsaXAub2JqIGBpZiB0ZXN0IC1mICd0dWxpcC5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ3R1bGlwLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL3R1bGlwLmMnOyBmaWAKIAogbGliZHJpdmVyc19hLXZpYS1yaGluZS5vOiB2aWEtcmhpbmUuYwogQGFtX19mYXN0ZGVwQ0NfVFJVRUAJaWYgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliZHJpdmVyc19hX0NGTEFHUykgJChDRkxBR1MpIC1NVCBsaWJkcml2ZXJzX2EtdmlhLXJoaW5lLm8gLU1EIC1NUCAtTUYgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtdmlhLXJoaW5lLlRwbyIgLWMgLW8gbGliZHJpdmVyc19hLXZpYS1yaGluZS5vIGB0ZXN0IC1mICd2aWEtcmhpbmUuYycgfHwgZWNobyAnJChzcmNkaXIpLydgdmlhLXJoaW5lLmM7IFwKIEBhbV9fZmFzdGRlcENDX1RSVUVACXRoZW4gbXYgLWYgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtdmlhLXJoaW5lLlRwbyIgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtdmlhLXJoaW5lLlBvIjsgZWxzZSBybSAtZiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS12aWEtcmhpbmUuVHBvIjsgZXhpdCAxOyBmaQogQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0ndmlhLXJoaW5lLmMnIG9iamVjdD0nbGliZHJpdmVyc19hLXZpYS1yaGluZS5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlkZXBmaWxlPSckKERFUERJUikvbGliZHJpdmVyc19hLXZpYS1yaGluZS5QbycgdG1wZGVwZmlsZT0nJChERVBESVIpL2xpYmRyaXZlcnNfYS12aWEtcmhpbmUuVFBvJyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAogQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYmRyaXZlcnNfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBsaWJkcml2ZXJzX2EtdmlhLXJoaW5lLm8gYHRlc3QgLWYgJ3ZpYS1yaGluZS5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2B2aWEtcmhpbmUuYwogCiBsaWJkcml2ZXJzX2EtdmlhLXJoaW5lLm9iajogdmlhLXJoaW5lLmMKIEBhbV9fZmFzdGRlcENDX1RSVUVACWlmICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYmRyaXZlcnNfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgbGliZHJpdmVyc19hLXZpYS1yaGluZS5vYmogLU1EIC1NUCAtTUYgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtdmlhLXJoaW5lLlRwbyIgLWMgLW8gbGliZHJpdmVyc19hLXZpYS1yaGluZS5vYmogYGlmIHRlc3QgLWYgJ3ZpYS1yaGluZS5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ3ZpYS1yaGluZS5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS92aWEtcmhpbmUuYyc7IGZpYDsgXAogQGFtX19mYXN0ZGVwQ0NfVFJVRUAJdGhlbiBtdiAtZiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS12aWEtcmhpbmUuVHBvIiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS12aWEtcmhpbmUuUG8iOyBlbHNlIHJtIC1mICIkKERFUERJUikvbGliZHJpdmVyc19hLXZpYS1yaGluZS5UcG8iOyBleGl0IDE7IGZpCiBAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSd2aWEtcmhpbmUuYycgb2JqZWN0PSdsaWJkcml2ZXJzX2EtdmlhLXJoaW5lLm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJZGVwZmlsZT0nJChERVBESVIpL2xpYmRyaXZlcnNfYS12aWEtcmhpbmUuUG8nIHRtcGRlcGZpbGU9JyQoREVQRElSKS9saWJkcml2ZXJzX2EtdmlhLXJoaW5lLlRQbycgQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKIEBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJkcml2ZXJzX2FfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gbGliZHJpdmVyc19hLXZpYS1yaGluZS5vYmogYGlmIHRlc3QgLWYgJ3ZpYS1yaGluZS5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ3ZpYS1yaGluZS5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS92aWEtcmhpbmUuYyc7IGZpYAogCiBsaWJkcml2ZXJzX2Etdzg5Yzg0MC5vOiB3ODljODQwLmMKIEBhbV9fZmFzdGRlcENDX1RSVUVACWlmICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYmRyaXZlcnNfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgbGliZHJpdmVyc19hLXc4OWM4NDAubyAtTUQgLU1QIC1NRiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS13ODljODQwLlRwbyIgLWMgLW8gbGliZHJpdmVyc19hLXc4OWM4NDAubyBgdGVzdCAtZiAndzg5Yzg0MC5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2B3ODljODQwLmM7IFwKIEBhbV9fZmFzdGRlcENDX1RSVUVACXRoZW4gbXYgLWYgIiQoREVQRElSKS9saWJkcml2ZXJzX2Etdzg5Yzg0MC5UcG8iICIkKERFUERJUikvbGliZHJpdmVyc19hLXc4OWM4NDAuUG8iOyBlbHNlIHJtIC1mICIkKERFUERJUikvbGliZHJpdmVyc19hLXc4OWM4NDAuVHBvIjsgZXhpdCAxOyBmaQogQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0ndzg5Yzg0MC5jJyBvYmplY3Q9J2xpYmRyaXZlcnNfYS13ODljODQwLm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACWRlcGZpbGU9JyQoREVQRElSKS9saWJkcml2ZXJzX2Etdzg5Yzg0MC5QbycgdG1wZGVwZmlsZT0nJChERVBESVIpL2xpYmRyaXZlcnNfYS13ODljODQwLlRQbycgQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKIEBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJkcml2ZXJzX2FfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gbGliZHJpdmVyc19hLXc4OWM4NDAubyBgdGVzdCAtZiAndzg5Yzg0MC5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2B3ODljODQwLmMKIAogbGliZHJpdmVyc19hLXc4OWM4NDAub2JqOiB3ODljODQwLmMKIEBhbV9fZmFzdGRlcENDX1RSVUVACWlmICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYmRyaXZlcnNfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgbGliZHJpdmVyc19hLXc4OWM4NDAub2JqIC1NRCAtTVAgLU1GICIkKERFUERJUikvbGliZHJpdmVyc19hLXc4OWM4NDAuVHBvIiAtYyAtbyBsaWJkcml2ZXJzX2Etdzg5Yzg0MC5vYmogYGlmIHRlc3QgLWYgJ3c4OWM4NDAuYyc7IHRoZW4gJChDWUdQQVRIX1cpICd3ODljODQwLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL3c4OWM4NDAuYyc7IGZpYDsgXAogQGFtX19mYXN0ZGVwQ0NfVFJVRUAJdGhlbiBtdiAtZiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS13ODljODQwLlRwbyIgIiQoREVQRElSKS9saWJkcml2ZXJzX2Etdzg5Yzg0MC5QbyI7IGVsc2Ugcm0gLWYgIiQoREVQRElSKS9saWJkcml2ZXJzX2Etdzg5Yzg0MC5UcG8iOyBleGl0IDE7IGZpCiBAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSd3ODljODQwLmMnIG9iamVjdD0nbGliZHJpdmVyc19hLXc4OWM4NDAub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlkZXBmaWxlPSckKERFUERJUikvbGliZHJpdmVyc19hLXc4OWM4NDAuUG8nIHRtcGRlcGZpbGU9JyQoREVQRElSKS9saWJkcml2ZXJzX2Etdzg5Yzg0MC5UUG8nIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACiBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliZHJpdmVyc19hX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGxpYmRyaXZlcnNfYS13ODljODQwLm9iaiBgaWYgdGVzdCAtZiAndzg5Yzg0MC5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ3c4OWM4NDAuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2Rpcikvdzg5Yzg0MC5jJzsgZmlgCi11bmluc3RhbGwtaW5mby1hbToKKworbGliZHJpdmVyc19hLXI4MTY5Lm86IHI4MTY5LmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACWlmICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYmRyaXZlcnNfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgbGliZHJpdmVyc19hLXI4MTY5Lm8gLU1EIC1NUCAtTUYgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtcjgxNjkuVHBvIiAtYyAtbyBsaWJkcml2ZXJzX2EtcjgxNjkubyBgdGVzdCAtZiAncjgxNjkuYycgfHwgZWNobyAnJChzcmNkaXIpLydgcjgxNjkuYzsgXAorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJdGhlbiBtdiAtZiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS1yODE2OS5UcG8iICIkKERFUERJUikvbGliZHJpdmVyc19hLXI4MTY5LlBvIjsgZWxzZSBybSAtZiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS1yODE2OS5UcG8iOyBleGl0IDE7IGZpCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdyODE2OS5jJyBvYmplY3Q9J2xpYmRyaXZlcnNfYS1yODE2OS5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlkZXBmaWxlPSckKERFUERJUikvbGliZHJpdmVyc19hLXI4MTY5LlBvJyB0bXBkZXBmaWxlPSckKERFUERJUikvbGliZHJpdmVyc19hLXI4MTY5LlRQbycgQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJkcml2ZXJzX2FfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gbGliZHJpdmVyc19hLXI4MTY5Lm8gYHRlc3QgLWYgJ3I4MTY5LmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYHI4MTY5LmMKKworbGliZHJpdmVyc19hLXI4MTY5Lm9iajogcjgxNjkuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJaWYgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliZHJpdmVyc19hX0NGTEFHUykgJChDRkxBR1MpIC1NVCBsaWJkcml2ZXJzX2EtcjgxNjkub2JqIC1NRCAtTVAgLU1GICIkKERFUERJUikvbGliZHJpdmVyc19hLXI4MTY5LlRwbyIgLWMgLW8gbGliZHJpdmVyc19hLXI4MTY5Lm9iaiBgaWYgdGVzdCAtZiAncjgxNjkuYyc7IHRoZW4gJChDWUdQQVRIX1cpICdyODE2OS5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9yODE2OS5jJzsgZmlgOyBcCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAl0aGVuIG12IC1mICIkKERFUERJUikvbGliZHJpdmVyc19hLXI4MTY5LlRwbyIgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtcjgxNjkuUG8iOyBlbHNlIHJtIC1mICIkKERFUERJUikvbGliZHJpdmVyc19hLXI4MTY5LlRwbyI7IGV4aXQgMTsgZmkKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J3I4MTY5LmMnIG9iamVjdD0nbGliZHJpdmVyc19hLXI4MTY5Lm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJZGVwZmlsZT0nJChERVBESVIpL2xpYmRyaXZlcnNfYS1yODE2OS5QbycgdG1wZGVwZmlsZT0nJChERVBESVIpL2xpYmRyaXZlcnNfYS1yODE2OS5UUG8nIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliZHJpdmVyc19hX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGxpYmRyaXZlcnNfYS1yODE2OS5vYmogYGlmIHRlc3QgLWYgJ3I4MTY5LmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAncjgxNjkuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvcjgxNjkuYyc7IGZpYAorCitsaWJkcml2ZXJzX2EtZm9yY2VkZXRoLm86IGZvcmNlZGV0aC5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAlpZiAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJkcml2ZXJzX2FfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGxpYmRyaXZlcnNfYS1mb3JjZWRldGgubyAtTUQgLU1QIC1NRiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS1mb3JjZWRldGguVHBvIiAtYyAtbyBsaWJkcml2ZXJzX2EtZm9yY2VkZXRoLm8gYHRlc3QgLWYgJ2ZvcmNlZGV0aC5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bmb3JjZWRldGguYzsgXAorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJdGhlbiBtdiAtZiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS1mb3JjZWRldGguVHBvIiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS1mb3JjZWRldGguUG8iOyBlbHNlIHJtIC1mICIkKERFUERJUikvbGliZHJpdmVyc19hLWZvcmNlZGV0aC5UcG8iOyBleGl0IDE7IGZpCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdmb3JjZWRldGguYycgb2JqZWN0PSdsaWJkcml2ZXJzX2EtZm9yY2VkZXRoLm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACWRlcGZpbGU9JyQoREVQRElSKS9saWJkcml2ZXJzX2EtZm9yY2VkZXRoLlBvJyB0bXBkZXBmaWxlPSckKERFUERJUikvbGliZHJpdmVyc19hLWZvcmNlZGV0aC5UUG8nIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliZHJpdmVyc19hX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGxpYmRyaXZlcnNfYS1mb3JjZWRldGgubyBgdGVzdCAtZiAnZm9yY2VkZXRoLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGZvcmNlZGV0aC5jCisKK2xpYmRyaXZlcnNfYS1mb3JjZWRldGgub2JqOiBmb3JjZWRldGguYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJaWYgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliZHJpdmVyc19hX0NGTEFHUykgJChDRkxBR1MpIC1NVCBsaWJkcml2ZXJzX2EtZm9yY2VkZXRoLm9iaiAtTUQgLU1QIC1NRiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS1mb3JjZWRldGguVHBvIiAtYyAtbyBsaWJkcml2ZXJzX2EtZm9yY2VkZXRoLm9iaiBgaWYgdGVzdCAtZiAnZm9yY2VkZXRoLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZm9yY2VkZXRoLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2ZvcmNlZGV0aC5jJzsgZmlgOyBcCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAl0aGVuIG12IC1mICIkKERFUERJUikvbGliZHJpdmVyc19hLWZvcmNlZGV0aC5UcG8iICIkKERFUERJUikvbGliZHJpdmVyc19hLWZvcmNlZGV0aC5QbyI7IGVsc2Ugcm0gLWYgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtZm9yY2VkZXRoLlRwbyI7IGV4aXQgMTsgZmkKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J2ZvcmNlZGV0aC5jJyBvYmplY3Q9J2xpYmRyaXZlcnNfYS1mb3JjZWRldGgub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlkZXBmaWxlPSckKERFUERJUikvbGliZHJpdmVyc19hLWZvcmNlZGV0aC5QbycgdG1wZGVwZmlsZT0nJChERVBESVIpL2xpYmRyaXZlcnNfYS1mb3JjZWRldGguVFBvJyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYmRyaXZlcnNfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBsaWJkcml2ZXJzX2EtZm9yY2VkZXRoLm9iaiBgaWYgdGVzdCAtZiAnZm9yY2VkZXRoLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZm9yY2VkZXRoLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2ZvcmNlZGV0aC5jJzsgZmlgCisKK2xpYmRyaXZlcnNfYS1uczgzODIwLm86IG5zODM4MjAuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJaWYgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliZHJpdmVyc19hX0NGTEFHUykgJChDRkxBR1MpIC1NVCBsaWJkcml2ZXJzX2EtbnM4MzgyMC5vIC1NRCAtTVAgLU1GICIkKERFUERJUikvbGliZHJpdmVyc19hLW5zODM4MjAuVHBvIiAtYyAtbyBsaWJkcml2ZXJzX2EtbnM4MzgyMC5vIGB0ZXN0IC1mICduczgzODIwLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYG5zODM4MjAuYzsgXAorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJdGhlbiBtdiAtZiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS1uczgzODIwLlRwbyIgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtbnM4MzgyMC5QbyI7IGVsc2Ugcm0gLWYgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtbnM4MzgyMC5UcG8iOyBleGl0IDE7IGZpCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSduczgzODIwLmMnIG9iamVjdD0nbGliZHJpdmVyc19hLW5zODM4MjAubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJZGVwZmlsZT0nJChERVBESVIpL2xpYmRyaXZlcnNfYS1uczgzODIwLlBvJyB0bXBkZXBmaWxlPSckKERFUERJUikvbGliZHJpdmVyc19hLW5zODM4MjAuVFBvJyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYmRyaXZlcnNfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBsaWJkcml2ZXJzX2EtbnM4MzgyMC5vIGB0ZXN0IC1mICduczgzODIwLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYG5zODM4MjAuYworCitsaWJkcml2ZXJzX2EtbnM4MzgyMC5vYmo6IG5zODM4MjAuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJaWYgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliZHJpdmVyc19hX0NGTEFHUykgJChDRkxBR1MpIC1NVCBsaWJkcml2ZXJzX2EtbnM4MzgyMC5vYmogLU1EIC1NUCAtTUYgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtbnM4MzgyMC5UcG8iIC1jIC1vIGxpYmRyaXZlcnNfYS1uczgzODIwLm9iaiBgaWYgdGVzdCAtZiAnbnM4MzgyMC5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ25zODM4MjAuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvbnM4MzgyMC5jJzsgZmlgOyBcCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAl0aGVuIG12IC1mICIkKERFUERJUikvbGliZHJpdmVyc19hLW5zODM4MjAuVHBvIiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS1uczgzODIwLlBvIjsgZWxzZSBybSAtZiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS1uczgzODIwLlRwbyI7IGV4aXQgMTsgZmkKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J25zODM4MjAuYycgb2JqZWN0PSdsaWJkcml2ZXJzX2EtbnM4MzgyMC5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACWRlcGZpbGU9JyQoREVQRElSKS9saWJkcml2ZXJzX2EtbnM4MzgyMC5QbycgdG1wZGVwZmlsZT0nJChERVBESVIpL2xpYmRyaXZlcnNfYS1uczgzODIwLlRQbycgQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJkcml2ZXJzX2FfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gbGliZHJpdmVyc19hLW5zODM4MjAub2JqIGBpZiB0ZXN0IC1mICduczgzODIwLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnbnM4MzgyMC5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9uczgzODIwLmMnOyBmaWAKKworbGliZHJpdmVyc19hLXBuaWMubzogcG5pYy5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAlpZiAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJkcml2ZXJzX2FfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGxpYmRyaXZlcnNfYS1wbmljLm8gLU1EIC1NUCAtTUYgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtcG5pYy5UcG8iIC1jIC1vIGxpYmRyaXZlcnNfYS1wbmljLm8gYHRlc3QgLWYgJ3BuaWMuYycgfHwgZWNobyAnJChzcmNkaXIpLydgcG5pYy5jOyBcCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAl0aGVuIG12IC1mICIkKERFUERJUikvbGliZHJpdmVyc19hLXBuaWMuVHBvIiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS1wbmljLlBvIjsgZWxzZSBybSAtZiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS1wbmljLlRwbyI7IGV4aXQgMTsgZmkKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J3BuaWMuYycgb2JqZWN0PSdsaWJkcml2ZXJzX2EtcG5pYy5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlkZXBmaWxlPSckKERFUERJUikvbGliZHJpdmVyc19hLXBuaWMuUG8nIHRtcGRlcGZpbGU9JyQoREVQRElSKS9saWJkcml2ZXJzX2EtcG5pYy5UUG8nIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliZHJpdmVyc19hX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGxpYmRyaXZlcnNfYS1wbmljLm8gYHRlc3QgLWYgJ3BuaWMuYycgfHwgZWNobyAnJChzcmNkaXIpLydgcG5pYy5jCisKK2xpYmRyaXZlcnNfYS1wbmljLm9iajogcG5pYy5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAlpZiAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJkcml2ZXJzX2FfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGxpYmRyaXZlcnNfYS1wbmljLm9iaiAtTUQgLU1QIC1NRiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS1wbmljLlRwbyIgLWMgLW8gbGliZHJpdmVyc19hLXBuaWMub2JqIGBpZiB0ZXN0IC1mICdwbmljLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAncG5pYy5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9wbmljLmMnOyBmaWA7IFwKK0BhbV9fZmFzdGRlcENDX1RSVUVACXRoZW4gbXYgLWYgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtcG5pYy5UcG8iICIkKERFUERJUikvbGliZHJpdmVyc19hLXBuaWMuUG8iOyBlbHNlIHJtIC1mICIkKERFUERJUikvbGliZHJpdmVyc19hLXBuaWMuVHBvIjsgZXhpdCAxOyBmaQorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0ncG5pYy5jJyBvYmplY3Q9J2xpYmRyaXZlcnNfYS1wbmljLm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJZGVwZmlsZT0nJChERVBESVIpL2xpYmRyaXZlcnNfYS1wbmljLlBvJyB0bXBkZXBmaWxlPSckKERFUERJUikvbGliZHJpdmVyc19hLXBuaWMuVFBvJyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYmRyaXZlcnNfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBsaWJkcml2ZXJzX2EtcG5pYy5vYmogYGlmIHRlc3QgLWYgJ3BuaWMuYyc7IHRoZW4gJChDWUdQQVRIX1cpICdwbmljLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL3BuaWMuYyc7IGZpYAorCitsaWJkcml2ZXJzX2EtcG5pY19hcGkubzogcG5pY19hcGkuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJaWYgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliZHJpdmVyc19hX0NGTEFHUykgJChDRkxBR1MpIC1NVCBsaWJkcml2ZXJzX2EtcG5pY19hcGkubyAtTUQgLU1QIC1NRiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS1wbmljX2FwaS5UcG8iIC1jIC1vIGxpYmRyaXZlcnNfYS1wbmljX2FwaS5vIGB0ZXN0IC1mICdwbmljX2FwaS5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BwbmljX2FwaS5jOyBcCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAl0aGVuIG12IC1mICIkKERFUERJUikvbGliZHJpdmVyc19hLXBuaWNfYXBpLlRwbyIgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtcG5pY19hcGkuUG8iOyBlbHNlIHJtIC1mICIkKERFUERJUikvbGliZHJpdmVyc19hLXBuaWNfYXBpLlRwbyI7IGV4aXQgMTsgZmkKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J3BuaWNfYXBpLmMnIG9iamVjdD0nbGliZHJpdmVyc19hLXBuaWNfYXBpLm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACWRlcGZpbGU9JyQoREVQRElSKS9saWJkcml2ZXJzX2EtcG5pY19hcGkuUG8nIHRtcGRlcGZpbGU9JyQoREVQRElSKS9saWJkcml2ZXJzX2EtcG5pY19hcGkuVFBvJyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYmRyaXZlcnNfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBsaWJkcml2ZXJzX2EtcG5pY19hcGkubyBgdGVzdCAtZiAncG5pY19hcGkuYycgfHwgZWNobyAnJChzcmNkaXIpLydgcG5pY19hcGkuYworCitsaWJkcml2ZXJzX2EtcG5pY19hcGkub2JqOiBwbmljX2FwaS5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAlpZiAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJkcml2ZXJzX2FfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGxpYmRyaXZlcnNfYS1wbmljX2FwaS5vYmogLU1EIC1NUCAtTUYgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtcG5pY19hcGkuVHBvIiAtYyAtbyBsaWJkcml2ZXJzX2EtcG5pY19hcGkub2JqIGBpZiB0ZXN0IC1mICdwbmljX2FwaS5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ3BuaWNfYXBpLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL3BuaWNfYXBpLmMnOyBmaWA7IFwKK0BhbV9fZmFzdGRlcENDX1RSVUVACXRoZW4gbXYgLWYgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtcG5pY19hcGkuVHBvIiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS1wbmljX2FwaS5QbyI7IGVsc2Ugcm0gLWYgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtcG5pY19hcGkuVHBvIjsgZXhpdCAxOyBmaQorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0ncG5pY19hcGkuYycgb2JqZWN0PSdsaWJkcml2ZXJzX2EtcG5pY19hcGkub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlkZXBmaWxlPSckKERFUERJUikvbGliZHJpdmVyc19hLXBuaWNfYXBpLlBvJyB0bXBkZXBmaWxlPSckKERFUERJUikvbGliZHJpdmVyc19hLXBuaWNfYXBpLlRQbycgQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJkcml2ZXJzX2FfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gbGliZHJpdmVyc19hLXBuaWNfYXBpLm9iaiBgaWYgdGVzdCAtZiAncG5pY19hcGkuYyc7IHRoZW4gJChDWUdQQVRIX1cpICdwbmljX2FwaS5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9wbmljX2FwaS5jJzsgZmlgCiAKIElEOiAkKEhFQURFUlMpICQoU09VUkNFUykgJChMSVNQKSAkKFRBR1NfRklMRVMpCiAJbGlzdD0nJChTT1VSQ0VTKSAkKEhFQURFUlMpICQoTElTUCkgJChUQUdTX0ZJTEVTKSc7IFwKQEAgLTgxNywxMSArOTI3LDkgQEAKIAkgIGRvbmUgfCBcCiAJICAkKEFXSykgJyAgICB7IGZpbGVzWyQkMF0gPSAxOyB9IFwKIAkgICAgICAgRU5EIHsgZm9yIChpIGluIGZpbGVzKSBwcmludCBpOyB9J2A7IFwKLQlpZiB0ZXN0IC16ICIkKEVUQUdTX0FSR1MpJCR0YWdzJCR1bmlxdWUiOyB0aGVuIDo7IGVsc2UgXAotCSAgdGVzdCAtbiAiJCR1bmlxdWUiIHx8IHVuaXF1ZT0kJGVtcHR5X2ZpeDsgXAotCSAgJChFVEFHUykgJChFVEFHU0ZMQUdTKSAkKEFNX0VUQUdTRkxBR1MpICQoRVRBR1NfQVJHUykgXAotCSAgICAkJHRhZ3MgJCR1bmlxdWU7IFwKLQlmaQorCXRlc3QgLXogIiQoRVRBR1NfQVJHUykkJHRhZ3MkJHVuaXF1ZSIgXAorCSAgfHwgJChFVEFHUykgJChFVEFHU0ZMQUdTKSAkKEFNX0VUQUdTRkxBR1MpICQoRVRBR1NfQVJHUykgXAorCSAgICAgJCR0YWdzICQkdW5pcXVlCiBjdGFnczogQ1RBR1MKIENUQUdTOiAgJChIRUFERVJTKSAkKFNPVVJDRVMpICAkKFRBR1NfREVQRU5ERU5DSUVTKSBcCiAJCSQoVEFHU19GSUxFUykgJChMSVNQKQpAQCAtODk1LDcgKzEwMDMsNyBAQAogY2xlYW4tZ2VuZXJpYzoKIAogZGlzdGNsZWFuLWdlbmVyaWM6Ci0JLXRlc3QgLXogIiQoQ09ORklHX0NMRUFOX0ZJTEVTKSIgfHwgcm0gLWYgJChDT05GSUdfQ0xFQU5fRklMRVMpCisJLXJtIC1mICQoQ09ORklHX0NMRUFOX0ZJTEVTKQogCiBtYWludGFpbmVyLWNsZWFuLWdlbmVyaWM6CiAJQGVjaG8gIlRoaXMgY29tbWFuZCBpcyBpbnRlbmRlZCBmb3IgbWFpbnRhaW5lcnMgdG8gdXNlIgpAQCAtOTYyLDEwICsxMDcwLDEwIEBACiAKIAogIyBJcyBpdCByZWFsbHkgbmVjZXNzYXJ5IHRvIHNwZWNpZnkgZGVwZW5kZWNpZXMgZXhwbGljaXRseT8KLSQoM2M1MDlfZHJpdmVycyk6IDNjNTA5LmMgM2M1MDkuaAotJCgzYzUwOV9kcml2ZXJzKTogJS5vOiAzYzUwOS5jCi0JJChDT01QSUxFKSAkKFNUQUdFMl9DRkxBR1MpIC1mbm8tYnVpbHRpbiAtbm9zdGRpbmMgXAotCSAgJChORVRfRVhUUkFGTEFHUykgJCgkKGJhc2VuYW1lICRAKV9vX0NGTEFHUykgLW8gJEAgLWMgJDwKKyMkKDNjNTA5X2RyaXZlcnMpOiAzYzUwOS5jIDNjNTA5LmgKKyMkKDNjNTA5X2RyaXZlcnMpOiAlLm86IDNjNTA5LmMKKyMJJChDT01QSUxFKSAkKFNUQUdFMl9DRkxBR1MpIC1mbm8tYnVpbHRpbiAtbm9zdGRpbmMgXAorIwkgICQoTkVUX0VYVFJBRkxBR1MpICQoJChiYXNlbmFtZSAkQClfb19DRkxBR1MpIC1vICRAIC1jICQ8CiAKICQoM2M1OTVfZHJpdmVycyk6IDNjNTk1LmMgM2M1OTUuaAogJCgzYzU5NV9kcml2ZXJzKTogJS5vOiAzYzU5NS5jCkBAIC05NzcsMjMgKzEwODUsMjggQEAKIAkkKENPTVBJTEUpICQoU1RBR0UyX0NGTEFHUykgLWZuby1idWlsdGluIC1ub3N0ZGluYyBcCiAJICAkKE5FVF9FWFRSQUZMQUdTKSAkKCQoYmFzZW5hbWUgJEApX29fQ0ZMQUdTKSAtbyAkQCAtYyAkPAogCi0kKGNzODl4MF9kcml2ZXJzKTogY3M4OXgwLmMgY3M4OXgwLmgKLSQoY3M4OXgwX2RyaXZlcnMpOiAlLm86IGNzODl4MC5jCi0JJChDT01QSUxFKSAkKFNUQUdFMl9DRkxBR1MpIC1mbm8tYnVpbHRpbiAtbm9zdGRpbmMgXAotCSAgJChORVRfRVhUUkFGTEFHUykgJCgkKGJhc2VuYW1lICRAKV9vX0NGTEFHUykgLW8gJEAgLWMgJDwKKyMkKGNzODl4MF9kcml2ZXJzKTogY3M4OXgwLmMgY3M4OXgwLmgKKyMkKGNzODl4MF9kcml2ZXJzKTogJS5vOiBjczg5eDAuYworIwkkKENPTVBJTEUpICQoU1RBR0UyX0NGTEFHUykgLWZuby1idWlsdGluIC1ub3N0ZGluYyBcCisjCSAgJChORVRfRVhUUkFGTEFHUykgJCgkKGJhc2VuYW1lICRAKV9vX0NGTEFHUykgLW8gJEAgLWMgJDwKIAogJChkYXZpY29tX2RyaXZlcnMpOiBkYXZpY29tLmMKICQoZGF2aWNvbV9kcml2ZXJzKTogJS5vOiBkYXZpY29tLmMKIAkkKENPTVBJTEUpICQoU1RBR0UyX0NGTEFHUykgLWZuby1idWlsdGluIC1ub3N0ZGluYyBcCiAJICAkKE5FVF9FWFRSQUZMQUdTKSAkKCQoYmFzZW5hbWUgJEApX29fQ0ZMQUdTKSAtbyAkQCAtYyAkPAogCi0kKGRlcGNhX2RyaXZlcnMpOiBkZXBjYS5jCi0kKGRlcGNhX2RyaXZlcnMpOiAlLm86IGRlcGNhLmMKLQkkKENPTVBJTEUpICQoU1RBR0UyX0NGTEFHUykgLWZuby1idWlsdGluIC1ub3N0ZGluYyBcCi0JICAkKE5FVF9FWFRSQUZMQUdTKSAkKCQoYmFzZW5hbWUgJEApX29fQ0ZMQUdTKSAtbyAkQCAtYyAkPAorIyQoZGVwY2FfZHJpdmVycyk6IGRlcGNhLmMKKyMkKGRlcGNhX2RyaXZlcnMpOiAlLm86IGRlcGNhLmMKKyMJJChDT01QSUxFKSAkKFNUQUdFMl9DRkxBR1MpIC1mbm8tYnVpbHRpbiAtbm9zdGRpbmMgXAorIwkgICQoTkVUX0VYVFJBRkxBR1MpICQoJChiYXNlbmFtZSAkQClfb19DRkxBR1MpIC1vICRAIC1jICQ8CiAKLSQoZWVwcm9fZHJpdmVycyk6IGVlcHJvLmMKLSQoZWVwcm9fZHJpdmVycyk6ICUubzogZWVwcm8uYworIyQoZWVwcm9fZHJpdmVycyk6IGVlcHJvLmMKKyMkKGVlcHJvX2RyaXZlcnMpOiAlLm86IGVlcHJvLmMKKyMJJChDT01QSUxFKSAkKFNUQUdFMl9DRkxBR1MpIC1mbm8tYnVpbHRpbiAtbm9zdGRpbmMgXAorIwkgICQoTkVUX0VYVFJBRkxBR1MpICQoJChiYXNlbmFtZSAkQClfb19DRkxBR1MpIC1vICRAIC1jICQ8CisKKyQoZTEwMDBfZHJpdmVycyk6IGUxMDAwLmMgZTEwMDBfaHcuaAorJChlMTAwMF9kcml2ZXJzKTogJS5vOiBlMTAwMC5jCiAJJChDT01QSUxFKSAkKFNUQUdFMl9DRkxBR1MpIC1mbm8tYnVpbHRpbiAtbm9zdGRpbmMgXAogCSAgJChORVRfRVhUUkFGTEFHUykgJCgkKGJhc2VuYW1lICRAKV9vX0NGTEFHUykgLW8gJEAgLWMgJDwKIApAQCAtMTAwNywyOCArMTEyMCwzOCBAQAogCSQoQ09NUElMRSkgJChTVEFHRTJfQ0ZMQUdTKSAtZm5vLWJ1aWx0aW4gLW5vc3RkaW5jIFwKIAkgICQoTkVUX0VYVFJBRkxBR1MpICQoJChiYXNlbmFtZSAkQClfb19DRkxBR1MpIC1vICRAIC1jICQ8CiAKKyQoZm9yY2VkZXRoX2RyaXZlcnMpOiBmb3JjZWRldGguYworJChmb3JjZWRldGhfZHJpdmVycyk6ICUubzogZm9yY2VkZXRoLmMKKwkkKENPTVBJTEUpICQoU1RBR0UyX0NGTEFHUykgLWZuby1idWlsdGluIC1ub3N0ZGluYyBcCisJICAkKE5FVF9FWFRSQUZMQUdTKSAkKCQoYmFzZW5hbWUgJEApX29fQ0ZMQUdTKSAtbyAkQCAtYyAkPAorCiAjJChmYTMxMV9kcml2ZXJzKTogZmEzMTEuYwogIyQoZmEzMTFfZHJpdmVycyk6ICUubzogZmEzMTEuYwogIwkkKENPTVBJTEUpICQoU1RBR0UyX0NGTEFHUykgLWZuby1idWlsdGluIC1ub3N0ZGluYyBcCiAjCSAgJChORVRfRVhUUkFGTEFHUykgJCgkKGJhc2VuYW1lICRAKV9vX0NGTEFHUykgLW8gJEAgLWMgJDwKIAotJChpODI1ODZfZHJpdmVycyk6IGk4MjU4Ni5jCi0kKGk4MjU4Nl9kcml2ZXJzKTogJS5vOiBpODI1ODYuYwotCSQoQ09NUElMRSkgJChTVEFHRTJfQ0ZMQUdTKSAtZm5vLWJ1aWx0aW4gLW5vc3RkaW5jIFwKLQkgICQoTkVUX0VYVFJBRkxBR1MpICQoJChiYXNlbmFtZSAkQClfb19DRkxBR1MpIC1vICRAIC1jICQ8CisjJChpODI1ODZfZHJpdmVycyk6IGk4MjU4Ni5jCisjJChpODI1ODZfZHJpdmVycyk6ICUubzogaTgyNTg2LmMKKyMJJChDT01QSUxFKSAkKFNUQUdFMl9DRkxBR1MpIC1mbm8tYnVpbHRpbiAtbm9zdGRpbmMgXAorIwkgICQoTkVUX0VYVFJBRkxBR1MpICQoJChiYXNlbmFtZSAkQClfb19DRkxBR1MpIC1vICRAIC1jICQ8CiAKLSQobGFuY2VfZHJpdmVycyk6IGxhbmNlLmMKLSQobGFuY2VfZHJpdmVycyk6ICUubzogbGFuY2UuYwotCSQoQ09NUElMRSkgJChTVEFHRTJfQ0ZMQUdTKSAtZm5vLWJ1aWx0aW4gLW5vc3RkaW5jIFwKLQkgICQoTkVUX0VYVFJBRkxBR1MpICQoJChiYXNlbmFtZSAkQClfb19DRkxBR1MpIC1vICRAIC1jICQ8CisjJChsYW5jZV9kcml2ZXJzKTogbGFuY2UuYworIyQobGFuY2VfZHJpdmVycyk6ICUubzogbGFuY2UuYworIwkkKENPTVBJTEUpICQoU1RBR0UyX0NGTEFHUykgLWZuby1idWlsdGluIC1ub3N0ZGluYyBcCisjCSAgJChORVRfRVhUUkFGTEFHUykgJCgkKGJhc2VuYW1lICRAKV9vX0NGTEFHUykgLW8gJEAgLWMgJDwKIAogJChuYXRzZW1pX2RyaXZlcnMpOiBuYXRzZW1pLmMKICQobmF0c2VtaV9kcml2ZXJzKTogJS5vOiBuYXRzZW1pLmMKIAkkKENPTVBJTEUpICQoU1RBR0UyX0NGTEFHUykgLWZuby1idWlsdGluIC1ub3N0ZGluYyBcCiAJICAkKE5FVF9FWFRSQUZMQUdTKSAkKCQoYmFzZW5hbWUgJEApX29fQ0ZMQUdTKSAtbyAkQCAtYyAkPAogCi0kKG5pNTAxMF9kcml2ZXJzKTogbmk1MDEwLmMKLSQobmk1MDEwX2RyaXZlcnMpOiAlLm86IG5pNTAxMC5jCisjJChuaTUwMTBfZHJpdmVycyk6IG5pNTAxMC5jCisjJChuaTUwMTBfZHJpdmVycyk6ICUubzogbmk1MDEwLmMKKyMJJChDT01QSUxFKSAkKFNUQUdFMl9DRkxBR1MpIC1mbm8tYnVpbHRpbiAtbm9zdGRpbmMgXAorIwkgICQoTkVUX0VYVFJBRkxBR1MpICQoJChiYXNlbmFtZSAkQClfb19DRkxBR1MpIC1vICRAIC1jICQ8CisKKyQobnM4MzgyMF9kcml2ZXJzKTogbnM4MzgyMC5jCiskKG5zODM4MjBfZHJpdmVycyk6ICUubzogbnM4MzgyMC5jCiAJJChDT01QSUxFKSAkKFNUQUdFMl9DRkxBR1MpIC1mbm8tYnVpbHRpbiAtbm9zdGRpbmMgXAogCSAgJChORVRfRVhUUkFGTEFHUykgJCgkKGJhc2VuYW1lICRAKV9vX0NGTEFHUykgLW8gJEAgLWMgJDwKIApAQCAtMTAzNyw0MSArMTE2MCw2MiBAQAogCSQoQ09NUElMRSkgJChTVEFHRTJfQ0ZMQUdTKSAtZm5vLWJ1aWx0aW4gLW5vc3RkaW5jIFwKIAkgICQoTkVUX0VYVFJBRkxBR1MpICQoJChiYXNlbmFtZSAkQClfb19DRkxBR1MpIC1vICRAIC1jICQ8CiAKLSQob3R1bGlwX2RyaXZlcnMpOiBvdHVsaXAuYyBvdHVsaXAuaAotJChvdHVsaXBfZHJpdmVycyk6ICUubzogb3R1bGlwLmMKKyMkKG90dWxpcF9kcml2ZXJzKTogb3R1bGlwLmMgb3R1bGlwLmgKKyMkKG90dWxpcF9kcml2ZXJzKTogJS5vOiBvdHVsaXAuYworIwkkKENPTVBJTEUpICQoU1RBR0UyX0NGTEFHUykgLWZuby1idWlsdGluIC1ub3N0ZGluYyBcCisjCSAgJChORVRfRVhUUkFGTEFHUykgJCgkKGJhc2VuYW1lICRAKV9vX0NGTEFHUykgLW8gJEAgLWMgJDwKKworJChwY25ldDMyX2RyaXZlcnMpOiBwY25ldDMyLmMKKyQocGNuZXQzMl9kcml2ZXJzKTogJS5vOiBwY25ldDMyLmMKIAkkKENPTVBJTEUpICQoU1RBR0UyX0NGTEFHUykgLWZuby1idWlsdGluIC1ub3N0ZGluYyBcCiAJICAkKE5FVF9FWFRSQUZMQUdTKSAkKCQoYmFzZW5hbWUgJEApX29fQ0ZMQUdTKSAtbyAkQCAtYyAkPAogCi0kKHJ0bDgxMzlfZHJpdmVycyk6IHJ0bDgxMzkuYwotJChydGw4MTM5X2RyaXZlcnMpOiAlLm86IHJ0bDgxMzkuYworJChwbmljX2RyaXZlcnMpOiBwbmljLmMKKyQocG5pY19kcml2ZXJzKTogJS5vOiBwbmljLmMgcG5pY19hcGkuaAogCSQoQ09NUElMRSkgJChTVEFHRTJfQ0ZMQUdTKSAtZm5vLWJ1aWx0aW4gLW5vc3RkaW5jIFwKIAkgICQoTkVUX0VYVFJBRkxBR1MpICQoJChiYXNlbmFtZSAkQClfb19DRkxBR1MpIC1vICRAIC1jICQ8CiAKLSQoc2lzOTAwX2RyaXZlcnMpOiBzaXM5MDAuYwotJChzaXM5MDBfZHJpdmVycyk6ICUubzogc2lzOTAwLmMgc2lzOTAwLmgKKyQocnRsODEzOV9kcml2ZXJzKTogcnRsODEzOS5jCiskKHJ0bDgxMzlfZHJpdmVycyk6ICUubzogcnRsODEzOS5jCiAJJChDT01QSUxFKSAkKFNUQUdFMl9DRkxBR1MpIC1mbm8tYnVpbHRpbiAtbm9zdGRpbmMgXAogCSAgJChORVRfRVhUUkFGTEFHUykgJCgkKGJhc2VuYW1lICRAKV9vX0NGTEFHUykgLW8gJEAgLWMgJDwKIAotJChza19nMTZfZHJpdmVycyk6IHNrX2cxNi5jIHNrX2cxNi5oCi0kKHNrX2cxNl9kcml2ZXJzKTogJS5vOiBza19nMTYuYworJChyODE2OV9kcml2ZXJzKTogcjgxNjkuYworJChyODE2OV9kcml2ZXJzKTogJS5vOiByODE2OS5jCiAJJChDT01QSUxFKSAkKFNUQUdFMl9DRkxBR1MpIC1mbm8tYnVpbHRpbiAtbm9zdGRpbmMgXAogCSAgJChORVRfRVhUUkFGTEFHUykgJCgkKGJhc2VuYW1lICRAKV9vX0NGTEFHUykgLW8gJEAgLWMgJDwKIAotJChzbWM5MDAwX2RyaXZlcnMpOiBzbWM5MDAwLmMgc21jOTAwMC5oCi0kKHNtYzkwMDBfZHJpdmVycyk6ICUubzogc21jOTAwMC5jCiskKHNpczkwMF9kcml2ZXJzKTogc2lzOTAwLmMgc2lzOTAwLmgKKyQoc2lzOTAwX2RyaXZlcnMpOiAlLm86IHNpczkwMC5jCiAJJChDT01QSUxFKSAkKFNUQUdFMl9DRkxBR1MpIC1mbm8tYnVpbHRpbiAtbm9zdGRpbmMgXAogCSAgJChORVRfRVhUUkFGTEFHUykgJCgkKGJhc2VuYW1lICRAKV9vX0NGTEFHUykgLW8gJEAgLWMgJDwKIAotJCh0aWFyYV9kcml2ZXJzKTogdGlhcmEuYwotJCh0aWFyYV9kcml2ZXJzKTogJS5vOiB0aWFyYS5jCisjJChza19nMTZfZHJpdmVycyk6IHNrX2cxNi5jIHNrX2cxNi5oCisjJChza19nMTZfZHJpdmVycyk6ICUubzogc2tfZzE2LmMKKyMJJChDT01QSUxFKSAkKFNUQUdFMl9DRkxBR1MpIC1mbm8tYnVpbHRpbiAtbm9zdGRpbmMgXAorIwkgICQoTkVUX0VYVFJBRkxBR1MpICQoJChiYXNlbmFtZSAkQClfb19DRkxBR1MpIC1vICRAIC1jICQ8CisKKyMkKHNtYzkwMDBfZHJpdmVycyk6IHNtYzkwMDAuYyBzbWM5MDAwLmgKKyMkKHNtYzkwMDBfZHJpdmVycyk6ICUubzogc21jOTAwMC5jCisjCSQoQ09NUElMRSkgJChTVEFHRTJfQ0ZMQUdTKSAtZm5vLWJ1aWx0aW4gLW5vc3RkaW5jIFwKKyMJICAkKE5FVF9FWFRSQUZMQUdTKSAkKCQoYmFzZW5hbWUgJEApX29fQ0ZMQUdTKSAtbyAkQCAtYyAkPAorCisKKyQodGczX2RyaXZlcnMpOiB0ZzMuYyB0ZzMuaAorJCh0ZzNfZHJpdmVycyk6ICUubzogdGczLmMKIAkkKENPTVBJTEUpICQoU1RBR0UyX0NGTEFHUykgLWZuby1idWlsdGluIC1ub3N0ZGluYyBcCiAJICAkKE5FVF9FWFRSQUZMQUdTKSAkKCQoYmFzZW5hbWUgJEApX29fQ0ZMQUdTKSAtbyAkQCAtYyAkPAogCi0jJCh0bGFuX2RyaXZlcnMpOiB0bGFuLmMKLSMkKHRsYW5fZHJpdmVycyk6ICUubzogdGxhbi5jCisjJCh0aWFyYV9kcml2ZXJzKTogdGlhcmEuYworIyQodGlhcmFfZHJpdmVycyk6ICUubzogdGlhcmEuYwogIwkkKENPTVBJTEUpICQoU1RBR0UyX0NGTEFHUykgLWZuby1idWlsdGluIC1ub3N0ZGluYyBcCiAjCSAgJChORVRfRVhUUkFGTEFHUykgJCgkKGJhc2VuYW1lICRAKV9vX0NGTEFHUykgLW8gJEAgLWMgJDwKIAorJCh0bGFuX2RyaXZlcnMpOiB0bGFuLmMgdGxhbi5oCiskKHRsYW5fZHJpdmVycyk6ICUubzogdGxhbi5jCisJJChDT01QSUxFKSAkKFNUQUdFMl9DRkxBR1MpIC1mbm8tYnVpbHRpbiAtbm9zdGRpbmMgXAorCSAgJChORVRfRVhUUkFGTEFHUykgJCgkKGJhc2VuYW1lICRAKV9vX0NGTEFHUykgLW8gJEAgLWMgJDwKKwogJCh0dWxpcF9kcml2ZXJzKTogdHVsaXAuYwogJCh0dWxpcF9kcml2ZXJzKTogJS5vOiB0dWxpcC5jCiAJJChDT01QSUxFKSAkKFNUQUdFMl9DRkxBR1MpIC1mbm8tYnVpbHRpbiAtbm9zdGRpbmMgXApkaWZmIC1OYXVyIGdydWItMC45Ny5vcmlnL25ldGJvb3QvYmFzZW1lbS5jIGdydWItMC45Ny9uZXRib290L2Jhc2VtZW0uYwotLS0gZ3J1Yi0wLjk3Lm9yaWcvbmV0Ym9vdC9iYXNlbWVtLmMJMTk3MC0wMS0wMSAwMDowMDowMC4wMDAwMDAwMDAgKzAwMDAKKysrIGdydWItMC45Ny9uZXRib290L2Jhc2VtZW0uYwkyMDA1LTA4LTMxIDE5OjI0OjI4LjAwMDAwMDAwMCArMDAwMApAQCAtMCwwICsxLDE3OCBAQAorI2luY2x1ZGUgImV0aGVyYm9vdC5oIgorI2RlZmluZSBERUJVR19CQVNFTUVNCisvKiBSb3V0aW5lcyB0byBhbGxvY2F0ZSBiYXNlIG1lbW9yeSBpbiBhIEJJT1MtY29tcGF0aWJsZSB3YXksIGJ5CisgKiB1cGRhdGluZyB0aGUgRnJlZSBCYXNlIE1lbW9yeSBTaXplIGNvdW50ZXIgYXQgNDA6MTNoLgorICoKKyAqIE1pY2hhZWwgQnJvd24gPG1icm93bkBmZW5zeXN0ZW1zLmNvLnVrPiAobWNiMzApCisgKiAkSWQ6IGdydWItMC45NS1kaXNrbGVzcy1wYXRjaC0yLXVuZGkucGF0Y2gsdiAxLjEuMS4xIDIwMDUvMDYvMTQgMDg6MTg6NTAgd2Vzb2xvd3MgRXhwICQKKyAqLworCisjZGVmaW5lIGZibXMgKCAoIHVpbnQxNl90ICogKSBwaHlzX3RvX3ZpcnQgKCAweDQxMyApICkKKyNkZWZpbmUgQkFTRV9NRU1PUllfTUFYICggNjQwICkKKyNkZWZpbmUgRlJFRV9CTE9DS19NQUdJQyAoICgnISc8PDApICsgKCdGJzw8OCkgKyAoJ1InPDwxNikgKyAoJ0UnPDwyNCkgKQorCit0eXBlZGVmIHN0cnVjdCBmcmVlX2Jhc2VfbWVtb3J5X2Jsb2NrIHsKKwl1aW50MzJfdAltYWdpYzsKKwl1aW50MTZfdAlzaXplX2tiOworfSBmcmVlX2Jhc2VfbWVtb3J5X2Jsb2NrX3Q7CisKKy8qIFJldHVybiBhbW91bnQgb2YgZnJlZSBiYXNlIG1lbW9yeSBpbiBieXRlcworICovCisKK3VpbnQzMl90IGdldF9mcmVlX2Jhc2VfbWVtb3J5ICggdm9pZCApIHsKKwlyZXR1cm4gKmZibXMgPDwgMTA7Cit9CisKKy8qIEFkanVzdCB0aGUgcmVhbCBtb2RlIHN0YWNrIHBvaW50ZXIuICBXZSBrZWVwIHRoZSByZWFsIG1vZGUgc3RhY2sgYXQKKyAqIHRoZSB0b3Agb2YgZnJlZSBiYXNlIG1lbW9yeSwgcmF0aGVyIHRoYW4gYWxsb2NhdGluZyBzcGFjZSBmb3IgaXQuCisgKi8KKworaW5saW5lIHZvaWQgYWRqdXN0X3JlYWxfbW9kZV9zdGFjayAoIHZvaWQgKSB7CisvKiAgCXJlYWxfbW9kZV9zdGFjayA9ICggKmZibXMgPDwgMTAgKTsgKi8KK30KKworLyogQWxsb2NhdGUgTiBieXRlcyBvZiBiYXNlIG1lbW9yeS4gIEFtb3VudCBhbGxvY2F0ZWQgd2lsbCBiZSByb3VuZGVkCisgKiB1cCB0byB0aGUgbmVhcmVzdCBrQiwgc2luY2UgdGhhdCdzIHRoZSBncmFudWxhcml0eSBvZiB0aGUgQklPUyBGQk1TCisgKiBjb3VudGVyLiAgUmV0dXJucyBOVUxMIGlmIG1lbW9yeSBjYW5ub3QgYmUgYWxsb2NhdGVkLgorICovCisKK3ZvaWQgKiBhbGxvdF9iYXNlX21lbW9yeSAoIHNpemVfdCBzaXplICkgeworCXVpbnQxNl90IHNpemVfa2IgPSAoIHNpemUgKyAxMDIzICkgPj4gMTA7CisJdm9pZCAqcHRyID0gTlVMTDsKKworI2lmZGVmIERFQlVHX0JBU0VNRU0KKwlwcmludGYgKCAiVHJ5aW5nIHRvIGFsbG9jYXRlICVkIGtCIG9mIGJhc2UgbWVtb3J5LCAlZCBrQiBmcmVlXG4iLAorCQkgc2l6ZV9rYiwgKmZibXMgKTsKKyNlbmRpZgorCisJLyogRnJlZSB1cCBhbnkgdW51c2VkIG1lbW9yeSBiZWZvcmUgd2Ugc3RhcnQgKi8KKwlmcmVlX3VudXNlZF9iYXNlX21lbW9yeSgpOworCisJLyogQ2hlY2sgYXZhaWxhYmxlIGJhc2UgbWVtb3J5ICovCisJaWYgKCBzaXplX2tiID4gKmZibXMgKSB7IHJldHVybiBOVUxMOyB9CisKKwkvKiBSZWR1Y2UgYXZhaWxhYmxlIGJhc2UgbWVtb3J5ICovCisJKmZibXMgLT0gc2l6ZV9rYjsKKworCS8qIENhbGN1bGF0ZSBhZGRyZXNzIG9mIG1lbW9yeSBhbGxvY2F0ZWQgKi8KKwlwdHIgPSBwaHlzX3RvX3ZpcnQgKCAqZmJtcyA8PCAxMCApOworCisjaWZkZWYgREVCVUdfQkFTRU1FTQorCS8qIFplcm8gb3V0IG1lbW9yeS4gIFdlIGRvIHRoaXMgc28gdGhhdCBhbGxvY2F0aW9uIG9mCisJICogYWxyZWFkeS11c2VkIHNwYWNlIHdpbGwgc2hvdyB1cCBpbiB0aGUgZm9ybSBvZiBhIGNyYXNoIGFzCisJICogc29vbiBhcyBwb3NzaWJsZS4KKwkgKi8KKwltZW1zZXQgKCBwdHIsIDAsIHNpemVfa2IgPDwgMTAgKTsKKyNlbmRpZgorCisJLyogQWRqdXN0IHJlYWwgbW9kZSBzdGFjayBwb2ludGVyICovCisJYWRqdXN0X3JlYWxfbW9kZV9zdGFjayAoKTsKKworCXJldHVybiBwdHI7Cit9CisKKy8qIEZyZWUgYmFzZSBtZW1vcnkgYWxsb2NhdGVkIGJ5IGFsbG90X2Jhc2VfbWVtb3J5LiAgVGhlIEJJT1MgcHJvdmlkZXMKKyAqIG5vdGhpbmcgYmV0dGVyIHRoYW4gYSBMSUZPIG1lY2hhbmlzbSBmb3IgZnJlZWluZyBtZW1vcnkgKGkuZS4gaXQKKyAqIGp1c3QgaGFzIHRoZSBzaW5nbGUgInRvdGFsIGZyZWUgbWVtb3J5IiBjb3VudGVyKSwgYnV0IHdlIGltcHJvdmUKKyAqIHVwb24gdGhpcyBzbGlnaHRseTsgYXMgbG9uZyBhcyB5b3UgZnJlZSBhbGwgdGhlIGFsbG90dGVkIGJsb2NrcywgaXQKKyAqIGRvZXNuJ3QgbWF0dGVyIHdoYXQgb3JkZXIgeW91IGZyZWUgdGhlbSBpbi4gIChUaGlzIHdpbGwgb25seSB3b3JrCisgKiBmb3IgYmxvY2tzIHRoYXQgYXJlIGZyZWVkIHZpYSBmb3JnZXRfYmFzZV9tZW1vcnkoKSkuCisgKgorICogWWVzLCBpdCdzIGFubm95aW5nIHRoYXQgeW91IGhhdmUgdG8gcmVtZW1iZXIgdGhlIHNpemUgb2YgdGhlIGJsb2NrcworICogeW91J3ZlIGFsbG90dGVkLiAgSG93ZXZlciwgc2luY2Ugb3VyIGdyYW51bGFyaXR5IG9mIGFsbG9jYXRpb24gaXMKKyAqIDFLLCB0aGUgYWx0ZXJuYXRpdmUgaXMgdG8gcmlzayB3YXN0aW5nIHRoZSBvY2Nhc2lvbmFsIGtCIG9mIGJhc2UKKyAqIG1lbW9yeSwgd2hpY2ggaXMgYSBCYWQgVGhpbmcuICBSZWFsbHksIHlvdSBzaG91bGQgYmUgdXNpbmcgYXMKKyAqIGxpdHRsZSBiYXNlIG1lbW9yeSBhcyBwb3NzaWJsZSwgc28gY29uc2lkZXIgdGhlIGF3a3dhcmRuZXNzIG9mIHRoZQorICogQVBJIHRvIGJlIGEgZmVhdHVyZSEgOi0pCisgKi8KKwordm9pZCBmb3JnZXRfYmFzZV9tZW1vcnkgKCB2b2lkICpwdHIsIHNpemVfdCBzaXplICkgeworCXVpbnQxNl90IHJlbWFpbmRlciA9IHZpcnRfdG9fcGh5cyhwdHIpICYgMTAyMzsKKwl1aW50MTZfdCBzaXplX2tiID0gKCBzaXplICsgcmVtYWluZGVyICsgMTAyMyApID4+IDEwOworCWZyZWVfYmFzZV9tZW1vcnlfYmxvY2tfdCAqZnJlZV9ibG9jayA9CisJCSggZnJlZV9iYXNlX21lbW9yeV9ibG9ja190ICogKSAoIHB0ciAtIHJlbWFpbmRlciApOworCQorCWlmICggKCBwdHIgPT0gTlVMTCApIHx8ICggc2l6ZSA9PSAwICkgKSB7IHJldHVybjsgfQorCisjaWZkZWYgREVCVUdfQkFTRU1FTQorCXByaW50ZiAoICJUcnlpbmcgdG8gZnJlZSAlZCBieXRlcyBiYXNlIG1lbW9yeSBhdCAweCV4XG4iLAorCQkgc2l6ZSwgdmlydF90b19waHlzICggcHRyICkgKTsKKwlpZiAoIHJlbWFpbmRlciA+IDAgKSB7CisJCXByaW50ZiAoICJXQVJOSU5HOiBkZXN0cnVjdGl2ZWx5IGV4cGFuZGluZyBmcmVlIGJsb2NrICIKKwkJCSAiZG93bndhcmRzIHRvIDB4JXhcbiIsCisJCQkgdmlydF90b19waHlzICggcHRyIC0gcmVtYWluZGVyICkgKTsKKwl9CisjZW5kaWYKKworCS8qIE1hcmsgZXZlcnkga2lsb2J5dGUgd2l0aGluIHRoaXMgYmxvY2sgYXMgZnJlZS4gIFRoaXMgaXMKKwkgKiBvdmVya2lsbCBmb3Igbm9ybWFsIHB1cnBvc2VzLCBidXQgaGVscHMgd2hlbiBzb21ldGhpbmcgaGFzCisJICogYWxsb2NhdGVkIGJhc2UgbWVtb3J5IHdpdGggYSBncmFudWxhcml0eSBmaW5lciB0aGFuIHRoZQorCSAqIEJJT1MgZ3JhbnVsYXJpdHkgb2YgMWtCLiAgUFhFIFJPTXMgdGVuZCB0byBkbyB0aGlzIHdoZW4KKwkgKiB0aGV5IGFsbG9jYXRlIHRoZWlyIG93biBtZW1vcnkuICBUaGlzIG1ldGhvZCBhbGxvd3MgdXMgdG8KKwkgKiBmcmVlIHRoZWlyIGJsb2NrcyAoYWRtaXR0ZWRseSBpbiBhIHJhdGhlciBkYW5nZXJvdXMsCisJICogdHJlYWQtb24tYW55dGhpbmctZWl0aGVyLXNpZGUgc29ydCBvZiB3YXksIGJ1dCB0aGVyZSdzIG5vCisJICogb3RoZXIgd2F5IHRvIGRvIGl0KS4KKwkgKgorCSAqIFNpbmNlIHdlJ3JlIG1hcmtpbmcgZXZlcnkga0IgYXMgZnJlZSwgdGhlcmUncyBhY3R1YWxseSBubworCSAqIG5lZWQgZm9yIHJlY29yZGluZyB0aGUgc2l6ZSBvZiB0aGUgYmxvY2tzLiAgSG93ZXZlciwgd2UKKwkgKiBrZWVwIHRoaXMgaW4gc28gdGhhdCBkZWJ1ZyBtZXNzYWdlcyBhcmUgZnJpZW5kbGllci4gIEl0CisJICogcHJvYmFibHkgYWRkcyBhcm91bmQgOCBieXRlcyB0byB0aGUgb3ZlcmFsbCBjb2RlIHNpemUuCisJICovCisJd2hpbGUgKCBzaXplX2tiID4gMCApIHsKKwkJLyogTWFyayB0aGlzIGJsb2NrIGFzIHVudXNlZCAqLworCQlmcmVlX2Jsb2NrLT5tYWdpYyA9IEZSRUVfQkxPQ0tfTUFHSUM7CisJCWZyZWVfYmxvY2stPnNpemVfa2IgPSBzaXplX2tiOworCQkvKiBNb3ZlIHVwIGJ5IDEga0IgKi8KKwkJKHZvaWQgKikoZnJlZV9ibG9jayArPSAoIDEgPDwgMTAgKSk7CisJCXNpemVfa2ItLTsKKwl9CisKKwkvKiBGcmVlIHVwIHVudXNlZCBiYXNlIG1lbW9yeSAqLworCWZyZWVfdW51c2VkX2Jhc2VfbWVtb3J5KCk7Cit9CisKKy8qIERvIHRoZSBhY3R1YWwgZnJlZWluZyBvZiBtZW1vcnkuICBUaGlzIGlzIHNwbGl0IG91dCBmcm9tCisgKiBmb3JnZXRfYmFzZV9tZW1vcnkoKSBzbyB0aGF0IGl0IG1heSBiZSBjYWxsZWQgc2VwYXJhdGVseS4gIEl0CisgKiBzaG91bGQgYmUgY2FsbGVkIHdoZW5ldmVyIGJhc2UgbWVtb3J5IGlzIGRlYWxsb2NhdGVkIGJ5IGFuIGV4dGVybmFsCisgKiBlbnRpdHkgKGlmIHdlIGNhbiBkZXRlY3QgdGhhdCBpdCBoYXMgZG9uZSBzbykgc28gdGhhdCB3ZSBnZXQgdGhlCisgKiBjaGFuY2UgdG8gZnJlZSB1cCBvdXIgb3duIGJsb2Nrcy4KKyAqLwordm9pZCBmcmVlX3VudXNlZF9iYXNlX21lbW9yeSAoIHZvaWQgKSB7CisJZnJlZV9iYXNlX21lbW9yeV9ibG9ja190ICpmcmVlX2Jsb2NrID0gTlVMTDsKKworCS8qIFRyeSB0byByZWxlYXNlIG1lbW9yeSBiYWNrIHRvIHRoZSBCSU9TLiAgRnJlZSBhbGwKKwkgKiBjb25zZWN1dGl2ZSBibG9ja3MgbWFya2VkIGFzIGZyZWUuCisJICovCisJd2hpbGUgKCAxICkgeworCQkvKiBDYWxjdWxhdGUgYWRkcmVzcyBvZiBuZXh0IHBvdGVudGlhbCBmcmVlIGJsb2NrICovCisJCWZyZWVfYmxvY2sgPSAoIGZyZWVfYmFzZV9tZW1vcnlfYmxvY2tfdCAqICkKKwkJCXBoeXNfdG9fdmlydCAoICpmYm1zIDw8IDEwICk7CisJCQorCQkvKiBTdG9wIHByb2Nlc3NpbmcgaWYgd2UncmUgYWxsIHRoZSB3YXkgdXAgdG8gNjQwSyBvcgorCQkgKiBpZiB0aGlzIGlzIG5vdCBhIGZyZWUgYmxvY2sKKwkJICovCisJCWlmICggKCAqZmJtcyA9PSBCQVNFX01FTU9SWV9NQVggKSB8fAorCQkgICAgICggZnJlZV9ibG9jay0+bWFnaWMgIT0gRlJFRV9CTE9DS19NQUdJQyApICkgeworCQkJYnJlYWs7CisJCX0KKworCQkvKiBSZXR1cm4gbWVtb3J5IHRvIEJJT1MgKi8KKwkJKmZibXMgKz0gZnJlZV9ibG9jay0+c2l6ZV9rYjsKKworI2lmZGVmIERFQlVHX0JBU0VNRU0KKwkJcHJpbnRmICggIkZyZWVkICVkIGtCIGJhc2UgbWVtb3J5LCAlZCBrQiBub3cgZnJlZVxuIiwKKwkJCSBmcmVlX2Jsb2NrLT5zaXplX2tiLCAqZmJtcyApOworCQkKKwkJLyogWmVybyBvdXQgZnJlZWQgYmxvY2suICBXZSBkbyB0aGlzIGluIGNhc2UKKwkJICogdGhlIGJsb2NrIGNvbnRhaW5lZCBhbnkgc3RydWN0dXJlcyB0aGF0CisJCSAqIG1pZ2h0IGJlIGxvY2F0ZWQgYnkgc2Nhbm5pbmcgdGhyb3VnaAorCQkgKiBtZW1vcnkuCisJCSAqLworCQltZW1zZXQgKCBmcmVlX2Jsb2NrLCAwLCBmcmVlX2Jsb2NrLT5zaXplX2tiIDw8IDEwICk7CisjZW5kaWYJCQkKKwl9CisKKwkvKiBBZGp1c3QgcmVhbCBtb2RlIHN0YWNrIHBvaW50ZXIgKi8KKwlhZGp1c3RfcmVhbF9tb2RlX3N0YWNrICgpOworfQorCmRpZmYgLU5hdXIgZ3J1Yi0wLjk3Lm9yaWcvbmV0Ym9vdC9iaWdfYnN3YXAuaCBncnViLTAuOTcvbmV0Ym9vdC9iaWdfYnN3YXAuaAotLS0gZ3J1Yi0wLjk3Lm9yaWcvbmV0Ym9vdC9iaWdfYnN3YXAuaAkxOTcwLTAxLTAxIDAwOjAwOjAwLjAwMDAwMDAwMCArMDAwMAorKysgZ3J1Yi0wLjk3L25ldGJvb3QvYmlnX2Jzd2FwLmgJMjAwNS0wOC0zMSAxOTowMzozNS4wMDAwMDAwMDAgKzAwMDAKQEAgLTAsMCArMSwxNyBAQAorI2lmbmRlZiBFVEhFUkJPT1RfQklHX0JTV0FQX0gKKyNkZWZpbmUgRVRIRVJCT09UX0JJR19CU1dBUF9ICisKKyNkZWZpbmUgbnRvaGwoeCkgCSh4KQorI2RlZmluZSBodG9ubCh4KSAJKHgpCisjZGVmaW5lIG50b2hzKHgpIAkoeCkKKyNkZWZpbmUgaHRvbnMoeCkgCSh4KQorI2RlZmluZSBjcHVfdG9fbGUzMih4KQlfX2Jzd2FwXzMyKHgpCisjZGVmaW5lIGNwdV90b19sZTE2KHgpCV9fYnN3YXBfMTYoeCkKKyNkZWZpbmUgY3B1X3RvX2JlMzIoeCkJKHgpCisjZGVmaW5lIGNwdV90b19iZTE2KHgpCSh4KQorI2RlZmluZSBsZTMyX3RvX2NwdSh4KQlfX2Jzd2FwXzMyKHgpCisjZGVmaW5lIGxlMTZfdG9fY3B1KHgpCV9fYnN3YXBfMTYoeCkKKyNkZWZpbmUgYmUzMl90b19jcHUoeCkJKHgpCisjZGVmaW5lIGJlMTZfdG9fY3B1KHgpCSh4KQorCisjZW5kaWYgLyogRVRIRVJCT09UX0JJR19CU1dBUF9IICovCmRpZmYgLU5hdXIgZ3J1Yi0wLjk3Lm9yaWcvbmV0Ym9vdC9ib290cC5oIGdydWItMC45Ny9uZXRib290L2Jvb3RwLmgKLS0tIGdydWItMC45Ny5vcmlnL25ldGJvb3QvYm9vdHAuaAkxOTcwLTAxLTAxIDAwOjAwOjAwLjAwMDAwMDAwMCArMDAwMAorKysgZ3J1Yi0wLjk3L25ldGJvb3QvYm9vdHAuaAkyMDA1LTA4LTMxIDE5OjAzOjM1LjAwMDAwMDAwMCArMDAwMApAQCAtMCwwICsxLDE4MiBAQAorI2lmbmRlZglfQk9PVFBfSAorI2RlZmluZQlfQk9PVFBfSAorCisjaW5jbHVkZSAiaWZfZXRoZXIuaCIKKyNpbmNsdWRlICJpcC5oIgorI2luY2x1ZGUgInVkcC5oIgorCisjaWZuZGVmCU1BWF9CT09UUF9SRVRSSUVTCisjZGVmaW5lIE1BWF9CT09UUF9SRVRSSUVTCTIwCisjZW5kaWYKKworI2lmZGVmCUFMVEVSTkFURV9ESENQX1BPUlRTXzEwNjdfMTA2OAorI3VuZGVmCU5PTl9TVEFOREFSRF9CT09UUF9TRVJWRVIKKyNkZWZpbmUJTk9OX1NUQU5EQVJEX0JPT1RQX1NFUlZFUgkxMDY3CisjdW5kZWYJTk9OX1NUQU5EQVJEX0JPT1RQX0NMSUVOVAorI2RlZmluZQlOT05fU1RBTkRBUkRfQk9PVFBfQ0xJRU5UCTEwNjgKKyNlbmRpZgorCisjaWZkZWYJTk9OX1NUQU5EQVJEX0JPT1RQX1NFUlZFUgorI2RlZmluZQlCT09UUF9TRVJWRVIJTk9OX1NUQU5EQVJEX0JPT1RQX1NFUlZFUgorI2Vsc2UKKyNkZWZpbmUgQk9PVFBfU0VSVkVSCTY3CisjZW5kaWYKKyNpZmRlZglOT05fU1RBTkRBUkRfQk9PVFBfQ0xJRU5UCisjZGVmaW5lCUJPT1RQX0NMSUVOVAlOT05fU1RBTkRBUkRfQk9PVFBfQ0xJRU5UCisjZWxzZQorI2RlZmluZSBCT09UUF9DTElFTlQJNjgKKyNlbmRpZgorCisjZGVmaW5lIEJPT1RQX1JFUVVFU1QJMQorI2RlZmluZSBCT09UUF9SRVBMWQkyCisKKyNkZWZpbmUgVEFHX0xFTihwKQkJKCooKHApKzEpKQorI2RlZmluZSBSRkMxNTMzX0NPT0tJRQkJOTksIDEzMCwgODMsIDk5CisjZGVmaW5lIFJGQzE1MzNfUEFECQkwCisjZGVmaW5lIFJGQzE1MzNfTkVUTUFTSwkJMQorI2RlZmluZSBSRkMxNTMzX1RJTUVPRkZTRVQJMgorI2RlZmluZSBSRkMxNTMzX0dBVEVXQVkJCTMKKyNkZWZpbmUgUkZDMTUzM19USU1FU0VSVkVSCTQKKyNkZWZpbmUgUkZDMTUzM19JRU4xMTZOUwk1CisjZGVmaW5lIFJGQzE1MzNfRE5TCQk2CisjZGVmaW5lIFJGQzE1MzNfTE9HU0VSVkVSCTcKKyNkZWZpbmUgUkZDMTUzM19DT09LSUVTRVJWRVIJOAorI2RlZmluZSBSRkMxNTMzX0xQUlNFUlZFUgk5CisjZGVmaW5lIFJGQzE1MzNfSU1QUkVTU1NFUlZFUgkxMAorI2RlZmluZSBSRkMxNTMzX1JFU09VUkNFU0VSVkVSCTExCisjZGVmaW5lIFJGQzE1MzNfSE9TVE5BTUUJMTIKKyNkZWZpbmUgUkZDMTUzM19CT09URklMRVNJWkUJMTMKKyNkZWZpbmUgUkZDMTUzM19NRVJJVERVTVBGSUxFCTE0CisjZGVmaW5lIFJGQzE1MzNfRE9NQUlOTkFNRQkxNQorI2RlZmluZSBSRkMxNTMzX1NXQVBTRVJWRVIJMTYKKyNkZWZpbmUgUkZDMTUzM19ST09UUEFUSAkxNworI2RlZmluZSBSRkMxNTMzX0VYVEVOU0lPTlBBVEgJMTgKKyNkZWZpbmUgUkZDMTUzM19JUEZPUldBUkRJTkcJMTkKKyNkZWZpbmUgUkZDMTUzM19JUFNPVVJDRVJPVVRJTkcJMjAKKyNkZWZpbmUgUkZDMTUzM19JUFBPTElDWUZJTFRFUgkyMQorI2RlZmluZSBSRkMxNTMzX0lQTUFYUkVBU1NFTUJMWQkyMgorI2RlZmluZSBSRkMxNTMzX0lQVFRMCQkyMworI2RlZmluZSBSRkMxNTMzX0lQTVRVCQkyNAorI2RlZmluZSBSRkMxNTMzX0lQTVRVUExBVEVBVQkyNQorI2RlZmluZSBSRkMxNTMzX0lOVE1UVQkJMjYKKyNkZWZpbmUgUkZDMTUzM19JTlRMT0NBTFNVQk5FVFMJMjcKKyNkZWZpbmUgUkZDMTUzM19JTlRCUk9BRENBU1QJMjgKKyNkZWZpbmUgUkZDMTUzM19JTlRJQ01QRElTQ09WRVIJMjkKKyNkZWZpbmUgUkZDMTUzM19JTlRJQ01QUkVTUE9ORAkzMAorI2RlZmluZSBSRkMxNTMzX0lOVFJPVVRFRElTQ09WRVIgMzEKKyNkZWZpbmUgUkZDMTUzM19JTlRST1VURVNPTElDSVQJMzIKKyNkZWZpbmUgUkZDMTUzM19JTlRTVEFUSUNST1VURVMJMzMKKyNkZWZpbmUgUkZDMTUzM19MTFRSQUlMRVJFTkNBUAkzNAorI2RlZmluZSBSRkMxNTMzX0xMQVJQQ0FDSEVUTU8JMzUKKyNkZWZpbmUgUkZDMTUzM19MTEVUSEVSTkVURU5DQVAJMzYKKyNkZWZpbmUgUkZDMTUzM19UQ1BUVEwJCTM3CisjZGVmaW5lIFJGQzE1MzNfVENQS0VFUEFMSVZFVE1PCTM4CisjZGVmaW5lIFJGQzE1MzNfVENQS0VFUEFMSVZFR0IJMzkKKyNkZWZpbmUgUkZDMTUzM19OSVNET01BSU4JNDAKKyNkZWZpbmUgUkZDMTUzM19OSVNTRVJWRVIJNDEKKyNkZWZpbmUgUkZDMTUzM19OVFBTRVJWRVIJNDIKKyNkZWZpbmUgUkZDMTUzM19WRU5ET1IJCTQzCisjZGVmaW5lIFJGQzE1MzNfTkJOUwkJNDQKKyNkZWZpbmUgUkZDMTUzM19OQkRECQk0NQorI2RlZmluZSBSRkMxNTMzX05CTlQJCTQ2CisjZGVmaW5lIFJGQzE1MzNfTkJTQ09QRQkJNDcKKyNkZWZpbmUgUkZDMTUzM19YRlMJCTQ4CisjZGVmaW5lIFJGQzE1MzNfWERNCQk0OQorI2lmbmRlZglOT19ESENQX1NVUFBPUlQKKyNkZWZpbmUgUkZDMjEzMl9SRVFfQUREUgk1MAorI2RlZmluZSBSRkMyMTMyX01TR19UWVBFCTUzCisjZGVmaW5lIFJGQzIxMzJfU1JWX0lECQk1NAorI2RlZmluZSBSRkMyMTMyX1BBUkFNX0xJU1QJNTUKKyNkZWZpbmUgUkZDMjEzMl9NQVhfU0laRQk1NworI2RlZmluZQlSRkMyMTMyX1ZFTkRPUl9DTEFTU19JRAk2MAorCisjZGVmaW5lIERIQ1BESVNDT1ZFUgkJMQorI2RlZmluZSBESENQT0ZGRVIJCTIKKyNkZWZpbmUgREhDUFJFUVVFU1QJCTMKKyNkZWZpbmUgREhDUEFDSwkJCTUKKyNlbmRpZgkvKiBOT19ESENQX1NVUFBPUlQgKi8KKworI2RlZmluZSBSRkMxNTMzX1ZFTkRPUl9NQUpPUgkwCisjZGVmaW5lIFJGQzE1MzNfVkVORE9SX01JTk9SCTAKKworI2RlZmluZSBSRkMxNTMzX1ZFTkRPUl9NQUdJQwkxMjgKKyNkZWZpbmUgUkZDMTUzM19WRU5ET1JfQUREUEFSTQkxMjkKKyNkZWZpbmUJUkZDMTUzM19WRU5ET1JfRVRIREVWCTEzMAorI2lmZGVmCUlNQUdFX0ZSRUVCU0QKKyNkZWZpbmUgUkZDMTUzM19WRU5ET1JfSE9XVE8gICAgMTMyCisjZGVmaW5lIFJGQzE1MzNfVkVORE9SX0tFUk5FTF9FTlYgICAgMTMzCisjZW5kaWYKKyNkZWZpbmUgUkZDMTUzM19WRU5ET1JfRVRIRVJCT09UX0VOQ0FQIDE1MAorI2RlZmluZSBSRkMxNTMzX1ZFTkRPUl9NTlVPUFRTCTE2MAorI2RlZmluZSBSRkMxNTMzX1ZFTkRPUl9OSUNfREVWX0lEIDE3NQorI2RlZmluZSBSRkMxNTMzX1ZFTkRPUl9TRUxFQ1RJT04gMTc2CisjZGVmaW5lIFJGQzE1MzNfVkVORE9SX0FSQ0ggICAgIDE3NworI2RlZmluZSBSRkMxNTMzX1ZFTkRPUl9NT1RECTE4NAorI2RlZmluZSBSRkMxNTMzX1ZFTkRPUl9OVU1PRk1PVEQgOAorI2RlZmluZSBSRkMxNTMzX1ZFTkRPUl9JTUcJMTkyCisjZGVmaW5lIFJGQzE1MzNfVkVORE9SX05VTU9GSU1HCTE2CisKKyNkZWZpbmUgUkZDMTUzM19WRU5ET1JfQ09ORklHRklMRSAxNTAKKworI2RlZmluZSBSRkMxNTMzX0VORAkJMjU1CisKKyNkZWZpbmUgQk9PVFBfVkVORE9SX0xFTgk2NAorCisjZGVmaW5lIERIQ1BfT1BUX0xFTgkJMzEyCisKKy8qIEZvcm1hdCBvZiBhIGJvb3RwIHBhY2tldCAqLworc3RydWN0IGJvb3RwX3QgeworCXVpbnQ4X3QgIGJwX29wOworCXVpbnQ4X3QgIGJwX2h0eXBlOworCXVpbnQ4X3QgIGJwX2hsZW47CisJdWludDhfdCAgYnBfaG9wczsKKwl1aW50MzJfdCBicF94aWQ7CisJdWludDE2X3QgYnBfc2VjczsKKwl1aW50MTZfdCB1bnVzZWQ7CisJaW5fYWRkciBicF9jaWFkZHI7CisJaW5fYWRkciBicF95aWFkZHI7CisJaW5fYWRkciBicF9zaWFkZHI7CisJaW5fYWRkciBicF9naWFkZHI7CisJdWludDhfdCAgYnBfaHdhZGRyWzE2XTsKKwl1aW50OF90ICBicF9zbmFtZVs2NF07CisJY2hhciAgICAgYnBfZmlsZVsxMjhdOworCXVpbnQ4X3QgIGJwX3ZlbmRbQk9PVFBfVkVORE9SX0xFTl07Cit9OworCitzdHJ1Y3QgZGhjcF90IHsKKwl1aW50OF90ICBicF9vcDsKKwl1aW50OF90ICBicF9odHlwZTsKKwl1aW50OF90ICBicF9obGVuOworCXVpbnQ4X3QgIGJwX2hvcHM7CisJdWludDMyX3QgYnBfeGlkOworCXVpbnQxNl90IGJwX3NlY3M7CisJdWludDE2X3QgYnBfZmxhZzsKKwlpbl9hZGRyIGJwX2NpYWRkcjsKKwlpbl9hZGRyIGJwX3lpYWRkcjsKKwlpbl9hZGRyIGJwX3NpYWRkcjsKKwlpbl9hZGRyIGJwX2dpYWRkcjsKKwl1aW50OF90ICBicF9od2FkZHJbMTZdOworCXVpbnQ4X3QgIGJwX3NuYW1lWzY0XTsKKwljaGFyICAgICBicF9maWxlWzEyOF07CisJdWludDhfdCAgYnBfdmVuZFtESENQX09QVF9MRU5dOworfTsKKworLyogRm9ybWF0IG9mIGEgYm9vdHAgSVAgcGFja2V0ICovCitzdHJ1Y3QgYm9vdHBpcF90Cit7CisJc3RydWN0IGlwaGRyIGlwOworCXN0cnVjdCB1ZHBoZHIgdWRwOworCXN0cnVjdCBib290cF90IGJwOworfTsKK3N0cnVjdCBkaGNwaXBfdAoreworCXN0cnVjdCBpcGhkciBpcDsKKwlzdHJ1Y3QgdWRwaGRyIHVkcDsKKwlzdHJ1Y3QgZGhjcF90IGJwOworfTsKKworI2RlZmluZSBNQVhfUkZDMTUzM19WRU5ETEVOIChFVEhfTUFYX01UVSAtIHNpemVvZihzdHJ1Y3QgYm9vdHBpcF90KSArIEJPT1RQX1ZFTkRPUl9MRU4pCisKKyNkZWZpbmUgQk9PVFBfREFUQV9BRERSICgmYm9vdHBfZGF0YSkKKworI2VuZGlmCS8qIF9CT09UUF9IICovCmRpZmYgLU5hdXIgZ3J1Yi0wLjk3Lm9yaWcvbmV0Ym9vdC9ieXRlc3dhcC5oIGdydWItMC45Ny9uZXRib290L2J5dGVzd2FwLmgKLS0tIGdydWItMC45Ny5vcmlnL25ldGJvb3QvYnl0ZXN3YXAuaAkxOTcwLTAxLTAxIDAwOjAwOjAwLjAwMDAwMDAwMCArMDAwMAorKysgZ3J1Yi0wLjk3L25ldGJvb3QvYnl0ZXN3YXAuaAkyMDA1LTA4LTMxIDE5OjAzOjM1LjAwMDAwMDAwMCArMDAwMApAQCAtMCwwICsxLDIwIEBACisjaWZuZGVmIEVUSEVSQk9PVF9CWVRFU1dBUF9ICisjZGVmaW5lIEVUSEVSQk9PVF9CWVRFU1dBUF9ICisKKyNpbmNsdWRlICJlbmRpYW4uaCIKKyNpbmNsdWRlICJpMzg2X2J5dGVzd2FwLmgiCisKKyNpZiBfX0JZVEVfT1JERVIgPT0gX19MSVRUTEVfRU5ESUFOCisjaW5jbHVkZSAibGl0dGxlX2Jzd2FwLmgiCisjZW5kaWYKKyNpZiBfX0JZVEVfT1JERVIgPT0gX19CSUdfRU5ESUFOCisjaW5jbHVkZSAiYmlnX2Jzd2FwLmgiCisjZW5kaWYKKworLyogTWFrZSByb3V0aW5lcyBhdmFpbGFibGUgdG8gYWxsICovCisjZGVmaW5lIHN3YXAzMih4KQlfX2Jzd2FwXzMyKHgpCisjZGVmaW5lIHN3YXAxNih4KQlfX2Jzd2FwXzE2KHgpCisjZGVmaW5lIGJzd2FwXzMyKHgpCV9fYnN3YXBfMzIoeCkKKyNkZWZpbmUgYnN3YXBfMTYoeCkJX19ic3dhcF8xNih4KQorCQorI2VuZGlmIC8qIEVUSEVSQk9PVF9CWVRFU1dBUF9IICovCmRpZmYgLU5hdXIgZ3J1Yi0wLjk3Lm9yaWcvbmV0Ym9vdC9jYXJkcy5oIGdydWItMC45Ny9uZXRib290L2NhcmRzLmgKLS0tIGdydWItMC45Ny5vcmlnL25ldGJvb3QvY2FyZHMuaAkyMDAzLTA3LTA5IDExOjQ1OjM3LjAwMDAwMDAwMCArMDAwMAorKysgZ3J1Yi0wLjk3L25ldGJvb3QvY2FyZHMuaAkxOTcwLTAxLTAxIDAwOjAwOjAwLjAwMDAwMDAwMCArMDAwMApAQCAtMSwxODMgKzAsMCBAQAotI2lmbmRlZglDQVJEU19ICi0jZGVmaW5lIENBUkRTX0gKLQotLyoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0Ci0gKiB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKi8KLQotI2luY2x1ZGUgIm5pYy5oIgotCi0vKiBPSywgdGhpcyBpcyBob3cgdGhlIFBDSSBzdXBwb3J0IGhhY2sgd29ya3M6ICBpZiBwY2kuaCBpcyBpbmNsdWRlZCBiZWZvcmUKLSAqIHRoaXMgZmlsZSBpcyBpbmNsdWRlZCwgYXNzdW1lIHRoYXQgdGhlIGRyaXZlciBzdXBwb3J0cyBQQ0kuICBUaGlzIG1lYW5zIHRoYXQKLSAqIHRoaXMgZmlsZSBpcyB1c3VhbGx5IGluY2x1ZGVkIGxhc3QuICAqLwotCi0jaWZkZWYJUENJX0gKLSNkZWZpbmUgUENJX0FSRyh4KSAseAotI2Vsc2UKLSNkZWZpbmUgUENJX0FSRyh4KQotI2VuZGlmCi0KLSNpZmRlZglJTkNMVURFX1dECi1leHRlcm4gc3RydWN0IG5pYwkqd2RfcHJvYmUoc3RydWN0IG5pYyAqLCB1bnNpZ25lZCBzaG9ydCAqCi0JUENJX0FSRyhzdHJ1Y3QgcGNpX2RldmljZSAqKSk7Ci0jZW5kaWYKLQotI2lmZGVmCUlOQ0xVREVfM0M1MDMKLWV4dGVybiBzdHJ1Y3QgbmljCSp0NTAzX3Byb2JlKHN0cnVjdCBuaWMgKiwgdW5zaWduZWQgc2hvcnQgKgotCVBDSV9BUkcoc3RydWN0IHBjaV9kZXZpY2UgKikpOwotI2VuZGlmCi0KLSNpZmRlZglJTkNMVURFX1ZJQV9SSElORQotZXh0ZXJuIHN0cnVjdCBuaWMJKnJoaW5lX3Byb2JlKHN0cnVjdCBuaWMgKiwgdW5zaWduZWQgc2hvcnQgKgotCVBDSV9BUkcoc3RydWN0IHBjaV9kZXZpY2UgKikpOwotI2VuZGlmCi0KLSNpZmRlZglJTkNMVURFX05FCi1leHRlcm4gc3RydWN0IG5pYwkqbmVfcHJvYmUoc3RydWN0IG5pYyAqLCB1bnNpZ25lZCBzaG9ydCAqCi0JUENJX0FSRyhzdHJ1Y3QgcGNpX2RldmljZSAqKSk7Ci0jZW5kaWYKLQotI2lmZGVmCUlOQ0xVREVfTlM4MzkwCi1leHRlcm4gc3RydWN0IG5pYwkqbmVwY2lfcHJvYmUoc3RydWN0IG5pYyAqLCB1bnNpZ25lZCBzaG9ydCAqCi0JUENJX0FSRyhzdHJ1Y3QgcGNpX2RldmljZSAqKSk7Ci0jZW5kaWYKLQotI2lmZGVmCUlOQ0xVREVfM0M1MDkKLWV4dGVybiBzdHJ1Y3QgbmljCSp0NTA5X3Byb2JlKHN0cnVjdCBuaWMgKiwgdW5zaWduZWQgc2hvcnQgKgotCVBDSV9BUkcoc3RydWN0IHBjaV9kZXZpY2UgKikpOwotI2VuZGlmCi0KLSNpZmRlZglJTkNMVURFXzNDNTI5Ci1leHRlcm4gc3RydWN0IG5pYwkqdDUyOV9wcm9iZShzdHJ1Y3QgbmljICosIHVuc2lnbmVkIHNob3J0ICoKLQlQQ0lfQVJHKHN0cnVjdCBwY2lfZGV2aWNlICopKTsKLSNlbmRpZgotCi0jaWZkZWYJSU5DTFVERV8zQzU5NQotZXh0ZXJuIHN0cnVjdCBuaWMJKnQ1OTVfcHJvYmUoc3RydWN0IG5pYyAqLCB1bnNpZ25lZCBzaG9ydCAqCi0JUENJX0FSRyhzdHJ1Y3QgcGNpX2RldmljZSAqKSk7Ci0jZW5kaWYKLQotI2lmZGVmCUlOQ0xVREVfM0M5MFgKLWV4dGVybiBzdHJ1Y3QgbmljCSphM2M5MHhfcHJvYmUoc3RydWN0IG5pYyAqLCB1bnNpZ25lZCBzaG9ydCAqCi0JUENJX0FSRyhzdHJ1Y3QgcGNpX2RldmljZSAqKSk7Ci0jZW5kaWYKLQotI2lmZGVmCUlOQ0xVREVfRUVQUk8KLWV4dGVybiBzdHJ1Y3QgbmljCSplZXByb19wcm9iZShzdHJ1Y3QgbmljICosIHVuc2lnbmVkIHNob3J0ICoKLQlQQ0lfQVJHKHN0cnVjdCBwY2lfZGV2aWNlICopKTsKLSNlbmRpZgotCi0jaWZkZWYJSU5DTFVERV9FRVBSTzEwMAotZXh0ZXJuIHN0cnVjdCBuaWMJKmVlcHJvMTAwX3Byb2JlKHN0cnVjdCBuaWMgKiwgdW5zaWduZWQgc2hvcnQgKgotCVBDSV9BUkcoc3RydWN0IHBjaV9kZXZpY2UgKikpOwotI2VuZGlmCi0KLSNpZmRlZglJTkNMVURFX0VQSUMxMDAKLWV4dGVybiBzdHJ1Y3QgbmljCSplcGljMTAwX3Byb2JlKHN0cnVjdCBuaWMgKiwgdW5zaWduZWQgc2hvcnQgKgotCVBDSV9BUkcoc3RydWN0IHBjaV9kZXZpY2UgKikpOwotI2VuZGlmCi0KLSNpZmRlZglJTkNMVURFX09UVUxJUAotZXh0ZXJuIHN0cnVjdCBuaWMJKm90dWxpcF9wcm9iZShzdHJ1Y3QgbmljICosIHVuc2lnbmVkIHNob3J0ICoKLQlQQ0lfQVJHKHN0cnVjdCBwY2lfZGV2aWNlICopKTsKLSNlbmRpZgotCi0jaWZkZWYJSU5DTFVERV9UVUxJUAotZXh0ZXJuIHN0cnVjdCBuaWMJKnR1bGlwX3Byb2JlKHN0cnVjdCBuaWMgKiwgdW5zaWduZWQgc2hvcnQgKgotCVBDSV9BUkcoc3RydWN0IHBjaV9kZXZpY2UgKikpOwotI2VuZGlmCi0KLSNpZmRlZglJTkNMVURFX0RBVklDT00KLWV4dGVybiBzdHJ1Y3QgbmljCSpkYXZpY29tX3Byb2JlKHN0cnVjdCBuaWMgKiwgdW5zaWduZWQgc2hvcnQgKgotCVBDSV9BUkcoc3RydWN0IHBjaV9kZXZpY2UgKikpOwotI2VuZGlmCi0KLSNpZmRlZglJTkNMVURFX0NTODlYMAotZXh0ZXJuIHN0cnVjdCBuaWMJKmNzODl4MF9wcm9iZShzdHJ1Y3QgbmljICosIHVuc2lnbmVkIHNob3J0ICoKLQlQQ0lfQVJHKHN0cnVjdCBwY2lfZGV2aWNlICopKTsKLSNlbmRpZgotCi0jaWZkZWYJSU5DTFVERV9MQU5DRQotZXh0ZXJuIHN0cnVjdCBuaWMJKmxhbmNlcGNpX3Byb2JlKHN0cnVjdCBuaWMgKiwgdW5zaWduZWQgc2hvcnQgKgotCVBDSV9BUkcoc3RydWN0IHBjaV9kZXZpY2UgKikpOwotI2VuZGlmCi0KLSNpZmRlZglJTkNMVURFX05FMjEwMAotZXh0ZXJuIHN0cnVjdCBuaWMJKm5lMjEwMF9wcm9iZShzdHJ1Y3QgbmljICosIHVuc2lnbmVkIHNob3J0ICoKLQlQQ0lfQVJHKHN0cnVjdCBwY2lfZGV2aWNlICopKTsKLSNlbmRpZgotCi0jaWZkZWYJSU5DTFVERV9OSTY1MTAKLWV4dGVybiBzdHJ1Y3QgbmljCSpuaTY1MTBfcHJvYmUoc3RydWN0IG5pYyAqLCB1bnNpZ25lZCBzaG9ydCAqCi0JUENJX0FSRyhzdHJ1Y3QgcGNpX2RldmljZSAqKSk7Ci0jZW5kaWYKLQotI2lmZGVmCUlOQ0xVREVfU0tfRzE2Ci1leHRlcm4gc3RydWN0IG5pYwkqU0tfcHJvYmUoc3RydWN0IG5pYyAqLCB1bnNpZ25lZCBzaG9ydCAqCi0JUENJX0FSRyhzdHJ1Y3QgcGNpX2RldmljZSAqKSk7Ci0jZW5kaWYKLQotI2lmZGVmCUlOQ0xVREVfM0M1MDcKLWV4dGVybiBzdHJ1Y3QgbmljCSp0NTA3X3Byb2JlKHN0cnVjdCBuaWMgKiwgdW5zaWduZWQgc2hvcnQgKgotCVBDSV9BUkcoc3RydWN0IHBjaV9kZXZpY2UgKikpOwotI2VuZGlmCi0KLSNpZmRlZglJTkNMVURFX05JNTAxMAotZXh0ZXJuIHN0cnVjdCBuaWMJKm5pNTAxMF9wcm9iZShzdHJ1Y3QgbmljICosIHVuc2lnbmVkIHNob3J0ICoKLQlQQ0lfQVJHKHN0cnVjdCBwY2lfZGV2aWNlICopKTsKLSNlbmRpZgotCi0jaWZkZWYJSU5DTFVERV9OSTUyMTAKLWV4dGVybiBzdHJ1Y3QgbmljCSpuaTUyMTBfcHJvYmUoc3RydWN0IG5pYyAqLCB1bnNpZ25lZCBzaG9ydCAqCi0JUENJX0FSRyhzdHJ1Y3QgcGNpX2RldmljZSAqKSk7Ci0jZW5kaWYKLQotI2lmZGVmCUlOQ0xVREVfRVhPUzIwNQotZXh0ZXJuIHN0cnVjdCBuaWMJKmV4b3MyMDVfcHJvYmUoc3RydWN0IG5pYyAqLCB1bnNpZ25lZCBzaG9ydCAqCi0JUENJX0FSRyhzdHJ1Y3QgcGNpX2RldmljZSAqKSk7Ci0jZW5kaWYKLQotI2lmZGVmCUlOQ0xVREVfU01DOTAwMAotZXh0ZXJuIHN0cnVjdCBuaWMJKnNtYzkwMDBfcHJvYmUoc3RydWN0IG5pYyAqLCB1bnNpZ25lZCBzaG9ydCAqCi0JUENJX0FSRyhzdHJ1Y3QgcGNpX2RldmljZSAqKSk7Ci0jZW5kaWYKLQotI2lmZGVmCUlOQ0xVREVfVElBUkEKLWV4dGVybiBzdHJ1Y3QgbmljCSp0aWFyYV9wcm9iZShzdHJ1Y3QgbmljICosIHVuc2lnbmVkIHNob3J0ICoKLQlQQ0lfQVJHKHN0cnVjdCBwY2lfZGV2aWNlICopKTsKLSNlbmRpZgotCi0jaWZkZWYJSU5DTFVERV9ERVBDQQotZXh0ZXJuIHN0cnVjdCBuaWMJKmRlcGNhX3Byb2JlKHN0cnVjdCBuaWMgKiwgdW5zaWduZWQgc2hvcnQgKgotCVBDSV9BUkcoc3RydWN0IHBjaV9kZXZpY2UgKikpOwotI2VuZGlmCi0KLSNpZmRlZglJTkNMVURFX1JUTDgxMzkKLWV4dGVybiBzdHJ1Y3QgbmljCSpydGw4MTM5X3Byb2JlKHN0cnVjdCBuaWMgKiwgdW5zaWduZWQgc2hvcnQgKgotCVBDSV9BUkcoc3RydWN0IHBjaV9kZXZpY2UgKikpOwotI2VuZGlmCi0KLSNpZmRlZglJTkNMVURFX1c4OUM4NDAKLWV4dGVybiBzdHJ1Y3QgbmljCSp3ODljODQwX3Byb2JlKHN0cnVjdCBuaWMgKiwgdW5zaWduZWQgc2hvcnQgKgotCVBDSV9BUkcoc3RydWN0IHBjaV9kZXZpY2UgKikpOwotI2VuZGlmCi0KLSNpZmRlZglJTkNMVURFX1NJUzkwMAotZXh0ZXJuIHN0cnVjdCBuaWMJKnNpczkwMF9wcm9iZShzdHJ1Y3QgbmljICosIHVuc2lnbmVkIHNob3J0ICoKLSAgICAgICAgUENJX0FSRyhzdHJ1Y3QgcGNpX2RldmljZSAqKSk7Ci0jZW5kaWYKLQotI2lmZGVmCUlOQ0xVREVfTkFUU0VNSQotZXh0ZXJuIHN0cnVjdCBuaWMJKm5hdHNlbWlfcHJvYmUoc3RydWN0IG5pYyAqLCB1bnNpZ25lZCBzaG9ydCAqCi0gICAgICAgIFBDSV9BUkcoc3RydWN0IHBjaV9kZXZpY2UgKikpOwotI2VuZGlmCi0KLSNpZmRlZglJTkNMVURFX1RMQU4KLWV4dGVybiBzdHJ1Y3QgbmljCSp0bGFuX3Byb2JlKHN0cnVjdCBuaWMgKiwgdW5zaWduZWQgc2hvcnQgKgotICAgICAgICBQQ0lfQVJHKHN0cnVjdCBwY2lfZGV2aWNlICopKTsKLSNlbmRpZgotCi0jZW5kaWYJLyogQ0FSRFNfSCAqLwpkaWZmIC1OYXVyIGdydWItMC45Ny5vcmlnL25ldGJvb3QvY29uZmlnLmMgZ3J1Yi0wLjk3L25ldGJvb3QvY29uZmlnLmMKLS0tIGdydWItMC45Ny5vcmlnL25ldGJvb3QvY29uZmlnLmMJMjAwMy0wNy0wOSAxMTo0NTozNy4wMDAwMDAwMDAgKzAwMDAKKysrIGdydWItMC45Ny9uZXRib290L2NvbmZpZy5jCTIwMDUtMDgtMzEgMTk6MDM6MzUuMDAwMDAwMDAwICswMDAwCkBAIC0xLDU5OCArMSwxNjUgQEAKIC8qCi0gKiAgR1JVQiAgLS0gIEdSYW5kIFVuaWZpZWQgQm9vdGxvYWRlcgotICogIENvcHlyaWdodCAoQykgMjAwMSwyMDAyICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAqCi0gKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gKiAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgotICovCi0KLS8qIEJhc2VkIG9uICJzcmMvY29uZmlnLmMiIGluIGV0aGVyYm9vdC01LjAuNS4gICovCi0KLS8qCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwogICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdAogICogeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogICovCiAKLSNkZWZpbmUgR1JVQgkxCi0jaW5jbHVkZSA8ZXRoZXJib290Lmg+Ci0jaW5jbHVkZSA8bmljLmg+CisjaW5jbHVkZQkiZ3J1Yi5oIgorI2luY2x1ZGUJInBjaS5oIgorI2luY2x1ZGUJImlzYS5oIgorI2luY2x1ZGUJIm5pYy5oIgogCi0jdW5kZWYJSU5DTFVERV9QQ0kKLSNpZglkZWZpbmVkKElOQ0xVREVfTlM4MzkwKSB8fCBkZWZpbmVkKElOQ0xVREVfRUVQUk8xMDApIHx8IGRlZmluZWQoSU5DTFVERV9MQU5DRSkgfHwgZGVmaW5lZChJTkNMVURFX0VQSUMxMDApIHx8IGRlZmluZWQoSU5DTFVERV9UVUxJUCkgfHwgZGVmaW5lZChJTkNMVURFX09UVUxJUCkgfHwgZGVmaW5lZChJTkNMVURFXzNDOTBYKSB8fCAgZGVmaW5lZChJTkNMVURFXzNDNTk1KSB8fCBkZWZpbmVkKElOQ0xVREVfUlRMODEzOSkgfHwgZGVmaW5lZChJTkNMVURFX1ZJQV9SSElORSkgfHwgZGVmaW5lZChJTkNMVURFX1c4OUM4NDApIHx8IGRlZmluZWQoSU5DTFVERV9EQVZJQ09NKSB8fCBkZWZpbmVkKElOQ0xVREVfU0lTOTAwKSB8fCBkZWZpbmVkKElOQ0xVREVfTkFUU0VNSSkgfHwgZGVmaW5lZChJTkNMVURFX1RMQU4pCi0JLyogfHwgb3RoZXJzIGxhdGVyICovCi0jIGRlZmluZSBJTkNMVURFX1BDSQotIyBpbmNsdWRlIDxwY2kuaD4KLXN0YXRpYyB1bnNpZ25lZCBzaG9ydCBwY2lfaW9hZGRyc1sxNl07Ci0KLXN0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZSBwY2lfbmljX2xpc3RbXSA9CisjaWZkZWYgQ09ORklHX1BDSQorc3RhdGljIGludCBwY2lfcHJvYmUoc3RydWN0IGRldiAqZGV2LCBjb25zdCBjaGFyICp0eXBlX25hbWUpCiB7Ci0jaWZkZWYJSU5DTFVERV9OUzgzOTAKLSAgeyBQQ0lfVkVORE9SX0lEX1JFQUxURUssCVBDSV9ERVZJQ0VfSURfUkVBTFRFS184MDI5LAotICAgICJSZWFsdGVrIDgwMjkiLCAwLCAwLCAwLCAwfSwKLSAgeyBQQ0lfVkVORE9SX0lEX1dJTkJPTkQyLAlQQ0lfREVWSUNFX0lEX1dJTkJPTkQyXzg5Qzk0MCwKLSAgICAiV2luYm9uZCBORTIwMDAtUENJIiwgMCwgMCwgMCwgMH0sCi0gIHsgUENJX1ZFTkRPUl9JRF9DT01QRVgsCVBDSV9ERVZJQ0VfSURfQ09NUEVYX1JMMjAwMCwKLSAgICAiQ29tcGV4IFJlYWR5TGluayAyMDAwIiwgMCwgMCwgMCwgMH0sCi0gIHsgUENJX1ZFTkRPUl9JRF9LVEksCQlQQ0lfREVWSUNFX0lEX0tUSV9FVDMyUDIsCi0gICAgIktUSSBFVDMyUDIiLCAwLCAwLCAwLCAwfSwKLSAgeyBQQ0lfVkVORE9SX0lEX05FVFZJTiwJUENJX0RFVklDRV9JRF9ORVRWSU5fTlY1MDAwU0MsCi0gICAgIk5ldFZpbiBOVjUwMDBTQyIsIDAsIDAsIDAsIDB9LAotICB7IFBDSV9WRU5ET1JfSURfSE9MVEVLLAlQQ0lfREVWSUNFX0lEX0hPTFRFS19IVDgwMjMyLAotICAgICJIb2x0ZWsgSFQ4MDIzMiIsIDAsIDAsIDAsIDB9LAotI2VuZGlmCi0jaWZkZWYJSU5DTFVERV8zQzkwWAotICB7IFBDSV9WRU5ET1JfSURfM0NPTSwJCVBDSV9ERVZJQ0VfSURfM0NPTV8zQzkwMFRQTywKLSAgICAiM0NvbTkwMC1UUE8iLCAwLCAwLCAwLCAwfSwKLSAgeyBQQ0lfVkVORE9SX0lEXzNDT00sCQlQQ0lfREVWSUNFX0lEXzNDT01fM0M5MDBDT01CTywKLSAgICAiM0NvbTkwMC1Db21ibyIsIDAsIDAsIDAsIDB9LAotICB7IFBDSV9WRU5ET1JfSURfM0NPTSwJCVBDSV9ERVZJQ0VfSURfM0NPTV8zQzkwNVRYLAotICAgICIzQ29tOTA1LVRYIiwgMCwgMCwgMCwgMH0sCi0gIHsgUENJX1ZFTkRPUl9JRF8zQ09NLAkJUENJX0RFVklDRV9JRF8zQ09NXzNDOTA1VDQsCi0gICAgIjNDb205MDUtVDQiLCAwLCAwLCAwLCAwfSwKLSAgeyBQQ0lfVkVORE9SX0lEXzNDT00sCQkweDkwMDQsCi0gICAgIjNDb205MDBCLVRQTyIsIDAsIDAsIDAsIDB9LAotICB7IFBDSV9WRU5ET1JfSURfM0NPTSwJCTB4OTAwNSwKLSAgICAiM0NvbTkwMEItQ29tYm8iLCAwLCAwLCAwLCAwfSwKLSAgeyBQQ0lfVkVORE9SX0lEXzNDT00sCQkweDkwMDYsCi0gICAgIjNDb205MDBCLTIvVCIsIDAsIDAsIDAsIDB9LAotICB7IFBDSV9WRU5ET1JfSURfM0NPTSwJCTB4OTAwQSwKLSAgICAiM0NvbTkwMEItRkwiLCAwLCAwLCAwLCAwfSwKLSAgeyBQQ0lfVkVORE9SX0lEXzNDT00sCQlQQ0lfREVWSUNFX0lEXzNDT01fM0M5MDVCX1RYLAotICAgICIzQ29tOTA1Qi1UWCIsIDAsIDAsIDAsIDB9LAotICB7IFBDSV9WRU5ET1JfSURfM0NPTSwJCTB4OTA1NiwKLSAgICAiM0NvbTkwNUItVDQiLCAwLCAwLCAwLCAwfSwKLSAgeyBQQ0lfVkVORE9SX0lEXzNDT00sCQkweDkwNUEsCi0gICAgIjNDb205MDVCLUZMIiwgMCwgMCwgMCwgMH0sCi0gIHsgUENJX1ZFTkRPUl9JRF8zQ09NLAkJUENJX0RFVklDRV9JRF8zQ09NXzNDOTA1Q19UWE0sCi0gICAgIjNDb205MDVDLVRYTSIsIDAsIDAsIDAsIDB9LAotICB7IFBDSV9WRU5ET1JfSURfM0NPTSwJCTB4OTgwMCwKLSAgICAiM0NvbTk4MC1DeWNsb25lIiwgMCwgMCwgMCwgMH0sCi0gIHsgUENJX1ZFTkRPUl9JRF8zQ09NLAkJMHg5ODA1LAotICAgICIzQ29tOTgwNSIsIDAsIDAsIDAsIDB9LAotICB7IFBDSV9WRU5ET1JfSURfM0NPTSwJCTB4NzY0NiwKLSAgICAiM0NTT0hPMTAwLVRYIiwgMCwgMCwgMCwgMH0sCi0jZW5kaWYKLSNpZmRlZglJTkNMVURFXzNDNTk1Ci0gIHsgUENJX1ZFTkRPUl9JRF8zQ09NLAkJUENJX0RFVklDRV9JRF8zQ09NXzNDNTkwLAotICAgICIzQ29tNTkwIiwgMCwgMCwgMCwgMH0sCi0gIHsgUENJX1ZFTkRPUl9JRF8zQ09NLAkJUENJX0RFVklDRV9JRF8zQ09NXzNDNTk1LAotICAgICIzQ29tNTk1IiwgMCwgMCwgMCwgMH0sCi0gIHsgUENJX1ZFTkRPUl9JRF8zQ09NLAkJUENJX0RFVklDRV9JRF8zQ09NXzNDNTk1XzEsCi0gICAgIjNDb201OTUiLCAwLCAwLCAwLCAwfSwKLSAgeyBQQ0lfVkVORE9SX0lEXzNDT00sCQlQQ0lfREVWSUNFX0lEXzNDT01fM0M1OTVfMiwKLSAgICAiM0NvbTU5NSIsIDAsIDAsIDAsIDB9LAotICB7IFBDSV9WRU5ET1JfSURfM0NPTSwJCVBDSV9ERVZJQ0VfSURfM0NPTV8zQzkwMFRQTywKLSAgICAiM0NvbTkwMC1UUE8iLCAwLCAwLCAwLCAwfSwKLSAgeyBQQ0lfVkVORE9SX0lEXzNDT00sCQlQQ0lfREVWSUNFX0lEXzNDT01fM0M5MDBDT01CTywKLSAgICAiM0NvbTkwMC1Db21ibyIsIDAsIDAsIDAsIDB9LAotICB7IFBDSV9WRU5ET1JfSURfM0NPTSwJCTB4OTAwNCwKLSAgICAiM0NvbTkwMEItVFBPIiwgMCwgMCwgMCwgMH0sCi0gIHsgUENJX1ZFTkRPUl9JRF8zQ09NLAkJMHg5MDA1LAotICAgICIzQ29tOTAwQi1Db21ibyIsIDAsIDAsIDAsIDB9LAotICB7IFBDSV9WRU5ET1JfSURfM0NPTSwJCTB4OTAwNiwKLSAgICAiM0NvbTkwMEItMi9UIiwgMCwgMCwgMCwgMH0sCi0gIHsgUENJX1ZFTkRPUl9JRF8zQ09NLAkJMHg5MDBBLAotICAgICIzQ29tOTAwQi1GTCIsIDAsIDAsIDAsIDB9LAotICB7IFBDSV9WRU5ET1JfSURfM0NPTSwJCTB4OTgwMCwKLSAgICAiM0NvbTk4MC1DeWNsb25lIiwgMCwgMCwgMCwgMH0sCi0gIHsgUENJX1ZFTkRPUl9JRF8zQ09NLAkJMHg5ODA1LAotICAgICIzQ29tOTgwNSIsIDAsIDAsIDAsIDB9LAotICB7IFBDSV9WRU5ET1JfSURfM0NPTSwJCTB4NzY0NiwKLSAgICAiM0NTT0hPMTAwLVRYIiwgMCwgMCwgMCwgMH0sCi0jZW5kaWYKLSNpZmRlZglJTkNMVURFX0VFUFJPMTAwCi0gIHsgUENJX1ZFTkRPUl9JRF9JTlRFTCwJUENJX0RFVklDRV9JRF9JTlRFTF84MjU1NywKLSAgICAiSW50ZWwgRXRoZXJFeHByZXNzUHJvMTAwIiwgMCwgMCwgMCwgMH0sCi0gIHsgUENJX1ZFTkRPUl9JRF9JTlRFTCwJUENJX0RFVklDRV9JRF9JTlRFTF84MjU1OUVSLAotICAgICJJbnRlbCBFdGhlckV4cHJlc3NQcm8xMDAgODI1NTlFUiIsIDAsIDAsIDAsIDB9LAotICB7IFBDSV9WRU5ET1JfSURfSU5URUwsCVBDSV9ERVZJQ0VfSURfSU5URUxfSUQxMDI5LAotICAgICJJbnRlbCBFdGhlckV4cHJlc3NQcm8xMDAgSUQxMDI5IiwgMCwgMCwgMCwgMH0sCi0gIHsgUENJX1ZFTkRPUl9JRF9JTlRFTCwJUENJX0RFVklDRV9JRF9JTlRFTF9JRDEwMzAsCi0gICAgIkludGVsIENvcnBvcmF0aW9uIDgyNTU5IEluQnVzaW5lc3MgMTAvMTAwIiwgMCwgMCwgMCwgMH0sCi0gIHsgUENJX1ZFTkRPUl9JRF9JTlRFTCwJUENJX0RFVklDRV9JRF9JTlRFTF84MjU2MiwKLSAgICAiSW50ZWwgRXRoZXJFeHByZXNzUHJvMTAwIDgyNTYyRU0iLCAwLCAwLCAwLCAwfSwKLSNlbmRpZgotI2lmZGVmCUlOQ0xVREVfRVBJQzEwMAotICB7IFBDSV9WRU5ET1JfSURfU01DLAkJUENJX0RFVklDRV9JRF9TTUNfRVBJQzEwMCwKLSAgICAiU01DIEV0aGVyUG93ZXJJSSIsIDAsIDAsIDAsIDB9LAotI2VuZGlmCi0jaWZkZWYJSU5DTFVERV9MQU5DRQotICB7IFBDSV9WRU5ET1JfSURfQU1ELAkJUENJX0RFVklDRV9JRF9BTURfTEFOQ0UsCi0gICAgIkFNRCBMYW5jZS9QQ0kiLCAwLCAwLCAwLCAwfSwKLSAgeyBQQ0lfVkVORE9SX0lEX0FNRF9IT01FUE5BLAlQQ0lfREVWSUNFX0lEX0FNRF9IT01FUE5BLAotICAgICJBTUQgTGFuY2UvSG9tZVBOQSIsIDAsIDAsIDAsIDB9LAotI2VuZGlmCi0jaWZkZWYJSU5DTFVERV9SVEw4MTM5Ci0gIHsgUENJX1ZFTkRPUl9JRF9SRUFMVEVLLAlQQ0lfREVWSUNFX0lEX1JFQUxURUtfODEzOSwKLSAgICAiUmVhbHRlayA4MTM5IiwgMCwgMCwgMCwgMH0sCi0gIHsgUENJX1ZFTkRPUl9JRF9ETElOSywJUENJX0RFVklDRV9JRF9ERkU1MzBUWFAsCi0gICAgIkRGRTUzMFRYKy9ERkU1MzhUWCIsIDAsIDAsIDAsIDB9LAotICB7IFBDSV9WRU5ET1JfSURfU01DXzEyMTEsCVBDSV9ERVZJQ0VfSURfU01DXzEyMTEsCi0gICAgIlNNQyBFWjEwLzEwMCIsIDAsIDAsIDAsIDB9LAotI2VuZGlmCi0jaWZkZWYJSU5DTFVERV9PVFVMSVAKLSAgeyBQQ0lfVkVORE9SX0lEX0RFQywJCVBDSV9ERVZJQ0VfSURfREVDX1RVTElQLAotICAgICJEaWdpdGFsIFR1bGlwIiwgMCwgMCwgMCwgMH0sCi0gIHsgUENJX1ZFTkRPUl9JRF9ERUMsCQlQQ0lfREVWSUNFX0lEX0RFQ19UVUxJUF9GQVNULAotICAgICJEaWdpdGFsIFR1bGlwIEZhc3QiLCAwLCAwLCAwLCAwfSwKLSAgeyBQQ0lfVkVORE9SX0lEX0RFQywJCVBDSV9ERVZJQ0VfSURfREVDX1RVTElQX1BMVVMsCi0gICAgIkRpZ2l0YWwgVHVsaXArIiwgMCwgMCwgMCwgMH0sCi0gIHsgUENJX1ZFTkRPUl9JRF9ERUMsCQlQQ0lfREVWSUNFX0lEX0RFQ18yMTE0MiwKLSAgICAiRGlnaXRhbCBUdWxpcCAyMTE0MiIsIDAsIDAsIDAsIDB9LAotI2VuZGlmCi0jaWZkZWYJSU5DTFVERV9UVUxJUAotICB7IFBDSV9WRU5ET1JfSURfREVDLAkJUENJX0RFVklDRV9JRF9ERUNfVFVMSVAsCi0gICAgIkRpZ2l0YWwgVHVsaXAiLCAwLCAwLCAwLCAwfSwKLSAgeyBQQ0lfVkVORE9SX0lEX0RFQywJCVBDSV9ERVZJQ0VfSURfREVDX1RVTElQX0ZBU1QsCi0gICAgIkRpZ2l0YWwgVHVsaXAgRmFzdCIsIDAsIDAsIDAsIDB9LAotICB7IFBDSV9WRU5ET1JfSURfREVDLAkJUENJX0RFVklDRV9JRF9ERUNfVFVMSVBfUExVUywKLSAgICAiRGlnaXRhbCBUdWxpcCsiLCAwLCAwLCAwLCAwfSwKLSAgeyBQQ0lfVkVORE9SX0lEX0RFQywJCVBDSV9ERVZJQ0VfSURfREVDXzIxMTQyLAotICAgICJEaWdpdGFsIFR1bGlwIDIxMTQyIiwgMCwgMCwgMCwgMH0sCi0gIHsgUENJX1ZFTkRPUl9JRF9NQUNST05JWCwJUENJX0RFVklDRV9JRF9NWDk4N3g1LAotICAgICJNYWNyb25peCBNWDk4N3g1IiwgMCwgMCwgMCwgMH0sCi0gIHsgUENJX1ZFTkRPUl9JRF9MSU5LU1lTLAlQQ0lfREVWSUNFX0lEX0xDODJDMTE1LAotICAgICJMaW5rU3lzIExORTEwMFRYIiwgMCwgMCwgMCwgMH0sCi0gIHsgUENJX1ZFTkRPUl9JRF9MSU5LU1lTLAlQQ0lfREVWSUNFX0lEX0RFQ19UVUxJUCwKLSAgICAiTmV0Z2VhciBGQTMxMFRYIiwgMCwgMCwgMCwgMH0sCi0gIHsgUENJX1ZFTkRPUl9JRF9EQVZJQ09NLAlQQ0lfREVWSUNFX0lEX0RNOTEwMiwKLSAgICAiRGF2aWNvbSA5MTAyIiwgMCwgMCwgMCwgMH0sCi0gIHsgUENJX1ZFTkRPUl9JRF9EQVZJQ09NLAlQQ0lfREVWSUNFX0lEX0RNOTAwOSwKLSAgICAiRGF2aWNvbSA5MDA5IiwgMCwgMCwgMCwgMH0sCi0gIHsgUENJX1ZFTkRPUl9JRF9BRE1URUssCVBDSV9ERVZJQ0VfSURfQURNVEVLXzA5ODUsCi0gICAgIkFETXRlayBDZW50YXVyLVAiLCAwLCAwLCAwLCAwfSwKLSAgeyBQQ0lfVkVORE9SX0lEX0FETVRFSywJMHgwOTgxLAotICAgICJBRE10ZWsgQU45ODEgQ29tZXQiLCAwLCAwLCAwLCAwfSwKLSAgeyAweDEyNUIsCQkJMHgxNDAwLAotICAgICJBU0lYIEFYODgxNDAiLCAwLCAwLCAwLCAwIH0sCi0gIHsgMHgxMUY2LAkJCTB4OTg4MSwKLSAgICAiQ29tcGV4IFJMMTAwLVRYIiwgMCwgMCwgMCwgMCB9LAotI2VuZGlmCi0jaWZkZWYJSU5DTFVERV9EQVZJQ09NCi0gIHsgUENJX1ZFTkRPUl9JRF9EQVZJQ09NLAlQQ0lfREVWSUNFX0lEX0RNOTEwMiwKLSAgICAiRGF2aWNvbSA5MTAyIiwgMCwgMCwgMCwgMH0sCi0gIHsgUENJX1ZFTkRPUl9JRF9EQVZJQ09NLAlQQ0lfREVWSUNFX0lEX0RNOTAwOSwKLSAgICAiRGF2aWNvbSA5MDA5IiwgMCwgMCwgMCwgMH0sCi0jZW5kaWYKLSNpZmRlZglJTkNMVURFX1ZJQV9SSElORQotICB7IFBDSV9WRU5ET1JfSURfVklBVEVDLAlQQ0lfREVWSUNFX0lEX1ZJQV9WVDYxMDIsCi0gICAgIlZJQSA2MTAyIiwgMCwgMCwgMCwgMH0sCi0gIHsgUENJX1ZFTkRPUl9JRF9WSUFURUMsCVBDSV9ERVZJQ0VfSURfVklBX1JISU5FX0ksCi0gICAgIlZJQSAzMDQzIiwgMCwgMCwgMCwgMH0sCi0gIHsgUENJX1ZFTkRPUl9JRF9WSUFURUMsCVBDSV9ERVZJQ0VfSURfVklBXzg2QzEwMEEsCi0gICAgIlZJQSA4NkMxMDBBIiwgMCwgMCwgMCwgMH0sCi0jZW5kaWYKLSNpZmRlZglJTkNMVURFX1c4OUM4NDAKLSAgeyBQQ0lfVkVORE9SX0lEX1dJTkJPTkQyLAlQQ0lfREVWSUNFX0lEX1dJTkJPTkQyXzg5Qzg0MCwKLSAgICAiV2luYm9uZCBXODlDODQwRiIsIDAsIDAsIDAsIDB9LAotICB7IFBDSV9WRU5ET1JfSURfQ09NUEVYLAlQQ0lfREVWSUNFX0lEX0NPTVBFWF9STDEwMEFUWCwKLSAgICAiQ29tcGV4IFJMMTAwQVRYIiwgMCwgMCwgMCwgMH0sCi0jZW5kaWYKLSNpZmRlZiBJTkNMVURFX1NJUzkwMAotICB7IFBDSV9WRU5ET1JfSURfU0lTLCAgICAgCVBDSV9ERVZJQ0VfSURfU0lTOTAwLAotICAgICJTSVM5MDAiLCAwLCAwLCAwLCAwfSwKLSAgeyBQQ0lfVkVORE9SX0lEX1NJUywgICAgIAlQQ0lfREVWSUNFX0lEX1NJUzcwMTYsCi0gICAgIlNJUzcwMTYiLCAwLCAwLCAwLCAwfSwKLSNlbmRpZgotICAKLSNpZmRlZiBJTkNMVURFX05BVFNFTUkKLSAgeyBQQ0lfVkVORE9SX0lEX05TLAkgICAgIAlQQ0lfREVWSUNFX0lEX0RQODM4MTUsCi0gICAgIkRQODM4MTUiLCAwLCAwLCAwLCAwfSwKLSNlbmRpZgotICAKLSNpZmRlZiBJTkNMVURFX1RMQU4KLSAgeyBQQ0lfVkVORE9SX0lEX09MSUNPTSwJUENJX0RFVklDRV9JRF9PTElDT01fT0MyMzI2LAotICAgICJPQzIzMjYiLCAwLCAwLCAwLCAwfSwKKy8qCisgKglOSUMgcHJvYmluZyBpcyBpbiBwY2kgZGV2aWNlIG9yZGVyLCBmb2xsb3dlZCBieSB0aGUgCisgKiAgICAgIGxpbmsgb3JkZXIgb2YgdGhlIGRyaXZlcnMuICBBIGRyaXZlciB0aGF0IG1hdGNoZXMgCisgKiAgICAgIG9uIHZlbmRvciBhbmQgZGV2aWNlIGlkIHdpbGwgc3VwZXJzZWRlIGEgZHJpdmVyCisgKiAgICAgIHRoYXQgbWF0Y2hlcyBvbiBwY2kgY2xhc3MuCisgKgorICoJSWYgeW91IHdhbnQgdG8gcHJvYmUgZm9yIGFub3RoZXIgZGV2aWNlIGJlaGluZCB0aGUgc2FtZSBwY2kKKyAqICAgICAgZGV2aWNlIGp1c3QgaW5jcmVtZW50IGluZGV4LiAgQW5kIHRoZSBwcmV2aW91cyBwcm9iZSBjYWxsCisgKiAgICAgIHdpbGwgYmUgcmVwZWF0ZWQuCisgKi8KKwlzdHJ1Y3QgcGNpX3Byb2JlX3N0YXRlICpzdGF0ZSA9ICZkZXYtPnN0YXRlLnBjaTsKKwlwcmludGYoIlByb2JpbmcgcGNpICVzLi4uXG4iLCB0eXBlX25hbWUpOworCWlmIChkZXYtPmhvd19wcm9iZSA9PSBQUk9CRV9GSVJTVCkgeworCQlzdGF0ZS0+YWR2YW5jZSAgICA9IDE7CisJCXN0YXRlLT5kZXYuZHJpdmVyID0gMDsKKwkJc3RhdGUtPmRldi5idXMgICAgPSAwOworCQlzdGF0ZS0+ZGV2LmRldmZuICA9IDA7CisJCWRldi0+aW5kZXggICAgICAgID0gLTE7CisJfQorCWZvcig7OykgeworCQlpZiAoKGRldi0+aG93X3Byb2JlICE9IFBST0JFX0FXQUtFKSAmJiBzdGF0ZS0+YWR2YW5jZSkgeworCQkJZmluZF9wY2koZGV2LT50eXBlLCAmc3RhdGUtPmRldik7CisJCQlkZXYtPmluZGV4ID0gLTE7CisJCX0KKwkJc3RhdGUtPmFkdmFuY2UgPSAxOworCQkKKwkJaWYgKHN0YXRlLT5kZXYuZHJpdmVyID09IDApCisJCQlicmVhazsKKwkJCisjaWYgMAorCQkvKiBGSVhNRSB0aGUgcm9tYWRkciBjb2RlIG5lZWRzIGEgdG90YWwgcmV0aG91Z2h0IHRvIGJlIHVzZWZ1bCAqLworCQlpZiAoc3RhdGUtPmRldi5yb21hZGRyICE9ICgodW5zaWduZWQgbG9uZykgcm9tLnJvbV9zZWdtZW50IDw8IDQpKSB7CisJCQljb250aW51ZTsKKwkJfQorI2VuZGlmCisJCWlmIChkZXYtPmhvd19wcm9iZSAhPSBQUk9CRV9BV0FLRSkgeworCQkJZGV2LT50eXBlX2luZGV4Kys7CisJCX0KKwkJZGV2LT5kZXZpZC5idXNfdHlwZSA9IFBDSV9CVVNfVFlQRTsKKwkJZGV2LT5kZXZpZC52ZW5kb3JfaWQgPSBodG9ucyhzdGF0ZS0+ZGV2LnZlbmRvcik7CisJCWRldi0+ZGV2aWQuZGV2aWNlX2lkID0gaHRvbnMoc3RhdGUtPmRldi5kZXZfaWQpOworCQkvKiBGSVhNRSBob3cgZG8gSSBoYW5kbGUgZGV2LT5pbmRleCArIFBST0JFX0FHQUlOPz8gKi8KKwkJCisJCXByaW50ZigiWyVzXSIsIHN0YXRlLT5kZXYubmFtZSk7CisJCWlmIChzdGF0ZS0+ZGV2LmRyaXZlci0+cHJvYmUoZGV2LCAmc3RhdGUtPmRldikpIHsKKwkJCXN0YXRlLT5hZHZhbmNlID0gKGRldi0+aW5kZXggPT0gLTEpOworCQkJcmV0dXJuIFBST0JFX1dPUktFRDsKKwkJfQorCQlwdXRjaGFyKCdcbicpOworCX0KKwlyZXR1cm4gUFJPQkVfRkFJTEVEOworfQogI2VuZGlmCiAKLSAgLyogb3RoZXIgUENJIE5JQ3MgZ28gaGVyZSAqLwotICB7MCwgMCwgTlVMTCwgMCwgMCwgMCwgMH0KLX07Ci0jZW5kaWYJLyogSU5DTFVERV8qUENJICovCi0KLSNpbmNsdWRlIDxjYXJkcy5oPgotCi0jaWZkZWYgSU5DTFVERV9QQ0kKLXN0cnVjdCBwY2lfZGlzcGF0Y2hfdGFibGUKKyNpZmRlZiBDT05GSUdfSVNBCitzdGF0aWMgaW50IGlzYV9wcm9iZShzdHJ1Y3QgZGV2ICpkZXYsIGNvbnN0IGNoYXIgKnR5cGVfbmFtZSkKIHsKLSAgdW5zaWduZWQgc2hvcnQgdmVuZG9yOwotICB1bnNpZ25lZCBzaG9ydCBkZXZfaWQ7Ci0gIHN0cnVjdCBuaWMgKigqZXRoX3Byb2JlKSAoc3RydWN0IG5pYyAqLCB1bnNpZ25lZCBzaG9ydCAqLAotCQkJICAgIHN0cnVjdCBwY2lfZGV2aWNlICopOwotfTsKLQotc3RhdGljIHN0cnVjdCBwY2lfZGlzcGF0Y2hfdGFibGUgUENJX05JQ1tdID0KLXsKLSMgaWZkZWYgSU5DTFVERV9OUzgzOTAKLSAgeyBQQ0lfVkVORE9SX0lEX1JFQUxURUssICBQQ0lfREVWSUNFX0lEX1JFQUxURUtfODAyOSwgICAgbmVwY2lfcHJvYmUgfSwKLSAgeyBQQ0lfVkVORE9SX0lEX1dJTkJPTkQyLCBQQ0lfREVWSUNFX0lEX1dJTkJPTkQyXzg5Qzk0MCwgbmVwY2lfcHJvYmUgfSwKLSAgeyBQQ0lfVkVORE9SX0lEX0NPTVBFWCwgICBQQ0lfREVWSUNFX0lEX0NPTVBFWF9STDIwMDAsICAgbmVwY2lfcHJvYmUgfSwKLSAgeyBQQ0lfVkVORE9SX0lEX0tUSSwgICAgICBQQ0lfREVWSUNFX0lEX0tUSV9FVDMyUDIsICAgICAgbmVwY2lfcHJvYmUgfSwKLSAgeyBQQ0lfVkVORE9SX0lEX05FVFZJTiwgICBQQ0lfREVWSUNFX0lEX05FVFZJTl9OVjUwMDBTQywgbmVwY2lfcHJvYmUgfSwKLSAgeyBQQ0lfVkVORE9SX0lEX0hPTFRFSywgICBQQ0lfREVWSUNFX0lEX0hPTFRFS19IVDgwMjMyLCAgbmVwY2lfcHJvYmUgfSwKLSMgZW5kaWYgLyogSU5DTFVERV9OUzgzOTAgKi8KLSMgaWZkZWYgSU5DTFVERV8zQzkwWAotICB7IFBDSV9WRU5ET1JfSURfM0NPTSwJICAgIFBDSV9ERVZJQ0VfSURfM0NPTV8zQzkwMFRQTywgICBhM2M5MHhfcHJvYmUgfSwKLSAgeyBQQ0lfVkVORE9SX0lEXzNDT00sICAgICBQQ0lfREVWSUNFX0lEXzNDT01fM0M5MDBDT01CTywgYTNjOTB4X3Byb2JlIH0sCi0gIHsgUENJX1ZFTkRPUl9JRF8zQ09NLCAgICAgUENJX0RFVklDRV9JRF8zQ09NXzNDOTA1VFgsICAgIGEzYzkweF9wcm9iZSB9LAotICB7IFBDSV9WRU5ET1JfSURfM0NPTSwgICAgIFBDSV9ERVZJQ0VfSURfM0NPTV8zQzkwNVQ0LCAgICBhM2M5MHhfcHJvYmUgfSwKLSAgeyBQQ0lfVkVORE9SX0lEXzNDT00sICAgICAweDkwMDQsICAgICAgICAgICAgICAgICAgICAgICAgYTNjOTB4X3Byb2JlIH0sCi0gIHsgUENJX1ZFTkRPUl9JRF8zQ09NLCAgICAgMHg5MDA1LCAgICAgICAgICAgICAgICAgICAgICAgIGEzYzkweF9wcm9iZSB9LAotICB7IFBDSV9WRU5ET1JfSURfM0NPTSwgICAgIDB4OTAwNiwgICAgICAgICAgICAgICAgICAgICAgICBhM2M5MHhfcHJvYmUgfSwKLSAgeyBQQ0lfVkVORE9SX0lEXzNDT00sICAgICAweDkwMEEsICAgICAgICAgICAgICAgICAgICAgICAgYTNjOTB4X3Byb2JlIH0sCi0gIHsgUENJX1ZFTkRPUl9JRF8zQ09NLCAgICAgUENJX0RFVklDRV9JRF8zQ09NXzNDOTA1Ql9UWCwgIGEzYzkweF9wcm9iZSB9LAotICB7IFBDSV9WRU5ET1JfSURfM0NPTSwgICAgIDB4OTA1NiwgICAgICAgICAgICAgICAgICAgICAgICBhM2M5MHhfcHJvYmUgfSwKLSAgeyBQQ0lfVkVORE9SX0lEXzNDT00sICAgICAweDkwNUEsICAgICAgICAgICAgICAgICAgICAgICAgYTNjOTB4X3Byb2JlIH0sCi0gIHsgUENJX1ZFTkRPUl9JRF8zQ09NLCAgICAgUENJX0RFVklDRV9JRF8zQ09NXzNDOTA1Q19UWE0sIGEzYzkweF9wcm9iZSB9LAotICB7IFBDSV9WRU5ET1JfSURfM0NPTSwgICAgIDB4OTgwMCwgICAgICAgICAgICAgICAgICAgICAgICBhM2M5MHhfcHJvYmUgfSwKLSAgeyBQQ0lfVkVORE9SX0lEXzNDT00sICAgICAweDk4MDUsICAgICAgICAgICAgICAgICAgICAgICAgYTNjOTB4X3Byb2JlIH0sCi0gIHsgUENJX1ZFTkRPUl9JRF8zQ09NLCAgICAgMHg3NjQ2LCAgICAgICAgICAgICAgICAgICAgICAgIGEzYzkweF9wcm9iZSB9LAotIyBlbmRpZiAvKiBJTkNMVURFXzNDOTBYICovCi0jIGlmZGVmCUlOQ0xVREVfM0M1OTUKLSAgeyBQQ0lfVkVORE9SX0lEXzNDT00sICAgICBQQ0lfREVWSUNFX0lEXzNDT01fM0M1OTAsICAgICAgdDU5NV9wcm9iZSB9LAotICB7IFBDSV9WRU5ET1JfSURfM0NPTSwgICAgIFBDSV9ERVZJQ0VfSURfM0NPTV8zQzU5NSwgICAgICB0NTk1X3Byb2JlIH0sCi0gIHsgUENJX1ZFTkRPUl9JRF8zQ09NLCAgICAgUENJX0RFVklDRV9JRF8zQ09NXzNDNTk1XzEsICAgIHQ1OTVfcHJvYmUgfSwKLSAgeyBQQ0lfVkVORE9SX0lEXzNDT00sICAgICBQQ0lfREVWSUNFX0lEXzNDT01fM0M1OTVfMiwgICAgdDU5NV9wcm9iZSB9LAotICB7IFBDSV9WRU5ET1JfSURfM0NPTSwgICAgIFBDSV9ERVZJQ0VfSURfM0NPTV8zQzkwMFRQTywgICB0NTk1X3Byb2JlIH0sCi0gIHsgUENJX1ZFTkRPUl9JRF8zQ09NLCAgICAgUENJX0RFVklDRV9JRF8zQ09NXzNDOTAwQ09NQk8sIHQ1OTVfcHJvYmUgfSwKLSAgeyBQQ0lfVkVORE9SX0lEXzNDT00sICAgICAweDkwMDQsICAgICAgICAgICAgICAgICAgICAgICAgdDU5NV9wcm9iZSB9LAotICB7IFBDSV9WRU5ET1JfSURfM0NPTSwgICAgIDB4OTAwNSwgICAgICAgICAgICAgICAgICAgICAgICB0NTk1X3Byb2JlIH0sCi0gIHsgUENJX1ZFTkRPUl9JRF8zQ09NLCAgICAgMHg5MDA2LCAgICAgICAgICAgICAgICAgICAgICAgIHQ1OTVfcHJvYmUgfSwKLSAgeyBQQ0lfVkVORE9SX0lEXzNDT00sICAgICAweDkwMEEsICAgICAgICAgICAgICAgICAgICAgICAgdDU5NV9wcm9iZSB9LAotICB7IFBDSV9WRU5ET1JfSURfM0NPTSwgICAgIDB4OTgwMCwgICAgICAgICAgICAgICAgICAgICAgICB0NTk1X3Byb2JlIH0sCi0gIHsgUENJX1ZFTkRPUl9JRF8zQ09NLCAgICAgMHg5ODA1LCAgICAgICAgICAgICAgICAgICAgICAgIHQ1OTVfcHJvYmUgfSwKLSAgeyBQQ0lfVkVORE9SX0lEXzNDT00sICAgICAweDc2NDYsICAgICAgICAgICAgICAgICAgICAgICAgdDU5NV9wcm9iZSB9LAotIyBlbmRpZiAvKiBJTkNMVURFXzNDNTk1ICovCi0jIGlmZGVmCUlOQ0xVREVfRUVQUk8xMDAKLSAgeyBQQ0lfVkVORE9SX0lEX0lOVEVMLCAgICBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyNTU3LCAgICAgZWVwcm8xMDBfcHJvYmUgfSwKLSAgeyBQQ0lfVkVORE9SX0lEX0lOVEVMLCAgICBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyNTU5RVIsICAgZWVwcm8xMDBfcHJvYmUgfSwKLSAgeyBQQ0lfVkVORE9SX0lEX0lOVEVMLCAgICBQQ0lfREVWSUNFX0lEX0lOVEVMX0lEMTAyOSwgICAgZWVwcm8xMDBfcHJvYmUgfSwKLSAgeyBQQ0lfVkVORE9SX0lEX0lOVEVMLCAgICBQQ0lfREVWSUNFX0lEX0lOVEVMX0lEMTAzMCwgICAgZWVwcm8xMDBfcHJvYmUgfSwKLSAgeyBQQ0lfVkVORE9SX0lEX0lOVEVMLCAgICBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyNTYyLCAgICAgZWVwcm8xMDBfcHJvYmUgfSwKLSMgZW5kaWYgLyogSU5DTFVERV9FRVBSTzEwMCAqLwotIyBpZmRlZglJTkNMVURFX0VQSUMxMDAKLSAgeyBQQ0lfVkVORE9SX0lEX1NNQywgICAgICBQQ0lfREVWSUNFX0lEX1NNQ19FUElDMTAwLCAgICAgZXBpYzEwMF9wcm9iZSB9LAotIyBlbmRpZiAvKiBJTkNMVURFX0VQSUMxMDAgKi8KLSMgaWZkZWYJSU5DTFVERV9MQU5DRQotICB7IFBDSV9WRU5ET1JfSURfQU1ELCAgICAgIFBDSV9ERVZJQ0VfSURfQU1EX0xBTkNFLCAgICAgICBsYW5jZXBjaV9wcm9iZSB9LAotICB7IFBDSV9WRU5ET1JfSURfQU1EX0hPTUVQTkEsIFBDSV9ERVZJQ0VfSURfQU1EX0hPTUVQTkEsICBsYW5jZXBjaV9wcm9iZSB9LAotIyBlbmRpZiAvKiBJTkNMVURFX0xBTkNFICovCi0jIGlmZGVmCUlOQ0xVREVfUlRMODEzOQotICB7IFBDSV9WRU5ET1JfSURfUkVBTFRFSywgIFBDSV9ERVZJQ0VfSURfUkVBTFRFS184MTM5LCAgICBydGw4MTM5X3Byb2JlIH0sCi0gIHsgUENJX1ZFTkRPUl9JRF9ETElOSywgICAgUENJX0RFVklDRV9JRF9ERkU1MzBUWFAsICAgICAgIHJ0bDgxMzlfcHJvYmUgfSwKLSAgeyBQQ0lfVkVORE9SX0lEX1NNQ18xMjExLCBQQ0lfREVWSUNFX0lEX1NNQ18xMjExLCAgICAgICAgcnRsODEzOV9wcm9iZSB9LAotIyBlbmRpZiAvKiBJTkNMVURFX1JUTDgxMzkgKi8KLSMgaWZkZWYJSU5DTFVERV9PVFVMSVAKLSAgeyBQQ0lfVkVORE9SX0lEX0RFQywgICAgICBQQ0lfREVWSUNFX0lEX0RFQ19UVUxJUCwgICAgICAgb3R1bGlwX3Byb2JlIH0sCi0gIHsgUENJX1ZFTkRPUl9JRF9ERUMsICAgICAgUENJX0RFVklDRV9JRF9ERUNfVFVMSVBfRkFTVCwgIG90dWxpcF9wcm9iZSB9LAotICB7IFBDSV9WRU5ET1JfSURfREVDLCAgICAgIFBDSV9ERVZJQ0VfSURfREVDX1RVTElQX1BMVVMsICBvdHVsaXBfcHJvYmUgfSwKLSAgeyBQQ0lfVkVORE9SX0lEX0RFQywgICAgICBQQ0lfREVWSUNFX0lEX0RFQ18yMTE0MiwgICAgICAgb3R1bGlwX3Byb2JlIH0sCi0jIGVuZGlmIC8qIElOQ0xVREVfT1RVTElQICovCi0jIGlmZGVmCUlOQ0xVREVfVFVMSVAKLSAgeyBQQ0lfVkVORE9SX0lEX0RFQywgICAgICBQQ0lfREVWSUNFX0lEX0RFQ19UVUxJUCwgICAgICAgdHVsaXBfcHJvYmUgfSwKLSAgeyBQQ0lfVkVORE9SX0lEX0RFQywgICAgICBQQ0lfREVWSUNFX0lEX0RFQ19UVUxJUF9GQVNULCAgdHVsaXBfcHJvYmUgfSwKLSAgeyBQQ0lfVkVORE9SX0lEX0RFQywgICAgICBQQ0lfREVWSUNFX0lEX0RFQ19UVUxJUF9QTFVTLCAgdHVsaXBfcHJvYmUgfSwKLSAgeyBQQ0lfVkVORE9SX0lEX0RFQywgICAgICBQQ0lfREVWSUNFX0lEX0RFQ18yMTE0MiwgICAgICAgdHVsaXBfcHJvYmUgfSwKLSAgeyBQQ0lfVkVORE9SX0lEX01BQ1JPTklYLCBQQ0lfREVWSUNFX0lEX01YOTg3eDUsICAgICAgICAgdHVsaXBfcHJvYmUgfSwKLSAgeyBQQ0lfVkVORE9SX0lEX0xJTktTWVMsICBQQ0lfREVWSUNFX0lEX0xDODJDMTE1LCAgICAgICAgdHVsaXBfcHJvYmUgfSwKLSAgeyBQQ0lfVkVORE9SX0lEX0xJTktTWVMsICBQQ0lfREVWSUNFX0lEX0RFQ19UVUxJUCwgICAgICAgdHVsaXBfcHJvYmUgfSwKLSAgeyBQQ0lfVkVORE9SX0lEX0RBVklDT00sICBQQ0lfREVWSUNFX0lEX0RNOTEwMiwgICAgICAgICAgdHVsaXBfcHJvYmUgfSwKLSAgeyBQQ0lfVkVORE9SX0lEX0RBVklDT00sICBQQ0lfREVWSUNFX0lEX0RNOTAwOSwgICAgICAgICAgdHVsaXBfcHJvYmUgfSwKLSAgeyBQQ0lfVkVORE9SX0lEX0FETVRFSywgICBQQ0lfREVWSUNFX0lEX0FETVRFS18wOTg1LCAgICAgdHVsaXBfcHJvYmUgfSwKLSAgeyBQQ0lfVkVORE9SX0lEX0FETVRFSywgICAweDA5ODEsICAgICAgICAgICAgICAgICAgICAgICAgdHVsaXBfcHJvYmUgfSwKLSAgeyAweDEyNUIsICAgICAgICAgICAgICAgICAweDE0MDAsICAgICAgICAgICAgICAgICAgICAgICAgdHVsaXBfcHJvYmUgfSwKLSAgeyAweDExRjYsICAgICAgICAgICAgICAgICAweDk4ODEsICAgICAgICAgICAgICAgICAgICAgICAgdHVsaXBfcHJvYmUgfSwKLSMgZW5kaWYgLyogSU5DTFVERV9UVUxJUCAqLwotIyBpZmRlZiBJTkNMVURFX0RBVklDT00KLSAgeyBQQ0lfVkVORE9SX0lEX0RBVklDT00sICAgUENJX0RFVklDRV9JRF9ETTkxMDIsICAgICAgICAgICBkYXZpY29tX3Byb2JlIH0sCi0gIHsgUENJX1ZFTkRPUl9JRF9EQVZJQ09NLCAgIFBDSV9ERVZJQ0VfSURfRE05MDA5LCAgICAgICAgICAgZGF2aWNvbV9wcm9iZSB9LAotIyBlbmRpZiAvKiBJTkNMVURFX0RBVklDT00gKi8KLSMgaWZkZWYJSU5DTFVERV9WSUFfUkhJTkUKLSAgeyBQQ0lfVkVORE9SX0lEX1ZJQVRFQywgICBQQ0lfREVWSUNFX0lEX1ZJQV9WVDYxMDIsICAgICAgcmhpbmVfcHJvYmUgfSwKLSAgeyBQQ0lfVkVORE9SX0lEX1ZJQVRFQywgICBQQ0lfREVWSUNFX0lEX1ZJQV9SSElORV9JLCAgICAgcmhpbmVfcHJvYmUgfSwKLSAgeyBQQ0lfVkVORE9SX0lEX1ZJQVRFQywgICBQQ0lfREVWSUNFX0lEX1ZJQV84NkMxMDBBLCAgICAgcmhpbmVfcHJvYmUgfSwKLSMgZW5kaWYgLyogSU5DTFVERV9WSUFfUkhJTkUgKi8KLSMgaWZkZWYgSU5DTFVERV9XODlDODQwCi0gIHsgUENJX1ZFTkRPUl9JRF9XSU5CT05EMiwgUENJX0RFVklDRV9JRF9XSU5CT05EMl84OUM4NDAsIHc4OWM4NDBfcHJvYmUgfSwKLSAgeyBQQ0lfVkVORE9SX0lEX0NPTVBFWCwgICBQQ0lfREVWSUNFX0lEX0NPTVBFWF9STDEwMEFUWCwgdzg5Yzg0MF9wcm9iZSB9LAotIyBlbmRpZiAvKiBJTkNMVURFX1c4OUM4NDAgKi8KLSMgaWZkZWYgSU5DTFVERV9TSVM5MDAKLSAgeyBQQ0lfVkVORE9SX0lEX1NJUywgICAgICBQQ0lfREVWSUNFX0lEX1NJUzkwMCwgICAgICAgICAgc2lzOTAwX3Byb2JlIH0sCi0gIHsgUENJX1ZFTkRPUl9JRF9TSVMsICAgICAgUENJX0RFVklDRV9JRF9TSVM3MDE2LCAgICAgICAgIHNpczkwMF9wcm9iZSB9LAotIyBlbmRpZiAvKiBJTkNMVURFX1NJUzkwMCAqLwotIyBpZmRlZiBJTkNMVURFX05BVFNFTUkKLSAgeyBQQ0lfVkVORE9SX0lEX05TLCAgICAgICBQQ0lfREVWSUNFX0lEX0RQODM4MTUsICAgICAgICAgbmF0c2VtaV9wcm9iZSB9LAotIyBlbmRpZiAvKiBJTkNMVURFX05BVFNFTUkgKi8KLSMgaWZkZWYgSU5DTFVERV9UTEFOCi0gIHsgUENJX1ZFTkRPUl9JRF9PTElDT00sICAgUENJX0RFVklDRV9JRF9PTElDT01fT0MyMzI2LCAgIHRsYW5fcHJvYmUgfSwKLSMgZW5kaWYgLyogSU5DTFVERV9UTEFOICovCi0gIHsgMCwgICAgICAgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgfQotfTsKLSNlbmRpZiAvKiBHUlVCICYmIElOQ0xVREVfUENJICovCi0KLXN0cnVjdCBkaXNwYXRjaF90YWJsZQotewotICBjb25zdCBjaGFyCSpuaWNfbmFtZTsKLSNpZmRlZglJTkNMVURFX1BDSQotICBzdHJ1Y3QgbmljCSooKmV0aF9wcm9iZSkgKHN0cnVjdCBuaWMgKiwgdW5zaWduZWQgc2hvcnQgKiwKLQkJCSAgICAgICBzdHJ1Y3QgcGNpX2RldmljZSAqKTsKLSNlbHNlCi0gIHN0cnVjdCBuaWMJKigqZXRoX3Byb2JlKSAoc3RydWN0IG5pYyAqLCB1bnNpZ25lZCBzaG9ydCAqKTsKLSNlbmRpZgkvKiBJTkNMVURFX1BDSSAqLwotICB1bnNpZ25lZCBzaG9ydAkqcHJvYmVfaW9hZGRyczsJCS8qIGZvciBwcm9iZSBvdmVycmlkZXMgKi8KLX07Ci0KIC8qCi0gKglOSUMgcHJvYmluZyBpcyBpbiBvcmRlciBvZiBhcHBlYXJhbmNlIGluIHRoaXMgdGFibGUuCisgKglOSUMgcHJvYmluZyBpcyBpbiB0aGUgb3JkZXIgdGhlIGRyaXZlcnMgd2VyZSBsaW5rZWQgdG9nZXRlci4KICAqCUlmIGZvciBzb21lIHJlYXNvbiB5b3Ugd2FudCB0byBjaGFuZ2UgdGhlIG9yZGVyLAotICoJanVzdCByZWFycmFuZ2UgdGhlIGVudHJpZXMgKGJyYWNrZXRlZCBieSB0aGUgI2lmZGVmLyNlbmRpZikKKyAqCWp1c3QgY2hhbmdlIHRoZSBvcmRlciB5b3UgbGlzdCB0aGUgZHJpdmVycyBpbi4KICAqLwotc3RhdGljIHN0cnVjdCBkaXNwYXRjaF90YWJsZQlOSUNbXSA9Ci17Ci0jaWZkZWYJSU5DTFVERV9SVEw4MTM5Ci0gIHsgIlJUTDgxMzkiLCBydGw4MTM5X3Byb2JlLCBwY2lfaW9hZGRycyB9LAotI2VuZGlmCi0jaWZkZWYgSU5DTFVERV9TSVM5MDAKLSAgeyAiU0lTOTAwIiwgc2lzOTAwX3Byb2JlLCBwY2lfaW9hZGRycyB9LAkKLSNlbmRpZgotI2lmZGVmIElOQ0xVREVfTkFUU0VNSQotICB7ICJOQVRTRU1JIiwgbmF0c2VtaV9wcm9iZSwgcGNpX2lvYWRkcnMgfSwJCi0jZW5kaWYKLSNpZmRlZglJTkNMVURFX1dECi0gIHsgIldEIiwgd2RfcHJvYmUsIDAgfSwKLSNlbmRpZgotI2lmZGVmCUlOQ0xVREVfM0M1MDMKLSAgeyAiM0M1MDMiLCB0NTAzX3Byb2JlLCAwIH0sCi0jZW5kaWYKLSNpZmRlZglJTkNMVURFX05FCi0gIHsgIk5FKjAwMCIsIG5lX3Byb2JlLCAwIH0sCi0jZW5kaWYKLSNpZmRlZglJTkNMVURFXzNDNTA5Ci0gIHsgIjNDNXg5IiwgdDUwOV9wcm9iZSwgMCB9LAotI2VuZGlmCi0jaWZkZWYJSU5DTFVERV8zQzUyOQotICB7ICIzQzV4OSIsIHQ1MjlfcHJvYmUsIDAgfSwKLSNlbmRpZgotI2lmZGVmCUlOQ0xVREVfM0M1OTUKLSAgeyAiM0M1OTUiLCB0NTk1X3Byb2JlLCBwY2lfaW9hZGRycyB9LAotI2VuZGlmCi0jaWZkZWYJSU5DTFVERV8zQzkwWAotICB7ICIzQzkwWCIsIGEzYzkweF9wcm9iZSwgcGNpX2lvYWRkcnMgfSwKLSNlbmRpZgotI2lmZGVmCUlOQ0xVREVfRUVQUk8KLSAgeyAiRUVQUk8iLCBlZXByb19wcm9iZSwgMCB9LAotI2VuZGlmCi0jaWZkZWYJSU5DTFVERV9FRVBSTzEwMAotICB7ICJFRVBSTzEwMCIsIGVlcHJvMTAwX3Byb2JlLCBwY2lfaW9hZGRycyB9LAotI2VuZGlmCi0jaWZkZWYJSU5DTFVERV9FUElDMTAwCi0gIHsgIkVQSUMxMDAiLCBlcGljMTAwX3Byb2JlLCBwY2lfaW9hZGRycyB9LAotI2VuZGlmCi0jaWZkZWYJSU5DTFVERV9PVFVMSVAKLSAgeyAiT1R1bGlwIiwgb3R1bGlwX3Byb2JlLCBwY2lfaW9hZGRycyB9LAotI2VuZGlmCi0jaWZkZWYJSU5DTFVERV9UVUxJUAotICB7ICJUdWxpcCIsIHR1bGlwX3Byb2JlLCBwY2lfaW9hZGRycyB9LAotI2VuZGlmCi0jaWZkZWYJSU5DTFVERV9EQVZJQ09NCi0gIHsgIkRBVklDT00iLCBkYXZpY29tX3Byb2JlLCBwY2lfaW9hZGRycyB9LAotI2VuZGlmCi0jaWZkZWYJSU5DTFVERV9DUzg5WDAKLSAgeyAiQ1M4OXgwIiwgY3M4OXgwX3Byb2JlLCAwIH0sCi0jZW5kaWYKLSNpZmRlZglJTkNMVURFX05FMjEwMAotICB7ICJORTIxMDAiLCBuZTIxMDBfcHJvYmUsIDAgfSwKLSNlbmRpZgotI2lmZGVmCUlOQ0xVREVfTkk2NTEwCi0gIHsgIk5JNjUxMCIsIG5pNjUxMF9wcm9iZSwgMCB9LAotI2VuZGlmCi0jaWZkZWYJSU5DTFVERV9TS19HMTYKLSAgeyAiU0tfRzE2IiwgU0tfcHJvYmUsIDAgfSwKLSNlbmRpZgotI2lmZGVmCUlOQ0xVREVfM0M1MDcKLSAgeyAiM0M1MDciLCB0NTA3X3Byb2JlLCAwIH0sCi0jZW5kaWYKLSNpZmRlZglJTkNMVURFX05JNTAxMAotICB7ICJOSTUwMTAiLCBuaTUwMTBfcHJvYmUsIDAgfSwKLSNlbmRpZgotI2lmZGVmCUlOQ0xVREVfTkk1MjEwCi0gIHsgIk5JNTIxMCIsIG5pNTIxMF9wcm9iZSwgMCB9LAotI2VuZGlmCi0jaWZkZWYJSU5DTFVERV9FWE9TMjA1Ci0gIHsgIkVYT1MyMDUiLCBleG9zMjA1X3Byb2JlLCAwIH0sCi0jZW5kaWYKLSNpZmRlZglJTkNMVURFX1NNQzkwMDAKLSAgeyAiU01DOTAwMCIsIHNtYzkwMDBfcHJvYmUsIDAgfSwKLSNlbmRpZgotI2lmZGVmCUlOQ0xVREVfVElBUkEKLSAgeyAiVElBUkEiLCB0aWFyYV9wcm9iZSwgMCB9LAotI2VuZGlmCi0jaWZkZWYJSU5DTFVERV9ERVBDQQotICB7ICJERVBDQSIsIGRlcGNhX3Byb2JlLCAwIH0sCi0jZW5kaWYKLSNpZmRlZglJTkNMVURFX05TODM5MAotICB7ICJORTIwMDAvUENJIiwgbmVwY2lfcHJvYmUsIHBjaV9pb2FkZHJzIH0sCi0jZW5kaWYKLSNpZmRlZglJTkNMVURFX0xBTkNFCi0gIHsgIkxBTkNFL1BDSSIsIGxhbmNlcGNpX3Byb2JlLCBwY2lfaW9hZGRycyB9LAotI2VuZGlmCi0jaWZkZWYJSU5DTFVERV9WSUFfUkhJTkUKLSAgeyAiVklBIDg2QzEwMCIsIHJoaW5lX3Byb2JlLCBwY2lfaW9hZGRycyB9LAotI2VuZGlmCi0jaWZkZWYJSU5DTFVERV9XODlDODQwCi0gIHsgIlc4OUM4NDBGIiwgdzg5Yzg0MF9wcm9iZSwgcGNpX2lvYWRkcnMgfSwKLSNlbmRpZgotI2lmZGVmCUlOQ0xVREVfVExBTgotICB7ICJPbGljb20gMjMyNiIsIHRsYW5fcHJvYmUsIHBjaV9pb2FkZHJzIH0sCi0jZW5kaWYKLSAgLyogdGhpcyBlbnRyeSBtdXN0IGFsd2F5cyBiZSBsYXN0IHRvIG1hcmsgdGhlIGVuZCBvZiBsaXN0ICovCi0gIHsgMCwgMCwgMCB9Ci19OwotCi0jZGVmaW5lCU5JQ19UQUJMRV9TSVpFCShzaXplb2YgKE5JQykgLyBzaXplb2YgKE5JQ1swXSkpCi0KLXN0YXRpYyBpbnQKLWV0aF9kdW1teSAoc3RydWN0IG5pYyAqZHVtbXkpCi17Ci0gIHJldHVybiAwOworCXN0cnVjdCBpc2FfcHJvYmVfc3RhdGUgKnN0YXRlID0gJmRldi0+c3RhdGUuaXNhOworCXByaW50ZigiUHJvYmluZyBpc2EgJXMuLi5cbiIsIHR5cGVfbmFtZSk7CisJaWYgKGRldi0+aG93X3Byb2JlID09IFBST0JFX0ZJUlNUKSB7CisJCXN0YXRlLT5hZHZhbmNlID0gMDsKKwkJc3RhdGUtPmRyaXZlciAgPSBpc2FfZHJpdmVyczsKKwkJZGV2LT5pbmRleCAgICAgPSAtMTsKKwl9CisJZm9yKDs7KQorCXsKKwkJaWYgKChkZXYtPmhvd19wcm9iZSAhPSBQUk9CRV9BV0FLRSkgJiYgc3RhdGUtPmFkdmFuY2UpIHsKKwkJCXN0YXRlLT5kcml2ZXIrKzsKKwkJCWRldi0+aW5kZXggPSAtMTsKKwkJfQorCQlzdGF0ZS0+YWR2YW5jZSA9IDE7CisJCQorCQlpZiAoc3RhdGUtPmRyaXZlciA+PSBpc2FfZHJpdmVyc19lbmQpCisJCQlicmVhazsKKworCQlpZiAoc3RhdGUtPmRyaXZlci0+dHlwZSAhPSBkZXYtPnR5cGUpCisJCQljb250aW51ZTsKKworCQlpZiAoZGV2LT5ob3dfcHJvYmUgIT0gUFJPQkVfQVdBS0UpIHsKKwkJCWRldi0+dHlwZV9pbmRleCsrOworCQl9CisJCXByaW50ZigiWyVzXSIsIHN0YXRlLT5kcml2ZXItPm5hbWUpOworCQlkZXYtPmRldmlkLmJ1c190eXBlID0gSVNBX0JVU19UWVBFOworCQkvKiBGSVhNRSBob3cgZG8gSSBoYW5kbGUgZGV2LT5pbmRleCArIFBST0JFX0FHQUlOPz8gKi8KKwkJLyogZHJpdmVyIHdpbGwgZmlsbCBpbiB2ZW5kb3IgYW5kIGRldmljZSBJRHMgKi8KKwkJaWYgKHN0YXRlLT5kcml2ZXItPnByb2JlKGRldiwgc3RhdGUtPmRyaXZlci0+aW9hZGRycykpIHsKKwkJCXN0YXRlLT5hZHZhbmNlID0gKGRldi0+aW5kZXggPT0gLTEpOworCQkJcmV0dXJuIFBST0JFX1dPUktFRDsKKwkJfQorCQlwdXRjaGFyKCdcbicpOworCX0KKwlyZXR1cm4gUFJPQkVfRkFJTEVEOwogfQotCi1zdGF0aWMgY2hhcglwYWNrZXRbRVRIX0ZSQU1FX0xFTl07Ci0KLXN0cnVjdCBuaWMJbmljID0KLXsKLSAgKHZvaWQgKCopIChzdHJ1Y3QgbmljICopKSBldGhfZHVtbXksCS8qIHJlc2V0ICovCi0gIGV0aF9kdW1teSwJCQkJLyogcG9sbCAqLwotICAodm9pZCAoKikgKHN0cnVjdCBuaWMgKiwgY29uc3QgY2hhciAqLAotCSAgICAgdW5zaWduZWQgaW50LCB1bnNpZ25lZCBpbnQsCi0JICAgICBjb25zdCBjaGFyICopKSBldGhfZHVtbXksCS8qIHRyYW5zbWl0ICovCi0gICh2b2lkICgqKSAoc3RydWN0IG5pYyAqKSkgZXRoX2R1bW15LAkvKiBkaXNhYmxlICovCi0jaWZkZWYJVDUwM19BVUkKLSAgMSwJCQkJCS8qIGF1aSAqLwogI2Vsc2UKLSAgMCwJCQkJCS8qIG5vIGF1aSAqLworI2RlZmluZSBpc2FfcHJvYmUoZCx0bikgKFBST0JFX0ZBSUxFRCkKICNlbmRpZgotICAmcm9tLAkJCQkJLyogcm9tX2luZm8gKi8KLSAgYXJwdGFibGVbQVJQX0NMSUVOVF0ubm9kZSwJCS8qIG5vZGVfYWRkciAqLwotICBwYWNrZXQsCQkJCS8qIHBhY2tldCAqLwotICAwLAkJCQkvKiBwYWNrZXRsZW4gKi8KLSAgMCwJCQkJLyogcHJpdl9kYXRhICovCitzdGF0aWMgY29uc3QgY2hhciAqZHJpdmVyX25hbWVbXSA9IHsKKwkibmljIiwgCisJImRpc2siLCAKKwkiZmxvcHB5IiwKIH07Ci0KLXZvaWQKLWV0aF9yZXNldCAodm9pZCkKK2ludCBwcm9iZShzdHJ1Y3QgZGV2ICpkZXYpCiB7Ci0gICgqbmljLnJlc2V0KSAoJm5pYyk7Ci19CisJY29uc3QgY2hhciAqdHlwZV9uYW1lOwogCi1pbnQKLWV0aF9wcm9iZSAodm9pZCkKLXsKLSAgc3RydWN0IHBjaV9kZXZpY2UJKnA7Ci0gIGNvbnN0IHN0cnVjdCBkaXNwYXRjaF90YWJsZQkqdDsKLSAgc3RhdGljIGludCBwcm9iZWQgPSAwOworCUVudGVyRnVuY3Rpb24oInByb2JlIik7CiAKLSAgLyogSWYgYWxyZWFkeSBwcm9iZWQsIGRvbid0IHRyeSB0byBwcm9iZSBpdCBhbnkgbG9uZ2VyLiAgKi8KLSAgaWYgKHByb2JlZCkKLSAgICByZXR1cm4gMTsKLSAgCi0gIC8qIENsZWFyIHRoZSByZWFkeSBmbGFnLiAgKi8KLSAgbmV0d29ya19yZWFkeSA9IDA7Ci0gIC8qIENsZWFyIHRoZSBBUlAgdGFibGUuICAqLwotICBncnViX21lbXNldCAoKGNoYXIgKikgYXJwdGFibGUsIDAsCi0JICAgICAgIE1BWF9BUlAgKiBzaXplb2YgKHN0cnVjdCBhcnB0YWJsZV90KSk7Ci0gIAotICBwID0gMDsKLSAgCi0jaWZkZWYJSU5DTFVERV9QQ0kKLSAgLyogSW4gR1JVQiwgdGhlIFJPTSBpbmZvIGlzIGluaXRpYWxpemVkIGhlcmUuICAqLwotICByb20gPSAqKChzdHJ1Y3Qgcm9tX2luZm8gKikgUk9NX0lORk9fTE9DQVRJT04pOwotICAKLSAgZXRoX3BjaV9pbml0KHBjaV9uaWNfbGlzdCk7Ci0gIHBjaV9pb2FkZHJzWzBdID0gMDsKLSAgcGNpX2lvYWRkcnNbMV0gPSAwOwotICAvKiBhdCB0aGlzIHBvaW50IHdlIGhhdmUgYSBsaXN0IG9mIHBvc3NpYmxlIFBDSSBjYW5kaWRhdGVzCi0gICAgIHdlIGp1c3QgcGljayB0aGUgZmlyc3Qgb25lIHdpdGggYSBub24temVybyBpb2FkZHIgKi8KLSAgZm9yIChwID0gcGNpX25pY19saXN0OyBwLT52ZW5kb3IgIT0gMDsgKytwKQotICAgIHsKLSAgICAgIGlmIChwLT5pb2FkZHIgIT0gMCkKLQl7Ci0JICBwY2lfaW9hZGRyc1swXSA9IHAtPmlvYWRkcjsKLQkgIGJyZWFrOworCXR5cGVfbmFtZSA9ICIiOworCWlmICgoZGV2LT50eXBlID49IDApICYmIAorCQkoZGV2LT50eXBlIDwgc2l6ZW9mKGRyaXZlcl9uYW1lKS9zaXplb2YoZHJpdmVyX25hbWVbMF0pKSkgeworCQl0eXBlX25hbWUgPSBkcml2ZXJfbmFtZVtkZXYtPnR5cGVdOwogCX0KLSAgICB9Ci0jZW5kaWYKLSAgCi0gIGV0aGVyYm9vdF9wcmludGYoIlByb2JpbmcuLi4iKTsKLQkKLSNpZmRlZiBJTkNMVURFX1BDSQotICBpZiAocC0+dmVuZG9yKQotICAgIHsKLSAgICAgIHN0cnVjdCBwY2lfZGlzcGF0Y2hfdGFibGUgKnB0OwotICAgICAgCi0gICAgICBmb3IgKHB0ID0gUENJX05JQzsgcHQtPmV0aF9wcm9iZSAhPSAwOyBwdCsrKQotCWlmIChwLT52ZW5kb3IgPT0gcHQtPnZlbmRvciAmJiBwLT5kZXZfaWQgPT0gcHQtPmRldl9pZCkKLQkgIHsKLQkgICAgZXRoZXJib290X3ByaW50ZiAoIlslc10iLCBwLT5uYW1lKTsKLQkgICAgaWYgKChwdC0+ZXRoX3Byb2JlKSAoJm5pYywgcGNpX2lvYWRkcnMsIHApKQotCSAgICAgIHsKLQkJcHJvYmVkID0gMTsKLQkJcmV0dXJuIDE7Ci0JICAgICAgfQotCSAgfQotICAgIH0KLSNlbmRpZiAvKiBJTkNMVURFX1BDSSAqLwotCQotICBmb3IgKHQgPSBOSUM7IHQtPm5pY19uYW1lICE9IDA7ICsrdCkKLSAgICB7Ci0gICAgICBldGhlcmJvb3RfcHJpbnRmKCJbJXNdIiwgdC0+bmljX25hbWUpOwotI2lmZGVmCUlOQ0xVREVfUENJCi0gICAgICBpZiAoKCp0LT5ldGhfcHJvYmUpICgmbmljLCB0LT5wcm9iZV9pb2FkZHJzLCBwKSkKLQl7Ci0JICBwcm9iZWQgPSAxOwotCSAgcmV0dXJuIDE7CisJaWYgKGRldi0+aG93X3Byb2JlID09IFBST0JFX0ZJUlNUKSB7CisJCWRldi0+dG9fcHJvYmUgPSBQUk9CRV9QQ0k7CisJCW1lbXNldCgmZGV2LT5zdGF0ZSwgMCwgc2l6ZW9mKGRldi0+c3RhdGUpKTsKIAl9Ci0jZWxzZQotICAgICAgaWYgKCgqdC0+ZXRoX3Byb2JlKSAoJm5pYywgdC0+cHJvYmVfaW9hZGRycykpCi0JewotCSAgcHJvYmVkID0gMTsKLQkgIHJldHVybiAxOworCWlmIChkZXYtPnRvX3Byb2JlID09IFBST0JFX1BDSSkgeworCQlkZXYtPmhvd19wcm9iZSA9IHBjaV9wcm9iZShkZXYsIHR5cGVfbmFtZSk7CisJCWlmIChkZXYtPmhvd19wcm9iZSA9PSBQUk9CRV9GQUlMRUQpIHsKKwkJCWRldi0+dG9fcHJvYmUgPSBQUk9CRV9JU0E7CisJCX0KKwl9CisJaWYgKGRldi0+dG9fcHJvYmUgPT0gUFJPQkVfSVNBKSB7CisJCWRldi0+aG93X3Byb2JlID0gaXNhX3Byb2JlKGRldiwgdHlwZV9uYW1lKTsKKwkJaWYgKGRldi0+aG93X3Byb2JlID09IFBST0JFX0ZBSUxFRCkgeworCQkJZGV2LT50b19wcm9iZSA9IFBST0JFX05PTkU7CisJCX0KKwl9CisJaWYgKChkZXYtPnRvX3Byb2JlICE9IFBST0JFX1BDSSkgJiYKKwkJKGRldi0+dG9fcHJvYmUgIT0gUFJPQkVfSVNBKSkgeworCQlkZXYtPmhvd19wcm9iZSA9IFBST0JFX0ZBSUxFRDsKKwkJCiAJfQotI2VuZGlmCS8qIElOQ0xVREVfUENJICovCi0gICAgfQotICAKLSAgcmV0dXJuIDA7Ci19Ci0KLWludAotZXRoX3BvbGwgKHZvaWQpCi17Ci0gIHJldHVybiAoKCpuaWMucG9sbCkgKCZuaWMpKTsKLX0KIAotdm9pZAotZXRoX3RyYW5zbWl0IChjb25zdCBjaGFyICpkLCB1bnNpZ25lZCBpbnQgdCwgdW5zaWduZWQgaW50IHMsIGNvbnN0IHZvaWQgKnApCi17Ci0gICgqbmljLnRyYW5zbWl0KSAoJm5pYywgZCwgdCwgcywgcCk7Ci0gIGlmICh0ID09IElQKQotICAgIHR3aWRkbGUgKCk7CisJTGVhdmVGdW5jdGlvbigicHJvYmUiKTsKKwlyZXR1cm4gZGV2LT5ob3dfcHJvYmU7CiB9CiAKLXZvaWQKLWV0aF9kaXNhYmxlICh2b2lkKQordm9pZCBkaXNhYmxlKHN0cnVjdCBkZXYgKmRldikKIHsKLSAgKCpuaWMuZGlzYWJsZSkgKCZuaWMpOworCWlmIChkZXYtPmRpc2FibGUpIHsKKwkJZGV2LT5kaXNhYmxlKGRldik7CisJCWRldi0+ZGlzYWJsZSA9IDA7CisJfQogfQpkaWZmIC1OYXVyIGdydWItMC45Ny5vcmlnL25ldGJvb3QvY3B1LmggZ3J1Yi0wLjk3L25ldGJvb3QvY3B1LmgKLS0tIGdydWItMC45Ny5vcmlnL25ldGJvb3QvY3B1LmgJMTk3MC0wMS0wMSAwMDowMDowMC4wMDAwMDAwMDAgKzAwMDAKKysrIGdydWItMC45Ny9uZXRib290L2NwdS5oCTIwMDUtMDgtMzEgMTk6MDM6MzUuMDAwMDAwMDAwICswMDAwCkBAIC0wLDAgKzEsMjQzIEBACisjaWZuZGVmIEkzODZfQklUU19DUFVfSAorI2RlZmluZSBJMzg2X0JJVFNfQ1BVX0gKKworCisvKiBTYW1wbGUgdXNhZ2U6IENQVV9GRUFUVVJFX1AoY3B1Lng4Nl9jYXBhYmlsaXR5LCBGUFUpICovCisjZGVmaW5lIENQVV9GRUFUVVJFX1AoQ0FQLCBGRUFUVVJFKSBcCisJKCEhKENBUFsoWDg2X0ZFQVRVUkVfIyNGRUFUVVJFKS8zMl0gJiAoKFg4Nl9GRUFUVVJFXyMjRkVBVFVSRSkgJiAweDFmKSkpCisKKyNkZWZpbmUgTkNBUElOVFMJNAkvKiBDdXJyZW50bHkgd2UgaGF2ZSA0IDMyLWJpdCB3b3JkcyB3b3J0aCBvZiBpbmZvICovCisKKy8qIEludGVsLWRlZmluZWQgQ1BVIGZlYXR1cmVzLCBDUFVJRCBsZXZlbCAweDAwMDAwMDAxLCB3b3JkIDAgKi8KKyNkZWZpbmUgWDg2X0ZFQVRVUkVfRlBVCQkoMCozMisgMCkgLyogT25ib2FyZCBGUFUgKi8KKyNkZWZpbmUgWDg2X0ZFQVRVUkVfVk1FCQkoMCozMisgMSkgLyogVmlydHVhbCBNb2RlIEV4dGVuc2lvbnMgKi8KKyNkZWZpbmUgWDg2X0ZFQVRVUkVfREUJCSgwKjMyKyAyKSAvKiBEZWJ1Z2dpbmcgRXh0ZW5zaW9ucyAqLworI2RlZmluZSBYODZfRkVBVFVSRV9QU0UgCSgwKjMyKyAzKSAvKiBQYWdlIFNpemUgRXh0ZW5zaW9ucyAqLworI2RlZmluZSBYODZfRkVBVFVSRV9UU0MJCSgwKjMyKyA0KSAvKiBUaW1lIFN0YW1wIENvdW50ZXIgKi8KKyNkZWZpbmUgWDg2X0ZFQVRVUkVfTVNSCQkoMCozMisgNSkgLyogTW9kZWwtU3BlY2lmaWMgUmVnaXN0ZXJzLCBSRE1TUiwgV1JNU1IgKi8KKyNkZWZpbmUgWDg2X0ZFQVRVUkVfUEFFCQkoMCozMisgNikgLyogUGh5c2ljYWwgQWRkcmVzcyBFeHRlbnNpb25zICovCisjZGVmaW5lIFg4Nl9GRUFUVVJFX01DRQkJKDAqMzIrIDcpIC8qIE1hY2hpbmUgQ2hlY2sgQXJjaGl0ZWN0dXJlICovCisjZGVmaW5lIFg4Nl9GRUFUVVJFX0NYOAkJKDAqMzIrIDgpIC8qIENNUFhDSEc4IGluc3RydWN0aW9uICovCisjZGVmaW5lIFg4Nl9GRUFUVVJFX0FQSUMJKDAqMzIrIDkpIC8qIE9uYm9hcmQgQVBJQyAqLworI2RlZmluZSBYODZfRkVBVFVSRV9TRVAJCSgwKjMyKzExKSAvKiBTWVNFTlRFUi9TWVNFWElUICovCisjZGVmaW5lIFg4Nl9GRUFUVVJFX01UUlIJKDAqMzIrMTIpIC8qIE1lbW9yeSBUeXBlIFJhbmdlIFJlZ2lzdGVycyAqLworI2RlZmluZSBYODZfRkVBVFVSRV9QR0UJCSgwKjMyKzEzKSAvKiBQYWdlIEdsb2JhbCBFbmFibGUgKi8KKyNkZWZpbmUgWDg2X0ZFQVRVUkVfTUNBCQkoMCozMisxNCkgLyogTWFjaGluZSBDaGVjayBBcmNoaXRlY3R1cmUgKi8KKyNkZWZpbmUgWDg2X0ZFQVRVUkVfQ01PVgkoMCozMisxNSkgLyogQ01PViBpbnN0cnVjdGlvbiAoRkNNT1ZDQyBhbmQgRkNPTUkgdG9vIGlmIEZQVSBwcmVzZW50KSAqLworI2RlZmluZSBYODZfRkVBVFVSRV9QQVQJCSgwKjMyKzE2KSAvKiBQYWdlIEF0dHJpYnV0ZSBUYWJsZSAqLworI2RlZmluZSBYODZfRkVBVFVSRV9QU0UzNgkoMCozMisxNykgLyogMzYtYml0IFBTRXMgKi8KKyNkZWZpbmUgWDg2X0ZFQVRVUkVfUE4JCSgwKjMyKzE4KSAvKiBQcm9jZXNzb3Igc2VyaWFsIG51bWJlciAqLworI2RlZmluZSBYODZfRkVBVFVSRV9DTEZMU0gJKDAqMzIrMTkpIC8qIFN1cHBvcnRzIHRoZSBDTEZMVVNIIGluc3RydWN0aW9uICovCisjZGVmaW5lIFg4Nl9GRUFUVVJFX0RURVMJKDAqMzIrMjEpIC8qIERlYnVnIFRyYWNlIFN0b3JlICovCisjZGVmaW5lIFg4Nl9GRUFUVVJFX0FDUEkJKDAqMzIrMjIpIC8qIEFDUEkgdmlhIE1TUiAqLworI2RlZmluZSBYODZfRkVBVFVSRV9NTVgJCSgwKjMyKzIzKSAvKiBNdWx0aW1lZGlhIEV4dGVuc2lvbnMgKi8KKyNkZWZpbmUgWDg2X0ZFQVRVUkVfRlhTUgkoMCozMisyNCkgLyogRlhTQVZFIGFuZCBGWFJTVE9SIGluc3RydWN0aW9ucyAoZmFzdCBzYXZlIGFuZCByZXN0b3JlICovCisJCQkJICAgICAgICAgIC8qIG9mIEZQVSBjb250ZXh0KSwgYW5kIENSNC5PU0ZYU1IgYXZhaWxhYmxlICovCisjZGVmaW5lIFg4Nl9GRUFUVVJFX1hNTQkJKDAqMzIrMjUpIC8qIFN0cmVhbWluZyBTSU1EIEV4dGVuc2lvbnMgKi8KKyNkZWZpbmUgWDg2X0ZFQVRVUkVfWE1NMgkoMCozMisyNikgLyogU3RyZWFtaW5nIFNJTUQgRXh0ZW5zaW9ucy0yICovCisjZGVmaW5lIFg4Nl9GRUFUVVJFX1NFTEZTTk9PUAkoMCozMisyNykgLyogQ1BVIHNlbGYgc25vb3AgKi8KKyNkZWZpbmUgWDg2X0ZFQVRVUkVfSFQJCSgwKjMyKzI4KSAvKiBIeXBlci1UaHJlYWRpbmcgKi8KKyNkZWZpbmUgWDg2X0ZFQVRVUkVfQUNDCQkoMCozMisyOSkgLyogQXV0b21hdGljIGNsb2NrIGNvbnRyb2wgKi8KKyNkZWZpbmUgWDg2X0ZFQVRVUkVfSUE2NAkoMCozMiszMCkgLyogSUEtNjQgcHJvY2Vzc29yICovCisKKy8qIEFNRC1kZWZpbmVkIENQVSBmZWF0dXJlcywgQ1BVSUQgbGV2ZWwgMHg4MDAwMDAwMSwgd29yZCAxICovCisvKiBEb24ndCBkdXBsaWNhdGUgZmVhdHVyZSBmbGFncyB3aGljaCBhcmUgcmVkdW5kYW50IHdpdGggSW50ZWwhICovCisjZGVmaW5lIFg4Nl9GRUFUVVJFX1NZU0NBTEwJKDEqMzIrMTEpIC8qIFNZU0NBTEwvU1lTUkVUICovCisjZGVmaW5lIFg4Nl9GRUFUVVJFX01NWEVYVAkoMSozMisyMikgLyogQU1EIE1NWCBleHRlbnNpb25zICovCisjZGVmaW5lIFg4Nl9GRUFUVVJFX0xNCQkoMSozMisyOSkgLyogTG9uZyBNb2RlICh4ODYtNjQpICovCisjZGVmaW5lIFg4Nl9GRUFUVVJFXzNETk9XRVhUCSgxKjMyKzMwKSAvKiBBTUQgM0ROb3chIGV4dGVuc2lvbnMgKi8KKyNkZWZpbmUgWDg2X0ZFQVRVUkVfM0ROT1cJKDEqMzIrMzEpIC8qIDNETm93ISAqLworCisvKiBUcmFuc21ldGEtZGVmaW5lZCBDUFUgZmVhdHVyZXMsIENQVUlEIGxldmVsIDB4ODA4NjAwMDEsIHdvcmQgMiAqLworI2RlZmluZSBYODZfRkVBVFVSRV9SRUNPVkVSWQkoMiozMisgMCkgLyogQ1BVIGluIHJlY292ZXJ5IG1vZGUgKi8KKyNkZWZpbmUgWDg2X0ZFQVRVUkVfTE9OR1JVTgkoMiozMisgMSkgLyogTG9uZ3J1biBwb3dlciBjb250cm9sICovCisjZGVmaW5lIFg4Nl9GRUFUVVJFX0xSVEkJKDIqMzIrIDMpIC8qIExvbmdSdW4gdGFibGUgaW50ZXJmYWNlICovCisKKy8qIE90aGVyIGZlYXR1cmVzLCBMaW51eC1kZWZpbmVkIG1hcHBpbmcsIHdvcmQgMyAqLworLyogVGhpcyByYW5nZSBpcyB1c2VkIGZvciBmZWF0dXJlIGJpdHMgd2hpY2ggY29uZmxpY3Qgb3IgYXJlIHN5bnRoZXNpemVkICovCisjZGVmaW5lIFg4Nl9GRUFUVVJFX0NYTU1YCSgzKjMyKyAwKSAvKiBDeXJpeCBNTVggZXh0ZW5zaW9ucyAqLworI2RlZmluZSBYODZfRkVBVFVSRV9LNl9NVFJSCSgzKjMyKyAxKSAvKiBBTUQgSzYgbm9uc3RhbmRhcmQgTVRSUnMgKi8KKyNkZWZpbmUgWDg2X0ZFQVRVUkVfQ1lSSVhfQVJSCSgzKjMyKyAyKSAvKiBDeXJpeCBBUlJzICg9IE1UUlJzKSAqLworI2RlZmluZSBYODZfRkVBVFVSRV9DRU5UQVVSX01DUgkoMyozMisgMykgLyogQ2VudGF1ciBNQ1JzICg9IE1UUlJzKSAqLworCisjZGVmaW5lIE1BWF9YODZfVkVORE9SX0lEIDE2CitzdHJ1Y3QgY3B1aW5mb194ODYgeworCXVpbnQ4X3QJIHg4NjsJCS8qIENQVSBmYW1pbHkgKi8KKwl1aW50OF90CSB4ODZfbW9kZWw7CisJdWludDhfdAkgeDg2X21hc2s7CisKKyAgICAgICAJaW50CSBjcHVpZF9sZXZlbDsJLyogTWF4aW11bSBzdXBwb3J0ZWQgQ1BVSUQgbGV2ZWwsIC0xPW5vIENQVUlEICovCisJdW5zaWduZWQgeDg2X2NhcGFiaWxpdHlbTkNBUElOVFNdOworCWNoYXIJIHg4Nl92ZW5kb3JfaWRbTUFYX1g4Nl9WRU5ET1JfSURdOworfTsKKworCisjZGVmaW5lIFg4Nl9WRU5ET1JfSU5URUwgMAorI2RlZmluZSBYODZfVkVORE9SX0NZUklYIDEKKyNkZWZpbmUgWDg2X1ZFTkRPUl9BTUQgMgorI2RlZmluZSBYODZfVkVORE9SX1VNQyAzCisjZGVmaW5lIFg4Nl9WRU5ET1JfTkVYR0VOIDQKKyNkZWZpbmUgWDg2X1ZFTkRPUl9DRU5UQVVSIDUKKyNkZWZpbmUgWDg2X1ZFTkRPUl9SSVNFIDYKKyNkZWZpbmUgWDg2X1ZFTkRPUl9UUkFOU01FVEEgNworI2RlZmluZSBYODZfVkVORE9SX05TQyA4CisjZGVmaW5lIFg4Nl9WRU5ET1JfVU5LTk9XTiAweGZmCisKKy8qCisgKiBFRkxBR1MgYml0cworICovCisjZGVmaW5lIFg4Nl9FRkxBR1NfQ0YJMHgwMDAwMDAwMSAvKiBDYXJyeSBGbGFnICovCisjZGVmaW5lIFg4Nl9FRkxBR1NfUEYJMHgwMDAwMDAwNCAvKiBQYXJpdHkgRmxhZyAqLworI2RlZmluZSBYODZfRUZMQUdTX0FGCTB4MDAwMDAwMTAgLyogQXV4aWxsYXJ5IGNhcnJ5IEZsYWcgKi8KKyNkZWZpbmUgWDg2X0VGTEFHU19aRgkweDAwMDAwMDQwIC8qIFplcm8gRmxhZyAqLworI2RlZmluZSBYODZfRUZMQUdTX1NGCTB4MDAwMDAwODAgLyogU2lnbiBGbGFnICovCisjZGVmaW5lIFg4Nl9FRkxBR1NfVEYJMHgwMDAwMDEwMCAvKiBUcmFwIEZsYWcgKi8KKyNkZWZpbmUgWDg2X0VGTEFHU19JRgkweDAwMDAwMjAwIC8qIEludGVycnVwdCBGbGFnICovCisjZGVmaW5lIFg4Nl9FRkxBR1NfREYJMHgwMDAwMDQwMCAvKiBEaXJlY3Rpb24gRmxhZyAqLworI2RlZmluZSBYODZfRUZMQUdTX09GCTB4MDAwMDA4MDAgLyogT3ZlcmZsb3cgRmxhZyAqLworI2RlZmluZSBYODZfRUZMQUdTX0lPUEwJMHgwMDAwMzAwMCAvKiBJT1BMIG1hc2sgKi8KKyNkZWZpbmUgWDg2X0VGTEFHU19OVAkweDAwMDA0MDAwIC8qIE5lc3RlZCBUYXNrICovCisjZGVmaW5lIFg4Nl9FRkxBR1NfUkYJMHgwMDAxMDAwMCAvKiBSZXN1bWUgRmxhZyAqLworI2RlZmluZSBYODZfRUZMQUdTX1ZNCTB4MDAwMjAwMDAgLyogVmlydHVhbCBNb2RlICovCisjZGVmaW5lIFg4Nl9FRkxBR1NfQUMJMHgwMDA0MDAwMCAvKiBBbGlnbm1lbnQgQ2hlY2sgKi8KKyNkZWZpbmUgWDg2X0VGTEFHU19WSUYJMHgwMDA4MDAwMCAvKiBWaXJ0dWFsIEludGVycnVwdCBGbGFnICovCisjZGVmaW5lIFg4Nl9FRkxBR1NfVklQCTB4MDAxMDAwMDAgLyogVmlydHVhbCBJbnRlcnJ1cHQgUGVuZGluZyAqLworI2RlZmluZSBYODZfRUZMQUdTX0lECTB4MDAyMDAwMDAgLyogQ1BVSUQgZGV0ZWN0aW9uIGZsYWcgKi8KKworLyoKKyAqIEdlbmVyaWMgQ1BVSUQgZnVuY3Rpb24KKyAqLworc3RhdGljIGlubGluZSB2b2lkIGNwdWlkKGludCBvcCwgCisJdW5zaWduZWQgaW50ICplYXgsIHVuc2lnbmVkIGludCAqZWJ4LCB1bnNpZ25lZCBpbnQgKmVjeCwgdW5zaWduZWQgaW50ICplZHgpCit7CisJX19hc21fXygiY3B1aWQiCisJCTogIj1hIiAoKmVheCksCisJCSAgIj1iIiAoKmVieCksCisJCSAgIj1jIiAoKmVjeCksCisJCSAgIj1kIiAoKmVkeCkKKwkJOiAiMCIgKG9wKSk7Cit9CisKKy8qCisgKiBDUFVJRCBmdW5jdGlvbnMgcmV0dXJuaW5nIGEgc2luZ2xlIGRhdHVtCisgKi8KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGNwdWlkX2VheCh1bnNpZ25lZCBpbnQgb3ApCit7CisJdW5zaWduZWQgaW50IGVheDsKKworCV9fYXNtX18oImNwdWlkIgorCQk6ICI9YSIgKGVheCkKKwkJOiAiMCIgKG9wKQorCQk6ICJieCIsICJjeCIsICJkeCIpOworCXJldHVybiBlYXg7Cit9CitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBjcHVpZF9lYngodW5zaWduZWQgaW50IG9wKQoreworCXVuc2lnbmVkIGludCBlYXgsIGVieDsKKworCV9fYXNtX18oImNwdWlkIgorCQk6ICI9YSIgKGVheCksICI9YiIgKGVieCkKKwkJOiAiMCIgKG9wKQorCQk6ICJjeCIsICJkeCIgKTsKKwlyZXR1cm4gZWJ4OworfQorc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgY3B1aWRfZWN4KHVuc2lnbmVkIGludCBvcCkKK3sKKwl1bnNpZ25lZCBpbnQgZWF4LCBlY3g7CisKKwlfX2FzbV9fKCJjcHVpZCIKKwkJOiAiPWEiIChlYXgpLCAiPWMiIChlY3gpCisJCTogIjAiIChvcCkKKwkJOiAiYngiLCAiZHgiICk7CisJcmV0dXJuIGVjeDsKK30KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGNwdWlkX2VkeCh1bnNpZ25lZCBpbnQgb3ApCit7CisJdW5zaWduZWQgaW50IGVheCwgZWR4OworCisJX19hc21fXygiY3B1aWQiCisJCTogIj1hIiAoZWF4KSwgIj1kIiAoZWR4KQorCQk6ICIwIiAob3ApCisJCTogImJ4IiwgImN4Iik7CisJcmV0dXJuIGVkeDsKK30KKworLyoKKyAqIEludGVsIENQVSBmZWF0dXJlcyBpbiBDUjQKKyAqLworI2RlZmluZSBYODZfQ1I0X1ZNRQkJMHgwMDAxCS8qIGVuYWJsZSB2bTg2IGV4dGVuc2lvbnMgKi8KKyNkZWZpbmUgWDg2X0NSNF9QVkkJCTB4MDAwMgkvKiB2aXJ0dWFsIGludGVycnVwdHMgZmxhZyBlbmFibGUgKi8KKyNkZWZpbmUgWDg2X0NSNF9UU0QJCTB4MDAwNAkvKiBkaXNhYmxlIHRpbWUgc3RhbXAgYXQgaXBsIDMgKi8KKyNkZWZpbmUgWDg2X0NSNF9ERQkJMHgwMDA4CS8qIGVuYWJsZSBkZWJ1Z2dpbmcgZXh0ZW5zaW9ucyAqLworI2RlZmluZSBYODZfQ1I0X1BTRQkJMHgwMDEwCS8qIGVuYWJsZSBwYWdlIHNpemUgZXh0ZW5zaW9ucyAqLworI2RlZmluZSBYODZfQ1I0X1BBRQkJMHgwMDIwCS8qIGVuYWJsZSBwaHlzaWNhbCBhZGRyZXNzIGV4dGVuc2lvbnMgKi8KKyNkZWZpbmUgWDg2X0NSNF9NQ0UJCTB4MDA0MAkvKiBNYWNoaW5lIGNoZWNrIGVuYWJsZSAqLworI2RlZmluZSBYODZfQ1I0X1BHRQkJMHgwMDgwCS8qIGVuYWJsZSBnbG9iYWwgcGFnZXMgKi8KKyNkZWZpbmUgWDg2X0NSNF9QQ0UJCTB4MDEwMAkvKiBlbmFibGUgcGVyZm9ybWFuY2UgY291bnRlcnMgYXQgaXBsIDMgKi8KKyNkZWZpbmUgWDg2X0NSNF9PU0ZYU1IJCTB4MDIwMAkvKiBlbmFibGUgZmFzdCBGUFUgc2F2ZSBhbmQgcmVzdG9yZSAqLworI2RlZmluZSBYODZfQ1I0X09TWE1NRVhDUFQJMHgwNDAwCS8qIGVuYWJsZSB1bm1hc2tlZCBTU0UgZXhjZXB0aW9ucyAqLworCisKKyNkZWZpbmUgTVNSX0s2X0VGRVIJCQkweEMwMDAwMDgwCisvKiBFRkVSIGJpdHM6ICovIAorI2RlZmluZSBfRUZFUl9TQ0UgMCAgLyogU1lTQ0FMTC9TWVNSRVQgKi8KKyNkZWZpbmUgX0VGRVJfTE1FIDggIC8qIExvbmcgbW9kZSBlbmFibGUgKi8KKyNkZWZpbmUgX0VGRVJfTE1BIDEwIC8qIExvbmcgbW9kZSBhY3RpdmUgKHJlYWQtb25seSkgKi8KKyNkZWZpbmUgX0VGRVJfTlggMTEgIC8qIE5vIGV4ZWN1dGUgZW5hYmxlICovCisKKyNkZWZpbmUgRUZFUl9TQ0UgKDE8PF9FRkVSX1NDRSkKKyNkZWZpbmUgRUZFUl9MTUUgKDE8PEVGRVJfTE1FKQorI2RlZmluZSBFRkVSX0xNQSAoMTw8RUZFUl9MTUEpCisjZGVmaW5lIEVGRVJfTlggKDE8PF9FRkVSX05YKQorCisjZGVmaW5lIHJkbXNyKG1zcix2YWwxLHZhbDIpIFwKKyAgICAgX19hc21fXyBfX3ZvbGF0aWxlX18oInJkbXNyIiBcCisJCQkgIDogIj1hIiAodmFsMSksICI9ZCIgKHZhbDIpIFwKKwkJCSAgOiAiYyIgKG1zcikpCisKKyNkZWZpbmUgd3Jtc3IobXNyLHZhbDEsdmFsMikgXAorICAgICBfX2FzbV9fIF9fdm9sYXRpbGVfXygid3Jtc3IiIFwKKwkJCSAgOiAvKiBubyBvdXRwdXRzICovIFwKKwkJCSAgOiAiYyIgKG1zciksICJhIiAodmFsMSksICJkIiAodmFsMikpCisKKworI2RlZmluZSByZWFkX2NyMCgpCSh7IFwKKwl1bnNpZ25lZCBpbnQgX19kdW1teTsgXAorCV9fYXNtX18oIFwKKwkJIm1vdmwgJSVjcjAsICUwXG5cdCIgXAorCQk6Ij1yIiAoX19kdW1teSkpOyBcCisJX19kdW1teTsgXAorfSkKKyNkZWZpbmUgd3JpdGVfY3IwKHgpIFwKKwlfX2FzbV9fKCJtb3ZsICUwLCUlY3IwIjogOiJyIiAoeCkpOworCisjZGVmaW5lIHJlYWRfY3IzKCkJKHsgXAorCXVuc2lnbmVkIGludCBfX2R1bW15OyBcCisJX19hc21fXyggXAorCQkibW92bCAlJWNyMywgJTBcblx0IiBcCisJCToiPXIiIChfX2R1bW15KSk7IFwKKwlfX2R1bW15OyBcCit9KQorI2RlZmluZSB3cml0ZV9jcjN4KHgpIFwKKwlfX2FzbV9fKCJtb3ZsICUwLCUlY3IzIjogOiJyIiAoeCkpOworCisKKyNkZWZpbmUgcmVhZF9jcjQoKQkoeyBcCisJdW5zaWduZWQgaW50IF9fZHVtbXk7IFwKKwlfX2FzbV9fKCBcCisJCSJtb3ZsICUlY3I0LCAlMFxuXHQiIFwKKwkJOiI9ciIgKF9fZHVtbXkpKTsgXAorCV9fZHVtbXk7IFwKK30pCisjZGVmaW5lIHdyaXRlX2NyNHgoeCkgXAorCV9fYXNtX18oIm1vdmwgJTAsJSVjcjQiOiA6InIiICh4KSk7CisKKworZXh0ZXJuIHN0cnVjdCBjcHVpbmZvX3g4NiBjcHVfaW5mbzsKKyNpZmRlZiBDT05GSUdfWDg2XzY0CitleHRlcm4gdm9pZCBjcHVfc2V0dXAodm9pZCk7CisjZWxzZQorI2RlZmluZSBjcHVfc2V0dXAoKSBkbyB7fSB3aGlsZSgwKQorI2VuZGlmCisKKyNlbmRpZiAvKiBJMzg2X0JJVFNfQ1BVX0ggKi8KZGlmZiAtTmF1ciBncnViLTAuOTcub3JpZy9uZXRib290L2NzODl4MC5jIGdydWItMC45Ny9uZXRib290L2NzODl4MC5jCi0tLSBncnViLTAuOTcub3JpZy9uZXRib290L2NzODl4MC5jCTIwMDMtMDctMDkgMTE6NDU6MzcuMDAwMDAwMDAwICswMDAwCisrKyBncnViLTAuOTcvbmV0Ym9vdC9jczg5eDAuYwkxOTcwLTAxLTAxIDAwOjAwOjAwLjAwMDAwMDAwMCArMDAwMApAQCAtMSw2NTkgKzAsMCBAQAotLyogY3M4OXgwLmM6IEEgQ3J5c3RhbCBTZW1pY29uZHVjdG9yIENTODlbMDJdMCBkcml2ZXIgZm9yIGV0aGVyYm9vdC4gKi8KLS8qCi0gIFBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBkaXN0cmlidXRlIHRoZSBlbmNsb3NlZCBjczg5eDAuW2NoXSBkcml2ZXIKLSAgb25seSBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZSBFdGhlcmJvb3QgcGFja2FnZS4gIFRoZSBjb2RlIGlzCi0gIG9yZGluYXJpbHkgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEdQTC4KLSAgCi0gIFJ1c3MgTmVsc29uLCBKYW51YXJ5IDIwMDAKLQotICBDaGFuZ2VMb2c6Ci0KLSAgVGh1IERlYyA2IDIyOjQwOjAwIDE5OTYgIE1hcmt1cyBHdXRzY2hrZSAgPGd1dHNjaGtAbWF0aC51bmktbXVlbnN0ZXIuZGU+Ci0KLSAgKiBkaXNhYmxlZCBhbGwgImFkdmFuY2VkIiBmZWF0dXJlczsgdGhpcyBzaG91bGQgbWFrZSB0aGUgY29kZSBtb3JlIHJlbGlhYmxlCi0KLSAgKiByZW9yZ2FuaXplZCB0aGUgcmVzZXQgZnVuY3Rpb24KLQotICAqIGFsd2F5cyByZXNldCB0aGUgYWRkcmVzcyBwb3J0LCBzbyB0aGF0IGF1dG9wcm9iaW5nIHdpbGwgY29udGludWUgd29ya2luZwotCi0gICogc29tZSBjb3NtZXRpYyBjaGFuZ2VzCi0KLSAgKiAyLjUKLQotICBUaHUgRGVjIDUgMjE6MDA6MDAgMTk5NiAgTWFya3VzIEd1dHNjaGtlICA8Z3V0c2Noa0BtYXRoLnVuaS1tdWVuc3Rlci5kZT4KLQotICAqIHRlc3RlZCB0aGUgY29kZSBhZ2FpbnN0IGEgQ1M4OTAwIGNhcmQKLQotICAqIGxvdHMgb2YgbWlub3IgYnVnIGZpeGVzIGFuZCBhZGp1c3RtZW50cwotCi0gICogdGhpcyBpcyB0aGUgZmlyc3QgcmVsZWFzZSwgdGhhdCBhY3R1YWxseSB3b3JrcyEgaXQgc3RpbGwgcmVxdWlyZXMgc29tZQotICAgIGNoYW5nZXMgaW4gb3JkZXIgdG8gYmUgbW9yZSB0b2xlcmFudCB0byBkaWZmZXJlbnQgZW52aXJvbm1lbnRzCi0KLSAgKiA0Ci0KLSAgRnJpIE5vdiAyMiAyMzowMDowMCAxOTk2ICBNYXJrdXMgR3V0c2Noa2UgIDxndXRzY2hrQG1hdGgudW5pLW11ZW5zdGVyLmRlPgotCi0gICogcmVhZCB0aGUgbWFudWFscyBmb3IgdGhlIENTODl4MCBjaGlwc2V0cyBhbmQgdG9vayBub3RlIG9mIGFsbCB0aGUKLSAgICBjaGFuZ2VzIHRoYXQgd2lsbCBiZSBuZWNjZXNzYXJ5IGluIG9yZGVyIHRvIGFkYXB0IFJ1c3NlbCBOZWxzb24ncyBjb2RlCi0gICAgdG8gdGhlIHJlcXVpcmVtZW50cyBvZiBhIEJPT1QtUHJvbQotCi0gICogNgotCi0gIFRodSBOb3YgMTkgMjI6MDA6MDAgMTk5NiAgTWFya3VzIEd1dHNjaGtlICA8Z3V0c2Noa0BtYXRoLnVuaS1tdWVuc3Rlci5kZT4KLQotICAqIFN5bmNoZWQgd2l0aCBSdXNzZWwgTmVsc29uJ3MgY3VycmVudCBjb2RlICh2MS4wMCkKLQotICAqIDIKLQotICBUaHUgTm92IDEyIDE4OjAwOjAwIDE5OTYgIE1hcmt1cyBHdXRzY2hrZSAgPGd1dHNjaGtAbWF0aC51bmktbXVlbnN0ZXIuZGU+Ci0KLSAgKiBDbGVhbmVkIHVwIHNvbWUgb2YgdGhlIGNvZGUgYW5kIHRyaWVkIHRvIG9wdGltaXplIHRoZSBjb2RlIHNpemUuCi0KLSAgKiAxLjUKLQotICBTdW4gTm92IDEwIDE2OjMwOjAwIDE5OTYgIE1hcmt1cyBHdXRzY2hrZSAgPGd1dHNjaGtAbWF0aC51bmktbXVlbnN0ZXIuZGU+Ci0KLSAgKiBGaXJzdCBleHBlcmltZW50YWwgcmVsZWFzZS4gVGhpcyBjb2RlIGNvbXBpbGVzIGZpbmUsIGJ1dCBJCi0gIGhhdmUgbm8gd2F5IG9mIHRlc3Rpbmcgd2hldGhlciBpdCBhY3R1YWxseSB3b3Jrcy4KLQotICAqIEkgZGlkIG5vdCAoeWV0KSBib3RoZXIgdG8gbWFrZSB0aGUgY29kZSAxNmJpdCBhd2FyZSwgc28gZm9yCi0gIHRoZSB0aW1lIGJlaW5nLCBpdCB3aWxsIG9ubHkgd29yayBmb3IgRXRoZXJib290LzMyLgotCi0gICogMTIKLQotICAqLwotCi0jaW5jbHVkZSAiZXRoZXJib290LmgiCi0jaW5jbHVkZSAibmljLmgiCi0jaW5jbHVkZSAiY2FyZHMuaCIKLSNpbmNsdWRlICJjczg5eDAuaCIKLQotc3RhdGljIHVuc2lnbmVkIHNob3J0CWV0aF9uaWNfYmFzZTsKLXN0YXRpYyB1bnNpZ25lZCBsb25nICAgIGV0aF9tZW1fc3RhcnQ7Ci1zdGF0aWMgdW5zaWduZWQgc2hvcnQgICBldGhfaXJxOwotc3RhdGljIHVuc2lnbmVkIHNob3J0ICAgZXRoX2NzX3R5cGU7CS8qIG9uZSBvZjogQ1M4OTAwLCBDUzg5MjAsIENTODkyME0gICovCi1zdGF0aWMgdW5zaWduZWQgc2hvcnQgICBldGhfYXV0b19uZWdfY25mOwotc3RhdGljIHVuc2lnbmVkIHNob3J0ICAgZXRoX2FkYXB0ZXJfY25mOwotc3RhdGljIHVuc2lnbmVkIHNob3J0CWV0aF9saW5lY3RsOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCUNTODl4MCAtIHNwZWNpZmljIHJvdXRpbmVzCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RhdGljIGlubGluZSBpbnQgcmVhZHJlZyhpbnQgcG9ydG5vKQotewotCW91dHcocG9ydG5vLCBldGhfbmljX2Jhc2UgKyBBRERfUE9SVCk7Ci0JcmV0dXJuIGludyhldGhfbmljX2Jhc2UgKyBEQVRBX1BPUlQpOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgd3JpdGVyZWcoaW50IHBvcnRubywgaW50IHZhbHVlKQotewotCW91dHcocG9ydG5vLCBldGhfbmljX2Jhc2UgKyBBRERfUE9SVCk7Ci0Jb3V0dyh2YWx1ZSwgZXRoX25pY19iYXNlICsgREFUQV9QT1JUKTsKLQlyZXR1cm47Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1FRVBST00gYWNjZXNzCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RhdGljIGludCB3YWl0X2VlcHJvbV9yZWFkeSh2b2lkKQotewotCXVuc2lnbmVkIGxvbmcgdG1vID0gY3VycnRpY2tzKCkgKyA0KlRJQ0tTX1BFUl9TRUM7Ci0KLQkvKiBjaGVjayB0byBzZWUgaWYgdGhlIEVFUFJPTSBpcyByZWFkeSwgYSB0aW1lb3V0IGlzIHVzZWQgLQotCSAgIGp1c3QgaW4gY2FzZSBFRVBST00gaXMgcmVhZHkgd2hlbiBTSV9CVVNZIGluIHRoZQotCSAgIFBQX1NlbGZTVCBpcyBjbGVhciAqLwotCXdoaWxlKHJlYWRyZWcoUFBfU2VsZlNUKSAmIFNJX0JVU1kpIHsKLQkJaWYgKGN1cnJ0aWNrcygpID49IHRtbykKLQkJCXJldHVybiAtMTsgfQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGdldF9lZXByb21fZGF0YShpbnQgb2ZmLCBpbnQgbGVuLCB1bnNpZ25lZCBzaG9ydCAqYnVmZmVyKQotewotCWludCBpOwotCi0jaWZkZWYJRURFQlVHCi0JcHJpbnRmKCJcbmNzOiBFRVBST00gZGF0YSBmcm9tICVoWCBmb3IgJWhYOiIsb2ZmLGxlbik7Ci0jZW5kaWYKLQlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKLQkJaWYgKHdhaXRfZWVwcm9tX3JlYWR5KCkgPCAwKQotCQkJcmV0dXJuIC0xOwotCQkvKiBOb3cgc2VuZCB0aGUgRUVQUk9NIHJlYWQgY29tbWFuZCBhbmQgRUVQUk9NIGxvY2F0aW9uCi0JCSAgIHRvIHJlYWQgKi8KLQkJd3JpdGVyZWcoUFBfRUVDTUQsIChvZmYgKyBpKSB8IEVFUFJPTV9SRUFEX0NNRCk7Ci0JCWlmICh3YWl0X2VlcHJvbV9yZWFkeSgpIDwgMCkKLQkJCXJldHVybiAtMTsKLQkJYnVmZmVyW2ldID0gcmVhZHJlZyhQUF9FRURhdGEpOwotI2lmZGVmCUVERUJVRwotCQlpZiAoIShpJTEwKSkKLQkJCXByaW50ZigiXG5jczogIik7Ci0JCXByaW50ZigiJWhYICIsIGJ1ZmZlcltpXSk7Ci0jZW5kaWYKLQl9Ci0jaWZkZWYJRURFQlVHCi0JcHV0Y2hhcignXG4nKTsKLSNlbmRpZgotCi0JcmV0dXJuKDApOwotfQotCi1zdGF0aWMgaW50IGdldF9lZXByb21fY2hrc3VtKGludCBvZmYsIGludCBsZW4sIHVuc2lnbmVkIHNob3J0ICpidWZmZXIpCi17Ci0JaW50ICBpLCBja3N1bTsKLQotCWNrc3VtID0gMDsKLQlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspCi0JCWNrc3VtICs9IGJ1ZmZlcltpXTsKLQlja3N1bSAmPSAweGZmZmY7Ci0JaWYgKGNrc3VtID09IDApCi0JCXJldHVybiAwOwotCXJldHVybiAtMTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLUFjdGl2YXRlIGFsbCBvZiB0aGUgYXZhaWxhYmxlIG1lZGlhIGFuZCBwcm9iZSBmb3IgbmV0d29yawotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0YXRpYyB2b2lkIGNscmxpbmUodm9pZCkKLXsKLQlpbnQgaTsKLQotCXB1dGNoYXIoJ1xyJyk7Ci0JZm9yIChpID0gNzk7IGktLTsgKSBwdXRjaGFyKCcgJyk7Ci0JcHJpbnRmKCJccmNzOiAiKTsKLQlyZXR1cm47Ci19Ci0KLXN0YXRpYyB2b2lkIGNvbnRyb2xfZGNfZGMoaW50IG9uX25vdF9vZmYpCi17Ci0JdW5zaWduZWQgaW50IHNlbGZjb250cm9sOwotCXVuc2lnbmVkIGxvbmcgdG1vID0gY3VycnRpY2tzKCkgKyBUSUNLU19QRVJfU0VDOwotCi0JLyogY29udHJvbCB0aGUgREMgdG8gREMgY29udmVydG9yIGluIHRoZSBTZWxmQ29udHJvbCByZWdpc3Rlci4gICovCi0Jc2VsZmNvbnRyb2wgPSBIQ0IxX0VOQkw7IC8qIEVuYWJsZSB0aGUgSENCMSBiaXQgYXMgYW4gb3V0cHV0ICovCi0JaWYgKCgoZXRoX2FkYXB0ZXJfY25mICYgQV9DTkZfRENfRENfUE9MQVJJVFkpICE9IDApIF4gb25fbm90X29mZikKLQkJc2VsZmNvbnRyb2wgfD0gSENCMTsKLQllbHNlCi0JCXNlbGZjb250cm9sICY9IH5IQ0IxOwotCXdyaXRlcmVnKFBQX1NlbGZDVEwsIHNlbGZjb250cm9sKTsKLQotCS8qIFdhaXQgZm9yIHRoZSBEQy9EQyBjb252ZXJ0ZXIgdG8gcG93ZXIgdXAgLSAxMDAwbXMgKi8KLQl3aGlsZSAoY3VycnRpY2tzKCkgPCB0bW8pOwotCi0JcmV0dXJuOwotfQotCi1zdGF0aWMgaW50IGRldGVjdF90cCh2b2lkKQotewotCXVuc2lnbmVkIGxvbmcgdG1vOwotCi0JLyogVHVybiBvbiB0aGUgY2hpcCBhdXRvIGRldGVjdGlvbiBvZiAxMEJULyBBVUkgKi8KLQotCWNscmxpbmUoKTsgcHJpbnRmKCJhdHRlbXB0aW5nICVzOiIsIlRQIik7Ci0KLSAgICAgICAgLyogSWYgY29ubmVjdGVkIHRvIGFub3RoZXIgZnVsbCBkdXBsZXggY2FwYWJsZSAxMC1CYXNlLVQgY2FyZAotCSAgIHRoZSBsaW5rIHB1bHNlcyBzZWVtIHRvIGJlIGxvc3Qgd2hlbiB0aGUgYXV0byBkZXRlY3QgYml0IGluCi0JICAgdGhlIExpbmVDVEwgaXMgc2V0LiAgVG8gb3ZlcmNvbWUgdGhpcyB0aGUgYXV0byBkZXRlY3QgYml0Ci0JICAgd2lsbCBiZSBjbGVhcmVkIHdoaWxzdCB0ZXN0aW5nIHRoZSAxMC1CYXNlLVQgaW50ZXJmYWNlLgotCSAgIFRoaXMgd291bGQgbm90IGJlIG5lY2Vzc2FyeSBmb3IgdGhlIHNwYXJyb3cgY2hpcCBidXQgaXMKLQkgICBzaW1wbGVyIHRvIGRvIGl0IGFueXdheS4gKi8KLQl3cml0ZXJlZyhQUF9MaW5lQ1RMLCBldGhfbGluZWN0bCAmfiBBVUlfT05MWSk7Ci0JY29udHJvbF9kY19kYygwKTsKLQotICAgICAgICAvKiBEZWxheSBmb3IgdGhlIGhhcmR3YXJlIHRvIHdvcmsgb3V0IGlmIHRoZSBUUCBjYWJsZSBpcwotCSAgIHByZXNlbnQgLSAxNTBtcyAqLwotCWZvciAodG1vID0gY3VycnRpY2tzKCkgKyA0OyBjdXJydGlja3MoKSA8IHRtbzsgKTsKLQotCWlmICgocmVhZHJlZyhQUF9MaW5lU1QpICYgTElOS19PSykgPT0gMCkKLQkJcmV0dXJuIDA7Ci0KLQlpZiAoZXRoX2NzX3R5cGUgIT0gQ1M4OTAwKSB7Ci0KLQkJd3JpdGVyZWcoUFBfQXV0b05lZ0NUTCwgZXRoX2F1dG9fbmVnX2NuZiAmIEFVVE9fTkVHX01BU0spOwotCi0JCWlmICgoZXRoX2F1dG9fbmVnX2NuZiAmIEFVVE9fTkVHX0JJVFMpID09IEFVVE9fTkVHX0VOQUJMRSkgewotCQkJcHJpbnRmKCIgbmVnb3RpYXRpbmcgZHVwbGV4Li4uICIpOwotCQkJd2hpbGUgKHJlYWRyZWcoUFBfQXV0b05lZ1NUKSAmIEFVVE9fTkVHX0JVU1kpIHsKLQkJCQlpZiAoY3VycnRpY2tzKCkgLSB0bW8gPiA0MCpUSUNLU19QRVJfU0VDKSB7Ci0JCQkJCXByaW50ZigidGltZSBvdXQgIik7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfQotCQlpZiAocmVhZHJlZyhQUF9BdXRvTmVnU1QpICYgRkRYX0FDVElWRSkKLQkJCXByaW50ZigidXNpbmcgZnVsbCBkdXBsZXgiKTsKLQkJZWxzZQotCQkJcHJpbnRmKCJ1c2luZyBoYWxmIGR1cGxleCIpOwotCX0KLQotCXJldHVybiBBX0NORl9NRURJQV8xMEJfVDsKLX0KLQotLyogc2VuZCBhIHRlc3QgcGFja2V0IC0gcmV0dXJuIHRydWUgaWYgY2FycmllciBiaXRzIGFyZSBvayAqLwotc3RhdGljIGludCBzZW5kX3Rlc3RfcGt0KHN0cnVjdCBuaWMgKm5pYykKLXsKLQlzdGF0aWMgdW5zaWduZWQgY2hhciB0ZXN0cGFja2V0W10gPSB7IDAsMCwwLDAsMCwwLCAwLDAsMCwwLDAsMCwKLQkJCQkgICAgIDAsIDQ2LCAvKkEgNDYgaW4gbmV0d29yayBvcmRlciAgICAgICAqLwotCQkJCSAgICAgMCwgMCwgIC8qRFNBUD0wICYgU1NBUD0wIGZpZWxkcyAgICAgICovCi0JCQkJICAgICAweGYzLDAgLypDb250cm9sIChUZXN0IFJlcStQIGJpdCBzZXQpKi8gfTsKLQl1bnNpZ25lZCBsb25nIHRtbzsKLQotCXdyaXRlcmVnKFBQX0xpbmVDVEwsIHJlYWRyZWcoUFBfTGluZUNUTCkgfCBTRVJJQUxfVFhfT04pOwotCi0JbWVtY3B5KHRlc3RwYWNrZXQsIG5pYy0+bm9kZV9hZGRyLCBFVEhfQUxFTik7Ci0JbWVtY3B5KHRlc3RwYWNrZXQrRVRIX0FMRU4sIG5pYy0+bm9kZV9hZGRyLCBFVEhfQUxFTik7Ci0KLQlvdXR3KFRYX0FGVEVSX0FMTCwgZXRoX25pY19iYXNlICsgVFhfQ01EX1BPUlQpOwotCW91dHcoRVRIX1pMRU4sIGV0aF9uaWNfYmFzZSArIFRYX0xFTl9QT1JUKTsKLQotCS8qIFRlc3QgdG8gc2VlIGlmIHRoZSBjaGlwIGhhcyBhbGxvY2F0ZWQgbWVtb3J5IGZvciB0aGUgcGFja2V0ICovCi0JZm9yICh0bW8gPSBjdXJydGlja3MoKSArIDI7Ci0JICAgICAocmVhZHJlZyhQUF9CdXNTVCkgJiBSRUFEWV9GT1JfVFhfTk9XKSA9PSAwOyApCi0JCWlmIChjdXJydGlja3MoKSA+PSB0bW8pCi0JCQlyZXR1cm4oMCk7Ci0KLQkvKiBXcml0ZSB0aGUgY29udGVudHMgb2YgdGhlIHBhY2tldCAqLwotCW91dHN3KGV0aF9uaWNfYmFzZSArIFRYX0ZSQU1FX1BPUlQsIHRlc3RwYWNrZXQsCi0JICAgICAgKEVUSF9aTEVOKzEpPj4xKTsKLQotCXByaW50ZigiIHNlbmRpbmcgdGVzdCBwYWNrZXQgIik7Ci0JLyogd2FpdCBhIGNvdXBsZSBvZiB0aW1lciB0aWNrcyBmb3IgcGFja2V0IHRvIGJlIHJlY2VpdmVkICovCi0JZm9yICh0bW8gPSBjdXJydGlja3MoKSArIDI7IGN1cnJ0aWNrcygpIDwgdG1vOyApOwotCi0JaWYgKChyZWFkcmVnKFBQX1R4RXZlbnQpICYgVFhfU0VORF9PS19CSVRTKSA9PSBUWF9PSykgewotCQkJcHJpbnRmKCJzdWNjZWVkZWQiKTsKLQkJCXJldHVybiAxOwotCX0KLQlwcmludGYoImZhaWxlZCIpOwotCXJldHVybiAwOwotfQotCi0KLXN0YXRpYyBpbnQgZGV0ZWN0X2F1aShzdHJ1Y3QgbmljICpuaWMpCi17Ci0JY2xybGluZSgpOyBwcmludGYoImF0dGVtcHRpbmcgJXM6IiwiQVVJIik7Ci0JY29udHJvbF9kY19kYygwKTsKLQotCXdyaXRlcmVnKFBQX0xpbmVDVEwsIChldGhfbGluZWN0bCAmIH5BVVRPX0FVSV8xMEJBU0VUKSB8IEFVSV9PTkxZKTsKLQotCWlmIChzZW5kX3Rlc3RfcGt0KG5pYykpIHsKLQkJcmV0dXJuIEFfQ05GX01FRElBX0FVSTsgfQotCWVsc2UKLQkJcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgZGV0ZWN0X2JuYyhzdHJ1Y3QgbmljICpuaWMpCi17Ci0JY2xybGluZSgpOyBwcmludGYoImF0dGVtcHRpbmcgJXM6IiwiQk5DIik7Ci0JY29udHJvbF9kY19kYygxKTsKLQotCXdyaXRlcmVnKFBQX0xpbmVDVEwsIChldGhfbGluZWN0bCAmIH5BVVRPX0FVSV8xMEJBU0VUKSB8IEFVSV9PTkxZKTsKLQotCWlmIChzZW5kX3Rlc3RfcGt0KG5pYykpIHsKLQkJcmV0dXJuIEFfQ05GX01FRElBXzEwQl8yOyB9Ci0JZWxzZQotCQlyZXR1cm4gMDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1FVEhfUkVTRVQgLSBSZXNldCBhZGFwdGVyCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0YXRpYyB2b2lkIGNzODl4MF9yZXNldChzdHJ1Y3QgbmljICpuaWMpCi17Ci0JaW50ICBpOwotCXVuc2lnbmVkIGxvbmcgcmVzZXRfdG1vOwotCi0Jd3JpdGVyZWcoUFBfU2VsZkNUTCwgcmVhZHJlZyhQUF9TZWxmQ1RMKSB8IFBPV0VSX09OX1JFU0VUKTsKLQotCS8qIHdhaXQgZm9yIHR3byB0aWNrczsgdGhhdCBpcyAyKjU1bXMgKi8KLQlmb3IgKHJlc2V0X3RtbyA9IGN1cnJ0aWNrcygpICsgMjsgY3VycnRpY2tzKCkgPCByZXNldF90bW87ICk7Ci0KLQlpZiAoZXRoX2NzX3R5cGUgIT0gQ1M4OTAwKSB7Ci0JCS8qIEhhcmR3YXJlIHByb2JsZW0gcmVxdWlyZXMgUE5QIHJlZ2lzdGVycyB0byBiZSByZWNvbmZpZ3VyZWQKLQkJICAgYWZ0ZXIgYSByZXNldCAqLwotCQlpZiAoZXRoX2lycSAhPSAweEZGRkYpIHsKLQkJCW91dHcoUFBfQ1M4OTIwX0lTQUlOVCwgZXRoX25pY19iYXNlICsgQUREX1BPUlQpOwotCQkJb3V0YihldGhfaXJxLCBldGhfbmljX2Jhc2UgKyBEQVRBX1BPUlQpOwotCQkJb3V0YigwLCBldGhfbmljX2Jhc2UgKyBEQVRBX1BPUlQgKyAxKTsgfQotCi0JCWlmIChldGhfbWVtX3N0YXJ0KSB7Ci0JCQlvdXR3KFBQX0NTODkyMF9JU0FNZW1CLCBldGhfbmljX2Jhc2UgKyBBRERfUE9SVCk7Ci0JCQlvdXRiKChldGhfbWVtX3N0YXJ0ID4+IDgpICYgMHhmZiwgZXRoX25pY19iYXNlICsgREFUQV9QT1JUKTsKLQkJCW91dGIoKGV0aF9tZW1fc3RhcnQgPj4gMjQpICYgMHhmZiwgZXRoX25pY19iYXNlICsgREFUQV9QT1JUICsgMSk7IH0gfQotCi0JLyogV2FpdCB1bnRpbCB0aGUgY2hpcCBpcyByZXNldCAqLwotCWZvciAocmVzZXRfdG1vID0gY3VycnRpY2tzKCkgKyAyOwotCSAgICAgKHJlYWRyZWcoUFBfU2VsZlNUKSAmIElOSVRfRE9ORSkgPT0gMCAmJgotCQkgICAgIGN1cnJ0aWNrcygpIDwgcmVzZXRfdG1vOyApOwotCi0JLyogZGlzYWJsZSBpbnRlcnJ1cHRzIGFuZCBtZW1vcnkgYWNjZXNzZXMgKi8KLQl3cml0ZXJlZyhQUF9CdXNDVEwsIDApOwotCi0JLyogc2V0IHRoZSBldGhlcm5ldCBhZGRyZXNzICovCi0JZm9yIChpPTA7IGkgPCBFVEhfQUxFTi8yOyBpKyspCi0JCXdyaXRlcmVnKFBQX0lBK2kqMiwKLQkJCSBuaWMtPm5vZGVfYWRkcltpKjJdIHwKLQkJCSAobmljLT5ub2RlX2FkZHJbaSoyKzFdIDw8IDgpKTsKLQotCS8qIHJlY2VpdmUgb25seSBlcnJvciBmcmVlIHBhY2tldHMgYWRkcmVzc2VkIHRvIHRoaXMgY2FyZCAqLwotCXdyaXRlcmVnKFBQX1J4Q1RMLCBERUZfUlhfQUNDRVBUKTsKLQotCS8qIGRvIG5vdCBnZW5lcmF0ZSBhbnkgaW50ZXJydXB0cyBvbiByZWNlaXZlIG9wZXJhdGlvbnMgKi8KLQl3cml0ZXJlZyhQUF9SeENGRywgMCk7Ci0KLQkvKiBkbyBub3QgZ2VuZXJhdGUgYW55IGludGVycnVwdHMgb24gdHJhbnNtaXQgb3BlcmF0aW9ucyAqLwotCXdyaXRlcmVnKFBQX1R4Q0ZHLCAwKTsKLQotCS8qIGRvIG5vdCBnZW5lcmF0ZSBhbnkgaW50ZXJydXB0cyBvbiBidWZmZXIgb3BlcmF0aW9ucyAqLwotCXdyaXRlcmVnKFBQX0J1ZkNGRywgMCk7Ci0KLQkvKiByZXNldCBhZGRyZXNzIHBvcnQsIHNvIHRoYXQgYXV0b3Byb2Jpbmcgd2lsbCBrZWVwIHdvcmtpbmcgKi8KLQlvdXR3KFBQX0NoaXBJRCwgZXRoX25pY19iYXNlICsgQUREX1BPUlQpOwotCi0JcmV0dXJuOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLUVUSF9UUkFOU01JVCAtIFRyYW5zbWl0IGEgZnJhbWUKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RhdGljIHZvaWQgY3M4OXgwX3RyYW5zbWl0KAotCXN0cnVjdCBuaWMgKm5pYywKLQljb25zdCBjaGFyICpkLAkJCS8qIERlc3RpbmF0aW9uICovCi0JdW5zaWduZWQgaW50IHQsCQkJLyogVHlwZSAqLwotCXVuc2lnbmVkIGludCBzLAkJCS8qIHNpemUgKi8KLQljb25zdCBjaGFyICpwKQkJCS8qIFBhY2tldCAqLwotewotCXVuc2lnbmVkIGxvbmcgdG1vOwotCWludCAgICAgICAgICAgc3I7Ci0KLQkvKiBkb2VzIHRoaXMgc2l6ZSBoYXZlIHRvIGJlIHJvdW5kZWQ/Pz8gcGxlYXNlLAotCSAgIHNvbWVib2R5IGhhdmUgYSBsb29rIGluIHRoZSBzcGVjcyAqLwotCWlmICgoc3IgPSAoKHMgKyBFVEhfSExFTiArIDEpJn4xKSkgPCBFVEhfWkxFTikKLQkJc3IgPSBFVEhfWkxFTjsKLQotcmV0cnk6Ci0JLyogaW5pdGlhdGUgYSB0cmFuc21pdCBzZXF1ZW5jZSAqLwotCW91dHcoVFhfQUZURVJfQUxMLCBldGhfbmljX2Jhc2UgKyBUWF9DTURfUE9SVCk7Ci0Jb3V0dyhzciwgZXRoX25pY19iYXNlICsgVFhfTEVOX1BPUlQpOwotCi0JLyogVGVzdCB0byBzZWUgaWYgdGhlIGNoaXAgaGFzIGFsbG9jYXRlZCBtZW1vcnkgZm9yIHRoZSBwYWNrZXQgKi8KLQlpZiAoKHJlYWRyZWcoUFBfQnVzU1QpICYgUkVBRFlfRk9SX1RYX05PVykgPT0gMCkgewotCQkvKiBPb3BzLi4uIHRoaXMgc2hvdWxkIG5vdCBoYXBwZW4hICovCi0JCXByaW50ZigiY3M6IHVuYWJsZSB0byBzZW5kIHBhY2tldDsgcmV0cnlpbmcuLi5cbiIpOwotCQlmb3IgKHRtbyA9IGN1cnJ0aWNrcygpICsgNSpUSUNLU19QRVJfU0VDOyBjdXJydGlja3MoKSA8IHRtbzsgKTsKLQkJY3M4OXgwX3Jlc2V0KG5pYyk7Ci0JCWdvdG8gcmV0cnk7IH0KLQotCS8qIFdyaXRlIHRoZSBjb250ZW50cyBvZiB0aGUgcGFja2V0ICovCi0Jb3V0c3coZXRoX25pY19iYXNlICsgVFhfRlJBTUVfUE9SVCwgZCwgRVRIX0FMRU4vMik7Ci0Jb3V0c3coZXRoX25pY19iYXNlICsgVFhfRlJBTUVfUE9SVCwgbmljLT5ub2RlX2FkZHIsCi0JICAgICAgRVRIX0FMRU4vMik7Ci0Jb3V0dygoKHQgPj4gOCkmMHhGRil8KHQgPDwgOCksIGV0aF9uaWNfYmFzZSArIFRYX0ZSQU1FX1BPUlQpOwotCW91dHN3KGV0aF9uaWNfYmFzZSArIFRYX0ZSQU1FX1BPUlQsIHAsIChzKzEpLzIpOwotCWZvciAoc3IgPSBzci8yIC0gKHMrMSkvMiAtIEVUSF9BTEVOIC0gMTsgc3ItLSA+IDA7Ci0JICAgICBvdXR3KDAsIGV0aF9uaWNfYmFzZSArIFRYX0ZSQU1FX1BPUlQpKTsKLQotCS8qIHdhaXQgZm9yIHRyYW5zZmVyIHRvIHN1Y2NlZWQgKi8KLQlmb3IgKHRtbyA9IGN1cnJ0aWNrcygpKzUqVElDS1NfUEVSX1NFQzsKLQkgICAgIChzID0gcmVhZHJlZyhQUF9UeEV2ZW50KSZ+MHgxRikgPT0gMCAmJiBjdXJydGlja3MoKSA8IHRtbzspCi0JCS8qIG5vdGhpbmcgKi8gOwotCWlmICgocyAmIFRYX1NFTkRfT0tfQklUUykgIT0gVFhfT0spIHsKLQkJcHJpbnRmKCJcbnRyYW5zbWlzc2lvbiBlcnJvciAlI2hYXG4iLCBzKTsKLQl9Ci0KLQlyZXR1cm47Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotRVRIX1BPTEwgLSBXYWl0IGZvciBhIGZyYW1lCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0YXRpYyBpbnQgY3M4OXgwX3BvbGwoc3RydWN0IG5pYyAqbmljKQotewotCWludCBzdGF0dXM7Ci0KLQlzdGF0dXMgPSByZWFkcmVnKFBQX1J4RXZlbnQpOwotCi0JaWYgKChzdGF0dXMgJiBSWF9PSykgPT0gMCkKLQkJcmV0dXJuKDApOwotCi0Jc3RhdHVzID0gaW53KGV0aF9uaWNfYmFzZSArIFJYX0ZSQU1FX1BPUlQpOwotCW5pYy0+cGFja2V0bGVuID0gaW53KGV0aF9uaWNfYmFzZSArIFJYX0ZSQU1FX1BPUlQpOwotCWluc3coZXRoX25pY19iYXNlICsgUlhfRlJBTUVfUE9SVCwgbmljLT5wYWNrZXQsIG5pYy0+cGFja2V0bGVuID4+IDEpOwotCWlmIChuaWMtPnBhY2tldGxlbiAmIDEpCi0JCW5pYy0+cGFja2V0W25pYy0+cGFja2V0bGVuLTFdID0gaW53KGV0aF9uaWNfYmFzZSArIFJYX0ZSQU1FX1BPUlQpOwotCXJldHVybiAxOwotfQotCi1zdGF0aWMgdm9pZCBjczg5eDBfZGlzYWJsZShzdHJ1Y3QgbmljICpuaWMpCi17Ci0JY3M4OXgwX3Jlc2V0KG5pYyk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotRVRIX1BST0JFIC0gTG9vayBmb3IgYW4gYWRhcHRlcgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdHJ1Y3QgbmljICpjczg5eDBfcHJvYmUoc3RydWN0IG5pYyAqbmljLCB1bnNpZ25lZCBzaG9ydCAqcHJvYmVfYWRkcnMpCi17Ci0Jc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBuZXRjYXJkX3BvcnRsaXN0W10gPSB7Ci0jaWZkZWYJQ1NfU0NBTgotCQlDU19TQ0FOLAotI2Vsc2UJLyogdXNlICJjb25zZXJ2YXRpdmUiIGRlZmF1bHQgdmFsdWVzIGZvciBhdXRvcHJvYmluZyAqLwotCQkweDMwMCwweDMyMCwweDM0MCwweDIwMCwweDIyMCwweDI0MCwKLQkJMHgyNjAsMHgyODAsMHgyYTAsMHgyYzAsMHgyZTAsCi0JLyogaWYgdGhhdCBkaWQgbm90IHdvcmssIHRoZW4gYmUgbW9yZSBhZ2dyZXNzaXZlICovCi0JCTB4MzAxLDB4MzIxLDB4MzQxLDB4MjAxLDB4MjIxLDB4MjQxLAotCQkweDI2MSwweDI4MSwweDJhMSwweDJjMSwweDJlMSwKLSNlbmRpZgotCQkwfTsKLQotCWludCAgICAgIGksIHJlc3VsdCA9IC0xOwotCXVuc2lnbmVkIHJldl90eXBlID0gMCwgaW9hZGRyLCBpb2lkeCwgaXNhX2NuZiwgY3NfcmV2aXNpb247Ci0JdW5zaWduZWQgc2hvcnQgZWVwcm9tX2J1ZmZbQ0hLU1VNX0xFTl07Ci0KLQotCWZvciAoaW9pZHggPSAwOyAoaW9hZGRyPW5ldGNhcmRfcG9ydGxpc3RbaW9pZHgrK10pICE9IDA7ICkgewotCQkvKiBpZiB0aGV5IGdpdmUgdXMgYW4gb2RkIEkvTyBhZGRyZXNzLCB0aGVuIGRvIE9ORSB3cml0ZSB0bwotCQkgICB0aGUgYWRkcmVzcyBwb3J0LCB0byBnZXQgaXQgYmFjayB0byBhZGRyZXNzIHplcm8sIHdoZXJlIHdlCi0JCSAgIGV4cGVjdCB0byBmaW5kIHRoZSBFSVNBIHNpZ25hdHVyZSB3b3JkLiAqLwotCQlpZiAoaW9hZGRyICYgMSkgewotCQkJaW9hZGRyICY9IH4xOwotCQkJaWYgKChpbncoaW9hZGRyICsgQUREX1BPUlQpICYgQUREX01BU0spICE9IEFERF9TSUcpCi0JCQkJY29udGludWU7Ci0JCQlvdXR3KFBQX0NoaXBJRCwgaW9hZGRyICsgQUREX1BPUlQpOwotCQl9Ci0KLQkJaWYgKGludyhpb2FkZHIgKyBEQVRBX1BPUlQpICE9IENISVBfRUlTQV9JRF9TSUcpCi0JCQljb250aW51ZTsKLQkJZXRoX25pY19iYXNlID0gaW9hZGRyOwotCi0JCS8qIGdldCB0aGUgY2hpcCB0eXBlICovCi0JCXJldl90eXBlID0gcmVhZHJlZyhQUk9EVUNUX0lEX0FERCk7Ci0JCWV0aF9jc190eXBlID0gcmV2X3R5cGUgJn4gUkVWSVNPTl9CSVRTOwotCQljc19yZXZpc2lvbiA9ICgocmV2X3R5cGUgJiBSRVZJU09OX0JJVFMpID4+IDgpICsgJ0EnOwotCi0JCXByaW50ZigiXG5jczogY3M4OSVjMCVzIHJldiAlYywgYmFzZSAlI2hYIiwKLQkJICAgICAgIGV0aF9jc190eXBlPT1DUzg5MDA/JzAnOicyJywKLQkJICAgICAgIGV0aF9jc190eXBlPT1DUzg5MjBNPyJNIjoiIiwKLQkJICAgICAgIGNzX3JldmlzaW9uLAotCQkgICAgICAgZXRoX25pY19iYXNlKTsKLQotCQkvKiBGaXJzdCBjaGVjayB0byBzZWUgaWYgYW4gRUVQUk9NIGlzIGF0dGFjaGVkKi8KLQkJaWYgKChyZWFkcmVnKFBQX1NlbGZTVCkgJiBFRVBST01fUFJFU0VOVCkgPT0gMCkgewotCQkJcHJpbnRmKCJcbmNzOiBubyBFRVBST00uLi5cbiIpOwotCQkJb3V0dyhQUF9DaGlwSUQsIGV0aF9uaWNfYmFzZSArIEFERF9QT1JUKTsKLQkJCWNvbnRpbnVlOyB9Ci0JCWVsc2UgaWYgKGdldF9lZXByb21fZGF0YShTVEFSVF9FRVBST01fREFUQSxDSEtTVU1fTEVOLAotCQkJCQkgZWVwcm9tX2J1ZmYpIDwgMCkgewotCQkJcHJpbnRmKCJcbmNzOiBFRVBST00gcmVhZCBmYWlsZWQuLi5cbiIpOwotCQkJb3V0dyhQUF9DaGlwSUQsIGV0aF9uaWNfYmFzZSArIEFERF9QT1JUKTsKLQkJCWNvbnRpbnVlOyB9Ci0JCWVsc2UgaWYgKGdldF9lZXByb21fY2hrc3VtKFNUQVJUX0VFUFJPTV9EQVRBLENIS1NVTV9MRU4sCi0JCQkJCSAgIGVlcHJvbV9idWZmKSA8IDApIHsKLQkJCXByaW50ZigiXG5jczogRUVQUk9NIGNoZWNrc3VtIGJhZC4uLlxuIik7Ci0JCQlvdXR3KFBQX0NoaXBJRCwgZXRoX25pY19iYXNlICsgQUREX1BPUlQpOwotCQkJY29udGludWU7IH0KLQotCQkvKiBnZXQgdHJhbnNtaXNzaW9uIGNvbnRyb2wgd29yZCBidXQga2VlcCB0aGUKLQkJICAgYXV0b25lZ290aWF0aW9uIGJpdHMgKi8KLQkJZXRoX2F1dG9fbmVnX2NuZiA9IGVlcHJvbV9idWZmW0FVVE9fTkVHX0NORl9PRkZTRVQvMl07Ci0JCS8qIFN0b3JlIGFkYXB0ZXIgY29uZmlndXJhdGlvbiAqLwotCQlldGhfYWRhcHRlcl9jbmYgPSBlZXByb21fYnVmZltBREFQVEVSX0NORl9PRkZTRVQvMl07Ci0JCS8qIFN0b3JlIElTQSBjb25maWd1cmF0aW9uICovCi0JCWlzYV9jbmYgPSBlZXByb21fYnVmZltJU0FfQ05GX09GRlNFVC8yXTsKLQotCQkvKiBzdG9yZSB0aGUgaW5pdGlhbCBtZW1vcnkgYmFzZSBhZGRyZXNzICovCi0JCWV0aF9tZW1fc3RhcnQgPSBlZXByb21fYnVmZltQQUNLRVRfUEFHRV9PRkZTRVQvMl0gPDwgODsKLQotCQlwcmludGYoIiVzJXMlcywgYWRkciAiLAotCQkgICAgICAgKGV0aF9hZGFwdGVyX2NuZiAmIEFfQ05GXzEwQl9UKT8iLCBSSi00NSI6IiIsCi0JCSAgICAgICAoZXRoX2FkYXB0ZXJfY25mICYgQV9DTkZfQVVJKT8iLCBBVUkiOiIiLAotCQkgICAgICAgKGV0aF9hZGFwdGVyX2NuZiAmIEFfQ05GXzEwQl8yKT8iLCBCTkMiOiIiKTsKLQotCQkvKiBJZiB0aGlzIGlzIGEgQ1M4OTAwIHRoZW4gbm8gcG5wIHNvZnQgKi8KLQkJaWYgKGV0aF9jc190eXBlICE9IENTODkwMCAmJgotCQkgICAgLyogQ2hlY2sgaWYgdGhlIElTQSBJUlEgaGFzIGJlZW4gc2V0ICAqLwotCQkgICAgKGkgPSByZWFkcmVnKFBQX0NTODkyMF9JU0FJTlQpICYgMHhmZiwKLQkJICAgICAoaSAhPSAwICYmIGkgPCBDUzg5MjBfTk9fSU5UUykpKQotCQkJZXRoX2lycSA9IGk7Ci0JCWVsc2UgewotCQkJaSA9IGlzYV9jbmYgJiBJTlRfTk9fTUFTSzsKLQkJCWlmIChldGhfY3NfdHlwZSA9PSBDUzg5MDApIHsKLQkJCQkvKiB0aGUgdGFibGUgdGhhdCBmb2xsb3dzIGlzIGRlcGVuZGVudAotCQkJCSAgIHVwb24gaG93IHlvdSB3aXJlZCB1cCB5b3VyIGNzODkwMAotCQkJCSAgIGluIHlvdXIgc3lzdGVtLiAgVGhlIHRhYmxlIGlzIHRoZQotCQkJCSAgIHNhbWUgYXMgdGhlIGNzODkwMCBlbmdpbmVlcmluZyBkZW1vCi0JCQkJICAgYm9hcmQuICBpcnFfbWFwIGFsc28gZGVwZW5kcyBvbiB0aGUKLQkJCQkgICBjb250ZW50cyBvZiB0aGUgdGFibGUuICBBbHNvIHNlZQotCQkJCSAgIHdyaXRlX2lycSwgd2hpY2ggaXMgdGhlIHJldmVyc2UKLQkJCQkgICBtYXBwaW5nIG9mIHRoZSB0YWJsZSBiZWxvdy4gKi8KLQkJCQlpZiAoaSA8IDQpIGkgPSAiXDAxMlwwMTNcMDE0XDAwNSJbaV07Ci0JCQkJZWxzZSBwcmludGYoIlxuY3M6IEJVRzogaXNhX2NvbmZpZyBpcyAlZFxuIiwgaSk7IH0KLQkJCWV0aF9pcnEgPSBpOyB9Ci0KLQkJLyogUmV0cmlldmUgYW5kIHByaW50IHRoZSBldGhlcm5ldCBhZGRyZXNzLiAqLwotCQlmb3IgKGk9MDsgaTxFVEhfQUxFTjsgaSsrKSB7Ci0JCQluaWMtPm5vZGVfYWRkcltpXSA9ICgodW5zaWduZWQgY2hhciAqKWVlcHJvbV9idWZmKVtpXTsKLQkJfQotCQlwcmludGYoIiUhXG4iLCBuaWMtPm5vZGVfYWRkcik7Ci0KLQkJLyogU2V0IHRoZSBMaW5lQ1RMIHF1aW50dXBsZXQgYmFzZWQgb24gYWRhcHRlcgotCQkgICBjb25maWd1cmF0aW9uIHJlYWQgZnJvbSBFRVBST00gKi8KLQkJaWYgKChldGhfYWRhcHRlcl9jbmYgJiBBX0NORl9FWFRORF8xMEJfMikgJiYKLQkJICAgIChldGhfYWRhcHRlcl9jbmYgJiBBX0NORl9MT1dfUlhfU1FVRUxDSCkpCi0JCQlldGhfbGluZWN0bCA9IExPV19SWF9TUVVFTENIOwotCQllbHNlCi0JCQlldGhfbGluZWN0bCA9IDA7Ci0KLQkJLyogY2hlY2sgdG8gbWFrZSBzdXJlIHRoYXQgdGhleSBoYXZlIHRoZSAicmlnaHQiCi0JCSAgIGhhcmR3YXJlIGF2YWlsYWJsZSAqLwotCQlzd2l0Y2goZXRoX2FkYXB0ZXJfY25mICYgQV9DTkZfTUVESUFfVFlQRSkgewotCQljYXNlIEFfQ05GX01FRElBXzEwQl9UOiByZXN1bHQgPSBldGhfYWRhcHRlcl9jbmYgJiBBX0NORl8xMEJfVDsKLQkJCWJyZWFrOwotCQljYXNlIEFfQ05GX01FRElBX0FVSTogICByZXN1bHQgPSBldGhfYWRhcHRlcl9jbmYgJiBBX0NORl9BVUk7Ci0JCQlicmVhazsKLQkJY2FzZSBBX0NORl9NRURJQV8xMEJfMjogcmVzdWx0ID0gZXRoX2FkYXB0ZXJfY25mICYgQV9DTkZfMTBCXzI7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDogcmVzdWx0ID0gZXRoX2FkYXB0ZXJfY25mICYgKEFfQ05GXzEwQl9UIHwgQV9DTkZfQVVJIHwKLQkJCQkJCSAgICAgQV9DTkZfMTBCXzIpOwotCQl9Ci0JCWlmICghcmVzdWx0KSB7Ci0JCQlwcmludGYoImNzOiBFRVBST00gaXMgY29uZmlndXJlZCBmb3IgdW5hdmFpbGFibGUgbWVkaWFcbiIpOwotCQllcnJvcjoKLQkJCXdyaXRlcmVnKFBQX0xpbmVDVEwsIHJlYWRyZWcoUFBfTGluZUNUTCkgJgotCQkJCSB+KFNFUklBTF9UWF9PTiB8IFNFUklBTF9SWF9PTikpOwotCQkJb3V0dyhQUF9DaGlwSUQsIGV0aF9uaWNfYmFzZSArIEFERF9QT1JUKTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0KLQkJLyogSW5pdGlhbGl6ZSB0aGUgY2FyZCBmb3IgcHJvYmluZyBvZiB0aGUgYXR0YWNoZWQgbWVkaWEgKi8KLQkJY3M4OXgwX3Jlc2V0KG5pYyk7Ci0KLQkJLyogc2V0IHRoZSBoYXJkd2FyZSB0byB0aGUgY29uZmlndXJlZCBjaG9pY2UgKi8KLQkJc3dpdGNoKGV0aF9hZGFwdGVyX2NuZiAmIEFfQ05GX01FRElBX1RZUEUpIHsKLQkJY2FzZSBBX0NORl9NRURJQV8xMEJfVDoKLQkJCXJlc3VsdCA9IGRldGVjdF90cCgpOwotCQkJaWYgKCFyZXN1bHQpIHsKLQkJCQljbHJsaW5lKCk7Ci0JCQkJcHJpbnRmKCIxMEJhc2UtVCAoUkotNDUlcyIsCi0JCQkJICAgICAgICIpIGhhcyBubyBjYWJsZVxuIik7IH0KLQkJCS8qIGNoZWNrICJpZ25vcmUgbWlzc2luZyBtZWRpYSIgYml0ICovCi0JCQlpZiAoZXRoX2F1dG9fbmVnX2NuZiAmIElNTV9CSVQpCi0JCQkJLyogWWVzISBJIGRvbid0IGNhcmUgaWYgSSBzZWUgYSBsaW5rIHB1bHNlICovCi0JCQkJcmVzdWx0ID0gQV9DTkZfTUVESUFfMTBCX1Q7Ci0JCQlicmVhazsKLQkJY2FzZSBBX0NORl9NRURJQV9BVUk6Ci0JCQlyZXN1bHQgPSBkZXRlY3RfYXVpKG5pYyk7Ci0JCQlpZiAoIXJlc3VsdCkgewotCQkJCWNscmxpbmUoKTsKLQkJCQlwcmludGYoIjEwQmFzZS01IChBVUklcyIsCi0JCQkJICAgICAgICIpIGhhcyBubyBjYWJsZVxuIik7IH0KLQkJCS8qIGNoZWNrICJpZ25vcmUgbWlzc2luZyBtZWRpYSIgYml0ICovCi0JCQlpZiAoZXRoX2F1dG9fbmVnX2NuZiAmIElNTV9CSVQpCi0JCQkJLyogWWVzISBJIGRvbid0IGNhcmUgaWYgSSBzZWUgYSBjYXJycmllciAqLwotCQkJCXJlc3VsdCA9IEFfQ05GX01FRElBX0FVSTsKLQkJCWJyZWFrOwotCQljYXNlIEFfQ05GX01FRElBXzEwQl8yOgotCQkJcmVzdWx0ID0gZGV0ZWN0X2JuYyhuaWMpOwotCQkJaWYgKCFyZXN1bHQpIHsKLQkJCQljbHJsaW5lKCk7Ci0JCQkJcHJpbnRmKCIxMEJhc2UtMiAoQk5DJXMiLAotCQkJCSAgICAgICAiKSBoYXMgbm8gY2FibGVcbiIpOyB9Ci0JCQkvKiBjaGVjayAiaWdub3JlIG1pc3NpbmcgbWVkaWEiIGJpdCAqLwotCQkJaWYgKGV0aF9hdXRvX25lZ19jbmYgJiBJTU1fQklUKQotCQkJCS8qIFllcyEgSSBkb24ndCBjYXJlIGlmIEkgY2FuIHhtaXQgYSBwYWNrZXQgKi8KLQkJCQlyZXN1bHQgPSBBX0NORl9NRURJQV8xMEJfMjsKLQkJCWJyZWFrOwotCQljYXNlIEFfQ05GX01FRElBX0FVVE86Ci0JCQl3cml0ZXJlZyhQUF9MaW5lQ1RMLCBldGhfbGluZWN0bCB8IEFVVE9fQVVJXzEwQkFTRVQpOwotCQkJaWYgKGV0aF9hZGFwdGVyX2NuZiAmIEFfQ05GXzEwQl9UKQotCQkJCWlmICgocmVzdWx0ID0gZGV0ZWN0X3RwKCkpICE9IDApCi0JCQkJCWJyZWFrOwotCQkJaWYgKGV0aF9hZGFwdGVyX2NuZiAmIEFfQ05GX0FVSSkKLQkJCQlpZiAoKHJlc3VsdCA9IGRldGVjdF9hdWkobmljKSkgIT0gMCkKLQkJCQkJYnJlYWs7Ci0JCQlpZiAoZXRoX2FkYXB0ZXJfY25mICYgQV9DTkZfMTBCXzIpCi0JCQkJaWYgKChyZXN1bHQgPSBkZXRlY3RfYm5jKG5pYykpICE9IDApCi0JCQkJCWJyZWFrOwotCQkJY2xybGluZSgpOyBwcmludGYoIm5vIG1lZGlhIGRldGVjdGVkXG4iKTsKLQkJCWdvdG8gZXJyb3I7Ci0JCX0KLQkJY2xybGluZSgpOwotCQlzd2l0Y2gocmVzdWx0KSB7Ci0JCWNhc2UgMDogICAgICAgICAgICAgICAgIHByaW50Zigibm8gbmV0d29yayBjYWJsZSBhdHRhY2hlZCB0byBjb25maWd1cmVkIG1lZGlhXG4iKTsKLQkJCWdvdG8gZXJyb3I7Ci0JCWNhc2UgQV9DTkZfTUVESUFfMTBCX1Q6IHByaW50ZigidXNpbmcgMTBCYXNlLVQgKFJKLTQ1KVxuIik7Ci0JCQlicmVhazsKLQkJY2FzZSBBX0NORl9NRURJQV9BVUk6ICAgcHJpbnRmKCJ1c2luZyAxMEJhc2UtNSAoQVVJKVxuIik7Ci0JCQlicmVhazsKLQkJY2FzZSBBX0NORl9NRURJQV8xMEJfMjogcHJpbnRmKCJ1c2luZyAxMEJhc2UtMiAoQk5DKVxuIik7Ci0JCQlicmVhazsKLQkJfQotCi0JCS8qIFR1cm4gb24gYm90aCByZWNlaXZlIGFuZCB0cmFuc21pdCBvcGVyYXRpb25zICovCi0JCXdyaXRlcmVnKFBQX0xpbmVDVEwsIHJlYWRyZWcoUFBfTGluZUNUTCkgfCBTRVJJQUxfUlhfT04gfAotCQkJIFNFUklBTF9UWF9PTik7Ci0KLQkJYnJlYWs7Ci0JfQotCi0JaWYgKGlvYWRkciA9PSAwKQotCQlyZXR1cm4gKDApOwotCW5pYy0+cmVzZXQgPSBjczg5eDBfcmVzZXQ7Ci0JbmljLT5wb2xsID0gY3M4OXgwX3BvbGw7Ci0JbmljLT50cmFuc21pdCA9IGNzODl4MF90cmFuc21pdDsKLQluaWMtPmRpc2FibGUgPSBjczg5eDBfZGlzYWJsZTsKLQlyZXR1cm4gKG5pYyk7Ci19Ci0KLS8qCi0gKiBMb2NhbCB2YXJpYWJsZXM6Ci0gKiAgYy1iYXNpYy1vZmZzZXQ6IDgKLSAqIEVuZDoKLSAqLwotCmRpZmYgLU5hdXIgZ3J1Yi0wLjk3Lm9yaWcvbmV0Ym9vdC9jczg5eDAuaCBncnViLTAuOTcvbmV0Ym9vdC9jczg5eDAuaAotLS0gZ3J1Yi0wLjk3Lm9yaWcvbmV0Ym9vdC9jczg5eDAuaAkyMDAzLTA3LTA5IDExOjQ1OjM3LjAwMDAwMDAwMCArMDAwMAorKysgZ3J1Yi0wLjk3L25ldGJvb3QvY3M4OXgwLmgJMTk3MC0wMS0wMSAwMDowMDowMC4wMDAwMDAwMDAgKzAwMDAKQEAgLTEsNDYxICswLDAgQEAKLS8qICBDb3B5cmlnaHQsIDE5ODgtMTk5MiwgUnVzc2VsbCBOZWxzb24sIENyeW53ciBTb2Z0d2FyZQotCi0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHZlcnNpb24gMS4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4gICovCi0KLSNkZWZpbmUgUFBfQ2hpcElEIDB4MDAwMAkvKiBvZmZzZXQgICAwaCAtPiBDb3JwIC1JRCAgICAgICAgICAgICAgKi8KLQkJCQkvKiBvZmZzZXQgICAyaCAtPiBNb2RlbC9Qcm9kdWN0IE51bWJlciAgKi8KLQkJCQkvKiBvZmZzZXQgICAzaCAtPiBDaGlwIFJldmlzaW9uIE51bWJlciAgKi8KLQotI2RlZmluZSBQUF9JU0FJT0IgMHgwMDIwCS8qICBJTyBiYXNlIGFkZHJlc3MgKi8KLSNkZWZpbmUgUFBfQ1M4OTAwX0lTQUlOVCAweDAwMjIJLyogIElTQSBpbnRlcnJ1cHQgc2VsZWN0ICovCi0jZGVmaW5lIFBQX0NTODkyMF9JU0FJTlQgMHgwMzcwCS8qICBJU0EgaW50ZXJydXB0IHNlbGVjdCAqLwotI2RlZmluZSBQUF9DUzg5MDBfSVNBRE1BIDB4MDAyNAkvKiAgSVNBIFJlYyBETUEgY2hhbm5lbCAqLwotI2RlZmluZSBQUF9DUzg5MjBfSVNBRE1BIDB4MDM3NAkvKiAgSVNBIFJlYyBETUEgY2hhbm5lbCAqLwotI2RlZmluZSBQUF9JU0FTT0YgMHgwMDI2CS8qICBJU0EgRE1BIG9mZnNldCAqLwotI2RlZmluZSBQUF9EbWFGcmFtZUNudCAweDAwMjgJLyogIElTQSBETUEgRnJhbWUgY291bnQgKi8KLSNkZWZpbmUgUFBfRG1hQnl0ZUNudCAweDAwMkEJLyogIElTQSBETUEgQnl0ZSBjb3VudCAqLwotI2RlZmluZSBQUF9DUzg5MDBfSVNBTWVtQiAweDAwMkMJLyogIE1lbW9yeSBiYXNlICovCi0jZGVmaW5lIFBQX0NTODkyMF9JU0FNZW1CIDB4MDM0OCAvKiAgKi8KLQotI2RlZmluZSBQUF9JU0FCb290QmFzZSAweDAwMzAJLyogIEJvb3QgUHJvbSBiYXNlICAqLwotI2RlZmluZSBQUF9JU0FCb290TWFzayAweDAwMzQJLyogIEJvb3QgUHJvbSBNYXNrICovCi0KLS8qIEVFUFJPTSBkYXRhIGFuZCBjb21tYW5kIHJlZ2lzdGVycyAqLwotI2RlZmluZSBQUF9FRUNNRCAweDAwNDAJCS8qICBOVlIgSW50ZXJmYWNlIENvbW1hbmQgcmVnaXN0ZXIgKi8KLSNkZWZpbmUgUFBfRUVEYXRhIDB4MDA0MgkvKiAgTlZSIEludGVyZmFjZSBEYXRhIFJlZ2lzdGVyICovCi0jZGVmaW5lIFBQX0RlYnVnUmVnIDB4MDA0NAkvKiAgRGVidWcgUmVnaXN0ZXIgKi8KLQotI2RlZmluZSBQUF9SeENGRyAweDAxMDIJCS8qICBSeCBCdXMgY29uZmlnICovCi0jZGVmaW5lIFBQX1J4Q1RMIDB4MDEwNAkJLyogIFJlY2VpdmUgQ29udHJvbCBSZWdpc3RlciAqLwotI2RlZmluZSBQUF9UeENGRyAweDAxMDYJCS8qICBUcmFuc21pdCBDb25maWcgUmVnaXN0ZXIgKi8KLSNkZWZpbmUgUFBfVHhDTUQgMHgwMTA4CQkvKiAgVHJhbnNtaXQgQ29tbWFuZCBSZWdpc3RlciAqLwotI2RlZmluZSBQUF9CdWZDRkcgMHgwMTBBCS8qICBCdXMgY29uZmlndXJhdGlvbiBSZWdpc3RlciAqLwotI2RlZmluZSBQUF9MaW5lQ1RMIDB4MDExMgkvKiAgTGluZSBDb25maWcgUmVnaXN0ZXIgKi8KLSNkZWZpbmUgUFBfU2VsZkNUTCAweDAxMTQJLyogIFNlbGYgQ29tbWFuZCBSZWdpc3RlciAqLwotI2RlZmluZSBQUF9CdXNDVEwgMHgwMTE2CS8qICBJU0EgYnVzIGNvbnRyb2wgUmVnaXN0ZXIgKi8KLSNkZWZpbmUgUFBfVGVzdENUTCAweDAxMTgJLyogIFRlc3QgUmVnaXN0ZXIgKi8KLSNkZWZpbmUgUFBfQXV0b05lZ0NUTCAweDAxMUMJLyogIEF1dG8gTmVnb3RpYXRpb24gQ3RybCAqLwotCi0jZGVmaW5lIFBQX0lTUSAweDAxMjAJCS8qICBJbnRlcnJ1cHQgU3RhdHVzICovCi0jZGVmaW5lIFBQX1J4RXZlbnQgMHgwMTI0CS8qICBSeCBFdmVudCBSZWdpc3RlciAqLwotI2RlZmluZSBQUF9UeEV2ZW50IDB4MDEyOAkvKiAgVHggRXZlbnQgUmVnaXN0ZXIgKi8KLSNkZWZpbmUgUFBfQnVmRXZlbnQgMHgwMTJDCS8qICBCdXMgRXZlbnQgUmVnaXN0ZXIgKi8KLSNkZWZpbmUgUFBfUnhNaXNzIDB4MDEzMAkvKiAgUmVjZWl2ZSBNaXNzIENvdW50ICovCi0jZGVmaW5lIFBQX1R4Q29sIDB4MDEzMgkJLyogIFRyYW5zbWl0IENvbGxpc2lvbiBDb3VudCAqLwotI2RlZmluZSBQUF9MaW5lU1QgMHgwMTM0CS8qICBMaW5lIFN0YXRlIFJlZ2lzdGVyICovCi0jZGVmaW5lIFBQX1NlbGZTVCAweDAxMzYJLyogIFNlbGYgU3RhdGUgcmVnaXN0ZXIgKi8KLSNkZWZpbmUgUFBfQnVzU1QgMHgwMTM4CQkvKiAgQnVzIFN0YXR1cyAqLwotI2RlZmluZSBQUF9URFIgMHgwMTNDCQkvKiAgVGltZSBEb21haW4gUmVmbGVjdG9tZXRyeSAqLwotI2RlZmluZSBQUF9BdXRvTmVnU1QgMHgwMTNFCS8qICBBdXRvIE5lZyBTdGF0dXMgKi8KLSNkZWZpbmUgUFBfVHhDb21tYW5kIDB4MDE0NAkvKiAgVHggQ29tbWFuZCAqLwotI2RlZmluZSBQUF9UeExlbmd0aCAweDAxNDYJLyogIFR4IExlbmd0aCAqLwotI2RlZmluZSBQUF9MQUYgMHgwMTUwCQkvKiAgSGFzaCBUYWJsZSAqLwotI2RlZmluZSBQUF9JQSAweDAxNTgJCS8qICBQaHlzaWNhbCBBZGRyZXNzIFJlZ2lzdGVyICovCi0KLSNkZWZpbmUgUFBfUnhTdGF0dXMgMHgwNDAwCS8qICBSZWNlaXZlIHN0YXJ0IG9mIGZyYW1lICovCi0jZGVmaW5lIFBQX1J4TGVuZ3RoIDB4MDQwMgkvKiAgUmVjZWl2ZSBMZW5ndGggb2YgZnJhbWUgKi8KLSNkZWZpbmUgUFBfUnhGcmFtZSAweDA0MDQJLyogIFJlY2VpdmUgZnJhbWUgcG9pbnRlciAqLwotI2RlZmluZSBQUF9UeEZyYW1lIDB4MEEwMAkvKiAgVHJhbnNtaXQgZnJhbWUgcG9pbnRlciAqLwotCi0vKiAgUHJpbWFyeSBJL08gQmFzZSBBZGRyZXNzLiBJZiBubyBJL08gYmFzZSBpcyBzdXBwbGllZCBieSB0aGUgdXNlciwgdGhlbiB0aGlzICovCi0vKiAgY2FuIGJlIHVzZWQgYXMgdGhlIGRlZmF1bHQgSS9PIGJhc2UgdG8gYWNjZXNzIHRoZSBQYWNrZXRQYWdlIEFyZWEuICovCi0jZGVmaW5lIERFRkFVTFRJT0JBU0UgMHgwMzAwCi0jZGVmaW5lIEZJUlNUX0lPIDB4MDIwQwkJLyogIEZpcnN0IEkvTyBwb3J0IHRvIGNoZWNrICovCi0jZGVmaW5lIExBU1RfSU8gMHgwMzdDCQkvKiAgTGFzdCBJL08gcG9ydCB0byBjaGVjayAoKzEwaCkgKi8KLSNkZWZpbmUgQUREX01BU0sgMHgzMDAwCQkvKiAgTWFzayBpdCB1c2Ugb2YgdGhlIEFERF9QT1JUIHJlZ2lzdGVyICovCi0jZGVmaW5lIEFERF9TSUcgMHgzMDAwCQkvKiAgRXhwZWN0ZWQgSUQgc2lnbmF0dXJlICovCi0KLSNkZWZpbmUgQ0hJUF9FSVNBX0lEX1NJRyAweDYzMEUgICAvKiAgUHJvZHVjdCBJRCBDb2RlIGZvciBDcnlzdGFsIENoaXAgKENTODkwMCBzcGVjIDQuMykgKi8KLQotI2lmZGVmCUlCTUVJUEtUCi0jZGVmaW5lIEVJU0FfSURfU0lHIDB4NEQyNAkvKiAgSUJNICovCi0jZGVmaW5lIFBBUlRfTk9fU0lHIDB4MTAxMAkvKiAgSUJNICovCi0jZGVmaW5lIE1PTkdPT1NFX0JJVCAweDAwMDAJLyogIElCTSAqLwotI2Vsc2UKLSNkZWZpbmUgRUlTQV9JRF9TSUcgMHg2MzBFCS8qICBQblAgVmVuZG9yIElEIChzYW1lIGFzIGNoaXAgaWQgZm9yIENyeXN0YWwgYm9hcmQpICovCi0jZGVmaW5lIFBBUlRfTk9fU0lHIDB4NDAwMAkvKiAgSUQgY29kZSBDUzg5MjAgYm9hcmQgKFBuUCBWZW5kb3IgUHJvZHVjdCBjb2RlKSAqLwotI2RlZmluZSBNT05HT09TRV9CSVQgMHgyMDAwCS8qICBQQVJUX05PX1NJRyArIE1PTkdPT1NFX0JVVCA9PiBJRCBvZiBtb25nb29zZSAqLwotI2VuZGlmCi0KLSNkZWZpbmUgUFJPRFVDVF9JRF9BREQgMHgwMDAyICAgLyogIEFkZHJlc3Mgb2YgcHJvZHVjdCBJRCAqLwotCi0vKiAgTWFzayB0byBmaW5kIG91dCB0aGUgdHlwZXMgb2YgIHJlZ2lzdGVycyAqLwotI2RlZmluZSBSRUdfVFlQRV9NQVNLIDB4MDAxRgotCi0vKiAgRWVwcm9tIENvbW1hbmRzICovCi0jZGVmaW5lIEVSU0VfV1JfRU5CTCAweDAwRjAKLSNkZWZpbmUgRVJTRV9XUl9ESVNBQkxFIDB4MDAwMAotCi0vKiAgRGVmaW5lcyBDb250cm9sL0NvbmZpZyByZWdpc3RlciBxdWludHVwbGV0IG51bWJlcnMgKi8KLSNkZWZpbmUgUlhfQlVGX0NGRyAweDAwMDMKLSNkZWZpbmUgUlhfQ09OVFJPTCAweDAwMDUKLSNkZWZpbmUgVFhfQ0ZHIDB4MDAwNwotI2RlZmluZSBUWF9DT01NQU5EIDB4MDAwOQotI2RlZmluZSBCVUZfQ0ZHIDB4MDAwQgotI2RlZmluZSBMSU5FX0NPTlRST0wgMHgwMDEzCi0jZGVmaW5lIFNFTEZfQ09OVFJPTCAweDAwMTUKLSNkZWZpbmUgQlVTX0NPTlRST0wgMHgwMDE3Ci0jZGVmaW5lIFRFU1RfQ09OVFJPTCAweDAwMTkKLQotLyogIERlZmluZXMgU3RhdHVzL0NvdW50IHJlZ2lzdGVycyBxdWludHVwbGV0IG51bWJlcnMgKi8KLSNkZWZpbmUgUlhfRVZFTlQgMHgwMDA0Ci0jZGVmaW5lIFRYX0VWRU5UIDB4MDAwOAotI2RlZmluZSBCVUZfRVZFTlQgMHgwMDBDCi0jZGVmaW5lIFJYX01JU1NfQ09VTlQgMHgwMDEwCi0jZGVmaW5lIFRYX0NPTF9DT1VOVCAweDAwMTIKLSNkZWZpbmUgTElORV9TVEFUVVMgMHgwMDE0Ci0jZGVmaW5lIFNFTEZfU1RBVFVTIDB4MDAxNgotI2RlZmluZSBCVVNfU1RBVFVTIDB4MDAxOAotI2RlZmluZSBURFIgMHgwMDFDCi0KLS8qIFBQX1J4Q0ZHIC0gUmVjZWl2ZSAgQ29uZmlndXJhdGlvbiBhbmQgSW50ZXJydXB0IE1hc2sgYml0IGRlZmluaXRpb24gLSAgUmVhZC93cml0ZSAqLwotI2RlZmluZSBTS0lQXzEgMHgwMDQwCi0jZGVmaW5lIFJYX1NUUkVBTV9FTkJMIDB4MDA4MAotI2RlZmluZSBSWF9PS19FTkJMIDB4MDEwMAotI2RlZmluZSBSWF9ETUFfT05MWSAweDAyMDAKLSNkZWZpbmUgQVVUT19SWF9ETUEgMHgwNDAwCi0jZGVmaW5lIEJVRkZFUl9DUkMgMHgwODAwCi0jZGVmaW5lIFJYX0NSQ19FUlJPUl9FTkJMIDB4MTAwMAotI2RlZmluZSBSWF9SVU5UX0VOQkwgMHgyMDAwCi0jZGVmaW5lIFJYX0VYVFJBX0RBVEFfRU5CTCAweDQwMDAKLQotLyogUFBfUnhDVEwgLSBSZWNlaXZlIENvbnRyb2wgYml0IGRlZmluaXRpb24gLSBSZWFkL3dyaXRlICovCi0jZGVmaW5lIFJYX0lBX0hBU0hfQUNDRVBUIDB4MDA0MAotI2RlZmluZSBSWF9QUk9NX0FDQ0VQVCAweDAwODAKLSNkZWZpbmUgUlhfT0tfQUNDRVBUIDB4MDEwMAotI2RlZmluZSBSWF9NVUxUQ0FTVF9BQ0NFUFQgMHgwMjAwCi0jZGVmaW5lIFJYX0lBX0FDQ0VQVCAweDA0MDAKLSNkZWZpbmUgUlhfQlJPQURDQVNUX0FDQ0VQVCAweDA4MDAKLSNkZWZpbmUgUlhfQkFEX0NSQ19BQ0NFUFQgMHgxMDAwCi0jZGVmaW5lIFJYX1JVTlRfQUNDRVBUIDB4MjAwMAotI2RlZmluZSBSWF9FWFRSQV9EQVRBX0FDQ0VQVCAweDQwMDAKLSNkZWZpbmUgUlhfQUxMX0FDQ0VQVCAoUlhfUFJPTV9BQ0NFUFR8UlhfQkFEX0NSQ19BQ0NFUFR8UlhfUlVOVF9BQ0NFUFR8UlhfRVhUUkFfREFUQV9BQ0NFUFQpCi0vKiAgRGVmYXVsdCByZWNlaXZlIG1vZGUgLSBpbmRpdmlkdWFsbHkgYWRkcmVzc2VkLCBicm9hZGNhc3QsIGFuZCBlcnJvciBmcmVlICovCi0jZGVmaW5lIERFRl9SWF9BQ0NFUFQgKFJYX0lBX0FDQ0VQVCB8IFJYX0JST0FEQ0FTVF9BQ0NFUFQgfCBSWF9PS19BQ0NFUFQpCi0KLS8qIFBQX1R4Q0ZHIC0gVHJhbnNtaXQgQ29uZmlndXJhdGlvbiBJbnRlcnJ1cHQgTWFzayBiaXQgZGVmaW5pdGlvbiAtIFJlYWQvd3JpdGUgKi8KLSNkZWZpbmUgVFhfTE9TVF9DUlNfRU5CTCAweDAwNDAKLSNkZWZpbmUgVFhfU1FFX0VSUk9SX0VOQkwgMHgwMDgwCi0jZGVmaW5lIFRYX09LX0VOQkwgMHgwMTAwCi0jZGVmaW5lIFRYX0xBVEVfQ09MX0VOQkwgMHgwMjAwCi0jZGVmaW5lIFRYX0pCUl9FTkJMIDB4MDQwMAotI2RlZmluZSBUWF9BTllfQ09MX0VOQkwgMHgwODAwCi0jZGVmaW5lIFRYXzE2X0NPTF9FTkJMIDB4ODAwMAotCi0vKiBQUF9UeENNRCAtIFRyYW5zbWl0IENvbW1hbmQgYml0IGRlZmluaXRpb24gLSBSZWFkLW9ubHkgKi8KLSNkZWZpbmUgVFhfU1RBUlRfNF9CWVRFUyAweDAwMDAKLSNkZWZpbmUgVFhfU1RBUlRfNjRfQllURVMgMHgwMDQwCi0jZGVmaW5lIFRYX1NUQVJUXzEyOF9CWVRFUyAweDAwODAKLSNkZWZpbmUgVFhfU1RBUlRfQUxMX0JZVEVTIDB4MDBDMAotI2RlZmluZSBUWF9GT1JDRSAweDAxMDAKLSNkZWZpbmUgVFhfT05FX0NPTCAweDAyMDAKLSNkZWZpbmUgVFhfVFdPX1BBUlRfREVGRl9ESVNBQkxFIDB4MDQwMAotI2RlZmluZSBUWF9OT19DUkMgMHgxMDAwCi0jZGVmaW5lIFRYX1JVTlQgMHgyMDAwCi0KLS8qIFBQX0J1ZkNGRyAtIEJ1ZmZlciBDb25maWd1cmF0aW9uIEludGVycnVwdCBNYXNrIGJpdCBkZWZpbml0aW9uIC0gUmVhZC93cml0ZSAqLwotI2RlZmluZSBHRU5FUkFURV9TV19JTlRFUlJVUFQgMHgwMDQwCi0jZGVmaW5lIFJYX0RNQV9FTkJMIDB4MDA4MAotI2RlZmluZSBSRUFEWV9GT1JfVFhfRU5CTCAweDAxMDAKLSNkZWZpbmUgVFhfVU5ERVJSVU5fRU5CTCAweDAyMDAKLSNkZWZpbmUgUlhfTUlTU19FTkJMIDB4MDQwMAotI2RlZmluZSBSWF8xMjhfQllURV9FTkJMIDB4MDgwMAotI2RlZmluZSBUWF9DT0xfQ09VTlRfT1ZSRkxPV19FTkJMIDB4MTAwMAotI2RlZmluZSBSWF9NSVNTX0NPVU5UX09WUkZMT1dfRU5CTCAweDIwMDAKLSNkZWZpbmUgUlhfREVTVF9NQVRDSF9FTkJMIDB4ODAwMAotCi0vKiBQUF9MaW5lQ1RMIC0gTGluZSBDb250cm9sIGJpdCBkZWZpbml0aW9uIC0gUmVhZC93cml0ZSAqLwotI2RlZmluZSBTRVJJQUxfUlhfT04gMHgwMDQwCi0jZGVmaW5lIFNFUklBTF9UWF9PTiAweDAwODAKLSNkZWZpbmUgQVVJX09OTFkgMHgwMTAwCi0jZGVmaW5lIEFVVE9fQVVJXzEwQkFTRVQgMHgwMjAwCi0jZGVmaW5lIE1PRElGSUVEX0JBQ0tPRkYgMHgwODAwCi0jZGVmaW5lIE5PX0FVVE9fUE9MQVJJVFkgMHgxMDAwCi0jZGVmaW5lIFRXT19QQVJUX0RFRkRJUyAweDIwMDAKLSNkZWZpbmUgTE9XX1JYX1NRVUVMQ0ggMHg0MDAwCi0KLS8qIFBQX1NlbGZDVEwgLSBTb2Z0d2FyZSBTZWxmIENvbnRyb2wgYml0IGRlZmluaXRpb24gLSBSZWFkL3dyaXRlICovCi0jZGVmaW5lIFBPV0VSX09OX1JFU0VUIDB4MDA0MAotI2RlZmluZSBTV19TVE9QIDB4MDEwMAotI2RlZmluZSBTTEVFUF9PTiAweDAyMDAKLSNkZWZpbmUgQVVUT19XQUtFVVAgMHgwNDAwCi0jZGVmaW5lIEhDQjBfRU5CTCAweDEwMDAKLSNkZWZpbmUgSENCMV9FTkJMIDB4MjAwMAotI2RlZmluZSBIQ0IwIDB4NDAwMAotI2RlZmluZSBIQ0IxIDB4ODAwMAotCi0vKiBQUF9CdXNDVEwgLSBJU0EgQnVzIENvbnRyb2wgYml0IGRlZmluaXRpb24gLSBSZWFkL3dyaXRlICovCi0jZGVmaW5lIFJFU0VUX1JYX0RNQSAweDAwNDAKLSNkZWZpbmUgTUVNT1JZX09OIDB4MDQwMAotI2RlZmluZSBETUFfQlVSU1RfTU9ERSAweDA4MDAKLSNkZWZpbmUgSU9fQ0hBTk5FTF9SRUFEWV9PTiAweDEwMDAKLSNkZWZpbmUgUlhfRE1BX1NJWkVfNjRLIDB4MjAwMAotI2RlZmluZSBFTkFCTEVfSVJRIDB4ODAwMAotCi0vKiBQUF9UZXN0Q1RMIC0gVGVzdCBDb250cm9sIGJpdCBkZWZpbml0aW9uIC0gUmVhZC93cml0ZSAqLwotI2RlZmluZSBMSU5LX09GRiAweDAwODAKLSNkZWZpbmUgRU5ERUNfTE9PUEJBQ0sgMHgwMjAwCi0jZGVmaW5lIEFVSV9MT09QQkFDSyAweDA0MDAKLSNkZWZpbmUgQkFDS09GRl9PRkYgMHgwODAwCi0jZGVmaW5lIEZBU1RfVEVTVCAweDgwMDAKLQotLyogUFBfUnhFdmVudCAtIFJlY2VpdmUgRXZlbnQgQml0IGRlZmluaXRpb24gLSBSZWFkLW9ubHkgKi8KLSNkZWZpbmUgUlhfSUFfSEFTSEVEIDB4MDA0MAotI2RlZmluZSBSWF9EUklCQkxFIDB4MDA4MAotI2RlZmluZSBSWF9PSyAweDAxMDAKLSNkZWZpbmUgUlhfSEFTSEVEIDB4MDIwMAotI2RlZmluZSBSWF9JQSAweDA0MDAKLSNkZWZpbmUgUlhfQlJPQURDQVNUIDB4MDgwMAotI2RlZmluZSBSWF9DUkNfRVJST1IgMHgxMDAwCi0jZGVmaW5lIFJYX1JVTlQgMHgyMDAwCi0jZGVmaW5lIFJYX0VYVFJBX0RBVEEgMHg0MDAwCi0KLSNkZWZpbmUgSEFTSF9JTkRFWF9NQVNLIDB4MEZDMDAKLQotLyogUFBfVHhFdmVudCAtIFRyYW5zbWl0IEV2ZW50IEJpdCBkZWZpbml0aW9uIC0gUmVhZC1vbmx5ICovCi0jZGVmaW5lIFRYX0xPU1RfQ1JTIDB4MDA0MAotI2RlZmluZSBUWF9TUUVfRVJST1IgMHgwMDgwCi0jZGVmaW5lIFRYX09LIDB4MDEwMAotI2RlZmluZSBUWF9MQVRFX0NPTCAweDAyMDAKLSNkZWZpbmUgVFhfSkJSIDB4MDQwMAotI2RlZmluZSBUWF8xNl9DT0wgMHg4MDAwCi0jZGVmaW5lIFRYX1NFTkRfT0tfQklUUyAoVFhfT0t8VFhfTE9TVF9DUlMpCi0jZGVmaW5lIFRYX0NPTF9DT1VOVF9NQVNLIDB4NzgwMAotCi0vKiBQUF9CdWZFdmVudCAtIEJ1ZmZlciBFdmVudCBCaXQgZGVmaW5pdGlvbiAtIFJlYWQtb25seSAqLwotI2RlZmluZSBTV19JTlRFUlJVUFQgMHgwMDQwCi0jZGVmaW5lIFJYX0RNQSAweDAwODAKLSNkZWZpbmUgUkVBRFlfRk9SX1RYIDB4MDEwMAotI2RlZmluZSBUWF9VTkRFUlJVTiAweDAyMDAKLSNkZWZpbmUgUlhfTUlTUyAweDA0MDAKLSNkZWZpbmUgUlhfMTI4X0JZVEUgMHgwODAwCi0jZGVmaW5lIFRYX0NPTF9PVlJGTFcgMHgxMDAwCi0jZGVmaW5lIFJYX01JU1NfT1ZSRkxXIDB4MjAwMAotI2RlZmluZSBSWF9ERVNUX01BVENIIDB4ODAwMAotCi0vKiBQUF9MaW5lU1QgLSBFdGhlcm5ldCBMaW5lIFN0YXR1cyBiaXQgZGVmaW5pdGlvbiAtIFJlYWQtb25seSAqLwotI2RlZmluZSBMSU5LX09LIDB4MDA4MAotI2RlZmluZSBBVUlfT04gMHgwMTAwCi0jZGVmaW5lIFRFTkJBU0VUX09OIDB4MDIwMAotI2RlZmluZSBQT0xBUklUWV9PSyAweDEwMDAKLSNkZWZpbmUgQ1JTX09LIDB4NDAwMAotCi0vKiBQUF9TZWxmU1QgLSBDaGlwIFNvZnR3YXJlIFN0YXR1cyBiaXQgZGVmaW5pdGlvbiAqLwotI2RlZmluZSBBQ1RJVkVfMzNWIDB4MDA0MAotI2RlZmluZSBJTklUX0RPTkUgMHgwMDgwCi0jZGVmaW5lIFNJX0JVU1kgMHgwMTAwCi0jZGVmaW5lIEVFUFJPTV9QUkVTRU5UIDB4MDIwMAotI2RlZmluZSBFRVBST01fT0sgMHgwNDAwCi0jZGVmaW5lIEVMX1BSRVNFTlQgMHgwODAwCi0jZGVmaW5lIEVFX1NJWkVfNjQgMHgxMDAwCi0KLS8qIFBQX0J1c1NUIC0gSVNBIEJ1cyBTdGF0dXMgYml0IGRlZmluaXRpb24gKi8KLSNkZWZpbmUgVFhfQklEX0VSUk9SIDB4MDA4MAotI2RlZmluZSBSRUFEWV9GT1JfVFhfTk9XIDB4MDEwMAotCi0vKiBQUF9BdXRvTmVnQ1RMIC0gQXV0byBOZWdvdGlhdGlvbiBDb250cm9sIGJpdCBkZWZpbml0aW9uICovCi0jZGVmaW5lIFJFX05FR19OT1cgMHgwMDQwCi0jZGVmaW5lIEFMTE9XX0ZEWCAweDAwODAKLSNkZWZpbmUgQVVUT19ORUdfRU5BQkxFIDB4MDEwMAotI2RlZmluZSBOTFBfRU5BQkxFIDB4MDIwMAotI2RlZmluZSBGT1JDRV9GRFggMHg4MDAwCi0jZGVmaW5lIEFVVE9fTkVHX0JJVFMgKEZPUkNFX0ZEWHxOTFBfRU5BQkxFfEFVVE9fTkVHX0VOQUJMRSkKLSNkZWZpbmUgQVVUT19ORUdfTUFTSyAoRk9SQ0VfRkRYfE5MUF9FTkFCTEV8QVVUT19ORUdfRU5BQkxFfEFMTE9XX0ZEWHxSRV9ORUdfTk9XKQotCi0vKiBQUF9BdXRvTmVnU1QgLSBBdXRvIE5lZ290aWF0aW9uIFN0YXR1cyBiaXQgZGVmaW5pdGlvbiAqLwotI2RlZmluZSBBVVRPX05FR19CVVNZIDB4MDA4MAotI2RlZmluZSBGTFBfTElOSyAweDAxMDAKLSNkZWZpbmUgRkxQX0xJTktfR09PRCAweDA4MDAKLSNkZWZpbmUgTElOS19GQVVMVCAweDEwMDAKLSNkZWZpbmUgSERYX0FDVElWRSAweDQwMDAKLSNkZWZpbmUgRkRYX0FDVElWRSAweDgwMDAKLQotLyogIFRoZSBmb2xsb3dpbmcgYmxvY2sgZGVmaW5lcyB0aGUgSVNRIGV2ZW50IHR5cGVzICovCi0jZGVmaW5lIElTUV9SRUNFSVZFUl9FVkVOVCAweDA0Ci0jZGVmaW5lIElTUV9UUkFOU01JVFRFUl9FVkVOVCAweDA4Ci0jZGVmaW5lIElTUV9CVUZGRVJfRVZFTlQgMHgwYwotI2RlZmluZSBJU1FfUlhfTUlTU19FVkVOVCAweDEwCi0jZGVmaW5lIElTUV9UWF9DT0xfRVZFTlQgMHgxMgotCi0jZGVmaW5lIElTUV9FVkVOVF9NQVNLIDB4MDAzRiAgIC8qICBJU1EgbWFzayB0byBmaW5kIG91dCB0eXBlIG9mIGV2ZW50ICovCi0jZGVmaW5lIElTUV9ISVNUIDE2CQkvKiAgc21hbGwgaGlzdG9yeSBidWZmZXIgKi8KLSNkZWZpbmUgQVVUT0lOQ1JFTUVOVCAweDgwMDAJLyogIEJpdCBtYXNrIHRvIHNldCBiaXQtMTUgZm9yIGF1dG9pbmNyZW1lbnQgKi8KLQotI2RlZmluZSBUWFJYQlVGU0laRSAweDA2MDAKLSNkZWZpbmUgUlhETUFCVUZTSVpFIDB4ODAwMAotI2RlZmluZSBSWERNQVNJWkUgMHg0MDAwCi0jZGVmaW5lIFRYUlhfTEVOR1RIX01BU0sgMHgwN0ZGCi0KLS8qICByeCBvcHRpb25zIGJpdHMgKi8KLSNkZWZpbmUgUkNWX1dJVEhfUlhPTgkxICAgICAgIC8qICBTZXQgU2VyUnggT04gKi8KLSNkZWZpbmUgUkNWX0NPVU5UUwkyICAgICAgIC8qICBVc2UgRnJhbWVjbnQxICovCi0jZGVmaW5lIFJDVl9QT05HCTQgICAgICAgLyogIFBvbmcgcmVzcG9uZGVudCAqLwotI2RlZmluZSBSQ1ZfRE9ORwk4ICAgICAgIC8qICBEb25nIG9wZXJhdGlvbiAqLwotI2RlZmluZSBSQ1ZfUE9MTElORwkweDEwCS8qICBQb2xsIFJ4RXZlbnQgKi8KLSNkZWZpbmUgUkNWX0lTUQkJMHgyMAkvKiAgVXNlIElTUSwgaW50ICovCi0jZGVmaW5lIFJDVl9BVVRPX0RNQQkweDEwMAkvKiAgU2V0IEF1dG9SeERNQUUgKi8KLSNkZWZpbmUgUkNWX0RNQQkJMHgyMDAJLyogIFNldCBSeERNQSBvbmx5ICovCi0jZGVmaW5lIFJDVl9ETUFfQUxMCTB4NDAwCS8qICBDb3B5IGFsbCBETUEnZWQgKi8KLSNkZWZpbmUgUkNWX0ZJWEVEX0RBVEEJMHg4MDAJLyogIEV2ZXJ5IGZyYW1lIHNhbWUgKi8KLSNkZWZpbmUgUkNWX0lPCQkweDEwMDAJLyogIFVzZSBJU0EgSU8gb25seSAqLwotI2RlZmluZSBSQ1ZfTUVNT1JZCTB4MjAwMAkvKiAgVXNlIElTQSBNZW1vcnkgKi8KLQotI2RlZmluZSBSQU1fU0laRQkweDEwMDAgICAgICAgLyogIFRoZSBjYXJkIGhhcyA0ayBieXRlcyBvciBSQU0gKi8KLSNkZWZpbmUgUEtUX1NUQVJUIFBQX1R4RnJhbWUgIC8qICBTdGFydCBvZiBwYWNrZXQgUkFNICovCi0KLSNkZWZpbmUgUlhfRlJBTUVfUE9SVAkweDAwMDAKLSNkZWZpbmUgVFhfRlJBTUVfUE9SVCBSWF9GUkFNRV9QT1JUCi0jZGVmaW5lIFRYX0NNRF9QT1JUCTB4MDAwNAotI2RlZmluZSBUWF9OT1cJCTB4MDAwMCAgICAgICAvKiAgVHggcGFja2V0IGFmdGVyICAgNSBieXRlcyBjb3BpZWQgKi8KLSNkZWZpbmUgVFhfQUZURVJfMzgxCTB4MDAyMCAgICAgICAvKiAgVHggcGFja2V0IGFmdGVyIDM4MSBieXRlcyBjb3BpZWQgKi8KLSNkZWZpbmUgVFhfQUZURVJfQUxMCTB4MDA2MCAgICAgICAvKiAgVHggcGFja2V0IGFmdGVyIGFsbCBieXRlcyBjb3BpZWQgKi8KLSNkZWZpbmUgVFhfTEVOX1BPUlQJMHgwMDA2Ci0jZGVmaW5lIElTUV9QT1JUCTB4MDAwOAotI2RlZmluZSBBRERfUE9SVAkweDAwMEEKLSNkZWZpbmUgREFUQV9QT1JUCTB4MDAwQwotCi0jZGVmaW5lIEVFUFJPTV9XUklURV9FTgkJMHgwMEYwCi0jZGVmaW5lIEVFUFJPTV9XUklURV9ESVMJMHgwMDAwCi0jZGVmaW5lIEVFUFJPTV9XUklURV9DTUQJMHgwMTAwCi0jZGVmaW5lIEVFUFJPTV9SRUFEX0NNRAkJMHgwMjAwCi0KLS8qICBSZWNlaXZlIEhlYWRlciAqLwotLyogIERlc2NyaXB0aW9uIG9mIGhlYWRlciBvZiBlYWNoIHBhY2tldCBpbiByZWNlaXZlIGFyZWEgb2YgbWVtb3J5ICovCi0jZGVmaW5lIFJCVUZfRVZFTlRfTE9XCTAgICAvKiAgTG93IGJ5dGUgb2YgUnhFdmVudCAtIHN0YXR1cyBvZiByZWNlaXZlZCBmcmFtZSAqLwotI2RlZmluZSBSQlVGX0VWRU5UX0hJR0gJMSAgIC8qICBIaWdoIGJ5dGUgb2YgUnhFdmVudCAtIHN0YXR1cyBvZiByZWNlaXZlZCBmcmFtZSAqLwotI2RlZmluZSBSQlVGX0xFTl9MT1cJMiAgIC8qICBMZW5ndGggb2YgcmVjZWl2ZWQgZGF0YSAtIGxvdyBieXRlICovCi0jZGVmaW5lIFJCVUZfTEVOX0hJCTMgICAvKiAgTGVuZ3RoIG9mIHJlY2VpdmVkIGRhdGEgLSBoaWdoIGJ5dGUgKi8KLSNkZWZpbmUgUkJVRl9IRUFEX0xFTgk0ICAgLyogIExlbmd0aCBvZiB0aGlzIGhlYWRlciAqLwotCi0jZGVmaW5lIENISVBfUkVBRCAweDEgICAvKiAgVXNlZCB0byBtYXJrIHN0YXRlIG9mIHRoZSByZXBpbnMgY29kZSAoY2hpcCBvciBkbWEpICovCi0jZGVmaW5lIERNQV9SRUFEIDB4MiAgIC8qICBVc2VkIHRvIG1hcmsgc3RhdGUgb2YgdGhlIHJlcGlucyBjb2RlIChjaGlwIG9yIGRtYSkgKi8KLQotLyogIGZvciBiaW9zIHNjYW4gKi8KLS8qICAqLwotI2lmZGVmCUNTREVCVUcKLS8qICB1c2UgdGhlc2UgdmFsdWVzIGZvciBkZWJ1Z2dpbmcgYmlvcyBzY2FuICovCi0jZGVmaW5lIEJJT1NfU1RBUlRfU0VHIDB4MDAwMDAKLSNkZWZpbmUgQklPU19PRkZTRVRfSU5DIDB4MDAxMAotI2Vsc2UKLSNkZWZpbmUgQklPU19TVEFSVF9TRUcgMHgwYzAwMAotI2RlZmluZSBCSU9TX09GRlNFVF9JTkMgMHgwMjAwCi0jZW5kaWYKLQotI2RlZmluZSBCSU9TX0xBU1RfT0ZGU0VUIDB4MGZjMDAKLQotLyogIEJ5dGUgb2Zmc2V0cyBpbnRvIHRoZSBFRVBST00gY29uZmlndXJhdGlvbiBidWZmZXIgKi8KLSNkZWZpbmUgSVNBX0NORl9PRkZTRVQgMHg2Ci0jZGVmaW5lIFRYX0NUTF9PRkZTRVQgKElTQV9DTkZfT0ZGU0VUICsgOCkJCQkvKiAgODkwMCBlZXByb20gKi8KLSNkZWZpbmUgQVVUT19ORUdfQ05GX09GRlNFVCAoSVNBX0NORl9PRkZTRVQgKyA4KQkJLyogIDg5MjAgZWVwcm9tICovCi0KLSAgLyogIHRoZSBhc3N1bXB0aW9uIGhlcmUgaXMgdGhhdCB0aGUgYml0cyBpbiB0aGUgZWVwcm9tIGFyZSBnZW5lcmFsbHkgICovCi0gIC8qICBpbiB0aGUgc2FtZSBwb3NpdGlvbiBhcyB0aG9zZSBpbiB0aGUgYXV0b25lZ2N0bCByZWdpc3Rlci4gKi8KLSAgLyogIE9mIGNvdXJzZSB0aGUgSU1NIGJpdCBpcyBub3QgaW4gdGhhdCByZWdpc3RlciBzbyBpdCBtdXN0IGJlICAqLwotICAvKiAgbWFza2VkIG91dCAqLwotI2RlZmluZSBFRV9GT1JDRV9GRFggIDB4ODAwMAotI2RlZmluZSBFRV9OTFBfRU5BQkxFIDB4MDIwMAotI2RlZmluZSBFRV9BVVRPX05FR19FTkFCTEUgMHgwMTAwCi0jZGVmaW5lIEVFX0FMTE9XX0ZEWCAweDAwODAKLSNkZWZpbmUgRUVfQVVUT19ORUdfQ05GX01BU0sgKEVFX0ZPUkNFX0ZEWHxFRV9OTFBfRU5BQkxFfEVFX0FVVE9fTkVHX0VOQUJMRXxFRV9BTExPV19GRFgpCi0KLSNkZWZpbmUgSU1NX0JJVCAweDAwNDAJCS8qICBpZ25vcmUgbWlzc2luZyBtZWRpYSAqLwotCi0jZGVmaW5lIEFEQVBURVJfQ05GX09GRlNFVCAoQVVUT19ORUdfQ05GX09GRlNFVCArIDIpCi0jZGVmaW5lIEFfQ05GXzEwQl9UIDB4MDAwMQotI2RlZmluZSBBX0NORl9BVUkgMHgwMDAyCi0jZGVmaW5lIEFfQ05GXzEwQl8yIDB4MDAwNAotI2RlZmluZSBBX0NORl9NRURJQV9UWVBFIDB4MDA2MAotI2RlZmluZSBBX0NORl9NRURJQV9BVVRPIDB4MDAwMAotI2RlZmluZSBBX0NORl9NRURJQV8xMEJfVCAweDAwMjAKLSNkZWZpbmUgQV9DTkZfTUVESUFfQVVJIDB4MDA0MAotI2RlZmluZSBBX0NORl9NRURJQV8xMEJfMiAweDAwNjAKLSNkZWZpbmUgQV9DTkZfRENfRENfUE9MQVJJVFkgMHgwMDgwCi0jZGVmaW5lIEFfQ05GX05PX0FVVE9fUE9MQVJJVFkgMHgyMDAwCi0jZGVmaW5lIEFfQ05GX0xPV19SWF9TUVVFTENIIDB4NDAwMAotI2RlZmluZSBBX0NORl9FWFRORF8xMEJfMiAweDgwMDAKLQotI2RlZmluZSBQQUNLRVRfUEFHRV9PRkZTRVQgMHg4Ci0KLS8qICBCaXQgZGVmaW5pdGlvbnMgZm9yIHRoZSBJU0EgY29uZmlndXJhdGlvbiB3b3JkIGZyb20gdGhlIEVFUFJPTSAqLwotI2RlZmluZSBJTlRfTk9fTUFTSyAweDAwMEYKLSNkZWZpbmUgRE1BX05PX01BU0sgMHgwMDcwCi0jZGVmaW5lIElTQV9ETUFfU0laRSAweDAyMDAKLSNkZWZpbmUgSVNBX0FVVE9fUnhETUEgMHgwNDAwCi0jZGVmaW5lIElTQV9SeERNQSAweDA4MDAKLSNkZWZpbmUgRE1BX0JVUlNUIDB4MTAwMAotI2RlZmluZSBTVFJFQU1fVFJBTlNGRVIgMHgyMDAwCi0jZGVmaW5lIEFOWV9JU0FfRE1BIChJU0FfQVVUT19SeERNQSB8IElTQV9SeERNQSkKLQotLyogIERNQSBjb250cm9sbGVyIHJlZ2lzdGVycyAqLwotI2RlZmluZSBETUFfQkFTRSAweDAwICAgICAvKiAgRE1BIGNvbnRyb2xsZXIgYmFzZSAqLwotI2RlZmluZSBETUFfQkFTRV8yIDB4MEMwICAgIC8qICBETUEgY29udHJvbGxlciBiYXNlICovCi0KLSNkZWZpbmUgRE1BX1NUQVQgMHgwRDAgICAgLyogIERNQSBjb250cm9sbGVyIHN0YXR1cyByZWdpc3RlciAqLwotI2RlZmluZSBETUFfTUFTSyAweDBENCAgICAvKiAgRE1BIGNvbnRyb2xsZXIgbWFzayByZWdpc3RlciAqLwotI2RlZmluZSBETUFfTU9ERSAweDBENiAgICAvKiAgRE1BIGNvbnRyb2xsZXIgbW9kZSByZWdpc3RlciAqLwotI2RlZmluZSBETUFfUkVTRVRGRiAweDBEOCAgICAvKiAgRE1BIGNvbnRyb2xsZXIgZmlyc3QvbGFzdCBmbGlwIGZsb3AgKi8KLQotLyogIERNQSBkYXRhICovCi0jZGVmaW5lIERNQV9ESVNBQkxFIDB4MDQgICAgIC8qICBEaXNhYmxlIGNoYW5uZWwgbiAqLwotI2RlZmluZSBETUFfRU5BQkxFIDB4MDAgICAgIC8qICBFbmFibGUgY2hhbm5lbCBuICovCi0vKiAgRGVtYW5kIHRyYW5zZmVycywgaW5jci4gYWRkcmVzcywgYXV0byBpbml0LCB3cml0ZXMsIGNoLiBuICovCi0jZGVmaW5lIERNQV9SWF9NT0RFIDB4MTQKLS8qICBEZW1hbmQgdHJhbnNmZXJzLCBpbmNyLiBhZGRyZXNzLCBhdXRvIGluaXQsIHJlYWRzLCBjaC4gbiAqLwotI2RlZmluZSBETUFfVFhfTU9ERSAweDE4Ci0KLSNkZWZpbmUgRE1BX1NJWkUgKDE2KjEwMjQpIC8qICBTaXplIG9mIGRtYSBidWZmZXIgLSAxNmsgKi8KLQotI2RlZmluZSBDUzg5MDAgMHgwMDAwCi0jZGVmaW5lIENTODkyMCAweDQwMDAKLSNkZWZpbmUgQ1M4OTIwTSAweDYwMDAKLSNkZWZpbmUgUkVWSVNPTl9CSVRTIDB4MUYwMAotI2RlZmluZSBFRVZFUl9OVU1CRVIgMHgxMgotI2RlZmluZSBDSEtTVU1fTEVOIDB4MTQKLSNkZWZpbmUgQ0hLU1VNX1ZBTCAweDAwMDAKLSNkZWZpbmUgU1RBUlRfRUVQUk9NX0RBVEEgMHgwMDFjIC8qICBPZmZzZXQgaW50byBlZXByb20gZm9yIHN0YXJ0IG9mIGRhdGEgKi8KLSNkZWZpbmUgSVJRX01BUF9FRVBST01fREFUQSAweDAwNDYgLyogIE9mZnNldCBpbnRvIGVlcHJvbSBmb3IgdGhlIElSUSBtYXAgKi8KLSNkZWZpbmUgSVJRX01BUF9MRU4gMHgwMDA0IC8qICBObyBvZiBieXRlcyB0byByZWFkIGZvciB0aGUgSVJRIG1hcCAqLwotI2RlZmluZSBQTlBfSVJRX0ZSTVQgMHgwMDIyIC8qICBQTlAgc21hbGwgaXRlbSBJUlEgZm9ybWF0ICovCi0jZGVmaW5lIENTODkwMF9JUlFfTUFQIDB4MWMyMCAvKiAgVGhpcyBJUlEgbWFwIGlzIGZpeGVkICovCi0KLSNkZWZpbmUgQ1M4OTIwX05PX0lOVFMgMHgwRiAgIC8qICBNYXggQ1M4OTIwIGludGVycnVwdCBzZWxlY3QgIyAqLwotCi0jZGVmaW5lIFBOUF9BRERfUE9SVCAweDAyNzkKLSNkZWZpbmUgUE5QX1dSSVRFX1BPUlQgMHgwQTc5Ci0KLSNkZWZpbmUgR0VUX1BOUF9JU0FfU1RSVUNUIDB4NDAKLSNkZWZpbmUgUE5QX0lTQV9TVFJVQ1RfTEVOIDB4MDYKLSNkZWZpbmUgUE5QX0NTTl9DTlRfT0ZGIDB4MDEKLSNkZWZpbmUgUE5QX1JEX1BPUlRfT0ZGIDB4MDIKLSNkZWZpbmUgUE5QX0ZVTkNUSU9OX09LIDB4MDAKLSNkZWZpbmUgUE5QX1dBS0UgMHgwMwotI2RlZmluZSBQTlBfUlNSQ19EQVRBIDB4MDQKLSNkZWZpbmUgUE5QX1JTUkNfUkVBRFkgMHgwMQotI2RlZmluZSBQTlBfU1RBVFVTIDB4MDUKLSNkZWZpbmUgUE5QX0FDVElWQVRFIDB4MzAKLSNkZWZpbmUgUE5QX0NORl9JT19IIDB4NjAKLSNkZWZpbmUgUE5QX0NORl9JT19MIDB4NjEKLSNkZWZpbmUgUE5QX0NORl9JTlQgMHg3MAotI2RlZmluZSBQTlBfQ05GX0RNQSAweDc0Ci0jZGVmaW5lIFBOUF9DTkZfTUVNIDB4NDgKLQotI2RlZmluZSBCSVQwIDEKLSNkZWZpbmUgQklUMTUgMHg4MDAwCi0KLS8qCi0gKiBMb2NhbCB2YXJpYWJsZXM6Ci0gKiAgYy1iYXNpYy1vZmZzZXQ6IDgKLSAqIEVuZDoKLSAqLwotCmRpZmYgLU5hdXIgZ3J1Yi0wLjk3Lm9yaWcvbmV0Ym9vdC9jczg5eDAudHh0IGdydWItMC45Ny9uZXRib290L2NzODl4MC50eHQKLS0tIGdydWItMC45Ny5vcmlnL25ldGJvb3QvY3M4OXgwLnR4dAkyMDAzLTA3LTA5IDExOjQ1OjM3LjAwMDAwMDAwMCArMDAwMAorKysgZ3J1Yi0wLjk3L25ldGJvb3QvY3M4OXgwLnR4dAkxOTcwLTAxLTAxIDAwOjAwOjAwLjAwMDAwMDAwMCArMDAwMApAQCAtMSwyNiArMCwwIEBACi1QZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gZGlzdHJpYnV0ZSB0aGUgZW5jbG9zZWQgY3M4OXgwLltjaF0gZHJpdmVyCi1vbmx5IGluIGNvbmp1bmN0aW9uIHdpdGggdGhlIEV0aGVyYm9vdCBwYWNrYWdlLiAgVGhlIGNvZGUgaXMKLW9yZGluYXJpbHkgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEdQTC4KLQotUnVzcyBOZWxzb24sIEphbnVhcnkgMjAwMAotCi1DUkVESVRTCi0KLUkgd2FudCB0byB0aGFuawotCi0gIE1pa2UgQ3J1c2UgPG1jcnVzZUBjdGktbHRkLmNvbT4KLSAgICAgZm9yIHByb3ZpZGluZyBhbiBldmFsdWF0aW9uIE5JQyBhbmQgZm9yIHNwb25zb3JpbmcgdGhlCi0gICAgIGRldmVsb3BtZW50IG9mIHRoaXMgZHJpdmVyLgotCi0gIFJhbmRhbGwgU2VhcnMgPHNlYXJzQGNyeXN0YWwuY2lycnVzLmNvbT4KLSAgRGV2YSBCb2RhcyA8Ym9kYXNAY3J5c3RhbC5jaXJydXMuY29tPgotICBBbmRyZWFzIEtyYWVtZXIgPGFrcmFlbWVyQGNyeXN0YWwuY2lycnVzLmNvbT4KLSAgV29sZmdhbmcgS3JhdXNlIDwxMDAzMDMuMjY3M0Bjb21wdXNlcnZlLmNvbT4KLSAgICAgZm9yIGV4Y2VsbGVudCB0ZWNobmljYWwgc3VwcG9ydCBhbmQgZm9yIHByb3ZpZGluZyB0aGUgcmVxdWlyZWQKLSAgICAgcHJvZ3JhbW1pbmcgaW5mb3JtYXRpb24uIEkgYXBwcmVjaWF0ZSBDcnlzdGFsIFNlbWljb25kdWN0b3IncwotICAgICBjb21taXRtZW50IHRvd2FyZHMgZnJlZSBzb2Z0d2FyZS4KLQotICBSdXNzZWxsIE5lbHNvbiA8bmVsc29uQGNyeW53ci5jb20+Ci0gICAgIGZvciB3cml0aW5nIHRoZSBMaW51eCBkZXZpY2UgZHJpdmVyIGZvciB0aGUgQ1M4OXgwCi0gICAgIGNoaXBzZXQuIFJ1c3NlbCdzIGNvZGUgaXMgdmVyeSB3ZWxsIGRlc2lnbmVkIGFuZCBzaW1wbGlmaWVkIG15Ci0gICAgIGpvYiBhIGxvdC4KZGlmZiAtTmF1ciBncnViLTAuOTcub3JpZy9uZXRib290L2Rhdmljb20uYyBncnViLTAuOTcvbmV0Ym9vdC9kYXZpY29tLmMKLS0tIGdydWItMC45Ny5vcmlnL25ldGJvb3QvZGF2aWNvbS5jCTIwMDMtMDctMDkgMTE6NDU6MzcuMDAwMDAwMDAwICswMDAwCisrKyBncnViLTAuOTcvbmV0Ym9vdC9kYXZpY29tLmMJMjAwNS0wOC0zMSAxOTowMzozNS4wMDAwMDAwMDAgKzAwMDAKQEAgLTEsMTIgKzEsMTIgQEAKKyNpZmRlZiBBTExNVUxUSQorI2Vycm9yIG11bHRpY2FzdCBzdXBwb3J0IGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQKKyNlbmRpZgogLyogIAogICAgIERBVklDT00gRE05MDA5L0RNOTEwMi9ETTkxMDJBIEV0aGVyYm9vdCBEcml2ZXIJVjEuMDAKIAotICAgIFRoaXMgZHJpdmVyIHdhcyBwb3J0ZWQgZnJvbSBNYXJ0eSBDb25uZXIncyBUdWxpcCBFdGhlcmJvb3QgZHJpdmVyLiAKLSAgICBUaGFua3MgTWFydHkgQ29ubm9yIChtZGNAdGhpbmd1aW4ub3JnKSAKLSAgICBZb3UgY2FuIGdldCBUdWxpcCBkcml2ZXIgc291cmNlIGZpbGUgZnJvbSB0aGlzIFVSTDoKKyAgICBUaGlzIGRyaXZlciB3YXMgcG9ydGVkIGZyb20gTWFydHkgQ29ubm9yJ3MgVHVsaXAgRXRoZXJib290IGRyaXZlci4gCisgICAgVGhhbmtzIE1hcnR5IENvbm5vciAobWRjQGV0aGVyYm9vdC5vcmcpIAogCi0gICAgImh0dHA6Ly9ldGhlcmJvb3Quc291cmNlZm9yZ2UuLm5ldC8jRGlzdHJpYnV0aW9uIgotICAgIAogICAgIFRoaXMgZGF2aWNvbSBldGhlcmJvb3QgZHJpdmVyIHN1cHBvcnRzIERNOTAwOS9ETTkxMDIvRE05MTAyQS8KICAgICBETTkxMDJBK0RNOTgwMS9ETTkxMDJBK0RNOTgwMiBOSUNzLgogCkBAIC0zNiw3ICszNiw2IEBACiAJCQlyZWdpc3RlcihDUjYpCiAqLwogCi0MCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogRGVjbGFyYXRpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC00NCw3ICs0Myw2IEBACiAjaW5jbHVkZSAiZXRoZXJib290LmgiCiAjaW5jbHVkZSAibmljLmgiCiAjaW5jbHVkZSAicGNpLmgiCi0jaW5jbHVkZSAiY2FyZHMuaCIKIAogI3VuZGVmIERBVklDT01fREVCVUcKICN1bmRlZiBEQVZJQ09NX0RFQlVHX1dIRVJFCkBAIC05OSw4ICs5NywxMCBAQAogI2RlZmluZSBlZXByb21fZGVsYXkoKSAgaW5sKGVlX2FkZHIpCiAKIC8qIGhlbHBmdWwgbWFjcm8gaWYgb24gYSBiaWdfZW5kaWFuIG1hY2hpbmUgZm9yIGNoYW5naW5nIGJ5dGUgb3JkZXIuCi0gICBub3Qgc3RyaWN0bHkgbmVlZGVkIG9uIEludGVsICovCisgICBub3Qgc3RyaWN0bHkgbmVlZGVkIG9uIEludGVsCisgICBBbHJlYWR5IGRlZmluZWQgaW4gRXRoZXJib290IGluY2x1ZGVzCiAjZGVmaW5lIGxlMTZfdG9fY3B1KHZhbCkgKHZhbCkKKyovCiAKIC8qIHRyYW5zbWl0IGFuZCByZWNlaXZlIGRlc2NyaXB0b3IgZm9ybWF0ICovCiBzdHJ1Y3QgdHhkZXNjIHsKQEAgLTEzOCwyMCArMTM4LDEyIEBACiAvKiB0cmFuc21pdCBkZXNjcmlwdG9yIGFuZCBidWZmZXIgKi8KICNkZWZpbmUgTlRYRCAyCiBzdGF0aWMgc3RydWN0IHR4ZGVzYyB0eGRbTlRYRF0gX19hdHRyaWJ1dGVfXyAoKGFsaWduZWQoNCkpKTsKLSNpZmRlZglVU0VfTE9XTUVNX0JVRkZFUgotI2RlZmluZSB0eGIgKChjaGFyICopMHgxMDAwMCAtIEJVRkxFTikKLSNlbHNlCiBzdGF0aWMgdW5zaWduZWQgY2hhciB0eGJbQlVGTEVOXSBfX2F0dHJpYnV0ZV9fICgoYWxpZ25lZCg0KSkpOwotI2VuZGlmCiAKIC8qIHJlY2VpdmUgZGVzY3JpcHRvcihzKSBhbmQgYnVmZmVyKHMpICovCiAjZGVmaW5lIE5SWEQgNAogc3RhdGljIHN0cnVjdCByeGRlc2MgcnhkW05SWERdIF9fYXR0cmlidXRlX18gKChhbGlnbmVkKDQpKSk7Ci0jaWZkZWYJVVNFX0xPV01FTV9CVUZGRVIKLSNkZWZpbmUgcnhiICgoY2hhciAqKTB4MTAwMDAgLSBOUlhEICogQlVGTEVOIC0gQlVGTEVOKQotI2Vsc2UKIHN0YXRpYyB1bnNpZ25lZCBjaGFyIHJ4YltOUlhEICogQlVGTEVOXSBfX2F0dHJpYnV0ZV9fICgoYWxpZ25lZCg0KSkpOwotI2VuZGlmCiBzdGF0aWMgaW50IHJ4ZF90YWlsOwogc3RhdGljIGludCBUeFB0cjsKIApAQCAtMTYxLDE1ICsxNTMsMTMgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBzdGF0aWMgdm9pZCB3aGVyZWFtaShjb25zdCBjaGFyICpzdHIpOwogc3RhdGljIGludCByZWFkX2VlcHJvbSh1bnNpZ25lZCBsb25nIGlvYWRkciwgaW50IGxvY2F0aW9uLCBpbnQgYWRkcl9sZW4pOwotc3RydWN0IG5pYyAqZGF2aWNvbV9wcm9iZShzdHJ1Y3QgbmljICpuaWMsIHVuc2lnbmVkIHNob3J0ICppb19hZGRycywKLQkJCXN0cnVjdCBwY2lfZGV2aWNlICpwY2kpOworc3RhdGljIGludCBkYXZpY29tX3Byb2JlKHN0cnVjdCBkZXYgKmRldiwgc3RydWN0IHBjaV9kZXZpY2UgKnBjaSk7CiBzdGF0aWMgdm9pZCBkYXZpY29tX2luaXRfY2hhaW4oc3RydWN0IG5pYyAqbmljKTsJLyogU3RlbiAxMC85ICovCiBzdGF0aWMgdm9pZCBkYXZpY29tX3Jlc2V0KHN0cnVjdCBuaWMgKm5pYyk7CiBzdGF0aWMgdm9pZCBkYXZpY29tX3RyYW5zbWl0KHN0cnVjdCBuaWMgKm5pYywgY29uc3QgY2hhciAqZCwgdW5zaWduZWQgaW50IHQsCiAJCQkgICB1bnNpZ25lZCBpbnQgcywgY29uc3QgY2hhciAqcCk7Ci1zdGF0aWMgaW50IGRhdmljb21fcG9sbChzdHJ1Y3QgbmljICpuaWMpOwotc3RhdGljIHZvaWQgZGF2aWNvbV9kaXNhYmxlKHN0cnVjdCBuaWMgKm5pYyk7Ci1zdGF0aWMgdm9pZCB3aGVyZWFtaSAoY29uc3QgY2hhciAqc3RyKTsKK3N0YXRpYyBpbnQgZGF2aWNvbV9wb2xsKHN0cnVjdCBuaWMgKm5pYywgaW50IHJldHJpZXZlKTsKK3N0YXRpYyB2b2lkIGRhdmljb21fZGlzYWJsZShzdHJ1Y3QgZGV2ICpkZXYpOwogI2lmZGVmCURBVklDT01fREVCVUcKIHN0YXRpYyB2b2lkIGRhdmljb21fbW9yZSh2b2lkKTsKICNlbmRpZiAvKiBEQVZJQ09NX0RFQlVHICovCkBAIC0xODQsMTMgKzE3NCwxMCBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qIFV0aWxpdHkgUm91dGluZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdGF0aWMgaW5saW5lIHZvaWQgd2hlcmVhbWkgKGNvbnN0IGNoYXIgKnN0cikKK3N0YXRpYyBpbmxpbmUgdm9pZCB3aGVyZWFtaShjb25zdCBjaGFyICpzdHIpCiB7Ci0jaWZkZWYJREFWSUNPTV9ERUJVR19XSEVSRQogICBwcmludGYoIiVzXG4iLCBzdHIpOwogICAvKiBzbGVlcCgyKTsgKi8KLSNlbmRpZgogfQogCiAjaWZkZWYJREFWSUNPTV9ERUJVRwpAQCAtMzYwLDcgKzM0Nyw3IEBACiAvKgogICBTZW5zZSBtZWRpYSBtb2RlIGFuZCBzZXQgQ1I2CiAqLwotc3RhdGljIHZvaWQgZGF2aWNvbV9tZWRpYV9jaGsoc3RydWN0IG5pYyAqIG5pYykKK3N0YXRpYyB2b2lkIGRhdmljb21fbWVkaWFfY2hrKHN0cnVjdCBuaWMgKiBuaWMgX191bnVzZWQpCiB7CiAgIHVuc2lnbmVkIGxvbmcgdG8sIGNzcjY7CiAKQEAgLTQ0Niw4ICs0MzMsOCBAQAogICAvKiBTdGVuOiBTZXQgMiBUWCBkZXNjcmlwdG9yIGJ1dCB1c2Ugb25lIFRYIGJ1ZmZlciBiZWNhdXNlCiAJICAgaXQgdHJhbnNtaXQgYSBwYWNrZXQgYW5kIHdhaXQgY29tcGxldGUgZXZlcnkgdGltZS4gKi8KICAgZm9yIChpPTA7IGk8TlRYRDsgaSsrKSB7Ci0gICAgdHhkW2ldLmJ1ZjFhZGRyID0gJnR4YlswXTsJCS8qIFVzZWQgc2FtZSBUWCBidWZmZXIgKi8KLSAgICB0eGRbaV0uYnVmMmFkZHIgPSAodW5zaWduZWQgY2hhciAqKSZ0eGRbaSsxXTsgLyogIFBvaW50IHRvIE5leHQgVFggZGVzYyAqLworICAgIHR4ZFtpXS5idWYxYWRkciA9ICh2b2lkICopdmlydF90b19idXMoJnR4YlswXSk7CS8qIFVzZWQgc2FtZSBUWCBidWZmZXIgKi8KKyAgICB0eGRbaV0uYnVmMmFkZHIgPSAodm9pZCAqKXZpcnRfdG9fYnVzKCZ0eGRbaSsxXSk7CS8qICBQb2ludCB0byBOZXh0IFRYIGRlc2MgKi8KICAgICB0eGRbaV0uYnVmMXN6ICAgPSAwOwogICAgIHR4ZFtpXS5idWYyc3ogICA9IDA7CiAgICAgdHhkW2ldLmNvbnRyb2wgID0gMHgxODQ7ICAgICAgICAgICAvKiBCZWdpbi9FbmQvQ2hhaW4gKi8KQEAgLTQ2Niw4ICs0NTMsOCBAQAogCiAgIC8qIHNldHVwIHJlY2VpdmUgZGVzY3JpcHRvciAqLwogICBmb3IgKGk9MDsgaTxOUlhEOyBpKyspIHsKLSAgICByeGRbaV0uYnVmMWFkZHIgPSAmcnhiW2kgKiBCVUZMRU5dOwotICAgIHJ4ZFtpXS5idWYyYWRkciA9ICh1bnNpZ25lZCBjaGFyICopJnJ4ZFtpKzFdOyAvKiBQb2ludCB0byBOZXh0IFJYIGRlc2MgKi8KKyAgICByeGRbaV0uYnVmMWFkZHIgPSAodm9pZCAqKXZpcnRfdG9fYnVzKCZyeGJbaSAqIEJVRkxFTl0pOworICAgIHJ4ZFtpXS5idWYyYWRkciA9ICh2b2lkICopdmlydF90b19idXMoJnJ4ZFtpKzFdKTsgLyogUG9pbnQgdG8gTmV4dCBSWCBkZXNjICovCiAgICAgcnhkW2ldLmJ1ZjFzeiAgID0gQlVGTEVOOwogICAgIHJ4ZFtpXS5idWYyc3ogICA9IDA7ICAgICAgICAvKiBub3QgdXNlZCAqLwogICAgIHJ4ZFtpXS5jb250cm9sICA9IDB4NDsJCS8qIENoYWluIFN0cnVjdHVyZSAqLwpAQCAtNDc1LDggKzQ2Miw4IEBACiAgIH0KIAogICAvKiBDaGFpbiB0aGUgbGFzdCBkZXNjcmlwdG9yIHRvIGZpcnN0ICovCi0gIHR4ZFtOVFhEIC0gMV0uYnVmMmFkZHIgPSAodW5zaWduZWQgY2hhciAqKSZ0eGRbMF07Ci0gIHJ4ZFtOUlhEIC0gMV0uYnVmMmFkZHIgPSAodW5zaWduZWQgY2hhciAqKSZyeGRbMF07CisgIHR4ZFtOVFhEIC0gMV0uYnVmMmFkZHIgPSAodm9pZCAqKXZpcnRfdG9fYnVzKCZ0eGRbMF0pOworICByeGRbTlJYRCAtIDFdLmJ1ZjJhZGRyID0gKHZvaWQgKil2aXJ0X3RvX2J1cygmcnhkWzBdKTsKICAgVHhQdHIgPSAwOwogICByeGRfdGFpbCA9IDA7CiB9CkBAIC00ODgsNyArNDc1LDYgQEAKIHN0YXRpYyB2b2lkIGRhdmljb21fcmVzZXQoc3RydWN0IG5pYyAqbmljKQogewogICB1bnNpZ25lZCBsb25nIHRvOwotICB1MzIgYWRkcl9sb3csIGFkZHJfaGlnaDsKIAogICB3aGVyZWFtaSgiZGF2aWNvbV9yZXNldFxuIik7CiAKQEAgLTUwNyw4ICs0OTMsOCBAQAogICBkYXZpY29tX2luaXRfY2hhaW4obmljKTsJLyogU3RlbiAxMC85ICovCiAKICAgLyogUG9pbnQgdG8gcmVjZWl2ZSBkZXNjcmlwdG9yICovCi0gIG91dGwoKHVuc2lnbmVkIGxvbmcpJnJ4ZFswXSwgaW9hZGRyICsgQ1NSMyk7Ci0gIG91dGwoKHVuc2lnbmVkIGxvbmcpJnR4ZFswXSwgaW9hZGRyICsgQ1NSNCk7CS8qIFN0ZW4gMTAvOSAqLworICBvdXRsKHZpcnRfdG9fYnVzKCZyeGRbMF0pLCBpb2FkZHIgKyBDU1IzKTsKKyAgb3V0bCh2aXJ0X3RvX2J1cygmdHhkWzBdKSwgaW9hZGRyICsgQ1NSNCk7CS8qIFN0ZW4gMTAvOSAqLwogCiAgIC8qIEFjY29yZGluZyBwaHl4Y2VyIG1lZGlhIG1vZGUgdG8gc2V0IENSNiwKICAgICAgRE05MTAyL0EgcGh5eGNlciBjYW4gYXV0by1kZXRlY3QgbWVkaWEgbW9kZSAqLwpAQCAtNTkxLDEzICs1NzcsMTUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiBldGhfcG9sbCAtIFdhaXQgZm9yIGEgZnJhbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBpbnQgZGF2aWNvbV9wb2xsKHN0cnVjdCBuaWMgKm5pYykKK3N0YXRpYyBpbnQgZGF2aWNvbV9wb2xsKHN0cnVjdCBuaWMgKm5pYywgaW50IHJldHJpZXZlKQogewogICB3aGVyZWFtaSgiZGF2aWNvbV9wb2xsXG4iKTsKIAogICBpZiAocnhkW3J4ZF90YWlsXS5zdGF0dXMgJiAweDgwMDAwMDAwKQogICAgIHJldHVybiAwOwogCisgIGlmICggISByZXRyaWV2ZSApIHJldHVybiAxOworCiAgIHdoZXJlYW1pKCJkYXZpY29tX3BvbGwgZ290IG9uZVxuIik7CiAKICAgbmljLT5wYWNrZXRsZW4gPSAocnhkW3J4ZF90YWlsXS5zdGF0dXMgJiAweDNGRkYwMDAwKSA+PiAxNjsKQEAgLTYyNywxMCArNjE1LDEzIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogZXRoX2Rpc2FibGUgLSBEaXNhYmxlIHRoZSBpbnRlcmZhY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBkYXZpY29tX2Rpc2FibGUoc3RydWN0IG5pYyAqbmljKQorc3RhdGljIHZvaWQgZGF2aWNvbV9kaXNhYmxlKHN0cnVjdCBkZXYgKmRldikKIHsKKyAgc3RydWN0IG5pYyAqbmljID0gKHN0cnVjdCBuaWMgKilkZXY7CiAgIHdoZXJlYW1pKCJkYXZpY29tX2Rpc2FibGVcbiIpOwogCisgIGRhdmljb21fcmVzZXQobmljKTsKKwogICAvKiBkaXNhYmxlIGludGVycnVwdHMgKi8KICAgb3V0bCgweDAwMDAwMDAwLCBpb2FkZHIgKyBDU1I3KTsKIApAQCAtNjQwLDI0ICs2MzEsNDMgQEAKICAgLyogQ2xlYXIgdGhlIG1pc3NlZC1wYWNrZXQgY291bnRlci4gKi8KICAgKHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcpaW5sKGlvYWRkciArIENTUjgpOwogfQorCisMCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogZXRoX2lycSAtIGVuYWJsZSwgZGlzYWJsZSBhbmQgZm9yY2UgaW50ZXJydXB0cyAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCBkYXZpY29tX2lycShzdHJ1Y3QgbmljICpuaWMgX191bnVzZWQsIGlycV9hY3Rpb25fdCBhY3Rpb24gX191bnVzZWQpCit7CisgIHN3aXRjaCAoIGFjdGlvbiApIHsKKyAgY2FzZSBESVNBQkxFIDoKKyAgICBicmVhazsKKyAgY2FzZSBFTkFCTEUgOgorICAgIGJyZWFrOworICBjYXNlIEZPUkNFIDoKKyAgICBicmVhazsKKyAgfQorfQorCiAMCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogZXRoX3Byb2JlIC0gTG9vayBmb3IgYW4gYWRhcHRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdHJ1Y3QgbmljICpkYXZpY29tX3Byb2JlKHN0cnVjdCBuaWMgKm5pYywgdW5zaWduZWQgc2hvcnQgKmlvX2FkZHJzLAotICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgcGNpX2RldmljZSAqcGNpKQorc3RhdGljIGludCBkYXZpY29tX3Byb2JlKHN0cnVjdCBkZXYgKmRldiwgc3RydWN0IHBjaV9kZXZpY2UgKnBjaSkKIHsKKyAgc3RydWN0IG5pYyAqbmljID0gKHN0cnVjdCBuaWMgKilkZXY7CiAgIHVuc2lnbmVkIGludCBpOwotICB1MzIgbDEsIGwyOwogCiAgIHdoZXJlYW1pKCJkYXZpY29tX3Byb2JlXG4iKTsKIAotICBpZiAoaW9fYWRkcnMgPT0gMCB8fCAqaW9fYWRkcnMgPT0gMCkKKyAgaWYgKHBjaS0+aW9hZGRyID09IDApCiAgICAgcmV0dXJuIDA7CiAKICAgdmVuZG9yICA9IHBjaS0+dmVuZG9yOwogICBkZXZfaWQgID0gcGNpLT5kZXZfaWQ7Ci0gIGlvYWRkciAgPSAqaW9fYWRkcnM7CisgIGlvYWRkciAgPSBwY2ktPmlvYWRkciAmIH4zOworCisgIG5pYy0+aXJxbm8gID0gMDsKKyAgbmljLT5pb2FkZHIgPSBwY2ktPmlvYWRkciAmIH4zOwogCiAgIC8qIHdha2V1cCBjaGlwICovCiAgIHBjaWJpb3Nfd3JpdGVfY29uZmlnX2R3b3JkKHBjaS0+YnVzLCBwY2ktPmRldmZuLCAweDQwLCAweDAwMDAwMDAwKTsKQEAgLTY4MywxMCArNjkzLDI2IEBACiAgIC8qIGluaXRpYWxpemUgZGV2aWNlICovCiAgIGRhdmljb21fcmVzZXQobmljKTsKIAotICBuaWMtPnJlc2V0ICAgID0gZGF2aWNvbV9yZXNldDsKKyAgZGV2LT5kaXNhYmxlICA9IGRhdmljb21fZGlzYWJsZTsKICAgbmljLT5wb2xsICAgICA9IGRhdmljb21fcG9sbDsKICAgbmljLT50cmFuc21pdCA9IGRhdmljb21fdHJhbnNtaXQ7Ci0gIG5pYy0+ZGlzYWJsZSAgPSBkYXZpY29tX2Rpc2FibGU7CisgIG5pYy0+aXJxICAgICAgPSBkYXZpY29tX2lycTsKIAotICByZXR1cm4gbmljOworICByZXR1cm4gMTsKIH0KKworc3RhdGljIHN0cnVjdCBwY2lfaWQgZGF2aWNvbV9uaWNzW10gPSB7CitQQ0lfUk9NKDB4MTI4MiwgMHg5MTAwLCAiZGF2aWNvbTkxMDAiLCAiRGF2aWNvbSA5MTAwIiksCitQQ0lfUk9NKDB4MTI4MiwgMHg5MTAyLCAiZGF2aWNvbTkxMDIiLCAiRGF2aWNvbSA5MTAyIiksCitQQ0lfUk9NKDB4MTI4MiwgMHg5MDA5LCAiZGF2aWNvbTkwMDkiLCAiRGF2aWNvbSA5MDA5IiksCitQQ0lfUk9NKDB4MTI4MiwgMHg5MTMyLCAiZGF2aWNvbTkxMzIiLCAiRGF2aWNvbSA5MTMyIiksCS8qIE5lZWRzIHByb2JhYmx5IHNvbWUgZml4aW5nICovCit9OworCitzdHJ1Y3QgcGNpX2RyaXZlciBkYXZpY29tX2RyaXZlciA9IHsKKwkudHlwZSAgICAgPSBOSUNfRFJJVkVSLAorCS5uYW1lICAgICA9ICJEQVZJQ09NIiwKKwkucHJvYmUgICAgPSBkYXZpY29tX3Byb2JlLAorCS5pZHMgICAgICA9IGRhdmljb21fbmljcywKKwkuaWRfY291bnQgPSBzaXplb2YoZGF2aWNvbV9uaWNzKS9zaXplb2YoZGF2aWNvbV9uaWNzWzBdKSwKKwkuY2xhc3MgICAgPSAwLAorfTsKZGlmZiAtTmF1ciBncnViLTAuOTcub3JpZy9uZXRib290L2RlcGNhLmMgZ3J1Yi0wLjk3L25ldGJvb3QvZGVwY2EuYwotLS0gZ3J1Yi0wLjk3Lm9yaWcvbmV0Ym9vdC9kZXBjYS5jCTIwMDMtMDctMDkgMTE6NDU6MzcuMDAwMDAwMDAwICswMDAwCisrKyBncnViLTAuOTcvbmV0Ym9vdC9kZXBjYS5jCTE5NzAtMDEtMDEgMDA6MDA6MDAuMDAwMDAwMDAwICswMDAwCkBAIC0xLDc1MiArMCwwIEBACi0vKiBFdGhlcmJvb3Q6IGRlcGNhLmggbWVyZ2VkLCBjb21tZW50cyBmcm9tIExpbnV4IGRyaXZlciByZXRhaW5lZCAqLwotLyogIGRlcGNhLmM6IEEgRElHSVRBTCBERVBDQSAgJiBFdGhlcldPUktTIGV0aGVybmV0IGRyaXZlciBmb3IgbGludXguCi0KLSAgICBXcml0dGVuIDE5OTQsIDE5OTUgYnkgRGF2aWQgQy4gRGF2aWVzLgotCi0KLSAgICAgICAgICAgICAgICAgICAgICBDb3B5cmlnaHQgMTk5NCBEYXZpZCBDLiBEYXZpZXMKLQkJICAgICAgICAgICAgICAgICAgIGFuZCAKLQkJCSBVbml0ZWQgU3RhdGVzIEdvdmVybm1lbnQKLQkgKGFzIHJlcHJlc2VudGVkIGJ5IHRoZSBEaXJlY3RvciwgTmF0aW9uYWwgU2VjdXJpdHkgQWdlbmN5KS4gIAotCi0gICAgICAgICAgICAgICBDb3B5cmlnaHQgMTk5NSAgRGlnaXRhbCBFcXVpcG1lbnQgQ29ycG9yYXRpb24uCi0KLQotICAgIFRoaXMgc29mdHdhcmUgbWF5IGJlIHVzZWQgYW5kIGRpc3RyaWJ1dGVkIGFjY29yZGluZyB0byB0aGUgdGVybXMgb2YKLSAgICB0aGUgR05VIFB1YmxpYyBMaWNlbnNlLCBpbmNvcnBvcmF0ZWQgaGVyZWluIGJ5IHJlZmVyZW5jZS4KLQotICAgIFRoaXMgZHJpdmVyIGlzIHdyaXR0ZW4gZm9yIHRoZSBEaWdpdGFsIEVxdWlwbWVudCBDb3Jwb3JhdGlvbiBzZXJpZXMKLSAgICBvZiBERVBDQSBhbmQgRXRoZXJXT1JLUyBldGhlcm5ldCBjYXJkczoKLQotICAgICAgICBERVBDQSAgICAgICAodGhlIG9yaWdpbmFsKQotICAgIAlERTEwMAotICAgIAlERTEwMQotCURFMjAwIFR1cmJvCi0JREUyMDEgVHVyYm8KLQlERTIwMiBUdXJibyAoVFAgQk5DKQotCURFMjEwCi0JREU0MjIgICAgICAgKEVJU0EpCi0KLSAgICBUaGUgIGRyaXZlciBoYXMgYmVlbiB0ZXN0ZWQgb24gREUxMDAsIERFMjAwIGFuZCBERTIwMiBjYXJkcyAgaW4gIGEKLSAgICByZWxhdGl2ZWx5IGJ1c3kgbmV0d29yay4gVGhlIERFNDIyIGhhcyBiZWVuIHRlc3RlZCBhIGxpdHRsZS4KLQotICAgIFRoaXMgIGRyaXZlciB3aWxsIE5PVCB3b3JrICAgZm9yIHRoZSBERTIwMywgIERFMjA0ICBhbmQgREUyMDUgc2VyaWVzICBvZgotICAgIGNhcmRzLCAgc2luY2UgdGhleSBoYXZlICBhICBuZXcgY3VzdG9tIEFTSUMgaW4gICBwbGFjZSBvZiB0aGUgQU1EICBMQU5DRQotICAgIGNoaXAuICBTZWUgdGhlICdld3JrMy5jJyAgIGRyaXZlciBpbiB0aGUgIExpbnV4ICBzb3VyY2UgdHJlZSBmb3IgcnVubmluZwotICAgIHRob3NlIGNhcmRzLgotCi0gICAgSSBoYXZlIGJlbmNobWFya2VkIHRoZSBkcml2ZXIgd2l0aCBhICBERTEwMCBhdCA1OTVrQi9zIHRvICg1NDJrQi9zIGZyb20pCi0gICAgYSBERUNzdGF0aW9uIDUwMDAvMjAwLgotCi0gICAgVGhlIGF1dGhvciBtYXkgYmUgcmVhY2hlZCBhdCBkYXZpZXNAbWFuaWFjLnVsdHJhbmV0LmNvbQotCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0gICAgVGhlICBkcml2ZXIgd2FzIG9yaWdpbmFsbHkgYmFzZWQgIG9uICAgdGhlICdsYW5jZS5jJyBkcml2ZXIgZnJvbSAgRG9uYWxkCi0gICAgQmVja2VyICAgd2hpY2ggIGlzIGluY2x1ZGVkIHdpdGggIHRoZSAgc3RhbmRhcmQgIGRyaXZlciBkaXN0cmlidXRpb24gZm9yCi0gICAgbGludXguICBWMC40ICBpcyAgYSBjb21wbGV0ZSAgcmUtd3JpdGUgIHdpdGggb25seSAgdGhlIGtlcm5lbCAgaW50ZXJmYWNlCi0gICAgcmVtYWluaW5nIGZyb20gdGhlIG9yaWdpbmFsIGNvZGUuCi0KLSAgICAxKSBMYW5jZS5jIGNvZGUgaW4gL2xpbnV4L2RyaXZlcnMvbmV0LwotICAgIDIpICJFdGhlcm5ldC9JRUVFIDgwMi4zIEZhbWlseS4gMTk5MiBXb3JsZCBOZXR3b3JrIERhdGEgQm9vay9IYW5kYm9vayIsCi0gICAgICAgQU1ELCAxOTkyIFsoODAwKSAyMjItOTMyM10uCi0gICAgMykgIkFtNzlDOTAgQ01PUyBMb2NhbCBBcmVhIE5ldHdvcmsgQ29udHJvbGxlciBmb3IgRXRoZXJuZXQgKEMtTEFOQ0UpIiwKLSAgICAgICBBTUQsIFB1Yi4gIzE3ODgxLCBNYXkgMTk5My4KLSAgICA0KSAiQW03OUM5NjAgUENuZXQtSVNBKHRtKSwgU2luZ2xlLUNoaXAgRXRoZXJuZXQgQ29udHJvbGxlciBmb3IgSVNBIiwKLSAgICAgICBBTUQsIFB1Yi4gIzE2OTA3LCBNYXkgMTk5MgotICAgIDUpICJERUMgRXRoZXJXT1JLUyBMQyBFdGhlcm5ldCBDb250cm9sbGVyIE93bmVycyBNYW51YWwiLAotICAgICAgIERpZ2l0YWwgRXF1aXBtZW50IGNvcnBvcmF0aW9uLCAxOTkwLCBQdWIuICNFSy1ERTEwMC1PTS4wMDMKLSAgICA2KSAiREVDIEV0aGVyV09SS1MgVHVyYm8gRXRoZXJuZXQgQ29udHJvbGxlciBPd25lcnMgTWFudWFsIiwKLSAgICAgICBEaWdpdGFsIEVxdWlwbWVudCBjb3Jwb3JhdGlvbiwgMTk5MCwgUHViLiAjRUstREUyMDAtT00uMDAzCi0gICAgNykgIkRFUENBIEhhcmR3YXJlIFJlZmVyZW5jZSBNYW51YWwiLCBQdWIuICNFSy1ERVBDQS1QUgotICAgICAgIERpZ2l0YWwgRXF1aXBtZW50IENvcnBvcmF0aW9uLCAxOTg5Ci0gICAgOCkgIkRFQyBFdGhlcldPUktTIFR1cmJvXyhUUCBCTkMpIEV0aGVybmV0IENvbnRyb2xsZXIgT3duZXJzIE1hbnVhbCIsCi0gICAgICAgRGlnaXRhbCBFcXVpcG1lbnQgY29ycG9yYXRpb24sIDE5OTEsIFB1Yi4gI0VLLURFMjAyLU9NLjAwMQotICAgIAotCi0gICAgUGV0ZXIgQmF1ZXIncyBkZXBjYS5jIChWMC41KSB3YXMgcmVmZXJyZWQgdG8gd2hlbiBkZWJ1Z2dpbmcgVjAuMSBvZiB0aGlzCi0gICAgZHJpdmVyLgotCi0gICAgVGhlIG9yaWdpbmFsIERFUENBICBjYXJkIHJlcXVpcmVzIHRoYXQgdGhlICBldGhlcm5ldCBST00gYWRkcmVzcyBjb3VudGVyCi0gICAgYmUgZW5hYmxlZCB0byBjb3VudCBhbmQgaGFzIGFuIDggYml0IE5JQ1NSLiAgVGhlIFJPTSBjb3VudGVyIGVuYWJsaW5nIGlzCi0gICAgb25seSAgZG9uZSB3aGVuIGEgIDB4MDggaXMgcmVhZCBhcyB0aGUgIGZpcnN0IGFkZHJlc3Mgb2N0ZXQgKHRvIG1pbmltaXNlCi0gICAgdGhlIGNoYW5jZXMgIG9mIHdyaXRpbmcgb3ZlciBzb21lICBvdGhlciBoYXJkd2FyZSdzICBJL08gcmVnaXN0ZXIpLiAgVGhlCi0gICAgTklDU1IgYWNjZXNzZXMgICBoYXZlIGJlZW4gY2hhbmdlZCAgdG8gIGJ5dGUgYWNjZXNzZXMgIGZvciBhbGwgdGhlIGNhcmRzCi0gICAgc3VwcG9ydGVkIGJ5IHRoaXMgZHJpdmVyLCBzaW5jZSB0aGVyZSBpcyBvbmx5IG9uZSAgdXNlZnVsIGJpdCBpbiB0aGUgTVNCCi0gICAgKHJlbW90ZSBib290IHRpbWVvdXQpIGFuZCBpdCAgaXMgbm90IHVzZWQuICBBbHNvLCB0aGVyZSAgaXMgYSBtYXhpbXVtIG9mCi0gICAgb25seSA0OGtCIG5ldHdvcmsgIFJBTSBmb3IgdGhpcyAgY2FyZC4gIE15IHRoYW5rcyAgdG8gVG9yYmpvcm4gTGluZGggZm9yCi0gICAgaGVscCBkZWJ1Z2dpbmcgYWxsIHRoaXMgKGFuZCBob2xkaW5nIG15IGZlZXQgdG8gIHRoZSBmaXJlIHVudGlsIEkgZ290IGl0Ci0gICAgcmlnaHQpLgotCi0gICAgVGhlIERFMjAwICBzZXJpZXMgIGJvYXJkcyBoYXZlICBvbi1ib2FyZCA2NGtCICBSQU0gZm9yICB1c2UgIGFzIGEgc2hhcmVkCi0gICAgbWVtb3J5IG5ldHdvcmsgIGJ1ZmZlci4gT25seSB0aGUgREUxMDAgIGNhcmRzIG1ha2UgdXNlICBvZiBhICAya0IgYnVmZmVyCi0gICAgbW9kZSB3aGljaCBoYXMgbm90ICBiZWVuIGltcGxlbWVudGVkIGluICB0aGlzIGRyaXZlciAob25seSB0aGUgMzJrQiAgYW5kCi0gICAgNjRrQiBtb2RlcyBhcmUgc3VwcG9ydGVkIFsxNmtCLzQ4a0IgZm9yIHRoZSBvcmlnaW5hbCBERVBDQV0pLgotCi0gICAgQXQgdGhlIG1vc3Qgb25seSAyIERFUENBIGNhcmRzIGNhbiAgYmUgc3VwcG9ydGVkIG9uICB0aGUgSVNBIGJ1cyBiZWNhdXNlCi0gICAgdGhlcmUgaXMgb25seSBwcm92aXNpb24gIGZvciB0d28gSS9PIGJhc2UgYWRkcmVzc2VzICBvbiBlYWNoIGNhcmQgKDB4MzAwCi0gICAgYW5kIDB4MjAwKS4gVGhlIEkvTyBhZGRyZXNzIGlzIGRldGVjdGVkIGJ5IHNlYXJjaGluZyBmb3IgYSBieXRlIHNlcXVlbmNlCi0gICAgaW4gdGhlIEV0aGVybmV0IHN0YXRpb24gYWRkcmVzcyBQUk9NIGF0IHRoZSBleHBlY3RlZCBJL08gYWRkcmVzcyBmb3IgdGhlCi0gICAgRXRoZXJuZXQgIFBST00uICAgVGhlIHNoYXJlZCBtZW1vcnkgIGJhc2UgICBhZGRyZXNzICBpcyAnYXV0b3Byb2JlZCcgIGJ5Ci0gICAgbG9va2luZyAgZm9yIHRoZSBzZWxmICB0ZXN0IFBST00gIGFuZCBkZXRlY3RpbmcgdGhlICBjYXJkIG5hbWUuICAgV2hlbiBhCi0gICAgc2Vjb25kICBERVBDQSBpcyAgZGV0ZWN0ZWQsICBpbmZvcm1hdGlvbiAgaXMgICBwbGFjZWQgaW4gdGhlICAgYmFzZV9hZGRyCi0gICAgdmFyaWFibGUgb2YgdGhlICBuZXh0IGRldmljZSBzdHJ1Y3R1cmUgKHdoaWNoICBpcyBjcmVhdGVkIGlmIG5lY2Vzc2FyeSksCi0gICAgdGh1cyAgZW5hYmxpbmcgZXRoaWZfcHJvYmUgIGluaXRpYWxpemF0aW9uICBmb3IgdGhlIGRldmljZS4gIE1vcmUgdGhhbiAyCi0gICAgRUlTQSBjYXJkcyBjYW4gIGJlICBzdXBwb3J0ZWQsIGJ1dCAgY2FyZSB3aWxsICBiZSAgbmVlZGVkIGFzc2lnbmluZyAgdGhlCi0gICAgc2hhcmVkIG1lbW9yeSB0byBlbnN1cmUgdGhhdCBlYWNoIHNsb3QgaGFzIHRoZSAgY29ycmVjdCBJUlEsIEkvTyBhZGRyZXNzCi0gICAgYW5kIHNoYXJlZCBtZW1vcnkgYWRkcmVzcyBhc3NpZ25lZC4KLQotICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0gICAgTk9URTogSWYgeW91IGFyZSB1c2luZyB0d28gIElTQSBERVBDQXMsIGl0IGlzICBpbXBvcnRhbnQgdGhhdCB5b3UgYXNzaWduCi0gICAgdGhlIGJhc2UgbWVtb3J5IGFkZHJlc3NlcyBjb3JyZWN0bHkuICAgVGhlICBkcml2ZXIgYXV0b3Byb2JlcyBJL08gIDB4MzAwCi0gICAgdGhlbiAweDIwMC4gIFRoZSAgYmFzZSBtZW1vcnkgYWRkcmVzcyBmb3IgIHRoZSBmaXJzdCBkZXZpY2UgbXVzdCBiZSBsZXNzCi0gICAgdGhhbiB0aGF0IG9mIHRoZSBzZWNvbmQgc28gdGhhdCB0aGUgYXV0byBwcm9iZSB3aWxsIGNvcnJlY3RseSBhc3NpZ24gdGhlCi0gICAgSS9PIGFuZCBtZW1vcnkgYWRkcmVzc2VzIG9uIHRoZSBzYW1lIGNhcmQuICBJIGNhbid0IHRoaW5rIG9mIGEgd2F5IHRvIGRvCi0gICAgdGhpcyB1bmFtYmlndW91c2x5IGF0IHRoZSBtb21lbnQsIHNpbmNlIHRoZXJlIGlzIG5vdGhpbmcgb24gdGhlIGNhcmRzIHRvCi0gICAgdGllIEkvTyBhbmQgbWVtb3J5IGluZm9ybWF0aW9uIHRvZ2V0aGVyLgotCi0gICAgSSBhbSB1bmFibGUgIHRvICB0ZXN0ICAyIGNhcmRzICAgdG9nZXRoZXIgZm9yIG5vdywgICAgc28gdGhpcyAgY29kZSAgIGlzCi0gICAgdW5jaGVja2VkLiBBbGwgcmVwb3J0cywgZ29vZCBvciBiYWQsIGFyZSB3ZWxjb21lLgotCi0gICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLSAgICBUaGUgYm9hcmQgSVJRICAgc2V0dGluZyBtdXN0IGJlICBhdCBhbiAgdW51c2VkIElSUSB3aGljaCAgaXMgYXV0by1wcm9iZWQKLSAgICB1c2luZyBEb25hbGQgQmVja2VyJ3MgYXV0b3Byb2JlIHJvdXRpbmVzLiBERVBDQSBhbmQgREUxMDAgYm9hcmQgSVJRcyBhcmUKLSAgICB7MiwzLDQsNSw3fSwgd2hlcmVhcyB0aGUgIERFMjAwIGlzIGF0IHs1LDksMTAsMTEsMTV9LiAgTm90ZSB0aGF0IElSUTIgaXMKLSAgICByZWFsbHkgSVJROSBpbiBtYWNoaW5lcyB3aXRoIDE2IElSUSBsaW5lcy4KLQotICAgIE5vIDE2TUIgbWVtb3J5ICBsaW1pdGF0aW9uIHNob3VsZCBleGlzdCB3aXRoIHRoaXMgIGRyaXZlciBhcyBETUEgaXMgIG5vdAotICAgIHVzZWQgYW5kIHRoZSBjb21tb24gbWVtb3J5IGFyZWEgaXMgaW4gbG93IG1lbW9yeSBvbiB0aGUgbmV0d29yayBjYXJkIChteQotICAgIGN1cnJlbnQgc3lzdGVtIGhhcyAyME1CIGFuZCBJJ3ZlIG5vdCBoYWQgcHJvYmxlbXMgeWV0KS4KLQotICAgIFRoZSBhYmlsaXR5IHRvIGxvYWQgdGhpcyBkcml2ZXIgYXMgYSBsb2FkYWJsZSBtb2R1bGUgaGFzIGJlZW4gYWRkZWQuIFRvCi0gICAgdXRpbGlzZSB0aGlzIGFiaWxpdHksIHlvdSBoYXZlIHRvIGRvIDw4IHRoaW5nczoKLQotICAgIDApIGhhdmUgYSBjb3B5IG9mIHRoZSBsb2FkYWJsZSBtb2R1bGVzIGNvZGUgaW5zdGFsbGVkIG9uIHlvdXIgc3lzdGVtLgotICAgIDEpIGNvcHkgZGVwY2EuYyBmcm9tIHRoZSAgL2xpbnV4L2RyaXZlcnMvbmV0IGRpcmVjdG9yeSB0byB5b3VyIGZhdm91cml0ZQotICAgIHRlbXBvcmFyeSBkaXJlY3RvcnkuCi0gICAgMikgaWYgeW91IHdpc2gsIGVkaXQgdGhlICBzb3VyY2UgY29kZSBuZWFyICBsaW5lIDE1MzAgdG8gcmVmbGVjdCB0aGUgSS9PCi0gICAgYWRkcmVzcyBhbmQgSVJRIHlvdSdyZSB1c2luZyAoc2VlIGFsc28gNSkuCi0gICAgMykgY29tcGlsZSAgZGVwY2EuYywgYnV0IGluY2x1ZGUgLURNT0RVTEUgaW4gIHRoZSBjb21tYW5kIGxpbmUgdG8gZW5zdXJlCi0gICAgdGhhdCB0aGUgY29ycmVjdCBiaXRzIGFyZSBjb21waWxlZCAoc2VlIGVuZCBvZiBzb3VyY2UgY29kZSkuCi0gICAgNCkgaWYgeW91IGFyZSB3YW50aW5nIHRvIGFkZCBhIG5ldyAgY2FyZCwgZ290byA1LiBPdGhlcndpc2UsIHJlY29tcGlsZSBhCi0gICAga2VybmVsIHdpdGggdGhlIGRlcGNhIGNvbmZpZ3VyYXRpb24gdHVybmVkIG9mZiBhbmQgcmVib290LgotICAgIDUpIGluc21vZCBkZXBjYS5vIFtpcnE9N10gW2lvPTB4MjAwXSBbbWVtPTB4ZDAwMDBdIFthZGFwdGVyX25hbWU9REUxMDBdCi0gICAgICAgW0FsYW4gQ294OiBDaGFuZ2VkIHRoZSBjb2RlIHRvIGFsbG93IGNvbW1hbmQgbGluZSBpcnEvaW8gYXNzaWdubWVudHNdCi0gICAgICAgW0RhdmUgRGF2aWVzOiBDaGFuZ2VkIHRoZSBjb2RlIHRvIGFsbG93IGNvbW1hbmQgbGluZSBtZW0vbmFtZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzc2lnbm1lbnRzXQotICAgIDYpIHJ1biB0aGUgbmV0IHN0YXJ0dXAgYml0cyBmb3IgeW91ciBldGg/PyBpbnRlcmZhY2UgbWFudWFsbHkgCi0gICAgKHVzdWFsbHkgL2V0Yy9yYy5pbmV0WzEyXSBhdCBib290IHRpbWUpLiAKLSAgICA3KSBlbmpveSEKLQotICAgIE5vdGUgdGhhdCBhdXRvcHJvYmluZyBpcyBub3QgYWxsb3dlZCBpbiBsb2FkYWJsZSBtb2R1bGVzIC0gdGhlIHN5c3RlbSBpcwotICAgIGFscmVhZHkgdXAgYW5kIHJ1bm5pbmcgYW5kIHlvdSdyZSBtZXNzaW5nIHdpdGggaW50ZXJydXB0cy4KLQotICAgIFRvIHVubG9hZCBhIG1vZHVsZSwgdHVybiBvZmYgdGhlIGFzc29jaWF0ZWQgaW50ZXJmYWNlIAotICAgICdpZmNvbmZpZyBldGg/PyBkb3duJyB0aGVuICdybW1vZCBkZXBjYScuCi0KLSAgICBUbyBhc3NpZ24gYSBiYXNlIG1lbW9yeSBhZGRyZXNzIGZvciB0aGUgc2hhcmVkIG1lbW9yeSAgd2hlbiBydW5uaW5nIGFzIGEKLSAgICBsb2FkYWJsZSBtb2R1bGUsIHNlZSA1IGFib3ZlLiAgVG8gaW5jbHVkZSB0aGUgYWRhcHRlciAgbmFtZSAoaWYgeW91IGhhdmUKLSAgICBubyBQUk9NICBidXQga25vdyB0aGUgY2FyZCBuYW1lKSAgYWxzbyBzZWUgNSAgYWJvdmUuIE5vdGUgdGhhdCB0aGlzIGxhc3QKLSAgICBvcHRpb24gIHdpbGwgbm90IHdvcmsgIHdpdGgga2VybmVsICBidWlsdC1pbiAgZGVwY2Ency4gCi0KLSAgICBUaGUgc2hhcmVkIG1lbW9yeSBhc3NpZ25tZW50IGZvciBhIGxvYWRhYmxlIG1vZHVsZSAgbWFrZXMgc2Vuc2UgdG8gYXZvaWQKLSAgICB0aGUgJ21lbW9yeSBhdXRvcHJvYmUnIHBpY2tpbmcgdGhlIHdyb25nIHNoYXJlZCBtZW1vcnkgIChmb3IgdGhlIGNhc2Ugb2YKLSAgICAyIGRlcGNhJ3MgaW4gYSBQQykuCi0KLSAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICBTdXBwb3J0IGZvciBNQ0EgRXRoZXJXT1JLUyBjYXJkcyBhZGRlZCAxMS0zLTk4LgotICAgIFZlcmlmaWVkIHRvIHdvcmsgd2l0aCB1cCB0byAyIERFMjEyIGNhcmRzIGluIGEgc3lzdGVtIChhbHRob3VnaCBub3QKLSAgICAgIGZ1bGx5IHN0cmVzcy10ZXN0ZWQpLiAgCi0KLSAgICBDdXJyZW50bHkga25vd24gYnVncy9saW1pdGF0aW9uczoKLQotICAgIE5vdGU6ICB3aXRoIHRoZSBNQ0Egc3R1ZmYgYXMgYSBtb2R1bGUsIGl0IHRydXN0cyB0aGUgTUNBIGNvbmZpZ3VyYXRpb24sCi0gICAgICAgICAgIG5vdCB0aGUgY29tbWFuZCBsaW5lIGZvciBJUlEgYW5kIG1lbW9yeSBhZGRyZXNzLiAgWW91IGNhbgotICAgICAgICAgICBzcGVjaWZ5IHRoZW0gaWYgeW91IHdhbnQsIGJ1dCBpdCB3aWxsIHRocm93IHlvdXIgdmFsdWVzIG91dC4KLSAgICAgICAgICAgWW91IHN0aWxsIGhhdmUgdG8gcGFzcyB0aGUgSU8gYWRkcmVzcyBpdCB3YXMgY29uZmlndXJlZCBhcwotICAgICAgICAgICB0aG91Z2guCi0KLSAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICBUTyBETzoKLSAgICAtLS0tLS0KLQotCi0gICAgUmV2aXNpb24gSGlzdG9yeQotICAgIC0tLS0tLS0tLS0tLS0tLS0KLQotICAgIFZlcnNpb24gICBEYXRlICAgICAgICBEZXNjcmlwdGlvbgotICAKLSAgICAgIDAuMSAgICAgMjUtamFuLTk0ICAgSW5pdGlhbCB3cml0aW5nLgotICAgICAgMC4yICAgICAyNy1qYW4tOTQgICBBZGRlZCBMQU5DRSBUWCBoYXJkd2FyZSBidWZmZXIgY2hhaW5pbmcuCi0gICAgICAwLjMgICAgICAxLWZlYi05NCAgIEFkZGVkIG11bHRpcGxlIERFUENBIHN1cHBvcnQuCi0gICAgICAwLjMxICAgICA0LWZlYi05NCAgIEFkZGVkIERFMjAyIHJlY29nbml0aW9uLgotICAgICAgMC4zMiAgICAxOS1mZWItOTQgICBUaWR5IHVwLiBJbXByb3ZlIG11bHRpLURFUENBIHN1cHBvcnQuCi0gICAgICAwLjMzICAgIDI1LWZlYi05NCAgIEZpeCBERVBDQSBldGhlcm5ldCBST00gY291bnRlciBlbmFibGUuCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEFkZCBqYWJiZXIgcGFja2V0IGZpeCBmcm9tIG11cmZAcGVyZnRlY2guY29tCi0JCQkgIGFuZCBiZWNrZXJAc3VwZXIub3JnCi0gICAgICAwLjM0ICAgICA3LW1hci05NCAgIEZpeCBERVBDQSBtYXggbmV0d29yayBtZW1vcnkgUkFNICYgTklDU1IgYWNjZXNzLgotICAgICAgMC4zNSAgICAgOC1tYXItOTQgICBBZGRlZCBERTIwMSByZWNvZ25pdGlvbi4gVGlkaWVkIHVwLgotICAgICAgMC4zNTEgICAzMC1hcHItOTQgICBBZGRlZCBFSVNBIHN1cHBvcnQuIEFkZGVkIERFNDIyIHJlY29nbml0aW9uLgotICAgICAgMC4zNiAgICAxNi1tYXktOTQgICBERTQyMiBmaXggcmVsZWFzZWQuCi0gICAgICAwLjM3ICAgIDIyLWp1bC05NCAgIEFkZGVkIE1PRFVMRSBzdXBwb3J0Ci0gICAgICAwLjM4ICAgIDE1LWF1Zy05NCAgIEFkZGVkIERCUiBST00gc3dpdGNoIGluIGRlcGNhX2Nsb3NlKCkuIAotICAgICAgICAgICAgICAgICAgICAgICAgICBNdWx0aSBERVBDQSBidWcgZml4LgotICAgICAgMC4zOGF4cCAxNS1zZXAtOTQgICBTcGVjaWFsIHZlcnNpb24gZm9yIEFscGhhIEFYUCBMaW51eCBWMS4wLgotICAgICAgMC4zODEgICAxMi1kZWMtOTQgICBBZGRlZCBERTEwMSByZWNvZ25pdGlvbiwgZml4IG11bHRpY2FzdCBidWcuCi0gICAgICAwLjM4MiAgICA5LWZlYi05NSAgIEZpeCByZWNvZ25pdGlvbiBidWcgcmVwb3J0ZWQgYnkgPGJrbUBzdGFyLnJsLmFjLnVrPi4KLSAgICAgIDAuMzgzICAgMjItZmViLTk1ICAgRml4IGZvciBjb25mbGljdCB3aXRoIFZFU0EgU0NTSSByZXBvcnRlZCBieQotICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Ryb21haW5AYWxmLmRlYy5jb20+Ci0gICAgICAwLjM4NCAgIDE3LW1hci05NSAgIEZpeCBhIHJpbmcgZnVsbCBidWcgcmVwb3J0ZWQgYnkgPGJrbUBzdGFyLnJsLmFjLnVrPgotICAgICAgMC4zODUgICAgMy1hcHItOTUgICBGaXggYSByZWNvZ25pdGlvbiBidWcgcmVwb3J0ZWQgYnkgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cnlhbi5uaWVtaUBsYXN0ZnJvbnRpZXIuY29tPgotICAgICAgMC4zODYgICAyMS1hcHItOTUgICBGaXggdGhlIGxhc3QgZml4Li4uc29ycnksIG11c3QgYmUgZ2FsbG9waW5nIHNlbmlsaXR5Ci0gICAgICAwLjQwICAgIDI1LU1heS05NSAgIFJld3JpdGUgZm9yIHBvcnRhYmlsaXR5ICYgdXBkYXRlZC4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEEgc3VwcG9ydCBmcm9tIDxqZXN0YWJyb0BhbXQudGF5MS5kZWMuY29tPgotICAgICAgMC40MSAgICAyNi1KdW4tOTUgICBBZGRlZCB2ZXJpZnlfYXJlYSgpIGNhbGxzIGluIGRlcGNhX2lvY3RsKCkgZnJvbQotICAgICAgICAgICAgICAgICAgICAgICAgICBzdWdnZXN0aW9uIGJ5IDxoZWlrb0Bjb2xvc3N1cy5lc2NhcGUuZGU+Ci0gICAgICAwLjQyICAgIDI3LURlYy05NSAgIEFkZCAnbWVtJyBzaGFyZWQgbWVtb3J5IGFzc2lnbm1lbnQgZm9yIGxvYWRhYmxlIAotICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVzLgotICAgICAgICAgICAgICAgICAgICAgICAgICBBZGQgJ2FkYXB0ZXJfbmFtZScgZm9yIGxvYWRhYmxlIG1vZHVsZXMgd2hlbiBubyBQUk9NLgotCQkJICBCb3RoIGFib3ZlIGZyb20gYSBzdWdnZXN0aW9uIGJ5IAotCQkJICA8cGNoZW5Ad29vZHJ1ZmZzMTIxLnJlc2lkZW5jZS5nYXRlY2guZWR1Pi4KLQkJCSAgQWRkIG5ldyBtdWx0aWNhc3RpbmcgY29kZS4KLSAgICAgIDAuNDIxICAgMjItQXByLTk2CSAgRml4IGFsbG9jX2RldmljZSgpIGJ1ZyA8amFyaUBtYXJra3VzMi5maW1yLmZpPgotICAgICAgMC40MjIgICAyOS1BcHItOTYJICBGaXggZGVwY2FfaHdfaW5pdCgpIGJ1ZyA8amFyaUBtYXJra3VzMi5maW1yLmZpPgotICAgICAgMC40MjMgICAgNy1KdW4tOTYgICBGaXggbW9kdWxlIGxvYWQgYnVnIDxrbWdAYmFyY28uYmU+Ci0gICAgICAwLjQzICAgIDE2LUF1Zy05NiAgIFVwZGF0ZSBhbGxvY19kZXZpY2UoKSB0byBjb25mb3JtIHRvIGRlNHg1LmMKLSAgICAgIDAuNDQgICAgIDEtU2VwLTk3ICAgRml4ICpfcHJvYmUoKSB0byB0ZXN0IGNoZWNrX3JlZ2lvbigpIGZpcnN0IC0gYnVnCi0gICAgICAgICAgICAgICAgICAgICAgICAgICByZXBvcnRlZCBieSA8bW1vZ2lsdmlAZWxiZXJ0LnVjY3MuZWR1PgotICAgICAgMC40NSAgICAgMy1Ob3YtOTggICBBZGRlZCBzdXBwb3J0IGZvciBNQ0EgRXRoZXJXT1JLUyAoREUyMTAvREUyMTIpIGNhcmRzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBieSA8dHltbUBjb21wdXRlci5vcmc+IAotICAgICAgMC40NTEgICAgNS1Ob3YtOTggICBGaXhlZCBtY2Egc3R1ZmYgY3V6IEknbSBhIGR1bW15LiA8dHltbUBjb21wdXRlci5vcmc+Ci0gICAgICAwLjUgICAgIDE0LU5vdi05OCAgIFJlLXNwaW4gZm9yIDIuMS54IGtlcm5lbHMuCi0gICAgICAwLjUxICAgIDI3LUp1bi05OSAgIENvcnJlY3QgcmVjZWl2ZWQgcGFja2V0IGxlbmd0aCBmb3IgQ1JDIGZyb20KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcG9ydCBieSA8d29ybUBka2lrLmRrPgotCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLQotI2luY2x1ZGUgImV0aGVyYm9vdC5oIgotI2luY2x1ZGUgIm5pYy5oIgotI2luY2x1ZGUgImNhcmRzLmgiCi0KLS8qCi0qKiBJL08gYWRkcmVzc2VzLiBOb3RlIHRoYXQgdGhlIDJrIGJ1ZmZlciBvcHRpb24gaXMgbm90IHN1cHBvcnRlZCBpbgotKiogdGhpcyBkcml2ZXIuCi0qLwotI2RlZmluZSBERVBDQV9OSUNTUiBpb2FkZHIrMHgwMCAgIC8qIE5ldHdvcmsgaW50ZXJmYWNlIENTUiAqLwotI2RlZmluZSBERVBDQV9SQkkgICBpb2FkZHIrMHgwMiAgIC8qIFJBTSBidWZmZXIgaW5kZXggKDJrIGJ1ZmZlciBtb2RlKSAqLwotI2RlZmluZSBERVBDQV9EQVRBICBpb2FkZHIrMHgwNCAgIC8qIExBTkNFIHJlZ2lzdGVycycgZGF0YSBwb3J0ICovCi0jZGVmaW5lIERFUENBX0FERFIgIGlvYWRkcisweDA2ICAgLyogTEFOQ0UgcmVnaXN0ZXJzJyBhZGRyZXNzIHBvcnQgKi8KLSNkZWZpbmUgREVQQ0FfSEJBU0UgaW9hZGRyKzB4MDggICAvKiBFSVNBIGhpZ2ggbWVtb3J5IGJhc2UgYWRkcmVzcyByZWcuICovCi0jZGVmaW5lIERFUENBX1BST00gIGlvYWRkcisweDBjICAgLyogRXRoZXJuZXQgYWRkcmVzcyBST00gZGF0YSBwb3J0ICovCi0jZGVmaW5lIERFUENBX0NORkcgIGlvYWRkcisweDBjICAgLyogRUlTQSBDb25maWd1cmF0aW9uIHBvcnQgKi8KLSNkZWZpbmUgREVQQ0FfUkJTQSAgaW9hZGRyKzB4MGUgICAvKiBSQU0gYnVmZmVyIHN0YXJ0aW5nIGFkZHJlc3MgKDJrIGJ1ZmYuKSAqLwotCi0vKgotKiogVGhlc2UgYXJlIExBTkNFIHJlZ2lzdGVycyBhZGRyZXNzYWJsZSB0aHJvdWdoIERFUENBX0FERFIgCi0qLwotI2RlZmluZSBDU1IwICAgICAgIDAKLSNkZWZpbmUgQ1NSMSAgICAgICAxCi0jZGVmaW5lIENTUjIgICAgICAgMgotI2RlZmluZSBDU1IzICAgICAgIDMKLQotLyogCi0qKiBORVRXT1JLIElOVEVSRkFDRSBDU1IgKE5JX0NTUikgYml0IGRlZmluaXRpb25zIAotKi8KLSAKLSNkZWZpbmUgVE8gICAgICAgCTB4MDEwMAkvKiBUaW1lIE91dCBmb3IgcmVtb3RlIGJvb3QgKi8KLSNkZWZpbmUgU0hFICAgICAgCTB4MDA4MCAgLyogU0hhZG93IG1lbW9yeSBFbmFibGUgKi8KLSNkZWZpbmUgQlMgICAgICAgCTB4MDA0MCAgLyogQmFuayBTZWxlY3QgKi8KLSNkZWZpbmUgQlVGICAgICAgCTB4MDAyMAkvKiBCVUZmZXIgc2l6ZSAoMS0+MzJrLCAwLT42NGspICovCi0jZGVmaW5lIFJCRSAgICAgIAkweDAwMTAJLyogUmVtb3RlIEJvb3QgRW5hYmxlICgxLT5uZXQgYm9vdCkgKi8KLSNkZWZpbmUgQUFDICAgICAgCTB4MDAwOCAgLyogQWRkcmVzcyBST00gQWRkcmVzcyBDb3VudGVyICgxLT5lbmFibGUpICovCi0jZGVmaW5lIF8xMjhLQiAgICAgIAkweDAwMDggIC8qIDEyOGtCIE5ldHdvcmsgUkFNICgxLT5lbmFibGUpICovCi0jZGVmaW5lIElNICAgICAgIAkweDAwMDQJLyogSW50ZXJydXB0IE1hc2sgKDEtPm1hc2spICovCi0jZGVmaW5lIElFTiAgICAgIAkweDAwMDIJLyogSW50ZXJydXB0IHRyaXN0YXRlIEVOYWJsZSAoMS0+ZW5hYmxlKSAqLwotI2RlZmluZSBMRUQgICAgICAJMHgwMDAxCS8qIExFRCBjb250cm9sICovCi0KLS8qIAotKiogQ29udHJvbCBhbmQgU3RhdHVzIFJlZ2lzdGVyIDAgKENTUjApIGJpdCBkZWZpbml0aW9ucyAKLSovCi0KLSNkZWZpbmUgRVJSICAgICAJMHg4MDAwIAkvKiBFcnJvciBzdW1tYXJ5ICovCi0jZGVmaW5lIEJBQkwgICAgCTB4NDAwMCAJLyogQmFiYmxlIHRyYW5zbWl0dGVyIHRpbWVvdXQgZXJyb3IgICovCi0jZGVmaW5lIENFUlIgICAgCTB4MjAwMCAJLyogQ29sbGlzaW9uIEVycm9yICovCi0jZGVmaW5lIE1JU1MgICAgCTB4MTAwMCAJLyogTWlzc2VkIHBhY2tldCAqLwotI2RlZmluZSBNRVJSICAgIAkweDA4MDAgCS8qIE1lbW9yeSBFcnJvciAqLwotI2RlZmluZSBSSU5UICAgIAkweDA0MDAgCS8qIFJlY2VpdmVyIEludGVycnVwdCAqLwotI2RlZmluZSBUSU5UICAgIAkweDAyMDAgCS8qIFRyYW5zbWl0IEludGVycnVwdCAqLwotI2RlZmluZSBJRE9OICAgIAkweDAxMDAgCS8qIEluaXRpYWxpemF0aW9uIERvbmUgKi8KLSNkZWZpbmUgSU5UUiAgICAJMHgwMDgwIAkvKiBJbnRlcnJ1cHQgRmxhZyAqLwotI2RlZmluZSBJTkVBICAgIAkweDAwNDAgCS8qIEludGVycnVwdCBFbmFibGUgKi8KLSNkZWZpbmUgUlhPTiAgICAJMHgwMDIwIAkvKiBSZWNlaXZlciBvbiAqLwotI2RlZmluZSBUWE9OICAgIAkweDAwMTAgCS8qIFRyYW5zbWl0dGVyIG9uICovCi0jZGVmaW5lIFRETUQgICAgCTB4MDAwOCAJLyogVHJhbnNtaXQgRGVtYW5kICovCi0jZGVmaW5lIFNUT1AgICAgCTB4MDAwNCAJLyogU3RvcCAqLwotI2RlZmluZSBTVFJUICAgIAkweDAwMDIgCS8qIFN0YXJ0ICovCi0jZGVmaW5lIElOSVQgICAgCTB4MDAwMSAJLyogSW5pdGlhbGl6ZSAqLwotI2RlZmluZSBJTlRNICAgICAgICAgICAgMHhmZjAwICAvKiBJbnRlcnJ1cHQgTWFzayAqLwotI2RlZmluZSBJTlRFICAgICAgICAgICAgMHhmZmYwICAvKiBJbnRlcnJ1cHQgRW5hYmxlICovCi0KLS8qCi0qKiBDT05UUk9MIEFORCBTVEFUVVMgUkVHSVNURVIgMyAoQ1NSMykKLSovCi0KLSNkZWZpbmUgQlNXUCAgICAJMHgwMDA0CS8qIEJ5dGUgU1dhUCAqLwotI2RlZmluZSBBQ09OICAgIAkweDAwMDIJLyogQUxFIGNvbnRyb2wgKi8KLSNkZWZpbmUgQkNPTiAgICAJMHgwMDAxCS8qIEJ5dGUgQ09OdHJvbCAqLwotCi0vKgotKiogSW5pdGlhbGl6YXRpb24gQmxvY2sgTW9kZSBSZWdpc3RlciAKLSovCi0KLSNkZWZpbmUgUFJPTSAgICAgICAJMHg4MDAwIAkvKiBQcm9taXNjdW91cyBNb2RlICovCi0jZGVmaW5lIEVNQkEgICAgICAgCTB4MDA4MAkvKiBFbmFibGUgTW9kaWZpZWQgQmFjay1vZmYgQWxnb3JpdGhtICovCi0jZGVmaW5lIElOVEwgICAgICAgCTB4MDA0MCAJLyogSW50ZXJuYWwgTG9vcGJhY2sgKi8KLSNkZWZpbmUgRFJUWSAgICAgICAJMHgwMDIwIAkvKiBEaXNhYmxlIFJldHJ5ICovCi0jZGVmaW5lIENPTEwgICAgICAgCTB4MDAxMCAJLyogRm9yY2UgQ29sbGlzaW9uICovCi0jZGVmaW5lIERUQ1IgICAgICAgCTB4MDAwOCAJLyogRGlzYWJsZSBUcmFuc21pdCBDUkMgKi8KLSNkZWZpbmUgTE9PUCAgICAgICAJMHgwMDA0IAkvKiBMb29wYmFjayAqLwotI2RlZmluZSBEVFggICAgICAgIAkweDAwMDIgCS8qIERpc2FibGUgdGhlIFRyYW5zbWl0dGVyICovCi0jZGVmaW5lIERSWCAgICAgICAgCTB4MDAwMSAJLyogRGlzYWJsZSB0aGUgUmVjZWl2ZXIgKi8KLQotLyoKLSoqIFJlY2VpdmUgTWVzc2FnZSBEZXNjcmlwdG9yIDEgKFJNRDEpIGJpdCBkZWZpbml0aW9ucy4gCi0qLwotCi0jZGVmaW5lIFJfT1dOICAgICAgIDB4ODAwMDAwMDAgCS8qIE93bmVyIGJpdCAwID0gaG9zdCwgMSA9IGxhbmNlICovCi0jZGVmaW5lIFJfRVJSICAgICAJMHg0MDAwIAkvKiBFcnJvciBTdW1tYXJ5ICovCi0jZGVmaW5lIFJfRlJBTSAgICAJMHgyMDAwIAkvKiBGcmFtaW5nIEVycm9yICovCi0jZGVmaW5lIFJfT0ZMTyAgICAJMHgxMDAwIAkvKiBPdmVyZmxvdyBFcnJvciAqLwotI2RlZmluZSBSX0NSQyAgICAgCTB4MDgwMCAJLyogQ1JDIEVycm9yICovCi0jZGVmaW5lIFJfQlVGRiAgICAJMHgwNDAwIAkvKiBCdWZmZXIgRXJyb3IgKi8KLSNkZWZpbmUgUl9TVFAgICAgIAkweDAyMDAgCS8qIFN0YXJ0IG9mIFBhY2tldCAqLwotI2RlZmluZSBSX0VOUCAgICAgCTB4MDEwMCAJLyogRW5kIG9mIFBhY2tldCAqLwotCi0vKgotKiogVHJhbnNtaXQgTWVzc2FnZSBEZXNjcmlwdG9yIDEgKFRNRDEpIGJpdCBkZWZpbml0aW9ucy4gCi0qLwotCi0jZGVmaW5lIFRfT1dOICAgICAgIDB4ODAwMDAwMDAgCS8qIE93bmVyIGJpdCAwID0gaG9zdCwgMSA9IGxhbmNlICovCi0jZGVmaW5lIFRfRVJSICAgICAJMHg0MDAwIAkvKiBFcnJvciBTdW1tYXJ5ICovCi0jZGVmaW5lIFRfQUREX0ZDUyAJMHgyMDAwIAkvKiBNb3JlIHRoZSAxIHJldHJ5IG5lZWRlZCB0byBYbWl0ICovCi0jZGVmaW5lIFRfTU9SRSAgICAJMHgxMDAwCS8qID4xIHJldHJ5IHRvIHRyYW5zbWl0IHBhY2tldCAqLwotI2RlZmluZSBUX09ORSAgICAgCTB4MDgwMCAJLyogMSB0cnkgbmVlZGVkIHRvIHRyYW5zbWl0IHRoZSBwYWNrZXQgKi8KLSNkZWZpbmUgVF9ERUYgICAgIAkweDA0MDAgCS8qIERlZmVycmVkICovCi0jZGVmaW5lIFRfU1RQICAgICAgIDB4MDIwMDAwMDAgCS8qIFN0YXJ0IG9mIFBhY2tldCAqLwotI2RlZmluZSBUX0VOUCAgICAgICAweDAxMDAwMDAwCS8qIEVuZCBvZiBQYWNrZXQgKi8KLSNkZWZpbmUgVF9GTEFHUyAgICAgMHhmZjAwMDAwMCAgLyogVFggRmxhZ3MgRmllbGQgKi8KLQotLyoKLSoqIFRyYW5zbWl0IE1lc3NhZ2UgRGVzY3JpcHRvciAzIChUTUQzKSBiaXQgZGVmaW5pdGlvbnMuCi0qLwotCi0jZGVmaW5lIFRNRDNfQlVGRiAgICAweDgwMDAJLyogQlVGRmVyIGVycm9yICovCi0jZGVmaW5lIFRNRDNfVUZMTyAgICAweDQwMDAJLyogVW5kZXJGTE93IGVycm9yICovCi0jZGVmaW5lIFRNRDNfUkVTICAgICAweDIwMDAJLyogUkVTZXJ2ZWQgKi8KLSNkZWZpbmUgVE1EM19MQ09MICAgIDB4MTAwMAkvKiBMYXRlIENPTGxpc2lvbiAqLwotI2RlZmluZSBUTUQzX0xDQVIgICAgMHgwODAwCS8qIExvc3Mgb2YgQ0FScmllciAqLwotI2RlZmluZSBUTUQzX1JUUlkgICAgMHgwNDAwCS8qIFJlVFJZIGVycm9yICovCi0KLS8qCi0qKiBFdGhlcm5ldCBQUk9NIGRlZmluZXMKLSovCi0jZGVmaW5lIFBST0JFX0xFTkdUSCAgICAzMgotCi0vKgotKiogU2V0IHRoZSBudW1iZXIgb2YgVHggYW5kIFJ4IGJ1ZmZlcnMuIEVuc3VyZSB0aGF0IHRoZSBtZW1vcnkgcmVxdWVzdGVkCi0qKiBoZXJlIGlzIDw9IHRvIHRoZSBhbW91bnQgb2Ygc2hhcmVkIG1lbW9yeSBzZXQgdXAgYnkgdGhlIGJvYXJkIHN3aXRjaGVzLgotKiogVGhlIG51bWJlciBvZiBkZXNjcmlwdG9ycyBNVVNUIEJFIEEgUE9XRVIgT0YgMi4KLSoqCi0qKiB0b3RhbF9tZW1vcnkgPSBOVU1fUlhfREVTQyooOCtSWF9CVUZGX1NaKSArIE5VTV9UWF9ERVNDKig4K1RYX0JVRkZfU1opCi0qLwotI2RlZmluZSBOVU1fUlhfREVTQyAgICAgMiAgICAgICAgICAgICAgIC8qIE51bWJlciBvZiBSWCBkZXNjcmlwdG9ycyAqLwotI2RlZmluZSBOVU1fVFhfREVTQyAgICAgMiAgICAgICAgICAgICAgIC8qIE51bWJlciBvZiBUWCBkZXNjcmlwdG9ycyAqLwotI2RlZmluZSBSWF9CVUZGX1NaCTE1MzYgICAgICAgICAgICAvKiBCdWZmZXIgc2l6ZSBmb3IgZWFjaCBSeCBidWZmZXIgKi8KLSNkZWZpbmUgVFhfQlVGRl9TWgkxNTM2ICAgICAgICAgICAgLyogQnVmZmVyIHNpemUgZm9yIGVhY2ggVHggYnVmZmVyICovCi0KLS8qCi0qKiBJU0EgQnVzIGRlZmluZXMKLSovCi0jZGVmaW5lIERFUENBX0lPX1BPUlRTCXsweDMwMCwgMHgyMDAsIDB9Ci0KLSNpZm5kZWYJREVQQ0FfTU9ERUwKLSNkZWZpbmUJREVQQ0FfTU9ERUwJREVQQ0EKLSNlbmRpZgotCi1zdGF0aWMgZW51bSB7Ci0JREVQQ0EsIERFMTAwLCBERTEwMSwgREUyMDAsIERFMjAxLCBERTIwMiwgREUyMTAsIERFMjEyLCBERTQyMiwgdW5rbm93bgotfSBhZGFwdGVyID0gREVQQ0FfTU9ERUw7Ci0KLS8qCi0qKiBOYW1lIDwtPiBBZGFwdGVyIG1hcHBpbmcKLSovCi0KLXN0YXRpYyBjaGFyICphZGFwdGVyX25hbWVbXSA9IHsKLQkiREVQQ0EiLAotCSJERTEwMCIsIkRFMTAxIiwKLQkiREUyMDAiLCJERTIwMSIsIkRFMjAyIiwKLQkiREUyMTAiLCJERTIxMiIsCi0JIkRFNDIyIiwKLQkiIgotfTsKLQotI2lmbmRlZglERVBDQV9SQU1fQkFTRQotI2RlZmluZSBERVBDQV9SQU1fQkFTRQkweGQwMDAwCi0jZW5kaWYKLQotLyoKLSoqIE1lbW9yeSBBbGlnbm1lbnQuIEVhY2ggZGVzY3JpcHRvciBpcyA0IGxvbmd3b3JkcyBsb25nLiBUbyBmb3JjZSBhCi0qKiBwYXJ0aWN1bGFyIGFsaWdubWVudCBvbiB0aGUgVFggZGVzY3JpcHRvciwgYWRqdXN0IERFU0NfU0tJUF9MRU4gYW5kCi0qKiBERVNDX0FMSUdOLiBBTElHTiBhbGlnbnMgdGhlIHN0YXJ0IGFkZHJlc3Mgb2YgdGhlIHByaXZhdGUgbWVtb3J5IGFyZWEKLSoqIGFuZCBoZW5jZSB0aGUgUlggZGVzY3JpcHRvciByaW5nJ3MgZmlyc3QgZW50cnkuIAotKi8KLSNkZWZpbmUgQUxJR040ICAgICAgKCh1MzIpNCAtIDEpICAgICAgIC8qIDEgbG9uZ3dvcmQgYWxpZ24gKi8KLSNkZWZpbmUgQUxJR044ICAgICAgKCh1MzIpOCAtIDEpICAgICAgIC8qIDIgbG9uZ3dvcmQgKHF1YWR3b3JkKSBhbGlnbiAqLwotI2RlZmluZSBBTElHTiAgICAgICAgIEFMSUdOOCAgICAgICAgICAgICAgLyogS2VlcCB0aGUgTEFOQ0UgaGFwcHkuLi4gKi8KLQotdHlwZWRlZglsb25nCQlzMzI7Ci10eXBlZGVmCXVuc2lnbmVkIGxvbmcJdTMyOwotdHlwZWRlZglzaG9ydAkJczE2OwotdHlwZWRlZgl1bnNpZ25lZCBzaG9ydAl1MTY7Ci10eXBlZGVmCWNoYXIJCXM4OwotdHlwZWRlZgl1bnNpZ25lZCBjaGFyCXU4OwotCi0vKgotKiogVGhlIERFUENBIFJ4IGFuZCBUeCByaW5nIGRlc2NyaXB0b3JzLiAKLSovCi1zdHJ1Y3QgZGVwY2FfcnhfZGVzYyB7Ci0gICAgdm9sYXRpbGUgczMyIGJhc2U7Ci0gICAgczE2IGJ1Zl9sZW5ndGg7CQkvKiBUaGlzIGxlbmd0aCBpcyBuZWdhdGl2ZSAyJ3MgY29tcGxlbWVudCEgKi8KLSAgICBzMTYgbXNnX2xlbmd0aDsJCS8qIFRoaXMgbGVuZ3RoIGlzICJub3JtYWwiLiAqLwotfTsKLQotc3RydWN0IGRlcGNhX3R4X2Rlc2MgewotICAgIHZvbGF0aWxlIHMzMiBiYXNlOwotICAgIHMxNiBsZW5ndGg7CQkgICAgICAgIC8qIFRoaXMgbGVuZ3RoIGlzIG5lZ2F0aXZlIDIncyBjb21wbGVtZW50ISAqLwotICAgIHMxNiBtaXNjOyAgICAgICAgICAgICAgICAgICAvKiBFcnJvcnMgYW5kIFREUiBpbmZvICovCi19OwotCi0jZGVmaW5lIExBX01BU0sgMHgwMDAwZmZmZiAgICAgIC8qIExBTkNFIGFkZHJlc3MgbWFzayBmb3IgbWFwcGluZyBuZXR3b3JrIFJBTQotCQkJCSAgIHRvIExBTkNFIG1lbW9yeSBhZGRyZXNzIHNwYWNlICovCi0KLS8qCi0qKiBUaGUgTGFuY2UgaW5pdGlhbGl6YXRpb24gYmxvY2ssIGRlc2NyaWJlZCBpbiBkYXRhYm9vaywgaW4gY29tbW9uIG1lbW9yeS4KLSovCi1zdHJ1Y3QgZGVwY2FfaW5pdCB7Ci0gICAgdTE2IG1vZGU7CSAgICAgICAgICAgICAgICAvKiBNb2RlIHJlZ2lzdGVyICovCi0gICAgdTggIHBoeXNfYWRkcltFVEhfQUxFTl07CS8qIFBoeXNpY2FsIGV0aGVybmV0IGFkZHJlc3MgKi8KLSAgICB1OCAgbWNhc3RfdGFibGVbOF07CSAgICAgICAgLyogTXVsdGljYXN0IEhhc2ggVGFibGUuICovCi0gICAgdTMyIHJ4X3Jpbmc7ICAgICAJICAgICAgICAvKiBSeCByaW5nIGJhc2UgcG9pbnRlciAmIHJpbmcgbGVuZ3RoICovCi0gICAgdTMyIHR4X3Jpbmc7CSAgICAgICAgLyogVHggcmluZyBiYXNlIHBvaW50ZXIgJiByaW5nIGxlbmd0aCAqLwotfTsKLQotc3RydWN0IGRlcGNhX3ByaXZhdGUgewotCXN0cnVjdCBkZXBjYV9yeF9kZXNjCSpyeF9yaW5nOwotCXN0cnVjdCBkZXBjYV90eF9kZXNjCSp0eF9yaW5nOwotCXN0cnVjdCBkZXBjYV9pbml0CWluaXRfYmxvY2s7CS8qIFNoYWRvdyBpbml0IGJsb2NrICovCi0JY2hhcgkJCSpyeF9tZW1jcHlbTlVNX1JYX0RFU0NdOwotCWNoYXIJCQkqdHhfbWVtY3B5W05VTV9UWF9ERVNDXTsKLQl1MzIJCQlidXNfb2Zmc2V0OwkvKiBJU0EgYnVzIGFkZHJlc3Mgb2Zmc2V0ICovCi0JdTMyCQkJc2hfbWVtOwkJLyogYWRkcmVzcyBvZiBzaGFyZWQgbWVtICovCi0JdTMyCQkJZG1hX2J1ZmZzOwkvKiBSeCAmIFR4IGJ1ZmZlciBzdGFydCAqLwotCWludAkJCXJ4X2N1ciwgdHhfY3VyOwkvKiBOZXh0IGZyZWUgcmluZyBlbnRyeSAqLwotCWludAkJCXR4UmluZ01hc2ssIHJ4UmluZ01hc2s7Ci0JczMyCQkJcnhfcmxlbiwgdHhfcmxlbjsKLQkvKiBsb2cyKFtydF14UmluZ01hc2srMSkgZm9yIHRoZSBkZXNjcmlwdG9ycyAqLwotfTsKLQotc3RhdGljIEFkZHJlc3MJCW1lbV9zdGFydCA9IERFUENBX1JBTV9CQVNFOwotc3RhdGljIEFkZHJlc3MJCW1lbV9sZW4sIG9mZnNldDsKLXN0YXRpYyB1bnNpZ25lZCBzaG9ydAlpb2FkZHIgPSAwOwotc3RhdGljIHN0cnVjdCBkZXBjYV9wcml2YXRlCWxwOwotCi0vKgotKiogTWlzY2VsbGFuZW91cyBkZWZpbmVzLi4uCi0qLwotI2RlZmluZSBTVE9QX0RFUENBIFwKLSAgICBvdXR3KENTUjAsIERFUENBX0FERFIpO1wKLSAgICBvdXR3KFNUT1AsIERFUENBX0RBVEEpCi0KLS8qIEluaXRpYWxpemUgdGhlIGxhbmNlIFJ4IGFuZCBUeCBkZXNjcmlwdG9yIHJpbmdzLiAqLwotc3RhdGljIHZvaWQgZGVwY2FfaW5pdF9yaW5nKHN0cnVjdCBuaWMgKm5pYykKLXsKLQlpbnQJaTsKLQl1MzIJcDsKLQotCWxwLnJ4X2N1ciA9IGxwLnR4X2N1ciA9IDA7Ci0JLyogSW5pdGlhbGl6ZSB0aGUgYmFzZSBhZGRyZXNzZXMgYW5kIGxlbmd0aCBvZiBlYWNoIGJ1ZmZlciBpbiB0aGUgcmluZyAqLwotCWZvciAoaSA9IDA7IGkgPD0gbHAucnhSaW5nTWFzazsgaSsrKSB7Ci0JCXdyaXRlbCgocCA9IGxwLmRtYV9idWZmcyArIGkgKiBSWF9CVUZGX1NaKSB8IFJfT1dOLCAmbHAucnhfcmluZ1tpXS5iYXNlKTsKLQkJd3JpdGV3KC1SWF9CVUZGX1NaLCAmbHAucnhfcmluZ1tpXS5idWZfbGVuZ3RoKTsKLQkJbHAucnhfbWVtY3B5W2ldID0gKGNoYXIgKikgKHAgKyBscC5idXNfb2Zmc2V0KTsKLQl9Ci0JZm9yIChpID0gMDsgaSA8PSBscC50eFJpbmdNYXNrOyBpKyspIHsKLQkJd3JpdGVsKChwID0gbHAuZG1hX2J1ZmZzICsgKGkgKyBscC50eFJpbmdNYXNrICsgMSkgKiBUWF9CVUZGX1NaKSAmIDB4MDBmZmZmZmYsICZscC50eF9yaW5nW2ldLmJhc2UpOwotCQlscC50eF9tZW1jcHlbaV0gPSAoY2hhciAqKSAocCArIGxwLmJ1c19vZmZzZXQpOwotCX0KLQotCS8qIFNldCB1cCB0aGUgaW5pdGlhbGl6YXRpb24gYmxvY2sgKi8KLQlscC5pbml0X2Jsb2NrLnJ4X3JpbmcgPSAoKHUzMikgKCh1MzIpIGxwLnJ4X3JpbmcpICYgTEFfTUFTSykgfCBscC5yeF9ybGVuOwotCWxwLmluaXRfYmxvY2sudHhfcmluZyA9ICgodTMyKSAoKHUzMikgbHAudHhfcmluZykgJiBMQV9NQVNLKSB8IGxwLnR4X3JsZW47Ci0JZm9yIChpID0gMDsgaSA8IEVUSF9BTEVOOyBpKyspCi0JCWxwLmluaXRfYmxvY2sucGh5c19hZGRyW2ldID0gbmljLT5ub2RlX2FkZHJbaV07Ci0JbHAuaW5pdF9ibG9jay5tb2RlID0gMHgwMDAwOwkvKiBFbmFibGUgdGhlIFR4IGFuZCBSeCAqLwotCW1lbXNldChscC5pbml0X2Jsb2NrLm1jYXN0X3RhYmxlLCAwLCBzaXplb2YobHAuaW5pdF9ibG9jay5tY2FzdF90YWJsZSkpOwotfQotCi1zdGF0aWMgdm9pZCBMb2FkQ1NScyh2b2lkKQotewotCW91dHcoQ1NSMSwgREVQQ0FfQUREUik7CS8qIGluaXRpYWxpc2F0aW9uIGJsb2NrIGFkZHJlc3MgTFNXICovCi0Jb3V0dygodTE2KSAobHAuc2hfbWVtICYgTEFfTUFTSyksIERFUENBX0RBVEEpOwotCW91dHcoQ1NSMiwgREVQQ0FfQUREUik7CS8qIGluaXRpYWxpc2F0aW9uIGJsb2NrIGFkZHJlc3MgTVNXICovCi0Jb3V0dygodTE2KSAoKGxwLnNoX21lbSAmIExBX01BU0spID4+IDE2KSwgREVQQ0FfREFUQSk7Ci0Jb3V0dyhDU1IzLCBERVBDQV9BRERSKTsJLyogQUxFIGNvbnRyb2wgKi8KLQlvdXR3KEFDT04sIERFUENBX0RBVEEpOwotCW91dHcoQ1NSMCwgREVQQ0FfQUREUik7CS8qIFBvaW50IGJhY2sgdG8gQ1NSMCAqLwotfQotCi1zdGF0aWMgaW50IEluaXRSZXN0YXJ0RGVwY2Eodm9pZCkKLXsKLQlpbnQJCWk7Ci0KLQkvKiBDb3B5IHRoZSBzaGFkb3cgaW5pdF9ibG9jayB0byBzaGFyZWQgbWVtb3J5ICovCi0JbWVtY3B5X3RvaW8oKGNoYXIgKilscC5zaF9tZW0sICZscC5pbml0X2Jsb2NrLCBzaXplb2Yoc3RydWN0IGRlcGNhX2luaXQpKTsKLQlvdXR3KENTUjAsIERFUENBX0FERFIpOwkJLyogcG9pbnQgYmFjayB0byBDU1IwICovCi0Jb3V0dyhJTklULCBERVBDQV9EQVRBKTsJCS8qIGluaXRpYWxpc2UgREVQQ0EgKi8KLQotCWZvciAoaSA9IDA7IGkgPCAxMDAgJiYgIShpbncoREVQQ0FfREFUQSkgJiBJRE9OKTsgaSsrKQotCQk7Ci0JaWYgKGkgPCAxMDApIHsKLQkJLyogY2xlYXIgSURPTiBieSB3cml0aW5nIGEgMSwgYW5kIHN0YXJ0IExBTkNFICovCi0JCW91dHcoSURPTiB8IFNUUlQsIERFUENBX0RBVEEpOwotCX0gZWxzZSB7Ci0JCXByaW50ZigiREVQQ0Egbm90IGluaXRpYWxpc2VkXG4iKTsKLQkJcmV0dXJuICgxKTsKLQl9Ci0JcmV0dXJuICgwKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRVNFVCAtIFJlc2V0IGFkYXB0ZXIKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIGRlcGNhX3Jlc2V0KHN0cnVjdCBuaWMgKm5pYykKLXsKLQlzMTYJbmljc3I7Ci0JaW50CWksIGo7Ci0KLQlTVE9QX0RFUENBOwotCW5pY3NyID0gaW5iKERFUENBX05JQ1NSKTsKLQluaWNzciA9ICgobmljc3IgJiB+U0hFICYgflJCRSAmIH5JRU4pIHwgSU0pOwotCW91dGIobmljc3IsIERFUENBX05JQ1NSKTsKLQlpZiAoaW53KERFUENBX0RBVEEpICE9IFNUT1ApCi0JewotCQlwcmludGYoImRlcGNhOiBDYW5ub3Qgc3RvcCBOSUNcbiIpOwotCQlyZXR1cm47Ci0JfQotCi0JLyogSW5pdGlhbGlzYXRpb24gYmxvY2sgKi8KLQlscC5zaF9tZW0gPSBtZW1fc3RhcnQ7Ci0JbWVtX3N0YXJ0ICs9IHNpemVvZihzdHJ1Y3QgZGVwY2FfaW5pdCk7Ci0JLyogVHggJiBSeCBkZXNjcmlwdG9ycyAoYWxpZ25lZCB0byBhIHF1YWR3b3JkIGJvdW5kYXJ5KSAqLwotCW1lbV9zdGFydCA9IChtZW1fc3RhcnQgKyBBTElHTikgJiB+QUxJR047Ci0JbHAucnhfcmluZyA9IChzdHJ1Y3QgZGVwY2FfcnhfZGVzYyAqKSBtZW1fc3RhcnQ7Ci0JbWVtX3N0YXJ0ICs9IChzaXplb2Yoc3RydWN0IGRlcGNhX3J4X2Rlc2MpICogTlVNX1JYX0RFU0MpOwotCWxwLnR4X3JpbmcgPSAoc3RydWN0IGRlcGNhX3R4X2Rlc2MgKikgbWVtX3N0YXJ0OwotCW1lbV9zdGFydCArPSAoc2l6ZW9mKHN0cnVjdCBkZXBjYV90eF9kZXNjKSAqIE5VTV9UWF9ERVNDKTsKLQotCWxwLmJ1c19vZmZzZXQgPSBtZW1fc3RhcnQgJiAweDAwZmYwMDAwOwotCS8qIExBTkNFIHJlLW1hcHBlZCBzdGFydCBhZGRyZXNzICovCi0JbHAuZG1hX2J1ZmZzID0gbWVtX3N0YXJ0ICYgTEFfTUFTSzsKLQotCS8qIEZpbmlzaCBpbml0aWFsaXNpbmcgdGhlIHJpbmcgaW5mb3JtYXRpb24uICovCi0JbHAucnhSaW5nTWFzayA9IE5VTV9SWF9ERVNDIC0gMTsKLQlscC50eFJpbmdNYXNrID0gTlVNX1RYX0RFU0MgLSAxOwotCi0JLyogQ2FsY3VsYXRlIFR4L1J4IFJMRU4gc2l6ZSBmb3IgdGhlIGRlc2NyaXB0b3JzLiAqLwotCWZvciAoaSA9IDAsIGogPSBscC5yeFJpbmdNYXNrOyBqID4gMDsgaSsrKSB7Ci0JCWogPj49IDE7Ci0JfQotCWxwLnJ4X3JsZW4gPSAoczMyKSAoaSA8PCAyOSk7Ci0JZm9yIChpID0gMCwgaiA9IGxwLnR4UmluZ01hc2s7IGogPiAwOyBpKyspIHsKLQkJaiA+Pj0gMTsKLQl9Ci0JbHAudHhfcmxlbiA9IChzMzIpIChpIDw8IDI5KTsKLQotCS8qIExvYWQgdGhlIGluaXRpYWxpc2F0aW9uIGJsb2NrICovCi0JZGVwY2FfaW5pdF9yaW5nKG5pYyk7Ci0JTG9hZENTUnMoKTsKLQlJbml0UmVzdGFydERlcGNhKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUE9MTCAtIFdhaXQgZm9yIGEgZnJhbWUKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBpbnQgZGVwY2FfcG9sbChzdHJ1Y3QgbmljICpuaWMpCi17Ci0JaW50CQllbnRyeTsKLQl1MzIJCXN0YXR1czsKLQotCWVudHJ5ID0gbHAucnhfY3VyOwotCWlmICgoc3RhdHVzID0gcmVhZGwoJmxwLnJ4X3JpbmdbZW50cnldLmJhc2UpICYgUl9PV04pKQotCQlyZXR1cm4gKDApOwotCW1lbWNweShuaWMtPnBhY2tldCwgbHAucnhfbWVtY3B5W2VudHJ5XSwgbmljLT5wYWNrZXRsZW4gPSBscC5yeF9yaW5nW2VudHJ5XS5tc2dfbGVuZ3RoKTsKLQlscC5yeF9yaW5nW2VudHJ5XS5iYXNlIHw9IFJfT1dOOwotCWxwLnJ4X2N1ciA9ICgrK2xwLnJ4X2N1cikgJiBscC5yeFJpbmdNYXNrOwotCXJldHVybiAoMSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotVFJBTlNNSVQgLSBUcmFuc21pdCBhIGZyYW1lCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBkZXBjYV90cmFuc21pdCgKLQlzdHJ1Y3QgbmljICpuaWMsCi0JY29uc3QgY2hhciAqZCwJCQkvKiBEZXN0aW5hdGlvbiAqLwotCXVuc2lnbmVkIGludCB0LAkJCS8qIFR5cGUgKi8KLQl1bnNpZ25lZCBpbnQgcywJCQkvKiBzaXplICovCi0JY29uc3QgY2hhciAqcCkJCQkvKiBQYWNrZXQgKi8KLXsKLQlpbnQJCWVudHJ5LCBsZW47Ci0JY2hhcgkJKm1lbTsKLQotCS8qIHNlbmQgdGhlIHBhY2tldCB0byBkZXN0aW5hdGlvbiAqLwotCS8qCi0JKiogQ2F1dGlvbjogdGhlIHJpZ2h0IG9yZGVyIGlzIGltcG9ydGFudCBoZXJlLi4uIGRvbnQKLQkqKiBzZXR1cCB0aGUgb3duZXJzaGlwIHJpZ2h0cyB1bnRpbCBhbGwgdGhlIG90aGVyCi0JKiogaW5mb3JtYXRpb24gaXMgaW4gcGxhY2UKLQkqLwotCW1lbSA9IGxwLnR4X21lbWNweVtlbnRyeSA9IGxwLnR4X2N1cl07Ci0JbWVtY3B5X3RvaW8obWVtLCBkLCBFVEhfQUxFTik7Ci0JbWVtY3B5X3RvaW8obWVtICsgRVRIX0FMRU4sIG5pYy0+bm9kZV9hZGRyLCBFVEhfQUxFTik7Ci0JbWVtW0VUSF9BTEVOICogMl0gPSB0ID4+IDg7Ci0JbWVtW0VUSF9BTEVOICogMiArIDFdID0gdDsKLQltZW1jcHlfdG9pbyhtZW0gKyBFVEhfSExFTiwgcCwgcyk7Ci0JcyArPSBFVEhfSExFTjsKLQlsZW4gPSAocyA8IEVUSF9aTEVOID8gRVRIX1pMRU4gOiBzKTsKLQkvKiBjbGVhbiBvdXQgZmxhZ3MgKi8KLQl3cml0ZWwocmVhZGwoJmxwLnR4X3JpbmdbZW50cnldLmJhc2UpICYgflRfRkxBR1MsICZscC50eF9yaW5nW2VudHJ5XS5iYXNlKTsKLQkvKiBjbGVhcnMgb3RoZXIgZXJyb3IgZmxhZ3MgKi8KLQl3cml0ZXcoMHgwMDAwLCAmbHAudHhfcmluZ1tlbnRyeV0ubWlzYyk7Ci0JLyogcGFja2V0IGxlbmd0aCBpbiBidWZmZXIgKi8KLQl3cml0ZXcoLWxlbiwgJmxwLnR4X3JpbmdbZW50cnldLmxlbmd0aCk7Ci0JLyogc3RhcnQgYW5kIGVuZCBvZiBwYWNrZXQsIG93bmVyc2hpcCAqLwotCXdyaXRlbChyZWFkbCgmbHAudHhfcmluZ1tlbnRyeV0uYmFzZSkgfCAoVF9TVFB8VF9FTlB8VF9PV04pLCAmbHAudHhfcmluZ1tlbnRyeV0uYmFzZSk7Ci0JLyogdXBkYXRlIGN1cnJlbnQgcG9pbnRlcnMgKi8KLQlscC50eF9jdXIgPSAoKytscC50eF9jdXIpICYgbHAudHhSaW5nTWFzazsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1ESVNBQkxFIC0gVHVybiBvZmYgZXRoZXJuZXQgaW50ZXJmYWNlCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBkZXBjYV9kaXNhYmxlKHN0cnVjdCBuaWMgKm5pYykKLXsKLQlTVE9QX0RFUENBOwotfQotCi0vKgotKiogTG9vayBmb3IgYSBzcGVjaWFsIHNlcXVlbmNlIGluIHRoZSBFdGhlcm5ldCBzdGF0aW9uIGFkZHJlc3MgUFJPTSB0aGF0Ci0qKiBpcyBjb21tb24gYWNyb3NzIGFsbCBERVBDQSBwcm9kdWN0cy4gTm90ZSB0aGF0IHRoZSBvcmlnaW5hbCBERVBDQSBuZWVkcwotKiogaXRzIFJPTSBhZGRyZXNzIGNvdW50ZXIgdG8gYmUgaW5pdGlhbGl6ZWQgYW5kIGVuYWJsZWQuIE9ubHkgZW5hYmxlCi0qKiBpZiB0aGUgZmlyc3QgYWRkcmVzcyBvY3RldCBpcyBhIDB4MDggLSB0aGlzIG1pbmltaXNlcyB0aGUgY2hhbmNlcyBvZgotKiogbWVzc2luZyBhcm91bmQgd2l0aCBzb21lIG90aGVyIGhhcmR3YXJlLCBidXQgaXQgYXNzdW1lcyB0aGF0IHRoaXMgREVQQ0EKLSoqIGNhcmQgaW5pdGlhbGl6ZWQgaXRzZWxmIGNvcnJlY3RseS4KLSoqCi0qKiBTZWFyY2ggdGhlIEV0aGVybmV0IGFkZHJlc3MgUk9NIGZvciB0aGUgc2lnbmF0dXJlLiBTaW5jZSB0aGUgUk9NIGFkZHJlc3MKLSoqIGNvdW50ZXIgY2FuIHN0YXJ0IGF0IGFuIGFyYml0cmFyeSBwb2ludCwgdGhlIHNlYXJjaCBtdXN0IGluY2x1ZGUgdGhlIGVudGlyZQotKiogcHJvYmUgc2VxdWVuY2UgbGVuZ3RoIHBsdXMgdGhlIChsZW5ndGhfb2ZfdGhlX3NpZ25hdHVyZSAtIDEpLgotKiogU3RvcCB0aGUgc2VhcmNoIElNTUVESUFURUxZIGFmdGVyIHRoZSBzaWduYXR1cmUgaXMgZm91bmQgc28gdGhhdCB0aGUKLSoqIFBST00gYWRkcmVzcyBjb3VudGVyIGlzIGNvcnJlY3RseSBwb3NpdGlvbmVkIGF0IHRoZSBzdGFydCBvZiB0aGUKLSoqIGV0aGVybmV0IGFkZHJlc3MgZm9yIGxhdGVyIHJlYWQgb3V0LgotKi8KLXN0YXRpYyBpbnQgZGVwY2FfcHJvYmUxKHN0cnVjdCBuaWMgKm5pYykKLXsKLQl1OAlkYXRhLCBuaWNzcjsKLQkvKiBUaGlzIGlzIG9ubHkgY29ycmVjdCBmb3IgbGl0dGxlIGVuZGlhbiBtYWNoaW5lcywgYnV0IHRoZW4KLQkgICBFdGhlcmJvb3QgZG9lc24ndCB3b3JrIG9uIGFueXRoaW5nIGJ1dCBhIFBDICovCi0JdTgJc2lnW10gPSB7IDB4RkYsIDB4MDAsIDB4NTUsIDB4QUEsIDB4RkYsIDB4MDAsIDB4NTUsIDB4QUEgfTsKLQlpbnQJaSwgajsKLQlsb25nCXN1bSwgY2hrc3VtOwotCi0JZGF0YSA9IGluYihERVBDQV9QUk9NKTsJCS8qIGNsZWFyIGNvdW50ZXIgb24gREVQQ0EgKi8KLQlkYXRhID0gaW5iKERFUENBX1BST00pOwkJLyogcmVhZCBkYXRhICovCi0JaWYgKGRhdGEgPT0gMHg4KSB7Ci0JCW5pY3NyID0gaW5iKERFUENBX05JQ1NSKTsKLQkJbmljc3IgfD0gQUFDOwotCQlvdXRiKG5pY3NyLCBERVBDQV9OSUNTUik7Ci0JfQotCWZvciAoaSA9IDAsIGogPSAwOyBqIDwgKGludClzaXplb2Yoc2lnKSAmJiBpIDwgUFJPQkVfTEVOR1RIKygoaW50KXNpemVvZihzaWcpKS0xOyArK2kpIHsKLQkJZGF0YSA9IGluYihERVBDQV9QUk9NKTsKLQkJaWYgKGRhdGEgPT0gc2lnW2pdKQkJLyogdHJhY2sgc2lnbmF0dXJlICovCi0JCQkrK2o7Ci0JCWVsc2UKLQkJCWogPSAoZGF0YSA9PSBzaWdbMF0pID8gMSA6IDA7Ci0JfQotCWlmIChqICE9IHNpemVvZihzaWcpKQotCQlyZXR1cm4gKDApOwotCS8qIHB1dCB0aGUgY2FyZCBpbiBpdHMgaW5pdGlhbCBzdGF0ZSAqLwotCVNUT1BfREVQQ0E7Ci0Jbmljc3IgPSAoKGluYihERVBDQV9OSUNTUikgJiB+U0hFICYgflJCRSAmIH5JRU4pIHwgSU0pOwotCW91dGIobmljc3IsIERFUENBX05JQ1NSKTsKLQlpZiAoaW53KERFUENBX0RBVEEpICE9IFNUT1ApCi0JCXJldHVybiAoMCk7Ci0JbWVtY3B5KChjaGFyICopbWVtX3N0YXJ0LCBzaWcsIHNpemVvZihzaWcpKTsKLQlpZiAobWVtY21wKChjaGFyICopbWVtX3N0YXJ0LCBzaWcsIHNpemVvZihzaWcpKSAhPSAwKQotCQlyZXR1cm4gKDApOwotCWZvciAoaSA9IDAsIGogPSAwLCBzdW0gPSAwOyBqIDwgMzsgaisrKSB7Ci0JCXN1bSA8PD0gMTsKLQkJaWYgKHN1bSA+IDB4RkZGRikKLQkJCXN1bSAtPSAweEZGRkY7Ci0JCXN1bSArPSAodTgpKG5pYy0+bm9kZV9hZGRyW2krK10gPSBpbmIoREVQQ0FfUFJPTSkpOwotCQlzdW0gKz0gKHUxNikoKG5pYy0+bm9kZV9hZGRyW2krK10gPSBpbmIoREVQQ0FfUFJPTSkpIDw8IDgpOwotCQlpZiAoc3VtID4gMHhGRkZGKQotCQkJc3VtIC09IDB4RkZGRjsKLQl9Ci0JaWYgKHN1bSA9PSAweEZGRkYpCi0JCXN1bSA9IDA7Ci0JY2hrc3VtID0gKHU4KWluYihERVBDQV9QUk9NKTsKLQljaGtzdW0gfD0gKHUxNikoaW5iKERFUENBX1BST00pIDw8IDgpOwotCW1lbV9sZW4gPSAoYWRhcHRlciA9PSBERVBDQSkgPyAoNDggPDwgMTApIDogKDY0IDw8IDEwKTsKLQlvZmZzZXQgPSAwOwotCWlmIChuaWNzciAmIEJVRikgewotCQlvZmZzZXQgPSAweDgwMDA7Ci0JCW5pY3NyICY9IH5CUzsKLQkJbWVtX2xlbiAtPSAoMzIgPDwgMTApOwotCX0KLQlpZiAoYWRhcHRlciAhPSBERVBDQSkJLyogZW5hYmxlIHNoYWRvdyBSQU0gKi8KLQkJb3V0YihuaWNzciB8PSBTSEUsIERFUENBX05JQ1NSKTsKLQlwcmludGYoIiVzIGJhc2UgJSNoWCwgbWVtb3J5IFslI2hYLSUjaFhdLCBhZGRyICUhIiwKLQkJYWRhcHRlcl9uYW1lW2FkYXB0ZXJdLCBpb2FkZHIsIG1lbV9zdGFydCwgbWVtX3N0YXJ0ICsgbWVtX2xlbiwKLQkJbmljLT5ub2RlX2FkZHIpOwotCWlmIChzdW0gIT0gY2hrc3VtKQotCQlwcmludGYoIiAoYmFkIGNoZWNrc3VtKSIpOwotCXB1dGNoYXIoJ1xuJyk7Ci0JcmV0dXJuICgxKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1QUk9CRSAtIExvb2sgZm9yIGFuIGFkYXB0ZXIsIHRoaXMgcm91dGluZSdzIHZpc2libGUgdG8gdGhlIG91dHNpZGUKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0cnVjdCBuaWMgKmRlcGNhX3Byb2JlKHN0cnVjdCBuaWMgKm5pYywgdW5zaWduZWQgc2hvcnQgKnByb2JlX2FkZHJzKQotewotCXN0YXRpYyB1bnNpZ25lZCBzaG9ydAliYXNlW10gPSBERVBDQV9JT19QT1JUUzsKLQlpbnQJCQlpOwotCi0JaWYgKHByb2JlX2FkZHJzID09IDAgfHwgcHJvYmVfYWRkcnNbMF0gPT0gMCkKLQkJcHJvYmVfYWRkcnMgPSBiYXNlOwkvKiBVc2UgZGVmYXVsdHMgKi8KLQlmb3IgKGkgPSAwOyAoaW9hZGRyID0gYmFzZVtpXSkgIT0gMDsgKytpKSB7Ci0JCWlmIChkZXBjYV9wcm9iZTEobmljKSkKLQkJCWJyZWFrOwotCX0KLQlpZiAoaW9hZGRyID09IDApCi0JCXJldHVybiAoMCk7Ci0JZGVwY2FfcmVzZXQobmljKTsKLQkvKiBwb2ludCB0byBOSUMgc3BlY2lmaWMgcm91dGluZXMgKi8KLQluaWMtPnJlc2V0ID0gZGVwY2FfcmVzZXQ7Ci0JbmljLT5wb2xsID0gZGVwY2FfcG9sbDsKLQluaWMtPnRyYW5zbWl0ID0gZGVwY2FfdHJhbnNtaXQ7Ci0JbmljLT5kaXNhYmxlID0gZGVwY2FfZGlzYWJsZTsKLQlyZXR1cm4gKG5pYyk7Ci19CmRpZmYgLU5hdXIgZ3J1Yi0wLjk3Lm9yaWcvbmV0Ym9vdC9kZXYuaCBncnViLTAuOTcvbmV0Ym9vdC9kZXYuaAotLS0gZ3J1Yi0wLjk3Lm9yaWcvbmV0Ym9vdC9kZXYuaAkxOTcwLTAxLTAxIDAwOjAwOjAwLjAwMDAwMDAwMCArMDAwMAorKysgZ3J1Yi0wLjk3L25ldGJvb3QvZGV2LmgJMjAwNS0wOC0zMSAxOTowMzozNS4wMDAwMDAwMDAgKzAwMDAKQEAgLTAsMCArMSw4MyBAQAorI2lmbmRlZiBfREVWX0gKKyNkZWZpbmUgX0RFVl9ICisKKyNpbmNsdWRlICJpc2EuaCIKKyNpbmNsdWRlICJwY2kuaCIKKworLyogTmVlZCB0byBjaGVjayB0aGUgcGFja2luZyBvZiB0aGlzIHN0cnVjdCBpZiBFdGhlcmJvb3QgaXMgcG9ydGVkICovCitzdHJ1Y3QgZGV2X2lkCit7CisJdW5zaWduZWQgc2hvcnQJdmVuZG9yX2lkOworCXVuc2lnbmVkIHNob3J0CWRldmljZV9pZDsKKwl1bnNpZ25lZCBjaGFyCWJ1c190eXBlOworI2RlZmluZQlQQ0lfQlVTX1RZUEUJMQorI2RlZmluZQlJU0FfQlVTX1RZUEUJMgorfTsKKworLyogRG9udCB1c2Ugc2l6ZW9mLCB0aGF0IHdpbGwgaW5jbHVkZSB0aGUgcGFkZGluZyAqLworI2RlZmluZQlERVZfSURfU0laRQk4CisKKworc3RydWN0IHBjaV9wcm9iZV9zdGF0ZSAKK3sKKyNpZmRlZiBDT05GSUdfUENJCisJc3RydWN0IHBjaV9kZXZpY2UgZGV2OworCWludCBhZHZhbmNlOworI2Vsc2UKKwlpbnQgZHVtbXk7CisjZW5kaWYKK307CitzdHJ1Y3QgaXNhX3Byb2JlX3N0YXRlCit7CisjaWZkZWYgQ09ORklHX0lTQQorCWNvbnN0IHN0cnVjdCBpc2FfZHJpdmVyICpkcml2ZXI7CisJaW50IGFkdmFuY2U7CisjZWxzZQorCWludCBkdW1teTsKKyNlbmRpZgorfTsKKwordW5pb24gcHJvYmVfc3RhdGUKK3sKKwlzdHJ1Y3QgcGNpX3Byb2JlX3N0YXRlIHBjaTsKKwlzdHJ1Y3QgaXNhX3Byb2JlX3N0YXRlIGlzYTsKK307CisKK3N0cnVjdCBkZXYKK3sKKwl2b2lkCQkoKmRpc2FibGUpUCgoc3RydWN0IGRldiAqKSk7CisJc3RydWN0IGRldl9pZAlkZXZpZDsJLyogZGV2aWNlIElEIHN0cmluZyAoc2VudCB0byBESENQIHNlcnZlcikgKi8KKwlpbnQJCWluZGV4OyAgLyogSW5kZXggb2YgbmV4dCBkZXZpY2Ugb24gdGhpcyBjb250cm9sbGVyIHRvIHByb2JlICovCisJaW50CQl0eXBlOwkJLyogVHlwZSBvZiBkZXZpY2UgSSBhbSBwcm9iaW5nIGZvciAqLworCWludAkJaG93X3Byb2JlOwkvKiBGaXJzdCwgbmV4dCBvciBhd2FrZSAqLworCWludCAJCXRvX3Byb2JlOwkvKiBGbGF2b3Igb2YgZGV2aWNlIEkgYW0gcHJvYmluZyAqLworCWludAkJZmFpbHNhZmU7CS8qIEZhaWxzYWZlIHByb2JlIHJlcXVlc3RlZCAqLworCWludAkJdHlwZV9pbmRleDsJLyogSW5kZXggb2YgdGhpcyBkZXZpY2UgKHdpdGhpbiB0eXBlKSAqLworI2RlZmluZQlQUk9CRV9OT05FIDAKKyNkZWZpbmUgUFJPQkVfUENJICAxCisjZGVmaW5lIFBST0JFX0lTQSAgMgorCXVuaW9uIHByb2JlX3N0YXRlIHN0YXRlOworfTsKKworCisjZGVmaW5lIE5JQ19EUklWRVIgICAgMAorI2RlZmluZSBESVNLX0RSSVZFUiAgIDEKKyNkZWZpbmUgRkxPUFBZX0RSSVZFUiAyCisKKyNkZWZpbmUgQlJJREdFX0RSSVZFUiAxMDAwCisKKyNkZWZpbmUgUFJPQkVfRklSU1QgICgtMSkKKyNkZWZpbmUgUFJPQkVfTkVYVCAgIDAKKyNkZWZpbmUgUFJPQkVfQVdBS0UgIDEJCS8qIEFmdGVyIGNhbGxpbmcgZGlzYWJsZSBicmluZyB1cCB0aGUgc2FtZSBkZXZpY2UgKi8KKworLyogVGhlIHByb2JlIHJlc3VsdCBjb2RlcyBhcmUgc2VsZWN0ZWQKKyAqIHRvIGFsbG93IHRoZW0gdG8gYmUgZmVkIGJhY2sgaW50byB0aGUgcHJvYmUKKyAqIHJvdXRpbmUgYW5kIGdldCBhIHN1Y2Nlc3NmdWwgcHJvYmUuCisgKi8KKyNkZWZpbmUgUFJPQkVfRkFJTEVEIFBST0JFX0ZJUlNUCisjZGVmaW5lIFBST0JFX1dPUktFRCAgUFJPQkVfTkVYVAorCitleHRlcm4gaW50IHByb2JlKHN0cnVjdCBkZXYgKmRldik7CitleHRlcm4gdm9pZCBkaXNhYmxlKHN0cnVjdCBkZXYgKmRldik7CisKKyNlbmRpZiAvKiBfREVWX0ggKi8KZGlmZiAtTmF1ciBncnViLTAuOTcub3JpZy9uZXRib290L2UxMDAwLmMgZ3J1Yi0wLjk3L25ldGJvb3QvZTEwMDAuYwotLS0gZ3J1Yi0wLjk3Lm9yaWcvbmV0Ym9vdC9lMTAwMC5jCTE5NzAtMDEtMDEgMDA6MDA6MDAuMDAwMDAwMDAwICswMDAwCisrKyBncnViLTAuOTcvbmV0Ym9vdC9lMTAwMC5jCTIwMDUtMDgtMzEgMTk6MDM6MzUuMDAwMDAwMDAwICswMDAwCkBAIC0wLDAgKzEsMzY4MiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitFdGhlcmJvb3QgLSAgQk9PVFAvVEZUUCBCb290c3RyYXAgUHJvZ3JhbQorSW50ZXIgUHJvIDEwMDAgZm9yIEV0aGVyYm9vdAorRHJpdmVycyBhcmUgcG9ydCBmcm9tIEludGVsJ3MgTGludXggZHJpdmVyIGUxMDAwLTQuMy4xNQorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgIAorICBDb3B5cmlnaHQoYykgMTk5OSAtIDIwMDMgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgIAorICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCAKKyAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgCisgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgCisgIGFueSBsYXRlciB2ZXJzaW9uLgorICAKKyAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIAorICBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgCisgIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgCisgIG1vcmUgZGV0YWlscy4KKyAgCisgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAgdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IAorICBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4KKyAgCisgIFRoZSBmdWxsIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uIGluIHRoZQorICBmaWxlIGNhbGxlZCBMSUNFTlNFLgorICAKKyAgQ29udGFjdCBJbmZvcm1hdGlvbjoKKyAgTGludXggTklDUyA8bGludXgubmljc0BpbnRlbC5jb20+CisgIEludGVsIENvcnBvcmF0aW9uLCA1MjAwIE4uRS4gRWxhbSBZb3VuZyBQYXJrd2F5LCBIaWxsc2Jvcm8sIE9SIDk3MTI0LTY0OTcKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiAgQ29weXJpZ2h0IChDKSBBcmNod2F5IERpZ2l0YWwgU29sdXRpb25zLgorICoKKyAqICB3cml0dGVuIGJ5IENocnNpdG9waGVyIExpIDxjbGkgYXQgYXJjeXdheSBkb3QgY29tPiBvciA8Y2hyaXNsIGF0IGdudWNoaW5hIGRvdCBvcmc+CisgKiAgMi85LzIwMDIKKyAqCisgKiAgQ29weXJpZ2h0IChDKSBMaW51eCBOZXR3b3J4LgorICogIE1hc3NpdmUgdXBncmFkZSB0byB3b3JrIHdpdGggdGhlIG5ldyBpbnRlbCBnaWdhYml0IE5JQ3MuCisgKiAgPGViaWVkZXJtYW4gYXQgbG54aSBkb3QgY29tPgorICoKKyAqICBTdXBwb3J0IGZvciA4MjU0MWVpICYgODI1NDdlaSBjaGlwcyBmcm9tIEludGVsJ3MgTGludXggZHJpdmVyIDUuMS4xMyBhZGRlZCBieQorICogIEdlb3JnIEJhdW0gPGdiYXVtQHVzZXJzLnNmLm5ldD4sIHNwb25zb3JlZCBieSBQZXRhTWVtIEdtYkggYW5kIGxpbmtMSU5FIENvbW11bmljYXRpb25zLCBJbmMuCisgKgorICogIDAxLzIwMDQ6IFVwZGF0ZWQgdG8gTGludXggZHJpdmVyIDUuMi4yMiBieSBHZW9yZyBCYXVtIDxnYmF1bUB1c2Vycy5zZi5uZXQ+CisgKi8KKworLyogdG8gZ2V0IHNvbWUgZ2xvYmFsIHJvdXRpbmVzIGxpa2UgcHJpbnRmICovCisjaW5jbHVkZSAiZXRoZXJib290LmgiCisvKiB0byBnZXQgdGhlIGludGVyZmFjZSB0byB0aGUgYm9keSBvZiB0aGUgcHJvZ3JhbSAqLworI2luY2x1ZGUgIm5pYy5oIgorLyogdG8gZ2V0IHRoZSBQQ0kgc3VwcG9ydCBmdW5jdGlvbnMsIGlmIHRoaXMgaXMgYSBQQ0kgTklDICovCisjaW5jbHVkZSAicGNpLmgiCisjaW5jbHVkZSAidGltZXIuaCIKKwordHlwZWRlZiB1bnNpZ25lZCBjaGFyICpkbWFfYWRkcl90OworCit0eXBlZGVmIGVudW0geworCUZBTFNFID0gMCwKKwlUUlVFID0gMQorfSBib29sZWFuX3Q7CisKKyNkZWZpbmUgREVCVUcgMAorCisKKy8qIFNvbWUgcGllY2VzIG9mIGNvZGUgYXJlIGRpc2FibGVkIHdpdGggI2lmIDAgLi4uICNlbmRpZi4KKyAqIFRoZXkgYXJlIG5vdCBkZWxldGVkIHRvIHNob3cgd2hlcmUgdGhlIGV0aGVyYm9vdCBkcml2ZXIgZGlmZmVycworICogZnJvbSB0aGUgbGludXggZHJpdmVyIGJlbG93IHRoZSBmdW5jdGlvbiBsZXZlbC4KKyAqIFNvbWUgbWVtYmVyIHZhcmlhYmxlcyBvZiB0aGUgaHcgc3RydWN0IGhhdmUgYmVlbiBlbGltaW5hdGVkCisgKiBhbmQgdGhlIGNvcnJlc3BvbmRpbmcgaW5wbGFjZSBjaGVja3MgaW5zZXJ0ZWQgaW5zdGVhZC4KKyAqIFBpZWNlcyBzdWNoIGFzIExFRCBoYW5kbGluZyB0aGF0IHdlIGRlZmluaXRlbHkgZG9uJ3QgbmVlZCBhcmUgZGVsZXRlZC4KKyAqCisgKiBUaGUgZm9sbG93aW5nIGRlZmluZXMgc2hvdWxkIG5vdCBiZSBuZWVkZWQgbm9ybWFsbHksCisgKiBidXQgbWF5IGJlIGhlbHBmdWwgZm9yIGRlYnVnZ2luZyBwdXJwb3Nlcy4gKi8KKworLyogRGVmaW5lIHRoaXMgaWYgeW91IHdhbnQgdG8gcHJvZ3JhbSB0aGUgdHJhbnNtaXNzaW9uIGNvbnRyb2wgcmVnaXN0ZXIKKyAqIHRoZSB3YXkgdGhlIExpbnV4IGRyaXZlciBkb2VzIGl0LiAqLworI3VuZGVmIExJTlVYX0RSSVZFUl9UQ1RMCisKKy8qIERlZmluZSB0aGlzIHRvIGJlaGF2ZSBtb3JlIGxpa2UgdGhlIExpbnV4IGRyaXZlci4gKi8KKyN1bmRlZiBMSU5VWF9EUklWRVIKKworI2luY2x1ZGUgImUxMDAwX2h3LmgiCisKKy8qIE5JQyBzcGVjaWZpYyBzdGF0aWMgdmFyaWFibGVzIGdvIGhlcmUgKi8KK3N0YXRpYyBzdHJ1Y3QgZTEwMDBfaHcgaHc7CitzdGF0aWMgY2hhciB0eF9wb29sWzEyOCArIDE2XTsKK3N0YXRpYyBjaGFyIHJ4X3Bvb2xbMTI4ICsgMTZdOworc3RhdGljIGNoYXIgcGFja2V0WzIwOTZdOworCitzdGF0aWMgc3RydWN0IGUxMDAwX3R4X2Rlc2MgKnR4X2Jhc2U7CitzdGF0aWMgc3RydWN0IGUxMDAwX3J4X2Rlc2MgKnJ4X2Jhc2U7CisKK3N0YXRpYyBpbnQgdHhfdGFpbDsKK3N0YXRpYyBpbnQgcnhfdGFpbCwgcnhfbGFzdDsKKworLyogRnVuY3Rpb24gZm9yd2FyZCBkZWNsYXJhdGlvbnMgKi8KK3N0YXRpYyBpbnQgZTEwMDBfc2V0dXBfbGluayhzdHJ1Y3QgZTEwMDBfaHcgKmh3KTsKK3N0YXRpYyBpbnQgZTEwMDBfc2V0dXBfZmliZXJfc2VyZGVzX2xpbmsoc3RydWN0IGUxMDAwX2h3ICpodyk7CitzdGF0aWMgaW50IGUxMDAwX3NldHVwX2NvcHBlcl9saW5rKHN0cnVjdCBlMTAwMF9odyAqaHcpOworc3RhdGljIGludCBlMTAwMF9waHlfc2V0dXBfYXV0b25lZyhzdHJ1Y3QgZTEwMDBfaHcgKmh3KTsKK3N0YXRpYyB2b2lkIGUxMDAwX2NvbmZpZ19jb2xsaXNpb25fZGlzdChzdHJ1Y3QgZTEwMDBfaHcgKmh3KTsKK3N0YXRpYyBpbnQgZTEwMDBfY29uZmlnX21hY190b19waHkoc3RydWN0IGUxMDAwX2h3ICpodyk7CitzdGF0aWMgaW50IGUxMDAwX2NvbmZpZ19mY19hZnRlcl9saW5rX3VwKHN0cnVjdCBlMTAwMF9odyAqaHcpOworc3RhdGljIGludCBlMTAwMF9jaGVja19mb3JfbGluayhzdHJ1Y3QgZTEwMDBfaHcgKmh3KTsKK3N0YXRpYyBpbnQgZTEwMDBfd2FpdF9hdXRvbmVnKHN0cnVjdCBlMTAwMF9odyAqaHcpOworc3RhdGljIHZvaWQgZTEwMDBfZ2V0X3NwZWVkX2FuZF9kdXBsZXgoc3RydWN0IGUxMDAwX2h3ICpodywgdWludDE2X3QgKnNwZWVkLCB1aW50MTZfdCAqZHVwbGV4KTsKK3N0YXRpYyBpbnQgZTEwMDBfcmVhZF9waHlfcmVnKHN0cnVjdCBlMTAwMF9odyAqaHcsIHVpbnQzMl90IHJlZ19hZGRyLCB1aW50MTZfdCAqcGh5X2RhdGEpOworc3RhdGljIGludCBlMTAwMF9yZWFkX3BoeV9yZWdfZXgoc3RydWN0IGUxMDAwX2h3ICpodywgdWludDMyX3QgcmVnX2FkZHIsIHVpbnQxNl90ICpwaHlfZGF0YSk7CitzdGF0aWMgaW50IGUxMDAwX3dyaXRlX3BoeV9yZWcoc3RydWN0IGUxMDAwX2h3ICpodywgdWludDMyX3QgcmVnX2FkZHIsIHVpbnQxNl90IHBoeV9kYXRhKTsKK3N0YXRpYyBpbnQgZTEwMDBfd3JpdGVfcGh5X3JlZ19leChzdHJ1Y3QgZTEwMDBfaHcgKmh3LCB1aW50MzJfdCByZWdfYWRkciwgdWludDE2X3QgcGh5X2RhdGEpOworc3RhdGljIHZvaWQgZTEwMDBfcGh5X2h3X3Jlc2V0KHN0cnVjdCBlMTAwMF9odyAqaHcpOworc3RhdGljIGludCBlMTAwMF9waHlfcmVzZXQoc3RydWN0IGUxMDAwX2h3ICpodyk7CitzdGF0aWMgaW50IGUxMDAwX2RldGVjdF9naWdfcGh5KHN0cnVjdCBlMTAwMF9odyAqaHcpOworCisvKiBQcmludGluZyBtYWNyb3MuLi4gKi8KKworI2RlZmluZSBFMTAwMF9FUlIoYXJncy4uLikgcHJpbnRmKCJlMTAwMDogIiBhcmdzKQorCisjaWYgREVCVUcgPj0gMworI2RlZmluZSBFMTAwMF9EQkcoYXJncy4uLikgcHJpbnRmKCJlMTAwMDogIiBhcmdzKQorI2Vsc2UKKyNkZWZpbmUgRTEwMDBfREJHKGFyZ3MuLi4pCisjZW5kaWYKKworI2RlZmluZSBNU0dPVVQoUywgQSwgQikgICAgIHByaW50ayhTICJcbiIsIEEsIEIpCisjaWYgREVCVUcgPj0gMgorI2RlZmluZSBERUJVR0ZVTkMoRikgICAgICAgIERFQlVHT1VUKEYgIlxuIik7CisjZWxzZQorI2RlZmluZSBERUJVR0ZVTkMoRikKKyNlbmRpZgorI2lmIERFQlVHID49IDEKKyNkZWZpbmUgREVCVUdPVVQoUykgcHJpbnRmKFMpCisjZGVmaW5lIERFQlVHT1VUMShTLEEpIHByaW50ZihTLEEpCisjZGVmaW5lIERFQlVHT1VUMihTLEEsQikgcHJpbnRmKFMsQSxCKQorI2RlZmluZSBERUJVR09VVDMoUyxBLEIsQykgcHJpbnRmKFMsQSxCLEMpCisjZGVmaW5lIERFQlVHT1VUNyhTLEEsQixDLEQsRSxGLEcpIHByaW50ZihTLEEsQixDLEQsRSxGLEcpCisjZWxzZQorI2RlZmluZSBERUJVR09VVChTKQorI2RlZmluZSBERUJVR09VVDEoUyxBKQorI2RlZmluZSBERUJVR09VVDIoUyxBLEIpCisjZGVmaW5lIERFQlVHT1VUMyhTLEEsQixDKQorI2RlZmluZSBERUJVR09VVDcoUyxBLEIsQyxELEUsRixHKQorI2VuZGlmCisKKyNkZWZpbmUgRTEwMDBfV1JJVEVfUkVHKGEsIHJlZywgdmFsdWUpICggXAorICAgICgoYSktPm1hY190eXBlID49IGUxMDAwXzgyNTQzKSA/IFwKKyAgICAgICAgKHdyaXRlbCgodmFsdWUpLCAoKGEpLT5od19hZGRyICsgRTEwMDBfIyNyZWcpKSkgOiBcCisgICAgICAgICh3cml0ZWwoKHZhbHVlKSwgKChhKS0+aHdfYWRkciArIEUxMDAwXzgyNTQyXyMjcmVnKSkpKQorCisjZGVmaW5lIEUxMDAwX1JFQURfUkVHKGEsIHJlZykgKCBcCisgICAgKChhKS0+bWFjX3R5cGUgPj0gZTEwMDBfODI1NDMpID8gXAorICAgICAgICByZWFkbCgoYSktPmh3X2FkZHIgKyBFMTAwMF8jI3JlZykgOiBcCisgICAgICAgIHJlYWRsKChhKS0+aHdfYWRkciArIEUxMDAwXzgyNTQyXyMjcmVnKSkKKworI2RlZmluZSBFMTAwMF9XUklURV9SRUdfQVJSQVkoYSwgcmVnLCBvZmZzZXQsIHZhbHVlKSAoIFwKKyAgICAoKGEpLT5tYWNfdHlwZSA+PSBlMTAwMF84MjU0MykgPyBcCisgICAgICAgIHdyaXRlbCgodmFsdWUpLCAoKGEpLT5od19hZGRyICsgRTEwMDBfIyNyZWcgKyAoKG9mZnNldCkgPDwgMikpKSA6IFwKKyAgICAgICAgd3JpdGVsKCh2YWx1ZSksICgoYSktPmh3X2FkZHIgKyBFMTAwMF84MjU0Ml8jI3JlZyArICgob2Zmc2V0KSA8PCAyKSkpKQorCisjZGVmaW5lIEUxMDAwX1JFQURfUkVHX0FSUkFZKGEsIHJlZywgb2Zmc2V0KSAoIFwKKyAgICAoKGEpLT5tYWNfdHlwZSA+PSBlMTAwMF84MjU0MykgPyBcCisgICAgICAgIHJlYWRsKChhKS0+aHdfYWRkciArIEUxMDAwXyMjcmVnICsgKChvZmZzZXQpIDw8IDIpKSA6IFwKKyAgICAgICAgcmVhZGwoKGEpLT5od19hZGRyICsgRTEwMDBfODI1NDJfIyNyZWcgKyAoKG9mZnNldCkgPDwgMikpKQorCisjZGVmaW5lIEUxMDAwX1dSSVRFX0ZMVVNIKGEpIHt1aW50MzJfdCB4OyB4ID0gRTEwMDBfUkVBRF9SRUcoYSwgU1RBVFVTKTt9CisKK3VpbnQzMl90CitlMTAwMF9pb19yZWFkKHN0cnVjdCBlMTAwMF9odyAqaHcgX191bnVzZWQsIHVpbnQzMl90IHBvcnQpCit7CisgICAgICAgIHJldHVybiBpbmwocG9ydCk7Cit9CisKK3ZvaWQKK2UxMDAwX2lvX3dyaXRlKHN0cnVjdCBlMTAwMF9odyAqaHcgX191bnVzZWQsIHVpbnQzMl90IHBvcnQsIHVpbnQzMl90IHZhbHVlKQoreworICAgICAgICBvdXRsKHZhbHVlLCBwb3J0KTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGUxMDAwX3BjaV9zZXRfbXdpKHN0cnVjdCBlMTAwMF9odyAqaHcpCit7CisJcGNpX3dyaXRlX2NvbmZpZ193b3JkKGh3LT5wZGV2LCBQQ0lfQ09NTUFORCwgaHctPnBjaV9jbWRfd29yZCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBlMTAwMF9wY2lfY2xlYXJfbXdpKHN0cnVjdCBlMTAwMF9odyAqaHcpCit7CisJcGNpX3dyaXRlX2NvbmZpZ193b3JkKGh3LT5wZGV2LCBQQ0lfQ09NTUFORCwKKwkJCSAgICAgIGh3LT5wY2lfY21kX3dvcmQgJiB+UENJX0NPTU1BTkRfSU5WQUxJREFURSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJhaXNlcyB0aGUgRUVQUk9NJ3MgY2xvY2sgaW5wdXQuCisgKgorICogaHcgLSBTdHJ1Y3QgY29udGFpbmluZyB2YXJpYWJsZXMgYWNjZXNzZWQgYnkgc2hhcmVkIGNvZGUKKyAqIGVlY2QgLSBFRUNEJ3MgY3VycmVudCB2YWx1ZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQKK2UxMDAwX3JhaXNlX2VlX2NsayhzdHJ1Y3QgZTEwMDBfaHcgKmh3LAorICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICplZWNkKQoreworCS8qIFJhaXNlIHRoZSBjbG9jayBpbnB1dCB0byB0aGUgRUVQUk9NIChieSBzZXR0aW5nIHRoZSBTSyBiaXQpLCBhbmQgdGhlbgorCSAqIHdhaXQgPGRlbGF5PiBtaWNyb3NlY29uZHMuCisJICovCisJKmVlY2QgPSAqZWVjZCB8IEUxMDAwX0VFQ0RfU0s7CisJRTEwMDBfV1JJVEVfUkVHKGh3LCBFRUNELCAqZWVjZCk7CisJRTEwMDBfV1JJVEVfRkxVU0goaHcpOworCXVkZWxheShody0+ZWVwcm9tLmRlbGF5X3VzZWMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBMb3dlcnMgdGhlIEVFUFJPTSdzIGNsb2NrIGlucHV0LgorICoKKyAqIGh3IC0gU3RydWN0IGNvbnRhaW5pbmcgdmFyaWFibGVzIGFjY2Vzc2VkIGJ5IHNoYXJlZCBjb2RlIAorICogZWVjZCAtIEVFQ0QncyBjdXJyZW50IHZhbHVlCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZAorZTEwMDBfbG93ZXJfZWVfY2xrKHN0cnVjdCBlMTAwMF9odyAqaHcsCisgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKmVlY2QpCit7CisJLyogTG93ZXIgdGhlIGNsb2NrIGlucHV0IHRvIHRoZSBFRVBST00gKGJ5IGNsZWFyaW5nIHRoZSBTSyBiaXQpLCBhbmQgdGhlbiAKKwkgKiB3YWl0IDUwIG1pY3Jvc2Vjb25kcy4gCisJICovCisJKmVlY2QgPSAqZWVjZCAmIH5FMTAwMF9FRUNEX1NLOworCUUxMDAwX1dSSVRFX1JFRyhodywgRUVDRCwgKmVlY2QpOworCUUxMDAwX1dSSVRFX0ZMVVNIKGh3KTsKKwl1ZGVsYXkoaHctPmVlcHJvbS5kZWxheV91c2VjKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogU2hpZnQgZGF0YSBiaXRzIG91dCB0byB0aGUgRUVQUk9NLgorICoKKyAqIGh3IC0gU3RydWN0IGNvbnRhaW5pbmcgdmFyaWFibGVzIGFjY2Vzc2VkIGJ5IHNoYXJlZCBjb2RlCisgKiBkYXRhIC0gZGF0YSB0byBzZW5kIHRvIHRoZSBFRVBST00KKyAqIGNvdW50IC0gbnVtYmVyIG9mIGJpdHMgdG8gc2hpZnQgb3V0CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZAorZTEwMDBfc2hpZnRfb3V0X2VlX2JpdHMoc3RydWN0IGUxMDAwX2h3ICpodywKKyAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBjb3VudCkKK3sKKwlzdHJ1Y3QgZTEwMDBfZWVwcm9tX2luZm8gKmVlcHJvbSA9ICZody0+ZWVwcm9tOworCXVpbnQzMl90IGVlY2Q7CisJdWludDMyX3QgbWFzazsKKwkKKwkvKiBXZSBuZWVkIHRvIHNoaWZ0ICJjb3VudCIgYml0cyBvdXQgdG8gdGhlIEVFUFJPTS4gU28sIHZhbHVlIGluIHRoZQorCSAqICJkYXRhIiBwYXJhbWV0ZXIgd2lsbCBiZSBzaGlmdGVkIG91dCB0byB0aGUgRUVQUk9NIG9uZSBiaXQgYXQgYSB0aW1lLgorCSAqIEluIG9yZGVyIHRvIGRvIHRoaXMsICJkYXRhIiBtdXN0IGJlIGJyb2tlbiBkb3duIGludG8gYml0cy4gCisJICovCisJbWFzayA9IDB4MDEgPDwgKGNvdW50IC0gMSk7CisJZWVjZCA9IEUxMDAwX1JFQURfUkVHKGh3LCBFRUNEKTsKKwlpZiAoZWVwcm9tLT50eXBlID09IGUxMDAwX2VlcHJvbV9taWNyb3dpcmUpIHsKKwkJZWVjZCAmPSB+RTEwMDBfRUVDRF9ETzsKKwl9IGVsc2UgaWYgKGVlcHJvbS0+dHlwZSA9PSBlMTAwMF9lZXByb21fc3BpKSB7CisJCWVlY2QgfD0gRTEwMDBfRUVDRF9ETzsKKwl9CisJZG8geworCQkvKiBBICIxIiBpcyBzaGlmdGVkIG91dCB0byB0aGUgRUVQUk9NIGJ5IHNldHRpbmcgYml0ICJESSIgdG8gYSAiMSIsCisJCSAqIGFuZCB0aGVuIHJhaXNpbmcgYW5kIHRoZW4gbG93ZXJpbmcgdGhlIGNsb2NrICh0aGUgU0sgYml0IGNvbnRyb2xzCisJCSAqIHRoZSBjbG9jayBpbnB1dCB0byB0aGUgRUVQUk9NKS4gIEEgIjAiIGlzIHNoaWZ0ZWQgb3V0IHRvIHRoZSBFRVBST00KKwkJICogYnkgc2V0dGluZyAiREkiIHRvICIwIiBhbmQgdGhlbiByYWlzaW5nIGFuZCB0aGVuIGxvd2VyaW5nIHRoZSBjbG9jay4KKwkJICovCisJCWVlY2QgJj0gfkUxMDAwX0VFQ0RfREk7CisJCQorCQlpZihkYXRhICYgbWFzaykKKwkJCWVlY2QgfD0gRTEwMDBfRUVDRF9ESTsKKwkJCisJCUUxMDAwX1dSSVRFX1JFRyhodywgRUVDRCwgZWVjZCk7CisJCUUxMDAwX1dSSVRFX0ZMVVNIKGh3KTsKKwkJCisJCXVkZWxheShlZXByb20tPmRlbGF5X3VzZWMpOworCQkKKwkJZTEwMDBfcmFpc2VfZWVfY2xrKGh3LCAmZWVjZCk7CisJCWUxMDAwX2xvd2VyX2VlX2NsayhodywgJmVlY2QpOworCQkKKwkJbWFzayA9IG1hc2sgPj4gMTsKKwkJCisJfSB3aGlsZShtYXNrKTsKKworCS8qIFdlIGxlYXZlIHRoZSAiREkiIGJpdCBzZXQgdG8gIjAiIHdoZW4gd2UgbGVhdmUgdGhpcyByb3V0aW5lLiAqLworCWVlY2QgJj0gfkUxMDAwX0VFQ0RfREk7CisJRTEwMDBfV1JJVEVfUkVHKGh3LCBFRUNELCBlZWNkKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogU2hpZnQgZGF0YSBiaXRzIGluIGZyb20gdGhlIEVFUFJPTQorICoKKyAqIGh3IC0gU3RydWN0IGNvbnRhaW5pbmcgdmFyaWFibGVzIGFjY2Vzc2VkIGJ5IHNoYXJlZCBjb2RlCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdWludDE2X3QKK2UxMDAwX3NoaWZ0X2luX2VlX2JpdHMoc3RydWN0IGUxMDAwX2h3ICpodywKKyAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgY291bnQpCit7CisJdWludDMyX3QgZWVjZDsKKwl1aW50MzJfdCBpOworCXVpbnQxNl90IGRhdGE7CisJCisJLyogSW4gb3JkZXIgdG8gcmVhZCBhIHJlZ2lzdGVyIGZyb20gdGhlIEVFUFJPTSwgd2UgbmVlZCB0byBzaGlmdCAnY291bnQnIAorCSAqIGJpdHMgaW4gZnJvbSB0aGUgRUVQUk9NLiBCaXRzIGFyZSAic2hpZnRlZCBpbiIgYnkgcmFpc2luZyB0aGUgY2xvY2sKKwkgKiBpbnB1dCB0byB0aGUgRUVQUk9NIChzZXR0aW5nIHRoZSBTSyBiaXQpLCBhbmQgdGhlbiByZWFkaW5nIHRoZSB2YWx1ZSBvZgorCSAqIHRoZSAiRE8iIGJpdC4gIER1cmluZyB0aGlzICJzaGlmdGluZyBpbiIgcHJvY2VzcyB0aGUgIkRJIiBiaXQgc2hvdWxkCisJICogYWx3YXlzIGJlIGNsZWFyLgorCSAqLworCQorCWVlY2QgPSBFMTAwMF9SRUFEX1JFRyhodywgRUVDRCk7CisJCisJZWVjZCAmPSB+KEUxMDAwX0VFQ0RfRE8gfCBFMTAwMF9FRUNEX0RJKTsKKwlkYXRhID0gMDsKKwkKKwlmb3IoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisJCWRhdGEgPSBkYXRhIDw8IDE7CisJCWUxMDAwX3JhaXNlX2VlX2NsayhodywgJmVlY2QpOworCQkKKwkJZWVjZCA9IEUxMDAwX1JFQURfUkVHKGh3LCBFRUNEKTsKKwkJCisJCWVlY2QgJj0gfihFMTAwMF9FRUNEX0RJKTsKKwkJaWYoZWVjZCAmIEUxMDAwX0VFQ0RfRE8pCisJCQlkYXRhIHw9IDE7CisJCQorCQllMTAwMF9sb3dlcl9lZV9jbGsoaHcsICZlZWNkKTsKKwl9CisJCisJcmV0dXJuIGRhdGE7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFByZXBhcmVzIEVFUFJPTSBmb3IgYWNjZXNzCisgKgorICogaHcgLSBTdHJ1Y3QgY29udGFpbmluZyB2YXJpYWJsZXMgYWNjZXNzZWQgYnkgc2hhcmVkIGNvZGUKKyAqCisgKiBMb3dlcnMgRUVQUk9NIGNsb2NrLiBDbGVhcnMgaW5wdXQgcGluLiBTZXRzIHRoZSBjaGlwIHNlbGVjdCBwaW4uIFRoaXMgCisgKiBmdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkIGJlZm9yZSBpc3N1aW5nIGEgY29tbWFuZCB0byB0aGUgRUVQUk9NLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludDMyX3QKK2UxMDAwX2FjcXVpcmVfZWVwcm9tKHN0cnVjdCBlMTAwMF9odyAqaHcpCit7CisJc3RydWN0IGUxMDAwX2VlcHJvbV9pbmZvICplZXByb20gPSAmaHctPmVlcHJvbTsKKwl1aW50MzJfdCBlZWNkLCBpPTA7CisKKwllZWNkID0gRTEwMDBfUkVBRF9SRUcoaHcsIEVFQ0QpOworCisJLyogUmVxdWVzdCBFRVBST00gQWNjZXNzICovCisJaWYoaHctPm1hY190eXBlID4gZTEwMDBfODI1NDQpIHsKKwkJZWVjZCB8PSBFMTAwMF9FRUNEX1JFUTsKKwkJRTEwMDBfV1JJVEVfUkVHKGh3LCBFRUNELCBlZWNkKTsKKwkJZWVjZCA9IEUxMDAwX1JFQURfUkVHKGh3LCBFRUNEKTsKKwkJd2hpbGUoKCEoZWVjZCAmIEUxMDAwX0VFQ0RfR05UKSkgJiYKKwkJICAgICAgKGkgPCBFMTAwMF9FRVBST01fR1JBTlRfQVRURU1QVFMpKSB7CisJCQlpKys7CisJCQl1ZGVsYXkoNSk7CisJCQllZWNkID0gRTEwMDBfUkVBRF9SRUcoaHcsIEVFQ0QpOworCQl9CisJCWlmKCEoZWVjZCAmIEUxMDAwX0VFQ0RfR05UKSkgeworCQkJZWVjZCAmPSB+RTEwMDBfRUVDRF9SRVE7CisJCQlFMTAwMF9XUklURV9SRUcoaHcsIEVFQ0QsIGVlY2QpOworCQkJREVCVUdPVVQoIkNvdWxkIG5vdCBhY3F1aXJlIEVFUFJPTSBncmFudFxuIik7CisJCQlyZXR1cm4gLUUxMDAwX0VSUl9FRVBST007CisJCX0KKwl9CisKKwkvKiBTZXR1cCBFRVBST00gZm9yIFJlYWQvV3JpdGUgKi8KKworCWlmIChlZXByb20tPnR5cGUgPT0gZTEwMDBfZWVwcm9tX21pY3Jvd2lyZSkgeworCQkvKiBDbGVhciBTSyBhbmQgREkgKi8KKwkJZWVjZCAmPSB+KEUxMDAwX0VFQ0RfREkgfCBFMTAwMF9FRUNEX1NLKTsKKwkJRTEwMDBfV1JJVEVfUkVHKGh3LCBFRUNELCBlZWNkKTsKKworCQkvKiBTZXQgQ1MgKi8KKwkJZWVjZCB8PSBFMTAwMF9FRUNEX0NTOworCQlFMTAwMF9XUklURV9SRUcoaHcsIEVFQ0QsIGVlY2QpOworCX0gZWxzZSBpZiAoZWVwcm9tLT50eXBlID09IGUxMDAwX2VlcHJvbV9zcGkpIHsKKwkJLyogQ2xlYXIgU0sgYW5kIENTICovCisJCWVlY2QgJj0gfihFMTAwMF9FRUNEX0NTIHwgRTEwMDBfRUVDRF9TSyk7CisJCUUxMDAwX1dSSVRFX1JFRyhodywgRUVDRCwgZWVjZCk7CisJCXVkZWxheSgxKTsKKwl9CisKKwlyZXR1cm4gRTEwMDBfU1VDQ0VTUzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUmV0dXJucyBFRVBST00gdG8gYSAic3RhbmRieSIgc3RhdGUKKyAqIAorICogaHcgLSBTdHJ1Y3QgY29udGFpbmluZyB2YXJpYWJsZXMgYWNjZXNzZWQgYnkgc2hhcmVkIGNvZGUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkCitlMTAwMF9zdGFuZGJ5X2VlcHJvbShzdHJ1Y3QgZTEwMDBfaHcgKmh3KQoreworCXN0cnVjdCBlMTAwMF9lZXByb21faW5mbyAqZWVwcm9tID0gJmh3LT5lZXByb207CisJdWludDMyX3QgZWVjZDsKKwkKKwllZWNkID0gRTEwMDBfUkVBRF9SRUcoaHcsIEVFQ0QpOworCisJaWYoZWVwcm9tLT50eXBlID09IGUxMDAwX2VlcHJvbV9taWNyb3dpcmUpIHsKKworCQkvKiBEZXNlbGVjdCBFRVBST00gKi8KKwkJZWVjZCAmPSB+KEUxMDAwX0VFQ0RfQ1MgfCBFMTAwMF9FRUNEX1NLKTsKKwkJRTEwMDBfV1JJVEVfUkVHKGh3LCBFRUNELCBlZWNkKTsKKwkJRTEwMDBfV1JJVEVfRkxVU0goaHcpOworCQl1ZGVsYXkoZWVwcm9tLT5kZWxheV91c2VjKTsKKwkKKwkJLyogQ2xvY2sgaGlnaCAqLworCQllZWNkIHw9IEUxMDAwX0VFQ0RfU0s7CisJCUUxMDAwX1dSSVRFX1JFRyhodywgRUVDRCwgZWVjZCk7CisJCUUxMDAwX1dSSVRFX0ZMVVNIKGh3KTsKKwkJdWRlbGF5KGVlcHJvbS0+ZGVsYXlfdXNlYyk7CisJCisJCS8qIFNlbGVjdCBFRVBST00gKi8KKwkJZWVjZCB8PSBFMTAwMF9FRUNEX0NTOworCQlFMTAwMF9XUklURV9SRUcoaHcsIEVFQ0QsIGVlY2QpOworCQlFMTAwMF9XUklURV9GTFVTSChodyk7CisJCXVkZWxheShlZXByb20tPmRlbGF5X3VzZWMpOworCisJCS8qIENsb2NrIGxvdyAqLworCQllZWNkICY9IH5FMTAwMF9FRUNEX1NLOworCQlFMTAwMF9XUklURV9SRUcoaHcsIEVFQ0QsIGVlY2QpOworCQlFMTAwMF9XUklURV9GTFVTSChodyk7CisJCXVkZWxheShlZXByb20tPmRlbGF5X3VzZWMpOworCX0gZWxzZSBpZihlZXByb20tPnR5cGUgPT0gZTEwMDBfZWVwcm9tX3NwaSkgeworCQkvKiBUb2dnbGUgQ1MgdG8gZmx1c2ggY29tbWFuZHMgKi8KKwkJZWVjZCB8PSBFMTAwMF9FRUNEX0NTOworCQlFMTAwMF9XUklURV9SRUcoaHcsIEVFQ0QsIGVlY2QpOworCQlFMTAwMF9XUklURV9GTFVTSChodyk7CisJCXVkZWxheShlZXByb20tPmRlbGF5X3VzZWMpOworCQllZWNkICY9IH5FMTAwMF9FRUNEX0NTOworCQlFMTAwMF9XUklURV9SRUcoaHcsIEVFQ0QsIGVlY2QpOworCQlFMTAwMF9XUklURV9GTFVTSChodyk7CisJCXVkZWxheShlZXByb20tPmRlbGF5X3VzZWMpOworCX0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogVGVybWluYXRlcyBhIGNvbW1hbmQgYnkgaW52ZXJ0aW5nIHRoZSBFRVBST00ncyBjaGlwIHNlbGVjdCBwaW4KKyAqCisgKiBodyAtIFN0cnVjdCBjb250YWluaW5nIHZhcmlhYmxlcyBhY2Nlc3NlZCBieSBzaGFyZWQgY29kZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQKK2UxMDAwX3JlbGVhc2VfZWVwcm9tKHN0cnVjdCBlMTAwMF9odyAqaHcpCit7CisJdWludDMyX3QgZWVjZDsKKworCWVlY2QgPSBFMTAwMF9SRUFEX1JFRyhodywgRUVDRCk7CisKKwlpZiAoaHctPmVlcHJvbS50eXBlID09IGUxMDAwX2VlcHJvbV9zcGkpIHsKKwkJZWVjZCB8PSBFMTAwMF9FRUNEX0NTOyAgLyogUHVsbCBDUyBoaWdoICovCisJCWVlY2QgJj0gfkUxMDAwX0VFQ0RfU0s7IC8qIExvd2VyIFNDSyAqLworCisJCUUxMDAwX1dSSVRFX1JFRyhodywgRUVDRCwgZWVjZCk7CisKKwkJdWRlbGF5KGh3LT5lZXByb20uZGVsYXlfdXNlYyk7CisJfSBlbHNlIGlmKGh3LT5lZXByb20udHlwZSA9PSBlMTAwMF9lZXByb21fbWljcm93aXJlKSB7CisJCS8qIGNsZWFudXAgZWVwcm9tICovCisKKwkJLyogQ1Mgb24gTWljcm93aXJlIGlzIGFjdGl2ZS1oaWdoICovCisJCWVlY2QgJj0gfihFMTAwMF9FRUNEX0NTIHwgRTEwMDBfRUVDRF9ESSk7CisKKwkJRTEwMDBfV1JJVEVfUkVHKGh3LCBFRUNELCBlZWNkKTsKKworCQkvKiBSaXNpbmcgZWRnZSBvZiBjbG9jayAqLworCQllZWNkIHw9IEUxMDAwX0VFQ0RfU0s7CisJCUUxMDAwX1dSSVRFX1JFRyhodywgRUVDRCwgZWVjZCk7CisJCUUxMDAwX1dSSVRFX0ZMVVNIKGh3KTsKKwkJdWRlbGF5KGh3LT5lZXByb20uZGVsYXlfdXNlYyk7CisKKwkJLyogRmFsbGluZyBlZGdlIG9mIGNsb2NrICovCisJCWVlY2QgJj0gfkUxMDAwX0VFQ0RfU0s7CisJCUUxMDAwX1dSSVRFX1JFRyhodywgRUVDRCwgZWVjZCk7CisJCUUxMDAwX1dSSVRFX0ZMVVNIKGh3KTsKKwkJdWRlbGF5KGh3LT5lZXByb20uZGVsYXlfdXNlYyk7CisJfQorCisJLyogU3RvcCByZXF1ZXN0aW5nIEVFUFJPTSBhY2Nlc3MgKi8KKwlpZihody0+bWFjX3R5cGUgPiBlMTAwMF84MjU0NCkgeworCQllZWNkICY9IH5FMTAwMF9FRUNEX1JFUTsKKwkJRTEwMDBfV1JJVEVfUkVHKGh3LCBFRUNELCBlZWNkKTsKKwl9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJlYWRzIGEgMTYgYml0IHdvcmQgZnJvbSB0aGUgRUVQUk9NLgorICoKKyAqIGh3IC0gU3RydWN0IGNvbnRhaW5pbmcgdmFyaWFibGVzIGFjY2Vzc2VkIGJ5IHNoYXJlZCBjb2RlCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50MzJfdAorZTEwMDBfc3BpX2VlcHJvbV9yZWFkeShzdHJ1Y3QgZTEwMDBfaHcgKmh3KQoreworCXVpbnQxNl90IHJldHJ5X2NvdW50ID0gMDsKKwl1aW50OF90IHNwaV9zdGF0X3JlZzsKKworCS8qIFJlYWQgIlN0YXR1cyBSZWdpc3RlciIgcmVwZWF0ZWRseSB1bnRpbCB0aGUgTFNCIGlzIGNsZWFyZWQuICBUaGUKKwkgKiBFRVBST00gd2lsbCBzaWduYWwgdGhhdCB0aGUgY29tbWFuZCBoYXMgYmVlbiBjb21wbGV0ZWQgYnkgY2xlYXJpbmcKKwkgKiBiaXQgMCBvZiB0aGUgaW50ZXJuYWwgc3RhdHVzIHJlZ2lzdGVyLiAgSWYgaXQncyBub3QgY2xlYXJlZCB3aXRoaW4KKwkgKiA1IG1pbGxpc2Vjb25kcywgdGhlbiBlcnJvciBvdXQuCisJICovCisJcmV0cnlfY291bnQgPSAwOworCWRvIHsKKwkJZTEwMDBfc2hpZnRfb3V0X2VlX2JpdHMoaHcsIEVFUFJPTV9SRFNSX09QQ09ERV9TUEksCisJCWh3LT5lZXByb20ub3Bjb2RlX2JpdHMpOworCQlzcGlfc3RhdF9yZWcgPSAodWludDhfdCllMTAwMF9zaGlmdF9pbl9lZV9iaXRzKGh3LCA4KTsKKwkJaWYgKCEoc3BpX3N0YXRfcmVnICYgRUVQUk9NX1NUQVRVU19SRFlfU1BJKSkKKwkJCWJyZWFrOworCisJCXVkZWxheSg1KTsKKwkJcmV0cnlfY291bnQgKz0gNTsKKworCX0gd2hpbGUocmV0cnlfY291bnQgPCBFRVBST01fTUFYX1JFVFJZX1NQSSk7CisKKwkvKiBBVE1FTCBTUEkgd3JpdGUgdGltZSBjb3VsZCB2YXJ5IGZyb20gMC0yMG1TZWMgb24gMy4zViBkZXZpY2VzIChhbmQKKwkgKiBvbmx5IDAtNW1TZWMgb24gNVYgZGV2aWNlcykKKwkgKi8KKwlpZihyZXRyeV9jb3VudCA+PSBFRVBST01fTUFYX1JFVFJZX1NQSSkgeworCQlERUJVR09VVCgiU1BJIEVFUFJPTSBTdGF0dXMgZXJyb3JcbiIpOworCQlyZXR1cm4gLUUxMDAwX0VSUl9FRVBST007CisJfQorCisJcmV0dXJuIEUxMDAwX1NVQ0NFU1M7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJlYWRzIGEgMTYgYml0IHdvcmQgZnJvbSB0aGUgRUVQUk9NLgorICoKKyAqIGh3IC0gU3RydWN0IGNvbnRhaW5pbmcgdmFyaWFibGVzIGFjY2Vzc2VkIGJ5IHNoYXJlZCBjb2RlCisgKiBvZmZzZXQgLSBvZmZzZXQgb2YgIHdvcmQgaW4gdGhlIEVFUFJPTSB0byByZWFkCisgKiBkYXRhIC0gd29yZCByZWFkIGZyb20gdGhlIEVFUFJPTQorICogd29yZHMgLSBudW1iZXIgb2Ygd29yZHMgdG8gcmVhZAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludAorZTEwMDBfcmVhZF9lZXByb20oc3RydWN0IGUxMDAwX2h3ICpodywKKyAgICAgICAgICAgICAgICAgIHVpbnQxNl90IG9mZnNldCwKKwkJICB1aW50MTZfdCB3b3JkcywKKyAgICAgICAgICAgICAgICAgIHVpbnQxNl90ICpkYXRhKQoreworCXN0cnVjdCBlMTAwMF9lZXByb21faW5mbyAqZWVwcm9tID0gJmh3LT5lZXByb207CisJdWludDMyX3QgaSA9IDA7CisJCisJREVCVUdGVU5DKCJlMTAwMF9yZWFkX2VlcHJvbSIpOworCisJLyogQSBjaGVjayBmb3IgaW52YWxpZCB2YWx1ZXM6ICBvZmZzZXQgdG9vIGxhcmdlLCB0b28gbWFueSB3b3JkcywgYW5kIG5vdAorCSAqIGVub3VnaCB3b3Jkcy4KKwkgKi8KKwlpZigob2Zmc2V0ID4gZWVwcm9tLT53b3JkX3NpemUpIHx8ICh3b3JkcyA+IGVlcHJvbS0+d29yZF9zaXplIC0gb2Zmc2V0KSB8fAorCSAgICh3b3JkcyA9PSAwKSkgeworCQlERUJVR09VVCgiXCJ3b3Jkc1wiIHBhcmFtZXRlciBvdXQgb2YgYm91bmRzXG4iKTsKKwkJcmV0dXJuIC1FMTAwMF9FUlJfRUVQUk9NOworCX0KKworCS8qICBQcmVwYXJlIHRoZSBFRVBST00gZm9yIHJlYWRpbmcgICovCisJaWYoZTEwMDBfYWNxdWlyZV9lZXByb20oaHcpICE9IEUxMDAwX1NVQ0NFU1MpCisJCXJldHVybiAtRTEwMDBfRVJSX0VFUFJPTTsKKworCWlmKGVlcHJvbS0+dHlwZSA9PSBlMTAwMF9lZXByb21fc3BpKSB7CisJCXVpbnQxNl90IHdvcmRfaW47CisJCXVpbnQ4X3QgcmVhZF9vcGNvZGUgPSBFRVBST01fUkVBRF9PUENPREVfU1BJOworCisJCWlmKGUxMDAwX3NwaV9lZXByb21fcmVhZHkoaHcpKSB7CisJCQllMTAwMF9yZWxlYXNlX2VlcHJvbShodyk7CisJCQlyZXR1cm4gLUUxMDAwX0VSUl9FRVBST007CisJCX0KKworCQllMTAwMF9zdGFuZGJ5X2VlcHJvbShodyk7CisKKwkJLyogU29tZSBTUEkgZWVwcm9tcyB1c2UgdGhlIDh0aCBhZGRyZXNzIGJpdCBlbWJlZGRlZCBpbiB0aGUgb3Bjb2RlICovCisJCWlmKChlZXByb20tPmFkZHJlc3NfYml0cyA9PSA4KSAmJiAob2Zmc2V0ID49IDEyOCkpCisJCQlyZWFkX29wY29kZSB8PSBFRVBST01fQThfT1BDT0RFX1NQSTsKKworCQkvKiBTZW5kIHRoZSBSRUFEIGNvbW1hbmQgKG9wY29kZSArIGFkZHIpICAqLworCQllMTAwMF9zaGlmdF9vdXRfZWVfYml0cyhodywgcmVhZF9vcGNvZGUsIGVlcHJvbS0+b3Bjb2RlX2JpdHMpOworCQllMTAwMF9zaGlmdF9vdXRfZWVfYml0cyhodywgKHVpbnQxNl90KShvZmZzZXQqMiksIGVlcHJvbS0+YWRkcmVzc19iaXRzKTsKKworCQkvKiBSZWFkIHRoZSBkYXRhLiAgVGhlIGFkZHJlc3Mgb2YgdGhlIGVlcHJvbSBpbnRlcm5hbGx5IGluY3JlbWVudHMgd2l0aAorCQkgKiBlYWNoIGJ5dGUgKHNwaSkgYmVpbmcgcmVhZCwgc2F2aW5nIG9uIHRoZSBvdmVyaGVhZCBvZiBlZXByb20gc2V0dXAKKwkJICogYW5kIHRlYXItZG93bi4gIFRoZSBhZGRyZXNzIGNvdW50ZXIgd2lsbCByb2xsIG92ZXIgaWYgcmVhZGluZyBiZXlvbmQKKwkJICogdGhlIHNpemUgb2YgdGhlIGVlcHJvbSwgdGh1cyBhbGxvd2luZyB0aGUgZW50aXJlIG1lbW9yeSB0byBiZSByZWFkCisJCSAqIHN0YXJ0aW5nIGZyb20gYW55IG9mZnNldC4gKi8KKwkJZm9yIChpID0gMDsgaSA8IHdvcmRzOyBpKyspIHsKKwkJCXdvcmRfaW4gPSBlMTAwMF9zaGlmdF9pbl9lZV9iaXRzKGh3LCAxNik7CisJCQlkYXRhW2ldID0gKHdvcmRfaW4gPj4gOCkgfCAod29yZF9pbiA8PCA4KTsKKwkJfQorCX0gZWxzZSBpZihlZXByb20tPnR5cGUgPT0gZTEwMDBfZWVwcm9tX21pY3Jvd2lyZSkgeworCQlmb3IgKGkgPSAwOyBpIDwgd29yZHM7IGkrKykgeworCQkJLyogIFNlbmQgdGhlIFJFQUQgY29tbWFuZCAob3Bjb2RlICsgYWRkcikgICovCisJCQllMTAwMF9zaGlmdF9vdXRfZWVfYml0cyhodywgRUVQUk9NX1JFQURfT1BDT0RFX01JQ1JPV0lSRSwKKwkJCQkJCWVlcHJvbS0+b3Bjb2RlX2JpdHMpOworCQkJZTEwMDBfc2hpZnRfb3V0X2VlX2JpdHMoaHcsICh1aW50MTZfdCkob2Zmc2V0ICsgaSksCisJCQkgICAgICAgICAgICAgICAgICAgICAgICBlZXByb20tPmFkZHJlc3NfYml0cyk7CisKKwkJCS8qIFJlYWQgdGhlIGRhdGEuICBGb3IgbWljcm93aXJlLCBlYWNoIHdvcmQgcmVxdWlyZXMgdGhlIG92ZXJoZWFkCisJCQkgKiBvZiBlZXByb20gc2V0dXAgYW5kIHRlYXItZG93bi4gKi8KKwkJCWRhdGFbaV0gPSBlMTAwMF9zaGlmdF9pbl9lZV9iaXRzKGh3LCAxNik7CisJCQllMTAwMF9zdGFuZGJ5X2VlcHJvbShodyk7CisJCX0KKwl9CisKKwkvKiBFbmQgdGhpcyByZWFkIG9wZXJhdGlvbiAqLworCWUxMDAwX3JlbGVhc2VfZWVwcm9tKGh3KTsKKworCXJldHVybiBFMTAwMF9TVUNDRVNTOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBWZXJpZmllcyB0aGF0IHRoZSBFRVBST00gaGFzIGEgdmFsaWQgY2hlY2tzdW0KKyAqIAorICogaHcgLSBTdHJ1Y3QgY29udGFpbmluZyB2YXJpYWJsZXMgYWNjZXNzZWQgYnkgc2hhcmVkIGNvZGUKKyAqCisgKiBSZWFkcyB0aGUgZmlyc3QgNjQgMTYgYml0IHdvcmRzIG9mIHRoZSBFRVBST00gYW5kIHN1bXMgdGhlIHZhbHVlcyByZWFkLgorICogSWYgdGhlIHRoZSBzdW0gb2YgdGhlIDY0IDE2IGJpdCB3b3JkcyBpcyAweEJBQkEsIHRoZSBFRVBST00ncyBjaGVja3N1bSBpcworICogdmFsaWQuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50CitlMTAwMF92YWxpZGF0ZV9lZXByb21fY2hlY2tzdW0oc3RydWN0IGUxMDAwX2h3ICpodykKK3sKKwl1aW50MTZfdCBjaGVja3N1bSA9IDA7CisJdWludDE2X3QgaSwgZWVwcm9tX2RhdGE7CisKKwlERUJVR0ZVTkMoImUxMDAwX3ZhbGlkYXRlX2VlcHJvbV9jaGVja3N1bSIpOworCisJZm9yKGkgPSAwOyBpIDwgKEVFUFJPTV9DSEVDS1NVTV9SRUcgKyAxKTsgaSsrKSB7CisJCWlmKGUxMDAwX3JlYWRfZWVwcm9tKGh3LCBpLCAxLCAmZWVwcm9tX2RhdGEpIDwgMCkgeworCQkJREVCVUdPVVQoIkVFUFJPTSBSZWFkIEVycm9yXG4iKTsKKwkJCXJldHVybiAtRTEwMDBfRVJSX0VFUFJPTTsKKwkJfQorCQljaGVja3N1bSArPSBlZXByb21fZGF0YTsKKwl9CisJCisJaWYoY2hlY2tzdW0gPT0gKHVpbnQxNl90KSBFRVBST01fU1VNKQorCQlyZXR1cm4gRTEwMDBfU1VDQ0VTUzsKKwllbHNlIHsKKwkJREVCVUdPVVQoIkVFUFJPTSBDaGVja3N1bSBJbnZhbGlkXG4iKTsgICAgCisJCXJldHVybiAtRTEwMDBfRVJSX0VFUFJPTTsKKwl9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJlYWRzIHRoZSBhZGFwdGVyJ3MgTUFDIGFkZHJlc3MgZnJvbSB0aGUgRUVQUk9NIGFuZCBpbnZlcnRzIHRoZSBMU0IgZm9yIHRoZQorICogc2Vjb25kIGZ1bmN0aW9uIG9mIGR1YWwgZnVuY3Rpb24gZGV2aWNlcworICoKKyAqIGh3IC0gU3RydWN0IGNvbnRhaW5pbmcgdmFyaWFibGVzIGFjY2Vzc2VkIGJ5IHNoYXJlZCBjb2RlCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50IAorZTEwMDBfcmVhZF9tYWNfYWRkcihzdHJ1Y3QgZTEwMDBfaHcgKmh3KQoreworCXVpbnQxNl90IG9mZnNldDsKKwl1aW50MTZfdCBlZXByb21fZGF0YTsKKwlpbnQgaTsKKworCURFQlVHRlVOQygiZTEwMDBfcmVhZF9tYWNfYWRkciIpOworCisJZm9yKGkgPSAwOyBpIDwgTk9ERV9BRERSRVNTX1NJWkU7IGkgKz0gMikgeworCQlvZmZzZXQgPSBpID4+IDE7CisJCWlmKGUxMDAwX3JlYWRfZWVwcm9tKGh3LCBvZmZzZXQsIDEsICZlZXByb21fZGF0YSkgPCAwKSB7CisJCQlERUJVR09VVCgiRUVQUk9NIFJlYWQgRXJyb3JcbiIpOworCQkJcmV0dXJuIC1FMTAwMF9FUlJfRUVQUk9NOworCQl9CisJCWh3LT5tYWNfYWRkcltpXSA9IGVlcHJvbV9kYXRhICYgMHhmZjsKKwkJaHctPm1hY19hZGRyW2krMV0gPSAoZWVwcm9tX2RhdGEgPj4gOCkgJiAweGZmOworCX0KKwlpZigoKGh3LT5tYWNfdHlwZSA9PSBlMTAwMF84MjU0NikgfHwgKGh3LT5tYWNfdHlwZSA9PSBlMTAwMF84MjU0Nl9yZXZfMykpICYmCisJCShFMTAwMF9SRUFEX1JFRyhodywgU1RBVFVTKSAmIEUxMDAwX1NUQVRVU19GVU5DXzEpKQorCQkvKiBJbnZlcnQgdGhlIGxhc3QgYml0IGlmIHRoaXMgaXMgdGhlIHNlY29uZCBkZXZpY2UgKi8KKwkJaHctPm1hY19hZGRyWzVdIF49IDE7CisJcmV0dXJuIEUxMDAwX1NVQ0NFU1M7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEluaXRpYWxpemVzIHJlY2VpdmUgYWRkcmVzcyBmaWx0ZXJzLgorICoKKyAqIGh3IC0gU3RydWN0IGNvbnRhaW5pbmcgdmFyaWFibGVzIGFjY2Vzc2VkIGJ5IHNoYXJlZCBjb2RlIAorICoKKyAqIFBsYWNlcyB0aGUgTUFDIGFkZHJlc3MgaW4gcmVjZWl2ZSBhZGRyZXNzIHJlZ2lzdGVyIDAgYW5kIGNsZWFycyB0aGUgcmVzdAorICogb2YgdGhlIHJlY2VpdmUgYWRkcmVzc3MgcmVnaXN0ZXJzLiBDbGVhcnMgdGhlIG11bHRpY2FzdCB0YWJsZS4gQXNzdW1lcworICogdGhlIHJlY2VpdmVyIGlzIGluIHJlc2V0IHdoZW4gdGhlIHJvdXRpbmUgaXMgY2FsbGVkLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQKK2UxMDAwX2luaXRfcnhfYWRkcnMoc3RydWN0IGUxMDAwX2h3ICpodykKK3sKKwl1aW50MzJfdCBpOworCXVpbnQzMl90IGFkZHJfbG93OworCXVpbnQzMl90IGFkZHJfaGlnaDsKKwkKKwlERUJVR0ZVTkMoImUxMDAwX2luaXRfcnhfYWRkcnMiKTsKKwkKKwkvKiBTZXR1cCB0aGUgcmVjZWl2ZSBhZGRyZXNzLiAqLworCURFQlVHT1VUKCJQcm9ncmFtbWluZyBNQUMgQWRkcmVzcyBpbnRvIFJBUlswXVxuIik7CisJYWRkcl9sb3cgPSAoaHctPm1hY19hZGRyWzBdIHwKKwkJKGh3LT5tYWNfYWRkclsxXSA8PCA4KSB8CisJCShody0+bWFjX2FkZHJbMl0gPDwgMTYpIHwgKGh3LT5tYWNfYWRkclszXSA8PCAyNCkpOworCQorCWFkZHJfaGlnaCA9IChody0+bWFjX2FkZHJbNF0gfAorCQkoaHctPm1hY19hZGRyWzVdIDw8IDgpIHwgRTEwMDBfUkFIX0FWKTsKKwkKKwlFMTAwMF9XUklURV9SRUdfQVJSQVkoaHcsIFJBLCAwLCBhZGRyX2xvdyk7CisJRTEwMDBfV1JJVEVfUkVHX0FSUkFZKGh3LCBSQSwgMSwgYWRkcl9oaWdoKTsKKwkKKwkvKiBaZXJvIG91dCB0aGUgb3RoZXIgMTUgcmVjZWl2ZSBhZGRyZXNzZXMuICovCisJREVCVUdPVVQoIkNsZWFyaW5nIFJBUlsxLTE1XVxuIik7CisJZm9yKGkgPSAxOyBpIDwgRTEwMDBfUkFSX0VOVFJJRVM7IGkrKykgeworCQlFMTAwMF9XUklURV9SRUdfQVJSQVkoaHcsIFJBLCAoaSA8PCAxKSwgMCk7CisJCUUxMDAwX1dSSVRFX1JFR19BUlJBWShodywgUkEsICgoaSA8PCAxKSArIDEpLCAwKTsKKwl9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENsZWFycyB0aGUgVkxBTiBmaWxlciB0YWJsZQorICoKKyAqIGh3IC0gU3RydWN0IGNvbnRhaW5pbmcgdmFyaWFibGVzIGFjY2Vzc2VkIGJ5IHNoYXJlZCBjb2RlCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZAorZTEwMDBfY2xlYXJfdmZ0YShzdHJ1Y3QgZTEwMDBfaHcgKmh3KQoreworCXVpbnQzMl90IG9mZnNldDsKKyAgICAKKwlmb3Iob2Zmc2V0ID0gMDsgb2Zmc2V0IDwgRTEwMDBfVkxBTl9GSUxURVJfVEJMX1NJWkU7IG9mZnNldCsrKQorCQlFMTAwMF9XUklURV9SRUdfQVJSQVkoaHcsIFZGVEEsIG9mZnNldCwgMCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogV3JpdGVzIGEgdmFsdWUgdG8gb25lIG9mIHRoZSBkZXZpY2VzIHJlZ2lzdGVycyB1c2luZyBwb3J0IEkvTyAoYXMgb3Bwb3NlZCB0bworKiBtZW1vcnkgbWFwcGVkIEkvTykuIE9ubHkgODI1NDQgYW5kIG5ld2VyIGRldmljZXMgc3VwcG9ydCBwb3J0IEkvTy4gKgorKiBodyAtIFN0cnVjdCBjb250YWluaW5nIHZhcmlhYmxlcyBhY2Nlc3NlZCBieSBzaGFyZWQgY29kZQorKiBvZmZzZXQgLSBvZmZzZXQgdG8gd3JpdGUgdG8gKiB2YWx1ZSAtIHZhbHVlIHRvIHdyaXRlCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgZTEwMDBfd3JpdGVfcmVnX2lvKHN0cnVjdCBlMTAwMF9odyAqaHcsIHVpbnQzMl90IG9mZnNldCwgdWludDMyX3QgdmFsdWUpeworCXVpbnQzMl90IGlvX2FkZHIgPSBody0+aW9fYmFzZTsKKwl1aW50MzJfdCBpb19kYXRhID0gaHctPmlvX2Jhc2UgKyA0OworCWUxMDAwX2lvX3dyaXRlKGh3LCBpb19hZGRyLCBvZmZzZXQpOworCWUxMDAwX2lvX3dyaXRlKGh3LCBpb19kYXRhLCB2YWx1ZSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFNldCB0aGUgcGh5IHR5cGUgbWVtYmVyIGluIHRoZSBodyBzdHJ1Y3QuCisgKgorICogaHcgLSBTdHJ1Y3QgY29udGFpbmluZyB2YXJpYWJsZXMgYWNjZXNzZWQgYnkgc2hhcmVkIGNvZGUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQzMl90CitlMTAwMF9zZXRfcGh5X3R5cGUoc3RydWN0IGUxMDAwX2h3ICpodykKK3sKKwlERUJVR0ZVTkMoImUxMDAwX3NldF9waHlfdHlwZSIpOworCisJc3dpdGNoKGh3LT5waHlfaWQpIHsKKwljYXNlIE04OEUxMDAwX0VfUEhZX0lEOgorCWNhc2UgTTg4RTEwMDBfSV9QSFlfSUQ6CisJY2FzZSBNODhFMTAxMV9JX1BIWV9JRDoKKwkJaHctPnBoeV90eXBlID0gZTEwMDBfcGh5X204ODsKKwkJYnJlYWs7CisJY2FzZSBJR1AwMUUxMDAwX0lfUEhZX0lEOgorCQlody0+cGh5X3R5cGUgPSBlMTAwMF9waHlfaWdwOworCQlicmVhazsKKwlkZWZhdWx0OgorCQkvKiBTaG91bGQgbmV2ZXIgaGF2ZSBsb2FkZWQgb24gdGhpcyBkZXZpY2UgKi8KKwkJaHctPnBoeV90eXBlID0gZTEwMDBfcGh5X3VuZGVmaW5lZDsKKwkJcmV0dXJuIC1FMTAwMF9FUlJfUEhZX1RZUEU7CisJfQorCisJcmV0dXJuIEUxMDAwX1NVQ0NFU1M7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIElHUCBwaHkgaW5pdCBzY3JpcHQgLSBpbml0aWFsaXplcyB0aGUgR2JFIFBIWQorICoKKyAqIGh3IC0gU3RydWN0IGNvbnRhaW5pbmcgdmFyaWFibGVzIGFjY2Vzc2VkIGJ5IHNoYXJlZCBjb2RlCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZAorZTEwMDBfcGh5X2luaXRfc2NyaXB0KHN0cnVjdCBlMTAwMF9odyAqaHcpCit7CisJREVCVUdGVU5DKCJlMTAwMF9waHlfaW5pdF9zY3JpcHQiKTsKKworI2lmIDAKKwkvKiBTZWUgZTEwMDBfc3dfaW5pdCgpIG9mIHRoZSBMaW51eCBkcml2ZXIgKi8KKwlpZihody0+cGh5X2luaXRfc2NyaXB0KSB7CisjZWxzZQorCWlmKChody0+bWFjX3R5cGUgPT0gZTEwMDBfODI1NDEpIHx8CisJICAgKGh3LT5tYWNfdHlwZSA9PSBlMTAwMF84MjU0NykgfHwKKwkgICAoaHctPm1hY190eXBlID09IGUxMDAwXzgyNTQxX3Jldl8yKSB8fAorCSAgIChody0+bWFjX3R5cGUgPT0gZTEwMDBfODI1NDdfcmV2XzIpKSB7CisjZW5kaWYKKwkJbWRlbGF5KDIwKTsKKworCQllMTAwMF93cml0ZV9waHlfcmVnKGh3LDB4MDAwMCwweDAxNDApOworCisJCW1kZWxheSg1KTsKKworCQlpZihody0+bWFjX3R5cGUgPT0gZTEwMDBfODI1NDEgfHwgaHctPm1hY190eXBlID09IGUxMDAwXzgyNTQ3KSB7CisJCQllMTAwMF93cml0ZV9waHlfcmVnKGh3LCAweDFGOTUsIDB4MDAwMSk7CisKKwkJCWUxMDAwX3dyaXRlX3BoeV9yZWcoaHcsIDB4MUY3MSwgMHhCRDIxKTsKKworCQkJZTEwMDBfd3JpdGVfcGh5X3JlZyhodywgMHgxRjc5LCAweDAwMTgpOworCisJCQllMTAwMF93cml0ZV9waHlfcmVnKGh3LCAweDFGMzAsIDB4MTYwMCk7CisKKwkJCWUxMDAwX3dyaXRlX3BoeV9yZWcoaHcsIDB4MUYzMSwgMHgwMDE0KTsKKworCQkJZTEwMDBfd3JpdGVfcGh5X3JlZyhodywgMHgxRjMyLCAweDE2MUMpOworCisJCQllMTAwMF93cml0ZV9waHlfcmVnKGh3LCAweDFGOTQsIDB4MDAwMyk7CisKKwkJCWUxMDAwX3dyaXRlX3BoeV9yZWcoaHcsIDB4MUY5NiwgMHgwMDNGKTsKKworCQkJZTEwMDBfd3JpdGVfcGh5X3JlZyhodywgMHgyMDEwLCAweDAwMDgpOworCQl9IGVsc2UgeworCQkJZTEwMDBfd3JpdGVfcGh5X3JlZyhodywgMHgxRjczLCAweDAwOTkpOworCQl9CisKKwkJZTEwMDBfd3JpdGVfcGh5X3JlZyhodywgMHgwMDAwLCAweDMzMDApOworCisKKwkJaWYoaHctPm1hY190eXBlID09IGUxMDAwXzgyNTQ3KSB7CisJCQl1aW50MTZfdCBmdXNlZCwgZmluZSwgY29hcnNlOworCisJCQkvKiBNb3ZlIHRvIGFuYWxvZyByZWdpc3RlcnMgcGFnZSAqLworCQkJZTEwMDBfcmVhZF9waHlfcmVnKGh3LCBJR1AwMUUxMDAwX0FOQUxPR19TUEFSRV9GVVNFX1NUQVRVUywgJmZ1c2VkKTsKKworCQkJaWYoIShmdXNlZCAmIElHUDAxRTEwMDBfQU5BTE9HX1NQQVJFX0ZVU0VfRU5BQkxFRCkpIHsKKwkJCQllMTAwMF9yZWFkX3BoeV9yZWcoaHcsIElHUDAxRTEwMDBfQU5BTE9HX0ZVU0VfU1RBVFVTLCAmZnVzZWQpOworCisJCQkJZmluZSA9IGZ1c2VkICYgSUdQMDFFMTAwMF9BTkFMT0dfRlVTRV9GSU5FX01BU0s7CisJCQkJY29hcnNlID0gZnVzZWQgJiBJR1AwMUUxMDAwX0FOQUxPR19GVVNFX0NPQVJTRV9NQVNLOworCisJCQkJaWYoY29hcnNlID4gSUdQMDFFMTAwMF9BTkFMT0dfRlVTRV9DT0FSU0VfVEhSRVNIKSB7CisJCQkJCWNvYXJzZSAtPSBJR1AwMUUxMDAwX0FOQUxPR19GVVNFX0NPQVJTRV8xMDsKKwkJCQkJZmluZSAtPSBJR1AwMUUxMDAwX0FOQUxPR19GVVNFX0ZJTkVfMTsKKwkJCQl9IGVsc2UgaWYoY29hcnNlID09IElHUDAxRTEwMDBfQU5BTE9HX0ZVU0VfQ09BUlNFX1RIUkVTSCkKKwkJCQkJZmluZSAtPSBJR1AwMUUxMDAwX0FOQUxPR19GVVNFX0ZJTkVfMTA7CisKKwkJCQlmdXNlZCA9IChmdXNlZCAmIElHUDAxRTEwMDBfQU5BTE9HX0ZVU0VfUE9MWV9NQVNLKSB8CisJCQkJCShmaW5lICYgSUdQMDFFMTAwMF9BTkFMT0dfRlVTRV9GSU5FX01BU0spIHwKKwkJCQkJKGNvYXJzZSAmIElHUDAxRTEwMDBfQU5BTE9HX0ZVU0VfQ09BUlNFX01BU0spOworCisJCQkJZTEwMDBfd3JpdGVfcGh5X3JlZyhodywgSUdQMDFFMTAwMF9BTkFMT0dfRlVTRV9DT05UUk9MLCBmdXNlZCk7CisJCQkJZTEwMDBfd3JpdGVfcGh5X3JlZyhodywgSUdQMDFFMTAwMF9BTkFMT0dfRlVTRV9CWVBBU1MsCisJCQkJCQlJR1AwMUUxMDAwX0FOQUxPR19GVVNFX0VOQUJMRV9TV19DT05UUk9MKTsKKwkJCX0KKwkJfQorCX0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogU2V0IHRoZSBtYWMgdHlwZSBtZW1iZXIgaW4gdGhlIGh3IHN0cnVjdC4KKyAqIAorICogaHcgLSBTdHJ1Y3QgY29udGFpbmluZyB2YXJpYWJsZXMgYWNjZXNzZWQgYnkgc2hhcmVkIGNvZGUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQKK2UxMDAwX3NldF9tYWNfdHlwZShzdHJ1Y3QgZTEwMDBfaHcgKmh3KQoreworCURFQlVHRlVOQygiZTEwMDBfc2V0X21hY190eXBlIik7CisKKwlzd2l0Y2ggKGh3LT5kZXZpY2VfaWQpIHsKKwljYXNlIEUxMDAwX0RFVl9JRF84MjU0MjoKKwkJc3dpdGNoIChody0+cmV2aXNpb25faWQpIHsKKwkJY2FzZSBFMTAwMF84MjU0Ml8yXzBfUkVWX0lEOgorCQkJaHctPm1hY190eXBlID0gZTEwMDBfODI1NDJfcmV2Ml8wOworCQkJYnJlYWs7CisJCWNhc2UgRTEwMDBfODI1NDJfMl8xX1JFVl9JRDoKKwkJCWh3LT5tYWNfdHlwZSA9IGUxMDAwXzgyNTQyX3JldjJfMTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJLyogSW52YWxpZCA4MjU0MiByZXZpc2lvbiBJRCAqLworCQkJcmV0dXJuIC1FMTAwMF9FUlJfTUFDX1RZUEU7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBFMTAwMF9ERVZfSURfODI1NDNHQ19GSUJFUjoKKwljYXNlIEUxMDAwX0RFVl9JRF84MjU0M0dDX0NPUFBFUjoKKwkJaHctPm1hY190eXBlID0gZTEwMDBfODI1NDM7CisJCWJyZWFrOworCWNhc2UgRTEwMDBfREVWX0lEXzgyNTQ0RUlfQ09QUEVSOgorCWNhc2UgRTEwMDBfREVWX0lEXzgyNTQ0RUlfRklCRVI6CisJY2FzZSBFMTAwMF9ERVZfSURfODI1NDRHQ19DT1BQRVI6CisJY2FzZSBFMTAwMF9ERVZfSURfODI1NDRHQ19MT006CisJCWh3LT5tYWNfdHlwZSA9IGUxMDAwXzgyNTQ0OworCQlicmVhazsKKwljYXNlIEUxMDAwX0RFVl9JRF84MjU0MEVNOgorCWNhc2UgRTEwMDBfREVWX0lEXzgyNTQwRU1fTE9NOgorCWNhc2UgRTEwMDBfREVWX0lEXzgyNTQwRVA6CisJY2FzZSBFMTAwMF9ERVZfSURfODI1NDBFUF9MT006CisJY2FzZSBFMTAwMF9ERVZfSURfODI1NDBFUF9MUDoKKwkJaHctPm1hY190eXBlID0gZTEwMDBfODI1NDA7CisJCWJyZWFrOworCWNhc2UgRTEwMDBfREVWX0lEXzgyNTQ1RU1fQ09QUEVSOgorCWNhc2UgRTEwMDBfREVWX0lEXzgyNTQ1RU1fRklCRVI6CisJCWh3LT5tYWNfdHlwZSA9IGUxMDAwXzgyNTQ1OworCQlicmVhazsKKwljYXNlIEUxMDAwX0RFVl9JRF84MjU0NUdNX0NPUFBFUjoKKwljYXNlIEUxMDAwX0RFVl9JRF84MjU0NUdNX0ZJQkVSOgorCWNhc2UgRTEwMDBfREVWX0lEXzgyNTQ1R01fU0VSREVTOgorCQlody0+bWFjX3R5cGUgPSBlMTAwMF84MjU0NV9yZXZfMzsKKwkJYnJlYWs7CisJY2FzZSBFMTAwMF9ERVZfSURfODI1NDZFQl9DT1BQRVI6CisJY2FzZSBFMTAwMF9ERVZfSURfODI1NDZFQl9GSUJFUjoKKwljYXNlIEUxMDAwX0RFVl9JRF84MjU0NkVCX1FVQURfQ09QUEVSOgorCQlody0+bWFjX3R5cGUgPSBlMTAwMF84MjU0NjsKKwkJYnJlYWs7CisJY2FzZSBFMTAwMF9ERVZfSURfODI1NDZHQl9DT1BQRVI6CisJY2FzZSBFMTAwMF9ERVZfSURfODI1NDZHQl9GSUJFUjoKKwljYXNlIEUxMDAwX0RFVl9JRF84MjU0NkdCX1NFUkRFUzoKKwkJaHctPm1hY190eXBlID0gZTEwMDBfODI1NDZfcmV2XzM7CisJCWJyZWFrOworCWNhc2UgRTEwMDBfREVWX0lEXzgyNTQxRUk6CisJY2FzZSBFMTAwMF9ERVZfSURfODI1NDFFSV9NT0JJTEU6CisJCWh3LT5tYWNfdHlwZSA9IGUxMDAwXzgyNTQxOworCQlicmVhazsKKwljYXNlIEUxMDAwX0RFVl9JRF84MjU0MUVSOgorCWNhc2UgRTEwMDBfREVWX0lEXzgyNTQxR0k6CisJY2FzZSBFMTAwMF9ERVZfSURfODI1NDFHSV9NT0JJTEU6CisJCWh3LT5tYWNfdHlwZSA9IGUxMDAwXzgyNTQxX3Jldl8yOworCQlicmVhazsKKwljYXNlIEUxMDAwX0RFVl9JRF84MjU0N0VJOgorCQlody0+bWFjX3R5cGUgPSBlMTAwMF84MjU0NzsKKwkJYnJlYWs7CisJY2FzZSBFMTAwMF9ERVZfSURfODI1NDdHSToKKwkJaHctPm1hY190eXBlID0gZTEwMDBfODI1NDdfcmV2XzI7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCS8qIFNob3VsZCBuZXZlciBoYXZlIGxvYWRlZCBvbiB0aGlzIGRldmljZSAqLworCQlyZXR1cm4gLUUxMDAwX0VSUl9NQUNfVFlQRTsKKwl9CisKKwlyZXR1cm4gRTEwMDBfU1VDQ0VTUzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBTZXQgbWVkaWEgdHlwZSBhbmQgVEJJIGNvbXBhdGliaWxpdHkuCisgKgorICogaHcgLSBTdHJ1Y3QgY29udGFpbmluZyB2YXJpYWJsZXMgYWNjZXNzZWQgYnkgc2hhcmVkIGNvZGUKKyAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQKK2UxMDAwX3NldF9tZWRpYV90eXBlKHN0cnVjdCBlMTAwMF9odyAqaHcpCit7CisJdWludDMyX3Qgc3RhdHVzOworCisJREVCVUdGVU5DKCJlMTAwMF9zZXRfbWVkaWFfdHlwZSIpOworCQorCWlmKGh3LT5tYWNfdHlwZSAhPSBlMTAwMF84MjU0MykgeworCQkvKiB0YmlfY29tcGF0aWJpbGl0eSBpcyBvbmx5IHZhbGlkIG9uIDgyNTQzICovCisJCWh3LT50YmlfY29tcGF0aWJpbGl0eV9lbiA9IEZBTFNFOworCX0KKworCXN3aXRjaCAoaHctPmRldmljZV9pZCkgeworCQljYXNlIEUxMDAwX0RFVl9JRF84MjU0NUdNX1NFUkRFUzoKKwkJY2FzZSBFMTAwMF9ERVZfSURfODI1NDZHQl9TRVJERVM6CisJCQlody0+bWVkaWFfdHlwZSA9IGUxMDAwX21lZGlhX3R5cGVfaW50ZXJuYWxfc2VyZGVzOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlpZihody0+bWFjX3R5cGUgPj0gZTEwMDBfODI1NDMpIHsKKwkJCQlzdGF0dXMgPSBFMTAwMF9SRUFEX1JFRyhodywgU1RBVFVTKTsKKwkJCQlpZihzdGF0dXMgJiBFMTAwMF9TVEFUVVNfVEJJTU9ERSkgeworCQkJCQlody0+bWVkaWFfdHlwZSA9IGUxMDAwX21lZGlhX3R5cGVfZmliZXI7CisJCQkJCS8qIHRiaV9jb21wYXRpYmlsaXR5IG5vdCB2YWxpZCBvbiBmaWJlciAqLworCQkJCQlody0+dGJpX2NvbXBhdGliaWxpdHlfZW4gPSBGQUxTRTsKKwkJCQl9IGVsc2UgeworCQkJCQlody0+bWVkaWFfdHlwZSA9IGUxMDAwX21lZGlhX3R5cGVfY29wcGVyOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJLyogVGhpcyBpcyBhbiA4MjU0MiAoZmliZXIgb25seSkgKi8KKwkJCQlody0+bWVkaWFfdHlwZSA9IGUxMDAwX21lZGlhX3R5cGVfZmliZXI7CisJCQl9CisJfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSZXNldCB0aGUgdHJhbnNtaXQgYW5kIHJlY2VpdmUgdW5pdHM7IG1hc2sgYW5kIGNsZWFyIGFsbCBpbnRlcnJ1cHRzLgorICoKKyAqIGh3IC0gU3RydWN0IGNvbnRhaW5pbmcgdmFyaWFibGVzIGFjY2Vzc2VkIGJ5IHNoYXJlZCBjb2RlCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZAorZTEwMDBfcmVzZXRfaHcoc3RydWN0IGUxMDAwX2h3ICpodykKK3sKKwl1aW50MzJfdCBjdHJsOworCXVpbnQzMl90IGN0cmxfZXh0OworCXVpbnQzMl90IGljcjsKKwl1aW50MzJfdCBtYW5jOworCQorCURFQlVHRlVOQygiZTEwMDBfcmVzZXRfaHciKTsKKwkKKwkvKiBGb3IgODI1NDIgKHJldiAyLjApLCBkaXNhYmxlIE1XSSBiZWZvcmUgaXNzdWluZyBhIGRldmljZSByZXNldCAqLworCWlmKGh3LT5tYWNfdHlwZSA9PSBlMTAwMF84MjU0Ml9yZXYyXzApIHsKKwkJREVCVUdPVVQoIkRpc2FibGluZyBNV0kgb24gODI1NDIgcmV2IDIuMFxuIik7CisJCWUxMDAwX3BjaV9jbGVhcl9td2koaHcpOworCX0KKworCS8qIENsZWFyIGludGVycnVwdCBtYXNrIHRvIHN0b3AgYm9hcmQgZnJvbSBnZW5lcmF0aW5nIGludGVycnVwdHMgKi8KKwlERUJVR09VVCgiTWFza2luZyBvZmYgYWxsIGludGVycnVwdHNcbiIpOworCUUxMDAwX1dSSVRFX1JFRyhodywgSU1DLCAweGZmZmZmZmZmKTsKKwkKKwkvKiBEaXNhYmxlIHRoZSBUcmFuc21pdCBhbmQgUmVjZWl2ZSB1bml0cy4gIFRoZW4gZGVsYXkgdG8gYWxsb3cKKwkgKiBhbnkgcGVuZGluZyB0cmFuc2FjdGlvbnMgdG8gY29tcGxldGUgYmVmb3JlIHdlIGhpdCB0aGUgTUFDIHdpdGgKKwkgKiB0aGUgZ2xvYmFsIHJlc2V0LgorCSAqLworCUUxMDAwX1dSSVRFX1JFRyhodywgUkNUTCwgMCk7CisJRTEwMDBfV1JJVEVfUkVHKGh3LCBUQ1RMLCBFMTAwMF9UQ1RMX1BTUCk7CisJRTEwMDBfV1JJVEVfRkxVU0goaHcpOworCisJLyogVGhlIHRiaV9jb21wYXRpYmlsaXR5X29uIEZsYWcgbXVzdCBiZSBjbGVhcmVkIHdoZW4gUmN0bCBpcyBjbGVhcmVkLiAqLworCWh3LT50YmlfY29tcGF0aWJpbGl0eV9vbiA9IEZBTFNFOworCisJLyogRGVsYXkgdG8gYWxsb3cgYW55IG91dHN0YW5kaW5nIFBDSSB0cmFuc2FjdGlvbnMgdG8gY29tcGxldGUgYmVmb3JlCisJICogcmVzZXR0aW5nIHRoZSBkZXZpY2UKKwkgKi8gCisJbWRlbGF5KDEwKTsKKworCWN0cmwgPSBFMTAwMF9SRUFEX1JFRyhodywgQ1RSTCk7CisKKwkvKiBNdXN0IHJlc2V0IHRoZSBQSFkgYmVmb3JlIHJlc2V0dGluZyB0aGUgTUFDICovCisJaWYoKGh3LT5tYWNfdHlwZSA9PSBlMTAwMF84MjU0MSkgfHwgKGh3LT5tYWNfdHlwZSA9PSBlMTAwMF84MjU0NykpIHsKKwkJRTEwMDBfV1JJVEVfUkVHX0lPKGh3LCBDVFJMLCAoY3RybCB8IEUxMDAwX0NUUkxfUEhZX1JTVCkpOworCQltZGVsYXkoNSk7CisJfQorCisJLyogSXNzdWUgYSBnbG9iYWwgcmVzZXQgdG8gdGhlIE1BQy4gIFRoaXMgd2lsbCByZXNldCB0aGUgY2hpcCdzCisJICogdHJhbnNtaXQsIHJlY2VpdmUsIERNQSwgYW5kIGxpbmsgdW5pdHMuICBJdCB3aWxsIG5vdCBlZmZlY3QKKwkgKiB0aGUgY3VycmVudCBQQ0kgY29uZmlndXJhdGlvbi4gIFRoZSBnbG9iYWwgcmVzZXQgYml0IGlzIHNlbGYtCisJICogY2xlYXJpbmcsIGFuZCBzaG91bGQgY2xlYXIgd2l0aGluIGEgbWljcm9zZWNvbmQuCisJICovCisJREVCVUdPVVQoIklzc3VpbmcgYSBnbG9iYWwgcmVzZXQgdG8gTUFDXG4iKTsKKworCXN3aXRjaChody0+bWFjX3R5cGUpIHsKKwkJY2FzZSBlMTAwMF84MjU0NDoKKwkJY2FzZSBlMTAwMF84MjU0MDoKKwkJY2FzZSBlMTAwMF84MjU0NToKKwkJY2FzZSBlMTAwMF84MjU0NjoKKwkJY2FzZSBlMTAwMF84MjU0MToKKwkJY2FzZSBlMTAwMF84MjU0MV9yZXZfMjoKKwkJCS8qIFRoZXNlIGNvbnRyb2xsZXJzIGNhbid0IGFjayB0aGUgNjQtYml0IHdyaXRlIHdoZW4gaXNzdWluZyB0aGUKKwkJCSAqIHJlc2V0LCBzbyB1c2UgSU8tbWFwcGluZyBhcyBhIHdvcmthcm91bmQgdG8gaXNzdWUgdGhlIHJlc2V0ICovCisJCQlFMTAwMF9XUklURV9SRUdfSU8oaHcsIENUUkwsIChjdHJsIHwgRTEwMDBfQ1RSTF9SU1QpKTsKKwkJCWJyZWFrOworCQljYXNlIGUxMDAwXzgyNTQ1X3Jldl8zOgorCQljYXNlIGUxMDAwXzgyNTQ2X3Jldl8zOgorCQkJLyogUmVzZXQgaXMgcGVyZm9ybWVkIG9uIGEgc2hhZG93IG9mIHRoZSBjb250cm9sIHJlZ2lzdGVyICovCisJCQlFMTAwMF9XUklURV9SRUcoaHcsIENUUkxfRFVQLCAoY3RybCB8IEUxMDAwX0NUUkxfUlNUKSk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCUUxMDAwX1dSSVRFX1JFRyhodywgQ1RSTCwgKGN0cmwgfCBFMTAwMF9DVFJMX1JTVCkpOworCQkJYnJlYWs7CisJfQorCisJLyogQWZ0ZXIgTUFDIHJlc2V0LCBmb3JjZSByZWxvYWQgb2YgRUVQUk9NIHRvIHJlc3RvcmUgcG93ZXItb24gc2V0dGluZ3MgdG8KKwkgKiBkZXZpY2UuICBMYXRlciBjb250cm9sbGVycyByZWxvYWQgdGhlIEVFUFJPTSBhdXRvbWF0aWNhbGx5LCBzbyBqdXN0IHdhaXQKKwkgKiBmb3IgcmVsb2FkIHRvIGNvbXBsZXRlLgorCSAqLworCXN3aXRjaChody0+bWFjX3R5cGUpIHsKKwkJY2FzZSBlMTAwMF84MjU0Ml9yZXYyXzA6CisJCWNhc2UgZTEwMDBfODI1NDJfcmV2Ml8xOgorCQljYXNlIGUxMDAwXzgyNTQzOgorCQljYXNlIGUxMDAwXzgyNTQ0OgorCQkJLyogV2FpdCBmb3IgcmVzZXQgdG8gY29tcGxldGUgKi8KKwkJCXVkZWxheSgxMCk7CisJCQljdHJsX2V4dCA9IEUxMDAwX1JFQURfUkVHKGh3LCBDVFJMX0VYVCk7CisJCQljdHJsX2V4dCB8PSBFMTAwMF9DVFJMX0VYVF9FRV9SU1Q7CisJCQlFMTAwMF9XUklURV9SRUcoaHcsIENUUkxfRVhULCBjdHJsX2V4dCk7CisJCQlFMTAwMF9XUklURV9GTFVTSChodyk7CisJCQkvKiBXYWl0IGZvciBFRVBST00gcmVsb2FkICovCisJCQltZGVsYXkoMik7CisJCQlicmVhazsKKwkJY2FzZSBlMTAwMF84MjU0MToKKwkJY2FzZSBlMTAwMF84MjU0MV9yZXZfMjoKKwkJY2FzZSBlMTAwMF84MjU0NzoKKwkJY2FzZSBlMTAwMF84MjU0N19yZXZfMjoKKwkJCS8qIFdhaXQgZm9yIEVFUFJPTSByZWxvYWQgKi8KKwkJCW1kZWxheSgyMCk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCS8qIFdhaXQgZm9yIEVFUFJPTSByZWxvYWQgKGl0IGhhcHBlbnMgYXV0b21hdGljYWxseSkgKi8KKwkJCW1kZWxheSg1KTsKKwkJCWJyZWFrOworCX0KKworCS8qIERpc2FibGUgSFcgQVJQcyBvbiBBU0YgZW5hYmxlZCBhZGFwdGVycyAqLworCWlmKGh3LT5tYWNfdHlwZSA+PSBlMTAwMF84MjU0MCkgeworCQltYW5jID0gRTEwMDBfUkVBRF9SRUcoaHcsIE1BTkMpOworCQltYW5jICY9IH4oRTEwMDBfTUFOQ19BUlBfRU4pOworCQlFMTAwMF9XUklURV9SRUcoaHcsIE1BTkMsIG1hbmMpOworCX0KKworCWlmKChody0+bWFjX3R5cGUgPT0gZTEwMDBfODI1NDEpIHx8IChody0+bWFjX3R5cGUgPT0gZTEwMDBfODI1NDcpKSB7CisJCWUxMDAwX3BoeV9pbml0X3NjcmlwdChodyk7CisJfQorCisJLyogQ2xlYXIgaW50ZXJydXB0IG1hc2sgdG8gc3RvcCBib2FyZCBmcm9tIGdlbmVyYXRpbmcgaW50ZXJydXB0cyAqLworCURFQlVHT1VUKCJNYXNraW5nIG9mZiBhbGwgaW50ZXJydXB0c1xuIik7CisJRTEwMDBfV1JJVEVfUkVHKGh3LCBJTUMsIDB4ZmZmZmZmZmYpOworCQorCS8qIENsZWFyIGFueSBwZW5kaW5nIGludGVycnVwdCBldmVudHMuICovCisJaWNyID0gRTEwMDBfUkVBRF9SRUcoaHcsIElDUik7CisKKwkvKiBJZiBNV0kgd2FzIHByZXZpb3VzbHkgZW5hYmxlZCwgcmVlbmFibGUgaXQuICovCisJaWYoaHctPm1hY190eXBlID09IGUxMDAwXzgyNTQyX3JldjJfMCkgeworI2lmZGVmIExJTlVYX0RSSVZFUgorCQlpZihody0+cGNpX2NtZF93b3JkICYgQ01EX01FTV9XUlRfSU5WQUxJREFURSkKKyNlbmRpZgorCQkJZTEwMDBfcGNpX3NldF9td2koaHcpOworCX0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUGVyZm9ybXMgYmFzaWMgY29uZmlndXJhdGlvbiBvZiB0aGUgYWRhcHRlci4KKyAqCisgKiBodyAtIFN0cnVjdCBjb250YWluaW5nIHZhcmlhYmxlcyBhY2Nlc3NlZCBieSBzaGFyZWQgY29kZQorICogCisgKiBBc3N1bWVzIHRoYXQgdGhlIGNvbnRyb2xsZXIgaGFzIHByZXZpb3VzbHkgYmVlbiByZXNldCBhbmQgaXMgaW4gYSAKKyAqIHBvc3QtcmVzZXQgdW5pbml0aWFsaXplZCBzdGF0ZS4gSW5pdGlhbGl6ZXMgdGhlIHJlY2VpdmUgYWRkcmVzcyByZWdpc3RlcnMsCisgKiBtdWx0aWNhc3QgdGFibGUsIGFuZCBWTEFOIGZpbHRlciB0YWJsZS4gQ2FsbHMgcm91dGluZXMgdG8gc2V0dXAgbGluaworICogY29uZmlndXJhdGlvbiBhbmQgZmxvdyBjb250cm9sIHNldHRpbmdzLiBDbGVhcnMgYWxsIG9uLWNoaXAgY291bnRlcnMuIExlYXZlcworICogdGhlIHRyYW5zbWl0IGFuZCByZWNlaXZlIHVuaXRzIGRpc2FibGVkIGFuZCB1bmluaXRpYWxpemVkLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludAorZTEwMDBfaW5pdF9odyhzdHJ1Y3QgZTEwMDBfaHcgKmh3KQoreworCXVpbnQzMl90IGN0cmwsIHN0YXR1czsKKwl1aW50MzJfdCBpOworCWludDMyX3QgcmV0X3ZhbDsKKwl1aW50MTZfdCBwY2l4X2NtZF93b3JkOworCXVpbnQxNl90IHBjaXhfc3RhdF9oaV93b3JkOworCXVpbnQxNl90IGNtZF9tbXJiYzsKKwl1aW50MTZfdCBzdGF0X21tcmJjOworCWUxMDAwX2J1c190eXBlIGJ1c190eXBlID0gZTEwMDBfYnVzX3R5cGVfdW5rbm93bjsKKworCURFQlVHRlVOQygiZTEwMDBfaW5pdF9odyIpOworCisJLyogU2V0IHRoZSBtZWRpYSB0eXBlIGFuZCBUQkkgY29tcGF0aWJpbGl0eSAqLworCWUxMDAwX3NldF9tZWRpYV90eXBlKGh3KTsKKworCS8qIERpc2FibGluZyBWTEFOIGZpbHRlcmluZy4gKi8KKwlERUJVR09VVCgiSW5pdGlhbGl6aW5nIHRoZSBJRUVFIFZMQU5cbiIpOworCUUxMDAwX1dSSVRFX1JFRyhodywgVkVULCAwKTsKKwkKKwllMTAwMF9jbGVhcl92ZnRhKGh3KTsKKwkKKwkvKiBGb3IgODI1NDIgKHJldiAyLjApLCBkaXNhYmxlIE1XSSBhbmQgcHV0IHRoZSByZWNlaXZlciBpbnRvIHJlc2V0ICovCisJaWYoaHctPm1hY190eXBlID09IGUxMDAwXzgyNTQyX3JldjJfMCkgeworCQlERUJVR09VVCgiRGlzYWJsaW5nIE1XSSBvbiA4MjU0MiByZXYgMi4wXG4iKTsKKwkJZTEwMDBfcGNpX2NsZWFyX213aShodyk7CisJCUUxMDAwX1dSSVRFX1JFRyhodywgUkNUTCwgRTEwMDBfUkNUTF9SU1QpOworCQlFMTAwMF9XUklURV9GTFVTSChodyk7CisJCW1kZWxheSg1KTsKKwl9CisJCisJLyogU2V0dXAgdGhlIHJlY2VpdmUgYWRkcmVzcy4gVGhpcyBpbnZvbHZlcyBpbml0aWFsaXppbmcgYWxsIG9mIHRoZSBSZWNlaXZlCisJICogQWRkcmVzcyBSZWdpc3RlcnMgKFJBUnMgMCAtIDE1KS4KKwkgKi8KKwllMTAwMF9pbml0X3J4X2FkZHJzKGh3KTsKKwkKKwkvKiBGb3IgODI1NDIgKHJldiAyLjApLCB0YWtlIHRoZSByZWNlaXZlciBvdXQgb2YgcmVzZXQgYW5kIGVuYWJsZSBNV0kgKi8KKwlpZihody0+bWFjX3R5cGUgPT0gZTEwMDBfODI1NDJfcmV2Ml8wKSB7CisJCUUxMDAwX1dSSVRFX1JFRyhodywgUkNUTCwgMCk7CisJCUUxMDAwX1dSSVRFX0ZMVVNIKGh3KTsKKwkJbWRlbGF5KDEpOworI2lmZGVmIExJTlVYX0RSSVZFUgorCQlpZihody0+cGNpX2NtZF93b3JkICYgQ01EX01FTV9XUlRfSU5WQUxJREFURSkKKyNlbmRpZgorCQkJZTEwMDBfcGNpX3NldF9td2koaHcpOworCX0KKwkKKwkvKiBaZXJvIG91dCB0aGUgTXVsdGljYXN0IEhBU0ggdGFibGUgKi8KKwlERUJVR09VVCgiWmVyb2luZyB0aGUgTVRBXG4iKTsKKwlmb3IoaSA9IDA7IGkgPCBFMTAwMF9NQ19UQkxfU0laRTsgaSsrKQorCQlFMTAwMF9XUklURV9SRUdfQVJSQVkoaHcsIE1UQSwgaSwgMCk7CisJCisjaWYgMAorCS8qIFNldCB0aGUgUENJIHByaW9yaXR5IGJpdCBjb3JyZWN0bHkgaW4gdGhlIENUUkwgcmVnaXN0ZXIuICBUaGlzCisJICogZGV0ZXJtaW5lcyBpZiB0aGUgYWRhcHRlciBnaXZlcyBwcmlvcml0eSB0byByZWNlaXZlcywgb3IgaWYgaXQKKwkgKiBnaXZlcyBlcXVhbCBwcmlvcml0eSB0byB0cmFuc21pdHMgYW5kIHJlY2VpdmVzLgorCSAqLworCWlmKGh3LT5kbWFfZmFpcm5lc3MpIHsKKwkJY3RybCA9IEUxMDAwX1JFQURfUkVHKGh3LCBDVFJMKTsKKwkJRTEwMDBfV1JJVEVfUkVHKGh3LCBDVFJMLCBjdHJsIHwgRTEwMDBfQ1RSTF9QUklPUik7CisJfQorI2VuZGlmCisKKwlzd2l0Y2goaHctPm1hY190eXBlKSB7CisJCWNhc2UgZTEwMDBfODI1NDVfcmV2XzM6CisJCWNhc2UgZTEwMDBfODI1NDZfcmV2XzM6CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWlmIChody0+bWFjX3R5cGUgPj0gZTEwMDBfODI1NDMpIHsKKwkJCQkvKiBTZWUgZTEwMDBfZ2V0X2J1c19pbmZvKCkgb2YgdGhlIExpbnV4IGRyaXZlciAqLworCQkJCXN0YXR1cyA9IEUxMDAwX1JFQURfUkVHKGh3LCBTVEFUVVMpOworCQkJCWJ1c190eXBlID0gKHN0YXR1cyAmIEUxMDAwX1NUQVRVU19QQ0lYX01PREUpID8KKwkJCQkJZTEwMDBfYnVzX3R5cGVfcGNpeCA6IGUxMDAwX2J1c190eXBlX3BjaTsKKwkJCX0KKworCQkJLyogV29ya2Fyb3VuZCBmb3IgUENJLVggcHJvYmxlbSB3aGVuIEJJT1Mgc2V0cyBNTVJCQyBpbmNvcnJlY3RseS4gKi8KKwkJCWlmKGJ1c190eXBlID09IGUxMDAwX2J1c190eXBlX3BjaXgpIHsKKwkJCQlwY2lfcmVhZF9jb25maWdfd29yZChody0+cGRldiwgUENJWF9DT01NQU5EX1JFR0lTVEVSLCAmcGNpeF9jbWRfd29yZCk7CisJCQkJcGNpX3JlYWRfY29uZmlnX3dvcmQoaHctPnBkZXYsIFBDSVhfU1RBVFVTX1JFR0lTVEVSX0hJLCAmcGNpeF9zdGF0X2hpX3dvcmQpOworCQkJCWNtZF9tbXJiYyA9IChwY2l4X2NtZF93b3JkICYgUENJWF9DT01NQU5EX01NUkJDX01BU0spID4+CisJCQkJCVBDSVhfQ09NTUFORF9NTVJCQ19TSElGVDsKKwkJCQlzdGF0X21tcmJjID0gKHBjaXhfc3RhdF9oaV93b3JkICYgUENJWF9TVEFUVVNfSElfTU1SQkNfTUFTSykgPj4KKwkJCQkJUENJWF9TVEFUVVNfSElfTU1SQkNfU0hJRlQ7CisJCQkJaWYoc3RhdF9tbXJiYyA9PSBQQ0lYX1NUQVRVU19ISV9NTVJCQ180SykKKwkJCQkJc3RhdF9tbXJiYyA9IFBDSVhfU1RBVFVTX0hJX01NUkJDXzJLOworCQkJCWlmKGNtZF9tbXJiYyA+IHN0YXRfbW1yYmMpIHsKKwkJCQkJcGNpeF9jbWRfd29yZCAmPSB+UENJWF9DT01NQU5EX01NUkJDX01BU0s7CisJCQkJCXBjaXhfY21kX3dvcmQgfD0gc3RhdF9tbXJiYyA8PCBQQ0lYX0NPTU1BTkRfTU1SQkNfU0hJRlQ7CisJCQkJCXBjaV93cml0ZV9jb25maWdfd29yZChody0+cGRldiwgUENJWF9DT01NQU5EX1JFR0lTVEVSLCBwY2l4X2NtZF93b3JkKTsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKwl9CisKKwkvKiBDYWxsIGEgc3Vicm91dGluZSB0byBjb25maWd1cmUgdGhlIGxpbmsgYW5kIHNldHVwIGZsb3cgY29udHJvbC4gKi8KKwlyZXRfdmFsID0gZTEwMDBfc2V0dXBfbGluayhodyk7CisJCisJLyogU2V0IHRoZSB0cmFuc21pdCBkZXNjcmlwdG9yIHdyaXRlLWJhY2sgcG9saWN5ICovCisJaWYoaHctPm1hY190eXBlID4gZTEwMDBfODI1NDQpIHsKKwkJY3RybCA9IEUxMDAwX1JFQURfUkVHKGh3LCBUWERDVEwpOworCQljdHJsID0gKGN0cmwgJiB+RTEwMDBfVFhEQ1RMX1dUSFJFU0gpIHwgRTEwMDBfVFhEQ1RMX0ZVTExfVFhfREVTQ19XQjsKKwkJRTEwMDBfV1JJVEVfUkVHKGh3LCBUWERDVEwsIGN0cmwpOworCX0KKworI2lmIDAKKwkvKiBDbGVhciBhbGwgb2YgdGhlIHN0YXRpc3RpY3MgcmVnaXN0ZXJzIChjbGVhciBvbiByZWFkKS4gIEl0IGlzCisJICogaW1wb3J0YW50IHRoYXQgd2UgZG8gdGhpcyBhZnRlciB3ZSBoYXZlIHRyaWVkIHRvIGVzdGFibGlzaCBsaW5rCisJICogYmVjYXVzZSB0aGUgc3ltYm9sIGVycm9yIGNvdW50IHdpbGwgaW5jcmVtZW50IHdpbGRseSBpZiB0aGVyZQorCSAqIGlzIG5vIGxpbmsuCisJICovCisJZTEwMDBfY2xlYXJfaHdfY250cnMoaHcpOworI2VuZGlmCisKKwlyZXR1cm4gcmV0X3ZhbDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQWRqdXN0IFNFUkRFUyBvdXRwdXQgYW1wbGl0dWRlIGJhc2VkIG9uIEVFUFJPTSBzZXR0aW5nLgorICoKKyAqIGh3IC0gU3RydWN0IGNvbnRhaW5pbmcgdmFyaWFibGVzIGFjY2Vzc2VkIGJ5IHNoYXJlZCBjb2RlLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludDMyX3QKK2UxMDAwX2FkanVzdF9zZXJkZXNfYW1wbGl0dWRlKHN0cnVjdCBlMTAwMF9odyAqaHcpCit7CisJdWludDE2X3QgZWVwcm9tX2RhdGE7CisJaW50MzJfdCAgcmV0X3ZhbDsKKworCURFQlVHRlVOQygiZTEwMDBfYWRqdXN0X3NlcmRlc19hbXBsaXR1ZGUiKTsKKworCWlmKGh3LT5tZWRpYV90eXBlICE9IGUxMDAwX21lZGlhX3R5cGVfaW50ZXJuYWxfc2VyZGVzKQorCQlyZXR1cm4gRTEwMDBfU1VDQ0VTUzsKKworCXN3aXRjaChody0+bWFjX3R5cGUpIHsKKwkJY2FzZSBlMTAwMF84MjU0NV9yZXZfMzoKKwkJY2FzZSBlMTAwMF84MjU0Nl9yZXZfMzoKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcmV0dXJuIEUxMDAwX1NVQ0NFU1M7CisJfQorCisJaWYgKChyZXRfdmFsID0gZTEwMDBfcmVhZF9lZXByb20oaHcsIEVFUFJPTV9TRVJERVNfQU1QTElUVURFLCAxLAorCQkJCQkmZWVwcm9tX2RhdGEpKSkgeworCQlyZXR1cm4gcmV0X3ZhbDsKKwl9CisKKwlpZihlZXByb21fZGF0YSAhPSBFRVBST01fUkVTRVJWRURfV09SRCkgeworCQkvKiBBZGp1c3QgU0VSREVTIG91dHB1dCBhbXBsaXR1ZGUgb25seS4gKi8KKwkJZWVwcm9tX2RhdGEgJj0gRUVQUk9NX1NFUkRFU19BTVBMSVRVREVfTUFTSzsKKwkJaWYoKHJldF92YWwgPSBlMTAwMF93cml0ZV9waHlfcmVnKGh3LCBNODhFMTAwMF9QSFlfRVhUX0NUUkwsCisJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZXByb21fZGF0YSkpKQorCQkJcmV0dXJuIHJldF92YWw7CisJfQorCisJcmV0dXJuIEUxMDAwX1NVQ0NFU1M7Cit9CisJCQkJCQkJCSAgIAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29uZmlndXJlcyBmbG93IGNvbnRyb2wgYW5kIGxpbmsgc2V0dGluZ3MuCisgKiAKKyAqIGh3IC0gU3RydWN0IGNvbnRhaW5pbmcgdmFyaWFibGVzIGFjY2Vzc2VkIGJ5IHNoYXJlZCBjb2RlCisgKiAKKyAqIERldGVybWluZXMgd2hpY2ggZmxvdyBjb250cm9sIHNldHRpbmdzIHRvIHVzZS4gQ2FsbHMgdGhlIGFwcm9wcmlhdGUgbWVkaWEtCisgKiBzcGVjaWZpYyBsaW5rIGNvbmZpZ3VyYXRpb24gZnVuY3Rpb24uIENvbmZpZ3VyZXMgdGhlIGZsb3cgY29udHJvbCBzZXR0aW5ncy4KKyAqIEFzc3VtaW5nIHRoZSBhZGFwdGVyIGhhcyBhIHZhbGlkIGxpbmsgcGFydG5lciwgYSB2YWxpZCBsaW5rIHNob3VsZCBiZQorICogZXN0YWJsaXNoZWQuIEFzc3VtZXMgdGhlIGhhcmR3YXJlIGhhcyBwcmV2aW91c2x5IGJlZW4gcmVzZXQgYW5kIHRoZSAKKyAqIHRyYW5zbWl0dGVyIGFuZCByZWNlaXZlciBhcmUgbm90IGVuYWJsZWQuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50CitlMTAwMF9zZXR1cF9saW5rKHN0cnVjdCBlMTAwMF9odyAqaHcpCit7CisJdWludDMyX3QgY3RybF9leHQ7CisJaW50MzJfdCByZXRfdmFsOworCXVpbnQxNl90IGVlcHJvbV9kYXRhOworCisJREVCVUdGVU5DKCJlMTAwMF9zZXR1cF9saW5rIik7CisJCisJLyogUmVhZCBhbmQgc3RvcmUgd29yZCAweDBGIG9mIHRoZSBFRVBST00uIFRoaXMgd29yZCBjb250YWlucyBiaXRzCisJICogdGhhdCBkZXRlcm1pbmUgdGhlIGhhcmR3YXJlJ3MgZGVmYXVsdCBQQVVTRSAoZmxvdyBjb250cm9sKSBtb2RlLAorCSAqIGEgYml0IHRoYXQgZGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBIVyBkZWZhdWx0cyB0byBlbmFibGluZyBvcgorCSAqIGRpc2FibGluZyBhdXRvLW5lZ290aWF0aW9uLCBhbmQgdGhlIGRpcmVjdGlvbiBvZiB0aGUKKwkgKiBTVyBkZWZpbmVkIHBpbnMuIElmIHRoZXJlIGlzIG5vIFNXIG92ZXItcmlkZSBvZiB0aGUgZmxvdworCSAqIGNvbnRyb2wgc2V0dGluZywgdGhlbiB0aGUgdmFyaWFibGUgaHctPmZjIHdpbGwKKwkgKiBiZSBpbml0aWFsaXplZCBiYXNlZCBvbiBhIHZhbHVlIGluIHRoZSBFRVBST00uCisJICovCisJaWYoZTEwMDBfcmVhZF9lZXByb20oaHcsIEVFUFJPTV9JTklUX0NPTlRST0wyX1JFRywgMSwgJmVlcHJvbV9kYXRhKSA8IDApIHsKKwkJREVCVUdPVVQoIkVFUFJPTSBSZWFkIEVycm9yXG4iKTsKKwkJcmV0dXJuIC1FMTAwMF9FUlJfRUVQUk9NOworCX0KKwkKKwlpZihody0+ZmMgPT0gZTEwMDBfZmNfZGVmYXVsdCkgeworCQlpZigoZWVwcm9tX2RhdGEgJiBFRVBST01fV09SRDBGX1BBVVNFX01BU0spID09IDApCisJCQlody0+ZmMgPSBlMTAwMF9mY19ub25lOworCQllbHNlIGlmKChlZXByb21fZGF0YSAmIEVFUFJPTV9XT1JEMEZfUEFVU0VfTUFTSykgPT0gCisJCQlFRVBST01fV09SRDBGX0FTTV9ESVIpCisJCQlody0+ZmMgPSBlMTAwMF9mY190eF9wYXVzZTsKKwkJZWxzZQorCQkJaHctPmZjID0gZTEwMDBfZmNfZnVsbDsKKwl9CisJCisJLyogV2Ugd2FudCB0byBzYXZlIG9mZiB0aGUgb3JpZ2luYWwgRmxvdyBDb250cm9sIGNvbmZpZ3VyYXRpb24ganVzdAorCSAqIGluIGNhc2Ugd2UgZ2V0IGRpc2Nvbm5lY3RlZCBhbmQgdGhlbiByZWNvbm5lY3RlZCBpbnRvIGEgZGlmZmVyZW50CisJICogaHViIG9yIHN3aXRjaCB3aXRoIGRpZmZlcmVudCBGbG93IENvbnRyb2wgY2FwYWJpbGl0aWVzLgorCSAqLworCWlmKGh3LT5tYWNfdHlwZSA9PSBlMTAwMF84MjU0Ml9yZXYyXzApCisJCWh3LT5mYyAmPSAofmUxMDAwX2ZjX3R4X3BhdXNlKTsKKworI2lmIDAKKwkvKiBTZWUgZTEwMDBfc3dfaW5pdCgpIG9mIHRoZSBMaW51eCBkcml2ZXIgKi8KKwlpZigoaHctPm1hY190eXBlIDwgZTEwMDBfODI1NDMpICYmIChody0+cmVwb3J0X3R4X2Vhcmx5ID09IDEpKQorI2Vsc2UKKwlpZigoaHctPm1hY190eXBlIDwgZTEwMDBfODI1NDMpICYmIChody0+bWFjX3R5cGUgPj0gZTEwMDBfODI1NDMpKQorI2VuZGlmCisJCWh3LT5mYyAmPSAofmUxMDAwX2ZjX3J4X3BhdXNlKTsKKwkKKyNpZiAwCisJaHctPm9yaWdpbmFsX2ZjID0gaHctPmZjOworI2VuZGlmCisKKwlERUJVR09VVDEoIkFmdGVyIGZpeC11cHMgRmxvd0NvbnRyb2wgaXMgbm93ID0gJXhcbiIsIGh3LT5mYyk7CisJCisJLyogVGFrZSB0aGUgNCBiaXRzIGZyb20gRUVQUk9NIHdvcmQgMHgwRiB0aGF0IGRldGVybWluZSB0aGUgaW5pdGlhbAorCSAqIHBvbGFyaXR5IHZhbHVlIGZvciB0aGUgU1cgY29udHJvbGxlZCBwaW5zLCBhbmQgc2V0dXAgdGhlCisJICogRXh0ZW5kZWQgRGV2aWNlIENvbnRyb2wgcmVnIHdpdGggdGhhdCBpbmZvLgorCSAqIFRoaXMgaXMgbmVlZGVkIGJlY2F1c2Ugb25lIG9mIHRoZSBTVyBjb250cm9sbGVkIHBpbnMgaXMgdXNlZCBmb3IKKwkgKiBzaWduYWwgZGV0ZWN0aW9uLiAgU28gdGhpcyBzaG91bGQgYmUgZG9uZSBiZWZvcmUgZTEwMDBfc2V0dXBfcGNzX2xpbmsoKQorCSAqIG9yIGUxMDAwX3BoeV9zZXR1cCgpIGlzIGNhbGxlZC4KKwkgKi8KKwlpZihody0+bWFjX3R5cGUgPT0gZTEwMDBfODI1NDMpIHsKKwkJY3RybF9leHQgPSAoKGVlcHJvbV9kYXRhICYgRUVQUk9NX1dPUkQwRl9TV1BESU9fRVhUKSA8PCAKKwkJCVNXRFBJT19fRVhUX1NISUZUKTsKKwkJRTEwMDBfV1JJVEVfUkVHKGh3LCBDVFJMX0VYVCwgY3RybF9leHQpOworCX0KKwkKKwkvKiBDYWxsIHRoZSBuZWNlc3Nhcnkgc3Vicm91dGluZSB0byBjb25maWd1cmUgdGhlIGxpbmsuICovCisJcmV0X3ZhbCA9IChody0+bWVkaWFfdHlwZSA9PSBlMTAwMF9tZWRpYV90eXBlX2NvcHBlcikgPworCQllMTAwMF9zZXR1cF9jb3BwZXJfbGluayhodykgOgorCQllMTAwMF9zZXR1cF9maWJlcl9zZXJkZXNfbGluayhodyk7CisJaWYgKHJldF92YWwgPCAwKSB7CisJCXJldHVybiByZXRfdmFsOworCX0KKwkKKwkvKiBJbml0aWFsaXplIHRoZSBmbG93IGNvbnRyb2wgYWRkcmVzcywgdHlwZSwgYW5kIFBBVVNFIHRpbWVyCisJICogcmVnaXN0ZXJzIHRvIHRoZWlyIGRlZmF1bHQgdmFsdWVzLiAgVGhpcyBpcyBkb25lIGV2ZW4gaWYgZmxvdworCSAqIGNvbnRyb2wgaXMgZGlzYWJsZWQsIGJlY2F1c2UgaXQgZG9lcyBub3QgaHVydCBhbnl0aGluZyB0bworCSAqIGluaXRpYWxpemUgdGhlc2UgcmVnaXN0ZXJzLgorCSAqLworCURFQlVHT1VUKCJJbml0aWFsaXppbmcgdGhlIEZsb3cgQ29udHJvbCBhZGRyZXNzLCB0eXBlIGFuZCB0aW1lciByZWdzXG4iKTsKKwkKKwlFMTAwMF9XUklURV9SRUcoaHcsIEZDQUwsIEZMT1dfQ09OVFJPTF9BRERSRVNTX0xPVyk7CisJRTEwMDBfV1JJVEVfUkVHKGh3LCBGQ0FILCBGTE9XX0NPTlRST0xfQUREUkVTU19ISUdIKTsKKwlFMTAwMF9XUklURV9SRUcoaHcsIEZDVCwgRkxPV19DT05UUk9MX1RZUEUpOworI2lmIDAKKwlFMTAwMF9XUklURV9SRUcoaHcsIEZDVFRWLCBody0+ZmNfcGF1c2VfdGltZSk7CisjZWxzZQorCUUxMDAwX1dSSVRFX1JFRyhodywgRkNUVFYsIEZDX0RFRkFVTFRfVFhfVElNRVIpOworI2VuZGlmCisJCisJLyogU2V0IHRoZSBmbG93IGNvbnRyb2wgcmVjZWl2ZSB0aHJlc2hvbGQgcmVnaXN0ZXJzLiAgTm9ybWFsbHksCisJICogdGhlc2UgcmVnaXN0ZXJzIHdpbGwgYmUgc2V0IHRvIGEgZGVmYXVsdCB0aHJlc2hvbGQgdGhhdCBtYXkgYmUKKwkgKiBhZGp1c3RlZCBsYXRlciBieSB0aGUgZHJpdmVyJ3MgcnVudGltZSBjb2RlLiAgSG93ZXZlciwgaWYgdGhlCisJICogYWJpbGl0eSB0byB0cmFuc21pdCBwYXVzZSBmcmFtZXMgaW4gbm90IGVuYWJsZWQsIHRoZW4gdGhlc2UKKwkgKiByZWdpc3RlcnMgd2lsbCBiZSBzZXQgdG8gMC4gCisJICovCisJaWYoIShody0+ZmMgJiBlMTAwMF9mY190eF9wYXVzZSkpIHsKKwkJRTEwMDBfV1JJVEVfUkVHKGh3LCBGQ1JUTCwgMCk7CisJCUUxMDAwX1dSSVRFX1JFRyhodywgRkNSVEgsIDApOworCX0gZWxzZSB7CisJCS8qIFdlIG5lZWQgdG8gc2V0IHVwIHRoZSBSZWNlaXZlIFRocmVzaG9sZCBoaWdoIGFuZCBsb3cgd2F0ZXIgbWFya3MKKwkJICogYXMgd2VsbCBhcyAob3B0aW9uYWxseSkgZW5hYmxpbmcgdGhlIHRyYW5zbWlzc2lvbiBvZiBYT04gZnJhbWVzLgorCQkgKi8KKyNpZiAwCisJCWlmKGh3LT5mY19zZW5kX3hvbikgeworCQkJRTEwMDBfV1JJVEVfUkVHKGh3LCBGQ1JUTCwgKGh3LT5mY19sb3dfd2F0ZXIgfCBFMTAwMF9GQ1JUTF9YT05FKSk7CisJCQlFMTAwMF9XUklURV9SRUcoaHcsIEZDUlRILCBody0+ZmNfaGlnaF93YXRlcik7CisJCX0gZWxzZSB7CisJCQlFMTAwMF9XUklURV9SRUcoaHcsIEZDUlRMLCBody0+ZmNfbG93X3dhdGVyKTsKKwkJCUUxMDAwX1dSSVRFX1JFRyhodywgRkNSVEgsIGh3LT5mY19oaWdoX3dhdGVyKTsKKwkJfQorI2Vsc2UKKwkJRTEwMDBfV1JJVEVfUkVHKGh3LCBGQ1JUTCwgKEZDX0RFRkFVTFRfTE9fVEhSRVNIIHwgRTEwMDBfRkNSVExfWE9ORSkpOworCQlFMTAwMF9XUklURV9SRUcoaHcsIEZDUlRILCBGQ19ERUZBVUxUX0hJX1RIUkVTSCk7CisjZW5kaWYKKwl9CisJcmV0dXJuIHJldF92YWw7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFNldHMgdXAgbGluayBmb3IgYSBmaWJlciBiYXNlZCBvciBzZXJkZXMgYmFzZWQgYWRhcHRlcgorICoKKyAqIGh3IC0gU3RydWN0IGNvbnRhaW5pbmcgdmFyaWFibGVzIGFjY2Vzc2VkIGJ5IHNoYXJlZCBjb2RlCisgKgorICogTWFuaXB1bGF0ZXMgUGh5c2ljYWwgQ29kaW5nIFN1YmxheWVyIGZ1bmN0aW9ucyBpbiBvcmRlciB0byBjb25maWd1cmUKKyAqIGxpbmsuIEFzc3VtZXMgdGhlIGhhcmR3YXJlIGhhcyBiZWVuIHByZXZpb3VzbHkgcmVzZXQgYW5kIHRoZSB0cmFuc21pdHRlcgorICogYW5kIHJlY2VpdmVyIGFyZSBub3QgZW5hYmxlZC4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQKK2UxMDAwX3NldHVwX2ZpYmVyX3NlcmRlc19saW5rKHN0cnVjdCBlMTAwMF9odyAqaHcpCit7CisJdWludDMyX3QgY3RybDsKKwl1aW50MzJfdCBzdGF0dXM7CisJdWludDMyX3QgdHhjdyA9IDA7CisJdWludDMyX3QgaTsKKwl1aW50MzJfdCBzaWduYWwgPSAwOworCWludDMyX3QgcmV0X3ZhbDsKKworCURFQlVHRlVOQygiZTEwMDBfc2V0dXBfZmliZXJfc2VyZGVzX2xpbmsiKTsKKworCS8qIE9uIGFkYXB0ZXJzIHdpdGggYSBNQUMgbmV3ZXIgdGhhbiA4MjU0NCwgU1cgRGVmaW5lYWJsZSBwaW4gMSB3aWxsIGJlIAorCSAqIHNldCB3aGVuIHRoZSBvcHRpY3MgZGV0ZWN0IGEgc2lnbmFsLiBPbiBvbGRlciBhZGFwdGVycywgaXQgd2lsbCBiZSAKKwkgKiBjbGVhcmVkIHdoZW4gdGhlcmUgaXMgYSBzaWduYWwuICBUaGlzIGFwcGxpZXMgdG8gZmliZXIgbWVkaWEgb25seS4KKwkgKiBJZiB3ZSdyZSBvbiBzZXJkZXMgbWVkaWEsIGFkanVzdCB0aGUgb3V0cHV0IGFtcGxpdHVkZSB0byB2YWx1ZSBzZXQgaW4KKwkgKiB0aGUgRUVQUk9NLgorCSAqLworCWN0cmwgPSBFMTAwMF9SRUFEX1JFRyhodywgQ1RSTCk7CisJaWYoaHctPm1lZGlhX3R5cGUgPT0gZTEwMDBfbWVkaWFfdHlwZV9maWJlcikKKwkJc2lnbmFsID0gKGh3LT5tYWNfdHlwZSA+IGUxMDAwXzgyNTQ0KSA/IEUxMDAwX0NUUkxfU1dEUElOMSA6IDA7CisKKwlpZigocmV0X3ZhbCA9IGUxMDAwX2FkanVzdF9zZXJkZXNfYW1wbGl0dWRlKGh3KSkpCisJCXJldHVybiByZXRfdmFsOworCisJLyogVGFrZSB0aGUgbGluayBvdXQgb2YgcmVzZXQgKi8KKwljdHJsICY9IH4oRTEwMDBfQ1RSTF9MUlNUKTsKKworI2lmIDAKKwkvKiBBZGp1c3QgVkNPIHNwZWVkIHRvIGltcHJvdmUgQkVSIHBlcmZvcm1hbmNlICovCisJaWYoKHJldF92YWwgPSBlMTAwMF9zZXRfdmNvX3NwZWVkKGh3KSkpCisJCXJldHVybiByZXRfdmFsOworI2VuZGlmCisKKwllMTAwMF9jb25maWdfY29sbGlzaW9uX2Rpc3QoaHcpOworCQorCS8qIENoZWNrIGZvciBhIHNvZnR3YXJlIG92ZXJyaWRlIG9mIHRoZSBmbG93IGNvbnRyb2wgc2V0dGluZ3MsIGFuZCBzZXR1cAorCSAqIHRoZSBkZXZpY2UgYWNjb3JkaW5nbHkuICBJZiBhdXRvLW5lZ290aWF0aW9uIGlzIGVuYWJsZWQsIHRoZW4gc29mdHdhcmUKKwkgKiB3aWxsIGhhdmUgdG8gc2V0IHRoZSAiUEFVU0UiIGJpdHMgdG8gdGhlIGNvcnJlY3QgdmFsdWUgaW4gdGhlIFRyYW5tc2l0CisJICogQ29uZmlnIFdvcmQgUmVnaXN0ZXIgKFRYQ1cpIGFuZCByZS1zdGFydCBhdXRvLW5lZ290aWF0aW9uLiAgSG93ZXZlciwgaWYKKwkgKiBhdXRvLW5lZ290aWF0aW9uIGlzIGRpc2FibGVkLCB0aGVuIHNvZnR3YXJlIHdpbGwgaGF2ZSB0byBtYW51YWxseSAKKwkgKiBjb25maWd1cmUgdGhlIHR3byBmbG93IGNvbnRyb2wgZW5hYmxlIGJpdHMgaW4gdGhlIENUUkwgcmVnaXN0ZXIuCisJICoKKwkgKiBUaGUgcG9zc2libGUgdmFsdWVzIG9mIHRoZSAiZmMiIHBhcmFtZXRlciBhcmU6CisJICogICAgICAwOiAgRmxvdyBjb250cm9sIGlzIGNvbXBsZXRlbHkgZGlzYWJsZWQKKwkgKiAgICAgIDE6ICBSeCBmbG93IGNvbnRyb2wgaXMgZW5hYmxlZCAod2UgY2FuIHJlY2VpdmUgcGF1c2UgZnJhbWVzLCBidXQgCisJICogICAgICAgICAgbm90IHNlbmQgcGF1c2UgZnJhbWVzKS4KKwkgKiAgICAgIDI6ICBUeCBmbG93IGNvbnRyb2wgaXMgZW5hYmxlZCAod2UgY2FuIHNlbmQgcGF1c2UgZnJhbWVzIGJ1dCB3ZSBkbworCSAqICAgICAgICAgIG5vdCBzdXBwb3J0IHJlY2VpdmluZyBwYXVzZSBmcmFtZXMpLgorCSAqICAgICAgMzogIEJvdGggUnggYW5kIFRYIGZsb3cgY29udHJvbCAoc3ltbWV0cmljKSBhcmUgZW5hYmxlZC4KKwkgKi8KKwlzd2l0Y2ggKGh3LT5mYykgeworCWNhc2UgZTEwMDBfZmNfbm9uZToKKwkJLyogRmxvdyBjb250cm9sIGlzIGNvbXBsZXRlbHkgZGlzYWJsZWQgYnkgYSBzb2Z0d2FyZSBvdmVyLXJpZGUuICovCisJCXR4Y3cgPSAoRTEwMDBfVFhDV19BTkUgfCBFMTAwMF9UWENXX0ZEKTsKKwkJYnJlYWs7CisJY2FzZSBlMTAwMF9mY19yeF9wYXVzZToKKwkJLyogUlggRmxvdyBjb250cm9sIGlzIGVuYWJsZWQgYW5kIFRYIEZsb3cgY29udHJvbCBpcyBkaXNhYmxlZCBieSBhIAorCQkgKiBzb2Z0d2FyZSBvdmVyLXJpZGUuIFNpbmNlIHRoZXJlIHJlYWxseSBpc24ndCBhIHdheSB0byBhZHZlcnRpc2UgCisJCSAqIHRoYXQgd2UgYXJlIGNhcGFibGUgb2YgUlggUGF1c2UgT05MWSwgd2Ugd2lsbCBhZHZlcnRpc2UgdGhhdCB3ZQorCQkgKiBzdXBwb3J0IGJvdGggc3ltbWV0cmljIGFuZCBhc3ltbWV0cmljIFJYIFBBVVNFLiBMYXRlciwgd2Ugd2lsbAorCQkgKiAgZGlzYWJsZSB0aGUgYWRhcHRlcidzIGFiaWxpdHkgdG8gc2VuZCBQQVVTRSBmcmFtZXMuCisJCSAqLworCQl0eGN3ID0gKEUxMDAwX1RYQ1dfQU5FIHwgRTEwMDBfVFhDV19GRCB8IEUxMDAwX1RYQ1dfUEFVU0VfTUFTSyk7CisJCWJyZWFrOworCWNhc2UgZTEwMDBfZmNfdHhfcGF1c2U6CisJCS8qIFRYIEZsb3cgY29udHJvbCBpcyBlbmFibGVkLCBhbmQgUlggRmxvdyBjb250cm9sIGlzIGRpc2FibGVkLCBieSBhIAorCQkgKiBzb2Z0d2FyZSBvdmVyLXJpZGUuCisJCSAqLworCQl0eGN3ID0gKEUxMDAwX1RYQ1dfQU5FIHwgRTEwMDBfVFhDV19GRCB8IEUxMDAwX1RYQ1dfQVNNX0RJUik7CisJCWJyZWFrOworCWNhc2UgZTEwMDBfZmNfZnVsbDoKKwkJLyogRmxvdyBjb250cm9sIChib3RoIFJYIGFuZCBUWCkgaXMgZW5hYmxlZCBieSBhIHNvZnR3YXJlIG92ZXItcmlkZS4gKi8KKwkJdHhjdyA9IChFMTAwMF9UWENXX0FORSB8IEUxMDAwX1RYQ1dfRkQgfCBFMTAwMF9UWENXX1BBVVNFX01BU0spOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlERUJVR09VVCgiRmxvdyBjb250cm9sIHBhcmFtIHNldCBpbmNvcnJlY3RseVxuIik7CisJCXJldHVybiAtRTEwMDBfRVJSX0NPTkZJRzsKKwkJYnJlYWs7CisJfQorCQorCS8qIFNpbmNlIGF1dG8tbmVnb3RpYXRpb24gaXMgZW5hYmxlZCwgdGFrZSB0aGUgbGluayBvdXQgb2YgcmVzZXQgKHRoZSBsaW5rCisJICogd2lsbCBiZSBpbiByZXNldCwgYmVjYXVzZSB3ZSBwcmV2aW91c2x5IHJlc2V0IHRoZSBjaGlwKS4gVGhpcyB3aWxsCisJICogcmVzdGFydCBhdXRvLW5lZ290aWF0aW9uLiAgSWYgYXV0by1uZW9ndGlhdGlvbiBpcyBzdWNjZXNzZnVsIHRoZW4gdGhlCisJICogbGluay11cCBzdGF0dXMgYml0IHdpbGwgYmUgc2V0IGFuZCB0aGUgZmxvdyBjb250cm9sIGVuYWJsZSBiaXRzIChSRkNFCisJICogYW5kIFRGQ0UpIHdpbGwgYmUgc2V0IGFjY29yZGluZyB0byB0aGVpciBuZWdvdGlhdGVkIHZhbHVlLgorCSAqLworCURFQlVHT1VUKCJBdXRvLW5lZ290aWF0aW9uIGVuYWJsZWRcbiIpOworCQorCUUxMDAwX1dSSVRFX1JFRyhodywgVFhDVywgdHhjdyk7CisJRTEwMDBfV1JJVEVfUkVHKGh3LCBDVFJMLCBjdHJsKTsKKwlFMTAwMF9XUklURV9GTFVTSChodyk7CisJCisJaHctPnR4Y3cgPSB0eGN3OworCW1kZWxheSgxKTsKKwkKKwkvKiBJZiB3ZSBoYXZlIGEgc2lnbmFsICh0aGUgY2FibGUgaXMgcGx1Z2dlZCBpbikgdGhlbiBwb2xsIGZvciBhICJMaW5rLVVwIgorCSAqIGluZGljYXRpb24gaW4gdGhlIERldmljZSBTdGF0dXMgUmVnaXN0ZXIuICBUaW1lLW91dCBpZiBhIGxpbmsgaXNuJ3QgCisJICogc2VlbiBpbiA1MDAgbWlsbGlzZWNvbmRzIHNlY29uZHMgKEF1dG8tbmVnb3RpYXRpb24gc2hvdWxkIGNvbXBsZXRlIGluIAorCSAqIGxlc3MgdGhhbiA1MDAgbWlsbGlzZWNvbmRzIGV2ZW4gaWYgdGhlIG90aGVyIGVuZCBpcyBkb2luZyBpdCBpbiBTVykuCisJICogRm9yIGludGVybmFsIHNlcmRlcywgd2UganVzdCBhc3N1bWUgYSBzaWduYWwgaXMgcHJlc2VudCwgdGhlbiBwb2xsLgorCSAqLworCWlmKGh3LT5tZWRpYV90eXBlID09IGUxMDAwX21lZGlhX3R5cGVfaW50ZXJuYWxfc2VyZGVzIHx8CisJICAgKEUxMDAwX1JFQURfUkVHKGh3LCBDVFJMKSAmIEUxMDAwX0NUUkxfU1dEUElOMSkgPT0gc2lnbmFsKSB7CisJCURFQlVHT1VUKCJMb29raW5nIGZvciBMaW5rXG4iKTsKKwkJZm9yKGkgPSAwOyBpIDwgKExJTktfVVBfVElNRU9VVCAvIDEwKTsgaSsrKSB7CisJCQltZGVsYXkoMTApOworCQkJc3RhdHVzID0gRTEwMDBfUkVBRF9SRUcoaHcsIFNUQVRVUyk7CisJCQlpZihzdGF0dXMgJiBFMTAwMF9TVEFUVVNfTFUpIGJyZWFrOworCQl9CisJCWlmKGkgPT0gKExJTktfVVBfVElNRU9VVCAvIDEwKSkgeworCQkJREVCVUdPVVQoIk5ldmVyIGdvdCBhIHZhbGlkIGxpbmsgZnJvbSBhdXRvLW5lZyEhIVxuIik7CisJCQlody0+YXV0b25lZ19mYWlsZWQgPSAxOworCQkJLyogQXV0b05lZyBmYWlsZWQgdG8gYWNoaWV2ZSBhIGxpbmssIHNvIHdlJ2xsIGNhbGwgCisJCQkgKiBlMTAwMF9jaGVja19mb3JfbGluay4gVGhpcyByb3V0aW5lIHdpbGwgZm9yY2UgdGhlIGxpbmsgdXAgaWYKKwkJCSAqIHdlIGRldGVjdCBhIHNpZ25hbC4gVGhpcyB3aWxsIGFsbG93IHVzIHRvIGNvbW11bmljYXRlIHdpdGgKKwkJCSAqIG5vbi1hdXRvbmVnb3RpYXRpbmcgbGluayBwYXJ0bmVycy4KKwkJCSAqLworCQkJaWYoKHJldF92YWwgPSBlMTAwMF9jaGVja19mb3JfbGluayhodykpKSB7CisJCQkJREVCVUdPVVQoIkVycm9yIHdoaWxlIGNoZWNraW5nIGZvciBsaW5rXG4iKTsKKwkJCQlyZXR1cm4gcmV0X3ZhbDsKKwkJCX0KKwkJCWh3LT5hdXRvbmVnX2ZhaWxlZCA9IDA7CisJCX0gZWxzZSB7CisJCQlody0+YXV0b25lZ19mYWlsZWQgPSAwOworCQkJREVCVUdPVVQoIlZhbGlkIExpbmsgRm91bmRcbiIpOworCQl9CisJfSBlbHNlIHsKKwkJREVCVUdPVVQoIk5vIFNpZ25hbCBEZXRlY3RlZFxuIik7CisJfQorCXJldHVybiBFMTAwMF9TVUNDRVNTOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIERldGVjdHMgd2hpY2ggUEhZIGlzIHByZXNlbnQgYW5kIHRoZSBzcGVlZCBhbmQgZHVwbGV4CisqCisqIGh3IC0gU3RydWN0IGNvbnRhaW5pbmcgdmFyaWFibGVzIGFjY2Vzc2VkIGJ5IHNoYXJlZCBjb2RlCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50CitlMTAwMF9zZXR1cF9jb3BwZXJfbGluayhzdHJ1Y3QgZTEwMDBfaHcgKmh3KQoreworCXVpbnQzMl90IGN0cmw7CisJaW50MzJfdCByZXRfdmFsOworCXVpbnQxNl90IGk7CisJdWludDE2X3QgcGh5X2RhdGE7CisJCisJREVCVUdGVU5DKCJlMTAwMF9zZXR1cF9jb3BwZXJfbGluayIpOworCQorCWN0cmwgPSBFMTAwMF9SRUFEX1JFRyhodywgQ1RSTCk7CisJLyogV2l0aCA4MjU0Mywgd2UgbmVlZCB0byBmb3JjZSBzcGVlZCBhbmQgZHVwbGV4IG9uIHRoZSBNQUMgZXF1YWwgdG8gd2hhdAorCSAqIHRoZSBQSFkgc3BlZWQgYW5kIGR1cGxleCBjb25maWd1cmF0aW9uIGlzLiBJbiBhZGRpdGlvbiwgd2UgbmVlZCB0bworCSAqIHBlcmZvcm0gYSBoYXJkd2FyZSByZXNldCBvbiB0aGUgUEhZIHRvIHRha2UgaXQgb3V0IG9mIHJlc2V0LgorCSAqLworCWlmKGh3LT5tYWNfdHlwZSA+IGUxMDAwXzgyNTQzKSB7CisJCWN0cmwgfD0gRTEwMDBfQ1RSTF9TTFU7CisJCWN0cmwgJj0gfihFMTAwMF9DVFJMX0ZSQ1NQRCB8IEUxMDAwX0NUUkxfRlJDRFBYKTsKKwkJRTEwMDBfV1JJVEVfUkVHKGh3LCBDVFJMLCBjdHJsKTsKKwl9IGVsc2UgeworCQljdHJsIHw9IChFMTAwMF9DVFJMX0ZSQ1NQRCB8IEUxMDAwX0NUUkxfRlJDRFBYIHwgRTEwMDBfQ1RSTF9TTFUpOworCQlFMTAwMF9XUklURV9SRUcoaHcsIENUUkwsIGN0cmwpOworCQllMTAwMF9waHlfaHdfcmVzZXQoaHcpOworCX0KKwkKKwkvKiBNYWtlIHN1cmUgd2UgaGF2ZSBhIHZhbGlkIFBIWSAqLworCWlmKChyZXRfdmFsID0gZTEwMDBfZGV0ZWN0X2dpZ19waHkoaHcpKSkgeworCQlERUJVR09VVCgiRXJyb3IsIGRpZCBub3QgZGV0ZWN0IHZhbGlkIHBoeS5cbiIpOworCQlyZXR1cm4gcmV0X3ZhbDsKKwl9CisJREVCVUdPVVQxKCJQaHkgSUQgPSAleCBcbiIsIGh3LT5waHlfaWQpOworCisJaWYoaHctPm1hY190eXBlIDw9IGUxMDAwXzgyNTQzIHx8CisJICAgaHctPm1hY190eXBlID09IGUxMDAwXzgyNTQxIHx8IGh3LT5tYWNfdHlwZSA9PSBlMTAwMF84MjU0NyB8fAorI2lmIDAKKwkgICBody0+bWFjX3R5cGUgPT0gZTEwMDBfODI1NDFfcmV2XzIgfHwgaHctPm1hY190eXBlID09IGUxMDAwXzgyNTQ3X3Jldl8yKQorCQlody0+cGh5X3Jlc2V0X2Rpc2FibGUgPSBGQUxTRTsKKworCWlmKCFody0+cGh5X3Jlc2V0X2Rpc2FibGUpIHsKKyNlbHNlCisJICAgaHctPm1hY190eXBlID09IGUxMDAwXzgyNTQxX3Jldl8yIHx8IGh3LT5tYWNfdHlwZSA9PSBlMTAwMF84MjU0N19yZXZfMikgeworI2VuZGlmCisJaWYgKGh3LT5waHlfdHlwZSA9PSBlMTAwMF9waHlfaWdwKSB7CisKKwkJaWYoKHJldF92YWwgPSBlMTAwMF9waHlfcmVzZXQoaHcpKSkgeworCQkJREVCVUdPVVQoIkVycm9yIFJlc2V0dGluZyB0aGUgUEhZXG4iKTsKKwkJCXJldHVybiByZXRfdmFsOworCQl9CisKKwkJLyogV2FpdCAxMG1zIGZvciBNQUMgdG8gY29uZmlndXJlIFBIWSBmcm9tIGVlcHJvbSBzZXR0aW5ncyAqLworCQltZGVsYXkoMTUpOworCisjaWYgMAorCQkvKiBkaXNhYmxlIGxwbHUgZDMgZHVyaW5nIGRyaXZlciBpbml0ICovCisJCWlmKChyZXRfdmFsID0gZTEwMDBfc2V0X2QzX2xwbHVfc3RhdGUoaHcsIEZBTFNFKSkpIHsKKwkJCURFQlVHT1VUKCJFcnJvciBEaXNhYmxpbmcgTFBMVSBEM1xuIik7CisJCQlyZXR1cm4gcmV0X3ZhbDsKKwkJfQorCisJCS8qIENvbmZpZ3VyZSBtZGktbWRpeCBzZXR0aW5ncyAqLworCQlpZigocmV0X3ZhbCA9IGUxMDAwX3JlYWRfcGh5X3JlZyhodywgSUdQMDFFMTAwMF9QSFlfUE9SVF9DVFJMLAorCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGh5X2RhdGEpKSkKKwkJCXJldHVybiByZXRfdmFsOworCisJCWlmKChody0+bWFjX3R5cGUgPT0gZTEwMDBfODI1NDEpIHx8IChody0+bWFjX3R5cGUgPT0gZTEwMDBfODI1NDcpKSB7CisJCQlody0+ZHNwX2NvbmZpZ19zdGF0ZSA9IGUxMDAwX2RzcF9jb25maWdfZGlzYWJsZWQ7CisJCQkvKiBGb3JjZSBNREkgZm9yIElHUCBCLTAgUEhZICovCisJCQlwaHlfZGF0YSAmPSB+KElHUDAxRTEwMDBfUFNDUl9BVVRPX01ESVggfAorCQkJICAgICAgICAgICAgICBJR1AwMUUxMDAwX1BTQ1JfRk9SQ0VfTURJX01ESVgpOworCQkJaHctPm1kaXggPSAxOworCisJCX0gZWxzZSB7CisJCQlody0+ZHNwX2NvbmZpZ19zdGF0ZSA9IGUxMDAwX2RzcF9jb25maWdfZW5hYmxlZDsKKwkJCXBoeV9kYXRhICY9IH5JR1AwMUUxMDAwX1BTQ1JfQVVUT19NRElYOworCisJCQlzd2l0Y2ggKGh3LT5tZGl4KSB7CisJCQljYXNlIDE6CisJCQkJcGh5X2RhdGEgJj0gfklHUDAxRTEwMDBfUFNDUl9GT1JDRV9NRElfTURJWDsKKwkJCQlicmVhazsKKwkJCWNhc2UgMjoKKwkJCQlwaHlfZGF0YSB8PSBJR1AwMUUxMDAwX1BTQ1JfRk9SQ0VfTURJX01ESVg7CisJCQkJYnJlYWs7CisJCQljYXNlIDA6CisJCQlkZWZhdWx0OgorCQkJCXBoeV9kYXRhIHw9IElHUDAxRTEwMDBfUFNDUl9BVVRPX01ESVg7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJaWYoKHJldF92YWwgPSBlMTAwMF93cml0ZV9waHlfcmVnKGh3LCBJR1AwMUUxMDAwX1BIWV9QT1JUX0NUUkwsCisJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlfZGF0YSkpKQorCQkJcmV0dXJuIHJldF92YWw7CisKKwkJLyogc2V0IGF1dG8tbWFzdGVyIHNsYXZlIHJlc29sdXRpb24gc2V0dGluZ3MgKi8KKwkJZTEwMDBfbXNfdHlwZSBwaHlfbXNfc2V0dGluZyA9IGh3LT5tYXN0ZXJfc2xhdmU7CisKKwkJaWYoaHctPmZmZV9jb25maWdfc3RhdGUgPT0gZTEwMDBfZmZlX2NvbmZpZ19hY3RpdmUpCisJCQlody0+ZmZlX2NvbmZpZ19zdGF0ZSA9IGUxMDAwX2ZmZV9jb25maWdfZW5hYmxlZDsKKworCQlpZihody0+ZHNwX2NvbmZpZ19zdGF0ZSA9PSBlMTAwMF9kc3BfY29uZmlnX2FjdGl2YXRlZCkKKwkJCWh3LT5kc3BfY29uZmlnX3N0YXRlID0gZTEwMDBfZHNwX2NvbmZpZ19lbmFibGVkOworI2VuZGlmCisKKwkJLyogd2hlbiBhdXRvbmVnb3RpYXRpb24gYWR2ZXJ0aXNtZW50IGlzIG9ubHkgMTAwME1icHMgdGhlbiB3ZQorCQkgKiBzaG91bGQgZGlzYWJsZSBTbWFydFNwZWVkIGFuZCBlbmFibGUgQXV0byBNYXN0ZXJTbGF2ZQorCQkgKiByZXNvbHV0aW9uIGFzIGhhcmR3YXJlIGRlZmF1bHQuICovCisJCWlmKGh3LT5hdXRvbmVnX2FkdmVydGlzZWQgPT0gQURWRVJUSVNFXzEwMDBfRlVMTCkgeworCQkJLyogRGlzYWJsZSBTbWFydFNwZWVkICovCisJCQlpZigocmV0X3ZhbCA9IGUxMDAwX3JlYWRfcGh5X3JlZyhodywKKwkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElHUDAxRTEwMDBfUEhZX1BPUlRfQ09ORklHLAorCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBoeV9kYXRhKSkpCisJCQkJcmV0dXJuIHJldF92YWw7CisJCQlwaHlfZGF0YSAmPSB+SUdQMDFFMTAwMF9QU0NGUl9TTUFSVF9TUEVFRDsKKwkJCWlmKChyZXRfdmFsID0gZTEwMDBfd3JpdGVfcGh5X3JlZyhodywKKwkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJR1AwMUUxMDAwX1BIWV9QT1JUX0NPTkZJRywKKwkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlfZGF0YSkpKQorCQkJCXJldHVybiByZXRfdmFsOworCQkJLyogU2V0IGF1dG8gTWFzdGVyL1NsYXZlIHJlc29sdXRpb24gcHJvY2VzcyAqLworCQkJaWYoKHJldF92YWwgPSBlMTAwMF9yZWFkX3BoeV9yZWcoaHcsIFBIWV8xMDAwVF9DVFJMLAorCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBoeV9kYXRhKSkpCisJCQkJcmV0dXJuIHJldF92YWw7CisJCQlwaHlfZGF0YSAmPSB+Q1JfMTAwMFRfTVNfRU5BQkxFOworCQkJaWYoKHJldF92YWwgPSBlMTAwMF93cml0ZV9waHlfcmVnKGh3LCBQSFlfMTAwMFRfQ1RSTCwKKwkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlfZGF0YSkpKQorCQkJCXJldHVybiByZXRfdmFsOworCQl9CisKKwkJaWYoKHJldF92YWwgPSBlMTAwMF9yZWFkX3BoeV9yZWcoaHcsIFBIWV8xMDAwVF9DVFJMLAorCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGh5X2RhdGEpKSkKKwkJCXJldHVybiByZXRfdmFsOworCisjaWYgMAorCQkvKiBsb2FkIGRlZmF1bHRzIGZvciBmdXR1cmUgdXNlICovCisJCWh3LT5vcmlnaW5hbF9tYXN0ZXJfc2xhdmUgPSAocGh5X2RhdGEgJiBDUl8xMDAwVF9NU19FTkFCTEUpID8KKwkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICgocGh5X2RhdGEgJiBDUl8xMDAwVF9NU19WQUxVRSkgPworCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUxMDAwX21zX2ZvcmNlX21hc3RlciA6CisJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZTEwMDBfbXNfZm9yY2Vfc2xhdmUpIDoKKwkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlMTAwMF9tc19hdXRvOworCisJCXN3aXRjaCAocGh5X21zX3NldHRpbmcpIHsKKwkJY2FzZSBlMTAwMF9tc19mb3JjZV9tYXN0ZXI6CisJCQlwaHlfZGF0YSB8PSAoQ1JfMTAwMFRfTVNfRU5BQkxFIHwgQ1JfMTAwMFRfTVNfVkFMVUUpOworCQkJYnJlYWs7CisJCWNhc2UgZTEwMDBfbXNfZm9yY2Vfc2xhdmU6CisJCQlwaHlfZGF0YSB8PSBDUl8xMDAwVF9NU19FTkFCTEU7CisJCQlwaHlfZGF0YSAmPSB+KENSXzEwMDBUX01TX1ZBTFVFKTsKKwkJCWJyZWFrOworCQljYXNlIGUxMDAwX21zX2F1dG86CisJCQlwaHlfZGF0YSAmPSB+Q1JfMTAwMFRfTVNfRU5BQkxFOworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJCX0KKyNlbmRpZgorCisJCWlmKChyZXRfdmFsID0gZTEwMDBfd3JpdGVfcGh5X3JlZyhodywgUEhZXzEwMDBUX0NUUkwsCisJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlfZGF0YSkpKQorCQkJcmV0dXJuIHJldF92YWw7CisJfSBlbHNlIHsKKwkJLyogRW5hYmxlIENSUyBvbiBUWC4gVGhpcyBtdXN0IGJlIHNldCBmb3IgaGFsZi1kdXBsZXggb3BlcmF0aW9uLiAqLworCQlpZigocmV0X3ZhbCA9IGUxMDAwX3JlYWRfcGh5X3JlZyhodywgTTg4RTEwMDBfUEhZX1NQRUNfQ1RSTCwKKwkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBoeV9kYXRhKSkpCisJCQlyZXR1cm4gcmV0X3ZhbDsKKworCQlwaHlfZGF0YSB8PSBNODhFMTAwMF9QU0NSX0FTU0VSVF9DUlNfT05fVFg7CisKKwkJLyogT3B0aW9uczoKKwkJICogICBNREkvTURJLVggPSAwIChkZWZhdWx0KQorCQkgKiAgIDAgLSBBdXRvIGZvciBhbGwgc3BlZWRzCisJCSAqICAgMSAtIE1ESSBtb2RlCisJCSAqICAgMiAtIE1ESS1YIG1vZGUKKwkJICogICAzIC0gQXV0byBmb3IgMTAwMEJhc2UtVCBvbmx5IChNREktWCBmb3IgMTAvMTAwQmFzZS1UIG1vZGVzKQorCQkgKi8KKyNpZiAwCisJCXBoeV9kYXRhICY9IH5NODhFMTAwMF9QU0NSX0FVVE9fWF9NT0RFOworCisJCXN3aXRjaCAoaHctPm1kaXgpIHsKKwkJY2FzZSAxOgorCQkJcGh5X2RhdGEgfD0gTTg4RTEwMDBfUFNDUl9NRElfTUFOVUFMX01PREU7CisJCQlicmVhazsKKwkJY2FzZSAyOgorCQkJcGh5X2RhdGEgfD0gTTg4RTEwMDBfUFNDUl9NRElYX01BTlVBTF9NT0RFOworCQkJYnJlYWs7CisJCWNhc2UgMzoKKwkJCXBoeV9kYXRhIHw9IE04OEUxMDAwX1BTQ1JfQVVUT19YXzEwMDBUOworCQkJYnJlYWs7CisJCWNhc2UgMDoKKwkJZGVmYXVsdDoKKyNlbmRpZgorCQkJcGh5X2RhdGEgfD0gTTg4RTEwMDBfUFNDUl9BVVRPX1hfTU9ERTsKKyNpZiAwCisJCQlicmVhazsKKwkJfQorI2VuZGlmCisKKwkJLyogT3B0aW9uczoKKwkJICogICBkaXNhYmxlX3BvbGFyaXR5X2NvcnJlY3Rpb24gPSAwIChkZWZhdWx0KQorCQkgKiAgICAgICBBdXRvbWF0aWMgQ29ycmVjdGlvbiBmb3IgUmV2ZXJzZWQgQ2FibGUgUG9sYXJpdHkKKwkJICogICAwIC0gRGlzYWJsZWQKKwkJICogICAxIC0gRW5hYmxlZAorCQkgKi8KKwkJcGh5X2RhdGEgJj0gfk04OEUxMDAwX1BTQ1JfUE9MQVJJVFlfUkVWRVJTQUw7CisJCWlmKChyZXRfdmFsID0gZTEwMDBfd3JpdGVfcGh5X3JlZyhodywgTTg4RTEwMDBfUEhZX1NQRUNfQ1RSTCwKKwkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeV9kYXRhKSkpCisJCQlyZXR1cm4gcmV0X3ZhbDsKKworCQkvKiBGb3JjZSBUWF9DTEsgaW4gdGhlIEV4dGVuZGVkIFBIWSBTcGVjaWZpYyBDb250cm9sIFJlZ2lzdGVyCisJCSAqIHRvIDI1TUh6IGNsb2NrLgorCQkgKi8KKwkJaWYoKHJldF92YWwgPSBlMTAwMF9yZWFkX3BoeV9yZWcoaHcsIE04OEUxMDAwX0VYVF9QSFlfU1BFQ19DVFJMLAorCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGh5X2RhdGEpKSkKKwkJCXJldHVybiByZXRfdmFsOworCisJCXBoeV9kYXRhIHw9IE04OEUxMDAwX0VQU0NSX1RYX0NMS18yNTsKKworI2lmZGVmIExJTlVYX0RSSVZFUgorCQlpZiAoaHctPnBoeV9yZXZpc2lvbiA8IE04OEUxMDExX0lfUkVWXzQpIHsKKyNlbmRpZgorCQkJLyogQ29uZmlndXJlIE1hc3RlciBhbmQgU2xhdmUgZG93bnNoaWZ0IHZhbHVlcyAqLworCQkJcGh5X2RhdGEgJj0gfihNODhFMTAwMF9FUFNDUl9NQVNURVJfRE9XTlNISUZUX01BU0sgfAorCQkJCU04OEUxMDAwX0VQU0NSX1NMQVZFX0RPV05TSElGVF9NQVNLKTsKKwkJCXBoeV9kYXRhIHw9IChNODhFMTAwMF9FUFNDUl9NQVNURVJfRE9XTlNISUZUXzFYIHwKKwkJCQlNODhFMTAwMF9FUFNDUl9TTEFWRV9ET1dOU0hJRlRfMVgpOworCQkJaWYoKHJldF92YWwgPSBlMTAwMF93cml0ZV9waHlfcmVnKGh3LAorCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE04OEUxMDAwX0VYVF9QSFlfU1BFQ19DVFJMLAorCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeV9kYXRhKSkpCisJCQkJcmV0dXJuIHJldF92YWw7CisJCX0KKwkKKwkJLyogU1cgUmVzZXQgdGhlIFBIWSBzbyBhbGwgY2hhbmdlcyB0YWtlIGVmZmVjdCAqLworCQlpZigocmV0X3ZhbCA9IGUxMDAwX3BoeV9yZXNldChodykpKSB7CisJCQlERUJVR09VVCgiRXJyb3IgUmVzZXR0aW5nIHRoZSBQSFlcbiIpOworCQkJcmV0dXJuIHJldF92YWw7CisjaWZkZWYgTElOVVhfRFJJVkVSCisJCX0KKyNlbmRpZgorCX0KKwkKKwkvKiBPcHRpb25zOgorCSAqICAgYXV0b25lZyA9IDEgKGRlZmF1bHQpCisJICogICAgICBQSFkgd2lsbCBhZHZlcnRpc2UgdmFsdWUocykgcGFyc2VkIGZyb20KKwkgKiAgICAgIGF1dG9uZWdfYWR2ZXJ0aXNlZCBhbmQgZmMKKwkgKiAgIGF1dG9uZWcgPSAwCisJICogICAgICBQSFkgd2lsbCBiZSBzZXQgdG8gMTBILCAxMEYsIDEwMEgsIG9yIDEwMEYKKwkgKiAgICAgIGRlcGVuZGluZyBvbiB2YWx1ZSBwYXJzZWQgZnJvbSBmb3JjZWRfc3BlZWRfZHVwbGV4LgorCSAqLworCQorCS8qIElzIGF1dG9uZWcgZW5hYmxlZD8gIFRoaXMgaXMgZW5hYmxlZCBieSBkZWZhdWx0IG9yIGJ5IHNvZnR3YXJlCisJICogb3ZlcnJpZGUuICBJZiBzbywgY2FsbCBlMTAwMF9waHlfc2V0dXBfYXV0b25lZyByb3V0aW5lIHRvIHBhcnNlIHRoZQorCSAqIGF1dG9uZWdfYWR2ZXJ0aXNlZCBhbmQgZmMgb3B0aW9ucy4gSWYgYXV0b25lZyBpcyBOT1QgZW5hYmxlZCwgdGhlbgorCSAqIHRoZSB1c2VyIHNob3VsZCBoYXZlIHByb3ZpZGVkIGEgc3BlZWQvZHVwbGV4IG92ZXJyaWRlLiAgSWYgc28sIHRoZW4KKwkgKiBjYWxsIGUxMDAwX3BoeV9mb3JjZV9zcGVlZF9kdXBsZXggdG8gcGFyc2UgYW5kIHNldCB0aGlzIHVwLgorCSAqLworCS8qIFBlcmZvcm0gc29tZSBib3VuZHMgY2hlY2tpbmcgb24gdGhlIGh3LT5hdXRvbmVnX2FkdmVydGlzZWQKKwkgKiBwYXJhbWV0ZXIuICBJZiB0aGlzIHZhcmlhYmxlIGlzIHplcm8sIHRoZW4gc2V0IGl0IHRvIHRoZSBkZWZhdWx0LgorCSAqLworCWh3LT5hdXRvbmVnX2FkdmVydGlzZWQgJj0gQVVUT05FR19BRFZFUlRJU0VfU1BFRURfREVGQVVMVDsKKwkKKwkvKiBJZiBhdXRvbmVnX2FkdmVydGlzZWQgaXMgemVybywgd2UgYXNzdW1lIGl0IHdhcyBub3QgZGVmYXVsdGVkCisJICogYnkgdGhlIGNhbGxpbmcgY29kZSBzbyB3ZSBzZXQgdG8gYWR2ZXJ0aXNlIGZ1bGwgY2FwYWJpbGl0eS4KKwkgKi8KKwlpZihody0+YXV0b25lZ19hZHZlcnRpc2VkID09IDApCisJCWh3LT5hdXRvbmVnX2FkdmVydGlzZWQgPSBBVVRPTkVHX0FEVkVSVElTRV9TUEVFRF9ERUZBVUxUOworCQorCURFQlVHT1VUKCJSZWNvbmZpZ3VyaW5nIGF1dG8tbmVnIGFkdmVydGlzZW1lbnQgcGFyYW1zXG4iKTsKKwlpZigocmV0X3ZhbCA9IGUxMDAwX3BoeV9zZXR1cF9hdXRvbmVnKGh3KSkpIHsKKwkJREVCVUdPVVQoIkVycm9yIFNldHRpbmcgdXAgQXV0by1OZWdvdGlhdGlvblxuIik7CisJCXJldHVybiByZXRfdmFsOworCX0KKwlERUJVR09VVCgiUmVzdGFydGluZyBBdXRvLU5lZ1xuIik7CisJCisJLyogUmVzdGFydCBhdXRvLW5lZ290aWF0aW9uIGJ5IHNldHRpbmcgdGhlIEF1dG8gTmVnIEVuYWJsZSBiaXQgYW5kCisJICogdGhlIEF1dG8gTmVnIFJlc3RhcnQgYml0IGluIHRoZSBQSFkgY29udHJvbCByZWdpc3Rlci4KKwkgKi8KKwlpZigocmV0X3ZhbCA9IGUxMDAwX3JlYWRfcGh5X3JlZyhodywgUEhZX0NUUkwsICZwaHlfZGF0YSkpKQorCQlyZXR1cm4gcmV0X3ZhbDsKKworCXBoeV9kYXRhIHw9IChNSUlfQ1JfQVVUT19ORUdfRU4gfCBNSUlfQ1JfUkVTVEFSVF9BVVRPX05FRyk7CisJaWYoKHJldF92YWwgPSBlMTAwMF93cml0ZV9waHlfcmVnKGh3LCBQSFlfQ1RSTCwgcGh5X2RhdGEpKSkKKwkJcmV0dXJuIHJldF92YWw7CisKKyNpZiAwCQorCS8qIERvZXMgdGhlIHVzZXIgd2FudCB0byB3YWl0IGZvciBBdXRvLU5lZyB0byBjb21wbGV0ZSBoZXJlLCBvcgorCSAqIGNoZWNrIGF0IGEgbGF0ZXIgdGltZSAoZm9yIGV4YW1wbGUsIGNhbGxiYWNrIHJvdXRpbmUpLgorCSAqLworCWlmKGh3LT53YWl0X2F1dG9uZWdfY29tcGxldGUpIHsKKwkJaWYoKHJldF92YWwgPSBlMTAwMF93YWl0X2F1dG9uZWcoaHcpKSkgeworCQkJREVCVUdPVVQoIkVycm9yIHdoaWxlIHdhaXRpbmcgZm9yIGF1dG9uZWcgdG8gY29tcGxldGVcbiIpOworCQkJcmV0dXJuIHJldF92YWw7CisJCX0KKwl9CisjZWxzZQorCS8qIElmIHdlIGRvIG5vdCB3YWl0IGZvciBhdXRvbmVnb3RpYXRpb24gdG8gY29tcGxldGUgSSAKKwkgKiBkbyBub3Qgc2VlIGEgdmFsaWQgbGluayBzdGF0dXMuCisJICovCisJaWYoKHJldF92YWwgPSBlMTAwMF93YWl0X2F1dG9uZWcoaHcpKSkgeworCQlERUJVR09VVCgiRXJyb3Igd2hpbGUgd2FpdGluZyBmb3IgYXV0b25lZyB0byBjb21wbGV0ZVxuIik7CisJCXJldHVybiByZXRfdmFsOworCX0KKyNlbmRpZgorCX0gLyogIWh3LT5waHlfcmVzZXRfZGlzYWJsZSAqLworCQorCS8qIENoZWNrIGxpbmsgc3RhdHVzLiBXYWl0IHVwIHRvIDEwMCBtaWNyb3NlY29uZHMgZm9yIGxpbmsgdG8gYmVjb21lCisJICogdmFsaWQuCisJICovCisJZm9yKGkgPSAwOyBpIDwgMTA7IGkrKykgeworCQlpZigocmV0X3ZhbCA9IGUxMDAwX3JlYWRfcGh5X3JlZyhodywgUEhZX1NUQVRVUywgJnBoeV9kYXRhKSkpCisJCQlyZXR1cm4gcmV0X3ZhbDsKKwkJaWYoKHJldF92YWwgPSBlMTAwMF9yZWFkX3BoeV9yZWcoaHcsIFBIWV9TVEFUVVMsICZwaHlfZGF0YSkpKQorCQkJcmV0dXJuIHJldF92YWw7CisKKwkJaWYocGh5X2RhdGEgJiBNSUlfU1JfTElOS19TVEFUVVMpIHsKKwkJCS8qIFdlIGhhdmUgbGluaywgc28gd2UgbmVlZCB0byBmaW5pc2ggdGhlIGNvbmZpZyBwcm9jZXNzOgorCQkJICogICAxKSBTZXQgdXAgdGhlIE1BQyB0byB0aGUgY3VycmVudCBQSFkgc3BlZWQvZHVwbGV4CisJCQkgKiAgICAgIGlmIHdlIGFyZSBvbiA4MjU0My4gIElmIHdlCisJCQkgKiAgICAgIGFyZSBvbiBuZXdlciBzaWxpY29uLCB3ZSBvbmx5IG5lZWQgdG8gY29uZmlndXJlCisJCQkgKiAgICAgIGNvbGxpc2lvbiBkaXN0YW5jZSBpbiB0aGUgVHJhbnNtaXQgQ29udHJvbCBSZWdpc3Rlci4KKwkJCSAqICAgMikgU2V0IHVwIGZsb3cgY29udHJvbCBvbiB0aGUgTUFDIHRvIHRoYXQgZXN0YWJsaXNoZWQgd2l0aAorCQkJICogICAgICB0aGUgbGluayBwYXJ0bmVyLgorCQkJICovCisJCQlpZihody0+bWFjX3R5cGUgPj0gZTEwMDBfODI1NDQpIHsKKwkJCQllMTAwMF9jb25maWdfY29sbGlzaW9uX2Rpc3QoaHcpOworCQkJfSBlbHNlIHsKKwkJCQlpZigocmV0X3ZhbCA9IGUxMDAwX2NvbmZpZ19tYWNfdG9fcGh5KGh3KSkpIHsKKwkJCQkJREVCVUdPVVQoIkVycm9yIGNvbmZpZ3VyaW5nIE1BQyB0byBQSFkgc2V0dGluZ3NcbiIpOworCQkJCQlyZXR1cm4gcmV0X3ZhbDsKKwkJCQl9CisJCQl9CisJCQlpZigocmV0X3ZhbCA9IGUxMDAwX2NvbmZpZ19mY19hZnRlcl9saW5rX3VwKGh3KSkpIHsKKwkJCQlERUJVR09VVCgiRXJyb3IgQ29uZmlndXJpbmcgRmxvdyBDb250cm9sXG4iKTsKKwkJCQlyZXR1cm4gcmV0X3ZhbDsKKwkJCX0KKyNpZiAwCisJCQlpZihody0+cGh5X3R5cGUgPT0gZTEwMDBfcGh5X2lncCkgeworCQkJCWlmKChyZXRfdmFsID0gZTEwMDBfY29uZmlnX2RzcF9hZnRlcl9saW5rX2NoYW5nZShodywgVFJVRSkpKSB7CisJCQkJCURFQlVHT1VUKCJFcnJvciBDb25maWd1cmluZyBEU1AgYWZ0ZXIgbGluayB1cFxuIik7CisJCQkJCXJldHVybiByZXRfdmFsOworCQkJCX0KKwkJCX0KKyNlbmRpZgorCQkJREVCVUdPVVQoIlZhbGlkIGxpbmsgZXN0YWJsaXNoZWQhISFcbiIpOworCQkJcmV0dXJuIEUxMDAwX1NVQ0NFU1M7CisJCX0KKwkJdWRlbGF5KDEwKTsKKwl9CisJCisJREVCVUdPVVQoIlVuYWJsZSB0byBlc3RhYmxpc2ggbGluayEhIVxuIik7CisJcmV0dXJuIC1FMTAwMF9FUlJfTk9MSU5LOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIENvbmZpZ3VyZXMgUEhZIGF1dG9uZWcgYW5kIGZsb3cgY29udHJvbCBhZHZlcnRpc2VtZW50IHNldHRpbmdzCisqCisqIGh3IC0gU3RydWN0IGNvbnRhaW5pbmcgdmFyaWFibGVzIGFjY2Vzc2VkIGJ5IHNoYXJlZCBjb2RlCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50CitlMTAwMF9waHlfc2V0dXBfYXV0b25lZyhzdHJ1Y3QgZTEwMDBfaHcgKmh3KQoreworCWludDMyX3QgcmV0X3ZhbDsKKwl1aW50MTZfdCBtaWlfYXV0b25lZ19hZHZfcmVnOworCXVpbnQxNl90IG1paV8xMDAwdF9jdHJsX3JlZzsKKworCURFQlVHRlVOQygiZTEwMDBfcGh5X3NldHVwX2F1dG9uZWciKTsKKwkKKwkvKiBSZWFkIHRoZSBNSUkgQXV0by1OZWcgQWR2ZXJ0aXNlbWVudCBSZWdpc3RlciAoQWRkcmVzcyA0KS4gKi8KKwlpZigocmV0X3ZhbCA9IGUxMDAwX3JlYWRfcGh5X3JlZyhodywgUEhZX0FVVE9ORUdfQURWLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtaWlfYXV0b25lZ19hZHZfcmVnKSkpCisJCXJldHVybiByZXRfdmFsOworCisJLyogUmVhZCB0aGUgTUlJIDEwMDBCYXNlLVQgQ29udHJvbCBSZWdpc3RlciAoQWRkcmVzcyA5KS4gKi8KKwlpZigocmV0X3ZhbCA9IGUxMDAwX3JlYWRfcGh5X3JlZyhodywgUEhZXzEwMDBUX0NUUkwsICZtaWlfMTAwMHRfY3RybF9yZWcpKSkKKwkJcmV0dXJuIHJldF92YWw7CisKKwkvKiBOZWVkIHRvIHBhcnNlIGJvdGggYXV0b25lZ19hZHZlcnRpc2VkIGFuZCBmYyBhbmQgc2V0IHVwCisJICogdGhlIGFwcHJvcHJpYXRlIFBIWSByZWdpc3RlcnMuICBGaXJzdCB3ZSB3aWxsIHBhcnNlIGZvcgorCSAqIGF1dG9uZWdfYWR2ZXJ0aXNlZCBzb2Z0d2FyZSBvdmVycmlkZS4gIFNpbmNlIHdlIGNhbiBhZHZlcnRpc2UKKwkgKiBhIHBsZXRob3JhIG9mIGNvbWJpbmF0aW9ucywgd2UgbmVlZCB0byBjaGVjayBlYWNoIGJpdAorCSAqIGluZGl2aWR1YWxseS4KKwkgKi8KKwkKKwkvKiBGaXJzdCB3ZSBjbGVhciBhbGwgdGhlIDEwLzEwMCBtYiBzcGVlZCBiaXRzIGluIHRoZSBBdXRvLU5lZworCSAqIEFkdmVydGlzZW1lbnQgUmVnaXN0ZXIgKEFkZHJlc3MgNCkgYW5kIHRoZSAxMDAwIG1iIHNwZWVkIGJpdHMgaW4KKwkgKiB0aGUgIDEwMDBCYXNlLVQgQ29udHJvbCBSZWdpc3RlciAoQWRkcmVzcyA5KS4KKwkgKi8KKwltaWlfYXV0b25lZ19hZHZfcmVnICY9IH5SRUc0X1NQRUVEX01BU0s7CisJbWlpXzEwMDB0X2N0cmxfcmVnICY9IH5SRUc5X1NQRUVEX01BU0s7CisKKwlERUJVR09VVDEoImF1dG9uZWdfYWR2ZXJ0aXNlZCAleFxuIiwgaHctPmF1dG9uZWdfYWR2ZXJ0aXNlZCk7CisKKwkvKiBEbyB3ZSB3YW50IHRvIGFkdmVydGlzZSAxMCBNYiBIYWxmIER1cGxleD8gKi8KKwlpZihody0+YXV0b25lZ19hZHZlcnRpc2VkICYgQURWRVJUSVNFXzEwX0hBTEYpIHsKKwkJREVCVUdPVVQoIkFkdmVydGlzZSAxMG1iIEhhbGYgZHVwbGV4XG4iKTsKKwkJbWlpX2F1dG9uZWdfYWR2X3JlZyB8PSBOV0FZX0FSXzEwVF9IRF9DQVBTOworCX0KKworCS8qIERvIHdlIHdhbnQgdG8gYWR2ZXJ0aXNlIDEwIE1iIEZ1bGwgRHVwbGV4PyAqLworCWlmKGh3LT5hdXRvbmVnX2FkdmVydGlzZWQgJiBBRFZFUlRJU0VfMTBfRlVMTCkgeworCQlERUJVR09VVCgiQWR2ZXJ0aXNlIDEwbWIgRnVsbCBkdXBsZXhcbiIpOworCQltaWlfYXV0b25lZ19hZHZfcmVnIHw9IE5XQVlfQVJfMTBUX0ZEX0NBUFM7CisJfQorCisJLyogRG8gd2Ugd2FudCB0byBhZHZlcnRpc2UgMTAwIE1iIEhhbGYgRHVwbGV4PyAqLworCWlmKGh3LT5hdXRvbmVnX2FkdmVydGlzZWQgJiBBRFZFUlRJU0VfMTAwX0hBTEYpIHsKKwkJREVCVUdPVVQoIkFkdmVydGlzZSAxMDBtYiBIYWxmIGR1cGxleFxuIik7CisJCW1paV9hdXRvbmVnX2Fkdl9yZWcgfD0gTldBWV9BUl8xMDBUWF9IRF9DQVBTOworCX0KKworCS8qIERvIHdlIHdhbnQgdG8gYWR2ZXJ0aXNlIDEwMCBNYiBGdWxsIER1cGxleD8gKi8KKwlpZihody0+YXV0b25lZ19hZHZlcnRpc2VkICYgQURWRVJUSVNFXzEwMF9GVUxMKSB7CisJCURFQlVHT1VUKCJBZHZlcnRpc2UgMTAwbWIgRnVsbCBkdXBsZXhcbiIpOworCQltaWlfYXV0b25lZ19hZHZfcmVnIHw9IE5XQVlfQVJfMTAwVFhfRkRfQ0FQUzsKKwl9CisKKwkvKiBXZSBkbyBub3QgYWxsb3cgdGhlIFBoeSB0byBhZHZlcnRpc2UgMTAwMCBNYiBIYWxmIER1cGxleCAqLworCWlmKGh3LT5hdXRvbmVnX2FkdmVydGlzZWQgJiBBRFZFUlRJU0VfMTAwMF9IQUxGKSB7CisJCURFQlVHT1VUKCJBZHZlcnRpc2UgMTAwMG1iIEhhbGYgZHVwbGV4IHJlcXVlc3RlZCwgcmVxdWVzdCBkZW5pZWQhXG4iKTsKKwl9CisKKwkvKiBEbyB3ZSB3YW50IHRvIGFkdmVydGlzZSAxMDAwIE1iIEZ1bGwgRHVwbGV4PyAqLworCWlmKGh3LT5hdXRvbmVnX2FkdmVydGlzZWQgJiBBRFZFUlRJU0VfMTAwMF9GVUxMKSB7CisJCURFQlVHT1VUKCJBZHZlcnRpc2UgMTAwMG1iIEZ1bGwgZHVwbGV4XG4iKTsKKwkJbWlpXzEwMDB0X2N0cmxfcmVnIHw9IENSXzEwMDBUX0ZEX0NBUFM7CisJfQorCisJLyogQ2hlY2sgZm9yIGEgc29mdHdhcmUgb3ZlcnJpZGUgb2YgdGhlIGZsb3cgY29udHJvbCBzZXR0aW5ncywgYW5kCisJICogc2V0dXAgdGhlIFBIWSBhZHZlcnRpc2VtZW50IHJlZ2lzdGVycyBhY2NvcmRpbmdseS4gIElmCisJICogYXV0by1uZWdvdGlhdGlvbiBpcyBlbmFibGVkLCB0aGVuIHNvZnR3YXJlIHdpbGwgaGF2ZSB0byBzZXQgdGhlCisJICogIlBBVVNFIiBiaXRzIHRvIHRoZSBjb3JyZWN0IHZhbHVlIGluIHRoZSBBdXRvLU5lZ290aWF0aW9uCisJICogQWR2ZXJ0aXNlbWVudCBSZWdpc3RlciAoUEhZX0FVVE9ORUdfQURWKSBhbmQgcmUtc3RhcnQgYXV0by1uZWdvdGlhdGlvbi4KKwkgKgorCSAqIFRoZSBwb3NzaWJsZSB2YWx1ZXMgb2YgdGhlICJmYyIgcGFyYW1ldGVyIGFyZToKKwkgKiAgICAgIDA6ICBGbG93IGNvbnRyb2wgaXMgY29tcGxldGVseSBkaXNhYmxlZAorCSAqICAgICAgMTogIFJ4IGZsb3cgY29udHJvbCBpcyBlbmFibGVkICh3ZSBjYW4gcmVjZWl2ZSBwYXVzZSBmcmFtZXMKKwkgKiAgICAgICAgICBidXQgbm90IHNlbmQgcGF1c2UgZnJhbWVzKS4KKwkgKiAgICAgIDI6ICBUeCBmbG93IGNvbnRyb2wgaXMgZW5hYmxlZCAod2UgY2FuIHNlbmQgcGF1c2UgZnJhbWVzCisJICogICAgICAgICAgYnV0IHdlIGRvIG5vdCBzdXBwb3J0IHJlY2VpdmluZyBwYXVzZSBmcmFtZXMpLgorCSAqICAgICAgMzogIEJvdGggUnggYW5kIFRYIGZsb3cgY29udHJvbCAoc3ltbWV0cmljKSBhcmUgZW5hYmxlZC4KKwkgKiAgb3RoZXI6ICBObyBzb2Z0d2FyZSBvdmVycmlkZS4gIFRoZSBmbG93IGNvbnRyb2wgY29uZmlndXJhdGlvbgorCSAqICAgICAgICAgIGluIHRoZSBFRVBST00gaXMgdXNlZC4KKwkgKi8KKwlzd2l0Y2ggKGh3LT5mYykgeworCWNhc2UgZTEwMDBfZmNfbm9uZTogLyogMCAqLworCQkvKiBGbG93IGNvbnRyb2wgKFJYICYgVFgpIGlzIGNvbXBsZXRlbHkgZGlzYWJsZWQgYnkgYQorCQkgKiBzb2Z0d2FyZSBvdmVyLXJpZGUuCisJCSAqLworCQltaWlfYXV0b25lZ19hZHZfcmVnICY9IH4oTldBWV9BUl9BU01fRElSIHwgTldBWV9BUl9QQVVTRSk7CisJCWJyZWFrOworCWNhc2UgZTEwMDBfZmNfcnhfcGF1c2U6IC8qIDEgKi8KKwkJLyogUlggRmxvdyBjb250cm9sIGlzIGVuYWJsZWQsIGFuZCBUWCBGbG93IGNvbnRyb2wgaXMKKwkJICogZGlzYWJsZWQsIGJ5IGEgc29mdHdhcmUgb3Zlci1yaWRlLgorCQkgKi8KKwkJLyogU2luY2UgdGhlcmUgcmVhbGx5IGlzbid0IGEgd2F5IHRvIGFkdmVydGlzZSB0aGF0IHdlIGFyZQorCQkgKiBjYXBhYmxlIG9mIFJYIFBhdXNlIE9OTFksIHdlIHdpbGwgYWR2ZXJ0aXNlIHRoYXQgd2UKKwkJICogc3VwcG9ydCBib3RoIHN5bW1ldHJpYyBhbmQgYXN5bW1ldHJpYyBSWCBQQVVTRS4gIExhdGVyCisJCSAqIChpbiBlMTAwMF9jb25maWdfZmNfYWZ0ZXJfbGlua191cCkgd2Ugd2lsbCBkaXNhYmxlIHRoZQorCQkgKmh3J3MgYWJpbGl0eSB0byBzZW5kIFBBVVNFIGZyYW1lcy4KKwkJICovCisJCW1paV9hdXRvbmVnX2Fkdl9yZWcgfD0gKE5XQVlfQVJfQVNNX0RJUiB8IE5XQVlfQVJfUEFVU0UpOworCQlicmVhazsKKwljYXNlIGUxMDAwX2ZjX3R4X3BhdXNlOiAvKiAyICovCisJCS8qIFRYIEZsb3cgY29udHJvbCBpcyBlbmFibGVkLCBhbmQgUlggRmxvdyBjb250cm9sIGlzCisJCSAqIGRpc2FibGVkLCBieSBhIHNvZnR3YXJlIG92ZXItcmlkZS4KKwkJICovCisJCW1paV9hdXRvbmVnX2Fkdl9yZWcgfD0gTldBWV9BUl9BU01fRElSOworCQltaWlfYXV0b25lZ19hZHZfcmVnICY9IH5OV0FZX0FSX1BBVVNFOworCQlicmVhazsKKwljYXNlIGUxMDAwX2ZjX2Z1bGw6IC8qIDMgKi8KKwkJLyogRmxvdyBjb250cm9sIChib3RoIFJYIGFuZCBUWCkgaXMgZW5hYmxlZCBieSBhIHNvZnR3YXJlCisJCSAqIG92ZXItcmlkZS4KKwkJICovCisJCW1paV9hdXRvbmVnX2Fkdl9yZWcgfD0gKE5XQVlfQVJfQVNNX0RJUiB8IE5XQVlfQVJfUEFVU0UpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlERUJVR09VVCgiRmxvdyBjb250cm9sIHBhcmFtIHNldCBpbmNvcnJlY3RseVxuIik7CisJCXJldHVybiAtRTEwMDBfRVJSX0NPTkZJRzsKKwl9CisKKwlpZigocmV0X3ZhbCA9IGUxMDAwX3dyaXRlX3BoeV9yZWcoaHcsIFBIWV9BVVRPTkVHX0FEViwKKwkgICAgICAgICAgICAgICAgICAgICAgIG1paV9hdXRvbmVnX2Fkdl9yZWcpKSkKKwkJcmV0dXJuIHJldF92YWw7CisKKwlERUJVR09VVDEoIkF1dG8tTmVnIEFkdmVydGlzaW5nICV4XG4iLCBtaWlfYXV0b25lZ19hZHZfcmVnKTsKKworCWlmKChyZXRfdmFsID0gZTEwMDBfd3JpdGVfcGh5X3JlZyhodywgUEhZXzEwMDBUX0NUUkwsIG1paV8xMDAwdF9jdHJsX3JlZykpKQorCQlyZXR1cm4gcmV0X3ZhbDsKKworCXJldHVybiBFMTAwMF9TVUNDRVNTOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIFNldHMgdGhlIGNvbGxpc2lvbiBkaXN0YW5jZSBpbiB0aGUgVHJhbnNtaXQgQ29udHJvbCByZWdpc3RlcgorKgorKiBodyAtIFN0cnVjdCBjb250YWluaW5nIHZhcmlhYmxlcyBhY2Nlc3NlZCBieSBzaGFyZWQgY29kZQorKgorKiBMaW5rIHNob3VsZCBoYXZlIGJlZW4gZXN0YWJsaXNoZWQgcHJldmlvdXNseS4gUmVhZHMgdGhlIHNwZWVkIGFuZCBkdXBsZXgKKyogaW5mb3JtYXRpb24gZnJvbSB0aGUgRGV2aWNlIFN0YXR1cyByZWdpc3Rlci4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkCitlMTAwMF9jb25maWdfY29sbGlzaW9uX2Rpc3Qoc3RydWN0IGUxMDAwX2h3ICpodykKK3sKKwl1aW50MzJfdCB0Y3RsOworCisJdGN0bCA9IEUxMDAwX1JFQURfUkVHKGh3LCBUQ1RMKTsKKwkKKwl0Y3RsICY9IH5FMTAwMF9UQ1RMX0NPTEQ7CisJdGN0bCB8PSBFMTAwMF9DT0xMSVNJT05fRElTVEFOQ0UgPDwgRTEwMDBfQ09MRF9TSElGVDsKKwkKKwlFMTAwMF9XUklURV9SRUcoaHcsIFRDVEwsIHRjdGwpOworCUUxMDAwX1dSSVRFX0ZMVVNIKGh3KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBTZXRzIE1BQyBzcGVlZCBhbmQgZHVwbGV4IHNldHRpbmdzIHRvIHJlZmxlY3QgdGhlIHRob3NlIGluIHRoZSBQSFkKKyoKKyogaHcgLSBTdHJ1Y3QgY29udGFpbmluZyB2YXJpYWJsZXMgYWNjZXNzZWQgYnkgc2hhcmVkIGNvZGUKKyogbWlpX3JlZyAtIGRhdGEgdG8gd3JpdGUgdG8gdGhlIE1JSSBjb250cm9sIHJlZ2lzdGVyCisqCisqIFRoZSBjb250ZW50cyBvZiB0aGUgUEhZIHJlZ2lzdGVyIGNvbnRhaW5pbmcgdGhlIG5lZWRlZCBpbmZvcm1hdGlvbiBuZWVkIHRvCisqIGJlIHBhc3NlZCBpbi4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQKK2UxMDAwX2NvbmZpZ19tYWNfdG9fcGh5KHN0cnVjdCBlMTAwMF9odyAqaHcpCit7CisJdWludDMyX3QgY3RybDsKKwlpbnQzMl90IHJldF92YWw7CisJdWludDE2X3QgcGh5X2RhdGE7CisKKwlERUJVR0ZVTkMoImUxMDAwX2NvbmZpZ19tYWNfdG9fcGh5Iik7CisKKwkvKiBSZWFkIHRoZSBEZXZpY2UgQ29udHJvbCBSZWdpc3RlciBhbmQgc2V0IHRoZSBiaXRzIHRvIEZvcmNlIFNwZWVkCisJICogYW5kIER1cGxleC4KKwkgKi8KKwljdHJsID0gRTEwMDBfUkVBRF9SRUcoaHcsIENUUkwpOworCWN0cmwgfD0gKEUxMDAwX0NUUkxfRlJDU1BEIHwgRTEwMDBfQ1RSTF9GUkNEUFgpOworCWN0cmwgJj0gfihFMTAwMF9DVFJMX1NQRF9TRUwgfCBFMTAwMF9DVFJMX0lMT1MpOworCisJLyogU2V0IHVwIGR1cGxleCBpbiB0aGUgRGV2aWNlIENvbnRyb2wgYW5kIFRyYW5zbWl0IENvbnRyb2wKKwkgKiByZWdpc3RlcnMgZGVwZW5kaW5nIG9uIG5lZ290aWF0ZWQgdmFsdWVzLgorCSAqLworCWlmIChody0+cGh5X3R5cGUgPT0gZTEwMDBfcGh5X2lncCkgeworCQlpZigocmV0X3ZhbCA9IGUxMDAwX3JlYWRfcGh5X3JlZyhodywgSUdQMDFFMTAwMF9QSFlfUE9SVF9TVEFUVVMsCisJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwaHlfZGF0YSkpKQorCQkJcmV0dXJuIHJldF92YWw7CisKKwkJaWYocGh5X2RhdGEgJiBJR1AwMUUxMDAwX1BTU1JfRlVMTF9EVVBMRVgpIGN0cmwgfD0gRTEwMDBfQ1RSTF9GRDsKKwkJZWxzZSBjdHJsICY9IH5FMTAwMF9DVFJMX0ZEOworCisJCWUxMDAwX2NvbmZpZ19jb2xsaXNpb25fZGlzdChodyk7CisKKwkJLyogU2V0IHVwIHNwZWVkIGluIHRoZSBEZXZpY2UgQ29udHJvbCByZWdpc3RlciBkZXBlbmRpbmcgb24KKwkJICogbmVnb3RpYXRlZCB2YWx1ZXMuCisJCSAqLworCQlpZigocGh5X2RhdGEgJiBJR1AwMUUxMDAwX1BTU1JfU1BFRURfTUFTSykgPT0KKwkJICAgSUdQMDFFMTAwMF9QU1NSX1NQRUVEXzEwMDBNQlBTKQorCQkJY3RybCB8PSBFMTAwMF9DVFJMX1NQRF8xMDAwOworCQllbHNlIGlmKChwaHlfZGF0YSAmIElHUDAxRTEwMDBfUFNTUl9TUEVFRF9NQVNLKSA9PQorCQkJSUdQMDFFMTAwMF9QU1NSX1NQRUVEXzEwME1CUFMpCisJCQljdHJsIHw9IEUxMDAwX0NUUkxfU1BEXzEwMDsKKwl9IGVsc2UgeworCQlpZigocmV0X3ZhbCA9IGUxMDAwX3JlYWRfcGh5X3JlZyhodywgTTg4RTEwMDBfUEhZX1NQRUNfU1RBVFVTLAorCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGh5X2RhdGEpKSkKKwkJCXJldHVybiByZXRfdmFsOworCQkKKwkJaWYocGh5X2RhdGEgJiBNODhFMTAwMF9QU1NSX0RQTFgpIGN0cmwgfD0gRTEwMDBfQ1RSTF9GRDsKKwkJZWxzZSBjdHJsICY9IH5FMTAwMF9DVFJMX0ZEOworCisJCWUxMDAwX2NvbmZpZ19jb2xsaXNpb25fZGlzdChodyk7CisKKwkJLyogU2V0IHVwIHNwZWVkIGluIHRoZSBEZXZpY2UgQ29udHJvbCByZWdpc3RlciBkZXBlbmRpbmcgb24KKwkJICogbmVnb3RpYXRlZCB2YWx1ZXMuCisJCSAqLworCQlpZigocGh5X2RhdGEgJiBNODhFMTAwMF9QU1NSX1NQRUVEKSA9PSBNODhFMTAwMF9QU1NSXzEwMDBNQlMpCisJCQljdHJsIHw9IEUxMDAwX0NUUkxfU1BEXzEwMDA7CisJCWVsc2UgaWYoKHBoeV9kYXRhICYgTTg4RTEwMDBfUFNTUl9TUEVFRCkgPT0gTTg4RTEwMDBfUFNTUl8xMDBNQlMpCisJCQljdHJsIHw9IEUxMDAwX0NUUkxfU1BEXzEwMDsKKwl9CisJLyogV3JpdGUgdGhlIGNvbmZpZ3VyZWQgdmFsdWVzIGJhY2sgdG8gdGhlIERldmljZSBDb250cm9sIFJlZy4gKi8KKwlFMTAwMF9XUklURV9SRUcoaHcsIENUUkwsIGN0cmwpOworCXJldHVybiBFMTAwMF9TVUNDRVNTOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBGb3JjZXMgdGhlIE1BQydzIGZsb3cgY29udHJvbCBzZXR0aW5ncy4KKyAqIAorICogaHcgLSBTdHJ1Y3QgY29udGFpbmluZyB2YXJpYWJsZXMgYWNjZXNzZWQgYnkgc2hhcmVkIGNvZGUKKyAqCisgKiBTZXRzIHRoZSBURkNFIGFuZCBSRkNFIGJpdHMgaW4gdGhlIGRldmljZSBjb250cm9sIHJlZ2lzdGVyIHRvIHJlZmxlY3QKKyAqIHRoZSBhZGFwdGVyIHNldHRpbmdzLiBURkNFIGFuZCBSRkNFIG5lZWQgdG8gYmUgZXhwbGljaXRseSBzZXQgYnkKKyAqIHNvZnR3YXJlIHdoZW4gYSBDb3BwZXIgUEhZIGlzIHVzZWQgYmVjYXVzZSBhdXRvbmVnb3RpYXRpb24gaXMgbWFuYWdlZAorICogYnkgdGhlIFBIWSByYXRoZXIgdGhhbiB0aGUgTUFDLiBTb2Z0d2FyZSBtdXN0IGFsc28gY29uZmlndXJlIHRoZXNlCisgKiBiaXRzIHdoZW4gbGluayBpcyBmb3JjZWQgb24gYSBmaWJlciBjb25uZWN0aW9uLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludAorZTEwMDBfZm9yY2VfbWFjX2ZjKHN0cnVjdCBlMTAwMF9odyAqaHcpCit7CisJdWludDMyX3QgY3RybDsKKwkKKwlERUJVR0ZVTkMoImUxMDAwX2ZvcmNlX21hY19mYyIpOworCQorCS8qIEdldCB0aGUgY3VycmVudCBjb25maWd1cmF0aW9uIG9mIHRoZSBEZXZpY2UgQ29udHJvbCBSZWdpc3RlciAqLworCWN0cmwgPSBFMTAwMF9SRUFEX1JFRyhodywgQ1RSTCk7CisJCisJLyogQmVjYXVzZSB3ZSBkaWRuJ3QgZ2V0IGxpbmsgdmlhIHRoZSBpbnRlcm5hbCBhdXRvLW5lZ290aWF0aW9uCisJICogbWVjaGFuaXNtICh3ZSBlaXRoZXIgZm9yY2VkIGxpbmsgb3Igd2UgZ290IGxpbmsgdmlhIFBIWQorCSAqIGF1dG8tbmVnKSwgd2UgaGF2ZSB0byBtYW51YWxseSBlbmFibGUvZGlzYWJsZSB0cmFuc21pdCBhbgorCSAqIHJlY2VpdmUgZmxvdyBjb250cm9sLgorCSAqCisJICogVGhlICJDYXNlIiBzdGF0ZW1lbnQgYmVsb3cgZW5hYmxlcy9kaXNhYmxlIGZsb3cgY29udHJvbAorCSAqIGFjY29yZGluZyB0byB0aGUgImh3LT5mYyIgcGFyYW1ldGVyLgorCSAqCisJICogVGhlIHBvc3NpYmxlIHZhbHVlcyBvZiB0aGUgImZjIiBwYXJhbWV0ZXIgYXJlOgorCSAqICAgICAgMDogIEZsb3cgY29udHJvbCBpcyBjb21wbGV0ZWx5IGRpc2FibGVkCisJICogICAgICAxOiAgUnggZmxvdyBjb250cm9sIGlzIGVuYWJsZWQgKHdlIGNhbiByZWNlaXZlIHBhdXNlCisJICogICAgICAgICAgZnJhbWVzIGJ1dCBub3Qgc2VuZCBwYXVzZSBmcmFtZXMpLgorCSAqICAgICAgMjogIFR4IGZsb3cgY29udHJvbCBpcyBlbmFibGVkICh3ZSBjYW4gc2VuZCBwYXVzZSBmcmFtZXMKKwkgKiAgICAgICAgICBmcmFtZXMgYnV0IHdlIGRvIG5vdCByZWNlaXZlIHBhdXNlIGZyYW1lcykuCisJICogICAgICAzOiAgQm90aCBSeCBhbmQgVFggZmxvdyBjb250cm9sIChzeW1tZXRyaWMpIGlzIGVuYWJsZWQuCisJICogIG90aGVyOiAgTm8gb3RoZXIgdmFsdWVzIHNob3VsZCBiZSBwb3NzaWJsZSBhdCB0aGlzIHBvaW50LgorCSAqLworCQorCXN3aXRjaCAoaHctPmZjKSB7CisJY2FzZSBlMTAwMF9mY19ub25lOgorCQljdHJsICY9ICh+KEUxMDAwX0NUUkxfVEZDRSB8IEUxMDAwX0NUUkxfUkZDRSkpOworCQlicmVhazsKKwljYXNlIGUxMDAwX2ZjX3J4X3BhdXNlOgorCQljdHJsICY9ICh+RTEwMDBfQ1RSTF9URkNFKTsKKwkJY3RybCB8PSBFMTAwMF9DVFJMX1JGQ0U7CisJCWJyZWFrOworCWNhc2UgZTEwMDBfZmNfdHhfcGF1c2U6CisJCWN0cmwgJj0gKH5FMTAwMF9DVFJMX1JGQ0UpOworCQljdHJsIHw9IEUxMDAwX0NUUkxfVEZDRTsKKwkJYnJlYWs7CisJY2FzZSBlMTAwMF9mY19mdWxsOgorCQljdHJsIHw9IChFMTAwMF9DVFJMX1RGQ0UgfCBFMTAwMF9DVFJMX1JGQ0UpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlERUJVR09VVCgiRmxvdyBjb250cm9sIHBhcmFtIHNldCBpbmNvcnJlY3RseVxuIik7CisJCXJldHVybiAtRTEwMDBfRVJSX0NPTkZJRzsKKwl9CisJCisJLyogRGlzYWJsZSBUWCBGbG93IENvbnRyb2wgZm9yIDgyNTQyIChyZXYgMi4wKSAqLworCWlmKGh3LT5tYWNfdHlwZSA9PSBlMTAwMF84MjU0Ml9yZXYyXzApCisJCWN0cmwgJj0gKH5FMTAwMF9DVFJMX1RGQ0UpOworCQorCUUxMDAwX1dSSVRFX1JFRyhodywgQ1RSTCwgY3RybCk7CisJcmV0dXJuIEUxMDAwX1NVQ0NFU1M7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvbmZpZ3VyZXMgZmxvdyBjb250cm9sIHNldHRpbmdzIGFmdGVyIGxpbmsgaXMgZXN0YWJsaXNoZWQKKyAqIAorICogaHcgLSBTdHJ1Y3QgY29udGFpbmluZyB2YXJpYWJsZXMgYWNjZXNzZWQgYnkgc2hhcmVkIGNvZGUKKyAqCisgKiBTaG91bGQgYmUgY2FsbGVkIGltbWVkaWF0ZWx5IGFmdGVyIGEgdmFsaWQgbGluayBoYXMgYmVlbiBlc3RhYmxpc2hlZC4KKyAqIEZvcmNlcyBNQUMgZmxvdyBjb250cm9sIHNldHRpbmdzIGlmIGxpbmsgd2FzIGZvcmNlZC4gV2hlbiBpbiBNSUkvR01JSSBtb2RlCisgKiBhbmQgYXV0b25lZ290aWF0aW9uIGlzIGVuYWJsZWQsIHRoZSBNQUMgZmxvdyBjb250cm9sIHNldHRpbmdzIHdpbGwgYmUgc2V0CisgKiBiYXNlZCBvbiB0aGUgZmxvdyBjb250cm9sIG5lZ290aWF0ZWQgYnkgdGhlIFBIWS4gSW4gVEJJIG1vZGUsIHRoZSBURkNFCisgKiBhbmQgUkZDRSBiaXRzIHdpbGwgYmUgYXV0b21hdGljYWx5IHNldCB0byB0aGUgbmVnb3RpYXRlZCBmbG93IGNvbnRyb2wgbW9kZS4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQKK2UxMDAwX2NvbmZpZ19mY19hZnRlcl9saW5rX3VwKHN0cnVjdCBlMTAwMF9odyAqaHcpCit7CisJaW50MzJfdCByZXRfdmFsOworCXVpbnQxNl90IG1paV9zdGF0dXNfcmVnOworCXVpbnQxNl90IG1paV9ud2F5X2Fkdl9yZWc7CisJdWludDE2X3QgbWlpX253YXlfbHBfYWJpbGl0eV9yZWc7CisJdWludDE2X3Qgc3BlZWQ7CisJdWludDE2X3QgZHVwbGV4OworCQorCURFQlVHRlVOQygiZTEwMDBfY29uZmlnX2ZjX2FmdGVyX2xpbmtfdXAiKTsKKwkKKwkvKiBDaGVjayBmb3IgdGhlIGNhc2Ugd2hlcmUgd2UgaGF2ZSBmaWJlciBtZWRpYSBhbmQgYXV0by1uZWcgZmFpbGVkCisJICogc28gd2UgaGFkIHRvIGZvcmNlIGxpbmsuICBJbiB0aGlzIGNhc2UsIHdlIG5lZWQgdG8gZm9yY2UgdGhlCisJICogY29uZmlndXJhdGlvbiBvZiB0aGUgTUFDIHRvIG1hdGNoIHRoZSAiZmMiIHBhcmFtZXRlci4KKwkgKi8KKwlpZigoKGh3LT5tZWRpYV90eXBlID09IGUxMDAwX21lZGlhX3R5cGVfZmliZXIpICYmIChody0+YXV0b25lZ19mYWlsZWQpKSB8fAorCSAgICgoaHctPm1lZGlhX3R5cGUgPT0gZTEwMDBfbWVkaWFfdHlwZV9pbnRlcm5hbF9zZXJkZXMpICYmIChody0+YXV0b25lZ19mYWlsZWQpKSkgeyAKKwkJaWYoKHJldF92YWwgPSBlMTAwMF9mb3JjZV9tYWNfZmMoaHcpKSkgeworCQkJREVCVUdPVVQoIkVycm9yIGZvcmNpbmcgZmxvdyBjb250cm9sIHNldHRpbmdzXG4iKTsKKwkJCXJldHVybiByZXRfdmFsOworCQl9CisJfQorCQorCS8qIENoZWNrIGZvciB0aGUgY2FzZSB3aGVyZSB3ZSBoYXZlIGNvcHBlciBtZWRpYSBhbmQgYXV0by1uZWcgaXMKKwkgKiBlbmFibGVkLiAgSW4gdGhpcyBjYXNlLCB3ZSBuZWVkIHRvIGNoZWNrIGFuZCBzZWUgaWYgQXV0by1OZWcKKwkgKiBoYXMgY29tcGxldGVkLCBhbmQgaWYgc28sIGhvdyB0aGUgUEhZIGFuZCBsaW5rIHBhcnRuZXIgaGFzCisJICogZmxvdyBjb250cm9sIGNvbmZpZ3VyZWQuCisJICovCisJaWYoaHctPm1lZGlhX3R5cGUgPT0gZTEwMDBfbWVkaWFfdHlwZV9jb3BwZXIpIHsKKwkJLyogUmVhZCB0aGUgTUlJIFN0YXR1cyBSZWdpc3RlciBhbmQgY2hlY2sgdG8gc2VlIGlmIEF1dG9OZWcKKwkJICogaGFzIGNvbXBsZXRlZC4gIFdlIHJlYWQgdGhpcyB0d2ljZSBiZWNhdXNlIHRoaXMgcmVnIGhhcworCQkgKiBzb21lICJzdGlja3kiIChsYXRjaGVkKSBiaXRzLgorCQkgKi8KKwkJaWYoKHJldF92YWwgPSBlMTAwMF9yZWFkX3BoeV9yZWcoaHcsIFBIWV9TVEFUVVMsICZtaWlfc3RhdHVzX3JlZykpKQorCQkJcmV0dXJuIHJldF92YWw7CisJCWlmKChyZXRfdmFsID0gZTEwMDBfcmVhZF9waHlfcmVnKGh3LCBQSFlfU1RBVFVTLCAmbWlpX3N0YXR1c19yZWcpKSkKKwkJCXJldHVybiByZXRfdmFsOworCQkKKwkJaWYobWlpX3N0YXR1c19yZWcgJiBNSUlfU1JfQVVUT05FR19DT01QTEVURSkgeworCQkJLyogVGhlIEF1dG9OZWcgcHJvY2VzcyBoYXMgY29tcGxldGVkLCBzbyB3ZSBub3cgbmVlZCB0bworCQkJICogcmVhZCBib3RoIHRoZSBBdXRvIE5lZ290aWF0aW9uIEFkdmVydGlzZW1lbnQgUmVnaXN0ZXIKKwkJCSAqIChBZGRyZXNzIDQpIGFuZCB0aGUgQXV0b19OZWdvdGlhdGlvbiBCYXNlIFBhZ2UgQWJpbGl0eQorCQkJICogUmVnaXN0ZXIgKEFkZHJlc3MgNSkgdG8gZGV0ZXJtaW5lIGhvdyBmbG93IGNvbnRyb2wgd2FzCisJCQkgKiBuZWdvdGlhdGVkLgorCQkJICovCisJCQlpZigocmV0X3ZhbCA9IGUxMDAwX3JlYWRfcGh5X3JlZyhodywgUEhZX0FVVE9ORUdfQURWLAorCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1paV9ud2F5X2Fkdl9yZWcpKSkKKwkJCQlyZXR1cm4gcmV0X3ZhbDsKKwkJCWlmKChyZXRfdmFsID0gZTEwMDBfcmVhZF9waHlfcmVnKGh3LCBQSFlfTFBfQUJJTElUWSwKKwkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtaWlfbndheV9scF9hYmlsaXR5X3JlZykpKQorCQkJCXJldHVybiByZXRfdmFsOworCisJCQkvKiBUd28gYml0cyBpbiB0aGUgQXV0byBOZWdvdGlhdGlvbiBBZHZlcnRpc2VtZW50IFJlZ2lzdGVyCisJCQkgKiAoQWRkcmVzcyA0KSBhbmQgdHdvIGJpdHMgaW4gdGhlIEF1dG8gTmVnb3RpYXRpb24gQmFzZQorCQkJICogUGFnZSBBYmlsaXR5IFJlZ2lzdGVyIChBZGRyZXNzIDUpIGRldGVybWluZSBmbG93IGNvbnRyb2wKKwkJCSAqIGZvciBib3RoIHRoZSBQSFkgYW5kIHRoZSBsaW5rIHBhcnRuZXIuICBUaGUgZm9sbG93aW5nCisJCQkgKiB0YWJsZSwgdGFrZW4gb3V0IG9mIHRoZSBJRUVFIDgwMi4zYWIvRDYuMCBkYXRlZCBNYXJjaCAyNSwKKwkJCSAqIDE5OTksIGRlc2NyaWJlcyB0aGVzZSBQQVVTRSByZXNvbHV0aW9uIGJpdHMgYW5kIGhvdyBmbG93CisJCQkgKiBjb250cm9sIGlzIGRldGVybWluZWQgYmFzZWQgdXBvbiB0aGVzZSBzZXR0aW5ncy4KKwkJCSAqIE5PVEU6ICBEQyA9IERvbid0IENhcmUKKwkJCSAqCisJCQkgKiAgIExPQ0FMIERFVklDRSAgfCAgIExJTksgUEFSVE5FUgorCQkJICogUEFVU0UgfCBBU01fRElSIHwgUEFVU0UgfCBBU01fRElSIHwgTklDIFJlc29sdXRpb24KKwkJCSAqLS0tLS0tLXwtLS0tLS0tLS18LS0tLS0tLXwtLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkJCSAqICAgMCAgIHwgICAgMCAgICB8ICBEQyAgIHwgICBEQyAgICB8IGUxMDAwX2ZjX25vbmUKKwkJCSAqICAgMCAgIHwgICAgMSAgICB8ICAgMCAgIHwgICBEQyAgICB8IGUxMDAwX2ZjX25vbmUKKwkJCSAqICAgMCAgIHwgICAgMSAgICB8ICAgMSAgIHwgICAgMCAgICB8IGUxMDAwX2ZjX25vbmUKKwkJCSAqICAgMCAgIHwgICAgMSAgICB8ICAgMSAgIHwgICAgMSAgICB8IGUxMDAwX2ZjX3R4X3BhdXNlCisJCQkgKiAgIDEgICB8ICAgIDAgICAgfCAgIDAgICB8ICAgREMgICAgfCBlMTAwMF9mY19ub25lCisJCQkgKiAgIDEgICB8ICAgREMgICAgfCAgIDEgICB8ICAgREMgICAgfCBlMTAwMF9mY19mdWxsCisJCQkgKiAgIDEgICB8ICAgIDEgICAgfCAgIDAgICB8ICAgIDAgICAgfCBlMTAwMF9mY19ub25lCisJCQkgKiAgIDEgICB8ICAgIDEgICAgfCAgIDAgICB8ICAgIDEgICAgfCBlMTAwMF9mY19yeF9wYXVzZQorCQkJICoKKwkJCSAqLworCQkJLyogQXJlIGJvdGggUEFVU0UgYml0cyBzZXQgdG8gMT8gIElmIHNvLCB0aGlzIGltcGxpZXMKKwkJCSAqIFN5bW1ldHJpYyBGbG93IENvbnRyb2wgaXMgZW5hYmxlZCBhdCBib3RoIGVuZHMuICBUaGUKKwkJCSAqIEFTTV9ESVIgYml0cyBhcmUgaXJyZWxldmFudCBwZXIgdGhlIHNwZWMuCisJCQkgKgorCQkJICogRm9yIFN5bW1ldHJpYyBGbG93IENvbnRyb2w6CisJCQkgKgorCQkJICogICBMT0NBTCBERVZJQ0UgIHwgICBMSU5LIFBBUlRORVIKKwkJCSAqIFBBVVNFIHwgQVNNX0RJUiB8IFBBVVNFIHwgQVNNX0RJUiB8IFJlc3VsdAorCQkJICotLS0tLS0tfC0tLS0tLS0tLXwtLS0tLS0tfC0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLQorCQkJICogICAxICAgfCAgIERDICAgIHwgICAxICAgfCAgIERDICAgIHwgZTEwMDBfZmNfZnVsbAorCQkJICoKKwkJCSAqLworCQkJaWYoKG1paV9ud2F5X2Fkdl9yZWcgJiBOV0FZX0FSX1BBVVNFKSAmJgorCQkJCShtaWlfbndheV9scF9hYmlsaXR5X3JlZyAmIE5XQVlfTFBBUl9QQVVTRSkpIHsKKwkJCQkvKiBOb3cgd2UgbmVlZCB0byBjaGVjayBpZiB0aGUgdXNlciBzZWxlY3RlZCBSWCBPTkxZCisJCQkJICogb2YgcGF1c2UgZnJhbWVzLiAgSW4gdGhpcyBjYXNlLCB3ZSBoYWQgdG8gYWR2ZXJ0aXNlCisJCQkJICogRlVMTCBmbG93IGNvbnRyb2wgYmVjYXVzZSB3ZSBjb3VsZCBub3QgYWR2ZXJ0aXNlIFJYCisJCQkJICogT05MWS4gSGVuY2UsIHdlIG11c3Qgbm93IGNoZWNrIHRvIHNlZSBpZiB3ZSBuZWVkIHRvCisJCQkJICogdHVybiBPRkYgIHRoZSBUUkFOU01JU1NJT04gb2YgUEFVU0UgZnJhbWVzLgorCQkJCSAqLworI2lmIDAKKwkJCQlpZihody0+b3JpZ2luYWxfZmMgPT0gZTEwMDBfZmNfZnVsbCkgeworCQkJCQlody0+ZmMgPSBlMTAwMF9mY19mdWxsOworI2Vsc2UKKwkJCQlpZihody0+ZmMgPT0gZTEwMDBfZmNfZnVsbCkgeworI2VuZGlmCisJCQkJCURFQlVHT1VUKCJGbG93IENvbnRyb2wgPSBGVUxMLlxyXG4iKTsKKwkJCQl9IGVsc2UgeworCQkJCQlody0+ZmMgPSBlMTAwMF9mY19yeF9wYXVzZTsKKwkJCQkJREVCVUdPVVQoIkZsb3cgQ29udHJvbCA9IFJYIFBBVVNFIGZyYW1lcyBvbmx5LlxyXG4iKTsKKwkJCQl9CisJCQl9CisJCQkvKiBGb3IgcmVjZWl2aW5nIFBBVVNFIGZyYW1lcyBPTkxZLgorCQkJICoKKwkJCSAqICAgTE9DQUwgREVWSUNFICB8ICAgTElOSyBQQVJUTkVSCisJCQkgKiBQQVVTRSB8IEFTTV9ESVIgfCBQQVVTRSB8IEFTTV9ESVIgfCBSZXN1bHQKKwkJCSAqLS0tLS0tLXwtLS0tLS0tLS18LS0tLS0tLXwtLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkJCSAqICAgMCAgIHwgICAgMSAgICB8ICAgMSAgIHwgICAgMSAgICB8IGUxMDAwX2ZjX3R4X3BhdXNlCisJCQkgKgorCQkJICovCisJCQllbHNlIGlmKCEobWlpX253YXlfYWR2X3JlZyAmIE5XQVlfQVJfUEFVU0UpICYmCisJCQkJKG1paV9ud2F5X2Fkdl9yZWcgJiBOV0FZX0FSX0FTTV9ESVIpICYmCisJCQkJKG1paV9ud2F5X2xwX2FiaWxpdHlfcmVnICYgTldBWV9MUEFSX1BBVVNFKSAmJgorCQkJCShtaWlfbndheV9scF9hYmlsaXR5X3JlZyAmIE5XQVlfTFBBUl9BU01fRElSKSkgeworCQkJCWh3LT5mYyA9IGUxMDAwX2ZjX3R4X3BhdXNlOworCQkJCURFQlVHT1VUKCJGbG93IENvbnRyb2wgPSBUWCBQQVVTRSBmcmFtZXMgb25seS5cclxuIik7CisJCQl9CisJCQkvKiBGb3IgdHJhbnNtaXR0aW5nIFBBVVNFIGZyYW1lcyBPTkxZLgorCQkJICoKKwkJCSAqICAgTE9DQUwgREVWSUNFICB8ICAgTElOSyBQQVJUTkVSCisJCQkgKiBQQVVTRSB8IEFTTV9ESVIgfCBQQVVTRSB8IEFTTV9ESVIgfCBSZXN1bHQKKwkJCSAqLS0tLS0tLXwtLS0tLS0tLS18LS0tLS0tLXwtLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkJCSAqICAgMSAgIHwgICAgMSAgICB8ICAgMCAgIHwgICAgMSAgICB8IGUxMDAwX2ZjX3J4X3BhdXNlCisJCQkgKgorCQkJICovCisJCQllbHNlIGlmKChtaWlfbndheV9hZHZfcmVnICYgTldBWV9BUl9QQVVTRSkgJiYKKwkJCQkobWlpX253YXlfYWR2X3JlZyAmIE5XQVlfQVJfQVNNX0RJUikgJiYKKwkJCQkhKG1paV9ud2F5X2xwX2FiaWxpdHlfcmVnICYgTldBWV9MUEFSX1BBVVNFKSAmJgorCQkJCShtaWlfbndheV9scF9hYmlsaXR5X3JlZyAmIE5XQVlfTFBBUl9BU01fRElSKSkgeworCQkJCWh3LT5mYyA9IGUxMDAwX2ZjX3J4X3BhdXNlOworCQkJCURFQlVHT1VUKCJGbG93IENvbnRyb2wgPSBSWCBQQVVTRSBmcmFtZXMgb25seS5cclxuIik7CisJCQl9CisJCQkvKiBQZXIgdGhlIElFRUUgc3BlYywgYXQgdGhpcyBwb2ludCBmbG93IGNvbnRyb2wgc2hvdWxkIGJlCisJCQkgKiBkaXNhYmxlZC4gIEhvd2V2ZXIsIHdlIHdhbnQgdG8gY29uc2lkZXIgdGhhdCB3ZSBjb3VsZAorCQkJICogYmUgY29ubmVjdGVkIHRvIGEgbGVnYWN5IHN3aXRjaCB0aGF0IGRvZXNuJ3QgYWR2ZXJ0aXNlCisJCQkgKiBkZXNpcmVkIGZsb3cgY29udHJvbCwgYnV0IGNhbiBiZSBmb3JjZWQgb24gdGhlIGxpbmsKKwkJCSAqIHBhcnRuZXIuICBTbyBpZiB3ZSBhZHZlcnRpc2VkIG5vIGZsb3cgY29udHJvbCwgdGhhdCBpcworCQkJICogd2hhdCB3ZSB3aWxsIHJlc29sdmUgdG8uICBJZiB3ZSBhZHZlcnRpc2VkIHNvbWUga2luZCBvZgorCQkJICogcmVjZWl2ZSBjYXBhYmlsaXR5IChSeCBQYXVzZSBPbmx5IG9yIEZ1bGwgRmxvdyBDb250cm9sKQorCQkJICogYW5kIHRoZSBsaW5rIHBhcnRuZXIgYWR2ZXJ0aXNlZCBub25lLCB3ZSB3aWxsIGNvbmZpZ3VyZQorCQkJICogb3Vyc2VsdmVzIHRvIGVuYWJsZSBSeCBGbG93IENvbnRyb2wgb25seS4gIFdlIGNhbiBkbworCQkJICogdGhpcyBzYWZlbHkgZm9yIHR3byByZWFzb25zOiAgSWYgdGhlIGxpbmsgcGFydG5lciByZWFsbHkKKwkJCSAqIGRpZG4ndCB3YW50IGZsb3cgY29udHJvbCBlbmFibGVkLCBhbmQgd2UgZW5hYmxlIFJ4LCBubworCQkJICogaGFybSBkb25lIHNpbmNlIHdlIHdvbid0IGJlIHJlY2VpdmluZyBhbnkgUEFVU0UgZnJhbWVzCisJCQkgKiBhbnl3YXkuICBJZiB0aGUgaW50ZW50IG9uIHRoZSBsaW5rIHBhcnRuZXIgd2FzIHRvIGhhdmUKKwkJCSAqIGZsb3cgY29udHJvbCBlbmFibGVkLCB0aGVuIGJ5IHVzIGVuYWJsaW5nIFJYIG9ubHksIHdlCisJCQkgKiBjYW4gYXQgbGVhc3QgcmVjZWl2ZSBwYXVzZSBmcmFtZXMgYW5kIHByb2Nlc3MgdGhlbS4KKwkJCSAqIFRoaXMgaXMgYSBnb29kIGlkZWEgYmVjYXVzZSBpbiBtb3N0IGNhc2VzLCBzaW5jZSB3ZSBhcmUKKwkJCSAqIHByZWRvbWluYW50bHkgYSBzZXJ2ZXIgTklDLCBtb3JlIHRpbWVzIHRoYW4gbm90IHdlIHdpbGwKKwkJCSAqIGJlIGFza2VkIHRvIGRlbGF5IHRyYW5zbWlzc2lvbiBvZiBwYWNrZXRzIHRoYW4gYXNraW5nCisJCQkgKiBvdXIgbGluayBwYXJ0bmVyIHRvIHBhdXNlIHRyYW5zbWlzc2lvbiBvZiBmcmFtZXMuCisJCQkgKi8KKyNpZiAwCisJCQllbHNlIGlmKGh3LT5vcmlnaW5hbF9mYyA9PSBlMTAwMF9mY19ub25lIHx8CisJCQkJaHctPm9yaWdpbmFsX2ZjID09IGUxMDAwX2ZjX3R4X3BhdXNlKSB7CisjZWxzZQorCQkJZWxzZSBpZihody0+ZmMgPT0gZTEwMDBfZmNfbm9uZSkKKwkJCQlERUJVR09VVCgiRmxvdyBDb250cm9sID0gTk9ORS5cclxuIik7CisJCQllbHNlIGlmKGh3LT5mYyA9PSBlMTAwMF9mY190eF9wYXVzZSkgeworI2VuZGlmCisJCQkJaHctPmZjID0gZTEwMDBfZmNfbm9uZTsKKwkJCQlERUJVR09VVCgiRmxvdyBDb250cm9sID0gTk9ORS5cclxuIik7CisJCQl9IGVsc2UgeworCQkJCWh3LT5mYyA9IGUxMDAwX2ZjX3J4X3BhdXNlOworCQkJCURFQlVHT1VUKCJGbG93IENvbnRyb2wgPSBSWCBQQVVTRSBmcmFtZXMgb25seS5cclxuIik7CisJCQl9CisJCQkKKwkJCS8qIE5vdyB3ZSBuZWVkIHRvIGRvIG9uZSBsYXN0IGNoZWNrLi4uICBJZiB3ZSBhdXRvLQorCQkJICogbmVnb3RpYXRlZCB0byBIQUxGIERVUExFWCwgZmxvdyBjb250cm9sIHNob3VsZCBub3QgYmUKKwkJCSAqIGVuYWJsZWQgcGVyIElFRUUgODAyLjMgc3BlYy4KKwkJCSAqLworCQkJZTEwMDBfZ2V0X3NwZWVkX2FuZF9kdXBsZXgoaHcsICZzcGVlZCwgJmR1cGxleCk7CisJCQkKKwkJCWlmKGR1cGxleCA9PSBIQUxGX0RVUExFWCkKKwkJCQlody0+ZmMgPSBlMTAwMF9mY19ub25lOworCQkJCisJCQkvKiBOb3cgd2UgY2FsbCBhIHN1YnJvdXRpbmUgdG8gYWN0dWFsbHkgZm9yY2UgdGhlIE1BQworCQkJICogY29udHJvbGxlciB0byB1c2UgdGhlIGNvcnJlY3QgZmxvdyBjb250cm9sIHNldHRpbmdzLgorCQkJICovCisJCQlpZigocmV0X3ZhbCA9IGUxMDAwX2ZvcmNlX21hY19mYyhodykpKSB7CisJCQkJREVCVUdPVVQoIkVycm9yIGZvcmNpbmcgZmxvdyBjb250cm9sIHNldHRpbmdzXG4iKTsKKwkJCQlyZXR1cm4gcmV0X3ZhbDsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCURFQlVHT1VUKCJDb3BwZXIgUEhZIGFuZCBBdXRvIE5lZyBoYXMgbm90IGNvbXBsZXRlZC5cclxuIik7CisJCX0KKwl9CisJcmV0dXJuIEUxMDAwX1NVQ0NFU1M7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENoZWNrcyB0byBzZWUgaWYgdGhlIGxpbmsgc3RhdHVzIG9mIHRoZSBoYXJkd2FyZSBoYXMgY2hhbmdlZC4KKyAqCisgKiBodyAtIFN0cnVjdCBjb250YWluaW5nIHZhcmlhYmxlcyBhY2Nlc3NlZCBieSBzaGFyZWQgY29kZQorICoKKyAqIENhbGxlZCBieSBhbnkgZnVuY3Rpb24gdGhhdCBuZWVkcyB0byBjaGVjayB0aGUgbGluayBzdGF0dXMgb2YgdGhlIGFkYXB0ZXIuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50CitlMTAwMF9jaGVja19mb3JfbGluayhzdHJ1Y3QgZTEwMDBfaHcgKmh3KQoreworCXVpbnQzMl90IHJ4Y3c7CisJdWludDMyX3QgY3RybDsKKwl1aW50MzJfdCBzdGF0dXM7CisJdWludDMyX3QgcmN0bDsKKwl1aW50MzJfdCBzaWduYWwgPSAwOworCWludDMyX3QgcmV0X3ZhbDsKKwl1aW50MTZfdCBwaHlfZGF0YTsKKwl1aW50MTZfdCBscF9jYXBhYmlsaXR5OworCQorCURFQlVHRlVOQygiZTEwMDBfY2hlY2tfZm9yX2xpbmsiKTsKKwkKKwkvKiBPbiBhZGFwdGVycyB3aXRoIGEgTUFDIG5ld2VyIHRoYW4gODI1NDQsIFNXIERlZmluZWFibGUgcGluIDEgd2lsbCBiZSAKKwkgKiBzZXQgd2hlbiB0aGUgb3B0aWNzIGRldGVjdCBhIHNpZ25hbC4gT24gb2xkZXIgYWRhcHRlcnMsIGl0IHdpbGwgYmUgCisJICogY2xlYXJlZCB3aGVuIHRoZXJlIGlzIGEgc2lnbmFsLiAgVGhpcyBhcHBsaWVzIHRvIGZpYmVyIG1lZGlhIG9ubHkuCisJICovCisJaWYoaHctPm1lZGlhX3R5cGUgPT0gZTEwMDBfbWVkaWFfdHlwZV9maWJlcikKKwkJc2lnbmFsID0gKGh3LT5tYWNfdHlwZSA+IGUxMDAwXzgyNTQ0KSA/IEUxMDAwX0NUUkxfU1dEUElOMSA6IDA7CisKKwljdHJsID0gRTEwMDBfUkVBRF9SRUcoaHcsIENUUkwpOworCXN0YXR1cyA9IEUxMDAwX1JFQURfUkVHKGh3LCBTVEFUVVMpOworCXJ4Y3cgPSBFMTAwMF9SRUFEX1JFRyhodywgUlhDVyk7CisJCisJLyogSWYgd2UgaGF2ZSBhIGNvcHBlciBQSFkgdGhlbiB3ZSBvbmx5IHdhbnQgdG8gZ28gb3V0IHRvIHRoZSBQSFkKKwkgKiByZWdpc3RlcnMgdG8gc2VlIGlmIEF1dG8tTmVnIGhhcyBjb21wbGV0ZWQgYW5kL29yIGlmIG91ciBsaW5rCisJICogc3RhdHVzIGhhcyBjaGFuZ2VkLiAgVGhlIGdldF9saW5rX3N0YXR1cyBmbGFnIHdpbGwgYmUgc2V0IGlmIHdlCisJICogcmVjZWl2ZSBhIExpbmsgU3RhdHVzIENoYW5nZSBpbnRlcnJ1cHQgb3Igd2UgaGF2ZSBSeCBTZXF1ZW5jZQorCSAqIEVycm9ycy4KKwkgKi8KKyNpZiAwCisJaWYoKGh3LT5tZWRpYV90eXBlID09IGUxMDAwX21lZGlhX3R5cGVfY29wcGVyKSAmJiBody0+Z2V0X2xpbmtfc3RhdHVzKSB7CisjZWxzZQorCWlmKGh3LT5tZWRpYV90eXBlID09IGUxMDAwX21lZGlhX3R5cGVfY29wcGVyKSB7CisjZW5kaWYKKwkJLyogRmlyc3Qgd2Ugd2FudCB0byBzZWUgaWYgdGhlIE1JSSBTdGF0dXMgUmVnaXN0ZXIgcmVwb3J0cworCQkgKiBsaW5rLiAgSWYgc28sIHRoZW4gd2Ugd2FudCB0byBnZXQgdGhlIGN1cnJlbnQgc3BlZWQvZHVwbGV4CisJCSAqIG9mIHRoZSBQSFkuCisJCSAqIFJlYWQgdGhlIHJlZ2lzdGVyIHR3aWNlIHNpbmNlIHRoZSBsaW5rIGJpdCBpcyBzdGlja3kuCisJCSAqLworCQlpZigocmV0X3ZhbCA9IGUxMDAwX3JlYWRfcGh5X3JlZyhodywgUEhZX1NUQVRVUywgJnBoeV9kYXRhKSkpCisJCQlyZXR1cm4gcmV0X3ZhbDsKKwkJaWYoKHJldF92YWwgPSBlMTAwMF9yZWFkX3BoeV9yZWcoaHcsIFBIWV9TVEFUVVMsICZwaHlfZGF0YSkpKQorCQkJcmV0dXJuIHJldF92YWw7CisJCQorCQlpZihwaHlfZGF0YSAmIE1JSV9TUl9MSU5LX1NUQVRVUykgeworI2lmIDAKKwkJCWh3LT5nZXRfbGlua19zdGF0dXMgPSBGQUxTRTsKKyNlbmRpZgorCQl9IGVsc2UgeworCQkJLyogTm8gbGluayBkZXRlY3RlZCAqLworCQkJcmV0dXJuIC1FMTAwMF9FUlJfTk9MSU5LOworCQl9CisKKwkJLyogV2UgaGF2ZSBhIE04OEUxMDAwIFBIWSBhbmQgQXV0by1OZWcgaXMgZW5hYmxlZC4gIElmIHdlCisJCSAqIGhhdmUgU2kgb24gYm9hcmQgdGhhdCBpcyA4MjU0NCBvciBuZXdlciwgQXV0bworCQkgKiBTcGVlZCBEZXRlY3Rpb24gdGFrZXMgY2FyZSBvZiBNQUMgc3BlZWQvZHVwbGV4CisJCSAqIGNvbmZpZ3VyYXRpb24uICBTbyB3ZSBvbmx5IG5lZWQgdG8gY29uZmlndXJlIENvbGxpc2lvbgorCQkgKiBEaXN0YW5jZSBpbiB0aGUgTUFDLiAgT3RoZXJ3aXNlLCB3ZSBuZWVkIHRvIGZvcmNlCisJCSAqIHNwZWVkL2R1cGxleCBvbiB0aGUgTUFDIHRvIHRoZSBjdXJyZW50IFBIWSBzcGVlZC9kdXBsZXgKKwkJICogc2V0dGluZ3MuCisJCSAqLworCQlpZihody0+bWFjX3R5cGUgPj0gZTEwMDBfODI1NDQpCisJCQllMTAwMF9jb25maWdfY29sbGlzaW9uX2Rpc3QoaHcpOworCQllbHNlIHsKKwkJCWlmKChyZXRfdmFsID0gZTEwMDBfY29uZmlnX21hY190b19waHkoaHcpKSkgeworCQkJCURFQlVHT1VUKCJFcnJvciBjb25maWd1cmluZyBNQUMgdG8gUEhZIHNldHRpbmdzXG4iKTsKKwkJCQlyZXR1cm4gcmV0X3ZhbDsKKwkJCX0KKwkJfQorCQkKKwkJLyogQ29uZmlndXJlIEZsb3cgQ29udHJvbCBub3cgdGhhdCBBdXRvLU5lZyBoYXMgY29tcGxldGVkLiBGaXJzdCwgd2UgCisJCSAqIG5lZWQgdG8gcmVzdG9yZSB0aGUgZGVzaXJlZCBmbG93IGNvbnRyb2wgc2V0dGluZ3MgYmVjYXVzZSB3ZSBtYXkKKwkJICogaGF2ZSBoYWQgdG8gcmUtYXV0b25lZyB3aXRoIGEgZGlmZmVyZW50IGxpbmsgcGFydG5lci4KKwkJICovCisJCWlmKChyZXRfdmFsID0gZTEwMDBfY29uZmlnX2ZjX2FmdGVyX2xpbmtfdXAoaHcpKSkgeworCQkJREVCVUdPVVQoIkVycm9yIGNvbmZpZ3VyaW5nIGZsb3cgY29udHJvbFxuIik7CisJCQlyZXR1cm4gcmV0X3ZhbDsKKwkJfQorCQkKKwkJLyogQXQgdGhpcyBwb2ludCB3ZSBrbm93IHRoYXQgd2UgYXJlIG9uIGNvcHBlciBhbmQgd2UgaGF2ZQorCQkgKiBhdXRvLW5lZ290aWF0ZWQgbGluay4gIFRoZXNlIGFyZSBjb25kaXRpb25zIGZvciBjaGVja2luZyB0aGUgbGluaworCQkgKiBwYXJ0ZXIgY2FwYWJpbGl0eSByZWdpc3Rlci4gIFdlIHVzZSB0aGUgbGluayBwYXJ0bmVyIGNhcGFiaWxpdHkgdG8KKwkJICogZGV0ZXJtaW5lIGlmIFRCSSBDb21wYXRpYmlsaXR5IG5lZWRzIHRvIGJlIHR1cm5lZCBvbiBvciBvZmYuICBJZgorCQkgKiB0aGUgbGluayBwYXJ0bmVyIGFkdmVydGlzZXMgYW55IHNwZWVkIGluIGFkZGl0aW9uIHRvIEdpZ2FiaXQsIHRoZW4KKwkJICogd2UgYXNzdW1lIHRoYXQgdGhleSBhcmUgR01JSS1iYXNlZCwgYW5kIFRCSSBjb21wYXRpYmlsaXR5IGlzIG5vdAorCQkgKiBuZWVkZWQuIElmIG5vIG90aGVyIHNwZWVkcyBhcmUgYWR2ZXJ0aXNlZCwgd2UgYXNzdW1lIHRoZSBsaW5rCisJCSAqIHBhcnRuZXIgaXMgVEJJLWJhc2VkLCBhbmQgd2UgdHVybiBvbiBUQkkgQ29tcGF0aWJpbGl0eS4KKwkJICovCisJCWlmKGh3LT50YmlfY29tcGF0aWJpbGl0eV9lbikgeworCQkJaWYoKHJldF92YWwgPSBlMTAwMF9yZWFkX3BoeV9yZWcoaHcsIFBIWV9MUF9BQklMSVRZLAorCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmxwX2NhcGFiaWxpdHkpKSkKKwkJCQlyZXR1cm4gcmV0X3ZhbDsKKwkJCWlmKGxwX2NhcGFiaWxpdHkgJiAoTldBWV9MUEFSXzEwVF9IRF9DQVBTIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTldBWV9MUEFSXzEwVF9GRF9DQVBTIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTldBWV9MUEFSXzEwMFRYX0hEX0NBUFMgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOV0FZX0xQQVJfMTAwVFhfRkRfQ0FQUyB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5XQVlfTFBBUl8xMDBUNF9DQVBTKSkgeworCQkJCS8qIElmIG91ciBsaW5rIHBhcnRuZXIgYWR2ZXJ0aXNlcyBhbnl0aGluZyBpbiBhZGRpdGlvbiB0byAKKwkJCQkgKiBnaWdhYml0LCB3ZSBkbyBub3QgbmVlZCB0byBlbmFibGUgVEJJIGNvbXBhdGliaWxpdHkuCisJCQkJICovCisJCQkJaWYoaHctPnRiaV9jb21wYXRpYmlsaXR5X29uKSB7CisJCQkJCS8qIElmIHdlIHByZXZpb3VzbHkgd2VyZSBpbiB0aGUgbW9kZSwgdHVybiBpdCBvZmYuICovCisJCQkJCXJjdGwgPSBFMTAwMF9SRUFEX1JFRyhodywgUkNUTCk7CisJCQkJCXJjdGwgJj0gfkUxMDAwX1JDVExfU0JQOworCQkJCQlFMTAwMF9XUklURV9SRUcoaHcsIFJDVEwsIHJjdGwpOworCQkJCQlody0+dGJpX2NvbXBhdGliaWxpdHlfb24gPSBGQUxTRTsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCS8qIElmIFRCSSBjb21wYXRpYmlsaXR5IGlzIHdhcyBwcmV2aW91c2x5IG9mZiwgdHVybiBpdCBvbi4gRm9yCisJCQkJICogY29tcGF0aWJpbGl0eSB3aXRoIGEgVEJJIGxpbmsgcGFydG5lciwgd2Ugd2lsbCBzdG9yZSBiYWQKKwkJCQkgKiBwYWNrZXRzLiBTb21lIGZyYW1lcyBoYXZlIGFuIGFkZGl0aW9uYWwgYnl0ZSBvbiB0aGUgZW5kIGFuZAorCQkJCSAqIHdpbGwgbG9vayBsaWtlIENSQyBlcnJvcnMgdG8gdG8gdGhlIGhhcmR3YXJlLgorCQkJCSAqLworCQkJCWlmKCFody0+dGJpX2NvbXBhdGliaWxpdHlfb24pIHsKKwkJCQkJaHctPnRiaV9jb21wYXRpYmlsaXR5X29uID0gVFJVRTsKKwkJCQkJcmN0bCA9IEUxMDAwX1JFQURfUkVHKGh3LCBSQ1RMKTsKKwkJCQkJcmN0bCB8PSBFMTAwMF9SQ1RMX1NCUDsKKwkJCQkJRTEwMDBfV1JJVEVfUkVHKGh3LCBSQ1RMLCByY3RsKTsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisJLyogSWYgd2UgZG9uJ3QgaGF2ZSBsaW5rIChhdXRvLW5lZ290aWF0aW9uIGZhaWxlZCBvciBsaW5rIHBhcnRuZXIgY2Fubm90CisJICogYXV0by1uZWdvdGlhdGUpLCB0aGUgY2FibGUgaXMgcGx1Z2dlZCBpbiAod2UgaGF2ZSBzaWduYWwpLCBhbmQgb3VyCisJICogbGluayBwYXJ0bmVyIGlzIG5vdCB0cnlpbmcgdG8gYXV0by1uZWdvdGlhdGUgd2l0aCB1cyAod2UgYXJlIHJlY2VpdmluZworCSAqIGlkbGVzIG9yIGRhdGEpLCB3ZSBuZWVkIHRvIGZvcmNlIGxpbmsgdXAuIFdlIGFsc28gbmVlZCB0byBnaXZlCisJICogYXV0by1uZWdvdGlhdGlvbiB0aW1lIHRvIGNvbXBsZXRlLCBpbiBjYXNlIHRoZSBjYWJsZSB3YXMganVzdCBwbHVnZ2VkCisJICogaW4uIFRoZSBhdXRvbmVnX2ZhaWxlZCBmbGFnIGRvZXMgdGhpcy4KKwkgKi8KKwllbHNlIGlmKCgoKGh3LT5tZWRpYV90eXBlID09IGUxMDAwX21lZGlhX3R5cGVfZmliZXIpICYmCisJICAgICAgICAoKGN0cmwgJiBFMTAwMF9DVFJMX1NXRFBJTjEpID09IHNpZ25hbCkpIHx8CisJICAgICAgICAoaHctPm1lZGlhX3R5cGUgPT0gZTEwMDBfbWVkaWFfdHlwZV9pbnRlcm5hbF9zZXJkZXMpKSAmJgorCQkoIShzdGF0dXMgJiBFMTAwMF9TVEFUVVNfTFUpKSAmJgorCQkoIShyeGN3ICYgRTEwMDBfUlhDV19DKSkpIHsKKwkJaWYoaHctPmF1dG9uZWdfZmFpbGVkID09IDApIHsKKwkJCWh3LT5hdXRvbmVnX2ZhaWxlZCA9IDE7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlERUJVR09VVCgiTk9UIFJYaW5nIC9DLywgZGlzYWJsZSBBdXRvTmVnIGFuZCBmb3JjZSBsaW5rLlxyXG4iKTsKKwkJCisJCS8qIERpc2FibGUgYXV0by1uZWdvdGlhdGlvbiBpbiB0aGUgVFhDVyByZWdpc3RlciAqLworCQlFMTAwMF9XUklURV9SRUcoaHcsIFRYQ1csIChody0+dHhjdyAmIH5FMTAwMF9UWENXX0FORSkpOworCQkKKwkJLyogRm9yY2UgbGluay11cCBhbmQgYWxzbyBmb3JjZSBmdWxsLWR1cGxleC4gKi8KKwkJY3RybCA9IEUxMDAwX1JFQURfUkVHKGh3LCBDVFJMKTsKKwkJY3RybCB8PSAoRTEwMDBfQ1RSTF9TTFUgfCBFMTAwMF9DVFJMX0ZEKTsKKwkJRTEwMDBfV1JJVEVfUkVHKGh3LCBDVFJMLCBjdHJsKTsKKwkJCisJCS8qIENvbmZpZ3VyZSBGbG93IENvbnRyb2wgYWZ0ZXIgZm9yY2luZyBsaW5rIHVwLiAqLworCQlpZigocmV0X3ZhbCA9IGUxMDAwX2NvbmZpZ19mY19hZnRlcl9saW5rX3VwKGh3KSkpIHsKKwkJCURFQlVHT1VUKCJFcnJvciBjb25maWd1cmluZyBmbG93IGNvbnRyb2xcbiIpOworCQkJcmV0dXJuIHJldF92YWw7CisJCX0KKwl9CisJLyogSWYgd2UgYXJlIGZvcmNpbmcgbGluayBhbmQgd2UgYXJlIHJlY2VpdmluZyAvQy8gb3JkZXJlZCBzZXRzLCByZS1lbmFibGUKKwkgKiBhdXRvLW5lZ290aWF0aW9uIGluIHRoZSBUWENXIHJlZ2lzdGVyIGFuZCBkaXNhYmxlIGZvcmNlZCBsaW5rIGluIHRoZQorCSAqIERldmljZSBDb250cm9sIHJlZ2lzdGVyIGluIGFuIGF0dGVtcHQgdG8gYXV0by1uZWdvdGlhdGUgd2l0aCBvdXIgbGluaworCSAqIHBhcnRuZXIuCisJICovCisJZWxzZSBpZigoKGh3LT5tZWRpYV90eXBlID09IGUxMDAwX21lZGlhX3R5cGVfZmliZXIpICB8fAorCSAgICAgICAgIChody0+bWVkaWFfdHlwZSA9PSBlMTAwMF9tZWRpYV90eXBlX2ludGVybmFsX3NlcmRlcykpICYmCisJCShjdHJsICYgRTEwMDBfQ1RSTF9TTFUpICYmCisJCShyeGN3ICYgRTEwMDBfUlhDV19DKSkgeworCQlERUJVR09VVCgiUlhpbmcgL0MvLCBlbmFibGUgQXV0b05lZyBhbmQgc3RvcCBmb3JjaW5nIGxpbmsuXHJcbiIpOworCQlFMTAwMF9XUklURV9SRUcoaHcsIFRYQ1csIGh3LT50eGN3KTsKKwkJRTEwMDBfV1JJVEVfUkVHKGh3LCBDVFJMLCAoY3RybCAmIH5FMTAwMF9DVFJMX1NMVSkpOworCX0KKyNpZiAwCisJLyogSWYgd2UgZm9yY2UgbGluayBmb3Igbm9uLWF1dG8tbmVnb3RpYXRpb24gc3dpdGNoLCBjaGVjayBsaW5rIHN0YXR1cworCSAqIGJhc2VkIG9uIE1BQyBzeW5jaHJvbml6YXRpb24gZm9yIGludGVybmFsIHNlcmRlcyBtZWRpYSB0eXBlLgorCSAqLworCWVsc2UgaWYoKGh3LT5tZWRpYV90eXBlID09IGUxMDAwX21lZGlhX3R5cGVfaW50ZXJuYWxfc2VyZGVzKSAmJgorCQkJIShFMTAwMF9UWENXX0FORSAmIEUxMDAwX1JFQURfUkVHKGh3LCBUWENXKSkpIHsKKwkJLyogU1lOQ0ggYml0IGFuZCBJViBiaXQgYXJlIHN0aWNreS4gKi8KKwkJdWRlbGF5KDEwKTsKKwkJaWYoRTEwMDBfUlhDV19TWU5DSCAmIEUxMDAwX1JFQURfUkVHKGh3LCBSWENXKSkgeworCQkJaWYoIShyeGN3ICYgRTEwMDBfUlhDV19JVikpIHsKKwkJCQlody0+c2VyZGVzX2xpbmtfZG93biA9IEZBTFNFOworCQkJCURFQlVHT1VUKCJTRVJERVM6IExpbmsgaXMgdXAuXG4iKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWh3LT5zZXJkZXNfbGlua19kb3duID0gVFJVRTsKKwkJCURFQlVHT1VUKCJTRVJERVM6IExpbmsgaXMgZG93bi5cbiIpOworCQl9CisJfQorI2VuZGlmCisJcmV0dXJuIEUxMDAwX1NVQ0NFU1M7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIERldGVjdHMgdGhlIGN1cnJlbnQgc3BlZWQgYW5kIGR1cGxleCBzZXR0aW5ncyBvZiB0aGUgaGFyZHdhcmUuCisgKgorICogaHcgLSBTdHJ1Y3QgY29udGFpbmluZyB2YXJpYWJsZXMgYWNjZXNzZWQgYnkgc2hhcmVkIGNvZGUKKyAqIHNwZWVkIC0gU3BlZWQgb2YgdGhlIGNvbm5lY3Rpb24KKyAqIGR1cGxleCAtIER1cGxleCBzZXR0aW5nIG9mIHRoZSBjb25uZWN0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCAKK2UxMDAwX2dldF9zcGVlZF9hbmRfZHVwbGV4KHN0cnVjdCBlMTAwMF9odyAqaHcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCAqc3BlZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCAqZHVwbGV4KQoreworCXVpbnQzMl90IHN0YXR1czsKKwkKKwlERUJVR0ZVTkMoImUxMDAwX2dldF9zcGVlZF9hbmRfZHVwbGV4Iik7CisJCisJaWYoaHctPm1hY190eXBlID49IGUxMDAwXzgyNTQzKSB7CisJCXN0YXR1cyA9IEUxMDAwX1JFQURfUkVHKGh3LCBTVEFUVVMpOworCQlpZihzdGF0dXMgJiBFMTAwMF9TVEFUVVNfU1BFRURfMTAwMCkgeworCQkJKnNwZWVkID0gU1BFRURfMTAwMDsKKwkJCURFQlVHT1VUKCIxMDAwIE1icywgIik7CisJCX0gZWxzZSBpZihzdGF0dXMgJiBFMTAwMF9TVEFUVVNfU1BFRURfMTAwKSB7CisJCQkqc3BlZWQgPSBTUEVFRF8xMDA7CisJCQlERUJVR09VVCgiMTAwIE1icywgIik7CisJCX0gZWxzZSB7CisJCQkqc3BlZWQgPSBTUEVFRF8xMDsKKwkJCURFQlVHT1VUKCIxMCBNYnMsICIpOworCQl9CisJCQorCQlpZihzdGF0dXMgJiBFMTAwMF9TVEFUVVNfRkQpIHsKKwkJCSpkdXBsZXggPSBGVUxMX0RVUExFWDsKKwkJCURFQlVHT1VUKCJGdWxsIER1cGxleFxyXG4iKTsKKwkJfSBlbHNlIHsKKwkJCSpkdXBsZXggPSBIQUxGX0RVUExFWDsKKwkJCURFQlVHT1VUKCIgSGFsZiBEdXBsZXhcclxuIik7CisJCX0KKwl9IGVsc2UgeworCQlERUJVR09VVCgiMTAwMCBNYnMsIEZ1bGwgRHVwbGV4XHJcbiIpOworCQkqc3BlZWQgPSBTUEVFRF8xMDAwOworCQkqZHVwbGV4ID0gRlVMTF9EVVBMRVg7CisJfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIEJsb2NrcyB1bnRpbCBhdXRvbmVnIGNvbXBsZXRlcyBvciB0aW1lcyBvdXQgKH40LjUgc2Vjb25kcykKKyoKKyogaHcgLSBTdHJ1Y3QgY29udGFpbmluZyB2YXJpYWJsZXMgYWNjZXNzZWQgYnkgc2hhcmVkIGNvZGUKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQKK2UxMDAwX3dhaXRfYXV0b25lZyhzdHJ1Y3QgZTEwMDBfaHcgKmh3KQoreworCWludDMyX3QgcmV0X3ZhbDsKKwl1aW50MTZfdCBpOworCXVpbnQxNl90IHBoeV9kYXRhOworCQorCURFQlVHRlVOQygiZTEwMDBfd2FpdF9hdXRvbmVnIik7CisJREVCVUdPVVQoIldhaXRpbmcgZm9yIEF1dG8tTmVnIHRvIGNvbXBsZXRlLlxuIik7CisJCisJLyogV2Ugd2lsbCB3YWl0IGZvciBhdXRvbmVnIHRvIGNvbXBsZXRlIG9yIDQuNSBzZWNvbmRzIHRvIGV4cGlyZS4gKi8KKwlmb3IoaSA9IFBIWV9BVVRPX05FR19USU1FOyBpID4gMDsgaS0tKSB7CisJCS8qIFJlYWQgdGhlIE1JSSBTdGF0dXMgUmVnaXN0ZXIgYW5kIHdhaXQgZm9yIEF1dG8tTmVnCisJCSAqIENvbXBsZXRlIGJpdCB0byBiZSBzZXQuCisJCSAqLworCQlpZigocmV0X3ZhbCA9IGUxMDAwX3JlYWRfcGh5X3JlZyhodywgUEhZX1NUQVRVUywgJnBoeV9kYXRhKSkpCisJCQlyZXR1cm4gcmV0X3ZhbDsKKwkJaWYoKHJldF92YWwgPSBlMTAwMF9yZWFkX3BoeV9yZWcoaHcsIFBIWV9TVEFUVVMsICZwaHlfZGF0YSkpKQorCQkJcmV0dXJuIHJldF92YWw7CisJCWlmKHBoeV9kYXRhICYgTUlJX1NSX0FVVE9ORUdfQ09NUExFVEUpIHsKKwkJCURFQlVHT1VUKCJBdXRvLU5lZyBjb21wbGV0ZS5cbiIpOworCQkJcmV0dXJuIEUxMDAwX1NVQ0NFU1M7CisJCX0KKwkJbWRlbGF5KDEwMCk7CisJfQorCURFQlVHT1VUKCJBdXRvLU5lZyB0aW1lZG91dC5cbiIpOworCXJldHVybiAtRTEwMDBfRVJSX1RJTUVPVVQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogUmFpc2VzIHRoZSBNYW5hZ2VtZW50IERhdGEgQ2xvY2sKKyoKKyogaHcgLSBTdHJ1Y3QgY29udGFpbmluZyB2YXJpYWJsZXMgYWNjZXNzZWQgYnkgc2hhcmVkIGNvZGUKKyogY3RybCAtIERldmljZSBjb250cm9sIHJlZ2lzdGVyJ3MgY3VycmVudCB2YWx1ZQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQKK2UxMDAwX3JhaXNlX21kaV9jbGsoc3RydWN0IGUxMDAwX2h3ICpodywKKyAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKmN0cmwpCit7CisJLyogUmFpc2UgdGhlIGNsb2NrIGlucHV0IHRvIHRoZSBNYW5hZ2VtZW50IERhdGEgQ2xvY2sgKGJ5IHNldHRpbmcgdGhlIE1EQworCSAqIGJpdCksIGFuZCB0aGVuIGRlbGF5IDEwIG1pY3Jvc2Vjb25kcy4KKwkgKi8KKwlFMTAwMF9XUklURV9SRUcoaHcsIENUUkwsICgqY3RybCB8IEUxMDAwX0NUUkxfTURDKSk7CisJRTEwMDBfV1JJVEVfRkxVU0goaHcpOworCXVkZWxheSgxMCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogTG93ZXJzIHRoZSBNYW5hZ2VtZW50IERhdGEgQ2xvY2sKKyoKKyogaHcgLSBTdHJ1Y3QgY29udGFpbmluZyB2YXJpYWJsZXMgYWNjZXNzZWQgYnkgc2hhcmVkIGNvZGUKKyogY3RybCAtIERldmljZSBjb250cm9sIHJlZ2lzdGVyJ3MgY3VycmVudCB2YWx1ZQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQKK2UxMDAwX2xvd2VyX21kaV9jbGsoc3RydWN0IGUxMDAwX2h3ICpodywKKyAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKmN0cmwpCit7CisJLyogTG93ZXIgdGhlIGNsb2NrIGlucHV0IHRvIHRoZSBNYW5hZ2VtZW50IERhdGEgQ2xvY2sgKGJ5IGNsZWFyaW5nIHRoZSBNREMKKwkgKiBiaXQpLCBhbmQgdGhlbiBkZWxheSAxMCBtaWNyb3NlY29uZHMuCisJICovCisJRTEwMDBfV1JJVEVfUkVHKGh3LCBDVFJMLCAoKmN0cmwgJiB+RTEwMDBfQ1RSTF9NREMpKTsKKwlFMTAwMF9XUklURV9GTFVTSChodyk7CisJdWRlbGF5KDEwKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBTaGlmdHMgZGF0YSBiaXRzIG91dCB0byB0aGUgUEhZCisqCisqIGh3IC0gU3RydWN0IGNvbnRhaW5pbmcgdmFyaWFibGVzIGFjY2Vzc2VkIGJ5IHNoYXJlZCBjb2RlCisqIGRhdGEgLSBEYXRhIHRvIHNlbmQgb3V0IHRvIHRoZSBQSFkKKyogY291bnQgLSBOdW1iZXIgb2YgYml0cyB0byBzaGlmdCBvdXQKKyoKKyogQml0cyBhcmUgc2hpZnRlZCBvdXQgaW4gTVNCIHRvIExTQiBvcmRlci4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkCitlMTAwMF9zaGlmdF9vdXRfbWRpX2JpdHMoc3RydWN0IGUxMDAwX2h3ICpodywKKyAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGNvdW50KQoreworCXVpbnQzMl90IGN0cmw7CisJdWludDMyX3QgbWFzazsKKworCS8qIFdlIG5lZWQgdG8gc2hpZnQgImNvdW50IiBudW1iZXIgb2YgYml0cyBvdXQgdG8gdGhlIFBIWS4gU28sIHRoZSB2YWx1ZQorCSAqIGluIHRoZSAiZGF0YSIgcGFyYW1ldGVyIHdpbGwgYmUgc2hpZnRlZCBvdXQgdG8gdGhlIFBIWSBvbmUgYml0IGF0IGEgCisJICogdGltZS4gSW4gb3JkZXIgdG8gZG8gdGhpcywgImRhdGEiIG11c3QgYmUgYnJva2VuIGRvd24gaW50byBiaXRzLgorCSAqLworCW1hc2sgPSAweDAxOworCW1hc2sgPDw9IChjb3VudCAtIDEpOworCQorCWN0cmwgPSBFMTAwMF9SRUFEX1JFRyhodywgQ1RSTCk7CisJCisJLyogU2V0IE1ESU9fRElSIGFuZCBNRENfRElSIGRpcmVjdGlvbiBiaXRzIHRvIGJlIHVzZWQgYXMgb3V0cHV0IHBpbnMuICovCisJY3RybCB8PSAoRTEwMDBfQ1RSTF9NRElPX0RJUiB8IEUxMDAwX0NUUkxfTURDX0RJUik7CisJCisJd2hpbGUobWFzaykgeworCQkvKiBBICIxIiBpcyBzaGlmdGVkIG91dCB0byB0aGUgUEhZIGJ5IHNldHRpbmcgdGhlIE1ESU8gYml0IHRvICIxIiBhbmQKKwkJICogdGhlbiByYWlzaW5nIGFuZCBsb3dlcmluZyB0aGUgTWFuYWdlbWVudCBEYXRhIENsb2NrLiBBICIwIiBpcworCQkgKiBzaGlmdGVkIG91dCB0byB0aGUgUEhZIGJ5IHNldHRpbmcgdGhlIE1ESU8gYml0IHRvICIwIiBhbmQgdGhlbgorCQkgKiByYWlzaW5nIGFuZCBsb3dlcmluZyB0aGUgY2xvY2suCisJCSAqLworCQlpZihkYXRhICYgbWFzaykgY3RybCB8PSBFMTAwMF9DVFJMX01ESU87CisJCWVsc2UgY3RybCAmPSB+RTEwMDBfQ1RSTF9NRElPOworCQkKKwkJRTEwMDBfV1JJVEVfUkVHKGh3LCBDVFJMLCBjdHJsKTsKKwkJRTEwMDBfV1JJVEVfRkxVU0goaHcpOworCQkKKwkJdWRlbGF5KDEwKTsKKworCQllMTAwMF9yYWlzZV9tZGlfY2xrKGh3LCAmY3RybCk7CisJCWUxMDAwX2xvd2VyX21kaV9jbGsoaHcsICZjdHJsKTsKKworCQltYXNrID0gbWFzayA+PiAxOworCX0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBTaGlmdHMgZGF0YSBiaXRzIGluIGZyb20gdGhlIFBIWQorKgorKiBodyAtIFN0cnVjdCBjb250YWluaW5nIHZhcmlhYmxlcyBhY2Nlc3NlZCBieSBzaGFyZWQgY29kZQorKgorKiBCaXRzIGFyZSBzaGlmdGVkIGluIGluIE1TQiB0byBMU0Igb3JkZXIuIAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHVpbnQxNl90CitlMTAwMF9zaGlmdF9pbl9tZGlfYml0cyhzdHJ1Y3QgZTEwMDBfaHcgKmh3KQoreworCXVpbnQzMl90IGN0cmw7CisJdWludDE2X3QgZGF0YSA9IDA7CisJdWludDhfdCBpOworCisJLyogSW4gb3JkZXIgdG8gcmVhZCBhIHJlZ2lzdGVyIGZyb20gdGhlIFBIWSwgd2UgbmVlZCB0byBzaGlmdCBpbiBhIHRvdGFsCisJICogb2YgMTggYml0cyBmcm9tIHRoZSBQSFkuIFRoZSBmaXJzdCB0d28gYml0ICh0dXJuYXJvdW5kKSB0aW1lcyBhcmUgdXNlZAorCSAqIHRvIGF2b2lkIGNvbnRlbnRpb24gb24gdGhlIE1ESU8gcGluIHdoZW4gYSByZWFkIG9wZXJhdGlvbiBpcyBwZXJmb3JtZWQuCisJICogVGhlc2UgdHdvIGJpdHMgYXJlIGlnbm9yZWQgYnkgdXMgYW5kIHRocm93biBhd2F5LiBCaXRzIGFyZSAic2hpZnRlZCBpbiIKKwkgKiBieSByYWlzaW5nIHRoZSBpbnB1dCB0byB0aGUgTWFuYWdlbWVudCBEYXRhIENsb2NrIChzZXR0aW5nIHRoZSBNREMgYml0KSwKKwkgKiBhbmQgdGhlbiByZWFkaW5nIHRoZSB2YWx1ZSBvZiB0aGUgTURJTyBiaXQuCisJICovIAorCWN0cmwgPSBFMTAwMF9SRUFEX1JFRyhodywgQ1RSTCk7CisJCisJLyogQ2xlYXIgTURJT19ESVIgKFNXRFBJTzEpIHRvIGluZGljYXRlIHRoaXMgYml0IGlzIHRvIGJlIHVzZWQgYXMgaW5wdXQuICovCisJY3RybCAmPSB+RTEwMDBfQ1RSTF9NRElPX0RJUjsKKwljdHJsICY9IH5FMTAwMF9DVFJMX01ESU87CisJCisJRTEwMDBfV1JJVEVfUkVHKGh3LCBDVFJMLCBjdHJsKTsKKwlFMTAwMF9XUklURV9GTFVTSChodyk7CisJCisJLyogUmFpc2UgYW5kIExvd2VyIHRoZSBjbG9jayBiZWZvcmUgcmVhZGluZyBpbiB0aGUgZGF0YS4gVGhpcyBhY2NvdW50cyBmb3IKKwkgKiB0aGUgdHVybmFyb3VuZCBiaXRzLiBUaGUgZmlyc3QgY2xvY2sgb2NjdXJyZWQgd2hlbiB3ZSBjbG9ja2VkIG91dCB0aGUKKwkgKiBsYXN0IGJpdCBvZiB0aGUgUmVnaXN0ZXIgQWRkcmVzcy4KKwkgKi8KKwllMTAwMF9yYWlzZV9tZGlfY2xrKGh3LCAmY3RybCk7CisJZTEwMDBfbG93ZXJfbWRpX2NsayhodywgJmN0cmwpOworCQorCWZvcihkYXRhID0gMCwgaSA9IDA7IGkgPCAxNjsgaSsrKSB7CisJCWRhdGEgPSBkYXRhIDw8IDE7CisJCWUxMDAwX3JhaXNlX21kaV9jbGsoaHcsICZjdHJsKTsKKwkJY3RybCA9IEUxMDAwX1JFQURfUkVHKGh3LCBDVFJMKTsKKwkJLyogQ2hlY2sgdG8gc2VlIGlmIHdlIHNoaWZ0ZWQgaW4gYSAiMSIuICovCisJCWlmKGN0cmwgJiBFMTAwMF9DVFJMX01ESU8pIGRhdGEgfD0gMTsKKwkJZTEwMDBfbG93ZXJfbWRpX2NsayhodywgJmN0cmwpOworCX0KKwkKKwllMTAwMF9yYWlzZV9tZGlfY2xrKGh3LCAmY3RybCk7CisJZTEwMDBfbG93ZXJfbWRpX2NsayhodywgJmN0cmwpOworCQorCXJldHVybiBkYXRhOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogUmVhZHMgdGhlIHZhbHVlIGZyb20gYSBQSFkgcmVnaXN0ZXIsIGlmIHRoZSB2YWx1ZSBpcyBvbiBhIHNwZWNpZmljIG5vbiB6ZXJvCisqIHBhZ2UsIHNldHMgdGhlIHBhZ2UgZmlyc3QuCisqCisqIGh3IC0gU3RydWN0IGNvbnRhaW5pbmcgdmFyaWFibGVzIGFjY2Vzc2VkIGJ5IHNoYXJlZCBjb2RlCisqIHJlZ19hZGRyIC0gYWRkcmVzcyBvZiB0aGUgUEhZIHJlZ2lzdGVyIHRvIHJlYWQKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQKK2UxMDAwX3JlYWRfcGh5X3JlZyhzdHJ1Y3QgZTEwMDBfaHcgKmh3LAorICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHJlZ19hZGRyLAorICAgICAgICAgICAgICAgICAgIHVpbnQxNl90ICpwaHlfZGF0YSkKK3sKKwl1aW50MzJfdCByZXRfdmFsOworCisJREVCVUdGVU5DKCJlMTAwMF9yZWFkX3BoeV9yZWciKTsKKworCWlmKGh3LT5waHlfdHlwZSA9PSBlMTAwMF9waHlfaWdwICYmCisJICAgKHJlZ19hZGRyID4gTUFYX1BIWV9NVUxUSV9QQUdFX1JFRykpIHsKKwkJaWYoKHJldF92YWwgPSBlMTAwMF93cml0ZV9waHlfcmVnX2V4KGh3LCBJR1AwMUUxMDAwX1BIWV9QQUdFX1NFTEVDVCwKKwkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1aW50MTZfdClyZWdfYWRkcikpKQorCQkJcmV0dXJuIHJldF92YWw7CisJfQorCisJcmV0X3ZhbCA9IGUxMDAwX3JlYWRfcGh5X3JlZ19leChodywgSUdQMDFFMTAwMF9QSFlfUEFHRV9TRUxFQ1QgJiByZWdfYWRkciwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeV9kYXRhKTsKKworCXJldHVybiByZXRfdmFsOworfQorCitzdGF0aWMgaW50CitlMTAwMF9yZWFkX3BoeV9yZWdfZXgoc3RydWN0IGUxMDAwX2h3ICpodywKKyAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCByZWdfYWRkciwKKyAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCAqcGh5X2RhdGEpCit7CisJdWludDMyX3QgaTsKKwl1aW50MzJfdCBtZGljID0gMDsKKwljb25zdCB1aW50MzJfdCBwaHlfYWRkciA9IDE7CisKKwlERUJVR0ZVTkMoImUxMDAwX3JlYWRfcGh5X3JlZ19leCIpOworCQorCWlmKHJlZ19hZGRyID4gTUFYX1BIWV9SRUdfQUREUkVTUykgeworCQlERUJVR09VVDEoIlBIWSBBZGRyZXNzICVkIGlzIG91dCBvZiByYW5nZVxuIiwgcmVnX2FkZHIpOworCQlyZXR1cm4gLUUxMDAwX0VSUl9QQVJBTTsKKwl9CisJCisJaWYoaHctPm1hY190eXBlID4gZTEwMDBfODI1NDMpIHsKKwkJLyogU2V0IHVwIE9wLWNvZGUsIFBoeSBBZGRyZXNzLCBhbmQgcmVnaXN0ZXIgYWRkcmVzcyBpbiB0aGUgTURJCisJCSAqIENvbnRyb2wgcmVnaXN0ZXIuICBUaGUgTUFDIHdpbGwgdGFrZSBjYXJlIG9mIGludGVyZmFjaW5nIHdpdGggdGhlCisJCSAqIFBIWSB0byByZXRyaWV2ZSB0aGUgZGVzaXJlZCBkYXRhLgorCQkgKi8KKwkJbWRpYyA9ICgocmVnX2FkZHIgPDwgRTEwMDBfTURJQ19SRUdfU0hJRlQpIHwKKwkJCShwaHlfYWRkciA8PCBFMTAwMF9NRElDX1BIWV9TSElGVCkgfCAKKwkJCShFMTAwMF9NRElDX09QX1JFQUQpKTsKKwkJCisJCUUxMDAwX1dSSVRFX1JFRyhodywgTURJQywgbWRpYyk7CisKKwkJLyogUG9sbCB0aGUgcmVhZHkgYml0IHRvIHNlZSBpZiB0aGUgTURJIHJlYWQgY29tcGxldGVkICovCisJCWZvcihpID0gMDsgaSA8IDY0OyBpKyspIHsKKwkJCXVkZWxheSg1MCk7CisJCQltZGljID0gRTEwMDBfUkVBRF9SRUcoaHcsIE1ESUMpOworCQkJaWYobWRpYyAmIEUxMDAwX01ESUNfUkVBRFkpIGJyZWFrOworCQl9CisJCWlmKCEobWRpYyAmIEUxMDAwX01ESUNfUkVBRFkpKSB7CisJCQlERUJVR09VVCgiTURJIFJlYWQgZGlkIG5vdCBjb21wbGV0ZVxuIik7CisJCQlyZXR1cm4gLUUxMDAwX0VSUl9QSFk7CisJCX0KKwkJaWYobWRpYyAmIEUxMDAwX01ESUNfRVJST1IpIHsKKwkJCURFQlVHT1VUKCJNREkgRXJyb3JcbiIpOworCQkJcmV0dXJuIC1FMTAwMF9FUlJfUEhZOworCQl9CisJCSpwaHlfZGF0YSA9ICh1aW50MTZfdCkgbWRpYzsKKwl9IGVsc2UgeworCQkvKiBXZSBtdXN0IGZpcnN0IHNlbmQgYSBwcmVhbWJsZSB0aHJvdWdoIHRoZSBNRElPIHBpbiB0byBzaWduYWwgdGhlCisJCSAqIGJlZ2lubmluZyBvZiBhbiBNSUkgaW5zdHJ1Y3Rpb24uICBUaGlzIGlzIGRvbmUgYnkgc2VuZGluZyAzMgorCQkgKiBjb25zZWN1dGl2ZSAiMSIgYml0cy4KKwkJICovCisJCWUxMDAwX3NoaWZ0X291dF9tZGlfYml0cyhodywgUEhZX1BSRUFNQkxFLCBQSFlfUFJFQU1CTEVfU0laRSk7CisJCQorCQkvKiBOb3cgY29tYmluZSB0aGUgbmV4dCBmZXcgZmllbGRzIHRoYXQgYXJlIHJlcXVpcmVkIGZvciBhIHJlYWQKKwkJICogb3BlcmF0aW9uLiAgV2UgdXNlIHRoaXMgbWV0aG9kIGluc3RlYWQgb2YgY2FsbGluZyB0aGUKKwkJICogZTEwMDBfc2hpZnRfb3V0X21kaV9iaXRzIHJvdXRpbmUgZml2ZSBkaWZmZXJlbnQgdGltZXMuIFRoZSBmb3JtYXQgb2YKKwkJICogYSBNSUkgcmVhZCBpbnN0cnVjdGlvbiBjb25zaXN0cyBvZiBhIHNoaWZ0IG91dCBvZiAxNCBiaXRzIGFuZCBpcworCQkgKiBkZWZpbmVkIGFzIGZvbGxvd3M6CisJCSAqICAgIDxQcmVhbWJsZT48U09GPjxPcCBDb2RlPjxQaHkgQWRkcj48UmVnIEFkZHI+CisJCSAqIGZvbGxvd2VkIGJ5IGEgc2hpZnQgaW4gb2YgMTggYml0cy4gIFRoaXMgZmlyc3QgdHdvIGJpdHMgc2hpZnRlZCBpbgorCQkgKiBhcmUgVHVybkFyb3VuZCBiaXRzIHVzZWQgdG8gYXZvaWQgY29udGVudGlvbiBvbiB0aGUgTURJTyBwaW4gd2hlbiBhCisJCSAqIFJFQUQgb3BlcmF0aW9uIGlzIHBlcmZvcm1lZC4gIFRoZXNlIHR3byBiaXRzIGFyZSB0aHJvd24gYXdheQorCQkgKiBmb2xsb3dlZCBieSBhIHNoaWZ0IGluIG9mIDE2IGJpdHMgd2hpY2ggY29udGFpbnMgdGhlIGRlc2lyZWQgZGF0YS4KKwkJICovCisJCW1kaWMgPSAoKHJlZ19hZGRyKSB8IChwaHlfYWRkciA8PCA1KSB8IAorCQkJKFBIWV9PUF9SRUFEIDw8IDEwKSB8IChQSFlfU09GIDw8IDEyKSk7CisJCQorCQllMTAwMF9zaGlmdF9vdXRfbWRpX2JpdHMoaHcsIG1kaWMsIDE0KTsKKwkJCisJCS8qIE5vdyB0aGF0IHdlJ3ZlIHNoaWZ0ZWQgb3V0IHRoZSByZWFkIGNvbW1hbmQgdG8gdGhlIE1JSSwgd2UgbmVlZCB0bworCQkgKiAic2hpZnQgaW4iIHRoZSAxNi1iaXQgdmFsdWUgKDE4IHRvdGFsIGJpdHMpIG9mIHRoZSByZXF1ZXN0ZWQgUEhZCisJCSAqIHJlZ2lzdGVyIGFkZHJlc3MuCisJCSAqLworCQkqcGh5X2RhdGEgPSBlMTAwMF9zaGlmdF9pbl9tZGlfYml0cyhodyk7CisJfQorCXJldHVybiBFMTAwMF9TVUNDRVNTOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIFdyaXRlcyBhIHZhbHVlIHRvIGEgUEhZIHJlZ2lzdGVyCisqCisqIGh3IC0gU3RydWN0IGNvbnRhaW5pbmcgdmFyaWFibGVzIGFjY2Vzc2VkIGJ5IHNoYXJlZCBjb2RlCisqIHJlZ19hZGRyIC0gYWRkcmVzcyBvZiB0aGUgUEhZIHJlZ2lzdGVyIHRvIHdyaXRlCisqIGRhdGEgLSBkYXRhIHRvIHdyaXRlIHRvIHRoZSBQSFkKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQgCitlMTAwMF93cml0ZV9waHlfcmVnKHN0cnVjdCBlMTAwMF9odyAqaHcsCisgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHJlZ19hZGRyLAorICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBwaHlfZGF0YSkKK3sKKwl1aW50MzJfdCByZXRfdmFsOworCisJREVCVUdGVU5DKCJlMTAwMF93cml0ZV9waHlfcmVnIik7CisKKwlpZihody0+cGh5X3R5cGUgPT0gZTEwMDBfcGh5X2lncCAmJgorCSAgIChyZWdfYWRkciA+IE1BWF9QSFlfTVVMVElfUEFHRV9SRUcpKSB7CisJCWlmKChyZXRfdmFsID0gZTEwMDBfd3JpdGVfcGh5X3JlZ19leChodywgSUdQMDFFMTAwMF9QSFlfUEFHRV9TRUxFQ1QsCisJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodWludDE2X3QpcmVnX2FkZHIpKSkKKwkJCXJldHVybiByZXRfdmFsOworCX0KKworCXJldF92YWwgPSBlMTAwMF93cml0ZV9waHlfcmVnX2V4KGh3LCBJR1AwMUUxMDAwX1BIWV9QQUdFX1NFTEVDVCAmIHJlZ19hZGRyLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeV9kYXRhKTsKKworCXJldHVybiByZXRfdmFsOworfQorCitzdGF0aWMgaW50CitlMTAwMF93cml0ZV9waHlfcmVnX2V4KHN0cnVjdCBlMTAwMF9odyAqaHcsCisgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHJlZ19hZGRyLAorICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBwaHlfZGF0YSkKK3sKKwl1aW50MzJfdCBpOworCXVpbnQzMl90IG1kaWMgPSAwOworCWNvbnN0IHVpbnQzMl90IHBoeV9hZGRyID0gMTsKKwkKKwlERUJVR0ZVTkMoImUxMDAwX3dyaXRlX3BoeV9yZWdfZXgiKTsKKwkKKwlpZihyZWdfYWRkciA+IE1BWF9QSFlfUkVHX0FERFJFU1MpIHsKKwkJREVCVUdPVVQxKCJQSFkgQWRkcmVzcyAlZCBpcyBvdXQgb2YgcmFuZ2VcbiIsIHJlZ19hZGRyKTsKKwkJcmV0dXJuIC1FMTAwMF9FUlJfUEFSQU07CisJfQorCQorCWlmKGh3LT5tYWNfdHlwZSA+IGUxMDAwXzgyNTQzKSB7CisJCS8qIFNldCB1cCBPcC1jb2RlLCBQaHkgQWRkcmVzcywgcmVnaXN0ZXIgYWRkcmVzcywgYW5kIGRhdGEgaW50ZW5kZWQKKwkJICogZm9yIHRoZSBQSFkgcmVnaXN0ZXIgaW4gdGhlIE1ESSBDb250cm9sIHJlZ2lzdGVyLiAgVGhlIE1BQyB3aWxsIHRha2UKKwkJICogY2FyZSBvZiBpbnRlcmZhY2luZyB3aXRoIHRoZSBQSFkgdG8gc2VuZCB0aGUgZGVzaXJlZCBkYXRhLgorCQkgKi8KKwkJbWRpYyA9ICgoKHVpbnQzMl90KSBwaHlfZGF0YSkgfAorCQkJKHJlZ19hZGRyIDw8IEUxMDAwX01ESUNfUkVHX1NISUZUKSB8CisJCQkocGh5X2FkZHIgPDwgRTEwMDBfTURJQ19QSFlfU0hJRlQpIHwgCisJCQkoRTEwMDBfTURJQ19PUF9XUklURSkpOworCQkKKwkJRTEwMDBfV1JJVEVfUkVHKGh3LCBNRElDLCBtZGljKTsKKwkJCisJCS8qIFBvbGwgdGhlIHJlYWR5IGJpdCB0byBzZWUgaWYgdGhlIE1ESSByZWFkIGNvbXBsZXRlZCAqLworCQlmb3IoaSA9IDA7IGkgPCA2NDA7IGkrKykgeworCQkJdWRlbGF5KDUpOworCQkJbWRpYyA9IEUxMDAwX1JFQURfUkVHKGh3LCBNRElDKTsKKwkJCWlmKG1kaWMgJiBFMTAwMF9NRElDX1JFQURZKSBicmVhazsKKwkJfQorCQlpZighKG1kaWMgJiBFMTAwMF9NRElDX1JFQURZKSkgeworCQkJREVCVUdPVVQoIk1ESSBXcml0ZSBkaWQgbm90IGNvbXBsZXRlXG4iKTsKKwkJCXJldHVybiAtRTEwMDBfRVJSX1BIWTsKKwkJfQorCX0gZWxzZSB7CisJCS8qIFdlJ2xsIG5lZWQgdG8gdXNlIHRoZSBTVyBkZWZpbmVkIHBpbnMgdG8gc2hpZnQgdGhlIHdyaXRlIGNvbW1hbmQKKwkJICogb3V0IHRvIHRoZSBQSFkuIFdlIGZpcnN0IHNlbmQgYSBwcmVhbWJsZSB0byB0aGUgUEhZIHRvIHNpZ25hbCB0aGUKKwkJICogYmVnaW5uaW5nIG9mIHRoZSBNSUkgaW5zdHJ1Y3Rpb24uICBUaGlzIGlzIGRvbmUgYnkgc2VuZGluZyAzMiAKKwkJICogY29uc2VjdXRpdmUgIjEiIGJpdHMuCisJCSAqLworCQllMTAwMF9zaGlmdF9vdXRfbWRpX2JpdHMoaHcsIFBIWV9QUkVBTUJMRSwgUEhZX1BSRUFNQkxFX1NJWkUpOworCQkKKwkJLyogTm93IGNvbWJpbmUgdGhlIHJlbWFpbmluZyByZXF1aXJlZCBmaWVsZHMgdGhhdCB3aWxsIGluZGljYXRlIGEgCisJCSAqIHdyaXRlIG9wZXJhdGlvbi4gV2UgdXNlIHRoaXMgbWV0aG9kIGluc3RlYWQgb2YgY2FsbGluZyB0aGUKKwkJICogZTEwMDBfc2hpZnRfb3V0X21kaV9iaXRzIHJvdXRpbmUgZm9yIGVhY2ggZmllbGQgaW4gdGhlIGNvbW1hbmQuIFRoZQorCQkgKiBmb3JtYXQgb2YgYSBNSUkgd3JpdGUgaW5zdHJ1Y3Rpb24gaXMgYXMgZm9sbG93czoKKwkJICogPFByZWFtYmxlPjxTT0Y+PE9wIENvZGU+PFBoeSBBZGRyPjxSZWcgQWRkcj48VHVybmFyb3VuZD48RGF0YT4uCisJCSAqLworCQltZGljID0gKChQSFlfVFVSTkFST1VORCkgfCAocmVnX2FkZHIgPDwgMikgfCAocGh5X2FkZHIgPDwgNykgfAorCQkJKFBIWV9PUF9XUklURSA8PCAxMikgfCAoUEhZX1NPRiA8PCAxNCkpOworCQltZGljIDw8PSAxNjsKKwkJbWRpYyB8PSAodWludDMyX3QpIHBoeV9kYXRhOworCQkKKwkJZTEwMDBfc2hpZnRfb3V0X21kaV9iaXRzKGh3LCBtZGljLCAzMik7CisJfQorCisJcmV0dXJuIEUxMDAwX1NVQ0NFU1M7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogUmV0dXJucyB0aGUgUEhZIHRvIHRoZSBwb3dlci1vbiByZXNldCBzdGF0ZQorKgorKiBodyAtIFN0cnVjdCBjb250YWluaW5nIHZhcmlhYmxlcyBhY2Nlc3NlZCBieSBzaGFyZWQgY29kZQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQKK2UxMDAwX3BoeV9od19yZXNldChzdHJ1Y3QgZTEwMDBfaHcgKmh3KQoreworCXVpbnQzMl90IGN0cmwsIGN0cmxfZXh0OworCisJREVCVUdGVU5DKCJlMTAwMF9waHlfaHdfcmVzZXQiKTsKKwkKKwlERUJVR09VVCgiUmVzZXR0aW5nIFBoeS4uLlxuIik7CisJCisJaWYoaHctPm1hY190eXBlID4gZTEwMDBfODI1NDMpIHsKKwkJLyogUmVhZCB0aGUgZGV2aWNlIGNvbnRyb2wgcmVnaXN0ZXIgYW5kIGFzc2VydCB0aGUgRTEwMDBfQ1RSTF9QSFlfUlNUCisJCSAqIGJpdC4gVGhlbiwgdGFrZSBpdCBvdXQgb2YgcmVzZXQuCisJCSAqLworCQljdHJsID0gRTEwMDBfUkVBRF9SRUcoaHcsIENUUkwpOworCQlFMTAwMF9XUklURV9SRUcoaHcsIENUUkwsIGN0cmwgfCBFMTAwMF9DVFJMX1BIWV9SU1QpOworCQlFMTAwMF9XUklURV9GTFVTSChodyk7CisJCW1kZWxheSgxMCk7CisJCUUxMDAwX1dSSVRFX1JFRyhodywgQ1RSTCwgY3RybCk7CisJCUUxMDAwX1dSSVRFX0ZMVVNIKGh3KTsKKwl9IGVsc2UgeworCQkvKiBSZWFkIHRoZSBFeHRlbmRlZCBEZXZpY2UgQ29udHJvbCBSZWdpc3RlciwgYXNzZXJ0IHRoZSBQSFlfUkVTRVRfRElSCisJCSAqIGJpdCB0byBwdXQgdGhlIFBIWSBpbnRvIHJlc2V0LiBUaGVuLCB0YWtlIGl0IG91dCBvZiByZXNldC4KKwkJICovCisJCWN0cmxfZXh0ID0gRTEwMDBfUkVBRF9SRUcoaHcsIENUUkxfRVhUKTsKKwkJY3RybF9leHQgfD0gRTEwMDBfQ1RSTF9FWFRfU0RQNF9ESVI7CisJCWN0cmxfZXh0ICY9IH5FMTAwMF9DVFJMX0VYVF9TRFA0X0RBVEE7CisJCUUxMDAwX1dSSVRFX1JFRyhodywgQ1RSTF9FWFQsIGN0cmxfZXh0KTsKKwkJRTEwMDBfV1JJVEVfRkxVU0goaHcpOworCQltZGVsYXkoMTApOworCQljdHJsX2V4dCB8PSBFMTAwMF9DVFJMX0VYVF9TRFA0X0RBVEE7CisJCUUxMDAwX1dSSVRFX1JFRyhodywgQ1RSTF9FWFQsIGN0cmxfZXh0KTsKKwkJRTEwMDBfV1JJVEVfRkxVU0goaHcpOworCX0KKwl1ZGVsYXkoMTUwKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBSZXNldHMgdGhlIFBIWQorKgorKiBodyAtIFN0cnVjdCBjb250YWluaW5nIHZhcmlhYmxlcyBhY2Nlc3NlZCBieSBzaGFyZWQgY29kZQorKgorKiBTZXRzIGJpdCAxNSBvZiB0aGUgTUlJIENvbnRyb2wgcmVnaXNlcgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludCAKK2UxMDAwX3BoeV9yZXNldChzdHJ1Y3QgZTEwMDBfaHcgKmh3KQoreworCWludDMyX3QgcmV0X3ZhbDsKKwl1aW50MTZfdCBwaHlfZGF0YTsKKworCURFQlVHRlVOQygiZTEwMDBfcGh5X3Jlc2V0Iik7CisKKwlpZihody0+bWFjX3R5cGUgIT0gZTEwMDBfODI1NDFfcmV2XzIpIHsKKwkJaWYoKHJldF92YWwgPSBlMTAwMF9yZWFkX3BoeV9yZWcoaHcsIFBIWV9DVFJMLCAmcGh5X2RhdGEpKSkKKwkJCXJldHVybiByZXRfdmFsOworCQkKKwkJcGh5X2RhdGEgfD0gTUlJX0NSX1JFU0VUOworCQlpZigocmV0X3ZhbCA9IGUxMDAwX3dyaXRlX3BoeV9yZWcoaHcsIFBIWV9DVFJMLCBwaHlfZGF0YSkpKQorCQkJcmV0dXJuIHJldF92YWw7CisJCQorCQl1ZGVsYXkoMSk7CisJfSBlbHNlIGUxMDAwX3BoeV9od19yZXNldChodyk7CisKKwlpZihody0+cGh5X3R5cGUgPT0gZTEwMDBfcGh5X2lncCkKKwkJZTEwMDBfcGh5X2luaXRfc2NyaXB0KGh3KTsKKworCXJldHVybiBFMTAwMF9TVUNDRVNTOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIFByb2JlcyB0aGUgZXhwZWN0ZWQgUEhZIGFkZHJlc3MgZm9yIGtub3duIFBIWSBJRHMKKyoKKyogaHcgLSBTdHJ1Y3QgY29udGFpbmluZyB2YXJpYWJsZXMgYWNjZXNzZWQgYnkgc2hhcmVkIGNvZGUKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQKK2UxMDAwX2RldGVjdF9naWdfcGh5KHN0cnVjdCBlMTAwMF9odyAqaHcpCit7CisJaW50MzJfdCBwaHlfaW5pdF9zdGF0dXMsIHJldF92YWw7CisJdWludDE2X3QgcGh5X2lkX2hpZ2gsIHBoeV9pZF9sb3c7CisJYm9vbGVhbl90IG1hdGNoID0gRkFMU0U7CisKKwlERUJVR0ZVTkMoImUxMDAwX2RldGVjdF9naWdfcGh5Iik7CisJCisJLyogUmVhZCB0aGUgUEhZIElEIFJlZ2lzdGVycyB0byBpZGVudGlmeSB3aGljaCBQSFkgaXMgb25ib2FyZC4gKi8KKwlpZigocmV0X3ZhbCA9IGUxMDAwX3JlYWRfcGh5X3JlZyhodywgUEhZX0lEMSwgJnBoeV9pZF9oaWdoKSkpCisJCXJldHVybiByZXRfdmFsOworCisJaHctPnBoeV9pZCA9ICh1aW50MzJfdCkgKHBoeV9pZF9oaWdoIDw8IDE2KTsKKwl1ZGVsYXkoMjApOworCWlmKChyZXRfdmFsID0gZTEwMDBfcmVhZF9waHlfcmVnKGh3LCBQSFlfSUQyLCAmcGh5X2lkX2xvdykpKQorCQlyZXR1cm4gcmV0X3ZhbDsKKwkKKwlody0+cGh5X2lkIHw9ICh1aW50MzJfdCkgKHBoeV9pZF9sb3cgJiBQSFlfUkVWSVNJT05fTUFTSyk7CisjaWZkZWYgTElOVVhfRFJJVkVSCisJaHctPnBoeV9yZXZpc2lvbiA9ICh1aW50MzJfdCkgcGh5X2lkX2xvdyAmIH5QSFlfUkVWSVNJT05fTUFTSzsKKyNlbmRpZgorCQorCXN3aXRjaChody0+bWFjX3R5cGUpIHsKKwljYXNlIGUxMDAwXzgyNTQzOgorCQlpZihody0+cGh5X2lkID09IE04OEUxMDAwX0VfUEhZX0lEKSBtYXRjaCA9IFRSVUU7CisJCWJyZWFrOworCWNhc2UgZTEwMDBfODI1NDQ6CisJCWlmKGh3LT5waHlfaWQgPT0gTTg4RTEwMDBfSV9QSFlfSUQpIG1hdGNoID0gVFJVRTsKKwkJYnJlYWs7CisJY2FzZSBlMTAwMF84MjU0MDoKKwljYXNlIGUxMDAwXzgyNTQ1OgorCWNhc2UgZTEwMDBfODI1NDVfcmV2XzM6CisJY2FzZSBlMTAwMF84MjU0NjoKKwljYXNlIGUxMDAwXzgyNTQ2X3Jldl8zOgorCQlpZihody0+cGh5X2lkID09IE04OEUxMDExX0lfUEhZX0lEKSBtYXRjaCA9IFRSVUU7CisJCWJyZWFrOworCWNhc2UgZTEwMDBfODI1NDE6CisJY2FzZSBlMTAwMF84MjU0MV9yZXZfMjoKKwljYXNlIGUxMDAwXzgyNTQ3OgorCWNhc2UgZTEwMDBfODI1NDdfcmV2XzI6CisJCWlmKGh3LT5waHlfaWQgPT0gSUdQMDFFMTAwMF9JX1BIWV9JRCkgbWF0Y2ggPSBUUlVFOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlERUJVR09VVDEoIkludmFsaWQgTUFDIHR5cGUgJWRcbiIsIGh3LT5tYWNfdHlwZSk7CisJCXJldHVybiAtRTEwMDBfRVJSX0NPTkZJRzsKKwl9CisJcGh5X2luaXRfc3RhdHVzID0gZTEwMDBfc2V0X3BoeV90eXBlKGh3KTsKKworCWlmICgobWF0Y2gpICYmIChwaHlfaW5pdF9zdGF0dXMgPT0gRTEwMDBfU1VDQ0VTUykpIHsKKwkJREVCVUdPVVQxKCJQSFkgSUQgMHglWCBkZXRlY3RlZFxuIiwgaHctPnBoeV9pZCk7CisJCXJldHVybiBFMTAwMF9TVUNDRVNTOworCX0KKwlERUJVR09VVDEoIkludmFsaWQgUEhZIElEIDB4JVhcbiIsIGh3LT5waHlfaWQpOworCXJldHVybiAtRTEwMDBfRVJSX1BIWTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogU2V0cyB1cCBlZXByb20gdmFyaWFibGVzIGluIHRoZSBodyBzdHJ1Y3QuICBNdXN0IGJlIGNhbGxlZCBhZnRlciBtYWNfdHlwZQorICogaXMgY29uZmlndXJlZC4KKyAqCisgKiBodyAtIFN0cnVjdCBjb250YWluaW5nIHZhcmlhYmxlcyBhY2Nlc3NlZCBieSBzaGFyZWQgY29kZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQKK2UxMDAwX2luaXRfZWVwcm9tX3BhcmFtcyhzdHJ1Y3QgZTEwMDBfaHcgKmh3KQoreworCXN0cnVjdCBlMTAwMF9lZXByb21faW5mbyAqZWVwcm9tID0gJmh3LT5lZXByb207CisJdWludDMyX3QgZWVjZCA9IEUxMDAwX1JFQURfUkVHKGh3LCBFRUNEKTsKKwl1aW50MTZfdCBlZXByb21fc2l6ZTsKKworCURFQlVHRlVOQygiZTEwMDBfaW5pdF9lZXByb21fcGFyYW1zIik7CisKKwlzd2l0Y2ggKGh3LT5tYWNfdHlwZSkgeworCWNhc2UgZTEwMDBfODI1NDJfcmV2Ml8wOgorCWNhc2UgZTEwMDBfODI1NDJfcmV2Ml8xOgorCWNhc2UgZTEwMDBfODI1NDM6CisJY2FzZSBlMTAwMF84MjU0NDoKKwkJZWVwcm9tLT50eXBlID0gZTEwMDBfZWVwcm9tX21pY3Jvd2lyZTsKKwkJZWVwcm9tLT53b3JkX3NpemUgPSA2NDsKKwkJZWVwcm9tLT5vcGNvZGVfYml0cyA9IDM7CisJCWVlcHJvbS0+YWRkcmVzc19iaXRzID0gNjsKKwkJZWVwcm9tLT5kZWxheV91c2VjID0gNTA7CisJCWJyZWFrOworCWNhc2UgZTEwMDBfODI1NDA6CisJY2FzZSBlMTAwMF84MjU0NToKKwljYXNlIGUxMDAwXzgyNTQ1X3Jldl8zOgorCWNhc2UgZTEwMDBfODI1NDY6CisJY2FzZSBlMTAwMF84MjU0Nl9yZXZfMzoKKwkJZWVwcm9tLT50eXBlID0gZTEwMDBfZWVwcm9tX21pY3Jvd2lyZTsKKwkJZWVwcm9tLT5vcGNvZGVfYml0cyA9IDM7CisJCWVlcHJvbS0+ZGVsYXlfdXNlYyA9IDUwOworCQlpZihlZWNkICYgRTEwMDBfRUVDRF9TSVpFKSB7CisJCQllZXByb20tPndvcmRfc2l6ZSA9IDI1NjsKKwkJCWVlcHJvbS0+YWRkcmVzc19iaXRzID0gODsKKwkJfSBlbHNlIHsKKwkJCWVlcHJvbS0+d29yZF9zaXplID0gNjQ7CisJCQllZXByb20tPmFkZHJlc3NfYml0cyA9IDY7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBlMTAwMF84MjU0MToKKwljYXNlIGUxMDAwXzgyNTQxX3Jldl8yOgorCWNhc2UgZTEwMDBfODI1NDc6CisJY2FzZSBlMTAwMF84MjU0N19yZXZfMjoKKwkJaWYgKGVlY2QgJiBFMTAwMF9FRUNEX1RZUEUpIHsKKwkJCWVlcHJvbS0+dHlwZSA9IGUxMDAwX2VlcHJvbV9zcGk7CisJCQlpZiAoZWVjZCAmIEUxMDAwX0VFQ0RfQUREUl9CSVRTKSB7CisJCQkJZWVwcm9tLT5wYWdlX3NpemUgPSAzMjsKKwkJCQllZXByb20tPmFkZHJlc3NfYml0cyA9IDE2OworCQkJfSBlbHNlIHsKKwkJCQllZXByb20tPnBhZ2Vfc2l6ZSA9IDg7CisJCQkJZWVwcm9tLT5hZGRyZXNzX2JpdHMgPSA4OworCQkJfQorCQl9IGVsc2UgeworCQkJZWVwcm9tLT50eXBlID0gZTEwMDBfZWVwcm9tX21pY3Jvd2lyZTsKKwkJCWVlcHJvbS0+b3Bjb2RlX2JpdHMgPSAzOworCQkJZWVwcm9tLT5kZWxheV91c2VjID0gNTA7CisJCQlpZiAoZWVjZCAmIEUxMDAwX0VFQ0RfQUREUl9CSVRTKSB7CisJCQkJZWVwcm9tLT53b3JkX3NpemUgPSAyNTY7CisJCQkJZWVwcm9tLT5hZGRyZXNzX2JpdHMgPSA4OworCQkJfSBlbHNlIHsKKwkJCQllZXByb20tPndvcmRfc2l6ZSA9IDY0OworCQkJCWVlcHJvbS0+YWRkcmVzc19iaXRzID0gNjsKKwkJCX0KKwkJfQorCQlicmVhazsKKwlkZWZhdWx0OgorCQllZXByb20tPnR5cGUgPSBlMTAwMF9lZXByb21fc3BpOworCQlpZiAoZWVjZCAmIEUxMDAwX0VFQ0RfQUREUl9CSVRTKSB7CisJCQllZXByb20tPnBhZ2Vfc2l6ZSA9IDMyOworCQkJZWVwcm9tLT5hZGRyZXNzX2JpdHMgPSAxNjsKKwkJfSBlbHNlIHsKKwkJCWVlcHJvbS0+cGFnZV9zaXplID0gODsKKwkJCWVlcHJvbS0+YWRkcmVzc19iaXRzID0gODsKKwkJfQorCQlicmVhazsKKwl9CisKKwlpZiAoZWVwcm9tLT50eXBlID09IGUxMDAwX2VlcHJvbV9zcGkpIHsKKwkJZWVwcm9tLT5vcGNvZGVfYml0cyA9IDg7CisJCWVlcHJvbS0+ZGVsYXlfdXNlYyA9IDE7CisJCWVlcHJvbS0+d29yZF9zaXplID0gNjQ7CisJCWlmIChlMTAwMF9yZWFkX2VlcHJvbShodywgRUVQUk9NX0NGRywgMSwgJmVlcHJvbV9zaXplKSA9PSAwKSB7CisJCQllZXByb21fc2l6ZSAmPSBFRVBST01fU0laRV9NQVNLOworCisJCQlzd2l0Y2ggKGVlcHJvbV9zaXplKSB7CisJCQljYXNlIEVFUFJPTV9TSVpFXzE2S0I6CisJCQkJZWVwcm9tLT53b3JkX3NpemUgPSA4MTkyOworCQkJCWJyZWFrOworCQkJY2FzZSBFRVBST01fU0laRV84S0I6CisJCQkJZWVwcm9tLT53b3JkX3NpemUgPSA0MDk2OworCQkJCWJyZWFrOworCQkJY2FzZSBFRVBST01fU0laRV80S0I6CisJCQkJZWVwcm9tLT53b3JkX3NpemUgPSAyMDQ4OworCQkJCWJyZWFrOworCQkJY2FzZSBFRVBST01fU0laRV8yS0I6CisJCQkJZWVwcm9tLT53b3JkX3NpemUgPSAxMDI0OworCQkJCWJyZWFrOworCQkJY2FzZSBFRVBST01fU0laRV8xS0I6CisJCQkJZWVwcm9tLT53b3JkX3NpemUgPSA1MTI7CisJCQkJYnJlYWs7CisJCQljYXNlIEVFUFJPTV9TSVpFXzUxMkI6CisJCQkJZWVwcm9tLT53b3JkX3NpemUgPSAyNTY7CisJCQkJYnJlYWs7CisJCQljYXNlIEVFUFJPTV9TSVpFXzEyOEI6CisJCQlkZWZhdWx0OgorCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorfQorCisvKioKKyAqIGUxMDAwX3Jlc2V0IC0gUmVzZXQgdGhlIGFkYXB0ZXIKKyAqLworCitzdGF0aWMgaW50CitlMTAwMF9yZXNldChzdHJ1Y3QgZTEwMDBfaHcgKmh3KQoreworCXVpbnQzMl90IHBiYTsKKwkvKiBSZXBhcnRpdGlvbiBQYmEgZm9yIGdyZWF0ZXIgdGhhbiA5ayBtdHUKKwkgKiBUbyB0YWtlIGVmZmVjdCBDVFJMLlJTVCBpcyByZXF1aXJlZC4KKwkgKi8KKworCWlmKGh3LT5tYWNfdHlwZSA8IGUxMDAwXzgyNTQ3KSB7CisJCXBiYSA9IEUxMDAwX1BCQV80OEs7CisJfSBlbHNlIHsKKwkJcGJhID0gRTEwMDBfUEJBXzMwSzsKKwl9CisJRTEwMDBfV1JJVEVfUkVHKGh3LCBQQkEsIHBiYSk7CisKKwkvKiBmbG93IGNvbnRyb2wgc2V0dGluZ3MgKi8KKyNpZiAwCisJaHctPmZjX2hpZ2hfd2F0ZXIgPSBGQ19ERUZBVUxUX0hJX1RIUkVTSDsKKwlody0+ZmNfbG93X3dhdGVyID0gRkNfREVGQVVMVF9MT19USFJFU0g7CisJaHctPmZjX3BhdXNlX3RpbWUgPSBGQ19ERUZBVUxUX1RYX1RJTUVSOworCWh3LT5mY19zZW5kX3hvbiA9IDE7CisJaHctPmZjID0gaHctPm9yaWdpbmFsX2ZjOworI2VuZGlmCisJCisJZTEwMDBfcmVzZXRfaHcoaHcpOworCWlmKGh3LT5tYWNfdHlwZSA+PSBlMTAwMF84MjU0NCkKKwkJRTEwMDBfV1JJVEVfUkVHKGh3LCBXVUMsIDApOworCXJldHVybiBlMTAwMF9pbml0X2h3KGh3KTsKK30KKworLyoqCisgKiBlMTAwMF9zd19pbml0IC0gSW5pdGlhbGl6ZSBnZW5lcmFsIHNvZnR3YXJlIHN0cnVjdHVyZXMgKHN0cnVjdCBlMTAwMF9hZGFwdGVyKQorICogQGFkYXB0ZXI6IGJvYXJkIHByaXZhdGUgc3RydWN0dXJlIHRvIGluaXRpYWxpemUKKyAqCisgKiBlMTAwMF9zd19pbml0IGluaXRpYWxpemVzIHRoZSBBZGFwdGVyIHByaXZhdGUgZGF0YSBzdHJ1Y3R1cmUuCisgKiBGaWVsZHMgYXJlIGluaXRpYWxpemVkIGJhc2VkIG9uIFBDSSBkZXZpY2UgaW5mb3JtYXRpb24gYW5kCisgKiBPUyBuZXR3b3JrIGRldmljZSBzZXR0aW5ncyAoTVRVIHNpemUpLgorICoqLworCitzdGF0aWMgaW50IAorZTEwMDBfc3dfaW5pdChzdHJ1Y3QgcGNpX2RldmljZSAqcGRldiwgc3RydWN0IGUxMDAwX2h3ICpodykKK3sKKwlpbnQgcmVzdWx0OworCisJLyogUENJIGNvbmZpZyBzcGFjZSBpbmZvICovCisJcGNpX3JlYWRfY29uZmlnX3dvcmQocGRldiwgUENJX1ZFTkRPUl9JRCwgJmh3LT52ZW5kb3JfaWQpOworCXBjaV9yZWFkX2NvbmZpZ193b3JkKHBkZXYsIFBDSV9ERVZJQ0VfSUQsICZody0+ZGV2aWNlX2lkKTsKKwlwY2lfcmVhZF9jb25maWdfYnl0ZShwZGV2LCBQQ0lfUkVWSVNJT04sICZody0+cmV2aXNpb25faWQpOworI2lmIDAKKwlwY2lfcmVhZF9jb25maWdfd29yZChwZGV2LCBQQ0lfU1VCU1lTVEVNX1ZFTkRPUl9JRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmh3LT5zdWJzeXN0ZW1fdmVuZG9yX2lkKTsKKwlwY2lfcmVhZF9jb25maWdfd29yZChwZGV2LCBQQ0lfU1VCU1lTVEVNX0lELCAmaHctPnN1YnN5c3RlbV9pZCk7CisjZW5kaWYKKworCXBjaV9yZWFkX2NvbmZpZ193b3JkKHBkZXYsIFBDSV9DT01NQU5ELCAmaHctPnBjaV9jbWRfd29yZCk7CisKKwkvKiBpZGVudGlmeSB0aGUgTUFDICovCisKKwlyZXN1bHQgPSBlMTAwMF9zZXRfbWFjX3R5cGUoaHcpOworCWlmIChyZXN1bHQpIHsKKwkJRTEwMDBfRVJSKCJVbmtub3duIE1BQyBUeXBlXG4iKTsKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwkvKiBpbml0aWFsaXplIGVlcHJvbSBwYXJhbWV0ZXJzICovCisKKwllMTAwMF9pbml0X2VlcHJvbV9wYXJhbXMoaHcpOworCisjaWYgMAorCWlmKChody0+bWFjX3R5cGUgPT0gZTEwMDBfODI1NDEpIHx8CisJICAgKGh3LT5tYWNfdHlwZSA9PSBlMTAwMF84MjU0NykgfHwKKwkgICAoaHctPm1hY190eXBlID09IGUxMDAwXzgyNTQxX3Jldl8yKSB8fAorCSAgIChody0+bWFjX3R5cGUgPT0gZTEwMDBfODI1NDdfcmV2XzIpKQorCQlody0+cGh5X2luaXRfc2NyaXB0ID0gMTsKKyNlbmRpZgorCisJZTEwMDBfc2V0X21lZGlhX3R5cGUoaHcpOworCisjaWYgMAorCWlmKGh3LT5tYWNfdHlwZSA8IGUxMDAwXzgyNTQzKQorCQlody0+cmVwb3J0X3R4X2Vhcmx5ID0gMDsKKwllbHNlCisJCWh3LT5yZXBvcnRfdHhfZWFybHkgPSAxOworCisJaHctPndhaXRfYXV0b25lZ19jb21wbGV0ZSA9IEZBTFNFOworI2VuZGlmCisJaHctPnRiaV9jb21wYXRpYmlsaXR5X2VuID0gVFJVRTsKKyNpZiAwCisJaHctPmFkYXB0aXZlX2lmcyA9IFRSVUU7CisKKwkvKiBDb3BwZXIgb3B0aW9ucyAqLworCisJaWYoaHctPm1lZGlhX3R5cGUgPT0gZTEwMDBfbWVkaWFfdHlwZV9jb3BwZXIpIHsKKwkJaHctPm1kaXggPSBBVVRPX0FMTF9NT0RFUzsKKwkJaHctPmRpc2FibGVfcG9sYXJpdHlfY29ycmVjdGlvbiA9IEZBTFNFOworCQlody0+bWFzdGVyX3NsYXZlID0gRTEwMDBfTUFTVEVSX1NMQVZFOworCX0KKyNlbmRpZgorCXJldHVybiBFMTAwMF9TVUNDRVNTOworfQorCitzdGF0aWMgdm9pZCBmaWxsX3J4ICh2b2lkKQoreworCXN0cnVjdCBlMTAwMF9yeF9kZXNjICpyZDsKKwlyeF9sYXN0ID0gcnhfdGFpbDsKKwlyZCA9IHJ4X2Jhc2UgKyByeF90YWlsOworCXJ4X3RhaWwgPSAocnhfdGFpbCArIDEpICUgODsKKwltZW1zZXQgKHJkLCAwLCAxNik7CisJcmQtPmJ1ZmZlcl9hZGRyID0gdmlydF90b19idXMoJnBhY2tldCk7CisJRTEwMDBfV1JJVEVfUkVHICgmaHcsIFJEVCwgcnhfdGFpbCk7Cit9CisKK3N0YXRpYyB2b2lkIGluaXRfZGVzY3JpcHRvciAodm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIHB0cjsKKwl1bnNpZ25lZCBsb25nIHRjdGw7CisKKwlwdHIgPSB2aXJ0X3RvX3BoeXModHhfcG9vbCk7CisJaWYgKHB0ciAmIDB4ZikKKwkJcHRyID0gKHB0ciArIDB4MTApICYgKH4weGYpOworCisJdHhfYmFzZSA9IHBoeXNfdG9fdmlydChwdHIpOworCisJRTEwMDBfV1JJVEVfUkVHICgmaHcsIFREQkFMLCB2aXJ0X3RvX2J1cyh0eF9iYXNlKSk7CisJRTEwMDBfV1JJVEVfUkVHICgmaHcsIFREQkFILCAwKTsKKwlFMTAwMF9XUklURV9SRUcgKCZodywgVERMRU4sIDEyOCk7CisKKwkvKiBTZXR1cCB0aGUgSFcgVHggSGVhZCBhbmQgVGFpbCBkZXNjcmlwdG9yIHBvaW50ZXJzICovCisKKwlFMTAwMF9XUklURV9SRUcgKCZodywgVERILCAwKTsKKwlFMTAwMF9XUklURV9SRUcgKCZodywgVERULCAwKTsKKwl0eF90YWlsID0gMDsKKworCS8qIFByb2dyYW0gdGhlIFRyYW5zbWl0IENvbnRyb2wgUmVnaXN0ZXIgKi8KKworI2lmZGVmIExJTlVYX0RSSVZFUl9UQ1RMCisJdGN0bCA9IEUxMDAwX1JFQURfUkVHKCZodywgVENUTCk7CisKKwl0Y3RsICY9IH5FMTAwMF9UQ1RMX0NUOworCXRjdGwgfD0gRTEwMDBfVENUTF9FTiB8IEUxMDAwX1RDVExfUFNQIHwKKwkJKEUxMDAwX0NPTExJU0lPTl9USFJFU0hPTEQgPDwgRTEwMDBfQ1RfU0hJRlQpOworI2Vsc2UKKwl0Y3RsID0gRTEwMDBfVENUTF9QU1AgfCBFMTAwMF9UQ1RMX0VOIHwKKwkJKEUxMDAwX0NPTExJU0lPTl9USFJFU0hPTEQgPDwgRTEwMDBfQ1RfU0hJRlQpIHwgCisJCShFMTAwMF9IRFhfQ09MTElTSU9OX0RJU1RBTkNFIDw8IEUxMDAwX0NPTERfU0hJRlQpOworI2VuZGlmCisKKwlFMTAwMF9XUklURV9SRUcgKCZodywgVENUTCwgdGN0bCk7CisKKwllMTAwMF9jb25maWdfY29sbGlzaW9uX2Rpc3QoJmh3KTsKKworCisJcnhfdGFpbCA9IDA7CisJLyogZGlzYWJsZSByZWNlaXZlICovCisJRTEwMDBfV1JJVEVfUkVHICgmaHcsIFJDVEwsIDApOworCXB0ciA9IHZpcnRfdG9fcGh5cyhyeF9wb29sKTsKKwlpZiAocHRyICYgMHhmKQorCQlwdHIgPSAocHRyICsgMHgxMCkgJiAofjB4Zik7CisJcnhfYmFzZSA9IHBoeXNfdG9fdmlydChwdHIpOworCisJLyogU2V0dXAgdGhlIEJhc2UgYW5kIExlbmd0aCBvZiB0aGUgUnggRGVzY3JpcHRvciBSaW5nICovCisKKwlFMTAwMF9XUklURV9SRUcgKCZodywgUkRCQUwsIHZpcnRfdG9fYnVzKHJ4X2Jhc2UpKTsKKwlFMTAwMF9XUklURV9SRUcgKCZodywgUkRCQUgsIDApOworCisJRTEwMDBfV1JJVEVfUkVHICgmaHcsIFJETEVOLCAxMjgpOworCisJLyogU2V0dXAgdGhlIEhXIFJ4IEhlYWQgYW5kIFRhaWwgRGVzY3JpcHRvciBQb2ludGVycyAqLworCUUxMDAwX1dSSVRFX1JFRyAoJmh3LCBSREgsIDApOworCUUxMDAwX1dSSVRFX1JFRyAoJmh3LCBSRFQsIDApOworCisJRTEwMDBfV1JJVEVfUkVHICgmaHcsIFJDVEwsIAorCQlFMTAwMF9SQ1RMX0VOIHwgCisJCUUxMDAwX1JDVExfQkFNIHwgCisJCUUxMDAwX1JDVExfU1pfMjA0OCB8IAorCQlFMTAwMF9SQ1RMX01QRSk7CisJZmlsbF9yeCgpOworfQorCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitQT0xMIC0gV2FpdCBmb3IgYSBmcmFtZQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludAorZTEwMDBfcG9sbCAoc3RydWN0IG5pYyAqbmljLCBpbnQgcmV0cmlldmUpCit7CisJLyogcmV0dXJuIHRydWUgaWYgdGhlcmUncyBhbiBldGhlcm5ldCBwYWNrZXQgcmVhZHkgdG8gcmVhZCAqLworCS8qIG5pYy0+cGFja2V0IHNob3VsZCBjb250YWluIGRhdGEgb24gcmV0dXJuICovCisJLyogbmljLT5wYWNrZXRsZW4gc2hvdWxkIGNvbnRhaW4gbGVuZ3RoIG9mIGRhdGEgKi8KKwlzdHJ1Y3QgZTEwMDBfcnhfZGVzYyAqcmQ7CisKKwlyZCA9IHJ4X2Jhc2UgKyByeF9sYXN0OworCWlmICghcmQtPnN0YXR1cyAmIEUxMDAwX1JYRF9TVEFUX0REKQorCQlyZXR1cm4gMDsKKworCWlmICggISByZXRyaWV2ZSApIHJldHVybiAxOworCisJLy8gICAgICBwcmludGYoInJlY3Y6IHBhY2tldCAlISAtPiAlISBsZW49JWQgXG4iLCBwYWNrZXQrNiwgcGFja2V0LHJkLT5MZW5ndGgpOworCW1lbWNweSAobmljLT5wYWNrZXQsIHBhY2tldCwgcmQtPmxlbmd0aCk7CisJbmljLT5wYWNrZXRsZW4gPSByZC0+bGVuZ3RoOworCWZpbGxfcnggKCk7CisJcmV0dXJuIDE7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorVFJBTlNNSVQgLSBUcmFuc21pdCBhIGZyYW1lCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZAorZTEwMDBfdHJhbnNtaXQgKHN0cnVjdCBuaWMgKm5pYywgY29uc3QgY2hhciAqZCwJLyogRGVzdGluYXRpb24gKi8KKwkJICAgIHVuc2lnbmVkIGludCB0eXBlLAkvKiBUeXBlICovCisJCSAgICB1bnNpZ25lZCBpbnQgc2l6ZSwJLyogc2l6ZSAqLworCQkgICAgY29uc3QgY2hhciAqcCkJLyogUGFja2V0ICovCit7CisJLyogc2VuZCB0aGUgcGFja2V0IHRvIGRlc3RpbmF0aW9uICovCisJc3RydWN0IGV0aF9oZHIgeworCQl1bnNpZ25lZCBjaGFyIGRzdF9hZGRyW0VUSF9BTEVOXTsKKwkJdW5zaWduZWQgY2hhciBzcmNfYWRkcltFVEhfQUxFTl07CisJCXVuc2lnbmVkIHNob3J0IHR5cGU7CisJfSBoZHI7CisJc3RydWN0IGUxMDAwX3R4X2Rlc2MgKnR4aGQ7CS8qIGhlYWRlciAqLworCXN0cnVjdCBlMTAwMF90eF9kZXNjICp0eHA7CS8qIHBheWxvYWQgKi8KKwlERUJVR0ZVTkMoInNlbmQiKTsKKworCW1lbWNweSAoJmhkci5kc3RfYWRkciwgZCwgRVRIX0FMRU4pOworCW1lbWNweSAoJmhkci5zcmNfYWRkciwgbmljLT5ub2RlX2FkZHIsIEVUSF9BTEVOKTsKKworCWhkci50eXBlID0gaHRvbnMgKHR5cGUpOworCXR4aGQgPSB0eF9iYXNlICsgdHhfdGFpbDsKKwl0eF90YWlsID0gKHR4X3RhaWwgKyAxKSAlIDg7CisJdHhwID0gdHhfYmFzZSArIHR4X3RhaWw7CisJdHhfdGFpbCA9ICh0eF90YWlsICsgMSkgJSA4OworCisJdHhoZC0+YnVmZmVyX2FkZHIgPSB2aXJ0X3RvX2J1cyAoJmhkcik7CisJdHhoZC0+bG93ZXIuZGF0YSA9IHNpemVvZiAoaGRyKTsKKwl0eGhkLT51cHBlci5kYXRhID0gMDsKKworCXR4cC0+YnVmZmVyX2FkZHIgPSB2aXJ0X3RvX2J1cyhwKTsKKwl0eHAtPmxvd2VyLmRhdGEgPSBFMTAwMF9UWERfQ01EX1JQUyB8IEUxMDAwX1RYRF9DTURfRU9QIHwgRTEwMDBfVFhEX0NNRF9JRkNTIHwgc2l6ZTsKKwl0eHAtPnVwcGVyLmRhdGEgPSAwOworCisJRTEwMDBfV1JJVEVfUkVHICgmaHcsIFREVCwgdHhfdGFpbCk7CisJd2hpbGUgKCEodHhwLT51cHBlci5kYXRhICYgRTEwMDBfVFhEX1NUQVRfREQpKSB7CisJCXVkZWxheSgxMCk7CS8qIGdpdmUgdGhlIG5pYyBhIGNoYW5jZSB0byB3cml0ZSB0byB0aGUgcmVnaXN0ZXIgKi8KKwkJcG9sbF9pbnRlcnJ1cHRpb25zKCk7CisJfQorCURFQlVHRlVOQygic2VuZCBlbmQiKTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK0RJU0FCTEUgLSBUdXJuIG9mZiBldGhlcm5ldCBpbnRlcmZhY2UKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIGUxMDAwX2Rpc2FibGUgKHN0cnVjdCBkZXYgKmRldiBfX3VudXNlZCkKK3sKKwkvKiBDbGVhciB0aGUgdHJhbnNtaXQgcmluZyAqLworCUUxMDAwX1dSSVRFX1JFRyAoJmh3LCBUREgsIDApOworCUUxMDAwX1dSSVRFX1JFRyAoJmh3LCBURFQsIDApOworCisJLyogQ2xlYXIgdGhlIHJlY2VpdmUgcmluZyAqLworCUUxMDAwX1dSSVRFX1JFRyAoJmh3LCBSREgsIDApOworCUUxMDAwX1dSSVRFX1JFRyAoJmh3LCBSRFQsIDApOworCisJLyogcHV0IHRoZSBjYXJkIGluIGl0cyBpbml0aWFsIHN0YXRlICovCisJRTEwMDBfV1JJVEVfUkVHICgmaHcsIENUUkwsIEUxMDAwX0NUUkxfUlNUKTsKKworCS8qIFR1cm4gb2ZmIHRoZSBldGhlcm5ldCBpbnRlcmZhY2UgKi8KKwlFMTAwMF9XUklURV9SRUcgKCZodywgUkNUTCwgMCk7CisJRTEwMDBfV1JJVEVfUkVHICgmaHcsIFRDVEwsIDApOworCW1kZWxheSAoMTApOworCisJLyogVW5tYXAgbXkgd2luZG93IHRvIHRoZSBkZXZpY2UgKi8KKwlpb3VubWFwKGh3Lmh3X2FkZHIpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK0lSUSAtIEVuYWJsZSwgRGlzYWJsZSwgb3IgRm9yY2UgaW50ZXJydXB0cworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgZTEwMDBfaXJxKHN0cnVjdCBuaWMgKm5pYyBfX3VudXNlZCwgaXJxX2FjdGlvbl90IGFjdGlvbiBfX3VudXNlZCkKK3sKKyAgc3dpdGNoICggYWN0aW9uICkgeworICBjYXNlIERJU0FCTEUgOgorICAgIGJyZWFrOworICBjYXNlIEVOQUJMRSA6CisgICAgYnJlYWs7CisgIGNhc2UgRk9SQ0UgOgorICAgIGJyZWFrOworICB9Cit9CisKKyNkZWZpbmUgSU9SRVNPVVJDRV9JTwkweDAwMDAwMTAwICAgICAvKiBSZXNvdXJjZSB0eXBlICovCisjZGVmaW5lIEJBUl8wCQkwCisjZGVmaW5lIEJBUl8xCQkxCisjZGVmaW5lIEJBUl81CQk1CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUFJPQkUgLSBMb29rIGZvciBhbiBhZGFwdGVyLCB0aGlzIHJvdXRpbmUncyB2aXNpYmxlIHRvIHRoZSBvdXRzaWRlCitZb3Ugc2hvdWxkIG9taXQgdGhlIGxhc3QgYXJndW1lbnQgc3RydWN0IHBjaV9kZXZpY2UgKiBmb3IgYSBub24tUENJIE5JQworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludCBlMTAwMF9wcm9iZShzdHJ1Y3QgZGV2ICpkZXYsIHN0cnVjdCBwY2lfZGV2aWNlICpwKQoreworCXN0cnVjdCBuaWMgKm5pYyA9IChzdHJ1Y3QgbmljICopZGV2OworCXVuc2lnbmVkIGxvbmcgbW1pb19zdGFydCwgbW1pb19sZW47CisJaW50IHJldF92YWwsIGk7CisKKwlpZiAocCA9PSAwKQorCQlyZXR1cm4gMDsKKwkvKiBJbml0aWFsaXplIGh3IHdpdGggZGVmYXVsdCB2YWx1ZXMgKi8KKwltZW1zZXQoJmh3LCAwLCBzaXplb2YoaHcpKTsKKwlody5wZGV2ID0gcDsKKworI2lmIDEKKwkvKiBBcmUgdGhlc2UgdmFyaWFibGVzIG5lZWRlZD8gKi8KKwlody5mYyAgICAgICAgICAgICAgICAgICAgPSBlMTAwMF9mY19ub25lOworI2lmIDAKKwlody5vcmlnaW5hbF9mYyAgICAgICAgICAgPSBlMTAwMF9mY19ub25lOworI2VuZGlmCisJaHcuYXV0b25lZ19mYWlsZWQgICAgICAgID0gMDsKKyNpZiAwCisJaHcuZ2V0X2xpbmtfc3RhdHVzICAgICAgID0gVFJVRTsKKyNlbmRpZgorI2VuZGlmCisKKwltbWlvX3N0YXJ0ID0gcGNpX2Jhcl9zdGFydChwLCBQQ0lfQkFTRV9BRERSRVNTXzApOworCW1taW9fbGVuICAgPSBwY2lfYmFyX3NpemUocCwgIFBDSV9CQVNFX0FERFJFU1NfMCk7CisJaHcuaHdfYWRkciA9IGlvcmVtYXAobW1pb19zdGFydCwgbW1pb19sZW4pOworCisJZm9yKGkgPSBCQVJfMTsgaSA8PSBCQVJfNTsgaSsrKSB7CisJCWlmKHBjaV9iYXJfc2l6ZShwLCBpKSA9PSAwKQorCQkJY29udGludWU7ICAgICAgICAgICAgICAgIAorCQlpZihwY2lfZmluZF9jYXBhYmlsaXR5KHAsIGkpICYgSU9SRVNPVVJDRV9JTykgeworCQkJaHcuaW9fYmFzZSA9IHBjaV9iYXJfc3RhcnQocCwgaSk7CisJCQlicmVhazsKKyAgICAgICAgICAgICAgICB9ICAgICAgICAKKwl9CisKKwlhZGp1c3RfcGNpX2RldmljZShwKTsKKworCW5pYy0+aW9hZGRyICAgPSBwLT5pb2FkZHIgJiB+MzsKKwluaWMtPmlycW5vICAgID0gMDsKKworCS8qIEZyb20gTWF0dCBIb3J0bWFuIDxtYmhvcnRtYW5AYWNwdGhpbmNsaWVudC5jb20+ICovCisJLyogTUFDIGFuZCBQaHkgc2V0dGluZ3MgKi8KKworCS8qIHNldHVwIHRoZSBwcml2YXRlIHN0cnVjdHVyZSAqLworCWlmIChlMTAwMF9zd19pbml0KHAsICZodykgPCAwKSB7CisJCWlvdW5tYXAoaHcuaHdfYWRkcik7CisJCXJldHVybiAwOworCX0KKworCS8qIG1ha2Ugc3VyZSB0aGUgRUVQUk9NIGlzIGdvb2QgKi8KKworCWlmIChlMTAwMF92YWxpZGF0ZV9lZXByb21fY2hlY2tzdW0oJmh3KSA8IDApIHsKKwkJcHJpbnRmICgiVGhlIEVFUFJPTSBDaGVja3N1bSBJcyBOb3QgVmFsaWRcbiIpOworCQlpb3VubWFwKGh3Lmh3X2FkZHIpOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBjb3B5IHRoZSBNQUMgYWRkcmVzcyBvdXQgb2YgdGhlIEVFUFJPTSAqLworCisJZTEwMDBfcmVhZF9tYWNfYWRkcigmaHcpOworCW1lbWNweSAobmljLT5ub2RlX2FkZHIsIGh3Lm1hY19hZGRyLCBFVEhfQUxFTik7CisJCisJcHJpbnRmKCJFdGhlcm5ldCBhZGRyOiAlIVxuIiwgbmljLT5ub2RlX2FkZHIpOworCisJLyogcmVzZXQgdGhlIGhhcmR3YXJlIHdpdGggdGhlIG5ldyBzZXR0aW5ncyAqLworCisJcmV0X3ZhbCA9IGUxMDAwX3Jlc2V0KCZodyk7CisJaWYgKHJldF92YWwgPCAwKSB7CisJCWlmICgocmV0X3ZhbCA9PSAtRTEwMDBfRVJSX05PTElOSykgfHwKKwkJCShyZXRfdmFsID09IC1FMTAwMF9FUlJfVElNRU9VVCkpIHsKKwkJCUUxMDAwX0VSUigiVmFsaWQgTGluayBub3QgZGV0ZWN0ZWRcbiIpOworCQl9IGVsc2UgeworCQkJRTEwMDBfRVJSKCJIYXJkd2FyZSBJbml0aWFsaXphdGlvbiBGYWlsZWRcbiIpOworCQl9CisJCWlvdW5tYXAoaHcuaHdfYWRkcik7CisJCXJldHVybiAwOworCX0KKwlpbml0X2Rlc2NyaXB0b3IoKTsKKworCS8qIHBvaW50IHRvIE5JQyBzcGVjaWZpYyByb3V0aW5lcyAqLworCWRldi0+ZGlzYWJsZSAgPSBlMTAwMF9kaXNhYmxlOworCW5pYy0+cG9sbCAgICAgPSBlMTAwMF9wb2xsOworCW5pYy0+dHJhbnNtaXQgPSBlMTAwMF90cmFuc21pdDsKKwluaWMtPmlycSAgICAgID0gZTEwMDBfaXJxOworCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2lkIGUxMDAwX25pY3NbXSA9IHsKK1BDSV9ST00oMHg4MDg2LCAweDEwMDAsICJlMTAwMC04MjU0MiIsICAgICAgICAgICAgICAgIkludGVsIEV0aGVyRXhwcmVzc1BybzEwMDAiKSwKK1BDSV9ST00oMHg4MDg2LCAweDEwMDEsICJlMTAwMC04MjU0M2djLWZpYmVyIiwgICAgICAgIkludGVsIEV0aGVyRXhwcmVzc1BybzEwMDAgODI1NDNHQyBGaWJlciIpLAorUENJX1JPTSgweDgwODYsIDB4MTAwNCwgImUxMDAwLTgyNTQzZ2MtY29wcGVyIiwJICAgICAiSW50ZWwgRXRoZXJFeHByZXNzUHJvMTAwMCA4MjU0M0dDIENvcHBlciIpLAorUENJX1JPTSgweDgwODYsIDB4MTAwOCwgImUxMDAwLTgyNTQ0ZWktY29wcGVyIiwgICAgICAiSW50ZWwgRXRoZXJFeHByZXNzUHJvMTAwMCA4MjU0NEVJIENvcHBlciIpLAorUENJX1JPTSgweDgwODYsIDB4MTAwOSwgImUxMDAwLTgyNTQ0ZWktZmliZXIiLCAgICAgICAiSW50ZWwgRXRoZXJFeHByZXNzUHJvMTAwMCA4MjU0NEVJIEZpYmVyIiksCitQQ0lfUk9NKDB4ODA4NiwgMHgxMDBDLCAiZTEwMDAtODI1NDRnYy1jb3BwZXIiLCAgICAgICJJbnRlbCBFdGhlckV4cHJlc3NQcm8xMDAwIDgyNTQ0R0MgQ29wcGVyIiksCitQQ0lfUk9NKDB4ODA4NiwgMHgxMDBELCAiZTEwMDAtODI1NDRnYy1sb20iLCAgICAgICAgICJJbnRlbCBFdGhlckV4cHJlc3NQcm8xMDAwIDgyNTQ0R0MgTE9NIiksCitQQ0lfUk9NKDB4ODA4NiwgMHgxMDBFLCAiZTEwMDAtODI1NDBlbSIsICAgICAJICAgICAiSW50ZWwgRXRoZXJFeHByZXNzUHJvMTAwMCA4MjU0MEVNIiksCitQQ0lfUk9NKDB4ODA4NiwgMHgxMDBGLCAiZTEwMDAtODI1NDVlbS1jb3BwZXIiLCAgICAgICJJbnRlbCBFdGhlckV4cHJlc3NQcm8xMDAwIDgyNTQ1RU0gQ29wcGVyIiksCitQQ0lfUk9NKDB4ODA4NiwgMHgxMDEwLCAiZTEwMDAtODI1NDZlYi1jb3BwZXIiLCAgICAgICJJbnRlbCBFdGhlckV4cHJlc3NQcm8xMDAwIDgyNTQ2RUIgQ29wcGVyIiksCitQQ0lfUk9NKDB4ODA4NiwgMHgxMDExLCAiZTEwMDAtODI1NDVlbS1maWJlciIsICAgICAgICJJbnRlbCBFdGhlckV4cHJlc3NQcm8xMDAwIDgyNTQ1RU0gRmliZXIiKSwKK1BDSV9ST00oMHg4MDg2LCAweDEwMTIsICJlMTAwMC04MjU0NmViLWZpYmVyIiwgCSAgICAgIkludGVsIEV0aGVyRXhwcmVzc1BybzEwMDAgODI1NDZFQiBDb3BwZXIiKSwKK1BDSV9ST00oMHg4MDg2LCAweDEwMTMsICJlMTAwMC04MjU0MWVpIiwJICAgICAiSW50ZWwgRXRoZXJFeHByZXNzUHJvMTAwMCA4MjU0MUVJIiksCitQQ0lfUk9NKDB4ODA4NiwgMHgxMDE1LCAiZTEwMDAtODI1NDBlbS1sb20iLCAgCSAgICAgIkludGVsIEV0aGVyRXhwcmVzc1BybzEwMDAgODI1NDBFTSBMT00iKSwKK1BDSV9ST00oMHg4MDg2LCAweDEwMTYsICJlMTAwMC04MjU0MGVwLWxvbSIsCSAgICAgIkludGVsIEV0aGVyRXhwcmVzc1BybzEwMDAgODI1NDBFUCBMT00iKSwKK1BDSV9ST00oMHg4MDg2LCAweDEwMTcsICJlMTAwMC04MjU0MGVwIiwJICAgICAiSW50ZWwgRXRoZXJFeHByZXNzUHJvMTAwMCA4MjU0MEVQIiksCitQQ0lfUk9NKDB4ODA4NiwgMHgxMDE4LCAiZTEwMDAtODI1NDFlcCIsCSAgICAgIkludGVsIEV0aGVyRXhwcmVzc1BybzEwMDAgODI1NDFFUCIpLAorUENJX1JPTSgweDgwODYsIDB4MTAxOSwgImUxMDAwLTgyNTQ3ZWkiLAkgICAgICJJbnRlbCBFdGhlckV4cHJlc3NQcm8xMDAwIDgyNTQ3RUkiKSwKK1BDSV9ST00oMHg4MDg2LCAweDEwMWQsICJlMTAwMC04MjU0NmViLXF1YWQtY29wcGVyIiwgIkludGVsIEV0aGVyRXhwcmVzc1BybzEwMDAgODI1NDZFQiBRdWFkIENvcHBlciIpLAorUENJX1JPTSgweDgwODYsIDB4MTAxZSwgImUxMDAwLTgyNTQwZXAtbHAiLAkgICAgICJJbnRlbCBFdGhlckV4cHJlc3NQcm8xMDAwIDgyNTQwRVAgTFAiKSwKK1BDSV9ST00oMHg4MDg2LCAweDEwMjYsICJlMTAwMC04MjU0NWdtLWNvcHBlciIsCSAgICAgIkludGVsIEV0aGVyRXhwcmVzc1BybzEwMDAgODI1NDVHTSBDb3BwZXIiKSwKK1BDSV9ST00oMHg4MDg2LCAweDEwMjcsICJlMTAwMC04MjU0NWdtLWZpYmVyIiwJICAgICAiSW50ZWwgRXRoZXJFeHByZXNzUHJvMTAwMCA4MjU0NUdNIEZpYmVyIiksCitQQ0lfUk9NKDB4ODA4NiwgMHgxMDI4LCAiZTEwMDAtODI1NDVnbS1zZXJkZXMiLAkgICAgICJJbnRlbCBFdGhlckV4cHJlc3NQcm8xMDAwIDgyNTQ1R00gU0VSREVTIiksCitQQ0lfUk9NKDB4ODA4NiwgMHgxMDc1LCAiZTEwMDAtODI1NDdnaSIsCSAgICAgIkludGVsIEV0aGVyRXhwcmVzc1BybzEwMDAgODI1NDdHSSIpLAorUENJX1JPTSgweDgwODYsIDB4MTA3NiwgImUxMDAwLTgyNTQxZ2kiLAkgICAgICJJbnRlbCBFdGhlckV4cHJlc3NQcm8xMDAwIDgyNTQxR0kiKSwKK1BDSV9ST00oMHg4MDg2LCAweDEwNzcsICJlMTAwMC04MjU0MWdpLW1vYmlsZSIsCSAgICAgIkludGVsIEV0aGVyRXhwcmVzc1BybzEwMDAgODI1NDFHSSBNb2JpbGUiKSwKK1BDSV9ST00oMHg4MDg2LCAweDEwNzgsICJlMTAwMC04MjU0MWVyIiwJICAgICAiSW50ZWwgRXRoZXJFeHByZXNzUHJvMTAwMCA4MjU0MUVSIiksCitQQ0lfUk9NKDB4ODA4NiwgMHgxMDc5LCAiZTEwMDAtODI1NDZnYi1jb3BwZXIiLAkgICAgICJJbnRlbCBFdGhlckV4cHJlc3NQcm8xMDAwIDgyNTQ2R0IgQ29wcGVyIiksCitQQ0lfUk9NKDB4ODA4NiwgMHgxMDdhLCAiZTEwMDAtODI1NDZnYi1maWJlciIsCSAgICAgIkludGVsIEV0aGVyRXhwcmVzc1BybzEwMDAgODI1NDZHQiBGaWJlciIpLAorUENJX1JPTSgweDgwODYsIDB4MTA3YiwgImUxMDAwLTgyNTQ2Z2Itc2VyZGVzIiwJICAgICAiSW50ZWwgRXRoZXJFeHByZXNzUHJvMTAwMCA4MjU0NkdCIFNFUkRFUyIpLAorfTsKKworc3RydWN0IHBjaV9kcml2ZXIgZTEwMDBfZHJpdmVyID0geworCS50eXBlICAgICA9IE5JQ19EUklWRVIsCisJLm5hbWUgICAgID0gIkUxMDAwIiwKKwkucHJvYmUgICAgPSBlMTAwMF9wcm9iZSwKKwkuaWRzICAgICAgPSBlMTAwMF9uaWNzLAorCS5pZF9jb3VudCA9IHNpemVvZihlMTAwMF9uaWNzKS9zaXplb2YoZTEwMDBfbmljc1swXSksCisJLmNsYXNzICAgID0gMCwKK307CmRpZmYgLU5hdXIgZ3J1Yi0wLjk3Lm9yaWcvbmV0Ym9vdC9lMTAwMF9ody5oIGdydWItMC45Ny9uZXRib290L2UxMDAwX2h3LmgKLS0tIGdydWItMC45Ny5vcmlnL25ldGJvb3QvZTEwMDBfaHcuaAkxOTcwLTAxLTAxIDAwOjAwOjAwLjAwMDAwMDAwMCArMDAwMAorKysgZ3J1Yi0wLjk3L25ldGJvb3QvZTEwMDBfaHcuaAkyMDA1LTA4LTMxIDE5OjAzOjM1LjAwMDAwMDAwMCArMDAwMApAQCAtMCwwICsxLDIwNTggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgCisgIENvcHlyaWdodChjKSAxOTk5IC0gMjAwMyBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAgCisgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IAorICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSAKKyAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSAKKyAgYW55IGxhdGVyIHZlcnNpb24uCisgIAorICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgCisgIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciAKKyAgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciAKKyAgbW9yZSBkZXRhaWxzLgorICAKKyAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgCisgIFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLgorICAKKyAgVGhlIGZ1bGwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24gaW4gdGhlCisgIGZpbGUgY2FsbGVkIExJQ0VOU0UuCisgIAorICBDb250YWN0IEluZm9ybWF0aW9uOgorICBMaW51eCBOSUNTIDxsaW51eC5uaWNzQGludGVsLmNvbT4KKyAgSW50ZWwgQ29ycG9yYXRpb24sIDUyMDAgTi5FLiBFbGFtIFlvdW5nIFBhcmt3YXksIEhpbGxzYm9ybywgT1IgOTcxMjQtNjQ5NworCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBlMTAwMF9ody5oCisgKiBTdHJ1Y3R1cmVzLCBlbnVtcywgYW5kIG1hY3JvcyBmb3IgdGhlIE1BQworICovCisKKyNpZm5kZWYgX0UxMDAwX0hXX0hfCisjZGVmaW5lIF9FMTAwMF9IV19IXworCisvKiBGb3J3YXJkIGRlY2xhcmF0aW9ucyBvZiBzdHJ1Y3R1cmVzIHVzZWQgYnkgdGhlIHNoYXJlZCBjb2RlICovCitzdHJ1Y3QgZTEwMDBfaHc7CitzdHJ1Y3QgZTEwMDBfaHdfc3RhdHM7CisKKy8qIEVudW1lcmF0ZWQgdHlwZXMgc3BlY2lmaWMgdG8gdGhlIGUxMDAwIGhhcmR3YXJlICovCisvKiBNZWRpYSBBY2Nlc3MgQ29udHJvbGVycyAqLwordHlwZWRlZiBlbnVtIHsKKyAgICBlMTAwMF91bmRlZmluZWQgPSAwLAorICAgIGUxMDAwXzgyNTQyX3JldjJfMCwKKyAgICBlMTAwMF84MjU0Ml9yZXYyXzEsCisgICAgZTEwMDBfODI1NDMsCisgICAgZTEwMDBfODI1NDQsCisgICAgZTEwMDBfODI1NDAsCisgICAgZTEwMDBfODI1NDUsCisgICAgZTEwMDBfODI1NDVfcmV2XzMsCisgICAgZTEwMDBfODI1NDYsCisgICAgZTEwMDBfODI1NDZfcmV2XzMsCisgICAgZTEwMDBfODI1NDEsCisgICAgZTEwMDBfODI1NDFfcmV2XzIsCisgICAgZTEwMDBfODI1NDcsCisgICAgZTEwMDBfODI1NDdfcmV2XzIsCisgICAgZTEwMDBfbnVtX21hY3MKK30gZTEwMDBfbWFjX3R5cGU7CisKK3R5cGVkZWYgZW51bSB7CisgICAgZTEwMDBfZWVwcm9tX3VuaW5pdGlhbGl6ZWQgPSAwLAorICAgIGUxMDAwX2VlcHJvbV9zcGksCisgICAgZTEwMDBfZWVwcm9tX21pY3Jvd2lyZSwKKyAgICBlMTAwMF9udW1fZWVwcm9tX3R5cGVzCit9IGUxMDAwX2VlcHJvbV90eXBlOworCisvKiBNZWRpYSBUeXBlcyAqLwordHlwZWRlZiBlbnVtIHsKKwllMTAwMF9tZWRpYV90eXBlX2NvcHBlciA9IDAsCisJZTEwMDBfbWVkaWFfdHlwZV9maWJlciA9IDEsCisJZTEwMDBfbWVkaWFfdHlwZV9pbnRlcm5hbF9zZXJkZXMgPSAyLAorCWUxMDAwX251bV9tZWRpYV90eXBlcworfSBlMTAwMF9tZWRpYV90eXBlOworCit0eXBlZGVmIGVudW0geworICAgIGUxMDAwXzEwX2hhbGYgPSAwLAorICAgIGUxMDAwXzEwX2Z1bGwgPSAxLAorICAgIGUxMDAwXzEwMF9oYWxmID0gMiwKKyAgICBlMTAwMF8xMDBfZnVsbCA9IDMKK30gZTEwMDBfc3BlZWRfZHVwbGV4X3R5cGU7CisKKy8qIEZsb3cgQ29udHJvbCBTZXR0aW5ncyAqLwordHlwZWRlZiBlbnVtIHsKKwllMTAwMF9mY19ub25lID0gMCwKKwllMTAwMF9mY19yeF9wYXVzZSA9IDEsCisJZTEwMDBfZmNfdHhfcGF1c2UgPSAyLAorCWUxMDAwX2ZjX2Z1bGwgPSAzLAorCWUxMDAwX2ZjX2RlZmF1bHQgPSAweEZGCit9IGUxMDAwX2ZjX3R5cGU7CisKKy8qIFBDSSBidXMgdHlwZXMgKi8KK3R5cGVkZWYgZW51bSB7CisJZTEwMDBfYnVzX3R5cGVfdW5rbm93biA9IDAsCisJZTEwMDBfYnVzX3R5cGVfcGNpLAorCWUxMDAwX2J1c190eXBlX3BjaXgsCisJZTEwMDBfYnVzX3R5cGVfcmVzZXJ2ZWQKK30gZTEwMDBfYnVzX3R5cGU7CisKKy8qIFBDSSBidXMgc3BlZWRzICovCit0eXBlZGVmIGVudW0geworCWUxMDAwX2J1c19zcGVlZF91bmtub3duID0gMCwKKwllMTAwMF9idXNfc3BlZWRfMzMsCisJZTEwMDBfYnVzX3NwZWVkXzY2LAorCWUxMDAwX2J1c19zcGVlZF8xMDAsCisJZTEwMDBfYnVzX3NwZWVkXzEyMCwKKwllMTAwMF9idXNfc3BlZWRfMTMzLAorCWUxMDAwX2J1c19zcGVlZF9yZXNlcnZlZAorfSBlMTAwMF9idXNfc3BlZWQ7CisKKy8qIFBDSSBidXMgd2lkdGhzICovCit0eXBlZGVmIGVudW0geworCWUxMDAwX2J1c193aWR0aF91bmtub3duID0gMCwKKwllMTAwMF9idXNfd2lkdGhfMzIsCisJZTEwMDBfYnVzX3dpZHRoXzY0LAorCWUxMDAwX2J1c193aWR0aF9yZXNlcnZlZAorfSBlMTAwMF9idXNfd2lkdGg7CisKKy8qIFBIWSBzdGF0dXMgaW5mbyBzdHJ1Y3R1cmUgYW5kIHN1cHBvcnRpbmcgZW51bXMgKi8KK3R5cGVkZWYgZW51bSB7CisJZTEwMDBfY2FibGVfbGVuZ3RoXzUwID0gMCwKKwllMTAwMF9jYWJsZV9sZW5ndGhfNTBfODAsCisJZTEwMDBfY2FibGVfbGVuZ3RoXzgwXzExMCwKKwllMTAwMF9jYWJsZV9sZW5ndGhfMTEwXzE0MCwKKwllMTAwMF9jYWJsZV9sZW5ndGhfMTQwLAorCWUxMDAwX2NhYmxlX2xlbmd0aF91bmRlZmluZWQgPSAweEZGCit9IGUxMDAwX2NhYmxlX2xlbmd0aDsKKwordHlwZWRlZiBlbnVtIHsKKyAgICBlMTAwMF9pZ3BfY2FibGVfbGVuZ3RoXzEwICA9IDEwLAorICAgIGUxMDAwX2lncF9jYWJsZV9sZW5ndGhfMjAgID0gMjAsCisgICAgZTEwMDBfaWdwX2NhYmxlX2xlbmd0aF8zMCAgPSAzMCwKKyAgICBlMTAwMF9pZ3BfY2FibGVfbGVuZ3RoXzQwICA9IDQwLAorICAgIGUxMDAwX2lncF9jYWJsZV9sZW5ndGhfNTAgID0gNTAsCisgICAgZTEwMDBfaWdwX2NhYmxlX2xlbmd0aF82MCAgPSA2MCwKKyAgICBlMTAwMF9pZ3BfY2FibGVfbGVuZ3RoXzcwICA9IDcwLAorICAgIGUxMDAwX2lncF9jYWJsZV9sZW5ndGhfODAgID0gODAsCisgICAgZTEwMDBfaWdwX2NhYmxlX2xlbmd0aF85MCAgPSA5MCwKKyAgICBlMTAwMF9pZ3BfY2FibGVfbGVuZ3RoXzEwMCA9IDEwMCwKKyAgICBlMTAwMF9pZ3BfY2FibGVfbGVuZ3RoXzExMCA9IDExMCwKKyAgICBlMTAwMF9pZ3BfY2FibGVfbGVuZ3RoXzEyMCA9IDEyMCwKKyAgICBlMTAwMF9pZ3BfY2FibGVfbGVuZ3RoXzEzMCA9IDEzMCwKKyAgICBlMTAwMF9pZ3BfY2FibGVfbGVuZ3RoXzE0MCA9IDE0MCwKKyAgICBlMTAwMF9pZ3BfY2FibGVfbGVuZ3RoXzE1MCA9IDE1MCwKKyAgICBlMTAwMF9pZ3BfY2FibGVfbGVuZ3RoXzE2MCA9IDE2MCwKKyAgICBlMTAwMF9pZ3BfY2FibGVfbGVuZ3RoXzE3MCA9IDE3MCwKKyAgICBlMTAwMF9pZ3BfY2FibGVfbGVuZ3RoXzE4MCA9IDE4MAorfSBlMTAwMF9pZ3BfY2FibGVfbGVuZ3RoOworCit0eXBlZGVmIGVudW0geworCWUxMDAwXzEwYnRfZXh0X2Rpc3RfZW5hYmxlX25vcm1hbCA9IDAsCisJZTEwMDBfMTBidF9leHRfZGlzdF9lbmFibGVfbG93ZXIsCisJZTEwMDBfMTBidF9leHRfZGlzdF9lbmFibGVfdW5kZWZpbmVkID0gMHhGRgorfSBlMTAwMF8xMGJ0X2V4dF9kaXN0X2VuYWJsZTsKKwordHlwZWRlZiBlbnVtIHsKKwllMTAwMF9yZXZfcG9sYXJpdHlfbm9ybWFsID0gMCwKKwllMTAwMF9yZXZfcG9sYXJpdHlfcmV2ZXJzZWQsCisJZTEwMDBfcmV2X3BvbGFyaXR5X3VuZGVmaW5lZCA9IDB4RkYKK30gZTEwMDBfcmV2X3BvbGFyaXR5OworCit0eXBlZGVmIGVudW0geworICAgIGUxMDAwX2Rvd25zaGlmdF9ub3JtYWwgPSAwLAorICAgIGUxMDAwX2Rvd25zaGlmdF9hY3RpdmF0ZWQsCisgICAgZTEwMDBfZG93bnNoaWZ0X3VuZGVmaW5lZCA9IDB4RkYKK30gZTEwMDBfZG93bnNoaWZ0OworCit0eXBlZGVmIGVudW0geworCWUxMDAwX3BvbGFyaXR5X3JldmVyc2FsX2VuYWJsZWQgPSAwLAorCWUxMDAwX3BvbGFyaXR5X3JldmVyc2FsX2Rpc2FibGVkLAorCWUxMDAwX3BvbGFyaXR5X3JldmVyc2FsX3VuZGVmaW5lZCA9IDB4RkYKK30gZTEwMDBfcG9sYXJpdHlfcmV2ZXJzYWw7CisKK3R5cGVkZWYgZW51bSB7CisJZTEwMDBfYXV0b194X21vZGVfbWFudWFsX21kaSA9IDAsCisJZTEwMDBfYXV0b194X21vZGVfbWFudWFsX21kaXgsCisJZTEwMDBfYXV0b194X21vZGVfYXV0bzEsCisJZTEwMDBfYXV0b194X21vZGVfYXV0bzIsCisJZTEwMDBfYXV0b194X21vZGVfdW5kZWZpbmVkID0gMHhGRgorfSBlMTAwMF9hdXRvX3hfbW9kZTsKKwordHlwZWRlZiBlbnVtIHsKKwllMTAwMF8xMDAwdF9yeF9zdGF0dXNfbm90X29rID0gMCwKKwllMTAwMF8xMDAwdF9yeF9zdGF0dXNfb2ssCisJZTEwMDBfMTAwMHRfcnhfc3RhdHVzX3VuZGVmaW5lZCA9IDB4RkYKK30gZTEwMDBfMTAwMHRfcnhfc3RhdHVzOworCit0eXBlZGVmIGVudW0geworICAgIGUxMDAwX3BoeV9tODggPSAwLAorICAgIGUxMDAwX3BoeV9pZ3AsCisgICAgZTEwMDBfcGh5X3VuZGVmaW5lZCA9IDB4RkYKK30gZTEwMDBfcGh5X3R5cGU7CisKK3R5cGVkZWYgZW51bSB7CisgICAgZTEwMDBfbXNfaHdfZGVmYXVsdCA9IDAsCisgICAgZTEwMDBfbXNfZm9yY2VfbWFzdGVyLAorICAgIGUxMDAwX21zX2ZvcmNlX3NsYXZlLAorICAgIGUxMDAwX21zX2F1dG8KK30gZTEwMDBfbXNfdHlwZTsKKwordHlwZWRlZiBlbnVtIHsKKyAgICBlMTAwMF9mZmVfY29uZmlnX2VuYWJsZWQgPSAwLAorICAgIGUxMDAwX2ZmZV9jb25maWdfYWN0aXZlLAorICAgIGUxMDAwX2ZmZV9jb25maWdfYmxvY2tlZAorfSBlMTAwMF9mZmVfY29uZmlnOworCit0eXBlZGVmIGVudW0geworICAgIGUxMDAwX2RzcF9jb25maWdfZGlzYWJsZWQgPSAwLAorICAgIGUxMDAwX2RzcF9jb25maWdfZW5hYmxlZCwKKyAgICBlMTAwMF9kc3BfY29uZmlnX2FjdGl2YXRlZCwKKyAgICBlMTAwMF9kc3BfY29uZmlnX3VuZGVmaW5lZCA9IDB4RkYKK30gZTEwMDBfZHNwX2NvbmZpZzsKKworc3RydWN0IGUxMDAwX3BoeV9pbmZvIHsKKwllMTAwMF9jYWJsZV9sZW5ndGggY2FibGVfbGVuZ3RoOworCWUxMDAwXzEwYnRfZXh0X2Rpc3RfZW5hYmxlIGV4dGVuZGVkXzEwYnRfZGlzdGFuY2U7CisJZTEwMDBfcmV2X3BvbGFyaXR5IGNhYmxlX3BvbGFyaXR5OworCWUxMDAwX2Rvd25zaGlmdCBkb3duc2hpZnQ7CisJZTEwMDBfcG9sYXJpdHlfcmV2ZXJzYWwgcG9sYXJpdHlfY29ycmVjdGlvbjsKKwllMTAwMF9hdXRvX3hfbW9kZSBtZGl4X21vZGU7CisJZTEwMDBfMTAwMHRfcnhfc3RhdHVzIGxvY2FsX3J4OworCWUxMDAwXzEwMDB0X3J4X3N0YXR1cyByZW1vdGVfcng7Cit9OworCitzdHJ1Y3QgZTEwMDBfcGh5X3N0YXRzIHsKKwl1aW50MzJfdCBpZGxlX2Vycm9yczsKKwl1aW50MzJfdCByZWNlaXZlX2Vycm9yczsKK307CisKK3N0cnVjdCBlMTAwMF9lZXByb21faW5mbyB7CisgICAgZTEwMDBfZWVwcm9tX3R5cGUgdHlwZTsKKyAgICB1aW50MTZfdCB3b3JkX3NpemU7CisgICAgdWludDE2X3Qgb3Bjb2RlX2JpdHM7CisgICAgdWludDE2X3QgYWRkcmVzc19iaXRzOworICAgIHVpbnQxNl90IGRlbGF5X3VzZWM7CisgICAgdWludDE2X3QgcGFnZV9zaXplOworfTsKKworCisKKy8qIEVycm9yIENvZGVzICovCisjZGVmaW5lIEUxMDAwX1NVQ0NFU1MgICAgICAwCisjZGVmaW5lIEUxMDAwX0VSUl9FRVBST00gICAxCisjZGVmaW5lIEUxMDAwX0VSUl9QSFkgICAgICAyCisjZGVmaW5lIEUxMDAwX0VSUl9DT05GSUcgICAzCisjZGVmaW5lIEUxMDAwX0VSUl9QQVJBTSAgICA0CisjZGVmaW5lIEUxMDAwX0VSUl9NQUNfVFlQRSA1CisjZGVmaW5lIEUxMDAwX0VSUl9QSFlfVFlQRSA2CisjZGVmaW5lIEUxMDAwX0VSUl9OT0xJTksgICA3CisjZGVmaW5lIEUxMDAwX0VSUl9USU1FT1VUICA4CisKKyNkZWZpbmUgRTEwMDBfUkVBRF9SRUdfSU8oYSwgcmVnKSBcCisJZTEwMDBfcmVhZF9yZWdfaW8oKGEpLCBFMTAwMF8jI3JlZykKKyNkZWZpbmUgRTEwMDBfV1JJVEVfUkVHX0lPKGEsIHJlZywgdmFsKSBcCisJZTEwMDBfd3JpdGVfcmVnX2lvKChhKSwgRTEwMDBfIyNyZWcsIHZhbCkKKworLyogUENJIERldmljZSBJRHMgKi8KKyNkZWZpbmUgRTEwMDBfREVWX0lEXzgyNTQyICAgICAgICAgICAgICAgMHgxMDAwCisjZGVmaW5lIEUxMDAwX0RFVl9JRF84MjU0M0dDX0ZJQkVSICAgICAgIDB4MTAwMQorI2RlZmluZSBFMTAwMF9ERVZfSURfODI1NDNHQ19DT1BQRVIgICAgICAweDEwMDQKKyNkZWZpbmUgRTEwMDBfREVWX0lEXzgyNTQ0RUlfQ09QUEVSICAgICAgMHgxMDA4CisjZGVmaW5lIEUxMDAwX0RFVl9JRF84MjU0NEVJX0ZJQkVSICAgICAgIDB4MTAwOQorI2RlZmluZSBFMTAwMF9ERVZfSURfODI1NDRHQ19DT1BQRVIgICAgICAweDEwMEMKKyNkZWZpbmUgRTEwMDBfREVWX0lEXzgyNTQ0R0NfTE9NICAgICAgICAgMHgxMDBECisjZGVmaW5lIEUxMDAwX0RFVl9JRF84MjU0MEVNICAgICAgICAgICAgIDB4MTAwRQorI2RlZmluZSBFMTAwMF9ERVZfSURfODI1NDBFTV9MT00gICAgICAgICAweDEwMTUKKyNkZWZpbmUgRTEwMDBfREVWX0lEXzgyNTQwRVBfTE9NICAgICAgICAgMHgxMDE2CisjZGVmaW5lIEUxMDAwX0RFVl9JRF84MjU0MEVQICAgICAgICAgICAgIDB4MTAxNworI2RlZmluZSBFMTAwMF9ERVZfSURfODI1NDBFUF9MUCAgICAgICAgICAweDEwMUUKKyNkZWZpbmUgRTEwMDBfREVWX0lEXzgyNTQ1RU1fQ09QUEVSICAgICAgMHgxMDBGCisjZGVmaW5lIEUxMDAwX0RFVl9JRF84MjU0NUVNX0ZJQkVSICAgICAgIDB4MTAxMQorI2RlZmluZSBFMTAwMF9ERVZfSURfODI1NDVHTV9DT1BQRVIgICAgICAweDEwMjYKKyNkZWZpbmUgRTEwMDBfREVWX0lEXzgyNTQ1R01fRklCRVIgICAgICAgMHgxMDI3CisjZGVmaW5lIEUxMDAwX0RFVl9JRF84MjU0NUdNX1NFUkRFUyAgICAgIDB4MTAyOAorI2RlZmluZSBFMTAwMF9ERVZfSURfODI1NDZFQl9DT1BQRVIgICAgICAweDEwMTAKKyNkZWZpbmUgRTEwMDBfREVWX0lEXzgyNTQ2RUJfRklCRVIgICAgICAgMHgxMDEyCisjZGVmaW5lIEUxMDAwX0RFVl9JRF84MjU0NkVCX1FVQURfQ09QUEVSIDB4MTAxRAorI2RlZmluZSBFMTAwMF9ERVZfSURfODI1NDFFSSAgICAgICAgICAgICAweDEwMTMKKyNkZWZpbmUgRTEwMDBfREVWX0lEXzgyNTQxRUlfTU9CSUxFICAgICAgMHgxMDE4CisjZGVmaW5lIEUxMDAwX0RFVl9JRF84MjU0MUVSICAgICAgICAgICAgIDB4MTA3OAorI2RlZmluZSBFMTAwMF9ERVZfSURfODI1NDdHSSAgICAgICAgICAgICAweDEwNzUKKyNkZWZpbmUgRTEwMDBfREVWX0lEXzgyNTQxR0kgICAgICAgICAgICAgMHgxMDc2CisjZGVmaW5lIEUxMDAwX0RFVl9JRF84MjU0MUdJX01PQklMRSAgICAgIDB4MTA3NworI2RlZmluZSBFMTAwMF9ERVZfSURfODI1NDZHQl9DT1BQRVIgICAgICAweDEwNzkKKyNkZWZpbmUgRTEwMDBfREVWX0lEXzgyNTQ2R0JfRklCRVIgICAgICAgMHgxMDdBCisjZGVmaW5lIEUxMDAwX0RFVl9JRF84MjU0NkdCX1NFUkRFUyAgICAgIDB4MTA3QgorI2RlZmluZSBFMTAwMF9ERVZfSURfODI1NDdFSSAgICAgICAgICAgICAweDEwMTkKKworI2RlZmluZSBOT0RFX0FERFJFU1NfU0laRSA2CisjZGVmaW5lIEVUSF9MRU5HVEhfT0ZfQUREUkVTUyA2CisKKy8qIE1BQyBkZWNvZGUgc2l6ZSBpcyAxMjhLIC0gVGhpcyBpcyB0aGUgc2l6ZSBvZiBCQVIwICovCisjZGVmaW5lIE1BQ19ERUNPREVfU0laRSAoMTI4ICogMTAyNCkKKworI2RlZmluZSBFMTAwMF84MjU0Ml8yXzBfUkVWX0lEIDIKKyNkZWZpbmUgRTEwMDBfODI1NDJfMl8xX1JFVl9JRCAzCisKKyNkZWZpbmUgU1BFRURfMTAgICAgMTAKKyNkZWZpbmUgU1BFRURfMTAwICAgMTAwCisjZGVmaW5lIFNQRUVEXzEwMDAgIDEwMDAKKyNkZWZpbmUgSEFMRl9EVVBMRVggMQorI2RlZmluZSBGVUxMX0RVUExFWCAyCisKKy8qIFRoZSBzaXplcyAoaW4gYnl0ZXMpIG9mIGEgZXRoZXJuZXQgcGFja2V0ICovCisjZGVmaW5lIEVORVRfSEVBREVSX1NJWkUgICAgICAgICAgICAgMTQKKyNkZWZpbmUgTUFYSU1VTV9FVEhFUk5FVF9GUkFNRV9TSVpFICAxNTE4IC8qIFdpdGggRkNTICovCisjZGVmaW5lIE1JTklNVU1fRVRIRVJORVRfRlJBTUVfU0laRSAgNjQgICAvKiBXaXRoIEZDUyAqLworI2RlZmluZSBFVEhFUk5FVF9GQ1NfU0laRSAgICAgICAgICAgIDQKKyNkZWZpbmUgTUFYSU1VTV9FVEhFUk5FVF9QQUNLRVRfU0laRSBcCisgICAgKE1BWElNVU1fRVRIRVJORVRfRlJBTUVfU0laRSAtIEVUSEVSTkVUX0ZDU19TSVpFKQorI2RlZmluZSBNSU5JTVVNX0VUSEVSTkVUX1BBQ0tFVF9TSVpFIFwKKyAgICAoTUlOSU1VTV9FVEhFUk5FVF9GUkFNRV9TSVpFIC0gRVRIRVJORVRfRkNTX1NJWkUpCisjZGVmaW5lIENSQ19MRU5HVEggICAgICAgICAgICAgICAgICAgRVRIRVJORVRfRkNTX1NJWkUKKyNkZWZpbmUgTUFYX0pVTUJPX0ZSQU1FX1NJWkUgICAgICAgICAweDNGMDAKKworCisvKiA4MDIuMXEgVkxBTiBQYWNrZXQgU2l6ZXMgKi8KKyNkZWZpbmUgVkxBTl9UQUdfU0laRSAgICAgICAgICAgICAgICAgICAgIDQgICAgIC8qIDgwMi4zYWMgdGFnIChub3QgRE1BZWQpICovCisKKy8qIEV0aGVydHlwZSBmaWVsZCB2YWx1ZXMgKi8KKyNkZWZpbmUgRVRIRVJORVRfSUVFRV9WTEFOX1RZUEUgMHg4MTAwICAvKiA4MDIuM2FjIHBhY2tldCAqLworI2RlZmluZSBFVEhFUk5FVF9JUF9UWVBFICAgICAgICAweDA4MDAgIC8qIElQIHBhY2tldHMgKi8KKyNkZWZpbmUgRVRIRVJORVRfQVJQX1RZUEUgICAgICAgMHgwODA2ICAvKiBBZGRyZXNzIFJlc29sdXRpb24gUHJvdG9jb2wgKEFSUCkgKi8KKworLyogUGFja2V0IEhlYWRlciBkZWZpbmVzICovCisjZGVmaW5lIElQX1BST1RPQ09MX1RDUCAgICA2CisjZGVmaW5lIElQX1BST1RPQ09MX1VEUCAgICAweDExCisKKy8qIFRoaXMgZGVmaW5lcyB0aGUgYml0cyB0aGF0IGFyZSBzZXQgaW4gdGhlIEludGVycnVwdCBNYXNrCisgKiBTZXQvUmVhZCBSZWdpc3Rlci4gIEVhY2ggYml0IGlzIGRvY3VtZW50ZWQgYmVsb3c6CisgKiAgIG8gUlhETVQwID0gUmVjZWl2ZSBEZXNjcmlwdG9yIE1pbmltdW0gVGhyZXNob2xkIGhpdCAocmluZyAwKQorICogICBvIFJYU0VRICA9IFJlY2VpdmUgU2VxdWVuY2UgRXJyb3IgCisgKi8KKyNkZWZpbmUgUE9MTF9JTVNfRU5BQkxFX01BU0sgKCBcCisgICAgRTEwMDBfSU1TX1JYRE1UMCB8ICAgICAgICAgXAorICAgIEUxMDAwX0lNU19SWFNFUSkKKworLyogVGhpcyBkZWZpbmVzIHRoZSBiaXRzIHRoYXQgYXJlIHNldCBpbiB0aGUgSW50ZXJydXB0IE1hc2sKKyAqIFNldC9SZWFkIFJlZ2lzdGVyLiAgRWFjaCBiaXQgaXMgZG9jdW1lbnRlZCBiZWxvdzoKKyAqICAgbyBSWFQwICAgPSBSZWNlaXZlciBUaW1lciBJbnRlcnJ1cHQgKHJpbmcgMCkKKyAqICAgbyBUWERXICAgPSBUcmFuc21pdCBEZXNjcmlwdG9yIFdyaXR0ZW4gQmFjaworICogICBvIFJYRE1UMCA9IFJlY2VpdmUgRGVzY3JpcHRvciBNaW5pbXVtIFRocmVzaG9sZCBoaXQgKHJpbmcgMCkKKyAqICAgbyBSWFNFUSAgPSBSZWNlaXZlIFNlcXVlbmNlIEVycm9yCisgKiAgIG8gTFNDICAgID0gTGluayBTdGF0dXMgQ2hhbmdlCisgKi8KKyNkZWZpbmUgSU1TX0VOQUJMRV9NQVNLICggXAorICAgIEUxMDAwX0lNU19SWFQwICAgfCAgICBcCisgICAgRTEwMDBfSU1TX1RYRFcgICB8ICAgIFwKKyAgICBFMTAwMF9JTVNfUlhETVQwIHwgICAgXAorICAgIEUxMDAwX0lNU19SWFNFUSAgfCAgICBcCisgICAgRTEwMDBfSU1TX0xTQykKKworLyogTnVtYmVyIG9mIGhpZ2gvbG93IHJlZ2lzdGVyIHBhaXJzIGluIHRoZSBSQVIuIFRoZSBSQVIgKFJlY2VpdmUgQWRkcmVzcworICogUmVnaXN0ZXJzKSBob2xkcyB0aGUgZGlyZWN0ZWQgYW5kIG11bHRpY2FzdCBhZGRyZXNzZXMgdGhhdCB3ZSBtb25pdG9yLiBXZQorICogcmVzZXJ2ZSBvbmUgb2YgdGhlc2Ugc3BvdHMgZm9yIG91ciBkaXJlY3RlZCBhZGRyZXNzLCBhbGxvd2luZyB1cyByb29tIGZvcgorICogRTEwMDBfUkFSX0VOVFJJRVMgLSAxIG11bHRpY2FzdCBhZGRyZXNzZXMuIAorICovCisjZGVmaW5lIEUxMDAwX1JBUl9FTlRSSUVTIDE1CisKKyNkZWZpbmUgTUlOX05VTUJFUl9PRl9ERVNDUklQVE9SUyA4CisjZGVmaW5lIE1BWF9OVU1CRVJfT0ZfREVTQ1JJUFRPUlMgMHhGRkY4CisKKy8qIFJlY2VpdmUgRGVzY3JpcHRvciAqLworc3RydWN0IGUxMDAwX3J4X2Rlc2MgeworICAgIHVpbnQ2NF90IGJ1ZmZlcl9hZGRyOyAvKiBBZGRyZXNzIG9mIHRoZSBkZXNjcmlwdG9yJ3MgZGF0YSBidWZmZXIgKi8KKyAgICB1aW50MTZfdCBsZW5ndGg7ICAgICAvKiBMZW5ndGggb2YgZGF0YSBETUFlZCBpbnRvIGRhdGEgYnVmZmVyICovCisgICAgdWludDE2X3QgY3N1bTsgICAgICAgLyogUGFja2V0IGNoZWNrc3VtICovCisgICAgdWludDhfdCBzdGF0dXM7ICAgICAgLyogRGVzY3JpcHRvciBzdGF0dXMgKi8KKyAgICB1aW50OF90IGVycm9yczsgICAgICAvKiBEZXNjcmlwdG9yIEVycm9ycyAqLworICAgIHVpbnQxNl90IHNwZWNpYWw7Cit9OworCisvKiBSZWNlaXZlIERlY3JpcHRvciBiaXQgZGVmaW5pdGlvbnMgKi8KKyNkZWZpbmUgRTEwMDBfUlhEX1NUQVRfREQgICAgICAgMHgwMSAgICAvKiBEZXNjcmlwdG9yIERvbmUgKi8KKyNkZWZpbmUgRTEwMDBfUlhEX1NUQVRfRU9QICAgICAgMHgwMiAgICAvKiBFbmQgb2YgUGFja2V0ICovCisjZGVmaW5lIEUxMDAwX1JYRF9TVEFUX0lYU00gICAgIDB4MDQgICAgLyogSWdub3JlIGNoZWNrc3VtICovCisjZGVmaW5lIEUxMDAwX1JYRF9TVEFUX1ZQICAgICAgIDB4MDggICAgLyogSUVFRSBWTEFOIFBhY2tldCAqLworI2RlZmluZSBFMTAwMF9SWERfU1RBVF9UQ1BDUyAgICAweDIwICAgIC8qIFRDUCB4c3VtIGNhbGN1bGF0ZWQgKi8KKyNkZWZpbmUgRTEwMDBfUlhEX1NUQVRfSVBDUyAgICAgMHg0MCAgICAvKiBJUCB4c3VtIGNhbGN1bGF0ZWQgKi8KKyNkZWZpbmUgRTEwMDBfUlhEX1NUQVRfUElGICAgICAgMHg4MCAgICAvKiBwYXNzZWQgaW4tZXhhY3QgZmlsdGVyICovCisjZGVmaW5lIEUxMDAwX1JYRF9FUlJfQ0UgICAgICAgIDB4MDEgICAgLyogQ1JDIEVycm9yICovCisjZGVmaW5lIEUxMDAwX1JYRF9FUlJfU0UgICAgICAgIDB4MDIgICAgLyogU3ltYm9sIEVycm9yICovCisjZGVmaW5lIEUxMDAwX1JYRF9FUlJfU0VRICAgICAgIDB4MDQgICAgLyogU2VxdWVuY2UgRXJyb3IgKi8KKyNkZWZpbmUgRTEwMDBfUlhEX0VSUl9DWEUgICAgICAgMHgxMCAgICAvKiBDYXJyaWVyIEV4dGVuc2lvbiBFcnJvciAqLworI2RlZmluZSBFMTAwMF9SWERfRVJSX1RDUEUgICAgICAweDIwICAgIC8qIFRDUC9VRFAgQ2hlY2tzdW0gRXJyb3IgKi8KKyNkZWZpbmUgRTEwMDBfUlhEX0VSUl9JUEUgICAgICAgMHg0MCAgICAvKiBJUCBDaGVja3N1bSBFcnJvciAqLworI2RlZmluZSBFMTAwMF9SWERfRVJSX1JYRSAgICAgICAweDgwICAgIC8qIFJ4IERhdGEgRXJyb3IgKi8KKyNkZWZpbmUgRTEwMDBfUlhEX1NQQ19WTEFOX01BU0sgMHgwRkZGICAvKiBWTEFOIElEIGlzIGluIGxvd2VyIDEyIGJpdHMgKi8KKyNkZWZpbmUgRTEwMDBfUlhEX1NQQ19QUklfTUFTSyAgMHhFMDAwICAvKiBQcmlvcml0eSBpcyBpbiB1cHBlciAzIGJpdHMgKi8KKyNkZWZpbmUgRTEwMDBfUlhEX1NQQ19QUklfU0hJRlQgMHgwMDBEICAvKiBQcmlvcml0eSBpcyBpbiB1cHBlciAzIG9mIDE2ICovCisjZGVmaW5lIEUxMDAwX1JYRF9TUENfQ0ZJX01BU0sgIDB4MTAwMCAgLyogQ0ZJIGlzIGJpdCAxMiAqLworI2RlZmluZSBFMTAwMF9SWERfU1BDX0NGSV9TSElGVCAweDAwMEMgIC8qIENGSSBpcyBiaXQgMTIgKi8KKworLyogbWFzayB0byBkZXRlcm1pbmUgaWYgcGFja2V0cyBzaG91bGQgYmUgZHJvcHBlZCBkdWUgdG8gZnJhbWUgZXJyb3JzICovCisjZGVmaW5lIEUxMDAwX1JYRF9FUlJfRlJBTUVfRVJSX01BU0sgKCBcCisgICAgRTEwMDBfUlhEX0VSUl9DRSAgfCAgICAgICAgICAgICAgICBcCisgICAgRTEwMDBfUlhEX0VSUl9TRSAgfCAgICAgICAgICAgICAgICBcCisgICAgRTEwMDBfUlhEX0VSUl9TRVEgfCAgICAgICAgICAgICAgICBcCisgICAgRTEwMDBfUlhEX0VSUl9DWEUgfCAgICAgICAgICAgICAgICBcCisgICAgRTEwMDBfUlhEX0VSUl9SWEUpCisKKy8qIFRyYW5zbWl0IERlc2NyaXB0b3IgKi8KK3N0cnVjdCBlMTAwMF90eF9kZXNjIHsKKyAgICB1aW50NjRfdCBidWZmZXJfYWRkcjsgICAgICAgLyogQWRkcmVzcyBvZiB0aGUgZGVzY3JpcHRvcidzIGRhdGEgYnVmZmVyICovCisgICAgdW5pb24geworICAgICAgICB1aW50MzJfdCBkYXRhOworICAgICAgICBzdHJ1Y3QgeworICAgICAgICAgICAgdWludDE2X3QgbGVuZ3RoOyAgICAvKiBEYXRhIGJ1ZmZlciBsZW5ndGggKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgY3NvOyAgICAgICAgLyogQ2hlY2tzdW0gb2Zmc2V0ICovCisgICAgICAgICAgICB1aW50OF90IGNtZDsgICAgICAgIC8qIERlc2NyaXB0b3IgY29udHJvbCAqLworICAgICAgICB9IGZsYWdzOworICAgIH0gbG93ZXI7CisgICAgdW5pb24geworICAgICAgICB1aW50MzJfdCBkYXRhOworICAgICAgICBzdHJ1Y3QgeworICAgICAgICAgICAgdWludDhfdCBzdGF0dXM7ICAgICAvKiBEZXNjcmlwdG9yIHN0YXR1cyAqLworICAgICAgICAgICAgdWludDhfdCBjc3M7ICAgICAgICAvKiBDaGVja3N1bSBzdGFydCAqLworICAgICAgICAgICAgdWludDE2X3Qgc3BlY2lhbDsKKyAgICAgICAgfSBmaWVsZHM7CisgICAgfSB1cHBlcjsKK307CisKKy8qIFRyYW5zbWl0IERlc2NyaXB0b3IgYml0IGRlZmluaXRpb25zICovCisjZGVmaW5lIEUxMDAwX1RYRF9EVFlQX0QgICAgIDB4MDAxMDAwMDAgLyogRGF0YSBEZXNjcmlwdG9yICovCisjZGVmaW5lIEUxMDAwX1RYRF9EVFlQX0MgICAgIDB4MDAwMDAwMDAgLyogQ29udGV4dCBEZXNjcmlwdG9yICovCisjZGVmaW5lIEUxMDAwX1RYRF9QT1BUU19JWFNNIDB4MDEgICAgICAgLyogSW5zZXJ0IElQIGNoZWNrc3VtICovCisjZGVmaW5lIEUxMDAwX1RYRF9QT1BUU19UWFNNIDB4MDIgICAgICAgLyogSW5zZXJ0IFRDUC9VRFAgY2hlY2tzdW0gKi8KKyNkZWZpbmUgRTEwMDBfVFhEX0NNRF9FT1AgICAgMHgwMTAwMDAwMCAvKiBFbmQgb2YgUGFja2V0ICovCisjZGVmaW5lIEUxMDAwX1RYRF9DTURfSUZDUyAgIDB4MDIwMDAwMDAgLyogSW5zZXJ0IEZDUyAoRXRoZXJuZXQgQ1JDKSAqLworI2RlZmluZSBFMTAwMF9UWERfQ01EX0lDICAgICAweDA0MDAwMDAwIC8qIEluc2VydCBDaGVja3N1bSAqLworI2RlZmluZSBFMTAwMF9UWERfQ01EX1JTICAgICAweDA4MDAwMDAwIC8qIFJlcG9ydCBTdGF0dXMgKi8KKyNkZWZpbmUgRTEwMDBfVFhEX0NNRF9SUFMgICAgMHgxMDAwMDAwMCAvKiBSZXBvcnQgUGFja2V0IFNlbnQgKi8KKyNkZWZpbmUgRTEwMDBfVFhEX0NNRF9ERVhUICAgMHgyMDAwMDAwMCAvKiBEZXNjcmlwdG9yIGV4dGVuc2lvbiAoMCA9IGxlZ2FjeSkgKi8KKyNkZWZpbmUgRTEwMDBfVFhEX0NNRF9WTEUgICAgMHg0MDAwMDAwMCAvKiBBZGQgVkxBTiB0YWcgKi8KKyNkZWZpbmUgRTEwMDBfVFhEX0NNRF9JREUgICAgMHg4MDAwMDAwMCAvKiBFbmFibGUgVGlkdiByZWdpc3RlciAqLworI2RlZmluZSBFMTAwMF9UWERfU1RBVF9ERCAgICAweDAwMDAwMDAxIC8qIERlc2NyaXB0b3IgRG9uZSAqLworI2RlZmluZSBFMTAwMF9UWERfU1RBVF9FQyAgICAweDAwMDAwMDAyIC8qIEV4Y2VzcyBDb2xsaXNpb25zICovCisjZGVmaW5lIEUxMDAwX1RYRF9TVEFUX0xDICAgIDB4MDAwMDAwMDQgLyogTGF0ZSBDb2xsaXNpb25zICovCisjZGVmaW5lIEUxMDAwX1RYRF9TVEFUX1RVICAgIDB4MDAwMDAwMDggLyogVHJhbnNtaXQgdW5kZXJydW4gKi8KKyNkZWZpbmUgRTEwMDBfVFhEX0NNRF9UQ1AgICAgMHgwMTAwMDAwMCAvKiBUQ1AgcGFja2V0ICovCisjZGVmaW5lIEUxMDAwX1RYRF9DTURfSVAgICAgIDB4MDIwMDAwMDAgLyogSVAgcGFja2V0ICovCisjZGVmaW5lIEUxMDAwX1RYRF9DTURfVFNFICAgIDB4MDQwMDAwMDAgLyogVENQIFNlZyBlbmFibGUgKi8KKyNkZWZpbmUgRTEwMDBfVFhEX1NUQVRfVEMgICAgMHgwMDAwMDAwNCAvKiBUeCBVbmRlcnJ1biAqLworCisvKiBPZmZsb2FkIENvbnRleHQgRGVzY3JpcHRvciAqLworc3RydWN0IGUxMDAwX2NvbnRleHRfZGVzYyB7CisgICAgdW5pb24geworICAgICAgICB1aW50MzJfdCBpcF9jb25maWc7CisgICAgICAgIHN0cnVjdCB7CisgICAgICAgICAgICB1aW50OF90IGlwY3NzOyAgICAgIC8qIElQIGNoZWNrc3VtIHN0YXJ0ICovCisgICAgICAgICAgICB1aW50OF90IGlwY3NvOyAgICAgIC8qIElQIGNoZWNrc3VtIG9mZnNldCAqLworICAgICAgICAgICAgdWludDE2X3QgaXBjc2U7ICAgICAvKiBJUCBjaGVja3N1bSBlbmQgKi8KKyAgICAgICAgfSBpcF9maWVsZHM7CisgICAgfSBsb3dlcl9zZXR1cDsKKyAgICB1bmlvbiB7CisgICAgICAgIHVpbnQzMl90IHRjcF9jb25maWc7CisgICAgICAgIHN0cnVjdCB7CisgICAgICAgICAgICB1aW50OF90IHR1Y3NzOyAgICAgIC8qIFRDUCBjaGVja3N1bSBzdGFydCAqLworICAgICAgICAgICAgdWludDhfdCB0dWNzbzsgICAgICAvKiBUQ1AgY2hlY2tzdW0gb2Zmc2V0ICovCisgICAgICAgICAgICB1aW50MTZfdCB0dWNzZTsgICAgIC8qIFRDUCBjaGVja3N1bSBlbmQgKi8KKyAgICAgICAgfSB0Y3BfZmllbGRzOworICAgIH0gdXBwZXJfc2V0dXA7CisgICAgdWludDMyX3QgY21kX2FuZF9sZW5ndGg7ICAgIC8qICovCisgICAgdW5pb24geworICAgICAgICB1aW50MzJfdCBkYXRhOworICAgICAgICBzdHJ1Y3QgeworICAgICAgICAgICAgdWludDhfdCBzdGF0dXM7ICAgICAvKiBEZXNjcmlwdG9yIHN0YXR1cyAqLworICAgICAgICAgICAgdWludDhfdCBoZHJfbGVuOyAgICAvKiBIZWFkZXIgbGVuZ3RoICovCisgICAgICAgICAgICB1aW50MTZfdCBtc3M7ICAgICAgIC8qIE1heGltdW0gc2VnbWVudCBzaXplICovCisgICAgICAgIH0gZmllbGRzOworICAgIH0gdGNwX3NlZ19zZXR1cDsKK307CisKKy8qIE9mZmxvYWQgZGF0YSBkZXNjcmlwdG9yICovCitzdHJ1Y3QgZTEwMDBfZGF0YV9kZXNjIHsKKyAgICB1aW50NjRfdCBidWZmZXJfYWRkcjsgICAgICAgLyogQWRkcmVzcyBvZiB0aGUgZGVzY3JpcHRvcidzIGJ1ZmZlciBhZGRyZXNzICovCisgICAgdW5pb24geworICAgICAgICB1aW50MzJfdCBkYXRhOworICAgICAgICBzdHJ1Y3QgeworICAgICAgICAgICAgdWludDE2X3QgbGVuZ3RoOyAgICAvKiBEYXRhIGJ1ZmZlciBsZW5ndGggKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgdHlwX2xlbl9leHQ7ICAgICAgICAvKiAqLworICAgICAgICAgICAgdWludDhfdCBjbWQ7ICAgICAgICAvKiAqLworICAgICAgICB9IGZsYWdzOworICAgIH0gbG93ZXI7CisgICAgdW5pb24geworICAgICAgICB1aW50MzJfdCBkYXRhOworICAgICAgICBzdHJ1Y3QgeworICAgICAgICAgICAgdWludDhfdCBzdGF0dXM7ICAgICAvKiBEZXNjcmlwdG9yIHN0YXR1cyAqLworICAgICAgICAgICAgdWludDhfdCBwb3B0czsgICAgICAvKiBQYWNrZXQgT3B0aW9ucyAqLworICAgICAgICAgICAgdWludDE2X3Qgc3BlY2lhbDsgICAvKiAqLworICAgICAgICB9IGZpZWxkczsKKyAgICB9IHVwcGVyOworfTsKKworLyogRmlsdGVycyAqLworI2RlZmluZSBFMTAwMF9OVU1fVU5JQ0FTVCAgICAgICAgICAxNiAgIC8qIFVuaWNhc3QgZmlsdGVyIGVudHJpZXMgKi8KKyNkZWZpbmUgRTEwMDBfTUNfVEJMX1NJWkUgICAgICAgICAgMTI4ICAvKiBNdWx0aWNhc3QgRmlsdGVyIFRhYmxlICg0MDk2IGJpdHMpICovCisjZGVmaW5lIEUxMDAwX1ZMQU5fRklMVEVSX1RCTF9TSVpFIDEyOCAgLyogVkxBTiBGaWx0ZXIgVGFibGUgKDQwOTYgYml0cykgKi8KKworCisvKiBSZWNlaXZlIEFkZHJlc3MgUmVnaXN0ZXIgKi8KK3N0cnVjdCBlMTAwMF9yYXIgeworICAgIHZvbGF0aWxlIHVpbnQzMl90IGxvdzsgICAgICAvKiByZWNlaXZlIGFkZHJlc3MgbG93ICovCisgICAgdm9sYXRpbGUgdWludDMyX3QgaGlnaDsgICAgIC8qIHJlY2VpdmUgYWRkcmVzcyBoaWdoICovCit9OworCisvKiBOdW1iZXIgb2YgZW50cmllcyBpbiB0aGUgTXVsdGljYXN0IFRhYmxlIEFycmF5IChNVEEpLiAqLworI2RlZmluZSBFMTAwMF9OVU1fTVRBX1JFR0lTVEVSUyAxMjgKKworLyogSVB2NCBBZGRyZXNzIFRhYmxlIEVudHJ5ICovCitzdHJ1Y3QgZTEwMDBfaXB2NF9hdF9lbnRyeSB7CisgICAgdm9sYXRpbGUgdWludDMyX3QgaXB2NF9hZGRyOyAgICAgICAgLyogSVAgQWRkcmVzcyAoUlcpICovCisgICAgdm9sYXRpbGUgdWludDMyX3QgcmVzZXJ2ZWQ7Cit9OworCisvKiBGb3VyIHdha2V1cCBJUCBhZGRyZXNzZXMgYXJlIHN1cHBvcnRlZCAqLworI2RlZmluZSBFMTAwMF9XQUtFVVBfSVBfQUREUkVTU19DT1VOVF9NQVggNAorI2RlZmluZSBFMTAwMF9JUDRBVF9TSVpFICAgICAgICAgICAgICAgICAgRTEwMDBfV0FLRVVQX0lQX0FERFJFU1NfQ09VTlRfTUFYCisjZGVmaW5lIEUxMDAwX0lQNkFUX1NJWkUgICAgICAgICAgICAgICAgICAxCisKKy8qIElQdjYgQWRkcmVzcyBUYWJsZSBFbnRyeSAqLworc3RydWN0IGUxMDAwX2lwdjZfYXRfZW50cnkgeworICAgIHZvbGF0aWxlIHVpbnQ4X3QgaXB2Nl9hZGRyWzE2XTsKK307CisKKy8qIEZsZXhpYmxlIEZpbHRlciBMZW5ndGggVGFibGUgRW50cnkgKi8KK3N0cnVjdCBlMTAwMF9mZmx0X2VudHJ5IHsKKyAgICB2b2xhdGlsZSB1aW50MzJfdCBsZW5ndGg7ICAgLyogRmxleGlibGUgRmlsdGVyIExlbmd0aCAoUlcpICovCisgICAgdm9sYXRpbGUgdWludDMyX3QgcmVzZXJ2ZWQ7Cit9OworCisvKiBGbGV4aWJsZSBGaWx0ZXIgTWFzayBUYWJsZSBFbnRyeSAqLworc3RydWN0IGUxMDAwX2ZmbXRfZW50cnkgeworICAgIHZvbGF0aWxlIHVpbnQzMl90IG1hc2s7ICAgICAvKiBGbGV4aWJsZSBGaWx0ZXIgTWFzayAoUlcpICovCisgICAgdm9sYXRpbGUgdWludDMyX3QgcmVzZXJ2ZWQ7Cit9OworCisvKiBGbGV4aWJsZSBGaWx0ZXIgVmFsdWUgVGFibGUgRW50cnkgKi8KK3N0cnVjdCBlMTAwMF9mZnZ0X2VudHJ5IHsKKyAgICB2b2xhdGlsZSB1aW50MzJfdCB2YWx1ZTsgICAgLyogRmxleGlibGUgRmlsdGVyIFZhbHVlIChSVykgKi8KKyAgICB2b2xhdGlsZSB1aW50MzJfdCByZXNlcnZlZDsKK307CisKKy8qIEZvdXIgRmxleGlibGUgRmlsdGVycyBhcmUgc3VwcG9ydGVkICovCisjZGVmaW5lIEUxMDAwX0ZMRVhJQkxFX0ZJTFRFUl9DT1VOVF9NQVggNAorCisvKiBFYWNoIEZsZXhpYmxlIEZpbHRlciBpcyBhdCBtb3N0IDEyOCAoMHg4MCkgYnl0ZXMgaW4gbGVuZ3RoICovCisjZGVmaW5lIEUxMDAwX0ZMRVhJQkxFX0ZJTFRFUl9TSVpFX01BWCAgMTI4CisKKyNkZWZpbmUgRTEwMDBfRkZMVF9TSVpFIEUxMDAwX0ZMRVhJQkxFX0ZJTFRFUl9DT1VOVF9NQVgKKyNkZWZpbmUgRTEwMDBfRkZNVF9TSVpFIEUxMDAwX0ZMRVhJQkxFX0ZJTFRFUl9TSVpFX01BWAorI2RlZmluZSBFMTAwMF9GRlZUX1NJWkUgRTEwMDBfRkxFWElCTEVfRklMVEVSX1NJWkVfTUFYCisKKy8qIFJlZ2lzdGVyIFNldC4gKDgyNTQzLCA4MjU0NCkKKyAqCisgKiBSZWdpc3RlcnMgYXJlIGRlZmluZWQgdG8gYmUgMzIgYml0cyBhbmQgIHNob3VsZCBiZSBhY2Nlc3NlZCBhcyAzMiBiaXQgdmFsdWVzLgorICogVGhlc2UgcmVnaXN0ZXJzIGFyZSBwaHlzaWNhbGx5IGxvY2F0ZWQgb24gdGhlIE5JQywgYnV0IGFyZSBtYXBwZWQgaW50byB0aGUgCisgKiBob3N0IG1lbW9yeSBhZGRyZXNzIHNwYWNlLgorICoKKyAqIFJXIC0gcmVnaXN0ZXIgaXMgYm90aCByZWFkYWJsZSBhbmQgd3JpdGFibGUKKyAqIFJPIC0gcmVnaXN0ZXIgaXMgcmVhZCBvbmx5CisgKiBXTyAtIHJlZ2lzdGVyIGlzIHdyaXRlIG9ubHkKKyAqIFIvY2xyIC0gcmVnaXN0ZXIgaXMgcmVhZCBvbmx5IGFuZCBpcyBjbGVhcmVkIHdoZW4gcmVhZAorICogQSAtIHJlZ2lzdGVyIGFycmF5CisgKi8KKyNkZWZpbmUgRTEwMDBfQ1RSTCAgICAgMHgwMDAwMCAgLyogRGV2aWNlIENvbnRyb2wgLSBSVyAqLworI2RlZmluZSBFMTAwMF9DVFJMX0RVUCAweDAwMDA0ICAvKiBEZXZpY2UgQ29udHJvbCBEdXBsaWNhdGUgKFNoYWRvdykgLSBSVyAqLworI2RlZmluZSBFMTAwMF9TVEFUVVMgICAweDAwMDA4ICAvKiBEZXZpY2UgU3RhdHVzIC0gUk8gKi8KKyNkZWZpbmUgRTEwMDBfRUVDRCAgICAgMHgwMDAxMCAgLyogRUVQUk9NL0ZsYXNoIENvbnRyb2wgLSBSVyAqLworI2RlZmluZSBFMTAwMF9FRVJEICAgICAweDAwMDE0ICAvKiBFRVBST00gUmVhZCAtIFJXICovCisjZGVmaW5lIEUxMDAwX0NUUkxfRVhUIDB4MDAwMTggIC8qIEV4dGVuZGVkIERldmljZSBDb250cm9sIC0gUlcgKi8KKyNkZWZpbmUgRTEwMDBfRkxBICAgICAgMHgwMDAxQyAgLyogRmxhc2ggQWNjZXNzIC0gUlcgKi8KKyNkZWZpbmUgRTEwMDBfTURJQyAgICAgMHgwMDAyMCAgLyogTURJIENvbnRyb2wgLSBSVyAqLworI2RlZmluZSBFMTAwMF9GQ0FMICAgICAweDAwMDI4ICAvKiBGbG93IENvbnRyb2wgQWRkcmVzcyBMb3cgLSBSVyAqLworI2RlZmluZSBFMTAwMF9GQ0FIICAgICAweDAwMDJDICAvKiBGbG93IENvbnRyb2wgQWRkcmVzcyBIaWdoIC1SVyAqLworI2RlZmluZSBFMTAwMF9GQ1QgICAgICAweDAwMDMwICAvKiBGbG93IENvbnRyb2wgVHlwZSAtIFJXICovCisjZGVmaW5lIEUxMDAwX1ZFVCAgICAgIDB4MDAwMzggIC8qIFZMQU4gRXRoZXIgVHlwZSAtIFJXICovCisjZGVmaW5lIEUxMDAwX0lDUiAgICAgIDB4MDAwQzAgIC8qIEludGVycnVwdCBDYXVzZSBSZWFkIC0gUi9jbHIgKi8KKyNkZWZpbmUgRTEwMDBfSVRSICAgICAgMHgwMDBDNCAgLyogSW50ZXJydXB0IFRocm90dGxpbmcgUmF0ZSAtIFJXICovCisjZGVmaW5lIEUxMDAwX0lDUyAgICAgIDB4MDAwQzggIC8qIEludGVycnVwdCBDYXVzZSBTZXQgLSBXTyAqLworI2RlZmluZSBFMTAwMF9JTVMgICAgICAweDAwMEQwICAvKiBJbnRlcnJ1cHQgTWFzayBTZXQgLSBSVyAqLworI2RlZmluZSBFMTAwMF9JTUMgICAgICAweDAwMEQ4ICAvKiBJbnRlcnJ1cHQgTWFzayBDbGVhciAtIFdPICovCisjZGVmaW5lIEUxMDAwX1JDVEwgICAgIDB4MDAxMDAgIC8qIFJYIENvbnRyb2wgLSBSVyAqLworI2RlZmluZSBFMTAwMF9GQ1RUViAgICAweDAwMTcwICAvKiBGbG93IENvbnRyb2wgVHJhbnNtaXQgVGltZXIgVmFsdWUgLSBSVyAqLworI2RlZmluZSBFMTAwMF9UWENXICAgICAweDAwMTc4ICAvKiBUWCBDb25maWd1cmF0aW9uIFdvcmQgLSBSVyAqLworI2RlZmluZSBFMTAwMF9SWENXICAgICAweDAwMTgwICAvKiBSWCBDb25maWd1cmF0aW9uIFdvcmQgLSBSTyAqLworI2RlZmluZSBFMTAwMF9UQ1RMICAgICAweDAwNDAwICAvKiBUWCBDb250cm9sIC0gUlcgKi8KKyNkZWZpbmUgRTEwMDBfVElQRyAgICAgMHgwMDQxMCAgLyogVFggSW50ZXItcGFja2V0IGdhcCAtUlcgKi8KKyNkZWZpbmUgRTEwMDBfVEJUICAgICAgMHgwMDQ0OCAgLyogVFggQnVyc3QgVGltZXIgLSBSVyAqLworI2RlZmluZSBFMTAwMF9BSVQgICAgICAweDAwNDU4ICAvKiBBZGFwdGl2ZSBJbnRlcmZyYW1lIFNwYWNpbmcgVGhyb3R0bGUgLSBSVyAqLworI2RlZmluZSBFMTAwMF9MRURDVEwgICAweDAwRTAwICAvKiBMRUQgQ29udHJvbCAtIFJXICovCisjZGVmaW5lIEUxMDAwX1BCQSAgICAgIDB4MDEwMDAgIC8qIFBhY2tldCBCdWZmZXIgQWxsb2NhdGlvbiAtIFJXICovCisjZGVmaW5lIEUxMDAwX0ZDUlRMICAgIDB4MDIxNjAgIC8qIEZsb3cgQ29udHJvbCBSZWNlaXZlIFRocmVzaG9sZCBMb3cgLSBSVyAqLworI2RlZmluZSBFMTAwMF9GQ1JUSCAgICAweDAyMTY4ICAvKiBGbG93IENvbnRyb2wgUmVjZWl2ZSBUaHJlc2hvbGQgSGlnaCAtIFJXICovCisjZGVmaW5lIEUxMDAwX1JEQkFMICAgIDB4MDI4MDAgIC8qIFJYIERlc2NyaXB0b3IgQmFzZSBBZGRyZXNzIExvdyAtIFJXICovCisjZGVmaW5lIEUxMDAwX1JEQkFIICAgIDB4MDI4MDQgIC8qIFJYIERlc2NyaXB0b3IgQmFzZSBBZGRyZXNzIEhpZ2ggLSBSVyAqLworI2RlZmluZSBFMTAwMF9SRExFTiAgICAweDAyODA4ICAvKiBSWCBEZXNjcmlwdG9yIExlbmd0aCAtIFJXICovCisjZGVmaW5lIEUxMDAwX1JESCAgICAgIDB4MDI4MTAgIC8qIFJYIERlc2NyaXB0b3IgSGVhZCAtIFJXICovCisjZGVmaW5lIEUxMDAwX1JEVCAgICAgIDB4MDI4MTggIC8qIFJYIERlc2NyaXB0b3IgVGFpbCAtIFJXICovCisjZGVmaW5lIEUxMDAwX1JEVFIgICAgIDB4MDI4MjAgIC8qIFJYIERlbGF5IFRpbWVyIC0gUlcgKi8KKyNkZWZpbmUgRTEwMDBfUlhEQ1RMICAgMHgwMjgyOCAgLyogUlggRGVzY3JpcHRvciBDb250cm9sIC0gUlcgKi8KKyNkZWZpbmUgRTEwMDBfUkFEViAgICAgMHgwMjgyQyAgLyogUlggSW50ZXJydXB0IEFic29sdXRlIERlbGF5IFRpbWVyIC0gUlcgKi8KKyNkZWZpbmUgRTEwMDBfUlNSUEQgICAgMHgwMkMwMCAgLyogUlggU21hbGwgUGFja2V0IERldGVjdCAtIFJXICovCisjZGVmaW5lIEUxMDAwX1RYRE1BQyAgIDB4MDMwMDAgIC8qIFRYIERNQSBDb250cm9sIC0gUlcgKi8KKyNkZWZpbmUgRTEwMDBfVERGSCAgICAgMHgwMzQxMCAgLyogVFggRGF0YSBGSUZPIEhlYWQgLSBSVyAqLworI2RlZmluZSBFMTAwMF9UREZUICAgICAweDAzNDE4ICAvKiBUWCBEYXRhIEZJRk8gVGFpbCAtIFJXICovCisjZGVmaW5lIEUxMDAwX1RERkhTICAgIDB4MDM0MjAgIC8qIFRYIERhdGEgRklGTyBIZWFkIFNhdmVkIC0gUlcgKi8KKyNkZWZpbmUgRTEwMDBfVERGVFMgICAgMHgwMzQyOCAgLyogVFggRGF0YSBGSUZPIFRhaWwgU2F2ZWQgLSBSVyAqLworI2RlZmluZSBFMTAwMF9UREZQQyAgICAweDAzNDMwICAvKiBUWCBEYXRhIEZJRk8gUGFja2V0IENvdW50IC0gUlcgKi8KKyNkZWZpbmUgRTEwMDBfVERCQUwgICAgMHgwMzgwMCAgLyogVFggRGVzY3JpcHRvciBCYXNlIEFkZHJlc3MgTG93IC0gUlcgKi8KKyNkZWZpbmUgRTEwMDBfVERCQUggICAgMHgwMzgwNCAgLyogVFggRGVzY3JpcHRvciBCYXNlIEFkZHJlc3MgSGlnaCAtIFJXICovCisjZGVmaW5lIEUxMDAwX1RETEVOICAgIDB4MDM4MDggIC8qIFRYIERlc2NyaXB0b3IgTGVuZ3RoIC0gUlcgKi8KKyNkZWZpbmUgRTEwMDBfVERIICAgICAgMHgwMzgxMCAgLyogVFggRGVzY3JpcHRvciBIZWFkIC0gUlcgKi8KKyNkZWZpbmUgRTEwMDBfVERUICAgICAgMHgwMzgxOCAgLyogVFggRGVzY3JpcG90ciBUYWlsIC0gUlcgKi8KKyNkZWZpbmUgRTEwMDBfVElEViAgICAgMHgwMzgyMCAgLyogVFggSW50ZXJydXB0IERlbGF5IFZhbHVlIC0gUlcgKi8KKyNkZWZpbmUgRTEwMDBfVFhEQ1RMICAgMHgwMzgyOCAgLyogVFggRGVzY3JpcHRvciBDb250cm9sIC0gUlcgKi8KKyNkZWZpbmUgRTEwMDBfVEFEViAgICAgMHgwMzgyQyAgLyogVFggSW50ZXJydXB0IEFic29sdXRlIERlbGF5IFZhbCAtIFJXICovCisjZGVmaW5lIEUxMDAwX1RTUE1UICAgIDB4MDM4MzAgIC8qIFRDUCBTZWdtZW50YXRpb24gUEFEICYgTWluIFRocmVzaG9sZCAtIFJXICovCisjZGVmaW5lIEUxMDAwX0NSQ0VSUlMgIDB4MDQwMDAgIC8qIENSQyBFcnJvciBDb3VudCAtIFIvY2xyICovCisjZGVmaW5lIEUxMDAwX0FMR05FUlJDIDB4MDQwMDQgIC8qIEFsaWdubWVudCBFcnJvciBDb3VudCAtIFIvY2xyICovCisjZGVmaW5lIEUxMDAwX1NZTUVSUlMgIDB4MDQwMDggIC8qIFN5bWJvbCBFcnJvciBDb3VudCAtIFIvY2xyICovCisjZGVmaW5lIEUxMDAwX1JYRVJSQyAgIDB4MDQwMEMgIC8qIFJlY2VpdmUgRXJyb3IgQ291bnQgLSBSL2NsciAqLworI2RlZmluZSBFMTAwMF9NUEMgICAgICAweDA0MDEwICAvKiBNaXNzZWQgUGFja2V0IENvdW50IC0gUi9jbHIgKi8KKyNkZWZpbmUgRTEwMDBfU0NDICAgICAgMHgwNDAxNCAgLyogU2luZ2xlIENvbGxpc2lvbiBDb3VudCAtIFIvY2xyICovCisjZGVmaW5lIEUxMDAwX0VDT0wgICAgIDB4MDQwMTggIC8qIEV4Y2Vzc2l2ZSBDb2xsaXNpb24gQ291bnQgLSBSL2NsciAqLworI2RlZmluZSBFMTAwMF9NQ0MgICAgICAweDA0MDFDICAvKiBNdWx0aXBsZSBDb2xsaXNpb24gQ291bnQgLSBSL2NsciAqLworI2RlZmluZSBFMTAwMF9MQVRFQ09MICAweDA0MDIwICAvKiBMYXRlIENvbGxpc2lvbiBDb3VudCAtIFIvY2xyICovCisjZGVmaW5lIEUxMDAwX0NPTEMgICAgIDB4MDQwMjggIC8qIENvbGxpc2lvbiBDb3VudCAtIFIvY2xyICovCisjZGVmaW5lIEUxMDAwX0RDICAgICAgIDB4MDQwMzAgIC8qIERlZmVyIENvdW50IC0gUi9jbHIgKi8KKyNkZWZpbmUgRTEwMDBfVE5DUlMgICAgMHgwNDAzNCAgLyogVFgtTm8gQ1JTIC0gUi9jbHIgKi8KKyNkZWZpbmUgRTEwMDBfU0VDICAgICAgMHgwNDAzOCAgLyogU2VxdWVuY2UgRXJyb3IgQ291bnQgLSBSL2NsciAqLworI2RlZmluZSBFMTAwMF9DRVhURVJSICAweDA0MDNDICAvKiBDYXJyaWVyIEV4dGVuc2lvbiBFcnJvciBDb3VudCAtIFIvY2xyICovCisjZGVmaW5lIEUxMDAwX1JMRUMgICAgIDB4MDQwNDAgIC8qIFJlY2VpdmUgTGVuZ3RoIEVycm9yIENvdW50IC0gUi9jbHIgKi8KKyNkZWZpbmUgRTEwMDBfWE9OUlhDICAgMHgwNDA0OCAgLyogWE9OIFJYIENvdW50IC0gUi9jbHIgKi8KKyNkZWZpbmUgRTEwMDBfWE9OVFhDICAgMHgwNDA0QyAgLyogWE9OIFRYIENvdW50IC0gUi9jbHIgKi8KKyNkZWZpbmUgRTEwMDBfWE9GRlJYQyAgMHgwNDA1MCAgLyogWE9GRiBSWCBDb3VudCAtIFIvY2xyICovCisjZGVmaW5lIEUxMDAwX1hPRkZUWEMgIDB4MDQwNTQgIC8qIFhPRkYgVFggQ291bnQgLSBSL2NsciAqLworI2RlZmluZSBFMTAwMF9GQ1JVQyAgICAweDA0MDU4ICAvKiBGbG93IENvbnRyb2wgUlggVW5zdXBwb3J0ZWQgQ291bnQtIFIvY2xyICovCisjZGVmaW5lIEUxMDAwX1BSQzY0ICAgIDB4MDQwNUMgIC8qIFBhY2tldHMgUlggKDY0IGJ5dGVzKSAtIFIvY2xyICovCisjZGVmaW5lIEUxMDAwX1BSQzEyNyAgIDB4MDQwNjAgIC8qIFBhY2tldHMgUlggKDY1LTEyNyBieXRlcykgLSBSL2NsciAqLworI2RlZmluZSBFMTAwMF9QUkMyNTUgICAweDA0MDY0ICAvKiBQYWNrZXRzIFJYICgxMjgtMjU1IGJ5dGVzKSAtIFIvY2xyICovCisjZGVmaW5lIEUxMDAwX1BSQzUxMSAgIDB4MDQwNjggIC8qIFBhY2tldHMgUlggKDI1NS01MTEgYnl0ZXMpIC0gUi9jbHIgKi8KKyNkZWZpbmUgRTEwMDBfUFJDMTAyMyAgMHgwNDA2QyAgLyogUGFja2V0cyBSWCAoNTEyLTEwMjMgYnl0ZXMpIC0gUi9jbHIgKi8KKyNkZWZpbmUgRTEwMDBfUFJDMTUyMiAgMHgwNDA3MCAgLyogUGFja2V0cyBSWCAoMTAyNC0xNTIyIGJ5dGVzKSAtIFIvY2xyICovCisjZGVmaW5lIEUxMDAwX0dQUkMgICAgIDB4MDQwNzQgIC8qIEdvb2QgUGFja2V0cyBSWCBDb3VudCAtIFIvY2xyICovCisjZGVmaW5lIEUxMDAwX0JQUkMgICAgIDB4MDQwNzggIC8qIEJyb2FkY2FzdCBQYWNrZXRzIFJYIENvdW50IC0gUi9jbHIgKi8KKyNkZWZpbmUgRTEwMDBfTVBSQyAgICAgMHgwNDA3QyAgLyogTXVsdGljYXN0IFBhY2tldHMgUlggQ291bnQgLSBSL2NsciAqLworI2RlZmluZSBFMTAwMF9HUFRDICAgICAweDA0MDgwICAvKiBHb29kIFBhY2tldHMgVFggQ291bnQgLSBSL2NsciAqLworI2RlZmluZSBFMTAwMF9HT1JDTCAgICAweDA0MDg4ICAvKiBHb29kIE9jdGV0cyBSWCBDb3VudCBMb3cgLSBSL2NsciAqLworI2RlZmluZSBFMTAwMF9HT1JDSCAgICAweDA0MDhDICAvKiBHb29kIE9jdGV0cyBSWCBDb3VudCBIaWdoIC0gUi9jbHIgKi8KKyNkZWZpbmUgRTEwMDBfR09UQ0wgICAgMHgwNDA5MCAgLyogR29vZCBPY3RldHMgVFggQ291bnQgTG93IC0gUi9jbHIgKi8KKyNkZWZpbmUgRTEwMDBfR09UQ0ggICAgMHgwNDA5NCAgLyogR29vZCBPY3RldHMgVFggQ291bnQgSGlnaCAtIFIvY2xyICovCisjZGVmaW5lIEUxMDAwX1JOQkMgICAgIDB4MDQwQTAgIC8qIFJYIE5vIEJ1ZmZlcnMgQ291bnQgLSBSL2NsciAqLworI2RlZmluZSBFMTAwMF9SVUMgICAgICAweDA0MEE0ICAvKiBSWCBVbmRlcnNpemUgQ291bnQgLSBSL2NsciAqLworI2RlZmluZSBFMTAwMF9SRkMgICAgICAweDA0MEE4ICAvKiBSWCBGcmFnbWVudCBDb3VudCAtIFIvY2xyICovCisjZGVmaW5lIEUxMDAwX1JPQyAgICAgIDB4MDQwQUMgIC8qIFJYIE92ZXJzaXplIENvdW50IC0gUi9jbHIgKi8KKyNkZWZpbmUgRTEwMDBfUkpDICAgICAgMHgwNDBCMCAgLyogUlggSmFiYmVyIENvdW50IC0gUi9jbHIgKi8KKyNkZWZpbmUgRTEwMDBfTUdUUFJDICAgMHgwNDBCNCAgLyogTWFuYWdlbWVudCBQYWNrZXRzIFJYIENvdW50IC0gUi9jbHIgKi8KKyNkZWZpbmUgRTEwMDBfTUdUUERDICAgMHgwNDBCOCAgLyogTWFuYWdlbWVudCBQYWNrZXRzIERyb3BwZWQgQ291bnQgLSBSL2NsciAqLworI2RlZmluZSBFMTAwMF9NR1RQVEMgICAweDA0MEJDICAvKiBNYW5hZ2VtZW50IFBhY2tldHMgVFggQ291bnQgLSBSL2NsciAqLworI2RlZmluZSBFMTAwMF9UT1JMICAgICAweDA0MEMwICAvKiBUb3RhbCBPY3RldHMgUlggTG93IC0gUi9jbHIgKi8KKyNkZWZpbmUgRTEwMDBfVE9SSCAgICAgMHgwNDBDNCAgLyogVG90YWwgT2N0ZXRzIFJYIEhpZ2ggLSBSL2NsciAqLworI2RlZmluZSBFMTAwMF9UT1RMICAgICAweDA0MEM4ICAvKiBUb3RhbCBPY3RldHMgVFggTG93IC0gUi9jbHIgKi8KKyNkZWZpbmUgRTEwMDBfVE9USCAgICAgMHgwNDBDQyAgLyogVG90YWwgT2N0ZXRzIFRYIEhpZ2ggLSBSL2NsciAqLworI2RlZmluZSBFMTAwMF9UUFIgICAgICAweDA0MEQwICAvKiBUb3RhbCBQYWNrZXRzIFJYIC0gUi9jbHIgKi8KKyNkZWZpbmUgRTEwMDBfVFBUICAgICAgMHgwNDBENCAgLyogVG90YWwgUGFja2V0cyBUWCAtIFIvY2xyICovCisjZGVmaW5lIEUxMDAwX1BUQzY0ICAgIDB4MDQwRDggIC8qIFBhY2tldHMgVFggKDY0IGJ5dGVzKSAtIFIvY2xyICovCisjZGVmaW5lIEUxMDAwX1BUQzEyNyAgIDB4MDQwREMgIC8qIFBhY2tldHMgVFggKDY1LTEyNyBieXRlcykgLSBSL2NsciAqLworI2RlZmluZSBFMTAwMF9QVEMyNTUgICAweDA0MEUwICAvKiBQYWNrZXRzIFRYICgxMjgtMjU1IGJ5dGVzKSAtIFIvY2xyICovCisjZGVmaW5lIEUxMDAwX1BUQzUxMSAgIDB4MDQwRTQgIC8qIFBhY2tldHMgVFggKDI1Ni01MTEgYnl0ZXMpIC0gUi9jbHIgKi8KKyNkZWZpbmUgRTEwMDBfUFRDMTAyMyAgMHgwNDBFOCAgLyogUGFja2V0cyBUWCAoNTEyLTEwMjMgYnl0ZXMpIC0gUi9jbHIgKi8KKyNkZWZpbmUgRTEwMDBfUFRDMTUyMiAgMHgwNDBFQyAgLyogUGFja2V0cyBUWCAoMTAyNC0xNTIyIEJ5dGVzKSAtIFIvY2xyICovCisjZGVmaW5lIEUxMDAwX01QVEMgICAgIDB4MDQwRjAgIC8qIE11bHRpY2FzdCBQYWNrZXRzIFRYIENvdW50IC0gUi9jbHIgKi8KKyNkZWZpbmUgRTEwMDBfQlBUQyAgICAgMHgwNDBGNCAgLyogQnJvYWRjYXN0IFBhY2tldHMgVFggQ291bnQgLSBSL2NsciAqLworI2RlZmluZSBFMTAwMF9UU0NUQyAgICAweDA0MEY4ICAvKiBUQ1AgU2VnbWVudGF0aW9uIENvbnRleHQgVFggLSBSL2NsciAqLworI2RlZmluZSBFMTAwMF9UU0NURkMgICAweDA0MEZDICAvKiBUQ1AgU2VnbWVudGF0aW9uIENvbnRleHQgVFggRmFpbCAtIFIvY2xyICovCisjZGVmaW5lIEUxMDAwX1JYQ1NVTSAgIDB4MDUwMDAgIC8qIFJYIENoZWNrc3VtIENvbnRyb2wgLSBSVyAqLworI2RlZmluZSBFMTAwMF9NVEEgICAgICAweDA1MjAwICAvKiBNdWx0aWNhc3QgVGFibGUgQXJyYXkgLSBSVyBBcnJheSAqLworI2RlZmluZSBFMTAwMF9SQSAgICAgICAweDA1NDAwICAvKiBSZWNlaXZlIEFkZHJlc3MgLSBSVyBBcnJheSAqLworI2RlZmluZSBFMTAwMF9WRlRBICAgICAweDA1NjAwICAvKiBWTEFOIEZpbHRlciBUYWJsZSBBcnJheSAtIFJXIEFycmF5ICovCisjZGVmaW5lIEUxMDAwX1dVQyAgICAgIDB4MDU4MDAgIC8qIFdha2V1cCBDb250cm9sIC0gUlcgKi8KKyNkZWZpbmUgRTEwMDBfV1VGQyAgICAgMHgwNTgwOCAgLyogV2FrZXVwIEZpbHRlciBDb250cm9sIC0gUlcgKi8KKyNkZWZpbmUgRTEwMDBfV1VTICAgICAgMHgwNTgxMCAgLyogV2FrZXVwIFN0YXR1cyAtIFJPICovCisjZGVmaW5lIEUxMDAwX01BTkMgICAgIDB4MDU4MjAgIC8qIE1hbmFnZW1lbnQgQ29udHJvbCAtIFJXICovCisjZGVmaW5lIEUxMDAwX0lQQVYgICAgIDB4MDU4MzggIC8qIElQIEFkZHJlc3MgVmFsaWQgLSBSVyAqLworI2RlZmluZSBFMTAwMF9JUDRBVCAgICAweDA1ODQwICAvKiBJUHY0IEFkZHJlc3MgVGFibGUgLSBSVyBBcnJheSAqLworI2RlZmluZSBFMTAwMF9JUDZBVCAgICAweDA1ODgwICAvKiBJUHY2IEFkZHJlc3MgVGFibGUgLSBSVyBBcnJheSAqLworI2RlZmluZSBFMTAwMF9XVVBMICAgICAweDA1OTAwICAvKiBXYWtldXAgUGFja2V0IExlbmd0aCAtIFJXICovCisjZGVmaW5lIEUxMDAwX1dVUE0gICAgIDB4MDVBMDAgIC8qIFdha2V1cCBQYWNrZXQgTWVtb3J5IC0gUk8gQSAqLworI2RlZmluZSBFMTAwMF9GRkxUICAgICAweDA1RjAwICAvKiBGbGV4aWJsZSBGaWx0ZXIgTGVuZ3RoIFRhYmxlIC0gUlcgQXJyYXkgKi8KKyNkZWZpbmUgRTEwMDBfRkZNVCAgICAgMHgwOTAwMCAgLyogRmxleGlibGUgRmlsdGVyIE1hc2sgVGFibGUgLSBSVyBBcnJheSAqLworI2RlZmluZSBFMTAwMF9GRlZUICAgICAweDA5ODAwICAvKiBGbGV4aWJsZSBGaWx0ZXIgVmFsdWUgVGFibGUgLSBSVyBBcnJheSAqLworCisvKiBSZWdpc3RlciBTZXQgKDgyNTQyKQorICoKKyAqIFNvbWUgb2YgdGhlIDgyNTQyIHJlZ2lzdGVycyBhcmUgbG9jYXRlZCBhdCBkaWZmZXJlbnQgb2Zmc2V0cyB0aGFuIHRoZXkgYXJlCisgKiBpbiBtb3JlIGN1cnJlbnQgdmVyc2lvbnMgb2YgdGhlIDgyNTR4LiBEZXNwaXRlIHRoZSBkaWZmZXJlbmNlIGluIGxvY2F0aW9uLAorICogdGhlIHJlZ2lzdGVycyBmdW5jdGlvbiBpbiB0aGUgc2FtZSBtYW5uZXIuCisgKi8KKyNkZWZpbmUgRTEwMDBfODI1NDJfQ1RSTCAgICAgRTEwMDBfQ1RSTAorI2RlZmluZSBFMTAwMF84MjU0Ml9DVFJMX0RVUCBFMTAwMF9DVFJMX0RVUAorI2RlZmluZSBFMTAwMF84MjU0Ml9TVEFUVVMgICBFMTAwMF9TVEFUVVMKKyNkZWZpbmUgRTEwMDBfODI1NDJfRUVDRCAgICAgRTEwMDBfRUVDRAorI2RlZmluZSBFMTAwMF84MjU0Ml9FRVJEICAgICBFMTAwMF9FRVJECisjZGVmaW5lIEUxMDAwXzgyNTQyX0NUUkxfRVhUIEUxMDAwX0NUUkxfRVhUCisjZGVmaW5lIEUxMDAwXzgyNTQyX0ZMQSAgICAgIEUxMDAwX0ZMQQorI2RlZmluZSBFMTAwMF84MjU0Ml9NRElDICAgICBFMTAwMF9NRElDCisjZGVmaW5lIEUxMDAwXzgyNTQyX0ZDQUwgICAgIEUxMDAwX0ZDQUwKKyNkZWZpbmUgRTEwMDBfODI1NDJfRkNBSCAgICAgRTEwMDBfRkNBSAorI2RlZmluZSBFMTAwMF84MjU0Ml9GQ1QgICAgICBFMTAwMF9GQ1QKKyNkZWZpbmUgRTEwMDBfODI1NDJfVkVUICAgICAgRTEwMDBfVkVUCisjZGVmaW5lIEUxMDAwXzgyNTQyX1JBICAgICAgIDB4MDAwNDAKKyNkZWZpbmUgRTEwMDBfODI1NDJfSUNSICAgICAgRTEwMDBfSUNSCisjZGVmaW5lIEUxMDAwXzgyNTQyX0lUUiAgICAgIEUxMDAwX0lUUgorI2RlZmluZSBFMTAwMF84MjU0Ml9JQ1MgICAgICBFMTAwMF9JQ1MKKyNkZWZpbmUgRTEwMDBfODI1NDJfSU1TICAgICAgRTEwMDBfSU1TCisjZGVmaW5lIEUxMDAwXzgyNTQyX0lNQyAgICAgIEUxMDAwX0lNQworI2RlZmluZSBFMTAwMF84MjU0Ml9SQ1RMICAgICBFMTAwMF9SQ1RMCisjZGVmaW5lIEUxMDAwXzgyNTQyX1JEVFIgICAgIDB4MDAxMDgKKyNkZWZpbmUgRTEwMDBfODI1NDJfUkRCQUwgICAgMHgwMDExMAorI2RlZmluZSBFMTAwMF84MjU0Ml9SREJBSCAgICAweDAwMTE0CisjZGVmaW5lIEUxMDAwXzgyNTQyX1JETEVOICAgIDB4MDAxMTgKKyNkZWZpbmUgRTEwMDBfODI1NDJfUkRIICAgICAgMHgwMDEyMAorI2RlZmluZSBFMTAwMF84MjU0Ml9SRFQgICAgICAweDAwMTI4CisjZGVmaW5lIEUxMDAwXzgyNTQyX0ZDUlRIICAgIDB4MDAxNjAKKyNkZWZpbmUgRTEwMDBfODI1NDJfRkNSVEwgICAgMHgwMDE2OAorI2RlZmluZSBFMTAwMF84MjU0Ml9GQ1RUViAgICBFMTAwMF9GQ1RUVgorI2RlZmluZSBFMTAwMF84MjU0Ml9UWENXICAgICBFMTAwMF9UWENXCisjZGVmaW5lIEUxMDAwXzgyNTQyX1JYQ1cgICAgIEUxMDAwX1JYQ1cKKyNkZWZpbmUgRTEwMDBfODI1NDJfTVRBICAgICAgMHgwMDIwMAorI2RlZmluZSBFMTAwMF84MjU0Ml9UQ1RMICAgICBFMTAwMF9UQ1RMCisjZGVmaW5lIEUxMDAwXzgyNTQyX1RJUEcgICAgIEUxMDAwX1RJUEcKKyNkZWZpbmUgRTEwMDBfODI1NDJfVERCQUwgICAgMHgwMDQyMAorI2RlZmluZSBFMTAwMF84MjU0Ml9UREJBSCAgICAweDAwNDI0CisjZGVmaW5lIEUxMDAwXzgyNTQyX1RETEVOICAgIDB4MDA0MjgKKyNkZWZpbmUgRTEwMDBfODI1NDJfVERIICAgICAgMHgwMDQzMAorI2RlZmluZSBFMTAwMF84MjU0Ml9URFQgICAgICAweDAwNDM4CisjZGVmaW5lIEUxMDAwXzgyNTQyX1RJRFYgICAgIDB4MDA0NDAKKyNkZWZpbmUgRTEwMDBfODI1NDJfVEJUICAgICAgRTEwMDBfVEJUCisjZGVmaW5lIEUxMDAwXzgyNTQyX0FJVCAgICAgIEUxMDAwX0FJVAorI2RlZmluZSBFMTAwMF84MjU0Ml9WRlRBICAgICAweDAwNjAwCisjZGVmaW5lIEUxMDAwXzgyNTQyX0xFRENUTCAgIEUxMDAwX0xFRENUTAorI2RlZmluZSBFMTAwMF84MjU0Ml9QQkEgICAgICBFMTAwMF9QQkEKKyNkZWZpbmUgRTEwMDBfODI1NDJfUlhEQ1RMICAgRTEwMDBfUlhEQ1RMCisjZGVmaW5lIEUxMDAwXzgyNTQyX1JBRFYgICAgIEUxMDAwX1JBRFYKKyNkZWZpbmUgRTEwMDBfODI1NDJfUlNSUEQgICAgRTEwMDBfUlNSUEQKKyNkZWZpbmUgRTEwMDBfODI1NDJfVFhETUFDICAgRTEwMDBfVFhETUFDCisjZGVmaW5lIEUxMDAwXzgyNTQyX1RERkhTICAgIEUxMDAwX1RERkhTCisjZGVmaW5lIEUxMDAwXzgyNTQyX1RERlRTICAgIEUxMDAwX1RERlRTCisjZGVmaW5lIEUxMDAwXzgyNTQyX1RERlBDICAgIEUxMDAwX1RERlBDCisjZGVmaW5lIEUxMDAwXzgyNTQyX1RYRENUTCAgIEUxMDAwX1RYRENUTAorI2RlZmluZSBFMTAwMF84MjU0Ml9UQURWICAgICBFMTAwMF9UQURWCisjZGVmaW5lIEUxMDAwXzgyNTQyX1RTUE1UICAgIEUxMDAwX1RTUE1UCisjZGVmaW5lIEUxMDAwXzgyNTQyX0NSQ0VSUlMgIEUxMDAwX0NSQ0VSUlMKKyNkZWZpbmUgRTEwMDBfODI1NDJfQUxHTkVSUkMgRTEwMDBfQUxHTkVSUkMKKyNkZWZpbmUgRTEwMDBfODI1NDJfU1lNRVJSUyAgRTEwMDBfU1lNRVJSUworI2RlZmluZSBFMTAwMF84MjU0Ml9SWEVSUkMgICBFMTAwMF9SWEVSUkMKKyNkZWZpbmUgRTEwMDBfODI1NDJfTVBDICAgICAgRTEwMDBfTVBDCisjZGVmaW5lIEUxMDAwXzgyNTQyX1NDQyAgICAgIEUxMDAwX1NDQworI2RlZmluZSBFMTAwMF84MjU0Ml9FQ09MICAgICBFMTAwMF9FQ09MCisjZGVmaW5lIEUxMDAwXzgyNTQyX01DQyAgICAgIEUxMDAwX01DQworI2RlZmluZSBFMTAwMF84MjU0Ml9MQVRFQ09MICBFMTAwMF9MQVRFQ09MCisjZGVmaW5lIEUxMDAwXzgyNTQyX0NPTEMgICAgIEUxMDAwX0NPTEMKKyNkZWZpbmUgRTEwMDBfODI1NDJfREMgICAgICAgRTEwMDBfREMKKyNkZWZpbmUgRTEwMDBfODI1NDJfVE5DUlMgICAgRTEwMDBfVE5DUlMKKyNkZWZpbmUgRTEwMDBfODI1NDJfU0VDICAgICAgRTEwMDBfU0VDCisjZGVmaW5lIEUxMDAwXzgyNTQyX0NFWFRFUlIgIEUxMDAwX0NFWFRFUlIKKyNkZWZpbmUgRTEwMDBfODI1NDJfUkxFQyAgICAgRTEwMDBfUkxFQworI2RlZmluZSBFMTAwMF84MjU0Ml9YT05SWEMgICBFMTAwMF9YT05SWEMKKyNkZWZpbmUgRTEwMDBfODI1NDJfWE9OVFhDICAgRTEwMDBfWE9OVFhDCisjZGVmaW5lIEUxMDAwXzgyNTQyX1hPRkZSWEMgIEUxMDAwX1hPRkZSWEMKKyNkZWZpbmUgRTEwMDBfODI1NDJfWE9GRlRYQyAgRTEwMDBfWE9GRlRYQworI2RlZmluZSBFMTAwMF84MjU0Ml9GQ1JVQyAgICBFMTAwMF9GQ1JVQworI2RlZmluZSBFMTAwMF84MjU0Ml9QUkM2NCAgICBFMTAwMF9QUkM2NAorI2RlZmluZSBFMTAwMF84MjU0Ml9QUkMxMjcgICBFMTAwMF9QUkMxMjcKKyNkZWZpbmUgRTEwMDBfODI1NDJfUFJDMjU1ICAgRTEwMDBfUFJDMjU1CisjZGVmaW5lIEUxMDAwXzgyNTQyX1BSQzUxMSAgIEUxMDAwX1BSQzUxMQorI2RlZmluZSBFMTAwMF84MjU0Ml9QUkMxMDIzICBFMTAwMF9QUkMxMDIzCisjZGVmaW5lIEUxMDAwXzgyNTQyX1BSQzE1MjIgIEUxMDAwX1BSQzE1MjIKKyNkZWZpbmUgRTEwMDBfODI1NDJfR1BSQyAgICAgRTEwMDBfR1BSQworI2RlZmluZSBFMTAwMF84MjU0Ml9CUFJDICAgICBFMTAwMF9CUFJDCisjZGVmaW5lIEUxMDAwXzgyNTQyX01QUkMgICAgIEUxMDAwX01QUkMKKyNkZWZpbmUgRTEwMDBfODI1NDJfR1BUQyAgICAgRTEwMDBfR1BUQworI2RlZmluZSBFMTAwMF84MjU0Ml9HT1JDTCAgICBFMTAwMF9HT1JDTAorI2RlZmluZSBFMTAwMF84MjU0Ml9HT1JDSCAgICBFMTAwMF9HT1JDSAorI2RlZmluZSBFMTAwMF84MjU0Ml9HT1RDTCAgICBFMTAwMF9HT1RDTAorI2RlZmluZSBFMTAwMF84MjU0Ml9HT1RDSCAgICBFMTAwMF9HT1RDSAorI2RlZmluZSBFMTAwMF84MjU0Ml9STkJDICAgICBFMTAwMF9STkJDCisjZGVmaW5lIEUxMDAwXzgyNTQyX1JVQyAgICAgIEUxMDAwX1JVQworI2RlZmluZSBFMTAwMF84MjU0Ml9SRkMgICAgICBFMTAwMF9SRkMKKyNkZWZpbmUgRTEwMDBfODI1NDJfUk9DICAgICAgRTEwMDBfUk9DCisjZGVmaW5lIEUxMDAwXzgyNTQyX1JKQyAgICAgIEUxMDAwX1JKQworI2RlZmluZSBFMTAwMF84MjU0Ml9NR1RQUkMgICBFMTAwMF9NR1RQUkMKKyNkZWZpbmUgRTEwMDBfODI1NDJfTUdUUERDICAgRTEwMDBfTUdUUERDCisjZGVmaW5lIEUxMDAwXzgyNTQyX01HVFBUQyAgIEUxMDAwX01HVFBUQworI2RlZmluZSBFMTAwMF84MjU0Ml9UT1JMICAgICBFMTAwMF9UT1JMCisjZGVmaW5lIEUxMDAwXzgyNTQyX1RPUkggICAgIEUxMDAwX1RPUkgKKyNkZWZpbmUgRTEwMDBfODI1NDJfVE9UTCAgICAgRTEwMDBfVE9UTAorI2RlZmluZSBFMTAwMF84MjU0Ml9UT1RIICAgICBFMTAwMF9UT1RICisjZGVmaW5lIEUxMDAwXzgyNTQyX1RQUiAgICAgIEUxMDAwX1RQUgorI2RlZmluZSBFMTAwMF84MjU0Ml9UUFQgICAgICBFMTAwMF9UUFQKKyNkZWZpbmUgRTEwMDBfODI1NDJfUFRDNjQgICAgRTEwMDBfUFRDNjQKKyNkZWZpbmUgRTEwMDBfODI1NDJfUFRDMTI3ICAgRTEwMDBfUFRDMTI3CisjZGVmaW5lIEUxMDAwXzgyNTQyX1BUQzI1NSAgIEUxMDAwX1BUQzI1NQorI2RlZmluZSBFMTAwMF84MjU0Ml9QVEM1MTEgICBFMTAwMF9QVEM1MTEKKyNkZWZpbmUgRTEwMDBfODI1NDJfUFRDMTAyMyAgRTEwMDBfUFRDMTAyMworI2RlZmluZSBFMTAwMF84MjU0Ml9QVEMxNTIyICBFMTAwMF9QVEMxNTIyCisjZGVmaW5lIEUxMDAwXzgyNTQyX01QVEMgICAgIEUxMDAwX01QVEMKKyNkZWZpbmUgRTEwMDBfODI1NDJfQlBUQyAgICAgRTEwMDBfQlBUQworI2RlZmluZSBFMTAwMF84MjU0Ml9UU0NUQyAgICBFMTAwMF9UU0NUQworI2RlZmluZSBFMTAwMF84MjU0Ml9UU0NURkMgICBFMTAwMF9UU0NURkMKKyNkZWZpbmUgRTEwMDBfODI1NDJfUlhDU1VNICAgRTEwMDBfUlhDU1VNCisjZGVmaW5lIEUxMDAwXzgyNTQyX1dVQyAgICAgIEUxMDAwX1dVQworI2RlZmluZSBFMTAwMF84MjU0Ml9XVUZDICAgICBFMTAwMF9XVUZDCisjZGVmaW5lIEUxMDAwXzgyNTQyX1dVUyAgICAgIEUxMDAwX1dVUworI2RlZmluZSBFMTAwMF84MjU0Ml9NQU5DICAgICBFMTAwMF9NQU5DCisjZGVmaW5lIEUxMDAwXzgyNTQyX0lQQVYgICAgIEUxMDAwX0lQQVYKKyNkZWZpbmUgRTEwMDBfODI1NDJfSVA0QVQgICAgRTEwMDBfSVA0QVQKKyNkZWZpbmUgRTEwMDBfODI1NDJfSVA2QVQgICAgRTEwMDBfSVA2QVQKKyNkZWZpbmUgRTEwMDBfODI1NDJfV1VQTCAgICAgRTEwMDBfV1VQTAorI2RlZmluZSBFMTAwMF84MjU0Ml9XVVBNICAgICBFMTAwMF9XVVBNCisjZGVmaW5lIEUxMDAwXzgyNTQyX0ZGTFQgICAgIEUxMDAwX0ZGTFQKKyNkZWZpbmUgRTEwMDBfODI1NDJfVERGSCAgICAgMHgwODAxMAorI2RlZmluZSBFMTAwMF84MjU0Ml9UREZUICAgICAweDA4MDE4CisjZGVmaW5lIEUxMDAwXzgyNTQyX0ZGTVQgICAgIEUxMDAwX0ZGTVQKKyNkZWZpbmUgRTEwMDBfODI1NDJfRkZWVCAgICAgRTEwMDBfRkZWVAorCisvKiBTdGF0aXN0aWNzIGNvdW50ZXJzIGNvbGxlY3RlZCBieSB0aGUgTUFDICovCitzdHJ1Y3QgZTEwMDBfaHdfc3RhdHMgeworICAgIHVpbnQ2NF90IGNyY2VycnM7CisgICAgdWludDY0X3QgYWxnbmVycmM7CisgICAgdWludDY0X3Qgc3ltZXJyczsKKyAgICB1aW50NjRfdCByeGVycmM7CisgICAgdWludDY0X3QgbXBjOworICAgIHVpbnQ2NF90IHNjYzsKKyAgICB1aW50NjRfdCBlY29sOworICAgIHVpbnQ2NF90IG1jYzsKKyAgICB1aW50NjRfdCBsYXRlY29sOworICAgIHVpbnQ2NF90IGNvbGM7CisgICAgdWludDY0X3QgZGM7CisgICAgdWludDY0X3QgdG5jcnM7CisgICAgdWludDY0X3Qgc2VjOworICAgIHVpbnQ2NF90IGNleHRlcnI7CisgICAgdWludDY0X3QgcmxlYzsKKyAgICB1aW50NjRfdCB4b25yeGM7CisgICAgdWludDY0X3QgeG9udHhjOworICAgIHVpbnQ2NF90IHhvZmZyeGM7CisgICAgdWludDY0X3QgeG9mZnR4YzsKKyAgICB1aW50NjRfdCBmY3J1YzsKKyAgICB1aW50NjRfdCBwcmM2NDsKKyAgICB1aW50NjRfdCBwcmMxMjc7CisgICAgdWludDY0X3QgcHJjMjU1OworICAgIHVpbnQ2NF90IHByYzUxMTsKKyAgICB1aW50NjRfdCBwcmMxMDIzOworICAgIHVpbnQ2NF90IHByYzE1MjI7CisgICAgdWludDY0X3QgZ3ByYzsKKyAgICB1aW50NjRfdCBicHJjOworICAgIHVpbnQ2NF90IG1wcmM7CisgICAgdWludDY0X3QgZ3B0YzsKKyAgICB1aW50NjRfdCBnb3JjbDsKKyAgICB1aW50NjRfdCBnb3JjaDsKKyAgICB1aW50NjRfdCBnb3RjbDsKKyAgICB1aW50NjRfdCBnb3RjaDsKKyAgICB1aW50NjRfdCBybmJjOworICAgIHVpbnQ2NF90IHJ1YzsKKyAgICB1aW50NjRfdCByZmM7CisgICAgdWludDY0X3Qgcm9jOworICAgIHVpbnQ2NF90IHJqYzsKKyAgICB1aW50NjRfdCBtZ3ByYzsKKyAgICB1aW50NjRfdCBtZ3BkYzsKKyAgICB1aW50NjRfdCBtZ3B0YzsKKyAgICB1aW50NjRfdCB0b3JsOworICAgIHVpbnQ2NF90IHRvcmg7CisgICAgdWludDY0X3QgdG90bDsKKyAgICB1aW50NjRfdCB0b3RoOworICAgIHVpbnQ2NF90IHRwcjsKKyAgICB1aW50NjRfdCB0cHQ7CisgICAgdWludDY0X3QgcHRjNjQ7CisgICAgdWludDY0X3QgcHRjMTI3OworICAgIHVpbnQ2NF90IHB0YzI1NTsKKyAgICB1aW50NjRfdCBwdGM1MTE7CisgICAgdWludDY0X3QgcHRjMTAyMzsKKyAgICB1aW50NjRfdCBwdGMxNTIyOworICAgIHVpbnQ2NF90IG1wdGM7CisgICAgdWludDY0X3QgYnB0YzsKKyAgICB1aW50NjRfdCB0c2N0YzsKKyAgICB1aW50NjRfdCB0c2N0ZmM7Cit9OworCisvKiBTdHJ1Y3R1cmUgY29udGFpbmluZyB2YXJpYWJsZXMgdXNlZCBieSB0aGUgc2hhcmVkIGNvZGUgKGUxMDAwX2h3LmMpICovCitzdHJ1Y3QgZTEwMDBfaHcgeworCXN0cnVjdCBwY2lfZGV2aWNlICpwZGV2OworCXVpbnQ4X3QgKmh3X2FkZHI7CisJZTEwMDBfbWFjX3R5cGUgICBtYWNfdHlwZTsKKwllMTAwMF9waHlfdHlwZSBwaHlfdHlwZTsKKyNpZiAwCisJdWludDMyX3QgcGh5X2luaXRfc2NyaXB0OworI2VuZGlmCisJZTEwMDBfbWVkaWFfdHlwZSBtZWRpYV90eXBlOworCWUxMDAwX2ZjX3R5cGUgICAgZmM7CisjaWYgMAorCWUxMDAwX2J1c19zcGVlZCBidXNfc3BlZWQ7CisJZTEwMDBfYnVzX3dpZHRoIGJ1c193aWR0aDsKKwllMTAwMF9idXNfdHlwZSAgYnVzX3R5cGU7CisjZW5kaWYKKwlzdHJ1Y3QgZTEwMDBfZWVwcm9tX2luZm8gZWVwcm9tOworI2lmIDAKKwllMTAwMF9tc190eXBlIG1hc3Rlcl9zbGF2ZTsKKwllMTAwMF9tc190eXBlIG9yaWdpbmFsX21hc3Rlcl9zbGF2ZTsKKwllMTAwMF9mZmVfY29uZmlnIGZmZV9jb25maWdfc3RhdGU7CisjZW5kaWYKKwl1aW50MzJfdCBpb19iYXNlOworCXVpbnQzMl90IHBoeV9pZDsKKyNpZmRlZiBMSU5VWF9EUklWRVIKKwl1aW50MzJfdCBwaHlfcmV2aXNpb247CisjZW5kaWYKKwl1aW50MzJfdCBwaHlfYWRkcjsKKyNpZiAwCisJdWludDMyX3Qgb3JpZ2luYWxfZmM7CisjZW5kaWYKKwl1aW50MzJfdCB0eGN3OworCXVpbnQzMl90IGF1dG9uZWdfZmFpbGVkOworI2lmIDAKKwl1aW50MzJfdCBtYXhfZnJhbWVfc2l6ZTsKKwl1aW50MzJfdCBtaW5fZnJhbWVfc2l6ZTsKKwl1aW50MzJfdCBtY19maWx0ZXJfdHlwZTsKKwl1aW50MzJfdCBudW1fbWNfYWRkcnM7CisJdWludDMyX3QgY29sbGlzaW9uX2RlbHRhOworCXVpbnQzMl90IHR4X3BhY2tldF9kZWx0YTsKKwl1aW50MzJfdCBsZWRjdGxfZGVmYXVsdDsKKwl1aW50MzJfdCBsZWRjdGxfbW9kZTE7CisJdWludDMyX3QgbGVkY3RsX21vZGUyOworCXVpbnQxNl90IHBoeV9zcGRfZGVmYXVsdDsKKyNlbmRpZgorCXVpbnQxNl90IGF1dG9uZWdfYWR2ZXJ0aXNlZDsKKwl1aW50MTZfdCBwY2lfY21kX3dvcmQ7CisjaWYgMAorCXVpbnQxNl90IGZjX2hpZ2hfd2F0ZXI7CisJdWludDE2X3QgZmNfbG93X3dhdGVyOworCXVpbnQxNl90IGZjX3BhdXNlX3RpbWU7CisJdWludDE2X3QgY3VycmVudF9pZnNfdmFsOworCXVpbnQxNl90IGlmc19taW5fdmFsOworCXVpbnQxNl90IGlmc19tYXhfdmFsOworCXVpbnQxNl90IGlmc19zdGVwX3NpemU7CisJdWludDE2X3QgaWZzX3JhdGlvOworI2VuZGlmCisJdWludDE2X3QgZGV2aWNlX2lkOworCXVpbnQxNl90IHZlbmRvcl9pZDsKKyNpZiAwCisJdWludDE2X3Qgc3Vic3lzdGVtX2lkOworCXVpbnQxNl90IHN1YnN5c3RlbV92ZW5kb3JfaWQ7CisjZW5kaWYKKwl1aW50OF90IHJldmlzaW9uX2lkOworI2lmIDAKKwl1aW50OF90IGF1dG9uZWc7CisJdWludDhfdCBtZGl4OworCXVpbnQ4X3QgZm9yY2VkX3NwZWVkX2R1cGxleDsKKwl1aW50OF90IHdhaXRfYXV0b25lZ19jb21wbGV0ZTsKKwl1aW50OF90IGRtYV9mYWlybmVzczsKKyNlbmRpZgorCXVpbnQ4X3QgbWFjX2FkZHJbTk9ERV9BRERSRVNTX1NJWkVdOworI2lmIDAKKwl1aW50OF90IHBlcm1fbWFjX2FkZHJbTk9ERV9BRERSRVNTX1NJWkVdOworCWJvb2xlYW5fdCBkaXNhYmxlX3BvbGFyaXR5X2NvcnJlY3Rpb247CisJYm9vbGVhbl90IHNwZWVkX2Rvd25ncmFkZWQ7CisJZTEwMDBfZHNwX2NvbmZpZyBkc3BfY29uZmlnX3N0YXRlOworCWJvb2xlYW5fdCBnZXRfbGlua19zdGF0dXM7CisJYm9vbGVhbl90IHNlcmRlc19saW5rX2Rvd247CisjZW5kaWYKKwlib29sZWFuX3QgdGJpX2NvbXBhdGliaWxpdHlfZW47CisJYm9vbGVhbl90IHRiaV9jb21wYXRpYmlsaXR5X29uOworI2lmIDAKKwlib29sZWFuX3QgcGh5X3Jlc2V0X2Rpc2FibGU7CisJYm9vbGVhbl90IGZjX3NlbmRfeG9uOworCWJvb2xlYW5fdCBmY19zdHJpY3RfaWVlZTsKKwlib29sZWFuX3QgcmVwb3J0X3R4X2Vhcmx5OworCWJvb2xlYW5fdCBhZGFwdGl2ZV9pZnM7CisJYm9vbGVhbl90IGlmc19wYXJhbXNfZm9yY2VkOworCWJvb2xlYW5fdCBpbl9pZnNfbW9kZTsKKyNlbmRpZgorfTsKKworCisjZGVmaW5lIEUxMDAwX0VFUFJPTV9TV0RQSU4wICAgMHgwMDAxICAgLyogU1dEUElOIDAgRUVQUk9NIFZhbHVlICovCisjZGVmaW5lIEUxMDAwX0VFUFJPTV9MRURfTE9HSUMgMHgwMDIwICAgLyogTGVkIExvZ2ljIFdvcmQgKi8KKworLyogUmVnaXN0ZXIgQml0IE1hc2tzICovCisvKiBEZXZpY2UgQ29udHJvbCAqLworI2RlZmluZSBFMTAwMF9DVFJMX0ZEICAgICAgIDB4MDAwMDAwMDEgIC8qIEZ1bGwgZHVwbGV4LjA9aGFsZjsgMT1mdWxsICovCisjZGVmaW5lIEUxMDAwX0NUUkxfQkVNICAgICAgMHgwMDAwMDAwMiAgLyogRW5kaWFuIE1vZGUuMD1saXR0bGUsMT1iaWcgKi8KKyNkZWZpbmUgRTEwMDBfQ1RSTF9QUklPUiAgICAweDAwMDAwMDA0ICAvKiBQcmlvcml0eSBvbiBQQ0kuIDA9cngsMT1mYWlyICovCisjZGVmaW5lIEUxMDAwX0NUUkxfTFJTVCAgICAgMHgwMDAwMDAwOCAgLyogTGluayByZXNldC4gMD1ub3JtYWwsMT1yZXNldCAqLworI2RlZmluZSBFMTAwMF9DVFJMX1RNRSAgICAgIDB4MDAwMDAwMTAgIC8qIFRlc3QgbW9kZS4gMD1ub3JtYWwsMT10ZXN0ICovCisjZGVmaW5lIEUxMDAwX0NUUkxfU0xFICAgICAgMHgwMDAwMDAyMCAgLyogU2VyaWFsIExpbmsgb24gMD1kaXMsMT1lbiAqLworI2RlZmluZSBFMTAwMF9DVFJMX0FTREUgICAgIDB4MDAwMDAwMjAgIC8qIEF1dG8tc3BlZWQgZGV0ZWN0IGVuYWJsZSAqLworI2RlZmluZSBFMTAwMF9DVFJMX1NMVSAgICAgIDB4MDAwMDAwNDAgIC8qIFNldCBsaW5rIHVwIChGb3JjZSBMaW5rKSAqLworI2RlZmluZSBFMTAwMF9DVFJMX0lMT1MgICAgIDB4MDAwMDAwODAgIC8qIEludmVydCBMb3NzLU9mIFNpZ25hbCAqLworI2RlZmluZSBFMTAwMF9DVFJMX1NQRF9TRUwgIDB4MDAwMDAzMDAgIC8qIFNwZWVkIFNlbGVjdCBNYXNrICovCisjZGVmaW5lIEUxMDAwX0NUUkxfU1BEXzEwICAgMHgwMDAwMDAwMCAgLyogRm9yY2UgMTBNYiAqLworI2RlZmluZSBFMTAwMF9DVFJMX1NQRF8xMDAgIDB4MDAwMDAxMDAgIC8qIEZvcmNlIDEwME1iICovCisjZGVmaW5lIEUxMDAwX0NUUkxfU1BEXzEwMDAgMHgwMDAwMDIwMCAgLyogRm9yY2UgMUdiICovCisjZGVmaW5lIEUxMDAwX0NUUkxfQkVNMzIgICAgMHgwMDAwMDQwMCAgLyogQmlnIEVuZGlhbiAzMiBtb2RlICovCisjZGVmaW5lIEUxMDAwX0NUUkxfRlJDU1BEICAgMHgwMDAwMDgwMCAgLyogRm9yY2UgU3BlZWQgKi8KKyNkZWZpbmUgRTEwMDBfQ1RSTF9GUkNEUFggICAweDAwMDAxMDAwICAvKiBGb3JjZSBEdXBsZXggKi8KKyNkZWZpbmUgRTEwMDBfQ1RSTF9TV0RQSU4wICAweDAwMDQwMDAwICAvKiBTV0RQSU4gMCB2YWx1ZSAqLworI2RlZmluZSBFMTAwMF9DVFJMX1NXRFBJTjEgIDB4MDAwODAwMDAgIC8qIFNXRFBJTiAxIHZhbHVlICovCisjZGVmaW5lIEUxMDAwX0NUUkxfU1dEUElOMiAgMHgwMDEwMDAwMCAgLyogU1dEUElOIDIgdmFsdWUgKi8KKyNkZWZpbmUgRTEwMDBfQ1RSTF9TV0RQSU4zICAweDAwMjAwMDAwICAvKiBTV0RQSU4gMyB2YWx1ZSAqLworI2RlZmluZSBFMTAwMF9DVFJMX1NXRFBJTzAgIDB4MDA0MDAwMDAgIC8qIFNXRFBJTiAwIElucHV0IG9yIG91dHB1dCAqLworI2RlZmluZSBFMTAwMF9DVFJMX1NXRFBJTzEgIDB4MDA4MDAwMDAgIC8qIFNXRFBJTiAxIGlucHV0IG9yIG91dHB1dCAqLworI2RlZmluZSBFMTAwMF9DVFJMX1NXRFBJTzIgIDB4MDEwMDAwMDAgIC8qIFNXRFBJTiAyIGlucHV0IG9yIG91dHB1dCAqLworI2RlZmluZSBFMTAwMF9DVFJMX1NXRFBJTzMgIDB4MDIwMDAwMDAgIC8qIFNXRFBJTiAzIGlucHV0IG9yIG91dHB1dCAqLworI2RlZmluZSBFMTAwMF9DVFJMX1JTVCAgICAgIDB4MDQwMDAwMDAgIC8qIEdsb2JhbCByZXNldCAqLworI2RlZmluZSBFMTAwMF9DVFJMX1JGQ0UgICAgIDB4MDgwMDAwMDAgIC8qIFJlY2VpdmUgRmxvdyBDb250cm9sIGVuYWJsZSAqLworI2RlZmluZSBFMTAwMF9DVFJMX1RGQ0UgICAgIDB4MTAwMDAwMDAgIC8qIFRyYW5zbWl0IGZsb3cgY29udHJvbCBlbmFibGUgKi8KKyNkZWZpbmUgRTEwMDBfQ1RSTF9SVEUgICAgICAweDIwMDAwMDAwICAvKiBSb3V0aW5nIHRhZyBlbmFibGUgKi8KKyNkZWZpbmUgRTEwMDBfQ1RSTF9WTUUgICAgICAweDQwMDAwMDAwICAvKiBJRUVFIFZMQU4gbW9kZSBlbmFibGUgKi8KKyNkZWZpbmUgRTEwMDBfQ1RSTF9QSFlfUlNUICAweDgwMDAwMDAwICAvKiBQSFkgUmVzZXQgKi8KKworLyogRGV2aWNlIFN0YXR1cyAqLworI2RlZmluZSBFMTAwMF9TVEFUVVNfRkQgICAgICAgICAweDAwMDAwMDAxICAgICAgLyogRnVsbCBkdXBsZXguMD1oYWxmLDE9ZnVsbCAqLworI2RlZmluZSBFMTAwMF9TVEFUVVNfTFUgICAgICAgICAweDAwMDAwMDAyICAgICAgLyogTGluayB1cC4wPW5vLDE9bGluayAqLworI2RlZmluZSBFMTAwMF9TVEFUVVNfRlVOQ19NQVNLICAweDAwMDAwMDBDICAgICAgLyogUENJIEZ1bmN0aW9uIE1hc2sgKi8KKyNkZWZpbmUgRTEwMDBfU1RBVFVTX0ZVTkNfMCAgICAgMHgwMDAwMDAwMCAgICAgIC8qIEZ1bmN0aW9uIDAgKi8KKyNkZWZpbmUgRTEwMDBfU1RBVFVTX0ZVTkNfMSAgICAgMHgwMDAwMDAwNCAgICAgIC8qIEZ1bmN0aW9uIDEgKi8KKyNkZWZpbmUgRTEwMDBfU1RBVFVTX1RYT0ZGICAgICAgMHgwMDAwMDAxMCAgICAgIC8qIHRyYW5zbWlzc2lvbiBwYXVzZWQgKi8KKyNkZWZpbmUgRTEwMDBfU1RBVFVTX1RCSU1PREUgICAgMHgwMDAwMDAyMCAgICAgIC8qIFRCSSBtb2RlICovCisjZGVmaW5lIEUxMDAwX1NUQVRVU19TUEVFRF9NQVNLIDB4MDAwMDAwQzAKKyNkZWZpbmUgRTEwMDBfU1RBVFVTX1NQRUVEXzEwICAgMHgwMDAwMDAwMCAgICAgIC8qIFNwZWVkIDEwTWIvcyAqLworI2RlZmluZSBFMTAwMF9TVEFUVVNfU1BFRURfMTAwICAweDAwMDAwMDQwICAgICAgLyogU3BlZWQgMTAwTWIvcyAqLworI2RlZmluZSBFMTAwMF9TVEFUVVNfU1BFRURfMTAwMCAweDAwMDAwMDgwICAgICAgLyogU3BlZWQgMTAwME1iL3MgKi8KKyNkZWZpbmUgRTEwMDBfU1RBVFVTX0FTRFYgICAgICAgMHgwMDAwMDMwMCAgICAgIC8qIEF1dG8gc3BlZWQgZGV0ZWN0IHZhbHVlICovCisjZGVmaW5lIEUxMDAwX1NUQVRVU19NVFhDS09LICAgIDB4MDAwMDA0MDAgICAgICAvKiBNVFggY2xvY2sgcnVubmluZyBPSyAqLworI2RlZmluZSBFMTAwMF9TVEFUVVNfUENJNjYgICAgICAweDAwMDAwODAwICAgICAgLyogSW4gNjZNaHogc2xvdCAqLworI2RlZmluZSBFMTAwMF9TVEFUVVNfQlVTNjQgICAgICAweDAwMDAxMDAwICAgICAgLyogSW4gNjQgYml0IHNsb3QgKi8KKyNkZWZpbmUgRTEwMDBfU1RBVFVTX1BDSVhfTU9ERSAgMHgwMDAwMjAwMCAgICAgIC8qIFBDSS1YIG1vZGUgKi8KKyNkZWZpbmUgRTEwMDBfU1RBVFVTX1BDSVhfU1BFRUQgMHgwMDAwQzAwMCAgICAgIC8qIFBDSS1YIGJ1cyBzcGVlZCAqLworCisvKiBDb25zdGFudHMgdXNlZCB0byBpbnRyZXByZXQgdGhlIG1hc2tlZCBQQ0ktWCBidXMgc3BlZWQuICovCisjZGVmaW5lIEUxMDAwX1NUQVRVU19QQ0lYX1NQRUVEXzY2ICAweDAwMDAwMDAwIC8qIFBDSS1YIGJ1cyBzcGVlZCAgNTAtNjYgTUh6ICovCisjZGVmaW5lIEUxMDAwX1NUQVRVU19QQ0lYX1NQRUVEXzEwMCAweDAwMDA0MDAwIC8qIFBDSS1YIGJ1cyBzcGVlZCAgNjYtMTAwIE1IeiAqLworI2RlZmluZSBFMTAwMF9TVEFUVVNfUENJWF9TUEVFRF8xMzMgMHgwMDAwODAwMCAvKiBQQ0ktWCBidXMgc3BlZWQgMTAwLTEzMyBNSHogKi8KKworLyogRUVQUk9NL0ZsYXNoIENvbnRyb2wgKi8KKyNkZWZpbmUgRTEwMDBfRUVDRF9TSyAgICAgICAgMHgwMDAwMDAwMSAvKiBFRVBST00gQ2xvY2sgKi8KKyNkZWZpbmUgRTEwMDBfRUVDRF9DUyAgICAgICAgMHgwMDAwMDAwMiAvKiBFRVBST00gQ2hpcCBTZWxlY3QgKi8KKyNkZWZpbmUgRTEwMDBfRUVDRF9ESSAgICAgICAgMHgwMDAwMDAwNCAvKiBFRVBST00gRGF0YSBJbiAqLworI2RlZmluZSBFMTAwMF9FRUNEX0RPICAgICAgICAweDAwMDAwMDA4IC8qIEVFUFJPTSBEYXRhIE91dCAqLworI2RlZmluZSBFMTAwMF9FRUNEX0ZXRV9NQVNLICAweDAwMDAwMDMwIAorI2RlZmluZSBFMTAwMF9FRUNEX0ZXRV9ESVMgICAweDAwMDAwMDEwIC8qIERpc2FibGUgRkxBU0ggd3JpdGVzICovCisjZGVmaW5lIEUxMDAwX0VFQ0RfRldFX0VOICAgIDB4MDAwMDAwMjAgLyogRW5hYmxlIEZMQVNIIHdyaXRlcyAqLworI2RlZmluZSBFMTAwMF9FRUNEX0ZXRV9TSElGVCA0CisjZGVmaW5lIEUxMDAwX0VFQ0RfUkVRICAgICAgIDB4MDAwMDAwNDAgLyogRUVQUk9NIEFjY2VzcyBSZXF1ZXN0ICovCisjZGVmaW5lIEUxMDAwX0VFQ0RfR05UICAgICAgIDB4MDAwMDAwODAgLyogRUVQUk9NIEFjY2VzcyBHcmFudCAqLworI2RlZmluZSBFMTAwMF9FRUNEX1BSRVMgICAgICAweDAwMDAwMTAwIC8qIEVFUFJPTSBQcmVzZW50ICovCisjZGVmaW5lIEUxMDAwX0VFQ0RfU0laRSAgICAgIDB4MDAwMDAyMDAgLyogRUVQUk9NIFNpemUgKDA9NjQgd29yZCAxPTI1NiB3b3JkKSAqLworI2RlZmluZSBFMTAwMF9FRUNEX0FERFJfQklUUyAweDAwMDAwNDAwIC8qIEVFUFJPTSBBZGRyZXNzaW5nIGJpdHMgYmFzZWQgb24gdHlwZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICgwLXNtYWxsLCAxLWxhcmdlKSAqLworI2RlZmluZSBFMTAwMF9FRUNEX1RZUEUgICAgICAweDAwMDAyMDAwIC8qIEVFUFJPTSBUeXBlICgxLVNQSSwgMC1NaWNyb3dpcmUpICovCisjaWZuZGVmIEUxMDAwX0VFUFJPTV9HUkFOVF9BVFRFTVBUUworI2RlZmluZSBFMTAwMF9FRVBST01fR1JBTlRfQVRURU1QVFMgMTAwMCAvKiBFRVBST00gIyBhdHRlbXB0cyB0byBnYWluIGdyYW50ICovCisjZW5kaWYKKworLyogRUVQUk9NIFJlYWQgKi8KKyNkZWZpbmUgRTEwMDBfRUVSRF9TVEFSVCAgICAgIDB4MDAwMDAwMDEgLyogU3RhcnQgUmVhZCAqLworI2RlZmluZSBFMTAwMF9FRVJEX0RPTkUgICAgICAgMHgwMDAwMDAxMCAvKiBSZWFkIERvbmUgKi8KKyNkZWZpbmUgRTEwMDBfRUVSRF9BRERSX1NISUZUIDgKKyNkZWZpbmUgRTEwMDBfRUVSRF9BRERSX01BU0sgIDB4MDAwMEZGMDAgLyogUmVhZCBBZGRyZXNzICovCisjZGVmaW5lIEUxMDAwX0VFUkRfREFUQV9TSElGVCAxNgorI2RlZmluZSBFMTAwMF9FRVJEX0RBVEFfTUFTSyAgMHhGRkZGMDAwMCAvKiBSZWFkIERhdGEgKi8KKworLyogU1BJIEVFUFJPTSBTdGF0dXMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgRUVQUk9NX1NUQVRVU19SRFlfU1BJICAweDAxCisjZGVmaW5lIEVFUFJPTV9TVEFUVVNfV0VOX1NQSSAgMHgwMgorI2RlZmluZSBFRVBST01fU1RBVFVTX0JQMF9TUEkgIDB4MDQKKyNkZWZpbmUgRUVQUk9NX1NUQVRVU19CUDFfU1BJICAweDA4CisjZGVmaW5lIEVFUFJPTV9TVEFUVVNfV1BFTl9TUEkgMHg4MAorCisvKiBFeHRlbmRlZCBEZXZpY2UgQ29udHJvbCAqLworI2RlZmluZSBFMTAwMF9DVFJMX0VYVF9HUEkwX0VOICAgMHgwMDAwMDAwMSAvKiBNYXBzIFNEUDQgdG8gR1BJMCAqLyAKKyNkZWZpbmUgRTEwMDBfQ1RSTF9FWFRfR1BJMV9FTiAgIDB4MDAwMDAwMDIgLyogTWFwcyBTRFA1IHRvIEdQSTEgKi8KKyNkZWZpbmUgRTEwMDBfQ1RSTF9FWFRfUEhZSU5UX0VOIEUxMDAwX0NUUkxfRVhUX0dQSTFfRU4KKyNkZWZpbmUgRTEwMDBfQ1RSTF9FWFRfR1BJMl9FTiAgIDB4MDAwMDAwMDQgLyogTWFwcyBTRFA2IHRvIEdQSTIgKi8KKyNkZWZpbmUgRTEwMDBfQ1RSTF9FWFRfR1BJM19FTiAgIDB4MDAwMDAwMDggLyogTWFwcyBTRFA3IHRvIEdQSTMgKi8KKyNkZWZpbmUgRTEwMDBfQ1RSTF9FWFRfU0RQNF9EQVRBIDB4MDAwMDAwMTAgLyogVmFsdWUgb2YgU1cgRGVmaW5lYWJsZSBQaW4gNCAqLworI2RlZmluZSBFMTAwMF9DVFJMX0VYVF9TRFA1X0RBVEEgMHgwMDAwMDAyMCAvKiBWYWx1ZSBvZiBTVyBEZWZpbmVhYmxlIFBpbiA1ICovCisjZGVmaW5lIEUxMDAwX0NUUkxfRVhUX1BIWV9JTlQgICBFMTAwMF9DVFJMX0VYVF9TRFA1X0RBVEEKKyNkZWZpbmUgRTEwMDBfQ1RSTF9FWFRfU0RQNl9EQVRBIDB4MDAwMDAwNDAgLyogVmFsdWUgb2YgU1cgRGVmaW5lYWJsZSBQaW4gNiAqLworI2RlZmluZSBFMTAwMF9DVFJMX0VYVF9TRFA3X0RBVEEgMHgwMDAwMDA4MCAvKiBWYWx1ZSBvZiBTVyBEZWZpbmVhYmxlIFBpbiA3ICovCisjZGVmaW5lIEUxMDAwX0NUUkxfRVhUX1NEUDRfRElSICAweDAwMDAwMTAwIC8qIERpcmVjdGlvbiBvZiBTRFA0IDA9aW4gMT1vdXQgKi8KKyNkZWZpbmUgRTEwMDBfQ1RSTF9FWFRfU0RQNV9ESVIgIDB4MDAwMDAyMDAgLyogRGlyZWN0aW9uIG9mIFNEUDUgMD1pbiAxPW91dCAqLworI2RlZmluZSBFMTAwMF9DVFJMX0VYVF9TRFA2X0RJUiAgMHgwMDAwMDQwMCAvKiBEaXJlY3Rpb24gb2YgU0RQNiAwPWluIDE9b3V0ICovCisjZGVmaW5lIEUxMDAwX0NUUkxfRVhUX1NEUDdfRElSICAweDAwMDAwODAwIC8qIERpcmVjdGlvbiBvZiBTRFA3IDA9aW4gMT1vdXQgKi8KKyNkZWZpbmUgRTEwMDBfQ1RSTF9FWFRfQVNEQ0hLICAgIDB4MDAwMDEwMDAgLyogSW5pdGlhdGUgYW4gQVNEIHNlcXVlbmNlICovCisjZGVmaW5lIEUxMDAwX0NUUkxfRVhUX0VFX1JTVCAgICAweDAwMDAyMDAwIC8qIFJlaW5pdGlhbGl6ZSBmcm9tIEVFUFJPTSAqLworI2RlZmluZSBFMTAwMF9DVFJMX0VYVF9JUFMgICAgICAgMHgwMDAwNDAwMCAvKiBJbnZlcnQgUG93ZXIgU3RhdGUgKi8KKyNkZWZpbmUgRTEwMDBfQ1RSTF9FWFRfU1BEX0JZUFMgIDB4MDAwMDgwMDAgLyogU3BlZWQgU2VsZWN0IEJ5cGFzcyAqLworI2RlZmluZSBFMTAwMF9DVFJMX0VYVF9MSU5LX01PREVfTUFTSyAweDAwQzAwMDAwCisjZGVmaW5lIEUxMDAwX0NUUkxfRVhUX0xJTktfTU9ERV9HTUlJIDB4MDAwMDAwMDAKKyNkZWZpbmUgRTEwMDBfQ1RSTF9FWFRfTElOS19NT0RFX1RCSSAgMHgwMEMwMDAwMAorI2RlZmluZSBFMTAwMF9DVFJMX0VYVF9XUl9XTUFSS19NQVNLICAweDAzMDAwMDAwCisjZGVmaW5lIEUxMDAwX0NUUkxfRVhUX1dSX1dNQVJLXzI1NiAgIDB4MDAwMDAwMDAKKyNkZWZpbmUgRTEwMDBfQ1RSTF9FWFRfV1JfV01BUktfMzIwICAgMHgwMTAwMDAwMAorI2RlZmluZSBFMTAwMF9DVFJMX0VYVF9XUl9XTUFSS18zODQgICAweDAyMDAwMDAwCisjZGVmaW5lIEUxMDAwX0NUUkxfRVhUX1dSX1dNQVJLXzQ0OCAgIDB4MDMwMDAwMDAKKworLyogTURJIENvbnRyb2wgKi8KKyNkZWZpbmUgRTEwMDBfTURJQ19EQVRBX01BU0sgMHgwMDAwRkZGRgorI2RlZmluZSBFMTAwMF9NRElDX1JFR19NQVNLICAweDAwMUYwMDAwCisjZGVmaW5lIEUxMDAwX01ESUNfUkVHX1NISUZUIDE2CisjZGVmaW5lIEUxMDAwX01ESUNfUEhZX01BU0sgIDB4MDNFMDAwMDAKKyNkZWZpbmUgRTEwMDBfTURJQ19QSFlfU0hJRlQgMjEKKyNkZWZpbmUgRTEwMDBfTURJQ19PUF9XUklURSAgMHgwNDAwMDAwMAorI2RlZmluZSBFMTAwMF9NRElDX09QX1JFQUQgICAweDA4MDAwMDAwCisjZGVmaW5lIEUxMDAwX01ESUNfUkVBRFkgICAgIDB4MTAwMDAwMDAKKyNkZWZpbmUgRTEwMDBfTURJQ19JTlRfRU4gICAgMHgyMDAwMDAwMAorI2RlZmluZSBFMTAwMF9NRElDX0VSUk9SICAgICAweDQwMDAwMDAwCisKKy8qIExFRCBDb250cm9sICovCisjZGVmaW5lIEUxMDAwX0xFRENUTF9MRUQwX01PREVfTUFTSyAgMHgwMDAwMDAwRgorI2RlZmluZSBFMTAwMF9MRURDVExfTEVEMF9NT0RFX1NISUZUIDAKKyNkZWZpbmUgRTEwMDBfTEVEQ1RMX0xFRDBfSVZSVCAgICAgICAweDAwMDAwMDQwCisjZGVmaW5lIEUxMDAwX0xFRENUTF9MRUQwX0JMSU5LICAgICAgMHgwMDAwMDA4MAorI2RlZmluZSBFMTAwMF9MRURDVExfTEVEMV9NT0RFX01BU0sgIDB4MDAwMDBGMDAKKyNkZWZpbmUgRTEwMDBfTEVEQ1RMX0xFRDFfTU9ERV9TSElGVCA4CisjZGVmaW5lIEUxMDAwX0xFRENUTF9MRUQxX0lWUlQgICAgICAgMHgwMDAwNDAwMAorI2RlZmluZSBFMTAwMF9MRURDVExfTEVEMV9CTElOSyAgICAgIDB4MDAwMDgwMDAKKyNkZWZpbmUgRTEwMDBfTEVEQ1RMX0xFRDJfTU9ERV9NQVNLICAweDAwMEYwMDAwCisjZGVmaW5lIEUxMDAwX0xFRENUTF9MRUQyX01PREVfU0hJRlQgMTYKKyNkZWZpbmUgRTEwMDBfTEVEQ1RMX0xFRDJfSVZSVCAgICAgICAweDAwNDAwMDAwCisjZGVmaW5lIEUxMDAwX0xFRENUTF9MRUQyX0JMSU5LICAgICAgMHgwMDgwMDAwMAorI2RlZmluZSBFMTAwMF9MRURDVExfTEVEM19NT0RFX01BU0sgIDB4MEYwMDAwMDAKKyNkZWZpbmUgRTEwMDBfTEVEQ1RMX0xFRDNfTU9ERV9TSElGVCAyNAorI2RlZmluZSBFMTAwMF9MRURDVExfTEVEM19JVlJUICAgICAgIDB4NDAwMDAwMDAKKyNkZWZpbmUgRTEwMDBfTEVEQ1RMX0xFRDNfQkxJTksgICAgICAweDgwMDAwMDAwCisKKyNkZWZpbmUgRTEwMDBfTEVEQ1RMX01PREVfTElOS18xMF8xMDAwICAweDAKKyNkZWZpbmUgRTEwMDBfTEVEQ1RMX01PREVfTElOS18xMDBfMTAwMCAweDEKKyNkZWZpbmUgRTEwMDBfTEVEQ1RMX01PREVfTElOS19VUCAgICAgICAweDIKKyNkZWZpbmUgRTEwMDBfTEVEQ1RMX01PREVfQUNUSVZJVFkgICAgICAweDMKKyNkZWZpbmUgRTEwMDBfTEVEQ1RMX01PREVfTElOS19BQ1RJVklUWSAweDQKKyNkZWZpbmUgRTEwMDBfTEVEQ1RMX01PREVfTElOS18xMCAgICAgICAweDUKKyNkZWZpbmUgRTEwMDBfTEVEQ1RMX01PREVfTElOS18xMDAgICAgICAweDYKKyNkZWZpbmUgRTEwMDBfTEVEQ1RMX01PREVfTElOS18xMDAwICAgICAweDcKKyNkZWZpbmUgRTEwMDBfTEVEQ1RMX01PREVfUENJWF9NT0RFICAgICAweDgKKyNkZWZpbmUgRTEwMDBfTEVEQ1RMX01PREVfRlVMTF9EVVBMRVggICAweDkKKyNkZWZpbmUgRTEwMDBfTEVEQ1RMX01PREVfQ09MTElTSU9OICAgICAweEEKKyNkZWZpbmUgRTEwMDBfTEVEQ1RMX01PREVfQlVTX1NQRUVEICAgICAweEIKKyNkZWZpbmUgRTEwMDBfTEVEQ1RMX01PREVfQlVTX1NJWkUgICAgICAweEMKKyNkZWZpbmUgRTEwMDBfTEVEQ1RMX01PREVfUEFVU0VEICAgICAgICAweEQKKyNkZWZpbmUgRTEwMDBfTEVEQ1RMX01PREVfTEVEX09OICAgICAgICAweEUKKyNkZWZpbmUgRTEwMDBfTEVEQ1RMX01PREVfTEVEX09GRiAgICAgICAweEYKKworLyogUmVjZWl2ZSBBZGRyZXNzICovCisjZGVmaW5lIEUxMDAwX1JBSF9BViAgMHg4MDAwMDAwMCAgICAgICAgLyogUmVjZWl2ZSBkZXNjcmlwdG9yIHZhbGlkICovCisKKy8qIEludGVycnVwdCBDYXVzZSBSZWFkICovCisjZGVmaW5lIEUxMDAwX0lDUl9UWERXICAgIDB4MDAwMDAwMDEgICAgLyogVHJhbnNtaXQgZGVzYyB3cml0dGVuIGJhY2sgKi8KKyNkZWZpbmUgRTEwMDBfSUNSX1RYUUUgICAgMHgwMDAwMDAwMiAgICAvKiBUcmFuc21pdCBRdWV1ZSBlbXB0eSAqLworI2RlZmluZSBFMTAwMF9JQ1JfTFNDICAgICAweDAwMDAwMDA0ICAgIC8qIExpbmsgU3RhdHVzIENoYW5nZSAqLworI2RlZmluZSBFMTAwMF9JQ1JfUlhTRVEgICAweDAwMDAwMDA4ICAgIC8qIHJ4IHNlcXVlbmNlIGVycm9yICovCisjZGVmaW5lIEUxMDAwX0lDUl9SWERNVDAgIDB4MDAwMDAwMTAgICAgLyogcnggZGVzYyBtaW4uIHRocmVzaG9sZCAoMCkgKi8KKyNkZWZpbmUgRTEwMDBfSUNSX1JYTyAgICAgMHgwMDAwMDA0MCAgICAvKiByeCBvdmVycnVuICovCisjZGVmaW5lIEUxMDAwX0lDUl9SWFQwICAgIDB4MDAwMDAwODAgICAgLyogcnggdGltZXIgaW50ciAocmluZyAwKSAqLworI2RlZmluZSBFMTAwMF9JQ1JfTURBQyAgICAweDAwMDAwMjAwICAgIC8qIE1ESU8gYWNjZXNzIGNvbXBsZXRlICovCisjZGVmaW5lIEUxMDAwX0lDUl9SWENGRyAgIDB4MDAwMDA0MDAgICAgLyogUlggL2MvIG9yZGVyZWQgc2V0ICovCisjZGVmaW5lIEUxMDAwX0lDUl9HUElfRU4wIDB4MDAwMDA4MDAgICAgLyogR1AgSW50IDAgKi8KKyNkZWZpbmUgRTEwMDBfSUNSX0dQSV9FTjEgMHgwMDAwMTAwMCAgICAvKiBHUCBJbnQgMSAqLworI2RlZmluZSBFMTAwMF9JQ1JfR1BJX0VOMiAweDAwMDAyMDAwICAgIC8qIEdQIEludCAyICovCisjZGVmaW5lIEUxMDAwX0lDUl9HUElfRU4zIDB4MDAwMDQwMDAgICAgLyogR1AgSW50IDMgKi8KKyNkZWZpbmUgRTEwMDBfSUNSX1RYRF9MT1cgMHgwMDAwODAwMAorI2RlZmluZSBFMTAwMF9JQ1JfU1JQRCAgICAweDAwMDEwMDAwCisKKy8qIEludGVycnVwdCBDYXVzZSBTZXQgKi8KKyNkZWZpbmUgRTEwMDBfSUNTX1RYRFcgICAgRTEwMDBfSUNSX1RYRFcgICAgICAgIC8qIFRyYW5zbWl0IGRlc2Mgd3JpdHRlbiBiYWNrICovCisjZGVmaW5lIEUxMDAwX0lDU19UWFFFICAgIEUxMDAwX0lDUl9UWFFFICAgICAgICAvKiBUcmFuc21pdCBRdWV1ZSBlbXB0eSAqLworI2RlZmluZSBFMTAwMF9JQ1NfTFNDICAgICBFMTAwMF9JQ1JfTFNDICAgICAgICAgLyogTGluayBTdGF0dXMgQ2hhbmdlICovCisjZGVmaW5lIEUxMDAwX0lDU19SWFNFUSAgIEUxMDAwX0lDUl9SWFNFUSAgICAgICAvKiByeCBzZXF1ZW5jZSBlcnJvciAqLworI2RlZmluZSBFMTAwMF9JQ1NfUlhETVQwICBFMTAwMF9JQ1JfUlhETVQwICAgICAgLyogcnggZGVzYyBtaW4uIHRocmVzaG9sZCAqLworI2RlZmluZSBFMTAwMF9JQ1NfUlhPICAgICBFMTAwMF9JQ1JfUlhPICAgICAgICAgLyogcnggb3ZlcnJ1biAqLworI2RlZmluZSBFMTAwMF9JQ1NfUlhUMCAgICBFMTAwMF9JQ1JfUlhUMCAgICAgICAgLyogcnggdGltZXIgaW50ciAqLworI2RlZmluZSBFMTAwMF9JQ1NfTURBQyAgICBFMTAwMF9JQ1JfTURBQyAgICAgICAgLyogTURJTyBhY2Nlc3MgY29tcGxldGUgKi8KKyNkZWZpbmUgRTEwMDBfSUNTX1JYQ0ZHICAgRTEwMDBfSUNSX1JYQ0ZHICAgICAgIC8qIFJYIC9jLyBvcmRlcmVkIHNldCAqLworI2RlZmluZSBFMTAwMF9JQ1NfR1BJX0VOMCBFMTAwMF9JQ1JfR1BJX0VOMCAgICAgLyogR1AgSW50IDAgKi8KKyNkZWZpbmUgRTEwMDBfSUNTX0dQSV9FTjEgRTEwMDBfSUNSX0dQSV9FTjEgICAgIC8qIEdQIEludCAxICovCisjZGVmaW5lIEUxMDAwX0lDU19HUElfRU4yIEUxMDAwX0lDUl9HUElfRU4yICAgICAvKiBHUCBJbnQgMiAqLworI2RlZmluZSBFMTAwMF9JQ1NfR1BJX0VOMyBFMTAwMF9JQ1JfR1BJX0VOMyAgICAgLyogR1AgSW50IDMgKi8KKyNkZWZpbmUgRTEwMDBfSUNTX1RYRF9MT1cgRTEwMDBfSUNSX1RYRF9MT1cKKyNkZWZpbmUgRTEwMDBfSUNTX1NSUEQgICAgRTEwMDBfSUNSX1NSUEQKKworLyogSW50ZXJydXB0IE1hc2sgU2V0ICovCisjZGVmaW5lIEUxMDAwX0lNU19UWERXICAgIEUxMDAwX0lDUl9UWERXICAgICAgICAvKiBUcmFuc21pdCBkZXNjIHdyaXR0ZW4gYmFjayAqLworI2RlZmluZSBFMTAwMF9JTVNfVFhRRSAgICBFMTAwMF9JQ1JfVFhRRSAgICAgICAgLyogVHJhbnNtaXQgUXVldWUgZW1wdHkgKi8KKyNkZWZpbmUgRTEwMDBfSU1TX0xTQyAgICAgRTEwMDBfSUNSX0xTQyAgICAgICAgIC8qIExpbmsgU3RhdHVzIENoYW5nZSAqLworI2RlZmluZSBFMTAwMF9JTVNfUlhTRVEgICBFMTAwMF9JQ1JfUlhTRVEgICAgICAgLyogcnggc2VxdWVuY2UgZXJyb3IgKi8KKyNkZWZpbmUgRTEwMDBfSU1TX1JYRE1UMCAgRTEwMDBfSUNSX1JYRE1UMCAgICAgIC8qIHJ4IGRlc2MgbWluLiB0aHJlc2hvbGQgKi8KKyNkZWZpbmUgRTEwMDBfSU1TX1JYTyAgICAgRTEwMDBfSUNSX1JYTyAgICAgICAgIC8qIHJ4IG92ZXJydW4gKi8KKyNkZWZpbmUgRTEwMDBfSU1TX1JYVDAgICAgRTEwMDBfSUNSX1JYVDAgICAgICAgIC8qIHJ4IHRpbWVyIGludHIgKi8KKyNkZWZpbmUgRTEwMDBfSU1TX01EQUMgICAgRTEwMDBfSUNSX01EQUMgICAgICAgIC8qIE1ESU8gYWNjZXNzIGNvbXBsZXRlICovCisjZGVmaW5lIEUxMDAwX0lNU19SWENGRyAgIEUxMDAwX0lDUl9SWENGRyAgICAgICAvKiBSWCAvYy8gb3JkZXJlZCBzZXQgKi8KKyNkZWZpbmUgRTEwMDBfSU1TX0dQSV9FTjAgRTEwMDBfSUNSX0dQSV9FTjAgICAgIC8qIEdQIEludCAwICovCisjZGVmaW5lIEUxMDAwX0lNU19HUElfRU4xIEUxMDAwX0lDUl9HUElfRU4xICAgICAvKiBHUCBJbnQgMSAqLworI2RlZmluZSBFMTAwMF9JTVNfR1BJX0VOMiBFMTAwMF9JQ1JfR1BJX0VOMiAgICAgLyogR1AgSW50IDIgKi8KKyNkZWZpbmUgRTEwMDBfSU1TX0dQSV9FTjMgRTEwMDBfSUNSX0dQSV9FTjMgICAgIC8qIEdQIEludCAzICovCisjZGVmaW5lIEUxMDAwX0lNU19UWERfTE9XIEUxMDAwX0lDUl9UWERfTE9XCisjZGVmaW5lIEUxMDAwX0lNU19TUlBEICAgIEUxMDAwX0lDUl9TUlBECisKKy8qIEludGVycnVwdCBNYXNrIENsZWFyICovCisjZGVmaW5lIEUxMDAwX0lNQ19UWERXICAgIEUxMDAwX0lDUl9UWERXICAgICAgICAvKiBUcmFuc21pdCBkZXNjIHdyaXR0ZW4gYmFjayAqLworI2RlZmluZSBFMTAwMF9JTUNfVFhRRSAgICBFMTAwMF9JQ1JfVFhRRSAgICAgICAgLyogVHJhbnNtaXQgUXVldWUgZW1wdHkgKi8KKyNkZWZpbmUgRTEwMDBfSU1DX0xTQyAgICAgRTEwMDBfSUNSX0xTQyAgICAgICAgIC8qIExpbmsgU3RhdHVzIENoYW5nZSAqLworI2RlZmluZSBFMTAwMF9JTUNfUlhTRVEgICBFMTAwMF9JQ1JfUlhTRVEgICAgICAgLyogcnggc2VxdWVuY2UgZXJyb3IgKi8KKyNkZWZpbmUgRTEwMDBfSU1DX1JYRE1UMCAgRTEwMDBfSUNSX1JYRE1UMCAgICAgIC8qIHJ4IGRlc2MgbWluLiB0aHJlc2hvbGQgKi8KKyNkZWZpbmUgRTEwMDBfSU1DX1JYTyAgICAgRTEwMDBfSUNSX1JYTyAgICAgICAgIC8qIHJ4IG92ZXJydW4gKi8KKyNkZWZpbmUgRTEwMDBfSU1DX1JYVDAgICAgRTEwMDBfSUNSX1JYVDAgICAgICAgIC8qIHJ4IHRpbWVyIGludHIgKi8KKyNkZWZpbmUgRTEwMDBfSU1DX01EQUMgICAgRTEwMDBfSUNSX01EQUMgICAgICAgIC8qIE1ESU8gYWNjZXNzIGNvbXBsZXRlICovCisjZGVmaW5lIEUxMDAwX0lNQ19SWENGRyAgIEUxMDAwX0lDUl9SWENGRyAgICAgICAvKiBSWCAvYy8gb3JkZXJlZCBzZXQgKi8KKyNkZWZpbmUgRTEwMDBfSU1DX0dQSV9FTjAgRTEwMDBfSUNSX0dQSV9FTjAgICAgIC8qIEdQIEludCAwICovCisjZGVmaW5lIEUxMDAwX0lNQ19HUElfRU4xIEUxMDAwX0lDUl9HUElfRU4xICAgICAvKiBHUCBJbnQgMSAqLworI2RlZmluZSBFMTAwMF9JTUNfR1BJX0VOMiBFMTAwMF9JQ1JfR1BJX0VOMiAgICAgLyogR1AgSW50IDIgKi8KKyNkZWZpbmUgRTEwMDBfSU1DX0dQSV9FTjMgRTEwMDBfSUNSX0dQSV9FTjMgICAgIC8qIEdQIEludCAzICovCisjZGVmaW5lIEUxMDAwX0lNQ19UWERfTE9XIEUxMDAwX0lDUl9UWERfTE9XCisjZGVmaW5lIEUxMDAwX0lNQ19TUlBEICAgIEUxMDAwX0lDUl9TUlBECisKKy8qIFJlY2VpdmUgQ29udHJvbCAqLworI2RlZmluZSBFMTAwMF9SQ1RMX1JTVCAgICAgICAgICAweDAwMDAwMDAxICAgICAgLyogU29mdHdhcmUgcmVzZXQgKi8KKyNkZWZpbmUgRTEwMDBfUkNUTF9FTiAgICAgICAgICAgMHgwMDAwMDAwMiAgICAgIC8qIGVuYWJsZSAqLworI2RlZmluZSBFMTAwMF9SQ1RMX1NCUCAgICAgICAgICAweDAwMDAwMDA0ICAgICAgLyogc3RvcmUgYmFkIHBhY2tldCAqLworI2RlZmluZSBFMTAwMF9SQ1RMX1VQRSAgICAgICAgICAweDAwMDAwMDA4ICAgICAgLyogdW5pY2FzdCBwcm9taXNjdW91cyBlbmFibGUgKi8KKyNkZWZpbmUgRTEwMDBfUkNUTF9NUEUgICAgICAgICAgMHgwMDAwMDAxMCAgICAgIC8qIG11bHRpY2FzdCBwcm9taXNjdW91cyBlbmFiICovCisjZGVmaW5lIEUxMDAwX1JDVExfTFBFICAgICAgICAgIDB4MDAwMDAwMjAgICAgICAvKiBsb25nIHBhY2tldCBlbmFibGUgKi8KKyNkZWZpbmUgRTEwMDBfUkNUTF9MQk1fTk8gICAgICAgMHgwMDAwMDAwMCAgICAgIC8qIG5vIGxvb3BiYWNrIG1vZGUgKi8KKyNkZWZpbmUgRTEwMDBfUkNUTF9MQk1fTUFDICAgICAgMHgwMDAwMDA0MCAgICAgIC8qIE1BQyBsb29wYmFjayBtb2RlICovCisjZGVmaW5lIEUxMDAwX1JDVExfTEJNX1NMUCAgICAgIDB4MDAwMDAwODAgICAgICAvKiBzZXJpYWwgbGluayBsb29wYmFjayBtb2RlICovCisjZGVmaW5lIEUxMDAwX1JDVExfTEJNX1RDVlIgICAgIDB4MDAwMDAwQzAgICAgICAvKiB0Y3ZyIGxvb3BiYWNrIG1vZGUgKi8KKyNkZWZpbmUgRTEwMDBfUkNUTF9SRE1UU19IQUxGICAgMHgwMDAwMDAwMCAgICAgIC8qIHJ4IGRlc2MgbWluIHRocmVzaG9sZCBzaXplICovCisjZGVmaW5lIEUxMDAwX1JDVExfUkRNVFNfUVVBVCAgIDB4MDAwMDAxMDAgICAgICAvKiByeCBkZXNjIG1pbiB0aHJlc2hvbGQgc2l6ZSAqLworI2RlZmluZSBFMTAwMF9SQ1RMX1JETVRTX0VJR1RIICAweDAwMDAwMjAwICAgICAgLyogcnggZGVzYyBtaW4gdGhyZXNob2xkIHNpemUgKi8KKyNkZWZpbmUgRTEwMDBfUkNUTF9NT19TSElGVCAgICAgMTIgICAgICAgICAgICAgIC8qIG11bHRpY2FzdCBvZmZzZXQgc2hpZnQgKi8KKyNkZWZpbmUgRTEwMDBfUkNUTF9NT18wICAgICAgICAgMHgwMDAwMDAwMCAgICAgIC8qIG11bHRpY2FzdCBvZmZzZXQgMTE6MCAqLworI2RlZmluZSBFMTAwMF9SQ1RMX01PXzEgICAgICAgICAweDAwMDAxMDAwICAgICAgLyogbXVsdGljYXN0IG9mZnNldCAxMjoxICovCisjZGVmaW5lIEUxMDAwX1JDVExfTU9fMiAgICAgICAgIDB4MDAwMDIwMDAgICAgICAvKiBtdWx0aWNhc3Qgb2Zmc2V0IDEzOjIgKi8KKyNkZWZpbmUgRTEwMDBfUkNUTF9NT18zICAgICAgICAgMHgwMDAwMzAwMCAgICAgIC8qIG11bHRpY2FzdCBvZmZzZXQgMTU6NCAqLworI2RlZmluZSBFMTAwMF9SQ1RMX01EUiAgICAgICAgICAweDAwMDA0MDAwICAgICAgLyogbXVsdGljYXN0IGRlc2MgcmluZyAwICovCisjZGVmaW5lIEUxMDAwX1JDVExfQkFNICAgICAgICAgIDB4MDAwMDgwMDAgICAgICAvKiBicm9hZGNhc3QgZW5hYmxlICovCisvKiB0aGVzZSBidWZmZXIgc2l6ZXMgYXJlIHZhbGlkIGlmIEUxMDAwX1JDVExfQlNFWCBpcyAwICovCisjZGVmaW5lIEUxMDAwX1JDVExfU1pfMjA0OCAgICAgIDB4MDAwMDAwMDAgICAgICAvKiByeCBidWZmZXIgc2l6ZSAyMDQ4ICovCisjZGVmaW5lIEUxMDAwX1JDVExfU1pfMTAyNCAgICAgIDB4MDAwMTAwMDAgICAgICAvKiByeCBidWZmZXIgc2l6ZSAxMDI0ICovCisjZGVmaW5lIEUxMDAwX1JDVExfU1pfNTEyICAgICAgIDB4MDAwMjAwMDAgICAgICAvKiByeCBidWZmZXIgc2l6ZSA1MTIgKi8KKyNkZWZpbmUgRTEwMDBfUkNUTF9TWl8yNTYgICAgICAgMHgwMDAzMDAwMCAgICAgIC8qIHJ4IGJ1ZmZlciBzaXplIDI1NiAqLworLyogdGhlc2UgYnVmZmVyIHNpemVzIGFyZSB2YWxpZCBpZiBFMTAwMF9SQ1RMX0JTRVggaXMgMSAqLworI2RlZmluZSBFMTAwMF9SQ1RMX1NaXzE2Mzg0ICAgICAweDAwMDEwMDAwICAgICAgLyogcnggYnVmZmVyIHNpemUgMTYzODQgKi8KKyNkZWZpbmUgRTEwMDBfUkNUTF9TWl84MTkyICAgICAgMHgwMDAyMDAwMCAgICAgIC8qIHJ4IGJ1ZmZlciBzaXplIDgxOTIgKi8KKyNkZWZpbmUgRTEwMDBfUkNUTF9TWl80MDk2ICAgICAgMHgwMDAzMDAwMCAgICAgIC8qIHJ4IGJ1ZmZlciBzaXplIDQwOTYgKi8KKyNkZWZpbmUgRTEwMDBfUkNUTF9WRkUgICAgICAgICAgMHgwMDA0MDAwMCAgICAgIC8qIHZsYW4gZmlsdGVyIGVuYWJsZSAqLworI2RlZmluZSBFMTAwMF9SQ1RMX0NGSUVOICAgICAgICAweDAwMDgwMDAwICAgICAgLyogY2Fub25pY2FsIGZvcm0gZW5hYmxlICovCisjZGVmaW5lIEUxMDAwX1JDVExfQ0ZJICAgICAgICAgIDB4MDAxMDAwMDAgICAgICAvKiBjYW5vbmljYWwgZm9ybSBpbmRpY2F0b3IgKi8KKyNkZWZpbmUgRTEwMDBfUkNUTF9EUEYgICAgICAgICAgMHgwMDQwMDAwMCAgICAgIC8qIGRpc2NhcmQgcGF1c2UgZnJhbWVzICovCisjZGVmaW5lIEUxMDAwX1JDVExfUE1DRiAgICAgICAgIDB4MDA4MDAwMDAgICAgICAvKiBwYXNzIE1BQyBjb250cm9sIGZyYW1lcyAqLworI2RlZmluZSBFMTAwMF9SQ1RMX0JTRVggICAgICAgICAweDAyMDAwMDAwICAgICAgLyogQnVmZmVyIHNpemUgZXh0ZW5zaW9uICovCisKKy8qIFJlY2VpdmUgRGVzY3JpcHRvciAqLworI2RlZmluZSBFMTAwMF9SRFRfREVMQVkgMHgwMDAwZmZmZiAgICAgIC8qIERlbGF5IHRpbWVyICgxPTEwMjR1cykgKi8KKyNkZWZpbmUgRTEwMDBfUkRUX0ZQREIgIDB4ODAwMDAwMDAgICAgICAvKiBGbHVzaCBkZXNjcmlwdG9yIGJsb2NrICovCisjZGVmaW5lIEUxMDAwX1JETEVOX0xFTiAweDAwMDdmZjgwICAgICAgLyogZGVzY3JpcHRvciBsZW5ndGggKi8KKyNkZWZpbmUgRTEwMDBfUkRIX1JESCAgIDB4MDAwMGZmZmYgICAgICAvKiByZWNlaXZlIGRlc2NyaXB0b3IgaGVhZCAqLworI2RlZmluZSBFMTAwMF9SRFRfUkRUICAgMHgwMDAwZmZmZiAgICAgIC8qIHJlY2VpdmUgZGVzY3JpcHRvciB0YWlsICovCisKKy8qIEZsb3cgQ29udHJvbCAqLworI2RlZmluZSBFMTAwMF9GQ1JUSF9SVEggIDB4MDAwMEZGRjggICAgIC8qIE1hc2sgQml0c1sxNTozXSBmb3IgUlRIICovCisjZGVmaW5lIEUxMDAwX0ZDUlRIX1hGQ0UgMHg4MDAwMDAwMCAgICAgLyogRXh0ZXJuYWwgRmxvdyBDb250cm9sIEVuYWJsZSAqLworI2RlZmluZSBFMTAwMF9GQ1JUTF9SVEwgIDB4MDAwMEZGRjggICAgIC8qIE1hc2sgQml0c1sxNTozXSBmb3IgUlRMICovCisjZGVmaW5lIEUxMDAwX0ZDUlRMX1hPTkUgMHg4MDAwMDAwMCAgICAgLyogRW5hYmxlIFhPTiBmcmFtZSB0cmFuc21pc3Npb24gKi8KKworLyogUmVjZWl2ZSBEZXNjcmlwdG9yIENvbnRyb2wgKi8KKyNkZWZpbmUgRTEwMDBfUlhEQ1RMX1BUSFJFU0ggMHgwMDAwMDAzRiAvKiBSWERDVEwgUHJlZmV0Y2ggVGhyZXNob2xkICovCisjZGVmaW5lIEUxMDAwX1JYRENUTF9IVEhSRVNIIDB4MDAwMDNGMDAgLyogUlhEQ1RMIEhvc3QgVGhyZXNob2xkICovCisjZGVmaW5lIEUxMDAwX1JYRENUTF9XVEhSRVNIIDB4MDAzRjAwMDAgLyogUlhEQ1RMIFdyaXRlYmFjayBUaHJlc2hvbGQgKi8KKyNkZWZpbmUgRTEwMDBfUlhEQ1RMX0dSQU4gICAgMHgwMTAwMDAwMCAvKiBSWERDVEwgR3JhbnVsYXJpdHkgKi8KKworLyogVHJhbnNtaXQgRGVzY3JpcHRvciBDb250cm9sICovCisjZGVmaW5lIEUxMDAwX1RYRENUTF9QVEhSRVNIIDB4MDAwMDAwRkYgLyogVFhEQ1RMIFByZWZldGNoIFRocmVzaG9sZCAqLworI2RlZmluZSBFMTAwMF9UWERDVExfSFRIUkVTSCAweDAwMDBGRjAwIC8qIFRYRENUTCBIb3N0IFRocmVzaG9sZCAqLworI2RlZmluZSBFMTAwMF9UWERDVExfV1RIUkVTSCAweDAwRkYwMDAwIC8qIFRYRENUTCBXcml0ZWJhY2sgVGhyZXNob2xkICovCisjZGVmaW5lIEUxMDAwX1RYRENUTF9HUkFOICAgIDB4MDEwMDAwMDAgLyogVFhEQ1RMIEdyYW51bGFyaXR5ICovCisjZGVmaW5lIEUxMDAwX1RYRENUTF9MV1RIUkVTSCAweEZFMDAwMDAwIC8qIFRYRENUTCBMb3cgVGhyZXNob2xkICovCisjZGVmaW5lIEUxMDAwX1RYRENUTF9GVUxMX1RYX0RFU0NfV0IgMHgwMTAxMDAwMCAvKiBHUkFOPTEsIFdUSFJFU0g9MSAqLworCisvKiBUcmFuc21pdCBDb25maWd1cmF0aW9uIFdvcmQgKi8KKyNkZWZpbmUgRTEwMDBfVFhDV19GRCAgICAgICAgIDB4MDAwMDAwMjAgICAgICAgIC8qIFRYQ1cgZnVsbCBkdXBsZXggKi8KKyNkZWZpbmUgRTEwMDBfVFhDV19IRCAgICAgICAgIDB4MDAwMDAwNDAgICAgICAgIC8qIFRYQ1cgaGFsZiBkdXBsZXggKi8KKyNkZWZpbmUgRTEwMDBfVFhDV19QQVVTRSAgICAgIDB4MDAwMDAwODAgICAgICAgIC8qIFRYQ1cgc3ltIHBhdXNlIHJlcXVlc3QgKi8KKyNkZWZpbmUgRTEwMDBfVFhDV19BU01fRElSICAgIDB4MDAwMDAxMDAgICAgICAgIC8qIFRYQ1cgYXN0bSBwYXVzZSBkaXJlY3Rpb24gKi8KKyNkZWZpbmUgRTEwMDBfVFhDV19QQVVTRV9NQVNLIDB4MDAwMDAxODAgICAgICAgIC8qIFRYQ1cgcGF1c2UgcmVxdWVzdCBtYXNrICovCisjZGVmaW5lIEUxMDAwX1RYQ1dfUkYgICAgICAgICAweDAwMDAzMDAwICAgICAgICAvKiBUWENXIHJlbW90ZSBmYXVsdCAqLworI2RlZmluZSBFMTAwMF9UWENXX05QICAgICAgICAgMHgwMDAwODAwMCAgICAgICAgLyogVFhDVyBuZXh0IHBhZ2UgKi8KKyNkZWZpbmUgRTEwMDBfVFhDV19DVyAgICAgICAgIDB4MDAwMGZmZmYgICAgICAgIC8qIFR4Q29uZmlnV29yZCBtYXNrICovCisjZGVmaW5lIEUxMDAwX1RYQ1dfVFhDICAgICAgICAweDQwMDAwMDAwICAgICAgICAvKiBUcmFuc21pdCBDb25maWcgY29udHJvbCAqLworI2RlZmluZSBFMTAwMF9UWENXX0FORSAgICAgICAgMHg4MDAwMDAwMCAgICAgICAgLyogQXV0by1uZWcgZW5hYmxlICovCisKKy8qIFJlY2VpdmUgQ29uZmlndXJhdGlvbiBXb3JkICovCisjZGVmaW5lIEUxMDAwX1JYQ1dfQ1cgICAgMHgwMDAwZmZmZiAgICAgLyogUnhDb25maWdXb3JkIG1hc2sgKi8KKyNkZWZpbmUgRTEwMDBfUlhDV19OQyAgICAweDA0MDAwMDAwICAgICAvKiBSZWNlaXZlIGNvbmZpZyBubyBjYXJyaWVyICovCisjZGVmaW5lIEUxMDAwX1JYQ1dfSVYgICAgMHgwODAwMDAwMCAgICAgLyogUmVjZWl2ZSBjb25maWcgaW52YWxpZCAqLworI2RlZmluZSBFMTAwMF9SWENXX0NDICAgIDB4MTAwMDAwMDAgICAgIC8qIFJlY2VpdmUgY29uZmlnIGNoYW5nZSAqLworI2RlZmluZSBFMTAwMF9SWENXX0MgICAgIDB4MjAwMDAwMDAgICAgIC8qIFJlY2VpdmUgY29uZmlnICovCisjZGVmaW5lIEUxMDAwX1JYQ1dfU1lOQ0ggMHg0MDAwMDAwMCAgICAgLyogUmVjZWl2ZSBjb25maWcgc3luY2ggKi8KKyNkZWZpbmUgRTEwMDBfUlhDV19BTkMgICAweDgwMDAwMDAwICAgICAvKiBBdXRvLW5lZyBjb21wbGV0ZSAqLworCisvKiBUcmFuc21pdCBDb250cm9sICovCisjZGVmaW5lIEUxMDAwX1RDVExfUlNUICAgIDB4MDAwMDAwMDEgICAgLyogc29mdHdhcmUgcmVzZXQgKi8KKyNkZWZpbmUgRTEwMDBfVENUTF9FTiAgICAgMHgwMDAwMDAwMiAgICAvKiBlbmFibGUgdHggKi8KKyNkZWZpbmUgRTEwMDBfVENUTF9CQ0UgICAgMHgwMDAwMDAwNCAgICAvKiBidXN5IGNoZWNrIGVuYWJsZSAqLworI2RlZmluZSBFMTAwMF9UQ1RMX1BTUCAgICAweDAwMDAwMDA4ICAgIC8qIHBhZCBzaG9ydCBwYWNrZXRzICovCisjZGVmaW5lIEUxMDAwX1RDVExfQ1QgICAgIDB4MDAwMDBmZjAgICAgLyogY29sbGlzaW9uIHRocmVzaG9sZCAqLworI2RlZmluZSBFMTAwMF9UQ1RMX0NPTEQgICAweDAwM2ZmMDAwICAgIC8qIGNvbGxpc2lvbiBkaXN0YW5jZSAqLworI2RlZmluZSBFMTAwMF9UQ1RMX1NXWE9GRiAweDAwNDAwMDAwICAgIC8qIFNXIFhvZmYgdHJhbnNtaXNzaW9uICovCisjZGVmaW5lIEUxMDAwX1RDVExfUEJFICAgIDB4MDA4MDAwMDAgICAgLyogUGFja2V0IEJ1cnN0IEVuYWJsZSAqLworI2RlZmluZSBFMTAwMF9UQ1RMX1JUTEMgICAweDAxMDAwMDAwICAgIC8qIFJlLXRyYW5zbWl0IG9uIGxhdGUgY29sbGlzaW9uICovCisjZGVmaW5lIEUxMDAwX1RDVExfTlJUVSAgIDB4MDIwMDAwMDAgICAgLyogTm8gUmUtdHJhbnNtaXQgb24gdW5kZXJydW4gKi8KKworLyogUmVjZWl2ZSBDaGVja3N1bSBDb250cm9sICovCisjZGVmaW5lIEUxMDAwX1JYQ1NVTV9QQ1NTX01BU0sgMHgwMDAwMDBGRiAgIC8qIFBhY2tldCBDaGVja3N1bSBTdGFydCAqLworI2RlZmluZSBFMTAwMF9SWENTVU1fSVBPRkwgICAgIDB4MDAwMDAxMDAgICAvKiBJUHY0IGNoZWNrc3VtIG9mZmxvYWQgKi8KKyNkZWZpbmUgRTEwMDBfUlhDU1VNX1RVT0ZMICAgICAweDAwMDAwMjAwICAgLyogVENQIC8gVURQIGNoZWNrc3VtIG9mZmxvYWQgKi8KKyNkZWZpbmUgRTEwMDBfUlhDU1VNX0lQVjZPRkwgICAweDAwMDAwNDAwICAgLyogSVB2NiBjaGVja3N1bSBvZmZsb2FkICovCisKKy8qIERlZmluaXRpb25zIGZvciBwb3dlciBtYW5hZ2VtZW50IGFuZCB3YWtldXAgcmVnaXN0ZXJzICovCisvKiBXYWtlIFVwIENvbnRyb2wgKi8KKyNkZWZpbmUgRTEwMDBfV1VDX0FQTUUgICAgICAgMHgwMDAwMDAwMSAvKiBBUE0gRW5hYmxlICovCisjZGVmaW5lIEUxMDAwX1dVQ19QTUVfRU4gICAgIDB4MDAwMDAwMDIgLyogUE1FIEVuYWJsZSAqLworI2RlZmluZSBFMTAwMF9XVUNfUE1FX1NUQVRVUyAweDAwMDAwMDA0IC8qIFBNRSBTdGF0dXMgKi8KKyNkZWZpbmUgRTEwMDBfV1VDX0FQTVBNRSAgICAgMHgwMDAwMDAwOCAvKiBBc3NlcnQgUE1FIG9uIEFQTSBXYWtldXAgKi8KKyNkZWZpbmUgRTEwMDBfV1VDX1NQTSAgICAgICAgMHg4MDAwMDAwMCAvKiBFbmFibGUgU1BNICovCisKKy8qIFdha2UgVXAgRmlsdGVyIENvbnRyb2wgKi8KKyNkZWZpbmUgRTEwMDBfV1VGQ19MTktDIDB4MDAwMDAwMDEgLyogTGluayBTdGF0dXMgQ2hhbmdlIFdha2V1cCBFbmFibGUgKi8KKyNkZWZpbmUgRTEwMDBfV1VGQ19NQUcgIDB4MDAwMDAwMDIgLyogTWFnaWMgUGFja2V0IFdha2V1cCBFbmFibGUgKi8KKyNkZWZpbmUgRTEwMDBfV1VGQ19FWCAgIDB4MDAwMDAwMDQgLyogRGlyZWN0ZWQgRXhhY3QgV2FrZXVwIEVuYWJsZSAqLworI2RlZmluZSBFMTAwMF9XVUZDX01DICAgMHgwMDAwMDAwOCAvKiBEaXJlY3RlZCBNdWx0aWNhc3QgV2FrZXVwIEVuYWJsZSAqLworI2RlZmluZSBFMTAwMF9XVUZDX0JDICAgMHgwMDAwMDAxMCAvKiBCcm9hZGNhc3QgV2FrZXVwIEVuYWJsZSAqLworI2RlZmluZSBFMTAwMF9XVUZDX0FSUCAgMHgwMDAwMDAyMCAvKiBBUlAgUmVxdWVzdCBQYWNrZXQgV2FrZXVwIEVuYWJsZSAqLworI2RlZmluZSBFMTAwMF9XVUZDX0lQVjQgMHgwMDAwMDA0MCAvKiBEaXJlY3RlZCBJUHY0IFBhY2tldCBXYWtldXAgRW5hYmxlICovCisjZGVmaW5lIEUxMDAwX1dVRkNfSVBWNiAweDAwMDAwMDgwIC8qIERpcmVjdGVkIElQdjYgUGFja2V0IFdha2V1cCBFbmFibGUgKi8KKyNkZWZpbmUgRTEwMDBfV1VGQ19GTFgwIDB4MDAwMTAwMDAgLyogRmxleGlibGUgRmlsdGVyIDAgRW5hYmxlICovCisjZGVmaW5lIEUxMDAwX1dVRkNfRkxYMSAweDAwMDIwMDAwIC8qIEZsZXhpYmxlIEZpbHRlciAxIEVuYWJsZSAqLworI2RlZmluZSBFMTAwMF9XVUZDX0ZMWDIgMHgwMDA0MDAwMCAvKiBGbGV4aWJsZSBGaWx0ZXIgMiBFbmFibGUgKi8KKyNkZWZpbmUgRTEwMDBfV1VGQ19GTFgzIDB4MDAwODAwMDAgLyogRmxleGlibGUgRmlsdGVyIDMgRW5hYmxlICovCisjZGVmaW5lIEUxMDAwX1dVRkNfQUxMX0ZJTFRFUlMgMHgwMDBGMDBGRiAvKiBNYXNrIGZvciBhbGwgd2FrZXVwIGZpbHRlcnMgKi8KKyNkZWZpbmUgRTEwMDBfV1VGQ19GTFhfT0ZGU0VUIDE2ICAgICAgIC8qIE9mZnNldCB0byB0aGUgRmxleGlibGUgRmlsdGVycyBiaXRzICovCisjZGVmaW5lIEUxMDAwX1dVRkNfRkxYX0ZJTFRFUlMgMHgwMDBGMDAwMCAvKiBNYXNrIGZvciB0aGUgNCBmbGV4aWJsZSBmaWx0ZXJzICovCisKKy8qIFdha2UgVXAgU3RhdHVzICovCisjZGVmaW5lIEUxMDAwX1dVU19MTktDIDB4MDAwMDAwMDEgLyogTGluayBTdGF0dXMgQ2hhbmdlZCAqLworI2RlZmluZSBFMTAwMF9XVVNfTUFHICAweDAwMDAwMDAyIC8qIE1hZ2ljIFBhY2tldCBSZWNlaXZlZCAqLworI2RlZmluZSBFMTAwMF9XVVNfRVggICAweDAwMDAwMDA0IC8qIERpcmVjdGVkIEV4YWN0IFJlY2VpdmVkICovCisjZGVmaW5lIEUxMDAwX1dVU19NQyAgIDB4MDAwMDAwMDggLyogRGlyZWN0ZWQgTXVsdGljYXN0IFJlY2VpdmVkICovCisjZGVmaW5lIEUxMDAwX1dVU19CQyAgIDB4MDAwMDAwMTAgLyogQnJvYWRjYXN0IFJlY2VpdmVkICovCisjZGVmaW5lIEUxMDAwX1dVU19BUlAgIDB4MDAwMDAwMjAgLyogQVJQIFJlcXVlc3QgUGFja2V0IFJlY2VpdmVkICovCisjZGVmaW5lIEUxMDAwX1dVU19JUFY0IDB4MDAwMDAwNDAgLyogRGlyZWN0ZWQgSVB2NCBQYWNrZXQgV2FrZXVwIFJlY2VpdmVkICovCisjZGVmaW5lIEUxMDAwX1dVU19JUFY2IDB4MDAwMDAwODAgLyogRGlyZWN0ZWQgSVB2NiBQYWNrZXQgV2FrZXVwIFJlY2VpdmVkICovCisjZGVmaW5lIEUxMDAwX1dVU19GTFgwIDB4MDAwMTAwMDAgLyogRmxleGlibGUgRmlsdGVyIDAgTWF0Y2ggKi8KKyNkZWZpbmUgRTEwMDBfV1VTX0ZMWDEgMHgwMDAyMDAwMCAvKiBGbGV4aWJsZSBGaWx0ZXIgMSBNYXRjaCAqLworI2RlZmluZSBFMTAwMF9XVVNfRkxYMiAweDAwMDQwMDAwIC8qIEZsZXhpYmxlIEZpbHRlciAyIE1hdGNoICovCisjZGVmaW5lIEUxMDAwX1dVU19GTFgzIDB4MDAwODAwMDAgLyogRmxleGlibGUgRmlsdGVyIDMgTWF0Y2ggKi8KKyNkZWZpbmUgRTEwMDBfV1VTX0ZMWF9GSUxURVJTIDB4MDAwRjAwMDAgLyogTWFzayBmb3IgdGhlIDQgZmxleGlibGUgZmlsdGVycyAqLworCisvKiBNYW5hZ2VtZW50IENvbnRyb2wgKi8KKyNkZWZpbmUgRTEwMDBfTUFOQ19TTUJVU19FTiAgICAgIDB4MDAwMDAwMDEgLyogU01CdXMgRW5hYmxlZCAtIFJPICovCisjZGVmaW5lIEUxMDAwX01BTkNfQVNGX0VOICAgICAgICAweDAwMDAwMDAyIC8qIEFTRiBFbmFibGVkIC0gUk8gKi8KKyNkZWZpbmUgRTEwMDBfTUFOQ19SX09OX0ZPUkNFICAgIDB4MDAwMDAwMDQgLyogUmVzZXQgb24gRm9yY2UgVENPIC0gUk8gKi8KKyNkZWZpbmUgRTEwMDBfTUFOQ19STUNQX0VOICAgICAgIDB4MDAwMDAxMDAgLyogRW5hYmxlIFJDTVAgMDI2RmggRmlsdGVyaW5nICovCisjZGVmaW5lIEUxMDAwX01BTkNfMDI5OF9FTiAgICAgICAweDAwMDAwMjAwIC8qIEVuYWJsZSBSQ01QIDAyOThoIEZpbHRlcmluZyAqLworI2RlZmluZSBFMTAwMF9NQU5DX0lQVjRfRU4gICAgICAgMHgwMDAwMDQwMCAvKiBFbmFibGUgSVB2NCAqLworI2RlZmluZSBFMTAwMF9NQU5DX0lQVjZfRU4gICAgICAgMHgwMDAwMDgwMCAvKiBFbmFibGUgSVB2NiAqLworI2RlZmluZSBFMTAwMF9NQU5DX1NOQVBfRU4gICAgICAgMHgwMDAwMTAwMCAvKiBBY2NlcHQgTExDL1NOQVAgKi8KKyNkZWZpbmUgRTEwMDBfTUFOQ19BUlBfRU4gICAgICAgIDB4MDAwMDIwMDAgLyogRW5hYmxlIEFSUCBSZXF1ZXN0IEZpbHRlcmluZyAqLworI2RlZmluZSBFMTAwMF9NQU5DX05FSUdIQk9SX0VOICAgMHgwMDAwNDAwMCAvKiBFbmFibGUgTmVpZ2hib3IgRGlzY292ZXJ5IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBGaWx0ZXJpbmcgKi8KKyNkZWZpbmUgRTEwMDBfTUFOQ19UQ09fUkVTRVQgICAgIDB4MDAwMTAwMDAgLyogVENPIFJlc2V0IE9jY3VycmVkICovCisjZGVmaW5lIEUxMDAwX01BTkNfUkNWX1RDT19FTiAgICAweDAwMDIwMDAwIC8qIFJlY2VpdmUgVENPIFBhY2tldHMgRW5hYmxlZCAqLworI2RlZmluZSBFMTAwMF9NQU5DX1JFUE9SVF9TVEFUVVMgMHgwMDA0MDAwMCAvKiBTdGF0dXMgUmVwb3J0aW5nIEVuYWJsZWQgKi8KKyNkZWZpbmUgRTEwMDBfTUFOQ19TTUJfUkVRICAgICAgIDB4MDEwMDAwMDAgLyogU01CdXMgUmVxdWVzdCAqLworI2RlZmluZSBFMTAwMF9NQU5DX1NNQl9HTlQgICAgICAgMHgwMjAwMDAwMCAvKiBTTUJ1cyBHcmFudCAqLworI2RlZmluZSBFMTAwMF9NQU5DX1NNQl9DTEtfSU4gICAgMHgwNDAwMDAwMCAvKiBTTUJ1cyBDbG9jayBJbiAqLworI2RlZmluZSBFMTAwMF9NQU5DX1NNQl9EQVRBX0lOICAgMHgwODAwMDAwMCAvKiBTTUJ1cyBEYXRhIEluICovCisjZGVmaW5lIEUxMDAwX01BTkNfU01CX0RBVEFfT1VUICAweDEwMDAwMDAwIC8qIFNNQnVzIERhdGEgT3V0ICovCisjZGVmaW5lIEUxMDAwX01BTkNfU01CX0NMS19PVVQgICAweDIwMDAwMDAwIC8qIFNNQnVzIENsb2NrIE91dCAqLworCisjZGVmaW5lIEUxMDAwX01BTkNfU01CX0RBVEFfT1VUX1NISUZUICAyOCAvKiBTTUJ1cyBEYXRhIE91dCBTaGlmdCAqLworI2RlZmluZSBFMTAwMF9NQU5DX1NNQl9DTEtfT1VUX1NISUZUICAgMjkgLyogU01CdXMgQ2xvY2sgT3V0IFNoaWZ0ICovCisKKy8qIFdha2UgVXAgUGFja2V0IExlbmd0aCAqLworI2RlZmluZSBFMTAwMF9XVVBMX0xFTkdUSF9NQVNLIDB4MEZGRiAgIC8qIE9ubHkgdGhlIGxvd2VyIDEyIGJpdHMgYXJlIHZhbGlkICovCisKKyNkZWZpbmUgRTEwMDBfTURBTElHTiAgICAgICAgICA0MDk2CisKKy8qIEVFUFJPTSBDb21tYW5kcyAtIE1pY3Jvd2lyZSAqLworI2RlZmluZSBFRVBST01fUkVBRF9PUENPREVfTUlDUk9XSVJFICAweDYgIC8qIEVFUFJPTSByZWFkIG9wY29kZSAqLworI2RlZmluZSBFRVBST01fV1JJVEVfT1BDT0RFX01JQ1JPV0lSRSAweDUgIC8qIEVFUFJPTSB3cml0ZSBvcGNvZGUgKi8KKyNkZWZpbmUgRUVQUk9NX0VSQVNFX09QQ09ERV9NSUNST1dJUkUgMHg3ICAvKiBFRVBST00gZXJhc2Ugb3Bjb2RlICovCisjZGVmaW5lIEVFUFJPTV9FV0VOX09QQ09ERV9NSUNST1dJUkUgIDB4MTMgLyogRUVQUk9NIGVyYXNlL3dyaXRlIGVuYWJsZSAqLworI2RlZmluZSBFRVBST01fRVdEU19PUENPREVfTUlDUk9XSVJFICAweDEwIC8qIEVFUFJPTSBlcmFzdC93cml0ZSBkaXNhYmxlICovCisKKy8qIEVFUFJPTSBDb21tYW5kcyAtIFNQSSAqLworI2RlZmluZSBFRVBST01fTUFYX1JFVFJZX1NQSSAgICA1MDAwIC8qIE1heCB3YWl0IG9mIDVtcywgZm9yIFJEWSBzaWduYWwgKi8KKyNkZWZpbmUgRUVQUk9NX1JFQURfT1BDT0RFX1NQSSAgMHgzICAvKiBFRVBST00gcmVhZCBvcGNvZGUgKi8KKyNkZWZpbmUgRUVQUk9NX1dSSVRFX09QQ09ERV9TUEkgMHgyICAvKiBFRVBST00gd3JpdGUgb3Bjb2RlICovCisjZGVmaW5lIEVFUFJPTV9BOF9PUENPREVfU1BJICAgIDB4OCAgLyogb3Bjb2RlIGJpdC0zID0gYWRkcmVzcyBiaXQtOCAqLworI2RlZmluZSBFRVBST01fV1JFTl9PUENPREVfU1BJICAweDYgIC8qIEVFUFJPTSBzZXQgV3JpdGUgRW5hYmxlIGxhdGNoICovCisjZGVmaW5lIEVFUFJPTV9XUkRJX09QQ09ERV9TUEkgIDB4NCAgLyogRUVQUk9NIHJlc2V0IFdyaXRlIEVuYWJsZSBsYXRjaCAqLworI2RlZmluZSBFRVBST01fUkRTUl9PUENPREVfU1BJICAweDUgIC8qIEVFUFJPTSByZWFkIFN0YXR1cyByZWdpc3RlciAqLworI2RlZmluZSBFRVBST01fV1JTUl9PUENPREVfU1BJICAweDEgIC8qIEVFUFJPTSB3cml0ZSBTdGF0dXMgcmVnaXN0ZXIgKi8KKworLyogRUVQUk9NIFNpemUgZGVmaW5pdGlvbnMgKi8KKyNkZWZpbmUgRUVQUk9NX1NJWkVfMTZLQiAgICAgICAgMHgxODAwCisjZGVmaW5lIEVFUFJPTV9TSVpFXzhLQiAgICAgICAgIDB4MTQwMAorI2RlZmluZSBFRVBST01fU0laRV80S0IgICAgICAgICAweDEwMDAKKyNkZWZpbmUgRUVQUk9NX1NJWkVfMktCICAgICAgICAgMHgwQzAwCisjZGVmaW5lIEVFUFJPTV9TSVpFXzFLQiAgICAgICAgIDB4MDgwMAorI2RlZmluZSBFRVBST01fU0laRV81MTJCICAgICAgICAweDA0MDAKKyNkZWZpbmUgRUVQUk9NX1NJWkVfMTI4QiAgICAgICAgMHgwMDAwCisjZGVmaW5lIEVFUFJPTV9TSVpFX01BU0sgICAgICAgIDB4MUMwMAorCisvKiBFRVBST00gV29yZCBPZmZzZXRzICovCisjZGVmaW5lIEVFUFJPTV9DT01QQVQgICAgICAgICAgICAgIDB4MDAwMworI2RlZmluZSBFRVBST01fSURfTEVEX1NFVFRJTkdTICAgICAweDAwMDQKKyNkZWZpbmUgRUVQUk9NX1NFUkRFU19BTVBMSVRVREUgICAgICAgMHgwMDA2IC8qIEZvciBTRVJERVMgb3V0cHV0IGFtcGxpdHVkZSBhZGp1c3RtZW50LiAqLworI2RlZmluZSBFRVBST01fSU5JVF9DT05UUk9MMV9SRUcgICAweDAwMEEKKyNkZWZpbmUgRUVQUk9NX0lOSVRfQ09OVFJPTDJfUkVHICAgMHgwMDBGCisjZGVmaW5lIEVFUFJPTV9JTklUX0NPTlRST0wzX1BPUlRfQiAgIDB4MDAxNAorI2RlZmluZSBFRVBST01fSU5JVF9DT05UUk9MM19QT1JUX0EgICAweDAwMjQKKyNkZWZpbmUgRUVQUk9NX0NGRyAgICAgICAgICAgICAgICAgMHgwMDEyCisjZGVmaW5lIEVFUFJPTV9GTEFTSF9WRVJTSU9OICAgICAgIDB4MDAzMgorI2RlZmluZSBFRVBST01fQ0hFQ0tTVU1fUkVHICAgICAgICAweDAwM0YKKworLyogV29yZCBkZWZpbml0aW9ucyBmb3IgSUQgTEVEIFNldHRpbmdzICovCisjZGVmaW5lIElEX0xFRF9SRVNFUlZFRF8wMDAwIDB4MDAwMAorI2RlZmluZSBJRF9MRURfUkVTRVJWRURfRkZGRiAweEZGRkYKKyNkZWZpbmUgSURfTEVEX0RFRkFVTFQgICAgICAgKChJRF9MRURfT0ZGMV9PTjIgPDwgMTIpIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKElEX0xFRF9PRkYxX09GRjIgPDwgOCkgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoSURfTEVEX0RFRjFfREVGMiA8PCA0KSB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChJRF9MRURfREVGMV9ERUYyKSkKKyNkZWZpbmUgSURfTEVEX0RFRjFfREVGMiAgICAgMHgxCisjZGVmaW5lIElEX0xFRF9ERUYxX09OMiAgICAgIDB4MgorI2RlZmluZSBJRF9MRURfREVGMV9PRkYyICAgICAweDMKKyNkZWZpbmUgSURfTEVEX09OMV9ERUYyICAgICAgMHg0CisjZGVmaW5lIElEX0xFRF9PTjFfT04yICAgICAgIDB4NQorI2RlZmluZSBJRF9MRURfT04xX09GRjIgICAgICAweDYKKyNkZWZpbmUgSURfTEVEX09GRjFfREVGMiAgICAgMHg3CisjZGVmaW5lIElEX0xFRF9PRkYxX09OMiAgICAgIDB4OAorI2RlZmluZSBJRF9MRURfT0ZGMV9PRkYyICAgICAweDkKKworI2RlZmluZSBJR1BfQUNUSVZJVFlfTEVEX01BU0sgICAweEZGRkZGMEZGCisjZGVmaW5lIElHUF9BQ1RJVklUWV9MRURfRU5BQkxFIDB4MDMwMAorI2RlZmluZSBJR1BfTEVEM19NT0RFICAgICAgICAgICAweDA3MDAwMDAwCisKKworLyogTWFzayBiaXRzIGZvciBTRVJERVMgYW1wbGl0dWRlIGFkanVzdG1lbnQgaW4gV29yZCA2IG9mIHRoZSBFRVBST00gKi8KKyNkZWZpbmUgRUVQUk9NX1NFUkRFU19BTVBMSVRVREVfTUFTSyAgMHgwMDBGCisKKy8qIE1hc2sgYml0cyBmb3IgZmllbGRzIGluIFdvcmQgMHgwYSBvZiB0aGUgRUVQUk9NICovCisjZGVmaW5lIEVFUFJPTV9XT1JEMEFfSUxPUyAgIDB4MDAxMAorI2RlZmluZSBFRVBST01fV09SRDBBX1NXRFBJTyAweDAxRTAKKyNkZWZpbmUgRUVQUk9NX1dPUkQwQV9MUlNUICAgMHgwMjAwCisjZGVmaW5lIEVFUFJPTV9XT1JEMEFfRkQgICAgIDB4MDQwMAorI2RlZmluZSBFRVBST01fV09SRDBBXzY2TUhaICAweDA4MDAKKworLyogTWFzayBiaXRzIGZvciBmaWVsZHMgaW4gV29yZCAweDBmIG9mIHRoZSBFRVBST00gKi8KKyNkZWZpbmUgRUVQUk9NX1dPUkQwRl9QQVVTRV9NQVNLIDB4MzAwMAorI2RlZmluZSBFRVBST01fV09SRDBGX1BBVVNFICAgICAgMHgxMDAwCisjZGVmaW5lIEVFUFJPTV9XT1JEMEZfQVNNX0RJUiAgICAweDIwMDAKKyNkZWZpbmUgRUVQUk9NX1dPUkQwRl9BTkUgICAgICAgIDB4MDgwMAorI2RlZmluZSBFRVBST01fV09SRDBGX1NXUERJT19FWFQgMHgwMEYwCisKKy8qIEZvciBjaGVja3N1bW1pbmcsIHRoZSBzdW0gb2YgYWxsIHdvcmRzIGluIHRoZSBFRVBST00gc2hvdWxkIGVxdWFsIDB4QkFCQS4gKi8KKyNkZWZpbmUgRUVQUk9NX1NVTSAweEJBQkEKKworLyogRUVQUk9NIE1hcCBkZWZpbmVzIChXT1JEIE9GRlNFVFMpKi8KKyNkZWZpbmUgRUVQUk9NX05PREVfQUREUkVTU19CWVRFXzAgMAorI2RlZmluZSBFRVBST01fUEJBX0JZVEVfMSAgICAgICAgICA4CisKKyNkZWZpbmUgRUVQUk9NX1JFU0VSVkVEX1dPUkQgICAgICAgICAgMHhGRkZGCisKKy8qIEVFUFJPTSBNYXAgU2l6ZXMgKEJ5dGUgQ291bnRzKSAqLworI2RlZmluZSBQQkFfU0laRSA0CisKKy8qIENvbGxpc2lvbiByZWxhdGVkIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycyAqLworI2RlZmluZSBFMTAwMF9DT0xMSVNJT05fVEhSRVNIT0xEICAgICAgIDE2CisjZGVmaW5lIEUxMDAwX0NUX1NISUZUICAgICAgICAgICAgICAgICAgNAorI2RlZmluZSBFMTAwMF9DT0xMSVNJT05fRElTVEFOQ0UgICAgICAgIDY0CisjZGVmaW5lIEUxMDAwX0ZEWF9DT0xMSVNJT05fRElTVEFOQ0UgICAgRTEwMDBfQ09MTElTSU9OX0RJU1RBTkNFCisjZGVmaW5lIEUxMDAwX0hEWF9DT0xMSVNJT05fRElTVEFOQ0UgICAgRTEwMDBfQ09MTElTSU9OX0RJU1RBTkNFCisjZGVmaW5lIEUxMDAwX0NPTERfU0hJRlQgICAgICAgICAgICAgICAgMTIKKworLyogTnVtYmVyIG9mIFRyYW5zbWl0IGFuZCBSZWNlaXZlIERlc2NyaXB0b3JzIG11c3QgYmUgYSBtdWx0aXBsZSBvZiA4ICovCisjZGVmaW5lIFJFUV9UWF9ERVNDUklQVE9SX01VTFRJUExFICA4CisjZGVmaW5lIFJFUV9SWF9ERVNDUklQVE9SX01VTFRJUExFICA4CisKKy8qIERlZmF1bHQgdmFsdWVzIGZvciB0aGUgdHJhbnNtaXQgSVBHIHJlZ2lzdGVyICovCisjZGVmaW5lIERFRkFVTFRfODI1NDJfVElQR19JUEdUICAgICAgICAxMAorI2RlZmluZSBERUZBVUxUXzgyNTQzX1RJUEdfSVBHVF9GSUJFUiAgOQorI2RlZmluZSBERUZBVUxUXzgyNTQzX1RJUEdfSVBHVF9DT1BQRVIgOAorCisjZGVmaW5lIEUxMDAwX1RJUEdfSVBHVF9NQVNLICAweDAwMDAwM0ZGCisjZGVmaW5lIEUxMDAwX1RJUEdfSVBHUjFfTUFTSyAweDAwMEZGQzAwCisjZGVmaW5lIEUxMDAwX1RJUEdfSVBHUjJfTUFTSyAweDNGRjAwMDAwCisKKyNkZWZpbmUgREVGQVVMVF84MjU0Ml9USVBHX0lQR1IxIDIKKyNkZWZpbmUgREVGQVVMVF84MjU0M19USVBHX0lQR1IxIDgKKyNkZWZpbmUgRTEwMDBfVElQR19JUEdSMV9TSElGVCAgMTAKKworI2RlZmluZSBERUZBVUxUXzgyNTQyX1RJUEdfSVBHUjIgMTAKKyNkZWZpbmUgREVGQVVMVF84MjU0M19USVBHX0lQR1IyIDYKKyNkZWZpbmUgRTEwMDBfVElQR19JUEdSMl9TSElGVCAgMjAKKworI2RlZmluZSBFMTAwMF9UWERNQUNfRFBQIDB4MDAwMDAwMDEKKworLyogQWRhcHRpdmUgSUZTIGRlZmluZXMgKi8KKyNkZWZpbmUgVFhfVEhSRVNIT0xEX1NUQVJUICAgICA4CisjZGVmaW5lIFRYX1RIUkVTSE9MRF9JTkNSRU1FTlQgMTAKKyNkZWZpbmUgVFhfVEhSRVNIT0xEX0RFQ1JFTUVOVCAxCisjZGVmaW5lIFRYX1RIUkVTSE9MRF9TVE9QICAgICAgMTkwCisjZGVmaW5lIFRYX1RIUkVTSE9MRF9ESVNBQkxFICAgMAorI2RlZmluZSBUWF9USFJFU0hPTERfVElNRVJfTVMgIDEwMDAwCisjZGVmaW5lIE1JTl9OVU1fWE1JVFMgICAgICAgICAgMTAwMAorI2RlZmluZSBJRlNfTUFYICAgICAgICAgICAgICAgIDgwCisjZGVmaW5lIElGU19TVEVQICAgICAgICAgICAgICAgMTAKKyNkZWZpbmUgSUZTX01JTiAgICAgICAgICAgICAgICA0MAorI2RlZmluZSBJRlNfUkFUSU8gICAgICAgICAgICAgIDQKKworLyogUEJBIGNvbnN0YW50cyAqLworI2RlZmluZSBFMTAwMF9QQkFfMTZLIDB4MDAxMCAgICAvKiAxNktCLCBkZWZhdWx0IFRYIGFsbG9jYXRpb24gKi8KKyNkZWZpbmUgRTEwMDBfUEJBXzIySyAweDAwMTYKKyNkZWZpbmUgRTEwMDBfUEJBXzI0SyAweDAwMTgKKyNkZWZpbmUgRTEwMDBfUEJBXzMwSyAweDAwMUUKKyNkZWZpbmUgRTEwMDBfUEJBXzQwSyAweDAwMjgKKyNkZWZpbmUgRTEwMDBfUEJBXzQ4SyAweDAwMzAgICAgLyogNDhLQiwgZGVmYXVsdCBSWCBhbGxvY2F0aW9uICovCisKKy8qIEZsb3cgQ29udHJvbCBDb25zdGFudHMgKi8KKyNkZWZpbmUgRkxPV19DT05UUk9MX0FERFJFU1NfTE9XICAweDAwQzI4MDAxCisjZGVmaW5lIEZMT1dfQ09OVFJPTF9BRERSRVNTX0hJR0ggMHgwMDAwMDEwMAorI2RlZmluZSBGTE9XX0NPTlRST0xfVFlQRSAgICAgICAgIDB4ODgwOAorCisvKiBUaGUgaGlzdG9yaWNhbCBkZWZhdWx0cyBmb3IgdGhlIGZsb3cgY29udHJvbCB2YWx1ZXMgYXJlIGdpdmVuIGJlbG93LiAqLworI2RlZmluZSBGQ19ERUZBVUxUX0hJX1RIUkVTSCAgICAgICAgKDB4ODAwMCkgICAgLyogMzJLQiAqLworI2RlZmluZSBGQ19ERUZBVUxUX0xPX1RIUkVTSCAgICAgICAgKDB4NDAwMCkgICAgLyogMTZLQiAqLworI2RlZmluZSBGQ19ERUZBVUxUX1RYX1RJTUVSICAgICAgICAgKDB4MTAwKSAgICAgLyogfjEzMCB1cyAqLworCisvKiBQQ0lYIENvbmZpZyBzcGFjZSAqLworI2RlZmluZSBQQ0lYX0NPTU1BTkRfUkVHSVNURVIgICAgMHhFNgorI2RlZmluZSBQQ0lYX1NUQVRVU19SRUdJU1RFUl9MTyAgMHhFOAorI2RlZmluZSBQQ0lYX1NUQVRVU19SRUdJU1RFUl9ISSAgMHhFQQorCisjZGVmaW5lIFBDSVhfQ09NTUFORF9NTVJCQ19NQVNLICAgICAgMHgwMDBDCisjZGVmaW5lIFBDSVhfQ09NTUFORF9NTVJCQ19TSElGVCAgICAgMHgyCisjZGVmaW5lIFBDSVhfU1RBVFVTX0hJX01NUkJDX01BU0sgICAgMHgwMDYwCisjZGVmaW5lIFBDSVhfU1RBVFVTX0hJX01NUkJDX1NISUZUICAgMHg1CisjZGVmaW5lIFBDSVhfU1RBVFVTX0hJX01NUkJDXzRLICAgICAgMHgzCisjZGVmaW5lIFBDSVhfU1RBVFVTX0hJX01NUkJDXzJLICAgICAgMHgyCisKKworLyogTnVtYmVyIG9mIGJpdHMgcmVxdWlyZWQgdG8gc2hpZnQgcmlnaHQgdGhlICJwYXVzZSIgYml0cyBmcm9tIHRoZQorICogRUVQUk9NIChiaXRzIDEzOjEyKSB0byB0aGUgInBhdXNlIiAoYml0cyA4OjcpIGZpZWxkIGluIHRoZSBUWENXIHJlZ2lzdGVyLgorICovCisjZGVmaW5lIFBBVVNFX1NISUZUIDUKKworLyogTnVtYmVyIG9mIGJpdHMgcmVxdWlyZWQgdG8gc2hpZnQgbGVmdCB0aGUgIlNXRFBJTyIgYml0cyBmcm9tIHRoZQorICogRUVQUk9NIChiaXRzIDg6NSkgdG8gdGhlICJTV0RQSU8iIChiaXRzIDI1OjIyKSBmaWVsZCBpbiB0aGUgQ1RSTCByZWdpc3Rlci4KKyAqLworI2RlZmluZSBTV0RQSU9fU0hJRlQgMTcKKworLyogTnVtYmVyIG9mIGJpdHMgcmVxdWlyZWQgdG8gc2hpZnQgbGVmdCB0aGUgIlNXRFBJT19FWFQiIGJpdHMgZnJvbSB0aGUKKyAqIEVFUFJPTSB3b3JkIEYgKGJpdHMgNzo0KSB0byB0aGUgYml0cyAxMTo4IG9mIFRoZSBFeHRlbmRlZCBDVFJMIHJlZ2lzdGVyLgorICovCisjZGVmaW5lIFNXRFBJT19fRVhUX1NISUZUIDQKKworLyogTnVtYmVyIG9mIGJpdHMgcmVxdWlyZWQgdG8gc2hpZnQgbGVmdCB0aGUgIklMT1MiIGJpdCBmcm9tIHRoZSBFRVBST00KKyAqIChiaXQgNCkgdG8gdGhlICJJTE9TIiAoYml0IDcpIGZpZWxkIGluIHRoZSBDVFJMIHJlZ2lzdGVyLgorICovCisjZGVmaW5lIElMT1NfU0hJRlQgIDMKKworCisjZGVmaW5lIFJFQ0VJVkVfQlVGRkVSX0FMSUdOX1NJWkUgICgyNTYpCisKKy8qIE51bWJlciBvZiBtaWxsaXNlY29uZHMgd2Ugd2FpdCBmb3IgYXV0by1uZWdvdGlhdGlvbiB0byBjb21wbGV0ZSAqLworI2RlZmluZSBMSU5LX1VQX1RJTUVPVVQgICAgICAgICAgICAgNTAwCisKKyNkZWZpbmUgRTEwMDBfVFhfQlVGRkVSX1NJWkUgKCh1aW50MzJfdCkxNTE0KQorCisvKiBUaGUgY2FycmllciBleHRlbnNpb24gc3ltYm9sLCBhcyByZWNlaXZlZCBieSB0aGUgTklDLiAqLworI2RlZmluZSBDQVJSSUVSX0VYVEVOU0lPTiAgIDB4MEYKKworLyogVEJJX0FDQ0VQVCBtYWNybyBkZWZpbml0aW9uOgorICoKKyAqIFRoaXMgbWFjcm8gcmVxdWlyZXM6CisgKiAgICAgIGFkYXB0ZXIgPSBhIHBvaW50ZXIgdG8gc3RydWN0IGUxMDAwX2h3IAorICogICAgICBzdGF0dXMgPSB0aGUgOCBiaXQgc3RhdHVzIGZpZWxkIG9mIHRoZSBSWCBkZXNjcmlwdG9yIHdpdGggRU9QIHNldAorICogICAgICBlcnJvciA9IHRoZSA4IGJpdCBlcnJvciBmaWVsZCBvZiB0aGUgUlggZGVzY3JpcHRvciB3aXRoIEVPUCBzZXQKKyAqICAgICAgbGVuZ3RoID0gdGhlIHN1bSBvZiBhbGwgdGhlIGxlbmd0aCBmaWVsZHMgb2YgdGhlIFJYIGRlc2NyaXB0b3JzIHRoYXQKKyAqICAgICAgICAgICAgICAgbWFrZSB1cCB0aGUgY3VycmVudCBmcmFtZQorICogICAgICBsYXN0X2J5dGUgPSB0aGUgbGFzdCBieXRlIG9mIHRoZSBmcmFtZSBETUFlZCBieSB0aGUgaGFyZHdhcmUKKyAqICAgICAgbWF4X2ZyYW1lX2xlbmd0aCA9IHRoZSBtYXhpbXVtIGZyYW1lIGxlbmd0aCB3ZSB3YW50IHRvIGFjY2VwdC4KKyAqICAgICAgbWluX2ZyYW1lX2xlbmd0aCA9IHRoZSBtaW5pbXVtIGZyYW1lIGxlbmd0aCB3ZSB3YW50IHRvIGFjY2VwdC4KKyAqCisgKiBUaGlzIG1hY3JvIGlzIGEgY29uZGl0aW9uYWwgdGhhdCBzaG91bGQgYmUgdXNlZCBpbiB0aGUgaW50ZXJydXB0IAorICogaGFuZGxlcidzIFJ4IHByb2Nlc3Npbmcgcm91dGluZSB3aGVuIFJ4RXJyb3JzIGhhdmUgYmVlbiBkZXRlY3RlZC4KKyAqCisgKiBUeXBpY2FsIHVzZToKKyAqICAuLi4KKyAqICBpZiAoVEJJX0FDQ0VQVCkgeworICogICAgICBhY2NlcHRfZnJhbWUgPSBUUlVFOworICogICAgICBlMTAwMF90YmlfYWRqdXN0X3N0YXRzKGFkYXB0ZXIsIE1hY0FkZHJlc3MpOworICogICAgICBmcmFtZV9sZW5ndGgtLTsKKyAqICB9IGVsc2UgeworICogICAgICBhY2NlcHRfZnJhbWUgPSBGQUxTRTsKKyAqICB9CisgKiAgLi4uCisgKi8KKworI2RlZmluZSBUQklfQUNDRVBUKGFkYXB0ZXIsIHN0YXR1cywgZXJyb3JzLCBsZW5ndGgsIGxhc3RfYnl0ZSkgXAorICAgICgoYWRhcHRlciktPnRiaV9jb21wYXRpYmlsaXR5X29uICYmIFwKKyAgICAgKCgoZXJyb3JzKSAmIEUxMDAwX1JYRF9FUlJfRlJBTUVfRVJSX01BU0spID09IEUxMDAwX1JYRF9FUlJfQ0UpICYmIFwKKyAgICAgKChsYXN0X2J5dGUpID09IENBUlJJRVJfRVhURU5TSU9OKSAmJiBcCisgICAgICgoKHN0YXR1cykgJiBFMTAwMF9SWERfU1RBVF9WUCkgPyBcCisgICAgICAgICAgKCgobGVuZ3RoKSA+ICgoYWRhcHRlciktPm1pbl9mcmFtZV9zaXplIC0gVkxBTl9UQUdfU0laRSkpICYmIFwKKyAgICAgICAgICAgKChsZW5ndGgpIDw9ICgoYWRhcHRlciktPm1heF9mcmFtZV9zaXplICsgMSkpKSA6IFwKKyAgICAgICAgICAoKChsZW5ndGgpID4gKGFkYXB0ZXIpLT5taW5fZnJhbWVfc2l6ZSkgJiYgXAorICAgICAgICAgICAoKGxlbmd0aCkgPD0gKChhZGFwdGVyKS0+bWF4X2ZyYW1lX3NpemUgKyBWTEFOX1RBR19TSVpFICsgMSkpKSkpCisKKworLyogU3RydWN0dXJlcywgZW51bXMsIGFuZCBtYWNyb3MgZm9yIHRoZSBQSFkgKi8KKworLyogQml0IGRlZmluaXRpb25zIGZvciB0aGUgTWFuYWdlbWVudCBEYXRhIElPIChNRElPKSBhbmQgTWFuYWdlbWVudCBEYXRhCisgKiBDbG9jayAoTURDKSBwaW5zIGluIHRoZSBEZXZpY2UgQ29udHJvbCBSZWdpc3Rlci4KKyAqLworI2RlZmluZSBFMTAwMF9DVFJMX1BIWV9SRVNFVF9ESVIgIEUxMDAwX0NUUkxfU1dEUElPMAorI2RlZmluZSBFMTAwMF9DVFJMX1BIWV9SRVNFVCAgICAgIEUxMDAwX0NUUkxfU1dEUElOMAorI2RlZmluZSBFMTAwMF9DVFJMX01ESU9fRElSICAgICAgIEUxMDAwX0NUUkxfU1dEUElPMgorI2RlZmluZSBFMTAwMF9DVFJMX01ESU8gICAgICAgICAgIEUxMDAwX0NUUkxfU1dEUElOMgorI2RlZmluZSBFMTAwMF9DVFJMX01EQ19ESVIgICAgICAgIEUxMDAwX0NUUkxfU1dEUElPMworI2RlZmluZSBFMTAwMF9DVFJMX01EQyAgICAgICAgICAgIEUxMDAwX0NUUkxfU1dEUElOMworI2RlZmluZSBFMTAwMF9DVFJMX1BIWV9SRVNFVF9ESVI0IEUxMDAwX0NUUkxfRVhUX1NEUDRfRElSCisjZGVmaW5lIEUxMDAwX0NUUkxfUEhZX1JFU0VUNCAgICAgRTEwMDBfQ1RSTF9FWFRfU0RQNF9EQVRBCisKKy8qIFBIWSAxMDAwIE1JSSBSZWdpc3Rlci9CaXQgRGVmaW5pdGlvbnMgKi8KKy8qIFBIWSBSZWdpc3RlcnMgZGVmaW5lZCBieSBJRUVFICovCisjZGVmaW5lIFBIWV9DVFJMICAgICAgICAgMHgwMCAvKiBDb250cm9sIFJlZ2lzdGVyICovCisjZGVmaW5lIFBIWV9TVEFUVVMgICAgICAgMHgwMSAvKiBTdGF0dXMgUmVnaXNlciAqLworI2RlZmluZSBQSFlfSUQxICAgICAgICAgIDB4MDIgLyogUGh5IElkIFJlZyAod29yZCAxKSAqLworI2RlZmluZSBQSFlfSUQyICAgICAgICAgIDB4MDMgLyogUGh5IElkIFJlZyAod29yZCAyKSAqLworI2RlZmluZSBQSFlfQVVUT05FR19BRFYgIDB4MDQgLyogQXV0b25lZyBBZHZlcnRpc2VtZW50ICovCisjZGVmaW5lIFBIWV9MUF9BQklMSVRZICAgMHgwNSAvKiBMaW5rIFBhcnRuZXIgQWJpbGl0eSAoQmFzZSBQYWdlKSAqLworI2RlZmluZSBQSFlfQVVUT05FR19FWFAgIDB4MDYgLyogQXV0b25lZyBFeHBhbnNpb24gUmVnICovCisjZGVmaW5lIFBIWV9ORVhUX1BBR0VfVFggMHgwNyAvKiBOZXh0IFBhZ2UgVFggKi8KKyNkZWZpbmUgUEhZX0xQX05FWFRfUEFHRSAweDA4IC8qIExpbmsgUGFydG5lciBOZXh0IFBhZ2UgKi8KKyNkZWZpbmUgUEhZXzEwMDBUX0NUUkwgICAweDA5IC8qIDEwMDBCYXNlLVQgQ29udHJvbCBSZWcgKi8KKyNkZWZpbmUgUEhZXzEwMDBUX1NUQVRVUyAweDBBIC8qIDEwMDBCYXNlLVQgU3RhdHVzIFJlZyAqLworI2RlZmluZSBQSFlfRVhUX1NUQVRVUyAgIDB4MEYgLyogRXh0ZW5kZWQgU3RhdHVzIFJlZyAqLworCisvKiBNODhFMTAwMCBTcGVjaWZpYyBSZWdpc3RlcnMgKi8KKyNkZWZpbmUgTTg4RTEwMDBfUEhZX1NQRUNfQ1RSTCAgICAgMHgxMCAgLyogUEhZIFNwZWNpZmljIENvbnRyb2wgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgTTg4RTEwMDBfUEhZX1NQRUNfU1RBVFVTICAgMHgxMSAgLyogUEhZIFNwZWNpZmljIFN0YXR1cyBSZWdpc3RlciAqLworI2RlZmluZSBNODhFMTAwMF9JTlRfRU5BQkxFICAgICAgICAweDEyICAvKiBJbnRlcnJ1cHQgRW5hYmxlIFJlZ2lzdGVyICovCisjZGVmaW5lIE04OEUxMDAwX0lOVF9TVEFUVVMgICAgICAgIDB4MTMgIC8qIEludGVycnVwdCBTdGF0dXMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgTTg4RTEwMDBfRVhUX1BIWV9TUEVDX0NUUkwgMHgxNCAgLyogRXh0ZW5kZWQgUEhZIFNwZWNpZmljIENvbnRyb2wgKi8KKyNkZWZpbmUgTTg4RTEwMDBfUlhfRVJSX0NOVFIgICAgICAgMHgxNSAgLyogUmVjZWl2ZSBFcnJvciBDb3VudGVyICovCisKKyNkZWZpbmUgTTg4RTEwMDBfUEhZX0VYVF9DVFJMICAgICAgMHgxQSAgLyogUEhZIGV4dGVuZCBjb250cm9sIHJlZ2lzdGVyICovCisjZGVmaW5lIE04OEUxMDAwX1BIWV9QQUdFX1NFTEVDVCAgIDB4MUQgIC8qIFJlZyAyOSBmb3IgcGFnZSBudW1iZXIgc2V0dGluZyAqLworI2RlZmluZSBNODhFMTAwMF9QSFlfR0VOX0NPTlRST0wgICAweDFFICAvKiBJdHMgbWVhbmluZyBkZXBlbmRzIG9uIHJlZyAyOSAqLworI2RlZmluZSBNODhFMTAwMF9QSFlfVkNPX1JFR19CSVQ4ICAweDEwMCAvKiBCaXRzIDggJiAxMSBhcmUgYWRqdXN0ZWQgZm9yICovCisjZGVmaW5lIE04OEUxMDAwX1BIWV9WQ09fUkVHX0JJVDExIDB4ODAwICAgIC8qIGltcHJvdmVkIEJFUiBwZXJmb3JtYW5jZSAqLworCisjZGVmaW5lIElHUDAxRTEwMDBfSUVFRV9SRUdTX1BBR0UgIDB4MDAwMAorI2RlZmluZSBJR1AwMUUxMDAwX0lFRUVfUkVTVEFSVF9BVVRPTkVHIDB4MzMwMAorI2RlZmluZSBJR1AwMUUxMDAwX0lFRUVfRk9SQ0VfR0lHQSAgICAgIDB4MDE0MAorCisvKiBJR1AwMUUxMDAwIFNwZWNpZmljIFJlZ2lzdGVycyAqLworI2RlZmluZSBJR1AwMUUxMDAwX1BIWV9QT1JUX0NPTkZJRyAweDEwIC8qIFBIWSBTcGVjaWZpYyBQb3J0IENvbmZpZyBSZWdpc3RlciAqLworI2RlZmluZSBJR1AwMUUxMDAwX1BIWV9QT1JUX1NUQVRVUyAweDExIC8qIFBIWSBTcGVjaWZpYyBTdGF0dXMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgSUdQMDFFMTAwMF9QSFlfUE9SVF9DVFJMICAgMHgxMiAvKiBQSFkgU3BlY2lmaWMgQ29udHJvbCBSZWdpc3RlciAqLworI2RlZmluZSBJR1AwMUUxMDAwX1BIWV9MSU5LX0hFQUxUSCAweDEzIC8qIFBIWSBMaW5rIEhlYWx0aCBSZWdpc3RlciAqLworI2RlZmluZSBJR1AwMUUxMDAwX0dNSUlfRklGTyAgICAgICAweDE0IC8qIEdNSUkgRklGTyBSZWdpc3RlciAqLworI2RlZmluZSBJR1AwMUUxMDAwX1BIWV9DSEFOTkVMX1FVQUxJVFkgMHgxNSAvKiBQSFkgQ2hhbm5lbCBRdWFsaXR5IFJlZ2lzdGVyICovCisjZGVmaW5lIElHUDAxRTEwMDBfUEhZX1BBR0VfU0VMRUNUICAgICAweDFGIC8qIFBIWSBQYWdlIFNlbGVjdCBDb3JlIFJlZ2lzdGVyICovCisKKy8qIElHUDAxRTEwMDAgQUdDIFJlZ2lzdGVycyAtIHN0b3JlcyB0aGUgY2FibGUgbGVuZ3RoIHZhbHVlcyovCisjZGVmaW5lIElHUDAxRTEwMDBfUEhZX0FHQ19BICAgICAgICAweDExNzIKKyNkZWZpbmUgSUdQMDFFMTAwMF9QSFlfQUdDX0IgICAgICAgIDB4MTI3MgorI2RlZmluZSBJR1AwMUUxMDAwX1BIWV9BR0NfQyAgICAgICAgMHgxNDcyCisjZGVmaW5lIElHUDAxRTEwMDBfUEhZX0FHQ19EICAgICAgICAweDE4NzIKKworLyogSUdQMDFFMTAwMCBEU1AgUmVzZXQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgSUdQMDFFMTAwMF9QSFlfRFNQX1JFU0VUICAgMHgxRjMzCisjZGVmaW5lIElHUDAxRTEwMDBfUEhZX0RTUF9TRVQgICAgIDB4MUY3MQorI2RlZmluZSBJR1AwMUUxMDAwX1BIWV9EU1BfRkZFICAgICAweDFGMzUKKworI2RlZmluZSBJR1AwMUUxMDAwX1BIWV9DSEFOTkVMX05VTSAgICA0CisjZGVmaW5lIElHUDAxRTEwMDBfUEhZX0FHQ19QQVJBTV9BICAgIDB4MTE3MQorI2RlZmluZSBJR1AwMUUxMDAwX1BIWV9BR0NfUEFSQU1fQiAgICAweDEyNzEKKyNkZWZpbmUgSUdQMDFFMTAwMF9QSFlfQUdDX1BBUkFNX0MgICAgMHgxNDcxCisjZGVmaW5lIElHUDAxRTEwMDBfUEhZX0FHQ19QQVJBTV9EICAgIDB4MTg3MQorCisjZGVmaW5lIElHUDAxRTEwMDBfUEhZX0VEQUNfTVVfSU5ERVggICAgICAgIDB4QzAwMAorI2RlZmluZSBJR1AwMUUxMDAwX1BIWV9FREFDX1NJR05fRVhUXzlfQklUUyAweDgwMDAKKworI2RlZmluZSBJR1AwMUUxMDAwX1BIWV9BTkFMT0dfVFhfU1RBVEUgICAgICAweDI4OTAKKyNkZWZpbmUgSUdQMDFFMTAwMF9QSFlfQU5BTE9HX0NMQVNTX0EgICAgICAgMHgyMDAwCisjZGVmaW5lIElHUDAxRTEwMDBfUEhZX0ZPUkNFX0FOQUxPR19FTkFCTEUgIDB4MDAwNAorI2RlZmluZSBJR1AwMUUxMDAwX1BIWV9EU1BfRkZFX0NNX0NQICAgICAgICAweDAwNjkKKworI2RlZmluZSBJR1AwMUUxMDAwX1BIWV9EU1BfRkZFX0RFRkFVTFQgICAgICAweDAwMkEKKy8qIElHUDAxRTEwMDAgUENTIEluaXRpYWxpemF0aW9uIHJlZ2lzdGVyIC0gc3RvcmVzIHRoZSBwb2xhcml0eSBzdGF0dXMgd2hlbgorICogc3BlZWQgPSAxMDAwIE1icHMuICovCisjZGVmaW5lIElHUDAxRTEwMDBfUEhZX1BDU19JTklUX1JFRyAgMHgwMEI0CisjZGVmaW5lIElHUDAxRTEwMDBfUEhZX1BDU19DVFJMX1JFRyAgMHgwMEI1CisKKyNkZWZpbmUgSUdQMDFFMTAwMF9BTkFMT0dfUkVHU19QQUdFICAweDIwQzAKKyAgCisjZGVmaW5lIE1BWF9QSFlfUkVHX0FERFJFU1MgMHgxRiAgICAgICAgLyogNSBiaXQgYWRkcmVzcyBidXMgKDAtMHgxRikgKi8KKyNkZWZpbmUgTUFYX1BIWV9NVUxUSV9QQUdFX1JFRyAgMHhGICAgICAvKlJlZ2lzdGVycyB0aGF0IGFyZSBlcXVhbCBvbiBhbGwgcGFnZXMqLworLyogUEhZIENvbnRyb2wgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgTUlJX0NSX1NQRUVEX1NFTEVDVF9NU0IgMHgwMDQwICAvKiBiaXRzIDYsMTM6IDEwPTEwMDAsIDAxPTEwMCwgMDA9MTAgKi8KKyNkZWZpbmUgTUlJX0NSX0NPTExfVEVTVF9FTkFCTEUgMHgwMDgwICAvKiBDb2xsaXNpb24gdGVzdCBlbmFibGUgKi8KKyNkZWZpbmUgTUlJX0NSX0ZVTExfRFVQTEVYICAgICAgMHgwMTAwICAvKiBGRFggPTEsIGhhbGYgZHVwbGV4ID0wICovCisjZGVmaW5lIE1JSV9DUl9SRVNUQVJUX0FVVE9fTkVHIDB4MDIwMCAgLyogUmVzdGFydCBhdXRvIG5lZ290aWF0aW9uICovCisjZGVmaW5lIE1JSV9DUl9JU09MQVRFICAgICAgICAgIDB4MDQwMCAgLyogSXNvbGF0ZSBQSFkgZnJvbSBNSUkgKi8KKyNkZWZpbmUgTUlJX0NSX1BPV0VSX0RPV04gICAgICAgMHgwODAwICAvKiBQb3dlciBkb3duICovCisjZGVmaW5lIE1JSV9DUl9BVVRPX05FR19FTiAgICAgIDB4MTAwMCAgLyogQXV0byBOZWcgRW5hYmxlICovCisjZGVmaW5lIE1JSV9DUl9TUEVFRF9TRUxFQ1RfTFNCIDB4MjAwMCAgLyogYml0cyA2LDEzOiAxMD0xMDAwLCAwMT0xMDAsIDAwPTEwICovCisjZGVmaW5lIE1JSV9DUl9MT09QQkFDSyAgICAgICAgIDB4NDAwMCAgLyogMCA9IG5vcm1hbCwgMSA9IGxvb3BiYWNrICovCisjZGVmaW5lIE1JSV9DUl9SRVNFVCAgICAgICAgICAgIDB4ODAwMCAgLyogMCA9IG5vcm1hbCwgMSA9IFBIWSByZXNldCAqLworCisvKiBQSFkgU3RhdHVzIFJlZ2lzdGVyICovCisjZGVmaW5lIE1JSV9TUl9FWFRFTkRFRF9DQVBTICAgICAweDAwMDEgLyogRXh0ZW5kZWQgcmVnaXN0ZXIgY2FwYWJpbGl0aWVzICovCisjZGVmaW5lIE1JSV9TUl9KQUJCRVJfREVURUNUICAgICAweDAwMDIgLyogSmFiYmVyIERldGVjdGVkICovCisjZGVmaW5lIE1JSV9TUl9MSU5LX1NUQVRVUyAgICAgICAweDAwMDQgLyogTGluayBTdGF0dXMgMSA9IGxpbmsgKi8KKyNkZWZpbmUgTUlJX1NSX0FVVE9ORUdfQ0FQUyAgICAgIDB4MDAwOCAvKiBBdXRvIE5lZyBDYXBhYmxlICovCisjZGVmaW5lIE1JSV9TUl9SRU1PVEVfRkFVTFQgICAgICAweDAwMTAgLyogUmVtb3RlIEZhdWx0IERldGVjdCAqLworI2RlZmluZSBNSUlfU1JfQVVUT05FR19DT01QTEVURSAgMHgwMDIwIC8qIEF1dG8gTmVnIENvbXBsZXRlICovCisjZGVmaW5lIE1JSV9TUl9QUkVBTUJMRV9TVVBQUkVTUyAweDAwNDAgLyogUHJlYW1ibGUgbWF5IGJlIHN1cHByZXNzZWQgKi8KKyNkZWZpbmUgTUlJX1NSX0VYVEVOREVEX1NUQVRVUyAgIDB4MDEwMCAvKiBFeHQuIHN0YXR1cyBpbmZvIGluIFJlZyAweDBGICovCisjZGVmaW5lIE1JSV9TUl8xMDBUMl9IRF9DQVBTICAgICAweDAyMDAgLyogMTAwVDIgSGFsZiBEdXBsZXggQ2FwYWJsZSAqLworI2RlZmluZSBNSUlfU1JfMTAwVDJfRkRfQ0FQUyAgICAgMHgwNDAwIC8qIDEwMFQyIEZ1bGwgRHVwbGV4IENhcGFibGUgKi8KKyNkZWZpbmUgTUlJX1NSXzEwVF9IRF9DQVBTICAgICAgIDB4MDgwMCAvKiAxMFQgICBIYWxmIER1cGxleCBDYXBhYmxlICovCisjZGVmaW5lIE1JSV9TUl8xMFRfRkRfQ0FQUyAgICAgICAweDEwMDAgLyogMTBUICAgRnVsbCBEdXBsZXggQ2FwYWJsZSAqLworI2RlZmluZSBNSUlfU1JfMTAwWF9IRF9DQVBTICAgICAgMHgyMDAwIC8qIDEwMFggIEhhbGYgRHVwbGV4IENhcGFibGUgKi8KKyNkZWZpbmUgTUlJX1NSXzEwMFhfRkRfQ0FQUyAgICAgIDB4NDAwMCAvKiAxMDBYICBGdWxsIER1cGxleCBDYXBhYmxlICovCisjZGVmaW5lIE1JSV9TUl8xMDBUNF9DQVBTICAgICAgICAweDgwMDAgLyogMTAwVDQgQ2FwYWJsZSAqLworCisvKiBBdXRvbmVnIEFkdmVydGlzZW1lbnQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgTldBWV9BUl9TRUxFQ1RPUl9GSUVMRCAweDAwMDEgICAvKiBpbmRpY2F0ZXMgSUVFRSA4MDIuMyBDU01BL0NEICovCisjZGVmaW5lIE5XQVlfQVJfMTBUX0hEX0NBUFMgICAgMHgwMDIwICAgLyogMTBUICAgSGFsZiBEdXBsZXggQ2FwYWJsZSAqLworI2RlZmluZSBOV0FZX0FSXzEwVF9GRF9DQVBTICAgIDB4MDA0MCAgIC8qIDEwVCAgIEZ1bGwgRHVwbGV4IENhcGFibGUgKi8KKyNkZWZpbmUgTldBWV9BUl8xMDBUWF9IRF9DQVBTICAweDAwODAgICAvKiAxMDBUWCBIYWxmIER1cGxleCBDYXBhYmxlICovCisjZGVmaW5lIE5XQVlfQVJfMTAwVFhfRkRfQ0FQUyAgMHgwMTAwICAgLyogMTAwVFggRnVsbCBEdXBsZXggQ2FwYWJsZSAqLworI2RlZmluZSBOV0FZX0FSXzEwMFQ0X0NBUFMgICAgIDB4MDIwMCAgIC8qIDEwMFQ0IENhcGFibGUgKi8KKyNkZWZpbmUgTldBWV9BUl9QQVVTRSAgICAgICAgICAweDA0MDAgICAvKiBQYXVzZSBvcGVyYXRpb24gZGVzaXJlZCAqLworI2RlZmluZSBOV0FZX0FSX0FTTV9ESVIgICAgICAgIDB4MDgwMCAgIC8qIEFzeW1tZXRyaWMgUGF1c2UgRGlyZWN0aW9uIGJpdCAqLworI2RlZmluZSBOV0FZX0FSX1JFTU9URV9GQVVMVCAgIDB4MjAwMCAgIC8qIFJlbW90ZSBGYXVsdCBkZXRlY3RlZCAqLworI2RlZmluZSBOV0FZX0FSX05FWFRfUEFHRSAgICAgIDB4ODAwMCAgIC8qIE5leHQgUGFnZSBhYmlsaXR5IHN1cHBvcnRlZCAqLworCisvKiBMaW5rIFBhcnRuZXIgQWJpbGl0eSBSZWdpc3RlciAoQmFzZSBQYWdlKSAqLworI2RlZmluZSBOV0FZX0xQQVJfU0VMRUNUT1JfRklFTEQgMHgwMDAwIC8qIExQIHByb3RvY29sIHNlbGVjdG9yIGZpZWxkICovCisjZGVmaW5lIE5XQVlfTFBBUl8xMFRfSERfQ0FQUyAgICAweDAwMjAgLyogTFAgaXMgMTBUICAgSGFsZiBEdXBsZXggQ2FwYWJsZSAqLworI2RlZmluZSBOV0FZX0xQQVJfMTBUX0ZEX0NBUFMgICAgMHgwMDQwIC8qIExQIGlzIDEwVCAgIEZ1bGwgRHVwbGV4IENhcGFibGUgKi8KKyNkZWZpbmUgTldBWV9MUEFSXzEwMFRYX0hEX0NBUFMgIDB4MDA4MCAvKiBMUCBpcyAxMDBUWCBIYWxmIER1cGxleCBDYXBhYmxlICovCisjZGVmaW5lIE5XQVlfTFBBUl8xMDBUWF9GRF9DQVBTICAweDAxMDAgLyogTFAgaXMgMTAwVFggRnVsbCBEdXBsZXggQ2FwYWJsZSAqLworI2RlZmluZSBOV0FZX0xQQVJfMTAwVDRfQ0FQUyAgICAgMHgwMjAwIC8qIExQIGlzIDEwMFQ0IENhcGFibGUgKi8KKyNkZWZpbmUgTldBWV9MUEFSX1BBVVNFICAgICAgICAgIDB4MDQwMCAvKiBMUCBQYXVzZSBvcGVyYXRpb24gZGVzaXJlZCAqLworI2RlZmluZSBOV0FZX0xQQVJfQVNNX0RJUiAgICAgICAgMHgwODAwIC8qIExQIEFzeW1tZXRyaWMgUGF1c2UgRGlyZWN0aW9uIGJpdCAqLworI2RlZmluZSBOV0FZX0xQQVJfUkVNT1RFX0ZBVUxUICAgMHgyMDAwIC8qIExQIGhhcyBkZXRlY3RlZCBSZW1vdGUgRmF1bHQgKi8KKyNkZWZpbmUgTldBWV9MUEFSX0FDS05PV0xFREdFICAgIDB4NDAwMCAvKiBMUCBoYXMgcngnZCBsaW5rIGNvZGUgd29yZCAqLworI2RlZmluZSBOV0FZX0xQQVJfTkVYVF9QQUdFICAgICAgMHg4MDAwIC8qIE5leHQgUGFnZSBhYmlsaXR5IHN1cHBvcnRlZCAqLworCisvKiBBdXRvbmVnIEV4cGFuc2lvbiBSZWdpc3RlciAqLworI2RlZmluZSBOV0FZX0VSX0xQX05XQVlfQ0FQUyAgICAgIDB4MDAwMSAvKiBMUCBoYXMgQXV0byBOZWcgQ2FwYWJpbGl0eSAqLworI2RlZmluZSBOV0FZX0VSX1BBR0VfUlhEICAgICAgICAgIDB4MDAwMiAvKiBMUCBpcyAxMFQgICBIYWxmIER1cGxleCBDYXBhYmxlICovCisjZGVmaW5lIE5XQVlfRVJfTkVYVF9QQUdFX0NBUFMgICAgMHgwMDA0IC8qIExQIGlzIDEwVCAgIEZ1bGwgRHVwbGV4IENhcGFibGUgKi8KKyNkZWZpbmUgTldBWV9FUl9MUF9ORVhUX1BBR0VfQ0FQUyAweDAwMDggLyogTFAgaXMgMTAwVFggSGFsZiBEdXBsZXggQ2FwYWJsZSAqLworI2RlZmluZSBOV0FZX0VSX1BBUl9ERVRFQ1RfRkFVTFQgIDB4MDAxMCAvKiBMUCBpcyAxMDBUWCBGdWxsIER1cGxleCBDYXBhYmxlICovCisKKy8qIE5leHQgUGFnZSBUWCBSZWdpc3RlciAqLworI2RlZmluZSBOUFRYX01TR19DT0RFX0ZJRUxEIDB4MDAwMSAvKiBOUCBtc2cgY29kZSBvciB1bmZvcm1hdHRlZCBkYXRhICovCisjZGVmaW5lIE5QVFhfVE9HR0xFICAgICAgICAgMHgwODAwIC8qIFRvZ2dsZXMgYmV0d2VlbiBleGNoYW5nZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogb2YgZGlmZmVyZW50IE5QCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBOUFRYX0FDS05PV0xER0UyICAgIDB4MTAwMCAvKiAxID0gd2lsbCBjb21wbHkgd2l0aCBtc2cKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogMCA9IGNhbm5vdCBjb21wbHkgd2l0aCBtc2cKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIE5QVFhfTVNHX1BBR0UgICAgICAgMHgyMDAwIC8qIGZvcm1hdHRlZCgxKS91bmZvcm1hdHRlZCgwKSBwZyAqLworI2RlZmluZSBOUFRYX05FWFRfUEFHRSAgICAgIDB4ODAwMCAvKiAxID0gYWRkaXRpb24gTlAgd2lsbCBmb2xsb3cgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIDAgPSBzZW5kaW5nIGxhc3QgTlAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKy8qIExpbmsgUGFydG5lciBOZXh0IFBhZ2UgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgTFBfUk5QUl9NU0dfQ09ERV9GSUVMRCAweDAwMDEgLyogTlAgbXNnIGNvZGUgb3IgdW5mb3JtYXR0ZWQgZGF0YSAqLworI2RlZmluZSBMUF9STlBSX1RPR0dMRSAgICAgICAgIDB4MDgwMCAvKiBUb2dnbGVzIGJldHdlZW4gZXhjaGFuZ2VzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIG9mIGRpZmZlcmVudCBOUAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTFBfUk5QUl9BQ0tOT1dMREdFMiAgICAweDEwMDAgLyogMSA9IHdpbGwgY29tcGx5IHdpdGggbXNnIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAwID0gY2Fubm90IGNvbXBseSB3aXRoIG1zZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTFBfUk5QUl9NU0dfUEFHRSAgICAgICAweDIwMDAgIC8qIGZvcm1hdHRlZCgxKS91bmZvcm1hdHRlZCgwKSBwZyAqLworI2RlZmluZSBMUF9STlBSX0FDS05PV0xER0UgICAgIDB4NDAwMCAgLyogMSA9IEFDSyAvIDAgPSBOTyBBQ0sgKi8KKyNkZWZpbmUgTFBfUk5QUl9ORVhUX1BBR0UgICAgICAweDgwMDAgIC8qIDEgPSBhZGRpdGlvbiBOUCB3aWxsIGZvbGxvdworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogMCA9IHNlbmRpbmcgbGFzdCBOUCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisvKiAxMDAwQkFTRS1UIENvbnRyb2wgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgQ1JfMTAwMFRfQVNZTV9QQVVTRSAgICAgIDB4MDA4MCAvKiBBZHZlcnRpc2UgYXN5bW1ldHJpYyBwYXVzZSBiaXQgKi8KKyNkZWZpbmUgQ1JfMTAwMFRfSERfQ0FQUyAgICAgICAgIDB4MDEwMCAvKiBBZHZlcnRpc2UgMTAwMFQgSEQgY2FwYWJpbGl0eSAqLworI2RlZmluZSBDUl8xMDAwVF9GRF9DQVBTICAgICAgICAgMHgwMjAwIC8qIEFkdmVydGlzZSAxMDAwVCBGRCBjYXBhYmlsaXR5ICAqLworI2RlZmluZSBDUl8xMDAwVF9SRVBFQVRFUl9EVEUgICAgMHgwNDAwIC8qIDE9UmVwZWF0ZXIvc3dpdGNoIGRldmljZSBwb3J0ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMD1EVEUgZGV2aWNlICovCisjZGVmaW5lIENSXzEwMDBUX01TX1ZBTFVFICAgICAgICAweDA4MDAgLyogMT1Db25maWd1cmUgUEhZIGFzIE1hc3RlciAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDA9Q29uZmlndXJlIFBIWSBhcyBTbGF2ZSAqLworI2RlZmluZSBDUl8xMDAwVF9NU19FTkFCTEUgICAgICAgMHgxMDAwIC8qIDE9TWFzdGVyL1NsYXZlIG1hbnVhbCBjb25maWcgdmFsdWUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAwPUF1dG9tYXRpYyBNYXN0ZXIvU2xhdmUgY29uZmlnICovCisjZGVmaW5lIENSXzEwMDBUX1RFU1RfTU9ERV9OT1JNQUwgMHgwMDAwIC8qIE5vcm1hbCBPcGVyYXRpb24gKi8KKyNkZWZpbmUgQ1JfMTAwMFRfVEVTVF9NT0RFXzEgICAgIDB4MjAwMCAvKiBUcmFuc21pdCBXYXZlZm9ybSB0ZXN0ICovCisjZGVmaW5lIENSXzEwMDBUX1RFU1RfTU9ERV8yICAgICAweDQwMDAgLyogTWFzdGVyIFRyYW5zbWl0IEppdHRlciB0ZXN0ICovCisjZGVmaW5lIENSXzEwMDBUX1RFU1RfTU9ERV8zICAgICAweDYwMDAgLyogU2xhdmUgVHJhbnNtaXQgSml0dGVyIHRlc3QgKi8KKyNkZWZpbmUgQ1JfMTAwMFRfVEVTVF9NT0RFXzQgICAgIDB4ODAwMCAvKiBUcmFuc21pdHRlciBEaXN0b3J0aW9uIHRlc3QgKi8KKworLyogMTAwMEJBU0UtVCBTdGF0dXMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgU1JfMTAwMFRfSURMRV9FUlJPUl9DTlQgICAweDAwRkYgLyogTnVtIGlkbGUgZXJyb3JzIHNpbmNlIGxhc3QgcmVhZCAqLworI2RlZmluZSBTUl8xMDAwVF9BU1lNX1BBVVNFX0RJUiAgIDB4MDEwMCAvKiBMUCBhc3ltbWV0cmljIHBhdXNlIGRpcmVjdGlvbiBiaXQgKi8KKyNkZWZpbmUgU1JfMTAwMFRfTFBfSERfQ0FQUyAgICAgICAweDA0MDAgLyogTFAgaXMgMTAwMFQgSEQgY2FwYWJsZSAqLworI2RlZmluZSBTUl8xMDAwVF9MUF9GRF9DQVBTICAgICAgIDB4MDgwMCAvKiBMUCBpcyAxMDAwVCBGRCBjYXBhYmxlICovCisjZGVmaW5lIFNSXzEwMDBUX1JFTU9URV9SWF9TVEFUVVMgMHgxMDAwIC8qIFJlbW90ZSByZWNlaXZlciBPSyAqLworI2RlZmluZSBTUl8xMDAwVF9MT0NBTF9SWF9TVEFUVVMgIDB4MjAwMCAvKiBMb2NhbCByZWNlaXZlciBPSyAqLworI2RlZmluZSBTUl8xMDAwVF9NU19DT05GSUdfUkVTICAgIDB4NDAwMCAvKiAxPUxvY2FsIFRYIGlzIE1hc3RlciwgMD1TbGF2ZSAqLworI2RlZmluZSBTUl8xMDAwVF9NU19DT05GSUdfRkFVTFQgIDB4ODAwMCAvKiBNYXN0ZXIvU2xhdmUgY29uZmlnIGZhdWx0ICovCisjZGVmaW5lIFNSXzEwMDBUX1JFTU9URV9SWF9TVEFUVVNfU0hJRlQgMTIKKyNkZWZpbmUgU1JfMTAwMFRfTE9DQUxfUlhfU1RBVFVTX1NISUZUICAxMworI2RlZmluZSBTUl8xMDAwVF9QSFlfRVhDRVNTSVZFX0lETEVfRVJSX0NPVU5UICAgIDUKKyNkZWZpbmUgRkZFX0lETEVfRVJSX0NPVU5UX1RJTUVPVVRfMjAgICAgICAgICAgICAyMAorI2RlZmluZSBGRkVfSURMRV9FUlJfQ09VTlRfVElNRU9VVF8xMDAgICAgICAgICAgIDEwMAorCisvKiBFeHRlbmRlZCBTdGF0dXMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgSUVFRV9FU1JfMTAwMFRfSERfQ0FQUyAweDEwMDAgLyogMTAwMFQgSEQgY2FwYWJsZSAqLworI2RlZmluZSBJRUVFX0VTUl8xMDAwVF9GRF9DQVBTIDB4MjAwMCAvKiAxMDAwVCBGRCBjYXBhYmxlICovCisjZGVmaW5lIElFRUVfRVNSXzEwMDBYX0hEX0NBUFMgMHg0MDAwIC8qIDEwMDBYIEhEIGNhcGFibGUgKi8KKyNkZWZpbmUgSUVFRV9FU1JfMTAwMFhfRkRfQ0FQUyAweDgwMDAgLyogMTAwMFggRkQgY2FwYWJsZSAqLworCisjZGVmaW5lIFBIWV9UWF9QT0xBUklUWV9NQVNLICAgMHgwMTAwIC8qIHJlZ2lzdGVyIDEwaCBiaXQgOCAocG9sYXJpdHkgYml0KSAqLworI2RlZmluZSBQSFlfVFhfTk9STUFMX1BPTEFSSVRZIDAgICAgICAvKiByZWdpc3RlciAxMGggYml0IDggKG5vcm1hbCBwb2xhcml0eSkgKi8KKworI2RlZmluZSBBVVRPX1BPTEFSSVRZX0RJU0FCTEUgIDB4MDAxMCAvKiByZWdpc3RlciAxMWggYml0IDQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKDA9ZW5hYmxlLCAxPWRpc2FibGUpICovCisKKy8qIE04OEUxMDAwIFBIWSBTcGVjaWZpYyBDb250cm9sIFJlZ2lzdGVyICovCisjZGVmaW5lIE04OEUxMDAwX1BTQ1JfSkFCQkVSX0RJU0FCTEUgICAgMHgwMDAxIC8qIDE9SmFiYmVyIEZ1bmN0aW9uIGRpc2FibGVkICovCisjZGVmaW5lIE04OEUxMDAwX1BTQ1JfUE9MQVJJVFlfUkVWRVJTQUwgMHgwMDAyIC8qIDE9UG9sYXJpdHkgUmV2ZXJzYWwgZW5hYmxlZCAqLworI2RlZmluZSBNODhFMTAwMF9QU0NSX1NRRV9URVNUICAgICAgICAgIDB4MDAwNCAvKiAxPVNRRSBUZXN0IGVuYWJsZWQgKi8KKyNkZWZpbmUgTTg4RTEwMDBfUFNDUl9DTEsxMjVfRElTQUJMRSAgICAweDAwMTAgLyogMT1DTEsxMjUgbG93LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogMD1DTEsxMjUgdG9nZ2xpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIE04OEUxMDAwX1BTQ1JfTURJX01BTlVBTF9NT0RFICAweDAwMDAgIC8qIE1ESSBDcm9zc292ZXIgTW9kZSBiaXRzIDY6NSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBNYW51YWwgTURJIGNvbmZpZ3VyYXRpb24gKi8KKyNkZWZpbmUgTTg4RTEwMDBfUFNDUl9NRElYX01BTlVBTF9NT0RFIDB4MDAyMCAgLyogTWFudWFsIE1ESVggY29uZmlndXJhdGlvbiAqLworI2RlZmluZSBNODhFMTAwMF9QU0NSX0FVVE9fWF8xMDAwVCAgICAgMHgwMDQwICAvKiAxMDAwQkFTRS1UOiBBdXRvIGNyb3Nzb3ZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogIDEwMEJBU0UtVFgvMTBCQVNFLVQ6IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgTURJIE1vZGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIE04OEUxMDAwX1BTQ1JfQVVUT19YX01PREUgICAgICAweDAwNjAgIC8qIEF1dG8gY3Jvc3NvdmVyIGVuYWJsZWQgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGFsbCBzcGVlZHMuIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTTg4RTEwMDBfUFNDUl8xMEJUX0VYVF9ESVNUX0VOQUJMRSAweDAwODAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMT1FbmFibGUgRXh0ZW5kZWQgMTBCQVNFLVQgZGlzdGFuY2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAoTG93ZXIgMTBCQVNFLVQgUlggVGhyZXNob2xkKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIDA9Tm9ybWFsIDEwQkFTRS1UIFJYIFRocmVzaG9sZCAqLworI2RlZmluZSBNODhFMTAwMF9QU0NSX01JSV81QklUX0VOQUJMRSAgICAgIDB4MDEwMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDE9NS1CaXQgaW50ZXJmYWNlIGluIDEwMEJBU0UtVFgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAwPU1JSSBpbnRlcmZhY2UgaW4gMTAwQkFTRS1UWCAqLworI2RlZmluZSBNODhFMTAwMF9QU0NSX1NDUkFNQkxFUl9ESVNBQkxFICAgIDB4MDIwMCAvKiAxPVNjcmFtYmxlciBkaXNhYmxlICovCisjZGVmaW5lIE04OEUxMDAwX1BTQ1JfRk9SQ0VfTElOS19HT09EICAgICAgMHgwNDAwIC8qIDE9Rm9yY2UgbGluayBnb29kICovCisjZGVmaW5lIE04OEUxMDAwX1BTQ1JfQVNTRVJUX0NSU19PTl9UWCAgICAgMHgwODAwIC8qIDE9QXNzZXJ0IENSUyBvbiBUcmFuc21pdCAqLworCisjZGVmaW5lIE04OEUxMDAwX1BTQ1JfUE9MQVJJVFlfUkVWRVJTQUxfU0hJRlQgICAgMQorI2RlZmluZSBNODhFMTAwMF9QU0NSX0FVVE9fWF9NT0RFX1NISUZUICAgICAgICAgIDUKKyNkZWZpbmUgTTg4RTEwMDBfUFNDUl8xMEJUX0VYVF9ESVNUX0VOQUJMRV9TSElGVCA3CisKKy8qIE04OEUxMDAwIFBIWSBTcGVjaWZpYyBTdGF0dXMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgTTg4RTEwMDBfUFNTUl9KQUJCRVIgICAgICAgICAgICAgMHgwMDAxIC8qIDE9SmFiYmVyICovCisjZGVmaW5lIE04OEUxMDAwX1BTU1JfUkVWX1BPTEFSSVRZICAgICAgIDB4MDAwMiAvKiAxPVBvbGFyaXR5IHJldmVyc2VkICovCisjZGVmaW5lIE04OEUxMDAwX1BTU1JfRE9XTlNISUZUICAgICAgICAgIDB4MDAyMCAvKiAxPURvd25zaGlmdGVkICovCisjZGVmaW5lIE04OEUxMDAwX1BTU1JfTURJWCAgICAgICAgICAgICAgIDB4MDA0MCAvKiAxPU1ESVg7IDA9TURJICovCisjZGVmaW5lIE04OEUxMDAwX1BTU1JfQ0FCTEVfTEVOR1RIICAgICAgIDB4MDM4MCAvKiAwPTw1ME07MT01MC04ME07Mj04MC0xMTBNOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIDM9MTEwLTE0ME07ND0+MTQwTSAqLworI2RlZmluZSBNODhFMTAwMF9QU1NSX0xJTksgICAgICAgICAgICAgICAweDA0MDAgLyogMT1MaW5rIHVwLCAwPUxpbmsgZG93biAqLworI2RlZmluZSBNODhFMTAwMF9QU1NSX1NQRF9EUExYX1JFU09MVkVEICAweDA4MDAgLyogMT1TcGVlZCAmIER1cGxleCByZXNvbHZlZCAqLworI2RlZmluZSBNODhFMTAwMF9QU1NSX1BBR0VfUkNWRCAgICAgICAgICAweDEwMDAgLyogMT1QYWdlIHJlY2VpdmVkICovCisjZGVmaW5lIE04OEUxMDAwX1BTU1JfRFBMWCAgICAgICAgICAgICAgIDB4MjAwMCAvKiAxPUR1cGxleCAwPUhhbGYgRHVwbGV4ICovCisjZGVmaW5lIE04OEUxMDAwX1BTU1JfU1BFRUQgICAgICAgICAgICAgIDB4QzAwMCAvKiBTcGVlZCwgYml0cyAxNDoxNSAqLworI2RlZmluZSBNODhFMTAwMF9QU1NSXzEwTUJTICAgICAgICAgICAgICAweDAwMDAgLyogMDA9MTBNYnMgKi8KKyNkZWZpbmUgTTg4RTEwMDBfUFNTUl8xMDBNQlMgICAgICAgICAgICAgMHg0MDAwIC8qIDAxPTEwME1icyAqLworI2RlZmluZSBNODhFMTAwMF9QU1NSXzEwMDBNQlMgICAgICAgICAgICAweDgwMDAgLyogMTA9MTAwME1icyAqLworCisjZGVmaW5lIE04OEUxMDAwX1BTU1JfUkVWX1BPTEFSSVRZX1NISUZUIDEKKyNkZWZpbmUgTTg4RTEwMDBfUFNTUl9ET1dOU0hJRlRfU0hJRlQgICAgNQorI2RlZmluZSBNODhFMTAwMF9QU1NSX01ESVhfU0hJRlQgICAgICAgICA2CisjZGVmaW5lIE04OEUxMDAwX1BTU1JfQ0FCTEVfTEVOR1RIX1NISUZUIDcKKworLyogTTg4RTEwMDAgRXh0ZW5kZWQgUEhZIFNwZWNpZmljIENvbnRyb2wgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgTTg4RTEwMDBfRVBTQ1JfRklCRVJfTE9PUEJBQ0sgMHg0MDAwIC8qIDE9RmliZXIgbG9vcGJhY2sgKi8KKyNkZWZpbmUgTTg4RTEwMDBfRVBTQ1JfRE9XTl9OT19JRExFICAgMHg4MDAwIC8qIDE9TG9zdCBsb2NrIGRldGVjdCBlbmFibGVkLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogV2lsbCBhc3NlcnQgbG9zdCBsb2NrIGFuZCBicmluZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogbGluayBkb3duIGlmIGlkbGUgbm90IHNlZW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHdpdGhpbiAxbXMgaW4gMTAwMEJBU0UtVCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogTnVtYmVyIG9mIHRpbWVzIHdlIHdpbGwgYXR0ZW1wdCB0byBhdXRvbmVnb3RpYXRlIGJlZm9yZSBkb3duc2hpZnRpbmcgaWYgd2UKKyAqIGFyZSB0aGUgbWFzdGVyICovCisjZGVmaW5lIE04OEUxMDAwX0VQU0NSX01BU1RFUl9ET1dOU0hJRlRfTUFTSyAweDBDMDAKKyNkZWZpbmUgTTg4RTEwMDBfRVBTQ1JfTUFTVEVSX0RPV05TSElGVF8xWCAgIDB4MDAwMCAgICAKKyNkZWZpbmUgTTg4RTEwMDBfRVBTQ1JfTUFTVEVSX0RPV05TSElGVF8yWCAgIDB4MDQwMAorI2RlZmluZSBNODhFMTAwMF9FUFNDUl9NQVNURVJfRE9XTlNISUZUXzNYICAgMHgwODAwCisjZGVmaW5lIE04OEUxMDAwX0VQU0NSX01BU1RFUl9ET1dOU0hJRlRfNFggICAweDBDMDAKKy8qIE51bWJlciBvZiB0aW1lcyB3ZSB3aWxsIGF0dGVtcHQgdG8gYXV0b25lZ290aWF0ZSBiZWZvcmUgZG93bnNoaWZ0aW5nIGlmIHdlCisgKiBhcmUgdGhlIHNsYXZlICovCisjZGVmaW5lIE04OEUxMDAwX0VQU0NSX1NMQVZFX0RPV05TSElGVF9NQVNLICAweDAzMDAKKyNkZWZpbmUgTTg4RTEwMDBfRVBTQ1JfU0xBVkVfRE9XTlNISUZUX0RJUyAgIDB4MDAwMAorI2RlZmluZSBNODhFMTAwMF9FUFNDUl9TTEFWRV9ET1dOU0hJRlRfMVggICAgMHgwMTAwCisjZGVmaW5lIE04OEUxMDAwX0VQU0NSX1NMQVZFX0RPV05TSElGVF8yWCAgICAweDAyMDAKKyNkZWZpbmUgTTg4RTEwMDBfRVBTQ1JfU0xBVkVfRE9XTlNISUZUXzNYICAgIDB4MDMwMAorI2RlZmluZSBNODhFMTAwMF9FUFNDUl9UWF9DTEtfMl81ICAgICAweDAwNjAgLyogMi41IE1IeiBUWF9DTEsgKi8KKyNkZWZpbmUgTTg4RTEwMDBfRVBTQ1JfVFhfQ0xLXzI1ICAgICAgMHgwMDcwIC8qIDI1ICBNSHogVFhfQ0xLICovCisjZGVmaW5lIE04OEUxMDAwX0VQU0NSX1RYX0NMS18wICAgICAgIDB4MDAwMCAvKiBOTyAgVFhfQ0xLICovCisKKy8qIElHUDAxRTEwMDAgU3BlY2lmaWMgUG9ydCBDb25maWcgUmVnaXN0ZXIgLSBSL1cgKi8KKyNkZWZpbmUgSUdQMDFFMTAwMF9QU0NGUl9BVVRPX01ESVhfUEFSX0RFVEVDVCAgMHgwMDEwCisjZGVmaW5lIElHUDAxRTEwMDBfUFNDRlJfUFJFX0VOICAgICAgICAgICAgICAgIDB4MDAyMAorI2RlZmluZSBJR1AwMUUxMDAwX1BTQ0ZSX1NNQVJUX1NQRUVEICAgICAgICAgICAweDAwODAKKyNkZWZpbmUgSUdQMDFFMTAwMF9QU0NGUl9ESVNBQkxFX1RQTE9PUEJBQ0sgICAgMHgwMTAwCisjZGVmaW5lIElHUDAxRTEwMDBfUFNDRlJfRElTQUJMRV9KQUJCRVIgICAgICAgIDB4MDQwMAorI2RlZmluZSBJR1AwMUUxMDAwX1BTQ0ZSX0RJU0FCTEVfVFJBTlNNSVQgICAgICAweDIwMDAKKworLyogSUdQMDFFMTAwMCBTcGVjaWZpYyBQb3J0IFN0YXR1cyBSZWdpc3RlciAtIFIvTyAqLworI2RlZmluZSBJR1AwMUUxMDAwX1BTU1JfQVVUT05FR19GQUlMRUQgICAgICAgICAweDAwMDEgLyogUk8gTEggU0MgKi8KKyNkZWZpbmUgSUdQMDFFMTAwMF9QU1NSX1BPTEFSSVRZX1JFVkVSU0VEICAgICAgMHgwMDAyCisjZGVmaW5lIElHUDAxRTEwMDBfUFNTUl9DQUJMRV9MRU5HVEggICAgICAgICAgIDB4MDA3QworI2RlZmluZSBJR1AwMUUxMDAwX1BTU1JfRlVMTF9EVVBMRVggICAgICAgICAgICAweDAyMDAKKyNkZWZpbmUgSUdQMDFFMTAwMF9QU1NSX0xJTktfVVAgICAgICAgICAgICAgICAgMHgwNDAwCisjZGVmaW5lIElHUDAxRTEwMDBfUFNTUl9NRElYICAgICAgICAgICAgICAgICAgIDB4MDgwMAorI2RlZmluZSBJR1AwMUUxMDAwX1BTU1JfU1BFRURfTUFTSyAgICAgICAgICAgICAweEMwMDAgLyogc3BlZWQgYml0cyBtYXNrICovCisjZGVmaW5lIElHUDAxRTEwMDBfUFNTUl9TUEVFRF8xME1CUFMgICAgICAgICAgIDB4NDAwMAorI2RlZmluZSBJR1AwMUUxMDAwX1BTU1JfU1BFRURfMTAwTUJQUyAgICAgICAgICAweDgwMDAKKyNkZWZpbmUgSUdQMDFFMTAwMF9QU1NSX1NQRUVEXzEwMDBNQlBTICAgICAgICAgMHhDMDAwCisjZGVmaW5lIElHUDAxRTEwMDBfUFNTUl9DQUJMRV9MRU5HVEhfU0hJRlQgICAgIDB4MDAwMiAvKiBzaGlmdCByaWdodCAyICovCisjZGVmaW5lIElHUDAxRTEwMDBfUFNTUl9NRElYX1NISUZUICAgICAgICAgICAgIDB4MDAwQiAvKiBzaGlmdCByaWdodCAxMSAqLworCisvKiBJR1AwMUUxMDAwIFNwZWNpZmljIFBvcnQgQ29udHJvbCBSZWdpc3RlciAtIFIvVyAqLworI2RlZmluZSBJR1AwMUUxMDAwX1BTQ1JfVFBfTE9PUEJBQ0sgICAgICAgICAgICAweDAwMDEKKyNkZWZpbmUgSUdQMDFFMTAwMF9QU0NSX0NPUlJFQ1RfTkNfU0NNQkxSICAgICAgMHgwMjAwCisjZGVmaW5lIElHUDAxRTEwMDBfUFNDUl9URU5fQ1JTX1NFTEVDVCAgICAgICAgIDB4MDQwMAorI2RlZmluZSBJR1AwMUUxMDAwX1BTQ1JfRkxJUF9DSElQICAgICAgICAgICAgICAweDA4MDAKKyNkZWZpbmUgSUdQMDFFMTAwMF9QU0NSX0FVVE9fTURJWCAgICAgICAgICAgICAgMHgxMDAwCisjZGVmaW5lIElHUDAxRTEwMDBfUFNDUl9GT1JDRV9NRElfTURJWCAgICAgICAgIDB4MjAwMCAvKiAwLU1ESSwgMS1NRElYICovCisKKy8qIElHUDAxRTEwMDAgU3BlY2lmaWMgUG9ydCBMaW5rIEhlYWx0aCBSZWdpc3RlciAqLworI2RlZmluZSBJR1AwMUUxMDAwX1BMSFJfU1NfRE9XTkdSQURFICAgICAgICAgICAweDgwMDAKKyNkZWZpbmUgSUdQMDFFMTAwMF9QTEhSX0dJR19TQ1JBTUJMRVJfRVJST1IgICAgMHg0MDAwCisjZGVmaW5lIElHUDAxRTEwMDBfUExIUl9HSUdfUkVNX1JDVlJfTk9LICAgICAgIDB4MDgwMCAvKiBMSCAqLworI2RlZmluZSBJR1AwMUUxMDAwX1BMSFJfSURMRV9FUlJPUl9DTlRfT0ZMT1cgICAweDA0MDAgLyogTEggKi8KKyNkZWZpbmUgSUdQMDFFMTAwMF9QTEhSX0RBVEFfRVJSXzEgICAgICAgICAgICAgMHgwMjAwIC8qIExIICovCisjZGVmaW5lIElHUDAxRTEwMDBfUExIUl9EQVRBX0VSUl8wICAgICAgICAgICAgIDB4MDEwMAorI2RlZmluZSBJR1AwMUUxMDAwX1BMSFJfQVVUT05FR19GQVVMVCAgICAgICAgICAweDAwMTAKKyNkZWZpbmUgSUdQMDFFMTAwMF9QTEhSX0FVVE9ORUdfQUNUSVZFICAgICAgICAgMHgwMDA4CisjZGVmaW5lIElHUDAxRTEwMDBfUExIUl9WQUxJRF9DSEFOTkVMX0QgICAgICAgIDB4MDAwNAorI2RlZmluZSBJR1AwMUUxMDAwX1BMSFJfVkFMSURfQ0hBTk5FTF9DICAgICAgICAweDAwMDIKKyNkZWZpbmUgSUdQMDFFMTAwMF9QTEhSX1ZBTElEX0NIQU5ORUxfQiAgICAgICAgMHgwMDAxCisjZGVmaW5lIElHUDAxRTEwMDBfUExIUl9WQUxJRF9DSEFOTkVMX0EgICAgICAgIDB4MDAwMAorCisvKiBJR1AwMUUxMDAwIENoYW5uZWwgUXVhbGl0eSBSZWdpc3RlciAqLworI2RlZmluZSBJR1AwMUUxMDAwX01TRV9DSEFOTkVMX0QgICAgICAgIDB4MDAwRgorI2RlZmluZSBJR1AwMUUxMDAwX01TRV9DSEFOTkVMX0MgICAgICAgIDB4MDBGMAorI2RlZmluZSBJR1AwMUUxMDAwX01TRV9DSEFOTkVMX0IgICAgICAgIDB4MEYwMAorI2RlZmluZSBJR1AwMUUxMDAwX01TRV9DSEFOTkVMX0EgICAgICAgIDB4RjAwMAorCisvKiBJR1AwMUUxMDAwIERTUCByZXNldCBtYWNyb3MgKi8KKyNkZWZpbmUgRFNQX1JFU0VUX0VOQUJMRSAgICAgMHgwCisjZGVmaW5lIERTUF9SRVNFVF9ESVNBQkxFICAgIDB4MgorI2RlZmluZSBFMTAwMF9NQVhfRFNQX1JFU0VUUyAxMAorCisvKiBJR1AwMUUxMDAwIEFHQyBSZWdpc3RlcnMgKi8KKworI2RlZmluZSBJR1AwMUUxMDAwX0FHQ19MRU5HVEhfU0hJRlQgNyAgICAgICAgIC8qIENvYXJzZSAtIDEzOjExLCBGaW5lIC0gMTA6NyAqLworCisvKiA3IGJpdHMgKDMgQ29hcnNlICsgNCBGaW5lKSAtLT4gMTI4IG9wdGlvbmFsIHZhbHVlcyAqLworI2RlZmluZSBJR1AwMUUxMDAwX0FHQ19MRU5HVEhfVEFCTEVfU0laRSAxMjgKKworLyogVGhlIHByZWNpc2lvbiBvZiB0aGUgbGVuZ3RoIGlzICsvLSAxMCBtZXRlcnMgKi8KKyNkZWZpbmUgSUdQMDFFMTAwMF9BR0NfUkFOR0UgICAgMTAKKworLyogSUdQMDFFMTAwMCBQQ1MgSW5pdGlhbGl6YXRpb24gcmVnaXN0ZXIgKi8KKy8qIGJpdHMgMzo2IGluIHRoZSBQQ1MgcmVnaXN0ZXJzIHN0b3JlcyB0aGUgY2hhbm5lbHMgcG9sYXJpdHkgKi8KKyNkZWZpbmUgSUdQMDFFMTAwMF9QSFlfUE9MQVJJVFlfTUFTSyAgICAweDAwNzgKKworLyogSUdQMDFFMTAwMCBHTUlJIEZJRk8gUmVnaXN0ZXIgKi8KKyNkZWZpbmUgSUdQMDFFMTAwMF9HTUlJX0ZMRVhfU1BEICAgICAgICAgICAgICAgMHgxMCAvKiBFbmFibGUgZmxleGlibGUgc3BlZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBvbiBMaW5rLVVwICovCisjZGVmaW5lIElHUDAxRTEwMDBfR01JSV9TUEQgICAgICAgICAgICAgICAgICAgIDB4MjAgLyogRW5hYmxlIFNQRCAqLworCisvKiBJR1AwMUUxMDAwIEFuYWxvZyBSZWdpc3RlciAqLworI2RlZmluZSBJR1AwMUUxMDAwX0FOQUxPR19TUEFSRV9GVVNFX1NUQVRVUyAgICAgICAgIDB4MjBEMQorI2RlZmluZSBJR1AwMUUxMDAwX0FOQUxPR19GVVNFX1NUQVRVUyAgICAgICAgICAgICAgIDB4MjBEMAorI2RlZmluZSBJR1AwMUUxMDAwX0FOQUxPR19GVVNFX0NPTlRST0wgICAgICAgICAgICAgIDB4MjBEQworI2RlZmluZSBJR1AwMUUxMDAwX0FOQUxPR19GVVNFX0JZUEFTUyAgICAgICAgICAgICAgIDB4MjBERQorCisjZGVmaW5lIElHUDAxRTEwMDBfQU5BTE9HX0ZVU0VfUE9MWV9NQVNLICAgICAgICAgICAgMHhGMDAwCisjZGVmaW5lIElHUDAxRTEwMDBfQU5BTE9HX0ZVU0VfRklORV9NQVNLICAgICAgICAgICAgMHgwRjgwCisjZGVmaW5lIElHUDAxRTEwMDBfQU5BTE9HX0ZVU0VfQ09BUlNFX01BU0sgICAgICAgICAgMHgwMDcwCisjZGVmaW5lIElHUDAxRTEwMDBfQU5BTE9HX1NQQVJFX0ZVU0VfRU5BQkxFRCAgICAgICAgMHgwMTAwCisjZGVmaW5lIElHUDAxRTEwMDBfQU5BTE9HX0ZVU0VfRU5BQkxFX1NXX0NPTlRST0wgICAgMHgwMDAyCisKKyNkZWZpbmUgSUdQMDFFMTAwMF9BTkFMT0dfRlVTRV9DT0FSU0VfVEhSRVNIICAgICAgICAweDAwNDAKKyNkZWZpbmUgSUdQMDFFMTAwMF9BTkFMT0dfRlVTRV9DT0FSU0VfMTAgICAgICAgICAgICAweDAwMTAKKyNkZWZpbmUgSUdQMDFFMTAwMF9BTkFMT0dfRlVTRV9GSU5FXzEgICAgICAgICAgICAgICAweDAwODAKKyNkZWZpbmUgSUdQMDFFMTAwMF9BTkFMT0dfRlVTRV9GSU5FXzEwICAgICAgICAgICAgICAweDA1MDAKKworLyogQml0IGRlZmluaXRpb25zIGZvciB2YWxpZCBQSFkgSURzLiAqLworI2RlZmluZSBNODhFMTAwMF9FX1BIWV9JRCAgMHgwMTQxMEM1MAorI2RlZmluZSBNODhFMTAwMF9JX1BIWV9JRCAgMHgwMTQxMEMzMAorI2RlZmluZSBNODhFMTAxMV9JX1BIWV9JRCAgMHgwMTQxMEMyMAorI2RlZmluZSBJR1AwMUUxMDAwX0lfUEhZX0lEICAweDAyQTgwMzgwCisjZGVmaW5lIE04OEUxMDAwXzEyX1BIWV9JRCBNODhFMTAwMF9FX1BIWV9JRAorI2RlZmluZSBNODhFMTAwMF8xNF9QSFlfSUQgTTg4RTEwMDBfRV9QSFlfSUQKKyNkZWZpbmUgTTg4RTEwMTFfSV9SRVZfNCAgIDB4MDQKKworLyogTWlzY2VsbGFuZW91cyBQSFkgYml0IGRlZmluaXRpb25zLiAqLworI2RlZmluZSBQSFlfUFJFQU1CTEUgICAgICAgIDB4RkZGRkZGRkYKKyNkZWZpbmUgUEhZX1NPRiAgICAgICAgICAgICAweDAxCisjZGVmaW5lIFBIWV9PUF9SRUFEICAgICAgICAgMHgwMgorI2RlZmluZSBQSFlfT1BfV1JJVEUgICAgICAgIDB4MDEKKyNkZWZpbmUgUEhZX1RVUk5BUk9VTkQgICAgICAweDAyCisjZGVmaW5lIFBIWV9QUkVBTUJMRV9TSVpFICAgMzIKKyNkZWZpbmUgTUlJX0NSX1NQRUVEXzEwMDAgICAweDAwNDAKKyNkZWZpbmUgTUlJX0NSX1NQRUVEXzEwMCAgICAweDIwMDAKKyNkZWZpbmUgTUlJX0NSX1NQRUVEXzEwICAgICAweDAwMDAKKyNkZWZpbmUgRTEwMDBfUEhZX0FERFJFU1MgICAweDAxCisjZGVmaW5lIFBIWV9BVVRPX05FR19USU1FICAgNDUgIC8qIDQuNSBTZWNvbmRzICovCisjZGVmaW5lIFBIWV9GT1JDRV9USU1FICAgICAgMjAgIC8qIDIuMCBTZWNvbmRzICovCisjZGVmaW5lIFBIWV9SRVZJU0lPTl9NQVNLICAgMHhGRkZGRkZGMAorI2RlZmluZSBERVZJQ0VfU1BFRURfTUFTSyAgIDB4MDAwMDAzMDAgIC8qIERldmljZSBDdHJsIFJlZyBTcGVlZCBNYXNrICovCisjZGVmaW5lIFJFRzRfU1BFRURfTUFTSyAgICAgMHgwMUUwCisjZGVmaW5lIFJFRzlfU1BFRURfTUFTSyAgICAgMHgwMzAwCisjZGVmaW5lIEFEVkVSVElTRV8xMF9IQUxGICAgMHgwMDAxCisjZGVmaW5lIEFEVkVSVElTRV8xMF9GVUxMICAgMHgwMDAyCisjZGVmaW5lIEFEVkVSVElTRV8xMDBfSEFMRiAgMHgwMDA0CisjZGVmaW5lIEFEVkVSVElTRV8xMDBfRlVMTCAgMHgwMDA4CisjZGVmaW5lIEFEVkVSVElTRV8xMDAwX0hBTEYgMHgwMDEwCisjZGVmaW5lIEFEVkVSVElTRV8xMDAwX0ZVTEwgMHgwMDIwCisjZGVmaW5lIEFVVE9ORUdfQURWRVJUSVNFX1NQRUVEX0RFRkFVTFQgMHgwMDJGICAvKiBFdmVyeXRoaW5nIGJ1dCAxMDAwLUhhbGYgKi8KKyNkZWZpbmUgQVVUT05FR19BRFZFUlRJU0VfMTBfMTAwX0FMTCAgICAweDAwMEYJLyogQWxsIDEwLzEwMCBzcGVlZHMqLworI2RlZmluZSBBVVRPTkVHX0FEVkVSVElTRV8xMF9BTEwgICAgICAgIDB4MDAwMwkvKiAxME1icHMgRnVsbCAmIEhhbGYgc3BlZWRzKi8KKworI2VuZGlmIC8qIF9FMTAwMF9IV19IXyAqLwpkaWZmIC1OYXVyIGdydWItMC45Ny5vcmlnL25ldGJvb3QvZWVwcm8uYyBncnViLTAuOTcvbmV0Ym9vdC9lZXByby5jCi0tLSBncnViLTAuOTcub3JpZy9uZXRib290L2VlcHJvLmMJMjAwMy0wNy0wOSAxMTo0NTozNy4wMDAwMDAwMDAgKzAwMDAKKysrIGdydWItMC45Ny9uZXRib290L2VlcHJvLmMJMTk3MC0wMS0wMSAwMDowMDowMC4wMDAwMDAwMDAgKzAwMDAKQEAgLTEsNTg2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotRXRoZXJib290IC0gIEJPT1RQL1RGVFAgQm9vdHN0cmFwIFByb2dyYW0KLUludGVsIEVFUFJPLzEwIE5JQyBkcml2ZXIgZm9yIEV0aGVyYm9vdAotQWRhcHRlZCBmcm9tIExpbnV4IGVlcHJvLmMgZnJvbSBrZXJuZWwgMi4yLjE3Ci0KLVRoaXMgYm9hcmQgYWNjZXB0cyBhIDMyIHBpbiBFRVBST00gKDI5QzI1NiksIGhvd2V2ZXIgYSB0ZXN0IHdpdGggYQotMjdDMDEwIHNob3dzIHRoYXQgdGhpcyBFUFJPTSBhbHNvIHdvcmtzIGluIHRoZSBzb2NrZXQsIGJ1dCBpdCdzIG5vdCBjbGVhcgotaG93IHJlcGVhdGFibHkuIFRoZSB0d28gdG9wIGFkZHJlc3MgcGlucyBhcHBlYXIgdG8gYmUgaGVsZCBsb3csIHRodXMKLXRoZSBib3R0b20gMzJrQiBvZiB0aGUgMjdDMDEwIGlzIHZpc2libGUgaW4gdGhlIENQVSdzIGFkZHJlc3Mgc3BhY2UuCi1UbyBiZSBzdXJlIHlvdSBjb3VsZCBwdXQgNCBjb3BpZXMgb2YgdGhlIGNvZGUgaW4gdGhlIDI3QzAxMCwgdGhlbgotaXQgZG9lc24ndCBtYXR0ZXIgd2hldGhlciB0aGUgZXh0cmEgbGluZXMgYXJlIGhlbGQgbG93IG9yIGhpZ2gsIGp1c3QKLWhvcGVmdWxseSBub3QgZmxvYXRpbmcgYXMgQ01PUyBjaGlwcyBkb24ndCBsaWtlIGZsb2F0aW5nIGlucHV0cy4KLQotQmUgY2FyZWZ1bCB3aXRoIHNlYXRpbmcgdGhlIEVQUk9NIGFzIHRoZSBzb2NrZXQgb24gbXkgYm9hcmQgYWN0dWFsbHkKLWhhcyAzNCBwaW5zLCB0aGUgdG9wIHJvdyBvZiAyIGFyZSBub3QgdXNlZC4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0Ci0gKiB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKi8KLQotLyogdG8gZ2V0IHNvbWUgZ2xvYmFsIHJvdXRpbmVzIGxpa2UgcHJpbnRmICovCi0jaW5jbHVkZSAiZXRoZXJib290LmgiCi0vKiB0byBnZXQgdGhlIGludGVyZmFjZSB0byB0aGUgYm9keSBvZiB0aGUgcHJvZ3JhbSAqLwotI2luY2x1ZGUgIm5pYy5oIgotLyogdG8gZ2V0IG91ciBvd24gcHJvdG90eXBlICovCi0jaW5jbHVkZSAiY2FyZHMuaCIKLS8qIHdlIHVzZSB0aW1lcjIgZm9yIG1pY3Jvc2Vjb25kIHdhaXRzICovCi0jaW5jbHVkZSAidGltZXIuaCIKLQotI3VuZGVmCURFQlVHCQkvKiBvbmx5IGFmdGVyIGluY2x1ZGUgZmlsZXMgKi8KLQotLyogRGlmZmVyZW50IDgyNTk1IGNoaXBzICovCi0jZGVmaW5lIExBTjU5NQkJMAotI2RlZmluZSBMQU41OTVUWAkxCi0jZGVmaW5lIExBTjU5NUZYCTIKLSNkZWZpbmUgTEFONTk1RlhfMTBJU0EJMwotCi0jZGVmaW5lCVNMT1dfRE9XTglpbmIoMHg4MCk7Ci0KLS8qIFRoZSBzdGF0aW9uIChldGhlcm5ldCkgYWRkcmVzcyBwcmVmaXgsIHVzZWQgZm9yIElEaW5nIHRoZSBib2FyZC4gKi8KLSNkZWZpbmUgU0FfQUREUjAgMHgwMAkvKiBFdGhlcmV4cHJlc3MgUHJvLzEwICovCi0jZGVmaW5lIFNBX0FERFIxIDB4YWEKLSNkZWZpbmUgU0FfQUREUjIgMHgwMAotCi0jZGVmaW5lIEdldEJpdCh4LHkpICgoeCAmICgxPDx5KSk+PnkpCi0KLS8qIEVFUFJPTSBXb3JkIDA6ICovCi0jZGVmaW5lIGVlX1BuUCAgICAgICAwICAvKiBQbHVnICduIFBsYXkgZW5hYmxlIGJpdCAqLwotI2RlZmluZSBlZV9Xb3JkMSAgICAgMSAgLyogV29yZCAxPyAqLwotI2RlZmluZSBlZV9CdXNXaWR0aCAgMiAgLyogOC8xNiBiaXQgKi8KLSNkZWZpbmUgZWVfRmxhc2hBZGRyIDMgIC8qIEZsYXNoIEFkZHJlc3MgKi8KLSNkZWZpbmUgZWVfRmxhc2hNYXNrIDB4NyAgIC8qIE1hc2sgKi8KLSNkZWZpbmUgZWVfQXV0b0lPICAgIDYgIC8qICovCi0jZGVmaW5lIGVlX3Jlc2VydmVkMCA3ICAvKiA9MCEgKi8KLSNkZWZpbmUgZWVfRmxhc2ggICAgIDggIC8qIEZsYXNoIHRoZXJlPyAqLwotI2RlZmluZSBlZV9BdXRvTmVnICAgOSAgLyogQXV0byBOZWdvdGlhdGlvbiBlbmFibGVkPyAqLwotI2RlZmluZSBlZV9JTzAgICAgICAgMTAgLyogSU8gQWRkcmVzcyBMU0IgKi8KLSNkZWZpbmUgZWVfSU8wTWFzayAgIDB4IC8qLi4uKi8KLSNkZWZpbmUgZWVfSU8xICAgICAgIDE1IC8qIElPIE1TQiAqLwotCi0vKiBFRVBST00gV29yZCAxOiAqLwotI2RlZmluZSBlZV9JbnRTZWwgICAgMCAgIC8qIEludGVycnVwdCAqLwotI2RlZmluZSBlZV9JbnRNYXNrICAgMHg3Ci0jZGVmaW5lIGVlX0xJICAgICAgICAzICAgLyogTGluayBJbnRlZ3JpdHkgMD0gZW5hYmxlZCAqLwotI2RlZmluZSBlZV9QQyAgICAgICAgNCAgIC8qIFBvbGFyaXR5IENvcnJlY3Rpb24gMD0gZW5hYmxlZCAqLwotI2RlZmluZSBlZV9UUEVfQVVJICAgNSAgIC8qIFBvcnRTZWxlY3Rpb24gMT1UUEUgKi8KLSNkZWZpbmUgZWVfSmFiYmVyICAgIDYgICAvKiBKYWJiZXIgcHJldmVudGlvbiAwPSBlbmFibGVkICovCi0jZGVmaW5lIGVlX0F1dG9Qb3J0ICA3ICAgLyogQXV0byBQb3J0IFNlbGVjdGlvbiAxPSBEaXNhYmxlZCAqLwotI2RlZmluZSBlZV9TTU9VVCAgICAgOCAgIC8qIFNNb3V0IFBpbiBDb250cm9sIDA9IElucHV0ICovCi0jZGVmaW5lIGVlX1BST00gICAgICA5ICAgLyogRmxhc2ggRVBST00gLyBQUk9NIDA9Rmxhc2ggKi8KLSNkZWZpbmUgZWVfcmVzZXJ2ZWQxIDEwICAvKiAuLiAxMiA9MCEgKi8KLSNkZWZpbmUgZWVfQWx0UmVhZHkgIDEzICAvKiBBbHRlcm5hdGUgUmVhZHksIDA9bm9ybWFsICovCi0jZGVmaW5lIGVlX3Jlc2VydmVkMiAxNCAgLyogPTAhICovCi0jZGVmaW5lIGVlX0R1cGxleCAgICAxNQotCi0vKiBXb3JkMiwzLDQ6ICovCi0jZGVmaW5lIGVlX0lBNSAgICAgICAwIC8qYml0IHN0YXJ0IGZvciBpbmRpdmlkdWFsIEFkZHIgQnl0ZSA1ICovCi0jZGVmaW5lIGVlX0lBNCAgICAgICA4IC8qYml0IHN0YXJ0IGZvciBpbmRpdmlkdWFsIEFkZHIgQnl0ZSA1ICovCi0jZGVmaW5lIGVlX0lBMyAgICAgICAwIC8qYml0IHN0YXJ0IGZvciBpbmRpdmlkdWFsIEFkZHIgQnl0ZSA1ICovCi0jZGVmaW5lIGVlX0lBMiAgICAgICA4IC8qYml0IHN0YXJ0IGZvciBpbmRpdmlkdWFsIEFkZHIgQnl0ZSA1ICovCi0jZGVmaW5lIGVlX0lBMSAgICAgICAwIC8qYml0IHN0YXJ0IGZvciBpbmRpdmlkdWFsIEFkZHIgQnl0ZSA1ICovCi0jZGVmaW5lIGVlX0lBMCAgICAgICA4IC8qYml0IHN0YXJ0IGZvciBpbmRpdmlkdWFsIEFkZHIgQnl0ZSA1ICovCi0KLS8qIFdvcmQgNTogKi8KLSNkZWZpbmUgZWVfQk5DX1RQRSAgIDAgLyogMD1UUEUgKi8KLSNkZWZpbmUgZWVfQm9vdFR5cGUgIDEgLyogMDA9Tm9uZSwgMDE9SVBYLCAxMD1PREksIDExPU5ESVMgKi8KLSNkZWZpbmUgZWVfQm9vdFR5cGVNYXNrIDB4MyAKLSNkZWZpbmUgZWVfTnVtQ29ubiAgIDMgIC8qIE51bWJlciBvZiBDb25uZWN0aW9ucyAwPSBPbmUgb3IgVHdvICovCi0jZGVmaW5lIGVlX0ZsYXNoU29jayA0ICAvKiBQcmVzZW5jZSBvZiBGbGFzaCBTb2NrZXQgMD0gUHJlc2VudCAqLwotI2RlZmluZSBlZV9Qb3J0VFBFICAgNQotI2RlZmluZSBlZV9Qb3J0Qk5DICAgNgotI2RlZmluZSBlZV9Qb3J0QVVJICAgNwotI2RlZmluZSBlZV9Qb3dlck1ndCAgMTAgLyogMD0gZGlzYWJsZWQgKi8KLSNkZWZpbmUgZWVfQ1AgICAgICAgIDEzIC8qIENvbmN1cnJlbnQgUHJvY2Vzc2luZyAqLwotI2RlZmluZSBlZV9DUE1hc2sgICAgMHg3Ci0KLS8qIFdvcmQgNjogKi8KLSNkZWZpbmUgZWVfU3RlcHBpbmcgIDAgLyogU3RlcHBpbmcgaW5mbyAqLwotI2RlZmluZSBlZV9TdGVwTWFzayAgMHgwRgotI2RlZmluZSBlZV9Cb2FyZElEICAgNCAvKiBNYW51Y2F0dXJlciBCb2FyZCBJRCwgcmVzZXJ2ZWQgKi8KLSNkZWZpbmUgZWVfQm9hcmRNYXNrIDB4MEZGRgotCi0vKiBXb3JkIDc6ICovCi0jZGVmaW5lIGVlX0lOVF9UT19JUlEgMCAvKiBpbnQgdG8gSVJRIE1hcHBpbmcgID0gMHgxRUI4IGZvciBQcm8vMTArICovCi0jZGVmaW5lIGVlX0ZYX0lOVDJJUlEgMHgxRUI4IC8qIHRoZSBfb25seV8gbWFwcGluZyBhbGxvd2VkIGZvciBGWCBjaGlwcyAqLwotCi0vKi4uKi8KLSNkZWZpbmUgZWVfU0laRSAweDQwIC8qIHRvdGFsIEVFcHJvbSBTaXplICovCi0jZGVmaW5lIGVlX0NoZWNrc3VtIDB4QkFCQSAvKiBpbml0aWFsIGFuZCBmaW5hbCB2YWx1ZSBmb3IgYWRkaW5nIGNoZWNrc3VtICovCi0KLQotLyogQ2FyZCBpZGVudGlmaWNhdGlvbiB2aWEgRUVwcm9tOiAgICovCi0jZGVmaW5lIGVlX2FkZHJfdmVuZG9yIDB4MTAgIC8qIFdvcmQgb2Zmc2V0IGZvciBFSVNBIFZlbmRvciBJRCAqLwotI2RlZmluZSBlZV9hZGRyX2lkIDB4MTEgICAgICAvKiBXb3JkIG9mZnNldCBmb3IgQ2FyZCBJRCAqLwotI2RlZmluZSBlZV9hZGRyX1NOIDB4MTIgICAgICAvKiBTZXJpYWwgTnVtYmVyICovCi0jZGVmaW5lIGVlX2FkZHJfQ1JDXzggMHgxNCAgIC8qIENSQyBvdmVyIGxhc3QgdGhlZSBCeXRlcyAqLwotCi0KLSNkZWZpbmUgZWVfdmVuZG9yX2ludGVsMCAweDI1ICAvKiBWZW5kb3IgSUQgSW50ZWwgKi8KLSNkZWZpbmUgZWVfdmVuZG9yX2ludGVsMSAweEQ0Ci0jZGVmaW5lIGVlX2lkX2VlcHJvMTBwMCAweDEwICAgLyogSUQgZm9yIGVlcHJvLzEwKyAqLwotI2RlZmluZSBlZV9pZF9lZXBybzEwcDEgMHgzMQotCi0vKiBub3cgdGhpcyBzZWN0aW9uIGNvdWxkIGJlIHVzZWQgYnkgYm90aCBib2FyZHM6IHRoZSBvbGRpZXMgYW5kIHRoZSBlZTEwOgotICogZWUxMCB1c2VzIHR4IGJ1ZmZlciBiZWZvcmUgb2YgcnggYnVmZmVyIGFuZCB0aGUgb2xkaWVzIHRoZSBpbnZlcnNlLgotICogKGFyaXMpCi0gKi8KLSNkZWZpbmUJUkFNX1NJWkUJMHg4MDAwCi0KLSNkZWZpbmUJUkNWX0hFQURFUgk4Ci0jZGVmaW5lIFJDVl9ERUZBVUxUX1JBTQkweDYwMDAKLSNkZWZpbmUgUkNWX1JBTSAJcmN2X3JhbQotCi1zdGF0aWMgdW5zaWduZWQgcmN2X3JhbSA9IFJDVl9ERUZBVUxUX1JBTTsKLQotI2RlZmluZSBYTVRfSEVBREVSCTgKLSNkZWZpbmUgWE1UX1JBTQkJKFJBTV9TSVpFIC0gUkNWX1JBTSkKLQotI2RlZmluZSBYTVRfU1RBUlQJKChyY3Zfc3RhcnQgKyBSQ1ZfUkFNKSAlIFJBTV9TSVpFKQotCi0jZGVmaW5lIFJDVl9MT1dFUl9MSU1JVAkocmN2X3N0YXJ0ID4+IDgpCi0jZGVmaW5lIFJDVl9VUFBFUl9MSU1JVAkoKChyY3Zfc3RhcnQgKyBSQ1ZfUkFNKSAtIDIpID4+IDgpCi0jZGVmaW5lIFhNVF9MT1dFUl9MSU1JVAkoWE1UX1NUQVJUID4+IDgpCi0jZGVmaW5lIFhNVF9VUFBFUl9MSU1JVAkoKChYTVRfU1RBUlQgKyBYTVRfUkFNKSAtIDIpID4+IDgpCi0KLSNkZWZpbmUgUkNWX1NUQVJUX1BSTwkweDAwCi0jZGVmaW5lIFJDVl9TVEFSVF8xMAlYTVRfUkFNCi0JCQkJCS8qIGJ5IGRlZmF1bHQgdGhlIG9sZCBkcml2ZXIgKi8KLXN0YXRpYyB1bnNpZ25lZCByY3Zfc3RhcnQgPSBSQ1ZfU1RBUlRfUFJPOwotCi0jZGVmaW5lCVJDVl9ET05FCTB4MDAwOAotI2RlZmluZQlSWF9PSwkJMHgyMDAwCi0jZGVmaW5lCVJYX0VSUk9SCTB4MGQ4MQotCi0jZGVmaW5lCVRYX0RPTkVfQklUCTB4MDA4MAotI2RlZmluZQlDSEFJTl9CSVQJMHg4MDAwCi0jZGVmaW5lCVhNVF9TVEFUVVMJMHgwMgotI2RlZmluZQlYTVRfQ0hBSU4JMHgwNAotI2RlZmluZQlYTVRfQ09VTlQJMHgwNgotCi0jZGVmaW5lCUJBTkswX1NFTEVDVAkweDAwCQkKLSNkZWZpbmUJQkFOSzFfU0VMRUNUCTB4NDAJCQotI2RlZmluZQlCQU5LMl9TRUxFQ1QJMHg4MAkJCi0KLS8qIEJhbmsgMCByZWdpc3RlcnMgKi8KLSNkZWZpbmUJQ09NTUFORF9SRUcJMHgwMAkvKiBSZWdpc3RlciAwICovCi0jZGVmaW5lCU1DX1NFVFVQCTB4MDMKLSNkZWZpbmUJWE1UX0NNRAkJMHgwNAotI2RlZmluZQlESUFHTk9TRV9DTUQJMHgwNwotI2RlZmluZQlSQ1ZfRU5BQkxFX0NNRAkweDA4Ci0jZGVmaW5lCVJDVl9ESVNBQkxFX0NNRAkweDBhCi0jZGVmaW5lCVNUT1BfUkNWX0NNRAkweDBiCi0jZGVmaW5lCVJFU0VUX0NNRAkweDBlCi0jZGVmaW5lCVBPV0VSX0RPV05fQ01ECTB4MTgKLSNkZWZpbmUJUkVTVU1FX1hNVF9DTUQJMHgxYwotI2RlZmluZQlTRUxfUkVTRVRfQ01ECTB4MWUKLSNkZWZpbmUJU1RBVFVTX1JFRwkweDAxCS8qIFJlZ2lzdGVyIDEgKi8KLSNkZWZpbmUJUlhfSU5UCQkweDAyCi0jZGVmaW5lCVRYX0lOVAkJMHgwNAotI2RlZmluZQlFWEVDX1NUQVRVUwkweDMwCi0jZGVmaW5lCUlEX1JFRwkJMHgwMgkvKiBSZWdpc3RlciAyCSovCi0jZGVmaW5lCVJfUk9CSU5fQklUUwkweGMwCS8qIHJvdW5kIHJvYmluIGNvdW50ZXIgKi8KLSNkZWZpbmUJSURfUkVHX01BU0sJMHgyYwotI2RlZmluZQlJRF9SRUdfU0lHCTB4MjQKLSNkZWZpbmUJQVVUT19FTkFCTEUJMHgxMAotI2RlZmluZQlJTlRfTUFTS19SRUcJMHgwMwkvKiBSZWdpc3RlciAzCSovCi0jZGVmaW5lCVJYX1NUT1BfTUFTSwkweDAxCi0jZGVmaW5lCVJYX01BU0sJCTB4MDIKLSNkZWZpbmUJVFhfTUFTSwkJMHgwNAotI2RlZmluZQlFWEVDX01BU0sJMHgwOAotI2RlZmluZQlBTExfTUFTSwkweDBmCi0jZGVmaW5lCUlPXzMyX0JJVAkweDEwCi0jZGVmaW5lCVJDVl9CQVIJCTB4MDQJLyogVGhlIGZvbGxvd2luZyBhcmUgd29yZCAoMTYtYml0KSByZWdpc3RlcnMgKi8KLSNkZWZpbmUJUkNWX1NUT1AJMHgwNgotCi0jZGVmaW5lCVhNVF9CQVJfUFJPCTB4MGEKLSNkZWZpbmUJWE1UX0JBUl8xMAkweDBiCi1zdGF0aWMgdW5zaWduZWQgeG10X2JhciA9IFhNVF9CQVJfUFJPOwotCi0jZGVmaW5lCUhPU1RfQUREUkVTU19SRUcJMHgwYwotI2RlZmluZQlJT19QT1JUCQkweDBlCi0jZGVmaW5lCUlPX1BPUlRfMzJfQklUCTB4MGMKLQotLyogQmFuayAxIHJlZ2lzdGVycyAqLwotI2RlZmluZQlSRUcxCTB4MDEKLSNkZWZpbmUJV09SRF9XSURUSAkweDAyCi0jZGVmaW5lCUlOVF9FTkFCTEUJMHg4MAotI2RlZmluZSBJTlRfTk9fUkVHCTB4MDIKLSNkZWZpbmUJUkNWX0xPV0VSX0xJTUlUX1JFRwkweDA4Ci0jZGVmaW5lCVJDVl9VUFBFUl9MSU1JVF9SRUcJMHgwOQotCi0jZGVmaW5lCVhNVF9MT1dFUl9MSU1JVF9SRUdfUFJPCTB4MGEKLSNkZWZpbmUJWE1UX1VQUEVSX0xJTUlUX1JFR19QUk8JMHgwYgotI2RlZmluZQlYTVRfTE9XRVJfTElNSVRfUkVHXzEwCTB4MGIKLSNkZWZpbmUJWE1UX1VQUEVSX0xJTUlUX1JFR18xMAkweDBhCi1zdGF0aWMgdW5zaWduZWQgeG10X2xvd2VyX2xpbWl0X3JlZyA9IFhNVF9MT1dFUl9MSU1JVF9SRUdfUFJPOwotc3RhdGljIHVuc2lnbmVkIHhtdF91cHBlcl9saW1pdF9yZWcgPSBYTVRfVVBQRVJfTElNSVRfUkVHX1BSTzsKLQotLyogQmFuayAyIHJlZ2lzdGVycyAqLwotI2RlZmluZQlYTVRfQ2hhaW5fSW50CTB4MjAJLyogSW50ZXJydXB0IGF0IHRoZSBlbmQgb2YgdGhlIHRyYW5zbWl0IGNoYWluICovCi0jZGVmaW5lCVhNVF9DaGFpbl9FcnJTdG9wCTB4NDAgLyogSW50ZXJydXB0IGF0IHRoZSBlbmQgb2YgdGhlIGNoYWluIGV2ZW4gaWYgdGhlcmUgYXJlIGVycm9ycyAqLwotI2RlZmluZQlSQ1ZfRGlzY2FyZF9CYWRGcmFtZQkweDgwIC8qIFRocm93IGJhZCBmcmFtZXMgYXdheSwgYW5kIGNvbnRpbnVlIHRvIHJlY2VpdmUgb3RoZXJzICovCi0jZGVmaW5lCVJFRzIJCTB4MDIKLSNkZWZpbmUJUFJNU0NfTW9kZQkweDAxCi0jZGVmaW5lCU11bHRpX0lBCTB4MjAKLSNkZWZpbmUJUkVHMwkJMHgwMwotI2RlZmluZQlUUEVfQklUCQkweDA0Ci0jZGVmaW5lCUJOQ19CSVQJCTB4MjAKLSNkZWZpbmUJUkVHMTMJCTB4MGQKLSNkZWZpbmUJRkRYCQkweDAwCi0jZGVmaW5lCUFfTl9FTkFCTEUJMHgwMgotCQotI2RlZmluZQlJX0FERF9SRUcwCTB4MDQKLSNkZWZpbmUJSV9BRERfUkVHMQkweDA1Ci0jZGVmaW5lCUlfQUREX1JFRzIJMHgwNgotI2RlZmluZQlJX0FERF9SRUczCTB4MDcKLSNkZWZpbmUJSV9BRERfUkVHNAkweDA4Ci0jZGVmaW5lCUlfQUREX1JFRzUJMHgwOQotCi0jZGVmaW5lIEVFUFJPTV9SRUdfUFJPCTB4MGEKLSNkZWZpbmUgRUVQUk9NX1JFR18xMAkweDBiCi1zdGF0aWMgdW5zaWduZWQgZWVwcm9tX3JlZyA9IEVFUFJPTV9SRUdfUFJPOwotCi0jZGVmaW5lIEVFU0sgMHgwMQotI2RlZmluZSBFRUNTIDB4MDIKLSNkZWZpbmUgRUVESSAweDA0Ci0jZGVmaW5lIEVFRE8gMHgwOAotCi0vKiBUaGUgaG9ycmlibGUgcm91dGluZSB0byByZWFkIGEgd29yZCBmcm9tIHRoZSBzZXJpYWwgRUVQUk9NLiAqLwotLyogSU1QT1JUQU5UIC0gdGhlIDgyNTk1IHdpbGwgYmUgc2V0IHRvIEJhbmsgMCBhZnRlciB0aGUgZWVwcm9tIGlzIHJlYWQgKi8KLQotLyogVGhlIGRlbGF5IGJldHdlZW4gRUVQUk9NIGNsb2NrIHRyYW5zaXRpb25zLiAqLwotI2RlZmluZSBlZXByb21fZGVsYXkoKSB7IHVkZWxheSg0MCk7IH0KLSNkZWZpbmUgRUVfUkVBRF9DTUQgKDYgPDwgNikKLQotLyogZG8gYSBmdWxsIHJlc2V0ICovCi0jZGVmaW5lIGVlcHJvX2Z1bGxfcmVzZXQoaW9hZGRyKQlvdXRiKFJFU0VUX0NNRCwgaW9hZGRyKTsgdWRlbGF5KDQwKTsKLQotLyogZG8gYSBuaWNlIHJlc2V0ICovCi0jZGVmaW5lIGVlcHJvX3NlbF9yZXNldChpb2FkZHIpIAl7IFwKLQkJCQkJb3V0YihTRUxfUkVTRVRfQ01ELCBpb2FkZHIpOyBcCi0JCQkJCVNMT1dfRE9XTjsgXAotCQkJCQlTTE9XX0RPV047IFwKLQkJCQkJfQotCi0vKiBjbGVhciBhbGwgaW50ZXJydXB0cyAqLwotI2RlZmluZQllZXByb19jbGVhcl9pbnQoaW9hZGRyKQlvdXRiKEFMTF9NQVNLLCBpb2FkZHIgKyBTVEFUVVNfUkVHKQotCi0vKiBlbmFibGUgcnggKi8KLSNkZWZpbmUJZWVwcm9fZW5fcngoaW9hZGRyKQlvdXRiKFJDVl9FTkFCTEVfQ01ELCBpb2FkZHIpCi0KLS8qIGRpc2FibGUgcnggKi8KLSNkZWZpbmUJZWVwcm9fZGlzX3J4KGlvYWRkcikJb3V0YihSQ1ZfRElTQUJMRV9DTUQsIGlvYWRkcikKLQotLyogc3dpdGNoIGJhbmsgKi8KLSNkZWZpbmUgZWVwcm9fc3cyYmFuazAoaW9hZGRyKSBvdXRiKEJBTkswX1NFTEVDVCwgaW9hZGRyKQotI2RlZmluZSBlZXByb19zdzJiYW5rMShpb2FkZHIpIG91dGIoQkFOSzFfU0VMRUNULCBpb2FkZHIpCi0jZGVmaW5lIGVlcHJvX3N3MmJhbmsyKGlvYWRkcikgb3V0YihCQU5LMl9TRUxFQ1QsIGlvYWRkcikKLQotc3RhdGljIHVuc2lnbmVkIGludAlyeF9zdGFydCwgdHhfc3RhcnQ7Ci1zdGF0aWMgaW50CQl0eF9sYXN0Owotc3RhdGljIHVuc2lnbmVkCQl0eF9lbmQ7Ci1zdGF0aWMgaW50CQllZXBybyA9IDA7Ci1zdGF0aWMgdW5zaWduZWQgc2hvcnQJaW9hZGRyID0gMDsKLXN0YXRpYyB1bnNpZ25lZCBpbnQJbWVtX3N0YXJ0LCBtZW1fZW5kID0gUkNWX0RFRkFVTFRfUkFNIC8gMTAyNDsKLQotI2RlZmluZQl1ZGVsYXkobikJd2FpdG9uX3RpbWVyMigoKG4pKlRJQ0tTX1BFUl9NUykvMTAwMCkKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRVNFVCAtIFJlc2V0IGFkYXB0ZXIKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIGVlcHJvX3Jlc2V0KHN0cnVjdCBuaWMgKm5pYykKLXsKLQlpbnQJCXRlbXBfcmVnLCBpOwotCi0JLyogcHV0IHRoZSBjYXJkIGluIGl0cyBpbml0aWFsIHN0YXRlICovCi0JZWVwcm9fc3cyYmFuazIoaW9hZGRyKTsJLyogYmUgY2FyZWZ1bCwgYmFuazIgbm93ICovCi0JdGVtcF9yZWcgPSBpbmIoaW9hZGRyICsgZWVwcm9tX3JlZyk7Ci0jaWZkZWYJREVCVUcKLQlwcmludGYoIlN0ZXBwaW5nICVkXG4iLCB0ZW1wX3JlZyA+PiA1KTsKLSNlbmRpZgotCWlmICh0ZW1wX3JlZyAmIDB4MTApCS8qIGNoZWNrIHRoZSBUdXJuT2ZmIEVuYWJsZSBiaXQgKi8KLQkJb3V0Yih0ZW1wX3JlZyAmIDB4RUYsIGlvYWRkciArIGVlcHJvbV9yZWcpOwotCWZvciAoaSA9IDA7IGkgPCBFVEhfQUxFTjsgaSsrKQkvKiBmaWxsIHRoZSBNQUMgYWRkcmVzcyAqLwotCQlvdXRiKG5pYy0+bm9kZV9hZGRyW2ldLCBpb2FkZHIgKyBJX0FERF9SRUcwICsgaSk7Ci0JdGVtcF9yZWcgPSBpbmIoaW9hZGRyICsgUkVHMSk7Ci0JLyogc2V0dXAgVHJhbnNtaXQgQ2hhaW5pbmcgYW5kIGRpc2NhcmQgYmFkIFJDViBmcmFtZXMgKi8KLQlvdXRiKHRlbXBfcmVnIHwgWE1UX0NoYWluX0ludCB8IFhNVF9DaGFpbl9FcnJTdG9wCi0JCXwgUkNWX0Rpc2NhcmRfQmFkRnJhbWUsIGlvYWRkciArIFJFRzEpOwotCXRlbXBfcmVnID0gaW5iKGlvYWRkciArIFJFRzIpOwkJLyogbWF0Y2ggYnJvYWRjYXN0ICovCi0Jb3V0Yih0ZW1wX3JlZyB8IDB4MTQsIGlvYWRkciArIFJFRzIpOwotCXRlbXBfcmVnID0gaW5iKGlvYWRkciArIFJFRzMpOwotCW91dGIodGVtcF9yZWcgJiAweDNGLCBpb2FkZHIgKyBSRUczKTsJLyogY2xlYXIgdGVzdCBtb2RlICovCi0JLyogc2V0IHRoZSByZWNlaXZpbmcgbW9kZSAqLwotCWVlcHJvX3N3MmJhbmsxKGlvYWRkcik7CS8qIGJlIGNhcmVmdWwsIGJhbmsxIG5vdyAqLwotCS8qIGluaXRpYWxpc2UgdGhlIFJDViBhbmQgWE1UIHVwcGVyIGFuZCBsb3dlciBsaW1pdHMgKi8KLQlvdXRiKFJDVl9MT1dFUl9MSU1JVCwgaW9hZGRyICsgUkNWX0xPV0VSX0xJTUlUX1JFRyk7Ci0Jb3V0YihSQ1ZfVVBQRVJfTElNSVQsIGlvYWRkciArIFJDVl9VUFBFUl9MSU1JVF9SRUcpOwotCW91dGIoWE1UX0xPV0VSX0xJTUlULCBpb2FkZHIgKyB4bXRfbG93ZXJfbGltaXRfcmVnKTsKLQlvdXRiKFhNVF9VUFBFUl9MSU1JVCwgaW9hZGRyICsgeG10X3VwcGVyX2xpbWl0X3JlZyk7Ci0JZWVwcm9fc3cyYmFuazAoaW9hZGRyKTsJLyogU3dpdGNoIGJhY2sgdG8gYmFuayAwICovCi0JZWVwcm9fY2xlYXJfaW50KGlvYWRkcik7Ci0JLyogSW5pdGlhbGlzZSBSQ1YgKi8KLQlvdXR3KHJ4X3N0YXJ0ID0gKFJDVl9MT1dFUl9MSU1JVCA8PCA4KSwgaW9hZGRyICsgUkNWX0JBUik7Ci0Jb3V0dygoKFJDVl9VUFBFUl9MSU1JVCA8PCA4KSB8IDB4RkUpLCBpb2FkZHIgKyBSQ1ZfU1RPUCk7Ci0JLyogSW50aWFsaXNlIFhNVCAqLwotCW91dHcoKFhNVF9MT1dFUl9MSU1JVCA8PCA4KSwgaW9hZGRyICsgeG10X2Jhcik7Ci0JZWVwcm9fc2VsX3Jlc2V0KGlvYWRkcik7Ci0JdHhfc3RhcnQgPSB0eF9lbmQgPSAoWE1UX0xPV0VSX0xJTUlUIDw8IDgpOwotCXR4X2xhc3QgPSAwOwotCWVlcHJvX2VuX3J4KGlvYWRkcik7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUE9MTCAtIFdhaXQgZm9yIGEgZnJhbWUKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBpbnQgZWVwcm9fcG9sbChzdHJ1Y3QgbmljICpuaWMpCi17Ci0JaW50CQlpOwotCXVuc2lnbmVkIGludAlyY3ZfY2FyID0gcnhfc3RhcnQ7Ci0JdW5zaWduZWQgaW50CXJjdl9ldmVudCwgcmN2X3N0YXR1cywgcmN2X25leHRfZnJhbWUsIHJjdl9zaXplOwotCi0JLyogcmV0dXJuIHRydWUgaWYgdGhlcmUncyBhbiBldGhlcm5ldCBwYWNrZXQgcmVhZHkgdG8gcmVhZCAqLwotCS8qIG5pYy0+cGFja2V0IHNob3VsZCBjb250YWluIGRhdGEgb24gcmV0dXJuICovCi0JLyogbmljLT5wYWNrZXRsZW4gc2hvdWxkIGNvbnRhaW4gbGVuZ3RoIG9mIGRhdGEgKi8KLSNpZgkwCi0JaWYgKChpbmIoaW9hZGRyICsgU1RBVFVTX1JFRykgJiAweDQwKSA9PSAwKQotCQlyZXR1cm4gKDApOwotCW91dGIoMHg0MCwgaW9hZGRyICsgU1RBVFVTX1JFRyk7Ci0jZW5kaWYKLQlvdXR3KHJjdl9jYXIsIGlvYWRkciArIEhPU1RfQUREUkVTU19SRUcpOwotCXJjdl9ldmVudCA9IGludyhpb2FkZHIgKyBJT19QT1JUKTsKLQlpZiAocmN2X2V2ZW50ICE9IFJDVl9ET05FKQotCQlyZXR1cm4gKDApOwotCXJjdl9zdGF0dXMgPSBpbncoaW9hZGRyICsgSU9fUE9SVCk7Ci0JcmN2X25leHRfZnJhbWUgPSBpbncoaW9hZGRyICsgSU9fUE9SVCk7Ci0JcmN2X3NpemUgPSBpbncoaW9hZGRyICsgSU9fUE9SVCk7Ci0jaWYJMAotCXByaW50ZigiJWhYICVoWCAlZCAlaGhYXG4iLCByY3Zfc3RhdHVzLCByY3ZfbmV4dF9mcmFtZSwgcmN2X3NpemUsCi0JCWluYihpb2FkZHIgKyBTVEFUVVNfUkVHKSk7Ci0jZW5kaWYKLQlpZiAoKHJjdl9zdGF0dXMgJiAoUlhfT0t8UlhfRVJST1IpKSAhPSBSWF9PSykgewotCQlwcmludGYoIlJlY2VpdmUgZXJyb3IgJWhYXG4iLCByY3Zfc3RhdHVzKTsKLQkJcmV0dXJuICgwKTsKLQl9Ci0JcmN2X3NpemUgJj0gMHgzRkZGOwotCWluc3coaW9hZGRyICsgSU9fUE9SVCwgbmljLT5wYWNrZXQsICgocmN2X3NpemUgKyAzKSA+PiAxKSk7Ci0jaWYJMAotCWZvciAoaSA9IDA7IGkgPCA0ODsgaSsrKSB7Ci0JCXByaW50ZigiJWhoWCIsIG5pYy0+cGFja2V0W2ldKTsKLQkJcHV0Y2hhcihpICUgMTYgPT0gMTUgPyAnXG4nIDogJyAnKTsKLQl9Ci0jZW5kaWYKLQluaWMtPnBhY2tldGxlbiA9IHJjdl9zaXplOwotCXJjdl9jYXIgPSByeF9zdGFydCArIFJDVl9IRUFERVIgKyByY3Zfc2l6ZTsKLQlyeF9zdGFydCA9IHJjdl9uZXh0X2ZyYW1lOwotCWlmIChyY3ZfY2FyID09IDApCi0JCXJjdl9jYXIgPSAoKFJDVl9VUFBFUl9MSU1JVCA8PCA4KSB8IDB4ZmYpOwotCW91dHcocmN2X2NhciAtIDEsIGlvYWRkciArIFJDVl9TVE9QKTsKLQlyZXR1cm4gKDEpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVRSQU5TTUlUIC0gVHJhbnNtaXQgYSBmcmFtZQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgZWVwcm9fdHJhbnNtaXQoCi0Jc3RydWN0IG5pYyAqbmljLAotCWNvbnN0IGNoYXIgKmQsCQkJLyogRGVzdGluYXRpb24gKi8KLQl1bnNpZ25lZCBpbnQgdCwJCQkvKiBUeXBlICovCi0JdW5zaWduZWQgaW50IHMsCQkJLyogc2l6ZSAqLwotCWNvbnN0IGNoYXIgKnApCQkJLyogUGFja2V0ICovCi17Ci0JdW5zaWduZWQgaW50CXN0YXR1cywgdHhfYXZhaWxhYmxlLCBsYXN0LCBlbmQsIGxlbmd0aDsKLQl1bnNpZ25lZCBzaG9ydAl0eXBlOwotCWludAkJYm9ndXNjb3VudCA9IDIwOwotCi0JbGVuZ3RoID0gcyArIEVUSF9ITEVOOwotCWlmICh0eF9lbmQgPiB0eF9zdGFydCkKLQkJdHhfYXZhaWxhYmxlID0gWE1UX1JBTSAtICh0eF9lbmQgLSB0eF9zdGFydCk7Ci0JZWxzZSBpZiAodHhfZW5kIDwgdHhfc3RhcnQpCi0JCXR4X2F2YWlsYWJsZSA9IHR4X3N0YXJ0IC0gdHhfZW5kOwotCWVsc2UKLQkJdHhfYXZhaWxhYmxlID0gWE1UX1JBTTsKLQlsYXN0ID0gdHhfZW5kOwotCWVuZCA9IGxhc3QgKyAoKChsZW5ndGggKyAzKSA+PiAxKSA8PCAxKSArIFhNVF9IRUFERVI7Ci0JaWYgKGVuZCA+PSAoWE1UX1VQUEVSX0xJTUlUIDw8IDgpKSB7Ci0JCWxhc3QgPSAoWE1UX0xPV0VSX0xJTUlUIDw8IDgpOwotCQllbmQgPSBsYXN0ICsgKCgobGVuZ3RoICsgMykgPj4gMSkgPDwgMSkgKyBYTVRfSEVBREVSOwotCX0KLQlvdXR3KGxhc3QsIGlvYWRkciArIEhPU1RfQUREUkVTU19SRUcpOwotCW91dHcoWE1UX0NNRCwgaW9hZGRyICsgSU9fUE9SVCk7Ci0Jb3V0dygwLCBpb2FkZHIgKyBJT19QT1JUKTsKLQlvdXR3KGVuZCwgaW9hZGRyICsgSU9fUE9SVCk7Ci0Jb3V0dyhsZW5ndGgsIGlvYWRkciArIElPX1BPUlQpOwotCW91dHN3KGlvYWRkciArIElPX1BPUlQsIGQsIEVUSF9BTEVOIC8gMik7Ci0Jb3V0c3coaW9hZGRyICsgSU9fUE9SVCwgbmljLT5ub2RlX2FkZHIsIEVUSF9BTEVOIC8gMik7Ci0JdHlwZSA9IGh0b25zKHQpOwotCW91dHN3KGlvYWRkciArIElPX1BPUlQsICZ0eXBlLCBzaXplb2YodHlwZSkgLyAyKTsKLQlvdXRzdyhpb2FkZHIgKyBJT19QT1JULCBwLCAocyArIDMpID4+IDEpOwotCS8qIEEgZHVtbXkgcmVhZCB0byBmbHVzaCB0aGUgRFJBTSB3cml0ZSBwaXBlbGluZSAqLwotCXN0YXR1cyA9IGludyhpb2FkZHIgKyBJT19QT1JUKTsKLQlvdXR3KGxhc3QsIGlvYWRkciArIHhtdF9iYXIpOwotCW91dGIoWE1UX0NNRCwgaW9hZGRyKTsKLQl0eF9zdGFydCA9IGxhc3Q7Ci0JdHhfbGFzdCA9IGxhc3Q7Ci0JdHhfZW5kID0gZW5kOwotI2lmCTAKLQlwcmludGYoIiVkICVkXG4iLCB0eF9zdGFydCwgdHhfZW5kKTsKLSNlbmRpZgotCXdoaWxlIChib2d1c2NvdW50ID4gMCkgewotCQlpZiAoKChzdGF0dXMgPSBpbncoaW9hZGRyICsgSU9fUE9SVCkpICYgVFhfRE9ORV9CSVQpID09IDApIHsKLQkJCXVkZWxheSg0MCk7Ci0JCQlib2d1c2NvdW50LS07Ci0JCQljb250aW51ZTsKLQkJfQotI2lmCURFQlVHCi0JCWlmICgoc3RhdHVzICYgMHgyMDAwKSA9PSAwKQotCQkJcHJpbnRmKCJUcmFuc21pdCBzdGF0dXMgJWhYXG4iLCBzdGF0dXMpOwotI2VuZGlmCi0JfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLURJU0FCTEUgLSBUdXJuIG9mZiBldGhlcm5ldCBpbnRlcmZhY2UKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIGVlcHJvX2Rpc2FibGUoc3RydWN0IG5pYyAqbmljKQotewotCWVlcHJvX3N3MmJhbmswKGlvYWRkcik7CS8qIFN3aXRjaCB0byBiYW5rIDAgKi8KLQkvKiBGbHVzaCB0aGUgVHggYW5kIGRpc2FibGUgUnggKi8KLQlvdXRiKFNUT1BfUkNWX0NNRCwgaW9hZGRyKTsKLQl0eF9zdGFydCA9IHR4X2VuZCA9IChYTVRfTE9XRVJfTElNSVQgPDwgOCk7Ci0JdHhfbGFzdCA9IDA7Ci0JLyogUmVzZXQgdGhlIDgyNTk1ICovCi0JZWVwcm9fZnVsbF9yZXNldChpb2FkZHIpOwotfQotCi1zdGF0aWMgaW50IHJlYWRfZWVwcm9tKGludCBsb2NhdGlvbikKLXsKLQlpbnQJCWk7Ci0JdW5zaWduZWQgc2hvcnQJcmV0dmFsID0gMDsKLQlpbnQJCWVlX2FkZHIgPSBpb2FkZHIgKyBlZXByb21fcmVnOwotCWludAkJcmVhZF9jbWQgPSBsb2NhdGlvbiB8IEVFX1JFQURfQ01EOwotCWludAkJY3RybF92YWwgPSBFRUNTOwotCi0JaWYgKGVlcHJvID09IExBTjU5NUZYXzEwSVNBKSB7Ci0JCWVlcHJvX3N3MmJhbmsxKGlvYWRkcik7Ci0JCW91dGIoMHgwMCwgaW9hZGRyICsgU1RBVFVTX1JFRyk7Ci0JfQotCWVlcHJvX3N3MmJhbmsyKGlvYWRkcik7Ci0Jb3V0YihjdHJsX3ZhbCwgZWVfYWRkcik7Ci0JLyogc2hpZnQgdGhlIHJlYWQgY29tbWFuZCBiaXRzIG91dCAqLwotCWZvciAoaSA9IDg7IGkgPj0gMDsgaS0tKSB7Ci0JCXNob3J0IG91dHZhbCA9IChyZWFkX2NtZCAmICgxIDw8IGkpKSA/IGN0cmxfdmFsIHwgRUVESSA6IGN0cmxfdmFsOwotCQlvdXRiKG91dHZhbCwgZWVfYWRkcik7Ci0JCW91dGIob3V0dmFsIHwgRUVTSywgZWVfYWRkcik7CS8qIEVFUFJPTSBjbG9jayB0aWNrICovCi0JCWVlcHJvbV9kZWxheSgpOwotCQlvdXRiKG91dHZhbCwgZWVfYWRkcik7CQkvKiBmaW5pc2ggRUVQUk9NIGNsb2NrIHRpY2sgKi8KLQkJZWVwcm9tX2RlbGF5KCk7Ci0JfQotCW91dGIoY3RybF92YWwsIGVlX2FkZHIpOwotCWZvciAoaSA9IDE2OyBpID4gMDsgaS0tKSB7Ci0JCW91dGIoY3RybF92YWwgfCBFRVNLLCBlZV9hZGRyKTsKLQkJZWVwcm9tX2RlbGF5KCk7Ci0JCXJldHZhbCA9IChyZXR2YWwgPDwgMSkgfCAoKGluYihlZV9hZGRyKSAmIEVFRE8pID8gMSA6IDApOwotCQlvdXRiKGN0cmxfdmFsLCBlZV9hZGRyKTsKLQkJZWVwcm9tX2RlbGF5KCk7Ci0JfQotCS8qIHRlcm1pbmF0ZSB0aGUgRUVQUk9NIGFjY2VzcyAqLwotCWN0cmxfdmFsICY9IH5FRUNTOwotCW91dGIoY3RybF92YWwgfCBFRVNLLCBlZV9hZGRyKTsKLQllZXByb21fZGVsYXkoKTsKLQlvdXRiKGN0cmxfdmFsLCBlZV9hZGRyKTsKLQllZXByb21fZGVsYXkoKTsKLQllZXByb19zdzJiYW5rMChpb2FkZHIpOwotCXJldHVybiAocmV0dmFsKTsKLX0KLQotc3RhdGljIGludCBlZXByb19wcm9iZTEoc3RydWN0IG5pYyAqbmljKQotewotCWludAkJaSwgaWQsIGNvdW50ZXIsIGxfZWVwcm8gPSAwOwotCXVuaW9uIHsKLQkJdW5zaWduZWQgY2hhcgljYWRkcltFVEhfQUxFTl07Ci0JCXVuc2lnbmVkIHNob3J0CXNhZGRyW0VUSF9BTEVOLzJdOwotCX0gc3RhdGlvbl9hZGRyOwotCWNoYXIJCSpuYW1lOwotCi0JaWQgPSBpbmIoaW9hZGRyICsgSURfUkVHKTsKLQlpZiAoKGlkICYgSURfUkVHX01BU0spICE9IElEX1JFR19TSUcpCi0JCXJldHVybiAoMCk7Ci0JY291bnRlciA9IGlkICYgUl9ST0JJTl9CSVRTOwotCWlmICgoKGlkID0gaW5iKGlvYWRkciArIElEX1JFRykpICYgUl9ST0JJTl9CSVRTKSAhPSAoY291bnRlciArIDB4NDApKQotCQlyZXR1cm4gKDApOwotCS8qIHllcyB0aGUgODI1OTUgaGFzIGJlZW4gZm91bmQgKi8KLQlzdGF0aW9uX2FkZHIuc2FkZHJbMl0gPSByZWFkX2VlcHJvbSgyKTsKLQlpZiAoc3RhdGlvbl9hZGRyLnNhZGRyWzJdID09IDB4MDAwMCB8fCBzdGF0aW9uX2FkZHIuc2FkZHJbMl0gPT0gMHhGRkZGKSB7Ci0JCWxfZWVwcm8gPSAzOwotCQllZXBybyA9IExBTjU5NUZYXzEwSVNBOwotCQllZXByb21fcmVnPSBFRVBST01fUkVHXzEwOwotCQlyY3Zfc3RhcnQgPSBSQ1ZfU1RBUlRfMTA7Ci0JCXhtdF9sb3dlcl9saW1pdF9yZWcgPSBYTVRfTE9XRVJfTElNSVRfUkVHXzEwOwotCQl4bXRfdXBwZXJfbGltaXRfcmVnID0gWE1UX1VQUEVSX0xJTUlUX1JFR18xMDsKLQkJc3RhdGlvbl9hZGRyLnNhZGRyWzJdID0gcmVhZF9lZXByb20oMik7Ci0JfQotCXN0YXRpb25fYWRkci5zYWRkclsxXSA9IHJlYWRfZWVwcm9tKDMpOwotCXN0YXRpb25fYWRkci5zYWRkclswXSA9IHJlYWRfZWVwcm9tKDQpOwotCWlmIChsX2VlcHJvKQotCQluYW1lID0gIkludGVsIEV0aGVyRXhwcmVzcyAxMCBJU0EiOwotCWVsc2UgaWYgKHJlYWRfZWVwcm9tKDcpID09IGVlX0ZYX0lOVDJJUlEpIHsKLQkJbmFtZSA9ICJJbnRlbCBFdGhlckV4cHJlc3MgUHJvLzEwKyBJU0EiOwotCQlsX2VlcHJvID0gMjsKLQl9IGVsc2UgaWYgKHN0YXRpb25fYWRkci5zYWRkclswXSA9PSBTQV9BRERSMSkgewotCQluYW1lID0gIkludGVsIEV0aGVyRXhwcmVzcyBQcm8vMTAgSVNBIjsKLQkJbF9lZXBybyA9IDE7Ci0JfSBlbHNlIHsKLQkJbF9lZXBybyA9IDA7Ci0JCW5hbWUgPSAiSW50ZWwgODI1OTUtYmFzZWQgTEFOIGNhcmQiOwotCX0KLQlzdGF0aW9uX2FkZHIuc2FkZHJbMF0gPSBzd2FwMTYoc3RhdGlvbl9hZGRyLnNhZGRyWzBdKTsKLQlzdGF0aW9uX2FkZHIuc2FkZHJbMV0gPSBzd2FwMTYoc3RhdGlvbl9hZGRyLnNhZGRyWzFdKTsKLQlzdGF0aW9uX2FkZHIuc2FkZHJbMl0gPSBzd2FwMTYoc3RhdGlvbl9hZGRyLnNhZGRyWzJdKTsKLQlmb3IgKGkgPSAwOyBpIDwgRVRIX0FMRU47IGkrKykgewotCQluaWMtPm5vZGVfYWRkcltpXSA9IHN0YXRpb25fYWRkci5jYWRkcltpXTsKLQl9Ci0JcHJpbnRmKCJcbiVzIGlvYWRkciAlI2hYLCBhZGRyICUhIiwgbmFtZSwgaW9hZGRyLCBuaWMtPm5vZGVfYWRkcik7Ci0JbWVtX3N0YXJ0ID0gUkNWX0xPV0VSX0xJTUlUIDw8IDg7Ci0JaWYgKChtZW1fZW5kICYgMHgzRikgPCAzIHx8IChtZW1fZW5kICYgMHgzRikgPiAyOSkKLQkJbWVtX2VuZCA9IFJDVl9VUFBFUl9MSU1JVCA8PCA4OwotCWVsc2UgewotCQltZW1fZW5kID0gbWVtX2VuZCAqIDEwMjQgKyAoUkNWX0xPV0VSX0xJTUlUIDw8IDgpOwotCQlyY3ZfcmFtID0gbWVtX2VuZCAtIChSQ1ZfTE9XRVJfTElNSVQgPDwgOCk7Ci0JfQotCXByaW50ZigiLCBSeCBtZW0gJWRLLCBpZiAlc1xuIiwgKG1lbV9lbmQgLSBtZW1fc3RhcnQpID4+IDEwLAotCQlHZXRCaXQocmVhZF9lZXByb20oNSksIGVlX0JOQ19UUEUpID8gIkJOQyIgOiAiVFAiKTsKLQlyZXR1cm4gKDEpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVBST0JFIC0gTG9vayBmb3IgYW4gYWRhcHRlciwgdGhpcyByb3V0aW5lJ3MgdmlzaWJsZSB0byB0aGUgb3V0c2lkZQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RydWN0IG5pYyAqZWVwcm9fcHJvYmUoc3RydWN0IG5pYyAqbmljLCB1bnNpZ25lZCBzaG9ydCAqcHJvYmVfYWRkcnMpCi17Ci0JdW5zaWduZWQgc2hvcnQJCSpwOwotCS8qIHNhbWUgcHJvYmUgbGlzdCBhcyB0aGUgTGludXggZHJpdmVyICovCi0Jc3RhdGljIHVuc2lnbmVkIHNob3J0CWlvYWRkcnNbXSA9IHsKLQkJMHgzMDAsIDB4MjEwLCAweDI0MCwgMHgyODAsIDB4MkMwLCAweDIwMCwgMHgzMjAsIDB4MzQwLCAweDM2MCwgMH07Ci0KLQlpZiAocHJvYmVfYWRkcnMgPT0gMCB8fCBwcm9iZV9hZGRyc1swXSA9PSAwKQotCQlwcm9iZV9hZGRycyA9IGlvYWRkcnM7Ci0JZm9yIChwID0gcHJvYmVfYWRkcnM7IChpb2FkZHIgPSAqcCkgIT0gMDsgcCsrKSB7Ci0JCWlmIChlZXByb19wcm9iZTEobmljKSkKLQkJCWJyZWFrOwotCX0KLQlpZiAoKnAgPT0gMCkKLQkJcmV0dXJuICgwKTsKLQllZXByb19yZXNldChuaWMpOwotCS8qIHBvaW50IHRvIE5JQyBzcGVjaWZpYyByb3V0aW5lcyAqLwotCW5pYy0+cmVzZXQgPSBlZXByb19yZXNldDsKLQluaWMtPnBvbGwgPSBlZXByb19wb2xsOwotCW5pYy0+dHJhbnNtaXQgPSBlZXByb190cmFuc21pdDsKLQluaWMtPmRpc2FibGUgPSBlZXByb19kaXNhYmxlOwotCXJldHVybiAobmljKTsKLX0KZGlmZiAtTmF1ciBncnViLTAuOTcub3JpZy9uZXRib290L2VlcHJvMTAwLmMgZ3J1Yi0wLjk3L25ldGJvb3QvZWVwcm8xMDAuYwotLS0gZ3J1Yi0wLjk3Lm9yaWcvbmV0Ym9vdC9lZXBybzEwMC5jCTIwMDMtMDctMDkgMTE6NDU6MzcuMDAwMDAwMDAwICswMDAwCisrKyBncnViLTAuOTcvbmV0Ym9vdC9lZXBybzEwMC5jCTIwMDUtMDgtMzEgMTk6MDM6MzUuMDAwMDAwMDAwICswMDAwCkBAIC04MCw4ICs4MCw4IEBACiAgKgogICogQ2F2ZWF0czoKICAqCi0gKiBUaGUgZXRoZXJib290IGZyYW1ld29yayBtb3ZlcyB0aGUgY29kZSB0byB0aGUgMzJrIHNlZ21lbnQgZnJvbQotICogMHg5ODAwMCB0byAweGEwMDAwLiBUaGVyZSBpcyBqdXN0IGEgbGl0dGxlIHJvb20gYmV0d2VlbiB0aGUgZW5kIG9mCisgKiBUaGUgRXRoZXJib290IGZyYW1ld29yayBtb3ZlcyB0aGUgY29kZSB0byB0aGUgNDhrIHNlZ21lbnQgZnJvbQorICogMHg5NDAwMCB0byAweGEwMDAwLiBUaGVyZSBpcyBqdXN0IGEgbGl0dGxlIHJvb20gYmV0d2VlbiB0aGUgZW5kIG9mCiAgKiB0aGlzIGRyaXZlciBhbmQgdGhlIDB4YTAwMDAgYWRkcmVzcy4gSWYgeW91IGNvbXBpbGUgaW4gdG9vIG1hbnkKICAqIGZlYXR1cmVzLCB0aGlzIHdpbGwgb3ZlcmZsb3cuCiAgKiBUaGUgbnVtYmVyIHVuZGVyICJoZXgiIGluIHRoZSBvdXRwdXQgb2Ygc2l6ZSB0aGF0IHNjcm9sbHMgYnkgd2hpbGUKQEAgLTkyLDE3ICs5MiwxMyBAQAogLyogVGhlIGV0aGVyYm9vdCBhdXRob3JzIHNlZW0gdG8gZGlzbGlrZSB0aGUgYXJndW1lbnQgb3JkZXJpbmcgaW4KICAqIG91dGIgbWFjcm9zIHRoYXQgTGludXggdXNlcy4gSSBkaXNrbGlrZSB0aGUgY29uZnVzaW9uIHRoYXQgdGhpcwogICogaGFzIGNhdXNlZCBldmVuIG1vcmUuLi4uIFRoaXMgZmlsZSB1c2VzIHRoZSBMaW51eCBhcmd1bWVudCBvcmRlcmluZy4gICovCi0vKiBTb3JyeSBub3QgdXMuIEl0J3MgaW5oZXJ0ZWQgY29kZSBmcm9tIEZyZWVCU0QuIFtUaGUgYXV0aG9yc10gKi8KKy8qIFNvcnJ5IG5vdCB1cy4gSXQncyBpbmhlcml0ZWQgY29kZSBmcm9tIEZyZWVCU0QuIFtUaGUgYXV0aG9yc10gKi8KIAogI2luY2x1ZGUgImV0aGVyYm9vdC5oIgogI2luY2x1ZGUgIm5pYy5oIgogI2luY2x1ZGUgInBjaS5oIgotI2luY2x1ZGUgImNhcmRzLmgiCiAjaW5jbHVkZSAidGltZXIuaCIKIAotI3VuZGVmCXZpcnRfdG9fYnVzCi0jZGVmaW5lCXZpcnRfdG9fYnVzKHgpCSgodW5zaWduZWQgbG9uZyl4KQotCiBzdGF0aWMgaW50IGlvYWRkcjsKIAogdHlwZWRlZiB1bnNpZ25lZCBjaGFyICB1ODsKQEAgLTEyMSw2ICsxMTcsMTggQEAKICAgU0NCRWFybHlSeCA9IDIwLCAgICAgICAgICAgICAgICAvKiBFYXJseSByZWNlaXZlIGJ5dGUgY291bnQuICovCiB9OwogCitlbnVtIFNDQkNtZEJpdHMgeworCVNDQk1hc2tDbWREb25lPTB4ODAwMCwgU0NCTWFza1J4RG9uZT0weDQwMDAsIFNDQk1hc2tDbWRJZGxlPTB4MjAwMCwKKwlTQ0JNYXNrUnhTdXNwZW5kPTB4MTAwMCwgU0NCTWFza0Vhcmx5Ung9MHgwODAwLCBTQ0JNYXNrRmxvd0N0bD0weDA0MDAsCisJU0NCVHJpZ2dlckludHI9MHgwMjAwLCBTQ0JNYXNrQWxsPTB4MDEwMCwKKwkvKiBUaGUgcmVzdCBhcmUgUnggYW5kIFR4IGNvbW1hbmRzLiAqLworCUNVU3RhcnQ9MHgwMDEwLCBDVVJlc3VtZT0weDAwMjAsIENVU3RhdHNBZGRyPTB4MDA0MCwgQ1VTaG93U3RhdHM9MHgwMDUwLAorCUNVQ21kQmFzZT0weDAwNjAsCS8qIENVIEJhc2UgYWRkcmVzcyAoc2V0IHRvIHplcm8pIC4gKi8KKwlDVUR1bXBTdGF0cz0weDAwNzAsIC8qIER1bXAgdGhlbiByZXNldCBzdGF0cyBjb3VudGVycy4gKi8KKwlSeFN0YXJ0PTB4MDAwMSwgUnhSZXN1bWU9MHgwMDAyLCBSeEFib3J0PTB4MDAwNCwgUnhBZGRyTG9hZD0weDAwMDYsCisJUnhSZXN1bWVOb1Jlc291cmNlcz0weDAwMDcsCit9OworCiBzdGF0aWMgaW50IGRvX2VlcHJvbV9jbWQoaW50IGNtZCwgaW50IGNtZF9sZW4pOwogdm9pZCBoZCh2b2lkICp3aGVyZSwgaW50IG4pOwogCkBAIC0xMzksOCArMTQ3LDYgQEAKICNkZWZpbmUgRUVfV1JJVEVfMSAgICAgIDB4NDgwNgogI2RlZmluZSBFRV9FTkIgICAgICAgICAgKDB4NDgwMCB8IEVFX0NTKQogCi0jZGVmaW5lIHVkZWxheShuKSAgICAgICB3YWl0b25fdGltZXIyKCgobikqVElDS1NfUEVSX01TKS8xMDAwKQotCiAvKiBUaGUgRUVQUk9NIGNvbW1hbmRzIGluY2x1ZGUgdGhlIGFsd2F5LXNldCBsZWFkaW5nIGJpdC4gKi8KICNkZWZpbmUgRUVfUkVBRF9DTUQgICAgIDYKIApAQCAtMTg0LDkgKzE5MCwxOCBAQAogICAgVHlwaWNhbGx5IHRoaXMgdGFrZXMgMCB0aWNrcy4gKi8KIHN0YXRpYyBpbmxpbmUgdm9pZCB3YWl0X2Zvcl9jbWRfZG9uZShpbnQgY21kX2lvYWRkcikKIHsKLSAgc2hvcnQgd2FpdCA9IDEwMDsKLSAgZG8gICA7Ci0gIHdoaWxlKGluYihjbWRfaW9hZGRyKSAmJiAtLXdhaXQgPj0gMCk7CisgIGludCB3YWl0ID0gMDsKKyAgaW50IGRlbGF5ZWRfY21kOworCisgIGRvCisgICAgaWYgKGluYihjbWRfaW9hZGRyKSA9PSAwKSByZXR1cm47CisgIHdoaWxlKCsrd2FpdCA8PSAxMDApOworICBkZWxheWVkX2NtZCA9IGluYihjbWRfaW9hZGRyKTsKKyAgZG8KKyAgICBpZiAoaW5iKGNtZF9pb2FkZHIpID09IDApIGJyZWFrOworICB3aGlsZSgrK3dhaXQgPD0gMTAwMDApOworICBwcmludGYoIkNvbW1hbmQgJTIuMnggd2FzIG5vdCBpbW1lZGlhdGVseSBhY2NlcHRlZCwgJWQgdGlja3MhXG4iLAorICAgICAgZGVsYXllZF9jbWQsIHdhaXQpOwogfQogCiAvKiBFbGVtZW50cyBvZiB0aGUgZHVtcF9zdGF0aXN0aWNzIGJsb2NrLiBUaGlzIGJsb2NrIG11c3QgYmUgbHdvcmQgYWxpZ25lZC4gKi8KQEAgLTIxMiwzNSArMjI3LDMwIEBACiAKIC8qIEEgc3BlZWRvMyBUWCBidWZmZXIgZGVzY3JpcHRvciB3aXRoIHR3byBidWZmZXJzLi4uICovCiBzdGF0aWMgc3RydWN0IFR4RkQgewotICB2b2xhdGlsZSBzMTYgc3RhdHVzOwotICBzMTYgY29tbWFuZDsKLSAgdTMyIGxpbms7ICAgICAgICAgIC8qIHZvaWQgKiAqLwotICB1MzIgdHhfZGVzY19hZGRyOyAgLyogKGFsbW9zdCkgQWx3YXlzIHBvaW50cyB0byB0aGUgdHhfYnVmX2FkZHIgZWxlbWVudC4gKi8KLSAgczMyIGNvdW50OyAgICAgICAgIC8qICMgb2YgVEJEICg9MiksIFR4IHN0YXJ0IHRocmVzaC4sIGV0Yy4gKi8KLSAgICAgICAgICAgICAgICAgICAgIC8qIFRoaXMgY29uc3RpdHV0ZXMgdHdvICJUQkQiIGVudHJpZXM6IGhkciBhbmQgZGF0YSAqLwotICB1MzIgdHhfYnVmX2FkZHIwOyAgLyogdm9pZCAqLCBoZWFkZXIgb2YgZnJhbWUgdG8gYmUgdHJhbnNtaXR0ZWQuICAqLwotICBzMzIgdHhfYnVmX3NpemUwOyAgLyogTGVuZ3RoIG9mIFR4IGhkci4gKi8KLSAgdTMyIHR4X2J1Zl9hZGRyMTsgIC8qIHZvaWQgKiwgZGF0YSB0byBiZSB0cmFuc21pdHRlZC4gICovCi0gIHMzMiB0eF9idWZfc2l6ZTE7ICAvKiBMZW5ndGggb2YgVHggZGF0YS4gKi8KKwl2b2xhdGlsZSBzMTYgc3RhdHVzOworCXMxNiBjb21tYW5kOworCXUzMiBsaW5rOyAgICAgICAgICAvKiB2b2lkICogKi8KKwl1MzIgdHhfZGVzY19hZGRyOyAgLyogKGFsbW9zdCkgQWx3YXlzIHBvaW50cyB0byB0aGUgdHhfYnVmX2FkZHIgZWxlbWVudC4gKi8KKwlzMzIgY291bnQ7ICAgICAgICAgLyogIyBvZiBUQkQgKD0yKSwgVHggc3RhcnQgdGhyZXNoLiwgZXRjLiAqLworCS8qIFRoaXMgY29uc3RpdHV0ZXMgdHdvICJUQkQiIGVudHJpZXM6IGhkciBhbmQgZGF0YSAqLworCXUzMiB0eF9idWZfYWRkcjA7ICAvKiB2b2lkICosIGhlYWRlciBvZiBmcmFtZSB0byBiZSB0cmFuc21pdHRlZC4gICovCisJczMyIHR4X2J1Zl9zaXplMDsgIC8qIExlbmd0aCBvZiBUeCBoZHIuICovCisJdTMyIHR4X2J1Zl9hZGRyMTsgIC8qIHZvaWQgKiwgZGF0YSB0byBiZSB0cmFuc21pdHRlZC4gICovCisJczMyIHR4X2J1Zl9zaXplMTsgIC8qIExlbmd0aCBvZiBUeCBkYXRhLiAqLwogfSB0eGZkOwogCiBzdHJ1Y3QgUnhGRCB7ICAgICAgICAgICAgICAgLyogUmVjZWl2ZSBmcmFtZSBkZXNjcmlwdG9yLiAqLwotICB2b2xhdGlsZSBzMTYgc3RhdHVzOwotICBzMTYgY29tbWFuZDsKLSAgdTMyIGxpbms7ICAgICAgICAgICAgICAgICAvKiBzdHJ1Y3QgUnhGRCAqICovCi0gIHUzMiByeF9idWZfYWRkcjsgICAgICAgICAgLyogdm9pZCAqICovCi0gIHUxNiBjb3VudDsKLSAgdTE2IHNpemU7Ci0gIGNoYXIgcGFja2V0WzE1MThdOworCXZvbGF0aWxlIHMxNiBzdGF0dXM7CisJczE2IGNvbW1hbmQ7CisJdTMyIGxpbms7ICAgICAgICAgICAgICAgICAvKiBzdHJ1Y3QgUnhGRCAqICovCisJdTMyIHJ4X2J1Zl9hZGRyOyAgICAgICAgICAvKiB2b2lkICogKi8KKwl1MTYgY291bnQ7CisJdTE2IHNpemU7CisJY2hhciBwYWNrZXRbMTUxOF07CiB9OwogCi0jaWZkZWYJVVNFX0xPV01FTV9CVUZGRVIKLSNkZWZpbmUgcnhmZCAoKHN0cnVjdCBSeEZEICopKDB4MTAwMDAgLSBzaXplb2Yoc3RydWN0IFJ4RkQpKSkKLSNkZWZpbmUgQUNDRVNTKHgpIHgtPgotI2Vsc2UKIHN0YXRpYyBzdHJ1Y3QgUnhGRCByeGZkOwogI2RlZmluZSBBQ0NFU1MoeCkgeC4KLSNlbmRpZgogCiBzdGF0aWMgaW50IGNvbmdlbmIgPSAwOyAgICAgICAgIC8qIEVuYWJsZSBjb25nZXN0aW9uIGNvbnRyb2wgaW4gdGhlIERQODM4NDAuICovCiBzdGF0aWMgaW50IHR4ZmlmbyA9IDg7ICAgICAgICAgIC8qIFR4IEZJRk8gdGhyZXNob2xkIGluIDQgYnl0ZSB1bml0cywgMC0xNSAqLwpAQCAtMjU2LDggKzI2Niw3IEBACiAgIHUzMiBsaW5rOwogICB1bnNpZ25lZCBjaGFyIGRhdGFbMjJdOwogfSBjb25mY21kID0gewotICAwLCBDbWRDb25maWd1cmUsCi0gICh1MzIpICYgdHhmZCwKKyAgMCwgMCwgMCwgLyogZmlsbGVkIGluIGxhdGVyICovCiAgIHsyMiwgMHgwOCwgMCwgMCwgIDAsIDB4ODAsIDB4MzIsIDB4MDMsICAxLCAvKiAxPVVzZSBNSUkgIDA9VXNlIEFVSSAqLwogICAgMCwgMHgyRSwgMCwgIDB4NjAsIDAsCiAgICAweGYyLCAweDQ4LCAgIDAsIDB4NDAsIDB4ZjIsIDB4ODAsICAgICAgICAvKiAweDQwPUZvcmNlIGZ1bGwtZHVwbGV4ICovCkBAIC0yNzYsMTkgKzI4NSwyMCBAQAogCiBzdGF0aWMgaW50IG1kaW9fd3JpdGUoaW50IHBoeV9pZCwgaW50IGxvY2F0aW9uLCBpbnQgdmFsdWUpCiB7Ci0gIGludCB2YWwsIGJvZ3VzY250ID0gNjQqNDsgICAgICAgICAvKiA8NjQgdXNlYy4gdG8gY29tcGxldGUsIHR5cCAyNyB0aWNrcyAqLworCWludCB2YWwsIGJvZ3VzY250ID0gNjQqNDsgICAgICAgICAvKiA8NjQgdXNlYy4gdG8gY29tcGxldGUsIHR5cCAyNyB0aWNrcyAqLwogCi0gIG91dGwoMHgwNDAwMDAwMCB8IChsb2NhdGlvbjw8MTYpIHwgKHBoeV9pZDw8MjEpIHwgdmFsdWUsCi0gICAgICAgaW9hZGRyICsgU0NCQ3RybE1ESSk7Ci0gIGRvIHsKLSAgICB1ZGVsYXkoMTYpOwotCi0gICAgdmFsID0gaW5sKGlvYWRkciArIFNDQkN0cmxNREkpOwotICAgIGlmICgtLWJvZ3VzY250IDwgMCkgewotICAgICAgcHJpbnRmKCIgbWRpb193cml0ZSgpIHRpbWVkIG91dCB3aXRoIHZhbCA9ICVYLlxuIiwgdmFsKTsKLSAgICB9Ci0gIH0gd2hpbGUgKCEgKHZhbCAmIDB4MTAwMDAwMDApKTsKLSAgcmV0dXJuIHZhbCAmIDB4ZmZmZjsKKwlvdXRsKDB4MDQwMDAwMDAgfCAobG9jYXRpb248PDE2KSB8IChwaHlfaWQ8PDIxKSB8IHZhbHVlLAorCSAgICAgaW9hZGRyICsgU0NCQ3RybE1ESSk7CisJZG8geworCQl1ZGVsYXkoMTYpOworCQkKKwkJdmFsID0gaW5sKGlvYWRkciArIFNDQkN0cmxNREkpOworCQlpZiAoLS1ib2d1c2NudCA8IDApIHsKKwkJCXByaW50ZigiIG1kaW9fd3JpdGUoKSB0aW1lZCBvdXQgd2l0aCB2YWwgPSAlWC5cbiIsIHZhbCk7CisJCQlicmVhazsKKwkJfQorCX0gd2hpbGUgKCEgKHZhbCAmIDB4MTAwMDAwMDApKTsKKwlyZXR1cm4gdmFsICYgMHhmZmZmOwogfQogCiAvKiBTdXBwb3J0IGZ1bmN0aW9uOiBtZGlvX3JlYWQKQEAgLTI5OCwxNyArMzA4LDE5IEBACiAgKi8KIHN0YXRpYyBpbnQgbWRpb19yZWFkKGludCBwaHlfaWQsIGludCBsb2NhdGlvbikKIHsKLSAgaW50IHZhbCwgYm9ndXNjbnQgPSA2NCo0OyAgICAgICAgICAgICAgIC8qIDw2NCB1c2VjLiB0byBjb21wbGV0ZSwgdHlwIDI3IHRpY2tzICovCi0gIG91dGwoMHgwODAwMDAwMCB8IChsb2NhdGlvbjw8MTYpIHwgKHBoeV9pZDw8MjEpLCBpb2FkZHIgKyBTQ0JDdHJsTURJKTsKLSAgZG8gewotICAgIHVkZWxheSgxNik7Ci0KLSAgICB2YWwgPSBpbmwoaW9hZGRyICsgU0NCQ3RybE1ESSk7Ci0gICAgaWYgKC0tYm9ndXNjbnQgPCAwKSB7Ci0gICAgICBwcmludGYoICIgbWRpb19yZWFkKCkgdGltZWQgb3V0IHdpdGggdmFsID0gJVguXG4iLCB2YWwpOwotICAgIH0KLSAgfSB3aGlsZSAoISAodmFsICYgMHgxMDAwMDAwMCkpOwotICByZXR1cm4gdmFsICYgMHhmZmZmOworCWludCB2YWwsIGJvZ3VzY250ID0gNjQqNDsgICAgICAgICAgICAgICAvKiA8NjQgdXNlYy4gdG8gY29tcGxldGUsIHR5cCAyNyB0aWNrcyAqLworCW91dGwoMHgwODAwMDAwMCB8IChsb2NhdGlvbjw8MTYpIHwgKHBoeV9pZDw8MjEpLCBpb2FkZHIgKyBTQ0JDdHJsTURJKTsKKwlkbyB7CisJCXVkZWxheSgxNik7CisJCQorCQl2YWwgPSBpbmwoaW9hZGRyICsgU0NCQ3RybE1ESSk7CisKKwkJaWYgKC0tYm9ndXNjbnQgPCAwKSB7CisJCQlwcmludGYoICIgbWRpb19yZWFkKCkgdGltZWQgb3V0IHdpdGggdmFsID0gJVguXG4iLCB2YWwpOworCQkJYnJlYWs7CisJCX0KKwl9IHdoaWxlICghICh2YWwgJiAweDEwMDAwMDAwKSk7CisJcmV0dXJuIHZhbCAmIDB4ZmZmZjsKIH0KIAogLyogVGhlIGZpeGVzIGZvciB0aGUgY29kZSB3ZXJlIGtpbmRseSBwcm92aWRlZCBieSBEcmFnYW4gU3RhbmNldmljCkBAIC0zNDAsMjUgKzM1MiwyNiBAQAogCXJldHVybiByZXR2YWw7CiB9CiAKKyNpZiAwCiBzdGF0aWMgaW5saW5lIHZvaWQgd2hlcmVhbWkgKGNvbnN0IGNoYXIgKnN0cikKIHsKLSNpZgkwCiAgIHByaW50ZiAoIiVzXG4iLCBzdHIpOwogICBzbGVlcCAoMik7Ci0jZW5kaWYKIH0KKyNlbHNlCisjZGVmaW5lIHdoZXJlYW1pKHMpCisjZW5kaWYKIAotLyogZnVuY3Rpb246IGVlcHJvMTAwX3Jlc2V0Ci0gKiByZXNldHMgdGhlIGNhcmQuIFRoaXMgaXMgdXNlZCB0byBhbGxvdyBFdGhlcmJvb3QgdG8gcHJvYmUgdGhlIGNhcmQgYWdhaW4KLSAqIGZyb20gYSAidmlyZ2luYWwiIHN0YXRlLi4uLgotICogQXJndW1lbnRzOiBub25lCi0gKgotICogcmV0dXJuczogICB2b2lkLgotICovCi0KLXN0YXRpYyB2b2lkIGVlcHJvMTAwX3Jlc2V0KHN0cnVjdCBuaWMgKm5pYykKK3N0YXRpYyB2b2lkIGVlcHJvMTAwX2lycShzdHJ1Y3QgbmljICpuaWMgX191bnVzZWQsIGlycV9hY3Rpb25fdCBhY3Rpb24gX191bnVzZWQpCiB7Ci0gIG91dGwoMCwgaW9hZGRyICsgU0NCUG9ydCk7CisgIHN3aXRjaCAoIGFjdGlvbiApIHsKKyAgY2FzZSBESVNBQkxFIDoKKyAgICBicmVhazsKKyAgY2FzZSBFTkFCTEUgOgorICAgIGJyZWFrOworICBjYXNlIEZPUkNFIDoKKyAgICBicmVhazsKKyAgfQogfQogCiAvKiBmdW5jdGlvbjogZWVwcm8xMDBfdHJhbnNtaXQKQEAgLTM3Myw2MSArMzg2LDg3IEBACiAKIHN0YXRpYyB2b2lkIGVlcHJvMTAwX3RyYW5zbWl0KHN0cnVjdCBuaWMgKm5pYywgY29uc3QgY2hhciAqZCwgdW5zaWduZWQgaW50IHQsIHVuc2lnbmVkIGludCBzLCBjb25zdCBjaGFyICpwKQogewotICBzdHJ1Y3QgZXRoX2hkciB7Ci0gICAgdW5zaWduZWQgY2hhciBkc3RfYWRkcltFVEhfQUxFTl07Ci0gICAgdW5zaWduZWQgY2hhciBzcmNfYWRkcltFVEhfQUxFTl07Ci0gICAgdW5zaWduZWQgc2hvcnQgdHlwZTsKLSAgfSBoZHI7Ci0gIHVuc2lnbmVkIHNob3J0IHN0YXR1czsKLSAgaW50IHRvOwotICBpbnQgczEsIHMyOwotCi0gIHN0YXR1cyA9IGludyhpb2FkZHIgKyBTQ0JTdGF0dXMpOwotICAvKiBBY2tub3dsZWRnZSBhbGwgb2YgdGhlIGN1cnJlbnQgaW50ZXJydXB0IHNvdXJjZXMgQVNBUC4gKi8KLSAgb3V0dyhzdGF0dXMgJiAweGZjMDAsIGlvYWRkciArIFNDQlN0YXR1cyk7CisJc3RydWN0IGV0aF9oZHIgeworCQl1bnNpZ25lZCBjaGFyIGRzdF9hZGRyW0VUSF9BTEVOXTsKKwkJdW5zaWduZWQgY2hhciBzcmNfYWRkcltFVEhfQUxFTl07CisJCXVuc2lnbmVkIHNob3J0IHR5cGU7CisJfSBoZHI7CisJdW5zaWduZWQgc2hvcnQgc3RhdHVzOworCWludCBzMSwgczI7CisKKwlzdGF0dXMgPSBpbncoaW9hZGRyICsgU0NCU3RhdHVzKTsKKwkvKiBBY2tub3dsZWRnZSBhbGwgb2YgdGhlIGN1cnJlbnQgaW50ZXJydXB0IHNvdXJjZXMgQVNBUC4gKi8KKwlvdXR3KHN0YXR1cyAmIDB4ZmMwMCwgaW9hZGRyICsgU0NCU3RhdHVzKTsKIAogI2lmZGVmCURFQlVHCi0gIHByaW50ZiAoInRyYW5zbWl0dGluZyB0eXBlICVoWCBwYWNrZXQgKCVkIGJ5dGVzKS4gc3RhdHVzID0gJWhYLCBjbWQ9JWhYXG4iLAotCSAgdCwgcywgc3RhdHVzLCBpbncgKGlvYWRkciArIFNDQkNtZCkpOworCXByaW50ZiAoInRyYW5zbWl0dGluZyB0eXBlICVoWCBwYWNrZXQgKCVkIGJ5dGVzKS4gc3RhdHVzID0gJWhYLCBjbWQ9JWhYXG4iLAorCQl0LCBzLCBzdGF0dXMsIGludyAoaW9hZGRyICsgU0NCQ21kKSk7CiAjZW5kaWYKIAotICBtZW1jcHkgKCZoZHIuZHN0X2FkZHIsIGQsIEVUSF9BTEVOKTsKLSAgbWVtY3B5ICgmaGRyLnNyY19hZGRyLCBuaWMtPm5vZGVfYWRkciwgRVRIX0FMRU4pOworCW1lbWNweSAoJmhkci5kc3RfYWRkciwgZCwgRVRIX0FMRU4pOworCW1lbWNweSAoJmhkci5zcmNfYWRkciwgbmljLT5ub2RlX2FkZHIsIEVUSF9BTEVOKTsKIAotICBoZHIudHlwZSA9IGh0b25zICh0KTsKKwloZHIudHlwZSA9IGh0b25zICh0KTsKIAotICB0eGZkLnN0YXR1cyA9IDA7Ci0gIHR4ZmQuY29tbWFuZCA9IENtZFN1c3BlbmQgfCBDbWRUeCB8IENtZFR4RmxleDsKLSAgdHhmZC5saW5rICAgPSB2aXJ0X3RvX2J1cyAoJnR4ZmQpOwotICB0eGZkLmNvdW50ICAgPSAweDAyMjA4MDAwOwotICB0eGZkLnR4X2Rlc2NfYWRkciA9ICh1MzIpJnR4ZmQudHhfYnVmX2FkZHIwOworCXR4ZmQuc3RhdHVzID0gMDsKKwl0eGZkLmNvbW1hbmQgPSBDbWRTdXNwZW5kIHwgQ21kVHggfCBDbWRUeEZsZXg7CisJdHhmZC5saW5rICAgPSB2aXJ0X3RvX2J1cyAoJnR4ZmQpOworCXR4ZmQuY291bnQgICA9IDB4MDIyMDgwMDA7CisJdHhmZC50eF9kZXNjX2FkZHIgPSB2aXJ0X3RvX2J1cygmdHhmZC50eF9idWZfYWRkcjApOwogCi0gIHR4ZmQudHhfYnVmX2FkZHIwID0gdmlydF90b19idXMgKCZoZHIpOwotICB0eGZkLnR4X2J1Zl9zaXplMCA9IHNpemVvZiAoaGRyKTsKKwl0eGZkLnR4X2J1Zl9hZGRyMCA9IHZpcnRfdG9fYnVzICgmaGRyKTsKKwl0eGZkLnR4X2J1Zl9zaXplMCA9IHNpemVvZiAoaGRyKTsKIAotICB0eGZkLnR4X2J1Zl9hZGRyMSA9IHZpcnRfdG9fYnVzIChwKTsKLSAgdHhmZC50eF9idWZfc2l6ZTEgPSBzOworCXR4ZmQudHhfYnVmX2FkZHIxID0gdmlydF90b19idXMgKHApOworCXR4ZmQudHhfYnVmX3NpemUxID0gczsKIAogI2lmZGVmCURFQlVHCi0gIHByaW50ZiAoInR4ZmQ6IFxuIik7Ci0gIGhkICgmdHhmZCwgc2l6ZW9mICh0eGZkKSk7CisJcHJpbnRmICgidHhmZDogXG4iKTsKKwloZCAoJnR4ZmQsIHNpemVvZiAodHhmZCkpOwogI2VuZGlmCiAKLSAgb3V0bCh2aXJ0X3RvX2J1cygmdHhmZCksIGlvYWRkciArIFNDQlBvaW50ZXIpOwotICBvdXR3KElOVF9NQVNLIHwgQ1VfU1RBUlQsIGlvYWRkciArIFNDQkNtZCk7Ci0gIHdhaXRfZm9yX2NtZF9kb25lKGlvYWRkciArIFNDQkNtZCk7Ci0KLSAgczEgPSBpbncgKGlvYWRkciArIFNDQlN0YXR1cyk7Ci0gIGxvYWRfdGltZXIyKDEwKlRJQ0tTX1BFUl9NUyk7CQkvKiB0aW1lb3V0IDEwIG1zIGZvciB0cmFuc21pdCAqLwotICB3aGlsZSAoIXR4ZmQuc3RhdHVzICYmIHRpbWVyMl9ydW5uaW5nKCkpCi0gICAgLyogV2FpdCAqLzsKLSAgczIgPSBpbncgKGlvYWRkciArIFNDQlN0YXR1cyk7CisJb3V0bCh2aXJ0X3RvX2J1cygmdHhmZCksIGlvYWRkciArIFNDQlBvaW50ZXIpOworCW91dHcoSU5UX01BU0sgfCBDVV9TVEFSVCwgaW9hZGRyICsgU0NCQ21kKTsKKwl3YWl0X2Zvcl9jbWRfZG9uZShpb2FkZHIgKyBTQ0JDbWQpOworCisJczEgPSBpbncgKGlvYWRkciArIFNDQlN0YXR1cyk7CisJbG9hZF90aW1lcjIoMTAqVElDS1NfUEVSX01TKTsJCS8qIHRpbWVvdXQgMTAgbXMgZm9yIHRyYW5zbWl0ICovCisJd2hpbGUgKCF0eGZkLnN0YXR1cyAmJiB0aW1lcjJfcnVubmluZygpKQorCQkvKiBXYWl0ICovOworCXMyID0gaW53IChpb2FkZHIgKyBTQ0JTdGF0dXMpOwogCiAjaWZkZWYJREVCVUcKLSAgcHJpbnRmICgiczEgPSAlaFgsIHMyID0gJWhYLlxuIiwgczEsIHMyKTsKKwlwcmludGYgKCJzMSA9ICVoWCwgczIgPSAlaFguXG4iLCBzMSwgczIpOwogI2VuZGlmCiB9CiAKKy8qCisgKiBTb21ldGltZXMgdGhlIHJlY2VpdmVyIHN0b3BzIG1ha2luZyBwcm9ncmVzcy4gIFRoaXMgcm91dGluZSBrbm93cyBob3cgdG8KKyAqIGdldCBpdCBnb2luZyBhZ2Fpbiwgd2l0aG91dCBsb3NpbmcgcGFja2V0cyBvciBiZWluZyBvdGhlcndpc2UgbmFzdHkgbGlrZQorICogYSBjaGlwIHJlc2V0IHdvdWxkIGJlLiAgUHJldmlvdXNseSB0aGUgZHJpdmVyIGhhZCBhIHdob2xlIHNlcXVlbmNlCisgKiBvZiBpZiBSeFN1c3BlbmRlZCwgaWYgaXQncyBubyBidWZmZXJzIGRvIG9uZSB0aGluZywgaWYgaXQncyBubyByZXNvdXJjZXMsCisgKiBkbyBhbm90aGVyLCBldGMuICBCdXQgdGhvc2UgdGhpbmdzIGRvbid0IHJlYWxseSBtYXR0ZXIuICBTZXBhcmF0ZSBsb2dpYworICogaW4gdGhlIElTUiBwcm92aWRlcyBmb3IgYWxsb2NhdGluZyBidWZmZXJzLS10aGUgb3RoZXIgaGFsZiBvZiBvcGVyYXRpb24KKyAqIGlzIGp1c3QgbWFraW5nIHN1cmUgdGhlIHJlY2VpdmVyIGlzIGFjdGl2ZS4gIHNwZWVkb19yeF9zb2Z0X3Jlc2V0IGRvZXMgdGhhdC4KKyAqIFRoaXMgcHJvYmxlbSB3aXRoIHRoZSBvbGQsIG1vcmUgaW52b2x2ZWQgYWxnb3JpdGhtIGlzIHNob3duIHVwIHVuZGVyCisgKiBwaW5nIGZsb29kcyBvbiB0aGUgb3JkZXIgb2YgNjBLIHBhY2tldHMvc2Vjb25kIG9uIGEgMTAwTWJwcyBmZHggbmV0d29yay4KKyAqLworc3RhdGljIHZvaWQKK3NwZWVkb19yeF9zb2Z0X3Jlc2V0KHZvaWQpCit7CisgIHdhaXRfZm9yX2NtZF9kb25lKGlvYWRkciArIFNDQkNtZCk7CisJLyoKKwkqIFB1dCB0aGUgaGFyZHdhcmUgaW50byBhIGtub3duIHN0YXRlLgorCSovCisJb3V0YihSWF9BQk9SVCwgaW9hZGRyICsgU0NCQ21kKTsKKworCUFDQ0VTUyhyeGZkKXJ4X2J1Zl9hZGRyID0gMHhmZmZmZmZmZjsKKworICB3YWl0X2Zvcl9jbWRfZG9uZShpb2FkZHIgKyBTQ0JDbWQpOworCisJb3V0YihSWF9TVEFSVCwgaW9hZGRyICsgU0NCQ21kKTsKK30KKwogLyogZnVuY3Rpb246IGVlcHJvMTAwX3BvbGwgLyBldGhfcG9sbAogICogVGhpcyByZWNpZXZlcyBhIHBhY2tldCBmcm9tIHRoZSBuZXR3b3JrLgogICoKQEAgLTQ0MCwzNCArNDc5LDg3IEBACiAgKiAgICAgICAgICAgIHJldHVybnMgdGhlIGxlbmd0aCBvZiB0aGUgcGFja2V0IGluIG5pYy0+cGFja2V0bGVuLgogICovCiAKLXN0YXRpYyBpbnQgZWVwcm8xMDBfcG9sbChzdHJ1Y3QgbmljICpuaWMpCitzdGF0aWMgaW50IGVlcHJvMTAwX3BvbGwoc3RydWN0IG5pYyAqbmljLCBpbnQgcmV0cmlldmUpCiB7Ci0gIGlmICghQUNDRVNTKHJ4ZmQpc3RhdHVzKQotICAgIHJldHVybiAwOworICB1bnNpZ25lZCBpbnQgc3RhdHVzOworICBzdGF0dXMgPSBpbncoaW9hZGRyICsgU0NCU3RhdHVzKTsKIAotICAvKiBPay4gV2UgZ290IGEgcGFja2V0LiBOb3cgcmVzdGFydCB0aGUgcmVjaWV2ZXIuLi4uICovCi0gIEFDQ0VTUyhyeGZkKXN0YXR1cyA9IDA7Ci0gIEFDQ0VTUyhyeGZkKWNvbW1hbmQgPSAweGMwMDA7Ci0gIG91dGwodmlydF90b19idXMoJihBQ0NFU1MocnhmZClzdGF0dXMpKSwgaW9hZGRyICsgU0NCUG9pbnRlcik7Ci0gIG91dHcoSU5UX01BU0sgfCBSWF9TVEFSVCwgaW9hZGRyICsgU0NCQ21kKTsKLSAgd2FpdF9mb3JfY21kX2RvbmUoaW9hZGRyICsgU0NCQ21kKTsKKwlpZiAoIUFDQ0VTUyhyeGZkKXN0YXR1cykKKwkJcmV0dXJuIDA7CisKKwkvKiBUaGVyZSBpcyBhIHBhY2tldCByZWFkeSAqLworCWlmICggISByZXRyaWV2ZSApIHJldHVybiAxOworCisgIC8qCisgICAqIFRoZSBjaGlwIG1heSBoYXZlIHN1c3BlbmRlZCByZWNlcHRpb24gZm9yIHZhcmlvdXMgcmVhc29ucy4KKyAgICogQ2hlY2sgZm9yIHRoYXQsIGFuZCByZS1wcmltZSBpdCBzaG91bGQgdGhpcyBiZSB0aGUgY2FzZS4KKyAgICovCisgIHN3aXRjaCAoKHN0YXR1cyA+PiAyKSAmIDB4ZikgeworICBjYXNlIDA6IC8qIElkbGUgKi8KKyAgICBicmVhazsKKyAgY2FzZSAxOgkvKiBTdXNwZW5kZWQgKi8KKyAgY2FzZSAyOgkvKiBObyByZXNvdXJjZXMgKFJ4RkRzKSAqLworICBjYXNlIDk6CS8qIFN1c3BlbmRlZCB3aXRoIG5vIG1vcmUgUkJEcyAqLworICBjYXNlIDEwOiAvKiBObyByZXNvdXJjZXMgZHVlIHRvIG5vIFJCRHMgKi8KKyAgY2FzZSAxMjogLyogUmVhZHkgd2l0aCBubyBSQkRzICovCisgICAgc3BlZWRvX3J4X3NvZnRfcmVzZXQoKTsKKyAgICBicmVhazsKKyAgY2FzZSAzOiAgY2FzZSA1OiAgY2FzZSA2OiAgY2FzZSA3OiAgY2FzZSA4OgorICBjYXNlIDExOiAgY2FzZSAxMzogIGNhc2UgMTQ6ICBjYXNlIDE1OgorICAgIC8qIHRoZXNlIGFyZSBhbGwgcmVzZXJ2ZWQgdmFsdWVzICovCisgICAgYnJlYWs7CisgIH0KKworCS8qIE9rLiBXZSBnb3QgYSBwYWNrZXQuIE5vdyByZXN0YXJ0IHRoZSByZWNpZXZlci4uLi4gKi8KKwlBQ0NFU1MocnhmZClzdGF0dXMgPSAwOworCUFDQ0VTUyhyeGZkKWNvbW1hbmQgPSAweGMwMDA7CisJb3V0bCh2aXJ0X3RvX2J1cygmKEFDQ0VTUyhyeGZkKXN0YXR1cykpLCBpb2FkZHIgKyBTQ0JQb2ludGVyKTsKKwlvdXR3KElOVF9NQVNLIHwgUlhfU1RBUlQsIGlvYWRkciArIFNDQkNtZCk7CisJd2FpdF9mb3JfY21kX2RvbmUoaW9hZGRyICsgU0NCQ21kKTsKIAogI2lmZGVmCURFQlVHCi0gIHByaW50ZiAoIkdvdCBhIHBhY2tldDogTGVuID0gJWQuXG4iLCBBQ0NFU1MocnhmZCljb3VudCAmIDB4M2ZmZik7CisJcHJpbnRmICgiR290IGEgcGFja2V0OiBMZW4gPSAlZC5cbiIsIEFDQ0VTUyhyeGZkKWNvdW50ICYgMHgzZmZmKTsKICNlbmRpZgotICBuaWMtPnBhY2tldGxlbiA9ICBBQ0NFU1MocnhmZCljb3VudCAmIDB4M2ZmZjsKLSAgbWVtY3B5IChuaWMtPnBhY2tldCwgQUNDRVNTKHJ4ZmQpcGFja2V0LCBuaWMtPnBhY2tldGxlbik7CisJbmljLT5wYWNrZXRsZW4gPSAgQUNDRVNTKHJ4ZmQpY291bnQgJiAweDNmZmY7CisJbWVtY3B5IChuaWMtPnBhY2tldCwgQUNDRVNTKHJ4ZmQpcGFja2V0LCBuaWMtPnBhY2tldGxlbik7CiAjaWZkZWYJREVCVUcKLSAgaGQgKG5pYy0+cGFja2V0LCAweDMwKTsKKwloZCAobmljLT5wYWNrZXQsIDB4MzApOwogI2VuZGlmCi0gIHJldHVybiAxOworCXJldHVybiAxOwogfQogCi1zdGF0aWMgdm9pZCBlZXBybzEwMF9kaXNhYmxlKHN0cnVjdCBuaWMgKm5pYykKKy8qIGZ1bmN0aW9uOiBlZXBybzEwMF9kaXNhYmxlCisgKiByZXNldHMgdGhlIGNhcmQuIFRoaXMgaXMgdXNlZCB0byBhbGxvdyBFdGhlcmJvb3Qgb3IgTGludXgKKyAqIHRvIHByb2JlIHRoZSBjYXJkIGFnYWluIGZyb20gYSAidmlyZ2luYWwiIHN0YXRlLi4uLgorICogQXJndW1lbnRzOiBub25lCisgKgorICogcmV0dXJuczogICB2b2lkLgorICovCitzdGF0aWMgdm9pZCBlZXBybzEwMF9kaXNhYmxlKHN0cnVjdCBkZXYgKmRldiBfX3VudXNlZCkKIHsKLSAgICAvKiBTZWUgaWYgdGhpcyBQYXJ0aWFsUmVzZXQgc29sdmVzIHRoZSBwcm9ibGVtIHdpdGggaW50ZXJmZXJpbmcgd2l0aAotICAgICAgIGtlcm5lbCBvcGVyYXRpb24gYWZ0ZXIgRXRoZXJib290IGhhbmRzIG92ZXIuIC0gS2VuIDIwMDAxMTAyICovCi0gICAgb3V0bCgyLCBpb2FkZHIgKyBTQ0JQb3J0KTsKKy8qIGZyb20gZWVwcm8xMDBfcmVzZXQgKi8KKwlvdXRsKDAsIGlvYWRkciArIFNDQlBvcnQpOworLyogZnJvbSBlZXBybzEwMF9kaXNhYmxlICovCisJLyogU2VlIGlmIHRoaXMgUGFydGlhbFJlc2V0IHNvbHZlcyB0aGUgcHJvYmxlbSB3aXRoIGludGVyZmVyaW5nIHdpdGgKKwkgICBrZXJuZWwgb3BlcmF0aW9uIGFmdGVyIEV0aGVyYm9vdCBoYW5kcyBvdmVyLiAtIEtlbiAyMDAwMTEwMiAqLworCW91dGwoMiwgaW9hZGRyICsgU0NCUG9ydCk7CisKKwkvKiBUaGUgZm9sbG93aW5nIGlzIGZyb20gdGhlIEludGVsIGUxMDAgZHJpdmVyLgorCSAqIFRoaXMgaG9wZWZ1bGx5IHNvbHZlcyB0aGUgcHJvYmxlbSB3aXRoIGhhbmdpbmcgaGFyZCBET1MgaW1hZ2VzLiAqLworCisJLyogd2FpdCBmb3IgdGhlIHJlc2V0IHRvIHRha2UgZWZmZWN0ICovCisJdWRlbGF5KDIwKTsKKworCS8qIE1hc2sgb2ZmIG91ciBpbnRlcnJ1cHQgbGluZSAtLSBpdCBpcyB1bm1hc2tlZCBhZnRlciByZXNldCAqLworCXsKKwkJdTE2IGludHJfc3RhdHVzOworCQkvKiBEaXNhYmxlIGludGVycnVwdHMgb24gb3VyIFBDSSBib2FyZCBieSBzZXR0aW5nIHRoZSBtYXNrIGJpdCAqLworCQlvdXR3KElOVF9NQVNLLCBpb2FkZHIgKyBTQ0JDbWQpOworCQlpbnRyX3N0YXR1cyA9IGludyhpb2FkZHIgKyBTQ0JTdGF0dXMpOworCQkvKiBhY2sgYW5kIGNsZWFyIGludHJzICovCisJCW91dHcoaW50cl9zdGF0dXMsIGlvYWRkciArIFNDQlN0YXR1cyk7CisJCWludyhpb2FkZHIgKyBTQ0JTdGF0dXMpOworCX0KIH0KIAogLyogZXhwb3J0ZWQgZnVuY3Rpb246IGVlcHJvMTAwX3Byb2JlIC8gZXRoX3Byb2JlCkBAIC00NzgsMjUgKzU3MCwzMCBAQAogICogICAgICAgICAgICBsZWF2ZXMgdGhlIDgyNTU3IGluaXRpYWxpemVkLCBhbmQgcmVhZHkgdG8gcmVjaWV2ZSBwYWNrZXRzLgogICovCiAKLXN0cnVjdCBuaWMgKmVlcHJvMTAwX3Byb2JlKHN0cnVjdCBuaWMgKm5pYywgdW5zaWduZWQgc2hvcnQgKnByb2JlYWRkcnMsIHN0cnVjdCBwY2lfZGV2aWNlICpwKQorc3RhdGljIGludCBlZXBybzEwMF9wcm9iZShzdHJ1Y3QgZGV2ICpkZXYsIHN0cnVjdCBwY2lfZGV2aWNlICpwKQogeworCXN0cnVjdCBuaWMgKm5pYyA9IChzdHJ1Y3QgbmljICopZGV2OwogCXVuc2lnbmVkIHNob3J0IHN1bSA9IDA7CiAJaW50IGk7CiAJaW50IHJlYWRfY21kLCBlZV9zaXplOwotCXVuc2lnbmVkIHNob3J0IHZhbHVlOwogCWludCBvcHRpb25zOwotCWludCBwcm9taXNjOworCWludCByeF9tb2RlOwogCiAJLyogd2UgY2FjaGUgb25seSB0aGUgZmlyc3QgZmV3IHdvcmRzIG9mIHRoZSBFRVBST00gZGF0YQogCSAgIGJlIGNhcmVmdWwgbm90IHRvIGFjY2VzcyBiZXlvbmQgdGhpcyBhcnJheSAqLwogCXVuc2lnbmVkIHNob3J0IGVlcHJvbVsxNl07CiAKLQlpZiAocHJvYmVhZGRycyA9PSAwIHx8IHByb2JlYWRkcnNbMF0gPT0gMCkKKwlpZiAocC0+aW9hZGRyID09IDApCiAJCXJldHVybiAwOwotCWlvYWRkciA9IHByb2JlYWRkcnNbMF0gJiB+MzsgLyogTWFzayB0aGUgYml0IHRoYXQgc2F5cyAidGhpcyBpcyBhbiBpbyBhZGRyIiAqLworCWlvYWRkciA9IHAtPmlvYWRkciAmIH4zOyAvKiBNYXNrIHRoZSBiaXQgdGhhdCBzYXlzICJ0aGlzIGlzIGFuIGlvIGFkZHIiICovCisJbmljLT5pb2FkZHIgPSBpb2FkZHI7CiAKIAlhZGp1c3RfcGNpX2RldmljZShwKTsKIAorCS8qIENvcHkgSVJRIGZyb20gUENJIGluZm9ybWF0aW9uICovCisJLyogbmljLT5pcnFubyA9IHBjaS0+aXJxOyAqLworCW5pYy0+aXJxbm8gPSAwOworCiAJaWYgKChkb19lZXByb21fY21kKEVFX1JFQURfQ01EIDw8IDI0LCAyNykgJiAweGZmZTAwMDApCiAJCT09IDB4ZmZlMDAwMCkgewogCQllZV9zaXplID0gMHgxMDA7CkBAIC01MTMsMTIzICs2MTAsMTM4IEBACiAJCXN1bSArPSB2YWx1ZTsKIAl9CiAKLSAgZm9yIChpPTA7aTxFVEhfQUxFTjtpKyspIHsKLQluaWMtPm5vZGVfYWRkcltpXSA9ICAoZWVwcm9tW2kvMl0gPj4gKDgqKGkmMSkpKSAmIDB4ZmY7Ci0gIH0KLSAgcHJpbnRmICgiRXRoZXJuZXQgYWRkcjogJSFcbiIsIG5pYy0+bm9kZV9hZGRyKTsKLQotICBpZiAoc3VtICE9IDB4QkFCQSkKLQlwcmludGYoImVlcHJvMTAwOiBJbnZhbGlkIEVFUFJPTSBjaGVja3N1bSAlI2hYLCAiCi0JICAgICAgICJjaGVjayBzZXR0aW5ncyBiZWZvcmUgYWN0aXZhdGluZyB0aGlzIGRldmljZSFcbiIsIHN1bSk7Ci0gIG91dGwoMCwgaW9hZGRyICsgU0NCUG9ydCk7Ci0gIHVkZWxheSAoMTAwMDApOwotCi0gIHdoZXJlYW1pICgiR290IGVlcHJvbS4iKTsKLQotICBvdXRsKHZpcnRfdG9fYnVzKCZsc3RhdHMpLCBpb2FkZHIgKyBTQ0JQb2ludGVyKTsKLSAgb3V0dyhJTlRfTUFTSyB8IENVX1NUQVRTQUREUiwgaW9hZGRyICsgU0NCQ21kKTsKLSAgd2FpdF9mb3JfY21kX2RvbmUoaW9hZGRyICsgU0NCQ21kKTsKLQotICB3aGVyZWFtaSAoInNldCBzdGF0cyBhZGRyLiIpOwotICAvKiBJTklUIFJYIHN0dWZmLiAqLwotCi0gIC8qIEJhc2UgPSAwICovCi0gIG91dGwoMCwgaW9hZGRyICsgU0NCUG9pbnRlcik7Ci0gIG91dHcoSU5UX01BU0sgfCBSWF9BRERSX0xPQUQsIGlvYWRkciArIFNDQkNtZCk7Ci0gIHdhaXRfZm9yX2NtZF9kb25lKGlvYWRkciArIFNDQkNtZCk7Ci0KLSAgd2hlcmVhbWkgKCJzZXQgcnggYmFzZSBhZGRyLiIpOwotCi0gIEFDQ0VTUyhyeGZkKXN0YXR1cyAgPSAweDAwMDE7Ci0gIEFDQ0VTUyhyeGZkKWNvbW1hbmQgPSAweDAwMDA7Ci0gIEFDQ0VTUyhyeGZkKWxpbmsgICAgPSB2aXJ0X3RvX2J1cygmKEFDQ0VTUyhyeGZkKXN0YXR1cykpOwotICBBQ0NFU1MocnhmZClyeF9idWZfYWRkciA9IChpbnQpICZuaWMtPnBhY2tldDsKLSAgQUNDRVNTKHJ4ZmQpY291bnQgICA9IDA7Ci0gIEFDQ0VTUyhyeGZkKXNpemUgICAgPSAxNTI4OwotCi0gIG91dGwodmlydF90b19idXMoJihBQ0NFU1MocnhmZClzdGF0dXMpKSwgaW9hZGRyICsgU0NCUG9pbnRlcik7Ci0gIG91dHcoSU5UX01BU0sgfCBSWF9TVEFSVCwgaW9hZGRyICsgU0NCQ21kKTsKLSAgd2FpdF9mb3JfY21kX2RvbmUoaW9hZGRyICsgU0NCQ21kKTsKLQotICB3aGVyZWFtaSAoInN0YXJ0ZWQgUlggcHJvY2Vzcy4iKTsKLQotICAvKiBTdGFydCB0aGUgcmVjaWV2ZXIuLi4uICovCi0gIEFDQ0VTUyhyeGZkKXN0YXR1cyA9IDA7Ci0gIEFDQ0VTUyhyeGZkKWNvbW1hbmQgPSAweGMwMDA7Ci0gIG91dGwodmlydF90b19idXMoJihBQ0NFU1MocnhmZClzdGF0dXMpKSwgaW9hZGRyICsgU0NCUG9pbnRlcik7Ci0gIG91dHcoSU5UX01BU0sgfCBSWF9TVEFSVCwgaW9hZGRyICsgU0NCQ21kKTsKLQotICAvKiBJTklUIFRYIHN0dWZmLiAqLwotCi0gIC8qIEJhc2UgPSAwICovCi0gIG91dGwoMCwgaW9hZGRyICsgU0NCUG9pbnRlcik7Ci0gIG91dHcoSU5UX01BU0sgfCBDVV9DTURfQkFTRSwgaW9hZGRyICsgU0NCQ21kKTsKLSAgd2FpdF9mb3JfY21kX2RvbmUoaW9hZGRyICsgU0NCQ21kKTsKLQotICB3aGVyZWFtaSAoInNldCBUWCBiYXNlIGFkZHIuIik7Ci0KLSAgdHhmZC5jb21tYW5kICAgICAgPSAoQ21kSUFTZXR1cCk7Ci0gIHR4ZmQuc3RhdHVzICAgICAgID0gMHgwMDAwOwotICB0eGZkLmxpbmsgICAgICAgICA9IHZpcnRfdG9fYnVzICgmY29uZmNtZCk7Ci0KLSAgewotCWNoYXIgKnQgPSAoY2hhciAqKSZ0eGZkLnR4X2Rlc2NfYWRkcjsKKwlmb3IgKGk9MDtpPEVUSF9BTEVOO2krKykgeworCQluaWMtPm5vZGVfYWRkcltpXSA9ICAoZWVwcm9tW2kvMl0gPj4gKDgqKGkmMSkpKSAmIDB4ZmY7CisJfQorCXByaW50ZiAoIkV0aGVybmV0IGFkZHI6ICUhXG4iLCBuaWMtPm5vZGVfYWRkcik7CiAKLQlmb3IgKGk9MDtpPEVUSF9BTEVOO2krKykKLQkJdFtpXSA9IG5pYy0+bm9kZV9hZGRyW2ldOwotICB9CisJaWYgKHN1bSAhPSAweEJBQkEpCisJCXByaW50ZigiZWVwcm8xMDA6IEludmFsaWQgRUVQUk9NIGNoZWNrc3VtICUjaFgsICIKKwkJICAgICAgICJjaGVjayBzZXR0aW5ncyBiZWZvcmUgYWN0aXZhdGluZyB0aGlzIGRldmljZSFcbiIsIHN1bSk7CisJb3V0bCgwLCBpb2FkZHIgKyBTQ0JQb3J0KTsKKwl1ZGVsYXkgKDEwMDAwKTsKKwl3aGVyZWFtaSAoIkdvdCBlZXByb20uIik7CisKKwkvKiBCYXNlID0gMCAqLworCW91dGwoMCwgaW9hZGRyICsgU0NCUG9pbnRlcik7CisJb3V0dyhJTlRfTUFTSyB8IFJYX0FERFJfTE9BRCwgaW9hZGRyICsgU0NCQ21kKTsKKwl3YWl0X2Zvcl9jbWRfZG9uZShpb2FkZHIgKyBTQ0JDbWQpOworCXdoZXJlYW1pICgic2V0IHJ4IGJhc2UgYWRkci4iKTsKKworCW91dGwodmlydF90b19idXMoJmxzdGF0cyksIGlvYWRkciArIFNDQlBvaW50ZXIpOworCW91dHcoSU5UX01BU0sgfCBDVV9TVEFUU0FERFIsIGlvYWRkciArIFNDQkNtZCk7CisJd2FpdF9mb3JfY21kX2RvbmUoaW9hZGRyICsgU0NCQ21kKTsKKwl3aGVyZWFtaSAoInNldCBzdGF0cyBhZGRyLiIpOworCisJLyogSU5JVCBSWCBzdHVmZi4gKi8KKwlBQ0NFU1MocnhmZClzdGF0dXMgID0gMHgwMDAxOworCUFDQ0VTUyhyeGZkKWNvbW1hbmQgPSAweDAwMDA7CisJQUNDRVNTKHJ4ZmQpbGluayAgICA9IHZpcnRfdG9fYnVzKCYoQUNDRVNTKHJ4ZmQpc3RhdHVzKSk7CisJQUNDRVNTKHJ4ZmQpcnhfYnVmX2FkZHIgPSB2aXJ0X3RvX2J1cygmbmljLT5wYWNrZXQpOworCUFDQ0VTUyhyeGZkKWNvdW50ICAgPSAwOworCUFDQ0VTUyhyeGZkKXNpemUgICAgPSAxNTI4OworCisJb3V0bCh2aXJ0X3RvX2J1cygmKEFDQ0VTUyhyeGZkKXN0YXR1cykpLCBpb2FkZHIgKyBTQ0JQb2ludGVyKTsKKwlvdXR3KElOVF9NQVNLIHwgUlhfU1RBUlQsIGlvYWRkciArIFNDQkNtZCk7CisJd2FpdF9mb3JfY21kX2RvbmUoaW9hZGRyICsgU0NCQ21kKTsKKworCXdoZXJlYW1pICgic3RhcnRlZCBSWCBwcm9jZXNzLiIpOworCisJLyogU3RhcnQgdGhlIHJlY2lldmVyLi4uLiAqLworCUFDQ0VTUyhyeGZkKXN0YXR1cyA9IDA7CisJQUNDRVNTKHJ4ZmQpY29tbWFuZCA9IDB4YzAwMDsKKwlvdXRsKHZpcnRfdG9fYnVzKCYoQUNDRVNTKHJ4ZmQpc3RhdHVzKSksIGlvYWRkciArIFNDQlBvaW50ZXIpOworCW91dHcoSU5UX01BU0sgfCBSWF9TVEFSVCwgaW9hZGRyICsgU0NCQ21kKTsKKworCS8qIElOSVQgVFggc3R1ZmYuICovCisKKwkvKiBCYXNlID0gMCAqLworCW91dGwoMCwgaW9hZGRyICsgU0NCUG9pbnRlcik7CisJb3V0dyhJTlRfTUFTSyB8IENVX0NNRF9CQVNFLCBpb2FkZHIgKyBTQ0JDbWQpOworCXdhaXRfZm9yX2NtZF9kb25lKGlvYWRkciArIFNDQkNtZCk7CisKKwl3aGVyZWFtaSAoInNldCBUWCBiYXNlIGFkZHIuIik7CisKKwl0eGZkLmNvbW1hbmQgICAgICA9IChDbWRJQVNldHVwKTsKKwl0eGZkLnN0YXR1cyAgICAgICA9IDB4MDAwMDsKKwl0eGZkLmxpbmsgICAgICAgICA9IHZpcnRfdG9fYnVzICgmY29uZmNtZCk7CisKKwl7CisJCWNoYXIgKnQgPSAoY2hhciAqKSZ0eGZkLnR4X2Rlc2NfYWRkcjsKKwkJCisJCWZvciAoaT0wO2k8RVRIX0FMRU47aSsrKQorCQkJdFtpXSA9IG5pYy0+bm9kZV9hZGRyW2ldOworCX0KIAogI2lmZGVmCURFQlVHCi0gIHByaW50ZiAoIlNldHVwX2VhZGRyOlxuIik7Ci0gIGhkICgmdHhmZCwgMHgyMCk7CisJcHJpbnRmICgiU2V0dXBfZWFkZHI6XG4iKTsKKwloZCAoJnR4ZmQsIDB4MjApOwogI2VuZGlmCi0gIC8qICAgICAgb3B0aW9ucyA9IDB4NDA7ICovIC8qIDEwbWJwcyBoYWxmIGR1cGxleC4uLiAqLwotICBvcHRpb25zID0gMHgwMDsgICAgICAgICAgICAvKiBBdXRvc2Vuc2UgKi8KLQotICBwcm9taXNjID0gMDsKLQotICBpZiAoICAgKChlZXByb21bNl0+PjgpICYgMHgzZikgPT0gRFA4Mzg0MAotCSAgfHwgKChlZXByb21bNl0+PjgpICYgMHgzZikgPT0gRFA4Mzg0MEEpIHsKLQlpbnQgbWRpX3JlZzIzID0gbWRpb19yZWFkKGVlcHJvbVs2XSAmIDB4MWYsIDIzKSB8IDB4MDQyMjsKLQlpZiAoY29uZ2VuYikKLQkgIG1kaV9yZWcyMyB8PSAweDAxMDA7Ci0JcHJpbnRmKCIgIERQODM4NDAgc3BlY2lmaWMgc2V0dXAsIHNldHRpbmcgcmVnaXN0ZXIgMjMgdG8gJWhYLlxuIiwKLQkgICAgICAgbWRpX3JlZzIzKTsKLQltZGlvX3dyaXRlKGVlcHJvbVs2XSAmIDB4MWYsIDIzLCBtZGlfcmVnMjMpOwotICB9Ci0gIHdoZXJlYW1pICgiRG9uZSBEUDgzNDAgc3BlY2lhbCBzZXR1cC4iKTsKLSAgaWYgKG9wdGlvbnMgIT0gMCkgewotCW1kaW9fd3JpdGUoZWVwcm9tWzZdICYgMHgxZiwgMCwKLQkJICAgKChvcHRpb25zICYgMHgyMCkgPyAweDIwMDAgOiAwKSB8ICAgIC8qIDEwMG1icHM/ICovCi0JCSAgICgob3B0aW9ucyAmIDB4MTApID8gMHgwMTAwIDogMCkpOyAvKiBGdWxsIGR1cGxleD8gKi8KLQl3aGVyZWFtaSAoInNldCBtZGlvX3JlZ2lzdGVyLiIpOwotICB9CisJLyogICAgICBvcHRpb25zID0gMHg0MDsgKi8gLyogMTBtYnBzIGhhbGYgZHVwbGV4Li4uICovCisJb3B0aW9ucyA9IDB4MDA7ICAgICAgICAgICAgLyogQXV0b3NlbnNlICovCiAKLSAgY29uZmNtZC5jb21tYW5kICA9IENtZFN1c3BlbmQgfCBDbWRDb25maWd1cmU7Ci0gIGNvbmZjbWQuc3RhdHVzICAgPSAweDAwMDA7Ci0gIGNvbmZjbWQubGluayAgICAgPSB2aXJ0X3RvX2J1cyAoJnR4ZmQpOwotICBjb25mY21kLmRhdGFbMV0gID0gKHR4ZmlmbyA8PCA0KSB8IHJ4ZmlmbzsKLSAgY29uZmNtZC5kYXRhWzRdICA9IHJ4ZG1hY291bnQ7Ci0gIGNvbmZjbWQuZGF0YVs1XSAgPSB0eGRtYWNvdW50ICsgMHg4MDsKLSAgY29uZmNtZC5kYXRhWzE1XSA9IHByb21pc2MgPyAweDQ5OiAweDQ4OwotICBjb25mY21kLmRhdGFbMTldID0gKG9wdGlvbnMgJiAweDEwKSA/IDB4QzAgOiAweDgwOwotICBjb25mY21kLmRhdGFbMjFdID0gcHJvbWlzYyA/IDB4MEQ6IDB4MDU7CisjaWZkZWYgUFJPTUlTQworCXJ4X21vZGUgPSAzOworI2VsaWYgQUxMTVVMVEkKKwlyeF9tb2RlID0gMTsKKyNlbHNlCisJcnhfbW9kZSA9IDA7CisjZW5kaWYKIAotICBvdXRsKHZpcnRfdG9fYnVzKCZ0eGZkKSwgaW9hZGRyICsgU0NCUG9pbnRlcik7Ci0gIG91dHcoSU5UX01BU0sgfCBDVV9TVEFSVCwgaW9hZGRyICsgU0NCQ21kKTsKLSAgd2FpdF9mb3JfY21kX2RvbmUoaW9hZGRyICsgU0NCQ21kKTsKKwlpZiAoICAgKChlZXByb21bNl0+PjgpICYgMHgzZikgPT0gRFA4Mzg0MAorCSAgICAgICB8fCAoKGVlcHJvbVs2XT4+OCkgJiAweDNmKSA9PSBEUDgzODQwQSkgeworCQlpbnQgbWRpX3JlZzIzID0gbWRpb19yZWFkKGVlcHJvbVs2XSAmIDB4MWYsIDIzKSB8IDB4MDQyMjsKKwkJaWYgKGNvbmdlbmIpCisJCQltZGlfcmVnMjMgfD0gMHgwMTAwOworCQlwcmludGYoIiAgRFA4Mzg0MCBzcGVjaWZpYyBzZXR1cCwgc2V0dGluZyByZWdpc3RlciAyMyB0byAlaFguXG4iLAorCQkgICAgICAgbWRpX3JlZzIzKTsKKwkJbWRpb193cml0ZShlZXByb21bNl0gJiAweDFmLCAyMywgbWRpX3JlZzIzKTsKKwl9CisJd2hlcmVhbWkgKCJEb25lIERQODM0MCBzcGVjaWFsIHNldHVwLiIpOworCWlmIChvcHRpb25zICE9IDApIHsKKwkJbWRpb193cml0ZShlZXByb21bNl0gJiAweDFmLCAwLAorCQkJICAgKChvcHRpb25zICYgMHgyMCkgPyAweDIwMDAgOiAwKSB8ICAgIC8qIDEwMG1icHM/ICovCisJCQkgICAoKG9wdGlvbnMgJiAweDEwKSA/IDB4MDEwMCA6IDApKTsgLyogRnVsbCBkdXBsZXg/ICovCisJCXdoZXJlYW1pICgic2V0IG1kaW9fcmVnaXN0ZXIuIik7CisJfQogCi0gIHdoZXJlYW1pICgic3RhcnRlZCBUWCB0aGluZ3kgKGNvbmZpZywgaWFzZXR1cCkuIik7CisJY29uZmNtZC5jb21tYW5kICA9IENtZFN1c3BlbmQgfCBDbWRDb25maWd1cmU7CisJY29uZmNtZC5zdGF0dXMgICA9IDB4MDAwMDsKKwljb25mY21kLmxpbmsgICAgID0gdmlydF90b19idXMgKCZ0eGZkKTsKKwljb25mY21kLmRhdGFbMV0gID0gKHR4ZmlmbyA8PCA0KSB8IHJ4ZmlmbzsKKwljb25mY21kLmRhdGFbNF0gID0gcnhkbWFjb3VudDsKKwljb25mY21kLmRhdGFbNV0gID0gdHhkbWFjb3VudCArIDB4ODA7CisJY29uZmNtZC5kYXRhWzE1XSA9IChyeF9tb2RlICYgMikgPyAweDQ5OiAweDQ4OworCWNvbmZjbWQuZGF0YVsxOV0gPSAob3B0aW9ucyAmIDB4MTApID8gMHhDMCA6IDB4ODA7CisJY29uZmNtZC5kYXRhWzIxXSA9IChyeF9tb2RlICYgMSkgPyAweDBEOiAweDA1OworCisJb3V0bCh2aXJ0X3RvX2J1cygmdHhmZCksIGlvYWRkciArIFNDQlBvaW50ZXIpOworCW91dHcoSU5UX01BU0sgfCBDVV9TVEFSVCwgaW9hZGRyICsgU0NCQ21kKTsKKwl3YWl0X2Zvcl9jbWRfZG9uZShpb2FkZHIgKyBTQ0JDbWQpOworCisJd2hlcmVhbWkgKCJzdGFydGVkIFRYIHRoaW5neSAoY29uZmlnLCBpYXNldHVwKS4iKTsKKworCWxvYWRfdGltZXIyKDEwKlRJQ0tTX1BFUl9NUyk7CisJd2hpbGUgKCF0eGZkLnN0YXR1cyAmJiB0aW1lcjJfcnVubmluZygpKQorCQkvKiBXYWl0ICovOworCisJLyogUmVhZCB0aGUgc3RhdHVzIHJlZ2lzdGVyIG9uY2UgdG8gZGlzZ2FyZCBzdGFsZSBkYXRhICovCisJbWRpb19yZWFkKGVlcHJvbVs2XSAmIDB4MWYsIDEpOworCS8qIENoZWNrIHRvIHNlZSBpZiB0aGUgbmV0d29yayBjYWJsZSBpcyBwbHVnZ2VkIGluLgorCSAqIFRoaXMgYWxsb3dzIGZvciBmYXN0ZXIgZmFpbHVyZSBpZiB0aGVyZSBpcyBub3RoaW5nCisJICogd2UgY2FuIGRvLgorCSAqLworCWlmICghKG1kaW9fcmVhZChlZXByb21bNl0gJiAweDFmLCAxKSAmICgxIDw8IDIpKSkgeworCQlwcmludGYoIlZhbGlkIGxpbmsgbm90IGVzdGFibGlzaGVkXG4iKTsKKwkJZWVwcm8xMDBfZGlzYWJsZShkZXYpOworCQlyZXR1cm4gMDsKKwl9CiAKLSAgbG9hZF90aW1lcjIoMTAqVElDS1NfUEVSX01TKTsKLSAgd2hpbGUgKCF0eGZkLnN0YXR1cyAmJiB0aW1lcjJfcnVubmluZygpKQotCS8qIFdhaXQgKi87Ci0KLSAgbmljLT5yZXNldCA9IGVlcHJvMTAwX3Jlc2V0OwotICBuaWMtPnBvbGwgPSBlZXBybzEwMF9wb2xsOwotICBuaWMtPnRyYW5zbWl0ID0gZWVwcm8xMDBfdHJhbnNtaXQ7Ci0gIG5pYy0+ZGlzYWJsZSA9IGVlcHJvMTAwX2Rpc2FibGU7Ci0gIHJldHVybiBuaWM7CisJZGV2LT5kaXNhYmxlICA9IGVlcHJvMTAwX2Rpc2FibGU7CisJbmljLT5wb2xsICAgICA9IGVlcHJvMTAwX3BvbGw7CisJbmljLT50cmFuc21pdCA9IGVlcHJvMTAwX3RyYW5zbWl0OworCW5pYy0+aXJxICAgICAgPSBlZXBybzEwMF9pcnE7CisJcmV0dXJuIDE7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC02MzksMTYgKzc1MSw1OSBAQAogLyogSGV4ZHVtcCBhIG51bWJlciBvZiBieXRlcyBmcm9tIG1lbW9yeS4uLiAqLwogdm9pZCBoZCAodm9pZCAqd2hlcmUsIGludCBuKQogewotICBpbnQgaTsKKwlpbnQgaTsKIAotICB3aGlsZSAobiA+IDApIHsKLSAgICBwcmludGYgKCIlWCAiLCB3aGVyZSk7Ci0gICAgZm9yIChpPTA7aSA8ICggKG4+MTYpPzE2Om4pO2krKykKLSAgICAgIHByaW50ZiAoIiAlaGhYIiwgKChjaGFyICopd2hlcmUpW2ldKTsKLSAgICBwcmludGYgKCJcbiIpOwotICAgIG4gLT0gMTY7Ci0gICAgd2hlcmUgKz0gMTY7Ci0gIH0KKwl3aGlsZSAobiA+IDApIHsKKwkJcHJpbnRmICgiJVggIiwgd2hlcmUpOworCQlmb3IgKGk9MDtpIDwgKCAobj4xNik/MTY6bik7aSsrKQorCQkJcHJpbnRmICgiICVoaFgiLCAoKGNoYXIgKil3aGVyZSlbaV0pOworCQlwcmludGYgKCJcbiIpOworCQluIC09IDE2OworCQl3aGVyZSArPSAxNjsKKwl9CiB9CiAjZW5kaWYKIAorc3RhdGljIHN0cnVjdCBwY2lfaWQgZWVwcm8xMDBfbmljc1tdID0geworUENJX1JPTSgweDgwODYsIDB4MTAyOSwgImlkMTAyOSIsICAgICAgICAiSW50ZWwgRXRoZXJFeHByZXNzUHJvMTAwIElEMTAyOSIpLAorUENJX1JPTSgweDgwODYsIDB4MTAzMCwgImlkMTAzMCIsICAgICAgICAiSW50ZWwgRXRoZXJFeHByZXNzUHJvMTAwIElEMTAzMCIpLAorUENJX1JPTSgweDgwODYsIDB4MTAzMSwgIjgyODAxY2FtIiwgICAgICAiSW50ZWwgODI4MDFDQU0gKElDSDMpIENoaXBzZXQgRXRoZXJuZXQgQ29udHJvbGxlciIpLAorUENJX1JPTSgweDgwODYsIDB4MTAzMiwgImVlcHJvMTAwLTEwMzIiLCAiSW50ZWwgUFJPLzEwMCBWRSBOZXR3b3JrIENvbm5lY3Rpb24iKSwKK1BDSV9ST00oMHg4MDg2LCAweDEwMzMsICJlZXBybzEwMC0xMDMzIiwgIkludGVsIFBSTy8xMDAgVk0gTmV0d29yayBDb25uZWN0aW9uIiksCitQQ0lfUk9NKDB4ODA4NiwgMHgxMDM0LCAiZWVwcm8xMDAtMTAzNCIsICJJbnRlbCBQUk8vMTAwIFZNIE5ldHdvcmsgQ29ubmVjdGlvbiIpLAorUENJX1JPTSgweDgwODYsIDB4MTAzNSwgImVlcHJvMTAwLTEwMzUiLCAiSW50ZWwgODI4MDFDQU0gKElDSDMpIENoaXBzZXQgRXRoZXJuZXQgQ29udHJvbGxlciIpLAorUENJX1JPTSgweDgwODYsIDB4MTAzNiwgImVlcHJvMTAwLTEwMzYiLCAiSW50ZWwgODI4MDFDQU0gKElDSDMpIENoaXBzZXQgRXRoZXJuZXQgQ29udHJvbGxlciIpLAorUENJX1JPTSgweDgwODYsIDB4MTAzNywgImVlcHJvMTAwLTEwMzciLCAiSW50ZWwgODI4MDFDQU0gKElDSDMpIENoaXBzZXQgRXRoZXJuZXQgQ29udHJvbGxlciIpLAorUENJX1JPTSgweDgwODYsIDB4MTAzOCwgImlkMTAzOCIsICAgICAgICAiSW50ZWwgUFJPLzEwMCBWTSBOZXR3b3JrIENvbm5lY3Rpb24iKSwKK1BDSV9ST00oMHg4MDg2LCAweDEwMzksICI4MjU2MmV0IiwgICAgICAgIkludGVsIFBSTzEwMCBWRSA4MjU2MkVUIiksCitQQ0lfUk9NKDB4ODA4NiwgMHgxMDNhLCAiaWQxMDNhIiwgICAgICAgICJJbnRlbCBDb3Jwb3JhdGlvbiA4MjU1OSBJbkJ1c2luZXNzIDEwLzEwMCIpLAorUENJX1JPTSgweDgwODYsIDB4MTAzYiwgIjgyNTYyZXRiIiwgICAgICAiSW50ZWwgUFJPMTAwIFZFIDgyNTYyRVRCIiksCitQQ0lfUk9NKDB4ODA4NiwgMHgxMDNjLCAiZWVwcm8xMDAtMTAzYyIsICJJbnRlbCBQUk8vMTAwIFZNIE5ldHdvcmsgQ29ubmVjdGlvbiIpLAorUENJX1JPTSgweDgwODYsIDB4MTAzZCwgImVlcHJvMTAwLTEwM2QiLCAiSW50ZWwgUFJPLzEwMCBWRSBOZXR3b3JrIENvbm5lY3Rpb24iKSwKK1BDSV9ST00oMHg4MDg2LCAweDEwM2UsICJlZXBybzEwMC0xMDNlIiwgIkludGVsIFBSTy8xMDAgVk0gTmV0d29yayBDb25uZWN0aW9uIiksCitQQ0lfUk9NKDB4ODA4NiwgMHgxMDU5LCAiODI1NTFxbSIsICAgICAgICJJbnRlbCBQUk8vMTAwIE0gTW9iaWxlIENvbm5lY3Rpb24iKSwKK1BDSV9ST00oMHg4MDg2LCAweDEyMDksICI4MjU1OWVyIiwgICAgICAgIkludGVsIEV0aGVyRXhwcmVzc1BybzEwMCA4MjU1OUVSIiksCitQQ0lfUk9NKDB4ODA4NiwgMHgxMjI3LCAiODI4NjUiLCAgICAgICAgICJJbnRlbCA4Mjg2NSBFdGhlckV4cHJlc3MgUFJPLzEwMEEiKSwKK1BDSV9ST00oMHg4MDg2LCAweDEyMjgsICI4MjU1NiIsICAgICAgICAgIkludGVsIDgyNTU2IEV0aGVyRXhwcmVzcyBQUk8vMTAwIFNtYXJ0IiksCitQQ0lfUk9NKDB4ODA4NiwgMHgxMjI5LCAiZWVwcm8xMDAiLCAgICAgICJJbnRlbCBFdGhlckV4cHJlc3NQcm8xMDAiKSwKK1BDSV9ST00oMHg4MDg2LCAweDI0NDksICI4MjU2MmVtIiwgICAgICAgIkludGVsIEV0aGVyRXhwcmVzc1BybzEwMCA4MjU2MkVNIiksCitQQ0lfUk9NKDB4ODA4NiwgMHgyNDU5LCAiODI1NjItMSIsICAgICAgICJJbnRlbCA4MjU2MiBiYXNlZCBGYXN0IEV0aGVybmV0IENvbm5lY3Rpb24iKSwKK1BDSV9ST00oMHg4MDg2LCAweDI0NWQsICI4MjU2Mi0yIiwgICAgICAgIkludGVsIDgyNTYyIGJhc2VkIEZhc3QgRXRoZXJuZXQgQ29ubmVjdGlvbiIpLAorUENJX1JPTSgweDgwODYsIDB4MTA1MCwgIjgyNTYyZXoiLCAgICAgICAiSW50ZWwgODI1NjJFWiBOZXR3b3JrIENvbm5lY3Rpb24iKSwKK1BDSV9ST00oMHg4MDg2LCAweDUyMDAsICJlZXBybzEwMC01MjAwIiwgIkludGVsIEV0aGVyRXhwcmVzcyBQUk8vMTAwIEludGVsbGlnZW50IFNlcnZlciIpLAorUENJX1JPTSgweDgwODYsIDB4NTIwMSwgImVlcHJvMTAwLTUyMDEiLCAiSW50ZWwgRXRoZXJFeHByZXNzIFBSTy8xMDAgSW50ZWxsaWdlbnQgU2VydmVyIiksCit9OworCisvKiBDYXJkcyB3aXRoIGRldmljZSBpZHMgMHgxMDMwIHRvIDB4MTAzRiwgMHgyNDQ5LCAweDI0NTkgb3IgMHgyNDVEIG1pZ2h0IG5lZWQKKyAqIGEgd29ya2Fyb3VuZCBmb3IgaGFyZHdhcmUgYnVnIG9uIDEwIG1iaXQgaGFsZiBkdXBsZXggKHNlZSBsaW51eCBkcml2ZXIgZWVwcm8xMDAuYykKKyAqIDIwMDMvMDMvMTcgZ2JhdW0gKi8KKworCitzdHJ1Y3QgcGNpX2RyaXZlciBlZXBybzEwMF9kcml2ZXIgPSB7CisJLnR5cGUgICAgICA9IE5JQ19EUklWRVIsCisJLm5hbWUgICAgICA9ICJFRVBSTzEwMCIsCisJLnByb2JlICAgICA9IGVlcHJvMTAwX3Byb2JlLAorCS5pZHMgICAgICAgPSBlZXBybzEwMF9uaWNzLAorCS5pZF9jb3VudCAgPSBzaXplb2YoZWVwcm8xMDBfbmljcykvc2l6ZW9mKGVlcHJvMTAwX25pY3NbMF0pLAorCS5jbGFzcyAgICAgPSAwCit9OwpkaWZmIC1OYXVyIGdydWItMC45Ny5vcmlnL25ldGJvb3QvZWxmLmggZ3J1Yi0wLjk3L25ldGJvb3QvZWxmLmgKLS0tIGdydWItMC45Ny5vcmlnL25ldGJvb3QvZWxmLmgJMTk3MC0wMS0wMSAwMDowMDowMC4wMDAwMDAwMDAgKzAwMDAKKysrIGdydWItMC45Ny9uZXRib290L2VsZi5oCTIwMDUtMDgtMzEgMTk6MDM6MzUuMDAwMDAwMDAwICswMDAwCkBAIC0wLDAgKzEsMjM0IEBACisjaWZuZGVmIEVMRl9ICisjZGVmaW5lIEVMRl9ICisKKyNkZWZpbmUgRUlfTklERU5UCTE2CS8qIFNpemUgb2YgZV9pZGVudCBhcnJheS4gKi8KKworLyogVmFsdWVzIGZvciBlX3R5cGUuICovCisjZGVmaW5lIEVUX05PTkUJCTAJLyogTm8gZmlsZSB0eXBlICovCisjZGVmaW5lIEVUX1JFTAkJMQkvKiBSZWxvY2F0YWJsZSBmaWxlICovCisjZGVmaW5lIEVUX0VYRUMJCTIJLyogRXhlY3V0YWJsZSBmaWxlICovCisjZGVmaW5lIEVUX0RZTgkJMwkvKiBTaGFyZWQgb2JqZWN0IGZpbGUgKi8KKyNkZWZpbmUgRVRfQ09SRQkJNAkvKiBDb3JlIGZpbGUgKi8KKworLyogVmFsdWVzIGZvciBlX21hY2hpbmUgKGFyY2hpdGVjdXRlKS4gKi8KKyNkZWZpbmUgRU1fTk9ORQkJIDAJCS8qIE5vIG1hY2hpbmUgKi8KKyNkZWZpbmUgRU1fTTMyCQkgMQkJLyogQVQmVCBXRSAzMjEwMCAqLworI2RlZmluZSBFTV9TUEFSQwkgMgkJLyogU1VOIFNQQVJDICovCisjZGVmaW5lIEVNXzM4NgkJIDMJCS8qIEludGVsIDgwMzg2KyAqLworI2RlZmluZSBFTV82OEsJCSA0CQkvKiBNb3Rvcm9sYSBtNjhrIGZhbWlseSAqLworI2RlZmluZSBFTV84OEsJCSA1CQkvKiBNb3Rvcm9sYSBtODhrIGZhbWlseSAqLworI2RlZmluZSBFTV80ODYJCSA2CQkvKiBQZXJoYXBzIGRpc3VzZWQgKi8KKyNkZWZpbmUgRU1fODYwCQkgNwkJLyogSW50ZWwgODA4NjAgKi8KKyNkZWZpbmUgRU1fTUlQUwkJIDgJCS8qIE1JUFMgUjMwMDAgYmlnLWVuZGlhbiAqLworI2RlZmluZSBFTV9TMzcwCQkgOQkJLyogSUJNIFN5c3RlbS8zNzAgKi8KKyNkZWZpbmUgRU1fTUlQU19SUzNfTEUJMTAJCS8qIE1JUFMgUjMwMDAgbGl0dGxlLWVuZGlhbiAqLworCisjZGVmaW5lIEVNX1BBUklTQwkxNQkJLyogSFBQQSAqLworI2RlZmluZSBFTV9WUFA1MDAJMTcJCS8qIEZ1aml0c3UgVlBQNTAwICovCisjZGVmaW5lIEVNX1NQQVJDMzJQTFVTCTE4CQkvKiBTdW4ncyAidjhwbHVzIiAqLworI2RlZmluZSBFTV85NjAJCTE5CQkvKiBJbnRlbCA4MDk2MCAqLworI2RlZmluZSBFTV9QUEMJCTIwCQkvKiBQb3dlclBDICovCisjZGVmaW5lIEVNX1BQQzY0CTIxCQkvKiBQb3dlclBDIDY0LWJpdCAqLworI2RlZmluZSBFTV9TMzkwCQkyMgkJLyogSUJNIFMzOTAgKi8KKworI2RlZmluZSBFTV9WODAwCQkzNgkJLyogTkVDIFY4MDAgc2VyaWVzICovCisjZGVmaW5lIEVNX0ZSMjAJCTM3CQkvKiBGdWppdHN1IEZSMjAgKi8KKyNkZWZpbmUgRU1fUkgzMgkJMzgJCS8qIFRSVyBSSC0zMiAqLworI2RlZmluZSBFTV9SQ0UJCTM5CQkvKiBNb3Rvcm9sYSBSQ0UgKi8KKyNkZWZpbmUgRU1fQVJNCQk0MAkJLyogQVJNICovCisjZGVmaW5lIEVNX0ZBS0VfQUxQSEEJNDEJCS8qIERpZ2l0YWwgQWxwaGEgKi8KKyNkZWZpbmUgRU1fU0gJCTQyCQkvKiBIaXRhY2hpIFNIICovCisjZGVmaW5lIEVNX1NQQVJDVjkJNDMJCS8qIFNQQVJDIHY5IDY0LWJpdCAqLworI2RlZmluZSBFTV9UUklDT1JFCTQ0CQkvKiBTaWVtZW5zIFRyaWNvcmUgKi8KKyNkZWZpbmUgRU1fQVJDCQk0NQkJLyogQXJnb25hdXQgUklTQyBDb3JlICovCisjZGVmaW5lIEVNX0g4XzMwMAk0NgkJLyogSGl0YWNoaSBIOC8zMDAgKi8KKyNkZWZpbmUgRU1fSDhfMzAwSAk0NwkJLyogSGl0YWNoaSBIOC8zMDBIICovCisjZGVmaW5lIEVNX0g4UwkJNDgJCS8qIEhpdGFjaGkgSDhTICovCisjZGVmaW5lIEVNX0g4XzUwMAk0OQkJLyogSGl0YWNoaSBIOC81MDAgKi8KKyNkZWZpbmUgRU1fSUFfNjQJNTAJCS8qIEludGVsIE1lcmNlZCAqLworI2RlZmluZSBFTV9NSVBTX1gJNTEJCS8qIFN0YW5mb3JkIE1JUFMtWCAqLworI2RlZmluZSBFTV9DT0xERklSRQk1MgkJLyogTW90b3JvbGEgQ29sZGZpcmUgKi8KKyNkZWZpbmUgRU1fNjhIQzEyCTUzCQkvKiBNb3Rvcm9sYSBNNjhIQzEyICovCisjZGVmaW5lIEVNX01NQQkJNTQJCS8qIEZ1aml0c3UgTU1BIE11bHRpbWVkaWEgQWNjZWxlcmF0b3IqLworI2RlZmluZSBFTV9QQ1AJCTU1CQkvKiBTaWVtZW5zIFBDUCAqLworI2RlZmluZSBFTV9OQ1BVCQk1NgkJLyogU29ueSBuQ1BVIGVtYmVlZGVkIFJJU0MgKi8KKyNkZWZpbmUgRU1fTkRSMQkJNTcJCS8qIERlbnNvIE5EUjEgbWljcm9wcm9jZXNzb3IgKi8KKyNkZWZpbmUgRU1fU1RBUkNPUkUJNTgJCS8qIE1vdG9yb2xhIFN0YXJ0KkNvcmUgcHJvY2Vzc29yICovCisjZGVmaW5lIEVNX01FMTYJCTU5CQkvKiBUb3lvdGEgTUUxNiBwcm9jZXNzb3IgKi8KKyNkZWZpbmUgRU1fU1QxMDAJNjAJCS8qIFNUTWljcm9lbGVjdHJvbmljIFNUMTAwIHByb2Nlc3NvciAqLworI2RlZmluZSBFTV9USU5ZSgk2MQkJLyogQWR2YW5jZWQgTG9naWMgQ29ycC4gVGlueWogZW1iLmZhbSovCisjZGVmaW5lIEVNX1g4Nl82NAk2MgkJLyogQU1EIHg4Ni02NCBhcmNoaXRlY3R1cmUgKi8KKyNkZWZpbmUgRU1fUERTUAkJNjMJCS8qIFNvbnkgRFNQIFByb2Nlc3NvciAqLworCisjZGVmaW5lIEVNX0ZYNjYJCTY2CQkvKiBTaWVtZW5zIEZYNjYgbWljcm9jb250cm9sbGVyICovCisjZGVmaW5lIEVNX1NUOVBMVVMJNjcJCS8qIFNUTWljcm9lbGVjdHJvbmljcyBTVDkrIDgvMTYgbWMgKi8KKyNkZWZpbmUgRU1fU1Q3CQk2OAkJLyogU1RtaWNyb2VsZWN0cm9uaWNzIFNUNyA4IGJpdCBtYyAqLworI2RlZmluZSBFTV82OEhDMTYJNjkJCS8qIE1vdG9yb2xhIE1DNjhIQzE2IG1pY3JvY29udHJvbGxlciAqLworI2RlZmluZSBFTV82OEhDMTEJNzAJCS8qIE1vdG9yb2xhIE1DNjhIQzExIG1pY3JvY29udHJvbGxlciAqLworI2RlZmluZSBFTV82OEhDMDgJNzEJCS8qIE1vdG9yb2xhIE1DNjhIQzA4IG1pY3JvY29udHJvbGxlciAqLworI2RlZmluZSBFTV82OEhDMDUJNzIJCS8qIE1vdG9yb2xhIE1DNjhIQzA1IG1pY3JvY29udHJvbGxlciAqLworI2RlZmluZSBFTV9TVlgJCTczCQkvKiBTaWxpY29uIEdyYXBoaWNzIFNWeCAqLworI2RlZmluZSBFTV9BVDE5CQk3NAkJLyogU1RNaWNyb2VsZWN0cm9uaWNzIFNUMTkgOCBiaXQgbWMgKi8KKyNkZWZpbmUgRU1fVkFYCQk3NQkJLyogRGlnaXRhbCBWQVggKi8KKyNkZWZpbmUgRU1fQ1JJUwkJNzYJCS8qIEF4aXMgQ29tbXVuaWNhdGlvbnMgMzItYml0IGVtYmVkZGVkIHByb2Nlc3NvciAqLworI2RlZmluZSBFTV9KQVZFTElOCTc3CQkvKiBJbmZpbmVvbiBUZWNobm9sb2dpZXMgMzItYml0IGVtYmVkZGVkIHByb2Nlc3NvciAqLworI2RlZmluZSBFTV9GSVJFUEFUSAk3OAkJLyogRWxlbWVudCAxNCA2NC1iaXQgRFNQIFByb2Nlc3NvciAqLworI2RlZmluZSBFTV9aU1AJCTc5CQkvKiBMU0kgTG9naWMgMTYtYml0IERTUCBQcm9jZXNzb3IgKi8KKyNkZWZpbmUgRU1fTU1JWAkJODAJCS8qIERvbmFsZCBLbnV0aCdzIGVkdWNhdGlvbmFsIDY0LWJpdCBwcm9jZXNzb3IgKi8KKyNkZWZpbmUgRU1fSFVBTlkJODEJCS8qIEhhcnZhcmQgVW5pdmVyc2l0eSBtYWNoaW5lLWluZGVwZW5kZW50IG9iamVjdCBmaWxlcyAqLworI2RlZmluZSBFTV9QUklTTQk4MgkJLyogU2lUZXJhIFByaXNtICovCisjZGVmaW5lIEVNX0FWUgkJODMJCS8qIEF0bWVsIEFWUiA4LWJpdCBtaWNyb2NvbnRyb2xsZXIgKi8KKyNkZWZpbmUgRU1fRlIzMAkJODQJCS8qIEZ1aml0c3UgRlIzMCAqLworI2RlZmluZSBFTV9EMTBWCQk4NQkJLyogTWl0c3ViaXNoaSBEMTBWICovCisjZGVmaW5lIEVNX0QzMFYJCTg2CQkvKiBNaXRzdWJpc2hpIEQzMFYgKi8KKyNkZWZpbmUgRU1fVjg1MAkJODcJCS8qIE5FQyB2ODUwICovCisjZGVmaW5lIEVNX00zMlIJCTg4CQkvKiBNaXRzdWJpc2hpIE0zMlIgKi8KKyNkZWZpbmUgRU1fTU4xMDMwMAk4OQkJLyogTWF0c3VzaGl0YSBNTjEwMzAwICovCisjZGVmaW5lIEVNX01OMTAyMDAJOTAJCS8qIE1hdHN1c2hpdGEgTU4xMDIwMCAqLworI2RlZmluZSBFTV9QSgkJOTEJCS8qIHBpY29KYXZhICovCisjZGVmaW5lIEVNX09QRU5SSVNDCTkyCQkvKiBPcGVuUklTQyAzMi1iaXQgZW1iZWRkZWQgcHJvY2Vzc29yICovCisjZGVmaW5lIEVNX0FSQ19BNQk5MwkJLyogQVJDIENvcmVzIFRhbmdlbnQtQTUgKi8KKyNkZWZpbmUgRU1fWFRFTlNBCTk0CQkvKiBUZW5zaWxpY2EgWHRlbnNhIEFyY2hpdGVjdHVyZSAqLworI2RlZmluZSBFTV9OVU0JCTk1CisKKy8qIFZhbHVlcyBmb3IgcF90eXBlLiAqLworI2RlZmluZSBQVF9OVUxMCQkwCS8qIFVudXNlZCBlbnRyeS4gKi8KKyNkZWZpbmUgUFRfTE9BRAkJMQkvKiBMb2FkYWJsZSBzZWdtZW50LiAqLworI2RlZmluZSBQVF9EWU5BTUlDCTIJLyogRHluYW1pYyBsaW5raW5nIGluZm9ybWF0aW9uIHNlZ21lbnQuICovCisjZGVmaW5lIFBUX0lOVEVSUAkzCS8qIFBhdGhuYW1lIG9mIGludGVycHJldGVyLiAqLworI2RlZmluZSBQVF9OT1RFCQk0CS8qIEF1eGlsaWFyeSBpbmZvcm1hdGlvbi4gKi8KKyNkZWZpbmUgUFRfU0hMSUIJNQkvKiBSZXNlcnZlZCAobm90IHVzZWQpLiAqLworI2RlZmluZSBQVF9QSERSCQk2CS8qIExvY2F0aW9uIG9mIHByb2dyYW0gaGVhZGVyIGl0c2VsZi4gKi8KKworLyogVmFsdWVzIGZvciBwX2ZsYWdzLiAqLworI2RlZmluZSBQRl9YCQkweDEJLyogRXhlY3V0YWJsZS4gKi8KKyNkZWZpbmUgUEZfVwkJMHgyCS8qIFdyaXRhYmxlLiAqLworI2RlZmluZSBQRl9SCQkweDQJLyogUmVhZGFibGUuICovCisKKworI2RlZmluZQlFTEZfUFJPR1JBTV9SRVRVUk5TX0JJVAkweDgwMDAwMDAJLyogZV9mbGFncyBiaXQgMzEgKi8KKworI2RlZmluZSBFSV9NQUcwCQkwCisjZGVmaW5lIEVMRk1BRzAJCTB4N2YKKworI2RlZmluZSBFSV9NQUcxCQkxCisjZGVmaW5lIEVMRk1BRzEJCSdFJworCisjZGVmaW5lIEVJX01BRzIJCTIKKyNkZWZpbmUgRUxGTUFHMgkJJ0wnCisKKyNkZWZpbmUgRUlfTUFHMwkJMworI2RlZmluZSBFTEZNQUczCQknRicKKworI2RlZmluZSBFTEZNQUcJCSJcMTc3RUxGIgorCisjZGVmaW5lIEVJX0NMQVNTCTQJLyogRmlsZSBjbGFzcyBieXRlIGluZGV4ICovCisjZGVmaW5lIEVMRkNMQVNTTk9ORQkwCS8qIEludmFsaWQgY2xhc3MgKi8KKyNkZWZpbmUgRUxGQ0xBU1MzMgkxCS8qIDMyLWJpdCBvYmplY3RzICovCisjZGVmaW5lIEVMRkNMQVNTNjQJMgkvKiA2NC1iaXQgb2JqZWN0cyAqLworCisjZGVmaW5lIEVJX0RBVEEJCTUJLyogRGF0YSBlbmNvZGVpbmcgYnl0ZSBpbmRleCAqLworI2RlZmluZSBFTEZEQVRBTk9ORQkwCS8qIEludmFsaWQgZGF0YSBlbmNvZGluZyAqLworI2RlZmluZSBFTEZEQVRBMkxTQgkxCS8qIDIncyBjb21wbGVtZW50IGxpdHRsZSBlbmRpYW4gKi8KKyNkZWZpbmUgRUxGREFUQTJNU0IJMgkvKiAyJ3MgY29tcGxlbWVudCBiaWcgZW5kaWFuICovCisKKyNkZWZpbmUgRUlfVkVSU0lPTgk2CS8qIEZpbGUgdmVyc2lvbiBieXRlIGluZGV4ICovCisJCQkJLyogVmFsdWUgbXVzdCBiZSBFVl9DVVJSRU5UICovCisKKyNkZWZpbmUgRVZfTk9ORQkJMAkvKiBJbnZhbGlkIEVMRiBWZXJzaW9uICovCisjZGVmaW5lIEVWX0NVUlJFTlQJMQkvKiBDdXJyZW50IHZlcnNpb24gKi8KKworI2RlZmluZSBFTEYzMl9QSERSX1NJWkUgKDgqNCkJLyogU2l6ZSBvZiBhbiBlbGYgcHJvZ3JhbSBoZWFkZXIgKi8KKworI2lmbmRlZiBBU1NFTUJMWQorLyoKKyAqIEVMRiBkZWZpbml0aW9ucyBjb21tb24gdG8gYWxsIDMyLWJpdCBhcmNoaXRlY3R1cmVzLgorICovCisKK3R5cGVkZWYgdWludDMyX3QJRWxmMzJfQWRkcjsKK3R5cGVkZWYgdWludDE2X3QJRWxmMzJfSGFsZjsKK3R5cGVkZWYgdWludDMyX3QJRWxmMzJfT2ZmOwordHlwZWRlZiBpbnQzMl90CQlFbGYzMl9Td29yZDsKK3R5cGVkZWYgdWludDMyX3QJRWxmMzJfV29yZDsKK3R5cGVkZWYgdWludDMyX3QJRWxmMzJfU2l6ZTsKKwordHlwZWRlZiB1aW50NjRfdAlFbGY2NF9BZGRyOwordHlwZWRlZiB1aW50MTZfdAlFbGY2NF9IYWxmOwordHlwZWRlZiB1aW50NjRfdAlFbGY2NF9PZmY7Cit0eXBlZGVmIGludDMyX3QJCUVsZjY0X1N3b3JkOwordHlwZWRlZiB1aW50MzJfdAlFbGY2NF9Xb3JkOwordHlwZWRlZiB1aW50NjRfdAlFbGY2NF9TaXplOworCisvKgorICogRUxGIGhlYWRlci4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworCXVuc2lnbmVkIGNoYXIJZV9pZGVudFtFSV9OSURFTlRdOwkvKiBGaWxlIGlkZW50aWZpY2F0aW9uLiAqLworCUVsZjMyX0hhbGYJZV90eXBlOwkJLyogRmlsZSB0eXBlLiAqLworCUVsZjMyX0hhbGYJZV9tYWNoaW5lOwkvKiBNYWNoaW5lIGFyY2hpdGVjdHVyZS4gKi8KKwlFbGYzMl9Xb3JkCWVfdmVyc2lvbjsJLyogRUxGIGZvcm1hdCB2ZXJzaW9uLiAqLworCUVsZjMyX0FkZHIJZV9lbnRyeTsJLyogRW50cnkgcG9pbnQuICovCisJRWxmMzJfT2ZmCWVfcGhvZmY7CS8qIFByb2dyYW0gaGVhZGVyIGZpbGUgb2Zmc2V0LiAqLworCUVsZjMyX09mZgllX3Nob2ZmOwkvKiBTZWN0aW9uIGhlYWRlciBmaWxlIG9mZnNldC4gKi8KKwlFbGYzMl9Xb3JkCWVfZmxhZ3M7CS8qIEFyY2hpdGVjdHVyZS1zcGVjaWZpYyBmbGFncy4gKi8KKwlFbGYzMl9IYWxmCWVfZWhzaXplOwkvKiBTaXplIG9mIEVMRiBoZWFkZXIgaW4gYnl0ZXMuICovCisJRWxmMzJfSGFsZgllX3BoZW50c2l6ZTsJLyogU2l6ZSBvZiBwcm9ncmFtIGhlYWRlciBlbnRyeS4gKi8KKwlFbGYzMl9IYWxmCWVfcGhudW07CS8qIE51bWJlciBvZiBwcm9ncmFtIGhlYWRlciBlbnRyaWVzLiAqLworCUVsZjMyX0hhbGYJZV9zaGVudHNpemU7CS8qIFNpemUgb2Ygc2VjdGlvbiBoZWFkZXIgZW50cnkuICovCisJRWxmMzJfSGFsZgllX3NobnVtOwkvKiBOdW1iZXIgb2Ygc2VjdGlvbiBoZWFkZXIgZW50cmllcy4gKi8KKwlFbGYzMl9IYWxmCWVfc2hzdHJuZHg7CS8qIFNlY3Rpb24gbmFtZSBzdHJpbmdzIHNlY3Rpb24uICovCit9IEVsZjMyX0VoZHI7CisKK3R5cGVkZWYgc3RydWN0IHsKKwl1bnNpZ25lZCBjaGFyCWVfaWRlbnRbRUlfTklERU5UXTsJLyogRmlsZSBpZGVudGlmaWNhdGlvbi4gKi8KKwlFbGY2NF9IYWxmCWVfdHlwZTsJCS8qIEZpbGUgdHlwZS4gKi8KKwlFbGY2NF9IYWxmCWVfbWFjaGluZTsJLyogTWFjaGluZSBhcmNoaXRlY3R1cmUuICovCisJRWxmNjRfV29yZAllX3ZlcnNpb247CS8qIEVMRiBmb3JtYXQgdmVyc2lvbi4gKi8KKwlFbGY2NF9BZGRyCWVfZW50cnk7CS8qIEVudHJ5IHBvaW50LiAqLworCUVsZjY0X09mZgllX3Bob2ZmOwkvKiBQcm9ncmFtIGhlYWRlciBmaWxlIG9mZnNldC4gKi8KKwlFbGY2NF9PZmYJZV9zaG9mZjsJLyogU2VjdGlvbiBoZWFkZXIgZmlsZSBvZmZzZXQuICovCisJRWxmNjRfV29yZAllX2ZsYWdzOwkvKiBBcmNoaXRlY3R1cmUtc3BlY2lmaWMgZmxhZ3MuICovCisJRWxmNjRfSGFsZgllX2Voc2l6ZTsJLyogU2l6ZSBvZiBFTEYgaGVhZGVyIGluIGJ5dGVzLiAqLworCUVsZjY0X0hhbGYJZV9waGVudHNpemU7CS8qIFNpemUgb2YgcHJvZ3JhbSBoZWFkZXIgZW50cnkuICovCisJRWxmNjRfSGFsZgllX3BobnVtOwkvKiBOdW1iZXIgb2YgcHJvZ3JhbSBoZWFkZXIgZW50cmllcy4gKi8KKwlFbGY2NF9IYWxmCWVfc2hlbnRzaXplOwkvKiBTaXplIG9mIHNlY3Rpb24gaGVhZGVyIGVudHJ5LiAqLworCUVsZjY0X0hhbGYJZV9zaG51bTsJLyogTnVtYmVyIG9mIHNlY3Rpb24gaGVhZGVyIGVudHJpZXMuICovCisJRWxmNjRfSGFsZgllX3Noc3RybmR4OwkvKiBTZWN0aW9uIG5hbWUgc3RyaW5ncyBzZWN0aW9uLiAqLworfSBFbGY2NF9FaGRyOworCisvKgorICogUHJvZ3JhbSBoZWFkZXIuCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKwlFbGYzMl9Xb3JkCXBfdHlwZTsJCS8qIEVudHJ5IHR5cGUuICovCisJRWxmMzJfT2ZmCXBfb2Zmc2V0OwkvKiBGaWxlIG9mZnNldCBvZiBjb250ZW50cy4gKi8KKwlFbGYzMl9BZGRyCXBfdmFkZHI7CS8qIFZpcnR1YWwgYWRkcmVzcyAobm90IHVzZWQpLiAqLworCUVsZjMyX0FkZHIJcF9wYWRkcjsJLyogUGh5c2ljYWwgYWRkcmVzcy4gKi8KKwlFbGYzMl9TaXplCXBfZmlsZXN6OwkvKiBTaXplIG9mIGNvbnRlbnRzIGluIGZpbGUuICovCisJRWxmMzJfU2l6ZQlwX21lbXN6OwkvKiBTaXplIG9mIGNvbnRlbnRzIGluIG1lbW9yeS4gKi8KKwlFbGYzMl9Xb3JkCXBfZmxhZ3M7CS8qIEFjY2VzcyBwZXJtaXNzaW9uIGZsYWdzLiAqLworCUVsZjMyX1NpemUJcF9hbGlnbjsJLyogQWxpZ25tZW50IGluIG1lbW9yeSBhbmQgZmlsZS4gKi8KK30gRWxmMzJfUGhkcjsKKwordHlwZWRlZiBzdHJ1Y3QgeworCUVsZjY0X1dvcmQJcF90eXBlOwkJLyogRW50cnkgdHlwZS4gKi8KKwlFbGY2NF9Xb3JkCXBfZmxhZ3M7CS8qIEFjY2VzcyBwZXJtaXNzaW9uIGZsYWdzLiAqLworCUVsZjY0X09mZglwX29mZnNldDsJLyogRmlsZSBvZmZzZXQgb2YgY29udGVudHMuICovCisJRWxmNjRfQWRkcglwX3ZhZGRyOwkvKiBWaXJ0dWFsIGFkZHJlc3MgKG5vdCB1c2VkKS4gKi8KKwlFbGY2NF9BZGRyCXBfcGFkZHI7CS8qIFBoeXNpY2FsIGFkZHJlc3MuICovCisJRWxmNjRfU2l6ZQlwX2ZpbGVzejsJLyogU2l6ZSBvZiBjb250ZW50cyBpbiBmaWxlLiAqLworCUVsZjY0X1NpemUJcF9tZW1zejsJLyogU2l6ZSBvZiBjb250ZW50cyBpbiBtZW1vcnkuICovCisJRWxmNjRfU2l6ZQlwX2FsaWduOwkvKiBBbGlnbm1lbnQgaW4gbWVtb3J5IGFuZCBmaWxlLiAqLworfSBFbGY2NF9QaGRyOworCisvKiBTdGFuZGFyZGl6ZWQgRWxmIGltYWdlIG5vdGVzIGZvciBib290aW5nLi4uIFRoZSBuYW1lIGZvciBhbGwgb2YgdGhlc2UgaXMgRUxGQm9vdCAqLworCisKKy8qIEVMRiBEZWZpbmVzIGZvciB0aGUgY3VycmVudCBhcmNoaXRlY3R1cmUgKi8KKyNpbmNsdWRlICJpMzg2X2VsZi5oIgorCisjZW5kaWYgLyogQVNTRU1CTFkgKi8KKworLy8jaW5jbHVkZSAiZWxmX2Jvb3QuaCIKKworI2VuZGlmIC8qIEVMRl9IICovCmRpZmYgLU5hdXIgZ3J1Yi0wLjk3Lm9yaWcvbmV0Ym9vdC9lbmRpYW4uaCBncnViLTAuOTcvbmV0Ym9vdC9lbmRpYW4uaAotLS0gZ3J1Yi0wLjk3Lm9yaWcvbmV0Ym9vdC9lbmRpYW4uaAkxOTcwLTAxLTAxIDAwOjAwOjAwLjAwMDAwMDAwMCArMDAwMAorKysgZ3J1Yi0wLjk3L25ldGJvb3QvZW5kaWFuLmgJMjAwNS0wOC0zMSAxOTowMzozNS4wMDAwMDAwMDAgKzAwMDAKQEAgLTAsMCArMSwxOSBAQAorI2lmbmRlZiBFVEhFUkJPT1RfRU5ESUFOX0gKKyNkZWZpbmUgRVRIRVJCT09UX0VORElBTl9ICisKKy8qIERlZmluaXRpb25zIGZvciBieXRlIG9yZGVyLCBhY2NvcmRpbmcgdG8gc2lnbmlmaWNhbmNlIG9mIGJ5dGVzLAorICAgZnJvbSBsb3cgYWRkcmVzc2VzIHRvIGhpZ2ggYWRkcmVzc2VzLiAgVGhlIHZhbHVlIGlzIHdoYXQgeW91IGdldCBieQorICAgcHV0dGluZyAnNCcgaW4gdGhlIG1vc3Qgc2lnbmlmaWNhbnQgYnl0ZSwgJzMnIGluIHRoZSBzZWNvbmQgbW9zdAorICAgc2lnbmlmaWNhbnQgYnl0ZSwgJzInIGluIHRoZSBzZWNvbmQgbGVhc3Qgc2lnbmlmaWNhbnQgYnl0ZSwgYW5kICcxJworICAgaW4gdGhlIGxlYXN0IHNpZ25pZmljYW50IGJ5dGUsIGFuZCB0aGVuIHdyaXRpbmcgZG93biBvbmUgZGlnaXQgZm9yCisgICBlYWNoIGJ5dGUsIHN0YXJ0aW5nIHdpdGggdGhlIGJ5dGUgYXQgdGhlIGxvd2VzdCBhZGRyZXNzIGF0IHRoZSBsZWZ0LAorICAgYW5kIHByb2NlZWRpbmcgdG8gdGhlIGJ5dGUgd2l0aCB0aGUgaGlnaGVzdCBhZGRyZXNzIGF0IHRoZSByaWdodC4gICovCisKKyNkZWZpbmUgX19MSVRUTEVfRU5ESUFOIDEyMzQKKyNkZWZpbmUgX19CSUdfRU5ESUFOICAgIDQzMjEKKyNkZWZpbmUgX19QRFBfRU5ESUFOICAgIDM0MTIKKworI2luY2x1ZGUgImkzODZfZW5kaWFuLmgiCisKKworI2VuZGlmIC8qIEVUSEVSQk9PVF9FTkRJQU5fSCAqLwpkaWZmIC1OYXVyIGdydWItMC45Ny5vcmlnL25ldGJvb3QvZXBpYzEwMC5jIGdydWItMC45Ny9uZXRib290L2VwaWMxMDAuYwotLS0gZ3J1Yi0wLjk3Lm9yaWcvbmV0Ym9vdC9lcGljMTAwLmMJMjAwMy0wNy0wOSAxMTo0NTozNy4wMDAwMDAwMDAgKzAwMDAKKysrIGdydWItMC45Ny9uZXRib290L2VwaWMxMDAuYwkyMDA1LTA4LTMxIDE5OjAzOjM1LjAwMDAwMDAwMCArMDAwMApAQCAtMSwxNSArMSwxOCBAQAorCiAvKiBlcGljMTAwLmM6IEEgU01DIDgzYzE3MCBFUElDLzEwMCBmYXN0IGV0aGVybmV0IGRyaXZlciBmb3IgRXRoZXJib290ICovCiAKKy8qIDA1LzA2LzIwMDMJdGltbGVnZ2UJRml4ZWQgcmVsb2NhdGlvbiBhbmQgaW1wbGVtZW50ZWQgTXVsdGljYXN0ICovCiAjZGVmaW5lIExJTlVYX09VVF9NQUNST1MKIAogI2luY2x1ZGUgImV0aGVyYm9vdC5oIgorI2luY2x1ZGUgInBjaS5oIgogI2luY2x1ZGUgIm5pYy5oIgotI2luY2x1ZGUgImNhcmRzLmgiCiAjaW5jbHVkZSAidGltZXIuaCIKICNpbmNsdWRlICJlcGljMTAwLmgiCiAKLSN1bmRlZgl2aXJ0X3RvX2J1cwotI2RlZmluZQl2aXJ0X3RvX2J1cyh4KQkoKHVuc2lnbmVkIGxvbmcpeCkKKy8qIENvbmRlbnNlZCBvcGVyYXRpb25zIGZvciByZWFkYWJpbGl0eSAqLworI2RlZmluZSB2aXJ0X3RvX2xlMzJkZXNjKGFkZHIpCWNwdV90b19sZTMyKHZpcnRfdG9fYnVzKGFkZHIpKQorI2RlZmluZSBsZTMyZGVzY190b192aXJ0KGFkZHIpCWJ1c190b192aXJ0KGxlMzJfdG9fY3B1KGFkZHIpKQogCiAjZGVmaW5lIFRYX1JJTkdfU0laRQkyCS8qIHVzZSBhdCBsZWFzdCAyIGJ1ZmZlcnMgZm9yIFRYICovCiAjZGVmaW5lIFJYX1JJTkdfU0laRQkyCkBAIC0yNiwyMyArMjksMTggQEAKIAogLyogVGhlIEVQSUMxMDAgUnggYW5kIFR4IGJ1ZmZlciBkZXNjcmlwdG9ycy4gKi8KIHN0cnVjdCBlcGljX3J4X2Rlc2MgewotICAgIHVuc2lnbmVkIHNob3J0IHN0YXR1czsKLSAgICB1bnNpZ25lZCBzaG9ydCByeGxlbmd0aDsKLSAgICB1bnNpZ25lZCBsb25nICBidWZhZGRyOwotICAgIHVuc2lnbmVkIHNob3J0IGJ1Zmxlbmd0aDsKLSAgICB1bnNpZ25lZCBzaG9ydCBjb250cm9sOwotICAgIHVuc2lnbmVkIGxvbmcgIG5leHQ7CisgICAgdW5zaWduZWQgbG9uZyBzdGF0dXM7CisgICAgdW5zaWduZWQgbG9uZyBidWZhZGRyOworICAgIHVuc2lnbmVkIGxvbmcgYnVmbGVuZ3RoOworICAgIHVuc2lnbmVkIGxvbmcgbmV4dDsKIH07Ci0KIC8qIGRlc2NyaXB0aW9uIG9mIHRoZSB0eCBkZXNjcmlwdG9ycyBjb250cm9sIGJpdHMgY29tbW9ubHkgdXNlZCAqLwogI2RlZmluZSBURF9TVERGTEFHUwlURF9MQVNUREVTQwogCiBzdHJ1Y3QgZXBpY190eF9kZXNjIHsKLSAgICB1bnNpZ25lZCBzaG9ydCBzdGF0dXM7Ci0gICAgdW5zaWduZWQgc2hvcnQgdHhsZW5ndGg7Ci0gICAgdW5zaWduZWQgbG9uZyAgYnVmYWRkcjsKLSAgICB1bnNpZ25lZCBzaG9ydCBidWZsZW5ndGg7Ci0gICAgdW5zaWduZWQgc2hvcnQgY29udHJvbDsKKyAgICB1bnNpZ25lZCBsb25nIHN0YXR1czsKKyAgICB1bnNpZ25lZCBsb25nIGJ1ZmFkZHI7CisgICAgdW5zaWduZWQgbG9uZyBidWZsZW5ndGg7CiAgICAgdW5zaWduZWQgbG9uZyAgbmV4dDsKIH07CiAKQEAgLTUxLDEyICs0OSwxNSBAQAogCiBzdGF0aWMgdm9pZAllcGljMTAwX29wZW4odm9pZCk7CiBzdGF0aWMgdm9pZAllcGljMTAwX2luaXRfcmluZyh2b2lkKTsKLXN0YXRpYyB2b2lkCWVwaWMxMDBfZGlzYWJsZShzdHJ1Y3QgbmljICpuaWMpOwotc3RhdGljIGludAllcGljMTAwX3BvbGwoc3RydWN0IG5pYyAqbmljKTsKK3N0YXRpYyB2b2lkCWVwaWMxMDBfZGlzYWJsZShzdHJ1Y3QgZGV2ICpkZXYpOworc3RhdGljIGludAllcGljMTAwX3BvbGwoc3RydWN0IG5pYyAqbmljLCBpbnQgcmV0cmlldmUpOwogc3RhdGljIHZvaWQJZXBpYzEwMF90cmFuc21pdChzdHJ1Y3QgbmljICpuaWMsIGNvbnN0IGNoYXIgKmRlc3RhZGRyLAogCQkJCSB1bnNpZ25lZCBpbnQgdHlwZSwgdW5zaWduZWQgaW50IGxlbiwgY29uc3QgY2hhciAqZGF0YSk7CisjaWZkZWYJREVCVUdfRUVQUk9NCiBzdGF0aWMgaW50CXJlYWRfZWVwcm9tKGludCBsb2NhdGlvbik7CisjZW5kaWYKIHN0YXRpYyBpbnQJbWlpX3JlYWQoaW50IHBoeV9pZCwgaW50IGxvY2F0aW9uKTsKK3N0YXRpYyB2b2lkICAgICBlcGljMTAwX2lycShzdHJ1Y3QgbmljICpuaWMsIGlycV9hY3Rpb25fdCBhY3Rpb24pOwogCiBzdGF0aWMgaW50CWlvYWRkcjsKIApAQCAtNjksNiArNzAsNyBAQAogc3RhdGljIGludAltbWN0bCAgOwogc3RhdGljIGludAltbWRhdGEgOwogc3RhdGljIGludAlsYW4wICAgOworc3RhdGljIGludAltYzAgICAgOwogc3RhdGljIGludAlyeGNvbiAgOwogc3RhdGljIGludAl0eGNvbiAgOwogc3RhdGljIGludAlwcmNkYXIgOwpAQCAtODAsMzcgKzgyLDI3IEBACiBzdGF0aWMgdW5zaWduZWQgc2hvcnQJZWVwcm9tWzY0XTsKICNlbmRpZgogc3RhdGljIHNpZ25lZCBjaGFyCXBoeXNbNF07CQkvKiBNSUkgZGV2aWNlIGFkZHJlc3Nlcy4gKi8KLXN0YXRpYyBzdHJ1Y3QgZXBpY19yeF9kZXNjCXJ4X3JpbmdbUlhfUklOR19TSVpFXTsKLXN0YXRpYyBzdHJ1Y3QgZXBpY190eF9kZXNjCXR4X3JpbmdbVFhfUklOR19TSVpFXTsKLSNpZmRlZglVU0VfTE9XTUVNX0JVRkZFUgotI2RlZmluZSByeF9wYWNrZXQgKChjaGFyICopMHgxMDAwMCAtIFBLVF9CVUZfU1ogKiBSWF9SSU5HX1NJWkUpCi0jZGVmaW5lIHR4X3BhY2tldCAoKGNoYXIgKikweDEwMDAwIC0gUEtUX0JVRl9TWiAqIFJYX1JJTkdfU0laRSAtIFBLVF9CVUZfU1ogKiBUWF9SSU5HX1NJWkUpCi0jZWxzZQotc3RhdGljIGNoYXIJCXJ4X3BhY2tldFtQS1RfQlVGX1NaICogUlhfUklOR19TSVpFXTsKLXN0YXRpYyBjaGFyCQl0eF9wYWNrZXRbUEtUX0JVRl9TWiAqIFRYX1JJTkdfU0laRV07Ci0jZW5kaWYKK3N0YXRpYyBzdHJ1Y3QgZXBpY19yeF9kZXNjCXJ4X3JpbmdbUlhfUklOR19TSVpFXQorCV9fYXR0cmlidXRlX18gKChhbGlnbmVkKDQpKSk7CitzdGF0aWMgc3RydWN0IGVwaWNfdHhfZGVzYwl0eF9yaW5nW1RYX1JJTkdfU0laRV0KKwlfX2F0dHJpYnV0ZV9fICgoYWxpZ25lZCg0KSkpOworc3RhdGljIHVuc2lnbmVkIGNoYXIJIAlyeF9wYWNrZXRbUEtUX0JVRl9TWiAqIFJYX1JJTkdfU0laRV07CitzdGF0aWMgdW5zaWduZWQgY2hhcgkJdHhfcGFja2V0W1BLVF9CVUZfU1ogKiBUWF9SSU5HX1NJWkVdOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgRXh0ZXJuYWxseSB2aXNpYmxlIGZ1bmN0aW9ucyAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLSAgICBzdGF0aWMgdm9pZAotZXBpYzEwMF9yZXNldChzdHJ1Y3QgbmljICpuaWMpCi17Ci0gICAgLyogU29mdCByZXNldCB0aGUgY2hpcC4gKi8KLSAgICBvdXRsKEdDX1NPRlRfUkVTRVQsIGdlbmN0bCk7Ci19CiAKLSAgICBzdHJ1Y3QgbmljKgotZXBpYzEwMF9wcm9iZShzdHJ1Y3QgbmljICpuaWMsIHVuc2lnbmVkIHNob3J0ICpwcm9iZWFkZHJzKQorICAgIHN0YXRpYyBpbnQKK2VwaWMxMDBfcHJvYmUoc3RydWN0IGRldiAqZGV2LCBzdHJ1Y3QgcGNpX2RldmljZSAqcGNpKQogewotICAgIHVuc2lnbmVkIHNob3J0IHN1bSA9IDA7Ci0gICAgdW5zaWduZWQgc2hvcnQgdmFsdWU7CisgICAgc3RydWN0IG5pYyAqbmljID0gKHN0cnVjdCBuaWMgKilkZXY7CiAgICAgaW50IGk7CiAgICAgdW5zaWduZWQgc2hvcnQqIGFwOwogICAgIHVuc2lnbmVkIGludCBwaHksIHBoeV9pZHg7CiAKLSAgICBpZiAocHJvYmVhZGRycyA9PSAwIHx8IHByb2JlYWRkcnNbMF0gPT0gMCkKKyAgICBpZiAocGNpLT5pb2FkZHIgPT0gMCkKIAlyZXR1cm4gMDsKIAogICAgIC8qIElkZWFsbHkgd2Ugd291bGQgZGV0ZWN0IGFsbCBuZXR3b3JrIGNhcmRzIGluIHNsb3Qgb3JkZXIuICBUaGF0IHdvdWxkCkBAIC0xMTgsNyArMTEwLDkgQEAKICAgICAgICB3ZWxsIHdpdGggdGhlIGN1cnJlbnQgc3RydWN0dXJlLiAgU28gaW5zdGVhZCB3ZSBkZXRlY3QganVzdCB0aGUKICAgICAgICBFcGljIGNhcmRzIGluIHNsb3Qgb3JkZXIuICovCiAKLSAgICBpb2FkZHIgPSBwcm9iZWFkZHJzWzBdICYgfjM7IC8qIE1hc2sgdGhlIGJpdCB0aGF0IHNheXMgInRoaXMgaXMgYW4gaW8gYWRkciIgKi8KKyAgICBpb2FkZHIgPSBwY2ktPmlvYWRkcjsKKyAgICBuaWMtPmlycW5vICA9IDA7CisgICAgbmljLT5pb2FkZHIgPSBwY2ktPmlvYWRkciAmIH4zOwogCiAgICAgLyogY29tcHV0ZSBhbGwgdXNlZCBzdGF0aWMgZXBpYzEwMCByZWdpc3RlcnMgYWRkcmVzcyAqLwogICAgIGNvbW1hbmQgPSBpb2FkZHIgKyBDT01NQU5EOwkJLyogQ29udHJvbCBSZWdpc3RlciAqLwpAQCAtMTMwLDYgKzEyNCw3IEBACiAgICAgbW1jdGwgICA9IGlvYWRkciArIE1NQ1RMOwkJLyogTUlJIE1hbmFnZW1lbnQgSW50ZXJmYWNlIENvbnRyb2wgKi8KICAgICBtbWRhdGEgID0gaW9hZGRyICsgTU1EQVRBOwkJLyogTUlJIE1hbmFnZW1lbnQgSW50ZXJmYWNlIERhdGEgKi8KICAgICBsYW4wICAgID0gaW9hZGRyICsgTEFOMDsJCS8qIE1BQyBhZGRyZXNzLiAoMHg0MC0weDQ4KSAqLworICAgIG1jMCAgICAgPSBpb2FkZHIgKyBNQzA7IAkJLyogTXVsdGljYXN0IENvbnRyb2wgKi8KICAgICByeGNvbiAgID0gaW9hZGRyICsgUlhDT047CQkvKiBSZWNlaXZlIENvbnRyb2wgKi8KICAgICB0eGNvbiAgID0gaW9hZGRyICsgVFhDT047CQkvKiBUcmFuc21pdCBDb250cm9sICovCiAgICAgcHJjZGFyICA9IGlvYWRkciArIFBSQ0RBUjsJCS8qIFBDSSBSZWNlaXZlIEN1cnJlbnQgRGVzY3IgQWRkcmVzcyAqLwpAQCAtMTYwLDExICsxNTUsMTUgQEAKICAgICB9CiAKICNpZmRlZglERUJVR19FRVBST00KK3sKKyAgICB1bnNpZ25lZCBzaG9ydCBzdW0gPSAwOworICAgIHVuc2lnbmVkIHNob3J0IHZhbHVlOwogICAgIGZvciAoaSA9IDA7IGkgPCA2NDsgaSsrKSB7CiAJdmFsdWUgPSByZWFkX2VlcHJvbShpKTsKIAllZXByb21baV0gPSB2YWx1ZTsKIAlzdW0gKz0gdmFsdWU7CiAgICAgfQorfQogCiAjaWYJKEVQSUNfREVCVUcgPiAxKQogICAgIHByaW50ZigiRUVQUk9NIGNvbnRlbnRzXG4iKTsKQEAgLTIwMiwxNSArMjAxLDI2IEBACiAKICAgICBlcGljMTAwX29wZW4oKTsKIAotICAgIG5pYy0+cmVzZXQgICAgPSBlcGljMTAwX3Jlc2V0OworICAgIGRldi0+ZGlzYWJsZSAgPSBlcGljMTAwX2Rpc2FibGU7CiAgICAgbmljLT5wb2xsICAgICA9IGVwaWMxMDBfcG9sbDsKICAgICBuaWMtPnRyYW5zbWl0ID0gZXBpYzEwMF90cmFuc21pdDsKLSAgICBuaWMtPmRpc2FibGUgID0gZXBpYzEwMF9kaXNhYmxlOworICAgIG5pYy0+aXJxICAgICAgPSBlcGljMTAwX2lycTsKIAotICAgIHJldHVybiBuaWM7CisgICAgcmV0dXJuIDE7CiB9CiAKLSAgICBzdGF0aWMgdm9pZAorc3RhdGljIHZvaWQgc2V0X3J4X21vZGUodm9pZCkKK3sKKwl1bnNpZ25lZCBjaGFyIG1jX2ZpbHRlcls4XTsKKwlpbnQgaTsKKwltZW1zZXQobWNfZmlsdGVyLCAweGZmLCBzaXplb2YobWNfZmlsdGVyKSk7CisJb3V0bCgweDBDLCByeGNvbik7CisJZm9yKGkgPSAwOyBpIDwgNDsgaSsrKQorCQlvdXR3KCgodW5zaWduZWQgc2hvcnQgKiltY19maWx0ZXIpW2ldLCBtYzAgKyBpKjQpOworCXJldHVybjsKK30KKwkKKyAgIHN0YXRpYyB2b2lkCiBlcGljMTAwX29wZW4odm9pZCkKIHsKICAgICBpbnQgbWlpX3JlZzU7CkBAIC0yMzcsMTEgKzI0NywxMSBAQAogICAgIG91dGwodG1wLCB0eGNvbik7CiAKICAgICAvKiBHaXZlIGFkcmVzcyBvZiBSWCBhbmQgVFggcmluZyB0byB0aGUgY2hpcCAqLwotICAgIG91dGwodmlydF90b19idXMoJnJ4X3JpbmcpLCBwcmNkYXIpOwotICAgIG91dGwodmlydF90b19idXMoJnR4X3JpbmcpLCBwdGNkYXIpOworICAgIG91dGwodmlydF90b19sZTMyZGVzYygmcnhfcmluZyksIHByY2Rhcik7CisgICAgb3V0bCh2aXJ0X3RvX2xlMzJkZXNjKCZ0eF9yaW5nKSwgcHRjZGFyKTsKIAogICAgIC8qIFN0YXJ0IHRoZSBjaGlwJ3MgUnggcHJvY2VzczogcmVjZWl2ZSB1bmljYXN0IGFuZCBicm9hZGNhc3QgKi8KLSAgICBvdXRsKDB4MDQsIHJ4Y29uKTsKKyAgICBzZXRfcnhfbW9kZSgpOwogICAgIG91dGwoQ1JfU1RBUlRfUlggfCBDUl9RVUVVRV9SWCwgY29tbWFuZCk7CiAKICAgICBwdXRjaGFyKCdcbicpOwpAQCAtMjUyLDM0ICsyNjIsMzAgQEAKIGVwaWMxMDBfaW5pdF9yaW5nKHZvaWQpCiB7CiAgICAgaW50IGk7Ci0gICAgY2hhciogcDsKIAogICAgIGN1cl9yeCA9IGN1cl90eCA9IDA7CiAKLSAgICBwID0gJnJ4X3BhY2tldFswXTsKICAgICBmb3IgKGkgPSAwOyBpIDwgUlhfUklOR19TSVpFOyBpKyspIHsKLQlyeF9yaW5nW2ldLnN0YXR1cyAgICA9IFJSSU5HX09XTjsJLyogT3duZWQgYnkgRXBpYyBjaGlwICovCi0JcnhfcmluZ1tpXS5idWZsZW5ndGggPSBQS1RfQlVGX1NaOwotCXJ4X3JpbmdbaV0uYnVmYWRkciAgID0gdmlydF90b19idXMocCArIChQS1RfQlVGX1NaICogaSkpOwotCXJ4X3JpbmdbaV0uY29udHJvbCAgID0gMDsKLQlyeF9yaW5nW2ldLm5leHQgICAgICA9IHZpcnRfdG9fYnVzKCYocnhfcmluZ1tpICsgMV0pICk7CisJcnhfcmluZ1tpXS5zdGF0dXMgICAgPSBjcHVfdG9fbGUzMihSUklOR19PV04pOwkvKiBPd25lZCBieSBFcGljIGNoaXAgKi8KKwlyeF9yaW5nW2ldLmJ1Zmxlbmd0aCA9IGNwdV90b19sZTMyKFBLVF9CVUZfU1opOworCXJ4X3JpbmdbaV0uYnVmYWRkciAgID0gdmlydF90b19idXMoJnJ4X3BhY2tldFtpICogUEtUX0JVRl9TWl0pOworCXJ4X3JpbmdbaV0ubmV4dCAgICAgID0gdmlydF90b19sZTMyZGVzYygmcnhfcmluZ1tpICsgMV0pIDsKICAgICB9CiAgICAgLyogTWFyayB0aGUgbGFzdCBlbnRyeSBhcyB3cmFwcGluZyB0aGUgcmluZy4gKi8KLSAgICByeF9yaW5nW2ktMV0ubmV4dCA9IHZpcnRfdG9fYnVzKCZyeF9yaW5nWzBdKTsKKyAgICByeF9yaW5nW2ktMV0ubmV4dCA9IHZpcnRfdG9fbGUzMmRlc2MoJnJ4X3JpbmdbMF0pOwogCiAgICAgLyoKICAgICAgKlRoZSBUeCBidWZmZXIgZGVzY3JpcHRvciBpcyBmaWxsZWQgaW4gYXMgbmVlZGVkLAogICAgICAqIGJ1dCB3ZSBkbyBuZWVkIHRvIGNsZWFyIHRoZSBvd25lcnNoaXAgYml0LgogICAgICAqLwotICAgIHAgPSAmdHhfcGFja2V0WzBdOwogCiAgICAgZm9yIChpID0gMDsgaSA8IFRYX1JJTkdfU0laRTsgaSsrKSB7Ci0JdHhfcmluZ1tpXS5zdGF0dXMgID0gMDsJCQkvKiBPd25lZCBieSBDUFUgKi8KLQl0eF9yaW5nW2ldLmJ1ZmFkZHIgPSB2aXJ0X3RvX2J1cyhwICsgKFBLVF9CVUZfU1ogKiBpKSk7Ci0JdHhfcmluZ1tpXS5jb250cm9sID0gVERfU1RERkxBR1M7Ci0JdHhfcmluZ1tpXS5uZXh0ICAgID0gdmlydF90b19idXMoJih0eF9yaW5nW2kgKyAxXSkgKTsKKwl0eF9yaW5nW2ldLnN0YXR1cyAgPSAweDAwMDA7CQkJLyogT3duZWQgYnkgQ1BVICovCisgICAgCXR4X3JpbmdbaV0uYnVmbGVuZ3RoID0gMHgwMDAwIHwgY3B1X3RvX2xlMzIoVERfU1RERkxBR1MgPDwgMTYpOworCXR4X3JpbmdbaV0uYnVmYWRkciA9IHZpcnRfdG9fYnVzKCZ0eF9wYWNrZXRbaSAqIFBLVF9CVUZfU1pdKTsKKwl0eF9yaW5nW2ldLm5leHQgICAgPSB2aXJ0X3RvX2xlMzJkZXNjKCZ0eF9yaW5nW2kgKyAxXSk7CiAgICAgfQotICAgIHR4X3JpbmdbaS0xXS5uZXh0ID0gdmlydF90b19idXMoJnR4X3JpbmdbMF0pOworCXR4X3JpbmdbaS0xXS5uZXh0ICAgID0gdmlydF90b19sZTMyZGVzYygmdHhfcmluZ1swXSk7CiB9CiAKIC8qIGZ1bmN0aW9uOiBlcGljMTAwX3RyYW5zbWl0CkBAIC0yOTYsNyArMzAyLDcgQEAKIAkJIHVuc2lnbmVkIGludCBsZW4sIGNvbnN0IGNoYXIgKmRhdGEpCiB7CiAgICAgdW5zaWduZWQgc2hvcnQgbnN0eXBlOwotICAgIGNoYXIqIHR4cDsKKyAgICB1bnNpZ25lZCBjaGFyICp0eHA7CiAgICAgaW50IGVudHJ5OwogCiAgICAgLyogQ2FsY3VsYXRlIHRoZSBuZXh0IFR4IGRlc2NyaXB0b3IgZW50cnkuICovCkBAIC0zMTAsNyArMzE2LDcgQEAKIAlyZXR1cm47CiAgICAgfQogCi0gICAgdHhwID0gKGNoYXIqKXR4X3JpbmdbZW50cnldLmJ1ZmFkZHI7CisgICAgdHhwID0gdHhfcGFja2V0ICsgKGVudHJ5ICogUEtUX0JVRl9TWik7CiAKICAgICBtZW1jcHkodHhwLCBkZXN0YWRkciwgRVRIX0FMRU4pOwogICAgIG1lbWNweSh0eHAgKyBFVEhfQUxFTiwgbmljLT5ub2RlX2FkZHIsIEVUSF9BTEVOKTsKQEAgLTMxOSwyNiArMzI1LDI5IEBACiAgICAgbWVtY3B5KHR4cCArIEVUSF9ITEVOLCBkYXRhLCBsZW4pOwogCiAgICAgbGVuICs9IEVUSF9ITEVOOwotCisJbGVuICY9IDB4MEZGRjsKKwl3aGlsZShsZW4gPCBFVEhfWkxFTikKKwkJdHhwW2xlbisrXSA9ICdcMCc7CiAgICAgLyoKICAgICAgKiBDYXV0aW9uOiB0aGUgd3JpdGUgb3JkZXIgaXMgaW1wb3J0YW50IGhlcmUsCiAgICAgICogc2V0IHRoZSBiYXNlIGFkZHJlc3Mgd2l0aCB0aGUgIm93bmVyc2hpcCIKICAgICAgKiBiaXRzIGxhc3QuCiAgICAgICovCi0gICAgdHhfcmluZ1tlbnRyeV0udHhsZW5ndGggID0gKGxlbiA+PSA2MCA/IGxlbiA6IDYwKTsKLSAgICB0eF9yaW5nW2VudHJ5XS5idWZsZW5ndGggPSBsZW47Ci0gICAgdHhfcmluZ1tlbnRyeV0uc3RhdHVzICAgID0gVFJJTkdfT1dOOwkvKiBQYXNzIG93bmVyc2hpcCB0byB0aGUgY2hpcC4gKi8KKyAgICAKKyAgICB0eF9yaW5nW2VudHJ5XS5idWZsZW5ndGggfD0gY3B1X3RvX2xlMzIobGVuKTsKKyAgICB0eF9yaW5nW2VudHJ5XS5zdGF0dXMgPSBjcHVfdG9fbGUzMihsZW4gPDwgMTYpIHwgCisJICAgIGNwdV90b19sZTMyKFRSSU5HX09XTik7CS8qIFBhc3Mgb3duZXJzaGlwIHRvIHRoZSBjaGlwLiAqLwogCiAgICAgY3VyX3R4Kys7CiAKICAgICAvKiBUcmlnZ2VyIGFuIGltbWVkaWF0ZSB0cmFuc21pdCBkZW1hbmQuICovCi0gICAgb3V0bChDUl9RVUVVRV9UWCwgY29tbWFuZCk7Ci0KKyAgICBvdXRsKENSX1FVRVVFX1RYLCBjb21tYW5kKTsgCisgICAgCiAgICAgbG9hZF90aW1lcjIoMTAqVElDS1NfUEVSX01TKTsgICAgICAgICAvKiB0aW1lb3V0IDEwIG1zIGZvciB0cmFuc21pdCAqLwotICAgIHdoaWxlICgodHhfcmluZ1tlbnRyeV0uc3RhdHVzICYgVFJJTkdfT1dOKSAmJiB0aW1lcjJfcnVubmluZygpKQorICAgIHdoaWxlICgobGUzMl90b19jcHUodHhfcmluZ1tlbnRyeV0uc3RhdHVzKSAmIChUUklOR19PV04pKSAmJiB0aW1lcjJfcnVubmluZygpKQogCS8qIFdhaXQgKi87CiAKLSAgICBpZiAoKHR4X3JpbmdbZW50cnldLnN0YXR1cyAmIFRSSU5HX09XTikgIT0gMCkKKyAgICBpZiAoKGxlMzJfdG9fY3B1KHR4X3JpbmdbZW50cnldLnN0YXR1cykgJiBUUklOR19PV04pICE9IDApCiAJcHJpbnRmKCJPb3BzLCB0cmFuc21pdHRlciB0aW1lb3V0LCBzdGF0dXM9JWhYXG4iLAogCSAgICB0eF9yaW5nW2VudHJ5XS5zdGF0dXMpOwogfQpAQCAtMzU2LDE3ICszNjUsMTkgQEAKICAqLwogCiAgICAgc3RhdGljIGludAotZXBpYzEwMF9wb2xsKHN0cnVjdCBuaWMgKm5pYykKK2VwaWMxMDBfcG9sbChzdHJ1Y3QgbmljICpuaWMsIGludCByZXRyaWV2ZSkKIHsKICAgICBpbnQgZW50cnk7Ci0gICAgaW50IHN0YXR1czsKICAgICBpbnQgcmV0Y29kZTsKLQorICAgIGludCBzdGF0dXM7CiAgICAgZW50cnkgPSBjdXJfcnggJSBSWF9SSU5HX1NJWkU7CiAKLSAgICBpZiAoKHN0YXR1cyA9IHJ4X3JpbmdbZW50cnldLnN0YXR1cyAmIFJSSU5HX09XTikgPT0gUlJJTkdfT1dOKQorICAgIGlmICgocnhfcmluZ1tlbnRyeV0uc3RhdHVzICYgY3B1X3RvX2xlMzIoUlJJTkdfT1dOKSkgPT0gUlJJTkdfT1dOKQogCXJldHVybiAoMCk7CiAKKyAgICBpZiAoICEgcmV0cmlldmUgKSByZXR1cm4gMTsKKworICAgIHN0YXR1cyA9IGxlMzJfdG9fY3B1KHJ4X3JpbmdbZW50cnldLnN0YXR1cyk7CiAgICAgLyogV2Ugb3duIHRoZSBuZXh0IGVudHJ5LCBpdCdzIGEgbmV3IHBhY2tldC4gU2VuZCBpdCB1cC4gKi8KIAogI2lmCShFUElDX0RFQlVHID4gNCkKQEAgLTM4Myw4ICszOTQsOCBAQAogCXJldGNvZGUgPSAwOwogICAgIH0gZWxzZSB7CiAJLyogT21pdCB0aGUgZm91ciBvY3RldCBDUkMgZnJvbSB0aGUgbGVuZ3RoLiAqLwotCW5pYy0+cGFja2V0bGVuID0gcnhfcmluZ1tlbnRyeV0ucnhsZW5ndGggLSA0OwotCW1lbWNweShuaWMtPnBhY2tldCwgKGNoYXIqKXJ4X3JpbmdbZW50cnldLmJ1ZmFkZHIsIG5pYy0+cGFja2V0bGVuKTsKKwluaWMtPnBhY2tldGxlbiA9IGxlMzJfdG9fY3B1KChyeF9yaW5nW2VudHJ5XS5idWZsZW5ndGgpKS0gNDsKKwltZW1jcHkobmljLT5wYWNrZXQsICZyeF9wYWNrZXRbZW50cnkgKiBQS1RfQlVGX1NaXSwgbmljLT5wYWNrZXRsZW4pOwogCXJldGNvZGUgPSAxOwogICAgIH0KIApAQCAtMzk1LDE3ICs0MDYsMzAgQEAKICAgICByeF9yaW5nW2VudHJ5XS5zdGF0dXMgPSBSUklOR19PV047CiAKICAgICAvKiBSZXN0YXJ0IFJlY2VpdmVyICovCi0gICAgb3V0bChDUl9TVEFSVF9SWCB8IENSX1FVRVVFX1JYLCBjb21tYW5kKTsKKyAgICBvdXRsKENSX1NUQVJUX1JYIHwgQ1JfUVVFVUVfUlgsIGNvbW1hbmQpOyAKIAogICAgIHJldHVybiByZXRjb2RlOwogfQogCiAKICAgICBzdGF0aWMgdm9pZAotZXBpYzEwMF9kaXNhYmxlKHN0cnVjdCBuaWMgKm5pYykKK2VwaWMxMDBfZGlzYWJsZShzdHJ1Y3QgZGV2ICpkZXYgX191bnVzZWQpCiB7CisJLyogU29mdCByZXNldCB0aGUgY2hpcC4gKi8KKwlvdXRsKEdDX1NPRlRfUkVTRVQsIGdlbmN0bCk7CiB9CiAKK3N0YXRpYyB2b2lkIGVwaWMxMDBfaXJxKHN0cnVjdCBuaWMgKm5pYyBfX3VudXNlZCwgaXJxX2FjdGlvbl90IGFjdGlvbiBfX3VudXNlZCkKK3sKKyAgc3dpdGNoICggYWN0aW9uICkgeworICBjYXNlIERJU0FCTEUgOgorICAgIGJyZWFrOworICBjYXNlIEVOQUJMRSA6CisgICAgYnJlYWs7CisgIGNhc2UgRk9SQ0UgOgorICAgIGJyZWFrOworICB9Cit9CiAKICNpZmRlZglERUJVR19FRVBST00KIC8qIFNlcmlhbCBFRVBST00gc2VjdGlvbi4gKi8KQEAgLTQ3OSwzICs1MDMsMTggQEAKIAkgICAgYnJlYWs7CiAgICAgcmV0dXJuIGludyhtbWRhdGEpOwogfQorCisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2lkIGVwaWMxMDBfbmljc1tdID0geworUENJX1JPTSgweDEwYjgsIDB4MDAwNSwgImVwaWMxMDAiLCAgICAiU01DIEV0aGVyUG93ZXJJSSIpLAkJLyogU01DIDgzYzE3MCBFUElDLzEwMCAqLworUENJX1JPTSgweDEwYjgsIDB4MDAwNiwgInNtYy04M2MxNzUiLCAiU01DIEVQSUMvQyA4M2MxNzUiKSwKK307CisKK3N0cnVjdCBwY2lfZHJpdmVyIGVwaWMxMDBfZHJpdmVyID0geworCS50eXBlICAgICA9IE5JQ19EUklWRVIsCisJLm5hbWUgICAgID0gIkVQSUMxMDAiLAorCS5wcm9iZSAgICA9IGVwaWMxMDBfcHJvYmUsCisJLmlkcyAgICAgID0gZXBpYzEwMF9uaWNzLAorCS5pZF9jb3VudCA9IHNpemVvZihlcGljMTAwX25pY3MpL3NpemVvZihlcGljMTAwX25pY3NbMF0pLAorCS5jbGFzcyAgICA9IDAsCit9OwpkaWZmIC1OYXVyIGdydWItMC45Ny5vcmlnL25ldGJvb3QvZXRoZXJib290LmggZ3J1Yi0wLjk3L25ldGJvb3QvZXRoZXJib290LmgKLS0tIGdydWItMC45Ny5vcmlnL25ldGJvb3QvZXRoZXJib290LmgJMjAwMy0wNy0wOSAxMTo0NTozNy4wMDAwMDAwMDAgKzAwMDAKKysrIGdydWItMC45Ny9uZXRib290L2V0aGVyYm9vdC5oCTIwMDUtMDgtMzEgMTk6MDM6MzUuMDAwMDAwMDAwICswMDAwCkBAIC0xLDYgKzEsNiBAQAogLyoKICAqICBHUlVCICAtLSAgR1JhbmQgVW5pZmllZCBCb290bG9hZGVyCi0gKiAgQ29weXJpZ2h0IChDKSAyMDAwLDIwMDEsMjAwMiAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgKiAgQ29weXJpZ2h0IChDKSAxOTk5LDIwMDAsMjAwMSwyMDAyLDIwMDMsMjAwNCAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCiAgKgogICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKQEAgLTE3LDUzMSArMTcsNDUgQEAKICAqICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KICAqLwogCi0vKiBSVUxFOiBZb3UgbXVzdCBkZWZpbmUgdGhlIG1hY3JvIGBgR1JVQicnIHdoZW4gaW5jbHVkaW5nIHRoaXMgaGVhZGVyCi0gICBmaWxlIGluIEdSVUIgY29kZS4gICovCi0KLS8qIEJhc2VkIG9uICJzcmMvZXRoZXJib290LmgiIGluIGV0aGVyYm9vdC01LjAuNS4gICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotRVRIRVJCT09UIC0gIEJPT1RQL1RGVFAgQm9vdHN0cmFwIFByb2dyYW0KLQotQXV0aG9yOiBNYXJ0aW4gUmVudGVycwotICBEYXRlOiBEZWMvOTMKLQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qIEluY2x1ZGUgR1JVQi1zcGVjaWZpYyBtYWNyb3MgYW5kIHByb3RvdHlwZXMgaGVyZS4gICovCi0jaW5jbHVkZSA8c2hhcmVkLmg+Ci0KLS8qIEZJWE1FOiBGb3Igbm93LCBlbmFibGUgdGhlIERIQ1Agc3VwcG9ydC4gUGVyaGFwcyBJIHNob3VsZCBzZWdyZWdhdGUKLSAgIHRoZSBESENQIHN1cHBvcnQgZnJvbSB0aGUgQk9PVFAgc3VwcG9ydCwgYW5kIHBlcm1pdCBib3RoIHRvCi0gICBjby1leGlzdC4gICovCi0jdW5kZWYgTk9fREhDUF9TVVBQT1JUCi0KLS8qIEluIEdSVUIsIHRoZSByZWxvY2F0ZWQgYWRkcmVzcyBpbiBFdGhlcmJvb3QgZG9lc24ndCBoYXZlIGFueSBzZW5zZS4KLSAgIEp1c3QgZGVmaW5lIGl0IGFzIGEgYm9ndXMgdmFsdWUuICAqLwotI2RlZmluZSBSRUxPQwkwCi0KLS8qIEZJWE1FOiBTaG91bGQgYmUgYW4gb3B0aW9uLiAgKi8KLSNkZWZpbmUgQkFDS09GRl9MSU1JVAk3Ci0KLSNpbmNsdWRlIDxvc2RlcC5oPgotCi0jZGVmaW5lIENUUkxfQwkJMwotCi0jaWZuZGVmCU1BWF9URlRQX1JFVFJJRVMKLSMgZGVmaW5lIE1BWF9URlRQX1JFVFJJRVMJMjAKLSNlbmRpZgotCi0jaWZuZGVmCU1BWF9CT09UUF9SRVRSSUVTCi0jIGRlZmluZSBNQVhfQk9PVFBfUkVUUklFUwkyMAotI2VuZGlmCi0KLSNkZWZpbmUgTUFYX0JPT1RQX0VYVExFTgkoRVRIX0ZSQU1FX0xFTiAtIEVUSF9ITEVOIC0gXAotCQkJCSBzaXplb2YgKHN0cnVjdCBib290cF90KSkKKy8qIAorICogVHJhbnNwb3J0IGxheWVyIHRvIHVzZSBFdGhlcmJvb3QgTklDIGRyaXZlcnMgaW4gR1JVQi4KKyAqLwogCi0jaWZuZGVmCU1BWF9BUlBfUkVUUklFUwotIyBkZWZpbmUgTUFYX0FSUF9SRVRSSUVTCTIwCi0jZW5kaWYKKyNpZm5kZWYgRVRIRVJCT09UX0gKKyNkZWZpbmUgRVRIRVJCT09UX0gKIAotI2lmbmRlZglNQVhfUlBDX1JFVFJJRVMKLSMgZGVmaW5lIE1BWF9SUENfUkVUUklFUwkyMAorI2luY2x1ZGUgInNoYXJlZC5oIgorI2luY2x1ZGUgIm9zZGVwLmgiCisjaW5jbHVkZSAiaWZfZXRoZXIuaCIKKyNpbmNsdWRlICJpbi5oIgorCisvKiBMaW5rIGNvbmZpZ3VyYXRpb24gdGltZSBpbiB0ZW50aHMgb2YgYSBzZWNvbmQgKi8KKyNpZm5kZWYgVkFMSURfTElOS19USU1FT1VUCisjZGVmaW5lIFZBTElEX0xJTktfVElNRU9VVAkxMDAgLyogMTAuMCBzZWNvbmRzICovCiAjZW5kaWYKIAotI2RlZmluZQlUSUNLU19QRVJfU0VDCQkxOAotCi0vKiBJbnRlci1wYWNrZXQgcmV0cnkgaW4gdGlja3MgKi8KLSNkZWZpbmUgVElNRU9VVAkJCSgxMCAqIFRJQ0tTX1BFUl9TRUMpCi0KLS8qIFRoZXNlIHNldHRpbmdzIGhhdmUgc2Vuc2Ugb25seSBpZiBjb21waWxlZCB3aXRoIC1EQ09OR0VTVEVEICovCi0vKiB0b3RhbCByZXRyYW5zbWlzc2lvbiB0aW1lb3V0IGluIHRpY2tzICovCi0jZGVmaW5lIFRGVFBfVElNRU9VVAkJKDMwICogVElDS1NfUEVSX1NFQykKLS8qIHBhY2tldCByZXRyYW5zbWlzc2lvbiB0aW1lb3V0IGluIHRpY2tzICovCi0jZGVmaW5lIFRGVFBfUkVYTVQJCSgzICogVElDS1NfUEVSX1NFQykKLQogI2lmbmRlZglOVUxMCi0jIGRlZmluZSBOVUxMCQkJKCh2b2lkICopIDApCisjZGVmaW5lIE5VTEwJKCh2b2lkICopMCkKICNlbmRpZgogCi0vKgotICAgSSdtIG1vdmluZyB0b3dhcmRzIHRoZSBkZWZpbmVkIG5hbWVzIGluIGxpbnV4L2lmX2V0aGVyLmggZm9yIGNsYXJpdHkuCi0gICBUaGUgY29uZnVzaW9uIGJldHdlZW4gNjAvNjQgYW5kIDE1MTQvMTUxOCBhcm9zZSBiZWNhdXNlIHRoZSBOUzgzOTAKLSAgIGNvdW50cyB0aGUgNCBieXRlIGZyYW1lIGNoZWNrc3VtIGluIHRoZSBpbmNvbWluZyBwYWNrZXQsIGJ1dCBub3QKLSAgIGluIHRoZSBvdXRnb2luZyBwYWNrZXQuIDYwLzE1MTQgYXJlIHRoZSBjb3JyZWN0IG51bWJlcnMgZm9yIG1vc3QKLSAgIGlmIG5vdCBhbGwgb2YgdGhlIG90aGVyIE5JQyBjb250cm9sbGVycy4gSSB3aWxsIGJlIHJldGlyaW5nIHRoZQotICAgNjQvMTUxOCBkZWZpbmVzIGluIHRoZSBsZWFkLXVwIHRvIDUuMC4KLSovCi0KLSNkZWZpbmUgRVRIX0FMRU4JCTYJLyogU2l6ZSBvZiBFdGhlcm5ldCBhZGRyZXNzICovCi0jZGVmaW5lIEVUSF9ITEVOCQkxNAkvKiBTaXplIG9mIGV0aGVybmV0IGhlYWRlciAqLwotI2RlZmluZQlFVEhfWkxFTgkJNjAJLyogTWluaW11bSBwYWNrZXQgKi8KLS8qI2RlZmluZSBFVEhfTUlOX1BBQ0tFVAkJNjQqLwotI2RlZmluZQlFVEhfRlJBTUVfTEVOCQkxNTE0CS8qIE1heGltdW0gcGFja2V0ICovCi0vKiNkZWZpbmUgRVRIX01BWF9QQUNLRVQJCTE1MTgqLwotLyogQmVjYXVzZSBzb21lIERIQ1AvQk9PVFAgc2VydmVycyBkb24ndCB0cmVhdCB0aGUgbWF4aW11bSBsZW5ndGggdGhlIHNhbWUKLSAgIGFzIEV0aGVyYm9vdCwgc3VidHJhY3QgdGhlIHNpemUgb2YgYW4gSVAgaGVhZGVyIGFuZCB0aGF0IG9mIGFuIFVEUAotICAgaGVhZGVyLiAgKi8KLSNkZWZpbmUJRVRIX01BWF9NVFUJCShFVEhfRlJBTUVfTEVOIC0gRVRIX0hMRU4gXAotCQkJCS0gc2l6ZW9mIChzdHJ1Y3QgaXBoZHIpIFwKLQkJCQktIHNpemVvZiAoc3RydWN0IHVkcGhkcikpCi0KLSNkZWZpbmUgQVJQX0NMSUVOVAkwCi0jZGVmaW5lIEFSUF9TRVJWRVIJMQotI2RlZmluZSBBUlBfR0FURVdBWQkyCi0jZGVmaW5lIEFSUF9ST09UU0VSVkVSCTMKLSNkZWZpbmUgQVJQX1NXQVBTRVJWRVIJNAotI2RlZmluZSBNQVhfQVJQCQlBUlBfU1dBUFNFUlZFUisxCi0KLSNkZWZpbmUJUkFSUF9SRVFVRVNUCTMKLSNkZWZpbmUJUkFSUF9SRVBMWQk0Ci0KLSNkZWZpbmUgSVAJCTB4MDgwMAotI2RlZmluZSBBUlAJCTB4MDgwNgotI2RlZmluZQlSQVJQCQkweDgwMzUKLQotI2RlZmluZSBCT09UUF9TRVJWRVIJNjcKLSNkZWZpbmUgQk9PVFBfQ0xJRU5UCTY4Ci0jZGVmaW5lIFRGVFBfUE9SVAk2OQotI2RlZmluZSBTVU5SUENfUE9SVAkxMTEKLQotI2RlZmluZSBJUF9VRFAJCTE3Ci0vKiBTYW1lIGFmdGVyIGdvaW5nIHRocm91Z2ggaHRvbmwgKi8KLSNkZWZpbmUgSVBfQlJPQURDQVNUCTB4RkZGRkZGRkYKLQotI2RlZmluZSBBUlBfUkVRVUVTVAkxCi0jZGVmaW5lIEFSUF9SRVBMWQkyCi0KLSNkZWZpbmUgQk9PVFBfUkVRVUVTVAkxCi0jZGVmaW5lIEJPT1RQX1JFUExZCTIKLQotI2RlZmluZSBUQUdfTEVOKHApCQkoKigocCkgKyAxKSkKLSNkZWZpbmUgUkZDMTUzM19DT09LSUUJCTk5LCAxMzAsIDgzLCA5OQotI2RlZmluZSBSRkMxNTMzX1BBRAkJMAotI2RlZmluZSBSRkMxNTMzX05FVE1BU0sJCTEKLSNkZWZpbmUgUkZDMTUzM19USU1FT0ZGU0VUCTIKLSNkZWZpbmUgUkZDMTUzM19HQVRFV0FZCQkzCi0jZGVmaW5lIFJGQzE1MzNfVElNRVNFUlZFUgk0Ci0jZGVmaW5lIFJGQzE1MzNfSUVOMTE2TlMJNQotI2RlZmluZSBSRkMxNTMzX0ROUwkJNgotI2RlZmluZSBSRkMxNTMzX0xPR1NFUlZFUgk3Ci0jZGVmaW5lIFJGQzE1MzNfQ09PS0lFU0VSVkVSCTgKLSNkZWZpbmUgUkZDMTUzM19MUFJTRVJWRVIJOQotI2RlZmluZSBSRkMxNTMzX0lNUFJFU1NTRVJWRVIJMTAKLSNkZWZpbmUgUkZDMTUzM19SRVNPVVJDRVNFUlZFUgkxMQotI2RlZmluZSBSRkMxNTMzX0hPU1ROQU1FCTEyCi0jZGVmaW5lIFJGQzE1MzNfQk9PVEZJTEVTSVpFCTEzCi0jZGVmaW5lIFJGQzE1MzNfTUVSSVREVU1QRklMRQkxNAotI2RlZmluZSBSRkMxNTMzX0RPTUFJTk5BTUUJMTUKLSNkZWZpbmUgUkZDMTUzM19TV0FQU0VSVkVSCTE2Ci0jZGVmaW5lIFJGQzE1MzNfUk9PVFBBVEgJMTcKLSNkZWZpbmUgUkZDMTUzM19FWFRFTlNJT05QQVRICTE4Ci0jZGVmaW5lIFJGQzE1MzNfSVBGT1JXQVJESU5HCTE5Ci0jZGVmaW5lIFJGQzE1MzNfSVBTT1VSQ0VST1VUSU5HCTIwCi0jZGVmaW5lIFJGQzE1MzNfSVBQT0xJQ1lGSUxURVIJMjEKLSNkZWZpbmUgUkZDMTUzM19JUE1BWFJFQVNTRU1CTFkJMjIKLSNkZWZpbmUgUkZDMTUzM19JUFRUTAkJMjMKLSNkZWZpbmUgUkZDMTUzM19JUE1UVQkJMjQKLSNkZWZpbmUgUkZDMTUzM19JUE1UVVBMQVRFQVUJMjUKLSNkZWZpbmUgUkZDMTUzM19JTlRNVFUJCTI2Ci0jZGVmaW5lIFJGQzE1MzNfSU5UTE9DQUxTVUJORVRTCTI3Ci0jZGVmaW5lIFJGQzE1MzNfSU5UQlJPQURDQVNUCTI4Ci0jZGVmaW5lIFJGQzE1MzNfSU5USUNNUERJU0NPVkVSCTI5Ci0jZGVmaW5lIFJGQzE1MzNfSU5USUNNUFJFU1BPTkQJMzAKLSNkZWZpbmUgUkZDMTUzM19JTlRST1VURURJU0NPVkVSIDMxCi0jZGVmaW5lIFJGQzE1MzNfSU5UUk9VVEVTT0xJQ0lUCTMyCi0jZGVmaW5lIFJGQzE1MzNfSU5UU1RBVElDUk9VVEVTCTMzCi0jZGVmaW5lIFJGQzE1MzNfTExUUkFJTEVSRU5DQVAJMzQKLSNkZWZpbmUgUkZDMTUzM19MTEFSUENBQ0hFVE1PCTM1Ci0jZGVmaW5lIFJGQzE1MzNfTExFVEhFUk5FVEVOQ0FQCTM2Ci0jZGVmaW5lIFJGQzE1MzNfVENQVFRMCQkzNwotI2RlZmluZSBSRkMxNTMzX1RDUEtFRVBBTElWRVRNTwkzOAotI2RlZmluZSBSRkMxNTMzX1RDUEtFRVBBTElWRUdCCTM5Ci0jZGVmaW5lIFJGQzE1MzNfTklTRE9NQUlOCTQwCi0jZGVmaW5lIFJGQzE1MzNfTklTU0VSVkVSCTQxCi0jZGVmaW5lIFJGQzE1MzNfTlRQU0VSVkVSCTQyCi0jZGVmaW5lIFJGQzE1MzNfVkVORE9SCQk0MwotI2RlZmluZSBSRkMxNTMzX05CTlMJCTQ0Ci0jZGVmaW5lIFJGQzE1MzNfTkJERAkJNDUKLSNkZWZpbmUgUkZDMTUzM19OQk5UCQk0NgotI2RlZmluZSBSRkMxNTMzX05CU0NPUEUJCTQ3Ci0jZGVmaW5lIFJGQzE1MzNfWEZTCQk0OAotI2RlZmluZSBSRkMxNTMzX1hETQkJNDkKLSNpZm5kZWYJTk9fREhDUF9TVVBQT1JUCi0jZGVmaW5lIFJGQzIxMzJfUkVRX0FERFIJNTAKLSNkZWZpbmUgUkZDMjEzMl9NU0dfVFlQRQk1MwotI2RlZmluZSBSRkMyMTMyX1NSVl9JRAkJNTQKLSNkZWZpbmUgUkZDMjEzMl9QQVJBTV9MSVNUCTU1Ci0jZGVmaW5lIFJGQzIxMzJfTUFYX1NJWkUJNTcKLSNkZWZpbmUgUkZDMjEzMl9WRU5ET1JfQ0xBU1NfSUQJNjAKLQotI2RlZmluZSBESENQRElTQ09WRVIJCTEKLSNkZWZpbmUgREhDUE9GRkVSCQkyCi0jZGVmaW5lIERIQ1BSRVFVRVNUCQkzCi0jZGVmaW5lIERIQ1BBQ0sJCQk1Ci0jZW5kaWYJLyogTk9fREhDUF9TVVBQT1JUICovCi0KLSNkZWZpbmUgUkZDMTUzM19WRU5ET1JfTUFKT1IJMAotI2RlZmluZSBSRkMxNTMzX1ZFTkRPUl9NSU5PUgkwCi0KLSNkZWZpbmUgUkZDMTUzM19WRU5ET1JfTUFHSUMJMTI4Ci0jZGVmaW5lIFJGQzE1MzNfVkVORE9SX0FERFBBUk0JMTI5Ci0jZGVmaW5lIFJGQzE1MzNfVkVORE9SX01OVU9QVFMJMTYwCi0jZGVmaW5lIFJGQzE1MzNfVkVORE9SX1NFTEVDVElPTiAxNzYKLSNkZWZpbmUgUkZDMTUzM19WRU5ET1JfTU9URAkxODQKLSNkZWZpbmUgUkZDMTUzM19WRU5ET1JfTlVNT0ZNT1REIDgKLSNkZWZpbmUgUkZDMTUzM19WRU5ET1JfSU1HCTE5MgotI2RlZmluZSBSRkMxNTMzX1ZFTkRPUl9OVU1PRklNRwkxNgotCi0jZGVmaW5lIFJGQzE1MzNfVkVORE9SX0NPTkZJR0ZJTEUJMTUwCi0KLSNkZWZpbmUgUkZDMTUzM19FTkQJCTI1NQotCi0jZGVmaW5lIEJPT1RQX1ZFTkRPUl9MRU4JNjQKLSNpZm5kZWYJTk9fREhDUF9TVVBQT1JUCi0jZGVmaW5lIERIQ1BfT1BUX0xFTgkJMzEyCi0jZW5kaWYJLyogTk9fREhDUF9TVVBQT1JUICovCi0KLSNkZWZpbmUJVEZUUF9ERUZBVUxUU0laRV9QQUNLRVQJNTEyCi0jZGVmaW5lCVRGVFBfTUFYX1BBQ0tFVAkJMTQzMiAvKiA1MTIgKi8KLQotI2RlZmluZSBURlRQX1JSUQkxCi0jZGVmaW5lIFRGVFBfV1JRCTIKLSNkZWZpbmUgVEZUUF9EQVRBCTMKLSNkZWZpbmUgVEZUUF9BQ0sJNAotI2RlZmluZSBURlRQX0VSUk9SCTUKLSNkZWZpbmUgVEZUUF9PQUNLCTYKLQotI2RlZmluZSBURlRQX0NPREVfRU9GCTEKLSNkZWZpbmUgVEZUUF9DT0RFX01PUkUJMgotI2RlZmluZSBURlRQX0NPREVfRVJST1IJMwotI2RlZmluZSBURlRQX0NPREVfQk9PVAk0Ci0jZGVmaW5lIFRGVFBfQ09ERV9DRkcJNQotCi0jZGVmaW5lIEFXQUlUX0FSUAkwCi0jZGVmaW5lIEFXQUlUX0JPT1RQCTEKLSNkZWZpbmUgQVdBSVRfVEZUUAkyCi0jZGVmaW5lIEFXQUlUX1JBUlAJMwotI2RlZmluZSBBV0FJVF9SUEMJNAotI2RlZmluZSBBV0FJVF9RRFJBSU4JNQkvKiBkcmFpbiBxdWV1ZSwgcHJvY2VzcyBBUlAgcmVxdWVzdHMgKi8KLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgdW5zaWduZWQgbG9uZwlzX2FkZHI7Ci19Ci1pbl9hZGRyOwotCi1zdHJ1Y3QgYXJwdGFibGVfdAotewotICBpbl9hZGRyIGlwYWRkcjsKLSAgdW5zaWduZWQgY2hhciBub2RlWzZdOwotfTsKLQotLyoKLSAqIEEgcGl0eSBzaXBhZGRyIGFuZCB0aXBhZGRyIGFyZSBub3QgbG9uZ3dvcmQgYWxpZ25lZCBvciB3ZSBjb3VsZCB1c2UKLSAqIGluX2FkZHIuIE5vLCBJIGRvbid0IHdhbnQgdG8gdXNlICNwcmFnbWEgcGFja2VkLgotICovCi1zdHJ1Y3QgYXJwcmVxdWVzdAotewotICB1bnNpZ25lZCBzaG9ydCBod3R5cGU7Ci0gIHVuc2lnbmVkIHNob3J0IHByb3RvY29sOwotICBjaGFyIGh3bGVuOwotICBjaGFyIHByb3RvbGVuOwotICB1bnNpZ25lZCBzaG9ydCBvcGNvZGU7Ci0gIGNoYXIgc2h3YWRkcls2XTsKLSAgY2hhciBzaXBhZGRyWzRdOwotICBjaGFyIHRod2FkZHJbNl07Ci0gIGNoYXIgdGlwYWRkcls0XTsKLX07Ci0KLXN0cnVjdCBpcGhkcgotewotICBjaGFyIHZlcmhkcmxlbjsKLSAgY2hhciBzZXJ2aWNlOwotICB1bnNpZ25lZCBzaG9ydCBsZW47Ci0gIHVuc2lnbmVkIHNob3J0IGlkZW50OwotICB1bnNpZ25lZCBzaG9ydCBmcmFnczsKLSAgY2hhciB0dGw7Ci0gIGNoYXIgcHJvdG9jb2w7Ci0gIHVuc2lnbmVkIHNob3J0IGNoa3N1bTsKLSAgaW5fYWRkciBzcmM7Ci0gIGluX2FkZHIgZGVzdDsKLX07Ci0KLXN0cnVjdCB1ZHBoZHIKLXsKLSAgdW5zaWduZWQgc2hvcnQgc3JjOwotICB1bnNpZ25lZCBzaG9ydCBkZXN0OwotICB1bnNpZ25lZCBzaG9ydCBsZW47Ci0gIHVuc2lnbmVkIHNob3J0IGNoa3N1bTsKLX07Ci0KLS8qIEZvcm1hdCBvZiBhIGJvb3RwIHBhY2tldC4gICovCi1zdHJ1Y3QgYm9vdHBfdAotewotICBjaGFyIGJwX29wOwotICBjaGFyIGJwX2h0eXBlOwotICBjaGFyIGJwX2hsZW47Ci0gIGNoYXIgYnBfaG9wczsKLSAgdW5zaWduZWQgbG9uZyBicF94aWQ7Ci0gIHVuc2lnbmVkIHNob3J0IGJwX3NlY3M7Ci0gIHVuc2lnbmVkIHNob3J0IHVudXNlZDsKLSAgaW5fYWRkciBicF9jaWFkZHI7Ci0gIGluX2FkZHIgYnBfeWlhZGRyOwotICBpbl9hZGRyIGJwX3NpYWRkcjsKLSAgaW5fYWRkciBicF9naWFkZHI7Ci0gIGNoYXIgYnBfaHdhZGRyWzE2XTsKLSAgY2hhciBicF9zbmFtZVs2NF07Ci0gIGNoYXIgYnBfZmlsZVsxMjhdOwotI2lmZGVmCU5PX0RIQ1BfU1VQUE9SVAotICBjaGFyIGJwX3ZlbmRbQk9PVFBfVkVORE9SX0xFTl07Ci0jZWxzZQotICBjaGFyIGJwX3ZlbmRbREhDUF9PUFRfTEVOXTsKLSNlbmRpZgkvKiBOT19ESENQX1NVUFBPUlQgKi8KLX07Ci0KLS8qIEZvcm1hdCBvZiBhIGJvb3RwIElQIHBhY2tldC4gICovCi1zdHJ1Y3QgYm9vdHBpcF90Ci17Ci0gIHN0cnVjdCBpcGhkciBpcDsKLSAgc3RydWN0IHVkcGhkciB1ZHA7Ci0gIHN0cnVjdCBib290cF90IGJwOwotfTsKLQotLyogRm9ybWF0IG9mIGJvb3RwIHBhY2tldCB3aXRoIGV4dGVuc2lvbnMuICAqLwotc3RydWN0IGJvb3RwZF90Ci17Ci0gIHN0cnVjdCBib290cF90IGJvb3RwX3JlcGx5OwotICB1bnNpZ25lZCBjaGFyICBib290cF9leHRlbnNpb25bTUFYX0JPT1RQX0VYVExFTl07Ci19OwotCi1zdHJ1Y3QgdGZ0cF90Ci17Ci0gIHN0cnVjdCBpcGhkciBpcDsKLSAgc3RydWN0IHVkcGhkciB1ZHA7Ci0gIHVuc2lnbmVkIHNob3J0IG9wY29kZTsKLSAgdW5pb24KLSAgewotICAgIGNoYXIgcnJxW1RGVFBfREVGQVVMVFNJWkVfUEFDS0VUXTsKLSAgICAKLSAgICBzdHJ1Y3QKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBzaG9ydCBibG9jazsKLSAgICAgIGNoYXIgZG93bmxvYWRbVEZUUF9NQVhfUEFDS0VUXTsKLSAgICB9Ci0gICAgZGF0YTsKLSAgICAKLSAgICBzdHJ1Y3QKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBzaG9ydCBibG9jazsKLSAgICB9Ci0gICAgYWNrOwotICAgIAotICAgIHN0cnVjdAotICAgIHsKLSAgICAgIHVuc2lnbmVkIHNob3J0IGVycmNvZGU7Ci0gICAgICBjaGFyIGVycm1zZ1tURlRQX0RFRkFVTFRTSVpFX1BBQ0tFVF07Ci0gICAgfQotICAgIGVycjsKLSAgICAKLSAgICBzdHJ1Y3QKLSAgICB7Ci0gICAgICBjaGFyIGRhdGFbVEZUUF9ERUZBVUxUU0laRV9QQUNLRVQrMl07Ci0gICAgfQotICAgIG9hY2s7Ci0gIH0KLSAgdTsKLX07Ci0KLS8qIERlZmluZSBhIHNtYWxsZXIgdGZ0cCBwYWNrZXQgc29sZWx5IGZvciBtYWtpbmcgcmVxdWVzdHMgdG8gY29uc2VydmUgc3RhY2sKLSAgIDUxMiBieXRlcyBzaG91bGQgYmUgZW5vdWdoLiAgKi8KLXN0cnVjdCB0ZnRwcmVxX3QKLXsKLSAgc3RydWN0IGlwaGRyIGlwOwotICBzdHJ1Y3QgdWRwaGRyIHVkcDsKLSAgdW5zaWduZWQgc2hvcnQgb3Bjb2RlOwotICB1bmlvbgotICB7Ci0gICAgY2hhciBycnFbNTEyXTsKLSAgICAKLSAgICBzdHJ1Y3QKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBzaG9ydCBibG9jazsKLSAgICB9Ci0gICAgYWNrOwotICAgIAotICAgIHN0cnVjdAotICAgIHsKLSAgICAgIHVuc2lnbmVkIHNob3J0IGVycmNvZGU7Ci0gICAgICBjaGFyIGVycm1zZ1s1MTItMl07Ci0gICAgfQotICAgIGVycjsKLSAgfQotICB1OwotfTsKLQotI2RlZmluZSBURlRQX01JTl9QQUNLRVQJKHNpemVvZihzdHJ1Y3QgaXBoZHIpICsgc2l6ZW9mKHN0cnVjdCB1ZHBoZHIpICsgNCkKLQotc3RydWN0IHJwY190Ci17Ci0gIHN0cnVjdCBpcGhkciBpcDsKLSAgc3RydWN0IHVkcGhkciB1ZHA7Ci0gIHVuaW9uCi0gIHsKLSAgICBjaGFyIGRhdGFbMzAwXTsJCS8qIGxvbmdlc3QgUlBDIGNhbGwgbXVzdCBmaXQhISEhICovCi0gICAgCi0gICAgc3RydWN0Ci0gICAgewotICAgICAgbG9uZyBpZDsKLSAgICAgIGxvbmcgdHlwZTsKLSAgICAgIGxvbmcgcnBjdmVyczsKLSAgICAgIGxvbmcgcHJvZzsKLSAgICAgIGxvbmcgdmVyczsKLSAgICAgIGxvbmcgcHJvYzsKLSAgICAgIGxvbmcgZGF0YVsxXTsKLSAgICB9Ci0gICAgY2FsbDsKLSAgICAKLSAgICBzdHJ1Y3QKLSAgICB7Ci0gICAgICBsb25nIGlkOwotICAgICAgbG9uZyB0eXBlOwotICAgICAgbG9uZyByc3RhdHVzOwotICAgICAgbG9uZyB2ZXJpZmllcjsKLSAgICAgIGxvbmcgdjI7Ci0gICAgICBsb25nIGFzdGF0dXM7Ci0gICAgICBsb25nIGRhdGFbMV07Ci0gICAgfQotICAgIHJlcGx5OwotICB9Ci0gIHU7Ci19OwotCi0jZGVmaW5lIFBST0dfUE9SVE1BUAkxMDAwMDAKLSNkZWZpbmUgUFJPR19ORlMJMTAwMDAzCi0jZGVmaW5lIFBST0dfTU9VTlQJMTAwMDA1Ci0KLSNkZWZpbmUgTVNHX0NBTEwJMAotI2RlZmluZSBNU0dfUkVQTFkJMQotCi0jZGVmaW5lIFBPUlRNQVBfR0VUUE9SVAkzCi0KLSNkZWZpbmUgTU9VTlRfQURERU5UUlkJMQotI2RlZmluZSBNT1VOVF9VTU9VTlRBTEwJNAotCi0jZGVmaW5lIE5GU19MT09LVVAJNAotI2RlZmluZSBORlNfUkVBRAk2Ci0KLSNkZWZpbmUgTkZTX0ZIU0laRQkzMgotCi0jZGVmaW5lIE5GU0VSUl9QRVJNCTEKLSNkZWZpbmUgTkZTRVJSX05PRU5UCTIKLSNkZWZpbmUgTkZTRVJSX0FDQ0VTCTEzCi0KLS8qIEJsb2NrIHNpemUgdXNlZCBmb3IgTkZTIHJlYWQgYWNjZXNzZXMuICBBIFJQQyByZXBseSBwYWNrZXQgKGluY2x1ZGluZyAgYWxsCi0gKiBoZWFkZXJzKSBtdXN0IGZpdCB3aXRoaW4gYSBzaW5nbGUgRXRoZXJuZXQgZnJhbWUgdG8gYXZvaWQgZnJhZ21lbnRhdGlvbi4KLSAqIENob3NlbiB0byBiZSBhIHBvd2VyIG9mIHR3bywgYXMgbW9zdCBORlMgc2VydmVycyBhcmUgb3B0aW1pemVkIGZvciB0aGlzLiAgKi8KLSNkZWZpbmUgTkZTX1JFQURfU0laRQkxMDI0Ci0KLSNkZWZpbmUJRkxPUFBZX0JPT1RfTE9DQVRJT04JMHg3YzAwCi0vKiBNdXN0IG1hdGNoIG9mZnNldHMgaW4gbG9hZGVyLlMgKi8KLSNkZWZpbmUgUk9NX1NFR01FTlQJCTB4MWZhCi0jZGVmaW5lIFJPTV9MRU5HVEgJCTB4MWZjCi0KLSNkZWZpbmUJUk9NX0lORk9fTE9DQVRJT04JKEZMT1BQWV9CT09UX0xPQ0FUSU9OICsgUk9NX1NFR01FTlQpCi0vKiBhdCBlbmQgb2YgZmxvcHB5IGJvb3QgYmxvY2sgKi8KLQotc3RydWN0IHJvbV9pbmZvCi17Ci0gIHVuc2lnbmVkIHNob3J0CXJvbV9zZWdtZW50OwotICB1bnNpZ25lZCBzaG9ydAlyb21fbGVuZ3RoOwotfTsKLQotc3RhdGljIGlubGluZSBpbnQKLXJvbV9hZGRyZXNzX29rIChzdHJ1Y3Qgcm9tX2luZm8gKnJvbSwgaW50IGFzc2lnbmVkX3JvbV9zZWdtZW50KQotewotICByZXR1cm4gKGFzc2lnbmVkX3JvbV9zZWdtZW50IDwgMHhDMDAwCi0JICB8fCBhc3NpZ25lZF9yb21fc2VnbWVudCA9PSByb20tPnJvbV9zZWdtZW50KTsKLX0KLQotLyogRGVmaW5lIGEgdHlwZSBmb3IgcGFzc2luZyBpbmZvIHRvIGEgbG9hZGVkIHByb2dyYW0uICAqLwotc3RydWN0IGViaW5mbwotewotICB1bnNpZ25lZCBjaGFyCW1ham9yLCBtaW5vcjsJLyogVmVyc2lvbiAqLwotICB1bnNpZ25lZCBzaG9ydAlmbGFnczsJCS8qIEJpdCBmbGFncyAqLwotfTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotRXh0ZXJuYWwgcHJvdG90eXBlcwotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogbWFpbi5jICovCi1leHRlcm4gdm9pZCBwcmludF9uZXR3b3JrX2NvbmZpZ3VyYXRpb24gKHZvaWQpOwotZXh0ZXJuIGludCBpZmNvbmZpZyAoY2hhciAqaXAsIGNoYXIgKnNtLCBjaGFyICpndywgY2hhciAqc3ZyKTsKLWV4dGVybiBpbnQgdWRwX3RyYW5zbWl0ICh1bnNpZ25lZCBsb25nIGRlc3RpcCwgdW5zaWduZWQgaW50IHNyY3NvY2ssCi0JCQkgdW5zaWduZWQgaW50IGRlc3Rzb2NrLCBpbnQgbGVuLCBjb25zdCB2b2lkICpidWYpOwotZXh0ZXJuIGludCBhd2FpdF9yZXBseSAoaW50IHR5cGUsIGludCBpdmFsLCB2b2lkICpwdHIsIGludCB0aW1lb3V0KTsKLWV4dGVybiBpbnQgZGVjb2RlX3JmYzE1MzMgKHVuc2lnbmVkIGNoYXIgKiwgaW50LCBpbnQsIGludCk7Ci1leHRlcm4gbG9uZyByZmMyMTMxX3NsZWVwX2ludGVydmFsIChpbnQgYmFzZSwgaW50IGV4cCk7Ci1leHRlcm4gdm9pZCBjbGVhbnVwICh2b2lkKTsKLWV4dGVybiBpbnQgcmFycCAodm9pZCk7Ci1leHRlcm4gaW50IGJvb3RwICh2b2lkKTsKLWV4dGVybiB2b2lkIGNsZWFudXBfbmV0ICh2b2lkKTsKLQotLyogY29uZmlnLmMgKi8KLWV4dGVybiB2b2lkIHByaW50X2NvbmZpZyAodm9pZCk7Ci1leHRlcm4gdm9pZCBldGhfcmVzZXQgKHZvaWQpOwotZXh0ZXJuIGludCBldGhfcHJvYmUgKHZvaWQpOwotZXh0ZXJuIGludCBldGhfcG9sbCAodm9pZCk7Ci1leHRlcm4gdm9pZCBldGhfdHJhbnNtaXQgKGNvbnN0IGNoYXIgKmQsIHVuc2lnbmVkIGludCB0LAotCQkJICB1bnNpZ25lZCBpbnQgcywgY29uc3Qgdm9pZCAqcCk7Ci1leHRlcm4gdm9pZCBldGhfZGlzYWJsZSAodm9pZCk7Ci0KLS8qIG1pc2MuYyAqLwotZXh0ZXJuIHZvaWQgdHdpZGRsZSAodm9pZCk7Ci1leHRlcm4gdm9pZCBzbGVlcCAoaW50IHNlY3MpOwotZXh0ZXJuIGludCBnZXRkZWMgKGNoYXIgKipzKTsKLWV4dGVybiB2b2lkIGV0aGVyYm9vdF9wcmludGYgKGNvbnN0IGNoYXIgKiwgLi4uKTsKLWV4dGVybiBpbnQgZXRoZXJib290X3NwcmludGYgKGNoYXIgKiwgY29uc3QgY2hhciAqLCAuLi4pOwotZXh0ZXJuIGludCBpbmV0X2F0b24gKGNoYXIgKnAsIGluX2FkZHIgKmkpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1FeHRlcm5hbCB2YXJpYWJsZXMKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIG1haW4uYyAqLwotZXh0ZXJuIGludCBpcF9hYm9ydDsKLWV4dGVybiBpbnQgbmV0d29ya19yZWFkeTsKLWV4dGVybiBzdHJ1Y3Qgcm9tX2luZm8gcm9tOwotZXh0ZXJuIHN0cnVjdCBhcnB0YWJsZV90IGFycHRhYmxlW01BWF9BUlBdOwotZXh0ZXJuIHN0cnVjdCBib290cGRfdCBib290cF9kYXRhOwotI2RlZmluZQlCT09UUF9EQVRBX0FERFIJKCZib290cF9kYXRhKQotZXh0ZXJuIHVuc2lnbmVkIGNoYXIgKmVuZF9vZl9yZmMxNTMzOwogCi0vKiBjb25maWcuYyAqLwotZXh0ZXJuIHN0cnVjdCBuaWMgbmljOworI2RlZmluZSBnYXRlQTIwX3NldCgpIGdhdGVBMjAoMSkKKyNkZWZpbmUgZ2F0ZUEyMF91bnNldCgpIGdhdGVBMjAoMCkKKyNkZWZpbmUgRUJERUJVRyAwCisvKiBUaGUgJ3JvbV9pbmZvJyBtYXliZSBhcmNoIGRlcGVuZGVkLiBJdCBtdXN0IGJlIG1vdmVkIHRvIHNvbWUgb3RoZXIKKyAqIHBsYWNlICovCitzdHJ1Y3Qgcm9tX2luZm8geworCXVuc2lnbmVkIHNob3J0CXJvbV9zZWdtZW50OworCXVuc2lnbmVkIHNob3J0CXJvbV9sZW5ndGg7Cit9OworCitleHRlcm4gdm9pZCBwb2xsX2ludGVycnVwdGlvbnMgUCgodm9pZCkpOworCisvKiBGb3IgVU5ESSBkcml2ZXJzICovCitleHRlcm4gdm9pZCBmYWtlX2lycSAoIHVpbnQ4X3QgaXJxICk7CitleHRlcm4gdm9pZCBfdHJpdmlhbF9pcnFfaGFuZGxlcl9zdGFydDsKK2V4dGVybiB1aW50MzJfdCBnZXRfZnJlZV9iYXNlX21lbW9yeSAoIHZvaWQgKTsKK2V4dGVybiB2b2lkIGZvcmdldF9iYXNlX21lbW9yeSAoIHZvaWQqLCBzaXplX3QgKTsKK2V4dGVybiB2b2lkIGZyZWVfdW51c2VkX2Jhc2VfbWVtb3J5ICggdm9pZCApOwogCi0vKiBMb2NhbCBoYWNrIC0gZGVmaW5lIHNvbWUgbWFjcm9zIHRvIHVzZSBldGhlcmJvb3Qgc291cmNlIGZpbGVzICJhcyBpcyIuICAqLwotI2lmbmRlZiBHUlVCCi0jIHVuZGVmIHByaW50ZgotIyBkZWZpbmUgcHJpbnRmCWV0aGVyYm9vdF9wcmludGYKLSMgdW5kZWYgc3ByaW50ZgotIyBkZWZpbmUgc3ByaW50ZiBldGhlcmJvb3Rfc3ByaW50ZgotI2VuZGlmIC8qIEdSVUIgKi8KKyNlbmRpZiAvKiBFVEhFUkJPT1RfSCAqLwpkaWZmIC1OYXVyIGdydWItMC45Ny5vcmlnL25ldGJvb3QvZmEzMTEuYyBncnViLTAuOTcvbmV0Ym9vdC9mYTMxMS5jCi0tLSBncnViLTAuOTcub3JpZy9uZXRib290L2ZhMzExLmMJMjAwMy0wNy0wOSAxMTo0NTozNy4wMDAwMDAwMDAgKzAwMDAKKysrIGdydWItMC45Ny9uZXRib290L2ZhMzExLmMJMTk3MC0wMS0wMSAwMDowMDowMC4wMDAwMDAwMDAgKzAwMDAKQEAgLTEsNDIxICswLDAgQEAKLS8qCi0gICAgICAgIERyaXZlciBmb3IgdGhlIE5hdGlvbmFsIFNlbWljb25kdWN0b3IgRFA4MzgxMCBFdGhlcm5ldCBjb250cm9sbGVyLgotICAgICAgICAKLSAgICAgICAgUG9ydGlvbnMgQ29weXJpZ2h0IChDKSAyMDAxIElucHJpbWlzIFRlY2hub2xvZ2llcywgSW5jLgotICAgICAgICBodHRwOi8vd3d3LmlucHJpbWlzLmNvbS8KLSAgICAgICAgCi0gICAgICAgIFRoaXMgZHJpdmVyIGlzIGJhc2VkIChoZWF2aWx5KSBvbiB0aGUgTGludXggZHJpdmVyIGZvciB0aGlzIGNoaXAgCi0gICAgICAgIHdoaWNoIGlzIGNvcHlyaWdodCAxOTk5LTIwMDEgYnkgRG9uYWxkIEJlY2tlci4KLQotICAgICAgICBUaGlzIHNvZnR3YXJlIGhhcyBubyB3YXJyYW50aWVzIGV4cHJlc3NlZCBvciBpbXBsaWVkIGZvciBhbnkKLSAgICAgICAgcHVycG9zZS4KLQotICAgICAgICBUaGlzIHNvZnR3YXJlIG1heSBiZSB1c2VkIGFuZCBkaXN0cmlidXRlZCBhY2NvcmRpbmcgdG8gdGhlIHRlcm1zIG9mCi0gICAgICAgIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMKSwgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCi0gICAgICAgIERyaXZlcnMgYmFzZWQgb24gb3IgZGVyaXZlZCBmcm9tIHRoaXMgY29kZSBmYWxsIHVuZGVyIHRoZSBHUEwgYW5kIG11c3QKLSAgICAgICAgcmV0YWluIHRoZSBhdXRob3JzaGlwLCBjb3B5cmlnaHQgYW5kIGxpY2Vuc2Ugbm90aWNlLiAgVGhpcyBmaWxlIGlzIG5vdAotICAgICAgICBhIGNvbXBsZXRlIHByb2dyYW0gYW5kIG1heSBvbmx5IGJlIHVzZWQgd2hlbiB0aGUgZW50aXJlIG9wZXJhdGluZwotICAgICAgICBzeXN0ZW0gaXMgbGljZW5zZWQgdW5kZXIgdGhlIEdQTC4gIExpY2Vuc2UgZm9yIHVuZGVyIG90aGVyIHRlcm1zIG1heSBiZQotICAgICAgICBhdmFpbGFibGUuICBDb250YWN0IHRoZSBvcmlnaW5hbCBhdXRob3IgZm9yIGRldGFpbHMuCi0KLSAgICAgICAgVGhlIG9yaWdpbmFsIGF1dGhvciBtYXkgYmUgcmVhY2hlZCBhcyBiZWNrZXJAc2N5bGQuY29tLCBvciBhdAotICAgICAgICBTY3lsZCBDb21wdXRpbmcgQ29ycG9yYXRpb24KLSAgICAgICAgNDEwIFNldmVybiBBdmUuLCBTdWl0ZSAyMTAKLSAgICAgICAgQW5uYXBvbGlzIE1EIDIxNDAzCi0qLwotCi0KLXR5cGVkZWYgdW5zaWduZWQgY2hhciAgdTg7Ci10eXBlZGVmICAgc2lnbmVkIGNoYXIgIHM4OwotdHlwZWRlZiB1bnNpZ25lZCBzaG9ydCB1MTY7Ci10eXBlZGVmICAgc2lnbmVkIHNob3J0IHMxNjsKLXR5cGVkZWYgdW5zaWduZWQgaW50ICAgdTMyOwotdHlwZWRlZiAgIHNpZ25lZCBpbnQgICBzMzI7Ci0KLSNpbmNsdWRlICJldGhlcmJvb3QuaCIKLSNpbmNsdWRlICJuaWMuaCIKLSNpbmNsdWRlICJwY2kuaCIKLQotI3VuZGVmCXZpcnRfdG9fYnVzCi0jZGVmaW5lCXZpcnRfdG9fYnVzKHgpICAgICAgICAgICgodW5zaWduZWQgbG9uZyl4KQotI2RlZmluZSBjcHVfdG9fbGUzMih2YWwpICAgICAgICAodmFsKQotI2RlZmluZSBsZTMyX3RvX2NwdSh2YWwpICAgICAgICAodmFsKQotI2RlZmluZSB2aXJ0X3RvX2xlMzJkZXNjKGFkZHIpICBjcHVfdG9fbGUzMih2aXJ0X3RvX2J1cyhhZGRyKSkKLSNkZWZpbmUgbGUzMmRlc2NfdG9fdmlydChhZGRyKSAgYnVzX3RvX3ZpcnQobGUzMl90b19jcHUoYWRkcikpCi0KLSNkZWZpbmUgVFhfUklOR19TSVpFIDEKLSNkZWZpbmUgUlhfUklOR19TSVpFIDQKLSNkZWZpbmUgVElNRV9PVVQgICAgIDEwMDAwMDAKLSNkZWZpbmUgUEtUX0JVRl9TWiAgIDE1MzYKLQotLyogT2Zmc2V0cyB0byB0aGUgZGV2aWNlIHJlZ2lzdGVycy4gKi8KLWVudW0gcmVnaXN0ZXJfb2Zmc2V0cyB7Ci0gICAgQ2hpcENtZD0weDAwLCBDaGlwQ29uZmlnPTB4MDQsIEVFQ3RybD0weDA4LCBQQ0lCdXNDZmc9MHgwQywKLSAgICBJbnRyU3RhdHVzPTB4MTAsIEludHJNYXNrPTB4MTQsIEludHJFbmFibGU9MHgxOCwKLSAgICBUeFJpbmdQdHI9MHgyMCwgVHhDb25maWc9MHgyNCwKLSAgICBSeFJpbmdQdHI9MHgzMCwgUnhDb25maWc9MHgzNCwKLSAgICBXT0xDbWQ9MHg0MCwgUGF1c2VDbWQ9MHg0NCwgUnhGaWx0ZXJBZGRyPTB4NDgsIFJ4RmlsdGVyRGF0YT0weDRDLAotICAgIEJvb3RSb21BZGRyPTB4NTAsIEJvb3RSb21EYXRhPTB4NTQsIFN0YXRzQ3RybD0weDVDLCBTdGF0c0RhdGE9MHg2MCwKLSAgICBSeFBrdEVycnM9MHg2MCwgUnhNaXNzZWQ9MHg2OCwgUnhDUkNFcnJzPTB4NjQsCi19OwotCi0vKiBCaXQgaW4gQ2hpcENtZC4gKi8KLWVudW0gQ2hpcENtZEJpdHMgewotICAgIENoaXBSZXNldD0weDEwMCwgUnhSZXNldD0weDIwLCBUeFJlc2V0PTB4MTAsIFJ4T2ZmPTB4MDgsIFJ4T249MHgwNCwKLSAgICBUeE9mZj0weDAyLCBUeE9uPTB4MDEsCi19OwotCi0vKiBCaXRzIGluIHRoZSBpbnRlcnJ1cHQgc3RhdHVzL21hc2sgcmVnaXN0ZXJzLiAqLwotZW51bSBpbnRyX3N0YXR1c19iaXRzIHsKLSAgICBJbnRyUnhEb25lPTB4MDAwMSwgSW50clJ4SW50cj0weDAwMDIsIEludHJSeEVycj0weDAwMDQsIEludHJSeEVhcmx5PTB4MDAwOCwKLSAgICBJbnRyUnhJZGxlPTB4MDAxMCwgSW50clJ4T3ZlcnJ1bj0weDAwMjAsCi0gICAgSW50clR4RG9uZT0weDAwNDAsIEludHJUeEludHI9MHgwMDgwLCBJbnRyVHhFcnI9MHgwMTAwLAotICAgIEludHJUeElkbGU9MHgwMjAwLCBJbnRyVHhVbmRlcnJ1bj0weDA0MDAsCi0gICAgU3RhdHNNYXg9MHgwODAwLCBMaW5rQ2hhbmdlPTB4NDAwMCwJV09MUGt0PTB4MjAwMCwKLSAgICBSeFJlc2V0RG9uZT0weDEwMDAwMDAsIFR4UmVzZXREb25lPTB4MjAwMDAwMCwKLSAgICBJbnRyUENJRXJyPTB4MDBmMDAwMDAsIEludHJOb3JtYWxTdW1tYXJ5PTB4MDI1MSwgSW50ckFibm9ybWFsU3VtbWFyeT0weEVEMjAsCi19OwotCi0vKiBCaXRzIGluIHRoZSBSeE1vZGUgcmVnaXN0ZXIuICovCi1lbnVtIHJ4X21vZGVfYml0cyB7Ci0gICAgQWNjZXB0RXJyPTB4MjAsIEFjY2VwdFJ1bnQ9MHgxMCwgQWNjZXB0QnJvYWRjYXN0PTB4QzAwMDAwMDAsCi0gICAgQWNjZXB0TXVsdGljYXN0PTB4MDAyMDAwMDAsIEFjY2VwdEFsbE11bHRpY2FzdD0weDIwMDAwMDAwLAotICAgIEFjY2VwdEFsbFBoeXM9MHgxMDAwMDAwMCwgQWNjZXB0TXlQaHlzPTB4MDgwMDAwMDAsCi19OwotCi0vKiBCaXRzIGluIG5ldHdvcmtfZGVzYy5zdGF0dXMgKi8KLWVudW0gZGVzY19zdGF0dXNfYml0cyB7Ci0gICAgRGVzY093bj0weDgwMDAwMDAwLCBEZXNjTW9yZT0weDQwMDAwMDAwLCBEZXNjSW50cj0weDIwMDAwMDAwLAotICAgIERlc2NOb0NSQz0weDEwMDAwMDAwLAotICAgIERlc2NQa3RPSz0weDA4MDAwMDAwLCBSeFRvb0xvbmc9MHgwMDQwMDAwMCwKLX07Ci0KLS8qIFRoZSBSeCBhbmQgVHggYnVmZmVyIGRlc2NyaXB0b3JzLiAqLwotc3RydWN0IG5ldGRldl9kZXNjIHsKLSAgICB1MzIgbmV4dF9kZXNjOwotICAgIHMzMiBjbWRfc3RhdHVzOwotICAgIHUzMiBhZGRyOwotfTsKLQotc3RhdGljIHN0cnVjdCBGQTMxMV9ERVYgewotICAgIHVuc2lnbmVkIGludCAgICBpb2FkZHI7Ci0gICAgdW5zaWduZWQgc2hvcnQgIHZlbmRvcjsKLSAgICB1bnNpZ25lZCBzaG9ydCAgZGV2aWNlOwotICAgIHVuc2lnbmVkIGludCAgICBjdXJfcng7Ci0gICAgdW5zaWduZWQgaW50ICAgIGN1cl90eDsKLSAgICB1bnNpZ25lZCBpbnQgICAgcnhfYnVmX3N6OwotICAgIHZvbGF0aWxlIHN0cnVjdCBuZXRkZXZfZGVzYyAqcnhfaGVhZF9kZXNjOwotICAgIHZvbGF0aWxlIHN0cnVjdCBuZXRkZXZfZGVzYyByeF9yaW5nW1JYX1JJTkdfU0laRV0gX19hdHRyaWJ1dGVfXyAoKGFsaWduZWQgKDQpKSk7Ci0gICAgdm9sYXRpbGUgc3RydWN0IG5ldGRldl9kZXNjIHR4X3JpbmdbVFhfUklOR19TSVpFXSBfX2F0dHJpYnV0ZV9fICgoYWxpZ25lZCAoNCkpKTsKLX0gZmEzMTFfZGV2OwotCi1zdGF0aWMgaW50ICBlZXByb21fcmVhZChsb25nIGlvYWRkciwgaW50IGxvY2F0aW9uKTsKLXN0YXRpYyB2b2lkIGluaXRfcmluZyhzdHJ1Y3QgRkEzMTFfREVWICpkZXYpOwotc3RhdGljIHZvaWQgZmEzMTFfcmVzZXQoc3RydWN0IG5pYyAqbmljKTsKLXN0YXRpYyBpbnQgIGZhMzExX3BvbGwoc3RydWN0IG5pYyAqbmljKTsKLXN0YXRpYyB2b2lkIGZhMzExX3RyYW5zbWl0KHN0cnVjdCBuaWMgKm5pYywgY29uc3QgY2hhciAqZCwgdW5zaWduZWQgaW50IHQsIHVuc2lnbmVkIGludCBzLCBjb25zdCBjaGFyICpwKTsKLXN0YXRpYyB2b2lkIGZhMzExX2Rpc2FibGUoc3RydWN0IG5pYyAqbmljKTsKLQotc3RhdGljIGNoYXIgcnhfcGFja2V0W1BLVF9CVUZfU1ogKiBSWF9SSU5HX1NJWkVdIF9fYXR0cmlidXRlX18gKChhbGlnbmVkICg0KSkpOwotc3RhdGljIGNoYXIgdHhfcGFja2V0W1BLVF9CVUZfU1ogKiBUWF9SSU5HX1NJWkVdIF9fYXR0cmlidXRlX18gKChhbGlnbmVkICg0KSkpOwotCi1zdHJ1Y3QgbmljICogZmEzMTFfcHJvYmUoc3RydWN0IG5pYyAqbmljLCB1bnNpZ25lZCBzaG9ydCAqaW9fYWRkcnMsIHN0cnVjdCBwY2lfZGV2aWNlICpwY2kpCi17Ci1pbnQgICAgICAgICAgICBwcmV2X2VlZGF0YTsKLWludCAgICAgICAgICAgIGk7Ci1pbnQgICAgICAgICAgICBkdXBsZXg7Ci1pbnQgICAgICAgICAgICB0eF9jb25maWc7Ci1pbnQgICAgICAgICAgICByeF9jb25maWc7Ci11bnNpZ25lZCBjaGFyICBtYWNhZGRyWzZdOwotdW5zaWduZWQgY2hhciAgbWFjdGVzdDsKLXVuc2lnbmVkIGNoYXIgIHBjaV9idXMgPSAwOwotc3RydWN0IEZBMzExX0RFViogZGV2ID0gJmZhMzExX2RldjsKLQkKLSAgICBpZiAoaW9fYWRkcnMgPT0gMCB8fCAqaW9fYWRkcnMgPT0gMCkKLSAgICAgICAgcmV0dXJuICgwKTsKLSAgICBtZW1zZXQoZGV2LCAwLCBzaXplb2YoKmRldikpOwotICAgIGRldi0+dmVuZG9yID0gcGNpLT52ZW5kb3I7Ci0gICAgZGV2LT5kZXZpY2UgPSBwY2ktPmRldl9pZDsKLSAgICBkZXYtPmlvYWRkciA9IHBjaS0+bWVtYmFzZTsKLQotICAgIC8qIFdvcmsgYXJvdW5kIHRoZSBkcm9wcGVkIHNlcmlhbCBiaXQuICovCi0gICAgcHJldl9lZWRhdGEgPSBlZXByb21fcmVhZChkZXYtPmlvYWRkciwgNik7Ci0gICAgZm9yIChpID0gMDsgaSA8IDM7IGkrKykgewotICAgICAgICBpbnQgZWVkYXRhID0gZWVwcm9tX3JlYWQoZGV2LT5pb2FkZHIsIGkgKyA3KTsKLSAgICAgICAgbWFjYWRkcltpKjJdID0gKGVlZGF0YSA8PCAxKSArIChwcmV2X2VlZGF0YSA+PiAxNSk7Ci0gICAgICAgIG1hY2FkZHJbaSoyKzFdID0gZWVkYXRhID4+IDc7Ci0gICAgICAgIHByZXZfZWVkYXRhID0gZWVkYXRhOwotICAgIH0KLSAgICBtYWN0ZXN0ID0gMDsKLSAgICBmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQotICAgICAgICBtYWN0ZXN0IHw9IG1hY2FkZHJbaV07Ci0gICAgaWYgKG1hY3Rlc3QgPT0gMCkKLSAgICAgICAgcmV0dXJuICgwKTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQotICAgICAgICBuaWMtPm5vZGVfYWRkcltpXSA9IG1hY2FkZHJbaV07Ci0gICAgcHJpbnRmKCIlISAiLCBuaWMtPm5vZGVfYWRkcik7Ci0KLSAgICBhZGp1c3RfcGNpX2RldmljZShwY2kpOwotCi0gICAgZmEzMTFfcmVzZXQobmljKTsKLQotICAgIG5pYy0+cmVzZXQgPSBmYTMxMV9yZXNldDsKLSAgICBuaWMtPmRpc2FibGUgPSBmYTMxMV9kaXNhYmxlOwotICAgIG5pYy0+cG9sbCA9IGZhMzExX3BvbGw7Ci0gICAgbmljLT50cmFuc21pdCA9IGZhMzExX3RyYW5zbWl0OwotCi0gICAgaW5pdF9yaW5nKGRldik7Ci0KLSAgICB3cml0ZWwodmlydF90b19idXMoZGV2LT5yeF9yaW5nKSwgZGV2LT5pb2FkZHIgKyBSeFJpbmdQdHIpOwotICAgIHdyaXRlbCh2aXJ0X3RvX2J1cyhkZXYtPnR4X3JpbmcpLCBkZXYtPmlvYWRkciArIFR4UmluZ1B0cik7Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgNjsgaSArPSAyKQotICAgIHsKLSAgICAgICAgd3JpdGVsKGksIGRldi0+aW9hZGRyICsgUnhGaWx0ZXJBZGRyKTsKLSAgICAgICAgd3JpdGV3KG1hY2FkZHJbaV0gKyAobWFjYWRkcltpKzFdIDw8IDgpLAotICAgICAgICAgICAgICAgZGV2LT5pb2FkZHIgKyBSeEZpbHRlckRhdGEpOwotICAgIH0KLQotICAgIC8qIEluaXRpYWxpemUgb3RoZXIgcmVnaXN0ZXJzLiAqLwotICAgIC8qIENvbmZpZ3VyZSBmb3Igc3RhbmRhcmQsIGluLXNwZWMgRXRoZXJuZXQuICovCi0gICAgaWYgKHJlYWRsKGRldi0+aW9hZGRyICsgQ2hpcENvbmZpZykgJiAweDIwMDAwMDAwKQotICAgIHsgICAgLyogRnVsbCBkdXBsZXggKi8KLSAgICAgICAgdHhfY29uZmlnID0gMHhEMDgwMTAwMjsKLSAgICAgICAgcnhfY29uZmlnID0gMHgxMDAwMDAyMDsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgdHhfY29uZmlnID0gMHgxMDgwMTAwMjsKLSAgICAgICAgcnhfY29uZmlnID0gMHgwMDIwOwotICAgIH0KLSAgICB3cml0ZWwodHhfY29uZmlnLCBkZXYtPmlvYWRkciArIFR4Q29uZmlnKTsKLSAgICB3cml0ZWwocnhfY29uZmlnLCBkZXYtPmlvYWRkciArIFJ4Q29uZmlnKTsKLQotICAgIGR1cGxleCA9IHJlYWRsKGRldi0+aW9hZGRyICsgQ2hpcENvbmZpZykgJiAweDIwMDAwMDAwID8gMSA6IDA7Ci0gICAgaWYgKGR1cGxleCkgewotICAgICAgICByeF9jb25maWcgfD0gMHgxMDAwMDAwMDsKLSAgICAgICAgdHhfY29uZmlnIHw9IDB4QzAwMDAwMDA7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcnhfY29uZmlnICY9IH4weDEwMDAwMDAwOwotICAgICAgICB0eF9jb25maWcgJj0gfjB4QzAwMDAwMDA7Ci0gICAgfQotICAgIHdyaXRldyh0eF9jb25maWcsIGRldi0+aW9hZGRyICsgVHhDb25maWcpOwotICAgIHdyaXRldyhyeF9jb25maWcsIGRldi0+aW9hZGRyICsgUnhDb25maWcpOwotCi0gICAgd3JpdGVsKEFjY2VwdEJyb2FkY2FzdCB8IEFjY2VwdEFsbE11bHRpY2FzdCB8IEFjY2VwdE15UGh5cywgCi0gICAgICAgICAgIGRldi0+aW9hZGRyICsgUnhGaWx0ZXJBZGRyKTsKLQotICAgIHdyaXRlbChSeE9uIHwgVHhPbiwgZGV2LT5pb2FkZHIgKyBDaGlwQ21kKTsKLSAgICB3cml0ZWwoNCwgZGV2LT5pb2FkZHIgKyBTdGF0c0N0cmwpOyAgICAgICAgICAgICAgLyogQ2xlYXIgU3RhdHMgKi8KLSAgICByZXR1cm4gbmljOwkKLQotfQotCi1zdGF0aWMgdm9pZCBmYTMxMV9yZXNldChzdHJ1Y3QgbmljICpuaWMpCi17Ci11MzIgY2hpcF9jb25maWc7Ci1zdHJ1Y3QgRkEzMTFfREVWKiBkZXYgPSAmZmEzMTFfZGV2OwotCi0gICAgLyogUmVzZXQgdGhlIGNoaXAgdG8gZXJhc2UgcHJldmlvdXMgbWlzY29uZmlndXJhdGlvbi4gKi8KLSAgICBvdXRsKENoaXBSZXNldCwgZGV2LT5pb2FkZHIgKyBDaGlwQ21kKTsKLQotICAgIGlmICgocmVhZGwoZGV2LT5pb2FkZHIgKyBDaGlwQ29uZmlnKSAmIDB4ZTAwMCkgIT0gMHhlMDAwKQotICAgIHsKLSAgICAgICAgY2hpcF9jb25maWcgPSByZWFkbChkZXYtPmlvYWRkciArIENoaXBDb25maWcpOwotICAgIH0KLX0KLQotc3RhdGljIGludCBmYTMxMV9wb2xsKHN0cnVjdCBuaWMgKm5pYykKLXsKLXMzMiBkZXNjX3N0YXR1czsKLWludCB0bzsKLWludCBlbnRyeTsKLWludCByZXRjb2RlOwotc3RydWN0IEZBMzExX0RFViogZGV2ID0gJmZhMzExX2RldjsKLQotICAgIHJldGNvZGUgPSAwOwotICAgIGVudHJ5ID0gZGV2LT5jdXJfcng7Ci0gICAgdG8gPSBUSU1FX09VVDsKLSAgICB3aGlsZSAodG8gIT0gMCkKLSAgICB7Ci0gICAgICAgIGRlc2Nfc3RhdHVzID0gZGV2LT5yeF9yaW5nW2VudHJ5XS5jbWRfc3RhdHVzOwotICAgICAgICBpZiAoKGRlc2Nfc3RhdHVzICYgRGVzY093bikgIT0gMCkKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICAtLXRvOwotICAgIH0KLSAgICBpZiAodG8gIT0gMCkKLSAgICB7Ci0gICAgICAgIHJlYWRsKGRldi0+aW9hZGRyICsgSW50clN0YXR1cyk7ICAgICAgICAgLyogY2xlYXIgaW50ZXJycnVwdCBiaXRzICovCi0gICAgICAgIC8qIGRyaXZlciBvd25zIHRoZSBuZXh0IGVudHJ5IGl0J3MgYSBuZXcgcGFja2V0LiBTZW5kIGl0IHVwLiAqLwotICAgICAgICBpZiAoKGRlc2Nfc3RhdHVzICYgKERlc2NNb3JlfERlc2NQa3RPS3xSeFRvb0xvbmcpKSA9PSBEZXNjUGt0T0spCi0gICAgICAgIHsKLSAgICAgICAgICAgIG5pYy0+cGFja2V0bGVuID0gKGRlc2Nfc3RhdHVzICYgMHgwZmZmKSAtIDQ7ICAgIC8qIE9taXQgQ1JDIHNpemUuICovCi0gICAgICAgICAgICBtZW1jcHkobmljLT5wYWNrZXQsIChjaGFyKikoZGV2LT5yeF9yaW5nW2VudHJ5XS5hZGRyKSwgbmljLT5wYWNrZXRsZW4pOwotICAgICAgICAgICAgcmV0Y29kZSA9IDE7Ci0gICAgICAgIH0KLSAgICAgICAgLyogR2l2ZSB0aGUgZGVzY3JpcHRvciBiYWNrIHRvIHRoZSBjaGlwICovCi0gICAgICAgIGRldi0+cnhfcmluZ1tlbnRyeV0uY21kX3N0YXR1cyA9IGNwdV90b19sZTMyKGRldi0+cnhfYnVmX3N6KTsKLSAgICAgICAgZGV2LT5jdXJfcngrKzsKLSAgICAgICAgaWYgKGRldi0+Y3VyX3J4ID49IFJYX1JJTkdfU0laRSkKLSAgICAgICAgICAgIGRldi0+Y3VyX3J4ID0gMDsKLSAgICAgICAgZGV2LT5yeF9oZWFkX2Rlc2MgPSAmZGV2LT5yeF9yaW5nW2Rldi0+Y3VyX3J4XTsKLSAgICB9Ci0gICAgLyogUmVzdGFydCBSeCBlbmdpbmUgaWYgc3RvcHBlZC4gKi8KLSAgICB3cml0ZWwoUnhPbiwgZGV2LT5pb2FkZHIgKyBDaGlwQ21kKTsKLSAgICByZXR1cm4gcmV0Y29kZTsKLX0KLQotc3RhdGljIHZvaWQgZmEzMTFfdHJhbnNtaXQoc3RydWN0IG5pYyAqbmljLCBjb25zdCBjaGFyICpkZXN0YWRkciwgdW5zaWduZWQgaW50IHR5cGUsIHVuc2lnbmVkIGludCBsZW4sIGNvbnN0IGNoYXIgKmRhdGEpCi17Ci11bnNpZ25lZCBzaG9ydCBuc3R5cGU7Ci1zMzIgICAgICAgICAgICBkZXNjX3N0YXR1czsKLWludCAgICAgICAgICAgIHRvOwotaW50ICAgICAgICAgICAgZW50cnk7Ci1jaGFyKiAgICAgICAgICB0eHA7Ci11bnNpZ25lZCBjaGFyKiBzOwotc3RydWN0IEZBMzExX0RFViogZGV2ID0gJmZhMzExX2RldjsKLQotICAgIC8qIENhbGN1bGF0ZSB0aGUgbmV4dCBUeCBkZXNjcmlwdG9yIGVudHJ5LiAqLwotICAgIGVudHJ5ID0gZGV2LT5jdXJfdHg7Ci0gICAgdHhwID0gKGNoYXIqKShkZXYtPnR4X3JpbmdbZW50cnldLmFkZHIpOwotCi0gICAgbWVtY3B5KHR4cCwgZGVzdGFkZHIsIEVUSF9BTEVOKTsKLSAgICBtZW1jcHkodHhwICsgRVRIX0FMRU4sIG5pYy0+bm9kZV9hZGRyLCBFVEhfQUxFTik7Ci0gICAgbnN0eXBlID0gaHRvbnModHlwZSk7Ci0gICAgbWVtY3B5KHR4cCArIDEyLCAoY2hhciopJm5zdHlwZSwgMik7Ci0gICAgbWVtY3B5KHR4cCArIEVUSF9ITEVOLCBkYXRhLCBsZW4pOwotICAgIGxlbiArPSBFVEhfSExFTjsKLSAgICAvKiBwYWQgZnJhbWUgKi8KLSAgICBpZiAobGVuIDwgIEVUSF9aTEVOKQotICAgIHsKLSAgICAgICAgcyA9ICh1bnNpZ25lZCBjaGFyKikodHhwK2xlbik7Ci0gICAgICAgIHdoaWxlIChzIDwgKHVuc2lnbmVkIGNoYXIqKSh0eHArRVRIX1pMRU4pKQotICAgICAgICAgICAgKnMrKyA9IDA7Ci0gICAgICAgIGxlbiA9IEVUSF9aTEVOOwotICAgIH0KLSAgICBkZXYtPnR4X3JpbmdbZW50cnldLmNtZF9zdGF0dXMgPSBjcHVfdG9fbGUzMihEZXNjT3duIHwgbGVuKTsKLSAgICBkZXYtPmN1cl90eCsrOwotICAgIGlmIChkZXYtPmN1cl90eCA+PSBUWF9SSU5HX1NJWkUpCi0gICAgICAgIGRldi0+Y3VyX3R4ID0gMDsKLQotICAgIC8qIFdha2UgdGhlIHBvdGVudGlhbGx5LWlkbGUgdHJhbnNtaXQgY2hhbm5lbC4gKi8KLSAgICB3cml0ZWwoVHhPbiwgZGV2LT5pb2FkZHIgKyBDaGlwQ21kKTsKLQotICAgIC8qIHdhaXQgZm9yIHRyYW5taXNzaW9uIHRvIGNvbXBsZXRlICovCi0gICAgdG8gPSBUSU1FX09VVDsKLSAgICB3aGlsZSAodG8gIT0gMCkKLSAgICB7Ci0gICAgICAgIGRlc2Nfc3RhdHVzID0gZGV2LT50eF9yaW5nW2VudHJ5XS5jbWRfc3RhdHVzOwotICAgICAgICBpZiAoKGRlc2Nfc3RhdHVzICYgRGVzY093bikgPT0gMCkKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICAtLXRvOwotICAgIH0KLQotICAgIHJlYWRsKGRldi0+aW9hZGRyICsgSW50clN0YXR1cyk7ICAgICAgICAgLyogY2xlYXIgaW50ZXJycnVwdCBiaXRzICovCi0gICAgcmV0dXJuOwotfQotCi1zdGF0aWMgdm9pZCBmYTMxMV9kaXNhYmxlKHN0cnVjdCBuaWMgKm5pYykKLXsKLXN0cnVjdCBGQTMxMV9ERVYqIGRldiA9ICZmYTMxMV9kZXY7Ci0KLSAgICAvKiBTdG9wIHRoZSBjaGlwJ3MgVHggYW5kIFJ4IHByb2Nlc3Nlcy4gKi8KLSAgICB3cml0ZWwoUnhPZmYgfCBUeE9mZiwgZGV2LT5pb2FkZHIgKyBDaGlwQ21kKTsKLX0KLQotCi0vKiBSZWFkIHRoZSBFRVBST00gYW5kIE1JSSBNYW5hZ2VtZW50IERhdGEgSS9PIChNRElPKSBpbnRlcmZhY2VzLgotICAgVGhlIEVFUFJPTSBjb2RlIGlzIGZvciB0aGUgY29tbW9uIDkzYzA2LzQ2IEVFUFJPTXMgd2l0aCA2IGJpdCBhZGRyZXNzZXMuICovCi0KLS8qIERlbGF5IGJldHdlZW4gRUVQUk9NIGNsb2NrIHRyYW5zaXRpb25zLgotICAgTm8gZXh0cmEgZGVsYXkgaXMgbmVlZGVkIHdpdGggMzNNaHogUENJLCBidXQgZnV0dXJlIDY2TWh6IGFjY2VzcyBtYXkgbmVlZAotICAgYSBkZWxheS4gIE5vdGUgdGhhdCBwcmUtMi4wLjM0IGtlcm5lbHMgaGFkIGEgY2FjaGUtYWxpZ25tZW50IGJ1ZyB0aGF0Ci0gICBtYWRlIHVkZWxheSgpIHVucmVsaWFibGUuCi0gICBUaGUgb2xkIG1ldGhvZCBvZiB1c2luZyBhbiBJU0EgYWNjZXNzIGFzIGEgZGVsYXksIF9fU0xPV19ET1dOX0lPX18sIGlzCi0gICBkZXByaWNhdGVkLgotKi8KLSNkZWZpbmUgZWVwcm9tX2RlbGF5KGVlX2FkZHIpCWlubChlZV9hZGRyKQotCi1lbnVtIEVFUFJPTV9DdHJsX0JpdHMgewotCUVFX1NoaWZ0Q2xrPTB4MDQsIEVFX0RhdGFJbj0weDAxLCBFRV9DaGlwU2VsZWN0PTB4MDgsIEVFX0RhdGFPdXQ9MHgwMiwKLX07Ci0jZGVmaW5lIEVFX1dyaXRlMCAoRUVfQ2hpcFNlbGVjdCkKLSNkZWZpbmUgRUVfV3JpdGUxIChFRV9DaGlwU2VsZWN0IHwgRUVfRGF0YUluKQotCi0vKiBUaGUgRUVQUk9NIGNvbW1hbmRzIGluY2x1ZGUgdGhlIGFsd2F5LXNldCBsZWFkaW5nIGJpdC4gKi8KLWVudW0gRUVQUk9NX0NtZHMgewotCUVFX1dyaXRlQ21kPSg1IDw8IDYpLCBFRV9SZWFkQ21kPSg2IDw8IDYpLCBFRV9FcmFzZUNtZD0oNyA8PCA2KSwKLX07Ci0KLQotc3RhdGljIGludCBlZXByb21fcmVhZChsb25nIGFkZHIsIGludCBsb2NhdGlvbikKLXsKLQlpbnQgaTsKLQlpbnQgcmV0dmFsID0gMDsKLQlpbnQgZWVfYWRkciA9IGFkZHIgKyBFRUN0cmw7Ci0JaW50IHJlYWRfY21kID0gbG9jYXRpb24gfCBFRV9SZWFkQ21kOwotCXdyaXRlbChFRV9Xcml0ZTAsIGVlX2FkZHIpOwotCi0JLyogU2hpZnQgdGhlIHJlYWQgY29tbWFuZCBiaXRzIG91dC4gKi8KLQlmb3IgKGkgPSAxMDsgaSA+PSAwOyBpLS0pIHsKLQkJc2hvcnQgZGF0YXZhbCA9IChyZWFkX2NtZCAmICgxIDw8IGkpKSA/IEVFX1dyaXRlMSA6IEVFX1dyaXRlMDsKLQkJd3JpdGVsKGRhdGF2YWwsIGVlX2FkZHIpOwotCQllZXByb21fZGVsYXkoZWVfYWRkcik7Ci0JCXdyaXRlbChkYXRhdmFsIHwgRUVfU2hpZnRDbGssIGVlX2FkZHIpOwotCQllZXByb21fZGVsYXkoZWVfYWRkcik7Ci0JfQotCXdyaXRlbChFRV9DaGlwU2VsZWN0LCBlZV9hZGRyKTsKLQllZXByb21fZGVsYXkoZWVfYWRkcik7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykgewotCQl3cml0ZWwoRUVfQ2hpcFNlbGVjdCB8IEVFX1NoaWZ0Q2xrLCBlZV9hZGRyKTsKLQkJZWVwcm9tX2RlbGF5KGVlX2FkZHIpOwotCQlyZXR2YWwgfD0gKHJlYWRsKGVlX2FkZHIpICYgRUVfRGF0YU91dCkgPyAxIDw8IGkgOiAwOwotCQl3cml0ZWwoRUVfQ2hpcFNlbGVjdCwgZWVfYWRkcik7Ci0JCWVlcHJvbV9kZWxheShlZV9hZGRyKTsKLQl9Ci0KLQkvKiBUZXJtaW5hdGUgdGhlIEVFUFJPTSBhY2Nlc3MuICovCi0Jd3JpdGVsKEVFX1dyaXRlMCwgZWVfYWRkcik7Ci0Jd3JpdGVsKDAsIGVlX2FkZHIpOwotCXJldHVybiByZXR2YWw7Ci19Ci0KLS8qIEluaXRpYWxpemUgdGhlIFJ4IGFuZCBUeCByaW5ncywgYWxvbmcgd2l0aCB2YXJpb3VzICdkZXYnIGJpdHMuICovCi1zdGF0aWMgdm9pZCBpbml0X3Jpbmcoc3RydWN0IEZBMzExX0RFViAqZGV2KQotewotCWludCBpOwotCi0JZGV2LT5jdXJfcnggPSAwOwotICAgIGRldi0+Y3VyX3R4ID0gMDsKLQotCWRldi0+cnhfYnVmX3N6ID0gUEtUX0JVRl9TWjsKLQlkZXYtPnJ4X2hlYWRfZGVzYyA9ICZkZXYtPnJ4X3JpbmdbMF07Ci0KLQkvKiBJbml0aWFsaXplIGFsbCBSeCBkZXNjcmlwdG9ycy4gKi8KLQlmb3IgKGkgPSAwOyBpIDwgUlhfUklOR19TSVpFOyBpKyspIHsKLQkJZGV2LT5yeF9yaW5nW2ldLm5leHRfZGVzYyA9IHZpcnRfdG9fbGUzMmRlc2MoJmRldi0+cnhfcmluZ1tpKzFdKTsKLQkJZGV2LT5yeF9yaW5nW2ldLmNtZF9zdGF0dXMgPSBEZXNjT3duOwotCX0KLQkvKiBNYXJrIHRoZSBsYXN0IGVudHJ5IGFzIHdyYXBwaW5nIHRoZSByaW5nLiAqLwotCWRldi0+cnhfcmluZ1tpLTFdLm5leHRfZGVzYyA9IHZpcnRfdG9fbGUzMmRlc2MoJmRldi0+cnhfcmluZ1swXSk7Ci0KLQkvKiBGaWxsIGluIHRoZSBSeCBidWZmZXJzLiAgSGFuZGxlIGFsbG9jYXRpb24gZmFpbHVyZSBncmFjZWZ1bGx5LiAqLwotCWZvciAoaSA9IDA7IGkgPCBSWF9SSU5HX1NJWkU7IGkrKykgewotCQlkZXYtPnJ4X3JpbmdbaV0uYWRkciA9ICh1MzIpKCZyeF9wYWNrZXRbUEtUX0JVRl9TWiAqIGldKTsKLQkgICAgZGV2LT5yeF9yaW5nW2ldLmNtZF9zdGF0dXMgPSBjcHVfdG9fbGUzMihkZXYtPnJ4X2J1Zl9zeik7Ci0JfQotCi0JZm9yIChpID0gMDsgaSA8IFRYX1JJTkdfU0laRTsgaSsrKSB7Ci0JCWRldi0+dHhfcmluZ1tpXS5uZXh0X2Rlc2MgPSB2aXJ0X3RvX2xlMzJkZXNjKCZkZXYtPnR4X3JpbmdbaSsxXSk7Ci0JCWRldi0+dHhfcmluZ1tpXS5jbWRfc3RhdHVzID0gMDsKLQl9Ci0JZGV2LT50eF9yaW5nW2ktMV0ubmV4dF9kZXNjID0gdmlydF90b19sZTMyZGVzYygmZGV2LT50eF9yaW5nWzBdKTsKLQotCWZvciAoaSA9IDA7IGkgPCBUWF9SSU5HX1NJWkU7IGkrKykKLQkJZGV2LT50eF9yaW5nW2ldLmFkZHIgPSAodTMyKSgmdHhfcGFja2V0W1BLVF9CVUZfU1ogKiBpXSk7Ci0JcmV0dXJuOwotfQotCmRpZmYgLU5hdXIgZ3J1Yi0wLjk3Lm9yaWcvbmV0Ym9vdC9mb3JjZWRldGguYyBncnViLTAuOTcvbmV0Ym9vdC9mb3JjZWRldGguYwotLS0gZ3J1Yi0wLjk3Lm9yaWcvbmV0Ym9vdC9mb3JjZWRldGguYwkxOTcwLTAxLTAxIDAwOjAwOjAwLjAwMDAwMDAwMCArMDAwMAorKysgZ3J1Yi0wLjk3L25ldGJvb3QvZm9yY2VkZXRoLmMJMjAwNS0wOC0zMSAxOTowMzozNS4wMDAwMDAwMDAgKzAwMDAKQEAgLTAsMCArMSwxMDM5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogICAgZm9yY2VkZXRoLmMgLS0gRXRoZXJib290IGRldmljZSBkcml2ZXIgZm9yIHRoZSBOVklESUEgbkZvcmNlIAorKgkJCW1lZGlhIGFjY2VzcyBjb250cm9sbGVycy4KKyoKKyogTm90ZTogVGhpcyBkcml2ZXIgaXMgYmFzZWQgb24gdGhlIExpbnV4IGRyaXZlciB0aGF0IHdhcyBiYXNlZCBvbgorKiAgICAgIGEgY2xlYW5yb29tIHJlaW1wbGVtZW50YXRpb24gd2hpY2ggd2FzIGJhc2VkIG9uIHJldmVyc2UKKyogICAgICBlbmdpbmVlcmVkIGRvY3VtZW50YXRpb24gd3JpdHRlbiBieSBDYXJsLURhbmllbCBIYWlsZmluZ2VyCisqICAgICAgYW5kIEFuZHJldyBkZSBRdWluY2V5LiBJdCdzIG5laXRoZXIgc3VwcG9ydGVkIG5vciBlbmRvcnNlZAorKiAgICAgIGJ5IE5WSURJQSBDb3JwLiBVc2UgYXQgeW91ciBvd24gcmlzay4KKyoKKyogICAgV3JpdHRlbiAyMDA0IGJ5IFRpbW90aHkgTGVnZ2UgPHRsZWdnZUByb2dlcnMuY29tPgorKgorKiAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorKiAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorKiAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKiAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorKgorKiAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyogICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyogICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorKiAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorKgorKiAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorKiAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorKiAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyoKKyogICAgUG9ydGlvbnMgb2YgdGhpcyBjb2RlIGJhc2VkIG9uOgorKgkJZm9yY2VkZXRoOiBFdGhlcm5ldCBkcml2ZXIgZm9yIE5WSURJQSBuRm9yY2UgbWVkaWEgYWNjZXNzIGNvbnRyb2xsZXJzOgorKgorKgkoQykgMjAwMyBNYW5mcmVkIFNwcmF1bAorKgkJU2VlIExpbnV4IERyaXZlciBmb3IgZnVsbCBpbmZvcm1hdGlvbgorKgkKKyoJTGludXggRHJpdmVyIFZlcnNpb24gMC4yMiwgMTkgSmFuIDIwMDQKKyogCisqIAorKiAgICBSRVZJU0lPTiBISVNUT1JZOgorKiAgICA9PT09PT09PT09PT09PT09CisqICAgIHYxLjAJMDEtMzEtMjAwNAl0aW1sZWdnZQlJbml0aWFsIHBvcnQgb2YgTGludXggZHJpdmVyCisqICAgIHYxLjEJMDItMDMtMjAwNAl0aW1sZWdnZQlMYXJnZSBDbGVhbiB1cCwgZmlyc3QgcmVsZWFzZSAKKyogICAgCisqICAgIEluZGVudCBPcHRpb25zOiBpbmRlbnQgLWtyIC1pOAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiB0byBnZXQgc29tZSBnbG9iYWwgcm91dGluZXMgbGlrZSBwcmludGYgKi8KKyNpbmNsdWRlICJldGhlcmJvb3QuaCIKKy8qIHRvIGdldCB0aGUgaW50ZXJmYWNlIHRvIHRoZSBib2R5IG9mIHRoZSBwcm9ncmFtICovCisjaW5jbHVkZSAibmljLmgiCisvKiB0byBnZXQgdGhlIFBDSSBzdXBwb3J0IGZ1bmN0aW9ucywgaWYgdGhpcyBpcyBhIFBDSSBOSUMgKi8KKyNpbmNsdWRlICJwY2kuaCIKKy8qIEluY2x1ZGUgdGltZXIgc3VwcG9ydCBmdW5jdGlvbnMgKi8KKyNpbmNsdWRlICJ0aW1lci5oIgorCisjZGVmaW5lIGRydl92ZXJzaW9uICJ2MS4xIgorI2RlZmluZSBkcnZfZGF0ZSAiMDItMDMtMjAwNCIKKworLy8jZGVmaW5lIFRGVE1fREVCVUcKKyNpZmRlZiBURlRNX0RFQlVHCisjZGVmaW5lIGRwcmludGYoeCkgcHJpbnRmIHgKKyNlbHNlCisjZGVmaW5lIGRwcmludGYoeCkKKyNlbmRpZgorCit0eXBlZGVmIHVuc2lnbmVkIGNoYXIgdTg7Cit0eXBlZGVmIHNpZ25lZCBjaGFyIHM4OwordHlwZWRlZiB1bnNpZ25lZCBzaG9ydCB1MTY7Cit0eXBlZGVmIHNpZ25lZCBzaG9ydCBzMTY7Cit0eXBlZGVmIHVuc2lnbmVkIGludCB1MzI7Cit0eXBlZGVmIHNpZ25lZCBpbnQgczMyOworCisvKiBDb25kZW5zZWQgb3BlcmF0aW9ucyBmb3IgcmVhZGFiaWxpdHkuICovCisjZGVmaW5lIHZpcnRfdG9fbGUzMmRlc2MoYWRkcikgIGNwdV90b19sZTMyKHZpcnRfdG9fYnVzKGFkZHIpKQorI2RlZmluZSBsZTMyZGVzY190b192aXJ0KGFkZHIpICBidXNfdG9fdmlydChsZTMyX3RvX2NwdShhZGRyKSkKKwordW5zaWduZWQgbG9uZyBCQVNFOworLyogTklDIHNwZWNpZmljIHN0YXRpYyB2YXJpYWJsZXMgZ28gaGVyZSAqLworCisKKy8qCisgKiBIYXJkd2FyZSBhY2Nlc3M6CisgKi8KKworI2RlZmluZSBERVZfTkVFRF9MQVNUUEFDS0VUMQkweDAwMDEKKyNkZWZpbmUgREVWX0lSUU1BU0tfMQkJMHgwMDAyCisjZGVmaW5lIERFVl9JUlFNQVNLXzIJCTB4MDAwNAorI2RlZmluZSBERVZfTkVFRF9USU1FUklSUQkweDAwMDgKKworZW51bSB7CisJTnZSZWdJcnFTdGF0dXMgPSAweDAwMCwKKyNkZWZpbmUgTlZSRUdfSVJRU1RBVF9NSUlFVkVOVAkwMDQwCisjZGVmaW5lIE5WUkVHX0lSUVNUQVRfTUFTSwkJMHgxZmYKKwlOdlJlZ0lycU1hc2sgPSAweDAwNCwKKyNkZWZpbmUgTlZSRUdfSVJRX1JYCQkJMHgwMDAyCisjZGVmaW5lIE5WUkVHX0lSUV9SWF9OT0JVRgkJMHgwMDA0CisjZGVmaW5lIE5WUkVHX0lSUV9UWF9FUlIJCTB4MDAwOAorI2RlZmluZSBOVlJFR19JUlFfVFgyCQkJMHgwMDEwCisjZGVmaW5lIE5WUkVHX0lSUV9USU1FUgkJCTB4MDAyMAorI2RlZmluZSBOVlJFR19JUlFfTElOSwkJCTB4MDA0MAorI2RlZmluZSBOVlJFR19JUlFfVFgxCQkJMHgwMTAwCisjZGVmaW5lIE5WUkVHX0lSUU1BU0tfV0FOVEVEXzEJCTB4MDA1ZgorI2RlZmluZSBOVlJFR19JUlFNQVNLX1dBTlRFRF8yCQkweDAxNDcKKyNkZWZpbmUgTlZSRUdfSVJRX1VOS05PV04JCSh+KE5WUkVHX0lSUV9SWHxOVlJFR19JUlFfUlhfTk9CVUZ8TlZSRUdfSVJRX1RYX0VSUnxOVlJFR19JUlFfVFgyfE5WUkVHX0lSUV9USU1FUnxOVlJFR19JUlFfTElOS3xOVlJFR19JUlFfVFgxKSkKKworCU52UmVnVW5rbm93blNldHVwUmVnNiA9IDB4MDA4LAorI2RlZmluZSBOVlJFR19VTktTRVRVUDZfVkFMCQkzCisKKy8qCisgKiBOVlJFR19QT0xMX0RFRkFVTFQgaXMgdGhlIGludGVydmFsIGxlbmd0aCBvZiB0aGUgdGltZXIgc291cmNlIG9uIHRoZSBuaWMKKyAqIE5WUkVHX1BPTExfREVGQVVMVD05NyB3b3VsZCByZXN1bHQgaW4gYW4gaW50ZXJ2YWwgbGVuZ3RoIG9mIDEgbXMKKyAqLworCU52UmVnUG9sbGluZ0ludGVydmFsID0gMHgwMGMsCisjZGVmaW5lIE5WUkVHX1BPTExfREVGQVVMVAk5NzAKKwlOdlJlZ01pc2MxID0gMHgwODAsCisjZGVmaW5lIE5WUkVHX01JU0MxX0hECQkweDAyCisjZGVmaW5lIE5WUkVHX01JU0MxX0ZPUkNFCTB4M2IwZjNjCisKKwlOdlJlZ1RyYW5zbWl0dGVyQ29udHJvbCA9IDB4MDg0LAorI2RlZmluZSBOVlJFR19YTUlUQ1RMX1NUQVJUCTB4MDEKKwlOdlJlZ1RyYW5zbWl0dGVyU3RhdHVzID0gMHgwODgsCisjZGVmaW5lIE5WUkVHX1hNSVRTVEFUX0JVU1kJMHgwMQorCisJTnZSZWdQYWNrZXRGaWx0ZXJGbGFncyA9IDB4OGMsCisjZGVmaW5lIE5WUkVHX1BGRl9BTFdBWVMJMHg3RjAwMDgKKyNkZWZpbmUgTlZSRUdfUEZGX1BST01JU0MJMHg4MAorI2RlZmluZSBOVlJFR19QRkZfTVlBRERSCTB4MjAKKworCU52UmVnT2ZmbG9hZENvbmZpZyA9IDB4OTAsCisjZGVmaW5lIE5WUkVHX09GRkxPQURfSE9NRVBIWQkweDYwMQorI2RlZmluZSBOVlJFR19PRkZMT0FEX05PUk1BTAkweDVlZQorCU52UmVnUmVjZWl2ZXJDb250cm9sID0gMHgwOTQsCisjZGVmaW5lIE5WUkVHX1JDVkNUTF9TVEFSVAkweDAxCisJTnZSZWdSZWNlaXZlclN0YXR1cyA9IDB4OTgsCisjZGVmaW5lIE5WUkVHX1JDVlNUQVRfQlVTWQkweDAxCisKKwlOdlJlZ1JhbmRvbVNlZWQgPSAweDljLAorI2RlZmluZSBOVlJFR19STkRTRUVEX01BU0sJMHgwMGZmCisjZGVmaW5lIE5WUkVHX1JORFNFRURfRk9SQ0UJMHg3ZjAwCisKKwlOdlJlZ1Vua25vd25TZXR1cFJlZzEgPSAweEEwLAorI2RlZmluZSBOVlJFR19VTktTRVRVUDFfVkFMCTB4MTYwNzBmCisJTnZSZWdVbmtub3duU2V0dXBSZWcyID0gMHhBNCwKKyNkZWZpbmUgTlZSRUdfVU5LU0VUVVAyX1ZBTAkweDE2CisJTnZSZWdNYWNBZGRyQSA9IDB4QTgsCisJTnZSZWdNYWNBZGRyQiA9IDB4QUMsCisJTnZSZWdNdWx0aWNhc3RBZGRyQSA9IDB4QjAsCisjZGVmaW5lIE5WUkVHX01DQVNUQUREUkFfRk9SQ0UJMHgwMQorCU52UmVnTXVsdGljYXN0QWRkckIgPSAweEI0LAorCU52UmVnTXVsdGljYXN0TWFza0EgPSAweEI4LAorCU52UmVnTXVsdGljYXN0TWFza0IgPSAweEJDLAorCisJTnZSZWdUeFJpbmdQaHlzQWRkciA9IDB4MTAwLAorCU52UmVnUnhSaW5nUGh5c0FkZHIgPSAweDEwNCwKKwlOdlJlZ1JpbmdTaXplcyA9IDB4MTA4LAorI2RlZmluZSBOVlJFR19SSU5HU1pfVFhTSElGVCAwCisjZGVmaW5lIE5WUkVHX1JJTkdTWl9SWFNISUZUIDE2CisJTnZSZWdVbmtub3duVHJhbnNtaXR0ZXJSZWcgPSAweDEwYywKKwlOdlJlZ0xpbmtTcGVlZCA9IDB4MTEwLAorI2RlZmluZSBOVlJFR19MSU5LU1BFRURfRk9SQ0UgMHgxMDAwMAorI2RlZmluZSBOVlJFR19MSU5LU1BFRURfMTAJMTAKKyNkZWZpbmUgTlZSRUdfTElOS1NQRUVEXzEwMAkxMDAKKyNkZWZpbmUgTlZSRUdfTElOS1NQRUVEXzEwMDAJMTAwMAorCU52UmVnVW5rbm93blNldHVwUmVnNSA9IDB4MTMwLAorI2RlZmluZSBOVlJFR19VTktTRVRVUDVfQklUMzEJKDE8PDMxKQorCU52UmVnVW5rbm93blNldHVwUmVnMyA9IDB4MTM0LAorI2RlZmluZSBOVlJFR19VTktTRVRVUDNfVkFMMQkweDIwMDAxMAorCU52UmVnVHhSeENvbnRyb2wgPSAweDE0NCwKKyNkZWZpbmUgTlZSRUdfVFhSWENUTF9LSUNLCTB4MDAwMQorI2RlZmluZSBOVlJFR19UWFJYQ1RMX0JJVDEJMHgwMDAyCisjZGVmaW5lIE5WUkVHX1RYUlhDVExfQklUMgkweDAwMDQKKyNkZWZpbmUgTlZSRUdfVFhSWENUTF9JRExFCTB4MDAwOAorI2RlZmluZSBOVlJFR19UWFJYQ1RMX1JFU0VUCTB4MDAxMAorCU52UmVnTUlJU3RhdHVzID0gMHgxODAsCisjZGVmaW5lIE5WUkVHX01JSVNUQVRfRVJST1IJCTB4MDAwMQorI2RlZmluZSBOVlJFR19NSUlTVEFUX0xJTktDSEFOR0UJMHgwMDA4CisjZGVmaW5lIE5WUkVHX01JSVNUQVRfTUFTSwkJMHgwMDBmCisjZGVmaW5lIE5WUkVHX01JSVNUQVRfTUFTSzIJCTB4MDAwZgorCU52UmVnVW5rbm93blNldHVwUmVnNCA9IDB4MTg0LAorI2RlZmluZSBOVlJFR19VTktTRVRVUDRfVkFMCTgKKworCU52UmVnQWRhcHRlckNvbnRyb2wgPSAweDE4OCwKKyNkZWZpbmUgTlZSRUdfQURBUFRDVExfU1RBUlQJMHgwMgorI2RlZmluZSBOVlJFR19BREFQVENUTF9MSU5LVVAJMHgwNAorI2RlZmluZSBOVlJFR19BREFQVENUTF9QSFlWQUxJRAkweDQwMDAKKyNkZWZpbmUgTlZSRUdfQURBUFRDVExfUlVOTklORwkweDEwMDAwMAorI2RlZmluZSBOVlJFR19BREFQVENUTF9QSFlTSElGVAkyNAorCU52UmVnTUlJU3BlZWQgPSAweDE4YywKKyNkZWZpbmUgTlZSRUdfTUlJU1BFRURfQklUOAkoMTw8OCkKKyNkZWZpbmUgTlZSRUdfTUlJREVMQVkJNQorCU52UmVnTUlJQ29udHJvbCA9IDB4MTkwLAorI2RlZmluZSBOVlJFR19NSUlDVExfSU5VU0UJMHgxMDAwMAorI2RlZmluZSBOVlJFR19NSUlDVExfV1JJVEUJMHgwODAwMAorI2RlZmluZSBOVlJFR19NSUlDVExfQUREUlNISUZUCTUKKwlOdlJlZ01JSURhdGEgPSAweDE5NCwKKwlOdlJlZ1dha2VVcEZsYWdzID0gMHgyMDAsCisjZGVmaW5lIE5WUkVHX1dBS0VVUEZMQUdTX1ZBTAkJMHg3NzcwCisjZGVmaW5lIE5WUkVHX1dBS0VVUEZMQUdTX0JVU1lTSElGVAkyNAorI2RlZmluZSBOVlJFR19XQUtFVVBGTEFHU19FTkFCTEVTSElGVAkxNgorI2RlZmluZSBOVlJFR19XQUtFVVBGTEFHU19EM1NISUZUCTEyCisjZGVmaW5lIE5WUkVHX1dBS0VVUEZMQUdTX0QyU0hJRlQJOAorI2RlZmluZSBOVlJFR19XQUtFVVBGTEFHU19EMVNISUZUCTQKKyNkZWZpbmUgTlZSRUdfV0FLRVVQRkxBR1NfRDBTSElGVAkwCisjZGVmaW5lIE5WUkVHX1dBS0VVUEZMQUdTX0FDQ0VQVF9NQUdQQVQJCTB4MDEKKyNkZWZpbmUgTlZSRUdfV0FLRVVQRkxBR1NfQUNDRVBUX1dBS0VVUFBBVAkweDAyCisjZGVmaW5lIE5WUkVHX1dBS0VVUEZMQUdTX0FDQ0VQVF9MSU5LQ0hBTkdFCTB4MDQKKworCU52UmVnUGF0dGVybkNSQyA9IDB4MjA0LAorCU52UmVnUGF0dGVybk1hc2sgPSAweDIwOCwKKwlOdlJlZ1Bvd2VyQ2FwID0gMHgyNjgsCisjZGVmaW5lIE5WUkVHX1BPV0VSQ0FQX0QzU1VQUAkoMTw8MzApCisjZGVmaW5lIE5WUkVHX1BPV0VSQ0FQX0QyU1VQUAkoMTw8MjYpCisjZGVmaW5lIE5WUkVHX1BPV0VSQ0FQX0QxU1VQUAkoMTw8MjUpCisJTnZSZWdQb3dlclN0YXRlID0gMHgyNmMsCisjZGVmaW5lIE5WUkVHX1BPV0VSU1RBVEVfUE9XRVJFRFVQCTB4ODAwMAorI2RlZmluZSBOVlJFR19QT1dFUlNUQVRFX1ZBTElECQkweDAxMDAKKyNkZWZpbmUgTlZSRUdfUE9XRVJTVEFURV9NQVNLCQkweDAwMDMKKyNkZWZpbmUgTlZSRUdfUE9XRVJTVEFURV9EMAkJMHgwMDAwCisjZGVmaW5lIE5WUkVHX1BPV0VSU1RBVEVfRDEJCTB4MDAwMQorI2RlZmluZSBOVlJFR19QT1dFUlNUQVRFX0QyCQkweDAwMDIKKyNkZWZpbmUgTlZSRUdfUE9XRVJTVEFURV9EMwkJMHgwMDAzCit9OworCisKKworI2RlZmluZSBOVl9UWF9MQVNUUEFDS0VUCSgxPDwwKQorI2RlZmluZSBOVl9UWF9SRVRSWUVSUk9SCSgxPDwzKQorI2RlZmluZSBOVl9UWF9MQVNUUEFDS0VUMQkoMTw8OCkKKyNkZWZpbmUgTlZfVFhfREVGRVJSRUQJCSgxPDwxMCkKKyNkZWZpbmUgTlZfVFhfQ0FSUklFUkxPU1QJKDE8PDExKQorI2RlZmluZSBOVl9UWF9MQVRFQ09MTElTSU9OCSgxPDwxMikKKyNkZWZpbmUgTlZfVFhfVU5ERVJGTE9XCQkoMTw8MTMpCisjZGVmaW5lIE5WX1RYX0VSUk9SCQkoMTw8MTQpCisjZGVmaW5lIE5WX1RYX1ZBTElECQkoMTw8MTUpCisKKyNkZWZpbmUgTlZfUlhfREVTQ1JJUFRPUlZBTElECSgxPDwwKQorI2RlZmluZSBOVl9SWF9NSVNTRURGUkFNRQkoMTw8MSkKKyNkZWZpbmUgTlZfUlhfU1VCU1RSQUNUMQkoMTw8MykKKyNkZWZpbmUgTlZfUlhfRVJST1IxCQkoMTw8NykKKyNkZWZpbmUgTlZfUlhfRVJST1IyCQkoMTw8OCkKKyNkZWZpbmUgTlZfUlhfRVJST1IzCQkoMTw8OSkKKyNkZWZpbmUgTlZfUlhfRVJST1I0CQkoMTw8MTApCisjZGVmaW5lIE5WX1JYX0NSQ0VSUgkJKDE8PDExKQorI2RlZmluZSBOVl9SWF9PVkVSRkxPVwkJKDE8PDEyKQorI2RlZmluZSBOVl9SWF9GUkFNSU5HRVJSCSgxPDwxMykKKyNkZWZpbmUgTlZfUlhfRVJST1IJCSgxPDwxNCkKKyNkZWZpbmUgTlZfUlhfQVZBSUwJCSgxPDwxNSkKKworLyogTWlzY2VsYW5lb3VzIGhhcmR3YXJlIHJlbGF0ZWQgZGVmaW5lczogKi8KKyNkZWZpbmUgTlZfUENJX1JFR1NaCQkweDI3MAorCisvKiB2YXJpb3VzIHRpbWVvdXQgZGVsYXlzOiBhbGwgaW4gdXNlYyAqLworI2RlZmluZSBOVl9UWFJYX1JFU0VUX0RFTEFZCTQKKyNkZWZpbmUgTlZfVFhTVE9QX0RFTEFZMQkxMAorI2RlZmluZSBOVl9UWFNUT1BfREVMQVkxTUFYCTUwMDAwMAorI2RlZmluZSBOVl9UWFNUT1BfREVMQVkyCTEwMAorI2RlZmluZSBOVl9SWFNUT1BfREVMQVkxCTEwCisjZGVmaW5lIE5WX1JYU1RPUF9ERUxBWTFNQVgJNTAwMDAwCisjZGVmaW5lIE5WX1JYU1RPUF9ERUxBWTIJMTAwCisjZGVmaW5lIE5WX1NFVFVQNV9ERUxBWQkJNQorI2RlZmluZSBOVl9TRVRVUDVfREVMQVlNQVgJNTAwMDAKKyNkZWZpbmUgTlZfUE9XRVJVUF9ERUxBWQk1CisjZGVmaW5lIE5WX1BPV0VSVVBfREVMQVlNQVgJNTAwMAorI2RlZmluZSBOVl9NSUlCVVNZX0RFTEFZCTUwCisjZGVmaW5lIE5WX01JSVBIWV9ERUxBWQkxMAorI2RlZmluZSBOVl9NSUlQSFlfREVMQVlNQVgJMTAwMDAKKworI2RlZmluZSBOVl9XQUtFVVBQQVRURVJOUwk1CisjZGVmaW5lIE5WX1dBS0VVUE1BU0tFTlRSSUVTCTQKKworLyogR2VuZXJhbCBkcml2ZXIgZGVmYXVsdHMgKi8KKyNkZWZpbmUgTlZfV0FUQ0hET0dfVElNRU8JKDIqSFopCisjZGVmaW5lIERFRkFVTFRfTVRVCQkxNTAwCS8qIGFsc28gbWF4aW11bSBzdXBwb3J0ZWQsIGF0IGxlYXN0IGZvciBub3cgKi8KKworI2RlZmluZSBSWF9SSU5HCQk0CisjZGVmaW5lIFRYX1JJTkcJCTIKKy8qIGxpbWl0ZWQgdG8gMSBwYWNrZXQgdW50aWwgd2UgdW5kZXJzdGFuZCBOVl9UWF9MQVNUUEFDS0VUICovCisjZGVmaW5lIFRYX0xJTUlUX1NUT1AJMTAKKyNkZWZpbmUgVFhfTElNSVRfU1RBUlQJNQorCisvKiByeC90eCBtYWMgYWRkciArIHR5cGUgKyB2bGFuICsgYWxpZ24gKyBzbGFjayovCisjZGVmaW5lIFJYX05JQ19CVUZTSVpFCQkoREVGQVVMVF9NVFUgKyA2NCkKKy8qIGV2ZW4gbW9yZSBzbGFjayAqLworI2RlZmluZSBSWF9BTExPQ19CVUZTSVpFCShERUZBVUxUX01UVSArIDEyOCkKKworI2RlZmluZSBPT01fUkVGSUxMCSgxK0haLzIwKQorI2RlZmluZSBQT0xMX1dBSVQJKDErSFovMTAwKQorCitzdHJ1Y3QgcmluZ19kZXNjIHsKKwl1MzIgUGFja2V0QnVmZmVyOworCXUxNiBMZW5ndGg7CisJdTE2IEZsYWdzOworfTsKKworCisvKiBEZWZpbmUgdGhlIFRYIERlc2NyaXB0b3IgKi8KK3N0YXRpYyBzdHJ1Y3QgcmluZ19kZXNjIHR4X3JpbmdbVFhfUklOR107CisKKy8qIENyZWF0ZSBhIHN0YXRpYyBidWZmZXIgb2Ygc2l6ZSBSWF9CVUZfU1ogZm9yIGVhY2gKK1RYIERlc2NyaXB0b3IuICBBbGwgZGVzY3JpcHRvcnMgcG9pbnQgdG8gYQorcGFydCBvZiB0aGlzIGJ1ZmZlciAqLworc3RhdGljIHVuc2lnbmVkIGNoYXIgdHhiW1RYX1JJTkcgKiBSWF9OSUNfQlVGU0laRV07CisKKy8qIERlZmluZSB0aGUgVFggRGVzY3JpcHRvciAqLworc3RhdGljIHN0cnVjdCByaW5nX2Rlc2MgcnhfcmluZ1tSWF9SSU5HXTsKKworLyogQ3JlYXRlIGEgc3RhdGljIGJ1ZmZlciBvZiBzaXplIFJYX0JVRl9TWiBmb3IgZWFjaAorUlggRGVzY3JpcHRvciAgIEFsbCBkZXNjcmlwdG9ycyBwb2ludCB0byBhCitwYXJ0IG9mIHRoaXMgYnVmZmVyICovCitzdGF0aWMgdW5zaWduZWQgY2hhciByeGJbUlhfUklORyAqIFJYX05JQ19CVUZTSVpFXTsKKworLyogUHJpdmF0ZSBTdG9yYWdlIGZvciB0aGUgTklDICovCitzdHJ1Y3QgZm9yY2VkZXRoX3ByaXZhdGUgeworCS8qIEdlbmVyYWwgZGF0YToKKwkgKiBMb2NraW5nOiBzcGluX2xvY2soJm5wLT5sb2NrKTsgKi8KKwlpbnQgaW5fc2h1dGRvd247CisJdTMyIGxpbmtzcGVlZDsKKwlpbnQgZHVwbGV4OworCWludCBwaHlhZGRyOworCisJLyogR2VuZXJhbCBkYXRhOiBSTyBmaWVsZHMgKi8KKwl1OCAqcmluZ19hZGRyOworCXUzMiBvcmlnX21hY1syXTsKKwl1MzIgaXJxbWFzazsKKwkvKiByeCBzcGVjaWZpYyBmaWVsZHMuCisJICogTG9ja2luZzogV2l0aGluIGlycSBoYW5kZXIgb3IgZGlzYWJsZV9pcnErc3Bpbl9sb2NrKCZucC0+bG9jayk7CisJICovCisJc3RydWN0IHJpbmdfZGVzYyAqcnhfcmluZzsKKwl1bnNpZ25lZCBpbnQgY3VyX3J4LCByZWZpbGxfcng7CisJc3RydWN0IHNrX2J1ZmYgKnJ4X3NrYnVmZltSWF9SSU5HXTsKKwl1MzIgcnhfZG1hW1JYX1JJTkddOworCXVuc2lnbmVkIGludCByeF9idWZfc3o7CisKKwkvKgorCSAqIHR4IHNwZWNpZmljIGZpZWxkcy4KKwkgKi8KKwlzdHJ1Y3QgcmluZ19kZXNjICp0eF9yaW5nOworCXVuc2lnbmVkIGludCBuZXh0X3R4LCBuaWNfdHg7CisJc3RydWN0IHNrX2J1ZmYgKnR4X3NrYnVmZltUWF9SSU5HXTsKKwl1MzIgdHhfZG1hW1RYX1JJTkddOworCXUxNiB0eF9mbGFnczsKK30gbnB4OworCitzdGF0aWMgc3RydWN0IGZvcmNlZGV0aF9wcml2YXRlICpucDsKKworc3RhdGljIGlubGluZSB2b2lkIHBjaV9wdXNoKHU4ICogYmFzZSkKK3sKKwkvKiBmb3JjZSBvdXQgcGVuZGluZyBwb3N0ZWQgd3JpdGVzICovCisJcmVhZGwoYmFzZSk7Cit9CitzdGF0aWMgaW50IHJlZ19kZWxheShpbnQgb2Zmc2V0LCB1MzIgbWFzaywKKwkJICAgICB1MzIgdGFyZ2V0LCBpbnQgZGVsYXksIGludCBkZWxheW1heCwgY29uc3QgY2hhciAqbXNnKQoreworCXU4ICpiYXNlID0gKHU4ICopIEJBU0U7CisKKwlwY2lfcHVzaChiYXNlKTsKKwlkbyB7CisJCXVkZWxheShkZWxheSk7CisJCWRlbGF5bWF4IC09IGRlbGF5OworCQlpZiAoZGVsYXltYXggPCAwKSB7CisJCQlpZiAobXNnKQorCQkJCXByaW50Zihtc2cpOworCQkJcmV0dXJuIDE7CisJCX0KKwl9IHdoaWxlICgocmVhZGwoYmFzZSArIG9mZnNldCkgJiBtYXNrKSAhPSB0YXJnZXQpOworCXJldHVybiAwOworfQorCisjZGVmaW5lIE1JSV9SRUFECSgtMSkKKyNkZWZpbmUgTUlJX1BIWVNJRDEgICAgICAgICAweDAyCS8qIFBIWVMgSUQgMSAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBNSUlfUEhZU0lEMiAgICAgICAgIDB4MDMJLyogUEhZUyBJRCAyICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIE1JSV9CTUNSICAgICAgICAgICAgMHgwMAkvKiBCYXNpYyBtb2RlIGNvbnRyb2wgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgTUlJX0JNU1IgICAgICAgICAgICAweDAxCS8qIEJhc2ljIG1vZGUgc3RhdHVzIHJlZ2lzdGVyICAqLworI2RlZmluZSBNSUlfQURWRVJUSVNFICAgICAgIDB4MDQJLyogQWR2ZXJ0aXNlbWVudCBjb250cm9sIHJlZyAgICovCisjZGVmaW5lIE1JSV9MUEEgICAgICAgICAgICAgMHgwNQkvKiBMaW5rIHBhcnRuZXIgYWJpbGl0eSByZWcgICAgKi8KKworI2RlZmluZSBCTVNSX0FORUdDT01QTEVURSAgICAgICAweDAwMjAJLyogQXV0by1uZWdvdGlhdGlvbiBjb21wbGV0ZSAgICovCisKKy8qIExpbmsgcGFydG5lciBhYmlsaXR5IHJlZ2lzdGVyLiAqLworI2RlZmluZSBMUEFfU0xDVCAgICAgICAgICAgICAgICAweDAwMWYJLyogU2FtZSBhcyBhZHZlcnRpc2Ugc2VsZWN0b3IgICovCisjZGVmaW5lIExQQV8xMEhBTEYgICAgICAgICAgICAgIDB4MDAyMAkvKiBDYW4gZG8gMTBtYnBzIGhhbGYtZHVwbGV4ICAgKi8KKyNkZWZpbmUgTFBBXzEwRlVMTCAgICAgICAgICAgICAgMHgwMDQwCS8qIENhbiBkbyAxMG1icHMgZnVsbC1kdXBsZXggICAqLworI2RlZmluZSBMUEFfMTAwSEFMRiAgICAgICAgICAgICAweDAwODAJLyogQ2FuIGRvIDEwMG1icHMgaGFsZi1kdXBsZXggICovCisjZGVmaW5lIExQQV8xMDBGVUxMICAgICAgICAgICAgIDB4MDEwMAkvKiBDYW4gZG8gMTAwbWJwcyBmdWxsLWR1cGxleCAgKi8KKyNkZWZpbmUgTFBBXzEwMEJBU0U0ICAgICAgICAgICAgMHgwMjAwCS8qIENhbiBkbyAxMDBtYnBzIDRrIHBhY2tldHMgICAqLworI2RlZmluZSBMUEFfUkVTViAgICAgICAgICAgICAgICAweDFjMDAJLyogVW51c2VkLi4uICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIExQQV9SRkFVTFQgICAgICAgICAgICAgIDB4MjAwMAkvKiBMaW5rIHBhcnRuZXIgZmF1bHRlZCAgICAgICAgKi8KKyNkZWZpbmUgTFBBX0xQQUNLICAgICAgICAgICAgICAgMHg0MDAwCS8qIExpbmsgcGFydG5lciBhY2tlZCB1cyAgICAgICAqLworI2RlZmluZSBMUEFfTlBBR0UgICAgICAgICAgICAgICAweDgwMDAJLyogTmV4dCBwYWdlIGJpdCAgICAgICAgICAgICAgICovCisKKy8qIG1paV9ydzogcmVhZC93cml0ZSBhIHJlZ2lzdGVyIG9uIHRoZSBQSFkuCisgKgorICogQ2FsbGVyIG11c3QgZ3VhcmFudGVlIHNlcmlhbGl6YXRpb24KKyAqLworc3RhdGljIGludCBtaWlfcncoc3RydWN0IG5pYyAqbmljIF9fdW51c2VkLCBpbnQgYWRkciwgaW50IG1paXJlZywKKwkJICBpbnQgdmFsdWUpCit7CisJdTggKmJhc2UgPSAodTggKikgQkFTRTsKKwlpbnQgd2FzX3J1bm5pbmc7CisJdTMyIHJlZzsKKwlpbnQgcmV0dmFsOworCisJd3JpdGVsKE5WUkVHX01JSVNUQVRfTUFTSywgYmFzZSArIE52UmVnTUlJU3RhdHVzKTsKKwl3YXNfcnVubmluZyA9IDA7CisJcmVnID0gcmVhZGwoYmFzZSArIE52UmVnQWRhcHRlckNvbnRyb2wpOworCWlmIChyZWcgJiBOVlJFR19BREFQVENUTF9SVU5OSU5HKSB7CisJCXdhc19ydW5uaW5nID0gMTsKKwkJd3JpdGVsKHJlZyAmIH5OVlJFR19BREFQVENUTF9SVU5OSU5HLAorCQkgICAgICAgYmFzZSArIE52UmVnQWRhcHRlckNvbnRyb2wpOworCX0KKwlyZWcgPSByZWFkbChiYXNlICsgTnZSZWdNSUlDb250cm9sKTsKKwlpZiAocmVnICYgTlZSRUdfTUlJQ1RMX0lOVVNFKSB7CisJCXdyaXRlbChOVlJFR19NSUlDVExfSU5VU0UsIGJhc2UgKyBOdlJlZ01JSUNvbnRyb2wpOworCQl1ZGVsYXkoTlZfTUlJQlVTWV9ERUxBWSk7CisJfQorCisJcmVnID0KKwkgICAgTlZSRUdfTUlJQ1RMX0lOVVNFIHwgKGFkZHIgPDwgTlZSRUdfTUlJQ1RMX0FERFJTSElGVCkgfCBtaWlyZWc7CisJaWYgKHZhbHVlICE9IE1JSV9SRUFEKSB7CisJCXdyaXRlbCh2YWx1ZSwgYmFzZSArIE52UmVnTUlJRGF0YSk7CisJCXJlZyB8PSBOVlJFR19NSUlDVExfV1JJVEU7CisJfQorCXdyaXRlbChyZWcsIGJhc2UgKyBOdlJlZ01JSUNvbnRyb2wpOworCisJaWYgKHJlZ19kZWxheShOdlJlZ01JSUNvbnRyb2wsIE5WUkVHX01JSUNUTF9JTlVTRSwgMCwKKwkJICAgICAgTlZfTUlJUEhZX0RFTEFZLCBOVl9NSUlQSFlfREVMQVlNQVgsIE5VTEwpKSB7CisJCWRwcmludGYoKCJtaWlfcncgb2YgcmVnICVkIGF0IFBIWSAlZCB0aW1lZCBvdXQuXG4iLAorCQkJIG1paXJlZywgYWRkcikpOworCQlyZXR2YWwgPSAtMTsKKwl9IGVsc2UgaWYgKHZhbHVlICE9IE1JSV9SRUFEKSB7CisJCS8qIGl0IHdhcyBhIHdyaXRlIG9wZXJhdGlvbiAtIGZld2VyIGZhaWx1cmVzIGFyZSBkZXRlY3RhYmxlICovCisJCWRwcmludGYoKCJtaWlfcncgd3JvdGUgMHgleCB0byByZWcgJWQgYXQgUEhZICVkXG4iLAorCQkJIHZhbHVlLCBtaWlyZWcsIGFkZHIpKTsKKwkJcmV0dmFsID0gMDsKKwl9IGVsc2UgaWYgKHJlYWRsKGJhc2UgKyBOdlJlZ01JSVN0YXR1cykgJiBOVlJFR19NSUlTVEFUX0VSUk9SKSB7CisJCWRwcmludGYoKCJtaWlfcncgb2YgcmVnICVkIGF0IFBIWSAlZCBmYWlsZWQuXG4iLAorCQkJIG1paXJlZywgYWRkcikpOworCQlyZXR2YWwgPSAtMTsKKwl9IGVsc2UgeworCQkvKiBGSVhNRTogd2h5IGlzIHRoYXQgcmVxdWlyZWQ/ICovCisJCXVkZWxheSg1MCk7CisJCXJldHZhbCA9IHJlYWRsKGJhc2UgKyBOdlJlZ01JSURhdGEpOworCQlkcHJpbnRmKCgibWlpX3J3IHJlYWQgZnJvbSByZWcgJWQgYXQgUEhZICVkOiAweCV4LlxuIiwKKwkJCSBtaWlyZWcsIGFkZHIsIHJldHZhbCkpOworCX0KKwlpZiAod2FzX3J1bm5pbmcpIHsKKwkJcmVnID0gcmVhZGwoYmFzZSArIE52UmVnQWRhcHRlckNvbnRyb2wpOworCQl3cml0ZWwocmVnIHwgTlZSRUdfQURBUFRDVExfUlVOTklORywKKwkJICAgICAgIGJhc2UgKyBOdlJlZ0FkYXB0ZXJDb250cm9sKTsKKwl9CisJcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIHZvaWQgc3RhcnRfcngoc3RydWN0IG5pYyAqbmljIF9fdW51c2VkKQoreworCXU4ICpiYXNlID0gKHU4ICopIEJBU0U7CisKKwlkcHJpbnRmKCgic3RhcnRfcnhcbiIpKTsKKwkvKiBBbHJlYWR5IHJ1bm5pbmc/IFN0b3AgaXQuICovCisJaWYgKHJlYWRsKGJhc2UgKyBOdlJlZ1JlY2VpdmVyQ29udHJvbCkgJiBOVlJFR19SQ1ZDVExfU1RBUlQpIHsKKwkJd3JpdGVsKDAsIGJhc2UgKyBOdlJlZ1JlY2VpdmVyQ29udHJvbCk7CisJCXBjaV9wdXNoKGJhc2UpOworCX0KKwl3cml0ZWwobnAtPmxpbmtzcGVlZCwgYmFzZSArIE52UmVnTGlua1NwZWVkKTsKKwlwY2lfcHVzaChiYXNlKTsKKwl3cml0ZWwoTlZSRUdfUkNWQ1RMX1NUQVJULCBiYXNlICsgTnZSZWdSZWNlaXZlckNvbnRyb2wpOworCXBjaV9wdXNoKGJhc2UpOworfQorCitzdGF0aWMgdm9pZCBzdG9wX3J4KHZvaWQpCit7CisJdTggKmJhc2UgPSAodTggKikgQkFTRTsKKworCWRwcmludGYoKCJzdG9wX3J4XG4iKSk7CisJd3JpdGVsKDAsIGJhc2UgKyBOdlJlZ1JlY2VpdmVyQ29udHJvbCk7CisJcmVnX2RlbGF5KE52UmVnUmVjZWl2ZXJTdGF0dXMsIE5WUkVHX1JDVlNUQVRfQlVTWSwgMCwKKwkJICBOVl9SWFNUT1BfREVMQVkxLCBOVl9SWFNUT1BfREVMQVkxTUFYLAorCQkgICJzdG9wX3J4OiBSZWNlaXZlclN0YXR1cyByZW1haW5lZCBidXN5Iik7CisKKwl1ZGVsYXkoTlZfUlhTVE9QX0RFTEFZMik7CisJd3JpdGVsKDAsIGJhc2UgKyBOdlJlZ0xpbmtTcGVlZCk7Cit9CisKK3N0YXRpYyB2b2lkIHN0YXJ0X3R4KHN0cnVjdCBuaWMgKm5pYyBfX3VudXNlZCkKK3sKKwl1OCAqYmFzZSA9ICh1OCAqKSBCQVNFOworCisJZHByaW50ZigoInN0YXJ0X3R4XG4iKSk7CisJd3JpdGVsKE5WUkVHX1hNSVRDVExfU1RBUlQsIGJhc2UgKyBOdlJlZ1RyYW5zbWl0dGVyQ29udHJvbCk7CisJcGNpX3B1c2goYmFzZSk7Cit9CisKK3N0YXRpYyB2b2lkIHN0b3BfdHgodm9pZCkKK3sKKwl1OCAqYmFzZSA9ICh1OCAqKSBCQVNFOworCisJZHByaW50ZigoInN0b3BfdHhcbiIpKTsKKwl3cml0ZWwoMCwgYmFzZSArIE52UmVnVHJhbnNtaXR0ZXJDb250cm9sKTsKKwlyZWdfZGVsYXkoTnZSZWdUcmFuc21pdHRlclN0YXR1cywgTlZSRUdfWE1JVFNUQVRfQlVTWSwgMCwKKwkJICBOVl9UWFNUT1BfREVMQVkxLCBOVl9UWFNUT1BfREVMQVkxTUFYLAorCQkgICJzdG9wX3R4OiBUcmFuc21pdHRlclN0YXR1cyByZW1haW5lZCBidXN5Iik7CisKKwl1ZGVsYXkoTlZfVFhTVE9QX0RFTEFZMik7CisJd3JpdGVsKDAsIGJhc2UgKyBOdlJlZ1Vua25vd25UcmFuc21pdHRlclJlZyk7Cit9CisKKworc3RhdGljIHZvaWQgdHhyeF9yZXNldChzdHJ1Y3QgbmljICpuaWMgX191bnVzZWQpCit7CisJdTggKmJhc2UgPSAodTggKikgQkFTRTsKKworCWRwcmludGYoKCJ0eHJ4X3Jlc2V0XG4iKSk7CisJd3JpdGVsKE5WUkVHX1RYUlhDVExfQklUMiB8IE5WUkVHX1RYUlhDVExfUkVTRVQsCisJICAgICAgIGJhc2UgKyBOdlJlZ1R4UnhDb250cm9sKTsKKwlwY2lfcHVzaChiYXNlKTsKKwl1ZGVsYXkoTlZfVFhSWF9SRVNFVF9ERUxBWSk7CisJd3JpdGVsKE5WUkVHX1RYUlhDVExfQklUMiwgYmFzZSArIE52UmVnVHhSeENvbnRyb2wpOworCXBjaV9wdXNoKGJhc2UpOworfQorCisvKgorICogYWxsb2Nfcng6IGZpbGwgcnggcmluZyBlbnRyaWVzLgorICogUmV0dXJuIDEgaWYgdGhlIGFsbG9jYXRpb25zIGZvciB0aGUgc2ticyBmYWlsZWQgYW5kIHRoZQorICogcnggZW5naW5lIGlzIHdpdGhvdXQgQXZhaWxhYmxlIGRlc2NyaXB0b3JzCisgKi8KK3N0YXRpYyBpbnQgYWxsb2Nfcngoc3RydWN0IG5pYyAqbmljIF9fdW51c2VkKQoreworCXVuc2lnbmVkIGludCByZWZpbGxfcnggPSBucC0+cmVmaWxsX3J4OworCWludCBpOworCS8vd2hpbGUgKG5wLT5jdXJfcnggIT0gcmVmaWxsX3J4KSB7CisJZm9yIChpID0gMDsgaSA8IFJYX1JJTkc7IGkrKykgeworCQkvL2ludCBuciA9IHJlZmlsbF9yeCAlIFJYX1JJTkc7CisJCXJ4X3JpbmdbaV0uUGFja2V0QnVmZmVyID0KKwkJICAgIHZpcnRfdG9fbGUzMmRlc2MoJnJ4YltpICogUlhfTklDX0JVRlNJWkVdKTsKKwkJcnhfcmluZ1tpXS5MZW5ndGggPSBjcHVfdG9fbGUxNihSWF9OSUNfQlVGU0laRSk7CisJCXdtYigpOworCQlyeF9yaW5nW2ldLkZsYWdzID0gY3B1X3RvX2xlMTYoTlZfUlhfQVZBSUwpOworCQkvKiAgICAgIHByaW50ZigiYWxsb2Nfcng6IFBhY2tldCAgJWQgbWFya2VkIGFzIEF2YWlsYWJsZVxuIiwKKwkJICAgcmVmaWxsX3J4KTsgKi8KKwkJcmVmaWxsX3J4Kys7CisJfQorCW5wLT5yZWZpbGxfcnggPSByZWZpbGxfcng7CisJaWYgKG5wLT5jdXJfcnggLSByZWZpbGxfcnggPT0gUlhfUklORykKKwkJcmV0dXJuIDE7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdXBkYXRlX2xpbmtzcGVlZChzdHJ1Y3QgbmljICpuaWMpCit7CisJaW50IGFkdiwgbHBhLCBuZXdkdXA7CisJdTMyIG5ld2xzOworCWFkdiA9IG1paV9ydyhuaWMsIG5wLT5waHlhZGRyLCBNSUlfQURWRVJUSVNFLCBNSUlfUkVBRCk7CisJbHBhID0gbWlpX3J3KG5pYywgbnAtPnBoeWFkZHIsIE1JSV9MUEEsIE1JSV9SRUFEKTsKKwlkcHJpbnRmKCgidXBkYXRlX2xpbmtzcGVlZDogUEhZIGFkdmVydGlzZXMgMHglaFgsIGxwYSAweCVoWC5cbiIsCisJCSBhZHYsIGxwYSkpOworCisJLyogRklYTUU6IGhhbmRsZSBwYXJhbGxlbCBkZXRlY3Rpb24gcHJvcGVybHksIGhhbmRsZSBnaWdhYml0IGV0aGVybmV0ICovCisJbHBhID0gbHBhICYgYWR2OworCWlmIChscGEgJiBMUEFfMTAwRlVMTCkgeworCQluZXdscyA9IE5WUkVHX0xJTktTUEVFRF9GT1JDRSB8IE5WUkVHX0xJTktTUEVFRF8xMDA7CisJCW5ld2R1cCA9IDE7CisJfSBlbHNlIGlmIChscGEgJiBMUEFfMTAwSEFMRikgeworCQluZXdscyA9IE5WUkVHX0xJTktTUEVFRF9GT1JDRSB8IE5WUkVHX0xJTktTUEVFRF8xMDA7CisJCW5ld2R1cCA9IDA7CisJfSBlbHNlIGlmIChscGEgJiBMUEFfMTBGVUxMKSB7CisJCW5ld2xzID0gTlZSRUdfTElOS1NQRUVEX0ZPUkNFIHwgTlZSRUdfTElOS1NQRUVEXzEwOworCQluZXdkdXAgPSAxOworCX0gZWxzZSBpZiAobHBhICYgTFBBXzEwSEFMRikgeworCQluZXdscyA9IE5WUkVHX0xJTktTUEVFRF9GT1JDRSB8IE5WUkVHX0xJTktTUEVFRF8xMDsKKwkJbmV3ZHVwID0gMDsKKwl9IGVsc2UgeworCQlwcmludGYoImJhZCBhYmlsaXR5ICVoWCAtIGZhbGxpbmcgYmFjayB0byAxMEhELlxuIiwgbHBhKTsKKwkJbmV3bHMgPSBOVlJFR19MSU5LU1BFRURfRk9SQ0UgfCBOVlJFR19MSU5LU1BFRURfMTA7CisJCW5ld2R1cCA9IDA7CisJfQorCWlmIChucC0+ZHVwbGV4ICE9IG5ld2R1cCB8fCBucC0+bGlua3NwZWVkICE9IG5ld2xzKSB7CisJCW5wLT5kdXBsZXggPSBuZXdkdXA7CisJCW5wLT5saW5rc3BlZWQgPSBuZXdsczsKKwkJcmV0dXJuIDE7CisJfQorCXJldHVybiAwOworfQorCisKKworc3RhdGljIGludCBpbml0X3Jpbmcoc3RydWN0IG5pYyAqbmljKQoreworCWludCBpOworCisJbnAtPm5leHRfdHggPSBucC0+bmljX3R4ID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgVFhfUklORzsgaSsrKSB7CisJCXR4X3JpbmdbaV0uRmxhZ3MgPSAwOworCX0KKworCW5wLT5jdXJfcnggPSAwOworCW5wLT5yZWZpbGxfcnggPSAwOworCWZvciAoaSA9IDA7IGkgPCBSWF9SSU5HOyBpKyspIHsKKwkJcnhfcmluZ1tpXS5GbGFncyA9IDA7CisJfQorCXJldHVybiBhbGxvY19yeChuaWMpOworfQorCitzdGF0aWMgdm9pZCBzZXRfbXVsdGljYXN0KHN0cnVjdCBuaWMgKm5pYykKK3sKKworCXU4ICpiYXNlID0gKHU4ICopIEJBU0U7CisJdTMyIGFkZHJbMl07CisJdTMyIG1hc2tbMl07CisJdTMyIHBmZjsKKwl1MzIgYWx3YXlzT2ZmWzJdOworCXUzMiBhbHdheXNPblsyXTsKKworCW1lbXNldChhZGRyLCAwLCBzaXplb2YoYWRkcikpOworCW1lbXNldChtYXNrLCAwLCBzaXplb2YobWFzaykpOworCisJcGZmID0gTlZSRUdfUEZGX01ZQUREUjsKKworCWFsd2F5c09uWzBdID0gYWx3YXlzT25bMV0gPSBhbHdheXNPZmZbMF0gPSBhbHdheXNPZmZbMV0gPSAwOworCisJYWRkclswXSA9IGFsd2F5c09uWzBdOworCWFkZHJbMV0gPSBhbHdheXNPblsxXTsKKwltYXNrWzBdID0gYWx3YXlzT25bMF0gfCBhbHdheXNPZmZbMF07CisJbWFza1sxXSA9IGFsd2F5c09uWzFdIHwgYWx3YXlzT2ZmWzFdOworCisJYWRkclswXSB8PSBOVlJFR19NQ0FTVEFERFJBX0ZPUkNFOworCXBmZiB8PSBOVlJFR19QRkZfQUxXQVlTOworCXN0b3BfcngoKTsKKwl3cml0ZWwoYWRkclswXSwgYmFzZSArIE52UmVnTXVsdGljYXN0QWRkckEpOworCXdyaXRlbChhZGRyWzFdLCBiYXNlICsgTnZSZWdNdWx0aWNhc3RBZGRyQik7CisJd3JpdGVsKG1hc2tbMF0sIGJhc2UgKyBOdlJlZ011bHRpY2FzdE1hc2tBKTsKKwl3cml0ZWwobWFza1sxXSwgYmFzZSArIE52UmVnTXVsdGljYXN0TWFza0IpOworCXdyaXRlbChwZmYsIGJhc2UgKyBOdlJlZ1BhY2tldEZpbHRlckZsYWdzKTsKKwlzdGFydF9yeChuaWMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFU0VUIC0gUmVzZXQgdGhlIE5JQyB0byBwcmVwYXJlIGZvciB1c2UKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQgZm9yY2VkZXRoX3Jlc2V0KHN0cnVjdCBuaWMgKm5pYykKK3sKKwl1OCAqYmFzZSA9ICh1OCAqKSBCQVNFOworCWludCByZXQsIG9vbSwgaTsKKwlyZXQgPSAwOworCWRwcmludGYoKCJmb3JjZWRldGg6IG9wZW5cbiIpKTsKKworCS8qIDEpIGVyYXNlIHByZXZpb3VzIG1pc2NvbmZpZ3VyYXRpb24gKi8KKwkvKiA0LjEtMTogc3RvcCBhZGFwdGVyOiBpZ25vcmVkLCA0LjMgc2VlbXMgdG8gYmUgb3ZlcmtpbGwgKi8KKwl3cml0ZWwoTlZSRUdfTUNBU1RBRERSQV9GT1JDRSwgYmFzZSArIE52UmVnTXVsdGljYXN0QWRkckEpOworCXdyaXRlbCgwLCBiYXNlICsgTnZSZWdNdWx0aWNhc3RBZGRyQik7CisJd3JpdGVsKDAsIGJhc2UgKyBOdlJlZ011bHRpY2FzdE1hc2tBKTsKKwl3cml0ZWwoMCwgYmFzZSArIE52UmVnTXVsdGljYXN0TWFza0IpOworCXdyaXRlbCgwLCBiYXNlICsgTnZSZWdQYWNrZXRGaWx0ZXJGbGFncyk7CisJd3JpdGVsKDAsIGJhc2UgKyBOdlJlZ0FkYXB0ZXJDb250cm9sKTsKKwl3cml0ZWwoMCwgYmFzZSArIE52UmVnTGlua1NwZWVkKTsKKwl3cml0ZWwoMCwgYmFzZSArIE52UmVnVW5rbm93blRyYW5zbWl0dGVyUmVnKTsKKwl0eHJ4X3Jlc2V0KG5pYyk7CisJd3JpdGVsKDAsIGJhc2UgKyBOdlJlZ1Vua25vd25TZXR1cFJlZzYpOworCisJLyogMikgaW5pdGlhbGl6ZSBkZXNjcmlwdG9yIHJpbmdzICovCisJbnAtPmluX3NodXRkb3duID0gMDsKKwlvb20gPSBpbml0X3JpbmcobmljKTsKKworCS8qIDMpIHNldCBtYWMgYWRkcmVzcyAqLworCXsKKwkJdTMyIG1hY1syXTsKKworCQltYWNbMF0gPQorCQkgICAgKG5pYy0+bm9kZV9hZGRyWzBdIDw8IDApICsgKG5pYy0+bm9kZV9hZGRyWzFdIDw8IDgpICsKKwkJICAgIChuaWMtPm5vZGVfYWRkclsyXSA8PCAxNikgKyAobmljLT5ub2RlX2FkZHJbM10gPDwgMjQpOworCQltYWNbMV0gPQorCQkgICAgKG5pYy0+bm9kZV9hZGRyWzRdIDw8IDApICsgKG5pYy0+bm9kZV9hZGRyWzVdIDw8IDgpOworCisJCXdyaXRlbChtYWNbMF0sIGJhc2UgKyBOdlJlZ01hY0FkZHJBKTsKKwkJd3JpdGVsKG1hY1sxXSwgYmFzZSArIE52UmVnTWFjQWRkckIpOworCX0KKworCS8qIDQpIGNvbnRpbnVlIHNldHVwICovCisJbnAtPmxpbmtzcGVlZCA9IE5WUkVHX0xJTktTUEVFRF9GT1JDRSB8IE5WUkVHX0xJTktTUEVFRF8xMDsKKwlucC0+ZHVwbGV4ID0gMDsKKwl3cml0ZWwoTlZSRUdfVU5LU0VUVVAzX1ZBTDEsIGJhc2UgKyBOdlJlZ1Vua25vd25TZXR1cFJlZzMpOworCXdyaXRlbCgwLCBiYXNlICsgTnZSZWdUeFJ4Q29udHJvbCk7CisJcGNpX3B1c2goYmFzZSk7CisJd3JpdGVsKE5WUkVHX1RYUlhDVExfQklUMSwgYmFzZSArIE52UmVnVHhSeENvbnRyb2wpOworCisJcmVnX2RlbGF5KE52UmVnVW5rbm93blNldHVwUmVnNSwgTlZSRUdfVU5LU0VUVVA1X0JJVDMxLAorCQkgIE5WUkVHX1VOS1NFVFVQNV9CSVQzMSwgTlZfU0VUVVA1X0RFTEFZLAorCQkgIE5WX1NFVFVQNV9ERUxBWU1BWCwKKwkJICAib3BlbjogU2V0dXBSZWc1LCBCaXQgMzEgcmVtYWluZWQgb2ZmXG4iKTsKKwl3cml0ZWwoMCwgYmFzZSArIE52UmVnVW5rbm93blNldHVwUmVnNCk7CisKKwkvKiA1KSBGaW5kIGEgc3VpdGFibGUgUEhZICovCisJd3JpdGVsKE5WUkVHX01JSVNQRUVEX0JJVDggfCBOVlJFR19NSUlERUxBWSwgYmFzZSArIE52UmVnTUlJU3BlZWQpOworCWZvciAoaSA9IDE7IGkgPCAzMjsgaSsrKSB7CisJCWludCBpZDEsIGlkMjsKKworCQlpZDEgPSBtaWlfcncobmljLCBpLCBNSUlfUEhZU0lEMSwgTUlJX1JFQUQpOworCQlpZiAoaWQxIDwgMCkKKwkJCWNvbnRpbnVlOworCQlpZDIgPSBtaWlfcncobmljLCBpLCBNSUlfUEhZU0lEMiwgTUlJX1JFQUQpOworCQlpZiAoaWQyIDwgMCkKKwkJCWNvbnRpbnVlOworCQlkcHJpbnRmKCgib3BlbjogRm91bmQgUEhZICUwNHg6JTA0eCBhdCBhZGRyZXNzICVkLlxuIiwKKwkJCSBpZDEsIGlkMiwgaSkpOworCQlucC0+cGh5YWRkciA9IGk7CisKKwkJdXBkYXRlX2xpbmtzcGVlZChuaWMpOworCisJCWJyZWFrOworCX0KKwlpZiAoaSA9PSAzMikgeworCQlwcmludGYoIm9wZW46IGZhaWxpbmcgZHVlIHRvIGxhY2sgb2Ygc3VpdGFibGUgUEhZLlxuIik7CisJCXJldCA9IC0xOworCQlnb3RvIG91dF9kcmFpbjsKKwl9CisKKwlwcmludGYoIiVkLU1icyBMaW5rLCAlcy1EdXBsZXhcbiIsCisJICAgICAgIG5wLT5saW5rc3BlZWQgJiBOVlJFR19MSU5LU1BFRURfMTAgPyAxMCA6IDEwMCwKKwkgICAgICAgbnAtPmR1cGxleCA/ICJGdWxsIiA6ICJIYWxmIik7CisJLyogNikgY29udGludWUgc2V0dXAgKi8KKwl3cml0ZWwoTlZSRUdfTUlTQzFfRk9SQ0UgfCAobnAtPmR1cGxleCA/IDAgOiBOVlJFR19NSVNDMV9IRCksCisJICAgICAgIGJhc2UgKyBOdlJlZ01pc2MxKTsKKwl3cml0ZWwocmVhZGwoYmFzZSArIE52UmVnVHJhbnNtaXR0ZXJTdGF0dXMpLAorCSAgICAgICBiYXNlICsgTnZSZWdUcmFuc21pdHRlclN0YXR1cyk7CisJd3JpdGVsKE5WUkVHX1BGRl9BTFdBWVMsIGJhc2UgKyBOdlJlZ1BhY2tldEZpbHRlckZsYWdzKTsKKwl3cml0ZWwoTlZSRUdfT0ZGTE9BRF9OT1JNQUwsIGJhc2UgKyBOdlJlZ09mZmxvYWRDb25maWcpOworCisJd3JpdGVsKHJlYWRsKGJhc2UgKyBOdlJlZ1JlY2VpdmVyU3RhdHVzKSwKKwkgICAgICAgYmFzZSArIE52UmVnUmVjZWl2ZXJTdGF0dXMpOworCisJLyogRklYTUU6IEkgY2hlYXRlZCBhbmQgdXNlZCB0aGUgY2FsY3VsYXRvciB0byBnZXQgYSByYW5kb20gbnVtYmVyICovCisJaSA9IDc1OTYzMDgxOworCXdyaXRlbChOVlJFR19STkRTRUVEX0ZPUkNFIHwgKGkgJiBOVlJFR19STkRTRUVEX01BU0spLAorCSAgICAgICBiYXNlICsgTnZSZWdSYW5kb21TZWVkKTsKKwl3cml0ZWwoTlZSRUdfVU5LU0VUVVAxX1ZBTCwgYmFzZSArIE52UmVnVW5rbm93blNldHVwUmVnMSk7CisJd3JpdGVsKE5WUkVHX1VOS1NFVFVQMl9WQUwsIGJhc2UgKyBOdlJlZ1Vua25vd25TZXR1cFJlZzIpOworCXdyaXRlbChOVlJFR19QT0xMX0RFRkFVTFQsIGJhc2UgKyBOdlJlZ1BvbGxpbmdJbnRlcnZhbCk7CisJd3JpdGVsKE5WUkVHX1VOS1NFVFVQNl9WQUwsIGJhc2UgKyBOdlJlZ1Vua25vd25TZXR1cFJlZzYpOworCXdyaXRlbCgobnAtPgorCQlwaHlhZGRyIDw8IE5WUkVHX0FEQVBUQ1RMX1BIWVNISUZUKSB8CisJICAgICAgIE5WUkVHX0FEQVBUQ1RMX1BIWVZBTElELCBiYXNlICsgTnZSZWdBZGFwdGVyQ29udHJvbCk7CisJd3JpdGVsKE5WUkVHX1VOS1NFVFVQNF9WQUwsIGJhc2UgKyBOdlJlZ1Vua25vd25TZXR1cFJlZzQpOworCXdyaXRlbChOVlJFR19XQUtFVVBGTEFHU19WQUwsIGJhc2UgKyBOdlJlZ1dha2VVcEZsYWdzKTsKKworCS8qIDcpIHN0YXJ0IHBhY2tldCBwcm9jZXNzaW5nICovCisJd3JpdGVsKCh1MzIpIHZpcnRfdG9fbGUzMmRlc2MoJnJ4X3JpbmdbMF0pLAorCSAgICAgICBiYXNlICsgTnZSZWdSeFJpbmdQaHlzQWRkcik7CisJd3JpdGVsKCh1MzIpIHZpcnRfdG9fbGUzMmRlc2MoJnR4X3JpbmdbMF0pLAorCSAgICAgICBiYXNlICsgTnZSZWdUeFJpbmdQaHlzQWRkcik7CisKKworCXdyaXRlbCgoKFJYX1JJTkcgLSAxKSA8PCBOVlJFR19SSU5HU1pfUlhTSElGVCkgKworCSAgICAgICAoKFRYX1JJTkcgLSAxKSA8PCBOVlJFR19SSU5HU1pfVFhTSElGVCksCisJICAgICAgIGJhc2UgKyBOdlJlZ1JpbmdTaXplcyk7CisKKwlpID0gcmVhZGwoYmFzZSArIE52UmVnUG93ZXJTdGF0ZSk7CisJaWYgKChpICYgTlZSRUdfUE9XRVJTVEFURV9QT1dFUkVEVVApID09IDApIHsKKwkJd3JpdGVsKE5WUkVHX1BPV0VSU1RBVEVfUE9XRVJFRFVQIHwgaSwKKwkJICAgICAgIGJhc2UgKyBOdlJlZ1Bvd2VyU3RhdGUpOworCX0KKwlwY2lfcHVzaChiYXNlKTsKKwl1ZGVsYXkoMTApOworCXdyaXRlbChyZWFkbChiYXNlICsgTnZSZWdQb3dlclN0YXRlKSB8IE5WUkVHX1BPV0VSU1RBVEVfVkFMSUQsCisJICAgICAgIGJhc2UgKyBOdlJlZ1Bvd2VyU3RhdGUpOworCXdyaXRlbChOVlJFR19BREFQVENUTF9SVU5OSU5HLCBiYXNlICsgTnZSZWdBZGFwdGVyQ29udHJvbCk7CisKKwl3cml0ZWwoMCwgYmFzZSArIE52UmVnSXJxTWFzayk7CisJcGNpX3B1c2goYmFzZSk7CisJd3JpdGVsKE5WUkVHX0lSUVNUQVRfTUFTSywgYmFzZSArIE52UmVnSXJxU3RhdHVzKTsKKwlwY2lfcHVzaChiYXNlKTsKKwl3cml0ZWwoTlZSRUdfTUlJU1RBVF9NQVNLMiwgYmFzZSArIE52UmVnTUlJU3RhdHVzKTsKKwl3cml0ZWwoTlZSRUdfSVJRU1RBVF9NQVNLLCBiYXNlICsgTnZSZWdJcnFTdGF0dXMpOworCXBjaV9wdXNoKGJhc2UpOworLyoKKwl3cml0ZWwobnAtPmlycW1hc2ssIGJhc2UgKyBOdlJlZ0lycU1hc2spOworKi8KKwl3cml0ZWwoTlZSRUdfTUNBU1RBRERSQV9GT1JDRSwgYmFzZSArIE52UmVnTXVsdGljYXN0QWRkckEpOworCXdyaXRlbCgwLCBiYXNlICsgTnZSZWdNdWx0aWNhc3RBZGRyQik7CisJd3JpdGVsKDAsIGJhc2UgKyBOdlJlZ011bHRpY2FzdE1hc2tBKTsKKwl3cml0ZWwoMCwgYmFzZSArIE52UmVnTXVsdGljYXN0TWFza0IpOworCXdyaXRlbChOVlJFR19QRkZfQUxXQVlTIHwgTlZSRUdfUEZGX01ZQUREUiwKKwkgICAgICAgYmFzZSArIE52UmVnUGFja2V0RmlsdGVyRmxhZ3MpOworCisJc2V0X211bHRpY2FzdChuaWMpOworCS8vc3RhcnRfcngobmljKTsKKwlzdGFydF90eChuaWMpOworCisJaWYgKCEKKwkgICAgKG1paV9ydyhuaWMsIG5wLT5waHlhZGRyLCBNSUlfQk1TUiwgTUlJX1JFQUQpICYKKwkgICAgIEJNU1JfQU5FR0NPTVBMRVRFKSkgeworCQlwcmludGYoIm5vIGxpbmsgZHVyaW5nIGluaXRpYWxpemF0aW9uLlxuIik7CisJfQorCisJdWRlbGF5KDEwMDAwKTsKKyAgICAgIG91dF9kcmFpbjoKKwlyZXR1cm4gcmV0OworfQorCisvL2V4dGVybiB2b2lkIGhleF9kdW1wKGNvbnN0IGNoYXIgKmRhdGEsIGNvbnN0IHVuc2lnbmVkIGludCBsZW4pOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1BPTEwgLSBXYWl0IGZvciBhIGZyYW1lCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50IGZvcmNlZGV0aF9wb2xsKHN0cnVjdCBuaWMgKm5pYywgaW50IHJldHJpZXZlKQoreworCS8qIHJldHVybiB0cnVlIGlmIHRoZXJlJ3MgYW4gZXRoZXJuZXQgcGFja2V0IHJlYWR5IHRvIHJlYWQgKi8KKwkvKiBuaWMtPnBhY2tldCBzaG91bGQgY29udGFpbiBkYXRhIG9uIHJldHVybiAqLworCS8qIG5pYy0+cGFja2V0bGVuIHNob3VsZCBjb250YWluIGxlbmd0aCBvZiBkYXRhICovCisKKwlzdHJ1Y3QgcmluZ19kZXNjICpwcmQ7CisJaW50IGxlbjsKKwlpbnQgaTsKKworCWkgPSBucC0+Y3VyX3J4ICUgUlhfUklORzsKKwlwcmQgPSAmcnhfcmluZ1tpXTsKKworCWlmICggISAocHJkLT5GbGFncyAmIGNwdV90b19sZTE2KE5WX1JYX0RFU0NSSVBUT1JWQUxJRCkpICkgeworCSAgcmV0dXJuIDA7CisJfQorCisJaWYgKCAhIHJldHJpZXZlICkgcmV0dXJuIDE7CisKKwkvKiBnb3QgYSB2YWxpZCBwYWNrZXQgLSBmb3J3YXJkIGl0IHRvIHRoZSBuZXR3b3JrIGNvcmUgKi8KKwlsZW4gPSBjcHVfdG9fbGUxNihwcmQtPkxlbmd0aCk7CisJbmljLT5wYWNrZXRsZW4gPSBsZW47CisJLy9oZXhfZHVtcChyeGIgKyAoaSAqIFJYX05JQ19CVUZTSVpFKSwgbGVuKTsKKwltZW1jcHkobmljLT5wYWNrZXQsIHJ4YiArCisJICAgICAgIChpICogUlhfTklDX0JVRlNJWkUpLCBuaWMtPnBhY2tldGxlbik7CisKKwl3bWIoKTsKKwlucC0+Y3VyX3J4Kys7CisJYWxsb2NfcngobmljKTsKKwlyZXR1cm4gMTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1RSQU5TTUlUIC0gVHJhbnNtaXQgYSBmcmFtZQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgZm9yY2VkZXRoX3RyYW5zbWl0KHN0cnVjdCBuaWMgKm5pYywgY29uc3QgY2hhciAqZCwJLyogRGVzdGluYXRpb24gKi8KKwkJCSAgICAgICB1bnNpZ25lZCBpbnQgdCwJLyogVHlwZSAqLworCQkJICAgICAgIHVuc2lnbmVkIGludCBzLAkvKiBzaXplICovCisJCQkgICAgICAgY29uc3QgY2hhciAqcCkKK3sJCQkJLyogUGFja2V0ICovCisJLyogc2VuZCB0aGUgcGFja2V0IHRvIGRlc3RpbmF0aW9uICovCisJdTggKnB0eGI7CisJdTE2IG5zdHlwZTsKKwkvL3UxNiBzdGF0dXM7CisJdTggKmJhc2UgPSAodTggKikgQkFTRTsKKwlpbnQgbnIgPSBucC0+bmV4dF90eCAlIFRYX1JJTkc7CisKKwkvKiBwb2ludCB0byB0aGUgY3VycmVudCB0eGIgaW5jYXNlIG11bHRpcGxlIHR4X3JpbmdzIGFyZSB1c2VkICovCisJcHR4YiA9IHR4YiArIChuciAqIFJYX05JQ19CVUZTSVpFKTsKKwkvL25wLT50eF9za2J1ZmZbbnJdID0gcHR4YjsKKworCS8qIGNvcHkgdGhlIHBhY2tldCB0byByaW5nIGJ1ZmZlciAqLworCW1lbWNweShwdHhiLCBkLCBFVEhfQUxFTik7CS8qIGRzdCAqLworCW1lbWNweShwdHhiICsgRVRIX0FMRU4sIG5pYy0+bm9kZV9hZGRyLCBFVEhfQUxFTik7CS8qIHNyYyAqLworCW5zdHlwZSA9IGh0b25zKCh1MTYpIHQpOwkvKiB0eXBlICovCisJbWVtY3B5KHB0eGIgKyAyICogRVRIX0FMRU4sICh1OCAqKSAmIG5zdHlwZSwgMik7CS8qIHR5cGUgKi8KKwltZW1jcHkocHR4YiArIEVUSF9ITEVOLCBwLCBzKTsKKworCXMgKz0gRVRIX0hMRU47CisJd2hpbGUgKHMgPCBFVEhfWkxFTikJLyogcGFkIHRvIG1pbiBsZW5ndGggKi8KKwkJcHR4YltzKytdID0gJ1wwJzsKKworCXR4X3JpbmdbbnJdLlBhY2tldEJ1ZmZlciA9ICh1MzIpIHZpcnRfdG9fbGUzMmRlc2MocHR4Yik7CisJdHhfcmluZ1tucl0uTGVuZ3RoID0gY3B1X3RvX2xlMTYocyAtIDEpOworCisJd21iKCk7CisJdHhfcmluZ1tucl0uRmxhZ3MgPSBucC0+dHhfZmxhZ3M7CisKKwl3cml0ZWwoTlZSRUdfVFhSWENUTF9LSUNLLCBiYXNlICsgTnZSZWdUeFJ4Q29udHJvbCk7CisJcGNpX3B1c2goYmFzZSk7CisJdHhfcmluZ1tucl0uRmxhZ3MgPSBucC0+dHhfZmxhZ3M7CisJbnAtPm5leHRfdHgrKzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitESVNBQkxFIC0gVHVybiBvZmYgZXRoZXJuZXQgaW50ZXJmYWNlCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCBmb3JjZWRldGhfZGlzYWJsZShzdHJ1Y3QgZGV2ICpkZXYgX191bnVzZWQpCit7CisJLyogcHV0IHRoZSBjYXJkIGluIGl0cyBpbml0aWFsIHN0YXRlICovCisJLyogVGhpcyBmdW5jdGlvbiBzZXJ2ZXMgMyBwdXJwb3Nlcy4KKwkgKiBUaGlzIGRpc2FibGVzIERNQSBhbmQgaW50ZXJydXB0cyBzbyB3ZSBkb24ndCByZWNlaXZlCisJICogIHVuZXhwZWN0ZWQgcGFja2V0cyBvciBpbnRlcnJ1cHRzIGZyb20gdGhlIGNhcmQgYWZ0ZXIKKwkgKiAgZXRoZXJib290IGhhcyBmaW5pc2hlZC4gCisJICogVGhpcyBmcmVlcyByZXNvdXJjZXMgc28gZXRoZXJib290IG1heSB1c2UKKwkgKiAgdGhpcyBkcml2ZXIgb24gYW5vdGhlciBpbnRlcmZhY2UKKwkgKiBUaGlzIGFsbG93cyBldGhlcmJvb3QgdG8gcmVpbml0aWFsaXplIHRoZSBpbnRlcmZhY2UKKwkgKiAgaWYgc29tZXRoaW5nIGlzIHNvbWV0aGluZyBnb2VzIHdyb25nLgorCSAqLworCXU4ICpiYXNlID0gKHU4ICopIEJBU0U7CisJbnAtPmluX3NodXRkb3duID0gMTsKKwlzdG9wX3R4KCk7CisJc3RvcF9yeCgpOworCisJLyogZGlzYWJsZSBpbnRlcnJ1cHRzIG9uIHRoZSBuaWMgb3Igd2Ugd2lsbCBsb2NrIHVwICovCisJd3JpdGVsKDAsIGJhc2UgKyBOdlJlZ0lycU1hc2spOworCXBjaV9wdXNoKGJhc2UpOworCWRwcmludGYoKCJJcnFtYXNrIGlzIHplcm8gYWdhaW5cbiIpKTsKKworCS8qIHNwZWNpYSBvcDpvIHdyaXRlIGJhY2sgdGhlIG1pc29yZGVyZWQgTUFDIGFkZHJlc3MgLSBvdGhlcndpc2UKKwkgKiB0aGUgbmV4dCBwcm9iZV9uaWMgd291bGQgc2VlIGEgd3JvbmcgYWRkcmVzcy4KKwkgKi8KKwl3cml0ZWwobnAtPm9yaWdfbWFjWzBdLCBiYXNlICsgTnZSZWdNYWNBZGRyQSk7CisJd3JpdGVsKG5wLT5vcmlnX21hY1sxXSwgYmFzZSArIE52UmVnTWFjQWRkckIpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK0lSUSAtIEVuYWJsZSwgRGlzYWJsZSwgb3IgRm9yY2UgaW50ZXJydXB0cworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgZm9yY2VkZXRoX2lycShzdHJ1Y3QgbmljICpuaWMgX191bnVzZWQsIGlycV9hY3Rpb25fdCBhY3Rpb24gX191bnVzZWQpCit7CisgIHN3aXRjaCAoIGFjdGlvbiApIHsKKyAgY2FzZSBESVNBQkxFIDoKKyAgICBicmVhazsKKyAgY2FzZSBFTkFCTEUgOgorICAgIGJyZWFrOworICBjYXNlIEZPUkNFIDoKKyAgICBicmVhazsKKyAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1BST0JFIC0gTG9vayBmb3IgYW4gYWRhcHRlciwgdGhpcyByb3V0aW5lJ3MgdmlzaWJsZSB0byB0aGUgb3V0c2lkZQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBJT1JFU09VUkNFX01FTSAweDAwMDAwMjAwCisjZGVmaW5lIGJvYXJkX2ZvdW5kIDEKKyNkZWZpbmUgdmFsaWRfbGluayAwCitzdGF0aWMgaW50IGZvcmNlZGV0aF9wcm9iZShzdHJ1Y3QgZGV2ICpkZXYsIHN0cnVjdCBwY2lfZGV2aWNlICpwY2kpCit7CisJc3RydWN0IG5pYyAqbmljID0gKHN0cnVjdCBuaWMgKikgZGV2OworCXVuc2lnbmVkIGxvbmcgYWRkcjsKKwlpbnQgc3o7CisJdTggKmJhc2U7CisKKwlpZiAocGNpLT5pb2FkZHIgPT0gMCkKKwkJcmV0dXJuIDA7CisKKwlwcmludGYoImZvcmNlZGV0aC5jOiBGb3VuZCAlcywgdmVuZG9yPTB4JWhYLCBkZXZpY2U9MHglaFhcbiIsCisJICAgICAgIHBjaS0+bmFtZSwgcGNpLT52ZW5kb3IsIHBjaS0+ZGV2X2lkKTsKKworCW5pYy0+aXJxbm8gID0gMDsKKwluaWMtPmlvYWRkciA9IHBjaS0+aW9hZGRyICYgfjM7CisKKwkvKiBwb2ludCB0byBwcml2YXRlIHN0b3JhZ2UgKi8KKwlucCA9ICZucHg7CisKKwlhZGp1c3RfcGNpX2RldmljZShwY2kpOworCisJYWRkciA9IHBjaV9iYXJfc3RhcnQocGNpLCBQQ0lfQkFTRV9BRERSRVNTXzApOworCXN6ID0gcGNpX2Jhcl9zaXplKHBjaSwgUENJX0JBU0VfQUREUkVTU18wKTsKKworCS8qIEJBU0UgaXMgdXNlZCB0aHJvdWdob3V0IHRvIGFkZHJlc3MgdGhlIGNhcmQgKi8KKwlCQVNFID0gKHVuc2lnbmVkIGxvbmcpIGlvcmVtYXAoYWRkciwgc3opOworCWlmICghQkFTRSkKKwkJcmV0dXJuIDA7CisJLy9yeF9yaW5nWzBdID0gcnhfcmluZzsKKwkvL3R4X3JpbmdbMF0gPSB0eF9yaW5nOyAKKworCS8qIHJlYWQgdGhlIG1hYyBhZGRyZXNzICovCisJYmFzZSA9ICh1OCAqKSBCQVNFOworCW5wLT5vcmlnX21hY1swXSA9IHJlYWRsKGJhc2UgKyBOdlJlZ01hY0FkZHJBKTsKKwlucC0+b3JpZ19tYWNbMV0gPSByZWFkbChiYXNlICsgTnZSZWdNYWNBZGRyQik7CisKKwluaWMtPm5vZGVfYWRkclswXSA9IChucC0+b3JpZ19tYWNbMV0gPj4gOCkgJiAweGZmOworCW5pYy0+bm9kZV9hZGRyWzFdID0gKG5wLT5vcmlnX21hY1sxXSA+PiAwKSAmIDB4ZmY7CisJbmljLT5ub2RlX2FkZHJbMl0gPSAobnAtPm9yaWdfbWFjWzBdID4+IDI0KSAmIDB4ZmY7CisJbmljLT5ub2RlX2FkZHJbM10gPSAobnAtPm9yaWdfbWFjWzBdID4+IDE2KSAmIDB4ZmY7CisJbmljLT5ub2RlX2FkZHJbNF0gPSAobnAtPm9yaWdfbWFjWzBdID4+IDgpICYgMHhmZjsKKwluaWMtPm5vZGVfYWRkcls1XSA9IChucC0+b3JpZ19tYWNbMF0gPj4gMCkgJiAweGZmOworI2lmZGVmIExJTlVYCisJaWYgKCFpc192YWxpZF9ldGhlcl9hZGRyKGRldi0+ZGV2X2FkZHIpKSB7CisJCS8qCisJCSAqIEJhZCBtYWMgYWRkcmVzcy4gQXQgbGVhc3Qgb25lIGJpb3Mgc2V0cyB0aGUgbWFjIGFkZHJlc3MKKwkJICogdG8gMDE6MjM6NDU6Njc6ODk6YWIKKwkJICovCisJCXByaW50ayhLRVJOX0VSUgorCQkgICAgICAgIiVzOiBJbnZhbGlkIE1hYyBhZGRyZXNzIGRldGVjdGVkOiAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeFxuIiwKKwkJICAgICAgIHBjaV9uYW1lKHBjaV9kZXYpLCBkZXYtPmRldl9hZGRyWzBdLAorCQkgICAgICAgZGV2LT5kZXZfYWRkclsxXSwgZGV2LT5kZXZfYWRkclsyXSwKKwkJICAgICAgIGRldi0+ZGV2X2FkZHJbM10sIGRldi0+ZGV2X2FkZHJbNF0sCisJCSAgICAgICBkZXYtPmRldl9hZGRyWzVdKTsKKwkJcHJpbnRrKEtFUk5fRVJSCisJCSAgICAgICAiUGxlYXNlIGNvbXBsYWluIHRvIHlvdXIgaGFyZHdhcmUgdmVuZG9yLiBTd2l0Y2hpbmcgdG8gYSByYW5kb20gTUFDLlxuIik7CisJCWRldi0+ZGV2X2FkZHJbMF0gPSAweDAwOworCQlkZXYtPmRldl9hZGRyWzFdID0gMHgwMDsKKwkJZGV2LT5kZXZfYWRkclsyXSA9IDB4NmM7CisJCWdldF9yYW5kb21fYnl0ZXMoJmRldi0+ZGV2X2FkZHJbM10sIDMpOworCX0KKyNlbmRpZgorCXByaW50ZigiJXM6IE1BQyBBZGRyZXNzICUhLCAiLCBwY2ktPm5hbWUsIG5pYy0+bm9kZV9hZGRyKTsKKworCW5wLT50eF9mbGFncyA9CisJICAgIGNwdV90b19sZTE2KE5WX1RYX0xBU1RQQUNLRVQgfCBOVl9UWF9MQVNUUEFDS0VUMSB8CisJCQlOVl9UWF9WQUxJRCk7CisJc3dpdGNoIChwY2ktPmRldl9pZCkgeworCWNhc2UgMHgwMUMzOgkJLy8gbmZvcmNlCisJCW5wLT5pcnFtYXNrID0gTlZSRUdfSVJRTUFTS19XQU5URURfMjsKKwkJbnAtPmlycW1hc2sgfD0gTlZSRUdfSVJRX1RJTUVSOworCQlicmVhazsKKwljYXNlIDB4MDA2NjoJCS8vIG5mb3JjZTIKKwkJbnAtPnR4X2ZsYWdzIHw9IGNwdV90b19sZTE2KE5WX1RYX0xBU1RQQUNLRVQxKTsKKwkJbnAtPmlycW1hc2sgPSBOVlJFR19JUlFNQVNLX1dBTlRFRF8yOworCQlucC0+aXJxbWFzayB8PSBOVlJFR19JUlFfVElNRVI7CisJCWJyZWFrOworCWNhc2UgMHgwMEQ2OgkJLy8gbmZvcmNlMworCQlucC0+dHhfZmxhZ3MgfD0gY3B1X3RvX2xlMTYoTlZfVFhfTEFTVFBBQ0tFVDEpOworCQlucC0+aXJxbWFzayA9IE5WUkVHX0lSUU1BU0tfV0FOVEVEXzI7CisJCW5wLT5pcnFtYXNrIHw9IE5WUkVHX0lSUV9USU1FUjsKKworCX0KKwlkcHJpbnRmKCgiJXM6IGZvcmNlZGV0aC5jOiBzdWJzeXN0ZW06ICVoWDolaFggYm91bmQgdG8gJXNcbiIsCisJCSBwY2ktPm5hbWUsIHBjaS0+dmVuZG9yLCBwY2ktPmRldl9pZCwgcGNpLT5uYW1lKSk7CisKKwlmb3JjZWRldGhfcmVzZXQobmljKTsKKy8vICAgICAgaWYgKGJvYXJkX2ZvdW5kICYmIHZhbGlkX2xpbmspCisJLyogcG9pbnQgdG8gTklDIHNwZWNpZmljIHJvdXRpbmVzICovCisJZGV2LT5kaXNhYmxlID0gZm9yY2VkZXRoX2Rpc2FibGU7CisJbmljLT5wb2xsID0gZm9yY2VkZXRoX3BvbGw7CisJbmljLT50cmFuc21pdCA9IGZvcmNlZGV0aF90cmFuc21pdDsKKwluaWMtPmlycSAgICA9IGZvcmNlZGV0aF9pcnE7CisJcmV0dXJuIDE7CisvLyAgICAgIH0KKwkvKiBlbHNlICovCit9CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2lkIGZvcmNlZGV0aF9uaWNzW10gPSB7CisJUENJX1JPTSgweDEwZGUsIDB4MDFDMywgIm5mb3JjZSIsICJuRm9yY2UgRXRoZXJuZXQgQ29udHJvbGxlciIpLAorCVBDSV9ST00oMHgxMGRlLCAweDAwNjYsICJuZm9yY2UyIiwgIm5Gb3JjZTIgRXRoZXJuZXQgQ29udHJvbGxlciIpLAorCVBDSV9ST00oMHgxMGRlLCAweDAwRDYsICJuZm9yY2UzIiwgIm5Gb3JjZTMgRXRoZXJuZXQgQ29udHJvbGxlciIpLAorfTsKKworc3RydWN0IHBjaV9kcml2ZXIgZm9yY2VkZXRoX2RyaXZlciA9IHsKKwkudHlwZSA9IE5JQ19EUklWRVIsCisJLm5hbWUgPSAiZm9yY2VkZXRoIiwKKwkucHJvYmUgPSBmb3JjZWRldGhfcHJvYmUsCisJLmlkcyA9IGZvcmNlZGV0aF9uaWNzLAorCS5pZF9jb3VudCA9IHNpemVvZihmb3JjZWRldGhfbmljcykgLyBzaXplb2YoZm9yY2VkZXRoX25pY3NbMF0pLAorCS5jbGFzcyA9IDAsCit9OwpkaWZmIC1OYXVyIGdydWItMC45Ny5vcmlnL25ldGJvb3QvZnN5c190ZnRwLmMgZ3J1Yi0wLjk3L25ldGJvb3QvZnN5c190ZnRwLmMKLS0tIGdydWItMC45Ny5vcmlnL25ldGJvb3QvZnN5c190ZnRwLmMJMjAwNC0wNC0xNSAxMTozODo0MC4wMDAwMDAwMDAgKzAwMDAKKysrIGdydWItMC45Ny9uZXRib290L2ZzeXNfdGZ0cC5jCTIwMDUtMDgtMzEgMTk6MDM6MzUuMDAwMDAwMDAwICswMDAwCkBAIC0yOSwxNCArMjksMTUgQEAKIC8qICNkZWZpbmUgVEZUUF9ERUJVRwkxICovCiAKICNpbmNsdWRlIDxmaWxlc3lzLmg+CisjaW5jbHVkZSA8c2hhcmVkLmg+CiAKLSNkZWZpbmUgR1JVQgkxCi0jaW5jbHVkZSA8ZXRoZXJib290Lmg+Ci0jaW5jbHVkZSA8bmljLmg+CisjaW5jbHVkZSAiZ3J1Yi5oIgorI2luY2x1ZGUgInRmdHAuaCIKKyNpbmNsdWRlICJuaWMuaCIKIAogc3RhdGljIGludCByZXRyeTsKIHN0YXRpYyB1bnNpZ25lZCBzaG9ydCBpcG9ydCA9IDIwMDA7Ci1zdGF0aWMgdW5zaWduZWQgc2hvcnQgb3BvcnQ7CitzdGF0aWMgdW5zaWduZWQgc2hvcnQgb3BvcnQgPSAwOwogc3RhdGljIHVuc2lnbmVkIHNob3J0IGJsb2NrLCBwcmV2YmxvY2s7CiBzdGF0aWMgaW50IGJjb3VudGVyOwogc3RhdGljIHN0cnVjdCB0ZnRwX3QgdHAsIHNhdmVkX3RwOwpAQCAtNDYsNiArNDcsMTcyIEBACiBzdGF0aWMgdW5zaWduZWQgc2hvcnQgbGVuLCBzYXZlZF9sZW47CiBzdGF0aWMgY2hhciAqYnVmOwogCisvKioKKyAqIHRmdHBfcmVhZAorICoKKyAqIFJlYWQgZmlsZSB3aXRoIF9uYW1lXywgZGF0YSBoYW5kbGVkIGJ5IF9mbmNfLiBJbiBmYWN0LCBncnViIG5ldmVyCisgKiB1c2UgaXQsIHdlIGp1c3QgdXNlIGl0IHRvIHJlYWQgZGhjcCBjb25maWcgZmlsZS4KKyAqLworc3RhdGljIGludCBhd2FpdF90ZnRwKGludCBpdmFsLCB2b2lkICpwdHIgX191bnVzZWQsIAorCQkgICAgICB1bnNpZ25lZCBzaG9ydCBwdHlwZSBfX3VudXNlZCwgc3RydWN0IGlwaGRyICppcCwgCisJCSAgICAgIHN0cnVjdCB1ZHBoZHIgKnVkcCkKK3sKKwlpZiAoIXVkcCkgeworCQlyZXR1cm4gMDsKKwl9CisJaWYgKGFycHRhYmxlW0FSUF9DTElFTlRdLmlwYWRkci5zX2FkZHIgIT0gaXAtPmRlc3Quc19hZGRyKQorCQlyZXR1cm4gMDsKKwlpZiAobnRvaHModWRwLT5kZXN0KSAhPSBpdmFsKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gMTsKK30KKworaW50IHRmdHBfZmlsZV9yZWFkKGNvbnN0IGNoYXIgKm5hbWUsIGludCAoKmZuYykodW5zaWduZWQgY2hhciAqLCB1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGludCwgaW50KSkKK3sKKwlzdHJ1Y3QgdGZ0cHJlcV90IHRwOworCXN0cnVjdCB0ZnRwX3QgICp0cjsKKwlpbnQJCXJjOworCisJcmV0cnkgPSAwOworCWJsb2NrID0gMDsKKwlwcmV2YmxvY2sgPSAwOworCWJjb3VudGVyID0gMDsKKwkKKworCXJ4X3FkcmFpbigpOworCisJdHAub3Bjb2RlID0gaHRvbnMoVEZUUF9SUlEpOworCS8qIFdhcm5pbmc6IHRoZSBmb2xsb3dpbmcgYXNzdW1lcyB0aGUgbGF5b3V0IG9mIGJvb3RwX3QuCisJICAgQnV0IHRoYXQncyBmaXhlZCBieSB0aGUgSVAsIFVEUCBhbmQgQk9PVFAgc3BlY3MuICovCisJbGVuID0gc2l6ZW9mKHRwLmlwKSArIHNpemVvZih0cC51ZHApICsgc2l6ZW9mKHRwLm9wY29kZSkgKworCQlzcHJpbnRmKChjaGFyICopdHAudS5ycnEsICIlcyVjb2N0ZXQlY2Jsa3NpemUlYyVkIiwKKwkJbmFtZSwgMCwgMCwgMCwgVEZUUF9NQVhfUEFDS0VUKSArIDE7CisJaWYgKCF1ZHBfdHJhbnNtaXQoYXJwdGFibGVbQVJQX1NFUlZFUl0uaXBhZGRyLnNfYWRkciwgKytpcG9ydCwKKwkJCSAgVEZUUF9QT1JULCBsZW4sICZ0cCkpCisJCXJldHVybiAoMCk7CisJZm9yICg7OykKKwl7CisJCWxvbmcgdGltZW91dDsKKyNpZmRlZglDT05HRVNURUQKKwkJdGltZW91dCA9IHJmYzIxMzFfc2xlZXBfaW50ZXJ2YWwoYmxvY2s/VEZUUF9SRVhNVDogVElNRU9VVCwgcmV0cnkpOworI2Vsc2UKKwkJdGltZW91dCA9IHJmYzIxMzFfc2xlZXBfaW50ZXJ2YWwoVElNRU9VVCwgcmV0cnkpOworI2VuZGlmCisJCWlmICghYXdhaXRfcmVwbHkoYXdhaXRfdGZ0cCwgaXBvcnQsIE5VTEwsIHRpbWVvdXQpKQorCQl7CisJCQlpZiAoIWJsb2NrICYmIHJldHJ5KysgPCBNQVhfVEZUUF9SRVRSSUVTKQorCQkJewkvKiBtYXliZSBpbml0aWFsIHJlcXVlc3Qgd2FzIGxvc3QgKi8KKwkJCQlpZiAoIXVkcF90cmFuc21pdChhcnB0YWJsZVtBUlBfU0VSVkVSXS5pcGFkZHIuc19hZGRyLAorCQkJCQkJICArK2lwb3J0LCBURlRQX1BPUlQsIGxlbiwgJnRwKSkKKwkJCQkJcmV0dXJuICgwKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKyNpZmRlZglDT05HRVNURUQKKwkJCWlmIChibG9jayAmJiAoKHJldHJ5ICs9IFRGVFBfUkVYTVQpIDwgVEZUUF9USU1FT1VUKSkKKwkJCXsJLyogd2UgcmVzZW5kIG91ciBsYXN0IGFjayAqLworI2lmZGVmCU1ERUJVRworCQkJCXByaW50ZigiPFJFWE1UPlxuIik7CisjZW5kaWYKKwkJCQl1ZHBfdHJhbnNtaXQoYXJwdGFibGVbQVJQX1NFUlZFUl0uaXBhZGRyLnNfYWRkciwKKwkJCQkJICAgICBpcG9ydCwgb3BvcnQsCisJCQkJCSAgICAgVEZUUF9NSU5fUEFDS0VULCAmdHApOworCQkJCWNvbnRpbnVlOworCQkJfQorI2VuZGlmCisJCQlicmVhazsJLyogdGltZW91dCAqLworCQl9CisJCXRyID0gKHN0cnVjdCB0ZnRwX3QgKikmbmljLnBhY2tldFtFVEhfSExFTl07CisJCWlmICh0ci0+b3Bjb2RlID09IG50b2hzKFRGVFBfRVJST1IpKQorCQl7CisJCQlwcmludGYoIlRGVFAgZXJyb3IgJWQgKCVzKVxuIiwKKwkJCSAgICAgICBudG9ocyh0ci0+dS5lcnIuZXJyY29kZSksCisJCQkgICAgICAgdHItPnUuZXJyLmVycm1zZyk7CisJCQlicmVhazsKKwkJfQorCisJCWlmICh0ci0+b3Bjb2RlID09IG50b2hzKFRGVFBfT0FDSykpIHsKKwkJCWNoYXIgKnAgPSB0ci0+dS5vYWNrLmRhdGEsICplOworCisJCQlpZiAocHJldmJsb2NrKQkJLyogc2hvdWxkbid0IGhhcHBlbiAqLworCQkJCWNvbnRpbnVlOwkvKiBpZ25vcmUgaXQgKi8KKwkJCWxlbiA9IG50b2hzKHRyLT51ZHAubGVuKSAtIHNpemVvZihzdHJ1Y3QgdWRwaGRyKSAtIDI7CisJCQlpZiAobGVuID4gVEZUUF9NQVhfUEFDS0VUKQorCQkJCWdvdG8gbm9hazsKKwkJCWUgPSBwICsgbGVuOworCQkJd2hpbGUgKCpwICE9ICdcMCcgJiYgcCA8IGUpIHsKKy8qIAkJCQlpZiAoIXN0cmNhc2VjbXAoImJsa3NpemUiLCBwKSkgeyAqLworCQkJCWlmICghZ3J1Yl9zdHJjbXAoImJsa3NpemUiLCBwKSkgeworCQkJCQlwICs9IDg7CisvKiAJCQkJCWlmICgocGFja2V0c2l6ZSA9IHN0cnRvdWwocCwgJnAsIDEwKSkgPCAqLworCQkJCQlpZiAoKHBhY2tldHNpemUgPSBnZXRkZWMoJnApKSA8IFRGVFBfREVGQVVMVFNJWkVfUEFDS0VUKQorCQkJCQkJZ290byBub2FrOworCQkJCQl3aGlsZSAocCA8IGUgJiYgKnApIHArKzsKKwkJCQkJaWYgKHAgPCBlKQorCQkJCQkJcCsrOworCQkJCX0KKwkJCQllbHNlIHsKKwkJCQlub2FrOgorCQkJCQl0cC5vcGNvZGUgPSBodG9ucyhURlRQX0VSUk9SKTsKKwkJCQkJdHAudS5lcnIuZXJyY29kZSA9IDg7CisvKgorICoJV2FybmluZzogdGhlIGZvbGxvd2luZyBhc3N1bWVzIHRoZSBsYXlvdXQgb2YgYm9vdHBfdC4KKyAqCUJ1dCB0aGF0J3MgZml4ZWQgYnkgdGhlIElQLCBVRFAgYW5kIEJPT1RQIHNwZWNzLgorICovCisJCQkJCWxlbiA9IHNpemVvZih0cC5pcCkgKyBzaXplb2YodHAudWRwKSArIHNpemVvZih0cC5vcGNvZGUpICsgc2l6ZW9mKHRwLnUuZXJyLmVycmNvZGUpICsKKy8qCisgKglOb3JtYWxseSBiYWQgZm9ybSB0byBvbWl0IHRoZSBmb3JtYXQgc3RyaW5nLCBidXQgaW4gdGhpcyBjYXNlCisgKgl0aGUgc3RyaW5nIHdlIGFyZSBjb3B5aW5nIGZyb20gaXMgZml4ZWQuIHNwcmludGYgaXMganVzdCBiZWluZworICoJdXNlZCBhcyBhIHN0cmNweSBhbmQgc3RybGVuLgorICovCisJCQkJCQlzcHJpbnRmKChjaGFyICopdHAudS5lcnIuZXJybXNnLAorCQkJCQkJIlJGQzE3ODIgZXJyb3IiKSArIDE7CisJCQkJCXVkcF90cmFuc21pdChhcnB0YWJsZVtBUlBfU0VSVkVSXS5pcGFkZHIuc19hZGRyLAorCQkJCQkJICAgICBpcG9ydCwgbnRvaHModHItPnVkcC5zcmMpLAorCQkJCQkJICAgICBsZW4sICZ0cCk7CisJCQkJCXJldHVybiAoMCk7CisJCQkJfQorCQkJfQorCQkJaWYgKHAgPiBlKQorCQkJCWdvdG8gbm9hazsKKwkJCWJsb2NrID0gdHAudS5hY2suYmxvY2sgPSAwOyAvKiB0aGlzIGVuc3VyZXMsIHRoYXQgKi8KKwkJCQkJCS8qIHRoZSBwYWNrZXQgZG9lcyBub3QgZ2V0ICovCisJCQkJCQkvKiBwcm9jZXNzZWQgYXMgZGF0YSEgKi8KKwkJfQorCQllbHNlIGlmICh0ci0+b3Bjb2RlID09IGh0b25zKFRGVFBfREFUQSkpIHsKKwkJCWxlbiA9IG50b2hzKHRyLT51ZHAubGVuKSAtIHNpemVvZihzdHJ1Y3QgdWRwaGRyKSAtIDQ7CisJCQlpZiAobGVuID4gcGFja2V0c2l6ZSkJLyogc2hvdWxkbid0IGhhcHBlbiAqLworCQkJCWNvbnRpbnVlOwkvKiBpZ25vcmUgaXQgKi8KKwkJCWJsb2NrID0gbnRvaHModHAudS5hY2suYmxvY2sgPSB0ci0+dS5kYXRhLmJsb2NrKTsgfQorCQllbHNlIHsvKiBuZWl0aGVyIFRGVFBfT0FDSyBub3IgVEZUUF9EQVRBICovCisJCQlicmVhazsKKwkJfQorCisJCWlmICgoYmxvY2sgfHwgYmNvdW50ZXIpICYmIChibG9jayAhPSAodW5zaWduZWQgc2hvcnQpKHByZXZibG9jaysxKSkpIHsKKwkJCS8qIEJsb2NrIG9yZGVyIHNob3VsZCBiZSBjb250aW51b3VzICovCisJCQl0cC51LmFjay5ibG9jayA9IGh0b25zKGJsb2NrID0gcHJldmJsb2NrKTsKKwkJfQorCQl0cC5vcGNvZGUgPSBodG9ucyhURlRQX0FDSyk7CisJCW9wb3J0ID0gbnRvaHModHItPnVkcC5zcmMpOworCQl1ZHBfdHJhbnNtaXQoYXJwdGFibGVbQVJQX1NFUlZFUl0uaXBhZGRyLnNfYWRkciwgaXBvcnQsCisJCQkgICAgIG9wb3J0LCBURlRQX01JTl9QQUNLRVQsICZ0cCk7CS8qIGFjayAqLworCQlpZiAoKHVuc2lnbmVkIHNob3J0KShibG9jay1wcmV2YmxvY2spICE9IDEpIHsKKwkJCS8qIFJldHJhbnNtaXNzaW9uIG9yIE9BQ0ssIGRvbid0IHByb2Nlc3MgdmlhIGNhbGxiYWNrCisJCQkgKiBhbmQgZG9uJ3QgY2hhbmdlIHRoZSB2YWx1ZSBvZiBwcmV2YmxvY2suICAqLworCQkJY29udGludWU7CisJCX0KKwkJcHJldmJsb2NrID0gYmxvY2s7CisJCXJldHJ5ID0gMDsJLyogSXQncyB0aGUgcmlnaHQgcGxhY2UgdG8gemVybyB0aGUgdGltZXI/ICovCisJCWlmICgocmMgPSBmbmModHItPnUuZGF0YS5kb3dubG9hZCwKKwkJCSAgICAgICsrYmNvdW50ZXIsIGxlbiwgbGVuIDwgcGFja2V0c2l6ZSkpIDw9IDApCisJCQlyZXR1cm4ocmMpOworCQlpZiAobGVuIDwgcGFja2V0c2l6ZSkgewkvKiBFbmQgb2YgZGF0YSAtLS0gZm5jIHNob3VsZCBub3QgaGF2ZSByZXR1cm5lZCAqLworCQkJcHJpbnRmKCJ0ZnRwIGRvd25sb2FkIGNvbXBsZXRlLCBidXRcbiIpOworCQkJcmV0dXJuICgxKTsKKwkJfQorCX0KKwlyZXR1cm4gKDApOworfQorCiAvKiBGaWxsIHRoZSBidWZmZXIgYnkgcmVjZWl2aW5nIHRoZSBkYXRhIHZpYSB0aGUgVEZUUCBwcm90b2NvbC4gICovCiBzdGF0aWMgaW50CiBidWZfZmlsbCAoaW50IGFib3J0KQpAQCAtNjUsOSArMjMyLDkgQEAKICAgICAgIHRpbWVvdXQgPSByZmMyMTMxX3NsZWVwX2ludGVydmFsIChUSU1FT1VULCByZXRyeSk7CiAjZW5kaWYKICAgCi0gICAgICBpZiAoISBhd2FpdF9yZXBseSAoQVdBSVRfVEZUUCwgaXBvcnQsIE5VTEwsIHRpbWVvdXQpKQorICAgICAgaWYgKCEgYXdhaXRfcmVwbHkgKGF3YWl0X3RmdHAsIGlwb3J0LCBOVUxMLCB0aW1lb3V0KSkKIAl7Ci0JICBpZiAoaXBfYWJvcnQpCisJICBpZiAodXNlcl9hYm9ydCkKIAkgICAgcmV0dXJuIDA7CiAKIAkgIGlmICghIGJsb2NrICYmIHJldHJ5KysgPCBNQVhfVEZUUF9SRVRSSUVTKQpAQCAtMjcwLDEzICs0MzcsNyBAQAogICBidWZfcmVhZCA9IDA7CiAgIHNhdmVkX2ZpbGVwb3MgPSAwOwogCi0gIC8qIENsZWFyIG91dCB0aGUgUnggcXVldWUgZmlyc3QuICBJdCBjb250YWlucyBub3RoaW5nIG9mIGludGVyZXN0LAotICAgKiBleGNlcHQgcG9zc2libHkgQVJQIHJlcXVlc3RzIGZyb20gdGhlIERIQ1AvVEZUUCBzZXJ2ZXIuICBXZSB1c2UKLSAgICogcG9sbGluZyB0aHJvdWdob3V0IEV0aGVyYm9vdCwgc28gc29tZSB0aW1lIG1heSBoYXZlIHBhc3NlZCBzaW5jZSB3ZQotICAgKiBsYXN0IHBvbGxlZCB0aGUgcmVjZWl2ZSBxdWV1ZSwgd2hpY2ggbWF5IG5vdyBiZSBmaWxsZWQgd2l0aAotICAgKiBicm9hZGNhc3QgcGFja2V0cy4gIFRoaXMgd2lsbCBjYXVzZSB0aGUgcmVwbHkgdG8gdGhlIHBhY2tldHMgd2UgYXJlCi0gICAqIGFib3V0IHRvIHNlbmQgdG8gYmUgbG9zdCBpbW1lZGlhdGVseS4gIE5vdCB2ZXJ5IGNsZXZlci4gICovCi0gIGF3YWl0X3JlcGx5IChBV0FJVF9RRFJBSU4sIDAsIE5VTEwsIDApOworICByeF9xZHJhaW4oKTsKICAgCiAjaWZkZWYgVEZUUF9ERUJVRwogICBncnViX3ByaW50ZiAoInNlbmRfcnJxICgpXG4iKTsKZGlmZiAtTmF1ciBncnViLTAuOTcub3JpZy9uZXRib290L2dydWIuaCBncnViLTAuOTcvbmV0Ym9vdC9ncnViLmgKLS0tIGdydWItMC45Ny5vcmlnL25ldGJvb3QvZ3J1Yi5oCTE5NzAtMDEtMDEgMDA6MDA6MDAuMDAwMDAwMDAwICswMDAwCisrKyBncnViLTAuOTcvbmV0Ym9vdC9ncnViLmgJMjAwNS0wOC0zMSAxOTowMzozNS4wMDAwMDAwMDAgKzAwMDAKQEAgLTAsMCArMSwxNzEgQEAKKyNpZm5kZWYgR1JVQl9ICisjZGVmaW5lIEdSVUJfSAorCisjaW5jbHVkZSAib3NkZXAuaCIKKyNpbmNsdWRlICJieXRlc3dhcC5oIgorI2luY2x1ZGUgImluLmgiCisjaW5jbHVkZSAiaXAuaCIKKyNpbmNsdWRlICJ1ZHAuaCIKKyNpbmNsdWRlICJpZl9ldGhlci5oIgorI2luY2x1ZGUgImxhdGNoLmgiCisjaW5jbHVkZSAiaW8uaCIKKyNpbmNsdWRlICJuaWMuaCIKKyNpbmNsdWRlIDxzaGFyZWQuaD4KKworI2RlZmluZSBLX0VTQwkJJ1wwMzMnCisjZGVmaW5lIEtfRU9GCQknXDA0JyAgLyogQ3RybC1EICovCisjZGVmaW5lIEtfSU5UUgkJJ1wwMycgIC8qIEN0cmwtQyAqLworCisjaWZuZGVmCU1BWF9SUENfUkVUUklFUworI2RlZmluZSBNQVhfUlBDX1JFVFJJRVMJCTIwCisjZW5kaWYKKworCisvKiBJbnRlci1wYWNrZXQgcmV0cnkgaW4gdGlja3MgKi8KKyNpZm5kZWYgVElNRU9VVAorI2RlZmluZSBUSU1FT1VUCQkJKDEwKlRJQ0tTX1BFUl9TRUMpCisjZW5kaWYKKworI2lmbmRlZglOVUxMCisjZGVmaW5lIE5VTEwJKCh2b2lkICopMCkKKyNlbmRpZgorCisKKyNkZWZpbmUgQVJQX0NMSUVOVAkwCisjZGVmaW5lIEFSUF9TRVJWRVIJMQorI2RlZmluZSBBUlBfR0FURVdBWQkyCisjZGVmaW5lIE1BWF9BUlAJCUFSUF9HQVRFV0FZKzEKKworI2RlZmluZSBJR01QX1NFUlZFUgkwCisjZGVmaW5lIE1BWF9JR01QCUlHTVBfU0VSVkVSKzEKKworI2RlZmluZQlSQVJQX1JFUVVFU1QJMworI2RlZmluZQlSQVJQX1JFUExZCTQKKworCisjZGVmaW5lIE1VTFRJQ0FTVF9NQVNLICAgIDB4RjAwMDAwMDAKKyNkZWZpbmUgTVVMVElDQVNUX05FVFdPUksgMHhFMDAwMDAwMAorCitzdHJ1Y3QgYXJwdGFibGVfdCB7CisJaW5fYWRkciBpcGFkZHI7CisJdWludDhfdCBub2RlWzZdOworfTsKKworc3RydWN0IGlnbXB0YWJsZV90IHsKKwlpbl9hZGRyIGdyb3VwOworCXVuc2lnbmVkIGxvbmcgdGltZTsKK307CisKKyNkZWZpbmUJS0VSTkVMX0JVRgkoQk9PVFBfREFUQV9BRERSLT5ib290cF9yZXBseS5icF9maWxlKQorCisjZGVmaW5lCUZMT1BQWV9CT09UX0xPQ0FUSU9OCTB4N2MwMAorLyogTXVzdCBtYXRjaCBvZmZzZXRzIGluIGxvYWRlci5TICovCisjZGVmaW5lIFJPTV9TRUdNRU5UCQkweDFmYQorI2RlZmluZSBST01fTEVOR1RICQkweDFmYworCisjZGVmaW5lCVJPTV9JTkZPX0xPQ0FUSU9OCShGTE9QUFlfQk9PVF9MT0NBVElPTitST01fU0VHTUVOVCkKKy8qIGF0IGVuZCBvZiBmbG9wcHkgYm9vdCBibG9jayAqLworCisKKworLyogRGVmaW5lIGEgdHlwZSBmb3IgcGFzc2luZyBpbmZvIHRvIGEgbG9hZGVkIHByb2dyYW0gKi8KK3N0cnVjdCBlYmluZm8geworCXVpbnQ4X3QgIG1ham9yLCBtaW5vcjsJLyogVmVyc2lvbiAqLworCXVpbnQxNl90IGZsYWdzOwkJLyogQml0IGZsYWdzICovCit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitFeHRlcm5hbCBwcm90b3R5cGVzCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitleHRlcm4gdm9pZCByeF9xZHJhaW4gUCgodm9pZCkpOworZXh0ZXJuIGludCB0ZnRwIFAoKGNvbnN0IGNoYXIgKm5hbWUsIGludCAoKikodW5zaWduZWQgY2hhciAqLCB1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGludCwgaW50KSkpOworZXh0ZXJuIGludCBpcF90cmFuc21pdCBQKChpbnQgbGVuLCBjb25zdCB2b2lkICpidWYpKTsKK2V4dGVybiB2b2lkIGJ1aWxkX2lwX2hkciBQKCh1bnNpZ25lZCBsb25nIGRlc3RpcCwgaW50IHR0bCwgaW50IHByb3RvY29sLCAKKwlpbnQgb3B0aW9uX2xlbiwgaW50IGxlbiwgY29uc3Qgdm9pZCAqYnVmKSk7CitleHRlcm4gdm9pZCBidWlsZF91ZHBfaGRyIFAoKHVuc2lnbmVkIGxvbmcgZGVzdGlwLCAKKwl1bnNpZ25lZCBpbnQgc3Jjc29jaywgdW5zaWduZWQgaW50IGRlc3Rzb2NrLCBpbnQgdHRsLAorCWludCBsZW4sIGNvbnN0IHZvaWQgKmJ1ZikpOworZXh0ZXJuIGludCB1ZHBfdHJhbnNtaXQgUCgodW5zaWduZWQgbG9uZyBkZXN0aXAsIHVuc2lnbmVkIGludCBzcmNzb2NrLAorCXVuc2lnbmVkIGludCBkZXN0c29jaywgaW50IGxlbiwgY29uc3Qgdm9pZCAqYnVmKSk7Cit0eXBlZGVmIGludCAoKnJlcGx5X3QpKGludCBpdmFsLCB2b2lkICpwdHIsIHVuc2lnbmVkIHNob3J0IHB0eXBlLCBzdHJ1Y3QgaXBoZHIgKmlwLCBzdHJ1Y3QgdWRwaGRyICp1ZHApOworZXh0ZXJuIGludCBhd2FpdF9yZXBseSBQKChyZXBseV90IHJlcGx5LAlpbnQgaXZhbCwgdm9pZCAqcHRyLCBsb25nIHRpbWVvdXQpKTsKK2V4dGVybiBpbnQgZGVjb2RlX3JmYzE1MzMgUCgodW5zaWduZWQgY2hhciAqLCB1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGludCwgaW50KSk7CitleHRlcm4gdm9pZCBqb2luX2dyb3VwKGludCBzbG90LCB1bnNpZ25lZCBsb25nIGdyb3VwKTsKK2V4dGVybiB2b2lkIGxlYXZlX2dyb3VwKGludCBzbG90KTsKKyNkZWZpbmUgUkFORF9NQVggMjE0NzQ4MzY0N0wKK2V4dGVybiB1aW50MTZfdCBpcGNoa3N1bSBQKChjb25zdCB2b2lkICppcCwgdW5zaWduZWQgbG9uZyBsZW4pKTsKK2V4dGVybiB1aW50MTZfdCBhZGRfaXBjaGtzdW1zIFAoKHVuc2lnbmVkIGxvbmcgb2Zmc2V0LCB1aW50MTZfdCBzdW0sIHVpbnQxNl90IG5ldykpOworZXh0ZXJuIGludDMyX3QgcmFuZG9tIFAoKHZvaWQpKTsKK2V4dGVybiBsb25nIHJmYzIxMzFfc2xlZXBfaW50ZXJ2YWwgUCgobG9uZyBiYXNlLCBpbnQgZXhwKSk7CitleHRlcm4gbG9uZyByZmMxMTEyX3NsZWVwX2ludGVydmFsIFAoKGxvbmcgYmFzZSwgaW50IGV4cCkpOworI2lmbmRlZiBET1dOTE9BRF9QUk9UT19URlRQCisjZGVmaW5lCXRmdHAoZm5hbWUsIGxvYWRfYmxvY2spIDAKKyNlbmRpZgorZXh0ZXJuIHZvaWQgY2xlYW51cCBQKCh2b2lkKSk7CisKKy8qIG1pc2MuYyAqLworZXh0ZXJuIHZvaWQgdHdpZGRsZSBQKCh2b2lkKSk7CitleHRlcm4gdm9pZCBzbGVlcCBQKChpbnQgc2VjcykpOworZXh0ZXJuIHZvaWQgaW50ZXJydXB0aWJsZV9zbGVlcCBQKChpbnQgc2VjcykpOworZXh0ZXJuIHZvaWQgcG9sbF9pbnRlcnJ1cHRpb25zIFAoKHZvaWQpKTsKK2V4dGVybiBpbnQgc3RyY2FzZWNtcCBQKChjb25zdCBjaGFyICphLCBjb25zdCBjaGFyICpiKSk7CitleHRlcm4gY2hhciAqc3Vic3RyIFAoKGNvbnN0IGNoYXIgKmEsIGNvbnN0IGNoYXIgKmIpKTsKK2V4dGVybiB1bnNpZ25lZCBsb25nIHN0cnRvdWwgUCgoY29uc3QgY2hhciAqcCwgY29uc3QgY2hhciAqKiwgaW50IGJhc2UpKTsKK2V4dGVybiB2b2lkIHByaW50ZiBQKChjb25zdCBjaGFyICosIC4uLikpOworZXh0ZXJuIGludCBzcHJpbnRmIFAoKGNoYXIgKiwgY29uc3QgY2hhciAqLCAuLi4pKTsKK2V4dGVybiBpbnQgaW5ldF9hdG9uIFAoKGNoYXIgKnAsIGluX2FkZHIgKmkpKTsKK2V4dGVybiB2b2lkIHB1dGNoYXIgUCgoaW50KSk7CitleHRlcm4gaW50IGdldGNoYXIgUCgodm9pZCkpOworZXh0ZXJuIGludCBpc2tleSBQKCh2b2lkKSk7CisKK2V4dGVybiB2b2lkIGdydWJfcHJpbnRmKGNvbnN0IGNoYXIgKiwgLi4uKTsKK2V4dGVybiBjaGFyIGNvbmZpZ19maWxlWzEyOF07CitleHRlcm4gdm9pZCBldGhlcmJvb3RfcHJpbnRmKGNvbnN0IGNoYXIgKiwgIC4uLik7CitleHRlcm4gaW50IGV0aGVyYm9vdF9zcHJpbnRmKGNoYXIgKiwgY29uc3QgY2hhciAqLCAuLi4pOworZXh0ZXJuIGludCBnZXRkZWMoY2hhciAqKnMpOworZXh0ZXJuIHZvaWQgY2xlYW51cF9uZXQodm9pZCk7CitleHRlcm4gdm9pZCBwcmludF9uZXR3b3JrX2NvbmZpZ3VyYXRpb24gKHZvaWQpOworZXh0ZXJuIGludCBpZmNvbmZpZyAoY2hhciAqLCBjaGFyICosIGNoYXIgKiwgY2hhciAqKTsKK2V4dGVybiBzdHJ1Y3QgYXJwdGFibGVfdCBhcnB0YWJsZVtNQVhfQVJQXTsKKworI3VuZGVmIHByaW50ZgorI3VuZGVmIHNwcmludGYKKyNkZWZpbmUgcHJpbnRmIGV0aGVyYm9vdF9wcmludGYKKyNkZWZpbmUgc3ByaW50ZiBldGhlcmJvb3Rfc3ByaW50ZgorCisjaWZkZWYgREVCVUcKKyNkZWZpbmUgRW50ZXJGdW5jdGlvbihmdW5jKSBwcmludGYoIkVudGVyOiAiIGZ1bmMgIlxuIik7CisjZGVmaW5lIExlYXZlRnVuY3Rpb24oZnVuYykgcHJpbnRmKCJMZWF2ZTogIiBmdW5jICJcbiIpOworI2Vsc2UKKyNkZWZpbmUgRW50ZXJGdW5jdGlvbihmdW5jKQorI2RlZmluZSBMZWF2ZUZ1bmN0aW9uKGZ1bmMpCisjZW5kaWYKKworLyoKKyAqIFNvbWUgY29kZXMgZnJvbSBldGhlcmJvb3QgdXNlIGEgbGV2ZWwgaW4gREVCVUcuIERlZmluZSBpdCB0byBiZQorICogemVybyBtZWFucyBubyBkZWJ1ZyBpbmZvIG91dHB1dCwgdGhhdCB3aWxsIG1ha2UgdGhlbSBzaWxlbmNlIGluCisgKiBjb21waWxpbmcuIFVwIGl0IGFzIHlvdSB3YW50LgorICovCisjaWZuZGVmIERFQlVHCisjICBkZWZpbmUgREVCVUcgMAorI2VuZGlmCisKKy8qI2RlZmluZSBSUENfREVCVUcqLworCitleHRlcm4gY2hhciAqaG9zdG5hbWU7CisKK2V4dGVybiBpbnQgaG9zdG5hbWVsZW47CisvKiBXaGV0aGVyIG5ldHdvcmsgaXMgcmVhZHkgKi8KK2V4dGVybiBpbnQgbmV0d29ya19yZWFkeTsKKworLyogVXNlciBhYm9ydGVkIGluIGF3YWl0X3JlcGx5IGlmIG5vdCB6ZXJvICovCitleHRlcm4gaW50IHVzZXJfYWJvcnQ7CisKK2V4dGVybiBpbnQgcmFycCh2b2lkKTsKK2V4dGVybiBpbnQgZ3J1Yl9ldGhfcHJvYmUodm9pZCk7CitleHRlcm4gaW50IGJvb3RwKHZvaWQpOworCitleHRlcm4gaW50IGRoY3Aodm9pZCk7CisKK2V4dGVybiBzdHJ1Y3QgbmljIG5pYzsKKyNlbmRpZiAvKiBHUlVCX0ggKi8KZGlmZiAtTmF1ciBncnViLTAuOTcub3JpZy9uZXRib290L2kzODZfYnl0ZXN3YXAuaCBncnViLTAuOTcvbmV0Ym9vdC9pMzg2X2J5dGVzd2FwLmgKLS0tIGdydWItMC45Ny5vcmlnL25ldGJvb3QvaTM4Nl9ieXRlc3dhcC5oCTE5NzAtMDEtMDEgMDA6MDA6MDAuMDAwMDAwMDAwICswMDAwCisrKyBncnViLTAuOTcvbmV0Ym9vdC9pMzg2X2J5dGVzd2FwLmgJMjAwNS0wOC0zMSAxOTowMzozNS4wMDAwMDAwMDAgKzAwMDAKQEAgLTAsMCArMSw0NiBAQAorI2lmbmRlZiBFVEhFUkJPT1RfQklUU19CWVRFU1dBUF9ICisjZGVmaW5lIEVUSEVSQk9PVF9CSVRTX0JZVEVTV0FQX0gKKworI2luY2x1ZGUgInR5cGVzLmgiCitzdGF0aWMgaW5saW5lIHVpbnQxNl90IF9faTM4Nl9ic3dhcF8xNih1aW50MTZfdCB4KQoreworCV9fYXNtX18oInhjaGdiICViMCwlaDBcblx0IgorCQk6ICI9cSIgKHgpCisJCTogIjAiICh4KSk7CisJcmV0dXJuIHg7Cit9CisKK3N0YXRpYyBpbmxpbmUgdWludDMyX3QgX19pMzg2X2Jzd2FwXzMyKHVpbnQzMl90IHgpCit7CisJX19hc21fXygieGNoZ2IgJWIwLCVoMFxuXHQiCisJCSJyb3JsICQxNiwlMFxuXHQiCisJCSJ4Y2hnYiAlYjAsJWgwIgorCQk6ICI9cSIgKHgpCisJCTogIjAiICh4KSk7CisJcmV0dXJuIHg7Cit9CisKKworI2RlZmluZSBfX2Jzd2FwX2NvbnN0YW50XzE2KHgpIFwKKwkoKHVpbnQxNl90KSgoKCh1aW50MTZfdCkoeCkgJiAweDAwZmYpIDw8IDgpIHwgXAorCQkoKCh1aW50MTZfdCkoeCkgJiAweGZmMDApID4+IDgpKSkKKworI2RlZmluZSBfX2Jzd2FwX2NvbnN0YW50XzMyKHgpIFwKKwkoKHVpbnQzMl90KSgoKCh1aW50MzJfdCkoeCkgJiAweDAwMDAwMGZmVSkgPDwgMjQpIHwgXAorCQkoKCh1aW50MzJfdCkoeCkgJiAweDAwMDBmZjAwVSkgPDwgIDgpIHwgXAorCQkoKCh1aW50MzJfdCkoeCkgJiAweDAwZmYwMDAwVSkgPj4gIDgpIHwgXAorCQkoKCh1aW50MzJfdCkoeCkgJiAweGZmMDAwMDAwVSkgPj4gMjQpKSkKKworI2RlZmluZSBfX2Jzd2FwXzE2KHgpIFwKKwkoX19idWlsdGluX2NvbnN0YW50X3AoeCkgPyBcCisJX19ic3dhcF9jb25zdGFudF8xNih4KSA6IFwKKwlfX2kzODZfYnN3YXBfMTYoeCkpCisKKworI2RlZmluZSBfX2Jzd2FwXzMyKHgpIFwKKwkoX19idWlsdGluX2NvbnN0YW50X3AoeCkgPyBcCisJX19ic3dhcF9jb25zdGFudF8zMih4KSA6IFwKKwlfX2kzODZfYnN3YXBfMzIoeCkpCisKKworI2VuZGlmIC8qIEVUSEVSQk9PVF9CSVRTX0JZVEVTV0FQX0ggKi8KZGlmZiAtTmF1ciBncnViLTAuOTcub3JpZy9uZXRib290L2kzODZfZWxmLmggZ3J1Yi0wLjk3L25ldGJvb3QvaTM4Nl9lbGYuaAotLS0gZ3J1Yi0wLjk3Lm9yaWcvbmV0Ym9vdC9pMzg2X2VsZi5oCTE5NzAtMDEtMDEgMDA6MDA6MDAuMDAwMDAwMDAwICswMDAwCisrKyBncnViLTAuOTcvbmV0Ym9vdC9pMzg2X2VsZi5oCTIwMDUtMDgtMzEgMTk6MDM6MzUuMDAwMDAwMDAwICswMDAwCkBAIC0wLDAgKzEsOTEgQEAKKyNpZm5kZWYgSTM4Nl9CSVRTX0VMRl9ICisjZGVmaW5lIEkzODZfQklUU19FTEZfSAorCisjaW5jbHVkZSAiY3B1LmgiCisKKyNpZmRlZiBDT05GSUdfWDg2XzY0CisvKiBFTEYgRGVmaW5lcyBmb3IgdGhlIDY0Yml0IHZlcnNpb24gb2YgdGhlIGN1cnJlbnQgYXJjaGl0ZWN0dXJlICovCisjZGVmaW5lIEVNX0NVUlJFTlRfNjQJRU1fWDg2XzY0CisjZGVmaW5lIEVNX0NVUlJFTlRfNjRfUFJFU0VOVCAoIFwKKwlDUFVfRkVBVFVSRV9QKGNwdV9pbmZvLng4Nl9jYXBhYmlsaXR5LCBMTSkgJiYgXAorCUNQVV9GRUFUVVJFX1AoY3B1X2luZm8ueDg2X2NhcGFiaWxpdHksIFBBRSkgJiYgXAorCUNQVV9GRUFUVVJFX1AoY3B1X2luZm8ueDg2X2NhcGFiaWxpdHksIFBTRSkpCisJCQkKKyNkZWZpbmUgRUxGX0NIRUNLX1g4Nl82NF9BUkNIKHgpIFwKKwkoRU1fQ1VSUkVOVF82NF9QUkVTRU5UICYmICgoeCkuZV9tYWNoaW5lID09IEVNX1g4Nl82NCkpCisjZGVmaW5lIF9fdW51c2VkX2kzODYKKyNlbHNlCisjZGVmaW5lIEVMRl9DSEVDS19YODZfNjRfQVJDSCh4KSAwCisjZGVmaW5lIF9fdW51c2VkX2kzODYgX191bnVzZWQKKyNlbmRpZgorCisKKy8qIEVMRiBEZWZpbmVzIGZvciB0aGUgY3VycmVudCBhcmNoaXRlY3R1cmUgKi8KKyNkZWZpbmUJRU1fQ1VSUkVOVAlFTV8zODYKKyNkZWZpbmUgRUxGREFUQV9DVVJSRU5UCUVMRkRBVEEyTFNCCisKKyNkZWZpbmUgRUxGX0NIRUNLX0kzODZfQVJDSCh4KSBcCisJKCgoeCkuZV9tYWNoaW5lID09IEVNXzM4NikgfHwgKCh4KS5lX21hY2hpbmUgPT0gRU1fNDg2KSkKKworI2RlZmluZSBFTEZfQ0hFQ0tfQVJDSCh4KSBcCisJKChFTEZfQ0hFQ0tfSTM4Nl9BUkNIKHgpIHx8IEVMRl9DSEVDS19YODZfNjRfQVJDSCh4KSkgJiYgXAorCQkoKHgpLmVfZW50cnkgPD0gMHhmZmZmZmZmZlVMKSkKKworI2lmZGVmICBJTUFHRV9GUkVFQlNECisvKgorICogRnJlZUJTRCBoYXMgdGhpcyByYXRoZXIgc3RyYW5nZSAiZmVhdHVyZSIgb2YgaXRzIGRlc2lnbi4KKyAqIEF0IHNvbWUgcG9pbnQgaW4gaXRzIGV2b2x1dGlvbiwgRnJlZUJTRCBzdGFydGVkIHRvIHJlbHkKKyAqIGV4dGVybmFsbHkgb24gcHJpdmF0ZS9zdGF0aWMvZGVidWcgaW50ZXJuYWwgc3ltYm9sIGluZm9ybWF0aW9uLgorICogVGhhdCBpcywgc29tZSBvZiB0aGUgaW50ZXJmYWNlcyB0aGF0IHNvZnR3YXJlIHVzZXMgdG8gYWNjZXNzCisgKiBhbmQgd29yayB3aXRoIHRoZSBGcmVlQlNEIGtlcm5lbCBhcmUgbWFkZSBhdmFpbGFibGUgbm90CisgKiB2aWEgdGhlIHNoYXJlZCBsaWJyYXJ5IHN5bWJvbCBpbmZvcm1hdGlvbiAodGhlIC5EWU5BTUlDIHNlY3Rpb24pCisgKiBidXQgcmF0aGVyIHRoZSBkZWJ1ZyBzeW1ib2xzLiAgVGhpcyBtZWFucyB0aGF0IGFueSBzeW1ib2wsIG5vdAorICoganVzdCBwdWJsaWNseSBkZWZpbmVkIHN5bWJvbHMgY2FuIGJlIChhbmQgYXJlKSB1c2VkIGJ5IHN5c3RlbQorICogdG9vbHMgdG8gbWFrZSB0aGUgc3lzdGVtIHdvcmsuICAoc3VjaCBhcyB0b3AsIHN3YXBpbmZvLCBzd2Fwb24sCisgKiBldGMpCisgKgorICogRXZlbiB3b3JzZSwgaG93ZXZlciwgaXMgdGhlIGZhY3QgdGhhdCBzdGFuZGFyZCBFTEYgbG9hZGVycyBkbworICogbm90IGtub3cgaG93IHRvIGxvYWQgdGhlIHN5bWJvbHMgc2luY2UgdGhleSBhcmUgbm90IHdpdGhpbgorICogYW4gRUxGIFBUX0xPQUQgc2VjdGlvbi4gIFRoZSBrZXJuZWwgbmVlZHMgdGhlc2Ugc3ltYm9scyB0bworICogb3BlcmF0ZSBzbyB0aGUgZm9sbG93aW5nIGNoYW5nZXMvYWRkaXRpb25zIHRvIHRoZSBib290CisgKiBsb2FkaW5nIG9mIEV0aGVyQm9vdCBoYXZlIGJlZW4gbWFkZSB0byBnZXQgdGhlIGtlcm5lbCB0byBsb2FkLgorICogQWxsIG9mIHRoZSBjaGFuZ2VzIGFyZSB3aXRoaW4gSU1BR0VfRlJFRUJTRCBzdWNoIHRoYXQgdGhlCisgKiBleHRyYS9jaGFuZ2VkIGNvZGUgb25seSBjb21waWxlcyB3aGVuIEZSRUVCU0Qgc3VwcG9ydCBpcworICogZW5hYmxlZC4KKyAqLworCisvKgorICogU2VjdGlvbiBoZWFkZXIgZm9yIEZyZWVCU0QgKGRlYnVnIHN5bWJvbCBrbHVkZ2UhKSBzdXBwb3J0CisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKwlFbGYzMl9Xb3JkCXNoX25hbWU7CS8qIFNlY3Rpb24gbmFtZSAoaW5kZXggaW50byB0aGUKKwkJCQkJICAgc2VjdGlvbiBoZWFkZXIgc3RyaW5nIHRhYmxlKS4gKi8KKwlFbGYzMl9Xb3JkCXNoX3R5cGU7CS8qIFNlY3Rpb24gdHlwZS4gKi8KKwlFbGYzMl9Xb3JkCXNoX2ZsYWdzOwkvKiBTZWN0aW9uIGZsYWdzLiAqLworCUVsZjMyX0FkZHIJc2hfYWRkcjsJLyogQWRkcmVzcyBpbiBtZW1vcnkgaW1hZ2UuICovCisJRWxmMzJfT2ZmCXNoX29mZnNldDsJLyogT2Zmc2V0IGluIGZpbGUuICovCisJRWxmMzJfU2l6ZQlzaF9zaXplOwkvKiBTaXplIGluIGJ5dGVzLiAqLworCUVsZjMyX1dvcmQJc2hfbGluazsJLyogSW5kZXggb2YgYSByZWxhdGVkIHNlY3Rpb24uICovCisJRWxmMzJfV29yZAlzaF9pbmZvOwkvKiBEZXBlbmRzIG9uIHNlY3Rpb24gdHlwZS4gKi8KKwlFbGYzMl9TaXplCXNoX2FkZHJhbGlnbjsJLyogQWxpZ25tZW50IGluIGJ5dGVzLiAqLworCUVsZjMyX1NpemUJc2hfZW50c2l6ZTsJLyogU2l6ZSBvZiBlYWNoIGVudHJ5IGluIHNlY3Rpb24uICovCit9IEVsZjMyX1NoZHI7CisKKy8qIHNoX3R5cGUgKi8KKyNkZWZpbmUgU0hUX1NZTVRBQgkyCQkvKiBzeW1ib2wgdGFibGUgc2VjdGlvbiAqLworI2RlZmluZSBTSFRfU1RSVEFCCTMJCS8qIHN0cmluZyB0YWJsZSBzZWN0aW9uICovCisKKy8qCisgKiBNb2R1bGUgaW5mb3JtYXRpb24gc3VidHlwZXMgKGZvciB0aGUgbWV0YWRhdGEgdGhhdCB3ZSBuZWVkIHRvIGJ1aWxkKQorICovCisjZGVmaW5lIE1PRElORk9fRU5ECQkweDAwMDAJCS8qIEVuZCBvZiBsaXN0ICovCisjZGVmaW5lIE1PRElORk9fTkFNRQkJMHgwMDAxCQkvKiBOYW1lIG9mIG1vZHVsZSAoc3RyaW5nKSAqLworI2RlZmluZSBNT0RJTkZPX1RZUEUJCTB4MDAwMgkJLyogVHlwZSBvZiBtb2R1bGUgKHN0cmluZykgKi8KKyNkZWZpbmUgTU9ESU5GT19NRVRBREFUQQkweDgwMDAJCS8qIE1vZHVsZS1zcGVjZmljICovCisKKyNkZWZpbmUgTU9ESU5GT01EX1NTWU0JCTB4MDAwMwkJLyogc3RhcnQgb2Ygc3ltYm9scyAqLworI2RlZmluZSBNT0RJTkZPTURfRVNZTQkJMHgwMDA0CQkvKiBlbmQgb2Ygc3ltYm9scyAqLworCisjZW5kaWYJLyogSU1BR0VfRlJFRUJTRCAqLworCisjZW5kaWYgLyogSTM4Nl9CSVRTX0VMRl9IICovCmRpZmYgLU5hdXIgZ3J1Yi0wLjk3Lm9yaWcvbmV0Ym9vdC9pMzg2X2VuZGlhbi5oIGdydWItMC45Ny9uZXRib290L2kzODZfZW5kaWFuLmgKLS0tIGdydWItMC45Ny5vcmlnL25ldGJvb3QvaTM4Nl9lbmRpYW4uaAkxOTcwLTAxLTAxIDAwOjAwOjAwLjAwMDAwMDAwMCArMDAwMAorKysgZ3J1Yi0wLjk3L25ldGJvb3QvaTM4Nl9lbmRpYW4uaAkyMDA1LTA4LTMxIDE5OjAzOjM1LjAwMDAwMDAwMCArMDAwMApAQCAtMCwwICsxLDYgQEAKKyNpZm5kZWYgRVRIRVJCT09UX0JJVFNfRU5ESUFOX0gKKyNkZWZpbmUgRVRIRVJCT09UX0JJVFNfRU5ESUFOX0gKKworI2RlZmluZSBfX0JZVEVfT1JERVIgX19MSVRUTEVfRU5ESUFOCisKKyNlbmRpZiAvKiBFVEhFUkJPT1RfQklUU19FTkRJQU5fSCAqLwpkaWZmIC1OYXVyIGdydWItMC45Ny5vcmlnL25ldGJvb3QvaTM4Nl90aW1lci5jIGdydWItMC45Ny9uZXRib290L2kzODZfdGltZXIuYwotLS0gZ3J1Yi0wLjk3Lm9yaWcvbmV0Ym9vdC9pMzg2X3RpbWVyLmMJMTk3MC0wMS0wMSAwMDowMDowMC4wMDAwMDAwMDAgKzAwMDAKKysrIGdydWItMC45Ny9uZXRib290L2kzODZfdGltZXIuYwkyMDA1LTA4LTMxIDE5OjAzOjM1LjAwMDAwMDAwMCArMDAwMApAQCAtMCwwICsxLDE5MiBAQAorLyogQSBjb3VwbGUgb2Ygcm91dGluZXMgdG8gaW1wbGVtZW50IGEgbG93LW92ZXJoZWFkIHRpbWVyIGZvciBkcml2ZXJzICovCisKKyAvKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQKKyAqIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworI2luY2x1ZGUgImdydWIuaCIKKyNpbmNsdWRlICJvc2RlcC5oIgorI2luY2x1ZGUgImlvLmgiCisjaW5jbHVkZSAidGltZXIuaCIKKyNpbmNsdWRlICJsYXRjaC5oIgorCit2b2lkIF9fbG9hZF90aW1lcjIodW5zaWduZWQgaW50IHRpY2tzKQoreworCS8qCisJICogTm93IGxldCdzIHRha2UgY2FyZSBvZiBQUEMgY2hhbm5lbCAyCisJICoKKwkgKiBTZXQgdGhlIEdhdGUgaGlnaCwgcHJvZ3JhbSBQUEMgY2hhbm5lbCAyIGZvciBtb2RlIDAsCisJICogKGludGVycnVwdCBvbiB0ZXJtaW5hbCBjb3VudCBtb2RlKSwgYmluYXJ5IGNvdW50LAorCSAqIGxvYWQgNSAqIExBVENIIGNvdW50LCAoTFNCIGFuZCBNU0IpIHRvIGJlZ2luIGNvdW50ZG93bi4KKwkgKgorCSAqIE5vdGUgc29tZSBpbXBsZW1lbnRhdGlvbnMgaGF2ZSBhIGJ1ZyB3aGVyZSB0aGUgaGlnaCBiaXRzIGJ5dGUKKwkgKiBvZiBjaGFubmVsIDIgaXMgaWdub3JlZC4KKwkgKi8KKwkvKiBTZXQgdXAgdGhlIHRpbWVyIGdhdGUsIHR1cm4gb2ZmIHRoZSBzcGVha2VyICovCisJLyogU2V0IHRoZSBHYXRlIGhpZ2gsIGRpc2FibGUgc3BlYWtlciAqLworCW91dGIoKGluYihQUENfUE9SVEIpICYgflBQQ0JfU1BLUikgfCBQUENCX1QyR0FURSwgUFBDX1BPUlRCKTsKKwkvKiBiaW5hcnksIG1vZGUgMCwgTFNCL01TQiwgQ2ggMiAqLworCW91dGIoVElNRVIyX1NFTHxXT1JEX0FDQ0VTU3xNT0RFMHxCSU5BUllfQ09VTlQsIFRJTUVSX01PREVfUE9SVCk7CisJLyogTFNCIG9mIHRpY2tzICovCisJb3V0Yih0aWNrcyAmIDB4RkYsIFRJTUVSMl9QT1JUKTsKKwkvKiBNU0Igb2YgdGlja3MgKi8KKwlvdXRiKHRpY2tzID4+IDgsIFRJTUVSMl9QT1JUKTsKK30KKworc3RhdGljIGludCBfX3RpbWVyMl9ydW5uaW5nKHZvaWQpCit7CisJcmV0dXJuICgoaW5iKFBQQ19QT1JUQikgJiBQUENCX1QyT1VUKSA9PSAwKTsKK30KKworI2lmICFkZWZpbmVkKENPTkZJR19UU0NfQ1VSUlRJQ0tTKQordm9pZCBzZXR1cF90aW1lcnModm9pZCkKK3sKKwlyZXR1cm47Cit9CisKK3ZvaWQgbG9hZF90aW1lcjIodW5zaWduZWQgaW50IHRpY2tzKQoreworCXJldHVybiBfX2xvYWRfdGltZXIyKHRpY2tzKTsKK30KKworaW50IHRpbWVyMl9ydW5uaW5nKHZvaWQpCit7CisJcmV0dXJuIF9fdGltZXIyX3J1bm5pbmcoKTsKK30KKwordm9pZCBuZGVsYXkodW5zaWduZWQgaW50IG5zZWNzKQoreworCXdhaXRvbl90aW1lcjIoKG5zZWNzICogQ0xPQ0tfVElDS19SQVRFKS8xMDAwMDAwMDAwKTsKK30KK3ZvaWQgdWRlbGF5KHVuc2lnbmVkIGludCB1c2VjcykKK3sKKwl3YWl0b25fdGltZXIyKCh1c2VjcyAqIFRJQ0tTX1BFUl9NUykvMTAwMCk7Cit9CisjZW5kaWYgLyogIWRlZmluZWQoQ09ORklHX1RTQ19DVVJSVElDS1MpICovCisKKyNpZiBkZWZpbmVkKENPTkZJR19UU0NfQ1VSUlRJQ0tTKQorCisjZGVmaW5lIHJkdHNjKGxvdyxoaWdoKSBcCisgICAgIF9fYXNtX18gX192b2xhdGlsZV9fKCJyZHRzYyIgOiAiPWEiIChsb3cpLCAiPWQiIChoaWdoKSkKKworI2RlZmluZSByZHRzY2xsKHZhbCkgXAorICAgICBfX2FzbV9fIF9fdm9sYXRpbGVfXyAoInJkdHNjIiA6ICI9QSIgKHZhbCkpCisKKworLyogTnVtYmVyIG9mIGNsb2NrIHRpY2tzIHRvIHRpbWUgd2l0aCB0aGUgcnRjICovCisjZGVmaW5lIExBVENIIDB4RkYKKworI2RlZmluZSBMQVRDSEVTX1BFUl9TRUMgKChDTE9DS19USUNLX1JBVEUgKyAoTEFUQ0gvMikpL0xBVENIKQorI2RlZmluZSBUSUNLU19QRVJfTEFUQ0ggKChMQVRDSEVTX1BFUl9TRUMgKyAoVElDS1NfUEVSX1NFQy8yKSkvVElDS1NfUEVSX1NFQykKKworc3RhdGljIHZvaWQgc2xlZXBfbGF0Y2godm9pZCkKK3sKKwlfX2xvYWRfdGltZXIyKExBVENIKTsKKwl3aGlsZShfX3RpbWVyMl9ydW5uaW5nKCkpOworfQorCisvKiAtLS0tLS0gQ2FsaWJyYXRlIHRoZSBUU0MgLS0tLS0tLSAKKyAqIFRpbWUgaG93IGxvbmcgaXQgdGFrZXMgdG8gZXhjdXRlIGEgbG9vcCB0aGF0IHJ1bnMgaW4ga25vd24gdGltZS4KKyAqIEFuZCBmaW5kIHRoZSBjb252ZXJ0aW9uIG5lZWRlZCB0byBnZXQgdG8gQ0xPQ0tfVElDS19SQVRFCisgKi8KKworCitzdGF0aWMgdW5zaWduZWQgbG9uZyBsb25nIGNhbGlicmF0ZV90c2Modm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIHN0YXJ0bG93LCBzdGFydGhpZ2g7CisJdW5zaWduZWQgbG9uZyBlbmRsb3csIGVuZGhpZ2g7CisJCisJcmR0c2Moc3RhcnRsb3csc3RhcnRoaWdoKTsKKwlzbGVlcF9sYXRjaCgpOworCXJkdHNjKGVuZGxvdyxlbmRoaWdoKTsKKworCS8qIDY0LWJpdCBzdWJ0cmFjdCAtIGdjYyBqdXN0IG1lc3NlcyB1cCB3aXRoIGxvbmcgbG9uZ3MgKi8KKwlfX2FzbV9fKCJzdWJsICUyLCUwXG5cdCIKKwkJInNiYmwgJTMsJTEiCisJCToiPWEiIChlbmRsb3cpLCAiPWQiIChlbmRoaWdoKQorCQk6ImciIChzdGFydGxvdyksICJnIiAoc3RhcnRoaWdoKSwKKwkJIjAiIChlbmRsb3cpLCAiMSIgKGVuZGhpZ2gpKTsKKwkKKwkvKiBFcnJvcjogRUNQVVRPT0ZBU1QgKi8KKwlpZiAoZW5kaGlnaCkKKwkJZ290byBiYWRfY3RjOworCQorCWVuZGxvdyAqPSBUSUNLU19QRVJfTEFUQ0g7CisJcmV0dXJuIGVuZGxvdzsKKworCS8qCisJICogVGhlIENUQyB3YXNuJ3QgcmVsaWFibGU6IHdlIGdvdCBhIGhpdCBvbiB0aGUgdmVyeSBmaXJzdCByZWFkLAorCSAqIG9yIHRoZSBDUFUgd2FzIHNvIGZhc3Qvc2xvdyB0aGF0IHRoZSBxdW90aWVudCB3b3VsZG4ndCBmaXQgaW4KKwkgKiAzMiBiaXRzLi4KKwkgKi8KK2JhZF9jdGM6CisJcHJpbnRmKCJiYWRfY3RjXG4iKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHVuc2lnbmVkIGxvbmcgY2xvY2tzX3Blcl90aWNrOwordm9pZCBzZXR1cF90aW1lcnModm9pZCkKK3sKKwlpZiAoIWNsb2Nrc19wZXJfdGljaykgeworCQljbG9ja3NfcGVyX3RpY2sgPSBjYWxpYnJhdGVfdHNjKCk7CisJCS8qIERpc3BsYXkgdGhlIENQVSBNaHogdG8gZWFzaWx5IHRlc3QgaWYgdGhlIGNhbGlicmF0aW9uIHdhcyBiYWQgKi8KKwkJcHJpbnRmKCJDUFUgJWxkIE1oelxuIiwgKGNsb2Nrc19wZXJfdGljay8xMDAwICogVElDS1NfUEVSX1NFQykvMTAwMCk7CisJfQorfQorCit1bnNpZ25lZCBsb25nIGN1cnJ0aWNrcyh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgY2xvY2tzX2hpZ2gsIGNsb2Nrc19sb3c7CisJdW5zaWduZWQgbG9uZyBjdXJydGlja3M7CisJLyogUmVhZCB0aGUgVGltZSBTdGFtcCBDb3VudGVyICovCisJcmR0c2MoY2xvY2tzX2xvdywgY2xvY2tzX2hpZ2gpOworCisJLyogY3VycnRpY2tzID0gY2xvY2tzIC8gY2xvY2tzX3Blcl90aWNrOyAqLworCV9fYXNtX18oImRpdmwgJTEiCisJCToiPWEiIChjdXJydGlja3MpCisJCToiciIgKGNsb2Nrc19wZXJfdGljayksICIwIiAoY2xvY2tzX2xvdyksICJkIiAoY2xvY2tzX2hpZ2gpKTsKKworCisJcmV0dXJuIGN1cnJ0aWNrczsKK30KKworc3RhdGljIHVuc2lnbmVkIGxvbmcgbG9uZyB0aW1lcl90aW1lb3V0Oworc3RhdGljIGludCBfX3RpbWVyX3J1bm5pbmcodm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIGxvbmcgbm93OworCXJkdHNjbGwobm93KTsKKwlyZXR1cm4gbm93IDwgdGltZXJfdGltZW91dDsKK30KKwordm9pZCB1ZGVsYXkodW5zaWduZWQgaW50IHVzZWNzKQoreworCXVuc2lnbmVkIGxvbmcgbG9uZyBub3c7CisJcmR0c2NsbChub3cpOworCXRpbWVyX3RpbWVvdXQgPSBub3cgKyB1c2VjcyAqICgoY2xvY2tzX3Blcl90aWNrICogVElDS1NfUEVSX1NFQykvKDEwMDAqMTAwMCkpOworCXdoaWxlKF9fdGltZXJfcnVubmluZygpKTsKK30KK3ZvaWQgbmRlbGF5KHVuc2lnbmVkIGludCBuc2VjcykKK3sKKwl1bnNpZ25lZCBsb25nIGxvbmcgbm93OworCXJkdHNjbGwobm93KTsKKwl0aW1lcl90aW1lb3V0ID0gbm93ICsgbnNlY3MgKiAoKGNsb2Nrc19wZXJfdGljayAqIFRJQ0tTX1BFUl9TRUMpLygxMDAwKjEwMDAqMTAwMCkpOworCXdoaWxlKF9fdGltZXJfcnVubmluZygpKTsKK30KKwordm9pZCBsb2FkX3RpbWVyMih1bnNpZ25lZCBpbnQgdGltZXIyX3RpY2tzKQoreworCXVuc2lnbmVkIGxvbmcgbG9uZyBub3c7CisJdW5zaWduZWQgbG9uZyBjbG9ja3M7CisJcmR0c2NsbChub3cpOworCWNsb2NrcyA9IHRpbWVyMl90aWNrcyAqICgoY2xvY2tzX3Blcl90aWNrICogVElDS1NfUEVSX1NFQykvQ0xPQ0tfVElDS19SQVRFKTsKKwl0aW1lcl90aW1lb3V0ID0gbm93ICsgY2xvY2tzOworfQorCitpbnQgdGltZXIyX3J1bm5pbmcodm9pZCkKK3sKKwlyZXR1cm4gX190aW1lcl9ydW5uaW5nKCk7Cit9CisKKyNlbmRpZiAvKiBSVENfQ1VSUlRJQ0tTICovCmRpZmYgLU5hdXIgZ3J1Yi0wLjk3Lm9yaWcvbmV0Ym9vdC9pODI1ODYuYyBncnViLTAuOTcvbmV0Ym9vdC9pODI1ODYuYwotLS0gZ3J1Yi0wLjk3Lm9yaWcvbmV0Ym9vdC9pODI1ODYuYwkyMDAzLTA3LTA5IDExOjQ1OjM3LjAwMDAwMDAwMCArMDAwMAorKysgZ3J1Yi0wLjk3L25ldGJvb3QvaTgyNTg2LmMJMTk3MC0wMS0wMSAwMDowMDowMC4wMDAwMDAwMDAgKzAwMDAKQEAgLTEsODI1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotRXRoZXJib290IC0gIEJPT1RQL1RGVFAgQm9vdHN0cmFwIFByb2dyYW0KLWk4MjU4NiBOSUMgZHJpdmVyIGZvciBFdGhlcmJvb3QKLUtlbiBZYXAsIEphbnVhcnkgMTk5OAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQKLSAqIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqLwotCi0jaW5jbHVkZSAiZXRoZXJib290LmgiCi0jaW5jbHVkZSAibmljLmgiCi0jaW5jbHVkZSAiY2FyZHMuaCIKLSNpbmNsdWRlICJ0aW1lci5oIgotCi0jZGVmaW5lCXVkZWxheShuKQl3YWl0b25fdGltZXIyKCgobikqVElDS1NfUEVSX01TKS8xMDAwKQotCi0vKiBTb3VyY2VzIG9mIGluZm9ybWF0aW9uOgotCi0gICBEb25hbGQgQmVja2VyJ3MgZXhjZWxsZW50IDNjNTA3IGRyaXZlciBpbiBMaW51eAotICAgSW50ZWwgODI1OTYgZGF0YSBzaGVldCAoeWVzLCA4MjU5NjsgaXQgaGFzIGEgNTg2IGNvbXBhdGliaWxpdHkgbW9kZSkKLSovCi0KLS8qIENvZGUgYmVsb3cgbW9zdGx5IHN0b2xlbiB3aG9sZXNhbGUgZnJvbSAzYzUwNy5jIGRyaXZlciBpbiBMaW51eCAqLwotCi0vKgotCQlEZXRhaWxzIG9mIHRoZSBpODI1ODYuCi0KLSAgIFlvdSdsbCByZWFsbHkgbmVlZCB0aGUgZGF0YWJvb2sgdG8gdW5kZXJzdGFuZCB0aGUgZGV0YWlscyBvZiB0aGlzIHBhcnQsCi0gICBidXQgdGhlIG91dGxpbmUgaXMgdGhhdCB0aGUgaTgyNTg2IGhhcyB0d28gc2VwYXJhdGUgcHJvY2Vzc2luZyB1bml0cy4KLSAgIEJvdGggYXJlIHN0YXJ0ZWQgZnJvbSBhIGxpc3Qgb2YgdGhyZWUgY29uZmlndXJhdGlvbiB0YWJsZXMsIG9mIHdoaWNoIG9ubHkKLSAgIHRoZSBsYXN0LCB0aGUgU3lzdGVtIENvbnRyb2wgQmxvY2sgKFNDQiksIGlzIHVzZWQgYWZ0ZXIgcmVzZXQtdGltZS4gIFRoZSBTQ0IKLSAgIGhhcyB0aGUgZm9sbG93aW5nIGZpZWxkczoKLQkJU3RhdHVzIHdvcmQKLQkJQ29tbWFuZCB3b3JkCi0JCVR4L0NvbW1hbmQgYmxvY2sgYWRkci4KLQkJUnggYmxvY2sgYWRkci4KLSAgIFRoZSBjb21tYW5kIHdvcmQgYWNjZXB0cyB0aGUgZm9sbG93aW5nIGNvbnRyb2xzIGZvciB0aGUgVHggYW5kIFJ4IHVuaXRzOgotICAqLwotCi0jZGVmaW5lCUNVQ19TVEFSVAkweDAxMDAKLSNkZWZpbmUJQ1VDX1JFU1VNRQkweDAyMDAKLSNkZWZpbmUJQ1VDX1NVU1BFTkQJMHgwMzAwCi0jZGVmaW5lCVJYX1NUQVJUCTB4MDAxMAotI2RlZmluZQlSWF9SRVNVTUUJMHgwMDIwCi0jZGVmaW5lCVJYX1NVU1BFTkQJMHgwMDMwCi0KLS8qIFRoZSBSeCB1bml0IHVzZXMgYSBsaXN0IG9mIGZyYW1lIGRlc2NyaXB0b3JzIGFuZCBhIGxpc3Qgb2YgZGF0YSBidWZmZXIKLSAgIGRlc2NyaXB0b3JzLiAgV2UgdXNlIGZ1bGwtc2l6ZWQgKDE1MTggYnl0ZSkgZGF0YSBidWZmZXJzLCBzbyB0aGVyZSBpcwotICAgYSBvbmUtdG8tb25lIHBhaXJpbmcgb2YgZnJhbWUgZGVzY3JpcHRvcnMgdG8gYnVmZmVyIGRlc2NyaXB0b3JzLgotCi0gICBUaGUgVHggKCJjb21tYW5kIikgdW5pdCBleGVjdXRlcyBhIGxpc3Qgb2YgY29tbWFuZHMgdGhhdCBsb29rIGxpa2U6Ci0JU3RhdHVzIHdvcmQJV3JpdHRlbiBieSB0aGUgODI1ODYgd2hlbiB0aGUgY29tbWFuZCBpcyBkb25lLgotCUNvbW1hbmQgd29yZAlDb21tYW5kIGluIGxvd2VyIDMgYml0cywgcG9zdC1jb21tYW5kIGFjdGlvbiBpbiB1cHBlciAzCi0JTGluayB3b3JkCVRoZSBhZGRyZXNzIG9mIHRoZSBuZXh0IGNvbW1hbmQuCi0JUGFyYW1ldGVycwkoYXMgbmVlZGVkKS4KLQotCVNvbWUgZGVmaW5pdGlvbnMgcmVsYXRlZCB0byB0aGUgQ29tbWFuZCBXb3JkIGFyZToKLSAqLwotI2RlZmluZSBDTURfRU9MCQkweDgwMDAJCS8qIFRoZSBsYXN0IGNvbW1hbmQgb2YgdGhlIGxpc3QsIHN0b3AuICovCi0jZGVmaW5lIENNRF9TVVNQCTB4NDAwMAkJLyogU3VzcGVuZCBhZnRlciBkb2luZyBjbWQuICovCi0jZGVmaW5lIENNRF9JTlRSCTB4MjAwMAkJLyogSW50ZXJydXB0IGFmdGVyIGRvaW5nIGNtZC4gKi8KLQotZW51bSBjb21tYW5kcyB7Ci0JQ21kTk9wID0gMCwgQ21kU0FTZXR1cCA9IDEsIENtZENvbmZpZ3VyZSA9IDIsIENtZE11bHRpY2FzdExpc3QgPSAzLAotCUNtZFR4ID0gNCwgQ21kVERSID0gNSwgQ21kRHVtcCA9IDYsIENtZERpYWdub3NlID0gN307Ci0KLS8qCi0JCURldGFpbHMgb2YgdGhlIEV0aGVyTGluazE2IEltcGxlbWVudGF0aW9uCi0KLSAgVGhlIDNjNTA3IGFuZCBOSTUyMTAgYXJlIGdlbmVyaWMgc2hhcmVkLW1lbW9yeSBpODI1ODYgaW1wbGVtZW50YXRpb25zLgotICAzYzUwNzogVGhlIGhvc3QgY2FuIG1hcCAxNkssIDMySywgNDhLLCBvciA2NEsgb2YgdGhlIDY0SyBtZW1vcnkgaW50bwotICAweDBbQ0RdWzA4XTAwMDAsIG9yIGFsbCA2NEsgaW50byAweEZbMDI0NjhdMDAwMC4KLSAgTkk1MjEwOiBUaGUgaG9zdCBjYW4gbWFwIDhrIG9yIDE2ayBhdCAweFtDREVdWzA0OENdMDAwIGJ1dCB3ZQotICBhc3N1bWUgOGsgYmVjYXVzZSB0byBoYXZlIDE2ayB5b3UgY2Fubm90IHB1dCBhIFJPTSBvbiB0aGUgTklDLgotICAqLwotCi0vKiBPZmZzZXRzIGZyb20gdGhlIGJhc2UgSS9PIGFkZHJlc3MuICovCi0KLSNpZmRlZglJTkNMVURFXzNDNTA3Ci0KLSNkZWZpbmUJU0FfREFUQQkJMAkvKiBTdGF0aW9uIGFkZHJlc3MgZGF0YSwgb3IgM0NvbSBzaWduYXR1cmUuICovCi0jZGVmaW5lIE1JU0NfQ1RSTAk2CS8qIFN3aXRjaCB0aGUgU0FfREFUQSBiYW5rcywgYW5kIGJ1cyBjb25maWcgYml0cy4gKi8KLSNkZWZpbmUgUkVTRVRfSVJRCTEwCS8qIFJlc2V0IHRoZSBsYXRjaGVkIElSUSBsaW5lLiAqLwotI2RlZmluZSBJODI1ODZfQVRUTgkxMQkvKiBGcm9iIHRoZSA4MjU4NiBDaGFubmVsIEF0dGVudGlvbiBsaW5lLiAqLwotI2RlZmluZSBST01fQ09ORklHCTEzCi0jZGVmaW5lIE1FTV9DT05GSUcJMTQKLSNkZWZpbmUgSVJRX0NPTkZJRwkxNQotI2RlZmluZSBFTDE2X0lPX0VYVEVOVAkxNgotCi0vKiBUaGUgSUQgcG9ydCBpcyB1c2VkIGF0IGJvb3QtdGltZSB0byBsb2NhdGUgdGhlIGV0aGVyY2FyZC4gKi8KLSNkZWZpbmUgSURfUE9SVAkJMHgxMDAKLQotI2VuZGlmCi0KLSNpZmRlZglJTkNMVURFX05JNTIxMAotCi0jZGVmaW5lCU5JNTJfUkVTRVQJMCAgLyogd3JpdGluZyB0byB0aGlzIGFkZHJlc3MsIHJlc2V0cyB0aGUgaTgyNTg2ICovCi0jZGVmaW5lCUk4MjU4Nl9BVFROCTEgIC8qIGNoYW5uZWwgYXR0ZW50aW9uLCBraWNrIHRoZSA1ODYgKi8KLQotI2VuZGlmCi0KLSNpZmRlZglJTkNMVURFX0VYT1MyMDUKLQotI2RlZmluZQlFWE9TMjA1X1JFU0VUCTAgIC8qIHdyaXRpbmcgdG8gdGhpcyBhZGRyZXNzLCByZXNldHMgdGhlIGk4MjU4NiAqLwotI2RlZmluZQlJODI1ODZfQVRUTgkxICAvKiBjaGFubmVsIGF0dGVudGlvbiwga2ljayB0aGUgNTg2ICovCi0KLSNlbmRpZgotCi0vKiBPZmZzZXRzIHRvIHJlZ2lzdGVycyBpbiB0aGUgbWFpbGJveCAoU0NCKS4gKi8KLSNkZWZpbmUgaVNDQl9TVEFUVVMJMHg4Ci0jZGVmaW5lIGlTQ0JfQ01ECTB4QQotI2RlZmluZSBpU0NCX0NCTAkweEMJLyogQ29tbWFuZCBCTG9jayBvZmZzZXQuICovCi0jZGVmaW5lIGlTQ0JfUkZBCTB4RQkvKiBSeCBGcmFtZSBBcmVhIG9mZnNldC4gKi8KLQotLyogIFNpbmNlIHRoZSAzYzUwNyBtYXBzIHRoZSBzaGFyZWQgbWVtb3J5IHdpbmRvdyBzbyB0aGF0IHRoZSBsYXN0IGJ5dGUgaXMKLWF0IDgyNTg2IGFkZHJlc3MgRkZGRiwgdGhlIGZpcnN0IGJ5dGUgaXMgYXQgODI1ODYgYWRkcmVzcyAwLCAxNkssIDMySywgb3IKLTQ4SyBjb3JyZXNwb25kaW5nIHRvIHdpbmRvdyBzaXplcyBvZiA2NEssIDQ4SywgMzJLIGFuZCAxNksgcmVzcGVjdGl2ZWx5LgotV2UgY2FuIGFjY291bnQgZm9yIHRoaXMgYmUgc2V0dGluZyB0aGUgJ1NCQyBCYXNlJyBlbnRyeSBpbiB0aGUgSVNDUCB0YWJsZQotYmVsb3cgZm9yIGFsbCB0aGUgMTYgYml0IG9mZnNldCBhZGRyZXNzZXMsIGFuZCBhbHNvIGFkZGluZyB0aGUgJ1NDQiBCYXNlJwotdmFsdWUgdG8gYWxsIDI0IGJpdCBwaHlzaWNhbCBhZGRyZXNzZXMgKGluIHRoZSBTQ1AgdGFibGUgYW5kIHRoZSBUWCBhbmQgUlgKLUJ1ZmZlciBEZXNjcmlwdG9ycykuCi0JCQkJLU1hcmsKLSovCi0KLS8qCi0gIFdoYXQgZm9sbG93cyBpbiAnaW5pdF93b3Jkc1tdJyBpcyB0aGUgInByb2dyYW0iIHRoYXQgaXMgZG93bmxvYWRlZCB0byB0aGUKLSAgODI1ODYgbWVtb3J5LiAgSXQncyBtb3N0bHkgdGFibGVzIGFuZCBjb21tYW5kIGJsb2NrcywgYW5kIHN0YXJ0cyBhdCB0aGUKLSAgcmVzZXQgYWRkcmVzcyAweGZmZmZmNi4gIFRoaXMgaXMgZGVzaWduZWQgdG8gYmUgc2ltaWxhciB0byB0aGUgRXRoZXJFeHByZXNzLAotICB0aHVzIHRoZSB1bnVzdWFsIGxvY2F0aW9uIG9mIHRoZSBTQ0IgYXQgMHgwMDA4LgotCi0gIEV2ZW4gd2l0aCB0aGUgYWRkaXRpb25hbCAiZG9uJ3QgY2FyZSIgdmFsdWVzLCBkb2luZyBpdCB0aGlzIHdheSB0YWtlcyBsZXNzCi0gIHByb2dyYW0gc3BhY2UgdGhhbiBpbml0aWFsaXppbmcgdGhlIGluZGl2aWR1YWwgdGFibGVzLCBhbmQgSSBmZWVsIGl0J3MgbXVjaAotICBjbGVhbmVyLgotCi0gIFRoZSBkYXRhYm9vayBpcyBwYXJ0aWN1bGFybHkgdXNlbGVzcyBmb3IgdGhlIGZpcnN0IHR3byBzdHJ1Y3R1cmVzLCBJIGhhZAotICB0byB1c2UgdGhlIENyeW53ciBkcml2ZXIgYXMgYW4gZXhhbXBsZS4KLQotICBUaGUgbWVtb3J5IHNldHVwIGlzIGFzIGZvbGxvd3M6Ci0qLwotCi0jZGVmaW5lIENPTkZJR19DTUQJMHgxOAotI2RlZmluZSBTRVRfU0FfQ01ECTB4MjQKLSNkZWZpbmUgU0FfT0ZGU0VUCTB4MkEKLSNkZWZpbmUgSURMRUxPT1AJMHgzMAotI2RlZmluZSBURFJfQ01ECQkweDM4Ci0jZGVmaW5lIFREUl9USU1FCTB4M0MKLSNkZWZpbmUgRFVNUF9DTUQJMHg0MAotI2RlZmluZSBESUFHX0NNRAkweDQ4Ci0jZGVmaW5lIFNFVF9NQ19DTUQJMHg0RQotI2RlZmluZSBEVU1QX0RBVEEJMHg1NgkvKiBBIDE3MCBieXRlIGJ1ZmZlciBmb3IgZHVtcCBhbmQgU2V0LU1DIGludG8uICovCi0KLSNkZWZpbmUgVFhfQlVGX1NUQVJUCTB4MDEwMAotI2RlZmluZSBUWF9CVUZfU0laRQkoMTUxOCsxNCsyMCsxNikgLyogcGFja2V0K2hlYWRlcitUQkQgKi8KLQotI2RlZmluZSBSWF9CVUZfU1RBUlQJMHgxMDAwCi0jZGVmaW5lIFJYX0JVRl9TSVpFCSgxNTE4KzE0KzE4KQkvKiBwYWNrZXQraGVhZGVyK1JCRCAqLwotI2RlZmluZSBSWF9CVUZfRU5ECShtZW1fZW5kIC0gbWVtX3N0YXJ0IC0gMjApCi0KLS8qCi0gIFRoYXQncyBpdDogb25seSA4NiBieXRlcyB0byBzZXQgdXAgdGhlIGJlYXN0LCBpbmNsdWRpbmcgZXZlcnkgZXh0cmEKLSAgY29tbWFuZCBhdmFpbGFibGUuICBUaGUgMTcwIGJ5dGUgYnVmZmVyIGF0IERVTVBfREFUQSBpcyBzaGFyZWQgYmV0d2VlbiB0aGUKLSAgRHVtcCBjb21tYW5kIChjYWxsZWQgb25seSBieSB0aGUgZGlhZ25vc3RpYyBwcm9ncmFtKSBhbmQgdGhlIFNldE11bHRpY2FzdExpc3QKLSAgY29tbWFuZC4KLQotICBUbyBjb21wbGV0ZSB0aGUgbWVtb3J5IHNldHVwIHlvdSBvbmx5IGhhdmUgdG8gd3JpdGUgdGhlIHN0YXRpb24gYWRkcmVzcyBhdAotICBTQV9PRkZTRVQgYW5kIGNyZWF0ZSB0aGUgVHggJiBSeCBidWZmZXIgbGlzdHMuCi0KLSAgVGhlIFR4IGNvbW1hbmQgY2hhaW4gYW5kIGJ1ZmZlciBsaXN0IGlzIHNldHVwIGFzIGZvbGxvd3M6Ci0gIEEgVHggY29tbWFuZCB0YWJsZSwgd2l0aCB0aGUgZGF0YSBidWZmZXIgcG9pbnRpbmcgdG8uLi4KLSAgQSBUeCBkYXRhIGJ1ZmZlciBkZXNjcmlwdG9yLiAgVGhlIHBhY2tldCBpcyBpbiBhIHNpbmdsZSBidWZmZXIsIHJhdGhlciB0aGFuCi0JY2hhaW5pbmcgdG9nZXRoZXIgc2V2ZXJhbCBzbWFsbGVyIGJ1ZmZlcnMuCi0gIEEgTm9PcCBjb21tYW5kLCB3aGljaCBpbml0aWFsbHkgcG9pbnRzIHRvIGl0c2VsZiwKLSAgQW5kIHRoZSBwYWNrZXQgZGF0YS4KLQotICBBIHRyYW5zbWl0IGlzIGRvbmUgYnkgZmlsbGluZyBpbiB0aGUgVHggY29tbWFuZCB0YWJsZSBhbmQgZGF0YSBidWZmZXIsCi0gIHJlLXdyaXRpbmcgdGhlIE5vT3AgY29tbWFuZCwgYW5kIGZpbmFsbHkgY2hhbmdpbmcgdGhlIG9mZnNldCBvZiB0aGUgbGFzdAotICBjb21tYW5kIHRvIHBvaW50IHRvIHRoZSBjdXJyZW50IFR4IGNvbW1hbmQuICBXaGVuIHRoZSBUeCBjb21tYW5kIGlzIGZpbmlzaGVkLAotICBpdCBqdW1wcyB0byB0aGUgTm9PcCwgd2hlbiBpdCBsb29wcyB1bnRpbCB0aGUgbmV4dCBUeCBjb21tYW5kIGNoYW5nZXMgdGhlCi0gICJsaW5rIG9mZnNldCIgaW4gdGhlIE5vT3AuICBUaGlzIHdheSB0aGUgODI1ODYgbmV2ZXIgaGFzIHRvIGdvIHRocm91Z2ggdGhlCi0gIHNsb3cgcmVzdGFydCBzZXF1ZW5jZS4KLQotICBUaGUgUnggYnVmZmVyIGxpc3QgaXMgc2V0IHVwIGluIHRoZSBvYnZpb3VzIHJpbmcgc3RydWN0dXJlLiAgV2UgaGF2ZSBlbm91Z2gKLSAgbWVtb3J5IChhbmQgbG93IGVub3VnaCBpbnRlcnJ1cHQgbGF0ZW5jeSkgdGhhdCB3ZSBjYW4gYXZvaWQgdGhlIGNvbXBsaWNhdGVkCi0gIFJ4IGJ1ZmZlciBsaW5rZWQgbGlzdHMgYnkgYWx3YXkgYXNzb2NpYXRpbmcgYSBmdWxsLXNpemUgUnggZGF0YSBidWZmZXIgd2l0aAotICBlYWNoIFJ4IGRhdGEgZnJhbWUuCi0KLSAgSSBjdXJyZW50bHkgdXNlIG9uZSB0cmFuc21pdCBidWZmZXIgc3RhcnRpbmcgYXQgVFhfQlVGX1NUQVJUICgweDAxMDApLCBhbmQKLSAgdXNlIHRoZSByZXN0IG9mIG1lbW9yeSwgZnJvbSBSWF9CVUZfU1RBUlQgdG8gUlhfQlVGX0VORCwgZm9yIFJ4IGJ1ZmZlcnMuCi0KLSAgKi8KLQotc3RhdGljIHVuc2lnbmVkIHNob3J0IGluaXRfd29yZHNbXSA9IHsKLQkvKglTeXN0ZW0gQ29uZmlndXJhdGlvbiBQb2ludGVyIChTQ1ApLiAqLwotI2lmCWRlZmluZWQoSU5DTFVERV8zQzUwNykKLQkweDAwMDAsCQkJCQkvKiBTZXQgYnVzIHNpemUgdG8gMTYgYml0cy4gKi8KLSNlbHNlCi0JMHgwMDAxLAkJCQkJLyogU2V0IGJ1cyBzaXplIHRvIDggYml0cyAqLwotI2VuZGlmCi0JMCwwLAkJCQkJLyogcGFkIHdvcmRzLiAqLwotCTB4MDAwMCwweDAwMDAsCQkJCS8qIElTQ1AgcGh5cyBhZGRyLCBzZXQgaW4gaW5pdF84MjU4Nl9tZW0oKS4gKi8KLQotCS8qCUludGVybWVkaWF0ZSBTeXN0ZW0gQ29uZmlndXJhdGlvbiBQb2ludGVyIChJU0NQKS4gKi8KLQkweDAwMDEsCQkJCQkvKiBTdGF0dXMgd29yZCB0aGF0J3MgY2xlYXJlZCB3aGVuIGluaXQgaXMgZG9uZS4gKi8KLQkweDAwMDgsMCwwLAkJCQkvKiBTQ0Igb2Zmc2V0LCAoc2tpcCwgc2tpcCkgKi8KLQotCS8qIFN5c3RlbSBDb250cm9sIEJsb2NrIChTQ0IpLiAqLwotCTAsMHhmMDAwfFJYX1NUQVJUfENVQ19TVEFSVCwJCS8qIFNDQiBzdGF0dXMgYW5kIGNtZC4gKi8KLQlDT05GSUdfQ01ELAkJCQkvKiBDb21tYW5kIGxpc3QgcG9pbnRlciwgcG9pbnRzIHRvIENvbmZpZ3VyZS4gKi8KLQlSWF9CVUZfU1RBUlQsCQkJCS8qIFJ4IGJsb2NrIGxpc3QuICovCi0JMCwwLDAsMCwJCQkJLyogRXJyb3IgY291bnQ6IENSQywgYWxpZ24sIGJ1ZmZlciwgb3ZlcnJ1bi4gKi8KLQotCS8qIDB4MDAxODogQ29uZmlndXJlIGNvbW1hbmQuICBDaGFuZ2UgdG8gcHV0IE1BQyBkYXRhIHdpdGggcGFja2V0LiAqLwotCTAsIENtZENvbmZpZ3VyZSwJCQkvKiBTdGF0dXMsIGNvbW1hbmQuICovCi0JU0VUX1NBX0NNRCwJCQkJLyogTmV4dCBjb21tYW5kIGlzIFNldCBTdGF0aW9uIEFkZHIuICovCi0JMHgwODA0LAkJCQkJLyogIjQiIGJ5dGVzIG9mIGNvbmZpZyBkYXRhLCA4IGJ5dGUgRklGTy4gKi8KLQkweDJlNDAsCQkJCQkvKiBNYWdpYyB2YWx1ZXMsIGluY2x1ZGluZyBNQUMgZGF0YSBsb2NhdGlvbi4gKi8KLQkwLAkJCQkJLyogVW51c2VkIHBhZCB3b3JkLiAqLwotCi0JLyogMHgwMDI0OiBTZXR1cCBzdGF0aW9uIGFkZHJlc3MgY29tbWFuZC4gKi8KLQkwLCBDbWRTQVNldHVwLAotCVNFVF9NQ19DTUQsCQkJCS8qIE5leHQgY29tbWFuZC4gKi8KLQkweGFhMDAsMHhiMDAwLDB4MGJhZCwJLyogU3RhdGlvbiBhZGRyZXNzICh0byBiZSBmaWxsZWQgaW4pICovCi0KLQkvKiAweDAwMzA6IE5PUCwgbG9vcGluZyBiYWNrIHRvIGl0c2VsZi4gIFBvaW50IHRvIGZpcnN0IFR4IGJ1ZmZlciB0byBUeC4gKi8KLQkwLCBDbWROT3AsIElETEVMT09QLCAwIC8qIHBhZCAqLywKLQotCS8qIDB4MDAzODogQSB1bnVzZWQgVGltZS1Eb21haW4gUmVmbGVjdG9tZXRlciBjb21tYW5kLiAqLwotCTAsIENtZFREUiwgSURMRUxPT1AsIDAsCi0KLQkvKiAweDAwNDA6IEFuIHVudXNlZCBEdW1wIFN0YXRlIGNvbW1hbmQuICovCi0JMCwgQ21kRHVtcCwgSURMRUxPT1AsIERVTVBfREFUQSwKLQotCS8qIDB4MDA0ODogQW4gdW51c2VkIERpYWdub3NlIGNvbW1hbmQuICovCi0JMCwgQ21kRGlhZ25vc2UsIElETEVMT09QLAotCi0JLyogMHgwMDRFOiBBbiBlbXB0eSBzZXQtbXVsdGljYXN0LWxpc3QgY29tbWFuZC4gKi8KLQkwLCBDbWRNdWx0aWNhc3RMaXN0LCBJRExFTE9PUCwgMCwKLX07Ci0KLS8qIE5JQyBzcGVjaWZpYyBzdGF0aWMgdmFyaWFibGVzIGdvIGhlcmUgKi8KLQotc3RhdGljIHVuc2lnbmVkIHNob3J0CQlpb2FkZHIsIGlycSwgc2NiX2Jhc2U7Ci1zdGF0aWMgQWRkcmVzcwkJCW1lbV9zdGFydCwgbWVtX2VuZDsKLXN0YXRpYyB1bnNpZ25lZCBzaG9ydAkJcnhfaGVhZCwgcnhfdGFpbDsKLQotI2RlZmluZQlyZWFkX21lbShtLHMpCWZtZW1jcHkoKGNoYXIgKilzLCBtLCBzaXplb2YocykpCi0KLXN0YXRpYyB2b2lkIHNldHVwX3J4X2J1ZmZlcnMoc3RydWN0IG5pYyAqbmljKQotewotCUFkZHJlc3MJCQl3cml0ZV9wdHI7Ci0JdW5zaWduZWQgc2hvcnQJCWN1cl9yeF9idWY7Ci0Jc3RhdGljIHVuc2lnbmVkIHNob3J0CXJ4X2NtZFsxNl0gPSB7Ci0JCTB4MDAwMCwJCQkvKiBSeCBzdGF0dXMgKi8KLQkJMHgwMDAwLAkJCS8qIFJ4IGNvbW1hbmQsIG9ubHkgYW5kIGxhc3QgKi8KLQkJUlhfQlVGX1NUQVJULAkJLyogTGluayAod2lsbCBiZSBhZGp1c3RlZCkgKi8KLQkJUlhfQlVGX1NUQVJUICsgMjIsCS8qIEJ1ZmZlciBvZmZzZXQgKHdpbGwgYmUgYWRqdXN0ZWQpICovCi0JCTB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCS8qIFBhZCBmb3IgZGVzdCBhZGRyICovCi0JCTB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCS8qIFBhZCBmb3Igc291cmNlIGFkZHIgKi8KLQkJMHgwMDAwLAkJCS8qIFBhZCBmb3IgcHJvdG9jb2wgKi8KLQkJMHgwMDAwLAkJCS8qIEJ1ZmZlcjogQWN0dWFsIGNvdW50ICovCi0JCS0xLAkJCS8qIEJ1ZmZlcjogTmV4dCAobm9uZSkgKi8KLQkJUlhfQlVGX1NUQVJUICsgMHgyMCwJLyogQnVmZmVyOiBBZGRyZXNzIGxvdyAoKyBzY2JfYmFzZSkgKHdpbGwgYmUgYWRqdXN0ZWQpICovCi0JCTB4MDAwMCwJCQkvKiBCdWZmZXI6IEFkZHJlc3MgaGlnaCAqLwotCQkweDgwMDAgfCAoUlhfQlVGX1NJWkUgLSAweDIwKQotCX07Ci0KLQljdXJfcnhfYnVmID0gcnhfaGVhZCA9IFJYX0JVRl9TVEFSVDsKLQlkbyB7CQkvKiBXaGlsZSB0aGVyZSBpcyByb29tIGZvciBvbmUgbW9yZSBidWZmZXIgKi8KLQkJd3JpdGVfcHRyID0gbWVtX3N0YXJ0ICsgY3VyX3J4X2J1ZjsKLQkJLyogYWRqdXN0IHNvbWUgY29udGVudHMgKi8KLQkJcnhfY21kWzFdID0gMHgwMDAwOwotCQlyeF9jbWRbMl0gPSBjdXJfcnhfYnVmICsgUlhfQlVGX1NJWkU7Ci0JCXJ4X2NtZFszXSA9IGN1cl9yeF9idWYgKyAyMjsKLQkJcnhfY21kWzEzXSA9IGN1cl9yeF9idWYgKyAweDIwICsgc2NiX2Jhc2U7Ci0JCW1lbWNweSgoY2hhciAqKXdyaXRlX3B0ciwgKGNoYXIgKilyeF9jbWQsIHNpemVvZihyeF9jbWQpKTsKLQkJcnhfdGFpbCA9IGN1cl9yeF9idWY7Ci0JCWN1cl9yeF9idWYgKz0gUlhfQlVGX1NJWkU7Ci0JfSB3aGlsZSAoY3VyX3J4X2J1ZiA8PSBSWF9CVUZfRU5EIC0gUlhfQlVGX1NJWkUpOwotCS8qIFRlcm1pbmF0ZSB0aGUgbGlzdCBieSBzZXR0aW5nIHRoZSBFT0wgYml0IGFuZCB3cmFwIHRoZXIgcG9pbnRlcgotCSAgIHRvIG1ha2UgdGhlIGxpc3QgYSByaW5nLiAqLwotCXdyaXRlX3B0ciA9IG1lbV9zdGFydCArIHJ4X3RhaWw7Ci0JcnhfY21kWzFdID0gMHhDMDAwOwotCXJ4X2NtZFsyXSA9IHJ4X2hlYWQ7Ci0JbWVtY3B5KChjaGFyICopd3JpdGVfcHRyLCAoY2hhciAqKXJ4X2NtZCwgc2l6ZW9mKHVuc2lnbmVkIHNob3J0KSAqIDMpOwotfQotCi1zdGF0aWMgdm9pZCBhY2tfc3RhdHVzKHZvaWQpCi17Ci0JdW5zaWduZWQgc2hvcnQJY21kLCBzdGF0dXM7Ci0JdW5zaWduZWQgc2hvcnQJKnNobWVtID0gKHNob3J0ICopbWVtX3N0YXJ0OwotCi0JY21kID0gKHN0YXR1cyA9IHNobWVtW2lTQ0JfU1RBVFVTPj4xXSkgJiAweGYwMDA7Ci0JaWYgKHN0YXR1cyAmIDB4MTAwKQkJLyogQ1Ugc3VzcGVuZGVkPyAqLwotCQljbWQgfD0gQ1VDX1JFU1VNRTsKLQlpZiAoKHN0YXR1cyAmIDB4MjAwKSA9PSAwKQkvKiBDVSBub3QgYWN0aXZlPyAqLwotCQljbWQgfD0gQ1VDX1NUQVJUOwotCWlmIChzdGF0dXMgJiAweDAxMCkJCS8qIFJVIHN1c3BlbmRlZD8gKi8KLQkJY21kIHw9IFJYX1JFU1VNRTsKLQllbHNlIGlmICgoc3RhdHVzICYgMHgwNDApID09IDApCS8qIFJVIG5vdCBhY3RpdmU/ICovCi0JCWNtZCB8PSBSWF9TVEFSVDsKLQlpZiAoY21kID09IDApCQkJLyogTm90aGluZyB0byBkbyAqLwotCQlyZXR1cm47Ci0Jc2htZW1baVNDQl9DTUQ+PjFdID0gY21kOwotI2lmCWRlZmluZWQoREVCVUcpCi0JcHJpbnRmKCJTdGF0dXMgJWhYIENvbW1hbmQgJWhYXG4iLCBzdGF0dXMsIGNtZCk7Ci0jZW5kaWYKLQlvdXRiKDAsIGlvYWRkciArIEk4MjU4Nl9BVFROKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRVNFVCAtIFJlc2V0IGFkYXB0ZXIKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RhdGljIHZvaWQgaTgyNTg2X3Jlc2V0KHN0cnVjdCBuaWMgKm5pYykKLXsKLQl1bnNpZ25lZCBsb25nCXRpbWU7Ci0JdW5zaWduZWQgc2hvcnQJKnNobWVtID0gKHNob3J0ICopbWVtX3N0YXJ0OwotCi0JLyogcHV0IHRoZSBjYXJkIGluIGl0cyBpbml0aWFsIHN0YXRlICovCi0KLSNpZmRlZglJTkNMVURFXzNDNTA3Ci0JLyogRW5hYmxlIGxvb3BiYWNrIHRvIHByb3RlY3QgdGhlIHdpcmUgd2hpbGUgc3RhcnRpbmcgdXAsCi0JICAgYW5kIGhvbGQgdGhlIDU4NiBpbiByZXNldCBkdXJpbmcgdGhlIG1lbW9yeSBpbml0aWFsaXNhdGlvbi4gKi8KLQlvdXRiKDB4MjAsIGlvYWRkciArIE1JU0NfQ1RSTCk7Ci0jZW5kaWYKLQotCS8qIEZpeCB0aGUgSVNDUCBhZGRyZXNzIGFuZCBiYXNlLiAqLwotCWluaXRfd29yZHNbM10gPSBzY2JfYmFzZTsKLQlpbml0X3dvcmRzWzddID0gc2NiX2Jhc2U7Ci0KLQkvKiBXcml0ZSB0aGUgd29yZHMgYXQgMHhmZmY2LiAqLwotCS8qIFdyaXRlIHRoZSB3b3JkcyBhdCAweDAwMDAuICovCi0JLyogRmlsbCBpbiB0aGUgc3RhdGlvbiBhZGRyZXNzLiAqLwotCW1lbWNweSgoY2hhciAqKShtZW1fZW5kIC0gMTApLCAoY2hhciAqKWluaXRfd29yZHMsIDEwKTsKLQltZW1jcHkoKGNoYXIgKiltZW1fc3RhcnQsIChjaGFyICopJmluaXRfd29yZHNbNV0sIHNpemVvZihpbml0X3dvcmRzKSAtIDEwKTsKLQltZW1jcHkoKGNoYXIgKiltZW1fc3RhcnQgKyBTQV9PRkZTRVQsIG5pYy0+bm9kZV9hZGRyLCBFVEhfQUxFTik7Ci0Jc2V0dXBfcnhfYnVmZmVycyhuaWMpOwotCi0jaWZkZWYJSU5DTFVERV8zQzUwNwotCS8qIFN0YXJ0IHRoZSA1ODYgYnkgcmVsZWFzaW5nIHRoZSByZXNldCBsaW5lLCBidXQgbGVhdmUgbG9vcGJhY2suICovCi0Jb3V0YigweEEwLCBpb2FkZHIgKyBNSVNDX0NUUkwpOwotI2VuZGlmCi0KLQkvKiBUaGlzIHdhcyB0aW1lIGNvbnN1bWluZyB0byB0cmFjayBkb3duOyB5b3UgbmVlZCB0byBnaXZlIHR3byBjaGFubmVsCi0JICAgYXR0ZW50aW9uIHNpZ25hbHMgdG8gcmVsaWFibHkgc3RhcnQgdXAgdGhlIGk4MjU4Ni4gKi8KLQlvdXRiKDAsIGlvYWRkciArIEk4MjU4Nl9BVFROKTsKLQl0aW1lID0gY3VycnRpY2tzKCkgKyBUSUNLU19QRVJfU0VDOwkvKiBhbGxvdyAxIHNlY29uZCB0byBpbml0ICovCi0Jd2hpbGUgKAotCQkJc2htZW1baVNDQl9TVEFUVVM+PjFdID09IDApCi0JewotCQlpZiAoY3VycnRpY2tzKCkgPiB0aW1lKQotCQl7Ci0JCQlwcmludGYoImk4MjU4NiBpbml0aWFsaXNhdGlvbiB0aW1lZCBvdXQgd2l0aCBzdGF0dXMgJWhYLCBjbWQgJWhYXG4iLAotCQkJCQlzaG1lbVtpU0NCX1NUQVRVUz4+MV0sIHNobWVtW2lTQ0JfQ01EPj4xXSk7Ci0JCQlicmVhazsKLQkJfQotCX0KLQkvKiBJc3N1ZSBjaGFubmVsLWF0dG4gLS0gdGhlIDgyNTg2IHdvbid0IHN0YXJ0LiAqLwotCW91dGIoMCwgaW9hZGRyICsgSTgyNTg2X0FUVE4pOwotCi0jaWZkZWYJSU5DTFVERV8zQzUwNwotCS8qIERpc2FibGUgbG9vcGJhY2suICovCi0Jb3V0YigweDgwLCBpb2FkZHIgKyBNSVNDX0NUUkwpOwotI2VuZGlmCi0jaWYJZGVmaW5lZChERUJVRykKLQlwcmludGYoImk4MjU4NiBzdGF0dXMgJWhYLCBjbWQgJWhYXG4iLAotCQkJc2htZW1baVNDQl9TVEFUVVM+PjFdLCBzaG1lbVtpU0NCX0NNRD4+MV0pOwotI2VuZGlmCi19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICBQT0xMIC0gV2FpdCBmb3IgYSBmcmFtZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBpbnQgaTgyNTg2X3BvbGwoc3RydWN0IG5pYyAqbmljKQotewotCWludAkJc3RhdHVzOwotCXVuc2lnbmVkIHNob3J0CXJmZF9jbWQsIG5leHRfcnhfZnJhbWUsIGRhdGFfYnVmZmVyX2FkZHIsCi0JZnJhbWVfc3RhdHVzLCBwa3RfbGVuOwotCXVuc2lnbmVkIHNob3J0CSpzaG1lbSA9IChzaG9ydCAqKW1lbV9zdGFydCArIHJ4X2hlYWQ7Ci0KLQkvKiByZXR1cm4gdHJ1ZSBpZiB0aGVyZSdzIGFuIGV0aGVybmV0IHBhY2tldCByZWFkeSB0byByZWFkICovCi0JaWYgKAotCQkJKChmcmFtZV9zdGF0dXMgPSBzaG1lbVswXSkgJiAweDgwMDApID09IDApCi0JCXJldHVybiAoMCk7CQkvKiBub3BlICovCi0JcmZkX2NtZCA9IHNobWVtWzFdOwotCW5leHRfcnhfZnJhbWUgPSBzaG1lbVsyXTsKLQlkYXRhX2J1ZmZlcl9hZGRyID0gc2htZW1bM107Ci0JcGt0X2xlbiA9IHNobWVtWzExXTsKLQlzdGF0dXMgPSAwOwotCWlmIChyZmRfY21kICE9IDAgfHwgZGF0YV9idWZmZXJfYWRkciAhPSByeF9oZWFkICsgMjIKLQkJCXx8IChwa3RfbGVuICYgMHhDMDAwKSAhPSAweEMwMDApCi0JCXByaW50ZigiXG5SeCBmcmFtZSBjb3JydXB0LCBkaXNjYXJkZWQiKTsKLQllbHNlIGlmICgoZnJhbWVfc3RhdHVzICYgMHgyMDAwKSA9PSAwKQotCQlwcmludGYoIlxuUnggZnJhbWUgaGFkIGVycm9yIik7Ci0JZWxzZQotCXsKLQkJLyogV2UgaGF2ZSBhIGZyYW1lLCBjb3B5IGl0IHRvIG91ciBidWZmZXIgKi8KLQkJcGt0X2xlbiAmPSAweDNGRkY7Ci0JCW1lbWNweShuaWMtPnBhY2tldCwgKGNoYXIgKiltZW1fc3RhcnQgKyByeF9oZWFkICsgMHgyMCwgcGt0X2xlbik7Ci0JCS8qIE9ubHkgcGFja2V0cyBub3QgZnJvbSBvdXJzZWxmICovCi0JCWlmIChtZW1jbXAobmljLT5wYWNrZXQgKyBFVEhfQUxFTiwgbmljLT5ub2RlX2FkZHIsIEVUSF9BTEVOKSAhPSAwKQotCQl7Ci0JCQluaWMtPnBhY2tldGxlbiA9IHBrdF9sZW47Ci0JCQlzdGF0dXMgPSAxOwotCQl9Ci0JfQotCS8qIENsZWFyIHRoZSBzdGF0dXMgd29yZCBhbmQgc2V0IEVPTCBvbiBSeCBmcmFtZSAqLwotCXNobWVtWzBdID0gMDsKLQlzaG1lbVsxXSA9IDB4QzAwMDsKLQkqKHNob3J0ICopKG1lbV9zdGFydCArIHJ4X3RhaWwgKyAyKSA9IDA7Ci0JcnhfdGFpbCA9IHJ4X2hlYWQ7Ci0JcnhfaGVhZCA9IG5leHRfcnhfZnJhbWU7Ci0JYWNrX3N0YXR1cygpOwotCXJldHVybiAoc3RhdHVzKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gIFRSQU5TTUlUIC0gVHJhbnNtaXQgYSBmcmFtZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIGk4MjU4Nl90cmFuc21pdCgKLQkJc3RydWN0IG5pYyAqbmljLAotCQljb25zdCBjaGFyICpkLAkJCS8qIERlc3RpbmF0aW9uICovCi0JCXVuc2lnbmVkIGludCB0LAkJCS8qIFR5cGUgKi8KLQkJdW5zaWduZWQgaW50IHMsCQkJLyogc2l6ZSAqLwotCQljb25zdCBjaGFyICpwKQkJCS8qIFBhY2tldCAqLwotewotCUFkZHJlc3MJCQlicHRyOwotCXVuc2lnbmVkIHNob3J0CQl0eXBlLCB6OwotCXN0YXRpYyB1bnNpZ25lZCBzaG9ydAl0eF9jbWRbMTFdID0gewotCQkweDAsCQkJLyogVHggc3RhdHVzICovCi0JCUNtZFR4LAkJCS8qIFR4IGNvbW1hbmQgKi8KLQkJVFhfQlVGX1NUQVJUKzE2LAkvKiBOZXh0IGNvbW1hbmQgaXMgYSBOb09wICovCi0JCVRYX0JVRl9TVEFSVCs4LAkJLyogRGF0YSBCdWZmZXIgb2Zmc2V0ICovCi0JCTB4ODAwMCwJCQkvKiB8IHdpdGggc2l6ZSAqLwotCQkweGZmZmYsCQkJLyogTm8gbmV4dCBkYXRhIGJ1ZmZlciAqLwotCQlUWF9CVUZfU1RBUlQrMjIsCS8qICsgc2NiX2Jhc2UgKi8KLQkJMHgwLAkJCS8qIEJ1ZmZlciBhZGRyZXNzIGhpZ2ggYml0cyAoYWx3YXlzIHplcm8pICovCi0JCTB4MCwJCQkvKiBOb3Agc3RhdHVzICovCi0JCUNtZE5PcCwJCQkvKiBOb3AgY29tbWFuZCAqLwotCQlUWF9CVUZfU1RBUlQrMTYJCS8qIE5leHQgaXMgbXlzZWxmICovCi0JfTsKLQl1bnNpZ25lZCBzaG9ydAkqc2htZW0gPSAoc2hvcnQgKiltZW1fc3RhcnQgKyBUWF9CVUZfU1RBUlQ7Ci0KLQkvKiBzZW5kIHRoZSBwYWNrZXQgdG8gZGVzdGluYXRpb24gKi8KLQkvKiBhZGp1c3Qgc29tZSBjb250ZW50cyAqLwotCXR5cGUgPSBodG9ucyh0KTsKLQlpZiAocyA8IEVUSF9aTEVOKQotCQlzID0gRVRIX1pMRU47Ci0JdHhfY21kWzRdID0gKHMgKyBFVEhfSExFTikgfCAweDgwMDA7Ci0JdHhfY21kWzZdID0gVFhfQlVGX1NUQVJUICsgMjIgKyBzY2JfYmFzZTsKLQlicHRyID0gbWVtX3N0YXJ0ICsgVFhfQlVGX1NUQVJUOwotCW1lbWNweSgoY2hhciAqKWJwdHIsIChjaGFyICopdHhfY21kLCBzaXplb2YodHhfY21kKSk7Ci0JYnB0ciArPSBzaXplb2YodHhfY21kKTsKLQltZW1jcHkoKGNoYXIgKilicHRyLCBkLCBFVEhfQUxFTik7Ci0JYnB0ciArPSBFVEhfQUxFTjsKLQltZW1jcHkoKGNoYXIgKilicHRyLCBuaWMtPm5vZGVfYWRkciwgRVRIX0FMRU4pOwotCWJwdHIgKz0gRVRIX0FMRU47Ci0JbWVtY3B5KChjaGFyICopYnB0ciwgKGNoYXIgKikmdHlwZSwgc2l6ZW9mKHR5cGUpKTsKLQlicHRyICs9IHNpemVvZih0eXBlKTsKLQltZW1jcHkoKGNoYXIgKilicHRyLCBwLCBzKTsKLQkvKiBDaGFuZ2UgdGhlIG9mZnNldCBpbiB0aGUgSURMRUxPT1AgKi8KLQkqKHVuc2lnbmVkIHNob3J0ICopKG1lbV9zdGFydCArIElETEVMT09QICsgNCkgPSBUWF9CVUZfU1RBUlQ7Ci0JLyogV2FpdCBmb3IgdHJhbnNtaXQgY29tcGxldGlvbiAqLwotCXdoaWxlICgKLQkJCShzaG1lbVswXSAmIDB4MjAwMCkgPT0gMCkKLQkJOwotCS8qIENoYW5nZSB0aGUgb2Zmc2V0IGluIHRoZSBJRExFTE9PUCBiYWNrIGFuZAotCSAgIGNoYW5nZSB0aGUgZmluYWwgbG9vcCB0byBwb2ludCBoZXJlICovCi0JKih1bnNpZ25lZCBzaG9ydCAqKShtZW1fc3RhcnQgKyBJRExFTE9PUCArIDQpID0gSURMRUxPT1A7Ci0JKih1bnNpZ25lZCBzaG9ydCAqKShtZW1fc3RhcnQgKyBUWF9CVUZfU1RBUlQgKyAyMCkgPSBJRExFTE9PUDsKLQlhY2tfc3RhdHVzKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICBESVNBQkxFIC0gVHVybiBvZmYgZXRoZXJuZXQgaW50ZXJmYWNlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgaTgyNTg2X2Rpc2FibGUoc3RydWN0IG5pYyAqbmljKQotewotCXVuc2lnbmVkIHNob3J0CSpzaG1lbSA9IChzaG9ydCAqKW1lbV9zdGFydDsKLQotI2lmCTAKLQkvKiBGbHVzaCB0aGUgVHggYW5kIGRpc2FibGUgUnguICovCi0Jc2htZW1baVNDQl9DTUQ+PjFdID0gUlhfU1VTUEVORCB8IENVQ19TVVNQRU5EOwotCW91dGIoMCwgaW9hZGRyICsgSTgyNTg2X0FUVE4pOwotI2lmZGVmCUlOQ0xVREVfTkk1MjEwCi0Jb3V0YigwLCBpb2FkZHIgKyBOSTUyX1JFU0VUKTsKLSNlbmRpZgotI2VuZGlmCS8qIDAgKi8KLX0KLQotI2lmZGVmCUlOQ0xVREVfM0M1MDcKLQotc3RhdGljIGludCB0NTA3X3Byb2JlMShzdHJ1Y3QgbmljICpuaWMsIHVuc2lnbmVkIHNob3J0IGlvYWRkcikKLXsKLQlpbnQJCQlpOwotCUFkZHJlc3MJCQlzaXplOwotCWNoYXIJCQltZW1fY29uZmlnOwotCWNoYXIJCQlpZl9wb3J0OwotCi0JaWYgKGluYihpb2FkZHIpICE9ICcqJyB8fCBpbmIoaW9hZGRyKzEpICE9ICczJwotCQl8fCBpbmIoaW9hZGRyKzIpICE9ICdDJyB8fCBpbmIoaW9hZGRyKzMpICE9ICdPJykKLQkJcmV0dXJuICgwKTsKLQlpcnEgPSBpbmIoaW9hZGRyICsgSVJRX0NPTkZJRykgJiAweDBmOwotCW1lbV9jb25maWcgPSBpbmIoaW9hZGRyICsgTUVNX0NPTkZJRyk7Ci0JaWYgKG1lbV9jb25maWcgJiAweDIwKQotCXsKLQkJc2l6ZSA9IDY1NTM2TDsKLQkJbWVtX3N0YXJ0ID0gMHhmMDAwMDBMICsgKG1lbV9jb25maWcgJiAweDA4ID8gMHgwODAwMDBMCi0JCQk6ICgoKEFkZHJlc3MpbWVtX2NvbmZpZyAmIDB4MykgPDwgMTcpKTsKLQl9Ci0JZWxzZQotCXsKLQkJc2l6ZSA9ICgoKChBZGRyZXNzKW1lbV9jb25maWcgJiAweDMpICsgMSkgPDwgMTQpOwotCQltZW1fc3RhcnQgPSAweDBjMDAwMEwgKyAoKChBZGRyZXNzKW1lbV9jb25maWcgJiAweDE4KSA8PCAxMik7Ci0JfQotCW1lbV9lbmQgPSBtZW1fc3RhcnQgKyBzaXplOwotCXNjYl9iYXNlID0gNjU1MzZMIC0gc2l6ZTsKLQlpZl9wb3J0ID0gaW5iKGlvYWRkciArIFJPTV9DT05GSUcpICYgMHg4MDsKLQkvKiBHZXQgc3RhdGlvbiBhZGRyZXNzICovCi0Jb3V0YigweDAxLCBpb2FkZHIgKyBNSVNDX0NUUkwpOwotCWZvciAoaSA9IDA7IGkgPCBFVEhfQUxFTjsgKytpKQotCXsKLQkJbmljLT5ub2RlX2FkZHJbaV0gPSBpbmIoaW9hZGRyK2kpOwotCX0KLQlwcmludGYoIlxuM2M1MDcgaW9hZGRyICUjaFgsIElSUSAlZCwgbWVtIFslI1gtJSNYXSwgJXN0ZXJuYWwgeGN2ciwgYWRkciAlIVxuIiwKLQkJaW9hZGRyLCBpcnEsIG1lbV9zdGFydCwgbWVtX2VuZCwgaWZfcG9ydCA/ICJpbiIgOiAiZXgiLCBuaWMtPm5vZGVfYWRkcik7Ci0JcmV0dXJuICgxKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1QUk9CRSAtIExvb2sgZm9yIGFuIGFkYXB0ZXIsIHRoaXMgcm91dGluZSdzIHZpc2libGUgdG8gdGhlIG91dHNpZGUKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RydWN0IG5pYyAqdDUwN19wcm9iZShzdHJ1Y3QgbmljICpuaWMsIHVuc2lnbmVkIHNob3J0ICpwcm9iZV9hZGRycykKLXsKLQlzdGF0aWMgdW5zaWduZWQgY2hhcglpbml0X0lEX2RvbmUgPSAwOwotCXVuc2lnbmVkIHNob3J0CQlscnNfc3RhdGUgPSAweGZmOwotCXN0YXRpYyB1bnNpZ25lZCBzaG9ydAlpb19hZGRyc1tdID0geyAweDMwMCwgMHgzMjAsIDB4MzQwLCAweDI4MCwgMCB9OwotCXVuc2lnbmVkIHNob3J0CQkqcDsKLQlpbnQJCQlpOwotCi0JaWYgKGluaXRfSURfZG9uZSA9PSAwKQotCXsKLQkJLyogU2VuZCB0aGUgSUQgc2VxdWVuY2UgdG8gdGhlIElEX1BPUlQgdG8gZW5hYmxlIHRoZSBib2FyZCAqLwotCQlvdXRiKDB4MDAsIElEX1BPUlQpOwotCQlmb3IgKGkgPSAwOyBpIDwgMjU1OyArK2kpCi0JCXsKLQkJCW91dGIobHJzX3N0YXRlLCBJRF9QT1JUKTsKLQkJCWxyc19zdGF0ZSA8PD0gMTsKLQkJCWlmIChscnNfc3RhdGUgJiAweDEwMCkKLQkJCQlscnNfc3RhdGUgXj0gMHhlNzsKLQkJfQotCQlvdXRiKDB4MDAsIElEX1BPUlQpOwotCQlpbml0X0lEX2RvbmUgPSAxOwotCX0KLQkvKiBpZiBwcm9iZV9hZGRycyBpcyAwLCB0aGVuIHJvdXRpbmUgY2FuIHVzZSBhIGhhcmR3aXJlZCBkZWZhdWx0ICovCi0JaWYgKHByb2JlX2FkZHJzID09IDApCi0JCXByb2JlX2FkZHJzID0gaW9fYWRkcnM7Ci0JZm9yIChwID0gcHJvYmVfYWRkcnM7IChpb2FkZHIgPSAqcCkgIT0gMDsgKytwKQotCQlpZiAodDUwN19wcm9iZTEobmljLCBpb2FkZHIpKQotCQkJYnJlYWs7Ci0JaWYgKGlvYWRkciAhPSAwKQotCXsKLQkJLyogcG9pbnQgdG8gTklDIHNwZWNpZmljIHJvdXRpbmVzICovCi0JCWk4MjU4Nl9yZXNldChuaWMpOwotCQluaWMtPnJlc2V0ID0gaTgyNTg2X3Jlc2V0OwotCQluaWMtPnBvbGwgPSBpODI1ODZfcG9sbDsKLQkJbmljLT50cmFuc21pdCA9IGk4MjU4Nl90cmFuc21pdDsKLQkJbmljLT5kaXNhYmxlID0gaTgyNTg2X2Rpc2FibGU7Ci0JCXJldHVybiBuaWM7Ci0JfQotCS8qIGVsc2UgKi8KLQl7Ci0JCXJldHVybiAwOwotCX0KLX0KLQotI2VuZGlmCi0KLSNpZmRlZglJTkNMVURFX05JNTIxMAotCi1zdGF0aWMgaW50IG5pNTIxMF9wcm9iZTIodm9pZCkKLXsKLQl1bnNpZ25lZCBzaG9ydAkJaTsKLQl1bnNpZ25lZCBzaG9ydAkJc2htZW1bMTBdOwotCi0JLyogRml4IHRoZSBJU0NQIGFkZHJlc3MgYW5kIGJhc2UuICovCi0JaW5pdF93b3Jkc1szXSA9IHNjYl9iYXNlOwotCWluaXRfd29yZHNbN10gPSBzY2JfYmFzZTsKLQotCS8qIFdyaXRlIHRoZSB3b3JkcyBhdCAweGZmZjYuICovCi0JLyogV3JpdGUgdGhlIHdvcmRzIGF0IDB4MDAwMC4gKi8KLQltZW1jcHkoKGNoYXIgKikobWVtX2VuZCAtIDEwKSwgKGNoYXIgKilpbml0X3dvcmRzLCAxMCk7Ci0JbWVtY3B5KChjaGFyICopbWVtX3N0YXJ0LCAoY2hhciAqKSZpbml0X3dvcmRzWzVdLCBzaXplb2YoaW5pdF93b3JkcykgLSAxMCk7Ci0JaWYgKCoodW5zaWduZWQgc2hvcnQgKiltZW1fc3RhcnQgIT0gMSkKLQkJcmV0dXJuICgwKTsKLQlvdXRiKDAsIGlvYWRkciArIE5JNTJfUkVTRVQpOwotCW91dGIoMCwgaW9hZGRyICsgSTgyNTg2X0FUVE4pOwotCXVkZWxheSgzMik7Ci0JaSA9IDUwOwotCXdoaWxlICgKLQkJc2htZW1baVNDQl9TVEFUVVM+PjFdID09IDApCi0JewotCQlpZiAoLS1pID09IDApCi0JCXsKLQkJCXByaW50ZigiaTgyNTg2IGluaXRpYWxpc2F0aW9uIHRpbWVkIG91dCB3aXRoIHN0YXR1cyAlaFgsIGNtZCAlaFhcbiIsCi0JCQkJc2htZW1baVNDQl9TVEFUVVM+PjFdLCBzaG1lbVtpU0NCX0NNRD4+MV0pOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0JLyogSXNzdWUgY2hhbm5lbC1hdHRuIC0tIHRoZSA4MjU4NiB3b24ndCBzdGFydC4gKi8KLQlvdXRiKDAsIGlvYWRkciArIEk4MjU4Nl9BVFROKTsKLQlpZiAoKih1bnNpZ25lZCBzaG9ydCAqKW1lbV9zdGFydCAhPSAwKQotCQlyZXR1cm4gKDApOwotCXJldHVybiAoMSk7Ci19Ci0KLXN0YXRpYyBpbnQgbmk1MjEwX3Byb2JlMShzdHJ1Y3QgbmljICpuaWMpCi17Ci0JaW50CQkJaTsKLQlzdGF0aWMgQWRkcmVzcwkJbWVtX2FkZHJzW10gPSB7Ci0JCTB4YzAwMDAsIDB4YzQwMDAsIDB4YzgwMDAsIDB4Y2MwMDAsCi0JCTB4ZDAwMDAsIDB4ZDQwMDAsIDB4ZDgwMDAsIDB4ZGMwMDAsCi0JCTB4ZTAwMDAsIDB4ZTQwMDAsIDB4ZTgwMDAsIDB4ZWMwMDAsCi0JCTAgfTsKLQlBZGRyZXNzCQkJKnA7Ci0KLQlpZiAoaW5iKGlvYWRkciArIDYpICE9IDB4MCB8fCBpbmIoaW9hZGRyICsgNykgIT0gMHg1NSkKLQkJcmV0dXJuICgwKTsKLQlzY2JfYmFzZSA9IC04MTkyOwkJLyogYXNzdW1lIDhrIG1lbW9yeSAqLwotCWZvciAocCA9IG1lbV9hZGRyczsgKG1lbV9zdGFydCA9ICpwKSAhPSAwOyArK3ApCi0JCWlmIChtZW1fZW5kID0gbWVtX3N0YXJ0ICsgODE5Miwgbmk1MjEwX3Byb2JlMigpKQotCQkJYnJlYWs7Ci0JaWYgKG1lbV9zdGFydCA9PSAwKQotCQlyZXR1cm4gKDApOwotCS8qIEdldCBzdGF0aW9uIGFkZHJlc3MgKi8KLQlmb3IgKGkgPSAwOyBpIDwgRVRIX0FMRU47ICsraSkKLQl7Ci0JCW5pYy0+bm9kZV9hZGRyW2ldID0gaW5iKGlvYWRkcitpKTsKLQl9Ci0JcHJpbnRmKCJcbk5JNTIxMCBpb2FkZHIgJSNoWCwgbWVtIFslI1gtJSNYXSwgYWRkciAlIVxuIiwKLQkJaW9hZGRyLCBtZW1fc3RhcnQsIG1lbV9lbmQsIG5pYy0+bm9kZV9hZGRyKTsKLQlyZXR1cm4gKDEpOwotfQotCi1zdHJ1Y3QgbmljICpuaTUyMTBfcHJvYmUoc3RydWN0IG5pYyAqbmljLCB1bnNpZ25lZCBzaG9ydCAqcHJvYmVfYWRkcnMpCi17Ci0JLyogbWlzc2luZyBlbnRyaWVzIGFyZSBhZGRyZXNzZXMgdXN1YWxseSBhbHJlYWR5IHVzZWQgKi8KLQlzdGF0aWMgdW5zaWduZWQgc2hvcnQJaW9fYWRkcnNbXSA9IHsKLQkJMHgyMDAsIDB4MjA4LCAweDIxMCwgMHgyMTgsIDB4MjIwLCAweDIyOCwgMHgyMzAsIDB4MjM4LAotCQkweDI0MCwgMHgyNDgsIDB4MjUwLCAweDI1OCwgMHgyNjAsIDB4MjY4LCAweDI3MCwgLypQYXIqLwotCQkweDI4MCwgMHgyODgsIDB4MjkwLCAweDI5OCwgMHgyQTAsIDB4MkE4LCAweDJCMCwgMHgyQjgsCi0JCTB4MkMwLCAweDJDOCwgMHgyRDAsIDB4MkQ4LCAweDJFMCwgMHgyRTgsIDB4MkYwLCAvKlNlciovCi0JCTB4MzAwLCAweDMwOCwgMHgzMTAsIDB4MzE4LCAweDMyMCwgMHgzMjgsIDB4MzMwLCAweDMzOCwKLQkJMHgzNDAsIDB4MzQ4LCAweDM1MCwgMHgzNTgsIDB4MzYwLCAweDM2OCwgMHgzNzAsIC8qUGFyKi8KLQkJMHgzODAsIDB4Mzg4LCAweDM5MCwgMHgzOTgsIDB4M0EwLCAweDNBOCwgLypWaWQsUGFyKi8KLQkJMHgzQzAsIDB4M0M4LCAweDNEMCwgMHgzRDgsIDB4M0UwLCAweDNFOCwgLypTZXIqLwotCQkweDAKLQl9OwotCXVuc2lnbmVkIHNob3J0CQkqcDsKLQlpbnQJCQlpOwotCi0JLyogaWYgcHJvYmVfYWRkcnMgaXMgMCwgdGhlbiByb3V0aW5lIGNhbiB1c2UgYSBoYXJkd2lyZWQgZGVmYXVsdCAqLwotCWlmIChwcm9iZV9hZGRycyA9PSAwKQotCQlwcm9iZV9hZGRycyA9IGlvX2FkZHJzOwotCWZvciAocCA9IHByb2JlX2FkZHJzOyAoaW9hZGRyID0gKnApICE9IDA7ICsrcCkKLQkJaWYgKG5pNTIxMF9wcm9iZTEobmljKSkKLQkJCWJyZWFrOwotCWlmIChpb2FkZHIgIT0gMCkKLQl7Ci0JCS8qIHBvaW50IHRvIE5JQyBzcGVjaWZpYyByb3V0aW5lcyAqLwotCQlpODI1ODZfcmVzZXQobmljKTsKLQkJbmljLT5yZXNldCA9IGk4MjU4Nl9yZXNldDsKLQkJbmljLT5wb2xsID0gaTgyNTg2X3BvbGw7Ci0JCW5pYy0+dHJhbnNtaXQgPSBpODI1ODZfdHJhbnNtaXQ7Ci0JCW5pYy0+ZGlzYWJsZSA9IGk4MjU4Nl9kaXNhYmxlOwotCQlyZXR1cm4gbmljOwotCX0KLQkvKiBlbHNlICovCi0JewotCQlyZXR1cm4gMDsKLQl9Ci19Ci0jZW5kaWYKLQotI2lmZGVmCUlOQ0xVREVfRVhPUzIwNQotCi0vKgotICogQ29kZSB0byBkb3dubG9hZCB0byBJMTg2IGluIEVYT1MyMDUKLSAqLwotCi1zdGF0aWMgdW5zaWduZWQgY2hhciBleG9zX2kxODZfaW5pdFtdID0KLXsKLTB4MDgsMHgwMCwweDE0LDB4MDAsMHgwMCwweDAwLDB4YWEsMHhmYSwweDMzLDB4YzAsMHhiYSwweGZlLDB4ZmYsMHhlZiwweGI4LDB4ZjgsCi0weGZmLDB4ZTcsMHhhMCwweGI4LDB4N2MsMHgwMCwweGU3LDB4YTQsMHhiOCwweGJjLDB4ODAsMHhlNywweGE4LDB4OGMsMHhjOCwweDhlLAotMHhkOCwweGJiLDB4MmYsMHgwZSwweGM2LDB4MDcsMHhhNSwweDMzLDB4YzksMHhlYiwweDAwLDB4ZWIsMHgwMCwweGViLDB4MDAsMHhlMiwKLTB4ZjgsMHhiZSwweDJjLDB4MGUsMHhiYSwweDAyLDB4MDUsMHgzMywweGRiLDB4YjksMHgwMywweDAwLDB4ZWMsMHgyNCwweDBmLDB4OGEsCi0weGUwLDB4MDIsMHhkOCwweDQyLDB4NDIsMHhlYywweDAyLDB4ZDgsMHhkMCwweGUwLDB4ZDAsMHhlMCwweGQwLDB4ZTAsMHhkMCwweGUwLAotMHgwYSwweGM0LDB4ODgsMHgwNCwweDQyLDB4NDIsMHg0NiwweGUyLDB4ZTMsMHg4YSwweGUzLDB4ZDAsMHhlYywweGQwLDB4ZWMsMHhkMCwKLTB4ZWMsMHhkMCwweGVjLDB4ODAsMHhlMywweDBmLDB4MDIsMHhlMywweDgwLDB4ZjQsMHgwNSwweGVjLDB4M2EsMHhlMCwweDc0LDB4MDUsCi0weGM2LDB4MDQsMHg1YSwweGViLDB4ZmUsMHhjNiwweDA0LDB4NTUsMHgzMywweGMwLDB4OGUsMHhkOCwweGJlLDB4MzgsMHgwMCwweGM3LAotMHgwNCwweGNlLDB4MGUsMHg0NiwweDQ2LDB4YzcsMHgwNCwweDAwLDB4ZmYsMHhmYiwweGJhLDB4M2MsMHgwMCwweGI4LDB4MDMsMHgwMCwKLTB4ZWYsMHgzMywweGRiLDB4MzMsMHhjOSwweGJkLDB4MDQsMHgwZiwweDkwLDB4OTAsMHg5MCwweDkwLDB4ZTIsMHhmYSwweDQzLDB4MmUsCi0weDg5LDB4NWUsMHgwMCwweGViLDB4ZjMsMHg1MiwweGJhLDB4MDAsMHgwNiwweGVmLDB4NTAsMHg1MywweDU1LDB4YmQsMHhmOCwweDBlLAotMHgyZSwweDhiLDB4NWUsMHgwMCwweDQzLDB4MmUsMHg4OSwweDVlLDB4MDAsMHhiYSwweDIyLDB4MDAsMHhiOCwweDAwLDB4ODAsMHhlZiwKLTB4NWQsMHg1YiwweDU4LDB4NWEsMHhjZiwweDQ5LDB4NGUsMHg1NCwweDUyLDB4MjAsMHg2MywweDZlLDB4NzQsMHgyZCwweDNlLDB4MDAsCi0weDAwLDB4NGMsMHg0ZiwweDRmLDB4NTAsMHgyMCwweDYzLDB4NmUsMHg3NCwweDJkLDB4M2UsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAotMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKLTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCi0weDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAotMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKLTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCi0weDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAotMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKLTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCi0weDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAotMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKLTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCi0weDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAotMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKLTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCi0weDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4ZWEsMHgzMCwweDBlLDB4MDAsMHhmZiwweDAwLDB4MDAsMHgwMCwweDAwLAotMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMDAKLX07Ci0KLS8qIFRoZXNlIG9mZnNldHMgYXJlIGZyb20gdGhlIGVuZCBvZiB0aGUgaTE4NiBkb3dubG9hZCBjb2RlICovCi0KLSNkZWZpbmUJT0ZGU0VUX1NFTUEJCTB4MUQxCi0jZGVmaW5lCU9GRlNFVF9BRERSCQkweDFENwotCi1zdGF0aWMgaW50IGV4b3MyMDVfcHJvYmUyKHZvaWQpCi17Ci0JdW5zaWduZWQgc2hvcnQJCWk7Ci0JdW5zaWduZWQgc2hvcnQJCXNobWVtWzEwXTsKLQotCS8qIEZpeCB0aGUgSVNDUCBhZGRyZXNzIGFuZCBiYXNlLiAqLwotCWluaXRfd29yZHNbM10gPSBzY2JfYmFzZTsKLQlpbml0X3dvcmRzWzddID0gc2NiX2Jhc2U7Ci0KLQkvKiBXcml0ZSB0aGUgd29yZHMgYXQgMHhmZmY2LiAqLwotCS8qIFdyaXRlIHRoZSB3b3JkcyBhdCAweDAwMDAuICovCi0JbWVtY3B5KChjaGFyICopKG1lbV9lbmQgLSAxMCksIChjaGFyICopaW5pdF93b3JkcywgMTApOwotCW1lbWNweSgoY2hhciAqKW1lbV9zdGFydCwgKGNoYXIgKikmaW5pdF93b3Jkc1s1XSwgc2l6ZW9mKGluaXRfd29yZHMpIC0gMTApOwotCWlmICgqKHVuc2lnbmVkIHNob3J0ICopbWVtX3N0YXJ0ICE9IDEpCi0JCXJldHVybiAoMCk7Ci0Jb3V0YigwLCBpb2FkZHIgKyBFWE9TMjA1X1JFU0VUKTsKLQlvdXRiKDAsIGlvYWRkciArIEk4MjU4Nl9BVFROKTsKLQlpID0gNTA7Ci0Jd2hpbGUgKAotCQlzaG1lbVtpU0NCX1NUQVRVUz4+MV0gPT0gMCkKLQl7Ci0JCWlmICgtLWkgPT0gMCkKLQkJewotCQkJcHJpbnRmKCJpODI1ODYgaW5pdGlhbGlzYXRpb24gdGltZWQgb3V0IHdpdGggc3RhdHVzICVoWCwgY21kICVoWFxuIiwKLQkJCQlzaG1lbVtpU0NCX1NUQVRVUz4+MV0sIHNobWVtW2lTQ0JfQ01EPj4xXSk7Ci0JCQlicmVhazsKLQkJfQotCX0KLQkvKiBJc3N1ZSBjaGFubmVsLWF0dG4gLS0gdGhlIDgyNTg2IHdvbid0IHN0YXJ0LiAqLwotCW91dGIoMCwgaW9hZGRyICsgSTgyNTg2X0FUVE4pOwotCWlmICgqKHVuc2lnbmVkIHNob3J0ICopbWVtX3N0YXJ0ICE9IDApCi0JCXJldHVybiAoMCk7Ci0JcmV0dXJuICgxKTsKLX0KLQotc3RhdGljIGludCBleG9zMjA1X3Byb2JlMShzdHJ1Y3QgbmljICpuaWMpCi17Ci0JaW50CQkJaTsKLQkvKiBJZiB5b3Uga25vdyB0aGUgb3RoZXIgYWRkcmVzc2VzIHBsZWFzZSBsZXQgbWUga25vdyAqLwotCXN0YXRpYyBBZGRyZXNzCQltZW1fYWRkcnNbXSA9IHsKLQkJMHhjYzAwMCwgMCB9OwotCUFkZHJlc3MJCQkqcDsKLQotCXNjYl9iYXNlID0gLTE2Mzg0OwkJLyogYXNzdW1lIDhrIG1lbW9yeSAqLwotCWZvciAocCA9IG1lbV9hZGRyczsgKG1lbV9zdGFydCA9ICpwKSAhPSAwOyArK3ApCi0JCWlmIChtZW1fZW5kID0gbWVtX3N0YXJ0ICsgMTYzODQsIGV4b3MyMDVfcHJvYmUyKCkpCi0JCQlicmVhazsKLQlpZiAobWVtX3N0YXJ0ID09IDApCi0JCXJldHVybiAoMCk7Ci0JLyogR2V0IHN0YXRpb24gYWRkcmVzcyAqLwotCWZvciAoaSA9IDA7IGkgPCBFVEhfQUxFTjsgKytpKQotCXsKLQkJbmljLT5ub2RlX2FkZHJbaV0gPSBpbmIoaW9hZGRyK2kpOwotCX0KLQlwcmludGYoIlxuRVhPUzIwNSBpb2FkZHIgJSNoWCwgbWVtIFslI1gtJSNYXSwgYWRkciAlIVxuIiwKLQkJaW9hZGRyLCBtZW1fc3RhcnQsIG1lbV9lbmQsIG5pYy0+bm9kZV9hZGRyKTsKLQlyZXR1cm4gKDEpOwotfQotCi1zdHJ1Y3QgbmljICpleG9zMjA1X3Byb2JlKHN0cnVjdCBuaWMgKm5pYywgdW5zaWduZWQgc2hvcnQgKnByb2JlX2FkZHJzKQotewotCS8qIElmIHlvdSBrbm93IHRoZSBvdGhlciBhZGRyZXNzZXMsIHBsZWFzZSBsZXQgbWUga25vdyAqLwotCXN0YXRpYyB1bnNpZ25lZCBzaG9ydAlpb19hZGRyc1tdID0gewotCQkweDMxMCwgMHgwCi0JfTsKLQl1bnNpZ25lZCBzaG9ydAkJKnA7Ci0JaW50CQkJaTsKLQotCS8qIGlmIHByb2JlX2FkZHJzIGlzIDAsIHRoZW4gcm91dGluZSBjYW4gdXNlIGEgaGFyZHdpcmVkIGRlZmF1bHQgKi8KLQlpZiAocHJvYmVfYWRkcnMgPT0gMCkKLQkJcHJvYmVfYWRkcnMgPSBpb19hZGRyczsKLQlmb3IgKHAgPSBwcm9iZV9hZGRyczsgKGlvYWRkciA9ICpwKSAhPSAwOyArK3ApCi0JCWlmIChleG9zMjA1X3Byb2JlMShuaWMpKQotCQkJYnJlYWs7Ci0JaWYgKGlvYWRkciAhPSAwKQotCXsKLQkJLyogcG9pbnQgdG8gTklDIHNwZWNpZmljIHJvdXRpbmVzICovCi0JCWk4MjU4Nl9yZXNldChuaWMpOwotCQluaWMtPnJlc2V0ID0gaTgyNTg2X3Jlc2V0OwotCQluaWMtPnBvbGwgPSBpODI1ODZfcG9sbDsKLQkJbmljLT50cmFuc21pdCA9IGk4MjU4Nl90cmFuc21pdDsKLQkJbmljLT5kaXNhYmxlID0gaTgyNTg2X2Rpc2FibGU7Ci0JCXJldHVybiBuaWM7Ci0JfQotCS8qIGVsc2UgKi8KLQl7Ci0JCXJldHVybiAwOwotCX0KLX0KLQotI2VuZGlmCmRpZmYgLU5hdXIgZ3J1Yi0wLjk3Lm9yaWcvbmV0Ym9vdC9pZl9hcnAuaCBncnViLTAuOTcvbmV0Ym9vdC9pZl9hcnAuaAotLS0gZ3J1Yi0wLjk3Lm9yaWcvbmV0Ym9vdC9pZl9hcnAuaAkxOTcwLTAxLTAxIDAwOjAwOjAwLjAwMDAwMDAwMCArMDAwMAorKysgZ3J1Yi0wLjk3L25ldGJvb3QvaWZfYXJwLmgJMjAwNS0wOC0zMSAxOTowMzozNS4wMDAwMDAwMDAgKzAwMDAKQEAgLTAsMCArMSwyOSBAQAorI2lmbmRlZglfSUZfQVJQX0gKKyNkZWZpbmUJX0lGX0FSUF9ICisKKyNpbmNsdWRlICJ0eXBlcy5oIgorCisjZGVmaW5lIEFSUF9SRVFVRVNUCTEKKyNkZWZpbmUgQVJQX1JFUExZCTIKKworI2lmbmRlZglNQVhfQVJQX1JFVFJJRVMKKyNkZWZpbmUgTUFYX0FSUF9SRVRSSUVTCQkyMAorI2VuZGlmCisKKy8qCisgKiBBIHBpdHkgc2lwYWRkciBhbmQgdGlwYWRkciBhcmUgbm90IGxvbmd3b3JkIGFsaWduZWQgb3Igd2UgY291bGQgdXNlCisgKiBpbl9hZGRyLiBObywgSSBkb24ndCB3YW50IHRvIHVzZSAjcHJhZ21hIHBhY2tlZC4KKyAqLworc3RydWN0IGFycHJlcXVlc3QgeworCXVpbnQxNl90IGh3dHlwZTsKKwl1aW50MTZfdCBwcm90b2NvbDsKKwl1aW50OF90ICBod2xlbjsKKwl1aW50OF90ICBwcm90b2xlbjsKKwl1aW50MTZfdCBvcGNvZGU7CisJdWludDhfdCAgc2h3YWRkcls2XTsKKwl1aW50OF90ICBzaXBhZGRyWzRdOworCXVpbnQ4X3QgIHRod2FkZHJbNl07CisJdWludDhfdCAgdGlwYWRkcls0XTsKK307CisKKyNlbmRpZgkvKiBfSUZfQVJQX0ggKi8KZGlmZiAtTmF1ciBncnViLTAuOTcub3JpZy9uZXRib290L2lmX2V0aGVyLmggZ3J1Yi0wLjk3L25ldGJvb3QvaWZfZXRoZXIuaAotLS0gZ3J1Yi0wLjk3Lm9yaWcvbmV0Ym9vdC9pZl9ldGhlci5oCTE5NzAtMDEtMDEgMDA6MDA6MDAuMDAwMDAwMDAwICswMDAwCisrKyBncnViLTAuOTcvbmV0Ym9vdC9pZl9ldGhlci5oCTIwMDUtMDgtMzEgMTk6MDM6MzUuMDAwMDAwMDAwICswMDAwCkBAIC0wLDAgKzEsMjEgQEAKKyNpZm5kZWYJX0lGX0VUSEVSX0gKKyNkZWZpbmUJX0lGX0VUSEVSX0gKKworLyoKKyAgIEknbSBtb3ZpbmcgdG93YXJkcyB0aGUgZGVmaW5lZCBuYW1lcyBpbiBsaW51eC9pZl9ldGhlci5oIGZvciBjbGFyaXR5LgorICAgVGhlIGNvbmZ1c2lvbiBiZXR3ZWVuIDYwLzY0IGFuZCAxNTE0LzE1MTggYXJvc2UgYmVjYXVzZSB0aGUgTlM4MzkwCisgICBjb3VudHMgdGhlIDQgYnl0ZSBmcmFtZSBjaGVja3N1bSBpbiB0aGUgaW5jb21pbmcgcGFja2V0LCBidXQgbm90CisgICBpbiB0aGUgb3V0Z29pbmcgcGFja2V0LiA2MC8xNTE0IGFyZSB0aGUgY29ycmVjdCBudW1iZXJzIGZvciBtb3N0CisgICBpZiBub3QgYWxsIG9mIHRoZSBvdGhlciBOSUMgY29udHJvbGxlcnMuCisqLworCisjZGVmaW5lIEVUSF9BTEVOCQk2CS8qIFNpemUgb2YgRXRoZXJuZXQgYWRkcmVzcyAqLworI2RlZmluZSBFVEhfSExFTgkJMTQJLyogU2l6ZSBvZiBldGhlcm5ldCBoZWFkZXIgKi8KKyNkZWZpbmUJRVRIX1pMRU4JCTYwCS8qIE1pbmltdW0gcGFja2V0ICovCisjZGVmaW5lCUVUSF9GUkFNRV9MRU4JCTE1MTQJLyogTWF4aW11bSBwYWNrZXQgKi8KKyNkZWZpbmUgRVRIX0RBVEFfQUxJR04JCTIJLyogQW1vdW50IG5lZWRlZCB0byBhbGlnbiB0aGUgZGF0YSBhZnRlciBhbiBldGhlcm5ldCBoZWFkZXIgKi8KKyNpZm5kZWYJRVRIX01BWF9NVFUKKyNkZWZpbmUJRVRIX01BWF9NVFUJCShFVEhfRlJBTUVfTEVOLUVUSF9ITEVOKQorI2VuZGlmCisKKyNlbmRpZgkvKiBfSUZfRVRIRVJfSCAqLwpkaWZmIC1OYXVyIGdydWItMC45Ny5vcmlnL25ldGJvb3QvaWdtcC5oIGdydWItMC45Ny9uZXRib290L2lnbXAuaAotLS0gZ3J1Yi0wLjk3Lm9yaWcvbmV0Ym9vdC9pZ21wLmgJMTk3MC0wMS0wMSAwMDowMDowMC4wMDAwMDAwMDAgKzAwMDAKKysrIGdydWItMC45Ny9uZXRib290L2lnbXAuaAkyMDA1LTA4LTMxIDE5OjAzOjM1LjAwMDAwMDAwMCArMDAwMApAQCAtMCwwICsxLDI3IEBACisjaWZuZGVmCV9JR01QX0gKKyNkZWZpbmUJX0lHTVBfSAorCisvKiBNYXggaW50ZXJ2YWwgYmV0d2VlbiBJR01QIHBhY2tldHMgKi8KKyNkZWZpbmUgSUdNUF9JTlRFUlZBTAkJCSgxMCpUSUNLU19QRVJfU0VDKQorI2RlZmluZSBJR01QdjFfUk9VVEVSX1BSRVNFTlRfVElNRU9VVAkoNDAwKlRJQ0tTX1BFUl9TRUMpCisKKyNkZWZpbmUgSUdNUF9RVUVSWQkweDExCisjZGVmaW5lIElHTVB2MV9SRVBPUlQJMHgxMgorI2RlZmluZSBJR01QdjJfUkVQT1JUCTB4MTYKKyNkZWZpbmUgSUdNUF9MRUFWRQkweDE3CisjZGVmaW5lIEdST1VQX0FMTF9IT1NUUyAweGUwMDAwMDAxIC8qIDIyNC4wLjAuMSBIb3N0IGJ5dGUgb3JkZXIgKi8KKworc3RydWN0IGlnbXAgeworCXVpbnQ4X3QgIHR5cGU7CisJdWludDhfdCAgcmVzcG9uc2VfdGltZTsKKwl1aW50MTZfdCBjaGtzdW07CisJaW5fYWRkciBncm91cDsKK307CisKK3N0cnVjdCBpZ21wX2lwX3QgeyAvKiBGb3JtYXQgb2YgYW4gaWdtcCBpcCBwYWNrZXQgKi8KKwlzdHJ1Y3QgaXBoZHIgaXA7CisJdWludDhfdCByb3V0ZXJfYWxlcnRbNF07IC8qIFJvdXRlciBhbGVydCBvcHRpb24gKi8KKwlzdHJ1Y3QgaWdtcCBpZ21wOworfTsKKworI2VuZGlmCS8qIF9JR01QX0ggKi8KZGlmZiAtTmF1ciBncnViLTAuOTcub3JpZy9uZXRib290L2luLmggZ3J1Yi0wLjk3L25ldGJvb3QvaW4uaAotLS0gZ3J1Yi0wLjk3Lm9yaWcvbmV0Ym9vdC9pbi5oCTE5NzAtMDEtMDEgMDA6MDA6MDAuMDAwMDAwMDAwICswMDAwCisrKyBncnViLTAuOTcvbmV0Ym9vdC9pbi5oCTIwMDUtMDgtMzEgMTk6MDM6MzUuMDAwMDAwMDAwICswMDAwCkBAIC0wLDAgKzEsMjEgQEAKKyNpZm5kZWYJX0lOX0gKKyNkZWZpbmUJX0lOX0gKKworI2luY2x1ZGUgInR5cGVzLmgiCisKKyNkZWZpbmUgSVAJCTB4MDgwMAorI2RlZmluZSBBUlAJCTB4MDgwNgorI2RlZmluZQlSQVJQCQkweDgwMzUKKworI2RlZmluZSBJUF9JQ01QCQkxCisjZGVmaW5lIElQX0lHTVAJCTIKKyNkZWZpbmUgSVBfVURQCQkxNworCisvKiBTYW1lIGFmdGVyIGdvaW5nIHRocm91Z2ggaHRvbmwgKi8KKyNkZWZpbmUgSVBfQlJPQURDQVNUCTB4RkZGRkZGRkYKKwordHlwZWRlZiBzdHJ1Y3QgeworCXVpbnQzMl90CXNfYWRkcjsKK30gaW5fYWRkcjsKKworI2VuZGlmCS8qIF9JTl9IICovCmRpZmYgLU5hdXIgZ3J1Yi0wLjk3Lm9yaWcvbmV0Ym9vdC9pby5oIGdydWItMC45Ny9uZXRib290L2lvLmgKLS0tIGdydWItMC45Ny5vcmlnL25ldGJvb3QvaW8uaAkxOTcwLTAxLTAxIDAwOjAwOjAwLjAwMDAwMDAwMCArMDAwMAorKysgZ3J1Yi0wLjk3L25ldGJvb3QvaW8uaAkyMDA1LTA4LTMxIDE5OjAzOjM1LjAwMDAwMDAwMCArMDAwMApAQCAtMCwwICsxLDIzOSBAQAorI2lmbmRlZglJT19ICisjZGVmaW5lIElPX0gKKworCisvKiBBbW91bnQgb2YgcmVsb2NhdGlvbiBldGhlcmJvb3QgaXMgZXhwZXJpZW5jaW5nICovCitleHRlcm4gdW5zaWduZWQgbG9uZyB2aXJ0X29mZnNldDsKKworLyogRG9uJ3QgcmVxdWlyZSBpZGVudGl0eSBtYXBwZWQgcGh5c2ljYWwgbWVtb3J5LAorICogb3Nsb2FkZXIuYyBpcyB0aGUgb25seSB2YWxpZCB1c2VyIGF0IHRoZSBtb21lbnQuCisgKi8KK3Vuc2lnbmVkIGxvbmcgdmlydF90b19waHlzKHZvbGF0aWxlIGNvbnN0IHZvaWQgKnZpcnRfYWRkcik7Cit2b2lkICpwaHlzX3RvX3ZpcnQodW5zaWduZWQgbG9uZyBwaHlzX2FkZHIpOworCisvKiB2aXJ0X3RvX2J1cyBjb252ZXJ0cyBhbiBhZGRyZXNzcyBpbnNpZGUgb2YgZXRoZXJib290IFtfc3RhcnQsIF9lbmRdCisgKiBpbnRvIGEgbWVtb3J5IGFjY2VzcyBjYXJkcyBjYW4gdXNlLgorICovCisjZGVmaW5lIHZpcnRfdG9fYnVzIHZpcnRfdG9fcGh5cworCisKKy8qIGJ1c190b192aXJ0IHJldmVyc2VzIHZpcnRfdG9fYnVzLCB0aGUgYWRkcmVzcyBtdXN0IGJlIG91dHB1dAorICogZnJvbSB2aXJ0X3RvX2J1cyB0byBiZSB2YWxpZC4gIFRoaXMgZnVuY3Rpb24gZG9lcyBub3Qgd29yayBvbgorICogYWxsIGJ1cyBhZGRyZXNzZXMuCisgKi8KKyNkZWZpbmUgYnVzX3RvX3ZpcnQgcGh5c190b192aXJ0CisKKy8qIGlvcmVtYXAgY29udmVydHMgYSByYW5kb20gMzJiaXQgYnVzIGFkZHJlc3MgaW50byBzb21ldGhpbmcKKyAqIGV0aGVyYm9vdCBjYW4gYWNjZXNzLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgKmlvcmVtYXAodW5zaWduZWQgbG9uZyBidXNfYWRkciwgdW5zaWduZWQgbG9uZyBsZW5ndGggX191bnVzZWQpCit7CisJcmV0dXJuIGJ1c190b192aXJ0KGJ1c19hZGRyKTsKK30KKworLyogaW91bm1hcCBjbGVhbnMgdXAgYW55dGhpbmcgaW9yZW1hcCBoYWQgdG8gc2V0dXAgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBpb3VubWFwKHZvaWQgKnZpcnRfYWRkciBfX3VudXNlZCkKK3sKKwlyZXR1cm47Cit9CisKKy8qCisgKiBUaGlzIGZpbGUgY29udGFpbnMgdGhlIGRlZmluaXRpb25zIGZvciB0aGUgeDg2IElPIGluc3RydWN0aW9ucworICogaW5iL2ludy9pbmwvb3V0Yi9vdXR3L291dGwgYW5kIHRoZSAic3RyaW5nIHZlcnNpb25zIiBvZiB0aGUgc2FtZQorICogKGluc2IvaW5zdy9pbnNsL291dHNiL291dHN3L291dHNsKS4gWW91IGNhbiBhbHNvIHVzZSAicGF1c2luZyIKKyAqIHZlcnNpb25zIG9mIHRoZSBzaW5nbGUtSU8gaW5zdHJ1Y3Rpb25zIChpbmJfcC9pbndfcC8uLikuCisgKgorICogVGhpcyBmaWxlIGlzIG5vdCBtZWFudCB0byBiZSBvYmZ1c2NhdGluZzogaXQncyBqdXN0IGNvbXBsaWNhdGVkCisgKiB0byAoYSkgaGFuZGxlIGl0IGFsbCBpbiBhIHdheSB0aGF0IG1ha2VzIGdjYyBhYmxlIHRvIG9wdGltaXplIGl0CisgKiBhcyB3ZWxsIGFzIHBvc3NpYmxlIGFuZCAoYikgdHJ5aW5nIHRvIGF2b2lkIHdyaXRpbmcgdGhlIHNhbWUgdGhpbmcKKyAqIG92ZXIgYW5kIG92ZXIgYWdhaW4gd2l0aCBzbGlnaHQgdmFyaWF0aW9ucyBhbmQgcG9zc2libHkgbWFraW5nIGEKKyAqIG1pc3Rha2Ugc29tZXdoZXJlLgorICovCisKKy8qCisgKiBUaGFua3MgdG8gSmFtZXMgdmFuIEFydHNkYWxlbiBmb3IgYSBiZXR0ZXIgdGltaW5nLWZpeCB0aGFuCisgKiB0aGUgdHdvIHNob3J0IGp1bXBzOiB1c2luZyBvdXRiJ3MgdG8gYSBub25leGlzdGVudCBwb3J0IHNlZW1zCisgKiB0byBndWFyYW50ZWUgYmV0dGVyIHRpbWluZ3MgZXZlbiBvbiBmYXN0IG1hY2hpbmVzLgorICoKKyAqIE9uIHRoZSBvdGhlciBoYW5kLCBJJ2QgbGlrZSB0byBiZSBzdXJlIG9mIGEgbm9uLWV4aXN0ZW50IHBvcnQ6CisgKiBJIGZlZWwgYSBiaXQgdW5zYWZlIGFib3V0IHVzaW5nIDB4ODAgKHNob3VsZCBiZSBzYWZlLCB0aG91Z2gpCisgKgorICoJCUxpbnVzCisgKi8KKworI2lmZGVmCVNMT1dfSU9fQllfSlVNUElORworI2RlZmluZSBfX1NMT1dfRE9XTl9JTyBfX2FzbV9fIF9fdm9sYXRpbGVfXygiam1wIDFmXG4xOlx0am1wIDFmXG4xOiIpCisjZWxzZQorI2RlZmluZSBfX1NMT1dfRE9XTl9JTyBfX2FzbV9fIF9fdm9sYXRpbGVfXygib3V0YiAlYWwsJDB4ODAiKQorI2VuZGlmCisKKyNpZmRlZglSRUFMTFlfU0xPV19JTworI2RlZmluZSBTTE9XX0RPV05fSU8geyBfX1NMT1dfRE9XTl9JTzsgX19TTE9XX0RPV05fSU87IF9fU0xPV19ET1dOX0lPOyBfX1NMT1dfRE9XTl9JTzsgfQorI2Vsc2UKKyNkZWZpbmUgU0xPV19ET1dOX0lPIF9fU0xPV19ET1dOX0lPCisjZW5kaWYKKworLyoKKyAqIHJlYWRYL3dyaXRlWCgpIGFyZSB1c2VkIHRvIGFjY2VzcyBtZW1vcnkgbWFwcGVkIGRldmljZXMuIE9uIHNvbWUKKyAqIGFyY2hpdGVjdHVyZXMgdGhlIG1lbW9yeSBtYXBwZWQgSU8gc3R1ZmYgbmVlZHMgdG8gYmUgYWNjZXNzZWQKKyAqIGRpZmZlcmVudGx5LiBPbiB0aGUgeDg2IGFyY2hpdGVjdHVyZSwgd2UganVzdCByZWFkL3dyaXRlIHRoZQorICogbWVtb3J5IGxvY2F0aW9uIGRpcmVjdGx5LgorICovCisjZGVmaW5lIHJlYWRiKGFkZHIpICgqKHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKikgKGFkZHIpKQorI2RlZmluZSByZWFkdyhhZGRyKSAoKih2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCAqKSAoYWRkcikpCisjZGVmaW5lIHJlYWRsKGFkZHIpICgqKHZvbGF0aWxlIHVuc2lnbmVkIGludCAqKSAoYWRkcikpCisKKyNkZWZpbmUgd3JpdGViKGIsYWRkcikgKCgqKHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKikgKGFkZHIpKSA9IChiKSkKKyNkZWZpbmUgd3JpdGV3KGIsYWRkcikgKCgqKHZvbGF0aWxlIHVuc2lnbmVkIHNob3J0ICopIChhZGRyKSkgPSAoYikpCisjZGVmaW5lIHdyaXRlbChiLGFkZHIpICgoKih2b2xhdGlsZSB1bnNpZ25lZCBpbnQgKikgKGFkZHIpKSA9IChiKSkKKworI2RlZmluZSBtZW1jcHlfZnJvbWlvKGEsYixjKQltZW1jcHkoKGEpLCh2b2lkICopKGIpLChjKSkKKyNkZWZpbmUgbWVtY3B5X3RvaW8oYSxiLGMpCW1lbWNweSgodm9pZCAqKShhKSwoYiksKGMpKQorCisvKgorICogRm9yY2Ugc3RyaWN0IENQVSBvcmRlcmluZy4KKyAqIEFuZCB5ZXMsIHRoaXMgaXMgcmVxdWlyZWQgb24gVVAgdG9vIHdoZW4gd2UncmUgdGFsa2luZworICogdG8gZGV2aWNlcy4KKyAqCisgKiBGb3Igbm93LCAid21iKCkiIGRvZXNuJ3QgYWN0dWFsbHkgZG8gYW55dGhpbmcsIGFzIGFsbAorICogSW50ZWwgQ1BVJ3MgZm9sbG93IHdoYXQgSW50ZWwgY2FsbHMgYSAqUHJvY2Vzc29yIE9yZGVyKiwKKyAqIGluIHdoaWNoIGFsbCB3cml0ZXMgYXJlIHNlZW4gaW4gdGhlIHByb2dyYW0gb3JkZXIgZXZlbgorICogb3V0c2lkZSB0aGUgQ1BVLgorICoKKyAqIEkgZXhwZWN0IGZ1dHVyZSBJbnRlbCBDUFUncyB0byBoYXZlIGEgd2Vha2VyIG9yZGVyaW5nLAorICogYnV0IEknZCBhbHNvIGV4cGVjdCB0aGVtIHRvIGZpbmFsbHkgZ2V0IHRoZWlyIGFjdCB0b2dldGhlcgorICogYW5kIGFkZCBzb21lIHJlYWwgbWVtb3J5IGJhcnJpZXJzIGlmIHNvLgorICoKKyAqIFNvbWUgbm9uIGludGVsIGNsb25lcyBzdXBwb3J0IG91dCBvZiBvcmRlciBzdG9yZS4gd21iKCkgY2Vhc2VzIHRvIGJlIGEKKyAqIG5vcCBmb3IgdGhlc2UuCisgKi8KKyAKKyNkZWZpbmUgbWIoKSAJX19hc21fXyBfX3ZvbGF0aWxlX18gKCJsb2NrOyBhZGRsICQwLDAoJSVlc3ApIjogOiA6Im1lbW9yeSIpCisjZGVmaW5lIHJtYigpCW1iKCkKKyNkZWZpbmUgd21iKCkJbWIoKTsKKworCisvKgorICogVGFsayBhYm91dCBtaXN1c2luZyBtYWNyb3MuLgorICovCisKKyNkZWZpbmUgX19PVVQxKHMseCkgXAorZXh0ZXJuIHZvaWQgX19vdXQjI3ModW5zaWduZWQgeCB2YWx1ZSwgdW5zaWduZWQgc2hvcnQgcG9ydCk7IFwKK2V4dGVybiBpbmxpbmUgdm9pZCBfX291dCMjcyh1bnNpZ25lZCB4IHZhbHVlLCB1bnNpZ25lZCBzaG9ydCBwb3J0KSB7CisKKyNkZWZpbmUgX19PVVQyKHMsczEsczIpIFwKK19fYXNtX18gX192b2xhdGlsZV9fICgib3V0IiAjcyAiICUiIHMxICIwLCUiIHMyICIxIgorCisjZGVmaW5lIF9fT1VUKHMsczEseCkgXAorX19PVVQxKHMseCkgX19PVVQyKHMsczEsInciKSA6IDogImEiICh2YWx1ZSksICJkIiAocG9ydCkpOyB9IFwKK19fT1VUMShzIyNjLHgpIF9fT1VUMihzLHMxLCIiKSA6IDogImEiICh2YWx1ZSksICJpZCIgKHBvcnQpKTsgfSBcCitfX09VVDEocyMjX3AseCkgX19PVVQyKHMsczEsInciKSA6IDogImEiICh2YWx1ZSksICJkIiAocG9ydCkpOyBTTE9XX0RPV05fSU87IH0gXAorX19PVVQxKHMjI2NfcCx4KSBfX09VVDIocyxzMSwiIikgOiA6ICJhIiAodmFsdWUpLCAiaWQiIChwb3J0KSk7IFNMT1dfRE9XTl9JTzsgfQorCisjZGVmaW5lIF9fSU4xKHMseCkgXAorZXh0ZXJuIHVuc2lnbmVkIHggX19pbiMjcyh1bnNpZ25lZCBzaG9ydCBwb3J0KTsgXAorZXh0ZXJuIGlubGluZSB1bnNpZ25lZCB4IF9faW4jI3ModW5zaWduZWQgc2hvcnQgcG9ydCkgeyB1bnNpZ25lZCB4IF92OworCisjZGVmaW5lIF9fSU4yKHMsczEsczIpIFwKK19fYXNtX18gX192b2xhdGlsZV9fICgiaW4iICNzICIgJSIgczIgIjEsJSIgczEgIjAiCisKKyNkZWZpbmUgX19JTihzLHMxLHgsaS4uLikgXAorX19JTjEocyx4KSBfX0lOMihzLHMxLCJ3IikgOiAiPWEiIChfdikgOiAiZCIgKHBvcnQpICwjI2kgKTsgcmV0dXJuIF92OyB9IFwKK19fSU4xKHMjI2MseCkgX19JTjIocyxzMSwiIikgOiAiPWEiIChfdikgOiAiaWQiIChwb3J0KSAsIyNpICk7IHJldHVybiBfdjsgfSBcCitfX0lOMShzIyNfcCx4KSBfX0lOMihzLHMxLCJ3IikgOiAiPWEiIChfdikgOiAiZCIgKHBvcnQpICwjI2kgKTsgU0xPV19ET1dOX0lPOyByZXR1cm4gX3Y7IH0gXAorX19JTjEocyMjY19wLHgpIF9fSU4yKHMsczEsIiIpIDogIj1hIiAoX3YpIDogImlkIiAocG9ydCkgLCMjaSApOyBTTE9XX0RPV05fSU87IHJldHVybiBfdjsgfQorCisjZGVmaW5lIF9fSU5TKHMpIFwKK2V4dGVybiB2b2lkIGlucyMjcyh1bnNpZ25lZCBzaG9ydCBwb3J0LCB2b2lkICogYWRkciwgdW5zaWduZWQgbG9uZyBjb3VudCk7IFwKK2V4dGVybiBpbmxpbmUgdm9pZCBpbnMjI3ModW5zaWduZWQgc2hvcnQgcG9ydCwgdm9pZCAqIGFkZHIsIHVuc2lnbmVkIGxvbmcgY291bnQpIFwKK3sgX19hc21fXyBfX3ZvbGF0aWxlX18gKCJjbGQgOyByZXAgOyBpbnMiICNzIFwKKzogIj1EIiAoYWRkciksICI9YyIgKGNvdW50KSA6ICJkIiAocG9ydCksIjAiIChhZGRyKSwiMSIgKGNvdW50KSk7IH0KKworI2RlZmluZSBfX09VVFMocykgXAorZXh0ZXJuIHZvaWQgb3V0cyMjcyh1bnNpZ25lZCBzaG9ydCBwb3J0LCBjb25zdCB2b2lkICogYWRkciwgdW5zaWduZWQgbG9uZyAgY291bnQpOyBcCitleHRlcm4gaW5saW5lIHZvaWQgb3V0cyMjcyh1bnNpZ25lZCBzaG9ydCBwb3J0LCBjb25zdCB2b2lkICogYWRkciwgdW5zaWduZWQgbG9uZyBjb3VudCkgXAoreyBfX2FzbV9fIF9fdm9sYXRpbGVfXyAoImNsZCA7IHJlcCA7IG91dHMiICNzIFwKKzogIj1TIiAoYWRkciksICI9YyIgKGNvdW50KSA6ICJkIiAocG9ydCksIjAiIChhZGRyKSwiMSIgKGNvdW50KSk7IH0KKworX19JTihiLCIiLCBjaGFyKQorX19JTih3LCIiLHNob3J0KQorX19JTihsLCIiLCBsb25nKQorCitfX09VVChiLCJiIixjaGFyKQorX19PVVQodywidyIsc2hvcnQpCitfX09VVChsLCxpbnQpCisKK19fSU5TKGIpCitfX0lOUyh3KQorX19JTlMobCkKKworX19PVVRTKGIpCitfX09VVFModykKK19fT1VUUyhsKQorCisvKgorICogTm90ZSB0aGF0IGR1ZSB0byB0aGUgd2F5IF9fYnVpbHRpbl9jb25zdGFudF9wKCkgd29ya3MsIHlvdQorICogIC0gY2FuJ3QgdXNlIGl0IGluc2lkZSBhIGlubGluZSBmdW5jdGlvbiAoaXQgd2lsbCBuZXZlciBiZSB0cnVlKQorICogIC0geW91IGRvbid0IGhhdmUgdG8gd29ycnkgYWJvdXQgc2lkZSBlZmZlY3RzIHdpdGhpbiB0aGUgX19idWlsdGluLi4KKyAqLworI2RlZmluZSBvdXRiKHZhbCxwb3J0KSBcCisoKF9fYnVpbHRpbl9jb25zdGFudF9wKChwb3J0KSkgJiYgKHBvcnQpIDwgMjU2KSA/IFwKKwlfX291dGJjKCh2YWwpLChwb3J0KSkgOiBcCisJX19vdXRiKCh2YWwpLChwb3J0KSkpCisKKyNkZWZpbmUgaW5iKHBvcnQpIFwKKygoX19idWlsdGluX2NvbnN0YW50X3AoKHBvcnQpKSAmJiAocG9ydCkgPCAyNTYpID8gXAorCV9faW5iYyhwb3J0KSA6IFwKKwlfX2luYihwb3J0KSkKKworI2RlZmluZSBvdXRiX3AodmFsLHBvcnQpIFwKKygoX19idWlsdGluX2NvbnN0YW50X3AoKHBvcnQpKSAmJiAocG9ydCkgPCAyNTYpID8gXAorCV9fb3V0YmNfcCgodmFsKSwocG9ydCkpIDogXAorCV9fb3V0Yl9wKCh2YWwpLChwb3J0KSkpCisKKyNkZWZpbmUgaW5iX3AocG9ydCkgXAorKChfX2J1aWx0aW5fY29uc3RhbnRfcCgocG9ydCkpICYmIChwb3J0KSA8IDI1NikgPyBcCisJX19pbmJjX3AocG9ydCkgOiBcCisJX19pbmJfcChwb3J0KSkKKworI2RlZmluZSBvdXR3KHZhbCxwb3J0KSBcCisoKF9fYnVpbHRpbl9jb25zdGFudF9wKChwb3J0KSkgJiYgKHBvcnQpIDwgMjU2KSA/IFwKKwlfX291dHdjKCh2YWwpLChwb3J0KSkgOiBcCisJX19vdXR3KCh2YWwpLChwb3J0KSkpCisKKyNkZWZpbmUgaW53KHBvcnQpIFwKKygoX19idWlsdGluX2NvbnN0YW50X3AoKHBvcnQpKSAmJiAocG9ydCkgPCAyNTYpID8gXAorCV9faW53Yyhwb3J0KSA6IFwKKwlfX2ludyhwb3J0KSkKKworI2RlZmluZSBvdXR3X3AodmFsLHBvcnQpIFwKKygoX19idWlsdGluX2NvbnN0YW50X3AoKHBvcnQpKSAmJiAocG9ydCkgPCAyNTYpID8gXAorCV9fb3V0d2NfcCgodmFsKSwocG9ydCkpIDogXAorCV9fb3V0d19wKCh2YWwpLChwb3J0KSkpCisKKyNkZWZpbmUgaW53X3AocG9ydCkgXAorKChfX2J1aWx0aW5fY29uc3RhbnRfcCgocG9ydCkpICYmIChwb3J0KSA8IDI1NikgPyBcCisJX19pbndjX3AocG9ydCkgOiBcCisJX19pbndfcChwb3J0KSkKKworI2RlZmluZSBvdXRsKHZhbCxwb3J0KSBcCisoKF9fYnVpbHRpbl9jb25zdGFudF9wKChwb3J0KSkgJiYgKHBvcnQpIDwgMjU2KSA/IFwKKwlfX291dGxjKCh2YWwpLChwb3J0KSkgOiBcCisJX19vdXRsKCh2YWwpLChwb3J0KSkpCisKKyNkZWZpbmUgaW5sKHBvcnQpIFwKKygoX19idWlsdGluX2NvbnN0YW50X3AoKHBvcnQpKSAmJiAocG9ydCkgPCAyNTYpID8gXAorCV9faW5sYyhwb3J0KSA6IFwKKwlfX2lubChwb3J0KSkKKworI2RlZmluZSBvdXRsX3AodmFsLHBvcnQpIFwKKygoX19idWlsdGluX2NvbnN0YW50X3AoKHBvcnQpKSAmJiAocG9ydCkgPCAyNTYpID8gXAorCV9fb3V0bGNfcCgodmFsKSwocG9ydCkpIDogXAorCV9fb3V0bF9wKCh2YWwpLChwb3J0KSkpCisKKyNkZWZpbmUgaW5sX3AocG9ydCkgXAorKChfX2J1aWx0aW5fY29uc3RhbnRfcCgocG9ydCkpICYmIChwb3J0KSA8IDI1NikgPyBcCisJX19pbmxjX3AocG9ydCkgOiBcCisJX19pbmxfcChwb3J0KSkKKworI2VuZGlmIC8qIEVUSEVSQk9PVF9JT19IICovCmRpZmYgLU5hdXIgZ3J1Yi0wLjk3Lm9yaWcvbmV0Ym9vdC9pcC5oIGdydWItMC45Ny9uZXRib290L2lwLmgKLS0tIGdydWItMC45Ny5vcmlnL25ldGJvb3QvaXAuaAkxOTcwLTAxLTAxIDAwOjAwOjAwLjAwMDAwMDAwMCArMDAwMAorKysgZ3J1Yi0wLjk3L25ldGJvb3QvaXAuaAkyMDA1LTA4LTMxIDE5OjAzOjM1LjAwMDAwMDAwMCArMDAwMApAQCAtMCwwICsxLDM2IEBACisjaWZuZGVmCV9JUF9ICisjZGVmaW5lCV9JUF9ICisKKy8qIFdlIG5lZWQgJ3VpbnQxNl90JyAqLworI2luY2x1ZGUgInR5cGVzLmgiCisvKiBXZSBuZWVkICdpbl9hZGRyJyAqLworI2luY2x1ZGUgImluLmgiCisKK3N0cnVjdCBpcGhkciB7CisJdWludDhfdCAgdmVyaGRybGVuOworCXVpbnQ4X3QgIHNlcnZpY2U7CisJdWludDE2X3QgbGVuOworCXVpbnQxNl90IGlkZW50OworCXVpbnQxNl90IGZyYWdzOworCXVpbnQ4X3QgIHR0bDsKKwl1aW50OF90ICBwcm90b2NvbDsKKwl1aW50MTZfdCBjaGtzdW07CisJaW5fYWRkciBzcmM7CisJaW5fYWRkciBkZXN0OworfTsKKworZXh0ZXJuIHZvaWQgYnVpbGRfaXBfaGRyKHVuc2lnbmVkIGxvbmcgX19kZXN0aXAsIGludCBfX3R0bCwgaW50IF9fcHJvdG9jb2wsIAorCQkJIGludCBfX29wdGlvbl9sZW4sIGludCBfX2xlbiwgY29uc3Qgdm9pZCAqIF9fYnVmKTsKKworZXh0ZXJuIGludCBpcF90cmFuc21pdChpbnQgX19sZW4sIGNvbnN0IHZvaWQgKiBfX2J1Zik7CisKK2V4dGVybiB1aW50MTZfdCBpcGNoa3N1bShjb25zdCB2b2lkICogX19kYXRhLCB1bnNpZ25lZCBsb25nIF9fbGVuZ3RoKTsKKworZXh0ZXJuIHVpbnQxNl90IGFkZF9pcGNoa3N1bXModW5zaWduZWQgbG9uZyBfX29mZnNldCwgdWludDE2X3QgX19zdW0sIAorCQkJICAgICAgdWludDE2X3QgX19uZXcpOworCisKKworCisKKyNlbmRpZgkvKiBfSVBfSCAqLwpkaWZmIC1OYXVyIGdydWItMC45Ny5vcmlnL25ldGJvb3QvaXNhLmggZ3J1Yi0wLjk3L25ldGJvb3QvaXNhLmgKLS0tIGdydWItMC45Ny5vcmlnL25ldGJvb3QvaXNhLmgJMTk3MC0wMS0wMSAwMDowMDowMC4wMDAwMDAwMDAgKzAwMDAKKysrIGdydWItMC45Ny9uZXRib290L2lzYS5oCTIwMDUtMDgtMzEgMTk6MDM6MzUuMDAwMDAwMDAwICswMDAwCkBAIC0wLDAgKzEsMjcgQEAKKyNpZiAhZGVmaW5lZChJU0FfSCkgJiYgZGVmaW5lZChDT05GSUdfSVNBKQorI2RlZmluZSBJU0FfSAorCitzdHJ1Y3QgZGV2OworCisjZGVmaW5lIElTQVBOUF9WRU5ET1IoYSxiLGMpCSgoKCgoYSktJ0EnKzEpJjB4M2YpPDwyKXxcCisJCQkJKCgoKGIpLSdBJysxKSYweDE4KT4+Myl8KCgoKGIpLSdBJysxKSY3KTw8MTMpfFwKKwkJCQkoKCgoYyktJ0EnKzEpJjB4MWYpPDw4KSkKKworI2RlZmluZQlHRU5FUklDX0lTQVBOUF9WRU5ET1IJSVNBUE5QX1ZFTkRPUignUCcsJ04nLCdQJykKKworc3RydWN0IGlzYV9kcml2ZXIKK3sKKwlpbnQgdHlwZTsKKwljb25zdCBjaGFyICpuYW1lOworCWludCAoKnByb2JlKShzdHJ1Y3QgZGV2ICosIHVuc2lnbmVkIHNob3J0ICopOworCXVuc2lnbmVkIHNob3J0ICppb2FkZHJzOworfTsKKworI2RlZmluZSBfX2lzYV9kcml2ZXIJX19hdHRyaWJ1dGVfXyAoKHVudXNlZCxfX3NlY3Rpb25fXygiLmRyaXZlcnMuaXNhIikpKQorZXh0ZXJuIGNvbnN0IHN0cnVjdCBpc2FfZHJpdmVyIGlzYV9kcml2ZXJzW107CitleHRlcm4gY29uc3Qgc3RydWN0IGlzYV9kcml2ZXIgaXNhX2RyaXZlcnNfZW5kW107CisKKyNkZWZpbmUgSVNBX1JPTShJTUFHRSwgREVTQ1JJUFRJT04pCisKKyNlbmRpZiAvKiBJU0FfSCAqLworCmRpZmYgLU5hdXIgZ3J1Yi0wLjk3Lm9yaWcvbmV0Ym9vdC9sYW5jZS5jIGdydWItMC45Ny9uZXRib290L2xhbmNlLmMKLS0tIGdydWItMC45Ny5vcmlnL25ldGJvb3QvbGFuY2UuYwkyMDAzLTA3LTA5IDExOjQ1OjM3LjAwMDAwMDAwMCArMDAwMAorKysgZ3J1Yi0wLjk3L25ldGJvb3QvbGFuY2UuYwkxOTcwLTAxLTAxIDAwOjAwOjAwLjAwMDAwMDAwMCArMDAwMApAQCAtMSw1NjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1FdGhlcmJvb3QgLSAgQk9PVFAvVEZUUCBCb290c3RyYXAgUHJvZ3JhbQotTEFOQ0UgTklDIGRyaXZlciBmb3IgRXRoZXJib290Ci1MYXJnZSBwb3J0aW9ucyBib3Jyb3dlZCBmcm9tIHRoZSBMaW51eCBMQU5DRSBkcml2ZXIgYnkgRG9uYWxkIEJlY2tlcgotS2VuIFlhcCwgSnVseSAxOTk3Ci0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdAotICogeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICovCi0KLS8qIHRvIGdldCBzb21lIGdsb2JhbCByb3V0aW5lcyBsaWtlIHByaW50ZiAqLwotI2luY2x1ZGUgImV0aGVyYm9vdC5oIgotLyogdG8gZ2V0IHRoZSBpbnRlcmZhY2UgdG8gdGhlIGJvZHkgb2YgdGhlIHByb2dyYW0gKi8KLSNpbmNsdWRlICJuaWMuaCIKLSNpZmRlZglJTkNMVURFX0xBTkNFCi0jaW5jbHVkZSAicGNpLmgiCi0jZW5kaWYKLSNpbmNsdWRlICJjYXJkcy5oIgotCi0vKiBPZmZzZXRzIGZyb20gYmFzZSBJL08gYWRkcmVzcyAqLwotI2lmCWRlZmluZWQoSU5DTFVERV9ORTIxMDApIHx8IGRlZmluZWQoSU5DTFVERV9MQU5DRSkKLSNkZWZpbmUJTEFOQ0VfRVRIX0FERFIJMHgwCi0jZGVmaW5lCUxBTkNFX0RBVEEJMHgxMAotI2RlZmluZQlMQU5DRV9BRERSCTB4MTIKLSNkZWZpbmUJTEFOQ0VfUkVTRVQJMHgxNAotI2RlZmluZQlMQU5DRV9CVVNfSUYJMHgxNgotI2RlZmluZQlMQU5DRV9UT1RBTF9TSVpFCTB4MTgKLSNlbmRpZgotI2lmZGVmCUlOQ0xVREVfTkk2NTEwCi0jZGVmaW5lCUxBTkNFX0VUSF9BRERSCTB4OAotI2RlZmluZQlMQU5DRV9EQVRBCTB4MAotI2RlZmluZQlMQU5DRV9BRERSCTB4MgotI2RlZmluZQlMQU5DRV9SRVNFVAkweDQKLSNkZWZpbmUJTEFOQ0VfQlVTX0lGCTB4NgotI2RlZmluZQlMQU5DRV9UT1RBTF9TSVpFCTB4MTAKLSNlbmRpZgotCi0vKiBsYW5jZV9wb2xsKCkgbm93IGNhbiB1c2UgbXVsdGlwbGUgUnggYnVmZmVycyB0byBwcmV2ZW50IHBhY2tldCBsb3NzLiBTZXQKLSAqIFNldCBMQU5DRV9MT0dfUlhfQlVGRkVSUyB0byAwLi43IGZvciAxLCAyLCA0LCA4LCAxNiwgMzIsIDY0IG9yIDEyOCBSeAotICogYnVmZmVycy4gVXN1YWxseSA0ICg9MTYgUnggYnVmZmVycykgaXMgYSBnb29kIHZhbHVlLiAoQW5kcmVhcyBOZXVoYXVzKQotICogRGVjcmVhc2VkIHRvIDIgKD00IFJ4IGJ1ZmZlcnMpIChLZW4gWWFwLCAyMDAxMDMwNSkgKi8KLQotI2RlZmluZSBMQU5DRV9MT0dfUlhfQlVGRkVSUwkyCQkvKiBVc2UgMl4yPTQgUnggYnVmZmVycyAqLwotCi0jZGVmaW5lIFJYX1JJTkdfU0laRQkJKDEgPDwgKExBTkNFX0xPR19SWF9CVUZGRVJTKSkKLSNkZWZpbmUgUlhfUklOR19NT0RfTUFTSwkoUlhfUklOR19TSVpFIC0gMSkKLSNkZWZpbmUgUlhfUklOR19MRU5fQklUUwkoKExBTkNFX0xPR19SWF9CVUZGRVJTKSA8PCAyOSkKLQotc3RydWN0IGxhbmNlX2luaXRfYmxvY2sKLXsKLQl1bnNpZ25lZCBzaG9ydAltb2RlOwotCXVuc2lnbmVkIGNoYXIJcGh5c19hZGRyW0VUSF9BTEVOXTsKLQl1bnNpZ25lZCBsb25nCWZpbHRlclsyXTsKLQlBZGRyZXNzCQlyeF9yaW5nOwotCUFkZHJlc3MJCXR4X3Jpbmc7Ci19OwotCi1zdHJ1Y3QgbGFuY2VfcnhfaGVhZAotewotCXVuaW9uIHsKLQkJQWRkcmVzcwkJYmFzZTsKLQkJdW5zaWduZWQgY2hhcglhZGRyWzRdOwotCX0gdTsKLQlzaG9ydAkJYnVmX2xlbmd0aDsJLyogMnMgY29tcGxlbWVudCAqLwotCXNob3J0CQltc2dfbGVuZ3RoOwotfTsKLQotc3RydWN0IGxhbmNlX3R4X2hlYWQKLXsKLQl1bmlvbiB7Ci0JCUFkZHJlc3MJCWJhc2U7Ci0JCXVuc2lnbmVkIGNoYXIJYWRkcls0XTsKLQl9IHU7Ci0Jc2hvcnQJCWJ1Zl9sZW5ndGg7CS8qIDJzIGNvbXBsZW1lbnQgKi8KLQlzaG9ydAkJbWlzYzsKLX07Ci0KLXN0cnVjdCBsYW5jZV9pbnRlcmZhY2UKLXsKLQlzdHJ1Y3QgbGFuY2VfaW5pdF9ibG9jawlpbml0X2Jsb2NrOwotCXN0cnVjdCBsYW5jZV9yeF9oZWFkCXJ4X3JpbmdbUlhfUklOR19TSVpFXTsKLQlzdHJ1Y3QgbGFuY2VfdHhfaGVhZAl0eF9yaW5nOwotCXVuc2lnbmVkIGNoYXIJCXJidWZbUlhfUklOR19TSVpFXVtFVEhfRlJBTUVfTEVOKzRdOwotCXVuc2lnbmVkIGNoYXIJCXRidWZbRVRIX0ZSQU1FX0xFTl07Ci0JLyoKLQkgKiBEbyBub3QgYWx0ZXIgdGhlIG9yZGVyIG9mIHRoZSBzdHJ1Y3QgbWVtYmVycyBhYm92ZTsKLQkgKiB0aGUgaGFyZHdhcmUgZGVwZW5kcyBvbiB0aGUgY29ycmVjdCBhbGlnbm1lbnQuCi0JICovCi0JaW50CQkJcnhfaWR4OwotfTsKLQotI2RlZmluZQlMQU5DRV9NVVNUX1BBRAkJMHgwMDAwMDAwMQotI2RlZmluZQlMQU5DRV9FTkFCTEVfQVVUT1NFTEVDVAkweDAwMDAwMDAyCi0jZGVmaW5lCUxBTkNFX1NFTEVDVF9QSE9ORUxJTkUJMHgwMDAwMDAwNAotI2RlZmluZQlMQU5DRV9NVVNUX1VOUkVTRVQJMHgwMDAwMDAwOAotCi0vKiBBIG1hcHBpbmcgZnJvbSB0aGUgY2hpcCBJRCBudW1iZXIgdG8gdGhlIHBhcnQgbnVtYmVyIGFuZCBmZWF0dXJlcy4KLSAgIFRoZXNlIGFyZSBmcm9tIHRoZSBkYXRhc2hlZXRzIC0tIGluIHJlYWwgbGlmZSB0aGUgJzk3MCB2ZXJzaW9uCi0gICByZXBvcnRlZGx5IGhhcyB0aGUgc2FtZSBJRCBhcyB0aGUgJzk2NS4gKi8KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgbGFuY2VfY2hpcF90eXBlCi17Ci0JaW50CWlkX251bWJlcjsKLQljb25zdCBjaGFyCSpuYW1lOwotCWludAlmbGFnczsKLX0gY2hpcF90YWJsZVtdID0gewotCXsweDAwMDAsICJMQU5DRSA3OTkwIiwJCQkvKiBBbmNpZW50IGxhbmNlIGNoaXAuICAqLwotCQlMQU5DRV9NVVNUX1BBRCArIExBTkNFX01VU1RfVU5SRVNFVH0sCi0JezB4MDAwMywgIlBDbmV0L0lTQSA3OUM5NjAiLAkJLyogNzlDOTYwIFBDbmV0L0lTQS4gICovCi0JCUxBTkNFX0VOQUJMRV9BVVRPU0VMRUNUfSwKLQl7MHgyMjYwLCAiUENuZXQvSVNBKyA3OUM5NjEiLAkJLyogNzlDOTYxIFBDbmV0L0lTQSssIFBsdWctbi1QbGF5LiAgKi8KLQkJTEFOQ0VfRU5BQkxFX0FVVE9TRUxFQ1R9LAotCXsweDI0MjAsICJQQ25ldC9QQ0kgNzlDOTcwIiwJCS8qIDc5Qzk3MCBvciA3OUM5NzQgUENuZXQtU0NTSSwgUENJLiAqLwotCQlMQU5DRV9FTkFCTEVfQVVUT1NFTEVDVH0sCi0JLyogQnVnOiB0aGUgUENuZXQvUENJIGFjdHVhbGx5IHVzZXMgdGhlIFBDbmV0L1ZMQiBJRCBudW1iZXIsIHNvIGp1c3QgY2FsbAotCQlpdCB0aGUgUENuZXQzMi4gKi8KLQl7MHgyNDMwLCAiUENuZXQzMiIsCQkJLyogNzlDOTY1IFBDbmV0IGZvciBWTCBidXMuICovCi0JCUxBTkNFX0VOQUJMRV9BVVRPU0VMRUNUfSwKLSAgICAgICAgezB4MjYyMSwgIlBDbmV0L1BDSS1JSSA3OUM5NzBBIiwgICAgICAgIC8qIDc5Qzk3MEEgUENJbmV0UENJIElJLiAqLwotICAgICAgICAgICAgICAgIExBTkNFX0VOQUJMRV9BVVRPU0VMRUNUfSwKLQl7MHgyNjI1LCAiUENuZXQtRkFTVCBJSUkgNzlDOTczIiwJLyogNzlDOTczIFBDSW5ldC1GQVNUIElJSS4gKi8KLQkJTEFOQ0VfRU5BQkxFX0FVVE9TRUxFQ1R9LAotICAgICAgICB7MHgyNjI2LCAiUENuZXQvSG9tZVBOQSA3OUM5NzgiLCAgICAgICAgCi0gICAgICAgICAgICAgICAgTEFOQ0VfRU5BQkxFX0FVVE9TRUxFQ1R8TEFOQ0VfU0VMRUNUX1BIT05FTElORX0sCi0JezB4MCwgIlBDbmV0ICh1bmtub3duKSIsCi0JCUxBTkNFX0VOQUJMRV9BVVRPU0VMRUNUfSwKLX07Ci0KLS8qIERlZmluZSBhIG1hY3JvIGZvciBjb252ZXJ0aW5nIHByb2dyYW0gYWRkcmVzc2VzIHRvIHJlYWwgYWRkcmVzc2VzICovCi0jdW5kZWYJdmlydF90b19idXMKLSNkZWZpbmUJdmlydF90b19idXMoeCkJCSgodW5zaWduZWQgbG9uZyl4KQotCi1zdGF0aWMgaW50CQkJY2hpcF92ZXJzaW9uOwotc3RhdGljIGludAkJCWxhbmNlX3ZlcnNpb247Ci1zdGF0aWMgdW5zaWduZWQgc2hvcnQJCWlvYWRkcjsKLSNpZm5kZWYJSU5DTFVERV9MQU5DRQotc3RhdGljIGludAkJCWRtYTsKLSNlbmRpZgotc3RhdGljIHN0cnVjdCBsYW5jZV9pbnRlcmZhY2UJKmxwOwotCi0vKiBhZGRpdGlvbmFsIDggYnl0ZXMgZm9yIDgtYnl0ZSBhbGlnbm1lbnQgc3BhY2UgKi8KLSNpZmRlZglVU0VfTE9XTUVNX0JVRkZFUgotI2RlZmluZSBsYW5jZSAoKGNoYXIgKikweDEwMDAwIC0gKHNpemVvZihzdHJ1Y3QgbGFuY2VfaW50ZXJmYWNlKSs4KSkKLSNlbHNlCi1zdGF0aWMgY2hhcgkJCWxhbmNlW3NpemVvZihzdHJ1Y3QgbGFuY2VfaW50ZXJmYWNlKSs4XTsKLSNlbmRpZgotCi0jaWZuZGVmCUlOQ0xVREVfTEFOQ0UKLS8qIERNQSBkZWZpbmVzIGFuZCBoZWxwZXIgcm91dGluZXMgKi8KLQotLyogRE1BIGNvbnRyb2xsZXIgcmVnaXN0ZXJzICovCi0jZGVmaW5lIERNQTFfQ01EX1JFRwkJMHgwOAkvKiBjb21tYW5kIHJlZ2lzdGVyICh3KSAqLwotI2RlZmluZSBETUExX1NUQVRfUkVHCQkweDA4CS8qIHN0YXR1cyByZWdpc3RlciAocikgKi8KLSNkZWZpbmUgRE1BMV9SRVFfUkVHICAgICAgICAgICAgMHgwOSAgICAvKiByZXF1ZXN0IHJlZ2lzdGVyICh3KSAqLwotI2RlZmluZSBETUExX01BU0tfUkVHCQkweDBBCS8qIHNpbmdsZS1jaGFubmVsIG1hc2sgKHcpICovCi0jZGVmaW5lIERNQTFfTU9ERV9SRUcJCTB4MEIJLyogbW9kZSByZWdpc3RlciAodykgKi8KLSNkZWZpbmUgRE1BMV9DTEVBUl9GRl9SRUcJMHgwQwkvKiBjbGVhciBwb2ludGVyIGZsaXAtZmxvcCAodykgKi8KLSNkZWZpbmUgRE1BMV9URU1QX1JFRyAgICAgICAgICAgMHgwRCAgICAvKiBUZW1wb3JhcnkgUmVnaXN0ZXIgKHIpICovCi0jZGVmaW5lIERNQTFfUkVTRVRfUkVHCQkweDBECS8qIE1hc3RlciBDbGVhciAodykgKi8KLSNkZWZpbmUgRE1BMV9DTFJfTUFTS19SRUcgICAgICAgMHgwRSAgICAvKiBDbGVhciBNYXNrICovCi0jZGVmaW5lIERNQTFfTUFTS19BTExfUkVHICAgICAgIDB4MEYgICAgLyogYWxsLWNoYW5uZWxzIG1hc2sgKHcpICovCi0KLSNkZWZpbmUgRE1BMl9DTURfUkVHCQkweEQwCS8qIGNvbW1hbmQgcmVnaXN0ZXIgKHcpICovCi0jZGVmaW5lIERNQTJfU1RBVF9SRUcJCTB4RDAJLyogc3RhdHVzIHJlZ2lzdGVyIChyKSAqLwotI2RlZmluZSBETUEyX1JFUV9SRUcgICAgICAgICAgICAweEQyICAgIC8qIHJlcXVlc3QgcmVnaXN0ZXIgKHcpICovCi0jZGVmaW5lIERNQTJfTUFTS19SRUcJCTB4RDQJLyogc2luZ2xlLWNoYW5uZWwgbWFzayAodykgKi8KLSNkZWZpbmUgRE1BMl9NT0RFX1JFRwkJMHhENgkvKiBtb2RlIHJlZ2lzdGVyICh3KSAqLwotI2RlZmluZSBETUEyX0NMRUFSX0ZGX1JFRwkweEQ4CS8qIGNsZWFyIHBvaW50ZXIgZmxpcC1mbG9wICh3KSAqLwotI2RlZmluZSBETUEyX1RFTVBfUkVHICAgICAgICAgICAweERBICAgIC8qIFRlbXBvcmFyeSBSZWdpc3RlciAocikgKi8KLSNkZWZpbmUgRE1BMl9SRVNFVF9SRUcJCTB4REEJLyogTWFzdGVyIENsZWFyICh3KSAqLwotI2RlZmluZSBETUEyX0NMUl9NQVNLX1JFRyAgICAgICAweERDICAgIC8qIENsZWFyIE1hc2sgKi8KLSNkZWZpbmUgRE1BMl9NQVNLX0FMTF9SRUcgICAgICAgMHhERSAgICAvKiBhbGwtY2hhbm5lbHMgbWFzayAodykgKi8KLQotCi0jZGVmaW5lIERNQV9NT0RFX1JFQUQJMHg0NAkvKiBJL08gdG8gbWVtb3J5LCBubyBhdXRvaW5pdCwgaW5jcmVtZW50LCBzaW5nbGUgbW9kZSAqLwotI2RlZmluZSBETUFfTU9ERV9XUklURQkweDQ4CS8qIG1lbW9yeSB0byBJL08sIG5vIGF1dG9pbml0LCBpbmNyZW1lbnQsIHNpbmdsZSBtb2RlICovCi0jZGVmaW5lIERNQV9NT0RFX0NBU0NBREUgMHhDMCAgIC8qIHBhc3MgdGhydSBEUkVRLT5IUlEsIERBQ0s8LUhMREEgb25seSAqLwotCi0vKiBlbmFibGUvZGlzYWJsZSBhIHNwZWNpZmljIERNQSBjaGFubmVsICovCi1zdGF0aWMgdm9pZCBlbmFibGVfZG1hKHVuc2lnbmVkIGludCBkbWFucikKLXsKLQlpZiAoZG1hbnIgPD0gMykKLQkJb3V0Yl9wKGRtYW5yLCBETUExX01BU0tfUkVHKTsKLQllbHNlCi0JCW91dGJfcChkbWFuciAmIDMsIERNQTJfTUFTS19SRUcpOwotfQotCi1zdGF0aWMgdm9pZCBkaXNhYmxlX2RtYSh1bnNpZ25lZCBpbnQgZG1hbnIpCi17Ci0JaWYgKGRtYW5yIDw9IDMpCi0JCW91dGJfcChkbWFuciB8IDQsIERNQTFfTUFTS19SRUcpOwotCWVsc2UKLQkJb3V0Yl9wKChkbWFuciAmIDMpIHwgNCwgRE1BMl9NQVNLX1JFRyk7Ci19Ci0KLS8qIHNldCBtb2RlIChhYm92ZSkgZm9yIGEgc3BlY2lmaWMgRE1BIGNoYW5uZWwgKi8KLXN0YXRpYyB2b2lkIHNldF9kbWFfbW9kZSh1bnNpZ25lZCBpbnQgZG1hbnIsIGNoYXIgbW9kZSkKLXsKLQlpZiAoZG1hbnIgPD0gMykKLQkJb3V0Yl9wKG1vZGUgfCBkbWFuciwgRE1BMV9NT0RFX1JFRyk7Ci0JZWxzZQotCQlvdXRiX3AobW9kZSB8IChkbWFuciYzKSwgRE1BMl9NT0RFX1JFRyk7Ci19Ci0jZW5kaWYJLyogIUlOQ0xVREVfTEFOQ0UgKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRVNFVCAtIFJlc2V0IGFkYXB0ZXIKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIGxhbmNlX3Jlc2V0KHN0cnVjdCBuaWMgKm5pYykKLXsKLQlpbnQJCWk7Ci0JQWRkcmVzcwkJbDsKLQotCS8qIFJlc2V0IHRoZSBMQU5DRSAqLwotCSh2b2lkKWludyhpb2FkZHIrTEFOQ0VfUkVTRVQpOwotCS8qIFVuLVJlc2V0IHRoZSBMQU5DRSwgbmVlZGVkIG9ubHkgZm9yIHRoZSBORTIxMDAgKi8KLQlpZiAoY2hpcF90YWJsZVtsYW5jZV92ZXJzaW9uXS5mbGFncyAmIExBTkNFX01VU1RfVU5SRVNFVCkKLQkJb3V0dygwLCBpb2FkZHIrTEFOQ0VfUkVTRVQpOwotCWlmIChjaGlwX3RhYmxlW2xhbmNlX3ZlcnNpb25dLmZsYWdzICYgTEFOQ0VfRU5BQkxFX0FVVE9TRUxFQ1QpCi0JewotCQkvKiBUaGlzIGlzIDc5Qzk2MCBzcGVjaWZpYzsgVHVybiBvbiBhdXRvLXNlbGVjdCBvZiBtZWRpYQotCQkgICAoQVVJLCBCTkMpLiAqLwotCQlvdXR3KDB4MiwgaW9hZGRyK0xBTkNFX0FERFIpOwotCQkvKiBEb24ndCB0b3VjaCAxMGJhc2UyIHBvd2VyIGJpdC4gKi8KLQkJb3V0dyhpbncoaW9hZGRyK0xBTkNFX0JVU19JRikgfCAweDIsIGlvYWRkcitMQU5DRV9CVVNfSUYpOwotCX0KLQkvKiBIb21lUE5BIGNhcmRzIG5lZWQgdG8gZXhwbGljaXRseSBwaWNrIHRoZSBwaG9uZWxpbmUgaW50ZXJmYWNlLgotCSAqIFNvbWUgb2YgdGhlc2UgY2FyZHMgaGF2ZSBldGhlcm5ldCBpbnRlcmZhY2VzIGFzIHdlbGwsIHRoaXMKLQkgKiBjb2RlIG1pZ2h0IHJlcXVpcmUgc29tZSBtb2RpZmljYXRpb24gZm9yIHRob3NlLgotICAJICovCi0gICAgICAgIGlmIChjaGlwX3RhYmxlW2xhbmNlX3ZlcnNpb25dLmZsYWdzICYgTEFOQ0VfU0VMRUNUX1BIT05FTElORSkgewotICAgICAgICAgICAgICAgIHNob3J0IG1lZGlhLCBjaGVjayA7Ci0gICAgICAgICAgICAgICAgLyogdGhpcyBpcyBzcGVjaWZpYyB0byBIb21lUE5BIGNhcmRzLi4uICovCi0gICAgICAgICAgICAgICAgb3V0dyg0OSwgaW9hZGRyKzB4MTIpIDsKLSAgICAgICAgICAgICAgICBtZWRpYSA9IGludyhpb2FkZHIrMHgxNikgOwotI2lmZGVmIERFQlVHCi0gICAgICAgICAgICAgICAgcHJpbnRmKCJtZWRpYSB3YXMgJWRcbiIsIG1lZGlhKSA7Ci0jZW5kaWYKLSAgICAgICAgICAgICAgICBtZWRpYSAmPSB+MyA7Ci0gICAgICAgICAgICAgICAgbWVkaWEgfD0gMSA7Ci0jaWZkZWYgREVCVUcKLSAgICAgICAgICAgICAgICBwcmludGYoIm1lZGlhIGNoYW5nZWQgdG8gJWRcbiIsIG1lZGlhKSA7Ci0jZW5kaWYKLSAgICAgICAgICAgICAgICBtZWRpYSAmPSB+MyA7Ci0gICAgICAgICAgICAgICAgbWVkaWEgfD0gMSA7Ci0gICAgICAgICAgICAgICAgb3V0dyg0OSwgaW9hZGRyKzB4MTIpIDsKLSAgICAgICAgICAgICAgICBvdXR3KG1lZGlhLCBpb2FkZHIrMHgxNikgOwotICAgICAgICAgICAgICAgIG91dHcoNDksIGlvYWRkcisweDEyKSA7Ci0gICAgICAgICAgICAgICAgY2hlY2sgPSBpbncoaW9hZGRyKzB4MTYpIDsKLSNpZmRlZiBERUJVRwotICAgICAgICAgICAgICAgIHByaW50ZigiY2hlY2sgJXMsIG1lZGlhIHdhcyBzZXQgcHJvcGVybHlcbiIsIAotCQkJY2hlY2sgPT0gIG1lZGlhID8gInBhc3NlZCIgOiAiRkFJTEVEIiApIDsgCi0jZW5kaWYKLQl9Ci0gCi0JLyogUmUtaW5pdGlhbGlzZSB0aGUgTEFOQ0UsIGFuZCBzdGFydCBpdCB3aGVuIGRvbmUuICovCi0JLyogU2V0IHN0YXRpb24gYWRkcmVzcyAqLwotCWZvciAoaSA9IDA7IGkgPCBFVEhfQUxFTjsgKytpKQotCQlscC0+aW5pdF9ibG9jay5waHlzX2FkZHJbaV0gPSBuaWMtPm5vZGVfYWRkcltpXTsKLQkvKiBQcmVzZXQgdGhlIHJlY2VpdmUgcmluZyBoZWFkZXJzICovCi0JZm9yIChpPTA7IGk8UlhfUklOR19TSVpFOyBpKyspIHsKLQkJbHAtPnJ4X3JpbmdbaV0uYnVmX2xlbmd0aCA9IC1FVEhfRlJBTUVfTEVOLTQ7Ci0JCS8qIE9XTiAqLwotCQlscC0+cnhfcmluZ1tpXS51LmJhc2UgPSB2aXJ0X3RvX2J1cyhscC0+cmJ1ZltpXSkgJiAweGZmZmZmZjsKLQkJLyogd2Ugc2V0IHRoZSB0b3AgYnl0ZSBhcyB0aGUgdmVyeSBsYXN0IHRoaW5nICovCi0JCWxwLT5yeF9yaW5nW2ldLnUuYWRkclszXSA9IDB4ODA7Ci0JfQotCWxwLT5yeF9pZHggPSAwOwotCWxwLT5pbml0X2Jsb2NrLm1vZGUgPSAweDA7CS8qIGVuYWJsZSBSeCBhbmQgVHggKi8KLQlsID0gKEFkZHJlc3MpdmlydF90b19idXMoJmxwLT5pbml0X2Jsb2NrKTsKLQlvdXR3KDB4MSwgaW9hZGRyK0xBTkNFX0FERFIpOwotCSh2b2lkKWludyhpb2FkZHIrTEFOQ0VfQUREUik7Ci0Jb3V0dygoc2hvcnQpbCwgaW9hZGRyK0xBTkNFX0RBVEEpOwotCW91dHcoMHgyLCBpb2FkZHIrTEFOQ0VfQUREUik7Ci0JKHZvaWQpaW53KGlvYWRkcitMQU5DRV9BRERSKTsKLQlvdXR3KChzaG9ydCkobCA+PiAxNiksIGlvYWRkcitMQU5DRV9EQVRBKTsKLQlvdXR3KDB4NCwgaW9hZGRyK0xBTkNFX0FERFIpOwotCSh2b2lkKWludyhpb2FkZHIrTEFOQ0VfQUREUik7Ci0Jb3V0dygweDkxNSwgaW9hZGRyK0xBTkNFX0RBVEEpOwotCW91dHcoMHgwLCBpb2FkZHIrTEFOQ0VfQUREUik7Ci0JKHZvaWQpaW53KGlvYWRkcitMQU5DRV9BRERSKTsKLQlvdXR3KDB4NCwgaW9hZGRyK0xBTkNFX0RBVEEpOwkJLyogc3RvcCAqLwotCW91dHcoMHgxLCBpb2FkZHIrTEFOQ0VfREFUQSk7CQkvKiBpbml0ICovCi0JZm9yIChpID0gMTAwMDA7IGkgPiAwOyAtLWkpCi0JCWlmIChpbncoaW9hZGRyK0xBTkNFX0RBVEEpICYgMHgxMDApCi0JCQlicmVhazsKLSNpZmRlZglERUJVRwotCWlmIChpIDw9IDApCi0JCXByaW50ZigiSW5pdCB0aW1lZCBvdXRcbiIpOwotI2VuZGlmCi0JLyogQXBwYXJlbnRseSBjbGVhcmluZyB0aGUgSW5pdERvbmUgYml0IGhlcmUgdHJpZ2dlcnMgYSBidWcKLQkgICBpbiB0aGUgJzk3NC4gKE1hcmsgU3RvY2t0b24pICovCi0Jb3V0dygweDIsIGlvYWRkcitMQU5DRV9EQVRBKTsJCS8qIHN0YXJ0ICovCi19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUE9MTCAtIFdhaXQgZm9yIGEgZnJhbWUKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBpbnQgbGFuY2VfcG9sbChzdHJ1Y3QgbmljICpuaWMpCi17Ci0JaW50CQlzdGF0dXM7Ci0KLQlzdGF0dXMgPSBscC0+cnhfcmluZ1tscC0+cnhfaWR4XS51LmJhc2UgPj4gMjQ7Ci0JaWYgKHN0YXR1cyAmIDB4ODApCi0JCXJldHVybiAoMCk7Ci0jaWZkZWYJREVCVUcKLQlwcmludGYoIkxBTkNFIHBhY2tldCByZWNlaXZlZCByeF9yaW5nLnUuYmFzZSAlWCBtY250ICVoWCBjc3IwICVoWFxuIiwKLQkJbHAtPnJ4X3JpbmdbbHAtPnJ4X2lkeF0udS5iYXNlLCBscC0+cnhfcmluZ1tscC0+cnhfaWR4XS5tc2dfbGVuZ3RoLAotCQlpbncoaW9hZGRyK0xBTkNFX0RBVEEpKTsKLSNlbmRpZgotCWlmIChzdGF0dXMgPT0gMHgzKQotCQltZW1jcHkobmljLT5wYWNrZXQsIGxwLT5yYnVmW2xwLT5yeF9pZHhdLCBuaWMtPnBhY2tldGxlbiA9IGxwLT5yeF9yaW5nW2xwLT5yeF9pZHhdLm1zZ19sZW5ndGgpOwotCS8qIEFuZHJldyBCb3lkIG9mIFFOWCByZXBvcnRzIHRoYXQgc29tZSByZXZzIG9mIHRoZSA3OUM3NjUKLQkgICBjbGVhciB0aGUgYnVmZmVyIGxlbmd0aCAqLwotCWxwLT5yeF9yaW5nW2xwLT5yeF9pZHhdLmJ1Zl9sZW5ndGggPSAtRVRIX0ZSQU1FX0xFTi00OwotCWxwLT5yeF9yaW5nW2xwLT5yeF9pZHhdLnUuYWRkclszXSB8PSAweDgwOwkvKiBwcmltZSBmb3IgbmV4dCByZWNlaXZlICovCi0KLQkvKiBJJ20gbm90IHN1cmUgaWYgdGhlIGZvbGxvd2luZyBpcyBzdGlsbCBvayB3aXRoIG11bHRpcGxlIFJ4IGJ1ZmZlcnMsIGJ1dCBpdCB3b3JrcyAqLwotCW91dHcoMHgwLCBpb2FkZHIrTEFOQ0VfQUREUik7Ci0JKHZvaWQpaW53KGlvYWRkcitMQU5DRV9BRERSKTsKLQlvdXR3KDB4NTAwLCBpb2FkZHIrTEFOQ0VfREFUQSk7CQkvKiBjbGVhciByZWNlaXZlICsgSW5pdERvbmUgKi8KLQotCS8qIFN3aXRjaCB0byB0aGUgbmV4dCBSeCByaW5nIGJ1ZmZlciAqLwotCWxwLT5yeF9pZHggPSAobHAtPnJ4X2lkeCArIDEpICYgUlhfUklOR19NT0RfTUFTSzsKLQotCXJldHVybiAoc3RhdHVzID09IDB4Myk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotVFJBTlNNSVQgLSBUcmFuc21pdCBhIGZyYW1lCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBsYW5jZV90cmFuc21pdCgKLQlzdHJ1Y3QgbmljICpuaWMsCi0JY29uc3QgY2hhciAqZCwJCQkvKiBEZXN0aW5hdGlvbiAqLwotCXVuc2lnbmVkIGludCB0LAkJCS8qIFR5cGUgKi8KLQl1bnNpZ25lZCBpbnQgcywJCQkvKiBzaXplICovCi0JY29uc3QgY2hhciAqcCkJCQkvKiBQYWNrZXQgKi8KLXsKLQl1bnNpZ25lZCBsb25nCQl0aW1lOwotCi0JLyogY29weSB0aGUgcGFja2V0IHRvIHJpbmcgYnVmZmVyICovCi0JbWVtY3B5KGxwLT50YnVmLCBkLCBFVEhfQUxFTik7CS8qIGRzdCAqLwotCW1lbWNweSgmbHAtPnRidWZbRVRIX0FMRU5dLCBuaWMtPm5vZGVfYWRkciwgRVRIX0FMRU4pOyAvKiBzcmMgKi8KLQlscC0+dGJ1ZltFVEhfQUxFTitFVEhfQUxFTl0gPSB0ID4+IDg7CS8qIHR5cGUgKi8KLQlscC0+dGJ1ZltFVEhfQUxFTitFVEhfQUxFTisxXSA9IHQ7CS8qIHR5cGUgKi8KLQltZW1jcHkoJmxwLT50YnVmW0VUSF9ITEVOXSwgcCwgcyk7Ci0JcyArPSBFVEhfSExFTjsKLQlpZiAoY2hpcF90YWJsZVtjaGlwX3ZlcnNpb25dLmZsYWdzICYgTEFOQ0VfTVVTVF9QQUQpCi0JCXdoaWxlIChzIDwgRVRIX1pMRU4pCS8qIHBhZCB0byBtaW4gbGVuZ3RoICovCi0JCQlscC0+dGJ1ZltzKytdID0gMDsKLQlscC0+dHhfcmluZy5idWZfbGVuZ3RoID0gLXM7Ci0JbHAtPnR4X3JpbmcubWlzYyA9IDB4MDsKLQkvKiBPV04sIFNUUCwgRU5QICovCi0JbHAtPnR4X3JpbmcudS5iYXNlID0gdmlydF90b19idXMobHAtPnRidWYpICYgMHhmZmZmZmY7Ci0JLyogd2Ugc2V0IHRoZSB0b3AgYnl0ZSBhcyB0aGUgdmVyeSBsYXN0IHRoaW5nICovCi0JbHAtPnR4X3JpbmcudS5hZGRyWzNdID0gMHg4MzsKLQkvKiBUcmlnZ2VyIGFuIGltbWVkaWF0ZSBzZW5kIHBvbGwgKi8KLQlvdXR3KDB4MCwgaW9hZGRyK0xBTkNFX0FERFIpOwotCSh2b2lkKWludyhpb2FkZHIrTEFOQ0VfQUREUik7CS8qIGFzIGluIHRoZSBkYXRhc2hlZXRzLi4uICovCi0JLyogS2xhdXMgRXNwZW5sYXViOiB0aGUgdmFsdWUgYmVsb3cgd2FzIDB4NDgsIGJ1dCB0aGF0IGVuYWJsZWQgdGhlCi0JICogaW50ZXJydXB0IGxpbmUsIGNhdXNpbmcgYSBoYW5nIGlmIGZvciBzb21lIHJlYXNvbmUgdGhlIGludGVycnVwdAotCSAqIGNvbnRyb2xsZXIgaGFkIHRoZSBMQU5DRSBpbnRlcnJ1cHQgZW5hYmxlZC4gIEkgaGF2ZSBubyBpZGVhIHdoeQotCSAqIG5vYm9keSByYW4gaW50byB0aGlzIGJlZm9yZS4uLiAgKi8KLQlvdXR3KDB4MDgsIGlvYWRkcitMQU5DRV9EQVRBKTsKLQkvKiB3YWl0IGZvciB0cmFuc21pdCBjb21wbGV0ZSAqLwotCXRpbWUgPSBjdXJydGlja3MoKSArIFRJQ0tTX1BFUl9TRUM7CQkvKiB3YWl0IG9uZSBzZWNvbmQgKi8KLQl3aGlsZSAoY3VycnRpY2tzKCkgPCB0aW1lICYmIChscC0+dHhfcmluZy51LmJhc2UgJiAweDgwMDAwMDAwKSAhPSAwKQotCQk7Ci0JaWYgKChscC0+dHhfcmluZy51LmJhc2UgJiAweDgwMDAwMDAwKSAhPSAwKQotCQlwcmludGYoIkxBTkNFIHRpbWVkIG91dCBvbiB0cmFuc21pdFxuIik7Ci0JKHZvaWQpaW53KGlvYWRkcitMQU5DRV9BRERSKTsKLQlvdXR3KDB4MjAwLCBpb2FkZHIrTEFOQ0VfREFUQSk7CQkvKiBjbGVhciB0cmFuc21pdCArIEluaXREb25lICovCi0jaWZkZWYJREVCVUcKLQlwcmludGYoInR4X3JpbmcudS5iYXNlICVYIHR4X3JpbmcuYnVmX2xlbmd0aCAlaFggdHhfcmluZy5taXNjICVoWCBjc3IwICVoWFxuIiwKLQkJbHAtPnR4X3JpbmcudS5iYXNlLCBscC0+dHhfcmluZy5idWZfbGVuZ3RoLCBscC0+dHhfcmluZy5taXNjLAotCQlpbncoaW9hZGRyK0xBTkNFX0RBVEEpKTsKLSNlbmRpZgotfQotCi1zdGF0aWMgdm9pZCBsYW5jZV9kaXNhYmxlKHN0cnVjdCBuaWMgKm5pYykKLXsKLQkodm9pZClpbncoaW9hZGRyK0xBTkNFX1JFU0VUKTsKLQlpZiAoY2hpcF90YWJsZVtsYW5jZV92ZXJzaW9uXS5mbGFncyAmIExBTkNFX01VU1RfVU5SRVNFVCkKLQkJb3V0dygwLCBpb2FkZHIrTEFOQ0VfUkVTRVQpOwotCi0Jb3V0dygwLCBpb2FkZHIrTEFOQ0VfQUREUik7Ci0Jb3V0dygweDAwMDQsIGlvYWRkcitMQU5DRV9EQVRBKTsJLyogc3RvcCB0aGUgTEFOQ0UgKi8KLQotI2lmbmRlZglJTkNMVURFX0xBTkNFCi0JZGlzYWJsZV9kbWEoZG1hKTsKLSNlbmRpZgotfQotCi0jaWZkZWYJSU5DTFVERV9MQU5DRQotc3RhdGljIGludCBsYW5jZV9wcm9iZTEoc3RydWN0IG5pYyAqbmljLCBzdHJ1Y3QgcGNpX2RldmljZSAqcGNpKQotI2Vsc2UKLXN0YXRpYyBpbnQgbGFuY2VfcHJvYmUxKHN0cnVjdCBuaWMgKm5pYykKLSNlbmRpZgotewotCWludAkJCXJlc2V0X3ZhbCA7Ci0JdW5zaWduZWQgaW50CQlpOwotCUFkZHJlc3MJCQlsOwotCXNob3J0CQkJZG1hX2NoYW5uZWxzOwotI2lmbmRlZglJTkNMVURFX0xBTkNFCi0Jc3RhdGljIGNvbnN0IGNoYXIJZG1hc1tdID0geyA1LCA2LCA3LCAzIH07Ci0jZW5kaWYKLQotCXJlc2V0X3ZhbCA9IGludyhpb2FkZHIrTEFOQ0VfUkVTRVQpOwotCW91dHcocmVzZXRfdmFsLCBpb2FkZHIrTEFOQ0VfUkVTRVQpOwotI2lmCTEgIC8qIEtsYXVzIEVzcGVubGF1YiAtLSB3YXMgI2lmZGVmCUlOQ0xVREVfTkUyMTAwKi8KLQlvdXR3KDB4MCwgaW9hZGRyK0xBTkNFX0FERFIpOwkvKiBTd2l0Y2ggdG8gd2luZG93IDAgKi8KLQlpZiAoaW53KGlvYWRkcitMQU5DRV9EQVRBKSAhPSAweDQpCi0JCXJldHVybiAoLTEpOwotI2VuZGlmCi0Jb3V0dyg4OCwgaW9hZGRyK0xBTkNFX0FERFIpOwkvKiBHZXQgdGhlIHZlcnNpb24gb2YgdGhlIGNoaXAgKi8KLQlpZiAoaW53KGlvYWRkcitMQU5DRV9BRERSKSAhPSA4OCkKLQkJbGFuY2VfdmVyc2lvbiA9IDA7Ci0JZWxzZQotCXsKLQkJY2hpcF92ZXJzaW9uID0gaW53KGlvYWRkcitMQU5DRV9EQVRBKTsKLQkJb3V0dyg4OSwgaW9hZGRyK0xBTkNFX0FERFIpOwotCQljaGlwX3ZlcnNpb24gfD0gaW53KGlvYWRkcitMQU5DRV9EQVRBKSA8PCAxNjsKLQkJaWYgKChjaGlwX3ZlcnNpb24gJiAweGZmZikgIT0gMHgzKQotCQkJcmV0dXJuICgtMSk7Ci0JCWNoaXBfdmVyc2lvbiA9IChjaGlwX3ZlcnNpb24gPj4gMTIpICYgMHhmZmZmOwotCQlmb3IgKGxhbmNlX3ZlcnNpb24gPSAxOyBjaGlwX3RhYmxlW2xhbmNlX3ZlcnNpb25dLmlkX251bWJlciAhPSAwOyArK2xhbmNlX3ZlcnNpb24pCi0JCQlpZiAoY2hpcF90YWJsZVtsYW5jZV92ZXJzaW9uXS5pZF9udW1iZXIgPT0gY2hpcF92ZXJzaW9uKQotCQkJCWJyZWFrOwotCX0KLQkvKiBtYWtlIHN1cmUgZGF0YSBzdHJ1Y3R1cmUgaXMgOC1ieXRlIGFsaWduZWQgKi8KLQlsID0gKChBZGRyZXNzKWxhbmNlICsgNykgJiB+NzsKLQlscCA9IChzdHJ1Y3QgbGFuY2VfaW50ZXJmYWNlICopbDsKLQlscC0+aW5pdF9ibG9jay5tb2RlID0gMHgzOwkvKiBkaXNhYmxlIFJ4IGFuZCBUeCAqLwotCWxwLT5pbml0X2Jsb2NrLmZpbHRlclswXSA9IGxwLT5pbml0X2Jsb2NrLmZpbHRlclsxXSA9IDB4MDsKLQkvKiB1c2luZyBtdWx0aXBsZSBSeCBidWZmZXIgYW5kIGEgc2luZ2xlIFR4IGJ1ZmZlciAqLwotCWxwLT5pbml0X2Jsb2NrLnJ4X3JpbmcgPSAodmlydF90b19idXMoJmxwLT5yeF9yaW5nKSAmIDB4ZmZmZmZmKSB8IFJYX1JJTkdfTEVOX0JJVFM7Ci0JbHAtPmluaXRfYmxvY2sudHhfcmluZyA9IHZpcnRfdG9fYnVzKCZscC0+dHhfcmluZykgJiAweGZmZmZmZjsKLQlsID0gdmlydF90b19idXMoJmxwLT5pbml0X2Jsb2NrKTsKLQlvdXR3KDB4MSwgaW9hZGRyK0xBTkNFX0FERFIpOwotCSh2b2lkKWludyhpb2FkZHIrTEFOQ0VfQUREUik7Ci0Jb3V0dygodW5zaWduZWQgc2hvcnQpbCwgaW9hZGRyK0xBTkNFX0RBVEEpOwotCW91dHcoMHgyLCBpb2FkZHIrTEFOQ0VfQUREUik7Ci0JKHZvaWQpaW53KGlvYWRkcitMQU5DRV9BRERSKTsKLQlvdXR3KCh1bnNpZ25lZCBzaG9ydCkobCA+PiAxNiksIGlvYWRkcitMQU5DRV9EQVRBKTsKLQlvdXR3KDB4NCwgaW9hZGRyK0xBTkNFX0FERFIpOwotCSh2b2lkKWludyhpb2FkZHIrTEFOQ0VfQUREUik7Ci0Jb3V0dygweDkxNSwgaW9hZGRyK0xBTkNFX0RBVEEpOwotCW91dHcoMHgwLCBpb2FkZHIrTEFOQ0VfQUREUik7Ci0JKHZvaWQpaW53KGlvYWRkcitMQU5DRV9BRERSKTsKLQkvKiBHZXQgc3RhdGlvbiBhZGRyZXNzICovCi0JZm9yIChpID0gMDsgaSA8IEVUSF9BTEVOOyArK2kpIHsKLQkJbmljLT5ub2RlX2FkZHJbaV0gPSBpbmIoaW9hZGRyK0xBTkNFX0VUSF9BRERSK2kpOwotCX0KLSNpZm5kZWYJSU5DTFVERV9MQU5DRQotCS8qIG5vdyBwcm9iZSBmb3IgRE1BIGNoYW5uZWwgKi8KLQlkbWFfY2hhbm5lbHMgPSAoKGluYihETUExX1NUQVRfUkVHKSA+PiA0KSAmIDB4ZikgfAotCQkoaW5iKERNQTJfU1RBVF9SRUcpICYgMHhmMCk7Ci0JLyogbmVlZCB0byBmaXggd2hlbiBQQ0kgcHJvdmlkZXMgRE1BIGluZm8gKi8KLQlmb3IgKGkgPSAwOyBpIDwgKHNpemVvZihkbWFzKS9zaXplb2YoZG1hc1swXSkpOyArK2kpCi0JewotCQlpbnQJCWo7Ci0KLQkJZG1hID0gZG1hc1tpXTsKLQkJLyogRG9uJ3QgZW5hYmxlIGEgcGVybWFuZW50bHkgYnVzeSBETUEgY2hhbm5lbCwKLQkJICAgb3IgdGhlIG1hY2hpbmUgd2lsbCBoYW5nICovCi0JCWlmIChkbWFfY2hhbm5lbHMgJiAoMSA8PCBkbWEpKQotCQkJY29udGludWU7Ci0JCW91dHcoMHg3ZjA0LCBpb2FkZHIrTEFOQ0VfREFUQSk7CS8qIGNsZWFyIG1lbW9yeSBlcnJvciBiaXRzICovCi0JCXNldF9kbWFfbW9kZShkbWEsIERNQV9NT0RFX0NBU0NBREUpOwotCQllbmFibGVfZG1hKGRtYSk7Ci0JCW91dHcoMHgxLCBpb2FkZHIrTEFOQ0VfREFUQSk7CQkvKiBpbml0ICovCi0JCWZvciAoaiA9IDEwMDsgaiA+IDA7IC0taikKLQkJCWlmIChpbncoaW9hZGRyK0xBTkNFX0RBVEEpICYgMHg5MDApCi0JCQkJYnJlYWs7Ci0JCWlmIChpbncoaW9hZGRyK0xBTkNFX0RBVEEpICYgMHgxMDApCi0JCQlicmVhazsKLQkJZWxzZQotCQkJZGlzYWJsZV9kbWEoZG1hKTsKLQl9Ci0JaWYgKGkgPj0gKHNpemVvZihkbWFzKS9zaXplb2YoZG1hc1swXSkpKQotCQlkbWEgPSAwOwotCXByaW50ZigiXG4lcyBiYXNlICUjWCwgRE1BICVkLCBhZGRyICUhXG4iLAotCQljaGlwX3RhYmxlW2xhbmNlX3ZlcnNpb25dLm5hbWUsIGlvYWRkciwgZG1hLCBuaWMtPm5vZGVfYWRkcik7Ci0jZWxzZQotCXByaW50ZigiICVzIGJhc2UgJSNoWCwgYWRkciAlIVxuIiwgY2hpcF90YWJsZVtsYW5jZV92ZXJzaW9uXS5uYW1lLCBpb2FkZHIsIG5pYy0+bm9kZV9hZGRyKTsKLSNlbmRpZgotCWlmIChjaGlwX3RhYmxlW2NoaXBfdmVyc2lvbl0uZmxhZ3MgJiBMQU5DRV9FTkFCTEVfQVVUT1NFTEVDVCkgewotCQkvKiBUdXJuIG9uIGF1dG8tc2VsZWN0IG9mIG1lZGlhICgxMGJhc2VUIG9yIEJOQykgc28gdGhhdCB0aGUKLQkJICogdXNlciB3YXRjaCB0aGUgTEVEcy4gKi8KLQkJb3V0dygweDAwMDIsIGlvYWRkcitMQU5DRV9BRERSKTsKLQkJLyogRG9uJ3QgdG91Y2ggMTBiYXNlMiBwb3dlciBiaXQuICovCi0JCW91dHcoaW53KGlvYWRkcitMQU5DRV9CVVNfSUYpIHwgMHgwMDAyLCBpb2FkZHIrTEFOQ0VfQlVTX0lGKTsKLQl9Ci0JcmV0dXJuIChsYW5jZV92ZXJzaW9uKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1QUk9CRSAtIExvb2sgZm9yIGFuIGFkYXB0ZXIsIHRoaXMgcm91dGluZSdzIHZpc2libGUgdG8gdGhlIG91dHNpZGUKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2lmZGVmCUlOQ0xVREVfTEFOQ0UKLXN0cnVjdCBuaWMgKmxhbmNlcGNpX3Byb2JlKHN0cnVjdCBuaWMgKm5pYywgdW5zaWduZWQgc2hvcnQgKnByb2JlX2FkZHJzLCBzdHJ1Y3QgcGNpX2RldmljZSAqcGNpKQotI2VuZGlmCi0jaWZkZWYJSU5DTFVERV9ORTIxMDAKLXN0cnVjdCBuaWMgKm5lMjEwMF9wcm9iZShzdHJ1Y3QgbmljICpuaWMsIHVuc2lnbmVkIHNob3J0ICpwcm9iZV9hZGRycykKLSNlbmRpZgotI2lmZGVmCUlOQ0xVREVfTkk2NTEwCi1zdHJ1Y3QgbmljICpuaTY1MTBfcHJvYmUoc3RydWN0IG5pYyAqbmljLCB1bnNpZ25lZCBzaG9ydCAqcHJvYmVfYWRkcnMpCi0jZW5kaWYKLXsKLQl1bnNpZ25lZCBzaG9ydAkJKnA7Ci0jaWZuZGVmCUlOQ0xVREVfTEFOQ0UKLQlzdGF0aWMgdW5zaWduZWQgc2hvcnQJaW9fYWRkcnNbXSA9IHsgMHgzMDAsIDB4MzIwLCAweDM0MCwgMHgzNjAsIDAgfTsKLSNlbmRpZgotCi0JLyogaWYgcHJvYmVfYWRkcnMgaXMgMCwgdGhlbiByb3V0aW5lIGNhbiB1c2UgYSBoYXJkd2lyZWQgZGVmYXVsdCAqLwotCWlmIChwcm9iZV9hZGRycyA9PSAwKSB7Ci0jaWZkZWYJSU5DTFVERV9MQU5DRQotCQlyZXR1cm4gMDsKLSNlbHNlCi0JCXByb2JlX2FkZHJzID0gaW9fYWRkcnM7Ci0jZW5kaWYKLQl9Ci0JZm9yIChwID0gcHJvYmVfYWRkcnM7IChpb2FkZHIgPSAqcCkgIT0gMDsgKytwKQotCXsKLQkJY2hhcglvZmZzZXQxNSwgb2Zmc2V0MTQgPSBpbmIoaW9hZGRyICsgMTQpOwotCQl1bnNpZ25lZCBzaG9ydAlwY2lfY21kOwotCi0jaWZkZWYJSU5DTFVERV9ORTIxMDAKLQkJaWYgKChvZmZzZXQxNCA9PSAweDUyIHx8IG9mZnNldDE0ID09IDB4NTcpICYmCi0JCSAoKG9mZnNldDE1ID0gaW5iKGlvYWRkciArIDE1KSkgPT0gMHg1NyB8fCBvZmZzZXQxNSA9PSAweDQ0KSkKLQkJCWlmIChsYW5jZV9wcm9iZTEobmljKSA+PSAwKQotCQkJCWJyZWFrOwotI2VuZGlmCi0jaWZkZWYJSU5DTFVERV9OSTY1MTAKLQkJaWYgKChvZmZzZXQxNCA9PSAweDAwIHx8IG9mZnNldDE0ID09IDB4NTIpICYmCi0JCSAoKG9mZnNldDE1ID0gaW5iKGlvYWRkciArIDE1KSkgPT0gMHg1NSB8fCBvZmZzZXQxNSA9PSAweDQ0KSkKLQkJCWlmIChsYW5jZV9wcm9iZTEobmljKSA+PSAwKQotCQkJCWJyZWFrOwotI2VuZGlmCi0jaWZkZWYJSU5DTFVERV9MQU5DRQotCQlhZGp1c3RfcGNpX2RldmljZShwY2kpOwotCQlpZiAobGFuY2VfcHJvYmUxKG5pYywgcGNpKSA+PSAwKQotCQkJYnJlYWs7Ci0jZW5kaWYKLQl9Ci0JLyogaWYgYm9hcmQgZm91bmQgKi8KLQlpZiAoaW9hZGRyICE9IDApCi0JewotCQkvKiBwb2ludCB0byBOSUMgc3BlY2lmaWMgcm91dGluZXMgKi8KLQkJbGFuY2VfcmVzZXQobmljKTsKLQkJbmljLT5yZXNldCA9IGxhbmNlX3Jlc2V0OwotCQluaWMtPnBvbGwgPSBsYW5jZV9wb2xsOwotCQluaWMtPnRyYW5zbWl0ID0gbGFuY2VfdHJhbnNtaXQ7Ci0JCW5pYy0+ZGlzYWJsZSA9IGxhbmNlX2Rpc2FibGU7Ci0JCXJldHVybiBuaWM7Ci0JfQotCi0JLyogbm8gYm9hcmQgZm91bmQgKi8KLQlyZXR1cm4gMDsKLX0KZGlmZiAtTmF1ciBncnViLTAuOTcub3JpZy9uZXRib290L2xhdGNoLmggZ3J1Yi0wLjk3L25ldGJvb3QvbGF0Y2guaAotLS0gZ3J1Yi0wLjk3Lm9yaWcvbmV0Ym9vdC9sYXRjaC5oCTE5NzAtMDEtMDEgMDA6MDA6MDAuMDAwMDAwMDAwICswMDAwCisrKyBncnViLTAuOTcvbmV0Ym9vdC9sYXRjaC5oCTIwMDUtMDgtMzEgMTk6MDM6MzUuMDAwMDAwMDAwICswMDAwCkBAIC0wLDAgKzEsMTAgQEAKKyNpZm5kZWYgTEFUQ0hfSAorI2RlZmluZSBMQVRDSF9ICisKKyNkZWZpbmUJVElDS1NfUEVSX1NFQwkJMTgKKworLyogRm9yIGRpZmZlcmVudCBjYWxpYnJhdG9ycyBvZiB0aGUgVFNDIG1vdmUgdGhlIGRlY2xhcmF0aW9uIG9mCisgKiBzbGVlcF9sYXRjaCBhbmQgdGhlIGRlZmluaXRpb25zIG9mIGl0J3MgbGVuZ3RoIGhlcmUuLi4KKyAqLworCisjZW5kaWYgLyogTEFUQ0hfSCAqLwpkaWZmIC1OYXVyIGdydWItMC45Ny5vcmlnL25ldGJvb3QvbGludXgtYXNtLWlvLmggZ3J1Yi0wLjk3L25ldGJvb3QvbGludXgtYXNtLWlvLmgKLS0tIGdydWItMC45Ny5vcmlnL25ldGJvb3QvbGludXgtYXNtLWlvLmgJMjAwMy0wNy0wOSAxMTo0NTozNy4wMDAwMDAwMDAgKzAwMDAKKysrIGdydWItMC45Ny9uZXRib290L2xpbnV4LWFzbS1pby5oCTE5NzAtMDEtMDEgMDA6MDA6MDAuMDAwMDAwMDAwICswMDAwCkBAIC0xLDE4NyArMCwwIEBACi0jaWZuZGVmCV9BU01fSU9fSAotI2RlZmluZSBfQVNNX0lPX0gKLQotLyoKLSAqIFRoaXMgZmlsZSBjb250YWlucyB0aGUgZGVmaW5pdGlvbnMgZm9yIHRoZSB4ODYgSU8gaW5zdHJ1Y3Rpb25zCi0gKiBpbmIvaW53L2lubC9vdXRiL291dHcvb3V0bCBhbmQgdGhlICJzdHJpbmcgdmVyc2lvbnMiIG9mIHRoZSBzYW1lCi0gKiAoaW5zYi9pbnN3L2luc2wvb3V0c2Ivb3V0c3cvb3V0c2wpLiBZb3UgY2FuIGFsc28gdXNlICJwYXVzaW5nIgotICogdmVyc2lvbnMgb2YgdGhlIHNpbmdsZS1JTyBpbnN0cnVjdGlvbnMgKGluYl9wL2lud19wLy4uKS4KLSAqCi0gKiBUaGlzIGZpbGUgaXMgbm90IG1lYW50IHRvIGJlIG9iZnVzY2F0aW5nOiBpdCdzIGp1c3QgY29tcGxpY2F0ZWQKLSAqIHRvIChhKSBoYW5kbGUgaXQgYWxsIGluIGEgd2F5IHRoYXQgbWFrZXMgZ2NjIGFibGUgdG8gb3B0aW1pemUgaXQKLSAqIGFzIHdlbGwgYXMgcG9zc2libGUgYW5kIChiKSB0cnlpbmcgdG8gYXZvaWQgd3JpdGluZyB0aGUgc2FtZSB0aGluZwotICogb3ZlciBhbmQgb3ZlciBhZ2FpbiB3aXRoIHNsaWdodCB2YXJpYXRpb25zIGFuZCBwb3NzaWJseSBtYWtpbmcgYQotICogbWlzdGFrZSBzb21ld2hlcmUuCi0gKi8KLQotLyoKLSAqIFRoYW5rcyB0byBKYW1lcyB2YW4gQXJ0c2RhbGVuIGZvciBhIGJldHRlciB0aW1pbmctZml4IHRoYW4KLSAqIHRoZSB0d28gc2hvcnQganVtcHM6IHVzaW5nIG91dGIncyB0byBhIG5vbmV4aXN0ZW50IHBvcnQgc2VlbXMKLSAqIHRvIGd1YXJhbnRlZSBiZXR0ZXIgdGltaW5ncyBldmVuIG9uIGZhc3QgbWFjaGluZXMuCi0gKgotICogT24gdGhlIG90aGVyIGhhbmQsIEknZCBsaWtlIHRvIGJlIHN1cmUgb2YgYSBub24tZXhpc3RlbnQgcG9ydDoKLSAqIEkgZmVlbCBhIGJpdCB1bnNhZmUgYWJvdXQgdXNpbmcgMHg4MCAoc2hvdWxkIGJlIHNhZmUsIHRob3VnaCkKLSAqCi0gKgkJTGludXMKLSAqLwotCi0jaWZkZWYJU0xPV19JT19CWV9KVU1QSU5HCi0jZGVmaW5lIF9fU0xPV19ET1dOX0lPIF9fYXNtX18gX192b2xhdGlsZV9fKCJqbXAgMWZcbjE6XHRqbXAgMWZcbjE6IikKLSNlbHNlCi0jZGVmaW5lIF9fU0xPV19ET1dOX0lPIF9fYXNtX18gX192b2xhdGlsZV9fKCJvdXRiICVhbCwkMHg4MCIpCi0jZW5kaWYKLQotI2lmZGVmCVJFQUxMWV9TTE9XX0lPCi0jZGVmaW5lIFNMT1dfRE9XTl9JTyB7IF9fU0xPV19ET1dOX0lPOyBfX1NMT1dfRE9XTl9JTzsgX19TTE9XX0RPV05fSU87IF9fU0xPV19ET1dOX0lPOyB9Ci0jZWxzZQotI2RlZmluZSBTTE9XX0RPV05fSU8gX19TTE9XX0RPV05fSU8KLSNlbmRpZgotCi0vKgotICogcmVhZFgvd3JpdGVYKCkgYXJlIHVzZWQgdG8gYWNjZXNzIG1lbW9yeSBtYXBwZWQgZGV2aWNlcy4gT24gc29tZQotICogYXJjaGl0ZWN0dXJlcyB0aGUgbWVtb3J5IG1hcHBlZCBJTyBzdHVmZiBuZWVkcyB0byBiZSBhY2Nlc3NlZAotICogZGlmZmVyZW50bHkuIE9uIHRoZSB4ODYgYXJjaGl0ZWN0dXJlLCB3ZSBqdXN0IHJlYWQvd3JpdGUgdGhlCi0gKiBtZW1vcnkgbG9jYXRpb24gZGlyZWN0bHkuCi0gKi8KLSNkZWZpbmUgcmVhZGIoYWRkcikgKCoodm9sYXRpbGUgdW5zaWduZWQgY2hhciAqKSAoYWRkcikpCi0jZGVmaW5lIHJlYWR3KGFkZHIpICgqKHZvbGF0aWxlIHVuc2lnbmVkIHNob3J0ICopIChhZGRyKSkKLSNkZWZpbmUgcmVhZGwoYWRkcikgKCoodm9sYXRpbGUgdW5zaWduZWQgaW50ICopIChhZGRyKSkKLQotI2RlZmluZSB3cml0ZWIoYixhZGRyKSAoKCoodm9sYXRpbGUgdW5zaWduZWQgY2hhciAqKSAoYWRkcikpID0gKGIpKQotI2RlZmluZSB3cml0ZXcoYixhZGRyKSAoKCoodm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgKikgKGFkZHIpKSA9IChiKSkKLSNkZWZpbmUgd3JpdGVsKGIsYWRkcikgKCgqKHZvbGF0aWxlIHVuc2lnbmVkIGludCAqKSAoYWRkcikpID0gKGIpKQotCi0jZGVmaW5lIG1lbXNldF9pbyhhLGIsYykJbWVtc2V0KCh2b2lkICopKGEpLChiKSwoYykpCi0jZGVmaW5lIG1lbWNweV9mcm9taW8oYSxiLGMpCW1lbWNweSgoYSksKHZvaWQgKikoYiksKGMpKQotI2RlZmluZSBtZW1jcHlfdG9pbyhhLGIsYykJbWVtY3B5KCh2b2lkICopKGEpLChiKSwoYykpCi0KLS8qCi0gKiBBZ2FpbiwgaTM4NiBkb2VzIG5vdCByZXF1aXJlIG1lbSBJTyBzcGVjaWZpYyBmdW5jdGlvbi4KLSAqLwotCi0jZGVmaW5lIGV0aF9pb19jb3B5X2FuZF9zdW0oYSxiLGMsZCkJZXRoX2NvcHlfYW5kX3N1bSgoYSksKHZvaWQgKikoYiksKGMpLChkKSkKLQotLyoKLSAqIFRhbGsgYWJvdXQgbWlzdXNpbmcgbWFjcm9zLi4KLSAqLwotCi0jZGVmaW5lIF9fT1VUMShzLHgpIFwKLWV4dGVybiB2b2lkIF9fb3V0IyNzKHVuc2lnbmVkIHggdmFsdWUsIHVuc2lnbmVkIHNob3J0IHBvcnQpOyBcCi1leHRlcm4gaW5saW5lIHZvaWQgX19vdXQjI3ModW5zaWduZWQgeCB2YWx1ZSwgdW5zaWduZWQgc2hvcnQgcG9ydCkgewotCi0jZGVmaW5lIF9fT1VUMihzLHMxLHMyKSBcCi1fX2FzbV9fIF9fdm9sYXRpbGVfXyAoIm91dCIgI3MgIiAlIiBzMSAiMCwlIiBzMiAiMSIKLQotI2RlZmluZSBfX09VVChzLHMxLHgpIFwKLV9fT1VUMShzLHgpIF9fT1VUMihzLHMxLCJ3IikgOiA6ICJhIiAodmFsdWUpLCAiZCIgKHBvcnQpKTsgfSBcCi1fX09VVDEocyMjYyx4KSBfX09VVDIocyxzMSwiIikgOiA6ICJhIiAodmFsdWUpLCAiaWQiIChwb3J0KSk7IH0gXAotX19PVVQxKHMjI19wLHgpIF9fT1VUMihzLHMxLCJ3IikgOiA6ICJhIiAodmFsdWUpLCAiZCIgKHBvcnQpKTsgU0xPV19ET1dOX0lPOyB9IFwKLV9fT1VUMShzIyNjX3AseCkgX19PVVQyKHMsczEsIiIpIDogOiAiYSIgKHZhbHVlKSwgImlkIiAocG9ydCkpOyBTTE9XX0RPV05fSU87IH0KLQotI2RlZmluZSBfX0lOMShzLHgpIFwKLWV4dGVybiB1bnNpZ25lZCB4IF9faW4jI3ModW5zaWduZWQgc2hvcnQgcG9ydCk7IFwKLWV4dGVybiBpbmxpbmUgdW5zaWduZWQgeCBfX2luIyNzKHVuc2lnbmVkIHNob3J0IHBvcnQpIHsgdW5zaWduZWQgeCBfdjsKLQotI2RlZmluZSBfX0lOMihzLHMxLHMyKSBcCi1fX2FzbV9fIF9fdm9sYXRpbGVfXyAoImluIiAjcyAiICUiIHMyICIxLCUiIHMxICIwIgotCi0jZGVmaW5lIF9fSU4ocyxzMSx4LGkuLi4pIFwKLV9fSU4xKHMseCkgX19JTjIocyxzMSwidyIpIDogIj1hIiAoX3YpIDogImQiIChwb3J0KSAsIyNpICk7IHJldHVybiBfdjsgfSBcCi1fX0lOMShzIyNjLHgpIF9fSU4yKHMsczEsIiIpIDogIj1hIiAoX3YpIDogImlkIiAocG9ydCkgLCMjaSApOyByZXR1cm4gX3Y7IH0gXAotX19JTjEocyMjX3AseCkgX19JTjIocyxzMSwidyIpIDogIj1hIiAoX3YpIDogImQiIChwb3J0KSAsIyNpICk7IFNMT1dfRE9XTl9JTzsgcmV0dXJuIF92OyB9IFwKLV9fSU4xKHMjI2NfcCx4KSBfX0lOMihzLHMxLCIiKSA6ICI9YSIgKF92KSA6ICJpZCIgKHBvcnQpICwjI2kgKTsgU0xPV19ET1dOX0lPOyByZXR1cm4gX3Y7IH0KLQotI2RlZmluZSBfX0lOUyhzKSBcCi1leHRlcm4gdm9pZCBpbnMjI3ModW5zaWduZWQgc2hvcnQgcG9ydCwgdm9pZCAqIGFkZHIsIHVuc2lnbmVkIGxvbmcgY291bnQpOyBcCi1leHRlcm4gaW5saW5lIHZvaWQgaW5zIyNzKHVuc2lnbmVkIHNob3J0IHBvcnQsIHZvaWQgKiBhZGRyLCB1bnNpZ25lZCBsb25nIGNvdW50KSBcCi17IF9fYXNtX18gX192b2xhdGlsZV9fICgiY2xkIDsgcmVwIDsgaW5zIiAjcyBcCi06ICI9RCIgKGFkZHIpLCAiPWMiIChjb3VudCkgOiAiZCIgKHBvcnQpLCIwIiAoYWRkciksIjEiIChjb3VudCkpOyB9Ci0KLSNkZWZpbmUgX19PVVRTKHMpIFwKLWV4dGVybiB2b2lkIG91dHMjI3ModW5zaWduZWQgc2hvcnQgcG9ydCwgY29uc3Qgdm9pZCAqIGFkZHIsIHVuc2lnbmVkIGxvbmcgIGNvdW50KTsgXAotZXh0ZXJuIGlubGluZSB2b2lkIG91dHMjI3ModW5zaWduZWQgc2hvcnQgcG9ydCwgY29uc3Qgdm9pZCAqIGFkZHIsIHVuc2lnbmVkIGxvbmcgY291bnQpIFwKLXsgX19hc21fXyBfX3ZvbGF0aWxlX18gKCJjbGQgOyByZXAgOyBvdXRzIiAjcyBcCi06ICI9UyIgKGFkZHIpLCAiPWMiIChjb3VudCkgOiAiZCIgKHBvcnQpLCIwIiAoYWRkciksIjEiIChjb3VudCkpOyB9Ci0KLV9fSU4oYiwiIiwgY2hhcikKLV9fSU4odywiIixzaG9ydCkKLV9fSU4obCwiIiwgbG9uZykKLQotX19PVVQoYiwiYiIsY2hhcikKLV9fT1VUKHcsInciLHNob3J0KQotX19PVVQobCwsaW50KQotCi1fX0lOUyhiKQotX19JTlModykKLV9fSU5TKGwpCi0KLV9fT1VUUyhiKQotX19PVVRTKHcpCi1fX09VVFMobCkKLQotLyoKLSAqIE5vdGUgdGhhdCBkdWUgdG8gdGhlIHdheSBfX2J1aWx0aW5fY29uc3RhbnRfcCgpIHdvcmtzLCB5b3UKLSAqICAtIGNhbid0IHVzZSBpdCBpbnNpZGUgYSBpbmxpbmUgZnVuY3Rpb24gKGl0IHdpbGwgbmV2ZXIgYmUgdHJ1ZSkKLSAqICAtIHlvdSBkb24ndCBoYXZlIHRvIHdvcnJ5IGFib3V0IHNpZGUgZWZmZWN0cyB3aXRoaW4gdGhlIF9fYnVpbHRpbi4uCi0gKi8KLSNkZWZpbmUgb3V0Yih2YWwscG9ydCkgXAotKChfX2J1aWx0aW5fY29uc3RhbnRfcCgocG9ydCkpICYmIChwb3J0KSA8IDI1NikgPyBcCi0JX19vdXRiYygodmFsKSwocG9ydCkpIDogXAotCV9fb3V0YigodmFsKSwocG9ydCkpKQotCi0jZGVmaW5lIGluYihwb3J0KSBcCi0oKF9fYnVpbHRpbl9jb25zdGFudF9wKChwb3J0KSkgJiYgKHBvcnQpIDwgMjU2KSA/IFwKLQlfX2luYmMocG9ydCkgOiBcCi0JX19pbmIocG9ydCkpCi0KLSNkZWZpbmUgb3V0Yl9wKHZhbCxwb3J0KSBcCi0oKF9fYnVpbHRpbl9jb25zdGFudF9wKChwb3J0KSkgJiYgKHBvcnQpIDwgMjU2KSA/IFwKLQlfX291dGJjX3AoKHZhbCksKHBvcnQpKSA6IFwKLQlfX291dGJfcCgodmFsKSwocG9ydCkpKQotCi0jZGVmaW5lIGluYl9wKHBvcnQpIFwKLSgoX19idWlsdGluX2NvbnN0YW50X3AoKHBvcnQpKSAmJiAocG9ydCkgPCAyNTYpID8gXAotCV9faW5iY19wKHBvcnQpIDogXAotCV9faW5iX3AocG9ydCkpCi0KLSNkZWZpbmUgb3V0dyh2YWwscG9ydCkgXAotKChfX2J1aWx0aW5fY29uc3RhbnRfcCgocG9ydCkpICYmIChwb3J0KSA8IDI1NikgPyBcCi0JX19vdXR3YygodmFsKSwocG9ydCkpIDogXAotCV9fb3V0dygodmFsKSwocG9ydCkpKQotCi0jZGVmaW5lIGludyhwb3J0KSBcCi0oKF9fYnVpbHRpbl9jb25zdGFudF9wKChwb3J0KSkgJiYgKHBvcnQpIDwgMjU2KSA/IFwKLQlfX2lud2MocG9ydCkgOiBcCi0JX19pbncocG9ydCkpCi0KLSNkZWZpbmUgb3V0d19wKHZhbCxwb3J0KSBcCi0oKF9fYnVpbHRpbl9jb25zdGFudF9wKChwb3J0KSkgJiYgKHBvcnQpIDwgMjU2KSA/IFwKLQlfX291dHdjX3AoKHZhbCksKHBvcnQpKSA6IFwKLQlfX291dHdfcCgodmFsKSwocG9ydCkpKQotCi0jZGVmaW5lIGlud19wKHBvcnQpIFwKLSgoX19idWlsdGluX2NvbnN0YW50X3AoKHBvcnQpKSAmJiAocG9ydCkgPCAyNTYpID8gXAotCV9faW53Y19wKHBvcnQpIDogXAotCV9faW53X3AocG9ydCkpCi0KLSNkZWZpbmUgb3V0bCh2YWwscG9ydCkgXAotKChfX2J1aWx0aW5fY29uc3RhbnRfcCgocG9ydCkpICYmIChwb3J0KSA8IDI1NikgPyBcCi0JX19vdXRsYygodmFsKSwocG9ydCkpIDogXAotCV9fb3V0bCgodmFsKSwocG9ydCkpKQotCi0jZGVmaW5lIGlubChwb3J0KSBcCi0oKF9fYnVpbHRpbl9jb25zdGFudF9wKChwb3J0KSkgJiYgKHBvcnQpIDwgMjU2KSA/IFwKLQlfX2lubGMocG9ydCkgOiBcCi0JX19pbmwocG9ydCkpCi0KLSNkZWZpbmUgb3V0bF9wKHZhbCxwb3J0KSBcCi0oKF9fYnVpbHRpbl9jb25zdGFudF9wKChwb3J0KSkgJiYgKHBvcnQpIDwgMjU2KSA/IFwKLQlfX291dGxjX3AoKHZhbCksKHBvcnQpKSA6IFwKLQlfX291dGxfcCgodmFsKSwocG9ydCkpKQotCi0jZGVmaW5lIGlubF9wKHBvcnQpIFwKLSgoX19idWlsdGluX2NvbnN0YW50X3AoKHBvcnQpKSAmJiAocG9ydCkgPCAyNTYpID8gXAotCV9faW5sY19wKHBvcnQpIDogXAotCV9faW5sX3AocG9ydCkpCi0KLSNlbmRpZgpkaWZmIC1OYXVyIGdydWItMC45Ny5vcmlnL25ldGJvb3QvbGludXgtYXNtLXN0cmluZy5oIGdydWItMC45Ny9uZXRib290L2xpbnV4LWFzbS1zdHJpbmcuaAotLS0gZ3J1Yi0wLjk3Lm9yaWcvbmV0Ym9vdC9saW51eC1hc20tc3RyaW5nLmgJMjAwMy0wNy0wOSAxMTo0NTozNy4wMDAwMDAwMDAgKzAwMDAKKysrIGdydWItMC45Ny9uZXRib290L2xpbnV4LWFzbS1zdHJpbmcuaAkxOTcwLTAxLTAxIDAwOjAwOjAwLjAwMDAwMDAwMCArMDAwMApAQCAtMSwyOTEgKzAsMCBAQAotLyoKLSAqIFRha2VuIGZyb20gTGludXggL3Vzci9pbmNsdWRlL2FzbS9zdHJpbmcuaAotICogQWxsIGV4Y2VwdCBtZW1jcHksIG1lbW1vdmUsIG1lbXNldCBhbmQgbWVtY21wIHJlbW92ZWQuCi0gKi8KLQotI2lmbmRlZglfSTM4Nl9TVFJJTkdfSF8KLSNkZWZpbmUgX0kzODZfU1RSSU5HX0hfCi0KLS8qCi0gKiBUaGlzIHN0cmluZy1pbmNsdWRlIGRlZmluZXMgYWxsIHN0cmluZyBmdW5jdGlvbnMgYXMgaW5saW5lCi0gKiBmdW5jdGlvbnMuIFVzZSBnY2MuIEl0IGFsc28gYXNzdW1lcyBkcz1lcz1kYXRhIHNwYWNlLCB0aGlzIHNob3VsZCBiZQotICogbm9ybWFsLiBNb3N0IG9mIHRoZSBzdHJpbmctZnVuY3Rpb25zIGFyZSByYXRoZXIgaGVhdmlseSBoYW5kLW9wdGltaXplZCwKLSAqIHNlZSBlc3BlY2lhbGx5IHN0cnRvayxzdHJzdHIsc3RyW2Ndc3BuLiBUaGV5IHNob3VsZCB3b3JrLCBidXQgYXJlIG5vdAotICogdmVyeSBlYXN5IHRvIHVuZGVyc3RhbmQuIEV2ZXJ5dGhpbmcgaXMgZG9uZSBlbnRpcmVseSB3aXRoaW4gdGhlIHJlZ2lzdGVyCi0gKiBzZXQsIG1ha2luZyB0aGUgZnVuY3Rpb25zIGZhc3QgYW5kIGNsZWFuLiBTdHJpbmcgaW5zdHJ1Y3Rpb25zIGhhdmUgYmVlbgotICogdXNlZCB0aHJvdWdoLW91dCwgbWFraW5nIGZvciAic2xpZ2h0bHkiIHVuY2xlYXIgY29kZSA6LSkKLSAqCi0gKgkJTk8gQ29weXJpZ2h0IChDKSAxOTkxLCAxOTkyIExpbnVzIFRvcnZhbGRzLAotICoJCWNvbnNpZGVyIHRoZXNlIHRyaXZpYWwgZnVuY3Rpb25zIHRvIGJlIFBELgotICovCi0KLXR5cGVkZWYgaW50CXNpemVfdDsKLQotZXh0ZXJuIHZvaWQgKl9fbWVtY3B5KHZvaWQgKiB0bywgY29uc3Qgdm9pZCAqIGZyb20sIHNpemVfdCBuKTsKLWV4dGVybiB2b2lkICpfX2NvbnN0YW50X21lbWNweSh2b2lkICogdG8sIGNvbnN0IHZvaWQgKiBmcm9tLCBzaXplX3Qgbik7Ci1leHRlcm4gdm9pZCAqbWVtbW92ZSh2b2lkICogZGVzdCxjb25zdCB2b2lkICogc3JjLCBzaXplX3Qgbik7Ci1leHRlcm4gdm9pZCAqX19tZW1zZXRfZ2VuZXJpYyh2b2lkICogcywgY2hhciBjLHNpemVfdCBjb3VudCk7Ci1leHRlcm4gdm9pZCAqX19jb25zdGFudF9jX21lbXNldCh2b2lkICogcywgdW5zaWduZWQgbG9uZyBjLCBzaXplX3QgY291bnQpOwotZXh0ZXJuIHZvaWQgKl9fY29uc3RhbnRfY19hbmRfY291bnRfbWVtc2V0KHZvaWQgKiBzLCB1bnNpZ25lZCBsb25nIHBhdHRlcm4sIHNpemVfdCBjb3VudCk7Ci0KLQotZXh0ZXJuIGlubGluZSB2b2lkICogX19tZW1jcHkodm9pZCAqIHRvLCBjb25zdCB2b2lkICogZnJvbSwgc2l6ZV90IG4pCi17Ci1pbnQgZDAsIGQxLCBkMjsKLV9fYXNtX18gX192b2xhdGlsZV9fKAotCSJjbGRcblx0IgotCSJyZXAgOyBtb3ZzbFxuXHQiCi0JInRlc3RiICQyLCViNFxuXHQiCi0JImplIDFmXG5cdCIKLQkibW92c3dcbiIKLQkiMTpcdHRlc3RiICQxLCViNFxuXHQiCi0JImplIDJmXG5cdCIKLQkibW92c2JcbiIKLQkiMjoiCi0JOiAiPSZjIiAoZDApLCAiPSZEIiAoZDEpLCAiPSZTIiAoZDIpCi0JOiIwIiAobi80KSwgInEiIChuKSwiMSIgKChsb25nKSB0byksIjIiICgobG9uZykgZnJvbSkKLQk6ICJtZW1vcnkiKTsKLXJldHVybiAodG8pOwotfQotCi0vKgotICogVGhpcyBsb29rcyBob3JyaWJseSB1Z2x5LCBidXQgdGhlIGNvbXBpbGVyIGNhbiBvcHRpbWl6ZSBpdCB0b3RhbGx5LAotICogYXMgdGhlIGNvdW50IGlzIGNvbnN0YW50LgotICovCi1leHRlcm4gaW5saW5lIHZvaWQgKiBfX2NvbnN0YW50X21lbWNweSh2b2lkICogdG8sIGNvbnN0IHZvaWQgKiBmcm9tLCBzaXplX3QgbikKLXsKLQlzd2l0Y2ggKG4pIHsKLQkJY2FzZSAwOgotCQkJcmV0dXJuIHRvOwotCQljYXNlIDE6Ci0JCQkqKHVuc2lnbmVkIGNoYXIgKil0byA9ICooY29uc3QgdW5zaWduZWQgY2hhciAqKWZyb207Ci0JCQlyZXR1cm4gdG87Ci0JCWNhc2UgMjoKLQkJCSoodW5zaWduZWQgc2hvcnQgKil0byA9ICooY29uc3QgdW5zaWduZWQgc2hvcnQgKilmcm9tOwotCQkJcmV0dXJuIHRvOwotCQljYXNlIDM6Ci0JCQkqKHVuc2lnbmVkIHNob3J0ICopdG8gPSAqKGNvbnN0IHVuc2lnbmVkIHNob3J0ICopZnJvbTsKLQkJCSooMisodW5zaWduZWQgY2hhciAqKXRvKSA9ICooMisoY29uc3QgdW5zaWduZWQgY2hhciAqKWZyb20pOwotCQkJcmV0dXJuIHRvOwotCQljYXNlIDQ6Ci0JCQkqKHVuc2lnbmVkIGxvbmcgKil0byA9ICooY29uc3QgdW5zaWduZWQgbG9uZyAqKWZyb207Ci0JCQlyZXR1cm4gdG87Ci0JCWNhc2UgNjoJLyogZm9yIEV0aGVybmV0IGFkZHJlc3NlcyAqLwotCQkJKih1bnNpZ25lZCBsb25nICopdG8gPSAqKGNvbnN0IHVuc2lnbmVkIGxvbmcgKilmcm9tOwotCQkJKigyKyh1bnNpZ25lZCBzaG9ydCAqKXRvKSA9ICooMisoY29uc3QgdW5zaWduZWQgc2hvcnQgKilmcm9tKTsKLQkJCXJldHVybiB0bzsKLQkJY2FzZSA4OgotCQkJKih1bnNpZ25lZCBsb25nICopdG8gPSAqKGNvbnN0IHVuc2lnbmVkIGxvbmcgKilmcm9tOwotCQkJKigxKyh1bnNpZ25lZCBsb25nICopdG8pID0gKigxKyhjb25zdCB1bnNpZ25lZCBsb25nICopZnJvbSk7Ci0JCQlyZXR1cm4gdG87Ci0JCWNhc2UgMTI6Ci0JCQkqKHVuc2lnbmVkIGxvbmcgKil0byA9ICooY29uc3QgdW5zaWduZWQgbG9uZyAqKWZyb207Ci0JCQkqKDErKHVuc2lnbmVkIGxvbmcgKil0bykgPSAqKDErKGNvbnN0IHVuc2lnbmVkIGxvbmcgKilmcm9tKTsKLQkJCSooMisodW5zaWduZWQgbG9uZyAqKXRvKSA9ICooMisoY29uc3QgdW5zaWduZWQgbG9uZyAqKWZyb20pOwotCQkJcmV0dXJuIHRvOwotCQljYXNlIDE2OgotCQkJKih1bnNpZ25lZCBsb25nICopdG8gPSAqKGNvbnN0IHVuc2lnbmVkIGxvbmcgKilmcm9tOwotCQkJKigxKyh1bnNpZ25lZCBsb25nICopdG8pID0gKigxKyhjb25zdCB1bnNpZ25lZCBsb25nICopZnJvbSk7Ci0JCQkqKDIrKHVuc2lnbmVkIGxvbmcgKil0bykgPSAqKDIrKGNvbnN0IHVuc2lnbmVkIGxvbmcgKilmcm9tKTsKLQkJCSooMysodW5zaWduZWQgbG9uZyAqKXRvKSA9ICooMysoY29uc3QgdW5zaWduZWQgbG9uZyAqKWZyb20pOwotCQkJcmV0dXJuIHRvOwotCQljYXNlIDIwOgotCQkJKih1bnNpZ25lZCBsb25nICopdG8gPSAqKGNvbnN0IHVuc2lnbmVkIGxvbmcgKilmcm9tOwotCQkJKigxKyh1bnNpZ25lZCBsb25nICopdG8pID0gKigxKyhjb25zdCB1bnNpZ25lZCBsb25nICopZnJvbSk7Ci0JCQkqKDIrKHVuc2lnbmVkIGxvbmcgKil0bykgPSAqKDIrKGNvbnN0IHVuc2lnbmVkIGxvbmcgKilmcm9tKTsKLQkJCSooMysodW5zaWduZWQgbG9uZyAqKXRvKSA9ICooMysoY29uc3QgdW5zaWduZWQgbG9uZyAqKWZyb20pOwotCQkJKig0Kyh1bnNpZ25lZCBsb25nICopdG8pID0gKig0Kyhjb25zdCB1bnNpZ25lZCBsb25nICopZnJvbSk7Ci0JCQlyZXR1cm4gdG87Ci0JfQotI2RlZmluZSBDT01NT04oeCkgXAotX19hc21fXyBfX3ZvbGF0aWxlX18oIFwKLQkiY2xkXG5cdCIgXAotCSJyZXAgOyBtb3ZzbCIgXAotCXggXAotCTogIj0mYyIgKGQwKSwgIj0mRCIgKGQxKSwgIj0mUyIgKGQyKSBcCi0JOiAiMCIgKG4vNCksIjEiICgobG9uZykgdG8pLCIyIiAoKGxvbmcpIGZyb20pIFwKLQk6ICJtZW1vcnkiKTsKLXsKLQlpbnQgZDAsIGQxLCBkMjsKLQlzd2l0Y2ggKG4gJSA0KSB7Ci0JCWNhc2UgMDogQ09NTU9OKCIiKTsgcmV0dXJuIHRvOwotCQljYXNlIDE6IENPTU1PTigiXG5cdG1vdnNiIik7IHJldHVybiB0bzsKLQkJY2FzZSAyOiBDT01NT04oIlxuXHRtb3ZzdyIpOyByZXR1cm4gdG87Ci0JCWRlZmF1bHQ6IENPTU1PTigiXG5cdG1vdnN3XG5cdG1vdnNiIik7IHJldHVybiB0bzsKLQl9Ci19Ci0KLSN1bmRlZiBDT01NT04KLX0KLQotI2RlZmluZSBfX0hBVkVfQVJDSF9NRU1DUFkKLSNkZWZpbmUgbWVtY3B5KHQsIGYsIG4pIFwKLShfX2J1aWx0aW5fY29uc3RhbnRfcChuKSA/IFwKLSBfX2NvbnN0YW50X21lbWNweSgodCksKGYpLChuKSkgOiBcCi0gX19tZW1jcHkoKHQpLChmKSwobikpKQotCi0jZGVmaW5lIF9fSEFWRV9BUkNIX01FTU1PVkUKLWV4dGVybiBpbmxpbmUgdm9pZCAqIG1lbW1vdmUodm9pZCAqIGRlc3QsY29uc3Qgdm9pZCAqIHNyYywgc2l6ZV90IG4pCi17Ci1pbnQgZDAsIGQxLCBkMjsKLWlmIChkZXN0PHNyYykKLV9fYXNtX18gX192b2xhdGlsZV9fKAotCSJjbGRcblx0IgotCSJyZXBcblx0IgotCSJtb3ZzYiIKLQk6ICI9JmMiIChkMCksICI9JlMiIChkMSksICI9JkQiIChkMikKLQk6IjAiIChuKSwiMSIgKHNyYyksIjIiIChkZXN0KQotCTogIm1lbW9yeSIpOwotZWxzZQotX19hc21fXyBfX3ZvbGF0aWxlX18oCi0JInN0ZFxuXHQiCi0JInJlcFxuXHQiCi0JIm1vdnNiXG5cdCIKLQkiY2xkIgotCTogIj0mYyIgKGQwKSwgIj0mUyIgKGQxKSwgIj0mRCIgKGQyKQotCToiMCIgKG4pLAotCSAiMSIgKG4tMSsoY29uc3QgY2hhciAqKXNyYyksCi0JICIyIiAobi0xKyhjaGFyICopZGVzdCkKLQk6Im1lbW9yeSIpOwotcmV0dXJuIGRlc3Q7Ci19Ci0KLSNkZWZpbmUgbWVtY21wIF9fYnVpbHRpbl9tZW1jbXAKLQotZXh0ZXJuIGlubGluZSB2b2lkICogX19tZW1zZXRfZ2VuZXJpYyh2b2lkICogcywgY2hhciBjLHNpemVfdCBjb3VudCkKLXsKLWludCBkMCwgZDE7Ci1fX2FzbV9fIF9fdm9sYXRpbGVfXygKLQkiY2xkXG5cdCIKLQkicmVwXG5cdCIKLQkic3Rvc2IiCi0JOiAiPSZjIiAoZDApLCAiPSZEIiAoZDEpCi0JOiJhIiAoYyksIjEiIChzKSwiMCIgKGNvdW50KQotCToibWVtb3J5Iik7Ci1yZXR1cm4gczsKLX0KLQotLyogd2UgbWlnaHQgd2FudCB0byB3cml0ZSBvcHRpbWl6ZWQgdmVyc2lvbnMgb2YgdGhlc2UgbGF0ZXIgKi8KLSNkZWZpbmUgX19jb25zdGFudF9jb3VudF9tZW1zZXQocyxjLGNvdW50KSBfX21lbXNldF9nZW5lcmljKChzKSwoYyksKGNvdW50KSkKLQotLyoKLSAqIG1lbXNldCh4LDAseSkgaXMgYSByZWFzb25hYmx5IGNvbW1vbiB0aGluZyB0byBkbywgc28gd2Ugd2FudCB0byBmaWxsCi0gKiB0aGluZ3MgMzIgYml0cyBhdCBhIHRpbWUgZXZlbiB3aGVuIHdlIGRvbid0IGtub3cgdGhlIHNpemUgb2YgdGhlCi0gKiBhcmVhIGF0IGNvbXBpbGUtdGltZS4uCi0gKi8KLWV4dGVybiBpbmxpbmUgdm9pZCAqIF9fY29uc3RhbnRfY19tZW1zZXQodm9pZCAqIHMsIHVuc2lnbmVkIGxvbmcgYywgc2l6ZV90IGNvdW50KQotewotaW50IGQwLCBkMTsKLV9fYXNtX18gX192b2xhdGlsZV9fKAotCSJjbGRcblx0IgotCSJyZXAgOyBzdG9zbFxuXHQiCi0JInRlc3RiICQyLCViM1xuXHQiCi0JImplIDFmXG5cdCIKLQkic3Rvc3dcbiIKLQkiMTpcdHRlc3RiICQxLCViM1xuXHQiCi0JImplIDJmXG5cdCIKLQkic3Rvc2JcbiIKLQkiMjoiCi0JOiAiPSZjIiAoZDApLCAiPSZEIiAoZDEpCi0JOiJhIiAoYyksICJxIiAoY291bnQpLCAiMCIgKGNvdW50LzQpLCAiMSIgKChsb25nKSBzKQotCToibWVtb3J5Iik7Ci1yZXR1cm4gKHMpOwotfQotCi0vKgotICogVGhpcyBsb29rcyBob3JyaWJseSB1Z2x5LCBidXQgdGhlIGNvbXBpbGVyIGNhbiBvcHRpbWl6ZSBpdCB0b3RhbGx5LAotICogYXMgd2UgYnkgbm93IGtub3cgdGhhdCBib3RoIHBhdHRlcm4gYW5kIGNvdW50IGlzIGNvbnN0YW50Li4KLSAqLwotZXh0ZXJuIGlubGluZSB2b2lkICogX19jb25zdGFudF9jX2FuZF9jb3VudF9tZW1zZXQodm9pZCAqIHMsIHVuc2lnbmVkIGxvbmcgcGF0dGVybiwgc2l6ZV90IGNvdW50KQotewotCXN3aXRjaCAoY291bnQpIHsKLQkJY2FzZSAwOgotCQkJcmV0dXJuIHM7Ci0JCWNhc2UgMToKLQkJCSoodW5zaWduZWQgY2hhciAqKXMgPSBwYXR0ZXJuOwotCQkJcmV0dXJuIHM7Ci0JCWNhc2UgMjoKLQkJCSoodW5zaWduZWQgc2hvcnQgKilzID0gcGF0dGVybjsKLQkJCXJldHVybiBzOwotCQljYXNlIDM6Ci0JCQkqKHVuc2lnbmVkIHNob3J0ICopcyA9IHBhdHRlcm47Ci0JCQkqKDIrKHVuc2lnbmVkIGNoYXIgKilzKSA9IHBhdHRlcm47Ci0JCQlyZXR1cm4gczsKLQkJY2FzZSA0OgotCQkJKih1bnNpZ25lZCBsb25nICopcyA9IHBhdHRlcm47Ci0JCQlyZXR1cm4gczsKLQl9Ci0jZGVmaW5lIENPTU1PTih4KSBcCi1fX2FzbV9fICBfX3ZvbGF0aWxlX18oImNsZFxuXHQiIFwKLQkicmVwIDsgc3Rvc2wiIFwKLQl4IFwKLQk6ICI9JmMiIChkMCksICI9JkQiIChkMSkgXAotCTogImEiIChwYXR0ZXJuKSwiMCIgKGNvdW50LzQpLCIxIiAoKGxvbmcpIHMpIFwKLQk6ICJtZW1vcnkiKQotewotCWludCBkMCwgZDE7Ci0Jc3dpdGNoIChjb3VudCAlIDQpIHsKLQkJY2FzZSAwOiBDT01NT04oIiIpOyByZXR1cm4gczsKLQkJY2FzZSAxOiBDT01NT04oIlxuXHRzdG9zYiIpOyByZXR1cm4gczsKLQkJY2FzZSAyOiBDT01NT04oIlxuXHRzdG9zdyIpOyByZXR1cm4gczsKLQkJZGVmYXVsdDogQ09NTU9OKCJcblx0c3Rvc3dcblx0c3Rvc2IiKTsgcmV0dXJuIHM7Ci0JfQotfQotCi0jdW5kZWYgQ09NTU9OCi19Ci0KLSNkZWZpbmUgX19jb25zdGFudF9jX3hfbWVtc2V0KHMsIGMsIGNvdW50KSBcCi0oX19idWlsdGluX2NvbnN0YW50X3AoY291bnQpID8gXAotIF9fY29uc3RhbnRfY19hbmRfY291bnRfbWVtc2V0KChzKSwoYyksKGNvdW50KSkgOiBcCi0gX19jb25zdGFudF9jX21lbXNldCgocyksKGMpLChjb3VudCkpKQotCi0jZGVmaW5lIF9fbWVtc2V0KHMsIGMsIGNvdW50KSBcCi0oX19idWlsdGluX2NvbnN0YW50X3AoY291bnQpID8gXAotIF9fY29uc3RhbnRfY291bnRfbWVtc2V0KChzKSwoYyksKGNvdW50KSkgOiBcCi0gX19tZW1zZXRfZ2VuZXJpYygocyksKGMpLChjb3VudCkpKQotCi0jZGVmaW5lIF9fSEFWRV9BUkNIX01FTVNFVAotI2RlZmluZSBtZW1zZXQocywgYywgY291bnQpIFwKLShfX2J1aWx0aW5fY29uc3RhbnRfcChjKSA/IFwKLSBfX2NvbnN0YW50X2NfeF9tZW1zZXQoKHMpLChjKSwoY291bnQpKSA6IFwKLSBfX21lbXNldCgocyksKGMpLChjb3VudCkpKQotCi0jZGVmaW5lIF9fSEFWRV9BUkNIX1NUUk5DTVAKLXN0YXRpYyBpbmxpbmUgaW50IHN0cm5jbXAoY29uc3QgY2hhciAqIGNzLGNvbnN0IGNoYXIgKiBjdCxzaXplX3QgY291bnQpCi17Ci1yZWdpc3RlciBpbnQgX19yZXM7Ci1pbnQgZDAsIGQxLCBkMjsKLV9fYXNtX18gX192b2xhdGlsZV9fKAotCSIxOlx0ZGVjbCAlM1xuXHQiCi0JImpzIDJmXG5cdCIKLQkibG9kc2Jcblx0IgotCSJzY2FzYlxuXHQiCi0JImpuZSAzZlxuXHQiCi0JInRlc3RiICUlYWwsJSVhbFxuXHQiCi0JImpuZSAxYlxuIgotCSIyOlx0eG9ybCAlJWVheCwlJWVheFxuXHQiCi0JImptcCA0ZlxuIgotCSIzOlx0c2JibCAlJWVheCwlJWVheFxuXHQiCi0JIm9yYiAkMSwlJWFsXG4iCi0JIjQ6IgotCQkgICAgIDoiPWEiIChfX3JlcyksICI9JlMiIChkMCksICI9JkQiIChkMSksICI9JmMiIChkMikKLQkJICAgICA6IjEiIChjcyksIjIiIChjdCksIjMiIChjb3VudCkpOwotcmV0dXJuIF9fcmVzOwotfQotCi0jZGVmaW5lIF9fSEFWRV9BUkNIX1NUUkxFTgotc3RhdGljIGlubGluZSBzaXplX3Qgc3RybGVuKGNvbnN0IGNoYXIgKiBzKQotewotaW50IGQwOwotcmVnaXN0ZXIgaW50IF9fcmVzOwotX19hc21fXyBfX3ZvbGF0aWxlX18oCi0JInJlcG5lXG5cdCIKLQkic2Nhc2Jcblx0IgotCSJub3RsICUwXG5cdCIKLQkiZGVjbCAlMCIKLQk6Ij1jIiAoX19yZXMpLCAiPSZEIiAoZDApIDoiMSIgKHMpLCJhIiAoMCksICIwIiAoMHhmZmZmZmZmZikpOwotcmV0dXJuIF9fcmVzOwotfQotCi0jZW5kaWYKZGlmZiAtTmF1ciBncnViLTAuOTcub3JpZy9uZXRib290L2xpdHRsZV9ic3dhcC5oIGdydWItMC45Ny9uZXRib290L2xpdHRsZV9ic3dhcC5oCi0tLSBncnViLTAuOTcub3JpZy9uZXRib290L2xpdHRsZV9ic3dhcC5oCTE5NzAtMDEtMDEgMDA6MDA6MDAuMDAwMDAwMDAwICswMDAwCisrKyBncnViLTAuOTcvbmV0Ym9vdC9saXR0bGVfYnN3YXAuaAkyMDA1LTA4LTMxIDE5OjAzOjM1LjAwMDAwMDAwMCArMDAwMApAQCAtMCwwICsxLDE3IEBACisjaWZuZGVmIEVUSEVSQk9PVF9MSVRUTEVfQlNXQVBfSAorI2RlZmluZSBFVEhFUkJPT1RfTElUVExFX0JTV0FQX0gKKworI2RlZmluZSBudG9obCh4KQlfX2Jzd2FwXzMyKHgpCisjZGVmaW5lIGh0b25sKHgpIAlfX2Jzd2FwXzMyKHgpCisjZGVmaW5lIG50b2hzKHgpIAlfX2Jzd2FwXzE2KHgpCisjZGVmaW5lIGh0b25zKHgpIAlfX2Jzd2FwXzE2KHgpCisjZGVmaW5lIGNwdV90b19sZTMyKHgpCSh4KQorI2RlZmluZSBjcHVfdG9fbGUxNih4KQkoeCkKKyNkZWZpbmUgY3B1X3RvX2JlMzIoeCkJX19ic3dhcF8zMih4KQorI2RlZmluZSBjcHVfdG9fYmUxNih4KQlfX2Jzd2FwXzE2KHgpCisjZGVmaW5lIGxlMzJfdG9fY3B1KHgpCSh4KQorI2RlZmluZSBsZTE2X3RvX2NwdSh4KQkoeCkKKyNkZWZpbmUgYmUzMl90b19jcHUoeCkJX19ic3dhcF8zMih4KQorI2RlZmluZSBiZTE2X3RvX2NwdSh4KQlfX2Jzd2FwXzE2KHgpCisKKyNlbmRpZiAvKiBFVEhFUkJPT1RfTElUVExFX0JTV0FQX0ggKi8KZGlmZiAtTmF1ciBncnViLTAuOTcub3JpZy9uZXRib290L21haW4uYyBncnViLTAuOTcvbmV0Ym9vdC9tYWluLmMKLS0tIGdydWItMC45Ny5vcmlnL25ldGJvb3QvbWFpbi5jCTIwMDQtMDUtMjAgMjI6MTk6MzMuMDAwMDAwMDAwICswMDAwCisrKyBncnViLTAuOTcvbmV0Ym9vdC9tYWluLmMJMTk3MC0wMS0wMSAwMDowMDowMC4wMDAwMDAwMDAgKzAwMDAKQEAgLTEsMTE3MSArMCwwIEBACi0vKgotICogIEdSVUIgIC0tICBHUmFuZCBVbmlmaWVkIEJvb3Rsb2FkZXIKLSAqICBDb3B5cmlnaHQgKEMpIDIwMDAsMjAwMSwyMDAyICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAqCi0gKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gKiAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgotICovCi0KLS8qIEJhc2VkIG9uICJzcmMvbWFpbi5jIiBpbiBldGhlcmJvb3QtNS4wLjUuICAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLUVUSEVSQk9PVCAtICBCT09UUC9URlRQIEJvb3RzdHJhcCBQcm9ncmFtCi0KLUF1dGhvcjogTWFydGluIFJlbnRlcnMKLSAgRGF0ZTogRGVjLzkzCi0gIAotTGl0ZXJhdHVyZSBkZWFsaW5nIHdpdGggdGhlIG5ldHdvcmsgcHJvdG9jb2xzOgotICAgICAgIEFSUCAtIFJGQzgyNgotICAgICAgIFJBUlAgLSBSRkM5MDMKLSAgICAgICBVRFAgLSBSRkM3NjgKLSAgICAgICBCT09UUCAtIFJGQzk1MSwgUkZDMjEzMiAodmVuZG9yIGV4dGVuc2lvbnMpCi0gICAgICAgREhDUCAtIFJGQzIxMzEsIFJGQzIxMzIgKG9wdGlvbnMpCi0gICAgICAgVEZUUCAtIFJGQzEzNTAsIFJGQzIzNDcgKG9wdGlvbnMpLCBSRkMyMzQ4IChibG9ja3NpemUpLCBSRkMyMzQ5ICh0c2l6ZSkKLSAgICAgICBSUEMgLSBSRkMxODMxLCBSRkMxODMyIChYRFIpLCBSRkMxODMzIChycGNiaW5kL3BvcnRtYXBwZXIpCi0gICAgICAgTkZTIC0gUkZDMTA5NCwgUkZDMTgxMyAodjMsIHVzZWZ1bCBmb3IgY2xhcmlmaWNhdGlvbnMsIG5vdCBpbXBsZW1lbnRlZCkKLQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNkZWZpbmUgR1JVQgkxCi0jaW5jbHVkZSA8ZXRoZXJib290Lmg+Ci0jaW5jbHVkZSA8bmljLmg+Ci0KLS8qICNkZWZpbmUgREVCVUcJMSAqLwotCi1zdHJ1Y3QgYXJwdGFibGVfdCBhcnB0YWJsZVtNQVhfQVJQXTsKLQotLyogU2V0IGlmIHRoZSB1c2VyIHB1c2hlcyBDb250cm9sLUMuICAqLwotaW50IGlwX2Fib3J0ID0gMDsKLS8qIFNldCBpZiBhbiBldGhlcm5ldCBjYXJkIGlzIHByb2JlZCBhbmQgSVAgYWRkcmVzc2VzIGFyZSBzZXQuICAqLwotaW50IG5ldHdvcmtfcmVhZHkgPSAwOwotCi1zdHJ1Y3Qgcm9tX2luZm8gcm9tOwotCi1zdGF0aWMgaW50IHZlbmRvcmV4dF9pc3ZhbGlkOwotc3RhdGljIHVuc2lnbmVkIGxvbmcgbmV0bWFzazsKLXN0YXRpYyBzdHJ1Y3QgYm9vdHBkX3QgYm9vdHBfZGF0YTsKLXN0YXRpYyB1bnNpZ25lZCBsb25nIHhpZDsKLXN0YXRpYyB1bnNpZ25lZCBjaGFyICplbmRfb2ZfcmZjMTUzMyA9IE5VTEw7Ci0KLSNpZm5kZWYJTk9fREhDUF9TVVBQT1JUCi0jZW5kaWYgLyogTk9fREhDUF9TVVBQT1JUICovCi0KLS8qIORFdGggKi8KLXN0YXRpYyB1bnNpZ25lZCBjaGFyIHZlbmRvcmV4dF9tYWdpY1tdID0gezB4RTQsIDB4NDUsIDB4NzQsIDB4Njh9Owotc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgYnJvYWRjYXN0W10gPSB7MHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRn07Ci0KLSNpZmRlZglOT19ESENQX1NVUFBPUlQKLQotc3RhdGljIHVuc2lnbmVkIGNoYXIgcmZjMTUzM19jb29raWVbNV0gPSB7UkZDMTUzM19DT09LSUUsIFJGQzE1MzNfRU5EfTsKLQotI2Vsc2UgLyogISBOT19ESENQX1NVUFBPUlQgKi8KLQotc3RhdGljIGludCBkaGNwX3JlcGx5Owotc3RhdGljIGluX2FkZHIgZGhjcF9zZXJ2ZXIgPSB7MEx9Owotc3RhdGljIGluX2FkZHIgZGhjcF9hZGRyID0gezBMfTsKLXN0YXRpYyB1bnNpZ25lZCBjaGFyIHJmYzE1MzNfY29va2llW10gPSB7UkZDMTUzM19DT09LSUV9Owotc3RhdGljIHVuc2lnbmVkIGNoYXIgcmZjMTUzM19lbmRbXSA9IHtSRkMxNTMzX0VORH07Ci0KLXN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIGRoY3BkaXNjb3ZlcltdID0KLXsKLSAgUkZDMjEzMl9NU0dfVFlQRSwgMSwgREhDUERJU0NPVkVSLAkKLSAgUkZDMjEzMl9NQVhfU0laRSwyLAkvKiByZXF1ZXN0IGFzIG11Y2ggYXMgd2UgY2FuICovCi0gIEVUSF9NQVhfTVRVIC8gMjU2LCBFVEhfTUFYX01UVSAlIDI1NiwKLSAgUkZDMjEzMl9QQVJBTV9MSVNULCA0LCBSRkMxNTMzX05FVE1BU0ssIFJGQzE1MzNfR0FURVdBWSwKLSAgUkZDMTUzM19IT1NUTkFNRSwgUkZDMTUzM19FWFRFTlNJT05QQVRICi19OwotCi1zdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBkaGNwcmVxdWVzdFtdID0KLXsKLSAgUkZDMjEzMl9NU0dfVFlQRSwgMSwgREhDUFJFUVVFU1QsCi0gIFJGQzIxMzJfU1JWX0lELCA0LCAwLCAwLCAwLCAwLAotICBSRkMyMTMyX1JFUV9BRERSLCA0LCAwLCAwLCAwLCAwLAotICBSRkMyMTMyX01BWF9TSVpFLCAyLAkvKiByZXF1ZXN0IGFzIG11Y2ggYXMgd2UgY2FuICovCi0gIEVUSF9NQVhfTVRVIC8gMjU2LCBFVEhfTUFYX01UVSAlIDI1NiwKLSAgLyogcmVxdWVzdCBwYXJhbWV0ZXJzICovCi0gIFJGQzIxMzJfUEFSQU1fTElTVCwKLSAgLyogNCBzdGFuZGFyZCArIDIgdmVuZG9ydGFncyAqLwotICA0ICsgMiwKLSAgLyogU3RhbmRhcmQgcGFyYW1ldGVycyAqLwotICBSRkMxNTMzX05FVE1BU0ssIFJGQzE1MzNfR0FURVdBWSwKLSAgUkZDMTUzM19IT1NUTkFNRSwgUkZDMTUzM19FWFRFTlNJT05QQVRILAotICAvKiBFdGhlcmJvb3QgdmVuZG9ydGFncyAqLwotICBSRkMxNTMzX1ZFTkRPUl9NQUdJQywKLSAgUkZDMTUzM19WRU5ET1JfQ09ORklHRklMRSwKLX07Ci0KLSNlbmRpZiAvKiAhIE5PX0RIQ1BfU1VQUE9SVCAqLwotCi1zdGF0aWMgdW5zaWduZWQgc2hvcnQgaXBjaGtzdW0gKHVuc2lnbmVkIHNob3J0ICppcCwgaW50IGxlbik7Ci1zdGF0aWMgdW5zaWduZWQgc2hvcnQgdWRwY2hrc3VtIChzdHJ1Y3QgaXBoZHIgKnBhY2tldCk7Ci0KLXZvaWQKLXByaW50X25ldHdvcmtfY29uZmlndXJhdGlvbiAodm9pZCkKLXsKLSAgaWYgKCEgZXRoX3Byb2JlICgpKQotICAgIGdydWJfcHJpbnRmICgiTm8gZXRoZXJuZXQgY2FyZCBmb3VuZC5cbiIpOwotICBlbHNlIGlmICghIG5ldHdvcmtfcmVhZHkpCi0gICAgZ3J1Yl9wcmludGYgKCJOb3QgaW5pdGlhbGl6ZWQgeWV0LlxuIik7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBldGhlcmJvb3RfcHJpbnRmICgiQWRkcmVzczogJUBcbiIsIGFycHRhYmxlW0FSUF9DTElFTlRdLmlwYWRkci5zX2FkZHIpOwotICAgICAgZXRoZXJib290X3ByaW50ZiAoIk5ldG1hc2s6ICVAXG4iLCBuZXRtYXNrKTsKLSAgICAgIGV0aGVyYm9vdF9wcmludGYgKCJTZXJ2ZXI6ICVAXG4iLCBhcnB0YWJsZVtBUlBfU0VSVkVSXS5pcGFkZHIuc19hZGRyKTsKLSAgICAgIGV0aGVyYm9vdF9wcmludGYgKCJHYXRld2F5OiAlQFxuIiwgYXJwdGFibGVbQVJQX0dBVEVXQVldLmlwYWRkci5zX2FkZHIpOwotICAgIH0KLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLURFRkFVTFRfTkVUTUFTSyAtIFJldHVybiBkZWZhdWx0IG5ldG1hc2sgZm9yIElQIGFkZHJlc3MKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIAotZGVmYXVsdF9uZXRtYXNrICh2b2lkKQotewotICBpbnQgbmV0ID0gbnRvaGwgKGFycHRhYmxlW0FSUF9DTElFTlRdLmlwYWRkci5zX2FkZHIpID4+IDI0OwotICBpZiAobmV0IDw9IDEyNykKLSAgICByZXR1cm4gKGh0b25sICgweGZmMDAwMDAwKSk7Ci0gIGVsc2UgaWYgKG5ldCA8IDE5MikKLSAgICByZXR1cm4gKGh0b25sICgweGZmZmYwMDAwKSk7Ci0gIGVsc2UKLSAgICByZXR1cm4gKGh0b25sICgweGZmZmZmZjAwKSk7Ci19Ci0KLS8qIGlmY29uZmlnIC0gY29uZmlndXJlIG5ldHdvcmsgaW50ZXJmYWNlLiAgKi8KLWludAotaWZjb25maWcgKGNoYXIgKmlwLCBjaGFyICpzbSwgY2hhciAqZ3csIGNoYXIgKnN2cikKLXsKLSAgaW5fYWRkciB0bXA7Ci0gIAotICBpZiAoc20pIAotICAgIHsKLSAgICAgIGlmICghIGluZXRfYXRvbiAoc20sICZ0bXApKQotCXJldHVybiAwOwotICAgICAgCi0gICAgICBuZXRtYXNrID0gdG1wLnNfYWRkcjsKLSAgICB9Ci0gIAotICBpZiAoaXApIAotICAgIHsKLSAgICAgIGlmICghIGluZXRfYXRvbiAoaXAsICZhcnB0YWJsZVtBUlBfQ0xJRU5UXS5pcGFkZHIpKSAKLQlyZXR1cm4gMDsKLSAgICAgIAotICAgICAgaWYgKCEgbmV0bWFzayAmJiAhIHNtKSAKLQluZXRtYXNrID0gZGVmYXVsdF9uZXRtYXNrICgpOwotICAgIH0KLSAgCi0gIGlmIChndyAmJiAhIGluZXRfYXRvbiAoZ3csICZhcnB0YWJsZVtBUlBfR0FURVdBWV0uaXBhZGRyKSkgCi0gICAgcmV0dXJuIDA7Ci0KLSAgLyogQ2xlYXIgb3V0IHRoZSBBUlAgZW50cnkuICAqLwotICBncnViX21lbXNldCAoYXJwdGFibGVbQVJQX0dBVEVXQVldLm5vZGUsIDAsIEVUSF9BTEVOKTsKLSAgCi0gIGlmIChzdnIgJiYgISBpbmV0X2F0b24gKHN2ciwgJmFycHRhYmxlW0FSUF9TRVJWRVJdLmlwYWRkcikpIAotICAgIHJldHVybiAwOwotCi0gIC8qIExpa2V3aXNlLiAgKi8KLSAgZ3J1Yl9tZW1zZXQgKGFycHRhYmxlW0FSUF9TRVJWRVJdLm5vZGUsIDAsIEVUSF9BTEVOKTsKLSAgCi0gIGlmIChpcCB8fCBzbSkKLSAgICB7Ci0gICAgICBpZiAoSVBfQlJPQURDQVNUID09IChuZXRtYXNrIHwgYXJwdGFibGVbQVJQX0NMSUVOVF0uaXBhZGRyLnNfYWRkcikKLQkgIHx8IG5ldG1hc2sgPT0gKG5ldG1hc2sgfCBhcnB0YWJsZVtBUlBfQ0xJRU5UXS5pcGFkZHIuc19hZGRyKQotCSAgfHwgISBuZXRtYXNrKQotCW5ldHdvcmtfcmVhZHkgPSAwOwotICAgICAgZWxzZQotCW5ldHdvcmtfcmVhZHkgPSAxOwotICAgIH0KLSAgCi0gIHJldHVybiAxOwotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotVURQX1RSQU5TTUlUIC0gU2VuZCBhIFVEUCBkYXRhZ3JhbQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pbnQgCi11ZHBfdHJhbnNtaXQgKHVuc2lnbmVkIGxvbmcgZGVzdGlwLCB1bnNpZ25lZCBpbnQgc3Jjc29jaywKLQkgICAgICB1bnNpZ25lZCBpbnQgZGVzdHNvY2ssIGludCBsZW4sIGNvbnN0IHZvaWQgKmJ1ZikKLXsKLSAgc3RydWN0IGlwaGRyICppcDsKLSAgc3RydWN0IHVkcGhkciAqdWRwOwotICBzdHJ1Y3QgYXJwcmVxdWVzdCBhcnByZXE7Ci0gIGludCBhcnBlbnRyeSwgaTsKLSAgaW50IHJldHJ5OwotCi0gIGlwID0gKHN0cnVjdCBpcGhkciAqKSBidWY7Ci0gIHVkcCA9IChzdHJ1Y3QgdWRwaGRyICopICgodW5zaWduZWQgbG9uZykgYnVmICsgc2l6ZW9mIChzdHJ1Y3QgaXBoZHIpKTsKLSAgaXAtPnZlcmhkcmxlbiA9IDB4NDU7Ci0gIGlwLT5zZXJ2aWNlID0gMDsKLSAgaXAtPmxlbiA9IGh0b25zIChsZW4pOwotICBpcC0+aWRlbnQgPSAwOwotICBpcC0+ZnJhZ3MgPSAwOwotICBpcC0+dHRsID0gNjA7Ci0gIGlwLT5wcm90b2NvbCA9IElQX1VEUDsKLSAgaXAtPmNoa3N1bSA9IDA7Ci0gIGlwLT5zcmMuc19hZGRyID0gYXJwdGFibGVbQVJQX0NMSUVOVF0uaXBhZGRyLnNfYWRkcjsKLSAgaXAtPmRlc3Quc19hZGRyID0gZGVzdGlwOwotICBpcC0+Y2hrc3VtID0gaXBjaGtzdW0gKCh1bnNpZ25lZCBzaG9ydCAqKSBidWYsIHNpemVvZiAoc3RydWN0IGlwaGRyKSk7Ci0gIHVkcC0+c3JjID0gaHRvbnMgKHNyY3NvY2spOwotICB1ZHAtPmRlc3QgPSBodG9ucyAoZGVzdHNvY2spOwotICB1ZHAtPmxlbiA9IGh0b25zIChsZW4gLSBzaXplb2YgKHN0cnVjdCBpcGhkcikpOwotICB1ZHAtPmNoa3N1bSA9IDA7Ci0gIHVkcC0+Y2hrc3VtID0gaHRvbnMgKHVkcGNoa3N1bSAoaXApKTsKLQotICBpZiAodWRwLT5jaGtzdW0gPT0gMCkKLSAgICB1ZHAtPmNoa3N1bSA9IDB4ZmZmZjsKLSAgCi0gIGlmIChkZXN0aXAgPT0gSVBfQlJPQURDQVNUKQotICAgIHsKLSAgICAgIGV0aF90cmFuc21pdCAoYnJvYWRjYXN0LCBJUCwgbGVuLCBidWYpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGlmICgoKGRlc3RpcCAmIG5ldG1hc2spCi0JICAgIT0gKGFycHRhYmxlW0FSUF9DTElFTlRdLmlwYWRkci5zX2FkZHIgJiBuZXRtYXNrKSkKLQkgICYmIGFycHRhYmxlW0FSUF9HQVRFV0FZXS5pcGFkZHIuc19hZGRyKQotCWRlc3RpcCA9IGFycHRhYmxlW0FSUF9HQVRFV0FZXS5pcGFkZHIuc19hZGRyOwotICAgICAgCi0gICAgICBmb3IgKGFycGVudHJ5ID0gMDsgYXJwZW50cnkgPCBNQVhfQVJQOyBhcnBlbnRyeSsrKQotCWlmIChhcnB0YWJsZVthcnBlbnRyeV0uaXBhZGRyLnNfYWRkciA9PSBkZXN0aXApCi0JICBicmVhazsKLSAgICAgIAotICAgICAgaWYgKGFycGVudHJ5ID09IE1BWF9BUlApCi0JewotCSAgZXRoZXJib290X3ByaW50ZiAoIiVAIGlzIG5vdCBpbiBteSBhcnAgdGFibGUhXG4iLCBkZXN0aXApOwotCSAgcmV0dXJuIDA7Ci0JfQotICAgICAgCi0gICAgICBmb3IgKGkgPSAwOyBpIDwgRVRIX0FMRU47IGkrKykKLQlpZiAoYXJwdGFibGVbYXJwZW50cnldLm5vZGVbaV0pCi0JICBicmVhazsKLSAgICAgIAotICAgICAgaWYgKGkgPT0gRVRIX0FMRU4pCi0JewotCSAgLyogTmVlZCB0byBkbyBhcnAgcmVxdWVzdC4gICovCi0jaWZkZWYgREVCVUcKLQkgIGdydWJfcHJpbnRmICgiYXJwIHJlcXVlc3QuXG4iKTsKLSNlbmRpZgotCSAgYXJwcmVxLmh3dHlwZSA9IGh0b25zICgxKTsKLQkgIGFycHJlcS5wcm90b2NvbCA9IGh0b25zIChJUCk7Ci0JICBhcnByZXEuaHdsZW4gPSBFVEhfQUxFTjsKLQkgIGFycHJlcS5wcm90b2xlbiA9IDQ7Ci0JICBhcnByZXEub3Bjb2RlID0gaHRvbnMgKEFSUF9SRVFVRVNUKTsKLQkgIGdydWJfbWVtbW92ZSAoYXJwcmVxLnNod2FkZHIsIGFycHRhYmxlW0FSUF9DTElFTlRdLm5vZGUsCi0JCQlFVEhfQUxFTik7Ci0JICBncnViX21lbW1vdmUgKGFycHJlcS5zaXBhZGRyLCAoY2hhciAqKSAmYXJwdGFibGVbQVJQX0NMSUVOVF0uaXBhZGRyLAotCQkJc2l6ZW9mIChpbl9hZGRyKSk7Ci0JICBncnViX21lbXNldCAoYXJwcmVxLnRod2FkZHIsIDAsIEVUSF9BTEVOKTsKLQkgIGdydWJfbWVtbW92ZSAoYXJwcmVxLnRpcGFkZHIsIChjaGFyICopICZkZXN0aXAsIHNpemVvZiAoaW5fYWRkcikpOwotCSAgCi0JICBmb3IgKHJldHJ5ID0gMTsgcmV0cnkgPD0gTUFYX0FSUF9SRVRSSUVTOyByZXRyeSsrKQotCSAgICB7Ci0JICAgICAgbG9uZyB0aW1lb3V0OwotCSAgICAgIAotCSAgICAgIGV0aF90cmFuc21pdCAoYnJvYWRjYXN0LCBBUlAsIHNpemVvZiAoYXJwcmVxKSwgJmFycHJlcSk7Ci0JICAgICAgdGltZW91dCA9IHJmYzIxMzFfc2xlZXBfaW50ZXJ2YWwgKFRJTUVPVVQsIHJldHJ5KTsKLQkgICAgICAKLQkgICAgICBpZiAoYXdhaXRfcmVwbHkgKEFXQUlUX0FSUCwgYXJwZW50cnksIGFycHJlcS50aXBhZGRyLCB0aW1lb3V0KSkKLQkJZ290byB4bWl0OwotCi0JICAgICAgaWYgKGlwX2Fib3J0KQotCQlyZXR1cm4gMDsKLQkgICAgfQotCSAgCi0JICByZXR1cm4gMDsKLQl9Ci0gICAgICAKLSAgICB4bWl0OgotICAgICAgZXRoX3RyYW5zbWl0IChhcnB0YWJsZVthcnBlbnRyeV0ubm9kZSwgSVAsIGxlbiwgYnVmKTsKLSAgICB9Ci0gIAotICByZXR1cm4gMTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1URlRQIC0gRG93bmxvYWQgZXh0ZW5kZWQgQk9PVFAgZGF0YSwgb3Iga2VybmVsIGltYWdlCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBpbnQKLXRmdHAgKGNvbnN0IGNoYXIgKm5hbWUsIGludCAoKmZuYykgKHVuc2lnbmVkIGNoYXIgKiwgaW50LCBpbnQsIGludCkpCi17Ci0gIGludCByZXRyeSA9IDA7Ci0gIHN0YXRpYyB1bnNpZ25lZCBzaG9ydCBpcG9ydCA9IDIwMDA7Ci0gIHVuc2lnbmVkIHNob3J0IG9wb3J0ID0gMDsKLSAgdW5zaWduZWQgc2hvcnQgbGVuLCBibG9jayA9IDAsIHByZXZibG9jayA9IDA7Ci0gIGludCBiY291bnRlciA9IDA7Ci0gIHN0cnVjdCB0ZnRwX3QgKnRyOwotICBzdHJ1Y3QgdGZ0cHJlcV90IHRwOwotICBpbnQgcmM7Ci0gIGludCBwYWNrZXRzaXplID0gVEZUUF9ERUZBVUxUU0laRV9QQUNLRVQ7Ci0gIAotICAvKiBDbGVhciBvdXQgdGhlIFJ4IHF1ZXVlIGZpcnN0LiAgSXQgY29udGFpbnMgbm90aGluZyBvZiBpbnRlcmVzdCwKLSAgICogZXhjZXB0IHBvc3NpYmx5IEFSUCByZXF1ZXN0cyBmcm9tIHRoZSBESENQL1RGVFAgc2VydmVyLiAgV2UgdXNlCi0gICAqIHBvbGxpbmcgdGhyb3VnaG91dCBFdGhlcmJvb3QsIHNvIHNvbWUgdGltZSBtYXkgaGF2ZSBwYXNzZWQgc2luY2Ugd2UKLSAgICogbGFzdCBwb2xsZWQgdGhlIHJlY2VpdmUgcXVldWUsIHdoaWNoIG1heSBub3cgYmUgZmlsbGVkIHdpdGgKLSAgICogYnJvYWRjYXN0IHBhY2tldHMuICBUaGlzIHdpbGwgY2F1c2UgdGhlIHJlcGx5IHRvIHRoZSBwYWNrZXRzIHdlIGFyZQotICAgKiBhYm91dCB0byBzZW5kIHRvIGJlIGxvc3QgaW1tZWRpYXRlbHkuICBOb3QgdmVyeSBjbGV2ZXIuICAqLwotICBhd2FpdF9yZXBseSAoQVdBSVRfUURSQUlOLCAwLCBOVUxMLCAwKTsKLSAgCi0gIHRwLm9wY29kZSA9IGh0b25zIChURlRQX1JSUSk7Ci0gIGxlbiA9IChncnViX3NwcmludGYgKChjaGFyICopIHRwLnUucnJxLCAiJXMlY29jdGV0JWNibGtzaXplJWMlZCIsCi0JCSAgICAgICBuYW1lLCAwLCAwLCAwLCBURlRQX01BWF9QQUNLRVQpCi0JICsgc2l6ZW9mICh0cC5pcCkgKyBzaXplb2YgKHRwLnVkcCkgKyBzaXplb2YgKHRwLm9wY29kZSkgKyAxKTsKLSAgaWYgKCEgdWRwX3RyYW5zbWl0IChhcnB0YWJsZVtBUlBfU0VSVkVSXS5pcGFkZHIuc19hZGRyLCArK2lwb3J0LAotCQkgICAgICBURlRQX1BPUlQsIGxlbiwgJnRwKSkKLSAgICByZXR1cm4gMDsKLSAgCi0gIGZvciAoOzspCi0gICAgewotICAgICAgbG9uZyB0aW1lb3V0OwotICAgICAgCi0jaWZkZWYgQ09OR0VTVEVECi0gICAgICB0aW1lb3V0ID0gcmZjMjEzMV9zbGVlcF9pbnRlcnZhbCAoYmxvY2sgPyBURlRQX1JFWE1UIDogVElNRU9VVCwgcmV0cnkpOwotI2Vsc2UKLSAgICAgIHRpbWVvdXQgPSByZmMyMTMxX3NsZWVwX2ludGVydmFsIChUSU1FT1VULCByZXRyeSk7Ci0jZW5kaWYKLQotICAgICAgaWYgKCEgYXdhaXRfcmVwbHkgKEFXQUlUX1RGVFAsIGlwb3J0LCBOVUxMLCB0aW1lb3V0KSkKLQl7Ci0JICBpZiAoISBibG9jayAmJiByZXRyeSsrIDwgTUFYX1RGVFBfUkVUUklFUykKLQkgICAgewotCSAgICAgIC8qIE1heWJlIGluaXRpYWwgcmVxdWVzdCB3YXMgbG9zdC4gICovCi0JICAgICAgaWYgKCEgdWRwX3RyYW5zbWl0IChhcnB0YWJsZVtBUlBfU0VSVkVSXS5pcGFkZHIuc19hZGRyLAotCQkJCSAgKytpcG9ydCwgVEZUUF9QT1JULCBsZW4sICZ0cCkpCi0JCXJldHVybiAwOwotCSAgICAgIAotCSAgICAgIGNvbnRpbnVlOwotCSAgICB9Ci0JICAKLSNpZmRlZiBDT05HRVNURUQKLQkgIGlmIChibG9jayAmJiAoKHJldHJ5ICs9IFRGVFBfUkVYTVQpIDwgVEZUUF9USU1FT1VUKSkKLQkgICAgewotCSAgICAgIC8qIFdlIHJlc2VuZCBvdXIgbGFzdCBhY2suICAqLwotI2lmZGVmIE1ERUJVRwotCSAgICAgIGdydWJfcHJpbnRmICgiPFJFWE1UPlxuIik7Ci0jZW5kaWYKLQkgICAgICB1ZHBfdHJhbnNtaXQgKGFycHRhYmxlW0FSUF9TRVJWRVJdLmlwYWRkci5zX2FkZHIsCi0JCQkgICAgaXBvcnQsIG9wb3J0LAotCQkJICAgIFRGVFBfTUlOX1BBQ0tFVCwgJnRwKTsKLQkgICAgICBjb250aW51ZTsKLQkgICAgfQotI2VuZGlmCi0JICAvKiBUaW1lb3V0LiAgKi8KLQkgIGJyZWFrOwotCX0KLSAgICAgIAotICAgICAgdHIgPSAoc3RydWN0IHRmdHBfdCAqKSAmbmljLnBhY2tldFtFVEhfSExFTl07Ci0gICAgICBpZiAodHItPm9wY29kZSA9PSBudG9ocyAoVEZUUF9FUlJPUikpCi0JewotCSAgZ3J1Yl9wcmludGYgKCJURlRQIGVycm9yICVkICglcylcbiIsCi0JCSAgICAgICBudG9ocyAodHItPnUuZXJyLmVycmNvZGUpLAotCQkgICAgICAgdHItPnUuZXJyLmVycm1zZyk7Ci0JICBicmVhazsKLQl9Ci0gICAgICAKLSAgICAgIGlmICh0ci0+b3Bjb2RlID09IG50b2hzIChURlRQX09BQ0spKQotCXsKLQkgIGNoYXIgKnAgPSB0ci0+dS5vYWNrLmRhdGEsICplOwotCSAgCi0JICAvKiBTaG91bGRuJ3QgaGFwcGVuLiAgKi8KLQkgIGlmIChwcmV2YmxvY2spCi0JICAgIC8qIElnbm9yZSBpdC4gICovCi0JICAgIGNvbnRpbnVlOwotCSAgCi0JICBsZW4gPSBudG9ocyAodHItPnVkcC5sZW4pIC0gc2l6ZW9mIChzdHJ1Y3QgdWRwaGRyKSAtIDI7Ci0JICBpZiAobGVuID4gVEZUUF9NQVhfUEFDS0VUKQotCSAgICBnb3RvIG5vYWs7Ci0JICAKLQkgIGUgPSBwICsgbGVuOwotCSAgd2hpbGUgKCpwICE9ICdcMDAwJyAmJiBwIDwgZSkKLQkgICAgewotCSAgICAgIGlmICghIGdydWJfc3RyY21wICgiYmxrc2l6ZSIsIHApKQotCQl7Ci0JCSAgcCArPSA4OwotCQkgIGlmICgocGFja2V0c2l6ZSA9IGdldGRlYyAoJnApKSA8IFRGVFBfREVGQVVMVFNJWkVfUEFDS0VUKQotCQkgICAgZ290byBub2FrOwotCQkgIAotCQkgIHdoaWxlIChwIDwgZSAmJiAqcCkKLQkJICAgIHArKzsKLQkJICAKLQkJICBpZiAocCA8IGUpCi0JCSAgICBwKys7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJbm9hazoKLQkJICB0cC5vcGNvZGUgPSBodG9ucyAoVEZUUF9FUlJPUik7Ci0JCSAgdHAudS5lcnIuZXJyY29kZSA9IDg7Ci0JCSAgbGVuID0gKGdydWJfc3ByaW50ZiAoKGNoYXIgKikgdHAudS5lcnIuZXJybXNnLAotCQkJCSAgICAgICAiUkZDMTc4MiBlcnJvciIpCi0JCQkgKyBzaXplb2YgKHRwLmlwKSArIHNpemVvZiAodHAudWRwKQotCQkJICsgc2l6ZW9mICh0cC5vcGNvZGUpICsgc2l6ZW9mICh0cC51LmVyci5lcnJjb2RlKQotCQkJICsgMSk7Ci0JCSAgdWRwX3RyYW5zbWl0IChhcnB0YWJsZVtBUlBfU0VSVkVSXS5pcGFkZHIuc19hZGRyLAotCQkJCWlwb3J0LCBudG9ocyAodHItPnVkcC5zcmMpLAotCQkJCWxlbiwgJnRwKTsKLQkJICByZXR1cm4gMDsKLQkJfQotCSAgICB9Ci0JICAKLQkgIGlmIChwID4gZSkKLQkgICAgZ290byBub2FrOwotCSAgCi0JICAvKiBUaGlzIGVuc3VyZXMgdGhhdCB0aGUgcGFja2V0IGRvZXMgbm90IGdldCBwcm9jZXNzZWQgYXMgZGF0YSEgICovCi0JICBibG9jayA9IHRwLnUuYWNrLmJsb2NrID0gMDsgCi0JfQotICAgICAgZWxzZSBpZiAodHItPm9wY29kZSA9PSBudG9ocyAoVEZUUF9EQVRBKSkKLQl7Ci0JICBsZW4gPSBudG9ocyAodHItPnVkcC5sZW4pIC0gc2l6ZW9mIChzdHJ1Y3QgdWRwaGRyKSAtIDQ7Ci0JICAvKiBTaG91bGRuJ3QgaGFwcGVuLiAgKi8KLQkgIGlmIChsZW4gPiBwYWNrZXRzaXplKQotCSAgICAvKiBJZ25vcmUgaXQuICAqLwotCSAgICBjb250aW51ZTsKLQkgIAotCSAgYmxvY2sgPSBudG9ocyAodHAudS5hY2suYmxvY2sgPSB0ci0+dS5kYXRhLmJsb2NrKTsKLQl9Ci0gICAgICBlbHNlCi0JLyogTmVpdGhlciBURlRQX09BQ0sgbm9yIFRGVFBfREFUQS4gICovCi0JYnJlYWs7Ci0gICAgICAKLSAgICAgIGlmICgoYmxvY2sgfHwgYmNvdW50ZXIpICYmIChibG9jayAhPSBwcmV2YmxvY2sgKyAxKSkKLQkvKiBCbG9jayBvcmRlciBzaG91bGQgYmUgY29udGludW91cyAqLwotCXRwLnUuYWNrLmJsb2NrID0gaHRvbnMgKGJsb2NrID0gcHJldmJsb2NrKTsKLSAgICAgIAotICAgICAgLyogU2hvdWxkIGJlIGNvbnRpbnVvdXMuICAqLwotICAgICAgdHAub3Bjb2RlID0gaHRvbnMgKFRGVFBfQUNLKTsKLSAgICAgIG9wb3J0ID0gbnRvaHMgKHRyLT51ZHAuc3JjKTsKLSAgICAgIC8qIEFjay4gICovCi0gICAgICB1ZHBfdHJhbnNtaXQgKGFycHRhYmxlW0FSUF9TRVJWRVJdLmlwYWRkci5zX2FkZHIsIGlwb3J0LAotCQkgICAgb3BvcnQsIFRGVFBfTUlOX1BBQ0tFVCwgJnRwKTsKLSAgICAgIAotICAgICAgaWYgKCh1bnNpZ25lZCBzaG9ydCkgKGJsb2NrIC0gcHJldmJsb2NrKSAhPSAxKQotCS8qIFJldHJhbnNtaXNzaW9uIG9yIE9BQ0ssIGRvbid0IHByb2Nlc3MgdmlhIGNhbGxiYWNrCi0JICogYW5kIGRvbid0IGNoYW5nZSB0aGUgdmFsdWUgb2YgcHJldmJsb2NrLiAgKi8KLQljb250aW51ZTsKLSAgICAgIAotICAgICAgcHJldmJsb2NrID0gYmxvY2s7Ci0gICAgICAvKiBJcyBpdCB0aGUgcmlnaHQgcGxhY2UgdG8gemVybyB0aGUgdGltZXI/ICAqLwotICAgICAgcmV0cnkgPSAwOwotICAgICAgCi0gICAgICBpZiAoKHJjID0gZm5jICh0ci0+dS5kYXRhLmRvd25sb2FkLAotCQkgICAgICsrYmNvdW50ZXIsIGxlbiwgbGVuIDwgcGFja2V0c2l6ZSkpID49IDApCi0JcmV0dXJuIHJjOwotCi0gICAgICAvKiBFbmQgb2YgZGF0YS4gICovCi0gICAgICBpZiAobGVuIDwgcGFja2V0c2l6ZSkgICAgICAgICAgIAotCXJldHVybiAxOwotICAgIH0KLSAgCi0gIHJldHVybiAwOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJBUlAgLSBHZXQgbXkgSVAgYWRkcmVzcyBhbmQgbG9hZCBpbmZvcm1hdGlvbgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pbnQgCi1yYXJwICh2b2lkKQotewotICBpbnQgcmV0cnk7Ci0KLSAgLyogYXJwIGFuZCByYXJwIHJlcXVlc3RzIHNoYXJlIHRoZSBzYW1lIHBhY2tldCBzdHJ1Y3R1cmUuICAqLwotICBzdHJ1Y3QgYXJwcmVxdWVzdCByYXJwcmVxOwotCi0gIC8qIE1ha2Ugc3VyZSB0aGF0IGFuIGV0aGVybmV0IGlzIHByb2JlZC4gICovCi0gIGlmICghIGV0aF9wcm9iZSAoKSkKLSAgICByZXR1cm4gMDsKLQotICAvKiBDbGVhciB0aGUgcmVhZHkgZmxhZy4gICovCi0gIG5ldHdvcmtfcmVhZHkgPSAwOwotICAKLSAgZ3J1Yl9tZW1zZXQgKCZyYXJwcmVxLCAwLCBzaXplb2YgKHJhcnByZXEpKTsKLQotICByYXJwcmVxLmh3dHlwZSA9IGh0b25zICgxKTsKLSAgcmFycHJlcS5wcm90b2NvbCA9IGh0b25zIChJUCk7Ci0gIHJhcnByZXEuaHdsZW4gPSBFVEhfQUxFTjsKLSAgcmFycHJlcS5wcm90b2xlbiA9IDQ7Ci0gIHJhcnByZXEub3Bjb2RlID0gaHRvbnMgKFJBUlBfUkVRVUVTVCk7Ci0gIGdydWJfbWVtbW92ZSAoKGNoYXIgKikgJnJhcnByZXEuc2h3YWRkciwgYXJwdGFibGVbQVJQX0NMSUVOVF0ubm9kZSwKLQkJRVRIX0FMRU4pOwotICAvKiBzaXBhZGRyIGlzIGFscmVhZHkgemVyb2VkIG91dCAqLwotICBncnViX21lbW1vdmUgKChjaGFyICopICZyYXJwcmVxLnRod2FkZHIsIGFycHRhYmxlW0FSUF9DTElFTlRdLm5vZGUsCi0JCUVUSF9BTEVOKTsKLSAgLyogdGlwYWRkciBpcyBhbHJlYWR5IHplcm9lZCBvdXQgKi8KLQotICBmb3IgKHJldHJ5ID0gMDsgcmV0cnkgPCBNQVhfQVJQX1JFVFJJRVM7ICsrcmV0cnkpCi0gICAgewotICAgICAgbG9uZyB0aW1lb3V0OwotICAgICAgCi0gICAgICBldGhfdHJhbnNtaXQgKGJyb2FkY2FzdCwgUkFSUCwgc2l6ZW9mIChyYXJwcmVxKSwgJnJhcnByZXEpOwotCi0gICAgICB0aW1lb3V0ID0gcmZjMjEzMV9zbGVlcF9pbnRlcnZhbCAoVElNRU9VVCwgcmV0cnkpOwotICAgICAgaWYgKGF3YWl0X3JlcGx5IChBV0FJVF9SQVJQLCAwLCByYXJwcmVxLnNod2FkZHIsIHRpbWVvdXQpKQotCWJyZWFrOwotCi0gICAgICBpZiAoaXBfYWJvcnQpCi0JcmV0dXJuIDA7Ci0gICAgfQotCi0gIGlmIChyZXRyeSA8IE1BWF9BUlBfUkVUUklFUykKLSAgICB7Ci0gICAgICBuZXR3b3JrX3JlYWR5ID0gMTsKLSAgICAgIHJldHVybiAxOwotICAgIH0KLQotICByZXR1cm4gMDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1CT09UUCAtIEdldCBteSBJUCBhZGRyZXNzIGFuZCBsb2FkIGluZm9ybWF0aW9uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWludCAKLWJvb3RwICh2b2lkKQotewotICBpbnQgcmV0cnk7Ci0jaWZuZGVmCU5PX0RIQ1BfU1VQUE9SVAotICBpbnQgcmVxcmV0cnk7Ci0jZW5kaWYgLyogISBOT19ESENQX1NVUFBPUlQgKi8KLSAgc3RydWN0IGJvb3RwaXBfdCBpcDsKLSAgdW5zaWduZWQgbG9uZyBzdGFydHRpbWU7Ci0KLSAgLyogTWFrZSBzdXJlIHRoYXQgYW4gZXRoZXJuZXQgaXMgcHJvYmVkLiAgKi8KLSAgaWYgKCEgZXRoX3Byb2JlICgpKQotICAgIHJldHVybiAwOwotCi0gIC8qIENsZWFyIHRoZSByZWFkeSBmbGFnLiAgKi8KLSAgbmV0d29ya19yZWFkeSA9IDA7Ci0KLSNpZmRlZiBERUJVRwotICBncnViX3ByaW50ZiAoIm5ldHdvcmsgaXMgcmVhZHkuXG4iKTsKLSNlbmRpZgotICAKLSAgZ3J1Yl9tZW1zZXQgKCZpcCwgMCwgc2l6ZW9mIChzdHJ1Y3QgYm9vdHBpcF90KSk7Ci0gIGlwLmJwLmJwX29wID0gQk9PVFBfUkVRVUVTVDsKLSAgaXAuYnAuYnBfaHR5cGUgPSAxOwotICBpcC5icC5icF9obGVuID0gRVRIX0FMRU47Ci0gIHN0YXJ0dGltZSA9IGN1cnJ0aWNrcyAoKTsKLSAgLyogVXNlIGxvd2VyIDMyIGJpdHMgb2Ygbm9kZSBhZGRyZXNzLCBtb3JlIGxpa2VseSB0byBiZQotICAgICBkaXN0aW5jdCB0aGFuIHRoZSB0aW1lIHNpbmNlIGJvb3RpbmcgKi8KLSAgZ3J1Yl9tZW1tb3ZlICgmeGlkLCAmYXJwdGFibGVbQVJQX0NMSUVOVF0ubm9kZVsyXSwgc2l6ZW9mKHhpZCkpOwotICBpcC5icC5icF94aWQgPSB4aWQgKz0gaHRvbmwgKHN0YXJ0dGltZSk7Ci0gIGdydWJfbWVtbW92ZSAoaXAuYnAuYnBfaHdhZGRyLCBhcnB0YWJsZVtBUlBfQ0xJRU5UXS5ub2RlLCBFVEhfQUxFTik7Ci0jaWZkZWYgREVCVUcKLSAgZXRoZXJib290X3ByaW50ZiAoImJwX29wID0gJWRcbiIsIGlwLmJwLmJwX29wKTsKLSAgZXRoZXJib290X3ByaW50ZiAoImJwX2h0eXBlID0gJWRcbiIsIGlwLmJwLmJwX2h0eXBlKTsKLSAgZXRoZXJib290X3ByaW50ZiAoImJwX2hsZW4gPSAlZFxuIiwgaXAuYnAuYnBfaGxlbik7Ci0gIGV0aGVyYm9vdF9wcmludGYgKCJicF94aWQgPSAlZFxuIiwgaXAuYnAuYnBfeGlkKTsKLSAgZXRoZXJib290X3ByaW50ZiAoImJwX2h3YWRkciA9ICUhXG4iLCBpcC5icC5icF9od2FkZHIpOwotICBldGhlcmJvb3RfcHJpbnRmICgiYnBfaG9wcyA9ICVkXG4iLCAoaW50KSBpcC5icC5icF9ob3BzKTsKLSAgZXRoZXJib290X3ByaW50ZiAoImJwX3NlY3MgPSAlZFxuIiwgKGludCkgaXAuYnAuYnBfaHdhZGRyKTsKLSNlbmRpZgotICAKLSNpZmRlZglOT19ESENQX1NVUFBPUlQKLSAgLyogUmVxdWVzdCBSRkMtc3R5bGUgb3B0aW9ucy4gICovCi0gIGdydWJfbWVtbW92ZSAoaXAuYnAuYnBfdmVuZCwgcmZjMTUzM19jb29raWUsIDUpOwotI2Vsc2UKLSAgLyogUmVxdWVzdCBSRkMtc3R5bGUgb3B0aW9ucy4gICovCi0gIGdydWJfbWVtbW92ZSAoaXAuYnAuYnBfdmVuZCwgcmZjMTUzM19jb29raWUsIHNpemVvZiByZmMxNTMzX2Nvb2tpZSk7Ci0gIGdydWJfbWVtbW92ZSAoaXAuYnAuYnBfdmVuZCArIHNpemVvZiByZmMxNTMzX2Nvb2tpZSwgZGhjcGRpc2NvdmVyLAotCQlzaXplb2YgZGhjcGRpc2NvdmVyKTsKLSAgZ3J1Yl9tZW1tb3ZlIChpcC5icC5icF92ZW5kICsgc2l6ZW9mIHJmYzE1MzNfY29va2llICsgc2l6ZW9mIGRoY3BkaXNjb3ZlciwKLQkJcmZjMTUzM19lbmQsIHNpemVvZiByZmMxNTMzX2VuZCk7Ci0jZW5kaWYgLyogISBOT19ESENQX1NVUFBPUlQgKi8KLQotICBmb3IgKHJldHJ5ID0gMDsgcmV0cnkgPCBNQVhfQk9PVFBfUkVUUklFUzspCi0gICAgewotICAgICAgbG9uZyB0aW1lb3V0OwotCi0jaWZkZWYgREVCVUcKLSAgICAgIGdydWJfcHJpbnRmICgicmV0cnkgPSAlZFxuIiwgcmV0cnkpOwotI2VuZGlmCi0gICAgICAKLSAgICAgIC8qIENsZWFyIG91dCB0aGUgUnggcXVldWUgZmlyc3QuICBJdCBjb250YWlucyBub3RoaW5nIG9mCi0gICAgICAgKiBpbnRlcmVzdCwgZXhjZXB0IHBvc3NpYmx5IEFSUCByZXF1ZXN0cyBmcm9tIHRoZSBESENQL1RGVFAKLSAgICAgICAqIHNlcnZlci4gIFdlIHVzZSBwb2xsaW5nIHRocm91Z2hvdXQgRXRoZXJib290LCBzbyBzb21lIHRpbWUKLSAgICAgICAqIG1heSBoYXZlIHBhc3NlZCBzaW5jZSB3ZSBsYXN0IHBvbGxlZCB0aGUgcmVjZWl2ZSBxdWV1ZSwKLSAgICAgICAqIHdoaWNoIG1heSBub3cgYmUgZmlsbGVkIHdpdGggYnJvYWRjYXN0IHBhY2tldHMuICBUaGlzIHdpbGwKLSAgICAgICAqIGNhdXNlIHRoZSByZXBseSB0byB0aGUgcGFja2V0cyB3ZSBhcmUgYWJvdXQgdG8gc2VuZCB0byBiZQotICAgICAgICogbG9zdCBpbW1lZGlhdGVseS4gIE5vdCB2ZXJ5IGNsZXZlci4gICovCi0gICAgICBhd2FpdF9yZXBseSAoQVdBSVRfUURSQUlOLCAwLCBOVUxMLCAwKTsKLQotICAgICAgdWRwX3RyYW5zbWl0IChJUF9CUk9BRENBU1QsIEJPT1RQX0NMSUVOVCwgQk9PVFBfU0VSVkVSLAotCQkgICAgc2l6ZW9mIChzdHJ1Y3QgYm9vdHBpcF90KSwgJmlwKTsKLSAgICAgIHRpbWVvdXQgPSByZmMyMTMxX3NsZWVwX2ludGVydmFsIChUSU1FT1VULCByZXRyeSsrKTsKLSNpZmRlZiBOT19ESENQX1NVUFBPUlQKLSAgICAgIGlmIChhd2FpdF9yZXBseSAoQVdBSVRfQk9PVFAsIDAsIE5VTEwsIHRpbWVvdXQpKQotCXsKLQkgIG5ldHdvcmtfcmVhZHkgPSAxOwotCSAgcmV0dXJuIDE7Ci0JfQotI2Vsc2UgLyogISBOT19ESENQX1NVUFBPUlQgKi8KLSAgICAgIGlmIChhd2FpdF9yZXBseSAoQVdBSVRfQk9PVFAsIDAsIE5VTEwsIHRpbWVvdXQpKQotCXsKLQkgIGlmIChkaGNwX3JlcGx5ICE9IERIQ1BPRkZFUikKLQkgICAgewotCSAgICAgIG5ldHdvcmtfcmVhZHkgPSAxOwotCSAgICAgIHJldHVybiAxOwotCSAgICB9Ci0KLQkgIGRoY3BfcmVwbHkgPSAwOwotI2lmZGVmIERFQlVHCi0gIGV0aGVyYm9vdF9wcmludGYgKCJicF9vcCA9ICVkXG4iLCAoaW50KSBpcC5icC5icF9vcCk7Ci0gIGV0aGVyYm9vdF9wcmludGYgKCJicF9odHlwZSA9ICVkXG4iLCAoaW50KSBpcC5icC5icF9odHlwZSk7Ci0gIGV0aGVyYm9vdF9wcmludGYgKCJicF9obGVuID0gJWRcbiIsIChpbnQpIGlwLmJwLmJwX2hsZW4pOwotICBldGhlcmJvb3RfcHJpbnRmICgiYnBfeGlkID0gJWRcbiIsIChpbnQpIGlwLmJwLmJwX3hpZCk7Ci0gIGV0aGVyYm9vdF9wcmludGYgKCJicF9od2FkZHIgPSAlIVxuIiwgaXAuYnAuYnBfaHdhZGRyKTsKLSAgZXRoZXJib290X3ByaW50ZiAoImJwX2hvcHMgPSAlZFxuIiwgKGludCkgaXAuYnAuYnBfaG9wcyk7Ci0gIGV0aGVyYm9vdF9wcmludGYgKCJicF9zZWNzID0gJWRcbiIsIChpbnQpIGlwLmJwLmJwX2h3YWRkcik7Ci0jZW5kaWYKLQkgIGdydWJfbWVtbW92ZSAoaXAuYnAuYnBfdmVuZCwgcmZjMTUzM19jb29raWUsIHNpemVvZiByZmMxNTMzX2Nvb2tpZSk7Ci0JICBncnViX21lbW1vdmUgKGlwLmJwLmJwX3ZlbmQgKyBzaXplb2YgcmZjMTUzM19jb29raWUsCi0JCQlkaGNwcmVxdWVzdCwgc2l6ZW9mIGRoY3ByZXF1ZXN0KTsKLQkgIGdydWJfbWVtbW92ZSAoaXAuYnAuYnBfdmVuZCArIHNpemVvZiByZmMxNTMzX2Nvb2tpZQotCQkJKyBzaXplb2YgZGhjcHJlcXVlc3QsCi0JCQlyZmMxNTMzX2VuZCwgc2l6ZW9mIHJmYzE1MzNfZW5kKTsKLQkgIGdydWJfbWVtbW92ZSAoaXAuYnAuYnBfdmVuZCArIDksIChjaGFyICopICZkaGNwX3NlcnZlciwKLQkJCXNpemVvZiAoaW5fYWRkcikpOwotCSAgZ3J1Yl9tZW1tb3ZlIChpcC5icC5icF92ZW5kICsgMTUsIChjaGFyICopICZkaGNwX2FkZHIsCi0JCQlzaXplb2YgKGluX2FkZHIpKTsKLSNpZmRlZiBERUJVRwotCSAgZ3J1Yl9wcmludGYgKCJlcnJudW0gPSAlZFxuIiwgZXJybnVtKTsKLSNlbmRpZgotCSAgZm9yIChyZXFyZXRyeSA9IDA7IHJlcXJldHJ5IDwgTUFYX0JPT1RQX1JFVFJJRVM7KQotCSAgICB7Ci0JICAgICAgaW50IHJldDsKLSNpZmRlZiBERUJVRwotCSAgICAgIGdydWJfcHJpbnRmICgicmVxcmV0cnkgPSAlZFxuIiwgcmVxcmV0cnkpOwotI2VuZGlmCi0JICAgICAgCi0JICAgICAgcmV0ID0gdWRwX3RyYW5zbWl0IChJUF9CUk9BRENBU1QsIEJPT1RQX0NMSUVOVCwgQk9PVFBfU0VSVkVSLAotCQkJCSAgc2l6ZW9mIChzdHJ1Y3QgYm9vdHBpcF90KSwgJmlwKTsKLQkgICAgICBpZiAoISByZXQpCi0JCWdydWJfcHJpbnRmICgidWRwX3RyYW5zbWl0IGZhaWxlZC5cbiIpOwotCSAgICAgIAotCSAgICAgIGRoY3BfcmVwbHkgPSAwOwotCSAgICAgIHRpbWVvdXQgPSByZmMyMTMxX3NsZWVwX2ludGVydmFsIChUSU1FT1VULCByZXFyZXRyeSsrKTsKLQkgICAgICBpZiAoYXdhaXRfcmVwbHkgKEFXQUlUX0JPT1RQLCAwLCBOVUxMLCB0aW1lb3V0KSkKLQkJaWYgKGRoY3BfcmVwbHkgPT0gREhDUEFDSykKLQkJICB7Ci0JCSAgICBuZXR3b3JrX3JlYWR5ID0gMTsKLQkJICAgIHJldHVybiAxOwotCQkgIH0KLQotI2lmZGVmIERFQlVHCi0JICAgICAgZ3J1Yl9wcmludGYgKCJkaGNwX3JlcGx5ID0gJWRcbiIsIGRoY3BfcmVwbHkpOwotI2VuZGlmCi0JICAgICAgCi0JICAgICAgaWYgKGlwX2Fib3J0KQotCQlyZXR1cm4gMDsKLQkgICAgfQotCX0KLSNlbmRpZiAvKiAhIE5PX0RIQ1BfU1VQUE9SVCAqLwotICAgICAgCi0gICAgICBpZiAoaXBfYWJvcnQpCi0JcmV0dXJuIDA7Ci0gICAgICAKLSAgICAgIGlwLmJwLmJwX3NlY3MgPSBodG9ucyAoKGN1cnJ0aWNrcyAoKSAtIHN0YXJ0dGltZSkgLyBUSUNLU19QRVJfU0VDKTsKLSAgICB9Ci0KLSAgLyogVGltZW91dC4gICovCi0gIHJldHVybiAwOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVVEUENIS1NVTSAtIENoZWNrc3VtIFVEUCBQYWNrZXQgKG9uZSBvZiB0aGUgcmFyZSBjYXNlcyB3aGVuIGFzc2VtYmx5IGlzCi0gICAgICAgICAgICBhY3R1YWxseSBzaW1wbGVyLi4uKQotIFJFVFVSTlM6IGNoZWNrc3VtLCAwIG9uIGNoZWNrc3VtIGVycm9yLiBUaGlzCi0gICAgICAgICAgYWxsb3dzIGZvciB1c2luZyB0aGUgc2FtZSByb3V0aW5lIGZvciBSWCBhbmQgVFggc3VtbWluZzoKLSAgICAgICAgICBSWCAgaWYgKHBhY2tldC0+dWRwLmNoa3N1bSAmJiB1ZHBjaGtzdW0ocGFja2V0KSkKLSAgICAgICAgICAgICAgICAgIGVycm9yKCJjaGVja3N1bSBlcnJvciIpOwotICAgICAgICAgIFRYICBwYWNrZXQtPnVkcC5jaGtzdW09MDsKLSAgICAgICAgICAgICAgaWYgKDA9PShwYWNrZXQtPnVkcC5jaGtzdW09dWRwY2hrc3VtKHBhY2tldCkpKQotICAgICAgICAgICAgICAgICAgcGFja2V0LT51cGQuY2hrc3VtPTB4ZmZmZjsKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIGlubGluZSB2b2lkCi1kb3N1bSAodW5zaWduZWQgc2hvcnQgKnN0YXJ0LCB1bnNpZ25lZCBpbnQgbGVuLCB1bnNpZ25lZCBzaG9ydCAqc3VtKQotewotICBfX2FzbV9fIF9fdm9sYXRpbGVfXwotICAgICgiY2xjXG4iCi0gICAgICIxOlx0bG9kc3dcblx0IgotICAgICAieGNoZyAlJWFsLCUlYWhcblx0IgkvKiBjb252ZXJ0IHRvIGhvc3QgYnl0ZSBvcmRlciAqLwotICAgICAiYWRjdyAlJWF4LCUwXG5cdCIJCS8qIGFkZCBjYXJyeSBvZiBwcmV2aW91cyBpdGVyYXRpb24gKi8KLSAgICAgImxvb3AgMWJcblx0IgotICAgICAiYWRjdyAkMCwlMCIJCS8qIGFkZCBjYXJyeSBvZiBsYXN0IGl0ZXJhdGlvbiAqLwotICAgICA6ICI9YiIgKCpzdW0pLCAiPVMiKHN0YXJ0KSwgIj1jIihsZW4pCi0gICAgIDogIjAiKCpzdW0pLCAiMSIoc3RhcnQpLCAiMiIobGVuKQotICAgICA6ICJheCIsICJjYyIKLSAgICAgKTsKLX0KLQotLyogVURQIHN1bToKLSAqIHByb3RvLCBzcmNfaXAsIGRzdF9pcCwgdWRwX2Rwb3J0LCB1ZHBfc3BvcnQsIDIqdWRwX2xlbiwgcGF5bG9hZAotICovCi1zdGF0aWMgdW5zaWduZWQgc2hvcnQKLXVkcGNoa3N1bSAoc3RydWN0IGlwaGRyICpwYWNrZXQpCi17Ci0gIGludCBsZW4gPSBudG9ocyAocGFja2V0LT5sZW4pOwotICB1bnNpZ25lZCBzaG9ydCBydmFsOwotICAKLSAgLyogYWRkIHVkcGxlbmd0aCArIHByb3RvY29sIG51bWJlciAqLwotICBydmFsID0gKGxlbiAtIHNpemVvZiAoc3RydWN0IGlwaGRyKSkgKyBJUF9VRFA7Ci0gIAotICAvKiBwYWQgdG8gYW4gZXZlbiBudW1iZXIgb2YgYnl0ZXMgKi8KLSAgaWYgKGxlbiAlIDIpIHsKLSAgICAoKGNoYXIgKikgcGFja2V0KVtsZW4rK10gPSAwOwotICB9Ci0gIAotICAvKiBzdW0gb3ZlciBzcmMvZHN0IGlwYWRkciArIHVkcCBwYWNrZXQgKi8KLSAgbGVuIC09IChjaGFyICopICZwYWNrZXQtPnNyYyAtIChjaGFyICopIHBhY2tldDsKLSAgZG9zdW0gKCh1bnNpZ25lZCBzaG9ydCAqKSAmcGFja2V0LT5zcmMsIGxlbiA+PiAxLCAmcnZhbCk7Ci0gIAotICAvKiB0YWtlIG9uZSdzIGNvbXBsZW1lbnQgKi8KLSAgcmV0dXJuIH5ydmFsOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLUFXQUlUX1JFUExZIC0gV2FpdCB1bnRpbCB3ZSBnZXQgYSByZXNwb25zZSBmb3Igb3VyIHJlcXVlc3QKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaW50IAotYXdhaXRfcmVwbHkgKGludCB0eXBlLCBpbnQgaXZhbCwgdm9pZCAqcHRyLCBpbnQgdGltZW91dCkKLXsKLSAgdW5zaWduZWQgbG9uZyB0aW1lOwotICBzdHJ1Y3QgaXBoZHIgKmlwOwotICBzdHJ1Y3QgdWRwaGRyICp1ZHA7Ci0gIHN0cnVjdCBhcnByZXF1ZXN0ICphcnByZXBseTsKLSAgc3RydWN0IGJvb3RwX3QgKmJvb3RwcmVwbHk7Ci0gIHVuc2lnbmVkIHNob3J0IHB0eXBlOwotICB1bnNpZ25lZCBpbnQgcHJvdG9oZHJsZW4gPSAoRVRIX0hMRU4gKyBzaXplb2YgKHN0cnVjdCBpcGhkcikKLQkJCSAgICAgICsgc2l6ZW9mIChzdHJ1Y3QgdWRwaGRyKSk7Ci0KLSAgLyogQ2xlYXIgdGhlIGFib3J0IGZsYWcuICAqLwotICBpcF9hYm9ydCA9IDA7Ci0gIAotICB0aW1lID0gdGltZW91dCArIGN1cnJ0aWNrcyAoKTsKLSAgLyogVGhlIHRpbWVvdXQgY2hlY2sgaXMgZG9uZSBiZWxvdy4gIFRoZSB0aW1lb3V0IGlzIG9ubHkgY2hlY2tlZCBpZgotICAgKiB0aGVyZSBpcyBubyBwYWNrZXQgaW4gdGhlIFJ4IHF1ZXVlLiAgVGhpcyBhc3N1bWVzIHRoYXQgZXRoX3BvbGwoKQotICAgKiBuZWVkcyBhIG5lZ2xpZ2libGUgYW1vdW50IG9mIHRpbWUuICAqLwotICBmb3IgKDs7KQotICAgIHsKLSAgICAgIGlmIChldGhfcG9sbCAoKSkKLQl7Ci0JICAvKiBXZSBoYXZlIHNvbWV0aGluZyEgICovCi0JICAKLQkgIC8qIENoZWNrIGZvciBBUlAgLSBObyBJUCBoZHIuICAqLwotCSAgaWYgKG5pYy5wYWNrZXRsZW4gPj0gRVRIX0hMRU4pCi0JICAgIHsKLQkgICAgICBwdHlwZSA9ICgoKHVuc2lnbmVkIHNob3J0KSBuaWMucGFja2V0WzEyXSkgPDwgOAotCQkgICAgICAgfCAoKHVuc2lnbmVkIHNob3J0KSBuaWMucGFja2V0WzEzXSkpOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIC8qIFdoYXQgZWxzZSBjb3VsZCB3ZSBkbyB3aXRoIGl0PyAgKi8KLQkgICAgY29udGludWU7Ci0JICAKLQkgIGlmIChuaWMucGFja2V0bGVuID49IEVUSF9ITEVOICsgc2l6ZW9mIChzdHJ1Y3QgYXJwcmVxdWVzdCkKLQkgICAgICAmJiBwdHlwZSA9PSBBUlApCi0JICAgIHsKLQkgICAgICB1bnNpZ25lZCBsb25nIHRtcDsKLQotCSAgICAgIGFycHJlcGx5ID0gKHN0cnVjdCBhcnByZXF1ZXN0ICopICZuaWMucGFja2V0W0VUSF9ITEVOXTsKLQkgICAgICAKLQkgICAgICBpZiAoYXJwcmVwbHktPm9wY29kZSA9PSBodG9ucyAoQVJQX1JFUExZKQotCQkgICYmICEgZ3J1Yl9tZW1jbXAgKGFycHJlcGx5LT5zaXBhZGRyLCBwdHIsIHNpemVvZiAoaW5fYWRkcikpCi0JCSAgJiYgdHlwZSA9PSBBV0FJVF9BUlApCi0JCXsKLQkJICBncnViX21lbW1vdmUgKChjaGFyICopIGFycHRhYmxlW2l2YWxdLm5vZGUsCi0JCQkJYXJwcmVwbHktPnNod2FkZHIsCi0JCQkJRVRIX0FMRU4pOwotCQkgIHJldHVybiAxOwotCQl9Ci0JICAgICAgCi0JICAgICAgZ3J1Yl9tZW1tb3ZlICgoY2hhciAqKSAmdG1wLCBhcnByZXBseS0+dGlwYWRkciwKLQkJCSAgICBzaXplb2YgKGluX2FkZHIpKTsKLQkgICAgICAKLQkgICAgICBpZiAoYXJwcmVwbHktPm9wY29kZSA9PSBodG9ucyAoQVJQX1JFUVVFU1QpCi0JCSAgJiYgdG1wID09IGFycHRhYmxlW0FSUF9DTElFTlRdLmlwYWRkci5zX2FkZHIpCi0JCXsKLQkJICBhcnByZXBseS0+b3Bjb2RlID0gaHRvbnMgKEFSUF9SRVBMWSk7Ci0JCSAgZ3J1Yl9tZW1tb3ZlIChhcnByZXBseS0+dGlwYWRkciwgYXJwcmVwbHktPnNpcGFkZHIsCi0JCQkJc2l6ZW9mIChpbl9hZGRyKSk7Ci0JCSAgZ3J1Yl9tZW1tb3ZlIChhcnByZXBseS0+dGh3YWRkciwgKGNoYXIgKikgYXJwcmVwbHktPnNod2FkZHIsCi0JCQkJRVRIX0FMRU4pOwotCQkgIGdydWJfbWVtbW92ZSAoYXJwcmVwbHktPnNpcGFkZHIsCi0JCQkJKGNoYXIgKikgJmFycHRhYmxlW0FSUF9DTElFTlRdLmlwYWRkciwKLQkJCQlzaXplb2YgKGluX2FkZHIpKTsKLQkJICBncnViX21lbW1vdmUgKGFycHJlcGx5LT5zaHdhZGRyLAotCQkJCWFycHRhYmxlW0FSUF9DTElFTlRdLm5vZGUsCi0JCQkJRVRIX0FMRU4pOwotCQkgIGV0aF90cmFuc21pdCAoYXJwcmVwbHktPnRod2FkZHIsIEFSUCwKLQkJCQlzaXplb2YgKHN0cnVjdCBhcnByZXF1ZXN0KSwKLQkJCQlhcnByZXBseSk7Ci0jaWZkZWYgTURFQlVHCi0JCSAgZ3J1Yl9tZW1tb3ZlICgmdG1wLCBhcnByZXBseS0+dGlwYWRkciwgc2l6ZW9mIChpbl9hZGRyKSk7Ci0JCSAgZXRoZXJib290X3ByaW50ZiAoIlNlbnQgQVJQIHJlcGx5IHRvOiAlQFxuIiwgdG1wKTsKLSNlbmRpZgkvKiBNREVCVUcgKi8KLQkJfQotCSAgICAgIAotCSAgICAgIGNvbnRpbnVlOwotCSAgICB9Ci0KLQkgIGlmICh0eXBlID09IEFXQUlUX1FEUkFJTikKLQkgICAgY29udGludWU7Ci0JICAKLQkgIC8qIENoZWNrIGZvciBSQVJQIC0gTm8gSVAgaGRyLiAgKi8KLQkgIGlmICh0eXBlID09IEFXQUlUX1JBUlAKLQkgICAgICAmJiBuaWMucGFja2V0bGVuID49IEVUSF9ITEVOICsgc2l6ZW9mIChzdHJ1Y3QgYXJwcmVxdWVzdCkKLQkgICAgICAmJiBwdHlwZSA9PSBSQVJQKQotCSAgICB7Ci0JICAgICAgYXJwcmVwbHkgPSAoc3RydWN0IGFycHJlcXVlc3QgKikgJm5pYy5wYWNrZXRbRVRIX0hMRU5dOwotCSAgICAgIAotCSAgICAgIGlmIChhcnByZXBseS0+b3Bjb2RlID09IGh0b25zIChSQVJQX1JFUExZKQotCQkgICYmICEgZ3J1Yl9tZW1jbXAgKGFycHJlcGx5LT50aHdhZGRyLCBwdHIsIEVUSF9BTEVOKSkKLQkJewotCQkgIGdydWJfbWVtbW92ZSAoKGNoYXIgKikgYXJwdGFibGVbQVJQX1NFUlZFUl0ubm9kZSwKLQkJCQlhcnByZXBseS0+c2h3YWRkciwgRVRIX0FMRU4pOwotCQkgIGdydWJfbWVtbW92ZSAoKGNoYXIgKikgJmFycHRhYmxlW0FSUF9TRVJWRVJdLmlwYWRkciwKLQkJCQlhcnByZXBseS0+c2lwYWRkciwgc2l6ZW9mIChpbl9hZGRyKSk7Ci0JCSAgZ3J1Yl9tZW1tb3ZlICgoY2hhciAqKSAmYXJwdGFibGVbQVJQX0NMSUVOVF0uaXBhZGRyLAotCQkJCWFycHJlcGx5LT50aXBhZGRyLCBzaXplb2YgKGluX2FkZHIpKTsKLQkJICByZXR1cm4gMTsKLQkJfQotCSAgICAgIAotCSAgICAgIGNvbnRpbnVlOwotCSAgICB9Ci0KLQkgIC8qIEFueXRoaW5nIGVsc2UgaGFzIElQIGhlYWRlci4gICovCi0JICBpZiAobmljLnBhY2tldGxlbiA8IHByb3RvaGRybGVuIHx8IHB0eXBlICE9IElQKQotCSAgICBjb250aW51ZTsKLQkgIAotCSAgaXAgPSAoc3RydWN0IGlwaGRyICopICZuaWMucGFja2V0W0VUSF9ITEVOXTsKLQkgIGlmIChpcC0+dmVyaGRybGVuICE9IDB4NDUKLQkgICAgICB8fCBpcGNoa3N1bSAoKHVuc2lnbmVkIHNob3J0ICopIGlwLCBzaXplb2YgKHN0cnVjdCBpcGhkcikpCi0JICAgICAgfHwgaXAtPnByb3RvY29sICE9IElQX1VEUCkKLQkgICAgY29udGludWU7Ci0JICAKLQkgIC8qCi0JICAgIC0gVGlsbCBTdHJhdW1hbm4gPFRpbGwuU3RyYXVtYW5uQFRVLUJlcmxpbi5kZT4KLQkgICAgYWRkZWQgdWRwIGNoZWNrc3VtIChzYWZlciBvbiBhIHdpcmVsZXNzIGxpbmspCi0JICAgIGFkZGVkIGZyYWdtZW50YXRpb24gY2hlY2s6IEkgaGFkIGEgY29ycnVwdGVkIGltYWdlCi0JICAgIGluIG1lbW9yeSBkdWUgdG8gZnJhZ21lbnRlZCBURlRQIHBhY2tldHMgLSB0b29rIG1lCi0JICAgIDMgZGF5cyB0byBmaW5kIHRoZSBjYXVzZSBmb3IgdGhpcyA6LSgKLQkgICovCi0JICAKLQkgIC8qIElmIE1vcmUgRnJhZ21lbnRzIGJpdCBhbmQgRnJhZ21lbnQgT2Zmc2V0IGZpZWxkCi0JICAgICBhcmUgbm9uLXplcm8gdGhlbiBwYWNrZXQgaXMgZnJhZ21lbnRlZCAqLwotCSAgaWYgKGlwLT5mcmFncyAmIGh0b25zKDB4M0ZGRikpCi0JICAgIHsKLQkgICAgICBncnViX3ByaW50ZiAoIkFMRVJUOiBnb3QgYSBmcmFnbWVudGVkIHBhY2tldCAtIHJlY29uZmlndXJlIHlvdXIgc2VydmVyXG4iKTsKLQkgICAgICBjb250aW51ZTsKLQkgICAgfQotCSAgCi0JICB1ZHAgPSAoc3RydWN0IHVkcGhkciAqKSAmbmljLnBhY2tldFsoRVRIX0hMRU4KLQkJCQkJICAgICAgICsgc2l6ZW9mIChzdHJ1Y3QgaXBoZHIpKV07Ci0JICBpZiAodWRwLT5jaGtzdW0gJiYgdWRwY2hrc3VtIChpcCkpCi0JICAgIHsKLQkgICAgICBncnViX3ByaW50ZiAoIlVEUCBjaGVja3N1bSBlcnJvclxuIik7Ci0JICAgICAgY29udGludWU7Ci0JICAgIH0KLQkgIAotCSAgLyogQk9PVFAgPyAgKi8KLQkgIGJvb3RwcmVwbHkgPSAoc3RydWN0IGJvb3RwX3QgKikKLQkgICAgJm5pYy5wYWNrZXRbKEVUSF9ITEVOICsgc2l6ZW9mIChzdHJ1Y3QgaXBoZHIpCi0JCQkgKyBzaXplb2YgKHN0cnVjdCB1ZHBoZHIpKV07Ci0JICBpZiAodHlwZSA9PSBBV0FJVF9CT09UUAotI2lmZGVmIE5PX0RIQ1BfU1VQUE9SVAotCSAgICAgICYmIChuaWMucGFja2V0bGVuCi0JCSAgPj0gKEVUSF9ITEVOICsgc2l6ZW9mIChzdHJ1Y3QgYm9vdHBfdCkgLSBCT09UUF9WRU5ET1JfTEVOKSkKLSNlbHNlCi0JICAgICAgJiYgKG5pYy5wYWNrZXRsZW4KLQkJICA+PSAoRVRIX0hMRU4gKyBzaXplb2YgKHN0cnVjdCBib290cF90KSAtIERIQ1BfT1BUX0xFTikpCi0jZW5kaWYgLyogISBOT19ESENQX1NVUFBPUlQgKi8KLQkgICAgICAmJiB1ZHAtPmRlc3QgPT0gaHRvbnMgKEJPT1RQX0NMSUVOVCkKLQkgICAgICAmJiBib290cHJlcGx5LT5icF9vcCA9PSBCT09UUF9SRVBMWQotCSAgICAgICYmIGJvb3RwcmVwbHktPmJwX3hpZCA9PSB4aWQKLQkgICAgICAmJiAoISBncnViX21lbWNtcCAoYnJvYWRjYXN0LCBib290cHJlcGx5LT5icF9od2FkZHIsIEVUSF9BTEVOKQotCQkgIHx8ICEgZ3J1Yl9tZW1jbXAgKGFycHRhYmxlW0FSUF9DTElFTlRdLm5vZGUsCi0JCQkJICAgIGJvb3RwcmVwbHktPmJwX2h3YWRkciwgRVRIX0FMRU4pKSkKLQkgICAgewotI2lmZGVmIERFQlVHCi0JICAgICAgZ3J1Yl9wcmludGYgKCJCT09UUCBwYWNrZXQgd2FzIHJlY2VpdmVkLlxuIik7Ci0jZW5kaWYKLQkgICAgICBhcnB0YWJsZVtBUlBfQ0xJRU5UXS5pcGFkZHIuc19hZGRyCi0JCT0gYm9vdHByZXBseS0+YnBfeWlhZGRyLnNfYWRkcjsKLSNpZm5kZWYJTk9fREhDUF9TVVBQT1JUCi0JICAgICAgZGhjcF9hZGRyLnNfYWRkciA9IGJvb3RwcmVwbHktPmJwX3lpYWRkci5zX2FkZHI7Ci0jaWZkZWYgREVCVUcKLQkgICAgICBldGhlcmJvb3RfcHJpbnRmICgiZGhjcF9hZGRyID0gJUBcbiIsIGRoY3BfYWRkci5zX2FkZHIpOwotI2VuZGlmCi0jZW5kaWYgLyogISBOT19ESENQX1NVUFBPUlQgKi8KLQkgICAgICBuZXRtYXNrID0gZGVmYXVsdF9uZXRtYXNrICgpOwotCSAgICAgIGFycHRhYmxlW0FSUF9TRVJWRVJdLmlwYWRkci5zX2FkZHIKLQkJPSBib290cHJlcGx5LT5icF9zaWFkZHIuc19hZGRyOwotCSAgICAgIC8qIEtpbGwgYXJwLiAgKi8KLQkgICAgICBncnViX21lbXNldCAoYXJwdGFibGVbQVJQX1NFUlZFUl0ubm9kZSwgMCwgRVRIX0FMRU4pOwotCSAgICAgIGFycHRhYmxlW0FSUF9HQVRFV0FZXS5pcGFkZHIuc19hZGRyCi0JCT0gYm9vdHByZXBseS0+YnBfZ2lhZGRyLnNfYWRkcjsKLQkgICAgICAvKiBLaWxsIGFycC4gICovCi0JICAgICAgZ3J1Yl9tZW1zZXQgKGFycHRhYmxlW0FSUF9HQVRFV0FZXS5ub2RlLCAwLCBFVEhfQUxFTik7Ci0KLQkgICAgICBncnViX21lbW1vdmUgKChjaGFyICopIEJPT1RQX0RBVEFfQUREUiwgKGNoYXIgKikgYm9vdHByZXBseSwKLQkJCSAgICBzaXplb2YgKHN0cnVjdCBib290cGRfdCkpOwotI2lmZGVmIE5PX0RIQ1BfU1VQUE9SVAotCSAgICAgIGRlY29kZV9yZmMxNTMzIChCT09UUF9EQVRBX0FERFItPmJvb3RwX3JlcGx5LmJwX3ZlbmQsCi0JCQkgICAgICAwLCBCT09UUF9WRU5ET1JfTEVOICsgTUFYX0JPT1RQX0VYVExFTiwgMSk7Ci0jZWxzZQotCSAgICAgIGRlY29kZV9yZmMxNTMzIChCT09UUF9EQVRBX0FERFItPmJvb3RwX3JlcGx5LmJwX3ZlbmQsCi0JCQkgICAgICAwLCBESENQX09QVF9MRU4gKyBNQVhfQk9PVFBfRVhUTEVOLCAxKTsKLSNlbmRpZiAvKiAhIE5PX0RIQ1BfU1VQUE9SVCAqLwotCSAgICAgIAotCSAgICAgIHJldHVybiAxOwotCSAgICB9Ci0JICAKLQkgIC8qIFRGVFAgPyAqLwotCSAgaWYgKHR5cGUgPT0gQVdBSVRfVEZUUCAmJiBudG9ocyAodWRwLT5kZXN0KSA9PSBpdmFsKQotCSAgICByZXR1cm4gMTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgLyogQ2hlY2sgZm9yIGFib3J0IGtleSBvbmx5IGlmIHRoZSBSeCBxdWV1ZSBpcyBlbXB0eSAtCi0JICAgKiBhcyBsb25nIGFzIHdlIGhhdmUgc29tZXRoaW5nIHRvIHByb2Nlc3MsIGRvbid0Ci0JICAgKiBhc3N1bWUgdGhhdCBzb21ldGhpbmcgZmFpbGVkLiAgSXQgaXMgdW5saWtlbHkgdGhhdAotCSAgICogd2UgaGF2ZSBubyBwcm9jZXNzaW5nIHRpbWUgbGVmdCBiZXR3ZWVuIHBhY2tldHMuICAqLwotCSAgaWYgKGNoZWNra2V5ICgpICE9IC0xICYmIEFTQ0lJX0NIQVIgKGdldGtleSAoKSkgPT0gQ1RSTF9DKQotCSAgICB7Ci0JICAgICAgaXBfYWJvcnQgPSAxOwotCSAgICAgIHJldHVybiAwOwotCSAgICB9Ci0JICAKLQkgIC8qIERvIHRoZSB0aW1lb3V0IGFmdGVyIGF0IGxlYXN0IGEgZnVsbCBxdWV1ZSB3YWxrLiAgKi8KLQkgIGlmICgodGltZW91dCA9PSAwKSB8fCAoY3VycnRpY2tzKCkgPiB0aW1lKSkKLQkgICAgewotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JfQotICAgIH0KLSAgCi0gIHJldHVybiAwOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLURFQ09ERV9SRkMxNTMzIC0gRGVjb2RlcyBSRkMxNTMzIGhlYWRlcgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pbnQKLWRlY29kZV9yZmMxNTMzICh1bnNpZ25lZCBjaGFyICpwLCBpbnQgYmxvY2ssIGludCBsZW4sIGludCBlb2YpCi17Ci0gIHN0YXRpYyB1bnNpZ25lZCBjaGFyICpleHRkYXRhID0gTlVMTCwgKmV4dGVuZCA9IE5VTEw7Ci0gIHVuc2lnbmVkIGNoYXIgKmV4dHBhdGggPSBOVUxMOwotICB1bnNpZ25lZCBjaGFyICplbmRwOwotICAKLSAgaWYgKGJsb2NrID09IDApCi0gICAgewotICAgICAgZW5kX29mX3JmYzE1MzMgPSBOVUxMOwotICAgICAgdmVuZG9yZXh0X2lzdmFsaWQgPSAwOwotICAgICAgCi0gICAgICBpZiAoZ3J1Yl9tZW1jbXAgKHAsIHJmYzE1MzNfY29va2llLCA0KSkKLQkvKiBubyBSRkMgMTUzMyBoZWFkZXIgZm91bmQgKi8KLQlyZXR1cm4gMDsKLSAgICAgIAotICAgICAgcCArPSA0OwotICAgICAgZW5kcCA9IHAgKyBsZW47Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaWYgKGJsb2NrID09IDEpCi0JewotCSAgaWYgKGdydWJfbWVtY21wIChwLCByZmMxNTMzX2Nvb2tpZSwgNCkpCi0JICAgIC8qIG5vIFJGQyAxNTMzIGhlYWRlciBmb3VuZCAqLwotCSAgICByZXR1cm4gMDsKLQkgIAotCSAgcCArPSA0OwotCSAgbGVuIC09IDQ7Ci0JfQotICAgICAgCi0gICAgICBpZiAoZXh0ZW5kICsgbGVuCi0JICA8PSAoKHVuc2lnbmVkIGNoYXIgKikKLQkgICAgICAmKEJPT1RQX0RBVEFfQUREUi0+Ym9vdHBfZXh0ZW5zaW9uW01BWF9CT09UUF9FWFRMRU5dKSkpCi0JewotCSAgZ3J1Yl9tZW1tb3ZlIChleHRlbmQsIHAsIGxlbik7Ci0JICBleHRlbmQgKz0gbGVuOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBncnViX3ByaW50ZiAoIk92ZXJmbG93IGluIHZlbmRvciBkYXRhIGJ1ZmZlciEgQWJvcnRpbmcuLi5cbiIpOwotCSAgKmV4dGRhdGEgPSBSRkMxNTMzX0VORDsKLQkgIHJldHVybiAwOwotCX0KLSAgICAgIAotICAgICAgcCA9IGV4dGRhdGE7Ci0gICAgICBlbmRwID0gZXh0ZW5kOwotICAgIH0KLQotICBpZiAoISBlb2YpCi0gICAgcmV0dXJuIC0xOwotICAKLSAgd2hpbGUgKHAgPCBlbmRwKQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGNoYXIgYyA9ICpwOwotICAgICAgCi0gICAgICBpZiAoYyA9PSBSRkMxNTMzX1BBRCkKLQl7Ci0JICBwKys7Ci0JICBjb250aW51ZTsKLQl9Ci0gICAgICBlbHNlIGlmIChjID09IFJGQzE1MzNfRU5EKQotCXsKLQkgIGVuZF9vZl9yZmMxNTMzID0gZW5kcCA9IHA7Ci0JICBjb250aW51ZTsKLQl9Ci0gICAgICBlbHNlIGlmIChjID09IFJGQzE1MzNfTkVUTUFTSykKLQl7Ci0JICBncnViX21lbW1vdmUgKChjaGFyICopICZuZXRtYXNrLCBwICsgMiwgc2l6ZW9mIChpbl9hZGRyKSk7Ci0JfQotICAgICAgZWxzZSBpZiAoYyA9PSBSRkMxNTMzX0dBVEVXQVkpCi0JewotCSAgLyogVGhpcyBpcyBhIGxpdHRsZSBzaW1wbGlzdGljLCBidXQgaXQgd2lsbAotCSAgICAgdXN1YWxseSBiZSBzdWZmaWNpZW50LgotCSAgICAgVGFrZSBvbmx5IHRoZSBmaXJzdCBlbnRyeS4gICovCi0JICBpZiAoVEFHX0xFTiAocCkgPj0gc2l6ZW9mIChpbl9hZGRyKSkKLQkgICAgZ3J1Yl9tZW1tb3ZlICgoY2hhciAqKSAmYXJwdGFibGVbQVJQX0dBVEVXQVldLmlwYWRkciwgcCArIDIsCi0JCQkgIHNpemVvZiAoaW5fYWRkcikpOwotCX0KLSAgICAgIGVsc2UgaWYgKGMgPT0gUkZDMTUzM19FWFRFTlNJT05QQVRIKQotCWV4dHBhdGggPSBwOwotI2lmbmRlZglOT19ESENQX1NVUFBPUlQKLSAgICAgIGVsc2UgaWYgKGMgPT0gUkZDMjEzMl9NU0dfVFlQRSkKLQl7Ci0JICBkaGNwX3JlcGx5ID0gKihwICsgMik7Ci0JfQotICAgICAgZWxzZSBpZiAoYyA9PSBSRkMyMTMyX1NSVl9JRCkKLQl7Ci0JICBncnViX21lbW1vdmUgKChjaGFyICopICZkaGNwX3NlcnZlciwgcCArIDIsIHNpemVvZiAoaW5fYWRkcikpOwotI2lmZGVmIERFQlVHCi0JICBldGhlcmJvb3RfcHJpbnRmICgiZGhjcF9zZXJ2ZXIgPSAlQFxuIiwgZGhjcF9zZXJ2ZXIuc19hZGRyKTsKLSNlbmRpZgotCX0KLSNlbmRpZiAvKiAhIE5PX0RIQ1BfU1VQUE9SVCAqLwotICAgICAgZWxzZSBpZiAoYyA9PSBSRkMxNTMzX1ZFTkRPUl9NQUdJQwotCSAgICAgICAmJiBUQUdfTEVOKHApID49IDYKLQkgICAgICAgJiYgISBncnViX21lbWNtcCAocCArIDIsIHZlbmRvcmV4dF9tYWdpYywgNCkKLQkgICAgICAgJiYgcFs2XSA9PSBSRkMxNTMzX1ZFTkRPUl9NQUpPUikKLQl2ZW5kb3JleHRfaXN2YWxpZCsrOwotICAgICAgLyogR1JVQiBub3cgaGFuZGxlcyBpdHMgb3duIHRhZy4gR2V0IHRoZSBuYW1lIG9mIGEgY29uZmlndXJhdGlvbgotCSBmaWxlIGZyb20gdGhlIG5ldHdvcmsuIENvb2wuLi4gICovCi0gICAgICBlbHNlIGlmIChjID09IFJGQzE1MzNfVkVORE9SX0NPTkZJR0ZJTEUpCi0JewotCSAgaW50IGwgPSBUQUdfTEVOIChwKTsKLQkgIAotCSAgLyogRWxpbWluYXRlIHRoZSB0cmFpbGluZyBOVUxzIGFjY29yZGluZyB0byBSRkMgMjEzMi4gICovCi0JICB3aGlsZSAoKihwICsgMiArIGwgLSAxKSA9PSAnXDAwMCcgJiYgbCA+IDApCi0JICAgIGwtLTsKLQkgIAotCSAgLyogWFhYOiBTaG91bGQgY2hlY2sgaWYgTEVOIGlzIGxlc3MgdGhhbiB0aGUgbWF4aW11bSBsZW5ndGgKLQkgICAgIG9mIENPTkZJR19GSUxFLiBUaGlzIGtpbmQgb2Ygcm9idXN0bmVzcyB3aWxsIGJlIGEgZ29hbAotCSAgICAgaW4gR1JVQiAxLjAuICAqLwotCSAgZ3J1Yl9tZW1tb3ZlIChjb25maWdfZmlsZSwgcCArIDIsIGwpOwotCSAgY29uZmlnX2ZpbGVbbF0gPSAwOwotCX0KLSAgICAgIAotICAgICAgcCArPSBUQUdfTEVOIChwKSArIDI7Ci0gICAgfQotICAKLSAgZXh0ZGF0YSA9IGV4dGVuZCA9IGVuZHA7Ci0gIAotICAvKiBQZXJoYXBzIHdlIGNhbiBlbGltaW5hdGUgdGhpcyBiZWNhdXNlIHdlIGRvZXNuJ3QgcmVxdWlyZSBzbwotICAgICBtdWNoIGluZm9ybWF0aW9uLCBidXQgSSBsZWF2ZSB0aGlzIGFsb25lLiAgKi8KLSAgaWYgKGJsb2NrID09IDAgJiYgZXh0cGF0aCAhPSBOVUxMKQotICAgIHsKLSAgICAgIGNoYXIgZm5hbWVbNjRdOwotICAgICAgaW50IGZuYW1lbGVuID0gVEFHX0xFTiAoZXh0cGF0aCk7Ci0gICAgICAKLSAgICAgIHdoaWxlICgqKGV4dHBhdGggKyAyICsgZm5hbWVsZW4gLSAxKSA9PSAnXDAwMCcgJiYgZm5hbWVsZW4gPiAwKQotCWZuYW1lbGVuLS07Ci0gICAgICAKLSAgICAgIGlmIChmbmFtZWxlbiArIDEgPiBzaXplb2YgKGZuYW1lKSkKLQl7Ci0JICBncnViX3ByaW50ZiAoIlRvbyBsb25nIGZpbGUgbmFtZSBmb3IgRXh0ZW5zaW9ucyBQYXRoXG4iKTsKLQkgIHJldHVybiAwOwotCX0KLSAgICAgIGVsc2UgaWYgKCEgZm5hbWVsZW4pCi0JewotCSAgZ3J1Yl9wcmludGYgKCJFbXB0eSBmaWxlIG5hbWUgZm9yIEV4dGVuc2lvbnMgUGF0aFxuIik7Ci0JICByZXR1cm4gMDsKLQl9Ci0gICAgICAKLSAgICAgIGdydWJfbWVtbW92ZSAoZm5hbWUsIGV4dHBhdGggKyAyLCBmbmFtZWxlbik7Ci0gICAgICBmbmFtZVtmbmFtZWxlbl0gPSAnXDAwMCc7Ci0gICAgICBncnViX3ByaW50ZiAoIkxvYWRpbmcgQk9PVFAtZXh0ZW5zaW9uIGZpbGU6ICVzXG4iLCBmbmFtZSk7Ci0gICAgICB0ZnRwIChmbmFtZSwgZGVjb2RlX3JmYzE1MzMpOwotICAgIH0KLSAgCi0gIC8qIFByb2NlZWQgd2l0aCBuZXh0IGJsb2NrLiAgKi8KLSAgcmV0dXJuIC0xOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLUlQQ0hLU1VNIC0gQ2hlY2tzdW0gSVAgSGVhZGVyCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB1bnNpZ25lZCBzaG9ydCAKLWlwY2hrc3VtICh1bnNpZ25lZCBzaG9ydCAqaXAsIGludCBsZW4pCi17Ci0gIHVuc2lnbmVkIGxvbmcgc3VtID0gMDsKLSAgbGVuID4+PSAxOwotICB3aGlsZSAobGVuLS0pCi0gICAgewotICAgICAgc3VtICs9ICooaXArKyk7Ci0gICAgICBpZiAoc3VtID4gMHhGRkZGKQotCXN1bSAtPSAweEZGRkY7Ci0gICAgfQotICByZXR1cm4gKH5zdW0pICYgMHgwMDAwRkZGRjsKLX0KLQotI2RlZmluZSBUV09fU0VDT05EX0RJVklTT1IgKDIxNDc0ODM2NDdsL1RJQ0tTX1BFUl9TRUMpCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkZDMjEzMV9TTEVFUF9JTlRFUlZBTCAtIHNsZWVwIGZvciBleHBvdGVudGlhbGx5IGxvbmdlciB0aW1lcwotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1sb25nCi1yZmMyMTMxX3NsZWVwX2ludGVydmFsIChpbnQgYmFzZSwgaW50IGV4cCkKLXsKLSAgc3RhdGljIGxvbmcgc2VlZCA9IDA7Ci0gIGxvbmcgcTsKLSAgdW5zaWduZWQgbG9uZyB0bW87Ci0gIAotI2lmZGVmIEJBQ0tPRkZfTElNSVQKLSAgaWYgKGV4cCA+IEJBQ0tPRkZfTElNSVQpCi0gICAgZXhwID0gQkFDS09GRl9MSU1JVDsKLSNlbmRpZgotICBpZiAoIXNlZWQpCi0gICAgLyogSW5pdGlhbGl6ZSBsaW5lYXIgY29uZ3J1ZW50aWFsIGdlbmVyYXRvciAqLwotICAgIHNlZWQgPSAoY3VycnRpY2tzICgpICsgKigobG9uZyAqKSAmYXJwdGFibGVbQVJQX0NMSUVOVF0ubm9kZSkKLQkgICAgKyAoKHNob3J0ICopIGFycHRhYmxlW0FSUF9DTElFTlRdLm5vZGUpWzJdKTsKLSAgLyogc2ltcGxpZmllZCB2ZXJzaW9uIG9mIHRoZSBMQ0cgZ2l2ZW4gaW4gQnJ1Y2UgU2NobmVpZXIncwotICAgICAiQXBwbGllZCBDcnlwdG9ncmFwaHkiICovCi0gIHEgPSBzZWVkIC8gNTM2Njg7Ci0gIGlmICgoc2VlZCA9IDQwMDE0ICogKHNlZWQgLSA1MzY2OCAqIHEpIC0gMTIyMTEgKnEgKSA8IDApCi0gICAgc2VlZCArPSAyMTQ3NDgzNTYzTDsKLSAgdG1vID0gKGJhc2UgPDwgZXhwKSArIChUSUNLU19QRVJfU0VDIC0gKHNlZWQgLyBUV09fU0VDT05EX0RJVklTT1IpKTsKLSAgcmV0dXJuIHRtbzsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1DTEVBTlVQIC0gc2h1dCBkb3duIG5ldHdvcmtpbmcKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZAotY2xlYW51cF9uZXQgKHZvaWQpCi17Ci0gIGlmIChuZXR3b3JrX3JlYWR5KQotICAgIHsKLSAgICAgIC8qIFN0b3AgcmVjZWl2aW5nIHBhY2tldHMuICAqLwotICAgICAgZXRoX2Rpc2FibGUgKCk7Ci0gICAgICBuZXR3b3JrX3JlYWR5ID0gMDsKLSAgICB9Ci19CmRpZmYgLU5hdXIgZ3J1Yi0wLjk3Lm9yaWcvbmV0Ym9vdC9taWkuaCBncnViLTAuOTcvbmV0Ym9vdC9taWkuaAotLS0gZ3J1Yi0wLjk3Lm9yaWcvbmV0Ym9vdC9taWkuaAkxOTcwLTAxLTAxIDAwOjAwOjAwLjAwMDAwMDAwMCArMDAwMAorKysgZ3J1Yi0wLjk3L25ldGJvb3QvbWlpLmgJMjAwNS0wOC0zMSAxOTowMzozNS4wMDAwMDAwMDAgKzAwMDAKQEAgLTAsMCArMSwxMDUgQEAKKy8qCisgKiBsaW51eC9taWkuaDogZGVmaW5pdGlvbnMgZm9yIE1JSS1jb21wYXRpYmxlIHRyYW5zY2VpdmVycworICogT3JpZ2luYWxseSBkcml2ZXJzL25ldC9zdW5obWUuaC4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTksIDIwMDEgRGF2aWQgUy4gTWlsbGVyIChkYXZlbUByZWRoYXQuY29tKQorICoKKyAqIENvcGllZCBGb3JtIExpbnV4IDIuNC4yNSBhbiB1bm5lZWRlZCBpdGVtcyByZW1vdmVkIGJ5OgorICogVGltb3RoeSBMZWdnZSAodGltbGVnZ2UgYXQgZXRoZXJib290IGRvdCBvcmcpCisgKgorICogMDMvMjYvMjAwNAorICovCisKKy8qIEdlbmVyaWMgTUlJIHJlZ2lzdGVycy4gKi8KKworI2RlZmluZSBNSUlfQk1DUiAgICAgICAgICAgIDB4MDAJLyogQmFzaWMgbW9kZSBjb250cm9sIHJlZ2lzdGVyICovCisjZGVmaW5lIE1JSV9CTVNSICAgICAgICAgICAgMHgwMQkvKiBCYXNpYyBtb2RlIHN0YXR1cyByZWdpc3RlciAgKi8KKyNkZWZpbmUgTUlJX1BIWVNJRDEgICAgICAgICAweDAyICAgICAgICAvKiBQSFlTIElEIDEgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTUlJX1BIWVNJRDIgICAgICAgICAweDAzICAgICAgICAvKiBQSFlTIElEIDIgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTUlJX0FEVkVSVElTRSAgICAgICAweDA0CS8qIEFkdmVydGlzZW1lbnQgY29udHJvbCByZWcgICAqLworI2RlZmluZSBNSUlfTFBBICAgICAgICAgICAgIDB4MDUJLyogTGluayBwYXJ0bmVyIGFiaWxpdHkgcmVnICAgICovCisjZGVmaW5lIE1JSV9FWFBBTlNJT04gICAgICAgMHgwNiAgICAgICAgLyogRXhwYW5zaW9uIHJlZ2lzdGVyICAgICAgICAgICovCisjZGVmaW5lIE1JSV9EQ09VTlRFUiAgICAgICAgMHgxMiAgICAgICAgLyogRGlzY29ubmVjdCBjb3VudGVyICAgICAgICAgICovCisjZGVmaW5lIE1JSV9GQ1NDT1VOVEVSICAgICAgMHgxMyAgICAgICAgLyogRmFsc2UgY2FycmllciBjb3VudGVyICAgICAgICovCisjZGVmaW5lIE1JSV9OV0FZVEVTVCAgICAgICAgMHgxNCAgICAgICAgLyogTi13YXkgYXV0by1uZWcgdGVzdCByZWcgICAgICovCisjZGVmaW5lIE1JSV9SRVJSQ09VTlRFUiAgICAgMHgxNSAgICAgICAgLyogUmVjZWl2ZSBlcnJvciBjb3VudGVyICAgICAgICovCisjZGVmaW5lIE1JSV9TUkVWSVNJT04gICAgICAgMHgxNiAgICAgICAgLyogU2lsaWNvbiByZXZpc2lvbiAgICAgICAgICAgICovCisjZGVmaW5lIE1JSV9SRVNWMSAgICAgICAgICAgMHgxNyAgICAgICAgLyogUmVzZXJ2ZWQuLi4gICAgICAgICAgICAgICAgICovCisjZGVmaW5lIE1JSV9MQlJFUlJPUiAgICAgICAgMHgxOCAgICAgICAgLyogTHBiYWNrLCByeCwgYnlwYXNzIGVycm9yICAgICovCisjZGVmaW5lIE1JSV9QSFlBRERSICAgICAgICAgMHgxOSAgICAgICAgLyogUEhZIGFkZHJlc3MgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIE1JSV9SRVNWMiAgICAgICAgICAgMHgxYSAgICAgICAgLyogUmVzZXJ2ZWQuLi4gICAgICAgICAgICAgICAgICovCisjZGVmaW5lIE1JSV9UUElTVEFUVVMgICAgICAgMHgxYiAgICAgICAgLyogVFBJIHN0YXR1cyBmb3IgMTBtYnBzICAgICAgICovCisjZGVmaW5lIE1JSV9OQ09ORklHICAgICAgICAgMHgxYyAgICAgICAgLyogTmV0d29yayBpbnRlcmZhY2UgY29uZmlnICAgICovCisKKy8qIEJhc2ljIG1vZGUgY29udHJvbCByZWdpc3Rlci4gKi8KKyNkZWZpbmUgQk1DUl9SRVNWICAgICAgICAgICAgICAgMHgwMDdmICAvKiBVbnVzZWQuLi4gICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQk1DUl9DVFNUICAgICAgICAgICAgICAgMHgwMDgwICAvKiBDb2xsaXNpb24gdGVzdCAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQk1DUl9GVUxMRFBMWCAgICAgICAgICAgMHgwMTAwCS8qIEZ1bGwgZHVwbGV4ICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBCTUNSX0FOUkVTVEFSVCAgICAgICAgICAweDAyMDAJLyogQXV0byBuZWdvdGlhdGlvbiByZXN0YXJ0ICAgICovCisjZGVmaW5lIEJNQ1JfSVNPTEFURSAgICAgICAgICAgIDB4MDQwMCAgLyogRGlzY29ubmVjdCBEUDgzODQwIGZyb20gTUlJICovCisjZGVmaW5lIEJNQ1JfUERPV04gICAgICAgICAgICAgIDB4MDgwMCAgLyogUG93ZXJkb3duIHRoZSBEUDgzODQwICAgICAgICovCisjZGVmaW5lIEJNQ1JfQU5FTkFCTEUgICAgICAgICAgIDB4MTAwMAkvKiBFbmFibGUgYXV0byBuZWdvdGlhdGlvbiAgICAgKi8KKyNkZWZpbmUgQk1DUl9TUEVFRDEwMCAgICAgICAgICAgMHgyMDAwCS8qIFNlbGVjdCAxMDBNYnBzICAgICAgICAgICAgICAqLworI2RlZmluZSBCTUNSX0xPT1BCQUNLICAgICAgICAgICAweDQwMDAgIC8qIFRYRCBsb29wYmFjayBiaXRzICAgICAgICAgICAqLworI2RlZmluZSBCTUNSX1JFU0VUICAgICAgICAgICAgICAweDgwMDAJLyogUmVzZXQgdGhlIERQODM4NDAgICAgICAgICAgICovCisKKy8qIEJhc2ljIG1vZGUgc3RhdHVzIHJlZ2lzdGVyLiAqLworI2RlZmluZSBCTVNSX0VSQ0FQICAgICAgICAgICAgICAweDAwMDEgIC8qIEV4dC1yZWcgY2FwYWJpbGl0eSAgICAgICAgICAqLworI2RlZmluZSBCTVNSX0pDRCAgICAgICAgICAgICAgICAweDAwMDIgIC8qIEphYmJlciBkZXRlY3RlZCAgICAgICAgICAgICAqLworI2RlZmluZSBCTVNSX0xTVEFUVVMgICAgICAgICAgICAweDAwMDQgIC8qIExpbmsgc3RhdHVzICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBCTVNSX0FORUdDQVBBQkxFICAgICAgICAweDAwMDggIC8qIEFibGUgdG8gZG8gYXV0by1uZWdvdGlhdGlvbiAqLworI2RlZmluZSBCTVNSX1JGQVVMVCAgICAgICAgICAgICAweDAwMTAgIC8qIFJlbW90ZSBmYXVsdCBkZXRlY3RlZCAgICAgICAqLworI2RlZmluZSBCTVNSX0FORUdDT01QTEVURSAgICAgICAweDAwMjAgIC8qIEF1dG8tbmVnb3RpYXRpb24gY29tcGxldGUgICAqLworI2RlZmluZSBCTVNSX1JFU1YgICAgICAgICAgICAgICAweDA3YzAgIC8qIFVudXNlZC4uLiAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBCTVNSXzEwSEFMRiAgICAgICAgICAgICAweDA4MDAgIC8qIENhbiBkbyAxMG1icHMsIGhhbGYtZHVwbGV4ICAqLworI2RlZmluZSBCTVNSXzEwRlVMTCAgICAgICAgICAgICAweDEwMDAgIC8qIENhbiBkbyAxMG1icHMsIGZ1bGwtZHVwbGV4ICAqLworI2RlZmluZSBCTVNSXzEwMEhBTEYgICAgICAgICAgICAweDIwMDAgIC8qIENhbiBkbyAxMDBtYnBzLCBoYWxmLWR1cGxleCAqLworI2RlZmluZSBCTVNSXzEwMEZVTEwgICAgICAgICAgICAweDQwMDAgIC8qIENhbiBkbyAxMDBtYnBzLCBmdWxsLWR1cGxleCAqLworI2RlZmluZSBCTVNSXzEwMEJBU0U0ICAgICAgICAgICAweDgwMDAgIC8qIENhbiBkbyAxMDBtYnBzLCA0ayBwYWNrZXRzICAqLworCisvKiBBZHZlcnRpc2VtZW50IGNvbnRyb2wgcmVnaXN0ZXIuICovCisjZGVmaW5lIEFEVkVSVElTRV9TTENUICAgICAgICAgIDB4MDAxZiAgLyogU2VsZWN0b3IgYml0cyAgICAgICAgICAgICAgICovCisjZGVmaW5lIEFEVkVSVElTRV9DU01BICAgICAgICAgIDB4MDAwMSAgLyogT25seSBzZWxlY3RvciBzdXBwb3J0ZWQgICAgICovCisjZGVmaW5lIEFEVkVSVElTRV8xMEhBTEYgICAgICAgIDB4MDAyMAkvKiBUcnkgZm9yIDEwbWJwcyBoYWxmLWR1cGxleCAgKi8KKyNkZWZpbmUgQURWRVJUSVNFXzEwRlVMTCAgICAgICAgMHgwMDQwCS8qIFRyeSBmb3IgMTBtYnBzIGZ1bGwtZHVwbGV4ICAqLworI2RlZmluZSBBRFZFUlRJU0VfMTAwSEFMRiAgICAgICAweDAwODAJLyogVHJ5IGZvciAxMDBtYnBzIGhhbGYtZHVwbGV4ICovCisjZGVmaW5lIEFEVkVSVElTRV8xMDBGVUxMICAgICAgIDB4MDEwMAkvKiBUcnkgZm9yIDEwMG1icHMgZnVsbC1kdXBsZXggKi8KKyNkZWZpbmUgQURWRVJUSVNFXzEwMEJBU0U0ICAgICAgMHgwMjAwICAvKiBUcnkgZm9yIDEwMG1icHMgNGsgcGFja2V0cyAgKi8KKyNkZWZpbmUgQURWRVJUSVNFX1JFU1YgICAgICAgICAgMHgxYzAwICAvKiBVbnVzZWQuLi4gICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQURWRVJUSVNFX1JGQVVMVCAgICAgICAgMHgyMDAwICAvKiBTYXkgd2UgY2FuIGRldGVjdCBmYXVsdHMgICAgKi8KKyNkZWZpbmUgQURWRVJUSVNFX0xQQUNLICAgICAgICAgMHg0MDAwICAvKiBBY2sgbGluayBwYXJ0bmVycyByZXNwb25zZSAgKi8KKyNkZWZpbmUgQURWRVJUSVNFX05QQUdFICAgICAgICAgMHg4MDAwICAvKiBOZXh0IHBhZ2UgYml0ICAgICAgICAgICAgICAgKi8KKworI2RlZmluZSBBRFZFUlRJU0VfRlVMTCAoQURWRVJUSVNFXzEwMEZVTEwgfCBBRFZFUlRJU0VfMTBGVUxMIHwgXAorCQkJQURWRVJUSVNFX0NTTUEpCisjZGVmaW5lIEFEVkVSVElTRV9BTEwgKEFEVkVSVElTRV8xMEhBTEYgfCBBRFZFUlRJU0VfMTBGVUxMIHwgXAorICAgICAgICAgICAgICAgICAgICAgIEFEVkVSVElTRV8xMDBIQUxGIHwgQURWRVJUSVNFXzEwMEZVTEwpCisKKy8qIExpbmsgcGFydG5lciBhYmlsaXR5IHJlZ2lzdGVyLiAqLworI2RlZmluZSBMUEFfU0xDVCAgICAgICAgICAgICAgICAweDAwMWYgIC8qIFNhbWUgYXMgYWR2ZXJ0aXNlIHNlbGVjdG9yICAqLworI2RlZmluZSBMUEFfMTBIQUxGICAgICAgICAgICAgICAweDAwMjAgIC8qIENhbiBkbyAxMG1icHMgaGFsZi1kdXBsZXggICAqLworI2RlZmluZSBMUEFfMTBGVUxMICAgICAgICAgICAgICAweDAwNDAgIC8qIENhbiBkbyAxMG1icHMgZnVsbC1kdXBsZXggICAqLworI2RlZmluZSBMUEFfMTAwSEFMRiAgICAgICAgICAgICAweDAwODAgIC8qIENhbiBkbyAxMDBtYnBzIGhhbGYtZHVwbGV4ICAqLworI2RlZmluZSBMUEFfMTAwRlVMTCAgICAgICAgICAgICAweDAxMDAgIC8qIENhbiBkbyAxMDBtYnBzIGZ1bGwtZHVwbGV4ICAqLworI2RlZmluZSBMUEFfMTAwQkFTRTQgICAgICAgICAgICAweDAyMDAgIC8qIENhbiBkbyAxMDBtYnBzIDRrIHBhY2tldHMgICAqLworI2RlZmluZSBMUEFfUkVTViAgICAgICAgICAgICAgICAweDFjMDAgIC8qIFVudXNlZC4uLiAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBMUEFfUkZBVUxUICAgICAgICAgICAgICAweDIwMDAgIC8qIExpbmsgcGFydG5lciBmYXVsdGVkICAgICAgICAqLworI2RlZmluZSBMUEFfTFBBQ0sgICAgICAgICAgICAgICAweDQwMDAgIC8qIExpbmsgcGFydG5lciBhY2tlZCB1cyAgICAgICAqLworI2RlZmluZSBMUEFfTlBBR0UgICAgICAgICAgICAgICAweDgwMDAgIC8qIE5leHQgcGFnZSBiaXQgICAgICAgICAgICAgICAqLworCisjZGVmaW5lIExQQV9EVVBMRVggICAgICAgICAgICAoTFBBXzEwRlVMTCB8IExQQV8xMDBGVUxMKQorI2RlZmluZSBMUEFfMTAwICAgICAgICAgICAgICAgICAgICAgICAoTFBBXzEwMEZVTEwgfCBMUEFfMTAwSEFMRiB8IExQQV8xMDBCQVNFNCkKKworLyogRXhwYW5zaW9uIHJlZ2lzdGVyIGZvciBhdXRvLW5lZ290aWF0aW9uLiAqLworI2RlZmluZSBFWFBBTlNJT05fTldBWSAgICAgICAgICAweDAwMDEgIC8qIENhbiBkbyBOLXdheSBhdXRvLW5lZ28gICAgICAqLworI2RlZmluZSBFWFBBTlNJT05fTENXUCAgICAgICAgICAweDAwMDIgIC8qIEdvdCBuZXcgUlggcGFnZSBjb2RlIHdvcmQgICAqLworI2RlZmluZSBFWFBBTlNJT05fRU5BQkxFTlBBR0UgICAweDAwMDQgIC8qIFRoaXMgZW5hYmxlcyBucGFnZSB3b3JkcyAgICAqLworI2RlZmluZSBFWFBBTlNJT05fTlBDQVBBQkxFICAgICAweDAwMDggIC8qIExpbmsgcGFydG5lciBzdXBwb3J0cyBucGFnZSAqLworI2RlZmluZSBFWFBBTlNJT05fTUZBVUxUUyAgICAgICAweDAwMTAgIC8qIE11bHRpcGxlIGZhdWx0cyBkZXRlY3RlZCAgICAqLworI2RlZmluZSBFWFBBTlNJT05fUkVTViAgICAgICAgICAweGZmZTAgIC8qIFVudXNlZC4uLiAgICAgICAgICAgICAgICAgICAqLworCisvKiBOLXdheSB0ZXN0IHJlZ2lzdGVyLiAqLworI2RlZmluZSBOV0FZVEVTVF9SRVNWMSAgICAgICAgICAweDAwZmYgIC8qIFVudXNlZC4uLiAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBOV0FZVEVTVF9MT09QQkFDSyAgICAgICAweDAxMDAgIC8qIEVuYWJsZSBsb29wYmFjayBmb3IgTi13YXkgICAqLworI2RlZmluZSBOV0FZVEVTVF9SRVNWMiAgICAgICAgICAweGZlMDAgIC8qIFVudXNlZC4uLiAgICAgICAgICAgICAgICAgICAqLworCmRpZmYgLU5hdXIgZ3J1Yi0wLjk3Lm9yaWcvbmV0Ym9vdC9taXNjLmMgZ3J1Yi0wLjk3L25ldGJvb3QvbWlzYy5jCi0tLSBncnViLTAuOTcub3JpZy9uZXRib290L21pc2MuYwkyMDAzLTA3LTA5IDExOjQ1OjM3LjAwMDAwMDAwMCArMDAwMAorKysgZ3J1Yi0wLjk3L25ldGJvb3QvbWlzYy5jCTIwMDUtMDgtMzEgMTk6MDM6MzUuMDAwMDAwMDAwICswMDAwCkBAIC0xOSwzNyArMTksOTAgQEAKIAogLyogQmFzZWQgb24gInNyYy9taXNjLmMiIGluIGV0aGVyYm9vdC01LjAuNS4gICovCiAKLSNkZWZpbmUgR1JVQgkxCi0jaW5jbHVkZSA8ZXRoZXJib290Lmg+CisjaW5jbHVkZSAiZ3J1Yi5oIgorI2luY2x1ZGUgInRpbWVyLmgiCiAKLXZvaWQKLXNsZWVwIChpbnQgc2VjcykKKyNpbmNsdWRlICJuaWMuaCIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSQU5ET00gLSBjb21wdXRlIGEgcmFuZG9tIG51bWJlciBiZXR3ZWVuIDAgYW5kIDIxNDc0ODM2NDdMIG9yIDIxNDc0ODM1NjI/CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludDMyX3QgcmFuZG9tKHZvaWQpCiB7Ci0gIHVuc2lnbmVkIGxvbmcgdG1vID0gY3VycnRpY2tzICgpICsgc2VjczsKKwlzdGF0aWMgaW50MzJfdCBzZWVkID0gMDsKKwlpbnQzMl90IHE7CisJaWYgKCFzZWVkKSAvKiBJbml0aWFsaXplIGxpbmVhciBjb25ncnVlbnRpYWwgZ2VuZXJhdG9yICovCisJCXNlZWQgPSBjdXJydGlja3MoKSArICooaW50MzJfdCAqKSZhcnB0YWJsZVtBUlBfQ0xJRU5UXS5ub2RlCisJCSAgICAgICArICgoaW50MTZfdCAqKWFycHRhYmxlW0FSUF9DTElFTlRdLm5vZGUpWzJdOworCS8qIHNpbXBsaWZpZWQgdmVyc2lvbiBvZiB0aGUgTENHIGdpdmVuIGluIEJydWNlIFNjaG5laWVyJ3MKKwkgICAiQXBwbGllZCBDcnlwdG9ncmFwaHkiICovCisJcSA9IHNlZWQvNTM2Njg7CisJaWYgKChzZWVkID0gNDAwMTQqKHNlZWQtNTM2NjgqcSkgLSAxMjIxMSpxKSA8IDApIHNlZWQgKz0gMjE0NzQ4MzU2M0w7CisJcmV0dXJuIHNlZWQ7Cit9CiAKLSAgd2hpbGUgKGN1cnJ0aWNrcyAoKSA8IHRtbykKLSAgICA7CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1BPTEwgSU5URVJSVVBUSU9OUworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHBvbGxfaW50ZXJydXB0aW9ucyh2b2lkKQoreworCWlmIChjaGVja2tleSgpICE9IC0xICYmIEFTQ0lJX0NIQVIoZ2V0a2V5KCkpID09IEtfSU5UUikgeworCQl1c2VyX2Fib3J0Kys7CisJfQogfQogCi12b2lkCi10d2lkZGxlICh2b2lkKQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitTTEVFUAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHNsZWVwKGludCBzZWNzKQogewotICBzdGF0aWMgdW5zaWduZWQgbG9uZyBsYXN0dGlja3MgPSAwOwotICBzdGF0aWMgaW50IGNvdW50ID0gMDsKLSAgc3RhdGljIGNvbnN0IGNoYXIgdGlkZGxlc1tdPSItXFx8LyI7Ci0gIHVuc2lnbmVkIGxvbmcgdGlja3M7CisJdW5zaWduZWQgbG9uZyB0bW87CiAKLSAgaWYgKGRlYnVnKQotICAgIHsKLSAgICAgIGlmICgodGlja3MgPSBjdXJydGlja3MgKCkpID09IGxhc3R0aWNrcykKLQlyZXR1cm47Ci0gICAgICAKLSAgICAgIGxhc3R0aWNrcyA9IHRpY2tzOwotICAgICAgZ3J1Yl9wdXRjaGFyICh0aWRkbGVzWyhjb3VudCsrKSAmIDNdKTsKLSAgICAgIGdydWJfcHV0Y2hhciAoJ1xiJyk7Ci0gICAgfQorCWZvciAodG1vID0gY3VycnRpY2tzKCkrc2VjcypUSUNLU19QRVJfU0VDOyBjdXJydGlja3MoKSA8IHRtbzsgKSB7CisJCXBvbGxfaW50ZXJydXB0aW9ucygpOworCX0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitJTlRFUlJVUFRJQkxFIFNMRUVQCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgaW50ZXJydXB0aWJsZV9zbGVlcChpbnQgc2VjcykKK3sKKwlwcmludGYoIjxzbGVlcD5cbiIpOworCXJldHVybiBzbGVlcChzZWNzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitUV0lERExFCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgdHdpZGRsZSh2b2lkKQoreworI2lmZGVmIEJBUl9QUk9HUkVTUworCXN0YXRpYyBpbnQgY291bnQ9MDsKKwlzdGF0aWMgY29uc3QgY2hhciB0aWRkbGVzW109Ii1cXHwvIjsKKwlzdGF0aWMgdW5zaWduZWQgbG9uZyBsYXN0dGlja3MgPSAwOworCXVuc2lnbmVkIGxvbmcgdGlja3M7CisjZW5kaWYKKyNpZmRlZiBGUkVFQlNEX1BYRUVNVQorCWV4dGVybiBjaGFyIHB4ZWVtdV9uYnBfYWN0aXZlOworCWlmKHB4ZWVtdV9uYnBfYWN0aXZlICE9IDApCisJCXJldHVybjsKKyNlbmRpZgorI2lmZGVmCUJBUl9QUk9HUkVTUworCS8qIExpbWl0IHRoZSBtYXhpbXVtIHJhdGUgYXQgd2hpY2ggY2hhcmFjdGVycyBhcmUgcHJpbnRlZCAqLworCXRpY2tzID0gY3VycnRpY2tzKCk7CisJaWYgKChsYXN0dGlja3MgKyAoVElDS1NfUEVSX1NFQy8xOCkpID4gdGlja3MpCisJCXJldHVybjsKKwlsYXN0dGlja3MgPSB0aWNrczsKKworCXB1dGNoYXIodGlkZGxlc1soY291bnQrKykmM10pOworCXB1dGNoYXIoJ1xiJyk7CisjZWxzZQorCS8vcHV0Y2hhcignLicpOworI2VuZGlmCS8qIEJBUl9QUk9HUkVTUyAqLwogfQogCisKIC8qIEJlY2F1c2UgRXRoZXJib290IHVzZXMgaXRzIG93biBmb3JtYXRzIGZvciB0aGUgcHJpbnRmIGZhbWlseSwKICAgIGRlZmluZSBzZXBhcmF0ZSBkZWZpbml0aW9ucyBmcm9tIEdSVUIuICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC0yNjQsMyArMzE3LDUgQEAKICAgCiAgIHJldHVybiByZXQ7CiB9CisKKwpkaWZmIC1OYXVyIGdydWItMC45Ny5vcmlnL25ldGJvb3QvbmF0c2VtaS5jIGdydWItMC45Ny9uZXRib290L25hdHNlbWkuYwotLS0gZ3J1Yi0wLjk3Lm9yaWcvbmV0Ym9vdC9uYXRzZW1pLmMJMjAwMy0wNy0wOSAxMTo0NTozOC4wMDAwMDAwMDAgKzAwMDAKKysrIGdydWItMC45Ny9uZXRib290L25hdHNlbWkuYwkyMDA1LTA4LTMxIDE5OjUzOjA3LjAwMDAwMDAwMCArMDAwMApAQCAtNDcsMTUgKzQ3LDE1IEBACiAvKiBSZXZpc2lvbiBIaXN0b3J5ICovCiAKIC8qCisgIDEzIERlYyAyMDAzIHRpbWxlZ2dlIDEuMSBFbmFibGVkIE11bHRpY2FzdCBTdXBwb3J0CiAgIDI5IE1heSAyMDAxICBtZGMgICAgIDEuMAogICAgICBJbml0aWFsIFJlbGVhc2UuICBUZXN0ZWQgd2l0aCBOZXRnZWFyIEZBMzExIGFuZCBGQTMxMiBib2FyZHMKLSovDAorKi8KIC8qIEluY2x1ZGVzICovCiAKICNpbmNsdWRlICJldGhlcmJvb3QuaCIKICNpbmNsdWRlICJuaWMuaCIKICNpbmNsdWRlICJwY2kuaCIKLSNpbmNsdWRlICJjYXJkcy5oIgogCiAvKiBkZWZpbmVzICovCiAKQEAgLTcxLDIxICs3MSwxOCBAQAogCiAjZGVmaW5lIE5VTV9SWF9ERVNDICAgIDQgICAgICAgICAgICAgIC8qIE51bWJlciBvZiBSeCBkZXNjcmlwdG9yIHJlZ2lzdGVycy4gKi8KIAotdHlwZWRlZiB1bnNpZ25lZCBjaGFyICB1ODsKLXR5cGVkZWYgICBzaWduZWQgY2hhciAgczg7Ci10eXBlZGVmIHVuc2lnbmVkIHNob3J0IHUxNjsKLXR5cGVkZWYgICBzaWduZWQgc2hvcnQgczE2OwotdHlwZWRlZiB1bnNpZ25lZCBpbnQgICB1MzI7Ci10eXBlZGVmICAgc2lnbmVkIGludCAgIHMzMjsKK3R5cGVkZWYgdWludDhfdCAgICB1ODsKK3R5cGVkZWYgaW50OF90ICAgICBzODsKK3R5cGVkZWYgdWludDE2X3QgICB1MTY7Cit0eXBlZGVmIGludDE2X3QgICAgczE2OwordHlwZWRlZiB1aW50MzJfdCAgIHUzMjsKK3R5cGVkZWYgaW50MzJfdCAgICBzMzI7CiAKIC8qIGhlbHBmdWwgbWFjcm9lcyBpZiBvbiBhIGJpZ19lbmRpYW4gbWFjaGluZSBmb3IgY2hhbmdpbmcgYnl0ZSBvcmRlci4KICAgIG5vdCBzdHJpY3RseSBuZWVkZWQgb24gSW50ZWwgKi8KLSNkZWZpbmUgbGUxNl90b19jcHUodmFsKSAodmFsKQotI2RlZmluZSBjcHVfdG9fbGUzMih2YWwpICh2YWwpCiAjZGVmaW5lIGdldF91bmFsaWduZWQocHRyKSAoKihwdHIpKQogI2RlZmluZSBwdXRfdW5hbGlnbmVkKHZhbCwgcHRyKSAoKHZvaWQpKCAqKHB0cikgPSAodmFsKSApKQogI2RlZmluZSBnZXRfdTE2KHB0cikgKCoodTE2ICopKHB0cikpCi0jZGVmaW5lIHZpcnRfdG9fYnVzKHgpICgodW5zaWduZWQgbG9uZyl4KQogI2RlZmluZSB2aXJ0X3RvX2xlMzJkZXNjKGFkZHIpICB2aXJ0X3RvX2J1cyhhZGRyKQogCiBlbnVtIHBjaXN0dWZmIHsKQEAgLTE2MSw3ICsxNTgsOCBAQAogICAgIEFjY2VwdE11bHRpY2FzdCAgICA9IDB4MDAyMDAwMDAsIAogICAgIEFjY2VwdEFsbE11bHRpY2FzdCA9IDB4MjAwMDAwMDAsCiAgICAgQWNjZXB0QWxsUGh5cyAgICAgID0gMHgxMDAwMDAwMCwgCi0gICAgQWNjZXB0TXlQaHlzICAgICAgID0gMHgwODAwMDAwMAorICAgIEFjY2VwdE15UGh5cyAgICAgICA9IDB4MDgwMDAwMDAsCisgICAgUnhGaWx0ZXJFbmFibGUgICAgID0gMHg4MDAwMDAwMAogfTsKIAogdHlwZWRlZiBzdHJ1Y3QgX0J1ZmZlckRlc2MgewpAQCAtMjA3LDE3ICsyMDUsMTIgQEAKIHN0YXRpYyBCdWZmZXJEZXNjIHR4ZCAgICAgICAgICAgICAgX19hdHRyaWJ1dGVfXyAoKGFsaWduZWQoNCkpKTsKIHN0YXRpYyBCdWZmZXJEZXNjIHJ4ZFtOVU1fUlhfREVTQ10gX19hdHRyaWJ1dGVfXyAoKGFsaWduZWQoNCkpKTsKIAotI2lmZGVmIFVTRV9MT1dNRU1fQlVGRkVSCi0jZGVmaW5lIHR4YiAoKGNoYXIgKikweDEwMDAwIC0gVFhfQlVGX1NJWkUpCi0jZGVmaW5lIHJ4YiAoKGNoYXIgKikweDEwMDAwIC0gTlVNX1JYX0RFU0MqUlhfQlVGX1NJWkUgLSBUWF9CVUZfU0laRSkKLSNlbHNlCiBzdGF0aWMgdW5zaWduZWQgY2hhciB0eGJbVFhfQlVGX1NJWkVdIF9fYXR0cmlidXRlX18gKChhbGlnbmVkKDQpKSk7CiBzdGF0aWMgdW5zaWduZWQgY2hhciByeGJbTlVNX1JYX0RFU0MgKiBSWF9CVUZfU0laRV0gX19hdHRyaWJ1dGVfXyAoKGFsaWduZWQoNCkpKTsKLSNlbmRpZgogCiAvKiBGdW5jdGlvbiBQcm90b3R5cGVzICovCiAKLXN0cnVjdCBuaWMgKm5hdHNlbWlfcHJvYmUoc3RydWN0IG5pYyAqbmljLCB1bnNpZ25lZCBzaG9ydCAqaW9fYWRkcnMsIHN0cnVjdCBwY2lfZGV2aWNlICpwY2kpOworc3RhdGljIGludCBuYXRzZW1pX3Byb2JlKHN0cnVjdCBkZXYgKmRldiwgc3RydWN0IHBjaV9kZXZpY2UgKnBjaSk7CiBzdGF0aWMgaW50IGVlcHJvbV9yZWFkKGxvbmcgYWRkciwgaW50IGxvY2F0aW9uKTsKIHN0YXRpYyBpbnQgbWRpb19yZWFkKGludCBwaHlfaWQsIGludCBsb2NhdGlvbik7CiBzdGF0aWMgdm9pZCBuYXRzZW1pX2luaXQoc3RydWN0IG5pYyAqbmljKTsKQEAgLTIyOCw4ICsyMjEsOSBAQAogc3RhdGljIHZvaWQgbmF0c2VtaV9zZXRfcnhfbW9kZShzdHJ1Y3QgbmljICpuaWMpOwogc3RhdGljIHZvaWQgbmF0c2VtaV9jaGVja19kdXBsZXgoc3RydWN0IG5pYyAqbmljKTsKIHN0YXRpYyB2b2lkIG5hdHNlbWlfdHJhbnNtaXQoc3RydWN0IG5pYyAqbmljLCBjb25zdCBjaGFyICpkLCB1bnNpZ25lZCBpbnQgdCwgdW5zaWduZWQgaW50IHMsIGNvbnN0IGNoYXIgKnApOwotc3RhdGljIGludCAgbmF0c2VtaV9wb2xsKHN0cnVjdCBuaWMgKm5pYyk7Ci1zdGF0aWMgdm9pZCBuYXRzZW1pX2Rpc2FibGUoc3RydWN0IG5pYyAqbmljKTsKK3N0YXRpYyBpbnQgIG5hdHNlbWlfcG9sbChzdHJ1Y3QgbmljICpuaWMsIGludCByZXRyaWV2ZSk7CitzdGF0aWMgdm9pZCBuYXRzZW1pX2Rpc2FibGUoc3RydWN0IGRldiAqZGV2KTsKK3N0YXRpYyB2b2lkIG5hdHNlbWlfaXJxKHN0cnVjdCBuaWMgKm5pYywgaXJxX2FjdGlvbl90IGFjdGlvbik7CiAKIC8qIAogICogRnVuY3Rpb246IG5hdHNlbWlfcHJvYmUKQEAgLTI0NSwyNCArMjM5LDI4IEBACiAgKiBSZXR1cm5zOiAgIHN0cnVjdCBuaWMgKjogICAgICAgICAgcG9pbnRlciB0byBOSUMgZGF0YSBzdHJ1Y3R1cmUKICAqLwogCi1zdHJ1Y3QgbmljICoKLW5hdHNlbWlfcHJvYmUoc3RydWN0IG5pYyAqbmljLCB1bnNpZ25lZCBzaG9ydCAqaW9fYWRkcnMsIHN0cnVjdCBwY2lfZGV2aWNlICpwY2kpCitzdGF0aWMgaW50CituYXRzZW1pX3Byb2JlKHN0cnVjdCBkZXYgKmRldiwgc3RydWN0IHBjaV9kZXZpY2UgKnBjaSkKIHsKKyAgICBzdHJ1Y3QgbmljICpuaWMgPSAoc3RydWN0IG5pYyAqKWRldjsKICAgICBpbnQgaTsKICAgICBpbnQgcHJldl9lZWRhdGE7CiAgICAgdTMyIHRtcDsKIAotICAgIGlmIChpb19hZGRycyA9PSAwIHx8ICppb19hZGRycyA9PSAwKQotICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAocGNpLT5pb2FkZHIgPT0gMCkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBhZGp1c3RfcGNpX2RldmljZShwY2kpOwogCiAgICAgLyogaW5pdGlhbGl6ZSBzb21lIGNvbW1vbmx5IHVzZWQgZ2xvYmFscyAqLwogCQotICAgIGlvYWRkciAgICAgPSAqaW9fYWRkcnMgJiB+MzsKKyAgICBuaWMtPmlycW5vICA9IDA7CisgICAgbmljLT5pb2FkZHIgPSBwY2ktPmlvYWRkciAmIH4zOworCisgICAgaW9hZGRyICAgICA9IHBjaS0+aW9hZGRyICYgfjM7CiAgICAgdmVuZG9yICAgICA9IHBjaS0+dmVuZG9yOwogICAgIGRldl9pZCAgICAgPSBwY2ktPmRldl9pZDsKICAgICBuaWNfbmFtZSAgID0gcGNpLT5uYW1lOwotICAgIAotICAgIGFkanVzdF9wY2lfZGV2aWNlKHBjaSk7CiAKICAgICAvKiBuYXRzZW1pIGhhcyBhIG5vbi1zdGFuZGFyZCBQTSBjb250cm9sIHJlZ2lzdGVyCiAgICAgICogaW4gUENJIGNvbmZpZyBzcGFjZS4gIFNvbWUgYm9hcmRzIGFwcGFyZW50bHkgbmVlZApAQCAtMzE3LDEyICszMTUsMTIgQEAKICAgICAvKiBpbml0aWFsaXplIGRldmljZSAqLwogICAgIG5hdHNlbWlfaW5pdChuaWMpOwogCi0gICAgbmljLT5yZXNldCAgICA9IG5hdHNlbWlfaW5pdDsKKyAgICBkZXYtPmRpc2FibGUgID0gbmF0c2VtaV9kaXNhYmxlOwogICAgIG5pYy0+cG9sbCAgICAgPSBuYXRzZW1pX3BvbGw7CiAgICAgbmljLT50cmFuc21pdCA9IG5hdHNlbWlfdHJhbnNtaXQ7Ci0gICAgbmljLT5kaXNhYmxlICA9IG5hdHNlbWlfZGlzYWJsZTsKKyAgICBuaWMtPmlycSAgICAgID0gbmF0c2VtaV9pcnE7CiAKLSAgICByZXR1cm4gbmljOworICAgIHJldHVybiAxOwogfQogCiAvKiBSZWFkIHRoZSBFRVBST00gYW5kIE1JSSBNYW5hZ2VtZW50IERhdGEgSS9PIChNRElPKSBpbnRlcmZhY2VzLgpAQCAtNDUyLDcgKzQ1MCw3IEBACiAgKiBSZXR1cm5zOiAgIHZvaWQuCiAgKi8KIHN0YXRpYyB2b2lkIAotbmF0c2VtaV9yZXNldChzdHJ1Y3QgbmljICpuaWMpCituYXRzZW1pX3Jlc2V0KHN0cnVjdCBuaWMgKm5pYyBfX3VudXNlZCkKIHsKICAgICBvdXRsKENoaXBSZXNldCwgaW9hZGRyICsgQ2hpcENtZCk7CiAJCkBAIC01MDQsMTQgKzUwMiwxNCBAQAogICovCiAKIHN0YXRpYyB2b2lkCi1uYXRzZW1pX2luaXRfdHhkKHN0cnVjdCBuaWMgKm5pYykKK25hdHNlbWlfaW5pdF90eGQoc3RydWN0IG5pYyAqbmljIF9fdW51c2VkKQogewogICAgIHR4ZC5saW5rICAgPSAodTMyKSAwOwogICAgIHR4ZC5jbWRzdHMgPSAodTMyKSAwOwotICAgIHR4ZC5idWZwdHIgPSAodTMyKSAmdHhiWzBdOworICAgIHR4ZC5idWZwdHIgPSB2aXJ0X3RvX2J1cygmdHhiWzBdKTsKIAogICAgIC8qIGxvYWQgVHJhbnNtaXQgRGVzY3JpcHRvciBSZWdpc3RlciAqLwotICAgIG91dGwoKHUzMikgJnR4ZCwgaW9hZGRyICsgVHhSaW5nUHRyKTsgCisgICAgb3V0bCh2aXJ0X3RvX2J1cygmdHhkKSwgaW9hZGRyICsgVHhSaW5nUHRyKTsgCiAgICAgaWYgKG5hdHNlbWlfZGVidWcgPiAxKQogICAgICAgICBwcmludGYoIm5hdHNlbWlfaW5pdF90eGQ6IFRYIGRlc2NyaXB0b3IgcmVnaXN0ZXIgbG9hZGVkIHdpdGg6ICVYXG4iLCAKICAgICAgICAgICAgICAgIGlubChpb2FkZHIgKyBUeFJpbmdQdHIpKTsKQEAgLTUyNyw3ICs1MjUsNyBAQAogICovCiAgCiBzdGF0aWMgdm9pZCAKLW5hdHNlbWlfaW5pdF9yeGQoc3RydWN0IG5pYyAqbmljKSAKK25hdHNlbWlfaW5pdF9yeGQoc3RydWN0IG5pYyAqbmljIF9fdW51c2VkKSAKIHsgCiAgICAgaW50IGk7CiAKQEAgLTUzNSwxNiArNTMzLDE2IEBACiAKICAgICAvKiBpbml0IFJYIGRlc2NyaXB0b3IgKi8KICAgICBmb3IgKGkgPSAwOyBpIDwgTlVNX1JYX0RFU0M7IGkrKykgewotICAgICAgICByeGRbaV0ubGluayAgID0gKGkrMSA8IE5VTV9SWF9ERVNDKSA/ICh1MzIpICZyeGRbaSsxXSA6ICh1MzIpICZyeGRbMF07CisgICAgICAgIHJ4ZFtpXS5saW5rICAgPSB2aXJ0X3RvX2J1cygoaSsxIDwgTlVNX1JYX0RFU0MpID8gJnJ4ZFtpKzFdIDogJnJ4ZFswXSk7CiAgICAgICAgIHJ4ZFtpXS5jbWRzdHMgPSAodTMyKSBSWF9CVUZfU0laRTsKLSAgICAgICAgcnhkW2ldLmJ1ZnB0ciA9ICh1MzIpICZyeGJbaSpSWF9CVUZfU0laRV07CisgICAgICAgIHJ4ZFtpXS5idWZwdHIgPSB2aXJ0X3RvX2J1cygmcnhiW2kqUlhfQlVGX1NJWkVdKTsKICAgICAgICAgaWYgKG5hdHNlbWlfZGVidWcgPiAxKQogICAgICAgICAgICAgcHJpbnRmKCJuYXRzZW1pX2luaXRfcnhkOiByeGRbJWRdPSVYIGxpbms9JVggY21kc3RzPSVYIGJ1ZnB0cj0lWFxuIiwgCiAgICAgICAgICAgICAgICAgICAgaSwgJnJ4ZFtpXSwgcnhkW2ldLmxpbmssIHJ4ZFtpXS5jbWRzdHMsIHJ4ZFtpXS5idWZwdHIpOwogICAgIH0KIAogICAgIC8qIGxvYWQgUmVjZWl2ZSBEZXNjcmlwdG9yIFJlZ2lzdGVyICovCi0gICAgb3V0bCgodTMyKSAmcnhkWzBdLCBpb2FkZHIgKyBSeFJpbmdQdHIpOworICAgIG91dGwodmlydF90b19idXMoJnJ4ZFswXSksIGlvYWRkciArIFJ4UmluZ1B0cik7CiAKICAgICBpZiAobmF0c2VtaV9kZWJ1ZyA+IDEpCiAgICAgICAgIHByaW50ZigibmF0c2VtaV9pbml0X3J4ZDogUlggZGVzY3JpcHRvciByZWdpc3RlciBsb2FkZWQgd2l0aDogJVhcbiIsIApAQCAtNTYyLDE0ICs1NjAsMTUgQEAKICAqIFJldHVybnM6ICAgdm9pZC4KICAqLwogCi1zdGF0aWMgdm9pZCBuYXRzZW1pX3NldF9yeF9tb2RlKHN0cnVjdCBuaWMgKm5pYykKK3N0YXRpYyB2b2lkIG5hdHNlbWlfc2V0X3J4X21vZGUoc3RydWN0IG5pYyAqbmljIF9fdW51c2VkKQogewotICAgIHUzMiByeF9tb2RlID0gQWNjZXB0QnJvYWRjYXN0IHwgQWNjZXB0TXlQaHlzOworICAgIHUzMiByeF9tb2RlID0gUnhGaWx0ZXJFbmFibGUgfCBBY2NlcHRCcm9hZGNhc3QgfAorCSAgICBBY2NlcHRBbGxNdWx0aWNhc3QgfCBBY2NlcHRNeVBoeXM7CiAJCiAgICAgb3V0bChyeF9tb2RlLCBpb2FkZHIgKyBSeEZpbHRlckFkZHIpOwogfQogCi1zdGF0aWMgdm9pZCBuYXRzZW1pX2NoZWNrX2R1cGxleChzdHJ1Y3QgbmljICpuaWMpCitzdGF0aWMgdm9pZCBuYXRzZW1pX2NoZWNrX2R1cGxleChzdHJ1Y3QgbmljICpuaWMgX191bnVzZWQpCiB7CiAgICAgaW50IGR1cGxleCA9IGlubChpb2FkZHIgKyBDaGlwQ29uZmlnKSAmIDB4MjAwMDAwMDAgPyAxIDogMDsKIAkKQEAgLTYwNywxNCArNjA2LDE0IEBACiAJCSB1bnNpZ25lZCBpbnQgcywgICAgIC8qIHNpemUgKi8KIAkJIGNvbnN0IGNoYXIgICpwKSAgICAgLyogUGFja2V0ICovCiB7Ci0gICAgdTMyIHN0YXR1cywgdG8sIG5zdHlwZTsKKyAgICB1MzIgdG8sIG5zdHlwZTsKICAgICB1MzIgdHhfc3RhdHVzOwogICAgIAogICAgIC8qIFN0b3AgdGhlIHRyYW5zbWl0dGVyICovCiAgICAgb3V0bChUeE9mZiwgaW9hZGRyICsgQ2hpcENtZCk7CiAKICAgICAvKiBsb2FkIFRyYW5zbWl0IERlc2NyaXB0b3IgUmVnaXN0ZXIgKi8KLSAgICBvdXRsKCh1MzIpICZ0eGQsIGlvYWRkciArIFR4UmluZ1B0cik7CisgICAgb3V0bCh2aXJ0X3RvX2J1cygmdHhkKSwgaW9hZGRyICsgVHhSaW5nUHRyKTsKICAgICBpZiAobmF0c2VtaV9kZWJ1ZyA+IDEpCiAgICAgICAgIHByaW50ZigibmF0c2VtaV90cmFuc21pdDogVFggZGVzY3JpcHRvciByZWdpc3RlciBsb2FkZWQgd2l0aDogJVhcbiIsIAogICAgICAgICAgICAgICAgaW5sKGlvYWRkciArIFR4UmluZ1B0cikpOwpAQCAtNjM2LDcgKzYzNSw3IEBACiAgICAgICAgIHR4YltzKytdID0gJ1wwJzsKIAogICAgIC8qIHNldCB0aGUgdHJhbnNtaXQgYnVmZmVyIGRlc2NyaXB0b3IgYW5kIGVuYWJsZSBUcmFuc21pdCBTdGF0ZSBNYWNoaW5lICovCi0gICAgdHhkLmJ1ZnB0ciA9ICh1MzIpICZ0eGJbMF07CisgICAgdHhkLmJ1ZnB0ciA9IHZpcnRfdG9fYnVzKCZ0eGJbMF0pOwogICAgIHR4ZC5jbWRzdHMgPSAodTMyKSBPV04gfCBzOwogCiAgICAgLyogcmVzdGFydCB0aGUgdHJhbnNtaXR0ZXIgKi8KQEAgLTY0Nyw3ICs2NDYsNyBAQAogCiAgICAgdG8gPSBjdXJydGlja3MoKSArIFRYX1RJTUVPVVQ7CiAKLSAgICB3aGlsZSAoKCgodm9sYXRpbGUgdTMyKSB0eF9zdGF0dXM9dHhkLmNtZHN0cykgJiBPV04pICYmIChjdXJydGlja3MoKSA8IHRvKSkKKyAgICB3aGlsZSAoKHZvbGF0aWxlIHUzMikgKCB0eF9zdGF0dXM9dHhkLmNtZHN0cyAmIE9XTikgJiYgKGN1cnJ0aWNrcygpIDwgdG8pKQogICAgICAgICAvKiB3YWl0ICovIDsKIAogICAgIGlmIChjdXJydGlja3MoKSA+PSB0bykgewpAQCAtNjc0LDcgKzY3Myw3IEBACiAgKi8KIAogc3RhdGljIGludAotbmF0c2VtaV9wb2xsKHN0cnVjdCBuaWMgKm5pYykKK25hdHNlbWlfcG9sbChzdHJ1Y3QgbmljICpuaWMsIGludCByZXRyaWV2ZSkKIHsKICAgICB1MzIgcnhfc3RhdHVzID0gcnhkW2N1cl9yeF0uY21kc3RzOwogICAgIGludCByZXRzdGF0ID0gMDsKQEAgLTY4NSw2ICs2ODQsOCBAQAogICAgIGlmICghKHJ4X3N0YXR1cyAmIE9XTikpCiAgICAgICAgIHJldHVybiByZXRzdGF0OwogCisgICAgaWYgKCAhIHJldHJpZXZlICkgcmV0dXJuIDE7CisKICAgICBpZiAobmF0c2VtaV9kZWJ1ZyA+IDEpCiAgICAgICAgIHByaW50ZigibmF0c2VtaV9wb2xsOiBnb3QgYSBwYWNrZXQ6IGN1cl9yeDolZCwgc3RhdHVzOiVYXG4iLAogICAgICAgICAgICAgICAgY3VyX3J4LCByeF9zdGF0dXMpOwpAQCAtNzA0LDcgKzcwNSw3IEBACiAKICAgICAvKiByZXR1cm4gdGhlIGRlc2NyaXB0b3IgYW5kIGJ1ZmZlciB0byByZWNlaXZlIHJpbmcgKi8KICAgICByeGRbY3VyX3J4XS5jbWRzdHMgPSBSWF9CVUZfU0laRTsKLSAgICByeGRbY3VyX3J4XS5idWZwdHIgPSAodTMyKSAmcnhiW2N1cl9yeCpSWF9CVUZfU0laRV07CisgICAgcnhkW2N1cl9yeF0uYnVmcHRyID0gdmlydF90b19idXMoJnJ4YltjdXJfcngqUlhfQlVGX1NJWkVdKTsKICAgICAgICAgCiAgICAgaWYgKCsrY3VyX3J4ID09IE5VTV9SWF9ERVNDKQogICAgICAgICBjdXJfcnggPSAwOwpAQCAtNzI1LDggKzcyNiwxMiBAQAogICovCiAKIHN0YXRpYyB2b2lkCi1uYXRzZW1pX2Rpc2FibGUoc3RydWN0IG5pYyAqbmljKQorbmF0c2VtaV9kaXNhYmxlKHN0cnVjdCBkZXYgKmRldikKIHsKKyAgICBzdHJ1Y3QgbmljICpuaWMgPSAoc3RydWN0IG5pYyAqKWRldjsKKyAgICAvKiBtZXJnZSByZXNldCBhbmQgZGlzYWJsZSAqLworICAgIG5hdHNlbWlfaW5pdChuaWMpOworCiAgICAgLyogRGlzYWJsZSBpbnRlcnJ1cHRzIHVzaW5nIHRoZSBtYXNrLiAqLwogICAgIG91dGwoMCwgaW9hZGRyICsgSW50ck1hc2spOwogICAgIG91dGwoMCwgaW9hZGRyICsgSW50ckVuYWJsZSk7CkBAIC03MzcsMyArNzQyLDM5IEBACiAgICAgLyogUmVzdG9yZSBQTUUgZW5hYmxlIGJpdCAqLwogICAgIG91dGwoU2F2ZWRDbGtSdW4sIGlvYWRkciArIENsa1J1bik7CiB9CisKKy8qIEZ1bmN0aW9uOiBuYXRzZW1pX2lycQorICoKKyAqIERlc2NyaXB0aW9uOiBFbmFibGUsIERpc2FibGUsIG9yIEZvcmNlIGludGVycnVwdHMKKyAqICAgIAorICogQXJndW1lbnRzOiBzdHJ1Y3QgbmljICpuaWM6ICAgICAgICAgIE5JQyBkYXRhIHN0cnVjdHVyZQorICogICAgICAgICAgICBpcnFfYWN0aW9uX3QgYWN0aW9uOiAgICAgIHJlcXVlc3RlZCBhY3Rpb24gdG8gcGVyZm9ybQorICoKKyAqIFJldHVybnM6ICAgdm9pZC4KKyAqLworCitzdGF0aWMgdm9pZCAKK25hdHNlbWlfaXJxKHN0cnVjdCBuaWMgKm5pYyBfX3VudXNlZCwgaXJxX2FjdGlvbl90IGFjdGlvbiBfX3VudXNlZCkKK3sKKyAgc3dpdGNoICggYWN0aW9uICkgeworICBjYXNlIERJU0FCTEUgOgorICAgIGJyZWFrOworICBjYXNlIEVOQUJMRSA6CisgICAgYnJlYWs7CisgIGNhc2UgRk9SQ0UgOgorICAgIGJyZWFrOworICB9Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2lkIG5hdHNlbWlfbmljc1tdID0geworUENJX1JPTSgweDEwMGIsIDB4MDAyMCwgImRwODM4MTUiLCAiRFA4MzgxNSIpLAorfTsKKworc3RydWN0IHBjaV9kcml2ZXIgbmF0c2VtaV9kcml2ZXIgPSB7CisJLnR5cGUgICAgID0gTklDX0RSSVZFUiwKKwkubmFtZSAgICAgPSAiTkFUU0VNSSIsCisJLnByb2JlICAgID0gbmF0c2VtaV9wcm9iZSwKKwkuaWRzICAgICAgPSBuYXRzZW1pX25pY3MsCisJLmlkX2NvdW50ID0gc2l6ZW9mKG5hdHNlbWlfbmljcykvc2l6ZW9mKG5hdHNlbWlfbmljc1swXSksCisJLmNsYXNzICAgID0gMCwKK307CmRpZmYgLU5hdXIgZ3J1Yi0wLjk3Lm9yaWcvbmV0Ym9vdC9uZnMuaCBncnViLTAuOTcvbmV0Ym9vdC9uZnMuaAotLS0gZ3J1Yi0wLjk3Lm9yaWcvbmV0Ym9vdC9uZnMuaAkxOTcwLTAxLTAxIDAwOjAwOjAwLjAwMDAwMDAwMCArMDAwMAorKysgZ3J1Yi0wLjk3L25ldGJvb3QvbmZzLmgJMjAwNS0wOC0zMSAxOTowMzozNS4wMDAwMDAwMDAgKzAwMDAKQEAgLTAsMCArMSw2MyBAQAorI2lmbmRlZglfTkZTX0gKKyNkZWZpbmUJX05GU19ICisKKyNkZWZpbmUgU1VOUlBDX1BPUlQJMTExCisKKyNkZWZpbmUgUFJPR19QT1JUTUFQCTEwMDAwMAorI2RlZmluZSBQUk9HX05GUwkxMDAwMDMKKyNkZWZpbmUgUFJPR19NT1VOVAkxMDAwMDUKKworI2RlZmluZSBNU0dfQ0FMTAkwCisjZGVmaW5lIE1TR19SRVBMWQkxCisKKyNkZWZpbmUgUE9SVE1BUF9HRVRQT1JUCTMKKworI2RlZmluZSBNT1VOVF9BRERFTlRSWQkxCisjZGVmaW5lIE1PVU5UX1VNT1VOVEFMTAk0CisKKyNkZWZpbmUgTkZTX0xPT0tVUAk0CisjZGVmaW5lCU5GU19SRUFETElOSwk1CisjZGVmaW5lIE5GU19SRUFECTYKKworI2RlZmluZSBORlNfRkhTSVpFCTMyCisKKyNkZWZpbmUgTkZTRVJSX1BFUk0JMQorI2RlZmluZSBORlNFUlJfTk9FTlQJMgorI2RlZmluZSBORlNFUlJfQUNDRVMJMTMKKyNkZWZpbmUJTkZTRVJSX0lTRElSCTIxCisjZGVmaW5lCU5GU0VSUl9JTlZBTAkyMgorCisvKiBCbG9jayBzaXplIHVzZWQgZm9yIE5GUyByZWFkIGFjY2Vzc2VzLiAgQSBSUEMgcmVwbHkgcGFja2V0IChpbmNsdWRpbmcgIGFsbAorICogaGVhZGVycykgbXVzdCBmaXQgd2l0aGluIGEgc2luZ2xlIEV0aGVybmV0IGZyYW1lIHRvIGF2b2lkIGZyYWdtZW50YXRpb24uCisgKiBDaG9zZW4gdG8gYmUgYSBwb3dlciBvZiB0d28sIGFzIG1vc3QgTkZTIHNlcnZlcnMgYXJlIG9wdGltaXplZCBmb3IgdGhpcy4gICovCisjZGVmaW5lIE5GU19SRUFEX1NJWkUJMTAyNAorCisjZGVmaW5lIE5GU19NQVhMSU5LREVQVEggMTYKKworc3RydWN0IHJwY190IHsKKwlzdHJ1Y3QgaXBoZHIgaXA7CisJc3RydWN0IHVkcGhkciB1ZHA7CisJdW5pb24geworCQl1aW50OF90ICBkYXRhWzMwMF07CQkvKiBsb25nZXN0IFJQQyBjYWxsIG11c3QgZml0ISEhISAqLworCQlzdHJ1Y3QgeworCQkJdWludDMyX3QgaWQ7CisJCQl1aW50MzJfdCB0eXBlOworCQkJdWludDMyX3QgcnBjdmVyczsKKwkJCXVpbnQzMl90IHByb2c7CisJCQl1aW50MzJfdCB2ZXJzOworCQkJdWludDMyX3QgcHJvYzsKKwkJCXVpbnQzMl90IGRhdGFbMV07CisJCX0gY2FsbDsKKwkJc3RydWN0IHsKKwkJCXVpbnQzMl90IGlkOworCQkJdWludDMyX3QgdHlwZTsKKwkJCXVpbnQzMl90IHJzdGF0dXM7CisJCQl1aW50MzJfdCB2ZXJpZmllcjsKKwkJCXVpbnQzMl90IHYyOworCQkJdWludDMyX3QgYXN0YXR1czsKKwkJCXVpbnQzMl90IGRhdGFbMV07CisJCX0gcmVwbHk7CisJfSB1OworfTsKKworI2VuZGlmCS8qIF9ORlNfSCAqLwpkaWZmIC1OYXVyIGdydWItMC45Ny5vcmlnL25ldGJvb3Qvbmk1MDEwLmMgZ3J1Yi0wLjk3L25ldGJvb3Qvbmk1MDEwLmMKLS0tIGdydWItMC45Ny5vcmlnL25ldGJvb3Qvbmk1MDEwLmMJMjAwMy0wNy0wOSAxMTo0NTozOC4wMDAwMDAwMDAgKzAwMDAKKysrIGdydWItMC45Ny9uZXRib290L25pNTAxMC5jCTE5NzAtMDEtMDEgMDA6MDA6MDAuMDAwMDAwMDAwICswMDAwCkBAIC0xLDM3MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLUV0aGVyYm9vdCAtICBCT09UUC9URlRQIEJvb3RzdHJhcCBQcm9ncmFtCi1Ecml2ZXIgZm9yIE5JNTAxMC4KLUNvZGUgZnJlZWx5IHRha2VuIGZyb20gSmFuLVBhc2NhbCB2YW4gQmVzdCBhbmQgQW5kcmVhcyBNb2hyJ3MKLUxpbnV4IE5JNTAxMCBkcml2ZXIuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdAotICogeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICovCi0KLS8qIHRvIGdldCBzb21lIGdsb2JhbCByb3V0aW5lcyBsaWtlIHByaW50ZiAqLwotI2luY2x1ZGUgImV0aGVyYm9vdC5oIgotLyogdG8gZ2V0IHRoZSBpbnRlcmZhY2UgdG8gdGhlIGJvZHkgb2YgdGhlIHByb2dyYW0gKi8KLSNpbmNsdWRlICJuaWMuaCIKLS8qIHRvIGdldCBvdXIgb3duIHByb3RvdHlwZSAqLwotI2luY2x1ZGUgImNhcmRzLmgiCi0KLS8qIG5pNTAxMC5oIGZpbGUgaW5jbHVkZWQgdmVyYmF0aW0gKi8KLS8qCi0gKiBSYWNhbC1JbnRlcmxhbiBuaTUwMTAgRXRoZXJuZXQgZGVmaW5pdGlvbnMKLSAqCi0gKiBUaGlzIGlzIGFuIGV4dGVuc2lvbiB0byB0aGUgTGludXggb3BlcmF0aW5nIHN5c3RlbSwgYW5kIGlzIGNvdmVyZWQgYnkgdGhlCi0gKiBzYW1lIEdudSBQdWJsaWMgTGljZW5zZSB0aGF0IGNvdmVycyB0aGF0IHdvcmsuCi0gKgotICogY29weXJpZ2h0cyAoYykgMTk5NiBieSBKYW4tUGFzY2FsIHZhbiBCZXN0IChqdmJlc3RAd2kubGVpZGVudW5pdi5ubCkKLSAqCi0gKiBJIGhhdmUgZG9uZSBhIGxvb2sgaW4gdGhlIGZvbGxvd2luZyBzb3VyY2VzOgotICogICBjcnlud3ItcGFja2V0LWRyaXZlciBieSBSdXNzIE5lbHNvbgotICovCi0KLSNkZWZpbmUgTkk1MDEwX0JVRlNJWkUJMjA0OAkvKiBudW1iZXIgb2YgYnl0ZXMgaW4gYSBidWZmZXIgKi8KLQotI2RlZmluZSBOSTUwMTBfTUFHSUNWQUwwIDB4MDAgIC8qIG1hZ2ljLXZhbHVlcyBmb3Igbmk1MDEwIGNhcmQgKi8KLSNkZWZpbmUgTkk1MDEwX01BR0lDVkFMMSAweDU1Ci0jZGVmaW5lIE5JNTAxMF9NQUdJQ1ZBTDIgMHhBQQotCi0jZGVmaW5lIFNBX0FERFIwIDB4MDIKLSNkZWZpbmUgU0FfQUREUjEgMHgwNwotI2RlZmluZSBTQV9BRERSMiAweDAxCi0KLS8qIFRoZSBudW1iZXIgb2YgbG93IEkvTyBwb3J0cyB1c2VkIGJ5IHRoZSBuaTUwMTAgZXRoZXJjYXJkLiAqLwotI2RlZmluZSBOSTUwMTBfSU9fRVhURU5UICAgICAgIDMyCi0KLSNkZWZpbmUgUFJJTlRLKHgpIGlmIChOSTUwMTBfREVCVUcpIHByaW50ayB4Ci0jZGVmaW5lIFBSSU5USzIoeCkgaWYgKE5JNTAxMF9ERUJVRz49MikgcHJpbnRrIHgKLSNkZWZpbmUgUFJJTlRLMyh4KSBpZiAoTkk1MDEwX0RFQlVHPj0zKSBwcmludGsgeAotCi0vKiBUaGUgdmFyaW91cyBJRSBjb21tYW5kIHJlZ2lzdGVycyAqLwotI2RlZmluZSBFRExDX1hTVEFUCShpb2FkZHIgKyAweDAwKQkvKiBFRExDIHRyYW5zbWl0IGNzciAqLwotI2RlZmluZSBFRExDX1hDTFIJKGlvYWRkciArIDB4MDApCS8qIEVETEMgdHJhbnNtaXQgIkNsZWFyIElSUSIgKi8KLSNkZWZpbmUgRURMQ19YTUFTSwkoaW9hZGRyICsgMHgwMSkJLyogRURMQyB0cmFuc21pdCAiSVJRIE1hc2tzIiAqLwotI2RlZmluZSBFRExDX1JTVEFUCShpb2FkZHIgKyAweDAyKQkvKiBFRExDIHJlY2VpdmUgY3NyICovCi0jZGVmaW5lIEVETENfUkNMUgkoaW9hZGRyICsgMHgwMikJLyogRURMQyByZWNlaXZlICJDbGVhciBJUlEiICovCi0jZGVmaW5lIEVETENfUk1BU0sJKGlvYWRkciArIDB4MDMpCS8qIEVETEMgcmVjZWl2ZSAiSVJRIE1hc2tzIiAqLwotI2RlZmluZSBFRExDX1hNT0RFCShpb2FkZHIgKyAweDA0KQkvKiBFRExDIHRyYW5zbWl0IE1vZGUgKi8KLSNkZWZpbmUgRURMQ19STU9ERQkoaW9hZGRyICsgMHgwNSkJLyogRURMQyByZWNlaXZlIE1vZGUgKi8KLSNkZWZpbmUgRURMQ19SRVNFVAkoaW9hZGRyICsgMHgwNikJLyogRURMQyBSRVNFVCByZWdpc3RlciAqLwotI2RlZmluZSBFRExDX1REUjEJKGlvYWRkciArIDB4MDcpCS8qICJUaW1lIERvbWFpbiBSZWZsZWN0b21ldHJ5IiByZWcxICovCi0jZGVmaW5lIEVETENfQUREUgkoaW9hZGRyICsgMHgwOCkJLyogRURMQyBzdGF0aW9uIGFkZHJlc3MsIDYgYnl0ZXMgKi8KLQkgCQkJLyogMHgwRSBkb2Vzbid0IGV4aXN0IGZvciByL3cgKi8KLSNkZWZpbmUgRURMQ19URFIyCShpb2FkZHIgKyAweDBmKQkvKiAiVGltZSBEb21haW4gUmVmbGVjdG9tZXRyeSIgcmVnMiAqLwotI2RlZmluZSBJRV9HUAkJKGlvYWRkciArIDB4MTApCS8qIEdQIHBvaW50ZXIgKHdvcmQgcmVnaXN0ZXIpICovCi0JCQkJLyogMHgxMSBpcyAybmQgYnl0ZSBvZiBHUCBQb2ludGVyICovCi0jZGVmaW5lIElFX1JDTlQJCShpb2FkZHIgKyAweDEwKQkvKiBDb3VudCBvZiBieXRlcyBpbiByY3YnZCBwYWNrZXQgKi8KLSAJCQkJLyogMHgxMSBpcyAybmQgYnl0ZSBvZiAiQnl0ZSBDb3VudCIgKi8KLSNkZWZpbmUgSUVfTU1PREUJKGlvYWRkciArIDB4MTIpCS8qIE1lbW9yeSBNb2RlIHJlZ2lzdGVyICovCi0jZGVmaW5lIElFX0RNQV9SU1QJKGlvYWRkciArIDB4MTMpCS8qIElFIERNQSBSZXNldC4gIHdyaXRlIG9ubHkgKi8KLSNkZWZpbmUgSUVfSVNUQVQJKGlvYWRkciArIDB4MTMpCS8qIElFIEludGVycnVwdCBTdGF0dXMuICByZWFkIG9ubHkgKi8KLSNkZWZpbmUgSUVfUkJVRgkJKGlvYWRkciArIDB4MTQpCS8qIElFIFJlY2VpdmUgQnVmZmVyIHBvcnQgKi8KLSNkZWZpbmUgSUVfWEJVRgkJKGlvYWRkciArIDB4MTUpCS8qIElFIFRyYW5zbWl0IEJ1ZmZlciBwb3J0ICovCi0jZGVmaW5lIElFX1NBUFJPTQkoaW9hZGRyICsgMHgxNikJLyogd2luZG93IG9uIHN0YXRpb24gYWRkciBwcm9tICovCi0jZGVmaW5lIElFX1JFU0VUCShpb2FkZHIgKyAweDE3KQkvKiBhbnkgd3JpdGUgY2F1c2VzIEJvYXJkIFJlc2V0ICovCi0KLS8qIGJpdHMgaW4gRURMQ19YU1RBVCwgaW50ZXJydXB0IGNsZWFyIG9uIHdyaXRlLCBzdGF0dXMgd2hlbiByZWFkICovCi0jZGVmaW5lIFhTX1RQT0sJCTB4ODAJLyogdHJhbnNtaXQgcGFja2V0IHN1Y2Nlc3NmdWwgKi8KLSNkZWZpbmUgWFNfQ1MJCTB4NDAJLyogY2FycmllciBzZW5zZSAqLwotI2RlZmluZSBYU19SQ1ZECQkweDIwCS8qIHRyYW5zbWl0dGVkIHBhY2tldCByZWNlaXZlZCAqLwotI2RlZmluZSBYU19TSE9SVAkweDEwCS8qIHRyYW5zbWlzc2lvbiBtZWRpYSBpcyBzaG9ydGVkICovCi0jZGVmaW5lIFhTX1VGTFcJCTB4MDgJLyogdW5kZXJmbG93LiAgaWZmIGZhaWxlZCBib2FyZCAqLwotI2RlZmluZSBYU19DT0xMCQkweDA0CS8qIGNvbGxpc2lvbiBvY2N1cnJlZCAqLwotI2RlZmluZSBYU18xNkNPTEwJMHgwMgkvKiAxNnRoIGNvbGxpc2lvbiBvY2N1cnJlZCAqLwotI2RlZmluZSBYU19QRVJSCQkweDAxCS8qIHBhcml0eSBlcnJvciAqLwotCi0jZGVmaW5lIFhTX0NMUl9VRkxXCTB4MDgJLyogY2xlYXIgdW5kZXJmbG93ICovCi0jZGVmaW5lIFhTX0NMUl9DT0xMCTB4MDQJLyogY2xlYXIgY29sbGlzaW9uICovCi0jZGVmaW5lIFhTX0NMUl8xNkNPTEwJMHgwMgkvKiBjbGVhciAxNnRoIGNvbGxpc2lvbiAqLwotI2RlZmluZSBYU19DTFJfUEVSUgkweDAxCS8qIGNsZWFyIHBhcml0eSBlcnJvciAqLwotCi0vKiBiaXRzIGluIEVETENfWE1BU0ssIG1hc2svZW5hYmxlIHRyYW5zbWl0IGludGVycnVwdHMuICByZWdpc3RlciBpcyByL3cgKi8KLSNkZWZpbmUgWE1fVFBPSwkJMHg4MAkvKiA9MSB0byBlbmFibGUgWG10IFBrdCBPSyBpbnRlcnJ1cHRzICovCi0jZGVmaW5lIFhNX1JDVkQJCTB4MjAJLyogPTEgdG8gZW5hYmxlIFhtdCBQa3QgUmN2ZCBpbnRzICovCi0jZGVmaW5lIFhNX1VGTFcJCTB4MDgJLyogPTEgdG8gZW5hYmxlIFhtdCBVbmRlcmZsb3cgaW50cyAqLwotI2RlZmluZSBYTV9DT0xMCQkweDA0CS8qID0xIHRvIGVuYWJsZSBYbXQgQ29sbGlzaW9uIGludHMgKi8KLSNkZWZpbmUgWE1fQ09MTDE2CTB4MDIJLyogPTEgdG8gZW5hYmxlIFhtdCAxNnRoIENvbGwgaW50cyAqLwotI2RlZmluZSBYTV9QRVJSCQkweDAxCS8qID0xIHRvIGVuYWJsZSBYbXQgUGFyaXR5IEVycm9yIGludHMgKi8KLSAJCQkJLyogbm90ZTogYWx3YXlzIGNsZWFyIHRoaXMgYml0ICovCi0jZGVmaW5lIFhNX0FMTAkJKFhNX1RQT0sgfCBYTV9SQ1ZEIHwgWE1fVUZMVyB8IFhNX0NPTEwgfCBYTV9DT0xMMTYpCi0KLS8qIGJpdHMgaW4gRURMQ19SU1RBVCwgaW50ZXJydXB0IGNsZWFyIG9uIHdyaXRlLCBzdGF0dXMgd2hlbiByZWFkICovCi0jZGVmaW5lIFJTX1BLVF9PSwkweDgwCS8qIHJlY2VpdmVkIGdvb2QgcGFja2V0ICovCi0jZGVmaW5lIFJTX1JTVF9QS1QJMHgxMAkvKiBSRVNFVCBwYWNrZXQgcmVjZWl2ZWQgKi8KLSNkZWZpbmUgUlNfUlVOVAkJMHgwOAkvKiBSdW50IFBrdCByY3ZkLiAgTGVuIDwgNjQgQnl0ZXMgKi8KLSNkZWZpbmUgUlNfQUxJR04JMHgwNAkvKiBBbGlnbm1lbnQgZXJyb3IuIG5vdCA4IGJpdCBhbGlnbmVkICovCi0jZGVmaW5lIFJTX0NSQ19FUlIJMHgwMgkvKiBCYWQgQ1JDIG9uIHJjdmQgcGt0ICovCi0jZGVmaW5lIFJTX09GTFcJCTB4MDEJLyogb3ZlcmZsb3cgZm9yIHJjdiBGSUZPICovCi0jZGVmaW5lIFJTX1ZBTElEX0JJVFMJKCBSU19QS1RfT0sgfCBSU19SU1RfUEtUIHwgUlNfUlVOVCB8IFJTX0FMSUdOIHwgUlNfQ1JDX0VSUiB8IFJTX09GTFcgKQotIAkJCQkvKiBhbGwgdmFsaWQgUlNUQVQgYml0cyAqLwotCi0jZGVmaW5lIFJTX0NMUl9QS1RfT0sJMHg4MAkvKiBjbGVhciByY3ZkIHBhY2tldCBpbnRlcnJ1cHQgKi8KLSNkZWZpbmUgUlNfQ0xSX1JTVF9QS1QJMHgxMAkvKiBjbGVhciBSRVNFVCBwYWNrZXQgcmVjZWl2ZWQgKi8KLSNkZWZpbmUgUlNfQ0xSX1JVTlQJMHgwOAkvKiBjbGVhciBSdW50IFBja3QgcmVjZWl2ZWQgKi8KLSNkZWZpbmUgUlNfQ0xSX0FMSUdOCTB4MDQJLyogY2xlYXIgQWxpZ25tZW50IGVycm9yICovCi0jZGVmaW5lIFJTX0NMUl9DUkNfRVJSCTB4MDIJLyogY2xlYXIgQ1JDIGVycm9yICovCi0jZGVmaW5lIFJTX0NMUl9PRkxXCTB4MDEJLyogY2xlYXIgcmN2IEZJRk8gT3ZlcmZsb3cgKi8KLQotLyogYml0cyBpbiBFRExDX1JNQVNLLCBtYXNrL2VuYWJsZSByZWNlaXZlIGludGVycnVwdHMuICByZWdpc3RlciBpcyByL3cgKi8KLSNkZWZpbmUgUk1fUEtUX09LCTB4ODAJLyogPTEgdG8gZW5hYmxlIHJjdmQgZ29vZCBwYWNrZXQgaW50cyAqLwotI2RlZmluZSBSTV9SU1RfUEtUCTB4MTAJLyogPTEgdG8gZW5hYmxlIFJFU0VUIHBhY2tldCBpbnRzICovCi0jZGVmaW5lIFJNX1JVTlQJCTB4MDgJLyogPTEgdG8gZW5hYmxlIFJ1bnQgUGt0IHJjdmQgaW50cyAqLwotI2RlZmluZSBSTV9BTElHTgkweDA0CS8qID0xIHRvIGVuYWJsZSBBbGlnbm1lbnQgZXJyb3IgaW50cyAqLwotI2RlZmluZSBSTV9DUkNfRVJSCTB4MDIJLyogPTEgdG8gZW5hYmxlIEJhZCBDUkMgZXJyb3IgaW50cyAqLwotI2RlZmluZSBSTV9PRkxXCQkweDAxCS8qID0xIHRvIGVuYWJsZSBvdmVyZmxvdyBlcnJvciBpbnRzICovCi0KLS8qIGJpdHMgaW4gRURMQ19STU9ERSwgc2V0IFJlY2VpdmUgUGFja2V0IG1vZGUuICByZWdpc3RlciBpcyByL3cgKi8KLSNkZWZpbmUgUk1EX1RFU1QJMHg4MAkvKiA9MSBmb3IgQ2hpcCB0ZXN0aW5nLiAgbm9ybWFsbHkgMCAqLwotI2RlZmluZSBSTURfQUREX1NJWgkweDEwCS8qID0xIDUtYnl0ZSBhZGRyIG1hdGNoLiAgbm9ybWFsbHkgMCAqLwotI2RlZmluZSBSTURfRU5fUlVOVAkweDA4CS8qID0xIGVuYWJsZSBydW50IHJjdi4gIG5vcm1hbGx5IDAgKi8KLSNkZWZpbmUgUk1EX0VOX1JTVAkweDA0CS8qID0xIHRvIHJjdiBSRVNFVCBwa3QuICBub3JtYWxseSAwICovCi0KLSNkZWZpbmUgUk1EX1BST01JU0MJMHgwMwkvKiByZWNlaXZlICphbGwqIHBhY2tldHMuICB1bnVzdWFsICovCi0jZGVmaW5lIFJNRF9NVUxUSUNBU1QJMHgwMgkvKiByZWNlaXZlIG11bHRpY2FzdHMgdG9vLiAgdW51c3VhbCAqLwotI2RlZmluZSBSTURfQlJPQURDQVNUCTB4MDEJLyogcmVjZWl2ZSBicm9hZGNhc3RzICYgbm9ybWFsLiB1c3VhbCAqLwotI2RlZmluZSBSTURfTk9fUEFDS0VUUwkweDAwCS8qIGRvbid0IHJlY2VpdmUgYW55IHBhY2tldHMuIHVudXN1YWwgKi8KLQotLyogYml0cyBpbiBFRExDX1hNT0RFLCBzZXQgVHJhbnNtaXQgUGFja2V0IG1vZGUuICByZWdpc3RlciBpcyByL3cgKi8KLSNkZWZpbmUgWE1EX0NPTExfQ05UCTB4ZjAJLyogY29sbCdzIHNpbmNlIHN1Y2Nlc3MuICByZWFkLW9ubHkgKi8KLSNkZWZpbmUgWE1EX0lHX1BBUgkweDA4CS8qID0xIHRvIGlnbm9yZSBwYXJpdHkuICBBTFdBWVMgc2V0ICovCi0jZGVmaW5lIFhNRF9UX01PREUJMHgwNAkvKiA9MSB0byBwb3dlciB4Y3ZyLiBBTFdBWVMgc2V0IHRoaXMgKi8KLSNkZWZpbmUgWE1EX0xCQwkJMHgwMgkvKiA9MSBmb3IgbG9vcGJhY2suICBub3JtYWxseSBzZXQgKi8KLSNkZWZpbmUgWE1EX0RJU19DCTB4MDEJLyogPTEgZGlzYWJsZXMgY29udGVudGlvbi4gbm9ybWFsbHkgMCAqLwotCi0vKiBiaXRzIGluIEVETENfUkVTRVQsIHdyaXRlIG9ubHkgKi8KLSNkZWZpbmUgUlNfUkVTRVQJMHg4MAkvKiA9MSB0byBob2xkIEVETEMgaW4gcmVzZXQgc3RhdGUgKi8KLQotLyogYml0cyBpbiBJRV9NTU9ERSwgd3JpdGUgb25seSAqLwotI2RlZmluZSBNTV9FTl9ETUEJMHg4MAkvKiA9MSBiZWdpbiBETUEgeGZlciwgQ3BsdCBjbHJzIGl0ICovCi0jZGVmaW5lIE1NX0VOX1JDVgkweDQwCS8qID0xIGFsbG93cyBQa3QgcmN2LiAgY2xyJ2QgYnkgcmN2ICovCi0jZGVmaW5lIE1NX0VOX1hNVAkweDIwCS8qID0xIGJlZ2luIFhtdCBwa3QuICBDcGx0IGNscnMgaXQgKi8KLSNkZWZpbmUgTU1fQlVTX1BBR0UJMHgxOAkvKiA9MDAgQUxXQVlTLiAgVXNlZCB3aGVuIE1VWD0xICovCi0jZGVmaW5lIE1NX05FVF9QQUdFCTB4MDYJLyogPTAwIEFMV0FZUy4gIFVzZWQgd2hlbiBNVVg9MCAqLwotI2RlZmluZSBNTV9NVVgJCTB4MDEJLyogPTEgbWVhbnMgUmN2IEJ1ZmYgb24gc3lzdGVtIGJ1cyAqLwotCQkJCS8qID0wIG1lYW5zIFhtdCBCdWZmIG9uIHN5c3RlbSBidXMgKi8KLQotLyogYml0cyBpbiBJRV9JU1RBVCwgcmVhZCBvbmx5ICovCi0jZGVmaW5lIElTX1RESUFHCTB4ODAJLyogPTEgaWYgRGlhZ25vc3RpYyBwcm9ibGVtICovCi0jZGVmaW5lIElTX0VOX1JDVgkweDIwCS8qID0xIHVudGlsIGZyYW1lIGlzIHJjdidkIGNwbHQgKi8KLSNkZWZpbmUgSVNfRU5fWE1UCTB4MTAJLyogPTEgdW50aWwgZnJhbWUgaXMgeG10J2QgY3BsdCAqLwotI2RlZmluZSBJU19FTl9ETUEJMHgwOAkvKiA9MSB1bnRpbCBETUEgaXMgY3BsdCBvciBhYm9ydGVkICovCi0jZGVmaW5lIElTX0RNQV9JTlQJMHgwNAkvKiA9MCBpZmYgRE1BIGRvbmUgaW50ZXJydXB0LiAqLwotI2RlZmluZSBJU19SX0lOVAkweDAyCS8qID0wIGlmZiB1bm1hc2tlZCBSY3YgaW50ZXJydXB0ICovCi0jZGVmaW5lIElTX1hfSU5UCTB4MDEJLyogPTAgaWZmIHVubWFza2VkIFhtdCBpbnRlcnJ1cHQgKi8KLQotLyogTklDIHNwZWNpZmljIHN0YXRpYyB2YXJpYWJsZXMgZ28gaGVyZSAqLwotCi1zdGF0aWMgdW5zaWduZWQgc2hvcnQJCWlvYWRkciA9IDA7Ci1zdGF0aWMgdW5zaWduZWQgaW50CQlidWZzaXplX3JjdiA9IDA7Ci0KLSNpZgkwCi1zdGF0aWMgdm9pZCBzaG93X3JlZ2lzdGVycyh2b2lkKQotewotCXByaW50ZigiWFNUQVQgJWhoWCAiLCBpbmIoRURMQ19YU1RBVCkpOwotCXByaW50ZigiWE1BU0sgJWhoWCAiLCBpbmIoRURMQ19YTUFTSykpOwotCXByaW50ZigiUlNUQVQgJWhoWCAiLCBpbmIoRURMQ19SU1RBVCkpOwotCXByaW50ZigiUk1BU0sgJWhoWCAiLCBpbmIoRURMQ19STUFTSykpOwotCXByaW50ZigiUk1PREUgJWhoWCAiLCBpbmIoRURMQ19STU9ERSkpOwotCXByaW50ZigiWE1PREUgJWhoWCAiLCBpbmIoRURMQ19YTU9ERSkpOwotCXByaW50ZigiSVNUQVQgJWhoWFxuIiwgaW5iKElFX0lTVEFUKSk7Ci19Ci0jZW5kaWYKLQotc3RhdGljIHZvaWQgcmVzZXRfcmVjZWl2ZXIodm9pZCkKLXsKLQlvdXR3KDAsIElFX0dQKTsJCS8qIFJlY2VpdmUgcGFja2V0IGF0IHN0YXJ0IG9mIGJ1ZmZlciAqLwotCW91dGIoUlNfVkFMSURfQklUUywgRURMQ19SQ0xSKTsJLyogQ2xlYXIgYWxsIHBlbmRpbmcgUmN2IGludGVycnVwdHMgKi8KLQlvdXRiKE1NX0VOX1JDViwgSUVfTU1PREUpOyAvKiBFbmFibGUgcmN2ICovCi19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVTRVQgLSBSZXNldCBhZGFwdGVyCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBuaTUwMTBfcmVzZXQoc3RydWN0IG5pYyAqbmljKQotewotCWludAkJaTsKLQotCS8qIFJlc2V0IHRoZSBoYXJkd2FyZSBoZXJlLiAgRG9uJ3QgZm9yZ2V0IHRvIHNldCB0aGUgc3RhdGlvbiBhZGRyZXNzLiAqLwotCW91dGIoUlNfUkVTRVQsIEVETENfUkVTRVQpOwkvKiBIb2xkIHVwIEVETENfUkVTRVQgd2hpbGUgY29uZmlnaW5nIGJvYXJkICovCi0Jb3V0YigwLCBJRV9SRVNFVCk7CS8qIEhhcmR3YXJlIHJlc2V0IG9mIG5pNTAxMCBib2FyZCAqLwotCW91dGIoMCwgRURMQ19YTUFTSyk7CS8qIERpc2FibGUgYWxsIFhtdCBpbnRlcnJ1cHRzICovCi0Jb3V0YigwLCBFRExDX1JNQVNLKTsJLyogRGlzYWJsZSBhbGwgUmN2IGludGVycnVwdCAqLwotCW91dGIoMHhGRiwgRURMQ19YQ0xSKTsJLyogQ2xlYXIgYWxsIHBlbmRpbmcgWG10IGludGVycnVwdHMgKi8KLQlvdXRiKDB4RkYsIEVETENfUkNMUik7CS8qIENsZWFyIGFsbCBwZW5kaW5nIFJjdiBpbnRlcnJ1cHRzICovCi0Jb3V0YihYTURfTEJDLCBFRExDX1hNT0RFKTsJLyogT25seSBsb29wYmFjayB4bWl0cyAqLwotCS8qIFNldCB0aGUgc3RhdGlvbiBhZGRyZXNzICovCi0JZm9yKGkgPSAwOyBpIDwgRVRIX0FMRU47IGkrKykKLQkJb3V0YihuaWMtPm5vZGVfYWRkcltpXSwgRURMQ19BRERSICsgaSk7Ci0Jb3V0YihYTURfSUdfUEFSIHwgWE1EX1RfTU9ERSB8IFhNRF9MQkMsIEVETENfWE1PREUpOyAKLQkJCQkvKiBOb3JtYWwgcGFja2V0IHhtaXQgbW9kZSAqLwotCW91dGIoUk1EX0JST0FEQ0FTVCwgRURMQ19STU9ERSk7Ci0JCQkJLyogUmVjZWl2ZSBicm9hZGNhc3QgYW5kIG5vcm1hbCBwYWNrZXRzICovCi0JcmVzZXRfcmVjZWl2ZXIoKTsKLQlvdXRiKDB4MDAsIEVETENfUkVTRVQpOwkvKiBVbi1yZXNldCB0aGUgbmk1MDEwICovCi19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUE9MTCAtIFdhaXQgZm9yIGEgZnJhbWUKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBpbnQgbmk1MDEwX3BvbGwoc3RydWN0IG5pYyAqbmljKQotewotCWludAkJcmN2X3N0YXQ7Ci0KLQlpZiAoKChyY3Zfc3RhdCA9IGluYihFRExDX1JTVEFUKSkgJiBSU19WQUxJRF9CSVRTKSAhPSBSU19QS1RfT0spIHsKLQkJb3V0YihyY3Zfc3RhdCwgRURMQ19SU1RBVCk7CS8qIENsZWFyIHRoZSBzdGF0dXMgKi8KLQkJcmV0dXJuICgwKTsKLQl9Ci0gICAgICAgIG91dGIocmN2X3N0YXQsIEVETENfUkNMUik7CS8qIENsZWFyIHRoZSBzdGF0dXMgKi8KLQluaWMtPnBhY2tldGxlbiA9IGludyhJRV9SQ05UKTsKLQkvKiBSZWFkIHBhY2tldCBpbnRvIGJ1ZmZlciAqLwotICAgICAgICBvdXRiKE1NX01VWCwgSUVfTU1PREUpOwkvKiBSY3YgYnVmZmVyIHRvIHN5c3RlbSBidXMgKi8KLQlvdXR3KDAsIElFX0dQKTsJCS8qIFNlZWsgdG8gYmVnaW5uaW5nIG9mIHBhY2tldCAqLwotCWluc2IoSUVfUkJVRiwgbmljLT5wYWNrZXQsIG5pYy0+cGFja2V0bGVuKTsgCi0JcmV0dXJuICgxKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1UUkFOU01JVCAtIFRyYW5zbWl0IGEgZnJhbWUKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIG5pNTAxMF90cmFuc21pdChzdHJ1Y3QgbmljICpuaWMsCi0JY29uc3QgY2hhciAqZCwJLyogRGVzdGluYXRpb24gKi8KLQl1bnNpZ25lZCBpbnQgdCwJLyogVHlwZSAqLwotCXVuc2lnbmVkIGludCBzLAkvKiBzaXplICovCi0JY29uc3QgY2hhciAqcCkJLyogUGFja2V0ICovCi17Ci0JdW5zaWduZWQgaW50CWxlbjsKLQlpbnQJCWJ1Zl9vZmZzLCB4bXRfc3RhdDsKLQl1bnNpZ25lZCBsb25nCXRpbWU7Ci0KLQlsZW4gPSBzICsgRVRIX0hMRU47Ci0JaWYgKGxlbiA8IEVUSF9aTEVOKQotCQlsZW4gPSBFVEhfWkxFTjsKLQlidWZfb2ZmcyA9IE5JNTAxMF9CVUZTSVpFIC0gbGVuOwotCW91dGIoMCwgRURMQ19STUFTSyk7CS8qIE1hc2sgYWxsIHJlY2VpdmUgaW50ZXJydXB0cyAqLwotCW91dGIoMCwgSUVfTU1PREUpOwkvKiBQdXQgWG1pdCBidWZmZXIgb24gc3lzdGVtIGJ1cyAqLwotCW91dGIoMHhGRiwgRURMQ19SQ0xSKTsJLyogQ2xlYXIgb3V0IHBlbmRpbmcgcmN2IGludGVycnVwdHMgKi8KLQlvdXR3KGJ1Zl9vZmZzLCBJRV9HUCk7CS8qIFBvaW50IEdQIGF0IHN0YXJ0IG9mIHBhY2tldCAqLwotCW91dHNiKElFX1hCVUYsIGQsIEVUSF9BTEVOKTsJLyogUHV0IGRzdCBpbiBidWZmZXIgKi8KLQlvdXRzYihJRV9YQlVGLCBuaWMtPm5vZGVfYWRkciwgRVRIX0FMRU4pOy8qIFB1dCBzcmMgaW4gYnVmZmVyICovCi0Jb3V0Yih0ID4+IDgsIElFX1hCVUYpOwotCW91dGIodCwgSUVfWEJVRik7Ci0Jb3V0c2IoSUVfWEJVRiwgcCwgcyk7CS8qIFB1dCBkYXRhIGluIGJ1ZmZlciAqLwotCXdoaWxlIChzKysgPCBFVEhfWkxFTiAtIEVUSF9ITEVOKQkvKiBQYWQgdG8gbWluIHNpemUgKi8KLQkJb3V0YigwLCBJRV9YQlVGKTsKLQlvdXR3KGJ1Zl9vZmZzLCBJRV9HUCk7CS8qIFJld3JpdGUgd2hlcmUgcGFja2V0IHN0YXJ0cyAqLwotCS8qIHNob3VsZCB3b3JrIHdpdGhvdXQgdGhhdCBvdXRiKCkgKENyeW53ciB1c2VkIGl0KSAqLwotCS8qb3V0YihNTV9NVVgsIElFX01NT0RFKTsqLwotCS8qIFhtdCBidWZmZXIgdG8gRURMQyBidXMgKi8KLQlvdXRiKE1NX0VOX1hNVCB8IE1NX01VWCwgSUVfTU1PREUpOwkvKiBCZWdpbiB0cmFuc21pc3Npb24gKi8KLQkvKiB3YWl0IGZvciB0cmFuc21pdCBjb21wbGV0ZSAqLwotCXdoaWxlICgoKHhtdF9zdGF0ID0gaW5iKElFX0lTVEFUKSkgJiBJU19FTl9YTVQpICE9IDApCi0JCTsKLQlyZXNldF9yZWNlaXZlcigpOwkvKiBJbW1lZGlhdGVseSBzd2l0Y2ggdG8gcmVjZWl2ZSAqLwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLURJU0FCTEUgLSBUdXJuIG9mZiBldGhlcm5ldCBpbnRlcmZhY2UKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIG5pNTAxMF9kaXNhYmxlKHN0cnVjdCBuaWMgKm5pYykKLXsKLQlvdXRiKDAsIElFX01NT0RFKTsKLQlvdXRiKFJTX1JFU0VULCBFRExDX1JFU0VUKTsKLX0KLQotc3RhdGljIGlubGluZSBpbnQgcmRfcG9ydCh2b2lkKQotewotCWluYihJRV9SQlVGKTsKLQlyZXR1cm4gaW5iKElFX1NBUFJPTSk7Ci19Ci0KLXN0YXRpYyBpbnQgbmk1MDEwX3Byb2JlMShzdHJ1Y3QgbmljICpuaWMpCi17Ci0JaW50CQlpLCBib2d1c2NvdW50ID0gNDAsIGRhdGE7Ci0KLQkvKiBUaGUgdGVzdHMgYXJlIGZyb20gdGhlIExpbnV4IE5JNTAxMCBkcml2ZXIKLQkgICBJIGRvbid0IHVuZGVyc3RhbmQgaXQgYWxsLCBidXQgaWYgaXQgd29ya3MgZm9yIHRoZW0uLi4gICovCi0JaWYgKGluYihpb2FkZHIpID09IDB4RkYpCi0JCXJldHVybiAoMCk7Ci0Jd2hpbGUgKChyZF9wb3J0KCkgJiByZF9wb3J0KCkgJiByZF9wb3J0KCkKLQkJJiByZF9wb3J0KCkgJiByZF9wb3J0KCkgJiByZF9wb3J0KCkpICE9IDB4RkYpCi0JewotCQlpZiAoYm9ndXNjb3VudC0tIDw9IDApCi0JCQlyZXR1cm4gKDApOwotCX0KLQlmb3IgKGkgPSAwOyBpIDwgMzI7IGkrKykKLQkJaWYgKChkYXRhID0gcmRfcG9ydCgpKSAhPSAweEZGKQotCQkJYnJlYWs7Ci0JaWYgKGRhdGEgPT0gMHhGRikKLQkJcmV0dXJuICgwKTsKLQlpZiAoZGF0YSA9PSBTQV9BRERSMCAmJiByZF9wb3J0KCkgPT0gU0FfQUREUjEgJiYgcmRfcG9ydCgpID09IFNBX0FERFIyKSB7Ci0JCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspCi0JCQlyZF9wb3J0KCk7Ci0JCWlmIChyZF9wb3J0KCkgIT0gTkk1MDEwX01BR0lDVkFMMSB8fCByZF9wb3J0KCkgIT0gTkk1MDEwX01BR0lDVkFMMikKLQkJCXJldHVybiAoMCk7Ci0JfSBlbHNlCi0JCXJldHVybiAoMCk7Ci0JZm9yIChpID0gMDsgaSA8IEVUSF9BTEVOOyBpKyspIHsKLQkJb3V0dyhpLCBJRV9HUCk7Ci0JCW5pYy0+bm9kZV9hZGRyW2ldID0gaW5iKElFX1NBUFJPTSk7Ci0JfQotCXByaW50ZigiXG5OSTUwMTAgaW9hZGRyICUjaFgsIGFkZHIgJSFcbiIsIGlvYWRkciwgbmljLT5ub2RlX2FkZHIpOwotLyogZ2V0IHRoZSBzaXplIG9mIHRoZSBvbmJvYXJkIHJlY2VpdmUgYnVmZmVyCi0gKiBoaWdoZXIgYWRkcmVzc2VzIHRoYW4gYnVmc2l6ZSBhcmUgd3JhcHBlZCBpbnRvIHJlYWwgYnVmZmVyCi0gKiBpLmUuIGRhdGEgZm9yIG9mZnMuIDB4ODAxIGlzIHdyaXR0ZW4gdG8gMHgxIHdpdGggYSAySyBvbmJvYXJkIGJ1ZmZlcgotICovCi0JaWYgKGJ1ZnNpemVfcmN2ID09IDApIHsKLSAgICAgICAgCW91dGIoMSwgSUVfTU1PREUpOyAgICAgIC8qIFB1dCBSY3YgYnVmZmVyIG9uIHN5c3RlbSBidXMgKi8KLSAgICAgICAgCW91dHcoMCwgSUVfR1ApOwkJLyogUG9pbnQgR1AgYXQgc3RhcnQgb2YgcGFja2V0ICovCi0gICAgICAgIAlvdXRiKDAsIElFX1JCVUYpOwkvKiBzZXQgYnVmZmVyIGJ5dGUgMCB0byAwICovCi0gICAgICAgIAlmb3IgKGkgPSAxOyBpIDwgMHhGRjsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgCW91dHcoaSA8PCA4LCBJRV9HUCk7IC8qIFBvaW50IEdQIGF0IHBhY2tldCBzaXplIHRvIGJlIHRlc3RlZCAqLwotICAgICAgICAgICAgICAgIAlvdXRiKGksIElFX1JCVUYpOwotICAgICAgICAgICAgICAgIAlvdXR3KDB4MCwgSUVfR1ApOyAvKiBQb2ludCBHUCBhdCBzdGFydCBvZiBwYWNrZXQgKi8KLSAgICAgICAgICAgICAgICAJZGF0YSA9IGluYihJRV9SQlVGKTsKLSAgICAgICAgICAgICAgICAJaWYgKGRhdGEgPT0gaSkgYnJlYWs7Ci0gICAgICAgIAl9Ci0JCWJ1ZnNpemVfcmN2ID0gaSA8PCA4OwotICAgICAgICAJb3V0dygwLCBJRV9HUCk7CQkvKiBQb2ludCBHUCBhdCBzdGFydCBvZiBwYWNrZXQgKi8KLSAgICAgICAgCW91dGIoMCwgSUVfUkJVRik7CS8qIHNldCBidWZmZXIgYnl0ZSAwIHRvIDAgYWdhaW4gKi8KLQl9Ci0JcHJpbnRmKCJCdWZzaXplIHJjdi94bXQ9JWQvJWRcbiIsIGJ1ZnNpemVfcmN2LCBOSTUwMTBfQlVGU0laRSk7Ci0JcmV0dXJuICgxKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1QUk9CRSAtIExvb2sgZm9yIGFuIGFkYXB0ZXIsIHRoaXMgcm91dGluZSdzIHZpc2libGUgdG8gdGhlIG91dHNpZGUKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0cnVjdCBuaWMgKm5pNTAxMF9wcm9iZShzdHJ1Y3QgbmljICpuaWMsIHVuc2lnbmVkIHNob3J0ICpwcm9iZV9hZGRycykKLXsKLQlzdGF0aWMgdW5zaWduZWQgc2hvcnQJaW9fYWRkcnNbXSA9IHsKLQkJMHgzMDAsIDB4MzIwLCAweDM0MCwgMHgzNjAsIDB4MzgwLCAweDNhMCwgMCB9OwotCXVuc2lnbmVkIHNob3J0CQkqcDsKLQotCS8qIGlmIHByb2JlX2FkZHJzIGlzIDAsIHRoZW4gdXNlIGxpc3QgYWJvdmUgKi8KLQlpZiAocHJvYmVfYWRkcnMgPT0gMCB8fCAqcHJvYmVfYWRkcnMgPT0gMCkKLQkJcHJvYmVfYWRkcnMgPSBpb19hZGRyczsKLQlmb3IgKHAgPSBwcm9iZV9hZGRyczsgKGlvYWRkciA9ICpwKSAhPSAwOyBwKyspIHsKLQkJaWYgKG5pNTAxMF9wcm9iZTEobmljKSkKLQkJCWJyZWFrOwotCX0KLQlpZiAoaW9hZGRyID09IDApCi0JCXJldHVybiAoMCk7Ci0Jbmk1MDEwX3Jlc2V0KG5pYyk7Ci0JLyogcG9pbnQgdG8gTklDIHNwZWNpZmljIHJvdXRpbmVzICovCi0JbmljLT5yZXNldCA9IG5pNTAxMF9yZXNldDsKLQluaWMtPnBvbGwgPSBuaTUwMTBfcG9sbDsKLQluaWMtPnRyYW5zbWl0ID0gbmk1MDEwX3RyYW5zbWl0OwotCW5pYy0+ZGlzYWJsZSA9IG5pNTAxMF9kaXNhYmxlOwotCXJldHVybiAobmljKTsKLX0KZGlmZiAtTmF1ciBncnViLTAuOTcub3JpZy9uZXRib290L25pYy5jIGdydWItMC45Ny9uZXRib290L25pYy5jCi0tLSBncnViLTAuOTcub3JpZy9uZXRib290L25pYy5jCTE5NzAtMDEtMDEgMDA6MDA6MDAuMDAwMDAwMDAwICswMDAwCisrKyBncnViLTAuOTcvbmV0Ym9vdC9uaWMuYwkyMDA1LTA4LTMxIDE5OjAzOjM1LjAwMDAwMDAwMCArMDAwMApAQCAtMCwwICsxLDExOTggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorRXRoZXJib290IC0gIE5ldHdvcmsgQm9vdHN0cmFwIFByb2dyYW0KKworTGl0ZXJhdHVyZSBkZWFsaW5nIHdpdGggdGhlIG5ldHdvcmsgcHJvdG9jb2xzOgorCUFSUCAtIFJGQzgyNgorCVJBUlAgLSBSRkM5MDMKKyAgICAgICAgSVAgLSBSRkM3OTEKKwlVRFAgLSBSRkM3NjgKKwlCT09UUCAtIFJGQzk1MSwgUkZDMjEzMiAodmVuZG9yIGV4dGVuc2lvbnMpCisJREhDUCAtIFJGQzIxMzEsIFJGQzIxMzIgKG9wdGlvbnMpCisJVEZUUCAtIFJGQzEzNTAsIFJGQzIzNDcgKG9wdGlvbnMpLCBSRkMyMzQ4IChibG9ja3NpemUpLCBSRkMyMzQ5ICh0c2l6ZSkKKwlSUEMgLSBSRkMxODMxLCBSRkMxODMyIChYRFIpLCBSRkMxODMzIChycGNiaW5kL3BvcnRtYXBwZXIpCisJTkZTIC0gUkZDMTA5NCwgUkZDMTgxMyAodjMsIHVzZWZ1bCBmb3IgY2xhcmlmaWNhdGlvbnMsIG5vdCBpbXBsZW1lbnRlZCkKKwlJR01QIC0gUkZDMTExMiwgUkZDMjExMywgUkZDMjM2NSwgUkZDMjIzNiwgUkZDMzE3MQorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpbmNsdWRlICJldGhlcmJvb3QuaCIKKyNpbmNsdWRlICJncnViLmgiCisjaW5jbHVkZSAibmljLmgiCisjaW5jbHVkZSAiZWxmLmgiIC8qIEZPUiBFTV9DVVJSRU5UICovCisjaW5jbHVkZSAiYm9vdHAuaCIKKyNpbmNsdWRlICJpZl9hcnAuaCIKKyNpbmNsdWRlICJ0ZnRwLmgiCisjaW5jbHVkZSAidGltZXIuaCIKKyNpbmNsdWRlICJpcC5oIgorI2luY2x1ZGUgInVkcC5oIgorCisvKiBDdXJyZW50bHkgbm8gb3RoZXIgbW9kdWxlIHVzZXMgcm9tLCBidXQgaXQgaXMgYXZhaWxhYmxlICovCitzdHJ1Y3Qgcm9tX2luZm8JCXJvbTsKK3N0cnVjdCBhcnB0YWJsZV90CWFycHRhYmxlW01BWF9BUlBdOworI2lmIE1VTFRJQ0FTVF9MRVZFTDIKK3Vuc2lnbmVkIGxvbmcgbGFzdF9pZ21wdjEgPSAwOworc3RydWN0IGlnbXB0YWJsZV90CWlnbXB0YWJsZVtNQVhfSUdNUF07CisjZW5kaWYKK3N0YXRpYyB1bnNpZ25lZCBsb25nCW5ldG1hc2s7CisvKiBVc2VkIGJ5IG5mcy5jICovCitjaGFyICpob3N0bmFtZSA9ICIiOworaW50IGhvc3RuYW1lbGVuID0gMDsKK3N0YXRpYyB1aW50MzJfdCB4aWQ7CitzdGF0aWMgdW5zaWduZWQgY2hhciAqZW5kX29mX3JmYzE1MzMgPSBOVUxMOworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgYnJvYWRjYXN0W10gPSB7IDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYgfTsKK3N0YXRpYyBjb25zdCBpbl9hZGRyIHplcm9JUCA9IHsgMEwgfTsKK3N0YXRpYyBjaGFyIHJmYzE1MzNfdmVuZGRhdGFbTUFYX1JGQzE1MzNfVkVORExFTl07CitzdGF0aWMgdW5zaWduZWQgY2hhciByZmMxNTMzX2Nvb2tpZVs0XSA9IHsgUkZDMTUzM19DT09LSUUgfTsKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHJmYzE1MzNfY29va2llX2Jvb3RwWzVdID0geyBSRkMxNTMzX0NPT0tJRSwgUkZDMTUzM19FTkQgfTsKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHJmYzE1MzNfY29va2llX2RoY3BbXSA9IHsgUkZDMTUzM19DT09LSUUgfTsKK3N0YXRpYyBpbnQgZGhjcF9yZXBseTsKK3N0YXRpYyBpbl9hZGRyIGRoY3Bfc2VydmVyID0geyAwTCB9Oworc3RhdGljIGluX2FkZHIgZGhjcF9hZGRyID0geyAwTCB9OworCitzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBkaGNwZGlzY292ZXJbXSA9IHsKKwlSRkMyMTMyX01TR19UWVBFLCAxLCBESENQRElTQ09WRVIsCisJUkZDMjEzMl9NQVhfU0laRSwgMiwJLyogcmVxdWVzdCBhcyBtdWNoIGFzIHdlIGNhbiAqLworCUVUSF9NQVhfTVRVIC8gMjU2LCBFVEhfTUFYX01UVSAlIDI1NiwKKwkvKiBWZW5kb3IgY2xhc3MgaWRlbnRpZmllciAqLworCVJGQzIxMzJfVkVORE9SX0NMQVNTX0lELCAxMCwgJ0cnLCAnUicsICdVJywgJ0InLCAnQycsICdsJywgJ2knLCAnZScsICduJywgJ3QnLAorCVJGQzIxMzJfUEFSQU1fTElTVCwgNCwgUkZDMTUzM19ORVRNQVNLLCBSRkMxNTMzX0dBVEVXQVksCisJUkZDMTUzM19IT1NUTkFNRSwgUkZDMTUzM19FWFRFTlNJT05QQVRILCBSRkMxNTMzX0VORAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIGRoY3ByZXF1ZXN0IFtdID0geworCVJGQzIxMzJfTVNHX1RZUEUsMSxESENQUkVRVUVTVCwKKwlSRkMyMTMyX1NSVl9JRCw0LDAsMCwwLDAsCisJUkZDMjEzMl9SRVFfQUREUiw0LDAsMCwwLDAsCisJUkZDMjEzMl9NQVhfU0laRSwyLAkvKiByZXF1ZXN0IGFzIG11Y2ggYXMgd2UgY2FuICovCisJRVRIX01BWF9NVFUgLyAyNTYsIEVUSF9NQVhfTVRVICUgMjU2LAorCS8qIFZlbmRvciBjbGFzcyBpZGVudGlmaWVyICovCisJUkZDMjEzMl9WRU5ET1JfQ0xBU1NfSUQsIDEwLCAnRycsICdSJywgJ1UnLCAnQicsICdDJywgJ2wnLCAnaScsICdlJywgJ24nLCAndCcsCisJUkZDMjEzMl9QQVJBTV9MSVNULAorCS8qIDQgc3RhbmRhcmQgKyAyIHZlbmRvcnRhZ3MgKi8KKwk0ICsgMiwKKwkvKiBTdGFuZGFyZCBwYXJhbWV0ZXJzICovCisJUkZDMTUzM19ORVRNQVNLLCBSRkMxNTMzX0dBVEVXQVksCisJUkZDMTUzM19IT1NUTkFNRSwgUkZDMTUzM19FWFRFTlNJT05QQVRILAorCS8qIEV0aGVyYm9vdCB2ZW5kb3J0YWdzICovCisJUkZDMTUzM19WRU5ET1JfTUFHSUMsCisJUkZDMTUzM19WRU5ET1JfQ09ORklHRklMRSwKKwlSRkMxNTMzX0VORAorfTsKKworLyogU2VlIG5pYy5oICovCitpbnQgdXNlcl9hYm9ydCA9IDA7CitpbnQgbmV0d29ya19yZWFkeSA9IDA7CisKKyNpZmRlZglSRVFVSVJFX1ZDSV9FVEhFUkJPT1QKK2ludAl2Y2lfZXRoZXJib290OworI2VuZGlmCisKK3N0YXRpYyBpbnQgZHVtbXkodm9pZCAqdW51c2VkIF9fdW51c2VkKQoreworCXJldHVybiAoMCk7Cit9CisKKy8qIENhcmVmdWwuICBXZSBuZWVkIGFuIGFsaWduZWQgYnVmZmVyIHRvIGF2b2lkIHByb2JsZW1zIG9uIG1hY2hpbmVzCisgKiB0aGF0IGNhcmUgYWJvdXQgYWxpZ25tZW50LiAgVG8gdHJpdmFsbHkgYWxpZ24gdGhlIGV0aGVybmV0IGRhdGEKKyAqICh0aGUgaXAgaGRyIGFuZCBhcnAgcmVxdWVzdHMpIHdlIG9mZnNldCB0aGUgcGFja2V0IGJ5IDIgYnl0ZXMuCisgKiBsZWF2aW5nIHRoZSBldGhlcm5ldCBkYXRhIDE2IGJ5dGUgYWxpZ25lZC4gIEJleW9uZCB0aGlzCisgKiB3ZSB1c2UgbWVtbW92ZSBidXQgdGhpcyBtYWtlcyB0aGUgY29tbW9uIGNhc3Qgc2ltcGxlIGFuZCBmYXN0LgorICovCitzdGF0aWMgY2hhcglwYWNrZXRbRVRIX0ZSQU1FX0xFTiArIEVUSF9EQVRBX0FMSUdOXSBfX2FsaWduZWQ7CisKK3N0cnVjdCBuaWMJbmljID0KK3sKKwl7CisJCTAsCQkJCS8qIGRldi5kaXNhYmxlICovCisJCXsKKwkJCTAsCisJCQkwLAorCQkJUENJX0JVU19UWVBFLAorCQl9LAkJCQkvKiBkZXYuZGV2aWQgKi8KKwkJMCwJCQkJLyogaW5kZXggKi8KKwkJMCwJCQkJLyogdHlwZSAqLworCQlQUk9CRV9GSVJTVCwJCQkvKiBob3dfcG9iZSAqLworCQlQUk9CRV9OT05FLAkJCS8qIHRvX3Byb2JlICovCisJCTAsCQkJCS8qIGZhaWxzYWZlICovCisJCTAsCQkJCS8qIHR5cGVfaW5kZXggKi8KKwkJe30sCQkJCS8qIHN0YXRlICovCisJfSwKKwkoaW50ICgqKShzdHJ1Y3QgbmljICosIGludCkpZHVtbXksICAgICAgLyogcG9sbCAqLworCSh2b2lkICgqKShzdHJ1Y3QgbmljICosIGNvbnN0IGNoYXIgKiwKKwkJdW5zaWduZWQgaW50LCB1bnNpZ25lZCBpbnQsCisJCWNvbnN0IGNoYXIgKikpZHVtbXksCQkvKiB0cmFuc21pdCAqLworCSh2b2lkICgqKShzdHJ1Y3QgbmljICosIGlycV9hY3Rpb25fdCkpZHVtbXksIC8qIGlycSAqLworCTAsCQkJCQkvKiBmbGFncyAqLworCSZyb20sCQkJCQkvKiByb21faW5mbyAqLworCWFycHRhYmxlW0FSUF9DTElFTlRdLm5vZGUsCQkvKiBub2RlX2FkZHIgKi8KKwlwYWNrZXQgKyBFVEhfREFUQV9BTElHTiwJCS8qIHBhY2tldCAqLworCTAsCQkJCQkvKiBwYWNrZXRsZW4gKi8KKwkwLAkJCS8qIGlvYWRkciAqLworCTAsCQkJLyogaXJxbm8gKi8KKwlOVUxMLAkJCQkJLyogcHJpdl9kYXRhICovCit9OworCisKKworaW50IGdydWJfZXRoX3Byb2JlKHZvaWQpCit7CisJc3RhdGljIGludCBwcm9iZWQgPSAwOworCXN0cnVjdCBkZXYgKmRldjsKKworCUVudGVyRnVuY3Rpb24oImdydWJfZXRoX3Byb2JlIik7CisKKwlpZiAocHJvYmVkKQorCQlyZXR1cm4gMTsKKworCW5ldHdvcmtfcmVhZHkgPSAwOworCWdydWJfbWVtc2V0KChjaGFyICopYXJwdGFibGUsIDAsIE1BWF9BUlAgKiBzaXplb2Yoc3RydWN0IGFycHRhYmxlX3QpKTsKKwlkZXYgPSAmbmljLmRldjsKKwlkZXYtPmhvd19wcm9iZSA9IC0xOworCWRldi0+dHlwZSA9IE5JQ19EUklWRVI7CisJZGV2LT5mYWlsc2FmZSA9IDE7CisJcm9tID0gKigoc3RydWN0IHJvbV9pbmZvICopUk9NX0lORk9fTE9DQVRJT04pOworCisJcHJvYmVkID0gKGV0aF9wcm9iZShkZXYpID09IFBST0JFX1dPUktFRCk7CisKKwlMZWF2ZUZ1bmN0aW9uKCJncnViX2V0aF9wcm9iZSIpOworCXJldHVybiBwcm9iZWQ7Cit9CisKK2ludCBldGhfcHJvYmUoc3RydWN0IGRldiAqZGV2KQoreworCXJldHVybiBwcm9iZShkZXYpOworfQorCitpbnQgZXRoX3BvbGwoaW50IHJldHJpZXZlKQoreworCXJldHVybiAoKCpuaWMucG9sbCkoJm5pYywgcmV0cmlldmUpKTsKK30KKwordm9pZCBldGhfdHJhbnNtaXQoY29uc3QgY2hhciAqZCwgdW5zaWduZWQgaW50IHQsIHVuc2lnbmVkIGludCBzLCBjb25zdCB2b2lkICpwKQoreworCSgqbmljLnRyYW5zbWl0KSgmbmljLCBkLCB0LCBzLCBwKTsKKwlpZiAodCA9PSBJUCkgdHdpZGRsZSgpOworfQorCit2b2lkIGV0aF9kaXNhYmxlKHZvaWQpCit7CisjaWZkZWYgTVVMVElDQVNUX0xFVkVMMgorCWludCBpOworCWZvcihpID0gMDsgaSA8IE1BWF9JR01QOyBpKyspIHsKKwkJbGVhdmVfZ3JvdXAoaSk7CisJfQorI2VuZGlmCisJZGlzYWJsZSgmbmljLmRldik7Cit9CisKK3ZvaWQgZXRoX2lycSAoaXJxX2FjdGlvbl90IGFjdGlvbikKK3sKKwkoKm5pYy5pcnEpKCZuaWMsYWN0aW9uKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitJUENIS1NVTSAtIENoZWNrc3VtIElQIEhlYWRlcgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MTZfdCBpcGNoa3N1bShjb25zdCB2b2lkICpkYXRhLCB1bnNpZ25lZCBsb25nIGxlbmd0aCkKK3sKKwl1bnNpZ25lZCBsb25nIHN1bTsKKwl1bnNpZ25lZCBsb25nIGk7CisJY29uc3QgdWludDhfdCAqcHRyOworCisJLyogSW4gdGhlIG1vc3Qgc3RyYWlnaHQgZm9yd2FyZCB3YXkgcG9zc2libGUsCisJICogY29tcHV0ZSBhbiBpcCBzdHlsZSBjaGVja3N1bS4KKwkgKi8KKwlzdW0gPSAwOworCXB0ciA9IGRhdGE7CisJZm9yKGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKKwkJdW5zaWduZWQgbG9uZyB2YWx1ZTsKKwkJdmFsdWUgPSBwdHJbaV07CisJCWlmIChpICYgMSkgeworCQkJdmFsdWUgPDw9IDg7CisJCX0KKwkJLyogQWRkIHRoZSBuZXcgdmFsdWUgKi8KKwkJc3VtICs9IHZhbHVlOworCQkvKiBXcmFwIGFyb3VuZCB0aGUgY2FycnkgKi8KKwkJaWYgKHN1bSA+IDB4RkZGRikgeworCQkJc3VtID0gKHN1bSArIChzdW0gPj4gMTYpKSAmIDB4RkZGRjsKKwkJfQorCX0KKwlyZXR1cm4gKH5jcHVfdG9fbGUxNihzdW0pKSAmIDB4RkZGRjsKK30KKwordWludDE2X3QgYWRkX2lwY2hrc3Vtcyh1bnNpZ25lZCBsb25nIG9mZnNldCwgdWludDE2X3Qgc3VtLCB1aW50MTZfdCBuZXcpCit7CisJdW5zaWduZWQgbG9uZyBjaGVja3N1bTsKKwlzdW0gPSB+c3VtICYgMHhGRkZGOworCW5ldyA9IH5uZXcgJiAweEZGRkY7CisJaWYgKG9mZnNldCAmIDEpIHsKKwkJLyogYnl0ZSBzd2FwIHRoZSBzdW0gaWYgaXQgY2FtZSBmcm9tIGFuIG9kZCBvZmZzZXQgCisJCSAqIHNpbmNlIHRoZSBjb21wdXRhdGlvbiBpcyBlbmRpYW4gaW5kZXBlbmRhbnQgdGhpcworCQkgKiB3b3Jrcy4KKwkJICovCisJCW5ldyA9IGJzd2FwXzE2KG5ldyk7CisJfQorCWNoZWNrc3VtID0gc3VtICsgbmV3OworCWlmIChjaGVja3N1bSA+IDB4RkZGRikgeworCQljaGVja3N1bSAtPSAweEZGRkY7CisJfQorCXJldHVybiAofmNoZWNrc3VtKSAmIDB4RkZGRjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitERUZBVUxUX05FVE1BU0sgLSBSZXR1cm4gZGVmYXVsdCBuZXRtYXNrIGZvciBJUCBhZGRyZXNzCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBkZWZhdWx0X25ldG1hc2sodm9pZCkKK3sKKwlpbnQgbmV0ID0gbnRvaGwoYXJwdGFibGVbQVJQX0NMSUVOVF0uaXBhZGRyLnNfYWRkcikgPj4gMjQ7CisJaWYgKG5ldCA8PSAxMjcpCisJCXJldHVybihodG9ubCgweGZmMDAwMDAwKSk7CisJZWxzZSBpZiAobmV0IDwgMTkyKQorCQlyZXR1cm4oaHRvbmwoMHhmZmZmMDAwMCkpOworCWVsc2UKKwkJcmV0dXJuKGh0b25sKDB4ZmZmZmZmMDApKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitJUF9UUkFOU01JVCAtIFNlbmQgYW4gSVAgZGF0YWdyYW0KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludCBhd2FpdF9hcnAoaW50IGl2YWwsIHZvaWQgKnB0ciwKKwl1bnNpZ25lZCBzaG9ydCBwdHlwZSwgc3RydWN0IGlwaGRyICppcCBfX3VudXNlZCwgc3RydWN0IHVkcGhkciAqdWRwIF9fdW51c2VkKQoreworCXN0cnVjdAlhcnByZXF1ZXN0ICphcnByZXBseTsKKwlpZiAocHR5cGUgIT0gQVJQKQorCQlyZXR1cm4gMDsKKwlpZiAobmljLnBhY2tldGxlbiA8IEVUSF9ITEVOICsgc2l6ZW9mKHN0cnVjdCBhcnByZXF1ZXN0KSkKKwkJcmV0dXJuIDA7CisJYXJwcmVwbHkgPSAoc3RydWN0IGFycHJlcXVlc3QgKikmbmljLnBhY2tldFtFVEhfSExFTl07CisKKwlpZiAoYXJwcmVwbHktPm9wY29kZSAhPSBodG9ucyhBUlBfUkVQTFkpKSAKKwkJcmV0dXJuIDA7CisJaWYgKG1lbWNtcChhcnByZXBseS0+c2lwYWRkciwgcHRyLCBzaXplb2YoaW5fYWRkcikpICE9IDApCisJCXJldHVybiAwOworCW1lbWNweShhcnB0YWJsZVtpdmFsXS5ub2RlLCBhcnByZXBseS0+c2h3YWRkciwgRVRIX0FMRU4pOworCXJldHVybiAxOworfQorCitpbnQgaXBfdHJhbnNtaXQoaW50IGxlbiwgY29uc3Qgdm9pZCAqYnVmKQoreworCXVuc2lnbmVkIGxvbmcgZGVzdGlwOworCXN0cnVjdCBpcGhkciAqaXA7CisJc3RydWN0IGFycHJlcXVlc3QgYXJwcmVxOworCWludCBhcnBlbnRyeSwgaTsKKwlpbnQgcmV0cnk7CisKKwlpcCA9IChzdHJ1Y3QgaXBoZHIgKilidWY7CisJZGVzdGlwID0gaXAtPmRlc3Quc19hZGRyOworCWlmIChkZXN0aXAgPT0gSVBfQlJPQURDQVNUKSB7CisJCWV0aF90cmFuc21pdChicm9hZGNhc3QsIElQLCBsZW4sIGJ1Zik7CisjaWZkZWYgTVVMVElDQVNUX0xFVkVMMSAKKwl9IGVsc2UgaWYgKChkZXN0aXAgJiBodG9ubChNVUxUSUNBU1RfTUFTSykpID09IGh0b25sKE1VTFRJQ0FTVF9ORVRXT1JLKSkgeworCQl1bnNpZ25lZCBjaGFyIG11bHRpY2FzdFs2XTsKKwkJdW5zaWduZWQgbG9uZyBoZGVzdGlwOworCQloZGVzdGlwID0gbnRvaGwoZGVzdGlwKTsKKwkJbXVsdGljYXN0WzBdID0gMHgwMTsKKwkJbXVsdGljYXN0WzFdID0gMHgwMDsKKwkJbXVsdGljYXN0WzJdID0gMHg1ZTsKKwkJbXVsdGljYXN0WzNdID0gKGhkZXN0aXAgPj4gMTYpICYgMHg3OworCQltdWx0aWNhc3RbNF0gPSAoaGRlc3RpcCA+PiA4KSAmIDB4ZmY7CisJCW11bHRpY2FzdFs1XSA9IGhkZXN0aXAgJiAweGZmOworCQlldGhfdHJhbnNtaXQobXVsdGljYXN0LCBJUCwgbGVuLCBidWYpOworI2VuZGlmCisJfSBlbHNlIHsKKwkJaWYgKCgoZGVzdGlwICYgbmV0bWFzaykgIT0KKwkJICAgICAoYXJwdGFibGVbQVJQX0NMSUVOVF0uaXBhZGRyLnNfYWRkciAmIG5ldG1hc2spKSAmJgorCQkgICAgYXJwdGFibGVbQVJQX0dBVEVXQVldLmlwYWRkci5zX2FkZHIpCisJCQlkZXN0aXAgPSBhcnB0YWJsZVtBUlBfR0FURVdBWV0uaXBhZGRyLnNfYWRkcjsKKwkJZm9yKGFycGVudHJ5ID0gMDsgYXJwZW50cnk8TUFYX0FSUDsgYXJwZW50cnkrKykKKwkJCWlmIChhcnB0YWJsZVthcnBlbnRyeV0uaXBhZGRyLnNfYWRkciA9PSBkZXN0aXApIGJyZWFrOworCQlpZiAoYXJwZW50cnkgPT0gTUFYX0FSUCkgeworCQkJcHJpbnRmKCIlQCBpcyBub3QgaW4gbXkgYXJwIHRhYmxlIVxuIiwgZGVzdGlwKTsKKwkJCXJldHVybigwKTsKKwkJfQorCQlmb3IgKGkgPSAwOyBpIDwgRVRIX0FMRU47IGkrKykKKwkJCWlmIChhcnB0YWJsZVthcnBlbnRyeV0ubm9kZVtpXSkKKwkJCQlicmVhazsKKwkJaWYgKGkgPT0gRVRIX0FMRU4pIHsJLyogTmVlZCB0byBkbyBhcnAgcmVxdWVzdCAqLworCQkJYXJwcmVxLmh3dHlwZSA9IGh0b25zKDEpOworCQkJYXJwcmVxLnByb3RvY29sID0gaHRvbnMoSVApOworCQkJYXJwcmVxLmh3bGVuID0gRVRIX0FMRU47CisJCQlhcnByZXEucHJvdG9sZW4gPSA0OworCQkJYXJwcmVxLm9wY29kZSA9IGh0b25zKEFSUF9SRVFVRVNUKTsKKwkJCW1lbWNweShhcnByZXEuc2h3YWRkciwgYXJwdGFibGVbQVJQX0NMSUVOVF0ubm9kZSwgRVRIX0FMRU4pOworCQkJbWVtY3B5KGFycHJlcS5zaXBhZGRyLCAmYXJwdGFibGVbQVJQX0NMSUVOVF0uaXBhZGRyLCBzaXplb2YoaW5fYWRkcikpOworCQkJbWVtc2V0KGFycHJlcS50aHdhZGRyLCAwLCBFVEhfQUxFTik7CisJCQltZW1jcHkoYXJwcmVxLnRpcGFkZHIsICZkZXN0aXAsIHNpemVvZihpbl9hZGRyKSk7CisJCQlmb3IgKHJldHJ5ID0gMTsgcmV0cnkgPD0gTUFYX0FSUF9SRVRSSUVTOyByZXRyeSsrKSB7CisJCQkJbG9uZyB0aW1lb3V0OworCQkJCWV0aF90cmFuc21pdChicm9hZGNhc3QsIEFSUCwgc2l6ZW9mKGFycHJlcSksCisJCQkJCSZhcnByZXEpOworCQkJCXRpbWVvdXQgPSByZmMyMTMxX3NsZWVwX2ludGVydmFsKFRJTUVPVVQsIHJldHJ5KTsKKwkJCQlpZiAoYXdhaXRfcmVwbHkoYXdhaXRfYXJwLCBhcnBlbnRyeSwKKwkJCQkJYXJwcmVxLnRpcGFkZHIsIHRpbWVvdXQpKSBnb3RvIHhtaXQ7CisJCQl9CisJCQlyZXR1cm4oMCk7CisJCX0KK3htaXQ6CisJCWV0aF90cmFuc21pdChhcnB0YWJsZVthcnBlbnRyeV0ubm9kZSwgSVAsIGxlbiwgYnVmKTsKKwl9CisJcmV0dXJuIDE7Cit9CisKK3ZvaWQgYnVpbGRfaXBfaGRyKHVuc2lnbmVkIGxvbmcgZGVzdGlwLCBpbnQgdHRsLCBpbnQgcHJvdG9jb2wsIGludCBvcHRpb25fbGVuLAorCWludCBsZW4sIGNvbnN0IHZvaWQgKmJ1ZikKK3sKKwlzdHJ1Y3QgaXBoZHIgKmlwOworCWlwID0gKHN0cnVjdCBpcGhkciAqKWJ1ZjsKKwlpcC0+dmVyaGRybGVuID0gMHg0NTsKKwlpcC0+dmVyaGRybGVuICs9IChvcHRpb25fbGVuLzQpOworCWlwLT5zZXJ2aWNlID0gMDsKKwlpcC0+bGVuID0gaHRvbnMobGVuKTsKKwlpcC0+aWRlbnQgPSAwOworCWlwLT5mcmFncyA9IDA7IC8qIFNob3VsZCB3ZSBzZXQgZG9uJ3QgZnJhZ21lbnQ/ICovCisJaXAtPnR0bCA9IHR0bDsKKwlpcC0+cHJvdG9jb2wgPSBwcm90b2NvbDsKKwlpcC0+Y2hrc3VtID0gMDsKKwlpcC0+c3JjLnNfYWRkciA9IGFycHRhYmxlW0FSUF9DTElFTlRdLmlwYWRkci5zX2FkZHI7CisJaXAtPmRlc3Quc19hZGRyID0gZGVzdGlwOworCWlwLT5jaGtzdW0gPSBpcGNoa3N1bShidWYsIHNpemVvZihzdHJ1Y3QgaXBoZHIpICsgb3B0aW9uX2xlbik7Cit9CisKK3N0YXRpYyB1aW50MTZfdCB1ZHBjaGtzdW0oc3RydWN0IGlwaGRyICppcCwgc3RydWN0IHVkcGhkciAqdWRwKQoreworCXN0cnVjdCB1ZHBfcHNldWRvX2hkciBwc2V1ZG87CisJdWludDE2X3QgY2hlY2tzdW07CisKKwkvKiBDb21wdXRlIHRoZSBwc2V1ZG8gaGVhZGVyICovCisJcHNldWRvLnNyYy5zX2FkZHIgID0gaXAtPnNyYy5zX2FkZHI7CisJcHNldWRvLmRlc3Quc19hZGRyID0gaXAtPmRlc3Quc19hZGRyOworCXBzZXVkby51bnVzZWQgICAgICA9IDA7CisJcHNldWRvLnByb3RvY29sICAgID0gSVBfVURQOworCXBzZXVkby5sZW4gICAgICAgICA9IHVkcC0+bGVuOworCisJLyogU3VtIHRoZSBwc2V1ZG8gaGVhZGVyICovCisJY2hlY2tzdW0gPSBpcGNoa3N1bSgmcHNldWRvLCAxMik7CisKKwkvKiBTdW0gdGhlIHJlc3Qgb2YgdGhlIHVkcCBwYWNrZXQgKi8KKwljaGVja3N1bSA9IGFkZF9pcGNoa3N1bXMoMTIsIGNoZWNrc3VtLCBpcGNoa3N1bSh1ZHAsIG50b2hzKHVkcC0+bGVuKSkpOworCXJldHVybiBjaGVja3N1bTsKK30KKworCit2b2lkIGJ1aWxkX3VkcF9oZHIodW5zaWduZWQgbG9uZyBkZXN0aXAsIAorCXVuc2lnbmVkIGludCBzcmNzb2NrLCB1bnNpZ25lZCBpbnQgZGVzdHNvY2ssIGludCB0dGwsCisJaW50IGxlbiwgY29uc3Qgdm9pZCAqYnVmKQoreworCXN0cnVjdCBpcGhkciAqaXA7CisJc3RydWN0IHVkcGhkciAqdWRwOworCWlwID0gKHN0cnVjdCBpcGhkciAqKWJ1ZjsKKwlidWlsZF9pcF9oZHIoZGVzdGlwLCB0dGwsIElQX1VEUCwgMCwgbGVuLCBidWYpOworCXVkcCA9IChzdHJ1Y3QgdWRwaGRyICopKChjaGFyICopYnVmICsgc2l6ZW9mKHN0cnVjdCBpcGhkcikpOworCXVkcC0+c3JjID0gaHRvbnMoc3Jjc29jayk7CisJdWRwLT5kZXN0ID0gaHRvbnMoZGVzdHNvY2spOworCXVkcC0+bGVuID0gaHRvbnMobGVuIC0gc2l6ZW9mKHN0cnVjdCBpcGhkcikpOworCXVkcC0+Y2hrc3VtID0gMDsKKwlpZiAoKHVkcC0+Y2hrc3VtID0gdWRwY2hrc3VtKGlwLCB1ZHApKSA9PSAwKQorCQl1ZHAtPmNoa3N1bSA9IDB4ZmZmZjsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1VEUF9UUkFOU01JVCAtIFNlbmQgYW4gVURQIGRhdGFncmFtCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCB1ZHBfdHJhbnNtaXQodW5zaWduZWQgbG9uZyBkZXN0aXAsIHVuc2lnbmVkIGludCBzcmNzb2NrLAorCXVuc2lnbmVkIGludCBkZXN0c29jaywgaW50IGxlbiwgY29uc3Qgdm9pZCAqYnVmKQoreworCWJ1aWxkX3VkcF9oZHIoZGVzdGlwLCBzcmNzb2NrLCBkZXN0c29jaywgNjAsIGxlbiwgYnVmKTsKKwlyZXR1cm4gaXBfdHJhbnNtaXQobGVuLCBidWYpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1FEUkFJTiAtIGNsZWFyIHRoZSBuaWMncyByZWNlaXZlIHF1ZXVlCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQgYXdhaXRfcWRyYWluKGludCBpdmFsIF9fdW51c2VkLCB2b2lkICpwdHIgX191bnVzZWQsCisJdW5zaWduZWQgc2hvcnQgcHR5cGUgX191bnVzZWQsIAorCXN0cnVjdCBpcGhkciAqaXAgX191bnVzZWQsIHN0cnVjdCB1ZHBoZHIgKnVkcCBfX3VudXNlZCkKK3sKKwlyZXR1cm4gMDsKK30KKwordm9pZCByeF9xZHJhaW4odm9pZCkKK3sKKwkvKiBDbGVhciBvdXQgdGhlIFJ4IHF1ZXVlIGZpcnN0LiAgSXQgY29udGFpbnMgbm90aGluZyBvZiBpbnRlcmVzdCwKKwkgKiBleGNlcHQgcG9zc2libHkgQVJQIHJlcXVlc3RzIGZyb20gdGhlIERIQ1AvVEZUUCBzZXJ2ZXIuICBXZSB1c2UKKwkgKiBwb2xsaW5nIHRocm91Z2hvdXQgRXRoZXJib290LCBzbyBzb21lIHRpbWUgbWF5IGhhdmUgcGFzc2VkIHNpbmNlIHdlCisJICogbGFzdCBwb2xsZWQgdGhlIHJlY2VpdmUgcXVldWUsIHdoaWNoIG1heSBub3cgYmUgZmlsbGVkIHdpdGgKKwkgKiBicm9hZGNhc3QgcGFja2V0cy4gIFRoaXMgd2lsbCBjYXVzZSB0aGUgcmVwbHkgdG8gdGhlIHBhY2tldHMgd2UgYXJlCisJICogYWJvdXQgdG8gc2VuZCB0byBiZSBsb3N0IGltbWVkaWF0ZWx5LiAgTm90IHZlcnkgY2xldmVyLiAgKi8KKwlhd2FpdF9yZXBseShhd2FpdF9xZHJhaW4sIDAsIE5VTEwsIDApOworfQorCisvKioKKyAqIHJhcnAKKyAqCisgKiBHZXQgSVAgYWRkcmVzcyBieSByYXJwLiBKdXN0IGNvcHkgZnJvbSBldGhlcmJvb3QKKyAqKi8KK3N0YXRpYyBpbnQgYXdhaXRfcmFycChpbnQgaXZhbCwgdm9pZCAqcHRyLCB1bnNpZ25lZCBzaG9ydCBwdHlwZSwgCisJCSAgICAgIHN0cnVjdCBpcGhkciAqaXAsIHN0cnVjdCB1ZHBoZHIgKnVkcCkKK3sKKwlzdHJ1Y3QgYXJwcmVxdWVzdCAqYXJwcmVwbHk7CisJaWYgKHB0eXBlICE9IFJBUlApCisJCXJldHVybiAwOworCWlmIChuaWMucGFja2V0bGVuIDwgRVRIX0hMRU4gKyBzaXplb2Yoc3RydWN0IGFycHJlcXVlc3QpKQorCQlyZXR1cm4gMDsKKwlhcnByZXBseSA9IChzdHJ1Y3QgYXJwcmVxdWVzdCAqKSZuaWMucGFja2V0W0VUSF9ITEVOXTsKKwlpZiAoYXJwcmVwbHktPm9wY29kZSAhPSBodG9ucyhSQVJQX1JFUExZKSkKKwkJcmV0dXJuIDA7CisJaWYgKG1lbWNtcChhcnByZXBseS0+dGh3YWRkciwgcHRyLCBFVEhfQUxFTikgPT0gMCl7CisJCW1lbWNweShhcnB0YWJsZVtBUlBfU0VSVkVSXS5ub2RlLCBhcnByZXBseS0+c2h3YWRkciwgRVRIX0FMRU4pOworCQltZW1jcHkoJmFycHRhYmxlW0FSUF9TRVJWRVJdLmlwYWRkciwgYXJwcmVwbHktPnNpcGFkZHIsIHNpemVvZihpbl9hZGRyKSk7CisJCW1lbWNweSgmYXJwdGFibGVbQVJQX0NMSUVOVF0uaXBhZGRyLCBhcnByZXBseS0+dGlwYWRkciwgc2l6ZW9mKGluX2FkZHIpKTsKKwkJcmV0dXJuIDE7CisJfQorCXJldHVybiAwOworfQorCitpbnQgcmFycCh2b2lkKQoreworCWludCByZXRyeTsKKworCS8qIGFycCBhbmQgcmFycCByZXF1ZXN0cyBzaGFyZSB0aGUgc2FtZSBwYWNrZXQgc3RydWN0dXJlLiAqLworCXN0cnVjdCBhcnByZXF1ZXN0IHJhcnByZXE7CisKKwlpZighZ3J1Yl9ldGhfcHJvYmUoKSkKKwkJcmV0dXJuIDA7CisJbmV0d29ya19yZWFkeSA9IDA7CisKKwltZW1zZXQoJnJhcnByZXEsIDAsIHNpemVvZihyYXJwcmVxKSk7CisKKwlyYXJwcmVxLmh3dHlwZSA9IGh0b25zKDEpOworCXJhcnByZXEucHJvdG9jb2wgPSBodG9ucyhJUCk7CisJcmFycHJlcS5od2xlbiA9IEVUSF9BTEVOOworCXJhcnByZXEucHJvdG9sZW4gPSA0OworCXJhcnByZXEub3Bjb2RlID0gaHRvbnMoUkFSUF9SRVFVRVNUKTsKKwltZW1jcHkoJnJhcnByZXEuc2h3YWRkciwgYXJwdGFibGVbQVJQX0NMSUVOVF0ubm9kZSwgRVRIX0FMRU4pOworCS8qIHNpcGFkZHIgaXMgYWxyZWFkeSB6ZXJvZWQgb3V0ICovCisJbWVtY3B5KCZyYXJwcmVxLnRod2FkZHIsIGFycHRhYmxlW0FSUF9DTElFTlRdLm5vZGUsIEVUSF9BTEVOKTsKKwkvKiB0aXBhZGRyIGlzIGFscmVhZHkgemVyb2VkIG91dCAqLworCisJZm9yIChyZXRyeSA9IDA7IHJldHJ5IDwgTUFYX0FSUF9SRVRSSUVTOyArK3JldHJ5KSB7CisJCWxvbmcgdGltZW91dDsKKwkJZXRoX3RyYW5zbWl0KGJyb2FkY2FzdCwgUkFSUCwgc2l6ZW9mKHJhcnByZXEpLCAmcmFycHJlcSk7CisKKwkJdGltZW91dCA9IHJmYzIxMzFfc2xlZXBfaW50ZXJ2YWwoVElNRU9VVCwgcmV0cnkpOworCQlpZiAoYXdhaXRfcmVwbHkoYXdhaXRfcmFycCwgMCwgcmFycHJlcS5zaHdhZGRyLCB0aW1lb3V0KSkKKwkJCWJyZWFrOworCQlpZiAodXNlcl9hYm9ydCkKKwkJCXJldHVybiAwOworCX0KKworCWlmIChyZXRyeSA8IE1BWF9BUlBfUkVUUklFUykgeworCQluZXR3b3JrX3JlYWR5ID0gMTsKKwkJcmV0dXJuICgxKTsKKwl9CisJcmV0dXJuICgwKTsKK30KKworLyoqCisgKiBib290cAorICoKKyAqIEdldCBJUCBhZGRyZXNzIGJ5IGJvb3RwLCBzZWdyZWdhdGUgZnJvbSBib290cCBpbiBldGhlcmJvb3QuCisgKiovCitzdGF0aWMgaW50IGF3YWl0X2Jvb3RwKGludCBpdmFsIF9fdW51c2VkLCB2b2lkICpwdHIgX191bnVzZWQsCisJdW5zaWduZWQgc2hvcnQgcHR5cGUgX191bnVzZWQsIHN0cnVjdCBpcGhkciAqaXAgX191bnVzZWQsIAorCXN0cnVjdCB1ZHBoZHIgKnVkcCkKK3sKKwlzdHJ1Y3QJYm9vdHBfdCAqYm9vdHByZXBseTsKKwlpbnQgbGVuOwkJLyogTGVuZ3RoIG9mIHZlbmRvciAqLworCisJaWYgKCF1ZHApIHsKKwkJcmV0dXJuIDA7CisJfQorCWJvb3RwcmVwbHkgPSAoc3RydWN0IGJvb3RwX3QgKikKKwkJJm5pYy5wYWNrZXRbRVRIX0hMRU4gKyBzaXplb2Yoc3RydWN0IGlwaGRyKSArIHNpemVvZihzdHJ1Y3QgdWRwaGRyKV07CisJbGVuID0gbmljLnBhY2tldGxlbiAtIChFVEhfSExFTiArIHNpemVvZihzdHJ1Y3QgaXBoZHIpICsgCisJCXNpemVvZihzdHJ1Y3QgdWRwaGRyKSArIHNpemVvZihzdHJ1Y3QgYm9vdHBfdCkgLSBCT09UUF9WRU5ET1JfTEVOKTsKKwlpZiAobGVuIDwgMCkgeworCQlyZXR1cm4gMDsKKwl9CisJaWYgKHVkcC0+ZGVzdCAhPSBodG9ucyhCT09UUF9DTElFTlQpKQorCQlyZXR1cm4gMDsKKwlpZiAoYm9vdHByZXBseS0+YnBfb3AgIT0gQk9PVFBfUkVQTFkpCisJCXJldHVybiAwOworCWlmIChib290cHJlcGx5LT5icF94aWQgIT0geGlkKQorCQlyZXR1cm4gMDsKKwlpZiAobWVtY21wKChjaGFyICopJmJvb3RwcmVwbHktPmJwX3NpYWRkciwgKGNoYXIgKikmemVyb0lQLCBzaXplb2YoaW5fYWRkcikpID09IDApCisJCXJldHVybiAwOworCWlmICgobWVtY21wKGJyb2FkY2FzdCwgYm9vdHByZXBseS0+YnBfaHdhZGRyLCBFVEhfQUxFTikgIT0gMCkgJiYKKwkgICAgKG1lbWNtcChhcnB0YWJsZVtBUlBfQ0xJRU5UXS5ub2RlLCBib290cHJlcGx5LT5icF9od2FkZHIsIEVUSF9BTEVOKSAhPSAwKSkgeworCQlyZXR1cm4gMDsKKwl9CisJYXJwdGFibGVbQVJQX0NMSUVOVF0uaXBhZGRyLnNfYWRkciA9IGJvb3RwcmVwbHktPmJwX3lpYWRkci5zX2FkZHI7CisJbmV0bWFzayA9IGRlZmF1bHRfbmV0bWFzaygpOworCWFycHRhYmxlW0FSUF9TRVJWRVJdLmlwYWRkci5zX2FkZHIgPSBib290cHJlcGx5LT5icF9zaWFkZHIuc19hZGRyOworCW1lbXNldChhcnB0YWJsZVtBUlBfU0VSVkVSXS5ub2RlLCAwLCBFVEhfQUxFTik7ICAvKiBLaWxsIGFycCAqLworCWFycHRhYmxlW0FSUF9HQVRFV0FZXS5pcGFkZHIuc19hZGRyID0gYm9vdHByZXBseS0+YnBfZ2lhZGRyLnNfYWRkcjsKKwltZW1zZXQoYXJwdGFibGVbQVJQX0dBVEVXQVldLm5vZGUsIDAsIEVUSF9BTEVOKTsgIC8qIEtpbGwgYXJwICovCisJLyogV2UgZG9uJ3QgY2FyZSBib290cHJlcGx5LT5icF9maWxlLCBpdCBtdXN0IGJlICdweGVncnViJzotKSAqLworCW1lbWNweSgoY2hhciAqKXJmYzE1MzNfdmVuZGRhdGEsIChjaGFyICopKGJvb3RwcmVwbHktPmJwX3ZlbmQpLCBsZW4pOworCWRlY29kZV9yZmMxNTMzKHJmYzE1MzNfdmVuZGRhdGEsIDAsIGxlbiwgMSk7CisJcmV0dXJuKDEpOworfQorCitpbnQgYm9vdHAodm9pZCkKK3sKKwlpbnQgcmV0cnk7CisJc3RydWN0IGJvb3RwaXBfdCBpcDsKKwl1bnNpZ25lZCBsb25nICBzdGFydHRpbWU7CisJCisJRW50ZXJGdW5jdGlvbigiYm9vdHAiKTsKKworCWlmKCFncnViX2V0aF9wcm9iZSgpKQorCQlyZXR1cm4gMDsKKwluZXR3b3JrX3JlYWR5ID0gMDsKKworCW1lbXNldCgmaXAsIDAsIHNpemVvZihzdHJ1Y3QgYm9vdHBpcF90KSk7CisJaXAuYnAuYnBfb3AgPSBCT09UUF9SRVFVRVNUOworCWlwLmJwLmJwX2h0eXBlID0gMTsKKwlpcC5icC5icF9obGVuID0gRVRIX0FMRU47CisJc3RhcnR0aW1lID0gY3VycnRpY2tzKCk7CisJLyogVXNlIGxvd2VyIDMyIGJpdHMgb2Ygbm9kZSBhZGRyZXNzLCBtb3JlIGxpa2VseSB0byBiZQorCSAgIGRpc3RpbmN0IHRoYW4gdGhlIHRpbWUgc2luY2UgYm9vdGluZyAqLworCW1lbWNweSgmeGlkLCAmYXJwdGFibGVbQVJQX0NMSUVOVF0ubm9kZVsyXSwgc2l6ZW9mKHhpZCkpOworCWlwLmJwLmJwX3hpZCA9IHhpZCArPSBodG9ubChzdGFydHRpbWUpOworCS8qIGJwX3NlY3MgZGVmYXVsdHMgdG8gemVybyAqLworCW1lbWNweShpcC5icC5icF9od2FkZHIsIGFycHRhYmxlW0FSUF9DTElFTlRdLm5vZGUsIEVUSF9BTEVOKTsKKwltZW1jcHkoaXAuYnAuYnBfdmVuZCwgcmZjMTUzM19jb29raWVfYm9vdHAsIHNpemVvZihyZmMxNTMzX2Nvb2tpZV9ib290cCkpOyAvKiByZXF1ZXN0IFJGQy1zdHlsZSBvcHRpb25zICovCisKKwlmb3IgKHJldHJ5ID0gMDsgcmV0cnkgPCBNQVhfQk9PVFBfUkVUUklFUzsgKSB7CisJCWxvbmcgdGltZW91dDsKKworCQlyeF9xZHJhaW4oKTsKKworCQl1ZHBfdHJhbnNtaXQoSVBfQlJPQURDQVNULCBCT09UUF9DTElFTlQsIEJPT1RQX1NFUlZFUiwKKwkJCXNpemVvZihzdHJ1Y3QgYm9vdHBpcF90KSwgJmlwKTsKKwkJdGltZW91dCA9IHJmYzIxMzFfc2xlZXBfaW50ZXJ2YWwoVElNRU9VVCwgcmV0cnkrKyk7CisJCWlmIChhd2FpdF9yZXBseShhd2FpdF9ib290cCwgMCwgTlVMTCwgdGltZW91dCkpeworCQkJbmV0d29ya19yZWFkeSA9IDE7CisJCQlyZXR1cm4oMSk7CisJCX0KKwkJaWYgKHVzZXJfYWJvcnQpCisJCQlyZXR1cm4gMDsKKwkJaXAuYnAuYnBfc2VjcyA9IGh0b25zKChjdXJydGlja3MoKS1zdGFydHRpbWUpL1RJQ0tTX1BFUl9TRUMpOworCX0KKwlyZXR1cm4oMCk7Cit9CisKKy8qKgorICogZGhjcAorICoKKyAqIEdldCBJUCBhZGRyZXNzIGJ5IGRoY3AsIHNlZ3JlZ2F0ZSBmcm9tIGJvb3RwIGluIGV0aGVyYm9vdC4KKyAqKi8KK3N0YXRpYyBpbnQgYXdhaXRfZGhjcChpbnQgaXZhbCBfX3VudXNlZCwgdm9pZCAqcHRyIF9fdW51c2VkLAorCXVuc2lnbmVkIHNob3J0IHB0eXBlIF9fdW51c2VkLCBzdHJ1Y3QgaXBoZHIgKmlwIF9fdW51c2VkLCAKKwlzdHJ1Y3QgdWRwaGRyICp1ZHApCit7CisJc3RydWN0CWRoY3BfdCAqZGhjcHJlcGx5OworCWludCBsZW47CisKKwlpZiAoIXVkcCkgeworCQlyZXR1cm4gMDsKKwl9CisJZGhjcHJlcGx5ID0gKHN0cnVjdCBkaGNwX3QgKikKKwkJJm5pYy5wYWNrZXRbRVRIX0hMRU4gKyBzaXplb2Yoc3RydWN0IGlwaGRyKSArIHNpemVvZihzdHJ1Y3QgdWRwaGRyKV07CisJbGVuID0gbmljLnBhY2tldGxlbiAtIChFVEhfSExFTiArIHNpemVvZihzdHJ1Y3QgaXBoZHIpICsgCisJCXNpemVvZihzdHJ1Y3QgdWRwaGRyKSArIHNpemVvZihzdHJ1Y3QgZGhjcF90KSAtIERIQ1BfT1BUX0xFTik7CisJaWYgKGxlbiA8IDApeworCQlyZXR1cm4gMDsKKwl9CisJaWYgKHVkcC0+ZGVzdCAhPSBodG9ucyhCT09UUF9DTElFTlQpKQorCQlyZXR1cm4gMDsKKwlpZiAoZGhjcHJlcGx5LT5icF9vcCAhPSBCT09UUF9SRVBMWSkKKwkJcmV0dXJuIDA7CisJaWYgKGRoY3ByZXBseS0+YnBfeGlkICE9IHhpZCkKKwkJcmV0dXJuIDA7CisJaWYgKG1lbWNtcCgoY2hhciAqKSZkaGNwcmVwbHktPmJwX3NpYWRkciwgKGNoYXIgKikmemVyb0lQLCBzaXplb2YoaW5fYWRkcikpID09IDApCisJCXJldHVybiAwOworCWlmICgobWVtY21wKGJyb2FkY2FzdCwgZGhjcHJlcGx5LT5icF9od2FkZHIsIEVUSF9BTEVOKSAhPSAwKSAmJgorCSAgICAobWVtY21wKGFycHRhYmxlW0FSUF9DTElFTlRdLm5vZGUsIGRoY3ByZXBseS0+YnBfaHdhZGRyLCBFVEhfQUxFTikgIT0gMCkpIHsKKwkJcmV0dXJuIDA7CisJfQorCWFycHRhYmxlW0FSUF9DTElFTlRdLmlwYWRkci5zX2FkZHIgPSBkaGNwcmVwbHktPmJwX3lpYWRkci5zX2FkZHI7CisJZGhjcF9hZGRyLnNfYWRkciA9IGRoY3ByZXBseS0+YnBfeWlhZGRyLnNfYWRkcjsKKwluZXRtYXNrID0gZGVmYXVsdF9uZXRtYXNrKCk7CisJYXJwdGFibGVbQVJQX1NFUlZFUl0uaXBhZGRyLnNfYWRkciA9IGRoY3ByZXBseS0+YnBfc2lhZGRyLnNfYWRkcjsKKwltZW1zZXQoYXJwdGFibGVbQVJQX1NFUlZFUl0ubm9kZSwgMCwgRVRIX0FMRU4pOyAgLyogS2lsbCBhcnAgKi8KKwlhcnB0YWJsZVtBUlBfR0FURVdBWV0uaXBhZGRyLnNfYWRkciA9IGRoY3ByZXBseS0+YnBfZ2lhZGRyLnNfYWRkcjsKKwltZW1zZXQoYXJwdGFibGVbQVJQX0dBVEVXQVldLm5vZGUsIDAsIEVUSF9BTEVOKTsgIC8qIEtpbGwgYXJwICovCisJLyogV2UgZG9uJ3QgY2FyZSBib290cHJlcGx5LT5icF9maWxlLiBJdCBtdXN0IGJlICdweGVncnViJyAqLworCW1lbWNweSgoY2hhciAqKXJmYzE1MzNfdmVuZGRhdGEsIChjaGFyICopKGRoY3ByZXBseS0+YnBfdmVuZCksIGxlbik7CisJZGVjb2RlX3JmYzE1MzMocmZjMTUzM192ZW5kZGF0YSwgMCwgbGVuLCAxKTsKKwlyZXR1cm4oMSk7Cit9CisKK2ludCBkaGNwKHZvaWQpCit7CisJaW50IHJldHJ5OworCWludCByZXFyZXRyeTsKKwlzdHJ1Y3QgZGhjcGlwX3QgaXA7CisJdW5zaWduZWQgbG9uZyAgc3RhcnR0aW1lOworCisJaWYoIWdydWJfZXRoX3Byb2JlKCkpCisJCXJldHVybiAwOworCisJbmV0d29ya19yZWFkeSA9IDA7CisKKwltZW1zZXQoJmlwLCAwLCBzaXplb2Yoc3RydWN0IGRoY3BpcF90KSk7CisJaXAuYnAuYnBfb3AgPSBCT09UUF9SRVFVRVNUOworCWlwLmJwLmJwX2h0eXBlID0gMTsKKwlpcC5icC5icF9obGVuID0gRVRIX0FMRU47CisJc3RhcnR0aW1lID0gY3VycnRpY2tzKCk7CisJLyogVXNlIGxvd2VyIDMyIGJpdHMgb2Ygbm9kZSBhZGRyZXNzLCBtb3JlIGxpa2VseSB0byBiZQorCSAgIGRpc3RpbmN0IHRoYW4gdGhlIHRpbWUgc2luY2UgYm9vdGluZyAqLworCW1lbWNweSgmeGlkLCAmYXJwdGFibGVbQVJQX0NMSUVOVF0ubm9kZVsyXSwgc2l6ZW9mKHhpZCkpOworCWlwLmJwLmJwX3hpZCA9IHhpZCArPSBodG9ubChzdGFydHRpbWUpOworCW1lbWNweShpcC5icC5icF9od2FkZHIsIGFycHRhYmxlW0FSUF9DTElFTlRdLm5vZGUsIEVUSF9BTEVOKTsKKwltZW1jcHkoaXAuYnAuYnBfdmVuZCwgcmZjMTUzM19jb29raWVfZGhjcCwgc2l6ZW9mIHJmYzE1MzNfY29va2llX2RoY3ApOyAvKiByZXF1ZXN0IFJGQy1zdHlsZSBvcHRpb25zICovCisJbWVtY3B5KGlwLmJwLmJwX3ZlbmQgKyBzaXplb2YgcmZjMTUzM19jb29raWVfZGhjcCwgZGhjcGRpc2NvdmVyLCBzaXplb2YgZGhjcGRpc2NvdmVyKTsKKworCWZvciAocmV0cnkgPSAwOyByZXRyeSA8IE1BWF9CT09UUF9SRVRSSUVTOyApIHsKKwkJbG9uZyB0aW1lb3V0OworCisJCXJ4X3FkcmFpbigpOworCisJCXVkcF90cmFuc21pdChJUF9CUk9BRENBU1QsIEJPT1RQX0NMSUVOVCwgQk9PVFBfU0VSVkVSLAorCQkJICAgICBzaXplb2Yoc3RydWN0IGJvb3RwaXBfdCksICZpcCk7CisJCXRpbWVvdXQgPSByZmMyMTMxX3NsZWVwX2ludGVydmFsKFRJTUVPVVQsIHJldHJ5KyspOworCQlpZiAoYXdhaXRfcmVwbHkoYXdhaXRfZGhjcCwgMCwgTlVMTCwgdGltZW91dCkpIHsKKwkJCS8qIElmIG5vdCBhIERIQ1BPRkZFUiB0aGVuIG11c3QgYmUganVzdCBhCisJCQkgICBCT09UUCByZXBseSwgYmUgYmFja3dhcmQgY29tcGF0aWJsZSB3aXRoCisJCQkgICBCT09UUCB0aGVuLiBKc2NvdHQgcmVwb3J0IGEgYnVnIGhlcmUsIGJ1dCBJCisJCQkgICBkb24ndCBrbm93IGhvdyBpdCBoYXBwZW5lZCAqLworCQkJaWYgKGRoY3BfcmVwbHkgIT0gREhDUE9GRkVSKXsKKwkJCQluZXR3b3JrX3JlYWR5ID0gMTsKKwkJCQlyZXR1cm4oMSk7CisJCQl9CisJCQlkaGNwX3JlcGx5ID0gMDsKKwkJCW1lbWNweShpcC5icC5icF92ZW5kLCByZmMxNTMzX2Nvb2tpZV9kaGNwLCBzaXplb2YgcmZjMTUzM19jb29raWVfZGhjcCk7CisJCQltZW1jcHkoaXAuYnAuYnBfdmVuZCArIHNpemVvZiByZmMxNTMzX2Nvb2tpZV9kaGNwLCBkaGNwcmVxdWVzdCwgc2l6ZW9mIGRoY3ByZXF1ZXN0KTsKKwkJCS8qIEJld2FyZTogdGhlIG1hZ2ljIG51bWJlcnMgOSBhbmQgMTUgZGVwZW5kIG9uCisJCQkgICB0aGUgbGF5b3V0IG9mIGRoY3ByZXF1ZXN0ICovCisJCQltZW1jcHkoJmlwLmJwLmJwX3ZlbmRbOV0sICZkaGNwX3NlcnZlciwgc2l6ZW9mKGluX2FkZHIpKTsKKwkJCW1lbWNweSgmaXAuYnAuYnBfdmVuZFsxNV0sICZkaGNwX2FkZHIsIHNpemVvZihpbl9hZGRyKSk7CisJCQlmb3IgKHJlcXJldHJ5ID0gMDsgcmVxcmV0cnkgPCBNQVhfQk9PVFBfUkVUUklFUzsgKSB7CisJCQkJdWRwX3RyYW5zbWl0KElQX0JST0FEQ0FTVCwgQk9PVFBfQ0xJRU5ULCBCT09UUF9TRVJWRVIsCisJCQkJCSAgICAgc2l6ZW9mKHN0cnVjdCBib290cGlwX3QpLCAmaXApOworCQkJCWRoY3BfcmVwbHk9MDsKKwkJCQl0aW1lb3V0ID0gcmZjMjEzMV9zbGVlcF9pbnRlcnZhbChUSU1FT1VULCByZXFyZXRyeSsrKTsKKwkJCQlpZiAoYXdhaXRfcmVwbHkoYXdhaXRfZGhjcCwgMCwgTlVMTCwgdGltZW91dCkpCisJCQkJCWlmIChkaGNwX3JlcGx5ID09IERIQ1BBQ0speworCQkJCQkJbmV0d29ya19yZWFkeSA9IDE7CisJCQkJCQlyZXR1cm4oMSk7CisJCQkJCX0KKwkJCQlpZiAodXNlcl9hYm9ydCkKKwkJCQkJcmV0dXJuIDA7CisJCQl9CisJCX0KKwkJaWYgKHVzZXJfYWJvcnQpCisJCQlyZXR1cm4gMDsKKwkJaXAuYnAuYnBfc2VjcyA9IGh0b25zKChjdXJydGlja3MoKS1zdGFydHRpbWUpL1RJQ0tTX1BFUl9TRUMpOworCX0KKwlyZXR1cm4oMCk7Cit9CisKKyNpZmRlZiBNVUxUSUNBU1RfTEVWRUwyCitzdGF0aWMgdm9pZCBzZW5kX2lnbXBfcmVwb3J0cyh1bnNpZ25lZCBsb25nIG5vdykKK3sKKwlpbnQgaTsKKwlmb3IoaSA9IDA7IGkgPCBNQVhfSUdNUDsgaSsrKSB7CisJCWlmIChpZ21wdGFibGVbaV0udGltZSAmJiAobm93ID49IGlnbXB0YWJsZVtpXS50aW1lKSkgeworCQkJc3RydWN0IGlnbXBfaXBfdCBpZ21wOworCQkJaWdtcC5yb3V0ZXJfYWxlcnRbMF0gPSAweDk0OworCQkJaWdtcC5yb3V0ZXJfYWxlcnRbMV0gPSAweDA0OworCQkJaWdtcC5yb3V0ZXJfYWxlcnRbMl0gPSAwOworCQkJaWdtcC5yb3V0ZXJfYWxlcnRbM10gPSAwOworCQkJYnVpbGRfaXBfaGRyKGlnbXB0YWJsZVtpXS5ncm91cC5zX2FkZHIsIAorCQkJCTEsIElQX0lHTVAsIHNpemVvZihpZ21wLnJvdXRlcl9hbGVydCksIHNpemVvZihpZ21wKSwgJmlnbXApOworCQkJaWdtcC5pZ21wLnR5cGUgPSBJR01QdjJfUkVQT1JUOworCQkJaWYgKGxhc3RfaWdtcHYxICYmIAorCQkJCShub3cgPCBsYXN0X2lnbXB2MSArIElHTVB2MV9ST1VURVJfUFJFU0VOVF9USU1FT1VUKSkgeworCQkJCWlnbXAuaWdtcC50eXBlID0gSUdNUHYxX1JFUE9SVDsKKwkJCX0KKwkJCWlnbXAuaWdtcC5yZXNwb25zZV90aW1lID0gMDsKKwkJCWlnbXAuaWdtcC5jaGtzdW0gPSAwOworCQkJaWdtcC5pZ21wLmdyb3VwLnNfYWRkciA9IGlnbXB0YWJsZVtpXS5ncm91cC5zX2FkZHI7CisJCQlpZ21wLmlnbXAuY2hrc3VtID0gaXBjaGtzdW0oJmlnbXAuaWdtcCwgc2l6ZW9mKGlnbXAuaWdtcCkpOworCQkJaXBfdHJhbnNtaXQoc2l6ZW9mKGlnbXApLCAmaWdtcCk7CisjaWZkZWYJTURFQlVHCisJCQlwcmludGYoIlNlbnQgSUdNUCByZXBvcnQgdG86ICVAXG4iLCBpZ21wLmlnbXAuZ3JvdXAuc19hZGRyKTsKKyNlbmRpZgorCQkJLyogRG9uJ3Qgc2VuZCBhbm90aGVyIGlnbXAgcmVwb3J0IHVudGlsIGFza2VkICovCisJCQlpZ21wdGFibGVbaV0udGltZSA9IDA7CisJCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkIHByb2Nlc3NfaWdtcChzdHJ1Y3QgaXBoZHIgKmlwLCB1bnNpZ25lZCBsb25nIG5vdykKK3sKKwlzdHJ1Y3QgaWdtcCAqaWdtcDsKKwlpbnQgaTsKKwl1bnNpZ25lZCBpcGxlbiA9IDA7CisJaWYgKCFpcCB8fCAoaXAtPnByb3RvY29sID09IElQX0lHTVApIHx8CisJCShuaWMucGFja2V0bGVuIDwgc2l6ZW9mKHN0cnVjdCBpcGhkcikgKyBzaXplb2Yoc3RydWN0IGlnbXApKSkgeworCQlyZXR1cm47CisJfQorCWlwbGVuID0gKGlwLT52ZXJoZHJsZW4gJiAweGYpKjQ7CisJaWdtcCA9IChzdHJ1Y3QgaWdtcCAqKSZuaWMucGFja2V0W3NpemVvZihzdHJ1Y3QgaXBoZHIpXTsKKwlpZiAoaXBjaGtzdW0oaWdtcCwgbnRvaHMoaXAtPmxlbikgLSBpcGxlbikgIT0gMCkKKwkJcmV0dXJuOworCWlmICgoaWdtcC0+dHlwZSA9PSBJR01QX1FVRVJZKSAmJiAKKwkJKGlwLT5kZXN0LnNfYWRkciA9PSBodG9ubChHUk9VUF9BTExfSE9TVFMpKSkgeworCQl1bnNpZ25lZCBsb25nIGludGVydmFsID0gSUdNUF9JTlRFUlZBTDsKKwkJaWYgKGlnbXAtPnJlc3BvbnNlX3RpbWUgPT0gMCkgeworCQkJbGFzdF9pZ21wdjEgPSBub3c7CisJCX0gZWxzZSB7CisJCQlpbnRlcnZhbCA9IChpZ21wLT5yZXNwb25zZV90aW1lICogVElDS1NfUEVSX1NFQykvMTA7CisJCX0KKwkJCisjaWZkZWYJTURFQlVHCisJCXByaW50ZigiUmVjZWl2ZWQgSUdNUCBxdWVyeSBmb3I6ICVAXG4iLCBpZ21wLT5ncm91cC5zX2FkZHIpOworI2VuZGlmCQkJICAgICAgIAorCQlmb3IoaSA9IDA7IGkgPCBNQVhfSUdNUDsgaSsrKSB7CisJCQl1aW50MzJfdCBncm91cCA9IGlnbXB0YWJsZVtpXS5ncm91cC5zX2FkZHI7CisJCQlpZiAoKGdyb3VwID09IDApIHx8IChncm91cCA9PSBpZ21wLT5ncm91cC5zX2FkZHIpKSB7CisJCQkJdW5zaWduZWQgbG9uZyB0aW1lOworCQkJCXRpbWUgPSBjdXJydGlja3MoKSArIHJmYzExMTJfc2xlZXBfaW50ZXJ2YWwoaW50ZXJ2YWwsIDApOworCQkJCWlmICh0aW1lIDwgaWdtcHRhYmxlW2ldLnRpbWUpIHsKKwkJCQkJaWdtcHRhYmxlW2ldLnRpbWUgPSB0aW1lOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKwlpZiAoKChpZ21wLT50eXBlID09IElHTVB2MV9SRVBPUlQpIHx8IChpZ21wLT50eXBlID09IElHTVB2Ml9SRVBPUlQpKSAmJgorCQkoaXAtPmRlc3Quc19hZGRyID09IGlnbXAtPmdyb3VwLnNfYWRkcikpIHsKKyNpZmRlZglNREVCVUcKKwkJcHJpbnRmKCJSZWNlaXZlZCBJR01QIHJlcG9ydCBmb3I6ICVAXG4iLCBpZ21wLT5ncm91cC5zX2FkZHIpOworI2VuZGlmCQkJICAgICAgIAorCQlmb3IoaSA9IDA7IGkgPCBNQVhfSUdNUDsgaSsrKSB7CisJCQlpZiAoKGlnbXB0YWJsZVtpXS5ncm91cC5zX2FkZHIgPT0gaWdtcC0+Z3JvdXAuc19hZGRyKSAmJgorCQkJCWlnbXB0YWJsZVtpXS50aW1lICE9IDApIHsKKwkJCQlpZ21wdGFibGVbaV0udGltZSA9IDA7CisJCQl9CisJCX0KKwl9Cit9CisKK3ZvaWQgbGVhdmVfZ3JvdXAoaW50IHNsb3QpCit7CisJLyogQmUgdmVyeSBzdHVwaWQgYW5kIGFsd2F5cyBzZW5kIGEgbGVhdmUgZ3JvdXAgbWVzc2FnZSBpZiAKKwkgKiBJIGhhdmUgc3Vic2NyaWJlZC4gIEltcGVyZmVjdCBidXQgaXQgaXMgc3RhbmRhcmRzCisJICogY29tcGxpYW50LCBlYXN5IGFuZCByZWxpYWJsZSB0byBpbXBsZW1lbnQuCisJICoKKwkgKiBUaGUgb3B0aW1hbCBncm91cCBsZWF2ZSBtZXRob2QgaXMgdG8gb25seSBzZW5kIGxlYXZlIHdoZW4sCisJICogd2Ugd2VyZSB0aGUgbGFzdCBob3N0IHRvIHJlc3BvbmQgdG8gYSBxdWVyeSBvbiB0aGlzIGdyb3VwLAorCSAqIGFuZCBpZ21wdjEgY29tcGF0aWJpbGl0eSBpcyBub3QgZW5hYmxlZC4KKwkgKi8KKwlpZiAoaWdtcHRhYmxlW3Nsb3RdLmdyb3VwLnNfYWRkcikgeworCQlzdHJ1Y3QgaWdtcF9pcF90IGlnbXA7CisJCWlnbXAucm91dGVyX2FsZXJ0WzBdID0gMHg5NDsKKwkJaWdtcC5yb3V0ZXJfYWxlcnRbMV0gPSAweDA0OworCQlpZ21wLnJvdXRlcl9hbGVydFsyXSA9IDA7CisJCWlnbXAucm91dGVyX2FsZXJ0WzNdID0gMDsKKwkJYnVpbGRfaXBfaGRyKGh0b25sKEdST1VQX0FMTF9IT1NUUyksCisJCQkxLCBJUF9JR01QLCBzaXplb2YoaWdtcC5yb3V0ZXJfYWxlcnQpLCBzaXplb2YoaWdtcCksICZpZ21wKTsKKwkJaWdtcC5pZ21wLnR5cGUgPSBJR01QX0xFQVZFOworCQlpZ21wLmlnbXAucmVzcG9uc2VfdGltZSA9IDA7CisJCWlnbXAuaWdtcC5jaGtzdW0gPSAwOworCQlpZ21wLmlnbXAuZ3JvdXAuc19hZGRyID0gaWdtcHRhYmxlW3Nsb3RdLmdyb3VwLnNfYWRkcjsKKwkJaWdtcC5pZ21wLmNoa3N1bSA9IGlwY2hrc3VtKCZpZ21wLmlnbXAsIHNpemVvZihpZ21wKSk7CisJCWlwX3RyYW5zbWl0KHNpemVvZihpZ21wKSwgJmlnbXApOworI2lmZGVmCU1ERUJVRworCQlwcmludGYoIlNlbnQgSUdNUCBsZWF2ZSBmb3I6ICVAXG4iLCBpZ21wLmlnbXAuZ3JvdXAuc19hZGRyKTsKKyNlbmRpZgkKKwl9CisJbWVtc2V0KCZpZ21wdGFibGVbc2xvdF0sIDAsIHNpemVvZihpZ21wdGFibGVbMF0pKTsKK30KKwordm9pZCBqb2luX2dyb3VwKGludCBzbG90LCB1bnNpZ25lZCBsb25nIGdyb3VwKQoreworCS8qIEkgaGF2ZSBhbHJlYWR5IGpvaW5lZCAqLworCWlmIChpZ21wdGFibGVbc2xvdF0uZ3JvdXAuc19hZGRyID09IGdyb3VwKQorCQlyZXR1cm47CisJaWYgKGlnbXB0YWJsZVtzbG90XS5ncm91cC5zX2FkZHIpIHsKKwkJbGVhdmVfZ3JvdXAoc2xvdCk7CisJfQorCS8qIE9ubHkgam9pbiBhIGdyb3VwIGlmIHdlIGFyZSBnaXZlbiBhIG11bHRpY2FzdCBpcCwgdGhpcyB3YXkKKwkgKiBjb2RlIGNhbiBiZSBnaXZlbiBhIG5vbi1tdWx0aWNhc3QgKGJyb2FkY2FzdCBvciB1bmljYXN0IGlwKQorCSAqIGFuZCBzdGlsbCB3b3JrLi4uIAorCSAqLworCWlmICgoZ3JvdXAgJiBodG9ubChNVUxUSUNBU1RfTUFTSykpID09IGh0b25sKE1VTFRJQ0FTVF9ORVRXT1JLKSkgeworCQlpZ21wdGFibGVbc2xvdF0uZ3JvdXAuc19hZGRyID0gZ3JvdXA7CisJCWlnbXB0YWJsZVtzbG90XS50aW1lID0gY3VycnRpY2tzKCk7CisJfQorfQorI2Vsc2UKKyNkZWZpbmUgc2VuZF9pZ21wX3JlcG9ydHMobm93KTsKKyNkZWZpbmUgcHJvY2Vzc19pZ21wKGlwLCBub3cpCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitBV0FJVF9SRVBMWSAtIFdhaXQgdW50aWwgd2UgZ2V0IGEgcmVzcG9uc2UgZm9yIG91ciByZXF1ZXN0CisqKioqKioqKioqKipmKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgYXdhaXRfcmVwbHkocmVwbHlfdCByZXBseSwgaW50IGl2YWwsIHZvaWQgKnB0ciwgbG9uZyB0aW1lb3V0KQoreworCXVuc2lnbmVkIGxvbmcgdGltZSwgbm93OworCXN0cnVjdAlpcGhkciAqaXA7CisJdW5zaWduZWQgaXBsZW4gPSAwOworCXN0cnVjdAl1ZHBoZHIgKnVkcDsKKwl1bnNpZ25lZCBzaG9ydCBwdHlwZTsKKwlpbnQgcmVzdWx0OworCisJdXNlcl9hYm9ydCA9IDA7CisKKwl0aW1lID0gdGltZW91dCArIGN1cnJ0aWNrcygpOworCS8qIFRoZSB0aW1lb3V0IGNoZWNrIGlzIGRvbmUgYmVsb3cuICBUaGUgdGltZW91dCBpcyBvbmx5IGNoZWNrZWQgaWYKKwkgKiB0aGVyZSBpcyBubyBwYWNrZXQgaW4gdGhlIFJ4IHF1ZXVlLiAgVGhpcyBhc3N1bWVzIHRoYXQgZXRoX3BvbGwoKQorCSAqIG5lZWRzIGEgbmVnbGlnaWJsZSBhbW91bnQgb2YgdGltZS4gIAorCSAqLworCWZvciAoOzspIHsKKwkJbm93ID0gY3VycnRpY2tzKCk7CisJCXNlbmRfaWdtcF9yZXBvcnRzKG5vdyk7CisJCXJlc3VsdCA9IGV0aF9wb2xsKDEpOworCQlpZiAocmVzdWx0ID09IDApIHsKKwkJCS8qIFdlIGRvbid0IGhhdmUgYW55dGhpbmcgKi8KKwkJCisJCQkvKiBDaGVjayBmb3IgYWJvcnQga2V5IG9ubHkgaWYgdGhlIFJ4IHF1ZXVlIGlzIGVtcHR5IC0KKwkJCSAqIGFzIGxvbmcgYXMgd2UgaGF2ZSBzb21ldGhpbmcgdG8gcHJvY2VzcywgZG9uJ3QKKwkJCSAqIGFzc3VtZSB0aGF0IHNvbWV0aGluZyBmYWlsZWQuICBJdCBpcyB1bmxpa2VseSB0aGF0CisJCQkgKiB3ZSBoYXZlIG5vIHByb2Nlc3NpbmcgdGltZSBsZWZ0IGJldHdlZW4gcGFja2V0cy4gICovCisJCQlwb2xsX2ludGVycnVwdGlvbnMoKTsKKwkJCS8qIERvIHRoZSB0aW1lb3V0IGFmdGVyIGF0IGxlYXN0IGEgZnVsbCBxdWV1ZSB3YWxrLiAgKi8KKwkJCWlmICgodGltZW91dCA9PSAwKSB8fCAoY3VycnRpY2tzKCkgPiB0aW1lKSB8fCB1c2VyX2Fib3J0ID09IDEpIHsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWNvbnRpbnVlOworCQl9CisJCisJCS8qIFdlIGhhdmUgc29tZXRoaW5nISAqLworCisJCS8qIEZpbmQgdGhlIEV0aGVybmV0IHBhY2tldCB0eXBlICovCisJCWlmIChuaWMucGFja2V0bGVuID49IEVUSF9ITEVOKSB7CisJCQlwdHlwZSA9ICgodW5zaWduZWQgc2hvcnQpIG5pYy5wYWNrZXRbMTJdKSA8PCA4CisJCQkJfCAoKHVuc2lnbmVkIHNob3J0KSBuaWMucGFja2V0WzEzXSk7CisJCX0gZWxzZSBjb250aW51ZTsgLyogd2hhdCBlbHNlIGNvdWxkIHdlIGRvIHdpdGggaXQ/ICovCisJCS8qIFZlcmlmeSBhbiBJUCBoZWFkZXIgKi8KKwkJaXAgPSAwOworCQlpZiAoKHB0eXBlID09IElQKSAmJiAobmljLnBhY2tldGxlbiA+PSBFVEhfSExFTiArIHNpemVvZihzdHJ1Y3QgaXBoZHIpKSkgeworCQkJdW5zaWduZWQgaXBvcHRsZW47CisJCQlpcCA9IChzdHJ1Y3QgaXBoZHIgKikmbmljLnBhY2tldFtFVEhfSExFTl07CisJCQlpZiAoKGlwLT52ZXJoZHJsZW4gPCAweDQ1KSB8fCAoaXAtPnZlcmhkcmxlbiA+IDB4NEYpKSAKKwkJCQljb250aW51ZTsKKwkJCWlwbGVuID0gKGlwLT52ZXJoZHJsZW4gJiAweGYpICogNDsKKwkJCWlmIChpcGNoa3N1bShpcCwgaXBsZW4pICE9IDApCisJCQkJY29udGludWU7CisJCQlpZiAoaXAtPmZyYWdzICYgaHRvbnMoMHgzRkZGKSkgeworCQkJCXN0YXRpYyBpbnQgd2FybmVkX2ZyYWdtZW50YXRpb24gPSAwOworCQkJCWlmICghd2FybmVkX2ZyYWdtZW50YXRpb24pIHsKKwkJCQkJcHJpbnRmKCJBTEVSVDogZ290IGEgZnJhZ21lbnRlZCBwYWNrZXQgLSByZWNvbmZpZ3VyZSB5b3VyIHNlcnZlclxuIik7CisJCQkJCXdhcm5lZF9mcmFnbWVudGF0aW9uID0gMTsKKwkJCQl9CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAobnRvaHMoaXAtPmxlbikgPiBFVEhfTUFYX01UVSkKKwkJCQljb250aW51ZTsKKworCQkJaXBvcHRsZW4gPSBpcGxlbiAtIHNpemVvZihzdHJ1Y3QgaXBoZHIpOworCQkJaWYgKGlwb3B0bGVuKSB7CisJCQkJLyogRGVsZXRlIHRoZSBpcCBvcHRpb25zLCB0byBndWFyYW50ZWUKKwkJCQkgKiBnb29kIGFsaWdubWVudCwgYW5kIG1ha2UgZXRoZXJib290IHNpbXBsZXIuCisJCQkJICovCisJCQkJbWVtbW92ZSgmbmljLnBhY2tldFtFVEhfSExFTiArIHNpemVvZihzdHJ1Y3QgaXBoZHIpXSwgCisJCQkJCSZuaWMucGFja2V0W0VUSF9ITEVOICsgaXBsZW5dLAorCQkJCQluaWMucGFja2V0bGVuIC0gaXBvcHRsZW4pOworCQkJCW5pYy5wYWNrZXRsZW4gLT0gaXBvcHRsZW47CisJCQl9CisJCX0KKwkJdWRwID0gMDsKKwkJaWYgKGlwICYmIChpcC0+cHJvdG9jb2wgPT0gSVBfVURQKSAmJiAKKwkJICAgIChuaWMucGFja2V0bGVuID49IEVUSF9ITEVOICsgc2l6ZW9mKHN0cnVjdCBpcGhkcikgKyBzaXplb2Yoc3RydWN0IHVkcGhkcikpKSB7CisJCQl1ZHAgPSAoc3RydWN0IHVkcGhkciAqKSZuaWMucGFja2V0W0VUSF9ITEVOICsgc2l6ZW9mKHN0cnVjdCBpcGhkcildOworCQkJCisJCQkvKiBNYWtlIGNlcnRhaW4gd2UgaGF2ZSBhIHJlYXNvbmFibGUgcGFja2V0IGxlbmd0aCAqLworCQkJaWYgKG50b2hzKHVkcC0+bGVuKSA+IChudG9ocyhpcC0+bGVuKSAtIGlwbGVuKSkKKwkJCQljb250aW51ZTsKKworCQkJaWYgKHVkcC0+Y2hrc3VtICYmIHVkcGNoa3N1bShpcCwgdWRwKSkgeworCQkJCXByaW50ZigiVURQIGNoZWNrc3VtIGVycm9yXG4iKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJfQorCQlyZXN1bHQgPSByZXBseShpdmFsLCBwdHIsIHB0eXBlLCBpcCwgdWRwKTsKKwkJaWYgKHJlc3VsdCA+IDApIHsKKwkJCXJldHVybiByZXN1bHQ7CisJCX0KKwkJCisJCS8qIElmIGl0IGlzbid0IGEgcGFja2V0IHRoZSB1cHBlciBsYXllciB3YW50cyBzZWUgaWYgdGhlcmUgaXMgYSBkZWZhdWx0CisJCSAqIGFjdGlvbi4gIFRoaXMgYWxsb3dzIHVzIHJlcGx5IHRvIGFycCBhbmQgaWdtcCBxdWVyeWllcy4KKwkJICovCisJCWlmICgocHR5cGUgPT0gQVJQKSAmJgorCQkgICAgKG5pYy5wYWNrZXRsZW4gPj0gRVRIX0hMRU4gKyBzaXplb2Yoc3RydWN0IGFycHJlcXVlc3QpKSkgeworCQkJc3RydWN0CWFycHJlcXVlc3QgKmFycHJlcGx5OworCQkJdW5zaWduZWQgbG9uZyB0bXA7CisJCQkKKwkJCWFycHJlcGx5ID0gKHN0cnVjdCBhcnByZXF1ZXN0ICopJm5pYy5wYWNrZXRbRVRIX0hMRU5dOworCQkJbWVtY3B5KCZ0bXAsIGFycHJlcGx5LT50aXBhZGRyLCBzaXplb2YoaW5fYWRkcikpOworCQkJaWYgKChhcnByZXBseS0+b3Bjb2RlID09IGh0b25zKEFSUF9SRVFVRVNUKSkgJiYKKwkJCSAgICAodG1wID09IGFycHRhYmxlW0FSUF9DTElFTlRdLmlwYWRkci5zX2FkZHIpKSB7CisJCQkJYXJwcmVwbHktPm9wY29kZSA9IGh0b25zKEFSUF9SRVBMWSk7CisJCQkJbWVtY3B5KGFycHJlcGx5LT50aXBhZGRyLCBhcnByZXBseS0+c2lwYWRkciwgc2l6ZW9mKGluX2FkZHIpKTsKKwkJCQltZW1jcHkoYXJwcmVwbHktPnRod2FkZHIsIGFycHJlcGx5LT5zaHdhZGRyLCBFVEhfQUxFTik7CisJCQkJbWVtY3B5KGFycHJlcGx5LT5zaXBhZGRyLCAmYXJwdGFibGVbQVJQX0NMSUVOVF0uaXBhZGRyLCBzaXplb2YoaW5fYWRkcikpOworCQkJCW1lbWNweShhcnByZXBseS0+c2h3YWRkciwgYXJwdGFibGVbQVJQX0NMSUVOVF0ubm9kZSwgRVRIX0FMRU4pOworCQkJCWV0aF90cmFuc21pdChhcnByZXBseS0+dGh3YWRkciwgQVJQLAorCQkJCQkgICAgIHNpemVvZihzdHJ1Y3QgIGFycHJlcXVlc3QpLAorCQkJCQkgICAgIGFycHJlcGx5KTsKKyNpZmRlZglNREVCVUcKKwkJCQltZW1jcHkoJnRtcCwgYXJwcmVwbHktPnRpcGFkZHIsIHNpemVvZihpbl9hZGRyKSk7CisJCQkJcHJpbnRmKCJTZW50IEFSUCByZXBseSB0bzogJUBcbiIsdG1wKTsKKyNlbmRpZgkvKiBNREVCVUcgKi8KKwkJCX0KKwkJfQorCQlwcm9jZXNzX2lnbXAoaXAsIG5vdyk7CisJfQorCXJldHVybigwKTsKK30KKworI2lmZGVmCVJFUVVJUkVfVkNJX0VUSEVSQk9PVAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitGSU5EX1ZDSV9FVEhFUkJPT1QgLSBMb29rcyBmb3IgIkV0aGVyYm9vdCIgaW4gVmVuZG9yIEVuY2Fwc3VsYXRlZCBJZGVudGlmaWVycworT24gZW50cnkgcCBwb2ludHMgdG8gYnl0ZSBjb3VudCBvZiBWQ0kgb3B0aW9ucworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50IGZpbmRfdmNpX2V0aGVyYm9vdCh1bnNpZ25lZCBjaGFyICpwKQoreworCXVuc2lnbmVkIGNoYXIJKmVuZCA9IHAgKyAxICsgKnA7CisKKwlmb3IgKHArKzsgcCA8IGVuZDsgKSB7CisJCWlmICgqcCA9PSBSRkMyMTMyX1ZFTkRPUl9DTEFTU19JRCkgeworCQkJaWYgKHN0cm5jbXAoIkV0aGVyYm9vdCIsIHAgKyAyLCBzaXplb2YoIkV0aGVyYm9vdCIpIC0gMSkgPT0gMCkKKwkJCQlyZXR1cm4gKDEpOworCQl9IGVsc2UgaWYgKCpwID09IFJGQzE1MzNfRU5EKQorCQkJcmV0dXJuICgwKTsKKwkJcCArPSBUQUdfTEVOKHApICsgMjsKKwl9CisJcmV0dXJuICgwKTsKK30KKyNlbmRpZgkvKiBSRVFVSVJFX1ZDSV9FVEhFUkJPT1QgKi8KKworLyoqCisgKiBkZWNvZGVfcmZjMTUzMworICoKKyAqIERlY29kZXMgUkZDMTUzMyBoZWFkZXIKKyAqKi8KK2ludCBkZWNvZGVfcmZjMTUzMyh1bnNpZ25lZCBjaGFyICpwLCB1bnNpZ25lZCBpbnQgYmxvY2ssIHVuc2lnbmVkIGludCBsZW4sIGludCBlb2YpCit7CisJc3RhdGljIHVuc2lnbmVkIGNoYXIgKmV4dGRhdGEgPSBOVUxMLCAqZXh0ZW5kID0gTlVMTDsKKwl1bnNpZ25lZCBjaGFyICAgICAgICAqZXh0cGF0aCA9IE5VTEw7CisJdW5zaWduZWQgY2hhciAgICAgICAgKmVuZHA7CisKKwlpZiAoYmxvY2sgPT0gMCkgeworCQllbmRfb2ZfcmZjMTUzMyA9IE5VTEw7CisJCWlmIChtZW1jbXAocCwgcmZjMTUzM19jb29raWUsIHNpemVvZihyZmMxNTMzX2Nvb2tpZSkpKQorCQkJcmV0dXJuKDApOyAvKiBubyBSRkMgMTUzMyBoZWFkZXIgZm91bmQgKi8KKwkJcCArPSA0OworCQllbmRwID0gcCArIGxlbjsKKwl9IGVsc2UgeworCQlpZiAoYmxvY2sgPT0gMSkgeworCQkJaWYgKG1lbWNtcChwLCByZmMxNTMzX2Nvb2tpZSwgc2l6ZW9mKHJmYzE1MzNfY29va2llKSkpCisJCQkJcmV0dXJuKDApOyAvKiBubyBSRkMgMTUzMyBoZWFkZXIgZm91bmQgKi8KKwkJCXAgKz0gNDsKKwkJCWxlbiAtPSA0OyB9CisJCWlmIChleHRlbmQgKyBsZW4gPD0gKHVuc2lnbmVkIGNoYXIgKikKKwkJICAgIHJmYzE1MzNfdmVuZGRhdGEgKyBzaXplb2YocmZjMTUzM192ZW5kZGF0YSkpIHsKKwkJCW1lbWNweShleHRlbmQsIHAsIGxlbik7CisJCQlleHRlbmQgKz0gbGVuOworCQl9IGVsc2UgeworCQkJcHJpbnRmKCJPdmVyZmxvdyBpbiB2ZW5kb3IgZGF0YSBidWZmZXIhIEFib3J0aW5nLi4uXG4iKTsKKwkJCSpleHRkYXRhID0gUkZDMTUzM19FTkQ7CisJCQlyZXR1cm4oMCk7CisJCX0KKwkJcCA9IGV4dGRhdGE7IGVuZHAgPSBleHRlbmQ7CisJfQorCWlmICghZW9mKQorCQlyZXR1cm4gMTsKKwl3aGlsZSAocCA8IGVuZHApIHsKKwkJdW5zaWduZWQgY2hhciBjID0gKnA7CisJCWlmIChjID09IFJGQzE1MzNfUEFEKSB7CisJCQlwKys7CisJCQljb250aW51ZTsKKwkJfQorCQllbHNlIGlmIChjID09IFJGQzE1MzNfRU5EKSB7CisJCQllbmRfb2ZfcmZjMTUzMyA9IGVuZHAgPSBwOworCQkJY29udGludWU7CisJCX0KKwkJZWxzZSBpZiAoYyA9PSBSRkMxNTMzX05FVE1BU0spCisJCQltZW1jcHkoJm5ldG1hc2ssIHArMiwgc2l6ZW9mKGluX2FkZHIpKTsKKwkJZWxzZSBpZiAoYyA9PSBSRkMxNTMzX0dBVEVXQVkpIHsKKwkJCS8qIFRoaXMgaXMgYSBsaXR0bGUgc2ltcGxpc3RpYywgYnV0IGl0IHdpbGwKKwkJCSAgIHVzdWFsbHkgYmUgc3VmZmljaWVudC4KKwkJCSAgIFRha2Ugb25seSB0aGUgZmlyc3QgZW50cnkgKi8KKwkJCWlmIChUQUdfTEVOKHApID49IHNpemVvZihpbl9hZGRyKSkKKwkJCQltZW1jcHkoJmFycHRhYmxlW0FSUF9HQVRFV0FZXS5pcGFkZHIsIHArMiwgc2l6ZW9mKGluX2FkZHIpKTsKKwkJfQorCQllbHNlIGlmIChjID09IFJGQzE1MzNfRVhURU5TSU9OUEFUSCkKKwkJCWV4dHBhdGggPSBwOworCQllbHNlIGlmIChjID09IFJGQzIxMzJfTVNHX1RZUEUpCisJCQlkaGNwX3JlcGx5PSoocCsyKTsKKwkJZWxzZSBpZiAoYyA9PSBSRkMyMTMyX1NSVl9JRCkKKwkJCW1lbWNweSgmZGhjcF9zZXJ2ZXIsIHArMiwgc2l6ZW9mKGluX2FkZHIpKTsKKwkJZWxzZSBpZiAoYyA9PSBSRkMxNTMzX0hPU1ROQU1FKSB7CisJCQlob3N0bmFtZSA9IHAgKyAyOworCQkJaG9zdG5hbWVsZW4gPSAqKHAgKyAxKTsKKwkJfQorCQllbHNlIGlmIChjID09IFJGQzE1MzNfVkVORE9SX0NPTkZJR0ZJTEUpeworCQkJaW50IGwgPSBUQUdfTEVOIChwKTsKKwkgIAorCQkJLyogRWxpbWluYXRlIHRoZSB0cmFpbGluZyBOVUxzIGFjY29yZGluZyB0byBSRkMgMjEzMi4gICovCisJCQl3aGlsZSAoKihwICsgMiArIGwgLSAxKSA9PSAnXDAwMCcgJiYgbCA+IDApCisJCQkJbC0tOworCSAgCisJCQkvKiBYWFg6IFNob3VsZCBjaGVjayBpZiBMRU4gaXMgbGVzcyB0aGFuIHRoZSBtYXhpbXVtIGxlbmd0aAorCQkJICAgb2YgQ09ORklHX0ZJTEUuIFRoaXMga2luZCBvZiByb2J1c3RuZXNzIHdpbGwgYmUgYSBnb2FsCisJCQkgICBpbiBHUlVCIDEuMC4gICovCisJCQltZW1jcHkgKGNvbmZpZ19maWxlLCBwICsgMiwgbCk7CisJCQljb25maWdfZmlsZVtsXSA9IDA7CisJCX0KKwkJZWxzZSB7CisJCQk7CisJCX0KKwkJcCArPSBUQUdfTEVOKHApICsgMjsKKwl9CisJZXh0ZGF0YSA9IGV4dGVuZCA9IGVuZHA7CisJaWYgKGJsb2NrIDw9IDAgJiYgZXh0cGF0aCAhPSBOVUxMKSB7CisJCWNoYXIgZm5hbWVbNjRdOworCQlpZiAoVEFHX0xFTihleHRwYXRoKSA+PSBzaXplb2YoZm5hbWUpKXsKKwkJCXByaW50ZigiT3ZlcmZsb3cgaW4gdmVuZG9yIGRhdGEgYnVmZmVyISBBYm9ydGluZy4uLlxuIik7CisJCQkqZXh0ZGF0YSA9IFJGQzE1MzNfRU5EOworCQkJcmV0dXJuKDApOworCQl9CisJCW1lbWNweShmbmFtZSwgZXh0cGF0aCsyLCBUQUdfTEVOKGV4dHBhdGgpKTsKKwkJZm5hbWVbKGludClUQUdfTEVOKGV4dHBhdGgpXSA9ICdcMCc7CisJCXByaW50ZigiTG9hZGluZyBCT09UUC1leHRlbnNpb24gZmlsZTogJXNcbiIsZm5hbWUpOworCQl0ZnRwX2ZpbGVfcmVhZChmbmFtZSwgZGVjb2RlX3JmYzE1MzMpOworCX0KKwlyZXR1cm4gMTsJLyogcHJvY2VlZCB3aXRoIG5leHQgYmxvY2sgKi8KK30KKworCisvKiBGSVhNRSBkb3VibGUgY2hlY2sgVFdPX1NFQ09ORF9ESVZJU09SICovCisjZGVmaW5lIFRXT19TRUNPTkRfRElWSVNPUiAoUkFORF9NQVgvVElDS1NfUEVSX1NFQykKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkZDMjEzMV9TTEVFUF9JTlRFUlZBTCAtIHNsZWVwIGZvciBleHBvdGVudGlhbGx5IGxvbmdlciB0aW1lcyAoYmFzZSA8PCBleHApICstIDEgc2VjKQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitsb25nIHJmYzIxMzFfc2xlZXBfaW50ZXJ2YWwobG9uZyBiYXNlLCBpbnQgZXhwKQoreworCXVuc2lnbmVkIGxvbmcgdG1vOworI2lmZGVmIEJBQ0tPRkZfTElNSVQKKwlpZiAoZXhwID4gQkFDS09GRl9MSU1JVCkKKwkJZXhwID0gQkFDS09GRl9MSU1JVDsKKyNlbmRpZgorCXRtbyA9IChiYXNlIDw8IGV4cCkgKyAoVElDS1NfUEVSX1NFQyAtIChyYW5kb20oKS9UV09fU0VDT05EX0RJVklTT1IpKTsKKwlyZXR1cm4gdG1vOworfQorCisjaWZkZWYgTVVMVElDQVNUX0xFVkVMMgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRkMxMTEyX1NMRUVQX0lOVEVSVkFMIC0gc2xlZXAgZm9yIGV4cG90ZW50aWFsbHkgbG9uZ2VyIHRpbWVzLCB1cCB0byAoYmFzZSA8PCBleHApCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2xvbmcgcmZjMTExMl9zbGVlcF9pbnRlcnZhbChsb25nIGJhc2UsIGludCBleHApCit7CisJdW5zaWduZWQgbG9uZyBkaXZpc29yLCB0bW87CisjaWZkZWYgQkFDS09GRl9MSU1JVAorCWlmIChleHAgPiBCQUNLT0ZGX0xJTUlUKQorCQlleHAgPSBCQUNLT0ZGX0xJTUlUOworI2VuZGlmCisJZGl2aXNvciA9IFJBTkRfTUFYLyhiYXNlIDw8IGV4cCk7CisJdG1vID0gcmFuZG9tKCkvZGl2aXNvcjsKKwlyZXR1cm4gdG1vOworfQorI2VuZGlmIC8qIE1VTFRJQ0FTVF9MRVZFTF8yICovCisvKiBpZmNvbmZpZyAtIGNvbmZpZ3VyZSBuZXR3b3JrIGludGVyZmFjZS4gICovCitpbnQKK2lmY29uZmlnIChjaGFyICppcCwgY2hhciAqc20sIGNoYXIgKmd3LCBjaGFyICpzdnIpCit7CisgIGluX2FkZHIgdG1wOworICAKKyAgaWYgKHNtKSAKKyAgICB7CisgICAgICBpZiAoISBpbmV0X2F0b24gKHNtLCAmdG1wKSkKKwlyZXR1cm4gMDsKKyAgICAgIAorICAgICAgbmV0bWFzayA9IHRtcC5zX2FkZHI7CisgICAgfQorICAKKyAgaWYgKGlwKSAKKyAgICB7CisgICAgICBpZiAoISBpbmV0X2F0b24gKGlwLCAmYXJwdGFibGVbQVJQX0NMSUVOVF0uaXBhZGRyKSkgCisJcmV0dXJuIDA7CisgICAgICAKKyAgICAgIGlmICghIG5ldG1hc2sgJiYgISBzbSkgCisJbmV0bWFzayA9IGRlZmF1bHRfbmV0bWFzayAoKTsKKyAgICB9CisgIAorICBpZiAoZ3cgJiYgISBpbmV0X2F0b24gKGd3LCAmYXJwdGFibGVbQVJQX0dBVEVXQVldLmlwYWRkcikpIAorICAgIHJldHVybiAwOworCisgIC8qIENsZWFyIG91dCB0aGUgQVJQIGVudHJ5LiAgKi8KKyAgZ3J1Yl9tZW1zZXQgKGFycHRhYmxlW0FSUF9HQVRFV0FZXS5ub2RlLCAwLCBFVEhfQUxFTik7CisgIAorICBpZiAoc3ZyICYmICEgaW5ldF9hdG9uIChzdnIsICZhcnB0YWJsZVtBUlBfU0VSVkVSXS5pcGFkZHIpKSAKKyAgICByZXR1cm4gMDsKKworICAvKiBMaWtld2lzZS4gICovCisgIGdydWJfbWVtc2V0IChhcnB0YWJsZVtBUlBfU0VSVkVSXS5ub2RlLCAwLCBFVEhfQUxFTik7CisgIAorICBpZiAoaXAgfHwgc20pCisgICAgeworICAgICAgaWYgKElQX0JST0FEQ0FTVCA9PSAobmV0bWFzayB8IGFycHRhYmxlW0FSUF9DTElFTlRdLmlwYWRkci5zX2FkZHIpCisJICB8fCBuZXRtYXNrID09IChuZXRtYXNrIHwgYXJwdGFibGVbQVJQX0NMSUVOVF0uaXBhZGRyLnNfYWRkcikKKwkgIHx8ICEgbmV0bWFzaykKKwluZXR3b3JrX3JlYWR5ID0gMDsKKyAgICAgIGVsc2UKKwluZXR3b3JrX3JlYWR5ID0gMTsKKyAgICB9CisgIAorICByZXR1cm4gMTsKK30KKworLyoKKyAqIHByaW50X25ldHdvcmtfY29uZmlndXJhdGlvbgorICoKKyAqIE91dHB1dCB0aGUgbmV0d29yayBjb25maWd1cmF0aW9uLiBJdCBtYXkgYnJva2UgdGhlIGdyYXBoaWMgY29uc29sZSBub3cuOi0oCisgKi8KK3ZvaWQgcHJpbnRfbmV0d29ya19jb25maWd1cmF0aW9uICh2b2lkKQoreworCUVudGVyRnVuY3Rpb24oInByaW50X25ldHdvcmtfY29uZmlndXJhdGlvbiIpOworCWlmICghIGdydWJfZXRoX3Byb2JlICgpKQorCQlncnViX3ByaW50ZiAoIk5vIGV0aGVybmV0IGNhcmQgZm91bmQuXG4iKTsKKwllbHNlIGlmICghIG5ldHdvcmtfcmVhZHkpCisJCWdydWJfcHJpbnRmICgiTm90IGluaXRpYWxpemVkIHlldC5cbiIpOworCWVsc2UgeworCQlldGhlcmJvb3RfcHJpbnRmICgiQWRkcmVzczogJUBcbiIsIGFycHRhYmxlW0FSUF9DTElFTlRdLmlwYWRkci5zX2FkZHIpOworCQlldGhlcmJvb3RfcHJpbnRmICgiTmV0bWFzazogJUBcbiIsIG5ldG1hc2spOworCQlldGhlcmJvb3RfcHJpbnRmICgiU2VydmVyOiAlQFxuIiwgYXJwdGFibGVbQVJQX1NFUlZFUl0uaXBhZGRyLnNfYWRkcik7CisJCWV0aGVyYm9vdF9wcmludGYgKCJHYXRld2F5OiAlQFxuIiwgYXJwdGFibGVbQVJQX0dBVEVXQVldLmlwYWRkci5zX2FkZHIpOworCX0KKwlMZWF2ZUZ1bmN0aW9uKCJwcmludF9uZXR3b3JrX2NvbmZpZ3VyYXRpb24iKTsKK30KKworLyoqCisgKiBjbGVhbnVwX25ldAorICoKKyAqIE1hcmsgbmV0d29yayB1bnVzYWJsZSwgYW5kIGRpc2FibGUgTklDcworICovCit2b2lkIGNsZWFudXBfbmV0ICh2b2lkKQoreworCWlmIChuZXR3b3JrX3JlYWR5KXsKKwkJLyogU3RvcCByZWNlaXZpbmcgcGFja2V0cy4gICovCisJCWV0aF9kaXNhYmxlICgpOworCQluZXR3b3JrX3JlYWR5ID0gMDsKKwl9Cit9CmRpZmYgLU5hdXIgZ3J1Yi0wLjk3Lm9yaWcvbmV0Ym9vdC9uaWMuaCBncnViLTAuOTcvbmV0Ym9vdC9uaWMuaAotLS0gZ3J1Yi0wLjk3Lm9yaWcvbmV0Ym9vdC9uaWMuaAkyMDAzLTA3LTA5IDExOjQ1OjM4LjAwMDAwMDAwMCArMDAwMAorKysgZ3J1Yi0wLjk3L25ldGJvb3QvbmljLmgJMjAwNS0wOC0zMSAxOTowMzozNS4wMDAwMDAwMDAgKzAwMDAKQEAgLTgsMjQgKzgsMzggQEAKICNpZm5kZWYJTklDX0gKICNkZWZpbmUgTklDX0gKIAorI2luY2x1ZGUgImRldi5oIgorCit0eXBlZGVmIGVudW0geworCURJU0FCTEUgPSAwLAorCUVOQUJMRSwKKwlGT1JDRQorfSBpcnFfYWN0aW9uX3Q7CisKIC8qCiAgKglTdHJ1Y3R1cmUgcmV0dXJuZWQgZnJvbSBldGhfcHJvYmUgYW5kIHBhc3NlZCB0byBvdGhlciBkcml2ZXIKICAqCWZ1bmN0aW9ucy4KICAqLwotCiBzdHJ1Y3QgbmljCiB7Ci0Jdm9pZAkJKCpyZXNldClQKChzdHJ1Y3QgbmljICopKTsKLQlpbnQJCSgqcG9sbClQKChzdHJ1Y3QgbmljICopKTsKKwlzdHJ1Y3QgZGV2CWRldjsgIC8qIFRoaXMgbXVzdCBjb21lIGZpcnN0ICovCisJaW50CQkoKnBvbGwpUCgoc3RydWN0IG5pYyAqLCBpbnQgcmV0cmlldmUpKTsKIAl2b2lkCQkoKnRyYW5zbWl0KVAoKHN0cnVjdCBuaWMgKiwgY29uc3QgY2hhciAqZCwKIAkJCQl1bnNpZ25lZCBpbnQgdCwgdW5zaWduZWQgaW50IHMsIGNvbnN0IGNoYXIgKnApKTsKLQl2b2lkCQkoKmRpc2FibGUpUCgoc3RydWN0IG5pYyAqKSk7CisJdm9pZAkJKCppcnEpUCgoc3RydWN0IG5pYyAqLCBpcnFfYWN0aW9uX3QpKTsKIAlpbnQJCWZsYWdzOwkvKiBkcml2ZXIgc3BlY2lmaWMgZmxhZ3MgKi8KIAlzdHJ1Y3Qgcm9tX2luZm8JKnJvbV9pbmZvOwkvKiAtPiByb21faW5mbyBmcm9tIG1haW4gKi8KIAl1bnNpZ25lZCBjaGFyCSpub2RlX2FkZHI7Ci0JY2hhcgkJKnBhY2tldDsKKwl1bnNpZ25lZCBjaGFyCSpwYWNrZXQ7CiAJdW5zaWduZWQgaW50CXBhY2tldGxlbjsKKwl1bnNpZ25lZCBpbnQJaW9hZGRyOworCXVuc2lnbmVkIGNoYXIJaXJxbm87CiAJdm9pZAkJKnByaXZfZGF0YTsJLyogZHJpdmVyIGNhbiBoYW5nIHByaXZhdGUgZGF0YSBoZXJlICovCiB9OwogCitleHRlcm4gaW50ICBldGhfcHJvYmUoc3RydWN0IGRldiAqZGV2KTsKK2V4dGVybiBpbnQgIGV0aF9wb2xsKGludCByZXRyaWV2ZSk7CitleHRlcm4gdm9pZCBldGhfdHJhbnNtaXQoY29uc3QgY2hhciAqZCwgdW5zaWduZWQgaW50IHQsIHVuc2lnbmVkIGludCBzLCBjb25zdCB2b2lkICpwKTsKK2V4dGVybiB2b2lkIGV0aF9kaXNhYmxlKHZvaWQpOworZXh0ZXJuIHZvaWQgZXRoX2lycShpcnFfYWN0aW9uX3QgYWN0aW9uKTsKICNlbmRpZgkvKiBOSUNfSCAqLwpkaWZmIC1OYXVyIGdydWItMC45Ny5vcmlnL25ldGJvb3QvbnM4MzgyMC5jIGdydWItMC45Ny9uZXRib290L25zODM4MjAuYwotLS0gZ3J1Yi0wLjk3Lm9yaWcvbmV0Ym9vdC9uczgzODIwLmMJMTk3MC0wMS0wMSAwMDowMDowMC4wMDAwMDAwMDAgKzAwMDAKKysrIGdydWItMC45Ny9uZXRib290L25zODM4MjAuYwkyMDA1LTA4LTMxIDE5OjAzOjM1LjAwMDAwMDAwMCArMDAwMApAQCAtMCwwICsxLDEwMjAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiAgICBuczgzODIwLmM6IEV0aGVyYm9vdCBkZXZpY2UgZHJpdmVyIGZvciB0aGUgTmF0aW9uYWwgU2VtaWNvbmR1Y3RvciA4MzgyMAorKiAgICBXcml0dGVuIDIwMDQgYnkgVGltb3RoeSBMZWdnZSA8dGxlZ2dlQHJvZ2Vycy5jb20+CisqCisqICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisqICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisqICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisqICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisqCisqICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorKiAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorKiAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisqICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisqCisqICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisqICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisqICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorKgorKiAgICBQb3J0aW9ucyBvZiB0aGlzIGNvZGUgYmFzZWQgb246CisqCW5zODM4MjAuYyBieSBCZW5qYW1pbiBMYUhhaXNlIHdpdGggY29udHJpYnV0aW9ucworKiAJCWZvciBMaW51eCBrZXJuZWwgMi40LnguCisqCQorKiAgICBMaW51eCBEcml2ZXIgVmVyc2lvbiAwLjIwLCAyMDAyMDYxMAorKiAKKyogICAgVGhpcyBkZXZlbG9wbWVudCBvZiB0aGlzIEV0aGVyYm9vdCBkcml2ZXIgd2FzIGZ1bmRlZCBieToKKyoKKyogICAgTlhUVjogaHR0cDovL3d3dy5ueHR2LmNvbS8KKyogICAgCQorKiAgICBSRVZJU0lPTiBISVNUT1JZOgorKiAgICA9PT09PT09PT09PT09PT09CisqCisqICAgIHYxLjAJMDItMTYtMjAwNAl0aW1sZWdnZQlJbml0aWFsIHBvcnQgb2YgTGludXggZHJpdmVyCisqICAgIHYxLjEJMDItMTktMjAwNAl0aW1sZWdnZQlNb3JlIHJvaGJ1c3QgdHJhbnNtaXQgYW5kIHBvbGwKKyogICAgCisqICAgIEluZGVudCBPcHRpb25zOiBpbmRlbnQgLWtyIC1pOAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiB0byBnZXQgc29tZSBnbG9iYWwgcm91dGluZXMgbGlrZSBwcmludGYgKi8KKyNpbmNsdWRlICJldGhlcmJvb3QuaCIKKy8qIHRvIGdldCB0aGUgaW50ZXJmYWNlIHRvIHRoZSBib2R5IG9mIHRoZSBwcm9ncmFtICovCisjaW5jbHVkZSAibmljLmgiCisvKiB0byBnZXQgdGhlIFBDSSBzdXBwb3J0IGZ1bmN0aW9ucywgaWYgdGhpcyBpcyBhIFBDSSBOSUMgKi8KKyNpbmNsdWRlICJwY2kuaCIKKworI2lmIEFSQ0ggPT0gaWE2NAkJLyogU3VwcG9ydCA2NC1iaXQgYWRkcmVzc2luZyAqLworI2RlZmluZSBVU0VfNjRCSVRfQUREUgorI2VuZGlmCisKKy8vI2RlZmluZSBEREVCVUcKKyNpZmRlZiBEREVCVUcKKyNkZWZpbmUgZHByaW50Zih4KSBwcmludGYgeAorI2Vsc2UKKyNkZWZpbmUgZHByaW50Zih4KQorI2VuZGlmCisKK3R5cGVkZWYgdW5zaWduZWQgY2hhciB1ODsKK3R5cGVkZWYgc2lnbmVkIGNoYXIgczg7Cit0eXBlZGVmIHVuc2lnbmVkIHNob3J0IHUxNjsKK3R5cGVkZWYgc2lnbmVkIHNob3J0IHMxNjsKK3R5cGVkZWYgdW5zaWduZWQgaW50IHUzMjsKK3R5cGVkZWYgc2lnbmVkIGludCBzMzI7CisKKyNkZWZpbmUgSFogMTAwCisKKy8qIENvbmRlbnNlZCBvcGVyYXRpb25zIGZvciByZWFkYWJpbGl0eS4gKi8KKyNkZWZpbmUgdmlydF90b19sZTMyZGVzYyhhZGRyKSAgY3B1X3RvX2xlMzIodmlydF90b19idXMoYWRkcikpCisjZGVmaW5lIGxlMzJkZXNjX3RvX3ZpcnQoYWRkcikgIGJ1c190b192aXJ0KGxlMzJfdG9fY3B1KGFkZHIpKQorCisvKiBOSUMgc3BlY2lmaWMgc3RhdGljIHZhcmlhYmxlcyBnbyBoZXJlICovCisKKy8qIEdsb2JhbCBwYXJhbWV0ZXJzLiAgU2VlIE1PRFVMRV9QQVJNIG5lYXIgdGhlIGJvdHRvbS4gKi8KKy8vIHN0YXRpYyBpbnQgaWhyID0gMjsKK3N0YXRpYyBpbnQgcmVzZXRfcGh5ID0gMDsKK3N0YXRpYyBpbnQgbG5rc3RzID0gMDsJCS8qIENGR19MTktTVFMgYml0IHBvbGFyaXR5ICovCisKKyNpZiBkZWZpbmVkKENPTkZJR19ISUdITUVNNjRHKSB8fCBkZWZpbmVkKF9faWE2NF9fKQorI2RlZmluZSBVU0VfNjRCSVRfQUREUgkiKyIKKyNlbmRpZgorCisjaWYgZGVmaW5lZChVU0VfNjRCSVRfQUREUikKKyNkZWZpbmUgVFJZX0RBQwkxCisjZWxzZQorI2RlZmluZSBUUllfREFDCTAKKyNlbmRpZgorCisvKiB0dW5hYmxlcyAqLworI2RlZmluZSBSWF9CVUZfU0laRQkxNTAwCS8qIDgxOTIgKi8KKworLyogTXVzdCBub3QgZXhjZWVkIH42NTAwMC4gKi8KKyNkZWZpbmUgTlJfUlhfREVTQwk2NAorI2RlZmluZSBOUl9UWF9ERVNDCTEKKworCQkgICAvKiBub3QgdHVuYWJsZSAqLy8qIEV4dHJhIDYgYnl0ZXMgZm9yIDY0IGJpdCBhbGlnbm1lbnQgKGRpdmlzYWJsZSBieSA4KSAqLworI2RlZmluZSBSRUFMX1JYX0JVRl9TSVpFIChSWF9CVUZfU0laRSArIDE0ICsgNikJLyogcngvdHggbWFjIGFkZHIgKyB0eXBlICovCisKKyNkZWZpbmUgTUlOX1RYX0RFU0NfRlJFRQk4CisKKy8qIHJlZ2lzdGVyIGRlZmluZXMgKi8KKyNkZWZpbmUgQ0ZHQ1MJCTB4MDQKKworI2RlZmluZSBDUl9UWEUJCTB4MDAwMDAwMDEKKyNkZWZpbmUgQ1JfVFhECQkweDAwMDAwMDAyCisvKiBSYW1pdCA6IEhlcmUncyBhIHRpcCwgZG9uJ3QgZG8gYSBSWEQgaW1tZWRpYXRlbHkgZm9sbG93ZWQgYnkgYW4gUlhFCisgKiBUaGUgUmVjZWl2ZSBlbmdpbmUgc2tpcHMgb25lIGRlc2NyaXB0b3IgYW5kIG1vdmVzCisgKiBvbnRvIHRoZSBuZXh0IG9uZSEhICovCisjZGVmaW5lIENSX1JYRQkJMHgwMDAwMDAwNAorI2RlZmluZSBDUl9SWEQJCTB4MDAwMDAwMDgKKyNkZWZpbmUgQ1JfVFhSCQkweDAwMDAwMDEwCisjZGVmaW5lIENSX1JYUgkJMHgwMDAwMDAyMAorI2RlZmluZSBDUl9TV0kJCTB4MDAwMDAwODAKKyNkZWZpbmUgQ1JfUlNUCQkweDAwMDAwMTAwCisKKyNkZWZpbmUgUFRTQ1JfRUVCSVNUX0ZBSUwgICAgICAgMHgwMDAwMDAwMQorI2RlZmluZSBQVFNDUl9FRUJJU1RfRU4gICAgICAgICAweDAwMDAwMDAyCisjZGVmaW5lIFBUU0NSX0VFTE9BRF9FTiAgICAgICAgIDB4MDAwMDAwMDQKKyNkZWZpbmUgUFRTQ1JfUkJJU1RfRkFJTCAgICAgICAgMHgwMDAwMDFiOAorI2RlZmluZSBQVFNDUl9SQklTVF9ET05FICAgICAgICAweDAwMDAwMjAwCisjZGVmaW5lIFBUU0NSX1JCSVNUX0VOICAgICAgICAgIDB4MDAwMDA0MDAKKyNkZWZpbmUgUFRTQ1JfUkJJU1RfUlNUICAgICAgICAgMHgwMDAwMjAwMAorCisjZGVmaW5lIE1FQVJfRUVESQkJMHgwMDAwMDAwMQorI2RlZmluZSBNRUFSX0VFRE8JCTB4MDAwMDAwMDIKKyNkZWZpbmUgTUVBUl9FRUNMSwkJMHgwMDAwMDAwNAorI2RlZmluZSBNRUFSX0VFU0VMCQkweDAwMDAwMDA4CisjZGVmaW5lIE1FQVJfTURJTwkJMHgwMDAwMDAxMAorI2RlZmluZSBNRUFSX01ERElSCQkweDAwMDAwMDIwCisjZGVmaW5lIE1FQVJfTURDCQkweDAwMDAwMDQwCisKKyNkZWZpbmUgSVNSX1RYREVTQzMJMHg0MDAwMDAwMAorI2RlZmluZSBJU1JfVFhERVNDMgkweDIwMDAwMDAwCisjZGVmaW5lIElTUl9UWERFU0MxCTB4MTAwMDAwMDAKKyNkZWZpbmUgSVNSX1RYREVTQzAJMHgwODAwMDAwMAorI2RlZmluZSBJU1JfUlhERVNDMwkweDA0MDAwMDAwCisjZGVmaW5lIElTUl9SWERFU0MyCTB4MDIwMDAwMDAKKyNkZWZpbmUgSVNSX1JYREVTQzEJMHgwMTAwMDAwMAorI2RlZmluZSBJU1JfUlhERVNDMAkweDAwODAwMDAwCisjZGVmaW5lIElTUl9UWFJDTVAJMHgwMDQwMDAwMAorI2RlZmluZSBJU1JfUlhSQ01QCTB4MDAyMDAwMDAKKyNkZWZpbmUgSVNSX0RQRVJSCTB4MDAxMDAwMDAKKyNkZWZpbmUgSVNSX1NTRVJSCTB4MDAwODAwMDAKKyNkZWZpbmUgSVNSX1JNQUJUCTB4MDAwNDAwMDAKKyNkZWZpbmUgSVNSX1JUQUJUCTB4MDAwMjAwMDAKKyNkZWZpbmUgSVNSX1JYU09WUgkweDAwMDEwMDAwCisjZGVmaW5lIElTUl9ISUJJTlQJMHgwMDAwODAwMAorI2RlZmluZSBJU1JfUEhZCQkweDAwMDA0MDAwCisjZGVmaW5lIElTUl9QTUUJCTB4MDAwMDIwMDAKKyNkZWZpbmUgSVNSX1NXSQkJMHgwMDAwMTAwMAorI2RlZmluZSBJU1JfTUlCCQkweDAwMDAwODAwCisjZGVmaW5lIElTUl9UWFVSTgkweDAwMDAwNDAwCisjZGVmaW5lIElTUl9UWElETEUJMHgwMDAwMDIwMAorI2RlZmluZSBJU1JfVFhFUlIJMHgwMDAwMDEwMAorI2RlZmluZSBJU1JfVFhERVNDCTB4MDAwMDAwODAKKyNkZWZpbmUgSVNSX1RYT0sJMHgwMDAwMDA0MAorI2RlZmluZSBJU1JfUlhPUk4JMHgwMDAwMDAyMAorI2RlZmluZSBJU1JfUlhJRExFCTB4MDAwMDAwMTAKKyNkZWZpbmUgSVNSX1JYRUFSTFkJMHgwMDAwMDAwOAorI2RlZmluZSBJU1JfUlhFUlIJMHgwMDAwMDAwNAorI2RlZmluZSBJU1JfUlhERVNDCTB4MDAwMDAwMDIKKyNkZWZpbmUgSVNSX1JYT0sJMHgwMDAwMDAwMQorCisjZGVmaW5lIFRYQ0ZHX0NTSQkweDgwMDAwMDAwCisjZGVmaW5lIFRYQ0ZHX0hCSQkweDQwMDAwMDAwCisjZGVmaW5lIFRYQ0ZHX01MQgkweDIwMDAwMDAwCisjZGVmaW5lIFRYQ0ZHX0FUUAkweDEwMDAwMDAwCisjZGVmaW5lIFRYQ0ZHX0VDUkVUUlkJMHgwMDgwMDAwMAorI2RlZmluZSBUWENGR19CUlNUX0RJUwkweDAwMDgwMDAwCisjZGVmaW5lIFRYQ0ZHX01YRE1BMTAyNAkweDAwMDAwMDAwCisjZGVmaW5lIFRYQ0ZHX01YRE1BNTEyCTB4MDA3MDAwMDAKKyNkZWZpbmUgVFhDRkdfTVhETUEyNTYJMHgwMDYwMDAwMAorI2RlZmluZSBUWENGR19NWERNQTEyOAkweDAwNTAwMDAwCisjZGVmaW5lIFRYQ0ZHX01YRE1BNjQJMHgwMDQwMDAwMAorI2RlZmluZSBUWENGR19NWERNQTMyCTB4MDAzMDAwMDAKKyNkZWZpbmUgVFhDRkdfTVhETUExNgkweDAwMjAwMDAwCisjZGVmaW5lIFRYQ0ZHX01YRE1BOAkweDAwMTAwMDAwCisKKyNkZWZpbmUgQ0ZHX0xOS1NUUwkweDgwMDAwMDAwCisjZGVmaW5lIENGR19TUERTVFMJMHg2MDAwMDAwMAorI2RlZmluZSBDRkdfU1BEU1RTMQkweDQwMDAwMDAwCisjZGVmaW5lIENGR19TUERTVFMwCTB4MjAwMDAwMDAKKyNkZWZpbmUgQ0ZHX0RVUFNUUwkweDEwMDAwMDAwCisjZGVmaW5lIENGR19UQklfRU4JMHgwMTAwMDAwMAorI2RlZmluZSBDRkdfTU9ERV8xMDAwCTB4MDA0MDAwMDAKKy8qIFJhbWl0IDogRG9udCcgZXZlciB1c2UgQVVUT18xMDAwLCBpdCBuZXZlciB3b3JrcyBhbmQgaXMgYnVnZ3kuCisgKiBSZWFkIHRoZSBQaHkgcmVzcG9uc2UgYW5kIHRoZW4gY29uZmlndXJlIHRoZSBNQUMgYWNjb3JkaW5nbHkgKi8KKyNkZWZpbmUgQ0ZHX0FVVE9fMTAwMAkweDAwMjAwMDAwCisjZGVmaW5lIENGR19QSU5UX0NUTAkweDAwMWMwMDAwCisjZGVmaW5lIENGR19QSU5UX0RVUFNUUwkweDAwMTAwMDAwCisjZGVmaW5lIENGR19QSU5UX0xOS1NUUwkweDAwMDgwMDAwCisjZGVmaW5lIENGR19QSU5UX1NQRFNUUwkweDAwMDQwMDAwCisjZGVmaW5lIENGR19UTVJURVNUCTB4MDAwMjAwMDAKKyNkZWZpbmUgQ0ZHX01STV9ESVMJMHgwMDAxMDAwMAorI2RlZmluZSBDRkdfTVdJX0RJUwkweDAwMDA4MDAwCisjZGVmaW5lIENGR19UNjRBRERSCTB4MDAwMDQwMDAKKyNkZWZpbmUgQ0ZHX1BDSTY0X0RFVAkweDAwMDAyMDAwCisjZGVmaW5lIENGR19EQVRBNjRfRU4JMHgwMDAwMTAwMAorI2RlZmluZSBDRkdfTTY0QUREUgkweDAwMDAwODAwCisjZGVmaW5lIENGR19QSFlfUlNUCTB4MDAwMDA0MDAKKyNkZWZpbmUgQ0ZHX1BIWV9ESVMJMHgwMDAwMDIwMAorI2RlZmluZSBDRkdfRVhUU1RTX0VOCTB4MDAwMDAxMDAKKyNkZWZpbmUgQ0ZHX1JFUUFMRwkweDAwMDAwMDgwCisjZGVmaW5lIENGR19TQgkJMHgwMDAwMDA0MAorI2RlZmluZSBDRkdfUE9XCQkweDAwMDAwMDIwCisjZGVmaW5lIENGR19FWEQJCTB4MDAwMDAwMTAKKyNkZWZpbmUgQ0ZHX1BFU0VMCTB4MDAwMDAwMDgKKyNkZWZpbmUgQ0ZHX0JST01fRElTCTB4MDAwMDAwMDQKKyNkZWZpbmUgQ0ZHX0VYVF8xMjUJMHgwMDAwMDAwMgorI2RlZmluZSBDRkdfQkVNCQkweDAwMDAwMDAxCisKKyNkZWZpbmUgRVhUU1RTX1VEUFBLVAkweDAwMjAwMDAwCisjZGVmaW5lIEVYVFNUU19UQ1BQS1QJMHgwMDA4MDAwMAorI2RlZmluZSBFWFRTVFNfSVBQS1QJMHgwMDAyMDAwMAorCisjZGVmaW5lIFNQRFNUU19QT0xBUklUWQkoQ0ZHX1NQRFNUUzEgfCBDRkdfU1BEU1RTMCB8IENGR19EVVBTVFMgfCAobG5rc3RzID8gQ0ZHX0xOS1NUUyA6IDApKQorCisjZGVmaW5lIE1JQkNfTUlCUwkweDAwMDAwMDA4CisjZGVmaW5lIE1JQkNfQUNMUgkweDAwMDAwMDA0CisjZGVmaW5lIE1JQkNfRlJaCTB4MDAwMDAwMDIKKyNkZWZpbmUgTUlCQ19XUk4JMHgwMDAwMDAwMQorCisjZGVmaW5lIFBDUl9QU0VOCSgxIDw8IDMxKQorI2RlZmluZSBQQ1JfUFNfTUNBU1QJKDEgPDwgMzApCisjZGVmaW5lIFBDUl9QU19EQQkoMSA8PCAyOSkKKyNkZWZpbmUgUENSX1NUSElfOAkoMyA8PCAyMykKKyNkZWZpbmUgUENSX1NUTE9fNAkoMSA8PCAyMykKKyNkZWZpbmUgUENSX0ZGSElfOEsJKDMgPDwgMjEpCisjZGVmaW5lIFBDUl9GRkxPXzRLCSgxIDw8IDIxKQorI2RlZmluZSBQQ1JfUEFVU0VfQ05UCTB4RkZGRQorCisjZGVmaW5lIFJYQ0ZHX0FFUAkweDgwMDAwMDAwCisjZGVmaW5lIFJYQ0ZHX0FSUAkweDQwMDAwMDAwCisjZGVmaW5lIFJYQ0ZHX1NUUklQQ1JDCTB4MjAwMDAwMDAKKyNkZWZpbmUgUlhDRkdfUlhfRkQJMHgxMDAwMDAwMAorI2RlZmluZSBSWENGR19BTFAJMHgwODAwMDAwMAorI2RlZmluZSBSWENGR19BSVJMCTB4MDQwMDAwMDAKKyNkZWZpbmUgUlhDRkdfTVhETUE1MTIJMHgwMDcwMDAwMAorI2RlZmluZSBSWENGR19EUlRICTB4MDAwMDAwM2UKKyNkZWZpbmUgUlhDRkdfRFJUSDAJMHgwMDAwMDAwMgorCisjZGVmaW5lIFJGQ1JfUkZFTgkweDgwMDAwMDAwCisjZGVmaW5lIFJGQ1JfQUFCCTB4NDAwMDAwMDAKKyNkZWZpbmUgUkZDUl9BQU0JMHgyMDAwMDAwMAorI2RlZmluZSBSRkNSX0FBVQkweDEwMDAwMDAwCisjZGVmaW5lIFJGQ1JfQVBNCTB4MDgwMDAwMDAKKyNkZWZpbmUgUkZDUl9BUEFUCTB4MDc4MDAwMDAKKyNkZWZpbmUgUkZDUl9BUEFUMwkweDA0MDAwMDAwCisjZGVmaW5lIFJGQ1JfQVBBVDIJMHgwMjAwMDAwMAorI2RlZmluZSBSRkNSX0FQQVQxCTB4MDEwMDAwMDAKKyNkZWZpbmUgUkZDUl9BUEFUMAkweDAwODAwMDAwCisjZGVmaW5lIFJGQ1JfQUFSUAkweDAwNDAwMDAwCisjZGVmaW5lIFJGQ1JfTUhFTgkweDAwMjAwMDAwCisjZGVmaW5lIFJGQ1JfVUhFTgkweDAwMTAwMDAwCisjZGVmaW5lIFJGQ1JfVUxNCTB4MDAwODAwMDAKKworI2RlZmluZSBWUkNSX1JVRFBFCTB4MDAwMDAwODAKKyNkZWZpbmUgVlJDUl9SVENQRQkweDAwMDAwMDQwCisjZGVmaW5lIFZSQ1JfUklQRQkweDAwMDAwMDIwCisjZGVmaW5lIFZSQ1JfSVBFTgkweDAwMDAwMDEwCisjZGVmaW5lIFZSQ1JfRFVURgkweDAwMDAwMDA4CisjZGVmaW5lIFZSQ1JfRFZURgkweDAwMDAwMDA0CisjZGVmaW5lIFZSQ1JfVlRSRU4JMHgwMDAwMDAwMgorI2RlZmluZSBWUkNSX1ZUREVOCTB4MDAwMDAwMDEKKworI2RlZmluZSBWVENSX1BQQ0hLCTB4MDAwMDAwMDgKKyNkZWZpbmUgVlRDUl9HQ0hLCTB4MDAwMDAwMDQKKyNkZWZpbmUgVlRDUl9WUFBUSQkweDAwMDAwMDAyCisjZGVmaW5lIFZUQ1JfVkdUSQkweDAwMDAwMDAxCisKKyNkZWZpbmUgQ1IJCTB4MDAKKyNkZWZpbmUgQ0ZHCQkweDA0CisjZGVmaW5lIE1FQVIJCTB4MDgKKyNkZWZpbmUgUFRTQ1IJCTB4MGMKKyNkZWZpbmUJSVNSCQkweDEwCisjZGVmaW5lCUlNUgkJMHgxNAorI2RlZmluZQlJRVIJCTB4MTgKKyNkZWZpbmUJSUhSCQkweDFjCisjZGVmaW5lIFRYRFAJCTB4MjAKKyNkZWZpbmUgVFhEUF9ISQkJMHgyNAorI2RlZmluZSBUWENGRwkJMHgyOAorI2RlZmluZSBHUElPUgkJMHgyYworI2RlZmluZSBSWERQCQkweDMwCisjZGVmaW5lIFJYRFBfSEkJCTB4MzQKKyNkZWZpbmUgUlhDRkcJCTB4MzgKKyNkZWZpbmUgUFFDUgkJMHgzYworI2RlZmluZSBXQ1NSCQkweDQwCisjZGVmaW5lIFBDUgkJMHg0NAorI2RlZmluZSBSRkNSCQkweDQ4CisjZGVmaW5lIFJGRFIJCTB4NGMKKworI2RlZmluZSBTUlIJCTB4NTgKKworI2RlZmluZSBWUkNSCQkweGJjCisjZGVmaW5lIFZUQ1IJCTB4YzAKKyNkZWZpbmUgVkRSCQkweGM0CisjZGVmaW5lIENDU1IJCTB4Y2MKKworI2RlZmluZSBUQklDUgkJMHhlMAorI2RlZmluZSBUQklTUgkJMHhlNAorI2RlZmluZSBUQU5BUgkJMHhlOAorI2RlZmluZSBUQU5MUEFSCQkweGVjCisjZGVmaW5lIFRBTkVSCQkweGYwCisjZGVmaW5lIFRFU1IJCTB4ZjQKKworI2RlZmluZSBUQklDUl9NUl9BTl9FTkFCTEUJMHgwMDAwMTAwMAorI2RlZmluZSBUQklDUl9NUl9SRVNUQVJUX0FOCTB4MDAwMDAyMDAKKworI2RlZmluZSBUQklTUl9NUl9MSU5LX1NUQVRVUwkweDAwMDAwMDIwCisjZGVmaW5lIFRCSVNSX01SX0FOX0NPTVBMRVRFCTB4MDAwMDAwMDQKKworI2RlZmluZSBUQU5BUl9QUzIgCQkweDAwMDAwMTAwCisjZGVmaW5lIFRBTkFSX1BTMSAJCTB4MDAwMDAwODAKKyNkZWZpbmUgVEFOQVJfSEFMRl9EVVAgCQkweDAwMDAwMDQwCisjZGVmaW5lIFRBTkFSX0ZVTExfRFVQIAkJMHgwMDAwMDAyMAorCisjZGVmaW5lIEdQSU9SX0dQNV9PRQkJMHgwMDAwMDIwMAorI2RlZmluZSBHUElPUl9HUDRfT0UJCTB4MDAwMDAxMDAKKyNkZWZpbmUgR1BJT1JfR1AzX09FCQkweDAwMDAwMDgwCisjZGVmaW5lIEdQSU9SX0dQMl9PRQkJMHgwMDAwMDA0MAorI2RlZmluZSBHUElPUl9HUDFfT0UJCTB4MDAwMDAwMjAKKyNkZWZpbmUgR1BJT1JfR1AzX09VVAkJMHgwMDAwMDAwNAorI2RlZmluZSBHUElPUl9HUDFfT1VUCQkweDAwMDAwMDAxCisKKyNkZWZpbmUgTElOS19BVVRPTkVHT1RJQVRFCTB4MDEKKyNkZWZpbmUgTElOS19ET1dOCQkweDAyCisjZGVmaW5lIExJTktfVVAJCQkweDA0CisKKworI2RlZmluZSBfX2tpY2tfcngoKQl3cml0ZWwoQ1JfUlhFLCBucy0+YmFzZSArIENSKQorCisjZGVmaW5lIGtpY2tfcngoKSBkbyB7IFwKKwlkcHJpbnRmKCgia2lja19yeDogbWF5YmUga2lja2luZ1xuIikpOyBcCisJCXdyaXRlbCh2aXJ0X3RvX2xlMzJkZXNjKCZyeF9yaW5nW25zLT5jdXJfcnhdKSwgbnMtPmJhc2UgKyBSWERQKTsgXAorCQlpZiAobnMtPm5leHRfcnggPT0gbnMtPm5leHRfZW1wdHkpIFwKKwkJCXByaW50ZigidWgtb2g6IG5leHRfcnggPT0gbmV4dF9lbXB0eT8/P1xuIik7IFwKKwkJX19raWNrX3J4KCk7IFwKK30gd2hpbGUoMCkKKworCisjaWZkZWYgVVNFXzY0QklUX0FERFIKKyNkZWZpbmUgSFdfQUREUl9MRU4JOAorI2Vsc2UKKyNkZWZpbmUgSFdfQUREUl9MRU4JNAorI2VuZGlmCisKKyNkZWZpbmUgQ01EU1RTX09XTgkweDgwMDAwMDAwCisjZGVmaW5lIENNRFNUU19NT1JFCTB4NDAwMDAwMDAKKyNkZWZpbmUgQ01EU1RTX0lOVFIJMHgyMDAwMDAwMAorI2RlZmluZSBDTURTVFNfRVJSCTB4MTAwMDAwMDAKKyNkZWZpbmUgQ01EU1RTX09LCTB4MDgwMDAwMDAKKyNkZWZpbmUgQ01EU1RTX0xFTl9NQVNLCTB4MDAwMGZmZmYKKworI2RlZmluZSBDTURTVFNfREVTVF9NQVNLCTB4MDE4MDAwMDAKKyNkZWZpbmUgQ01EU1RTX0RFU1RfU0VMRgkweDAwODAwMDAwCisjZGVmaW5lIENNRFNUU19ERVNUX01VTFRJCTB4MDEwMDAwMDAKKworI2RlZmluZSBERVNDX1NJWkUJOAkvKiBTaG91bGQgYmUgY2FjaGUgbGluZSBzaXplZCAqLworCisjaWZkZWYgVVNFXzY0QklUX0FERFIKK3N0cnVjdCByaW5nX2Rlc2MgeworCXVpbnQ2NF90IGxpbms7CisJdWludDY0X3QgYnVmcHRyOworCXUzMiBjbWRzdHM7CisJdTMyIGV4dHN0czsJCS8qIEV4dGVuZGVkIHN0YXR1cyBmaWVsZCAqLworfTsKKyNlbHNlCitzdHJ1Y3QgcmluZ19kZXNjIHsKKwl1MzIgbGluazsKKwl1MzIgYnVmcHRyOworCXUzMiBjbWRzdHM7CisJdTMyIGV4dHN0czsJCS8qIEV4dGVuZGVkIHN0YXR1cyBmaWVsZCAqLworfTsKKyNlbmRpZgorCisvKiBEZWZpbmUgdGhlIFRYIERlc2NyaXB0b3IgKi8KK3N0YXRpYyBzdHJ1Y3QgcmluZ19kZXNjIHR4X3JpbmdbTlJfVFhfREVTQ10KKyAgICBfX2F0dHJpYnV0ZV9fICgoYWxpZ25lZCg4KSkpOworCisvKiBDcmVhdGUgYSBzdGF0aWMgYnVmZmVyIG9mIHNpemUgUkVBTF9SWF9CVUZfU0laRSBmb3IgZWFjaAorVFggRGVzY3JpcHRvci4gIEFsbCBkZXNjcmlwdG9ycyBwb2ludCB0byBhCitwYXJ0IG9mIHRoaXMgYnVmZmVyICovCitzdGF0aWMgdW5zaWduZWQgY2hhciB0eGJbTlJfVFhfREVTQyAqIFJFQUxfUlhfQlVGX1NJWkVdOworCisvKiBEZWZpbmUgdGhlIFRYIERlc2NyaXB0b3IgKi8KK3N0YXRpYyBzdHJ1Y3QgcmluZ19kZXNjIHJ4X3JpbmdbTlJfUlhfREVTQ10KKyAgICBfX2F0dHJpYnV0ZV9fICgoYWxpZ25lZCg4KSkpOworCisvKiBDcmVhdGUgYSBzdGF0aWMgYnVmZmVyIG9mIHNpemUgUkVBTF9SWF9CVUZfU0laRSBmb3IgZWFjaAorUlggRGVzY3JpcHRvciAgIEFsbCBkZXNjcmlwdG9ycyBwb2ludCB0byBhCitwYXJ0IG9mIHRoaXMgYnVmZmVyICovCitzdGF0aWMgdW5zaWduZWQgY2hhciByeGJbTlJfUlhfREVTQyAqIFJFQUxfUlhfQlVGX1NJWkVdCisgICAgX19hdHRyaWJ1dGVfXyAoKGFsaWduZWQoOCkpKTsKKworLyogUHJpdmF0ZSBTdG9yYWdlIGZvciB0aGUgTklDICovCitzdHJ1Y3QgbnM4MzgyMF9wcml2YXRlIHsKKwl1OCAqYmFzZTsKKwlpbnQgdXA7CisJbG9uZyBpZGxlOworCXUzMiAqbmV4dF9yeF9kZXNjOworCXUxNiBuZXh0X3J4LCBuZXh0X2VtcHR5OworCXUzMiBjdXJfcng7CisJdTMyICpkZXNjczsKKwl1bnNpZ25lZCBpaHI7CisJdTMyIENGR19jYWNoZTsKKwl1MzIgTUVBUl9jYWNoZTsKKwl1MzIgSU1SX2NhY2hlOworCWludCBsaW5rc3RhdGU7CisJdTE2IHR4X2RvbmVfaWR4OworCXUxNiB0eF9pZHg7CisJdTE2IHR4X2ludHJfaWR4OworCXUzMiBwaHlfZGVzY3M7CisJdTMyICp0eF9kZXNjczsKKworfSBuc3g7CitzdGF0aWMgc3RydWN0IG5zODM4MjBfcHJpdmF0ZSAqbnM7CisKK3N0YXRpYyB2b2lkIHBoeV9pbnRyKHN0cnVjdCBuaWMgKm5pYyBfX3VudXNlZCkKK3sKKwlzdGF0aWMgY2hhciAqc3BlZWRzW10gPQorCSAgICB7ICIxMCIsICIxMDAiLCAiMTAwMCIsICIxMDAwKD8pIiwgIjEwMDBGIiB9OworCXUzMiBjZmcsIG5ld19jZmc7CisJdTMyIHRiaXNyLCB0YW5hciwgdGFubHBhcjsKKwlpbnQgc3BlZWQsIGZ1bGxkdXBsZXgsIG5ld2xpbmtzdGF0ZTsKKworCWNmZyA9IHJlYWRsKG5zLT5iYXNlICsgQ0ZHKSBeIFNQRFNUU19QT0xBUklUWTsKKwlpZiAobnMtPkNGR19jYWNoZSAmIENGR19UQklfRU4pIHsKKwkJLyogd2UgaGF2ZSBhbiBvcHRpY2FsIHRyYW5zY2VpdmVyICovCisJCXRiaXNyID0gcmVhZGwobnMtPmJhc2UgKyBUQklTUik7CisJCXRhbmFyID0gcmVhZGwobnMtPmJhc2UgKyBUQU5BUik7CisJCXRhbmxwYXIgPSByZWFkbChucy0+YmFzZSArIFRBTkxQQVIpOworCQlkcHJpbnRmKCgicGh5X2ludHI6IHRiaXNyPSVoWCwgdGFuYXI9JWhYLCB0YW5scGFyPSVoWFxuIiwKKwkJCSB0YmlzciwgdGFuYXIsIHRhbmxwYXIpKTsKKworCQlpZiAoKGZ1bGxkdXBsZXggPSAodGFubHBhciAmIFRBTkFSX0ZVTExfRFVQKQorCQkgICAgICYmICh0YW5hciAmIFRBTkFSX0ZVTExfRFVQKSkpIHsKKworCQkJLyogYm90aCBvZiB1cyBhcmUgZnVsbCBkdXBsZXggKi8KKwkJCXdyaXRlbChyZWFkbChucy0+YmFzZSArIFRYQ0ZHKQorCQkJICAgICAgIHwgVFhDRkdfQ1NJIHwgVFhDRkdfSEJJIHwgVFhDRkdfQVRQLAorCQkJICAgICAgIG5zLT5iYXNlICsgVFhDRkcpOworCQkJd3JpdGVsKHJlYWRsKG5zLT5iYXNlICsgUlhDRkcpIHwgUlhDRkdfUlhfRkQsCisJCQkgICAgICAgbnMtPmJhc2UgKyBSWENGRyk7CisJCQkvKiBMaWdodCB1cCBmdWxsIGR1cGxleCBMRUQgKi8KKwkJCXdyaXRlbChyZWFkbChucy0+YmFzZSArIEdQSU9SKSB8IEdQSU9SX0dQMV9PVVQsCisJCQkgICAgICAgbnMtPmJhc2UgKyBHUElPUik7CisKKwkJfSBlbHNlIGlmICgoKHRhbmxwYXIgJiBUQU5BUl9IQUxGX0RVUCkKKwkJCSAgICAmJiAodGFuYXIgJiBUQU5BUl9IQUxGX0RVUCkpCisJCQkgICB8fCAoKHRhbmxwYXIgJiBUQU5BUl9GVUxMX0RVUCkKKwkJCSAgICAgICAmJiAodGFuYXIgJiBUQU5BUl9IQUxGX0RVUCkpCisJCQkgICB8fCAoKHRhbmxwYXIgJiBUQU5BUl9IQUxGX0RVUCkKKwkJCSAgICAgICAmJiAodGFuYXIgJiBUQU5BUl9GVUxMX0RVUCkpKSB7CisKKwkJCS8qIG9uZSBvciBib3RoIG9mIHVzIGFyZSBoYWxmIGR1cGxleCAqLworCQkJd3JpdGVsKChyZWFkbChucy0+YmFzZSArIFRYQ0ZHKQorCQkJCSYgfihUWENGR19DU0kgfCBUWENGR19IQkkpKSB8IFRYQ0ZHX0FUUCwKKwkJCSAgICAgICBucy0+YmFzZSArIFRYQ0ZHKTsKKwkJCXdyaXRlbChyZWFkbChucy0+YmFzZSArIFJYQ0ZHKSAmIH5SWENGR19SWF9GRCwKKwkJCSAgICAgICBucy0+YmFzZSArIFJYQ0ZHKTsKKwkJCS8qIFR1cm4gb2ZmIGZ1bGwgZHVwbGV4IExFRCAqLworCQkJd3JpdGVsKHJlYWRsKG5zLT5iYXNlICsgR1BJT1IpICYgfkdQSU9SX0dQMV9PVVQsCisJCQkgICAgICAgbnMtPmJhc2UgKyBHUElPUik7CisJCX0KKworCQlzcGVlZCA9IDQ7CS8qIDEwMDBGICovCisKKwl9IGVsc2UgeworCQkvKiB3ZSBoYXZlIGEgY29wcGVyIHRyYW5zY2VpdmVyICovCisJCW5ld19jZmcgPQorCQkgICAgbnMtPkNGR19jYWNoZSAmIH4oQ0ZHX1NCIHwgQ0ZHX01PREVfMTAwMCB8IENGR19TUERTVFMpOworCisJCWlmIChjZmcgJiBDRkdfU1BEU1RTMSkKKwkJCW5ld19jZmcgfD0gQ0ZHX01PREVfMTAwMDsKKwkJZWxzZQorCQkJbmV3X2NmZyAmPSB+Q0ZHX01PREVfMTAwMDsKKworCQlzcGVlZCA9ICgoY2ZnIC8gQ0ZHX1NQRFNUUzApICYgMyk7CisJCWZ1bGxkdXBsZXggPSAoY2ZnICYgQ0ZHX0RVUFNUUyk7CisKKwkJaWYgKGZ1bGxkdXBsZXgpCisJCQluZXdfY2ZnIHw9IENGR19TQjsKKworCQlpZiAoKGNmZyAmIENGR19MTktTVFMpICYmCisJCSAgICAoKG5ld19jZmcgXiBucy0+Q0ZHX2NhY2hlKSAmIENGR19NT0RFXzEwMDApKSB7CisJCQl3cml0ZWwobmV3X2NmZywgbnMtPmJhc2UgKyBDRkcpOworCQkJbnMtPkNGR19jYWNoZSA9IG5ld19jZmc7CisJCX0KKworCQlucy0+Q0ZHX2NhY2hlICY9IH5DRkdfU1BEU1RTOworCQlucy0+Q0ZHX2NhY2hlIHw9IGNmZyAmIENGR19TUERTVFM7CisJfQorCisJbmV3bGlua3N0YXRlID0gKGNmZyAmIENGR19MTktTVFMpID8gTElOS19VUCA6IExJTktfRE9XTjsKKworCWlmIChuZXdsaW5rc3RhdGUgJiBMSU5LX1VQICYmIG5zLT5saW5rc3RhdGUgIT0gbmV3bGlua3N0YXRlKSB7CisJCXByaW50ZigibGluayBub3cgJXMgbWJwcywgJXMgZHVwbGV4IGFuZCB1cC5cbiIsCisJCSAgICAgICBzcGVlZHNbc3BlZWRdLCBmdWxsZHVwbGV4ID8gImZ1bGwiIDogImhhbGYiKTsKKwl9IGVsc2UgaWYgKG5ld2xpbmtzdGF0ZSAmIExJTktfRE9XTgorCQkgICAmJiBucy0+bGlua3N0YXRlICE9IG5ld2xpbmtzdGF0ZSkgeworCQlwcmludGYoImxpbmsgbm93IGRvd24uXG4iKTsKKwl9CisJbnMtPmxpbmtzdGF0ZSA9IG5ld2xpbmtzdGF0ZTsKK30KK3N0YXRpYyB2b2lkIG5zODM4MjBfc2V0X211bHRpY2FzdChzdHJ1Y3QgbmljICpuaWMgX191bnVzZWQpOworc3RhdGljIHZvaWQgbnM4MzgyMF9zZXR1cF9yeChzdHJ1Y3QgbmljICpuaWMpCit7CisJdW5zaWduZWQgaTsKKwlucy0+aWRsZSA9IDE7CisJbnMtPm5leHRfcnggPSAwOworCW5zLT5uZXh0X3J4X2Rlc2MgPSBucy0+ZGVzY3M7CisJbnMtPm5leHRfZW1wdHkgPSAwOworCW5zLT5jdXJfcnggPSAwOworCisKKwlmb3IgKGkgPSAwOyBpIDwgTlJfUlhfREVTQzsgaSsrKSB7CisJCXJ4X3JpbmdbaV0ubGluayA9IHZpcnRfdG9fbGUzMmRlc2MoJnJ4X3JpbmdbaSArIDFdKTsKKwkJcnhfcmluZ1tpXS5idWZwdHIgPQorCQkgICAgdmlydF90b19sZTMyZGVzYygmcnhiW2kgKiBSRUFMX1JYX0JVRl9TSVpFXSk7CisJCXJ4X3JpbmdbaV0uY21kc3RzID0gY3B1X3RvX2xlMzIoUkVBTF9SWF9CVUZfU0laRSk7CisJCXJ4X3JpbmdbaV0uZXh0c3RzID0gY3B1X3RvX2xlMzIoMCk7CisJfQorLy8gICAgICBObyBuZWVkIHRvIHdyYXAgdGhlIHJpbmcgCisvLyAgICAgIHJ4X3JpbmdbaV0ubGluayA9IHZpcnRfdG9fbGUzMmRlc2MoJnJ4X3JpbmdbMF0pOworCXdyaXRlbCgwLCBucy0+YmFzZSArIFJYRFBfSEkpOworCXdyaXRlbCh2aXJ0X3RvX2xlMzJkZXNjKCZyeF9yaW5nWzBdKSwgbnMtPmJhc2UgKyBSWERQKTsKKworCWRwcmludGYoKCJzdGFydGluZyByZWNlaXZlclxuIikpOworCisJd3JpdGVsKDB4MDAwMSwgbnMtPmJhc2UgKyBDQ1NSKTsKKwl3cml0ZWwoMCwgbnMtPmJhc2UgKyBSRkNSKTsKKwl3cml0ZWwoMHg3ZmMwMDAwMCwgbnMtPmJhc2UgKyBSRkNSKTsKKwl3cml0ZWwoMHhmZmMwMDAwMCwgbnMtPmJhc2UgKyBSRkNSKTsKKworCW5zLT51cCA9IDE7CisKKwlwaHlfaW50cihuaWMpOworCisJLyogT2theSwgbGV0IGl0IHJpcCAqLworCW5zLT5JTVJfY2FjaGUgfD0gSVNSX1BIWTsKKwlucy0+SU1SX2NhY2hlIHw9IElTUl9SWFJDTVA7CisJLy9kZXYtPklNUl9jYWNoZSB8PSBJU1JfUlhFUlI7CisJLy9kZXYtPklNUl9jYWNoZSB8PSBJU1JfUlhPSzsKKwlucy0+SU1SX2NhY2hlIHw9IElTUl9SWE9STjsKKwlucy0+SU1SX2NhY2hlIHw9IElTUl9SWFNPVlI7CisJbnMtPklNUl9jYWNoZSB8PSBJU1JfUlhERVNDOworCW5zLT5JTVJfY2FjaGUgfD0gSVNSX1JYSURMRTsKKwlucy0+SU1SX2NhY2hlIHw9IElTUl9UWERFU0M7CisJbnMtPklNUl9jYWNoZSB8PSBJU1JfVFhJRExFOworCisJLy8gTm8gcmVhc29uIHRvIGVuYWJsZSBpbnRlcnVwdHMuLi4KKwkvLyB3cml0ZWwobnMtPklNUl9jYWNoZSwgbnMtPmJhc2UgKyBJTVIpOworCS8vIHdyaXRlbCgxLCBucy0+YmFzZSArIElFUik7CisJbnM4MzgyMF9zZXRfbXVsdGljYXN0KG5pYyk7CisJa2lja19yeCgpOworfQorCisKK3N0YXRpYyB2b2lkIG5zODM4MjBfZG9fcmVzZXQoc3RydWN0IG5pYyAqbmljIF9fdW51c2VkLCB1MzIgd2hpY2gpCit7CisJZHByaW50ZigoInJlc2V0dGluZyBjaGlwLi4uXG4iKSk7CisJd3JpdGVsKHdoaWNoLCBucy0+YmFzZSArIENSKTsKKwlkbyB7CisKKwl9IHdoaWxlIChyZWFkbChucy0+YmFzZSArIENSKSAmIHdoaWNoKTsKKwlkcHJpbnRmKCgib2theSFcbiIpKTsKK30KKworc3RhdGljIHZvaWQgbnM4MzgyMF9yZXNldChzdHJ1Y3QgbmljICpuaWMpCit7CisJdW5zaWduZWQgaTsKKwlkcHJpbnRmKCgibnM4MzgyMF9yZXNldFxuIikpOworCisJd3JpdGVsKDAsIG5zLT5iYXNlICsgUFFDUik7CisKKwluczgzODIwX3NldHVwX3J4KG5pYyk7CisKKwlmb3IgKGkgPSAwOyBpIDwgTlJfVFhfREVTQzsgaSsrKSB7CisJCXR4X3JpbmdbaV0ubGluayA9IDA7CisJCXR4X3JpbmdbaV0uYnVmcHRyID0gMDsKKwkJdHhfcmluZ1tpXS5jbWRzdHMgPSBjcHVfdG9fbGUzMigwKTsKKwkJdHhfcmluZ1tpXS5leHRzdHMgPSBjcHVfdG9fbGUzMigwKTsKKwl9CisKKwlucy0+dHhfaWR4ID0gMDsKKwlucy0+dHhfZG9uZV9pZHggPSAwOworCXdyaXRlbCgwLCBucy0+YmFzZSArIFRYRFBfSEkpOworCXJldHVybjsKK30KK3N0YXRpYyB2b2lkIG5zODM4MjBfZ2V0bWFjKHN0cnVjdCBuaWMgKm5pYyBfX3VudXNlZCwgdTggKiBtYWMpCit7CisJdW5zaWduZWQgaTsKKwlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7CisJCXUzMiBkYXRhOworCQkvKiBSZWFkIGZyb20gdGhlIHBlcmZlY3QgbWF0Y2ggbWVtb3J5OiB0aGlzIGlzIGxvYWRlZCBieQorCQkgKiB0aGUgY2hpcCBmcm9tIHRoZSBFRVBST00gdmlhIHRoZSBFRUxPQUQgc2VsZiB0ZXN0LgorCQkgKi8KKwkJd3JpdGVsKGkgKiAyLCBucy0+YmFzZSArIFJGQ1IpOworCQlkYXRhID0gcmVhZGwobnMtPmJhc2UgKyBSRkRSKTsKKwkJKm1hYysrID0gZGF0YTsKKwkJKm1hYysrID0gZGF0YSA+PiA4OworCX0KK30KKworc3RhdGljIHZvaWQgbnM4MzgyMF9zZXRfbXVsdGljYXN0KHN0cnVjdCBuaWMgKm5pYyBfX3VudXNlZCkKK3sKKwl1OCAqcmZjciA9IG5zLT5iYXNlICsgUkZDUjsKKwl1MzIgYW5kX21hc2sgPSAweGZmZmZmZmZmOworCXUzMiBvcl9tYXNrID0gMDsKKwl1MzIgdmFsOworCisJLyogU3VwcG9ydCBNdWx0aWNhc3QgKi8KKwlhbmRfbWFzayAmPSB+KFJGQ1JfQUFVIHwgUkZDUl9BQU0pOworCW9yX21hc2sgfD0gUkZDUl9BQU07CisJdmFsID0gKHJlYWRsKHJmY3IpICYgYW5kX21hc2spIHwgb3JfbWFzazsKKwkvKiBSYW1pdCA6IFJGQ1IgV3JpdGUgRml4IGRvYyBzYXlzIFJGRU4gbXVzdCBiZSAwIG1vZGlmeSBvdGhlciBiaXRzICovCisJd3JpdGVsKHZhbCAmIH5SRkNSX1JGRU4sIHJmY3IpOworCXdyaXRlbCh2YWwsIHJmY3IpOworCit9CitzdGF0aWMgdm9pZCBuczgzODIwX3J1bl9iaXN0KHN0cnVjdCBuaWMgKm5pYyBfX3VudXNlZCwgY29uc3QgY2hhciAqbmFtZSwKKwkJCSAgICAgdTMyIGVuYWJsZSwgdTMyIGRvbmUsIHUzMiBmYWlsKQoreworCWludCB0aW1lZF9vdXQgPSAwOworCWxvbmcgc3RhcnQ7CisJdTMyIHN0YXR1czsKKwlpbnQgbG9vcHMgPSAwOworCisJZHByaW50ZigoInN0YXJ0ICVzXG4iLCBuYW1lKSkKKworCSAgICBzdGFydCA9IGN1cnJ0aWNrcygpOworCisJd3JpdGVsKGVuYWJsZSwgbnMtPmJhc2UgKyBQVFNDUik7CisJZm9yICg7OykgeworCQlsb29wcysrOworCQlzdGF0dXMgPSByZWFkbChucy0+YmFzZSArIFBUU0NSKTsKKwkJaWYgKCEoc3RhdHVzICYgZW5hYmxlKSkKKwkJCWJyZWFrOworCQlpZiAoc3RhdHVzICYgZG9uZSkKKwkJCWJyZWFrOworCQlpZiAoc3RhdHVzICYgZmFpbCkKKwkJCWJyZWFrOworCQlpZiAoKGN1cnJ0aWNrcygpIC0gc3RhcnQpID49IEhaKSB7CisJCQl0aW1lZF9vdXQgPSAxOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlpZiAoc3RhdHVzICYgZmFpbCkKKwkJcHJpbnRmKCIlcyBmYWlsZWQhICgweCVoWCAmIDB4JWhYKVxuIiwgbmFtZSwgc3RhdHVzLCBmYWlsKTsKKwllbHNlIGlmICh0aW1lZF9vdXQpCisJCXByaW50ZigicnVuX2Jpc3QgJXMgdGltZWQgb3V0ISAoJWhYKVxuIiwgbmFtZSwgc3RhdHVzKTsKKwlkcHJpbnRmKCgiZG9uZSAlcyBpbiAlZCBsb29wc1xuIiwgbmFtZSwgbG9vcHMpKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK0NoZWNrIExpbmsKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCBuczgzODIwX2NoZWNrX2ludHIoc3RydWN0IG5pYyAqbmljKSB7CisJaW50IGk7CisJdTMyIGlzciA9IHJlYWRsKG5zLT5iYXNlICsgSVNSKTsKKwlpZihJU1JfUEhZICYgaXNyKQorCQlwaHlfaW50cihuaWMpOworCWlmKCggSVNSX1JYSURMRSB8IElTUl9SWERFU0MgfCBJU1JfUlhFUlIpICYgaXNyKQorCQlraWNrX3J4KCk7CisJZm9yIChpID0gMDsgaSA8IE5SX1JYX0RFU0M7IGkrKykgeworCQlpZiAocnhfcmluZ1tpXS5jbWRzdHMgPT0gQ01EU1RTX09XTikgeworLy8JCQlyeF9yaW5nW2ldLmxpbmsgPSB2aXJ0X3RvX2xlMzJkZXNjKCZyeF9yaW5nW2kgKyAxXSk7CisJCQlyeF9yaW5nW2ldLmNtZHN0cyA9IGNwdV90b19sZTMyKFJFQUxfUlhfQlVGX1NJWkUpOworCQl9CisJfQorfQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitQT0xMIC0gV2FpdCBmb3IgYSBmcmFtZQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludCBuczgzODIwX3BvbGwoc3RydWN0IG5pYyAqbmljLCBpbnQgcmV0cmlldmUpCit7CisJLyogcmV0dXJuIHRydWUgaWYgdGhlcmUncyBhbiBldGhlcm5ldCBwYWNrZXQgcmVhZHkgdG8gcmVhZCAqLworCS8qIG5pYy0+cGFja2V0IHNob3VsZCBjb250YWluIGRhdGEgb24gcmV0dXJuICovCisJLyogbmljLT5wYWNrZXRsZW4gc2hvdWxkIGNvbnRhaW4gbGVuZ3RoIG9mIGRhdGEgKi8KKwl1MzIgY21kc3RzOworCWludCBlbnRyeSA9IG5zLT5jdXJfcng7CisKKwluczgzODIwX2NoZWNrX2ludHIobmljKTsKKworCWNtZHN0cyA9IGxlMzJfdG9fY3B1KHJ4X3JpbmdbZW50cnldLmNtZHN0cyk7CisKKwlpZiAoICEgKCAoQ01EU1RTX09XTiAmIChjbWRzdHMpKSAmJiAoY21kc3RzICE9IChDTURTVFNfT1dOKSkgKSApCisJICByZXR1cm4gMDsKKworCWlmICggISByZXRyaWV2ZSApIHJldHVybiAxOworCisJaWYgKCEgKENNRFNUU19PSyAmIGNtZHN0cykgKQorCSAgcmV0dXJuIDA7CisKKwluaWMtPnBhY2tldGxlbiA9IGNtZHN0cyAmIDB4ZmZmZjsKKwltZW1jcHkobmljLT5wYWNrZXQsCisJICAgICAgIHJ4YiArIChlbnRyeSAqIFJFQUxfUlhfQlVGX1NJWkUpLAorCSAgICAgICBuaWMtPnBhY2tldGxlbik7CisJLy8JCQlyeF9yaW5nW2VudHJ5XS5saW5rID0gMDsKKwlyeF9yaW5nW2VudHJ5XS5jbWRzdHMgPSBjcHVfdG9fbGUzMihDTURTVFNfT1dOKTsKKworCW5zLT5jdXJfcnggPSArK25zLT5jdXJfcnggJSBOUl9SWF9ERVNDOworCisJaWYgKG5zLT5jdXJfcnggPT0gMCkJLyogV2UgaGF2ZSB3cmFwcGVkIHRoZSByaW5nICovCisJICBraWNrX3J4KCk7CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGtpY2tfdHgoc3RydWN0IG5pYyAqbmljIF9fdW51c2VkKQoreworCWRwcmludGYoKCJraWNrX3R4XG4iKSk7CisJd3JpdGVsKENSX1RYRSwgbnMtPmJhc2UgKyBDUik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorVFJBTlNNSVQgLSBUcmFuc21pdCBhIGZyYW1lCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCBuczgzODIwX3RyYW5zbWl0KHN0cnVjdCBuaWMgKm5pYywgY29uc3QgY2hhciAqZCwJLyogRGVzdGluYXRpb24gKi8KKwkJCSAgICAgdW5zaWduZWQgaW50IHQsCS8qIFR5cGUgKi8KKwkJCSAgICAgdW5zaWduZWQgaW50IHMsCS8qIHNpemUgKi8KKwkJCSAgICAgY29uc3QgY2hhciAqcCkKK3sJCQkJLyogUGFja2V0ICovCisJLyogc2VuZCB0aGUgcGFja2V0IHRvIGRlc3RpbmF0aW9uICovCisKKwl1MTYgbnN0eXBlOworCXUzMiBjbWRzdHMsIGV4dHN0czsKKwlpbnQgY3VyX3R4ID0gMDsKKwl1MzIgaXNyID0gcmVhZGwobnMtPmJhc2UgKyBJU1IpOworCWlmIChJU1JfVFhJRExFICYgaXNyKQorCQlraWNrX3R4KG5pYyk7CisJLyogcG9pbnQgdG8gdGhlIGN1cnJlbnQgdHhiIGluY2FzZSBtdWx0aXBsZSB0eF9yaW5ncyBhcmUgdXNlZCAqLworCW1lbWNweSh0eGIsIGQsIEVUSF9BTEVOKTsKKwltZW1jcHkodHhiICsgRVRIX0FMRU4sIG5pYy0+bm9kZV9hZGRyLCBFVEhfQUxFTik7CisJbnN0eXBlID0gaHRvbnMoKHUxNikgdCk7CisJbWVtY3B5KHR4YiArIDIgKiBFVEhfQUxFTiwgKHU4ICopICYgbnN0eXBlLCAyKTsKKwltZW1jcHkodHhiICsgRVRIX0hMRU4sIHAsIHMpOworCXMgKz0gRVRIX0hMRU47CisJcyAmPSAweDBGRkY7CisJd2hpbGUgKHMgPCBFVEhfWkxFTikKKwkJdHhiW3MrK10gPSAnXDAnOworCisJLyogU2V0dXAgdGhlIHRyYW5zbWl0IGRlc2NyaXB0b3IgKi8KKwlleHRzdHMgPSAwOworCWV4dHN0cyB8PSBFWFRTVFNfVURQUEtUOworCisJdHhfcmluZ1tjdXJfdHhdLmJ1ZnB0ciA9IHZpcnRfdG9fbGUzMmRlc2MoJnR4Yik7CisJdHhfcmluZ1tjdXJfdHhdLmV4dHN0cyA9IGNwdV90b19sZTMyKGV4dHN0cyk7CisKKwljbWRzdHMgPSBjcHVfdG9fbGUzMigwKTsKKwljbWRzdHMgfD0gY3B1X3RvX2xlMzIoQ01EU1RTX09XTiB8IHMpOworCXR4X3JpbmdbY3VyX3R4XS5jbWRzdHMgPSBjcHVfdG9fbGUzMihjbWRzdHMpOworCisJd3JpdGVsKHZpcnRfdG9fbGUzMmRlc2MoJnR4X3JpbmdbMF0pLCBucy0+YmFzZSArIFRYRFApOworCWtpY2tfdHgobmljKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitESVNBQkxFIC0gVHVybiBvZmYgZXRoZXJuZXQgaW50ZXJmYWNlCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCBuczgzODIwX2Rpc2FibGUoc3RydWN0IGRldiAqZGV2KQoreworCS8qIHB1dCB0aGUgY2FyZCBpbiBpdHMgaW5pdGlhbCBzdGF0ZSAqLworCS8qIFRoaXMgZnVuY3Rpb24gc2VydmVzIDMgcHVycG9zZXMuCisJICogVGhpcyBkaXNhYmxlcyBETUEgYW5kIGludGVycnVwdHMgc28gd2UgZG9uJ3QgcmVjZWl2ZQorCSAqICB1bmV4cGVjdGVkIHBhY2tldHMgb3IgaW50ZXJydXB0cyBmcm9tIHRoZSBjYXJkIGFmdGVyCisJICogIGV0aGVyYm9vdCBoYXMgZmluaXNoZWQuIAorCSAqIFRoaXMgZnJlZXMgcmVzb3VyY2VzIHNvIGV0aGVyYm9vdCBtYXkgdXNlCisJICogIHRoaXMgZHJpdmVyIG9uIGFub3RoZXIgaW50ZXJmYWNlCisJICogVGhpcyBhbGxvd3MgZXRoZXJib290IHRvIHJlaW5pdGlhbGl6ZSB0aGUgaW50ZXJmYWNlCisJICogIGlmIHNvbWV0aGluZyBpcyBzb21ldGhpbmcgZ29lcyB3cm9uZy4KKwkgKi8KKwkvKiBkaXNhYmxlIGludGVycnVwdHMgKi8KKwl3cml0ZWwoMCwgbnMtPmJhc2UgKyBJTVIpOworCXdyaXRlbCgwLCBucy0+YmFzZSArIElFUik7CisJcmVhZGwobnMtPmJhc2UgKyBJRVIpOworCisJbnMtPnVwID0gMDsKKworCW5zODM4MjBfZG9fcmVzZXQoKHN0cnVjdCBuaWMgKikgZGV2LCBDUl9SU1QpOworCisJbnMtPklNUl9jYWNoZSAmPQorCSAgICB+KElTUl9SWE9LIHwgSVNSX1JYREVTQyB8IElTUl9SWEVSUiB8IElTUl9SWEVBUkxZIHwKKwkgICAgICBJU1JfUlhJRExFKTsKKwl3cml0ZWwobnMtPklNUl9jYWNoZSwgbnMtPmJhc2UgKyBJTVIpOworCisJLyogdG91Y2ggdGhlIHBjaSBidXMuLi4gKi8KKwlyZWFkbChucy0+YmFzZSArIElNUik7CisKKwkvKiBhc3N1bWVzIHRoZSB0cmFuc21pdHRlciBpcyBhbHJlYWR5IGRpc2FibGVkIGFuZCByZXNldCAqLworCXdyaXRlbCgwLCBucy0+YmFzZSArIFJYRFBfSEkpOworCXdyaXRlbCgwLCBucy0+YmFzZSArIFJYRFApOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK0lSUSAtIEVuYWJsZSwgRGlzYWJsZSwgb3IgRm9yY2UgaW50ZXJydXB0cworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgbnM4MzgyMF9pcnEoc3RydWN0IG5pYyAqbmljIF9fdW51c2VkLCBpcnFfYWN0aW9uX3QgYWN0aW9uIF9fdW51c2VkKQoreworICBzd2l0Y2ggKCBhY3Rpb24gKSB7CisgIGNhc2UgRElTQUJMRSA6CisgICAgYnJlYWs7CisgIGNhc2UgRU5BQkxFIDoKKyAgICBicmVhazsKKyAgY2FzZSBGT1JDRSA6CisgICAgYnJlYWs7CisgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitQUk9CRSAtIExvb2sgZm9yIGFuIGFkYXB0ZXIsIHRoaXMgcm91dGluZSdzIHZpc2libGUgdG8gdGhlIG91dHNpZGUKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBib2FyZF9mb3VuZCAxCisjZGVmaW5lIHZhbGlkX2xpbmsgMAorc3RhdGljIGludCBuczgzODIwX3Byb2JlKHN0cnVjdCBkZXYgKmRldiwgc3RydWN0IHBjaV9kZXZpY2UgKnBjaSkKK3sKKwlzdHJ1Y3QgbmljICpuaWMgPSAoc3RydWN0IG5pYyAqKSBkZXY7CisJaW50IHN6OworCWxvbmcgYWRkcjsKKwlpbnQgdXNpbmdfZGFjID0gMDsKKworCWlmIChwY2ktPmlvYWRkciA9PSAwKQorCQlyZXR1cm4gMDsKKworCXByaW50ZigibnM4MzgyMC5jOiBGb3VuZCAlcywgdmVuZG9yPTB4JWhYLCBkZXZpY2U9MHglaFhcbiIsCisJICAgICAgIHBjaS0+bmFtZSwgcGNpLT52ZW5kb3IsIHBjaS0+ZGV2X2lkKTsKKworCS8qIHBvaW50IHRvIHByaXZhdGUgc3RvcmFnZSAqLworCW5zID0gJm5zeDsKKworCWFkanVzdF9wY2lfZGV2aWNlKHBjaSk7CisKKwlhZGRyID0gcGNpX2Jhcl9zdGFydChwY2ksIFBDSV9CQVNFX0FERFJFU1NfMSk7CisJc3ogPSBwY2lfYmFyX3NpemUocGNpLCBQQ0lfQkFTRV9BRERSRVNTXzEpOworCisJbnMtPmJhc2UgPSBpb3JlbWFwKGFkZHIsICgxVUwgPDwgMTIpKTsKKy8vICAgICAgbnMtPmJhc2UgPSBpb3JlbWFwKGFkZHIsIHN6KTsKKworCWlmICghbnMtPmJhc2UpCisJCXJldHVybiAwOworCisJbmljLT5pcnFubyAgPSAwOworCW5pYy0+aW9hZGRyID0gcGNpLT5pb2FkZHIgJiB+MzsKKworCS8qIGRpc2FibGUgaW50ZXJydXB0cyAqLworCXdyaXRlbCgwLCBucy0+YmFzZSArIElNUik7CisJd3JpdGVsKDAsIG5zLT5iYXNlICsgSUVSKTsKKwlyZWFkbChucy0+YmFzZSArIElFUik7CisKKwlucy0+SU1SX2NhY2hlID0gMDsKKworCW5zODM4MjBfZG9fcmVzZXQobmljLCBDUl9SU1QpOworCisJLyogTXVzdCByZXNldCB0aGUgcmFtIGJpc3QgYmVmb3JlIHJ1bm5pbmcgaXQgKi8KKwl3cml0ZWwoUFRTQ1JfUkJJU1RfUlNULCBucy0+YmFzZSArIFBUU0NSKTsKKwluczgzODIwX3J1bl9iaXN0KG5pYywgInNyYW0gYmlzdCIsIFBUU0NSX1JCSVNUX0VOLAorCQkJIFBUU0NSX1JCSVNUX0RPTkUsIFBUU0NSX1JCSVNUX0ZBSUwpOworCW5zODM4MjBfcnVuX2Jpc3QobmljLCAiZWVwcm9tIGJpc3QiLCBQVFNDUl9FRUJJU1RfRU4sIDAsCisJCQkgUFRTQ1JfRUVCSVNUX0ZBSUwpOworCW5zODM4MjBfcnVuX2Jpc3QobmljLCAiZWVwcm9tIGxvYWQiLCBQVFNDUl9FRUxPQURfRU4sIDAsIDApOworCisJLyogSSBsb3ZlIGNvbmZpZyByZWdpc3RlcnMgKi8KKwlucy0+Q0ZHX2NhY2hlID0gcmVhZGwobnMtPmJhc2UgKyBDRkcpOworCisJaWYgKChucy0+Q0ZHX2NhY2hlICYgQ0ZHX1BDSTY0X0RFVCkpIHsKKwkJcHJpbnRmKCIlczogZGV0ZWN0ZWQgNjQgYml0IFBDSSBkYXRhIGJ1cy5cbiIsIHBjaS0+bmFtZSk7CisJCS8qZGV2LT5DRkdfY2FjaGUgfD0gQ0ZHX0RBVEE2NF9FTjsgKi8KKwkJaWYgKCEobnMtPkNGR19jYWNoZSAmIENGR19EQVRBNjRfRU4pKQorCQkJcHJpbnRmCisJCQkgICAgKCIlczogRUVQUk9NIGRpZCBub3QgZW5hYmxlIDY0IGJpdCBidXMuICBEaXNhYmxlZC5cbiIsCisJCQkgICAgIHBjaS0+bmFtZSk7CisJfSBlbHNlCisJCW5zLT5DRkdfY2FjaGUgJj0gfihDRkdfREFUQTY0X0VOKTsKKworCW5zLT5DRkdfY2FjaGUgJj0gKENGR19UQklfRU4gfCBDRkdfTVJNX0RJUyB8IENGR19NV0lfRElTIHwKKwkJCSAgQ0ZHX1Q2NEFERFIgfCBDRkdfREFUQTY0X0VOIHwgQ0ZHX0VYVF8xMjUgfAorCQkJICBDRkdfTTY0QUREUik7CisJbnMtPkNGR19jYWNoZSB8PQorCSAgICBDRkdfUElOVF9EVVBTVFMgfCBDRkdfUElOVF9MTktTVFMgfCBDRkdfUElOVF9TUERTVFMgfAorCSAgICBDRkdfRVhUU1RTX0VOIHwgQ0ZHX0VYRCB8IENGR19QRVNFTDsKKwlucy0+Q0ZHX2NhY2hlIHw9IENGR19SRVFBTEc7CisJbnMtPkNGR19jYWNoZSB8PSBDRkdfUE9XOworCW5zLT5DRkdfY2FjaGUgfD0gQ0ZHX1RNUlRFU1Q7CisKKwkvKiBXaGVuIGNvbXBpbGVkIHdpdGggNjQgYml0IGFkZHJlc3NpbmcsIHdlIG11c3QgYWx3YXlzIGVuYWJsZQorCSAqIHRoZSA2NCBiaXQgZGVzY3JpcHRvciBmb3JtYXQuCisJICovCisjaWZkZWYgVVNFXzY0QklUX0FERFIKKwlucy0+Q0ZHX2NhY2hlIHw9IENGR19NNjRBRERSOworI2VuZGlmCisKKy8vRklYTUU6IEVuYWJsZSBzZWN0aW9uIG9uIGRhYyBvciByZW1vdmUgdGhpcworCWlmICh1c2luZ19kYWMpCisJCW5zLT5DRkdfY2FjaGUgfD0gQ0ZHX1Q2NEFERFI7CisKKwkvKiBCaWcgZW5kaWFuIG1vZGUgZG9lcyBub3Qgc2VlbSB0byBkbyB3aGF0IHRoZSBkb2NzIHN1Z2dlc3QgKi8KKwlucy0+Q0ZHX2NhY2hlICY9IH5DRkdfQkVNOworCisJLyogc2V0dXAgb3B0aWNhbCB0cmFuc2NlaXZlciBpZiB3ZSBoYXZlIG9uZSAqLworCWlmIChucy0+Q0ZHX2NhY2hlICYgQ0ZHX1RCSV9FTikgeworCQlkcHJpbnRmKCgiJXM6IGVuYWJsaW5nIG9wdGljYWwgdHJhbnNjZWl2ZXJcbiIsIHBjaS0+bmFtZSkpOworCQl3cml0ZWwocmVhZGwobnMtPmJhc2UgKyBHUElPUikgfCAweDNlOCwgbnMtPmJhc2UgKyBHUElPUik7CisKKwkJLyogc2V0dXAgYXV0byBuZWdvdGlhdGlvbiBmZWF0dXJlIGFkdmVydGlzZW1lbnQgKi8KKwkJd3JpdGVsKHJlYWRsKG5zLT5iYXNlICsgVEFOQVIpCisJCSAgICAgICB8IFRBTkFSX0hBTEZfRFVQIHwgVEFOQVJfRlVMTF9EVVAsCisJCSAgICAgICBucy0+YmFzZSArIFRBTkFSKTsKKworCQkvKiBzdGFydCBhdXRvIG5lZ290aWF0aW9uICovCisJCXdyaXRlbChUQklDUl9NUl9BTl9FTkFCTEUgfCBUQklDUl9NUl9SRVNUQVJUX0FOLAorCQkgICAgICAgbnMtPmJhc2UgKyBUQklDUik7CisJCXdyaXRlbChUQklDUl9NUl9BTl9FTkFCTEUsIG5zLT5iYXNlICsgVEJJQ1IpOworCQlucy0+bGlua3N0YXRlID0gTElOS19BVVRPTkVHT1RJQVRFOworCisJCW5zLT5DRkdfY2FjaGUgfD0gQ0ZHX01PREVfMTAwMDsKKwl9CisJd3JpdGVsKG5zLT5DRkdfY2FjaGUsIG5zLT5iYXNlICsgQ0ZHKTsKKwlkcHJpbnRmKCgiQ0ZHOiAlaFhcbiIsIG5zLT5DRkdfY2FjaGUpKTsKKworCS8qIEZJWE1FOiByZXNldF9waHkgaXMgZGVmYXVsdGVkIHRvIDAsIHNob3VsZCB3ZSByZXNldCBhbnl3YXk/ICovCisJaWYgKHJlc2V0X3BoeSkgeworCQlkcHJpbnRmKCgiJXM6IHJlc2V0dGluZyBwaHlcbiIsIHBjaS0+bmFtZSkpOworCQl3cml0ZWwobnMtPkNGR19jYWNoZSB8IENGR19QSFlfUlNULCBucy0+YmFzZSArIENGRyk7CisJCXdyaXRlbChucy0+Q0ZHX2NhY2hlLCBucy0+YmFzZSArIENGRyk7CisJfQorI2lmIDAJCQkJLyogSHVoPyAgVGhpcyBzZXRzIHRoZSBQQ0kgbGF0ZW5jeSByZWdpc3Rlci4gIFNob3VsZCBiZSBkb25lIHZpYSAKKwkJCQkgKiB0aGUgUENJIGxheWVyLiAgRklYTUUuCisJCQkJICovCisJaWYgKHJlYWRsKGRldi0+YmFzZSArIFNSUikpCisJCXdyaXRlbChyZWFkbChkZXYtPmJhc2UgKyAweDIwYykgfCAweGZlMDAsCisJCSAgICAgICBkZXYtPmJhc2UgKyAweDIwYyk7CisjZW5kaWYKKworCS8qIE5vdGUhICBUaGUgRE1BIGJ1cnN0IHNpemUgaW50ZXJhY3RzIHdpdGggcGFja2V0CisJICogdHJhbnNtaXNzaW9uLCBzdWNoIHRoYXQgdGhlIGxhcmdlc3QgcGFja2V0IHRoYXQKKwkgKiBjYW4gYmUgdHJhbnNtaXR0ZWQgaXMgODE5MiAtIEZMVEggLSBidXJzdCBzaXplLgorCSAqIElmIG9ubHkgdGhlIHRyYW5zbWl0IGZpZm8gd2FzIGxhcmdlci4uLgorCSAqLworCS8qIFJhbWl0IDogMTAyNCBETUEgaXMgbm90IGEgZ29vZCBpZGVhLCBpdCBlbmRzIHVwIGJhbmdpbmcgCisJICogc29tZSBERUxMIGFuZCBDT01QQVEgU01QIHN5c3RlbXMgKi8KKwl3cml0ZWwoVFhDRkdfQ1NJIHwgVFhDRkdfSEJJIHwgVFhDRkdfQVRQIHwgVFhDRkdfTVhETUE1MTIKKwkgICAgICAgfCAoKDE2MDAgLyAzMikgKiAweDEwMCksIG5zLT5iYXNlICsgVFhDRkcpOworCisJLyogU2V0IFJ4IHRvIGZ1bGwgZHVwbGV4LCBkb24ndCBhY2NlcHQgcnVudCwgZXJyb3JlZCwgbG9uZyBvciBsZW5ndGgKKwkgKiByYW5nZSBlcnJvcmVkIHBhY2tldHMuICBVc2UgNTEyIGJ5dGUgRE1BLgorCSAqLworCS8qIFJhbWl0IDogMTAyNCBETUEgaXMgbm90IGEgZ29vZCBpZGVhLCBpdCBlbmRzIHVwIGJhbmdpbmcgCisJICogc29tZSBERUxMIGFuZCBDT01QQVEgU01QIHN5c3RlbXMgCisJICogVHVybiBvbiBBTFAsIG9ubHkgd2UgYXJlIGFjY3BldGluZyBKdW1ibyBQYWNrZXRzICovCisJd3JpdGVsKFJYQ0ZHX0FFUCB8IFJYQ0ZHX0FSUCB8IFJYQ0ZHX0FJUkwgfCBSWENGR19SWF9GRAorCSAgICAgICB8IFJYQ0ZHX1NUUklQQ1JDCisJICAgICAgIC8vfCBSWENGR19BTFAKKwkgICAgICAgfCAoUlhDRkdfTVhETUE1MTIpIHwgMCwgbnMtPmJhc2UgKyBSWENGRyk7CisKKwkvKiBEaXNhYmxlIHByaW9yaXR5IHF1ZXVlaW5nICovCisJd3JpdGVsKDAsIG5zLT5iYXNlICsgUFFDUik7CisKKwkvKiBFbmFibGUgSVAgY2hlY2tzdW0gdmFsaWRhdGlvbiBhbmQgZGV0ZXRpb24gb2YgVkxBTiBoZWFkZXJzLgorCSAqIE5vdGU6IGRvIG5vdCBzZXQgdGhlIHJlamVjdCBvcHRpb25zIGFzIGF0IGxlYXN0IHRoZSAweDEwMgorCSAqIHJldmlzaW9uIG9mIHRoZSBjaGlwIGRvZXMgbm90IHByb3Blcmx5IGFjY2VwdCBJUCBmcmFnbWVudHMKKwkgKiBhdCBsZWFzdCBmb3IgVURQLgorCSAqLworCS8qIFJhbWl0IDogQmUgc3VyZSB0byB0dXJuIG9uIFJYQ0ZHX0FSUCBpZiBWTEFOJ3MgYXJlIGVuYWJsZWQsIHNpbmNlCisJICogdGhlIE1BQyBpdCBjYWxjdWxhdGVzIHRoZSBwYWNrZXRzaXplIEFGVEVSIHN0cmlwcGluZyB0aGUgVkxBTgorCSAqIGhlYWRlciwgYW5kIGlmIGEgVkxBTiBUYWdnZWQgcGFja2V0IG9mIDY0IGJ5dGVzIGlzIHJlY2VpdmVkIChsaWtlCisJICogYSBwaW5nIHdpdGggYSBWTEFOIGhlYWRlcikgdGhlbiB0aGUgY2FyZCwgc3RyaXBzIHRoZSA0IGJ5dGUgVkxBTgorCSAqIHRhZyBhbmQgdGhlbiBjaGVja3MgdGhlIHBhY2tldCBzaXplLCBzbyBpZiBSWENGR19BUlAgaXMgbm90IGVuYWJsZWQsCisJICogaXQgZGlzY3JhcmRzIGl0IS4gIFRoZXNlIGd1eXMuLi4uLi4KKwkgKi8KKwl3cml0ZWwoVlJDUl9JUEVOIHwgVlJDUl9WVERFTiwgbnMtPmJhc2UgKyBWUkNSKTsKKworCS8qIEVuYWJsZSBwZXItcGFja2V0IFRDUC9VRFAvSVAgY2hlY2tzdW1taW5nICovCisJd3JpdGVsKFZUQ1JfUFBDSEssIG5zLT5iYXNlICsgVlRDUik7CisKKwkvKiBSYW1pdCA6IEVuYWJsZSBhc3luYyBhbmQgc3luYyBwYXVzZSBmcmFtZXMgKi8KKy8vICAgICAgd3JpdGVsKDAsIG5zLT5iYXNlICsgUENSKTsgCisJd3JpdGVsKChQQ1JfUFNfTUNBU1QgfCBQQ1JfUFNfREEgfCBQQ1JfUFNFTiB8IFBDUl9GRkxPXzRLIHwKKwkJUENSX0ZGSElfOEsgfCBQQ1JfU1RMT180IHwgUENSX1NUSElfOCB8IFBDUl9QQVVTRV9DTlQpLAorCSAgICAgICBucy0+YmFzZSArIFBDUik7CisKKwkvKiBEaXNhYmxlIFdha2UgT24gTGFuICovCisJd3JpdGVsKDAsIG5zLT5iYXNlICsgV0NTUik7CisKKwluczgzODIwX2dldG1hYyhuaWMsIG5pYy0+bm9kZV9hZGRyKTsKKwlwcmludGYoIiUhIGF0IGlvYWRkciAweCVoWCwgIiwgbmljLT5ub2RlX2FkZHIsIG5zLT5iYXNlKTsKKworCWlmICh1c2luZ19kYWMpIHsKKwkJZHByaW50ZigoIiVzOiB1c2luZyA2NCBiaXQgYWRkcmVzc2luZy5cbiIsIHBjaS0+bmFtZSkpOworCX0KKworCWRwcmludGYoKCIlczogRFA4MzgyMCAlZC4lZDogJSEgaW89MHglaFhcbiIsCisJCSBwY2ktPm5hbWUsCisJCSAodW5zaWduZWQpIHJlYWRsKG5zLT5iYXNlICsgU1JSKSA+PiA4LAorCQkgKHVuc2lnbmVkKSByZWFkbChucy0+YmFzZSArIFNSUikgJiAweGZmLAorCQkgbmljLT5ub2RlX2FkZHIsIHBjaS0+aW9hZGRyKSk7CisKKyNpZmRlZiBQSFlfQ09ERV9JU19GSU5JU0hFRAorCW5zODM4MjBfcHJvYmVfcGh5KGRldik7CisjZW5kaWYKKworCW5zODM4MjBfcmVzZXQobmljKTsKKwkvKiBwb2ludCB0byBOSUMgc3BlY2lmaWMgcm91dGluZXMgKi8KKwlkZXYtPmRpc2FibGUgID0gbnM4MzgyMF9kaXNhYmxlOworCW5pYy0+cG9sbCAgICAgPSBuczgzODIwX3BvbGw7CisJbmljLT50cmFuc21pdCA9IG5zODM4MjBfdHJhbnNtaXQ7CisJbmljLT5pcnEgICAgICA9IG5zODM4MjBfaXJxOworCXJldHVybiAxOworfQorCitzdGF0aWMgc3RydWN0IHBjaV9pZCBuczgzODIwX25pY3NbXSA9IHsKKwlQQ0lfUk9NKDB4MTAwYiwgMHgwMDIyLCAibnM4MzgyMCIsICJOYXRpb25hbCBTZW1pY29uZHVjdG9yIDgzODIwIiksCit9OworCitzdHJ1Y3QgcGNpX2RyaXZlciBuczgzODIwX2RyaXZlciA9IHsKKwkudHlwZSA9IE5JQ19EUklWRVIsCisJLm5hbWUgPSAiTlM4MzgyMC9QQ0kiLAorCS5wcm9iZSA9IG5zODM4MjBfcHJvYmUsCisJLmlkcyA9IG5zODM4MjBfbmljcywKKwkuaWRfY291bnQgPSBzaXplb2YobnM4MzgyMF9uaWNzKSAvIHNpemVvZihuczgzODIwX25pY3NbMF0pLAorCS5jbGFzcyA9IDAsCit9OwpkaWZmIC1OYXVyIGdydWItMC45Ny5vcmlnL25ldGJvb3QvbnM4MzkwLmMgZ3J1Yi0wLjk3L25ldGJvb3QvbnM4MzkwLmMKLS0tIGdydWItMC45Ny5vcmlnL25ldGJvb3QvbnM4MzkwLmMJMjAwMy0wNy0wOSAxMTo0NTozOC4wMDAwMDAwMDAgKzAwMDAKKysrIGdydWItMC45Ny9uZXRib290L25zODM5MC5jCTIwMDUtMDgtMzEgMjE6MTM6NDEuMDAwMDAwMDAwICswMDAwCkBAIC0xMywxMSArMTMsMTUgQEAKICAgdGhlIHByb3BlciBmdW5jdGlvbmluZyBvZiB0aGlzIHNvZnR3YXJlLCBub3IgZG8gdGhlIGF1dGhvcnMgYXNzdW1lIGFueQogICByZXNwb25zaWJpbGl0eSBmb3IgZGFtYWdlcyBpbmN1cnJlZCB3aXRoIGl0cyB1c2UuCiAKK011bHRpY2FzdCBzdXBwb3J0IGFkZGVkIGJ5IFRpbW90aHkgTGVnZ2UgKHRpbWxlZ2dlQHVzZXJzLnNvdXJjZWZvcmdlLm5ldCkgMDkvMjgvMjAwMworUmVsb2NhdGlvbiBzdXBwb3J0IGFkZGVkIGJ5IEtlbiBZYXAgKGtlbl95YXBAdXNlcnMuc291cmNlZm9yZ2UubmV0KSAyOC8xMi8wMgogM2M1MDMgc3VwcG9ydCBhZGRlZCBieSBCaWxsIFBhdWwgKHdwYXVsQGN0ci5jb2x1bWJpYS5lZHUpIG9uIDExLzE1Lzk0CiBTTUM4NDE2IHN1cHBvcnQgYWRkZWQgYnkgQmlsbCBQYXVsICh3cGF1bEBjdHIuY29sdW1iaWEuZWR1KSBvbiAxMi8yNS85NAogM2M1MDMgUElPIHN1cHBvcnQgYWRkZWQgYnkgSmltIEhhZ3VlIChqaW0uaGFndWVAYWNtLm9yZykgb24gMi8xNy85OAogUlggb3ZlcnJ1biBieSBLbGF1cyBFc3BlbmxhdWIgKGVzcGVubGF1YkBpbmZvcm1hdGlrLnVuaS11bG0uZGUpIG9uIDMvMTAvOTkKICAgcGFydHMgdGFrZW4gZnJvbSB0aGUgTGludXggODM5MCBkcml2ZXIgKGJ5IERvbmFsZCBCZWNrZXIgYW5kIFBhdWwgR29ydG1ha2VyKQorU01DODQxNiBQSU8gc3VwcG9ydCBhZGRlZCBieSBBbmRyZXcgQmV0dGlzb24gKGFuZHJld2JAemlwLmNvbS5hdSkgb24gNC8zLzAyCisgIGJhc2VkIG9uIHRoZSBMaW51eCA4MzkwIGRyaXZlciAoYnkgRG9uYWxkIEJlY2tlciBhbmQgUGF1bCBHb3J0bWFrZXIpCiAKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCkBAIC0yNiwxMCArMzAsMTYgQEAKICNpbmNsdWRlICJuczgzOTAuaCIKICNpZmRlZglJTkNMVURFX05TODM5MAogI2luY2x1ZGUgInBjaS5oIgorI2Vsc2UKKyNpbmNsdWRlICJpc2EuaCIKICNlbmRpZgotI2luY2x1ZGUgImNhcmRzLmgiCiAKLXN0YXRpYyB1bnNpZ25lZCBjaGFyCWV0aF92ZW5kb3IsIGV0aF9mbGFncywgZXRoX2xhYXI7Cit0eXBlZGVmIGludCBBZGRyZXNzOworCitzdGF0aWMgdW5zaWduZWQgY2hhcglldGhfdmVuZG9yLCBldGhfZmxhZ3M7CisjaWZkZWYJSU5DTFVERV9XRAorc3RhdGljIHVuc2lnbmVkIGNoYXIJZXRoX2xhYXI7CisjZW5kaWYKIHN0YXRpYyB1bnNpZ25lZCBzaG9ydAlldGhfbmljX2Jhc2UsIGV0aF9hc2ljX2Jhc2U7CiBzdGF0aWMgdW5zaWduZWQgY2hhcglldGhfbWVtc2l6ZSwgZXRoX3J4X3N0YXJ0LCBldGhfdHhfc3RhcnQ7CiBzdGF0aWMgQWRkcmVzcwkJZXRoX2JtZW0sIGV0aF9ybWVtOwpAQCAtNjYsNiArNzYsNyBAQAogI2VuZGlmCiAKICNpZglkZWZpbmVkKElOQ0xVREVfV0QpCisjZGVmaW5lCUFTSUNfUElPCVdEX0lBUgogI2RlZmluZQlldGhfcHJvYmUJd2RfcHJvYmUKICNpZglkZWZpbmVkKElOQ0xVREVfM0M1MDMpIHx8IGRlZmluZWQoSU5DTFVERV9ORSkgfHwgZGVmaW5lZChJTkNMVURFX05TODM5MCkKIEVycm9yIHlvdSBtdXN0IG9ubHkgZGVmaW5lIG9uZSBvZiBJTkNMVURFX1dELCBJTkNMVURFXzNDNTAzLCBJTkNMVURFX05FLCBJTkNMVURFX05TODM5MApAQCAtMTAxLDEzICsxMTIsMTYgQEAKICNlbmRpZgogI2VuZGlmCiAKLSNpZglkZWZpbmVkKElOQ0xVREVfTkUpIHx8IGRlZmluZWQoSU5DTFVERV9OUzgzOTApIHx8IChkZWZpbmVkKElOQ0xVREVfM0M1MDMpICYmICFkZWZpbmVkKFQ1MDNfU0hNRU0pKQorI2lmCWRlZmluZWQoSU5DTFVERV9ORSkgfHwgZGVmaW5lZChJTkNMVURFX05TODM5MCkgfHwgKGRlZmluZWQoSU5DTFVERV8zQzUwMykgJiYgIWRlZmluZWQoVDUwM19TSE1FTSkpIHx8IChkZWZpbmVkKElOQ0xVREVfV0QpICYmIGRlZmluZWQoV0RfNzkwX1BJTykpCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIEVUSF9QSU9fUkVBRCAtIFJlYWQgYSBmcmFtZSB2aWEgUHJvZ3JhbW1lZCBJL08KICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogc3RhdGljIHZvaWQgZXRoX3Bpb19yZWFkKHVuc2lnbmVkIGludCBzcmMsIHVuc2lnbmVkIGNoYXIgKmRzdCwgdW5zaWduZWQgaW50IGNudCkKIHsKLQlpZiAoZXRoX2ZsYWdzICYgRkxBR18xNkJJVCkgeyArK2NudDsgY250ICY9IH4xOyB9CisjaWZkZWYJSU5DTFVERV9XRAorCW91dGIoc3JjICYgMHhmZiwgZXRoX2FzaWNfYmFzZSArIFdEX0dQMik7CisJb3V0YihzcmMgPj4gOCwgZXRoX2FzaWNfYmFzZSArIFdEX0dQMik7CisjZWxzZQogCW91dGIoRDgzOTBfQ09NTUFORF9SRDIgfAogCQlEODM5MF9DT01NQU5EX1NUQSwgZXRoX25pY19iYXNlICsgRDgzOTBfUDBfQ09NTUFORCk7CiAJb3V0YihjbnQsIGV0aF9uaWNfYmFzZSArIEQ4MzkwX1AwX1JCQ1IwKTsKQEAgLTEyMiw5ICsxMzYsMTAgQEAKIAlvdXRiKHNyYyA+PiA4LCBldGhfYXNpY19iYXNlICsgXzNDT01fREFNU0IpOwogCW91dGIodDUwM19vdXRwdXQgfCBfM0NPTV9DUl9TVEFSVCwgZXRoX2FzaWNfYmFzZSArIF8zQ09NX0NSKTsKICNlbmRpZgorI2VuZGlmCiAKIAlpZiAoZXRoX2ZsYWdzICYgRkxBR18xNkJJVCkKLQkJY250ID4+PSAxOworCQljbnQgPSAoY250ICsgMSkgPj4gMTsKIAogCXdoaWxlKGNudC0tKSB7CiAjaWZkZWYJSU5DTFVERV8zQzUwMwpAQCAtMTUzLDcgKzE2OCwxMCBAQAogI2lmZGVmCUNPTVBFWF9STDIwMDBfRklYCiAJdW5zaWduZWQgaW50IHg7CiAjZW5kaWYJLyogQ09NUEVYX1JMMjAwMF9GSVggKi8KLQlpZiAoZXRoX2ZsYWdzICYgRkxBR18xNkJJVCkgeyArK2NudDsgY250ICY9IH4xOyB9CisjaWZkZWYJSU5DTFVERV9XRAorCW91dGIoZHN0ICYgMHhmZiwgZXRoX2FzaWNfYmFzZSArIFdEX0dQMik7CisJb3V0Yihkc3QgPj4gOCwgZXRoX2FzaWNfYmFzZSArIFdEX0dQMik7CisjZWxzZQogCW91dGIoRDgzOTBfQ09NTUFORF9SRDIgfAogCQlEODM5MF9DT01NQU5EX1NUQSwgZXRoX25pY19iYXNlICsgRDgzOTBfUDBfQ09NTUFORCk7CiAJb3V0YihEODM5MF9JU1JfUkRDLCBldGhfbmljX2Jhc2UgKyBEODM5MF9QMF9JU1IpOwpAQCAtMTcwLDkgKzE4OCwxMCBAQAogCiAJb3V0Yih0NTAzX291dHB1dCB8IF8zQ09NX0NSX0RESVIgfCBfM0NPTV9DUl9TVEFSVCwgZXRoX2FzaWNfYmFzZSArIF8zQ09NX0NSKTsKICNlbmRpZgorI2VuZGlmCiAKIAlpZiAoZXRoX2ZsYWdzICYgRkxBR18xNkJJVCkKLQkJY250ID4+PSAxOworCQljbnQgPSAoY250ICsgMSkgPj4gMTsKIAogCXdoaWxlKGNudC0tKQogCXsKQEAgLTIwMSwxNyArMjIwLDQwIEBACiAJaWYgKHggPj0gQ09NUEVYX1JMMjAwMF9UUklFUykKIAkJcHJpbnRmKCJXYXJuaW5nOiBDb21wZXggUkwyMDAwIGFib3J0ZWQgd2FpdCFcbiIpOwogI2VuZGlmCS8qIENPTVBFWF9STDIwMDBfRklYICovCisjaWZuZGVmCUlOQ0xVREVfV0QKIAl3aGlsZSgoaW5iKGV0aF9uaWNfYmFzZSArIEQ4MzkwX1AwX0lTUikgJiBEODM5MF9JU1JfUkRDKQogCQkhPSBEODM5MF9JU1JfUkRDKTsKICNlbmRpZgorI2VuZGlmCiB9CiAjZWxzZQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiBFVEhfUElPX1JFQUQgLSBEdW1teSByb3V0aW5lIHdoZW4gTkUyMDAwIG5vdCBjb21waWxlZCBpbgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBldGhfcGlvX3JlYWQodW5zaWduZWQgaW50IHNyYywgdW5zaWduZWQgY2hhciAqZHN0LCB1bnNpZ25lZCBpbnQgY250KSB7fQorc3RhdGljIHZvaWQgZXRoX3Bpb19yZWFkKHVuc2lnbmVkIGludCBzcmMgX191bnVzZWQsIHVuc2lnbmVkIGNoYXIgKmRzdCAgX191bnVzZWQsIHVuc2lnbmVkIGludCBjbnQgX191bnVzZWQpIHt9CiAjZW5kaWYKIAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK2VuYWJsZV9tdWx0eWNhc3QgLSBFbmFibGUgTXVsdGljYXN0CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIGVuYWJsZV9tdWx0aWNhc3QodW5zaWduZWQgc2hvcnQgZXRoX25pY19iYXNlKSAKK3sKKwl1bnNpZ25lZCBjaGFyIG1jZmlsdGVyWzhdOworCWludCBpOworCW1lbXNldChtY2ZpbHRlciwgMHhGRiwgOCk7CisJb3V0Yig0LCBldGhfbmljX2Jhc2UrRDgzOTBfUDBfUkNSKTsJCisJb3V0YihEODM5MF9DT01NQU5EX1JEMiArIEQ4MzkwX0NPTU1BTkRfUFMxLCBldGhfbmljX2Jhc2UgKyBEODM5MF9QMF9DT01NQU5EKTsKKwlmb3IoaT0wO2k8ODtpKyspCisJeworCQlvdXRiKG1jZmlsdGVyW2ldLCBldGhfbmljX2Jhc2UgKyA4ICsgaSk7CisJCWlmKGluYihldGhfbmljX2Jhc2UgKyA4ICsgaSkhPW1jZmlsdGVyW2ldKQorCQkJcHJpbnRmKCJFcnJvciBTTUMgODNDNjkwIE11bHRpY2FzdCBmaWx0ZXIgcmVhZC93cml0ZSBtaXNoYXAgJWRcbiIsaSk7CisJfQorCW91dGIoRDgzOTBfQ09NTUFORF9SRDIgKyBEODM5MF9DT01NQU5EX1BTMCwgZXRoX25pY19iYXNlICsgRDgzOTBfUDBfQ09NTUFORCk7CisJb3V0Yig0IHwgMHgwOCwgZXRoX25pY19iYXNlK0Q4MzkwX1AwX1JDUik7Cit9CisKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogTlM4MzkwX1JFU0VUIC0gUmVzZXQgYWRhcHRlcgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC0yMzgsNyArMjgwLDE0IEBACiAJb3V0YihldGhfdHhfc3RhcnQsIGV0aF9uaWNfYmFzZStEODM5MF9QMF9UUFNSKTsKIAlvdXRiKGV0aF9yeF9zdGFydCwgZXRoX25pY19iYXNlK0Q4MzkwX1AwX1BTVEFSVCk7CiAjaWZkZWYJSU5DTFVERV9XRAotCWlmIChldGhfZmxhZ3MgJiBGTEFHXzc5MCkgb3V0YigwLCBldGhfbmljX2Jhc2UgKyAweDA5KTsKKwlpZiAoZXRoX2ZsYWdzICYgRkxBR183OTApIHsKKyNpZmRlZglXRF83OTBfUElPCisJCW91dGIoMHgxMCwgZXRoX2FzaWNfYmFzZSArIDB4MDYpOyAvKiBkaXNhYmxlIGludGVycnVwdHMsIGVuYWJsZSBQSU8gKi8KKwkJb3V0YigweDAxLCBldGhfbmljX2Jhc2UgKyAweDA5KTsgLyogZW5hYmxlIHJpbmcgcmVhZCBhdXRvLXdyYXAgKi8KKyNlbHNlCisJCW91dGIoMCwgZXRoX25pY19iYXNlICsgMHgwOSk7CisjZW5kaWYKKwl9CiAjZW5kaWYKIAlvdXRiKGV0aF9tZW1zaXplLCBldGhfbmljX2Jhc2UrRDgzOTBfUDBfUFNUT1ApOwogCW91dGIoZXRoX21lbXNpemUgLSAxLCBldGhfbmljX2Jhc2UrRDgzOTBfUDBfQk9VTkQpOwpAQCAtMjY2LDggKzMxNSwxMCBAQAogCQlvdXRiKEQ4MzkwX0NPTU1BTkRfUFMwIHwKIAkJCUQ4MzkwX0NPTU1BTkRfUkQyIHwgRDgzOTBfQ09NTUFORF9TVEEsIGV0aF9uaWNfYmFzZStEODM5MF9QMF9DT01NQU5EKTsKIAlvdXRiKDB4RkYsIGV0aF9uaWNfYmFzZStEODM5MF9QMF9JU1IpOwotCW91dGIoMCwgZXRoX25pY19iYXNlK0Q4MzkwX1AwX1RDUik7Ci0Jb3V0Yig0LCBldGhfbmljX2Jhc2UrRDgzOTBfUDBfUkNSKTsJLyogYWxsb3cgYnJvYWRjYXN0IGZyYW1lcyAqLworCW91dGIoMCwgZXRoX25pY19iYXNlK0Q4MzkwX1AwX1RDUik7CS8qIHRyYW5zbWl0dGVyIG9uICovCisJb3V0Yig0LCBldGhfbmljX2Jhc2UrRDgzOTBfUDBfUkNSKTsJLyogYWxsb3cgcnggYnJvYWRjYXN0IGZyYW1lcyAqLworCisJZW5hYmxlX211bHRpY2FzdChldGhfbmljX2Jhc2UpOwogCiAjaWZkZWYJSU5DTFVERV8zQzUwMwogICAgICAgICAvKgpAQCAtMjgxLDcgKzMzMiw3IEBACiAjZW5kaWYKIH0KIAotc3RhdGljIGludCBuczgzOTBfcG9sbChzdHJ1Y3QgbmljICpuaWMpOworc3RhdGljIGludCBuczgzOTBfcG9sbChzdHJ1Y3QgbmljICpuaWMsIGludCByZXRyaWV2ZSk7CiAKICNpZm5kZWYJSU5DTFVERV8zQzUwMwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC0zMjQsNyArMzc1LDcgQEAKIAogCS8qIGNsZWFyIHRoZSBSWCByaW5nLCBhY2tub3dsZWRnZSBvdmVycnVuIGludGVycnVwdCAqLwogCWV0aF9kcmFpbl9yZWNlaXZlciA9IDE7Ci0Jd2hpbGUgKG5zODM5MF9wb2xsKG5pYykpCisJd2hpbGUgKG5zODM5MF9wb2xsKG5pYywgMSkpCiAJCS8qIE5vdGhpbmcgKi87CiAJZXRoX2RyYWluX3JlY2VpdmVyID0gMDsKIAlvdXRiKEQ4MzkwX0lTUl9PVlcsIGV0aF9uaWNfYmFzZStEODM5MF9QMF9JU1IpOwpAQCAtMzQ0LDUwICszOTUsNTQgQEAKIAl1bnNpZ25lZCBpbnQgcywJCQkvKiBzaXplICovCiAJY29uc3QgY2hhciAqcCkJCQkvKiBQYWNrZXQgKi8KIHsKKyNpZiBkZWZpbmVkKElOQ0xVREVfM0M1MDMpIHx8IChkZWZpbmVkKElOQ0xVREVfV0QpICYmICEgZGVmaW5lZChXRF83OTBfUElPKSkKKwlBZGRyZXNzCQlldGhfdm1lbSA9IGJ1c190b192aXJ0KGV0aF9ibWVtKTsKKyNlbmRpZgogI2lmZGVmCUlOQ0xVREVfM0M1MDMKICAgICAgICAgaWYgKCEoZXRoX2ZsYWdzICYgRkxBR19QSU8pKSB7Ci0gICAgICAgICAgICAgICAgbWVtY3B5KChjaGFyICopZXRoX2JtZW0sIGQsIEVUSF9BTEVOKTsJLyogZHN0ICovCi0gICAgICAgICAgICAgICAgbWVtY3B5KChjaGFyICopZXRoX2JtZW0rRVRIX0FMRU4sIG5pYy0+bm9kZV9hZGRyLCBFVEhfQUxFTik7IC8qIHNyYyAqLwotICAgICAgICAgICAgICAgICooKGNoYXIgKilldGhfYm1lbSsxMikgPSB0Pj44OwkJLyogdHlwZSAqLwotICAgICAgICAgICAgICAgICooKGNoYXIgKilldGhfYm1lbSsxMykgPSB0OwotICAgICAgICAgICAgICAgIG1lbWNweSgoY2hhciAqKWV0aF9ibWVtK0VUSF9ITEVOLCBwLCBzKTsKKyAgICAgICAgICAgICAgICBtZW1jcHkoKGNoYXIgKilldGhfdm1lbSwgZCwgRVRIX0FMRU4pOwkvKiBkc3QgKi8KKyAgICAgICAgICAgICAgICBtZW1jcHkoKGNoYXIgKilldGhfdm1lbStFVEhfQUxFTiwgbmljLT5ub2RlX2FkZHIsIEVUSF9BTEVOKTsgLyogc3JjICovCisgICAgICAgICAgICAgICAgKigoY2hhciAqKWV0aF92bWVtKzEyKSA9IHQ+Pjg7CQkvKiB0eXBlICovCisgICAgICAgICAgICAgICAgKigoY2hhciAqKWV0aF92bWVtKzEzKSA9IHQ7CisgICAgICAgICAgICAgICAgbWVtY3B5KChjaGFyICopZXRoX3ZtZW0rRVRIX0hMRU4sIHAsIHMpOwogICAgICAgICAgICAgICAgIHMgKz0gRVRIX0hMRU47Ci0gICAgICAgICAgICAgICAgd2hpbGUgKHMgPCBFVEhfWkxFTikgKigoY2hhciAqKWV0aF9ibWVtKyhzKyspKSA9IDA7CisgICAgICAgICAgICAgICAgd2hpbGUgKHMgPCBFVEhfWkxFTikgKigoY2hhciAqKWV0aF92bWVtKyhzKyspKSA9IDA7CiAgICAgICAgIH0KICNlbmRpZgogCiAjaWZkZWYJSU5DTFVERV9XRAotCS8qIE1lbW9yeSBpbnRlcmZhY2UgKi8KIAlpZiAoZXRoX2ZsYWdzICYgRkxBR18xNkJJVCkgewogCQlvdXRiKGV0aF9sYWFyIHwgV0RfTEFBUl9NMTZFTiwgZXRoX2FzaWNfYmFzZSArIFdEX0xBQVIpOwogCQlpbmIoMHg4NCk7CiAJfQorI2lmbmRlZglXRF83OTBfUElPCisJLyogTWVtb3J5IGludGVyZmFjZSAqLwogCWlmIChldGhfZmxhZ3MgJiBGTEFHXzc5MCkgewogCQlvdXRiKFdEX01TUl9NRU5CLCBldGhfYXNpY19iYXNlICsgV0RfTVNSKTsKIAkJaW5iKDB4ODQpOwogCX0KIAlpbmIoMHg4NCk7Ci0JbWVtY3B5KChjaGFyICopZXRoX2JtZW0sIGQsIEVUSF9BTEVOKTsJLyogZHN0ICovCi0JbWVtY3B5KChjaGFyICopZXRoX2JtZW0rRVRIX0FMRU4sIG5pYy0+bm9kZV9hZGRyLCBFVEhfQUxFTik7IC8qIHNyYyAqLwotCSooKGNoYXIgKilldGhfYm1lbSsxMikgPSB0Pj44OwkJLyogdHlwZSAqLwotCSooKGNoYXIgKilldGhfYm1lbSsxMykgPSB0OwotCW1lbWNweSgoY2hhciAqKWV0aF9ibWVtK0VUSF9ITEVOLCBwLCBzKTsKKwltZW1jcHkoKGNoYXIgKilldGhfdm1lbSwgZCwgRVRIX0FMRU4pOwkvKiBkc3QgKi8KKwltZW1jcHkoKGNoYXIgKilldGhfdm1lbStFVEhfQUxFTiwgbmljLT5ub2RlX2FkZHIsIEVUSF9BTEVOKTsgLyogc3JjICovCisJKigoY2hhciAqKWV0aF92bWVtKzEyKSA9IHQ+Pjg7CQkvKiB0eXBlICovCisJKigoY2hhciAqKWV0aF92bWVtKzEzKSA9IHQ7CisJbWVtY3B5KChjaGFyICopZXRoX3ZtZW0rRVRIX0hMRU4sIHAsIHMpOwogCXMgKz0gRVRIX0hMRU47Ci0Jd2hpbGUgKHMgPCBFVEhfWkxFTikgKigoY2hhciAqKWV0aF9ibWVtKyhzKyspKSA9IDA7CisJd2hpbGUgKHMgPCBFVEhfWkxFTikgKigoY2hhciAqKWV0aF92bWVtKyhzKyspKSA9IDA7CiAJaWYgKGV0aF9mbGFncyAmIEZMQUdfNzkwKSB7CiAJCW91dGIoMCwgZXRoX2FzaWNfYmFzZSArIFdEX01TUik7CiAJCWluYigweDg0KTsKIAl9Ci0JaWYgKGV0aF9mbGFncyAmIEZMQUdfMTZCSVQpIHsKLQkJb3V0YihldGhfbGFhciAmIH5XRF9MQUFSX00xNkVOLCBldGhfYXNpY19iYXNlICsgV0RfTEFBUik7Ci0JCWluYigweDg0KTsKLQl9CisjZWxzZQorCWluYigweDg0KTsKKyNlbmRpZgogI2VuZGlmCiAKICNpZglkZWZpbmVkKElOQ0xVREVfM0M1MDMpCi0JaWYgKGV0aF9mbGFncyAmIEZMQUdfUElPKSB7CisJaWYgKGV0aF9mbGFncyAmIEZMQUdfUElPKQogI2VuZGlmCi0jaWYJZGVmaW5lZChJTkNMVURFX05FKSB8fCBkZWZpbmVkKElOQ0xVREVfTlM4MzkwKSB8fCAoZGVmaW5lZChJTkNMVURFXzNDNTAzKSAmJiAhZGVmaW5lZChUNTAzX1NITUVNKSkKKyNpZglkZWZpbmVkKElOQ0xVREVfTkUpIHx8IGRlZmluZWQoSU5DTFVERV9OUzgzOTApIHx8IChkZWZpbmVkKElOQ0xVREVfM0M1MDMpICYmICFkZWZpbmVkKFQ1MDNfU0hNRU0pKSB8fCAoZGVmaW5lZChJTkNMVURFX1dEKSAmJiBkZWZpbmVkKFdEXzc5MF9QSU8pKQorCXsKIAkJLyogUHJvZ3JhbW1lZCBJL08gKi8KIAkJdW5zaWduZWQgc2hvcnQgdHlwZTsKIAkJdHlwZSA9ICh0ID4+IDgpIHwgKHQgPDwgOCk7CkBAIC0zOTgsMTIgKzQ1MywxNiBAQAogCQlldGhfcGlvX3dyaXRlKHAsIChldGhfdHhfc3RhcnQ8PDgpK0VUSF9ITEVOLCBzKTsKIAkJcyArPSBFVEhfSExFTjsKIAkJaWYgKHMgPCBFVEhfWkxFTikgcyA9IEVUSF9aTEVOOworCX0KICNlbmRpZgogI2lmCWRlZmluZWQoSU5DTFVERV8zQzUwMykKLQl9CiAjZW5kaWYKIAogI2lmZGVmCUlOQ0xVREVfV0QKKwlpZiAoZXRoX2ZsYWdzICYgRkxBR18xNkJJVCkgeworCQlvdXRiKGV0aF9sYWFyICYgfldEX0xBQVJfTTE2RU4sIGV0aF9hc2ljX2Jhc2UgKyBXRF9MQUFSKTsKKwkJaW5iKDB4ODQpOworCX0KIAlpZiAoZXRoX2ZsYWdzICYgRkxBR183OTApCiAJCW91dGIoRDgzOTBfQ09NTUFORF9QUzAgfAogCQkJRDgzOTBfQ09NTUFORF9TVEEsIGV0aF9uaWNfYmFzZStEODM5MF9QMF9DT01NQU5EKTsKQEAgLTQyOCw3ICs0ODcsNyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiBOUzgzOTBfUE9MTCAtIFdhaXQgZm9yIGEgZnJhbWUKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIGludCBuczgzOTBfcG9sbChzdHJ1Y3QgbmljICpuaWMpCitzdGF0aWMgaW50IG5zODM5MF9wb2xsKHN0cnVjdCBuaWMgKm5pYywgaW50IHJldHJpZXZlKQogewogCWludCByZXQgPSAwOwogCXVuc2lnbmVkIGNoYXIgcnN0YXQsIGN1cnIsIG5leHQ7CkBAIC00NTMsMjIgKzUxMiwyNyBAQAogCW91dGIoRDgzOTBfQ09NTUFORF9QUzAsIGV0aF9uaWNfYmFzZStEODM5MF9QMF9DT01NQU5EKTsKIAlpZiAoY3VyciA+PSBldGhfbWVtc2l6ZSkgY3Vycj1ldGhfcnhfc3RhcnQ7CiAJaWYgKGN1cnIgPT0gbmV4dCkgcmV0dXJuKDApOworCisJaWYgKCAhIHJldHJpZXZlICkgcmV0dXJuIDE7CisKICNpZmRlZglJTkNMVURFX1dECiAJaWYgKGV0aF9mbGFncyAmIEZMQUdfMTZCSVQpIHsKIAkJb3V0YihldGhfbGFhciB8IFdEX0xBQVJfTTE2RU4sIGV0aF9hc2ljX2Jhc2UgKyBXRF9MQUFSKTsKIAkJaW5iKDB4ODQpOwogCX0KKyNpZm5kZWYJV0RfNzkwX1BJTwogCWlmIChldGhfZmxhZ3MgJiBGTEFHXzc5MCkgewogCQlvdXRiKFdEX01TUl9NRU5CLCBldGhfYXNpY19iYXNlICsgV0RfTVNSKTsKIAkJaW5iKDB4ODQpOwogCX0KKyNlbmRpZgogCWluYigweDg0KTsKICNlbmRpZgogCXBrdG9mZiA9IG5leHQgPDwgODsKIAlpZiAoZXRoX2ZsYWdzICYgRkxBR19QSU8pCiAJCWV0aF9waW9fcmVhZChwa3RvZmYsIChjaGFyICopJnBrdGhkciwgNCk7CiAJZWxzZQotCQltZW1jcHkoJnBrdGhkciwgKGNoYXIgKilldGhfcm1lbSArIHBrdG9mZiwgNCk7CisJCW1lbWNweSgmcGt0aGRyLCBidXNfdG9fdmlydChldGhfcm1lbSArIHBrdG9mZiksIDQpOwogCXBrdG9mZiArPSBzaXplb2YocGt0aGRyKTsKIAkvKiBpbmNvbWluZyBsZW5ndGggaW5jbHVkZXMgRkNTIHNvIG11c3Qgc3ViIDQgKi8KIAlsZW4gPSBwa3RoZHIubGVuIC0gNDsKQEAgLTQ4Niw3ICs1NTAsNyBAQAogCQkJaWYgKGV0aF9mbGFncyAmIEZMQUdfUElPKQogCQkJCWV0aF9waW9fcmVhZChwa3RvZmYsIHAsIGZyYWcpOwogCQkJZWxzZQotCQkJCW1lbWNweShwLCAoY2hhciAqKWV0aF9ybWVtICsgcGt0b2ZmLCBmcmFnKTsKKwkJCQltZW1jcHkocCwgYnVzX3RvX3ZpcnQoZXRoX3JtZW0gKyBwa3RvZmYpLCBmcmFnKTsKIAkJCXBrdG9mZiA9IGV0aF9yeF9zdGFydCA8PCA4OwogCQkJcCArPSBmcmFnOwogCQkJbGVuIC09IGZyYWc7CkBAIC00OTUsMTQgKzU1OSwxNiBAQAogCQlpZiAoZXRoX2ZsYWdzICYgRkxBR19QSU8pCiAJCQlldGhfcGlvX3JlYWQocGt0b2ZmLCBwLCBsZW4pOwogCQllbHNlCi0JCQltZW1jcHkocCwgKGNoYXIgKilldGhfcm1lbSArIHBrdG9mZiwgbGVuKTsKKwkJCW1lbWNweShwLCBidXNfdG9fdmlydChldGhfcm1lbSArIHBrdG9mZiksIGxlbik7CiAJCXJldCA9IDE7CiAJfQogI2lmZGVmCUlOQ0xVREVfV0QKKyNpZm5kZWYJV0RfNzkwX1BJTwogCWlmIChldGhfZmxhZ3MgJiBGTEFHXzc5MCkgewogCQlvdXRiKDAsIGV0aF9hc2ljX2Jhc2UgKyBXRF9NU1IpOwogCQlpbmIoMHg4NCk7CiAJfQorI2VuZGlmCiAJaWYgKGV0aF9mbGFncyAmIEZMQUdfMTZCSVQpIHsKIAkJb3V0YihldGhfbGFhciAmIH5XRF9MQUFSX00xNkVOLCBldGhfYXNpY19iYXNlICsgV0RfTEFBUik7CiAJCWluYigweDg0KTsKQEAgLTUxOSwzMSArNTg1LDU2IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIE5TODM5MF9ESVNBQkxFIC0gVHVybiBvZmYgYWRhcHRlcgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBuczgzOTBfZGlzYWJsZShzdHJ1Y3QgbmljICpuaWMpCitzdGF0aWMgdm9pZCBuczgzOTBfZGlzYWJsZShzdHJ1Y3QgZGV2ICpkZXYpCiB7CisJc3RydWN0IG5pYyAqbmljID0gKHN0cnVjdCBuaWMgKilkZXY7CisJLyogcmVzZXQgYW5kIGRpc2FibGUgbWVyZ2UgKi8KKwluczgzOTBfcmVzZXQobmljKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitOUzgzOTBfSVJRIC0gRW5hYmxlLCBEaXNhYmxlLCBvciBGb3JjZSBpbnRlcnJ1cHRzCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIG5zODM5MF9pcnEoc3RydWN0IG5pYyAqbmljIF9fdW51c2VkLCBpcnFfYWN0aW9uX3QgYWN0aW9uIF9fdW51c2VkKQoreworICBzd2l0Y2ggKCBhY3Rpb24gKSB7CisgIGNhc2UgRElTQUJMRSA6CisgICAgYnJlYWs7CisgIGNhc2UgRU5BQkxFIDoKKyAgICBicmVhazsKKyAgY2FzZSBGT1JDRSA6CisgICAgYnJlYWs7CisgIH0KIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiBFVEhfUFJPQkUgLSBMb29rIGZvciBhbiBhZGFwdGVyCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KICNpZmRlZglJTkNMVURFX05TODM5MAotc3RydWN0IG5pYyAqZXRoX3Byb2JlKHN0cnVjdCBuaWMgKm5pYywgdW5zaWduZWQgc2hvcnQgKnByb2JlX2FkZHJzLAotCQkgICAgICBzdHJ1Y3QgcGNpX2RldmljZSAqcGNpKQorc3RhdGljIGludCBldGhfcHJvYmUgKHN0cnVjdCBkZXYgKmRldiwgc3RydWN0IHBjaV9kZXZpY2UgKnBjaSkKICNlbHNlCi1zdHJ1Y3QgbmljICpldGhfcHJvYmUoc3RydWN0IG5pYyAqbmljLCB1bnNpZ25lZCBzaG9ydCAqcHJvYmVfYWRkcnMpCitzdGF0aWMgaW50IGV0aF9wcm9iZSAoc3RydWN0IGRldiAqZGV2LCB1bnNpZ25lZCBzaG9ydCAqcHJvYmVfYWRkcnMgX191bnVzZWQpCiAjZW5kaWYKIHsKKwlzdHJ1Y3QgbmljICpuaWMgPSAoc3RydWN0IG5pYyAqKWRldjsKIAlpbnQgaTsKLQlzdHJ1Y3Qgd2RfYm9hcmQgKmJyZDsKLQl1bnNpZ25lZCBzaG9ydCBjaGtzdW07Ci0JdW5zaWduZWQgY2hhciBjOworI2lmZGVmIElOQ0xVREVfTlM4MzkwCisJdW5zaWduZWQgc2hvcnQgcGNpX3Byb2JlX2FkZHJzW10gPSB7IHBjaS0+aW9hZGRyLCAwIH07CisJdW5zaWduZWQgc2hvcnQgKnByb2JlX2FkZHJzID0gcGNpX3Byb2JlX2FkZHJzOworI2VuZGlmCiAJZXRoX3ZlbmRvciA9IFZFTkRPUl9OT05FOwogCWV0aF9kcmFpbl9yZWNlaXZlciA9IDA7CiAKKwluaWMtPmlycW5vICA9IDA7CisKICNpZmRlZglJTkNMVURFX1dECit7CiAJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogCVNlYXJjaCBmb3IgV0QvU01DIGNhcmRzCiAJKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCXN0cnVjdCB3ZF9ib2FyZCAqYnJkOworCXVuc2lnbmVkIHNob3J0IGNoa3N1bTsKKwl1bnNpZ25lZCBjaGFyIGM7CiAJZm9yIChldGhfYXNpY19iYXNlID0gV0RfTE9XX0JBU0U7IGV0aF9hc2ljX2Jhc2UgPD0gV0RfSElHSF9CQVNFOwogCQlldGhfYXNpY19iYXNlICs9IDB4MjApIHsKIAkJY2hrc3VtID0gMDsKQEAgLTU2MCw2ICs2NTEsOSBAQAogCS8qIFdlJ3ZlIGZvdW5kIGEgYm9hcmQgKi8KIAlldGhfdmVuZG9yID0gVkVORE9SX1dEOwogCWV0aF9uaWNfYmFzZSA9IGV0aF9hc2ljX2Jhc2UgKyBXRF9OSUNfQUREUjsKKworCW5pYy0+aW9hZGRyID0gZXRoX25pY19iYXNlOworCiAJYyA9IGluYihldGhfYXNpY19iYXNlK1dEX0JJRCk7CS8qIEdldCBib2FyZCBpZCAqLwogCWZvciAoYnJkID0gd2RfYm9hcmRzOyBicmQtPm5hbWU7IGJyZCsrKQogCQlpZiAoYnJkLT5pZCA9PSBjKSBicmVhazsKQEAgLTU4Miw4ICs2NzYsOSBAQAogCX0gZWxzZQogCQlldGhfYm1lbSA9IFdEX0RFRkFVTFRfTUVNOwogCWlmIChicmQtPmlkID09IFRZUEVfU01DODIxNlQgfHwgYnJkLT5pZCA9PSBUWVBFX1NNQzgyMTZDKSB7Ci0JCSooKHVuc2lnbmVkIGludCAqKShldGhfYm1lbSArIDgxOTIpKSA9ICh1bnNpZ25lZCBpbnQpMDsKLQkJaWYgKCooKHVuc2lnbmVkIGludCAqKShldGhfYm1lbSArIDgxOTIpKSkgeworCQkvKiBmcm9tIExpbnV4IGRyaXZlciwgODQxNkJUIGRldGVjdHMgYXMgODIxNiBzb21ldGltZXMgKi8KKwkJdW5zaWduZWQgaW50IGFkZHIgPSBpbmIoZXRoX2FzaWNfYmFzZSArIDB4Yik7CisJCWlmICgoKGFkZHIgPj4gNCkgJiAzKSA9PSAwKSB7CiAJCQlicmQgKz0gMjsKIAkJCWV0aF9tZW1zaXplID0gYnJkLT5tZW1zaXplOwogCQl9CkBAIC01OTIsMTkgKzY4NywyNyBAQAogCWZvciAoaT0wOyBpPEVUSF9BTEVOOyBpKyspIHsKIAkJbmljLT5ub2RlX2FkZHJbaV0gPSBpbmIoaStldGhfYXNpY19iYXNlK1dEX0xBUik7CiAJfQotCXByaW50ZigiXG4lcyBiYXNlICUjaHgsIG1lbW9yeSAlI2h4LCBhZGRyICUhXG4iLAotCQlicmQtPm5hbWUsIGV0aF9hc2ljX2Jhc2UsIGV0aF9ibWVtLCBuaWMtPm5vZGVfYWRkcik7CisJcHJpbnRmKCJcbiVzIGJhc2UgJSNoeCIsIGJyZC0+bmFtZSwgZXRoX2FzaWNfYmFzZSk7CiAJaWYgKGV0aF9mbGFncyAmIEZMQUdfNzkwKSB7CisjaWZkZWYJV0RfNzkwX1BJTworCQlwcmludGYoIiwgUElPIG1vZGUsIGFkZHIgJSFcbiIsIG5pYy0+bm9kZV9hZGRyKTsKKwkJZXRoX2JtZW0gPSAwOworCQlldGhfZmxhZ3MgfD0gRkxBR19QSU87CQkvKiBmb3JjZSBQSU8gbW9kZSAqLworCQlvdXRiKDAsIGV0aF9hc2ljX2Jhc2UrV0RfTVNSKTsKKyNlbHNlCisJCXByaW50ZigiLCBtZW1vcnkgJSN4LCBhZGRyICUhXG4iLCBldGhfYm1lbSwgbmljLT5ub2RlX2FkZHIpOwogCQlvdXRiKFdEX01TUl9NRU5CLCBldGhfYXNpY19iYXNlK1dEX01TUik7CiAJCW91dGIoKGluYihldGhfYXNpY19iYXNlKzB4MDQpIHwKIAkJCTB4ODApLCBldGhfYXNpY19iYXNlKzB4MDQpOwotCQlvdXRiKCgoKHVuc2lnbmVkKWV0aF9ibWVtID4+IDEzKSAmIDB4MEYpIHwKLQkJCSgoKHVuc2lnbmVkKWV0aF9ibWVtID4+IDExKSAmIDB4NDApIHwKKwkJb3V0YigoKHVuc2lnbmVkKShldGhfYm1lbSA+PiAxMykgJiAweDBGKSB8CisJCQkoKHVuc2lnbmVkKShldGhfYm1lbSA+PiAxMSkgJiAweDQwKSB8CiAJCQkoaW5iKGV0aF9hc2ljX2Jhc2UrMHgwQikgJiAweEIwKSwgZXRoX2FzaWNfYmFzZSsweDBCKTsKIAkJb3V0YigoaW5iKGV0aF9hc2ljX2Jhc2UrMHgwNCkgJgogCQkJfjB4ODApLCBldGhfYXNpY19iYXNlKzB4MDQpOworI2VuZGlmCiAJfSBlbHNlIHsKLQkJb3V0YigoKCh1bnNpZ25lZClldGhfYm1lbSA+PiAxMykgJiAweDNGKSB8IDB4NDAsIGV0aF9hc2ljX2Jhc2UrV0RfTVNSKTsKKwkJcHJpbnRmKCIsIG1lbW9yeSAlI3gsIGFkZHIgJSFcbiIsIGV0aF9ibWVtLCBuaWMtPm5vZGVfYWRkcik7CisJCW91dGIoKCh1bnNpZ25lZCkoZXRoX2JtZW0gPj4gMTMpICYgMHgzRikgfCAweDQwLCBldGhfYXNpY19iYXNlK1dEX01TUik7CiAJfQogCWlmIChldGhfZmxhZ3MgJiBGTEFHXzE2QklUKSB7CiAJCWlmIChldGhfZmxhZ3MgJiBGTEFHXzc5MCkgewpAQCAtNjI0LDggKzcyNywxNCBAQAogCQl9CiAJCWluYigweDg0KTsKIAl9Cit9CiAjZW5kaWYKICNpZmRlZglJTkNMVURFXzNDNTAzCisjaWZkZWYJVDUwM19BVUkKKwluaWMtPmZsYWdzID0gMTsJCS8qIGF1aSAqLworI2Vsc2UKKwluaWMtPmZsYWdzID0gMDsJCS8qIG5vIGF1aSAqLworI2VuZGlmCiAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgICAgICAgU2VhcmNoIGZvciAzQ29tIDNjNTAzIGlmIG5vIFdEL1NNQyBjYXJkcwogICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC03MDgsMTEgKzgxNywxMiBAQAogICAgICAgICAvKiBHZXQgb3VyIGV0aGVybmV0IGFkZHJlc3MgKi8KIAogICAgICAgICAgICAgICAgIG91dGIoXzNDT01fQ1JfRUFMTyB8IF8zQ09NX0NSX1hTRUwsIGV0aF9hc2ljX2Jhc2UgKyBfM0NPTV9DUik7CisJCW5pYy0+aW9hZGRyID0gZXRoX25pY19iYXNlOwogICAgICAgICAgICAgICAgIHByaW50ZigiXG4zQ29tIDNjNTAzIGJhc2UgJSNoeCwgIiwgZXRoX25pY19iYXNlKTsKICAgICAgICAgICAgICAgICBpZiAoZXRoX2ZsYWdzICYgRkxBR19QSU8pCiAJCQlwcmludGYoIlBJTyBtb2RlIik7CiAgICAgICAgICAgICAgICAgZWxzZQotCQkJcHJpbnRmKCJtZW1vcnkgJSNoeCIsIGV0aF9ibWVtKTsKKwkJCXByaW50ZigibWVtb3J5ICUjeCIsIGV0aF9ibWVtKTsKICAgICAgICAgICAgICAgICBmb3IgKGk9MDsgaTxFVEhfQUxFTjsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBuaWMtPm5vZGVfYWRkcltpXSA9IGluYihldGhfbmljX2Jhc2UraSk7CiAgICAgICAgICAgICAgICAgfQpAQCAtNzM0LDkgKzg0NCw5IEBACiAgICAgICAgICAqLwogCiAJCWlmICghKGV0aF9mbGFncyAmIEZMQUdfUElPKSkgewotCQkJbWVtc2V0KChjaGFyICopZXRoX2JtZW0sIDAsIDB4MjAwMCk7CisJCQltZW1zZXQoYnVzX3RvX3ZpcnQoZXRoX2JtZW0pLCAwLCAweDIwMDApOwogCQkJZm9yKGkgPSAwOyBpIDwgMHgyMDAwOyArK2kpCi0JCQkJaWYgKCooKChjaGFyICopZXRoX2JtZW0pK2kpKSB7CisJCQkJaWYgKCooKGNoYXIgKikoYnVzX3RvX3ZpcnQoZXRoX2JtZW0raSkpKSkgewogCQkJCQlwcmludGYgKCJGYWlsZWQgdG8gY2xlYXIgM2M1MDMgc2hhcmVkIG1lbS5cbiIpOwogCQkJCQlyZXR1cm4gKDApOwogCQkJCX0KQEAgLTc0OSw5ICs4NTksMTEgQEAKICAgICAgICAgfQogI2VuZGlmCiAjaWYJZGVmaW5lZChJTkNMVURFX05FKSB8fCBkZWZpbmVkKElOQ0xVREVfTlM4MzkwKQorewogCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIAlTZWFyY2ggZm9yIE5FMTAwMC8yMDAwIGlmIG5vIFdEL1NNQyBvciAzY29tIGNhcmRzCiAJKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCXVuc2lnbmVkIGNoYXIgYzsKIAlpZiAoZXRoX3ZlbmRvciA9PSBWRU5ET1JfTk9ORSkgewogCQljaGFyIHJvbWRhdGFbMTZdLCB0ZXN0YnVmWzMyXTsKIAkJaW50IGlkeDsKQEAgLTgxMCwyMyArOTIyLDk0IEBACiAJCWZvciAoaT0wOyBpPEVUSF9BTEVOOyBpKyspIHsKIAkJCW5pYy0+bm9kZV9hZGRyW2ldID0gcm9tZGF0YVtpICsgKChldGhfZmxhZ3MgJiBGTEFHXzE2QklUKSA/IGkgOiAwKV07CiAJCX0KKwkJbmljLT5pb2FkZHIgPSBldGhfbmljX2Jhc2U7CiAJCXByaW50ZigiXG5ORSVjMDAwIGJhc2UgJSNoeCwgYWRkciAlIVxuIiwKIAkJCShldGhfZmxhZ3MgJiBGTEFHXzE2QklUKSA/ICcyJyA6ICcxJywgZXRoX25pY19iYXNlLAogCQkJbmljLT5ub2RlX2FkZHIpOwogCX0KK30KICNlbmRpZgogCWlmIChldGhfdmVuZG9yID09IFZFTkRPUl9OT05FKQogCQlyZXR1cm4oMCk7CiAgICAgICAgIGlmIChldGhfdmVuZG9yICE9IFZFTkRPUl8zQ09NKQogCQlldGhfcm1lbSA9IGV0aF9ibWVtOwogCW5zODM5MF9yZXNldChuaWMpOwotCW5pYy0+cmVzZXQgPSBuczgzOTBfcmVzZXQ7Ci0JbmljLT5wb2xsID0gbnM4MzkwX3BvbGw7CisKKwlkZXYtPmRpc2FibGUgID0gbnM4MzkwX2Rpc2FibGU7IAorCW5pYy0+cG9sbCAgICAgPSBuczgzOTBfcG9sbDsKIAluaWMtPnRyYW5zbWl0ID0gbnM4MzkwX3RyYW5zbWl0OwotCW5pYy0+ZGlzYWJsZSA9IG5zODM5MF9kaXNhYmxlOwotCXJldHVybihuaWMpOworCW5pYy0+aXJxICAgICAgPSBuczgzOTBfaXJxOworCisgICAgICAgIC8qIEJhc2VkIG9uIFBuUCBJU0EgbWFwICovCisjaWZkZWYJSU5DTFVERV9XRAorICAgICAgICBkZXYtPmRldmlkLnZlbmRvcl9pZCA9IGh0b25zKEdFTkVSSUNfSVNBUE5QX1ZFTkRPUik7CisgICAgICAgIGRldi0+ZGV2aWQuZGV2aWNlX2lkID0gaHRvbnMoMHg4MTJhKTsKKyNlbmRpZgorI2lmZGVmCUlOQ0xVREVfM0M1MDMKKyAgICAgICAgZGV2LT5kZXZpZC52ZW5kb3JfaWQgPSBodG9ucyhHRU5FUklDX0lTQVBOUF9WRU5ET1IpOworICAgICAgICBkZXYtPmRldmlkLmRldmljZV9pZCA9IGh0b25zKDB4ODBmMyk7CisjZW5kaWYKKyNpZmRlZglJTkNMVURFX05FCisgICAgICAgIGRldi0+ZGV2aWQudmVuZG9yX2lkID0gaHRvbnMoR0VORVJJQ19JU0FQTlBfVkVORE9SKTsKKyAgICAgICAgZGV2LT5kZXZpZC5kZXZpY2VfaWQgPSBodG9ucygweDgwZDYpOworI2VuZGlmCisJcmV0dXJuIDE7CiB9CiAKKyNpZmRlZglJTkNMVURFX1dECitzdGF0aWMgc3RydWN0IGlzYV9kcml2ZXIgd2RfZHJpdmVyIF9faXNhX2RyaXZlciA9IHsKKwkudHlwZSAgICA9IE5JQ19EUklWRVIsCisJLm5hbWUgICAgPSAiV0QiLAorCS5wcm9iZSAgID0gd2RfcHJvYmUsCisJLmlvYWRkcnMgPSAwLCAKK307CisjZW5kaWYKKworI2lmZGVmCUlOQ0xVREVfM0M1MDMKK3N0YXRpYyBzdHJ1Y3QgaXNhX2RyaXZlciB0NTAzX2RyaXZlciBfX2lzYV9kcml2ZXIgPSB7CisJLnR5cGUgICAgPSBOSUNfRFJJVkVSLAorCS5uYW1lICAgID0gIjNDNTAzIiwKKwkucHJvYmUgICA9IHQ1MDNfcHJvYmUsCisJLmlvYWRkcnMgPSAwLCAKK307CisjZW5kaWYKKworI2lmZGVmCUlOQ0xVREVfTkUKK3N0YXRpYyBzdHJ1Y3QgaXNhX2RyaXZlciBuZV9kcml2ZXIgX19pc2FfZHJpdmVyID0geworCS50eXBlICAgID0gTklDX0RSSVZFUiwKKwkubmFtZSAgICA9ICJORSowMDAiLAorCS5wcm9iZSAgID0gbmVfcHJvYmUsCisJLmlvYWRkcnMgPSAwLCAKK307CisjZW5kaWYKKworI2lmZGVmCUlOQ0xVREVfTlM4MzkwCitzdGF0aWMgc3RydWN0IHBjaV9pZCBuZXBjaV9uaWNzW10gPSB7CisvKiBBIGZldyBORTIwMDAgUENJIGNsb25lcywgbGlzdCBub3QgZXhoYXVzdGl2ZSAqLworUENJX1JPTSgweDEwZWMsIDB4ODAyOSwgInJ0bDgwMjkiLCAgICAgICJSZWFsdGVrIDgwMjkiKSwKK1BDSV9ST00oMHgxMTg2LCAweDAzMDAsICJkbGluay01MjgiLCAgICAiRC1MaW5rIERFLTUyOCIpLAorUENJX1JPTSgweDEwNTAsIDB4MDk0MCwgIndpbmJvbmQ5NDAiLCAgICJXaW5ib25kIE5FMjAwMC1QQ0kiKSwJCS8qIFdpbmJvbmQgODZDOTQwIC8gODlDOTQwICovCitQQ0lfUk9NKDB4MTA1MCwgMHg1YTVhLCAid2luYm9uZDk0MGYiLCAgIldpbmJvbmQgVzg5Yzk0MEYiKSwJCS8qIFdpbmJvbmQgODlDOTQwRiAqLworUENJX1JPTSgweDExZjYsIDB4MTQwMSwgImNvbXBleHJsMjAwMCIsICJDb21wZXggUmVhZHlMaW5rIDIwMDAiKSwKK1BDSV9ST00oMHg4ZTJlLCAweDMwMDAsICJrdGlldDMycDIiLCAgICAiS1RJIEVUMzJQMiIpLAorUENJX1JPTSgweDRhMTQsIDB4NTAwMCwgIm52NTAwMHNjIiwgICAgICJOZXRWaW4gTlY1MDAwU0MiKSwKK1BDSV9ST00oMHgxMmMzLCAweDAwNTgsICJob2x0ZWs4MDIzMiIsICAiSG9sdGVrIEhUODAyMzIiKSwKK1BDSV9ST00oMHgxMmMzLCAweDU1OTgsICJob2x0ZWs4MDIyOSIsICAiSG9sdGVrIEhUODAyMjkiKSwKK1BDSV9ST00oMHgxMGJkLCAweDBlMzQsICJzdXJlY29tLW5lMzQiLCAiU3VyZWNvbSBORTM0IiksCitQQ0lfUk9NKDB4MTEwNiwgMHgwOTI2LCAidmlhODZjOTI2IiwgICAgIlZpYSA4NmM5MjYiKSwKK307CisKK3N0cnVjdCBwY2lfZHJpdmVyIG5lcGNpX2RyaXZlciA9IHsKKwkudHlwZSAgICAgPSBOSUNfRFJJVkVSLAorCS5uYW1lICAgICA9ICJORTIwMDAvUENJIiwKKwkucHJvYmUgICAgPSBuZXBjaV9wcm9iZSwKKwkuaWRzICAgICAgPSBuZXBjaV9uaWNzLAorCS5pZF9jb3VudCA9IHNpemVvZihuZXBjaV9uaWNzKS9zaXplb2YobmVwY2lfbmljc1swXSksCisJLmNsYXNzICAgID0gMCwKK307CisKKyNlbmRpZiAvKiBJTkNMVURFX05TODM5MCAqLworCiAvKgogICogTG9jYWwgdmFyaWFibGVzOgogICogIGMtYmFzaWMtb2Zmc2V0OiA4CmRpZmYgLU5hdXIgZ3J1Yi0wLjk3Lm9yaWcvbmV0Ym9vdC9vc2RlcC5oIGdydWItMC45Ny9uZXRib290L29zZGVwLmgKLS0tIGdydWItMC45Ny5vcmlnL25ldGJvb3Qvb3NkZXAuaAkyMDAzLTA3LTA5IDExOjQ1OjM4LjAwMDAwMDAwMCArMDAwMAorKysgZ3J1Yi0wLjk3L25ldGJvb3Qvb3NkZXAuaAkyMDA1LTA4LTMxIDE5OjAzOjM1LjAwMDAwMDAwMCArMDAwMApAQCAtMSw5NCArMSwxOCBAQAotI2lmbmRlZglfX09TREVQX0hfXwotI2RlZmluZSBfX09TREVQX0hfXworI2lmbmRlZglfT1NERVBfSAorI2RlZmluZSBfT1NERVBfSAogCi0vKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQKLSAqIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqLworI2RlZmluZSBfX3VudXNlZCBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKQorI2RlZmluZSBfX2FsaWduZWQgX19hdHRyaWJ1dGVfXygoYWxpZ25lZCgxNikpKQogCi0jZGVmaW5lCV9fTElUVExFX0VORElBTgkJLyogeDg2ICovCi0KLS8qIFRha2VuIGZyb20gL3Vzci9pbmNsdWRlL2xpbnV4L2hmc19zeXNkZXAuaCAqLwotI2lmIGRlZmluZWQoX19CSUdfRU5ESUFOKQotIwlpZiAhZGVmaW5lZChfX2NvbnN0YW50X2h0b25sKQotIwkJZGVmaW5lIF9fY29uc3RhbnRfaHRvbmwoeCkgKHgpCi0jCWVuZGlmCi0jCWlmICFkZWZpbmVkKF9fY29uc3RhbnRfaHRvbnMpCi0jCQlkZWZpbmUgX19jb25zdGFudF9odG9ucyh4KSAoeCkKLSMJZW5kaWYKLSNlbGlmIGRlZmluZWQoX19MSVRUTEVfRU5ESUFOKQotIwlpZiAhZGVmaW5lZChfX2NvbnN0YW50X2h0b25sKQotIwkJZGVmaW5lIF9fY29uc3RhbnRfaHRvbmwoeCkgXAotICAgICAgICAoKHVuc2lnbmVkIGxvbmcgaW50KSgoKCh1bnNpZ25lZCBsb25nIGludCkoeCkgJiAweDAwMDAwMGZmVSkgPDwgMjQpIHwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKCh1bnNpZ25lZCBsb25nIGludCkoeCkgJiAweDAwMDBmZjAwVSkgPDwgIDgpIHwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKCh1bnNpZ25lZCBsb25nIGludCkoeCkgJiAweDAwZmYwMDAwVSkgPj4gIDgpIHwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKCh1bnNpZ25lZCBsb25nIGludCkoeCkgJiAweGZmMDAwMDAwVSkgPj4gMjQpKSkKLSMJZW5kaWYKLSMJaWYgIWRlZmluZWQoX19jb25zdGFudF9odG9ucykKLSMJCWRlZmluZSBfX2NvbnN0YW50X2h0b25zKHgpIFwKLSAgICAgICAgKCh1bnNpZ25lZCBzaG9ydCBpbnQpKCgoKHVuc2lnbmVkIHNob3J0IGludCkoeCkgJiAweDAwZmYpIDw8IDgpIHwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgodW5zaWduZWQgc2hvcnQgaW50KSh4KSAmIDB4ZmYwMCkgPj4gOCkpKQotIwllbmRpZgotI2Vsc2UKLSMJZXJyb3IgIkRvbid0IGtub3cgaWYgYnl0ZXMgYXJlIGJpZy0gb3IgbGl0dGxlLWVuZGlhbiEiCi0jZW5kaWYKLQotI2RlZmluZSBudG9obCh4KSBcCi0oX19idWlsdGluX2NvbnN0YW50X3AoeCkgPyBcCi0gX19jb25zdGFudF9odG9ubCgoeCkpIDogXAotIF9fc3dhcDMyKHgpKQotI2RlZmluZSBodG9ubCh4KSBcCi0oX19idWlsdGluX2NvbnN0YW50X3AoeCkgPyBcCi0gX19jb25zdGFudF9odG9ubCgoeCkpIDogXAotIF9fc3dhcDMyKHgpKQotI2RlZmluZSBudG9ocyh4KSBcCi0oX19idWlsdGluX2NvbnN0YW50X3AoeCkgPyBcCi0gX19jb25zdGFudF9odG9ucygoeCkpIDogXAotIF9fc3dhcDE2KHgpKQotI2RlZmluZSBodG9ucyh4KSBcCi0oX19idWlsdGluX2NvbnN0YW50X3AoeCkgPyBcCi0gX19jb25zdGFudF9odG9ucygoeCkpIDogXAotIF9fc3dhcDE2KHgpKQotCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgaW50IF9fc3dhcDMyKHVuc2lnbmVkIGxvbmcgaW50IHgpCi17Ci0JX19hc21fXygieGNoZ2IgJWIwLCVoMFxuXHQiCi0JCSJyb3JsICQxNiwlMFxuXHQiCi0JCSJ4Y2hnYiAlYjAsJWgwIgotCQk6ICI9cSIgKHgpCi0JCTogIjAiICh4KSk7Ci0JcmV0dXJuIHg7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgc2hvcnQgaW50IF9fc3dhcDE2KHVuc2lnbmVkIHNob3J0IGludCB4KQotewotCV9fYXNtX18oInhjaGdiICViMCwlaDAiCi0JCTogIj1xIiAoeCkKLQkJOiAiMCIgKHgpKTsKLQlyZXR1cm4geDsKLX0KLQotLyogTWFrZSByb3V0aW5lcyBhdmFpbGFibGUgdG8gYWxsICovCi0jZGVmaW5lCXN3YXAzMih4KQlfX3N3YXAzMih4KQotI2RlZmluZQlzd2FwMTYoeCkJX19zd2FwMTYoeCkKLQotI2luY2x1ZGUgImxpbnV4LWFzbS1pby5oIgotCi10eXBlZGVmCXVuc2lnbmVkIGxvbmcgQWRkcmVzczsKKyNpbmNsdWRlICJpby5oIgorI2luY2x1ZGUgImJ5dGVzd2FwLmgiCisjaW5jbHVkZSAibGF0Y2guaCIKIAogLyogQU5TSSBwcm90b3R5cGluZyBtYWNybyAqLwogI2lmZGVmCV9fU1REQ19fCi0jZGVmaW5lCVAoeCkJeAorIyAgZGVmaW5lCVAoeCkJeAogI2Vsc2UKLSNkZWZpbmUJUCh4KQkoKQorIyAgZGVmaW5lCVAoeCkJKCkKICNlbmRpZgogCiAjZW5kaWYKLQotLyoKLSAqIExvY2FsIHZhcmlhYmxlczoKLSAqICBjLWJhc2ljLW9mZnNldDogOAotICogRW5kOgotICovCmRpZmYgLU5hdXIgZ3J1Yi0wLjk3Lm9yaWcvbmV0Ym9vdC9vdHVsaXAuYyBncnViLTAuOTcvbmV0Ym9vdC9vdHVsaXAuYwotLS0gZ3J1Yi0wLjk3Lm9yaWcvbmV0Ym9vdC9vdHVsaXAuYwkyMDAzLTA3LTA5IDExOjQ1OjM4LjAwMDAwMDAwMCArMDAwMAorKysgZ3J1Yi0wLjk3L25ldGJvb3Qvb3R1bGlwLmMJMTk3MC0wMS0wMSAwMDowMDowMC4wMDAwMDAwMDAgKzAwMDAKQEAgLTEsMzc0ICswLDAgQEAKLS8qCi0gIEV0aGVyYm9vdCBERUMgVHVsaXAgZHJpdmVyCi0gIGFkYXB0ZWQgYnkgS2VuIFlhcCBmcm9tCi0KLSAgRnJlZUJTRCBuZXRib290IERFQyAyMTE0MyBkcml2ZXIKLQotICBBdXRob3I6IERhdmlkIFNoYXJwCi0gICAgZGF0ZTogTm92Lzk4Ci0KLSBLbm93biB0byB3b3JrIG9uIERFQyBERTUwMCB1c2luZyAyMTE0My1QQyBjaGlwc2V0LgotIEV2ZW4gb24gY2FyZHMgd2l0aCB0aGUgc2FtZSBjaGlwc2V0IHRoZXJlIGNhbiBiZQotIGluY29tcGF0YWJsaXR5IHByb2JsZW1zIHdpdGggdGhlIHdheSBtZWRpYSBzZWxlY3Rpb24KLSBhbmQgc3RhdHVzIExFRCBzZXR0aW5ncyBhcmUgZG9uZS4gIFNlZSBjb21tZW50cyBiZWxvdy4KLQotIFNvbWUgY29kZSBmcmFnbWVudHMgd2VyZSB0YWtlbiBmcm9tIHZlcmlvdXMgcGxhY2VzLAotIEtlbiBZYXAncyBldGhlcmJvb3QsIEZyZWVCU0QncyBpZl9kZS5jLCBhbmQgdmFyaW91cwotIExpbnV4IHJlbGF0ZWQgZmlsZXMuICBERUMncyBtYW51YWxzIGZvciB0aGUgMjExNDMgYW5kCi0gU1JPTSBmb3JtYXQgd2VyZSB2ZXJ5IGhlbHBmdWwuICBUaGUgTGludXggZGUgZHJpdmVyCi0gZGV2ZWxvcG1lbnQgcGFnZSBoYXMgYSBudW1iZXIgb2YgbGlua3MgdG8gdXNlZnVsCi0gcmVsYXRlZCBpbmZvcm1hdGlvbi4gIEhhdmUgYSBsb29rIGF0OgotIGZ0cDovL2Nlc2Rpcy5nc2ZjLm5hc2EuZ292L3B1Yi9saW51eC9kcml2ZXJzL3R1bGlwLWRldmVsLmh0bWwKLQotKi8KLQotI2luY2x1ZGUgImV0aGVyYm9vdC5oIgotI2luY2x1ZGUgIm5pYy5oIgotI2luY2x1ZGUgInBjaS5oIgotI2luY2x1ZGUgImNhcmRzLmgiCi0jaW5jbHVkZSAib3R1bGlwLmgiCi0KLXN0YXRpYyB1bnNpZ25lZCBzaG9ydCB2ZW5kb3IsIGRldl9pZDsKLXN0YXRpYyB1bnNpZ25lZCBzaG9ydCBpb2FkZHI7Ci1zdGF0aWMgdW5zaWduZWQgaW50ICptZW1iYXNlOwotc3RhdGljIHVuc2lnbmVkIGNoYXIgc3JvbVsxMDI0XTsKLQotI2RlZmluZSBCVUZMRU4gMTUzNiAgICAgLyogbXVzdCBiZSBsb25nd29yZCBkaXZpc2FibGUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIGJ1ZmZlcnMgbXVzdCBiZSBsb25nd29yZCBhbGlnbmVkICovCi0KLS8qIHRyYW5zbWl0IGRlc2NyaXB0b3IgYW5kIGJ1ZmZlciAqLwotc3RhdGljIHN0cnVjdCB0eGRlc2MgdHhkOwotCi0vKiByZWNlaXZlIGRlc2NyaXB0b3IocykgYW5kIGJ1ZmZlcihzKSAqLwotI2RlZmluZSBOUlhEIDQKLXN0YXRpYyBzdHJ1Y3QgcnhkZXNjIHJ4ZFtOUlhEXTsKLXN0YXRpYyBpbnQgcnhkX3RhaWwgPSAwOwotI2lmZGVmCVVTRV9MT1dNRU1fQlVGRkVSCi0jZGVmaW5lIHJ4YiAoKGNoYXIgKikweDEwMDAwIC0gTlJYRCAqIEJVRkxFTikKLSNkZWZpbmUgdHhiICgoY2hhciAqKTB4MTAwMDAgLSBOUlhEICogQlVGTEVOIC0gQlVGTEVOKQotI2Vsc2UKLXN0YXRpYyB1bnNpZ25lZCBjaGFyIHJ4YltOUlhEICogQlVGTEVOXTsKLXN0YXRpYyB1bnNpZ25lZCBjaGFyIHR4YltCVUZMRU5dOwotI2VuZGlmCi0KLXN0YXRpYyB1bnNpZ25lZCBjaGFyIGVoZHJbRVRIX0hMRU5dOyAgICAvKiBidWZmZXIgZm9yIGV0aGVybmV0IGhlYWRlciAqLwotCi1lbnVtIHR1bGlwX29mZnNldHMgewotICAgICAgICBDU1IwPTAsICAgIENTUjE9MHgwOCwgQ1NSMj0weDEwLCBDU1IzPTB4MTgsIENTUjQ9MHgyMCwgQ1NSNT0weDI4LAotICAgICAgICBDU1I2PTB4MzAsIENTUjc9MHgzOCwgQ1NSOD0weDQwLCBDU1I5PTB4NDgsIENTUjEwPTB4NTAsIENTUjExPTB4NTgsCi0gICAgICAgIENTUjEyPTB4NjAsIENTUjEzPTB4NjgsIENTUjE0PTB4NzAsIENTUjE1PTB4NzggfTsKLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogMjExNDMgc3BlY2lmaWMgc3R1ZmYgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiBYWFggYXNzdW1lIDMzTUh6IFBDSSBidXMsICB0aGlzIGlzIG5vdCB2ZXJ5IGFjY3VyYXRlIGFuZCBzaG91bGQgYmUKLSAgIHVzZWQgb25seSB3aXRoIGdyb3NzIG92ZXIgZXN0aW1hdGlvbnMgb2YgcmVxdWlyZWQgZGVsYXkgdGltZXMgdW5sZXNzCi0gICB5b3UgdHVuZSBVQURKVVNUIHRvIHlvdXIgc3BlY2lmaWMgcHJvY2Vzc29yIGFuZCBJL08gc3Vic3lzdGVtICovCi0KLSNkZWZpbmUgVUFESlVTVCA4NzAKLXN0YXRpYyB2b2lkIHVkZWxheSh1bnNpZ25lZCBsb25nIHVzZWMpIHsKLSAgdW5zaWduZWQgbG9uZyBpOwotICBmb3IgKGk9KCh1c2VjKlVBREpVU1QpLzMzKSsxOyBpPjA7IGktLSkgKHZvaWQpIFRVTElQX0NTUl9SRUFEKGNzcl8wKTsKLX0KLQotLyogVGhlIGZvbGxvd2luZyBzcm9tIHJlbGF0ZWQgY29kZSB3YXMgdGFrZW4gZnJvbSBGcmVlQlNEJ3MgaWZfZGUuYyAqLwotLyogd2l0aCBtaW5vciBhbHRlcmF0aW9ucyB0byBtYWtlIGl0IHdvcmsgaGVyZS4gIHRoZSBMaW51eCBjb2RlIGlzICovCi0vKiBiZXR0ZXIgYnV0IHRoaXMgd2FzIGVhc2llciB0byB1c2UgKi8KLQotc3RhdGljIHZvaWQgZGVsYXlfMzAwbnModm9pZCkKLXsKLSAgICBpbnQgaWR4OwotICAgIGZvciAoaWR4ID0gKDMwMCAvIDMzKSArIDE7IGlkeCA+IDA7IGlkeC0tKQotICAgICAgICAodm9pZCkgVFVMSVBfQ1NSX1JFQUQoY3NyX2J1c21vZGUpOwotfQotCi0jZGVmaW5lIEVNSVQgZG8geyBUVUxJUF9DU1JfV1JJVEUoY3NyX3Nyb21fbWlpLCBjc3IpOyBkZWxheV8zMDBucygpOyB9IHdoaWxlICgwKQotCi1zdGF0aWMgdm9pZCBzcm9tX2lkbGUodm9pZCkKLXsKLSAgICB1bnNpZ25lZCBiaXQsIGNzcjsKLQotICAgIGNzciAgPSBTUk9NU0VMIDsgRU1JVDsKLSAgICBjc3IgID0gU1JPTVNFTCB8IFNST01SRDsgRU1JVDsKLSAgICBjc3IgXj0gU1JPTUNTOyBFTUlUOwotICAgIGNzciBePSBTUk9NQ0xLT047IEVNSVQ7Ci0gICAgLyoKLSAgICAgKiBXcml0ZSAyNSBjeWNsZXMgb2YgMCB3aGljaCB3aWxsIGZvcmNlIHRoZSBTUk9NIHRvIGJlIGlkbGUuCi0gICAgICovCi0gICAgZm9yIChiaXQgPSAzICsgU1JPTV9CSVRXSURUSCArIDE2OyBiaXQgPiAwOyBiaXQtLSkgewotICAgICAgICBjc3IgXj0gU1JPTUNMS09GRjsgRU1JVDsgICAgLyogY2xvY2sgbG93OyBkYXRhIG5vdCB2YWxpZCAqLwotICAgICAgICBjc3IgXj0gU1JPTUNMS09OOyBFTUlUOyAgICAgLyogY2xvY2sgaGlnaDsgZGF0YSB2YWxpZCAqLwotICAgIH0KLSAgICBjc3IgXj0gU1JPTUNMS09GRjsgRU1JVDsKLSAgICBjc3IgXj0gU1JPTUNTOyBFTUlUOwotICAgIGNzciAgPSAwOyBFTUlUOwotfQotCi1zdGF0aWMgdm9pZCBzcm9tX3JlYWQodm9pZCkKLXsKLSAgICB1bnNpZ25lZCBpZHg7Ci0gICAgY29uc3QgdW5zaWduZWQgYml0d2lkdGggPSBTUk9NX0JJVFdJRFRIOwotICAgIGNvbnN0IHVuc2lnbmVkIGNtZG1hc2sgPSAoU1JPTUNNRF9SRCA8PCBiaXR3aWR0aCk7Ci0gICAgY29uc3QgdW5zaWduZWQgbXNiID0gMSA8PCAoYml0d2lkdGggKyAzIC0gMSk7Ci0gICAgdW5zaWduZWQgbGFzdGlkeCA9ICgxIDw8IGJpdHdpZHRoKSAtIDE7Ci0KLSAgICBzcm9tX2lkbGUoKTsKLQotICAgIGZvciAoaWR4ID0gMDsgaWR4IDw9IGxhc3RpZHg7IGlkeCsrKSB7Ci0gICAgICAgIHVuc2lnbmVkIGxhc3RiaXQsIGRhdGEsIGJpdHMsIGJpdCwgY3NyOwotICAgICAgICBjc3IgID0gU1JPTVNFTCA7ICAgICAgICAgICAgICAgIEVNSVQ7Ci0gICAgICAgIGNzciAgPSBTUk9NU0VMIHwgU1JPTVJEOyAgICAgICAgRU1JVDsKLSAgICAgICAgY3NyIF49IFNST01DU09OOyAgICAgICAgICAgICAgICBFTUlUOwotICAgICAgICBjc3IgXj0gICAgICAgICAgICBTUk9NQ0xLT047ICAgIEVNSVQ7Ci0KLSAgICAgICAgbGFzdGJpdCA9IDA7Ci0gICAgICAgIGZvciAoYml0cyA9IGlkeHxjbWRtYXNrLCBiaXQgPSBiaXR3aWR0aCArIDM7IGJpdCA+IDA7IGJpdC0tLCBiaXRzIDw8PSAxKQotIHsKLSAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIHRoaXNiaXQgPSBiaXRzICYgbXNiOwotICAgICAgICAgICAgY3NyIF49IFNST01DTEtPRkY7IEVNSVQ7ICAgIC8qIGNsb2NrIGxvdzsgZGF0YSBub3QgdmFsaWQgKi8KLSAgICAgICAgICAgIGlmICh0aGlzYml0ICE9IGxhc3RiaXQpIHsKLSAgICAgICAgICAgICAgICBjc3IgXj0gU1JPTURPVVQ7IEVNSVQ7ICAvKiBjbG9jayBsb3c7IGludmVydCBkYXRhICovCi0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIEVNSVQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjc3IgXj0gU1JPTUNMS09OOyBFTUlUOyAgICAgLyogY2xvY2sgaGlnaDsgZGF0YSB2YWxpZCAqLwotICAgICAgICAgICAgbGFzdGJpdCA9IHRoaXNiaXQ7Ci0gICAgICAgIH0KLSAgICAgICAgY3NyIF49IFNST01DTEtPRkY7IEVNSVQ7Ci0KLSAgICAgICAgZm9yIChkYXRhID0gMCwgYml0cyA9IDA7IGJpdHMgPCAxNjsgYml0cysrKSB7Ci0gICAgICAgICAgICBkYXRhIDw8PSAxOwotICAgICAgICAgICAgY3NyIF49IFNST01DTEtPTjsgRU1JVDsgICAgIC8qIGNsb2NrIGhpZ2g7IGRhdGEgdmFsaWQgKi8KLSAgICAgICAgICAgIGRhdGEgfD0gVFVMSVBfQ1NSX1JFQUQoY3NyX3Nyb21fbWlpKSAmIFNST01ESU4gPyAxIDogMDsKLSAgICAgICAgICAgIGNzciBePSBTUk9NQ0xLT0ZGOyBFTUlUOyAgICAvKiBjbG9jayBsb3c7IGRhdGEgbm90IHZhbGlkICovCi0gICAgICAgIH0KLSAgICAgICAgc3JvbVtpZHgqMl0gPSBkYXRhICYgMHhGRjsKLSAgICAgICAgc3JvbVtpZHgqMisxXSA9IGRhdGEgPj4gODsKLSAgICAgICAgY3NyICA9IFNST01TRUwgfCBTUk9NUkQ7IEVNSVQ7Ci0gICAgICAgIGNzciAgPSAwOyBFTUlUOwotICAgIH0KLSAgICBzcm9tX2lkbGUoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1FVEhfUkVTRVQgLSBSZXNldCBhZGFwdGVyCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCB0dWxpcF9yZXNldChzdHJ1Y3QgbmljICpuaWMpCi17Ci0gICAgICAgIGludCB4LGNudD0yOwotCi0gICAgICAgIG91dGwoMHgwMDAwMDAwMSwgaW9hZGRyICsgQ1NSMCk7Ci0gICAgICAgIHVkZWxheSgxMDAwKTsKLSAgICAgICAgLyogdHVybiBvZmYgcmVzZXQgYW5kIHNldCBjYWNoZSBhbGlnbj0xNmx3b3JkLCBidXJzdD11bmxpbWl0ICovCi0gICAgICAgIG91dGwoMHgwMUEwODAwMCwgaW9hZGRyICsgQ1NSMCk7Ci0KLQkvKiBmb3Igc29tZSByZWFzb24gdGhlIG1lZGlhIHNlbGVjdGlvbiBkb2VzIG5vdCB0YWtlCi0gICAgICAgICAgIHRoZSBmaXJzdCB0aW1lIHNlIGl0IGlzIHJlcGVhdGVkLiAgKi8KLQotICAgICAgICB3aGlsZShjbnQtLSkgewotICAgICAgICAvKiBzdG9wIFRYLFJYIHByb2Nlc3NlcyAqLwotICAgICAgICBpZiAoY250ID09IDEpCi0JCW91dGwoMHgzMjQwNDAwMCwgaW9hZGRyICsgQ1NSNik7Ci0gICAgICAgIGVsc2UKLQkJb3V0bCgweDMyMDAwMDQwLCBpb2FkZHIgKyBDU1I2KTsKLQotICAgICAgICAvKiBYWFggLSBtZWRpYSBzZWxlY3Rpb24gaXMgdmVuZG9yIHNwZWNpZmljIGFuZCBoYXJkIGNvZGVkIHJpZ2h0Ci0gICAgICAgICAgIGhlcmUuICBUaGlzIHNob3VsZCBiZSBmaXhlZCB0byB1c2UgdGhlIGhpbnRzIGluIHRoZSBTUk9NIGFuZAotICAgICAgICAgICBhbGxvdyBtZWRpYSBzZWxlY3Rpb24gYnkgdGhlIHVzZXIgYXQgcnVudGltZS4gIE1JSSBzdXBwb3J0Ci0gICAgICAgICAgIHNob3VsZCBhbHNvIGJlIGFkZGVkLiAgU3VwcG9ydCBmb3IgY2hpcHMgb3RoZXIgdGhhbiB0aGUKLSAgICAgICAgICAgMjExNDMgc2hvdWxkIGJlIGFkZGVkIGhlcmUgYXMgd2VsbCAgKi8KLQotICAgICAgICAvKiBzdGFydCAgc2V0IHRvIDEwTWJwcyBoYWxmLWR1cGxleCAqLwotCi0gICAgICAgIC8qIHNldHVwIFNJQSAqLwotICAgICAgICBvdXRsKDB4MCwgaW9hZGRyICsgQ1NSMTMpOyAgICAgICAgICAgICAgLyogcmVzZXQgU0lBICovCi0gICAgICAgIG91dGwoMHg3ZjNmLCBpb2FkZHIgKyBDU1IxNCk7Ci0gICAgICAgIG91dGwoMHg4MDAwMDA4LCBpb2FkZHIgKyBDU1IxNSk7Ci0gICAgICAgIG91dGwoMHgwLCBpb2FkZHIgKyBDU1IxMyk7Ci0gICAgICAgIG91dGwoMHgxLCBpb2FkZHIgKyBDU1IxMyk7Ci0gICAgICAgIG91dGwoMHgyNDA0MDAwLCBpb2FkZHIgKyBDU1I2KTsKLQotICAgICAgICAvKiBpbml0YWxpemUgR1AgKi8KLSAgICAgICAgb3V0bCgweDhhZjAwMDgsIGlvYWRkciArIENTUjE1KTsKLSAgICAgICAgb3V0bCgweDUwMDA4LCBpb2FkZHIgKyBDU1IxNSk7Ci0KLSAgICAgICAgLyogZW5kICBzZXQgdG8gMTBNYnBzIGhhbGYtZHVwbGV4ICovCi0KLQlpZiAodmVuZG9yID09IFBDSV9WRU5ET1JfSURfTUFDUk9OSVggJiYgZGV2X2lkID09IFBDSV9ERVZJQ0VfSURfTVg5ODd4NSkgewotCQkvKiBkbyBzdHVmZiBmb3IgTVg5ODcxNSAqLwotCQlvdXRsKDB4MDFhODAwMDAsIGlvYWRkciArIENTUjYpOwotCQlvdXRsKDB4RkZGRkZGRkYsIGlvYWRkciArIENTUjE0KTsKLQkJb3V0bCgweDAwMDAxMDAwLCBpb2FkZHIgKyBDU1IxMik7Ci0JfQotCi0gICAgICAgIG91dGwoMHgwLCBpb2FkZHIgKyBDU1I3KTsgICAgICAgLyogZGlzYWJsZSBpbnRlcnJ1cHRzICovCi0KLSAgICAgICAgLyogY29uc3RydWN0IHNldHVwIHBhY2tldCB3aGljaCBpcyB1c2VkIGJ5IHRoZSAyMTE0MyB0bwotICAgICAgICAgICBwcm9ncmFtIGl0cyBDQU0gdG8gcmVjb2duaXplIGludGVyZXN0aW5nIE1BQyBhZGRyZXNzZXMgKi8KLQotICAgICAgICBtZW1zZXQoJnR4ZCwgMCwgc2l6ZW9mKHN0cnVjdCB0eGRlc2MpKTsKLSAgICAgICAgdHhkLmJ1ZjFhZGRyID0gJnR4YlswXTsKLSAgICAgICAgdHhkLmJ1ZjJhZGRyID0gJnR4YlswXTsgICAgICAgICAvKiBqdXN0IGluIGNhc2UgKi8KLSAgICAgICAgdHhkLmJ1ZjFzeiAgID0gMTkyOyAgICAgICAgICAgICAvKiBzZXR1cCBwYWNrZXQgbXVzdCBiZSAxOTIgYnl0ZXMgKi8KLSAgICAgICAgdHhkLmJ1ZjJzeiAgID0gMDsKLSAgICAgICAgdHhkLmNvbnRyb2wgID0gMHgwMjA7ICAgICAgICAgICAvKiBzZXR1cCBwYWNrZXQgKi8KLSAgICAgICAgdHhkLnN0YXR1cyAgID0gMHg4MDAwMDAwMDsgICAgICAvKiBnaXZlIG93bmVyc2hpcCB0byAyMTE0MyAqLwotCi0gICAgICAgIC8qIGNvbnN0cnVjdCBwZXJmZWN0IGZpbHRlciBmcmFtZSAqLwotICAgICAgICAvKiB3aXRoIG1hYyBhZGRyZXNzIGFzIGZpcnN0IG1hdGNoICovCi0gICAgICAgIC8qIGFuZCBicm9hZGNhc3QgYWRkcmVzcyBmb3IgYWxsIG90aGVycyAqLwotCi0gICAgICAgIGZvcih4PTA7eDwxOTI7eCsrKSB0eGJbeF0gPSAweGZmOwotICAgICAgICB0eGJbMF0gPSBuaWMtPm5vZGVfYWRkclswXTsKLSAgICAgICAgdHhiWzFdID0gbmljLT5ub2RlX2FkZHJbMV07Ci0gICAgICAgIHR4Yls0XSA9IG5pYy0+bm9kZV9hZGRyWzJdOwotICAgICAgICB0eGJbNV0gPSBuaWMtPm5vZGVfYWRkclszXTsKLSAgICAgICAgdHhiWzhdID0gbmljLT5ub2RlX2FkZHJbNF07Ci0gICAgICAgIHR4Yls5XSA9IG5pYy0+bm9kZV9hZGRyWzVdOwotICAgICAgICBvdXRsKCh1bnNpZ25lZCBsb25nKSZ0eGQsIGlvYWRkciArIENTUjQpOyAgICAgICAgLyogc2V0IHhtaXQgYnVmICovCi0gICAgICAgIG91dGwoMHgyNDA2MDAwLCBpb2FkZHIgKyBDU1I2KTsgICAgICAgICAvKiBzdGFydCB0cmFuc21pdGVyICovCi0KLSAgICAgICAgdWRlbGF5KDUwMDAwKTsgIC8qIHdhaXQgZm9yIHRoZSBzZXR1cCBwYWNrZXQgdG8gYmUgcHJvY2Vzc2VkICovCi0KLSAgICAgICAgfQotCi0gICAgICAgIC8qIHNldHVwIHJlY2VpdmUgZGVzY3JpcHRvciAqLwotICAgICAgICB7Ci0gICAgICAgICAgaW50IHg7Ci0gICAgICAgICAgZm9yKHg9MDt4PE5SWEQ7eCsrKSB7Ci0gICAgICAgICAgICBtZW1zZXQoJnJ4ZFt4XSwgMCwgc2l6ZW9mKHN0cnVjdCByeGRlc2MpKTsKLSAgICAgICAgICAgIHJ4ZFt4XS5idWYxYWRkciA9ICZyeGJbeCAqIEJVRkxFTl07Ci0gICAgICAgICAgICByeGRbeF0uYnVmMmFkZHIgPSAwOyAgICAgICAgLyogbm90IHVzZWQgKi8KLSAgICAgICAgICAgIHJ4ZFt4XS5idWYxc3ogICA9IEJVRkxFTjsKLSAgICAgICAgICAgIHJ4ZFt4XS5idWYyc3ogICA9IDA7ICAgICAgICAvKiBub3QgdXNlZCAqLwotICAgICAgICAgICAgcnhkW3hdLmNvbnRyb2wgID0gMHgwOwotICAgICAgICAgICAgcnhkW3hdLnN0YXR1cyAgID0gMHg4MDAwMDAwMDsgICAgICAgLyogZ2l2ZSBvd25lcnNoaXAgaXQgdG8gMjExNDMgKi8KLSAgICAgICAgICB9Ci0gICAgICAgICAgcnhkW05SWEQgLSAxXS5jb250cm9sICA9IDB4MDA4OyAgICAgICAvKiBTZXQgUmVjZWl2ZSBlbmQgb2YgcmluZyBvbiBsYQotc3QgZGVzY3JpcHRvciAqLwotICAgICAgICAgIHJ4ZF90YWlsID0gMDsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIHRlbGwgREMyMTFYWCB3aGVyZSB0byBmaW5kIHJ4IGRlc2NyaXB0b3IgbGlzdCAqLwotICAgICAgICBvdXRsKCh1bnNpZ25lZCBsb25nKSZyeGRbMF0sIGlvYWRkciArIENTUjMpOwotICAgICAgICAvKiBzdGFydCB0aGUgcmVjZWl2ZXIgKi8KLSAgICAgICAgb3V0bCgweDI0MDYwMDIsIGlvYWRkciArIENTUjYpOwotCi19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotRVRIX1RSQU5TTUlUIC0gVHJhbnNtaXQgYSBmcmFtZQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIGNvbnN0IGNoYXIgcGFkbWFwW10gPSB7Ci0gICAgICAgIDAsIDMsIDIsIDF9OwotCi1zdGF0aWMgdm9pZCB0dWxpcF90cmFuc21pdChzdHJ1Y3QgbmljICpuaWMsIGNvbnN0IGNoYXIgKmQsIHVuc2lnbmVkIGludCB0LCB1bnNpZ25lZCBpbnQgcywgY29uc3QgY2hhciAqcCkKLXsKLSAgICAgICAgdW5zaWduZWQgbG9uZyB0aW1lOwotCi0gICAgICAgIC8qIHNldHVwIGV0aGVybmV0IGhlYWRlciAqLwotCi0JbWVtY3B5KGVoZHIsIGQsIEVUSF9BTEVOKTsKLQltZW1jcHkoJmVoZHJbRVRIX0FMRU5dLCBuaWMtPm5vZGVfYWRkciwgRVRIX0FMRU4pOwotICAgICAgICBlaGRyW0VUSF9BTEVOKjJdID0gKHQgPj4gOCkgJiAweGZmOwotICAgICAgICBlaGRyW0VUSF9BTEVOKjIrMV0gPSB0ICYgMHhmZjsKLQotICAgICAgICAvKiBzZXR1cCB0aGUgdHJhbnNtaXQgZGVzY3JpcHRvciAqLwotCi0gICAgICAgIG1lbXNldCgmdHhkLCAwLCBzaXplb2Yoc3RydWN0IHR4ZGVzYykpOwotCi0gICAgICAgIHR4ZC5idWYxYWRkciA9ICZlaGRyWzBdOyAgICAgICAgLyogZXRoZXJuZXQgaGVhZGVyICovCi0gICAgICAgIHR4ZC5idWYxc3ogICA9IEVUSF9ITEVOOwotCi0gICAgICAgIHR4ZC5idWYyYWRkciA9IHA7ICAgICAgICAgICAgICAgLyogcGFja2V0IHRvIHRyYW5zbWl0ICovCi0gICAgICAgIHR4ZC5idWYyc3ogICA9IHM7Ci0KLSAgICAgICAgdHhkLmNvbnRyb2wgID0gMHgxODg7ICAgICAgICAgICAvKiBMUytGUytURVIgKi8KLQotICAgICAgICB0eGQuc3RhdHVzICAgPSAweDgwMDAwMDAwOyAgICAgIC8qIGdpdmUgaXQgdG8gMjExNDMgKi8KLQotICAgICAgICBvdXRsKGlubChpb2FkZHIgKyBDU1I2KSAmIH4weDAwMDA0MDAwLCBpb2FkZHIgKyBDU1I2KTsKLSAgICAgICAgb3V0bCgodW5zaWduZWQgbG9uZykmdHhkLCBpb2FkZHIgKyBDU1I0KTsKLSAgICAgICAgb3V0bChpbmwoaW9hZGRyICsgQ1NSNikgfCAweDAwMDA0MDAwLCBpb2FkZHIgKyBDU1I2KTsKLQotLyogICBXYWl0IGZvciB0cmFuc21pdCB0byBjb21wbGV0ZSBiZWZvcmUgcmV0dXJuaW5nLiAgbm90IHdlbGwgdGVzdGVkLgotCi0gICAgICAgIHRpbWUgPSBjdXJydGlja3MoKTsKLSAgICAgICAgd2hpbGUodHhkLnN0YXR1cyAmIDB4ODAwMDAwMDApIHsKLSAgICAgICAgICBpZiAoY3VycnRpY2tzKCkgLSB0aW1lID4gMjApIHsKLSAgICAgICAgICAgIHByaW50ZigidHJhbnNtaXQgdGltZW91dC5cbiIpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0qLwotCi19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotRVRIX1BPTEwgLSBXYWl0IGZvciBhIGZyYW1lCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgaW50IHR1bGlwX3BvbGwoc3RydWN0IG5pYyAqbmljKQotewotICAgICAgICBpZiAocnhkW3J4ZF90YWlsXS5zdGF0dXMgJiAweDgwMDAwMDAwKSByZXR1cm4gMDsKLQotICAgICAgICBuaWMtPnBhY2tldGxlbiA9IChyeGRbcnhkX3RhaWxdLnN0YXR1cyAmIDB4M0ZGRjAwMDApID4+IDE2OwotCi0gICAgICAgIC8qIGNvcHkgcGFja2V0IHRvIHdvcmtpbmcgYnVmZmVyICovCi0gICAgICAgIC8qIFhYWCAtIHRoaXMgY29weSBjb3VsZCBiZSBhdm9pZGVkIHdpdGggYSBsaXR0bGUgbW9yZSB3b3JrCi0gICAgICAgICAgIGJ1dCBmb3Igbm93IHdlIGFyZSBjb250ZW50IHdpdGggaXQgYmVjYXVzZSB0aGUgb3B0aW1pc2VkCi0gICAgICAgICAgIG1lbWNweSgsICwgKSBpcyBxdWl0ZSBmYXN0ICovCi0KLSAgICAgICAgbWVtY3B5KG5pYy0+cGFja2V0LCByeGIgKyByeGRfdGFpbCAqIEJVRkxFTiwgbmljLT5wYWNrZXRsZW4pOwotCi0gICAgICAgIC8qIHJldHVybiB0aGUgZGVzY3JpcHRvciBhbmQgYnVmZmVyIHRvIHJlY2lldmUgcmluZyAqLwotICAgICAgICByeGRbcnhkX3RhaWxdLnN0YXR1cyA9IDB4ODAwMDAwMDA7Ci0gICAgICAgIHJ4ZF90YWlsKys7Ci0gICAgICAgIGlmIChyeGRfdGFpbCA9PSBOUlhEKSByeGRfdGFpbCA9IDA7Ci0KLSAgICAgICAgcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyB2b2lkIHR1bGlwX2Rpc2FibGUoc3RydWN0IG5pYyAqbmljKQotewotCS8qIG5vdGhpbmcgZm9yIHRoZSBtb21lbnQgKi8KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1FVEhfUFJPQkUgLSBMb29rIGZvciBhbiBhZGFwdGVyCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdHJ1Y3QgbmljICpvdHVsaXBfcHJvYmUoc3RydWN0IG5pYyAqbmljLCB1bnNpZ25lZCBzaG9ydCAqaW9fYWRkcnMsIHN0cnVjdCBwY2lfZGV2aWNlICpwY2kpCi17Ci0gICAgICAgIGludCBpOwotCi0JaWYgKGlvX2FkZHJzID09IDAgfHwgKmlvX2FkZHJzID09IDApCi0JCXJldHVybiAoMCk7Ci0JdmVuZG9yID0gcGNpLT52ZW5kb3I7Ci0JZGV2X2lkID0gcGNpLT5kZXZfaWQ7Ci0JaW9hZGRyID0gKmlvX2FkZHJzOwotCW1lbWJhc2UgPSAodW5zaWduZWQgaW50ICopcGNpLT5tZW1iYXNlOwotCi0gICAgICAgIC8qIHdha2V1cCBjaGlwICovCi0gICAgICAgIHBjaWJpb3Nfd3JpdGVfY29uZmlnX2R3b3JkKHBjaS0+YnVzLHBjaS0+ZGV2Zm4sMHg0MCwweDAwMDAwMDAwKTsKLQotICAgICAgICAvKiBTdG9wIHRoZSBjaGlwJ3MgVHggYW5kIFJ4IHByb2Nlc3Nlcy4gKi8KLSAgICAgICAgLyogb3V0bChpbmwoaW9hZGRyICsgQ1NSNikgJiB+MHgyMDAyLCBpb2FkZHIgKyBDU1I2KTsgKi8KLSAgICAgICAgLyogQ2xlYXIgdGhlIG1pc3NlZC1wYWNrZXQgY291bnRlci4gKi8KLSAgICAgICAgLyogKHZvbGF0aWxlIGludClpbmwoaW9hZGRyICsgQ1NSOCk7ICovCi0KLSAgICAgICAgc3JvbV9yZWFkKCk7Ci0KLQlmb3IgKGk9MDsgaSA8IEVUSF9BTEVOOyBpKyspCi0JCW5pYy0+bm9kZV9hZGRyW2ldID0gc3JvbVsyMCtpXTsKLQotICAgICAgICBwcmludGYoIlR1bGlwICUhIGF0IGlvYWRkciAlI2hYXG4iLCBuaWMtPm5vZGVfYWRkciwgaW9hZGRyKTsKLQotICAgICAgICB0dWxpcF9yZXNldChuaWMpOwotCi0JbmljLT5yZXNldCA9IHR1bGlwX3Jlc2V0OwotCW5pYy0+cG9sbCA9IHR1bGlwX3BvbGw7Ci0JbmljLT50cmFuc21pdCA9IHR1bGlwX3RyYW5zbWl0OwotCW5pYy0+ZGlzYWJsZSA9IHR1bGlwX2Rpc2FibGU7Ci0gICAgICAgIHJldHVybiBuaWM7Ci19CmRpZmYgLU5hdXIgZ3J1Yi0wLjk3Lm9yaWcvbmV0Ym9vdC9vdHVsaXAuaCBncnViLTAuOTcvbmV0Ym9vdC9vdHVsaXAuaAotLS0gZ3J1Yi0wLjk3Lm9yaWcvbmV0Ym9vdC9vdHVsaXAuaAkyMDAzLTA3LTA5IDExOjQ1OjM4LjAwMDAwMDAwMCArMDAwMAorKysgZ3J1Yi0wLjk3L25ldGJvb3Qvb3R1bGlwLmgJMTk3MC0wMS0wMSAwMDowMDowMC4wMDAwMDAwMDAgKzAwMDAKQEAgLTEsNzYgKzAsMCBAQAotLyogbW9zdGx5IHN0b2xlbiBmcm9tIEZyZWVCU0QgaWZfZGUuYywgaWZfZGV2YXIuaCAqLwotCi0jZGVmaW5lIFRVTElQX0NTUl9SRUFEKGNzcikJCShtZW1iYXNlW2NzcioyXSkKLSNkZWZpbmUgQ1NSX1JFQUQoY3NyKQkJCShtZW1iYXNlW2NzcioyXSkKLSNkZWZpbmUgVFVMSVBfQ1NSX1dSSVRFKGNzciwgdmFsKQkobWVtYmFzZVtjc3IqMl0gPSB2YWwpCi0jZGVmaW5lIENTUl9XUklURShjc3IsIHZhbCkJCShtZW1iYXNlW2NzcioyXSA9IHZhbCkKLQotI2RlZmluZSBjc3JfMAkJCTAKLSNkZWZpbmUgY3NyXzEJCQkxCi0jZGVmaW5lIGNzcl8yCQkJMgotI2RlZmluZSBjc3JfMwkJCTMKLSNkZWZpbmUgY3NyXzQJCQk0Ci0jZGVmaW5lIGNzcl81CQkJNQotI2RlZmluZSBjc3JfNgkJCTYKLSNkZWZpbmUgY3NyXzcJCQk3Ci0jZGVmaW5lIGNzcl84CQkJOAotI2RlZmluZSBjc3JfOQkJCTkKLSNkZWZpbmUgY3NyXzEwCQkJMTAKLSNkZWZpbmUgY3NyXzExCQkJMTEKLSNkZWZpbmUgY3NyXzEyCQkJMTIKLSNkZWZpbmUgY3NyXzEzCQkJMTMKLSNkZWZpbmUgY3NyXzE0CQkJMTQKLSNkZWZpbmUgY3NyXzE1CQkJMTUKLQotI2RlZmluZSBjc3JfYnVzbW9kZQkJY3NyXzAKLSNkZWZpbmUgY3NyX3R4cG9sbAkJY3NyXzEKLSNkZWZpbmUgY3NyX3J4cG9sbAkJY3NyXzIKLSNkZWZpbmUgY3NyX3J4bGlzdAkJY3NyXzMKLSNkZWZpbmUgY3NyX3R4bGlzdAkJY3NyXzQKLSNkZWZpbmUgY3NyX3N0YXR1cwkJY3NyXzUKLSNkZWZpbmUgY3NyX2NvbW1hbmQJCWNzcl82Ci0jZGVmaW5lIGNzcl9pbnRyCQljc3JfNwotI2RlZmluZSBjc3JfbWlzc2VkX2ZyYW1lcwljc3JfOAotI2RlZmluZSBjc3JfZW5ldHJvbQkJY3NyXzkJCS8qIDIxMDQwICovCi0jZGVmaW5lIGNzcl9yZXNlcnZlZAkJY3NyXzEwCQkvKiAyMTA0MCAqLwotI2RlZmluZSBjc3JfZnVsbF9kdXBsZXgJCWNzcl8xMQkJLyogMjEwNDAgKi8KLSNkZWZpbmUgY3NyX2Jvb3Ryb20JCWNzcl8xMAkJLyogMjEwNDEvMjExNDBBLz8/ICovCi0jZGVmaW5lIGNzcl9ncAkJCWNzcl8xMgkJLyogMjExNDAqICovCi0jZGVmaW5lIGNzcl93YXRjaGRvZwkJY3NyXzE1CQkvKiAyMTE0MCogKi8KLSNkZWZpbmUgY3NyX2dwX3RpbWVyCQljc3JfMTEJCS8qIDIxMDQxLzIxMTQwKiAqLwotI2RlZmluZSBjc3Jfc3JvbV9taWkJCWNzcl85CQkvKiAyMTA0MS8yMTE0MCogKi8KLSNkZWZpbmUgY3NyX3NpYV9zdGF0dXMJCWNzcl8xMgkJLyogMjEwNHggKi8KLSNkZWZpbmUgY3NyX3NpYV9jb25uZWN0aXZpdHkJY3NyXzEzCQkvKiAyMTA0eCAqLwotI2RlZmluZSBjc3Jfc2lhX3R4X3J4CQljc3JfMTQJCS8qIDIxMDR4ICovCi0jZGVmaW5lIGNzcl9zaWFfZ2VuZXJhbAkJY3NyXzE1CQkvKiAyMTA0eCAqLwotCi0jZGVmaW5lIFNST01TRUwJCTB4MDgwMAotI2RlZmluZSBTUk9NQ1MJCTB4MDAwMQotI2RlZmluZSBTUk9NQ0xLT04JMHgwMDAyCi0jZGVmaW5lIFNST01DTEtPRkYJMHgwMDAyCi0jZGVmaW5lIFNST01SRAkJMHg0MDAwCi0jZGVmaW5lIFNST01XUgkJMHgyMDAwCi0jZGVmaW5lIFNST01fQklUV0lEVEgJNgotI2RlZmluZSBTUk9NQ01EX1JECTYKLSNkZWZpbmUgU1JPTUNTT04JMHgwMDAxCi0jZGVmaW5lIFNST01ET1VUCTB4MDAwNAotI2RlZmluZSBTUk9NRElOCQkweDAwMDgKLQotCi1zdHJ1Y3QgdHhkZXNjIHsKLQl1bnNpZ25lZCBsb25nCXN0YXR1czsJCS8qIG93bmVyLCBzdGF0dXMgKi8KLQl1bnNpZ25lZCBsb25nCWJ1ZjFzejoxMSwJLyogc2l6ZSBvZiBidWZmZXIgMSAqLwotCQkJYnVmMnN6OjExLAkvKiBzaXplIG9mIGJ1ZmZlciAyICovCi0JCQljb250cm9sOjEwOwkvKiBjb250cm9sIGJpdHMgKi8KLQljb25zdCB1bnNpZ25lZCBjaGFyICpidWYxYWRkcjsJLyogYnVmZmVyIDEgYWRkcmVzcyAqLwotCWNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ1ZjJhZGRyOwkvKiBidWZmZXIgMiBhZGRyZXNzICovCi19OwotCi1zdHJ1Y3QgcnhkZXNjIHsKLQl1bnNpZ25lZCBsb25nCXN0YXR1czsJCS8qIG93bmVyLCBzdGF0dXMgKi8KLQl1bnNpZ25lZCBsb25nCWJ1ZjFzejoxMSwJLyogc2l6ZSBvZiBidWZmZXIgMSAqLwotCQkJYnVmMnN6OjExLAkvKiBzaXplIG9mIGJ1ZmZlciAyICovCi0JCQljb250cm9sOjEwOwkvKiBjb250cm9sIGJpdHMgKi8KLQl1bnNpZ25lZCBjaGFyCSpidWYxYWRkcjsJLyogYnVmZmVyIDEgYWRkcmVzcyAqLwotCXVuc2lnbmVkIGNoYXIJKmJ1ZjJhZGRyOwkvKiBidWZmZXIgMiBhZGRyZXNzICovCi19OwpkaWZmIC1OYXVyIGdydWItMC45Ny5vcmlnL25ldGJvb3QvcGNpLmMgZ3J1Yi0wLjk3L25ldGJvb3QvcGNpLmMKLS0tIGdydWItMC45Ny5vcmlnL25ldGJvb3QvcGNpLmMJMjAwMy0wNy0wOSAxMTo0NTozOC4wMDAwMDAwMDAgKzAwMDAKKysrIGdydWItMC45Ny9uZXRib290L3BjaS5jCTIwMDUtMDgtMzEgMTk6MDM6MzUuMDAwMDAwMDAwICswMDAwCkBAIC0xLDE1ICsxLDMgQEAKLS8qCi0qKiBTdXBwb3J0IGZvciBORTIwMDAgUENJIGNsb25lcyBhZGRlZCBEYXZpZCBNb25ybyBKdW5lIDE5OTcKLSoqIEdlbmVyYWxpc2VkIHRvIG90aGVyIE5JQ3MgYnkgS2VuIFlhcCBKdWx5IDE5OTcKLSoqCi0qKiBNb3N0IG9mIHRoaXMgaXMgdGFrZW4gZnJvbToKLSoqCi0qKiAvdXNyL3NyYy9saW51eC9kcml2ZXJzL3BjaS9wY2kuYwotKiogL3Vzci9zcmMvbGludXgvaW5jbHVkZS9saW51eC9wY2kuaAotKiogL3Vzci9zcmMvbGludXgvYXJjaC9pMzg2L2Jpb3MzMi5jCi0qKiAvdXNyL3NyYy9saW51eC9pbmNsdWRlL2xpbnV4L2Jpb3MzMi5oCi0qKiAvdXNyL3NyYy9saW51eC9kcml2ZXJzL25ldC9uZS5jCi0qLwogCiAvKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgpAQCAtMTgsNDAyICs2LDI5NCBAQAogICogeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogICovCiAKLSNpbmNsdWRlICJldGhlcmJvb3QuaCIKKyNpbmNsdWRlICJncnViLmgiCiAjaW5jbHVkZSAicGNpLmgiCiAKLS8qI2RlZmluZQlERUJVRwkxKi8KLSNkZWZpbmUgREVCVUcJMAotCi0jaWZkZWYJQ09ORklHX1BDSV9ESVJFQ1QKLSNkZWZpbmUgIFBDSUJJT1NfU1VDQ0VTU0ZVTCAgICAgICAgICAgICAgICAweDAwCi0KLS8qCi0gKiBGdW5jdGlvbnMgZm9yIGFjY2Vzc2luZyBQQ0kgY29uZmlndXJhdGlvbiBzcGFjZSB3aXRoIHR5cGUgMSBhY2Nlc3NlcwotICovCi0KLSNkZWZpbmUgQ09ORklHX0NNRChidXMsIGRldmljZV9mbiwgd2hlcmUpICAgKDB4ODAwMDAwMDAgfCAoYnVzIDw8IDE2KSB8IChkZXZpY2VfZm4gPDwgOCkgfCAod2hlcmUgJiB+MykpCi0KLWludCBwY2liaW9zX3JlYWRfY29uZmlnX2J5dGUodW5zaWduZWQgaW50IGJ1cywgdW5zaWduZWQgaW50IGRldmljZV9mbiwKLQkJCSAgICAgICB1bnNpZ25lZCBpbnQgd2hlcmUsIHVuc2lnbmVkIGNoYXIgKnZhbHVlKQordW5zaWduZWQgbG9uZyB2aXJ0X29mZnNldCA9IDA7Cit1bnNpZ25lZCBsb25nIHZpcnRfdG9fcGh5cyh2b2xhdGlsZSBjb25zdCB2b2lkICp2aXJ0X2FkZHIpCiB7Ci0gICAgb3V0bChDT05GSUdfQ01EKGJ1cyxkZXZpY2VfZm4sd2hlcmUpLCAweENGOCk7Ci0gICAgKnZhbHVlID0gaW5iKDB4Q0ZDICsgKHdoZXJlJjMpKTsKLSAgICByZXR1cm4gUENJQklPU19TVUNDRVNTRlVMOworCXJldHVybiAoKHVuc2lnbmVkIGxvbmcpdmlydF9hZGRyKSArIHZpcnRfb2Zmc2V0OwogfQogCi1pbnQgcGNpYmlvc19yZWFkX2NvbmZpZ193b3JkICh1bnNpZ25lZCBpbnQgYnVzLAotICAgIHVuc2lnbmVkIGludCBkZXZpY2VfZm4sIHVuc2lnbmVkIGludCB3aGVyZSwgdW5zaWduZWQgc2hvcnQgKnZhbHVlKQordm9pZCAqcGh5c190b192aXJ0KHVuc2lnbmVkIGxvbmcgcGh5c19hZGRyKQogewotICAgIG91dGwoQ09ORklHX0NNRChidXMsZGV2aWNlX2ZuLHdoZXJlKSwgMHhDRjgpOwotICAgICp2YWx1ZSA9IGludygweENGQyArICh3aGVyZSYyKSk7Ci0gICAgcmV0dXJuIFBDSUJJT1NfU1VDQ0VTU0ZVTDsKKwlyZXR1cm4gKHZvaWQgKikocGh5c19hZGRyIC0gdmlydF9vZmZzZXQpOwogfQogCi1pbnQgcGNpYmlvc19yZWFkX2NvbmZpZ19kd29yZCAodW5zaWduZWQgaW50IGJ1cywgdW5zaWduZWQgaW50IGRldmljZV9mbiwKLQkJCQkgdW5zaWduZWQgaW50IHdoZXJlLCB1bnNpZ25lZCBpbnQgKnZhbHVlKQotewotICAgIG91dGwoQ09ORklHX0NNRChidXMsZGV2aWNlX2ZuLHdoZXJlKSwgMHhDRjgpOwotICAgICp2YWx1ZSA9IGlubCgweENGQyk7Ci0gICAgcmV0dXJuIFBDSUJJT1NfU1VDQ0VTU0ZVTDsKLX0KKyNpZmRlZiBJTkNMVURFXzNDNTk1CitleHRlcm4gc3RydWN0IHBjaV9kcml2ZXIgdDU5NV9kcml2ZXI7CisjZW5kaWYgLyogSU5DTFVERV8zQzU5NSAqLwogCi1pbnQgcGNpYmlvc193cml0ZV9jb25maWdfYnl0ZSAodW5zaWduZWQgaW50IGJ1cywgdW5zaWduZWQgaW50IGRldmljZV9mbiwKLQkJCQkgdW5zaWduZWQgaW50IHdoZXJlLCB1bnNpZ25lZCBjaGFyIHZhbHVlKQotewotICAgIG91dGwoQ09ORklHX0NNRChidXMsZGV2aWNlX2ZuLHdoZXJlKSwgMHhDRjgpOwotICAgIG91dGIodmFsdWUsIDB4Q0ZDICsgKHdoZXJlJjMpKTsKLSAgICByZXR1cm4gUENJQklPU19TVUNDRVNTRlVMOwotfQorI2lmZGVmIElOQ0xVREVfM0M5MFgKK2V4dGVybiBzdHJ1Y3QgcGNpX2RyaXZlciBhM2M5MHhfZHJpdmVyOworI2VuZGlmIC8qIElOQ0xVREVfM0M5MFggKi8KIAotaW50IHBjaWJpb3Nfd3JpdGVfY29uZmlnX3dvcmQgKHVuc2lnbmVkIGludCBidXMsIHVuc2lnbmVkIGludCBkZXZpY2VfZm4sCi0JCQkJIHVuc2lnbmVkIGludCB3aGVyZSwgdW5zaWduZWQgc2hvcnQgdmFsdWUpCi17Ci0gICAgb3V0bChDT05GSUdfQ01EKGJ1cyxkZXZpY2VfZm4sd2hlcmUpLCAweENGOCk7Ci0gICAgb3V0dyh2YWx1ZSwgMHhDRkMgKyAod2hlcmUmMikpOwotICAgIHJldHVybiBQQ0lCSU9TX1NVQ0NFU1NGVUw7Ci19CisjaWZkZWYgSU5DTFVERV9EQVZJQ09NCitleHRlcm4gc3RydWN0IHBjaV9kcml2ZXIgZGF2aWNvbV9kcml2ZXI7CisjZW5kaWYgLyogSU5DTFVERV9EQVZJQ09NICovCiAKLWludCBwY2liaW9zX3dyaXRlX2NvbmZpZ19kd29yZCAodW5zaWduZWQgaW50IGJ1cywgdW5zaWduZWQgaW50IGRldmljZV9mbiwgdW5zaWduZWQgaW50IHdoZXJlLCB1bnNpZ25lZCBpbnQgdmFsdWUpCi17Ci0gICAgb3V0bChDT05GSUdfQ01EKGJ1cyxkZXZpY2VfZm4sd2hlcmUpLCAweENGOCk7Ci0gICAgb3V0bCh2YWx1ZSwgMHhDRkMpOwotICAgIHJldHVybiBQQ0lCSU9TX1NVQ0NFU1NGVUw7Ci19CisjaWZkZWYgSU5DTFVERV9FMTAwMAorZXh0ZXJuIHN0cnVjdCBwY2lfZHJpdmVyIGUxMDAwX2RyaXZlcjsKKyNlbmRpZiAvKiBJTkNMVURFX0UxMDAwICovCiAKLSN1bmRlZiBDT05GSUdfQ01ECisjaWZkZWYgSU5DTFVERV9FRVBSTzEwMAorZXh0ZXJuIHN0cnVjdCBwY2lfZHJpdmVyIGVlcHJvMTAwX2RyaXZlcjsKKyNlbmRpZiAvKiBJTkNMVURFX0VFUFJPMTAwICovCiAKLSNlbHNlCSAvKiBDT05GSUdfUENJX0RJUkVDVCAgbm90IGRlZmluZWQgKi8KKyNpZmRlZiBJTkNMVURFX0VQSUMxMDAKK2V4dGVybiBzdHJ1Y3QgcGNpX2RyaXZlciBlcGljMTAwX2RyaXZlcjsKKyNlbmRpZiAvKiBJTkNMVURFX0VQSUMxMDAgKi8KIAotc3RhdGljIHN0cnVjdCB7Ci0JdW5zaWduZWQgbG9uZyBhZGRyZXNzOwotCXVuc2lnbmVkIHNob3J0IHNlZ21lbnQ7Ci19IGJpb3MzMl9pbmRpcmVjdCA9IHsgMCwgS0VSTl9DT0RFX1NFRyB9OwotCi1zdGF0aWMgbG9uZyBwY2liaW9zX2VudHJ5Owotc3RhdGljIHN0cnVjdCB7Ci0JdW5zaWduZWQgbG9uZyBhZGRyZXNzOwotCXVuc2lnbmVkIHNob3J0IHNlZ21lbnQ7Ci19IHBjaV9pbmRpcmVjdCA9IHsgMCwgS0VSTl9DT0RFX1NFRyB9OworI2lmZGVmIElOQ0xVREVfRk9SQ0VERVRICitleHRlcm4gc3RydWN0IHBjaV9kcml2ZXIgZm9yY2VkZXRoX2RyaXZlcjsKKyNlbmRpZiAvKiBJTkNMVURFX0ZPUkNFREVUSCAqLwogCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBiaW9zMzJfc2VydmljZSh1bnNpZ25lZCBsb25nIHNlcnZpY2UpCi17Ci0JdW5zaWduZWQgY2hhciByZXR1cm5fY29kZTsJLyogJWFsICovCi0JdW5zaWduZWQgbG9uZyBhZGRyZXNzOwkJLyogJWVieCAqLwotCXVuc2lnbmVkIGxvbmcgbGVuZ3RoOwkJLyogJWVjeCAqLwotCXVuc2lnbmVkIGxvbmcgZW50cnk7CQkvKiAlZWR4ICovCi0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCXNhdmVfZmxhZ3MoZmxhZ3MpOwotCV9fYXNtX18oCi0jaWZkZWYgQUJTT0xVVEVfV0lUSE9VVF9BU1RFUklTSwotCQkibGNhbGwgKCUlZWRpKSIKLSNlbHNlCi0JCSJsY2FsbCAqKCUlZWRpKSIKLSNlbmRpZgotCQk6ICI9YSIgKHJldHVybl9jb2RlKSwKLQkJICAiPWIiIChhZGRyZXNzKSwKLQkJICAiPWMiIChsZW5ndGgpLAotCQkgICI9ZCIgKGVudHJ5KQotCQk6ICIwIiAoc2VydmljZSksCi0JCSAgIjEiICgwKSwKLQkJICAiRCIgKCZiaW9zMzJfaW5kaXJlY3QpKTsKLQlyZXN0b3JlX2ZsYWdzKGZsYWdzKTsKLQotCXN3aXRjaCAocmV0dXJuX2NvZGUpIHsKLQkJY2FzZSAwOgotCQkJcmV0dXJuIGFkZHJlc3MgKyBlbnRyeTsKLQkJY2FzZSAweDgwOgkvKiBOb3QgcHJlc2VudCAqLwotCQkJcHJpbnRmKCJiaW9zMzJfc2VydmljZSglZCkgOiBub3QgcHJlc2VudFxuIiwgc2VydmljZSk7Ci0JCQlyZXR1cm4gMDsKLQkJZGVmYXVsdDogLyogU2hvdWxkbid0IGhhcHBlbiAqLwotCQkJcHJpbnRmKCJiaW9zMzJfc2VydmljZSglZCkgOiByZXR1cm5lZCAlI1gsIG1haWwgZHJld0Bjb2xvcmFkby5lZHVcbiIsCi0JCQkJc2VydmljZSwgcmV0dXJuX2NvZGUpOwotCQkJcmV0dXJuIDA7Ci0JfQotfQorI2lmZGVmIElOQ0xVREVfTkFUU0VNSQorZXh0ZXJuIHN0cnVjdCBwY2lfZHJpdmVyIG5hdHNlbWlfZHJpdmVyOworI2VuZGlmIC8qIElOQ0xVREVfTkFUU0VNSSAqLwogCi1pbnQgcGNpYmlvc19yZWFkX2NvbmZpZ19ieXRlKHVuc2lnbmVkIGludCBidXMsCi0gICAgICAgIHVuc2lnbmVkIGludCBkZXZpY2VfZm4sIHVuc2lnbmVkIGludCB3aGVyZSwgdW5zaWduZWQgY2hhciAqdmFsdWUpCi17Ci0gICAgICAgIHVuc2lnbmVkIGxvbmcgcmV0OwotICAgICAgICB1bnNpZ25lZCBsb25nIGJ4ID0gKGJ1cyA8PCA4KSB8IGRldmljZV9mbjsKLSAgICAgICAgdW5zaWduZWQgbG9uZyBmbGFnczsKLQotICAgICAgICBzYXZlX2ZsYWdzKGZsYWdzKTsKLSAgICAgICAgX19hc21fXygKLSNpZmRlZiBBQlNPTFVURV9XSVRIT1VUX0FTVEVSSVNLCi0JCSJsY2FsbCAoJSVlc2kpXG5cdCIKLSNlbHNlCi0JCSJsY2FsbCAqKCUlZXNpKVxuXHQiCi0jZW5kaWYKLSAgICAgICAgICAgICAgICAiamMgMWZcblx0IgotICAgICAgICAgICAgICAgICJ4b3IgJSVhaCwgJSVhaFxuIgotICAgICAgICAgICAgICAgICIxOiIKLSAgICAgICAgICAgICAgICA6ICI9YyIgKCp2YWx1ZSksCi0gICAgICAgICAgICAgICAgICAiPWEiIChyZXQpCi0gICAgICAgICAgICAgICAgOiAiMSIgKFBDSUJJT1NfUkVBRF9DT05GSUdfQllURSksCi0gICAgICAgICAgICAgICAgICAiYiIgKGJ4KSwKLSAgICAgICAgICAgICAgICAgICJEIiAoKGxvbmcpIHdoZXJlKSwKLSAgICAgICAgICAgICAgICAgICJTIiAoJnBjaV9pbmRpcmVjdCkpOwotICAgICAgICByZXN0b3JlX2ZsYWdzKGZsYWdzKTsKLSAgICAgICAgcmV0dXJuIChpbnQpIChyZXQgJiAweGZmMDApID4+IDg7Ci19CisjaWZkZWYgSU5DTFVERV9OUzgzODIwCitleHRlcm4gc3RydWN0IHBjaV9kcml2ZXIgbnM4MzgyMF9kcml2ZXI7CisjZW5kaWYgLyogSU5DTFVERV9OUzgzODIwICovCiAKLWludCBwY2liaW9zX3JlYWRfY29uZmlnX3dvcmQodW5zaWduZWQgaW50IGJ1cywKLSAgICAgICAgdW5zaWduZWQgaW50IGRldmljZV9mbiwgdW5zaWduZWQgaW50IHdoZXJlLCB1bnNpZ25lZCBzaG9ydCAqdmFsdWUpCi17Ci0gICAgICAgIHVuc2lnbmVkIGxvbmcgcmV0OwotICAgICAgICB1bnNpZ25lZCBsb25nIGJ4ID0gKGJ1cyA8PCA4KSB8IGRldmljZV9mbjsKLSAgICAgICAgdW5zaWduZWQgbG9uZyBmbGFnczsKLQotICAgICAgICBzYXZlX2ZsYWdzKGZsYWdzKTsKLSAgICAgICAgX19hc21fXygKLSNpZmRlZiBBQlNPTFVURV9XSVRIT1VUX0FTVEVSSVNLCi0JCSJsY2FsbCAoJSVlc2kpXG5cdCIKLSNlbHNlCi0JCSJsY2FsbCAqKCUlZXNpKVxuXHQiCi0jZW5kaWYKLSAgICAgICAgICAgICAgICAiamMgMWZcblx0IgotICAgICAgICAgICAgICAgICJ4b3IgJSVhaCwgJSVhaFxuIgotICAgICAgICAgICAgICAgICIxOiIKLSAgICAgICAgICAgICAgICA6ICI9YyIgKCp2YWx1ZSksCi0gICAgICAgICAgICAgICAgICAiPWEiIChyZXQpCi0gICAgICAgICAgICAgICAgOiAiMSIgKFBDSUJJT1NfUkVBRF9DT05GSUdfV09SRCksCi0gICAgICAgICAgICAgICAgICAiYiIgKGJ4KSwKLSAgICAgICAgICAgICAgICAgICJEIiAoKGxvbmcpIHdoZXJlKSwKLSAgICAgICAgICAgICAgICAgICJTIiAoJnBjaV9pbmRpcmVjdCkpOwotICAgICAgICByZXN0b3JlX2ZsYWdzKGZsYWdzKTsKLSAgICAgICAgcmV0dXJuIChpbnQpIChyZXQgJiAweGZmMDApID4+IDg7Ci19CisjaWZkZWYgSU5DTFVERV9OUzgzOTAKK2V4dGVybiBzdHJ1Y3QgcGNpX2RyaXZlciBuZXBjaV9kcml2ZXI7CisjZW5kaWYgLyogSU5DTFVERV9OUzgzOTAgKi8KIAotaW50IHBjaWJpb3NfcmVhZF9jb25maWdfZHdvcmQodW5zaWduZWQgaW50IGJ1cywKLSAgICAgICAgdW5zaWduZWQgaW50IGRldmljZV9mbiwgdW5zaWduZWQgaW50IHdoZXJlLCB1bnNpZ25lZCBpbnQgKnZhbHVlKQotewotICAgICAgICB1bnNpZ25lZCBsb25nIHJldDsKLSAgICAgICAgdW5zaWduZWQgbG9uZyBieCA9IChidXMgPDwgOCkgfCBkZXZpY2VfZm47Ci0gICAgICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLSAgICAgICAgc2F2ZV9mbGFncyhmbGFncyk7Ci0gICAgICAgIF9fYXNtX18oCi0jaWZkZWYgQUJTT0xVVEVfV0lUSE9VVF9BU1RFUklTSwotCQkibGNhbGwgKCUlZXNpKVxuXHQiCi0jZWxzZQotCQkibGNhbGwgKiglJWVzaSlcblx0IgotI2VuZGlmCi0gICAgICAgICAgICAgICAgImpjIDFmXG5cdCIKLSAgICAgICAgICAgICAgICAieG9yICUlYWgsICUlYWhcbiIKLSAgICAgICAgICAgICAgICAiMToiCi0gICAgICAgICAgICAgICAgOiAiPWMiICgqdmFsdWUpLAotICAgICAgICAgICAgICAgICAgIj1hIiAocmV0KQotICAgICAgICAgICAgICAgIDogIjEiIChQQ0lCSU9TX1JFQURfQ09ORklHX0RXT1JEKSwKLSAgICAgICAgICAgICAgICAgICJiIiAoYngpLAotICAgICAgICAgICAgICAgICAgIkQiICgobG9uZykgd2hlcmUpLAotICAgICAgICAgICAgICAgICAgIlMiICgmcGNpX2luZGlyZWN0KSk7Ci0gICAgICAgIHJlc3RvcmVfZmxhZ3MoZmxhZ3MpOwotICAgICAgICByZXR1cm4gKGludCkgKHJldCAmIDB4ZmYwMCkgPj4gODsKLX0KKyNpZmRlZiBJTkNMVURFX1BDTkVUMzIKK2V4dGVybiBzdHJ1Y3QgcGNpX2RyaXZlciBwY25ldDMyX2RyaXZlcjsKKyNlbmRpZiAvKiBJTkNMVURFX1BDTkVUMzIgKi8KIAotaW50IHBjaWJpb3Nfd3JpdGVfY29uZmlnX2J5dGUgKHVuc2lnbmVkIGludCBidXMsCi0JdW5zaWduZWQgaW50IGRldmljZV9mbiwgdW5zaWduZWQgaW50IHdoZXJlLCB1bnNpZ25lZCBjaGFyIHZhbHVlKQotewotCXVuc2lnbmVkIGxvbmcgcmV0OwotCXVuc2lnbmVkIGxvbmcgYnggPSAoYnVzIDw8IDgpIHwgZGV2aWNlX2ZuOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlzYXZlX2ZsYWdzKGZsYWdzKTsgY2xpKCk7Ci0JX19hc21fXygKLSNpZmRlZiBBQlNPTFVURV9XSVRIT1VUX0FTVEVSSVNLCi0JCSJsY2FsbCAoJSVlc2kpXG5cdCIKLSNlbHNlCi0JCSJsY2FsbCAqKCUlZXNpKVxuXHQiCi0jZW5kaWYKLQkJImpjIDFmXG5cdCIKLQkJInhvciAlJWFoLCAlJWFoXG4iCi0JCSIxOiIKLQkJOiAiPWEiIChyZXQpCi0JCTogIjAiIChQQ0lCSU9TX1dSSVRFX0NPTkZJR19CWVRFKSwKLQkJICAiYyIgKHZhbHVlKSwKLQkJICAiYiIgKGJ4KSwKLQkJICAiRCIgKChsb25nKSB3aGVyZSksCi0JCSAgIlMiICgmcGNpX2luZGlyZWN0KSk7Ci0JcmVzdG9yZV9mbGFncyhmbGFncyk7Ci0JcmV0dXJuIChpbnQpIChyZXQgJiAweGZmMDApID4+IDg7Ci19CisjaWZkZWYgSU5DTFVERV9QTklDCitleHRlcm4gc3RydWN0IHBjaV9kcml2ZXIgcG5pY19kcml2ZXI7CisjZW5kaWYgLyogSU5DTFVERV9QTklDICovCiAKLWludCBwY2liaW9zX3dyaXRlX2NvbmZpZ193b3JkICh1bnNpZ25lZCBpbnQgYnVzLAotCXVuc2lnbmVkIGludCBkZXZpY2VfZm4sIHVuc2lnbmVkIGludCB3aGVyZSwgdW5zaWduZWQgc2hvcnQgdmFsdWUpCi17Ci0JdW5zaWduZWQgbG9uZyByZXQ7Ci0JdW5zaWduZWQgbG9uZyBieCA9IChidXMgPDwgOCkgfCBkZXZpY2VfZm47Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCXNhdmVfZmxhZ3MoZmxhZ3MpOyBjbGkoKTsKLQlfX2FzbV9fKAotI2lmZGVmIEFCU09MVVRFX1dJVEhPVVRfQVNURVJJU0sKLQkJImxjYWxsICglJWVzaSlcblx0IgotI2Vsc2UKLQkJImxjYWxsICooJSVlc2kpXG5cdCIKLSNlbmRpZgotCQkiamMgMWZcblx0IgotCQkieG9yICUlYWgsICUlYWhcbiIKLQkJIjE6IgotCQk6ICI9YSIgKHJldCkKLQkJOiAiMCIgKFBDSUJJT1NfV1JJVEVfQ09ORklHX1dPUkQpLAotCQkgICJjIiAodmFsdWUpLAotCQkgICJiIiAoYngpLAotCQkgICJEIiAoKGxvbmcpIHdoZXJlKSwKLQkJICAiUyIgKCZwY2lfaW5kaXJlY3QpKTsKLQlyZXN0b3JlX2ZsYWdzKGZsYWdzKTsKLQlyZXR1cm4gKGludCkgKHJldCAmIDB4ZmYwMCkgPj4gODsKLX0KKyNpZmRlZiBJTkNMVURFX1JUTDgxMzkKK2V4dGVybiBzdHJ1Y3QgcGNpX2RyaXZlciBydGw4MTM5X2RyaXZlcjsKKyNlbmRpZiAvKiBJTkNMVURFX1JUTDgxMzkgKi8KIAotaW50IHBjaWJpb3Nfd3JpdGVfY29uZmlnX2R3b3JkICh1bnNpZ25lZCBpbnQgYnVzLAotCXVuc2lnbmVkIGludCBkZXZpY2VfZm4sIHVuc2lnbmVkIGludCB3aGVyZSwgdW5zaWduZWQgaW50IHZhbHVlKQotewotCXVuc2lnbmVkIGxvbmcgcmV0OwotCXVuc2lnbmVkIGxvbmcgYnggPSAoYnVzIDw8IDgpIHwgZGV2aWNlX2ZuOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlzYXZlX2ZsYWdzKGZsYWdzKTsgY2xpKCk7Ci0JX19hc21fXygKLSNpZmRlZiBBQlNPTFVURV9XSVRIT1VUX0FTVEVSSVNLCi0JCSJsY2FsbCAoJSVlc2kpXG5cdCIKLSNlbHNlCi0JCSJsY2FsbCAqKCUlZXNpKVxuXHQiCi0jZW5kaWYKLQkJImpjIDFmXG5cdCIKLQkJInhvciAlJWFoLCAlJWFoXG4iCi0JCSIxOiIKLQkJOiAiPWEiIChyZXQpCi0JCTogIjAiIChQQ0lCSU9TX1dSSVRFX0NPTkZJR19EV09SRCksCi0JCSAgImMiICh2YWx1ZSksCi0JCSAgImIiIChieCksCi0JCSAgIkQiICgobG9uZykgd2hlcmUpLAotCQkgICJTIiAoJnBjaV9pbmRpcmVjdCkpOwotCXJlc3RvcmVfZmxhZ3MoZmxhZ3MpOwotCXJldHVybiAoaW50KSAocmV0ICYgMHhmZjAwKSA+PiA4OwotfQorI2lmZGVmIElOQ0xVREVfU0lTOTAwCitleHRlcm4gc3RydWN0IHBjaV9kcml2ZXIgc2lzOTAwX2RyaXZlcjsKK2V4dGVybiBzdHJ1Y3QgcGNpX2RyaXZlciBzaXNfYnJpZGdlX2RyaXZlcjsKKyNlbmRpZiAvKiBJTkNMVURFX1NJUzkwMCAqLwogCi1zdGF0aWMgdm9pZCBjaGVja19wY2liaW9zKHZvaWQpCi17Ci0JdW5zaWduZWQgbG9uZyBzaWduYXR1cmU7Ci0JdW5zaWduZWQgY2hhciBwcmVzZW50X3N0YXR1czsKLQl1bnNpZ25lZCBjaGFyIG1ham9yX3JldmlzaW9uOwotCXVuc2lnbmVkIGNoYXIgbWlub3JfcmV2aXNpb247Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlpbnQgcGFjazsKLQotCWlmICgocGNpYmlvc19lbnRyeSA9IGJpb3MzMl9zZXJ2aWNlKFBDSV9TRVJWSUNFKSkpIHsKLQkJcGNpX2luZGlyZWN0LmFkZHJlc3MgPSBwY2liaW9zX2VudHJ5OwotCi0JCXNhdmVfZmxhZ3MoZmxhZ3MpOwotCQlfX2FzbV9fKAotI2lmZGVmIEFCU09MVVRFX1dJVEhPVVRfQVNURVJJU0sKLQkJCSJsY2FsbCAoJSVlZGkpXG5cdCIKLSNlbHNlCi0JCQkibGNhbGwgKiglJWVkaSlcblx0IgotI2VuZGlmCi0JCQkiamMgMWZcblx0IgotCQkJInhvciAlJWFoLCAlJWFoXG4iCi0JCQkiMTpcdHNobCAkOCwgJSVlYXhcblx0IgotCQkJIm1vdncgJSVieCwgJSVheCIKLQkJCTogIj1kIiAoc2lnbmF0dXJlKSwKLQkJCSAgIj1hIiAocGFjaykKLQkJCTogIjEiIChQQ0lCSU9TX1BDSV9CSU9TX1BSRVNFTlQpLAotCQkJICAiRCIgKCZwY2lfaW5kaXJlY3QpCi0JCQk6ICJieCIsICJjeCIpOwotCQlyZXN0b3JlX2ZsYWdzKGZsYWdzKTsKLQotCQlwcmVzZW50X3N0YXR1cyA9IChwYWNrID4+IDE2KSAmIDB4ZmY7Ci0JCW1ham9yX3JldmlzaW9uID0gKHBhY2sgPj4gOCkgJiAweGZmOwotCQltaW5vcl9yZXZpc2lvbiA9IHBhY2sgJiAweGZmOwotCQlpZiAocHJlc2VudF9zdGF0dXMgfHwgKHNpZ25hdHVyZSAhPSBQQ0lfU0lHTkFUVVJFKSkgewotCQkJcHJpbnRmKCJFUlJPUjogQklPUzMyIHNheXMgUENJIEJJT1MsIGJ1dCBubyBQQ0kgIgotCQkJCSJCSU9TPz8/P1xuIik7Ci0JCQlwY2liaW9zX2VudHJ5ID0gMDsKLQkJfQotI2lmCURFQlVHCi0JCWlmIChwY2liaW9zX2VudHJ5KSB7Ci0JCQlwcmludGYgKCJwY2liaW9zX2luaXQgOiBQQ0kgQklPUyByZXZpc2lvbiAlaGhYLiVoaFgiCi0JCQkJIiBlbnRyeSBhdCAlI1hcbiIsIG1ham9yX3JldmlzaW9uLAotCQkJCW1pbm9yX3JldmlzaW9uLCBwY2liaW9zX2VudHJ5KTsKLQkJfQotI2VuZGlmCi0JfQotfQorI2lmZGVmIElOQ0xVREVfU1VOREFOQ0UKK2V4dGVybiBzdHJ1Y3QgcGNpX2RyaXZlciBzdW5kYW5jZV9kcml2ZXI7CisjZW5kaWYJLyogSU5DTFVERV9TVU5EQU5DRSAqLwogCi1zdGF0aWMgdm9pZCBwY2liaW9zX2luaXQodm9pZCkKLXsKLQl1bmlvbiBiaW9zMzIgKmNoZWNrOwotCXVuc2lnbmVkIGNoYXIgc3VtOwotCWludCBpLCBsZW5ndGg7Ci0JdW5zaWduZWQgbG9uZyBiaW9zMzJfZW50cnkgPSAwOwotCi0JLyoKLQkgKiBGb2xsb3cgdGhlIHN0YW5kYXJkIHByb2NlZHVyZSBmb3IgbG9jYXRpbmcgdGhlIEJJT1MzMiBTZXJ2aWNlCi0JICogZGlyZWN0b3J5IGJ5IHNjYW5uaW5nIHRoZSBwZXJtaXNzaWJsZSBhZGRyZXNzIHJhbmdlIGZyb20KLQkgKiAweGUwMDAwIHRocm91Z2ggMHhmZmZmZiBmb3IgYSB2YWxpZCBCSU9TMzIgc3RydWN0dXJlLgotCSAqCi0JICovCisjaWZkZWYgSU5DTFVERV9URzMKK2V4dGVybiBzdHJ1Y3QgcGNpX2RyaXZlciAgdGczX2RyaXZlcjsKKyNlbmRpZiAvKiBJTkNMVURFX1RHMyAqLworCisjaWZkZWYgSU5DTFVERV9UTEFOCitleHRlcm4gc3RydWN0IHBjaV9kcml2ZXIgdGxhbl9kcml2ZXI7CisjZW5kaWYgLyogSU5DTFVERV9UTEFOICovCisKKyNpZmRlZiBJTkNMVURFX1RVTElQCitleHRlcm4gc3RydWN0IHBjaV9kcml2ZXIgdHVsaXBfZHJpdmVyOworI2VuZGlmIC8qIElOQ0xVREVfVFVMSVAgKi8KKworI2lmZGVmIElOQ0xVREVfVU5ESQorZXh0ZXJuIHN0cnVjdCBwY2lfZHJpdmVyIHVuZGlfZHJpdmVyOworI2VuZGlmIC8qIElOQ0xVREVfVU5ESSAqLworCisjaWZkZWYgSU5DTFVERV9WSUFfUkhJTkUKK2V4dGVybiBzdHJ1Y3QgcGNpX2RyaXZlciByaGluZV9kcml2ZXI7CisjZW5kaWYvKiBJTkNMVURFX1ZJQV9SSElORSAqLworCisjaWZkZWYgSU5DTFVERV9XODlDODQwCitleHRlcm4gc3RydWN0IHBjaV9kcml2ZXIgdzg5Yzg0MF9kcml2ZXI7CisjZW5kaWYgLyogSU5DTFVERV9XODlDODQwICovCisKKyNpZmRlZiBJTkNMVURFX1I4MTY5CitleHRlcm4gc3RydWN0IHBjaV9kcml2ZXIgcjgxNjlfZHJpdmVyOworI2VuZGlmIC8qIElOQ0xVREVfUjgxNjkgKi8KKworc3RhdGljIGNvbnN0IHN0cnVjdCBwY2lfZHJpdmVyICpwY2lfZHJpdmVyc1tdID0geworCisjaWZkZWYgSU5DTFVERV8zQzU5NQorCSZ0NTk1X2RyaXZlciwKKyNlbmRpZiAvKiBJTkNMVURFXzNDNTk1ICovCisKKyNpZmRlZiBJTkNMVURFXzNDOTBYCisJJmEzYzkweF9kcml2ZXIsCisjZW5kaWYgLyogSU5DTFVERV8zQzkwWCAqLworCisjaWZkZWYgSU5DTFVERV9EQVZJQ09NCisJJmRhdmljb21fZHJpdmVyLAorI2VuZGlmIC8qIElOQ0xVREVfREFWSUNPTSAqLworCisjaWZkZWYgSU5DTFVERV9FMTAwMAorCSZlMTAwMF9kcml2ZXIsCisjZW5kaWYgLyogSU5DTFVERV9FMTAwMCAqLworCisjaWZkZWYgSU5DTFVERV9FRVBSTzEwMAorCSZlZXBybzEwMF9kcml2ZXIsCisjZW5kaWYgLyogSU5DTFVERV9FRVBSTzEwMCAqLworCisjaWZkZWYgSU5DTFVERV9FUElDMTAwCisJJmVwaWMxMDBfZHJpdmVyLAorI2VuZGlmIC8qIElOQ0xVREVfRVBJQzEwMCAqLworCisjaWZkZWYgSU5DTFVERV9GT1JDRURFVEgKKwkmZm9yY2VkZXRoX2RyaXZlciwKKyNlbmRpZiAvKiBJTkNMVURFX0ZPUkNFREVUSCAqLworCisjaWZkZWYgSU5DTFVERV9OQVRTRU1JCisJJm5hdHNlbWlfZHJpdmVyLAorI2VuZGlmIC8qIElOQ0xVREVfTkFUU0VNSSAqLworCisjaWZkZWYgSU5DTFVERV9OUzgzODIwCisJJm5zODM4MjBfZHJpdmVyLAorI2VuZGlmIC8qIElOQ0xVREVfTlM4MzgyMCAqLworCisjaWZkZWYgSU5DTFVERV9OUzgzOTAKKwkmbmVwY2lfZHJpdmVyLAorI2VuZGlmIC8qIElOQ0xVREVfTlM4MzkwICovCisKKyNpZmRlZiBJTkNMVURFX1BDTkVUMzIKKwkmcGNuZXQzMl9kcml2ZXIsCisjZW5kaWYgLyogSU5DTFVERV9QQ05FVDMyICovCisKKyNpZmRlZiBJTkNMVURFX1BOSUMKKwkmcG5pY19kcml2ZXIsCisjZW5kaWYgLyogSU5DTFVERV9QTklDICovCiAKLQlmb3IgKGNoZWNrID0gKHVuaW9uIGJpb3MzMiAqKSAweGUwMDAwOyBjaGVjayA8PSAodW5pb24gYmlvczMyICopIDB4ZmZmZjA7ICsrY2hlY2spIHsKLQkJaWYgKGNoZWNrLT5maWVsZHMuc2lnbmF0dXJlICE9IEJJT1MzMl9TSUdOQVRVUkUpCisjaWZkZWYgSU5DTFVERV9SVEw4MTM5CisJJnJ0bDgxMzlfZHJpdmVyLAorI2VuZGlmIC8qIElOQ0xVREVfUlRMODEzOSAqLworCisjaWZkZWYgSU5DTFVERV9TSVM5MDAKKwkmc2lzOTAwX2RyaXZlciwKKwkmc2lzX2JyaWRnZV9kcml2ZXIsCisjZW5kaWYgLyogSU5DTFVERV9TSVM5MDAgKi8KKworI2lmZGVmIElOQ0xVREVfU1VOREFOQ0UKKwkmc3VuZGFuY2VfZHJpdmVyLAorI2VuZGlmIC8qIElOQ0xVREVfU1VOREFOQ0UgKi8KKworI2lmZGVmIElOQ0xVREVfVEczCisJJiB0ZzNfZHJpdmVyLAorI2VuZGlmIC8qIElOQ0xVREVfVEczICovCisKKyNpZmRlZiBJTkNMVURFX1RMQU4KKwkmdGxhbl9kcml2ZXIsCisjZW5kaWYgLyogSU5DTFVERV9UTEFOICovCisKKyNpZmRlZiBJTkNMVURFX1RVTElQCisJJiB0dWxpcF9kcml2ZXIsCisjZW5kaWYgLyogSU5DTFVERV9UVUxJUCAqLworCisjaWZkZWYgSU5DTFVERV9WSUFfUkhJTkUKKwkmcmhpbmVfZHJpdmVyLAorI2VuZGlmLyogSU5DTFVERV9WSUFfUkhJTkUgKi8KKworI2lmZGVmIElOQ0xVREVfVzg5Qzg0MAorCSZ3ODljODQwX2RyaXZlciwKKyNlbmRpZiAvKiBJTkNMVURFX1c4OUM4NDAgKi8KKworI2lmZGVmIElOQ0xVREVfUjgxNjkKKwkmcjgxNjlfZHJpdmVyLAorI2VuZGlmIC8qIElOQ0xVREVfUjgxNjkgKi8KKworLyogV2UgbXVzdCBiZSB0aGUgbGFzdCBvbmUgKi8KKyNpZmRlZiBJTkNMVURFX1VOREkKKwkmdW5kaV9kcml2ZXIsCisjZW5kaWYgLyogSU5DTFVERV9VTkRJICovCisKKwkwCit9OworCitzdGF0aWMgdm9pZCBzY2FuX2RyaXZlcnMoCisJaW50IHR5cGUsIAorCXVpbnQzMl90IGNsYXNzLCB1aW50MTZfdCB2ZW5kb3IsIHVpbnQxNl90IGRldmljZSwKKwljb25zdCBzdHJ1Y3QgcGNpX2RyaXZlciAqbGFzdF9kcml2ZXIsIHN0cnVjdCBwY2lfZGV2aWNlICpkZXYpCit7CisJY29uc3Qgc3RydWN0IHBjaV9kcml2ZXIgKnNraXBfZHJpdmVyID0gbGFzdF9kcml2ZXI7CisJLyogQXNzdW1lIHRoZXJlIGlzIG9ubHkgb25lIG1hdGNoIG9mIHRoZSBjb3JyZWN0IHR5cGUgKi8KKwljb25zdCBzdHJ1Y3QgcGNpX2RyaXZlciAqZHJpdmVyOworCWludCBpLCBqOworCQorCWZvcihqID0gMDsgcGNpX2RyaXZlcnNbal0gIT0gMDsgaisrKXsKKwkJZHJpdmVyID0gcGNpX2RyaXZlcnNbal07CisJCWlmIChkcml2ZXItPnR5cGUgIT0gdHlwZSkKIAkJCWNvbnRpbnVlOwotCQlsZW5ndGggPSBjaGVjay0+ZmllbGRzLmxlbmd0aCAqIDE2OwotCQlpZiAoIWxlbmd0aCkKKwkJaWYgKHNraXBfZHJpdmVyKSB7CisJCQlpZiAoc2tpcF9kcml2ZXIgPT0gZHJpdmVyKSAKKwkJCQlza2lwX2RyaXZlciA9IDA7CiAJCQljb250aW51ZTsKLQkJc3VtID0gMDsKLQkJZm9yIChpID0gMDsgaSA8IGxlbmd0aCA7ICsraSkKLQkJCXN1bSArPSBjaGVjay0+Y2hhcnNbaV07Ci0JCWlmIChzdW0gIT0gMCkKKwkJfQorCQlmb3IoaSA9IDA7IGkgPCBkcml2ZXItPmlkX2NvdW50OyBpKyspIHsKKwkJCWlmICgodmVuZG9yID09IGRyaXZlci0+aWRzW2ldLnZlbmRvcikgJiYKKwkJCSAgICAoZGV2aWNlID09IGRyaXZlci0+aWRzW2ldLmRldl9pZCkpIHsKKwkJCQkKKwkJCQlkZXYtPmRyaXZlciA9IGRyaXZlcjsKKwkJCQlkZXYtPm5hbWUgICA9IGRyaXZlci0+aWRzW2ldLm5hbWU7CisKKwkJCQlnb3RvIG91dDsKKwkJCX0KKwkJfQorCX0KKwlpZiAoIWNsYXNzKSB7CisJCWdvdG8gb3V0OworCX0KKwlmb3IoaiA9IDA7IHBjaV9kcml2ZXJzW2pdICE9IDA7IGorKyl7CisJCWRyaXZlciA9IHBjaV9kcml2ZXJzW2pdOworCQlpZiAoZHJpdmVyLT50eXBlICE9IHR5cGUpCiAJCQljb250aW51ZTsKLQkJaWYgKGNoZWNrLT5maWVsZHMucmV2aXNpb24gIT0gMCkgewotCQkJcHJpbnRmKCJwY2liaW9zX2luaXQgOiB1bnN1cHBvcnRlZCByZXZpc2lvbiAlZCBhdCAlI1gsIG1haWwgZHJld0Bjb2xvcmFkby5lZHVcbiIsCi0JCQkJY2hlY2stPmZpZWxkcy5yZXZpc2lvbiwgY2hlY2spOworCQlpZiAoc2tpcF9kcml2ZXIpIHsKKwkJCWlmIChza2lwX2RyaXZlciA9PSBkcml2ZXIpCisJCQkJc2tpcF9kcml2ZXIgPSAwOwogCQkJY29udGludWU7CiAJCX0KLSNpZglERUJVRwotCQlwcmludGYoInBjaWJpb3NfaW5pdCA6IEJJT1MzMiBTZXJ2aWNlIERpcmVjdG9yeSAiCi0JCQkic3RydWN0dXJlIGF0ICUjWFxuIiwgY2hlY2spOwotI2VuZGlmCi0JCWlmICghYmlvczMyX2VudHJ5KSB7Ci0JCQlpZiAoY2hlY2stPmZpZWxkcy5lbnRyeSA+PSAweDEwMDAwMCkgewotCQkJCXByaW50ZigicGNpYmlvc19pbml0OiBlbnRyeSBpbiBoaWdoICIKLQkJCQkJIm1lbW9yeSwgZ2l2aW5nIHVwXG4iKTsKLQkJCQlyZXR1cm47Ci0JCQl9IGVsc2UgewotCQkJCWJpb3MzMl9lbnRyeSA9IGNoZWNrLT5maWVsZHMuZW50cnk7Ci0jaWYJREVCVUcKLQkJCQlwcmludGYoInBjaWJpb3NfaW5pdCA6IEJJT1MzMiBTZXJ2aWNlIERpcmVjdG9yeSIKLQkJCQkJIiBlbnRyeSBhdCAlI1hcbiIsIGJpb3MzMl9lbnRyeSk7Ci0jZW5kaWYKLQkJCQliaW9zMzJfaW5kaXJlY3QuYWRkcmVzcyA9IGJpb3MzMl9lbnRyeTsKLQkJCX0KKwkJaWYgKGxhc3RfZHJpdmVyID09IGRyaXZlcikKKwkJCWNvbnRpbnVlOworCQlpZiAoKGNsYXNzID4+IDgpID09IGRyaXZlci0+Y2xhc3MpIHsKKwkJCWRldi0+ZHJpdmVyID0gZHJpdmVyOworCQkJZGV2LT5uYW1lICAgPSBkcml2ZXItPm5hbWU7CisJCQlnb3RvIG91dDsKIAkJfQogCX0KLQlpZiAoYmlvczMyX2VudHJ5KQotCQljaGVja19wY2liaW9zKCk7Cisgb3V0OgorCXJldHVybjsKIH0KLSNlbmRpZgkvKiBDT05GSUdfUENJX0RJUkVDVCBub3QgZGVmaW5lZCovCiAKLXN0YXRpYyB2b2lkIHNjYW5fYnVzKHN0cnVjdCBwY2lfZGV2aWNlICpwY2lkZXYpCit2b2lkIHNjYW5fcGNpX2J1cyhpbnQgdHlwZSwgc3RydWN0IHBjaV9kZXZpY2UgKmRldikKIHsKLQl1bnNpZ25lZCBpbnQgZGV2Zm4sIGwsIGJ1cywgYnVzZXM7CisJdW5zaWduZWQgaW50IGZpcnN0X2J1cywgZmlyc3RfZGV2Zm47CisJY29uc3Qgc3RydWN0IHBjaV9kcml2ZXIgKmZpcnN0X2RyaXZlcjsKKwl1bnNpZ25lZCBpbnQgZGV2Zm4sIGJ1cywgYnVzZXM7CiAJdW5zaWduZWQgY2hhciBoZHJfdHlwZSA9IDA7Ci0JdW5zaWduZWQgc2hvcnQgdmVuZG9yLCBkZXZpY2U7Ci0JdW5zaWduZWQgaW50IG1lbWJhc2UsIGlvYWRkciwgcm9tYWRkcjsKLQlpbnQgaSwgcmVnOwotCXVuc2lnbmVkIGludCBwY2lfaW9hZGRyID0gMDsKLQorCXVpbnQzMl90IGNsYXNzOworCXVpbnQxNl90IHZlbmRvciwgZGV2aWNlOworCXVpbnQzMl90IGwsIG1lbWJhc2UsIGlvYWRkciwgcm9tYWRkcjsKKwlpbnQgcmVnOworCisJRW50ZXJGdW5jdGlvbigic2Nhbl9wY2lfYnVzIik7CisJZmlyc3RfYnVzICAgID0gMDsKKwlmaXJzdF9kZXZmbiAgPSAwOworCWZpcnN0X2RyaXZlciA9IDA7CisJaWYgKGRldi0+ZHJpdmVyKSB7CisJCWZpcnN0X2RyaXZlciA9IGRldi0+ZHJpdmVyOworCQlmaXJzdF9idXMgICAgPSBkZXYtPmJ1czsKKwkJZmlyc3RfZGV2Zm4gID0gZGV2LT5kZXZmbjsKKwkJLyogUmUgcmVhZCB0aGUgaGVhZGVyIHR5cGUgb24gYSByZXN0YXJ0ICovCisJCXBjaWJpb3NfcmVhZF9jb25maWdfYnl0ZShmaXJzdF9idXMsIGZpcnN0X2RldmZuICYgfjB4NywgCisJCQlQQ0lfSEVBREVSX1RZUEUsICZoZHJfdHlwZSk7CisJCWRldi0+ZHJpdmVyICA9IDA7CisJCWRldi0+YnVzICAgICA9IDA7CisJCWRldi0+ZGV2Zm4gICA9IDA7CisJfQorCQkKIAkvKiBTY2FuIGFsbCBQQ0kgYnVzZXMsIHVudGlsIHdlIGZpbmQgb3VyIGNhcmQuCi0JICogV2UgY291bGQgYmUgc21hcnQgb25seSBzY2FuIHRoZSByZXF1aXJlZCBidXNzZXMgYnV0IHRoYXQKKwkgKiBXZSBjb3VsZCBiZSBzbWFydCBvbmx5IHNjYW4gdGhlIHJlcXVpcmVkIGJ1c2VzIGJ1dCB0aGF0CiAJICogaXMgZXJyb3IgcHJvbmUsIGFuZCB0cmlja3kuCi0JICogQnkgc2Nhbm5pbmcgYWxsIHBvc3NpYmxlIHBjaSBidXNzZXMgaW4gb3JkZXIgd2Ugc2hvdWxkIGZpbmQKKwkgKiBCeSBzY2FubmluZyBhbGwgcG9zc2libGUgcGNpIGJ1c2VzIGluIG9yZGVyIHdlIHNob3VsZCBmaW5kCiAJICogb3VyIGNhcmQgZXZlbnR1YWxseS4gCiAJICovCiAJYnVzZXM9MjU2OwotCWZvciAoYnVzID0gMDsgYnVzIDwgYnVzZXM7ICsrYnVzKSB7Ci0JCWZvciAoZGV2Zm4gPSAwOyBkZXZmbiA8IDB4ZmY7ICsrZGV2Zm4pIHsKKwlmb3IgKGJ1cyA9IGZpcnN0X2J1czsgYnVzIDwgYnVzZXM7ICsrYnVzKSB7CisJCWZvciAoZGV2Zm4gPSBmaXJzdF9kZXZmbjsgZGV2Zm4gPCAweGZmOyArK2RldmZuLCBmaXJzdF9kcml2ZXIgPSAwKSB7CiAJCQlpZiAoUENJX0ZVTkMgKGRldmZuKSA9PSAwKQogCQkJCXBjaWJpb3NfcmVhZF9jb25maWdfYnl0ZShidXMsIGRldmZuLCBQQ0lfSEVBREVSX1RZUEUsICZoZHJfdHlwZSk7CiAJCQllbHNlIGlmICghKGhkcl90eXBlICYgMHg4MCkpCS8qIG5vdCBhIG11bHRpLWZ1bmN0aW9uIGRldmljZSAqLwpAQCAtNDIxLDYxICszMDEsOTAgQEAKIAkJCXBjaWJpb3NfcmVhZF9jb25maWdfZHdvcmQoYnVzLCBkZXZmbiwgUENJX1ZFTkRPUl9JRCwgJmwpOwogCQkJLyogc29tZSBicm9rZW4gYm9hcmRzIHJldHVybiAwIGlmIGEgc2xvdCBpcyBlbXB0eTogKi8KIAkJCWlmIChsID09IDB4ZmZmZmZmZmYgfHwgbCA9PSAweDAwMDAwMDAwKSB7Ci0JCQkJaGRyX3R5cGUgPSAwOwogCQkJCWNvbnRpbnVlOwogCQkJfQogCQkJdmVuZG9yID0gbCAmIDB4ZmZmZjsKIAkJCWRldmljZSA9IChsID4+IDE2KSAmIDB4ZmZmZjsKIAorCQkJcGNpYmlvc19yZWFkX2NvbmZpZ19kd29yZChidXMsIGRldmZuLCBQQ0lfUkVWSVNJT04sICZsKTsKKwkJCWNsYXNzID0gKGwgPj4gOCkgJiAweGZmZmZmZjsKICNpZglERUJVRwotCQkJcHJpbnRmKCJidXMgJWhoWCwgZnVuY3Rpb24gJWhoWCwgdmVuZG9yICVoWCwgZGV2aWNlICVoWFxuIiwKLQkJCQlidXMsIGRldmZuLCB2ZW5kb3IsIGRldmljZSk7CisJCXsKKwkJCWludCBpOworCQkJcHJpbnRmKCIlaGh4OiVoaHguJWhoeCBbJWhYLyVoWF0gLS0tLSAiLAorCQkJCWJ1cywgUENJX1NMT1QoZGV2Zm4pLCBQQ0lfRlVOQyhkZXZmbiksCisJCQkJdmVuZG9yLCBkZXZpY2UpOworI2lmCURFQlVHID4gMQorCQkJZm9yKGkgPSAwOyBpIDwgMjU2OyBpKyspIHsKKwkJCQl1bnNpZ25lZCBjaGFyIGJ5dGU7CisJCQkJaWYgKChpICYgMHhmKSA9PSAwKSB7CisJCQkJCXByaW50ZigiJWhoeDogIiwgaSk7CisJCQkJfQorCQkJCXBjaWJpb3NfcmVhZF9jb25maWdfYnl0ZShidXMsIGRldmZuLCBpLCAmYnl0ZSk7CisJCQkJcHJpbnRmKCIlaGh4ICIsIGJ5dGUpOworCQkJCWlmICgoaSAmIDB4ZikgPT0gMHhmKSB7CisJCQkJCXByaW50ZigiXG4iKTsKKwkJCQl9CisJCQl9CisjZW5kaWYKKworCQl9CisjZW5kaWYKKwkJCXNjYW5fZHJpdmVycyh0eXBlLCBjbGFzcywgdmVuZG9yLCBkZXZpY2UsIGZpcnN0X2RyaXZlciwgZGV2KTsKKwkJCWlmICghZGV2LT5kcml2ZXIpeworI2lmIERFQlVHCisJCQkJcHJpbnRmKCJObyBkcml2ZXIgZml0LlxuIik7CiAjZW5kaWYKLQkJCWZvciAoaSA9IDA7IHBjaWRldltpXS52ZW5kb3IgIT0gMDsgaSsrKSB7Ci0JCQkJaWYgKHZlbmRvciAhPSBwY2lkZXZbaV0udmVuZG9yCi0JCQkJICAgIHx8IGRldmljZSAhPSBwY2lkZXZbaV0uZGV2X2lkKQorCQkJCWNvbnRpbnVlOworCQkJfQorI2lmIERFQlVHCisJCQlwcmludGYoIkdldCBEcml2ZXI6XG4iKTsKKyNlbmRpZgorCQkJZGV2LT5kZXZmbiA9IGRldmZuOworCQkJZGV2LT5idXMgPSBidXM7CisJCQlkZXYtPmNsYXNzID0gY2xhc3M7CisJCQlkZXYtPnZlbmRvciA9IHZlbmRvcjsKKwkJCWRldi0+ZGV2X2lkID0gZGV2aWNlOworCQkJCisJCQkKKwkJCS8qIEdldCB0aGUgUk9NIGJhc2UgYWRkcmVzcyAqLworCQkJcGNpYmlvc19yZWFkX2NvbmZpZ19kd29yZChidXMsIGRldmZuLCAKKwkJCQlQQ0lfUk9NX0FERFJFU1MsICZyb21hZGRyKTsKKwkJCXJvbWFkZHIgPj49IDEwOworCQkJZGV2LT5yb21hZGRyID0gcm9tYWRkcjsKKwkJCQorCQkJLyogR2V0IHRoZSBgYG1lbWJhc2UnJyAqLworCQkJcGNpYmlvc19yZWFkX2NvbmZpZ19kd29yZChidXMsIGRldmZuLAorCQkJCVBDSV9CQVNFX0FERFJFU1NfMSwgJm1lbWJhc2UpOworCQkJZGV2LT5tZW1iYXNlID0gbWVtYmFzZTsKKwkJCQkKKwkJCS8qIEdldCB0aGUgYGBpb2FkZHInJyAqLworCQkJZm9yIChyZWcgPSBQQ0lfQkFTRV9BRERSRVNTXzA7IHJlZyA8PSBQQ0lfQkFTRV9BRERSRVNTXzU7IHJlZyArPSA0KSB7CisJCQkJcGNpYmlvc19yZWFkX2NvbmZpZ19kd29yZChidXMsIGRldmZuLCByZWcsICZpb2FkZHIpOworCQkJCWlmICgoaW9hZGRyICYgUENJX0JBU0VfQUREUkVTU19JT19NQVNLKSA9PSAwIHx8IChpb2FkZHIgJiBQQ0lfQkFTRV9BRERSRVNTX1NQQUNFX0lPKSA9PSAwKQogCQkJCQljb250aW51ZTsKLQkJCQlwY2lkZXZbaV0uZGV2Zm4gPSBkZXZmbjsKLQkJCQlwY2lkZXZbaV0uYnVzID0gYnVzOwotCQkJCWZvciAocmVnID0gUENJX0JBU0VfQUREUkVTU18wOyByZWcgPD0gUENJX0JBU0VfQUREUkVTU181OyByZWcgKz0gNCkgewotCQkJCQlwY2liaW9zX3JlYWRfY29uZmlnX2R3b3JkKGJ1cywgZGV2Zm4sIHJlZywgJmlvYWRkcik7Ci0KLQkJCQkJaWYgKChpb2FkZHIgJiBQQ0lfQkFTRV9BRERSRVNTX0lPX01BU0spID09IDAgfHwgKGlvYWRkciAmIFBDSV9CQVNFX0FERFJFU1NfU1BBQ0VfSU8pID09IDApCi0JCQkJCQljb250aW51ZTsKLQkJCQkJLyogU3RyaXAgdGhlIEkvTyBhZGRyZXNzIG91dCBvZiB0aGUgcmV0dXJuZWQgdmFsdWUgKi8KLQkJCQkJaW9hZGRyICY9IFBDSV9CQVNFX0FERFJFU1NfSU9fTUFTSzsKLQkJCQkJLyogR2V0IHRoZSBtZW1vcnkgYmFzZSBhZGRyZXNzICovCi0JCQkJCXBjaWJpb3NfcmVhZF9jb25maWdfZHdvcmQoYnVzLCBkZXZmbiwKLQkJCQkJCVBDSV9CQVNFX0FERFJFU1NfMSwgJm1lbWJhc2UpOwotCQkJCQkvKiBHZXQgdGhlIFJPTSBiYXNlIGFkZHJlc3MgKi8KLQkJCQkJcGNpYmlvc19yZWFkX2NvbmZpZ19kd29yZChidXMsIGRldmZuLCBQQ0lfUk9NX0FERFJFU1MsICZyb21hZGRyKTsKLQkJCQkJcm9tYWRkciA+Pj0gMTA7Ci0JCQkJCXByaW50ZigiRm91bmQgJXMgYXQgJSNoeCwgUk9NIGFkZHJlc3MgJSNoeFxuIiwKLQkJCQkJCXBjaWRldltpXS5uYW1lLCBpb2FkZHIsIHJvbWFkZHIpOwotCQkJCQkvKiBUYWtlIHRoZSBmaXJzdCBvbmUgb3IgdGhlIG9uZSB0aGF0IG1hdGNoZXMgaW4gYm9vdCBST00gYWRkcmVzcyAqLwotCQkJCQlpZiAocGNpX2lvYWRkciA9PSAwIHx8IHJvbWFkZHIgPT0gKCh1bnNpZ25lZCBsb25nKSByb20ucm9tX3NlZ21lbnQgPDwgNCkpIHsKLQkJCQkJCXBjaWRldltpXS5tZW1iYXNlID0gbWVtYmFzZTsKLQkJCQkJCXBjaWRldltpXS5pb2FkZHIgPSBpb2FkZHI7Ci0JCQkJCQlyZXR1cm47Ci0JCQkJCX0KLQkJCQl9CisJCQkJCisJCQkJCisJCQkJLyogU3RyaXAgdGhlIEkvTyBhZGRyZXNzIG91dCBvZiB0aGUgcmV0dXJuZWQgdmFsdWUgKi8KKwkJCQlpb2FkZHIgJj0gUENJX0JBU0VfQUREUkVTU19JT19NQVNLOworCQkJCQorCQkJCS8qIFRha2UgdGhlIGZpcnN0IG9uZSBvciB0aGUgb25lIHRoYXQgbWF0Y2hlcyBpbiBib290IFJPTSBhZGRyZXNzICovCisJCQkJZGV2LT5pb2FkZHIgPSBpb2FkZHI7CiAJCQl9CisjaWYgREVCVUcgPiAyCisJCQlwcmludGYoIkZvdW5kICVzIFJPTSBhZGRyZXNzICUjaHhcbiIsCisJCQkJZGV2LT5uYW1lLCByb21hZGRyKTsKKyNlbmRpZgorCQkJTGVhdmVGdW5jdGlvbigic2Nhbl9wY2lfYnVzIik7CisJCQlyZXR1cm47CiAJCX0KKwkJZmlyc3RfZGV2Zm4gPSAwOwogCX0KKwlmaXJzdF9idXMgPSAwOworCUxlYXZlRnVuY3Rpb24oInNjYW5fcGNpX2J1cyIpOwogfQogCi12b2lkIGV0aF9wY2lfaW5pdChzdHJ1Y3QgcGNpX2RldmljZSAqcGNpZGV2KQotewotI2lmbmRlZglDT05GSUdfUENJX0RJUkVDVAotCXBjaWJpb3NfaW5pdCgpOwotCWlmICghcGNpYmlvc19lbnRyeSkgewotCQlwcmludGYoInBjaV9pbml0OiBubyBCSU9TMzIgZGV0ZWN0ZWRcbiIpOwotCQlyZXR1cm47Ci0JfQotI2VuZGlmCi0Jc2Nhbl9idXMocGNpZGV2KTsKLQkvKiByZXR1cm4gdmFsdWVzIGFyZSBpbiBwY2lkZXYgc3RydWN0dXJlcyAqLwotfQorCiAKIC8qCiAgKglTZXQgZGV2aWNlIHRvIGJlIGEgYnVzbWFzdGVyIGluIGNhc2UgQklPUyBuZWdsZWN0ZWQgdG8gZG8gc28uCkBAIC00ODksMTMgKzM5OCwxMzQgQEAKIAlwY2liaW9zX3JlYWRfY29uZmlnX3dvcmQocC0+YnVzLCBwLT5kZXZmbiwgUENJX0NPTU1BTkQsICZwY2lfY29tbWFuZCk7CiAJbmV3X2NvbW1hbmQgPSBwY2lfY29tbWFuZCB8IFBDSV9DT01NQU5EX01BU1RFUnxQQ0lfQ09NTUFORF9JTzsKIAlpZiAocGNpX2NvbW1hbmQgIT0gbmV3X2NvbW1hbmQpIHsKLQkJcHJpbnRmKCJUaGUgUENJIEJJT1MgaGFzIG5vdCBlbmFibGVkIHRoaXMgZGV2aWNlIVxuVXBkYXRpbmcgUENJIGNvbW1hbmQgJWhYLT4laFguIHBjaV9idXMgJWhoWCBwY2lfZGV2aWNlX2ZuICVoaFhcbiIsCisjaWYgREVCVUcgPiAwCisJCXByaW50ZigKKwkJCSJUaGUgUENJIEJJT1MgaGFzIG5vdCBlbmFibGVkIHRoaXMgZGV2aWNlIVxuIgorCQkJIlVwZGF0aW5nIFBDSSBjb21tYW5kICVoWC0+JWhYLiBwY2lfYnVzICVoaFggcGNpX2RldmljZV9mbiAlaGhYXG4iLAogCQkJICAgcGNpX2NvbW1hbmQsIG5ld19jb21tYW5kLCBwLT5idXMsIHAtPmRldmZuKTsKKyNlbmRpZgogCQlwY2liaW9zX3dyaXRlX2NvbmZpZ193b3JkKHAtPmJ1cywgcC0+ZGV2Zm4sIFBDSV9DT01NQU5ELCBuZXdfY29tbWFuZCk7CiAJfQogCXBjaWJpb3NfcmVhZF9jb25maWdfYnl0ZShwLT5idXMsIHAtPmRldmZuLCBQQ0lfTEFURU5DWV9USU1FUiwgJnBjaV9sYXRlbmN5KTsKIAlpZiAocGNpX2xhdGVuY3kgPCAzMikgewotCQlwcmludGYoIlBDSSBsYXRlbmN5IHRpbWVyIChDRkxUKSBpcyB1bnJlYXNvbmFibHkgbG93IGF0ICVkLiBTZXR0aW5nIHRvIDMyIGNsb2Nrcy5cbiIsIHBjaV9sYXRlbmN5KTsKKyNpZiBERUJVRyA+IDAKKwkJcHJpbnRmKCJQQ0kgbGF0ZW5jeSB0aW1lciAoQ0ZMVCkgaXMgdW5yZWFzb25hYmx5IGxvdyBhdCAlZC4gU2V0dGluZyB0byAzMiBjbG9ja3MuXG4iLCAKKwkJCXBjaV9sYXRlbmN5KTsKKyNlbmRpZgogCQlwY2liaW9zX3dyaXRlX2NvbmZpZ19ieXRlKHAtPmJ1cywgcC0+ZGV2Zm4sIFBDSV9MQVRFTkNZX1RJTUVSLCAzMik7CiAJfQogfQorCisvKgorICogRmluZCB0aGUgc3RhcnQgb2YgYSBwY2kgcmVzb3VyY2UuCisgKi8KK3Vuc2lnbmVkIGxvbmcgcGNpX2Jhcl9zdGFydChzdHJ1Y3QgcGNpX2RldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgaW5kZXgpCit7CisJdWludDMyX3QgbG8sIGhpOworCXVuc2lnbmVkIGxvbmcgYmFyOworCXBjaV9yZWFkX2NvbmZpZ19kd29yZChkZXYsIGluZGV4LCAmbG8pOworCWlmIChsbyAmIFBDSV9CQVNFX0FERFJFU1NfU1BBQ0VfSU8pIHsKKwkJYmFyID0gbG8gJiBQQ0lfQkFTRV9BRERSRVNTX0lPX01BU0s7CisJfSBlbHNlIHsKKwkJYmFyID0gMDsKKwkJaWYgKChsbyAmIFBDSV9CQVNFX0FERFJFU1NfTUVNX1RZUEVfTUFTSykgPT0gUENJX0JBU0VfQUREUkVTU19NRU1fVFlQRV82NCkgeworCQkJcGNpX3JlYWRfY29uZmlnX2R3b3JkKGRldiwgaW5kZXggKyA0LCAmaGkpOworCQkJaWYgKGhpKSB7CisJCQkJaWYgKHNpemVvZih1bnNpZ25lZCBsb25nKSA+IHNpemVvZih1aW50MzJfdCkpIHsKKwkJCQkJYmFyID0gaGk7CisJCQkJCS8qIEl0J3MgUkVBTExZIGludGVyZXN0aW5nOi0pICovCisJCQkJCWJhciA8PD0zMjsKKwkJCQl9CisJCQkJZWxzZSB7CisJCQkJCXByaW50ZigiVW5oYW5kbGVkIDY0Yml0IEJBUlxuIik7CisJCQkJCXJldHVybiAtMVVMOworCQkJCX0KKwkJCX0KKwkJfQorCQliYXIgfD0gbG8gJiBQQ0lfQkFTRV9BRERSRVNTX01FTV9NQVNLOworCX0KKwlyZXR1cm4gYmFyICsgcGNpYmlvc19idXNfYmFzZShkZXYtPmJ1cyk7Cit9CisKKy8qCisgKiBGaW5kIHRoZSBzaXplIG9mIGEgcGNpIHJlc291cmNlLgorICovCit1bnNpZ25lZCBsb25nIHBjaV9iYXJfc2l6ZShzdHJ1Y3QgcGNpX2RldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgYmFyKQoreworCXVpbnQzMl90IHN0YXJ0LCBzaXplOworCS8qIFNhdmUgdGhlIG9yaWdpbmFsIGJhciAqLworCXBjaV9yZWFkX2NvbmZpZ19kd29yZChkZXYsIGJhciwgJnN0YXJ0KTsKKwkvKiBDb21wdXRlIHdoaWNoIGJpdHMgY2FuIGJlIHNldCAqLworCXBjaV93cml0ZV9jb25maWdfZHdvcmQoZGV2LCBiYXIsIH4wKTsKKwlwY2lfcmVhZF9jb25maWdfZHdvcmQoZGV2LCBiYXIsICZzaXplKTsKKwkvKiBSZXN0b3JlIHRoZSBvcmlnaW5hbCBzaXplICovCisJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChkZXYsIGJhciwgc3RhcnQpOworCS8qIEZpbmQgdGhlIHNpZ25pZmljYW50IGJpdHMgKi8KKwlpZiAoc3RhcnQgJiBQQ0lfQkFTRV9BRERSRVNTX1NQQUNFX0lPKSB7CisJCXNpemUgJj0gUENJX0JBU0VfQUREUkVTU19JT19NQVNLOworCX0gZWxzZSB7CisJCXNpemUgJj0gUENJX0JBU0VfQUREUkVTU19NRU1fTUFTSzsKKwl9CisJLyogRmluZCB0aGUgbG93ZXN0IGJpdCBzZXQgKi8KKwlzaXplID0gc2l6ZSAmIH4oc2l6ZSAtIDEpOworCXJldHVybiBzaXplOworfQorCisvKioKKyAqIHBjaV9maW5kX2NhcGFiaWxpdHkgLSBxdWVyeSBmb3IgZGV2aWNlcycgY2FwYWJpbGl0aWVzIAorICogQGRldjogUENJIGRldmljZSB0byBxdWVyeQorICogQGNhcDogY2FwYWJpbGl0eSBjb2RlCisgKgorICogVGVsbCBpZiBhIGRldmljZSBzdXBwb3J0cyBhIGdpdmVuIFBDSSBjYXBhYmlsaXR5LgorICogUmV0dXJucyB0aGUgYWRkcmVzcyBvZiB0aGUgcmVxdWVzdGVkIGNhcGFiaWxpdHkgc3RydWN0dXJlIHdpdGhpbiB0aGUKKyAqIGRldmljZSdzIFBDSSBjb25maWd1cmF0aW9uIHNwYWNlIG9yIDAgaW4gY2FzZSB0aGUgZGV2aWNlIGRvZXMgbm90CisgKiBzdXBwb3J0IGl0LiAgUG9zc2libGUgdmFsdWVzIGZvciBAY2FwOgorICoKKyAqICAlUENJX0NBUF9JRF9QTSAgICAgICAgICAgUG93ZXIgTWFuYWdlbWVudCAKKyAqCisgKiAgJVBDSV9DQVBfSURfQUdQICAgICAgICAgIEFjY2VsZXJhdGVkIEdyYXBoaWNzIFBvcnQgCisgKgorICogICVQQ0lfQ0FQX0lEX1ZQRCAgICAgICAgICBWaXRhbCBQcm9kdWN0IERhdGEgCisgKgorICogICVQQ0lfQ0FQX0lEX1NMT1RJRCAgICAgICBTbG90IElkZW50aWZpY2F0aW9uIAorICoKKyAqICAlUENJX0NBUF9JRF9NU0kgICAgICAgICAgTWVzc2FnZSBTaWduYWxsZWQgSW50ZXJydXB0cworICoKKyAqICAlUENJX0NBUF9JRF9DSFNXUCAgICAgICAgQ29tcGFjdFBDSSBIb3RTd2FwIAorICovCitpbnQgcGNpX2ZpbmRfY2FwYWJpbGl0eShzdHJ1Y3QgcGNpX2RldmljZSAqZGV2LCBpbnQgY2FwKQoreworCXVpbnQxNl90IHN0YXR1czsKKwl1aW50OF90IHBvcywgaWQ7CisJdWludDhfdCBoZHJfdHlwZTsKKwlpbnQgdHRsID0gNDg7CisKKwlwY2lfcmVhZF9jb25maWdfd29yZChkZXYsIFBDSV9TVEFUVVMsICZzdGF0dXMpOworCWlmICghKHN0YXR1cyAmIFBDSV9TVEFUVVNfQ0FQX0xJU1QpKQorCQlyZXR1cm4gMDsKKwlwY2lfcmVhZF9jb25maWdfYnl0ZShkZXYsIFBDSV9IRUFERVJfVFlQRSwgJmhkcl90eXBlKTsKKwlzd2l0Y2ggKGhkcl90eXBlICYgMHg3RikgeworCWNhc2UgUENJX0hFQURFUl9UWVBFX05PUk1BTDoKKwljYXNlIFBDSV9IRUFERVJfVFlQRV9CUklER0U6CisJZGVmYXVsdDoKKwkJcGNpX3JlYWRfY29uZmlnX2J5dGUoZGV2LCBQQ0lfQ0FQQUJJTElUWV9MSVNULCAmcG9zKTsKKwkJYnJlYWs7CisJY2FzZSBQQ0lfSEVBREVSX1RZUEVfQ0FSREJVUzoKKwkJcGNpX3JlYWRfY29uZmlnX2J5dGUoZGV2LCBQQ0lfQ0JfQ0FQQUJJTElUWV9MSVNULCAmcG9zKTsKKwkJYnJlYWs7CisJfQorCXdoaWxlICh0dGwtLSAmJiBwb3MgPj0gMHg0MCkgeworCQlwb3MgJj0gfjM7CisJCXBjaV9yZWFkX2NvbmZpZ19ieXRlKGRldiwgcG9zICsgUENJX0NBUF9MSVNUX0lELCAmaWQpOworI2lmCURFQlVHID4gMAorCQlwcmludGYoIkNhcGFiaWxpdHk6ICVkXG4iLCBpZCk7CisjZW5kaWYKKwkJaWYgKGlkID09IDB4ZmYpCisJCQlicmVhazsKKwkJaWYgKGlkID09IGNhcCkKKwkJCXJldHVybiBwb3M7CisJCXBjaV9yZWFkX2NvbmZpZ19ieXRlKGRldiwgcG9zICsgUENJX0NBUF9MSVNUX05FWFQsICZwb3MpOworCX0KKwlyZXR1cm4gMDsKK30KKwpkaWZmIC1OYXVyIGdydWItMC45Ny5vcmlnL25ldGJvb3QvcGNpLmggZ3J1Yi0wLjk3L25ldGJvb3QvcGNpLmgKLS0tIGdydWItMC45Ny5vcmlnL25ldGJvb3QvcGNpLmgJMjAwMy0wNy0wOSAxMTo0NTozOC4wMDAwMDAwMDAgKzAwMDAKKysrIGdydWItMC45Ny9uZXRib290L3BjaS5oCTIwMDUtMDgtMzEgMjE6MzE6NDYuMDAwMDAwMDAwICswMDAwCkBAIC0xLDQgKzEsNCBAQAotI2lmbmRlZglQQ0lfSAorI2lmICFkZWZpbmVkKFBDSV9IKSAmJiBkZWZpbmVkKENPTkZJR19QQ0kpCiAjZGVmaW5lIFBDSV9ICiAKIC8qCkBAIC0yMSwxMCArMjEsMTkgQEAKICAqIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICAqLwogCisjaW5jbHVkZSAicGNpX2lkcy5oIgorCiAjZGVmaW5lIFBDSV9DT01NQU5EX0lPCQkJMHgxCS8qIEVuYWJsZSByZXNwb25zZSBpbiBJL08gc3BhY2UgKi8KICNkZWZpbmUgUENJX0NPTU1BTkRfTUVNCQkJMHgyCS8qIEVuYWJsZSByZXNwb25zZSBpbiBtZW0gc3BhY2UgKi8KICNkZWZpbmUgUENJX0NPTU1BTkRfTUFTVEVSCQkweDQJLyogRW5hYmxlIGJ1cyBtYXN0ZXJpbmcgKi8KICNkZWZpbmUgUENJX0xBVEVOQ1lfVElNRVIJCTB4MGQJLyogOCBiaXRzICovCisjZGVmaW5lIFBDSV9DT01NQU5EX1NQRUNJQUwJCTB4OAkvKiBFbmFibGUgcmVzcG9uc2UgdG8gc3BlY2lhbCBjeWNsZXMgKi8KKyNkZWZpbmUgUENJX0NPTU1BTkRfSU5WQUxJREFURQkJMHgxMAkvKiBVc2UgbWVtb3J5IHdyaXRlIGFuZCBpbnZhbGlkYXRlICovCisjZGVmaW5lICBQQ0lfQ09NTUFORF9WR0FfUEFMRVRURSAweDIwCS8qIEVuYWJsZSBwYWxldHRlIHNub29waW5nICovCisjZGVmaW5lICBQQ0lfQ09NTUFORF9QQVJJVFkJMHg0MAkvKiBFbmFibGUgcGFyaXR5IGNoZWNraW5nICovCisjZGVmaW5lICBQQ0lfQ09NTUFORF9XQUlUIAkweDgwCS8qIEVuYWJsZSBhZGRyZXNzL2RhdGEgc3RlcHBpbmcgKi8KKyNkZWZpbmUgIFBDSV9DT01NQU5EX1NFUlIJMHgxMDAJLyogRW5hYmxlIFNFUlIgKi8KKyNkZWZpbmUgIFBDSV9DT01NQU5EX0ZBU1RfQkFDSwkweDIwMAkvKiBFbmFibGUgYmFjay10by1iYWNrIHdyaXRlcyAqLwogCiAjZGVmaW5lIFBDSUJJT1NfUENJX0ZVTkNUSU9OX0lEICAgICAgICAgMHhiMVhYCiAjZGVmaW5lIFBDSUJJT1NfUENJX0JJT1NfUFJFU0VOVCAgICAgICAgMHhiMTAxCkBAIC00MiwxMCArNTEsMzcgQEAKICNkZWZpbmUgUENJX0RFVklDRV9JRCAgICAgICAgICAgMHgwMiAgICAvKiAxNiBiaXRzICovCiAjZGVmaW5lIFBDSV9DT01NQU5EICAgICAgICAgICAgIDB4MDQgICAgLyogMTYgYml0cyAqLwogCisjZGVmaW5lIFBDSV9TVEFUVVMJCTB4MDYJLyogMTYgYml0cyAqLworI2RlZmluZSAgUENJX1NUQVRVU19DQVBfTElTVAkweDEwCS8qIFN1cHBvcnQgQ2FwYWJpbGl0eSBMaXN0ICovCisjZGVmaW5lICBQQ0lfU1RBVFVTXzY2TUhaCTB4MjAJLyogU3VwcG9ydCA2NiBNaHogUENJIDIuMSBidXMgKi8KKyNkZWZpbmUgIFBDSV9TVEFUVVNfVURGCQkweDQwCS8qIFN1cHBvcnQgVXNlciBEZWZpbmFibGUgRmVhdHVyZXMgW29ic29sZXRlXSAqLworI2RlZmluZSAgUENJX1NUQVRVU19GQVNUX0JBQ0sJMHg4MAkvKiBBY2NlcHQgZmFzdC1iYWNrIHRvIGJhY2sgKi8KKyNkZWZpbmUgIFBDSV9TVEFUVVNfUEFSSVRZCTB4MTAwCS8qIERldGVjdGVkIHBhcml0eSBlcnJvciAqLworI2RlZmluZSAgUENJX1NUQVRVU19ERVZTRUxfTUFTSwkweDYwMAkvKiBERVZTRUwgdGltaW5nICovCisjZGVmaW5lICBQQ0lfU1RBVFVTX0RFVlNFTF9GQVNUCTB4MDAwCQorI2RlZmluZSAgUENJX1NUQVRVU19ERVZTRUxfTUVESVVNIDB4MjAwCisjZGVmaW5lICBQQ0lfU1RBVFVTX0RFVlNFTF9TTE9XIDB4NDAwCisjZGVmaW5lICBQQ0lfU1RBVFVTX1NJR19UQVJHRVRfQUJPUlQgMHg4MDAgLyogU2V0IG9uIHRhcmdldCBhYm9ydCAqLworI2RlZmluZSAgUENJX1NUQVRVU19SRUNfVEFSR0VUX0FCT1JUIDB4MTAwMCAvKiBNYXN0ZXIgYWNrIG9mICIgKi8KKyNkZWZpbmUgIFBDSV9TVEFUVVNfUkVDX01BU1RFUl9BQk9SVCAweDIwMDAgLyogU2V0IG9uIG1hc3RlciBhYm9ydCAqLworI2RlZmluZSAgUENJX1NUQVRVU19TSUdfU1lTVEVNX0VSUk9SIDB4NDAwMCAvKiBTZXQgd2hlbiB3ZSBkcml2ZSBTRVJSICovCisjZGVmaW5lICBQQ0lfU1RBVFVTX0RFVEVDVEVEX1BBUklUWSAweDgwMDAgLyogU2V0IG9uIHBhcml0eSBlcnJvciAqLworCiAjZGVmaW5lIFBDSV9SRVZJU0lPTiAgICAgICAgICAgIDB4MDggICAgLyogOCBiaXRzICAqLworI2RlZmluZSBQQ0lfUkVWSVNJT05fSUQgICAgICAgICAweDA4ICAgIC8qIDggYml0cyAgKi8KKyNkZWZpbmUgUENJX0NMQVNTX1JFVklTSU9OICAgICAgMHgwOCAgICAvKiAzMiBiaXRzICAqLwogI2RlZmluZSBQQ0lfQ0xBU1NfQ09ERSAgICAgICAgICAweDBiICAgIC8qIDggYml0cyAqLwogI2RlZmluZSBQQ0lfU1VCQ0xBU1NfQ09ERSAgICAgICAweDBhICAgIC8qIDggYml0cyAqLwogI2RlZmluZSBQQ0lfSEVBREVSX1RZUEUgICAgICAgICAweDBlICAgIC8qIDggYml0cyAqLworI2RlZmluZSAgUENJX0hFQURFUl9UWVBFX05PUk1BTAkwCisjZGVmaW5lICBQQ0lfSEVBREVSX1RZUEVfQlJJREdFIDEKKyNkZWZpbmUgIFBDSV9IRUFERVJfVFlQRV9DQVJEQlVTIDIKKworCisvKiBIZWFkZXIgdHlwZSAwIChub3JtYWwgZGV2aWNlcykgKi8KKyNkZWZpbmUgUENJX0NBUkRCVVNfQ0lTCQkweDI4CisjZGVmaW5lIFBDSV9TVUJTWVNURU1fVkVORE9SX0lECTB4MmMKKyNkZWZpbmUgUENJX1NVQlNZU1RFTV9JRAkweDJlICAKIAogI2RlZmluZSBQQ0lfQkFTRV9BRERSRVNTXzAgICAgICAweDEwICAgIC8qIDMyIGJpdHMgKi8KICNkZWZpbmUgUENJX0JBU0VfQUREUkVTU18xICAgICAgMHgxNCAgICAvKiAzMiBiaXRzICovCkBAIC01NCwxNSArOTAsMTU1IEBACiAjZGVmaW5lIFBDSV9CQVNFX0FERFJFU1NfNCAgICAgIDB4MjAgICAgLyogMzIgYml0cyAqLwogI2RlZmluZSBQQ0lfQkFTRV9BRERSRVNTXzUgICAgICAweDI0ICAgIC8qIDMyIGJpdHMgKi8KIAorI2RlZmluZSBQQ0lfQkFTRV9BRERSRVNTX01FTV9UWVBFX01BU0sgMHgwNgorI2RlZmluZSBQQ0lfQkFTRV9BRERSRVNTX01FTV9UWVBFXzMyCTB4MDAJLyogMzIgYml0IGFkZHJlc3MgKi8KKyNkZWZpbmUgUENJX0JBU0VfQUREUkVTU19NRU1fVFlQRV8xTQkweDAyCS8qIEJlbG93IDFNIFtvYnNvbGV0ZV0gKi8KKyNkZWZpbmUgUENJX0JBU0VfQUREUkVTU19NRU1fVFlQRV82NAkweDA0CS8qIDY0IGJpdCBhZGRyZXNzICovCisKICNpZm5kZWYJUENJX0JBU0VfQUREUkVTU19JT19NQVNLCiAjZGVmaW5lCVBDSV9CQVNFX0FERFJFU1NfSU9fTUFTSyAgICAgICAofjB4MDMpCiAjZW5kaWYKKyNpZm5kZWYJUENJX0JBU0VfQUREUkVTU19NRU1fTUFTSworI2RlZmluZQlQQ0lfQkFTRV9BRERSRVNTX01FTV9NQVNLICAgICAgICh+MHgwZikKKyNlbmRpZgogI2RlZmluZQlQQ0lfQkFTRV9BRERSRVNTX1NQQUNFX0lPCTB4MDEKICNkZWZpbmUJUENJX1JPTV9BRERSRVNTCQkweDMwCS8qIDMyIGJpdHMgKi8KICNkZWZpbmUJUENJX1JPTV9BRERSRVNTX0VOQUJMRQkweDAxCS8qIFdyaXRlIDEgdG8gZW5hYmxlIFJPTSwKIAkJCQkJICAgYml0cyAzMS4uMTEgYXJlIGFkZHJlc3MsCiAJCQkJCSAgIDEwLi4yIGFyZSByZXNlcnZlZCAqLwogCisjZGVmaW5lIFBDSV9DQVBBQklMSVRZX0xJU1QJMHgzNAkvKiBPZmZzZXQgb2YgZmlyc3QgY2FwYWJpbGl0eSBsaXN0IGVudHJ5ICovCisKKyNkZWZpbmUgUENJX0lOVEVSUlVQVF9MSU5FCTB4M2MJLyogSVJRIG51bWJlciAoMC0xNSkgKi8KKyNkZWZpbmUgUENJX0lOVEVSUlVQVF9QSU4JMHgzZAkvKiBJUlEgcGluIG9uIFBDSSBidXMgKEEtRCkgKi8KKworLyogSGVhZGVyIHR5cGUgMSAoUENJLXRvLVBDSSBicmlkZ2VzKSAqLworI2RlZmluZSBQQ0lfUFJJTUFSWV9CVVMJCTB4MTgJLyogUHJpbWFyeSBidXMgbnVtYmVyICovCisjZGVmaW5lIFBDSV9TRUNPTkRBUllfQlVTCTB4MTkJLyogU2Vjb25kYXJ5IGJ1cyBudW1iZXIgKi8KKyNkZWZpbmUgUENJX1NVQk9SRElOQVRFX0JVUwkweDFhCS8qIEhpZ2hlc3QgYnVzIG51bWJlciBiZWhpbmQgdGhlIGJyaWRnZSAqLworI2RlZmluZSBQQ0lfU0VDX0xBVEVOQ1lfVElNRVIJMHgxYgkvKiBMYXRlbmN5IHRpbWVyIGZvciBzZWNvbmRhcnkgaW50ZXJmYWNlICovCisjZGVmaW5lIFBDSV9JT19CQVNFCQkweDFjCS8qIEkvTyByYW5nZSBiZWhpbmQgdGhlIGJyaWRnZSAqLworI2RlZmluZSBQQ0lfSU9fTElNSVQJCTB4MWQKKyNkZWZpbmUgIFBDSV9JT19SQU5HRV9UWVBFX01BU0sJMHgwZgkvKiBJL08gYnJpZGdpbmcgdHlwZSAqLworI2RlZmluZSAgUENJX0lPX1JBTkdFX1RZUEVfMTYJMHgwMAorI2RlZmluZSAgUENJX0lPX1JBTkdFX1RZUEVfMzIJMHgwMQorI2RlZmluZSAgUENJX0lPX1JBTkdFX01BU0sJfjB4MGYKKyNkZWZpbmUgUENJX1NFQ19TVEFUVVMJCTB4MWUJLyogU2Vjb25kYXJ5IHN0YXR1cyByZWdpc3Rlciwgb25seSBiaXQgMTQgdXNlZCAqLworI2RlZmluZSBQQ0lfTUVNT1JZX0JBU0UJCTB4MjAJLyogTWVtb3J5IHJhbmdlIGJlaGluZCAqLworI2RlZmluZSBQQ0lfTUVNT1JZX0xJTUlUCTB4MjIKKyNkZWZpbmUgIFBDSV9NRU1PUllfUkFOR0VfVFlQRV9NQVNLIDB4MGYKKyNkZWZpbmUgIFBDSV9NRU1PUllfUkFOR0VfTUFTSwl+MHgwZgorI2RlZmluZSBQQ0lfUFJFRl9NRU1PUllfQkFTRQkweDI0CS8qIFByZWZldGNoYWJsZSBtZW1vcnkgcmFuZ2UgYmVoaW5kICovCisjZGVmaW5lIFBDSV9QUkVGX01FTU9SWV9MSU1JVAkweDI2CisjZGVmaW5lICBQQ0lfUFJFRl9SQU5HRV9UWVBFX01BU0sgMHgwZgorI2RlZmluZSAgUENJX1BSRUZfUkFOR0VfVFlQRV8zMgkweDAwCisjZGVmaW5lICBQQ0lfUFJFRl9SQU5HRV9UWVBFXzY0CTB4MDEKKyNkZWZpbmUgIFBDSV9QUkVGX1JBTkdFX01BU0sJfjB4MGYKKyNkZWZpbmUgUENJX1BSRUZfQkFTRV9VUFBFUjMyCTB4MjgJLyogVXBwZXIgaGFsZiBvZiBwcmVmZXRjaGFibGUgbWVtb3J5IHJhbmdlICovCisjZGVmaW5lIFBDSV9QUkVGX0xJTUlUX1VQUEVSMzIJMHgyYworI2RlZmluZSBQQ0lfSU9fQkFTRV9VUFBFUjE2CTB4MzAJLyogVXBwZXIgaGFsZiBvZiBJL08gYWRkcmVzc2VzICovCisjZGVmaW5lIFBDSV9JT19MSU1JVF9VUFBFUjE2CTB4MzIKKy8qIDB4MzQgc2FtZSBhcyBmb3IgaHR5cGUgMCAqLworLyogMHgzNS0weDNiIGlzIHJlc2VydmVkICovCisjZGVmaW5lIFBDSV9ST01fQUREUkVTUzEJMHgzOAkvKiBTYW1lIGFzIFBDSV9ST01fQUREUkVTUywgYnV0IGZvciBodHlwZSAxICovCisvKiAweDNjLTB4M2QgYXJlIHNhbWUgYXMgZm9yIGh0eXBlIDAgKi8KKyNkZWZpbmUgUENJX0JSSURHRV9DT05UUk9MCTB4M2UKKyNkZWZpbmUgIFBDSV9CUklER0VfQ1RMX1BBUklUWQkweDAxCS8qIEVuYWJsZSBwYXJpdHkgZGV0ZWN0aW9uIG9uIHNlY29uZGFyeSBpbnRlcmZhY2UgKi8KKyNkZWZpbmUgIFBDSV9CUklER0VfQ1RMX1NFUlIJMHgwMgkvKiBUaGUgc2FtZSBmb3IgU0VSUiBmb3J3YXJkaW5nICovCisjZGVmaW5lICBQQ0lfQlJJREdFX0NUTF9OT19JU0EJMHgwNAkvKiBEaXNhYmxlIGJyaWRnaW5nIG9mIElTQSBwb3J0cyAqLworI2RlZmluZSAgUENJX0JSSURHRV9DVExfVkdBCTB4MDgJLyogRm9yd2FyZCBWR0EgYWRkcmVzc2VzICovCisjZGVmaW5lICBQQ0lfQlJJREdFX0NUTF9NQVNURVJfQUJPUlQgMHgyMCAgLyogUmVwb3J0IG1hc3RlciBhYm9ydHMgKi8KKyNkZWZpbmUgIFBDSV9CUklER0VfQ1RMX0JVU19SRVNFVCAweDQwCS8qIFNlY29uZGFyeSBidXMgcmVzZXQgKi8KKyNkZWZpbmUgIFBDSV9CUklER0VfQ1RMX0ZBU1RfQkFDSyAweDgwCS8qIEZhc3QgQmFjazJCYWNrIGVuYWJsZWQgb24gc2Vjb25kYXJ5IGludGVyZmFjZSAqLworCisjZGVmaW5lIFBDSV9DQl9DQVBBQklMSVRZX0xJU1QJMHgxNAorCisvKiBDYXBhYmlsaXR5IGxpc3RzICovCisKKyNkZWZpbmUgUENJX0NBUF9MSVNUX0lECQkwCS8qIENhcGFiaWxpdHkgSUQgKi8KKyNkZWZpbmUgIFBDSV9DQVBfSURfUE0JCTB4MDEJLyogUG93ZXIgTWFuYWdlbWVudCAqLworI2RlZmluZSAgUENJX0NBUF9JRF9BR1AJCTB4MDIJLyogQWNjZWxlcmF0ZWQgR3JhcGhpY3MgUG9ydCAqLworI2RlZmluZSAgUENJX0NBUF9JRF9WUEQJCTB4MDMJLyogVml0YWwgUHJvZHVjdCBEYXRhICovCisjZGVmaW5lICBQQ0lfQ0FQX0lEX1NMT1RJRAkweDA0CS8qIFNsb3QgSWRlbnRpZmljYXRpb24gKi8KKyNkZWZpbmUgIFBDSV9DQVBfSURfTVNJCQkweDA1CS8qIE1lc3NhZ2UgU2lnbmFsbGVkIEludGVycnVwdHMgKi8KKyNkZWZpbmUgIFBDSV9DQVBfSURfQ0hTV1AJMHgwNgkvKiBDb21wYWN0UENJIEhvdFN3YXAgKi8KKyNkZWZpbmUgUENJX0NBUF9MSVNUX05FWFQJMQkvKiBOZXh0IGNhcGFiaWxpdHkgaW4gdGhlIGxpc3QgKi8KKyNkZWZpbmUgUENJX0NBUF9GTEFHUwkJMgkvKiBDYXBhYmlsaXR5IGRlZmluZWQgZmxhZ3MgKDE2IGJpdHMpICovCisjZGVmaW5lIFBDSV9DQVBfU0laRU9GCQk0CisKKy8qIFBvd2VyIE1hbmFnZW1lbnQgUmVnaXN0ZXJzICovCisKKyNkZWZpbmUgUENJX1BNX1BNQyAgICAgICAgICAgICAgMiAgICAgICAvKiBQTSBDYXBhYmlsaXRpZXMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgIFBDSV9QTV9DQVBfVkVSX01BU0sJMHgwMDA3CS8qIFZlcnNpb24gKi8KKyNkZWZpbmUgIFBDSV9QTV9DQVBfUE1FX0NMT0NLCTB4MDAwOAkvKiBQTUUgY2xvY2sgcmVxdWlyZWQgKi8KKyNkZWZpbmUgIFBDSV9QTV9DQVBfUkVTRVJWRUQgICAgMHgwMDEwICAvKiBSZXNlcnZlZCBmaWVsZCAqLworI2RlZmluZSAgUENJX1BNX0NBUF9EU0kJCTB4MDAyMAkvKiBEZXZpY2Ugc3BlY2lmaWMgaW5pdGlhbGl6YXRpb24gKi8KKyNkZWZpbmUgIFBDSV9QTV9DQVBfQVVYX1BPV0VSCTB4MDFDMAkvKiBBdXhpbGxpYXJ5IHBvd2VyIHN1cHBvcnQgbWFzayAqLworI2RlZmluZSAgUENJX1BNX0NBUF9EMQkJMHgwMjAwCS8qIEQxIHBvd2VyIHN0YXRlIHN1cHBvcnQgKi8KKyNkZWZpbmUgIFBDSV9QTV9DQVBfRDIJCTB4MDQwMAkvKiBEMiBwb3dlciBzdGF0ZSBzdXBwb3J0ICovCisjZGVmaW5lICBQQ0lfUE1fQ0FQX1BNRQkJMHgwODAwCS8qIFBNRSBwaW4gc3VwcG9ydGVkICovCisjZGVmaW5lICBQQ0lfUE1fQ0FQX1BNRV9NQVNLICAgIDB4RjgwMCAgLyogUE1FIE1hc2sgb2YgYWxsIHN1cHBvcnRlZCBzdGF0ZXMgKi8KKyNkZWZpbmUgIFBDSV9QTV9DQVBfUE1FX0QwICAgICAgMHgwODAwICAvKiBQTUUjIGZyb20gRDAgKi8KKyNkZWZpbmUgIFBDSV9QTV9DQVBfUE1FX0QxICAgICAgMHgxMDAwICAvKiBQTUUjIGZyb20gRDEgKi8KKyNkZWZpbmUgIFBDSV9QTV9DQVBfUE1FX0QyICAgICAgMHgyMDAwICAvKiBQTUUjIGZyb20gRDIgKi8KKyNkZWZpbmUgIFBDSV9QTV9DQVBfUE1FX0QzICAgICAgMHg0MDAwICAvKiBQTUUjIGZyb20gRDMgKGhvdCkgKi8KKyNkZWZpbmUgIFBDSV9QTV9DQVBfUE1FX0QzY29sZCAgMHg4MDAwICAvKiBQTUUjIGZyb20gRDMgKGNvbGQpICovCisjZGVmaW5lIFBDSV9QTV9DVFJMCQk0CS8qIFBNIGNvbnRyb2wgYW5kIHN0YXR1cyByZWdpc3RlciAqLworI2RlZmluZSAgUENJX1BNX0NUUkxfU1RBVEVfTUFTSwkweDAwMDMJLyogQ3VycmVudCBwb3dlciBzdGF0ZSAoRDAgdG8gRDMpICovCisjZGVmaW5lICBQQ0lfUE1fQ1RSTF9QTUVfRU5BQkxFCTB4MDEwMAkvKiBQTUUgcGluIGVuYWJsZSAqLworI2RlZmluZSAgUENJX1BNX0NUUkxfREFUQV9TRUxfTUFTSwkweDFlMDAJLyogRGF0YSBzZWxlY3QgKD8/KSAqLworI2RlZmluZSAgUENJX1BNX0NUUkxfREFUQV9TQ0FMRV9NQVNLCTB4NjAwMAkvKiBEYXRhIHNjYWxlICg/PykgKi8KKyNkZWZpbmUgIFBDSV9QTV9DVFJMX1BNRV9TVEFUVVMJMHg4MDAwCS8qIFBNRSBwaW4gc3RhdHVzICovCisjZGVmaW5lIFBDSV9QTV9QUEJfRVhURU5TSU9OUwk2CS8qIFBQQiBzdXBwb3J0IGV4dGVuc2lvbnMgKD8/KSAqLworI2RlZmluZSAgUENJX1BNX1BQQl9CMl9CMwkweDQwCS8qIFN0b3AgY2xvY2sgd2hlbiBpbiBEM2hvdCAoPz8pICovCisjZGVmaW5lICBQQ0lfUE1fQlBDQ19FTkFCTEUJMHg4MAkvKiBCdXMgcG93ZXIvY2xvY2sgY29udHJvbCBlbmFibGUgKD8/KSAqLworI2RlZmluZSBQQ0lfUE1fREFUQV9SRUdJU1RFUgk3CS8qICg/PykgKi8KKyNkZWZpbmUgUENJX1BNX1NJWkVPRgkJOAorCisvKiBBR1AgcmVnaXN0ZXJzICovCisKKyNkZWZpbmUgUENJX0FHUF9WRVJTSU9OCQkyCS8qIEJDRCB2ZXJzaW9uIG51bWJlciAqLworI2RlZmluZSBQQ0lfQUdQX1JGVQkJMwkvKiBSZXN0IG9mIGNhcGFiaWxpdHkgZmxhZ3MgKi8KKyNkZWZpbmUgUENJX0FHUF9TVEFUVVMJCTQJLyogU3RhdHVzIHJlZ2lzdGVyICovCisjZGVmaW5lICBQQ0lfQUdQX1NUQVRVU19SUV9NQVNLCTB4ZmYwMDAwMDAJLyogTWF4aW11bSBudW1iZXIgb2YgcmVxdWVzdHMgLSAxICovCisjZGVmaW5lICBQQ0lfQUdQX1NUQVRVU19TQkEJMHgwMjAwCS8qIFNpZGViYW5kIGFkZHJlc3Npbmcgc3VwcG9ydGVkICovCisjZGVmaW5lICBQQ0lfQUdQX1NUQVRVU182NEJJVAkweDAwMjAJLyogNjQtYml0IGFkZHJlc3Npbmcgc3VwcG9ydGVkICovCisjZGVmaW5lICBQQ0lfQUdQX1NUQVRVU19GVwkweDAwMTAJLyogRlcgdHJhbnNmZXJzIHN1cHBvcnRlZCAqLworI2RlZmluZSAgUENJX0FHUF9TVEFUVVNfUkFURTQJMHgwMDA0CS8qIDR4IHRyYW5zZmVyIHJhdGUgc3VwcG9ydGVkICovCisjZGVmaW5lICBQQ0lfQUdQX1NUQVRVU19SQVRFMgkweDAwMDIJLyogMnggdHJhbnNmZXIgcmF0ZSBzdXBwb3J0ZWQgKi8KKyNkZWZpbmUgIFBDSV9BR1BfU1RBVFVTX1JBVEUxCTB4MDAwMQkvKiAxeCB0cmFuc2ZlciByYXRlIHN1cHBvcnRlZCAqLworI2RlZmluZSBQQ0lfQUdQX0NPTU1BTkQJCTgJLyogQ29udHJvbCByZWdpc3RlciAqLworI2RlZmluZSAgUENJX0FHUF9DT01NQU5EX1JRX01BU0sgMHhmZjAwMDAwMCAgLyogTWFzdGVyOiBNYXhpbXVtIG51bWJlciBvZiByZXF1ZXN0cyAqLworI2RlZmluZSAgUENJX0FHUF9DT01NQU5EX1NCQQkweDAyMDAJLyogU2lkZWJhbmQgYWRkcmVzc2luZyBlbmFibGVkICovCisjZGVmaW5lICBQQ0lfQUdQX0NPTU1BTkRfQUdQCTB4MDEwMAkvKiBBbGxvdyBwcm9jZXNzaW5nIG9mIEFHUCB0cmFuc2FjdGlvbnMgKi8KKyNkZWZpbmUgIFBDSV9BR1BfQ09NTUFORF82NEJJVAkweDAwMjAgCS8qIEFsbG93IHByb2Nlc3Npbmcgb2YgNjQtYml0IGFkZHJlc3NlcyAqLworI2RlZmluZSAgUENJX0FHUF9DT01NQU5EX0ZXCTB4MDAxMCAJLyogRm9yY2UgRlcgdHJhbnNmZXJzICovCisjZGVmaW5lICBQQ0lfQUdQX0NPTU1BTkRfUkFURTQJMHgwMDA0CS8qIFVzZSA0eCByYXRlICovCisjZGVmaW5lICBQQ0lfQUdQX0NPTU1BTkRfUkFURTIJMHgwMDAyCS8qIFVzZSAyeCByYXRlICovCisjZGVmaW5lICBQQ0lfQUdQX0NPTU1BTkRfUkFURTEJMHgwMDAxCS8qIFVzZSAxeCByYXRlICovCisjZGVmaW5lIFBDSV9BR1BfU0laRU9GCQkxMgorCisvKiBTbG90IElkZW50aWZpY2F0aW9uICovCisKKyNkZWZpbmUgUENJX1NJRF9FU1IJCTIJLyogRXhwYW5zaW9uIFNsb3QgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgIFBDSV9TSURfRVNSX05TTE9UUwkweDFmCS8qIE51bWJlciBvZiBleHBhbnNpb24gc2xvdHMgYXZhaWxhYmxlICovCisjZGVmaW5lICBQQ0lfU0lEX0VTUl9GSUMJMHgyMAkvKiBGaXJzdCBJbiBDaGFzc2lzIEZsYWcgKi8KKyNkZWZpbmUgUENJX1NJRF9DSEFTU0lTX05SCTMJLyogQ2hhc3NpcyBOdW1iZXIgKi8KKworLyogTWVzc2FnZSBTaWduYWxsZWQgSW50ZXJydXB0cyByZWdpc3RlcnMgKi8KKworI2RlZmluZSBQQ0lfTVNJX0ZMQUdTCQkyCS8qIFZhcmlvdXMgZmxhZ3MgKi8KKyNkZWZpbmUgIFBDSV9NU0lfRkxBR1NfNjRCSVQJMHg4MAkvKiA2NC1iaXQgYWRkcmVzc2VzIGFsbG93ZWQgKi8KKyNkZWZpbmUgIFBDSV9NU0lfRkxBR1NfUVNJWkUJMHg3MAkvKiBNZXNzYWdlIHF1ZXVlIHNpemUgY29uZmlndXJlZCAqLworI2RlZmluZSAgUENJX01TSV9GTEFHU19RTUFTSwkweDBlCS8qIE1heGltdW0gcXVldWUgc2l6ZSBhdmFpbGFibGUgKi8KKyNkZWZpbmUgIFBDSV9NU0lfRkxBR1NfRU5BQkxFCTB4MDEJLyogTVNJIGZlYXR1cmUgZW5hYmxlZCAqLworI2RlZmluZSBQQ0lfTVNJX1JGVQkJMwkvKiBSZXN0IG9mIGNhcGFiaWxpdHkgZmxhZ3MgKi8KKyNkZWZpbmUgUENJX01TSV9BRERSRVNTX0xPCTQJLyogTG93ZXIgMzIgYml0cyAqLworI2RlZmluZSBQQ0lfTVNJX0FERFJFU1NfSEkJOAkvKiBVcHBlciAzMiBiaXRzIChpZiBQQ0lfTVNJX0ZMQUdTXzY0QklUIHNldCkgKi8KKyNkZWZpbmUgUENJX01TSV9EQVRBXzMyCQk4CS8qIDE2IGJpdHMgb2YgZGF0YSBmb3IgMzItYml0IGRldmljZXMgKi8KKyNkZWZpbmUgUENJX01TSV9EQVRBXzY0CQkxMgkvKiAxNiBiaXRzIG9mIGRhdGEgZm9yIDY0LWJpdCBkZXZpY2VzICovCisKKyNkZWZpbmUgUENJX1NMT1QoZGV2Zm4pCQkgICgoZGV2Zm4pID4+IDMpCiAjZGVmaW5lIFBDSV9GVU5DKGRldmZuKSAgICAgICAgICAgKChkZXZmbikgJiAweDA3KQogCiAjZGVmaW5lIEJJT1MzMl9TSUdOQVRVUkUgICAgICAgICgoJ18nIDw8IDApICsgKCczJyA8PCA4KSArICgnMicgPDwgMTYpICsgKCdfJyA8PCAyNCkpCkBAIC04NSwxMDggKzI2MSw5NyBAQAogCWNoYXIgY2hhcnNbMTZdOwogfTsKIAotI2RlZmluZSBLRVJOX0NPREVfU0VHCTB4OAkvKiBUaGlzIF9NVVNUXyBtYXRjaCBzdGFydC5TICovCi0KLS8qIFN0dWZmIGZvciBhc20gKi8KLSNkZWZpbmUgc2F2ZV9mbGFncyh4KSBcCi1fX2FzbV9fIF9fdm9sYXRpbGVfXygicHVzaGZsIDsgcG9wbCAlMCI6Ij1nIiAoeCk6IC8qIG5vIGlucHV0ICovIDoibWVtb3J5IikKLQotI2RlZmluZSBjbGkoKSBfX2FzbV9fIF9fdm9sYXRpbGVfXyAoImNsaSI6IDogOiJtZW1vcnkiKQotCi0jZGVmaW5lIHJlc3RvcmVfZmxhZ3MoeCkgXAotX19hc21fXyBfX3ZvbGF0aWxlX18oInB1c2hsICUwIDsgcG9wZmwiOiAvKiBubyBvdXRwdXQgKi8gOiJnIiAoeCk6Im1lbW9yeSIpCi0KLSNkZWZpbmUgUENJX1ZFTkRPUl9JRF9BRE1URUsgICAgICAgICAgICAweDEzMTcKLSNkZWZpbmUgUENJX0RFVklDRV9JRF9BRE1URUtfMDk4NSAgICAgICAweDA5ODUKLSNkZWZpbmUgUENJX1ZFTkRPUl9JRF9SRUFMVEVLICAgICAgICAgICAweDEwZWMKLSNkZWZpbmUgUENJX0RFVklDRV9JRF9SRUFMVEVLXzgwMjkgICAgICAweDgwMjkKLSNkZWZpbmUgUENJX0RFVklDRV9JRF9SRUFMVEVLXzgxMzkgICAgICAweDgxMzkKLSNkZWZpbmUgUENJX1ZFTkRPUl9JRF9XSU5CT05EMiAgICAgICAgICAweDEwNTAKLSNkZWZpbmUgUENJX0RFVklDRV9JRF9XSU5CT05EMl84OUM5NDAgICAweDA5NDAKLSNkZWZpbmUgUENJX0RFVklDRV9JRF9XSU5CT05EMl84OUM4NDAgICAweDA4NDAKLSNkZWZpbmUgUENJX1ZFTkRPUl9JRF9DT01QRVggICAgICAgICAgICAweDExZjYKLSNkZWZpbmUgUENJX0RFVklDRV9JRF9DT01QRVhfUkwyMDAwICAgICAweDE0MDEKLSNkZWZpbmUgUENJX0RFVklDRV9JRF9DT01QRVhfUkwxMDBBVFggICAweDIwMTEKLSNkZWZpbmUgUENJX1ZFTkRPUl9JRF9LVEkgICAgICAgICAgICAgICAweDhlMmUKLSNkZWZpbmUgUENJX0RFVklDRV9JRF9LVElfRVQzMlAyICAgICAgICAweDMwMDAKLSNkZWZpbmUgUENJX1ZFTkRPUl9JRF9ORVRWSU4gICAgICAgICAgICAweDRhMTQKLSNkZWZpbmUgUENJX0RFVklDRV9JRF9ORVRWSU5fTlY1MDAwU0MgICAweDUwMDAKLSNkZWZpbmUJUENJX1ZFTkRPUl9JRF9IT0xURUsJCTB4MTJjMwotI2RlZmluZQlQQ0lfREVWSUNFX0lEX0hPTFRFS19IVDgwMjMyCTB4MDA1OAotI2RlZmluZSBQQ0lfVkVORE9SX0lEXzNDT00JCTB4MTBiNwotI2RlZmluZSBQQ0lfREVWSUNFX0lEXzNDT01fM0M1OTAJMHg1OTAwCi0jZGVmaW5lIFBDSV9ERVZJQ0VfSURfM0NPTV8zQzU5NQkweDU5NTAKLSNkZWZpbmUgUENJX0RFVklDRV9JRF8zQ09NXzNDNTk1XzEJMHg1OTUxCi0jZGVmaW5lIFBDSV9ERVZJQ0VfSURfM0NPTV8zQzU5NV8yCTB4NTk1MgotI2RlZmluZSBQQ0lfREVWSUNFX0lEXzNDT01fM0M5MDBUUE8JMHg5MDAwCi0jZGVmaW5lIFBDSV9ERVZJQ0VfSURfM0NPTV8zQzkwMENPTUJPCTB4OTAwMQotI2RlZmluZSBQQ0lfREVWSUNFX0lEXzNDT01fM0M5MDVUWAkweDkwNTAKLSNkZWZpbmUgUENJX0RFVklDRV9JRF8zQ09NXzNDOTA1VDQJMHg5MDUxCi0jZGVmaW5lIFBDSV9ERVZJQ0VfSURfM0NPTV8zQzkwNUJfVFgJMHg5MDU1Ci0jZGVmaW5lIFBDSV9ERVZJQ0VfSURfM0NPTV8zQzkwNUNfVFhNCTB4OTIwMAotI2RlZmluZSBQQ0lfVkVORE9SX0lEX0lOVEVMCQkweDgwODYKLSNkZWZpbmUgUENJX0RFVklDRV9JRF9JTlRFTF84MjU1NwkweDEyMjkKLSNkZWZpbmUgUENJX0RFVklDRV9JRF9JTlRFTF84MjU1OUVSCTB4MTIwOQotI2RlZmluZSBQQ0lfREVWSUNFX0lEX0lOVEVMX0lEMTAyOQkweDEwMjkKLSNkZWZpbmUgUENJX0RFVklDRV9JRF9JTlRFTF9JRDEwMzAJMHgxMDMwCi0jZGVmaW5lIFBDSV9ERVZJQ0VfSURfSU5URUxfODI1NjIJMHgyNDQ5Ci0jZGVmaW5lIFBDSV9WRU5ET1JfSURfQU1ECQkweDEwMjIKLSNkZWZpbmUgUENJX0RFVklDRV9JRF9BTURfTEFOQ0UJCTB4MjAwMAotI2RlZmluZSBQQ0lfVkVORE9SX0lEX0FNRF9IT01FUE5BCTB4MTAyMgotI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FNRF9IT01FUE5BCTB4MjAwMQotI2RlZmluZSBQQ0lfVkVORE9SX0lEX1NNQ18xMjExICAgICAgICAgIDB4MTExMwotI2RlZmluZSBQQ0lfREVWSUNFX0lEX1NNQ18xMjExICAgICAgICAgIDB4MTIxMQotI2RlZmluZSBQQ0lfVkVORE9SX0lEX0RFQwkJMHgxMDExCi0jZGVmaW5lIFBDSV9ERVZJQ0VfSURfREVDX1RVTElQCQkweDAwMDIKLSNkZWZpbmUgUENJX0RFVklDRV9JRF9ERUNfVFVMSVBfRkFTVAkweDAwMDkKLSNkZWZpbmUgUENJX0RFVklDRV9JRF9ERUNfVFVMSVBfUExVUwkweDAwMTQKLSNkZWZpbmUgUENJX0RFVklDRV9JRF9ERUNfMjExNDIJCTB4MDAxOQotI2RlZmluZSBQQ0lfVkVORE9SX0lEX1NNQwkJMHgxMEI4Ci0jaWZuZGVmCVBDSV9ERVZJQ0VfSURfU01DX0VQSUMxMDAKLSMgZGVmaW5lIFBDSV9ERVZJQ0VfSURfU01DX0VQSUMxMDAJMHgwMDA1Ci0jZW5kaWYKLSNkZWZpbmUgUENJX1ZFTkRPUl9JRF9NQUNST05JWAkJMHgxMGQ5Ci0jZGVmaW5lIFBDSV9ERVZJQ0VfSURfTVg5ODd4NQkJMHgwNTMxCi0jZGVmaW5lIFBDSV9WRU5ET1JfSURfTElOS1NZUwkJMHgxMUFECi0jZGVmaW5lIFBDSV9ERVZJQ0VfSURfTEM4MkMxMTUJCTB4QzExNQotI2RlZmluZSBQQ0lfVkVORE9SX0lEX1ZJQVRFQwkJMHgxMTA2Ci0jZGVmaW5lIFBDSV9ERVZJQ0VfSURfVklBX1JISU5FX0kJMHgzMDQzCi0jZGVmaW5lIFBDSV9ERVZJQ0VfSURfVklBX1ZUNjEwMgkweDMwNjUKLSNkZWZpbmUgUENJX0RFVklDRV9JRF9WSUFfODZDMTAwQQkweDYxMDAKLSNkZWZpbmUgUENJX1ZFTkRPUl9JRF9EQVZJQ09NCQkweDEyODIKLSNkZWZpbmUJUENJX0RFVklDRV9JRF9ETTkwMDkJCTB4OTAwOQotI2RlZmluZSBQQ0lfREVWSUNFX0lEX0RNOTEwMgkJMHg5MTAyCi0jZGVmaW5lIFBDSV9WRU5ET1JfSURfU0lTICAgICAgICAgCTB4MTAzOQotI2RlZmluZSBQQ0lfREVWSUNFX0lEX1NJUzkwMCAgICAgCTB4MDkwMCAgIAotI2RlZmluZSBQQ0lfREVWSUNFX0lEX1NJUzcwMTYgICAgCTB4NzAxNiAgCi0jZGVmaW5lCVBDSV9WRU5ET1JfSURfRExJTksJCTB4MTE4NgotI2RlZmluZQlQQ0lfREVWSUNFX0lEX0RGRTUzMFRYUAkJMHgxMzAwCi0jZGVmaW5lCVBDSV9WRU5ET1JfSURfTlMJCTB4MTAwQgotI2RlZmluZQlQQ0lfREVWSUNFX0lEX0RQODM4MTUJCTB4MDAyMAotI2RlZmluZSBQQ0lfVkVORE9SX0lEX09MSUNPTQkJMHgxMDhkCi0jZGVmaW5lIFBDSV9ERVZJQ0VfSURfT0xJQ09NX09DMzEzNgkweDAwMDEKLSNkZWZpbmUgUENJX0RFVklDRV9JRF9PTElDT01fT0MyMzE1CTB4MDAxMQotI2RlZmluZSBQQ0lfREVWSUNFX0lEX09MSUNPTV9PQzIzMjUJMHgwMDEyCi0jZGVmaW5lIFBDSV9ERVZJQ0VfSURfT0xJQ09NX09DMjE4MwkweDAwMTMKLSNkZWZpbmUgUENJX0RFVklDRV9JRF9PTElDT01fT0MyMzI2CTB4MDAxNAotI2RlZmluZSBQQ0lfREVWSUNFX0lEX09MSUNPTV9PQzYxNTEJMHgwMDIxCitzdHJ1Y3QgcGNpX2RldmljZTsKK3N0cnVjdCBkZXY7Cit0eXBlZGVmIGludCAoKnBjaV9wcm9iZV90KShzdHJ1Y3QgZGV2ICosIHN0cnVjdCBwY2lfZGV2aWNlICopOwogCiBzdHJ1Y3QgcGNpX2RldmljZSB7Ci0JdW5zaWduZWQgc2hvcnQJdmVuZG9yLCBkZXZfaWQ7Ci0JY29uc3QgY2hhcgkqbmFtZTsKLQl1bnNpZ25lZCBpbnQJbWVtYmFzZTsKLQl1bnNpZ25lZCBzaG9ydAlpb2FkZHI7Ci0JdW5zaWduZWQgY2hhcglkZXZmbjsKLQl1bnNpZ25lZCBjaGFyCWJ1czsKKwl1aW50MzJfdAkJY2xhc3M7CisJdWludDE2X3QJCXZlbmRvciwgZGV2X2lkOworCWNvbnN0IGNoYXIJCSpuYW1lOworCS8qIG1lbWJhc2UgYW5kIGlvYWRkciBhcmUgc2lsbHkgYW5kIGRlcHJpY2F0ZWQgKi8KKwl1bnNpZ25lZCBpbnQJCW1lbWJhc2U7CisJdW5zaWduZWQgaW50CQlpb2FkZHI7CisJdW5zaWduZWQgaW50CQlyb21hZGRyOworCXVuc2lnbmVkIGNoYXIJCWlycTsKKwl1bnNpZ25lZCBjaGFyCQlkZXZmbjsKKwl1bnNpZ25lZCBjaGFyCQlidXM7CisJdW5zaWduZWQgY2hhcgkJdXNlX3NwZWNpZmllZDsKKwljb25zdCBzdHJ1Y3QgcGNpX2RyaXZlcgkqZHJpdmVyOworfTsKKworZXh0ZXJuIHZvaWQgc2Nhbl9wY2lfYnVzKGludCB0eXBlLCBzdHJ1Y3QgcGNpX2RldmljZSAqZGV2KTsKK2V4dGVybiB2b2lkIGZpbmRfcGNpKGludCB0eXBlLCBzdHJ1Y3QgcGNpX2RldmljZSAqZGV2KTsKKworZXh0ZXJuIGludCBwY2liaW9zX3JlYWRfY29uZmlnX2J5dGUodW5zaWduZWQgaW50IGJ1cywgdW5zaWduZWQgaW50IGRldmljZV9mbiwgdW5zaWduZWQgaW50IHdoZXJlLCB1aW50OF90ICp2YWx1ZSk7CitleHRlcm4gaW50IHBjaWJpb3Nfd3JpdGVfY29uZmlnX2J5dGUgKHVuc2lnbmVkIGludCBidXMsIHVuc2lnbmVkIGludCBkZXZpY2VfZm4sIHVuc2lnbmVkIGludCB3aGVyZSwgdWludDhfdCB2YWx1ZSk7CitleHRlcm4gaW50IHBjaWJpb3NfcmVhZF9jb25maWdfd29yZCh1bnNpZ25lZCBpbnQgYnVzLCB1bnNpZ25lZCBpbnQgZGV2aWNlX2ZuLCB1bnNpZ25lZCBpbnQgd2hlcmUsIHVpbnQxNl90ICp2YWx1ZSk7CitleHRlcm4gaW50IHBjaWJpb3Nfd3JpdGVfY29uZmlnX3dvcmQgKHVuc2lnbmVkIGludCBidXMsIHVuc2lnbmVkIGludCBkZXZpY2VfZm4sIHVuc2lnbmVkIGludCB3aGVyZSwgdWludDE2X3QgdmFsdWUpOworZXh0ZXJuIGludCBwY2liaW9zX3JlYWRfY29uZmlnX2R3b3JkKHVuc2lnbmVkIGludCBidXMsIHVuc2lnbmVkIGludCBkZXZpY2VfZm4sIHVuc2lnbmVkIGludCB3aGVyZSwgdWludDMyX3QgKnZhbHVlKTsKK2V4dGVybiBpbnQgcGNpYmlvc193cml0ZV9jb25maWdfZHdvcmQodW5zaWduZWQgaW50IGJ1cywgdW5zaWduZWQgaW50IGRldmljZV9mbiwgdW5zaWduZWQgaW50IHdoZXJlLCB1aW50MzJfdCB2YWx1ZSk7CitleHRlcm4gdW5zaWduZWQgbG9uZyBwY2liaW9zX2J1c19iYXNlKHVuc2lnbmVkIGludCBidXMpOworZXh0ZXJuIHZvaWQgYWRqdXN0X3BjaV9kZXZpY2Uoc3RydWN0IHBjaV9kZXZpY2UgKnApOworCisKK3N0YXRpYyBpbmxpbmUgaW50IAorcGNpX3JlYWRfY29uZmlnX2J5dGUoc3RydWN0IHBjaV9kZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IHdoZXJlLCB1aW50OF90ICp2YWx1ZSkKK3sKKwlyZXR1cm4gcGNpYmlvc19yZWFkX2NvbmZpZ19ieXRlKGRldi0+YnVzLCBkZXYtPmRldmZuLCB3aGVyZSwgdmFsdWUpOworfQorc3RhdGljIGlubGluZSBpbnQgCitwY2lfd3JpdGVfY29uZmlnX2J5dGUoc3RydWN0IHBjaV9kZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IHdoZXJlLCB1aW50OF90IHZhbHVlKQoreworCXJldHVybiBwY2liaW9zX3dyaXRlX2NvbmZpZ19ieXRlKGRldi0+YnVzLCBkZXYtPmRldmZuLCB3aGVyZSwgdmFsdWUpOworfQorc3RhdGljIGlubGluZSBpbnQgCitwY2lfcmVhZF9jb25maWdfd29yZChzdHJ1Y3QgcGNpX2RldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgd2hlcmUsIHVpbnQxNl90ICp2YWx1ZSkKK3sKKwlyZXR1cm4gcGNpYmlvc19yZWFkX2NvbmZpZ193b3JkKGRldi0+YnVzLCBkZXYtPmRldmZuLCB3aGVyZSwgdmFsdWUpOworfQorc3RhdGljIGlubGluZSBpbnQgCitwY2lfd3JpdGVfY29uZmlnX3dvcmQoc3RydWN0IHBjaV9kZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IHdoZXJlLCB1aW50MTZfdCB2YWx1ZSkKK3sKKwlyZXR1cm4gcGNpYmlvc193cml0ZV9jb25maWdfd29yZChkZXYtPmJ1cywgZGV2LT5kZXZmbiwgd2hlcmUsIHZhbHVlKTsKK30KK3N0YXRpYyBpbmxpbmUgaW50IAorcGNpX3JlYWRfY29uZmlnX2R3b3JkKHN0cnVjdCBwY2lfZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCB3aGVyZSwgdWludDMyX3QgKnZhbHVlKQoreworCXJldHVybiBwY2liaW9zX3JlYWRfY29uZmlnX2R3b3JkKGRldi0+YnVzLCBkZXYtPmRldmZuLCB3aGVyZSwgdmFsdWUpOworfQorc3RhdGljIGlubGluZSBpbnQgCitwY2lfd3JpdGVfY29uZmlnX2R3b3JkKHN0cnVjdCBwY2lfZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCB3aGVyZSwgdWludDMyX3QgdmFsdWUpCit7CisJcmV0dXJuIHBjaWJpb3Nfd3JpdGVfY29uZmlnX2R3b3JkKGRldi0+YnVzLCBkZXYtPmRldmZuLCB3aGVyZSwgdmFsdWUpOworfQorCisvKiBIZWxwZXIgZnVuY3Rpb25zIHRvIGZpbmQgdGhlIHNpemUgb2YgYSBwY2kgYmFyICovCitleHRlcm4gdW5zaWduZWQgbG9uZyBwY2lfYmFyX3N0YXJ0KHN0cnVjdCBwY2lfZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCBiYXIpOworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgcGNpX2Jhcl9zaXplKHN0cnVjdCBwY2lfZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCBiYXIpOworLyogSGVscGVyIGZ1bmN0aW9uIHRvIGZpbmQgcGNpIGNhcGFiaWxpdGllcyAqLworZXh0ZXJuIGludCBwY2lfZmluZF9jYXBhYmlsaXR5KHN0cnVjdCBwY2lfZGV2aWNlICpkZXYsIGludCBjYXApOworc3RydWN0IHBjaV9pZCB7CisJdW5zaWduZWQgc2hvcnQgdmVuZG9yLCBkZXZfaWQ7CisJY29uc3QgY2hhciAqbmFtZTsKK307CisKK3N0cnVjdCBkZXY7CisvKiBNb3N0IHBjaSBkcml2ZXJzIHdpbGwgdXNlIHRoaXMgKi8KK3N0cnVjdCBwY2lfZHJpdmVyIHsKKwlpbnQgdHlwZTsKKwljb25zdCBjaGFyICpuYW1lOworCXBjaV9wcm9iZV90IHByb2JlOworCXN0cnVjdCBwY2lfaWQgKmlkczsKKwlpbnQgaWRfY291bnQ7CisKKy8qIE9uIGEgZmV3IG9jY2FzaW9ucyB0aGUgaGFyZHdhcmUgaXMgc3RhbmRhcmRpemVkIGVub3VnaCB0aGF0CisgKiB3ZSBvbmx5IG5lZWQgdG8ga25vdyB0aGUgY2xhc3Mgb2YgdGhlIGRldmljZSBhbmQgbm90IHRoZSBleGFjdAorICogdHlwZSB0byBkcml2ZSB0aGUgZGV2aWNlIGNvcnJlY3RseS4gIElmIHRoaXMgaXMgdGhlIGNhc2UKKyAqIHNldCBhIGNsYXNzIHZhbHVlIG90aGVyIHRoYW4gMC4KKyAqLworCXVuc2lnbmVkIHNob3J0IGNsYXNzOwogfTsKIAotZXh0ZXJuIHZvaWQJZXRoX3BjaV9pbml0KHN0cnVjdCBwY2lfZGV2aWNlICopOworI2RlZmluZSBQQ0lfUk9NKFZFTkRPUl9JRCwgREVWSUNFX0lELCBJTUFHRSwgREVTQ1JJUFRJT04pIFwKKwl7IFZFTkRPUl9JRCwgREVWSUNFX0lELCBJTUFHRSwgfQogCi1leHRlcm4gaW50IHBjaWJpb3NfcmVhZF9jb25maWdfYnl0ZSh1bnNpZ25lZCBpbnQgYnVzLCB1bnNpZ25lZCBpbnQgZGV2aWNlX2ZuLCB1bnNpZ25lZCBpbnQgd2hlcmUsIHVuc2lnbmVkIGNoYXIgKnZhbHVlKTsKLWV4dGVybiBpbnQgcGNpYmlvc193cml0ZV9jb25maWdfYnl0ZSAodW5zaWduZWQgaW50IGJ1cywgdW5zaWduZWQgaW50IGRldmljZV9mbiwgdW5zaWduZWQgaW50IHdoZXJlLCB1bnNpZ25lZCBjaGFyIHZhbHVlKTsKLWV4dGVybiBpbnQgcGNpYmlvc19yZWFkX2NvbmZpZ193b3JkKHVuc2lnbmVkIGludCBidXMsIHVuc2lnbmVkIGludCBkZXZpY2VfZm4sIHVuc2lnbmVkIGludCB3aGVyZSwgdW5zaWduZWQgc2hvcnQgKnZhbHVlKTsKLWV4dGVybiBpbnQgcGNpYmlvc193cml0ZV9jb25maWdfd29yZCAodW5zaWduZWQgaW50IGJ1cywgdW5zaWduZWQgaW50IGRldmljZV9mbiwgdW5zaWduZWQgaW50IHdoZXJlLCB1bnNpZ25lZCBzaG9ydCB2YWx1ZSk7Ci1leHRlcm4gaW50IHBjaWJpb3NfcmVhZF9jb25maWdfZHdvcmQodW5zaWduZWQgaW50IGJ1cywgdW5zaWduZWQgaW50IGRldmljZV9mbiwgdW5zaWduZWQgaW50IHdoZXJlLCB1bnNpZ25lZCBpbnQgKnZhbHVlKTsKLWV4dGVybiBpbnQgcGNpYmlvc193cml0ZV9jb25maWdfZHdvcmQodW5zaWduZWQgaW50IGJ1cywgdW5zaWduZWQgaW50IGRldmljZV9mbiwgdW5zaWduZWQgaW50IHdoZXJlLCB1bnNpZ25lZCBpbnQgdmFsdWUpOwotdm9pZCBhZGp1c3RfcGNpX2RldmljZShzdHJ1Y3QgcGNpX2RldmljZSAqcCk7CiAjZW5kaWYJLyogUENJX0ggKi8KZGlmZiAtTmF1ciBncnViLTAuOTcub3JpZy9uZXRib290L3BjaV9pZHMuaCBncnViLTAuOTcvbmV0Ym9vdC9wY2lfaWRzLmgKLS0tIGdydWItMC45Ny5vcmlnL25ldGJvb3QvcGNpX2lkcy5oCTE5NzAtMDEtMDEgMDA6MDA6MDAuMDAwMDAwMDAwICswMDAwCisrKyBncnViLTAuOTcvbmV0Ym9vdC9wY2lfaWRzLmgJMjAwNS0wOC0zMSAxOTowMzozNS4wMDAwMDAwMDAgKzAwMDAKQEAgLTAsMCArMSwxODA5IEBACisvKgorICoJUENJIENsYXNzLCBWZW5kb3IgYW5kIERldmljZSBJRHMKKyAqCisgKglQbGVhc2Uga2VlcCBzb3J0ZWQuCisgKi8KKworLyogRGV2aWNlIGNsYXNzZXMgYW5kIHN1YmNsYXNzZXMgKi8KKworI2RlZmluZSBQQ0lfQ0xBU1NfTk9UX0RFRklORUQJCTB4MDAwMAorI2RlZmluZSBQQ0lfQ0xBU1NfTk9UX0RFRklORURfVkdBCTB4MDAwMQorCisjZGVmaW5lIFBDSV9CQVNFX0NMQVNTX1NUT1JBR0UJCTB4MDEKKyNkZWZpbmUgUENJX0NMQVNTX1NUT1JBR0VfU0NTSQkJMHgwMTAwCisjZGVmaW5lIFBDSV9DTEFTU19TVE9SQUdFX0lERQkJMHgwMTAxCisjZGVmaW5lIFBDSV9DTEFTU19TVE9SQUdFX0ZMT1BQWQkweDAxMDIKKyNkZWZpbmUgUENJX0NMQVNTX1NUT1JBR0VfSVBJCQkweDAxMDMKKyNkZWZpbmUgUENJX0NMQVNTX1NUT1JBR0VfUkFJRAkJMHgwMTA0CisjZGVmaW5lIFBDSV9DTEFTU19TVE9SQUdFX09USEVSCQkweDAxODAKKworI2RlZmluZSBQQ0lfQkFTRV9DTEFTU19ORVRXT1JLCQkweDAyCisjZGVmaW5lIFBDSV9DTEFTU19ORVRXT1JLX0VUSEVSTkVUCTB4MDIwMAorI2RlZmluZSBQQ0lfQ0xBU1NfTkVUV09SS19UT0tFTl9SSU5HCTB4MDIwMQorI2RlZmluZSBQQ0lfQ0xBU1NfTkVUV09SS19GRERJCQkweDAyMDIKKyNkZWZpbmUgUENJX0NMQVNTX05FVFdPUktfQVRNCQkweDAyMDMKKyNkZWZpbmUgUENJX0NMQVNTX05FVFdPUktfT1RIRVIJCTB4MDI4MAorCisjZGVmaW5lIFBDSV9CQVNFX0NMQVNTX0RJU1BMQVkJCTB4MDMKKyNkZWZpbmUgUENJX0NMQVNTX0RJU1BMQVlfVkdBCQkweDAzMDAKKyNkZWZpbmUgUENJX0NMQVNTX0RJU1BMQVlfWEdBCQkweDAzMDEKKyNkZWZpbmUgUENJX0NMQVNTX0RJU1BMQVlfM0QJCTB4MDMwMgorI2RlZmluZSBQQ0lfQ0xBU1NfRElTUExBWV9PVEhFUgkJMHgwMzgwCisKKyNkZWZpbmUgUENJX0JBU0VfQ0xBU1NfTVVMVElNRURJQQkweDA0CisjZGVmaW5lIFBDSV9DTEFTU19NVUxUSU1FRElBX1ZJREVPCTB4MDQwMAorI2RlZmluZSBQQ0lfQ0xBU1NfTVVMVElNRURJQV9BVURJTwkweDA0MDEKKyNkZWZpbmUgUENJX0NMQVNTX01VTFRJTUVESUFfUEhPTkUJMHgwNDAyCisjZGVmaW5lIFBDSV9DTEFTU19NVUxUSU1FRElBX09USEVSCTB4MDQ4MAorCisjZGVmaW5lIFBDSV9CQVNFX0NMQVNTX01FTU9SWQkJMHgwNQorI2RlZmluZSBQQ0lfQ0xBU1NfTUVNT1JZX1JBTQkJMHgwNTAwCisjZGVmaW5lIFBDSV9DTEFTU19NRU1PUllfRkxBU0gJCTB4MDUwMQorI2RlZmluZSBQQ0lfQ0xBU1NfTUVNT1JZX09USEVSCQkweDA1ODAKKworI2RlZmluZSBQQ0lfQkFTRV9DTEFTU19CUklER0UJCTB4MDYKKyNkZWZpbmUgUENJX0NMQVNTX0JSSURHRV9IT1NUCQkweDA2MDAKKyNkZWZpbmUgUENJX0NMQVNTX0JSSURHRV9JU0EJCTB4MDYwMQorI2RlZmluZSBQQ0lfQ0xBU1NfQlJJREdFX0VJU0EJCTB4MDYwMgorI2RlZmluZSBQQ0lfQ0xBU1NfQlJJREdFX01DCQkweDA2MDMKKyNkZWZpbmUgUENJX0NMQVNTX0JSSURHRV9QQ0kJCTB4MDYwNAorI2RlZmluZSBQQ0lfQ0xBU1NfQlJJREdFX1BDTUNJQQkJMHgwNjA1CisjZGVmaW5lIFBDSV9DTEFTU19CUklER0VfTlVCVVMJCTB4MDYwNgorI2RlZmluZSBQQ0lfQ0xBU1NfQlJJREdFX0NBUkRCVVMJMHgwNjA3CisjZGVmaW5lIFBDSV9DTEFTU19CUklER0VfUkFDRVdBWQkweDA2MDgKKyNkZWZpbmUgUENJX0NMQVNTX0JSSURHRV9PVEhFUgkJMHgwNjgwCisKKyNkZWZpbmUgUENJX0JBU0VfQ0xBU1NfQ09NTVVOSUNBVElPTgkweDA3CisjZGVmaW5lIFBDSV9DTEFTU19DT01NVU5JQ0FUSU9OX1NFUklBTAkweDA3MDAKKyNkZWZpbmUgUENJX0NMQVNTX0NPTU1VTklDQVRJT05fUEFSQUxMRUwgMHgwNzAxCisjZGVmaW5lIFBDSV9DTEFTU19DT01NVU5JQ0FUSU9OX01VTFRJU0VSSUFMIDB4MDcwMgorI2RlZmluZSBQQ0lfQ0xBU1NfQ09NTVVOSUNBVElPTl9NT0RFTQkweDA3MDMKKyNkZWZpbmUgUENJX0NMQVNTX0NPTU1VTklDQVRJT05fT1RIRVIJMHgwNzgwCisKKyNkZWZpbmUgUENJX0JBU0VfQ0xBU1NfU1lTVEVNCQkweDA4CisjZGVmaW5lIFBDSV9DTEFTU19TWVNURU1fUElDCQkweDA4MDAKKyNkZWZpbmUgUENJX0NMQVNTX1NZU1RFTV9ETUEJCTB4MDgwMQorI2RlZmluZSBQQ0lfQ0xBU1NfU1lTVEVNX1RJTUVSCQkweDA4MDIKKyNkZWZpbmUgUENJX0NMQVNTX1NZU1RFTV9SVEMJCTB4MDgwMworI2RlZmluZSBQQ0lfQ0xBU1NfU1lTVEVNX1BDSV9IT1RQTFVHCTB4MDgwNAorI2RlZmluZSBQQ0lfQ0xBU1NfU1lTVEVNX09USEVSCQkweDA4ODAKKworI2RlZmluZSBQQ0lfQkFTRV9DTEFTU19JTlBVVAkJMHgwOQorI2RlZmluZSBQQ0lfQ0xBU1NfSU5QVVRfS0VZQk9BUkQJMHgwOTAwCisjZGVmaW5lIFBDSV9DTEFTU19JTlBVVF9QRU4JCTB4MDkwMQorI2RlZmluZSBQQ0lfQ0xBU1NfSU5QVVRfTU9VU0UJCTB4MDkwMgorI2RlZmluZSBQQ0lfQ0xBU1NfSU5QVVRfU0NBTk5FUgkJMHgwOTAzCisjZGVmaW5lIFBDSV9DTEFTU19JTlBVVF9HQU1FUE9SVAkweDA5MDQKKyNkZWZpbmUgUENJX0NMQVNTX0lOUFVUX09USEVSCQkweDA5ODAKKworI2RlZmluZSBQQ0lfQkFTRV9DTEFTU19ET0NLSU5HCQkweDBhCisjZGVmaW5lIFBDSV9DTEFTU19ET0NLSU5HX0dFTkVSSUMJMHgwYTAwCisjZGVmaW5lIFBDSV9DTEFTU19ET0NLSU5HX09USEVSCQkweDBhODAKKworI2RlZmluZSBQQ0lfQkFTRV9DTEFTU19QUk9DRVNTT1IJMHgwYgorI2RlZmluZSBQQ0lfQ0xBU1NfUFJPQ0VTU09SXzM4NgkJMHgwYjAwCisjZGVmaW5lIFBDSV9DTEFTU19QUk9DRVNTT1JfNDg2CQkweDBiMDEKKyNkZWZpbmUgUENJX0NMQVNTX1BST0NFU1NPUl9QRU5USVVNCTB4MGIwMgorI2RlZmluZSBQQ0lfQ0xBU1NfUFJPQ0VTU09SX0FMUEhBCTB4MGIxMAorI2RlZmluZSBQQ0lfQ0xBU1NfUFJPQ0VTU09SX1BPV0VSUEMJMHgwYjIwCisjZGVmaW5lIFBDSV9DTEFTU19QUk9DRVNTT1JfTUlQUwkweDBiMzAKKyNkZWZpbmUgUENJX0NMQVNTX1BST0NFU1NPUl9DTwkJMHgwYjQwCisKKyNkZWZpbmUgUENJX0JBU0VfQ0xBU1NfU0VSSUFMCQkweDBjCisjZGVmaW5lIFBDSV9DTEFTU19TRVJJQUxfRklSRVdJUkUJMHgwYzAwCisjZGVmaW5lIFBDSV9DTEFTU19TRVJJQUxfQUNDRVNTCQkweDBjMDEKKyNkZWZpbmUgUENJX0NMQVNTX1NFUklBTF9TU0EJCTB4MGMwMgorI2RlZmluZSBQQ0lfQ0xBU1NfU0VSSUFMX1VTQgkJMHgwYzAzCisjZGVmaW5lIFBDSV9DTEFTU19TRVJJQUxfRklCRVIJCTB4MGMwNAorI2RlZmluZSBQQ0lfQ0xBU1NfU0VSSUFMX1NNQlVTCQkweDBjMDUKKworI2RlZmluZSBQQ0lfQkFTRV9DTEFTU19JTlRFTExJR0VOVAkweDBlCisjZGVmaW5lIFBDSV9DTEFTU19JTlRFTExJR0VOVF9JMk8JMHgwZTAwCisKKyNkZWZpbmUgUENJX0JBU0VfQ0xBU1NfU0FURUxMSVRFCTB4MGYKKyNkZWZpbmUgUENJX0NMQVNTX1NBVEVMTElURV9UVgkJMHgwZjAwCisjZGVmaW5lIFBDSV9DTEFTU19TQVRFTExJVEVfQVVESU8JMHgwZjAxCisjZGVmaW5lIFBDSV9DTEFTU19TQVRFTExJVEVfVk9JQ0UJMHgwZjAzCisjZGVmaW5lIFBDSV9DTEFTU19TQVRFTExJVEVfREFUQQkweDBmMDQKKworI2RlZmluZSBQQ0lfQkFTRV9DTEFTU19DUllQVAkJMHgxMAorI2RlZmluZSBQQ0lfQ0xBU1NfQ1JZUFRfTkVUV09SSwkJMHgxMDAwCisjZGVmaW5lIFBDSV9DTEFTU19DUllQVF9FTlRFUlRBSU5NRU5UCTB4MTAwMQorI2RlZmluZSBQQ0lfQ0xBU1NfQ1JZUFRfT1RIRVIJCTB4MTA4MAorCisjZGVmaW5lIFBDSV9CQVNFX0NMQVNTX1NJR05BTF9QUk9DRVNTSU5HIDB4MTEKKyNkZWZpbmUgUENJX0NMQVNTX1NQX0RQSU8JCTB4MTEwMAorI2RlZmluZSBQQ0lfQ0xBU1NfU1BfT1RIRVIJCTB4MTE4MAorCisjZGVmaW5lIFBDSV9DTEFTU19PVEhFUlMJCTB4ZmYKKworLyogVmVuZG9ycyBhbmQgZGV2aWNlcy4gIFNvcnQga2V5OiB2ZW5kb3IgZmlyc3QsIGRldmljZSBuZXh0LiAqLworCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfRFlOQUxJTksJCTB4MDY3NQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0RZTkFMSU5LX0lTNjRQSAkweDE3MDIKKworI2RlZmluZSBQQ0lfVkVORE9SX0lEX0JFUktPTQkJCTB4MDg3MQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0JFUktPTV9BMVQJCTB4ZmZhMQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0JFUktPTV9UX0NPTkNFUFQJCTB4ZmZhMgorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0JFUktPTV9BNFQJCTB4ZmZhNAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0JFUktPTV9TQ0lURUxfUVVBRFJPCTB4ZmZhOAorCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfQ09NUEFRCQkweDBlMTEKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9DT01QQVFfVE9LRU5SSU5HCTB4MDUwOAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0NPTVBBUV8xMjgwCTB4MzAzMworI2RlZmluZSBQQ0lfREVWSUNFX0lEX0NPTVBBUV9UUklGTEVYCTB4NDAwMAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0NPTVBBUV82MDEwCTB4NjAxMAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0NPTVBBUV9TTUFSVDJQCTB4YWUxMAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0NPTVBBUV9ORVRFTDEwMAkweGFlMzIKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9DT01QQVFfTkVURUwxMAkweGFlMzQKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9DT01QQVFfTkVURkxFWDNJCTB4YWUzNQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0NPTVBBUV9ORVRFTDEwMEQJMHhhZTQwCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQ09NUEFRX05FVEVMMTAwUEkJMHhhZTQzCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQ09NUEFRX05FVEVMMTAwSQkweGIwMTEKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9DT01QQVFfQ0lTUwkweGIwNjAKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9DT01QQVFfQ0lTU0IJMHhiMTc4CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQ09NUEFRX1RIVU5ERVIJMHhmMTMwCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQ09NUEFRX05FVEZMRVgzQgkweGYxNTAKKworI2RlZmluZSBQQ0lfVkVORE9SX0lEX05DUgkJMHgxMDAwCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfTFNJX0xPR0lDCQkweDEwMDAKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9OQ1JfNTNDODEwCTB4MDAwMQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX05DUl81M0M4MjAJMHgwMDAyCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTkNSXzUzQzgyNQkweDAwMDMKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9OQ1JfNTNDODE1CTB4MDAwNAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0xTSV81M0M4MTBBUAkweDAwMDUKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9OQ1JfNTNDODYwCTB4MDAwNgorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0xTSV81M0MxNTEwCTB4MDAwYQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX05DUl81M0M4OTYJMHgwMDBiCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTkNSXzUzQzg5NQkweDAwMGMKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9OQ1JfNTNDODg1CTB4MDAwZAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX05DUl81M0M4NzUJMHgwMDBmCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTkNSXzUzQzE1MTAJMHgwMDEwCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTFNJXzUzQzg5NUEJMHgwMDEyCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTFNJXzUzQzg3NUEJMHgwMDEzCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTFNJXzUzQzEwMTBfMzMJMHgwMDIwCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTFNJXzUzQzEwMTBfNjYJMHgwMDIxCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTFNJXzUzQzEwMzAJMHgwMDMwCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTFNJXzUzQzEwMzUJMHgwMDQwCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTkNSXzUzQzg3NUoJMHgwMDhmCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTFNJX0ZDOTA5CQkweDA2MjEKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9MU0lfRkM5MjkJCTB4MDYyMgorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0xTSV9GQzkyOV9MQU4JMHgwNjIzCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTFNJX0ZDOTE5CQkweDA2MjQKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9MU0lfRkM5MTlfTEFOCTB4MDYyNQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX05DUl9ZRUxMT1dGSU4JMHgwNzAxCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTFNJXzYxQzEwMgkweDA5MDEKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9MU0lfNjNDODE1CTB4MTAwMAorCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfQVRJCQkweDEwMDIKKy8qIE1hY2g2NCAqLworI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FUSV82ODgwMAkJMHg0MTU4CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQVRJXzIxNUNUMjIyCTB4NDM1NAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FUSV8yMTA4ODhDWAkweDQzNTgKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9BVElfMjE1RVQyMjIJMHg0NTU0CisvKiBNYWNoNjQgLyBSYWdlICovCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQVRJXzIxNUdCCQkweDQ3NDIKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9BVElfMjE1R0QJCTB4NDc0NAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FUSV8yMTVHSQkJMHg0NzQ5CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQVRJXzIxNUdQCQkweDQ3NTAKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9BVElfMjE1R1EJCTB4NDc1MQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FUSV8yMTVYTAkJMHg0NzUyCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQVRJXzIxNUdUCQkweDQ3NTQKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9BVElfMjE1R1RCCTB4NDc1NQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FUSV8yMTVfSVYJMHg0NzU2CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQVRJXzIxNV9JVwkweDQ3NTcKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9BVElfMjE1X0laCTB4NDc1QQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FUSV8yMTA4ODhHWAkweDQ3NTgKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9BVElfMjE1X0xCCTB4NGM0MgorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FUSV8yMTVfTEQJMHg0YzQ0CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQVRJXzIxNV9MRwkweDRjNDcKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9BVElfMjE1X0xJCTB4NGM0OQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FUSV8yMTVfTE0JMHg0YzRECisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQVRJXzIxNV9MTgkweDRjNEUKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9BVElfMjE1X0xSCTB4NGM1MgorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FUSV8yMTVfTFMJMHg0YzUzCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQVRJXzI2NF9MVAkweDRjNTQKKy8qIE1hY2g2NCBWVCAqLworI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FUSV8yNjRWVAkJMHg1NjU0CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQVRJXzI2NFZVCQkweDU2NTUKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9BVElfMjY0VlYJCTB4NTY1NgorLyogUmFnZTEyOCBQcm8gR0wgKi8KKyNkZWZpbmUgUENJX0RFVklDRV9JRF9BVElfUmFnZTEyOF9QQQkweDUwNDEKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9BVElfUmFnZTEyOF9QQgkweDUwNDIKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9BVElfUmFnZTEyOF9QQwkweDUwNDMKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9BVElfUmFnZTEyOF9QRAkweDUwNDQKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9BVElfUmFnZTEyOF9QRQkweDUwNDUKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9BVElfUkFHRTEyOF9QRgkweDUwNDYKKy8qIFJhZ2UxMjggUHJvIFZSICovCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQVRJX1JBR0UxMjhfUEcJMHg1MDQ3CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQVRJX1JBR0UxMjhfUEgJMHg1MDQ4CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQVRJX1JBR0UxMjhfUEkJMHg1MDQ5CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQVRJX1JBR0UxMjhfUEoJMHg1MDRBCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQVRJX1JBR0UxMjhfUEsJMHg1MDRCCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQVRJX1JBR0UxMjhfUEwJMHg1MDRDCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQVRJX1JBR0UxMjhfUE0JMHg1MDRECisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQVRJX1JBR0UxMjhfUE4JMHg1MDRFCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQVRJX1JBR0UxMjhfUE8JMHg1MDRGCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQVRJX1JBR0UxMjhfUFAJMHg1MDUwCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQVRJX1JBR0UxMjhfUFEJMHg1MDUxCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQVRJX1JBR0UxMjhfUFIJMHg1MDUyCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQVRJX1JBR0UxMjhfVFIJMHg1NDUyCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQVRJX1JBR0UxMjhfUFMJMHg1MDUzCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQVRJX1JBR0UxMjhfUFQJMHg1MDU0CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQVRJX1JBR0UxMjhfUFUJMHg1MDU1CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQVRJX1JBR0UxMjhfUFYJMHg1MDU2CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQVRJX1JBR0UxMjhfUFcJMHg1MDU3CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQVRJX1JBR0UxMjhfUFgJMHg1MDU4CisvKiBSYWdlMTI4IEdMICovCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQVRJX1JBR0UxMjhfUkUJMHg1MjQ1CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQVRJX1JBR0UxMjhfUkYJMHg1MjQ2CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQVRJX1JBR0UxMjhfUkcJMHg1MzRiCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQVRJX1JBR0UxMjhfUkgJMHg1MzRjCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQVRJX1JBR0UxMjhfUkkJMHg1MzRkCisvKiBSYWdlMTI4IFZSICovCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQVRJX1JBR0UxMjhfUksJMHg1MjRiCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQVRJX1JBR0UxMjhfUkwJMHg1MjRjCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQVRJX1JBR0UxMjhfUk0JMHg1MzQ1CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQVRJX1JBR0UxMjhfUk4JMHg1MzQ2CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQVRJX1JBR0UxMjhfUk8JMHg1MzQ3CisvKiBSYWdlMTI4IE0zICovCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQVRJX1JBR0UxMjhfTEUJMHg0YzQ1CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQVRJX1JBR0UxMjhfTEYJMHg0YzQ2CisvKiBSYWdlMTI4IFBybyBVbHRyYSAqLworI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FUSV9SQUdFMTI4X1UxCTB4NTQ0NgorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FUSV9SQUdFMTI4X1UyCTB4NTQ0QworI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FUSV9SQUdFMTI4X1UzCTB4NTQ1MgorLyogUmFkZW9uIE00ICovCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQVRJX1JBREVPTl9MRQkweDRkNDUKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9BVElfUkFERU9OX0xGCTB4NGQ0NgorLyogUmFkZW9uIE5WLTEwMCAqLworI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FUSV9SQURFT05fTjEJMHg1MTU5CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQVRJX1JBREVPTl9OMgkweDUxNWEKKy8qIFJhZGVvbiAqLworI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FUSV9SQURFT05fUkEJMHg1MTQ0CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQVRJX1JBREVPTl9SQgkweDUxNDUKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9BVElfUkFERU9OX1JDCTB4NTE0NgorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FUSV9SQURFT05fUkQJMHg1MTQ3CisKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9WTFNJCQkweDEwMDQKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9WTFNJXzgyQzU5MgkweDAwMDUKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9WTFNJXzgyQzU5MwkweDAwMDYKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9WTFNJXzgyQzU5NAkweDAwMDcKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9WTFNJXzgyQzU5NwkweDAwMDkKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9WTFNJXzgyQzU0MQkweDAwMGMKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9WTFNJXzgyQzU0MwkweDAwMGQKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9WTFNJXzgyQzUzMgkweDAxMDEKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9WTFNJXzgyQzUzNAkweDAxMDIKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9WTFNJXzgyQzUzNQkweDAxMDQKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9WTFNJXzgyQzE0NwkweDAxMDUKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9WTFNJX1ZBUzk2MDExCTB4MDcwMgorCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfQURMCQkweDEwMDUKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9BRExfMjMwMQkJMHgyMzAxCisKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9OUwkJMHgxMDBiCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTlNfODc0MTUJCTB4MDAwMgorI2RlZmluZSBQQ0lfREVWSUNFX0lEX05TXzg3NTYwX0xJTwkweDAwMGUKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9OU184NzU2MF9VU0IJMHgwMDEyCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTlNfODM4MTUJCTB4MDAyMAorI2RlZmluZQlQQ0lfREVWSUNFX0lEX0RQODM4MTUJCTB4MDAyMAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX05TXzgzODIwCQkweDAwMjIKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9OU184NzQxMAkJMHhkMDAxCisKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9UU0VORwkJMHgxMDBjCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfVFNFTkdfVzMyUF8yCTB4MzIwMgorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1RTRU5HX1czMlBfYgkweDMyMDUKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9UU0VOR19XMzJQX2MJMHgzMjA2CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfVFNFTkdfVzMyUF9kCTB4MzIwNworI2RlZmluZSBQQ0lfREVWSUNFX0lEX1RTRU5HX0VUNjAwMAkweDMyMDgKKworI2RlZmluZSBQQ0lfVkVORE9SX0lEX1dFSVRFSwkJMHgxMDBlCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfV0VJVEVLX1A5MDAwCTB4OTAwMQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1dFSVRFS19QOTEwMAkweDkxMDAKKworI2RlZmluZSBQQ0lfVkVORE9SX0lEX0RFQwkJMHgxMDExCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfREVDX0JSRAkJMHgwMDAxCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfREVDX1RVTElQCQkweDAwMDIKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9ERUNfVEdBCQkweDAwMDQKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9ERUNfVFVMSVBfRkFTVAkweDAwMDkKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9ERUNfVEdBMgkJMHgwMDBECisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfREVDX0ZEREkJCTB4MDAwRgorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0RFQ19UVUxJUF9QTFVTCTB4MDAxNAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0RFQ18yMTE0MgkJMHgwMDE5CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfREVDXzIxMDUyCQkweDAwMjEKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9ERUNfMjExNTAJCTB4MDAyMgorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0RFQ18yMTE1MgkJMHgwMDI0CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfREVDXzIxMTUzCQkweDAwMjUKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9ERUNfMjExNTQJCTB4MDAyNgorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0RFQ18yMTI4NQkJMHgxMDY1CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQ09NUEFRXzQyWFgJMHgwMDQ2CisKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9DSVJSVVMJCTB4MTAxMworI2RlZmluZSBQQ0lfREVWSUNFX0lEX0NJUlJVU183NTQ4CTB4MDAzOAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0NJUlJVU181NDMwCTB4MDBhMAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0NJUlJVU181NDM0XzQJMHgwMGE0CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQ0lSUlVTXzU0MzRfOAkweDAwYTgKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9DSVJSVVNfNTQzNgkweDAwYWMKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9DSVJSVVNfNTQ0NgkweDAwYjgKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9DSVJSVVNfNTQ4MAkweDAwYmMKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9DSVJSVVNfNTQ2MgkweDAwZDAKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9DSVJSVVNfNTQ2NAkweDAwZDQKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9DSVJSVVNfNTQ2NQkweDAwZDYKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9DSVJSVVNfNjcyOQkweDExMDAKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9DSVJSVVNfNjgzMgkweDExMTAKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9DSVJSVVNfNzU0MgkweDEyMDAKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9DSVJSVVNfNzU0MwkweDEyMDIKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9DSVJSVVNfNzU0MQkweDEyMDQKKworI2RlZmluZSBQQ0lfVkVORE9SX0lEX0lCTQkJMHgxMDE0CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfSUJNX0ZJUkVfQ09SQUwJMHgwMDBhCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfSUJNX1RSCQkweDAwMTgKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9JQk1fODJHMjY3NQkweDAwMWQKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9JQk1fTUNBCQkweDAwMjAKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9JQk1fODIzNTEJCTB4MDAyMgorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0lCTV9QWVRIT04JMHgwMDJkCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfSUJNX1NFUlZFUkFJRAkweDAwMmUKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9JQk1fVFJfV0FLRQkweDAwM2UKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9JQk1fTVBJQwkJMHgwMDQ2CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfSUJNXzM3ODBJRFNQCTB4MDA3ZAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0lCTV9DSFVLQVIJMHgwMDk2CisjZGVmaW5lCVBDSV9ERVZJQ0VfSURfSUJNXzQwNUdQCQkweDAxNTYKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9JQk1fU0VSVkVSQUlESTk2MAkweDAxYmQKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9JQk1fTVBJQ18yCTB4ZmZmZgorCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfQ09NUEVYMgkJMHgxMDFhIC8vIHBjaS5pZHMgc2F5cyAiQVQmVCBHSVMgKE5DUikiCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQ09NUEVYMl8xMDBWRwkweDAwMDUKKworI2RlZmluZSBQQ0lfVkVORE9SX0lEX1dECQkweDEwMWMKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9XRF83MTk3CQkweDMyOTYKKworI2RlZmluZSBQQ0lfVkVORE9SX0lEX0FNSQkJMHgxMDFlCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQU1JX01FR0FSQUlEMwkweDE5NjAKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9BTUlfTUVHQVJBSUQJMHg5MDEwCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQU1JX01FR0FSQUlEMgkweDkwNjAKKworI2RlZmluZSBQQ0lfVkVORE9SX0lEX0FNRAkJMHgxMDIyCisKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9BTURfTEFOQ0UJCTB4MjAwMAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FNRF9MQU5DRV9IT01FCTB4MjAwMQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FNRF9IT01FUE5BCTB4MjAwMQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FNRF9TQ1NJCQkweDIwMjAKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9BTURfRkVfR0FURV83MDA2CTB4NzAwNgorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FNRF9GRV9HQVRFXzcwMDcJMHg3MDA3CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQU1EX0ZFX0dBVEVfNzAwQwkweDcwMEMKKyNkZWZpbmUgUENJX0RFVklERV9JRF9BTURfRkVfR0FURV83MDBECTB4NzAwRAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FNRF9GRV9HQVRFXzcwMEUJMHg3MDBFCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQU1EX0ZFX0dBVEVfNzAwRgkweDcwMEYKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9BTURfQ09CUkFfNzQwMAkweDc0MDAKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9BTURfQ09CUkFfNzQwMQkweDc0MDEKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9BTURfQ09CUkFfNzQwMwkweDc0MDMKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9BTURfQ09CUkFfNzQwNAkweDc0MDQKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9BTURfVklQRVJfNzQwOAkweDc0MDgKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9BTURfVklQRVJfNzQwOQkweDc0MDkKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9BTURfVklQRVJfNzQwQgkweDc0MEIKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9BTURfVklQRVJfNzQwQwkweDc0MEMKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9BTURfVklQRVJfNzQxMAkweDc0MTAKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9BTURfVklQRVJfNzQxMQkweDc0MTEKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9BTURfVklQRVJfNzQxMwkweDc0MTMKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9BTURfVklQRVJfNzQxNAkweDc0MTQKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9BTURfVklQRVJfNzQ0MAkweDc0NDAKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9BTURfVklQRVJfNzQ0MQkweDc0NDEKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9BTURfVklQRVJfNzQ0MwkweDc0NDMKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9BTURfVklQRVJfNzQ0OAkweDc0NDgKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9BTURfVklQRVJfNzQ0OQkweDc0NDkKKworI2RlZmluZSBQQ0lfVkVORE9SX0lEX1RSSURFTlQJCTB4MTAyMworI2RlZmluZSBQQ0lfREVWSUNFX0lEX1RSSURFTlRfNERXQVZFX0RYCTB4MjAwMAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1RSSURFTlRfNERXQVZFX05YCTB4MjAwMQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1RSSURFTlRfOTMyMAkweDkzMjAKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9UUklERU5UXzkzODgJMHg5Mzg4CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfVFJJREVOVF85Mzk3CTB4OTM5NworI2RlZmluZSBQQ0lfREVWSUNFX0lEX1RSSURFTlRfOTM5QQkweDkzOUEKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9UUklERU5UXzk1MjAJMHg5NTIwCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfVFJJREVOVF85NTI1CTB4OTUyNQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1RSSURFTlRfOTQyMAkweDk0MjAKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9UUklERU5UXzk0NDAJMHg5NDQwCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfVFJJREVOVF85NjYwCTB4OTY2MAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1RSSURFTlRfOTc1MAkweDk3NTAKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9UUklERU5UXzk4NTAJMHg5ODUwCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfVFJJREVOVF85ODgwCTB4OTg4MAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1RSSURFTlRfODQwMAkweDg0MDAKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9UUklERU5UXzg0MjAJMHg4NDIwCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfVFJJREVOVF84NTAwCTB4ODUwMAorCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfQUkJCTB4MTAyNQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FJX00xNDM1CQkweDE0MzUKKworI2RlZmluZSBQQ0lfVkVORE9SX0lEX0RFTEwgICAgICAgICAgICAgIDB4MTAyOAorCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfTUFUUk9YCQkweDEwMkIKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9NQVRST1hfTUdBXzIJMHgwNTE4CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTUFUUk9YX01JTAkweDA1MTkKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9NQVRST1hfTVlTCTB4MDUxQQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX01BVFJPWF9NSUxfMgkweDA1MWIKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9NQVRST1hfTUlMXzJfQUdQCTB4MDUxZgorI2RlZmluZSBQQ0lfREVWSUNFX0lEX01BVFJPWF9NR0FfSU1QCTB4MGQxMAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX01BVFJPWF9HMTAwX01NCTB4MTAwMAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX01BVFJPWF9HMTAwX0FHUAkweDEwMDEKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9NQVRST1hfRzIwMF9QQ0kJMHgwNTIwCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTUFUUk9YX0cyMDBfQUdQCTB4MDUyMQorI2RlZmluZQlQQ0lfREVWSUNFX0lEX01BVFJPWF9HNDAwCTB4MDUyNQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX01BVFJPWF9HNTUwCTB4MjUyNworI2RlZmluZSBQQ0lfREVWSUNFX0lEX01BVFJPWF9WSUEJMHg0NTM2CisKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9DVAkJMHgxMDJjCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQ1RfNjU1NDUJCTB4MDBkOAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0NUXzY1NTQ4CQkweDAwZGMKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9DVF82NTU1MAkJMHgwMGUwCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQ1RfNjU1NTQJCTB4MDBlNAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0NUXzY1NTU1CQkweDAwZTUKKworI2RlZmluZSBQQ0lfVkVORE9SX0lEX01JUk8JCTB4MTAzMQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX01JUk9fMzYwNTAJMHg1NjAxCisKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9ORUMJCTB4MTAzMworI2RlZmluZSBQQ0lfREVWSUNFX0lEX05FQ19QQ1gyCQkweDAwNDYKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9ORUNfTklMRTQJCTB4MDA1YQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX05FQ19WUkM1NDc2ICAgICAgIDB4MDA5YgorCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfRkQJCTB4MTAzNgorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0ZEXzM2QzcwCQkweDAwMDAKKworI2RlZmluZSBQQ0lfVkVORE9SX0lEX1NJUyAgICAgICAgIAkweDEwMzkKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9TSQkJMHgxMDM5CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfU0lfNTU5MV9BR1AJMHgwMDAxCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfU0lfNjIwMgkJMHgwMDAyCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfU0lfNTAzCQkweDAwMDgKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9TSV9BQ1BJCQkweDAwMDkKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9TSV81NTk3X1ZHQQkweDAyMDAKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9TSV82MjA1CQkweDAyMDUKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9TSV81MDEJCTB4MDQwNgorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1NJXzQ5NgkJMHgwNDk2CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfU0lfMzAwCQkweDAzMDAKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9TSV8zMTVICQkweDAzMTAKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9TSV8zMTUJCTB4MDMxNQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1NJXzMxNVBSTwkJMHgwMzI1CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfU0lfNTMwCQkweDA1MzAKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9TSV81NDAJCTB4MDU0MAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1NJXzU1MAkJMHgwNTUwCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfU0lfNjAxCQkweDA2MDEKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9TSV82MjAJCTB4MDYyMAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1NJXzYzMAkJMHgwNjMwCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfU0lfNjM1CQkweDA2MzUKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9TSV82NDAJCTB4MDY0MAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1NJXzY0NQkJMHgwNjQ1CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfU0lfNjUwCQkweDA2NTAKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9TSV83MzAJCTB4MDczMAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1NJXzczNQkJMHgwNzM1CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfU0lfNzQwCQkweDA3NDAKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9TSV83NDUJCTB4MDc0NQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1NJXzc1MAkJMHgwNzUwCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfU0lfOTAwCQkweDA5MDAKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9TSVM5MDAJCTB4MDkwMAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1NJXzUxMDcJCTB4NTEwNworI2RlZmluZSBQQ0lfREVWSUNFX0lEX1NJXzUzMDAJCTB4NTMwMAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1NJXzU0MF9WR0EJMHg1MzAwCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfU0lfNTUwX1ZHQQkweDUzMTUKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9TSV81NTExCQkweDU1MTEKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9TSV81NTEzCQkweDU1MTMKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9TSV81NTcxCQkweDU1NzEKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9TSV81NTkxCQkweDU1OTEKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9TSV81NTk3CQkweDU1OTcKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9TSV81NTk4CQkweDU1OTgKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9TSV81NjAwCQkweDU2MDAKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9TSV82MzAwCQkweDYzMDAKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9TSV82MzBfVkdBCTB4NjMwMAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1NJXzYzMDYJCTB4NjMwNgorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1NJXzYzMjYJCTB4NjMyNgorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1NJXzcwMDEJCTB4NzAwMQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1NJXzcwMTYJCTB4NzAxNgorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1NJUzcwMTYgICAgCTB4NzAxNiAgCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfU0lfNzMwX1ZHQQkweDczMDAKKworI2RlZmluZSBQQ0lfVkVORE9SX0lEX0hQCQkweDEwM2MKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9IUF9ET05ORVJfR0ZYCTB4MTAwOAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0hQX1RBQ0hZT04JMHgxMDI4CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfSFBfVEFDSExJVEUJMHgxMDI5CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfSFBfSjI1ODVBCQkweDEwMzAKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9IUF9KMjU4NUIJCTB4MTAzMQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0hQX1NBUwkJMHgxMDQ4CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfSFBfRElWQTEJCTB4MTA0OQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0hQX0RJVkEyCQkweDEwNEEKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9IUF9TUDJfMAkJMHgxMDRCCisKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9QQ1RFQ0gJCTB4MTA0MgorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1BDVEVDSF9SWjEwMDAJMHgxMDAwCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfUENURUNIX1JaMTAwMQkweDEwMDEKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9QQ1RFQ0hfU0FNVVJBSV8wCTB4MzAwMAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1BDVEVDSF9TQU1VUkFJXzEJMHgzMDEwCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfUENURUNIX1NBTVVSQUlfSURFIDB4MzAyMAorCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfQVNVU1RFSwkJMHgxMDQzCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQVNVU1RFS18wNjc1CTB4MDY3NQorCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfRFBUCQkweDEwNDQKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9EUFQJCTB4YTQwMAorCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfT1BUSQkJMHgxMDQ1CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfT1BUSV85MkMxNzgJMHhjMTc4CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfT1BUSV84MkM1NTcJMHhjNTU3CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfT1BUSV84MkM1NTgJMHhjNTU4CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfT1BUSV84MkM2MjEJMHhjNjIxCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfT1BUSV84MkM3MDAJMHhjNzAwCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfT1BUSV84MkM3MDEJMHhjNzAxCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfT1BUSV84MkM4MTQJMHhjODE0CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfT1BUSV84MkM4MjIJMHhjODIyCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfT1BUSV84MkM4NjEJMHhjODYxCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfT1BUSV84MkM4MjUJMHhkNTY4CisKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9FTFNBCQkweDEwNDgKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9FTFNBX01JQ1JPTElOSwkweDEwMDAKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9FTFNBX1FTMzAwMAkweDMwMDAKKworI2RlZmluZSBQQ0lfVkVORE9SX0lEX0VMU0EJCTB4MTA0OAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0VMU0FfTUlDUk9MSU5LCTB4MTAwMAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0VMU0FfUVMzMDAwCTB4MzAwMAorCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfU0dTCQkweDEwNGEKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9TR1NfMjAwMAkJMHgwMDA4CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfU0dTXzE3NjQJCTB4MDAwOQorCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfQlVTTE9HSUMJCSAgICAgIDB4MTA0QgorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0JVU0xPR0lDX01VTFRJTUFTVEVSX05DIDB4MDE0MAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0JVU0xPR0lDX01VTFRJTUFTVEVSICAgIDB4MTA0MAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0JVU0xPR0lDX0ZMQVNIUE9JTlQgICAgIDB4ODEzMAorCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfVEkJCTB4MTA0YworI2RlZmluZSBQQ0lfREVWSUNFX0lEX1RJX1RWUDQwMTAJMHgzZDA0CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfVElfVFZQNDAyMAkweDNkMDcKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9USV8xMTMwCQkweGFjMTIKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9USV8xMDMxCQkweGFjMTMKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9USV8xMTMxCQkweGFjMTUKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9USV8xMjUwCQkweGFjMTYKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9USV8xMjIwCQkweGFjMTcKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9USV8xMjIxCQkweGFjMTkKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9USV8xMjEwCQkweGFjMWEKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9USV8xNDEwCQkweGFjNTAKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9USV8xNDUwCQkweGFjMWIKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9USV8xMjI1CQkweGFjMWMKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9USV8xMjUxQQkJMHhhYzFkCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfVElfMTIxMQkJMHhhYzFlCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfVElfMTI1MUIJCTB4YWMxZgorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1RJXzQ0MTAJCTB4YWM0MQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1RJXzQ0NTEJCTB4YWM0MgorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1RJXzE0MjAJCTB4YWM1MQorCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfU09OWQkJMHgxMDRkCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfU09OWV9DWEQzMjIyCTB4ODAzOQorCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfT0FLCQkweDEwNGUKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9PQUtfT1RJMTA3CTB4MDEwNworCisvKiBXaW5ib25kIGhhdmUgdHdvIHZlbmRvciBJRHMhIFNlZSAweDEwYWQgYXMgd2VsbCAqLworI2RlZmluZSBQQ0lfVkVORE9SX0lEX1dJTkJPTkQyCQkweDEwNTAKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9XSU5CT05EMl84OUM4NDAgICAweDA4NDAKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9XSU5CT05EMl84OUM5NDAJMHgwOTQwCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfV0lOQk9ORDJfODlDOTQwRgkweDVhNWEKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9XSU5CT05EMl82NjkyCTB4NjY5MgorCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfQU5JR01BCQkweDEwNTEKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9BTklHTUFfTUMxNDU1NzUJMHgwMTAwCisgIAorI2RlZmluZSBQQ0lfVkVORE9SX0lEX0VGQVIJCTB4MTA1NQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0VGQVJfU0xDOTBFNjZfMQkweDkxMzAKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9FRkFSX1NMQzkwRTY2XzAJMHg5NDYwCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfRUZBUl9TTEM5MEU2Nl8yCTB4OTQ2MgorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0VGQVJfU0xDOTBFNjZfMwkweDk0NjMKKworI2RlZmluZSBQQ0lfVkVORE9SX0lEX01PVE9ST0xBCQkweDEwNTcKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9NT1RPUk9MQV9PT1BTCTB4MTUwNworI2RlZmluZSBQQ0lfREVWSUNFX0lEX01PVE9ST0xBX01QQzEwNQkweDAwMDEKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9NT1RPUk9MQV9NUEMxMDYJMHgwMDAyCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTU9UT1JPTEFfUkFWRU4JMHg0ODAxCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTU9UT1JPTEFfRkFMQ09OCTB4NDgwMgorI2RlZmluZSBQQ0lfREVWSUNFX0lEX01PVE9ST0xBX0NQWDgyMTYJMHg0ODA2CisKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9QUk9NSVNFCQkweDEwNWEKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9QUk9NSVNFXzIwMjY1CTB4MGQzMAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1BST01JU0VfMjAyNjcJMHg0ZDMwCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfUFJPTUlTRV8yMDI0NgkweDRkMzMKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9QUk9NSVNFXzIwMjYyCTB4NGQzOAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1BST01JU0VfMjAyNjgJMHg0ZDY4CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfUFJPTUlTRV8yMDI2OFIJMHg2MjY4CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfUFJPTUlTRV8yMDI2OQkweDRkNjkKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9QUk9NSVNFXzIwMjc1CTB4MTI3NQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1BST01JU0VfNTMwMAkweDUzMDAKKworI2RlZmluZSBQQ0lfVkVORE9SX0lEX045CQkweDEwNWQKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9OOV9JMTI4CQkweDIzMDkKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9OOV9JMTI4XzIJCTB4MjMzOQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX045X0kxMjhfVDJSCTB4NDkzZAorCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfVU1DCQkweDEwNjAKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9VTUNfVU04NjczRgkweDAxMDEKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9VTUNfVU04ODkxQQkweDA4OTEKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9VTUNfVU04ODg2QkYJMHg2NzNhCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfVU1DX1VNODg4NkEJMHg4ODZhCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfVU1DX1VNODg4MUYJMHg4ODgxCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfVU1DX1VNODg4NkYJMHg4ODg2CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfVU1DX1VNOTAxN0YJMHg5MDE3CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfVU1DX1VNODg4Nk4JMHhlODg2CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfVU1DX1VNODg5MU4JMHhlODkxCisKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9YCQkJMHgxMDYxCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfWF9BR1gwMTYJCTB4MDAwMQorCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfTVlMRVgJCTB4MTA2OQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX01ZTEVYX0RBQzk2MF9QCTB4MDAwMQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX01ZTEVYX0RBQzk2MF9QRAkweDAwMDIKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9NWUxFWF9EQUM5NjBfUEcJMHgwMDEwCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTVlMRVhfREFDOTYwX0xBCTB4MDAyMAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX01ZTEVYX0RBQzk2MF9MUAkweDAwNTAKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9NWUxFWF9EQUM5NjBfQkEJMHhCQTU2CisKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9QSUNPUAkJMHgxMDY2CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfUElDT1BfUFQ4NkM1MlgJMHgwMDAxCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfUElDT1BfUFQ4MEM1MjQJMHg4MDAyCisKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9BUFBMRQkJMHgxMDZiCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQVBQTEVfQkFORElUCTB4MDAwMQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FQUExFX0dDCQkweDAwMDIKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9BUFBMRV9IWURSQQkweDAwMGUKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9BUFBMRV9VTklfTl9GVwkweDAwMTgKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9BUFBMRV9LTF9VU0IJMHgwMDE5CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQVBQTEVfVU5JX05fQUdQCTB4MDAyMAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FQUExFX1VOSV9OX0dNQUMJMHgwMDIxCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQVBQTEVfVU5JX05fRlcyCTB4MDAzMAorCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfWUFNQUhBCQkweDEwNzMKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9ZQU1BSEFfNzI0CTB4MDAwNAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1lBTUFIQV83MjRGCTB4MDAwZAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1lBTUFIQV83NDAJMHgwMDBhCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfWUFNQUhBXzc0MEMJMHgwMDBjCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfWUFNQUhBXzc0NAkweDAwMTAKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9ZQU1BSEFfNzU0CTB4MDAxMgorCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfTkVYR0VOCQkweDEwNzQKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9ORVhHRU5fODJDNTAxCTB4NGU3OAorCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfUUxPR0lDCQkweDEwNzcKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9RTE9HSUNfSVNQMTAyMAkweDEwMjAKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9RTE9HSUNfSVNQMTAyMgkweDEwMjIKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9RTE9HSUNfSVNQMjEwMAkweDIxMDAKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9RTE9HSUNfSVNQMjIwMAkweDIyMDAKKworI2RlZmluZSBQQ0lfVkVORE9SX0lEX0NZUklYCQkweDEwNzgKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9DWVJJWF81NTEwCTB4MDAwMAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0NZUklYX1BDSV9NQVNURVIJMHgwMDAxCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQ1lSSVhfNTUyMAkweDAwMDIKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9DWVJJWF81NTMwX0xFR0FDWQkweDAxMDAKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9DWVJJWF81NTMwX1NNSQkweDAxMDEKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9DWVJJWF81NTMwX0lERQkweDAxMDIKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9DWVJJWF81NTMwX0FVRElPCTB4MDEwMworI2RlZmluZSBQQ0lfREVWSUNFX0lEX0NZUklYXzU1MzBfVklERU8JMHgwMTA0CisKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9MRUFEVEVLCQkweDEwN2QKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9MRUFEVEVLXzgwNQkweDAwMDAKKworI2RlZmluZSBQQ0lfVkVORE9SX0lEX0lOVEVSUEhBU0UJMHgxMDdlCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfSU5URVJQSEFTRV81NTI2CTB4MDAwNAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0lOVEVSUEhBU0VfNTV4NgkweDAwMDUKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9JTlRFUlBIQVNFXzU1NzUJMHgwMDA4CisKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9DT05UQVEJCTB4MTA4MAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0NPTlRBUV84MkM1OTkJMHgwNjAwCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQ09OVEFRXzgyQzY5MwkweGM2OTMKKworI2RlZmluZSBQQ0lfVkVORE9SX0lEX0ZPUkVYCQkweDEwODMKKworI2RlZmluZSBQQ0lfVkVORE9SX0lEX09MSUNPTQkJMHgxMDhkCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfT0xJQ09NX09DMzEzNgkweDAwMDEKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9PTElDT01fT0MyMzE1CTB4MDAxMQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX09MSUNPTV9PQzIzMjUJMHgwMDEyCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfT0xJQ09NX09DMjE4MwkweDAwMTMKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9PTElDT01fT0MyMzI2CTB4MDAxNAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX09MSUNPTV9PQzYxNTEJMHgwMDIxCisKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9TVU4JCTB4MTA4ZQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1NVTl9FQlVTCQkweDEwMDAKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9TVU5fSEFQUFlNRUFMCTB4MTAwMQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1NVTl9SSU9fRUJVUwkweDExMDAKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9TVU5fUklPX0dFTQkweDExMDEKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9TVU5fUklPXzEzOTQJMHgxMTAyCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfU1VOX1JJT19VU0IJMHgxMTAzCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfU1VOX0dFTQkJMHgyYmFkCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfU1VOX1NJTUJBCQkweDUwMDAKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9TVU5fUEJNCQkweDgwMDAKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9TVU5fU0NISVpPCTB4ODAwMQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1NVTl9TQUJSRQkJMHhhMDAwCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfU1VOX0hVTU1JTkdCSVJECTB4YTAwMQorCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfQ01ECQkweDEwOTUKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9DTURfNjQwCQkweDA2NDAKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9DTURfNjQzCQkweDA2NDMKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9DTURfNjQ2CQkweDA2NDYKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9DTURfNjQ3CQkweDA2NDcKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9DTURfNjQ4CQkweDA2NDgKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9DTURfNjQ5CQkweDA2NDkKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9DTURfNjcwCQkweDA2NzAKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9DTURfNjgwCQkweDA2ODAKKworI2RlZmluZSBQQ0lfVkVORE9SX0lEX1ZJU0lPTgkJMHgxMDk4CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfVklTSU9OX1FEODUwMAkweDAwMDEKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9WSVNJT05fUUQ4NTgwCTB4MDAwMgorCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfQlJPT0tUUkVFCQkweDEwOWUKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9CUk9PS1RSRUVfODQ4CTB4MDM1MAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0JST09LVFJFRV84NDlBCTB4MDM1MQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0JST09LVFJFRV84NzhfMQkweDAzNmUKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9CUk9PS1RSRUVfODc4CTB4MDg3OAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0JST09LVFJFRV84NDc0CTB4ODQ3NAorCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfU0lFUlJBCQkweDEwYTgKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9TSUVSUkFfU1RCCTB4MDAwMAorCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfU0dJCQkweDEwYTkKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9TR0lfSU9DMwkJMHgwMDAzCisKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9BQ0MJCTB4MTBhYQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FDQ18yMDU2CQkweDAwMDAKKworI2RlZmluZSBQQ0lfVkVORE9SX0lEX1dJTkJPTkQJCTB4MTBhZAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1dJTkJPTkRfODM3NjkJMHgwMDAxCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfV0lOQk9ORF84MkMxMDUJMHgwMTA1CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfV0lOQk9ORF84M0M1NTMJMHgwNTY1CisKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9EQVRBQk9PSwkJMHgxMGIzCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfREFUQUJPT0tfODcxNDQJMHhiMTA2CisKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9QTFgJCTB4MTBiNQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1BMWF9SNjg1CQkweDEwMzAKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9QTFhfUk9NVUxVUwkweDEwNmEKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9QTFhfU1BDT004MDAJMHgxMDc2CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfUExYXzEwNzcJCTB4MTA3NworI2RlZmluZSBQQ0lfREVWSUNFX0lEX1BMWF9TUENPTTIwMAkweDExMDMKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9QTFhfREpJTk5fSVRPTwkweDExNTEKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9QTFhfUjc1MwkJMHgxMTUyCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfUExYXzkwNTAJCTB4OTA1MAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1BMWF85MDYwCQkweDkwNjAKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9QTFhfOTA2MEVTCTB4OTA2RQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1BMWF85MDYwU0QJMHg5MDZECisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfUExYXzkwODAJCTB4OTA4MAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1BMWF9HVEVLX1NFUklBTDIJMHhhMDAxCisKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9NQURHRQkJMHgxMGI2CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTUFER0VfTUsyCQkweDAwMDIKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9NQURHRV9DMTU1UwkweDEwMDEKKworI2RlZmluZSBQQ0lfVkVORE9SX0lEXzNDT00JCTB4MTBiNworI2RlZmluZSBQQ0lfREVWSUNFX0lEXzNDT01fM0M5ODUJMHgwMDAxCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfM0NPTV8zQzMzOQkweDMzOTAKKyNkZWZpbmUgUENJX0RFVklDRV9JRF8zQ09NXzNDNTkwCTB4NTkwMAorI2RlZmluZSBQQ0lfREVWSUNFX0lEXzNDT01fM0M1OTUJMHg1OTUwCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfM0NPTV8zQzU5NVRYCTB4NTk1MAorI2RlZmluZSBQQ0lfREVWSUNFX0lEXzNDT01fM0M1OTVfMQkweDU5NTEKKyNkZWZpbmUgUENJX0RFVklDRV9JRF8zQ09NXzNDNTk1VDQJMHg1OTUxCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfM0NPTV8zQzU5NV8yCTB4NTk1MgorI2RlZmluZSBQQ0lfREVWSUNFX0lEXzNDT01fM0M1OTVNSUkJMHg1OTUyCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfM0NPTV8zQzkwMFRQTwkweDkwMDAKKyNkZWZpbmUgUENJX0RFVklDRV9JRF8zQ09NXzNDOTAwQ09NQk8JMHg5MDAxCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfM0NPTV8zQzkwNVRYCTB4OTA1MAorI2RlZmluZSBQQ0lfREVWSUNFX0lEXzNDT01fM0M5MDVUNAkweDkwNTEKKyNkZWZpbmUgUENJX0RFVklDRV9JRF8zQ09NXzNDOTA1Ql9UWAkweDkwNTUKKyNkZWZpbmUgUENJX0RFVklDRV9JRF8zQ09NXzNDOTA1Q19UWE0JMHg5MjAwCisKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9TTUMJCTB4MTBiOAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1NNQ19FUElDMTAwCTB4MDAwNQorCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfU1VOREFOQ0UJCTB4MTNGMAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1NVTkRBTkNFX0FMVEEJMHgwMjAxCisKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9BTAkJMHgxMGI5CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQUxfTTE0NDUJCTB4MTQ0NQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FMX00xNDQ5CQkweDE0NDkKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9BTF9NMTQ1MQkJMHgxNDUxCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQUxfTTE0NjEJCTB4MTQ2MQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FMX00xNDg5CQkweDE0ODkKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9BTF9NMTUxMQkJMHgxNTExCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQUxfTTE1MTMJCTB4MTUxMworI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FMX00xNTIxCQkweDE1MjEKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9BTF9NMTUyMwkJMHgxNTIzCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQUxfTTE1MzEJCTB4MTUzMQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FMX00xNTMzCQkweDE1MzMKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9BTF9NMTU0MQkJMHgxNTQxCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQUxfTTE2MjEgICAgICAgICAgMHgxNjIxCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQUxfTTE2MzEgICAgICAgICAgMHgxNjMxCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQUxfTTE2NDEgICAgICAgICAgMHgxNjQxCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQUxfTTE2NDcgICAgICAgICAgMHgxNjQ3CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQUxfTTE2NTEgICAgICAgICAgMHgxNjUxCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQUxfTTE1NDMJCTB4MTU0MworI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FMX00zMzA3CQkweDMzMDcKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9BTF9NNDgwMwkJMHg1MjE1CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQUxfTTUyMTkJCTB4NTIxOQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FMX001MjI5CQkweDUyMjkKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9BTF9NNTIzNwkJMHg1MjM3CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQUxfTTUyNDMJCTB4NTI0MworI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FMX001NDUxCQkweDU0NTEKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9BTF9NNzEwMQkJMHg3MTAxCisKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9NSVRTVUJJU0hJCTB4MTBiYQorCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfU1VSRUNPTQkJMHgxMGJkCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfU1VSRUNPTV9ORTM0CTB4MGUzNAorCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfTkVPTUFHSUMJCTB4MTBjOAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX05FT01BR0lDX01BR0lDR1JBUEhfTk0yMDcwIDB4MDAwMQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX05FT01BR0lDX01BR0lDR1JBUEhfMTI4ViAweDAwMDIKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9ORU9NQUdJQ19NQUdJQ0dSQVBIXzEyOFpWIDB4MDAwMworI2RlZmluZSBQQ0lfREVWSUNFX0lEX05FT01BR0lDX01BR0lDR1JBUEhfTk0yMTYwIDB4MDAwNAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX05FT01BR0lDX01BR0lDTUVESUFfMjU2QVYgICAgICAgMHgwMDA1CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTkVPTUFHSUNfTUFHSUNHUkFQSF8xMjhaVlBMVVMgICAweDAwODMKKworI2RlZmluZSBQQ0lfVkVORE9SX0lEX0FTUAkJMHgxMGNkCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQVNQX0FCUDk0MAkweDEyMDAKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9BU1BfQUJQOTQwVQkweDEzMDAKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9BU1BfQUJQOTQwVVcJMHgyMzAwCisKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9NQUNST05JWAkJMHgxMGQ5CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTUFDUk9OSVhfTVg5ODcxMwkweDA1MTIKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9NWDk4N3gzCQkweDA1MTIKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9NQUNST05JWF9NWDk4N3g1CTB4MDUzMQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX01YOTg3eDUJCTB4MDUzMQorCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfVENPTlJBRAkJMHgxMGRhCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfVENPTlJBRF9UT0tFTlJJTkcJMHgwNTA4CisKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9DRVJOCQkweDEwZGMKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9DRVJOX1NQU0JfUE1DCTB4MDAwMQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0NFUk5fU1BTQl9QQ0kJMHgwMDAyCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQ0VSTl9ISVBQSV9EU1QJMHgwMDIxCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQ0VSTl9ISVBQSV9TUkMJMHgwMDIyCisKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9OVklESUEJCQkweDEwZGUKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9OVklESUFfVE5UCQkweDAwMjAKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9OVklESUFfVE5UMgkJMHgwMDI4CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTlZJRElBX1VUTlQyCQkweDAwMjkKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9OVklESUFfVlROVDIJCTB4MDAyQworI2RlZmluZSBQQ0lfREVWSUNFX0lEX05WSURJQV9VVlROVDIJCTB4MDAyRAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX05WSURJQV9JVE5UMgkJMHgwMEEwCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTlZJRElBX0dFRk9SQ0VfU0RSCTB4MDEwMAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX05WSURJQV9HRUZPUkNFX0REUgkweDAxMDEKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9OVklESUFfUVVBRFJPCQkweDAxMDMKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9OVklESUFfR0VGT1JDRTJfTVgJMHgwMTEwCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTlZJRElBX0dFRk9SQ0UyX01YMgkweDAxMTEKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9OVklESUFfUVVBRFJPMl9NWFIJMHgwMTEzCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTlZJRElBX0dFRk9SQ0UyX0dUUwkweDAxNTAKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9OVklESUFfR0VGT1JDRTJfR1RTMgkweDAxNTEKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9OVklESUFfR0VGT1JDRTJfVUxUUkEJMHgwMTUyCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTlZJRElBX1FVQURSTzJfUFJPCTB4MDE1MworCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfSU1TCQkweDEwZTAKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9JTVNfODg0OQkJMHg4ODQ5CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfSU1TX1RUMTI4CQkweDkxMjgKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9JTVNfVFQzRAkJMHg5MTM1CisKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9URUtSQU0yCQkweDEwZTEKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9URUtSQU0yXzY5MGMJMHg2OTBjCisKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9UVU5EUkEJCTB4MTBlMworI2RlZmluZSBQQ0lfREVWSUNFX0lEX1RVTkRSQV9DQTkxQzA0MgkweDAwMDAKKworI2RlZmluZSBQQ0lfVkVORE9SX0lEX0FNQ0MJCTB4MTBlOAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FNQ0NfTVlSSU5FVAkweDgwNDMKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9BTUNDX1BBUkFTVEFUSU9OCTB4ODA2MgorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FNQ0NfUzU5MzMJMHg4MDdkCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQU1DQ19TNTkzM19IRVBDMwkweDgwOWMKKworI2RlZmluZSBQQ0lfVkVORE9SX0lEX0lOVEVSRwkJMHgxMGVhCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfSU5URVJHXzE2ODAJMHgxNjgwCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfSU5URVJHXzE2ODIJMHgxNjgyCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfSU5URVJHXzIwMDAJMHgyMDAwCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfSU5URVJHXzIwMTAJMHgyMDEwCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfSU5URVJHXzUwMDAJMHg1MDAwCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfSU5URVJHXzUwNTAJMHg1MDUwCisKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9SRUFMVEVLCQkweDEwZWMKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9SRUFMVEVLXzgwMjkJMHg4MDI5CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfUkVBTFRFS184MTI5CTB4ODEyOQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1JFQUxURUtfODEzOQkweDgxMzkKKworI2RlZmluZSBQQ0lfVkVORE9SX0lEX1hJTElOWAkJMHgxMGVlCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfVFVSQk9QQU0JCTB4NDAyMAorCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfVFJVRVZJU0lPTgkweDEwZmEKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9UUlVFVklTSU9OX1QxMDAwCTB4MDAwYworCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfSU5JVAkJMHgxMTAxCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfSU5JVF8zMjBQCQkweDkxMDAKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9JTklUXzM2MFAJCTB4OTUwMAorCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfQ1JFQVRJVkUJCTB4MTEwMiAvLyBkdXBsaWNhdGU6IEVDVElWQQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0NSRUFUSVZFX0VNVTEwSzEJMHgwMDAyCisKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9FQ1RJVkEJCTB4MTEwMiAvLyBkdXBsaWNhdGU6IENSRUFUSVZFCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfRUNUSVZBX0VWMTkzOAkweDg5MzgKKworI2RlZmluZSBQQ0lfVkVORE9SX0lEX1RUSQkJMHgxMTAzCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfVFRJX0hQVDM0MwkweDAwMDMKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9UVElfSFBUMzY2CTB4MDAwNAorCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfVklBCQkweDExMDYKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9WSUFURUMJCTB4MTEwNgorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1ZJQV84MzYzXzAJMHgwMzA1CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfVklBXzgzNzFfMAkweDAzOTEKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9WSUFfODUwMV8wCTB4MDUwMQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1ZJQV84MkM1MDUJMHgwNTA1CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfVklBXzgyQzU2MQkweDA1NjEKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9WSUFfODJDNTg2XzEJMHgwNTcxCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfVklBXzgyQzU3NgkweDA1NzYKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9WSUFfODJDNTg1CTB4MDU4NQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1ZJQV84MkM1ODZfMAkweDA1ODYKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9WSUFfODJDNTk1CTB4MDU5NQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1ZJQV84MkM1OTYJMHgwNTk2CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfVklBXzgyQzU5N18wCTB4MDU5NworI2RlZmluZSBQQ0lfREVWSUNFX0lEX1ZJQV84MkM1OThfMAkweDA1OTgKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9WSUFfODYwMV8wCTB4MDYwMQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1ZJQV84NjA1XzAJMHgwNjA1CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfVklBXzgyQzY4MAkweDA2ODAKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9WSUFfODJDNjg2CTB4MDY4NgorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1ZJQV84MkM2OTEJMHgwNjkxCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfVklBXzgyQzY5MwkweDA2OTMKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9WSUFfODJDNjkzXzEJMHgwNjk4CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfVklBXzgyQzkyNgkweDA5MjYKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9WSUFfODJDNTc2XzEJMHgxNTcxCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfVklBXzgyQzU5NV85NwkweDE1OTUKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9WSUFfODJDNTg2XzIJMHgzMDM4CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfVklBXzgyQzU4Nl8zCTB4MzA0MAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1ZJQV9SSElORV9JCTB4MzA0MworI2RlZmluZSBQQ0lfREVWSUNFX0lEX1ZJQV82MzA1CQkweDMwNDQKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9WSUFfODJDNTk2XzMJMHgzMDUwCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfVklBXzgyQzU5NkJfMwkweDMwNTEKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9WSUFfODJDNjg2XzQJMHgzMDU3CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfVklBXzgyQzY4Nl81CTB4MzA1OAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1ZJQV84MjMzXzUJMHgzMDU5CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfVklBXzgyMzNfNwkweDMwNjUKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9WSUFfVlQ2MTAyCTB4MzA2NQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1ZJQV84MkM2ODZfNgkweDMwNjgKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9WSUFfODIzM18wCTB4MzA3NAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1ZJQV9WVDYxMDUJMHgzMTA2CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfVklBXzgyMzNDXzAJMHgzMTA5CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfVklBXzg2MzNfMAkweDMwOTEKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9WSUFfODM2N18wCTB4MzA5OQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1ZJQV84NkMxMDBBCTB4NjEwMAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1ZJQV84MjMxCQkweDgyMzEKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9WSUFfODIzMV80CTB4ODIzNQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1ZJQV84MzY1XzEJMHg4MzA1CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfVklBXzgzNzFfMQkweDgzOTEKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9WSUFfODUwMV8xCTB4ODUwMQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1ZJQV84MkM1OTdfMQkweDg1OTcKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9WSUFfODJDNTk4XzEJMHg4NTk4CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfVklBXzg2MDFfMQkweDg2MDEKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9WSUFfODUwNV8xCTBYODYwNQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1ZJQV84NjMzXzEJMHhCMDkxCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfVklBXzgzNjdfMQkweEIwOTkKKworI2RlZmluZSBQQ0lfVkVORE9SX0lEX1NJRU1FTlMgICAgICAgICAgIDB4MTEwQQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1NJRU1FTlNfRFNDQzQgICAgIDB4MjEwMgorCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfU01DMgkJMHgxMTEzCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfU01DMl8xMjExVFgJMHgxMjExCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfU01DMl8xMjExICAgICAgICAgMHgxMjExCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfU01DMl8xMjE2ICAgICAgICAgMHgxMjE2CisKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9WT1JURVgJCTB4MTExOQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1ZPUlRFWF9HRFQ2MHgwCTB4MDAwMAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1ZPUlRFWF9HRFQ2MDAwQgkweDAwMDEKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9WT1JURVhfR0RUNngxMAkweDAwMDIKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9WT1JURVhfR0RUNngyMAkweDAwMDMKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9WT1JURVhfR0RUNjUzMAkweDAwMDQKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9WT1JURVhfR0RUNjU1MAkweDAwMDUKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9WT1JURVhfR0RUNngxNwkweDAwMDYKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9WT1JURVhfR0RUNngyNwkweDAwMDcKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9WT1JURVhfR0RUNjUzNwkweDAwMDgKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9WT1JURVhfR0RUNjU1NwkweDAwMDkKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9WT1JURVhfR0RUNngxNQkweDAwMGEKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9WT1JURVhfR0RUNngyNQkweDAwMGIKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9WT1JURVhfR0RUNjUzNQkweDAwMGMKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9WT1JURVhfR0RUNjU1NQkweDAwMGQKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9WT1JURVhfR0RUNngxN1JQCTB4MDEwMAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1ZPUlRFWF9HRFQ2eDI3UlAJMHgwMTAxCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfVk9SVEVYX0dEVDY1MzdSUAkweDAxMDIKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9WT1JURVhfR0RUNjU1N1JQCTB4MDEwMworI2RlZmluZSBQQ0lfREVWSUNFX0lEX1ZPUlRFWF9HRFQ2eDExUlAJMHgwMTA0CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfVk9SVEVYX0dEVDZ4MjFSUAkweDAxMDUKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9WT1JURVhfR0RUNngxN1JQMQkweDAxMTAKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9WT1JURVhfR0RUNngyN1JQMQkweDAxMTEKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9WT1JURVhfR0RUNjUzN1JQMQkweDAxMTIKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9WT1JURVhfR0RUNjU1N1JQMQkweDAxMTMKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9WT1JURVhfR0RUNngxMVJQMQkweDAxMTQKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9WT1JURVhfR0RUNngyMVJQMQkweDAxMTUKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9WT1JURVhfR0RUNngxN1JQMgkweDAxMjAKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9WT1JURVhfR0RUNngyN1JQMgkweDAxMjEKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9WT1JURVhfR0RUNjUzN1JQMgkweDAxMjIKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9WT1JURVhfR0RUNjU1N1JQMgkweDAxMjMKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9WT1JURVhfR0RUNngxMVJQMgkweDAxMjQKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9WT1JURVhfR0RUNngyMVJQMgkweDAxMjUKKworI2RlZmluZSBQQ0lfVkVORE9SX0lEX0VGCQkweDExMWEKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9FRl9BVE1fRlBHQQkweDAwMDAKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9FRl9BVE1fQVNJQwkweDAwMDIKKworI2RlZmluZSBQQ0lfVkVORE9SX0lEX0lEVAkJMHgxMTFkCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfSURUX0lEVDc3MjAxCTB4MDAwMQorCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfRk9SRQkJMHgxMTI3CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfRk9SRV9QQ0EyMDBQQwkweDAyMTAKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9GT1JFX1BDQTIwMEUJMHgwMzAwCisKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9JTUFHSU5HVEVDSAkweDExMmYKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9JTUFHSU5HVEVDSF9JQ1BDSQkweDAwMDAKKworI2RlZmluZSBQQ0lfVkVORE9SX0lEX1BISUxJUFMJCTB4MTEzMQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1BISUxJUFNfU0FBNzE0NQkweDcxNDUKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9QSElMSVBTX1NBQTcxNDYJMHg3MTQ2CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfUEhJTElQU19TQUE5NzMwCTB4OTczMAorCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfRUlDT04JCTB4MTEzMworI2RlZmluZSBQQ0lfREVWSUNFX0lEX0VJQ09OX0RJVkEyMFBSTwkweGUwMDEKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9FSUNPTl9ESVZBMjAJMHhlMDAyCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfRUlDT05fRElWQTIwUFJPX1UJMHhlMDAzCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfRUlDT05fRElWQTIwX1UJMHhlMDA0CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfRUlDT05fRElWQTIwMQkweGUwMDUKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9FSUNPTl9NQUVTVFJBCTB4ZTAxMAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0VJQ09OX01BRVNUUkFRCTB4ZTAxMgorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0VJQ09OX01BRVNUUkFRX1UJMHhlMDEzCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfRUlDT05fTUFFU1RSQVAJMHhlMDE0CisgCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfQ1lDTE9ORQkJMHgxMTNjCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQ1lDTE9ORV9TREsJMHgwMDAxCisKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9BTExJQU5DRQkJMHgxMTQyCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQUxMSUFOQ0VfUFJPTU9USU8JMHgzMjEwCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQUxMSUFOQ0VfUFJPVklERU8JMHg2NDIyCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQUxMSUFOQ0VfQVQyNAkweDY0MjQKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9BTExJQU5DRV9BVDNECTB4NjQzZAorCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfU1lTS09OTkVDVAkweDExNDgKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9TWVNLT05ORUNUX0ZQCTB4NDAwMAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1NZU0tPTk5FQ1RfVFIJMHg0MjAwCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfU1lTS09OTkVDVF9HRQkweDQzMDAKKworI2RlZmluZSBQQ0lfVkVORE9SX0lEX1ZNSUMJCTB4MTE0YQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1ZNSUNfVk1FCQkweDc1ODcKKworI2RlZmluZSBQQ0lfVkVORE9SX0lEX0RJR0kJCTB4MTE0ZgorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0RJR0lfRVBDCQkweDAwMDIKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9ESUdJX1JJR0hUU1dJVENICTB4MDAwMworI2RlZmluZSBQQ0lfREVWSUNFX0lEX0RJR0lfWEVNCQkweDAwMDQKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9ESUdJX1hSCQkweDAwMDUKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9ESUdJX0NYCQkweDAwMDYKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9ESUdJX1hSSgkJMHgwMDA5CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfRElHSV9FUENKCQkweDAwMGEKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9ESUdJX1hSXzkyMAkweDAwMjcKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9ESUdJX0RGX01fSU9NMl9FCTB4MDA3MAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0RJR0lfREZfTV9FCTB4MDA3MQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0RJR0lfREZfTV9JT00yX0EJMHgwMDcyCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfRElHSV9ERl9NX0EJMHgwMDczCisKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9NVVRFQ0gJCTB4MTE1OQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX01VVEVDSF9NVjEwMDAJMHgwMDAxCisKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9YSVJDT00JCTB4MTE1ZAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1hJUkNPTV9YMzIwMV9FVEgJMHgwMDAzCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfWElSQ09NX1gzMjAxX01ETQkweDAxMDMKKworI2RlZmluZSBQQ0lfVkVORE9SX0lEX1JFTkRJVElPTgkJMHgxMTYzCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfUkVORElUSU9OX1ZFUklURQkweDAwMDEKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9SRU5ESVRJT05fVkVSSVRFMjEwMCAweDIwMDAKKworI2RlZmluZSBQQ0lfVkVORE9SX0lEX1NFUlZFUldPUktTCSAgMHgxMTY2CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfU0VSVkVSV09SS1NfSEUJICAweDAwMDgKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9TRVJWRVJXT1JLU19MRQkgIDB4MDAwOQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1NFUlZFUldPUktTX0NJT0IzMCAgMHgwMDEwCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfU0VSVkVSV09SS1NfQ01JQ19IRSAweDAwMTEKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9TRVJWRVJXT1JLU19PU0I0CSAgMHgwMjAwCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfU0VSVkVSV09SS1NfQ1NCNQkgIDB4MDIwMQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1NFUlZFUldPUktTX09TQjRJREUgMHgwMjExCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfU0VSVkVSV09SS1NfQ1NCNUlERSAweDAyMTIKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9TRVJWRVJXT1JLU19PU0I0VVNCIDB4MDIyMAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1NFUlZFUldPUktTX0NTQjVVU0IgUENJX0RFVklDRV9JRF9TRVJWRVJXT1JLU19PU0I0VVNCCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfU0VSVkVSV09SS1NfQ1NCNUlTQSAweDAyMzAKKworI2RlZmluZSBQQ0lfVkVORE9SX0lEX1NCRQkJMHgxMTc2CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfU0JFX1dBTlhMMTAwCTB4MDMwMQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1NCRV9XQU5YTDIwMAkweDAzMDIKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9TQkVfV0FOWEw0MDAJMHgwMTA0CisKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9UT1NISUJBCQkweDExNzkKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9UT1NISUJBXzYwMQkweDA2MDEKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9UT1NISUJBX1RPUElDOTUJMHgwNjBhCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfVE9TSElCQV9UT1BJQzk3CTB4MDYwZgorCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfUklDT0gJCTB4MTE4MAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1JJQ09IX1JMNUM0NjUJMHgwNDY1CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfUklDT0hfUkw1QzQ2NgkweDA0NjYKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9SSUNPSF9STDVDNDc1CTB4MDQ3NQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1JJQ09IX1JMNUM0NzYJMHgwNDc2CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfUklDT0hfUkw1QzQ3OAkweDA0NzgKKworI2RlZmluZQlQQ0lfVkVORE9SX0lEX0RMSU5LCQkweDExODYKKyNkZWZpbmUJUENJX0RFVklDRV9JRF9ERkU1MzBUWFAJCTB4MTMwMAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0RGRTUzMFRYUwkJMHgxMDAyCisKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9BUlRPUAkJMHgxMTkxCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQVJUT1BfQVRQODQwMAkweDAwMDQKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9BUlRPUF9BVFA4NTBVRgkweDAwMDUKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9BUlRPUF9BVFA4NjAJMHgwMDA2CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQVJUT1BfQVRQODYwUgkweDAwMDcKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9BUlRPUF9BRUM3NjEwCTB4ODAwMgorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FSVE9QX0FFQzc2MTJVVwkweDgwMTAKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9BUlRPUF9BRUM3NjEyVQkweDgwMjAKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9BUlRPUF9BRUM3NjEyUwkweDgwMzAKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9BUlRPUF9BRUM3NjEyRAkweDgwNDAKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9BUlRPUF9BRUM3NjEyU1VXCTB4ODA1MAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FSVE9QXzgwNjAJMHg4MDYwCisKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9aRUlUTkVUCQkweDExOTMKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9aRUlUTkVUXzEyMjEJMHgwMDAxCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfWkVJVE5FVF8xMjI1CTB4MDAwMgorCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfT01FR0EJCTB4MTE5YgorI2RlZmluZSBQQ0lfREVWSUNFX0lEX09NRUdBXzgyQzA5MkcJMHgxMjIxCisKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9GVUpJVFNVX01FCTB4MTE5ZQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0ZVSklUU1VfRlMxNTUJMHgwMDAxCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfRlVKSVRTVV9GUzUwCTB4MDAwMworCisjZGVmaW5lIFBDSV9TVUJWRU5ET1JfSURfS0VZU1BBTgkweDExYTkKKyNkZWZpbmUgUENJX1NVQkRFVklDRV9JRF9LRVlTUEFOX1NYMgkweDUzMzQKKworI2RlZmluZSBQQ0lfVkVORE9SX0lEX0dBTElMRU8JCTB4MTFhYgorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0dBTElMRU9fR1Q2NDAxMQkweDQxNDYKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9HQUxJTEVPX0dUNjQxMTEJMHg0MTQ2CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfR0FMSUxFT19HVDk2MTAwCTB4OTY1MgorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0dBTElMRU9fR1Q5NjEwMEEJMHg5NjUzCisKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9MSU5LU1lTCQkweDExYWQKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9MSVRFT04JCTB4MTFhZAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0xJVEVPTl9MTkUxMDBUWAkweDAwMDIKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9MQzgyQzExNQkJMHhDMTE1CisKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9WMwkJMHgxMWIwCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfVjNfVjk2MAkJMHgwMDAxCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfVjNfVjM1MAkJMHgwMDAxCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfVjNfVjk2MQkJMHgwMDAyCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfVjNfVjM1MQkJMHgwMDAyCisKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9OUAkJMHgxMWJjCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTlBfUENJX0ZEREkJMHgwMDAxCisKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9BVFQJCTB4MTFjMQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FUVF9MNTZYTUYJMHgwNDQwCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQVRUX1ZFTlVTX01PREVNCTB4NDgwCisKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9TUEVDSUFMSVgJCTB4MTFjYgorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1NQRUNJQUxJWF9JTzgJMHgyMDAwCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfU1BFQ0lBTElYX1hJTwkweDQwMDAKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9TUEVDSUFMSVhfUklPCTB4ODAwMAorI2RlZmluZSBQQ0lfU1VCREVWSUNFX0lEX1NQRUNJQUxJWF9TUEVFRDQgMHhhMDA0CisKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9BVVJBVklTSU9OCTB4MTFkMQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FVUkFWSVNJT05fVlhQNTI0CTB4MDFmNworCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfQU5BTE9HX0RFVklDRVMJMHgxMWQ0CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQUQxODg5SlMJCTB4MTg4OQorCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfSUtPTgkJMHgxMWQ1CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfSUtPTl8xMDExNQkweDAxMTUKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9JS09OXzEwMTE3CTB4MDExNworCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfWk9SQU4JCTB4MTFkZQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1pPUkFOXzM2MDU3CTB4NjA1NworI2RlZmluZSBQQ0lfREVWSUNFX0lEX1pPUkFOXzM2MTIwCTB4NjEyMAorCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfS0lORVRJQwkJMHgxMWY0CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfS0lORVRJQ18yOTE1CTB4MjkxNQorCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfQ09NUEVYCQkweDExZjYKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9DT01QRVhfRU5FVDEwMFZHNAkweDAxMTIKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9DT01QRVhfUkwyMDAwCTB4MTQwMQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0NPTVBFWF9STDEwMEFUWCAgIDB4MjAxMQorCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfUlAJCTB4MTFmZQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1JQMzJJTlRGCQkweDAwMDEKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9SUDhJTlRGCQkweDAwMDIKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9SUDE2SU5URgkJMHgwMDAzCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfUlA0UVVBRAkJMHgwMDA0CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfUlA4T0NUQQkJMHgwMDA1CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfUlA4SgkJMHgwMDA2CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfUlBQNAkJMHgwMDBBCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfUlBQOAkJMHgwMDBCCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfUlA4TQkJMHgwMDBDCisKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9DWUNMQURFUwkJMHgxMjBlCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQ1lDTE9NX1lfTG8JMHgwMTAwCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQ1lDTE9NX1lfSGkJMHgwMTAxCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQ1lDTE9NXzRZX0xvCTB4MDEwMgorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0NZQ0xPTV80WV9IaQkweDAxMDMKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9DWUNMT01fOFlfTG8JMHgwMTA0CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQ1lDTE9NXzhZX0hpCTB4MDEwNQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0NZQ0xPTV9aX0xvCTB4MDIwMAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0NZQ0xPTV9aX0hpCTB4MDIwMQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1BDMzAwX1JYXzIJMHgwMzAwCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfUEMzMDBfUlhfMQkweDAzMDEKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9QQzMwMF9URV8yCTB4MDMxMAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1BDMzAwX1RFXzEJMHgwMzExCisKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9FU1NFTlRJQUwJCTB4MTIwZgorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0VTU0VOVElBTF9ST0FEUlVOTkVSCTB4MDAwMQorCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfTzIJCTB4MTIxNworI2RlZmluZSBQQ0lfREVWSUNFX0lEX08yXzY3MjkJCTB4NjcyOQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX08yXzY3MzAJCTB4NjczYQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX08yXzY4MzIJCTB4NjgzMgorI2RlZmluZSBQQ0lfREVWSUNFX0lEX08yXzY4MzYJCTB4NjgzNgorCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfM0RGWAkJMHgxMjFhCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfM0RGWF9WT09ET08JMHgwMDAxCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfM0RGWF9WT09ET08yCTB4MDAwMgorI2RlZmluZSBQQ0lfREVWSUNFX0lEXzNERlhfQkFOU0hFRQkweDAwMDMKKyNkZWZpbmUgUENJX0RFVklDRV9JRF8zREZYX1ZPT0RPTzMJMHgwMDA1CisKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9TSUdNQURFUwkJMHgxMjM2CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfU0lHTUFERVNfNjQyNQkweDY0MDEKKworI2RlZmluZSBQQ0lfVkVORE9SX0lEX0NDVUJFCQkweDEyM2YKKworI2RlZmluZSBQQ0lfVkVORE9SX0lEX0FWTQkJMHgxMjQ0CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQVZNX0IxCQkweDA3MDAKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9BVk1fQzQJCTB4MDgwMAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FWTV9BMQkJMHgwYTAwCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQVZNX0ExX1YyCQkweDBlMDAKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9BVk1fQzIJCTB4MTEwMAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FWTV9UMQkJMHgxMjAwCisKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9ESVBJWAkJMHgxMjQ2CisKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9TVEFMTElPTgkJMHgxMjRkCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfU1RBTExJT05fRUNIUENJODMyIDB4MDAwMAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1NUQUxMSU9OX0VDSFBDSTg2NCAweDAwMDIKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9TVEFMTElPTl9FSU9QQ0kJMHgwMDAzCisKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9PUFRJQkFTRQkJMHgxMjU1CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfT1BUSUJBU0VfRk9SR0UJMHgxMTEwCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfT1BUSUJBU0VfRlVTSU9OCTB4MTIxMAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX09QVElCQVNFX1ZQTEVYCTB4MjExMAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX09QVElCQVNFX1ZQTEVYQ0MJMHgyMTIwCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfT1BUSUJBU0VfVlFVRVNUCTB4MjEzMAorCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfRVNTCQkweDEyNWQKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9FU1NfRVNTMTk2OAkweDE5NjgKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9FU1NfQVVESU9QQ0kJMHgxOTY5CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfRVNTX0VTUzE5NzgJMHgxOTc4CisKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9IQVJSSVMgICAgICAgIAkweDEyNjAKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9IQVJSSVNfUFJJU00yCTB4Mzg3MworCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfU0FUU0FHRU0JCTB4MTI2NworI2RlZmluZSBQQ0lfREVWSUNFX0lEX1NBVFNBR0VNX05JQ0NZCTB4MTAxNgorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1NBVFNBR0VNX1BDUjIxMDEJMHg1MzUyCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfU0FUU0FHRU1fVEVMU0FUVFVSQk8gMHg1YTRiCisKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9IVUdIRVMJCTB4MTI3MworI2RlZmluZSBQQ0lfREVWSUNFX0lEX0hVR0hFU19ESVJFQ1BDCTB4MDAwMgorCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfRU5TT05JUQkJMHgxMjc0CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfRU5TT05JUV9DVDU4ODAJMHg1ODgwCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfRU5TT05JUV9FUzEzNzAJMHg1MDAwCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfRU5TT05JUV9FUzEzNzEJMHgxMzcxCisKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9ST0NLV0VMTAkJMHgxMjdBCisKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9EQVZJQ09NCQkweDEyODIKKyNkZWZpbmUJUENJX0RFVklDRV9JRF9ETTkwMDkJCTB4OTAwOQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0RNOTEwMgkJMHg5MTAyCisKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9JVEUJCTB4MTI4MworI2RlZmluZSBQQ0lfREVWSUNFX0lEX0lURV9JVDgxNzJHX0FVRElPIDB4MDgwMQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0lURV9JVDgxNzJHCTB4ODE3MgorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0lURV84ODcyCQkweDg4NzIKKworCisvKiBmb3JtZXJseSBQbGF0Zm9ybSBUZWNoICovCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfRVNTX09MRAkJMHgxMjg1CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfRVNTX0VTUzAxMDAJMHgwMTAwCisKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9BTFRFT04JCTB4MTJhZQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FMVEVPTl9BQ0VOSUMJMHgwMDAxCisKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9VU1IJCTB4MTJCOQorCisjZGVmaW5lCVBDSV9WRU5ET1JfSURfSE9MVEVLCQkweDEyYzMKKyNkZWZpbmUJUENJX0RFVklDRV9JRF9IT0xURUtfSFQ4MDIzMgkweDAwNTgKKworI2RlZmluZSBQQ0lfU1VCVkVORE9SX0lEX0NPTk5FQ1RfVEVDSAkJCTB4MTJjNAorI2RlZmluZSBQQ0lfU1VCREVWSUNFX0lEX0NPTk5FQ1RfVEVDSF9CSDhfMjMyCQkweDAwMDEKKyNkZWZpbmUgUENJX1NVQkRFVklDRV9JRF9DT05ORUNUX1RFQ0hfQkg0XzIzMgkJMHgwMDAyCisjZGVmaW5lIFBDSV9TVUJERVZJQ0VfSURfQ09OTkVDVF9URUNIX0JIMl8yMzIJCTB4MDAwMworI2RlZmluZSBQQ0lfU1VCREVWSUNFX0lEX0NPTk5FQ1RfVEVDSF9CSDhfNDg1CQkweDAwMDQKKyNkZWZpbmUgUENJX1NVQkRFVklDRV9JRF9DT05ORUNUX1RFQ0hfQkg4XzQ4NV80XzQJMHgwMDA1CisjZGVmaW5lIFBDSV9TVUJERVZJQ0VfSURfQ09OTkVDVF9URUNIX0JINF80ODUJCTB4MDAwNgorI2RlZmluZSBQQ0lfU1VCREVWSUNFX0lEX0NPTk5FQ1RfVEVDSF9CSDRfNDg1XzJfMgkweDAwMDcKKyNkZWZpbmUgUENJX1NVQkRFVklDRV9JRF9DT05ORUNUX1RFQ0hfQkgyXzQ4NQkJMHgwMDA4CisjZGVmaW5lIFBDSV9TVUJERVZJQ0VfSURfQ09OTkVDVF9URUNIX0JIOF80ODVfMl82CTB4MDAwOQorI2RlZmluZSBQQ0lfU1VCREVWSUNFX0lEX0NPTk5FQ1RfVEVDSF9CSDA4MTEwMVYxCTB4MDAwQQorI2RlZmluZSBQQ0lfU1VCREVWSUNFX0lEX0NPTk5FQ1RfVEVDSF9CSDA0MTEwMVYxCTB4MDAwQgorCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfUElDVFVSRUwJCTB4MTJjNQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1BJQ1RVUkVMX1BDSVZTVAkweDAwODEKKworI2RlZmluZSBQQ0lfVkVORE9SX0lEX05WSURJQV9TR1MJMHgxMmQyCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTlZJRElBX1NHU19SSVZBMTI4IDB4MDAxOAorCisjZGVmaW5lIFBDSV9TVUJWRU5ET1JfSURfQ0hBU0VfUENJRkFTVAkJMHgxMkUwCisjZGVmaW5lIFBDSV9TVUJERVZJQ0VfSURfQ0hBU0VfUENJRkFTVDQJCTB4MDAzMQorI2RlZmluZSBQQ0lfU1VCREVWSUNFX0lEX0NIQVNFX1BDSUZBU1Q4CQkweDAwMjEKKyNkZWZpbmUgUENJX1NVQkRFVklDRV9JRF9DSEFTRV9QQ0lGQVNUMTYJMHgwMDExCisjZGVmaW5lIFBDSV9TVUJERVZJQ0VfSURfQ0hBU0VfUENJRkFTVDE2Rk1DCTB4MDA0MQorI2RlZmluZSBQQ0lfU1VCVkVORE9SX0lEX0NIQVNFX1BDSVJBUwkJMHgxMjRECisjZGVmaW5lIFBDSV9TVUJERVZJQ0VfSURfQ0hBU0VfUENJUkFTNAkJMHhGMDAxCisjZGVmaW5lIFBDSV9TVUJERVZJQ0VfSURfQ0hBU0VfUENJUkFTOAkJMHhGMDEwCisKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9BVVJFQUwJCTB4MTJlYgorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FVUkVBTF9WT1JURVhfMQkweDAwMDEKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9BVVJFQUxfVk9SVEVYXzIJMHgwMDAyCisKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9DQk9BUkRTCQkweDEzMDcKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9DQk9BUkRTX0RBUzE2MDJfMTYgMHgwMDAxCisKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9TSUlHCQkweDEzMWYKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9TSUlHXzFTXzEweF81NTAJMHgxMDAwCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfU0lJR18xU18xMHhfNjUwCTB4MTAwMQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1NJSUdfMVNfMTB4Xzg1MAkweDEwMDIKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9TSUlHXzFTMVBfMTB4XzU1MAkweDEwMTAKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9TSUlHXzFTMVBfMTB4XzY1MAkweDEwMTEKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9TSUlHXzFTMVBfMTB4Xzg1MAkweDEwMTIKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9TSUlHXzFQXzEweAkweDEwMjAKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9TSUlHXzJQXzEweAkweDEwMjEKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9TSUlHXzJTXzEweF81NTAJMHgxMDMwCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfU0lJR18yU18xMHhfNjUwCTB4MTAzMQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1NJSUdfMlNfMTB4Xzg1MAkweDEwMzIKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9TSUlHXzJTMVBfMTB4XzU1MAkweDEwMzQKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9TSUlHXzJTMVBfMTB4XzY1MAkweDEwMzUKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9TSUlHXzJTMVBfMTB4Xzg1MAkweDEwMzYKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9TSUlHXzRTXzEweF81NTAJMHgxMDUwCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfU0lJR180U18xMHhfNjUwCTB4MTA1MQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1NJSUdfNFNfMTB4Xzg1MAkweDEwNTIKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9TSUlHXzFTXzIweF81NTAJMHgyMDAwCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfU0lJR18xU18yMHhfNjUwCTB4MjAwMQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1NJSUdfMVNfMjB4Xzg1MAkweDIwMDIKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9TSUlHXzFQXzIweAkweDIwMjAKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9TSUlHXzJQXzIweAkweDIwMjEKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9TSUlHXzJTXzIweF81NTAJMHgyMDMwCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfU0lJR18yU18yMHhfNjUwCTB4MjAzMQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1NJSUdfMlNfMjB4Xzg1MAkweDIwMzIKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9TSUlHXzJQMVNfMjB4XzU1MAkweDIwNDAKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9TSUlHXzJQMVNfMjB4XzY1MAkweDIwNDEKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9TSUlHXzJQMVNfMjB4Xzg1MAkweDIwNDIKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9TSUlHXzFTMVBfMjB4XzU1MAkweDIwMTAKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9TSUlHXzFTMVBfMjB4XzY1MAkweDIwMTEKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9TSUlHXzFTMVBfMjB4Xzg1MAkweDIwMTIKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9TSUlHXzRTXzIweF81NTAJMHgyMDUwCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfU0lJR180U18yMHhfNjUwCTB4MjA1MQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1NJSUdfNFNfMjB4Xzg1MAkweDIwNTIKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9TSUlHXzJTMVBfMjB4XzU1MAkweDIwNjAKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9TSUlHXzJTMVBfMjB4XzY1MAkweDIwNjEKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9TSUlHXzJTMVBfMjB4Xzg1MAkweDIwNjIKKworI2RlZmluZSBQQ0lfVkVORE9SX0lEX0FETVRFSyAgICAgICAgICAgIDB4MTMxNworI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FETVRFS18wOTg1ICAgICAgIDB4MDk4NQorCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfRE9NRVgJCTB4MTM0YQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0RPTUVYX0RNWDMxOTFECTB4MDAwMQorCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfUVVBVEVDSAkJMHgxMzVDCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfUVVBVEVDSF9RU0MxMDAJMHgwMDEwCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfUVVBVEVDSF9EU0MxMDAJMHgwMDIwCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfUVVBVEVDSF9EU0MyMDAJMHgwMDMwCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfUVVBVEVDSF9RU0MyMDAJMHgwMDQwCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfUVVBVEVDSF9FU0MxMDBECTB4MDA1MAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1FVQVRFQ0hfRVNDMTAwTQkweDAwNjAKKworI2RlZmluZSBQQ0lfVkVORE9SX0lEX1NFQUxFVkVMCQkweDEzNWUKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9TRUFMRVZFTF9VNTMwCTB4NzEwMQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1NFQUxFVkVMX1VDT01NMgkweDcyMDEKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9TRUFMRVZFTF9VQ09NTTQyMgkweDc0MDIKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9TRUFMRVZFTF9VQ09NTTIzMgkweDcyMDIKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9TRUFMRVZFTF9DT01NNAkweDc0MDEKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9TRUFMRVZFTF9DT01NOAkweDc4MDEKKworI2RlZmluZSBQQ0lfVkVORE9SX0lEX0hZUEVSQ09QRQkJMHgxMzY1CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfSFlQRVJDT1BFX1BMWAkweDkwNTAKKyNkZWZpbmUgUENJX1NVQkRFVklDRV9JRF9IWVBFUkNPUEVfT0xEX0VSR08JMHgwMTA0CisjZGVmaW5lIFBDSV9TVUJERVZJQ0VfSURfSFlQRVJDT1BFX0VSR08JCTB4MDEwNgorI2RlZmluZSBQQ0lfU1VCREVWSUNFX0lEX0hZUEVSQ09QRV9NRVRSTwkweDAxMDcKKyNkZWZpbmUgUENJX1NVQkRFVklDRV9JRF9IWVBFUkNPUEVfQ0hBTVAyCTB4MDEwOAorI2RlZmluZSBQQ0lfU1VCREVWSUNFX0lEX0hZUEVSQ09QRV9QTEVYVVMJMHgwMTA5CisKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9LQVdBU0FLSQkJMHgxMzZiCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTUNISVBfS0w1QTcyMDAyCTB4ZmYwMQorCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfTE1DCQkweDEzNzYKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9MTUNfSFNTSQkJMHgwMDAzCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTE1DX0RTMwkJMHgwMDA0CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTE1DX1NTSQkJMHgwMDA1CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTE1DX1QxCQkweDAwMDYKKworI2RlZmluZSBQQ0lfVkVORE9SX0lEX05FVEdFQVIJCTB4MTM4NQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX05FVEdFQVJfTUEzMDEJMHg0MTAwCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTkVUR0VBUl9HQTYyMAkweDYyMGEKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9ORVRHRUFSX0dBNjIyCTB4NjIyYQorCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfQVBQTElDT00JCTB4MTM4OQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FQUExJQ09NX1BDSUdFTkVSSUMgMHgwMDAxCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQVBQTElDT01fUENJMjAwMElCU19DQU4gMHgwMDAyCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQVBQTElDT01fUENJMjAwMFBGQiAweDAwMDMKKworI2RlZmluZSBQQ0lfVkVORE9SX0lEX01PWEEJCTB4MTM5MworI2RlZmluZSBQQ0lfREVWSUNFX0lEX01PWEFfQzEwNAkJMHgxMDQwCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTU9YQV9DMTY4CQkweDE2ODAKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9NT1hBX0NQMjA0SgkweDIwNDAKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9NT1hBX0MyMTgJCTB4MjE4MAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX01PWEFfQzMyMAkJMHgzMjAwCisKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9DQ0QJCTB4MTM5NworI2RlZmluZSBQQ0lfREVWSUNFX0lEX0NDRF8yQkQwCQkweDJiZDAKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9DQ0RfQjAwMAkJMHhiMDAwCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQ0NEX0IwMDYJCTB4YjAwNgorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0NDRF9CMDA3CQkweGIwMDcKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9DQ0RfQjAwOAkJMHhiMDA4CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQ0NEX0IwMDkJCTB4YjAwOQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0NDRF9CMDBBCQkweGIwMGEKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9DQ0RfQjAwQgkJMHhiMDBiCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQ0NEX0IwMEMJCTB4YjAwYworI2RlZmluZSBQQ0lfREVWSUNFX0lEX0NDRF9CMTAwCQkweGIxMDAKKworI2RlZmluZSBQQ0lfVkVORE9SX0lEX01JQ1JPR0FURQkJMHgxM2MwCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTUlDUk9HQVRFX1VTQwkweDAwMTAKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9NSUNST0dBVEVfU0NDCTB4MDAyMAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX01JQ1JPR0FURV9TQ0EJMHgwMDMwCisKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF8zV0FSRQkJMHgxM0MxCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfM1dBUkVfMTAwMAkweDEwMDAKKworI2RlZmluZSBQQ0lfVkVORE9SX0lEX0FCT0NPTQkJMHgxM0QxCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQUJPQ09NXzJCRDEgICAgICAgMHgyQkQxCisKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9DTUVESUEJCTB4MTNmNgorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0NNRURJQV9DTTgzMzhBCTB4MDEwMAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0NNRURJQV9DTTgzMzhCCTB4MDEwMQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0NNRURJQV9DTTg3MzgJMHgwMTExCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQ01FRElBX0NNODczOEIJMHgwMTEyCisKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9MQVZBCQkweDE0MDcKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9MQVZBX0RTRVJJQUwJMHgwMTAwIC8qIDJ4IDE2NTUwICovCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTEFWQV9RVUFUUk9fQQkweDAxMDEgLyogMnggMTY1NTAsIGhhbGYgb2YgNCBwb3J0ICovCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTEFWQV9RVUFUUk9fQgkweDAxMDIgLyogMnggMTY1NTAsIGhhbGYgb2YgNCBwb3J0ICovCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTEFWQV9QT1JUX1BMVVMJMHgwMjAwIC8qIDJ4IDE2NjUwICovCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTEFWQV9RVUFEX0EJMHgwMjAxIC8qIDJ4IDE2NjUwLCBoYWxmIG9mIDQgcG9ydCAqLworI2RlZmluZSBQQ0lfREVWSUNFX0lEX0xBVkFfUVVBRF9CCTB4MDIwMiAvKiAyeCAxNjY1MCwgaGFsZiBvZiA0IHBvcnQgKi8KKyNkZWZpbmUgUENJX0RFVklDRV9JRF9MQVZBX1NTRVJJQUwJMHgwNTAwIC8qIDF4IDE2NTUwICovCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTEFWQV9QT1JUXzY1MAkweDA2MDAgLyogMXggMTY2NTAgKi8KKyNkZWZpbmUgUENJX0RFVklDRV9JRF9MQVZBX1BBUkFMTEVMCTB4ODAwMAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0xBVkFfRFVBTF9QQVJfQQkweDgwMDIgLyogVGhlIExhdmEgRHVhbCBQYXJhbGxlbCBpcyAqLworI2RlZmluZSBQQ0lfREVWSUNFX0lEX0xBVkFfRFVBTF9QQVJfQgkweDgwMDMgLyogdHdvIFBDSSBkZXZpY2VzIG9uIGEgY2FyZCAqLworI2RlZmluZSBQQ0lfREVWSUNFX0lEX0xBVkFfQk9DQV9JT1BQQVIJMHg4ODAwCisKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9USU1FRElBCQkweDE0MDkKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9USU1FRElBXzE4ODkJMHg3MTY4CisKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9PWFNFTUkJCTB4MTQxNQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX09YU0VNSV8xMlBDSTg0MAkweDg0MDMKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9PWFNFTUlfMTZQQ0k5NTQJMHg5NTAxCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfT1hTRU1JXzE2UENJOTUyCTB4OTUwQQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX09YU0VNSV8xNlBDSTk1TgkweDk1MTEKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9PWFNFTUlfMTZQQ0k5NTRQUAkweDk1MTMKKworI2RlZmluZSBQQ0lfVkVORE9SX0lEX0FJUk9ORVQJCTB4MTRiOQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FJUk9ORVRfNDgwMF8xCTB4MDAwMQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FJUk9ORVRfNDgwMAkweDQ1MDAgLy8gdmFsdWVzIHN3aXRjaGVkPyAgc2VlCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQUlST05FVF80NTAwCTB4NDgwMCAvLyBkcml2ZXJzL25ldC9haXJvbmV0NDUwMF9jYXJkLmMKKworI2RlZmluZSBQQ0lfVkVORE9SX0lEX1RJVEFOCQkweDE0RDIKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9USVRBTl8wMTBMCTB4ODAwMQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1RJVEFOXzEwMEwJMHg4MDEwCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfVElUQU5fMTEwTAkweDgwMTEKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9USVRBTl8yMDBMCTB4ODAyMAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1RJVEFOXzIxMEwJMHg4MDIxCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfVElUQU5fNDAwTAkweDgwNDAKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9USVRBTl84MDBMCTB4ODA4MAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1RJVEFOXzEwMAkJMHhBMDAxCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfVElUQU5fMjAwCQkweEEwMDUKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9USVRBTl80MDAJCTB4QTAwMworI2RlZmluZSBQQ0lfREVWSUNFX0lEX1RJVEFOXzgwMEIJMHhBMDA0CisKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9QQU5BQ09NCQkweDE0ZDQKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9QQU5BQ09NX1FVQURNT0RFTQkweDA0MDAKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9QQU5BQ09NX0RVQUxNT0RFTQkweDA0MDIKKworI2RlZmluZSBQQ0lfVkVORE9SX0lEX0JST0FEQ09NCQkweDE0ZTQKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9USUdPTjNfNTcwMAkweDE2NDQKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9USUdPTjNfNTcwMQkweDE2NDUKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9USUdPTjNfNTcwMgkweDE2NDYKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9USUdPTjNfNTcwMwkweDE2NDcKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9USUdPTjNfNTcwNAkweDE2NDgKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9USUdPTjNfNTcwMkZFCTB4MTY0ZAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1RJR09OM181NzA1CTB4MTY1MworI2RlZmluZSBQQ0lfREVWSUNFX0lEX1RJR09OM181NzA1XzIJMHgxNjU0CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfVElHT04zXzU3MDVNCTB4MTY1ZAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1RJR09OM181NzA1TV8yCTB4MTY1ZQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1RJR09OM181NzgyCTB4MTY5NgorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1RJR09OM181Nzg4CTB4MTY5YworI2RlZmluZSBQQ0lfREVWSUNFX0lEX1RJR09OM181NzAyWAkweDE2YTYKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9USUdPTjNfNTcwM1gJMHgxNmE3CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfVElHT04zXzU3MDRTCTB4MTZhOAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1RJR09OM181NzAyQTMJMHgxNmM2CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfVElHT04zXzU3MDNBMwkweDE2YzcKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9USUdPTjNfNTkwMQkweDE3MGQKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9USUdPTjNfNTkwMV8yCTB4MTcwZQorCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfU1lCQQkJMHgxNTkyCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfU1lCQV8yUF9FUFAJMHgwNzgyCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfU1lCQV8xUF9FQ1AJMHgwNzgzCisKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9NT1JFVE9OCQkweDE1YWEKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9SQVNURUxfMlBPUlQJMHgyMDAwCisKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9aT0xUUklYCQkweDE1YjAKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9aT0xUUklYXzJCRDAJMHgyYmQwIAorCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfUERDCQkweDE1ZTkKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9QRENfMTg0MQkJMHgxODQxCisKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9TWU1QSE9OWQkJMHgxYzFjCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfU1lNUEhPTllfMTAxCTB4MDAwMQorCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfVEVLUkFNCQkweDFkZTEKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9URUtSQU1fREMyOTAJMHhkYzI5CisKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF8zRExBQlMJCTB4M2QzZAorI2RlZmluZSBQQ0lfREVWSUNFX0lEXzNETEFCU18zMDBTWAkweDAwMDEKKyNkZWZpbmUgUENJX0RFVklDRV9JRF8zRExBQlNfNTAwVFgJMHgwMDAyCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfM0RMQUJTX0RFTFRBCTB4MDAwMworI2RlZmluZSBQQ0lfREVWSUNFX0lEXzNETEFCU19QRVJNRURJQQkweDAwMDQKKyNkZWZpbmUgUENJX0RFVklDRV9JRF8zRExBQlNfTVgJCTB4MDAwNgorI2RlZmluZSBQQ0lfREVWSUNFX0lEXzNETEFCU19QRVJNRURJQTIJMHgwMDA3CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfM0RMQUJTX0dBTU1BCTB4MDAwOAorI2RlZmluZSBQQ0lfREVWSUNFX0lEXzNETEFCU19QRVJNRURJQTJWCTB4MDAwOQorCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfQVZBTkNFCQkweDQwMDUKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9BVkFOQ0VfQUxHMjA2NAkweDIwNjQKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9BVkFOQ0VfMjMwMgkweDIzMDIKKworI2RlZmluZSBQQ0lfVkVORE9SX0lEX0FLUwkJMHg0MTZjCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQUtTX0FMQURESU5DQVJECTB4MDEwMAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FLU19DUEMJCTB4MDIwMAorCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfTkVUVklOCQkweDRhMTQKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9ORVRWSU5fTlY1MDAwU0MJMHg1MDAwCisKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9TMwkJMHg1MzMzCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfUzNfUExBVE9fUFhTCTB4MDU1MQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1MzX1ZpUkdFCQkweDU2MzEKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9TM19UUklPCQkweDg4MTEKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9TM19BVVJPUkE2NFZQCTB4ODgxMgorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1MzX1RSSU82NFVWUAkweDg4MTQKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9TM19WaVJHRV9WWAkweDg4M2QKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9TM184NjgJCTB4ODg4MAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1MzXzkyOAkJMHg4OGIwCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfUzNfODY0XzEJCTB4ODhjMAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1MzXzg2NF8yCQkweDg4YzEKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9TM185NjRfMQkJMHg4OGQwCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfUzNfOTY0XzIJCTB4ODhkMQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1MzXzk2OAkJMHg4OGYwCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfUzNfVFJJTzY0VjIJMHg4OTAxCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfUzNfUExBVE9fUFhHCTB4ODkwMgorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1MzX1ZpUkdFX0RYR1gJMHg4YTAxCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfUzNfVmlSR0VfR1gyCTB4OGExMAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1MzX1ZpUkdFX01YCTB4OGMwMQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1MzX1ZpUkdFX01YUAkweDhjMDIKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9TM19WaVJHRV9NWFBNVgkweDhjMDMKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9TM19TT05JQ1ZJQkVTCTB4Y2EwMAorCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfRENJCQkweDY2NjYKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9EQ0lfUENDT000CTB4MDAwMQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0RDSV9QQ0NPTTgJMHgwMDAyCisKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9HRU5ST0NPCQkweDU1NTUKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9HRU5ST0NPX0hGUDgzMgkweDAwMDMKKworI2RlZmluZSBQQ0lfVkVORE9SX0lEX0lOVEVMCQkweDgwODYKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9JTlRFTF8yMTE0NQkweDAwMzkKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9JTlRFTF84MjM3NQkweDA0ODIKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9JTlRFTF84MjQyNAkweDA0ODMKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9JTlRFTF84MjM3OAkweDA0ODQKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9JTlRFTF84MjQzMAkweDA0ODYKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9JTlRFTF84MjQzNAkweDA0YTMKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9JTlRFTF9JOTYwCTB4MDk2MAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyNTQyICAgICAgIAkweDEwMDAKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9JTlRFTF84MjU0M0dDX0ZJQkVSICAJMHgxMDAxCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfSU5URUxfODI1NDNHQ19DT1BQRVIgCTB4MTAwNAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyNTQ0RUlfQ09QUEVSIAkweDEwMDgKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9JTlRFTF84MjU0NEVJX0ZJQkVSIAkweDEwMDkKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9JTlRFTF84MjU0NEdDX0NPUFBFUiAJMHgxMDBDCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfSU5URUxfODI1NDRHQ19MT00gICAJMHgxMDBECisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfSU5URUxfODI1NDBFTQkJMHgxMDBFCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfSU5URUxfODI1NDVFTV9DT1BQRVIJMHgxMDBGCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfSU5URUxfODI1NDZFQl9DT1BQRVIJMHgxMDEwCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfSU5URUxfODI1NDVFTV9GSUJFUgkweDEwMTEKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9JTlRFTF84MjU0NkVCX0ZJQkVSCTB4MTAxMgorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyNTQwRU1fTE9NCQkweDEwMTUKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9JTlRFTF9JRDEwMjkJMHgxMDI5CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfSU5URUxfSUQxMDMwCTB4MTAzMAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0lOVEVMX0lEMTAzMQkweDEwMzEKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9JTlRFTF9JRDEwMzgJMHgxMDM4CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfSU5URUxfSUQxMDM5CTB4MTAzOQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0lOVEVMX0lEMTAzQQkweDEwM0EKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9JTlRFTF84MjU2MkVUCTB4MTAzMQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyNTU5RVIJMHgxMjA5CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfSU5URUxfODIwOTJBQV8wCTB4MTIyMQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyMDkyQUFfMQkweDEyMjIKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9JTlRFTF83MTE2CTB4MTIyMworI2RlZmluZSBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyNTk2CTB4MTIyNgorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyODY1CTB4MTIyNworI2RlZmluZSBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyNTU3CTB4MTIyOQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyNDM3CTB4MTIyZAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyMzcxRkJfMAkweDEyMmUKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9JTlRFTF84MjM3MUZCXzEJMHgxMjMwCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfSU5URUxfODIzNzFNWAkweDEyMzQKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9JTlRFTF84MjQzN01YCTB4MTIzNQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyNDQxCTB4MTIzNworI2RlZmluZSBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyMzgwRkIJMHgxMjRiCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfSU5URUxfODI0MzkJMHgxMjUwCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfSU5URUxfODA5NjBfUlAJMHgxOTYwCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfSU5URUxfODI4MDFBQV8wCTB4MjQxMAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyODAxQUFfMQkweDI0MTEKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9JTlRFTF84MjgwMUFBXzIJMHgyNDEyCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfSU5URUxfODI4MDFBQV8zCTB4MjQxMworI2RlZmluZSBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyODAxQUFfNQkweDI0MTUKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9JTlRFTF84MjgwMUFBXzYJMHgyNDE2CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfSU5URUxfODI4MDFBQV84CTB4MjQxOAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyODAxQUJfMAkweDI0MjAKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9JTlRFTF84MjgwMUFCXzEJMHgyNDIxCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfSU5URUxfODI4MDFBQl8yCTB4MjQyMgorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyODAxQUJfMwkweDI0MjMKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9JTlRFTF84MjgwMUFCXzUJMHgyNDI1CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfSU5URUxfODI4MDFBQl82CTB4MjQyNgorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyODAxQUJfOAkweDI0MjgKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9JTlRFTF84MjgwMUJBXzAJMHgyNDQwCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfSU5URUxfODI4MDFCQV8xCTB4MjQ0MgorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyODAxQkFfMgkweDI0NDMKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9JTlRFTF84MjgwMUJBXzMJMHgyNDQ0CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfSU5URUxfODI4MDFCQV80CTB4MjQ0NQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyODAxQkFfNQkweDI0NDYKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9JTlRFTF84MjgwMUJBXzYJMHgyNDQ4CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfSU5URUxfODI4MDFCQV83CTB4MjQ0OQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyNTYyCTB4MjQ0OQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyODAxQkFfOAkweDI0NGEKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9JTlRFTF84MjgwMUJBXzkJMHgyNDRiCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfSU5URUxfODI4MDFCQV8xMAkweDI0NGMKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9JTlRFTF84MjgwMUJBXzExCTB4MjQ0ZQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyODAxQ0FfMAkweDI0ODAKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9JTlRFTF84MjgwMUNBXzIJMHgyNDgyCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfSU5URUxfODI4MDFDQV8zCTB4MjQ4MworI2RlZmluZSBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyODAxQ0FfNAkweDI0ODQKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9JTlRFTF84MjgwMUNBXzUJMHgyNDg1CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfSU5URUxfODI4MDFDQV82CTB4MjQ4NgorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyODAxQ0FfNwkweDI0ODcKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9JTlRFTF84MjgwMUNBXzEwCTB4MjQ4YQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyODAxQ0FfMTEJMHgyNDhiCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfSU5URUxfODI4MDFDQV8xMgkweDI0OGMKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9JTlRFTF84MDMxMAkweDUzMGQKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9JTlRFTF84MjM3MVNCXzAJMHg3MDAwCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfSU5URUxfODIzNzFTQl8xCTB4NzAxMAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyMzcxU0JfMgkweDcwMjAKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9JTlRFTF84MjQzN1ZYCTB4NzAzMAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyNDM5VFgJMHg3MTAwCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfSU5URUxfODIzNzFBQl8wCTB4NzExMAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyMzcxQUIJMHg3MTExCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfSU5URUxfODIzNzFBQl8yCTB4NzExMgorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyMzcxQUJfMwkweDcxMTMKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9JTlRFTF84MjgxMF9NQzEJMHg3MTIwCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfSU5URUxfODI4MTBfSUcxCTB4NzEyMQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyODEwX01DMwkweDcxMjIKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9JTlRFTF84MjgxMF9JRzMJMHg3MTIzCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfSU5URUxfODI0NDNMWF8wCTB4NzE4MAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyNDQzTFhfMQkweDcxODEKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9JTlRFTF84MjQ0M0JYXzAJMHg3MTkwCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfSU5URUxfODI0NDNCWF8xCTB4NzE5MQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyNDQzQlhfMgkweDcxOTIKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9JTlRFTF84MjQ0M01YXzAJMHg3MTk4CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfSU5URUxfODI0NDNNWF8xCTB4NzE5OQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyNDQzTVhfMgkweDcxOWEKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9JTlRFTF84MjQ0M01YXzMJMHg3MTliCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfSU5URUxfODIzNzJGQl8wCTB4NzYwMAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyMzcyRkJfMQkweDc2MDEKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9JTlRFTF84MjM3MkZCXzIJMHg3NjAyCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfSU5URUxfODIzNzJGQl8zCTB4NzYwMworI2RlZmluZSBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyNDU0R1gJMHg4NGM0CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfSU5URUxfODI0NTBHWAkweDg0YzUKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9JTlRFTF84MjQ1MU5YCTB4ODRjYQorCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfQ09NUFVUT05FCQkweDhlMGUKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9DT01QVVRPTkVfSVAyRVgJMHgwMjkxCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQ09NUFVUT05FX1BHCTB4MDMwMgorI2RlZmluZSBQQ0lfU1VCVkVORE9SX0lEX0NPTVBVVE9ORQkweDhlMGUKKyNkZWZpbmUgUENJX1NVQkRFVklDRV9JRF9DT01QVVRPTkVfUEc0CTB4MDAwMQorI2RlZmluZSBQQ0lfU1VCREVWSUNFX0lEX0NPTVBVVE9ORV9QRzgJMHgwMDAyCisjZGVmaW5lIFBDSV9TVUJERVZJQ0VfSURfQ09NUFVUT05FX1BHNgkweDAwMDMKKworI2RlZmluZSBQQ0lfVkVORE9SX0lEX0tUSQkJMHg4ZTJlCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfS1RJX0VUMzJQMgkweDMwMDAKKworI2RlZmluZSBQQ0lfVkVORE9SX0lEX0FEQVBURUMJCTB4OTAwNAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FEQVBURUNfNzgxMAkweDEwNzgKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9BREFQVEVDXzc4MjEJMHgyMTc4CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQURBUFRFQ18zODYwMgkweDM4NjAKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9BREFQVEVDXzc4NTAJMHg1MDc4CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQURBUFRFQ183ODU1CTB4NTU3OAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FEQVBURUNfNTgwMAkweDU4MDAKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9BREFQVEVDXzM4NjAJMHg2MDM4CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQURBUFRFQ18xNDgwQQkweDYwNzUKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9BREFQVEVDXzc4NjAJMHg2MDc4CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQURBUFRFQ183ODYxCTB4NjE3OAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FEQVBURUNfNzg3MAkweDcwNzgKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9BREFQVEVDXzc4NzEJMHg3MTc4CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQURBUFRFQ183ODcyCTB4NzI3OAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FEQVBURUNfNzg3MwkweDczNzgKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9BREFQVEVDXzc4NzQJMHg3NDc4CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQURBUFRFQ183ODk1CTB4Nzg5NQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FEQVBURUNfNzg4MAkweDgwNzgKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9BREFQVEVDXzc4ODEJMHg4MTc4CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQURBUFRFQ183ODgyCTB4ODI3OAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FEQVBURUNfNzg4MwkweDgzNzgKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9BREFQVEVDXzc4ODQJMHg4NDc4CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQURBUFRFQ183ODg1CTB4ODU3OAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FEQVBURUNfNzg4NgkweDg2NzgKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9BREFQVEVDXzc4ODcJMHg4Nzc4CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQURBUFRFQ183ODg4CTB4ODg3OAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FEQVBURUNfMTAzMAkweDhiNzgKKworI2RlZmluZSBQQ0lfVkVORE9SX0lEX0FEQVBURUMyCQkweDkwMDUKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9BREFQVEVDMl8yOTQwVTIJMHgwMDEwCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQURBUFRFQzJfMjkzMFUyCTB4MDAxMQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FEQVBURUMyXzc4OTBCCTB4MDAxMworI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FEQVBURUMyXzc4OTAJMHgwMDFmCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQURBUFRFQzJfMzk0MFUyCTB4MDA1MAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FEQVBURUMyXzM5NTBVMkQJMHgwMDUxCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQURBUFRFQzJfNzg5NgkweDAwNWYKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9BREFQVEVDMl83ODkyQQkweDAwODAKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9BREFQVEVDMl83ODkyQgkweDAwODEKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9BREFQVEVDMl83ODkyRAkweDAwODMKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9BREFQVEVDMl83ODkyUAkweDAwOGYKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9BREFQVEVDMl83ODk5QQkweDAwYzAKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9BREFQVEVDMl83ODk5QgkweDAwYzEKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9BREFQVEVDMl83ODk5RAkweDAwYzMKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9BREFQVEVDMl83ODk5UAkweDAwY2YKKworI2RlZmluZSBQQ0lfVkVORE9SX0lEX0FUUk9OSUNTCQkweDkwN2YKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9BVFJPTklDU18yMDE1CTB4MjAxNQorCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfSE9MVEVLMgkJMHg5NDEyCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfSE9MVEVLMl82NTY1CTB4NjU2NQorCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfTkVUTU9TCQkweDk3MTAKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9ORVRNT1NfOTczNQkweDk3MzUKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9ORVRNT1NfOTgzNQkweDk4MzUKKworI2RlZmluZSBQQ0lfU1VCVkVORE9SX0lEX0VYU1lTCQkweGQ4NGQKKyNkZWZpbmUgUENJX1NVQkRFVklDRV9JRF9FWFNZU180MDE0CTB4NDAxNAorCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfVElHRVJKRVQJCTB4ZTE1OQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1RJR0VSSkVUXzMwMAkweDAwMDEKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9USUdFUkpFVF8xMDAJMHgwMDAyCisKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9BUksJCTB4ZWRkOAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FSS19TVElORwkJMHhhMDkxCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQVJLX1NUSU5HQVJLCTB4YTA5OQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FSS18yMDAwTVQJMHhhMGExCisKZGlmZiAtTmF1ciBncnViLTAuOTcub3JpZy9uZXRib290L3BjaV9pby5jIGdydWItMC45Ny9uZXRib290L3BjaV9pby5jCi0tLSBncnViLTAuOTcub3JpZy9uZXRib290L3BjaV9pby5jCTE5NzAtMDEtMDEgMDA6MDA6MDAuMDAwMDAwMDAwICswMDAwCisrKyBncnViLTAuOTcvbmV0Ym9vdC9wY2lfaW8uYwkyMDA1LTA4LTMxIDE5OjAzOjM1LjAwMDAwMDAwMCArMDAwMApAQCAtMCwwICsxLDQzMSBAQAorLyoKKyoqIFN1cHBvcnQgZm9yIE5FMjAwMCBQQ0kgY2xvbmVzIGFkZGVkIERhdmlkIE1vbnJvIEp1bmUgMTk5NworKiogR2VuZXJhbGlzZWQgdG8gb3RoZXIgTklDcyBieSBLZW4gWWFwIEp1bHkgMTk5NworKioKKyoqIE1vc3Qgb2YgdGhpcyBpcyB0YWtlbiBmcm9tOgorKioKKyoqIC91c3Ivc3JjL2xpbnV4L2RyaXZlcnMvcGNpL3BjaS5jCisqKiAvdXNyL3NyYy9saW51eC9pbmNsdWRlL2xpbnV4L3BjaS5oCisqKiAvdXNyL3NyYy9saW51eC9hcmNoL2kzODYvYmlvczMyLmMKKyoqIC91c3Ivc3JjL2xpbnV4L2luY2x1ZGUvbGludXgvYmlvczMyLmgKKyoqIC91c3Ivc3JjL2xpbnV4L2RyaXZlcnMvbmV0L25lLmMKKyovCisjZGVmaW5lIFBDQklPUworI2luY2x1ZGUgImdydWIuaCIKKyNpbmNsdWRlICJwY2kuaCIKKworI2lmZGVmCUNPTkZJR19QQ0lfRElSRUNUCisjZGVmaW5lICBQQ0lCSU9TX1NVQ0NFU1NGVUwgICAgICAgICAgICAgICAgMHgwMAorCisjZGVmaW5lIERFQlVHIDAKKworLyoKKyAqIEZ1bmN0aW9ucyBmb3IgYWNjZXNzaW5nIFBDSSBjb25maWd1cmF0aW9uIHNwYWNlIHdpdGggdHlwZSAxIGFjY2Vzc2VzCisgKi8KKworI2RlZmluZSBDT05GSUdfQ01EKGJ1cywgZGV2aWNlX2ZuLCB3aGVyZSkgICAoMHg4MDAwMDAwMCB8IChidXMgPDwgMTYpIHwgKGRldmljZV9mbiA8PCA4KSB8ICh3aGVyZSAmIH4zKSkKKworaW50IHBjaWJpb3NfcmVhZF9jb25maWdfYnl0ZSh1bnNpZ25lZCBpbnQgYnVzLCB1bnNpZ25lZCBpbnQgZGV2aWNlX2ZuLAorCQkJICAgICAgIHVuc2lnbmVkIGludCB3aGVyZSwgdWludDhfdCAqdmFsdWUpCit7CisgICAgb3V0bChDT05GSUdfQ01EKGJ1cyxkZXZpY2VfZm4sd2hlcmUpLCAweENGOCk7CisgICAgKnZhbHVlID0gaW5iKDB4Q0ZDICsgKHdoZXJlJjMpKTsKKyAgICByZXR1cm4gUENJQklPU19TVUNDRVNTRlVMOworfQorCitpbnQgcGNpYmlvc19yZWFkX2NvbmZpZ193b3JkICh1bnNpZ25lZCBpbnQgYnVzLAorICAgIHVuc2lnbmVkIGludCBkZXZpY2VfZm4sIHVuc2lnbmVkIGludCB3aGVyZSwgdWludDE2X3QgKnZhbHVlKQoreworICAgIG91dGwoQ09ORklHX0NNRChidXMsZGV2aWNlX2ZuLHdoZXJlKSwgMHhDRjgpOworICAgICp2YWx1ZSA9IGludygweENGQyArICh3aGVyZSYyKSk7CisgICAgcmV0dXJuIFBDSUJJT1NfU1VDQ0VTU0ZVTDsKK30KKworaW50IHBjaWJpb3NfcmVhZF9jb25maWdfZHdvcmQgKHVuc2lnbmVkIGludCBidXMsIHVuc2lnbmVkIGludCBkZXZpY2VfZm4sCisJCQkJIHVuc2lnbmVkIGludCB3aGVyZSwgdWludDMyX3QgKnZhbHVlKQoreworICAgIG91dGwoQ09ORklHX0NNRChidXMsZGV2aWNlX2ZuLHdoZXJlKSwgMHhDRjgpOworICAgICp2YWx1ZSA9IGlubCgweENGQyk7CisgICAgcmV0dXJuIFBDSUJJT1NfU1VDQ0VTU0ZVTDsKK30KKworaW50IHBjaWJpb3Nfd3JpdGVfY29uZmlnX2J5dGUgKHVuc2lnbmVkIGludCBidXMsIHVuc2lnbmVkIGludCBkZXZpY2VfZm4sCisJCQkJIHVuc2lnbmVkIGludCB3aGVyZSwgdWludDhfdCB2YWx1ZSkKK3sKKyAgICBvdXRsKENPTkZJR19DTUQoYnVzLGRldmljZV9mbix3aGVyZSksIDB4Q0Y4KTsKKyAgICBvdXRiKHZhbHVlLCAweENGQyArICh3aGVyZSYzKSk7CisgICAgcmV0dXJuIFBDSUJJT1NfU1VDQ0VTU0ZVTDsKK30KKworaW50IHBjaWJpb3Nfd3JpdGVfY29uZmlnX3dvcmQgKHVuc2lnbmVkIGludCBidXMsIHVuc2lnbmVkIGludCBkZXZpY2VfZm4sCisJCQkJIHVuc2lnbmVkIGludCB3aGVyZSwgdWludDE2X3QgdmFsdWUpCit7CisgICAgb3V0bChDT05GSUdfQ01EKGJ1cyxkZXZpY2VfZm4sd2hlcmUpLCAweENGOCk7CisgICAgb3V0dyh2YWx1ZSwgMHhDRkMgKyAod2hlcmUmMikpOworICAgIHJldHVybiBQQ0lCSU9TX1NVQ0NFU1NGVUw7Cit9CisKK2ludCBwY2liaW9zX3dyaXRlX2NvbmZpZ19kd29yZCAodW5zaWduZWQgaW50IGJ1cywgdW5zaWduZWQgaW50IGRldmljZV9mbiwgdW5zaWduZWQgaW50IHdoZXJlLCB1aW50MzJfdCB2YWx1ZSkKK3sKKyAgICBvdXRsKENPTkZJR19DTUQoYnVzLGRldmljZV9mbix3aGVyZSksIDB4Q0Y4KTsKKyAgICBvdXRsKHZhbHVlLCAweENGQyk7CisgICAgcmV0dXJuIFBDSUJJT1NfU1VDQ0VTU0ZVTDsKK30KKworI3VuZGVmIENPTkZJR19DTUQKKworI2Vsc2UJIC8qIENPTkZJR19QQ0lfRElSRUNUICBub3QgZGVmaW5lZCAqLworCisjaWYgIWRlZmluZWQoUENCSU9TKQorI2Vycm9yICJUaGUgcGNpYmlvcyBjYW4gb25seSBiZSB1c2VkIHdoZW4gdGhlIFBDQklPUyBzdXBwb3J0IGlzIGNvbXBpbGVkIGluIgorI2VuZGlmCisKKworI2RlZmluZSBLRVJOX0NPREVfU0VHIDBYOAorLyogU3R1ZmYgZm9yIGFzbSAqLworI2RlZmluZSBzYXZlX2ZsYWdzKHgpIFwKK19fYXNtX18gX192b2xhdGlsZV9fKCJwdXNoZmwgOyBwb3BsICUwIjoiPWciICh4KTogLyogbm8gaW5wdXQgKi8gOiJtZW1vcnkiKQorCisjZGVmaW5lIGNsaSgpIF9fYXNtX18gX192b2xhdGlsZV9fICgiY2xpIjogOiA6Im1lbW9yeSIpCisKKyNkZWZpbmUgcmVzdG9yZV9mbGFncyh4KSBcCitfX2FzbV9fIF9fdm9sYXRpbGVfXygicHVzaGwgJTAgOyBwb3BmbCI6IC8qIG5vIG91dHB1dCAqLyA6ImciICh4KToibWVtb3J5IikKKworCisKK3N0YXRpYyBzdHJ1Y3QgeworCXVuc2lnbmVkIGxvbmcgYWRkcmVzczsKKwl1bnNpZ25lZCBzaG9ydCBzZWdtZW50OworfSBiaW9zMzJfaW5kaXJlY3QgPSB7IDAsIEtFUk5fQ09ERV9TRUcgfTsKKworc3RhdGljIGxvbmcgcGNpYmlvc19lbnRyeSA9IDA7CitzdGF0aWMgc3RydWN0IHsKKwl1bnNpZ25lZCBsb25nIGFkZHJlc3M7CisJdW5zaWduZWQgc2hvcnQgc2VnbWVudDsKK30gcGNpX2luZGlyZWN0ID0geyAwLCBLRVJOX0NPREVfU0VHIH07CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGJpb3MzMl9zZXJ2aWNlKHVuc2lnbmVkIGxvbmcgc2VydmljZSkKK3sKKwl1bnNpZ25lZCBjaGFyIHJldHVybl9jb2RlOwkvKiAlYWwgKi8KKwl1bnNpZ25lZCBsb25nIGFkZHJlc3M7CQkvKiAlZWJ4ICovCisJdW5zaWduZWQgbG9uZyBsZW5ndGg7CQkvKiAlZWN4ICovCisJdW5zaWduZWQgbG9uZyBlbnRyeTsJCS8qICVlZHggKi8KKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc2F2ZV9mbGFncyhmbGFncyk7CisJX19hc21fXygKKyNpZmRlZiBBQlNPTFVURV9XSVRIT1VUX0FTVEVSSVNLCisJCSJsY2FsbCAoJSVlZGkpIgorI2Vsc2UKKwkJImxjYWxsICooJSVlZGkpIgorI2VuZGlmCisJCTogIj1hIiAocmV0dXJuX2NvZGUpLAorCQkgICI9YiIgKGFkZHJlc3MpLAorCQkgICI9YyIgKGxlbmd0aCksCisJCSAgIj1kIiAoZW50cnkpCisJCTogIjAiIChzZXJ2aWNlKSwKKwkJICAiMSIgKDApLAorCQkgICJEIiAoJmJpb3MzMl9pbmRpcmVjdCkpOworCXJlc3RvcmVfZmxhZ3MoZmxhZ3MpOworCisJc3dpdGNoIChyZXR1cm5fY29kZSkgeworCQljYXNlIDA6CisJCQlyZXR1cm4gYWRkcmVzcyArIGVudHJ5OworCQljYXNlIDB4ODA6CS8qIE5vdCBwcmVzZW50ICovCisJCQlwcmludGYoImJpb3MzMl9zZXJ2aWNlKCVkKSA6IG5vdCBwcmVzZW50XG4iLCBzZXJ2aWNlKTsKKwkJCXJldHVybiAwOworCQlkZWZhdWx0OiAvKiBTaG91bGRuJ3QgaGFwcGVuICovCisJCQlwcmludGYoImJpb3MzMl9zZXJ2aWNlKCVkKSA6IHJldHVybmVkICUjWCwgbWFpbCBkcmV3QGNvbG9yYWRvLmVkdVxuIiwKKwkJCQlzZXJ2aWNlLCByZXR1cm5fY29kZSk7CisJCQlyZXR1cm4gMDsKKwl9Cit9CisKK2ludCBwY2liaW9zX3JlYWRfY29uZmlnX2J5dGUodW5zaWduZWQgaW50IGJ1cywKKyAgICAgICAgdW5zaWduZWQgaW50IGRldmljZV9mbiwgdW5zaWduZWQgaW50IHdoZXJlLCB1aW50OF90ICp2YWx1ZSkKK3sKKyAgICAgICAgdW5zaWduZWQgbG9uZyByZXQ7CisgICAgICAgIHVuc2lnbmVkIGxvbmcgYnggPSAoYnVzIDw8IDgpIHwgZGV2aWNlX2ZuOworICAgICAgICB1bnNpZ25lZCBsb25nIGZsYWdzOworCisgICAgICAgIHNhdmVfZmxhZ3MoZmxhZ3MpOworICAgICAgICBfX2FzbV9fKAorI2lmZGVmIEFCU09MVVRFX1dJVEhPVVRfQVNURVJJU0sKKwkJImxjYWxsICglJWVzaSlcblx0IgorI2Vsc2UKKwkJImxjYWxsICooJSVlc2kpXG5cdCIKKyNlbmRpZgorICAgICAgICAgICAgICAgICJqYyAxZlxuXHQiCisgICAgICAgICAgICAgICAgInhvciAlJWFoLCAlJWFoXG4iCisgICAgICAgICAgICAgICAgIjE6IgorICAgICAgICAgICAgICAgIDogIj1jIiAoKnZhbHVlKSwKKyAgICAgICAgICAgICAgICAgICI9YSIgKHJldCkKKyAgICAgICAgICAgICAgICA6ICIxIiAoUENJQklPU19SRUFEX0NPTkZJR19CWVRFKSwKKyAgICAgICAgICAgICAgICAgICJiIiAoYngpLAorICAgICAgICAgICAgICAgICAgIkQiICgobG9uZykgd2hlcmUpLAorICAgICAgICAgICAgICAgICAgIlMiICgmcGNpX2luZGlyZWN0KSk7CisgICAgICAgIHJlc3RvcmVfZmxhZ3MoZmxhZ3MpOworICAgICAgICByZXR1cm4gKGludCkgKHJldCAmIDB4ZmYwMCkgPj4gODsKK30KKworaW50IHBjaWJpb3NfcmVhZF9jb25maWdfd29yZCh1bnNpZ25lZCBpbnQgYnVzLAorICAgICAgICB1bnNpZ25lZCBpbnQgZGV2aWNlX2ZuLCB1bnNpZ25lZCBpbnQgd2hlcmUsIHVpbnQxNl90ICp2YWx1ZSkKK3sKKyAgICAgICAgdW5zaWduZWQgbG9uZyByZXQ7CisgICAgICAgIHVuc2lnbmVkIGxvbmcgYnggPSAoYnVzIDw8IDgpIHwgZGV2aWNlX2ZuOworICAgICAgICB1bnNpZ25lZCBsb25nIGZsYWdzOworCisgICAgICAgIHNhdmVfZmxhZ3MoZmxhZ3MpOworICAgICAgICBfX2FzbV9fKAorI2lmZGVmIEFCU09MVVRFX1dJVEhPVVRfQVNURVJJU0sKKwkJImxjYWxsICglJWVzaSlcblx0IgorI2Vsc2UKKwkJImxjYWxsICooJSVlc2kpXG5cdCIKKyNlbmRpZgorICAgICAgICAgICAgICAgICJqYyAxZlxuXHQiCisgICAgICAgICAgICAgICAgInhvciAlJWFoLCAlJWFoXG4iCisgICAgICAgICAgICAgICAgIjE6IgorICAgICAgICAgICAgICAgIDogIj1jIiAoKnZhbHVlKSwKKyAgICAgICAgICAgICAgICAgICI9YSIgKHJldCkKKyAgICAgICAgICAgICAgICA6ICIxIiAoUENJQklPU19SRUFEX0NPTkZJR19XT1JEKSwKKyAgICAgICAgICAgICAgICAgICJiIiAoYngpLAorICAgICAgICAgICAgICAgICAgIkQiICgobG9uZykgd2hlcmUpLAorICAgICAgICAgICAgICAgICAgIlMiICgmcGNpX2luZGlyZWN0KSk7CisgICAgICAgIHJlc3RvcmVfZmxhZ3MoZmxhZ3MpOworICAgICAgICByZXR1cm4gKGludCkgKHJldCAmIDB4ZmYwMCkgPj4gODsKK30KKworaW50IHBjaWJpb3NfcmVhZF9jb25maWdfZHdvcmQodW5zaWduZWQgaW50IGJ1cywKKyAgICAgICAgdW5zaWduZWQgaW50IGRldmljZV9mbiwgdW5zaWduZWQgaW50IHdoZXJlLCB1aW50MzJfdCAqdmFsdWUpCit7CisgICAgICAgIHVuc2lnbmVkIGxvbmcgcmV0OworICAgICAgICB1bnNpZ25lZCBsb25nIGJ4ID0gKGJ1cyA8PCA4KSB8IGRldmljZV9mbjsKKyAgICAgICAgdW5zaWduZWQgbG9uZyBmbGFnczsKKworICAgICAgICBzYXZlX2ZsYWdzKGZsYWdzKTsKKyAgICAgICAgX19hc21fXygKKyNpZmRlZiBBQlNPTFVURV9XSVRIT1VUX0FTVEVSSVNLCisJCSJsY2FsbCAoJSVlc2kpXG5cdCIKKyNlbHNlCisJCSJsY2FsbCAqKCUlZXNpKVxuXHQiCisjZW5kaWYKKyAgICAgICAgICAgICAgICAiamMgMWZcblx0IgorICAgICAgICAgICAgICAgICJ4b3IgJSVhaCwgJSVhaFxuIgorICAgICAgICAgICAgICAgICIxOiIKKyAgICAgICAgICAgICAgICA6ICI9YyIgKCp2YWx1ZSksCisgICAgICAgICAgICAgICAgICAiPWEiIChyZXQpCisgICAgICAgICAgICAgICAgOiAiMSIgKFBDSUJJT1NfUkVBRF9DT05GSUdfRFdPUkQpLAorICAgICAgICAgICAgICAgICAgImIiIChieCksCisgICAgICAgICAgICAgICAgICAiRCIgKChsb25nKSB3aGVyZSksCisgICAgICAgICAgICAgICAgICAiUyIgKCZwY2lfaW5kaXJlY3QpKTsKKyAgICAgICAgcmVzdG9yZV9mbGFncyhmbGFncyk7CisgICAgICAgIHJldHVybiAoaW50KSAocmV0ICYgMHhmZjAwKSA+PiA4OworfQorCitpbnQgcGNpYmlvc193cml0ZV9jb25maWdfYnl0ZSAodW5zaWduZWQgaW50IGJ1cywKKwl1bnNpZ25lZCBpbnQgZGV2aWNlX2ZuLCB1bnNpZ25lZCBpbnQgd2hlcmUsIHVpbnQ4X3QgdmFsdWUpCit7CisJdW5zaWduZWQgbG9uZyByZXQ7CisJdW5zaWduZWQgbG9uZyBieCA9IChidXMgPDwgOCkgfCBkZXZpY2VfZm47CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNhdmVfZmxhZ3MoZmxhZ3MpOyBjbGkoKTsKKwlfX2FzbV9fKAorI2lmZGVmIEFCU09MVVRFX1dJVEhPVVRfQVNURVJJU0sKKwkJImxjYWxsICglJWVzaSlcblx0IgorI2Vsc2UKKwkJImxjYWxsICooJSVlc2kpXG5cdCIKKyNlbmRpZgorCQkiamMgMWZcblx0IgorCQkieG9yICUlYWgsICUlYWhcbiIKKwkJIjE6IgorCQk6ICI9YSIgKHJldCkKKwkJOiAiMCIgKFBDSUJJT1NfV1JJVEVfQ09ORklHX0JZVEUpLAorCQkgICJjIiAodmFsdWUpLAorCQkgICJiIiAoYngpLAorCQkgICJEIiAoKGxvbmcpIHdoZXJlKSwKKwkJICAiUyIgKCZwY2lfaW5kaXJlY3QpKTsKKwlyZXN0b3JlX2ZsYWdzKGZsYWdzKTsKKwlyZXR1cm4gKGludCkgKHJldCAmIDB4ZmYwMCkgPj4gODsKK30KKworaW50IHBjaWJpb3Nfd3JpdGVfY29uZmlnX3dvcmQgKHVuc2lnbmVkIGludCBidXMsCisJdW5zaWduZWQgaW50IGRldmljZV9mbiwgdW5zaWduZWQgaW50IHdoZXJlLCB1aW50MTZfdCB2YWx1ZSkKK3sKKwl1bnNpZ25lZCBsb25nIHJldDsKKwl1bnNpZ25lZCBsb25nIGJ4ID0gKGJ1cyA8PCA4KSB8IGRldmljZV9mbjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc2F2ZV9mbGFncyhmbGFncyk7IGNsaSgpOworCV9fYXNtX18oCisjaWZkZWYgQUJTT0xVVEVfV0lUSE9VVF9BU1RFUklTSworCQkibGNhbGwgKCUlZXNpKVxuXHQiCisjZWxzZQorCQkibGNhbGwgKiglJWVzaSlcblx0IgorI2VuZGlmCisJCSJqYyAxZlxuXHQiCisJCSJ4b3IgJSVhaCwgJSVhaFxuIgorCQkiMToiCisJCTogIj1hIiAocmV0KQorCQk6ICIwIiAoUENJQklPU19XUklURV9DT05GSUdfV09SRCksCisJCSAgImMiICh2YWx1ZSksCisJCSAgImIiIChieCksCisJCSAgIkQiICgobG9uZykgd2hlcmUpLAorCQkgICJTIiAoJnBjaV9pbmRpcmVjdCkpOworCXJlc3RvcmVfZmxhZ3MoZmxhZ3MpOworCXJldHVybiAoaW50KSAocmV0ICYgMHhmZjAwKSA+PiA4OworfQorCitpbnQgcGNpYmlvc193cml0ZV9jb25maWdfZHdvcmQgKHVuc2lnbmVkIGludCBidXMsCisJdW5zaWduZWQgaW50IGRldmljZV9mbiwgdW5zaWduZWQgaW50IHdoZXJlLCB1aW50MzJfdCB2YWx1ZSkKK3sKKwl1bnNpZ25lZCBsb25nIHJldDsKKwl1bnNpZ25lZCBsb25nIGJ4ID0gKGJ1cyA8PCA4KSB8IGRldmljZV9mbjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc2F2ZV9mbGFncyhmbGFncyk7IGNsaSgpOworCV9fYXNtX18oCisjaWZkZWYgQUJTT0xVVEVfV0lUSE9VVF9BU1RFUklTSworCQkibGNhbGwgKCUlZXNpKVxuXHQiCisjZWxzZQorCQkibGNhbGwgKiglJWVzaSlcblx0IgorI2VuZGlmCisJCSJqYyAxZlxuXHQiCisJCSJ4b3IgJSVhaCwgJSVhaFxuIgorCQkiMToiCisJCTogIj1hIiAocmV0KQorCQk6ICIwIiAoUENJQklPU19XUklURV9DT05GSUdfRFdPUkQpLAorCQkgICJjIiAodmFsdWUpLAorCQkgICJiIiAoYngpLAorCQkgICJEIiAoKGxvbmcpIHdoZXJlKSwKKwkJICAiUyIgKCZwY2lfaW5kaXJlY3QpKTsKKwlyZXN0b3JlX2ZsYWdzKGZsYWdzKTsKKwlyZXR1cm4gKGludCkgKHJldCAmIDB4ZmYwMCkgPj4gODsKK30KKworc3RhdGljIHZvaWQgY2hlY2tfcGNpYmlvcyh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgc2lnbmF0dXJlOworCXVuc2lnbmVkIGNoYXIgcHJlc2VudF9zdGF0dXM7CisJdW5zaWduZWQgY2hhciBtYWpvcl9yZXZpc2lvbjsKKwl1bnNpZ25lZCBjaGFyIG1pbm9yX3JldmlzaW9uOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHBhY2s7CisKKwlpZiAoKHBjaWJpb3NfZW50cnkgPSBiaW9zMzJfc2VydmljZShQQ0lfU0VSVklDRSkpKSB7CisJCXBjaV9pbmRpcmVjdC5hZGRyZXNzID0gcGNpYmlvc19lbnRyeTsKKworCQlzYXZlX2ZsYWdzKGZsYWdzKTsKKwkJX19hc21fXygKKyNpZmRlZiBBQlNPTFVURV9XSVRIT1VUX0FTVEVSSVNLCisJCQkibGNhbGwgKCUlZWRpKVxuXHQiCisjZWxzZQorCQkJImxjYWxsICooJSVlZGkpXG5cdCIKKyNlbmRpZgorCQkJImpjIDFmXG5cdCIKKwkJCSJ4b3IgJSVhaCwgJSVhaFxuIgorCQkJIjE6XHRzaGwgJDgsICUlZWF4XG5cdCIKKwkJCSJtb3Z3ICUlYngsICUlYXgiCisJCQk6ICI9ZCIgKHNpZ25hdHVyZSksCisJCQkgICI9YSIgKHBhY2spCisJCQk6ICIxIiAoUENJQklPU19QQ0lfQklPU19QUkVTRU5UKSwKKwkJCSAgIkQiICgmcGNpX2luZGlyZWN0KQorCQkJOiAiYngiLCAiY3giKTsKKwkJcmVzdG9yZV9mbGFncyhmbGFncyk7CisKKwkJcHJlc2VudF9zdGF0dXMgPSAocGFjayA+PiAxNikgJiAweGZmOworCQltYWpvcl9yZXZpc2lvbiA9IChwYWNrID4+IDgpICYgMHhmZjsKKwkJbWlub3JfcmV2aXNpb24gPSBwYWNrICYgMHhmZjsKKwkJaWYgKHByZXNlbnRfc3RhdHVzIHx8IChzaWduYXR1cmUgIT0gUENJX1NJR05BVFVSRSkpIHsKKwkJCXByaW50ZigiRVJST1I6IEJJT1MzMiBzYXlzIFBDSSBCSU9TLCBidXQgbm8gUENJICIKKwkJCQkiQklPUz8/Pz9cbiIpOworCQkJcGNpYmlvc19lbnRyeSA9IDA7CisJCX0KKyNpZglERUJVRworCQlpZiAocGNpYmlvc19lbnRyeSkgeworCQkJcHJpbnRmICgicGNpYmlvc19pbml0IDogUENJIEJJT1MgcmV2aXNpb24gJWhoWC4laGhYIgorCQkJCSIgZW50cnkgYXQgJSNYXG4iLCBtYWpvcl9yZXZpc2lvbiwKKwkJCQltaW5vcl9yZXZpc2lvbiwgcGNpYmlvc19lbnRyeSk7CisJCX0KKyNlbmRpZgorCX0KK30KKworc3RhdGljIHZvaWQgcGNpYmlvc19pbml0KHZvaWQpCit7CisJdW5pb24gYmlvczMyICpjaGVjazsKKwl1bnNpZ25lZCBjaGFyIHN1bTsKKwlpbnQgaSwgbGVuZ3RoOworCXVuc2lnbmVkIGxvbmcgYmlvczMyX2VudHJ5ID0gMDsKKworCUVudGVyRnVuY3Rpb24oInBjaWJpb3NfaW5pdCIpOworCS8qCisJICogRm9sbG93IHRoZSBzdGFuZGFyZCBwcm9jZWR1cmUgZm9yIGxvY2F0aW5nIHRoZSBCSU9TMzIgU2VydmljZQorCSAqIGRpcmVjdG9yeSBieSBzY2FubmluZyB0aGUgcGVybWlzc2libGUgYWRkcmVzcyByYW5nZSBmcm9tCisJICogMHhlMDAwMCB0aHJvdWdoIDB4ZmZmZmYgZm9yIGEgdmFsaWQgQklPUzMyIHN0cnVjdHVyZS4KKwkgKgorCSAqLworCisJZm9yIChjaGVjayA9ICh1bmlvbiBiaW9zMzIgKikgMHhlMDAwMDsgY2hlY2sgPD0gKHVuaW9uIGJpb3MzMiAqKSAweGZmZmYwOyArK2NoZWNrKSB7CisJCWlmIChjaGVjay0+ZmllbGRzLnNpZ25hdHVyZSAhPSBCSU9TMzJfU0lHTkFUVVJFKQorCQkJY29udGludWU7CisJCWxlbmd0aCA9IGNoZWNrLT5maWVsZHMubGVuZ3RoICogMTY7CisJCWlmICghbGVuZ3RoKQorCQkJY29udGludWU7CisJCXN1bSA9IDA7CisJCWZvciAoaSA9IDA7IGkgPCBsZW5ndGggOyArK2kpCisJCQlzdW0gKz0gY2hlY2stPmNoYXJzW2ldOworCQlpZiAoc3VtICE9IDApCisJCQljb250aW51ZTsKKwkJaWYgKGNoZWNrLT5maWVsZHMucmV2aXNpb24gIT0gMCkgeworCQkJcHJpbnRmKCJwY2liaW9zX2luaXQgOiB1bnN1cHBvcnRlZCByZXZpc2lvbiAlZCBhdCAlI1gsIG1haWwgZHJld0Bjb2xvcmFkby5lZHVcbiIsCisJCQkJY2hlY2stPmZpZWxkcy5yZXZpc2lvbiwgY2hlY2spOworCQkJY29udGludWU7CisJCX0KKyNpZglERUJVRworCQlwcmludGYoInBjaWJpb3NfaW5pdCA6IEJJT1MzMiBTZXJ2aWNlIERpcmVjdG9yeSAiCisJCQkic3RydWN0dXJlIGF0ICUjWFxuIiwgY2hlY2spOworI2VuZGlmCisJCWlmICghYmlvczMyX2VudHJ5KSB7CisJCQlpZiAoY2hlY2stPmZpZWxkcy5lbnRyeSA+PSAweDEwMDAwMCkgeworCQkJCXByaW50ZigicGNpYmlvc19pbml0OiBlbnRyeSBpbiBoaWdoICIKKwkJCQkJIm1lbW9yeSwgZ2l2aW5nIHVwXG4iKTsKKwkJCQlyZXR1cm47CisJCQl9IGVsc2UgeworCQkJCWJpb3MzMl9lbnRyeSA9IGNoZWNrLT5maWVsZHMuZW50cnk7CisjaWYJREVCVUcKKwkJCQlwcmludGYoInBjaWJpb3NfaW5pdCA6IEJJT1MzMiBTZXJ2aWNlIERpcmVjdG9yeSIKKwkJCQkJIiBlbnRyeSBhdCAlI1hcbiIsIGJpb3MzMl9lbnRyeSk7CisjZW5kaWYKKwkJCQliaW9zMzJfaW5kaXJlY3QuYWRkcmVzcyA9IGJpb3MzMl9lbnRyeTsKKwkJCX0KKwkJfQorCX0KKwlpZiAoYmlvczMyX2VudHJ5KQorCQljaGVja19wY2liaW9zKCk7CisJTGVhdmVGdW5jdGlvbigicGNpYmlvc19pbml0Iik7Cit9CisKKyNlbmRpZgkvKiBDT05GSUdfUENJX0RJUkVDVCBub3QgZGVmaW5lZCovCisKK3Vuc2lnbmVkIGxvbmcgcGNpYmlvc19idXNfYmFzZSh1bnNpZ25lZCBpbnQgYnVzIF9fdW51c2VkKQoreworCS8qIGFyY2hpdGVjdHVyYWxseSB0aGlzIG11c3QgYmUgMCAqLworCXJldHVybiAwOworfQorCit2b2lkIGZpbmRfcGNpKGludCB0eXBlLCBzdHJ1Y3QgcGNpX2RldmljZSAqZGV2KQoreworCUVudGVyRnVuY3Rpb24oImZpbmRfcGNpIik7CisjaWZuZGVmCUNPTkZJR19QQ0lfRElSRUNUCisJaWYgKCFwY2liaW9zX2VudHJ5KSB7CisJCXBjaWJpb3NfaW5pdCgpOworCX0KKwlpZiAoIXBjaWJpb3NfZW50cnkpIHsKKwkJcHJpbnRmKCJwY2lfaW5pdDogbm8gQklPUzMyIGRldGVjdGVkXG4iKTsKKwkJcmV0dXJuOworCX0KKyNlbmRpZgorCUxlYXZlRnVuY3Rpb24oImZpbmRfcGNpIik7CisJcmV0dXJuIHNjYW5fcGNpX2J1cyh0eXBlLCBkZXYpOworfQpkaWZmIC1OYXVyIGdydWItMC45Ny5vcmlnL25ldGJvb3QvcGNuZXQzMi5jIGdydWItMC45Ny9uZXRib290L3BjbmV0MzIuYwotLS0gZ3J1Yi0wLjk3Lm9yaWcvbmV0Ym9vdC9wY25ldDMyLmMJMTk3MC0wMS0wMSAwMDowMDowMC4wMDAwMDAwMDAgKzAwMDAKKysrIGdydWItMC45Ny9uZXRib290L3BjbmV0MzIuYwkyMDA1LTA4LTMxIDIyOjU3OjUwLjAwMDAwMDAwMCArMDAwMApAQCAtMCwwICsxLDEwMDQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiAgICBwY25ldDMyLmMgLS0gRXRoZXJib290IGRldmljZSBkcml2ZXIgZm9yIHRoZSBBTUQgUENuZXQzMgorKiAgICBXcml0dGVuIDIwMDMtMjAwMyBieSBUaW1vdGh5IExlZ2dlIDx0bGVnZ2VAcm9nZXJzLmNvbT4KKyoKKyogICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyogICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyogICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyogICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyoKKyogICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisqICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisqICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyogICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyoKKyogICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyogICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyogICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisqCisqICAgIFBvcnRpb25zIG9mIHRoaXMgY29kZSBiYXNlZCBvbjoKKyoJCXBjbmV0MzIuYzogQW4gQU1EIFBDbmV0MzIgZXRoZXJuZXQgZHJpdmVyIGZvciBsaW51eDoKKyoKKyoJKEMpIDE5OTYtMTk5OSBUaG9tYXMgQm9nZW5kb2VyZmVyCisqCQlTZWUgTGludXggRHJpdmVyIGZvciBmdWxsIGluZm9ybWF0aW9uCisqCQorKglUaGUgdHJhbnNtaXQgYW5kIHBvbGwgZnVuY3Rpb25zIHdlcmUgd3JpdHRlbiB3aXRoIHJlZmVyZW5jZSB0bzoKKyoJbGFuY2UuYyAtIExBTkNFIE5JQyBkcml2ZXIgZm9yIEV0aGVyYm9vdCB3cml0dGVuIGJ5IEtlbiBZYXAgCisqCQorKglMaW51eCBEcml2ZXIgVmVyc2lvbiAxLjI3YSwgMTAuMDIuMjAwMgorKiAKKyogCisqICAgIFJFVklTSU9OIEhJU1RPUlk6CisqICAgID09PT09PT09PT09PT09PT0KKyogICAgdjEuMAkwOC0wNi0yMDAzCXRpbWxlZ2dlCUluaXRpYWwgcG9ydCBvZiBMaW51eCBkcml2ZXIKKyogICAgdjEuMQkwOC0yMy0yMDAzCXRpbWxlZ2dlCUFkZCBtdWx0aWNhc3Qgc3VwcG9ydAorKiAgICB2MS4yCTAxLTE3LTIwMDQJdGltbGVnZ2UJSW5pdGlhbCBkcml2ZXIgb3V0cHV0IGNsZWFudXAKKyogICAgdjEuMwkwMy0yOS0yMDA0CXRpbWxlZ2dlCU1vcmUgZHJpdmVyIGNsZWFudXAKKyogICAgCisqICAgIEluZGVudCBPcHRpb25zOiBpbmRlbnQgLWtyIC1pOAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiB0byBnZXQgc29tZSBnbG9iYWwgcm91dGluZXMgbGlrZSBwcmludGYgKi8KKyNpbmNsdWRlICJldGhlcmJvb3QuaCIKKy8qIHRvIGdldCB0aGUgaW50ZXJmYWNlIHRvIHRoZSBib2R5IG9mIHRoZSBwcm9ncmFtICovCisjaW5jbHVkZSAibmljLmgiCisvKiB0byBnZXQgdGhlIFBDSSBzdXBwb3J0IGZ1bmN0aW9ucywgaWYgdGhpcyBpcyBhIFBDSSBOSUMgKi8KKyNpbmNsdWRlICJwY2kuaCIKKy8qIEluY2x1ZGUgdGhlIHRpbWUgZnVuY3Rpb25zICovCisjaW5jbHVkZSAidGltZXIuaCIKKyNpbmNsdWRlICJtaWkuaCIKKy8qIHZvaWQgaGV4X2R1bXAoY29uc3QgY2hhciAqZGF0YSwgY29uc3QgdW5zaWduZWQgaW50IGxlbik7ICovCisKKy8qIEV0aGVyYm9vdCBTcGVjaWZpYyBkZWZpbmF0aW9ucyAqLworI2RlZmluZSBkcnZfdmVyc2lvbiAidjEuMyIKKyNkZWZpbmUgZHJ2X2RhdGUgIjAzLTI5LTIwMDQiCisKK3R5cGVkZWYgdW5zaWduZWQgY2hhciB1ODsKK3R5cGVkZWYgc2lnbmVkIGNoYXIgczg7Cit0eXBlZGVmIHVuc2lnbmVkIHNob3J0IHUxNjsKK3R5cGVkZWYgc2lnbmVkIHNob3J0IHMxNjsKK3R5cGVkZWYgdW5zaWduZWQgaW50IHUzMjsKK3R5cGVkZWYgc2lnbmVkIGludCBzMzI7CisKK3N0YXRpYyB1MzIgaW9hZGRyOwkJLyogR2xvYmFsbHkgdXNlZCBmb3IgdGhlIGNhcmQncyBpbyBhZGRyZXNzICovCisKKyNpZmRlZiBFREVCVUcKKyNkZWZpbmUgZHByaW50Zih4KSBwcmludGYgeAorI2Vsc2UKKyNkZWZpbmUgZHByaW50Zih4KQorI2VuZGlmCisKKy8qIENvbmRlbnNlZCBvcGVyYXRpb25zIGZvciByZWFkYWJpbGl0eS4gKi8KKyNkZWZpbmUgdmlydF90b19sZTMyZGVzYyhhZGRyKSAgY3B1X3RvX2xlMzIodmlydF90b19idXMoYWRkcikpCisjZGVmaW5lIGxlMzJkZXNjX3RvX3ZpcnQoYWRkcikgIGJ1c190b192aXJ0KGxlMzJfdG9fY3B1KGFkZHIpKQorCisvKiBFbmQgRXRoZXJib290IFNwZWNpZmljICovCisKK2ludCBjYXJkc19mb3VuZCAvKiBfX2luaXRkYXRhICovIDsKKworI2lmZGVmIFJFTU9WRQorLyogRklYTUU6IFJlbW92ZSB0aGVzZSB0aGV5IGFyZSBwcm9iYWJseSBwb2ludGxlc3MgKi8KKworLyogCisgKiBWTEIgSS9PIGFkZHJlc3NlcyAKKyAqLworc3RhdGljIHVuc2lnbmVkIGludCBwY25ldDMyX3BvcnRsaXN0W10gLypfX2luaXRkYXRhICovICA9Cit7IDB4MzAwLCAweDMyMCwgMHgzNDAsIDB4MzYwLCAwIH07CisKK3N0YXRpYyBpbnQgcGNuZXQzMl9kZWJ1ZyA9IDE7CitzdGF0aWMgaW50IHR4X3N0YXJ0ID0gMTsJLyogTWFwcGluZyAtLSAwOjIwLCAxOjY0LCAyOjEyOCwgMzp+MjIwIChkZXBlbmRzIG9uIGNoaXAgdmVycykgKi8KK3N0YXRpYyBpbnQgcGNuZXQzMnZsYjsJCS8qIGNoZWNrIGZvciBWTEIgY2FyZHMgPyAqLworCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2UgKnBjbmV0MzJfZGV2OworCitzdGF0aWMgaW50IG1heF9pbnRlcnJ1cHRfd29yayA9IDgwOworc3RhdGljIGludCByeF9jb3B5YnJlYWsgPSAyMDA7CisjZW5kaWYKKyNkZWZpbmUgUENORVQzMl9QT1JUX0FVSSAgICAgIDB4MDAKKyNkZWZpbmUgUENORVQzMl9QT1JUXzEwQlQgICAgIDB4MDEKKyNkZWZpbmUgUENORVQzMl9QT1JUX0dQU0kgICAgIDB4MDIKKyNkZWZpbmUgUENORVQzMl9QT1JUX01JSSAgICAgIDB4MDMKKworI2RlZmluZSBQQ05FVDMyX1BPUlRfUE9SVFNFTCAgMHgwMworI2RlZmluZSBQQ05FVDMyX1BPUlRfQVNFTCAgICAgMHgwNAorI2RlZmluZSBQQ05FVDMyX1BPUlRfMTAwICAgICAgMHg0MAorI2RlZmluZSBQQ05FVDMyX1BPUlRfRkQJICAgICAgMHg4MAorCisjZGVmaW5lIFBDTkVUMzJfRE1BX01BU0sgMHhmZmZmZmZmZgorCisvKgorICogdGFibGUgdG8gdHJhbnNsYXRlIG9wdGlvbiB2YWx1ZXMgZnJvbSB0dWxpcAorICogdG8gaW50ZXJuYWwgb3B0aW9ucworICovCitzdGF0aWMgdW5zaWduZWQgY2hhciBvcHRpb25zX21hcHBpbmdbXSA9IHsKKwlQQ05FVDMyX1BPUlRfQVNFTCwJLyogIDAgQXV0by1zZWxlY3QgICAgICAqLworCVBDTkVUMzJfUE9SVF9BVUksCS8qICAxIEJOQy9BVUkgICAgICAgICAgKi8KKwlQQ05FVDMyX1BPUlRfQVVJLAkvKiAgMiBBVUkvQk5DICAgICAgICAgICovCisJUENORVQzMl9QT1JUX0FTRUwsCS8qICAzIG5vdCBzdXBwb3J0ZWQgICAgKi8KKwlQQ05FVDMyX1BPUlRfMTBCVCB8IFBDTkVUMzJfUE9SVF9GRCwJLyogIDQgMTBiYXNlVC1GRCAgICAgICAqLworCVBDTkVUMzJfUE9SVF9BU0VMLAkvKiAgNSBub3Qgc3VwcG9ydGVkICAgICovCisJUENORVQzMl9QT1JUX0FTRUwsCS8qICA2IG5vdCBzdXBwb3J0ZWQgICAgKi8KKwlQQ05FVDMyX1BPUlRfQVNFTCwJLyogIDcgbm90IHN1cHBvcnRlZCAgICAqLworCVBDTkVUMzJfUE9SVF9BU0VMLAkvKiAgOCBub3Qgc3VwcG9ydGVkICAgICovCisJUENORVQzMl9QT1JUX01JSSwJLyogIDkgTUlJIDEwYmFzZVQgICAgICAqLworCVBDTkVUMzJfUE9SVF9NSUkgfCBQQ05FVDMyX1BPUlRfRkQsCS8qIDEwIE1JSSAxMGJhc2VULUZEICAgKi8KKwlQQ05FVDMyX1BPUlRfTUlJLAkvKiAxMSBNSUkgKGF1dG9zZWwpICAgICovCisJUENORVQzMl9QT1JUXzEwQlQsCS8qIDEyIDEwQmFzZVQgICAgICAgICAgKi8KKwlQQ05FVDMyX1BPUlRfTUlJIHwgUENORVQzMl9QT1JUXzEwMCwJLyogMTMgTUlJIDEwMEJhc2VUeCAgICAqLworCVBDTkVUMzJfUE9SVF9NSUkgfCBQQ05FVDMyX1BPUlRfMTAwIHwgUENORVQzMl9QT1JUX0ZELAkvKiAxNCBNSUkgMTAwQmFzZVR4LUZEICovCisJUENORVQzMl9QT1JUX0FTRUwJLyogMTUgbm90IHN1cHBvcnRlZCAgICAqLworfTsKKworI2RlZmluZSBNQVhfVU5JVFMgOAkJLyogTW9yZSBhcmUgc3VwcG9ydGVkLCBsaW1pdCBvbmx5IG9uIG9wdGlvbnMgKi8KK3N0YXRpYyBpbnQgb3B0aW9uc1tNQVhfVU5JVFNdOworc3RhdGljIGludCBmdWxsX2R1cGxleFtNQVhfVU5JVFNdOworCisvKgorICoJCQkJVGhlb3J5IG9mIE9wZXJhdGlvbgorICogCisgKiBUaGlzIGRyaXZlciB1c2VzIHRoZSBzYW1lIHNvZnR3YXJlIHN0cnVjdHVyZSBhcyB0aGUgbm9ybWFsIGxhbmNlCisgKiBkcml2ZXIuIFNvIGxvb2sgZm9yIGEgdmVyYm9zZSBkZXNjcmlwdGlvbiBpbiBsYW5jZS5jLiBUaGUgZGlmZmVyZW5jZXMKKyAqIHRvIHRoZSBub3JtYWwgbGFuY2UgZHJpdmVyIGlzIHRoZSB1c2Ugb2YgdGhlIDMyYml0IG1vZGUgb2YgUENuZXQzMgorICogYW5kIFBDbmV0UENJIGNoaXBzLiBCZWNhdXNlIHRoZXNlIGNoaXBzIGFyZSAzMmJpdCBjaGlwcywgdGhlcmUgaXMgbm8KKyAqIDE2TUIgbGltaXRhdGlvbiBhbmQgd2UgZG9uJ3QgbmVlZCBib3VuY2UgYnVmZmVycy4KKyAqLworCisKKworLyoKKyAqIFNldCB0aGUgbnVtYmVyIG9mIFR4IGFuZCBSeCBidWZmZXJzLCB1c2luZyBMb2dfMigjIGJ1ZmZlcnMpLgorICogUmVhc29uYWJsZSBkZWZhdWx0IHZhbHVlcyBhcmUgNCBUeCBidWZmZXJzLCBhbmQgMTYgUnggYnVmZmVycy4KKyAqIFRoYXQgdHJhbnNsYXRlcyB0byAyICg0ID09IDJeXjIpIGFuZCA0ICgxNiA9PSAyXl40KS4KKyAqLworI2lmbmRlZiBQQ05FVDMyX0xPR19UWF9CVUZGRVJTCisjZGVmaW5lIFBDTkVUMzJfTE9HX1RYX0JVRkZFUlMgMQorI2RlZmluZSBQQ05FVDMyX0xPR19SWF9CVUZGRVJTIDIKKyNlbmRpZgorCisjZGVmaW5lIFRYX1JJTkdfU0laRQkJKDEgPDwgKFBDTkVUMzJfTE9HX1RYX0JVRkZFUlMpKQorI2RlZmluZSBUWF9SSU5HX01PRF9NQVNLCShUWF9SSU5HX1NJWkUgLSAxKQorLyogRklYTUU6IEZpeCB0aGlzIHRvIGFsbG93IG11bHRpcGxlIHR4X3JpbmcgZGVzY3JpcHRvcnMgKi8KKyNkZWZpbmUgVFhfUklOR19MRU5fQklUUwkweDAwMDAJLypQQ05FVDMyX0xPR19UWF9CVUZGRVJTKSA8PCAxMikgKi8KKworI2RlZmluZSBSWF9SSU5HX1NJWkUJCSgxIDw8IChQQ05FVDMyX0xPR19SWF9CVUZGRVJTKSkKKyNkZWZpbmUgUlhfUklOR19NT0RfTUFTSwkoUlhfUklOR19TSVpFIC0gMSkKKyNkZWZpbmUgUlhfUklOR19MRU5fQklUUwkoKFBDTkVUMzJfTE9HX1JYX0JVRkZFUlMpIDw8IDQpCisKKyNkZWZpbmUgUEtUX0JVRl9TWgkJMTU0NAorCisvKiBPZmZzZXRzIGZyb20gYmFzZSBJL08gYWRkcmVzcy4gKi8KKyNkZWZpbmUgUENORVQzMl9XSU9fUkRQCQkweDEwCisjZGVmaW5lIFBDTkVUMzJfV0lPX1JBUAkJMHgxMgorI2RlZmluZSBQQ05FVDMyX1dJT19SRVNFVAkweDE0CisjZGVmaW5lIFBDTkVUMzJfV0lPX0JEUAkJMHgxNgorCisjZGVmaW5lIFBDTkVUMzJfRFdJT19SRFAJMHgxMAorI2RlZmluZSBQQ05FVDMyX0RXSU9fUkFQCTB4MTQKKyNkZWZpbmUgUENORVQzMl9EV0lPX1JFU0VUCTB4MTgKKyNkZWZpbmUgUENORVQzMl9EV0lPX0JEUAkweDFDCisKKyNkZWZpbmUgUENORVQzMl9UT1RBTF9TSVpFCTB4MjAKKworLyogQnVmZmVycyBmb3IgdGhlIHR4IGFuZCBSeCAqLworCisvKiBDcmVhdGUgYSBzdGF0aWMgYnVmZmVyIG9mIHNpemUgUEtUX0JVRl9TWiBmb3IgZWFjaAorVFggRGVzY3JpcHRvci4gIEFsbCBkZXNjcmlwdG9ycyBwb2ludCB0byBhCitwYXJ0IG9mIHRoaXMgYnVmZmVyICovCitzdGF0aWMgdW5zaWduZWQgY2hhciB0eGJbUEtUX0JVRl9TWiAqIFRYX1JJTkdfU0laRV07CisvLyAgICBfX2F0dHJpYnV0ZV9fICgoYWxpZ25lZCgxNikpKTsKKworLyogQ3JlYXRlIGEgc3RhdGljIGJ1ZmZlciBvZiBzaXplIFBLVF9CVUZfU1ogZm9yIGVhY2gKK1JYIERlc2NyaXB0b3IgICBBbGwgZGVzY3JpcHRvcnMgcG9pbnQgdG8gYQorcGFydCBvZiB0aGlzIGJ1ZmZlciAqLworc3RhdGljIHVuc2lnbmVkIGNoYXIgcnhiW1JYX1JJTkdfU0laRSAqIFBLVF9CVUZfU1pdOworLy8gICAgX19hdHRyaWJ1dGVfXyAoKGFsaWduZWQoMTYpKSk7CisKKy8qIFRoZSBQQ05FVDMyIFJ4IGFuZCBUeCByaW5nIGRlc2NyaXB0b3JzLiAqLworc3RydWN0IHBjbmV0MzJfcnhfaGVhZCB7CisJdTMyIGJhc2U7CisJczE2IGJ1Zl9sZW5ndGg7CisJczE2IHN0YXR1czsKKwl1MzIgbXNnX2xlbmd0aDsKKwl1MzIgcmVzZXJ2ZWQ7Cit9OworCitzdHJ1Y3QgcGNuZXQzMl90eF9oZWFkIHsKKwl1MzIgYmFzZTsKKwlzMTYgbGVuZ3RoOworCXMxNiBzdGF0dXM7CisJdTMyIG1pc2M7CisJdTMyIHJlc2VydmVkOworfTsKKworLyogVGhlIFBDTkVUMzIgMzItQml0IGluaXRpYWxpemF0aW9uIGJsb2NrLCBkZXNjcmliZWQgaW4gZGF0YWJvb2suICovCitzdHJ1Y3QgcGNuZXQzMl9pbml0X2Jsb2NrIHsKKwl1MTYgbW9kZTsKKwl1MTYgdGxlbl9ybGVuOworCXU4IHBoeXNfYWRkcls2XTsKKwl1MTYgcmVzZXJ2ZWQ7CisJdTMyIGZpbHRlclsyXTsKKwkvKiBSZWNlaXZlIGFuZCB0cmFuc21pdCByaW5nIGJhc2UsIGFsb25nIHdpdGggZXh0cmEgYml0cy4gKi8KKwl1MzIgcnhfcmluZzsKKwl1MzIgdHhfcmluZzsKK307CisvKiBQQ25ldDMyIGFjY2VzcyBmdW5jdGlvbnMgKi8KK3N0cnVjdCBwY25ldDMyX2FjY2VzcyB7CisJdTE2KCpyZWFkX2NzcikgKHVuc2lnbmVkIGxvbmcsIGludCk7CisJdm9pZCAoKndyaXRlX2NzcikgKHVuc2lnbmVkIGxvbmcsIGludCwgdTE2KTsKKwkgdTE2KCpyZWFkX2JjcikgKHVuc2lnbmVkIGxvbmcsIGludCk7CisJdm9pZCAoKndyaXRlX2JjcikgKHVuc2lnbmVkIGxvbmcsIGludCwgdTE2KTsKKwkgdTE2KCpyZWFkX3JhcCkgKHVuc2lnbmVkIGxvbmcpOworCXZvaWQgKCp3cml0ZV9yYXApICh1bnNpZ25lZCBsb25nLCB1MTYpOworCXZvaWQgKCpyZXNldCkgKHVuc2lnbmVkIGxvbmcpOworfTsKKworLyogRGVmaW5lIHRoZSBUWCBEZXNjcmlwdG9yICovCitzdGF0aWMgc3RydWN0IHBjbmV0MzJfdHhfaGVhZCB0eF9yaW5nW1RYX1JJTkdfU0laRV0KKyAgICBfX2F0dHJpYnV0ZV9fICgoYWxpZ25lZCgxNikpKTsKKworCisvKiBEZWZpbmUgdGhlIFJYIERlc2NyaXB0b3IgKi8KK3N0YXRpYyBzdHJ1Y3QgcGNuZXQzMl9yeF9oZWFkIHJ4X3JpbmdbUlhfUklOR19TSVpFXQorICAgIF9fYXR0cmlidXRlX18gKChhbGlnbmVkKDE2KSkpOworCisvKiBNYXkgbmVlZCB0byBiZSBtb3ZlZCB0byBtaWkuaCAqLworc3RydWN0IG1paV9pZl9pbmZvIHsKKwlpbnQgcGh5X2lkOworCWludCBhZHZlcnRpc2luZzsKKwl1bnNpZ25lZCBpbnQgZnVsbF9kdXBsZXg6MTsJLyogaXMgZnVsbCBkdXBsZXg/ICovCit9OworCisvKgorICogVGhlIGZpcnN0IHRocmVlIGZpZWxkcyBvZiBwY25ldDMyX3ByaXZhdGUgYXJlIHJlYWQgYnkgdGhlIGV0aGVybmV0IGRldmljZSAKKyAqIHNvIHdlIGFsbG9jYXRlIHRoZSBzdHJ1Y3R1cmUgc2hvdWxkIGJlIGFsbG9jYXRlZCBieSBwY2lfYWxsb2NfY29uc2lzdGVudCgpLgorICovCisjZGVmaW5lIE1JSV9DTlQgNAorc3RydWN0IHBjbmV0MzJfcHJpdmF0ZSB7CisJc3RydWN0IHBjbmV0MzJfaW5pdF9ibG9jayBpbml0X2Jsb2NrOworCXN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2OwkvKiBQb2ludGVyIHRvIHRoZSBhc3NvY2lhdGVkIHBjaSBkZXZpY2Ugc3RydWN0dXJlICovCisJY29uc3QgY2hhciAqbmFtZTsKKwkvKiBUaGUgc2F2ZWQgYWRkcmVzcyBvZiBhIHNlbnQtaW4tcGxhY2UgcGFja2V0L2J1ZmZlciwgZm9yIHNrZnJlZSgpLiAqLworCXN0cnVjdCBza19idWZmICp0eF9za2J1ZmZbVFhfUklOR19TSVpFXTsKKwlzdHJ1Y3Qgc2tfYnVmZiAqcnhfc2tidWZmW1JYX1JJTkdfU0laRV07CisJc3RydWN0IHBjbmV0MzJfYWNjZXNzIGE7CisJdW5zaWduZWQgaW50IGN1cl9yeCwgY3VyX3R4OwkvKiBUaGUgbmV4dCBmcmVlIHJpbmcgZW50cnkgKi8KKwljaGFyIHR4X2Z1bGw7CisJaW50IG9wdGlvbnM7CisJaW50IHNoYXJlZF9pcnE6MSwJLyogc2hhcmVkIGlycSBwb3NzaWJsZSAqLworCSBsdGludDoxLAkJLyogZW5hYmxlIFR4RG9uZS1pbnRyIGluaGliaXRvciAqLworCSBkeHN1ZmxvOjEsCQkvKiBkaXNhYmxlIHRyYW5zbWl0IHN0b3Agb24gdWZsbyAqLworCSBtaWk6MTsJCQkvKiBtaWkgcG9ydCBhdmFpbGFibGUgKi8KKwlzdHJ1Y3QgbWlpX2lmX2luZm8gbWlpX2lmOworCXVuc2lnbmVkIGNoYXIgcGh5c1tNSUlfQ05UXTsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV4dDsKKwlpbnQgZnVsbF9kdXBsZXg6MTsKK30gbHB4OworCitzdGF0aWMgc3RydWN0IHBjbmV0MzJfcHJpdmF0ZSAqbHA7CisKK3N0YXRpYyBpbnQgbWRpb19yZWFkKHN0cnVjdCBuaWMgKm5pYyBfX3VudXNlZCwgaW50IHBoeV9pZCwgaW50IHJlZ19udW0pOworI2lmIDAKK3N0YXRpYyB2b2lkIG1kaW9fd3JpdGUoc3RydWN0IG5pYyAqbmljIF9fdW51c2VkLCBpbnQgcGh5X2lkLCBpbnQgcmVnX251bSwKKwkJICAgICAgIGludCB2YWwpOworI2VuZGlmCitlbnVtIHBjaV9mbGFnc19iaXQgeworCVBDSV9VU0VTX0lPID0gMSwgUENJX1VTRVNfTUVNID0gMiwgUENJX1VTRVNfTUFTVEVSID0gNCwKKwlQQ0lfQUREUjAgPSAweDEwIDw8IDAsIFBDSV9BRERSMSA9IDB4MTAgPDwgMSwgUENJX0FERFIyID0KKwkgICAgMHgxMCA8PCAyLCBQQ0lfQUREUjMgPSAweDEwIDw8IDMsCit9OworCisKK3N0YXRpYyB1MTYgcGNuZXQzMl93aW9fcmVhZF9jc3IodW5zaWduZWQgbG9uZyBhZGRyLCBpbnQgaW5kZXgpCit7CisJb3V0dyhpbmRleCwgYWRkciArIFBDTkVUMzJfV0lPX1JBUCk7CisJcmV0dXJuIGludyhhZGRyICsgUENORVQzMl9XSU9fUkRQKTsKK30KKworc3RhdGljIHZvaWQgcGNuZXQzMl93aW9fd3JpdGVfY3NyKHVuc2lnbmVkIGxvbmcgYWRkciwgaW50IGluZGV4LCB1MTYgdmFsKQoreworCW91dHcoaW5kZXgsIGFkZHIgKyBQQ05FVDMyX1dJT19SQVApOworCW91dHcodmFsLCBhZGRyICsgUENORVQzMl9XSU9fUkRQKTsKK30KKworc3RhdGljIHUxNiBwY25ldDMyX3dpb19yZWFkX2Jjcih1bnNpZ25lZCBsb25nIGFkZHIsIGludCBpbmRleCkKK3sKKwlvdXR3KGluZGV4LCBhZGRyICsgUENORVQzMl9XSU9fUkFQKTsKKwlyZXR1cm4gaW53KGFkZHIgKyBQQ05FVDMyX1dJT19CRFApOworfQorCitzdGF0aWMgdm9pZCBwY25ldDMyX3dpb193cml0ZV9iY3IodW5zaWduZWQgbG9uZyBhZGRyLCBpbnQgaW5kZXgsIHUxNiB2YWwpCit7CisJb3V0dyhpbmRleCwgYWRkciArIFBDTkVUMzJfV0lPX1JBUCk7CisJb3V0dyh2YWwsIGFkZHIgKyBQQ05FVDMyX1dJT19CRFApOworfQorCitzdGF0aWMgdTE2IHBjbmV0MzJfd2lvX3JlYWRfcmFwKHVuc2lnbmVkIGxvbmcgYWRkcikKK3sKKwlyZXR1cm4gaW53KGFkZHIgKyBQQ05FVDMyX1dJT19SQVApOworfQorCitzdGF0aWMgdm9pZCBwY25ldDMyX3dpb193cml0ZV9yYXAodW5zaWduZWQgbG9uZyBhZGRyLCB1MTYgdmFsKQoreworCW91dHcodmFsLCBhZGRyICsgUENORVQzMl9XSU9fUkFQKTsKK30KKworc3RhdGljIHZvaWQgcGNuZXQzMl93aW9fcmVzZXQodW5zaWduZWQgbG9uZyBhZGRyKQoreworCWludyhhZGRyICsgUENORVQzMl9XSU9fUkVTRVQpOworfQorCitzdGF0aWMgaW50IHBjbmV0MzJfd2lvX2NoZWNrKHVuc2lnbmVkIGxvbmcgYWRkcikKK3sKKwlvdXR3KDg4LCBhZGRyICsgUENORVQzMl9XSU9fUkFQKTsKKwlyZXR1cm4gKGludyhhZGRyICsgUENORVQzMl9XSU9fUkFQKSA9PSA4OCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGNuZXQzMl9hY2Nlc3MgcGNuZXQzMl93aW8gPSB7CisgICAgICByZWFkX2NzcjpwY25ldDMyX3dpb19yZWFkX2NzciwKKyAgICAgIHdyaXRlX2NzcjpwY25ldDMyX3dpb193cml0ZV9jc3IsCisgICAgICByZWFkX2JjcjpwY25ldDMyX3dpb19yZWFkX2JjciwKKyAgICAgIHdyaXRlX2JjcjpwY25ldDMyX3dpb193cml0ZV9iY3IsCisgICAgICByZWFkX3JhcDpwY25ldDMyX3dpb19yZWFkX3JhcCwKKyAgICAgIHdyaXRlX3JhcDpwY25ldDMyX3dpb193cml0ZV9yYXAsCisgICAgICByZXNldDpwY25ldDMyX3dpb19yZXNldAorfTsKKworc3RhdGljIHUxNiBwY25ldDMyX2R3aW9fcmVhZF9jc3IodW5zaWduZWQgbG9uZyBhZGRyLCBpbnQgaW5kZXgpCit7CisJb3V0bChpbmRleCwgYWRkciArIFBDTkVUMzJfRFdJT19SQVApOworCXJldHVybiAoaW5sKGFkZHIgKyBQQ05FVDMyX0RXSU9fUkRQKSAmIDB4ZmZmZik7Cit9CisKK3N0YXRpYyB2b2lkIHBjbmV0MzJfZHdpb193cml0ZV9jc3IodW5zaWduZWQgbG9uZyBhZGRyLCBpbnQgaW5kZXgsIHUxNiB2YWwpCit7CisJb3V0bChpbmRleCwgYWRkciArIFBDTkVUMzJfRFdJT19SQVApOworCW91dGwodmFsLCBhZGRyICsgUENORVQzMl9EV0lPX1JEUCk7Cit9CisKK3N0YXRpYyB1MTYgcGNuZXQzMl9kd2lvX3JlYWRfYmNyKHVuc2lnbmVkIGxvbmcgYWRkciwgaW50IGluZGV4KQoreworCW91dGwoaW5kZXgsIGFkZHIgKyBQQ05FVDMyX0RXSU9fUkFQKTsKKwlyZXR1cm4gKGlubChhZGRyICsgUENORVQzMl9EV0lPX0JEUCkgJiAweGZmZmYpOworfQorCitzdGF0aWMgdm9pZCBwY25ldDMyX2R3aW9fd3JpdGVfYmNyKHVuc2lnbmVkIGxvbmcgYWRkciwgaW50IGluZGV4LCB1MTYgdmFsKQoreworCW91dGwoaW5kZXgsIGFkZHIgKyBQQ05FVDMyX0RXSU9fUkFQKTsKKwlvdXRsKHZhbCwgYWRkciArIFBDTkVUMzJfRFdJT19CRFApOworfQorCitzdGF0aWMgdTE2IHBjbmV0MzJfZHdpb19yZWFkX3JhcCh1bnNpZ25lZCBsb25nIGFkZHIpCit7CisJcmV0dXJuIChpbmwoYWRkciArIFBDTkVUMzJfRFdJT19SQVApICYgMHhmZmZmKTsKK30KKworc3RhdGljIHZvaWQgcGNuZXQzMl9kd2lvX3dyaXRlX3JhcCh1bnNpZ25lZCBsb25nIGFkZHIsIHUxNiB2YWwpCit7CisJb3V0bCh2YWwsIGFkZHIgKyBQQ05FVDMyX0RXSU9fUkFQKTsKK30KKworc3RhdGljIHZvaWQgcGNuZXQzMl9kd2lvX3Jlc2V0KHVuc2lnbmVkIGxvbmcgYWRkcikKK3sKKwlpbmwoYWRkciArIFBDTkVUMzJfRFdJT19SRVNFVCk7Cit9CisKK3N0YXRpYyBpbnQgcGNuZXQzMl9kd2lvX2NoZWNrKHVuc2lnbmVkIGxvbmcgYWRkcikKK3sKKwlvdXRsKDg4LCBhZGRyICsgUENORVQzMl9EV0lPX1JBUCk7CisJcmV0dXJuICgoaW5sKGFkZHIgKyBQQ05FVDMyX0RXSU9fUkFQKSAmIDB4ZmZmZikgPT0gODgpOworfQorCitzdGF0aWMgc3RydWN0IHBjbmV0MzJfYWNjZXNzIHBjbmV0MzJfZHdpbyA9IHsKKyAgICAgIHJlYWRfY3NyOnBjbmV0MzJfZHdpb19yZWFkX2NzciwKKyAgICAgIHdyaXRlX2NzcjpwY25ldDMyX2R3aW9fd3JpdGVfY3NyLAorICAgICAgcmVhZF9iY3I6cGNuZXQzMl9kd2lvX3JlYWRfYmNyLAorICAgICAgd3JpdGVfYmNyOnBjbmV0MzJfZHdpb193cml0ZV9iY3IsCisgICAgICByZWFkX3JhcDpwY25ldDMyX2R3aW9fcmVhZF9yYXAsCisgICAgICB3cml0ZV9yYXA6cGNuZXQzMl9kd2lvX3dyaXRlX3JhcCwKKyAgICAgIHJlc2V0OnBjbmV0MzJfZHdpb19yZXNldAorfTsKKworCisvKiBJbml0aWFsaXplIHRoZSBQQ05FVDMyIFJ4IGFuZCBUeCByaW5ncy4gKi8KK3N0YXRpYyBpbnQgcGNuZXQzMl9pbml0X3Jpbmcoc3RydWN0IG5pYyAqbmljKQoreworCWludCBpOworCisJbHAtPnR4X2Z1bGwgPSAwOworCWxwLT5jdXJfcnggPSBscC0+Y3VyX3R4ID0gMDsKKworCWZvciAoaSA9IDA7IGkgPCBSWF9SSU5HX1NJWkU7IGkrKykgeworCQlyeF9yaW5nW2ldLmJhc2UgPSAodTMyKSB2aXJ0X3RvX2xlMzJkZXNjKCZyeGJbaV0pOworCQlyeF9yaW5nW2ldLmJ1Zl9sZW5ndGggPSBsZTE2X3RvX2NwdSgtUEtUX0JVRl9TWik7CisJCXJ4X3JpbmdbaV0uc3RhdHVzID0gbGUxNl90b19jcHUoMHg4MDAwKTsKKwl9CisKKwkvKiBUaGUgVHggYnVmZmVyIGFkZHJlc3MgaXMgZmlsbGVkIGluIGFzIG5lZWRlZCwgYnV0IHdlIGRvIG5lZWQgdG8gY2xlYXIKKwkgICB0aGUgdXBwZXIgb3duZXJzaGlwIGJpdC4gKi8KKwlmb3IgKGkgPSAwOyBpIDwgVFhfUklOR19TSVpFOyBpKyspIHsKKwkJdHhfcmluZ1tpXS5iYXNlID0gMDsKKwkJdHhfcmluZ1tpXS5zdGF0dXMgPSAwOworCX0KKworCisJbHAtPmluaXRfYmxvY2sudGxlbl9ybGVuID0KKwkgICAgbGUxNl90b19jcHUoVFhfUklOR19MRU5fQklUUyB8IFJYX1JJTkdfTEVOX0JJVFMpOworCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspCisJCWxwLT5pbml0X2Jsb2NrLnBoeXNfYWRkcltpXSA9IG5pYy0+bm9kZV9hZGRyW2ldOworCWxwLT5pbml0X2Jsb2NrLnJ4X3JpbmcgPSAodTMyKSB2aXJ0X3RvX2xlMzJkZXNjKCZyeF9yaW5nWzBdKTsKKwlscC0+aW5pdF9ibG9jay50eF9yaW5nID0gKHUzMikgdmlydF90b19sZTMyZGVzYygmdHhfcmluZ1swXSk7CisJcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVTRVQgLSBSZXNldCBhZGFwdGVyCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCBwY25ldDMyX3Jlc2V0KHN0cnVjdCBuaWMgKm5pYykKK3sKKwkvKiBwdXQgdGhlIGNhcmQgaW4gaXRzIGluaXRpYWwgc3RhdGUgKi8KKwl1MTYgdmFsOworCWludCBpOworCisJLyogUmVzZXQgdGhlIFBDTkVUMzIgKi8KKwlscC0+YS5yZXNldChpb2FkZHIpOworCisJLyogc3dpdGNoIHBjbmV0MzIgdG8gMzJiaXQgbW9kZSAqLworCWxwLT5hLndyaXRlX2Jjcihpb2FkZHIsIDIwLCAyKTsKKworCS8qIHNldC9yZXNldCBhdXRvc2VsZWN0IGJpdCAqLworCXZhbCA9IGxwLT5hLnJlYWRfYmNyKGlvYWRkciwgMikgJiB+MjsKKwlpZiAobHAtPm9wdGlvbnMgJiBQQ05FVDMyX1BPUlRfQVNFTCkKKwkJdmFsIHw9IDI7CisJbHAtPmEud3JpdGVfYmNyKGlvYWRkciwgMiwgdmFsKTsKKwkvKiBoYW5kbGUgZnVsbCBkdXBsZXggc2V0dGluZyAqLworCWlmIChscC0+ZnVsbF9kdXBsZXgpIHsKKwkJdmFsID0gbHAtPmEucmVhZF9iY3IoaW9hZGRyLCA5KSAmIH4zOworCQlpZiAobHAtPm9wdGlvbnMgJiBQQ05FVDMyX1BPUlRfRkQpIHsKKwkJCXZhbCB8PSAxOworCQkJaWYgKGxwLT5vcHRpb25zID09CisJCQkgICAgKFBDTkVUMzJfUE9SVF9GRCB8IFBDTkVUMzJfUE9SVF9BVUkpKQorCQkJCXZhbCB8PSAyOworCQl9IGVsc2UgaWYgKGxwLT5vcHRpb25zICYgUENORVQzMl9QT1JUX0FTRUwpIHsKKwkJCS8qIHdvcmthcm91bmQgb2YgeFNlcmllczI1MCwgdHVybiBvbiBmb3IgNzlDOTc1IG9ubHkgKi8KKwkJCWkgPSAoKGxwLT5hLgorCQkJICAgICAgcmVhZF9jc3IoaW9hZGRyLAorCQkJCSAgICAgICA4OCkgfCAobHAtPmEucmVhZF9jc3IoaW9hZGRyLAorCQkJCQkJCSAgICAgODkpIDw8IDE2KSkgPj4KKwkJCSAgICAgMTIpICYgMHhmZmZmOworCQkJaWYgKGkgPT0gMHgyNjI3KQorCQkJCXZhbCB8PSAzOworCQl9CisJCWxwLT5hLndyaXRlX2Jjcihpb2FkZHIsIDksIHZhbCk7CisJfQorCisJLyogc2V0L3Jlc2V0IEdQU0kgYml0IGluIHRlc3QgcmVnaXN0ZXIgKi8KKwl2YWwgPSBscC0+YS5yZWFkX2Nzcihpb2FkZHIsIDEyNCkgJiB+MHgxMDsKKwlpZiAoKGxwLT5vcHRpb25zICYgUENORVQzMl9QT1JUX1BPUlRTRUwpID09IFBDTkVUMzJfUE9SVF9HUFNJKQorCQl2YWwgfD0gMHgxMDsKKwlscC0+YS53cml0ZV9jc3IoaW9hZGRyLCAxMjQsIHZhbCk7CisKKwlpZiAobHAtPm1paSAmJiAhKGxwLT5vcHRpb25zICYgUENORVQzMl9QT1JUX0FTRUwpKSB7CisJCXZhbCA9IGxwLT5hLnJlYWRfYmNyKGlvYWRkciwgMzIpICYgfjB4Mzg7CS8qIGRpc2FibGUgQXV0byBOZWdvdGlhdGlvbiwgc2V0IDEwTXBicywgSEQgKi8KKwkJaWYgKGxwLT5vcHRpb25zICYgUENORVQzMl9QT1JUX0ZEKQorCQkJdmFsIHw9IDB4MTA7CisJCWlmIChscC0+b3B0aW9ucyAmIFBDTkVUMzJfUE9SVF8xMDApCisJCQl2YWwgfD0gMHgwODsKKwkJbHAtPmEud3JpdGVfYmNyKGlvYWRkciwgMzIsIHZhbCk7CisJfSBlbHNlIHsKKwkJaWYgKGxwLT5vcHRpb25zICYgUENORVQzMl9QT1JUX0FTRUwpIHsJLyogZW5hYmxlIGF1dG8gbmVnb3RpYXRlLCBzZXR1cCwgZGlzYWJsZSBmZCAqLworCQkJdmFsID0gbHAtPmEucmVhZF9iY3IoaW9hZGRyLCAzMikgJiB+MHg5ODsKKwkJCXZhbCB8PSAweDIwOworCQkJbHAtPmEud3JpdGVfYmNyKGlvYWRkciwgMzIsIHZhbCk7CisJCX0KKwl9CisKKyNpZmRlZiBET19EWFNVRkxPCisJaWYgKGxwLT5keHN1ZmxvKSB7CS8qIERpc2FibGUgdHJhbnNtaXQgc3RvcCBvbiB1bmRlcmZsb3cgKi8KKwkJdmFsID0gbHAtPmEucmVhZF9jc3IoaW9hZGRyLCAzKTsKKwkJdmFsIHw9IDB4NDA7CisJCWxwLT5hLndyaXRlX2Nzcihpb2FkZHIsIDMsIHZhbCk7CisJfQorI2VuZGlmCisKKwlpZiAobHAtPmx0aW50KSB7CS8qIEVuYWJsZSBUeERvbmUtaW50ciBpbmhpYml0b3IgKi8KKwkJdmFsID0gbHAtPmEucmVhZF9jc3IoaW9hZGRyLCA1KTsKKwkJdmFsIHw9ICgxIDw8IDE0KTsKKwkJbHAtPmEud3JpdGVfY3NyKGlvYWRkciwgNSwgdmFsKTsKKwl9CisJbHAtPmluaXRfYmxvY2subW9kZSA9CisJICAgIGxlMTZfdG9fY3B1KChscC0+b3B0aW9ucyAmIFBDTkVUMzJfUE9SVF9QT1JUU0VMKSA8PCA3KTsKKwlscC0+aW5pdF9ibG9jay5maWx0ZXJbMF0gPSAweGZmZmZmZmZmOworCWxwLT5pbml0X2Jsb2NrLmZpbHRlclsxXSA9IDB4ZmZmZmZmZmY7CisKKwlwY25ldDMyX2luaXRfcmluZyhuaWMpOworCisKKwkvKiBSZS1pbml0aWFsaXplIHRoZSBQQ05FVDMyLCBhbmQgc3RhcnQgaXQgd2hlbiBkb25lLiAqLworCWxwLT5hLndyaXRlX2Nzcihpb2FkZHIsIDEsCisJCQkodmlydF90b19idXMoJmxwLT5pbml0X2Jsb2NrKSkgJiAweGZmZmYpOworCWxwLT5hLndyaXRlX2Nzcihpb2FkZHIsIDIsICh2aXJ0X3RvX2J1cygmbHAtPmluaXRfYmxvY2spKSA+PiAxNik7CisJbHAtPmEud3JpdGVfY3NyKGlvYWRkciwgNCwgMHgwOTE1KTsKKwlscC0+YS53cml0ZV9jc3IoaW9hZGRyLCAwLCAweDAwMDEpOworCisKKwlpID0gMDsKKwl3aGlsZSAoaSsrIDwgMTAwKQorCQlpZiAobHAtPmEucmVhZF9jc3IoaW9hZGRyLCAwKSAmIDB4MDEwMCkKKwkJCWJyZWFrOworCS8qIAorCSAqIFdlIHVzZWQgdG8gY2xlYXIgdGhlIEluaXREb25lIGJpdCwgMHgwMTAwLCBoZXJlIGJ1dCBNYXJrIFN0b2NrdG9uCisJICogcmVwb3J0cyB0aGF0IGRvaW5nIHNvIHRyaWdnZXJzIGEgYnVnIGluIHRoZSAnOTc0LgorCSAqLworCWxwLT5hLndyaXRlX2Nzcihpb2FkZHIsIDAsIDB4MDA0Mik7CisKKwlkcHJpbnRmKCgicGNuZXQzMiBvcGVuLCBjc3IwICVoWC5cbiIsIGxwLT5hLnJlYWRfY3NyKGlvYWRkciwgMCkpKTsKKworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1BPTEwgLSBXYWl0IGZvciBhIGZyYW1lCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50IHBjbmV0MzJfcG9sbChzdHJ1Y3QgbmljICpuaWMgX191bnVzZWQsIGludCByZXRyaWV2ZSkKK3sKKwkvKiByZXR1cm4gdHJ1ZSBpZiB0aGVyZSdzIGFuIGV0aGVybmV0IHBhY2tldCByZWFkeSB0byByZWFkICovCisJLyogbmljLT5wYWNrZXQgc2hvdWxkIGNvbnRhaW4gZGF0YSBvbiByZXR1cm4gKi8KKwkvKiBuaWMtPnBhY2tldGxlbiBzaG91bGQgY29udGFpbiBsZW5ndGggb2YgZGF0YSAqLworCisJaW50IHN0YXR1czsKKwlpbnQgZW50cnk7CisKKwllbnRyeSA9IGxwLT5jdXJfcnggJiBSWF9SSU5HX01PRF9NQVNLOworCXN0YXR1cyA9ICgoc2hvcnQpIGxlMTZfdG9fY3B1KHJ4X3JpbmdbZW50cnldLnN0YXR1cykgPj4gOCk7CisKKwlpZiAoc3RhdHVzIDwgMCkKKwkJcmV0dXJuIDA7CisKKwlpZiAoICEgcmV0cmlldmUgKSByZXR1cm4gMTsKKworCWlmIChzdGF0dXMgPT0gMHgwMykgeworCQluaWMtPnBhY2tldGxlbiA9CisJCSAgICAobGUzMl90b19jcHUocnhfcmluZ1tlbnRyeV0ubXNnX2xlbmd0aCkgJiAweGZmZikgLSA0OworCQltZW1jcHkobmljLT5wYWNrZXQsICZyeGJbZW50cnldLCBuaWMtPnBhY2tldGxlbik7CisKKwkJLyogQW5kcmV3IEJveWQgb2YgUU5YIHJlcG9ydHMgdGhhdCBzb21lIHJldnMgb2YgdGhlIDc5Qzc2NQorCQkgKiBjbGVhciB0aGUgYnVmZmVyIGxlbmd0aCAqLworCQlyeF9yaW5nW2VudHJ5XS5idWZfbGVuZ3RoID0gbGUxNl90b19jcHUoLVBLVF9CVUZfU1opOworCQlyeF9yaW5nW2VudHJ5XS5zdGF0dXMgfD0gbGUxNl90b19jcHUoMHg4MDAwKTsJLyogcHJpbWUgZm9yIG5leHQgcmVjZWl2ZSAqLworCQkvKiBTd2l0Y2ggdG8gdGhlIG5leHQgUnggcmluZyBidWZmZXIgKi8KKwkJbHAtPmN1cl9yeCsrOworCisJfSBlbHNlIHsKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIDE7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorVFJBTlNNSVQgLSBUcmFuc21pdCBhIGZyYW1lCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCBwY25ldDMyX3RyYW5zbWl0KHN0cnVjdCBuaWMgKm5pYyBfX3VudXNlZCwgY29uc3QgY2hhciAqZCwJLyogRGVzdGluYXRpb24gKi8KKwkJCSAgICAgdW5zaWduZWQgaW50IHQsCS8qIFR5cGUgKi8KKwkJCSAgICAgdW5zaWduZWQgaW50IHMsCS8qIHNpemUgKi8KKwkJCSAgICAgY29uc3QgY2hhciAqcCkKK3sJCQkJLyogUGFja2V0ICovCisJLyogc2VuZCB0aGUgcGFja2V0IHRvIGRlc3RpbmF0aW9uICovCisJdW5zaWduZWQgbG9uZyB0aW1lOworCXU4ICpwdHhiOworCXUxNiBuc3R5cGU7CisJdTE2IHN0YXR1czsKKwlpbnQgZW50cnkgPSAwOwkJLypscC0+Y3VyX3R4ICYgVFhfUklOR19NT0RfTUFTSzsgKi8KKworCXN0YXR1cyA9IDB4ODMwMDsKKwkvKiBwb2ludCB0byB0aGUgY3VycmVudCB0eGIgaW5jYXNlIG11bHRpcGxlIHR4X3JpbmdzIGFyZSB1c2VkICovCisJcHR4YiA9IHR4YiArIChscC0+Y3VyX3R4ICogUEtUX0JVRl9TWik7CisKKwkvKiBjb3B5IHRoZSBwYWNrZXQgdG8gcmluZyBidWZmZXIgKi8KKwltZW1jcHkocHR4YiwgZCwgRVRIX0FMRU4pOwkvKiBkc3QgKi8KKwltZW1jcHkocHR4YiArIEVUSF9BTEVOLCBuaWMtPm5vZGVfYWRkciwgRVRIX0FMRU4pOwkvKiBzcmMgKi8KKwluc3R5cGUgPSBodG9ucygodTE2KSB0KTsJLyogdHlwZSAqLworCW1lbWNweShwdHhiICsgMiAqIEVUSF9BTEVOLCAodTggKikgJiBuc3R5cGUsIDIpOwkvKiB0eXBlICovCisJbWVtY3B5KHB0eGIgKyBFVEhfSExFTiwgcCwgcyk7CisKKwlzICs9IEVUSF9ITEVOOworCXdoaWxlIChzIDwgRVRIX1pMRU4pCS8qIHBhZCB0byBtaW4gbGVuZ3RoICovCisJCXB0eGJbcysrXSA9ICdcMCc7CisKKwl0eF9yaW5nW2VudHJ5XS5sZW5ndGggPSBsZTE2X3RvX2NwdSgtcyk7CisJdHhfcmluZ1tlbnRyeV0ubWlzYyA9IDB4MDAwMDAwMDA7CisJdHhfcmluZ1tlbnRyeV0uYmFzZSA9ICh1MzIpIHZpcnRfdG9fbGUzMmRlc2MocHR4Yik7CisKKwkvKiB3ZSBzZXQgdGhlIHRvcCBieXRlIGFzIHRoZSB2ZXJ5IGxhc3QgdGhpbmcgKi8KKwl0eF9yaW5nW2VudHJ5XS5zdGF0dXMgPSBsZTE2X3RvX2NwdShzdGF0dXMpOworCisKKwkvKiBUcmlnZ2VyIGFuIGltbWVkaWF0ZSBzZW5kIHBvbGwgKi8KKwlscC0+YS53cml0ZV9jc3IoaW9hZGRyLCAwLCAweDAwNDgpOworCisJLyogd2FpdCBmb3IgdHJhbnNtaXQgY29tcGxldGUgKi8KKwlscC0+Y3VyX3R4ID0gMDsJCS8qIChscC0+Y3VyX3R4ICsgMSk7ICovCisJdGltZSA9IGN1cnJ0aWNrcygpICsgVElDS1NfUEVSX1NFQzsJLyogd2FpdCBvbmUgc2Vjb25kICovCisJd2hpbGUgKGN1cnJ0aWNrcygpIDwgdGltZSAmJgorCSAgICAgICAoKHNob3J0KSBsZTE2X3RvX2NwdSh0eF9yaW5nW2VudHJ5XS5zdGF0dXMpIDwgMCkpOworCisJaWYgKChzaG9ydCkgbGUxNl90b19jcHUodHhfcmluZ1tlbnRyeV0uc3RhdHVzKSA8IDApCisJCXByaW50ZigiUENORVQzMiB0aW1lZCBvdXQgb24gdHJhbnNtaXRcbiIpOworCisJLyogU3RvcCBwb2ludGluZyBhdCB0aGUgY3VycmVudCB0eGIKKwkgKiBvdGhlcndpc2UgdGhlIGNhcmQgY29udGludWVzIHRvIHNlbmQgdGhlIHBhY2tldCAqLworCXR4X3JpbmdbZW50cnldLmJhc2UgPSAwOworCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorRElTQUJMRSAtIFR1cm4gb2ZmIGV0aGVybmV0IGludGVyZmFjZQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgcGNuZXQzMl9kaXNhYmxlKHN0cnVjdCBkZXYgKmRldiBfX3VudXNlZCkKK3sKKwkvKiBTdG9wIHRoZSBQQ05FVDMyIGhlcmUgLS0gaXQgb2Nhc3Npb25hbGx5IHBvbGxzIG1lbW9yeSBpZiB3ZSBkb24ndCAqLworCWxwLT5hLndyaXRlX2Nzcihpb2FkZHIsIDAsIDB4MDAwNCk7CisKKwkvKgorCSAqIFN3aXRjaCBiYWNrIHRvIDE2LWJpdCBtb2RlIHRvIGF2b2lkIHByb2JsZXNtIHdpdGggZHVtYiAKKwkgKiBET1MgcGFja2V0IGRyaXZlciBhZnRlciBhIHdhcm0gcmVib290CisJICovCisJbHAtPmEud3JpdGVfYmNyKGlvYWRkciwgMjAsIDQpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK0lSUSAtIEVuYWJsZSwgRGlzYWJsZSwgb3IgRm9yY2UgaW50ZXJydXB0cworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgcGNuZXQzMl9pcnEoc3RydWN0IG5pYyAqbmljIF9fdW51c2VkLCBpcnFfYWN0aW9uX3QgYWN0aW9uIF9fdW51c2VkKQoreworICBzd2l0Y2ggKCBhY3Rpb24gKSB7CisgIGNhc2UgRElTQUJMRSA6CisgICAgYnJlYWs7CisgIGNhc2UgRU5BQkxFIDoKKyAgICBicmVhazsKKyAgY2FzZSBGT1JDRSA6CisgICAgYnJlYWs7CisgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitQUk9CRSAtIExvb2sgZm9yIGFuIGFkYXB0ZXIsIHRoaXMgcm91dGluZSdzIHZpc2libGUgdG8gdGhlIG91dHNpZGUKK1lvdSBzaG91bGQgb21pdCB0aGUgbGFzdCBhcmd1bWVudCBzdHJ1Y3QgcGNpX2RldmljZSAqIGZvciBhIG5vbi1QQ0kgTklDCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50IHBjbmV0MzJfcHJvYmUoc3RydWN0IGRldiAqZGV2LCBzdHJ1Y3QgcGNpX2RldmljZSAqcGNpKQoreworCXN0cnVjdCBuaWMgKm5pYyA9IChzdHJ1Y3QgbmljICopIGRldjsKKwlpbnQgaSwgbWVkaWE7CisJaW50IGZkeCwgbWlpLCBmc2V0LCBkeHN1ZmxvLCBsdGludDsKKwlpbnQgY2hpcF92ZXJzaW9uOworCWNoYXIgKmNoaXBuYW1lOworCXN0cnVjdCBwY25ldDMyX2FjY2VzcyAqYSA9IE5VTEw7CisJdTggcHJvbWFkZHJbNl07CisKKwlpbnQgc2hhcmVkID0gMTsKKwlpZiAocGNpLT5pb2FkZHIgPT0gMCkKKwkJcmV0dXJuIDA7CisKKwkvKiBCQVNFIGlzIHVzZWQgdGhyb3VnaG91dCB0byBhZGRyZXNzIHRoZSBjYXJkICovCisJaW9hZGRyID0gcGNpLT5pb2FkZHI7CisJcHJpbnRmKCJwY25ldDMyLmM6IEZvdW5kICVzLCBWZW5kb3I9MHglaFggRGV2aWNlPTB4JWhYXG4iLAorCSAgICAgICBwY2ktPm5hbWUsIHBjaS0+dmVuZG9yLCBwY2ktPmRldl9pZCk7CisKKwluaWMtPmlycW5vICA9IDA7CisJbmljLT5pb2FkZHIgPSBwY2ktPmlvYWRkciAmIH4zOworCisJLyogcmVzZXQgdGhlIGNoaXAgKi8KKwlwY25ldDMyX3dpb19yZXNldChpb2FkZHIpOworCisJLyogTk9URTogMTYtYml0IGNoZWNrIGlzIGZpcnN0LCBvdGhlcndpc2Ugc29tZSBvbGRlciBQQ25ldCBjaGlwcyBmYWlsICovCisJaWYgKHBjbmV0MzJfd2lvX3JlYWRfY3NyKGlvYWRkciwgMCkgPT0gNAorCSAgICAmJiBwY25ldDMyX3dpb19jaGVjayhpb2FkZHIpKSB7CisJCWEgPSAmcGNuZXQzMl93aW87CisJfSBlbHNlIHsKKwkJcGNuZXQzMl9kd2lvX3Jlc2V0KGlvYWRkcik7CisJCWlmIChwY25ldDMyX2R3aW9fcmVhZF9jc3IoaW9hZGRyLCAwKSA9PSA0CisJCSAgICAmJiBwY25ldDMyX2R3aW9fY2hlY2soaW9hZGRyKSkgeworCQkJYSA9ICZwY25ldDMyX2R3aW87CisJCX0gZWxzZQorCQkJcmV0dXJuIDA7CisJfQorCisJY2hpcF92ZXJzaW9uID0KKwkgICAgYS0+cmVhZF9jc3IoaW9hZGRyLCA4OCkgfCAoYS0+cmVhZF9jc3IoaW9hZGRyLCA4OSkgPDwgMTYpOworCisJZHByaW50ZigoIlBDbmV0IGNoaXAgdmVyc2lvbiBpcyAlMHhoWFxuIiwgY2hpcF92ZXJzaW9uKSk7CisJaWYgKChjaGlwX3ZlcnNpb24gJiAweGZmZikgIT0gMHgwMDMpCisJCXJldHVybiAwOworCisJLyogaW5pdGlhbGl6ZSB2YXJpYWJsZXMgKi8KKwlmZHggPSBtaWkgPSBmc2V0ID0gZHhzdWZsbyA9IGx0aW50ID0gMDsKKwljaGlwX3ZlcnNpb24gPSAoY2hpcF92ZXJzaW9uID4+IDEyKSAmIDB4ZmZmZjsKKworCXN3aXRjaCAoY2hpcF92ZXJzaW9uKSB7CisJY2FzZSAweDI0MjA6CisJCWNoaXBuYW1lID0gIlBDbmV0L1BDSSA3OUM5NzAiOwkvKiBQQ0kgKi8KKwkJYnJlYWs7CisJY2FzZSAweDI0MzA6CisJCWlmIChzaGFyZWQpCisJCQljaGlwbmFtZSA9ICJQQ25ldC9QQ0kgNzlDOTcwIjsJLyogOTcwIGdpdmVzIHRoZSB3cm9uZyBjaGlwIGlkIGJhY2sgKi8KKwkJZWxzZQorCQkJY2hpcG5hbWUgPSAiUENuZXQvMzIgNzlDOTY1IjsJLyogNDg2L1ZMIGJ1cyAqLworCQlicmVhazsKKwljYXNlIDB4MjYyMToKKwkJY2hpcG5hbWUgPSAiUENuZXQvUENJIElJIDc5Qzk3MEEiOwkvKiBQQ0kgKi8KKwkJZmR4ID0gMTsKKwkJYnJlYWs7CisJY2FzZSAweDI2MjM6CisJCWNoaXBuYW1lID0gIlBDbmV0L0ZBU1QgNzlDOTcxIjsJLyogUENJICovCisJCWZkeCA9IDE7CisJCW1paSA9IDE7CisJCWZzZXQgPSAxOworCQlsdGludCA9IDE7CisJCWJyZWFrOworCWNhc2UgMHgyNjI0OgorCQljaGlwbmFtZSA9ICJQQ25ldC9GQVNUKyA3OUM5NzIiOwkvKiBQQ0kgKi8KKwkJZmR4ID0gMTsKKwkJbWlpID0gMTsKKwkJZnNldCA9IDE7CisJCWJyZWFrOworCWNhc2UgMHgyNjI1OgorCQljaGlwbmFtZSA9ICJQQ25ldC9GQVNUIElJSSA3OUM5NzMiOwkvKiBQQ0kgKi8KKwkJZmR4ID0gMTsKKwkJbWlpID0gMTsKKwkJYnJlYWs7CisJY2FzZSAweDI2MjY6CisJCWNoaXBuYW1lID0gIlBDbmV0L0hvbWUgNzlDOTc4IjsJLyogUENJICovCisJCWZkeCA9IDE7CisJCS8qIAorCQkgKiBUaGlzIGlzIGJhc2VkIG9uIHNwZWNzIHB1Ymxpc2hlZCBhdCB3d3cuYW1kLmNvbS4gIFRoaXMgc2VjdGlvbgorCQkgKiBhc3N1bWVzIHRoYXQgYSBjYXJkIHdpdGggYSA3OUM5Nzggd2FudHMgdG8gZ28gaW50byAxTWIgSG9tZVBOQQorCQkgKiBtb2RlLiAgVGhlIDc5Qzk3OCBjYW4gYWxzbyBnbyBpbnRvIHN0YW5kYXJkIGV0aGVybmV0LCBhbmQgdGhlcmUKKwkJICogcHJvYmFibHkgc2hvdWxkIGJlIHNvbWUgc29ydCBvZiBtb2R1bGUgb3B0aW9uIHRvIHNlbGVjdCB0aGUKKwkJICogbW9kZSBieSB3aGljaCB0aGUgY2FyZCBzaG91bGQgb3BlcmF0ZQorCQkgKi8KKwkJLyogc3dpdGNoIHRvIGhvbWUgd2lyaW5nIG1vZGUgKi8KKwkJbWVkaWEgPSBhLT5yZWFkX2Jjcihpb2FkZHIsIDQ5KTsKKworCQlwcmludGYoIm1lZGlhIHJlc2V0IHRvICUjeC5cbiIsIG1lZGlhKTsKKwkJYS0+d3JpdGVfYmNyKGlvYWRkciwgNDksIG1lZGlhKTsKKwkJYnJlYWs7CisJY2FzZSAweDI2Mjc6CisJCWNoaXBuYW1lID0gIlBDbmV0L0ZBU1QgSUlJIDc5Qzk3NSI7CS8qIFBDSSAqLworCQlmZHggPSAxOworCQltaWkgPSAxOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlwcmludGYoIlBDbmV0IHZlcnNpb24gJSN4LCBubyBQQ25ldDMyIGNoaXAuXG4iLAorCQkgICAgICAgY2hpcF92ZXJzaW9uKTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyoKKwkgKiAgT24gc2VsZWN0ZWQgY2hpcHMgdHVybiBvbiB0aGUgQkNSMTg6Tk9VRkxPIGJpdC4gVGhpcyBzdG9wcyB0cmFuc21pdAorCSAqICBzdGFydGluZyB1bnRpbCB0aGUgcGFja2V0IGlzIGxvYWRlZC4gU3RyaWtlIG9uZSBmb3IgcmVsaWFiaWxpdHksIGxvc2UKKwkgKiAgb25lIGZvciBsYXRlbmN5IC0gYWx0aG91Z2ggb24gUENJIHRoaXMgaXNudCBhIGJpZyBsb3NzLiBPbGRlciBjaGlwcyAKKwkgKiAgaGF2ZSBGSUZPJ3Mgc21hbGxlciB0aGFuIGEgcGFja2V0LCBzbyB5b3UgY2FuJ3QgZG8gdGhpcy4KKwkgKi8KKworCWlmIChmc2V0KSB7CisJCWEtPndyaXRlX2Jjcihpb2FkZHIsIDE4LAorCQkJICAgICAoYS0+cmVhZF9iY3IoaW9hZGRyLCAxOCkgfCAweDA4MDApKTsKKwkJYS0+d3JpdGVfY3NyKGlvYWRkciwgODAsCisJCQkgICAgIChhLT5yZWFkX2Nzcihpb2FkZHIsIDgwKSAmIDB4MEMwMCkgfCAweDBjMDApOworCQlkeHN1ZmxvID0gMTsKKwkJbHRpbnQgPSAxOworCX0KKworCWRwcmludGYoKCIlcyBhdCAlaFgsIiwgY2hpcG5hbWUsIGlvYWRkcikpOworCisJLyogcmVhZCBQUk9NIGFkZHJlc3MgKi8KKwlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQorCQlwcm9tYWRkcltpXSA9IGluYihpb2FkZHIgKyBpKTsKKworCS8qIFVwZGF0ZSB0aGUgbmljIHN0cnVjdHVyZSB3aXRoIHRoZSBNQUMgQWRkcmVzcyAqLworCWZvciAoaSA9IDA7IGkgPCBFVEhfQUxFTjsgaSsrKSB7CisJCW5pYy0+bm9kZV9hZGRyW2ldID0gcHJvbWFkZHJbaV07CisJfQorCS8qIFByaW50IG91dCBzb21lIGhhcmR3YXJlIGluZm8gKi8KKwlwcmludGYoIiVzOiAlISBhdCBpb2FkZHIgJWhYLCAiLCBwY2ktPm5hbWUsIG5pYy0+bm9kZV9hZGRyLAorCSAgICAgICBpb2FkZHIpOworCisJLyogU2V0IHRvIHBjaSBidXMgbWFzdGVyICovCisJYWRqdXN0X3BjaV9kZXZpY2UocGNpKTsKKworCS8qIHBvaW50IHRvIHByaXZhdGUgc3RvcmFnZSAqLworCWxwID0gJmxweDsKKworI2lmIEVCREVCVUcKKwlpZiAoKChjaGlwX3ZlcnNpb24gKyAxKSAmIDB4ZmZmZSkgPT0gMHgyNjI0KSB7CS8qIFZlcnNpb24gMHgyNjIzIG9yIDB4MjYyNCAqLworCQlpID0gYS0+cmVhZF9jc3IoaW9hZGRyLCA4MCkgJiAweDBDMDA7CS8qIENoZWNrIHR4X3N0YXJ0X3B0ICovCisJCWRwcmludGYoKCIgICAgdHhfc3RhcnRfcHQoMHglaFgpOiIsIGkpKTsKKwkJc3dpdGNoIChpID4+IDEwKSB7CisJCWNhc2UgMDoKKwkJCWRwcmludGYoKCIgIDIwIGJ5dGVzLCIpKTsKKwkJCWJyZWFrOworCQljYXNlIDE6CisJCQlkcHJpbnRmKCgiICA2NCBieXRlcywiKSk7CisJCQlicmVhazsKKwkJY2FzZSAyOgorCQkJZHByaW50ZigoIiAxMjggYnl0ZXMsIikpOworCQkJYnJlYWs7CisJCWNhc2UgMzoKKwkJCWRwcmludGYoKCJ+MjIwIGJ5dGVzLCIpKTsKKwkJCWJyZWFrOworCQl9CisJCWkgPSBhLT5yZWFkX2Jjcihpb2FkZHIsIDE4KTsJLyogQ2hlY2sgQnVyc3QvQnVzIGNvbnRyb2wgKi8KKwkJZHByaW50ZigoIiBCQ1IxOCglaFgpOiIsIGkgJiAweGZmZmYpKTsKKwkJaWYgKGkgJiAoMSA8PCA1KSkKKwkJCWRwcmludGYoKCJCdXJzdFdyRW4gIikpOworCQlpZiAoaSAmICgxIDw8IDYpKQorCQkJZHByaW50ZigoIkJ1cnN0UmRFbiAiKSk7CisJCWlmIChpICYgKDEgPDwgNykpCisJCQlkcHJpbnRmKCgiRFdvcmRJTyAiKSk7CisJCWlmIChpICYgKDEgPDwgMTEpKQorCQkJZHByaW50ZigoIk5vVUZsb3cgIikpOworCQlpID0gYS0+cmVhZF9iY3IoaW9hZGRyLCAyNSk7CisJCWRwcmludGYoKCIgICAgU1JBTVNJWkU9MHglaFgsIiwgaSA8PCA4KSk7CisJCWkgPSBhLT5yZWFkX2Jjcihpb2FkZHIsIDI2KTsKKwkJZHByaW50ZigoIiBTUkFNX0JORD0weCVoWCwiLCBpIDw8IDgpKTsKKwkJaSA9IGEtPnJlYWRfYmNyKGlvYWRkciwgMjcpOworCQlpZiAoaSAmICgxIDw8IDE0KSkKKwkJCWRwcmludGYoKCJMb3dMYXRSeCIpKTsKKwl9CisjZW5kaWYKKwlscC0+bmFtZSA9IGNoaXBuYW1lOworCWxwLT5zaGFyZWRfaXJxID0gc2hhcmVkOworCWxwLT5mdWxsX2R1cGxleCA9IGZkeDsKKwlscC0+ZHhzdWZsbyA9IGR4c3VmbG87CisJbHAtPmx0aW50ID0gbHRpbnQ7CisJbHAtPm1paSA9IG1paTsKKwkvKiBGSVhNRTogRml4IE9wdGlvbnMgZm9yIG9ubHkgb25lIGNhcmQgKi8KKwlpZiAoKGNhcmRzX2ZvdW5kID49IE1BWF9VTklUUykKKwkgICAgfHwgKCh1bnNpZ25lZCBpbnQpIG9wdGlvbnNbY2FyZHNfZm91bmRdID4gc2l6ZW9mKG9wdGlvbnNfbWFwcGluZykpKQorCQlscC0+b3B0aW9ucyA9IFBDTkVUMzJfUE9SVF9BU0VMOworCWVsc2UKKwkJbHAtPm9wdGlvbnMgPSBvcHRpb25zX21hcHBpbmdbb3B0aW9uc1tjYXJkc19mb3VuZF1dOworCisJaWYgKGZkeCAmJiAhKGxwLT5vcHRpb25zICYgUENORVQzMl9QT1JUX0FTRUwpICYmCisJICAgICgoY2FyZHNfZm91bmQgPj0gTUFYX1VOSVRTKSB8fCBmdWxsX2R1cGxleFtjYXJkc19mb3VuZF0pKQorCQlscC0+b3B0aW9ucyB8PSBQQ05FVDMyX1BPUlRfRkQ7CisKKwlpZiAoIWEpIHsKKwkJcHJpbnRmKCJObyBhY2Nlc3MgbWV0aG9kc1xuIik7CisJCXJldHVybiAwOworCX0KKwlscC0+YSA9ICphOworCisJLyogZGV0ZWN0IHNwZWNpYWwgVDEvRTEgV0FOIGNhcmQgYnkgY2hlY2tpbmcgZm9yIE1BQyBhZGRyZXNzICovCisJaWYgKG5pYy0+bm9kZV9hZGRyWzBdID09IDB4MDAgJiYgbmljLT5ub2RlX2FkZHJbMV0gPT0gMHhlMAorCSAgICAmJiBuaWMtPm5vZGVfYWRkclsyXSA9PSAweDc1KQorCQlscC0+b3B0aW9ucyA9IFBDTkVUMzJfUE9SVF9GRCB8IFBDTkVUMzJfUE9SVF9HUFNJOworCisJbHAtPmluaXRfYmxvY2subW9kZSA9IGxlMTZfdG9fY3B1KDB4MDAwMyk7CS8qIERpc2FibGUgUnggYW5kIFR4LiAqLworCWxwLT5pbml0X2Jsb2NrLnRsZW5fcmxlbiA9CisJICAgIGxlMTZfdG9fY3B1KFRYX1JJTkdfTEVOX0JJVFMgfCBSWF9SSU5HX0xFTl9CSVRTKTsKKwlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQorCQlscC0+aW5pdF9ibG9jay5waHlzX2FkZHJbaV0gPSBuaWMtPm5vZGVfYWRkcltpXTsKKwlscC0+aW5pdF9ibG9jay5maWx0ZXJbMF0gPSAweGZmZmZmZmZmOworCWxwLT5pbml0X2Jsb2NrLmZpbHRlclsxXSA9IDB4ZmZmZmZmZmY7CisJbHAtPmluaXRfYmxvY2sucnhfcmluZyA9IHZpcnRfdG9fYnVzKCZyeF9yaW5nKTsKKwlscC0+aW5pdF9ibG9jay50eF9yaW5nID0gdmlydF90b19idXMoJnR4X3JpbmcpOworCisJLyogc3dpdGNoIHBjbmV0MzIgdG8gMzJiaXQgbW9kZSAqLworCWEtPndyaXRlX2Jjcihpb2FkZHIsIDIwLCAyKTsKKworCisJYS0+d3JpdGVfY3NyKGlvYWRkciwgMSwgKHZpcnRfdG9fYnVzKCZscC0+aW5pdF9ibG9jaykpICYgMHhmZmZmKTsKKwlhLT53cml0ZV9jc3IoaW9hZGRyLCAyLCAodmlydF90b19idXMoJmxwLT5pbml0X2Jsb2NrKSkgPj4gMTYpOworCisJLyogCisJICogVG8gYXV0by1JUlEgd2UgZW5hYmxlIHRoZSBpbml0aWFsaXphdGlvbi1kb25lIGFuZCBETUEgZXJyb3IKKwkgKiBpbnRlcnJ1cHRzLiBGb3IgSVNBIGJvYXJkcyB3ZSBnZXQgYSBETUEgZXJyb3IsIGJ1dCBWTEIgYW5kIFBDSQorCSAqIGJvYXJkcyB3aWxsIHdvcmsuCisJICovCisJLyogVHJpZ2dlciBhbiBpbml0aWFsaXphdGlvbiBqdXN0IGZvciB0aGUgaW50ZXJydXB0LiAqLworCisJYS0+d3JpdGVfY3NyKGlvYWRkciwgMCwgMHg0MSk7CisJbWRlbGF5KDEpOworCisJY2FyZHNfZm91bmQrKzsKKworCS8qIHBvaW50IHRvIE5JQyBzcGVjaWZpYyByb3V0aW5lcyAqLworCXBjbmV0MzJfcmVzZXQobmljKTsKKwlpZiAoMSkgeworCSAgICAgICAgaW50IHRtcDsKKwkJaW50IHBoeSwgcGh5X2lkeCA9IDA7CisJCXUxNiBtaWlfbHBhOworCQlscC0+cGh5c1swXSA9IDE7CS8qIERlZmF1bHQgU2V0dGluZyAqLworCQlmb3IgKHBoeSA9IDE7IHBoeSA8IDMyICYmIHBoeV9pZHggPCBNSUlfQ05UOyBwaHkrKykgeworCQkJaW50IG1paV9zdGF0dXMgPSBtZGlvX3JlYWQobmljLCBwaHksIE1JSV9CTVNSKTsKKwkJCWlmIChtaWlfc3RhdHVzICE9IDB4ZmZmZiAmJiBtaWlfc3RhdHVzICE9IDB4MDAwMCkgeworCQkJCWxwLT5waHlzW3BoeV9pZHgrK10gPSBwaHk7CisJCQkJbHAtPm1paV9pZi5hZHZlcnRpc2luZyA9CisJCQkJICAgIG1kaW9fcmVhZChuaWMsIHBoeSwgTUlJX0FEVkVSVElTRSk7CisJCQkJaWYgKChtaWlfc3RhdHVzICYgMHgwMDQwKSA9PSAwKSB7CisJCQkJICB0bXAgPSBwaHk7CisJCQkJICBkcHJpbnRmICgoIk1JSSBQSFkgZm91bmQgYXQgYWRkcmVzcyAlZCwgc3RhdHVzICIgCisJCQkJCSAgICAiJWhYIGFkdmVydGlzaW5nICVoWFxuIiwgcGh5LCBtaWlfc3RhdHVzLCAKKwkJCQkJICAgIGxwLT5taWlfaWYuYWR2ZXJ0aXNpbmcpKTsKKwkJCQl9CisJCQl9CisJCX0KKwkJaWYgKHBoeV9pZHggPT0gMCkKKwkJCXByaW50ZigiTm8gTUlJIHRyYW5zY2VpdmVyIGZvdW5kIVxuIik7CisJCWxwLT5taWlfaWYucGh5X2lkID0gbHAtPnBoeXNbMF07CisKKwkJbHAtPm1paV9pZi5hZHZlcnRpc2luZyA9CisJCSAgICBtZGlvX3JlYWQobmljLCBscC0+cGh5c1swXSwgTUlJX0FEVkVSVElTRSk7CisKKwkJbWlpX2xwYSA9IG1kaW9fcmVhZChuaWMsIGxwLT5waHlzWzBdLCBNSUlfTFBBKTsKKwkJbHAtPm1paV9pZi5hZHZlcnRpc2luZyAmPSBtaWlfbHBhOworCQlpZiAobHAtPm1paV9pZi5hZHZlcnRpc2luZyAmIEFEVkVSVElTRV8xMDBGVUxMKQorCQkJcHJpbnRmKCIxMDBNYnBzIEZ1bGwtRHVwbGV4XG4iKTsKKwkJZWxzZSBpZiAobHAtPm1paV9pZi5hZHZlcnRpc2luZyAmIEFEVkVSVElTRV8xMDBIQUxGKQorCQkJcHJpbnRmKCIxMDBNYnBzIEhhbGYtRHVwbGV4XG4iKTsKKwkJZWxzZSBpZiAobHAtPm1paV9pZi5hZHZlcnRpc2luZyAmIEFEVkVSVElTRV8xMEZVTEwpCisJCQlwcmludGYoIjEwTWJwcyBGdWxsLUR1cGxleFxuIik7CisJCWVsc2UgaWYgKGxwLT5taWlfaWYuYWR2ZXJ0aXNpbmcgJiBBRFZFUlRJU0VfMTBIQUxGKQorCQkJcHJpbnRmKCIxME1icHMgSGFsZi1EdXBsZXhcbiIpOworCQllbHNlCisJCQlwcmludGYoIlxuIik7CisJfQorCisJbmljLT5wb2xsICAgICA9IHBjbmV0MzJfcG9sbDsKKwluaWMtPnRyYW5zbWl0ID0gcGNuZXQzMl90cmFuc21pdDsKKwlkZXYtPmRpc2FibGUgID0gcGNuZXQzMl9kaXNhYmxlOworCW5pYy0+aXJxICAgICAgPSBwY25ldDMyX2lycTsKKworCXJldHVybiAxOworfQorc3RhdGljIGludCBtZGlvX3JlYWQoc3RydWN0IG5pYyAqbmljIF9fdW51c2VkLCBpbnQgcGh5X2lkLCBpbnQgcmVnX251bSkKK3sKKwl1MTYgdmFsX291dDsKKwlpbnQgcGh5YWRkcjsKKworCWlmICghbHAtPm1paSkKKwkJcmV0dXJuIDA7CisKKwlwaHlhZGRyID0gbHAtPmEucmVhZF9iY3IoaW9hZGRyLCAzMyk7CisKKwlscC0+YS53cml0ZV9iY3IoaW9hZGRyLCAzMywKKwkJCSgocGh5X2lkICYgMHgxZikgPDwgNSkgfCAocmVnX251bSAmIDB4MWYpKTsKKwl2YWxfb3V0ID0gbHAtPmEucmVhZF9iY3IoaW9hZGRyLCAzNCk7CisJbHAtPmEud3JpdGVfYmNyKGlvYWRkciwgMzMsIHBoeWFkZHIpOworCisJcmV0dXJuIHZhbF9vdXQ7Cit9CisKKyNpZiAwCitzdGF0aWMgdm9pZCBtZGlvX3dyaXRlKHN0cnVjdCBuaWMgKm5pYyBfX3VudXNlZCwgaW50IHBoeV9pZCwgaW50IHJlZ19udW0sCisJCSAgICAgICBpbnQgdmFsKQoreworCWludCBwaHlhZGRyOworCisJaWYgKCFscC0+bWlpKQorCQlyZXR1cm47CisKKwlwaHlhZGRyID0gbHAtPmEucmVhZF9iY3IoaW9hZGRyLCAzMyk7CisKKwlscC0+YS53cml0ZV9iY3IoaW9hZGRyLCAzMywKKwkJCSgocGh5X2lkICYgMHgxZikgPDwgNSkgfCAocmVnX251bSAmIDB4MWYpKTsKKwlscC0+YS53cml0ZV9iY3IoaW9hZGRyLCAzNCwgdmFsKTsKKwlscC0+YS53cml0ZV9iY3IoaW9hZGRyLCAzMywgcGh5YWRkcik7Cit9CisjZW5kaWYKKworc3RhdGljIHN0cnVjdCBwY2lfaWQgcGNuZXQzMl9uaWNzW10gPSB7CisJUENJX1JPTSgweDEwMjIsIDB4MjAwMCwgImxhbmNlcGNpIiwgIkFNRCBMYW5jZS9QQ0kiKSwKKwlQQ0lfUk9NKDB4MTAyMiwgMHgyNjI1LCAicGNuZXRmYXN0aWlpIiwgIkFNRCBMYW5jZS9QQ0kgUENOZXQvMzIiKSwKKwlQQ0lfUk9NKDB4MTAyMiwgMHgyMDAxLCAiYW1kaG9tZXBuYSIsICJBTUQgTGFuY2UvSG9tZVBOQSIpLAorfTsKKworc3RydWN0IHBjaV9kcml2ZXIgcGNuZXQzMl9kcml2ZXIgPSB7CisJLnR5cGUgPSBOSUNfRFJJVkVSLAorCS5uYW1lID0gIlBDTkVUMzIvUENJIiwKKwkucHJvYmUgPSBwY25ldDMyX3Byb2JlLAorCS5pZHMgPSBwY25ldDMyX25pY3MsCisJLmlkX2NvdW50ID0gc2l6ZW9mKHBjbmV0MzJfbmljcykgLyBzaXplb2YocGNuZXQzMl9uaWNzWzBdKSwKKwkuY2xhc3MgPSAwLAorfTsKZGlmZiAtTmF1ciBncnViLTAuOTcub3JpZy9uZXRib290L3BpYzgyNTkuYyBncnViLTAuOTcvbmV0Ym9vdC9waWM4MjU5LmMKLS0tIGdydWItMC45Ny5vcmlnL25ldGJvb3QvcGljODI1OS5jCTE5NzAtMDEtMDEgMDA6MDA6MDAuMDAwMDAwMDAwICswMDAwCisrKyBncnViLTAuOTcvbmV0Ym9vdC9waWM4MjU5LmMJMjAwNS0wOC0zMSAxOTowMzozNS4wMDAwMDAwMDAgKzAwMDAKQEAgLTAsMCArMSwyNjcgQEAKKy8qCisgKiBCYXNpYyBzdXBwb3J0IGZvciBjb250cm9sbGluZyB0aGUgODI1OSBQcm9ncmFtbWFibGUgSW50ZXJydXB0IENvbnRyb2xsZXJzLgorICoKKyAqIEluaXRpYWxseSB3cml0dGVuIGJ5IE1pY2hhZWwgQnJvd24gKG1jYjMwKS4KKyAqLworCisjaW5jbHVkZSA8ZXRoZXJib290Lmg+CisjaW5jbHVkZSA8cGljODI1OS5oPgorCisjaWZkZWYgREVCVUdfSVJRCisjZGVmaW5lIERCRyguLi4pIHByaW50ZiAoIF9fVkFfQVJHU19fICkKKyNlbHNlCisjZGVmaW5lIERCRyguLi4pCisjZW5kaWYKKworLyogQ3VycmVudCBsb2NhdGlvbnMgb2YgdHJpdmlhbCBJUlEgaGFuZGxlci4gIFRoZXNlIHdpbGwgY2hhbmdlIGF0CisgKiBydW50aW1lIHdoZW4gcmVsb2NhdGlvbiBpcyB1c2VkOyB0aGUgaGFuZGxlciBuZWVkcyB0byBiZSBjb3BpZWQgdG8KKyAqIGJhc2UgbWVtb3J5IGJlZm9yZSBiZWluZyBpbnN0YWxsZWQuCisgKi8KK3ZvaWQgKCp0cml2aWFsX2lycV9oYW5kbGVyKVAoKHZvaWQpKSA9IF90cml2aWFsX2lycV9oYW5kbGVyOwordWludDE2X3Qgdm9sYXRpbGUgKnRyaXZpYWxfaXJxX3RyaWdnZXJfY291bnQgPSAmX3RyaXZpYWxfaXJxX3RyaWdnZXJfY291bnQ7CitzZWdvZmZfdCAqdHJpdmlhbF9pcnFfY2hhaW5fdG8gPSAmX3RyaXZpYWxfaXJxX2NoYWluX3RvOwordWludDhfdCAqdHJpdmlhbF9pcnFfY2hhaW4gPSAmX3RyaXZpYWxfaXJxX2NoYWluOworaXJxX3QgdHJpdmlhbF9pcnFfaW5zdGFsbGVkX29uID0gSVJRX05PTkU7CisKKy8qIFByZXZpb3VzIHRyaWdnZXIgY291bnQgZm9yIHRyaXZpYWwgSVJRIGhhbmRsZXIgKi8KK3N0YXRpYyB1aW50MTZfdCB0cml2aWFsX2lycV9wcmV2aW91c190cmlnZ2VyX2NvdW50ID0gMDsKKworLyogSW5zdGFsbCBhIGhhbmRsZXIgZm9yIHRoZSBzcGVjaWZpZWQgSVJRLiAgQWRkcmVzcyBvZiBwcmV2aW91cworICogaGFuZGxlciB3aWxsIGJlIHN0b3JlZCBpbiBwcmV2aW91c19oYW5kbGVyLiAgRW5hYmxlZC9kaXNhYmxlZCBzdGF0ZQorICogb2YgSVJRIHdpbGwgYmUgcHJlc2VydmVkIGFjcm9zcyBjYWxsLCB0aGVyZWZvcmUgaWYgdGhlIGhhbmRsZXIgZG9lcworICogY2hhaW5pbmcsIGVuc3VyZSB0aGF0IGVpdGhlciAoYSkgSVJRIGlzIGRpc2FibGVkIGJlZm9yZSBjYWxsLCBvcgorICogKGIpIHByZXZpb3VzX2hhbmRsZXIgcG9pbnRzIGRpcmVjdGx5IHRvIHRoZSBwbGFjZSB0aGF0IHRoZSBoYW5kbGVyCisgKiBwaWNrcyB1cCBpdHMgY2hhaW4tdG8gYWRkcmVzcy4KKyAqLworCitpbnQgaW5zdGFsbF9pcnFfaGFuZGxlciAoIGlycV90IGlycSwgc2Vnb2ZmX3QgKmhhbmRsZXIsCisJCQkgIHVpbnQ4X3QgKnByZXZpb3VzbHlfZW5hYmxlZCwKKwkJCSAgc2Vnb2ZmX3QgKnByZXZpb3VzX2hhbmRsZXIgKSB7CisJc2Vnb2ZmX3QgKmlycV92ZWN0b3IgPSBJUlFfVkVDVE9SICggaXJxICk7CisJKnByZXZpb3VzbHlfZW5hYmxlZCA9IGlycV9lbmFibGVkICggaXJxICk7CisKKwlpZiAoIGlycSA+IElSUV9NQVggKSB7CisJCURCRyAoICJJbnZhbGlkIElSUSBudW1iZXIgJWRcbiIgKTsKKwkJcmV0dXJuIDA7CisJfQorCisJcHJldmlvdXNfaGFuZGxlci0+c2VnbWVudCA9IGlycV92ZWN0b3ItPnNlZ21lbnQ7CisJcHJldmlvdXNfaGFuZGxlci0+b2Zmc2V0ID0gaXJxX3ZlY3Rvci0+b2Zmc2V0OworCWlmICggKnByZXZpb3VzbHlfZW5hYmxlZCApIGRpc2FibGVfaXJxICggaXJxICk7CisJREJHICggIkluc3RhbGxpbmcgaGFuZGxlciBhdCAlaHg6JWh4IGZvciBJUlEgJWQsIGxlYXZpbmcgJXNcbiIsCisJCSAgaGFuZGxlci0+c2VnbWVudCwgaGFuZGxlci0+b2Zmc2V0LCBpcnEsCisJCSAgKCAqcHJldmlvdXNseV9lbmFibGVkID8gImVuYWJsZWQiIDogImRpc2FibGVkIiApICk7CisJREJHICggIi4uLihwcmV2aW91cyBoYW5kbGVyIGF0ICVoeDolaHgpXG4iLAorCQkgIHByZXZpb3VzX2hhbmRsZXItPnNlZ21lbnQsIHByZXZpb3VzX2hhbmRsZXItPm9mZnNldCApOworCWlycV92ZWN0b3ItPnNlZ21lbnQgPSBoYW5kbGVyLT5zZWdtZW50OworCWlycV92ZWN0b3ItPm9mZnNldCA9IGhhbmRsZXItPm9mZnNldDsKKwlpZiAoICpwcmV2aW91c2x5X2VuYWJsZWQgKSBlbmFibGVfaXJxICggaXJxICk7CisJcmV0dXJuIDE7Cit9CisKKy8qIFJlbW92ZSBoYW5kbGVyIGZvciB0aGUgc3BlY2lmaWVkIElSUS4gIFJvdXRpbmUgY2hlY2tzIHRoYXQgYW5vdGhlcgorICogaGFuZGxlciBoYXMgbm90IGJlZW4gaW5zdGFsbGVkIHRoYXQgY2hhaW5zIHRvIGhhbmRsZXIgYmVmb3JlCisgKiB1bmluc3RhbGxpbmcgaGFuZGxlci4gIEVuYWJsZWQvZGlzYWJsZWQgc3RhdGUgb2YgdGhlIElSUSB3aWxsIGJlCisgKiByZXN0b3JlZCB0byB0aGF0IHNwZWNpZmllZCBieSBwcmV2aW91c2x5X2VuYWJsZWQuCisgKi8KKworaW50IHJlbW92ZV9pcnFfaGFuZGxlciAoIGlycV90IGlycSwgc2Vnb2ZmX3QgKmhhbmRsZXIsCisJCQkgdWludDhfdCAqcHJldmlvdXNseV9lbmFibGVkLAorCQkJIHNlZ29mZl90ICpwcmV2aW91c19oYW5kbGVyICkgeworCXNlZ29mZl90ICppcnFfdmVjdG9yID0gSVJRX1ZFQ1RPUiAoIGlycSApOworCisJaWYgKCBpcnEgPiBJUlFfTUFYICkgeworCQlEQkcgKCAiSW52YWxpZCBJUlEgbnVtYmVyICVkXG4iICk7CisJCXJldHVybiAwOworCX0KKwlpZiAoICggaXJxX3ZlY3Rvci0+c2VnbWVudCAhPSBoYW5kbGVyLT5zZWdtZW50ICkgfHwKKwkgICAgICggaXJxX3ZlY3Rvci0+b2Zmc2V0ICE9IGhhbmRsZXItPm9mZnNldCApICkgeworCQlEQkcgKCAiQ2Fubm90IHJlbW92ZSBoYW5kbGVyIGZvciBJUlEgJWRcbiIgKTsKKwkJcmV0dXJuIDA7CisJfQorCisJREJHICggIlJlbW92aW5nIGhhbmRsZXIgZm9yIElSUSAlZFxuIiwgaXJxICk7CisJZGlzYWJsZV9pcnEgKCBpcnEgKTsKKwlpcnFfdmVjdG9yLT5zZWdtZW50ID0gcHJldmlvdXNfaGFuZGxlci0+c2VnbWVudDsKKwlpcnFfdmVjdG9yLT5vZmZzZXQgPSBwcmV2aW91c19oYW5kbGVyLT5vZmZzZXQ7CisJaWYgKCAqcHJldmlvdXNseV9lbmFibGVkICkgZW5hYmxlX2lycSAoIGlycSApOworCXJldHVybiAxOworfQorCisvKiBJbnN0YWxsIHRoZSB0cml2aWFsIElSUSBoYW5kbGVyLiAgVGhpcyByb3V0aW5lIGluc3RhbGxzIHRoZQorICogaGFuZGxlciwgdGVzdHMgaXQgYW5kIGVuYWJsZXMgdGhlIElSUS4KKyAqLworCitpbnQgaW5zdGFsbF90cml2aWFsX2lycV9oYW5kbGVyICggaXJxX3QgaXJxICkgeworCXNlZ29mZl90IHRyaXZpYWxfaXJxX2hhbmRsZXJfc2Vnb2ZmID0gU0VHT0ZGKHRyaXZpYWxfaXJxX2hhbmRsZXIpOworCQorCWlmICggdHJpdmlhbF9pcnFfaW5zdGFsbGVkX29uICE9IElSUV9OT05FICkgeworCQlEQkcgKCAiQ2FuIGluc3RhbGwgdHJpdmlhbCBJUlEgaGFuZGxlciBvbmx5IG9uY2VcbiIgKTsKKwkJcmV0dXJuIDA7CisJfQorCWlmICggU0VHTUVOVCh0cml2aWFsX2lycV9oYW5kbGVyKSA+IDB4ZmZmZiApIHsKKwkJREJHICggIlRyaXZpYWwgSVJRIGhhbmRsZXIgbm90IGluIGJhc2UgbWVtb3J5XG4iICk7CisJCXJldHVybiAwOworCX0KKworCURCRyAoICJJbnN0YWxsaW5nIHRyaXZpYWwgSVJRIGhhbmRsZXIgb24gSVJRICVkXG4iLCBpcnEgKTsKKwlpZiAoICEgaW5zdGFsbF9pcnFfaGFuZGxlciAoIGlycSwgJnRyaXZpYWxfaXJxX2hhbmRsZXJfc2Vnb2ZmLAorCQkJCSAgICAgdHJpdmlhbF9pcnFfY2hhaW4sCisJCQkJICAgICB0cml2aWFsX2lycV9jaGFpbl90byApICkKKwkJcmV0dXJuIDA7CisJdHJpdmlhbF9pcnFfaW5zdGFsbGVkX29uID0gaXJxOworCisJREJHICggIlRlc3RpbmcgdHJpdmlhbCBJUlEgaGFuZGxlclxuIiApOworCWRpc2FibGVfaXJxICggaXJxICk7CisJKnRyaXZpYWxfaXJxX3RyaWdnZXJfY291bnQgPSAwOworCXRyaXZpYWxfaXJxX3ByZXZpb3VzX3RyaWdnZXJfY291bnQgPSAwOworCWZha2VfaXJxICggaXJxICk7CisJaWYgKCAhIHRyaXZpYWxfaXJxX3RyaWdnZXJlZCAoIGlycSApICkgeworCQlEQkcgKCAiSW5zdGFsbGF0aW9uIG9mIHRyaXZpYWwgSVJRIGhhbmRsZXIgZmFpbGVkXG4iICk7CisJCXJlbW92ZV90cml2aWFsX2lycV9oYW5kbGVyICggaXJxICk7CisJCXJldHVybiAwOworCX0KKwlEQkcgKCAiVHJpdmlhbCBJUlEgaGFuZGxlciBpbnN0YWxsZWQgc3VjY2Vzc2Z1bGx5XG4iICk7CisJZW5hYmxlX2lycSAoIGlycSApOworCXJldHVybiAxOworfQorCisvKiBSZW1vdmUgdGhlIHRyaXZpYWwgSVJRIGhhbmRsZXIuCisgKi8KKworaW50IHJlbW92ZV90cml2aWFsX2lycV9oYW5kbGVyICggaXJxX3QgaXJxICkgeworCXNlZ29mZl90IHRyaXZpYWxfaXJxX2hhbmRsZXJfc2Vnb2ZmID0gU0VHT0ZGKHRyaXZpYWxfaXJxX2hhbmRsZXIpOworCisJaWYgKCB0cml2aWFsX2lycV9pbnN0YWxsZWRfb24gPT0gSVJRX05PTkUgKSByZXR1cm4gMTsKKwlpZiAoIGlycSAhPSB0cml2aWFsX2lycV9pbnN0YWxsZWRfb24gKSB7CisJCURCRyAoICJDYW5ub3QgdW5pbnN0YWxsIHRyaXZpYWwgSVJRIGhhbmRsZXIgZnJvbSBJUlEgJWQ7ICIKKwkJICAgICAgImlzIGluc3RhbGxlZCBvbiBJUlEgJWRcbiIsIGlycSwKKwkJICAgICAgdHJpdmlhbF9pcnFfaW5zdGFsbGVkX29uICk7CisJCXJldHVybiAwOworCX0KKworCWlmICggISByZW1vdmVfaXJxX2hhbmRsZXIgKCBpcnEsICZ0cml2aWFsX2lycV9oYW5kbGVyX3NlZ29mZiwKKwkJCQkgICAgdHJpdmlhbF9pcnFfY2hhaW4sCisJCQkJICAgIHRyaXZpYWxfaXJxX2NoYWluX3RvICkgKQorCQlyZXR1cm4gMDsKKworCWlmICggdHJpdmlhbF9pcnFfdHJpZ2dlcmVkICggdHJpdmlhbF9pcnFfaW5zdGFsbGVkX29uICkgKSB7CisJCURCRyAoICJTZW5kaW5nIEVPSSBmb3IgdW53YW50ZWQgdHJpdmlhbCBJUlFcbiIgKTsKKwkJc2VuZF9zcGVjaWZpY19lb2kgKCB0cml2aWFsX2lycV9pbnN0YWxsZWRfb24gKTsKKwl9CisKKwl0cml2aWFsX2lycV9pbnN0YWxsZWRfb24gPSBJUlFfTk9ORTsKKwlyZXR1cm4gMTsKK30KKworLyogU2FmZSBtZXRob2QgdG8gZGV0ZWN0IHdoZXRoZXIgb3Igbm90IHRyaXZpYWwgSVJRIGhhcyBiZWVuCisgKiB0cmlnZ2VyZWQuICBVc2luZyB0aGlzIGNhbGwgYXZvaWRzIHBvdGVudGlhbCByYWNlIGNvbmRpdGlvbnMuICBUaGlzCisgKiBjYWxsIHdpbGwgcmV0dXJuIHN1Y2Nlc3Mgb25seSBvbmNlIHBlciB0cmlnZ2VyLgorICovCisKK2ludCB0cml2aWFsX2lycV90cmlnZ2VyZWQgKCBpcnFfdCBpcnEgKSB7CisJdWludDE2X3QgdHJpdmlhbF9pcnFfdGhpc190cmlnZ2VyX2NvdW50ID0gKnRyaXZpYWxfaXJxX3RyaWdnZXJfY291bnQ7CisJaW50IHRyaWdnZXJlZCA9ICggdHJpdmlhbF9pcnFfdGhpc190cmlnZ2VyX2NvdW50IC0KKwkJCSAgdHJpdmlhbF9pcnFfcHJldmlvdXNfdHJpZ2dlcl9jb3VudCApOworCQorCS8qIGlycSBpcyBub3QgdXNlZCBhdCBwcmVzZW50LCBidXQgd2UgaGF2ZSBpdCBpbiB0aGUgQVBJIGZvcgorCSAqIGZ1dHVyZS1wcm9vZmluZzsgaW4gY2FzZSB3ZSB3YW50IHRoZSBmYWNpbGl0eSB0byBoYXZlCisJICogbXVsdGlwbGUgdHJpdmlhbCBJUlEgaGFuZGxlcnMgaW5zdGFsbGVkIHNpbXVsdGFuZW91c2x5LgorCSAqCisJICogQXZvaWQgY29tcGlsZXIgd2FybmluZyBhYm91dCB1bnVzZWQgdmFyaWFibGUuCisJICovCisJaWYgKCBpcnEgPT0gSVJRX05PTkUgKSB7fTsKKwkKKwl0cml2aWFsX2lycV9wcmV2aW91c190cmlnZ2VyX2NvdW50ID0gdHJpdmlhbF9pcnFfdGhpc190cmlnZ2VyX2NvdW50OworCXJldHVybiB0cmlnZ2VyZWQgPyAxIDogMDsKK30KKworLyogQ29weSB0cml2aWFsIElSUSBoYW5kbGVyIHRvIGEgbmV3IGxvY2F0aW9uLiAgVHlwaWNhbGx5IHVzZWQgdG8gY29weQorICogdGhlIGhhbmRsZXIgaW50byBiYXNlIG1lbW9yeTsgd2hlbiByZWxvY2F0aW9uIGlzIGJlaW5nIHVzZWQgd2UgbmVlZAorICogdG8gZG8gdGhpcyBiZWZvcmUgaW5zdGFsbGluZyB0aGUgaGFuZGxlci4KKyAqCisgKiBDYWxsIHdpdGggdGFyZ2V0PU5VTEwgaW4gb3JkZXIgdG8gcmVzdG9yZSB0aGUgaGFuZGxlciB0byBpdHMKKyAqIG9yaWdpbmFsIGxvY2F0aW9uLgorICovCisKK2ludCBjb3B5X3RyaXZpYWxfaXJxX2hhbmRsZXIgKCB2b2lkICp0YXJnZXQsIHNpemVfdCB0YXJnZXRfc2l6ZSApIHsKKwlpcnFfdCBjdXJyZW50bHlfaW5zdGFsbGVkX29uID0gdHJpdmlhbF9pcnFfaW5zdGFsbGVkX29uOworCXVpbnQzMl90IG9mZnNldCA9ICggdGFyZ2V0ID09IE5VTEwgPyAwIDoKKwkJCSAgICB0YXJnZXQgLSAmX3RyaXZpYWxfaXJxX2hhbmRsZXJfc3RhcnQgKTsKKworCWlmICgoIHRhcmdldCAhPSBOVUxMICkgJiYgKCB0YXJnZXRfc2l6ZSA8IFRSSVZJQUxfSVJRX0hBTkRMRVJfU0laRSApKSB7CisJCURCRyAoICJJbnN1ZmZpY2llbnQgc3BhY2UgdG8gY29weSB0cml2aWFsIElSUSBoYW5kbGVyXG4iICk7CisJCXJldHVybiAwOworCX0KKworCWlmICggY3VycmVudGx5X2luc3RhbGxlZF9vbiAhPSBJUlFfTk9ORSApIHsKKwkJREJHICgiV0FSTklORzogcmVsb2NhdGluZyB0cml2aWFsIElSUSBoYW5kbGVyIHdoaWxlIGluIHVzZVxuIik7CisJCWlmICggISByZW1vdmVfdHJpdmlhbF9pcnFfaGFuZGxlciAoIGN1cnJlbnRseV9pbnN0YWxsZWRfb24gKSApCisJCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBEbyB0aGUgYWN0dWFsIGNvcHkgKi8KKwlpZiAoIHRhcmdldCAhPSBOVUxMICkgeworCQlEQkcgKCAiQ29weWluZyB0cml2aWFsIElSUSBoYW5kbGVyIHRvICVoeDolaHhcbiIsCisJCSAgICAgIFNFR01FTlQodGFyZ2V0KSwgT0ZGU0VUKHRhcmdldCkgKTsKKwkJbWVtY3B5ICggdGFyZ2V0LCAmX3RyaXZpYWxfaXJxX2hhbmRsZXJfc3RhcnQsCisJCQkgVFJJVklBTF9JUlFfSEFORExFUl9TSVpFICk7CisJfSBlbHNlIHsKKwkJREJHICggIlJlc3RvcmluZyB0cml2aWFsIElSUSBoYW5kbGVyIHRvIG9yaWdpbmFsIGxvY2F0aW9uXG4iICk7CisJfQorCS8qIFVwZGF0ZSBhbGwgdGhlIHBvaW50ZXJzIHRvIHN0cnVjdHVyZXMgd2l0aGluIHRoZSBoYW5kbGVyICovCisJdHJpdmlhbF9pcnFfaGFuZGxlciA9ICggdm9pZCAoKilQKCh2b2lkKSkgKQorCQkoICh2b2lkKilfdHJpdmlhbF9pcnFfaGFuZGxlciArIG9mZnNldCApOworCXRyaXZpYWxfaXJxX3RyaWdnZXJfY291bnQgPSAodWludDE2X3QqKQorCQkoICh2b2lkKikmX3RyaXZpYWxfaXJxX3RyaWdnZXJfY291bnQgKyBvZmZzZXQgKTsKKwl0cml2aWFsX2lycV9jaGFpbl90byA9IChzZWdvZmZfdCopCisJCSggKHZvaWQqKSZfdHJpdmlhbF9pcnFfY2hhaW5fdG8gKyBvZmZzZXQgKTsKKwl0cml2aWFsX2lycV9jaGFpbiA9ICh1aW50OF90KikKKwkJKCAodm9pZCopJl90cml2aWFsX2lycV9jaGFpbiArIG9mZnNldCApOworCisJaWYgKCBjdXJyZW50bHlfaW5zdGFsbGVkX29uICE9IElSUV9OT05FICkgeworCQlpZiAoICEgaW5zdGFsbF90cml2aWFsX2lycV9oYW5kbGVyICggY3VycmVudGx5X2luc3RhbGxlZF9vbiApICkKKwkJCXJldHVybiAwOworCX0KKwlyZXR1cm4gMTsKK30KKworLyogU2VuZCBub24tc3BlY2lmaWMgRU9JKHMpLiAgVGhpcyBzZWVtcyB0byBiZSBpbmhlcmVudGx5IHVuc2FmZS4KKyAqLworCit2b2lkIHNlbmRfbm9uc3BlY2lmaWNfZW9pICggaXJxX3QgaXJxICkgeworCURCRyAoICJTZW5kaW5nIG5vbi1zcGVjaWZpYyBFT0kgZm9yIElSUSAlZFxuIiwgaXJxICk7CisJaWYgKCBpcnEgPj0gSVJRX1BJQ19DVVRPRkYgKSB7CisJCW91dGIgKCBJQ1JfRU9JX05PTl9TUEVDSUZJQywgUElDMl9JQ1IgKTsKKwl9CQkKKwlvdXRiICggSUNSX0VPSV9OT05fU1BFQ0lGSUMsIFBJQzFfSUNSICk7Cit9CisKKy8qIFNlbmQgc3BlY2lmaWMgRU9JKHMpLgorICovCisKK3ZvaWQgc2VuZF9zcGVjaWZpY19lb2kgKCBpcnFfdCBpcnEgKSB7CisJREJHICggIlNlbmRpbmcgc3BlY2lmaWMgRU9JIGZvciBJUlEgJWRcbiIsIGlycSApOworCW91dGIgKCBJQ1JfRU9JX1NQRUNJRklDIHwgSUNSX1ZBTFVFKGlycSksIElDUl9SRUcoaXJxKSApOworCWlmICggaXJxID49IElSUV9QSUNfQ1VUT0ZGICkgeworCQlvdXRiICggSUNSX0VPSV9TUEVDSUZJQyB8IElDUl9WQUxVRShDSEFJTkVEX0lSUSksCisJCSAgICAgICBJQ1JfUkVHKENIQUlORURfSVJRKSApOworCX0KK30KKworLyogRHVtcCBjdXJyZW50IDgyNTkgc3RhdHVzOiBlbmFibGVkIElSUXMgYW5kIGhhbmRsZXIgYWRkcmVzc2VzLgorICovCisKKyNpZmRlZiBERUJVR19JUlEKK3ZvaWQgZHVtcF9pcnFfc3RhdHVzICggdm9pZCApIHsKKwlpbnQgaXJxID0gMDsKKwkKKwlmb3IgKCBpcnEgPSAwOyBpcnEgPCAxNjsgaXJxKysgKSB7CisJCWlmICggaXJxX2VuYWJsZWQgKCBpcnEgKSApIHsKKwkJCXByaW50ZiAoICJJUlElZCBlbmFibGVkLCBJU1IgYXQgJWh4OiVoeFxuIiwgaXJxLAorCQkJCSBJUlFfVkVDVE9SKGlycSktPnNlZ21lbnQsCisJCQkJIElSUV9WRUNUT1IoaXJxKS0+b2Zmc2V0ICk7CisJCX0KKwl9Cit9CisjZW5kaWYKZGlmZiAtTmF1ciBncnViLTAuOTcub3JpZy9uZXRib290L3BpYzgyNTkuaCBncnViLTAuOTcvbmV0Ym9vdC9waWM4MjU5LmgKLS0tIGdydWItMC45Ny5vcmlnL25ldGJvb3QvcGljODI1OS5oCTE5NzAtMDEtMDEgMDA6MDA6MDAuMDAwMDAwMDAwICswMDAwCisrKyBncnViLTAuOTcvbmV0Ym9vdC9waWM4MjU5LmgJMjAwNS0wOC0zMSAxOTowMzozNS4wMDAwMDAwMDAgKzAwMDAKQEAgLTAsMCArMSw5OSBAQAorLyoKKyAqIEJhc2ljIHN1cHBvcnQgZm9yIGNvbnRyb2xsaW5nIHRoZSA4MjU5IFByb2dyYW1tYWJsZSBJbnRlcnJ1cHQgQ29udHJvbGxlcnMuCisgKgorICogSW5pdGlhbGx5IHdyaXR0ZW4gYnkgTWljaGFlbCBCcm93biAobWNiMzApLgorICovCisKKyNpZm5kZWYgUElDODI1OV9ICisjZGVmaW5lIFBJQzgyNTlfSAorCisvKiBGb3Igc2Vnb2ZmX3QgKi8KKyNpbmNsdWRlIDxzZWdvZmYuaD4KKworI2RlZmluZSBJUlFfUElDX0NVVE9GRiAoOCkKKworLyogODI1OSByZWdpc3RlciBsb2NhdGlvbnMgKi8KKyNkZWZpbmUgUElDMV9JQ1cxICgweDIwKQorI2RlZmluZSBQSUMxX09DVzIgKDB4MjApCisjZGVmaW5lIFBJQzFfT0NXMyAoMHgyMCkKKyNkZWZpbmUgUElDMV9JQ1IgKDB4MjApCisjZGVmaW5lIFBJQzFfSVJSICgweDIwKQorI2RlZmluZSBQSUMxX0lTUiAoMHgyMCkKKyNkZWZpbmUgUElDMV9JQ1cyICgweDIxKQorI2RlZmluZSBQSUMxX0lDVzMgKDB4MjEpCisjZGVmaW5lIFBJQzFfSUNXNCAoMHgyMSkKKyNkZWZpbmUgUElDMV9JTVIgKDB4MjEpCisjZGVmaW5lIFBJQzJfSUNXMSAoMHhhMCkKKyNkZWZpbmUgUElDMl9PQ1cyICgweGEwKQorI2RlZmluZSBQSUMyX09DVzMgKDB4YTApCisjZGVmaW5lIFBJQzJfSUNSICgweGEwKQorI2RlZmluZSBQSUMyX0lSUiAoMHhhMCkKKyNkZWZpbmUgUElDMl9JU1IgKDB4YTApCisjZGVmaW5lIFBJQzJfSUNXMiAoMHhhMSkKKyNkZWZpbmUgUElDMl9JQ1czICgweGExKQorI2RlZmluZSBQSUMyX0lDVzQgKDB4YTEpCisjZGVmaW5lIFBJQzJfSU1SICgweGExKQorCisvKiBSZWdpc3RlciBjb21tYW5kIHZhbHVlcyAqLworI2RlZmluZSBPQ1czX0lEICgweDA4KQorI2RlZmluZSBPQ1czX1JFQURfSVJSICgweDAzKQorI2RlZmluZSBPQ1czX1JFQURfSVNSICgweDAyKQorI2RlZmluZSBJQ1JfRU9JX05PTl9TUEVDSUZJQyAoMHgyMCkKKyNkZWZpbmUgSUNSX0VPSV9OT1AgKDB4NDApCisjZGVmaW5lIElDUl9FT0lfU1BFQ0lGSUMgKDB4NjApCisjZGVmaW5lIElDUl9FT0lfU0VUX1BSSU9SSVRZICgweGMwKQorCisvKiBNYWNyb3MgdG8gZW5hYmxlL2Rpc2FibGUgSVJRcyAqLworI2RlZmluZSBJTVJfUkVHKHgpICggKHgpIDwgSVJRX1BJQ19DVVRPRkYgPyBQSUMxX0lNUiA6IFBJQzJfSU1SICkKKyNkZWZpbmUgSU1SX0JJVCh4KSAoIDEgPDwgKCAoeCkgJSBJUlFfUElDX0NVVE9GRiApICkKKyNkZWZpbmUgaXJxX2VuYWJsZWQoeCkgKCAoIGluYiAoIElNUl9SRUcoeCkgKSAmIElNUl9CSVQoeCkgKSA9PSAwICkKKyNkZWZpbmUgZW5hYmxlX2lycSh4KSBvdXRiICggaW5iKCBJTVJfUkVHKHgpICkgJiB+SU1SX0JJVCh4KSwgSU1SX1JFRyh4KSApCisjZGVmaW5lIGRpc2FibGVfaXJxKHgpIG91dGIgKCBpbmIoIElNUl9SRUcoeCkgKSB8IElNUl9CSVQoeCksIElNUl9SRUcoeCkgKQorCisvKiBNYWNyb3MgZm9yIGFja25vd2xlZGdpbmcgSVJRcyAqLworI2RlZmluZSBJQ1JfUkVHKHgpICggKHgpIDwgSVJRX1BJQ19DVVRPRkYgPyBQSUMxX0lDUiA6IFBJQzJfSUNSICkKKyNkZWZpbmUgSUNSX1ZBTFVFKHgpICggKHgpICUgSVJRX1BJQ19DVVRPRkYgKQorI2RlZmluZSBDSEFJTkVEX0lSUSAyCisKKy8qIFV0aWxpdHkgbWFjcm9zIHRvIGNvbnZlcnQgSVJRIG51bWJlcnMgdG8gSU5UIG51bWJlcnMgYW5kIElOVCB2ZWN0b3JzICAqLworI2RlZmluZSBJUlFfSU5UKHgpICggKHgpPElSUV9QSUNfQ1VUT0ZGID8gKHgpKzB4MDggOiAoeCktSVJRX1BJQ19DVVRPRkYrMHg3MCApCisjZGVmaW5lIElOVF9WRUNUT1IoeCkgKCAoc2Vnb2ZmX3QqKSBwaHlzX3RvX3ZpcnQoIDQgKiAoeCkgKSApCisjZGVmaW5lIElSUV9WRUNUT1IoeCkgKCBJTlRfVkVDVE9SICggSVJRX0lOVCh4KSApICkKKworLyogT3RoZXIgY29uc3RhbnRzICovCit0eXBlZGVmIHVpbnQ4X3QgaXJxX3Q7CisjZGVmaW5lIElSUV9NQVggKDE1KQorI2RlZmluZSBJUlFfTk9ORSAoMHhmZikKKworLyogTGFiZWxzIGluIGFzc2VtYmx5IGNvZGUgKGluIHBjYmlvcy5TKQorICovCitleHRlcm4gdm9pZCBfdHJpdmlhbF9pcnFfaGFuZGxlcl9zdGFydDsKK2V4dGVybiB2b2lkIF90cml2aWFsX2lycV9oYW5kbGVyICggdm9pZCApOworZXh0ZXJuIHZvbGF0aWxlIHVpbnQxNl90IF90cml2aWFsX2lycV90cmlnZ2VyX2NvdW50OworZXh0ZXJuIHNlZ29mZl90IF90cml2aWFsX2lycV9jaGFpbl90bzsKK2V4dGVybiB1aW50OF90IF90cml2aWFsX2lycV9jaGFpbjsKK2V4dGVybiB2b2lkIF90cml2aWFsX2lycV9oYW5kbGVyX2VuZDsKKyNkZWZpbmUgVFJJVklBTF9JUlFfSEFORExFUl9TSVpFIFwKKwkoKHVpbnQzMl90KSggJl90cml2aWFsX2lycV9oYW5kbGVyX2VuZCAtICZfdHJpdmlhbF9pcnFfaGFuZGxlcl9zdGFydCApKQorCisvKiBGdW5jdGlvbiBwcm90b3R5cGVzCisgKi8KK2ludCBpbnN0YWxsX2lycV9oYW5kbGVyICggaXJxX3QgaXJxLCBzZWdvZmZfdCAqaGFuZGxlciwKKwkJCSAgdWludDhfdCAqcHJldmlvdXNseV9lbmFibGVkLAorCQkJICBzZWdvZmZfdCAqcHJldmlvdXNfaGFuZGxlciApOworaW50IHJlbW92ZV9pcnFfaGFuZGxlciAoIGlycV90IGlycSwgc2Vnb2ZmX3QgKmhhbmRsZXIsCisJCQkgdWludDhfdCAqcHJldmlvdXNseV9lbmFibGVkLAorCQkJIHNlZ29mZl90ICpwcmV2aW91c19oYW5kbGVyICk7CitpbnQgaW5zdGFsbF90cml2aWFsX2lycV9oYW5kbGVyICggaXJxX3QgaXJxICk7CitpbnQgcmVtb3ZlX3RyaXZpYWxfaXJxX2hhbmRsZXIgKCBpcnFfdCBpcnEgKTsKK2ludCB0cml2aWFsX2lycV90cmlnZ2VyZWQgKCBpcnFfdCBpcnEgKTsKK2ludCBjb3B5X3RyaXZpYWxfaXJxX2hhbmRsZXIgKCB2b2lkICp0YXJnZXQsIHNpemVfdCB0YXJnZXRfc2l6ZSApOwordm9pZCBzZW5kX25vbl9zcGVjaWZpY19lb2kgKCBpcnFfdCBpcnEgKTsKK3ZvaWQgc2VuZF9zcGVjaWZpY19lb2kgKCBpcnFfdCBpcnEgKTsKKyNpZmRlZiBERUJVR19JUlEKK3ZvaWQgZHVtcF9pcnFfc3RhdHVzICggdm9pZCApOworI2Vsc2UKKyNkZWZpbmUgZHVtcF9pcnFfc3RhdHVzKCkKKyNlbmRpZgorCisjZW5kaWYgLyogUElDODI1OV9IICovCmRpZmYgLU5hdXIgZ3J1Yi0wLjk3Lm9yaWcvbmV0Ym9vdC9wbmljLmMgZ3J1Yi0wLjk3L25ldGJvb3QvcG5pYy5jCi0tLSBncnViLTAuOTcub3JpZy9uZXRib290L3BuaWMuYwkxOTcwLTAxLTAxIDAwOjAwOjAwLjAwMDAwMDAwMCArMDAwMAorKysgZ3J1Yi0wLjk3L25ldGJvb3QvcG5pYy5jCTIwMDUtMDgtMzEgMTk6MDM6MzUuMDAwMDAwMDAwICswMDAwCkBAIC0wLDAgKzEsMjY3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK0V0aGVyYm9vdCAtICBCT09UUC9URlRQIEJvb3RzdHJhcCBQcm9ncmFtCitCb2NocyBQc2V1ZG8gTklDIGRyaXZlciBmb3IgRXRoZXJib290CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdAorICogeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFNlZSBwbmljX2FwaS5oIGZvciBhbiBleHBsYW5hdGlvbiBvZiB0aGUgQm9jaHMgUHNldWRvIE5JQy4KKyAqLworCisvKiB0byBnZXQgc29tZSBnbG9iYWwgcm91dGluZXMgbGlrZSBwcmludGYgKi8KKyNpbmNsdWRlICJldGhlcmJvb3QuaCIKKy8qIHRvIGdldCB0aGUgaW50ZXJmYWNlIHRvIHRoZSBib2R5IG9mIHRoZSBwcm9ncmFtICovCisjaW5jbHVkZSAibmljLmgiCisvKiB0byBnZXQgdGhlIFBDSSBzdXBwb3J0IGZ1bmN0aW9ucywgaWYgdGhpcyBpcyBhIFBDSSBOSUMgKi8KKyNpbmNsdWRlICJwY2kuaCIKKworLyogUE5JQyBBUEkgKi8KKyNpbmNsdWRlICJwbmljX2FwaS5oIgorCisvKiBQcml2YXRlIGRhdGEgc3RydWN0dXJlICovCit0eXBlZGVmIHN0cnVjdCB7CisJdWludDE2X3QgYXBpX3ZlcnNpb247Cit9IHBuaWNfcHJpdl9kYXRhX3Q7CisKKy8qIEZ1bmN0aW9uIHByb3RvdHlwZXMgKi8KK3N0YXRpYyBpbnQgcG5pY19hcGlfY2hlY2sgKCB1aW50MTZfdCBhcGlfdmVyc2lvbiApOworCisvKiBOSUMgc3BlY2lmaWMgc3RhdGljIHZhcmlhYmxlcyBnbyBoZXJlICovCitzdGF0aWMgdWludDhfdCB0eF9idWZmZXJbRVRIX0ZSQU1FX0xFTl07CisKKy8qIAorICogVXRpbGl0eSBmdW5jdGlvbnM6IGlzc3VlIGEgUE5JQyBjb21tYW5kLCByZXRyaWV2ZSByZXN1bHQuICBVc2UKKyAqIHBuaWNfY29tbWFuZF9xdWlldCBpZiB5b3UgZG9uJ3Qgd2FudCBmYWlsdXJlIGNvZGVzIHRvIGJlCisgKiBhdXRvbWF0aWNhbGx5IHByaW50ZWQuICBSZXR1cm5zIHRoZSBQTklDIHN0YXR1cyBjb2RlLgorICogCisgKiBTZXQgb3V0cHV0X2xlbmd0aCB0byBOVUxMIG9ubHkgaWYgeW91IGV4cGVjdCB0byByZWNlaXZlIGV4YWN0bHkKKyAqIG91dHB1dF9tYXhfbGVuZ3RoIGJ5dGVzLCBvdGhlcndpc2UgaXQnbGwgY29tcGxhaW4gdGhhdCB5b3UgZGlkbid0CisgKiBnZXQgZW5vdWdoIGRhdGEgKG9uIHRoZSBhc3N1bXB0aW9uIHRoYXQgaWYgeW91IG5vdCBpbnRlcmVzdGVkIGluCisgKiBkaXNjb3ZlcmluZyB0aGUgb3V0cHV0IGxlbmd0aCB0aGVuIHlvdSdyZSBleHBlY3RpbmcgYSBmaXhlZCBhbW91bnQKKyAqIG9mIGRhdGEpLgorICovCisKK3N0YXRpYyB1aW50MTZfdCBwbmljX2NvbW1hbmRfcXVpZXQgKCBzdHJ1Y3QgbmljICpuaWMsIHVpbnQxNl90IGNvbW1hbmQsCisJCQkJICAgICB2b2lkICppbnB1dCwgdWludDE2X3QgaW5wdXRfbGVuZ3RoLAorCQkJCSAgICAgdm9pZCAqb3V0cHV0LCB1aW50MTZfdCBvdXRwdXRfbWF4X2xlbmd0aCwKKwkJCQkgICAgIHVpbnQxNl90ICpvdXRwdXRfbGVuZ3RoICkgeworCWludCBpOworCXVpbnQxNl90IHN0YXR1czsKKwl1aW50MTZfdCBfb3V0cHV0X2xlbmd0aDsKKworCWlmICggaW5wdXQgIT0gTlVMTCApIHsKKwkJLyogV3JpdGUgaW5wdXQgbGVuZ3RoICovCisJCW91dHcgKCBpbnB1dF9sZW5ndGgsIG5pYy0+aW9hZGRyICsgUE5JQ19SRUdfTEVOICk7CisJCS8qIFdyaXRlIGlucHV0IGRhdGEgKi8KKwkJZm9yICggaSA9IDA7IGkgPCBpbnB1dF9sZW5ndGg7IGkrKyApIHsKKwkJCW91dGIoICgoY2hhciopaW5wdXQpW2ldLCBuaWMtPmlvYWRkciArIFBOSUNfUkVHX0RBVEEgKTsKKwkJfQorCX0KKwkvKiBXcml0ZSBjb21tYW5kICovCisJb3V0dyAoIGNvbW1hbmQsIG5pYy0+aW9hZGRyICsgUE5JQ19SRUdfQ01EICk7CisJLyogUmV0cmlldmUgc3RhdHVzICovCisJc3RhdHVzID0gaW53ICggbmljLT5pb2FkZHIgKyBQTklDX1JFR19TVEFUICk7CisJLyogUmV0cmlldmUgb3V0cHV0IGxlbmd0aCAqLworCV9vdXRwdXRfbGVuZ3RoID0gaW53ICggbmljLT5pb2FkZHIgKyBQTklDX1JFR19MRU4gKTsKKwlpZiAoIG91dHB1dF9sZW5ndGggPT0gTlVMTCApIHsKKwkJaWYgKCBfb3V0cHV0X2xlbmd0aCAhPSBvdXRwdXRfbWF4X2xlbmd0aCApIHsKKwkJCXByaW50ZiAoICJwbmljX2NvbW1hbmQgJSNoeDogd3JvbmcgZGF0YSBsZW5ndGggIgorCQkJCSAicmV0dXJuZWQgKGV4cGVjdGVkICVkLCBnb3QgJWQpXG4iLCBjb21tYW5kLAorCQkJCSBvdXRwdXRfbWF4X2xlbmd0aCwgX291dHB1dF9sZW5ndGggKTsKKwkJfQorCX0gZWxzZSB7CisJCSpvdXRwdXRfbGVuZ3RoID0gX291dHB1dF9sZW5ndGg7CisJfQorCWlmICggb3V0cHV0ICE9IE5VTEwgKSB7CisJCWlmICggX291dHB1dF9sZW5ndGggPiBvdXRwdXRfbWF4X2xlbmd0aCApIHsKKwkJCXByaW50ZiAoICJwbmljX2NvbW1hbmQgJSNoeDogb3V0cHV0IGJ1ZmZlciB0b28gc21hbGwgIgorCQkJCSAiKGhhdmUgJWQsIG5lZWQgJWQpXG4iLCBjb21tYW5kLAorCQkJCSBvdXRwdXRfbWF4X2xlbmd0aCwgX291dHB1dF9sZW5ndGggKTsKKwkJCV9vdXRwdXRfbGVuZ3RoID0gb3V0cHV0X21heF9sZW5ndGg7CisJCX0KKwkJLyogUmV0cmlldmUgb3V0cHV0IGRhdGEgKi8KKwkJZm9yICggaSA9IDA7IGkgPCBfb3V0cHV0X2xlbmd0aDsgaSsrICkgeworCQkJKChjaGFyKilvdXRwdXQpW2ldID0KKwkJCQlpbmIgKCBuaWMtPmlvYWRkciArIFBOSUNfUkVHX0RBVEEgKTsKKwkJfQorCX0KKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgdWludDE2X3QgcG5pY19jb21tYW5kICggc3RydWN0IG5pYyAqbmljLCB1aW50MTZfdCBjb21tYW5kLAorCQkJICAgICAgIHZvaWQgKmlucHV0LCB1aW50MTZfdCBpbnB1dF9sZW5ndGgsCisJCQkgICAgICAgdm9pZCAqb3V0cHV0LCB1aW50MTZfdCBvdXRwdXRfbWF4X2xlbmd0aCwKKwkJCSAgICAgICB1aW50MTZfdCAqb3V0cHV0X2xlbmd0aCApIHsKKwlwbmljX3ByaXZfZGF0YV90ICpwcml2ID0gKHBuaWNfcHJpdl9kYXRhX3QqKW5pYy0+cHJpdl9kYXRhOworCXVpbnQxNl90IHN0YXR1cyA9IHBuaWNfY29tbWFuZF9xdWlldCAoIG5pYywgY29tbWFuZCwKKwkJCQkJICAgICAgIGlucHV0LCBpbnB1dF9sZW5ndGgsCisJCQkJCSAgICAgICBvdXRwdXQsIG91dHB1dF9tYXhfbGVuZ3RoLAorCQkJCQkgICAgICAgb3V0cHV0X2xlbmd0aCApOworCWlmICggc3RhdHVzID09IFBOSUNfU1RBVFVTX09LICkgcmV0dXJuIHN0YXR1czsKKwlwcmludGYgKCAiUE5JQyBjb21tYW5kICUjaHggKGxlbiAlI2h4KSBmYWlsZWQgd2l0aCBzdGF0dXMgJSNoeFxuIiwKKwkJIGNvbW1hbmQsIGlucHV0X2xlbmd0aCwgc3RhdHVzICk7CisJaWYgKCBwcml2LT5hcGlfdmVyc2lvbiApIHBuaWNfYXBpX2NoZWNrKHByaXYtPmFwaV92ZXJzaW9uKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKiBDaGVjayBBUEkgdmVyc2lvbiBtYXRjaGVzIHRoYXQgb2YgTklDICovCitzdGF0aWMgaW50IHBuaWNfYXBpX2NoZWNrICggdWludDE2X3QgYXBpX3ZlcnNpb24gKSB7CisJaWYgKCBhcGlfdmVyc2lvbiAhPSBQTklDX0FQSV9WRVJTSU9OICkgeworCQlwcmludGYgKCAiV2FybmluZzogQVBJIHZlcnNpb24gbWlzbWF0Y2ghICIKKwkJCSAiKE5JQydzIGlzICVkLiVkLCBvdXJzIGlzICVkLiVkKVxuIiwKKwkJCSBhcGlfdmVyc2lvbiA+PiA4LCBhcGlfdmVyc2lvbiAmIDB4ZmYsCisJCQkgUE5JQ19BUElfVkVSU0lPTiA+PiA4LCBQTklDX0FQSV9WRVJTSU9OICYgMHhmZiApOworCX0KKwlpZiAoIGFwaV92ZXJzaW9uIDwgUE5JQ19BUElfVkVSU0lPTiApIHsKKwkJcHJpbnRmICggIioqKiBZb3UgbWF5IG5lZWQgdG8gdXBkYXRlIHlvdXIgY29weSBvZiBCb2NocyAqKipcbiIgKTsKKwl9CisJcmV0dXJuICggYXBpX3ZlcnNpb24gPT0gUE5JQ19BUElfVkVSU0lPTiApOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1BPTEwgLSBXYWl0IGZvciBhIGZyYW1lCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50IHBuaWNfcG9sbChzdHJ1Y3QgbmljICpuaWMsIGludCByZXRyaWV2ZSkKK3sKKwl1aW50MTZfdCBsZW5ndGg7CisJdWludDE2X3QgcWxlbjsKKworCS8qIENoZWNrIHJlY2VpdmUgcXVldWUgbGVuZ3RoIHRvIHNlZSBpZiB0aGVyZSdzIGFueXRoaW5nIHRvCisJICogZ2V0LiAgTmVjZXNzYXJ5IHNpbmNlIG9uY2Ugd2UndmUgY2FsbGVkIFBOSUNfQ01EX1JFQ1Ygd2UKKwkgKiBoYXZlIHRvIHJlYWQgb3V0IHRoZSBwYWNrZXQsIG90aGVyd2lzZSBpdCdzIGxvc3QgZm9yZXZlci4KKwkgKi8KKwlpZiAoIHBuaWNfY29tbWFuZCAoIG5pYywgUE5JQ19DTURfUkVDVl9RTEVOLCBOVUxMLCAwLAorCQkJICAgICZxbGVuLCBzaXplb2YocWxlbiksIE5VTEwgKQorCSAgICAgIT0gUE5JQ19TVEFUVVNfT0sgKSByZXR1cm4gKCAwICk7CisJaWYgKCBxbGVuID09IDAgKSByZXR1cm4gKCAwICk7CisKKwkvKiBUaGVyZSBpcyBhIHBhY2tldCByZWFkeS4gIFJldHVybiAxIGlmIHdlJ3JlIG9ubHkgY2hlY2tpbmcuICovCisJaWYgKCAhIHJldHJpZXZlICkgcmV0dXJuICggMSApOworCisJLyogUmV0cmlldmUgdGhlIHBhY2tldCAqLworCWlmICggcG5pY19jb21tYW5kICggbmljLCBQTklDX0NNRF9SRUNWLCBOVUxMLCAwLAorCQkJICAgIG5pYy0+cGFja2V0LCBFVEhfRlJBTUVfTEVOLCAmbGVuZ3RoICkKKwkgICAgICE9IFBOSUNfU1RBVFVTX09LICkgcmV0dXJuICggMCApOworCW5pYy0+cGFja2V0bGVuID0gbGVuZ3RoOworCXJldHVybiAoIDEgKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitUUkFOU01JVCAtIFRyYW5zbWl0IGEgZnJhbWUKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIHBuaWNfdHJhbnNtaXQoCisJc3RydWN0IG5pYyAqbmljLAorCWNvbnN0IGNoYXIgKmRlc3QsCQkvKiBEZXN0aW5hdGlvbiAqLworCXVuc2lnbmVkIGludCB0eXBlLAkJLyogVHlwZSAqLworCXVuc2lnbmVkIGludCBzaXplLAkJLyogc2l6ZSAqLworCWNvbnN0IGNoYXIgKmRhdGEpCQkvKiBQYWNrZXQgKi8KK3sKKwl1bnNpZ25lZCBpbnQgbnN0eXBlID0gaHRvbnMgKCB0eXBlICk7CisKKwlpZiAoICggRVRIX0hMRU4gKyBzaXplICkgPj0gRVRIX0ZSQU1FX0xFTiApIHsKKwkJcHJpbnRmICggInBuaWNfdHJhbnNtaXQ6IHBhY2tldCB0b28gbGFyZ2VcbiIgKTsKKwkJcmV0dXJuOworCX0KKworCS8qIEFzc2VtYmxlIHBhY2tldCAqLworCW1lbWNweSAoIHR4X2J1ZmZlciwgZGVzdCwgRVRIX0FMRU4gKTsKKwltZW1jcHkgKCB0eF9idWZmZXIgKyBFVEhfQUxFTiwgbmljLT5ub2RlX2FkZHIsIEVUSF9BTEVOICk7CisJbWVtY3B5ICggdHhfYnVmZmVyICsgMiAqIEVUSF9BTEVOLCAmbnN0eXBlLCAyICk7CisJbWVtY3B5ICggdHhfYnVmZmVyICsgRVRIX0hMRU4sIGRhdGEsIHNpemUgKTsKKworCXBuaWNfY29tbWFuZCAoIG5pYywgUE5JQ19DTURfWE1JVCwgdHhfYnVmZmVyLCBFVEhfSExFTiArIHNpemUsCisJCSAgICAgICBOVUxMLCAwLCBOVUxMICk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorRElTQUJMRSAtIFR1cm4gb2ZmIGV0aGVybmV0IGludGVyZmFjZQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgcG5pY19kaXNhYmxlKHN0cnVjdCBkZXYgKmRldikKK3sKKwlzdHJ1Y3QgbmljICpuaWMgPSAoc3RydWN0IG5pYyAqKWRldjsKKwlwbmljX2NvbW1hbmQgKCBuaWMsIFBOSUNfQ01EX1JFU0VULCBOVUxMLCAwLCBOVUxMLCAwLCBOVUxMICk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorSVJRIC0gSGFuZGxlIGNhcmQgaW50ZXJydXB0IHN0YXR1cworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgcG5pY19pcnEgKCBzdHJ1Y3QgbmljICpuaWMsIGlycV9hY3Rpb25fdCBhY3Rpb24gKQoreworCXVpbnQ4X3QgZW5hYmxlZDsKKworCXN3aXRjaCAoIGFjdGlvbiApIHsKKwljYXNlIERJU0FCTEUgOgorCWNhc2UgRU5BQkxFIDoKKwkJZW5hYmxlZCA9ICggYWN0aW9uID09IEVOQUJMRSA/IDEgOiAwICk7CisJCXBuaWNfY29tbWFuZCAoIG5pYywgUE5JQ19DTURfTUFTS19JUlEsCisJCQkgICAgICAgJmVuYWJsZWQsIHNpemVvZihlbmFibGVkKSwgTlVMTCwgMCwgTlVMTCApOworCQlicmVhazsKKwljYXNlIEZPUkNFIDoKKwkJcG5pY19jb21tYW5kICggbmljLCBQTklDX0NNRF9GT1JDRV9JUlEsCisJCQkgICAgICAgTlVMTCwgMCwgTlVMTCwgMCwgTlVMTCApOworCQlicmVhazsKKwl9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUFJPQkUgLSBMb29rIGZvciBhbiBhZGFwdGVyLCB0aGlzIHJvdXRpbmUncyB2aXNpYmxlIHRvIHRoZSBvdXRzaWRlCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBpbnQgcG5pY19wcm9iZShzdHJ1Y3QgZGV2ICpkZXYsIHN0cnVjdCBwY2lfZGV2aWNlICpwY2kpCit7CisJc3RydWN0IG5pYyAqbmljID0gKHN0cnVjdCBuaWMgKilkZXY7CisJc3RhdGljIHBuaWNfcHJpdl9kYXRhX3QgcHJpdjsKKwl1aW50MTZfdCBzdGF0dXM7CisKKwlwcmludGYoIiAtICIpOworCisJLyogQ2xlYXIgcHJpdmF0ZSBkYXRhIHN0cnVjdHVyZSBhbmQgY2hhaW4gaXQgaW4gKi8KKwltZW1zZXQgKCAmcHJpdiwgMCwgc2l6ZW9mKHByaXYpICk7CisJbmljLT5wcml2X2RhdGEgPSAmcHJpdjsKKworCS8qIE1hc2sgdGhlIGJpdCB0aGF0IHNheXMgInRoaXMgaXMgYW4gaW8gYWRkciIgKi8KKwluaWMtPmlvYWRkciA9IHBjaS0+aW9hZGRyICYgfjM7CisJbmljLT5pcnFubyA9IHBjaS0+aXJxOworCS8qIE5vdCBzdXJlIHdoYXQgdGhpcyBkb2VzLCBidXQgdGhlIHJ0bDgxMzkgZHJpdmVyIGRvZXMgaXQgKi8KKwlhZGp1c3RfcGNpX2RldmljZShwY2kpOworCisJc3RhdHVzID0gcG5pY19jb21tYW5kX3F1aWV0KCBuaWMsIFBOSUNfQ01EX0FQSV9WRVIsIE5VTEwsIDAsCisJCQkJICAgICAmcHJpdi5hcGlfdmVyc2lvbiwKKwkJCQkgICAgIHNpemVvZihwcml2LmFwaV92ZXJzaW9uKSwgTlVMTCApOworCWlmICggc3RhdHVzICE9IFBOSUNfU1RBVFVTX09LICkgeworCQlwcmludGYgKCAiUE5JQyBmYWlsZWQgaW5zdGFsbGF0aW9uIGNoZWNrLCBjb2RlICUjaHhcbiIsCisJCQkgc3RhdHVzICk7CisJCXJldHVybiAwOworCX0KKwlwbmljX2FwaV9jaGVjayhwcml2LmFwaV92ZXJzaW9uKTsKKwlzdGF0dXMgPSBwbmljX2NvbW1hbmQgKCBuaWMsIFBOSUNfQ01EX1JFQURfTUFDLCBOVUxMLCAwLAorCQkJCW5pYy0+bm9kZV9hZGRyLCBFVEhfQUxFTiwgTlVMTCApOworCXByaW50ZiAoICJEZXRlY3RlZCBCb2NocyBQc2V1ZG8gTklDIE1BQyAlISAoQVBJIHYlZC4lZCkgYXQgJSNoeFxuIiwKKwkJIG5pYy0+bm9kZV9hZGRyLCBwcml2LmFwaV92ZXJzaW9uPj44LCBwcml2LmFwaV92ZXJzaW9uJjB4ZmYsCisJCSBuaWMtPmlvYWRkciApOworCisJLyogcG9pbnQgdG8gTklDIHNwZWNpZmljIHJvdXRpbmVzICovCisJZGV2LT5kaXNhYmxlICA9IHBuaWNfZGlzYWJsZTsKKwluaWMtPnBvbGwgICAgID0gcG5pY19wb2xsOworCW5pYy0+dHJhbnNtaXQgPSBwbmljX3RyYW5zbWl0OworCW5pYy0+aXJxICAgICAgPSBwbmljX2lycTsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHN0cnVjdCBwY2lfaWQgcG5pY19uaWNzW10gPSB7CisvKiBnZW5ydWxlcy5wbCBkb2Vzbid0IGxldCB1cyB1c2UgbWFjcm9zIGZvciBQQ0kgSURzLi4uKi8KK1BDSV9ST00oMHhmZWZlLCAweGVmZWYsICJwbmljIiwgIkJvY2hzIFBzZXVkbyBOSUMgQWRhcHRvciIpLAorfTsKKworc3RydWN0IHBjaV9kcml2ZXIgcG5pY19kcml2ZXIgPSB7CisJLnR5cGUgICAgID0gTklDX0RSSVZFUiwKKwkubmFtZSAgICAgPSAiUE5JQyIsCisJLnByb2JlICAgID0gcG5pY19wcm9iZSwKKwkuaWRzICAgICAgPSBwbmljX25pY3MsCisJLmlkX2NvdW50ID0gc2l6ZW9mKHBuaWNfbmljcykvc2l6ZW9mKHBuaWNfbmljc1swXSksCisJLmNsYXNzICAgID0gMCwKK307CmRpZmYgLU5hdXIgZ3J1Yi0wLjk3Lm9yaWcvbmV0Ym9vdC9wbmljX2FwaS5oIGdydWItMC45Ny9uZXRib290L3BuaWNfYXBpLmgKLS0tIGdydWItMC45Ny5vcmlnL25ldGJvb3QvcG5pY19hcGkuaAkxOTcwLTAxLTAxIDAwOjAwOjAwLjAwMDAwMDAwMCArMDAwMAorKysgZ3J1Yi0wLjk3L25ldGJvb3QvcG5pY19hcGkuaAkyMDA1LTA4LTMxIDE5OjAzOjM1LjAwMDAwMDAwMCArMDAwMApAQCAtMCwwICsxLDU5IEBACisvKgorICogQ29uc3RhbnRzIGV0Yy4gZm9yIHRoZSBCb2Nocy9FdGhlcmJvb3QgcHNldWRvLU5JQworICogCisgKiBUaGlzIGhlYWRlciBmaWxlIG11c3QgYmUgdmFsaWQgQyBhbmQgQysrLgorICoKKyAqIE9wZXJhdGlvbiBvZiB0aGUgcHNldWRvLU5JQyAoUE5JQykgaXMgcHJldHR5IHNpbXBsZS4gIFRvIHdyaXRlIGEKKyAqIGNvbW1hbmQgcGx1cyBkYXRhLCBmaXJzdCB3cml0ZSB0aGUgbGVuZ3RoIG9mIHRoZSBkYXRhIHRvCisgKiBQTklDX1JFR19MRU4sIHRoZW4gd3JpdGUgdGhlIGRhdGEgYSBieXRlIGF0IGEgdHlwZSB0bworICogUE5JQ19SRUdfREFUQSwgdGhlbiB3cml0ZSB0aGUgY29tbWFuZCBjb2RlIHRvIFBOSUNfUkVHX0NNRC4gIFRoZQorICogc3RhdHVzIHdpbGwgYmUgYXZhaWxhYmxlIGZyb20gUE5JQ19SRUdfU1RBVC4gIFRoZSBsZW5ndGggb2YgYW55CisgKiBkYXRhIHJldHVybmVkIHdpbGwgYmUgaW4gUE5JQ19SRUdfTEVOIGFuZCBjYW4gYmUgcmVhZCBhIGJ5dGUgYXQgYQorICogdGltZSBmcm9tIFBOSUNfUkVHX0RBVEEuCisgKi8KKworLyoKKyAqIFBDSSBwYXJhbWV0ZXJzCisgKi8KKyNkZWZpbmUgUE5JQ19QQ0lfVkVORE9SCTB4ZmVmZQkvKiBIb3BlZnVsbHkgdGhlc2Ugd29uJ3QgY2xhc2ggd2l0aCAqLworI2RlZmluZSBQTklDX1BDSV9ERVZJQ0UgMHhlZmVmCS8qIGFueSByZWFsIFBDSSBkZXZpY2UgSURzLiAgICAgICAgICovCisKKy8qCisgKiAnSGFyZHdhcmUnIHJlZ2lzdGVyIGFkZHJlc3Nlcywgb2Zmc2V0IGZyb20gaW9fYmFzZQorICovCisjZGVmaW5lIFBOSUNfUkVHX0NNRAkweDAwCS8qIENvbW1hbmQgcmVnaXN0ZXIsIDIgYnl0ZXMsIHdyaXRlIG9ubHkgKi8KKyNkZWZpbmUgUE5JQ19SRUdfU1RBVAkweDAwCS8qIFN0YXR1cyByZWdpc3RlciwgMiBieXRlcywgcmVhZCBvbmx5ICovCisjZGVmaW5lIFBOSUNfUkVHX0xFTgkweDAyCS8qIExlbmd0aCByZWdpc3RlciwgMiBieXRlcywgcmVhZC13cml0ZSAqLworI2RlZmluZSBQTklDX1JFR19EQVRBCTB4MDQJLyogRGF0YSBwb3J0LCAxIGJ5dGUsIHJlYWQtd3JpdGUgKi8KKy8qCisgKiBQTklDX01BWF9SRUcgdXNlZCBpbiBCb2NocyB0byBjbGFpbSBpL28gc3BhY2UKKyAqLworI2RlZmluZSBQTklDX01BWF9SRUcJMHgwNAorCisvKgorICogQ29tbWFuZCBjb2RlIGRlZmluaXRpb25zOiB3cml0ZSB0aGVzZSBpbnRvIFBOSUNfUkVHX0NNRAorICovCisjZGVmaW5lIFBOSUNfQ01EX05PT1AJCTB4MDAwMAorI2RlZmluZSBQTklDX0NNRF9BUElfVkVSCTB4MDAwMQorI2RlZmluZSBQTklDX0NNRF9SRUFEX01BQwkweDAwMDIKKyNkZWZpbmUgUE5JQ19DTURfUkVTRVQJCTB4MDAwMworI2RlZmluZSBQTklDX0NNRF9YTUlUCQkweDAwMDQKKyNkZWZpbmUgUE5JQ19DTURfUkVDVgkJMHgwMDA1CisjZGVmaW5lIFBOSUNfQ01EX1JFQ1ZfUUxFTgkweDAwMDYKKyNkZWZpbmUgUE5JQ19DTURfTUFTS19JUlEJMHgwMDA3CisjZGVmaW5lIFBOSUNfQ01EX0ZPUkNFX0lSUQkweDAwMDgKKworLyoKKyAqIFN0YXR1cyBjb2RlIGRlZmluaXRpb25zOiByZWFkIHRoZXNlIGZyb20gUE5JQ19SRUdfU1RBVAorICoKKyAqIFdlIGF2b2lkIHVzaW5nIHN0YXR1cyBjb2RlcyB0aGF0IG1pZ2h0IGJlIGNvbmZ1c2VkIHdpdGgKKyAqIHJhbmRvbWx5LXJlYWQgZGF0YSAoZS5nLiAweDAwMDAsIDB4ZmZmZiBldGMuKQorICovCisjZGVmaW5lIFBOSUNfU1RBVFVTX09LCQkweDRmNGIJCS8qICdPSycgKi8KKyNkZWZpbmUgUE5JQ19TVEFUVVNfVU5LTk9XTl9DTUQJMHgzZjNmCQkvKiAnPz8nICovCisKKy8qCisgKiBPdGhlciBtaXNjZWxsYW5lb3VzIGluZm9ybWF0aW9uCisgKi8KKworI2RlZmluZSBQTklDX0FQSV9WRVJTSU9OCTB4MDEwMQkJLyogMS4xICovCmRpZmYgLU5hdXIgZ3J1Yi0wLjk3Lm9yaWcvbmV0Ym9vdC9weGUuaCBncnViLTAuOTcvbmV0Ym9vdC9weGUuaAotLS0gZ3J1Yi0wLjk3Lm9yaWcvbmV0Ym9vdC9weGUuaAkxOTcwLTAxLTAxIDAwOjAwOjAwLjAwMDAwMDAwMCArMDAwMAorKysgZ3J1Yi0wLjk3L25ldGJvb3QvcHhlLmgJMjAwNS0wOC0zMSAxOTowMzozNS4wMDAwMDAwMDAgKzAwMDAKQEAgLTAsMCArMSw1MjEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAgQWxmcmVkIFBlcmxzdGVpbiA8YWxmcmVkQGZyZWVic2Qub3JnPgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwMCBQYXVsIFNhYWIgPHBzQGZyZWVic2Qub3JnPgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwMCBKb2huIEJhbGR3aW4gPGpoYkBmcmVlYnNkLm9yZz4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKgorICogJEZyZWVCU0Q6IHNyYy9zeXMvYm9vdC9pMzg2L2xpYmkzODYvcHhlLmgsdiAxLjQuMi4yIDIwMDAvMDkvMTAgMDI6NTI6MTggcHMgRXhwICQKKyAqLworCisvKgorICogVGhlIHR5cGVkZWZzIGFuZCBzdHJ1Y3R1cmVzIGRlY2xhcmVkIGluIHRoaXMgZmlsZQorICogY2xlYXJseSB2aW9sYXRlIHN0eWxlKDkpLCB0aGUgcmVhc29uIGZvciB0aGlzIGlzIHRvIGNvbmZvcm0gdG8gdGhlCisgKiB0eXBlZGVmcy9zdHJ1Y3R1cmUtbmFtZXMgdXNlZCBpbiB0aGUgSW50ZWwgbGl0ZXJhdHVyZSB0byBhdm9pZCBjb25mdXNpb24uCisgKgorICogSXQncyBmb3IgeW91ciBvd24gZ29vZC4gOikKKyAqLworCisvKiBTRUdPRkYxNl90IGRlZmluZWQgaW4gc2VwYXJhdGUgaGVhZGVyIGZvciBFdGhlcmJvb3QKKyAqLworI2luY2x1ZGUgPHNlZ29mZi5oPgorCisvKiBJdCBzZWVtcyB0aGF0IGludGVsIGRpZG4ndCB0aGluayBhYm91dCBBQkksCisgKiBlaXRoZXIgdGhhdCBvciAxNmJpdCBBQkkgIT0gMzJiaXQgQUJJICh3aGljaCBzZWVtcyByZWFzb25hYmxlKQorICogSSBoYXZlIHRvIHRoYW5rIEludGVsIGZvciB0aGUgaGFpciBsb3NzIEkgaW5jdXJyZWQgdHJ5aW5nIHRvIGZpZ3VyZQorICogb3V0IHdoeSBQWEUgd2FzIG1pcy1yZWFkaW5nIHN0cnVjdHVyZXMgSSB3YXMgcGFzc2luZyBpdCAoYXQgbGVhc3QKKyAqIGZyb20gbXkgcG9pbnQgb2YgdmlldykKKyAqCisgKiBTb2x1dGlvbjogdXNlIGdjYydzICdfX2F0dHJpYnV0ZV9fICgocGFja2VkKSknIHRvIGNvcnJlY3RseSBhbGlnbgorICogc3RydWN0dXJlcyBwYXNzZWQgaW50byBQWEUKKyAqIFF1ZXN0aW9uOiBkb2VzIHRoaXMgcmVhbGx5IHdvcmsgZm9yIFBYRSdzIGV4cGVjdGVkIEFCST8KKyAqLworI2RlZmluZQlQQUNLRUQJCV9fYXR0cmlidXRlX18gKChwYWNrZWQpKQorCisjZGVmaW5lCVNfU0laRShzKQlzLCBzaXplb2YocykgLSAxCisKKyNkZWZpbmUJSVBfU1RSCQkiJWQuJWQuJWQuJWQiCisjZGVmaW5lCUlQX0FSR1MoaXApCQkJCQlcCisJKGludCkoaXAgPj4gMjQpICYgMHhmZiwgKGludCkoaXAgPj4gMTYpICYgMHhmZiwgXAorCShpbnQpKGlwID4+IDgpICYgMHhmZiwgKGludClpcCAmIDB4ZmYKKworI2RlZmluZQlNQUNfU1RSCQkiJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMngiCisjZGVmaW5lCU1BQ19BUkdTKG1hYykJCQkJCVwKKwltYWNbMF0sIG1hY1sxXSwgbWFjWzJdLCBtYWNbM10sIG1hY1s0XSwgbWFjWzVdIAorCisjZGVmaW5lCVBYRU5GU1JPT1RQQVRICSIvcHhlcm9vdCIKKwordHlwZWRlZiBzdHJ1Y3QgeworCXVpbnQxNl90CQlTZWdfQWRkcjsKKwl1aW50MzJfdAkJUGh5X0FkZHI7CisJdWludDE2X3QJCVNlZ19TaXplOworfSBQQUNLRUQgU0VHREVTQ190OyAvKiBQQUNLRUQgaXMgcmVxdWlyZWQsIG90aGVyd2lzZSBnY2MgcGFkcyB0aGlzIG91dCB0byAxMgorCQkgICAgICAgYnl0ZXMgLSBtYnJvd25AZmVuc3lzdGVtcy5jby51ayAobWNiMzApIDE3LzUvMDMgKi8KKwordHlwZWRlZgl1aW50MTZfdAkJU0VHU0VMX3Q7Cit0eXBlZGVmCXVpbnQxNl90CQlQWEVOVl9TVEFUVVNfdDsKK3R5cGVkZWYJdWludDMyX3QJCUlQNF90OwordHlwZWRlZgl1aW50MzJfdAkJQUREUjMyX3Q7Cit0eXBlZGVmCXVpbnQxNl90CQlVRFBfUE9SVF90OworCisjZGVmaW5lCU1BQ19BRERSX0xFTgkJMTYKK3R5cGVkZWYJdWludDhfdAkJCU1BQ19BRERSW01BQ19BRERSX0xFTl07CisKKy8qIFBYRU5WKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworCXVpbnQ4X3QJCVNpZ25hdHVyZVs2XTsJLyogJ1BYRU5WKycgKi8KKwl1aW50MTZfdAlWZXJzaW9uOwkvKiBNU0IgPSBtYWpvciwgTFNCID0gbWlub3IgKi8KKwl1aW50OF90CQlMZW5ndGg7CQkvKiBzdHJ1Y3R1cmUgbGVuZ3RoICovCisJdWludDhfdAkJQ2hlY2tzdW07CS8qIGNoZWNrc3VtIHBhZCAqLworCVNFR09GRjE2X3QJUk1FbnRyeTsJLyogU0VHOk9GRiB0byBQWEUgZW50cnkgcG9pbnQgKi8KKwkvKiBkb24ndCB1c2UgUE1PZmZzZXQgYW5kIFBNU2VsZWN0b3IgKGZyb20gdGhlIDIuMSBQWEUgbWFudWFsKSAqLworCXVpbnQzMl90CVBNT2Zmc2V0OwkvKiBQcm90ZWN0ZWQgbW9kZSBlbnRyeSAqLworCVNFR1NFTF90CVBNU2VsZWN0b3I7CS8qIFByb3RlY3RlZCBtb2RlIHNlbGVjdG9yICovCisJU0VHU0VMX3QJU3RhY2tTZWc7CS8qIFN0YWNrIHNlZ21lbnQgYWRkcmVzcyAqLworCXVpbnQxNl90CVN0YWNrU2l6ZTsJLyogU3RhY2sgc2VnbWVudCBzaXplIChieXRlcykgKi8KKwlTRUdTRUxfdAlCQ19Db2RlU2VnOwkvKiBCQyBDb2RlIHNlZ21lbnQgYWRkcmVzcyAqLworCXVpbnQxNl90CUJDX0NvZGVTaXplOwkvKiBCQyBDb2RlIHNlZ21lbnQgc2l6ZSAoYnl0ZXMpICovCisJU0VHU0VMX3QJQkNfRGF0YVNlZzsJLyogQkMgRGF0YSBzZWdtZW50IGFkZHJlc3MgKi8KKwl1aW50MTZfdAlCQ19EYXRhU2l6ZTsJLyogQkMgRGF0YSBzZWdtZW50IHNpemUgKGJ5dGVzKSAqLworCVNFR1NFTF90CVVORElEYXRhU2VnOwkvKiBVTkRJIERhdGEgc2VnbWVudCBhZGRyZXNzICovCisJdWludDE2X3QJVU5ESURhdGFTaXplOwkvKiBVTkRJIERhdGEgc2VnbWVudCBzaXplIChieXRlcykgKi8KKwlTRUdTRUxfdAlVTkRJQ29kZVNlZzsJLyogVU5ESSBDb2RlIHNlZ21lbnQgYWRkcmVzcyAqLworCXVpbnQxNl90CVVORElDb2RlU2l6ZTsJLyogVU5ESSBDb2RlIHNlZ21lbnQgc2l6ZSAoYnl0ZXMpICovCisJU0VHT0ZGMTZfdAlQWEVQdHI7CQkvKiBTRUc6T0ZGIHRvICFQWEUgc3RydWN0LCAKKwkJCQkJICAgb25seSBwcmVzZW50IHdoZW4gVmVyc2lvbiA+IDIuMSAqLworfSBQQUNLRUQgcHhlbnZfdDsKKworLyogIVBYRSAqLwordHlwZWRlZiBzdHJ1Y3QgeworCXVpbnQ4X3QJCVNpZ25hdHVyZVs0XTsKKwl1aW50OF90CQlTdHJ1Y3RMZW5ndGg7CisJdWludDhfdAkJU3RydWN0Q2tzdW07CisJdWludDhfdAkJU3RydWN0UmV2OworCXVpbnQ4X3QJCXJlc2VydmVkXzE7CisJU0VHT0ZGMTZfdAlVTkRJUk9NSUQ7CisJU0VHT0ZGMTZfdAlCYXNlUk9NSUQ7CisJU0VHT0ZGMTZfdAlFbnRyeVBvaW50U1A7CisJU0VHT0ZGMTZfdAlFbnRyeVBvaW50RVNQOworCVNFR09GRjE2X3QJU3RhdHVzQ2FsbG91dDsKKwl1aW50OF90CQlyZXNlcnZlZF8yOworCXVpbnQ4X3QJCVNlZ0Rlc2NDbjsKKwlTRUdTRUxfdAlGaXJzdFNlbGVjdG9yOworCVNFR0RFU0NfdAlTdGFjazsKKwlTRUdERVNDX3QJVU5ESURhdGE7CisJU0VHREVTQ190CVVORElDb2RlOworCVNFR0RFU0NfdAlVTkRJQ29kZVdyaXRlOworCVNFR0RFU0NfdAlCQ19EYXRhOworCVNFR0RFU0NfdAlCQ19Db2RlOworCVNFR0RFU0NfdAlCQ19Db2RlV3JpdGU7Cit9IFBBQ0tFRCBweGVfdDsKKworI2RlZmluZQlQWEVOVl9TVEFSVF9VTkRJCQkweDAwMDAKK3R5cGVkZWYgc3RydWN0IHsKKwlQWEVOVl9TVEFUVVNfdAlTdGF0dXM7CisJdWludDE2X3QJYXg7CisJdWludDE2X3QJYng7CisJdWludDE2X3QJZHg7CisJdWludDE2X3QJZGk7CisJdWludDE2X3QJZXM7Cit9IFBBQ0tFRCB0X1BYRU5WX1NUQVJUX1VOREk7CisKKyNkZWZpbmUJUFhFTlZfVU5ESV9TVEFSVFVQCQkweDAwMDEKK3R5cGVkZWYgc3RydWN0IHsKKwlQWEVOVl9TVEFUVVNfdAlTdGF0dXM7Cit9IFBBQ0tFRCB0X1BYRU5WX1VORElfU1RBUlRVUDsKKworI2RlZmluZQlQWEVOVl9VTkRJX0NMRUFOVVAJCTB4MDAwMgordHlwZWRlZiBzdHJ1Y3QgeworCVBYRU5WX1NUQVRVU190CVN0YXR1czsKK30gUEFDS0VEIHRfUFhFTlZfVU5ESV9DTEVBTlVQOworCisjZGVmaW5lCVBYRU5WX1VORElfSU5JVElBTElaRQkJMHgwMDAzCit0eXBlZGVmIHN0cnVjdCB7CisJUFhFTlZfU1RBVFVTX3QJU3RhdHVzOworCUFERFIzMl90CVByb3RvY29sSW5pOwkvKiBQaHlzIGFkZHIgb2YgYSBjb3B5IG9mIHRoZSBkcml2ZXIgbW9kdWxlICovCisJdWludDhfdAkJcmVzZXJ2ZWRbOF07Cit9IFBBQ0tFRCB0X1BYRU5WX1VORElfSU5JVElBTElaRTsKKworCisjZGVmaW5lCU1BWE5VTV9NQ0FERFIJCTgKK3R5cGVkZWYgc3RydWN0IHsKKwl1aW50MTZfdAlNQ2FzdEFkZHJDb3VudDsKKwlNQUNfQUREUglNY2FzdEFkZHJbTUFYTlVNX01DQUREUl07Cit9IFBBQ0tFRCB0X1BYRU5WX1VORElfTUNBU1RfQUREUkVTUzsKKworI2RlZmluZQlQWEVOVl9VTkRJX1JFU0VUX0FEQVBURVIJMHgwMDA0CQkKK3R5cGVkZWYgc3RydWN0IHsKKwlQWEVOVl9TVEFUVVNfdAlTdGF0dXM7CisJdF9QWEVOVl9VTkRJX01DQVNUX0FERFJFU1MgUl9NY2FzdF9CdWY7Cit9IFBBQ0tFRCB0X1BYRU5WX1VORElfUkVTRVQ7CisKKyNkZWZpbmUJUFhFTlZfVU5ESV9TSFVURE9XTgkJMHgwMDA1Cit0eXBlZGVmIHN0cnVjdCB7CisJUFhFTlZfU1RBVFVTX3QJU3RhdHVzOworfSBQQUNLRUQgdF9QWEVOVl9VTkRJX1NIVVRET1dOOworCisjZGVmaW5lCVBYRU5WX1VORElfT1BFTgkJCTB4MDAwNgordHlwZWRlZiBzdHJ1Y3QgeworCVBYRU5WX1NUQVRVU190CVN0YXR1czsKKwl1aW50MTZfdAlPcGVuRmxhZzsKKwl1aW50MTZfdAlQa3RGaWx0ZXI7CisjCWRlZmluZSBGTFRSX0RJUkVDVEVECTB4MDAwMQorIwlkZWZpbmUgRkxUUl9CUkRDU1QJMHgwMDAyCisjCWRlZmluZSBGTFRSX1BSTVNDUwkweDAwMDMKKyMJZGVmaW5lIEZMVFJfU1JDX1JURwkweDAwMDQKKworCXRfUFhFTlZfVU5ESV9NQ0FTVF9BRERSRVNTIFJfTWNhc3RfQnVmOworfSBQQUNLRUQgdF9QWEVOVl9VTkRJX09QRU47CisKKyNkZWZpbmUJUFhFTlZfVU5ESV9DTE9TRQkJMHgwMDA3Cit0eXBlZGVmIHN0cnVjdCB7CisJUFhFTlZfU1RBVFVTX3QJU3RhdHVzOworfSBQQUNLRUQgdF9QWEVOVl9VTkRJX0NMT1NFOworCisjZGVmaW5lCVBYRU5WX1VORElfVFJBTlNNSVQJCTB4MDAwOAordHlwZWRlZiBzdHJ1Y3QgeworCVBYRU5WX1NUQVRVU190CVN0YXR1czsKKwl1aW50OF90CQlQcm90b2NvbDsKKyMJZGVmaW5lIFBfVU5LTk9XTgkwCisjCWRlZmluZSBQX0lQCQkxCisjCWRlZmluZSBQX0FSUAkJMgorIwlkZWZpbmUgUF9SQVJQCQkzCisKKwl1aW50OF90CQlYbWl0RmxhZzsKKyMJZGVmaW5lIFhNVF9ERVNUQUREUgkweDAwMDAKKyMJZGVmaW5lIFhNVF9CUk9BRENBU1QJMHgwMDAxCisKKwlTRUdPRkYxNl90CURlc3RBZGRyOworCVNFR09GRjE2X3QJVEJEOworCXVpbnQzMl90CVJlc2VydmVkWzJdOworfSBQQUNLRUQgdF9QWEVOVl9VTkRJX1RSQU5TTUlUOworCisjZGVmaW5lCU1BWF9EQVRBX0JMS1MJCTgKK3R5cGVkZWYgc3RydWN0IHsKKwl1aW50MTZfdAlJbW1lZExlbmd0aDsKKwlTRUdPRkYxNl90CVhtaXQ7CisJdWludDE2X3QJRGF0YUJsa0NvdW50OworCXN0cnVjdAlEYXRhQmxrIHsKKwkJdWludDhfdAkJVERQdHJUeXBlOworCQl1aW50OF90CQlURFJzdmRCeXRlOworCQl1aW50MTZfdAlURERhdGFMZW47CisJCVNFR09GRjE2X3QJVEREYXRhUHRyOworCX0gRGF0YUJsb2NrW01BWF9EQVRBX0JMS1NdOworfSBQQUNLRUQgdF9QWEVOVl9VTkRJX1RCRDsKKworI2RlZmluZQlQWEVOVl9VTkRJX1NFVF9NQ0FTVF9BRERSRVNTCTB4MDAwOQordHlwZWRlZiBzdHJ1Y3QgeworCVBYRU5WX1NUQVRVU190CVN0YXR1czsKKwl0X1BYRU5WX1VORElfTUNBU1RfQUREUkVTUyBSX01jYXN0X0J1ZjsKK30gUEFDS0VEIHRfUFhFTlZfVU5ESV9TRVRfTUNBU1RfQUREUjsKKworI2RlZmluZQlQWEVOVl9VTkRJX1NFVF9TVEFUSU9OX0FERFJFU1MJMHgwMDBBCit0eXBlZGVmIHN0cnVjdCB7CisJUFhFTlZfU1RBVFVTX3QJU3RhdHVzOworCU1BQ19BRERSCVN0YXRpb25BZGRyZXNzOwkJLyogVGVtcCBNQUMgYWRkcmVzIHRvIHVzZSAqLworfSBQQUNLRUQgdF9QWEVOVl9VTkRJX1NFVF9TVEFUSU9OX0FERFJFU1M7CisKKyNkZWZpbmUJUFhFTlZfVU5ESV9TRVRfUEFDS0VUX0ZJTFRFUgkweDAwMEIKK3R5cGVkZWYgc3RydWN0IHsKKwlQWEVOVl9TVEFUVVNfdAlTdGF0dXM7CisJdWludDhfdAkJZmlsdGVyOwkJCS8qIHNlZSBVTkRJX09QRU4gKDB4MDAwNikgKi8KK30gUEFDS0VEIHRfUFhFTlZfVU5ESV9TRVRfUEFDS0VUX0ZJTFRFUjsKKworI2RlZmluZQlQWEVOVl9VTkRJX0dFVF9JTkZPUk1BVElPTgkweDAwMEMKK3R5cGVkZWYgc3RydWN0IHsKKwlQWEVOVl9TVEFUVVNfdAlTdGF0dXM7CisJdWludDE2X3QJQmFzZUlvOwkJCS8qIEFkYXB0ZXIgYmFzZSBJL08gYWRkcmVzcyAqLworCXVpbnQxNl90CUludE51bWJlcjsJCS8qIEFkYXB0ZXIgSVJRIG51bWJlciAqLworCXVpbnQxNl90CU1heFRyYW5Vbml0OwkJLyogQWRhcHRlciBtYXhpbXVtIHRyYW5zbWl0IHVuaXQgKi8KKwl1aW50MTZfdAlId1R5cGU7CQkJLyogVHlwZSBvZiBwcm90b2NvbCBhdCB0aGUgaGFyZHdhcmUgYWRkciAqLworIwlkZWZpbmUgRVRIRVJfVFlQRQkxCisjCWRlZmluZSBFWFBfRVRIRVJfVFlQRQkyCisjCWRlZmluZSBJRUVFX1RZUEUJNgorIwlkZWZpbmUgQVJDTkVUX1RZUEUJNworCisJdWludDE2X3QJSHdBZGRyTGVuOwkJLyogTGVuZ3RoIG9mIGhhcmR3YXJlIGFkZHJlc3MgKi8KKwlNQUNfQUREUglDdXJyZW50Tm9kZUFkZHJlc3M7CS8qIEN1cnJlbnQgaGFyZHdhcmUgYWRkcmVzcyAqLworCU1BQ19BRERSCVBlcm1Ob2RlQWRkcmVzczsJLyogUGVybWFuZW50IGhhcmR3YXJlIGFkZHJlc3MgKi8KKwlTRUdTRUxfdAlST01BZGRyZXNzOwkJLyogUmVhbCBtb2RlIFJPTSBzZWdtZW50IGFkZHJlc3MgKi8KKwl1aW50MTZfdAlSeEJ1ZkN0OwkJLyogUmVjZWl2ZSBxdWV1ZSBsZW5ndGggKi8KKwl1aW50MTZfdAlUeEJ1ZkN0OwkJLyogVHJhbnNtaXQgcXVldWUgbGVuZ3RoICovCit9IFBBQ0tFRCB0X1BYRU5WX1VORElfR0VUX0lORk9STUFUSU9OOworCisjZGVmaW5lCVBYRU5WX1VORElfR0VUX1NUQVRJU1RJQ1MJMHgwMDBECit0eXBlZGVmIHN0cnVjdCB7CisJUFhFTlZfU1RBVFVTX3QJU3RhdHVzOworCXVpbnQzMl90CVhtaXRHb29kRnJhbWVzOwkJLyogTnVtYmVyIG9mIHN1Y2Nlc3NmdWwgdHJhbnNtaXNzaW9ucyAqLworCXVpbnQzMl90CVJjdkdvb2RGcmFtZXM7CQkvKiBOdW1iZXIgb2YgZ29vZCBmcmFtZXMgcmVjZWl2ZWQgKi8KKwl1aW50MzJfdAlSY3ZDUkNFcnJvcnM7CQkvKiBOdW1iZXIgb2YgZnJhbWVzIHdpdGggQ1JDIGVycm9ycyAqLworCXVpbnQzMl90CVJjdlJlc291cmNlRXJyb3JzOwkvKiBOdW1iZXIgb2YgZnJhbWVzIGRyb3BwZWQgKi8KK30gUEFDS0VEIHRfUFhFTlZfVU5ESV9HRVRfU1RBVElTVElDUzsKKworI2RlZmluZQlQWEVOVl9VTkRJX0NMRUFSX1NUQVRJU1RJQ1MJMHgwMDBFCit0eXBlZGVmIHN0cnVjdCB7CisJUFhFTlZfU1RBVFVTX3QJU3RhdHVzOworfSBQQUNLRUQgdF9QWEVOVl9VTkRJX0NMRUFSX1NUQVRJU1RJQ1M7CisKKyNkZWZpbmUJUFhFTlZfVU5ESV9JTklUSUFURV9ESUFHUwkweDAwMEYKK3R5cGVkZWYgc3RydWN0IHsKKwlQWEVOVl9TVEFUVVNfdAlTdGF0dXM7Cit9IFBBQ0tFRCB0X1BYRU5WX1VORElfSU5JVElBVEVfRElBR1M7CisKKyNkZWZpbmUJUFhFTlZfVU5ESV9GT1JDRV9JTlRFUlJVUFQJMHgwMDEwCit0eXBlZGVmIHN0cnVjdCB7CisJUFhFTlZfU1RBVFVTX3QJU3RhdHVzOworfSBQQUNLRUQgdF9QWEVOVl9VTkRJX0ZPUkNFX0lOVEVSUlVQVDsKKworI2RlZmluZQlQWEVOVl9VTkRJX0dFVF9NQ0FTVF9BRERSRVNTCTB4MDAxMQordHlwZWRlZiBzdHJ1Y3QgeworCVBYRU5WX1NUQVRVU190CVN0YXR1czsKKwlJUDRfdAkJSW5ldEFkZHI7CQkvKiBJUCBtdWxpY2FzdCBhZGRyZXNzICovCisJTUFDX0FERFIJTWVkaWFBZGRyOwkJLyogTUFDIG11bHRpY2FzdCBhZGRyZXNzICovCit9IFBBQ0tFRCB0X1BYRU5WX1VORElfR0VUX01DQVNUX0FERFI7CisKKyNkZWZpbmUJUFhFTlZfVU5ESV9HRVRfTklDX1RZUEUJCTB4MDAxMgordHlwZWRlZiBzdHJ1Y3QgeworCVBYRU5WX1NUQVRVU190CVN0YXR1czsKKwl1aW50OF90CQlOaWNUeXBlOwkJLyogVHlwZSBvZiBOSUMgKi8KKyMJZGVmaW5lIFBDSV9OSUMJCTIKKyMJZGVmaW5lIFBuUF9OSUMJCTMKKyMJZGVmaW5lIENhcmRCdXNfTklDCTQKKworCXVuaW9uIHsKKwkJc3RydWN0IHsKKwkJCXVpbnQxNl90CVZlbmRvcl9JRDsKKwkJCXVpbnQxNl90CURldl9JRDsKKwkJCXVpbnQ4X3QJCUJhc2VfQ2xhc3M7CisJCQl1aW50OF90CQlTdWJfQ2xhc3M7CisJCQl1aW50OF90CQlQcm9nX0ludGY7CisJCQl1aW50OF90CQlSZXY7CisJCQl1aW50MTZfdAlCdXNEZXZGdW5jOworCQkJdWludDE2X3QJU3ViVmVuZG9yX0lEOworCQkJdWludDE2X3QJU3ViRGV2aWNlX0lEOworCQl9IHBjaSwgY2FyZGJ1czsKKwkJc3RydWN0IHsKKwkJCXVpbnQzMl90CUVJU0FfRGV2X0lEOworCQkJdWludDhfdAkJQmFzZV9DbGFzczsKKwkJCXVpbnQ4X3QJCVN1Yl9DbGFzczsKKwkJCXVpbnQ4X3QJCVByb2dfSW50ZjsKKwkJCXVpbnQxNl90CUNhcmRTZWxOdW07CisJCX0gcG5wOworCX0gaW5mbzsKK30gUEFDS0VEIHRfUFhFTlZfVU5ESV9HRVRfTklDX1RZUEU7CisKKyNkZWZpbmUJUFhFTlZfVU5ESV9HRVRfSUZBQ0VfSU5GTwkweDAwMTMKK3R5cGVkZWYgc3RydWN0IHsKKwlQWEVOVl9TVEFUVVNfdAlTdGF0dXM7CisJdWludDhfdAkJSWZhY2VUeXBlWzE2XTsJCS8qIE5hbWUgb2YgTUFDIHR5cGUgaW4gQVNDSUkuICovCisJdWludDMyX3QJTGlua1NwZWVkOwkJLyogRGVmaW5lZCBpbiBORElTIDIuMCBzcGVjICovCisJdWludDMyX3QJU2VydmljZUZsYWdzOwkJLyogRGVmaW5lZCBpbiBORElTIDIuMCBzcGVjICovCisJdWludDMyX3QJUmVzZXJ2ZWRbNF07CQkvKiBtdXN0IGJlIDAgKi8KK30gUEFDS0VEIHRfUFhFTlZfVU5ESV9HRVRfSUZBQ0VfSU5GTzsKKworI2RlZmluZQlQWEVOVl9VTkRJX0lTUgkJCTB4MDAxNAordHlwZWRlZiBzdHJ1Y3QgeworCVBYRU5WX1NUQVRVU190CVN0YXR1czsKKwl1aW50MTZfdAlGdW5jRmxhZzsJCS8qIFBYRU5WX1VORElfSVNSX09VVF94eHggKi8KKwl1aW50MTZfdAlCdWZmZXJMZW5ndGg7CQkvKiBMZW5ndGggb2YgRnJhbWUgKi8KKwl1aW50MTZfdAlGcmFtZUxlbmd0aDsJCS8qIFRvdGFsIGxlbmd0aCBvZiByZWNpZXZlciBmcmFtZSAqLworCXVpbnQxNl90CUZyYW1lSGVhZGVyTGVuZ3RoOwkvKiBMZW5ndGggb2YgdGhlIG1lZGlhIGhlYWRlciBpbiBGcmFtZSAqLworCVNFR09GRjE2X3QJRnJhbWU7CQkJLyogcmVjZWl2ZSBidWZmZXIgKi8KKwl1aW50OF90CQlQcm90VHlwZTsJCS8qIFByb3RvY29sIHR5cGUgKi8KKwl1aW50OF90CQlQa3RUeXBlOwkJLyogUGFja2V0IFR5cGUgKi8KKyMJZGVmaW5lIFBYRU5WX1VORElfSVNSX0lOX1NUQVJUCQkxCisjCWRlZmluZSBQWEVOVl9VTkRJX0lTUl9JTl9QUk9DRVNTCTIKKyMJZGVmaW5lIFBYRU5WX1VORElfSVNSX0lOX0dFVF9ORVhUCTMKKworCS8qIG9uZSBvZiB0aGVzZSB3aWxsIGJlIHJldHVybmVkIGZvciBQWEVOVl9VTkRJX0lTUl9JTl9TVEFSVCAqLworIwlkZWZpbmUgUFhFTlZfVU5ESV9JU1JfT1VUX09VUlMJCTAKKyMJZGVmaW5lIFBYRU5WX1VORElfSVNSX09VVF9OT1RfT1VSUwkxCisKKwkvKgorCSAqIG9uZSBvZiB0aGVzZSB3aWxsIGJyZSByZXR1cm5kIGZvciBQWEVORF9VTkRJX0lTUl9JTl9QUk9DRVNTCisJICogYW5kIFBYRU5WX1VORElfSVNSX0lOX0dFVF9ORVhUCisJICovCisjCWRlZmluZSBQWEVOVl9VTkRJX0lTUl9PVVRfRE9ORQkJMAorIwlkZWZpbmUgUFhFTlZfVU5ESV9JU1JfT1VUX1RSQU5TTUlUCTIKKyMJZGVmaW5lIFBYRU5WX1VORElfSVNSX09VVF9SRUNFSVZFCTMKKyMJZGVmaW5lIFBYRU5WX1VORElfSVNSX09VVF9CVVNZCQk0Cit9IFBBQ0tFRCB0X1BYRU5WX1VORElfSVNSOworCisjZGVmaW5lCVBYRU5WX1NUT1BfVU5ESQkJCTB4MDAxNQordHlwZWRlZiBzdHJ1Y3QgeworCVBYRU5WX1NUQVRVU190CVN0YXR1czsKK30gUEFDS0VEIHRfUFhFTlZfU1RPUF9VTkRJOworCisjZGVmaW5lCVBYRU5WX1RGVFBfT1BFTgkJCTB4MDAyMAordHlwZWRlZiBzdHJ1Y3QgeworCVBYRU5WX1NUQVRVU190CVN0YXR1czsKKwlJUDRfdAkJU2VydmVySVBBZGRyZXNzOworCUlQNF90CQlHYXRld2F5SVBBZGRyZXNzOworCXVpbnQ4X3QJCUZpbGVOYW1lWzEyOF07CisJVURQX1BPUlRfdAlURlRQUG9ydDsKKwl1aW50MTZfdAlQYWNrZXRTaXplOworfSBQQUNLRUQgdF9QWEVOVl9URlRQX09QRU47CisKKyNkZWZpbmUJUFhFTlZfVEZUUF9DTE9TRQkJMHgwMDIxCit0eXBlZGVmIHN0cnVjdCB7CisJUFhFTlZfU1RBVFVTX3QJU3RhdHVzOworfSBQQUNLRUQgdF9QWEVOVl9URlRQX0NMT1NFOworCisjZGVmaW5lCVBYRU5WX1RGVFBfUkVBRAkJCTB4MDAyMgordHlwZWRlZiBzdHJ1Y3QgeworCVBYRU5WX1NUQVRVU190CVN0YXR1czsKKwl1aW50MTZfdAlQYWNrZXROdW1iZXI7CisJdWludDE2X3QJQnVmZmVyU2l6ZTsKKwlTRUdPRkYxNl90CUJ1ZmZlcjsKK30gUEFDS0VEIHRfUFhFTlZfVEZUUF9SRUFEOworCisjZGVmaW5lCVBYRU5WX1RGVFBfUkVBRF9GSUxFCQkweDAwMjMKK3R5cGVkZWYgc3RydWN0IHsKKwlQWEVOVl9TVEFUVVNfdAlTdGF0dXM7CisJdWludDhfdAkJRmlsZU5hbWVbMTI4XTsKKwl1aW50MzJfdAlCdWZmZXJTaXplOworCUFERFIzMl90CUJ1ZmZlcjsKKwlJUDRfdAkJU2VydmVySVBBZGRyZXNzOworCUlQNF90CQlHYXRld2F5SVBBZHJlc3M7CisJSVA0X3QJCU1jYXN0SVBBZHJlc3M7CisJVURQX1BPUlRfdAlURlRQQ2xudFBvcnQ7CisJVURQX1BPUlRfdAlURlRQU3J2UG9ydDsKKwl1aW50MTZfdAlURlRQT3BlblRpbWVPdXQ7CisJdWludDE2X3QJVEZUUFJlb3BlbkRlbGF5OworfSBQQUNLRUQgdF9QWEVOVl9URlRQX1JFQURfRklMRTsKKworI2RlZmluZQlQWEVOVl9URlRQX0dFVF9GU0laRQkJMHgwMDI1Cit0eXBlZGVmIHN0cnVjdCB7CisJUFhFTlZfU1RBVFVTX3QJU3RhdHVzOworCUlQNF90CQlTZXJ2ZXJJUEFkZHJlc3M7CisJSVA0X3QJCUdhdGV3YXlJUEFkcmVzczsKKwl1aW50OF90CQlGaWxlTmFtZVsxMjhdOworCXVpbnQzMl90CUZpbGVTaXplOworfSBQQUNLRUQgdF9QWEVOVl9URlRQX0dFVF9GU0laRTsKKworI2RlZmluZQlQWEVOVl9VRFBfT1BFTgkJCTB4MDAzMAordHlwZWRlZiBzdHJ1Y3QgeworCVBYRU5WX1NUQVRVU190CVN0YXR1czsKKwlJUDRfdAkJc3JjX2lwOwkJLyogSVAgYWRkcmVzcyBvZiB0aGlzIHN0YXRpb24gKi8KK30gUEFDS0VEIHRfUFhFTlZfVURQX09QRU47CisKKyNkZWZpbmUJUFhFTlZfVURQX0NMT1NFCQkJMHgwMDMxCit0eXBlZGVmIHN0cnVjdCB7CisJUFhFTlZfU1RBVFVTX3QJc3RhdHVzOworfSBQQUNLRUQgdF9QWEVOVl9VRFBfQ0xPU0U7CisKKyNkZWZpbmUJUFhFTlZfVURQX1JFQUQJCQkweDAwMzIKK3R5cGVkZWYgc3RydWN0IHsKKwlQWEVOVl9TVEFUVVNfdAlzdGF0dXM7CisJSVA0X3QJCXNyY19pcDsJCS8qIElQIG9mIHNlbmRlciAqLworCUlQNF90CQlkZXN0X2lwOwkvKiBPbmx5IGFjY2VwdCBwYWNrZXRzIHNlbnQgdG8gdGhpcyBJUCAqLworCVVEUF9QT1JUX3QJc19wb3J0OwkJLyogVURQIHNvdXJjZSBwb3J0IG9mIHNlbmRlciAqLworCVVEUF9QT1JUX3QJZF9wb3J0OwkJLyogT25seSBhY2NlcHQgcGFja2V0cyBzZW50IHRvIHRoaXMgcG9ydCAqLworCXVpbnQxNl90CWJ1ZmZlcl9zaXplOwkvKiBTaXplIG9mIHRoZSBwYWNrZXQgYnVmZmVyICovCisJU0VHT0ZGMTZfdAlidWZmZXI7CQkvKiBTRUc6T0ZGIHRvIHRoZSBwYWNrZXQgYnVmZmVyICovCit9IFBBQ0tFRCB0X1BYRU5WX1VEUF9SRUFEOworCisjZGVmaW5lCVBYRU5WX1VEUF9XUklURQkJCTB4MDAzMwordHlwZWRlZiBzdHJ1Y3QgeworCVBYRU5WX1NUQVRVU190CXN0YXR1czsKKwlJUDRfdAkJaXA7CQkvKiBkZXN0IGlwIGFkZHIgKi8KKwlJUDRfdAkJZ3c7CQkvKiBpcCBnYXRld2F5ICovCisJVURQX1BPUlRfdAlzcmNfcG9ydDsJLyogc291cmNlIHVkcCBwb3J0ICovCisJVURQX1BPUlRfdAlkc3RfcG9ydDsJLyogZGVzdGluYXRpb24gdWRwIHBvcnQgKi8KKwl1aW50MTZfdAlidWZmZXJfc2l6ZTsJLyogU2l6ZSBvZiB0aGUgcGFja2V0IGJ1ZmZlciAqLworCVNFR09GRjE2X3QJYnVmZmVyOwkJLyogU0VHOk9GRiB0byB0aGUgcGFja2V0IGJ1ZmZlciAqLworfSBQQUNLRUQgdF9QWEVOVl9VRFBfV1JJVEU7CisKKyNkZWZpbmUJUFhFTlZfVU5MT0FEX1NUQUNLCQkweDAwNzAKK3R5cGVkZWYgc3RydWN0IHsKKwlQWEVOVl9TVEFUVVNfdAlTdGF0dXM7CisJdWludDhfdAkJcmVzZXJ2ZWRbMTBdOworfSBQQUNLRUQgdF9QWEVOVl9VTkxPQURfU1RBQ0s7CisKKworI2RlZmluZQlQWEVOVl9HRVRfQ0FDSEVEX0lORk8JCTB4MDA3MQordHlwZWRlZiBzdHJ1Y3QgeworCVBYRU5WX1NUQVRVU190CVN0YXR1czsKKwl1aW50MTZfdAlQYWNrZXRUeXBlOwkvKiB0eXBlIChkZWZpbmVkIHJpZ2h0IGhlcmUpICovCisjCWRlZmluZSBQWEVOVl9QQUNLRVRfVFlQRV9ESENQX0RJU0NPVkVSICAxCisjCWRlZmluZSBQWEVOVl9QQUNLRVRfVFlQRV9ESENQX0FDSyAgICAgICAyCisjCWRlZmluZSBQWEVOVl9QQUNLRVRfVFlQRV9CSU5MX1JFUExZICAgICAzCisJdWludDE2X3QJQnVmZmVyU2l6ZTsJLyogbWF4IHRvIGNvcHksIGxlYXZlIGF0IDAgZm9yIHBvaW50ZXIgKi8KKwlTRUdPRkYxNl90CUJ1ZmZlcjsJCS8qIGNvcHkgdG8sIGxlYXZlIGF0IDAgZm9yIHBvaW50ZXIgKi8KKwl1aW50MTZfdAlCdWZmZXJMaW1pdDsJLyogbWF4IHNpemUgb2YgYnVmZmVyIGluIEJDIGRhdGFzZWcgPyAqLworfSBQQUNLRUQgdF9QWEVOVl9HRVRfQ0FDSEVEX0lORk87CisKKworLyogc3RydWN0dXJlIGZpbGxlZCBpbiBieSBQWEVOVl9HRVRfQ0FDSEVEX0lORk8gCisgKiAoaG93IHdlIGRldGVybWluZSB3aGljaCBJUCB3ZSBkb3dubG9hZGVkIHRoZSBpbml0aWFsIGJvb3RzdHJhcCBmcm9tKQorICogd29yZHMgY2FuJ3QgZGVzY3JpYmUuLi4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworCXVpbnQ4X3QJCW9wY29kZTsKKyMJZGVmaW5lIEJPT1RQX1JFUQkxCisjCWRlZmluZSBCT09UUF9SRVAJMgorCXVpbnQ4X3QJCUhhcmR3YXJlOwkvKiBoYXJkd2FyZSB0eXBlICovCisJdWludDhfdAkJSGFyZGxlbjsJLyogaGFyZHdhcmUgYWRkciBsZW4gKi8KKwl1aW50OF90CQlHYXRlaG9wczsJLyogemVybyBpdCAqLworCXVpbnQzMl90CWlkZW50OwkJLyogcmFuZG9tIG51bWJlciBjaG9zZW4gYnkgY2xpZW50ICovCisJdWludDE2X3QJc2Vjb25kczsJLyogc2Vjb25kcyBzaW5jZSBkaWQgaW5pdGlhbCBib290c3RyYXAgKi8KKwl1aW50MTZfdAlGbGFnczsJCS8qIHNlY29uZHMgc2luY2UgZGlkIGluaXRpYWwgYm9vdHN0cmFwICovCisjCWRlZmluZSBCT09UUF9CQ0FTVAkweDgwMDAJCS8qID8gKi8KKwlJUDRfdAkJY2lwOwkJLyogQ2xpZW50IElQICovCisJSVA0X3QJCXlpcDsJCS8qIFlvdXIgSVAgKi8KKwlJUDRfdAkJc2lwOwkJLyogSVAgdG8gdXNlIGZvciBuZXh0IGJvb3Qgc3RhZ2UgKi8KKwlJUDRfdAkJZ2lwOwkJLyogUmVsYXkgSVAgPyAqLworCU1BQ19BRERSCUNBZGRyOwkJLyogQ2xpZW50IGhhcmR3YXJlIGFkZHJlc3MgKi8KKwl1aW50OF90CQlTbmFtZVs2NF07CS8qIFNlcnZlcidzIGhvc3RuYW1lIChPcHRpb25hbCkgKi8KKwl1aW50OF90CQlib290ZmlsZVsxMjhdOwkvKiBib290IGZpbGVuYW1lICovCisJdW5pb24geworIwkJaWYgMQorIwkJZGVmaW5lIEJPT1RQX0RIQ1BWRU5EICAxMDI0ICAgIC8qIERIQ1AgZXh0ZW5kZWQgdmVuZG9yIGZpZWxkIHNpemUgKi8KKyMJCWVsc2UKKyMJCWRlZmluZSBCT09UUF9ESENQVkVORCAgMzEyCS8qIERIQ1Agc3RhbmRhcmQgdmVuZG9yIGZpZWxkIHNpemUgKi8KKyMJCWVuZGlmCisJCXVpbnQ4X3QJCWRbQk9PVFBfREhDUFZFTkRdOwkvKiByYXcgYXJyYXkgb2YgdmVuZG9yL2RoY3Agb3B0aW9ucyAqLworCQlzdHJ1Y3QgeworCQkJdWludDhfdAkJbWFnaWNbNF07CS8qIERIQ1AgbWFnaWMgY29va2llICovCisjCQkJaWZuZGVmCQlWTV9SRkMxMDQ4CisjCQkJZGVmaW5lCQlWTV9SRkMxMDQ4CTB4NjM4MjUzNjNMCS8qID8gKi8KKyMJCQllbmRpZgorCQkJdWludDMyX3QJZmxhZ3M7CQkvKiBib290cCBmbGFncy9vcGNvZGVzICovCisJCQl1aW50OF90CQlwYWRbNTZdOwkvKiBJIGRvbid0IHRoaW5rIGludGVsIGtub3dzIHdoYXQgYQorCQkJCQkJCSAgIHVuaW9uIGRvZXMuLi4gKi8KKwkJfSB2OworCX0gdmVuZG9yOworfSBQQUNLRUQgQk9PVFBMQVlFUjsKKworI2RlZmluZQlQWEVOVl9SRVNUQVJUX1RGVFAJCTB4MDA3MworI2RlZmluZQl0X1BYRU5WX1JFU1RBUlRfVEZUUAkJdF9QWEVOVl9URlRQX1JFQURfRklMRQorCisjZGVmaW5lCVBYRU5WX1NUQVJUX0JBU0UJCTB4MDA3NQordHlwZWRlZiBzdHJ1Y3QgeworCVBYRU5WX1NUQVRVU190CVN0YXR1czsKK30gUEFDS0VEIHRfUFhFTlZfU1RBUlRfQkFTRTsKKworI2RlZmluZQlQWEVOVl9TVE9QX0JBU0UJCQkweDAwNzYKK3R5cGVkZWYgc3RydWN0IHsKKwlQWEVOVl9TVEFUVVNfdAlTdGF0dXM7Cit9IFBBQ0tFRCB0X1BYRU5WX1NUT1BfQkFTRTsKZGlmZiAtTmF1ciBncnViLTAuOTcub3JpZy9uZXRib290L3I4MTY5LmMgZ3J1Yi0wLjk3L25ldGJvb3QvcjgxNjkuYwotLS0gZ3J1Yi0wLjk3Lm9yaWcvbmV0Ym9vdC9yODE2OS5jCTE5NzAtMDEtMDEgMDA6MDA6MDAuMDAwMDAwMDAwICswMDAwCisrKyBncnViLTAuOTcvbmV0Ym9vdC9yODE2OS5jCTIwMDUtMDgtMzEgMTk6MDM6MzUuMDAwMDAwMDAwICswMDAwCkBAIC0wLDAgKzEsODU0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogICAgcjgxNjkuYzogRXRoZXJib290IGRldmljZSBkcml2ZXIgZm9yIHRoZSBSZWFsVGVrIFJUTC04MTY5IEdpZ2FiaXQKKyogICAgV3JpdHRlbiAyMDAzIGJ5IFRpbW90aHkgTGVnZ2UgPHRsZWdnZUByb2dlcnMuY29tPgorKgorKiAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorKiAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorKiAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKiAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorKgorKiAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyogICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyogICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorKiAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorKgorKiAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorKiAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorKiAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyoKKyogICAgUG9ydGlvbnMgb2YgdGhpcyBjb2RlIGJhc2VkIG9uOgorKglyODE2OS5jOiBBIFJlYWxUZWsgUlRMLTgxNjkgR2lnYWJpdCBFdGhlcm5ldCBkcml2ZXIgCisqIAkJZm9yIExpbnV4IGtlcm5lbCAyLjQueC4KKyoKKyogICAgV3JpdHRlbiAyMDAyIFNodUNoZW4gPHNodWNoZW5AcmVhbHRlay5jb20udHc+CisqCSAgU2VlIExpbnV4IERyaXZlciBmb3IgZnVsbCBpbmZvcm1hdGlvbgorKgkKKyogICAgTGludXggRHJpdmVyIFZlcnNpb24gMS4yN2EsIDEwLjAyLjIwMDIKKyogCisqICAgIFRoYW5rcyB0bzoKKyogICAgCUplYW4gQ2hlbiBvZiBSZWFsVGVrIFNlbWljb25kdWN0b3IgQ29ycC4gZm9yCisqICAgIAlwcm92aWRpbmcgdGhlIGV2YWx1YXRpb24gTklDIHVzZWQgdG8gZGV2ZWxvcCAKKyogICAgCXRoaXMgZHJpdmVyLiAgUmVhbFRlaydzIHN1cHBvcnQgZm9yIEV0aGVyYm9vdCAKKyogICAgCWlzIGFwcHJlY2lhdGVkLgorKiAgICAJCisqICAgIFJFVklTSU9OIEhJU1RPUlk6CisqICAgID09PT09PT09PT09PT09PT0KKyoKKyogICAgdjEuMAkxMS0yNi0yMDAzCXRpbWxlZ2dlCUluaXRpYWwgcG9ydCBvZiBMaW51eCBkcml2ZXIKKyogICAgdjEuNQkwMS0xNy0yMDA0CXRpbWxlZ2dlCUluaXRpYWwgZHJpdmVyIG91dHB1dCBjbGVhbnVwCisqICAgIHYxLjYJMDMtMjctMjAwNAl0aW1sZWdnZQlBZGRpdGlvbmFsIENsZWFudXAKKyogICAgCisqICAgIEluZGVudCBPcHRpb25zOiBpbmRlbnQgLWtyIC1pOAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiB0byBnZXQgc29tZSBnbG9iYWwgcm91dGluZXMgbGlrZSBwcmludGYgKi8KKyNpbmNsdWRlICJldGhlcmJvb3QuaCIKKy8qIHRvIGdldCB0aGUgaW50ZXJmYWNlIHRvIHRoZSBib2R5IG9mIHRoZSBwcm9ncmFtICovCisjaW5jbHVkZSAibmljLmgiCisvKiB0byBnZXQgdGhlIFBDSSBzdXBwb3J0IGZ1bmN0aW9ucywgaWYgdGhpcyBpcyBhIFBDSSBOSUMgKi8KKyNpbmNsdWRlICJwY2kuaCIKKyNpbmNsdWRlICJ0aW1lci5oIgorCisjZGVmaW5lIGRydl92ZXJzaW9uICJ2MS42IgorI2RlZmluZSBkcnZfZGF0ZSAiMDMtMjctMjAwNCIKKwordHlwZWRlZiB1bnNpZ25lZCBjaGFyIHU4OwordHlwZWRlZiBzaWduZWQgY2hhciBzODsKK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQgdTE2OwordHlwZWRlZiBzaWduZWQgc2hvcnQgczE2OwordHlwZWRlZiB1bnNpZ25lZCBpbnQgdTMyOwordHlwZWRlZiBzaWduZWQgaW50IHMzMjsKKworI2RlZmluZSBIWiAxMDAwCisKK3N0YXRpYyB1MzIgaW9hZGRyOworCisjaWZkZWYgRURFQlVHCisjZGVmaW5lIGRwcmludGYoeCkgcHJpbnRmIHgKKyNlbHNlCisjZGVmaW5lIGRwcmludGYoeCkKKyNlbmRpZgorCisvKiBDb25kZW5zZWQgb3BlcmF0aW9ucyBmb3IgcmVhZGFiaWxpdHkuICovCisjZGVmaW5lIHZpcnRfdG9fbGUzMmRlc2MoYWRkcikgIGNwdV90b19sZTMyKHZpcnRfdG9fYnVzKGFkZHIpKQorI2RlZmluZSBsZTMyZGVzY190b192aXJ0KGFkZHIpICBidXNfdG9fdmlydChsZTMyX3RvX2NwdShhZGRyKSkKKworI2RlZmluZSBBUlJBWV9TSVpFKHgpIChzaXplb2YoeCkgLyBzaXplb2YoKHgpWzBdKSkKKworLyogbWVkaWEgb3B0aW9ucyAKKyAgICAgICAgXzEwX0hhbGYgPSAweDAxLAorICAgICAgICBfMTBfRnVsbCA9IDB4MDIsCisgICAgICAgIF8xMDBfSGFsZiA9IDB4MDQsCisgICAgICAgIF8xMDBfRnVsbCA9IDB4MDgsCisgICAgICAgIF8xMDAwX0Z1bGwgPSAweDEwLAorKi8KK3N0YXRpYyBpbnQgbWVkaWEgPSAtMTsKKworI2lmIDAKKy8qIE1heGltdW0gZXZlbnRzIChSeCBwYWNrZXRzLCBldGMuKSB0byBoYW5kbGUgYXQgZWFjaCBpbnRlcnJ1cHQuICovCitzdGF0aWMgaW50IG1heF9pbnRlcnJ1cHRfd29yayA9IDIwOworI2VuZGlmCisKKyNpZiAwCisvKiBNYXhpbXVtIG51bWJlciBvZiBtdWx0aWNhc3QgYWRkcmVzc2VzIHRvIGZpbHRlciAodnMuIFJ4LWFsbC1tdWx0aWNhc3QpLgorICAgVGhlIFJUTCBjaGlwcyB1c2UgYSA2NCBlbGVtZW50IGhhc2ggdGFibGUgYmFzZWQgb24gdGhlIEV0aGVybmV0IENSQy4gICovCitzdGF0aWMgaW50IG11bHRpY2FzdF9maWx0ZXJfbGltaXQgPSAzMjsKKyNlbmRpZgorCisvKiBNQUMgYWRkcmVzcyBsZW5ndGgqLworI2RlZmluZSBNQUNfQUREUl9MRU4JNgorCisvKiBtYXggc3VwcG9ydGVkIGdpZ2FiaXQgZXRoZXJuZXQgZnJhbWUgc2l6ZSAtLSBtdXN0IGJlIGF0IGxlYXN0IChkZXYtPm10dSsxNCs0KS4qLworI2RlZmluZSBNQVhfRVRIX0ZSQU1FX1NJWkUJMTUzNgorCisjZGVmaW5lIFRYX0ZJRk9fVEhSRVNIIDI1NgkvKiBJbiBieXRlcyAqLworCisjZGVmaW5lIFJYX0ZJRk9fVEhSRVNICTcJLyogNyBtZWFucyBOTyB0aHJlc2hvbGQsIFJ4IGJ1ZmZlciBsZXZlbCBiZWZvcmUgZmlyc3QgUENJIHhmZXIuICAqLworI2RlZmluZSBSWF9ETUFfQlVSU1QJNgkvKiBNYXhpbXVtIFBDSSBidXJzdCwgJzYnIGlzIDEwMjQgKi8KKyNkZWZpbmUgVFhfRE1BX0JVUlNUCTYJLyogTWF4aW11bSBQQ0kgYnVyc3QsICc2JyBpcyAxMDI0ICovCisjZGVmaW5lIEVhcmx5VHhUaGxkIAkweDNGCS8qIDB4M0YgbWVhbnMgTk8gZWFybHkgdHJhbnNtaXQgKi8KKyNkZWZpbmUgUnhQYWNrZXRNYXhTaXplCTB4MDgwMAkvKiBNYXhpbXVtIHNpemUgc3VwcG9ydGVkIGlzIDE2Sy0xICovCisjZGVmaW5lIEludGVyRnJhbWVHYXAJMHgwMwkvKiAzIG1lYW5zIEludGVyRnJhbWVHYXAgPSB0aGUgc2hvcnRlc3Qgb25lICovCisKKyNkZWZpbmUgTlVNX1RYX0RFU0MJMQkvKiBOdW1iZXIgb2YgVHggZGVzY3JpcHRvciByZWdpc3RlcnMgKi8KKyNkZWZpbmUgTlVNX1JYX0RFU0MJNAkvKiBOdW1iZXIgb2YgUnggZGVzY3JpcHRvciByZWdpc3RlcnMgKi8KKyNkZWZpbmUgUlhfQlVGX1NJWkUJMTUzNgkvKiBSeCBCdWZmZXIgc2l6ZSAqLworCisjZGVmaW5lIFJUTF9NSU5fSU9fU0laRSAweDgwCisjZGVmaW5lIFRYX1RJTUVPVVQgICg2KkhaKQorCisvKiB3cml0ZS9yZWFkIE1NSU8gcmVnaXN0ZXIgKi8KKyNkZWZpbmUgUlRMX1c4KHJlZywgdmFsOCkJd3JpdGViICgodmFsOCksIGlvYWRkciArIChyZWcpKQorI2RlZmluZSBSVExfVzE2KHJlZywgdmFsMTYpCXdyaXRldyAoKHZhbDE2KSwgaW9hZGRyICsgKHJlZykpCisjZGVmaW5lIFJUTF9XMzIocmVnLCB2YWwzMikJd3JpdGVsICgodmFsMzIpLCBpb2FkZHIgKyAocmVnKSkKKyNkZWZpbmUgUlRMX1I4KHJlZykJCXJlYWRiIChpb2FkZHIgKyAocmVnKSkKKyNkZWZpbmUgUlRMX1IxNihyZWcpCQlyZWFkdyAoaW9hZGRyICsgKHJlZykpCisjZGVmaW5lIFJUTF9SMzIocmVnKQkJKCh1bnNpZ25lZCBsb25nKSByZWFkbCAoaW9hZGRyICsgKHJlZykpKQorCitlbnVtIFJUTDgxNjlfcmVnaXN0ZXJzIHsKKwlNQUMwID0gMCwJCS8qIEV0aGVybmV0IGhhcmR3YXJlIGFkZHJlc3MuICovCisJTUFSMCA9IDgsCQkvKiBNdWx0aWNhc3QgZmlsdGVyLiAqLworCVR4RGVzY1N0YXJ0QWRkciA9IDB4MjAsCisJVHhIRGVzY1N0YXJ0QWRkciA9IDB4MjgsCisJRkxBU0ggPSAweDMwLAorCUVSU1IgPSAweDM2LAorCUNoaXBDbWQgPSAweDM3LAorCVR4UG9sbCA9IDB4MzgsCisJSW50ck1hc2sgPSAweDNDLAorCUludHJTdGF0dXMgPSAweDNFLAorCVR4Q29uZmlnID0gMHg0MCwKKwlSeENvbmZpZyA9IDB4NDQsCisJUnhNaXNzZWQgPSAweDRDLAorCUNmZzkzNDYgPSAweDUwLAorCUNvbmZpZzAgPSAweDUxLAorCUNvbmZpZzEgPSAweDUyLAorCUNvbmZpZzIgPSAweDUzLAorCUNvbmZpZzMgPSAweDU0LAorCUNvbmZpZzQgPSAweDU1LAorCUNvbmZpZzUgPSAweDU2LAorCU11bHRpSW50ciA9IDB4NUMsCisJUEhZQVIgPSAweDYwLAorCVRCSUNTUiA9IDB4NjQsCisJVEJJX0FOQVIgPSAweDY4LAorCVRCSV9MUEFSID0gMHg2QSwKKwlQSFlzdGF0dXMgPSAweDZDLAorCVJ4TWF4U2l6ZSA9IDB4REEsCisJQ1BsdXNDbWQgPSAweEUwLAorCVJ4RGVzY1N0YXJ0QWRkciA9IDB4RTQsCisJRWFybHlUeFRocmVzID0gMHhFQywKKwlGdW5jRXZlbnQgPSAweEYwLAorCUZ1bmNFdmVudE1hc2sgPSAweEY0LAorCUZ1bmNQcmVzZXRTdGF0ZSA9IDB4RjgsCisJRnVuY0ZvcmNlRXZlbnQgPSAweEZDLAorfTsKKworZW51bSBSVEw4MTY5X3JlZ2lzdGVyX2NvbnRlbnQgeworCS8qSW50ZXJydXB0U3RhdHVzQml0cyAqLworCVNZU0VyciA9IDB4ODAwMCwKKwlQQ1NUaW1lb3V0ID0gMHg0MDAwLAorCVNXSW50ID0gMHgwMTAwLAorCVR4RGVzY1VuYXZhaWwgPSAweDgwLAorCVJ4RklGT092ZXIgPSAweDQwLAorCVJ4VW5kZXJydW4gPSAweDIwLAorCVJ4T3ZlcmZsb3cgPSAweDEwLAorCVR4RXJyID0gMHgwOCwKKwlUeE9LID0gMHgwNCwKKwlSeEVyciA9IDB4MDIsCisJUnhPSyA9IDB4MDEsCisKKwkvKlJ4U3RhdHVzRGVzYyAqLworCVJ4UkVTID0gMHgwMDIwMDAwMCwKKwlSeENSQyA9IDB4MDAwODAwMDAsCisJUnhSVU5UID0gMHgwMDEwMDAwMCwKKwlSeFJXVCA9IDB4MDA0MDAwMDAsCisKKwkvKkNoaXBDbWRCaXRzICovCisJQ21kUmVzZXQgPSAweDEwLAorCUNtZFJ4RW5iID0gMHgwOCwKKwlDbWRUeEVuYiA9IDB4MDQsCisJUnhCdWZFbXB0eSA9IDB4MDEsCisKKwkvKkNmZzkzNDZCaXRzICovCisJQ2ZnOTM0Nl9Mb2NrID0gMHgwMCwKKwlDZmc5MzQ2X1VubG9jayA9IDB4QzAsCisKKwkvKnJ4X21vZGVfYml0cyAqLworCUFjY2VwdEVyciA9IDB4MjAsCisJQWNjZXB0UnVudCA9IDB4MTAsCisJQWNjZXB0QnJvYWRjYXN0ID0gMHgwOCwKKwlBY2NlcHRNdWx0aWNhc3QgPSAweDA0LAorCUFjY2VwdE15UGh5cyA9IDB4MDIsCisJQWNjZXB0QWxsUGh5cyA9IDB4MDEsCisKKwkvKlJ4Q29uZmlnQml0cyAqLworCVJ4Q2ZnRklGT1NoaWZ0ID0gMTMsCisJUnhDZmdETUFTaGlmdCA9IDgsCisKKwkvKlR4Q29uZmlnQml0cyAqLworCVR4SW50ZXJGcmFtZUdhcFNoaWZ0ID0gMjQsCisJVHhETUFTaGlmdCA9IDgsCQkvKiBETUEgYnVyc3QgdmFsdWUgKDAtNykgaXMgc2hpZnQgdGhpcyBtYW55IGJpdHMgKi8KKworCS8qcnRsODE2OV9QSFlzdGF0dXMgKi8KKwlUQklfRW5hYmxlID0gMHg4MCwKKwlUeEZsb3dDdHJsID0gMHg0MCwKKwlSeEZsb3dDdHJsID0gMHgyMCwKKwlfMTAwMGJwc0YgPSAweDEwLAorCV8xMDBicHMgPSAweDA4LAorCV8xMGJwcyA9IDB4MDQsCisJTGlua1N0YXR1cyA9IDB4MDIsCisJRnVsbER1cCA9IDB4MDEsCisKKwkvKkdJR0FCSVRfUEhZX3JlZ2lzdGVycyAqLworCVBIWV9DVFJMX1JFRyA9IDAsCisJUEhZX1NUQVRfUkVHID0gMSwKKwlQSFlfQVVUT19ORUdPX1JFRyA9IDQsCisJUEhZXzEwMDBfQ1RSTF9SRUcgPSA5LAorCisJLypHSUdBQklUX1BIWV9SRUdfQklUICovCisJUEhZX1Jlc3RhcnRfQXV0b19OZWdvID0gMHgwMjAwLAorCVBIWV9FbmFibGVfQXV0b19OZWdvID0gMHgxMDAwLAorCisJLyogUEhZX1NUQVRfUkVHID0gMTsgKi8KKwlQSFlfQXV0b19OZWNvX0NvbXAgPSAweDAwMjAsCisKKwkvKiBQSFlfQVVUT19ORUdPX1JFRyA9IDQ7ICovCisJUEhZX0NhcF8xMF9IYWxmID0gMHgwMDIwLAorCVBIWV9DYXBfMTBfRnVsbCA9IDB4MDA0MCwKKwlQSFlfQ2FwXzEwMF9IYWxmID0gMHgwMDgwLAorCVBIWV9DYXBfMTAwX0Z1bGwgPSAweDAxMDAsCisKKwkvKiBQSFlfMTAwMF9DVFJMX1JFRyA9IDk7ICovCisJUEhZX0NhcF8xMDAwX0Z1bGwgPSAweDAyMDAsCisKKwlQSFlfQ2FwX051bGwgPSAweDAsCisKKwkvKl9NZWRpYVR5cGUqLworCV8xMF9IYWxmID0gMHgwMSwKKwlfMTBfRnVsbCA9IDB4MDIsCisJXzEwMF9IYWxmID0gMHgwNCwKKwlfMTAwX0Z1bGwgPSAweDA4LAorCV8xMDAwX0Z1bGwgPSAweDEwLAorCisJLypfVEJJQ1NSQml0Ki8KKwlUQklMaW5rT0sgPSAweDAyMDAwMDAwLAorfTsKKworc3RhdGljIHN0cnVjdCB7CisJY29uc3QgY2hhciAqbmFtZTsKKwl1OCB2ZXJzaW9uOwkJLyogZGVwZW5kIG9uIFJUTDgxNjkgZG9jcyAqLworCXUzMiBSeENvbmZpZ01hc2s7CS8qIHNob3VsZCBjbGVhciB0aGUgYml0cyBzdXBwb3J0ZWQgYnkgdGhpcyBjaGlwICovCit9IHJ0bF9jaGlwX2luZm9bXSA9IHsKKwl7CisiUlRMLTgxNjkiLCAweDAwLCAweGZmN2UxODgwLH0sfTsKKworZW51bSBfRGVzY1N0YXR1c0JpdCB7CisJT1dOYml0ID0gMHg4MDAwMDAwMCwKKwlFT1JiaXQgPSAweDQwMDAwMDAwLAorCUZTYml0ID0gMHgyMDAwMDAwMCwKKwlMU2JpdCA9IDB4MTAwMDAwMDAsCit9OworCitzdHJ1Y3QgVHhEZXNjIHsKKwl1MzIgc3RhdHVzOworCXUzMiB2bGFuX3RhZzsKKwl1MzIgYnVmX2FkZHI7CisJdTMyIGJ1Zl9IYWRkcjsKK307CisKK3N0cnVjdCBSeERlc2MgeworCXUzMiBzdGF0dXM7CisJdTMyIHZsYW5fdGFnOworCXUzMiBidWZfYWRkcjsKKwl1MzIgYnVmX0hhZGRyOworfTsKKworLyogVGhlIGRlc2NyaXB0b3JzIGZvciB0aGlzIGNhcmQgYXJlIHJlcXVpcmVkIHRvIGJlIGFsaWduZWQgb24KKzI1NiBieXRlIGJvdW5kYXJpZXMuICBBcyB0aGUgYWxpZ24gYXR0cmlidXRlIGRvZXMgbm90IGRvIG1vcmUgdGhhbgorMTYgYnl0ZXMgb2YgYWxpZ25tZW50IGl0IHJlcXVpcmVzIHNvbWUgZXh0cmEgc3RlcHMuICBBZGQgMjU2IHRvIHRoZSAKK3NpemUgb2YgdGhlIGFycmF5IGFuZCB0aGUgaW5pdF9yaW5nIGFkanVzdHMgdGhlIGFsaWdubWVudCAqLworCisvKiBEZWZpbmUgdGhlIFRYIERlc2NyaXB0b3IgKi8KK3N0YXRpYyB1OCB0eF9yaW5nW05VTV9UWF9ERVNDICogc2l6ZW9mKHN0cnVjdCBUeERlc2MpICsgMjU2XTsKKworLyogQ3JlYXRlIGEgc3RhdGljIGJ1ZmZlciBvZiBzaXplIFJYX0JVRl9TWiBmb3IgZWFjaAorVFggRGVzY3JpcHRvci4gIEFsbCBkZXNjcmlwdG9ycyBwb2ludCB0byBhCitwYXJ0IG9mIHRoaXMgYnVmZmVyICovCitzdGF0aWMgdW5zaWduZWQgY2hhciB0eGJbTlVNX1RYX0RFU0MgKiBSWF9CVUZfU0laRV07CisKKy8qIERlZmluZSB0aGUgUlggRGVzY3JpcHRvciAqLworc3RhdGljIHU4IHJ4X3JpbmdbTlVNX1JYX0RFU0MgKiBzaXplb2Yoc3RydWN0IFR4RGVzYykgKyAyNTZdOworCisvKiBDcmVhdGUgYSBzdGF0aWMgYnVmZmVyIG9mIHNpemUgUlhfQlVGX1NaIGZvciBlYWNoCitSWCBEZXNjcmlwdG9yICAgQWxsIGRlc2NyaXB0b3JzIHBvaW50IHRvIGEKK3BhcnQgb2YgdGhpcyBidWZmZXIgKi8KK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHJ4YltOVU1fUlhfREVTQyAqIFJYX0JVRl9TSVpFXTsKKworc3RydWN0IHJ0bDgxNjlfcHJpdmF0ZSB7CisJdm9pZCAqbW1pb19hZGRyOwkvKiBtZW1vcnkgbWFwIHBoeXNpY2FsIGFkZHJlc3MgKi8KKwlpbnQgY2hpcHNldDsKKwl1bnNpZ25lZCBsb25nIGN1cl9yeDsJLyogSW5kZXggaW50byB0aGUgUnggZGVzY3JpcHRvciBidWZmZXIgb2YgbmV4dCBSeCBwa3QuICovCisJdW5zaWduZWQgbG9uZyBjdXJfdHg7CS8qIEluZGV4IGludG8gdGhlIFR4IGRlc2NyaXB0b3IgYnVmZmVyIG9mIG5leHQgUnggcGt0LiAqLworCXVuc2lnbmVkIGNoYXIgKlR4RGVzY0FycmF5czsJLyogSW5kZXggb2YgVHggRGVzY3JpcHRvciBidWZmZXIgKi8KKwl1bnNpZ25lZCBjaGFyICpSeERlc2NBcnJheXM7CS8qIEluZGV4IG9mIFJ4IERlc2NyaXB0b3IgYnVmZmVyICovCisJc3RydWN0IFR4RGVzYyAqVHhEZXNjQXJyYXk7CS8qIEluZGV4IG9mIDI1Ni1hbGlnbm1lbnQgVHggRGVzY3JpcHRvciBidWZmZXIgKi8KKwlzdHJ1Y3QgUnhEZXNjICpSeERlc2NBcnJheTsJLyogSW5kZXggb2YgMjU2LWFsaWdubWVudCBSeCBEZXNjcmlwdG9yIGJ1ZmZlciAqLworCXVuc2lnbmVkIGNoYXIgKlJ4QnVmZmVyUmluZ1tOVU1fUlhfREVTQ107CS8qIEluZGV4IG9mIFJ4IEJ1ZmZlciBhcnJheSAqLworCXVuc2lnbmVkIGNoYXIgKlR4X3NrYnVmZltOVU1fVFhfREVTQ107Cit9IHRweDsKKworc3RhdGljIHN0cnVjdCBydGw4MTY5X3ByaXZhdGUgKnRwYzsKKworc3RhdGljIGNvbnN0IHUxNiBydGw4MTY5X2ludHJfbWFzayA9CisgICAgU1lTRXJyIHwgUENTVGltZW91dCB8IFJ4VW5kZXJydW4gfCBSeE92ZXJmbG93IHwgUnhGSUZPT3ZlciB8IFR4RXJyIHwKKyAgICBUeE9LIHwgUnhFcnIgfCBSeE9LOworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBydGw4MTY5X3J4X2NvbmZpZyA9CisgICAgKFJYX0ZJRk9fVEhSRVNIIDw8IFJ4Q2ZnRklGT1NoaWZ0KSB8IChSWF9ETUFfQlVSU1QgPDwgUnhDZmdETUFTaGlmdCk7CisKK3ZvaWQgbWRpb193cml0ZShpbnQgUmVnQWRkciwgaW50IHZhbHVlKQoreworCWludCBpOworCisJUlRMX1czMihQSFlBUiwgMHg4MDAwMDAwMCB8IChSZWdBZGRyICYgMHhGRikgPDwgMTYgfCB2YWx1ZSk7CisJdWRlbGF5KDEwMDApOworCisJZm9yIChpID0gMjAwMDsgaSA+IDA7IGktLSkgeworCQkvKiBDaGVjayBpZiB0aGUgUlRMODE2OSBoYXMgY29tcGxldGVkIHdyaXRpbmcgdG8gdGhlIHNwZWNpZmllZCBNSUkgcmVnaXN0ZXIgKi8KKwkJaWYgKCEoUlRMX1IzMihQSFlBUikgJiAweDgwMDAwMDAwKSkgeworCQkJYnJlYWs7CisJCX0gZWxzZSB7CisJCQl1ZGVsYXkoMTAwKTsKKwkJfQorCX0KK30KKworaW50IG1kaW9fcmVhZChpbnQgUmVnQWRkcikKK3sKKwlpbnQgaSwgdmFsdWUgPSAtMTsKKworCVJUTF9XMzIoUEhZQVIsIDB4MCB8IChSZWdBZGRyICYgMHhGRikgPDwgMTYpOworCXVkZWxheSgxMDAwKTsKKworCWZvciAoaSA9IDIwMDA7IGkgPiAwOyBpLS0pIHsKKwkJLyogQ2hlY2sgaWYgdGhlIFJUTDgxNjkgaGFzIGNvbXBsZXRlZCByZXRyaWV2aW5nIGRhdGEgZnJvbSB0aGUgc3BlY2lmaWVkIE1JSSByZWdpc3RlciAqLworCQlpZiAoUlRMX1IzMihQSFlBUikgJiAweDgwMDAwMDAwKSB7CisJCQl2YWx1ZSA9IChpbnQpIChSVExfUjMyKFBIWUFSKSAmIDB4RkZGRik7CisJCQlicmVhazsKKwkJfSBlbHNlIHsKKwkJCXVkZWxheSgxMDApOworCQl9CisJfQorCXJldHVybiB2YWx1ZTsKK30KKworc3RhdGljIGludCBydGw4MTY5X2luaXRfYm9hcmQoc3RydWN0IHBjaV9kZXZpY2UgKnBkZXYpCit7CisJaW50IGk7CisJdW5zaWduZWQgbG9uZyBydHJlZ19iYXNlLCBydHJlZ19sZW47CisJdTMyIHRtcDsKKworCXJ0cmVnX2Jhc2UgPSBwY2lfYmFyX3N0YXJ0KHBkZXYsIFBDSV9CQVNFX0FERFJFU1NfMSk7CisJcnRyZWdfbGVuID0gcGNpX2Jhcl9zaXplKHBkZXYsIFBDSV9CQVNFX0FERFJFU1NfMSk7CisKKwkvKiBjaGVjayBmb3Igd2VpcmQvYnJva2VuIFBDSSByZWdpb24gcmVwb3J0aW5nICovCisJaWYgKHJ0cmVnX2xlbiA8IFJUTF9NSU5fSU9fU0laRSkgeworCQlwcmludGYoIkludmFsaWQgUENJIHJlZ2lvbiBzaXplKHMpLCBhYm9ydGluZ1xuIik7CisJfQorCisJYWRqdXN0X3BjaV9kZXZpY2UocGRldik7CisvKiAgICAgIHBtX2NhcCA9IHBjaV9maW5kX2NhcGFiaWxpdHkocGRldiwgUENJX0NBUF9JRF9QTSk7ICovCisKKwkvKiBpb3JlbWFwIE1NSU8gcmVnaW9uICovCisJaW9hZGRyID0gKHVuc2lnbmVkIGxvbmcpIGlvcmVtYXAocnRyZWdfYmFzZSwgcnRyZWdfbGVuKTsKKwlpZiAoaW9hZGRyID09IDApCisJCXJldHVybiAwOworCisJdHBjLT5tbWlvX2FkZHIgPSAmaW9hZGRyOworCS8qIFNvZnQgcmVzZXQgdGhlIGNoaXAuICovCisJUlRMX1c4KENoaXBDbWQsIENtZFJlc2V0KTsKKworCS8qIENoZWNrIHRoYXQgdGhlIGNoaXAgaGFzIGZpbmlzaGVkIHRoZSByZXNldC4gKi8KKwlmb3IgKGkgPSAxMDAwOyBpID4gMDsgaS0tKQorCQlpZiAoKFJUTF9SOChDaGlwQ21kKSAmIENtZFJlc2V0KSA9PSAwKQorCQkJYnJlYWs7CisJCWVsc2UKKwkJCXVkZWxheSgxMCk7CisKKwkvKiBpZGVudGlmeSBjaGlwIGF0dGFjaGVkIHRvIGJvYXJkICovCisJdG1wID0gUlRMX1IzMihUeENvbmZpZyk7CisJdG1wID0gKCh0bXAgJiAweDdjMDAwMDAwKSArICgodG1wICYgMHgwMDgwMDAwMCkgPDwgMikpID4+IDI0OworCisJZm9yIChpID0gQVJSQVlfU0laRShydGxfY2hpcF9pbmZvKSAtIDE7IGkgPj0gMDsgaS0tKQorCQlpZiAodG1wID09IHJ0bF9jaGlwX2luZm9baV0udmVyc2lvbikgeworCQkJdHBjLT5jaGlwc2V0ID0gaTsKKwkJCWdvdG8gbWF0Y2g7CisJCX0KKwkvKiBpZiB1bmtub3duIGNoaXAsIGFzc3VtZSBhcnJheSBlbGVtZW50ICMwLCBvcmlnaW5hbCBSVEwtODE2OSBpbiB0aGlzIGNhc2UgKi8KKwlkcHJpbnRmKCgiUENJIGRldmljZTogdW5rbm93biBjaGlwIHZlcnNpb24sIGFzc3VtaW5nIFJUTC04MTY5XG4iKSk7CisJZHByaW50ZigoIlBDSSBkZXZpY2U6IFR4Q29uZmlnID0gMHglaFhcbiIsCisJCSAodW5zaWduZWQgbG9uZykgUlRMX1IzMihUeENvbmZpZykpKTsKKwl0cGMtPmNoaXBzZXQgPSAwOworCXJldHVybiAxOworICAgICAgbWF0Y2g6CisJcmV0dXJuIDA7CisKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitJUlEgLSBXYWl0IGZvciBhIGZyYW1lCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHI4MTY5X2lycSAoIHN0cnVjdCBuaWMgKm5pYyBfX3VudXNlZCwgaXJxX2FjdGlvbl90IGFjdGlvbiApIHsKKwlpbnQgaW50cl9zdGF0dXMgPSAwOworCWludCBpbnRlcmVzdGVkID0gUnhVbmRlcnJ1biB8IFJ4T3ZlcmZsb3cgfCBSeEZJRk9PdmVyIHwgUnhFcnIgfCBSeE9LOworIAorCXN3aXRjaCAoIGFjdGlvbiApIHsKKwkJY2FzZSBESVNBQkxFOgorCQljYXNlIEVOQUJMRToKKwkJCWludHJfc3RhdHVzID0gUlRMX1IxNihJbnRyU3RhdHVzKTsKKwkJCS8qIGgvdyBubyBsb25nZXIgcHJlc2VudCAoaG90cGx1Zz8pIG9yIG1ham9yIGVycm9yLCAKKwkJCQliYWlsICovCisJCQlpZiAoaW50cl9zdGF0dXMgPT0gMHhGRkZGKQorCQkJCWJyZWFrOworCisJCQlpbnRyX3N0YXR1cyA9IGludHJfc3RhdHVzICYgfmludGVyZXN0ZWQ7CisJCQlpZiAoIGFjdGlvbiA9PSBFTkFCTEUgKQorCQkJCWludHJfc3RhdHVzID0gaW50cl9zdGF0dXMgfCBpbnRlcmVzdGVkOworCQkJUlRMX1cxNihJbnRyTWFzaywgaW50cl9zdGF0dXMpOworCQkJYnJlYWs7CisJCWNhc2UgRk9SQ0UgOgorCQkJUlRMX1c4KFR4UG9sbCwgKFJUTF9SOChUeFBvbGwpIHwgMHgwMSkpOworCQkJYnJlYWs7CisJfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1BPTEwgLSBXYWl0IGZvciBhIGZyYW1lCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50IHI4MTY5X3BvbGwoc3RydWN0IG5pYyAqbmljLCBpbnQgcmV0cmVpdmUpCit7CisJLyogcmV0dXJuIHRydWUgaWYgdGhlcmUncyBhbiBldGhlcm5ldCBwYWNrZXQgcmVhZHkgdG8gcmVhZCAqLworCS8qIG5pYy0+cGFja2V0IHNob3VsZCBjb250YWluIGRhdGEgb24gcmV0dXJuICovCisJLyogbmljLT5wYWNrZXRsZW4gc2hvdWxkIGNvbnRhaW4gbGVuZ3RoIG9mIGRhdGEgKi8KKwlpbnQgY3VyX3J4OworCXVuc2lnbmVkIGludCBpbnRyX3N0YXR1cyA9IDA7CisJY3VyX3J4ID0gdHBjLT5jdXJfcng7CisJaWYgKCh0cGMtPlJ4RGVzY0FycmF5W2N1cl9yeF0uc3RhdHVzICYgT1dOYml0KSA9PSAwKSB7CisJICAgICAgICAgLyogVGhlcmUgaXMgYSBwYWNrZXQgcmVhZHkgKi8KKyAgCSAgICAgICAgIGlmKCFyZXRyZWl2ZSkKKyAgCSAgICAgICAgICAgICAgICAgcmV0dXJuIDE7CisJCWludHJfc3RhdHVzID0gUlRMX1IxNihJbnRyU3RhdHVzKTsKKwkJLyogaC93IG5vIGxvbmdlciBwcmVzZW50IChob3RwbHVnPykgb3IgbWFqb3IgZXJyb3IsCisJCQliYWlsICovCisJCWlmIChpbnRyX3N0YXR1cyA9PSAweEZGRkYpCisJCQlyZXR1cm4gMDsKKwkJUlRMX1cxNihJbnRyU3RhdHVzLCBpbnRyX3N0YXR1cyAmIAorCQkJfihSeEZJRk9PdmVyIHwgUnhPdmVyZmxvdyB8IFJ4T0spKTsKKworCQlpZiAoISh0cGMtPlJ4RGVzY0FycmF5W2N1cl9yeF0uc3RhdHVzICYgUnhSRVMpKSB7CisJCQluaWMtPnBhY2tldGxlbiA9IChpbnQpICh0cGMtPlJ4RGVzY0FycmF5W2N1cl9yeF0uCisJCQkJCQlzdGF0dXMgJiAweDAwMDAxRkZGKSAtIDQ7CisJCQltZW1jcHkobmljLT5wYWNrZXQsIHRwYy0+UnhCdWZmZXJSaW5nW2N1cl9yeF0sCisJCQkgICAgICAgbmljLT5wYWNrZXRsZW4pOworCQkJaWYgKGN1cl9yeCA9PSBOVU1fUlhfREVTQyAtIDEpCisJCQkJdHBjLT5SeERlc2NBcnJheVtjdXJfcnhdLnN0YXR1cyA9CisJCQkJICAgIChPV05iaXQgfCBFT1JiaXQpICsgUlhfQlVGX1NJWkU7CisJCQllbHNlCisJCQkJdHBjLT5SeERlc2NBcnJheVtjdXJfcnhdLnN0YXR1cyA9CisJCQkJICAgIE9XTmJpdCArIFJYX0JVRl9TSVpFOworCQkJdHBjLT5SeERlc2NBcnJheVtjdXJfcnhdLmJ1Zl9hZGRyID0KKwkJCSAgICB2aXJ0X3RvX2J1cyh0cGMtPlJ4QnVmZmVyUmluZ1tjdXJfcnhdKTsKKwkJfSBlbHNlCisJCQlwcmludGYoIkVycm9yIFJ4Iik7CisJCS8qIEZJWE1FOiBzaG91bGRuJ3QgSSByZXNldCB0aGUgc3RhdHVzIG9uIGFuIGVycm9yICovCisJCWN1cl9yeCA9IChjdXJfcnggKyAxKSAlIE5VTV9SWF9ERVNDOworCQl0cGMtPmN1cl9yeCA9IGN1cl9yeDsKKwkJUlRMX1cxNihJbnRyU3RhdHVzLCBpbnRyX3N0YXR1cyAmIAorCQkJKFJ4RklGT092ZXIgfCBSeE92ZXJmbG93IHwgUnhPSykpOworCisJCXJldHVybiAxOworCisJfQorCXRwYy0+Y3VyX3J4ID0gY3VyX3J4OworCS8qIEZJWE1FOiBUaGVyZSBpcyBubyByZWFzb24gdG8gZG8gdGhpcyBhcyBjdXJfcnggZGlkIG5vdCBjaGFuZ2UgKi8KKworCXJldHVybiAoMCk7CQkvKiBpbml0aWFsbHkgYXMgdGhpcyBpcyBjYWxsZWQgdG8gZmx1c2ggdGhlIGlucHV0ICovCisKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitUUkFOU01JVCAtIFRyYW5zbWl0IGEgZnJhbWUKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIHI4MTY5X3RyYW5zbWl0KHN0cnVjdCBuaWMgKm5pYywgY29uc3QgY2hhciAqZCwJLyogRGVzdGluYXRpb24gKi8KKwkJCSAgIHVuc2lnbmVkIGludCB0LAkvKiBUeXBlICovCisJCQkgICB1bnNpZ25lZCBpbnQgcywJLyogc2l6ZSAqLworCQkJICAgY29uc3QgY2hhciAqcCkKK3sJCQkJLyogUGFja2V0ICovCisJLyogc2VuZCB0aGUgcGFja2V0IHRvIGRlc3RpbmF0aW9uICovCisKKwl1MTYgbnN0eXBlOworCXUzMiB0bzsKKwl1OCAqcHR4YjsKKwlpbnQgZW50cnkgPSB0cGMtPmN1cl90eCAlIE5VTV9UWF9ERVNDOworCisJLyogcG9pbnQgdG8gdGhlIGN1cnJlbnQgdHhiIGluY2FzZSBtdWx0aXBsZSB0eF9yaW5ncyBhcmUgdXNlZCAqLworCXB0eGIgPSB0cGMtPlR4X3NrYnVmZltlbnRyeSAqIE1BWF9FVEhfRlJBTUVfU0laRV07CisJbWVtY3B5KHB0eGIsIGQsIEVUSF9BTEVOKTsKKwltZW1jcHkocHR4YiArIEVUSF9BTEVOLCBuaWMtPm5vZGVfYWRkciwgRVRIX0FMRU4pOworCW5zdHlwZSA9IGh0b25zKCh1MTYpIHQpOworCW1lbWNweShwdHhiICsgMiAqIEVUSF9BTEVOLCAodTggKikgJiBuc3R5cGUsIDIpOworCW1lbWNweShwdHhiICsgRVRIX0hMRU4sIHAsIHMpOworCXMgKz0gRVRIX0hMRU47CisJcyAmPSAweDBGRkY7CisJd2hpbGUgKHMgPCBFVEhfWkxFTikKKwkJcHR4YltzKytdID0gJ1wwJzsKKworCXRwYy0+VHhEZXNjQXJyYXlbZW50cnldLmJ1Zl9hZGRyID0gdmlydF90b19idXMocHR4Yik7CisJaWYgKGVudHJ5ICE9IChOVU1fVFhfREVTQyAtIDEpKQorCQl0cGMtPlR4RGVzY0FycmF5W2VudHJ5XS5zdGF0dXMgPQorCQkgICAgKE9XTmJpdCB8IEZTYml0IHwgTFNiaXQpIHwgKChzID4gRVRIX1pMRU4pID8gcyA6CisJCQkJCQlFVEhfWkxFTik7CisJZWxzZQorCQl0cGMtPlR4RGVzY0FycmF5W2VudHJ5XS5zdGF0dXMgPQorCQkgICAgKE9XTmJpdCB8IEVPUmJpdCB8IEZTYml0IHwgTFNiaXQpIHwgKChzID4gRVRIX1pMRU4pID8gcworCQkJCQkJCSA6IEVUSF9aTEVOKTsKKwlSVExfVzgoVHhQb2xsLCAweDQwKTsJLyogc2V0IHBvbGxpbmcgYml0ICovCisKKwl0cGMtPmN1cl90eCsrOworCXRvID0gY3VycnRpY2tzKCkgKyBUWF9USU1FT1VUOworCXdoaWxlICgodHBjLT5UeERlc2NBcnJheVtlbnRyeV0uc3RhdHVzICYgT1dOYml0KSAmJiAoY3VycnRpY2tzKCkgPCB0bykpOwkvKiB3YWl0ICovCisKKwlpZiAoY3VycnRpY2tzKCkgPj0gdG8pIHsKKwkJcHJpbnRmKCJUWCBUaW1lIE91dCIpOworCX0KK30KKworc3RhdGljIHZvaWQgcnRsODE2OV9zZXRfcnhfbW9kZShzdHJ1Y3QgbmljICpuaWMgX191bnVzZWQpCit7CisJdTMyIG1jX2ZpbHRlclsyXTsJLyogTXVsdGljYXN0IGhhc2ggZmlsdGVyICovCisJaW50IHJ4X21vZGU7CisJdTMyIHRtcCA9IDA7CisKKwkvKiBJRkZfQUxMTVVMVEkgKi8KKwkvKiBUb28gbWFueSB0byBmaWx0ZXIgcGVyZmVjdGx5IC0tIGFjY2VwdCBhbGwgbXVsdGljYXN0cy4gKi8KKwlyeF9tb2RlID0gQWNjZXB0QnJvYWRjYXN0IHwgQWNjZXB0TXVsdGljYXN0IHwgQWNjZXB0TXlQaHlzOworCW1jX2ZpbHRlclsxXSA9IG1jX2ZpbHRlclswXSA9IDB4ZmZmZmZmZmY7CisKKwl0bXAgPQorCSAgICBydGw4MTY5X3J4X2NvbmZpZyB8IHJ4X21vZGUgfCAoUlRMX1IzMihSeENvbmZpZykgJgorCQkJCQkgICBydGxfY2hpcF9pbmZvW3RwYy0+Y2hpcHNldF0uCisJCQkJCSAgIFJ4Q29uZmlnTWFzayk7CisKKwlSVExfVzMyKFJ4Q29uZmlnLCB0bXApOworCVJUTF9XMzIoTUFSMCArIDAsIG1jX2ZpbHRlclswXSk7CisJUlRMX1czMihNQVIwICsgNCwgbWNfZmlsdGVyWzFdKTsKK30KK3N0YXRpYyB2b2lkIHJ0bDgxNjlfaHdfc3RhcnQoc3RydWN0IG5pYyAqbmljKQoreworCXUzMiBpOworCisJLyogU29mdCByZXNldCB0aGUgY2hpcC4gKi8KKwlSVExfVzgoQ2hpcENtZCwgQ21kUmVzZXQpOworCisJLyogQ2hlY2sgdGhhdCB0aGUgY2hpcCBoYXMgZmluaXNoZWQgdGhlIHJlc2V0LiAqLworCWZvciAoaSA9IDEwMDA7IGkgPiAwOyBpLS0pIHsKKwkJaWYgKChSVExfUjgoQ2hpcENtZCkgJiBDbWRSZXNldCkgPT0gMCkKKwkJCWJyZWFrOworCQllbHNlCisJCQl1ZGVsYXkoMTApOworCX0KKworCVJUTF9XOChDZmc5MzQ2LCBDZmc5MzQ2X1VubG9jayk7CisJUlRMX1c4KENoaXBDbWQsIENtZFR4RW5iIHwgQ21kUnhFbmIpOworCVJUTF9XOChFYXJseVR4VGhyZXMsIEVhcmx5VHhUaGxkKTsKKworCS8qIEZvciBnaWdhYml0IHJ0bDgxNjkgKi8KKwlSVExfVzE2KFJ4TWF4U2l6ZSwgUnhQYWNrZXRNYXhTaXplKTsKKworCS8qIFNldCBSeCBDb25maWcgcmVnaXN0ZXIgKi8KKwlpID0gcnRsODE2OV9yeF9jb25maWcgfCAoUlRMX1IzMihSeENvbmZpZykgJgorCQkJCSBydGxfY2hpcF9pbmZvW3RwYy0+Y2hpcHNldF0uUnhDb25maWdNYXNrKTsKKwlSVExfVzMyKFJ4Q29uZmlnLCBpKTsKKworCS8qIFNldCBETUEgYnVyc3Qgc2l6ZSBhbmQgSW50ZXJmcmFtZSBHYXAgVGltZSAqLworCVJUTF9XMzIoVHhDb25maWcsCisJCShUWF9ETUFfQlVSU1QgPDwgVHhETUFTaGlmdCkgfCAoSW50ZXJGcmFtZUdhcCA8PAorCQkJCQkJVHhJbnRlckZyYW1lR2FwU2hpZnQpKTsKKworCisJdHBjLT5jdXJfcnggPSAwOworCisJUlRMX1czMihUeERlc2NTdGFydEFkZHIsIHZpcnRfdG9fbGUzMmRlc2ModHBjLT5UeERlc2NBcnJheSkpOworCVJUTF9XMzIoUnhEZXNjU3RhcnRBZGRyLCB2aXJ0X3RvX2xlMzJkZXNjKHRwYy0+UnhEZXNjQXJyYXkpKTsKKwlSVExfVzgoQ2ZnOTM0NiwgQ2ZnOTM0Nl9Mb2NrKTsKKwl1ZGVsYXkoMTApOworCisJUlRMX1czMihSeE1pc3NlZCwgMCk7CisKKwlydGw4MTY5X3NldF9yeF9tb2RlKG5pYyk7CisKKwkvKiBubyBlYXJseS1yeCBpbnRlcnJ1cHRzICovCisJUlRMX1cxNihNdWx0aUludHIsIFJUTF9SMTYoTXVsdGlJbnRyKSAmIDB4RjAwMCk7Cit9CisKK3N0YXRpYyB2b2lkIHJ0bDgxNjlfaW5pdF9yaW5nKHN0cnVjdCBuaWMgKm5pYyBfX3VudXNlZCkKK3sKKwlpbnQgaTsKKworCXRwYy0+Y3VyX3J4ID0gMDsKKwl0cGMtPmN1cl90eCA9IDA7CisJbWVtc2V0KHRwYy0+VHhEZXNjQXJyYXksIDB4MCwgTlVNX1RYX0RFU0MgKiBzaXplb2Yoc3RydWN0IFR4RGVzYykpOworCW1lbXNldCh0cGMtPlJ4RGVzY0FycmF5LCAweDAsIE5VTV9SWF9ERVNDICogc2l6ZW9mKHN0cnVjdCBSeERlc2MpKTsKKworCWZvciAoaSA9IDA7IGkgPCBOVU1fVFhfREVTQzsgaSsrKSB7CisJCXRwYy0+VHhfc2tidWZmW2ldID0gJnR4YltpXTsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgTlVNX1JYX0RFU0M7IGkrKykgeworCQlpZiAoaSA9PSAoTlVNX1JYX0RFU0MgLSAxKSkKKwkJCXRwYy0+UnhEZXNjQXJyYXlbaV0uc3RhdHVzID0KKwkJCSAgICAoT1dOYml0IHwgRU9SYml0KSArIFJYX0JVRl9TSVpFOworCQllbHNlCisJCQl0cGMtPlJ4RGVzY0FycmF5W2ldLnN0YXR1cyA9IE9XTmJpdCArIFJYX0JVRl9TSVpFOworCisJCXRwYy0+UnhCdWZmZXJSaW5nW2ldID0gJnJ4YltpICogUlhfQlVGX1NJWkVdOworCQl0cGMtPlJ4RGVzY0FycmF5W2ldLmJ1Zl9hZGRyID0KKwkJICAgIHZpcnRfdG9fYnVzKHRwYy0+UnhCdWZmZXJSaW5nW2ldKTsKKwl9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVTRVQgLSBGaW5pc2ggc2V0dGluZyB1cCB0aGUgZXRoZXJuZXQgaW50ZXJmYWNlCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCByODE2OV9yZXNldChzdHJ1Y3QgbmljICpuaWMpCit7CisJaW50IGk7CisJdTggZGlmZjsKKwl1MzIgVHhQaHlBZGRyLCBSeFBoeUFkZHI7CisKKwl0cGMtPlR4RGVzY0FycmF5cyA9IHR4X3Jpbmc7CisJaWYgKHRwYy0+VHhEZXNjQXJyYXlzID09IDApCisJCXByaW50ZigiQWxsb3QgRXJyb3IiKTsKKwkvKiBUeCBEZXNzY3JpcHRvciBuZWVkcyAyNTYgYnl0ZXMgYWxpZ25tZW50OyAqLworCVR4UGh5QWRkciA9IHZpcnRfdG9fYnVzKHRwYy0+VHhEZXNjQXJyYXlzKTsKKwlkaWZmID0gMjU2IC0gKFR4UGh5QWRkciAtICgoVHhQaHlBZGRyID4+IDgpIDw8IDgpKTsKKwlUeFBoeUFkZHIgKz0gZGlmZjsKKwl0cGMtPlR4RGVzY0FycmF5ID0gKHN0cnVjdCBUeERlc2MgKikgKHRwYy0+VHhEZXNjQXJyYXlzICsgZGlmZik7CisKKwl0cGMtPlJ4RGVzY0FycmF5cyA9IHJ4X3Jpbmc7CisJLyogUnggRGVzc2NyaXB0b3IgbmVlZHMgMjU2IGJ5dGVzIGFsaWdubWVudDsgKi8KKwlSeFBoeUFkZHIgPSB2aXJ0X3RvX2J1cyh0cGMtPlJ4RGVzY0FycmF5cyk7CisJZGlmZiA9IDI1NiAtIChSeFBoeUFkZHIgLSAoKFJ4UGh5QWRkciA+PiA4KSA8PCA4KSk7CisJUnhQaHlBZGRyICs9IGRpZmY7CisJdHBjLT5SeERlc2NBcnJheSA9IChzdHJ1Y3QgUnhEZXNjICopICh0cGMtPlJ4RGVzY0FycmF5cyArIGRpZmYpOworCisJaWYgKHRwYy0+VHhEZXNjQXJyYXlzID09IE5VTEwgfHwgdHBjLT5SeERlc2NBcnJheXMgPT0gTlVMTCkgeworCQlwcmludGYoIkFsbG9jYXRlIFJ4RGVzY0FycmF5IG9yIFR4RGVzY0FycmF5IGZhaWxlZFxuIik7CisJCXJldHVybjsKKwl9CisKKwlydGw4MTY5X2luaXRfcmluZyhuaWMpOworCXJ0bDgxNjlfaHdfc3RhcnQobmljKTsKKwkvKiBDb25zdHJ1Y3QgYSBwZXJmZWN0IGZpbHRlciBmcmFtZSB3aXRoIHRoZSBtYWMgYWRkcmVzcyBhcyBmaXJzdCBtYXRjaAorCSAqIGFuZCBicm9hZGNhc3QgZm9yIGFsbCBvdGhlcnMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgMTkyOyBpKyspCisJCXR4YltpXSA9IDB4RkY7CisKKwl0eGJbMF0gPSBuaWMtPm5vZGVfYWRkclswXTsKKwl0eGJbMV0gPSBuaWMtPm5vZGVfYWRkclsxXTsKKwl0eGJbMl0gPSBuaWMtPm5vZGVfYWRkclsyXTsKKwl0eGJbM10gPSBuaWMtPm5vZGVfYWRkclszXTsKKwl0eGJbNF0gPSBuaWMtPm5vZGVfYWRkcls0XTsKKwl0eGJbNV0gPSBuaWMtPm5vZGVfYWRkcls1XTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitESVNBQkxFIC0gVHVybiBvZmYgZXRoZXJuZXQgaW50ZXJmYWNlCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCByODE2OV9kaXNhYmxlKHN0cnVjdCBkZXYgKmRldiBfX3VudXNlZCkKK3sKKwlpbnQgaTsKKwkvKiBTdG9wIHRoZSBjaGlwJ3MgVHggYW5kIFJ4IERNQSBwcm9jZXNzZXMuICovCisJUlRMX1c4KENoaXBDbWQsIDB4MDApOworCisJLyogRGlzYWJsZSBpbnRlcnJ1cHRzIGJ5IGNsZWFyaW5nIHRoZSBpbnRlcnJ1cHQgbWFzay4gKi8KKwlSVExfVzE2KEludHJNYXNrLCAweDAwMDApOworCisJUlRMX1czMihSeE1pc3NlZCwgMCk7CisKKwl0cGMtPlR4RGVzY0FycmF5cyA9IE5VTEw7CisJdHBjLT5SeERlc2NBcnJheXMgPSBOVUxMOworCXRwYy0+VHhEZXNjQXJyYXkgPSBOVUxMOworCXRwYy0+UnhEZXNjQXJyYXkgPSBOVUxMOworCWZvciAoaSA9IDA7IGkgPCBOVU1fUlhfREVTQzsgaSsrKSB7CisJCXRwYy0+UnhCdWZmZXJSaW5nW2ldID0gTlVMTDsKKwl9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUFJPQkUgLSBMb29rIGZvciBhbiBhZGFwdGVyLCB0aGlzIHJvdXRpbmUncyB2aXNpYmxlIHRvIHRoZSBvdXRzaWRlCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgYm9hcmRfZm91bmQgMQorI2RlZmluZSB2YWxpZF9saW5rIDAKK3N0YXRpYyBpbnQgcjgxNjlfcHJvYmUoc3RydWN0IGRldiAqZGV2LCBzdHJ1Y3QgcGNpX2RldmljZSAqcGNpKQoreworCXN0cnVjdCBuaWMgKm5pYyA9IChzdHJ1Y3QgbmljICopIGRldjsKKwlzdGF0aWMgaW50IGJvYXJkX2lkeCA9IC0xOworCXN0YXRpYyBpbnQgcHJpbnRlZF92ZXJzaW9uID0gMDsKKwlpbnQgaSwgcmM7CisJaW50IG9wdGlvbiA9IC0xLCBDYXAxMF8xMDAgPSAwLCBDYXAxMDAwID0gMDsKKworCXByaW50ZigicjgxNjkuYzogRm91bmQgJXMsIFZlbmRvcj0laFggRGV2aWNlPSVoWFxuIiwKKwkgICAgICAgcGNpLT5uYW1lLCBwY2ktPnZlbmRvciwgcGNpLT5kZXZfaWQpOworCisJYm9hcmRfaWR4Kys7CisKKwlwcmludGVkX3ZlcnNpb24gPSAxOworCisJLyogcG9pbnQgdG8gcHJpdmF0ZSBzdG9yYWdlICovCisJdHBjID0gJnRweDsKKworCXJjID0gcnRsODE2OV9pbml0X2JvYXJkKHBjaSk7CS8qIFJldHVybiBjb2RlIGlzIG1lYW5pbmdsZXNzICovCisKKwkvKiBHZXQgTUFDIGFkZHJlc3MuICBGSVhNRTogcmVhZCBFRVBST00gKi8KKwlmb3IgKGkgPSAwOyBpIDwgTUFDX0FERFJfTEVOOyBpKyspCisJCW5pYy0+bm9kZV9hZGRyW2ldID0gUlRMX1I4KE1BQzAgKyBpKTsKKworCWRwcmludGYoKCIlczogSWRlbnRpZmllZCBjaGlwIHR5cGUgaXMgJyVzJy5cbiIsIHBjaS0+bmFtZSwKKwkJIHJ0bF9jaGlwX2luZm9bdHBjLT5jaGlwc2V0XS5uYW1lKSk7CisJLyogUHJpbnQgb3V0IHNvbWUgaGFyZHdhcmUgaW5mbyAqLworCXByaW50ZigiJXM6ICUhIGF0IGlvYWRkciAlaFgsICIsIHBjaS0+bmFtZSwgbmljLT5ub2RlX2FkZHIsCisJICAgICAgIGlvYWRkcik7CisKKwkvKiBpZiBUQkkgaXMgbm90IGVuZGJsZWQgKi8KKwlpZiAoIShSVExfUjgoUEhZc3RhdHVzKSAmIFRCSV9FbmFibGUpKSB7CisJCWludCB2YWwgPSBtZGlvX3JlYWQoUEhZX0FVVE9fTkVHT19SRUcpOworCisJCW9wdGlvbiA9IG1lZGlhOworCQkvKiBGb3JjZSBSVEw4MTY5IGluIDEwLzEwMC8xMDAwIEZ1bGwvSGFsZiBtb2RlLiAqLworCQlpZiAob3B0aW9uID4gMCkgeworCQkJcHJpbnRmKCIgRm9yY2UtbW9kZSBFbmFibGVkLlxuIik7CisJCQlDYXAxMF8xMDAgPSAwLCBDYXAxMDAwID0gMDsKKwkJCXN3aXRjaCAob3B0aW9uKSB7CisJCQljYXNlIF8xMF9IYWxmOgorCQkJCUNhcDEwXzEwMCA9IFBIWV9DYXBfMTBfSGFsZjsKKwkJCQlDYXAxMDAwID0gUEhZX0NhcF9OdWxsOworCQkJCWJyZWFrOworCQkJY2FzZSBfMTBfRnVsbDoKKwkJCQlDYXAxMF8xMDAgPSBQSFlfQ2FwXzEwX0Z1bGw7CisJCQkJQ2FwMTAwMCA9IFBIWV9DYXBfTnVsbDsKKwkJCQlicmVhazsKKwkJCWNhc2UgXzEwMF9IYWxmOgorCQkJCUNhcDEwXzEwMCA9IFBIWV9DYXBfMTAwX0hhbGY7CisJCQkJQ2FwMTAwMCA9IFBIWV9DYXBfTnVsbDsKKwkJCQlicmVhazsKKwkJCWNhc2UgXzEwMF9GdWxsOgorCQkJCUNhcDEwXzEwMCA9IFBIWV9DYXBfMTAwX0Z1bGw7CisJCQkJQ2FwMTAwMCA9IFBIWV9DYXBfTnVsbDsKKwkJCQlicmVhazsKKwkJCWNhc2UgXzEwMDBfRnVsbDoKKwkJCQlDYXAxMF8xMDAgPSBQSFlfQ2FwX051bGw7CisJCQkJQ2FwMTAwMCA9IFBIWV9DYXBfMTAwMF9GdWxsOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlicmVhazsKKwkJCX0KKwkJCS8qIGxlYXZlIFBIWV9BVVRPX05FR09fUkVHIGJpdDQ6MCB1bmNoYW5nZWQgKi8KKwkJCW1kaW9fd3JpdGUoUEhZX0FVVE9fTkVHT19SRUcsCisJCQkJICAgQ2FwMTBfMTAwIHwgKHZhbCAmIDB4MUYpKTsKKwkJCW1kaW9fd3JpdGUoUEhZXzEwMDBfQ1RSTF9SRUcsIENhcDEwMDApOworCQl9IGVsc2UgeworCQkJZHByaW50ZigoIkF1dG8tbmVnb3RpYXRpb24gRW5hYmxlZC5cbiIsCisJCQkJIHBjaS0+bmFtZSkpOworCisJCQkvKiBlbmFibGUgMTAvMTAwIEZ1bGwvSGFsZiBNb2RlLCBsZWF2ZSBQSFlfQVVUT19ORUdPX1JFRyBiaXQ0OjAgdW5jaGFuZ2VkICovCisJCQltZGlvX3dyaXRlKFBIWV9BVVRPX05FR09fUkVHLAorCQkJCSAgIFBIWV9DYXBfMTBfSGFsZiB8IFBIWV9DYXBfMTBfRnVsbCB8CisJCQkJICAgUEhZX0NhcF8xMDBfSGFsZiB8IFBIWV9DYXBfMTAwX0Z1bGwgfAorCQkJCSAgICh2YWwgJiAweDFGKSk7CisKKwkJCS8qIGVuYWJsZSAxMDAwIEZ1bGwgTW9kZSAqLworCQkJbWRpb193cml0ZShQSFlfMTAwMF9DVFJMX1JFRywgUEhZX0NhcF8xMDAwX0Z1bGwpOworCisJCX0KKworCQkvKiBFbmFibGUgYXV0by1uZWdvdGlhdGlvbiBhbmQgcmVzdGFydCBhdXRvLW5pZ290aWF0aW9uICovCisJCW1kaW9fd3JpdGUoUEhZX0NUUkxfUkVHLAorCQkJICAgUEhZX0VuYWJsZV9BdXRvX05lZ28gfCBQSFlfUmVzdGFydF9BdXRvX05lZ28pOworCQl1ZGVsYXkoMTAwKTsKKworCQkvKiB3YWl0IGZvciBhdXRvLW5lZ290aWF0aW9uIHByb2Nlc3MgKi8KKwkJZm9yIChpID0gMTAwMDA7IGkgPiAwOyBpLS0pIHsKKwkJCS8qIENoZWNrIGlmIGF1dG8tbmVnb3RpYXRpb24gY29tcGxldGUgKi8KKwkJCWlmIChtZGlvX3JlYWQoUEhZX1NUQVRfUkVHKSAmIFBIWV9BdXRvX05lY29fQ29tcCkgeworCQkJCXVkZWxheSgxMDApOworCQkJCW9wdGlvbiA9IFJUTF9SOChQSFlzdGF0dXMpOworCQkJCWlmIChvcHRpb24gJiBfMTAwMGJwc0YpIHsKKwkJCQkJcHJpbnRmCisJCQkJCSAgICAoIjEwMDBNYnBzIEZ1bGwtZHVwbGV4IG9wZXJhdGlvbi5cbiIpOworCQkJCX0gZWxzZSB7CisJCQkJCXByaW50ZgorCQkJCQkgICAgKCIlc01icHMgJXMtZHVwbGV4IG9wZXJhdGlvbi5cbiIsCisJCQkJCSAgICAgKG9wdGlvbiAmIF8xMDBicHMpID8gIjEwMCIgOgorCQkJCQkgICAgICIxMCIsCisJCQkJCSAgICAgKG9wdGlvbiAmIEZ1bGxEdXApID8gIkZ1bGwiIDoKKwkJCQkJICAgICAiSGFsZiIpOworCQkJCX0KKwkJCQlicmVhazsKKwkJCX0gZWxzZSB7CisJCQkJdWRlbGF5KDEwMCk7CisJCQl9CisJCX0JCS8qIGVuZCBmb3ItbG9vcCB0byB3YWl0IGZvciBhdXRvLW5lZ290aWF0aW9uIHByb2Nlc3MgKi8KKworCX0gZWxzZSB7CisJCXVkZWxheSgxMDApOworCQlwcmludGYKKwkJICAgICgiJXM6IDEwMDBNYnBzIEZ1bGwtZHVwbGV4IG9wZXJhdGlvbiwgVEJJIExpbmsgJXMhXG4iLAorCQkgICAgIHBjaS0+bmFtZSwKKwkJICAgICAoUlRMX1IzMihUQklDU1IpICYgVEJJTGlua09LKSA/ICJPSyIgOiAiRmFpbGVkIik7CisKKwl9CisKKwlyODE2OV9yZXNldChuaWMpOworCS8qIHBvaW50IHRvIE5JQyBzcGVjaWZpYyByb3V0aW5lcyAqLworCWRldi0+ZGlzYWJsZSA9IHI4MTY5X2Rpc2FibGU7CisJbmljLT5wb2xsID0gcjgxNjlfcG9sbDsKKwluaWMtPnRyYW5zbWl0ID0gcjgxNjlfdHJhbnNtaXQ7CisJbmljLT5pcnFubyA9IHBjaS0+aXJxOworCW5pYy0+aXJxID0gcjgxNjlfaXJxOworCW5pYy0+aW9hZGRyID0gaW9hZGRyOworCXJldHVybiAxOworCit9CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2lkIHI4MTY5X25pY3NbXSA9IHsKKwlQQ0lfUk9NKDB4MTBlYywgMHg4MTY5LCAicjgxNjkiLCAiUmVhbFRlayBSVEw4MTY5IEdpZ2FiaXQgRXRoZXJuZXQiKSwKK307CisKK3N0cnVjdCBwY2lfZHJpdmVyIHI4MTY5X2RyaXZlciA9IHsKKwkudHlwZSA9IE5JQ19EUklWRVIsCisJLm5hbWUgPSAicjgxNjkvUENJIiwKKwkucHJvYmUgPSByODE2OV9wcm9iZSwKKwkuaWRzID0gcjgxNjlfbmljcywKKwkuaWRfY291bnQgPSBzaXplb2YocjgxNjlfbmljcykgLyBzaXplb2YocjgxNjlfbmljc1swXSksCisJLmNsYXNzID0gMCwKK307CmRpZmYgLU5hdXIgZ3J1Yi0wLjk3Lm9yaWcvbmV0Ym9vdC9ydGw4MTM5LmMgZ3J1Yi0wLjk3L25ldGJvb3QvcnRsODEzOS5jCi0tLSBncnViLTAuOTcub3JpZy9uZXRib290L3J0bDgxMzkuYwkyMDAzLTA3LTA5IDExOjQ1OjM4LjAwMDAwMDAwMCArMDAwMAorKysgZ3J1Yi0wLjk3L25ldGJvb3QvcnRsODEzOS5jCTIwMDUtMDgtMzEgMTk6MDM6MzUuMDAwMDAwMDAwICswMDAwCkBAIC0xNyw2ICsxNyw4IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKgorICAyOCBEZWMgMjAwMglrZW5feWFwQHVzZXJzLnNvdXJjZWZvcmdlLm5ldCAoS2VuIFlhcCkKKyAgICAgUHV0IGluIHZpcnRfdG9fYnVzIGNhbGxzIHRvIGFsbG93IEV0aGVyYm9vdCByZWxvY2F0aW9uLgogCiAgIDA2IEFwciAyMDAxCWtlbl95YXBAdXNlcnMuc291cmNlZm9yZ2UubmV0IChLZW4gWWFwKQogICAgICBGb2xsb3dpbmcgZW1haWwgZnJvbSBIeXVuLUpvb24gQ2hhLCBhZGRlZCBhIGRpc2FibGUgcm91dGluZSwgb3RoZXJ3aXNlCkBAIC02Myw3ICs2NSw2IEBACiAjaW5jbHVkZSAiZXRoZXJib290LmgiCiAjaW5jbHVkZSAibmljLmgiCiAjaW5jbHVkZSAicGNpLmgiCi0jaW5jbHVkZSAiY2FyZHMuaCIKICNpbmNsdWRlICJ0aW1lci5oIgogCiAjZGVmaW5lIFJUTF9USU1FT1VUICgxKlRJQ0tTX1BFUl9TRUMpCkBAIC0xMTIsOSArMTEzLDE5IEBACiAJICogZGVmaW5pdGlvbnMgd2Ugd2lsbCBwcm9iYWJseSBuZXZlciBuZWVkIHRvIGtub3cgYWJvdXQuICAqLwogfTsKIAorZW51bSBSeEVhcmx5U3RhdHVzQml0cyB7CisJRVJHb29kPTB4MDgsIEVSQmFkPTB4MDQsIEVST1ZXPTB4MDIsIEVST0s9MHgwMQorfTsKKwogZW51bSBDaGlwQ21kQml0cyB7CiAJQ21kUmVzZXQ9MHgxMCwgQ21kUnhFbmI9MHgwOCwgQ21kVHhFbmI9MHgwNCwgUnhCdWZFbXB0eT0weDAxLCB9OwogCitlbnVtIEludHJNYXNrQml0cyB7CisJU0VSUj0weDgwMDAsIFRpbWVPdXQ9MHg0MDAwLCBMZW5DaGc9MHgyMDAwLAorCUZPVlc9MHg0MCwgUFVOX0xpbmtDaGc9MHgyMCwgUlhPVlc9MHgxMCwKKwlURVI9MHgwOCwgVE9LPTB4MDQsIFJFUj0weDAyLCBST0s9MHgwMQorfTsKKwogLyogSW50ZXJydXB0IHJlZ2lzdGVyIGJpdHMsIHVzaW5nIG15IG93biBtZWFuaW5nZnVsIG5hbWVzLiAqLwogZW51bSBJbnRyU3RhdHVzQml0cyB7CiAJUENJRXJyPTB4ODAwMCwgUENTVGltZW91dD0weDQwMDAsIENhYmxlTGVuQ2hhbmdlPSAweDIwMDAsCkBAIC0xNTUsNzQgKzE2Niw2OCBAQAogCUFjY2VwdE11bHRpY2FzdD0weDA0LCBBY2NlcHRNeVBoeXM9MHgwMiwgQWNjZXB0QWxsUGh5cz0weDAxLAogfTsKIAotc3RhdGljIGludCBpb2FkZHI7CiBzdGF0aWMgdW5zaWduZWQgaW50IGN1cl9yeCxjdXJfdHg7CiAKIC8qIFRoZSBSVEw4MTM5IGNhbiBvbmx5IHRyYW5zbWl0IGZyb20gYSBjb250aWd1b3VzLCBhbGlnbmVkIG1lbW9yeSBibG9jay4gICovCiBzdGF0aWMgdW5zaWduZWQgY2hhciB0eF9idWZmZXJbVFhfQlVGX1NJWkVdIF9fYXR0cmlidXRlX18oKGFsaWduZWQoNCkpKTsKLQotLyogSSBrbm93IHRoYXQgdGhpcyBpcyBhIE1FR0EgSEFDSywgYnV0IHRoZSB0YWdnZWQgYm9vdCBpbWFnZSBzcGVjaWZpY2F0aW9uCi0gKiBzdGF0ZXMgdGhhdCB3ZSBjYW4gZG8gd2hhdGV2ZXIgd2Ugd2FudCBiZWxvdyAweDEwMDAwIC0gc28gd2UgZG8hICAqLwotLyogQnV0IHdlIHN0aWxsIGdpdmUgdGhlIHVzZXIgdGhlIGNob2ljZSBvZiB1c2luZyBhbiBpbnRlcm5hbCBidWZmZXIKLSAgIGp1c3QgaW4gY2FzZSAtIEtlbiAqLwotI2lmZGVmCVVTRV9MT1dNRU1fQlVGRkVSCi0jZGVmaW5lIHJ4X3JpbmcgKCh1bnNpZ25lZCBjaGFyICopKDB4MTAwMDAgLSAoUlhfQlVGX0xFTiArIDE2KSkpCi0jZWxzZQogc3RhdGljIHVuc2lnbmVkIGNoYXIgcnhfcmluZ1tSWF9CVUZfTEVOKzE2XSBfX2F0dHJpYnV0ZV9fKChhbGlnbmVkKDQpKSk7Ci0jZW5kaWYKIAotc3RydWN0IG5pYyAqcnRsODEzOV9wcm9iZShzdHJ1Y3QgbmljICpuaWMsIHVuc2lnbmVkIHNob3J0ICpwcm9iZWFkZHJzLAotCXN0cnVjdCBwY2lfZGV2aWNlICpwY2kpOwotc3RhdGljIGludCByZWFkX2VlcHJvbShpbnQgbG9jYXRpb24pOworc3RhdGljIGludCBydGw4MTM5X3Byb2JlKHN0cnVjdCBkZXYgKmRldiwgc3RydWN0IHBjaV9kZXZpY2UgKnBjaSk7CitzdGF0aWMgaW50IHJlYWRfZWVwcm9tKHN0cnVjdCBuaWMgKm5pYywgaW50IGxvY2F0aW9uLCBpbnQgYWRkcl9sZW4pOwogc3RhdGljIHZvaWQgcnRsX3Jlc2V0KHN0cnVjdCBuaWMgKm5pYyk7CiBzdGF0aWMgdm9pZCBydGxfdHJhbnNtaXQoc3RydWN0IG5pYyAqbmljLCBjb25zdCBjaGFyICpkZXN0YWRkciwKIAl1bnNpZ25lZCBpbnQgdHlwZSwgdW5zaWduZWQgaW50IGxlbiwgY29uc3QgY2hhciAqZGF0YSk7Ci1zdGF0aWMgaW50IHJ0bF9wb2xsKHN0cnVjdCBuaWMgKm5pYyk7Ci1zdGF0aWMgdm9pZCBydGxfZGlzYWJsZShzdHJ1Y3QgbmljKik7CitzdGF0aWMgaW50IHJ0bF9wb2xsKHN0cnVjdCBuaWMgKm5pYywgaW50IHJldHJpZXZlKTsKK3N0YXRpYyB2b2lkIHJ0bF9kaXNhYmxlKHN0cnVjdCBkZXYgKik7CitzdGF0aWMgdm9pZCBydGxfaXJxKHN0cnVjdCBuaWMgKm5pYywgaXJxX2FjdGlvbl90IGFjdGlvbik7CiAKIAotc3RydWN0IG5pYyAqcnRsODEzOV9wcm9iZShzdHJ1Y3QgbmljICpuaWMsIHVuc2lnbmVkIHNob3J0ICpwcm9iZWFkZHJzLAotCXN0cnVjdCBwY2lfZGV2aWNlICpwY2kpCitzdGF0aWMgaW50IHJ0bDgxMzlfcHJvYmUoc3RydWN0IGRldiAqZGV2LCBzdHJ1Y3QgcGNpX2RldmljZSAqcGNpKQogeworCXN0cnVjdCBuaWMgKm5pYyA9IChzdHJ1Y3QgbmljICopZGV2OwogCWludCBpOwogCWludCBzcGVlZDEwLCBmdWxsZHVwbGV4OworCWludCBhZGRyX2xlbjsKKwl1bnNpZ25lZCBzaG9ydCAqYXAgPSAodW5zaWduZWQgc2hvcnQqKW5pYy0+bm9kZV9hZGRyOwogCiAJLyogVGhlcmUgYXJlIGVub3VnaCAiUlRMODEzOSIgc3RyaW5ncyBvbiB0aGUgY29uc29sZSBhbHJlYWR5LCBzbwogCSAqIGJlIGJyaWVmIGFuZCBjb25jZW50cmF0ZSBvbiB0aGUgaW50ZXJlc3RpbmcgcGllY2VzIG9mIGluZm8uLi4gKi8KIAlwcmludGYoIiAtICIpOwogCiAJLyogTWFzayB0aGUgYml0IHRoYXQgc2F5cyAidGhpcyBpcyBhbiBpbyBhZGRyIiAqLwotCWlvYWRkciA9IHByb2JlYWRkcnNbMF0gJiB+MzsKKwluaWMtPmlvYWRkciA9IHBjaS0+aW9hZGRyICYgfjM7CisKKwkvKiBDb3B5IElSUSBmcm9tIFBDSSBpbmZvcm1hdGlvbiAqLworCW5pYy0+aXJxbm8gPSBwY2ktPmlycTsKIAogCWFkanVzdF9wY2lfZGV2aWNlKHBjaSk7CiAKIAkvKiBCcmluZyB0aGUgY2hpcCBvdXQgb2YgbG93LXBvd2VyIG1vZGUuICovCi0Jb3V0YigweDAwLCBpb2FkZHIgKyBDb25maWcxKTsKLQotCWlmIChyZWFkX2VlcHJvbSgwKSAhPSAweGZmZmYpIHsKLQkJdW5zaWduZWQgc2hvcnQgKmFwID0gKHVuc2lnbmVkIHNob3J0KiluaWMtPm5vZGVfYWRkcjsKLQkJZm9yIChpID0gMDsgaSA8IDM7IGkrKykKLQkJCSphcCsrID0gcmVhZF9lZXByb20oaSArIDcpOwotCX0gZWxzZSB7Ci0JCXVuc2lnbmVkIGNoYXIgKmFwID0gKHVuc2lnbmVkIGNoYXIqKW5pYy0+bm9kZV9hZGRyOwotCQlmb3IgKGkgPSAwOyBpIDwgRVRIX0FMRU47IGkrKykKLQkJCSphcCsrID0gaW5iKGlvYWRkciArIE1BQzAgKyBpKTsKLQl9CisJb3V0YigweDAwLCBuaWMtPmlvYWRkciArIENvbmZpZzEpOwogCi0Jc3BlZWQxMCA9IGluYihpb2FkZHIgKyBNZWRpYVN0YXR1cykgJiBNU1JTcGVlZDEwOwotCWZ1bGxkdXBsZXggPSBpbncoaW9hZGRyICsgTUlJX0JNQ1IpICYgQk1DUkR1cGxleDsKLQlwcmludGYoImlvYWRkciAlI2hYLCBhZGRyICUhICVzTWJwcyAlcy1kdXBsZXhcbiIsIGlvYWRkciwKLQkJbmljLT5ub2RlX2FkZHIsICBzcGVlZDEwID8gIjEwIiA6ICIxMDAiLAotCQlmdWxsZHVwbGV4ID8gImZ1bGwiIDogImhhbGYiKTsKKwlhZGRyX2xlbiA9IHJlYWRfZWVwcm9tKG5pYywwLDgpID09IDB4ODEyOSA/IDggOiA2OworCWZvciAoaSA9IDA7IGkgPCAzOyBpKyspCisJICAqYXArKyA9IHJlYWRfZWVwcm9tKG5pYyxpICsgNyxhZGRyX2xlbik7CisKKwlzcGVlZDEwID0gaW5iKG5pYy0+aW9hZGRyICsgTWVkaWFTdGF0dXMpICYgTVNSU3BlZWQxMDsKKwlmdWxsZHVwbGV4ID0gaW53KG5pYy0+aW9hZGRyICsgTUlJX0JNQ1IpICYgQk1DUkR1cGxleDsKKwlwcmludGYoImlvYWRkciAlI2hYLCBpcnEgJWQsIGFkZHIgJSEgJXNNYnBzICVzLWR1cGxleFxuIiwgbmljLT5pb2FkZHIsCisJICAgICAgIG5pYy0+aXJxbm8sIG5pYy0+bm9kZV9hZGRyLCAgc3BlZWQxMCA/ICIxMCIgOiAiMTAwIiwKKwkgICAgICAgZnVsbGR1cGxleCA/ICJmdWxsIiA6ICJoYWxmIik7CiAKIAlydGxfcmVzZXQobmljKTsKIAotCW5pYy0+cmVzZXQgPSBydGxfcmVzZXQ7Ci0JbmljLT5wb2xsID0gcnRsX3BvbGw7CisJaWYgKGluYihuaWMtPmlvYWRkciArIE1lZGlhU3RhdHVzKSAmIE1TUkxpbmtGYWlsKSB7CisJCXByaW50ZigiQ2FibGUgbm90IGNvbm5lY3RlZCBvciBvdGhlciBsaW5rIGZhaWx1cmVcbiIpOworCQlyZXR1cm4oMCk7CisJfQorCisJZGV2LT5kaXNhYmxlICA9IHJ0bF9kaXNhYmxlOworCW5pYy0+cG9sbCAgICAgPSBydGxfcG9sbDsKIAluaWMtPnRyYW5zbWl0ID0gcnRsX3RyYW5zbWl0OwotCW5pYy0+ZGlzYWJsZSA9IHJ0bF9kaXNhYmxlOworCW5pYy0+aXJxICAgICAgPSBydGxfaXJxOwogCi0JcmV0dXJuIG5pYzsKKwlyZXR1cm4gMTsKIH0KIAogLyogU2VyaWFsIEVFUFJPTSBzZWN0aW9uLiAqLwpAQCAtMjQ0LDIyICsyNDksMjMgQEAKICNkZWZpbmUgZWVwcm9tX2RlbGF5KCkgIGlubChlZV9hZGRyKQogCiAvKiBUaGUgRUVQUk9NIGNvbW1hbmRzIGluY2x1ZGUgdGhlIGFsd2F5LXNldCBsZWFkaW5nIGJpdC4gKi8KLSNkZWZpbmUgRUVfV1JJVEVfQ01EICAgICg1IDw8IDYpCi0jZGVmaW5lIEVFX1JFQURfQ01EICAgICAoNiA8PCA2KQotI2RlZmluZSBFRV9FUkFTRV9DTUQgICAgKDcgPDwgNikKKyNkZWZpbmUgRUVfV1JJVEVfQ01EICAgICg1KQorI2RlZmluZSBFRV9SRUFEX0NNRCAgICAgKDYpCisjZGVmaW5lIEVFX0VSQVNFX0NNRCAgICAoNykKIAotc3RhdGljIGludCByZWFkX2VlcHJvbShpbnQgbG9jYXRpb24pCitzdGF0aWMgaW50IHJlYWRfZWVwcm9tKHN0cnVjdCBuaWMgKm5pYywgaW50IGxvY2F0aW9uLCBpbnQgYWRkcl9sZW4pCiB7CiAJaW50IGk7CiAJdW5zaWduZWQgaW50IHJldHZhbCA9IDA7Ci0JbG9uZyBlZV9hZGRyID0gaW9hZGRyICsgQ2ZnOTM0NjsKLQlpbnQgcmVhZF9jbWQgPSBsb2NhdGlvbiB8IEVFX1JFQURfQ01EOworCWxvbmcgZWVfYWRkciA9IG5pYy0+aW9hZGRyICsgQ2ZnOTM0NjsKKwlpbnQgcmVhZF9jbWQgPSBsb2NhdGlvbiB8IChFRV9SRUFEX0NNRCA8PCBhZGRyX2xlbik7CiAKIAlvdXRiKEVFX0VOQiAmIH5FRV9DUywgZWVfYWRkcik7CiAJb3V0YihFRV9FTkIsIGVlX2FkZHIpOworCWVlcHJvbV9kZWxheSgpOwogCiAJLyogU2hpZnQgdGhlIHJlYWQgY29tbWFuZCBiaXRzIG91dC4gKi8KLQlmb3IgKGkgPSAxMDsgaSA+PSAwOyBpLS0pIHsKKwlmb3IgKGkgPSA0ICsgYWRkcl9sZW47IGkgPj0gMDsgaS0tKSB7CiAJCWludCBkYXRhdmFsID0gKHJlYWRfY21kICYgKDEgPDwgaSkpID8gRUVfREFUQV9XUklURSA6IDA7CiAJCW91dGIoRUVfRU5CIHwgZGF0YXZhbCwgZWVfYWRkcik7CiAJCWVlcHJvbV9kZWxheSgpOwpAQCAtMjc5LDMxICsyODUsNTEgQEAKIAogCS8qIFRlcm1pbmF0ZSB0aGUgRUVQUk9NIGFjY2Vzcy4gKi8KIAlvdXRiKH5FRV9DUywgZWVfYWRkcik7CisJZWVwcm9tX2RlbGF5KCk7CiAJcmV0dXJuIHJldHZhbDsKIH0KIAorc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBydGw4MTM5X3J4X2NvbmZpZyA9IAorCShSWF9CVUZfTEVOX0lEWCA8PCAxMSkgfAorCShSWF9GSUZPX1RIUkVTSCA8PCAxMykgfAorCShSWF9ETUFfQlVSU1QgPDwgOCk7CisJCitzdGF0aWMgdm9pZCBzZXRfcnhfbW9kZShzdHJ1Y3QgbmljICpuaWMpIHsKKwl1bnNpZ25lZCBpbnQgbWNfZmlsdGVyWzJdOworCWludCByeF9tb2RlOworCS8qICFJRkZfUFJPTUlTQyAqLworCXJ4X21vZGUgPSBBY2NlcHRCcm9hZGNhc3QgfCBBY2NlcHRNdWx0aWNhc3QgfCBBY2NlcHRNeVBoeXM7CisJbWNfZmlsdGVyWzFdID0gbWNfZmlsdGVyWzBdID0gMHhmZmZmZmZmZjsKKworCW91dGwocnRsODEzOV9yeF9jb25maWcgfCByeF9tb2RlLCBuaWMtPmlvYWRkciArIFJ4Q29uZmlnKTsKKworCW91dGwobWNfZmlsdGVyWzBdLCBuaWMtPmlvYWRkciArIE1BUjAgKyAwKTsKKwlvdXRsKG1jX2ZpbHRlclsxXSwgbmljLT5pb2FkZHIgKyBNQVIwICsgNCk7Cit9CisJCiBzdGF0aWMgdm9pZCBydGxfcmVzZXQoc3RydWN0IG5pYyogbmljKQogewogCWludCBpOwogCi0Jb3V0YihDbWRSZXNldCwgaW9hZGRyICsgQ2hpcENtZCk7CisJb3V0YihDbWRSZXNldCwgbmljLT5pb2FkZHIgKyBDaGlwQ21kKTsKIAogCWN1cl9yeCA9IDA7CiAJY3VyX3R4ID0gMDsKIAogCS8qIEdpdmUgdGhlIGNoaXAgMTBtcyB0byBmaW5pc2ggdGhlIHJlc2V0LiAqLwogCWxvYWRfdGltZXIyKDEwKlRJQ0tTX1BFUl9NUyk7Ci0Jd2hpbGUgKChpbmIoaW9hZGRyICsgQ2hpcENtZCkgJiBDbWRSZXNldCkgIT0gMCAmJiB0aW1lcjJfcnVubmluZygpKQorCXdoaWxlICgoaW5iKG5pYy0+aW9hZGRyICsgQ2hpcENtZCkgJiBDbWRSZXNldCkgIT0gMCAmJgorCSAgICAgICB0aW1lcjJfcnVubmluZygpKQogCQkvKiB3YWl0ICovOwogCiAJZm9yIChpID0gMDsgaSA8IEVUSF9BTEVOOyBpKyspCi0JCW91dGIobmljLT5ub2RlX2FkZHJbaV0sIGlvYWRkciArIE1BQzAgKyBpKTsKKwkJb3V0YihuaWMtPm5vZGVfYWRkcltpXSwgbmljLT5pb2FkZHIgKyBNQUMwICsgaSk7CiAKIAkvKiBNdXN0IGVuYWJsZSBUeC9SeCBiZWZvcmUgc2V0dGluZyB0cmFuc2ZlciB0aHJlc2hvbGRzISAqLwotCW91dGIoQ21kUnhFbmIgfCBDbWRUeEVuYiwgaW9hZGRyICsgQ2hpcENtZCk7CisJb3V0YihDbWRSeEVuYiB8IENtZFR4RW5iLCBuaWMtPmlvYWRkciArIENoaXBDbWQpOwogCW91dGwoKFJYX0ZJRk9fVEhSRVNIPDwxMykgfCAoUlhfQlVGX0xFTl9JRFg8PDExKSB8IChSWF9ETUFfQlVSU1Q8PDgpLAotCQlpb2FkZHIgKyBSeENvbmZpZyk7CQkvKiBhY2NlcHQgbm8gZnJhbWVzIHlldCEgICovCi0Jb3V0bCgoVFhfRE1BX0JVUlNUPDw4KXwweDAzMDAwMDAwLCBpb2FkZHIgKyBUeENvbmZpZyk7CisJCW5pYy0+aW9hZGRyICsgUnhDb25maWcpOwkgIC8qIGFjY2VwdCBubyBmcmFtZXMgeWV0ISAgKi8KKwlvdXRsKChUWF9ETUFfQlVSU1Q8PDgpfDB4MDMwMDAwMDAsIG5pYy0+aW9hZGRyICsgVHhDb25maWcpOwogCiAJLyogVGhlIExpbnV4IGRyaXZlciBjaGFuZ2VzIENvbmZpZzEgaGVyZSB0byB1c2UgYSBkaWZmZXJlbnQgTEVEIHBhdHRlcm4KIAkgKiBmb3IgaGFsZiBkdXBsZXggb3IgZnVsbC9hdXRvZGV0ZWN0IGR1cGxleCAoZm9yIGZ1bGwvYXV0b2RldGVjdCwgdGhlCkBAIC0zMTYsMTkgKzM0MiwyNiBAQAogI2lmZGVmCURFQlVHX1JYCiAJcHJpbnRmKCJyeCByaW5nIGFkZHJlc3MgaXMgJVhcbiIsKHVuc2lnbmVkIGxvbmcpcnhfcmluZyk7CiAjZW5kaWYKLQlvdXRsKCh1bnNpZ25lZCBsb25nKXJ4X3JpbmcsIGlvYWRkciArIFJ4QnVmKTsKKwlvdXRsKCh1bnNpZ25lZCBsb25nKXZpcnRfdG9fYnVzKHJ4X3JpbmcpLCBuaWMtPmlvYWRkciArIFJ4QnVmKTsKKworCiAKLQkvKiBTdGFydCB0aGUgY2hpcCdzIFR4IGFuZCBSeCBwcm9jZXNzLiAqLwotCW91dGwoMCwgaW9hZGRyICsgUnhNaXNzZWQpOwotCS8qIHNldF9yeF9tb2RlICovCi0Jb3V0YihBY2NlcHRCcm9hZGNhc3R8QWNjZXB0TXlQaHlzLCBpb2FkZHIgKyBSeENvbmZpZyk7CiAJLyogSWYgd2UgYWRkIG11bHRpY2FzdCBzdXBwb3J0LCB0aGUgTUFSMCByZWdpc3RlciB3b3VsZCBoYXZlIHRvIGJlCiAJICogaW5pdGlhbGl6ZWQgdG8gMHhmZmZmZmZmZmZmZmZmZmZmICh0d28gMzIgYml0IGFjY2Vzc2VzKS4gIEV0aGVyYm9vdAogCSAqIG9ubHkgbmVlZHMgYnJvYWRjYXN0IChmb3IgQVJQL1JBUlAvQk9PVFAvREhDUCkgYW5kIHVuaWNhc3QuICAqLwotCW91dGIoQ21kUnhFbmIgfCBDbWRUeEVuYiwgaW9hZGRyICsgQ2hpcENtZCk7CiAKKwlvdXRiKENtZFJ4RW5iIHwgQ21kVHhFbmIsIG5pYy0+aW9hZGRyICsgQ2hpcENtZCk7CisJCisJb3V0bChydGw4MTM5X3J4X2NvbmZpZywgbmljLT5pb2FkZHIgKyBSeENvbmZpZyk7CisJCisJLyogU3RhcnQgdGhlIGNoaXAncyBUeCBhbmQgUnggcHJvY2Vzcy4gKi8KKwlvdXRsKDAsIG5pYy0+aW9hZGRyICsgUnhNaXNzZWQpOworCisJLyogc2V0X3J4X21vZGUgKi8KKwlzZXRfcnhfbW9kZShuaWMpOworCQogCS8qIERpc2FibGUgYWxsIGtub3duIGludGVycnVwdHMgYnkgc2V0dGluZyB0aGUgaW50ZXJydXB0IG1hc2suICovCi0Jb3V0dygwLCBpb2FkZHIgKyBJbnRyTWFzayk7CisJb3V0dygwLCBuaWMtPmlvYWRkciArIEludHJNYXNrKTsKIH0KIAogc3RhdGljIHZvaWQgcnRsX3RyYW5zbWl0KHN0cnVjdCBuaWMgKm5pYywgY29uc3QgY2hhciAqZGVzdGFkZHIsCkBAIC0zMzcsMTAgKzM3MCwxMSBAQAogCXVuc2lnbmVkIGludCBzdGF0dXMsIHRvLCBuc3R5cGU7CiAJdW5zaWduZWQgbG9uZyB0eHN0YXR1czsKIAorCS8qIG5zdHlwZSBhc3NpZ25tZW50IG1vdmVkIHVwIGhlcmUgdG8gYXZvaWQgZ2NjIDMuMC4zIGNvbXBpbGVyIGJ1ZyAqLworCW5zdHlwZSA9IGh0b25zKHR5cGUpOwogCW1lbWNweSh0eF9idWZmZXIsIGRlc3RhZGRyLCBFVEhfQUxFTik7CiAJbWVtY3B5KHR4X2J1ZmZlciArIEVUSF9BTEVOLCBuaWMtPm5vZGVfYWRkciwgRVRIX0FMRU4pOwotCW5zdHlwZSA9IGh0b25zKHR5cGUpOwotCW1lbWNweSh0eF9idWZmZXIgKyAyICogRVRIX0FMRU4sIChjaGFyKikmbnN0eXBlLCAyKTsKKwltZW1jcHkodHhfYnVmZmVyICsgMiAqIEVUSF9BTEVOLCAmbnN0eXBlLCAyKTsKIAltZW1jcHkodHhfYnVmZmVyICsgRVRIX0hMRU4sIGRhdGEsIGxlbik7CiAKIAlsZW4gKz0gRVRIX0hMRU47CkBAIC0zNTQsMjIgKzM4OCwyMiBAQAogCQl0eF9idWZmZXJbbGVuKytdID0gJ1wwJzsKIAl9CiAKLQlvdXRsKCh1bnNpZ25lZCBsb25nKXR4X2J1ZmZlciwgaW9hZGRyICsgVHhBZGRyMCArIGN1cl90eCo0KTsKKwlvdXRsKCh1bnNpZ25lZCBsb25nKXZpcnRfdG9fYnVzKHR4X2J1ZmZlciksIG5pYy0+aW9hZGRyICsgVHhBZGRyMCArIGN1cl90eCo0KTsKIAlvdXRsKCgoVFhfRklGT19USFJFU0g8PDExKSAmIDB4MDAzZjAwMDApIHwgbGVuLAotCQlpb2FkZHIgKyBUeFN0YXR1czAgKyBjdXJfdHgqNCk7CisJCW5pYy0+aW9hZGRyICsgVHhTdGF0dXMwICsgY3VyX3R4KjQpOwogCiAJdG8gPSBjdXJydGlja3MoKSArIFJUTF9USU1FT1VUOwogCiAJZG8gewotCQlzdGF0dXMgPSBpbncoaW9hZGRyICsgSW50clN0YXR1cyk7CisJCXN0YXR1cyA9IGludyhuaWMtPmlvYWRkciArIEludHJTdGF0dXMpOwogCQkvKiBPbmx5IGFja25sb3dsZWRnZSBpbnRlcnJ1cHQgc291cmNlcyB3ZSBjYW4gcHJvcGVybHkgaGFuZGxlCiAJCSAqIGhlcmUgLSB0aGUgUnhPdmVyZmxvdy9SeEZJRk9PdmVyIE1VU1QgYmUgaGFuZGxlZCBpbiB0aGUKIAkJICogcnRsX3BvbGwoKSBmdW5jdGlvbi4gICovCi0JCW91dHcoc3RhdHVzICYgKFR4T0sgfCBUeEVyciB8IFBDSUVyciksIGlvYWRkciArIEludHJTdGF0dXMpOworCQlvdXR3KHN0YXR1cyAmIChUeE9LIHwgVHhFcnIgfCBQQ0lFcnIpLCBuaWMtPmlvYWRkciArIEludHJTdGF0dXMpOwogCQlpZiAoKHN0YXR1cyAmIChUeE9LIHwgVHhFcnIgfCBQQ0lFcnIpKSAhPSAwKSBicmVhazsKIAl9IHdoaWxlIChjdXJydGlja3MoKSA8IHRvKTsKIAotCXR4c3RhdHVzID0gaW5sKGlvYWRkcisgVHhTdGF0dXMwICsgY3VyX3R4KjQpOworCXR4c3RhdHVzID0gaW5sKG5pYy0+aW9hZGRyKyBUeFN0YXR1czAgKyBjdXJfdHgqNCk7CiAKIAlpZiAoc3RhdHVzICYgVHhPSykgewogCQljdXJfdHggPSAoY3VyX3R4ICsgMSkgJSBOVU1fVFhfREVTQzsKQEAgLTM4NiwxOSArNDIwLDIyIEBACiAJfQogfQogCi1zdGF0aWMgaW50IHJ0bF9wb2xsKHN0cnVjdCBuaWMgKm5pYykKK3N0YXRpYyBpbnQgcnRsX3BvbGwoc3RydWN0IG5pYyAqbmljLCBpbnQgcmV0cmlldmUpCiB7CiAJdW5zaWduZWQgaW50IHN0YXR1czsKIAl1bnNpZ25lZCBpbnQgcmluZ19vZmZzOwogCXVuc2lnbmVkIGludCByeF9zaXplLCByeF9zdGF0dXM7CiAKLQlpZiAoaW5iKGlvYWRkciArIENoaXBDbWQpICYgUnhCdWZFbXB0eSkgeworCWlmIChpbmIobmljLT5pb2FkZHIgKyBDaGlwQ21kKSAmIFJ4QnVmRW1wdHkpIHsKIAkJcmV0dXJuIDA7CiAJfQogCi0Jc3RhdHVzID0gaW53KGlvYWRkciArIEludHJTdGF0dXMpOworCS8qIFRoZXJlIGlzIGEgcGFja2V0IHJlYWR5ICovCisJaWYgKCAhIHJldHJpZXZlICkgcmV0dXJuIDE7CisKKwlzdGF0dXMgPSBpbncobmljLT5pb2FkZHIgKyBJbnRyU3RhdHVzKTsKIAkvKiBTZWUgYmVsb3cgZm9yIHRoZSByZXN0IG9mIHRoZSBpbnRlcnJ1cHQgYWNrbm93bGVkZ2VzLiAgKi8KLQlvdXR3KHN0YXR1cyAmIH4oUnhGSUZPT3ZlciB8IFJ4T3ZlcmZsb3cgfCBSeE9LKSwgaW9hZGRyICsgSW50clN0YXR1cyk7CisJb3V0dyhzdGF0dXMgJiB+KFJ4RklGT092ZXIgfCBSeE92ZXJmbG93IHwgUnhPSyksIG5pYy0+aW9hZGRyICsgSW50clN0YXR1cyk7CiAKICNpZmRlZglERUJVR19SWAogCXByaW50ZigicnRsX3BvbGw6IGludCAlaFggIiwgc3RhdHVzKTsKQEAgLTQzOCwyMSArNDc1LDc3IEBACiAJCW5pYy0+cGFja2V0WzEyXSwgbmljLT5wYWNrZXRbMTNdLCByeF9zdGF0dXMpOwogI2VuZGlmCiAJY3VyX3J4ID0gKGN1cl9yeCArIHJ4X3NpemUgKyA0ICsgMykgJiB+MzsKLQlvdXR3KGN1cl9yeCAtIDE2LCBpb2FkZHIgKyBSeEJ1ZlB0cik7CisJb3V0dyhjdXJfcnggLSAxNiwgbmljLT5pb2FkZHIgKyBSeEJ1ZlB0cik7CiAJLyogU2VlIFJUTDgxMzkgUHJvZ3JhbW1pbmcgR3VpZGUgVjAuMSBmb3IgdGhlIG9mZmljaWFsIGhhbmRsaW5nIG9mCiAJICogUnggb3ZlcmZsb3cgc2l0dWF0aW9ucy4gIFRoZSBkb2N1bWVudCBpdHNlbGYgY29udGFpbnMgYmFzaWNhbGx5IG5vCiAJICogdXNhYmxlIGluZm9ybWF0aW9uLCBleGNlcHQgZm9yIGEgZmV3IGV4Y2VwdGlvbiBoYW5kbGluZyBydWxlcy4gICovCi0Jb3V0dyhzdGF0dXMgJiAoUnhGSUZPT3ZlciB8IFJ4T3ZlcmZsb3cgfCBSeE9LKSwgaW9hZGRyICsgSW50clN0YXR1cyk7CisJb3V0dyhzdGF0dXMgJiAoUnhGSUZPT3ZlciB8IFJ4T3ZlcmZsb3cgfCBSeE9LKSwgbmljLT5pb2FkZHIgKyBJbnRyU3RhdHVzKTsKIAlyZXR1cm4gMTsKIH0KIAotc3RhdGljIHZvaWQgcnRsX2Rpc2FibGUoc3RydWN0IG5pYyAqbmljKQorc3RhdGljIHZvaWQgcnRsX2lycShzdHJ1Y3QgbmljICpuaWMsIGlycV9hY3Rpb25fdCBhY3Rpb24pCiB7CisJdW5zaWduZWQgaW50IG1hc2s7CisJLyogQml0IG9mIGEgZ3Vlc3MgYXMgdG8gd2hpY2ggaW50ZXJydXB0cyB3ZSBzaG91bGQgYWxsb3cgKi8KKwl1bnNpZ25lZCBpbnQgaW50ZXJlc3RlZCA9IFJPSyB8IFJFUiB8IFJYT1ZXIHwgRk9WVyB8IFNFUlI7CisKKwlzd2l0Y2ggKCBhY3Rpb24gKSB7CisJY2FzZSBESVNBQkxFIDoKKwljYXNlIEVOQUJMRSA6CisJCW1hc2sgPSBpbncobmljLT5pb2FkZHIgKyBJbnRyTWFzayk7CisJCW1hc2sgPSBtYXNrICYgfmludGVyZXN0ZWQ7CisJCWlmICggYWN0aW9uID09IEVOQUJMRSApIG1hc2sgPSBtYXNrIHwgaW50ZXJlc3RlZDsKKwkJb3V0dyhtYXNrLCBuaWMtPmlvYWRkciArIEludHJNYXNrKTsKKwkJYnJlYWs7CisJY2FzZSBGT1JDRSA6CisJCS8qIEFwcGFyZW50bHkgd3JpdGluZyBhIDEgdG8gdGhpcyByZWFkLW9ubHkgYml0IG9mIGEKKwkJICogcmVhZC1vbmx5IGFuZCBvdGhlcndpc2UgdW5yZWxhdGVkIHJlZ2lzdGVyIHdpbGwKKwkJICogZm9yY2UgYW4gaW50ZXJydXB0LiAgSWYgeW91IGV2ZXIgd2FudCB0byBzZWUgaG93CisJCSAqIG5vdCB0byB3cml0ZSBhIGRhdGFzaGVldCwgcmVhZCB0aGUgb25lIGZvciB0aGUKKwkJICogUlRMODEzOS4uLgorCQkgKi8KKwkJb3V0YihFUk9LLCBuaWMtPmlvYWRkciArIFJ4RWFybHlTdGF0dXMpOworCQlicmVhazsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHJ0bF9kaXNhYmxlKHN0cnVjdCBkZXYgKmRldikKK3sKKwlzdHJ1Y3QgbmljICpuaWMgPSAoc3RydWN0IG5pYyAqKWRldjsKKwkvKiBtZXJnZSByZXNldCBhbmQgZGlzYWJsZSAqLworCXJ0bF9yZXNldChuaWMpOworCiAJLyogcmVzZXQgdGhlIGNoaXAgKi8KLQlvdXRiKENtZFJlc2V0LCBpb2FkZHIgKyBDaGlwQ21kKTsKKwlvdXRiKENtZFJlc2V0LCBuaWMtPmlvYWRkciArIENoaXBDbWQpOwogCiAJLyogMTAgbXMgdGltZW91dCAqLwogCWxvYWRfdGltZXIyKDEwKlRJQ0tTX1BFUl9NUyk7Ci0Jd2hpbGUgKChpbmIoaW9hZGRyICsgQ2hpcENtZCkgJiBDbWRSZXNldCkgIT0gMCAmJiB0aW1lcjJfcnVubmluZygpKQorCXdoaWxlICgoaW5iKG5pYy0+aW9hZGRyICsgQ2hpcENtZCkgJiBDbWRSZXNldCkgIT0gMCAmJiB0aW1lcjJfcnVubmluZygpKQogCQkvKiB3YWl0ICovOwogfQorCitzdGF0aWMgc3RydWN0IHBjaV9pZCBydGw4MTM5X25pY3NbXSA9IHsKK1BDSV9ST00oMHgxMGVjLCAweDgxMjksICJydGw4MTI5IiwgICAgICAgIlJlYWx0ZWsgODEyOSIpLAorUENJX1JPTSgweDEwZWMsIDB4ODEzOSwgInJ0bDgxMzkiLCAgICAgICAiUmVhbHRlayA4MTM5IiksCitQQ0lfUk9NKDB4MTBlYywgMHg4MTM4LCAicnRsODEzOWIiLCAgICAgICJSZWFsdGVrIDgxMzlCIiksCitQQ0lfUk9NKDB4MTE4NiwgMHgxMzAwLCAiZGZlNTM4IiwgICAgICAgICJERkU1MzBUWCsvREZFNTM4VFgiKSwKK1BDSV9ST00oMHgxMTEzLCAweDEyMTEsICJzbWMxMjExLTEiLCAgICAgIlNNQyBFWjEwLzEwMCIpLAorUENJX1JPTSgweDExMTIsIDB4MTIxMSwgInNtYzEyMTEiLCAgICAgICAiU01DIEVaMTAvMTAwIiksCitQQ0lfUk9NKDB4MTUwMCwgMHgxMzYwLCAiZGVsdGE4MTM5IiwgICAgICJEZWx0YSBFbGVjdHJvbmljcyA4MTM5IiksCitQQ0lfUk9NKDB4NDAzMywgMHgxMzYwLCAiYWRkdHJvbjgxMzkiLCAgICJBZGR0cm9uIFRlY2hub2xvZ3kgODEzOSIpLAorUENJX1JPTSgweDExODYsIDB4MTM0MCwgImRmZTY5MHR4ZCIsICAgICAiRC1MaW5rIERGRTY5MFRYRCIpLAorUENJX1JPTSgweDEzZDEsIDB4YWIwNiwgImZlMjAwMHZ4IiwgICAgICAiQWJvQ29tIEZFMjAwMFZYIiksCitQQ0lfUk9NKDB4MTI1OSwgMHhhMTE3LCAiYWxsaWVkODEzOSIsICAgICJBbGxpZWQgVGVsZXN5biA4MTM5IiksCitQQ0lfUk9NKDB4MTRlYSwgMHhhYjA2LCAiZm53MzYwM3R4IiwgICAgICJQbGFuZXggRk5XLTM2MDMtVFgiKSwKK1BDSV9ST00oMHgxNGVhLCAweGFiMDcsICJmbnczODAwdHgiLCAgICAgIlBsYW5leCBGTlctMzgwMC1UWCIpLAorUENJX1JPTSgweGZmZmYsIDB4ODEzOSwgImNsb25lLXJ0bDgxMzkiLCAiQ2xvbmVkIDgxMzkiKSwKK307CisKK3N0cnVjdCBwY2lfZHJpdmVyIHJ0bDgxMzlfZHJpdmVyID0geworCS50eXBlICAgICA9IE5JQ19EUklWRVIsCisJLm5hbWUgICAgID0gIlJUTDgxMzkiLAorCS5wcm9iZSAgICA9IHJ0bDgxMzlfcHJvYmUsCisJLmlkcyAgICAgID0gcnRsODEzOV9uaWNzLAorCS5pZF9jb3VudCA9IHNpemVvZihydGw4MTM5X25pY3MpL3NpemVvZihydGw4MTM5X25pY3NbMF0pLAorCS5jbGFzcyAgICA9IDAsCit9OwpkaWZmIC1OYXVyIGdydWItMC45Ny5vcmlnL25ldGJvb3Qvc2Vnb2ZmLmggZ3J1Yi0wLjk3L25ldGJvb3Qvc2Vnb2ZmLmgKLS0tIGdydWItMC45Ny5vcmlnL25ldGJvb3Qvc2Vnb2ZmLmgJMTk3MC0wMS0wMSAwMDowMDowMC4wMDAwMDAwMDAgKzAwMDAKKysrIGdydWItMC45Ny9uZXRib290L3NlZ29mZi5oCTIwMDUtMDgtMzEgMTk6MDM6MzUuMDAwMDAwMDAwICswMDAwCkBAIC0wLDAgKzEsNDMgQEAKKy8qCisgKiBTZWdtZW50Om9mZnNldCB0eXBlcyBhbmQgbWFjcm9zCisgKgorICogSW5pdGlhbGx5IHdyaXR0ZW4gYnkgTWljaGFlbCBCcm93biAobWNiMzApLgorICovCisKKyNpZm5kZWYgU0VHT0ZGX0gKKyNkZWZpbmUgU0VHT0ZGX0gKKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPGlvLmg+CisKKy8qIFNlZ21lbnQ6b2Zmc2V0IHN0cnVjdHVyZS4gIE5vdGUgdGhhdCB0aGUgb3JkZXIgd2l0aGluIHRoZSBzdHJ1Y3R1cmUKKyAqIGlzIG9mZnNldDpzZWdtZW50LgorICovCit0eXBlZGVmIHN0cnVjdCB7CisJdWludDE2X3Qgb2Zmc2V0OworCXVpbnQxNl90IHNlZ21lbnQ7Cit9IHNlZ29mZl90OworCisvKiBGb3IgUFhFIHN0dWZmICovCit0eXBlZGVmIHNlZ29mZl90IFNFR09GRjE2X3Q7CisKKy8qIE1hY3JvcyBmb3IgY29udmVydGluZyBmcm9tIHZpcnR1YWwgdG8gc2VnbWVudDpvZmZzZXQgYWRkcmVzc2VzLAorICogd2hlbiB3ZSBkb24ndCBhY3R1YWxseSBjYXJlIHdoaWNoIG9mIHRoZSBtYW55IGlzb21vcnBoaWMgcmVzdWx0cyB3ZQorICogZ2V0LgorICovCisjaWZkZWYgREVCVUdfU0VHTUVOVAordWludDE2X3QgU0VHTUVOVCAoIGNvbnN0IHZvaWQgKiBjb25zdCBwdHIgKSB7CisJdWludDMyX3QgcGh5cyA9IHZpcnRfdG9fcGh5cyAoIHB0ciApOworCWlmICggcGh5cyA+IDB4ZmZmZmYgKSB7CisJCXByaW50ZiAoICJGQVRBTCBFUlJPUjogc2VnbWVudCBhZGRyZXNzIG91dCBvZiByYW5nZVxuIiApOworCX0KKwlyZXR1cm4gcGh5cyA+PiA0OworfQorI2Vsc2UKKyNkZWZpbmUgU0VHTUVOVCh4KSAoIHZpcnRfdG9fcGh5cyAoIHggKSA+PiA0ICkKKyNlbmRpZgorI2RlZmluZSBPRkZTRVQoeCkgKCB2aXJ0X3RvX3BoeXMgKCB4ICkgJiAweGYgKQorI2RlZmluZSBTRUdPRkYoeCkgeyBPRkZTRVQoeCksIFNFR01FTlQoeCkgfQorI2RlZmluZSBWSVJUVUFMKHgseSkgKCBwaHlzX3RvX3ZpcnQgKCAoICggeCApIDw8IDQgKSArICggeSApICkgKQorCisjZW5kaWYgLyogU0VHT0ZGX0ggKi8KZGlmZiAtTmF1ciBncnViLTAuOTcub3JpZy9uZXRib290L3NpczkwMC5jIGdydWItMC45Ny9uZXRib290L3NpczkwMC5jCi0tLSBncnViLTAuOTcub3JpZy9uZXRib290L3NpczkwMC5jCTIwMDMtMDctMDkgMTE6NDU6MzguMDAwMDAwMDAwICswMDAwCisrKyBncnViLTAuOTcvbmV0Ym9vdC9zaXM5MDAuYwkyMDA1LTA4LTMxIDIwOjAyOjM4LjAwMDAwMDAwMCArMDAwMApAQCAtMjcsNiArMjcsMTEgQEAKIC8qIFJldmlzaW9uIEhpc3RvcnkgKi8KIAogLyoKKyAgMDcgRGVjIDIwMDMgIHRpbWxlZ2dlIC0gRW5hYmxlZCBNdWx0aWNhc3QgU3VwcG9ydAorICAwNiBEZWMgMjAwMyAgdGltbGVnZ2UgLSBGaXhlZCByZWxvY2F0aW9uIGlzc3VlIGluIDUuMgorICAwNCBKYW4gMjAwMiAgQ2hpZW4tWXUgQ2hlbiwgRG91ZyBBbWJyaXNrbywgTWFydHkgQ29ubm9yICBQYXRjaCB0byBFdGhlcmJvb3QgNS4wLjUKKyAgICAgQWRkZWQgc3VwcG9ydCBmb3IgdGhlIFNpUyA2MzBFVCBwbHVzIHZhcmlvdXMgYnVnIGZpeGVzIGZyb20gbGludXgga2VybmVsCisgICAgIHNvdXJjZSAyLjQuMTcuCiAgIDAxIE1hcmNoIDIwMDEgIG1kYyAgICAgMS4wCiAgICAgIEluaXRpYWwgUmVsZWFzZS4gIFRlc3RlZCB3aXRoIFBDSSBiYXNlZCBzaXM5MDAgY2FyZCBhbmQgVGhpbmtOSUMKICAgICAgY29tcHV0ZXIuCkBAIC0zNSwxMyArNDAsMTIgQEAKICAgICAgVGVzdGV0IHdpdGggU0lTNzMwUyBjaGlwc2V0ICsgSUNTMTg5MwogKi8KIAotDAogLyogSW5jbHVkZXMgKi8KIAogI2luY2x1ZGUgImV0aGVyYm9vdC5oIgogI2luY2x1ZGUgIm5pYy5oIgogI2luY2x1ZGUgInBjaS5oIgotI2luY2x1ZGUgImNhcmRzLmgiCisjaW5jbHVkZSAidGltZXIuaCIKIAogI2luY2x1ZGUgInNpczkwMC5oIgogCkBAIC01MSw2ICs1NSw3IEBACiAKIHN0YXRpYyB1bnNpZ25lZCBzaG9ydCB2ZW5kb3IsIGRldl9pZDsKIHN0YXRpYyB1bnNpZ25lZCBsb25nIGlvYWRkcjsKK3N0YXRpYyB1OCBwY2lfcmV2aXNpb247CiAKIHN0YXRpYyB1bnNpZ25lZCBpbnQgY3VyX3BoeTsKIApAQCAtNTgsMTUgKzYzLDEwIEBACiAKIHN0YXRpYyBCdWZmZXJEZXNjIHR4ZDsKIHN0YXRpYyBCdWZmZXJEZXNjIHJ4ZFtOVU1fUlhfREVTQ107Ci0KLSNpZmRlZiBVU0VfTE9XTUVNX0JVRkZFUgotI2RlZmluZSB0eGIgKChjaGFyICopMHgxMDAwMCAtIFRYX0JVRl9TSVpFKQotI2RlZmluZSByeGIgKChjaGFyICopMHgxMDAwMCAtIE5VTV9SWF9ERVNDKlJYX0JVRl9TSVpFIC0gVFhfQlVGX1NJWkUpCi0jZWxzZQogc3RhdGljIHVuc2lnbmVkIGNoYXIgdHhiW1RYX0JVRl9TSVpFXTsKIHN0YXRpYyB1bnNpZ25lZCBjaGFyIHJ4YltOVU1fUlhfREVTQyAqIFJYX0JVRl9TSVpFXTsKLSNlbmRpZgogCisjaWYgMAogc3RhdGljIHN0cnVjdCBtYWNfY2hpcF9pbmZvIHsKICAgICBjb25zdCBjaGFyICpuYW1lOwogICAgIHUxNiB2ZW5kb3JfaWQsIGRldmljZV9pZCwgZmxhZ3M7CkBAIC03OCwxMSArNzgsMTMgQEAKICAgICAgIFBDSV9DT01NQU5EX0lPfFBDSV9DT01NQU5EX01BU1RFUiwgU0lTOTAwX1RPVEFMX1NJWkV9LAogICAgIHswLDAsMCwwLDB9IC8qIDAgdGVybWluYXRlZCBsaXN0LiAqLwogfTsKKyNlbmRpZgogCiBzdGF0aWMgdm9pZCBzaXM5MDBfcmVhZF9tb2RlKHN0cnVjdCBuaWMgKm5pYywgaW50IHBoeV9hZGRyLCBpbnQgKnNwZWVkLCBpbnQgKmR1cGxleCk7CiBzdGF0aWMgdm9pZCBhbWQ3OWM5MDFfcmVhZF9tb2RlKHN0cnVjdCBuaWMgKm5pYywgaW50IHBoeV9hZGRyLCBpbnQgKnNwZWVkLCBpbnQgKmR1cGxleCk7CiBzdGF0aWMgdm9pZCBpY3MxODkzX3JlYWRfbW9kZShzdHJ1Y3QgbmljICpuaWMsIGludCBwaHlfYWRkciwgaW50ICpzcGVlZCwgaW50ICpkdXBsZXgpOwogc3RhdGljIHZvaWQgcnRsODIwMV9yZWFkX21vZGUoc3RydWN0IG5pYyAqbmljLCBpbnQgcGh5X2FkZHIsIGludCAqc3BlZWQsIGludCAqZHVwbGV4KTsKK3N0YXRpYyB2b2lkIHZ0NjEwM19yZWFkX21vZGUoc3RydWN0IG5pYyAqbmljLCBpbnQgcGh5X2FkZHIsIGludCAqc3BlZWQsIGludCAqZHVwbGV4KTsKIAogc3RhdGljIHN0cnVjdCBtaWlfY2hpcF9pbmZvIHsKICAgICBjb25zdCBjaGFyICogbmFtZTsKQEAgLTk2LDYgKzk4LDcgQEAKICAgICB7IkFNRCA3OUM5MDEgSG9tZVBOQSBQSFkiLCAgIDB4MDAwMCwgMHgzNWM4LCBhbWQ3OWM5MDFfcmVhZF9tb2RlfSwKICAgICB7IklDUyAxODkzIEludGVncmF0ZWQgUEhZY2VpdmVyIiAgICwgMHgwMDE1LCAweGY0NDEsaWNzMTg5M19yZWFkX21vZGV9LAogICAgIHsiUlRMIDgyMDEgMTAvMTAwTWJwcyBQaHljZWl2ZXIiICAgLCAweDAwMDAsIDB4ODIwMSxydGw4MjAxX3JlYWRfbW9kZX0sCisgICAgeyJWSUEgNjEwMyAxMC8xMDBNYnBzIFBoeWNlaXZlciIsIDB4MDEwMSwgMHg4ZjIwLHZ0NjEwM19yZWFkX21vZGV9LAogICAgIHswLDAsMCwwfQogfTsKIApAQCAtMTA2LDI0ICsxMDksMzIgQEAKICAgICB1MTYgc3RhdHVzOwogfSBtaWk7CiAKLQwKIC8vIFBDSSB0byBJU0EgYnJpZGdlIGZvciBTSVM2NDBFIGFjY2Vzcwotc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlICAgcGNpX2lzYV9icmlkZ2VfbGlzdFtdID0geworc3RhdGljIHN0cnVjdCBwY2lfaWQgICBwY2lfaXNhX2JyaWRnZV9saXN0W10gPSB7CiAJeyAweDEwMzksIDB4MDAwOCwKLQkJIlNJUyA4NUM1MDMvNTUxMyBQQ0kgdG8gSVNBIGJyaWRnZSIsIDAsIDAsIDAsIDB9LAotCXswLCAwLCBOVUxMLCAwLCAwLCAwLCAwfQorCQkiU0lTIDg1QzUwMy81NTEzIFBDSSB0byBJU0EgYnJpZGdlIn0sCit9OworCitzdHJ1Y3QgcGNpX2RyaXZlciBzaXNfYnJpZGdlX2RyaXZlciA9IHsKKwkudHlwZSAgICAgPSBCUklER0VfRFJJVkVSLAorCS5uYW1lICAgICA9ICIiLAorCS5wcm9iZSAgICA9IDAsCisJLmlkcyAgICAgID0gcGNpX2lzYV9icmlkZ2VfbGlzdCwKKwkuaWRfY291bnQgPSBzaXplb2YocGNpX2lzYV9icmlkZ2VfbGlzdCkvc2l6ZW9mKHBjaV9pc2FfYnJpZGdlX2xpc3RbMF0pLAorCS5jbGFzcyAgICA9IDAsCiB9OwogCiAvKiBGdW5jdGlvbiBQcm90b3R5cGVzICovCiAKLXN0cnVjdCBuaWMgKnNpczkwMF9wcm9iZShzdHJ1Y3QgbmljICpuaWMsIHVuc2lnbmVkIHNob3J0ICppb19hZGRycywgc3RydWN0IHBjaV9kZXZpY2UgKnBjaSk7CitzdGF0aWMgaW50IHNpczkwMF9wcm9iZShzdHJ1Y3QgZGV2ICpkZXYsIHN0cnVjdCBwY2lfZGV2aWNlICpwY2kpOwogCiBzdGF0aWMgdTE2ICBzaXM5MDBfcmVhZF9lZXByb20oaW50IGxvY2F0aW9uKTsKIHN0YXRpYyB2b2lkIHNpczkwMF9tZGlvX3Jlc2V0KGxvbmcgbWRpb19hZGRyKTsKIHN0YXRpYyB2b2lkIHNpczkwMF9tZGlvX2lkbGUobG9uZyBtZGlvX2FkZHIpOwogc3RhdGljIHUxNiAgc2lzOTAwX21kaW9fcmVhZChpbnQgcGh5X2lkLCBpbnQgbG9jYXRpb24pOworI2lmIDAKIHN0YXRpYyB2b2lkIHNpczkwMF9tZGlvX3dyaXRlKGludCBwaHlfaWQsIGludCBsb2NhdGlvbiwgaW50IHZhbCk7Ci0KKyNlbmRpZgogc3RhdGljIHZvaWQgc2lzOTAwX2luaXQoc3RydWN0IG5pYyAqbmljKTsKIAogc3RhdGljIHZvaWQgc2lzOTAwX3Jlc2V0KHN0cnVjdCBuaWMgKm5pYyk7CkBAIC0xMzYsOSArMTQ3LDExIEBACiAKIHN0YXRpYyB2b2lkIHNpczkwMF90cmFuc21pdChzdHJ1Y3QgbmljICpuaWMsIGNvbnN0IGNoYXIgKmQsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCB0LCB1bnNpZ25lZCBpbnQgcywgY29uc3QgY2hhciAqcCk7Ci1zdGF0aWMgaW50ICBzaXM5MDBfcG9sbChzdHJ1Y3QgbmljICpuaWMpOworc3RhdGljIGludCAgc2lzOTAwX3BvbGwoc3RydWN0IG5pYyAqbmljLCBpbnQgcmV0cmlldmUpOworCitzdGF0aWMgdm9pZCBzaXM5MDBfZGlzYWJsZShzdHJ1Y3QgZGV2ICpkZXYpOwogCi1zdGF0aWMgdm9pZCBzaXM5MDBfZGlzYWJsZShzdHJ1Y3QgbmljICpuaWMpOworc3RhdGljIHZvaWQgc2lzOTAwX2lycShzdHJ1Y3QgbmljICpuaWMsIGlycV9hY3Rpb25fdCBhY3Rpb24pOwogCiAvKioKICAqCXNpczkwMF9nZXRfbWFjX2FkZHI6IC0gR2V0IE1BQyBhZGRyZXNzIGZvciBzdGFuZCBhbG9uZSBTaVM5MDAgbW9kZWwKQEAgLTE0OSw3ICsxNjIsNyBAQAogICoJTUFDIGFkZHJlc3MgaXMgcmVhZCBmcm9tIHJlYWRfZWVwcm9tKCkgaW50byBAbmV0X2Rldi0+ZGV2X2FkZHIuCiAgKi8KIAotc3RhdGljIGludCBzaXM5MDBfZ2V0X21hY19hZGRyKHN0cnVjdCBwY2lfZGV2aWNlICogcGNpX2RldiAsIHN0cnVjdCBuaWMgKm5pYykKK3N0YXRpYyBpbnQgc2lzOTAwX2dldF9tYWNfYWRkcihzdHJ1Y3QgcGNpX2RldmljZSAqIHBjaV9kZXYgX191bnVzZWQsIHN0cnVjdCBuaWMgKm5pYykKIHsKIAl1MTYgc2lnbmF0dXJlOwogCWludCBpOwpAQCAtMTY4LDYgKzE4MSw1MCBAQAogfQogCiAvKioKKyAqCXNpczk2eF9nZXRfbWFjX2FkZHI6IC0gR2V0IE1BQyBhZGRyZXNzIGZvciBTaVM5NjIgb3IgU2lTOTYzIG1vZGVsCisgKglAcGNpX2RldjogdGhlIHNpczkwMCBwY2kgZGV2aWNlCisgKglAbmV0X2RldjogdGhlIG5ldCBkZXZpY2UgdG8gZ2V0IGFkZHJlc3MgZm9yIAorICoKKyAqCVNpUzk2MiBvciBTaVM5NjMgbW9kZWwsIHVzZSBFRVBST00gdG8gc3RvcmUgTUFDIGFkZHJlc3MuIEFuZCBFRVBST00gCisgKglpcyBzaGFyZWQgYnkKKyAqCUxBTiBhbmQgMTM5NC4gV2hlbiBhY2Nlc3MgRUVQUk9NLCBzZW5kIEVFUkVRIHNpZ25hbCB0byBoYXJkd2FyZSBmaXJzdCAKKyAqCWFuZCB3YWl0IGZvciBFRUdOVC4gSWYgRUVHTlQgaXMgT04sIEVFUFJPTSBpcyBwZXJtaXR0ZWQgdG8gYmUgYWNjZXNzIAorICoJYnkgTEFOLCBvdGhlcndpc2UgaXMgbm90LiBBZnRlciBNQUMgYWRkcmVzcyBpcyByZWFkIGZyb20gRUVQUk9NLCBzZW5kCisgKglFRURPTkUgc2lnbmFsIHRvIHJlZnVzZSBFRVBST00gYWNjZXNzIGJ5IExBTi4gCisgKglUaGUgRUVQUk9NIG1hcCBvZiBTaVM5NjIgb3IgU2lTOTYzIGlzIGRpZmZlcmVudCB0byBTaVM5MDAuIAorICoJVGhlIHNpZ25hdHVyZSBmaWVsZCBpbiBTaVM5NjIgb3IgU2lTOTYzIHNwZWMgaXMgbWVhbmluZ2xlc3MuIAorICoJTUFDIGFkZHJlc3MgaXMgcmVhZCBpbnRvIEBuZXRfZGV2LT5kZXZfYWRkci4KKyAqLworCitzdGF0aWMgaW50IHNpczk2eF9nZXRfbWFjX2FkZHIoc3RydWN0IHBjaV9kZXZpY2UgKiBwY2lfZGV2IF9fdW51c2VkLCBzdHJ1Y3QgbmljICpuaWMpCit7CisvKiAJbG9uZyBpb2FkZHIgPSBuZXRfZGV2LT5iYXNlX2FkZHI7ICovCisJbG9uZyBlZV9hZGRyID0gaW9hZGRyICsgbWVhcjsKKwl1MzIgd2FpdHRpbWUgPSAwOworCWludCBpOworCQorCXByaW50ZigiQWx0ZXJuYXRlIGZ1bmN0aW9uXG4iKTsKKworCW91dGwoRUVSRVEsIGVlX2FkZHIpOworCXdoaWxlKHdhaXR0aW1lIDwgMjAwMCkgeworCQlpZihpbmwoZWVfYWRkcikgJiBFRUdOVCkgeworCisJCQkvKiBnZXQgTUFDIGFkZHJlc3MgZnJvbSBFRVBST00gKi8KKwkJCWZvciAoaSA9IDA7IGkgPCAzOyBpKyspCisJCQkgICAgICAgICgodTE2ICopKG5pYy0+bm9kZV9hZGRyKSlbaV0gPSBzaXM5MDBfcmVhZF9lZXByb20oaStFRVBST01NQUNBZGRyKTsKKworCQkJb3V0bChFRURPTkUsIGVlX2FkZHIpOworCQkJcmV0dXJuIDE7CisJCX0gZWxzZSB7CisJCQl1ZGVsYXkoMSk7CQorCQkJd2FpdHRpbWUgKys7CisJCX0KKwl9CisJb3V0bChFRURPTkUsIGVlX2FkZHIpOworCXJldHVybiAwOworfQorCisvKioKICAqCXNpczYzMGVfZ2V0X21hY19hZGRyOiAtIEdldCBNQUMgYWRkcmVzcyBmb3IgU2lTNjMwRSBtb2RlbAogICoJQHBjaV9kZXY6IHRoZSBzaXM5MDAgcGNpIGRldmljZQogICoJQG5ldF9kZXY6IHRoZSBuZXQgZGV2aWNlIHRvIGdldCBhZGRyZXNzIGZvcgpAQCAtMTc3LDE3ICsyMzQsMjEgQEAKICAqCU1BQyBhZGRyZXNzIGlzIHJlYWQgaW50byBAbmV0X2Rldi0+ZGV2X2FkZHIuCiAgKi8KIAotc3RhdGljIGludCBzaXM2MzBlX2dldF9tYWNfYWRkcihzdHJ1Y3QgcGNpX2RldmljZSAqIHBjaV9kZXYsIHN0cnVjdCBuaWMgKm5pYykKK3N0YXRpYyBpbnQgc2lzNjMwZV9nZXRfbWFjX2FkZHIoc3RydWN0IHBjaV9kZXZpY2UgKiBwY2lfZGV2IF9fdW51c2VkLCBzdHJ1Y3QgbmljICpuaWMpCiB7CiAJdTggcmVnOwogCWludCBpOwotCXN0cnVjdCBwY2lfZGV2aWNlCSpwOwotCi0JLy8gZmluZCBQQ0kgdG8gSVNBIGJyaWRnZQotCWV0aF9wY2lfaW5pdChwY2lfaXNhX2JyaWRnZV9saXN0KTsKKwlzdHJ1Y3QgcGNpX2RldmljZQlwWzFdOwogCi0gICAgLyogdGhlIGZpcnRzIGVudHJ5IGluIHRoaXMgbGlzdCBzaG91bGQgY29udGFpbiBidXMvZGV2Zm4gKi8KLSAgICBwID0gcGNpX2lzYV9icmlkZ2VfbGlzdDsKKwkvKiBmaW5kIFBDSSB0byBJU0EgYnJpZGdlICovCisJbWVtc2V0KHAsIDAsIHNpemVvZihwKSk7CisJZG8geworCQlmaW5kX3BjaShCUklER0VfRFJJVkVSLCBwKTsKKwl9IHdoaWxlKHAtPmRyaXZlciAmJiBwLT5kcml2ZXIgIT0gJnNpc19icmlkZ2VfZHJpdmVyKTsKKworCS8qIGVycm9yIG9uIGZhaWx1cmUgKi8KKwlpZiAoIXAtPmRyaXZlcikKKwkgICAgcmV0dXJuIDA7CiAKIAlwY2liaW9zX3JlYWRfY29uZmlnX2J5dGUocC0+YnVzLHAtPmRldmZuLCAweDQ4LCAmcmVnKTsKIAlwY2liaW9zX3dyaXRlX2NvbmZpZ19ieXRlKHAtPmJ1cyxwLT5kZXZmbiwgMHg0OCwgcmVnIHwgMHg0MCk7CkBAIC0yMDEsNyArMjYyLDQzIEBACiAKIAlyZXR1cm4gMTsKIH0KLQwKKworLyoqCisgKiAgICAgIHNpczYzMGVfZ2V0X21hY19hZGRyOiAtIEdldCBNQUMgYWRkcmVzcyBmb3IgU2lTNjMwRSBtb2RlbAorICogICAgICBAcGNpX2RldjogdGhlIHNpczkwMCBwY2kgZGV2aWNlCisgKiAgICAgIEBuZXRfZGV2OiB0aGUgbmV0IGRldmljZSB0byBnZXQgYWRkcmVzcyBmb3IKKyAqCisgKiAgICAgIFNpUzYzMEUgbW9kZWwsIHVzZSBBUEMgQ01PUyBSQU0gdG8gc3RvcmUgTUFDIGFkZHJlc3MuCisgKiAgICAgIEFQQyBDTU9TIFJBTSBpcyBhY2Nlc3NlZCB0aHJvdWdoIElTQSBicmlkZ2UuCisgKiAgICAgIE1BQyBhZGRyZXNzIGlzIHJlYWQgaW50byBAbmV0X2Rldi0+ZGV2X2FkZHIuCisgKi8KKworc3RhdGljIGludCBzaXM2MzVfZ2V0X21hY19hZGRyKHN0cnVjdCBwY2lfZGV2aWNlICogcGNpX2RldiBfX3VudXNlZCwgc3RydWN0IG5pYyAqbmljKQoreworICAgICAgICB1MzIgcmZjclNhdmU7CisgICAgICAgIHUzMiBpOworCQorCQorICAgICAgICByZmNyU2F2ZSA9IGlubChyZmNyICsgaW9hZGRyKTsKKworICAgICAgICBvdXRsKHJmY3JTYXZlIHwgUkVMT0FELCBpb2FkZHIgKyBjcik7CisgICAgICAgIG91dGwoMCwgaW9hZGRyICsgY3IpOworCisgICAgICAgIC8qIGRpc2FibGUgcGFja2V0IGZpbHRlcmluZyBiZWZvcmUgc2V0dGluZyBmaWx0ZXIgKi8KKyAgICAgICAgb3V0bChyZmNyU2F2ZSAmIH5SRkVOLCByZmNyICsgaW9hZGRyKTsKKworICAgICAgICAvKiBsb2FkIE1BQyBhZGRyIHRvIGZpbHRlciBkYXRhIHJlZ2lzdGVyICovCisgICAgICAgIGZvciAoaSA9IDAgOyBpIDwgMyA7IGkrKykgeworICAgICAgICAgICAgICAgIG91dGwoKGkgPDwgUkZBRERSX3NoaWZ0KSwgaW9hZGRyICsgcmZjcik7CisgICAgICAgICAgICAgICAgKiggKCh1MTYgKiluaWMtPm5vZGVfYWRkcikgKyBpKSA9IGludyhpb2FkZHIgKyByZmRyKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIGVuYWJsZSBwYWNrZXQgZmlsaXRlcmluZyAqLworICAgICAgICBvdXRsKHJmY3JTYXZlIHwgUkZFTiwgcmZjciArIGlvYWRkcik7CisKKyAgICAgICAgcmV0dXJuIDE7Cit9CisKIC8qIAogICogRnVuY3Rpb246IHNpczkwMF9wcm9iZQogICoKQEAgLTIxNiwxOSArMzEzLDIxIEBACiAgKiBSZXR1cm5zOiAgIHN0cnVjdCBuaWMgKjogICAgICAgICAgcG9pbnRlciB0byBOSUMgZGF0YSBzdHJ1Y3R1cmUKICAqLwogCi1zdHJ1Y3QgbmljICpzaXM5MDBfcHJvYmUoc3RydWN0IG5pYyAqbmljLCB1bnNpZ25lZCBzaG9ydCAqaW9fYWRkcnMsIHN0cnVjdCBwY2lfZGV2aWNlICpwY2kpCitzdGF0aWMgaW50IHNpczkwMF9wcm9iZShzdHJ1Y3QgZGV2ICpkZXYsIHN0cnVjdCBwY2lfZGV2aWNlICpwY2kpCiB7CisgICAgc3RydWN0IG5pYyAqbmljID0gKHN0cnVjdCBuaWMgKilkZXY7CiAgICAgaW50IGk7CiAgICAgaW50IGZvdW5kPTA7CiAgICAgaW50IHBoeV9hZGRyOwotICAgIHUxNiBzaWduYXR1cmU7CiAgICAgdTggcmV2aXNpb247CiAgICAgaW50IHJldDsKIAotICAgIGlmIChpb19hZGRycyA9PSAwIHx8ICppb19hZGRycyA9PSAwKQotICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAocGNpLT5pb2FkZHIgPT0gMCkKKyAgICAgICAgcmV0dXJuIDA7CiAKLSAgICBpb2FkZHIgID0gKmlvX2FkZHJzICYgfjM7CisgICAgbmljLT5pcnFubyAgPSAwOworICAgIG5pYy0+aW9hZGRyID0gcGNpLT5pb2FkZHIgJiB+MzsKKyAgICBpb2FkZHIgID0gcGNpLT5pb2FkZHIgJiB+MzsKICAgICB2ZW5kb3IgID0gcGNpLT52ZW5kb3I7CiAgICAgZGV2X2lkICA9IHBjaS0+ZGV2X2lkOwogCkBAIC0yNDAsMTkgKzMzOSwyOSBAQAogICAgIC8qIGdldCBNQUMgYWRkcmVzcyAqLwogICAgIHJldCA9IDA7CiAgICAgcGNpYmlvc19yZWFkX2NvbmZpZ19ieXRlKHBjaS0+YnVzLHBjaS0+ZGV2Zm4sIFBDSV9SRVZJU0lPTiwgJnJldmlzaW9uKTsKLSAgICBpZiAocmV2aXNpb24gPT0gU0lTNjMwRV85MDBfUkVWIHx8IHJldmlzaW9uID09IFNJUzYzMEVBMV85MDBfUkVWKQotICAgICAgIHJldCA9IHNpczYzMGVfZ2V0X21hY19hZGRyKHBjaSwgbmljKTsKLSAgICBlbHNlIGlmIChyZXZpc2lvbiA9PSBTSVM2MzBTXzkwMF9SRVYpCisgICAgCisgICAgLyogc2F2ZSBmb3IgdXNlIGxhdGVyIGluIHNpczkwMF9yZXNldCgpICovCisgICAgcGNpX3JldmlzaW9uID0gcmV2aXNpb247IAorCisgICAgaWYgKHJldmlzaW9uID09IFNJUzYzMEVfOTAwX1JFVikKICAgICAgICAgcmV0ID0gc2lzNjMwZV9nZXRfbWFjX2FkZHIocGNpLCBuaWMpOworICAgIGVsc2UgaWYgKChyZXZpc2lvbiA+IDB4ODEpICYmIChyZXZpc2lvbiA8PSAweDkwKSkKKyAgICAgICAgcmV0ID0gc2lzNjM1X2dldF9tYWNfYWRkcihwY2ksIG5pYyk7CisgICAgZWxzZSBpZiAocmV2aXNpb24gPT0gU0lTOTZ4XzkwMF9SRVYpCisJcmV0ID0gc2lzOTZ4X2dldF9tYWNfYWRkcihwY2ksIG5pYyk7CiAgICAgZWxzZQogICAgICAgICByZXQgPSBzaXM5MDBfZ2V0X21hY19hZGRyKHBjaSwgbmljKTsKIAogICAgIGlmIChyZXQgPT0gMCkKICAgICB7CiAgICAgICAgIHByaW50ZiAoInNpczkwMF9wcm9iZTogRXJyb3IgTUFDIGFkZHJlc3Mgbm90IGZvdW5kXG4iKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIHJldHVybiAwOwogICAgIH0KIAorICAgIC8qIDYzMEVUIDogc2V0IHRoZSBtaWkgYWNjZXNzIG1vZGUgYXMgc29mdHdhcmUtbW9kZSAqLworICAgIGlmIChyZXZpc2lvbiA9PSBTSVM2MzBFVF85MDBfUkVWKQorCW91dGwoQUNDRVNTTU9ERSB8IGlubChpb2FkZHIgKyBjciksIGlvYWRkciArIGNyKTsKKwogICAgIHByaW50ZigiXG5zaXM5MDBfcHJvYmU6IE1BQyBhZGRyICUhIGF0IGlvYWRkciAlI2hYXG4iLAogICAgICAgICAgICBuaWMtPm5vZGVfYWRkciwgaW9hZGRyKTsKICAgICBwcmludGYoInNpczkwMF9wcm9iZTogVmVuZG9yOiUjaFggRGV2aWNlOiUjaFhcbiIsIHZlbmRvciwgZGV2X2lkKTsKQEAgLTI2NCw3ICszNzMsNyBAQAogICAgIGZvciAocGh5X2FkZHIgPSAwOyBwaHlfYWRkciA8IDMyOyBwaHlfYWRkcisrKSB7CiAgICAgICAgIHUxNiBtaWlfc3RhdHVzOwogICAgICAgICB1MTYgcGh5X2lkMCwgcGh5X2lkMTsKLSAgICAgICAgICAgICAgICAKKwogICAgICAgICBtaWlfc3RhdHVzID0gc2lzOTAwX21kaW9fcmVhZChwaHlfYWRkciwgTUlJX1NUQVRVUyk7CiAgICAgICAgIGlmIChtaWlfc3RhdHVzID09IDB4ZmZmZiB8fCBtaWlfc3RhdHVzID09IDB4MDAwMCkKICAgICAgICAgICAgIC8qIHRoZSBtaWkgaXMgbm90IGFjY2Vzc2FibGUsIHRyeSBuZXh0IG9uZSAqLwpAQCAtMjcyLDcgKzM4MSw3IEBACiAgICAgICAgICAgICAgICAgCiAgICAgICAgIHBoeV9pZDAgPSBzaXM5MDBfbWRpb19yZWFkKHBoeV9hZGRyLCBNSUlfUEhZX0lEMCk7CiAgICAgICAgIHBoeV9pZDEgPSBzaXM5MDBfbWRpb19yZWFkKHBoeV9hZGRyLCBNSUlfUEhZX0lEMSk7Ci0gICAgICAgICAgICAgICAgCisKICAgICAgICAgLyogc2VhcmNoIG91ciBtaWkgdGFibGUgZm9yIHRoZSBjdXJyZW50IG1paSAqLyAKICAgICAgICAgZm9yIChpID0gMDsgbWlpX2NoaXBfdGFibGVbaV0ucGh5X2lkMTsgaSsrKSB7CiAKQEAgLTI5NCw3ICs0MDMsNyBAQAogICAgICAgICAKICAgICBpZiAoZm91bmQgPT0gMCkgewogICAgICAgICBwcmludGYoInNpczkwMF9wcm9iZTogTm8gTUlJIHRyYW5zY2VpdmVycyBmb3VuZCFcbiIpOwotICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgcmV0dXJuIDA7CiAgICAgfQogCiAgICAgLyogQXJiaXRyYXJpbHkgc2VsZWN0IHRoZSBsYXN0IFBIWSBmb3VuZCBhcyBjdXJyZW50IFBIWSAqLwpAQCAtMzA0LDE1ICs0MTMsMTQgQEAKICAgICAvKiBpbml0aWFsaXplIGRldmljZSAqLwogICAgIHNpczkwMF9pbml0KG5pYyk7CiAKLSAgICBuaWMtPnJlc2V0ICAgID0gc2lzOTAwX2luaXQ7CisgICAgZGV2LT5kaXNhYmxlICA9IHNpczkwMF9kaXNhYmxlOwogICAgIG5pYy0+cG9sbCAgICAgPSBzaXM5MDBfcG9sbDsKICAgICBuaWMtPnRyYW5zbWl0ID0gc2lzOTAwX3RyYW5zbWl0OwotICAgIG5pYy0+ZGlzYWJsZSAgPSBzaXM5MDBfZGlzYWJsZTsKKyAgICBuaWMtPmlycSAgICAgID0gc2lzOTAwX2lycTsKIAotICAgIHJldHVybiBuaWM7CisgICAgcmV0dXJuIDE7CiB9CiAKLQwKIC8qIAogICogRUVQUk9NIFJvdXRpbmVzOiAgVGhlc2UgZnVuY3Rpb25zIHJlYWQgYW5kIHdyaXRlIHRvIEVFUFJPTSBmb3IgCiAgKiAgICByZXRyaWV2aW5nIHRoZSBNQUMgYWRkcmVzcyBhbmQgb3RoZXIgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBhYm91dCAKQEAgLTMyMiw3ICs0MzAsNiBAQAogLyogRGVsYXkgYmV0d2VlbiBFRVBST00gY2xvY2sgdHJhbnNpdGlvbnMuICovCiAjZGVmaW5lIGVlcHJvbV9kZWxheSgpICBpbmwoZWVfYWRkcikKIAotDAogLyogRnVuY3Rpb246IHNpczkwMF9yZWFkX2VlcHJvbQogICoKICAqIERlc2NyaXB0aW9uOiByZWFkcyBhbmQgcmV0dXJucyBhIGdpdmVuIGxvY2F0aW9uIGZyb20gRUVQUk9NCkBAIC0zNzgsNyArNDg1LDYgQEAKIAogI2RlZmluZSBzaXM5MDBfbWRpb19kZWxheSgpICAgIGlubChtZGlvX2FkZHIpCiAKLQwKIC8qIAogICAgUmVhZCBhbmQgd3JpdGUgdGhlIE1JSSBtYW5hZ2VtZW50IHJlZ2lzdGVycyB1c2luZyBzb2Z0d2FyZS1nZW5lcmF0ZWQKICAgIHNlcmlhbCBNRElPIHByb3RvY29sLiBOb3RlIHRoYXQgdGhlIGNvbW1hbmQgYml0cyBhbmQgZGF0YSBiaXRzIGFyZQpAQCAtNDMyLDkgKzUzOCwxMSBAQAogICAgICAgICBvdXRsKE1EQywgbWRpb19hZGRyKTsKICAgICAgICAgc2lzOTAwX21kaW9fZGVsYXkoKTsKICAgICB9CisgICAgb3V0bCgweDAwLCBtZGlvX2FkZHIpOwogICAgIHJldHVybiByZXR2YWw7CiB9CiAKKyNpZiAwCiBzdGF0aWMgdm9pZCBzaXM5MDBfbWRpb193cml0ZShpbnQgcGh5X2lkLCBpbnQgbG9jYXRpb24sIGludCB2YWx1ZSkKIHsKICAgICBsb25nIG1kaW9fYWRkciA9IGlvYWRkciArIG1lYXI7CkBAIC00NzEsMTAgKzU3OSwxMSBAQAogICAgICAgICBvdXRiKE1EQywgbWRpb19hZGRyKTsKICAgICAgICAgc2lzOTAwX21kaW9fZGVsYXkoKTsKICAgICB9CisgICAgb3V0bCgweDAwLCBtZGlvX2FkZHIpOwogICAgIHJldHVybjsKIH0KKyNlbmRpZgogCi0MCiAvKiBGdW5jdGlvbjogc2lzOTAwX2luaXQKICAqCiAgKiBEZXNjcmlwdGlvbjogcmVzZXRzIHRoZSBldGhlcm5ldCBjb250cm9sbGVyIGNoaXAgYW5kIHZhcmlvdXMKQEAgLTUwMCwxMCArNjA5LDkgQEAKIAogICAgIHNpczkwMF9jaGVja19tb2RlKG5pYyk7CiAKLSAgICBvdXRsKFJ4RU5BLCBpb2FkZHIgKyBjcik7CisgICAgb3V0bChSeEVOQXwgaW5sKGlvYWRkciArIGNyKSwgaW9hZGRyICsgY3IpOwogfQogCi0MCiAvKiAKICAqIEZ1bmN0aW9uOiBzaXM5MDBfcmVzZXQKICAqCkBAIC01MTUsNyArNjIzLDcgQEAKICAqLwogCiBzdGF0aWMgdm9pZCAKLXNpczkwMF9yZXNldChzdHJ1Y3QgbmljICpuaWMpCitzaXM5MDBfcmVzZXQoc3RydWN0IG5pYyAqbmljIF9fdW51c2VkKQogewogICAgIGludCBpID0gMDsKICAgICB1MzIgc3RhdHVzID0gVHhSQ01QIHwgUnhSQ01QOwpAQCAtNTI0LDE2ICs2MzIsMTkgQEAKICAgICBvdXRsKDAsIGlvYWRkciArIGltcik7CiAgICAgb3V0bCgwLCBpb2FkZHIgKyByZmNyKTsKIAotICAgIG91dGwoUnhSRVNFVCB8IFR4UkVTRVQgfCBSRVNFVCwgaW9hZGRyICsgY3IpOwotICAgICAgICAKKyAgICBvdXRsKFJ4UkVTRVQgfCBUeFJFU0VUIHwgUkVTRVQgfCBpbmwoaW9hZGRyICsgY3IpLCBpb2FkZHIgKyBjcik7CisKICAgICAvKiBDaGVjayB0aGF0IHRoZSBjaGlwIGhhcyBmaW5pc2hlZCB0aGUgcmVzZXQuICovCiAgICAgd2hpbGUgKHN0YXR1cyAmJiAoaSsrIDwgMTAwMCkpIHsKICAgICAgICAgc3RhdHVzIF49IChpbmwoaXNyICsgaW9hZGRyKSAmIHN0YXR1cyk7CiAgICAgfQotICAgIG91dGwoUEVTRUwsIGlvYWRkciArIGNmZyk7CisKKyAgICBpZiggKHBjaV9yZXZpc2lvbiA9PSBTSVM2MzVBXzkwMF9SRVYpIHx8IChwY2lfcmV2aXNpb24gPT0gU0lTOTAwQl85MDBfUkVWKSApCisgICAgICAgICAgICBvdXRsKFBFU0VMIHwgUk5EX0NOVCwgaW9hZGRyICsgY2ZnKTsKKyAgICBlbHNlCisgICAgICAgICAgICBvdXRsKFBFU0VMLCBpb2FkZHIgKyBjZmcpOwogfQogCi0MCiAvKiBGdW5jdGlvbjogc2lzX2luaXRfcnhmaWx0ZXIKICAqCiAgKiBEZXNjcmlwdGlvbjogc2V0cyByZWNlaXZlIGZpbHRlciBhZGRyZXNzIHRvIG91ciBNQUMgYWRkcmVzcwpAQCAtNTUyLDcgKzY2Myw3IEBACiAgICAgcmZjclNhdmUgPSBpbmwocmZjciArIGlvYWRkcik7CiAKICAgICAvKiBkaXNhYmxlIHBhY2tldCBmaWx0ZXJpbmcgYmVmb3JlIHNldHRpbmcgZmlsdGVyICovCi0gICAgb3V0bChyZmNyU2F2ZSAmIH5SRkVOLCByZmNyKTsKKyAgICBvdXRsKHJmY3JTYXZlICYgflJGRU4sIHJmY3IgKyBpb2FkZHIpOwogCiAgICAgLyogbG9hZCBNQUMgYWRkciB0byBmaWx0ZXIgZGF0YSByZWdpc3RlciAqLwogICAgIGZvciAoaSA9IDAgOyBpIDwgMyA7IGkrKykgewpAQCAtNTcxLDcgKzY4Miw2IEBACiAgICAgb3V0bChyZmNyU2F2ZSB8IFJGRU4sIHJmY3IgKyBpb2FkZHIpOwogfQogCi0MCiAvKiAKICAqIEZ1bmN0aW9uOiBzaXNfaW5pdF90eGQKICAqCkBAIC01ODMsMjAgKzY5MywxOSBAQAogICovCiAKIHN0YXRpYyB2b2lkCi1zaXM5MDBfaW5pdF90eGQoc3RydWN0IG5pYyAqbmljKQorc2lzOTAwX2luaXRfdHhkKHN0cnVjdCBuaWMgKm5pYyBfX3VudXNlZCkKIHsKICAgICB0eGQubGluayAgID0gKHUzMikgMDsKICAgICB0eGQuY21kc3RzID0gKHUzMikgMDsKLSAgICB0eGQuYnVmcHRyID0gKHUzMikgJnR4YlswXTsKKyAgICB0eGQuYnVmcHRyID0gdmlydF90b19idXMoJnR4YlswXSk7CiAKICAgICAvKiBsb2FkIFRyYW5zbWl0IERlc2NyaXB0b3IgUmVnaXN0ZXIgKi8KLSAgICBvdXRsKCh1MzIpICZ0eGQsIGlvYWRkciArIHR4ZHApOyAKKyAgICBvdXRsKHZpcnRfdG9fYnVzKCZ0eGQpLCBpb2FkZHIgKyB0eGRwKTsgCiAgICAgaWYgKHNpczkwMF9kZWJ1ZyA+IDApCiAgICAgICAgIHByaW50Zigic2lzOTAwX2luaXRfdHhkOiBUWCBkZXNjcmlwdG9yIHJlZ2lzdGVyIGxvYWRlZCB3aXRoOiAlWFxuIiwgCiAgICAgICAgICAgICAgICBpbmwoaW9hZGRyICsgdHhkcCkpOwogfQogCi0MCiAvKiBGdW5jdGlvbjogc2lzX2luaXRfcnhkCiAgKgogICogRGVzY3JpcHRpb246IGluaXRpYWxpemVzIHRoZSBSeCBkZXNjcmlwdG9yIHJpbmcKQEAgLTYwNyw3ICs3MTYsNyBAQAogICovCiAKIHN0YXRpYyB2b2lkIAotc2lzOTAwX2luaXRfcnhkKHN0cnVjdCBuaWMgKm5pYykgCitzaXM5MDBfaW5pdF9yeGQoc3RydWN0IG5pYyAqbmljIF9fdW51c2VkKSAKIHsgCiAgICAgaW50IGk7CiAKQEAgLTYxNSwxNiArNzI0LDE2IEBACiAKICAgICAvKiBpbml0IFJYIGRlc2NyaXB0b3IgKi8KICAgICBmb3IgKGkgPSAwOyBpIDwgTlVNX1JYX0RFU0M7IGkrKykgewotICAgICAgICByeGRbaV0ubGluayAgID0gKGkrMSA8IE5VTV9SWF9ERVNDKSA/ICh1MzIpICZyeGRbaSsxXSA6ICh1MzIpICZyeGRbMF07CisgICAgICAgIHJ4ZFtpXS5saW5rICAgPSB2aXJ0X3RvX2J1cygoaSsxIDwgTlVNX1JYX0RFU0MpID8gJnJ4ZFtpKzFdIDogJnJ4ZFswXSk7CiAgICAgICAgIHJ4ZFtpXS5jbWRzdHMgPSAodTMyKSBSWF9CVUZfU0laRTsKLSAgICAgICAgcnhkW2ldLmJ1ZnB0ciA9ICh1MzIpICZyeGJbaSpSWF9CVUZfU0laRV07CisgICAgICAgIHJ4ZFtpXS5idWZwdHIgPSB2aXJ0X3RvX2J1cygmcnhiW2kqUlhfQlVGX1NJWkVdKTsKICAgICAgICAgaWYgKHNpczkwMF9kZWJ1ZyA+IDApCiAgICAgICAgICAgICBwcmludGYoInNpczkwMF9pbml0X3J4ZDogcnhkWyVkXT0lWCBsaW5rPSVYIGNtZHN0cz0lWCBidWZwdHI9JVhcbiIsIAogICAgICAgICAgICAgICAgICAgIGksICZyeGRbaV0sIHJ4ZFtpXS5saW5rLCByeGRbaV0uY21kc3RzLCByeGRbaV0uYnVmcHRyKTsKICAgICB9CiAKICAgICAvKiBsb2FkIFJlY2VpdmUgRGVzY3JpcHRvciBSZWdpc3RlciAqLwotICAgIG91dGwoKHUzMikgJnJ4ZFswXSwgaW9hZGRyICsgcnhkcCk7CisgICAgb3V0bCh2aXJ0X3RvX2J1cygmcnhkWzBdKSwgaW9hZGRyICsgcnhkcCk7CiAKICAgICBpZiAoc2lzOTAwX2RlYnVnID4gMCkKICAgICAgICAgcHJpbnRmKCJzaXM5MDBfaW5pdF9yeGQ6IFJYIGRlc2NyaXB0b3IgcmVnaXN0ZXIgbG9hZGVkIHdpdGg6ICVYXG4iLCAKQEAgLTYzMiw3ICs3NDEsNiBAQAogCiB9CiAKLQwKIC8qIEZ1bmN0aW9uOiBzaXNfaW5pdF9yeGQKICAqCiAgKiBEZXNjcmlwdGlvbjogCkBAIC02NDQsMjUgKzc1MiwzNiBAQAogICogUmV0dXJuczogICB2b2lkLgogICovCiAKLXN0YXRpYyB2b2lkIHNpczkwMF9zZXRfcnhfbW9kZShzdHJ1Y3QgbmljICpuaWMpCitzdGF0aWMgdm9pZCBzaXM5MDBfc2V0X3J4X21vZGUoc3RydWN0IG5pYyAqbmljIF9fdW51c2VkKQogewotICAgIGludCBpOworICAgIGludCBpLCB0YWJsZV9lbnRyaWVzOworICAgIHUzMiByeF9tb2RlOyAKKyAgICB1MTYgbWNfZmlsdGVyWzE2XSA9IHswfTsJLyogMjU2LzEyOCBiaXRzIG11bHRpY2FzdCBoYXNoIHRhYmxlICovCisgICAgCQorICAgIGlmKChwY2lfcmV2aXNpb24gPT0gU0lTNjM1QV85MDBfUkVWKSB8fCAocGNpX3JldmlzaW9uID09IFNJUzkwMEJfOTAwX1JFVikpCisJdGFibGVfZW50cmllcyA9IDE2OworICAgIGVsc2UKKwl0YWJsZV9lbnRyaWVzID0gODsKIAotICAgIC8qIENvbmZpZ3VyZSBNdWx0aWNhc3QgSGFzaCBUYWJsZSBpbiBSZWNlaXZlIEZpbHRlciAKLSAgICAgICB0byByZWplY3QgYWxsIE1DQVNUIHBhY2tldHMgKi8KLSAgICBmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CisgICAgLyogYWNjZXB0IGFsbCBtdWx0aWNhc3QgcGFja2V0ICovCisgICAgcnhfbW9kZSA9IFJGQUFCIHwgUkZBQU07CisgICAgZm9yIChpID0gMDsgaSA8IHRhYmxlX2VudHJpZXM7IGkrKykKKwkJbWNfZmlsdGVyW2ldID0gMHhmZmZmOworCQkJCQkKKyAgICAvKiB1cGRhdGUgTXVsdGljYXN0IEhhc2ggVGFibGUgaW4gUmVjZWl2ZSBGaWx0ZXIgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgdGFibGVfZW50cmllczsgaSsrKSB7CiAgICAgICAgIC8qIHdoeSBwbHVzIDB4MDQ/IFRoYXQgbWFrZXMgdGhlIGNvcnJlY3QgdmFsdWUgZm9yIGhhc2ggdGFibGUuICovCiAgICAgICAgIG91dGwoKHUzMikoMHgwMDAwMDAwNCtpKSA8PCBSRkFERFJfc2hpZnQsIGlvYWRkciArIHJmY3IpOwotICAgICAgICBvdXRsKCh1MzIpKDB4MCksIGlvYWRkciArIHJmZHIpOworICAgICAgICBvdXRsKG1jX2ZpbHRlcltpXSwgaW9hZGRyICsgcmZkcik7CiAgICAgfQotICAgIC8qIEFjY2VwdCBCcm9hZGNhc3QgcGFja2V0cywgZGVzdGluYXRpb24gYWRkcmVzc2VzIHRoYXQgbWF0Y2ggCisKKyAgICAvKiBBY2NlcHQgQnJvYWRjYXN0IGFuZCBtdWx0aWNhc3QgcGFja2V0cywgZGVzdGluYXRpb24gYWRkcmVzc2VzIHRoYXQgbWF0Y2ggCiAgICAgICAgb3VyIE1BQyBhZGRyZXNzICovCi0gICAgb3V0bChSRkVOIHwgUkZBQUIsIGlvYWRkciArIHJmY3IpOworICAgIG91dGwoUkZFTiB8IHJ4X21vZGUsIGlvYWRkciArIHJmY3IpOwogCiAgICAgcmV0dXJuOwogfQogCi0MCiAvKiBGdW5jdGlvbjogc2lzOTAwX2NoZWNrX21vZGUKICAqCiAgKiBEZXNjcmlwdGlvbjogY2hlY2tzIHRoZSBzdGF0ZSBvZiB0cmFuc21pdCBhbmQgcmVjZWl2ZQpAQCAtNjc0LDE1ICs3OTMsMjEgQEAKICAqLwogCiBzdGF0aWMgdm9pZAotc2lzOTAwX2NoZWNrX21vZGUgKHN0cnVjdCBuaWMgKm5pYykKK3NpczkwMF9jaGVja19tb2RlKHN0cnVjdCBuaWMgKm5pYykKIHsKICAgICBpbnQgc3BlZWQsIGR1cGxleDsKICAgICB1MzIgdHhfZmxhZ3MgPSAwLCByeF9mbGFncyA9IDA7CiAKICAgICBtaWkuY2hpcF9pbmZvLT5yZWFkX21vZGUobmljLCBjdXJfcGh5LCAmc3BlZWQsICZkdXBsZXgpOwogCi0gICAgdHhfZmxhZ3MgPSBUeEFUUCB8IChUWF9ETUFfQlVSU1QgPDwgVHhNWERNQV9zaGlmdCkgfCAoVFhfRklMTF9USFJFU0ggPDwgVHhGSUxMVF9zaGlmdCk7Ci0gICAgcnhfZmxhZ3MgPSBSWF9ETUFfQlVSU1QgPDwgUnhNWERNQV9zaGlmdDsKKyAgICBpZiggaW5sKGlvYWRkciArIGNmZykgJiBFREJfTUFTVEVSX0VOICkgeworICAgICAgICB0eF9mbGFncyA9IFR4QVRQIHwgKERNQV9CVVJTVF82NCA8PCBUeE1YRE1BX3NoaWZ0KSB8IChUWF9GSUxMX1RIUkVTSCA8PCBUeEZJTExUX3NoaWZ0KTsKKwlyeF9mbGFncyA9IERNQV9CVVJTVF82NCA8PCBSeE1YRE1BX3NoaWZ0OworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgICAgIHR4X2ZsYWdzID0gVHhBVFAgfCAoRE1BX0JVUlNUXzUxMiA8PCBUeE1YRE1BX3NoaWZ0KSB8IChUWF9GSUxMX1RIUkVTSCA8PCBUeEZJTExUX3NoaWZ0KTsKKyAgICAgICAgICAgIHJ4X2ZsYWdzID0gRE1BX0JVUlNUXzUxMiA8PCBSeE1YRE1BX3NoaWZ0OworICAgIH0KIAogICAgIGlmIChzcGVlZCA9PSBIV19TUEVFRF9IT01FIHx8IHNwZWVkID09IEhXX1NQRUVEXzEwX01CUFMpIHsKICAgICAgICAgcnhfZmxhZ3MgfD0gKFJ4RFJOVF8xMCA8PCBSeERSTlRfc2hpZnQpOwpAQCAtNzAyLDcgKzgyNyw2IEBACiAgICAgb3V0bCAocnhfZmxhZ3MsIGlvYWRkciArIHJ4Y2ZnKTsKIH0KIAotDAogLyogRnVuY3Rpb246IHNpczkwMF9yZWFkX21vZGUKICAqCiAgKiBEZXNjcmlwdGlvbjogcmV0cmlldmVzIGFuZCBkaXNwbGF5cyBzcGVlZCBhbmQgZHVwbGV4CkBAIC03MTQsMjQgKzgzOCwzMyBAQAogICovCiAKIHN0YXRpYyB2b2lkCi1zaXM5MDBfcmVhZF9tb2RlKHN0cnVjdCBuaWMgKm5pYywgaW50IHBoeV9hZGRyLCBpbnQgKnNwZWVkLCBpbnQgKmR1cGxleCkKK3NpczkwMF9yZWFkX21vZGUoc3RydWN0IG5pYyAqbmljIF9fdW51c2VkLCBpbnQgcGh5X2FkZHIsIGludCAqc3BlZWQsIGludCAqZHVwbGV4KQogewogICAgIGludCBpID0gMDsKICAgICB1MzIgc3RhdHVzOworICAgIHUxNiBwaHlfaWQwLCBwaHlfaWQxOwogICAgICAgICAKICAgICAvKiBTVFNPVVQgcmVnaXN0ZXIgaXMgTGF0Y2hlZCBvbiBUcmFuc2l0aW9uLCByZWFkIG9wZXJhdGlvbiB1cGRhdGVzIGl0ICovCiAgICAgd2hpbGUgKGkrKyA8IDIpCiAgICAgICAgIHN0YXR1cyA9IHNpczkwMF9tZGlvX3JlYWQocGh5X2FkZHIsIE1JSV9TVFNPVVQpOwogCi0gICAgaWYgKHN0YXR1cyAmIE1JSV9TVFNPVVRfU1BEKQotICAgICAgICAqc3BlZWQgPSBIV19TUEVFRF8xMDBfTUJQUzsKLSAgICBlbHNlCi0gICAgICAgICpzcGVlZCA9IEhXX1NQRUVEXzEwX01CUFM7Ci0KLSAgICBpZiAoc3RhdHVzICYgTUlJX1NUU09VVF9EUExYKQotICAgICAgICAqZHVwbGV4ID0gRkRYX0NBUEFCTEVfRlVMTF9TRUxFQ1RFRDsKLSAgICBlbHNlCi0gICAgICAgICpkdXBsZXggPSBGRFhfQ0FQQUJMRV9IQUxGX1NFTEVDVEVEOworICAgICpzcGVlZCA9IEhXX1NQRUVEXzEwX01CUFM7CisgICAgKmR1cGxleCA9IEZEWF9DQVBBQkxFX0hBTEZfU0VMRUNURUQ7CisgICAgCisgICAgaWYgKHN0YXR1cyAmIChNSUlfTldBWV9UWCB8IE1JSV9OV0FZX1RYX0ZEWCkpCisJKnNwZWVkID0gSFdfU1BFRURfMTAwX01CUFM7CisgICAgaWYgKHN0YXR1cyAmICggTUlJX05XQVlfVFhfRkRYIHwgTUlJX05XQVlfVF9GRFgpKQorCSpkdXBsZXggPSBGRFhfQ0FQQUJMRV9GVUxMX1NFTEVDVEVEOworCQorICAgIC8qIFdvcmthcm91bmQgZm9yIFJlYWx0ZWsgUlRMODIwMSBQSFkgaXNzdWUgKi8KKyAgICBwaHlfaWQwID0gc2lzOTAwX21kaW9fcmVhZChwaHlfYWRkciwgTUlJX1BIWV9JRDApOworICAgIHBoeV9pZDEgPSBzaXM5MDBfbWRpb19yZWFkKHBoeV9hZGRyLCBNSUlfUEhZX0lEMSk7CisgICAgaWYoKHBoeV9pZDAgPT0gMHgwMDAwKSAmJiAoKHBoeV9pZDEgJiAweEZGRjApID09IDB4ODIwMCkpeworCWlmKHNpczkwMF9tZGlvX3JlYWQocGh5X2FkZHIsIE1JSV9DT05UUk9MKSAmIE1JSV9DTlRMX0ZEWCkKKwkgICAgKmR1cGxleCA9IEZEWF9DQVBBQkxFX0ZVTExfU0VMRUNURUQ7CisJaWYoc2lzOTAwX21kaW9fcmVhZChwaHlfYWRkciwgMHgwMDE5KSAmIDB4MDEpCisJICAgICpzcGVlZCA9IEhXX1NQRUVEXzEwMF9NQlBTOworICAgIH0KIAogICAgIGlmIChzdGF0dXMgJiBNSUlfU1RTT1VUX0xJTktfRkFJTCkKICAgICAgICAgcHJpbnRmKCJzaXM5MDBfcmVhZF9tb2RlOiBNZWRpYSBMaW5rIE9mZlxuIik7CkBAIC03NDMsNyArODc2LDYgQEAKICAgICAgICAgICAgICAgICJmdWxsIiA6ICJoYWxmIik7CiB9CiAKLQwKIC8qIEZ1bmN0aW9uOiBhbWQ3OWM5MDFfcmVhZF9tb2RlCiAgKgogICogRGVzY3JpcHRpb246IHJldHJpZXZlcyBhbmQgZGlzcGxheXMgc3BlZWQgYW5kIGR1cGxleApAQCAtNzU1LDcgKzg4Nyw3IEBACiAgKi8KIAogc3RhdGljIHZvaWQKLWFtZDc5YzkwMV9yZWFkX21vZGUoc3RydWN0IG5pYyAqbmljLCBpbnQgcGh5X2FkZHIsIGludCAqc3BlZWQsIGludCAqZHVwbGV4KQorYW1kNzljOTAxX3JlYWRfbW9kZShzdHJ1Y3QgbmljICpuaWMgX191bnVzZWQsIGludCBwaHlfYWRkciwgaW50ICpzcGVlZCwgaW50ICpkdXBsZXgpCiB7CiAgICAgaW50IGk7CiAgICAgdTE2IHN0YXR1czsKQEAgLTc5Niw3ICs5MjgsNiBAQAogICAgIH0KIH0KIAotDAogLyoqCiAgKglpY3MxODkzX3JlYWRfbW9kZTogLSByZWFkIG1lZGlhIG1vZGUgZm9yIElDUzE4OTMgUEhZCiAgKglAbmV0X2RldjogdGhlIG5ldCBkZXZpY2UgdG8gcmVhZCBtb2RlIGZvcgpAQCAtODA4LDcgKzkzOSw3IEBACiAgKgl0byBkZXRlcm1pbmUgdGhlIHNwZWVkIGFuZCBkdXBsZXggbW9kZSBmb3Igc2lzOTAwCiAgKi8KIAotc3RhdGljIHZvaWQgaWNzMTg5M19yZWFkX21vZGUoc3RydWN0IG5pYyAqbmljLCBpbnQgcGh5X2FkZHIsIGludCAqc3BlZWQsIGludCAqZHVwbGV4KQorc3RhdGljIHZvaWQgaWNzMTg5M19yZWFkX21vZGUoc3RydWN0IG5pYyAqbmljIF9fdW51c2VkLCBpbnQgcGh5X2FkZHIsIGludCAqc3BlZWQsIGludCAqZHVwbGV4KQogewogCWludCBpID0gMDsKIAl1MzIgc3RhdHVzOwpAQCAtODQ4LDcgKzk3OSw3IEBACiAgKgl0byBkZXRlcm1pbmUgdGhlIHNwZWVkIGFuZCBkdXBsZXggbW9kZSBmb3Igc2lzOTAwCiAgKi8KIAotc3RhdGljIHZvaWQgcnRsODIwMV9yZWFkX21vZGUoc3RydWN0IG5pYyAqbmljLCBpbnQgcGh5X2FkZHIsIGludCAqc3BlZWQsIGludCAqZHVwbGV4KQorc3RhdGljIHZvaWQgcnRsODIwMV9yZWFkX21vZGUoc3RydWN0IG5pYyAqbmljIF9fdW51c2VkLCBpbnQgcGh5X2FkZHIsIGludCAqc3BlZWQsIGludCAqZHVwbGV4KQogewogCXUzMiBzdGF0dXM7CiAKQEAgLTg3OCw3ICsxMDA5LDUxIEBACiAJCSAgICAgICAqZHVwbGV4ID09IEZEWF9DQVBBQkxFX0ZVTExfU0VMRUNURUQgPwogCQkgICAgICAgImZ1bGwiIDogImhhbGYiKTsKIAllbHNlCi0JCXByaW50ZigicnRsOTIwMV9yZWFkX2NvbmZpZ19tb2RlOiBNZWRpYSBMaW5rIE9mZlxuIik7CisJCXByaW50ZigicnRsODIwMV9yZWFkX2NvbmZpZ19tb2RlOiBNZWRpYSBMaW5rIE9mZlxuIik7Cit9CisKKy8qKgorICoJdnQ2MTAzX3JlYWRfbW9kZTogLSByZWFkIG1lZGlhIG1vZGUgZm9yIHZ0NjEwMyBwaHkKKyAqCUBuaWM6IHRoZSBuZXQgZGV2aWNlIHRvIHJlYWQgbW9kZSBmb3IKKyAqCUBwaHlfYWRkcjogbWlpIHBoeSBhZGRyZXNzCisgKglAc3BlZWQ6IHRoZSB0cmFuc21pdCBzcGVlZCB0byBiZSBkZXRlcm1pbmVkCisgKglAZHVwbGV4OiB0aGUgZHVwbGV4IG1vZGUgdG8gYmUgZGV0ZXJtaW5lZAorICoKKyAqCXJlYWQgTUlJX1NUQVRVUyByZWdpc3RlciBmcm9tIHJ0bDgyMDEgcGh5CisgKgl0byBkZXRlcm1pbmUgdGhlIHNwZWVkIGFuZCBkdXBsZXggbW9kZSBmb3Igc2lzOTAwCisgKi8KKworc3RhdGljIHZvaWQgdnQ2MTAzX3JlYWRfbW9kZShzdHJ1Y3QgbmljICpuaWMgX191bnVzZWQsIGludCBwaHlfYWRkciwgaW50ICpzcGVlZCwgaW50ICpkdXBsZXgpCit7CisJdTMyIHN0YXR1czsKKworCXN0YXR1cyA9IHNpczkwMF9tZGlvX3JlYWQocGh5X2FkZHIsIE1JSV9TVEFUVVMpOworCisJaWYgKHN0YXR1cyAmIE1JSV9TVEFUX0NBTl9UWF9GRFgpIHsKKwkJKnNwZWVkID0gSFdfU1BFRURfMTAwX01CUFM7CisJCSpkdXBsZXggPSBGRFhfQ0FQQUJMRV9GVUxMX1NFTEVDVEVEOworCX0KKwllbHNlIGlmIChzdGF0dXMgJiBNSUlfU1RBVF9DQU5fVFgpIHsKKwkJKnNwZWVkID0gSFdfU1BFRURfMTAwX01CUFM7CisJCSpkdXBsZXggPSBGRFhfQ0FQQUJMRV9IQUxGX1NFTEVDVEVEOworCX0KKwllbHNlIGlmIChzdGF0dXMgJiBNSUlfU1RBVF9DQU5fVF9GRFgpIHsKKwkJKnNwZWVkID0gSFdfU1BFRURfMTBfTUJQUzsKKwkJKmR1cGxleCA9IEZEWF9DQVBBQkxFX0ZVTExfU0VMRUNURUQ7CisJfQorCWVsc2UgaWYgKHN0YXR1cyAmIE1JSV9TVEFUX0NBTl9UKSB7CisJCSpzcGVlZCA9IEhXX1NQRUVEXzEwX01CUFM7CisJCSpkdXBsZXggPSBGRFhfQ0FQQUJMRV9IQUxGX1NFTEVDVEVEOworCX0KKworCWlmIChzdGF0dXMgJiBNSUlfU1RBVF9MSU5LKQorCQlwcmludGYoInZ0NjEwM19yZWFkX21vZGU6IE1lZGlhIExpbmsgT24gJXMgJXMtZHVwbGV4IFxuIiwKKwkJICAgICAgICpzcGVlZCA9PSBIV19TUEVFRF8xMDBfTUJQUyA/CisJCSAgICAgICAiMTAwbWJwcyIgOiAiMTBtYnBzIiwKKwkJICAgICAgICpkdXBsZXggPT0gRkRYX0NBUEFCTEVfRlVMTF9TRUxFQ1RFRCA/CisJCSAgICAgICAiZnVsbCIgOiAiaGFsZiIpOworCWVsc2UKKwkJcHJpbnRmKCJ2dDYxMDNfcmVhZF9jb25maWdfbW9kZTogTWVkaWEgTGluayBPZmZcbiIpOwogfQogCiAvKiBGdW5jdGlvbjogc2lzOTAwX3RyYW5zbWl0CkBAIC05MDAsMTQgKzEwNzUsMTQgQEAKICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgcywgICAgIC8qIHNpemUgKi8KICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAqcCkgICAgIC8qIFBhY2tldCAqLwogewotICAgIHUzMiBzdGF0dXMsIHRvLCBuc3R5cGU7CisgICAgdTMyIHRvLCBuc3R5cGU7CiAgICAgdTMyIHR4X3N0YXR1czsKICAgICAKICAgICAvKiBTdG9wIHRoZSB0cmFuc21pdHRlciAqLwotICAgIG91dGwoVHhESVMsIGlvYWRkciArIGNyKTsKKyAgICBvdXRsKFR4RElTIHwgaW5sKGlvYWRkciArIGNyKSwgaW9hZGRyICsgY3IpOwogCiAgICAgLyogbG9hZCBUcmFuc21pdCBEZXNjcmlwdG9yIFJlZ2lzdGVyICovCi0gICAgb3V0bCgodTMyKSAmdHhkLCBpb2FkZHIgKyB0eGRwKTsgCisgICAgb3V0bCh2aXJ0X3RvX2J1cygmdHhkKSwgaW9hZGRyICsgdHhkcCk7IAogICAgIGlmIChzaXM5MDBfZGVidWcgPiAxKQogICAgICAgICBwcmludGYoInNpczkwMF90cmFuc21pdDogVFggZGVzY3JpcHRvciByZWdpc3RlciBsb2FkZWQgd2l0aDogJVhcbiIsIAogICAgICAgICAgICAgICAgaW5sKGlvYWRkciArIHR4ZHApKTsKQEAgLTkyOSwxOCArMTEwNCwxOCBAQAogICAgICAgICB0eGJbcysrXSA9ICdcMCc7CiAKICAgICAvKiBzZXQgdGhlIHRyYW5zbWl0IGJ1ZmZlciBkZXNjcmlwdG9yIGFuZCBlbmFibGUgVHJhbnNtaXQgU3RhdGUgTWFjaGluZSAqLwotICAgIHR4ZC5idWZwdHIgPSAodTMyKSAmdHhiWzBdOworICAgIHR4ZC5idWZwdHIgPSB2aXJ0X3RvX2J1cygmdHhiWzBdKTsKICAgICB0eGQuY21kc3RzID0gKHUzMikgT1dOIHwgczsKIAogICAgIC8qIHJlc3RhcnQgdGhlIHRyYW5zbWl0dGVyICovCi0gICAgb3V0bChUeEVOQSwgaW9hZGRyICsgY3IpOworICAgIG91dGwoVHhFTkEgfCBpbmwoaW9hZGRyICsgY3IpLCBpb2FkZHIgKyBjcik7CiAKICAgICBpZiAoc2lzOTAwX2RlYnVnID4gMSkKICAgICAgICAgcHJpbnRmKCJzaXM5MDBfdHJhbnNtaXQ6IFF1ZXVlZCBUeCBwYWNrZXQgc2l6ZSAlZC5cbiIsIChpbnQpIHMpOwogCiAgICAgdG8gPSBjdXJydGlja3MoKSArIFRYX1RJTUVPVVQ7CiAKLSAgICB3aGlsZSAoKCgodm9sYXRpbGUgdTMyKSB0eF9zdGF0dXM9dHhkLmNtZHN0cykgJiBPV04pICYmIChjdXJydGlja3MoKSA8IHRvKSkKKyAgICB3aGlsZSAoKHZvbGF0aWxlIHUzMikgKCB0eF9zdGF0dXM9dHhkLmNtZHN0cyAmIE9XTikgJiYgKGN1cnJ0aWNrcygpIDwgdG8pKQogICAgICAgICAvKiB3YWl0ICovIDsKIAogICAgIGlmIChjdXJydGlja3MoKSA+PSB0bykgewpAQCAtOTU1LDcgKzExMzAsNiBAQAogICAgIG91dGwoMCwgaW9hZGRyICsgaW1yKTsKIH0KIAotDAogLyogRnVuY3Rpb246IHNpczkwMF9wb2xsCiAgKgogICogRGVzY3JpcHRpb246IGNoZWNrcyBmb3IgYSByZWNlaXZlZCBwYWNrZXQgYW5kIHJldHVybnMgaXQgaWYgZm91bmQuCkBAIC05NzEsNyArMTE0NSw3IEBACiAgKi8KIAogc3RhdGljIGludAotc2lzOTAwX3BvbGwoc3RydWN0IG5pYyAqbmljKQorc2lzOTAwX3BvbGwoc3RydWN0IG5pYyAqbmljLCBpbnQgcmV0cmlldmUpCiB7CiAgICAgdTMyIHJ4X3N0YXR1cyA9IHJ4ZFtjdXJfcnhdLmNtZHN0czsKICAgICBpbnQgcmV0c3RhdCA9IDA7CkBAIC05ODYsNiArMTE2MCw4IEBACiAgICAgICAgIHByaW50Zigic2lzOTAwX3BvbGw6IGdvdCBhIHBhY2tldDogY3VyX3J4OiVkLCBzdGF0dXM6JVhcbiIsCiAgICAgICAgICAgICAgICBjdXJfcngsIHJ4X3N0YXR1cyk7CiAKKyAgICBpZiAoICEgcmV0cmlldmUgKSByZXR1cm4gMTsKKyAgICAKICAgICBuaWMtPnBhY2tldGxlbiA9IChyeF9zdGF0dXMgJiBEU0laRSkgLSBDUkNfU0laRTsKIAogICAgIGlmIChyeF9zdGF0dXMgJiAoQUJPUlR8T1ZFUlJVTnxUT09MT05HfFJVTlR8UlhJU0VSUnxDUkNFUlJ8RkFFUlIpKSB7CkBAIC0xMDAxLDE4ICsxMTc3LDE4IEBACiAKICAgICAvKiByZXR1cm4gdGhlIGRlc2NyaXB0b3IgYW5kIGJ1ZmZlciB0byByZWNlaXZlIHJpbmcgKi8KICAgICByeGRbY3VyX3J4XS5jbWRzdHMgPSBSWF9CVUZfU0laRTsKLSAgICByeGRbY3VyX3J4XS5idWZwdHIgPSAodTMyKSAmcnhiW2N1cl9yeCpSWF9CVUZfU0laRV07CisgICAgcnhkW2N1cl9yeF0uYnVmcHRyID0gdmlydF90b19idXMoJnJ4YltjdXJfcngqUlhfQlVGX1NJWkVdKTsKICAgICAgICAgCiAgICAgaWYgKCsrY3VyX3J4ID09IE5VTV9SWF9ERVNDKQogICAgICAgICBjdXJfcnggPSAwOwogCiAgICAgLyogcmUtZW5hYmxlIHRoZSBwb3RlbnRpYWxseSBpZGxlIHJlY2VpdmUgc3RhdGUgbWFjaGluZSAqLwotICAgIG91dGwoUnhFTkEgLCBpb2FkZHIgKyBjcik7CisgICAgb3V0bChSeEVOQSB8IGlubChpb2FkZHIgKyBjciksIGlvYWRkciArIGNyKTsKIAogICAgIHJldHVybiByZXRzdGF0OworCiB9CiAKLQwKIC8qIEZ1bmN0aW9uOiBzaXM5MDBfZGlzYWJsZQogICoKICAqIERlc2NyaXB0aW9uOiBUdXJucyBvZmYgaW50ZXJydXB0cyBhbmQgc3RvcHMgVHggYW5kIFJ4IGVuZ2luZXMKQEAgLTEwMjMsMTIgKzExOTksNTMgQEAKICAqLwogCiBzdGF0aWMgdm9pZAotc2lzOTAwX2Rpc2FibGUoc3RydWN0IG5pYyAqbmljKQorc2lzOTAwX2Rpc2FibGUoc3RydWN0IGRldiAqZGV2KQogeworICAgIHN0cnVjdCBuaWMgKm5pYyA9IChzdHJ1Y3QgbmljICopZGV2OworICAgIC8qIG1lcmdlIHJlc2V0IGFuZCBkaXNhYmxlICovCisgICAgc2lzOTAwX2luaXQobmljKTsKKwogICAgIC8qIERpc2FibGUgaW50ZXJydXB0cyBieSBjbGVhcmluZyB0aGUgaW50ZXJydXB0IG1hc2suICovCiAgICAgb3V0bCgwLCBpb2FkZHIgKyBpbXIpOwogICAgIG91dGwoMCwgaW9hZGRyICsgaWVyKTsKICAgICAKICAgICAvKiBTdG9wIHRoZSBjaGlwJ3MgVHggYW5kIFJ4IFN0YXR1cyBNYWNoaW5lICovCi0gICAgb3V0bChSeERJUyB8IFR4RElTLCBpb2FkZHIgKyBjcik7CisgICAgb3V0bChSeERJUyB8IFR4RElTIHwgaW5sKGlvYWRkciArIGNyKSwgaW9hZGRyICsgY3IpOworfQorCisvKiBGdW5jdGlvbjogc2lzOTAwX2lycQorICoKKyAqIERlc2NyaXB0aW9uOiBFbmFibGUsIERpc2FibGUsIG9yIEZvcmNlLCBpbnRlcnJ1cHRzCisgKiAgICAKKyAqIEFyZ3VtZW50czogc3RydWN0IG5pYyAqbmljOiAgICAgICAgICBOSUMgZGF0YSBzdHJ1Y3R1cmUKKyAqICAgICAgICAgICAgaXJxX2FjdGlvbl90IGFjdGlvbjogICAgICBSZXF1ZXN0ZWQgYWN0aW9uICAgICAgIAorICoKKyAqIFJldHVybnM6ICAgdm9pZC4KKyAqLworCitzdGF0aWMgdm9pZAorc2lzOTAwX2lycShzdHJ1Y3QgbmljICpuaWMgX191bnVzZWQsIGlycV9hY3Rpb25fdCBhY3Rpb24gX191bnVzZWQpCit7CisgIHN3aXRjaCAoIGFjdGlvbiApIHsKKyAgY2FzZSBESVNBQkxFIDoKKyAgICBicmVhazsKKyAgY2FzZSBFTkFCTEUgOgorICAgIGJyZWFrOworICBjYXNlIEZPUkNFIDoKKyAgICBicmVhazsKKyAgfQogfQorCitzdGF0aWMgc3RydWN0IHBjaV9pZCBzaXM5MDBfbmljc1tdID0geworUENJX1JPTSgweDEwMzksIDB4MDkwMCwgInNpczkwMCIsICAiU0lTOTAwIiksCitQQ0lfUk9NKDB4MTAzOSwgMHg3MDE2LCAic2lzNzAxNiIsICJTSVM3MDE2IiksCit9OworCitzdHJ1Y3QgcGNpX2RyaXZlciBzaXM5MDBfZHJpdmVyID0geworCS50eXBlICAgICA9IE5JQ19EUklWRVIsCisJLm5hbWUgICAgID0gIlNJUzkwMCIsCisJLnByb2JlICAgID0gc2lzOTAwX3Byb2JlLAorCS5pZHMgICAgICA9IHNpczkwMF9uaWNzLAorCS5pZF9jb3VudCA9IHNpemVvZihzaXM5MDBfbmljcykvc2l6ZW9mKHNpczkwMF9uaWNzWzBdKSwKKwkuY2xhc3MgICAgPSAwLAorfTsKZGlmZiAtTmF1ciBncnViLTAuOTcub3JpZy9uZXRib290L3NpczkwMC5oIGdydWItMC45Ny9uZXRib290L3NpczkwMC5oCi0tLSBncnViLTAuOTcub3JpZy9uZXRib290L3NpczkwMC5oCTIwMDMtMDctMDkgMTE6NDU6MzguMDAwMDAwMDAwICswMDAwCisrKyBncnViLTAuOTcvbmV0Ym9vdC9zaXM5MDAuaAkyMDA1LTA4LTMxIDE5OjAzOjM1LjAwMDAwMDAwMCArMDAwMApAQCAtMzksMTQgKzM5LDE2IEBACiAKIC8qIFN5bWJvbGljIG5hbWVzIGZvciBiaXRzIGluIHZhcmlvdXMgcmVnaXN0ZXJzICovCiBlbnVtIHNpczkwMF9jb21tYW5kX3JlZ2lzdGVyX2JpdHMgewotICAgIFJFU0VUICAgPSAweDAwMDAwMTAwLCAKLSAgICBTV0kgICAgID0gMHgwMDAwMDA4MCwgCi0gICAgUnhSRVNFVCA9IDB4MDAwMDAwMjAsCi0gICAgVHhSRVNFVCA9IDB4MDAwMDAwMTAsIAotICAgIFJ4RElTICAgPSAweDAwMDAwMDA4LCAKLSAgICBSeEVOQSAgID0gMHgwMDAwMDAwNCwKLSAgICBUeERJUyAgID0gMHgwMDAwMDAwMiwgCi0gICAgVHhFTkEgICA9IDB4MDAwMDAwMDEKKyAgICBSRUxPQUQgICAgID0gMHgwMDAwMDQwMCwKKyAgICBBQ0NFU1NNT0RFID0gMHgwMDAwMDIwMCwKKyAgICBSRVNFVCAgICAgID0gMHgwMDAwMDEwMCwgCisgICAgU1dJICAgICAgICA9IDB4MDAwMDAwODAsIAorICAgIFJ4UkVTRVQgICAgPSAweDAwMDAwMDIwLAorICAgIFR4UkVTRVQgICAgPSAweDAwMDAwMDEwLCAKKyAgICBSeERJUyAgICAgID0gMHgwMDAwMDAwOCwgCisgICAgUnhFTkEgICAgICA9IDB4MDAwMDAwMDQsCisgICAgVHhESVMgICAgICA9IDB4MDAwMDAwMDIsIAorICAgIFR4RU5BICAgICAgPSAweDAwMDAwMDAxCiB9OwogCiBlbnVtIHNpczkwMF9jb25maWd1cmF0aW9uX3JlZ2lzdGVyX2JpdHMgewpAQCAtNTcsNyArNTksMTAgQEAKICAgICBFWEQgICAgICA9IDB4MDAwMDAwMTAsIAogICAgIFBFU0VMICAgID0gMHgwMDAwMDAwOCwgCiAgICAgTFBNICAgICAgPSAweDAwMDAwMDA0LCAKLSAgICBCRU0gICAgICA9IDB4MDAwMDAwMDEKKyAgICBCRU0gICAgICA9IDB4MDAwMDAwMDEsCisgICAgUk5EX0NOVCAgPSAweDAwMDAwNDAwLAorICAgIEZBSVJfQkFDS09GRiA9IDB4MDAwMDAyMDAsCisgICAgRURCX01BU1RFUl9FTiA9IDB4MDAwMDIwMDAKIH07CiAKIGVudW0gc2lzOTAwX2VlcHJvbV9hY2Nlc3NfcmVpZ3N0ZXJfYml0cyB7CkBAIC0xMDgsNiArMTEzLDEwIEBACiAjZGVmaW5lIFRYX0RNQV9CVVJTVCAgICAwCiAjZGVmaW5lIFJYX0RNQV9CVVJTVCAgICAwCiAKK2VudW0gc2lzOTAwX3R4X3J4X2RtYXsKKwkgICAgICAgIERNQV9CVVJTVF81MTIgPSAwLCAgICAgIERNQV9CVVJTVF82NCA9IDUKK307CisKIC8qIHRyYW5zbWl0IEZJRk8gdGhyZXNoaG9sZHMgKi8KICNkZWZpbmUgVFhfRklMTF9USFJFU0ggIDE2ICAgICAgLyogMS80IEZJRk8gc2l6ZSAqLwogI2RlZmluZSBUeEZJTExUX3NoaWZ0ICAgOApAQCAtMTcyLDYgKzE4MSwxMSBAQAogICAgIEVFZXJhc2VBbGwgICAgICA9IDB4MDEyMCwKICAgICBFRXdyaXRlQWxsICAgICAgPSAweDAxMTAsIAogICAgIEVFYWRkck1hc2sgICAgICA9IDB4MDEzRiwgCisgICAgRUVjbWRTaGlmdCAJICAgID0gMTYKK307CisvKiBGb3IgU2lTOTYyIG9yIFNpUzk2MywgcmVxdWVzdCB0aGUgZWVwcm9tIHNvZnR3YXJlIGFjY2VzcyAqLworZW51bSBzaXM5NnhfZWVwcm9tX2NvbW1hbmQgeworCUVFUkVRID0gMHgwMDAwMDQwMCwgRUVET05FID0gMHgwMDAwMDIwMCwgRUVHTlQgPSAweDAwMDAwMTAwCiB9OwogCiAvKiBNYW5hbWdlbWVudCBEYXRhIEkvTyAobWRpbykgZnJhbWUgKi8KQEAgLTIzNiw3ICsyNTAsOCBAQAogICAgIE1JSV9DT05GSUcxID0gMHgwMDEwLAogICAgIE1JSV9DT05GSUcyID0gMHgwMDExLAogICAgIE1JSV9TVFNPVVQgID0gMHgwMDEyLAotICAgIE1JSV9NQVNLICAgID0gMHgwMDEzCisgICAgTUlJX01BU0sgICAgPSAweDAwMTMsCisgICAgTUlJX1JFU1YgICAgPSAweDAwMTQKIH07CiAKIC8qIG1paSByZWdpc3RlcnMgc3BlY2lmaWMgdG8gQU1EIDc5QzkwMSAqLwpAQCAtMzIwLDcgKzMzNSw5IEBACiAKIGVudW0gc2lzOTAwX3JldmlzaW9uX2lkIHsKIAlTSVM2MzBBXzkwMF9SRVYgPSAweDgwLAkJU0lTNjMwRV85MDBfUkVWID0gMHg4MSwKLQlTSVM2MzBTXzkwMF9SRVYgPSAweDgyLAkJU0lTNjMwRUExXzkwMF9SRVYgPSAweDgzCisJU0lTNjMwU185MDBfUkVWID0gMHg4MiwJCVNJUzYzMEVBMV85MDBfUkVWID0gMHg4MywKKwlTSVM2MzBFVF85MDBfUkVWID0gMHg4NCwgICAgICAgIFNJUzYzNUFfOTAwX1JFViA9IDB4OTAsCisJU0lTOTZ4XzkwMF9SRVYgPSAwWDkxLAkJU0lTOTAwQl85MDBfUkVWID0gMHgwMwogfTsKIAogZW51bSBzaXM2MzBfcmV2aXNpb25faWQgewpkaWZmIC1OYXVyIGdydWItMC45Ny5vcmlnL25ldGJvb3Qvc2lzOTAwLnR4dCBncnViLTAuOTcvbmV0Ym9vdC9zaXM5MDAudHh0Ci0tLSBncnViLTAuOTcub3JpZy9uZXRib290L3NpczkwMC50eHQJMjAwMy0wNy0wOSAxMTo0NTozOC4wMDAwMDAwMDAgKzAwMDAKKysrIGdydWItMC45Ny9uZXRib290L3NpczkwMC50eHQJMTk3MC0wMS0wMSAwMDowMDowMC4wMDAwMDAwMDAgKzAwMDAKQEAgLTEsOTEgKzAsMCBAQAotSG93IEkgYWRkZWQgdGhlIFNJUzkwMCBjYXJkIHRvIEV0aGVyYm9vdAotCi1BdXRob3I6IE1hcnR5IENvbm5vciAobWRjQHRoaW5ndWluLm9yZykKLQotRGF0ZTogICAyNSBGZWJyYXJ5IDIwMDEKLQotRGVzY3JpcHRpb246Ci0KLVRoaXMgZmlsZSBpcyBpbnRlbmRlZCB0byBoZWxwIHBlb3BsZSB3aG8gd2FudCB0byB3cml0ZSBhbiBFdGhlcmJvb3QKLWRyaXZlciBvciBwb3J0IGFub3RoZXIgZHJpdmVyIHRvIEV0aGVyYm9vdC4gIEl0IGlzIGEgc3RhcnRpbmcgcG9pbnQuCi1QZXJoYXBzIHNvbWVkYXkgSSBtYXkgd3JpdGUgYSBtb3JlIGRldGFpbGVkIGRlc2NyaXB0aW9uIG9mIHdyaXRpbmcgYW4KLUV0aGVyYm9vdCBkcml2ZXIuIFRoaXMgdGV4dCBzaG91bGQgaGVscCBnZXQgcGVvcGxlIHN0YXJ0ZWQsIGFuZAotc3R1ZHlpbmcgc2lzOTAwLltjaF0gc2hvdWxkIGhlbHAgc2hvdyB0aGUgYmFzaWMgc3RydWN0dXJlIGFuZAotdGVjaG5pcXVlcyBpbnZvbHZlZCBpbiB3cml0aW5nIGFuZCBFdGhlcmJvb3QgZHJpdmVyLgotCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0wLiBCYWNrIHVwIGFsbCB0aGUgZmlsZXMgSSBuZWVkIHRvIG1vZGlmeToKLQotY2QgZXRoZXJib290LTQuNy4yMC9zcmMKLWNwIE1ha2VmaWxlIE1ha2VmaWxlLm9yaWcKLWNwIGNvbmZpZy5jIGNvbmZpZy5jLm9yaWcKLWNwIHBjaS5oIHBjaS5oLm9yaWcKLWNwIE5JQyBOSUMub3JpZwotY3AgY2FyZHMuaCBjYXJkcy5oLm9yaWcKLQotMS4gRWRpdCBzcmMvTWFrZWZpbGUgdG8gYWRkIFNJUzkwMEZMQUdTIHRvIGRlZmluZXMKLQotU0lTOTAwRkxBR1M9CSAgICAgICAJLURJTkNMVURFX1NJUzkwMAotCi0yLiBlZGl0IHNyYy9wY2kuaCB0byBhZGQgUENJIHNpZ25hdHVyZXMgZm9yIGNhcmQKLQotI2RlZmluZSBQQ0lfVkVORE9SX0lEX1NJUyAgICAgICAgIAkweDEwMzkKLSNkZWZpbmUgUENJX0RFVklDRV9JRF9TSVM5MDAgICAgIAkweDA5MDAgICAKLSNkZWZpbmUgUENJX0RFVklDRV9JRF9TSVM3MDE2ICAgIAkweDcwMTYgIAotCi0zLiBFZGl0IHNyYy9jb25maWcuYyB0byBhZGQgdGhlIGNhcmQgdG8gdGhlIGNhcmQgcHJvYmUgbGlzdAotCi0jaWYgZGVmaW5lZChJTkNMVURFX05TODM5MCkgIHx8IGRlZmluZWQoSU5DTFVERV9FRVBSTzEwMCkgIHx8IAotICAgIGRlZmluZWQoSU5DTFVERV9MQU5DRSkgICB8fCBkZWZpbmVkKElOQ0xVREVfRVBJQzEwMCkgICB8fCAKLSAgICBkZWZpbmVkKElOQ0xVREVfVFVMSVApICAgfHwgZGVmaW5lZChJTkNMVURFX09UVUxJUCkgICAgfHwKLSAgICBkZWZpbmVkKElOQ0xVREVfM0M5MFgpICAgfHwgZGVmaW5lZChJTkNMVURFXzNDNTk1KSAgICAgfHwKLSAgICBkZWZpbmVkKElOQ0xVREVfUlRMODEzOSkgfHwgZGVmaW5lZChJTkNMVURFX1ZJQV9SSElORSkgfHwgCi0gICAgZGVmaW5lZChJTkNMVURFX1NJUzkwMCkgIHx8IGRlZmluZWQoSU5DTFVERV9XODlDODQwKQotCi0uLi4gYW5kIC4uLgotCi0jaWZkZWYgSU5DTFVERV9TSVM5MDAKLSAgICAgICB7IFBDSV9WRU5ET1JfSURfU0lTLCAgICAgCVBDSV9ERVZJQ0VfSURfU0lTOTAwLAotICAgICAgICAgIlNJUzkwMCIsIDAsIDAsIDAsIDB9LAotICAgICAgIHsgUENJX1ZFTkRPUl9JRF9TSVMsICAgICAJUENJX0RFVklDRV9JRF9TSVM3MDE2LAotCSAiU0lTNzAxNiIsIDAsIDAsIDAsIDB9LAotI2VuZGlmCi0KLS4uLiBhbmQgLi4uCi0KLSNpZmRlZiBJTkNMVURFX1NJUzkwMAotCXsgIlNJUzkwMCIsIHNpczkwMF9wcm9iZSwgcGNpX2lvYWRkcnMgfSwJCi0jZW5kaWYKLQotNC4gRWRpdCBOSUMgdG8gYWRkIHNpczkwMCBhbmQgc2lzNzAxNiB0byBOSUMgbGlzdAotCi0jIFNJUyA5MDAgYW5kIFNJUyA3MDE2Ci1zaXM5MDAJCXNpczkwMAkJMHgxMDM5LDB4MDkwMAotc2lzNzAxNgkJc2lzOTAwCQkweDEwMzksMHg3MDE2Ci0KLTUuIEVkaXQgY2FyZHMuaCB0byBhZGQgc2lzOTAwIHByb2JlIHJvdXRpbmUgZGVjbGFyYXRpb24KLQotI2lmZGVmCUlOQ0xVREVfU0lTOTAwCi1leHRlcm4gc3RydWN0IG5pYwkqc2lzOTAwX3Byb2JlKHN0cnVjdCBuaWMgKiwgdW5zaWduZWQgc2hvcnQgKgotICAgICAgICAgICAgICAgICAgICAgICAgUENJX0FSRyhzdHJ1Y3QgcGNpX2RldmljZSAqKSk7Ci0jZW5kaWYKLQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotQXQgdGhpcyBwb2ludCwgeW91IGNhbiBiZWdpbiBjcmVhdGluZyB5b3VyIGRyaXZlciBzb3VyY2UgZmlsZS4gIFNlZQotdGhlICJXcml0aW5nIGFuZCBFdGhlcmJvb3QgRHJpdmVyIiBzZWN0aW9uIG9mIHRoZSBFdGhlcmJvb3QKLWRvY3VtZW50YXRpb24gZm9yIHNvbWUgaGludHMuICBTZWUgdGhlIHNrZWwuYyBmaWxlIGZvciBhIHN0YXJ0aW5nCi1wb2ludC4gIElmIHRoZXJlIGlzIGEgTGludXggZHJpdmVyIGZvciB0aGUgY2FyZCwgeW91IG1heSBiZSBhYmxlIHRvCi11c2UgdGhhdC4gIENvcHkgYW5kIGxlYXJuIGZyb20gZXhpc3RpbmcgRXRoZXJib290IGRyaXZlcnMgKHRoaXMgaXMgR1BMCi0vIE9wZW4gU291cmNlIHNvZnR3YXJlISkuCi0KLUpvaW4gdGhlIGV0aGVyYm9vdC1kZXZlbG9wZXJzIGFuZCBldGhlcmJvb3QtdXNlcnMgbWFpbGluZyBsaXN0cwotKGluZm9ybWF0aW9uIGlzIG9uIGV0aGVyYm9vdC5zb3VyY2Vmb3JnZS5uZXQpIGZvciBpbmZvcm1hdGlvbiBhbmQKLWFzc2lzdGFuY2UuIFdlIGludml0ZSBtb3JlIGRldmVsb3BlcnMgdG8gaGVscCBpbXByb3ZlIEV0aGVyYm9vdC4KLQotVmlzaXQgdGhlIGh0dHA6Ly9ldGhlcmJvb3Quc291cmNlZm9yZ2UubmV0LCBodHRwOi8vdGhpbmd1aW4ub3JnLCAKLWh0dHA6Ly9yb20tby1tYXRpYy5uZXQsIGFuZCBodHRwOi8vbHRzcC5vcmcgc2l0ZXMgZm9yIGluZm9ybWF0aW9uIGFuZAotYXNzaXN0YW5jZS4KLQotRW5qb3kuCmRpZmYgLU5hdXIgZ3J1Yi0wLjk3Lm9yaWcvbmV0Ym9vdC9za19nMTYuYyBncnViLTAuOTcvbmV0Ym9vdC9za19nMTYuYwotLS0gZ3J1Yi0wLjk3Lm9yaWcvbmV0Ym9vdC9za19nMTYuYwkyMDAzLTA3LTA5IDExOjQ1OjM4LjAwMDAwMDAwMCArMDAwMAorKysgZ3J1Yi0wLjk3L25ldGJvb3Qvc2tfZzE2LmMJMTk3MC0wMS0wMSAwMDowMDowMC4wMDAwMDAwMDAgKzAwMDAKQEAgLTEsMTE2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLUV0aGVyYm9vdCAtICBCT09UUC9URlRQIEJvb3RzdHJhcCBQcm9ncmFtCi1TY2huZWlkZXIgJiBLb2NoIEcxNiBOSUMgZHJpdmVyIGZvciBFdGhlcmJvb3QKLWhlYXZpbHkgYmFzZWQgb24gU0sgRzE2IGRyaXZlciBmcm9tIExpbnV4IDIuMC4zNgotQ2hhbmdlcyB0byBtYWtlIGl0IHdvcmsgd2l0aCBFdGhlcmJvb3QgYnkgR2VvcmcgQmF1bSA8R2VvcmcuQmF1bUBnbXguZGU+Ci0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qLQotICogQ29weXJpZ2h0IChDKSAxOTk0IGJ5IFBKRCBXZWljaG1hbm4gJiBTV1MgQmVybiwgU3dpdHplcmxhbmQKLSAqCi0gKiBUaGlzIHNvZnR3YXJlIG1heSBiZSB1c2VkIGFuZCBkaXN0cmlidXRlZCBhY2NvcmRpbmcgdG8gdGhlIHRlcm1zCi0gKiBvZiB0aGUgR05VIFB1YmxpYyBMaWNlbnNlLCBpbmNvcnBvcmF0ZWQgaGVyZWluIGJ5IHJlZmVyZW5jZS4KLSAqCi0gKiBNb2R1bGUgICAgICAgICA6IHNrX2cxNi5jCi0gKgotICogVmVyc2lvbiAgICAgICAgOiAkUmV2aXNpb246IDEuNCAkCi0gKgotICogQXV0aG9yICAgICAgICAgOiBQYXRyaWNrIEouRC4gV2VpY2htYW5uCi0gKgotICogRGF0ZSBDcmVhdGVkICAgOiA5NC8wNS8yNgotICogTGFzdCBVcGRhdGVkICAgOiAkRGF0ZTogMjAwMi8wMS8wMiAyMTo1Njo0MCAkCi0gKgotICogRGVzY3JpcHRpb24gICAgOiBTY2huZWlkZXIgJiBLb2NoIEcxNiBFdGhlcm5ldCBEZXZpY2UgRHJpdmVyIGZvcgotICogICAgICAgICAgICAgICAgICBMaW51eCBLZXJuZWwgPj0gMS4xLjIyCi0gKiBVcGRhdGUgSGlzdG9yeSA6Ci0gKgotLSovCi0KLS8qCi0gKiBUaGUgU2NobmVpZGVyICYgS29jaCAoU0spIEcxNiBOZXR3b3JrIGRldmljZSBkcml2ZXIgaXMgYmFzZWQKLSAqIG9uIHRoZSAnbmk2NTEwJyBkcml2ZXIgZnJvbSBNaWNoYWVsIEhpcHAgd2hpY2ggY2FuIGJlIGZvdW5kIGF0Ci0gKiBmdHA6Ly9zdW5zaXRlLnVuYy5lZHUvcHViL0xpbnV4L3N5c3RlbS9OZXR3b3JrL2RyaXZlcnMvbmlkcml2ZXJzLnRhci5negotICoKLSAqIFNvdXJjZXM6IDEpIG5pNjUxMC5jIGJ5IE0uIEhpcHAKLSAqICAgICAgICAgIDIpIGRlcGNhLmMgIGJ5IEQuQy4gRGF2aWVzCi0gKiAgICAgICAgICAzKSBza2VsZXRvbi5jIGJ5IEQuIEJlY2tlcgotICogICAgICAgICAgNCkgQW03OTkwIExvY2FsIEFyZWEgTmV0d29yayBDb250cm9sbGVyIGZvciBFdGhlcm5ldCAoTEFOQ0UpLAotICogICAgICAgICAgICAgQU1ELCBQdWIuICMwNTY5OCwgSnVuZSAxOTg5Ci0gKgotICogTWFueSBUaGFua3MgZm9yIGhlbHBpbmcgbWUgdG8gZ2V0IHRoaW5ncyB3b3JraW5nIHRvOgotICoKLSAqICAgICAgICAgICAgICAgICBBLiBDb3ggKEEuQ294QHN3YW5zZWEuYWMudWspCi0gKiAgICAgICAgICAgICAgICAgTS4gSGlwcCAobWhpcHBAc3R1ZGVudC51bmktdHVlYmluZ2VuLmRlKQotICogICAgICAgICAgICAgICAgIFIuIEJvbHogKFNjaG5laWRlciAmIEtvY2gsIEdlcm1hbnkpCi0gKgotICogU2VlIFJFQURNRS5za19nMTYgZm9yIGRldGFpbHMgYWJvdXQgbGltaXRhdGlvbnMgYW5kIGJ1Z3MgZm9yIHRoZQotICogY3VycmVudCB2ZXJzaW9uLgotICoKLSAqIFRvIERvOgotICogICAgICAgIC0gU3VwcG9ydCBvZiBTS19HOCBhbmQgb3RoZXIgU0sgTmV0d29yayBDYXJkcy4KLSAqICAgICAgICAtIEF1dG9zZXQgbWVtb3J5IG1hcHBlZCBSQU0uIENoZWNrIGZvciBmcmVlIG1lbW9yeSBhbmQgdGhlbgotICogICAgICAgICAgY29uZmlndXJlIFJBTSBjb3JyZWN0bHkuCi0gKiAgICAgICAgLSBTS19jbG9zZSBzaG91bGQgcmVhbGx5IHNldCBjYXJkIGluIHRvIGluaXRpYWwgc3RhdGUuCi0gKiAgICAgICAgLSBUZXN0IGlmIElSUSAzIGlzIG5vdCBzd2l0Y2hlZCBvZmYuIFVzZSBhdXRvaXJxKCkgZnVuY3Rpb25hbGl0eS4KLSAqICAgICAgICAgIChhcyBpbiAvZHJpdmVycy9uZXQvc2tlbGV0b24uYykKLSAqICAgICAgICAtIEltcGxlbWVudCBNdWx0aWNhc3QgYWRkcmVzc2luZy4gQXQgbWluaW11bSBzb21ldGhpbmcgbGlrZQotICogICAgICAgICAgaW4gZGVwY2EuYy4KLSAqICAgICAgICAtIFJlZG8gdGhlIHN0YXRpc3RpY3MgcGFydC4KLSAqICAgICAgICAtIFRyeSB0byBmaW5kIG91dCBpZiB0aGUgYm9hcmQgaXMgaW4gOCBCaXQgb3IgMTYgQml0IHNsb3QuCi0gKiAgICAgICAgICBJZiBpbiA4IEJpdCBtb2RlIGRvbid0IHVzZSBJUlEgMTEuCi0gKiAgICAgICAgLSAoVHJ5IHRvIG1ha2UgaXQgc2xpZ2h0bHkgZmFzdGVyLikKLSAqLwotCi0vKiB0byBnZXQgc29tZSBnbG9iYWwgcm91dGluZXMgbGlrZSBwcmludGYgKi8KLSNpbmNsdWRlICJldGhlcmJvb3QuaCIKLS8qIHRvIGdldCB0aGUgaW50ZXJmYWNlIHRvIHRoZSBib2R5IG9mIHRoZSBwcm9ncmFtICovCi0jaW5jbHVkZSAibmljLmgiCi0KLS8qIEZyb20gbGludXgvaWZfZXRoZXIuaDogKi8KLSNkZWZpbmUgRVRIX1pMRU4JNjAJCS8qIE1pbi4gb2N0ZXRzIGluIGZyYW1lIHNhbnMgRkNTICovCi0KLSNpbmNsdWRlICJza19nMTYuaCIKLQotLyoKLSAqIFNjaG5laWRlciAmIEtvY2ggQ2FyZCBEZWZpbml0aW9ucwotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKi8KLQotI2RlZmluZSBTS19OQU1FICAgIlNLX0cxNiIKLQotLyoKLSAqIFNLX0cxNiBDb25maWd1cmF0aW9uCi0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLQotICovCi0KLS8qCi0gKiBBYmJyZXZpYXRpb25zCi0gKiAtLS0tLS0tLS0tLS0tCi0gKgotICogUkFNIC0gdXNlZCBmb3IgdGhlIDE2S0Igc2hhcmVkIG1lbW9yeQotICogQm9vdF9ST00sIFJPTSAtIGFyZSB1c2VkIGZvciByZWZlcmVuY2luZyB0aGUgQm9vdEVQUk9NCi0gKgotICogU0tfQUREUiBpcyBhIHN5bWJvbGljIGNvbnN0YW50IHVzZWQgdG8gY29uZmlndXJlCi0gKiB0aGUgYmVoYXZpb3VyIG9mIHRoZSBkcml2ZXIgYW5kIHRoZSBTS19HMTYuCi0gKgotICogU0tfQUREUiBkZWZpbmVzIHRoZSBhZGRyZXNzIHdoZXJlIHRoZSBSQU0gd2lsbCBiZSBtYXBwZWQgaW50byB0aGUgcmVhbAotICogICAgICAgICBob3N0IG1lbW9yeS4KLSAqICAgICAgICAgdmFsaWQgYWRkcmVzc2VzIGFyZSBmcm9tIDB4YTAwMDAgdG8gMHhmYzAwMCBpbiAxNktieXRlIHN0ZXBzLgotICovCi0KLSNkZWZpbmUgU0tfQUREUiAgICAgICAgIDB4Y2MwMDAKLQotLyoKLSAqIEluIFBPUzMgYXJlIGJpdHMgQTE0LUExOSBvZiB0aGUgYWRkcmVzcyBidXMuIFRoZXNlIGJpdHMgY2FuIGJlIHNldAotICogdG8gY2hvb3NlIHRoZSBSQU0gYWRkcmVzcy4gVGhhdCdzIHdoeSB3ZSBvbmx5IGNhbiBjaG9vc2UgdGhlIFJBTSBhZGRyZXNzCi0gKiBpbiAxNktCIHN0ZXBzLgotICovCi0KLSNkZWZpbmUgUE9TX0FERFIgICAgICAgKHJvbV9hZGRyPj4xNCkgIC8qIERvIG5vdCBjaGFuZ2UgdGhpcyBsaW5lICovCi0KLS8qCi0gKiBTS19HMTYgSS9PIFBPUlQncyArIElSUSdzICsgQm9vdF9ST00gbG9jYXRpb25zCi0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKi8KLQotLyoKLSAqIEFzIG5lYXJseSBldmVyeSBjYXJkIGhhcyBhbHNvIFNLX0cxNiBhIHNwZWNpZmllZCBJL08gUG9ydCByZWdpb24gYW5kCi0gKiBvbmx5IGEgZmV3IHBvc3NpYmxlIElSUSdzLgotICogSW4gdGhlIEluc3RhbGxhdGlvbiBHdWlkZSBmcm9tIFNjaG5laWRlciAmIEtvY2ggaXMgbGlzdGVkIGEgcG9zc2libGUKLSAqIEludGVycnVwdCBJUlEyLiBJUlEyIGlzIGFsd2F5cyBJUlE5IGluIGJvYXJkcyB3aXRoIHR3byBjYXNjYWRlZCBpbnRlcnJ1cHQKLSAqIGNvbnRyb2xsZXJzLiBTbyB3ZSB1c2UgaW4gU0tfSVJRUyBJUlE5LgotICovCi0KLS8qIERvbid0IHRvdWNoIGFueSBvZiB0aGUgZm9sbG93aW5nICNkZWZpbmVzLiAqLwotCi0jZGVmaW5lIFNLX0lPX1BPUlRTICAgICB7IDB4MTAwLCAweDE4MCwgMHgyMDgsIDB4MjIwLCAweDI4OCwgMHgzMjAsIDB4MzI4LCAweDM5MCwgMCB9Ci0KLS8qCi0gKiBTS19HMTYgUE9TIFJFR0lTVEVSUwotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqLwotCi0vKgotICogU0tfRzE2IGhhcyBhIFByb2dyYW1tYWJsZSBPcHRpb24gU2VsZWN0IChQT1MpIFJlZ2lzdGVyLgotICogVGhlIFBPUyBpcyBjb21wb3NlZCBvZiA4IHNlcGFyYXRlIHJlZ2lzdGVycyAoUE9TMC03KSB3aGljaAotICogYXJlIEkvTyBtYXBwZWQgb24gYW4gYWRkcmVzcyBzZXQgYnkgdGhlIFcxIHN3aXRjaC4KLSAqCi0gKi8KLQotI2RlZmluZSBTS19QT1NfU0laRSA4ICAgICAgICAgICAvKiA4IEkvTyBQb3J0cyBhcmUgdXNlZCBieSBTS19HMTYgKi8KLQotI2RlZmluZSBTS19QT1MwICAgICBpb2FkZHIgICAgICAvKiBDYXJkLUlEIExvdyAoUikgKi8KLSNkZWZpbmUgU0tfUE9TMSAgICAgaW9hZGRyKzEgICAgLyogQ2FyZC1JRCBIaWdoIChSKSAqLwotI2RlZmluZSBTS19QT1MyICAgICBpb2FkZHIrMiAgICAvKiBDYXJkLUVuYWJsZSwgQm9vdC1ST00gRGlzYWJsZSAoUlcpICovCi0jZGVmaW5lIFNLX1BPUzMgICAgIGlvYWRkciszICAgIC8qIEJhc2UgYWRkcmVzcyBvZiBSQU0gKi8KLSNkZWZpbmUgU0tfUE9TNCAgICAgaW9hZGRyKzQgICAgLyogSVJRICovCi0KLS8qIFBPUzUgLSBQT1M3IGFyZSB1bnVzZWQgKi8KLQotLyoKLSAqIFNLX0cxNiBNQUMgUFJFRklYCi0gKiAtLS0tLS0tLS0tLS0tLS0tLQotICovCi0KLS8qCi0gKiBTY2hlaWRlciAmIEtvY2ggbWFudWZhY3R1cmVyIGNvZGUgKDAwOjAwOmE1KS4KLSAqIFRoaXMgbXVzdCBiZSBjaGVja2VkLCB0aGF0IHdlIGFyZSBzdXJlIGl0IGlzIGEgU0sgY2FyZC4KLSAqLwotCi0jZGVmaW5lIFNLX01BQzAgICAgICAgICAweDAwCi0jZGVmaW5lIFNLX01BQzEgICAgICAgICAweDAwCi0jZGVmaW5lIFNLX01BQzIgICAgICAgICAweDVhCi0KLS8qCi0gKiBTS19HMTYgSUQKLSAqIC0tLS0tLS0tLQotICovCi0KLS8qCi0gKiBJZiBQT1MwLFBPUzEgY29udGFpbiB0aGUgZm9sbG93aW5nIElELCB0aGVuIHdlIGtub3cKLSAqIGF0IHdoaWNoIEkvTyBQb3J0IEFkZHJlc3Mgd2UgYXJlLgotICovCi0KLSNkZWZpbmUgU0tfSURMT1cgIDB4ZmQKLSNkZWZpbmUgU0tfSURISUdIIDB4NmEKLQotCi0vKgotICogTEFOQ0UgUE9TIEJpdCBkZWZpbml0aW9ucwotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICovCi0KLSNkZWZpbmUgU0tfUk9NX1JBTV9PTiAgKFBPUzJfQ0FSRCkKLSNkZWZpbmUgU0tfUk9NX1JBTV9PRkYgKFBPUzJfRVBST00pCi0jZGVmaW5lIFNLX1JPTV9PTiAgICAgIChpbmIoU0tfUE9TMikgJiBQT1MyX0NBUkQpCi0jZGVmaW5lIFNLX1JPTV9PRkYgICAgIChpbmIoU0tfUE9TMikgfCBQT1MyX0VQUk9NKQotI2RlZmluZSBTS19SQU1fT04gICAgICAoaW5iKFNLX1BPUzIpIHwgUE9TMl9DQVJEKQotI2RlZmluZSBTS19SQU1fT0ZGICAgICAoaW5iKFNLX1BPUzIpICYgUE9TMl9FUFJPTSkKLQotI2RlZmluZSBQT1MyX0NBUkQgIDB4MDAwMSAgICAgICAgICAgICAgLyogMSA9IFNLX0cxNiBvbiAgICAgIDAgPSBvZmYgKi8KLSNkZWZpbmUgUE9TMl9FUFJPTSAweDAwMDIgICAgICAgICAgICAgIC8qIDEgPSBCb290IEVQUk9NIG9mZiAwID0gb24gKi8KLQotLyoKLSAqIFNLX0cxNiBNZW1vcnkgbWFwcGVkIFJlZ2lzdGVycwotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKgotICovCi0KLSNkZWZpbmUgU0tfSU9SRUcgICAgICAgIChib2FyZC0+aW9yZWcpIC8qIExBTkNFIGRhdGEgcmVnaXN0ZXJzLiAgICAgKi8KLSNkZWZpbmUgU0tfUE9SVCAgICAgICAgIChib2FyZC0+cG9ydCkgIC8qIENvbnRyb2wsIFN0YXR1cyByZWdpc3RlciAgKi8KLSNkZWZpbmUgU0tfSU9DT00gICAgICAgIChib2FyZC0+aW9jb20pIC8qIEkvTyBDb21tYW5kICAgICAgICAgICAgICAgKi8KLQotLyoKLSAqIFNLX0cxNiBTdGF0dXMvQ29udHJvbCBSZWdpc3RlciBiaXRzCi0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICoKLSAqIChDKSBDb250cm9scmVnIChTKSBTdGF0dXNyZWcKLSAqLwotCi0vKgotICogUmVnaXN0ZXIgdHJhbnNmZXI6IDAgPSBubyB0cmFuc2ZlcgotICogICAgICAgICAgICAgICAgICAgIDEgPSB0cmFuc2ZlcnJpbmcgZGF0YSBiZXR3ZWVuIExBTkNFIGFuZCBJL08gcmVnCi0gKi8KLSNkZWZpbmUgU0tfSU9SVU4gICAgICAgIDB4MjAKLQotLyoKLSAqIExBTkNFIGludGVycnVwdDogMCA9IExBTkNFIGludGVycnVwdCBvY2N1cnJlZAotICogICAgICAgICAgICAgICAgICAxID0gbm8gTEFOQ0UgaW50ZXJydXB0IG9jY3VycmVkCi0gKi8KLSNkZWZpbmUgU0tfSVJRICAgICAgICAgIDB4MTAKLQotI2RlZmluZSBTS19SRVNFVCAgICAgICAgMHgwOCAgIC8qIFJlc2V0IFNLX0NBUkQ6IDAgPSBSRVNFVCAxID0gbm9ybWFsICovCi0jZGVmaW5lIFNLX1JXICAgICAgICAgICAweDAyICAgLyogMCA9IHdyaXRlIHRvIDEgPSByZWFkIGZyb20gKi8KLSNkZWZpbmUgU0tfQURSICAgICAgICAgIDB4MDEgICAvKiAwID0gUkVHIERhdGFQb3J0IDEgPSBSQVAgUmVnIGFkZHIgcG9ydCAqLwotCi0KLSNkZWZpbmUgU0tfUlJFRyAgICAgICAgIFNLX1JXICAvKiBUcmFuc2ZlcmRpcmVjdGlvbiB0byByZWFkIGZyb20gbGFuY2UgKi8KLSNkZWZpbmUgU0tfV1JFRyAgICAgICAgIDAgICAgICAvKiBUcmFuc2ZlcmRpcmVjdGlvbiB0byB3cml0ZSB0byBsYW5jZSAqLwotI2RlZmluZSBTS19SQVAgICAgICAgICAgU0tfQURSIC8qIERlc3RpbmF0aW9uIFJlZ2lzdGVyIFJBUCAqLwotI2RlZmluZSBTS19SREFUQSAgICAgICAgMCAgICAgIC8qIERlc3RpbmF0aW9uIFJlZ2lzdGVyIFJFRyBEYXRhUG9ydCAqLwotCi0vKgotICogU0tfRzE2IEkvTyBDb21tYW5kCi0gKiAtLS0tLS0tLS0tLS0tLS0tLS0KLSAqLwotCi0vKgotICogQW55IGJpdGNvbWJpbmF0aW9uIHNldHMgdGhlIGludGVybmFsIEkvTyBiaXQgKHRyYW5zZmVyIHdpbGwgc3RhcnQpCi0gKiB3aGVuIHdyaXR0ZW4gdG8gSS9PIENvbW1hbmQKLSAqLwotCi0jZGVmaW5lIFNLX0RPSU8gICAgICAgICAweDgwICAgLyogRG8gVHJhbnNmZXIgKi8KLQotLyoKLSAqIExBTkNFIFJBUCAoUmVnaXN0ZXIgQWRkcmVzcyBQb3J0KS4KLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICovCi0KLS8qCi0gKiBUaGUgTEFOQ0UgaW50ZXJuYWwgcmVnaXN0ZXJzIGFyZSBzZWxlY3RlZCB0aHJvdWdoIHRoZSBSQVAuCi0gKiBUaGUgUmVnaXN0ZXJzIGFyZToKLSAqCi0gKiBDU1IwIC0gU3RhdHVzIGFuZCBDb250cm9sIGZsYWdzCi0gKiBDU1IxIC0gTG93IG9yZGVyIGJpdHMgb2YgaW5pdGlhbGl6ZSBibG9jayAoYml0cyAxNTowMCkKLSAqIENTUjIgLSBIaWdoIG9yZGVyIGJpdHMgb2YgaW5pdGlhbGl6ZSBibG9jayAoYml0cyAwNzowMCwgMTU6MDggYXJlIHJlc2VydmVkKQotICogQ1NSMyAtIEFsbG93cyByZWRlZmluaXRpb24gb2YgdGhlIEJ1cyBNYXN0ZXIgSW50ZXJmYWNlLgotICogICAgICAgIFRoaXMgcmVnaXN0ZXIgbXVzdCBiZSBzZXQgdG8gMHgwMDAyLCB3aGljaCBtZWFucyBCU1dBUCA9IDAsCi0gKiAgICAgICAgQUNPTiA9IDEsIEJDT04gPSAwOwotICoKLSAqLwotCi0jZGVmaW5lIENTUjAgICAgICAgICAgICAweDAwCi0jZGVmaW5lIENTUjEgICAgICAgICAgICAweDAxCi0jZGVmaW5lIENTUjIgICAgICAgICAgICAweDAyCi0jZGVmaW5lIENTUjMgICAgICAgICAgICAweDAzCi0KLS8qCi0gKiBHZW5lcmFsIERlZmluaXRpb25zCi0gKiA9PT09PT09PT09PT09PT09PT09Ci0gKi8KLQotLyoKLSAqIFNldCB0aGUgbnVtYmVyIG9mIFR4IGFuZCBSeCBidWZmZXJzLCB1c2luZyBMb2dfMigjIGJ1ZmZlcnMpLgotICogV2UgaGF2ZSAxNktCIFJBTSB3aGljaCBjYW4gYmUgYWNjZXNzZWQgYnkgdGhlIExBTkNFLiBJbiB0aGUKLSAqIG1lbW9yeSBhcmUgbm90IG9ubHkgdGhlIGJ1ZmZlcnMgYnV0IGFsc28gdGhlIHJpbmcgZGVzY3JpcHRvcnMgYW5kCi0gKiB0aGUgaW5pdGlhbGl6ZSBibG9jay4KLSAqIERvbid0IGNoYW5nZSBhbnl0aGluZyB1bmxlc3MgeW91IHJlYWxseSBrbm93IHdoYXQgeW91IGRvLgotICovCi0KLSNkZWZpbmUgTENfTE9HX1RYX0JVRkZFUlMgMSAgICAgICAgICAgICAgIC8qICgyID09IDJeXjEpIDIgVHJhbnNtaXQgYnVmZmVycyAqLwotI2RlZmluZSBMQ19MT0dfUlhfQlVGRkVSUyAyICAgICAgICAgICAgICAgLyogKDggPT0gMl5eMykgOCBSZWNlaXZlIGJ1ZmZlcnMgKi8KLQotLyogRGVzY3JpcHRvciByaW5nIHNpemVzICovCi0KLSNkZWZpbmUgVE1ETlVNICgxIDw8IChMQ19MT0dfVFhfQlVGRkVSUykpIC8qIDIgVHJhbnNtaXQgZGVzY3JpcHRvciByaW5ncyAqLwotI2RlZmluZSBSTUROVU0gKDEgPDwgKExDX0xPR19SWF9CVUZGRVJTKSkgLyogOCBSZWNlaXZlIEJ1ZmZlcnMgKi8KLQotLyogRGVmaW5lIE1hc2sgZm9yIHNldHRpbmcgUk1ELCBUTUQgbGVuZ3RoIGluIHRoZSBMQU5DRSBpbml0X2Jsb2NrICovCi0KLSNkZWZpbmUgVE1ETlVNTUFTSyAoTENfTE9HX1RYX0JVRkZFUlMgPDwgMjkpCi0jZGVmaW5lIFJNRE5VTU1BU0sgKExDX0xPR19SWF9CVUZGRVJTIDw8IDI5KQotCi0vKgotICogRGF0YSBCdWZmZXIgc2l6ZSBpcyBzZXQgdG8gbWF4aW11bSBwYWNrZXQgbGVuZ3RoLgotICovCi0KLSNkZWZpbmUgUEtUX0JVRl9TWiAgICAgICAgICAgICAgMTUxOAotCi0vKgotICogVGhlIG51bWJlciBvZiBsb3cgSS9PIHBvcnRzIHVzZWQgYnkgdGhlIGV0aGVyY2FyZC4KLSAqLwotCi0jZGVmaW5lIEVUSEVSQ0FSRF9UT1RBTF9TSVpFICAgIFNLX1BPU19TSVpFCi0KLS8qCi0gKiBQb3J0cmVzZXJ2ZSBpcyB0aGVyZSB0byBtYXJrIHRoZSBDYXJkIEkvTyBQb3J0IHJlZ2lvbiBhcyB1c2VkLgotICogQ2hlY2tfcmVnaW9uIGlzIHRvIGNoZWNrIGlmIHRoZSByZWdpb24gYXQgaW9hZGRyIHdpdGggdGhlIHNpemUgInNpemUiCi0gKiBpcyBmcmVlIG9yIG5vdC4KLSAqIFNuYXJmX3JlZ2lvbiBhbGxvY2F0ZXMgdGhlIEkvTyBQb3J0IHJlZ2lvbi4KLSAqLwotCi0jaWZuZGVmCUhBVkVfUE9SVFJFU0VSVkUKLQotI2RlZmluZSBjaGVja19yZWdpb24oaW9hZGRyMSwgc2l6ZSkgICAgICAgICAgICAgIDAKLSNkZWZpbmUgcmVxdWVzdF9yZWdpb24oaW9hZGRyMSwgc2l6ZSxuYW1lKSAgICAgICBkbyA7IHdoaWxlICgwKQotCi0jZW5kaWYKLQotLyoKLSAqIFNLX0RFQlVHCi0gKgotICogSGVyZSB5b3UgY2FuIGNob29zZSB3aGF0IGxldmVsIG9mIGRlYnVnZ2luZyB3YW50ZWQuCi0gKgotICogSWYgU0tfREVCVUcgYW5kIFNLX0RFQlVHMiBhcmUgdW5kZWZpbmVkLCB0aGVuIG9ubHkgdGhlCi0gKiAgbmVjZXNzYXJ5IG1lc3NhZ2VzIHdpbGwgYmUgcHJpbnRlZC4KLSAqCi0gKiBJZiBTS19ERUJVRyBpcyBkZWZpbmVkLCB0aGVyZSB3aWxsIGJlIG1hbnkgZGVidWdnaW5nIHByaW50cwotICogIHdoaWNoIGNhbiBoZWxwIHRvIGZpbmQgc29tZSBtaXN0YWtlcyBpbiBjb25maWd1cmF0aW9uIG9yIGV2ZW4KLSAqICBpbiB0aGUgZHJpdmVyIGNvZGUuCi0gKgotICogSWYgU0tfREVCVUcyIGlzIGRlZmluZWQsIG1hbnkgbWFueSBtZXNzYWdlcyB3aWxsIGJlIHByaW50ZWQKLSAqICB3aGljaCBub3JtYWxseSB5b3UgZG9uJ3QgbmVlZC4gSSB1c2VkIHRoaXMgdG8gY2hlY2sgdGhlIGludGVycnVwdAotICogIHJvdXRpbmUuCi0gKgotICogKElmIHlvdSBkZWZpbmUgb25seSBTS19ERUJVRzIgdGhlbiBvbmx5IHRoZSBtZXNzYWdlcyBmb3IKLSAqICBjaGVja2luZyBpbnRlcnJ1cHRzIHdpbGwgYmUgcHJpbnRlZCEpCi0gKgotICogTm9ybWFsIHdheSBvZiBsaXZlIGlzOgotICoKLSAqIEZvciB0aGUgd2hvbGUgdGhpbmcgZ2V0IGdvaW5nIGxldCBib3RoIHN5bWJvbGljIGNvbnN0YW50cwotICogdW5kZWZpbmVkLiBJZiB5b3UgZmFjZSBhbnkgcHJvYmxlbXMgYW5kIHlvdSBrbm93IHdoYXQncyBnb2luZwotICogb24gKHlvdSBrbm93IHNvbWV0aGluZyBhYm91dCB0aGUgY2FyZCBhbmQgeW91IGNhbiBpbnRlcnByZXQgc29tZQotICogaGV4IExBTkNFIHJlZ2lzdGVyIG91dHB1dCkgdGhlbiBkZWZpbmUgU0tfREVCVUcKLSAqCi0gKi8KLQotI3VuZGVmICBTS19ERUJVRwkvKiBkZWJ1Z2dpbmcgKi8KLSN1bmRlZiAgU0tfREVCVUcyCS8qIGRlYnVnZ2luZyB3aXRoIG1vcmUgdmVyYm9zZSByZXBvcnQgKi8KLQotI2lmZGVmCVNLX0RFQlVHCi0jZGVmaW5lIFBSSU5URih4KSBwcmludGYgeAotI2Vsc2UKLSNkZWZpbmUgUFJJTlRGKHgpIC8qKi8KLSNlbmRpZgotCi0jaWZkZWYJU0tfREVCVUcyCi0jZGVmaW5lIFBSSU5URjIoeCkgcHJpbnRmIHgKLSNlbHNlCi0jZGVmaW5lIFBSSU5URjIoeCkgLyoqLwotI2VuZGlmCi0KLS8qCi0gKiBTS19HMTYgUkFNCi0gKgotICogVGhlIGNvbXBvbmVudHMgYXJlIG1lbW9yeSBtYXBwZWQgYW5kIGNhbiBiZSBzZXQgaW4gYSByZWdpb24gZnJvbQotICogMHgwMDAwMCB0aHJvdWdoIDB4ZmMwMDAgaW4gMTZLQiBzdGVwcy4KLSAqCi0gKiBUaGUgTmV0d29yayBjb21wb25lbnRzIGFyZTogZHVhbCBwb3J0ZWQgUkFNLCBQcm9tLCBJL08gUmVnLCBTdGF0dXMtLAotICogQ29udHJvbHJlZ2lzdGVyIGFuZCBJL08gQ29tbWFuZC4KLSAqCi0gKiBkdWFsIHBvcnRlZCBSQU06IFRoaXMgaXMgdGhlIG9ubHkgbWVtb3J5IHJlZ2lvbiB3aGljaCB0aGUgTEFOQ0UgY2hpcAotICogICAgICBoYXMgYWNjZXNzIHRvLiBGcm9tIHRoZSBMYW5jZSBpdCBpcyBhZGRyZXNzZWQgZnJvbSAweDAwMDAgdG8KLSAqICAgICAgMHgzZmJmLiBUaGUgaG9zdCBhY2Nlc3NlcyBpdCBub3JtYWxseS4KLSAqCi0gKiBQUk9NOiBUaGUgUFJPTSBvYnRhaW5zIHRoZSBFVEhFUk5FVC1NQUMtQWRkcmVzcy4gSXQgaXMgcmVhbGlzZWQgYXMgYQotICogICAgICAgOC1CaXQgUFJPTSwgdGhpcyBtZWFucyBvbmx5IHRoZSAxNiBldmVuIGFkZHJlc3NlcyBhcmUgdXNlZCBvZiB0aGUKLSAqICAgICAgIDMyIEJ5dGUgQWRkcmVzcyByZWdpb24uIEFjY2VzcyB0byBhIG9kZCBhZGRyZXNzIHJlc3VsdHMgaW4gaW52YWxpZAotICogICAgICAgZGF0YS4KLSAqCi0gKiBMQU5DRSBJL08gUmVnOiBUaGUgSS9PIFJlZyBpcyBidWlsZCBvZiA0IHNpbmdsZSBSZWdpc3RlcnMsIExvdy1CeXRlIFdyaXRlLAotICogICAgICAgSGktQnl0ZSBXcml0ZSwgTG93LUJ5dGUgUmVhZCwgSGktQnl0ZSBSZWFkLgotICogICAgICAgVHJhbnNmZXIgZnJvbSBvciB0byB0aGUgTEFOQ0UgaXMgYWx3YXlzIGluIDE2Qml0IHNvIExvdyBhbmQgSGlnaAotICogICAgICAgcmVnaXN0ZXJzIGFyZSBhbHdheXMgcmVsZXZhbnQuCi0gKgotICogICAgICAgVGhlIERhdGEgZnJvbSB0aGUgUmVhZHJlZ2lzdGVyIGlzIG5vdCB0aGUgZGF0YSBpbiB0aGUgV3JpdGVyZWdpc3RlciEhCi0gKgotICogUG9ydDogU3RhdHVzLSBhbmQgQ29udHJvbHJlZ2lzdGVyLgotICogICAgICAgVHdvIGRpZmZlcmVudCByZWdpc3RlcnMgd2hpY2ggc2hhcmUgdGhlIHNhbWUgYWRkcmVzcywgU3RhdHVzIGlzCi0gKiAgICAgICByZWFkLW9ubHksIENvbnRyb2wgaXMgd3JpdGUtb25seS4KLSAqCi0gKiBJL08gQ29tbWFuZDoKLSAqICAgICAgIEFueSBiaXRjb21iaW5hdGlvbiB3cml0dGVuIGluIGhlcmUgc3RhcnRzIHRoZSB0cmFuc21pc3Npb24gYmV0d2VlbgotICogICAgICAgSG9zdCBhbmQgTEFOQ0UuCi0gKi8KLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLQl1bnNpZ25lZCBjaGFyICByYW1bMHgzZmMwXTsgICAvKiAxNktCIGR1YWwgcG9ydGVkIHJhbSAqLwotCXVuc2lnbmVkIGNoYXIgIHJvbVsweDAwMjBdOyAgIC8qIDMyQnl0ZSBQUk9NIGNvbnRhaW5pbmcgNkJ5dGUgTUFDICovCi0JdW5zaWduZWQgY2hhciAgcmVzMVsweDAwMTBdOyAgLyogcmVzZXJ2ZWQgKi8KLQl1bnNpZ25lZCB2b2xhdGlsZSBzaG9ydCBpb3JlZzsvKiBMQU5DRSBJL08gUmVnaXN0ZXIgKi8KLQl1bnNpZ25lZCB2b2xhdGlsZSBjaGFyICBwb3J0OyAvKiBTdGF0dXNyZWdpc3RlciBhbmQgQ29udHJvbHJlZ2lzdGVyICovCi0JdW5zaWduZWQgY2hhciAgaW9jb207ICAgICAgICAgLyogSS9PIENvbW1hbmQgUmVnaXN0ZXIgKi8KLX0gU0tfUkFNOwotCi0vKiBzdHJ1Y3QgICovCi0KLS8qCi0gKiBUaGlzIGlzIHRoZSBzdHJ1Y3R1cmUgZm9yIHRoZSBkdWFsIHBvcnRlZCByYW0uIFdlCi0gKiBoYXZlIGV4YWN0bHkgMTYgMzIwIEJ5dGVzLiBJbiBoZXJlIHRoZXJlIG11c3QgYmU6Ci0gKgotICogICAgIC0gSW5pdGlhbGl6ZSBCbG9jayAgIChzdGFydGluZyBhdCBhIHdvcmQgYm91bmRhcnkpCi0gKiAgICAgLSBSZWNlaXZlIGFuZCBUcmFuc21pdCBEZXNjcmlwdG9yIFJpbmdzIChxdWFkd29yZCBib3VuZGFyeSkKLSAqICAgICAtIERhdGEgQnVmZmVycyAoYXJiaXRyYXJ5IGJvdW5kYXJ5KQotICoKLSAqIFRoaXMgaXMgYmVjYXVzZSBMQU5DRSBoYXMgb24gU0tfRzE2IG9ubHkgYWNjZXNzIHRvIHRoZSBkdWFsIHBvcnRlZAotICogUkFNIGFuZCBub3doZXJlIGVsc2UuCi0gKi8KLQotc3RydWN0IFNLX3JhbQotewotICAgIHN0cnVjdCBpbml0X2Jsb2NrIGliOwotICAgIHN0cnVjdCB0bWQgdG1kZVtUTUROVU1dOwotICAgIHN0cnVjdCBybWQgcm1kZVtSTUROVU1dOwotICAgIGNoYXIgdG1kYnVmW1RNRE5VTV1bUEtUX0JVRl9TWl07Ci0gICAgY2hhciBybWRidWZbUk1ETlVNXVtQS1RfQlVGX1NaXTsKLX07Ci0KLS8qCi0gKiBTdHJ1Y3R1cmUgd2hlcmUgYWxsIG5lY2Vzc2FyeSBpbmZvcm1hdGlvbiBpcyBmb3IgcmluZyBidWZmZXIKLSAqIG1hbmFnZW1lbnQgYW5kIHN0YXRpc3RpY3MuCi0gKi8KLQotc3RydWN0IHByaXYKLXsKLSAgICBzdHJ1Y3QgU0tfcmFtICpyYW07ICAvKiBkdWFsIHBvcnRlZCByYW0gc3RydWN0dXJlICovCi0gICAgc3RydWN0IHJtZCAqcm1kaGVhZDsgLyogc3RhcnQgb2YgcmVjZWl2ZSByaW5nIGRlc2NyaXB0b3JzICovCi0gICAgc3RydWN0IHRtZCAqdG1kaGVhZDsgLyogc3RhcnQgb2YgdHJhbnNtaXQgcmluZyBkZXNjcmlwdG9ycyAqLwotICAgIGludCAgICAgICAgcm1kbnVtOyAgIC8qIGFjdHVhbCB1c2VkIHJpbmcgZGVzY3JpcHRvciAqLwotICAgIGludCAgICAgICAgdG1kbnVtOyAgIC8qIGFjdHVhbCB0cmFuc21pdCBkZXNjcmlwdG9yIGZvciB0cmFuc21pdHRpbmcgZGF0YSAqLwotICAgIGludCAgICAgICAgdG1kbGFzdDsgIC8qIGxhc3Qgc2VudCBkZXNjcmlwdG9yIHVzZWQgZm9yIGVycm9yIGhhbmRsaW5nLCBldGMgKi8KLSAgICB2b2lkICAgICAgICpybWRidWZzW1JNRE5VTV07IC8qIHBvaW50ZXIgdG8gdGhlIHJlY2VpdmUgYnVmZmVycyAqLwotICAgIHZvaWQgICAgICAgKnRtZGJ1ZnNbVE1ETlVNXTsgLyogcG9pbnRlciB0byB0aGUgdHJhbnNtaXQgYnVmZmVycyAqLwotfTsKLQotLyogZ2xvYmFsIHZhcmlhYmxlIGRlY2xhcmF0aW9uICovCi0KLS8qIHN0YXRpYyB2YXJpYWJsZXMgKi8KLQotc3RhdGljIFNLX1JBTSAqYm9hcmQ7ICAvKiBwb2ludGVyIHRvIG91ciBtZW1vcnkgbWFwcGVkIGJvYXJkIGNvbXBvbmVudHMgKi8KLXN0YXRpYyB1bnNpZ25lZCBzaG9ydAlpb2FkZHI7IC8qIGJhc2UgaW8gYWRkcmVzcyAqLwotc3RhdGljIHN0cnVjdCBwcml2CXBfZGF0YTsKLQotLyogTWFjcm9zICovCi0KLQotLyogRnVuY3Rpb24gUHJvdG90eXBlcyAqLwotCi0vKgotICogRGV2aWNlIERyaXZlciBmdW5jdGlvbnMKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiBTZWUgZm9yIHNob3J0IGV4cGxhbmF0aW9uIG9mIGVhY2ggZnVuY3Rpb24gaXRzIGRlZmluaXRpb25zIGhlYWRlci4KLSAqLwotCi1zdGF0aWMgaW50ICAgU0tfcHJvYmUxKHN0cnVjdCBuaWMgKm5pYywgc2hvcnQgaW9hZGRyMSk7Ci0KLXN0YXRpYyB2b2lkIFNLX3Jlc2V0KHN0cnVjdCBuaWMgKm5pYyk7Ci1zdGF0aWMgaW50IFNLX3BvbGwoc3RydWN0IG5pYyAqbmljKTsKLXN0YXRpYyB2b2lkIFNLX3RyYW5zbWl0KAotc3RydWN0IG5pYyAqbmljLAotY29uc3QgY2hhciAqZCwJCQkvKiBEZXN0aW5hdGlvbiAqLwotdW5zaWduZWQgaW50IHQsCQkJLyogVHlwZSAqLwotdW5zaWduZWQgaW50IHMsCQkJLyogc2l6ZSAqLwotY29uc3QgY2hhciAqcCk7CQkJLyogUGFja2V0ICovCi1zdGF0aWMgdm9pZCBTS19kaXNhYmxlKHN0cnVjdCBuaWMgKm5pYyk7Ci1zdHJ1Y3QgbmljICpTS19wcm9iZShzdHJ1Y3QgbmljICpuaWMsIHVuc2lnbmVkIHNob3J0ICpwcm9iZV9hZGRycyk7Ci0KLS8qCi0gKiBMQU5DRSBGdW5jdGlvbnMKLSAqIC0tLS0tLS0tLS0tLS0tLQotICovCi0KLXN0YXRpYyBpbnQgU0tfbGFuY2VfaW5pdChzdHJ1Y3QgbmljICpuaWMsIHVuc2lnbmVkIHNob3J0IG1vZGUpOwotc3RhdGljIHZvaWQgU0tfcmVzZXRfYm9hcmQodm9pZCk7Ci1zdGF0aWMgdm9pZCBTS19zZXRfUkFQKGludCByZWdfbnVtYmVyKTsKLXN0YXRpYyBpbnQgU0tfcmVhZF9yZWcoaW50IHJlZ19udW1iZXIpOwotc3RhdGljIGludCBTS19ycmVhZF9yZWcodm9pZCk7Ci1zdGF0aWMgdm9pZCBTS193cml0ZV9yZWcoaW50IHJlZ19udW1iZXIsIGludCB2YWx1ZSk7Ci0KLS8qCi0gKiBEZWJ1Z2dpbmcgZnVuY3Rpb25zCi0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tCi0gKi8KLQotc3RhdGljIHZvaWQgU0tfcHJpbnRfcG9zKHN0cnVjdCBuaWMgKm5pYywgY2hhciAqdGV4dCk7Ci1zdGF0aWMgdm9pZCBTS19wcmludF9yYW0oc3RydWN0IG5pYyAqbmljKTsKLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFU0VUIC0gUmVzZXQgYWRhcHRlcgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgU0tfcmVzZXQoc3RydWN0IG5pYyAqbmljKQotewotCS8qIHB1dCB0aGUgY2FyZCBpbiBpdHMgaW5pdGlhbCBzdGF0ZSAqLwotCVNLX2xhbmNlX2luaXQobmljLCBNT0RFX05PUk1BTCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUE9MTCAtIFdhaXQgZm9yIGEgZnJhbWUKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBpbnQgU0tfcG9sbChzdHJ1Y3QgbmljICpuaWMpCi17Ci0JLyogcmV0dXJuIHRydWUgaWYgdGhlcmUncyBhbiBldGhlcm5ldCBwYWNrZXQgcmVhZHkgdG8gcmVhZCAqLwotCXN0cnVjdCBwcml2ICpwOyAgICAgICAgIC8qIFNLX0cxNiBwcml2YXRlIHN0cnVjdHVyZSAqLwotCXN0cnVjdCBybWQgKnJtZHA7Ci0JaW50IGNzcjAsIHJtZHN0YXQsIHBhY2tldF90aGVyZTsKLSAgICBQUklOVEYyKCgiIyMgJXM6IEF0IGJlZ2lubmluZyBvZiBTS19wb2xsKCkuIENTUjA6ICUjaFhcbiIsCi0gICAgICAgICAgIFNLX05BTUUsIFNLX3JlYWRfcmVnKENTUjApKSk7Ci0KLQlwID0gbmljLT5wcml2X2RhdGE7Ci0gICAgY3NyMCA9IFNLX3JlYWRfcmVnKENTUjApOyAgICAgIC8qIHN0b3JlIHJlZ2lzdGVyIGZvciBjaGVja2luZyAqLwotCi0gICAgLyoKLSAgICAgKiBBY2tub3dsZWRnZSBhbGwgb2YgdGhlIGN1cnJlbnQgaW50ZXJydXB0IHNvdXJjZXMsIGRpc2FibGUKLSAgICAgKiBJbnRlcnJ1cHRzIChJTkVBID0gMCkKLSAgICAgKi8KLQotICAgIFNLX3dyaXRlX3JlZyhDU1IwLCBjc3IwICYgQ1NSMF9DTFJBTEwpOwotCi0gICAgaWYgKGNzcjAgJiBDU1IwX0VSUikgLyogTEFOQ0UgRXJyb3IgKi8KLSAgICB7Ci0JcHJpbnRmKCIlczogZXJyb3I6ICUjaFgiLCBTS19OQU1FLCBjc3IwKTsKLQotICAgICAgICBpZiAoY3NyMCAmIENTUjBfTUlTUykgICAgICAvKiBObyBwbGFjZSB0byBzdG9yZSBwYWNrZXQgPyAqLwotICAgICAgICB7Ci0JCXByaW50ZigiLCBQYWNrZXQgZHJvcHBlZC4iKTsKLSAgICAgICAgfQotCXB1dGNoYXIoJ1xuJyk7Ci0gICAgfQotCi0gICAgcm1kcCA9IHAtPnJtZGhlYWQgKyBwLT5ybWRudW07Ci0gICAgcGFja2V0X3RoZXJlID0gMDsKLSAgICAvKiBBcyBsb25nIGFzIHdlIG93biB0aGUgbmV4dCBlbnRyeSwgY2hlY2sgc3RhdHVzIGFuZCBzZW5kCi0gICAgICogaXQgdXAgdG8gaGlnaGVyIGxheWVyCi0gICAgICovCi0KLSAgICB3aGlsZSAoISggKHJtZHN0YXQgPSBybWRwLT51LnMuc3RhdHVzKSAmIFJYX09XTikpCi0gICAgewotCS8qCi0gICAgICAgICAqIFN0YXJ0IGFuZCBlbmQgb2YgcGFja2V0IG11c3QgYmUgc2V0LCBiZWNhdXNlIHdlIHVzZQotCSAqIHRoZSBldGhlcm5ldCBtYXhpbXVtIHBhY2tldCBsZW5ndGggKDE1MTgpIGFzIGJ1ZmZlciBzaXplLgotCSAqCi0JICogQmVjYXVzZSBvdXIgYnVmZmVycyBhcmUgYXQgbWF4aW11bSBPRkxPIGFuZCBCVUZGIGVycm9ycyBhcmUKLQkgKiBub3QgdG8gYmUgY29uY2VybmVkIChzZWUgRGF0YSBzaGVldCkKLQkgKi8KLQotCWlmICgocm1kc3RhdCAmIChSWF9TVFAgfCBSWF9FTlApKSAhPSAoUlhfU1RQIHwgUlhfRU5QKSkKLQl7Ci0JICAgIC8qIFN0YXJ0IG9mIGEgZnJhbWUgPiAxNTE4IEJ5dGVzID8gKi8KLQotCSAgICBpZiAocm1kc3RhdCAmIFJYX1NUUCkKLQkgICAgewotCQlwcmludGYoIiVzOiBwYWNrZXQgdG9vIGxvbmdcbiIsIFNLX05BTUUpOwotCSAgICB9Ci0KLQkgICAgLyoKLSAgICAgICAgICAgICAqIEFsbCBvdGhlciBwYWNrZXRzIHdpbGwgYmUgaWdub3JlZCB1bnRpbCBhIG5ldyBmcmFtZSB3aXRoCi0JICAgICAqIHN0YXJ0IChSWF9TVFApIHNldCBmb2xsb3dzLgotCSAgICAgKgotCSAgICAgKiBXaGF0IHdlIGRvIGlzIGp1c3QgZ2l2ZSBkZXNjcmlwdG9yIGZyZWUgZm9yIG5ldyBpbmNvbWluZwotCSAgICAgKiBwYWNrZXRzLgotCSAgICAgKi8KLQotCSAgICBybWRwLT51LnMuc3RhdHVzID0gUlhfT1dOOyAgICAgIC8qIFJlbGlucXVpc2ggb3duZXJzaGlwIHRvIExBTkNFICovCi0KLQl9Ci0JZWxzZSBpZiAocm1kc3RhdCAmIFJYX0VSUikgICAgICAgICAgLyogUmVjZWl2ZSBFcnJvciA/ICovCi0JewotCSAgICBwcmludGYoIiVzOiBSWCBlcnJvcjogJSNoWFxuIiwgU0tfTkFNRSwgKGludCkgcm1kc3RhdCk7Ci0JICAgIHJtZHAtPnUucy5zdGF0dXMgPSBSWF9PV047ICAgICAgLyogUmVsaW5xdWlzaCBvd25lcnNoaXAgdG8gTEFOQ0UgKi8KLQl9Ci0JZWxzZSAvKiBXZSBoYXZlIGEgcGFja2V0IHdoaWNoIGNhbiBiZSBxdWV1ZWQgZm9yIHRoZSB1cHBlciBsYXllcnMgKi8KLQl7Ci0KLQkgICAgaW50IGxlbiA9IChybWRwLT5tbGVuICYgMHgwZmZmKTsgIC8qIGV4dHJhY3QgbWVzc2FnZSBsZW5ndGggZnJvbSByZWNlaXZlIGJ1ZmZlciAqLwotCi0JICAgIC8qCi0gICAgICAgICAgICAgKiBDb3B5IGRhdGEgb3V0IG9mIG91ciByZWNlaXZlIGRlc2NyaXB0b3IgaW50byBuaWMtPnBhY2tldC4KLQkgICAgICoKLQkgICAgICogKHJtZHAtPnUuYnVmZmVyICYgMHgwMGZmZmZmZikgLT4gZ2V0IGFkZHJlc3Mgb2YgYnVmZmVyIGFuZAotCSAgICAgKiBpZ25vcmUgc3RhdHVzIGZpZWxkcykKLQkgICAgICovCi0KLQkgICAgbWVtY3B5KG5pYy0+cGFja2V0LCAodW5zaWduZWQgY2hhciAqKSAocm1kcC0+dS5idWZmZXIgJiAweDAwZmZmZmZmKSwgbmljLT5wYWNrZXRsZW4gPSBsZW4pOwotCSAgICBwYWNrZXRfdGhlcmUgPSAxOwotCi0KLQkgICAgLyoKLSAgICAgICAgICAgICAqIFBhY2tldCBpcyBxdWV1ZWQgYW5kIG1hcmtlZCBmb3IgcHJvY2Vzc2luZyBzbyB3ZQotCSAgICAgKiBmcmVlIG91ciBkZXNjcmlwdG9yCi0JICAgICAqLwotCi0JICAgIHJtZHAtPnUucy5zdGF0dXMgPSBSWF9PV047Ci0KLQkgICAgcC0+cm1kbnVtKys7Ci0JICAgIHAtPnJtZG51bSAlPSBSTUROVU07Ci0KLQkgICAgcm1kcCA9IHAtPnJtZGhlYWQgKyBwLT5ybWRudW07Ci0JfQotICAgIH0KLSAgICBTS193cml0ZV9yZWcoQ1NSMCwgQ1NSMF9JTkVBKTsgLyogRW5hYmxlIEludGVycnVwdHMgKi8KLQlyZXR1cm4gKHBhY2tldF90aGVyZSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotVFJBTlNNSVQgLSBUcmFuc21pdCBhIGZyYW1lCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBTS190cmFuc21pdCgKLXN0cnVjdCBuaWMgKm5pYywKLWNvbnN0IGNoYXIgKmQsCQkJLyogRGVzdGluYXRpb24gKi8KLXVuc2lnbmVkIGludCB0LAkJCS8qIFR5cGUgKi8KLXVuc2lnbmVkIGludCBzLAkJCS8qIHNpemUgKi8KLWNvbnN0IGNoYXIgKnBhY2spCQkvKiBQYWNrZXQgKi8KLXsKLQkvKiBzZW5kIHRoZSBwYWNrZXQgdG8gZGVzdGluYXRpb24gKi8KLSAgICBzdHJ1Y3QgcHJpdiAqcDsgICAgICAgICAvKiBTS19HMTYgcHJpdmF0ZSBzdHJ1Y3R1cmUgKi8KLSAgICBzdHJ1Y3QgdG1kICp0bWRwOwotICAgIHNob3J0IGxlbjsKLSAgICBpbnQgY3NyMCwgaSwgdG1kc3RhdDsKLQotICAgIFBSSU5URjIoKCIjIyAlczogQXQgYmVnaW5uaW5nIG9mIFNLX3RyYW5zbWl0KCkuIENTUjA6ICUjaFhcbiIsCi0gICAgICAgICAgIFNLX05BTUUsIFNLX3JlYWRfcmVnKENTUjApKSk7Ci0JcCA9IG5pYy0+cHJpdl9kYXRhOwotCXRtZHAgPSBwLT50bWRoZWFkICsgcC0+dG1kbnVtOyAvKiBXaGljaCBkZXNjcmlwdG9yIGZvciB0cmFuc21pdHRpbmcgKi8KLQotCS8qIENvcHkgZGF0YSBpbnRvIGR1YWwgcG9ydGVkIHJhbSAqLwotCi0JbWVtY3B5KCZwLT5yYW0tPnRtZGJ1ZltwLT50bWRudW1dWzBdLCBkLCBFVEhfQUxFTik7CS8qIGRzdCAqLwotCW1lbWNweSgmcC0+cmFtLT50bWRidWZbcC0+dG1kbnVtXVtFVEhfQUxFTl0sIG5pYy0+bm9kZV9hZGRyLCBFVEhfQUxFTik7IC8qIHNyYyAqLwotCXAtPnJhbS0+dG1kYnVmW3AtPnRtZG51bV1bRVRIX0FMRU4gKyBFVEhfQUxFTl0gPSB0ID4+IDg7CS8qIHR5cGUgKi8KLQlwLT5yYW0tPnRtZGJ1ZltwLT50bWRudW1dW0VUSF9BTEVOICsgRVRIX0FMRU4gKyAxXSA9IHQ7CS8qIHR5cGUgKi8KLQltZW1jcHkoJnAtPnJhbS0+dG1kYnVmW3AtPnRtZG51bV1bRVRIX0hMRU5dLCBwYWNrLCBzKTsKLQlzICs9IEVUSF9ITEVOOwotCXdoaWxlIChzIDwgRVRIX1pMRU4pCS8qIHBhZCB0byBtaW4gbGVuZ3RoICovCi0JCXAtPnJhbS0+dG1kYnVmW3AtPnRtZG51bV1bcysrXSA9IDA7Ci0JcC0+cmFtLT50bWRlW3AtPnRtZG51bV0uc3RhdHVzMiA9IDB4MDsKLQotCS8qIEV2YWx1YXRlIFBhY2tldCBsZW5ndGggKi8KLQlsZW4gPSBFVEhfWkxFTiA8IHMgPyBzIDogRVRIX1pMRU47Ci0KLQkvKiBGaWxsIGluIFRyYW5zbWl0IE1lc3NhZ2UgRGVzY3JpcHRvciAqLwotCi0JdG1kcC0+YmxlbiA9IC1sZW47ICAgICAgICAgICAgLyogc2V0IGxlbmd0aCB0byB0cmFuc21pdCAqLwotCi0JLyoKLQkgKiBQYWNrZXQgc3RhcnQgYW5kIGVuZCBpcyBhbHdheXMgc2V0IGJlY2F1c2Ugd2UgdXNlIHRoZSBtYXhpbXVtCi0JICogcGFja2V0IGxlbmd0aCBhcyBidWZmZXIgbGVuZ3RoLgotCSAqIFJlbGlucXVpc2ggb3duZXJzaGlwIHRvIExBTkNFCi0JICovCi0KLQl0bWRwLT51LnMuc3RhdHVzID0gVFhfT1dOIHwgVFhfU1RQIHwgVFhfRU5QOwotCi0JLyogU3RhcnQgRGVtYW5kIFRyYW5zbWlzc2lvbiAqLwotCVNLX3dyaXRlX3JlZyhDU1IwLCBDU1IwX1RETUQgfCBDU1IwX0lORUEpOwotCi0gICAgY3NyMCA9IFNLX3JlYWRfcmVnKENTUjApOyAgICAgIC8qIHN0b3JlIHJlZ2lzdGVyIGZvciBjaGVja2luZyAqLwotCi0gICAgLyoKLSAgICAgKiBBY2tub3dsZWRnZSBhbGwgb2YgdGhlIGN1cnJlbnQgaW50ZXJydXB0IHNvdXJjZXMsIGRpc2FibGUKLSAgICAgKiBJbnRlcnJ1cHRzIChJTkVBID0gMCkKLSAgICAgKi8KLQotICAgIFNLX3dyaXRlX3JlZyhDU1IwLCBjc3IwICYgQ1NSMF9DTFJBTEwpOwotCi0gICAgaWYgKGNzcjAgJiBDU1IwX0VSUikgLyogTEFOQ0UgRXJyb3IgKi8KLSAgICB7Ci0JcHJpbnRmKCIlczogZXJyb3I6ICUjaFgiLCBTS19OQU1FLCBjc3IwKTsKLQotICAgICAgICBpZiAoY3NyMCAmIENTUjBfTUlTUykgICAgICAvKiBObyBwbGFjZSB0byBzdG9yZSBwYWNrZXQgPyAqLwotICAgICAgICB7Ci0JCXByaW50ZigiLCBQYWNrZXQgZHJvcHBlZC4iKTsKLSAgICAgICAgfQotCXB1dGNoYXIoJ1xuJyk7Ci0gICAgfQotCi0KLSAgICAvKiBTZXQgbmV4dCBidWZmZXIgKi8KLSAgICBwLT50bWRsYXN0Kys7Ci0gICAgcC0+dG1kbGFzdCAmPSBUTUROVU0tMTsKLQotICAgIHRtZHN0YXQgPSB0bWRwLT51LnMuc3RhdHVzICYgMHhmZjAwOyAvKiBmaWx0ZXIgb3V0IHN0YXR1cyBiaXRzIDE1OjA4ICovCi0KLSAgICAvKgotICAgICAqIFdlIGNoZWNrIHN0YXR1cyBvZiB0cmFuc21pdHRlZCBwYWNrZXQuCi0gICAgICogc2VlIExBTkNFIGRhdGEtc2hlZXQgZm9yIGVycm9yIGV4cGxhbmF0aW9uCi0gICAgICovCi0gICAgaWYgKHRtZHN0YXQgJiBUWF9FUlIpIC8qIEVycm9yIG9jY3VycmVkICovCi0gICAgewotCXByaW50ZigiJXM6IFRYIGVycm9yOiAlI2hYICUjaFhcbiIsIFNLX05BTUUsIChpbnQpIHRtZHN0YXQsCi0JCShpbnQpIHRtZHAtPnN0YXR1czIpOwotCi0JaWYgKHRtZHAtPnN0YXR1czIgJiBUWF9URFIpICAgIC8qIFREUiBwcm9ibGVtcz8gKi8KLQl7Ci0JICAgIHByaW50ZigiJXM6IHRkci1wcm9ibGVtcyBcbiIsIFNLX05BTUUpOwotCX0KLQotICAgICAgICBpZiAodG1kcC0+c3RhdHVzMiAmIFRYX1VGTE8pICAgLyogVW5kZXJmbG93IGVycm9yID8gKi8KLSAgICAgICAgewotICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAqIElmIFVGTE8gZXJyb3Igb2NjdXJzIGl0IHdpbGwgdHVybiB0cmFuc21pdHRlciBvZi4KLSAgICAgICAgICAgICAqIFNvIHdlIG11c3QgcmVpbml0IExBTkNFCi0gICAgICAgICAgICAgKi8KLQotICAgICAgICAgICAgU0tfbGFuY2VfaW5pdChuaWMsIE1PREVfTk9STUFMKTsKLSAgICAgICAgfQotCi0JdG1kcC0+c3RhdHVzMiA9IDA7ICAgICAgICAgICAgIC8qIENsZWFyIGVycm9yIGZsYWdzICovCi0gICAgfQotCi0gICAgU0tfd3JpdGVfcmVnKENTUjAsIENTUjBfSU5FQSk7IC8qIEVuYWJsZSBJbnRlcnJ1cHRzICovCi0KLQkvKiBTZXQgcG9pbnRlciB0byBuZXh0IHRyYW5zbWl0IGJ1ZmZlciAqLwotCXAtPnRtZG51bSsrOwotCXAtPnRtZG51bSAmPSBUTUROVU0tMTsKLQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLURJU0FCTEUgLSBUdXJuIG9mZiBldGhlcm5ldCBpbnRlcmZhY2UKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIFNLX2Rpc2FibGUoc3RydWN0IG5pYyAqbmljKQotewotICAgIFBSSU5URigoIiMjICVzOiBBdCBiZWdpbm5pbmcgb2YgU0tfZGlzYWJsZSgpLiBDU1IwOiAlI2hYXG4iLAotICAgICAgICAgICBTS19OQU1FLCBTS19yZWFkX3JlZyhDU1IwKSkpOwotICAgIFBSSU5URigoIiVzOiBTaHV0dGluZyAlcyBkb3duIENTUjAgJSNoWFxuIiwgU0tfTkFNRSwgU0tfTkFNRSwKLSAgICAgICAgICAgKGludCkgU0tfcmVhZF9yZWcoQ1NSMCkpKTsKLQotICAgIFNLX3dyaXRlX3JlZyhDU1IwLCBDU1IwX1NUT1ApOyAvKiBTVE9QIHRoZSBMQU5DRSAqLwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVBST0JFIC0gTG9vayBmb3IgYW4gYWRhcHRlciwgdGhpcyByb3V0aW5lJ3MgdmlzaWJsZSB0byB0aGUgb3V0c2lkZQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RydWN0IG5pYyAqU0tfcHJvYmUoc3RydWN0IG5pYyAqbmljLCB1bnNpZ25lZCBzaG9ydCAqcHJvYmVfYWRkcnMpCi17Ci0JdW5zaWduZWQgc2hvcnQJCSpwOwotCXN0YXRpYyB1bnNpZ25lZCBzaG9ydAlpb19hZGRyc1tdID0gU0tfSU9fUE9SVFM7Ci0JLyogaWYgcHJvYmVfYWRkcnMgaXMgMCwgdGhlbiByb3V0aW5lIGNhbiB1c2UgYSBoYXJkd2lyZWQgZGVmYXVsdCAqLwotCXB1dGNoYXIoJ1xuJyk7Ci0JbmljLT5wcml2X2RhdGEgPSAmcF9kYXRhOwotCWlmIChwcm9iZV9hZGRycyA9PSAwKQotCQlwcm9iZV9hZGRycyA9IGlvX2FkZHJzOwotCWZvciAocCA9IHByb2JlX2FkZHJzOyAoaW9hZGRyID0gKnApICE9IDA7ICsrcCkKLQl7Ci0JCWxvbmcJCW9mZnNldDEsIG9mZnNldDAgPSBpbmIoaW9hZGRyKTsKLQkJaWYgKChvZmZzZXQwID09IFNLX0lETE9XKSAmJgotCQkgKChvZmZzZXQxID0gaW5iKGlvYWRkciArIDEpKSA9PSBTS19JREhJR0gpKQotCQkJaWYgKFNLX3Byb2JlMShuaWMsIGlvYWRkcikgPj0gMCkKLQkJCQlicmVhazsKLQl9Ci0JLyogaWYgYm9hcmQgZm91bmQgKi8KLQlpZiAoaW9hZGRyICE9IDApCi0JewotCQkvKiBwb2ludCB0byBOSUMgc3BlY2lmaWMgcm91dGluZXMgKi8KLQkJbmljLT5yZXNldCA9IFNLX3Jlc2V0OwotCQluaWMtPnBvbGwgPSBTS19wb2xsOwotCQluaWMtPnRyYW5zbWl0ID0gU0tfdHJhbnNtaXQ7Ci0JCW5pYy0+ZGlzYWJsZSA9IFNLX2Rpc2FibGU7Ci0JCXJldHVybiBuaWM7Ci0JfQotCS8qIGVsc2UgKi8KLQl7Ci0JCXJldHVybiAwOwotCX0KLX0KLQotaW50IFNLX3Byb2JlMShzdHJ1Y3QgbmljICpuaWMsIHNob3J0IGlvYWRkcjEpCi17Ci0gICAgaW50IGksajsgICAgICAgICAgICAgICAgLyogQ291bnRlcnMgKi8KLSAgICBpbnQgc2tfYWRkcl9mbGFnID0gMDsgICAvKiBTSyBBRERSIGNvcnJlY3Q/IDEgLSBubywgMCAtIHllcyAqLwotICAgIHVuc2lnbmVkIGludCByb21fYWRkcjsgIC8qIHVzZWQgdG8gc3RvcmUgUkFNIGFkZHJlc3MgdXNlZCBmb3IgUE9TX0FERFIgKi8KLQotICAgIHN0cnVjdCBwcml2ICpwOyAgICAgICAgIC8qIFNLX0cxNiBwcml2YXRlIHN0cnVjdHVyZSAqLwotCi0gICAgaWYgKFNLX0FERFIgJiAweDNmZmYgfHwgU0tfQUREUiA8IDB4YTAwMDApCi0gICAgewotICAgICAgIC8qCi0gICAgICAgICogTm93IGhlcmUgd2UgY291bGQgdXNlIGEgcm91dGluZSB3aGljaCBzZWFyY2hlcyBmb3IgYSBmcmVlCi0gICAgICAgICogcGxhY2UgaW4gdGhlIHJhbSBhbmQgc2V0IFNLX0FERFIgaWYgZm91bmQuIFRPRE8uCi0gICAgICAgICovCi0gICAgICAgICAgICBwcmludGYoIiVzOiBTS19BRERSICUjaFggaXMgbm90IHZhbGlkLiBDaGVjayBjb25maWd1cmF0aW9uLlxuIiwKLSAgICAgICAgICAgICAgICAgICAgU0tfTkFNRSwgU0tfQUREUik7Ci0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gICAgcm9tX2FkZHIgPSBTS19BRERSOwotCi0gICAgb3V0YihTS19ST01fUkFNX09GRiwgU0tfUE9TMik7IC8qIEJvb3RfUk9NICsgUkFNIG9mZiAqLwotICAgIG91dGIoUE9TX0FERFIsIFNLX1BPUzMpOyAgICAgICAvKiBTZXQgUkFNIGFkZHJlc3MgKi8KLSAgICBvdXRiKFNLX1JPTV9SQU1fT04sIFNLX1BPUzIpOyAgLyogUkFNIG9uLCBCT09UX1JPTSBvbiAqLwotI2lmZGVmCVNLX0RFQlVHCi0gICAgU0tfcHJpbnRfcG9zKG5pYywgIlBPUyByZWdpc3RlcnMgYWZ0ZXIgUk9NLCBSQU0gY29uZmlnIik7Ci0jZW5kaWYKLQotICAgIGJvYXJkID0gKFNLX1JBTSAqKSByb21fYWRkcjsKLQlQUklOVEYoKCJhZHJbMF06ICVoWCwgYWRyWzFdOiAlaFgsIGFkclsyXTogJWhYXG4iLAotCWJvYXJkLT5yb21bMF0sIGJvYXJkLT5yb21bMl0sIGJvYXJkLT5yb21bNF0pKTsKLQotICAgIC8qIFJlYWQgaW4gc3RhdGlvbiBhZGRyZXNzICovCi0gICAgZm9yIChpID0gMCwgaiA9IDA7IGkgPCBFVEhfQUxFTjsgaSsrLCBqKz0yKQotICAgIHsKLQkqKG5pYy0+bm9kZV9hZGRyK2kpID0gYm9hcmQtPnJvbVtqXTsKLSAgICB9Ci0KLSAgICAvKiBDaGVjayBmb3IgbWFudWZhY3R1cmVyIGNvZGUgKi8KLSNpZmRlZglTS19ERUJVRwotICAgIGlmICghKCoobmljLT5ub2RlX2FkZHIrMCkgPT0gU0tfTUFDMCAmJgotCSAgKihuaWMtPm5vZGVfYWRkcisxKSA9PSBTS19NQUMxICYmCi0JICAqKG5pYy0+bm9kZV9hZGRyKzIpID09IFNLX01BQzIpICkKLSAgICB7Ci0gICAgICAgIFBSSU5URigoIiMjICVzOiBXZSBkaWQgbm90IGZpbmQgU0tfRzE2IGF0IFJBTSBsb2NhdGlvbi5cbiIsCi0gICAgICAgICAgICAgICAgU0tfTkFNRSkpOwotCXJldHVybiAtMTsgICAgICAgICAgICAgICAgICAgICAvKiBOTyBTS19HMTYgZm91bmQgKi8KLSAgICB9Ci0jZW5kaWYKLQotICAgIHAgPSBuaWMtPnByaXZfZGF0YTsKLQotICAgIC8qIEluaXRpYWxpemUgcHJpdmF0ZSBzdHJ1Y3R1cmUgKi8KLQotICAgIHAtPnJhbSA9IChzdHJ1Y3QgU0tfcmFtICopIHJvbV9hZGRyOyAvKiBTZXQgZHVhbCBwb3J0ZWQgUkFNIGFkZHIgKi8KLSAgICBwLT50bWRoZWFkID0gJihwLT5yYW0pLT50bWRlWzBdOyAgICAgLyogU2V0IFRNRCBoZWFkICovCi0gICAgcC0+cm1kaGVhZCA9ICYocC0+cmFtKS0+cm1kZVswXTsgICAgIC8qIFNldCBSTUQgaGVhZCAqLwotCi0gICAgcHJpbnRmKCJTY2huZWlkZXIgJiBLb2NoIEcxNiBhdCAlI2hYLCBtZW0gYXQgJSNoWCwgSFcgYWRkcjogJSFcbiIsCi0JICAgICh1bnNpZ25lZCBpbnQpIGlvYWRkciwgKHVuc2lnbmVkIGludCkgcC0+cmFtLCBuaWMtPm5vZGVfYWRkcik7Ci0KLSAgICAvKiBJbml0aWFsaXplIGJ1ZmZlciBwb2ludGVycyAqLwotCi0gICAgZm9yIChpID0gMDsgaSA8IFRNRE5VTTsgaSsrKQotICAgIHsKLQlwLT50bWRidWZzW2ldID0gcC0+cmFtLT50bWRidWZbaV07Ci0gICAgfQotCi0gICAgZm9yIChpID0gMDsgaSA8IFJNRE5VTTsgaSsrKQotICAgIHsKLQlwLT5ybWRidWZzW2ldID0gcC0+cmFtLT5ybWRidWZbaV07Ci0gICAgfQotICAgIGkgPSAwOwotCi0gICAgaWYgKCEoaSA9IFNLX2xhbmNlX2luaXQobmljLCBNT0RFX05PUk1BTCkpKSAgLyogTEFOQ0UgaW5pdCBPSz8gKi8KLSAgICB7Ci0KLSNpZmRlZglTS19ERUJVRwotICAgICAgICAvKgotICAgICAgICAgKiBUaGlzIGRlYnVnIGJsb2NrIHRyaWVzIHRvIHN0b3AgTEFOQ0UsCi0gICAgICAgICAqIHJlaW5pdCBMQU5DRSB3aXRoIHRyYW5zbWl0dGVyIGFuZCByZWNlaXZlciBkaXNhYmxlZCwKLSAgICAgICAgICogdGhlbiBzdG9wIGFnYWluIGFuZCByZWluaXQgd2l0aCBOT1JNQUxfTU9ERQotICAgICAgICAgKi8KLQotICAgICAgICBwcmludGYoIiMjICVzOiBBZnRlciBsYW5jZSBpbml0LiBDU1IwOiAlI2hYXG4iLAotICAgICAgICAgICAgICAgU0tfTkFNRSwgU0tfcmVhZF9yZWcoQ1NSMCkpOwotICAgICAgICBTS193cml0ZV9yZWcoQ1NSMCwgQ1NSMF9TVE9QKTsKLSAgICAgICAgcHJpbnRmKCIjIyAlczogTEFOQ0Ugc3RvcHBlZC4gQ1NSMDogJSNoWFxuIiwKLSAgICAgICAgICAgICAgIFNLX05BTUUsIFNLX3JlYWRfcmVnKENTUjApKTsKLSAgICAgICAgU0tfbGFuY2VfaW5pdChuaWMsIE1PREVfRFRYIHwgTU9ERV9EUlgpOwotICAgICAgICBwcmludGYoIiMjICVzOiBSZWluaXQgd2l0aCBEVFggKyBEUlggb2ZmLiBDU1IwOiAlI2hYXG4iLAotICAgICAgICAgICAgICAgU0tfTkFNRSwgU0tfcmVhZF9yZWcoQ1NSMCkpOwotICAgICAgICBTS193cml0ZV9yZWcoQ1NSMCwgQ1NSMF9TVE9QKTsKLSAgICAgICAgcHJpbnRmKCIjIyAlczogTEFOQ0Ugc3RvcHBlZC4gQ1NSMDogJSNoWFxuIiwKLSAgICAgICAgICAgICAgIFNLX05BTUUsIFNLX3JlYWRfcmVnKENTUjApKTsKLSAgICAgICAgU0tfbGFuY2VfaW5pdChuaWMsIE1PREVfTk9STUFMKTsKLSAgICAgICAgcHJpbnRmKCIjIyAlczogTEFOQ0UgYmFjayB0byBub3JtYWwgbW9kZS4gQ1NSMDogJSNoWFxuIiwKLSAgICAgICAgICAgICAgIFNLX05BTUUsIFNLX3JlYWRfcmVnKENTUjApKTsKLSAgICAgICAgU0tfcHJpbnRfcG9zKG5pYywgIlBPUyByZWdzIGJlZm9yZSByZXR1cm5pbmcgT0siKTsKLQotI2VuZGlmCS8qIFNLX0RFQlVHICovCi0KLSAgICB9Ci0gICAgZWxzZSAvKiBMQU5DRSBpbml0IGZhaWxlZCAqLwotICAgIHsKLQotCVBSSU5URigoIiMjICVzOiBMQU5DRSBpbml0IGZhaWxlZDogQ1NSMDogJSNoWFxuIiwKLSAgICAgICAgICAgICAgIFNLX05BTUUsIFNLX3JlYWRfcmVnKENTUjApKSk7Ci0JcmV0dXJuIC0xOwotICAgIH0KLQotI2lmZGVmCVNLX0RFQlVHCi0gICAgU0tfcHJpbnRfcG9zKG5pYywgIkVuZCBvZiBTS19wcm9iZTEiKTsKLSAgICBTS19wcmludF9yYW0obmljKTsKLSNlbmRpZgotCi0gICAgcmV0dXJuIDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEluaXRpYWxpemF0aW9uIGRvbmUgKi8KLQotfSAvKiBFbmQgb2YgU0tfcHJvYmUxKCkgKi8KLQotc3RhdGljIGludCBTS19sYW5jZV9pbml0KHN0cnVjdCBuaWMgKm5pYywgdW5zaWduZWQgc2hvcnQgbW9kZSkKLXsKLSAgICBpbnQgaTsKLSAgICBzdHJ1Y3QgcHJpdiAqcCA9IChzdHJ1Y3QgcHJpdiAqKSBuaWMtPnByaXZfZGF0YTsKLSAgICBzdHJ1Y3QgdG1kICAqdG1kcDsKLSAgICBzdHJ1Y3Qgcm1kICAqcm1kcDsKLQotICAgIFBSSU5URigoIiMjICVzOiBBdCBiZWdpbm5pbmcgb2YgTEFOQ0UgaW5pdC4gQ1NSMDogJSNoWFxuIiwKLSAgICAgICAgICAgU0tfTkFNRSwgU0tfcmVhZF9yZWcoQ1NSMCkpKTsKLQotICAgIC8qIFJlc2V0IExBTkNFICovCi0gICAgU0tfcmVzZXRfYm9hcmQoKTsKLQotICAgIC8qIEluaXRpYWxpemUgVE1EJ3Mgd2l0aCBzdGFydCB2YWx1ZXMgKi8KLSAgICBwLT50bWRudW0gPSAwOyAgICAgICAgICAgICAgICAgICAvKiBGaXJzdCBkZXNjcmlwdG9yIGZvciB0cmFuc21pdHRpbmcgKi8KLSAgICBwLT50bWRsYXN0ID0gMDsgICAgICAgICAgICAgICAgICAvKiBGaXJzdCBkZXNjcmlwdG9yIGZvciByZWFkaW5nIHN0YXRzICovCi0KLSAgICBmb3IgKGkgPSAwOyBpIDwgVE1ETlVNOyBpKyspICAgICAvKiBJbml0IGFsbCBUTUQncyAqLwotICAgIHsKLQl0bWRwID0gcC0+dG1kaGVhZCArIGk7Ci0KLQl0bWRwLT51LmJ1ZmZlciA9ICh1bnNpZ25lZCBsb25nKSBwLT50bWRidWZzW2ldOyAvKiBhc3NpZ24gYnVmZmVyICovCi0KLQkvKiBNYXJrIFRNRCBhcyBzdGFydCBhbmQgZW5kIG9mIHBhY2tldCAqLwotCXRtZHAtPnUucy5zdGF0dXMgPSBUWF9TVFAgfCBUWF9FTlA7Ci0gICAgfQotCi0KLSAgICAvKiBJbml0aWFsaXplIFJNRCdzIHdpdGggc3RhcnQgdmFsdWVzICovCi0KLSAgICBwLT5ybWRudW0gPSAwOyAgICAgICAgICAgICAgICAgICAvKiBGaXJzdCBSTUQgd2hpY2ggd2lsbCBiZSB1c2VkICovCi0KLSAgICBmb3IgKGkgPSAwOyBpIDwgUk1ETlVNOyBpKyspICAgICAvKiBJbml0IGFsbCBSTUQncyAqLwotICAgIHsKLQlybWRwID0gcC0+cm1kaGVhZCArIGk7Ci0KLQotCXJtZHAtPnUuYnVmZmVyID0gKHVuc2lnbmVkIGxvbmcpIHAtPnJtZGJ1ZnNbaV07IC8qIGFzc2lnbiBidWZmZXIgKi8KLQotCS8qCi0gICAgICAgICAqIExBTkNFIG11c3QgYmUgb3duZXIgYXQgYmVnaW5uaW5nIHNvIHRoYXQgaGUgY2FuIGZpbGwgaW4KLQkgKiByZWNlaXZpbmcgcGFja2V0cywgc2V0IHN0YXR1cyBhbmQgcmVsZWFzZSBSTUQKLQkgKi8KLQotCXJtZHAtPnUucy5zdGF0dXMgPSBSWF9PV047Ci0KLQlybWRwLT5ibGVuID0gLVBLVF9CVUZfU1o7ICAgIC8qIEJ1ZmZlciBTaXplIGluIGEgdHdvJ3MgY29tcGxlbWVudCAqLwotCi0Jcm1kcC0+bWxlbiA9IDA7ICAgICAgICAgICAgICAvKiBpbml0IG1lc3NhZ2UgbGVuZ3RoICovCi0KLSAgICB9Ci0KLSAgICAvKiBGaWxsIExBTkNFIEluaXRpYWxpemUgQmxvY2sgKi8KLQotICAgIChwLT5yYW0pLT5pYi5tb2RlID0gbW9kZTsgICAgICAgIC8qIFNldCBvcGVyYXRpb24gbW9kZSAqLwotCi0gICAgZm9yIChpID0gMDsgaSA8IEVUSF9BTEVOOyBpKyspICAgLyogU2V0IHBoeXNpY2FsIGFkZHJlc3MgKi8KLSAgICB7Ci0JKHAtPnJhbSktPmliLnBhZGRyW2ldID0gKihuaWMtPm5vZGVfYWRkcitpKTsKLSAgICB9Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSAgICAgICAgICAvKiBTZXQgbXVsdGljYXN0LCBsb2dpY2FsIGFkZHJlc3MgKi8KLSAgICB7Ci0JKHAtPnJhbSktPmliLmxhZGRyW2ldID0gMDsgICAvKiBXZSBkbyBub3QgdXNlIGxvZ2ljYWwgYWRkcmVzc2luZyAqLwotICAgIH0KLQotICAgIC8qIFNldCByaW5nIGRlc2NyaXB0b3IgcG9pbnRlcnMgYW5kIHNldCBudW1iZXIgb2YgZGVzY3JpcHRvcnMgKi8KLQotICAgIChwLT5yYW0pLT5pYi5yZHJwID0gKGludCkgIHAtPnJtZGhlYWQgfCBSTUROVU1NQVNLOwotICAgIChwLT5yYW0pLT5pYi50ZHJwID0gKGludCkgIHAtPnRtZGhlYWQgfCBUTUROVU1NQVNLOwotCi0gICAgLyogUHJlcGFyZSBMQU5DRSBDb250cm9sIGFuZCBTdGF0dXMgUmVnaXN0ZXJzICovCi0KLSAgICBTS193cml0ZV9yZWcoQ1NSMywgQ1NSM19BQ09OKTsgICAvKiBBbGUgQ29udHJvbCAhISFUSElTIE1VU1QgQkUgU0VUISEhISAqLwotCi0gICAgLyoKLSAgICAgKiBMQU5DRSBhZGRyZXNzZXMgdGhlIFJBTSBmcm9tIDB4MDAwMCB0byAweDNmYmYgYW5kIGhhcyBubyBhY2Nlc3MgdG8KLSAgICAgKiBQQyBNZW1vcnkgbG9jYXRpb25zLgotICAgICAqCi0gICAgICogSW4gc3RydWN0dXJlIFNLX3JhbSBpcyBkZWZpbmVkIHRoYXQgdGhlIGZpcnN0IHRoaW5nIGluIHJhbQotICAgICAqIGlzIHRoZSBpbml0aWFsaXphdGlvbiBibG9jay4gU28gaGlzIGFkZHJlc3MgaXMgZm9yIExBTkNFIGFsd2F5cwotICAgICAqIDB4MDAwMAotICAgICAqCi0gICAgICogQ1NSMSBjb250YWlucyBsb3cgb3JkZXIgYml0cyAxNTowIG9mIGluaXRpYWxpemF0aW9uIGJsb2NrIGFkZHJlc3MKLSAgICAgKiBDU1IyIGlzIGJ1aWx0IG9mOgotICAgICAqICAgIDc6MCAgSGlnaCBvcmRlciBiaXRzIDIzOjE2IG9mIGluaXRpYWxpemF0aW9uIGJsb2NrIGFkZHJlc3MKLSAgICAgKiAgIDE1OjggIHJlc2VydmVkLCBtdXN0IGJlIDAKLSAgICAgKi8KLQotICAgIC8qIFNldCBpbml0aWFsaXphdGlvbiBibG9jayBhZGRyZXNzIChtdXN0IGJlIG9uIHdvcmQgYm91bmRhcnkpICovCi0gICAgU0tfd3JpdGVfcmVnKENTUjEsIDApOyAgICAgICAgICAvKiBTZXQgbG93IG9yZGVyIGJpdHMgMTU6MCAqLwotICAgIFNLX3dyaXRlX3JlZyhDU1IyLCAwKTsgICAgICAgICAgLyogU2V0IGhpZ2ggb3JkZXIgYml0cyAyMzoxNiAqLwotCi0KLSAgICBQUklOVEYoKCIjIyAlczogQWZ0ZXIgc2V0dGluZyBDU1IxLTMuIENTUjA6ICUjaFhcbiIsCi0gICAgICAgICAgIFNLX05BTUUsIFNLX3JlYWRfcmVnKENTUjApKSk7Ci0KLSAgICAvKiBJbml0aWFsaXplIExBTkNFICovCi0KLSAgICAvKgotICAgICAqIElOSVQgPSBJbml0aWFsaXplLCB3aGVuIHNldCwgY2F1c2VzIHRoZSBMQU5DRSB0byBiZWdpbiB0aGUKLSAgICAgKiBpbml0aWFsaXphdGlvbiBwcm9jZWR1cmUgYW5kIGFjY2VzcyB0aGUgSW5pdCBCbG9jay4KLSAgICAgKi8KLQotICAgIFNLX3dyaXRlX3JlZyhDU1IwLCBDU1IwX0lOSVQpOwotCi0gICAgLyogV2FpdCB1bnRpbCBMQU5DRSBmaW5pc2hlZCBpbml0aWFsaXphdGlvbiAqLwotCi0gICAgU0tfc2V0X1JBUChDU1IwKTsgICAgICAgICAgICAgIC8qIFJlZ2lzdGVyIEFkZHJlc3MgUG9pbnRlciB0byBDU1IwICovCi0KLSAgICBmb3IgKGkgPSAwOyAoaSA8IDEwMCkgJiYgIShTS19ycmVhZF9yZWcoKSAmIENTUjBfSURPTik7IGkrKykKLQk7IC8qIFdhaXQgdW50aWwgaW5pdCBkb25lIG9yIGdvIGFoZWFkIGlmIHByb2JsZW1zIChpPj0xMDApICovCi0KLSAgICBpZiAoaSA+PSAxMDApIC8qIFNvbWV0aGluZyBpcyB3cm9uZyAhICovCi0gICAgewotCXByaW50ZigiJXM6IGNhbid0IGluaXQgYW03OTkwLCBzdGF0dXM6ICUjaFggIgotCSAgICAgICAiaW5pdF9ibG9jazogJSNoWFxuIiwKLQkJU0tfTkFNRSwgKGludCkgU0tfcmVhZF9yZWcoQ1NSMCksCi0JCSh1bnNpZ25lZCBpbnQpICYocC0+cmFtKS0+aWIpOwotCi0jaWZkZWYJU0tfREVCVUcKLQlTS19wcmludF9wb3MobmljLCAiTEFOQ0UgSU5JVCBmYWlsZWQiKTsKLSNlbmRpZgotCi0JcmV0dXJuIC0xOyAgICAgICAgICAgICAgICAgLyogTEFOQ0UgaW5pdCBmYWlsZWQgKi8KLSAgICB9Ci0KLSAgICBQUklOVEYoKCIjIyAlczogaW5pdCBkb25lIGFmdGVyICVkIHRpY2tzXG4iLCBTS19OQU1FLCBpKSk7Ci0KLSAgICAvKiBDbGVhciBJbml0aWFsaXplIGRvbmUsIGVuYWJsZSBJbnRlcnJ1cHRzLCBzdGFydCBMQU5DRSAqLwotCi0gICAgU0tfd3JpdGVfcmVnKENTUjAsIENTUjBfSURPTiB8IENTUjBfSU5FQSB8IENTUjBfU1RSVCk7Ci0KLSAgICBQUklOVEYoKCIjIyAlczogTEFOQ0Ugc3RhcnRlZC4gQ1NSMDogJSNoWFxuIiwgU0tfTkFNRSwKLSAgICAgICAgICAgIFNLX3JlYWRfcmVnKENTUjApKSk7Ci0KLSAgICByZXR1cm4gMDsgICAgICAgICAgICAgICAgICAgICAgLyogTEFOQ0UgaXMgdXAgYW5kIHJ1bm5pbmcgKi8KLQotfSAvKiBFbmQgb2YgU0tfbGFuY2VfaW5pdCgpICovCi0KLS8qIExBTkNFIGFjY2VzcyBmdW5jdGlvbnMKLSAqCi0gKiAhIENTUjEtMyBjYW4gb25seSBiZSBhY2Nlc3NlZCB3aGVuIGluIENTUjAgdGhlIFNUT1AgYml0IGlzIHNldCAhCi0gKi8KLQotc3RhdGljIHZvaWQgU0tfcmVzZXRfYm9hcmQodm9pZCkKLXsKLSAgICBpbnQgaTsKLQotCVBSSU5URigoIiMjICVzOiBBdCBiZWdpbm5pbmcgb2YgU0tfcmVzZXRfYm9hcmQuXG4iLCBTS19OQU1FKSk7Ci0gICAgU0tfUE9SVCA9IDB4MDA7ICAgICAgICAgICAvKiBSZXNldCBhY3RpdmUgKi8KLSAgICBmb3IgKGkgPSAwOyBpIDwgMTAgOyBpKyspIC8qIERlbGF5IG1pbiA1bXMgKi8KLQk7Ci0gICAgU0tfUE9SVCA9IFNLX1JFU0VUOyAgICAgICAvKiBTZXQgYmFjayB0byBub3JtYWwgb3BlcmF0aW9uICovCi0KLX0gLyogRW5kIG9mIFNLX3Jlc2V0X2JvYXJkKCkgKi8KLQotc3RhdGljIHZvaWQgU0tfc2V0X1JBUChpbnQgcmVnX251bWJlcikKLXsKLSAgICBTS19JT1JFRyA9IHJlZ19udW1iZXI7Ci0gICAgU0tfUE9SVCAgPSBTS19SRVNFVCB8IFNLX1JBUCB8IFNLX1dSRUc7Ci0gICAgU0tfSU9DT00gPSBTS19ET0lPOwotCi0gICAgd2hpbGUgKFNLX1BPUlQgJiBTS19JT1JVTikKLQk7Ci19IC8qIEVuZCBvZiBTS19zZXRfUkFQKCkgKi8KLQotc3RhdGljIGludCBTS19yZWFkX3JlZyhpbnQgcmVnX251bWJlcikKLXsKLSAgICBTS19zZXRfUkFQKHJlZ19udW1iZXIpOwotCi0gICAgU0tfUE9SVCAgPSBTS19SRVNFVCB8IFNLX1JEQVRBIHwgU0tfUlJFRzsKLSAgICBTS19JT0NPTSA9IFNLX0RPSU87Ci0KLSAgICB3aGlsZSAoU0tfUE9SVCAmIFNLX0lPUlVOKQotCTsKLSAgICByZXR1cm4gKFNLX0lPUkVHKTsKLQotfSAvKiBFbmQgb2YgU0tfcmVhZF9yZWcoKSAqLwotCi1zdGF0aWMgaW50IFNLX3JyZWFkX3JlZyh2b2lkKQotewotICAgIFNLX1BPUlQgID0gU0tfUkVTRVQgfCBTS19SREFUQSB8IFNLX1JSRUc7Ci0KLSAgICBTS19JT0NPTSA9IFNLX0RPSU87Ci0KLSAgICB3aGlsZSAoU0tfUE9SVCAmIFNLX0lPUlVOKQotCTsKLSAgICByZXR1cm4gKFNLX0lPUkVHKTsKLQotfSAvKiBFbmQgb2YgU0tfcnJlYWRfcmVnKCkgKi8KLQotc3RhdGljIHZvaWQgU0tfd3JpdGVfcmVnKGludCByZWdfbnVtYmVyLCBpbnQgdmFsdWUpCi17Ci0gICAgU0tfc2V0X1JBUChyZWdfbnVtYmVyKTsKLQotICAgIFNLX0lPUkVHID0gdmFsdWU7Ci0gICAgU0tfUE9SVCAgPSBTS19SRVNFVCB8IFNLX1JEQVRBIHwgU0tfV1JFRzsKLSAgICBTS19JT0NPTSA9IFNLX0RPSU87Ci0KLSAgICB3aGlsZSAoU0tfUE9SVCAmIFNLX0lPUlVOKQotCTsKLX0gLyogRW5kIG9mIFNLX3dyaXRlX3JlZyAqLwotCi0vKgotICogRGVidWdnaW5nIGZ1bmN0aW9ucwotICogLS0tLS0tLS0tLS0tLS0tLS0tLQotICovCi0KLSNpZmRlZglTS19ERUJVRwotc3RhdGljIHZvaWQgU0tfcHJpbnRfcG9zKHN0cnVjdCBuaWMgKm5pYywgY2hhciAqdGV4dCkKLXsKLQotICAgIHVuc2lnbmVkIGNoYXIgcG9zMCA9IGluYihTS19QT1MwKSwKLQkJICBwb3MxID0gaW5iKFNLX1BPUzEpLAotCQkgIHBvczIgPSBpbmIoU0tfUE9TMiksCi0JCSAgcG9zMyA9IGluYihTS19QT1MzKSwKLQkJICBwb3M0ID0gaW5iKFNLX1BPUzQpOwotCi0KLSAgICBwcmludGYoIiMjICVzOiAlcy5cbiIKLSAgICAgICAgICAgIiMjICAgcG9zMD0lI2hYIHBvczE9JSNoWCBwb3MyPSUjaFggcG9zMz0lI2hYIHBvczQ9JSNoWFxuIiwKLSAgICAgICAgICAgU0tfTkFNRSwgdGV4dCwgcG9zMCwgcG9zMSwgcG9zMiwgKHBvczM8PDE0KSwgcG9zNCk7Ci0KLX0gLyogRW5kIG9mIFNLX3ByaW50X3BvcygpICovCi0KLXN0YXRpYyB2b2lkIFNLX3ByaW50X3JhbShzdHJ1Y3QgbmljICpuaWMpCi17Ci0KLSAgICBpbnQgaTsKLSAgICBzdHJ1Y3QgcHJpdiAqcCA9IChzdHJ1Y3QgcHJpdiAqKSBuaWMtPnByaXZfZGF0YTsKLQotICAgIHByaW50ZigiIyMgJXM6IFJBTSBEZXRhaWxzLlxuIgotICAgICAgICAgICAiIyMgICBSQU0gYXQgJSNoWCB0bWRoZWFkOiAlI2hYIHJtZGhlYWQ6ICUjaFggaW5pdGJsb2NrOiAlI2hYXG4iLAotICAgICAgICAgICBTS19OQU1FLAotICAgICAgICAgICAodW5zaWduZWQgaW50KSBwLT5yYW0sCi0gICAgICAgICAgICh1bnNpZ25lZCBpbnQpIHAtPnRtZGhlYWQsCi0gICAgICAgICAgICh1bnNpZ25lZCBpbnQpIHAtPnJtZGhlYWQsCi0gICAgICAgICAgICh1bnNpZ25lZCBpbnQpICYocC0+cmFtKS0+aWIpOwotCi0gICAgcHJpbnRmKCIjIyAgICIpOwotCi0gICAgZm9yKGkgPSAwOyBpIDwgVE1ETlVNOyBpKyspCi0gICAgewotICAgICAgICAgICBpZiAoIShpICUgMykpIC8qIEV2ZXJ5IHRoaXJkIGxpbmUgZG8gYSBuZXdsaW5lICovCi0gICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIHByaW50ZigiXG4jIyAgICIpOwotICAgICAgICAgICB9Ci0gICAgICAgIHByaW50ZigidG1kYnVmcyVkOiAlI2hYICIsIChpKzEpLCAoaW50KSBwLT50bWRidWZzW2ldKTsKLSAgICB9Ci0gICAgcHJpbnRmKCIjIyAgICIpOwotCi0gICAgZm9yKGkgPSAwOyBpIDwgUk1ETlVNOyBpKyspCi0gICAgewotICAgICAgICAgaWYgKCEoaSAlIDMpKSAvKiBFdmVyeSB0aGlyZCBsaW5lIGRvIGEgbmV3bGluZSAqLwotICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICBwcmludGYoIlxuIyMgICAiKTsKLSAgICAgICAgICAgfQotICAgICAgICBwcmludGYoInJtZGJ1ZnMlZDogJSNoWCAiLCAoaSsxKSwgKGludCkgcC0+cm1kYnVmc1tpXSk7Ci0gICAgfQotICAgIHB1dGNoYXIoJ1xuJyk7Ci0KLX0gLyogRW5kIG9mIFNLX3ByaW50X3JhbSgpICovCi0jZW5kaWYKZGlmZiAtTmF1ciBncnViLTAuOTcub3JpZy9uZXRib290L3NrX2cxNi5oIGdydWItMC45Ny9uZXRib290L3NrX2cxNi5oCi0tLSBncnViLTAuOTcub3JpZy9uZXRib290L3NrX2cxNi5oCTIwMDMtMDctMDkgMTE6NDU6MzguMDAwMDAwMDAwICswMDAwCisrKyBncnViLTAuOTcvbmV0Ym9vdC9za19nMTYuaAkxOTcwLTAxLTAxIDAwOjAwOjAwLjAwMDAwMDAwMCArMDAwMApAQCAtMSwxNjggKzAsMCBAQAotLyotCi0gKgotICogVGhpcyBzb2Z0d2FyZSBtYXkgYmUgdXNlZCBhbmQgZGlzdHJpYnV0ZWQgYWNjb3JkaW5nIHRvIHRoZSB0ZXJtcwotICogb2YgdGhlIEdOVSBQdWJsaWMgTGljZW5zZSwgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCi0gKgotICogTW9kdWxlICAgICAgICAgOiBza19nMTYuaAotICogVmVyc2lvbiAgICAgICAgOiAkUmV2aXNpb246IDEuMyAkCi0gKgotICogQXV0aG9yICAgICAgICAgOiBNLkhpcHAgKG1oaXBwQHN0dWRlbnQudW5pLXR1ZWJpbmdlbi5kZSkKLSAqIGNoYW5nZXMgYnkgICAgIDogUGF0cmljayBKLkQuIFdlaWNobWFubgotICoKLSAqIERhdGUgQ3JlYXRlZCAgIDogOTQvMDUvMjUKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICA6IEluIGhlcmUgYXJlIGFsbCBuZWNlc3NhcnkgZGVmaW5pdGlvbnMgb2YKLSAqICAgICAgICAgICAgICAgICAgdGhlIGFtNzk5MCAoTEFOQ0UpIGNoaXAgdXNlZCBmb3Igd3JpdGluZyBhCi0gKiAgICAgICAgICAgICAgICAgIG5ldHdvcmsgZGV2aWNlIGRyaXZlciB3aGljaCB1c2VzIHRoaXMgY2hpcAotICoKLSAqICRMb2c6IHNrX2cxNi5oLHYgJAotICogUmV2aXNpb24gMS4zICAyMDAwLzA3LzI5IDE5OjIyOjU0ICBva3VqaQotICogdXBkYXRlIHRoZSBuZXR3b3JrIHN1cHBvcnQgdG8gZXRoZXJib290LTQuNi40LgotICoKLS0qLwotCi0jaWZuZGVmCVNLX0cxNl9ICi0KLSNkZWZpbmUgU0tfRzE2X0gKLQotCi0vKgotICoJQ29udHJvbCBhbmQgU3RhdHVzIFJlZ2lzdGVyIDAgKENTUjApIGJpdCBkZWZpbml0aW9ucwotICoKLSAqIChSPVJlYWRhYmxlKSAoVz1Xcml0ZWFibGUpIChTPVNldCBvbiB3cml0ZSkgKEMtQ2xlYXIgb24gd3JpdGUpCi0gKgotICovCi0KLSNkZWZpbmUgQ1NSMF9FUlIJMHg4MDAwCS8qIEVycm9yIHN1bW1hcnkgKFIpICovCi0jZGVmaW5lIENTUjBfQkFCTAkweDQwMDAJLyogQmFiYmxlIHRyYW5zbWl0dGVyIHRpbWVvdXQgZXJyb3IgKFJDKSAqLwotI2RlZmluZSBDU1IwX0NFUlIJMHgyMDAwCS8qIENvbGxpc2lvbiBFcnJvciAoUkMpICovCi0jZGVmaW5lIENTUjBfTUlTUwkweDEwMDAJLyogTWlzc2VkIHBhY2tldCAoUkMpICovCi0jZGVmaW5lIENTUjBfTUVSUgkweDA4MDAJLyogTWVtb3J5IEVycm9yICAoUkMpICovCi0jZGVmaW5lIENTUjBfUklOVAkweDA0MDAJLyogUmVjZWl2ZXIgSW50ZXJydXB0IChSQykgKi8KLSNkZWZpbmUgQ1NSMF9USU5UICAgICAgIDB4MDIwMAkvKiBUcmFuc21pdCBJbnRlcnJ1cHQgKFJDKSAqLwotI2RlZmluZSBDU1IwX0lET04JMHgwMTAwCS8qIEluaXRpYWxpemF0aW9uIERvbmUgKFJDKSAqLwotI2RlZmluZSBDU1IwX0lOVFIJMHgwMDgwCS8qIEludGVycnVwdCBGbGFnIChSKSAqLwotI2RlZmluZSBDU1IwX0lORUEJMHgwMDQwCS8qIEludGVycnVwdCBFbmFibGUgKFJXKSAqLwotI2RlZmluZSBDU1IwX1JYT04JMHgwMDIwCS8qIFJlY2VpdmVyIG9uIChSKSAqLwotI2RlZmluZSBDU1IwX1RYT04JMHgwMDEwICAvKiBUcmFuc21pdHRlciBvbiAoUikgKi8KLSNkZWZpbmUgQ1NSMF9URE1ECTB4MDAwOAkvKiBUcmFuc21pdCBEZW1hbmQgKFJTKSAqLwotI2RlZmluZSBDU1IwX1NUT1AJMHgwMDA0CS8qIFN0b3AgKFJTKSAqLwotI2RlZmluZSBDU1IwX1NUUlQJMHgwMDAyCS8qIFN0YXJ0IChSUykgKi8KLSNkZWZpbmUgQ1NSMF9JTklUCTB4MDAwMQkvKiBJbml0aWFsaXplIChSUykgKi8KLQotI2RlZmluZSBDU1IwX0NMUkFMTCAgICAgMHg3ZjAwICAvKiBtYXNrIGZvciBhbGwgY2xlYXJhYmxlIGJpdHMgKi8KLQotLyoKLSAqICAgIENvbnRyb2wgYW5kIFN0YXR1cyBSZWdpc3RlciAzIChDU1IzKSBiaXQgZGVmaW5pdGlvbnMKLSAqCi0gKi8KLQotI2RlZmluZSBDU1IzX0JTV0FQCTB4MDAwNAkvKiBCeXRlIFN3YXAgKFJXKSAqLwotI2RlZmluZSBDU1IzX0FDT04JMHgwMDAyICAvKiBBTEUgQ29udHJvbCAoUlcpICovCi0jZGVmaW5lIENTUjNfQkNPTgkweDAwMDEJLyogQnl0ZSBDb250cm9sIChSVykgKi8KLQotLyoKLSAqCUluaXRpYWxpemF0aW9uIEJsb2NrIE1vZGUgb3BlcmF0aW9uIEJpdCBEZWZpbml0aW9ucy4KLSAqLwotCi0jZGVmaW5lIE1PREVfUFJPTQkweDgwMDAJLyogUHJvbWlzY3VvdXMgTW9kZSAqLwotI2RlZmluZSBNT0RFX0lOVEwJMHgwMDQwICAvKiBJbnRlcm5hbCBMb29wYmFjayAqLwotI2RlZmluZSBNT0RFX0RSVFkJMHgwMDIwICAvKiBEaXNhYmxlIFJldHJ5ICovCi0jZGVmaW5lIE1PREVfQ09MTAkweDAwMTAJLyogRm9yY2UgQ29sbGlzaW9uICovCi0jZGVmaW5lIE1PREVfRFRDUgkweDAwMDgJLyogRGlzYWJsZSBUcmFuc21pdCBDUkMpICovCi0jZGVmaW5lIE1PREVfTE9PUAkweDAwMDQJLyogTG9vcGJhY2sgKi8KLSNkZWZpbmUgTU9ERV9EVFgJMHgwMDAyCS8qIERpc2FibGUgdGhlIFRyYW5zbWl0dGVyICovCi0jZGVmaW5lIE1PREVfRFJYCTB4MDAwMSAgLyogRGlzYWJsZSB0aGUgUmVjZWl2ZXIgKi8KLQotI2RlZmluZSBNT0RFX05PUk1BTAkweDAwMDAgIC8qIE5vcm1hbCBvcGVyYXRpb24gbW9kZSAqLwotCi0vKgotICoJUmVjZWl2ZSBtZXNzYWdlIGRlc2NyaXB0b3Igc3RhdHVzIGJpdCBkZWZpbml0aW9ucy4KLSAqLwotCi0jZGVmaW5lIFJYX09XTgkJMHg4MAkvKiBPd25lciBiaXQgMCA9IGhvc3QsIDEgPSBsYW5jZSAqLwotI2RlZmluZSBSWF9FUlIJCTB4NDAJLyogRXJyb3IgU3VtbWFyeSAqLwotI2RlZmluZSBSWF9GUkFNCQkweDIwCS8qIEZyYW1pbmcgRXJyb3IgKi8KLSNkZWZpbmUgUlhfT0ZMTwkJMHgxMAkvKiBPdmVyZmxvdyBFcnJvciAqLwotI2RlZmluZSBSWF9DUkMJCTB4MDgJLyogQ1JDIEVycm9yICovCi0jZGVmaW5lIFJYX0JVRkYJCTB4MDQJLyogQnVmZmVyIEVycm9yICovCi0jZGVmaW5lIFJYX1NUUAkJMHgwMgkvKiBTdGFydCBvZiBQYWNrZXQgKi8KLSNkZWZpbmUgUlhfRU5QCQkweDAxCS8qIEVuZCBvZiBQYWNrZXQgKi8KLQotCi0vKgotICoJVHJhbnNtaXQgbWVzc2FnZSBkZXNjcmlwdG9yIHN0YXR1cyBiaXQgZGVmaW5pdGlvbnMuCi0gKi8KLQotI2RlZmluZSBUWF9PV04JCTB4ODAJLyogT3duZXIgYml0IDAgPSBob3N0LCAxID0gbGFuY2UgKi8KLSNkZWZpbmUgVFhfRVJSCQkweDQwICAgIC8qIEVycm9yIFN1bW1hcnkgKi8KLSNkZWZpbmUgVFhfTU9SRQkJMHgxMAkvKiBNb3JlIHRoZSAxIHJldHJ5IG5lZWRlZCB0byBYbWl0ICovCi0jZGVmaW5lIFRYX09ORQkJMHgwOAkvKiBPbmUgcmV0cnkgbmVlZGVkIHRvIFhtaXQgKi8KLSNkZWZpbmUgVFhfREVGCQkweDA0CS8qIERlZmVycmVkICovCi0jZGVmaW5lIFRYX1NUUAkJMHgwMgkvKiBTdGFydCBvZiBQYWNrZXQgKi8KLSNkZWZpbmUgVFhfRU5QCQkweDAxCS8qIEVuZCBvZiBQYWNrZXQgKi8KLQotLyoKLSAqICAgICAgVHJhbnNtaXQgc3RhdHVzICgyKSAodmFsaWQgaWYgVFhfRVJSID09IDEpCi0gKi8KLQotI2RlZmluZSBUWF9CVUZGCQkweDgwMDAgIC8qIEJ1ZmZlcmluZyBlcnJvciAobm8gRU5QKSAqLwotI2RlZmluZSBUWF9VRkxPCQkweDQwMDAgIC8qIFVuZGVyZmxvdyAobGF0ZSBtZW1vcnkpICovCi0jZGVmaW5lIFRYX0xDT0wJCTB4MTAwMCAgLyogTGF0ZSBjb2xsaXNpb24gKi8KLSNkZWZpbmUgVFhfTENBUgkJMHgwNDAwICAvKiBMb3NzIG9mIENhcnJpZXIgKi8KLSNkZWZpbmUgVFhfUlRSWQkJMHgwMjAwICAvKiBGYWlsZWQgYWZ0ZXIgMTYgcmV0cmFuc21pc3Npb25zICAqLwotI2RlZmluZSBUWF9URFIgICAgICAgICAgMHgwMDNmICAvKiBUaW1lLWRvbWFpbi1yZWZsZWN0b21ldGVyLXZhbHVlICovCi0KLQotLyoKLSAqIFN0cnVjdHVyZXMgdXNlZCBmb3IgQ29tbXVuaWNhdGlvbiB3aXRoIHRoZSBMQU5DRQotICovCi0KLS8qIExBTkNFIEluaXRpYWxpemUgQmxvY2sgKi8KLQotc3RydWN0IGluaXRfYmxvY2sKLXsKLSAgdW5zaWduZWQgc2hvcnQgbW9kZTsgICAgIC8qIE1vZGUgUmVnaXN0ZXIgKi8KLSAgdW5zaWduZWQgY2hhciAgcGFkZHJbNl07IC8qIFBoeXNpY2FsIEFkZHJlc3MgKE1BQykgKi8KLSAgdW5zaWduZWQgY2hhciAgbGFkZHJbOF07IC8qIExvZ2ljYWwgRmlsdGVyIEFkZHJlc3MgKG5vdCB1c2VkKSAqLwotICB1bnNpZ25lZCBpbnQgICByZHJwOyAgICAgLyogUmVjZWl2ZSBEZXNjcmlwdG9yIFJpbmcgcG9pbnRlciAqLwotICB1bnNpZ25lZCBpbnQgICB0ZHJwOyAgICAgLyogVHJhbnNtaXQgRGVzY3JpcHRvciBSaW5nIHBvaW50ZXIgKi8KLX07Ci0KLQotLyogUmVjZWl2ZSBNZXNzYWdlIERlc2NyaXB0b3IgRW50cnkgKi8KLQotc3RydWN0IHJtZAotewotICB1bmlvbiBybWRfdQotICB7Ci0gICAgdW5zaWduZWQgbG9uZyBidWZmZXI7ICAgICAvKiBBZGRyZXNzIG9mIGJ1ZmZlciAqLwotICAgIHN0cnVjdCBybWRfcwotICAgIHsKLSAgICAgIHVuc2lnbmVkIGNoYXIgdW51c2VkWzNdOwotICAgICAgdW5zaWduZWQgdm9sYXRpbGUgY2hhciBzdGF0dXM7ICAgLyogU3RhdHVzIEJpdHMgKi8KLSAgICB9IHM7Ci0gIH0gdTsKLSAgdm9sYXRpbGUgc2hvcnQgYmxlbjsgICAgICAgIC8qIEJ1ZmZlciBMZW5ndGggKHR3bydzIGNvbXBsZW1lbnQpICovCi0gIHVuc2lnbmVkIHNob3J0IG1sZW47ICAgICAgICAvKiBNZXNzYWdlIEJ5dGUgQ291bnQgKi8KLX07Ci0KLQotLyogVHJhbnNtaXQgTWVzc2FnZSBEZXNjcmlwdG9yIEVudHJ5ICovCi0KLXN0cnVjdCB0bWQKLXsKLSAgdW5pb24gdG1kX3UKLSAgewotICAgIHVuc2lnbmVkIGxvbmcgIGJ1ZmZlcjsgICAgLyogQWRkcmVzcyBvZiBidWZmZXIgKi8KLSAgICBzdHJ1Y3QgdG1kX3MKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBjaGFyIHVudXNlZFszXTsKLSAgICAgIHVuc2lnbmVkIHZvbGF0aWxlIGNoYXIgc3RhdHVzOyAgIC8qIFN0YXR1cyBCaXRzICovCi0gICAgfSBzOwotICB9IHU7Ci0gIHVuc2lnbmVkIHNob3J0IGJsZW47ICAgICAgICAgICAgIC8qIEJ1ZmZlciBMZW5ndGggKHR3bydzIGNvbXBsZW1lbnQpICovCi0gIHVuc2lnbmVkIHZvbGF0aWxlIHNob3J0IHN0YXR1czI7IC8qIEVycm9yIFN0YXR1cyBCaXRzICovCi19OwotCi0jZW5kaWYJLyogRW5kIG9mIFNLX0cxNl9IICovCmRpZmYgLU5hdXIgZ3J1Yi0wLjk3Lm9yaWcvbmV0Ym9vdC9zbWM5MDAwLmMgZ3J1Yi0wLjk3L25ldGJvb3Qvc21jOTAwMC5jCi0tLSBncnViLTAuOTcub3JpZy9uZXRib290L3NtYzkwMDAuYwkyMDAzLTA3LTA5IDExOjQ1OjM4LjAwMDAwMDAwMCArMDAwMAorKysgZ3J1Yi0wLjk3L25ldGJvb3Qvc21jOTAwMC5jCTE5NzAtMDEtMDEgMDA6MDA6MDAuMDAwMDAwMDAwICswMDAwCkBAIC0xLDUyMiArMCwwIEBACi0gLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIHNtYzkwMDAuYwotICogVGhpcyBpcyBhIEV0aGVyYm9vdCBkcml2ZXIgZm9yIFNNQydzIDkwMDAgc2VyaWVzIG9mIEV0aGVybmV0IGNhcmRzLgotICoKLSAqIENvcHlyaWdodCAoQykgMTk5OCBEYW5pZWwgRW5nc3Ry9m0gPGRhbmllbC5lbmdzdHJvbUByaWtzbmV0dC5ubz4KLSAqIEJhc2VkIG9uIHRoZSBMaW51eCBTTUM5MDAwIGRyaXZlciwgc21jOTE5NC5jIGJ5IEVyaWMgU3RhaGxtYW4KLSAqIENvcHlyaWdodCAoQykgMTk5NiBieSBFcmlrIFN0YWhsbWFuIDxlcmljQHZ0LmVkdT4KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIG1heSBiZSB1c2VkIGFuZCBkaXN0cmlidXRlZCBhY2NvcmRpbmcgdG8gdGhlIHRlcm1zCi0gKiBvZiB0aGUgR05VIFB1YmxpYyBMaWNlbnNlLCBpbmNvcnBvcmF0ZWQgaGVyZWluIGJ5IHJlZmVyZW5jZS4KLSAqCi0gKiAiRmVhdHVyZXMiIG9mIHRoZSBTTUMgY2hpcDoKLSAqICAgNDYwOCBieXRlIHBhY2tldCBtZW1vcnkuICggZm9yIHRoZSA5MUM5Mi80LiAgT3RoZXJzIGhhdmUgbW9yZSApCi0gKiAgIEVFUFJPTSBmb3IgY29uZmlndXJhdGlvbgotICogICBBVUkvVFAgc2VsZWN0aW9uCi0gKgotICogQXV0aG9ycwotICoJRXJpayBTdGFobG1hbgkJCQk8ZXJpa0B2dC5lZHU+Ci0gKiAgICAgIERhbmllbCBFbmdzdHL2bSAgICAgICAgICAgICAgICAgICAgICAgICA8ZGFuaWVsLmVuZ3N0cm9tQHJpa3NuZXR0Lm5vPgotICoKLSAqIEhpc3RvcnkKLSAqIDk4LTA5LTI1ICAgICAgICAgICAgICBEYW5pZWwgRW5nc3Ry9m0gRXRoZXJib290IGRyaXZlciBjcmF0ZWQgZnJvbSBFcmljJ3MKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGludXggZHJpdmVyLgotICoKLSAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSNkZWZpbmUgTElOVVhfT1VUX01BQ1JPUyAxCi0jZGVmaW5lIFNNQzkwMDBfVkVSQk9TRSAgMQotI2RlZmluZSBTTUM5MDAwX0RFQlVHICAgIDAKLQotI2luY2x1ZGUgImV0aGVyYm9vdC5oIgotI2luY2x1ZGUgIm5pYy5oIgotI2luY2x1ZGUgImNhcmRzLmgiCi0jaW5jbHVkZSAic21jOTAwMC5oIgotCi0jIGRlZmluZSBfb3V0YiBvdXRiCi0jIGRlZmluZSBfb3V0dyBvdXR3Ci0KLXN0YXRpYyBjb25zdCBjaGFyICAgICAgIHNtYzkwMDBfdmVyc2lvbltdID0gIlZlcnNpb24gMC45OSA5OC0wOS0zMCI7Ci1zdGF0aWMgdW5zaWduZWQgaW50CXNtYzkwMDBfYmFzZT0wOwotc3RhdGljIGNvbnN0IGNoYXIgICAgICAgKmludGVyZmFjZXNbIDIgXSA9IHsgIlRQIiwgIkFVSSIgfTsKLXN0YXRpYyBjb25zdCBjaGFyICAgICAgICpjaGlwX2lkc1sgMTUgXSA9ICB7Ci0gICBOVUxMLCBOVUxMLCBOVUxMLAotICAgLyogMyAqLyAiU01DOTFDOTAvOTFDOTIiLAotICAgLyogNCAqLyAiU01DOTFDOTQiLAotICAgLyogNSAqLyAiU01DOTFDOTUiLAotICAgTlVMTCwKLSAgIC8qIDcgKi8gIlNNQzkxQzEwMCIsCi0gICAvKiA4ICovICJTTUM5MUMxMDBGRCIsCi0gICBOVUxMLCBOVUxMLCBOVUxMLAotICAgTlVMTCwgTlVMTCwgTlVMTAotfTsKLXN0YXRpYyBjb25zdCBjaGFyICAgICAgc21jOTFjOTZfaWRbXSA9ICJTTUM5MUM5NiI7Ci0KLS8qCi0gKiBGdW5jdGlvbjogc21jX3Jlc2V0KCBpbnQgaW9hZGRyICkKLSAqIFB1cnBvc2U6Ci0gKglUaGlzIHNldHMgdGhlIFNNQzkxeHggY2hpcCB0byBpdHMgbm9ybWFsIHN0YXRlLCBob3BlZnVsbHkgZnJvbSB3aGF0ZXZlcgotICoJbWVzcyB0aGF0IGFueSBvdGhlciBET1MgZHJpdmVyIGhhcyBwdXQgaXQgaW4uCi0gKgotICogTWF5YmUgSSBzaG91bGQgcmVzZXQgbW9yZSByZWdpc3RlcnMgdG8gZGVmYXVsdHMgaW4gaGVyZT8gIFNPRlRSRVNFVCAgc2hvdWxkCi0gKiBkbyB0aGF0IGZvciBtZS4KLSAqCi0gKiBNZXRob2Q6Ci0gKgkxLiAgc2VuZCBhIFNPRlQgUkVTRVQKLSAqCTIuICB3YWl0IGZvciBpdCB0byBmaW5pc2gKLSAqCTMuICByZXNldCB0aGUgbWVtb3J5IG1hbmFnZW1lbnQgdW5pdAotICogICAgICA0LiAgY2xlYXIgYWxsIGludGVycnVwdHMKLSAqCi0qLwotc3RhdGljIHZvaWQgc21jX3Jlc2V0KGludCBpb2FkZHIpCi17Ci0gICAvKiBUaGlzIHJlc2V0cyB0aGUgcmVnaXN0ZXJzIG1vc3RseSB0byBkZWZhdWx0cywgYnV0IGRvZXNuJ3QKLSAgICAqIGFmZmVjdCBFRVBST00uICBUaGF0IHNlZW1zIHVubmVjZXNzYXJ5ICovCi0gICBTTUNfU0VMRUNUX0JBTksoaW9hZGRyLCAwKTsKLSAgIF9vdXR3KCBSQ1JfU09GVFJFU0VULCBpb2FkZHIgKyBSQ1IgKTsKLQotICAgLyogdGhpcyBzaG91bGQgcGF1c2UgZW5vdWdoIGZvciB0aGUgY2hpcCB0byBiZSBoYXBweSAqLwotICAgU01DX0RFTEFZKGlvYWRkcik7Ci0KLSAgIC8qIFNldCB0aGUgdHJhbnNtaXQgYW5kIHJlY2VpdmUgY29uZmlndXJhdGlvbiByZWdpc3RlcnMgdG8KLSAgICAqIGRlZmF1bHQgdmFsdWVzICovCi0gICBfb3V0dyhSQ1JfQ0xFQVIsIGlvYWRkciArIFJDUik7Ci0gICBfb3V0dyhUQ1JfQ0xFQVIsIGlvYWRkciArIFRDUik7Ci0KLSAgIC8qIFJlc2V0IHRoZSBNTVUgKi8KLSAgIFNNQ19TRUxFQ1RfQkFOSyhpb2FkZHIsIDIpOwotICAgX291dHcoIE1DX1JFU0VULCBpb2FkZHIgKyBNTVVfQ01EICk7Ci0KLSAgIC8qIE5vdGU6ICBJdCBkb2Vzbid0IHNlZW0gdGhhdCB3YWl0aW5nIGZvciB0aGUgTU1VIGJ1c3kgaXMgbmVlZGVkIGhlcmUsCi0gICAgKiBidXQgdGhpcyBpcyBhIHBsYWNlIHdoZXJlIGZ1dHVyZSBjaGlwc2V0cyBfQ09VTERfIGJyZWFrLiAgQmUgd2FyeQotICAgICogb2YgaXNzdWluZyBhbm90aGVyIE1NVSBjb21tYW5kIHJpZ2h0IGFmdGVyIHRoaXMgKi8KLSAgIF9vdXRiKDAsIGlvYWRkciArIElOVF9NQVNLKTsKLX0KLQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIEZ1bmN0aW9uOiBzbWNfcHJvYmUoIGludCBpb2FkZHIgKQotICoKLSAqIFB1cnBvc2U6Ci0gKglUZXN0cyB0byBzZWUgaWYgYSBnaXZlbiBpb2FkZHIgcG9pbnRzIHRvIGFuIFNNQzl4eHggY2hpcC4KLSAqCVJldHVybnMgYSAwIG9uIHN1Y2Nlc3MKLSAqCi0gKiBBbGdvcml0aG06Ci0gKgkoMSkgc2VlIGlmIHRoZSBoaWdoIGJ5dGUgb2YgQkFOS19TRUxFQ1QgaXMgMHgzMwotICoJKDIpIGNvbXBhcmUgdGhlIGlvYWRkciB3aXRoIHRoZSBiYXNlIHJlZ2lzdGVyJ3MgYWRkcmVzcwotICoJKDMpIHNlZSBpZiBJIHJlY29nbml6ZSB0aGUgY2hpcCBJRCBpbiB0aGUgYXBwcm9wcmlhdGUgcmVnaXN0ZXIKLSAqCi0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqLwotc3RhdGljIGludCBzbWNfcHJvYmUoIGludCBpb2FkZHIgKQotewotICAgd29yZCBiYW5rOwotICAgd29yZAlyZXZpc2lvbl9yZWdpc3RlcjsKLSAgIHdvcmQgYmFzZV9hZGRyZXNzX3JlZ2lzdGVyOwotCi0gICAvKiBGaXJzdCwgc2VlIGlmIHRoZSBoaWdoIGJ5dGUgaXMgMHgzMyAqLwotICAgYmFuayA9IGludyhpb2FkZHIgKyBCQU5LX1NFTEVDVCk7Ci0gICBpZiAoKGJhbmsgJiAweEZGMDApICE9IDB4MzMwMCkgewotICAgICAgcmV0dXJuIC0xOwotICAgfQotICAgLyogVGhlIGFib3ZlIE1JR0hUIGluZGljYXRlIGEgZGV2aWNlLCBidXQgSSBuZWVkIHRvIHdyaXRlIHRvIGZ1cnRoZXIKLSAgICAqCXRlc3QgdGhpcy4gICovCi0gICBfb3V0dygweDAsIGlvYWRkciArIEJBTktfU0VMRUNUKTsKLSAgIGJhbmsgPSBpbncoaW9hZGRyICsgQkFOS19TRUxFQ1QpOwotICAgaWYgKChiYW5rICYgMHhGRjAwKSAhPSAweDMzMDApIHsKLSAgICAgIHJldHVybiAtMTsKLSAgIH0KLQotICAgLyogd2VsbCwgd2UndmUgYWxyZWFkeSB3cml0dGVuIG9uY2UsIHNvIGhvcGVmdWxseSBhbm90aGVyIHRpbWUgd29uJ3QKLSAgICAqICBodXJ0LiAgVGhpcyB0aW1lLCBJIG5lZWQgdG8gc3dpdGNoIHRoZSBiYW5rIHJlZ2lzdGVyIHRvIGJhbmsgMSwKLSAgICAqICBzbyBJIGNhbiBhY2Nlc3MgdGhlIGJhc2UgYWRkcmVzcyByZWdpc3RlciAqLwotICAgU01DX1NFTEVDVF9CQU5LKGlvYWRkciwgMSk7Ci0gICBiYXNlX2FkZHJlc3NfcmVnaXN0ZXIgPSBpbncoaW9hZGRyICsgQkFTRSk7Ci0KLSAgIGlmIChpb2FkZHIgIT0gKGJhc2VfYWRkcmVzc19yZWdpc3RlciA+PiAzICYgMHgzRTApKSAgewotI2lmZGVmCVNNQzkwMDBfVkVSQk9TRQotICAgICAgcHJpbnRmKCJTTUM5MDAwOiBJT0FERFIgJWhYIGRvZXNuJ3QgbWF0Y2ggY29uZmlndXJhdGlvbiAoJWhYKS4iCi0JICAgICAiUHJvYmFibHkgbm90IGEgU01DIGNoaXBcbiIsCi0JICAgICBpb2FkZHIsIGJhc2VfYWRkcmVzc19yZWdpc3RlciA+PiAzICYgMHgzRTApOwotI2VuZGlmCi0gICAgICAvKiB3ZWxsLCB0aGUgYmFzZSBhZGRyZXNzIHJlZ2lzdGVyIGRpZG4ndCBtYXRjaC4gIE11c3Qgbm90IGhhdmUKLSAgICAgICAqIGJlZW4gYSBTTUMgY2hpcCBhZnRlciBhbGwuICovCi0gICAgICByZXR1cm4gLTE7Ci0gICB9Ci0KLQotICAgLyogY2hlY2sgaWYgdGhlIHJldmlzaW9uIHJlZ2lzdGVyIGlzIHNvbWV0aGluZyB0aGF0IEkgcmVjb2duaXplLgotICAgICogVGhlc2UgbWlnaHQgbmVlZCB0byBiZSBhZGRlZCB0byBsYXRlciwgYXMgZnV0dXJlIHJldmlzaW9ucwotICAgICogY291bGQgYmUgYWRkZWQuICAqLwotICAgU01DX1NFTEVDVF9CQU5LKGlvYWRkciwgMyk7Ci0gICByZXZpc2lvbl9yZWdpc3RlciAgPSBpbncoaW9hZGRyICsgUkVWSVNJT04pOwotICAgaWYgKCFjaGlwX2lkc1socmV2aXNpb25fcmVnaXN0ZXIgPj4gNCkgJiAweEZdKSB7Ci0gICAgICAvKiBJIGRvbid0IHJlY29nbml6ZSB0aGlzIGNoaXAsIHNvLi4uICovCi0jaWZkZWYJU01DOTAwMF9WRVJCT1NFCi0gICAgICBwcmludGYoIlNNQzkwMDA6IElPICVoWDogVW5yZWNvZ25pemVkIHJldmlzaW9uIHJlZ2lzdGVyOiIKLQkgICAgICIgJWhYLCBDb250YWN0IGF1dGhvci5cbiIsIGlvYWRkciwgcmV2aXNpb25fcmVnaXN0ZXIpOwotI2VuZGlmCi0gICAgICByZXR1cm4gLTE7Ci0gICB9Ci0KLSAgIC8qIGF0IHRoaXMgcG9pbnQgSSdsbCBhc3N1bWUgdGhhdCB0aGUgY2hpcCBpcyBhbiBTTUM5eHh4LgotICAgICogSXQgbWlnaHQgYmUgcHJ1ZGVudCB0byBjaGVjayBhIGxpc3Rpbmcgb2YgTUFDIGFkZHJlc3NlcwotICAgICogYWdhaW5zdCB0aGUgaGFyZHdhcmUgYWRkcmVzcywgb3IgZG8gc29tZSBvdGhlciB0ZXN0cy4gKi8KLSAgIHJldHVybiAwOwotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogRVRIX1JFU0VUIC0gUmVzZXQgYWRhcHRlcgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RhdGljIHZvaWQgc21jOTAwMF9yZXNldChzdHJ1Y3QgbmljICpuaWMpCi17Ci0gICBzbWNfcmVzZXQoc21jOTAwMF9iYXNlKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBFVEhfVFJBTlNNSVQgLSBUcmFuc21pdCBhIGZyYW1lCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgc21jOTAwMF90cmFuc21pdCgKLQlzdHJ1Y3QgbmljICpuaWMsCi0JY29uc3QgY2hhciAqZCwJCQkvKiBEZXN0aW5hdGlvbiAqLwotCXVuc2lnbmVkIGludCB0LAkJCS8qIFR5cGUgKi8KLQl1bnNpZ25lZCBpbnQgcywJCQkvKiBzaXplICovCi0JY29uc3QgY2hhciAqcCkJCQkvKiBQYWNrZXQgKi8KLXsKLSAgIHdvcmQgbGVuZ3RoOyAvKiByZWFsLCBsZW5ndGggaW5jbC4gaGVhZGVyICovCi0gICB3b3JkIG51bVBhZ2VzOwotICAgdW5zaWduZWQgbG9uZyB0aW1lX291dDsKLSAgIGJ5dGUJcGFja2V0X25vOwotICAgd29yZCBzdGF0dXM7Ci0gICBpbnQgaTsKLQotICAgLyogV2UgZG9udCBwYWQgaGVyZSBzaW5jZSB3ZSBjYW4gaGF2ZSB0aGUgaGFyZHdhcmUgZG9pbmcgaXQgZm9yIHVzICovCi0gICBsZW5ndGggPSAocyArIEVUSF9ITEVOICsgMSkmfjE7Ci0KLSAgIC8qIGNvbnZlcnQgdG8gTU1VIHBhZ2VzICovCi0gICBudW1QYWdlcyA9IGxlbmd0aCAvIDI1NjsKLQotICAgaWYgKG51bVBhZ2VzID4gNyApIHsKLSNpZmRlZglTTUM5MDAwX1ZFUkJPU0UKLSAgICAgIHByaW50ZigiU01DOTAwMDogRmFyIHRvbyBiaWcgcGFja2V0IGVycm9yLiBcbiIpOwotI2VuZGlmCi0gICAgICByZXR1cm47Ci0gICB9Ci0KLSAgIC8qIGRvbnQgdHJ5IG1vcmUgdGhhbiwgc2F5IDMwIHRpbWVzICovCi0gICBmb3IgKGk9MDtpPDMwO2krKykgewotICAgICAgLyogbm93LCB0cnkgdG8gYWxsb2NhdGUgdGhlIG1lbW9yeSAqLwotICAgICAgU01DX1NFTEVDVF9CQU5LKHNtYzkwMDBfYmFzZSwgMik7Ci0gICAgICBfb3V0dyhNQ19BTExPQyB8IG51bVBhZ2VzLCBzbWM5MDAwX2Jhc2UgKyBNTVVfQ01EKTsKLQotICAgICAgc3RhdHVzID0gMDsKLSAgICAgIC8qIHdhaXQgZm9yIHRoZSBtZW1vcnkgYWxsb2NhdGlvbiB0byBmaW5uaXNoICovCi0gICAgICBmb3IgKHRpbWVfb3V0ID0gY3VycnRpY2tzKCkgKyA1KlRJQ0tTX1BFUl9TRUM7IGN1cnJ0aWNrcygpIDwgdGltZV9vdXQ7ICkgewotCSBzdGF0dXMgPSBpbmIoc21jOTAwMF9iYXNlICsgSU5URVJSVVBUKTsKLQkgaWYgKCBzdGF0dXMgJiBJTV9BTExPQ19JTlQgKSB7Ci0JICAgIC8qIGFja25vd2xlZGdlIHRoZSBpbnRlcnJ1cHQgKi8KLQkgICAgX291dGIoSU1fQUxMT0NfSU5ULCBzbWM5MDAwX2Jhc2UgKyBJTlRFUlJVUFQpOwotCSAgICBicmVhazsKLQkgfQotICAgICAgfQotCi0gICAgICBpZiAoKHN0YXR1cyAmIElNX0FMTE9DX0lOVCkgIT0gMCApIHsKLQkgLyogV2UndmUgZ290IHRoZSBtZW1vcnkgKi8KLQkgYnJlYWs7Ci0gICAgICB9IGVsc2UgewotCSBwcmludGYoIlNNQzkwMDA6IE1lbW9yeSBhbGxvY2F0aW9uIHRpbWVkIG91dCwgcmVzZXR0aW5nIE1NVS5cbiIpOwotCSBfb3V0dyhNQ19SRVNFVCwgc21jOTAwMF9iYXNlICsgTU1VX0NNRCk7Ci0gICAgICB9Ci0gICB9Ci0KLSAgIC8qIElmIEkgZ2V0IGhlcmUsIEkgX2tub3dfIHRoZXJlIGlzIGEgcGFja2V0IHNsb3Qgd2FpdGluZyBmb3IgbWUgKi8KLSAgIHBhY2tldF9ubyA9IGluYihzbWM5MDAwX2Jhc2UgKyBQTlJfQVJSICsgMSk7Ci0gICBpZiAocGFja2V0X25vICYgMHg4MCkgewotICAgICAgLyogb3IgaXNuJ3QgdGhlcmU/ICBCQUQgQ0hJUCEgKi8KLSAgICAgIHByaW50ZigiU01DOTAwMDogTWVtb3J5IGFsbG9jYXRpb24gZmFpbGVkLiBcbiIpOwotICAgICAgcmV0dXJuOwotICAgfQotCi0gICAvKiB3ZSBoYXZlIGEgcGFja2V0IGFkZHJlc3MsIHNvIHRlbGwgdGhlIGNhcmQgdG8gdXNlIGl0ICovCi0gICBfb3V0YihwYWNrZXRfbm8sIHNtYzkwMDBfYmFzZSArIFBOUl9BUlIpOwotCi0gICAvKiBwb2ludCB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBwYWNrZXQgKi8KLSAgIF9vdXR3KFBUUl9BVVRPSU5DLCBzbWM5MDAwX2Jhc2UgKyBQT0lOVEVSKTsKLQotI2lmCVNNQzkwMDBfREVCVUcgPiAyCi0gICBwcmludGYoIlRyeWluZyB0byB4bWl0IHBhY2tldCBvZiBsZW5ndGggJWhYXG4iLCBsZW5ndGggKTsKLSNlbmRpZgotCi0gICAvKiBzZW5kIHRoZSBwYWNrZXQgbGVuZ3RoICggKzYgZm9yIHN0YXR1cywgbGVuZ3RoIGFuZCBjdGwgYnl0ZSApCi0gICAgKiBhbmQgdGhlIHN0YXR1cyB3b3JkICggc2V0IHRvIHplcm9zICkgKi8KLSAgIF9vdXR3KDAsIHNtYzkwMDBfYmFzZSArIERBVEFfMSApOwotCi0gICAvKiBzZW5kIHRoZSBwYWNrZXQgbGVuZ3RoICggKzYgZm9yIHN0YXR1cyB3b3JkcywgbGVuZ3RoLCBhbmQgY3RsKSAqLwotICAgX291dGIoKGxlbmd0aCs2KSAmIDB4RkYsICBzbWM5MDAwX2Jhc2UgKyBEQVRBXzEpOwotICAgX291dGIoKGxlbmd0aCs2KSA+PiA4ICwgICBzbWM5MDAwX2Jhc2UgKyBEQVRBXzEpOwotCi0gICAvKiBXcml0ZSB0aGUgY29udGVudHMgb2YgdGhlIHBhY2tldCAqLwotCi0gICAvKiBUaGUgZXRoZXJuZXQgaGVhZGVyIGZpcnN0Li4uICovCi0gICBvdXRzdyhzbWM5MDAwX2Jhc2UgKyBEQVRBXzEsIGQsIEVUSF9BTEVOID4+IDEpOwotICAgb3V0c3coc21jOTAwMF9iYXNlICsgREFUQV8xLCBuaWMtPm5vZGVfYWRkciwgRVRIX0FMRU4gPj4gMSk7Ci0gICBfb3V0dyhodG9ucyh0KSwgc21jOTAwMF9iYXNlICsgREFUQV8xKTsKLQotICAgLyogLi4uIHRoZSBkYXRhIC4uLiAqLwotICAgb3V0c3coc21jOTAwMF9iYXNlICsgREFUQV8xICwgcCwgcyA+PiAxKTsKLQotICAgLyogLi4uIGFuZCB0aGUgbGFzdCBieXRlLCBpZiB0aGVyZSBpcyBvbmUuICAgKi8KLSAgIGlmICgocyAmIDEpID09IDApIHsKLSAgICAgIF9vdXR3KDAsIHNtYzkwMDBfYmFzZSArIERBVEFfMSk7Ci0gICB9IGVsc2UgewotICAgICAgX291dGIocFtzLTFdLCBzbWM5MDAwX2Jhc2UgKyBEQVRBXzEpOwotICAgICAgX291dGIoMHgyMCwgc21jOTAwMF9iYXNlICsgREFUQV8xKTsKLSAgIH0KLQotICAgLyogYW5kIGxldCB0aGUgY2hpcHNldCBkZWFsIHdpdGggaXQgKi8KLSAgIF9vdXR3KE1DX0VOUVVFVUUgLCBzbWM5MDAwX2Jhc2UgKyBNTVVfQ01EKTsKLQotICAgc3RhdHVzID0gMDsgdGltZV9vdXQgPSBjdXJydGlja3MoKSArIDUqVElDS1NfUEVSX1NFQzsKLSAgIGRvIHsKLSAgICAgIHN0YXR1cyA9IGluYihzbWM5MDAwX2Jhc2UgKyBJTlRFUlJVUFQpOwotCi0gICAgICBpZiAoKHN0YXR1cyAmIElNX1RYX0lOVCApICE9IDApIHsKLQkgd29yZCB0eF9zdGF0dXM7Ci0KLQkgLyogYWNrIGludGVycnVwdCAqLwotCSBfb3V0YihJTV9UWF9JTlQsIHNtYzkwMDBfYmFzZSArIElOVEVSUlVQVCk7Ci0KLQkgcGFja2V0X25vID0gaW53KHNtYzkwMDBfYmFzZSArIEZJRk9fUE9SVFMpOwotCSBwYWNrZXRfbm8gJj0gMHg3RjsKLQotCSAvKiBzZWxlY3QgdGhpcyBhcyB0aGUgcGFja2V0IHRvIHJlYWQgZnJvbSAqLwotCSBfb3V0YiggcGFja2V0X25vLCBzbWM5MDAwX2Jhc2UgKyBQTlJfQVJSICk7Ci0KLQkgLyogcmVhZCB0aGUgZmlyc3Qgd29yZCBmcm9tIHRoaXMgcGFja2V0ICovCi0JIF9vdXR3KCBQVFJfQVVUT0lOQyB8IFBUUl9SRUFELCBzbWM5MDAwX2Jhc2UgKyBQT0lOVEVSICk7Ci0KLQkgdHhfc3RhdHVzID0gaW53KCBzbWM5MDAwX2Jhc2UgKyBEQVRBXzEgKTsKLQotCSBpZiAoMCA9PSAodHhfc3RhdHVzICYgVFNfU1VDQ0VTUykpIHsKLSNpZmRlZglTTUM5MDAwX1ZFUkJPU0UKLQkgICAgcHJpbnRmKCJTTUM5MDAwOiBUWCBGQUlMIFNUQVRVUzogJWhYIFxuIiwgdHhfc3RhdHVzKTsKLSNlbmRpZgotCSAgICAvKiByZS1lbmFibGUgdHJhbnNtaXQgKi8KLQkgICAgU01DX1NFTEVDVF9CQU5LKHNtYzkwMDBfYmFzZSwgMCk7Ci0JICAgIF9vdXR3KGludyhzbWM5MDAwX2Jhc2UgKyBUQ1IgKSB8IFRDUl9FTkFCTEUsIHNtYzkwMDBfYmFzZSArIFRDUiApOwotCSB9Ci0KLQkgLyoga2lsbCB0aGUgcGFja2V0ICovCi0JIFNNQ19TRUxFQ1RfQkFOSyhzbWM5MDAwX2Jhc2UsIDIpOwotCSBfb3V0dyhNQ19GUkVFUEtULCBzbWM5MDAwX2Jhc2UgKyBNTVVfQ01EKTsKLQotCSByZXR1cm47Ci0gICAgICB9Ci0gICB9d2hpbGUoY3VycnRpY2tzKCkgPCB0aW1lX291dCk7Ci0KLSAgIHByaW50ZigiU01DOTAwMDogV2FyaW5nIFRYIHRpbWVkIG91dCwgcmVzZXR0aW5nIGJvYXJkXG4iKTsKLSAgIHNtY19yZXNldChzbWM5MDAwX2Jhc2UpOwotICAgcmV0dXJuOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEVUSF9QT0xMIC0gV2FpdCBmb3IgYSBmcmFtZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBpbnQgc21jOTAwMF9wb2xsKHN0cnVjdCBuaWMgKm5pYykKLXsKLSAgIGlmKCFzbWM5MDAwX2Jhc2UpCi0gICAgIHJldHVybiAwOwotCi0gICBTTUNfU0VMRUNUX0JBTksoc21jOTAwMF9iYXNlLCAyKTsKLSAgIGlmIChpbncoc21jOTAwMF9iYXNlICsgRklGT19QT1JUUykgJiBGUF9SWEVNUFRZKQotICAgICByZXR1cm4gMDsKLQotICAgLyogIHN0YXJ0IHJlYWRpbmcgZnJvbSB0aGUgc3RhcnQgb2YgdGhlIHBhY2tldCAqLwotICAgX291dHcoUFRSX1JFQUQgfCBQVFJfUkNWIHwgUFRSX0FVVE9JTkMsIHNtYzkwMDBfYmFzZSArIFBPSU5URVIpOwotCi0gICAvKiBGaXJzdCByZWFkIHRoZSBzdGF0dXMgYW5kIGNoZWNrIHRoYXQgd2UncmUgb2sgKi8KLSAgIGlmICghKGludyhzbWM5MDAwX2Jhc2UgKyBEQVRBXzEpICYgUlNfRVJST1JTKSkgewotICAgICAgLyogTmV4dDogcmVhZCB0aGUgcGFja2V0IGxlbmd0aCBhbmQgbWFzayBvZmYgdGhlIHRvcCBiaXRzICovCi0gICAgICBuaWMtPnBhY2tldGxlbiA9IChpbncoc21jOTAwMF9iYXNlICsgREFUQV8xKSAmIDB4MDdmZik7Ci0KLSAgICAgIC8qIHRoZSBwYWNrZXQgbGVuZ3RoIGluY2x1ZGVzIHRoZSAzIGV4dHJhIHdvcmRzICovCi0gICAgICBuaWMtPnBhY2tldGxlbiAtPSA2OwotI2lmCVNNQzkwMDBfREVCVUcgPiAyCi0gICAgICBwcmludGYoIiBSZWFkaW5nICVkIHdvcmRzIChhbmQgJWQgYnl0ZShzKSlcbiIsCi0JICAgICAgIChuaWMtPnBhY2tldGxlbiA+PiAxKSwgbmljLT5wYWNrZXRsZW4gJiAxKTsKLSNlbmRpZgotICAgICAgLyogcmVhZCB0aGUgcGFja2V0IChhbmQgdGhlIGxhc3QgImV4dHJhIiB3b3JkKSAqLwotICAgICAgaW5zdyhzbWM5MDAwX2Jhc2UgKyBEQVRBXzEsIG5pYy0+cGFja2V0LCAobmljLT5wYWNrZXRsZW4rMikgPj4gMSk7Ci0gICAgICAvKiBpcyB0aGVyZSBhbiBvZGQgbGFzdCBieXRlID8gKi8KLSAgICAgIGlmIChuaWMtPnBhY2tldFtuaWMtPnBhY2tldGxlbisxXSAmIDB4MjApCi0JIG5pYy0+cGFja2V0bGVuKys7Ci0KLSAgICAgIC8qICBlcnJvciBvciBnb29kLCB0ZWxsIHRoZSBjYXJkIHRvIGdldCByaWQgb2YgdGhpcyBwYWNrZXQgKi8KLSAgICAgIF9vdXR3KE1DX1JFTEVBU0UsIHNtYzkwMDBfYmFzZSArIE1NVV9DTUQpOwotICAgICAgcmV0dXJuIDE7Ci0gICB9Ci0KLSAgIHByaW50ZigiU01DOTAwMDogUlggZXJyb3JcbiIpOwotICAgLyogIGVycm9yIG9yIGdvb2QsIHRlbGwgdGhlIGNhcmQgdG8gZ2V0IHJpZCBvZiB0aGlzIHBhY2tldCAqLwotICAgX291dHcoTUNfUkVMRUFTRSwgc21jOTAwMF9iYXNlICsgTU1VX0NNRCk7Ci0gICByZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgc21jOTAwMF9kaXNhYmxlKHN0cnVjdCBuaWMgKm5pYykKLXsKLSAgIGlmKCFzbWM5MDAwX2Jhc2UpCi0gICAgIHJldHVybjsKLQotICAgLyogbm8gbW9yZSBpbnRlcnJ1cHRzIGZvciBtZSAqLwotICAgU01DX1NFTEVDVF9CQU5LKHNtYzkwMDBfYmFzZSwgMik7Ci0gICBfb3V0YiggMCwgc21jOTAwMF9iYXNlICsgSU5UX01BU0spOwotCi0gICAvKiBhbmQgdGVsbCB0aGUgY2FyZCB0byBzdGF5IGF3YXkgZnJvbSB0aGF0IG5hc3R5IG91dHNpZGUgd29ybGQgKi8KLSAgIFNNQ19TRUxFQ1RfQkFOSyhzbWM5MDAwX2Jhc2UsIDApOwotICAgX291dGIoIFJDUl9DTEVBUiwgc21jOTAwMF9iYXNlICsgUkNSICk7Ci0gICBfb3V0YiggVENSX0NMRUFSLCBzbWM5MDAwX2Jhc2UgKyBUQ1IgKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBFVEhfUFJPQkUgLSBMb29rIGZvciBhbiBhZGFwdGVyCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdHJ1Y3QgbmljICpzbWM5MDAwX3Byb2JlKHN0cnVjdCBuaWMgKm5pYywgdW5zaWduZWQgc2hvcnQgKnByb2JlX2FkZHJzKQotewotICAgdW5zaWduZWQgc2hvcnQgICByZXZpc2lvbjsKLSAgIGludAkgICAgICAgICAgICBtZW1vcnk7Ci0gICBpbnQgICAgICAgICAgICAgIG1lZGlhOwotICAgY29uc3QgY2hhciAqCSAgICB2ZXJzaW9uX3N0cmluZzsKLSAgIGNvbnN0IGNoYXIgKgkgICAgaWZfc3RyaW5nOwotICAgaW50ICAgICAgICAgICAgICBpOwotCi0gICAvKgotICAgICogdGhlIFNNQzkwMDAgY2FuIGJlIGF0IGFueSBvZiB0aGUgZm9sbG93aW5nIHBvcnQgYWRkcmVzc2VzLiAgVG8gY2hhbmdlLAotICAgICogZm9yIGEgc2xpZ2h0bHkgZGlmZmVyZW50IGNhcmQsIHlvdSBjYW4gYWRkIGl0IHRvIHRoZSBhcnJheS4gIEtlZXAgaW4KLSAgICAqIG1pbmQgdGhhdCB0aGUgYXJyYXkgbXVzdCBlbmQgaW4gemVyby4KLSAgICAqLwotICAgc3RhdGljIHVuc2lnbmVkIHNob3J0IHBvcnRsaXN0W10gPSB7Ci0jaWZkZWYJU01DOTAwMF9TQ0FOCi0gICAgICBTTUM5MDAwX1NDQU4sCi0jZWxzZQotICAgICAgMHgyMDAsIDB4MjIwLCAweDI0MCwgMHgyNjAsIDB4MjgwLCAweDJBMCwgMHgyQzAsIDB4MkUwLAotICAgICAgMHgzMDAsIDB4MzIwLCAweDM0MCwgMHgzNjAsIDB4MzgwLCAweDNBMCwgMHgzQzAsIDB4M0UwLAotI2VuZGlmCi0gICAgICAwIH07Ci0KLSAgIHByaW50ZigiXG5TTUM5MDAwICVzXG4iLCBzbWM5MDAwX3ZlcnNpb24pOwotI2lmZGVmCVNNQzkwMDBfVkVSQk9TRQotICAgcHJpbnRmKCJDb3B5cmlnaHQgKEMpIDE5OTggRGFuaWVsIEVuZ3N0clx4OTRtXG4iKTsKLSAgIHByaW50ZigiQ29weXJpZ2h0IChDKSAxOTk2IEVyaWMgU3RhaGxtYW5cbiIpOwotI2VuZGlmCi0gICAvKiBpZiBubyBhZGRyZXNzZXMgc3VwcGxpZWQsIGZhbGwgYmFjayBvbiBkZWZhdWx0cyAqLwotICAgaWYgKHByb2JlX2FkZHJzID09IDAgfHwgcHJvYmVfYWRkcnNbMF0gPT0gMCkKLSAgICAgcHJvYmVfYWRkcnMgPSBwb3J0bGlzdDsKLQotICAgLyogY2hlY2sgZXZlcnkgZXRoZXJuZXQgYWRkcmVzcyAqLwotICAgZm9yIChpID0gMDsgcHJvYmVfYWRkcnNbaV07IGkrKykgewotICAgICAgLyogY2hlY2sgdGhpcyBzcGVjaWZpYyBhZGRyZXNzICovCi0gICAgICBpZiAoc21jX3Byb2JlKHByb2JlX2FkZHJzW2ldKSA9PSAwKQotCXNtYzkwMDBfYmFzZSA9IHByb2JlX2FkZHJzW2ldOwotICAgfQotCi0gICAvKiBjb3VsZG4ndCBmaW5kIGFueXRoaW5nICovCi0gICBpZigwID09IHNtYzkwMDBfYmFzZSkKLSAgICAgZ290byBvdXQ7Ci0KLSAgIC8qCi0gICAgKiBHZXQgdGhlIE1BQyBhZGRyZXNzICggYmFuayAxLCByZWdzIDQgLSA5ICkKLSAgICAqLwotICAgU01DX1NFTEVDVF9CQU5LKHNtYzkwMDBfYmFzZSwgMSk7Ci0gICBmb3IgKCBpID0gMDsgaSA8IDY7IGkgKz0gMiApIHsKLSAgICAgIHdvcmQgYWRkcmVzczsKLQotICAgICAgYWRkcmVzcyA9IGludyhzbWM5MDAwX2Jhc2UgKyBBRERSMCArIGkpOwotICAgICAgbmljLT5ub2RlX2FkZHJbaSsxXSA9IGFkZHJlc3MgPj4gODsKLSAgICAgIG5pYy0+bm9kZV9hZGRyW2ldID0gYWRkcmVzcyAmIDB4RkY7Ci0gICB9Ci0KLQotICAgLyogZ2V0IHRoZSBtZW1vcnkgaW5mb3JtYXRpb24gKi8KLSAgIFNNQ19TRUxFQ1RfQkFOSyhzbWM5MDAwX2Jhc2UsIDApOwotICAgbWVtb3J5ID0gKCBpbncoc21jOTAwMF9iYXNlICsgTUNSKSA+PiA5ICkgICYgMHg3OyAgLyogbXVsdGlwbGllciAqLwotICAgbWVtb3J5ICo9IDI1NiAqIChpbncoc21jOTAwMF9iYXNlICsgTUlSKSAmIDB4RkYpOwotCi0gICAvKgotICAgICogTm93LCBJIHdhbnQgdG8gZmluZCBvdXQgbW9yZSBhYm91dCB0aGUgY2hpcC4gIFRoaXMgaXMgc29ydCBvZgotICAgICogcmVkdW5kYW50LCBidXQgaXQncyBjbGVhbmVyIHRvIGhhdmUgaXQgaW4gYm90aCwgcmF0aGVyIHRoYW4gaGF2aW5nCi0gICAgKiBvbmUgVkVSWSBsb25nIHByb2JlIHByb2NlZHVyZS4KLSAgICAqLwotICAgU01DX1NFTEVDVF9CQU5LKHNtYzkwMDBfYmFzZSwgMyk7Ci0gICByZXZpc2lvbiAgPSBpbncoc21jOTAwMF9iYXNlICsgUkVWSVNJT04pOwotICAgdmVyc2lvbl9zdHJpbmcgPSBjaGlwX2lkc1socmV2aXNpb24gPj4gNCkgJiAweEZdOwotCi0gICBpZiAoKChyZXZpc2lvbiAmIDB4RjApID4+IDQgPT0gQ0hJUF85MTk2KSAmJgotICAgICAgICgocmV2aXNpb24gJiAweDBGKSA+PSBSRVZfOTE5NikpIHsKLSAgICAgIC8qIFRoaXMgaXMgYSA5MWM5Ni4gJ2M5NiBoYXMgdGhlIHNhbWUgY2hpcCBpZCBhcyAnYzk0ICg0KSBidXQKLSAgICAgICAqIGEgcmV2aXNpb24gc3RhcnRpbmcgYXQgNiAqLwotICAgICAgdmVyc2lvbl9zdHJpbmcgPSBzbWM5MWM5Nl9pZDsKLSAgIH0KLQotICAgaWYgKCAhdmVyc2lvbl9zdHJpbmcgKSB7Ci0gICAgICAvKiBJIHNob3VsZG4ndCBnZXQgaGVyZSBiZWNhdXNlIHRoaXMgY2FsbCB3YXMgZG9uZSBiZWZvcmUuLi4uICovCi0gICAgICBnb3RvIG91dDsKLSAgIH0KLQotICAgLyogaXMgaXQgdXNpbmcgQVVJIG9yIDEwQmFzZVQgPyAqLwotICAgU01DX1NFTEVDVF9CQU5LKHNtYzkwMDBfYmFzZSwgMSk7Ci0gICBpZiAoaW53KHNtYzkwMDBfYmFzZSArIENPTkZJRykgJiBDRkdfQVVJX1NFTEVDVCkKLSAgICAgbWVkaWEgPSAyOwotICAgZWxzZQotICAgICBtZWRpYSA9IDE7Ci0KLSAgIGlmX3N0cmluZyA9IGludGVyZmFjZXNbbWVkaWEgLSAxXTsKLQotICAgLyogbm93LCByZXNldCB0aGUgY2hpcCwgYW5kIHB1dCBpdCBpbnRvIGEga25vd24gc3RhdGUgKi8KLSAgIHNtY19yZXNldChzbWM5MDAwX2Jhc2UpOwotCi0gICBwcmludGYoIiVzIHJldjolZCBJL08gcG9ydDolaFggSW50ZXJmYWNlOiVzIFJBTTolZCBieXRlcyBcbiIsCi0JICB2ZXJzaW9uX3N0cmluZywgcmV2aXNpb24gJiAweEYsCi0JICBzbWM5MDAwX2Jhc2UsIGlmX3N0cmluZywgbWVtb3J5ICk7Ci0gICAvKgotICAgICogUHJpbnQgdGhlIEV0aGVybmV0IGFkZHJlc3MKLSAgICAqLwotICAgcHJpbnRmKCJFdGhlcm5ldCBNQUMgYWRkcmVzczogJSFcbiIsIG5pYy0+bm9kZV9hZGRyKTsKLQotICAgU01DX1NFTEVDVF9CQU5LKHNtYzkwMDBfYmFzZSwgMCk7Ci0KLSAgIC8qIHNlZSB0aGUgaGVhZGVyIGZpbGUgZm9yIG9wdGlvbnMgaW4gVENSL1JDUiBOT1JNQUwqLwotICAgX291dHcoVENSX05PUk1BTCwgc21jOTAwMF9iYXNlICsgVENSKTsKLSAgIF9vdXR3KFJDUl9OT1JNQUwsIHNtYzkwMDBfYmFzZSArIFJDUik7Ci0KLSAgIC8qIFNlbGVjdCB3aGljaCBpbnRlcmZhY2UgdG8gdXNlICovCi0gICBTTUNfU0VMRUNUX0JBTksoc21jOTAwMF9iYXNlLCAxKTsKLSAgIGlmICggbWVkaWEgPT0gMSApIHsKLSAgICAgIF9vdXR3KCBpbncoIHNtYzkwMDBfYmFzZSArIENPTkZJRyApICYgfkNGR19BVUlfU0VMRUNULAotCSAgIHNtYzkwMDBfYmFzZSArIENPTkZJRyApOwotICAgfQotICAgZWxzZSBpZiAoIG1lZGlhID09IDIgKSB7Ci0gICAgICBfb3V0dyggaW53KCBzbWM5MDAwX2Jhc2UgKyBDT05GSUcgKSB8IENGR19BVUlfU0VMRUNULAotCSAgIHNtYzkwMDBfYmFzZSArIENPTkZJRyApOwotICAgfQotCi0gICBuaWMtPnJlc2V0ID0gc21jOTAwMF9yZXNldDsKLSAgIG5pYy0+cG9sbCA9IHNtYzkwMDBfcG9sbDsKLSAgIG5pYy0+dHJhbnNtaXQgPSBzbWM5MDAwX3RyYW5zbWl0OwotICAgbmljLT5kaXNhYmxlID0gc21jOTAwMF9kaXNhYmxlOwotCi0KLSAgIHJldHVybiBuaWM7Ci0KLW91dDoKLSNpZmRlZglTTUM5MDAwX1ZFUkJPU0UKLSAgIHByaW50ZigiTm8gU01DOTAwMCBhZGFwdGVycyBmb3VuZFxuIik7Ci0jZW5kaWYKLSAgIHNtYzkwMDBfYmFzZSA9IDA7Ci0KLSAgIHJldHVybiAoMCk7Ci19Ci0KLQotCmRpZmYgLU5hdXIgZ3J1Yi0wLjk3Lm9yaWcvbmV0Ym9vdC9zbWM5MDAwLmggZ3J1Yi0wLjk3L25ldGJvb3Qvc21jOTAwMC5oCi0tLSBncnViLTAuOTcub3JpZy9uZXRib290L3NtYzkwMDAuaAkyMDAzLTA3LTA5IDExOjQ1OjM4LjAwMDAwMDAwMCArMDAwMAorKysgZ3J1Yi0wLjk3L25ldGJvb3Qvc21jOTAwMC5oCTE5NzAtMDEtMDEgMDA6MDA6MDAuMDAwMDAwMDAwICswMDAwCkBAIC0xLDIwNSArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogc21jOTAwMC5oCi0gKgotICogQ29weXJpZ2h0IChDKSAxOTk4IGJ5IERhbmllbCBFbmdzdHL2bQotICogQ29weXJpZ2h0IChDKSAxOTk2IGJ5IEVyaWsgU3RhaGxtYW4KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIG1heSBiZSB1c2VkIGFuZCBkaXN0cmlidXRlZCBhY2NvcmRpbmcgdG8gdGhlIHRlcm1zCi0gKiBvZiB0aGUgR05VIFB1YmxpYyBMaWNlbnNlLCBpbmNvcnBvcmF0ZWQgaGVyZWluIGJ5IHJlZmVyZW5jZS4KLSAqCi0gKiBUaGlzIGZpbGUgY29udGFpbnMgcmVnaXN0ZXIgaW5mb3JtYXRpb24gYW5kIGFjY2VzcyBtYWNyb3MgZm9yCi0gKiB0aGUgU01DOTF4eHggY2hpcHNldC4KLSAqCi0gKiBJbmZvcm1hdGlvbiBjb250YWluZWQgaW4gdGhpcyBmaWxlIHdhcyBvYnRhaW5lZCBmcm9tIHRoZSBTTUM5MUM5NAotICogbWFudWFsIGZyb20gU01DLiAgVG8gZ2V0IGEgY29weSwgaWYgeW91IHJlYWxseSB3YW50IG9uZSwgeW91IGNhbiBmaW5kCi0gKiBpbmZvcm1hdGlvbiB1bmRlciB3d3cuc21zYy5jb20gaW4gdGhlIGNvbXBvbmVudHMgZGl2aXNpb24uCi0gKiAoIHRoaXMgdGhhbmtzIHRvIGFkdmljZSBmcm9tIERvbmFsZCBCZWNrZXIgKS4KLSAqCi0gKiBBdXRob3JzCi0gKiAgICAgIERhbmllbCBFbmdzdHL2bSAgICAgICAgICAgICAgICAgICAgICAgICA8ZGFuaWVsLmVuZ3N0cm9tQHJpa3NuZXR0Lm5vPgotICoJRXJpayBTdGFobG1hbgkJCQk8ZXJpa0B2dC5lZHU+Ci0gKgotICogSGlzdG9yeQotICogOTYtMDEtMDYJCSBFcmlrIFN0YWhsbWFuICAgbW92ZWQgZGVmaW5pdGlvbnMgaGVyZSBmcm9tIG1haW4gLmMKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZQotICogOTYtMDEtMTkJCSBFcmlrIFN0YWhsbWFuCSBwb2xpc2hlZCB0aGlzIHVwIHNvbWUsIGFuZCBhZGRlZAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZXR0ZXIgZXJyb3IgaGFuZGxpbmcKLSAqIDk4LTA5LTI1ICAgICAgICAgICAgICBEYW5pZWwgRW5nc3Ry9m0gYWRqdXN0ZWQgZm9yIEV0aGVyYm9vdAotICogOTgtMDktMjcgICAgICAgICAgICAgIERhbmllbCBFbmdzdHL2bSBtb3ZlZCBzb21lIHN0YXRpYyBzdHJpbmdzIGJhY2sgdG8gdGhlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1haW4gLmMgZmlsZQotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotI2lmbmRlZglfU01DOTAwMF9IXwotIyBkZWZpbmUgX1NNQzkwMDBfSF8KLQotLyogSSB3YW50IHNvbWUgc2ltcGxlIHR5cGVzICovCi10eXBlZGVmIHVuc2lnbmVkIGNoYXIJCQlieXRlOwotdHlwZWRlZiB1bnNpZ25lZCBzaG9ydAkJCXdvcmQ7Ci10eXBlZGVmIHVuc2lnbmVkIGxvbmcgaW50CQlkd29yZDsKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqCi0gKiBBIGRlc2NyaXB0aW9uIG9mIHRoZSBTTUMgcmVnaXN0ZXJzIGlzIHByb2JhYmx5IGluIG9yZGVyIGhlcmUsCi0gKiBhbHRob3VnaCBmb3IgZGV0YWlscywgdGhlIFNNQyBkYXRhc2hlZXQgaXMgaW52YWx1YWJsZS4KLSAqCi0gKiBCYXNpY2FsbHksIHRoZSBjaGlwIGhhcyA0IGJhbmtzIG9mIHJlZ2lzdGVycyAoIDAgdG8gMyApLCB3aGljaAotICogYXJlIGFjY2Vzc2VkIGJ5IHdyaXRpbmcgYSBudW1iZXIgaW50byB0aGUgQkFOS19TRUxFQ1QgcmVnaXN0ZXIKLSAqICggSSBhbHNvIHVzZSBhIFNNQ19TRUxFQ1RfQkFOSyBtYWNybyBmb3IgdGhpcyApLgotICoKLSAqIFRoZSBiYW5rcyBhcmUgY29uZmlndXJlZCBzbyB0aGF0IGZvciBtb3N0IHB1cnBvc2VzLCBiYW5rIDIgaXMgYWxsCi0gKiB0aGF0IGlzIG5lZWRlZCBmb3Igc2ltcGxlIHJ1biB0aW1lIHRhc2tzLgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qCi0gKiBCYW5rIFNlbGVjdCBSZWdpc3RlcjoKLSAqCi0gKgkJeXl5eSB5eXl5IDAwMDAgMDB4eAotICoJCXh4CQk9IGJhbmsgbnVtYmVyCi0gKgkJeXl5eSB5eXl5CT0gMHgzMywgZm9yIGlkZW50aWZpY2F0aW9uIHB1cnBvc2VzLgotICovCi0jZGVmaW5lCUJBTktfU0VMRUNUCQkxNAotCi0vKiBCQU5LIDAgICovCi0KLSNkZWZpbmUJVENSCQkwCS8qIHRyYW5zbWl0IGNvbnRyb2wgcmVnaXN0ZXIgKi8KLSNkZWZpbmUgVENSX0VOQUJMRQkweDAwMDEJLyogaWYgdGhpcyBpcyAxLCB3ZSBjYW4gdHJhbnNtaXQgKi8KLSNkZWZpbmUgVENSX0ZEVVBMWAkweDA4MDAJLyogcmVjZWl2ZSBwYWNrZXRzIHNlbnQgb3V0ICovCi0jZGVmaW5lIFRDUl9TVFBfU1FFVAkweDEwMDAJLyogc3RvcCB0cmFuc21pdHRpbmcgaWYgU2lnbmFsIHF1YWxpdHkgZXJyb3IgKi8KLSNkZWZpbmUJVENSX01PTl9DTlMJMHgwNDAwCS8qIG1vbml0b3JzIHRoZSBjYXJyaWVyIHN0YXR1cyAqLwotI2RlZmluZQlUQ1JfUEFEX0VOQUJMRQkweDAwODAJLyogcGFkcyBzaG9ydCBwYWNrZXRzIHRvIDY0IGJ5dGVzICovCi0KLSNkZWZpbmUJVENSX0NMRUFSCTAJLyogZG8gTk9USElORyAqLwotLyogdGhlIG5vcm1hbCBzZXR0aW5ncyBmb3IgdGhlIFRDUiByZWdpc3RlciA6ICovCi0jZGVmaW5lCVRDUl9OT1JNQUwJKFRDUl9FTkFCTEUgfCBUQ1JfUEFEX0VOQUJMRSkKLQotCi0jZGVmaW5lIEVQSF9TVEFUVVMJMgotI2RlZmluZSBFU19MSU5LX09LCTB4NDAwMAkvKiBpcyB0aGUgbGluayBpbnRlZ3JpdHkgb2sgPyAqLwotCi0jZGVmaW5lCVJDUgkJNAotI2RlZmluZSBSQ1JfU09GVFJFU0VUCTB4ODAwMAkvKiByZXNldHMgdGhlIGNoaXAgKi8KLSNkZWZpbmUJUkNSX1NUUklQX0NSQwkweDIwMAkvKiBzdHJpcHMgQ1JDICovCi0jZGVmaW5lIFJDUl9FTkFCTEUJMHgxMDAJLyogSUZGIHRoaXMgaXMgc2V0LCB3ZSBjYW4gcmVjZWl2ZSBwYWNrZXRzICovCi0jZGVmaW5lIFJDUl9BTE1VTAkweDQJLyogcmVjZWl2ZSBhbGwgbXVsdGljYXN0IHBhY2tldHMgKi8KLSNkZWZpbmUJUkNSX1BST01JU0MJMHgyCS8qIGVuYWJsZSBwcm9taXNjdW91cyBtb2RlICovCi0KLS8qIHRoZSBub3JtYWwgc2V0dGluZ3MgZm9yIHRoZSBSQ1IgcmVnaXN0ZXIgOiAqLwotI2RlZmluZQlSQ1JfTk9STUFMCShSQ1JfU1RSSVBfQ1JDIHwgUkNSX0VOQUJMRSkKLSNkZWZpbmUgUkNSX0NMRUFSCTB4MAkJLyogc2V0IGl0IHRvIGEgYmFzZSBzdGF0ZSAqLwotCi0jZGVmaW5lCUNPVU5URVIJCTYKLSNkZWZpbmUJTUlSCQk4Ci0jZGVmaW5lCU1DUgkJMTAKLS8qIDEyIGlzIHJlc2VydmVkICovCi0KLS8qIEJBTksgMSAqLwotI2RlZmluZSBDT05GSUcJCQkwCi0jZGVmaW5lIENGR19BVUlfU0VMRUNUCQkweDEwMAotI2RlZmluZQlCQVNFCQkJMgotI2RlZmluZQlBRERSMAkJCTQKLSNkZWZpbmUJQUREUjEJCQk2Ci0jZGVmaW5lCUFERFIyCQkJOAotI2RlZmluZQlHRU5FUkFMCQkJMTAKLSNkZWZpbmUJQ09OVFJPTAkJCTEyCi0jZGVmaW5lCUNUTF9QT1dFUkRPV04JCTB4MjAwMAotI2RlZmluZQlDVExfTEVfRU5BQkxFCQkweDgwCi0jZGVmaW5lCUNUTF9DUl9FTkFCTEUJCTB4NDAKLSNkZWZpbmUJQ1RMX1RFX0VOQUJMRQkJMHgwMDIwCi0jZGVmaW5lIENUTF9BVVRPX1JFTEVBU0UJMHgwODAwCi0jZGVmaW5lCUNUTF9FUFJPTV9BQ0NFU1MJMHgwMDAzIC8qIGhpZ2ggaWYgRXByb20gaXMgYmVpbmcgcmVhZCAqLwotCi0vKiBCQU5LIDIgKi8KLSNkZWZpbmUgTU1VX0NNRAkJMAotI2RlZmluZSBNQ19CVVNZCQkxCS8qIG9ubHkgcmVhZGFibGUgYml0IGluIHRoZSByZWdpc3RlciAqLwotI2RlZmluZSBNQ19OT1AJCTAKLSNkZWZpbmUJTUNfQUxMT0MJMHgyMAkvKiBvciB3aXRoIG51bWJlciBvZiAyNTYgYnl0ZSBwYWNrZXRzICovCi0jZGVmaW5lCU1DX1JFU0VUCTB4NDAKLSNkZWZpbmUJTUNfUkVNT1ZFCTB4NjAJLyogcmVtb3ZlIHRoZSBjdXJyZW50IHJ4IHBhY2tldCAqLwotI2RlZmluZSBNQ19SRUxFQVNFCTB4ODAJLyogcmVtb3ZlIGFuZCByZWxlYXNlIHRoZSBjdXJyZW50IHJ4IHBhY2tldCAqLwotI2RlZmluZSBNQ19GUkVFUEtUCTB4QTAJLyogUmVsZWFzZSBwYWNrZXQgaW4gUE5SIHJlZ2lzdGVyICovCi0jZGVmaW5lIE1DX0VOUVVFVUUJMHhDMAkvKiBFbnF1ZXVlIHRoZSBwYWNrZXQgZm9yIHRyYW5zbWl0ICovCi0KLSNkZWZpbmUJUE5SX0FSUgkJMgotI2RlZmluZSBGSUZPX1BPUlRTCTQKLQotI2RlZmluZSBGUF9SWEVNUFRZCTB4ODAwMAotI2RlZmluZSBGUF9UWEVNUFRZCTB4ODAKLQotI2RlZmluZQlQT0lOVEVSCQk2Ci0jZGVmaW5lIFBUUl9SRUFECTB4MjAwMAotI2RlZmluZQlQVFJfUkNWCQkweDgwMDAKLSNkZWZpbmUJUFRSX0FVVE9JTkMJMHg0MDAwCi0jZGVmaW5lIFBUUl9BVVRPX0lOQwkweDAwNDAKLQotI2RlZmluZQlEQVRBXzEJCTgKLSNkZWZpbmUJREFUQV8yCQkxMAotI2RlZmluZQlJTlRFUlJVUFQJMTIKLQotI2RlZmluZSBJTlRfTUFTSwkxMwotI2RlZmluZSBJTV9SQ1ZfSU5UCTB4MQotI2RlZmluZQlJTV9UWF9JTlQJMHgyCi0jZGVmaW5lCUlNX1RYX0VNUFRZX0lOVAkweDQKLSNkZWZpbmUJSU1fQUxMT0NfSU5UCTB4OAotI2RlZmluZQlJTV9SWF9PVlJOX0lOVAkweDEwCi0jZGVmaW5lCUlNX0VQSF9JTlQJMHgyMAotI2RlZmluZQlJTV9FUkNWX0lOVAkweDQwIC8qIG5vdCBvbiBTTUM5MTkyICovCi0KLS8qIEJBTksgMyAqLwotI2RlZmluZQlNVUxUSUNBU1QxCTAKLSNkZWZpbmUJTVVMVElDQVNUMgkyCi0jZGVmaW5lCU1VTFRJQ0FTVDMJNAotI2RlZmluZQlNVUxUSUNBU1Q0CTYKLSNkZWZpbmUJTUdNVAkJOAotI2RlZmluZQlSRVZJU0lPTgkxMCAvKiAoIGhpOiBjaGlwIGlkICAgbG93OiByZXYgIyApICovCi0KLQotLyogdGhpcyBpcyBOT1Qgb24gU01DOTE5MiAqLwotI2RlZmluZQlFUkNWCQkxMgotCi0vKiBOb3RlIHRoYXQgOTE5NCBhbmQgOTE5NiBoYXZlIHRoZSBzbWFtZSBjaGlwIGlkLAotICogdGhlIDkxOTYgd2lsbCBoYXZlIHJldmlzaW9ucyBzdGFydGluZyBhdCA2ICovCi0jZGVmaW5lIENISVBfOTE5MAkzCi0jZGVmaW5lIENISVBfOTE5NAk0Ci0jZGVmaW5lIENISVBfOTE5NQk1Ci0jZGVmaW5lIENISVBfOTE5Ngk0Ci0jZGVmaW5lIENISVBfOTExMDAJNwotI2RlZmluZSBDSElQXzkxMTAwRkQJOAotCi0jZGVmaW5lIFJFVl85MTk2CTYKLQotLyoKLSAqIFRyYW5zbWl0IHN0YXR1cyBiaXRzCi0gKi8KLSNkZWZpbmUgVFNfU1VDQ0VTUwkweDAwMDEKLSNkZWZpbmUgVFNfTE9TVENBUgkweDA0MDAKLSNkZWZpbmUgVFNfTEFUQ09MCTB4MDIwMAotI2RlZmluZSBUU18xNkNPTAkweDAwMTAKLQotLyoKLSAqIFJlY2VpdmUgc3RhdHVzIGJpdHMKLSAqLwotI2RlZmluZSBSU19BTEdORVJSCTB4ODAwMAotI2RlZmluZSBSU19CQURDUkMJMHgyMDAwCi0jZGVmaW5lIFJTX09EREZSQU1FCTB4MTAwMAotI2RlZmluZSBSU19UT09MT05HCTB4MDgwMAotI2RlZmluZSBSU19UT09TSE9SVAkweDA0MDAKLSNkZWZpbmUgUlNfTVVMVElDQVNUCTB4MDAwMQotI2RlZmluZSBSU19FUlJPUlMJKFJTX0FMR05FUlIgfCBSU19CQURDUkMgfCBSU19UT09MT05HIHwgUlNfVE9PU0hPUlQpCi0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiAgSSBkZWZpbmUgc29tZSBtYWNyb3MgdG8gbWFrZSBpdCBlYXNpZXIgdG8gZG8gc29tZXdoYXQgY29tbW9uCi0gKiBvciBzbGlnaHRseSBjb21wbGljYXRlZCwgcmVwZWF0ZWQgdGFza3MuCi0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKiBzZWxlY3QgYSByZWdpc3RlciBiYW5rLCAwIHRvIDMgICovCi0KLSNkZWZpbmUgU01DX1NFTEVDVF9CQU5LKHgsIHkpIHsgX291dHcoIHksIHggKyBCQU5LX1NFTEVDVCApOyB9Ci0KLS8qIGRlZmluZSBhIHNtYWxsIGRlbGF5IGZvciB0aGUgcmVzZXQgKi8KLSNkZWZpbmUgU01DX0RFTEFZKHgpIHsgaW53KCB4ICsgUkNSICk7XAotCQkJaW53KCB4ICsgUkNSICk7XAotCQkJaW53KCB4ICsgUkNSICk7IH0KLQotCi0jZW5kaWYJLyogX1NNQ185MDAwX0hfICovCi0KZGlmZiAtTmF1ciBncnViLTAuOTcub3JpZy9uZXRib290L3N0ZGludC5oIGdydWItMC45Ny9uZXRib290L3N0ZGludC5oCi0tLSBncnViLTAuOTcub3JpZy9uZXRib290L3N0ZGludC5oCTE5NzAtMDEtMDEgMDA6MDA6MDAuMDAwMDAwMDAwICswMDAwCisrKyBncnViLTAuOTcvbmV0Ym9vdC9zdGRpbnQuaAkyMDA1LTA4LTMxIDE5OjAzOjM1LjAwMDAwMDAwMCArMDAwMApAQCAtMCwwICsxLDE4IEBACisjaWZuZGVmIFNURElOVF9ICisjZGVmaW5lIFNURElOVF9ICisvKiAKKyAqIEknbSBhcmNoaXRlY3R1cmUgZGVwZW5kZWQuIENoZWNrIG1lIGJlZm9yZSBwb3J0IEdSVUIKKyAqLwordHlwZWRlZiB1bnNpZ25lZCAgICAgICAgICAgc2l6ZV90OworCit0eXBlZGVmIHVuc2lnbmVkIGNoYXIgICAgICB1aW50OF90OwordHlwZWRlZiB1bnNpZ25lZCBzaG9ydCAgICAgdWludDE2X3Q7Cit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgICAgICB1aW50MzJfdDsKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBsb25nIHVpbnQ2NF90OworCit0eXBlZGVmIHNpZ25lZCBjaGFyICAgICAgICBpbnQ4X3Q7Cit0eXBlZGVmIHNpZ25lZCBzaG9ydCAgICAgICBpbnQxNl90OwordHlwZWRlZiBzaWduZWQgbG9uZyAgICAgICAgaW50MzJfdDsKK3R5cGVkZWYgc2lnbmVkIGxvbmcgbG9uZyAgIGludDY0X3Q7CisKKyNlbmRpZiAvKiBTVERJTlRfSCAqLwpkaWZmIC1OYXVyIGdydWItMC45Ny5vcmlnL25ldGJvb3QvdGZ0cC5oIGdydWItMC45Ny9uZXRib290L3RmdHAuaAotLS0gZ3J1Yi0wLjk3Lm9yaWcvbmV0Ym9vdC90ZnRwLmgJMTk3MC0wMS0wMSAwMDowMDowMC4wMDAwMDAwMDAgKzAwMDAKKysrIGdydWItMC45Ny9uZXRib290L3RmdHAuaAkyMDA1LTA4LTMxIDE5OjAzOjM1LjAwMDAwMDAwMCArMDAwMApAQCAtMCwwICsxLDgyIEBACisjaWZuZGVmCV9URlRQX0gKKyNkZWZpbmUJX1RGVFBfSAorCisjaW5jbHVkZSAiaWZfZXRoZXIuaCIKKyNpbmNsdWRlICJpcC5oIgorI2luY2x1ZGUgInVkcC5oIgorCisjaWZuZGVmCU1BWF9URlRQX1JFVFJJRVMKKyNkZWZpbmUgTUFYX1RGVFBfUkVUUklFUwkyMAorI2VuZGlmCisKKy8qIFRoZXNlIHNldHRpbmdzIGhhdmUgc2Vuc2Ugb25seSBpZiBjb21waWxlZCB3aXRoIC1EQ09OR0VTVEVEICovCisvKiB0b3RhbCByZXRyYW5zbWlzc2lvbiB0aW1lb3V0IGluIHRpY2tzICovCisjZGVmaW5lIFRGVFBfVElNRU9VVAkJKDMwKlRJQ0tTX1BFUl9TRUMpCisvKiBwYWNrZXQgcmV0cmFuc21pc3Npb24gdGltZW91dCBpbiB0aWNrcyAqLworI2RlZmluZSBURlRQX1JFWE1UCQkoMypUSUNLU19QRVJfU0VDKQorCisjZGVmaW5lIFRGVFBfUE9SVAk2OQorI2RlZmluZQlURlRQX0RFRkFVTFRTSVpFX1BBQ0tFVAk1MTIKKyNkZWZpbmUJVEZUUF9NQVhfUEFDS0VUCQkxNDMyIC8qIDUxMiAqLworCisjZGVmaW5lIFRGVFBfUlJRCTEKKyNkZWZpbmUgVEZUUF9XUlEJMgorI2RlZmluZSBURlRQX0RBVEEJMworI2RlZmluZSBURlRQX0FDSwk0CisjZGVmaW5lIFRGVFBfRVJST1IJNQorI2RlZmluZSBURlRQX09BQ0sJNgorCisjZGVmaW5lIFRGVFBfQ09ERV9FT0YJMQorI2RlZmluZSBURlRQX0NPREVfTU9SRQkyCisjZGVmaW5lIFRGVFBfQ09ERV9FUlJPUgkzCisjZGVmaW5lIFRGVFBfQ09ERV9CT09UCTQKKyNkZWZpbmUgVEZUUF9DT0RFX0NGRwk1CisKK3N0cnVjdCB0ZnRwX3QgeworCXN0cnVjdCBpcGhkciBpcDsKKwlzdHJ1Y3QgdWRwaGRyIHVkcDsKKwl1aW50MTZfdCBvcGNvZGU7CisJdW5pb24geworCQl1aW50OF90IHJycVtURlRQX0RFRkFVTFRTSVpFX1BBQ0tFVF07CisJCXN0cnVjdCB7CisJCQl1aW50MTZfdCBibG9jazsKKwkJCXVpbnQ4X3QgIGRvd25sb2FkW1RGVFBfTUFYX1BBQ0tFVF07CisJCX0gZGF0YTsKKwkJc3RydWN0IHsKKwkJCXVpbnQxNl90IGJsb2NrOworCQl9IGFjazsKKwkJc3RydWN0IHsKKwkJCXVpbnQxNl90IGVycmNvZGU7CisJCQl1aW50OF90ICBlcnJtc2dbVEZUUF9ERUZBVUxUU0laRV9QQUNLRVRdOworCQl9IGVycjsKKwkJc3RydWN0IHsKKwkJCXVpbnQ4X3QgIGRhdGFbVEZUUF9ERUZBVUxUU0laRV9QQUNLRVQrMl07CisJCX0gb2FjazsKKwl9IHU7Cit9OworCisvKiBkZWZpbmUgYSBzbWFsbGVyIHRmdHAgcGFja2V0IHNvbGVseSBmb3IgbWFraW5nIHJlcXVlc3RzIHRvIGNvbnNlcnZlIHN0YWNrCisgICA1MTIgYnl0ZXMgc2hvdWxkIGJlIGVub3VnaCAqLworc3RydWN0IHRmdHByZXFfdCB7CisJc3RydWN0IGlwaGRyIGlwOworCXN0cnVjdCB1ZHBoZHIgdWRwOworCXVpbnQxNl90IG9wY29kZTsKKwl1bmlvbiB7CisJCXVpbnQ4X3QgcnJxWzUxMl07CisJCXN0cnVjdCB7CisJCQl1aW50MTZfdCBibG9jazsKKwkJfSBhY2s7CisJCXN0cnVjdCB7CisJCQl1aW50MTZfdCBlcnJjb2RlOworCQkJdWludDhfdCAgZXJybXNnWzUxMi0yXTsKKwkJfSBlcnI7CisJfSB1OworfTsKKworI2RlZmluZSBURlRQX01JTl9QQUNLRVQJKHNpemVvZihzdHJ1Y3QgaXBoZHIpICsgc2l6ZW9mKHN0cnVjdCB1ZHBoZHIpICsgNCkKKwordHlwZWRlZiBpbnQgKCpyZWFkX2FjdG9yX3QpKHVuc2lnbmVkIGNoYXIgKiwgdW5zaWduZWQgaW50LCB1bnNpZ25lZCBpbnQsIGludCk7CisKK2ludCB0ZnRwX2ZpbGVfcmVhZChjb25zdCBjaGFyICpuYW1lLCByZWFkX2FjdG9yX3QpOworCisjZW5kaWYJLyogX1RGVFBfSCAqLwpkaWZmIC1OYXVyIGdydWItMC45Ny5vcmlnL25ldGJvb3QvdGczLmMgZ3J1Yi0wLjk3L25ldGJvb3QvdGczLmMKLS0tIGdydWItMC45Ny5vcmlnL25ldGJvb3QvdGczLmMJMTk3MC0wMS0wMSAwMDowMDowMC4wMDAwMDAwMDAgKzAwMDAKKysrIGdydWItMC45Ny9uZXRib290L3RnMy5jCTIwMDUtMDgtMzEgMTk6MDM6MzUuMDAwMDAwMDAwICswMDAwCkBAIC0wLDAgKzEsMzMyMiBAQAorLyogJElkOiBncnViLTAuOTUtZGlza2xlc3MtcGF0Y2gtMi5wYXRjaCx2IDEuMS4xLjEgMjAwNS8wNi8xNCAwODoxODo1MCB3ZXNvbG93cyBFeHAgJAorICogdGczLmM6IEJyb2FkY29tIFRpZ29uMyBldGhlcm5ldCBkcml2ZXIuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAxLCAyMDAyIERhdmlkIFMuIE1pbGxlciAoZGF2ZW1AcmVkaGF0LmNvbSkKKyAqIENvcHlyaWdodCAoQykgMjAwMSwgMjAwMiBKZWZmIEdhcnppayAoamdhcnppa0BtYW5kcmFrZXNvZnQuY29tKQorICogQ29weXJpZ2h0IChDKSAyMDAzIEVyaWMgQmllZGVybWFuIChlYmllZGVybWFuQGxueGkuY29tKSAgW2V0aGVyYm9vdCBwb3J0XQorICovCisKKy8qIDExLTEzLTIwMDMJdGltbGVnZ2UJRml4IElzc3VlIHdpdGggTmV0R2VhciBHQTMwMlQgCisgKiAxMS0xOC0yMDAzICAgZWJpZWRlcm0gICAgICAgIEdlbmVyYWxpemUgTmV0R2VhciBGaXggdG8gd2hhdCB0aGUgY29kZSB3YXMgc3VwcG9zZWQgdG8gYmUuCisgKi8KKworI2luY2x1ZGUgImV0aGVyYm9vdC5oIgorI2luY2x1ZGUgIm5pYy5oIgorI2luY2x1ZGUgInBjaS5oIgorI2luY2x1ZGUgInRpbWVyLmgiCisvKiNpbmNsdWRlICJzdHJpbmcuaCIqLworI2luY2x1ZGUgInRnMy5oIgorCisjZGVmaW5lIFNVUFBPUlRfQ09QUEVSX1BIWSAgMQorI2RlZmluZSBTVVBQT1JUX0ZJQkVSX1BIWSAgIDEKKyNkZWZpbmUgU1VQUE9SVF9MSU5LX1JFUE9SVCAxCisjZGVmaW5lIFNVUFBPUlRfUEFSVE5PX1NUUiAgMQorI2RlZmluZSBTVVBQT1JUX1BIWV9TVFIgICAgIDEKKworc3RydWN0IHRnMyB0ZzM7CisKKy8qIER1bW15IGRlZmluZXMgZm9yIGVycm9yIGhhbmRsaW5nICovCisjZGVmaW5lIEVCVVNZICAxCisjZGVmaW5lIEVOT0RFViAyCisjZGVmaW5lIEVJTlZBTCAzCisjZGVmaW5lIEVOT01FTSA0CisKKworLyogVGhlc2UgbnVtYmVycyBzZWVtIHRvIGJlIGhhcmQgY29kZWQgaW4gdGhlIE5JQyBmaXJtd2FyZSBzb21laG93LgorICogWW91IGNhbid0IGNoYW5nZSB0aGUgcmluZyBzaXplcywgYnV0IHlvdSBjYW4gY2hhbmdlIHdoZXJlIHlvdSBwbGFjZQorICogdGhlbSBpbiB0aGUgTklDIG9uYm9hcmQgbWVtb3J5LgorICovCisjZGVmaW5lIFRHM19SWF9SSU5HX1NJWkUJCTUxMgorI2RlZmluZSBURzNfREVGX1JYX1JJTkdfUEVORElORwkJMjAJLyogUlhfUklOR19QRU5ESU5HIHNlZW1zIHRvIGJlIG8uay4gYXQgMjAgYW5kIDIwMCAqLworI2RlZmluZSBURzNfUlhfUkNCX1JJTkdfU0laRQkxMDI0CisKKy8qCShHRVRfQVNJQ19SRVYodHAtPnBjaV9jaGlwX3Jldl9pZCkgPT0gQVNJQ19SRVZfNTcwNSA/IFwKKwkgNTEyIDogMTAyNCkgKi8KKyAjZGVmaW5lIFRHM19UWF9SSU5HX1NJWkUJCTUxMgorI2RlZmluZSBURzNfREVGX1RYX1JJTkdfUEVORElORwkJKFRHM19UWF9SSU5HX1NJWkUgLSAxKQorCisjZGVmaW5lIFRHM19SWF9SSU5HX0JZVEVTCShzaXplb2Yoc3RydWN0IHRnM19yeF9idWZmZXJfZGVzYykgKiBURzNfUlhfUklOR19TSVpFKQorI2RlZmluZSBURzNfUlhfUkNCX1JJTkdfQllURVMJKHNpemVvZihzdHJ1Y3QgdGczX3J4X2J1ZmZlcl9kZXNjKSAqIFRHM19SWF9SQ0JfUklOR19TSVpFKQorCisjZGVmaW5lIFRHM19UWF9SSU5HX0JZVEVTCShzaXplb2Yoc3RydWN0IHRnM190eF9idWZmZXJfZGVzYykgKiBURzNfVFhfUklOR19TSVpFKQorI2RlZmluZSBORVhUX1RYKE4pCQkoKChOKSArIDEpICYgKFRHM19UWF9SSU5HX1NJWkUgLSAxKSkKKyNkZWZpbmUgUFJFVl9UWChOKQkJKCgoTikgLSAxKSAmIChURzNfVFhfUklOR19TSVpFIC0gMSkpCisKKyNkZWZpbmUgUlhfUEtUX0JVRl9TWgkJKDE1MzYgKyAyICsgNjQpCisKKworc3RhdGljIHN0cnVjdCBic3MgeworCXN0cnVjdCB0ZzNfcnhfYnVmZmVyX2Rlc2Mgcnhfc3RkW1RHM19SWF9SSU5HX1NJWkVdOworCXN0cnVjdCB0ZzNfcnhfYnVmZmVyX2Rlc2MgcnhfcmNiW1RHM19SWF9SQ0JfUklOR19TSVpFXTsKKwlzdHJ1Y3QgdGczX3R4X2J1ZmZlcl9kZXNjIHR4X3JpbmdbVEczX1RYX1JJTkdfU0laRV07CisJc3RydWN0IHRnM19od19zdGF0dXMgICAgICBod19zdGF0dXM7CisJc3RydWN0IHRnM19od19zdGF0cyAgICAgICBod19zdGF0czsKKwl1bnNpZ25lZCBjaGFyICAgICAgICAgICAgIHJ4X2J1ZnNbVEczX0RFRl9SWF9SSU5HX1BFTkRJTkddW1JYX1BLVF9CVUZfU1pdOworfSB0ZzNfYnNzOworCisvKioKKyAqIHBjaV9zYXZlX3N0YXRlIC0gc2F2ZSB0aGUgUENJIGNvbmZpZ3VyYXRpb24gc3BhY2Ugb2YgYSBkZXZpY2UgYmVmb3JlIHN1c3BlbmRpbmcKKyAqIEBkZXY6IC0gUENJIGRldmljZSB0aGF0IHdlJ3JlIGRlYWxpbmcgd2l0aAorICogQGJ1ZmZlcjogLSBidWZmZXIgdG8gaG9sZCBjb25maWcgc3BhY2UgY29udGV4dAorICoKKyAqIEBidWZmZXIgbXVzdCBiZSBsYXJnZSBlbm91Z2ggdG8gaG9sZCB0aGUgZW50aXJlIFBDSSAyLjIgY29uZmlnIHNwYWNlIAorICogKD49IDY0IGJ5dGVzKS4KKyAqLworc3RhdGljIGludCBwY2lfc2F2ZV9zdGF0ZShzdHJ1Y3QgcGNpX2RldmljZSAqZGV2LCB1aW50MzJfdCAqYnVmZmVyKQoreworCWludCBpOworCWZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKQorCQlwY2lfcmVhZF9jb25maWdfZHdvcmQoZGV2LCBpICogNCwmYnVmZmVyW2ldKTsKKwlyZXR1cm4gMDsKK30KKworLyoqIAorICogcGNpX3Jlc3RvcmVfc3RhdGUgLSBSZXN0b3JlIHRoZSBzYXZlZCBzdGF0ZSBvZiBhIFBDSSBkZXZpY2UKKyAqIEBkZXY6IC0gUENJIGRldmljZSB0aGF0IHdlJ3JlIGRlYWxpbmcgd2l0aAorICogQGJ1ZmZlcjogLSBzYXZlZCBQQ0kgY29uZmlnIHNwYWNlCisgKgorICovCitzdGF0aWMgaW50IHBjaV9yZXN0b3JlX3N0YXRlKHN0cnVjdCBwY2lfZGV2aWNlICpkZXYsIHVpbnQzMl90ICpidWZmZXIpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykKKwkJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChkZXYsaSAqIDQsIGJ1ZmZlcltpXSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHRnM193cml0ZV9pbmRpcmVjdF9yZWczMih1aW50MzJfdCBvZmYsIHVpbnQzMl90IHZhbCkKK3sKKwlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKHRnMy5wZGV2LCBURzNQQ0lfUkVHX0JBU0VfQUREUiwgb2ZmKTsKKwlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKHRnMy5wZGV2LCBURzNQQ0lfUkVHX0RBVEEsIHZhbCk7Cit9CisKKyNkZWZpbmUgdHczMihyZWcsdmFsKQkJdGczX3dyaXRlX2luZGlyZWN0X3JlZzMyKChyZWcpLCh2YWwpKQorI2RlZmluZSB0dzMyX21haWxib3gocmVnLCB2YWwpCXdyaXRlbCgoKHZhbCkgJiAweGZmZmZmZmZmKSwgdGczLnJlZ3MgKyAocmVnKSkKKyNkZWZpbmUgdHcxNihyZWcsdmFsKQkJd3JpdGV3KCgodmFsKSAmIDB4ZmZmZiksIHRnMy5yZWdzICsgKHJlZykpCisjZGVmaW5lIHR3OChyZWcsdmFsKQkJd3JpdGViKCgodmFsKSAmIDB4ZmYpLCB0ZzMucmVncyArIChyZWcpKQorI2RlZmluZSB0cjMyKHJlZykJCXJlYWRsKHRnMy5yZWdzICsgKHJlZykpCisjZGVmaW5lIHRyMTYocmVnKQkJcmVhZHcodGczLnJlZ3MgKyAocmVnKSkKKyNkZWZpbmUgdHI4KHJlZykJCXJlYWRiKHRnMy5yZWdzICsgKHJlZykpCisKK3N0YXRpYyB2b2lkIHR3MzJfY2FyZWZ1bGx5KHVpbnQzMl90IHJlZywgdWludDMyX3QgdmFsKQoreworCXR3MzIocmVnLCB2YWwpOworCXRyMzIocmVnKTsKKwl1ZGVsYXkoMTAwKTsKK30KKworc3RhdGljIHZvaWQgdHczMl9tYWlsYm94Mih1aW50MzJfdCByZWcsIHVpbnQzMl90IHZhbCkKK3sKKwl0dzMyX21haWxib3gocmVnLCB2YWwpOworCXRyMzIocmVnKTsKK30KKworc3RhdGljIHZvaWQgdGczX3dyaXRlX21lbSh1aW50MzJfdCBvZmYsIHVpbnQzMl90IHZhbCkKK3sKKwlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKHRnMy5wZGV2LCBURzNQQ0lfTUVNX1dJTl9CQVNFX0FERFIsIG9mZik7CisJcGNpX3dyaXRlX2NvbmZpZ19kd29yZCh0ZzMucGRldiwgVEczUENJX01FTV9XSU5fREFUQSwgdmFsKTsKKworCS8qIEFsd2F5cyBsZWF2ZSB0aGlzIGFzIHplcm8uICovCisJcGNpX3dyaXRlX2NvbmZpZ19kd29yZCh0ZzMucGRldiwgVEczUENJX01FTV9XSU5fQkFTRV9BRERSLCAwKTsKK30KKworc3RhdGljIHZvaWQgdGczX3JlYWRfbWVtKHVpbnQzMl90IG9mZiwgdWludDMyX3QgKnZhbCkKK3sKKwlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKHRnMy5wZGV2LCBURzNQQ0lfTUVNX1dJTl9CQVNFX0FERFIsIG9mZik7CisJcGNpX3JlYWRfY29uZmlnX2R3b3JkKHRnMy5wZGV2LCBURzNQQ0lfTUVNX1dJTl9EQVRBLCB2YWwpOworCisJLyogQWx3YXlzIGxlYXZlIHRoaXMgYXMgemVyby4gKi8KKwlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKHRnMy5wZGV2LCBURzNQQ0lfTUVNX1dJTl9CQVNFX0FERFIsIDApOworfQorCitzdGF0aWMgdm9pZCB0ZzNfZGlzYWJsZV9pbnRzKHN0cnVjdCB0ZzMgKnRwKQoreworCXR3MzIoVEczUENJX01JU0NfSE9TVF9DVFJMLAorCSAgICAgKHRwLT5taXNjX2hvc3RfY3RybCB8IE1JU0NfSE9TVF9DVFJMX01BU0tfUENJX0lOVCkpOworCXR3MzJfbWFpbGJveDIoTUFJTEJPWF9JTlRFUlJVUFRfMCArIFRHM182NEJJVF9SRUdfTE9XLCAweDAwMDAwMDAxKTsKK30KKworc3RhdGljIHZvaWQgdGczX3N3aXRjaF9jbG9ja3Moc3RydWN0IHRnMyAqdHApCit7CisJdWludDMyX3Qgb3JpZ19jbG9ja19jdHJsLCBjbG9ja19jdHJsOworCisJY2xvY2tfY3RybCA9IHRyMzIoVEczUENJX0NMT0NLX0NUUkwpOworCisJb3JpZ19jbG9ja19jdHJsID0gY2xvY2tfY3RybDsKKwljbG9ja19jdHJsICY9IChDTE9DS19DVFJMX0ZPUkNFX0NMS1JVTiB8IENMT0NLX0NUUkxfQ0xLUlVOX09FTkFCTEUgfCAweDFmKTsKKwl0cC0+cGNpX2Nsb2NrX2N0cmwgPSBjbG9ja19jdHJsOworCQorCWlmICgoR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpICE9IEFTSUNfUkVWXzU3MDUpICYmCisJCShvcmlnX2Nsb2NrX2N0cmwgJiBDTE9DS19DVFJMXzQ0TUhaX0NPUkUpIT0wKSB7CisJCXR3MzJfY2FyZWZ1bGx5KFRHM1BDSV9DTE9DS19DVFJMLCAKKwkJCWNsb2NrX2N0cmwgfCAoQ0xPQ0tfQ1RSTF80NE1IWl9DT1JFIHwgQ0xPQ0tfQ1RSTF9BTFRDTEspKTsKKwkJdHczMl9jYXJlZnVsbHkoVEczUENJX0NMT0NLX0NUUkwsIAorCQkJY2xvY2tfY3RybCB8IChDTE9DS19DVFJMX0FMVENMSykpOworCX0KKwl0dzMyX2NhcmVmdWxseShURzNQQ0lfQ0xPQ0tfQ1RSTCwgY2xvY2tfY3RybCk7Cit9CisKKyNkZWZpbmUgUEhZX0JVU1lfTE9PUFMJNTAwMAorCitzdGF0aWMgaW50IHRnM19yZWFkcGh5KHN0cnVjdCB0ZzMgKnRwLCBpbnQgcmVnLCB1aW50MzJfdCAqdmFsKQoreworCXVpbnQzMl90IGZyYW1lX3ZhbDsKKwlpbnQgbG9vcHMsIHJldDsKKworCXR3MzJfY2FyZWZ1bGx5KE1BQ19NSV9NT0RFLCB0cC0+bWlfbW9kZSAmIH5NQUNfTUlfTU9ERV9BVVRPX1BPTEwpOworCisJKnZhbCA9IDB4ZmZmZmZmZmY7CisKKwlmcmFtZV92YWwgID0gKChQSFlfQUREUiA8PCBNSV9DT01fUEhZX0FERFJfU0hJRlQpICYKKwkJICAgICAgTUlfQ09NX1BIWV9BRERSX01BU0spOworCWZyYW1lX3ZhbCB8PSAoKHJlZyA8PCBNSV9DT01fUkVHX0FERFJfU0hJRlQpICYKKwkJICAgICAgTUlfQ09NX1JFR19BRERSX01BU0spOworCWZyYW1lX3ZhbCB8PSAoTUlfQ09NX0NNRF9SRUFEIHwgTUlfQ09NX1NUQVJUKTsKKwkKKwl0dzMyX2NhcmVmdWxseShNQUNfTUlfQ09NLCBmcmFtZV92YWwpOworCisJbG9vcHMgPSBQSFlfQlVTWV9MT09QUzsKKwl3aGlsZSAobG9vcHMtLSA+IDApIHsKKwkJdWRlbGF5KDEwKTsKKwkJZnJhbWVfdmFsID0gdHIzMihNQUNfTUlfQ09NKTsKKworCQlpZiAoKGZyYW1lX3ZhbCAmIE1JX0NPTV9CVVNZKSA9PSAwKSB7CisJCQl1ZGVsYXkoNSk7CisJCQlmcmFtZV92YWwgPSB0cjMyKE1BQ19NSV9DT00pOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlyZXQgPSAtRUJVU1k7CisJaWYgKGxvb3BzID4gMCkgeworCQkqdmFsID0gZnJhbWVfdmFsICYgTUlfQ09NX0RBVEFfTUFTSzsKKwkJcmV0ID0gMDsKKwl9CisKKwl0dzMyX2NhcmVmdWxseShNQUNfTUlfTU9ERSwgdHAtPm1pX21vZGUpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCB0ZzNfd3JpdGVwaHkoc3RydWN0IHRnMyAqdHAsIGludCByZWcsIHVpbnQzMl90IHZhbCkKK3sKKwl1aW50MzJfdCBmcmFtZV92YWw7CisJaW50IGxvb3BzLCByZXQ7CisKKwl0dzMyX2NhcmVmdWxseShNQUNfTUlfTU9ERSwgdHAtPm1pX21vZGUgJiB+TUFDX01JX01PREVfQVVUT19QT0xMKTsKKworCWZyYW1lX3ZhbCAgPSAoKFBIWV9BRERSIDw8IE1JX0NPTV9QSFlfQUREUl9TSElGVCkgJgorCQkgICAgICBNSV9DT01fUEhZX0FERFJfTUFTSyk7CisJZnJhbWVfdmFsIHw9ICgocmVnIDw8IE1JX0NPTV9SRUdfQUREUl9TSElGVCkgJgorCQkgICAgICBNSV9DT01fUkVHX0FERFJfTUFTSyk7CisJZnJhbWVfdmFsIHw9ICh2YWwgJiBNSV9DT01fREFUQV9NQVNLKTsKKwlmcmFtZV92YWwgfD0gKE1JX0NPTV9DTURfV1JJVEUgfCBNSV9DT01fU1RBUlQpOworCQorCXR3MzJfY2FyZWZ1bGx5KE1BQ19NSV9DT00sIGZyYW1lX3ZhbCk7CisKKwlsb29wcyA9IFBIWV9CVVNZX0xPT1BTOworCXdoaWxlIChsb29wcy0tID4gMCkgeworCQl1ZGVsYXkoMTApOworCQlmcmFtZV92YWwgPSB0cjMyKE1BQ19NSV9DT00pOworCQlpZiAoKGZyYW1lX3ZhbCAmIE1JX0NPTV9CVVNZKSA9PSAwKSB7CisJCQl1ZGVsYXkoNSk7CisJCQlmcmFtZV92YWwgPSB0cjMyKE1BQ19NSV9DT00pOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlyZXQgPSAtRUJVU1k7CisJaWYgKGxvb3BzID4gMCkKKwkJcmV0ID0gMDsKKworCXR3MzJfY2FyZWZ1bGx5KE1BQ19NSV9NT0RFLCB0cC0+bWlfbW9kZSk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHRnM193cml0ZWRzcChzdHJ1Y3QgdGczICp0cCwgdWludDE2X3QgYWRkciwgdWludDE2X3QgdmFsKQoreworCWludCBlcnI7CisJZXJyICA9IHRnM193cml0ZXBoeSh0cCwgTUlJX1RHM19EU1BfQUREUkVTUywgYWRkcik7CisJZXJyIHw9IHRnM193cml0ZXBoeSh0cCwgTUlJX1RHM19EU1BfUldfUE9SVCwgdmFsKTsKKwlyZXR1cm4gZXJyOworfQorCisKK3N0YXRpYyB2b2lkIHRnM19waHlfc2V0X3dpcmVzcGVlZChzdHJ1Y3QgdGczICp0cCkKK3sKKwl1aW50MzJfdCB2YWw7CisKKwlpZiAodHAtPnRnM19mbGFnczIgJiBURzNfRkxHMl9OT19FVEhfV0lSRV9TUEVFRCkKKwkJcmV0dXJuOworCisJdGczX3dyaXRlcGh5KHRwLCBNSUlfVEczX0FVWF9DVFJMLCAweDcwMDcpOworCXRnM19yZWFkcGh5KHRwLCBNSUlfVEczX0FVWF9DVFJMLCAmdmFsKTsKKwl0ZzNfd3JpdGVwaHkodHAsIE1JSV9URzNfQVVYX0NUUkwsICh2YWwgfCAoMSA8PCAxNSkgfCAoMSA8PCA0KSkpOworfQorCitzdGF0aWMgaW50IHRnM19ibWNyX3Jlc2V0KHN0cnVjdCB0ZzMgKnRwKQoreworCXVpbnQzMl90IHBoeV9jb250cm9sOworCWludCBsaW1pdCwgZXJyOworCisJLyogT0ssIHJlc2V0IGl0LCBhbmQgcG9sbCB0aGUgQk1DUl9SRVNFVCBiaXQgdW50aWwgaXQKKwkgKiBjbGVhcnMgb3Igd2UgdGltZSBvdXQuCisJICovCisJcGh5X2NvbnRyb2wgPSBCTUNSX1JFU0VUOworCWVyciA9IHRnM193cml0ZXBoeSh0cCwgTUlJX0JNQ1IsIHBoeV9jb250cm9sKTsKKwlpZiAoZXJyICE9IDApCisJCXJldHVybiAtRUJVU1k7CisKKwlsaW1pdCA9IDUwMDA7CisJd2hpbGUgKGxpbWl0LS0pIHsKKwkJZXJyID0gdGczX3JlYWRwaHkodHAsIE1JSV9CTUNSLCAmcGh5X2NvbnRyb2wpOworCQlpZiAoZXJyICE9IDApCisJCQlyZXR1cm4gLUVCVVNZOworCisJCWlmICgocGh5X2NvbnRyb2wgJiBCTUNSX1JFU0VUKSA9PSAwKSB7CisJCQl1ZGVsYXkoNDApOworCQkJYnJlYWs7CisJCX0KKwkJdWRlbGF5KDEwKTsKKwl9CisJaWYgKGxpbWl0IDw9IDApCisJCXJldHVybiAtRUJVU1k7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB0ZzNfd2FpdF9tYWNyb19kb25lKHN0cnVjdCB0ZzMgKnRwKQoreworCWludCBsaW1pdCA9IDEwMDsKKworCXdoaWxlIChsaW1pdC0tKSB7CisJCXVpbnQzMl90IHRtcDMyOworCisJCXRnM19yZWFkcGh5KHRwLCAweDE2LCAmdG1wMzIpOworCQlpZiAoKHRtcDMyICYgMHgxMDAwKSA9PSAwKQorCQkJYnJlYWs7CisJfQorCWlmIChsaW1pdCA8PSAwKQorCQlyZXR1cm4gLUVCVVNZOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdGczX3BoeV93cml0ZV9hbmRfY2hlY2tfdGVzdHBhdChzdHJ1Y3QgdGczICp0cCwgaW50ICpyZXNldHApCit7CisJc3RhdGljIGNvbnN0IHVpbnQzMl90IHRlc3RfcGF0WzRdWzZdID0geworCXsgMHgwMDAwNTU1NSwgMHgwMDAwMDAwNSwgMHgwMDAwMmFhYSwgMHgwMDAwMDAwYSwgMHgwMDAwMzQ1NiwgMHgwMDAwMDAwMyB9LAorCXsgMHgwMDAwMmFhYSwgMHgwMDAwMDAwYSwgMHgwMDAwMzMzMywgMHgwMDAwMDAwMywgMHgwMDAwNzg5YSwgMHgwMDAwMDAwNSB9LAorCXsgMHgwMDAwNWE1YSwgMHgwMDAwMDAwNSwgMHgwMDAwMmE2YSwgMHgwMDAwMDAwYSwgMHgwMDAwMWJjZCwgMHgwMDAwMDAwMyB9LAorCXsgMHgwMDAwMmE1YSwgMHgwMDAwMDAwYSwgMHgwMDAwMzNjMywgMHgwMDAwMDAwMywgMHgwMDAwMmVmMSwgMHgwMDAwMDAwNSB9CisJfTsKKwlpbnQgY2hhbjsKKworCWZvciAoY2hhbiA9IDA7IGNoYW4gPCA0OyBjaGFuKyspIHsKKwkJaW50IGk7CisKKwkJdGczX3dyaXRlcGh5KHRwLCBNSUlfVEczX0RTUF9BRERSRVNTLAorCQkJKGNoYW4gKiAweDIwMDApIHwgMHgwMjAwKTsKKwkJdGczX3dyaXRlcGh5KHRwLCAweDE2LCAweDAwMDIpOworCisJCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspCisJCQl0ZzNfd3JpdGVwaHkodHAsIE1JSV9URzNfRFNQX1JXX1BPUlQsCisJCQkJdGVzdF9wYXRbY2hhbl1baV0pOworCisJCXRnM193cml0ZXBoeSh0cCwgMHgxNiwgMHgwMjAyKTsKKwkJaWYgKHRnM193YWl0X21hY3JvX2RvbmUodHApKSB7CisJCQkqcmVzZXRwID0gMTsKKwkJCXJldHVybiAtRUJVU1k7CisJCX0KKworCQl0ZzNfd3JpdGVwaHkodHAsIE1JSV9URzNfRFNQX0FERFJFU1MsCisJCQkgICAgIChjaGFuICogMHgyMDAwKSB8IDB4MDIwMCk7CisJCXRnM193cml0ZXBoeSh0cCwgMHgxNiwgMHgwMDgyKTsKKwkJaWYgKHRnM193YWl0X21hY3JvX2RvbmUodHApKSB7CisJCQkqcmVzZXRwID0gMTsKKwkJCXJldHVybiAtRUJVU1k7CisJCX0KKworCQl0ZzNfd3JpdGVwaHkodHAsIDB4MTYsIDB4MDgwMik7CisJCWlmICh0ZzNfd2FpdF9tYWNyb19kb25lKHRwKSkgeworCQkJKnJlc2V0cCA9IDE7CisJCQlyZXR1cm4gLUVCVVNZOworCQl9CisKKwkJZm9yIChpID0gMDsgaSA8IDY7IGkgKz0gMikgeworCQkJdWludDMyX3QgbG93LCBoaWdoOworCisJCQl0ZzNfcmVhZHBoeSh0cCwgTUlJX1RHM19EU1BfUldfUE9SVCwgJmxvdyk7CisJCQl0ZzNfcmVhZHBoeSh0cCwgTUlJX1RHM19EU1BfUldfUE9SVCwgJmhpZ2gpOworCQkJaWYgKHRnM193YWl0X21hY3JvX2RvbmUodHApKSB7CisJCQkJKnJlc2V0cCA9IDE7CisJCQkJcmV0dXJuIC1FQlVTWTsKKwkJCX0KKwkJCWxvdyAmPSAweDdmZmY7CisJCQloaWdoICY9IDB4MDAwZjsKKwkJCWlmIChsb3cgIT0gdGVzdF9wYXRbY2hhbl1baV0gfHwKKwkJCSAgICBoaWdoICE9IHRlc3RfcGF0W2NoYW5dW2krMV0pIHsKKwkJCQl0ZzNfd3JpdGVwaHkodHAsIE1JSV9URzNfRFNQX0FERFJFU1MsIDB4MDAwYik7CisJCQkJdGczX3dyaXRlcGh5KHRwLCBNSUlfVEczX0RTUF9SV19QT1JULCAweDQwMDEpOworCQkJCXRnM193cml0ZXBoeSh0cCwgTUlJX1RHM19EU1BfUldfUE9SVCwgMHg0MDA1KTsKKworCQkJCXJldHVybiAtRUJVU1k7CisJCQl9CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB0ZzNfcGh5X3Jlc2V0X2NoYW5wYXQoc3RydWN0IHRnMyAqdHApCit7CisJaW50IGNoYW47CisKKwlmb3IgKGNoYW4gPSAwOyBjaGFuIDwgNDsgY2hhbisrKSB7CisJCWludCBpOworCisJCXRnM193cml0ZXBoeSh0cCwgTUlJX1RHM19EU1BfQUREUkVTUywKKwkJCSAgICAgKGNoYW4gKiAweDIwMDApIHwgMHgwMjAwKTsKKwkJdGczX3dyaXRlcGh5KHRwLCAweDE2LCAweDAwMDIpOworCQlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQorCQkJdGczX3dyaXRlcGh5KHRwLCBNSUlfVEczX0RTUF9SV19QT1JULCAweDAwMCk7CisJCXRnM193cml0ZXBoeSh0cCwgMHgxNiwgMHgwMjAyKTsKKwkJaWYgKHRnM193YWl0X21hY3JvX2RvbmUodHApKQorCQkJcmV0dXJuIC1FQlVTWTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB0ZzNfcGh5X3Jlc2V0XzU3MDNfNF81KHN0cnVjdCB0ZzMgKnRwKQoreworCXVpbnQzMl90IHJlZzMyLCBwaHk5X29yaWc7CisJaW50IHJldHJpZXMsIGRvX3BoeV9yZXNldCwgZXJyOworCisJcmV0cmllcyA9IDEwOworCWRvX3BoeV9yZXNldCA9IDE7CisJZG8geworCQlpZiAoZG9fcGh5X3Jlc2V0KSB7CisJCQllcnIgPSB0ZzNfYm1jcl9yZXNldCh0cCk7CisJCQlpZiAoZXJyKQorCQkJCXJldHVybiBlcnI7CisJCQlkb19waHlfcmVzZXQgPSAwOworCQl9CisJCQorCQkvKiBEaXNhYmxlIHRyYW5zbWl0dGVyIGFuZCBpbnRlcnJ1cHQuICAqLworCQl0ZzNfcmVhZHBoeSh0cCwgTUlJX1RHM19FWFRfQ1RSTCwgJnJlZzMyKTsKKwkJcmVnMzIgfD0gMHgzMDAwOworCQl0ZzNfd3JpdGVwaHkodHAsIE1JSV9URzNfRVhUX0NUUkwsIHJlZzMyKTsKKworCQkvKiBTZXQgZnVsbC1kdXBsZXgsIDEwMDAgbWJwcy4gICovCisJCXRnM193cml0ZXBoeSh0cCwgTUlJX0JNQ1IsCisJCQlCTUNSX0ZVTExEUExYIHwgVEczX0JNQ1JfU1BFRUQxMDAwKTsKKworCQkvKiBTZXQgdG8gbWFzdGVyIG1vZGUuICAqLworCQl0ZzNfcmVhZHBoeSh0cCwgTUlJX1RHM19DVFJMLCAmcGh5OV9vcmlnKTsKKwkJdGczX3dyaXRlcGh5KHRwLCBNSUlfVEczX0NUUkwsCisJCQkoTUlJX1RHM19DVFJMX0FTX01BU1RFUiB8CisJCQkJTUlJX1RHM19DVFJMX0VOQUJMRV9BU19NQVNURVIpKTsKKworCQkvKiBFbmFibGUgU01fRFNQX0NMT0NLIGFuZCA2ZEIuICAqLworCQl0ZzNfd3JpdGVwaHkodHAsIE1JSV9URzNfQVVYX0NUUkwsIDB4MGMwMCk7CisKKwkJLyogQmxvY2sgdGhlIFBIWSBjb250cm9sIGFjY2Vzcy4gICovCisJCXRnM193cml0ZXBoeSh0cCwgTUlJX1RHM19EU1BfQUREUkVTUywgMHg4MDA1KTsKKwkJdGczX3dyaXRlcGh5KHRwLCBNSUlfVEczX0RTUF9SV19QT1JULCAweDA4MDApOworCisJCWVyciA9IHRnM19waHlfd3JpdGVfYW5kX2NoZWNrX3Rlc3RwYXQodHAsICZkb19waHlfcmVzZXQpOworCQlpZiAoIWVycikKKwkJCWJyZWFrOworCX0gd2hpbGUgKC0tcmV0cmllcyk7CisKKwllcnIgPSB0ZzNfcGh5X3Jlc2V0X2NoYW5wYXQodHApOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwl0ZzNfd3JpdGVwaHkodHAsIE1JSV9URzNfRFNQX0FERFJFU1MsIDB4ODAwNSk7CisJdGczX3dyaXRlcGh5KHRwLCBNSUlfVEczX0RTUF9SV19QT1JULCAweDAwMDApOworCisJdGczX3dyaXRlcGh5KHRwLCBNSUlfVEczX0RTUF9BRERSRVNTLCAweDgyMDApOworCXRnM193cml0ZXBoeSh0cCwgMHgxNiwgMHgwMDAwKTsKKworCXRnM193cml0ZXBoeSh0cCwgTUlJX1RHM19BVVhfQ1RSTCwgMHgwNDAwKTsKKworCXRnM193cml0ZXBoeSh0cCwgTUlJX1RHM19DVFJMLCBwaHk5X29yaWcpOworCisJdGczX3JlYWRwaHkodHAsIE1JSV9URzNfRVhUX0NUUkwsICZyZWczMik7CisJcmVnMzIgJj0gfjB4MzAwMDsKKwl0ZzNfd3JpdGVwaHkodHAsIE1JSV9URzNfRVhUX0NUUkwsIHJlZzMyKTsKKworCXJldHVybiBlcnI7Cit9CisKKy8qIFRoaXMgd2lsbCByZXNldCB0aGUgdGlnb24zIFBIWSBpZiB0aGVyZSBpcyBubyB2YWxpZAorICogbGluay4KKyAqLworc3RhdGljIGludCB0ZzNfcGh5X3Jlc2V0KHN0cnVjdCB0ZzMgKnRwKQoreworCXVpbnQzMl90IHBoeV9zdGF0dXM7CisJaW50IGVycjsKKworCWVyciAgPSB0ZzNfcmVhZHBoeSh0cCwgTUlJX0JNU1IsICZwaHlfc3RhdHVzKTsKKwllcnIgfD0gdGczX3JlYWRwaHkodHAsIE1JSV9CTVNSLCAmcGh5X3N0YXR1cyk7CisJaWYgKGVyciAhPSAwKQorCQlyZXR1cm4gLUVCVVNZOworCisJaWYgKChHRVRfQVNJQ19SRVYodHAtPnBjaV9jaGlwX3Jldl9pZCkgPT0gQVNJQ19SRVZfNTcwMykgfHwKKwkJKEdFVF9BU0lDX1JFVih0cC0+cGNpX2NoaXBfcmV2X2lkKSA9PSBBU0lDX1JFVl81NzA0KSB8fAorCQkoR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpID09IEFTSUNfUkVWXzU3MDUpKSB7CisJCWVyciA9IHRnM19waHlfcmVzZXRfNTcwM180XzUodHApOworCQlpZiAoZXJyKQorCQkJcmV0dXJuIGVycjsKKwkJZ290byBvdXQ7CisJfQorCWVyciA9IHRnM19ibWNyX3Jlc2V0KHRwKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworIG91dDoKKwl0ZzNfcGh5X3NldF93aXJlc3BlZWQodHApOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCB0ZzNfc2V0X3Bvd2VyX3N0YXRlXzAoc3RydWN0IHRnMyAqdHApCit7CisJdWludDE2X3QgcG93ZXJfY29udHJvbDsKKwlpbnQgcG0gPSB0cC0+cG1fY2FwOworCisJLyogTWFrZSBzdXJlIHJlZ2lzdGVyIGFjY2Vzc2VzIChpbmRpcmVjdCBvciBvdGhlcndpc2UpCisJICogd2lsbCBmdW5jdGlvbiBjb3JyZWN0bHkuCisJICovCisJcGNpX3dyaXRlX2NvbmZpZ19kd29yZCh0cC0+cGRldiwgIFRHM1BDSV9NSVNDX0hPU1RfQ1RSTCwgdHAtPm1pc2NfaG9zdF9jdHJsKTsKKworCXBjaV9yZWFkX2NvbmZpZ193b3JkKHRwLT5wZGV2LCBwbSArIFBDSV9QTV9DVFJMLCAmcG93ZXJfY29udHJvbCk7CisKKwlwb3dlcl9jb250cm9sIHw9IFBDSV9QTV9DVFJMX1BNRV9TVEFUVVM7CisJcG93ZXJfY29udHJvbCAmPSB+KFBDSV9QTV9DVFJMX1NUQVRFX01BU0spOworCXBvd2VyX2NvbnRyb2wgfD0gMDsKKwlwY2lfd3JpdGVfY29uZmlnX3dvcmQodHAtPnBkZXYsIHBtICsgUENJX1BNX0NUUkwsIHBvd2VyX2NvbnRyb2wpOworCisJdHczMl9jYXJlZnVsbHkoR1JDX0xPQ0FMX0NUUkwsIHRwLT5ncmNfbG9jYWxfY3RybCk7CisKKwlyZXR1cm47Cit9CisKKworI2lmIFNVUFBPUlRfTElOS19SRVBPUlQKK3N0YXRpYyB2b2lkIHRnM19saW5rX3JlcG9ydChzdHJ1Y3QgdGczICp0cCkKK3sKKwlpZiAoIXRwLT5jYXJyaWVyX29rKSB7CisJCXByaW50ZigiTGluayBpcyBkb3duLlxuIik7CisJfSBlbHNlIHsKKwkJcHJpbnRmKCJMaW5rIGlzIHVwIGF0ICVkIE1icHMsICVzIGR1cGxleC4gJXMgJXMgJXNcbiIsCisJCQkodHAtPmxpbmtfY29uZmlnLmFjdGl2ZV9zcGVlZCA9PSBTUEVFRF8xMDAwID8KKwkJCSAgICAgICAxMDAwIDoKKwkJCSh0cC0+bGlua19jb25maWcuYWN0aXZlX3NwZWVkID09IFNQRUVEXzEwMCA/CisJCQkJMTAwIDogMTApKSwKKwkJCSh0cC0+bGlua19jb25maWcuYWN0aXZlX2R1cGxleCA9PSBEVVBMRVhfRlVMTCA/ICAKKwkJCQkiZnVsbCIgOiAiaGFsZiIpLAorCQkJKHRwLT50ZzNfZmxhZ3MgJiBURzNfRkxBR19UWF9QQVVTRSkgPyAiVFgiIDogIiIsCisJCQkodHAtPnRnM19mbGFncyAmIFRHM19GTEFHX1JYX1BBVVNFKSA/ICJSWCIgOiAiIiwKKwkJCSh0cC0+dGczX2ZsYWdzICYgKFRHM19GTEFHX1RYX1BBVVNFIHxURzNfRkxBR19SWF9QQVVTRSkpID8gImZsb3cgY29udHJvbCIgOiAiIik7CisJfQorfQorI2Vsc2UKKyNkZWZpbmUgdGczX2xpbmtfcmVwb3J0KHRwKQorI2VuZGlmCisKK3N0YXRpYyB2b2lkIHRnM19zZXR1cF9mbG93X2NvbnRyb2woc3RydWN0IHRnMyAqdHAsIHVpbnQzMl90IGxvY2FsX2FkdiwgdWludDMyX3QgcmVtb3RlX2FkdikKK3sKKwl1aW50MzJfdCBuZXdfdGczX2ZsYWdzID0gMDsKKworCWlmIChsb2NhbF9hZHYgJiBBRFZFUlRJU0VfUEFVU0VfQ0FQKSB7CisJCWlmIChsb2NhbF9hZHYgJiBBRFZFUlRJU0VfUEFVU0VfQVNZTSkgeworCQkJaWYgKHJlbW90ZV9hZHYgJiBMUEFfUEFVU0VfQ0FQKQorCQkJCW5ld190ZzNfZmxhZ3MgfD0KKwkJCQkJKFRHM19GTEFHX1JYX1BBVVNFIHwKKwkJCQkJIFRHM19GTEFHX1RYX1BBVVNFKTsKKwkJCWVsc2UgaWYgKHJlbW90ZV9hZHYgJiBMUEFfUEFVU0VfQVNZTSkKKwkJCQluZXdfdGczX2ZsYWdzIHw9CisJCQkJCShURzNfRkxBR19SWF9QQVVTRSk7CisJCX0gZWxzZSB7CisJCQlpZiAocmVtb3RlX2FkdiAmIExQQV9QQVVTRV9DQVApCisJCQkJbmV3X3RnM19mbGFncyB8PQorCQkJCQkoVEczX0ZMQUdfUlhfUEFVU0UgfAorCQkJCQkgVEczX0ZMQUdfVFhfUEFVU0UpOworCQl9CisJfSBlbHNlIGlmIChsb2NhbF9hZHYgJiBBRFZFUlRJU0VfUEFVU0VfQVNZTSkgeworCQlpZiAoKHJlbW90ZV9hZHYgJiBMUEFfUEFVU0VfQ0FQKSAmJgorCQkgICAgKHJlbW90ZV9hZHYgJiBMUEFfUEFVU0VfQVNZTSkpCisJCQluZXdfdGczX2ZsYWdzIHw9IFRHM19GTEFHX1RYX1BBVVNFOworCX0KKworCXRwLT50ZzNfZmxhZ3MgJj0gfihURzNfRkxBR19SWF9QQVVTRSB8IFRHM19GTEFHX1RYX1BBVVNFKTsKKwl0cC0+dGczX2ZsYWdzIHw9IG5ld190ZzNfZmxhZ3M7CisKKwlpZiAobmV3X3RnM19mbGFncyAmIFRHM19GTEFHX1JYX1BBVVNFKQorCQl0cC0+cnhfbW9kZSB8PSBSWF9NT0RFX0ZMT1dfQ1RSTF9FTkFCTEU7CisJZWxzZQorCQl0cC0+cnhfbW9kZSAmPSB+UlhfTU9ERV9GTE9XX0NUUkxfRU5BQkxFOworCisJaWYgKG5ld190ZzNfZmxhZ3MgJiBURzNfRkxBR19UWF9QQVVTRSkKKwkJdHAtPnR4X21vZGUgfD0gVFhfTU9ERV9GTE9XX0NUUkxfRU5BQkxFOworCWVsc2UKKwkJdHAtPnR4X21vZGUgJj0gflRYX01PREVfRkxPV19DVFJMX0VOQUJMRTsKK30KKworI2lmIFNVUFBPUlRfQ09QUEVSX1BIWQorc3RhdGljIHZvaWQgdGczX2F1eF9zdGF0X3RvX3NwZWVkX2R1cGxleCgKKwlzdHJ1Y3QgdGczICp0cCBfX3VudXNlZCwgdWludDMyX3QgdmFsLCB1aW50OF90ICpzcGVlZCwgdWludDhfdCAqZHVwbGV4KQoreworCXN0YXRpYyBjb25zdCB1aW50OF90IG1hcFtdID0geworCQlbMF0gPSAoU1BFRURfSU5WQUxJRCA8PCAyKSB8IERVUExFWF9JTlZBTElELAorCQlbTUlJX1RHM19BVVhfU1RBVF8xMEhBTEYgPj4gOF0gICA9IChTUEVFRF8xMCA8PCAyKSB8IERVUExFWF9IQUxGLAorCQlbTUlJX1RHM19BVVhfU1RBVF8xMEZVTEwgPj4gOF0gICA9IChTUEVFRF8xMCA8PCAyKSB8IERVUExFWF9GVUxMLAorCQlbTUlJX1RHM19BVVhfU1RBVF8xMDBIQUxGID4+IDhdICA9IChTUEVFRF8xMDAgPDwgMikgfCBEVVBMRVhfSEFMRiwKKwkJW01JSV9URzNfQVVYX1NUQVRfMTAwXzQgPj4gOF0gPSAoU1BFRURfSU5WQUxJRCA8PCAyKSB8IERVUExFWF9JTlZBTElELAorCQlbTUlJX1RHM19BVVhfU1RBVF8xMDBGVUxMID4+IDhdICA9IChTUEVFRF8xMDAgPDwgMikgfCBEVVBMRVhfRlVMTCwKKwkJW01JSV9URzNfQVVYX1NUQVRfMTAwMEhBTEYgPj4gOF0gPSAoU1BFRURfMTAwMCA8PCAyKSB8IERVUExFWF9IQUxGLAorCQlbTUlJX1RHM19BVVhfU1RBVF8xMDAwRlVMTCA+PiA4XSA9IChTUEVFRF8xMDAwIDw8IDIpIHwgRFVQTEVYX0ZVTEwsCisJfTsKKwl1aW50OF90IHJlc3VsdDsKKwlyZXN1bHQgPSBtYXBbKHZhbCAmIE1JSV9URzNfQVVYX1NUQVRfU1BETUFTSykgPj4gOF07CisJKnNwZWVkID0gcmVzdWx0ID4+IDI7CisJKmR1cGxleCA9IHJlc3VsdCAmIDM7Cit9CisKK3N0YXRpYyBpbnQgdGczX3BoeV9jb3BwZXJfYmVnaW4oc3RydWN0IHRnMyAqdHApCit7CisJdWludDMyX3QgbmV3X2FkdjsKKworCXRwLT5saW5rX2NvbmZpZy5hZHZlcnRpc2luZyA9CisJCShBRFZFUlRJU0VEXzEwYmFzZVRfSGFsZiB8IEFEVkVSVElTRURfMTBiYXNlVF9GdWxsIHwKKwkJCUFEVkVSVElTRURfMTAwYmFzZVRfSGFsZiB8IEFEVkVSVElTRURfMTAwYmFzZVRfRnVsbCB8CisJCQlBRFZFUlRJU0VEXzEwMDBiYXNlVF9IYWxmIHwgQURWRVJUSVNFRF8xMDAwYmFzZVRfRnVsbCB8CisJCQlBRFZFUlRJU0VEX0F1dG9uZWcgfCBBRFZFUlRJU0VEX01JSSk7CisJCisJaWYgKHRwLT50ZzNfZmxhZ3MgJiBURzNfRkxBR18xMF8xMDBfT05MWSkgeworCQl0cC0+bGlua19jb25maWcuYWR2ZXJ0aXNpbmcgJj0KKwkJCX4oQURWRVJUSVNFRF8xMDAwYmFzZVRfSGFsZiB8IEFEVkVSVElTRURfMTAwMGJhc2VUX0Z1bGwpOworCX0KKwkKKwluZXdfYWR2ID0gKEFEVkVSVElTRV9DU01BIHwgQURWRVJUSVNFX1BBVVNFX0NBUCk7CisJaWYgKHRwLT5saW5rX2NvbmZpZy5hZHZlcnRpc2luZyAmIEFEVkVSVElTRURfMTBiYXNlVF9IYWxmKSB7CisJCW5ld19hZHYgfD0gQURWRVJUSVNFXzEwSEFMRjsKKwl9CisJaWYgKHRwLT5saW5rX2NvbmZpZy5hZHZlcnRpc2luZyAmIEFEVkVSVElTRURfMTBiYXNlVF9GdWxsKSB7CisJCW5ld19hZHYgfD0gQURWRVJUSVNFXzEwRlVMTDsKKwl9CisJaWYgKHRwLT5saW5rX2NvbmZpZy5hZHZlcnRpc2luZyAmIEFEVkVSVElTRURfMTAwYmFzZVRfSGFsZikgeworCQluZXdfYWR2IHw9IEFEVkVSVElTRV8xMDBIQUxGOworCX0KKwlpZiAodHAtPmxpbmtfY29uZmlnLmFkdmVydGlzaW5nICYgQURWRVJUSVNFRF8xMDBiYXNlVF9GdWxsKSB7CisJCW5ld19hZHYgfD0gQURWRVJUSVNFXzEwMEZVTEw7CisJfQorCXRnM193cml0ZXBoeSh0cCwgTUlJX0FEVkVSVElTRSwgbmV3X2Fkdik7CisJCisJaWYgKHRwLT5saW5rX2NvbmZpZy5hZHZlcnRpc2luZyAmCisJCShBRFZFUlRJU0VEXzEwMDBiYXNlVF9IYWxmIHwgQURWRVJUSVNFRF8xMDAwYmFzZVRfRnVsbCkpIHsKKwkJbmV3X2FkdiA9IDA7CisJCWlmICh0cC0+bGlua19jb25maWcuYWR2ZXJ0aXNpbmcgJiBBRFZFUlRJU0VEXzEwMDBiYXNlVF9IYWxmKSB7CisJCQluZXdfYWR2IHw9IE1JSV9URzNfQ1RSTF9BRFZfMTAwMF9IQUxGOworCQl9CisJCWlmICh0cC0+bGlua19jb25maWcuYWR2ZXJ0aXNpbmcgJiBBRFZFUlRJU0VEXzEwMDBiYXNlVF9GdWxsKSB7CisJCQluZXdfYWR2IHw9IE1JSV9URzNfQ1RSTF9BRFZfMTAwMF9GVUxMOworCQl9CisJCWlmICghKHRwLT50ZzNfZmxhZ3MgJiBURzNfRkxBR18xMF8xMDBfT05MWSkgJiYKKwkJCSh0cC0+cGNpX2NoaXBfcmV2X2lkID09IENISVBSRVZfSURfNTcwMV9BMCB8fAorCQkJCXRwLT5wY2lfY2hpcF9yZXZfaWQgPT0gQ0hJUFJFVl9JRF81NzAxX0IwKSkgeworCQkJbmV3X2FkdiB8PSAoTUlJX1RHM19DVFJMX0FTX01BU1RFUiB8CisJCQkJTUlJX1RHM19DVFJMX0VOQUJMRV9BU19NQVNURVIpOworCQl9CisJCXRnM193cml0ZXBoeSh0cCwgTUlJX1RHM19DVFJMLCBuZXdfYWR2KTsKKwl9IGVsc2UgeworCQl0ZzNfd3JpdGVwaHkodHAsIE1JSV9URzNfQ1RSTCwgMCk7CisJfQorCisJdGczX3dyaXRlcGh5KHRwLCBNSUlfQk1DUiwgQk1DUl9BTkVOQUJMRSB8IEJNQ1JfQU5SRVNUQVJUKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHRnM19pbml0XzU0MDFwaHlfZHNwKHN0cnVjdCB0ZzMgKnRwKQoreworCWludCBlcnI7CisKKwkvKiBUdXJuIG9mZiB0YXAgcG93ZXIgbWFuYWdlbWVudC4gKi8KKwllcnIgID0gdGczX3dyaXRlcGh5KHRwLCBNSUlfVEczX0FVWF9DVFJMLCAweDBjMjApOworCQorCWVyciB8PSB0ZzNfd3JpdGVkc3AodHAsIDB4MDAxMiwgMHgxODA0KTsKKwllcnIgfD0gdGczX3dyaXRlZHNwKHRwLCAweDAwMTMsIDB4MTIwNCk7CisJZXJyIHw9IHRnM193cml0ZWRzcCh0cCwgMHg4MDA2LCAweDAxMzIpOworCWVyciB8PSB0ZzNfd3JpdGVkc3AodHAsIDB4ODAwNiwgMHgwMjMyKTsKKwllcnIgfD0gdGczX3dyaXRlZHNwKHRwLCAweDIwMWYsIDB4MGEyMCk7CisKKwl1ZGVsYXkoNDApOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCB0ZzNfc2V0dXBfY29wcGVyX3BoeShzdHJ1Y3QgdGczICp0cCkKK3sKKwlpbnQgY3VycmVudF9saW5rX3VwOworCXVpbnQzMl90IGJtc3IsIGR1bW15OworCWludCBpLCBlcnI7CisKKwl0dzMyX2NhcmVmdWxseShNQUNfU1RBVFVTLAorCQkoTUFDX1NUQVRVU19TWU5DX0NIQU5HRUQgfCBNQUNfU1RBVFVTX0NGR19DSEFOR0VEKSk7CisKKwl0cC0+bWlfbW9kZSA9IE1BQ19NSV9NT0RFX0JBU0U7CisJdHczMl9jYXJlZnVsbHkoTUFDX01JX01PREUsIHRwLT5taV9tb2RlKTsKKworCXRnM193cml0ZXBoeSh0cCwgTUlJX1RHM19BVVhfQ1RSTCwgMHgwMik7CisKKwkvKiBTb21lIHRoaXJkLXBhcnR5IFBIWXMgbmVlZCB0byBiZSByZXNldCBvbiBsaW5rIGdvaW5nCisJICogZG93bi4KKwkgKi8KKwlpZiAoCSgJKEdFVF9BU0lDX1JFVih0cC0+cGNpX2NoaXBfcmV2X2lkKSA9PSBBU0lDX1JFVl81NzAzKSB8fAorCQkJKEdFVF9BU0lDX1JFVih0cC0+cGNpX2NoaXBfcmV2X2lkKSA9PSBBU0lDX1JFVl81NzA0KSB8fAorCQkJKHRwLT5wY2lfY2hpcF9yZXZfaWQgPT0gQ0hJUFJFVl9JRF81NzA1X0EwKSkgJiYKKwkJKHRwLT5jYXJyaWVyX29rKSkgeworCQl0ZzNfcmVhZHBoeSh0cCwgTUlJX0JNU1IsICZibXNyKTsKKwkJdGczX3JlYWRwaHkodHAsIE1JSV9CTVNSLCAmYm1zcik7CisJCWlmICghKGJtc3IgJiBCTVNSX0xTVEFUVVMpKQorCQkJdGczX3BoeV9yZXNldCh0cCk7CisJfQorCisJaWYgKCh0cC0+cGh5X2lkICYgUEhZX0lEX01BU0spID09IFBIWV9JRF9CQ001NDAxKSB7CisJCXRnM19yZWFkcGh5KHRwLCBNSUlfQk1TUiwgJmJtc3IpOworCQl0ZzNfcmVhZHBoeSh0cCwgTUlJX0JNU1IsICZibXNyKTsKKworCQlpZiAoISh0cC0+dGczX2ZsYWdzICYgVEczX0ZMQUdfSU5JVF9DT01QTEVURSkpCisJCQlibXNyID0gMDsKKworCQlpZiAoIShibXNyICYgQk1TUl9MU1RBVFVTKSkgeworCQkJZXJyID0gdGczX2luaXRfNTQwMXBoeV9kc3AodHApOworCQkJaWYgKGVycikKKwkJCQlyZXR1cm4gZXJyOworCisJCQl0ZzNfcmVhZHBoeSh0cCwgTUlJX0JNU1IsICZibXNyKTsKKwkJCWZvciAoaSA9IDA7IGkgPCAxMDAwOyBpKyspIHsKKwkJCQl1ZGVsYXkoMTApOworCQkJCXRnM19yZWFkcGh5KHRwLCBNSUlfQk1TUiwgJmJtc3IpOworCQkJCWlmIChibXNyICYgQk1TUl9MU1RBVFVTKSB7CisJCQkJCXVkZWxheSg0MCk7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKworCQkJaWYgKCh0cC0+cGh5X2lkICYgUEhZX0lEX1JFVl9NQVNLKSA9PSBQSFlfUkVWX0JDTTU0MDFfQjAgJiYKKwkJCSAgICAhKGJtc3IgJiBCTVNSX0xTVEFUVVMpICYmCisJCQkgICAgdHAtPmxpbmtfY29uZmlnLmFjdGl2ZV9zcGVlZCA9PSBTUEVFRF8xMDAwKSB7CisJCQkJZXJyID0gdGczX3BoeV9yZXNldCh0cCk7CisJCQkJaWYgKCFlcnIpCisJCQkJCWVyciA9IHRnM19pbml0XzU0MDFwaHlfZHNwKHRwKTsKKwkJCQlpZiAoZXJyKQorCQkJCQlyZXR1cm4gZXJyOworCQkJfQorCQl9CisJfSBlbHNlIGlmICh0cC0+cGNpX2NoaXBfcmV2X2lkID09IENISVBSRVZfSURfNTcwMV9BMCB8fAorCQkgICB0cC0+cGNpX2NoaXBfcmV2X2lkID09IENISVBSRVZfSURfNTcwMV9CMCkgeworCQkvKiA1NzAxIHtBMCxCMH0gQ1JDIGJ1ZyB3b3JrYXJvdW5kICovCisJCXRnM193cml0ZXBoeSh0cCwgMHgxNSwgMHgwYTc1KTsKKwkJdGczX3dyaXRlcGh5KHRwLCAweDFjLCAweDhjNjgpOworCQl0ZzNfd3JpdGVwaHkodHAsIDB4MWMsIDB4OGQ2OCk7CisJCXRnM193cml0ZXBoeSh0cCwgMHgxYywgMHg4YzY4KTsKKwl9CisKKwkvKiBDbGVhciBwZW5kaW5nIGludGVycnVwdHMuLi4gKi8KKwl0ZzNfcmVhZHBoeSh0cCwgTUlJX1RHM19JU1RBVCwgJmR1bW15KTsKKwl0ZzNfcmVhZHBoeSh0cCwgTUlJX1RHM19JU1RBVCwgJmR1bW15KTsKKworCXRnM193cml0ZXBoeSh0cCwgTUlJX1RHM19JTUFTSywgfjApOworCisJaWYgKHRwLT5sZWRfbW9kZSA9PSBsZWRfbW9kZV90aHJlZV9saW5rKQorCQl0ZzNfd3JpdGVwaHkodHAsIE1JSV9URzNfRVhUX0NUUkwsCisJCQkgICAgIE1JSV9URzNfRVhUX0NUUkxfTE5LM19MRURfTU9ERSk7CisJZWxzZQorCQl0ZzNfd3JpdGVwaHkodHAsIE1JSV9URzNfRVhUX0NUUkwsIDApOworCisJY3VycmVudF9saW5rX3VwID0gMDsKKworCXRnM19yZWFkcGh5KHRwLCBNSUlfQk1TUiwgJmJtc3IpOworCXRnM19yZWFkcGh5KHRwLCBNSUlfQk1TUiwgJmJtc3IpOworCisJaWYgKGJtc3IgJiBCTVNSX0xTVEFUVVMpIHsKKwkJdWludDMyX3QgYXV4X3N0YXQsIGJtY3I7CisKKwkJdGczX3JlYWRwaHkodHAsIE1JSV9URzNfQVVYX1NUQVQsICZhdXhfc3RhdCk7CisJCWZvciAoaSA9IDA7IGkgPCAyMDAwOyBpKyspIHsKKwkJCXVkZWxheSgxMCk7CisJCQl0ZzNfcmVhZHBoeSh0cCwgTUlJX1RHM19BVVhfU1RBVCwgJmF1eF9zdGF0KTsKKwkJCWlmIChhdXhfc3RhdCkKKwkJCQlicmVhazsKKwkJfQorCisJCXRnM19hdXhfc3RhdF90b19zcGVlZF9kdXBsZXgodHAsIGF1eF9zdGF0LAorCQkJJnRwLT5saW5rX2NvbmZpZy5hY3RpdmVfc3BlZWQsCisJCQkmdHAtPmxpbmtfY29uZmlnLmFjdGl2ZV9kdXBsZXgpOworCQl0ZzNfcmVhZHBoeSh0cCwgTUlJX0JNQ1IsICZibWNyKTsKKwkJdGczX3JlYWRwaHkodHAsIE1JSV9CTUNSLCAmYm1jcik7CisJCWlmIChibWNyICYgQk1DUl9BTkVOQUJMRSkgeworCQkJdWludDMyX3QgZ2lnX2N0cmw7CisJCQkKKwkJCWN1cnJlbnRfbGlua191cCA9IDE7CisJCQkKKwkJCS8qIEZvcmNlIGF1dG9uZWcgcmVzdGFydCBpZiB3ZSBhcmUgZXhpdGluZworCQkJICogbG93IHBvd2VyIG1vZGUuCisJCQkgKi8KKwkJCXRnM19yZWFkcGh5KHRwLCBNSUlfVEczX0NUUkwsICZnaWdfY3RybCk7CisJCQlpZiAoIShnaWdfY3RybCAmIChNSUlfVEczX0NUUkxfQURWXzEwMDBfSEFMRiB8CisJCQkJICAgICAgTUlJX1RHM19DVFJMX0FEVl8xMDAwX0ZVTEwpKSkgeworCQkJCWN1cnJlbnRfbGlua191cCA9IDA7CisJCQl9CisJCX0gZWxzZSB7CisJCQljdXJyZW50X2xpbmtfdXAgPSAwOworCQl9CisJfQorCisJaWYgKGN1cnJlbnRfbGlua191cCA9PSAxICYmCisJCSh0cC0+bGlua19jb25maWcuYWN0aXZlX2R1cGxleCA9PSBEVVBMRVhfRlVMTCkpIHsKKwkJdWludDMyX3QgbG9jYWxfYWR2LCByZW1vdGVfYWR2OworCisJCXRnM19yZWFkcGh5KHRwLCBNSUlfQURWRVJUSVNFLCAmbG9jYWxfYWR2KTsKKwkJbG9jYWxfYWR2ICY9IChBRFZFUlRJU0VfUEFVU0VfQ0FQIHwgQURWRVJUSVNFX1BBVVNFX0FTWU0pOworCisJCXRnM19yZWFkcGh5KHRwLCBNSUlfTFBBLCAmcmVtb3RlX2Fkdik7CisJCXJlbW90ZV9hZHYgJj0gKExQQV9QQVVTRV9DQVAgfCBMUEFfUEFVU0VfQVNZTSk7CisKKwkJLyogSWYgd2UgYXJlIG5vdCBhZHZlcnRpc2luZyBmdWxsIHBhdXNlIGNhcGFiaWxpdHksCisJCSAqIHNvbWV0aGluZyBpcyB3cm9uZy4gIEJyaW5nIHRoZSBsaW5rIGRvd24gYW5kIHJlY29uZmlndXJlLgorCQkgKi8KKwkJaWYgKGxvY2FsX2FkdiAhPSBBRFZFUlRJU0VfUEFVU0VfQ0FQKSB7CisJCQljdXJyZW50X2xpbmtfdXAgPSAwOworCQl9IGVsc2UgeworCQkJdGczX3NldHVwX2Zsb3dfY29udHJvbCh0cCwgbG9jYWxfYWR2LCByZW1vdGVfYWR2KTsKKwkJfQorCX0KKworCWlmIChjdXJyZW50X2xpbmtfdXAgPT0gMCkgeworCQl1aW50MzJfdCB0bXA7CisKKwkJdGczX3BoeV9jb3BwZXJfYmVnaW4odHApOworCisJCXRnM19yZWFkcGh5KHRwLCBNSUlfQk1TUiwgJnRtcCk7CisJCXRnM19yZWFkcGh5KHRwLCBNSUlfQk1TUiwgJnRtcCk7CisJCWlmICh0bXAgJiBCTVNSX0xTVEFUVVMpCisJCQljdXJyZW50X2xpbmtfdXAgPSAxOworCX0KKworCXRwLT5tYWNfbW9kZSAmPSB+TUFDX01PREVfUE9SVF9NT0RFX01BU0s7CisJaWYgKGN1cnJlbnRfbGlua191cCA9PSAxKSB7CisJCWlmICh0cC0+bGlua19jb25maWcuYWN0aXZlX3NwZWVkID09IFNQRUVEXzEwMCB8fAorCQkgICAgdHAtPmxpbmtfY29uZmlnLmFjdGl2ZV9zcGVlZCA9PSBTUEVFRF8xMCkKKwkJCXRwLT5tYWNfbW9kZSB8PSBNQUNfTU9ERV9QT1JUX01PREVfTUlJOworCQllbHNlCisJCQl0cC0+bWFjX21vZGUgfD0gTUFDX01PREVfUE9SVF9NT0RFX0dNSUk7CisJfSBlbHNlCisJCXRwLT5tYWNfbW9kZSB8PSBNQUNfTU9ERV9QT1JUX01PREVfR01JSTsKKworCXRwLT5tYWNfbW9kZSAmPSB+TUFDX01PREVfSEFMRl9EVVBMRVg7CisJaWYgKHRwLT5saW5rX2NvbmZpZy5hY3RpdmVfZHVwbGV4ID09IERVUExFWF9IQUxGKQorCQl0cC0+bWFjX21vZGUgfD0gTUFDX01PREVfSEFMRl9EVVBMRVg7CisKKwl0cC0+bWFjX21vZGUgJj0gfk1BQ19NT0RFX0xJTktfUE9MQVJJVFk7CisJaWYgKEdFVF9BU0lDX1JFVih0cC0+cGNpX2NoaXBfcmV2X2lkKSA9PSBBU0lDX1JFVl81NzAwKSB7CisJCWlmICgodHAtPmxlZF9tb2RlID09IGxlZF9tb2RlX2xpbmsxMCkgfHwKKwkJICAgIChjdXJyZW50X2xpbmtfdXAgPT0gMSAmJgorCQkgICAgIHRwLT5saW5rX2NvbmZpZy5hY3RpdmVfc3BlZWQgPT0gU1BFRURfMTApKQorCQkJdHAtPm1hY19tb2RlIHw9IE1BQ19NT0RFX0xJTktfUE9MQVJJVFk7CisJfSBlbHNlIHsKKwkJaWYgKGN1cnJlbnRfbGlua191cCA9PSAxKQorCQkJdHAtPm1hY19tb2RlIHw9IE1BQ19NT0RFX0xJTktfUE9MQVJJVFk7CisJCXR3MzIoTUFDX0xFRF9DVFJMLCBMRURfQ1RSTF9QSFlfTU9ERV8xKTsKKwl9CisKKwkvKiA/Pz8gV2l0aG91dCB0aGlzIHNldHRpbmcgTmV0Z2VhciBHQTMwMlQgUEhZIGRvZXMgbm90CisJICogPz8/IHNlbmQvcmVjZWl2ZSBwYWNrZXRzLi4uCisJICogV2l0aCB0aGlzIG90aGVyIFBIWXMgY2Fubm90IGJyaW5nIHVwIHRoZSBsaW5rCisJICovCisJaWYgKCh0cC0+cGh5X2lkICYgUEhZX0lEX01BU0spID09IFBIWV9JRF9CQ001NDExICYmCisJCXRwLT5wY2lfY2hpcF9yZXZfaWQgPT0gQ0hJUFJFVl9JRF81NzAwX0FMVElNQSkgeworCQl0cC0+bWlfbW9kZSB8PSBNQUNfTUlfTU9ERV9BVVRPX1BPTEw7CisJCXR3MzJfY2FyZWZ1bGx5KE1BQ19NSV9NT0RFLCB0cC0+bWlfbW9kZSk7CisJfQorCisJdHczMl9jYXJlZnVsbHkoTUFDX01PREUsIHRwLT5tYWNfbW9kZSk7CisKKwkvKiBMaW5rIGNoYW5nZSBwb2xsZWQuICovCisJdHczMl9jYXJlZnVsbHkoTUFDX0VWRU5ULCAwKTsKKworCWlmIChHRVRfQVNJQ19SRVYodHAtPnBjaV9jaGlwX3Jldl9pZCkgPT0gQVNJQ19SRVZfNTcwMCAmJgorCSAgICBjdXJyZW50X2xpbmtfdXAgPT0gMSAmJgorCSAgICB0cC0+bGlua19jb25maWcuYWN0aXZlX3NwZWVkID09IFNQRUVEXzEwMDAgJiYKKwkgICAgKCh0cC0+dGczX2ZsYWdzICYgVEczX0ZMQUdfUENJWF9NT0RFKSB8fAorCSAgICAgKHRwLT50ZzNfZmxhZ3MgJiBURzNfRkxBR19QQ0lfSElHSF9TUEVFRCkpKSB7CisJCXVkZWxheSgxMjApOworCQl0dzMyX2NhcmVmdWxseShNQUNfU1RBVFVTLAorCQkJKE1BQ19TVEFUVVNfU1lOQ19DSEFOR0VEIHwgTUFDX1NUQVRVU19DRkdfQ0hBTkdFRCkpOworCQl0ZzNfd3JpdGVfbWVtKAorCQkJICAgICAgTklDX1NSQU1fRklSTVdBUkVfTUJPWCwKKwkJCSAgICAgIE5JQ19TUkFNX0ZJUk1XQVJFX01CT1hfTUFHSUMyKTsKKwl9CisKKwlpZiAoY3VycmVudF9saW5rX3VwICE9IHRwLT5jYXJyaWVyX29rKSB7CisJCXRwLT5jYXJyaWVyX29rID0gY3VycmVudF9saW5rX3VwOworCQl0ZzNfbGlua19yZXBvcnQodHApOworCX0KKworCXJldHVybiAwOworfQorI2Vsc2UKKyNkZWZpbmUgdGczX3NldHVwX2NvcHBlcl9waHkoVFApICgtRUlOVkFMKQorI2VuZGlmIC8qIFNVUFBPUlRfQ09QUEVSX1BIWSAqLworCisjaWYgU1VQUE9SVF9GSUJFUl9QSFkKK3N0cnVjdCB0ZzNfZmliZXJfYW5lZ2luZm8geworCWludCBzdGF0ZTsKKyNkZWZpbmUgQU5FR19TVEFURV9VTktOT1dOCQkwCisjZGVmaW5lIEFORUdfU1RBVEVfQU5fRU5BQkxFCQkxCisjZGVmaW5lIEFORUdfU1RBVEVfUkVTVEFSVF9JTklUCQkyCisjZGVmaW5lIEFORUdfU1RBVEVfUkVTVEFSVAkJMworI2RlZmluZSBBTkVHX1NUQVRFX0RJU0FCTEVfTElOS19PSwk0CisjZGVmaW5lIEFORUdfU1RBVEVfQUJJTElUWV9ERVRFQ1RfSU5JVAk1CisjZGVmaW5lIEFORUdfU1RBVEVfQUJJTElUWV9ERVRFQ1QJNgorI2RlZmluZSBBTkVHX1NUQVRFX0FDS19ERVRFQ1RfSU5JVAk3CisjZGVmaW5lIEFORUdfU1RBVEVfQUNLX0RFVEVDVAkJOAorI2RlZmluZSBBTkVHX1NUQVRFX0NPTVBMRVRFX0FDS19JTklUCTkKKyNkZWZpbmUgQU5FR19TVEFURV9DT01QTEVURV9BQ0sJCTEwCisjZGVmaW5lIEFORUdfU1RBVEVfSURMRV9ERVRFQ1RfSU5JVAkxMQorI2RlZmluZSBBTkVHX1NUQVRFX0lETEVfREVURUNUCQkxMgorI2RlZmluZSBBTkVHX1NUQVRFX0xJTktfT0sJCTEzCisjZGVmaW5lIEFORUdfU1RBVEVfTkVYVF9QQUdFX1dBSVRfSU5JVAkxNAorI2RlZmluZSBBTkVHX1NUQVRFX05FWFRfUEFHRV9XQUlUCTE1CisKKwl1aW50MzJfdCBmbGFnczsKKyNkZWZpbmUgTVJfQU5fRU5BQkxFCQkweDAwMDAwMDAxCisjZGVmaW5lIE1SX1JFU1RBUlRfQU4JCTB4MDAwMDAwMDIKKyNkZWZpbmUgTVJfQU5fQ09NUExFVEUJCTB4MDAwMDAwMDQKKyNkZWZpbmUgTVJfUEFHRV9SWAkJMHgwMDAwMDAwOAorI2RlZmluZSBNUl9OUF9MT0FERUQJCTB4MDAwMDAwMTAKKyNkZWZpbmUgTVJfVE9HR0xFX1RYCQkweDAwMDAwMDIwCisjZGVmaW5lIE1SX0xQX0FEVl9GVUxMX0RVUExFWAkweDAwMDAwMDQwCisjZGVmaW5lIE1SX0xQX0FEVl9IQUxGX0RVUExFWAkweDAwMDAwMDgwCisjZGVmaW5lIE1SX0xQX0FEVl9TWU1fUEFVU0UJMHgwMDAwMDEwMAorI2RlZmluZSBNUl9MUF9BRFZfQVNZTV9QQVVTRQkweDAwMDAwMjAwCisjZGVmaW5lIE1SX0xQX0FEVl9SRU1PVEVfRkFVTFQxCTB4MDAwMDA0MDAKKyNkZWZpbmUgTVJfTFBfQURWX1JFTU9URV9GQVVMVDIJMHgwMDAwMDgwMAorI2RlZmluZSBNUl9MUF9BRFZfTkVYVF9QQUdFCTB4MDAwMDEwMDAKKyNkZWZpbmUgTVJfVE9HR0xFX1JYCQkweDAwMDAyMDAwCisjZGVmaW5lIE1SX05QX1JYCQkweDAwMDA0MDAwCisKKyNkZWZpbmUgTVJfTElOS19PSwkJMHg4MDAwMDAwMAorCisJdW5zaWduZWQgbG9uZyBsaW5rX3RpbWUsIGN1cl90aW1lOworCisJdWludDMyX3QgYWJpbGl0eV9tYXRjaF9jZmc7CisJaW50IGFiaWxpdHlfbWF0Y2hfY291bnQ7CisKKwljaGFyIGFiaWxpdHlfbWF0Y2gsIGlkbGVfbWF0Y2gsIGFja19tYXRjaDsKKworCXVpbnQzMl90IHR4Y29uZmlnLCByeGNvbmZpZzsKKyNkZWZpbmUgQU5FR19DRkdfTlAJCTB4MDAwMDAwODAKKyNkZWZpbmUgQU5FR19DRkdfQUNLCQkweDAwMDAwMDQwCisjZGVmaW5lIEFORUdfQ0ZHX1JGMgkJMHgwMDAwMDAyMAorI2RlZmluZSBBTkVHX0NGR19SRjEJCTB4MDAwMDAwMTAKKyNkZWZpbmUgQU5FR19DRkdfUFMyCQkweDAwMDAwMDAxCisjZGVmaW5lIEFORUdfQ0ZHX1BTMQkJMHgwMDAwODAwMAorI2RlZmluZSBBTkVHX0NGR19IRAkJMHgwMDAwNDAwMAorI2RlZmluZSBBTkVHX0NGR19GRAkJMHgwMDAwMjAwMAorI2RlZmluZSBBTkVHX0NGR19JTlZBTAkJMHgwMDAwMWYwNgorCit9OworI2RlZmluZSBBTkVHX09LCQkwCisjZGVmaW5lIEFORUdfRE9ORQkxCisjZGVmaW5lIEFORUdfVElNRVJfRU5BQgkyCisjZGVmaW5lIEFORUdfRkFJTEVECS0xCisKKyNkZWZpbmUgQU5FR19TVEFURV9TRVRUTEVfVElNRQkxMDAwMAorCitzdGF0aWMgaW50IHRnM19maWJlcl9hbmVnX3NtYWNoaW5lKHN0cnVjdCB0ZzMgKnRwLAorCQkJCSAgIHN0cnVjdCB0ZzNfZmliZXJfYW5lZ2luZm8gKmFwKQoreworCXVuc2lnbmVkIGxvbmcgZGVsdGE7CisJdWludDMyX3QgcnhfY2ZnX3JlZzsKKwlpbnQgcmV0OworCisJaWYgKGFwLT5zdGF0ZSA9PSBBTkVHX1NUQVRFX1VOS05PV04pIHsKKwkJYXAtPnJ4Y29uZmlnID0gMDsKKwkJYXAtPmxpbmtfdGltZSA9IDA7CisJCWFwLT5jdXJfdGltZSA9IDA7CisJCWFwLT5hYmlsaXR5X21hdGNoX2NmZyA9IDA7CisJCWFwLT5hYmlsaXR5X21hdGNoX2NvdW50ID0gMDsKKwkJYXAtPmFiaWxpdHlfbWF0Y2ggPSAwOworCQlhcC0+aWRsZV9tYXRjaCA9IDA7CisJCWFwLT5hY2tfbWF0Y2ggPSAwOworCX0KKwlhcC0+Y3VyX3RpbWUrKzsKKworCWlmICh0cjMyKE1BQ19TVEFUVVMpICYgTUFDX1NUQVRVU19SQ1ZEX0NGRykgeworCQlyeF9jZmdfcmVnID0gdHIzMihNQUNfUlhfQVVUT19ORUcpOworCisJCWlmIChyeF9jZmdfcmVnICE9IGFwLT5hYmlsaXR5X21hdGNoX2NmZykgeworCQkJYXAtPmFiaWxpdHlfbWF0Y2hfY2ZnID0gcnhfY2ZnX3JlZzsKKwkJCWFwLT5hYmlsaXR5X21hdGNoID0gMDsKKwkJCWFwLT5hYmlsaXR5X21hdGNoX2NvdW50ID0gMDsKKwkJfSBlbHNlIHsKKwkJCWlmICgrK2FwLT5hYmlsaXR5X21hdGNoX2NvdW50ID4gMSkgeworCQkJCWFwLT5hYmlsaXR5X21hdGNoID0gMTsKKwkJCQlhcC0+YWJpbGl0eV9tYXRjaF9jZmcgPSByeF9jZmdfcmVnOworCQkJfQorCQl9CisJCWlmIChyeF9jZmdfcmVnICYgQU5FR19DRkdfQUNLKQorCQkJYXAtPmFja19tYXRjaCA9IDE7CisJCWVsc2UKKwkJCWFwLT5hY2tfbWF0Y2ggPSAwOworCisJCWFwLT5pZGxlX21hdGNoID0gMDsKKwl9IGVsc2UgeworCQlhcC0+aWRsZV9tYXRjaCA9IDE7CisJCWFwLT5hYmlsaXR5X21hdGNoX2NmZyA9IDA7CisJCWFwLT5hYmlsaXR5X21hdGNoX2NvdW50ID0gMDsKKwkJYXAtPmFiaWxpdHlfbWF0Y2ggPSAwOworCQlhcC0+YWNrX21hdGNoID0gMDsKKworCQlyeF9jZmdfcmVnID0gMDsKKwl9CisKKwlhcC0+cnhjb25maWcgPSByeF9jZmdfcmVnOworCXJldCA9IEFORUdfT0s7CisKKwlzd2l0Y2goYXAtPnN0YXRlKSB7CisJY2FzZSBBTkVHX1NUQVRFX1VOS05PV046CisJCWlmIChhcC0+ZmxhZ3MgJiAoTVJfQU5fRU5BQkxFIHwgTVJfUkVTVEFSVF9BTikpCisJCQlhcC0+c3RhdGUgPSBBTkVHX1NUQVRFX0FOX0VOQUJMRTsKKworCQkvKiBmYWxsdGhydSAqLworCWNhc2UgQU5FR19TVEFURV9BTl9FTkFCTEU6CisJCWFwLT5mbGFncyAmPSB+KE1SX0FOX0NPTVBMRVRFIHwgTVJfUEFHRV9SWCk7CisJCWlmIChhcC0+ZmxhZ3MgJiBNUl9BTl9FTkFCTEUpIHsKKwkJCWFwLT5saW5rX3RpbWUgPSAwOworCQkJYXAtPmN1cl90aW1lID0gMDsKKwkJCWFwLT5hYmlsaXR5X21hdGNoX2NmZyA9IDA7CisJCQlhcC0+YWJpbGl0eV9tYXRjaF9jb3VudCA9IDA7CisJCQlhcC0+YWJpbGl0eV9tYXRjaCA9IDA7CisJCQlhcC0+aWRsZV9tYXRjaCA9IDA7CisJCQlhcC0+YWNrX21hdGNoID0gMDsKKworCQkJYXAtPnN0YXRlID0gQU5FR19TVEFURV9SRVNUQVJUX0lOSVQ7CisJCX0gZWxzZSB7CisJCQlhcC0+c3RhdGUgPSBBTkVHX1NUQVRFX0RJU0FCTEVfTElOS19PSzsKKwkJfQorCQlicmVhazsKKworCWNhc2UgQU5FR19TVEFURV9SRVNUQVJUX0lOSVQ6CisJCWFwLT5saW5rX3RpbWUgPSBhcC0+Y3VyX3RpbWU7CisJCWFwLT5mbGFncyAmPSB+KE1SX05QX0xPQURFRCk7CisJCWFwLT50eGNvbmZpZyA9IDA7CisJCXR3MzIoTUFDX1RYX0FVVE9fTkVHLCAwKTsKKwkJdHAtPm1hY19tb2RlIHw9IE1BQ19NT0RFX1NFTkRfQ09ORklHUzsKKwkJdHczMl9jYXJlZnVsbHkoTUFDX01PREUsIHRwLT5tYWNfbW9kZSk7CisKKwkJcmV0ID0gQU5FR19USU1FUl9FTkFCOworCQlhcC0+c3RhdGUgPSBBTkVHX1NUQVRFX1JFU1RBUlQ7CisKKwkJLyogZmFsbHRocnUgKi8KKwljYXNlIEFORUdfU1RBVEVfUkVTVEFSVDoKKwkJZGVsdGEgPSBhcC0+Y3VyX3RpbWUgLSBhcC0+bGlua190aW1lOworCQlpZiAoZGVsdGEgPiBBTkVHX1NUQVRFX1NFVFRMRV9USU1FKSB7CisJCQlhcC0+c3RhdGUgPSBBTkVHX1NUQVRFX0FCSUxJVFlfREVURUNUX0lOSVQ7CisJCX0gZWxzZSB7CisJCQlyZXQgPSBBTkVHX1RJTUVSX0VOQUI7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIEFORUdfU1RBVEVfRElTQUJMRV9MSU5LX09LOgorCQlyZXQgPSBBTkVHX0RPTkU7CisJCWJyZWFrOworCisJY2FzZSBBTkVHX1NUQVRFX0FCSUxJVFlfREVURUNUX0lOSVQ6CisJCWFwLT5mbGFncyAmPSB+KE1SX1RPR0dMRV9UWCk7CisJCWFwLT50eGNvbmZpZyA9IChBTkVHX0NGR19GRCB8IEFORUdfQ0ZHX1BTMSk7CisJCXR3MzIoTUFDX1RYX0FVVE9fTkVHLCBhcC0+dHhjb25maWcpOworCQl0cC0+bWFjX21vZGUgfD0gTUFDX01PREVfU0VORF9DT05GSUdTOworCQl0dzMyX2NhcmVmdWxseShNQUNfTU9ERSwgdHAtPm1hY19tb2RlKTsKKworCQlhcC0+c3RhdGUgPSBBTkVHX1NUQVRFX0FCSUxJVFlfREVURUNUOworCQlicmVhazsKKworCWNhc2UgQU5FR19TVEFURV9BQklMSVRZX0RFVEVDVDoKKwkJaWYgKGFwLT5hYmlsaXR5X21hdGNoICE9IDAgJiYgYXAtPnJ4Y29uZmlnICE9IDApIHsKKwkJCWFwLT5zdGF0ZSA9IEFORUdfU1RBVEVfQUNLX0RFVEVDVF9JTklUOworCQl9CisJCWJyZWFrOworCisJY2FzZSBBTkVHX1NUQVRFX0FDS19ERVRFQ1RfSU5JVDoKKwkJYXAtPnR4Y29uZmlnIHw9IEFORUdfQ0ZHX0FDSzsKKwkJdHczMihNQUNfVFhfQVVUT19ORUcsIGFwLT50eGNvbmZpZyk7CisJCXRwLT5tYWNfbW9kZSB8PSBNQUNfTU9ERV9TRU5EX0NPTkZJR1M7CisJCXR3MzJfY2FyZWZ1bGx5KE1BQ19NT0RFLCB0cC0+bWFjX21vZGUpOworCisJCWFwLT5zdGF0ZSA9IEFORUdfU1RBVEVfQUNLX0RFVEVDVDsKKworCQkvKiBmYWxsdGhydSAqLworCWNhc2UgQU5FR19TVEFURV9BQ0tfREVURUNUOgorCQlpZiAoYXAtPmFja19tYXRjaCAhPSAwKSB7CisJCQlpZiAoKGFwLT5yeGNvbmZpZyAmIH5BTkVHX0NGR19BQ0spID09CisJCQkgICAgKGFwLT5hYmlsaXR5X21hdGNoX2NmZyAmIH5BTkVHX0NGR19BQ0spKSB7CisJCQkJYXAtPnN0YXRlID0gQU5FR19TVEFURV9DT01QTEVURV9BQ0tfSU5JVDsKKwkJCX0gZWxzZSB7CisJCQkJYXAtPnN0YXRlID0gQU5FR19TVEFURV9BTl9FTkFCTEU7CisJCQl9CisJCX0gZWxzZSBpZiAoYXAtPmFiaWxpdHlfbWF0Y2ggIT0gMCAmJgorCQkJICAgYXAtPnJ4Y29uZmlnID09IDApIHsKKwkJCWFwLT5zdGF0ZSA9IEFORUdfU1RBVEVfQU5fRU5BQkxFOworCQl9CisJCWJyZWFrOworCisJY2FzZSBBTkVHX1NUQVRFX0NPTVBMRVRFX0FDS19JTklUOgorCQlpZiAoYXAtPnJ4Y29uZmlnICYgQU5FR19DRkdfSU5WQUwpIHsKKwkJCXJldCA9IEFORUdfRkFJTEVEOworCQkJYnJlYWs7CisJCX0KKwkJYXAtPmZsYWdzICY9IH4oTVJfTFBfQURWX0ZVTExfRFVQTEVYIHwKKwkJCSAgICAgICBNUl9MUF9BRFZfSEFMRl9EVVBMRVggfAorCQkJICAgICAgIE1SX0xQX0FEVl9TWU1fUEFVU0UgfAorCQkJICAgICAgIE1SX0xQX0FEVl9BU1lNX1BBVVNFIHwKKwkJCSAgICAgICBNUl9MUF9BRFZfUkVNT1RFX0ZBVUxUMSB8CisJCQkgICAgICAgTVJfTFBfQURWX1JFTU9URV9GQVVMVDIgfAorCQkJICAgICAgIE1SX0xQX0FEVl9ORVhUX1BBR0UgfAorCQkJICAgICAgIE1SX1RPR0dMRV9SWCB8CisJCQkgICAgICAgTVJfTlBfUlgpOworCQlpZiAoYXAtPnJ4Y29uZmlnICYgQU5FR19DRkdfRkQpCisJCQlhcC0+ZmxhZ3MgfD0gTVJfTFBfQURWX0ZVTExfRFVQTEVYOworCQlpZiAoYXAtPnJ4Y29uZmlnICYgQU5FR19DRkdfSEQpCisJCQlhcC0+ZmxhZ3MgfD0gTVJfTFBfQURWX0hBTEZfRFVQTEVYOworCQlpZiAoYXAtPnJ4Y29uZmlnICYgQU5FR19DRkdfUFMxKQorCQkJYXAtPmZsYWdzIHw9IE1SX0xQX0FEVl9TWU1fUEFVU0U7CisJCWlmIChhcC0+cnhjb25maWcgJiBBTkVHX0NGR19QUzIpCisJCQlhcC0+ZmxhZ3MgfD0gTVJfTFBfQURWX0FTWU1fUEFVU0U7CisJCWlmIChhcC0+cnhjb25maWcgJiBBTkVHX0NGR19SRjEpCisJCQlhcC0+ZmxhZ3MgfD0gTVJfTFBfQURWX1JFTU9URV9GQVVMVDE7CisJCWlmIChhcC0+cnhjb25maWcgJiBBTkVHX0NGR19SRjIpCisJCQlhcC0+ZmxhZ3MgfD0gTVJfTFBfQURWX1JFTU9URV9GQVVMVDI7CisJCWlmIChhcC0+cnhjb25maWcgJiBBTkVHX0NGR19OUCkKKwkJCWFwLT5mbGFncyB8PSBNUl9MUF9BRFZfTkVYVF9QQUdFOworCisJCWFwLT5saW5rX3RpbWUgPSBhcC0+Y3VyX3RpbWU7CisKKwkJYXAtPmZsYWdzIF49IChNUl9UT0dHTEVfVFgpOworCQlpZiAoYXAtPnJ4Y29uZmlnICYgMHgwMDA4KQorCQkJYXAtPmZsYWdzIHw9IE1SX1RPR0dMRV9SWDsKKwkJaWYgKGFwLT5yeGNvbmZpZyAmIEFORUdfQ0ZHX05QKQorCQkJYXAtPmZsYWdzIHw9IE1SX05QX1JYOworCQlhcC0+ZmxhZ3MgfD0gTVJfUEFHRV9SWDsKKworCQlhcC0+c3RhdGUgPSBBTkVHX1NUQVRFX0NPTVBMRVRFX0FDSzsKKwkJcmV0ID0gQU5FR19USU1FUl9FTkFCOworCQlicmVhazsKKworCWNhc2UgQU5FR19TVEFURV9DT01QTEVURV9BQ0s6CisJCWlmIChhcC0+YWJpbGl0eV9tYXRjaCAhPSAwICYmCisJCSAgICBhcC0+cnhjb25maWcgPT0gMCkgeworCQkJYXAtPnN0YXRlID0gQU5FR19TVEFURV9BTl9FTkFCTEU7CisJCQlicmVhazsKKwkJfQorCQlkZWx0YSA9IGFwLT5jdXJfdGltZSAtIGFwLT5saW5rX3RpbWU7CisJCWlmIChkZWx0YSA+IEFORUdfU1RBVEVfU0VUVExFX1RJTUUpIHsKKwkJCWlmICghKGFwLT5mbGFncyAmIChNUl9MUF9BRFZfTkVYVF9QQUdFKSkpIHsKKwkJCQlhcC0+c3RhdGUgPSBBTkVHX1NUQVRFX0lETEVfREVURUNUX0lOSVQ7CisJCQl9IGVsc2UgeworCQkJCWlmICgoYXAtPnR4Y29uZmlnICYgQU5FR19DRkdfTlApID09IDAgJiYKKwkJCQkgICAgIShhcC0+ZmxhZ3MgJiBNUl9OUF9SWCkpIHsKKwkJCQkJYXAtPnN0YXRlID0gQU5FR19TVEFURV9JRExFX0RFVEVDVF9JTklUOworCQkJCX0gZWxzZSB7CisJCQkJCXJldCA9IEFORUdfRkFJTEVEOworCQkJCX0KKwkJCX0KKwkJfQorCQlicmVhazsKKworCWNhc2UgQU5FR19TVEFURV9JRExFX0RFVEVDVF9JTklUOgorCQlhcC0+bGlua190aW1lID0gYXAtPmN1cl90aW1lOworCQl0cC0+bWFjX21vZGUgJj0gfk1BQ19NT0RFX1NFTkRfQ09ORklHUzsKKwkJdHczMl9jYXJlZnVsbHkoTUFDX01PREUsIHRwLT5tYWNfbW9kZSk7CisKKwkJYXAtPnN0YXRlID0gQU5FR19TVEFURV9JRExFX0RFVEVDVDsKKwkJcmV0ID0gQU5FR19USU1FUl9FTkFCOworCQlicmVhazsKKworCWNhc2UgQU5FR19TVEFURV9JRExFX0RFVEVDVDoKKwkJaWYgKGFwLT5hYmlsaXR5X21hdGNoICE9IDAgJiYKKwkJICAgIGFwLT5yeGNvbmZpZyA9PSAwKSB7CisJCQlhcC0+c3RhdGUgPSBBTkVHX1NUQVRFX0FOX0VOQUJMRTsKKwkJCWJyZWFrOworCQl9CisJCWRlbHRhID0gYXAtPmN1cl90aW1lIC0gYXAtPmxpbmtfdGltZTsKKwkJaWYgKGRlbHRhID4gQU5FR19TVEFURV9TRVRUTEVfVElNRSkgeworCQkJLyogWFhYIGFub3RoZXIgZ2VtIGZyb20gdGhlIEJyb2FkY29tIGRyaXZlciA6KCAqLworCQkJYXAtPnN0YXRlID0gQU5FR19TVEFURV9MSU5LX09LOworCQl9CisJCWJyZWFrOworCisJY2FzZSBBTkVHX1NUQVRFX0xJTktfT0s6CisJCWFwLT5mbGFncyB8PSAoTVJfQU5fQ09NUExFVEUgfCBNUl9MSU5LX09LKTsKKwkJcmV0ID0gQU5FR19ET05FOworCQlicmVhazsKKworCWNhc2UgQU5FR19TVEFURV9ORVhUX1BBR0VfV0FJVF9JTklUOgorCQkvKiA/Pz8gdW5pbXBsZW1lbnRlZCAqLworCQlicmVhazsKKworCWNhc2UgQU5FR19TVEFURV9ORVhUX1BBR0VfV0FJVDoKKwkJLyogPz8/IHVuaW1wbGVtZW50ZWQgKi8KKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlyZXQgPSBBTkVHX0ZBSUxFRDsKKwkJYnJlYWs7CisJfTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgdGczX3NldHVwX2ZpYmVyX3BoeShzdHJ1Y3QgdGczICp0cCkKK3sKKwl1aW50MzJfdCBvcmlnX3BhdXNlX2NmZzsKKwl1aW50MTZfdCBvcmlnX2FjdGl2ZV9zcGVlZDsKKwl1aW50OF90IG9yaWdfYWN0aXZlX2R1cGxleDsKKwlpbnQgY3VycmVudF9saW5rX3VwOworCWludCBpOworCisJb3JpZ19wYXVzZV9jZmcgPQorCQkodHAtPnRnM19mbGFncyAmIChURzNfRkxBR19SWF9QQVVTRSB8CisJCQkJICBURzNfRkxBR19UWF9QQVVTRSkpOworCW9yaWdfYWN0aXZlX3NwZWVkID0gdHAtPmxpbmtfY29uZmlnLmFjdGl2ZV9zcGVlZDsKKwlvcmlnX2FjdGl2ZV9kdXBsZXggPSB0cC0+bGlua19jb25maWcuYWN0aXZlX2R1cGxleDsKKworCXRwLT5tYWNfbW9kZSAmPSB+KE1BQ19NT0RFX1BPUlRfTU9ERV9NQVNLIHwgTUFDX01PREVfSEFMRl9EVVBMRVgpOworCXRwLT5tYWNfbW9kZSB8PSBNQUNfTU9ERV9QT1JUX01PREVfVEJJOworCXR3MzJfY2FyZWZ1bGx5KE1BQ19NT0RFLCB0cC0+bWFjX21vZGUpOworCisJLyogUmVzZXQgd2hlbiBpbml0dGluZyBmaXJzdCB0aW1lIG9yIHdlIGhhdmUgYSBsaW5rLiAqLworCWlmICghKHRwLT50ZzNfZmxhZ3MgJiBURzNfRkxBR19JTklUX0NPTVBMRVRFKSB8fAorCSAgICAodHIzMihNQUNfU1RBVFVTKSAmIE1BQ19TVEFUVVNfUENTX1NZTkNFRCkpIHsKKwkJLyogU2V0IFBMTCBsb2NrIHJhbmdlLiAqLworCQl0ZzNfd3JpdGVwaHkodHAsIDB4MTYsIDB4ODAwNyk7CisKKwkJLyogU1cgcmVzZXQgKi8KKwkJdGczX3dyaXRlcGh5KHRwLCBNSUlfQk1DUiwgQk1DUl9SRVNFVCk7CisKKwkJLyogV2FpdCBmb3IgcmVzZXQgdG8gY29tcGxldGUuICovCisJCW1kZWxheSg1KTsKKworCQkvKiBDb25maWcgbW9kZTsgc2VsZWN0IFBNQS9DaCAxIHJlZ3MuICovCisJCXRnM193cml0ZXBoeSh0cCwgMHgxMCwgMHg4NDExKTsKKworCQkvKiBFbmFibGUgYXV0by1sb2NrIGFuZCBjb21kZXQsIHNlbGVjdCB0eGNsayBmb3IgdHguICovCisJCXRnM193cml0ZXBoeSh0cCwgMHgxMSwgMHgwYTEwKTsKKworCQl0ZzNfd3JpdGVwaHkodHAsIDB4MTgsIDB4MDBhMCk7CisJCXRnM193cml0ZXBoeSh0cCwgMHgxNiwgMHg0MWZmKTsKKworCQkvKiBBc3NlcnQgYW5kIGRlYXNzZXJ0IFBPUi4gKi8KKwkJdGczX3dyaXRlcGh5KHRwLCAweDEzLCAweDA0MDApOworCQl1ZGVsYXkoNDApOworCQl0ZzNfd3JpdGVwaHkodHAsIDB4MTMsIDB4MDAwMCk7CisKKwkJdGczX3dyaXRlcGh5KHRwLCAweDExLCAweDBhNTApOworCQl1ZGVsYXkoNDApOworCQl0ZzNfd3JpdGVwaHkodHAsIDB4MTEsIDB4MGExMCk7CisKKwkJLyogV2FpdCBmb3Igc2lnbmFsIHRvIHN0YWJpbGl6ZSAqLworCQltZGVsYXkoMTUwKTsKKworCQkvKiBEZXNlbGVjdCB0aGUgY2hhbm5lbCByZWdpc3RlciBzbyB3ZSBjYW4gcmVhZCB0aGUgUEhZSUQKKwkJICogbGF0ZXIuCisJCSAqLworCQl0ZzNfd3JpdGVwaHkodHAsIDB4MTAsIDB4ODAxMSk7CisJfQorCisJLyogRGlzYWJsZSBsaW5rIGNoYW5nZSBpbnRlcnJ1cHQuICAqLworCXR3MzJfY2FyZWZ1bGx5KE1BQ19FVkVOVCwgMCk7CisKKwljdXJyZW50X2xpbmtfdXAgPSAwOworCWlmICh0cjMyKE1BQ19TVEFUVVMpICYgTUFDX1NUQVRVU19QQ1NfU1lOQ0VEKSB7CisJCWlmICghKHRwLT50ZzNfZmxhZ3MgJiBURzNfRkxBR19HT1RfU0VSREVTX0ZMT1dDVEwpKSB7CisJCQlzdHJ1Y3QgdGczX2ZpYmVyX2FuZWdpbmZvIGFuaW5mbzsKKwkJCWludCBzdGF0dXMgPSBBTkVHX0ZBSUxFRDsKKwkJCXVuc2lnbmVkIGludCB0aWNrOworCQkJdWludDMyX3QgdG1wOworCisJCQltZW1zZXQoJmFuaW5mbywgMCwgc2l6ZW9mKGFuaW5mbykpOworCQkJYW5pbmZvLmZsYWdzIHw9IChNUl9BTl9FTkFCTEUpOworCisJCQl0dzMyKE1BQ19UWF9BVVRPX05FRywgMCk7CisKKwkJCXRtcCA9IHRwLT5tYWNfbW9kZSAmIH5NQUNfTU9ERV9QT1JUX01PREVfTUFTSzsKKwkJCXR3MzJfY2FyZWZ1bGx5KE1BQ19NT0RFLCB0bXAgfCBNQUNfTU9ERV9QT1JUX01PREVfR01JSSk7CisKKwkJCXR3MzJfY2FyZWZ1bGx5KE1BQ19NT0RFLCB0cC0+bWFjX21vZGUgfCBNQUNfTU9ERV9TRU5EX0NPTkZJR1MpOworCisJCQlhbmluZm8uc3RhdGUgPSBBTkVHX1NUQVRFX1VOS05PV047CisJCQlhbmluZm8uY3VyX3RpbWUgPSAwOworCQkJdGljayA9IDA7CisJCQl3aGlsZSAoKyt0aWNrIDwgMTk1MDAwKSB7CisJCQkJc3RhdHVzID0gdGczX2ZpYmVyX2FuZWdfc21hY2hpbmUodHAsICZhbmluZm8pOworCQkJCWlmIChzdGF0dXMgPT0gQU5FR19ET05FIHx8CisJCQkJICAgIHN0YXR1cyA9PSBBTkVHX0ZBSUxFRCkKKwkJCQkJYnJlYWs7CisKKwkJCQl1ZGVsYXkoMSk7CisJCQl9CisKKwkJCXRwLT5tYWNfbW9kZSAmPSB+TUFDX01PREVfU0VORF9DT05GSUdTOworCQkJdHczMl9jYXJlZnVsbHkoTUFDX01PREUsIHRwLT5tYWNfbW9kZSk7CisKKwkJCWlmIChzdGF0dXMgPT0gQU5FR19ET05FICYmCisJCQkgICAgKGFuaW5mby5mbGFncyAmCisJCQkgICAgIChNUl9BTl9DT01QTEVURSB8IE1SX0xJTktfT0sgfAorCQkJICAgICAgTVJfTFBfQURWX0ZVTExfRFVQTEVYKSkpIHsKKwkJCQl1aW50MzJfdCBsb2NhbF9hZHYsIHJlbW90ZV9hZHY7CisKKwkJCQlsb2NhbF9hZHYgPSBBRFZFUlRJU0VfUEFVU0VfQ0FQOworCQkJCXJlbW90ZV9hZHYgPSAwOworCQkJCWlmIChhbmluZm8uZmxhZ3MgJiBNUl9MUF9BRFZfU1lNX1BBVVNFKQorCQkJCQlyZW1vdGVfYWR2IHw9IExQQV9QQVVTRV9DQVA7CisJCQkJaWYgKGFuaW5mby5mbGFncyAmIE1SX0xQX0FEVl9BU1lNX1BBVVNFKQorCQkJCQlyZW1vdGVfYWR2IHw9IExQQV9QQVVTRV9BU1lNOworCisJCQkJdGczX3NldHVwX2Zsb3dfY29udHJvbCh0cCwgbG9jYWxfYWR2LCByZW1vdGVfYWR2KTsKKworCQkJCXRwLT50ZzNfZmxhZ3MgfD0KKwkJCQkJVEczX0ZMQUdfR09UX1NFUkRFU19GTE9XQ1RMOworCQkJCWN1cnJlbnRfbGlua191cCA9IDE7CisJCQl9CisJCQlmb3IgKGkgPSAwOyBpIDwgNjA7IGkrKykgeworCQkJCXVkZWxheSgyMCk7CisJCQkJdHczMl9jYXJlZnVsbHkoTUFDX1NUQVRVUywKKwkJCQkJKE1BQ19TVEFUVVNfU1lOQ19DSEFOR0VEIHwgTUFDX1NUQVRVU19DRkdfQ0hBTkdFRCkpOworCQkJCWlmICgodHIzMihNQUNfU1RBVFVTKSAmCisJCQkJICAgICAoTUFDX1NUQVRVU19TWU5DX0NIQU5HRUQgfAorCQkJCSAgICAgIE1BQ19TVEFUVVNfQ0ZHX0NIQU5HRUQpKSA9PSAwKQorCQkJCQlicmVhazsKKwkJCX0KKwkJCWlmIChjdXJyZW50X2xpbmtfdXAgPT0gMCAmJgorCQkJICAgICh0cjMyKE1BQ19TVEFUVVMpICYgTUFDX1NUQVRVU19QQ1NfU1lOQ0VEKSkgeworCQkJCWN1cnJlbnRfbGlua191cCA9IDE7CisJCQl9CisJCX0gZWxzZSB7CisJCQkvKiBGb3JjaW5nIDEwMDBGRCBsaW5rIHVwLiAqLworCQkJY3VycmVudF9saW5rX3VwID0gMTsKKwkJfQorCX0KKworCXRwLT5tYWNfbW9kZSAmPSB+TUFDX01PREVfTElOS19QT0xBUklUWTsKKwl0dzMyX2NhcmVmdWxseShNQUNfTU9ERSwgdHAtPm1hY19tb2RlKTsKKworCXRwLT5od19zdGF0dXMtPnN0YXR1cyA9CisJCShTRF9TVEFUVVNfVVBEQVRFRCB8CisJCSAodHAtPmh3X3N0YXR1cy0+c3RhdHVzICYgflNEX1NUQVRVU19MSU5LX0NIRykpOworCisJZm9yIChpID0gMDsgaSA8IDEwMDsgaSsrKSB7CisJCXVkZWxheSgyMCk7CisJCXR3MzJfY2FyZWZ1bGx5KE1BQ19TVEFUVVMsCisJCQkoTUFDX1NUQVRVU19TWU5DX0NIQU5HRUQgfCBNQUNfU1RBVFVTX0NGR19DSEFOR0VEKSk7CisJCWlmICgodHIzMihNQUNfU1RBVFVTKSAmCisJCSAgICAgKE1BQ19TVEFUVVNfU1lOQ19DSEFOR0VEIHwKKwkJICAgICAgTUFDX1NUQVRVU19DRkdfQ0hBTkdFRCkpID09IDApCisJCQlicmVhazsKKwl9CisKKwlpZiAoKHRyMzIoTUFDX1NUQVRVUykgJiBNQUNfU1RBVFVTX1BDU19TWU5DRUQpID09IDApCisJCWN1cnJlbnRfbGlua191cCA9IDA7CisKKwlpZiAoY3VycmVudF9saW5rX3VwID09IDEpIHsKKwkJdHAtPmxpbmtfY29uZmlnLmFjdGl2ZV9zcGVlZCA9IFNQRUVEXzEwMDA7CisJCXRwLT5saW5rX2NvbmZpZy5hY3RpdmVfZHVwbGV4ID0gRFVQTEVYX0ZVTEw7CisJfSBlbHNlIHsKKwkJdHAtPmxpbmtfY29uZmlnLmFjdGl2ZV9zcGVlZCA9IFNQRUVEX0lOVkFMSUQ7CisJCXRwLT5saW5rX2NvbmZpZy5hY3RpdmVfZHVwbGV4ID0gRFVQTEVYX0lOVkFMSUQ7CisJfQorCisJaWYgKGN1cnJlbnRfbGlua191cCAhPSB0cC0+Y2Fycmllcl9vaykgeworCQl0cC0+Y2Fycmllcl9vayA9IGN1cnJlbnRfbGlua191cDsKKwkJdGczX2xpbmtfcmVwb3J0KHRwKTsKKwl9IGVsc2UgeworCQl1aW50MzJfdCBub3dfcGF1c2VfY2ZnID0KKwkJCXRwLT50ZzNfZmxhZ3MgJiAoVEczX0ZMQUdfUlhfUEFVU0UgfAorCQkJCQkgVEczX0ZMQUdfVFhfUEFVU0UpOworCQlpZiAob3JpZ19wYXVzZV9jZmcgIT0gbm93X3BhdXNlX2NmZyB8fAorCQkgICAgb3JpZ19hY3RpdmVfc3BlZWQgIT0gdHAtPmxpbmtfY29uZmlnLmFjdGl2ZV9zcGVlZCB8fAorCQkgICAgb3JpZ19hY3RpdmVfZHVwbGV4ICE9IHRwLT5saW5rX2NvbmZpZy5hY3RpdmVfZHVwbGV4KQorCQkJdGczX2xpbmtfcmVwb3J0KHRwKTsKKwl9CisKKwlpZiAoKHRyMzIoTUFDX1NUQVRVUykgJiBNQUNfU1RBVFVTX1BDU19TWU5DRUQpID09IDApIHsKKwkJdHczMl9jYXJlZnVsbHkoTUFDX01PREUsIHRwLT5tYWNfbW9kZSB8IE1BQ19NT0RFX0xJTktfUE9MQVJJVFkpOworCQlpZiAodHAtPnRnM19mbGFncyAmIFRHM19GTEFHX0lOSVRfQ09NUExFVEUpIHsKKwkJCXR3MzJfY2FyZWZ1bGx5KE1BQ19NT0RFLCB0cC0+bWFjX21vZGUpOworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisjZWxzZQorI2RlZmluZSB0ZzNfc2V0dXBfZmliZXJfcGh5KFRQKSAoLUVJTlZBTCkKKyNlbmRpZiAvKiBTVVBQT1JUX0ZJQkVSX1BIWSAqLworCitzdGF0aWMgaW50IHRnM19zZXR1cF9waHkoc3RydWN0IHRnMyAqdHApCit7CisJaW50IGVycjsKKworCWlmICh0cC0+cGh5X2lkID09IFBIWV9JRF9TRVJERVMpIHsKKwkJZXJyID0gdGczX3NldHVwX2ZpYmVyX3BoeSh0cCk7CisJfSBlbHNlIHsKKwkJZXJyID0gdGczX3NldHVwX2NvcHBlcl9waHkodHApOworCX0KKworCWlmICh0cC0+bGlua19jb25maWcuYWN0aXZlX3NwZWVkID09IFNQRUVEXzEwMDAgJiYKKwkgICAgdHAtPmxpbmtfY29uZmlnLmFjdGl2ZV9kdXBsZXggPT0gRFVQTEVYX0hBTEYpCisJCXR3MzIoTUFDX1RYX0xFTkdUSFMsCisJCSAgICAgKCgyIDw8IFRYX0xFTkdUSFNfSVBHX0NSU19TSElGVCkgfAorCQkgICAgICAoNiA8PCBUWF9MRU5HVEhTX0lQR19TSElGVCkgfAorCQkgICAgICAoMHhmZiA8PCBUWF9MRU5HVEhTX1NMT1RfVElNRV9TSElGVCkpKTsKKwllbHNlCisJCXR3MzIoTUFDX1RYX0xFTkdUSFMsCisJCSAgICAgKCgyIDw8IFRYX0xFTkdUSFNfSVBHX0NSU19TSElGVCkgfAorCQkgICAgICAoNiA8PCBUWF9MRU5HVEhTX0lQR19TSElGVCkgfAorCQkgICAgICAoMzIgPDwgVFhfTEVOR1RIU19TTE9UX1RJTUVfU0hJRlQpKSk7CisKKwlyZXR1cm4gZXJyOworfQorCisKKyNkZWZpbmUgTUFYX1dBSVRfQ05UIDEwMDAKKworLyogVG8gc3RvcCBhIGJsb2NrLCBjbGVhciB0aGUgZW5hYmxlIGJpdCBhbmQgcG9sbCB0aWxsIGl0CisgKiBjbGVhcnMuICAKKyAqLworc3RhdGljIGludCB0ZzNfc3RvcF9ibG9jayhzdHJ1Y3QgdGczICp0cCwgdW5zaWduZWQgbG9uZyBvZnMsIHVpbnQzMl90IGVuYWJsZV9iaXQpCit7CisJdW5zaWduZWQgaW50IGk7CisJdWludDMyX3QgdmFsOworCisJaWYgKEdFVF9BU0lDX1JFVih0cC0+cGNpX2NoaXBfcmV2X2lkKSA9PSBBU0lDX1JFVl81NzA1KSB7CisJCXN3aXRjaChvZnMpIHsKKwkJY2FzZSBSQ1ZMU0NfTU9ERToKKwkJY2FzZSBETUFDX01PREU6CisJCWNhc2UgTUJGUkVFX01PREU6CisJCWNhc2UgQlVGTUdSX01PREU6CisJCWNhc2UgTUVNQVJCX01PREU6CisJCQkvKiBXZSBjYW4ndCBlbmFibGUvZGlzYWJsZSB0aGVzZSBiaXRzIG9mIHRoZQorCQkJICogNTcwNSwganVzdCBzYXkgc3VjY2Vzcy4KKwkJCSAqLworCQkJcmV0dXJuIDA7CisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwkJfQorCX0KKwl2YWwgPSB0cjMyKG9mcyk7CisJdmFsICY9IH5lbmFibGVfYml0OworCXR3MzIob2ZzLCB2YWwpOworCXRyMzIob2ZzKTsKKworCWZvciAoaSA9IDA7IGkgPCBNQVhfV0FJVF9DTlQ7IGkrKykgeworCQl1ZGVsYXkoMTAwKTsKKwkJdmFsID0gdHIzMihvZnMpOworCQlpZiAoKHZhbCAmIGVuYWJsZV9iaXQpID09IDApCisJCQlicmVhazsKKwl9CisKKwlpZiAoaSA9PSBNQVhfV0FJVF9DTlQpIHsKKwkJcHJpbnRmKCJ0ZzNfc3RvcF9ibG9jayB0aW1lZCBvdXQsIG9mcz0lbHggZW5hYmxlX2JpdD0leFxuIiwKKwkJICAgICAgIG9mcywgZW5hYmxlX2JpdCk7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHRnM19hYm9ydF9odyhzdHJ1Y3QgdGczICp0cCkKK3sKKwlpbnQgaSwgZXJyOworCisJdGczX2Rpc2FibGVfaW50cyh0cCk7CisKKwl0cC0+cnhfbW9kZSAmPSB+UlhfTU9ERV9FTkFCTEU7CisJdHczMl9jYXJlZnVsbHkoTUFDX1JYX01PREUsIHRwLT5yeF9tb2RlKTsKKworCWVyciAgPSB0ZzNfc3RvcF9ibG9jayh0cCwgUkNWQkRJX01PREUsICAgUkNWQkRJX01PREVfRU5BQkxFKTsKKwllcnIgfD0gdGczX3N0b3BfYmxvY2sodHAsIFJDVkxQQ19NT0RFLCAgIFJDVkxQQ19NT0RFX0VOQUJMRSk7CisJZXJyIHw9IHRnM19zdG9wX2Jsb2NrKHRwLCBSQ1ZMU0NfTU9ERSwgICBSQ1ZMU0NfTU9ERV9FTkFCTEUpOworCWVyciB8PSB0ZzNfc3RvcF9ibG9jayh0cCwgUkNWREJESV9NT0RFLCAgUkNWREJESV9NT0RFX0VOQUJMRSk7CisJZXJyIHw9IHRnM19zdG9wX2Jsb2NrKHRwLCBSQ1ZEQ0NfTU9ERSwgICBSQ1ZEQ0NfTU9ERV9FTkFCTEUpOworCWVyciB8PSB0ZzNfc3RvcF9ibG9jayh0cCwgUkNWQ0NfTU9ERSwgICAgUkNWQ0NfTU9ERV9FTkFCTEUpOworCisJZXJyIHw9IHRnM19zdG9wX2Jsb2NrKHRwLCBTTkRCRFNfTU9ERSwgICBTTkRCRFNfTU9ERV9FTkFCTEUpOworCWVyciB8PSB0ZzNfc3RvcF9ibG9jayh0cCwgU05EQkRJX01PREUsICAgU05EQkRJX01PREVfRU5BQkxFKTsKKwllcnIgfD0gdGczX3N0b3BfYmxvY2sodHAsIFNORERBVEFJX01PREUsIFNORERBVEFJX01PREVfRU5BQkxFKTsKKwllcnIgfD0gdGczX3N0b3BfYmxvY2sodHAsIFJETUFDX01PREUsICAgIFJETUFDX01PREVfRU5BQkxFKTsKKwllcnIgfD0gdGczX3N0b3BfYmxvY2sodHAsIFNORERBVEFDX01PREUsIFNORERBVEFDX01PREVfRU5BQkxFKTsKKwllcnIgfD0gdGczX3N0b3BfYmxvY2sodHAsIFNOREJEQ19NT0RFLCAgIFNOREJEQ19NT0RFX0VOQUJMRSk7CisJaWYgKGVycikKKwkJZ290byBvdXQ7CisKKwl0cC0+bWFjX21vZGUgJj0gfk1BQ19NT0RFX1RERV9FTkFCTEU7CisJdHczMl9jYXJlZnVsbHkoTUFDX01PREUsIHRwLT5tYWNfbW9kZSk7CisKKwl0cC0+dHhfbW9kZSAmPSB+VFhfTU9ERV9FTkFCTEU7CisJdHczMl9jYXJlZnVsbHkoTUFDX1RYX01PREUsIHRwLT50eF9tb2RlKTsKKworCWZvciAoaSA9IDA7IGkgPCBNQVhfV0FJVF9DTlQ7IGkrKykgeworCQl1ZGVsYXkoMTAwKTsKKwkJaWYgKCEodHIzMihNQUNfVFhfTU9ERSkgJiBUWF9NT0RFX0VOQUJMRSkpCisJCQlicmVhazsKKwl9CisJaWYgKGkgPj0gTUFYX1dBSVRfQ05UKSB7CisJCXByaW50ZigidGczX2Fib3J0X2h3IHRpbWVkIG91dCBUWF9NT0RFX0VOQUJMRSB3aWxsIG5vdCBjbGVhciBNQUNfVFhfTU9ERT0leFxuIiwKKwkJCXRyMzIoTUFDX1RYX01PREUpKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJZXJyICA9IHRnM19zdG9wX2Jsb2NrKHRwLCBIT1NUQ0NfTU9ERSwgSE9TVENDX01PREVfRU5BQkxFKTsKKwllcnIgfD0gdGczX3N0b3BfYmxvY2sodHAsIFdETUFDX01PREUsICBXRE1BQ19NT0RFX0VOQUJMRSk7CisJZXJyIHw9IHRnM19zdG9wX2Jsb2NrKHRwLCBNQkZSRUVfTU9ERSwgTUJGUkVFX01PREVfRU5BQkxFKTsKKworCXR3MzIoRlRRX1JFU0VULCAweGZmZmZmZmZmKTsKKwl0dzMyKEZUUV9SRVNFVCwgMHgwMDAwMDAwMCk7CisKKwllcnIgfD0gdGczX3N0b3BfYmxvY2sodHAsIEJVRk1HUl9NT0RFLCBCVUZNR1JfTU9ERV9FTkFCTEUpOworCWVyciB8PSB0ZzNfc3RvcF9ibG9jayh0cCwgTUVNQVJCX01PREUsIE1FTUFSQl9NT0RFX0VOQUJMRSk7CisJaWYgKGVycikKKwkJZ290byBvdXQ7CisKKwltZW1zZXQodHAtPmh3X3N0YXR1cywgMCwgVEczX0hXX1NUQVRVU19TSVpFKTsKKworb3V0OgorCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyB2b2lkIHRnM19jaGlwX3Jlc2V0KHN0cnVjdCB0ZzMgKnRwKQoreworCXVpbnQzMl90IHZhbDsKKworCWlmICghKHRwLT50ZzNfZmxhZ3MyICYgVEczX0ZMRzJfU1VOXzU3MDQpKSB7CisJCS8qIEZvcmNlIE5WUkFNIHRvIHNldHRsZS4KKwkJICogVGhpcyBkZWFscyB3aXRoIGEgY2hpcCBidWcgd2hpY2ggY2FuIHJlc3VsdCBpbiBFRVBST00KKwkJICogY29ycnVwdGlvbi4KKwkJICovCisJCWlmICh0cC0+dGczX2ZsYWdzICYgVEczX0ZMQUdfTlZSQU0pIHsKKwkJCWludCBpOworCQorCQkJdHczMihOVlJBTV9TV0FSQiwgU1dBUkJfUkVRX1NFVDEpOworCQkJZm9yIChpID0gMDsgaSA8IDEwMDAwMDsgaSsrKSB7CisJCQkJaWYgKHRyMzIoTlZSQU1fU1dBUkIpICYgU1dBUkJfR05UMSkKKwkJCQkJYnJlYWs7CisJCQkJdWRlbGF5KDEwKTsKKwkJCX0KKwkJfQorCX0KKwkvKiBJbiBFdGhlcmJvb3Qgd2UgZG9uJ3QgbmVlZCB0byB3b3JyeSBhYm91dCB0aGUgNTcwMQorCSAqIFJFR19XUklURV9CVUcgYmVjYXVzZSB3ZSBkbyBhbGwgcmVnaXN0ZXIgd3JpdGVzIGluZGlyZWN0bHkuCisJICovCisKKwkvKiBkbyB0aGUgcmVzZXQgKi8KKwl2YWwgPSBHUkNfTUlTQ19DRkdfQ09SRUNMS19SRVNFVDsKKwlpZiAoR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpID09IEFTSUNfUkVWXzU3MDUpCisJCXZhbCB8PSBHUkNfTUlTQ19DRkdfS0VFUF9HUEhZX1BPV0VSOworCXR3MzIoR1JDX01JU0NfQ0ZHLCB2YWwpOworCisJLyogRmx1c2ggUENJIHBvc3RlZCB3cml0ZXMuICBUaGUgbm9ybWFsIE1NSU8gcmVnaXN0ZXJzCisJICogYXJlIGluYWNjZXNzaWJsZSBhdCB0aGlzIHRpbWUgc28gdGhpcyBpcyB0aGUgb25seQorCSAqIHdheSB0byBtYWtlIHRoaXMgcmVsaWFibHkuICBJIHRyaWVkIHRvIHVzZSBpbmRpcmVjdAorCSAqIHJlZ2lzdGVyIHJlYWQvd3JpdGUgYnV0IHRoaXMgdXBzZXQgc29tZSA1NzAxIHZhcmlhbnRzLgorCSAqLworCXBjaV9yZWFkX2NvbmZpZ19kd29yZCh0cC0+cGRldiwgUENJX0NPTU1BTkQsICZ2YWwpOworCisJdWRlbGF5KDEyMCk7CisKKwkvKiBSZS1lbmFibGUgaW5kaXJlY3QgcmVnaXN0ZXIgYWNjZXNzZXMuICovCisJcGNpX3dyaXRlX2NvbmZpZ19kd29yZCh0cC0+cGRldiwgVEczUENJX01JU0NfSE9TVF9DVFJMLAorCQkJICAgICAgIHRwLT5taXNjX2hvc3RfY3RybCk7CisKKwkvKiBTZXQgTUFYIFBDSSByZXRyeSB0byB6ZXJvLiAqLworCXZhbCA9IChQQ0lTVEFURV9ST01fRU5BQkxFIHwgUENJU1RBVEVfUk9NX1JFVFJZX0VOQUJMRSk7CisJaWYgKHRwLT5wY2lfY2hpcF9yZXZfaWQgPT0gQ0hJUFJFVl9JRF81NzA0X0EwICYmCisJICAgICh0cC0+dGczX2ZsYWdzICYgVEczX0ZMQUdfUENJWF9NT0RFKSkKKwkJdmFsIHw9IFBDSVNUQVRFX1JFVFJZX1NBTUVfRE1BOworCXBjaV93cml0ZV9jb25maWdfZHdvcmQodHAtPnBkZXYsIFRHM1BDSV9QQ0lTVEFURSwgdmFsKTsKKworCXBjaV9yZXN0b3JlX3N0YXRlKHRwLT5wZGV2LCB0cC0+cGNpX2NmZ19zdGF0ZSk7CisKKwkvKiBNYWtlIHN1cmUgUENJLVggcmVsYXhlZCBvcmRlcmluZyBiaXQgaXMgY2xlYXIuICovCisJcGNpX3JlYWRfY29uZmlnX2R3b3JkKHRwLT5wZGV2LCBURzNQQ0lfWF9DQVBTLCAmdmFsKTsKKwl2YWwgJj0gflBDSVhfQ0FQU19SRUxBWEVEX09SREVSSU5HOworCXBjaV93cml0ZV9jb25maWdfZHdvcmQodHAtPnBkZXYsIFRHM1BDSV9YX0NBUFMsIHZhbCk7CisKKwl0dzMyKE1FTUFSQl9NT0RFLCBNRU1BUkJfTU9ERV9FTkFCTEUpOworCisJaWYgKCgodHAtPm5pY19zcmFtX2RhdGFfY2ZnICYgTklDX1NSQU1fREFUQV9DRkdfTUlOSV9QQ0kpICE9IDApICYmCisJCShHRVRfQVNJQ19SRVYodHAtPnBjaV9jaGlwX3Jldl9pZCkgPT0gQVNJQ19SRVZfNTcwNSkpIHsKKwkJdHAtPnBjaV9jbG9ja19jdHJsIHw9CisJCQkoQ0xPQ0tfQ1RSTF9GT1JDRV9DTEtSVU4gfCBDTE9DS19DVFJMX0NMS1JVTl9PRU5BQkxFKTsKKwkJdHczMihURzNQQ0lfQ0xPQ0tfQ1RSTCwgdHAtPnBjaV9jbG9ja19jdHJsKTsKKwl9CisKKwl0dzMyKFRHM1BDSV9NSVNDX0hPU1RfQ1RSTCwgdHAtPm1pc2NfaG9zdF9jdHJsKTsKK30KKworc3RhdGljIHZvaWQgdGczX3N0b3BfZncoc3RydWN0IHRnMyAqdHApCit7CisJaWYgKHRwLT50ZzNfZmxhZ3MgJiBURzNfRkxBR19FTkFCTEVfQVNGKSB7CisJCXVpbnQzMl90IHZhbDsKKwkJaW50IGk7CisKKwkJdGczX3dyaXRlX21lbShOSUNfU1JBTV9GV19DTURfTUJPWCwgRldDTURfTklDRFJWX1BBVVNFX0ZXKTsKKwkJdmFsID0gdHIzMihHUkNfUlhfQ1BVX0VWRU5UKTsKKwkJdmFsIHw9ICgxIDw8IDE0KTsKKwkJdHczMihHUkNfUlhfQ1BVX0VWRU5ULCB2YWwpOworCisJCS8qIFdhaXQgZm9yIFJYIGNwdSB0byBBQ0sgdGhlIGV2ZW50LiAgKi8KKwkJZm9yIChpID0gMDsgaSA8IDEwMDsgaSsrKSB7CisJCQlpZiAoISh0cjMyKEdSQ19SWF9DUFVfRVZFTlQpICYgKDEgPDwgMTQpKSkKKwkJCQlicmVhazsKKwkJCXVkZWxheSgxKTsKKwkJfQorCX0KK30KKworc3RhdGljIGludCB0ZzNfcmVzdGFydF9mdyhzdHJ1Y3QgdGczICp0cCwgdWludDMyX3Qgc3RhdGUpCit7CisJdWludDMyX3QgdmFsOworCWludCBpOworCQorCXRnM193cml0ZV9tZW0oTklDX1NSQU1fRklSTVdBUkVfTUJPWCwgCisJCU5JQ19TUkFNX0ZJUk1XQVJFX01CT1hfTUFHSUMxKTsKKwkvKiBXYWl0IGZvciBmaXJtd2FyZSBpbml0aWFsaXphdGlvbiB0byBjb21wbGV0ZS4gKi8KKwlmb3IgKGkgPSAwOyBpIDwgMTAwMDAwOyBpKyspIHsKKwkJdGczX3JlYWRfbWVtKE5JQ19TUkFNX0ZJUk1XQVJFX01CT1gsICZ2YWwpOworCQlpZiAodmFsID09ICh1aW50MzJfdCkgfk5JQ19TUkFNX0ZJUk1XQVJFX01CT1hfTUFHSUMxKQorCQkJYnJlYWs7CisJCXVkZWxheSgxMCk7CisJfQorCWlmIChpID49IDEwMDAwMCAmJgorCQkgICAgISh0cC0+dGczX2ZsYWdzMiAmIFRHM19GTEcyX1NVTl81NzA0KSkgeworCQlwcmludGYoIkZpcm13YXJlIHdpbGwgbm90IHJlc3RhcnQgbWFnaWM9JXhcbiIsCisJCQl2YWwpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisJaWYgKCEodHAtPnRnM19mbGFncyAmIFRHM19GTEFHX0VOQUJMRV9BU0YpKSB7CisJCXN0YXRlID0gRFJWX1NUQVRFX1NVU1BFTkQ7CisJfQorCXRnM193cml0ZV9tZW0oTklDX1NSQU1fRldfRFJWX1NUQVRFX01CT1gsIHN0YXRlKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB0ZzNfaGFsdChzdHJ1Y3QgdGczICp0cCkKK3sKKwl0ZzNfc3RvcF9mdyh0cCk7CisJdGczX2Fib3J0X2h3KHRwKTsKKwl0ZzNfY2hpcF9yZXNldCh0cCk7CisJcmV0dXJuIHRnM19yZXN0YXJ0X2Z3KHRwLCBEUlZfU1RBVEVfVU5MT0FEKTsKK30KKworc3RhdGljIHZvaWQgX190ZzNfc2V0X21hY19hZGRyKHN0cnVjdCB0ZzMgKnRwKQoreworCXVpbnQzMl90IGFkZHJfaGlnaCwgYWRkcl9sb3c7CisJaW50IGk7CisKKwlhZGRyX2hpZ2ggPSAoKHRwLT5uaWMtPm5vZGVfYWRkclswXSA8PCA4KSB8CisJCSAgICAgdHAtPm5pYy0+bm9kZV9hZGRyWzFdKTsKKwlhZGRyX2xvdyA9ICgodHAtPm5pYy0+bm9kZV9hZGRyWzJdIDw8IDI0KSB8CisJCSAgICAodHAtPm5pYy0+bm9kZV9hZGRyWzNdIDw8IDE2KSB8CisJCSAgICAodHAtPm5pYy0+bm9kZV9hZGRyWzRdIDw8ICA4KSB8CisJCSAgICAodHAtPm5pYy0+bm9kZV9hZGRyWzVdIDw8ICAwKSk7CisJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworCQl0dzMyKE1BQ19BRERSXzBfSElHSCArIChpICogOCksIGFkZHJfaGlnaCk7CisJCXR3MzIoTUFDX0FERFJfMF9MT1cgKyAoaSAqIDgpLCBhZGRyX2xvdyk7CisJfQorCisJaWYgKChHRVRfQVNJQ19SRVYodHAtPnBjaV9jaGlwX3Jldl9pZCkgIT0gQVNJQ19SRVZfNTcwMCkgJiYKKwkJKEdFVF9BU0lDX1JFVih0cC0+cGNpX2NoaXBfcmV2X2lkKSAhPSBBU0lDX1JFVl81NzAxKSAmJgorCQkoR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpICE9IEFTSUNfUkVWXzU3MDUpKSB7CisJCWZvcihpID0gMDsgaSA8IDEyOyBpKyspIHsKKwkJCXR3MzIoTUFDX0VYVEFERFJfMF9ISUdIICsgKGkgKiA4KSwgYWRkcl9oaWdoKTsKKwkJCXR3MzIoTUFDX0VYVEFERFJfMF9MT1cgKyAoaSAqIDgpLCBhZGRyX2xvdyk7CisJCX0KKwl9CisJYWRkcl9oaWdoID0gKHRwLT5uaWMtPm5vZGVfYWRkclswXSArCisJCSAgICAgdHAtPm5pYy0+bm9kZV9hZGRyWzFdICsKKwkJICAgICB0cC0+bmljLT5ub2RlX2FkZHJbMl0gKworCQkgICAgIHRwLT5uaWMtPm5vZGVfYWRkclszXSArCisJCSAgICAgdHAtPm5pYy0+bm9kZV9hZGRyWzRdICsKKwkJICAgICB0cC0+bmljLT5ub2RlX2FkZHJbNV0pICYKKwkJVFhfQkFDS09GRl9TRUVEX01BU0s7CisJdHczMihNQUNfVFhfQkFDS09GRl9TRUVELCBhZGRyX2hpZ2gpOworfQorCitzdGF0aWMgdm9pZCB0ZzNfc2V0X2JkaW5mbyhzdHJ1Y3QgdGczICp0cCwgdWludDMyX3QgYmRpbmZvX2FkZHIsCisJCQkgICBkbWFfYWRkcl90IG1hcHBpbmcsIHVpbnQzMl90IG1heGxlbl9mbGFncywKKwkJCSAgIHVpbnQzMl90IG5pY19hZGRyKQoreworCXRnM193cml0ZV9tZW0oKGJkaW5mb19hZGRyICsKKwkJICAgICAgIFRHM19CRElORk9fSE9TVF9BRERSICsgVEczXzY0QklUX1JFR19ISUdIKSwKKwkJICAgICAgKCh1aW50NjRfdCkgbWFwcGluZyA+PiAzMikpOworCXRnM193cml0ZV9tZW0oKGJkaW5mb19hZGRyICsKKwkJICAgICAgIFRHM19CRElORk9fSE9TVF9BRERSICsgVEczXzY0QklUX1JFR19MT1cpLAorCQkgICAgICAoKHVpbnQ2NF90KSBtYXBwaW5nICYgMHhmZmZmZmZmZikpOworCXRnM193cml0ZV9tZW0oKGJkaW5mb19hZGRyICsKKwkJICAgICAgIFRHM19CRElORk9fTUFYTEVOX0ZMQUdTKSwKKwkJICAgICAgIG1heGxlbl9mbGFncyk7CisJaWYgKEdFVF9BU0lDX1JFVih0cC0+cGNpX2NoaXBfcmV2X2lkKSAhPSBBU0lDX1JFVl81NzA1KSB7CisJCXRnM193cml0ZV9tZW0oKGJkaW5mb19hZGRyICsgVEczX0JESU5GT19OSUNfQUREUiksIG5pY19hZGRyKTsKKwl9Cit9CisKKworc3RhdGljIHZvaWQgdGczX2luaXRfcmluZ3Moc3RydWN0IHRnMyAqdHApCit7CisJdW5zaWduZWQgaTsKKworCS8qIFplcm8gb3V0IHRoZSB0ZzMgdmFyaWFibGVzICovCisJbWVtc2V0KCZ0ZzNfYnNzLCAwLCBzaXplb2YodGczX2JzcykpOworCXRwLT5yeF9zdGQgICAgPSAmdGczX2Jzcy5yeF9zdGRbMF07CisJdHAtPnJ4X3JjYiAgICA9ICZ0ZzNfYnNzLnJ4X3JjYlswXTsKKwl0cC0+dHhfcmluZyAgID0gJnRnM19ic3MudHhfcmluZ1swXTsKKwl0cC0+aHdfc3RhdHVzID0gJnRnM19ic3MuaHdfc3RhdHVzOworCXRwLT5od19zdGF0cyAgPSAmdGczX2Jzcy5od19zdGF0czsKKwl0cC0+bWFjX21vZGUgID0gMDsKKworCisJLyogSW5pdGlhbGl6ZSB0eC9yeCByaW5ncyBmb3IgcGFja2V0IHByb2Nlc3NpbmcuCisJICoKKwkgKiBUaGUgY2hpcCBoYXMgYmVlbiBzaHV0IGRvd24gYW5kIHRoZSBkcml2ZXIgZGV0YWNoZWQgZnJvbQorCSAqIHRoZSBuZXR3b3JraW5nLCBzbyBubyBpbnRlcnJ1cHRzIG9yIG5ldyB0eCBwYWNrZXRzIHdpbGwKKwkgKiBlbmQgdXAgaW4gdGhlIGRyaXZlci4KKwkgKi8KKworCS8qIEluaXRpYWxpemUgaW52YXJpYW50cyBvZiB0aGUgcmluZ3MsIHdlIG9ubHkgc2V0IHRoaXMKKwkgKiBzdHVmZiBvbmNlLiAgVGhpcyB3b3JrcyBiZWNhdXNlIHRoZSBjYXJkIGRvZXMgbm90CisJICogd3JpdGUgaW50byB0aGUgcnggYnVmZmVyIHBvc3RpbmcgcmluZ3MuCisJICovCisJZm9yIChpID0gMDsgaSA8IFRHM19SWF9SSU5HX1NJWkU7IGkrKykgeworCQlzdHJ1Y3QgdGczX3J4X2J1ZmZlcl9kZXNjICpyeGQ7CisKKwkJcnhkID0gJnRwLT5yeF9zdGRbaV07CisJCXJ4ZC0+aWR4X2xlbiA9IChSWF9QS1RfQlVGX1NaIC0gMiAtIDY0KQk8PCBSWERfTEVOX1NISUZUOworCQlyeGQtPnR5cGVfZmxhZ3MgPSAoUlhEX0ZMQUdfRU5EIDw8IFJYRF9GTEFHU19TSElGVCk7CisJCXJ4ZC0+b3BhcXVlID0gKFJYRF9PUEFRVUVfUklOR19TVEQgfCAoaSA8PCBSWERfT1BBUVVFX0lOREVYX1NISUZUKSk7CisKKwkJLyogTm90ZSB3aGVyZSB0aGUgcmVjZWl2ZSBidWZmZXIgZm9yIHRoZSByaW5nIGlzIHBsYWNlZCAqLworCQlyeGQtPmFkZHJfaGkgPSAwOworCQlyeGQtPmFkZHJfbG8gPSB2aXJ0X3RvX2J1cygKKwkJCSZ0ZzNfYnNzLnJ4X2J1ZnNbaSVURzNfREVGX1JYX1JJTkdfUEVORElOR11bMl0pOworCX0KK30KKworI2RlZmluZSBURzNfV1JJVEVfU0VUVElOR1MoVEFCTEUpIFwKK2RvIHsgXAorCWNvbnN0IHVpbnQzMl90ICpfdGFibGUsICpfZW5kOyBcCisJX3RhYmxlID0gVEFCTEU7IFwKKwlfZW5kID0gX3RhYmxlICsgc2l6ZW9mKFRBQkxFKS9zaXplb2YoVEFCTEVbMF0pOyAgXAorCWZvcig7IF90YWJsZSA8IF9lbmQ7IF90YWJsZSArPSAyKSB7IFwKKwkJdHczMihfdGFibGVbMF0sIF90YWJsZVsxXSk7IFwKKwl9IFwKK30gd2hpbGUoMCkKKworCisvKiBpbml0aWFsaXplL3Jlc2V0IHRoZSB0ZzMgKi8KK3N0YXRpYyBpbnQgdGczX3NldHVwX2h3KHN0cnVjdCB0ZzMgKnRwKQoreworCXVpbnQzMl90IHZhbCwgcmRtYWNfbW9kZTsKKwlpbnQgaSwgZXJyLCBsaW1pdDsKKworCS8qIFNpbXBseSBkb24ndCBzdXBwb3J0IHNldHVwcyB3aXRoIGV4dHJlbWx5IGJ1Z2d5IGZpcm13YXJlIGluIGV0aGVyYm9vdCAqLworCWlmICh0cC0+cGNpX2NoaXBfcmV2X2lkID09IENISVBSRVZfSURfNTcwMV9BMCkgeworCQlwcmludGYoIkVycm9yIDU3MDFfQTAgZmlybXdhcmUgYnVnIGRldGVjdGVkXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJdGczX2Rpc2FibGVfaW50cyh0cCk7CisKKwkvKiBPcmlnaW5hbGx5IHRoaXMgd2FzIGFsbCBpbiB0ZzNfaW5pdF9odyAqLworCisJLyogRm9yY2UgdGhlIGNoaXAgaW50byBEMC4gKi8KKwl0ZzNfc2V0X3Bvd2VyX3N0YXRlXzAodHApOworCisJdGczX3N3aXRjaF9jbG9ja3ModHApOworCisJdHczMihURzNQQ0lfTUVNX1dJTl9CQVNFX0FERFIsIDApOworCisKKwkvKiBPcmlnaW5hbGx5IHRoaXMgd2FzIGFsbCBpbiB0ZzNfcmVzZXRfaHcgKi8KKworCXRnM19zdG9wX2Z3KHRwKTsKKworCS8qIE5vIG5lZWQgdG8gY2FsbCB0ZzNfYWJvcnRfaHcgaGVyZSwgaXQgaXMgY2FsbGVkIGJlZm9yZSB0ZzNfc2V0dXBfaHcuICovCisKKwl0ZzNfY2hpcF9yZXNldCh0cCk7CisKKwl0dzMyKEdSQ19NT0RFLCB0cC0+Z3JjX21vZGUpOyAgLyogUmVkdW5kYW50PyAqLworCisJZXJyID0gdGczX3Jlc3RhcnRfZncodHAsIERSVl9TVEFURV9TVEFSVCk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCWlmICh0cC0+cGh5X2lkID09IFBIWV9JRF9TRVJERVMpIHsKKwkJdHAtPm1hY19tb2RlID0gTUFDX01PREVfUE9SVF9NT0RFX1RCSTsKKwl9CisJdHczMl9jYXJlZnVsbHkoTUFDX01PREUsIHRwLT5tYWNfbW9kZSk7CisKKworCS8qIFRoaXMgd29ya3MgYXJvdW5kIGFuIGlzc3VlIHdpdGggQXRobG9uIGNoaXBzZXRzIG9uCisJICogQjMgdGlnb24zIHNpbGljb24uICBUaGlzIGJpdCBoYXMgbm8gZWZmZWN0IG9uIGFueQorCSAqIG90aGVyIHJldmlzaW9uLgorCSAqLworCXRwLT5wY2lfY2xvY2tfY3RybCB8PSBDTE9DS19DVFJMX0RFTEFZX1BDSV9HUkFOVDsKKwl0dzMyX2NhcmVmdWxseShURzNQQ0lfQ0xPQ0tfQ1RSTCwgdHAtPnBjaV9jbG9ja19jdHJsKTsKKworCWlmICh0cC0+cGNpX2NoaXBfcmV2X2lkID09IENISVBSRVZfSURfNTcwNF9BMCAmJgorCSAgICAodHAtPnRnM19mbGFncyAmIFRHM19GTEFHX1BDSVhfTU9ERSkpIHsKKwkJdmFsID0gdHIzMihURzNQQ0lfUENJU1RBVEUpOworCQl2YWwgfD0gUENJU1RBVEVfUkVUUllfU0FNRV9ETUE7CisJCXR3MzIoVEczUENJX1BDSVNUQVRFLCB2YWwpOworCX0KKworCS8qIERlc2NyaXB0b3IgcmluZyBpbml0IG1heSBtYWtlIGFjY2Vzc2VzIHRvIHRoZQorCSAqIE5JQyBTUkFNIGFyZWEgdG8gc2V0dXAgdGhlIFRYIGRlc2NyaXB0b3JzLCBzbyB3ZQorCSAqIGNhbiBvbmx5IGRvIHRoaXMgYWZ0ZXIgdGhlIGhhcmR3YXJlIGhhcyBiZWVuCisJICogc3VjY2Vzc2Z1bGx5IHJlc2V0LgorCSAqLworCXRnM19pbml0X3JpbmdzKHRwKTsKKworCS8qIENsZWFyIHN0YXRpc3RpY3Mvc3RhdHVzIGJsb2NrIGluIGNoaXAgKi8KKwlpZiAoR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpICE9IEFTSUNfUkVWXzU3MDUpIHsKKwkJZm9yIChpID0gTklDX1NSQU1fU1RBVFNfQkxLOworCQkgICAgIGkgPCBOSUNfU1JBTV9TVEFUVVNfQkxLICsgVEczX0hXX1NUQVRVU19TSVpFOworCQkgICAgIGkgKz0gc2l6ZW9mKHVpbnQzMl90KSkgeworCQkJdGczX3dyaXRlX21lbShpLCAwKTsKKwkJCXVkZWxheSg0MCk7CisJCX0KKwl9CisKKwkvKiBUaGlzIHZhbHVlIGlzIGRldGVybWluZWQgZHVyaW5nIHRoZSBwcm9iZSB0aW1lIERNQQorCSAqIGVuZ2luZSB0ZXN0LCB0ZzNfc2V0dXBfZG1hLgorCSAqLworCXR3MzIoVEczUENJX0RNQV9SV19DVFJMLCB0cC0+ZG1hX3J3Y3RybCk7CisKKwl0cC0+Z3JjX21vZGUgJj0gfihHUkNfTU9ERV9IT1NUX1NFTkRCRFMgfAorCQkJICBHUkNfTU9ERV80WF9OSUNfU0VORF9SSU5HUyB8CisJCQkgIEdSQ19NT0RFX05PX1RYX1BIRFJfQ1NVTSB8CisJCQkgIEdSQ19NT0RFX05PX1JYX1BIRFJfQ1NVTSk7CisJdHAtPmdyY19tb2RlIHw9IEdSQ19NT0RFX0hPU1RfU0VOREJEUzsKKwl0cC0+Z3JjX21vZGUgfD0gR1JDX01PREVfTk9fVFhfUEhEUl9DU1VNOworCXRwLT5ncmNfbW9kZSB8PSBHUkNfTU9ERV9OT19SWF9QSERSX0NTVU07CisKKwl0dzMyKEdSQ19NT0RFLAorCQl0cC0+Z3JjX21vZGUgfCAKKwkJKEdSQ19NT0RFX0lSUV9PTl9NQUNfQVRUTiB8IEdSQ19NT0RFX0hPU1RfU1RBQ0tVUCkpOworCisJLyogU2V0dXAgdGhlIHRpbWVyIHByZXNjYWxhciByZWdpc3Rlci4gIENsb2NrIGlzIGFsd2F5cyA2Nk1oei4gKi8KKwl0dzMyKEdSQ19NSVNDX0NGRywKKwkgICAgICg2NSA8PCBHUkNfTUlTQ19DRkdfUFJFU0NBTEFSX1NISUZUKSk7CisKKwkvKiBJbml0aWFsaXplIE1CVUYvREVTQyBwb29sLiAqLworCWlmIChHRVRfQVNJQ19SRVYodHAtPnBjaV9jaGlwX3Jldl9pZCkgIT0gQVNJQ19SRVZfNTcwNSkgeworCQl0dzMyKEJVRk1HUl9NQl9QT09MX0FERFIsIE5JQ19TUkFNX01CVUZfUE9PTF9CQVNFKTsKKwkJaWYgKEdFVF9BU0lDX1JFVih0cC0+cGNpX2NoaXBfcmV2X2lkKSA9PSBBU0lDX1JFVl81NzA0KQorCQkJdHczMihCVUZNR1JfTUJfUE9PTF9TSVpFLCBOSUNfU1JBTV9NQlVGX1BPT0xfU0laRTY0KTsKKwkJZWxzZQorCQkJdHczMihCVUZNR1JfTUJfUE9PTF9TSVpFLCBOSUNfU1JBTV9NQlVGX1BPT0xfU0laRTk2KTsKKwkJdHczMihCVUZNR1JfRE1BX0RFU0NfUE9PTF9BRERSLCBOSUNfU1JBTV9ETUFfREVTQ19QT09MX0JBU0UpOworCQl0dzMyKEJVRk1HUl9ETUFfREVTQ19QT09MX1NJWkUsIE5JQ19TUkFNX0RNQV9ERVNDX1BPT0xfU0laRSk7CisJfQorCWlmICghKHRwLT50ZzNfZmxhZ3MgJiBURzNfRkxBR19KVU1CT19FTkFCTEUpKSB7CisJCXR3MzIoQlVGTUdSX01CX1JETUFfTE9XX1dBVEVSLAorCQkgICAgIHRwLT5idWZtZ3JfY29uZmlnLm1idWZfcmVhZF9kbWFfbG93X3dhdGVyKTsKKwkJdHczMihCVUZNR1JfTUJfTUFDUlhfTE9XX1dBVEVSLAorCQkgICAgIHRwLT5idWZtZ3JfY29uZmlnLm1idWZfbWFjX3J4X2xvd193YXRlcik7CisJCXR3MzIoQlVGTUdSX01CX0hJR0hfV0FURVIsCisJCSAgICAgdHAtPmJ1Zm1ncl9jb25maWcubWJ1Zl9oaWdoX3dhdGVyKTsKKwl9IGVsc2UgeworCQl0dzMyKEJVRk1HUl9NQl9SRE1BX0xPV19XQVRFUiwKKwkJICAgICB0cC0+YnVmbWdyX2NvbmZpZy5tYnVmX3JlYWRfZG1hX2xvd193YXRlcl9qdW1ibyk7CisJCXR3MzIoQlVGTUdSX01CX01BQ1JYX0xPV19XQVRFUiwKKwkJICAgICB0cC0+YnVmbWdyX2NvbmZpZy5tYnVmX21hY19yeF9sb3dfd2F0ZXJfanVtYm8pOworCQl0dzMyKEJVRk1HUl9NQl9ISUdIX1dBVEVSLAorCQkgICAgIHRwLT5idWZtZ3JfY29uZmlnLm1idWZfaGlnaF93YXRlcl9qdW1ibyk7CisJfQorCXR3MzIoQlVGTUdSX0RNQV9MT1dfV0FURVIsCisJICAgICB0cC0+YnVmbWdyX2NvbmZpZy5kbWFfbG93X3dhdGVyKTsKKwl0dzMyKEJVRk1HUl9ETUFfSElHSF9XQVRFUiwKKwkgICAgIHRwLT5idWZtZ3JfY29uZmlnLmRtYV9oaWdoX3dhdGVyKTsKKworCXR3MzIoQlVGTUdSX01PREUsIEJVRk1HUl9NT0RFX0VOQUJMRSB8IEJVRk1HUl9NT0RFX0FUVE5fRU5BQkxFKTsKKwlmb3IgKGkgPSAwOyBpIDwgMjAwMDsgaSsrKSB7CisJCWlmICh0cjMyKEJVRk1HUl9NT0RFKSAmIEJVRk1HUl9NT0RFX0VOQUJMRSkKKwkJCWJyZWFrOworCQl1ZGVsYXkoMTApOworCX0KKwlpZiAoaSA+PSAyMDAwKSB7CisJCXByaW50ZigidGczX3NldHVwX2h3IGNhbm5vdCBlbmFibGUgQlVGTUdSXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJdHczMihGVFFfUkVTRVQsIDB4ZmZmZmZmZmYpOworCXR3MzIoRlRRX1JFU0VULCAweDAwMDAwMDAwKTsKKwlmb3IgKGkgPSAwOyBpIDwgMjAwMDsgaSsrKSB7CisJCWlmICh0cjMyKEZUUV9SRVNFVCkgPT0gMHgwMDAwMDAwMCkKKwkJCWJyZWFrOworCQl1ZGVsYXkoMTApOworCX0KKwlpZiAoaSA+PSAyMDAwKSB7CisJCXByaW50ZigidGczX3NldHVwX2h3IGNhbm5vdCByZXNldCBGVFFcbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwkvKiBJbml0aWFsaXplIFRHM19CRElORk8ncyBhdDoKKwkgKiAgUkNWREJESV9TVERfQkQ6CXN0YW5kYXJkIGV0aCBzaXplIHJ4IHJpbmcKKwkgKiAgUkNWREJESV9KVU1CT19CRDoJanVtYm8gZnJhbWUgcnggcmluZworCSAqICBSQ1ZEQkRJX01JTklfQkQ6CXNtYWxsIGZyYW1lIHJ4IHJpbmcgKD8/PyBkb2VzIG5vdCB3b3JrKQorCSAqCisJICogbGlrZSBzbzoKKwkgKiAgVEczX0JESU5GT19IT1NUX0FERFI6CWhpZ2gvbG93IHBhcnRzIG9mIERNQSBhZGRyZXNzIG9mIHJpbmcKKwkgKiAgVEczX0JESU5GT19NQVhMRU5fRkxBR1M6CShyeCBtYXggYnVmZmVyIHNpemUgPDwgMTYpIHwKKwkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJpbmcgYXR0cmlidXRlIGZsYWdzCisJICogIFRHM19CRElORk9fTklDX0FERFI6CWxvY2F0aW9uIG9mIGRlc2NyaXB0b3JzIGluIG5pYyBTUkFNCisJICoKKwkgKiBTdGFuZGFyZCByZWNlaXZlIHJpbmcgQCBOSUNfU1JBTV9SWF9CVUZGRVJfREVTQywgNTEyIGVudHJpZXMuCisJICogSnVtYm8gcmVjZWl2ZSByaW5nIEAgTklDX1NSQU1fUlhfSlVNQk9fQlVGRkVSX0RFU0MsIDI1NiBlbnRyaWVzLgorCSAqCisJICogPz8/IE5vIHNwYWNlIGFsbG9jYXRlZCBmb3IgbWluaSByZWNlaXZlIHJpbmc/IDooCisJICoKKwkgKiBUaGUgc2l6ZSBvZiBlYWNoIHJpbmcgaXMgZml4ZWQgaW4gdGhlIGZpcm13YXJlLCBidXQgdGhlIGxvY2F0aW9uIGlzCisJICogY29uZmlndXJhYmxlLgorCSAqLworCXsKKwkJc3RhdGljIGNvbnN0IHVpbnQzMl90IHRhYmxlX2FsbFtdID0geworCQkJLyogU2V0dXAgcmVwbGVuaXNoIHRocmVzaG9sZHMuICovCisJCQlSQ1ZCRElfU1REX1RIUkVTSCwgVEczX0RFRl9SWF9SSU5HX1BFTkRJTkcgLyA4LAorCisJCQkvKiBFdGhlcmJvb3QgbGl2ZXMgYmVsb3cgNEdCICovCisJCQlSQ1ZEQkRJX1NURF9CRCArIFRHM19CRElORk9fSE9TVF9BRERSICsgVEczXzY0QklUX1JFR19ISUdILCAwLAorCQkJUkNWREJESV9TVERfQkQgKyBURzNfQkRJTkZPX05JQ19BRERSLCBOSUNfU1JBTV9SWF9CVUZGRVJfREVTQywKKwkJfTsKKwkJc3RhdGljIGNvbnN0IHVpbnQzMl90IHRhYmxlX25vdF81NzA1W10gPSB7CisJCQkvKiBCdWZmZXIgbWF4aW11bSBsZW5ndGggKi8KKwkJCVJDVkRCRElfU1REX0JEICsgVEczX0JESU5GT19NQVhMRU5fRkxBR1MsIFJYX1NURF9NQVhfU0laRSA8PCBCRElORk9fRkxBR1NfTUFYTEVOX1NISUZULAorCQkJCisJCQkvKiBEaXNhYmxlIHRoZSBtaW5pIGZyYW1lIHJ4IHJpbmcgKi8KKwkJCVJDVkRCRElfTUlOSV9CRCArIFRHM19CRElORk9fTUFYTEVOX0ZMQUdTLAlCRElORk9fRkxBR1NfRElTQUJMRUQsCisJCQkKKwkJCS8qIERpc2FibGUgdGhlIGp1bWJvIGZyYW1lIHJ4IHJpbmcgKi8KKwkJCVJDVkJESV9KVU1CT19USFJFU0gsIDAsCisJCQlSQ1ZEQkRJX0pVTUJPX0JEICsgVEczX0JESU5GT19NQVhMRU5fRkxBR1MsIEJESU5GT19GTEFHU19ESVNBQkxFRCwKKwkJCQorCQkJCisJCX07CisJCVRHM19XUklURV9TRVRUSU5HUyh0YWJsZV9hbGwpOworCQl0dzMyKFJDVkRCRElfU1REX0JEICsgVEczX0JESU5GT19IT1NUX0FERFIgKyBURzNfNjRCSVRfUkVHX0xPVywgCisJCQl2aXJ0X3RvX2J1cyh0cC0+cnhfc3RkKSk7CisJCWlmIChHRVRfQVNJQ19SRVYodHAtPnBjaV9jaGlwX3Jldl9pZCkgPT0gQVNJQ19SRVZfNTcwNSkgeworCQkJdHczMihSQ1ZEQkRJX1NURF9CRCArIFRHM19CRElORk9fTUFYTEVOX0ZMQUdTLAorCQkJCVJYX1NURF9NQVhfU0laRV81NzA1IDw8IEJESU5GT19GTEFHU19NQVhMRU5fU0hJRlQpOworCQl9IGVsc2UgeworCQkJVEczX1dSSVRFX1NFVFRJTkdTKHRhYmxlX25vdF81NzA1KTsKKwkJfQorCX0KKworCQorCS8qIFRoZXJlIGlzIG9ubHkgb25lIHNlbmQgcmluZyBvbiA1NzA1LCBubyBuZWVkIHRvIGV4cGxpY2l0bHkKKwkgKiBkaXNhYmxlIHRoZSBvdGhlcnMuCisJICovCisJaWYgKEdFVF9BU0lDX1JFVih0cC0+cGNpX2NoaXBfcmV2X2lkKSAhPSBBU0lDX1JFVl81NzA1KSB7CisJCS8qIENsZWFyIG91dCBzZW5kIFJDQiByaW5nIGluIFNSQU0uICovCisJCWZvciAoaSA9IE5JQ19TUkFNX1NFTkRfUkNCOyBpIDwgTklDX1NSQU1fUkNWX1JFVF9SQ0I7IGkgKz0gVEczX0JESU5GT19TSVpFKQorCQkJdGczX3dyaXRlX21lbShpICsgVEczX0JESU5GT19NQVhMRU5fRkxBR1MsIEJESU5GT19GTEFHU19ESVNBQkxFRCk7CisJfQorCisJdHAtPnR4X3Byb2QgPSAwOworCXR3MzJfbWFpbGJveChNQUlMQk9YX1NOREhPU1RfUFJPRF9JRFhfMCArIFRHM182NEJJVF9SRUdfTE9XLCAwKTsKKwl0dzMyX21haWxib3gyKE1BSUxCT1hfU05ETklDX1BST0RfSURYXzAgKyBURzNfNjRCSVRfUkVHX0xPVywgMCk7CisKKwl0ZzNfc2V0X2JkaW5mbyh0cCwKKwkJTklDX1NSQU1fU0VORF9SQ0IsCisJCXZpcnRfdG9fYnVzKHRwLT50eF9yaW5nKSwKKwkJKFRHM19UWF9SSU5HX1NJWkUgPDwgQkRJTkZPX0ZMQUdTX01BWExFTl9TSElGVCksCisJCU5JQ19TUkFNX1RYX0JVRkZFUl9ERVNDKTsKKworCS8qIFRoZXJlIGlzIG9ubHkgb25lIHJlY2VpdmUgcmV0dXJuIHJpbmcgb24gNTcwNSwgbm8gbmVlZCB0byBleHBsaWNpdGx5CisJICogZGlzYWJsZSB0aGUgb3RoZXJzLgorCSAqLworCWlmIChHRVRfQVNJQ19SRVYodHAtPnBjaV9jaGlwX3Jldl9pZCkgIT0gQVNJQ19SRVZfNTcwNSkgeworCQlmb3IgKGkgPSBOSUNfU1JBTV9SQ1ZfUkVUX1JDQjsgaSA8IE5JQ19TUkFNX1NUQVRTX0JMSzsgaSArPSBURzNfQkRJTkZPX1NJWkUpIHsKKwkJCXRnM193cml0ZV9tZW0oaSArIFRHM19CRElORk9fTUFYTEVOX0ZMQUdTLAorCQkJCUJESU5GT19GTEFHU19ESVNBQkxFRCk7CisJCX0KKwl9CisKKwl0cC0+cnhfcmNiX3B0ciA9IDA7CisJdHczMl9tYWlsYm94MihNQUlMQk9YX1JDVlJFVF9DT05fSURYXzAgKyBURzNfNjRCSVRfUkVHX0xPVywgMCk7CisKKwl0ZzNfc2V0X2JkaW5mbyh0cCwKKwkJTklDX1NSQU1fUkNWX1JFVF9SQ0IsCisJCXZpcnRfdG9fYnVzKHRwLT5yeF9yY2IpLAorCQkoVEczX1JYX1JDQl9SSU5HX1NJWkUgPDwgQkRJTkZPX0ZMQUdTX01BWExFTl9TSElGVCksCisJCTApOworCisJdHAtPnJ4X3N0ZF9wdHIgPSBURzNfREVGX1JYX1JJTkdfUEVORElORzsKKwl0dzMyX21haWxib3gyKE1BSUxCT1hfUkNWX1NURF9QUk9EX0lEWCArIFRHM182NEJJVF9SRUdfTE9XLAorCQkgICAgIHRwLT5yeF9zdGRfcHRyKTsKKworCXR3MzJfbWFpbGJveDIoTUFJTEJPWF9SQ1ZfSlVNQk9fUFJPRF9JRFggKyBURzNfNjRCSVRfUkVHX0xPVywgMCk7CisKKwkvKiBJbml0aWFsaXplIE1BQyBhZGRyZXNzIGFuZCBiYWNrb2ZmIHNlZWQuICovCisJX190ZzNfc2V0X21hY19hZGRyKHRwKTsKKworCS8qIENhbGN1bGF0ZSBSRE1BQ19NT0RFIHNldHRpbmcgZWFybHksIHdlIG5lZWQgaXQgdG8gZGV0ZXJtaW5lCisJICogdGhlIFJDVkxQQ19TVEFURV9FTkFCTEUgbWFzay4KKwkgKi8KKwlyZG1hY19tb2RlID0gKFJETUFDX01PREVfRU5BQkxFIHwgUkRNQUNfTU9ERV9UR1RBQk9SVF9FTkFCIHwKKwkJUkRNQUNfTU9ERV9NU1RBQk9SVF9FTkFCIHwgUkRNQUNfTU9ERV9QQVJJVFlFUlJfRU5BQiB8CisJCVJETUFDX01PREVfQUREUk9GTE9XX0VOQUIgfCBSRE1BQ19NT0RFX0ZJRk9PRkxPV19FTkFCIHwKKwkJUkRNQUNfTU9ERV9GSUZPVVJVTl9FTkFCIHwgUkRNQUNfTU9ERV9GSUZPT1JFQURfRU5BQiB8CisJCVJETUFDX01PREVfTE5HUkVBRF9FTkFCKTsKKwlpZiAodHAtPnRnM19mbGFncyAmIFRHM19GTEFHX1NQTElUX01PREUpCisJCXJkbWFjX21vZGUgfD0gUkRNQUNfTU9ERV9TUExJVF9FTkFCTEU7CisJaWYgKEdFVF9BU0lDX1JFVih0cC0+cGNpX2NoaXBfcmV2X2lkKSA9PSBBU0lDX1JFVl81NzA1KSB7CisJCWlmICh0cC0+cGNpX2NoaXBfcmV2X2lkICE9IENISVBSRVZfSURfNTcwNV9BMCkgeworCQkJaWYgKCEodHIzMihURzNQQ0lfUENJU1RBVEUpICYgUENJU1RBVEVfQlVTX1NQRUVEX0hJR0gpICYmCisJCQkJISh0cC0+dGczX2ZsYWdzMiAmIFRHM19GTEcyX0lTXzU3ODgpKSB7CisJCQkJcmRtYWNfbW9kZSB8PSBSRE1BQ19NT0RFX0ZJRk9fTE9OR19CVVJTVDsKKwkJCX0KKwkJfQorCX0KKworCS8qIFNldHVwIGhvc3QgY29hbGVzY2luZyBlbmdpbmUuICovCisJdHczMihIT1NUQ0NfTU9ERSwgMCk7CisJZm9yIChpID0gMDsgaSA8IDIwMDA7IGkrKykgeworCQlpZiAoISh0cjMyKEhPU1RDQ19NT0RFKSAmIEhPU1RDQ19NT0RFX0VOQUJMRSkpCisJCQlicmVhazsKKwkJdWRlbGF5KDEwKTsKKwl9CisKKwl0cC0+bWFjX21vZGUgPSBNQUNfTU9ERV9UWFNUQVRfRU5BQkxFIHwgTUFDX01PREVfUlhTVEFUX0VOQUJMRSB8CisJCU1BQ19NT0RFX1RERV9FTkFCTEUgfCBNQUNfTU9ERV9SREVfRU5BQkxFIHwgTUFDX01PREVfRkhERV9FTkFCTEU7CisJdHczMl9jYXJlZnVsbHkoTUFDX01PREUsIHRwLT5tYWNfbW9kZSB8IE1BQ19NT0RFX1JYU1RBVF9DTEVBUiB8IE1BQ19NT0RFX1RYU1RBVF9DTEVBUik7CisKKwl0cC0+Z3JjX2xvY2FsX2N0cmwgPSBHUkNfTENMQ1RSTF9JTlRfT05fQVRUTiB8IEdSQ19MQ0xDVFJMX0FVVE9fU0VFUFJPTTsKKwlpZiAoR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpID09IEFTSUNfUkVWXzU3MDApCisJCXRwLT5ncmNfbG9jYWxfY3RybCB8PSAoR1JDX0xDTENUUkxfR1BJT19PRTEgfAorCQkJCSAgICAgICBHUkNfTENMQ1RSTF9HUElPX09VVFBVVDEpOworCXR3MzJfY2FyZWZ1bGx5KEdSQ19MT0NBTF9DVFJMLCB0cC0+Z3JjX2xvY2FsX2N0cmwpOworCisJdHczMl9tYWlsYm94KE1BSUxCT1hfSU5URVJSVVBUXzAgKyBURzNfNjRCSVRfUkVHX0xPVywgMCk7CisJdHIzMihNQUlMQk9YX0lOVEVSUlVQVF8wKTsKKworCWlmIChHRVRfQVNJQ19SRVYodHAtPnBjaV9jaGlwX3Jldl9pZCkgIT0gQVNJQ19SRVZfNTcwNSkgeworCQl0dzMyX2NhcmVmdWxseShETUFDX01PREUsIERNQUNfTU9ERV9FTkFCTEUpOworCX0KKworCXZhbCA9ICgJV0RNQUNfTU9ERV9FTkFCTEUgfCBXRE1BQ19NT0RFX1RHVEFCT1JUX0VOQUIgfAorCQlXRE1BQ19NT0RFX01TVEFCT1JUX0VOQUIgfCBXRE1BQ19NT0RFX1BBUklUWUVSUl9FTkFCIHwKKwkJV0RNQUNfTU9ERV9BRERST0ZMT1dfRU5BQiB8IFdETUFDX01PREVfRklGT09GTE9XX0VOQUIgfAorCQlXRE1BQ19NT0RFX0ZJRk9VUlVOX0VOQUIgfCBXRE1BQ19NT0RFX0ZJRk9PUkVBRF9FTkFCIHwKKwkJV0RNQUNfTU9ERV9MTkdSRUFEX0VOQUIpOworCWlmICgoR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpICE9IEFTSUNfUkVWXzU3MDUpICYmCisJCSgodHIzMihURzNQQ0lfUENJU1RBVEUpICYgUENJU1RBVEVfQlVTX1NQRUVEX0hJR0gpICE9IDApICYmCisJCSEodHAtPnRnM19mbGFnczIgJiBURzNfRkxHMl9JU181Nzg4KSkgeworCQl2YWwgfD0gV0RNQUNfTU9ERV9SWF9BQ0NFTDsKKwl9CisJdHczMl9jYXJlZnVsbHkoV0RNQUNfTU9ERSwgdmFsKTsKKworCWlmICgodHAtPnRnM19mbGFncyAmIFRHM19GTEFHX1BDSVhfTU9ERSkgIT0gMCkgeworCQl2YWwgPSB0cjMyKFRHM1BDSV9YX0NBUFMpOworCQlpZiAoR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpID09IEFTSUNfUkVWXzU3MDMpIHsKKwkJCXZhbCAmPSBQQ0lYX0NBUFNfQlVSU1RfTUFTSzsKKwkJCXZhbCB8PSAoUENJWF9DQVBTX01BWF9CVVJTVF9DUElPQiA8PCBQQ0lYX0NBUFNfQlVSU1RfU0hJRlQpOworCQl9IGVsc2UgaWYgKEdFVF9BU0lDX1JFVih0cC0+cGNpX2NoaXBfcmV2X2lkKSA9PSBBU0lDX1JFVl81NzA0KSB7CisJCQl2YWwgJj0gfihQQ0lYX0NBUFNfU1BMSVRfTUFTSyB8IFBDSVhfQ0FQU19CVVJTVF9NQVNLKTsKKwkJCXZhbCB8PSAoUENJWF9DQVBTX01BWF9CVVJTVF9DUElPQiA8PCBQQ0lYX0NBUFNfQlVSU1RfU0hJRlQpOworCQkJaWYgKHRwLT50ZzNfZmxhZ3MgJiBURzNfRkxBR19TUExJVF9NT0RFKQorCQkJCXZhbCB8PSAodHAtPnNwbGl0X21vZGVfbWF4X3JlcXMgPDwKKwkJCQkJUENJWF9DQVBTX1NQTElUX1NISUZUKTsKKwkJfQorCQl0dzMyKFRHM1BDSV9YX0NBUFMsIHZhbCk7CisJfQorCisJdHczMl9jYXJlZnVsbHkoUkRNQUNfTU9ERSwgcmRtYWNfbW9kZSk7CisJeworCQlzdGF0aWMgY29uc3QgdWludDMyX3QgdGFibGVfYWxsW10gPSB7CisJCQkvKiBNVFUgKyBldGhlcm5ldCBoZWFkZXIgKyBGQ1MgKyBvcHRpb25hbCBWTEFOIHRhZyAqLworCQkJTUFDX1JYX01UVV9TSVpFLCBFVEhfTUFYX01UVSArIEVUSF9ITEVOICsgOCwKKwkJCQorCQkJLyogVGhlIHNsb3QgdGltZSBpcyBjaGFuZ2VkIGJ5IHRnM19zZXR1cF9waHkgaWYgd2UKKwkJCSAqIHJ1biBhdCBnaWdhYml0IHdpdGggaGFsZiBkdXBsZXguCisJCQkgKi8KKwkJCU1BQ19UWF9MRU5HVEhTLAkKKwkJCSgyIDw8IFRYX0xFTkdUSFNfSVBHX0NSU19TSElGVCkgfAorCQkJKDYgPDwgVFhfTEVOR1RIU19JUEdfU0hJRlQpIHwKKwkJCSgzMiA8PCBUWF9MRU5HVEhTX1NMT1RfVElNRV9TSElGVCksCisJCQkKKwkJCS8qIFJlY2VpdmUgcnVsZXMuICovCisJCQlNQUNfUkNWX1JVTEVfQ0ZHLCBSQ1ZfUlVMRV9DRkdfREVGQVVMVF9DTEFTUywKKwkJCVJDVkxQQ19DT05GSUcsIDB4MDE4MSwKKwkJCQorCQkJLyogUmVjZWl2ZS9zZW5kIHN0YXRpc3RpY3MuICovCisJCQlSQ1ZMUENfU1RBVFNfRU5BQkxFLCAweGZmZmZmZiwKKwkJCVJDVkxQQ19TVEFUU0NUUkwsIFJDVkxQQ19TVEFUU0NUUkxfRU5BQkxFLAorCQkJU05EREFUQUlfU1RBVFNFTkFCLCAweGZmZmZmZiwKKwkJCVNORERBVEFJX1NUQVRTQ1RSTCwgKFNORERBVEFJX1NDVFJMX0VOQUJMRSB8U05EREFUQUlfU0NUUkxfRkFTVFVQRCksCisJCQkKKwkJCS8qIEhvc3QgY29hbGVzY2luZyBlbmdpbmUgKi8KKwkJCUhPU1RDQ19SWENPTF9USUNLUywgMCwKKwkJCUhPU1RDQ19UWENPTF9USUNLUywgTE9XX1RYQ09MX1RJQ0tTLAorCQkJSE9TVENDX1JYTUFYX0ZSQU1FUywgMSwKKwkJCUhPU1RDQ19UWE1BWF9GUkFNRVMsIExPV19SWE1BWF9GUkFNRVMsCisJCQlIT1NUQ0NfUlhDT0FMX01BWEZfSU5ULCAxLAorCQkJSE9TVENDX1RYQ09BTF9NQVhGX0lOVCwgMCwKKwkJCQorCQkJLyogU3RhdHVzL3N0YXRpc3RpY3MgYmxvY2sgYWRkcmVzcy4gKi8KKwkJCS8qIEV0aGVyYm9vdCBsaXZlcyBiZWxvdyA0R0IsIHNvIEhJR0ggPT0gMCAqLworCQkJSE9TVENDX1NUQVRVU19CTEtfSE9TVF9BRERSICsgVEczXzY0QklUX1JFR19ISUdILCAwLAorCisJCQkvKiBObyBuZWVkIHRvIGVuYWJsZSAzMmJ5dGUgY29hbGVzY2UgbW9kZS4gKi8KKwkJCUhPU1RDQ19NT0RFLCBIT1NUQ0NfTU9ERV9FTkFCTEUgfCAwLAorCQkJCisJCQlSQ1ZDQ19NT0RFLCBSQ1ZDQ19NT0RFX0VOQUJMRSB8IFJDVkNDX01PREVfQVRUTl9FTkFCTEUsCisJCQlSQ1ZMUENfTU9ERSwgUkNWTFBDX01PREVfRU5BQkxFLAorCQkJCisJCQlSQ1ZEQ0NfTU9ERSwgUkNWRENDX01PREVfRU5BQkxFIHwgUkNWRENDX01PREVfQVRUTl9FTkFCTEUsCisKKwkJCVNORERBVEFDX01PREUsIFNORERBVEFDX01PREVfRU5BQkxFLAorCQkJU05EQkRDX01PREUsIFNOREJEQ19NT0RFX0VOQUJMRSB8IFNOREJEQ19NT0RFX0FUVE5fRU5BQkxFLAorCQkJUkNWQkRJX01PREUsIFJDVkJESV9NT0RFX0VOQUJMRSB8IFJDVkJESV9NT0RFX1JDQl9BVFROX0VOQUIsCisJCQlSQ1ZEQkRJX01PREUsIFJDVkRCRElfTU9ERV9FTkFCTEUgfCBSQ1ZEQkRJX01PREVfSU5WX1JJTkdfU1osCisJCQlTTkREQVRBSV9NT0RFLCBTTkREQVRBSV9NT0RFX0VOQUJMRSwKKwkJCVNOREJESV9NT0RFLCBTTkRCRElfTU9ERV9FTkFCTEUgfCBTTkRCRElfTU9ERV9BVFROX0VOQUJMRSwKKwkJCVNOREJEU19NT0RFLCBTTkRCRFNfTU9ERV9FTkFCTEUgfCBTTkRCRFNfTU9ERV9BVFROX0VOQUJMRSwKKwkJCQorCQkJLyogQWNjZXB0IGFsbCBtdWx0aWNhc3QgZnJhbWVzLiAqLworCQkJTUFDX0hBU0hfUkVHXzAsIDB4ZmZmZmZmZmYsCisJCQlNQUNfSEFTSF9SRUdfMSwgMHhmZmZmZmZmZiwKKwkJCU1BQ19IQVNIX1JFR18yLCAweGZmZmZmZmZmLAorCQkJTUFDX0hBU0hfUkVHXzMsIDB4ZmZmZmZmZmYsCisJCX07CisJCXN0YXRpYyBjb25zdCB1aW50MzJfdCB0YWJsZV9ub3RfNTcwNVtdID0geworCQkJLyogSG9zdCBjb2FsZXNjaW5nIGVuZ2luZSAqLworCQkJSE9TVENDX1JYQ09BTF9USUNLX0lOVCwgMCwKKwkJCUhPU1RDQ19UWENPQUxfVElDS19JTlQsIDAsCisKKwkJCS8qIFN0YXR1cy9zdGF0aXN0aWNzIGJsb2NrIGFkZHJlc3MuICovCisJCQkvKiBFdGhlcmJvb3QgbGl2ZXMgYmVsb3cgNEdCLCBzbyBISUdIID09IDAgKi8KKwkJCUhPU1RDQ19TVEFUX0NPQUxfVElDS1MsIERFRkFVTFRfU1RBVF9DT0FMX1RJQ0tTLAorCQkJSE9TVENDX1NUQVRTX0JMS19IT1NUX0FERFIgKyBURzNfNjRCSVRfUkVHX0hJR0gsIDAsCisJCQlIT1NUQ0NfU1RBVFNfQkxLX05JQ19BRERSLCBOSUNfU1JBTV9TVEFUU19CTEssCisJCQlIT1NUQ0NfU1RBVFVTX0JMS19OSUNfQUREUiwgTklDX1NSQU1fU1RBVFVTX0JMSywKKworCQkJUkNWTFNDX01PREUsIFJDVkxTQ19NT0RFX0VOQUJMRSB8IFJDVkxTQ19NT0RFX0FUVE5fRU5BQkxFLAorCisJCQlNQkZSRUVfTU9ERSwgTUJGUkVFX01PREVfRU5BQkxFLAorCQl9OworCQlURzNfV1JJVEVfU0VUVElOR1ModGFibGVfYWxsKTsKKwkJdHczMihIT1NUQ0NfU1RBVFNfQkxLX0hPU1RfQUREUiArIFRHM182NEJJVF9SRUdfTE9XLAorCQkJdmlydF90b19idXModHAtPmh3X3N0YXRzKSk7CisJCXR3MzIoSE9TVENDX1NUQVRVU19CTEtfSE9TVF9BRERSICsgVEczXzY0QklUX1JFR19MT1csCisJCQl2aXJ0X3RvX2J1cyh0cC0+aHdfc3RhdHVzKSk7CisJCWlmIChHRVRfQVNJQ19SRVYodHAtPnBjaV9jaGlwX3Jldl9pZCkgIT0gQVNJQ19SRVZfNTcwNSkgeworCQkJVEczX1dSSVRFX1NFVFRJTkdTKHRhYmxlX25vdF81NzA1KTsKKwkJfQorCX0KKworCXRwLT50eF9tb2RlID0gVFhfTU9ERV9FTkFCTEU7CisJdHczMl9jYXJlZnVsbHkoTUFDX1RYX01PREUsIHRwLT50eF9tb2RlKTsKKworCXRwLT5yeF9tb2RlID0gUlhfTU9ERV9FTkFCTEU7CisJdHczMl9jYXJlZnVsbHkoTUFDX1JYX01PREUsIHRwLT5yeF9tb2RlKTsKKworCXRwLT5taV9tb2RlID0gTUFDX01JX01PREVfQkFTRTsKKwl0dzMyX2NhcmVmdWxseShNQUNfTUlfTU9ERSwgdHAtPm1pX21vZGUpOworCisJdHczMihNQUNfTEVEX0NUUkwsIDApOworCXR3MzIoTUFDX01JX1NUQVQsIE1BQ19NSV9TVEFUX0xOS1NUQVRfQVRUTl9FTkFCKTsKKwlpZiAodHAtPnBoeV9pZCA9PSBQSFlfSURfU0VSREVTKSB7CisJCXR3MzJfY2FyZWZ1bGx5KE1BQ19SWF9NT0RFLCBSWF9NT0RFX1JFU0VUKTsKKwl9CisJdHAtPnJ4X21vZGUgfD0gUlhfTU9ERV9LRUVQX1ZMQU5fVEFHOyAvKiBkcm9wIHRhZ2dlZCB2bGFuIHBhY2tldHMgKi8KKwl0dzMyX2NhcmVmdWxseShNQUNfUlhfTU9ERSwgdHAtPnJ4X21vZGUpOworCisJaWYgKHRwLT5wY2lfY2hpcF9yZXZfaWQgPT0gQ0hJUFJFVl9JRF81NzAzX0ExKQorCQl0dzMyKE1BQ19TRVJERVNfQ0ZHLCAweDYxNjAwMCk7CisKKwkvKiBQcmV2ZW50IGNoaXAgZnJvbSBkcm9wcGluZyBmcmFtZXMgd2hlbiBmbG93IGNvbnRyb2wKKwkgKiBpcyBlbmFibGVkLgorCSAqLworCXR3MzIoTUFDX0xPV19XTUFSS19NQVhfUlhfRlJBTUUsIDIpOworCXRyMzIoTUFDX0xPV19XTUFSS19NQVhfUlhfRlJBTUUpOworCisJZXJyID0gdGczX3NldHVwX3BoeSh0cCk7CisKKwkvKiBJZ25vcmUgQ1JDIHN0YXRzICovCisKKwkvKiBJbml0aWFsaXplIHJlY2VpdmUgcnVsZXMuICovCisJdHczMihNQUNfUkNWX1JVTEVfMCwgIDB4YzIwMDAwMDAgJiBSQ1ZfUlVMRV9ESVNBQkxFX01BU0spOworCXR3MzIoTUFDX1JDVl9WQUxVRV8wLCAweGZmZmZmZmZmICYgUkNWX1JVTEVfRElTQUJMRV9NQVNLKTsKKwl0dzMyKE1BQ19SQ1ZfUlVMRV8xLCAgMHg4NjAwMDAwNCAmIFJDVl9SVUxFX0RJU0FCTEVfTUFTSyk7CisJdHczMihNQUNfUkNWX1ZBTFVFXzEsIDB4ZmZmZmZmZmYgJiBSQ1ZfUlVMRV9ESVNBQkxFX01BU0spOworCisJaWYgKEdFVF9BU0lDX1JFVih0cC0+cGNpX2NoaXBfcmV2X2lkKSA9PSBBU0lDX1JFVl81NzA1KQorCQlsaW1pdCA9IDg7CisJZWxzZQorCQlsaW1pdCA9IDE2OworCWlmICh0cC0+dGczX2ZsYWdzICYgVEczX0ZMQUdfRU5BQkxFX0FTRikKKwkJbGltaXQgLT0gNDsKKwlzd2l0Y2ggKGxpbWl0KSB7CisJY2FzZSAxNjoJdHczMihNQUNfUkNWX1JVTEVfMTUsICAwKTsgdHczMihNQUNfUkNWX1ZBTFVFXzE1LCAgMCk7CisJY2FzZSAxNToJdHczMihNQUNfUkNWX1JVTEVfMTQsICAwKTsgdHczMihNQUNfUkNWX1ZBTFVFXzE0LCAgMCk7CisJY2FzZSAxNDoJdHczMihNQUNfUkNWX1JVTEVfMTMsICAwKTsgdHczMihNQUNfUkNWX1ZBTFVFXzEzLCAgMCk7CisJY2FzZSAxMzoJdHczMihNQUNfUkNWX1JVTEVfMTIsICAwKTsgdHczMihNQUNfUkNWX1ZBTFVFXzEyLCAgMCk7CisJY2FzZSAxMjoJdHczMihNQUNfUkNWX1JVTEVfMTEsICAwKTsgdHczMihNQUNfUkNWX1ZBTFVFXzExLCAgMCk7CisJY2FzZSAxMToJdHczMihNQUNfUkNWX1JVTEVfMTAsICAwKTsgdHczMihNQUNfUkNWX1ZBTFVFXzEwLCAgMCk7CisJY2FzZSAxMDoJdHczMihNQUNfUkNWX1JVTEVfOSwgIDApOyAgdHczMihNQUNfUkNWX1ZBTFVFXzksICAwKTsKKwljYXNlIDk6CQl0dzMyKE1BQ19SQ1ZfUlVMRV84LCAgMCk7ICB0dzMyKE1BQ19SQ1ZfVkFMVUVfOCwgIDApOworCWNhc2UgODoJCXR3MzIoTUFDX1JDVl9SVUxFXzcsICAwKTsgIHR3MzIoTUFDX1JDVl9WQUxVRV83LCAgMCk7CisJY2FzZSA3OgkJdHczMihNQUNfUkNWX1JVTEVfNiwgIDApOyAgdHczMihNQUNfUkNWX1ZBTFVFXzYsICAwKTsKKwljYXNlIDY6CQl0dzMyKE1BQ19SQ1ZfUlVMRV81LCAgMCk7ICB0dzMyKE1BQ19SQ1ZfVkFMVUVfNSwgIDApOworCWNhc2UgNToJCXR3MzIoTUFDX1JDVl9SVUxFXzQsICAwKTsgIHR3MzIoTUFDX1JDVl9WQUxVRV80LCAgMCk7CisJY2FzZSA0OgkJLyogdHczMihNQUNfUkNWX1JVTEVfMywgIDApOyB0dzMyKE1BQ19SQ1ZfVkFMVUVfMywgIDApOyAqLworCWNhc2UgMzoJCS8qIHR3MzIoTUFDX1JDVl9SVUxFXzIsICAwKTsgdHczMihNQUNfUkNWX1ZBTFVFXzIsICAwKTsgKi8KKwljYXNlIDI6CisJY2FzZSAxOgorCWRlZmF1bHQ6CisJCWJyZWFrOworCX07CisKKwlyZXR1cm4gZXJyOworfQorCisKKworLyogQ2hpcHMgb3RoZXIgdGhhbiA1NzAwLzU3MDEgdXNlIHRoZSBOVlJBTSBmb3IgZmV0Y2hpbmcgaW5mby4gKi8KK3N0YXRpYyB2b2lkIHRnM19udnJhbV9pbml0KHN0cnVjdCB0ZzMgKnRwKQoreworCXR3MzIoR1JDX0VFUFJPTV9BRERSLAorCSAgICAgKEVFUFJPTV9BRERSX0ZTTV9SRVNFVCB8CisJICAgICAgKEVFUFJPTV9ERUZBVUxUX0NMT0NLX1BFUklPRCA8PAorCSAgICAgICBFRVBST01fQUREUl9DTEtQRVJEX1NISUZUKSkpOworCisJbWRlbGF5KDEpOworCisJLyogRW5hYmxlIHNlZXByb20gYWNjZXNzZXMuICovCisJdHczMl9jYXJlZnVsbHkoR1JDX0xPQ0FMX0NUUkwsCisJCXRyMzIoR1JDX0xPQ0FMX0NUUkwpIHwgR1JDX0xDTENUUkxfQVVUT19TRUVQUk9NKTsKKworCWlmIChHRVRfQVNJQ19SRVYodHAtPnBjaV9jaGlwX3Jldl9pZCkgIT0gQVNJQ19SRVZfNTcwMCAmJgorCSAgICBHRVRfQVNJQ19SRVYodHAtPnBjaV9jaGlwX3Jldl9pZCkgIT0gQVNJQ19SRVZfNTcwMSkgeworCQl1aW50MzJfdCBudmNmZzEgPSB0cjMyKE5WUkFNX0NGRzEpOworCisJCXRwLT50ZzNfZmxhZ3MgfD0gVEczX0ZMQUdfTlZSQU07CisJCWlmIChudmNmZzEgJiBOVlJBTV9DRkcxX0ZMQVNISUZfRU5BQikgeworCQkJaWYgKG52Y2ZnMSAmIE5WUkFNX0NGRzFfQlVGRkVSRURfTU9ERSkKKwkJCQl0cC0+dGczX2ZsYWdzIHw9IFRHM19GTEFHX05WUkFNX0JVRkZFUkVEOworCQl9IGVsc2UgeworCQkJbnZjZmcxICY9IH5OVlJBTV9DRkcxX0NPTVBBVF9CWVBBU1M7CisJCQl0dzMyKE5WUkFNX0NGRzEsIG52Y2ZnMSk7CisJCX0KKworCX0gZWxzZSB7CisJCXRwLT50ZzNfZmxhZ3MgJj0gfihURzNfRkxBR19OVlJBTSB8IFRHM19GTEFHX05WUkFNX0JVRkZFUkVEKTsKKwl9Cit9CisKKworc3RhdGljIGludCB0ZzNfbnZyYW1fcmVhZF91c2luZ19lZXByb20oCisJc3RydWN0IHRnMyAqdHAgX191bnVzZWQsIHVpbnQzMl90IG9mZnNldCwgdWludDMyX3QgKnZhbCkKK3sKKwl1aW50MzJfdCB0bXA7CisJaW50IGk7CisKKwlpZiAob2Zmc2V0ID4gRUVQUk9NX0FERFJfQUREUl9NQVNLIHx8CisJCShvZmZzZXQgJSA0KSAhPSAwKSB7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXRtcCA9IHRyMzIoR1JDX0VFUFJPTV9BRERSKSAmIH4oRUVQUk9NX0FERFJfQUREUl9NQVNLIHwKKwkJCQkJRUVQUk9NX0FERFJfREVWSURfTUFTSyB8CisJCQkJCUVFUFJPTV9BRERSX1JFQUQpOworCXR3MzIoR1JDX0VFUFJPTV9BRERSLAorCSAgICAgdG1wIHwKKwkgICAgICgwIDw8IEVFUFJPTV9BRERSX0RFVklEX1NISUZUKSB8CisJICAgICAoKG9mZnNldCA8PCBFRVBST01fQUREUl9BRERSX1NISUZUKSAmCisJICAgICAgRUVQUk9NX0FERFJfQUREUl9NQVNLKSB8CisJICAgICBFRVBST01fQUREUl9SRUFEIHwgRUVQUk9NX0FERFJfU1RBUlQpOworCisJZm9yIChpID0gMDsgaSA8IDEwMDAwOyBpKyspIHsKKwkJdG1wID0gdHIzMihHUkNfRUVQUk9NX0FERFIpOworCisJCWlmICh0bXAgJiBFRVBST01fQUREUl9DT01QTEVURSkKKwkJCWJyZWFrOworCQl1ZGVsYXkoMTAwKTsKKwl9CisJaWYgKCEodG1wICYgRUVQUk9NX0FERFJfQ09NUExFVEUpKSB7CisJCXJldHVybiAtRUJVU1k7CisJfQorCisJKnZhbCA9IHRyMzIoR1JDX0VFUFJPTV9EQVRBKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB0ZzNfbnZyYW1fcmVhZChzdHJ1Y3QgdGczICp0cCwgdWludDMyX3Qgb2Zmc2V0LCB1aW50MzJfdCAqdmFsKQoreworCWludCBpLCBzYXdfZG9uZV9jbGVhcjsKKworCWlmICghKHRwLT50ZzNfZmxhZ3MgJiBURzNfRkxBR19OVlJBTSkpCisJCXJldHVybiB0ZzNfbnZyYW1fcmVhZF91c2luZ19lZXByb20odHAsIG9mZnNldCwgdmFsKTsKKworCWlmICh0cC0+dGczX2ZsYWdzICYgVEczX0ZMQUdfTlZSQU1fQlVGRkVSRUQpCisJCW9mZnNldCA9ICgob2Zmc2V0IC8gTlZSQU1fQlVGRkVSRURfUEFHRV9TSVpFKSA8PAorCQkJICBOVlJBTV9CVUZGRVJFRF9QQUdFX1BPUykgKworCQkJKG9mZnNldCAlIE5WUkFNX0JVRkZFUkVEX1BBR0VfU0laRSk7CisKKwlpZiAob2Zmc2V0ID4gTlZSQU1fQUREUl9NU0spCisJCXJldHVybiAtRUlOVkFMOworCisJdHczMihOVlJBTV9TV0FSQiwgU1dBUkJfUkVRX1NFVDEpOworCWZvciAoaSA9IDA7IGkgPCAxMDAwOyBpKyspIHsKKwkJaWYgKHRyMzIoTlZSQU1fU1dBUkIpICYgU1dBUkJfR05UMSkKKwkJCWJyZWFrOworCQl1ZGVsYXkoMjApOworCX0KKworCXR3MzIoTlZSQU1fQUREUiwgb2Zmc2V0KTsKKwl0dzMyKE5WUkFNX0NNRCwKKwkgICAgIE5WUkFNX0NNRF9SRCB8IE5WUkFNX0NNRF9HTyB8CisJICAgICBOVlJBTV9DTURfRklSU1QgfCBOVlJBTV9DTURfTEFTVCB8IE5WUkFNX0NNRF9ET05FKTsKKworCS8qIFdhaXQgZm9yIGRvbmUgYml0IHRvIGNsZWFyIHRoZW4gc2V0IGFnYWluLiAqLworCXNhd19kb25lX2NsZWFyID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgMTAwMDsgaSsrKSB7CisJCXVkZWxheSgxMCk7CisJCWlmICghc2F3X2RvbmVfY2xlYXIgJiYKKwkJICAgICEodHIzMihOVlJBTV9DTUQpICYgTlZSQU1fQ01EX0RPTkUpKQorCQkJc2F3X2RvbmVfY2xlYXIgPSAxOworCQllbHNlIGlmIChzYXdfZG9uZV9jbGVhciAmJgorCQkJICh0cjMyKE5WUkFNX0NNRCkgJiBOVlJBTV9DTURfRE9ORSkpCisJCQlicmVhazsKKwl9CisJaWYgKGkgPj0gMTAwMCkgeworCQl0dzMyKE5WUkFNX1NXQVJCLCBTV0FSQl9SRVFfQ0xSMSk7CisJCXJldHVybiAtRUJVU1k7CisJfQorCisJKnZhbCA9IGJzd2FwXzMyKHRyMzIoTlZSQU1fUkREQVRBKSk7CisJdHczMihOVlJBTV9TV0FSQiwgMHgyMCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RydWN0IHN1YnN5c190YmxfZW50IHsKKwl1aW50MTZfdCBzdWJzeXNfdmVuZG9yLCBzdWJzeXNfZGV2aWQ7CisJdWludDMyX3QgcGh5X2lkOworfTsKKworc3RhdGljIHN0cnVjdCBzdWJzeXNfdGJsX2VudCBzdWJzeXNfaWRfdG9fcGh5X2lkW10gPSB7CisJLyogQnJvYWRjb20gYm9hcmRzLiAqLworCXsgMHgxNGU0LCAweDE2NDQsIFBIWV9JRF9CQ001NDAxIH0sIC8qIEJDTTk1NzAwQTYgKi8KKwl7IDB4MTRlNCwgMHgwMDAxLCBQSFlfSURfQkNNNTcwMSB9LCAvKiBCQ005NTcwMUE1ICovCisJeyAweDE0ZTQsIDB4MDAwMiwgUEhZX0lEX0JDTTgwMDIgfSwgLyogQkNNOTU3MDBUNiAqLworCXsgMHgxNGU0LCAweDAwMDMsIFBIWV9JRF9TRVJERVMgIH0sIC8qIEJDTTk1NzAwQTkgKi8KKwl7IDB4MTRlNCwgMHgwMDA1LCBQSFlfSURfQkNNNTcwMSB9LCAvKiBCQ005NTcwMVQxICovCisJeyAweDE0ZTQsIDB4MDAwNiwgUEhZX0lEX0JDTTU3MDEgfSwgLyogQkNNOTU3MDFUOCAqLworCXsgMHgxNGU0LCAweDAwMDcsIFBIWV9JRF9TRVJERVMgIH0sIC8qIEJDTTk1NzAxQTcgKi8KKwl7IDB4MTRlNCwgMHgwMDA4LCBQSFlfSURfQkNNNTcwMSB9LCAvKiBCQ005NTcwMUExMCAqLworCXsgMHgxNGU0LCAweDgwMDgsIFBIWV9JRF9CQ001NzAxIH0sIC8qIEJDTTk1NzAxQTEyICovCisJeyAweDE0ZTQsIDB4MDAwOSwgUEhZX0lEX0JDTTU3MDEgfSwgLyogQkNNOTU3MDNBeDEgKi8KKwl7IDB4MTRlNCwgMHg4MDA5LCBQSFlfSURfQkNNNTcwMSB9LCAvKiBCQ005NTcwM0F4MiAqLworCisJLyogM2NvbSBib2FyZHMuICovCisJeyBQQ0lfVkVORE9SX0lEXzNDT00sIDB4MTAwMCwgUEhZX0lEX0JDTTU0MDEgfSwgLyogM0M5OTZUICovCisJeyBQQ0lfVkVORE9SX0lEXzNDT00sIDB4MTAwNiwgUEhZX0lEX0JDTTU3MDEgfSwgLyogM0M5OTZCVCAqLworCS8qIHsgUENJX1ZFTkRPUl9JRF8zQ09NLCAweDEwMDIsIFBIWV9JRF9YWFggfSwgICAgIDNDOTk2Q1QgKi8KKwkvKiB7IFBDSV9WRU5ET1JfSURfM0NPTSwgMHgxMDAzLCBQSFlfSURfWFhYIH0sICAgICAzQzk5N1QgKi8KKwl7IFBDSV9WRU5ET1JfSURfM0NPTSwgMHgxMDA0LCBQSFlfSURfU0VSREVTICB9LCAvKiAzQzk5NlNYICovCisJLyogeyBQQ0lfVkVORE9SX0lEXzNDT00sIDB4MTAwNSwgUEhZX0lEX1hYWCB9LCAgICAgM0M5OTdTWiAqLworCXsgUENJX1ZFTkRPUl9JRF8zQ09NLCAweDEwMDcsIFBIWV9JRF9CQ001NzAxIH0sIC8qIDNDMTAwMFQgKi8KKwl7IFBDSV9WRU5ET1JfSURfM0NPTSwgMHgxMDA4LCBQSFlfSURfQkNNNTcwMSB9LCAvKiAzQzk0MEJSMDEgKi8KKworCS8qIERFTEwgYm9hcmRzLiAqLworCXsgUENJX1ZFTkRPUl9JRF9ERUxMLCAweDAwZDEsIFBIWV9JRF9CQ001NDAxIH0sIC8qIFZJUEVSICovCisJeyBQQ0lfVkVORE9SX0lEX0RFTEwsIDB4MDEwNiwgUEhZX0lEX0JDTTU0MDEgfSwgLyogSkFHVUFSICovCisJeyBQQ0lfVkVORE9SX0lEX0RFTEwsIDB4MDEwOSwgUEhZX0lEX0JDTTU0MTEgfSwgLyogTUVSTE9UICovCisJeyBQQ0lfVkVORE9SX0lEX0RFTEwsIDB4MDEwYSwgUEhZX0lEX0JDTTU0MTEgfSwgLyogU0xJTV9NRVJMT1QgKi8KKworCS8qIENvbXBhcSBib2FyZHMuICovCisJeyBQQ0lfVkVORE9SX0lEX0NPTVBBUSwgMHgwMDdjLCBQSFlfSURfQkNNNTcwMSB9LCAvKiBCQU5TSEVFICovCisJeyBQQ0lfVkVORE9SX0lEX0NPTVBBUSwgMHgwMDlhLCBQSFlfSURfQkNNNTcwMSB9LCAvKiBCQU5TSEVFXzIgKi8KKwl7IFBDSV9WRU5ET1JfSURfQ09NUEFRLCAweDAwN2QsIFBIWV9JRF9TRVJERVMgIH0sIC8qIENIQU5HRUxJTkcgKi8KKwl7IFBDSV9WRU5ET1JfSURfQ09NUEFRLCAweDAwODUsIFBIWV9JRF9CQ001NzAxIH0sIC8qIE5DNzc4MCAqLworCXsgUENJX1ZFTkRPUl9JRF9DT01QQVEsIDB4MDA5OSwgUEhZX0lEX0JDTTU3MDEgfSAgLyogTkM3NzgwXzIgKi8KK307CisKK3N0YXRpYyBpbnQgdGczX3BoeV9wcm9iZShzdHJ1Y3QgdGczICp0cCkKK3sKKwl1aW50MzJfdCBlZXByb21fcGh5X2lkLCBod19waHlfaWRfMSwgaHdfcGh5X2lkXzI7CisJdWludDMyX3QgaHdfcGh5X2lkLCBod19waHlfaWRfbWFza2VkOworCWVudW0gcGh5X2xlZF9tb2RlIGVlcHJvbV9sZWRfbW9kZTsKKwl1aW50MzJfdCB2YWw7CisJdW5zaWduZWQgaTsKKwlpbnQgZWVwcm9tX3NpZ25hdHVyZV9mb3VuZCwgZXJyOworCisJdHAtPnBoeV9pZCA9IFBIWV9JRF9JTlZBTElEOworCisJZm9yIChpID0gMDsgaSA8IHNpemVvZihzdWJzeXNfaWRfdG9fcGh5X2lkKS9zaXplb2Yoc3Vic3lzX2lkX3RvX3BoeV9pZFswXSk7IGkrKykgeworCQlpZiAoKHN1YnN5c19pZF90b19waHlfaWRbaV0uc3Vic3lzX3ZlbmRvciA9PSB0cC0+c3Vic3lzdGVtX3ZlbmRvcikgJiYKKwkJCShzdWJzeXNfaWRfdG9fcGh5X2lkW2ldLnN1YnN5c19kZXZpZCA9PSB0cC0+c3Vic3lzdGVtX2RldmljZSkpIHsKKwkJCXRwLT5waHlfaWQgPSBzdWJzeXNfaWRfdG9fcGh5X2lkW2ldLnBoeV9pZDsKKwkJCWJyZWFrOworCQl9CisJfQorCisJZWVwcm9tX3BoeV9pZCA9IFBIWV9JRF9JTlZBTElEOworCWVlcHJvbV9sZWRfbW9kZSA9IGxlZF9tb2RlX2F1dG87CisJZWVwcm9tX3NpZ25hdHVyZV9mb3VuZCA9IDA7CisJdGczX3JlYWRfbWVtKE5JQ19TUkFNX0RBVEFfU0lHLCAmdmFsKTsKKwlpZiAodmFsID09IE5JQ19TUkFNX0RBVEFfU0lHX01BR0lDKSB7CisJCXVpbnQzMl90IG5pY19jZmc7CisKKwkJdGczX3JlYWRfbWVtKE5JQ19TUkFNX0RBVEFfQ0ZHLCAmbmljX2NmZyk7CisJCXRwLT5uaWNfc3JhbV9kYXRhX2NmZyA9IG5pY19jZmc7CisKKwkJZWVwcm9tX3NpZ25hdHVyZV9mb3VuZCA9IDE7CisKKwkJaWYgKChuaWNfY2ZnICYgTklDX1NSQU1fREFUQV9DRkdfUEhZX1RZUEVfTUFTSykgPT0KKwkJICAgIE5JQ19TUkFNX0RBVEFfQ0ZHX1BIWV9UWVBFX0ZJQkVSKSB7CisJCQllZXByb21fcGh5X2lkID0gUEhZX0lEX1NFUkRFUzsKKwkJfSBlbHNlIHsKKwkJCXVpbnQzMl90IG5pY19waHlfaWQ7CisKKwkJCXRnM19yZWFkX21lbShOSUNfU1JBTV9EQVRBX1BIWV9JRCwgJm5pY19waHlfaWQpOworCQkJaWYgKG5pY19waHlfaWQgIT0gMCkgeworCQkJCXVpbnQzMl90IGlkMSA9IG5pY19waHlfaWQgJiBOSUNfU1JBTV9EQVRBX1BIWV9JRDFfTUFTSzsKKwkJCQl1aW50MzJfdCBpZDIgPSBuaWNfcGh5X2lkICYgTklDX1NSQU1fREFUQV9QSFlfSUQyX01BU0s7CisKKwkJCQllZXByb21fcGh5X2lkICA9IChpZDEgPj4gMTYpIDw8IDEwOworCQkJCWVlcHJvbV9waHlfaWQgfD0gKGlkMiAmIDB4ZmMwMCkgPDwgMTY7CisJCQkJZWVwcm9tX3BoeV9pZCB8PSAoaWQyICYgMHgwM2ZmKSA8PCAgMDsKKwkJCX0KKwkJfQorCisJCXN3aXRjaCAobmljX2NmZyAmIE5JQ19TUkFNX0RBVEFfQ0ZHX0xFRF9NT0RFX01BU0spIHsKKwkJY2FzZSBOSUNfU1JBTV9EQVRBX0NGR19MRURfVFJJUExFX1NQRDoKKwkJCWVlcHJvbV9sZWRfbW9kZSA9IGxlZF9tb2RlX3RocmVlX2xpbms7CisJCQlicmVhazsKKworCQljYXNlIE5JQ19TUkFNX0RBVEFfQ0ZHX0xFRF9MSU5LX1NQRDoKKwkJCWVlcHJvbV9sZWRfbW9kZSA9IGxlZF9tb2RlX2xpbmsxMDsKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQllZXByb21fbGVkX21vZGUgPSBsZWRfbW9kZV9hdXRvOworCQkJYnJlYWs7CisJCX07CisJCWlmICgoKEdFVF9BU0lDX1JFVih0cC0+cGNpX2NoaXBfcmV2X2lkKSA9PSBBU0lDX1JFVl81NzAzKSB8fAorCQkJKEdFVF9BU0lDX1JFVih0cC0+cGNpX2NoaXBfcmV2X2lkKSA9PSBBU0lDX1JFVl81NzA0KSB8fAorCQkJKEdFVF9BU0lDX1JFVih0cC0+cGNpX2NoaXBfcmV2X2lkKSA9PSBBU0lDX1JFVl81NzA1KSkgJiYKKwkJCShuaWNfY2ZnICYgTklDX1NSQU1fREFUQV9DRkdfRUVQUk9NX1dQKSkgeworCQkJdHAtPnRnM19mbGFncyB8PSBURzNfRkxBR19FRVBST01fV1JJVEVfUFJPVDsKKwkJfQorCisJCWlmIChuaWNfY2ZnICYgTklDX1NSQU1fREFUQV9DRkdfQVNGX0VOQUJMRSkKKwkJCXRwLT50ZzNfZmxhZ3MgfD0gVEczX0ZMQUdfRU5BQkxFX0FTRjsKKwkJaWYgKG5pY19jZmcgJiBOSUNfU1JBTV9EQVRBX0NGR19GSUJFUl9XT0wpCisJCQl0cC0+dGczX2ZsYWdzIHw9IFRHM19GTEFHX1NFUkRFU19XT0xfQ0FQOworCX0KKworCS8qIE5vdyByZWFkIHRoZSBwaHlzaWNhbCBQSFlfSUQgZnJvbSB0aGUgY2hpcCBhbmQgdmVyaWZ5CisJICogdGhhdCBpdCBpcyBzYW5lLiAgSWYgaXQgZG9lc24ndCBsb29rIGdvb2QsIHdlIGZhbGwgYmFjaworCSAqIHRvIGVpdGhlciB0aGUgaGFyZC1jb2RlZCB0YWJsZSBiYXNlZCBQSFlfSUQgYW5kIGZhaWxpbmcKKwkgKiB0aGF0IHRoZSB2YWx1ZSBmb3VuZCBpbiB0aGUgZWVwcm9tIGFyZWEuCisJICovCisJZXJyICA9IHRnM19yZWFkcGh5KHRwLCBNSUlfUEhZU0lEMSwgJmh3X3BoeV9pZF8xKTsKKwllcnIgfD0gdGczX3JlYWRwaHkodHAsIE1JSV9QSFlTSUQyLCAmaHdfcGh5X2lkXzIpOworCisJaHdfcGh5X2lkICA9IChod19waHlfaWRfMSAmIDB4ZmZmZikgPDwgMTA7CisJaHdfcGh5X2lkIHw9IChod19waHlfaWRfMiAmIDB4ZmMwMCkgPDwgMTY7CisJaHdfcGh5X2lkIHw9IChod19waHlfaWRfMiAmIDB4MDNmZikgPDwgIDA7CisKKwlod19waHlfaWRfbWFza2VkID0gaHdfcGh5X2lkICYgUEhZX0lEX01BU0s7CisKKwlpZiAoIWVyciAmJiBLTk9XTl9QSFlfSUQoaHdfcGh5X2lkX21hc2tlZCkpIHsKKwkJdHAtPnBoeV9pZCA9IGh3X3BoeV9pZDsKKwl9IGVsc2UgeworCQkvKiBwaHlfaWQgY3VycmVudGx5IGhvbGRzIHRoZSB2YWx1ZSBmb3VuZCBpbiB0aGUKKwkJICogc3Vic3lzX2lkX3RvX3BoeV9pZFtdIHRhYmxlIG9yIFBIWV9JRF9JTlZBTElECisJCSAqIGlmIGEgbWF0Y2ggd2FzIG5vdCBmb3VuZCB0aGVyZS4KKwkJICovCisJCWlmICh0cC0+cGh5X2lkID09IFBIWV9JRF9JTlZBTElEKSB7CisJCQlpZiAoIWVlcHJvbV9zaWduYXR1cmVfZm91bmQgfHwKKwkJCSAgICAhS05PV05fUEhZX0lEKGVlcHJvbV9waHlfaWQgJiBQSFlfSURfTUFTSykpCisJCQkJcmV0dXJuIC1FTk9ERVY7CisJCQl0cC0+cGh5X2lkID0gZWVwcm9tX3BoeV9pZDsKKwkJfQorCX0KKworCWVyciA9IHRnM19waHlfcmVzZXQodHApOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwlpZiAodHAtPnBjaV9jaGlwX3Jldl9pZCA9PSBDSElQUkVWX0lEXzU3MDFfQTAgfHwKKwkgICAgdHAtPnBjaV9jaGlwX3Jldl9pZCA9PSBDSElQUkVWX0lEXzU3MDFfQjApIHsKKwkJdWludDMyX3QgbWlpX3RnM19jdHJsOworCQkKKwkJLyogVGhlc2UgY2hpcHMsIHdoZW4gcmVzZXQsIG9ubHkgYWR2ZXJ0aXNlIDEwTWIKKwkJICogY2FwYWJpbGl0aWVzLiAgRml4IHRoYXQuCisJCSAqLworCQllcnIgID0gdGczX3dyaXRlcGh5KHRwLCBNSUlfQURWRVJUSVNFLAorCQkJCSAgICAoQURWRVJUSVNFX0NTTUEgfAorCQkJCSAgICAgQURWRVJUSVNFX1BBVVNFX0NBUCB8CisJCQkJICAgICBBRFZFUlRJU0VfMTBIQUxGIHwKKwkJCQkgICAgIEFEVkVSVElTRV8xMEZVTEwgfAorCQkJCSAgICAgQURWRVJUSVNFXzEwMEhBTEYgfAorCQkJCSAgICAgQURWRVJUSVNFXzEwMEZVTEwpKTsKKwkJbWlpX3RnM19jdHJsID0gKE1JSV9URzNfQ1RSTF9BRFZfMTAwMF9IQUxGIHwKKwkJCQlNSUlfVEczX0NUUkxfQURWXzEwMDBfRlVMTCB8CisJCQkJTUlJX1RHM19DVFJMX0FTX01BU1RFUiB8CisJCQkJTUlJX1RHM19DVFJMX0VOQUJMRV9BU19NQVNURVIpOworCQlpZiAodHAtPnRnM19mbGFncyAmIFRHM19GTEFHXzEwXzEwMF9PTkxZKQorCQkJbWlpX3RnM19jdHJsID0gMDsKKworCQllcnIgfD0gdGczX3dyaXRlcGh5KHRwLCBNSUlfVEczX0NUUkwsIG1paV90ZzNfY3RybCk7CisJCWVyciB8PSB0ZzNfd3JpdGVwaHkodHAsIE1JSV9CTUNSLAorCQkJCSAgICAoQk1DUl9BTlJFU1RBUlQgfCBCTUNSX0FORU5BQkxFKSk7CisJfQorCisJaWYgKEdFVF9BU0lDX1JFVih0cC0+cGNpX2NoaXBfcmV2X2lkKSA9PSBBU0lDX1JFVl81NzAzKSB7CisJCXRnM193cml0ZXBoeSh0cCwgTUlJX1RHM19BVVhfQ1RSTCwgMHgwYzAwKTsKKwkJdGczX3dyaXRlcGh5KHRwLCBNSUlfVEczX0RTUF9BRERSRVNTLCAweDIwMWYpOworCQl0ZzNfd3JpdGVkc3AodHAsIE1JSV9URzNfRFNQX1JXX1BPUlQsIDB4MmFhYSk7CisJfQorCisJaWYgKEdFVF9BU0lDX1JFVih0cC0+cGNpX2NoaXBfcmV2X2lkKSA9PSBBU0lDX1JFVl81NzA0KSB7CisJCXRnM193cml0ZXBoeSh0cCwgMHgxYywgMHg4ZDY4KTsKKwkJdGczX3dyaXRlcGh5KHRwLCAweDFjLCAweDhkNjgpOworCX0KKworCS8qIEVuYWJsZSBFdGhlcm5ldEBXaXJlU3BlZWQgKi8KKwl0ZzNfcGh5X3NldF93aXJlc3BlZWQodHApOworCisJaWYgKCFlcnIgJiYgKCh0cC0+cGh5X2lkICYgUEhZX0lEX01BU0spID09IFBIWV9JRF9CQ001NDAxKSkgeworCQllcnIgPSB0ZzNfaW5pdF81NDAxcGh5X2RzcCh0cCk7CisJfQorCisJLyogRGV0ZXJtaW5lIHRoZSBQSFkgbGVkIG1vZGUuIAorCSAqIEJlIGNhcmVmdWwgaWYgdGhpcyBnZXRzIHNldCB3cm9uZyBpdCBjYW4gcmVzdWx0IGluIGFuIGluYWJpbGl0eSB0byAKKwkgKiBlc3RhYmxpc2ggYSBsaW5rLgorCSAqLworCWlmICh0cC0+cGh5X2lkID09IFBIWV9JRF9TRVJERVMpIHsKKwkJdHAtPmxlZF9tb2RlID0gbGVkX21vZGVfdGhyZWVfbGluazsKKwl9CisJZWxzZSBpZiAodHAtPnN1YnN5c3RlbV92ZW5kb3IgPT0gUENJX1ZFTkRPUl9JRF9ERUxMKSB7CisJCXRwLT5sZWRfbW9kZSA9IGxlZF9tb2RlX2xpbmsxMDsKKwl9IGVsc2UgeworCQl0cC0+bGVkX21vZGUgPSBsZWRfbW9kZV90aHJlZV9saW5rOworCQlpZiAoZWVwcm9tX3NpZ25hdHVyZV9mb3VuZCAmJgorCQkgICAgZWVwcm9tX2xlZF9tb2RlICE9IGxlZF9tb2RlX2F1dG8pCisJCQl0cC0+bGVkX21vZGUgPSBlZXByb21fbGVkX21vZGU7CisJfQorCisJaWYgKHRwLT5waHlfaWQgPT0gUEhZX0lEX1NFUkRFUykKKwkJdHAtPmxpbmtfY29uZmlnLmFkdmVydGlzaW5nID0KKwkJCShBRFZFUlRJU0VEXzEwMDBiYXNlVF9IYWxmIHwKKwkJCSBBRFZFUlRJU0VEXzEwMDBiYXNlVF9GdWxsIHwKKwkJCSBBRFZFUlRJU0VEX0F1dG9uZWcgfAorCQkJIEFEVkVSVElTRURfRklCUkUpOworCWlmICh0cC0+dGczX2ZsYWdzICYgVEczX0ZMQUdfMTBfMTAwX09OTFkpCisJCXRwLT5saW5rX2NvbmZpZy5hZHZlcnRpc2luZyAmPQorCQkJfihBRFZFUlRJU0VEXzEwMDBiYXNlVF9IYWxmIHwKKwkJCSAgQURWRVJUSVNFRF8xMDAwYmFzZVRfRnVsbCk7CisKKwlyZXR1cm4gZXJyOworfQorCisjaWYgU1VQUE9SVF9QQVJUTk9fU1RSCitzdGF0aWMgdm9pZCB0ZzNfcmVhZF9wYXJ0bm8oc3RydWN0IHRnMyAqdHApCit7CisJdW5zaWduZWQgY2hhciB2cGRfZGF0YVsyNTZdOworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IDI1NjsgaSArPSA0KSB7CisJCXVpbnQzMl90IHRtcDsKKworCQlpZiAodGczX252cmFtX3JlYWQodHAsIDB4MTAwICsgaSwgJnRtcCkpCisJCQlnb3RvIG91dF9ub3RfZm91bmQ7CisKKwkJdnBkX2RhdGFbaSArIDBdID0gKCh0bXAgPj4gIDApICYgMHhmZik7CisJCXZwZF9kYXRhW2kgKyAxXSA9ICgodG1wID4+ICA4KSAmIDB4ZmYpOworCQl2cGRfZGF0YVtpICsgMl0gPSAoKHRtcCA+PiAxNikgJiAweGZmKTsKKwkJdnBkX2RhdGFbaSArIDNdID0gKCh0bXAgPj4gMjQpICYgMHhmZik7CisJfQorCisJLyogTm93IHBhcnNlIGFuZCBmaW5kIHRoZSBwYXJ0IG51bWJlci4gKi8KKwlmb3IgKGkgPSAwOyBpIDwgMjU2OyApIHsKKwkJdW5zaWduZWQgY2hhciB2YWwgPSB2cGRfZGF0YVtpXTsKKwkJaW50IGJsb2NrX2VuZDsKKworCQlpZiAodmFsID09IDB4ODIgfHwgdmFsID09IDB4OTEpIHsKKwkJCWkgPSAoaSArIDMgKworCQkJICAgICAodnBkX2RhdGFbaSArIDFdICsKKwkJCSAgICAgICh2cGRfZGF0YVtpICsgMl0gPDwgOCkpKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJaWYgKHZhbCAhPSAweDkwKQorCQkJZ290byBvdXRfbm90X2ZvdW5kOworCisJCWJsb2NrX2VuZCA9IChpICsgMyArCisJCQkgICAgICh2cGRfZGF0YVtpICsgMV0gKworCQkJICAgICAgKHZwZF9kYXRhW2kgKyAyXSA8PCA4KSkpOworCQlpICs9IDM7CisJCXdoaWxlIChpIDwgYmxvY2tfZW5kKSB7CisJCQlpZiAodnBkX2RhdGFbaSArIDBdID09ICdQJyAmJgorCQkJICAgIHZwZF9kYXRhW2kgKyAxXSA9PSAnTicpIHsKKwkJCQlpbnQgcGFydG5vX2xlbiA9IHZwZF9kYXRhW2kgKyAyXTsKKworCQkJCWlmIChwYXJ0bm9fbGVuID4gMjQpCisJCQkJCWdvdG8gb3V0X25vdF9mb3VuZDsKKworCQkJCW1lbWNweSh0cC0+Ym9hcmRfcGFydF9udW1iZXIsCisJCQkJICAgICAgICZ2cGRfZGF0YVtpICsgM10sCisJCQkJICAgICAgIHBhcnRub19sZW4pOworCisJCQkJLyogU3VjY2Vzcy4gKi8KKwkJCQlyZXR1cm47CisJCQl9CisJCX0KKworCQkvKiBQYXJ0IG51bWJlciBub3QgZm91bmQuICovCisJCWdvdG8gb3V0X25vdF9mb3VuZDsKKwl9CisKK291dF9ub3RfZm91bmQ6CisJbWVtY3B5KHRwLT5ib2FyZF9wYXJ0X251bWJlciwgIm5vbmUiLCBzaXplb2YoIm5vbmUiKSk7Cit9CisjZWxzZQorI2RlZmluZSB0ZzNfcmVhZF9wYXJ0bm8oVFApICgoVFApLT5ib2FyZF9wYXJ0X251bWJlclswXSA9ICdcMCcpCisjZW5kaWYKKworc3RhdGljIGludCB0ZzNfZ2V0X2ludmFyaWFudHMoc3RydWN0IHRnMyAqdHApCit7CisJdWludDMyX3QgbWlzY19jdHJsX3JlZzsKKwl1aW50MzJfdCBwY2lfc3RhdGVfcmVnLCBncmNfbWlzY19jZmc7CisJdWludDE2X3QgcGNpX2NtZDsKKwl1aW50OF90ICBwY2lfbGF0ZW5jeTsKKwlpbnQgZXJyOworCisJLyogUmVhZCB0aGUgc3Vic3lzdGVtIHZlbmRvciBhbmQgZGV2aWNlIGlkcyAqLworCXBjaV9yZWFkX2NvbmZpZ193b3JkKHRwLT5wZGV2LCBQQ0lfU1VCU1lTVEVNX1ZFTkRPUl9JRCwgJnRwLT5zdWJzeXN0ZW1fdmVuZG9yKTsKKwlwY2lfcmVhZF9jb25maWdfd29yZCh0cC0+cGRldiwgUENJX1NVQlNZU1RFTV9JRCwgJnRwLT5zdWJzeXN0ZW1fZGV2aWNlKTsKKworCS8qIFRoZSBzdW5fNTcwNCBjb2RlIG5lZWRzIGluZnJhc3RydWN0dXJlIGV0aGVyYm9vdCBkb2VzIGhhdmUKKwkgKiBpZ25vcmUgaXQgZm9yIG5vdy4KKwkgKi8KKworCS8qIElmIHdlIGhhdmUgYW4gQU1EIDc2MiBvciBJbnRlbCBJQ0gvSUNIMCBjaGlwc2V0LCB3cml0ZQorCSAqIHJlb3JkZXJpbmcgdG8gdGhlIG1haWxib3ggcmVnaXN0ZXJzIGRvbmUgYnkgdGhlIGhvc3QKKwkgKiBjb250cm9sbGVyIGNhbiBjYXVzZSBtYWpvciB0cm91Ymxlcy4gIFdlIHJlYWQgYmFjayBmcm9tCisJICogZXZlcnkgbWFpbGJveCByZWdpc3RlciB3cml0ZSB0byBmb3JjZSB0aGUgd3JpdGVzIHRvIGJlCisJICogcG9zdGVkIHRvIHRoZSBjaGlwIGluIG9yZGVyLgorCSAqCisJICogVEczX0ZMQUdfTUJPWF9XUklURV9SRU9SREVSIGhhcyBiZWVuIGZvcmNlZCBvbi4KKwkgKi8KKworCS8qIEZvcmNlIG1lbW9yeSB3cml0ZSBpbnZhbGlkYXRlIG9mZi4gIElmIHdlIGxlYXZlIGl0IG9uLAorCSAqIHRoZW4gb24gNTcwMF9CWCBjaGlwcyB3ZSBoYXZlIHRvIGVuYWJsZSBhIHdvcmthcm91bmQuCisJICogVGhlIHdvcmthcm91bmQgaXMgdG8gc2V0IHRoZSBURzNQQ0lfRE1BX1JXX0NUUkwgYm91bmRyeQorCSAqIHRvIG1hdGNoIHRoZSBjYWNoZWxpbmUgc2l6ZS4gIFRoZSBCcm9hZGNvbSBkcml2ZXIgaGF2ZSB0aGlzCisJICogd29ya2Fyb3VuZCBidXQgdHVybnMgTVdJIG9mZiBhbGwgdGhlIHRpbWVzIHNvIG5ldmVyIHVzZXMKKwkgKiBpdC4gIFRoaXMgc2VlbXMgdG8gc3VnZ2VzdCB0aGF0IHRoZSB3b3JrYXJvdW5kIGlzIGluc3VmZmljaWVudC4KKwkgKi8KKwlwY2lfcmVhZF9jb25maWdfd29yZCh0cC0+cGRldiwgUENJX0NPTU1BTkQsICZwY2lfY21kKTsKKwlwY2lfY21kICY9IH5QQ0lfQ09NTUFORF9JTlZBTElEQVRFOworCS8qIEFsc28sIGZvcmNlIFNFUlIjL1BFUlIjIGluIFBDSSBjb21tYW5kLiAqLworCXBjaV9jbWQgfD0gUENJX0NPTU1BTkRfUEFSSVRZIHwgUENJX0NPTU1BTkRfU0VSUjsKKwlwY2lfd3JpdGVfY29uZmlnX3dvcmQodHAtPnBkZXYsIFBDSV9DT01NQU5ELCBwY2lfY21kKTsKKworCS8qIEl0IGlzIGFic29sdXRlbHkgY3JpdGljYWwgdGhhdCBURzNQQ0lfTUlTQ19IT1NUX0NUUkwKKwkgKiBoYXMgdGhlIHJlZ2lzdGVyIGluZGlyZWN0IHdyaXRlIGVuYWJsZSBiaXQgc2V0IGJlZm9yZQorCSAqIHdlIHRyeSB0byBhY2Nlc3MgYW55IG9mIHRoZSBNTUlPIHJlZ2lzdGVycy4gIEl0IGlzIGFsc28KKwkgKiBjcml0aWNhbCB0aGF0IHRoZSBQQ0ktWCBodyB3b3JrYXJvdW5kIHNpdHVhdGlvbiBpcyBkZWNpZGVkCisJICogYmVmb3JlIHRoYXQgYXMgd2VsbC4KKwkgKi8KKwlwY2lfcmVhZF9jb25maWdfZHdvcmQodHAtPnBkZXYsIFRHM1BDSV9NSVNDX0hPU1RfQ1RSTCwgJm1pc2NfY3RybF9yZWcpOworCisJdHAtPnBjaV9jaGlwX3Jldl9pZCA9IChtaXNjX2N0cmxfcmVnID4+IE1JU0NfSE9TVF9DVFJMX0NISVBSRVZfU0hJRlQpOworCisJLyogSW5pdGlhbGl6ZSBtaXNjIGhvc3QgY29udHJvbCBpbiBQQ0kgYmxvY2suICovCisJdHAtPm1pc2NfaG9zdF9jdHJsIHw9IChtaXNjX2N0cmxfcmVnICYKKwkJCSAgICAgICBNSVNDX0hPU1RfQ1RSTF9DSElQUkVWKTsKKwlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKHRwLT5wZGV2LCBURzNQQ0lfTUlTQ19IT1NUX0NUUkwsCisJCQkgICAgICAgdHAtPm1pc2NfaG9zdF9jdHJsKTsKKworCXBjaV9yZWFkX2NvbmZpZ19ieXRlKHRwLT5wZGV2LCBQQ0lfTEFURU5DWV9USU1FUiwgJnBjaV9sYXRlbmN5KTsKKwlpZiAocGNpX2xhdGVuY3kgPCA2NCkgeworCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUodHAtPnBkZXYsIFBDSV9MQVRFTkNZX1RJTUVSLCA2NCk7CisJfQorCisJcGNpX3JlYWRfY29uZmlnX2R3b3JkKHRwLT5wZGV2LCBURzNQQ0lfUENJU1RBVEUsICZwY2lfc3RhdGVfcmVnKTsKKworCS8qIElmIHRoaXMgaXMgYSA1NzAwIEJYIGNoaXBzZXQsIGFuZCB3ZSBhcmUgaW4gUENJLVgKKwkgKiBtb2RlLCBlbmFibGUgcmVnaXN0ZXIgd3JpdGUgd29ya2Fyb3VuZC4KKwkgKgorCSAqIFRoZSB3b3JrYXJvdW5kIGlzIHRvIHVzZSBpbmRpcmVjdCByZWdpc3RlciBhY2Nlc3NlcworCSAqIGZvciBhbGwgY2hpcCB3cml0ZXMgbm90IHRvIG1haWxib3ggcmVnaXN0ZXJzLgorCSAqCisJICogSW4gZXRoZXJib290IHRvIHNpbXBsaWZ5IHRoaW5ncyB3ZSBqdXN0IGFsd2F5cyB1c2UgdGhpcyB3b3JrIGFyb3VuZC4KKwkgKi8KKwlpZiAoKHBjaV9zdGF0ZV9yZWcgJiBQQ0lTVEFURV9DT05WX1BDSV9NT0RFKSA9PSAwKSB7CisJCXRwLT50ZzNfZmxhZ3MgfD0gVEczX0ZMQUdfUENJWF9NT0RFOworCX0KKwkvKiBCYWNrIHRvIGJhY2sgcmVnaXN0ZXIgd3JpdGVzIGNhbiBjYXVzZSBwcm9ibGVtcyBvbiB0aGUgNTcwMSwKKwkgKiB0aGUgd29ya2Fyb3VuZCBpcyB0byByZWFkIGJhY2sgYWxsIHJlZyB3cml0ZXMgZXhjZXB0IHRob3NlIHRvCisJICogbWFpbGJveCByZWdzLgorCSAqIEluIGV0aGVyYm9vdCB3ZSBhbHdheXMgdXNlIGluZGlyZWN0IHJlZ2lzdGVyIGFjY2Vzc2VzIHNvCisJICogd2UgZG9uJ3Qgc2VlIHRoaXMuCisJICovCisKKwlpZiAoKHBjaV9zdGF0ZV9yZWcgJiBQQ0lTVEFURV9CVVNfU1BFRURfSElHSCkgIT0gMCkKKwkJdHAtPnRnM19mbGFncyB8PSBURzNfRkxBR19QQ0lfSElHSF9TUEVFRDsKKwlpZiAoKHBjaV9zdGF0ZV9yZWcgJiBQQ0lTVEFURV9CVVNfMzJCSVQpICE9IDApCisJCXRwLT50ZzNfZmxhZ3MgfD0gVEczX0ZMQUdfUENJXzMyQklUOworCisJLyogQ2hpcC1zcGVjaWZpYyBmaXh1cCBmcm9tIEJyb2FkY29tIGRyaXZlciAqLworCWlmICgodHAtPnBjaV9jaGlwX3Jldl9pZCA9PSBDSElQUkVWX0lEXzU3MDRfQTApICYmCisJICAgICghKHBjaV9zdGF0ZV9yZWcgJiBQQ0lTVEFURV9SRVRSWV9TQU1FX0RNQSkpKSB7CisJCXBjaV9zdGF0ZV9yZWcgfD0gUENJU1RBVEVfUkVUUllfU0FNRV9ETUE7CisJCXBjaV93cml0ZV9jb25maWdfZHdvcmQodHAtPnBkZXYsIFRHM1BDSV9QQ0lTVEFURSwgcGNpX3N0YXRlX3JlZyk7CisJfQorCisJLyogRm9yY2UgdGhlIGNoaXAgaW50byBEMC4gKi8KKwl0ZzNfc2V0X3Bvd2VyX3N0YXRlXzAodHApOworCisJLyogRXRoZXJib290IGRvZXMgbm90IGFzayB0aGUgdGczIHRvIGRvIGNoZWNrc3VtcyAqLworCS8qIEV0aGVyYm9vdCBkb2VzIG5vdCBhc2sgdGhlIHRnMyB0byBkbyBqdW1ibyBmcmFtZXMgKi8KKwkvKiBFaHRlcmJvb3QgZG9lcyBub3QgYXNrIHRoZSB0ZzMgdG8gdXNlIFdha2VPbkxhbi4gKi8KKworCS8qIEEgZmV3IGJvYXJkcyBkb24ndCB3YW50IEV0aGVybmV0QFdpcmVTcGVlZCBwaHkgZmVhdHVyZSAqLworCWlmICgoR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpID09IEFTSUNfUkVWXzU3MDApIHx8CisJCSgoR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpID09IEFTSUNfUkVWXzU3MDUpICYmCisJCQkodHAtPnBjaV9jaGlwX3Jldl9pZCAhPSBDSElQUkVWX0lEXzU3MDVfQTApICYmCisJCQkodHAtPnBjaV9jaGlwX3Jldl9pZCAhPSBDSElQUkVWX0lEXzU3MDVfQTEpKSkgeworCQl0cC0+dGczX2ZsYWdzMiB8PSBURzNfRkxHMl9OT19FVEhfV0lSRV9TUEVFRDsKKwl9CisKKwkvKiBBdm9pZCB0YWdnZWQgaXJxIHN0YXR1cyBldGhlcmJvb3QgZG9lcyBub3QgdXNlIGlycXMgKi8KKworCS8qIE9ubHkgNTcwMSBhbmQgbGF0ZXIgc3VwcG9ydCB0YWdnZWQgaXJxIHN0YXR1cyBtb2RlLgorCSAqIEFsc28sIDU3ODggY2hpcHMgY2Fubm90IHVzZSB0YWdnZWQgaXJxIHN0YXR1cy4KKwkgKgorCSAqIEhvd2V2ZXIsIHNpbmNlIGV0aGVyYm9vdCBkb2VzIG5vdCB1c2UgaXJxcyBhdm9pZCB0YWdnZWQgaXJxcworCSAqIHN0YXR1cyAgYmVjYXVzZSB0aGUgaW50ZXJydXB0IGNvbmRpdGlvbiBpcyBtb3JlIGRpZmZpY3VsdCB0bworCSAqIGZ1bGx5IGNsZWFyIGluIHRoYXQgbW9kZS4KKwkgKi8KKwkKKwkvKiBTaW5jZSBzb21lIDU3MDBfQVggJiYgNTcwMF9CWCBoYXZlIHByb2JsZW1zIHdpdGggMzJCWVRFCisJICogY29hbGVzY2VfbW9kZSwgYW5kIHRoZSByZXN0IHdvcmsgZmluZSBhbnl0aGluZyBzZXQuCisJICogRG9uJ3QgZW5hYmxlIEhPU1RfQ0NfTU9ERV8zMkJZVEUgaW4gZXRoZXJib290LgorCSAqLworCisJLyogSW5pdGlhbGl6ZSBNQUMgTUkgbW9kZSwgcG9sbGluZyBkaXNhYmxlZC4gKi8KKwl0dzMyX2NhcmVmdWxseShNQUNfTUlfTU9ERSwgdHAtPm1pX21vZGUpOworCisJLyogSW5pdGlhbGl6ZSBkYXRhL2Rlc2NyaXB0b3IgYnl0ZS93b3JkIHN3YXBwaW5nLiAqLworCXR3MzIoR1JDX01PREUsIHRwLT5ncmNfbW9kZSk7CisKKwl0ZzNfc3dpdGNoX2Nsb2Nrcyh0cCk7CisKKwkvKiBDbGVhciB0aGlzIG91dCBmb3Igc2FuaXR5LiAqLworCXR3MzIoVEczUENJX01FTV9XSU5fQkFTRV9BRERSLCAwKTsKKworCS8qIEV0aGVyYm9vdCBkb2VzIG5vdCBuZWVkIHRvIGNoZWNrIGlmIHRoZSBQQ0lYX1RBUkdFVF9IV0JVRworCSAqIGlzIG5lZWRlZC4gIEl0IGFsd2F5cyB1c2VzIGl0LgorCSAqLworCQorCXVkZWxheSg1MCk7CisJdGczX252cmFtX2luaXQodHApOworCisJLyogVGhlIFRYIGRlc2NyaXB0b3JzIHdpbGwgcmVzaWRlIGluIG1haW4gbWVtb3J5LgorCSAqLworCisJLyogU2VlIHdoaWNoIGJvYXJkIHdlIGFyZSB1c2luZy4KKwkgKi8KKwlncmNfbWlzY19jZmcgPSB0cjMyKEdSQ19NSVNDX0NGRyk7CisJZ3JjX21pc2NfY2ZnICY9IEdSQ19NSVNDX0NGR19CT0FSRF9JRF9NQVNLOworCisJaWYgKEdFVF9BU0lDX1JFVih0cC0+cGNpX2NoaXBfcmV2X2lkKSA9PSBBU0lDX1JFVl81NzA0ICYmCisJICAgIGdyY19taXNjX2NmZyA9PSBHUkNfTUlTQ19DRkdfQk9BUkRfSURfNTcwNENJT0JFKSB7CisJCXRwLT50ZzNfZmxhZ3MgfD0gVEczX0ZMQUdfU1BMSVRfTU9ERTsKKwkJdHAtPnNwbGl0X21vZGVfbWF4X3JlcXMgPSBTUExJVF9NT0RFXzU3MDRfTUFYX1JFUTsKKwl9CisKKwlpZiAoR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpID09IEFTSUNfUkVWXzU3MDUgJiYKKwkgICAgKGdyY19taXNjX2NmZyA9PSBHUkNfTUlTQ19DRkdfQk9BUkRfSURfNTc4OCB8fAorCSAgICAgZ3JjX21pc2NfY2ZnID09IEdSQ19NSVNDX0NGR19CT0FSRF9JRF81Nzg4TSkpCisJCXRwLT50ZzNfZmxhZ3MyIHw9IFRHM19GTEcyX0lTXzU3ODg7CisKKwkvKiB0aGVzZSBhcmUgbGltaXRlZCB0byAxMC8xMDAgb25seSAqLworCWlmICgoKEdFVF9BU0lDX1JFVih0cC0+cGNpX2NoaXBfcmV2X2lkKSA9PSBBU0lDX1JFVl81NzAzKSAmJgorCQkgICAgKChncmNfbWlzY19jZmcgPT0gMHg4MDAwKSB8fCAoZ3JjX21pc2NfY2ZnID09IDB4NDAwMCkpKSB8fAorCQkoKEdFVF9BU0lDX1JFVih0cC0+cGNpX2NoaXBfcmV2X2lkKSA9PSBBU0lDX1JFVl81NzA1KSAmJgorCQkJKHRwLT5wZGV2LT52ZW5kb3IgPT0gUENJX1ZFTkRPUl9JRF9CUk9BRENPTSkgJiYKKwkJCSgodHAtPnBkZXYtPmRldl9pZCA9PSBQQ0lfREVWSUNFX0lEX1RJR09OM181OTAxKSB8fAorCQkJCSh0cC0+cGRldi0+ZGV2X2lkID09IFBDSV9ERVZJQ0VfSURfVElHT04zXzU5MDFfMikpKSkgeworCQl0cC0+dGczX2ZsYWdzIHw9IFRHM19GTEFHXzEwXzEwMF9PTkxZOworCX0KKworCWVyciA9IHRnM19waHlfcHJvYmUodHApOworCWlmIChlcnIpIHsKKwkJcHJpbnRmKCJwaHkgcHJvYmUgZmFpbGVkLCBlcnIgJWRcbiIsIGVycik7CisJfQorCisJdGczX3JlYWRfcGFydG5vKHRwKTsKKworCisJLyogNTcwMCBCWCBjaGlwcyBuZWVkIHRvIGhhdmUgdGhlaXIgVFggcHJvZHVjZXIgaW5kZXggbWFpbGJveGVzCisJICogd3JpdHRlbiB0d2ljZSB0byB3b3JrYXJvdW5kIGEgYnVnLgorCSAqIEluIGV0aGVyYm9vdCB3ZSBkbyB0aGlzIHVuY29uZGl0aW9uYWxseSB0byBzaW1wbGlmeSB0aGluZ3MuCisJICovCisKKwkvKiA1NzAwIGNoaXBzIGNhbiBnZXQgY29uZnVzZWQgaWYgVFggYnVmZmVycyBzdHJhZGRsZSB0aGUKKwkgKiA0R0IgYWRkcmVzcyBib3VuZGFyeSBpbiBzb21lIGNhc2VzLgorCSAqIAorCSAqIEluIGV0aGVyYm9vdCB3ZSBjYW4gaWdub3JlIHRoZSBwcm9ibGVtIGFzIGV0aGVyYm9vdCBsaXZlcyBiZWxvdyA0R0IuCisJICovCisKKwkvKiBJbiBldGhlcmJvb3Qgd2FrZS1vbi1sYW4gaXMgdW5jb25kaXRpb25hbGx5IGRpc2FibGVkICovCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCAgdGczX2dldF9kZXZpY2VfYWRkcmVzcyhzdHJ1Y3QgdGczICp0cCkKK3sKKwlzdHJ1Y3QgbmljICpuaWMgPSB0cC0+bmljOworCXVpbnQzMl90IGhpLCBsbywgbWFjX29mZnNldDsKKworCWlmIChQQ0lfRlVOQyh0cC0+cGRldi0+ZGV2Zm4pID09IDApCisJCW1hY19vZmZzZXQgPSAweDdjOworCWVsc2UKKwkJbWFjX29mZnNldCA9IDB4Y2M7CisKKwkvKiBGaXJzdCB0cnkgdG8gZ2V0IGl0IGZyb20gTUFDIGFkZHJlc3MgbWFpbGJveC4gKi8KKwl0ZzNfcmVhZF9tZW0oTklDX1NSQU1fTUFDX0FERFJfSElHSF9NQk9YLCAmaGkpOworCWlmICgoaGkgPj4gMTYpID09IDB4NDg0YikgeworCQluaWMtPm5vZGVfYWRkclswXSA9IChoaSA+PiAgOCkgJiAweGZmOworCQluaWMtPm5vZGVfYWRkclsxXSA9IChoaSA+PiAgMCkgJiAweGZmOworCisJCXRnM19yZWFkX21lbShOSUNfU1JBTV9NQUNfQUREUl9MT1dfTUJPWCwgJmxvKTsKKwkJbmljLT5ub2RlX2FkZHJbMl0gPSAobG8gPj4gMjQpICYgMHhmZjsKKwkJbmljLT5ub2RlX2FkZHJbM10gPSAobG8gPj4gMTYpICYgMHhmZjsKKwkJbmljLT5ub2RlX2FkZHJbNF0gPSAobG8gPj4gIDgpICYgMHhmZjsKKwkJbmljLT5ub2RlX2FkZHJbNV0gPSAobG8gPj4gIDApICYgMHhmZjsKKwl9CisJLyogTmV4dCwgdHJ5IE5WUkFNLiAqLworCWVsc2UgaWYgKCF0ZzNfbnZyYW1fcmVhZCh0cCwgbWFjX29mZnNldCArIDAsICZoaSkgJiYKKwkJICF0ZzNfbnZyYW1fcmVhZCh0cCwgbWFjX29mZnNldCArIDQsICZsbykpIHsKKwkJbmljLT5ub2RlX2FkZHJbMF0gPSAoKGhpID4+IDE2KSAmIDB4ZmYpOworCQluaWMtPm5vZGVfYWRkclsxXSA9ICgoaGkgPj4gMjQpICYgMHhmZik7CisJCW5pYy0+bm9kZV9hZGRyWzJdID0gKChsbyA+PiAgMCkgJiAweGZmKTsKKwkJbmljLT5ub2RlX2FkZHJbM10gPSAoKGxvID4+ICA4KSAmIDB4ZmYpOworCQluaWMtPm5vZGVfYWRkcls0XSA9ICgobG8gPj4gMTYpICYgMHhmZik7CisJCW5pYy0+bm9kZV9hZGRyWzVdID0gKChsbyA+PiAyNCkgJiAweGZmKTsKKwl9CisJLyogRmluYWxseSBqdXN0IGZldGNoIGl0IG91dCBvZiB0aGUgTUFDIGNvbnRyb2wgcmVncy4gKi8KKwllbHNlIHsKKwkJaGkgPSB0cjMyKE1BQ19BRERSXzBfSElHSCk7CisJCWxvID0gdHIzMihNQUNfQUREUl8wX0xPVyk7CisKKwkJbmljLT5ub2RlX2FkZHJbNV0gPSBsbyAmIDB4ZmY7CisJCW5pYy0+bm9kZV9hZGRyWzRdID0gKGxvID4+IDgpICYgMHhmZjsKKwkJbmljLT5ub2RlX2FkZHJbM10gPSAobG8gPj4gMTYpICYgMHhmZjsKKwkJbmljLT5ub2RlX2FkZHJbMl0gPSAobG8gPj4gMjQpICYgMHhmZjsKKwkJbmljLT5ub2RlX2FkZHJbMV0gPSBoaSAmIDB4ZmY7CisJCW5pYy0+bm9kZV9hZGRyWzBdID0gKGhpID4+IDgpICYgMHhmZjsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IHRnM19zZXR1cF9kbWEoc3RydWN0IHRnMyAqdHApCit7CisJdHczMihURzNQQ0lfQ0xPQ0tfQ1RSTCwgMCk7CisKKwlpZiAoKHRwLT50ZzNfZmxhZ3MgJiBURzNfRkxBR19QQ0lYX01PREUpID09IDApIHsKKwkJdHAtPmRtYV9yd2N0cmwgPQorCQkJKDB4NyA8PCBETUFfUldDVFJMX1BDSV9XUklURV9DTURfU0hJRlQpIHwKKwkJCSgweDYgPDwgRE1BX1JXQ1RSTF9QQ0lfUkVBRF9DTURfU0hJRlQpIHwKKwkJCSgweDcgPDwgRE1BX1JXQ1RSTF9XUklURV9XQVRFUl9TSElGVCkgfAorCQkJKDB4NyA8PCBETUFfUldDVFJMX1JFQURfV0FURVJfU0hJRlQpIHwKKwkJCSgweDBmIDw8IERNQV9SV0NUUkxfTUlOX0RNQV9TSElGVCk7CisJCWlmIChHRVRfQVNJQ19SRVYodHAtPnBjaV9jaGlwX3Jldl9pZCkgPT0gQVNJQ19SRVZfNTcwNSkgeworCQkJdHAtPmRtYV9yd2N0cmwgJj0gfihETUFfUldDVFJMX01JTl9ETUEgPDwgRE1BX1JXQ1RSTF9NSU5fRE1BX1NISUZUKTsKKwkJfQorCX0gZWxzZSB7CisJCWlmIChHRVRfQVNJQ19SRVYodHAtPnBjaV9jaGlwX3Jldl9pZCkgPT0gQVNJQ19SRVZfNTcwNCkKKwkJCXRwLT5kbWFfcndjdHJsID0KKwkJCQkoMHg3IDw8IERNQV9SV0NUUkxfUENJX1dSSVRFX0NNRF9TSElGVCkgfAorCQkJCSgweDYgPDwgRE1BX1JXQ1RSTF9QQ0lfUkVBRF9DTURfU0hJRlQpIHwKKwkJCQkoMHgzIDw8IERNQV9SV0NUUkxfV1JJVEVfV0FURVJfU0hJRlQpIHwKKwkJCQkoMHg3IDw8IERNQV9SV0NUUkxfUkVBRF9XQVRFUl9TSElGVCkgfAorCQkJCSgweDAwIDw8IERNQV9SV0NUUkxfTUlOX0RNQV9TSElGVCk7CisJCWVsc2UKKwkJCXRwLT5kbWFfcndjdHJsID0KKwkJCQkoMHg3IDw8IERNQV9SV0NUUkxfUENJX1dSSVRFX0NNRF9TSElGVCkgfAorCQkJCSgweDYgPDwgRE1BX1JXQ1RSTF9QQ0lfUkVBRF9DTURfU0hJRlQpIHwKKwkJCQkoMHgzIDw8IERNQV9SV0NUUkxfV1JJVEVfV0FURVJfU0hJRlQpIHwKKwkJCQkoMHgzIDw8IERNQV9SV0NUUkxfUkVBRF9XQVRFUl9TSElGVCkgfAorCQkJCSgweDBmIDw8IERNQV9SV0NUUkxfTUlOX0RNQV9TSElGVCk7CisKKwkJLyogV2hlZWUsIHNvbWUgbW9yZSBjaGlwIGJ1Z3MuLi4gKi8KKwkJaWYgKChHRVRfQVNJQ19SRVYodHAtPnBjaV9jaGlwX3Jldl9pZCkgPT0gQVNJQ19SRVZfNTcwMykgfHwKKwkJCShHRVRfQVNJQ19SRVYodHAtPnBjaV9jaGlwX3Jldl9pZCkgPT0gQVNJQ19SRVZfNTcwNCkpIHsKKwkJCXVpbnQzMl90IGNjdmFsID0gdHIzMihURzNQQ0lfQ0xPQ0tfQ1RSTCkgJiAweDFmOworCisJCQlpZiAoKGNjdmFsID09IDB4NikgfHwgKGNjdmFsID09IDB4NykpIHsKKwkJCQl0cC0+ZG1hX3J3Y3RybCB8PSBETUFfUldDVFJMX09ORV9ETUE7CisJCQl9CisJCX0KKwl9CisKKwlpZiAoKEdFVF9BU0lDX1JFVih0cC0+cGNpX2NoaXBfcmV2X2lkKSA9PSBBU0lDX1JFVl81NzAzKSB8fAorCQkoR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpID09IEFTSUNfUkVWXzU3MDQpKSB7CisJCXRwLT5kbWFfcndjdHJsICY9IH4oRE1BX1JXQ1RSTF9NSU5fRE1BIDw8IERNQV9SV0NUUkxfTUlOX0RNQV9TSElGVCk7CisJfQorCisJdHAtPmRtYV9yd2N0cmwgfD0gRE1BX1JXQ1RSTF9BU1NFUlRfQUxMX0JFOworCisJdHczMihURzNQQ0lfRE1BX1JXX0NUUkwsIHRwLT5kbWFfcndjdHJsKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCB0ZzNfaW5pdF9saW5rX2NvbmZpZyhzdHJ1Y3QgdGczICp0cCkKK3sKKwl0cC0+bGlua19jb25maWcuYWR2ZXJ0aXNpbmcgPQorCQkoQURWRVJUSVNFRF8xMGJhc2VUX0hhbGYgfCBBRFZFUlRJU0VEXzEwYmFzZVRfRnVsbCB8CisJCSBBRFZFUlRJU0VEXzEwMGJhc2VUX0hhbGYgfCBBRFZFUlRJU0VEXzEwMGJhc2VUX0Z1bGwgfAorCQkgQURWRVJUSVNFRF8xMDAwYmFzZVRfSGFsZiB8IEFEVkVSVElTRURfMTAwMGJhc2VUX0Z1bGwgfAorCQkgQURWRVJUSVNFRF9BdXRvbmVnIHwgQURWRVJUSVNFRF9NSUkpOworCXRwLT5jYXJyaWVyX29rID0gMDsKKwl0cC0+bGlua19jb25maWcuYWN0aXZlX3NwZWVkID0gU1BFRURfSU5WQUxJRDsKKwl0cC0+bGlua19jb25maWcuYWN0aXZlX2R1cGxleCA9IERVUExFWF9JTlZBTElEOworfQorCisKKyNpZiBTVVBQT1JUX1BIWV9TVFIKK3N0YXRpYyBjb25zdCBjaGFyICogdGczX3BoeV9zdHJpbmcoc3RydWN0IHRnMyAqdHApCit7CisJc3dpdGNoICh0cC0+cGh5X2lkICYgUEhZX0lEX01BU0spIHsKKwljYXNlIFBIWV9JRF9CQ001NDAwOglyZXR1cm4gIjU0MDAiOworCWNhc2UgUEhZX0lEX0JDTTU0MDE6CXJldHVybiAiNTQwMSI7CisJY2FzZSBQSFlfSURfQkNNNTQxMToJcmV0dXJuICI1NDExIjsKKwljYXNlIFBIWV9JRF9CQ001NzAxOglyZXR1cm4gIjU3MDEiOworCWNhc2UgUEhZX0lEX0JDTTU3MDM6CXJldHVybiAiNTcwMyI7CisJY2FzZSBQSFlfSURfQkNNNTcwNDoJcmV0dXJuICI1NzA0IjsKKwljYXNlIFBIWV9JRF9CQ004MDAyOglyZXR1cm4gIjgwMDIiOworCWNhc2UgUEhZX0lEX1NFUkRFUzoJcmV0dXJuICJzZXJkZXMiOworCWRlZmF1bHQ6CQlyZXR1cm4gInVua25vd24iOworCX07Cit9CisjZWxzZQorI2RlZmluZSB0ZzNfcGh5X3N0cmluZyhUUCkgIj8iCisjZW5kaWYKKworCitzdGF0aWMgdm9pZCB0ZzNfcG9sbF9saW5rKHN0cnVjdCB0ZzMgKnRwKQoreworCXVpbnQzMl90IG1hY19zdGF0OworCisJbWFjX3N0YXQgPSB0cjMyKE1BQ19TVEFUVVMpOworCWlmICh0cC0+cGh5X2lkID09IFBIWV9JRF9TRVJERVMpIHsKKwkJaWYgKHRwLT5jYXJyaWVyX29rPworCQkJKG1hY19zdGF0ICYgTUFDX1NUQVRVU19MTktTVEFURV9DSEFOR0VEKToKKwkJCShtYWNfc3RhdCAmIE1BQ19TVEFUVVNfUENTX1NZTkNFRCkpIHsKKwkJCXR3MzJfY2FyZWZ1bGx5KE1BQ19NT0RFLCB0cC0+bWFjX21vZGUgJiB+TUFDX01PREVfUE9SVF9NT0RFX01BU0spOworCQkJdHczMl9jYXJlZnVsbHkoTUFDX01PREUsIHRwLT5tYWNfbW9kZSk7CisKKwkJCXRnM19zZXR1cF9waHkodHApOworCQl9CisJfQorCWVsc2UgeworCQlpZiAobWFjX3N0YXQgJiBNQUNfU1RBVFVTX0xOS1NUQVRFX0NIQU5HRUQpIHsKKwkJCXRnM19zZXR1cF9waHkodHApOworCQl9CisJfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1BPTEwgLSBXYWl0IGZvciBhIGZyYW1lCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCB0ZzNfYWNrX2lycXMoc3RydWN0IHRnMyAqdHApCit7CisJaWYgKHRwLT5od19zdGF0dXMtPnN0YXR1cyAmIFNEX1NUQVRVU19VUERBVEVEKSB7CisJCS8qCisJCSAqIHdyaXRpbmcgYW55IHZhbHVlIHRvIGludHItbWJveC0wIGNsZWFycyBQQ0kgSU5UQSMgYW5kCisJCSAqIGNoaXAtaW50ZXJuYWwgaW50ZXJydXB0IHBlbmRpbmcgZXZlbnRzLgorCQkgKiB3cml0aW5nIG5vbi16ZXJvIHRvIGludHItbWJveC0wIGFkZGl0aW9uYWwgdGVsbHMgdGhlCisJCSAqIE5JQyB0byBzdG9wIHNlbmRpbmcgdXMgaXJxcywgZW5nYWdpbmcgImluLWludHItaGFuZGxlciIKKwkJICogZXZlbnQgY29hbGVzY2luZy4KKwkJICovCisJCXR3MzJfbWFpbGJveChNQUlMQk9YX0lOVEVSUlVQVF8wICsgVEczXzY0QklUX1JFR19MT1csIAorCQkJMHgwMDAwMDAwMSk7CisJCS8qCisJCSAqIEZsdXNoIFBDSSB3cml0ZS4gIFRoaXMgYWxzbyBndWFyYW50ZWVzIHRoYXQgb3VyCisJCSAqIHN0YXR1cyBibG9jayBoYXMgYmVlbiBmbHVzaGVkIHRvIGhvc3QgbWVtb3J5LgorCQkgKi8KKwkJdHIzMihNQUlMQk9YX0lOVEVSUlVQVF8wICsgVEczXzY0QklUX1JFR19MT1cpOworCQl0cC0+aHdfc3RhdHVzLT5zdGF0dXMgJj0gflNEX1NUQVRVU19VUERBVEVEOworCX0KK30KKworc3RhdGljIGludCB0ZzNfcG9sbChzdHJ1Y3QgbmljICpuaWMsIGludCByZXRyaWV2ZSkKK3sKKwkvKiByZXR1cm4gdHJ1ZSBpZiB0aGVyZSdzIGFuIGV0aGVybmV0IHBhY2tldCByZWFkeSB0byByZWFkICovCisJLyogbmljLT5wYWNrZXQgc2hvdWxkIGNvbnRhaW4gZGF0YSBvbiByZXR1cm4gKi8KKwkvKiBuaWMtPnBhY2tldGxlbiBzaG91bGQgY29udGFpbiBsZW5ndGggb2YgZGF0YSAqLworCisJc3RydWN0IHRnMyAqdHAgPSAmdGczOworCWludCByZXN1bHQ7CisKKwlyZXN1bHQgPSAwOworCisJaWYgKCAodHAtPmh3X3N0YXR1cy0+aWR4WzBdLnJ4X3Byb2R1Y2VyICE9IHRwLT5yeF9yY2JfcHRyKSAmJiAhcmV0cmlldmUgKSAKKwkgIHJldHVybiAxOworCisJdGczX2Fja19pcnFzKHRwKTsKKworCWlmICh0cC0+aHdfc3RhdHVzLT5pZHhbMF0ucnhfcHJvZHVjZXIgIT0gdHAtPnJ4X3JjYl9wdHIpIHsKKwkJc3RydWN0IHRnM19yeF9idWZmZXJfZGVzYyAqZGVzYzsKKwkJdW5zaWduZWQgaW50IGxlbjsKKwkJZGVzYyA9ICZ0cC0+cnhfcmNiW3RwLT5yeF9yY2JfcHRyXTsKKwkJaWYgKChkZXNjLT5vcGFxdWUgJiBSWERfT1BBUVVFX1JJTkdfTUFTSykgPT0gUlhEX09QQVFVRV9SSU5HX1NURCkgeworCQkJbGVuID0gKChkZXNjLT5pZHhfbGVuICYgUlhEX0xFTl9NQVNLKSA+PiBSWERfTEVOX1NISUZUKSAtIDQ7IC8qIG9taXQgY3JjICovCisJCQkKKwkJCW5pYy0+cGFja2V0bGVuID0gbGVuOworCQkJbWVtY3B5KG5pYy0+cGFja2V0LCBidXNfdG9fdmlydChkZXNjLT5hZGRyX2xvKSwgbGVuKTsKKwkJCXJlc3VsdCA9IDE7CisJCX0KKwkJdHAtPnJ4X3JjYl9wdHIgPSAodHAtPnJ4X3JjYl9wdHIgKyAxKSAlIFRHM19SWF9SQ0JfUklOR19TSVpFOworCQkKKwkJLyogQUNLIHRoZSBzdGF0dXMgcmluZyAqLworCQl0dzMyX21haWxib3gyKE1BSUxCT1hfUkNWUkVUX0NPTl9JRFhfMCArIFRHM182NEJJVF9SRUdfTE9XLCB0cC0+cnhfcmNiX3B0cik7CisKKwkJLyogUmVmaWxsIFJYIHJpbmcuICovCisJCWlmIChyZXN1bHQpIHsKKwkJCXRwLT5yeF9zdGRfcHRyID0gKHRwLT5yeF9zdGRfcHRyICsgMSkgJSBURzNfUlhfUklOR19TSVpFOworCQkJdHczMl9tYWlsYm94MihNQUlMQk9YX1JDVl9TVERfUFJPRF9JRFggKyBURzNfNjRCSVRfUkVHX0xPVywgdHAtPnJ4X3N0ZF9wdHIpOworCQl9CisJfQorCXRnM19wb2xsX2xpbmsodHApOworCXJldHVybiByZXN1bHQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorVFJBTlNNSVQgLSBUcmFuc21pdCBhIGZyYW1lCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWYgMAorc3RhdGljIHZvaWQgdGczX3NldF90eGQoc3RydWN0IHRnMyAqdHAsIGludCBlbnRyeSwKKwlkbWFfYWRkcl90IG1hcHBpbmcsIGludCBsZW4sIHVpbnQzMl90IGZsYWdzLAorCXVpbnQzMl90IG1zc19hbmRfaXNfZW5kKQoreworCXN0cnVjdCB0ZzNfdHhfYnVmZmVyX2Rlc2MgKnR4ZCA9ICAmdHAtPnR4X3JpbmdbZW50cnldOworCWludCBpc19lbmQgPSAobXNzX2FuZF9pc19lbmQgJiAweDEpOworCWlmIChpc19lbmQpIHsKKwkJZmxhZ3MgfD0gVFhEX0ZMQUdfRU5EOworCX0KKworCXR4ZC0+YWRkcl9oaSAgID0gMDsKKwl0eGQtPmFkZHJfbG8gICA9IG1hcHBpbmcgJiAweGZmZmZmZmZmOworCXR4ZC0+bGVuX2ZsYWdzID0gKGxlbiA8PCBUWERfTEVOX1NISUZUKSB8IGZsYWdzOworCXR4ZC0+dmxhbl90YWcgID0gMCA8PCBUWERfVkxBTl9UQUdfU0hJRlQ7Cit9CisjZW5kaWYKKworc3RhdGljIHZvaWQgdGczX3RyYW5zbWl0KHN0cnVjdCBuaWMgKm5pYywgY29uc3QgY2hhciAqZHN0X2FkZHIsCisJdW5zaWduZWQgaW50IHR5cGUsIHVuc2lnbmVkIGludCBzaXplLCBjb25zdCBjaGFyICpwYWNrZXQpCit7CisJc3RhdGljIHN0cnVjdCBldGhfZnJhbWUgeworCQl1aW50OF90ICBkc3RfYWRkcltFVEhfQUxFTl07CisJCXVpbnQ4X3QgIHNyY19hZGRyW0VUSF9BTEVOXTsKKwkJdWludDE2X3QgdHlwZTsKKwkJdWludDhfdCAgZGF0YSBbRVRIX0ZSQU1FX0xFTiAtIEVUSF9ITEVOXTsKKwl9IGZyYW1lWzJdOworCXN0YXRpYyBpbnQgZnJhbWVfaWR4OworCQorCS8qIHNlbmQgdGhlIHBhY2tldCB0byBkZXN0aW5hdGlvbiAqLworCXN0cnVjdCB0ZzNfdHhfYnVmZmVyX2Rlc2MgKnR4ZDsKKwlzdHJ1Y3QgdGczICp0cDsKKwl1aW50MzJfdCBlbnRyeTsKKwlpbnQgaTsKKworCS8qIFdhaXQgdW50aWwgdGhlcmUgaXMgYSBmcmVlIHBhY2tldCBmcmFtZSAqLworCXRwID0gJnRnMzsKKwlpID0gMDsKKwllbnRyeSA9IHRwLT50eF9wcm9kOworCXdoaWxlKCh0cC0+aHdfc3RhdHVzLT5pZHhbMF0udHhfY29uc3VtZXIgIT0gZW50cnkpICYmCisJCSh0cC0+aHdfc3RhdHVzLT5pZHhbMF0udHhfY29uc3VtZXIgIT0gUFJFVl9UWChlbnRyeSkpKSB7CisJCW1kZWxheSgxMCk7CS8qIGdpdmUgdGhlIG5pY2sgYSBjaGFuY2UgKi8KKwkJcG9sbF9pbnRlcnJ1cHRpb25zKCk7CisJCWlmICgrK2kgPiA1MDApIHsgLyogdGltZW91dCA1cyBmb3IgdHJhbnNtaXQgKi8KKwkJCXByaW50ZigidHJhbnNtaXQgdGltZWQgb3V0XG4iKTsKKwkJCXRnM19oYWx0KHRwKTsKKwkJCXRnM19zZXR1cF9odyh0cCk7CisJCQlyZXR1cm47CisJCX0KKwl9CisJaWYgKGkgIT0gMCkgeworCQlwcmludGYoIiMiKTsKKwl9CisJCisJLyogQ29weSB0aGUgcGFja2V0IHRvIHRoZSBvdXIgbG9jYWwgYnVmZmVyICovCisJbWVtY3B5KCZmcmFtZVtmcmFtZV9pZHhdLmRzdF9hZGRyLCBkc3RfYWRkciwgRVRIX0FMRU4pOworCW1lbWNweSgmZnJhbWVbZnJhbWVfaWR4XS5zcmNfYWRkciwgbmljLT5ub2RlX2FkZHIsIEVUSF9BTEVOKTsKKwlmcmFtZVtmcmFtZV9pZHhdLnR5cGUgPSBodG9ucyh0eXBlKTsKKwltZW1zZXQoJmZyYW1lW2ZyYW1lX2lkeF0uZGF0YSwgMCwgc2l6ZW9mKGZyYW1lW2ZyYW1lX2lkeF0uZGF0YSkpOworCW1lbWNweSgmZnJhbWVbZnJhbWVfaWR4XS5kYXRhLCBwYWNrZXQsIHNpemUpOworCisJLyogU2V0dXAgdGhlIHJpbmcgYnVmZmVyIGVudHJ5IHRvIHRyYW5zbWl0ICovCisJdHhkICAgICAgICAgICAgPSAmdHAtPnR4X3JpbmdbZW50cnldOworCXR4ZC0+YWRkcl9oaSAgID0gMDsgLyogRXRoZXJib290IHJ1bnMgdW5kZXIgNEdCICovCisJdHhkLT5hZGRyX2xvICAgPSB2aXJ0X3RvX2J1cygmZnJhbWVbZnJhbWVfaWR4XSk7CisJdHhkLT5sZW5fZmxhZ3MgPSAoKHNpemUgKyBFVEhfSExFTikgPDwgVFhEX0xFTl9TSElGVCkgfCBUWERfRkxBR19FTkQ7CisJdHhkLT52bGFuX3RhZyAgPSAwIDw8IFRYRF9WTEFOX1RBR19TSElGVDsKKworCS8qIEFkdmFuY2UgdG8gdGhlIG5leHQgZW50cnkgKi8KKwllbnRyeSA9IE5FWFRfVFgoZW50cnkpOworCWZyYW1lX2lkeCBePSAxOworCisJLyogUGFja2V0cyBhcmUgcmVhZHksIHVwZGF0ZSBUeCBwcm9kdWNlciBpZHggbG9jYWwgYW5kIG9uIGNhcmQgKi8KKwl0dzMyX21haWxib3goKE1BSUxCT1hfU05ESE9TVF9QUk9EX0lEWF8wICsgVEczXzY0QklUX1JFR19MT1cpLCBlbnRyeSk7CisJdHczMl9tYWlsYm94MigoTUFJTEJPWF9TTkRIT1NUX1BST0RfSURYXzAgKyBURzNfNjRCSVRfUkVHX0xPVyksIGVudHJ5KTsKKwl0cC0+dHhfcHJvZCA9IGVudHJ5OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK0RJU0FCTEUgLSBUdXJuIG9mZiBldGhlcm5ldCBpbnRlcmZhY2UKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIHRnM19kaXNhYmxlKHN0cnVjdCBkZXYgKmRldiBfX3VudXNlZCkKK3sKKwlzdHJ1Y3QgdGczICp0cCA9ICZ0ZzM7CisJLyogcHV0IHRoZSBjYXJkIGluIGl0cyBpbml0aWFsIHN0YXRlICovCisJLyogVGhpcyBmdW5jdGlvbiBzZXJ2ZXMgMyBwdXJwb3Nlcy4KKwkgKiBUaGlzIGRpc2FibGVzIERNQSBhbmQgaW50ZXJydXB0cyBzbyB3ZSBkb24ndCByZWNlaXZlCisJICogIHVuZXhwZWN0ZWQgcGFja2V0cyBvciBpbnRlcnJ1cHRzIGZyb20gdGhlIGNhcmQgYWZ0ZXIKKwkgKiAgZXRoZXJib290IGhhcyBmaW5pc2hlZC4gCisJICogVGhpcyBmcmVlcyByZXNvdXJjZXMgc28gZXRoZXJib290IG1heSB1c2UKKwkgKiAgdGhpcyBkcml2ZXIgb24gYW5vdGhlciBpbnRlcmZhY2UKKwkgKiBUaGlzIGFsbG93cyBldGhlcmJvb3QgdG8gcmVpbml0aWFsaXplIHRoZSBpbnRlcmZhY2UKKwkgKiAgaWYgc29tZXRoaW5nIGlzIHNvbWV0aGluZyBnb2VzIHdyb25nLgorCSAqLworCXRnM19oYWx0KHRwKTsKKwl0cC0+dGczX2ZsYWdzICY9IH4oVEczX0ZMQUdfSU5JVF9DT01QTEVURXxURzNfRkxBR19HT1RfU0VSREVTX0ZMT1dDVEwpOworCXRwLT5jYXJyaWVyX29rID0gMDsKKwlpb3VubWFwKCh2b2lkICopdHAtPnJlZ3MpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK0lSUSAtIEVuYWJsZSwgRGlzYWJsZSwgb3IgRm9yY2UgaW50ZXJydXB0cworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgdGczX2lycShzdHJ1Y3QgbmljICpuaWMgX191bnVzZWQsIGlycV9hY3Rpb25fdCBhY3Rpb24gX191bnVzZWQpCit7CisgIHN3aXRjaCAoIGFjdGlvbiApIHsKKyAgY2FzZSBESVNBQkxFIDoKKyAgICBicmVhazsKKyAgY2FzZSBFTkFCTEUgOgorICAgIGJyZWFrOworICBjYXNlIEZPUkNFIDoKKyAgICBicmVhazsKKyAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1BST0JFIC0gTG9vayBmb3IgYW4gYWRhcHRlciwgdGhpcyByb3V0aW5lJ3MgdmlzaWJsZSB0byB0aGUgb3V0c2lkZQorWW91IHNob3VsZCBvbWl0IHRoZSBsYXN0IGFyZ3VtZW50IHN0cnVjdCBwY2lfZGV2aWNlICogZm9yIGEgbm9uLVBDSSBOSUMKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQgdGczX3Byb2JlKHN0cnVjdCBkZXYgKmRldiwgc3RydWN0IHBjaV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IG5pYyAqbmljID0gKHN0cnVjdCBuaWMgKilkZXY7CisJc3RydWN0IHRnMyAqdHAgPSAmdGczOworCXVuc2lnbmVkIGxvbmcgdGczcmVnX2Jhc2UsIHRnM3JlZ19sZW47CisJaW50IGksIGVyciwgcG1fY2FwOworCisJaWYgKHBkZXYgPT0gMCkKKwkJcmV0dXJuIDA7CisKKwltZW1zZXQodHAsIDAsIHNpemVvZigqdHApKTsKKworCWFkanVzdF9wY2lfZGV2aWNlKHBkZXYpOworCisJbmljLT5pcnFubyAgPSAwOworCW5pYy0+aW9hZGRyID0gcGRldi0+aW9hZGRyICYgfjM7CisKKwkvKiBGaW5kIHBvd2VyLW1hbmFnZW1lbnQgY2FwYWJpbGl0eS4gKi8KKwlwbV9jYXAgPSBwY2lfZmluZF9jYXBhYmlsaXR5KHBkZXYsIFBDSV9DQVBfSURfUE0pOworCWlmIChwbV9jYXAgPT0gMCkgeworCQlwcmludGYoIkNhbm5vdCBmaW5kIFBvd2VyTWFuYWdlbWVudCBjYXBhYmlsaXR5LCBhYm9ydGluZy5cbiIpOworCQlyZXR1cm4gMDsKKwl9CisJdGczcmVnX2Jhc2UgPSBwY2lfYmFyX3N0YXJ0KHBkZXYsIFBDSV9CQVNFX0FERFJFU1NfMCk7CisJaWYgKHRnM3JlZ19iYXNlID09IC0xVUwpIHsKKwkJcHJpbnRmKCJVbnVzZWFibGUgYmFyXG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCXRnM3JlZ19sZW4gID0gcGNpX2Jhcl9zaXplKHBkZXYsICBQQ0lfQkFTRV9BRERSRVNTXzApOworCisJdHAtPnBkZXYgICAgICAgPSBwZGV2OworCXRwLT5uaWMgICAgICAgID0gbmljOworCXRwLT5wbV9jYXAgICAgID0gcG1fY2FwOworCXRwLT5yeF9tb2RlICAgID0gMDsKKwl0cC0+dHhfbW9kZSAgICA9IDA7CisJdHAtPm1pX21vZGUgICAgPSBNQUNfTUlfTU9ERV9CQVNFOworCXRwLT50ZzNfZmxhZ3MgID0gMCAmIH5URzNfRkxBR19JTklUX0NPTVBMRVRFOyAKKwkKKwkvKiBUaGUgd29yZC9ieXRlIHN3YXAgY29udHJvbHMgaGVyZSBjb250cm9sIHJlZ2lzdGVyIGFjY2VzcyBieXRlCisJICogc3dhcHBpbmcuICBETUEgZGF0YSBieXRlIHN3YXBwaW5nIGlzIGNvbnRyb2xsZWQgaW4gdGhlIEdSQ19NT0RFCisJICogc2V0dGluZyBiZWxvdy4KKwkgKi8KKwl0cC0+bWlzY19ob3N0X2N0cmwgPQorCQlNSVNDX0hPU1RfQ1RSTF9NQVNLX1BDSV9JTlQgfAorCQlNSVNDX0hPU1RfQ1RSTF9XT1JEX1NXQVAgfAorCQlNSVNDX0hPU1RfQ1RSTF9JTkRJUl9BQ0NFU1MgfAorCQlNSVNDX0hPU1RfQ1RSTF9QQ0lTVEFURV9SVzsKKworCS8qIFRoZSBOT05GUk0gKG5vbi1mcmFtZSkgYnl0ZS93b3JkIHN3YXAgY29udHJvbHMgdGFrZSBlZmZlY3QKKwkgKiBvbiBkZXNjcmlwdG9yIGVudHJpZXMsIGFueXRoaW5nIHdoaWNoIGlzbid0IHBhY2tldCBkYXRhLgorCSAqCisJICogVGhlIFN0cm9uZ0FSTSBjaGlwcyBvbiB0aGUgYm9hcmQgKG9uZSBmb3IgdHgsIG9uZSBmb3IgcngpCisJICogYXJlIHJ1bm5pbmcgaW4gYmlnLWVuZGlhbiBtb2RlLgorCSAqLworCXRwLT5ncmNfbW9kZSA9IChHUkNfTU9ERV9XU1dBUF9EQVRBIHwgR1JDX01PREVfQlNXQVBfREFUQSB8CisJCQlHUkNfTU9ERV9XU1dBUF9OT05GUk1fREFUQSk7CisjaWYgX19CWVRFX09SREVSID09IF9fQklHX0VORElBTgorCXRwLT5ncmNfbW9kZSB8PSBHUkNfTU9ERV9CU1dBUF9OT05GUk1fREFUQTsKKyNlbmRpZgorCXRwLT5yZWdzID0gKHVuc2lnbmVkIGxvbmcpIGlvcmVtYXAodGczcmVnX2Jhc2UsIHRnM3JlZ19sZW4pOworCWlmICh0cC0+cmVncyA9PSAwVUwpIHsKKwkJcHJpbnRmKCJDYW5ub3QgbWFwIGRldmljZSByZWdpc3RlcnMsIGFib3J0aW5nXG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJdGczX2luaXRfbGlua19jb25maWcodHApOworCisJZXJyID0gdGczX2dldF9pbnZhcmlhbnRzKHRwKTsKKwlpZiAoZXJyKSB7CisJCXByaW50ZigiUHJvYmxlbSBmZXRjaGluZyBpbnZhcmlhbnRzIG9mIGNoaXAsIGFib3J0aW5nLlxuIik7CisJCWdvdG8gZXJyX291dF9pb3VubWFwOworCX0KKworCWVyciA9IHRnM19nZXRfZGV2aWNlX2FkZHJlc3ModHApOworCWlmIChlcnIpIHsKKwkJcHJpbnRmKCJDb3VsZCBub3Qgb2J0YWluIHZhbGlkIGV0aGVybmV0IGFkZHJlc3MsIGFib3J0aW5nLlxuIik7CisJCWdvdG8gZXJyX291dF9pb3VubWFwOworCX0KKwlwcmludGYoIkV0aGVybmV0IGFkZHI6ICUhXG4iLCBuaWMtPm5vZGVfYWRkcik7CisKKwl0ZzNfc2V0dXBfZG1hKHRwKTsKKworCS8qIE5vdyB0aGF0IHdlIGhhdmUgZnVsbHkgc2V0dXAgdGhlIGNoaXAsIHNhdmUgYXdheSBhIHNuYXBzaG90CisJICogb2YgdGhlIFBDSSBjb25maWcgc3BhY2UuICBXZSBuZWVkIHRvIHJlc3RvcmUgdGhpcyBhZnRlcgorCSAqIEdSQ19NSVNDX0NGRyBjb3JlIGNsb2NrIHJlc2V0cyBhbmQgc29tZSByZXN1bWUgZXZlbnRzLgorCSAqLworCXBjaV9zYXZlX3N0YXRlKHRwLT5wZGV2LCB0cC0+cGNpX2NmZ19zdGF0ZSk7CisKKwlwcmludGYoIlRpZ29uMyBbcGFydG5vKCVzKSByZXYgJWh4IFBIWSglcyldIChQQ0klczolczolcylcbiIsCisJCXRwLT5ib2FyZF9wYXJ0X251bWJlciwKKwkJdHAtPnBjaV9jaGlwX3Jldl9pZCwKKwkJdGczX3BoeV9zdHJpbmcodHApLAorCQkoKHRwLT50ZzNfZmxhZ3MgJiBURzNfRkxBR19QQ0lYX01PREUpID8gIlgiIDogIiIpLAorCQkoKHRwLT50ZzNfZmxhZ3MgJiBURzNfRkxBR19QQ0lfSElHSF9TUEVFRCkgPworCQkJKCh0cC0+dGczX2ZsYWdzICYgVEczX0ZMQUdfUENJWF9NT0RFKSA/ICIxMzNNSHoiIDogIjY2TUh6IikgOgorCQkJKCh0cC0+dGczX2ZsYWdzICYgVEczX0ZMQUdfUENJWF9NT0RFKSA/ICIxMDBNSHoiIDogIjMzTUh6IikpLAorCQkoKHRwLT50ZzNfZmxhZ3MgJiBURzNfRkxBR19QQ0lfMzJCSVQpID8gIjMyLWJpdCIgOiAiNjQtYml0IikpOworCisKKwllcnIgPSB0ZzNfc2V0dXBfaHcodHApOyAKKwlpZiAoZXJyKSB7CisJCWdvdG8gZXJyX291dF9kaXNhYmxlOworCX0gCisJdHAtPnRnM19mbGFncyB8PSBURzNfRkxBR19JTklUX0NPTVBMRVRFOworCisJLyogV2FpdCBmb3IgYSByZWFzb25hYmxlIHRpbWUgZm9yIHRoZSBsaW5rIHRvIGNvbWUgdXAgKi8KKwl0ZzNfcG9sbF9saW5rKHRwKTsKKwlmb3IoaSA9IDA7ICF0cC0+Y2Fycmllcl9vayAmJiAoaSA8IFZBTElEX0xJTktfVElNRU9VVCoxMDApOyBpKyspIHsKKwkJbWRlbGF5KDEpOworCQl0ZzNfcG9sbF9saW5rKHRwKTsKKwl9CisJaWYgKCF0cC0+Y2Fycmllcl9vayl7CisJCXByaW50ZigiVmFsaWQgbGluayBub3QgZXN0YWJsaXNoZWRcbiIpOworCQlnb3RvIGVycl9vdXRfZGlzYWJsZTsKKwl9CisKKwlkZXYtPmRpc2FibGUgID0gdGczX2Rpc2FibGU7CisJbmljLT5wb2xsICAgICA9IHRnM19wb2xsOworCW5pYy0+dHJhbnNtaXQgPSB0ZzNfdHJhbnNtaXQ7CisJbmljLT5pcnEgICAgICA9IHRnM19pcnE7CisKKwlyZXR1cm4gMTsKKworIGVycl9vdXRfaW91bm1hcDoKKwlpb3VubWFwKCh2b2lkICopdHAtPnJlZ3MpOworCXJldHVybiAwOworIGVycl9vdXRfZGlzYWJsZToKKwl0ZzNfZGlzYWJsZShkZXYpOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHBjaV9pZCB0ZzNfbmljc1tdID0geworUENJX1JPTSgweDE0ZTQsIDB4MTY0NCwgInRnMy01NzAwIiwgICAgICAgICJCcm9hZGNvbSBUaWdvbiAzIDU3MDAiKSwKK1BDSV9ST00oMHgxNGU0LCAweDE2NDUsICJ0ZzMtNTcwMSIsICAgICAgICAiQnJvYWRjb20gVGlnb24gMyA1NzAxIiksCitQQ0lfUk9NKDB4MTRlNCwgMHgxNjQ2LCAidGczLTU3MDIiLCAgICAgICAgIkJyb2FkY29tIFRpZ29uIDMgNTcwMiIpLAorUENJX1JPTSgweDE0ZTQsIDB4MTY0NywgInRnMy01NzAzIiwgICAgICAgICJCcm9hZGNvbSBUaWdvbiAzIDU3MDMiKSwKK1BDSV9ST00oMHgxNGU0LCAweDE2NDgsICJ0ZzMtNTcwNCIsICAgICAgICAiQnJvYWRjb20gVGlnb24gMyA1NzA0IiksCitQQ0lfUk9NKDB4MTRlNCwgMHgxNjRkLCAidGczLTU3MDJGRSIsICAgICAgIkJyb2FkY29tIFRpZ29uIDMgNTcwMkZFIiksCitQQ0lfUk9NKDB4MTRlNCwgMHgxNjUzLCAidGczLTU3MDUiLCAgICAgICAgIkJyb2FkY29tIFRpZ29uIDMgNTcwNSIpLAorUENJX1JPTSgweDE0ZTQsIDB4MTY1NCwgInRnMy01NzA1XzIiLCAgICAgICJCcm9hZGNvbSBUaWdvbiAzIDU3MDVfMiIpLAorUENJX1JPTSgweDE0ZTQsIDB4MTY1ZCwgInRnMy01NzA1TSIsICAgICAgICJCcm9hZGNvbSBUaWdvbiAzIDU3MDVNIiksCitQQ0lfUk9NKDB4MTRlNCwgMHgxNjVlLCAidGczLTU3MDVNXzIiLCAgICAgIkJyb2FkY29tIFRpZ29uIDMgNTcwNU1fMiIpLAorUENJX1JPTSgweDE0ZTQsIDB4MTY5NiwgInRnMy01NzgyIiwgICAgICAgICJCcm9hZGNvbSBUaWdvbiAzIDU3ODIiKSwKK1BDSV9ST00oMHgxNGU0LCAweDE2OWMsICJ0ZzMtNTc4OCIsICAgICAgICAiQnJvYWRjb20gVGlnb24gMyA1Nzg4IiksCitQQ0lfUk9NKDB4MTRlNCwgMHgxNmE2LCAidGczLTU3MDJYIiwgICAgICAgIkJyb2FkY29tIFRpZ29uIDMgNTcwMlgiKSwKK1BDSV9ST00oMHgxNGU0LCAweDE2YTcsICJ0ZzMtNTcwM1giLCAgICAgICAiQnJvYWRjb20gVGlnb24gMyA1NzAzWCIpLAorUENJX1JPTSgweDE0ZTQsIDB4MTZhOCwgInRnMy01NzA0UyIsICAgICAgICJCcm9hZGNvbSBUaWdvbiAzIDU3MDRTIiksCitQQ0lfUk9NKDB4MTRlNCwgMHgxNmM2LCAidGczLTU3MDJBMyIsICAgICAgIkJyb2FkY29tIFRpZ29uIDMgNTcwMkEzIiksCitQQ0lfUk9NKDB4MTRlNCwgMHgxNmM3LCAidGczLTU3MDNBMyIsICAgICAgIkJyb2FkY29tIFRpZ29uIDMgNTcwM0EzIiksCitQQ0lfUk9NKDB4MTRlNCwgMHgxNzBkLCAidGczLTU5MDEiLCAgICAgICAgIkJyb2FkY29tIFRpZ29uIDMgNTkwMSIpLAorUENJX1JPTSgweDE0ZTQsIDB4MTcwZSwgInRnMy01OTAxXzIiLCAgICAgICJCcm9hZGNvbSBUaWdvbiAzIDU5MDFfMiIpLAorUENJX1JPTSgweDExNDgsIDB4NDQwMCwgInRnMy05RFhYIiwgICAgICAgICJTeXNrb25uZWN0IDlEWFgiKSwKK1BDSV9ST00oMHgxMTQ4LCAweDQ1MDAsICJ0ZzMtOU1YWCIsICAgICAgICAiU3lza29ubmVjdCA5TVhYIiksCitQQ0lfUk9NKDB4MTczYiwgMHgwM2U4LCAidGczLWFjMTAwMCIsICAgICAgIkFsdGltYSBBQzEwMDAiKSwKK1BDSV9ST00oMHgxNzNiLCAweDAzZTksICJ0ZzMtYWMxMDAxIiwgICAgICAiQWx0aW1hIEFDMTAwMSIpLAorUENJX1JPTSgweDE3M2IsIDB4MDNlYSwgInRnMy1hYzkxMDAiLCAgICAgICJBbHRpbWEgQUM5MTAwIiksCitQQ0lfUk9NKDB4MTczYiwgMHgwM2ViLCAidGczLWFjMTAwMyIsICAgICAgIkFsdGltYSBBQzEwMDMiKSwKK307CisKK3N0cnVjdCBwY2lfZHJpdmVyIHRnM19kcml2ZXIgPSB7CisJLnR5cGUJICA9IE5JQ19EUklWRVIsCisJLm5hbWUJICA9ICJURzMiLAorCS5wcm9iZQkgID0gdGczX3Byb2JlLAorCS5pZHMJICA9IHRnM19uaWNzLAorCS5pZF9jb3VudCA9IHNpemVvZih0ZzNfbmljcykvc2l6ZW9mKHRnM19uaWNzWzBdKSwKKwkuY2xhc3MgICAgPSAwLAorfTsKZGlmZiAtTmF1ciBncnViLTAuOTcub3JpZy9uZXRib290L3RnMy5oIGdydWItMC45Ny9uZXRib290L3RnMy5oCi0tLSBncnViLTAuOTcub3JpZy9uZXRib290L3RnMy5oCTE5NzAtMDEtMDEgMDA6MDA6MDAuMDAwMDAwMDAwICswMDAwCisrKyBncnViLTAuOTcvbmV0Ym9vdC90ZzMuaAkyMDA1LTA4LTMxIDE5OjAzOjM1LjAwMDAwMDAwMCArMDAwMApAQCAtMCwwICsxLDIyMDMgQEAKKy8qICRJZDogZ3J1Yi0wLjk1LWRpc2tsZXNzLXBhdGNoLTIucGF0Y2gsdiAxLjEuMS4xIDIwMDUvMDYvMTQgMDg6MTg6NTAgd2Vzb2xvd3MgRXhwICQKKyAqIHRnMy5oOiBEZWZpbml0aW9ucyBmb3IgQnJvYWRjb20gVGlnb24zIGV0aGVybmV0IGRyaXZlci4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEsIDIwMDIgRGF2aWQgUy4gTWlsbGVyIChkYXZlbUByZWRoYXQuY29tKQorICogQ29weXJpZ2h0IChDKSAyMDAxIEplZmYgR2FyemlrIChqZ2FyemlrQG1hbmRyYWtlc29mdC5jb20pCisgKi8KKworI2lmbmRlZiBfVDNfSAorI2RlZmluZSBfVDNfSAorCisjaW5jbHVkZSAic3RkaW50LmgiCisKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBkbWFfYWRkcl90OworCisvKiBGcm9tIG1paS5oICovCisKKy8qIEluZGljYXRlcyB3aGF0IGZlYXR1cmVzIGFyZSBhZHZlcnRpc2VkIGJ5IHRoZSBpbnRlcmZhY2UuICovCisjZGVmaW5lIEFEVkVSVElTRURfMTBiYXNlVF9IYWxmCQkoMSA8PCAwKQorI2RlZmluZSBBRFZFUlRJU0VEXzEwYmFzZVRfRnVsbAkJKDEgPDwgMSkKKyNkZWZpbmUgQURWRVJUSVNFRF8xMDBiYXNlVF9IYWxmCSgxIDw8IDIpCisjZGVmaW5lIEFEVkVSVElTRURfMTAwYmFzZVRfRnVsbAkoMSA8PCAzKQorI2RlZmluZSBBRFZFUlRJU0VEXzEwMDBiYXNlVF9IYWxmCSgxIDw8IDQpCisjZGVmaW5lIEFEVkVSVElTRURfMTAwMGJhc2VUX0Z1bGwJKDEgPDwgNSkKKyNkZWZpbmUgQURWRVJUSVNFRF9BdXRvbmVnCQkoMSA8PCA2KQorI2RlZmluZSBBRFZFUlRJU0VEX1RQCQkJKDEgPDwgNykKKyNkZWZpbmUgQURWRVJUSVNFRF9BVUkJCQkoMSA8PCA4KQorI2RlZmluZSBBRFZFUlRJU0VEX01JSQkJCSgxIDw8IDkpCisjZGVmaW5lIEFEVkVSVElTRURfRklCUkUJCSgxIDw8IDEwKQorI2RlZmluZSBBRFZFUlRJU0VEX0JOQwkJCSgxIDw8IDExKQorCisvKiBUaGUgZm9sbG93aW5nIGFyZSBhbGwgaW52b2x2ZWQgaW4gZm9yY2luZyBhIHBhcnRpY3VsYXIgbGluaworICogbW9kZSBmb3IgdGhlIGRldmljZSBmb3Igc2V0dGluZyB0aGluZ3MuICBXaGVuIGdldHRpbmcgdGhlCisgKiBkZXZpY2VzIHNldHRpbmdzLCB0aGVzZSBpbmRpY2F0ZSB0aGUgY3VycmVudCBtb2RlIGFuZCB3aGV0aGVyCisgKiBpdCB3YXMgZm9jZWQgdXAgaW50byB0aGlzIG1vZGUgb3IgYXV0b25lZ290aWF0ZWQuCisgKi8KKworLyogVGhlIGZvcmNlZCBzcGVlZCwgMTBNYiwgMTAwTWIsIGdpZ2FiaXQuICovCisjZGVmaW5lIFNQRUVEXzEwCQkwCisjZGVmaW5lIFNQRUVEXzEwMAkJMQorI2RlZmluZSBTUEVFRF8xMDAwCQkyCisjZGVmaW5lIFNQRUVEX0lOVkFMSUQgICAgICAgICAgIDMKKworCisvKiBEdXBsZXgsIGhhbGYgb3IgZnVsbC4gKi8KKyNkZWZpbmUgRFVQTEVYX0hBTEYJCTB4MDAKKyNkZWZpbmUgRFVQTEVYX0ZVTEwJCTB4MDEKKyNkZWZpbmUgRFVQTEVYX0lOVkFMSUQgICAgICAgICAgMHgwMgorCisvKiBXaGljaCBjb25uZWN0b3IgcG9ydC4gKi8KKyNkZWZpbmUgUE9SVF9UUAkJCTB4MDAKKyNkZWZpbmUgUE9SVF9BVUkJCTB4MDEKKyNkZWZpbmUgUE9SVF9NSUkJCTB4MDIKKyNkZWZpbmUgUE9SVF9GSUJSRQkJMHgwMworI2RlZmluZSBQT1JUX0JOQwkJMHgwNAorCisvKiBXaGljaCB0cmFuY2VpdmVyIHRvIHVzZS4gKi8KKyNkZWZpbmUgWENWUl9JTlRFUk5BTAkJMHgwMAorI2RlZmluZSBYQ1ZSX0VYVEVSTkFMCQkweDAxCisjZGVmaW5lIFhDVlJfRFVNTVkxCQkweDAyCisjZGVmaW5lIFhDVlJfRFVNTVkyCQkweDAzCisjZGVmaW5lIFhDVlJfRFVNTVkzCQkweDA0CisKKy8qIEVuYWJsZSBvciBkaXNhYmxlIGF1dG9uZWdvdGlhdGlvbi4gIElmIHRoaXMgaXMgc2V0IHRvIGVuYWJsZSwKKyAqIHRoZSBmb3JjZWQgbGluayBtb2RlcyBhYm92ZSBhcmUgY29tcGxldGVseSBpZ25vcmVkLgorICovCisjZGVmaW5lIEFVVE9ORUdfRElTQUJMRQkJMHgwMAorI2RlZmluZSBBVVRPTkVHX0VOQUJMRQkJMHgwMQorCisvKiBXYWtlLU9uLUxhbiBvcHRpb25zLiAqLworI2RlZmluZSBXQUtFX1BIWQkJKDEgPDwgMCkKKyNkZWZpbmUgV0FLRV9VQ0FTVAkJKDEgPDwgMSkKKyNkZWZpbmUgV0FLRV9NQ0FTVAkJKDEgPDwgMikKKyNkZWZpbmUgV0FLRV9CQ0FTVAkJKDEgPDwgMykKKyNkZWZpbmUgV0FLRV9BUlAJCSgxIDw8IDQpCisjZGVmaW5lIFdBS0VfTUFHSUMJCSgxIDw8IDUpCisjZGVmaW5lIFdBS0VfTUFHSUNTRUNVUkUJKDEgPDwgNikgLyogb25seSBtZWFuaW5nZnVsIGlmIFdBS0VfTUFHSUMgKi8KKworLyogR2VuZXJpYyBNSUkgcmVnaXN0ZXJzLiAqLworCisjZGVmaW5lIE1JSV9CTUNSICAgICAgICAgICAgMHgwMCAgICAgICAgLyogQmFzaWMgbW9kZSBjb250cm9sIHJlZ2lzdGVyICovCisjZGVmaW5lIE1JSV9CTVNSICAgICAgICAgICAgMHgwMSAgICAgICAgLyogQmFzaWMgbW9kZSBzdGF0dXMgcmVnaXN0ZXIgICovCisjZGVmaW5lIE1JSV9QSFlTSUQxICAgICAgICAgMHgwMiAgICAgICAgLyogUEhZUyBJRCAxICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIE1JSV9QSFlTSUQyICAgICAgICAgMHgwMyAgICAgICAgLyogUEhZUyBJRCAyICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIE1JSV9BRFZFUlRJU0UgICAgICAgMHgwNCAgICAgICAgLyogQWR2ZXJ0aXNlbWVudCBjb250cm9sIHJlZyAgICovCisjZGVmaW5lIE1JSV9MUEEgICAgICAgICAgICAgMHgwNSAgICAgICAgLyogTGluayBwYXJ0bmVyIGFiaWxpdHkgcmVnICAgICovCisjZGVmaW5lIE1JSV9FWFBBTlNJT04gICAgICAgMHgwNiAgICAgICAgLyogRXhwYW5zaW9uIHJlZ2lzdGVyICAgICAgICAgICovCisjZGVmaW5lIE1JSV9EQ09VTlRFUiAgICAgICAgMHgxMiAgICAgICAgLyogRGlzY29ubmVjdCBjb3VudGVyICAgICAgICAgICovCisjZGVmaW5lIE1JSV9GQ1NDT1VOVEVSICAgICAgMHgxMyAgICAgICAgLyogRmFsc2UgY2FycmllciBjb3VudGVyICAgICAgICovCisjZGVmaW5lIE1JSV9OV0FZVEVTVCAgICAgICAgMHgxNCAgICAgICAgLyogTi13YXkgYXV0by1uZWcgdGVzdCByZWcgICAgICovCisjZGVmaW5lIE1JSV9SRVJSQ09VTlRFUiAgICAgMHgxNSAgICAgICAgLyogUmVjZWl2ZSBlcnJvciBjb3VudGVyICAgICAgICovCisjZGVmaW5lIE1JSV9TUkVWSVNJT04gICAgICAgMHgxNiAgICAgICAgLyogU2lsaWNvbiByZXZpc2lvbiAgICAgICAgICAgICovCisjZGVmaW5lIE1JSV9SRVNWMSAgICAgICAgICAgMHgxNyAgICAgICAgLyogUmVzZXJ2ZWQuLi4gICAgICAgICAgICAgICAgICovCisjZGVmaW5lIE1JSV9MQlJFUlJPUiAgICAgICAgMHgxOCAgICAgICAgLyogTHBiYWNrLCByeCwgYnlwYXNzIGVycm9yICAgICovCisjZGVmaW5lIE1JSV9QSFlBRERSICAgICAgICAgMHgxOSAgICAgICAgLyogUEhZIGFkZHJlc3MgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIE1JSV9SRVNWMiAgICAgICAgICAgMHgxYSAgICAgICAgLyogUmVzZXJ2ZWQuLi4gICAgICAgICAgICAgICAgICovCisjZGVmaW5lIE1JSV9UUElTVEFUVVMgICAgICAgMHgxYiAgICAgICAgLyogVFBJIHN0YXR1cyBmb3IgMTBtYnBzICAgICAgICovCisjZGVmaW5lIE1JSV9OQ09ORklHICAgICAgICAgMHgxYyAgICAgICAgLyogTmV0d29yayBpbnRlcmZhY2UgY29uZmlnICAgICovCisKKy8qIEJhc2ljIG1vZGUgY29udHJvbCByZWdpc3Rlci4gKi8KKyNkZWZpbmUgQk1DUl9SRVNWICAgICAgICAgICAgICAgMHgwMDdmICAvKiBVbnVzZWQuLi4gICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQk1DUl9DVFNUICAgICAgICAgICAgICAgMHgwMDgwICAvKiBDb2xsaXNpb24gdGVzdCAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQk1DUl9GVUxMRFBMWCAgICAgICAgICAgMHgwMTAwICAvKiBGdWxsIGR1cGxleCAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQk1DUl9BTlJFU1RBUlQgICAgICAgICAgMHgwMjAwICAvKiBBdXRvIG5lZ290aWF0aW9uIHJlc3RhcnQgICAgKi8KKyNkZWZpbmUgQk1DUl9JU09MQVRFICAgICAgICAgICAgMHgwNDAwICAvKiBEaXNjb25uZWN0IERQODM4NDAgZnJvbSBNSUkgKi8KKyNkZWZpbmUgQk1DUl9QRE9XTiAgICAgICAgICAgICAgMHgwODAwICAvKiBQb3dlcmRvd24gdGhlIERQODM4NDAgICAgICAgKi8KKyNkZWZpbmUgQk1DUl9BTkVOQUJMRSAgICAgICAgICAgMHgxMDAwICAvKiBFbmFibGUgYXV0byBuZWdvdGlhdGlvbiAgICAgKi8KKyNkZWZpbmUgQk1DUl9TUEVFRDEwMCAgICAgICAgICAgMHgyMDAwICAvKiBTZWxlY3QgMTAwTWJwcyAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQk1DUl9MT09QQkFDSyAgICAgICAgICAgMHg0MDAwICAvKiBUWEQgbG9vcGJhY2sgYml0cyAgICAgICAgICAgKi8KKyNkZWZpbmUgQk1DUl9SRVNFVCAgICAgICAgICAgICAgMHg4MDAwICAvKiBSZXNldCB0aGUgRFA4Mzg0MCAgICAgICAgICAgKi8KKworLyogQmFzaWMgbW9kZSBzdGF0dXMgcmVnaXN0ZXIuICovCisjZGVmaW5lIEJNU1JfRVJDQVAgICAgICAgICAgICAgIDB4MDAwMSAgLyogRXh0LXJlZyBjYXBhYmlsaXR5ICAgICAgICAgICovCisjZGVmaW5lIEJNU1JfSkNEICAgICAgICAgICAgICAgIDB4MDAwMiAgLyogSmFiYmVyIGRldGVjdGVkICAgICAgICAgICAgICovCisjZGVmaW5lIEJNU1JfTFNUQVRVUyAgICAgICAgICAgIDB4MDAwNCAgLyogTGluayBzdGF0dXMgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEJNU1JfQU5FR0NBUEFCTEUgICAgICAgIDB4MDAwOCAgLyogQWJsZSB0byBkbyBhdXRvLW5lZ290aWF0aW9uICovCisjZGVmaW5lIEJNU1JfUkZBVUxUICAgICAgICAgICAgIDB4MDAxMCAgLyogUmVtb3RlIGZhdWx0IGRldGVjdGVkICAgICAgICovCisjZGVmaW5lIEJNU1JfQU5FR0NPTVBMRVRFICAgICAgIDB4MDAyMCAgLyogQXV0by1uZWdvdGlhdGlvbiBjb21wbGV0ZSAgICovCisjZGVmaW5lIEJNU1JfUkVTViAgICAgICAgICAgICAgIDB4MDdjMCAgLyogVW51c2VkLi4uICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEJNU1JfMTBIQUxGICAgICAgICAgICAgIDB4MDgwMCAgLyogQ2FuIGRvIDEwbWJwcywgaGFsZi1kdXBsZXggICovCisjZGVmaW5lIEJNU1JfMTBGVUxMICAgICAgICAgICAgIDB4MTAwMCAgLyogQ2FuIGRvIDEwbWJwcywgZnVsbC1kdXBsZXggICovCisjZGVmaW5lIEJNU1JfMTAwSEFMRiAgICAgICAgICAgIDB4MjAwMCAgLyogQ2FuIGRvIDEwMG1icHMsIGhhbGYtZHVwbGV4ICovCisjZGVmaW5lIEJNU1JfMTAwRlVMTCAgICAgICAgICAgIDB4NDAwMCAgLyogQ2FuIGRvIDEwMG1icHMsIGZ1bGwtZHVwbGV4ICovCisjZGVmaW5lIEJNU1JfMTAwQkFTRTQgICAgICAgICAgIDB4ODAwMCAgLyogQ2FuIGRvIDEwMG1icHMsIDRrIHBhY2tldHMgICovCisKKy8qIEFkdmVydGlzZW1lbnQgY29udHJvbCByZWdpc3Rlci4gKi8KKyNkZWZpbmUgQURWRVJUSVNFX1NMQ1QgICAgICAgICAgMHgwMDFmICAvKiBTZWxlY3RvciBiaXRzICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQURWRVJUSVNFX0NTTUEgICAgICAgICAgMHgwMDAxICAvKiBPbmx5IHNlbGVjdG9yIHN1cHBvcnRlZCAgICAgKi8KKyNkZWZpbmUgQURWRVJUSVNFXzEwSEFMRiAgICAgICAgMHgwMDIwICAvKiBUcnkgZm9yIDEwbWJwcyBoYWxmLWR1cGxleCAgKi8KKyNkZWZpbmUgQURWRVJUSVNFXzEwRlVMTCAgICAgICAgMHgwMDQwICAvKiBUcnkgZm9yIDEwbWJwcyBmdWxsLWR1cGxleCAgKi8KKyNkZWZpbmUgQURWRVJUSVNFXzEwMEhBTEYgICAgICAgMHgwMDgwICAvKiBUcnkgZm9yIDEwMG1icHMgaGFsZi1kdXBsZXggKi8KKyNkZWZpbmUgQURWRVJUSVNFXzEwMEZVTEwgICAgICAgMHgwMTAwICAvKiBUcnkgZm9yIDEwMG1icHMgZnVsbC1kdXBsZXggKi8KKyNkZWZpbmUgQURWRVJUSVNFXzEwMEJBU0U0ICAgICAgMHgwMjAwICAvKiBUcnkgZm9yIDEwMG1icHMgNGsgcGFja2V0cyAgKi8KKyNkZWZpbmUgQURWRVJUSVNFX1JFU1YgICAgICAgICAgMHgxYzAwICAvKiBVbnVzZWQuLi4gICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQURWRVJUSVNFX1JGQVVMVCAgICAgICAgMHgyMDAwICAvKiBTYXkgd2UgY2FuIGRldGVjdCBmYXVsdHMgICAgKi8KKyNkZWZpbmUgQURWRVJUSVNFX0xQQUNLICAgICAgICAgMHg0MDAwICAvKiBBY2sgbGluayBwYXJ0bmVycyByZXNwb25zZSAgKi8KKyNkZWZpbmUgQURWRVJUSVNFX05QQUdFICAgICAgICAgMHg4MDAwICAvKiBOZXh0IHBhZ2UgYml0ICAgICAgICAgICAgICAgKi8KKworI2RlZmluZSBBRFZFUlRJU0VfRlVMTCAoQURWRVJUSVNFXzEwMEZVTEwgfCBBRFZFUlRJU0VfMTBGVUxMIHwgXAorCQkJQURWRVJUSVNFX0NTTUEpCisjZGVmaW5lIEFEVkVSVElTRV9BTEwgKEFEVkVSVElTRV8xMEhBTEYgfCBBRFZFUlRJU0VfMTBGVUxMIHwgXAorICAgICAgICAgICAgICAgICAgICAgICBBRFZFUlRJU0VfMTAwSEFMRiB8IEFEVkVSVElTRV8xMDBGVUxMKQorCisvKiBMaW5rIHBhcnRuZXIgYWJpbGl0eSByZWdpc3Rlci4gKi8KKyNkZWZpbmUgTFBBX1NMQ1QgICAgICAgICAgICAgICAgMHgwMDFmICAvKiBTYW1lIGFzIGFkdmVydGlzZSBzZWxlY3RvciAgKi8KKyNkZWZpbmUgTFBBXzEwSEFMRiAgICAgICAgICAgICAgMHgwMDIwICAvKiBDYW4gZG8gMTBtYnBzIGhhbGYtZHVwbGV4ICAgKi8KKyNkZWZpbmUgTFBBXzEwRlVMTCAgICAgICAgICAgICAgMHgwMDQwICAvKiBDYW4gZG8gMTBtYnBzIGZ1bGwtZHVwbGV4ICAgKi8KKyNkZWZpbmUgTFBBXzEwMEhBTEYgICAgICAgICAgICAgMHgwMDgwICAvKiBDYW4gZG8gMTAwbWJwcyBoYWxmLWR1cGxleCAgKi8KKyNkZWZpbmUgTFBBXzEwMEZVTEwgICAgICAgICAgICAgMHgwMTAwICAvKiBDYW4gZG8gMTAwbWJwcyBmdWxsLWR1cGxleCAgKi8KKyNkZWZpbmUgTFBBXzEwMEJBU0U0ICAgICAgICAgICAgMHgwMjAwICAvKiBDYW4gZG8gMTAwbWJwcyA0ayBwYWNrZXRzICAgKi8KKyNkZWZpbmUgTFBBX1JFU1YgICAgICAgICAgICAgICAgMHgxYzAwICAvKiBVbnVzZWQuLi4gICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTFBBX1JGQVVMVCAgICAgICAgICAgICAgMHgyMDAwICAvKiBMaW5rIHBhcnRuZXIgZmF1bHRlZCAgICAgICAgKi8KKyNkZWZpbmUgTFBBX0xQQUNLICAgICAgICAgICAgICAgMHg0MDAwICAvKiBMaW5rIHBhcnRuZXIgYWNrZWQgdXMgICAgICAgKi8KKyNkZWZpbmUgTFBBX05QQUdFICAgICAgICAgICAgICAgMHg4MDAwICAvKiBOZXh0IHBhZ2UgYml0ICAgICAgICAgICAgICAgKi8KKworI2RlZmluZSBMUEFfRFVQTEVYCQkoTFBBXzEwRlVMTCB8IExQQV8xMDBGVUxMKQorI2RlZmluZSBMUEFfMTAwCQkJKExQQV8xMDBGVUxMIHwgTFBBXzEwMEhBTEYgfCBMUEFfMTAwQkFTRTQpCisKKy8qIEV4cGFuc2lvbiByZWdpc3RlciBmb3IgYXV0by1uZWdvdGlhdGlvbi4gKi8KKyNkZWZpbmUgRVhQQU5TSU9OX05XQVkgICAgICAgICAgMHgwMDAxICAvKiBDYW4gZG8gTi13YXkgYXV0by1uZWdvICAgICAgKi8KKyNkZWZpbmUgRVhQQU5TSU9OX0xDV1AgICAgICAgICAgMHgwMDAyICAvKiBHb3QgbmV3IFJYIHBhZ2UgY29kZSB3b3JkICAgKi8KKyNkZWZpbmUgRVhQQU5TSU9OX0VOQUJMRU5QQUdFICAgMHgwMDA0ICAvKiBUaGlzIGVuYWJsZXMgbnBhZ2Ugd29yZHMgICAgKi8KKyNkZWZpbmUgRVhQQU5TSU9OX05QQ0FQQUJMRSAgICAgMHgwMDA4ICAvKiBMaW5rIHBhcnRuZXIgc3VwcG9ydHMgbnBhZ2UgKi8KKyNkZWZpbmUgRVhQQU5TSU9OX01GQVVMVFMgICAgICAgMHgwMDEwICAvKiBNdWx0aXBsZSBmYXVsdHMgZGV0ZWN0ZWQgICAgKi8KKyNkZWZpbmUgRVhQQU5TSU9OX1JFU1YgICAgICAgICAgMHhmZmUwICAvKiBVbnVzZWQuLi4gICAgICAgICAgICAgICAgICAgKi8KKworLyogTi13YXkgdGVzdCByZWdpc3Rlci4gKi8KKyNkZWZpbmUgTldBWVRFU1RfUkVTVjEgICAgICAgICAgMHgwMGZmICAvKiBVbnVzZWQuLi4gICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTldBWVRFU1RfTE9PUEJBQ0sgICAgICAgMHgwMTAwICAvKiBFbmFibGUgbG9vcGJhY2sgZm9yIE4td2F5ICAgKi8KKyNkZWZpbmUgTldBWVRFU1RfUkVTVjIgICAgICAgICAgMHhmZTAwICAvKiBVbnVzZWQuLi4gICAgICAgICAgICAgICAgICAgKi8KKworCisvKiBGcm9tIHRnMy5oICovCisKKyNkZWZpbmUgVEczXzY0QklUX1JFR19ISUdICQkweDAwVUwKKyNkZWZpbmUgVEczXzY0QklUX1JFR19MT1cJCTB4MDRVTAorCisvKiBEZXNjcmlwdG9yIGJsb2NrIGluZm8uICovCisjZGVmaW5lIFRHM19CRElORk9fSE9TVF9BRERSCQkweDBVTCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgVEczX0JESU5GT19NQVhMRU5fRkxBR1MJCTB4OFVMIC8qIDMyLWJpdCAqLworI2RlZmluZSAgQkRJTkZPX0ZMQUdTX1VTRV9FWFRfUkVDVgkgMHgwMDAwMDAwMSAvKiBleHQgcnhfYnVmZmVyX2Rlc2MgKi8KKyNkZWZpbmUgIEJESU5GT19GTEFHU19ESVNBQkxFRAkJIDB4MDAwMDAwMDIKKyNkZWZpbmUgIEJESU5GT19GTEFHU19NQVhMRU5fTUFTSwkgMHhmZmZmMDAwMAorI2RlZmluZSAgQkRJTkZPX0ZMQUdTX01BWExFTl9TSElGVAkgMTYKKyNkZWZpbmUgVEczX0JESU5GT19OSUNfQUREUgkJMHhjVUwgLyogMzItYml0ICovCisjZGVmaW5lIFRHM19CRElORk9fU0laRQkJCTB4MTBVTAorCisjZGVmaW5lIFJYX0NPUFlfVEhSRVNIT0xEICAJCTI1NgorCisjZGVmaW5lIFJYX1NURF9NQVhfU0laRQkJCTE1MzYKKyNkZWZpbmUgUlhfU1REX01BWF9TSVpFXzU3MDUJCTUxMgorI2RlZmluZSBSWF9KVU1CT19NQVhfU0laRQkJMHhkZWFkYmVlZiAvKiBYWFggKi8KKworLyogRmlyc3QgMjU2IGJ5dGVzIGFyZSBhIG1pcnJvciBvZiBQQ0kgY29uZmlnIHNwYWNlLiAqLworI2RlZmluZSBURzNQQ0lfVkVORE9SCQkJMHgwMDAwMDAwMAorI2RlZmluZSAgVEczUENJX1ZFTkRPUl9CUk9BRENPTQkJIDB4MTRlNAorI2RlZmluZSBURzNQQ0lfREVWSUNFCQkJMHgwMDAwMDAwMgorI2RlZmluZSAgVEczUENJX0RFVklDRV9USUdPTjNfMQkJIDB4MTY0NCAvKiBCQ001NzAwICovCisjZGVmaW5lICBURzNQQ0lfREVWSUNFX1RJR09OM18yCQkgMHgxNjQ1IC8qIEJDTTU3MDEgKi8KKyNkZWZpbmUgIFRHM1BDSV9ERVZJQ0VfVElHT04zXzMJCSAweDE2NDYgLyogQkNNNTcwMiAqLworI2RlZmluZSAgVEczUENJX0RFVklDRV9USUdPTjNfNAkJIDB4MTY0NyAvKiBCQ001NzAzICovCisjZGVmaW5lIFRHM1BDSV9DT01NQU5ECQkJMHgwMDAwMDAwNAorI2RlZmluZSBURzNQQ0lfU1RBVFVTCQkJMHgwMDAwMDAwNgorI2RlZmluZSBURzNQQ0lfQ0NSRVZJRAkJCTB4MDAwMDAwMDgKKyNkZWZpbmUgVEczUENJX0NBQ0hFTElORVNaCQkweDAwMDAwMDBjCisjZGVmaW5lIFRHM1BDSV9MQVRUSU1FUgkJCTB4MDAwMDAwMGQKKyNkZWZpbmUgVEczUENJX0hFQURFUlRZUEUJCTB4MDAwMDAwMGUKKyNkZWZpbmUgVEczUENJX0JJU1QJCQkweDAwMDAwMDBmCisjZGVmaW5lIFRHM1BDSV9CQVNFMF9MT1cJCTB4MDAwMDAwMTAKKyNkZWZpbmUgVEczUENJX0JBU0UwX0hJR0gJCTB4MDAwMDAwMTQKKy8qIDB4MTggLS0+IDB4MmMgdW51c2VkICovCisjZGVmaW5lIFRHM1BDSV9TVUJTWVNWRU5JRAkJMHgwMDAwMDAyYworI2RlZmluZSBURzNQQ0lfU1VCU1lTSUQJCQkweDAwMDAwMDJlCisjZGVmaW5lIFRHM1BDSV9ST01BRERSCQkJMHgwMDAwMDAzMAorI2RlZmluZSBURzNQQ0lfQ0FQTElTVAkJCTB4MDAwMDAwMzQKKy8qIDB4MzUgLS0+IDB4M2MgdW51c2VkICovCisjZGVmaW5lIFRHM1BDSV9JUlFfTElORQkJCTB4MDAwMDAwM2MKKyNkZWZpbmUgVEczUENJX0lSUV9QSU4JCQkweDAwMDAwMDNkCisjZGVmaW5lIFRHM1BDSV9NSU5fR05UCQkJMHgwMDAwMDAzZQorI2RlZmluZSBURzNQQ0lfTUFYX0xBVAkJCTB4MDAwMDAwM2YKKyNkZWZpbmUgVEczUENJX1hfQ0FQUwkJCTB4MDAwMDAwNDAKKyNkZWZpbmUgIFBDSVhfQ0FQU19SRUxBWEVEX09SREVSSU5HCSAweDAwMDIwMDAwCisjZGVmaW5lICBQQ0lYX0NBUFNfU1BMSVRfTUFTSwkJIDB4MDA3MDAwMDAKKyNkZWZpbmUgIFBDSVhfQ0FQU19TUExJVF9TSElGVAkJIDIwCisjZGVmaW5lICBQQ0lYX0NBUFNfQlVSU1RfTUFTSwkJIDB4MDAwYzAwMDAKKyNkZWZpbmUgIFBDSVhfQ0FQU19CVVJTVF9TSElGVAkJIDE4CisjZGVmaW5lICBQQ0lYX0NBUFNfTUFYX0JVUlNUX0NQSU9CCSAyCisjZGVmaW5lIFRHM1BDSV9QTV9DQVBfUFRSCQkweDAwMDAwMDQxCisjZGVmaW5lIFRHM1BDSV9YX0NPTU1BTkQJCTB4MDAwMDAwNDIKKyNkZWZpbmUgVEczUENJX1hfU1RBVFVTCQkJMHgwMDAwMDA0NAorI2RlZmluZSBURzNQQ0lfUE1fQ0FQX0lECQkweDAwMDAwMDQ4CisjZGVmaW5lIFRHM1BDSV9WUERfQ0FQX1BUUgkJMHgwMDAwMDA0OQorI2RlZmluZSBURzNQQ0lfUE1fQ0FQUwkJCTB4MDAwMDAwNGEKKyNkZWZpbmUgVEczUENJX1BNX0NUUkxfU1RBVAkJMHgwMDAwMDA0YworI2RlZmluZSBURzNQQ0lfQlJfU1VQUF9FWFQJCTB4MDAwMDAwNGUKKyNkZWZpbmUgVEczUENJX1BNX0RBVEEJCQkweDAwMDAwMDRmCisjZGVmaW5lIFRHM1BDSV9WUERfQ0FQX0lECQkweDAwMDAwMDUwCisjZGVmaW5lIFRHM1BDSV9NU0lfQ0FQX1BUUgkJMHgwMDAwMDA1MQorI2RlZmluZSBURzNQQ0lfVlBEX0FERFJfRkxBRwkJMHgwMDAwMDA1MgorI2RlZmluZSAgVlBEX0FERFJfRkxBR19XUklURQkJMHgwMDAwODAwMAorI2RlZmluZSBURzNQQ0lfVlBEX0RBVEEJCQkweDAwMDAwMDU0CisjZGVmaW5lIFRHM1BDSV9NU0lfQ0FQX0lECQkweDAwMDAwMDU4CisjZGVmaW5lIFRHM1BDSV9OWFRfQ0FQX1BUUgkJMHgwMDAwMDA1OQorI2RlZmluZSBURzNQQ0lfTVNJX0NUUkwJCQkweDAwMDAwMDVhCisjZGVmaW5lIFRHM1BDSV9NU0lfQUREUl9MT1cJCTB4MDAwMDAwNWMKKyNkZWZpbmUgVEczUENJX01TSV9BRERSX0hJR0gJCTB4MDAwMDAwNjAKKyNkZWZpbmUgVEczUENJX01TSV9EQVRBCQkJMHgwMDAwMDA2NAorLyogMHg2NiAtLT4gMHg2OCB1bnVzZWQgKi8KKyNkZWZpbmUgVEczUENJX01JU0NfSE9TVF9DVFJMCQkweDAwMDAwMDY4CisjZGVmaW5lICBNSVNDX0hPU1RfQ1RSTF9DTEVBUl9JTlQJIDB4MDAwMDAwMDEKKyNkZWZpbmUgIE1JU0NfSE9TVF9DVFJMX01BU0tfUENJX0lOVAkgMHgwMDAwMDAwMgorI2RlZmluZSAgTUlTQ19IT1NUX0NUUkxfQllURV9TV0FQCSAweDAwMDAwMDA0CisjZGVmaW5lICBNSVNDX0hPU1RfQ1RSTF9XT1JEX1NXQVAJIDB4MDAwMDAwMDgKKyNkZWZpbmUgIE1JU0NfSE9TVF9DVFJMX1BDSVNUQVRFX1JXCSAweDAwMDAwMDEwCisjZGVmaW5lICBNSVNDX0hPU1RfQ1RSTF9DTEtSRUdfUlcJIDB4MDAwMDAwMjAKKyNkZWZpbmUgIE1JU0NfSE9TVF9DVFJMX1JFR1dPUkRfU1dBUAkgMHgwMDAwMDA0MAorI2RlZmluZSAgTUlTQ19IT1NUX0NUUkxfSU5ESVJfQUNDRVNTCSAweDAwMDAwMDgwCisjZGVmaW5lICBNSVNDX0hPU1RfQ1RSTF9JUlFfTUFTS19NT0RFCSAweDAwMDAwMTAwCisjZGVmaW5lICBNSVNDX0hPU1RfQ1RSTF9UQUdHRURfU1RBVFVTCSAweDAwMDAwMjAwCisjZGVmaW5lICBNSVNDX0hPU1RfQ1RSTF9DSElQUkVWCQkgMHhmZmZmMDAwMAorI2RlZmluZSAgTUlTQ19IT1NUX0NUUkxfQ0hJUFJFVl9TSElGVAkgMTYKKyNkZWZpbmUgIEdFVF9DSElQX1JFVl9JRChNSVNDX0hPU1RfQ1RSTCkgXAorCSAoKChNSVNDX0hPU1RfQ1RSTCkgJiBNSVNDX0hPU1RfQ1RSTF9DSElQUkVWKSA+PiBcCisJICBNSVNDX0hPU1RfQ1RSTF9DSElQUkVWX1NISUZUKQorI2RlZmluZSAgQ0hJUFJFVl9JRF81NzAwX0EwCQkgMHg3MDAwCisjZGVmaW5lICBDSElQUkVWX0lEXzU3MDBfQTEJCSAweDcwMDEKKyNkZWZpbmUgIENISVBSRVZfSURfNTcwMF9CMAkJIDB4NzEwMAorI2RlZmluZSAgQ0hJUFJFVl9JRF81NzAwX0IxCQkgMHg3MTAxCisjZGVmaW5lICBDSElQUkVWX0lEXzU3MDBfQjMJCSAweDcxMDIKKyNkZWZpbmUgIENISVBSRVZfSURfNTcwMF9BTFRJTUEJCSAweDcxMDQKKyNkZWZpbmUgIENISVBSRVZfSURfNTcwMF9DMAkJIDB4NzIwMAorI2RlZmluZSAgQ0hJUFJFVl9JRF81NzAxX0EwCQkgMHgwMDAwCisjZGVmaW5lICBDSElQUkVWX0lEXzU3MDFfQjAJCSAweDAxMDAKKyNkZWZpbmUgIENISVBSRVZfSURfNTcwMV9CMgkJIDB4MDEwMgorI2RlZmluZSAgQ0hJUFJFVl9JRF81NzAxX0I1CQkgMHgwMTA1CisjZGVmaW5lICBDSElQUkVWX0lEXzU3MDNfQTAJCSAweDEwMDAKKyNkZWZpbmUgIENISVBSRVZfSURfNTcwM19BMQkJIDB4MTAwMQorI2RlZmluZSAgQ0hJUFJFVl9JRF81NzAzX0EyCQkgMHgxMDAyCisjZGVmaW5lICBDSElQUkVWX0lEXzU3MDNfQTMJCSAweDEwMDMKKyNkZWZpbmUgIENISVBSRVZfSURfNTcwNF9BMAkJIDB4MjAwMAorI2RlZmluZSAgQ0hJUFJFVl9JRF81NzA0X0ExCQkgMHgyMDAxCisjZGVmaW5lICBDSElQUkVWX0lEXzU3MDRfQTIJCSAweDIwMDIKKyNkZWZpbmUgIENISVBSRVZfSURfNTcwNV9BMAkJIDB4MzAwMAorI2RlZmluZSAgQ0hJUFJFVl9JRF81NzA1X0ExCQkgMHgzMDAxCisjZGVmaW5lCSBDSElQUkVWX0lEXzU3MDVfQTIgICAgICAgICAgICAgIDB4MzAwMgorI2RlZmluZSAgQ0hJUFJFVl9JRF81NzA1X0EzICAgICAgICAgICAgICAweDMwMDMKKyNkZWZpbmUgIEdFVF9BU0lDX1JFVihDSElQX1JFVl9JRCkJKChDSElQX1JFVl9JRCkgPj4gMTIpCisjZGVmaW5lICAgQVNJQ19SRVZfNTcwMAkJCSAweDA3CisjZGVmaW5lICAgQVNJQ19SRVZfNTcwMQkJCSAweDAwCisjZGVmaW5lICAgQVNJQ19SRVZfNTcwMwkJCSAweDAxCisjZGVmaW5lICAgQVNJQ19SRVZfNTcwNAkJCSAweDAyCisjZGVmaW5lICAgQVNJQ19SRVZfNTcwNQkJCSAweDAzCisjZGVmaW5lICBHRVRfQ0hJUF9SRVYoQ0hJUF9SRVZfSUQpCSgoQ0hJUF9SRVZfSUQpID4+IDgpCisjZGVmaW5lICAgQ0hJUFJFVl81NzAwX0FYCQkgMHg3MAorI2RlZmluZSAgIENISVBSRVZfNTcwMF9CWAkJIDB4NzEKKyNkZWZpbmUgICBDSElQUkVWXzU3MDBfQ1gJCSAweDcyCisjZGVmaW5lICAgQ0hJUFJFVl81NzAxX0FYCQkgMHgwMAorI2RlZmluZSAgR0VUX01FVEFMX1JFVihDSElQX1JFVl9JRCkJKChDSElQX1JFVl9JRCkgJiAweGZmKQorI2RlZmluZSAgIE1FVEFMX1JFVl9BMAkJCSAweDAwCisjZGVmaW5lICAgTUVUQUxfUkVWX0ExCQkJIDB4MDEKKyNkZWZpbmUgICBNRVRBTF9SRVZfQjAJCQkgMHgwMAorI2RlZmluZSAgIE1FVEFMX1JFVl9CMQkJCSAweDAxCisjZGVmaW5lICAgTUVUQUxfUkVWX0IyCQkJIDB4MDIKKyNkZWZpbmUgVEczUENJX0RNQV9SV19DVFJMCQkweDAwMDAwMDZjCisjZGVmaW5lICBETUFfUldDVFJMX01JTl9ETUEJCSAweDAwMDAwMGZmCisjZGVmaW5lICBETUFfUldDVFJMX01JTl9ETUFfU0hJRlQJIDAKKyNkZWZpbmUgIERNQV9SV0NUUkxfUkVBRF9CTkRSWV9NQVNLCSAweDAwMDAwNzAwCisjZGVmaW5lICBETUFfUldDVFJMX1JFQURfQk5EUllfRElTQUIJIDB4MDAwMDAwMDAKKyNkZWZpbmUgIERNQV9SV0NUUkxfUkVBRF9CTkRSWV8xNgkgMHgwMDAwMDEwMAorI2RlZmluZSAgRE1BX1JXQ1RSTF9SRUFEX0JORFJZXzMyCSAweDAwMDAwMjAwCisjZGVmaW5lICBETUFfUldDVFJMX1JFQURfQk5EUllfNjQJIDB4MDAwMDAzMDAKKyNkZWZpbmUgIERNQV9SV0NUUkxfUkVBRF9CTkRSWV8xMjgJIDB4MDAwMDA0MDAKKyNkZWZpbmUgIERNQV9SV0NUUkxfUkVBRF9CTkRSWV8yNTYJIDB4MDAwMDA1MDAKKyNkZWZpbmUgIERNQV9SV0NUUkxfUkVBRF9CTkRSWV81MTIJIDB4MDAwMDA2MDAKKyNkZWZpbmUgIERNQV9SV0NUUkxfUkVBRF9CTkRSWV8xMDI0CSAweDAwMDAwNzAwCisjZGVmaW5lICBETUFfUldDVFJMX1dSSVRFX0JORFJZX01BU0sJIDB4MDAwMDM4MDAKKyNkZWZpbmUgIERNQV9SV0NUUkxfV1JJVEVfQk5EUllfRElTQUIJIDB4MDAwMDAwMDAKKyNkZWZpbmUgIERNQV9SV0NUUkxfV1JJVEVfQk5EUllfMTYJIDB4MDAwMDA4MDAKKyNkZWZpbmUgIERNQV9SV0NUUkxfV1JJVEVfQk5EUllfMzIJIDB4MDAwMDEwMDAKKyNkZWZpbmUgIERNQV9SV0NUUkxfV1JJVEVfQk5EUllfNjQJIDB4MDAwMDE4MDAKKyNkZWZpbmUgIERNQV9SV0NUUkxfV1JJVEVfQk5EUllfMTI4CSAweDAwMDAyMDAwCisjZGVmaW5lICBETUFfUldDVFJMX1dSSVRFX0JORFJZXzI1NgkgMHgwMDAwMjgwMAorI2RlZmluZSAgRE1BX1JXQ1RSTF9XUklURV9CTkRSWV81MTIJIDB4MDAwMDMwMDAKKyNkZWZpbmUgIERNQV9SV0NUUkxfV1JJVEVfQk5EUllfMTAyNAkgMHgwMDAwMzgwMAorI2RlZmluZSAgRE1BX1JXQ1RSTF9PTkVfRE1BCQkgMHgwMDAwNDAwMAorI2RlZmluZSAgRE1BX1JXQ1RSTF9SRUFEX1dBVEVSCQkgMHgwMDA3MDAwMAorI2RlZmluZSAgRE1BX1JXQ1RSTF9SRUFEX1dBVEVSX1NISUZUCSAxNgorI2RlZmluZSAgRE1BX1JXQ1RSTF9XUklURV9XQVRFUgkJIDB4MDAzODAwMDAKKyNkZWZpbmUgIERNQV9SV0NUUkxfV1JJVEVfV0FURVJfU0hJRlQJIDE5CisjZGVmaW5lICBETUFfUldDVFJMX1VTRV9NRU1fUkVBRF9NVUxUCSAweDAwNDAwMDAwCisjZGVmaW5lICBETUFfUldDVFJMX0FTU0VSVF9BTExfQkUJIDB4MDA4MDAwMDAKKyNkZWZpbmUgIERNQV9SV0NUUkxfUENJX1JFQURfQ01ECSAweDBmMDAwMDAwCisjZGVmaW5lICBETUFfUldDVFJMX1BDSV9SRUFEX0NNRF9TSElGVAkgMjQKKyNkZWZpbmUgIERNQV9SV0NUUkxfUENJX1dSSVRFX0NNRAkgMHhmMDAwMDAwMAorI2RlZmluZSAgRE1BX1JXQ1RSTF9QQ0lfV1JJVEVfQ01EX1NISUZUCSAyOAorI2RlZmluZSBURzNQQ0lfUENJU1RBVEUJCQkweDAwMDAwMDcwCisjZGVmaW5lICBQQ0lTVEFURV9GT1JDRV9SRVNFVAkJIDB4MDAwMDAwMDEKKyNkZWZpbmUgIFBDSVNUQVRFX0lOVF9OT1RfQUNUSVZFCSAweDAwMDAwMDAyCisjZGVmaW5lICBQQ0lTVEFURV9DT05WX1BDSV9NT0RFCQkgMHgwMDAwMDAwNAorI2RlZmluZSAgUENJU1RBVEVfQlVTX1NQRUVEX0hJR0gJIDB4MDAwMDAwMDgKKyNkZWZpbmUgIFBDSVNUQVRFX0JVU18zMkJJVAkJIDB4MDAwMDAwMTAKKyNkZWZpbmUgIFBDSVNUQVRFX1JPTV9FTkFCTEUJCSAweDAwMDAwMDIwCisjZGVmaW5lICBQQ0lTVEFURV9ST01fUkVUUllfRU5BQkxFCSAweDAwMDAwMDQwCisjZGVmaW5lICBQQ0lTVEFURV9GTEFUX1ZJRVcJCSAweDAwMDAwMTAwCisjZGVmaW5lICBQQ0lTVEFURV9SRVRSWV9TQU1FX0RNQQkgMHgwMDAwMjAwMAorI2RlZmluZSBURzNQQ0lfQ0xPQ0tfQ1RSTAkJMHgwMDAwMDA3NAorI2RlZmluZSAgQ0xPQ0tfQ1RSTF9DT1JFQ0xLX0RJU0FCTEUJIDB4MDAwMDAyMDAKKyNkZWZpbmUgIENMT0NLX0NUUkxfUlhDTEtfRElTQUJMRQkgMHgwMDAwMDQwMAorI2RlZmluZSAgQ0xPQ0tfQ1RSTF9UWENMS19ESVNBQkxFCSAweDAwMDAwODAwCisjZGVmaW5lICBDTE9DS19DVFJMX0FMVENMSwkJIDB4MDAwMDEwMDAKKyNkZWZpbmUgIENMT0NLX0NUUkxfUFdSRE9XTl9QTEwxMzMJIDB4MDAwMDgwMDAKKyNkZWZpbmUgIENMT0NLX0NUUkxfNDRNSFpfQ09SRQkJIDB4MDAwNDAwMDAKKyNkZWZpbmUgIENMT0NLX0NUUkxfNjI1X0NPUkUJCSAweDAwMTAwMDAwCisjZGVmaW5lICBDTE9DS19DVFJMX0ZPUkNFX0NMS1JVTgkgMHgwMDIwMDAwMAorI2RlZmluZSAgQ0xPQ0tfQ1RSTF9DTEtSVU5fT0VOQUJMRQkgMHgwMDQwMDAwMAorI2RlZmluZSAgQ0xPQ0tfQ1RSTF9ERUxBWV9QQ0lfR1JBTlQJIDB4ODAwMDAwMDAKKyNkZWZpbmUgVEczUENJX1JFR19CQVNFX0FERFIJCTB4MDAwMDAwNzgKKyNkZWZpbmUgVEczUENJX01FTV9XSU5fQkFTRV9BRERSCTB4MDAwMDAwN2MKKyNkZWZpbmUgVEczUENJX1JFR19EQVRBCQkJMHgwMDAwMDA4MAorI2RlZmluZSBURzNQQ0lfTUVNX1dJTl9EQVRBCQkweDAwMDAwMDg0CisjZGVmaW5lIFRHM1BDSV9NT0RFX0NUUkwJCTB4MDAwMDAwODgKKyNkZWZpbmUgVEczUENJX01JU0NfQ0ZHCQkJMHgwMDAwMDA4YworI2RlZmluZSBURzNQQ0lfTUlTQ19MT0NBTF9DVFJMCQkweDAwMDAwMDkwCisvKiAweDk0IC0tPiAweDk4IHVudXNlZCAqLworI2RlZmluZSBURzNQQ0lfU1REX1JJTkdfUFJPRF9JRFgJMHgwMDAwMDA5OCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgVEczUENJX1JDVl9SRVRfUklOR19DT05fSURYCTB4MDAwMDAwYTAgLyogNjQtYml0ICovCisjZGVmaW5lIFRHM1BDSV9TTkRfUFJPRF9JRFgJCTB4MDAwMDAwYTggLyogNjQtYml0ICovCisvKiAweGIwIC0tPiAweDEwMCB1bnVzZWQgKi8KKworLyogMHgxMDAgLS0+IDB4MjAwIHVudXNlZCAqLworCisvKiBNYWlsYm94IHJlZ2lzdGVycyAqLworI2RlZmluZSBNQUlMQk9YX0lOVEVSUlVQVF8wCQkweDAwMDAwMjAwIC8qIDY0LWJpdCAqLworI2RlZmluZSBNQUlMQk9YX0lOVEVSUlVQVF8xCQkweDAwMDAwMjA4IC8qIDY0LWJpdCAqLworI2RlZmluZSBNQUlMQk9YX0lOVEVSUlVQVF8yCQkweDAwMDAwMjEwIC8qIDY0LWJpdCAqLworI2RlZmluZSBNQUlMQk9YX0lOVEVSUlVQVF8zCQkweDAwMDAwMjE4IC8qIDY0LWJpdCAqLworI2RlZmluZSBNQUlMQk9YX0dFTkVSQUxfMAkJMHgwMDAwMDIyMCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgTUFJTEJPWF9HRU5FUkFMXzEJCTB4MDAwMDAyMjggLyogNjQtYml0ICovCisjZGVmaW5lIE1BSUxCT1hfR0VORVJBTF8yCQkweDAwMDAwMjMwIC8qIDY0LWJpdCAqLworI2RlZmluZSBNQUlMQk9YX0dFTkVSQUxfMwkJMHgwMDAwMDIzOCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgTUFJTEJPWF9HRU5FUkFMXzQJCTB4MDAwMDAyNDAgLyogNjQtYml0ICovCisjZGVmaW5lIE1BSUxCT1hfR0VORVJBTF81CQkweDAwMDAwMjQ4IC8qIDY0LWJpdCAqLworI2RlZmluZSBNQUlMQk9YX0dFTkVSQUxfNgkJMHgwMDAwMDI1MCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgTUFJTEJPWF9HRU5FUkFMXzcJCTB4MDAwMDAyNTggLyogNjQtYml0ICovCisjZGVmaW5lIE1BSUxCT1hfUkVMT0FEX1NUQVQJCTB4MDAwMDAyNjAgLyogNjQtYml0ICovCisjZGVmaW5lIE1BSUxCT1hfUkNWX1NURF9QUk9EX0lEWAkweDAwMDAwMjY4IC8qIDY0LWJpdCAqLworI2RlZmluZSBNQUlMQk9YX1JDVl9KVU1CT19QUk9EX0lEWAkweDAwMDAwMjcwIC8qIDY0LWJpdCAqLworI2RlZmluZSBNQUlMQk9YX1JDVl9NSU5JX1BST0RfSURYCTB4MDAwMDAyNzggLyogNjQtYml0ICovCisjZGVmaW5lIE1BSUxCT1hfUkNWUkVUX0NPTl9JRFhfMAkweDAwMDAwMjgwIC8qIDY0LWJpdCAqLworI2RlZmluZSBNQUlMQk9YX1JDVlJFVF9DT05fSURYXzEJMHgwMDAwMDI4OCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgTUFJTEJPWF9SQ1ZSRVRfQ09OX0lEWF8yCTB4MDAwMDAyOTAgLyogNjQtYml0ICovCisjZGVmaW5lIE1BSUxCT1hfUkNWUkVUX0NPTl9JRFhfMwkweDAwMDAwMjk4IC8qIDY0LWJpdCAqLworI2RlZmluZSBNQUlMQk9YX1JDVlJFVF9DT05fSURYXzQJMHgwMDAwMDJhMCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgTUFJTEJPWF9SQ1ZSRVRfQ09OX0lEWF81CTB4MDAwMDAyYTggLyogNjQtYml0ICovCisjZGVmaW5lIE1BSUxCT1hfUkNWUkVUX0NPTl9JRFhfNgkweDAwMDAwMmIwIC8qIDY0LWJpdCAqLworI2RlZmluZSBNQUlMQk9YX1JDVlJFVF9DT05fSURYXzcJMHgwMDAwMDJiOCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgTUFJTEJPWF9SQ1ZSRVRfQ09OX0lEWF84CTB4MDAwMDAyYzAgLyogNjQtYml0ICovCisjZGVmaW5lIE1BSUxCT1hfUkNWUkVUX0NPTl9JRFhfOQkweDAwMDAwMmM4IC8qIDY0LWJpdCAqLworI2RlZmluZSBNQUlMQk9YX1JDVlJFVF9DT05fSURYXzEwCTB4MDAwMDAyZDAgLyogNjQtYml0ICovCisjZGVmaW5lIE1BSUxCT1hfUkNWUkVUX0NPTl9JRFhfMTEJMHgwMDAwMDJkOCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgTUFJTEJPWF9SQ1ZSRVRfQ09OX0lEWF8xMgkweDAwMDAwMmUwIC8qIDY0LWJpdCAqLworI2RlZmluZSBNQUlMQk9YX1JDVlJFVF9DT05fSURYXzEzCTB4MDAwMDAyZTggLyogNjQtYml0ICovCisjZGVmaW5lIE1BSUxCT1hfUkNWUkVUX0NPTl9JRFhfMTQJMHgwMDAwMDJmMCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgTUFJTEJPWF9SQ1ZSRVRfQ09OX0lEWF8xNQkweDAwMDAwMmY4IC8qIDY0LWJpdCAqLworI2RlZmluZSBNQUlMQk9YX1NOREhPU1RfUFJPRF9JRFhfMAkweDAwMDAwMzAwIC8qIDY0LWJpdCAqLworI2RlZmluZSBNQUlMQk9YX1NOREhPU1RfUFJPRF9JRFhfMQkweDAwMDAwMzA4IC8qIDY0LWJpdCAqLworI2RlZmluZSBNQUlMQk9YX1NOREhPU1RfUFJPRF9JRFhfMgkweDAwMDAwMzEwIC8qIDY0LWJpdCAqLworI2RlZmluZSBNQUlMQk9YX1NOREhPU1RfUFJPRF9JRFhfMwkweDAwMDAwMzE4IC8qIDY0LWJpdCAqLworI2RlZmluZSBNQUlMQk9YX1NOREhPU1RfUFJPRF9JRFhfNAkweDAwMDAwMzIwIC8qIDY0LWJpdCAqLworI2RlZmluZSBNQUlMQk9YX1NOREhPU1RfUFJPRF9JRFhfNQkweDAwMDAwMzI4IC8qIDY0LWJpdCAqLworI2RlZmluZSBNQUlMQk9YX1NOREhPU1RfUFJPRF9JRFhfNgkweDAwMDAwMzMwIC8qIDY0LWJpdCAqLworI2RlZmluZSBNQUlMQk9YX1NOREhPU1RfUFJPRF9JRFhfNwkweDAwMDAwMzM4IC8qIDY0LWJpdCAqLworI2RlZmluZSBNQUlMQk9YX1NOREhPU1RfUFJPRF9JRFhfOAkweDAwMDAwMzQwIC8qIDY0LWJpdCAqLworI2RlZmluZSBNQUlMQk9YX1NOREhPU1RfUFJPRF9JRFhfOQkweDAwMDAwMzQ4IC8qIDY0LWJpdCAqLworI2RlZmluZSBNQUlMQk9YX1NOREhPU1RfUFJPRF9JRFhfMTAJMHgwMDAwMDM1MCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgTUFJTEJPWF9TTkRIT1NUX1BST0RfSURYXzExCTB4MDAwMDAzNTggLyogNjQtYml0ICovCisjZGVmaW5lIE1BSUxCT1hfU05ESE9TVF9QUk9EX0lEWF8xMgkweDAwMDAwMzYwIC8qIDY0LWJpdCAqLworI2RlZmluZSBNQUlMQk9YX1NOREhPU1RfUFJPRF9JRFhfMTMJMHgwMDAwMDM2OCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgTUFJTEJPWF9TTkRIT1NUX1BST0RfSURYXzE0CTB4MDAwMDAzNzAgLyogNjQtYml0ICovCisjZGVmaW5lIE1BSUxCT1hfU05ESE9TVF9QUk9EX0lEWF8xNQkweDAwMDAwMzc4IC8qIDY0LWJpdCAqLworI2RlZmluZSBNQUlMQk9YX1NORE5JQ19QUk9EX0lEWF8wCTB4MDAwMDAzODAgLyogNjQtYml0ICovCisjZGVmaW5lIE1BSUxCT1hfU05ETklDX1BST0RfSURYXzEJMHgwMDAwMDM4OCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgTUFJTEJPWF9TTkROSUNfUFJPRF9JRFhfMgkweDAwMDAwMzkwIC8qIDY0LWJpdCAqLworI2RlZmluZSBNQUlMQk9YX1NORE5JQ19QUk9EX0lEWF8zCTB4MDAwMDAzOTggLyogNjQtYml0ICovCisjZGVmaW5lIE1BSUxCT1hfU05ETklDX1BST0RfSURYXzQJMHgwMDAwMDNhMCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgTUFJTEJPWF9TTkROSUNfUFJPRF9JRFhfNQkweDAwMDAwM2E4IC8qIDY0LWJpdCAqLworI2RlZmluZSBNQUlMQk9YX1NORE5JQ19QUk9EX0lEWF82CTB4MDAwMDAzYjAgLyogNjQtYml0ICovCisjZGVmaW5lIE1BSUxCT1hfU05ETklDX1BST0RfSURYXzcJMHgwMDAwMDNiOCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgTUFJTEJPWF9TTkROSUNfUFJPRF9JRFhfOAkweDAwMDAwM2MwIC8qIDY0LWJpdCAqLworI2RlZmluZSBNQUlMQk9YX1NORE5JQ19QUk9EX0lEWF85CTB4MDAwMDAzYzggLyogNjQtYml0ICovCisjZGVmaW5lIE1BSUxCT1hfU05ETklDX1BST0RfSURYXzEwCTB4MDAwMDAzZDAgLyogNjQtYml0ICovCisjZGVmaW5lIE1BSUxCT1hfU05ETklDX1BST0RfSURYXzExCTB4MDAwMDAzZDggLyogNjQtYml0ICovCisjZGVmaW5lIE1BSUxCT1hfU05ETklDX1BST0RfSURYXzEyCTB4MDAwMDAzZTAgLyogNjQtYml0ICovCisjZGVmaW5lIE1BSUxCT1hfU05ETklDX1BST0RfSURYXzEzCTB4MDAwMDAzZTggLyogNjQtYml0ICovCisjZGVmaW5lIE1BSUxCT1hfU05ETklDX1BST0RfSURYXzE0CTB4MDAwMDAzZjAgLyogNjQtYml0ICovCisjZGVmaW5lIE1BSUxCT1hfU05ETklDX1BST0RfSURYXzE1CTB4MDAwMDAzZjggLyogNjQtYml0ICovCisKKy8qIE1BQyBjb250cm9sIHJlZ2lzdGVycyAqLworI2RlZmluZSBNQUNfTU9ERQkJCTB4MDAwMDA0MDAKKyNkZWZpbmUgIE1BQ19NT0RFX1JFU0VUCQkJIDB4MDAwMDAwMDEKKyNkZWZpbmUgIE1BQ19NT0RFX0hBTEZfRFVQTEVYCQkgMHgwMDAwMDAwMgorI2RlZmluZSAgTUFDX01PREVfUE9SVF9NT0RFX01BU0sJIDB4MDAwMDAwMGMKKyNkZWZpbmUgIE1BQ19NT0RFX1BPUlRfTU9ERV9UQkkJCSAweDAwMDAwMDBjCisjZGVmaW5lICBNQUNfTU9ERV9QT1JUX01PREVfR01JSQkgMHgwMDAwMDAwOAorI2RlZmluZSAgTUFDX01PREVfUE9SVF9NT0RFX01JSQkJIDB4MDAwMDAwMDQKKyNkZWZpbmUgIE1BQ19NT0RFX1BPUlRfTU9ERV9OT05FCSAweDAwMDAwMDAwCisjZGVmaW5lICBNQUNfTU9ERV9QT1JUX0lOVF9MUEJBQ0sJIDB4MDAwMDAwMTAKKyNkZWZpbmUgIE1BQ19NT0RFX1RBR0dFRF9NQUNfQ1RSTAkgMHgwMDAwMDA4MAorI2RlZmluZSAgTUFDX01PREVfVFhfQlVSU1RJTkcJCSAweDAwMDAwMTAwCisjZGVmaW5lICBNQUNfTU9ERV9NQVhfREVGRVIJCSAweDAwMDAwMjAwCisjZGVmaW5lICBNQUNfTU9ERV9MSU5LX1BPTEFSSVRZCQkgMHgwMDAwMDQwMAorI2RlZmluZSAgTUFDX01PREVfUlhTVEFUX0VOQUJMRQkJIDB4MDAwMDA4MDAKKyNkZWZpbmUgIE1BQ19NT0RFX1JYU1RBVF9DTEVBUgkJIDB4MDAwMDEwMDAKKyNkZWZpbmUgIE1BQ19NT0RFX1JYU1RBVF9GTFVTSAkJIDB4MDAwMDIwMDAKKyNkZWZpbmUgIE1BQ19NT0RFX1RYU1RBVF9FTkFCTEUJCSAweDAwMDA0MDAwCisjZGVmaW5lICBNQUNfTU9ERV9UWFNUQVRfQ0xFQVIJCSAweDAwMDA4MDAwCisjZGVmaW5lICBNQUNfTU9ERV9UWFNUQVRfRkxVU0gJCSAweDAwMDEwMDAwCisjZGVmaW5lICBNQUNfTU9ERV9TRU5EX0NPTkZJR1MJCSAweDAwMDIwMDAwCisjZGVmaW5lICBNQUNfTU9ERV9NQUdJQ19QS1RfRU5BQkxFCSAweDAwMDQwMDAwCisjZGVmaW5lICBNQUNfTU9ERV9BQ1BJX0VOQUJMRQkJIDB4MDAwODAwMDAKKyNkZWZpbmUgIE1BQ19NT0RFX01JUF9FTkFCTEUJCSAweDAwMTAwMDAwCisjZGVmaW5lICBNQUNfTU9ERV9UREVfRU5BQkxFCQkgMHgwMDIwMDAwMAorI2RlZmluZSAgTUFDX01PREVfUkRFX0VOQUJMRQkJIDB4MDA0MDAwMDAKKyNkZWZpbmUgIE1BQ19NT0RFX0ZIREVfRU5BQkxFCQkgMHgwMDgwMDAwMAorI2RlZmluZSBNQUNfU1RBVFVTCQkJMHgwMDAwMDQwNAorI2RlZmluZSAgTUFDX1NUQVRVU19QQ1NfU1lOQ0VECQkgMHgwMDAwMDAwMQorI2RlZmluZSAgTUFDX1NUQVRVU19TSUdOQUxfREVUCQkgMHgwMDAwMDAwMgorI2RlZmluZSAgTUFDX1NUQVRVU19SQ1ZEX0NGRwkJIDB4MDAwMDAwMDQKKyNkZWZpbmUgIE1BQ19TVEFUVVNfQ0ZHX0NIQU5HRUQJCSAweDAwMDAwMDA4CisjZGVmaW5lICBNQUNfU1RBVFVTX1NZTkNfQ0hBTkdFRAkgMHgwMDAwMDAxMAorI2RlZmluZSAgTUFDX1NUQVRVU19QT1JUX0RFQ19FUlIJIDB4MDAwMDA0MDAKKyNkZWZpbmUgIE1BQ19TVEFUVVNfTE5LU1RBVEVfQ0hBTkdFRAkgMHgwMDAwMTAwMAorI2RlZmluZSAgTUFDX1NUQVRVU19NSV9DT01QTEVUSU9OCSAweDAwNDAwMDAwCisjZGVmaW5lICBNQUNfU1RBVFVTX01JX0lOVEVSUlVQVAkgMHgwMDgwMDAwMAorI2RlZmluZSAgTUFDX1NUQVRVU19BUF9FUlJPUgkJIDB4MDEwMDAwMDAKKyNkZWZpbmUgIE1BQ19TVEFUVVNfT0RJX0VSUk9SCQkgMHgwMjAwMDAwMAorI2RlZmluZSAgTUFDX1NUQVRVU19SWFNUQVRfT1ZFUlJVTgkgMHgwNDAwMDAwMAorI2RlZmluZSAgTUFDX1NUQVRVU19UWFNUQVRfT1ZFUlJVTgkgMHgwODAwMDAwMAorI2RlZmluZSBNQUNfRVZFTlQJCQkweDAwMDAwNDA4CisjZGVmaW5lICBNQUNfRVZFTlRfUE9SVF9ERUNPREVfRVJSCSAweDAwMDAwNDAwCisjZGVmaW5lICBNQUNfRVZFTlRfTE5LU1RBVEVfQ0hBTkdFRAkgMHgwMDAwMTAwMAorI2RlZmluZSAgTUFDX0VWRU5UX01JX0NPTVBMRVRJT04JIDB4MDA0MDAwMDAKKyNkZWZpbmUgIE1BQ19FVkVOVF9NSV9JTlRFUlJVUFQJCSAweDAwODAwMDAwCisjZGVmaW5lICBNQUNfRVZFTlRfQVBfRVJST1IJCSAweDAxMDAwMDAwCisjZGVmaW5lICBNQUNfRVZFTlRfT0RJX0VSUk9SCQkgMHgwMjAwMDAwMAorI2RlZmluZSAgTUFDX0VWRU5UX1JYU1RBVF9PVkVSUlVOCSAweDA0MDAwMDAwCisjZGVmaW5lICBNQUNfRVZFTlRfVFhTVEFUX09WRVJSVU4JIDB4MDgwMDAwMDAKKyNkZWZpbmUgTUFDX0xFRF9DVFJMCQkJMHgwMDAwMDQwYworI2RlZmluZSAgTEVEX0NUUkxfTE5LTEVEX09WRVJSSURFCSAweDAwMDAwMDAxCisjZGVmaW5lICBMRURfQ1RSTF8xMDAwTUJQU19PTgkJIDB4MDAwMDAwMDIKKyNkZWZpbmUgIExFRF9DVFJMXzEwME1CUFNfT04JCSAweDAwMDAwMDA0CisjZGVmaW5lICBMRURfQ1RSTF8xME1CUFNfT04JCSAweDAwMDAwMDA4CisjZGVmaW5lICBMRURfQ1RSTF9UUkFGRklDX09WRVJSSURFCSAweDAwMDAwMDEwCisjZGVmaW5lICBMRURfQ1RSTF9UUkFGRklDX0JMSU5LCQkgMHgwMDAwMDAyMAorI2RlZmluZSAgTEVEX0NUUkxfVFJBRkZJQ19MRUQJCSAweDAwMDAwMDQwCisjZGVmaW5lICBMRURfQ1RSTF8xMDAwTUJQU19TVEFUVVMJIDB4MDAwMDAwODAKKyNkZWZpbmUgIExFRF9DVFJMXzEwME1CUFNfU1RBVFVTCSAweDAwMDAwMTAwCisjZGVmaW5lICBMRURfQ1RSTF8xME1CUFNfU1RBVFVTCQkgMHgwMDAwMDIwMAorI2RlZmluZSAgTEVEX0NUUkxfVFJBRkZJQ19TVEFUVVMJIDB4MDAwMDA0MDAKKyNkZWZpbmUgIExFRF9DVFJMX01BQ19NT0RFCQkgMHgwMDAwMDAwMAorI2RlZmluZSAgTEVEX0NUUkxfUEhZX01PREVfMQkJIDB4MDAwMDA4MDAKKyNkZWZpbmUgIExFRF9DVFJMX1BIWV9NT0RFXzIJCSAweDAwMDAxMDAwCisjZGVmaW5lICBMRURfQ1RSTF9CTElOS19SQVRFX01BU0sJIDB4N2ZmODAwMDAKKyNkZWZpbmUgIExFRF9DVFJMX0JMSU5LX1JBVEVfU0hJRlQJIDE5CisjZGVmaW5lICBMRURfQ1RSTF9CTElOS19QRVJfT1ZFUlJJREUJIDB4MDAwODAwMDAKKyNkZWZpbmUgIExFRF9DVFJMX0JMSU5LX1JBVEVfT1ZFUlJJREUJIDB4ODAwMDAwMDAKKyNkZWZpbmUgTUFDX0FERFJfMF9ISUdICQkJMHgwMDAwMDQxMCAvKiB1cHBlciAyIGJ5dGVzICovCisjZGVmaW5lIE1BQ19BRERSXzBfTE9XCQkJMHgwMDAwMDQxNCAvKiBsb3dlciA0IGJ5dGVzICovCisjZGVmaW5lIE1BQ19BRERSXzFfSElHSAkJCTB4MDAwMDA0MTggLyogdXBwZXIgMiBieXRlcyAqLworI2RlZmluZSBNQUNfQUREUl8xX0xPVwkJCTB4MDAwMDA0MWMgLyogbG93ZXIgNCBieXRlcyAqLworI2RlZmluZSBNQUNfQUREUl8yX0hJR0gJCQkweDAwMDAwNDIwIC8qIHVwcGVyIDIgYnl0ZXMgKi8KKyNkZWZpbmUgTUFDX0FERFJfMl9MT1cJCQkweDAwMDAwNDI0IC8qIGxvd2VyIDQgYnl0ZXMgKi8KKyNkZWZpbmUgTUFDX0FERFJfM19ISUdICQkJMHgwMDAwMDQyOCAvKiB1cHBlciAyIGJ5dGVzICovCisjZGVmaW5lIE1BQ19BRERSXzNfTE9XCQkJMHgwMDAwMDQyYyAvKiBsb3dlciA0IGJ5dGVzICovCisjZGVmaW5lIE1BQ19BQ1BJX01CVUZfUFRSCQkweDAwMDAwNDMwCisjZGVmaW5lIE1BQ19BQ1BJX0xFTl9PRkZTRVQJCTB4MDAwMDA0MzQKKyNkZWZpbmUgIEFDUElfTEVOT0ZGX0xFTl9NQVNLCQkgMHgwMDAwZmZmZgorI2RlZmluZSAgQUNQSV9MRU5PRkZfTEVOX1NISUZUCQkgMAorI2RlZmluZSAgQUNQSV9MRU5PRkZfT0ZGX01BU0sJCSAweDBmZmYwMDAwCisjZGVmaW5lICBBQ1BJX0xFTk9GRl9PRkZfU0hJRlQJCSAxNgorI2RlZmluZSBNQUNfVFhfQkFDS09GRl9TRUVECQkweDAwMDAwNDM4CisjZGVmaW5lICBUWF9CQUNLT0ZGX1NFRURfTUFTSwkJIDB4MDAwMDAzZmYKKyNkZWZpbmUgTUFDX1JYX01UVV9TSVpFCQkJMHgwMDAwMDQzYworI2RlZmluZSAgUlhfTVRVX1NJWkVfTUFTSwkJIDB4MDAwMGZmZmYKKyNkZWZpbmUgTUFDX1BDU19URVNUCQkJMHgwMDAwMDQ0MAorI2RlZmluZSAgUENTX1RFU1RfUEFUVEVSTl9NQVNLCQkgMHgwMDBmZmZmZgorI2RlZmluZSAgUENTX1RFU1RfUEFUVEVSTl9TSElGVAkJIDAKKyNkZWZpbmUgIFBDU19URVNUX0VOQUJMRQkJIDB4MDAxMDAwMDAKKyNkZWZpbmUgTUFDX1RYX0FVVE9fTkVHCQkJMHgwMDAwMDQ0NAorI2RlZmluZSAgVFhfQVVUT19ORUdfTUFTSwkJIDB4MDAwMGZmZmYKKyNkZWZpbmUgIFRYX0FVVE9fTkVHX1NISUZUCQkgMAorI2RlZmluZSBNQUNfUlhfQVVUT19ORUcJCQkweDAwMDAwNDQ4CisjZGVmaW5lICBSWF9BVVRPX05FR19NQVNLCQkgMHgwMDAwZmZmZgorI2RlZmluZSAgUlhfQVVUT19ORUdfU0hJRlQJCSAwCisjZGVmaW5lIE1BQ19NSV9DT00JCQkweDAwMDAwNDRjCisjZGVmaW5lICBNSV9DT01fQ01EX01BU0sJCSAweDBjMDAwMDAwCisjZGVmaW5lICBNSV9DT01fQ01EX1dSSVRFCQkgMHgwNDAwMDAwMAorI2RlZmluZSAgTUlfQ09NX0NNRF9SRUFECQkgMHgwODAwMDAwMAorI2RlZmluZSAgTUlfQ09NX1JFQURfRkFJTEVECQkgMHgxMDAwMDAwMAorI2RlZmluZSAgTUlfQ09NX1NUQVJUCQkJIDB4MjAwMDAwMDAKKyNkZWZpbmUgIE1JX0NPTV9CVVNZCQkJIDB4MjAwMDAwMDAKKyNkZWZpbmUgIE1JX0NPTV9QSFlfQUREUl9NQVNLCQkgMHgwM2UwMDAwMAorI2RlZmluZSAgTUlfQ09NX1BIWV9BRERSX1NISUZUCQkgMjEKKyNkZWZpbmUgIE1JX0NPTV9SRUdfQUREUl9NQVNLCQkgMHgwMDFmMDAwMAorI2RlZmluZSAgTUlfQ09NX1JFR19BRERSX1NISUZUCQkgMTYKKyNkZWZpbmUgIE1JX0NPTV9EQVRBX01BU0sJCSAweDAwMDBmZmZmCisjZGVmaW5lIE1BQ19NSV9TVEFUCQkJMHgwMDAwMDQ1MAorI2RlZmluZSAgTUFDX01JX1NUQVRfTE5LU1RBVF9BVFROX0VOQUIJIDB4MDAwMDAwMDEKKyNkZWZpbmUgTUFDX01JX01PREUJCQkweDAwMDAwNDU0CisjZGVmaW5lICBNQUNfTUlfTU9ERV9DTEtfMTBNSFoJCSAweDAwMDAwMDAxCisjZGVmaW5lICBNQUNfTUlfTU9ERV9TSE9SVF9QUkVBTUJMRQkgMHgwMDAwMDAwMgorI2RlZmluZSAgTUFDX01JX01PREVfQVVUT19QT0xMCQkgMHgwMDAwMDAxMAorI2RlZmluZSAgTUFDX01JX01PREVfQ09SRV9DTEtfNjJNSFoJIDB4MDAwMDgwMDAKKyNkZWZpbmUgIE1BQ19NSV9NT0RFX0JBU0UJCSAweDAwMGMwMDAwIC8qIFhYWCBtYWdpYyB2YWx1ZXMgWFhYICovCisjZGVmaW5lIE1BQ19BVVRPX1BPTExfU1RBVFVTCQkweDAwMDAwNDU4CisjZGVmaW5lICBNQUNfQVVUT19QT0xMX0VSUk9SCQkgMHgwMDAwMDAwMQorI2RlZmluZSBNQUNfVFhfTU9ERQkJCTB4MDAwMDA0NWMKKyNkZWZpbmUgIFRYX01PREVfUkVTRVQJCQkgMHgwMDAwMDAwMQorI2RlZmluZSAgVFhfTU9ERV9FTkFCTEUJCQkgMHgwMDAwMDAwMgorI2RlZmluZSAgVFhfTU9ERV9GTE9XX0NUUkxfRU5BQkxFCSAweDAwMDAwMDEwCisjZGVmaW5lICBUWF9NT0RFX0JJR19CQ0tPRkZfRU5BQkxFCSAweDAwMDAwMDIwCisjZGVmaW5lICBUWF9NT0RFX0xPTkdfUEFVU0VfRU5BQkxFCSAweDAwMDAwMDQwCisjZGVmaW5lIE1BQ19UWF9TVEFUVVMJCQkweDAwMDAwNDYwCisjZGVmaW5lICBUWF9TVEFUVVNfWE9GRkVECQkgMHgwMDAwMDAwMQorI2RlZmluZSAgVFhfU1RBVFVTX1NFTlRfWE9GRgkJIDB4MDAwMDAwMDIKKyNkZWZpbmUgIFRYX1NUQVRVU19TRU5UX1hPTgkJIDB4MDAwMDAwMDQKKyNkZWZpbmUgIFRYX1NUQVRVU19MSU5LX1VQCQkgMHgwMDAwMDAwOAorI2RlZmluZSAgVFhfU1RBVFVTX09ESV9VTkRFUlJVTgkJIDB4MDAwMDAwMTAKKyNkZWZpbmUgIFRYX1NUQVRVU19PRElfT1ZFUlJVTgkJIDB4MDAwMDAwMjAKKyNkZWZpbmUgTUFDX1RYX0xFTkdUSFMJCQkweDAwMDAwNDY0CisjZGVmaW5lICBUWF9MRU5HVEhTX1NMT1RfVElNRV9NQVNLCSAweDAwMDAwMGZmCisjZGVmaW5lICBUWF9MRU5HVEhTX1NMT1RfVElNRV9TSElGVAkgMAorI2RlZmluZSAgVFhfTEVOR1RIU19JUEdfTUFTSwkJIDB4MDAwMDBmMDAKKyNkZWZpbmUgIFRYX0xFTkdUSFNfSVBHX1NISUZUCQkgOAorI2RlZmluZSAgVFhfTEVOR1RIU19JUEdfQ1JTX01BU0sJIDB4MDAwMDMwMDAKKyNkZWZpbmUgIFRYX0xFTkdUSFNfSVBHX0NSU19TSElGVAkgMTIKKyNkZWZpbmUgTUFDX1JYX01PREUJCQkweDAwMDAwNDY4CisjZGVmaW5lICBSWF9NT0RFX1JFU0VUCQkJIDB4MDAwMDAwMDEKKyNkZWZpbmUgIFJYX01PREVfRU5BQkxFCQkJIDB4MDAwMDAwMDIKKyNkZWZpbmUgIFJYX01PREVfRkxPV19DVFJMX0VOQUJMRQkgMHgwMDAwMDAwNAorI2RlZmluZSAgUlhfTU9ERV9LRUVQX01BQ19DVFJMCQkgMHgwMDAwMDAwOAorI2RlZmluZSAgUlhfTU9ERV9LRUVQX1BBVVNFCQkgMHgwMDAwMDAxMAorI2RlZmluZSAgUlhfTU9ERV9BQ0NFUFRfT1ZFUlNJWkVECSAweDAwMDAwMDIwCisjZGVmaW5lICBSWF9NT0RFX0FDQ0VQVF9SVU5UUwkJIDB4MDAwMDAwNDAKKyNkZWZpbmUgIFJYX01PREVfTEVOX0NIRUNLCQkgMHgwMDAwMDA4MAorI2RlZmluZSAgUlhfTU9ERV9QUk9NSVNDCQkgMHgwMDAwMDEwMAorI2RlZmluZSAgUlhfTU9ERV9OT19DUkNfQ0hFQ0sJCSAweDAwMDAwMjAwCisjZGVmaW5lICBSWF9NT0RFX0tFRVBfVkxBTl9UQUcJCSAweDAwMDAwNDAwCisjZGVmaW5lIE1BQ19SWF9TVEFUVVMJCQkweDAwMDAwNDZjCisjZGVmaW5lICBSWF9TVEFUVVNfUkVNT1RFX1RYX1hPRkZFRAkgMHgwMDAwMDAwMQorI2RlZmluZSAgUlhfU1RBVFVTX1hPRkZfUkNWRAkJIDB4MDAwMDAwMDIKKyNkZWZpbmUgIFJYX1NUQVRVU19YT05fUkNWRAkJIDB4MDAwMDAwMDQKKyNkZWZpbmUgTUFDX0hBU0hfUkVHXzAJCQkweDAwMDAwNDcwCisjZGVmaW5lIE1BQ19IQVNIX1JFR18xCQkJMHgwMDAwMDQ3NAorI2RlZmluZSBNQUNfSEFTSF9SRUdfMgkJCTB4MDAwMDA0NzgKKyNkZWZpbmUgTUFDX0hBU0hfUkVHXzMJCQkweDAwMDAwNDdjCisjZGVmaW5lIE1BQ19SQ1ZfUlVMRV8wCQkJMHgwMDAwMDQ4MAorI2RlZmluZSBNQUNfUkNWX1ZBTFVFXzAJCQkweDAwMDAwNDg0CisjZGVmaW5lIE1BQ19SQ1ZfUlVMRV8xCQkJMHgwMDAwMDQ4OAorI2RlZmluZSBNQUNfUkNWX1ZBTFVFXzEJCQkweDAwMDAwNDhjCisjZGVmaW5lIE1BQ19SQ1ZfUlVMRV8yCQkJMHgwMDAwMDQ5MAorI2RlZmluZSBNQUNfUkNWX1ZBTFVFXzIJCQkweDAwMDAwNDk0CisjZGVmaW5lIE1BQ19SQ1ZfUlVMRV8zCQkJMHgwMDAwMDQ5OAorI2RlZmluZSBNQUNfUkNWX1ZBTFVFXzMJCQkweDAwMDAwNDljCisjZGVmaW5lIE1BQ19SQ1ZfUlVMRV80CQkJMHgwMDAwMDRhMAorI2RlZmluZSBNQUNfUkNWX1ZBTFVFXzQJCQkweDAwMDAwNGE0CisjZGVmaW5lIE1BQ19SQ1ZfUlVMRV81CQkJMHgwMDAwMDRhOAorI2RlZmluZSBNQUNfUkNWX1ZBTFVFXzUJCQkweDAwMDAwNGFjCisjZGVmaW5lIE1BQ19SQ1ZfUlVMRV82CQkJMHgwMDAwMDRiMAorI2RlZmluZSBNQUNfUkNWX1ZBTFVFXzYJCQkweDAwMDAwNGI0CisjZGVmaW5lIE1BQ19SQ1ZfUlVMRV83CQkJMHgwMDAwMDRiOAorI2RlZmluZSBNQUNfUkNWX1ZBTFVFXzcJCQkweDAwMDAwNGJjCisjZGVmaW5lIE1BQ19SQ1ZfUlVMRV84CQkJMHgwMDAwMDRjMAorI2RlZmluZSBNQUNfUkNWX1ZBTFVFXzgJCQkweDAwMDAwNGM0CisjZGVmaW5lIE1BQ19SQ1ZfUlVMRV85CQkJMHgwMDAwMDRjOAorI2RlZmluZSBNQUNfUkNWX1ZBTFVFXzkJCQkweDAwMDAwNGNjCisjZGVmaW5lIE1BQ19SQ1ZfUlVMRV8xMAkJCTB4MDAwMDA0ZDAKKyNkZWZpbmUgTUFDX1JDVl9WQUxVRV8xMAkJMHgwMDAwMDRkNAorI2RlZmluZSBNQUNfUkNWX1JVTEVfMTEJCQkweDAwMDAwNGQ4CisjZGVmaW5lIE1BQ19SQ1ZfVkFMVUVfMTEJCTB4MDAwMDA0ZGMKKyNkZWZpbmUgTUFDX1JDVl9SVUxFXzEyCQkJMHgwMDAwMDRlMAorI2RlZmluZSBNQUNfUkNWX1ZBTFVFXzEyCQkweDAwMDAwNGU0CisjZGVmaW5lIE1BQ19SQ1ZfUlVMRV8xMwkJCTB4MDAwMDA0ZTgKKyNkZWZpbmUgTUFDX1JDVl9WQUxVRV8xMwkJMHgwMDAwMDRlYworI2RlZmluZSBNQUNfUkNWX1JVTEVfMTQJCQkweDAwMDAwNGYwCisjZGVmaW5lIE1BQ19SQ1ZfVkFMVUVfMTQJCTB4MDAwMDA0ZjQKKyNkZWZpbmUgTUFDX1JDVl9SVUxFXzE1CQkJMHgwMDAwMDRmOAorI2RlZmluZSBNQUNfUkNWX1ZBTFVFXzE1CQkweDAwMDAwNGZjCisjZGVmaW5lICBSQ1ZfUlVMRV9ESVNBQkxFX01BU0sJCSAweDdmZmZmZmZmCisjZGVmaW5lIE1BQ19SQ1ZfUlVMRV9DRkcJCTB4MDAwMDA1MDAKKyNkZWZpbmUgIFJDVl9SVUxFX0NGR19ERUZBVUxUX0NMQVNTCTB4MDAwMDAwMDgKKyNkZWZpbmUgTUFDX0xPV19XTUFSS19NQVhfUlhfRlJBTUUJMHgwMDAwMDUwNAorLyogMHg1MDggLS0+IDB4NTIwIHVudXNlZCAqLworI2RlZmluZSBNQUNfSEFTSFJFR1VfMAkJCTB4MDAwMDA1MjAKKyNkZWZpbmUgTUFDX0hBU0hSRUdVXzEJCQkweDAwMDAwNTI0CisjZGVmaW5lIE1BQ19IQVNIUkVHVV8yCQkJMHgwMDAwMDUyOAorI2RlZmluZSBNQUNfSEFTSFJFR1VfMwkJCTB4MDAwMDA1MmMKKyNkZWZpbmUgTUFDX0VYVEFERFJfMF9ISUdICQkweDAwMDAwNTMwCisjZGVmaW5lIE1BQ19FWFRBRERSXzBfTE9XCQkweDAwMDAwNTM0CisjZGVmaW5lIE1BQ19FWFRBRERSXzFfSElHSAkJMHgwMDAwMDUzOAorI2RlZmluZSBNQUNfRVhUQUREUl8xX0xPVwkJMHgwMDAwMDUzYworI2RlZmluZSBNQUNfRVhUQUREUl8yX0hJR0gJCTB4MDAwMDA1NDAKKyNkZWZpbmUgTUFDX0VYVEFERFJfMl9MT1cJCTB4MDAwMDA1NDQKKyNkZWZpbmUgTUFDX0VYVEFERFJfM19ISUdICQkweDAwMDAwNTQ4CisjZGVmaW5lIE1BQ19FWFRBRERSXzNfTE9XCQkweDAwMDAwNTRjCisjZGVmaW5lIE1BQ19FWFRBRERSXzRfSElHSAkJMHgwMDAwMDU1MAorI2RlZmluZSBNQUNfRVhUQUREUl80X0xPVwkJMHgwMDAwMDU1NAorI2RlZmluZSBNQUNfRVhUQUREUl81X0hJR0gJCTB4MDAwMDA1NTgKKyNkZWZpbmUgTUFDX0VYVEFERFJfNV9MT1cJCTB4MDAwMDA1NWMKKyNkZWZpbmUgTUFDX0VYVEFERFJfNl9ISUdICQkweDAwMDAwNTYwCisjZGVmaW5lIE1BQ19FWFRBRERSXzZfTE9XCQkweDAwMDAwNTY0CisjZGVmaW5lIE1BQ19FWFRBRERSXzdfSElHSAkJMHgwMDAwMDU2OAorI2RlZmluZSBNQUNfRVhUQUREUl83X0xPVwkJMHgwMDAwMDU2YworI2RlZmluZSBNQUNfRVhUQUREUl84X0hJR0gJCTB4MDAwMDA1NzAKKyNkZWZpbmUgTUFDX0VYVEFERFJfOF9MT1cJCTB4MDAwMDA1NzQKKyNkZWZpbmUgTUFDX0VYVEFERFJfOV9ISUdICQkweDAwMDAwNTc4CisjZGVmaW5lIE1BQ19FWFRBRERSXzlfTE9XCQkweDAwMDAwNTdjCisjZGVmaW5lIE1BQ19FWFRBRERSXzEwX0hJR0gJCTB4MDAwMDA1ODAKKyNkZWZpbmUgTUFDX0VYVEFERFJfMTBfTE9XCQkweDAwMDAwNTg0CisjZGVmaW5lIE1BQ19FWFRBRERSXzExX0hJR0gJCTB4MDAwMDA1ODgKKyNkZWZpbmUgTUFDX0VYVEFERFJfMTFfTE9XCQkweDAwMDAwNThjCisjZGVmaW5lIE1BQ19TRVJERVNfQ0ZHCQkJMHgwMDAwMDU5MAorI2RlZmluZSBNQUNfU0VSREVTX1NUQVQJCQkweDAwMDAwNTk0CisvKiAweDU5OCAtLT4gMHg2MDAgdW51c2VkICovCisjZGVmaW5lIE1BQ19UWF9NQUNfU1RBVEVfQkFTRQkJMHgwMDAwMDYwMCAvKiAxNiBieXRlcyAqLworI2RlZmluZSBNQUNfUlhfTUFDX1NUQVRFX0JBU0UJCTB4MDAwMDA2MTAgLyogMjAgYnl0ZXMgKi8KKy8qIDB4NjI0IC0tPiAweDgwMCB1bnVzZWQgKi8KKyNkZWZpbmUgTUFDX1RYX1NUQVRTX09DVEVUUwkJMHgwMDAwMDgwMAorI2RlZmluZSBNQUNfVFhfU1RBVFNfUkVTVjEJCTB4MDAwMDA4MDQKKyNkZWZpbmUgTUFDX1RYX1NUQVRTX0NPTExJU0lPTlMJCTB4MDAwMDA4MDgKKyNkZWZpbmUgTUFDX1RYX1NUQVRTX1hPTl9TRU5UCQkweDAwMDAwODBjCisjZGVmaW5lIE1BQ19UWF9TVEFUU19YT0ZGX1NFTlQJCTB4MDAwMDA4MTAKKyNkZWZpbmUgTUFDX1RYX1NUQVRTX1JFU1YyCQkweDAwMDAwODE0CisjZGVmaW5lIE1BQ19UWF9TVEFUU19NQUNfRVJST1JTCQkweDAwMDAwODE4CisjZGVmaW5lIE1BQ19UWF9TVEFUU19TSU5HTEVfQ09MTElTSU9OUwkweDAwMDAwODFjCisjZGVmaW5lIE1BQ19UWF9TVEFUU19NVUxUX0NPTExJU0lPTlMJMHgwMDAwMDgyMAorI2RlZmluZSBNQUNfVFhfU1RBVFNfREVGRVJSRUQJCTB4MDAwMDA4MjQKKyNkZWZpbmUgTUFDX1RYX1NUQVRTX1JFU1YzCQkweDAwMDAwODI4CisjZGVmaW5lIE1BQ19UWF9TVEFUU19FWENFU1NJVkVfQ09MCTB4MDAwMDA4MmMKKyNkZWZpbmUgTUFDX1RYX1NUQVRTX0xBVEVfQ09MCQkweDAwMDAwODMwCisjZGVmaW5lIE1BQ19UWF9TVEFUU19SRVNWNF8xCQkweDAwMDAwODM0CisjZGVmaW5lIE1BQ19UWF9TVEFUU19SRVNWNF8yCQkweDAwMDAwODM4CisjZGVmaW5lIE1BQ19UWF9TVEFUU19SRVNWNF8zCQkweDAwMDAwODNjCisjZGVmaW5lIE1BQ19UWF9TVEFUU19SRVNWNF80CQkweDAwMDAwODQwCisjZGVmaW5lIE1BQ19UWF9TVEFUU19SRVNWNF81CQkweDAwMDAwODQ0CisjZGVmaW5lIE1BQ19UWF9TVEFUU19SRVNWNF82CQkweDAwMDAwODQ4CisjZGVmaW5lIE1BQ19UWF9TVEFUU19SRVNWNF83CQkweDAwMDAwODRjCisjZGVmaW5lIE1BQ19UWF9TVEFUU19SRVNWNF84CQkweDAwMDAwODUwCisjZGVmaW5lIE1BQ19UWF9TVEFUU19SRVNWNF85CQkweDAwMDAwODU0CisjZGVmaW5lIE1BQ19UWF9TVEFUU19SRVNWNF8xMAkJMHgwMDAwMDg1OAorI2RlZmluZSBNQUNfVFhfU1RBVFNfUkVTVjRfMTEJCTB4MDAwMDA4NWMKKyNkZWZpbmUgTUFDX1RYX1NUQVRTX1JFU1Y0XzEyCQkweDAwMDAwODYwCisjZGVmaW5lIE1BQ19UWF9TVEFUU19SRVNWNF8xMwkJMHgwMDAwMDg2NAorI2RlZmluZSBNQUNfVFhfU1RBVFNfUkVTVjRfMTQJCTB4MDAwMDA4NjgKKyNkZWZpbmUgTUFDX1RYX1NUQVRTX1VDQVNUCQkweDAwMDAwODZjCisjZGVmaW5lIE1BQ19UWF9TVEFUU19NQ0FTVAkJMHgwMDAwMDg3MAorI2RlZmluZSBNQUNfVFhfU1RBVFNfQkNBU1QJCTB4MDAwMDA4NzQKKyNkZWZpbmUgTUFDX1RYX1NUQVRTX1JFU1Y1XzEJCTB4MDAwMDA4NzgKKyNkZWZpbmUgTUFDX1RYX1NUQVRTX1JFU1Y1XzIJCTB4MDAwMDA4N2MKKyNkZWZpbmUgTUFDX1JYX1NUQVRTX09DVEVUUwkJMHgwMDAwMDg4MAorI2RlZmluZSBNQUNfUlhfU1RBVFNfUkVTVjEJCTB4MDAwMDA4ODQKKyNkZWZpbmUgTUFDX1JYX1NUQVRTX0ZSQUdNRU5UUwkJMHgwMDAwMDg4OAorI2RlZmluZSBNQUNfUlhfU1RBVFNfVUNBU1QJCTB4MDAwMDA4OGMKKyNkZWZpbmUgTUFDX1JYX1NUQVRTX01DQVNUCQkweDAwMDAwODkwCisjZGVmaW5lIE1BQ19SWF9TVEFUU19CQ0FTVAkJMHgwMDAwMDg5NAorI2RlZmluZSBNQUNfUlhfU1RBVFNfRkNTX0VSUk9SUwkJMHgwMDAwMDg5OAorI2RlZmluZSBNQUNfUlhfU1RBVFNfQUxJR05fRVJST1JTCTB4MDAwMDA4OWMKKyNkZWZpbmUgTUFDX1JYX1NUQVRTX1hPTl9QQVVTRV9SRUNWRAkweDAwMDAwOGEwCisjZGVmaW5lIE1BQ19SWF9TVEFUU19YT0ZGX1BBVVNFX1JFQ1ZECTB4MDAwMDA4YTQKKyNkZWZpbmUgTUFDX1JYX1NUQVRTX01BQ19DVFJMX1JFQ1ZECTB4MDAwMDA4YTgKKyNkZWZpbmUgTUFDX1JYX1NUQVRTX1hPRkZfRU5URVJFRAkweDAwMDAwOGFjCisjZGVmaW5lIE1BQ19SWF9TVEFUU19GUkFNRV9UT09fTE9ORwkweDAwMDAwOGIwCisjZGVmaW5lIE1BQ19SWF9TVEFUU19KQUJCRVJTCQkweDAwMDAwOGI0CisjZGVmaW5lIE1BQ19SWF9TVEFUU19VTkRFUlNJWkUJCTB4MDAwMDA4YjgKKy8qIDB4OGJjIC0tPiAweGMwMCB1bnVzZWQgKi8KKworLyogU2VuZCBkYXRhIGluaXRpYXRvciBjb250cm9sIHJlZ2lzdGVycyAqLworI2RlZmluZSBTTkREQVRBSV9NT0RFCQkJMHgwMDAwMGMwMAorI2RlZmluZSAgU05EREFUQUlfTU9ERV9SRVNFVAkJIDB4MDAwMDAwMDEKKyNkZWZpbmUgIFNORERBVEFJX01PREVfRU5BQkxFCQkgMHgwMDAwMDAwMgorI2RlZmluZSAgU05EREFUQUlfTU9ERV9TVEFUX09GTE9XX0VOQUIJIDB4MDAwMDAwMDQKKyNkZWZpbmUgU05EREFUQUlfU1RBVFVTCQkJMHgwMDAwMGMwNAorI2RlZmluZSAgU05EREFUQUlfU1RBVFVTX1NUQVRfT0ZMT1cJIDB4MDAwMDAwMDQKKyNkZWZpbmUgU05EREFUQUlfU1RBVFNDVFJMCQkweDAwMDAwYzA4CisjZGVmaW5lICBTTkREQVRBSV9TQ1RSTF9FTkFCTEUJCSAweDAwMDAwMDAxCisjZGVmaW5lICBTTkREQVRBSV9TQ1RSTF9GQVNUVVBECQkgMHgwMDAwMDAwMgorI2RlZmluZSAgU05EREFUQUlfU0NUUkxfQ0xFQVIJCSAweDAwMDAwMDA0CisjZGVmaW5lICBTTkREQVRBSV9TQ1RSTF9GTFVTSAkJIDB4MDAwMDAwMDgKKyNkZWZpbmUgIFNORERBVEFJX1NDVFJMX0ZPUkNFX1pFUk8JIDB4MDAwMDAwMTAKKyNkZWZpbmUgU05EREFUQUlfU1RBVFNFTkFCCQkweDAwMDAwYzBjCisjZGVmaW5lIFNORERBVEFJX1NUQVRTSU5DTUFTSwkJMHgwMDAwMGMxMAorLyogMHhjMTQgLS0+IDB4YzgwIHVudXNlZCAqLworI2RlZmluZSBTTkREQVRBSV9DT1NfQ05UXzAJCTB4MDAwMDBjODAKKyNkZWZpbmUgU05EREFUQUlfQ09TX0NOVF8xCQkweDAwMDAwYzg0CisjZGVmaW5lIFNORERBVEFJX0NPU19DTlRfMgkJMHgwMDAwMGM4OAorI2RlZmluZSBTTkREQVRBSV9DT1NfQ05UXzMJCTB4MDAwMDBjOGMKKyNkZWZpbmUgU05EREFUQUlfQ09TX0NOVF80CQkweDAwMDAwYzkwCisjZGVmaW5lIFNORERBVEFJX0NPU19DTlRfNQkJMHgwMDAwMGM5NAorI2RlZmluZSBTTkREQVRBSV9DT1NfQ05UXzYJCTB4MDAwMDBjOTgKKyNkZWZpbmUgU05EREFUQUlfQ09TX0NOVF83CQkweDAwMDAwYzljCisjZGVmaW5lIFNORERBVEFJX0NPU19DTlRfOAkJMHgwMDAwMGNhMAorI2RlZmluZSBTTkREQVRBSV9DT1NfQ05UXzkJCTB4MDAwMDBjYTQKKyNkZWZpbmUgU05EREFUQUlfQ09TX0NOVF8xMAkJMHgwMDAwMGNhOAorI2RlZmluZSBTTkREQVRBSV9DT1NfQ05UXzExCQkweDAwMDAwY2FjCisjZGVmaW5lIFNORERBVEFJX0NPU19DTlRfMTIJCTB4MDAwMDBjYjAKKyNkZWZpbmUgU05EREFUQUlfQ09TX0NOVF8xMwkJMHgwMDAwMGNiNAorI2RlZmluZSBTTkREQVRBSV9DT1NfQ05UXzE0CQkweDAwMDAwY2I4CisjZGVmaW5lIFNORERBVEFJX0NPU19DTlRfMTUJCTB4MDAwMDBjYmMKKyNkZWZpbmUgU05EREFUQUlfRE1BX1JEUV9GVUxMX0NOVAkweDAwMDAwY2MwCisjZGVmaW5lIFNORERBVEFJX0RNQV9QUklPX1JEUV9GVUxMX0NOVAkweDAwMDAwY2M0CisjZGVmaW5lIFNORERBVEFJX1NEQ1FfRlVMTF9DTlQJCTB4MDAwMDBjYzgKKyNkZWZpbmUgU05EREFUQUlfTklDUk5HX1NTTkRfUElEWF9DTlQJMHgwMDAwMGNjYworI2RlZmluZSBTTkREQVRBSV9TVEFUU19VUERBVEVEX0NOVAkweDAwMDAwY2QwCisjZGVmaW5lIFNORERBVEFJX0lOVEVSUlVQVFNfQ05UCQkweDAwMDAwY2Q0CisjZGVmaW5lIFNORERBVEFJX0FWT0lEX0lOVEVSUlVQVFNfQ05UCTB4MDAwMDBjZDgKKyNkZWZpbmUgU05EREFUQUlfU05EX1RIUkVTSF9ISVRfQ05UCTB4MDAwMDBjZGMKKy8qIDB4Y2UwIC0tPiAweDEwMDAgdW51c2VkICovCisKKy8qIFNlbmQgZGF0YSBjb21wbGV0aW9uIGNvbnRyb2wgcmVnaXN0ZXJzICovCisjZGVmaW5lIFNORERBVEFDX01PREUJCQkweDAwMDAxMDAwCisjZGVmaW5lICBTTkREQVRBQ19NT0RFX1JFU0VUCQkgMHgwMDAwMDAwMQorI2RlZmluZSAgU05EREFUQUNfTU9ERV9FTkFCTEUJCSAweDAwMDAwMDAyCisvKiAweDEwMDQgLS0+IDB4MTQwMCB1bnVzZWQgKi8KKworLyogU2VuZCBCRCByaW5nIHNlbGVjdG9yICovCisjZGVmaW5lIFNOREJEU19NT0RFCQkJMHgwMDAwMTQwMAorI2RlZmluZSAgU05EQkRTX01PREVfUkVTRVQJCSAweDAwMDAwMDAxCisjZGVmaW5lICBTTkRCRFNfTU9ERV9FTkFCTEUJCSAweDAwMDAwMDAyCisjZGVmaW5lICBTTkRCRFNfTU9ERV9BVFROX0VOQUJMRQkgMHgwMDAwMDAwNAorI2RlZmluZSBTTkRCRFNfU1RBVFVTCQkJMHgwMDAwMTQwNAorI2RlZmluZSAgU05EQkRTX1NUQVRVU19FUlJPUl9BVFROCSAweDAwMDAwMDA0CisjZGVmaW5lIFNOREJEU19IV0RJQUcJCQkweDAwMDAxNDA4CisvKiAweDE0MGMgLS0+IDB4MTQ0MCAqLworI2RlZmluZSBTTkRCRFNfU0VMX0NPTl9JRFhfMAkJMHgwMDAwMTQ0MAorI2RlZmluZSBTTkRCRFNfU0VMX0NPTl9JRFhfMQkJMHgwMDAwMTQ0NAorI2RlZmluZSBTTkRCRFNfU0VMX0NPTl9JRFhfMgkJMHgwMDAwMTQ0OAorI2RlZmluZSBTTkRCRFNfU0VMX0NPTl9JRFhfMwkJMHgwMDAwMTQ0YworI2RlZmluZSBTTkRCRFNfU0VMX0NPTl9JRFhfNAkJMHgwMDAwMTQ1MAorI2RlZmluZSBTTkRCRFNfU0VMX0NPTl9JRFhfNQkJMHgwMDAwMTQ1NAorI2RlZmluZSBTTkRCRFNfU0VMX0NPTl9JRFhfNgkJMHgwMDAwMTQ1OAorI2RlZmluZSBTTkRCRFNfU0VMX0NPTl9JRFhfNwkJMHgwMDAwMTQ1YworI2RlZmluZSBTTkRCRFNfU0VMX0NPTl9JRFhfOAkJMHgwMDAwMTQ2MAorI2RlZmluZSBTTkRCRFNfU0VMX0NPTl9JRFhfOQkJMHgwMDAwMTQ2NAorI2RlZmluZSBTTkRCRFNfU0VMX0NPTl9JRFhfMTAJCTB4MDAwMDE0NjgKKyNkZWZpbmUgU05EQkRTX1NFTF9DT05fSURYXzExCQkweDAwMDAxNDZjCisjZGVmaW5lIFNOREJEU19TRUxfQ09OX0lEWF8xMgkJMHgwMDAwMTQ3MAorI2RlZmluZSBTTkRCRFNfU0VMX0NPTl9JRFhfMTMJCTB4MDAwMDE0NzQKKyNkZWZpbmUgU05EQkRTX1NFTF9DT05fSURYXzE0CQkweDAwMDAxNDc4CisjZGVmaW5lIFNOREJEU19TRUxfQ09OX0lEWF8xNQkJMHgwMDAwMTQ3YworLyogMHgxNDgwIC0tPiAweDE4MDAgdW51c2VkICovCisKKy8qIFNlbmQgQkQgaW5pdGlhdG9yIGNvbnRyb2wgcmVnaXN0ZXJzICovCisjZGVmaW5lIFNOREJESV9NT0RFCQkJMHgwMDAwMTgwMAorI2RlZmluZSAgU05EQkRJX01PREVfUkVTRVQJCSAweDAwMDAwMDAxCisjZGVmaW5lICBTTkRCRElfTU9ERV9FTkFCTEUJCSAweDAwMDAwMDAyCisjZGVmaW5lICBTTkRCRElfTU9ERV9BVFROX0VOQUJMRQkgMHgwMDAwMDAwNAorI2RlZmluZSBTTkRCRElfU1RBVFVTCQkJMHgwMDAwMTgwNAorI2RlZmluZSAgU05EQkRJX1NUQVRVU19FUlJPUl9BVFROCSAweDAwMDAwMDA0CisjZGVmaW5lIFNOREJESV9JTl9QUk9EX0lEWF8wCQkweDAwMDAxODA4CisjZGVmaW5lIFNOREJESV9JTl9QUk9EX0lEWF8xCQkweDAwMDAxODBjCisjZGVmaW5lIFNOREJESV9JTl9QUk9EX0lEWF8yCQkweDAwMDAxODEwCisjZGVmaW5lIFNOREJESV9JTl9QUk9EX0lEWF8zCQkweDAwMDAxODE0CisjZGVmaW5lIFNOREJESV9JTl9QUk9EX0lEWF80CQkweDAwMDAxODE4CisjZGVmaW5lIFNOREJESV9JTl9QUk9EX0lEWF81CQkweDAwMDAxODFjCisjZGVmaW5lIFNOREJESV9JTl9QUk9EX0lEWF82CQkweDAwMDAxODIwCisjZGVmaW5lIFNOREJESV9JTl9QUk9EX0lEWF83CQkweDAwMDAxODI0CisjZGVmaW5lIFNOREJESV9JTl9QUk9EX0lEWF84CQkweDAwMDAxODI4CisjZGVmaW5lIFNOREJESV9JTl9QUk9EX0lEWF85CQkweDAwMDAxODJjCisjZGVmaW5lIFNOREJESV9JTl9QUk9EX0lEWF8xMAkJMHgwMDAwMTgzMAorI2RlZmluZSBTTkRCRElfSU5fUFJPRF9JRFhfMTEJCTB4MDAwMDE4MzQKKyNkZWZpbmUgU05EQkRJX0lOX1BST0RfSURYXzEyCQkweDAwMDAxODM4CisjZGVmaW5lIFNOREJESV9JTl9QUk9EX0lEWF8xMwkJMHgwMDAwMTgzYworI2RlZmluZSBTTkRCRElfSU5fUFJPRF9JRFhfMTQJCTB4MDAwMDE4NDAKKyNkZWZpbmUgU05EQkRJX0lOX1BST0RfSURYXzE1CQkweDAwMDAxODQ0CisvKiAweDE4NDggLS0+IDB4MWMwMCB1bnVzZWQgKi8KKworLyogU2VuZCBCRCBjb21wbGV0aW9uIGNvbnRyb2wgcmVnaXN0ZXJzICovCisjZGVmaW5lIFNOREJEQ19NT0RFCQkJMHgwMDAwMWMwMAorI2RlZmluZSBTTkRCRENfTU9ERV9SRVNFVAkJIDB4MDAwMDAwMDEKKyNkZWZpbmUgU05EQkRDX01PREVfRU5BQkxFCQkgMHgwMDAwMDAwMgorI2RlZmluZSBTTkRCRENfTU9ERV9BVFROX0VOQUJMRQkJIDB4MDAwMDAwMDQKKy8qIDB4MWMwNCAtLT4gMHgyMDAwIHVudXNlZCAqLworCisvKiBSZWNlaXZlIGxpc3QgcGxhY2VtZW50IGNvbnRyb2wgcmVnaXN0ZXJzICovCisjZGVmaW5lIFJDVkxQQ19NT0RFCQkJMHgwMDAwMjAwMAorI2RlZmluZSAgUkNWTFBDX01PREVfUkVTRVQJCSAweDAwMDAwMDAxCisjZGVmaW5lICBSQ1ZMUENfTU9ERV9FTkFCTEUJCSAweDAwMDAwMDAyCisjZGVmaW5lICBSQ1ZMUENfTU9ERV9DTEFTUzBfQVRUTl9FTkFCCSAweDAwMDAwMDA0CisjZGVmaW5lICBSQ1ZMUENfTU9ERV9NQVBPT1JfQUFUVE5fRU5BQgkgMHgwMDAwMDAwOAorI2RlZmluZSAgUkNWTFBDX01PREVfU1RBVF9PRkxPV19FTkFCCSAweDAwMDAwMDEwCisjZGVmaW5lIFJDVkxQQ19TVEFUVVMJCQkweDAwMDAyMDA0CisjZGVmaW5lICBSQ1ZMUENfU1RBVFVTX0NMQVNTMAkJIDB4MDAwMDAwMDQKKyNkZWZpbmUgIFJDVkxQQ19TVEFUVVNfTUFQT09SCQkgMHgwMDAwMDAwOAorI2RlZmluZSAgUkNWTFBDX1NUQVRVU19TVEFUX09GTE9XCSAweDAwMDAwMDEwCisjZGVmaW5lIFJDVkxQQ19MT0NLCQkJMHgwMDAwMjAwOAorI2RlZmluZSAgUkNWTFBDX0xPQ0tfUkVRX01BU0sJCSAweDAwMDBmZmZmCisjZGVmaW5lICBSQ1ZMUENfTE9DS19SRVFfU0hJRlQJCSAwCisjZGVmaW5lICBSQ1ZMUENfTE9DS19HUkFOVF9NQVNLCQkgMHhmZmZmMDAwMAorI2RlZmluZSAgUkNWTFBDX0xPQ0tfR1JBTlRfU0hJRlQJIDE2CisjZGVmaW5lIFJDVkxQQ19OT05fRU1QVFlfQklUUwkJMHgwMDAwMjAwYworI2RlZmluZSAgUkNWTFBDX05PTl9FTVBUWV9CSVRTX01BU0sJIDB4MDAwMGZmZmYKKyNkZWZpbmUgUkNWTFBDX0NPTkZJRwkJCTB4MDAwMDIwMTAKKyNkZWZpbmUgUkNWTFBDX1NUQVRTQ1RSTAkJMHgwMDAwMjAxNAorI2RlZmluZSAgUkNWTFBDX1NUQVRTQ1RSTF9FTkFCTEUJIDB4MDAwMDAwMDEKKyNkZWZpbmUgIFJDVkxQQ19TVEFUU0NUUkxfRkFTVFVQRAkgMHgwMDAwMDAwMgorI2RlZmluZSBSQ1ZMUENfU1RBVFNfRU5BQkxFCQkweDAwMDAyMDE4CisjZGVmaW5lICBSQ1ZMUENfU1RBVFNFTkFCX0xOR0JSU1RfUkZJWAkgMHgwMDQwMDAwMAorI2RlZmluZSBSQ1ZMUENfU1RBVFNfSU5DTUFTSwkJMHgwMDAwMjAxYworLyogMHgyMDIwIC0tPiAweDIxMDAgdW51c2VkICovCisjZGVmaW5lIFJDVkxQQ19TRUxMU1RfQkFTRQkJMHgwMDAwMjEwMCAvKiAxNiAxNi1ieXRlIGVudHJpZXMgKi8KKyNkZWZpbmUgIFNFTExTVF9UQUlMCQkJMHgwMDAwMDAwNAorI2RlZmluZSAgU0VMTFNUX0NPTlQJCQkweDAwMDAwMDA4CisjZGVmaW5lICBTRUxMU1RfVU5VU0VECQkJMHgwMDAwMDAwYworI2RlZmluZSBSQ1ZMUENfQ09TX0NOVExfQkFTRQkJMHgwMDAwMjIwMCAvKiAxNiA0LWJ5dGUgZW50cmllcyAqLworI2RlZmluZSBSQ1ZMUENfRFJPUF9GSUxURVJfQ05UCQkweDAwMDAyMjQwCisjZGVmaW5lIFJDVkxQQ19ETUFfV1FfRlVMTF9DTlQJCTB4MDAwMDIyNDQKKyNkZWZpbmUgUkNWTFBDX0RNQV9ISVBSSU9fV1FfRlVMTF9DTlQJMHgwMDAwMjI0OAorI2RlZmluZSBSQ1ZMUENfTk9fUkNWX0JEX0NOVAkJMHgwMDAwMjI0YworI2RlZmluZSBSQ1ZMUENfSU5fRElTQ0FSRFNfQ05UCQkweDAwMDAyMjUwCisjZGVmaW5lIFJDVkxQQ19JTl9FUlJPUlNfQ05UCQkweDAwMDAyMjU0CisjZGVmaW5lIFJDVkxQQ19SQ1ZfVEhSRVNIX0hJVF9DTlQJMHgwMDAwMjI1OAorLyogMHgyMjVjIC0tPiAweDI0MDAgdW51c2VkICovCisKKy8qIFJlY2VpdmUgRGF0YSBhbmQgUmVjZWl2ZSBCRCBJbml0aWF0b3IgQ29udHJvbCAqLworI2RlZmluZSBSQ1ZEQkRJX01PREUJCQkweDAwMDAyNDAwCisjZGVmaW5lICBSQ1ZEQkRJX01PREVfUkVTRVQJCSAweDAwMDAwMDAxCisjZGVmaW5lICBSQ1ZEQkRJX01PREVfRU5BQkxFCQkgMHgwMDAwMDAwMgorI2RlZmluZSAgUkNWREJESV9NT0RFX0pVTUJPQkRfTkVFREVECSAweDAwMDAwMDA0CisjZGVmaW5lICBSQ1ZEQkRJX01PREVfRlJNX1RPT19CSUcJIDB4MDAwMDAwMDgKKyNkZWZpbmUgIFJDVkRCRElfTU9ERV9JTlZfUklOR19TWgkgMHgwMDAwMDAxMAorI2RlZmluZSBSQ1ZEQkRJX1NUQVRVUwkJCTB4MDAwMDI0MDQKKyNkZWZpbmUgIFJDVkRCRElfU1RBVFVTX0pVTUJPQkRfTkVFREVECSAweDAwMDAwMDA0CisjZGVmaW5lICBSQ1ZEQkRJX1NUQVRVU19GUk1fVE9PX0JJRwkgMHgwMDAwMDAwOAorI2RlZmluZSAgUkNWREJESV9TVEFUVVNfSU5WX1JJTkdfU1oJIDB4MDAwMDAwMTAKKyNkZWZpbmUgUkNWREJESV9TUExJVF9GUkFNRV9NSU5TWgkweDAwMDAyNDA4CisvKiAweDI0MGMgLS0+IDB4MjQ0MCB1bnVzZWQgKi8KKyNkZWZpbmUgUkNWREJESV9KVU1CT19CRAkJMHgwMDAwMjQ0MCAvKiBURzNfQkRJTkZPXy4uLiAqLworI2RlZmluZSBSQ1ZEQkRJX1NURF9CRAkJCTB4MDAwMDI0NTAgLyogVEczX0JESU5GT18uLi4gKi8KKyNkZWZpbmUgUkNWREJESV9NSU5JX0JECQkJMHgwMDAwMjQ2MCAvKiBURzNfQkRJTkZPXy4uLiAqLworI2RlZmluZSBSQ1ZEQkRJX0pVTUJPX0NPTl9JRFgJCTB4MDAwMDI0NzAKKyNkZWZpbmUgUkNWREJESV9TVERfQ09OX0lEWAkJMHgwMDAwMjQ3NAorI2RlZmluZSBSQ1ZEQkRJX01JTklfQ09OX0lEWAkJMHgwMDAwMjQ3OAorLyogMHgyNDdjIC0tPiAweDI0ODAgdW51c2VkICovCisjZGVmaW5lIFJDVkRCRElfQkRfUFJPRF9JRFhfMAkJMHgwMDAwMjQ4MAorI2RlZmluZSBSQ1ZEQkRJX0JEX1BST0RfSURYXzEJCTB4MDAwMDI0ODQKKyNkZWZpbmUgUkNWREJESV9CRF9QUk9EX0lEWF8yCQkweDAwMDAyNDg4CisjZGVmaW5lIFJDVkRCRElfQkRfUFJPRF9JRFhfMwkJMHgwMDAwMjQ4YworI2RlZmluZSBSQ1ZEQkRJX0JEX1BST0RfSURYXzQJCTB4MDAwMDI0OTAKKyNkZWZpbmUgUkNWREJESV9CRF9QUk9EX0lEWF81CQkweDAwMDAyNDk0CisjZGVmaW5lIFJDVkRCRElfQkRfUFJPRF9JRFhfNgkJMHgwMDAwMjQ5OAorI2RlZmluZSBSQ1ZEQkRJX0JEX1BST0RfSURYXzcJCTB4MDAwMDI0OWMKKyNkZWZpbmUgUkNWREJESV9CRF9QUk9EX0lEWF84CQkweDAwMDAyNGEwCisjZGVmaW5lIFJDVkRCRElfQkRfUFJPRF9JRFhfOQkJMHgwMDAwMjRhNAorI2RlZmluZSBSQ1ZEQkRJX0JEX1BST0RfSURYXzEwCQkweDAwMDAyNGE4CisjZGVmaW5lIFJDVkRCRElfQkRfUFJPRF9JRFhfMTEJCTB4MDAwMDI0YWMKKyNkZWZpbmUgUkNWREJESV9CRF9QUk9EX0lEWF8xMgkJMHgwMDAwMjRiMAorI2RlZmluZSBSQ1ZEQkRJX0JEX1BST0RfSURYXzEzCQkweDAwMDAyNGI0CisjZGVmaW5lIFJDVkRCRElfQkRfUFJPRF9JRFhfMTQJCTB4MDAwMDI0YjgKKyNkZWZpbmUgUkNWREJESV9CRF9QUk9EX0lEWF8xNQkJMHgwMDAwMjRiYworI2RlZmluZSBSQ1ZEQkRJX0hXRElBRwkJCTB4MDAwMDI0YzAKKy8qIDB4MjRjNCAtLT4gMHgyODAwIHVudXNlZCAqLworCisvKiBSZWNlaXZlIERhdGEgQ29tcGxldGlvbiBDb250cm9sICovCisjZGVmaW5lIFJDVkRDQ19NT0RFCQkJMHgwMDAwMjgwMAorI2RlZmluZSAgUkNWRENDX01PREVfUkVTRVQJCSAweDAwMDAwMDAxCisjZGVmaW5lICBSQ1ZEQ0NfTU9ERV9FTkFCTEUJCSAweDAwMDAwMDAyCisjZGVmaW5lICBSQ1ZEQ0NfTU9ERV9BVFROX0VOQUJMRQkgMHgwMDAwMDAwNAorLyogMHgyODA0IC0tPiAweDJjMDAgdW51c2VkICovCisKKy8qIFJlY2VpdmUgQkQgSW5pdGlhdG9yIENvbnRyb2wgUmVnaXN0ZXJzICovCisjZGVmaW5lIFJDVkJESV9NT0RFCQkJMHgwMDAwMmMwMAorI2RlZmluZSAgUkNWQkRJX01PREVfUkVTRVQJCSAweDAwMDAwMDAxCisjZGVmaW5lICBSQ1ZCRElfTU9ERV9FTkFCTEUJCSAweDAwMDAwMDAyCisjZGVmaW5lICBSQ1ZCRElfTU9ERV9SQ0JfQVRUTl9FTkFCCSAweDAwMDAwMDA0CisjZGVmaW5lIFJDVkJESV9TVEFUVVMJCQkweDAwMDAyYzA0CisjZGVmaW5lICBSQ1ZCRElfU1RBVFVTX1JDQl9BVFROCQkgMHgwMDAwMDAwNAorI2RlZmluZSBSQ1ZCRElfSlVNQk9fUFJPRF9JRFgJCTB4MDAwMDJjMDgKKyNkZWZpbmUgUkNWQkRJX1NURF9QUk9EX0lEWAkJMHgwMDAwMmMwYworI2RlZmluZSBSQ1ZCRElfTUlOSV9QUk9EX0lEWAkJMHgwMDAwMmMxMAorI2RlZmluZSBSQ1ZCRElfTUlOSV9USFJFU0gJCTB4MDAwMDJjMTQKKyNkZWZpbmUgUkNWQkRJX1NURF9USFJFU0gJCTB4MDAwMDJjMTgKKyNkZWZpbmUgUkNWQkRJX0pVTUJPX1RIUkVTSAkJMHgwMDAwMmMxYworLyogMHgyYzIwIC0tPiAweDMwMDAgdW51c2VkICovCisKKy8qIFJlY2VpdmUgQkQgQ29tcGxldGlvbiBDb250cm9sIFJlZ2lzdGVycyAqLworI2RlZmluZSBSQ1ZDQ19NT0RFCQkJMHgwMDAwMzAwMAorI2RlZmluZSAgUkNWQ0NfTU9ERV9SRVNFVAkJIDB4MDAwMDAwMDEKKyNkZWZpbmUgIFJDVkNDX01PREVfRU5BQkxFCQkgMHgwMDAwMDAwMgorI2RlZmluZSAgUkNWQ0NfTU9ERV9BVFROX0VOQUJMRQkJIDB4MDAwMDAwMDQKKyNkZWZpbmUgUkNWQ0NfU1RBVFVTCQkJMHgwMDAwMzAwNAorI2RlZmluZSAgUkNWQ0NfU1RBVFVTX0VSUk9SX0FUVE4JIDB4MDAwMDAwMDQKKyNkZWZpbmUgUkNWQ0NfSlVNUF9QUk9EX0lEWAkJMHgwMDAwMzAwOAorI2RlZmluZSBSQ1ZDQ19TVERfUFJPRF9JRFgJCTB4MDAwMDMwMGMKKyNkZWZpbmUgUkNWQ0NfTUlOSV9QUk9EX0lEWAkJMHgwMDAwMzAxMAorLyogMHgzMDE0IC0tPiAweDM0MDAgdW51c2VkICovCisKKy8qIFJlY2VpdmUgbGlzdCBzZWxlY3RvciBjb250cm9sIHJlZ2lzdGVycyAqLworI2RlZmluZSBSQ1ZMU0NfTU9ERQkJCTB4MDAwMDM0MDAKKyNkZWZpbmUgIFJDVkxTQ19NT0RFX1JFU0VUCQkgMHgwMDAwMDAwMQorI2RlZmluZSAgUkNWTFNDX01PREVfRU5BQkxFCQkgMHgwMDAwMDAwMgorI2RlZmluZSAgUkNWTFNDX01PREVfQVRUTl9FTkFCTEUJIDB4MDAwMDAwMDQKKyNkZWZpbmUgUkNWTFNDX1NUQVRVUwkJCTB4MDAwMDM0MDQKKyNkZWZpbmUgIFJDVkxTQ19TVEFUVVNfRVJST1JfQVRUTgkgMHgwMDAwMDAwNAorLyogMHgzNDA4IC0tPiAweDM4MDAgdW51c2VkICovCisKKy8qIE1idWYgY2x1c3RlciBmcmVlIHJlZ2lzdGVycyAqLworI2RlZmluZSBNQkZSRUVfTU9ERQkJCTB4MDAwMDM4MDAKKyNkZWZpbmUgIE1CRlJFRV9NT0RFX1JFU0VUCQkgMHgwMDAwMDAwMQorI2RlZmluZSAgTUJGUkVFX01PREVfRU5BQkxFCQkgMHgwMDAwMDAwMgorI2RlZmluZSBNQkZSRUVfU1RBVFVTCQkJMHgwMDAwMzgwNAorLyogMHgzODA4IC0tPiAweDNjMDAgdW51c2VkICovCisKKy8qIEhvc3QgY29hbGVzY2luZyBjb250cm9sIHJlZ2lzdGVycyAqLworI2RlZmluZSBIT1NUQ0NfTU9ERQkJCTB4MDAwMDNjMDAKKyNkZWZpbmUgIEhPU1RDQ19NT0RFX1JFU0VUCQkgMHgwMDAwMDAwMQorI2RlZmluZSAgSE9TVENDX01PREVfRU5BQkxFCQkgMHgwMDAwMDAwMgorI2RlZmluZSAgSE9TVENDX01PREVfQVRUTgkJIDB4MDAwMDAwMDQKKyNkZWZpbmUgIEhPU1RDQ19NT0RFX05PVwkJIDB4MDAwMDAwMDgKKyNkZWZpbmUgIEhPU1RDQ19NT0RFX0ZVTExfU1RBVFVTCSAweDAwMDAwMDAwCisjZGVmaW5lICBIT1NUQ0NfTU9ERV82NEJZVEUJCSAweDAwMDAwMDgwCisjZGVmaW5lICBIT1NUQ0NfTU9ERV8zMkJZVEUJCSAweDAwMDAwMTAwCisjZGVmaW5lICBIT1NUQ0NfTU9ERV9DTFJUSUNLX1JYQkQJIDB4MDAwMDAyMDAKKyNkZWZpbmUgIEhPU1RDQ19NT0RFX0NMUlRJQ0tfVFhCRAkgMHgwMDAwMDQwMAorI2RlZmluZSAgSE9TVENDX01PREVfTk9JTlRfT05fTk9XCSAweDAwMDAwODAwCisjZGVmaW5lICBIT1NUQ0NfTU9ERV9OT0lOVF9PTl9GT1JDRQkgMHgwMDAwMTAwMAorI2RlZmluZSBIT1NUQ0NfU1RBVFVTCQkJMHgwMDAwM2MwNAorI2RlZmluZSAgSE9TVENDX1NUQVRVU19FUlJPUl9BVFROCSAweDAwMDAwMDA0CisjZGVmaW5lIEhPU1RDQ19SWENPTF9USUNLUwkJMHgwMDAwM2MwOAorI2RlZmluZSAgTE9XX1JYQ09MX1RJQ0tTCQkgMHgwMDAwMDAzMgorI2RlZmluZSAgREVGQVVMVF9SWENPTF9USUNLUwkJIDB4MDAwMDAwNDgKKyNkZWZpbmUgIEhJR0hfUlhDT0xfVElDS1MJCSAweDAwMDAwMDk2CisjZGVmaW5lIEhPU1RDQ19UWENPTF9USUNLUwkJMHgwMDAwM2MwYworI2RlZmluZSAgTE9XX1RYQ09MX1RJQ0tTCQkgMHgwMDAwMDA5NgorI2RlZmluZSAgREVGQVVMVF9UWENPTF9USUNLUwkJIDB4MDAwMDAxMmMKKyNkZWZpbmUgIEhJR0hfVFhDT0xfVElDS1MJCSAweDAwMDAwMTQ1CisjZGVmaW5lIEhPU1RDQ19SWE1BWF9GUkFNRVMJCTB4MDAwMDNjMTAKKyNkZWZpbmUgIExPV19SWE1BWF9GUkFNRVMJCSAweDAwMDAwMDA1CisjZGVmaW5lICBERUZBVUxUX1JYTUFYX0ZSQU1FUwkJIDB4MDAwMDAwMDgKKyNkZWZpbmUgIEhJR0hfUlhNQVhfRlJBTUVTCQkgMHgwMDAwMDAxMgorI2RlZmluZSBIT1NUQ0NfVFhNQVhfRlJBTUVTCQkweDAwMDAzYzE0CisjZGVmaW5lICBMT1dfVFhNQVhfRlJBTUVTCQkgMHgwMDAwMDAzNQorI2RlZmluZSAgREVGQVVMVF9UWE1BWF9GUkFNRVMJCSAweDAwMDAwMDRiCisjZGVmaW5lICBISUdIX1RYTUFYX0ZSQU1FUwkJIDB4MDAwMDAwNTIKKyNkZWZpbmUgSE9TVENDX1JYQ09BTF9USUNLX0lOVAkJMHgwMDAwM2MxOAorI2RlZmluZSAgREVGQVVMVF9SWENPQUxfVElDS19JTlQJIDB4MDAwMDAwMTkKKyNkZWZpbmUgSE9TVENDX1RYQ09BTF9USUNLX0lOVAkJMHgwMDAwM2MxYworI2RlZmluZSAgREVGQVVMVF9UWENPQUxfVElDS19JTlQJIDB4MDAwMDAwMTkKKyNkZWZpbmUgSE9TVENDX1JYQ09BTF9NQVhGX0lOVAkJMHgwMDAwM2MyMAorI2RlZmluZSAgREVGQVVMVF9SWENPQUxfTUFYRl9JTlQJIDB4MDAwMDAwMDUKKyNkZWZpbmUgSE9TVENDX1RYQ09BTF9NQVhGX0lOVAkJMHgwMDAwM2MyNAorI2RlZmluZSAgREVGQVVMVF9UWENPQUxfTUFYRl9JTlQJIDB4MDAwMDAwMDUKKyNkZWZpbmUgSE9TVENDX1NUQVRfQ09BTF9USUNLUwkJMHgwMDAwM2MyOAorI2RlZmluZSAgREVGQVVMVF9TVEFUX0NPQUxfVElDS1MJIDB4MDAwZjQyNDAKKy8qIDB4M2MyYyAtLT4gMHgzYzMwIHVudXNlZCAqLworI2RlZmluZSBIT1NUQ0NfU1RBVFNfQkxLX0hPU1RfQUREUgkweDAwMDAzYzMwIC8qIDY0LWJpdCAqLworI2RlZmluZSBIT1NUQ0NfU1RBVFVTX0JMS19IT1NUX0FERFIJMHgwMDAwM2MzOCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgSE9TVENDX1NUQVRTX0JMS19OSUNfQUREUgkweDAwMDAzYzQwCisjZGVmaW5lIEhPU1RDQ19TVEFUVVNfQkxLX05JQ19BRERSCTB4MDAwMDNjNDQKKyNkZWZpbmUgSE9TVENDX0ZMT1dfQVRUTgkJMHgwMDAwM2M0OAorLyogMHgzYzRjIC0tPiAweDNjNTAgdW51c2VkICovCisjZGVmaW5lIEhPU1RDQ19KVU1CT19DT05fSURYCQkweDAwMDAzYzUwCisjZGVmaW5lIEhPU1RDQ19TVERfQ09OX0lEWAkJMHgwMDAwM2M1NAorI2RlZmluZSBIT1NUQ0NfTUlOSV9DT05fSURYCQkweDAwMDAzYzU4CisvKiAweDNjNWMgLS0+IDB4M2M4MCB1bnVzZWQgKi8KKyNkZWZpbmUgSE9TVENDX1JFVF9QUk9EX0lEWF8wCQkweDAwMDAzYzgwCisjZGVmaW5lIEhPU1RDQ19SRVRfUFJPRF9JRFhfMQkJMHgwMDAwM2M4NAorI2RlZmluZSBIT1NUQ0NfUkVUX1BST0RfSURYXzIJCTB4MDAwMDNjODgKKyNkZWZpbmUgSE9TVENDX1JFVF9QUk9EX0lEWF8zCQkweDAwMDAzYzhjCisjZGVmaW5lIEhPU1RDQ19SRVRfUFJPRF9JRFhfNAkJMHgwMDAwM2M5MAorI2RlZmluZSBIT1NUQ0NfUkVUX1BST0RfSURYXzUJCTB4MDAwMDNjOTQKKyNkZWZpbmUgSE9TVENDX1JFVF9QUk9EX0lEWF82CQkweDAwMDAzYzk4CisjZGVmaW5lIEhPU1RDQ19SRVRfUFJPRF9JRFhfNwkJMHgwMDAwM2M5YworI2RlZmluZSBIT1NUQ0NfUkVUX1BST0RfSURYXzgJCTB4MDAwMDNjYTAKKyNkZWZpbmUgSE9TVENDX1JFVF9QUk9EX0lEWF85CQkweDAwMDAzY2E0CisjZGVmaW5lIEhPU1RDQ19SRVRfUFJPRF9JRFhfMTAJCTB4MDAwMDNjYTgKKyNkZWZpbmUgSE9TVENDX1JFVF9QUk9EX0lEWF8xMQkJMHgwMDAwM2NhYworI2RlZmluZSBIT1NUQ0NfUkVUX1BST0RfSURYXzEyCQkweDAwMDAzY2IwCisjZGVmaW5lIEhPU1RDQ19SRVRfUFJPRF9JRFhfMTMJCTB4MDAwMDNjYjQKKyNkZWZpbmUgSE9TVENDX1JFVF9QUk9EX0lEWF8xNAkJMHgwMDAwM2NiOAorI2RlZmluZSBIT1NUQ0NfUkVUX1BST0RfSURYXzE1CQkweDAwMDAzY2JjCisjZGVmaW5lIEhPU1RDQ19TTkRfQ09OX0lEWF8wCQkweDAwMDAzY2MwCisjZGVmaW5lIEhPU1RDQ19TTkRfQ09OX0lEWF8xCQkweDAwMDAzY2M0CisjZGVmaW5lIEhPU1RDQ19TTkRfQ09OX0lEWF8yCQkweDAwMDAzY2M4CisjZGVmaW5lIEhPU1RDQ19TTkRfQ09OX0lEWF8zCQkweDAwMDAzY2NjCisjZGVmaW5lIEhPU1RDQ19TTkRfQ09OX0lEWF80CQkweDAwMDAzY2QwCisjZGVmaW5lIEhPU1RDQ19TTkRfQ09OX0lEWF81CQkweDAwMDAzY2Q0CisjZGVmaW5lIEhPU1RDQ19TTkRfQ09OX0lEWF82CQkweDAwMDAzY2Q4CisjZGVmaW5lIEhPU1RDQ19TTkRfQ09OX0lEWF83CQkweDAwMDAzY2RjCisjZGVmaW5lIEhPU1RDQ19TTkRfQ09OX0lEWF84CQkweDAwMDAzY2UwCisjZGVmaW5lIEhPU1RDQ19TTkRfQ09OX0lEWF85CQkweDAwMDAzY2U0CisjZGVmaW5lIEhPU1RDQ19TTkRfQ09OX0lEWF8xMAkJMHgwMDAwM2NlOAorI2RlZmluZSBIT1NUQ0NfU05EX0NPTl9JRFhfMTEJCTB4MDAwMDNjZWMKKyNkZWZpbmUgSE9TVENDX1NORF9DT05fSURYXzEyCQkweDAwMDAzY2YwCisjZGVmaW5lIEhPU1RDQ19TTkRfQ09OX0lEWF8xMwkJMHgwMDAwM2NmNAorI2RlZmluZSBIT1NUQ0NfU05EX0NPTl9JRFhfMTQJCTB4MDAwMDNjZjgKKyNkZWZpbmUgSE9TVENDX1NORF9DT05fSURYXzE1CQkweDAwMDAzY2ZjCisvKiAweDNkMDAgLS0+IDB4NDAwMCB1bnVzZWQgKi8KKworLyogTWVtb3J5IGFyYml0ZXIgY29udHJvbCByZWdpc3RlcnMgKi8KKyNkZWZpbmUgTUVNQVJCX01PREUJCQkweDAwMDA0MDAwCisjZGVmaW5lICBNRU1BUkJfTU9ERV9SRVNFVAkJIDB4MDAwMDAwMDEKKyNkZWZpbmUgIE1FTUFSQl9NT0RFX0VOQUJMRQkJIDB4MDAwMDAwMDIKKyNkZWZpbmUgTUVNQVJCX1NUQVRVUwkJCTB4MDAwMDQwMDQKKyNkZWZpbmUgTUVNQVJCX1RSQVBfQUREUl9MT1cJCTB4MDAwMDQwMDgKKyNkZWZpbmUgTUVNQVJCX1RSQVBfQUREUl9ISUdICQkweDAwMDA0MDBjCisvKiAweDQwMTAgLS0+IDB4NDQwMCB1bnVzZWQgKi8KKworLyogQnVmZmVyIG1hbmFnZXIgY29udHJvbCByZWdpc3RlcnMgKi8KKyNkZWZpbmUgQlVGTUdSX01PREUJCQkweDAwMDA0NDAwCisjZGVmaW5lICBCVUZNR1JfTU9ERV9SRVNFVAkJIDB4MDAwMDAwMDEKKyNkZWZpbmUgIEJVRk1HUl9NT0RFX0VOQUJMRQkJIDB4MDAwMDAwMDIKKyNkZWZpbmUgIEJVRk1HUl9NT0RFX0FUVE5fRU5BQkxFCSAweDAwMDAwMDA0CisjZGVmaW5lICBCVUZNR1JfTU9ERV9CTV9URVNUCQkgMHgwMDAwMDAwOAorI2RlZmluZSAgQlVGTUdSX01PREVfTUJMT1dfQVRUTl9FTkFCCSAweDAwMDAwMDEwCisjZGVmaW5lIEJVRk1HUl9TVEFUVVMJCQkweDAwMDA0NDA0CisjZGVmaW5lICBCVUZNR1JfU1RBVFVTX0VSUk9SCQkgMHgwMDAwMDAwNAorI2RlZmluZSAgQlVGTUdSX1NUQVRVU19NQkxPVwkJIDB4MDAwMDAwMTAKKyNkZWZpbmUgQlVGTUdSX01CX1BPT0xfQUREUgkJMHgwMDAwNDQwOAorI2RlZmluZSBCVUZNR1JfTUJfUE9PTF9TSVpFCQkweDAwMDA0NDBjCisjZGVmaW5lIEJVRk1HUl9NQl9SRE1BX0xPV19XQVRFUgkweDAwMDA0NDEwCisjZGVmaW5lICBERUZBVUxUX01CX1JETUFfTE9XX1dBVEVSCSAweDAwMDAwMDUwCisjZGVmaW5lICBERUZBVUxUX01CX1JETUFfTE9XX1dBVEVSXzU3MDUJIDB4MDAwMDAwMDAKKyNkZWZpbmUgIERFRkFVTFRfTUJfUkRNQV9MT1dfV0FURVJfSlVNQk8gMHgwMDAwMDEzMAorI2RlZmluZSBCVUZNR1JfTUJfTUFDUlhfTE9XX1dBVEVSCTB4MDAwMDQ0MTQKKyNkZWZpbmUgIERFRkFVTFRfTUJfTUFDUlhfTE9XX1dBVEVSCSAgMHgwMDAwMDAyMAorI2RlZmluZSAgREVGQVVMVF9NQl9NQUNSWF9MT1dfV0FURVJfNTcwNSAgMHgwMDAwMDAxMAorI2RlZmluZSAgREVGQVVMVF9NQl9NQUNSWF9MT1dfV0FURVJfSlVNQk8gMHgwMDAwMDA5OAorI2RlZmluZSBCVUZNR1JfTUJfSElHSF9XQVRFUgkJMHgwMDAwNDQxOAorI2RlZmluZSAgREVGQVVMVF9NQl9ISUdIX1dBVEVSCQkgMHgwMDAwMDA2MAorI2RlZmluZSAgREVGQVVMVF9NQl9ISUdIX1dBVEVSXzU3MDUJIDB4MDAwMDAwNjAKKyNkZWZpbmUgIERFRkFVTFRfTUJfSElHSF9XQVRFUl9KVU1CTwkgMHgwMDAwMDE3YworI2RlZmluZSBCVUZNR1JfUlhfTUJfQUxMT0NfUkVRCQkweDAwMDA0NDFjCisjZGVmaW5lICBCVUZNR1JfTUJfQUxMT0NfQklUCQkgMHgxMDAwMDAwMAorI2RlZmluZSBCVUZNR1JfUlhfTUJfQUxMT0NfUkVTUAkJMHgwMDAwNDQyMAorI2RlZmluZSBCVUZNR1JfVFhfTUJfQUxMT0NfUkVRCQkweDAwMDA0NDI0CisjZGVmaW5lIEJVRk1HUl9UWF9NQl9BTExPQ19SRVNQCQkweDAwMDA0NDI4CisjZGVmaW5lIEJVRk1HUl9ETUFfREVTQ19QT09MX0FERFIJMHgwMDAwNDQyYworI2RlZmluZSBCVUZNR1JfRE1BX0RFU0NfUE9PTF9TSVpFCTB4MDAwMDQ0MzAKKyNkZWZpbmUgQlVGTUdSX0RNQV9MT1dfV0FURVIJCTB4MDAwMDQ0MzQKKyNkZWZpbmUgIERFRkFVTFRfRE1BX0xPV19XQVRFUgkJIDB4MDAwMDAwMDUKKyNkZWZpbmUgQlVGTUdSX0RNQV9ISUdIX1dBVEVSCQkweDAwMDA0NDM4CisjZGVmaW5lICBERUZBVUxUX0RNQV9ISUdIX1dBVEVSCQkgMHgwMDAwMDAwYQorI2RlZmluZSBCVUZNR1JfUlhfRE1BX0FMTE9DX1JFUQkJMHgwMDAwNDQzYworI2RlZmluZSBCVUZNR1JfUlhfRE1BX0FMTE9DX1JFU1AJMHgwMDAwNDQ0MAorI2RlZmluZSBCVUZNR1JfVFhfRE1BX0FMTE9DX1JFUQkJMHgwMDAwNDQ0NAorI2RlZmluZSBCVUZNR1JfVFhfRE1BX0FMTE9DX1JFU1AJMHgwMDAwNDQ0OAorI2RlZmluZSBCVUZNR1JfSFdESUFHXzAJCQkweDAwMDA0NDRjCisjZGVmaW5lIEJVRk1HUl9IV0RJQUdfMQkJCTB4MDAwMDQ0NTAKKyNkZWZpbmUgQlVGTUdSX0hXRElBR18yCQkJMHgwMDAwNDQ1NAorLyogMHg0NDU4IC0tPiAweDQ4MDAgdW51c2VkICovCisKKy8qIFJlYWQgRE1BIGNvbnRyb2wgcmVnaXN0ZXJzICovCisjZGVmaW5lIFJETUFDX01PREUJCQkweDAwMDA0ODAwCisjZGVmaW5lICBSRE1BQ19NT0RFX1JFU0VUCQkgMHgwMDAwMDAwMQorI2RlZmluZSAgUkRNQUNfTU9ERV9FTkFCTEUJCSAweDAwMDAwMDAyCisjZGVmaW5lICBSRE1BQ19NT0RFX1RHVEFCT1JUX0VOQUIJIDB4MDAwMDAwMDQKKyNkZWZpbmUgIFJETUFDX01PREVfTVNUQUJPUlRfRU5BQgkgMHgwMDAwMDAwOAorI2RlZmluZSAgUkRNQUNfTU9ERV9QQVJJVFlFUlJfRU5BQgkgMHgwMDAwMDAxMAorI2RlZmluZSAgUkRNQUNfTU9ERV9BRERST0ZMT1dfRU5BQgkgMHgwMDAwMDAyMAorI2RlZmluZSAgUkRNQUNfTU9ERV9GSUZPT0ZMT1dfRU5BQgkgMHgwMDAwMDA0MAorI2RlZmluZSAgUkRNQUNfTU9ERV9GSUZPVVJVTl9FTkFCCSAweDAwMDAwMDgwCisjZGVmaW5lICBSRE1BQ19NT0RFX0ZJRk9PUkVBRF9FTkFCCSAweDAwMDAwMTAwCisjZGVmaW5lICBSRE1BQ19NT0RFX0xOR1JFQURfRU5BQgkgMHgwMDAwMDIwMAorI2RlZmluZSAgUkRNQUNfTU9ERV9TUExJVF9FTkFCTEUJIDB4MDAwMDA4MDAKKyNkZWZpbmUgIFJETUFDX01PREVfU1BMSVRfUkVTRVQJCSAweDAwMDAxMDAwCisjZGVmaW5lICBSRE1BQ19NT0RFX0ZJRk9fU0laRV8xMjgJIDB4MDAwMjAwMDAKKyNkZWZpbmUgIFJETUFDX01PREVfRklGT19MT05HX0JVUlNUCSAweDAwMDMwMDAwCisjZGVmaW5lIFJETUFDX1NUQVRVUwkJCTB4MDAwMDQ4MDQKKyNkZWZpbmUgIFJETUFDX1NUQVRVU19UR1RBQk9SVAkJIDB4MDAwMDAwMDQKKyNkZWZpbmUgIFJETUFDX1NUQVRVU19NU1RBQk9SVAkJIDB4MDAwMDAwMDgKKyNkZWZpbmUgIFJETUFDX1NUQVRVU19QQVJJVFlFUlIJCSAweDAwMDAwMDEwCisjZGVmaW5lICBSRE1BQ19TVEFUVVNfQUREUk9GTE9XCQkgMHgwMDAwMDAyMAorI2RlZmluZSAgUkRNQUNfU1RBVFVTX0ZJRk9PRkxPVwkJIDB4MDAwMDAwNDAKKyNkZWZpbmUgIFJETUFDX1NUQVRVU19GSUZPVVJVTgkJIDB4MDAwMDAwODAKKyNkZWZpbmUgIFJETUFDX1NUQVRVU19GSUZPT1JFQUQJCSAweDAwMDAwMTAwCisjZGVmaW5lICBSRE1BQ19TVEFUVVNfTE5HUkVBRAkJIDB4MDAwMDAyMDAKKy8qIDB4NDgwOCAtLT4gMHg0YzAwIHVudXNlZCAqLworCisvKiBXcml0ZSBETUEgY29udHJvbCByZWdpc3RlcnMgKi8KKyNkZWZpbmUgV0RNQUNfTU9ERQkJCTB4MDAwMDRjMDAKKyNkZWZpbmUgIFdETUFDX01PREVfUkVTRVQJCSAweDAwMDAwMDAxCisjZGVmaW5lICBXRE1BQ19NT0RFX0VOQUJMRQkJIDB4MDAwMDAwMDIKKyNkZWZpbmUgIFdETUFDX01PREVfVEdUQUJPUlRfRU5BQgkgMHgwMDAwMDAwNAorI2RlZmluZSAgV0RNQUNfTU9ERV9NU1RBQk9SVF9FTkFCCSAweDAwMDAwMDA4CisjZGVmaW5lICBXRE1BQ19NT0RFX1BBUklUWUVSUl9FTkFCCSAweDAwMDAwMDEwCisjZGVmaW5lICBXRE1BQ19NT0RFX0FERFJPRkxPV19FTkFCCSAweDAwMDAwMDIwCisjZGVmaW5lICBXRE1BQ19NT0RFX0ZJRk9PRkxPV19FTkFCCSAweDAwMDAwMDQwCisjZGVmaW5lICBXRE1BQ19NT0RFX0ZJRk9VUlVOX0VOQUIJIDB4MDAwMDAwODAKKyNkZWZpbmUgIFdETUFDX01PREVfRklGT09SRUFEX0VOQUIJIDB4MDAwMDAxMDAKKyNkZWZpbmUgIFdETUFDX01PREVfTE5HUkVBRF9FTkFCCSAweDAwMDAwMjAwCisjZGVmaW5lICBXRE1BQ19NT0RFX1JYX0FDQ0VMCSAJIDB4MDAwMDA0MDAKKyNkZWZpbmUgV0RNQUNfU1RBVFVTCQkJMHgwMDAwNGMwNAorI2RlZmluZSAgV0RNQUNfU1RBVFVTX1RHVEFCT1JUCQkgMHgwMDAwMDAwNAorI2RlZmluZSAgV0RNQUNfU1RBVFVTX01TVEFCT1JUCQkgMHgwMDAwMDAwOAorI2RlZmluZSAgV0RNQUNfU1RBVFVTX1BBUklUWUVSUgkJIDB4MDAwMDAwMTAKKyNkZWZpbmUgIFdETUFDX1NUQVRVU19BRERST0ZMT1cJCSAweDAwMDAwMDIwCisjZGVmaW5lICBXRE1BQ19TVEFUVVNfRklGT09GTE9XCQkgMHgwMDAwMDA0MAorI2RlZmluZSAgV0RNQUNfU1RBVFVTX0ZJRk9VUlVOCQkgMHgwMDAwMDA4MAorI2RlZmluZSAgV0RNQUNfU1RBVFVTX0ZJRk9PUkVBRAkJIDB4MDAwMDAxMDAKKyNkZWZpbmUgIFdETUFDX1NUQVRVU19MTkdSRUFECQkgMHgwMDAwMDIwMAorLyogMHg0YzA4IC0tPiAweDUwMDAgdW51c2VkICovCisKKy8qIFBlci1jcHUgcmVnaXN0ZXIgb2Zmc2V0cyAoYXJtOSkgKi8KKyNkZWZpbmUgQ1BVX01PREUJCQkweDAwMDAwMDAwCisjZGVmaW5lICBDUFVfTU9ERV9SRVNFVAkJCSAweDAwMDAwMDAxCisjZGVmaW5lICBDUFVfTU9ERV9IQUxUCQkJIDB4MDAwMDA0MDAKKyNkZWZpbmUgQ1BVX1NUQVRFCQkJMHgwMDAwMDAwNAorI2RlZmluZSBDUFVfRVZUTUFTSwkJCTB4MDAwMDAwMDgKKy8qIDB4YyAtLT4gMHgxYyByZXNlcnZlZCAqLworI2RlZmluZSBDUFVfUEMJCQkJMHgwMDAwMDAxYworI2RlZmluZSBDUFVfSU5TTgkJCTB4MDAwMDAwMjAKKyNkZWZpbmUgQ1BVX1NQQURfVUZMT1cJCQkweDAwMDAwMDI0CisjZGVmaW5lIENQVV9XRE9HX0NMRUFSCQkJMHgwMDAwMDAyOAorI2RlZmluZSBDUFVfV0RPR19WRUNUT1IJCQkweDAwMDAwMDJjCisjZGVmaW5lIENQVV9XRE9HX1BDCQkJMHgwMDAwMDAzMAorI2RlZmluZSBDUFVfSFdfQlAJCQkweDAwMDAwMDM0CisvKiAweDM4IC0tPiAweDQ0IHVudXNlZCAqLworI2RlZmluZSBDUFVfV0RPR19TQVZFRF9TVEFURQkJMHgwMDAwMDA0NAorI2RlZmluZSBDUFVfTEFTVF9CUkFOQ0hfQUREUgkJMHgwMDAwMDA0OAorI2RlZmluZSBDUFVfU1BBRF9VRkxPV19TRVQJCTB4MDAwMDAwNGMKKy8qIDB4NTAgLS0+IDB4MjAwIHVudXNlZCAqLworI2RlZmluZSBDUFVfUjAJCQkJMHgwMDAwMDIwMAorI2RlZmluZSBDUFVfUjEJCQkJMHgwMDAwMDIwNAorI2RlZmluZSBDUFVfUjIJCQkJMHgwMDAwMDIwOAorI2RlZmluZSBDUFVfUjMJCQkJMHgwMDAwMDIwYworI2RlZmluZSBDUFVfUjQJCQkJMHgwMDAwMDIxMAorI2RlZmluZSBDUFVfUjUJCQkJMHgwMDAwMDIxNAorI2RlZmluZSBDUFVfUjYJCQkJMHgwMDAwMDIxOAorI2RlZmluZSBDUFVfUjcJCQkJMHgwMDAwMDIxYworI2RlZmluZSBDUFVfUjgJCQkJMHgwMDAwMDIyMAorI2RlZmluZSBDUFVfUjkJCQkJMHgwMDAwMDIyNAorI2RlZmluZSBDUFVfUjEwCQkJCTB4MDAwMDAyMjgKKyNkZWZpbmUgQ1BVX1IxMQkJCQkweDAwMDAwMjJjCisjZGVmaW5lIENQVV9SMTIJCQkJMHgwMDAwMDIzMAorI2RlZmluZSBDUFVfUjEzCQkJCTB4MDAwMDAyMzQKKyNkZWZpbmUgQ1BVX1IxNAkJCQkweDAwMDAwMjM4CisjZGVmaW5lIENQVV9SMTUJCQkJMHgwMDAwMDIzYworI2RlZmluZSBDUFVfUjE2CQkJCTB4MDAwMDAyNDAKKyNkZWZpbmUgQ1BVX1IxNwkJCQkweDAwMDAwMjQ0CisjZGVmaW5lIENQVV9SMTgJCQkJMHgwMDAwMDI0OAorI2RlZmluZSBDUFVfUjE5CQkJCTB4MDAwMDAyNGMKKyNkZWZpbmUgQ1BVX1IyMAkJCQkweDAwMDAwMjUwCisjZGVmaW5lIENQVV9SMjEJCQkJMHgwMDAwMDI1NAorI2RlZmluZSBDUFVfUjIyCQkJCTB4MDAwMDAyNTgKKyNkZWZpbmUgQ1BVX1IyMwkJCQkweDAwMDAwMjVjCisjZGVmaW5lIENQVV9SMjQJCQkJMHgwMDAwMDI2MAorI2RlZmluZSBDUFVfUjI1CQkJCTB4MDAwMDAyNjQKKyNkZWZpbmUgQ1BVX1IyNgkJCQkweDAwMDAwMjY4CisjZGVmaW5lIENQVV9SMjcJCQkJMHgwMDAwMDI2YworI2RlZmluZSBDUFVfUjI4CQkJCTB4MDAwMDAyNzAKKyNkZWZpbmUgQ1BVX1IyOQkJCQkweDAwMDAwMjc0CisjZGVmaW5lIENQVV9SMzAJCQkJMHgwMDAwMDI3OAorI2RlZmluZSBDUFVfUjMxCQkJCTB4MDAwMDAyN2MKKy8qIDB4MjgwIC0tPiAweDQwMCB1bnVzZWQgKi8KKworI2RlZmluZSBSWF9DUFVfQkFTRQkJCTB4MDAwMDUwMDAKKyNkZWZpbmUgVFhfQ1BVX0JBU0UJCQkweDAwMDA1NDAwCisKKy8qIE1haWxib3hlcyAqLworI2RlZmluZSBHUkNNQk9YX0lOVEVSUlVQVF8wCQkweDAwMDA1ODAwIC8qIDY0LWJpdCAqLworI2RlZmluZSBHUkNNQk9YX0lOVEVSUlVQVF8xCQkweDAwMDA1ODA4IC8qIDY0LWJpdCAqLworI2RlZmluZSBHUkNNQk9YX0lOVEVSUlVQVF8yCQkweDAwMDA1ODEwIC8qIDY0LWJpdCAqLworI2RlZmluZSBHUkNNQk9YX0lOVEVSUlVQVF8zCQkweDAwMDA1ODE4IC8qIDY0LWJpdCAqLworI2RlZmluZSBHUkNNQk9YX0dFTkVSQUxfMAkJMHgwMDAwNTgyMCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgR1JDTUJPWF9HRU5FUkFMXzEJCTB4MDAwMDU4MjggLyogNjQtYml0ICovCisjZGVmaW5lIEdSQ01CT1hfR0VORVJBTF8yCQkweDAwMDA1ODMwIC8qIDY0LWJpdCAqLworI2RlZmluZSBHUkNNQk9YX0dFTkVSQUxfMwkJMHgwMDAwNTgzOCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgR1JDTUJPWF9HRU5FUkFMXzQJCTB4MDAwMDU4NDAgLyogNjQtYml0ICovCisjZGVmaW5lIEdSQ01CT1hfR0VORVJBTF81CQkweDAwMDA1ODQ4IC8qIDY0LWJpdCAqLworI2RlZmluZSBHUkNNQk9YX0dFTkVSQUxfNgkJMHgwMDAwNTg1MCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgR1JDTUJPWF9HRU5FUkFMXzcJCTB4MDAwMDU4NTggLyogNjQtYml0ICovCisjZGVmaW5lIEdSQ01CT1hfUkVMT0FEX1NUQVQJCTB4MDAwMDU4NjAgLyogNjQtYml0ICovCisjZGVmaW5lIEdSQ01CT1hfUkNWU1REX1BST0RfSURYCQkweDAwMDA1ODY4IC8qIDY0LWJpdCAqLworI2RlZmluZSBHUkNNQk9YX1JDVkpVTUJPX1BST0RfSURYCTB4MDAwMDU4NzAgLyogNjQtYml0ICovCisjZGVmaW5lIEdSQ01CT1hfUkNWTUlOSV9QUk9EX0lEWAkweDAwMDA1ODc4IC8qIDY0LWJpdCAqLworI2RlZmluZSBHUkNNQk9YX1JDVlJFVF9DT05fSURYXzAJMHgwMDAwNTg4MCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgR1JDTUJPWF9SQ1ZSRVRfQ09OX0lEWF8xCTB4MDAwMDU4ODggLyogNjQtYml0ICovCisjZGVmaW5lIEdSQ01CT1hfUkNWUkVUX0NPTl9JRFhfMgkweDAwMDA1ODkwIC8qIDY0LWJpdCAqLworI2RlZmluZSBHUkNNQk9YX1JDVlJFVF9DT05fSURYXzMJMHgwMDAwNTg5OCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgR1JDTUJPWF9SQ1ZSRVRfQ09OX0lEWF80CTB4MDAwMDU4YTAgLyogNjQtYml0ICovCisjZGVmaW5lIEdSQ01CT1hfUkNWUkVUX0NPTl9JRFhfNQkweDAwMDA1OGE4IC8qIDY0LWJpdCAqLworI2RlZmluZSBHUkNNQk9YX1JDVlJFVF9DT05fSURYXzYJMHgwMDAwNThiMCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgR1JDTUJPWF9SQ1ZSRVRfQ09OX0lEWF83CTB4MDAwMDU4YjggLyogNjQtYml0ICovCisjZGVmaW5lIEdSQ01CT1hfUkNWUkVUX0NPTl9JRFhfOAkweDAwMDA1OGMwIC8qIDY0LWJpdCAqLworI2RlZmluZSBHUkNNQk9YX1JDVlJFVF9DT05fSURYXzkJMHgwMDAwNThjOCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgR1JDTUJPWF9SQ1ZSRVRfQ09OX0lEWF8xMAkweDAwMDA1OGQwIC8qIDY0LWJpdCAqLworI2RlZmluZSBHUkNNQk9YX1JDVlJFVF9DT05fSURYXzExCTB4MDAwMDU4ZDggLyogNjQtYml0ICovCisjZGVmaW5lIEdSQ01CT1hfUkNWUkVUX0NPTl9JRFhfMTIJMHgwMDAwNThlMCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgR1JDTUJPWF9SQ1ZSRVRfQ09OX0lEWF8xMwkweDAwMDA1OGU4IC8qIDY0LWJpdCAqLworI2RlZmluZSBHUkNNQk9YX1JDVlJFVF9DT05fSURYXzE0CTB4MDAwMDU4ZjAgLyogNjQtYml0ICovCisjZGVmaW5lIEdSQ01CT1hfUkNWUkVUX0NPTl9JRFhfMTUJMHgwMDAwNThmOCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgR1JDTUJPWF9TTkRIT1NUX1BST0RfSURYXzAJMHgwMDAwNTkwMCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgR1JDTUJPWF9TTkRIT1NUX1BST0RfSURYXzEJMHgwMDAwNTkwOCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgR1JDTUJPWF9TTkRIT1NUX1BST0RfSURYXzIJMHgwMDAwNTkxMCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgR1JDTUJPWF9TTkRIT1NUX1BST0RfSURYXzMJMHgwMDAwNTkxOCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgR1JDTUJPWF9TTkRIT1NUX1BST0RfSURYXzQJMHgwMDAwNTkyMCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgR1JDTUJPWF9TTkRIT1NUX1BST0RfSURYXzUJMHgwMDAwNTkyOCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgR1JDTUJPWF9TTkRIT1NUX1BST0RfSURYXzYJMHgwMDAwNTkzMCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgR1JDTUJPWF9TTkRIT1NUX1BST0RfSURYXzcJMHgwMDAwNTkzOCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgR1JDTUJPWF9TTkRIT1NUX1BST0RfSURYXzgJMHgwMDAwNTk0MCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgR1JDTUJPWF9TTkRIT1NUX1BST0RfSURYXzkJMHgwMDAwNTk0OCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgR1JDTUJPWF9TTkRIT1NUX1BST0RfSURYXzEwCTB4MDAwMDU5NTAgLyogNjQtYml0ICovCisjZGVmaW5lIEdSQ01CT1hfU05ESE9TVF9QUk9EX0lEWF8xMQkweDAwMDA1OTU4IC8qIDY0LWJpdCAqLworI2RlZmluZSBHUkNNQk9YX1NOREhPU1RfUFJPRF9JRFhfMTIJMHgwMDAwNTk2MCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgR1JDTUJPWF9TTkRIT1NUX1BST0RfSURYXzEzCTB4MDAwMDU5NjggLyogNjQtYml0ICovCisjZGVmaW5lIEdSQ01CT1hfU05ESE9TVF9QUk9EX0lEWF8xNAkweDAwMDA1OTcwIC8qIDY0LWJpdCAqLworI2RlZmluZSBHUkNNQk9YX1NOREhPU1RfUFJPRF9JRFhfMTUJMHgwMDAwNTk3OCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgR1JDTUJPWF9TTkROSUNfUFJPRF9JRFhfMAkweDAwMDA1OTgwIC8qIDY0LWJpdCAqLworI2RlZmluZSBHUkNNQk9YX1NORE5JQ19QUk9EX0lEWF8xCTB4MDAwMDU5ODggLyogNjQtYml0ICovCisjZGVmaW5lIEdSQ01CT1hfU05ETklDX1BST0RfSURYXzIJMHgwMDAwNTk5MCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgR1JDTUJPWF9TTkROSUNfUFJPRF9JRFhfMwkweDAwMDA1OTk4IC8qIDY0LWJpdCAqLworI2RlZmluZSBHUkNNQk9YX1NORE5JQ19QUk9EX0lEWF80CTB4MDAwMDU5YTAgLyogNjQtYml0ICovCisjZGVmaW5lIEdSQ01CT1hfU05ETklDX1BST0RfSURYXzUJMHgwMDAwNTlhOCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgR1JDTUJPWF9TTkROSUNfUFJPRF9JRFhfNgkweDAwMDA1OWIwIC8qIDY0LWJpdCAqLworI2RlZmluZSBHUkNNQk9YX1NORE5JQ19QUk9EX0lEWF83CTB4MDAwMDU5YjggLyogNjQtYml0ICovCisjZGVmaW5lIEdSQ01CT1hfU05ETklDX1BST0RfSURYXzgJMHgwMDAwNTljMCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgR1JDTUJPWF9TTkROSUNfUFJPRF9JRFhfOQkweDAwMDA1OWM4IC8qIDY0LWJpdCAqLworI2RlZmluZSBHUkNNQk9YX1NORE5JQ19QUk9EX0lEWF8xMAkweDAwMDA1OWQwIC8qIDY0LWJpdCAqLworI2RlZmluZSBHUkNNQk9YX1NORE5JQ19QUk9EX0lEWF8xMQkweDAwMDA1OWQ4IC8qIDY0LWJpdCAqLworI2RlZmluZSBHUkNNQk9YX1NORE5JQ19QUk9EX0lEWF8xMgkweDAwMDA1OWUwIC8qIDY0LWJpdCAqLworI2RlZmluZSBHUkNNQk9YX1NORE5JQ19QUk9EX0lEWF8xMwkweDAwMDA1OWU4IC8qIDY0LWJpdCAqLworI2RlZmluZSBHUkNNQk9YX1NORE5JQ19QUk9EX0lEWF8xNAkweDAwMDA1OWYwIC8qIDY0LWJpdCAqLworI2RlZmluZSBHUkNNQk9YX1NORE5JQ19QUk9EX0lEWF8xNQkweDAwMDA1OWY4IC8qIDY0LWJpdCAqLworI2RlZmluZSBHUkNNQk9YX0hJR0hfUFJJT19FVl9WRUNUT1IJMHgwMDAwNWEwMAorI2RlZmluZSBHUkNNQk9YX0hJR0hfUFJJT19FVl9NQVNLCTB4MDAwMDVhMDQKKyNkZWZpbmUgR1JDTUJPWF9MT1dfUFJJT19FVl9WRUMJCTB4MDAwMDVhMDgKKyNkZWZpbmUgR1JDTUJPWF9MT1dfUFJJT19FVl9NQVNLCTB4MDAwMDVhMGMKKy8qIDB4NWExMCAtLT4gMHg1YzAwICovCisKKy8qIEZsb3cgVGhyb3VnaCBxdWV1ZXMgKi8KKyNkZWZpbmUgRlRRX1JFU0VUCQkJMHgwMDAwNWMwMAorLyogMHg1YzA0IC0tPiAweDVjMTAgdW51c2VkICovCisjZGVmaW5lIEZUUV9ETUFfTk9STV9SRUFEX0NUTAkJMHgwMDAwNWMxMAorI2RlZmluZSBGVFFfRE1BX05PUk1fUkVBRF9GVUxMX0NOVAkweDAwMDA1YzE0CisjZGVmaW5lIEZUUV9ETUFfTk9STV9SRUFEX0ZJRk9fRU5RREVRCTB4MDAwMDVjMTgKKyNkZWZpbmUgRlRRX0RNQV9OT1JNX1JFQURfV1JJVEVfUEVFSwkweDAwMDA1YzFjCisjZGVmaW5lIEZUUV9ETUFfSElHSF9SRUFEX0NUTAkJMHgwMDAwNWMyMAorI2RlZmluZSBGVFFfRE1BX0hJR0hfUkVBRF9GVUxMX0NOVAkweDAwMDA1YzI0CisjZGVmaW5lIEZUUV9ETUFfSElHSF9SRUFEX0ZJRk9fRU5RREVRCTB4MDAwMDVjMjgKKyNkZWZpbmUgRlRRX0RNQV9ISUdIX1JFQURfV1JJVEVfUEVFSwkweDAwMDA1YzJjCisjZGVmaW5lIEZUUV9ETUFfQ09NUF9ESVNDX0NUTAkJMHgwMDAwNWMzMAorI2RlZmluZSBGVFFfRE1BX0NPTVBfRElTQ19GVUxMX0NOVAkweDAwMDA1YzM0CisjZGVmaW5lIEZUUV9ETUFfQ09NUF9ESVNDX0ZJRk9fRU5RREVRCTB4MDAwMDVjMzgKKyNkZWZpbmUgRlRRX0RNQV9DT01QX0RJU0NfV1JJVEVfUEVFSwkweDAwMDA1YzNjCisjZGVmaW5lIEZUUV9TRU5EX0JEX0NPTVBfQ1RMCQkweDAwMDA1YzQwCisjZGVmaW5lIEZUUV9TRU5EX0JEX0NPTVBfRlVMTF9DTlQJMHgwMDAwNWM0NAorI2RlZmluZSBGVFFfU0VORF9CRF9DT01QX0ZJRk9fRU5RREVRCTB4MDAwMDVjNDgKKyNkZWZpbmUgRlRRX1NFTkRfQkRfQ09NUF9XUklURV9QRUVLCTB4MDAwMDVjNGMKKyNkZWZpbmUgRlRRX1NFTkRfREFUQV9JTklUX0NUTAkJMHgwMDAwNWM1MAorI2RlZmluZSBGVFFfU0VORF9EQVRBX0lOSVRfRlVMTF9DTlQJMHgwMDAwNWM1NAorI2RlZmluZSBGVFFfU0VORF9EQVRBX0lOSVRfRklGT19FTlFERVEJMHgwMDAwNWM1OAorI2RlZmluZSBGVFFfU0VORF9EQVRBX0lOSVRfV1JJVEVfUEVFSwkweDAwMDA1YzVjCisjZGVmaW5lIEZUUV9ETUFfTk9STV9XUklURV9DVEwJCTB4MDAwMDVjNjAKKyNkZWZpbmUgRlRRX0RNQV9OT1JNX1dSSVRFX0ZVTExfQ05UCTB4MDAwMDVjNjQKKyNkZWZpbmUgRlRRX0RNQV9OT1JNX1dSSVRFX0ZJRk9fRU5RREVRCTB4MDAwMDVjNjgKKyNkZWZpbmUgRlRRX0RNQV9OT1JNX1dSSVRFX1dSSVRFX1BFRUsJMHgwMDAwNWM2YworI2RlZmluZSBGVFFfRE1BX0hJR0hfV1JJVEVfQ1RMCQkweDAwMDA1YzcwCisjZGVmaW5lIEZUUV9ETUFfSElHSF9XUklURV9GVUxMX0NOVAkweDAwMDA1Yzc0CisjZGVmaW5lIEZUUV9ETUFfSElHSF9XUklURV9GSUZPX0VOUURFUQkweDAwMDA1Yzc4CisjZGVmaW5lIEZUUV9ETUFfSElHSF9XUklURV9XUklURV9QRUVLCTB4MDAwMDVjN2MKKyNkZWZpbmUgRlRRX1NXVFlQRTFfQ1RMCQkJMHgwMDAwNWM4MAorI2RlZmluZSBGVFFfU1dUWVBFMV9GVUxMX0NOVAkJMHgwMDAwNWM4NAorI2RlZmluZSBGVFFfU1dUWVBFMV9GSUZPX0VOUURFUQkJMHgwMDAwNWM4OAorI2RlZmluZSBGVFFfU1dUWVBFMV9XUklURV9QRUVLCQkweDAwMDA1YzhjCisjZGVmaW5lIEZUUV9TRU5EX0RBVEFfQ09NUF9DVEwJCTB4MDAwMDVjOTAKKyNkZWZpbmUgRlRRX1NFTkRfREFUQV9DT01QX0ZVTExfQ05UCTB4MDAwMDVjOTQKKyNkZWZpbmUgRlRRX1NFTkRfREFUQV9DT01QX0ZJRk9fRU5RREVRCTB4MDAwMDVjOTgKKyNkZWZpbmUgRlRRX1NFTkRfREFUQV9DT01QX1dSSVRFX1BFRUsJMHgwMDAwNWM5YworI2RlZmluZSBGVFFfSE9TVF9DT0FMX0NUTAkJMHgwMDAwNWNhMAorI2RlZmluZSBGVFFfSE9TVF9DT0FMX0ZVTExfQ05UCQkweDAwMDA1Y2E0CisjZGVmaW5lIEZUUV9IT1NUX0NPQUxfRklGT19FTlFERVEJMHgwMDAwNWNhOAorI2RlZmluZSBGVFFfSE9TVF9DT0FMX1dSSVRFX1BFRUsJMHgwMDAwNWNhYworI2RlZmluZSBGVFFfTUFDX1RYX0NUTAkJCTB4MDAwMDVjYjAKKyNkZWZpbmUgRlRRX01BQ19UWF9GVUxMX0NOVAkJMHgwMDAwNWNiNAorI2RlZmluZSBGVFFfTUFDX1RYX0ZJRk9fRU5RREVRCQkweDAwMDA1Y2I4CisjZGVmaW5lIEZUUV9NQUNfVFhfV1JJVEVfUEVFSwkJMHgwMDAwNWNiYworI2RlZmluZSBGVFFfTUJfRlJFRV9DVEwJCQkweDAwMDA1Y2MwCisjZGVmaW5lIEZUUV9NQl9GUkVFX0ZVTExfQ05UCQkweDAwMDA1Y2M0CisjZGVmaW5lIEZUUV9NQl9GUkVFX0ZJRk9fRU5RREVRCQkweDAwMDA1Y2M4CisjZGVmaW5lIEZUUV9NQl9GUkVFX1dSSVRFX1BFRUsJCTB4MDAwMDVjY2MKKyNkZWZpbmUgRlRRX1JDVkJEX0NPTVBfQ1RMCQkweDAwMDA1Y2QwCisjZGVmaW5lIEZUUV9SQ1ZCRF9DT01QX0ZVTExfQ05UCQkweDAwMDA1Y2Q0CisjZGVmaW5lIEZUUV9SQ1ZCRF9DT01QX0ZJRk9fRU5RREVRCTB4MDAwMDVjZDgKKyNkZWZpbmUgRlRRX1JDVkJEX0NPTVBfV1JJVEVfUEVFSwkweDAwMDA1Y2RjCisjZGVmaW5lIEZUUV9SQ1ZMU1RfUExNVF9DVEwJCTB4MDAwMDVjZTAKKyNkZWZpbmUgRlRRX1JDVkxTVF9QTE1UX0ZVTExfQ05UCTB4MDAwMDVjZTQKKyNkZWZpbmUgRlRRX1JDVkxTVF9QTE1UX0ZJRk9fRU5RREVRCTB4MDAwMDVjZTgKKyNkZWZpbmUgRlRRX1JDVkxTVF9QTE1UX1dSSVRFX1BFRUsJMHgwMDAwNWNlYworI2RlZmluZSBGVFFfUkNWREFUQV9JTklfQ1RMCQkweDAwMDA1Y2YwCisjZGVmaW5lIEZUUV9SQ1ZEQVRBX0lOSV9GVUxMX0NOVAkweDAwMDA1Y2Y0CisjZGVmaW5lIEZUUV9SQ1ZEQVRBX0lOSV9GSUZPX0VOUURFUQkweDAwMDA1Y2Y4CisjZGVmaW5lIEZUUV9SQ1ZEQVRBX0lOSV9XUklURV9QRUVLCTB4MDAwMDVjZmMKKyNkZWZpbmUgRlRRX1JDVkRBVEFfQ09NUF9DVEwJCTB4MDAwMDVkMDAKKyNkZWZpbmUgRlRRX1JDVkRBVEFfQ09NUF9GVUxMX0NOVAkweDAwMDA1ZDA0CisjZGVmaW5lIEZUUV9SQ1ZEQVRBX0NPTVBfRklGT19FTlFERVEJMHgwMDAwNWQwOAorI2RlZmluZSBGVFFfUkNWREFUQV9DT01QX1dSSVRFX1BFRUsJMHgwMDAwNWQwYworI2RlZmluZSBGVFFfU1dUWVBFMl9DVEwJCQkweDAwMDA1ZDEwCisjZGVmaW5lIEZUUV9TV1RZUEUyX0ZVTExfQ05UCQkweDAwMDA1ZDE0CisjZGVmaW5lIEZUUV9TV1RZUEUyX0ZJRk9fRU5RREVRCQkweDAwMDA1ZDE4CisjZGVmaW5lIEZUUV9TV1RZUEUyX1dSSVRFX1BFRUsJCTB4MDAwMDVkMWMKKy8qIDB4NWQyMCAtLT4gMHg2MDAwIHVudXNlZCAqLworCisvKiBNZXNzYWdlIHNpZ25hbGVkIGludGVycnVwdCByZWdpc3RlcnMgKi8KKyNkZWZpbmUgTVNHSU5UX01PREUJCQkweDAwMDA2MDAwCisjZGVmaW5lICBNU0dJTlRfTU9ERV9SRVNFVAkJIDB4MDAwMDAwMDEKKyNkZWZpbmUgIE1TR0lOVF9NT0RFX0VOQUJMRQkJIDB4MDAwMDAwMDIKKyNkZWZpbmUgTVNHSU5UX1NUQVRVUwkJCTB4MDAwMDYwMDQKKyNkZWZpbmUgTVNHSU5UX0ZJRk8JCQkweDAwMDA2MDA4CisvKiAweDYwMGMgLS0+IDB4NjQwMCB1bnVzZWQgKi8KKworLyogRE1BIGNvbXBsZXRpb24gcmVnaXN0ZXJzICovCisjZGVmaW5lIERNQUNfTU9ERQkJCTB4MDAwMDY0MDAKKyNkZWZpbmUgIERNQUNfTU9ERV9SRVNFVAkJIDB4MDAwMDAwMDEKKyNkZWZpbmUgIERNQUNfTU9ERV9FTkFCTEUJCSAweDAwMDAwMDAyCisvKiAweDY0MDQgLS0+IDB4NjgwMCB1bnVzZWQgKi8KKworLyogR1JDIHJlZ2lzdGVycyAqLworI2RlZmluZSBHUkNfTU9ERQkJCTB4MDAwMDY4MDAKKyNkZWZpbmUgIEdSQ19NT0RFX1VQRF9PTl9DT0FMCQkweDAwMDAwMDAxCisjZGVmaW5lICBHUkNfTU9ERV9CU1dBUF9OT05GUk1fREFUQQkweDAwMDAwMDAyCisjZGVmaW5lICBHUkNfTU9ERV9XU1dBUF9OT05GUk1fREFUQQkweDAwMDAwMDA0CisjZGVmaW5lICBHUkNfTU9ERV9CU1dBUF9EQVRBCQkweDAwMDAwMDEwCisjZGVmaW5lICBHUkNfTU9ERV9XU1dBUF9EQVRBCQkweDAwMDAwMDIwCisjZGVmaW5lICBHUkNfTU9ERV9TUExJVEhEUgkJMHgwMDAwMDEwMAorI2RlZmluZSAgR1JDX01PREVfTk9GUk1fQ1JBQ0tJTkcJMHgwMDAwMDIwMAorI2RlZmluZSAgR1JDX01PREVfSU5DTF9DUkMJCTB4MDAwMDA0MDAKKyNkZWZpbmUgIEdSQ19NT0RFX0FMTE9XX0JBRF9GUk1TCTB4MDAwMDA4MDAKKyNkZWZpbmUgIEdSQ19NT0RFX05PSVJRX09OX1NFTkRTCTB4MDAwMDIwMDAKKyNkZWZpbmUgIEdSQ19NT0RFX05PSVJRX09OX1JDVgkJMHgwMDAwNDAwMAorI2RlZmluZSAgR1JDX01PREVfRk9SQ0VfUENJMzJCSVQJMHgwMDAwODAwMAorI2RlZmluZSAgR1JDX01PREVfSE9TVF9TVEFDS1VQCQkweDAwMDEwMDAwCisjZGVmaW5lICBHUkNfTU9ERV9IT1NUX1NFTkRCRFMJCTB4MDAwMjAwMDAKKyNkZWZpbmUgIEdSQ19NT0RFX05PX1RYX1BIRFJfQ1NVTQkweDAwMTAwMDAwCisjZGVmaW5lICBHUkNfTU9ERV9OT19SWF9QSERSX0NTVU0JMHgwMDgwMDAwMAorI2RlZmluZSAgR1JDX01PREVfSVJRX09OX1RYX0NQVV9BVFROCTB4MDEwMDAwMDAKKyNkZWZpbmUgIEdSQ19NT0RFX0lSUV9PTl9SWF9DUFVfQVRUTgkweDAyMDAwMDAwCisjZGVmaW5lICBHUkNfTU9ERV9JUlFfT05fTUFDX0FUVE4JMHgwNDAwMDAwMAorI2RlZmluZSAgR1JDX01PREVfSVJRX09OX0RNQV9BVFROCTB4MDgwMDAwMDAKKyNkZWZpbmUgIEdSQ19NT0RFX0lSUV9PTl9GTE9XX0FUVE4JMHgxMDAwMDAwMAorI2RlZmluZSAgR1JDX01PREVfNFhfTklDX1NFTkRfUklOR1MJMHgyMDAwMDAwMAorI2RlZmluZSAgR1JDX01PREVfTUNBU1RfRlJNX0VOQUJMRQkweDQwMDAwMDAwCisjZGVmaW5lIEdSQ19NSVNDX0NGRwkJCTB4MDAwMDY4MDQKKyNkZWZpbmUgIEdSQ19NSVNDX0NGR19DT1JFQ0xLX1JFU0VUCTB4MDAwMDAwMDEKKyNkZWZpbmUgIEdSQ19NSVNDX0NGR19QUkVTQ0FMQVJfTUFTSwkweDAwMDAwMGZlCisjZGVmaW5lICBHUkNfTUlTQ19DRkdfUFJFU0NBTEFSX1NISUZUCTEKKyNkZWZpbmUgIEdSQ19NSVNDX0NGR19CT0FSRF9JRF9NQVNLCTB4MDAwMWUwMDAKKyNkZWZpbmUgIEdSQ19NSVNDX0NGR19CT0FSRF9JRF81NzAwCTB4MDAwMWUwMDAKKyNkZWZpbmUgIEdSQ19NSVNDX0NGR19CT0FSRF9JRF81NzAxCTB4MDAwMDAwMDAKKyNkZWZpbmUgIEdSQ19NSVNDX0NGR19CT0FSRF9JRF81NzAyRkUJMHgwMDAwNDAwMAorI2RlZmluZSAgR1JDX01JU0NfQ0ZHX0JPQVJEX0lEXzU3MDMJMHgwMDAwMDAwMAorI2RlZmluZSAgR1JDX01JU0NfQ0ZHX0JPQVJEX0lEXzU3MDNTCTB4MDAwMDIwMDAKKyNkZWZpbmUgIEdSQ19NSVNDX0NGR19CT0FSRF9JRF81NzA0CTB4MDAwMDAwMDAKKyNkZWZpbmUgIEdSQ19NSVNDX0NGR19CT0FSRF9JRF81NzA0Q0lPQkUgMHgwMDAwNDAwMAorI2RlZmluZSAgR1JDX01JU0NfQ0ZHX0JPQVJEX0lEXzU3MDRfQTIJMHgwMDAwODAwMAorI2RlZmluZSAgR1JDX01JU0NfQ0ZHX0JPQVJEX0lEXzU3ODgJMHgwMDAxMDAwMAorI2RlZmluZSAgR1JDX01JU0NfQ0ZHX0JPQVJEX0lEXzU3ODhNCTB4MDAwMTgwMDAKKyNkZWZpbmUgIEdSQ19NSVNDX0NGR19CT0FSRF9JRF9BQzkxMDAyQTEgMHgwMDAxODAwMAorI2RlZmluZSAgR1JDX01JU0NfQ0ZHX0tFRVBfR1BIWV9QT1dFUgkweDA0MDAwMDAwCisjZGVmaW5lIEdSQ19MT0NBTF9DVFJMCQkJMHgwMDAwNjgwOAorI2RlZmluZSAgR1JDX0xDTENUUkxfSU5UX0FDVElWRQkJMHgwMDAwMDAwMQorI2RlZmluZSAgR1JDX0xDTENUUkxfQ0xFQVJJTlQJCTB4MDAwMDAwMDIKKyNkZWZpbmUgIEdSQ19MQ0xDVFJMX1NFVElOVAkJMHgwMDAwMDAwNAorI2RlZmluZSAgR1JDX0xDTENUUkxfSU5UX09OX0FUVE4JMHgwMDAwMDAwOAorI2RlZmluZSAgR1JDX0xDTENUUkxfR1BJT19JTlBVVDAJMHgwMDAwMDEwMAorI2RlZmluZSAgR1JDX0xDTENUUkxfR1BJT19JTlBVVDEJMHgwMDAwMDIwMAorI2RlZmluZSAgR1JDX0xDTENUUkxfR1BJT19JTlBVVDIJMHgwMDAwMDQwMAorI2RlZmluZSAgR1JDX0xDTENUUkxfR1BJT19PRTAJCTB4MDAwMDA4MDAKKyNkZWZpbmUgIEdSQ19MQ0xDVFJMX0dQSU9fT0UxCQkweDAwMDAxMDAwCisjZGVmaW5lICBHUkNfTENMQ1RSTF9HUElPX09FMgkJMHgwMDAwMjAwMAorI2RlZmluZSAgR1JDX0xDTENUUkxfR1BJT19PVVRQVVQwCTB4MDAwMDQwMDAKKyNkZWZpbmUgIEdSQ19MQ0xDVFJMX0dQSU9fT1VUUFVUMQkweDAwMDA4MDAwCisjZGVmaW5lICBHUkNfTENMQ1RSTF9HUElPX09VVFBVVDIJMHgwMDAxMDAwMAorI2RlZmluZSAgR1JDX0xDTENUUkxfRVhUTUVNX0VOQUJMRQkweDAwMDIwMDAwCisjZGVmaW5lICBHUkNfTENMQ1RSTF9NRU1TWl9NQVNLCQkweDAwMWMwMDAwCisjZGVmaW5lICBHUkNfTENMQ1RSTF9NRU1TWl8yNTZLCQkweDAwMDAwMDAwCisjZGVmaW5lICBHUkNfTENMQ1RSTF9NRU1TWl81MTJLCQkweDAwMDQwMDAwCisjZGVmaW5lICBHUkNfTENMQ1RSTF9NRU1TWl8xTQkJMHgwMDA4MDAwMAorI2RlZmluZSAgR1JDX0xDTENUUkxfTUVNU1pfMk0JCTB4MDAwYzAwMDAKKyNkZWZpbmUgIEdSQ19MQ0xDVFJMX01FTVNaXzRNCQkweDAwMTAwMDAwCisjZGVmaW5lICBHUkNfTENMQ1RSTF9NRU1TWl84TQkJMHgwMDE0MDAwMAorI2RlZmluZSAgR1JDX0xDTENUUkxfTUVNU1pfMTZNCQkweDAwMTgwMDAwCisjZGVmaW5lICBHUkNfTENMQ1RSTF9CQU5LX1NFTEVDVAkweDAwMjAwMDAwCisjZGVmaW5lICBHUkNfTENMQ1RSTF9TU1JBTV9UWVBFCQkweDAwNDAwMDAwCisjZGVmaW5lICBHUkNfTENMQ1RSTF9BVVRPX1NFRVBST00JMHgwMTAwMDAwMAorI2RlZmluZSBHUkNfVElNRVIJCQkweDAwMDA2ODBjCisjZGVmaW5lIEdSQ19SWF9DUFVfRVZFTlQJCTB4MDAwMDY4MTAKKyNkZWZpbmUgR1JDX1JYX1RJTUVSX1JFRgkJMHgwMDAwNjgxNAorI2RlZmluZSBHUkNfUlhfQ1BVX1NFTQkJCTB4MDAwMDY4MTgKKyNkZWZpbmUgR1JDX1JFTU9URV9SWF9DUFVfQVRUTgkJMHgwMDAwNjgxYworI2RlZmluZSBHUkNfVFhfQ1BVX0VWRU5UCQkweDAwMDA2ODIwCisjZGVmaW5lIEdSQ19UWF9USU1FUl9SRUYJCTB4MDAwMDY4MjQKKyNkZWZpbmUgR1JDX1RYX0NQVV9TRU0JCQkweDAwMDA2ODI4CisjZGVmaW5lIEdSQ19SRU1PVEVfVFhfQ1BVX0FUVE4JCTB4MDAwMDY4MmMKKyNkZWZpbmUgR1JDX01FTV9QT1dFUl9VUAkJMHgwMDAwNjgzMCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgR1JDX0VFUFJPTV9BRERSCQkJMHgwMDAwNjgzOAorI2RlZmluZSAgRUVQUk9NX0FERFJfV1JJVEUJCTB4MDAwMDAwMDAKKyNkZWZpbmUgIEVFUFJPTV9BRERSX1JFQUQJCTB4ODAwMDAwMDAKKyNkZWZpbmUgIEVFUFJPTV9BRERSX0NPTVBMRVRFCQkweDQwMDAwMDAwCisjZGVmaW5lICBFRVBST01fQUREUl9GU01fUkVTRVQJCTB4MjAwMDAwMDAKKyNkZWZpbmUgIEVFUFJPTV9BRERSX0RFVklEX01BU0sJCTB4MWMwMDAwMDAKKyNkZWZpbmUgIEVFUFJPTV9BRERSX0RFVklEX1NISUZUCTI2CisjZGVmaW5lICBFRVBST01fQUREUl9TVEFSVAkJMHgwMjAwMDAwMAorI2RlZmluZSAgRUVQUk9NX0FERFJfQ0xLUEVSRF9TSElGVAkxNgorI2RlZmluZSAgRUVQUk9NX0FERFJfQUREUl9NQVNLCQkweDAwMDBmZmZmCisjZGVmaW5lICBFRVBST01fQUREUl9BRERSX1NISUZUCQkwCisjZGVmaW5lICBFRVBST01fREVGQVVMVF9DTE9DS19QRVJJT0QJMHg2MAorI2RlZmluZSAgRUVQUk9NX0NISVBfU0laRQkJKDY0ICogMTAyNCkKKyNkZWZpbmUgR1JDX0VFUFJPTV9EQVRBCQkJMHgwMDAwNjgzYworI2RlZmluZSBHUkNfRUVQUk9NX0NUUkwJCQkweDAwMDA2ODQwCisjZGVmaW5lIEdSQ19NRElfQ1RSTAkJCTB4MDAwMDY4NDQKKyNkZWZpbmUgR1JDX1NFRVBST01fREVMQVkJCTB4MDAwMDY4NDgKKy8qIDB4Njg0YyAtLT4gMHg2YzAwIHVudXNlZCAqLworCisvKiAweDZjMDAgLS0+IDB4NzAwMCB1bnVzZWQgKi8KKworLyogTlZSQU0gQ29udHJvbCByZWdpc3RlcnMgKi8KKyNkZWZpbmUgTlZSQU1fQ01ECQkJMHgwMDAwNzAwMAorI2RlZmluZSAgTlZSQU1fQ01EX1JFU0VUCQkgMHgwMDAwMDAwMQorI2RlZmluZSAgTlZSQU1fQ01EX0RPTkUJCQkgMHgwMDAwMDAwOAorI2RlZmluZSAgTlZSQU1fQ01EX0dPCQkJIDB4MDAwMDAwMTAKKyNkZWZpbmUgIE5WUkFNX0NNRF9XUgkJCSAweDAwMDAwMDIwCisjZGVmaW5lICBOVlJBTV9DTURfUkQJCQkgMHgwMDAwMDAwMAorI2RlZmluZSAgTlZSQU1fQ01EX0VSQVNFCQkgMHgwMDAwMDA0MAorI2RlZmluZSAgTlZSQU1fQ01EX0ZJUlNUCQkgMHgwMDAwMDA4MAorI2RlZmluZSAgTlZSQU1fQ01EX0xBU1QJCQkgMHgwMDAwMDEwMAorI2RlZmluZSBOVlJBTV9TVEFUCQkJMHgwMDAwNzAwNAorI2RlZmluZSBOVlJBTV9XUkRBVEEJCQkweDAwMDA3MDA4CisjZGVmaW5lIE5WUkFNX0FERFIJCQkweDAwMDA3MDBjCisjZGVmaW5lICBOVlJBTV9BRERSX01TSwkJCTB4MDBmZmZmZmYKKyNkZWZpbmUgTlZSQU1fUkREQVRBCQkJMHgwMDAwNzAxMAorI2RlZmluZSBOVlJBTV9DRkcxCQkJMHgwMDAwNzAxNAorI2RlZmluZSAgTlZSQU1fQ0ZHMV9GTEFTSElGX0VOQUIJIDB4MDAwMDAwMDEKKyNkZWZpbmUgIE5WUkFNX0NGRzFfQlVGRkVSRURfTU9ERQkgMHgwMDAwMDAwMgorI2RlZmluZSAgTlZSQU1fQ0ZHMV9QQVNTX1RIUlUJCSAweDAwMDAwMDA0CisjZGVmaW5lICBOVlJBTV9DRkcxX0JJVF9CQU5HCQkgMHgwMDAwMDAwOAorI2RlZmluZSAgTlZSQU1fQ0ZHMV9DT01QQVRfQllQQVNTCSAweDgwMDAwMDAwCisjZGVmaW5lIE5WUkFNX0NGRzIJCQkweDAwMDA3MDE4CisjZGVmaW5lIE5WUkFNX0NGRzMJCQkweDAwMDA3MDFjCisjZGVmaW5lIE5WUkFNX1NXQVJCCQkJMHgwMDAwNzAyMAorI2RlZmluZSAgU1dBUkJfUkVRX1NFVDAJCQkgMHgwMDAwMDAwMQorI2RlZmluZSAgU1dBUkJfUkVRX1NFVDEJCQkgMHgwMDAwMDAwMgorI2RlZmluZSAgU1dBUkJfUkVRX1NFVDIJCQkgMHgwMDAwMDAwNAorI2RlZmluZSAgU1dBUkJfUkVRX1NFVDMJCQkgMHgwMDAwMDAwOAorI2RlZmluZSAgU1dBUkJfUkVRX0NMUjAJCQkgMHgwMDAwMDAxMAorI2RlZmluZSAgU1dBUkJfUkVRX0NMUjEJCQkgMHgwMDAwMDAyMAorI2RlZmluZSAgU1dBUkJfUkVRX0NMUjIJCQkgMHgwMDAwMDA0MAorI2RlZmluZSAgU1dBUkJfUkVRX0NMUjMJCQkgMHgwMDAwMDA4MAorI2RlZmluZSAgU1dBUkJfR05UMAkJCSAweDAwMDAwMTAwCisjZGVmaW5lICBTV0FSQl9HTlQxCQkJIDB4MDAwMDAyMDAKKyNkZWZpbmUgIFNXQVJCX0dOVDIJCQkgMHgwMDAwMDQwMAorI2RlZmluZSAgU1dBUkJfR05UMwkJCSAweDAwMDAwODAwCisjZGVmaW5lICBTV0FSQl9SRVEwCQkJIDB4MDAwMDEwMDAKKyNkZWZpbmUgIFNXQVJCX1JFUTEJCQkgMHgwMDAwMjAwMAorI2RlZmluZSAgU1dBUkJfUkVRMgkJCSAweDAwMDA0MDAwCisjZGVmaW5lICBTV0FSQl9SRVEzCQkJIDB4MDAwMDgwMDAKKyNkZWZpbmUgICAgTlZSQU1fQlVGRkVSRURfUEFHRV9TSVpFCSAgIDI2NAorI2RlZmluZSAgICBOVlJBTV9CVUZGRVJFRF9QQUdFX1BPUwkgICA5CisvKiAweDcwMjQgLS0+IDB4NzQwMCB1bnVzZWQgKi8KKworLyogMHg3NDAwIC0tPiAweDgwMDAgdW51c2VkICovCisKKy8qIDMySyBXaW5kb3cgaW50byBOSUMgaW50ZXJuYWwgbWVtb3J5ICovCisjZGVmaW5lIE5JQ19TUkFNX1dJTl9CQVNFCQkweDAwMDA4MDAwCisKKy8qIE9mZnNldHMgaW50byBmaXJzdCAzMmsgb2YgTklDIGludGVybmFsIG1lbW9yeS4gKi8KKyNkZWZpbmUgTklDX1NSQU1fUEFHRV9aRVJPCQkweDAwMDAwMDAwCisjZGVmaW5lIE5JQ19TUkFNX1NFTkRfUkNCCQkweDAwMDAwMTAwIC8qIDE2ICogVEczX0JESU5GT18uLi4gKi8KKyNkZWZpbmUgTklDX1NSQU1fUkNWX1JFVF9SQ0IJCTB4MDAwMDAyMDAgLyogMTYgKiBURzNfQkRJTkZPXy4uLiAqLworI2RlZmluZSBOSUNfU1JBTV9TVEFUU19CTEsJCTB4MDAwMDAzMDAKKyNkZWZpbmUgTklDX1NSQU1fU1RBVFVTX0JMSwkJMHgwMDAwMGIwMAorCisjZGVmaW5lIE5JQ19TUkFNX0ZJUk1XQVJFX01CT1gJCTB4MDAwMDBiNTAKKyNkZWZpbmUgIE5JQ19TUkFNX0ZJUk1XQVJFX01CT1hfTUFHSUMxCSAweDRCNjU3NjU0CisjZGVmaW5lICBOSUNfU1JBTV9GSVJNV0FSRV9NQk9YX01BR0lDMgkgMHg0ODYxNzY0YiAvKiAhZG1hIG9uIGxpbmtjaGcgKi8KKworI2RlZmluZSBOSUNfU1JBTV9EQVRBX1NJRwkJMHgwMDAwMGI1NAorI2RlZmluZSAgTklDX1NSQU1fREFUQV9TSUdfTUFHSUMJIDB4NGI2NTc2NTQgLyogYXNjaWkgZm9yICdLZXZUJyAqLworCisjZGVmaW5lIE5JQ19TUkFNX0RBVEFfQ0ZHCQkJMHgwMDAwMGI1OAorI2RlZmluZSAgTklDX1NSQU1fREFUQV9DRkdfTEVEX01PREVfTUFTSwkgMHgwMDAwMDAwYworI2RlZmluZSAgTklDX1NSQU1fREFUQV9DRkdfTEVEX01PREVfVU5LTk9XTgkgMHgwMDAwMDAwMAorI2RlZmluZSAgTklDX1NSQU1fREFUQV9DRkdfTEVEX1RSSVBMRV9TUEQJIDB4MDAwMDAwMDQKKyNkZWZpbmUgIE5JQ19TUkFNX0RBVEFfQ0ZHX0xFRF9PUEVOX0RSQUlOCSAweDAwMDAwMDA0CisjZGVmaW5lICBOSUNfU1JBTV9EQVRBX0NGR19MRURfTElOS19TUEQJCSAweDAwMDAwMDA4CisjZGVmaW5lICBOSUNfU1JBTV9EQVRBX0NGR19MRURfT1VUUFVUCQkgMHgwMDAwMDAwOAorI2RlZmluZSAgTklDX1NSQU1fREFUQV9DRkdfUEhZX1RZUEVfTUFTSwkgMHgwMDAwMDAzMAorI2RlZmluZSAgTklDX1NSQU1fREFUQV9DRkdfUEhZX1RZUEVfVU5LTk9XTgkgMHgwMDAwMDAwMAorI2RlZmluZSAgTklDX1NSQU1fREFUQV9DRkdfUEhZX1RZUEVfQ09QUEVSCSAweDAwMDAwMDEwCisjZGVmaW5lICBOSUNfU1JBTV9EQVRBX0NGR19QSFlfVFlQRV9GSUJFUgkgMHgwMDAwMDAyMAorI2RlZmluZSAgTklDX1NSQU1fREFUQV9DRkdfV09MX0VOQUJMRQkJIDB4MDAwMDAwNDAKKyNkZWZpbmUgIE5JQ19TUkFNX0RBVEFfQ0ZHX0FTRl9FTkFCTEUJCSAweDAwMDAwMDgwCisjZGVmaW5lICBOSUNfU1JBTV9EQVRBX0NGR19FRVBST01fV1AJCSAweDAwMDAwMTAwCisjZGVmaW5lICBOSUNfU1JBTV9EQVRBX0NGR19NSU5JX1BDSQkJIDB4MDAwMDEwMDAKKyNkZWZpbmUgIE5JQ19TUkFNX0RBVEFfQ0ZHX0ZJQkVSX1dPTAkJIDB4MDAwMDQwMDAKKworI2RlZmluZSBOSUNfU1JBTV9EQVRBX1BIWV9JRAkJMHgwMDAwMGI3NAorI2RlZmluZSAgTklDX1NSQU1fREFUQV9QSFlfSUQxX01BU0sJIDB4ZmZmZjAwMDAKKyNkZWZpbmUgIE5JQ19TUkFNX0RBVEFfUEhZX0lEMl9NQVNLCSAweDAwMDBmZmZmCisKKyNkZWZpbmUgTklDX1NSQU1fRldfQ01EX01CT1gJCTB4MDAwMDBiNzgKKyNkZWZpbmUgIEZXQ01EX05JQ0RSVl9BTElWRQkJIDB4MDAwMDAwMDEKKyNkZWZpbmUgIEZXQ01EX05JQ0RSVl9QQVVTRV9GVwkJIDB4MDAwMDAwMDIKKyNkZWZpbmUgIEZXQ01EX05JQ0RSVl9JUFY0QUREUl9DSEcJIDB4MDAwMDAwMDMKKyNkZWZpbmUgIEZXQ01EX05JQ0RSVl9JUFY2QUREUl9DSEcJIDB4MDAwMDAwMDQKKyNkZWZpbmUgIEZXQ01EX05JQ0RSVl9GSVhfRE1BUgkJIDB4MDAwMDAwMDUKKyNkZWZpbmUgIEZXQ01EX05JQ0RSVl9GSVhfRE1BVwkJIDB4MDAwMDAwMDYKKyNkZWZpbmUgTklDX1NSQU1fRldfQ01EX0xFTl9NQk9YCTB4MDAwMDBiN2MKKyNkZWZpbmUgTklDX1NSQU1fRldfQ01EX0RBVEFfTUJPWAkweDAwMDAwYjgwCisjZGVmaW5lIE5JQ19TUkFNX0ZXX0FTRl9TVEFUVVNfTUJPWAkweDAwMDAwYzAwCisjZGVmaW5lIE5JQ19TUkFNX0ZXX0RSVl9TVEFURV9NQk9YCTB4MDAwMDBjMDQKKyNkZWZpbmUgIERSVl9TVEFURV9TVEFSVAkJIDB4MDAwMDAwMDEKKyNkZWZpbmUgIERSVl9TVEFURV9VTkxPQUQJCSAweDAwMDAwMDAyCisjZGVmaW5lICBEUlZfU1RBVEVfV09MCQkJIDB4MDAwMDAwMDMKKyNkZWZpbmUgIERSVl9TVEFURV9TVVNQRU5ECQkgMHgwMDAwMDAwNAorCisjZGVmaW5lIE5JQ19TUkFNX0ZXX1JFU0VUX1RZUEVfTUJPWAkweDAwMDAwYzA4CisKKyNkZWZpbmUgTklDX1NSQU1fTUFDX0FERFJfSElHSF9NQk9YCTB4MDAwMDBjMTQKKyNkZWZpbmUgTklDX1NSQU1fTUFDX0FERFJfTE9XX01CT1gJMHgwMDAwMGMxOAorCisjZGVmaW5lIE5JQ19TUkFNX1JYX01JTklfQlVGRkVSX0RFU0MJMHgwMDAwMTAwMAorCisjZGVmaW5lIE5JQ19TUkFNX0RNQV9ERVNDX1BPT0xfQkFTRQkweDAwMDAyMDAwCisjZGVmaW5lICBOSUNfU1JBTV9ETUFfREVTQ19QT09MX1NJWkUJIDB4MDAwMDIwMDAKKyNkZWZpbmUgTklDX1NSQU1fVFhfQlVGRkVSX0RFU0MJCTB4MDAwMDQwMDAgLyogNTEyIGVudHJpZXMgKi8KKyNkZWZpbmUgTklDX1NSQU1fUlhfQlVGRkVSX0RFU0MJCTB4MDAwMDYwMDAgLyogMjU2IGVudHJpZXMgKi8KKyNkZWZpbmUgTklDX1NSQU1fUlhfSlVNQk9fQlVGRkVSX0RFU0MJMHgwMDAwNzAwMCAvKiAyNTYgZW50cmllcyAqLworI2RlZmluZSBOSUNfU1JBTV9NQlVGX1BPT0xfQkFTRQkJMHgwMDAwODAwMAorI2RlZmluZSAgTklDX1NSQU1fTUJVRl9QT09MX1NJWkU5NgkgMHgwMDAxODAwMAorI2RlZmluZSAgTklDX1NSQU1fTUJVRl9QT09MX1NJWkU2NAkgMHgwMDAxMDAwMAorI2RlZmluZSAgTklDX1NSQU1fTUJVRl9QT09MX0JBU0U1NzA1CTB4MDAwMTAwMDAKKyNkZWZpbmUgIE5JQ19TUkFNX01CVUZfUE9PTF9TSVpFNTcwNQkweDAwMDBlMDAwCisKKy8qIEN1cnJlbnRseSB0aGlzIGlzIGZpeGVkLiAqLworI2RlZmluZSBQSFlfQUREUgkJMHgwMQorCisvKiBUaWdvbjMgc3BlY2lmaWMgUEhZIE1JSSByZWdpc3RlcnMuICovCisjZGVmaW5lICBURzNfQk1DUl9TUEVFRDEwMDAJCTB4MDA0MAorCisjZGVmaW5lIE1JSV9URzNfQ1RSTAkJCTB4MDkgLyogMTAwMC1iYXNlVCBjb250cm9sIHJlZ2lzdGVyICovCisjZGVmaW5lICBNSUlfVEczX0NUUkxfQURWXzEwMDBfSEFMRgkweDAxMDAKKyNkZWZpbmUgIE1JSV9URzNfQ1RSTF9BRFZfMTAwMF9GVUxMCTB4MDIwMAorI2RlZmluZSAgTUlJX1RHM19DVFJMX0FTX01BU1RFUgkJMHgwODAwCisjZGVmaW5lICBNSUlfVEczX0NUUkxfRU5BQkxFX0FTX01BU1RFUgkweDEwMDAKKworI2RlZmluZSBNSUlfVEczX0VYVF9DVFJMCQkweDEwIC8qIEV4dGVuZGVkIGNvbnRyb2wgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgIE1JSV9URzNfRVhUX0NUUkxfTE5LM19MRURfTU9ERQkweDAwMDIKKyNkZWZpbmUgIE1JSV9URzNfRVhUX0NUUkxfVEJJCQkweDgwMDAKKworI2RlZmluZSBNSUlfVEczX0VYVF9TVEFUCQkweDExIC8qIEV4dGVuZGVkIHN0YXR1cyByZWdpc3RlciAqLworI2RlZmluZSAgTUlJX1RHM19FWFRfU1RBVF9MUEFTUwkJMHgwMTAwCisKKyNkZWZpbmUgTUlJX1RHM19EU1BfUldfUE9SVAkJMHgxNSAvKiBEU1AgY29lZmZpY2llbnQgcmVhZC93cml0ZSBwb3J0ICovCisKKyNkZWZpbmUgTUlJX1RHM19EU1BfQUREUkVTUwkJMHgxNyAvKiBEU1AgYWRkcmVzcyByZWdpc3RlciAqLworCisjZGVmaW5lIE1JSV9URzNfQVVYX0NUUkwJCTB4MTggLyogYXV4aWxsaWFyeSBjb250cm9sIHJlZ2lzdGVyICovCisKKyNkZWZpbmUgTUlJX1RHM19BVVhfU1RBVAkJMHgxOSAvKiBhdXhpbGxpYXJ5IHN0YXR1cyByZWdpc3RlciAqLworI2RlZmluZSBNSUlfVEczX0FVWF9TVEFUX0xQQVNTCQkweDAwMDQKKyNkZWZpbmUgTUlJX1RHM19BVVhfU1RBVF9TUERNQVNLCTB4MDcwMAorI2RlZmluZSBNSUlfVEczX0FVWF9TVEFUXzEwSEFMRgkJMHgwMTAwCisjZGVmaW5lIE1JSV9URzNfQVVYX1NUQVRfMTBGVUxMCQkweDAyMDAKKyNkZWZpbmUgTUlJX1RHM19BVVhfU1RBVF8xMDBIQUxGCTB4MDMwMAorI2RlZmluZSBNSUlfVEczX0FVWF9TVEFUXzEwMF80CQkweDA0MDAKKyNkZWZpbmUgTUlJX1RHM19BVVhfU1RBVF8xMDBGVUxMCTB4MDUwMAorI2RlZmluZSBNSUlfVEczX0FVWF9TVEFUXzEwMDBIQUxGCTB4MDYwMAorI2RlZmluZSBNSUlfVEczX0FVWF9TVEFUXzEwMDBGVUxMCTB4MDcwMAorCisjZGVmaW5lIE1JSV9URzNfSVNUQVQJCQkweDFhIC8qIElSUSBzdGF0dXMgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgTUlJX1RHM19JTUFTSwkJCTB4MWIgLyogSVJRIG1hc2sgcmVnaXN0ZXIgKi8KKworLyogSVNUQVQvSU1BU0sgZXZlbnQgYml0cyAqLworI2RlZmluZSBNSUlfVEczX0lOVF9MSU5LQ0hHCQkweDAwMDIKKyNkZWZpbmUgTUlJX1RHM19JTlRfU1BFRURDSEcJCTB4MDAwNAorI2RlZmluZSBNSUlfVEczX0lOVF9EVVBMRVhDSEcJCTB4MDAwOAorI2RlZmluZSBNSUlfVEczX0lOVF9BTkVHX1BBR0VfUlgJMHgwNDAwCisKKy8qIFhYWCBBZGQgdGhpcyB0byBtaWkuaCAqLworI2lmbmRlZiBBRFZFUlRJU0VfUEFVU0UKKyNkZWZpbmUgQURWRVJUSVNFX1BBVVNFX0NBUAkJMHgwNDAwCisjZW5kaWYKKyNpZm5kZWYgQURWRVJUSVNFX1BBVVNFX0FTWU0KKyNkZWZpbmUgQURWRVJUSVNFX1BBVVNFX0FTWU0JCTB4MDgwMAorI2VuZGlmCisjaWZuZGVmIExQQV9QQVVTRQorI2RlZmluZSBMUEFfUEFVU0VfQ0FQCQkJMHgwNDAwCisjZW5kaWYKKyNpZm5kZWYgTFBBX1BBVVNFX0FTWU0KKyNkZWZpbmUgTFBBX1BBVVNFX0FTWU0JCQkweDA4MDAKKyNlbmRpZgorCisvKiBUaGVyZSBhcmUgdHdvIHdheXMgdG8gbWFuYWdlIHRoZSBUWCBkZXNjcmlwdG9ycyBvbiB0aGUgdGlnb24zLgorICogRWl0aGVyIHRoZSBkZXNjcmlwdG9ycyBhcmUgaW4gaG9zdCBETUEnYWJsZSBtZW1vcnksIG9yIHRoZXkKKyAqIGV4aXN0IG9ubHkgaW4gdGhlIGNhcmRzIG9uLWNoaXAgU1JBTS4gIEFsbCAxNiBzZW5kIGJkcyBhcmUgdW5kZXIKKyAqIHRoZSBzYW1lIG1vZGUsIHRoZXkgbWF5IG5vdCBiZSBjb25maWd1cmVkIGluZGl2aWR1YWxseS4KKyAqCisgKiBUaGUgbW9kZSB3ZSB1c2UgaXMgY29udHJvbGxlZCBieSBURzNfRkxBR19IT1NUX1RYRFMgaW4gdHAtPnRnM19mbGFncy4KKyAqCisgKiBUbyB1c2UgaG9zdCBtZW1vcnkgVFggZGVzY3JpcHRvcnM6CisgKgkxKSBTZXQgR1JDX01PREVfSE9TVF9TRU5EQkRTIGluIEdSQ19NT0RFIHJlZ2lzdGVyLgorICoJICAgTWFrZSBzdXJlIEdSQ19NT0RFXzRYX05JQ19TRU5EX1JJTkdTIGlzIGNsZWFyLgorICoJMikgQWxsb2NhdGUgRE1BJ2FibGUgbWVtb3J5LgorICoJMykgSW4gTklDX1NSQU1fU0VORF9SQ0IgKG9mIGRlc2lyZWQgaW5kZXgpIG9mIG9uLWNoaXAgU1JBTToKKyAqCSAgIGEpIFNldCBURzNfQkRJTkZPX0hPU1RfQUREUiB0byBETUEgYWRkcmVzcyBvZiBtZW1vcnkKKyAqCSAgICAgIG9idGFpbmVkIGluIHN0ZXAgMgorICoJICAgYikgU2V0IFRHM19CRElORk9fTklDX0FERFIgdG8gTklDX1NSQU1fVFhfQlVGRkVSX0RFU0MuCisgKgkgICBjKSBTZXQgbGVuIGZpZWxkIG9mIFRHM19CRElORk9fTUFYTEVOX0ZMQUdTIHRvIG51bWJlcgorICogICAgICAgICAgICBvZiBUWCBkZXNjcmlwdG9ycy4gIExlYXZlIGZsYWdzIGZpZWxkIGNsZWFyLgorICoJNCkgQWNjZXNzIFRYIGRlc2NyaXB0b3JzIHZpYSBob3N0IG1lbW9yeS4gIFRoZSBjaGlwCisgKgkgICB3aWxsIHJlZmV0Y2ggaW50byBsb2NhbCBTUkFNIGFzIG5lZWRlZCB3aGVuIHByb2R1Y2VyCisgKgkgICBpbmRleCBtYWlsYm94ZXMgYXJlIHVwZGF0ZWQuCisgKgorICogVG8gdXNlIG9uLWNoaXAgVFggZGVzY3JpcHRvcnM6CisgKgkxKSBTZXQgR1JDX01PREVfNFhfTklDX1NFTkRfUklOR1MgaW4gR1JDX01PREUgcmVnaXN0ZXIuCisgKgkgICBNYWtlIHN1cmUgR1JDX01PREVfSE9TVF9TRU5EQkRTIGlzIGNsZWFyLgorICoJMikgSW4gTklDX1NSQU1fU0VORF9SQ0IgKG9mIGRlc2lyZWQgaW5kZXgpIG9mIG9uLWNoaXAgU1JBTToKKyAqCSAgIGEpIFNldCBURzNfQkRJTkZPX0hPU1RfQUREUiB0byB6ZXJvLgorICoJICAgYikgU2V0IFRHM19CRElORk9fTklDX0FERFIgdG8gTklDX1NSQU1fVFhfQlVGRkVSX0RFU0MKKyAqCSAgIGMpIFRHM19CRElORk9fTUFYTEVOX0ZMQUdTIGlzIGRvbid0IGNhcmUuCisgKgkzKSBBY2Nlc3MgVFggZGVzY3JpcHRvcnMgZGlyZWN0bHkgaW4gb24tY2hpcCBTUkFNCisgKgkgICB1c2luZyBub3JtYWwge3JlYWQsd3JpdGV9bCgpLiAgKGFuZCBub3QgdXNpbmcKKyAqICAgICAgICAgcG9pbnRlciBkZXJlZmVyZW5jaW5nIG9mIGlvcmVtYXAoKSdkIG1lbW9yeSBsaWtlCisgKgkgICB0aGUgYnJva2VuIEJyb2FkY29tIGRyaXZlciBkb2VzKQorICoKKyAqIE5vdGUgdGhhdCBCRElORk9fRkxBR1NfRElTQUJMRUQgc2hvdWxkIGJlIHNldCBpbiB0aGUgZmxhZ3MgZmllbGQgb2YKKyAqIFRHM19CRElORk9fTUFYTEVOX0ZMQUdTIG9mIGFsbCB1bnVzZWQgU0VORF9SQ0IgaW5kaWNlcy4KKyAqLworc3RydWN0IHRnM190eF9idWZmZXJfZGVzYyB7CisJdWludDMyX3QJCQlhZGRyX2hpOworCXVpbnQzMl90CQkJYWRkcl9sbzsKKworCXVpbnQzMl90CQkJbGVuX2ZsYWdzOworI2RlZmluZSBUWERfRkxBR19UQ1BVRFBfQ1NVTQkJMHgwMDAxCisjZGVmaW5lIFRYRF9GTEFHX0lQX0NTVU0JCTB4MDAwMgorI2RlZmluZSBUWERfRkxBR19FTkQJCQkweDAwMDQKKyNkZWZpbmUgVFhEX0ZMQUdfSVBfRlJBRwkJMHgwMDA4CisjZGVmaW5lIFRYRF9GTEFHX0lQX0ZSQUdfRU5ECQkweDAwMTAKKyNkZWZpbmUgVFhEX0ZMQUdfVkxBTgkJCTB4MDA0MAorI2RlZmluZSBUWERfRkxBR19DT0FMX05PVwkJMHgwMDgwCisjZGVmaW5lIFRYRF9GTEFHX0NQVV9QUkVfRE1BCQkweDAxMDAKKyNkZWZpbmUgVFhEX0ZMQUdfQ1BVX1BPU1RfRE1BCQkweDAyMDAKKyNkZWZpbmUgVFhEX0ZMQUdfQUREX1NSQ19BRERSCQkweDEwMDAKKyNkZWZpbmUgVFhEX0ZMQUdfQ0hPT1NFX1NSQ19BRERSCTB4NjAwMAorI2RlZmluZSBUWERfRkxBR19OT19DUkMJCQkweDgwMDAKKyNkZWZpbmUgVFhEX0xFTl9TSElGVAkJCTE2CisKKwl1aW50MzJfdAkJCXZsYW5fdGFnOworI2RlZmluZSBUWERfVkxBTl9UQUdfU0hJRlQJCTAKKyNkZWZpbmUgVFhEX01TU19TSElGVAkJCTE2Cit9OworCisjZGVmaW5lIFRYRF9BRERSCQkJMHgwMFVMIC8qIDY0LWJpdCAqLworI2RlZmluZSBUWERfTEVOX0ZMQUdTCQkJMHgwOFVMIC8qIDMyLWJpdCAodXBwZXIgMTYtYml0cyBhcmUgbGVuKSAqLworI2RlZmluZSBUWERfVkxBTl9UQUcJCQkweDBjVUwgLyogMzItYml0ICh1cHBlciAxNi1iaXRzIGFyZSB0YWcpICovCisjZGVmaW5lIFRYRF9TSVpFCQkJMHgxMFVMCisKK3N0cnVjdCB0ZzNfcnhfYnVmZmVyX2Rlc2MgeworCXVpbnQzMl90CQkJYWRkcl9oaTsKKwl1aW50MzJfdAkJCWFkZHJfbG87CisKKwl1aW50MzJfdAkJCWlkeF9sZW47CisjZGVmaW5lIFJYRF9JRFhfTUFTSwkweGZmZmYwMDAwCisjZGVmaW5lIFJYRF9JRFhfU0hJRlQJMTYKKyNkZWZpbmUgUlhEX0xFTl9NQVNLCTB4MDAwMGZmZmYKKyNkZWZpbmUgUlhEX0xFTl9TSElGVAkwCisKKwl1aW50MzJfdAkJCXR5cGVfZmxhZ3M7CisjZGVmaW5lIFJYRF9UWVBFX1NISUZUCTE2CisjZGVmaW5lIFJYRF9GTEFHU19TSElGVAkwCisKKyNkZWZpbmUgUlhEX0ZMQUdfRU5ECQkJMHgwMDA0CisjZGVmaW5lIFJYRF9GTEFHX01JTkkJCQkweDA4MDAKKyNkZWZpbmUgUlhEX0ZMQUdfSlVNQk8JCQkweDAwMjAKKyNkZWZpbmUgUlhEX0ZMQUdfVkxBTgkJCTB4MDA0MAorI2RlZmluZSBSWERfRkxBR19FUlJPUgkJCTB4MDQwMAorI2RlZmluZSBSWERfRkxBR19JUF9DU1VNCQkweDEwMDAKKyNkZWZpbmUgUlhEX0ZMQUdfVENQVURQX0NTVU0JCTB4MjAwMAorI2RlZmluZSBSWERfRkxBR19JU19UQ1AJCQkweDQwMDAKKworCXVpbnQzMl90CQkJaXBfdGNwX2NzdW07CisjZGVmaW5lIFJYRF9JUENTVU1fTUFTSwkJMHhmZmZmMDAwMAorI2RlZmluZSBSWERfSVBDU1VNX1NISUZUCTE2CisjZGVmaW5lIFJYRF9UQ1BDU1VNX01BU0sJMHgwMDAwZmZmZgorI2RlZmluZSBSWERfVENQQ1NVTV9TSElGVAkwCisKKwl1aW50MzJfdAkJCWVycl92bGFuOworCisjZGVmaW5lIFJYRF9WTEFOX01BU0sJCQkweDAwMDBmZmZmCisKKyNkZWZpbmUgUlhEX0VSUl9CQURfQ1JDCQkJMHgwMDAxMDAwMAorI2RlZmluZSBSWERfRVJSX0NPTExJU0lPTgkJMHgwMDAyMDAwMAorI2RlZmluZSBSWERfRVJSX0xJTktfTE9TVAkJMHgwMDA0MDAwMAorI2RlZmluZSBSWERfRVJSX1BIWV9ERUNPREUJCTB4MDAwODAwMDAKKyNkZWZpbmUgUlhEX0VSUl9PRERfTklCQkxFX1JDVkRfTUlJCTB4MDAxMDAwMDAKKyNkZWZpbmUgUlhEX0VSUl9NQUNfQUJSVAkJMHgwMDIwMDAwMAorI2RlZmluZSBSWERfRVJSX1RPT19TTUFMTAkJMHgwMDQwMDAwMAorI2RlZmluZSBSWERfRVJSX05PX1JFU09VUkNFUwkJMHgwMDgwMDAwMAorI2RlZmluZSBSWERfRVJSX0hVR0VfRlJBTUUJCTB4MDEwMDAwMDAKKyNkZWZpbmUgUlhEX0VSUl9NQVNLCQkJMHhmZmZmMDAwMAorCisJdWludDMyX3QJCQlyZXNlcnZlZDsKKwl1aW50MzJfdAkJCW9wYXF1ZTsKKyNkZWZpbmUgUlhEX09QQVFVRV9JTkRFWF9NQVNLCQkweDAwMDBmZmZmCisjZGVmaW5lIFJYRF9PUEFRVUVfSU5ERVhfU0hJRlQJCTAKKyNkZWZpbmUgUlhEX09QQVFVRV9SSU5HX1NURAkJMHgwMDAxMDAwMAorI2RlZmluZSBSWERfT1BBUVVFX1JJTkdfSlVNQk8JCTB4MDAwMjAwMDAKKyNkZWZpbmUgUlhEX09QQVFVRV9SSU5HX01JTkkJCTB4MDAwNDAwMDAKKyNkZWZpbmUgUlhEX09QQVFVRV9SSU5HX01BU0sJCTB4MDAwNzAwMDAKK307CisKK3N0cnVjdCB0ZzNfZXh0X3J4X2J1ZmZlcl9kZXNjIHsKKwlzdHJ1Y3QgeworCQl1aW50MzJfdAkJYWRkcl9oaTsKKwkJdWludDMyX3QJCWFkZHJfbG87CisJfQkJCQlhZGRybGlzdFszXTsKKwl1aW50MzJfdAkJCWxlbjJfbGVuMTsKKwl1aW50MzJfdAkJCXJlc3ZfbGVuMzsKKwlzdHJ1Y3QgdGczX3J4X2J1ZmZlcl9kZXNjCXN0ZDsKK307CisKKy8qIFdlIG9ubHkgdXNlIHRoaXMgd2hlbiB0ZXN0aW5nIG91dCB0aGUgRE1BIGVuZ2luZQorICogYXQgcHJvYmUgdGltZS4gIFRoaXMgaXMgdGhlIGludGVybmFsIGZvcm1hdCBvZiBidWZmZXIKKyAqIGRlc2NyaXB0b3JzIHVzZWQgYnkgdGhlIGNoaXAgYXQgTklDX1NSQU1fRE1BX0RFU0NTLgorICovCitzdHJ1Y3QgdGczX2ludGVybmFsX2J1ZmZlcl9kZXNjIHsKKwl1aW50MzJfdAkJCWFkZHJfaGk7CisJdWludDMyX3QJCQlhZGRyX2xvOworCXVpbnQzMl90CQkJbmljX21idWY7CisJLyogWFhYIEZJWCBUSElTICovCisjaWYgX19CWVRFX09SREVSID09IF9fQklHX0VORElBTgorCXVpbnQxNl90CQkJY3FpZF9zcWlkOworCXVpbnQxNl90CQkJbGVuOworI2Vsc2UKKwl1aW50MTZfdAkJCWxlbjsKKwl1aW50MTZfdAkJCWNxaWRfc3FpZDsKKyNlbmRpZgorCXVpbnQzMl90CQkJZmxhZ3M7CisJdWludDMyX3QJCQlfX2Nvb2tpZTE7CisJdWludDMyX3QJCQlfX2Nvb2tpZTI7CisJdWludDMyX3QJCQlfX2Nvb2tpZTM7Cit9OworCisjZGVmaW5lIFRHM19IV19TVEFUVVNfU0laRQkJMHg1MAorc3RydWN0IHRnM19od19zdGF0dXMgeworCXVpbnQzMl90CQkJc3RhdHVzOworI2RlZmluZSBTRF9TVEFUVVNfVVBEQVRFRAkJMHgwMDAwMDAwMQorI2RlZmluZSBTRF9TVEFUVVNfTElOS19DSEcJCTB4MDAwMDAwMDIKKyNkZWZpbmUgU0RfU1RBVFVTX0VSUk9SCQkJMHgwMDAwMDAwNAorCisJdWludDMyX3QJCQlzdGF0dXNfdGFnOworCisjaWYgX19CWVRFX09SREVSID09IF9fQklHX0VORElBTgorCXVpbnQxNl90CQkJcnhfY29uc3VtZXI7CisJdWludDE2X3QJCQlyeF9qdW1ib19jb25zdW1lcjsKKyNlbHNlCisJdWludDE2X3QJCQlyeF9qdW1ib19jb25zdW1lcjsKKwl1aW50MTZfdAkJCXJ4X2NvbnN1bWVyOworI2VuZGlmCisKKyNpZiBfX0JZVEVfT1JERVIgPT0gIF9fQklHX0VORElBTgorCXVpbnQxNl90CQkJcmVzZXJ2ZWQ7CisJdWludDE2X3QJCQlyeF9taW5pX2NvbnN1bWVyOworI2Vsc2UKKwl1aW50MTZfdAkJCXJ4X21pbmlfY29uc3VtZXI7CisJdWludDE2X3QJCQlyZXNlcnZlZDsKKyNlbmRpZgorCXN0cnVjdCB7CisjaWYgX19CWVRFX09SREVSID09ICBfX0JJR19FTkRJQU4KKwkJdWludDE2X3QJCXR4X2NvbnN1bWVyOworCQl1aW50MTZfdAkJcnhfcHJvZHVjZXI7CisjZWxzZQorCQl1aW50MTZfdAkJcnhfcHJvZHVjZXI7CisJCXVpbnQxNl90CQl0eF9jb25zdW1lcjsKKyNlbmRpZgorCX0JCQkJaWR4WzE2XTsKK307CisKK3R5cGVkZWYgc3RydWN0IHsKKwl1aW50MzJfdCBoaWdoLCBsb3c7Cit9IHRnM19zdGF0NjRfdDsKKworc3RydWN0IHRnM19od19zdGF0cyB7CisJdWludDhfdAkJCQlfX3Jlc2VydmVkMFsweDQwMC0weDMwMF07CisKKwkvKiBTdGF0aXN0aWNzIG1haW50YWluZWQgYnkgUmVjZWl2ZSBNQUMuICovCisJdGczX3N0YXQ2NF90CQkJcnhfb2N0ZXRzOworCXVpbnQ2NF90CQkJX19yZXNlcnZlZDE7CisJdGczX3N0YXQ2NF90CQkJcnhfZnJhZ21lbnRzOworCXRnM19zdGF0NjRfdAkJCXJ4X3VjYXN0X3BhY2tldHM7CisJdGczX3N0YXQ2NF90CQkJcnhfbWNhc3RfcGFja2V0czsKKwl0ZzNfc3RhdDY0X3QJCQlyeF9iY2FzdF9wYWNrZXRzOworCXRnM19zdGF0NjRfdAkJCXJ4X2Zjc19lcnJvcnM7CisJdGczX3N0YXQ2NF90CQkJcnhfYWxpZ25fZXJyb3JzOworCXRnM19zdGF0NjRfdAkJCXJ4X3hvbl9wYXVzZV9yY3ZkOworCXRnM19zdGF0NjRfdAkJCXJ4X3hvZmZfcGF1c2VfcmN2ZDsKKwl0ZzNfc3RhdDY0X3QJCQlyeF9tYWNfY3RybF9yY3ZkOworCXRnM19zdGF0NjRfdAkJCXJ4X3hvZmZfZW50ZXJlZDsKKwl0ZzNfc3RhdDY0X3QJCQlyeF9mcmFtZV90b29fbG9uZ19lcnJvcnM7CisJdGczX3N0YXQ2NF90CQkJcnhfamFiYmVyczsKKwl0ZzNfc3RhdDY0X3QJCQlyeF91bmRlcnNpemVfcGFja2V0czsKKwl0ZzNfc3RhdDY0X3QJCQlyeF9pbl9sZW5ndGhfZXJyb3JzOworCXRnM19zdGF0NjRfdAkJCXJ4X291dF9sZW5ndGhfZXJyb3JzOworCXRnM19zdGF0NjRfdAkJCXJ4XzY0X29yX2xlc3Nfb2N0ZXRfcGFja2V0czsKKwl0ZzNfc3RhdDY0X3QJCQlyeF82NV90b18xMjdfb2N0ZXRfcGFja2V0czsKKwl0ZzNfc3RhdDY0X3QJCQlyeF8xMjhfdG9fMjU1X29jdGV0X3BhY2tldHM7CisJdGczX3N0YXQ2NF90CQkJcnhfMjU2X3RvXzUxMV9vY3RldF9wYWNrZXRzOworCXRnM19zdGF0NjRfdAkJCXJ4XzUxMl90b18xMDIzX29jdGV0X3BhY2tldHM7CisJdGczX3N0YXQ2NF90CQkJcnhfMTAyNF90b18xNTIyX29jdGV0X3BhY2tldHM7CisJdGczX3N0YXQ2NF90CQkJcnhfMTUyM190b18yMDQ3X29jdGV0X3BhY2tldHM7CisJdGczX3N0YXQ2NF90CQkJcnhfMjA0OF90b180MDk1X29jdGV0X3BhY2tldHM7CisJdGczX3N0YXQ2NF90CQkJcnhfNDA5Nl90b184MTkxX29jdGV0X3BhY2tldHM7CisJdGczX3N0YXQ2NF90CQkJcnhfODE5Ml90b185MDIyX29jdGV0X3BhY2tldHM7CisKKwl1aW50NjRfdAkJCV9fdW51c2VkMFszN107CisKKwkvKiBTdGF0aXN0aWNzIG1haW50YWluZWQgYnkgVHJhbnNtaXQgTUFDLiAqLworCXRnM19zdGF0NjRfdAkJCXR4X29jdGV0czsKKwl1aW50NjRfdAkJCV9fcmVzZXJ2ZWQyOworCXRnM19zdGF0NjRfdAkJCXR4X2NvbGxpc2lvbnM7CisJdGczX3N0YXQ2NF90CQkJdHhfeG9uX3NlbnQ7CisJdGczX3N0YXQ2NF90CQkJdHhfeG9mZl9zZW50OworCXRnM19zdGF0NjRfdAkJCXR4X2Zsb3dfY29udHJvbDsKKwl0ZzNfc3RhdDY0X3QJCQl0eF9tYWNfZXJyb3JzOworCXRnM19zdGF0NjRfdAkJCXR4X3NpbmdsZV9jb2xsaXNpb25zOworCXRnM19zdGF0NjRfdAkJCXR4X211bHRfY29sbGlzaW9uczsKKwl0ZzNfc3RhdDY0X3QJCQl0eF9kZWZlcnJlZDsKKwl1aW50NjRfdAkJCV9fcmVzZXJ2ZWQzOworCXRnM19zdGF0NjRfdAkJCXR4X2V4Y2Vzc2l2ZV9jb2xsaXNpb25zOworCXRnM19zdGF0NjRfdAkJCXR4X2xhdGVfY29sbGlzaW9uczsKKwl0ZzNfc3RhdDY0X3QJCQl0eF9jb2xsaWRlXzJ0aW1lczsKKwl0ZzNfc3RhdDY0X3QJCQl0eF9jb2xsaWRlXzN0aW1lczsKKwl0ZzNfc3RhdDY0X3QJCQl0eF9jb2xsaWRlXzR0aW1lczsKKwl0ZzNfc3RhdDY0X3QJCQl0eF9jb2xsaWRlXzV0aW1lczsKKwl0ZzNfc3RhdDY0X3QJCQl0eF9jb2xsaWRlXzZ0aW1lczsKKwl0ZzNfc3RhdDY0X3QJCQl0eF9jb2xsaWRlXzd0aW1lczsKKwl0ZzNfc3RhdDY0X3QJCQl0eF9jb2xsaWRlXzh0aW1lczsKKwl0ZzNfc3RhdDY0X3QJCQl0eF9jb2xsaWRlXzl0aW1lczsKKwl0ZzNfc3RhdDY0X3QJCQl0eF9jb2xsaWRlXzEwdGltZXM7CisJdGczX3N0YXQ2NF90CQkJdHhfY29sbGlkZV8xMXRpbWVzOworCXRnM19zdGF0NjRfdAkJCXR4X2NvbGxpZGVfMTJ0aW1lczsKKwl0ZzNfc3RhdDY0X3QJCQl0eF9jb2xsaWRlXzEzdGltZXM7CisJdGczX3N0YXQ2NF90CQkJdHhfY29sbGlkZV8xNHRpbWVzOworCXRnM19zdGF0NjRfdAkJCXR4X2NvbGxpZGVfMTV0aW1lczsKKwl0ZzNfc3RhdDY0X3QJCQl0eF91Y2FzdF9wYWNrZXRzOworCXRnM19zdGF0NjRfdAkJCXR4X21jYXN0X3BhY2tldHM7CisJdGczX3N0YXQ2NF90CQkJdHhfYmNhc3RfcGFja2V0czsKKwl0ZzNfc3RhdDY0X3QJCQl0eF9jYXJyaWVyX3NlbnNlX2Vycm9yczsKKwl0ZzNfc3RhdDY0X3QJCQl0eF9kaXNjYXJkczsKKwl0ZzNfc3RhdDY0X3QJCQl0eF9lcnJvcnM7CisKKwl1aW50NjRfdAkJCV9fdW51c2VkMVszMV07CisKKwkvKiBTdGF0aXN0aWNzIG1haW50YWluZWQgYnkgUmVjZWl2ZSBMaXN0IFBsYWNlbWVudC4gKi8KKwl0ZzNfc3RhdDY0X3QJCQlDT1NfcnhfcGFja2V0c1sxNl07CisJdGczX3N0YXQ2NF90CQkJQ09TX3J4X2ZpbHRlcl9kcm9wcGVkOworCXRnM19zdGF0NjRfdAkJCWRtYV93cml0ZXFfZnVsbDsKKwl0ZzNfc3RhdDY0X3QJCQlkbWFfd3JpdGVfcHJpb3FfZnVsbDsKKwl0ZzNfc3RhdDY0X3QJCQlyeGJkc19lbXB0eTsKKwl0ZzNfc3RhdDY0X3QJCQlyeF9kaXNjYXJkczsKKwl0ZzNfc3RhdDY0X3QJCQlyeF9lcnJvcnM7CisJdGczX3N0YXQ2NF90CQkJcnhfdGhyZXNob2xkX2hpdDsKKworCXVpbnQ2NF90CQkJX191bnVzZWQyWzldOworCisJLyogU3RhdGlzdGljcyBtYWludGFpbmVkIGJ5IFNlbmQgRGF0YSBJbml0aWF0b3IuICovCisJdGczX3N0YXQ2NF90CQkJQ09TX291dF9wYWNrZXRzWzE2XTsKKwl0ZzNfc3RhdDY0X3QJCQlkbWFfcmVhZHFfZnVsbDsKKwl0ZzNfc3RhdDY0X3QJCQlkbWFfcmVhZF9wcmlvcV9mdWxsOworCXRnM19zdGF0NjRfdAkJCXR4X2NvbXBfcXVldWVfZnVsbDsKKworCS8qIFN0YXRpc3RpY3MgbWFpbnRhaW5lZCBieSBIb3N0IENvYWxlc2NpbmcuICovCisJdGczX3N0YXQ2NF90CQkJcmluZ19zZXRfc2VuZF9wcm9kX2luZGV4OworCXRnM19zdGF0NjRfdAkJCXJpbmdfc3RhdHVzX3VwZGF0ZTsKKwl0ZzNfc3RhdDY0X3QJCQluaWNfaXJxczsKKwl0ZzNfc3RhdDY0X3QJCQluaWNfYXZvaWRlZF9pcnFzOworCXRnM19zdGF0NjRfdAkJCW5pY190eF90aHJlc2hvbGRfaGl0OworCisJdWludDhfdAkJCQlfX3Jlc2VydmVkNFsweGIwMC0weDljMF07Cit9OworCitlbnVtIHBoeV9sZWRfbW9kZSB7CisJbGVkX21vZGVfYXV0bywKKwlsZWRfbW9kZV90aHJlZV9saW5rLAorCWxlZF9tb2RlX2xpbmsxMAorfTsKKworI2lmIDAKKy8qICdtYXBwaW5nJyBpcyBzdXBlcmZsdW91cyBhcyB0aGUgY2hpcCBkb2VzIG5vdCB3cml0ZSBpbnRvCisgKiB0aGUgdHgvcnggcG9zdCByaW5ncyBzbyB3ZSBjb3VsZCBqdXN0IGZldGNoIGl0IGZyb20gdGhlcmUuCisgKiBCdXQgdGhlIGNhY2hlIGJlaGF2aW9yIGlzIGJldHRlciBob3cgd2UgYXJlIGRvaW5nIGl0IG5vdy4KKyAqLworc3RydWN0IHJpbmdfaW5mbyB7CisJc3RydWN0IHNrX2J1ZmYJCQkqc2tiOworCURFQ0xBUkVfUENJX1VOTUFQX0FERFIobWFwcGluZykKK307CisKK3N0cnVjdCB0eF9yaW5nX2luZm8geworCXN0cnVjdCBza19idWZmCQkJKnNrYjsKKwlERUNMQVJFX1BDSV9VTk1BUF9BRERSKG1hcHBpbmcpCisJdWludDMyX3QJCQlwcmV2X3ZsYW5fdGFnOworfTsKKyNlbmRpZgorCitzdHJ1Y3QgdGczX2NvbmZpZ19pbmZvIHsKKwl1aW50MzJfdAkJCWZsYWdzOworfTsKKworc3RydWN0IHRnM19saW5rX2NvbmZpZyB7CisJLyogRGVzY3JpYmVzIHdoYXQgd2UncmUgdHJ5aW5nIHRvIGdldC4gKi8KKwl1aW50MzJfdAkJCWFkdmVydGlzaW5nOworI2lmIDAKKwl1aW50MTZfdAkJCXNwZWVkOworCXVpbnQ4X3QJCQkJZHVwbGV4OworCXVpbnQ4X3QJCQkJYXV0b25lZzsKKyNkZWZpbmUgU1BFRURfSU5WQUxJRAkJMHhmZmZmCisjZGVmaW5lIERVUExFWF9JTlZBTElECQkweGZmCisjZGVmaW5lIEFVVE9ORUdfSU5WQUxJRAkJMHhmZgorI2VuZGlmCisKKwkvKiBEZXNjcmliZXMgd2hhdCB3ZSBhY3R1YWxseSBoYXZlLiAqLworCXVpbnQ4X3QJCQkJYWN0aXZlX3NwZWVkOworCXVpbnQ4X3QJCQkJYWN0aXZlX2R1cGxleDsKKworCS8qIFdoZW4gd2UgZ28gaW4gYW5kIG91dCBvZiBsb3cgcG93ZXIgbW9kZSB3ZSBuZWVkCisJICogdG8gc3dhcCB3aXRoIHRoaXMgc3RhdGUuCisJICovCisjaWYgMAorCWludAkJCQlwaHlfaXNfbG93X3Bvd2VyOworCXVpbnQxNl90CQkJb3JpZ19zcGVlZDsKKwl1aW50OF90CQkJCW9yaWdfZHVwbGV4OworCXVpbnQ4X3QJCQkJb3JpZ19hdXRvbmVnOworI2VuZGlmCit9OworCitzdHJ1Y3QgdGczX2J1Zm1ncl9jb25maWcgeworCXVpbnQzMl90CQltYnVmX3JlYWRfZG1hX2xvd193YXRlcjsKKwl1aW50MzJfdAkJbWJ1Zl9tYWNfcnhfbG93X3dhdGVyOworCXVpbnQzMl90CQltYnVmX2hpZ2hfd2F0ZXI7CisKKwl1aW50MzJfdAkJbWJ1Zl9yZWFkX2RtYV9sb3dfd2F0ZXJfanVtYm87CisJdWludDMyX3QJCW1idWZfbWFjX3J4X2xvd193YXRlcl9qdW1ibzsKKwl1aW50MzJfdAkJbWJ1Zl9oaWdoX3dhdGVyX2p1bWJvOworCisJdWludDMyX3QJCWRtYV9sb3dfd2F0ZXI7CisJdWludDMyX3QJCWRtYV9oaWdoX3dhdGVyOworfTsKKworc3RydWN0IHRnMyB7CisjaWYgMAorCS8qIFNNUCBsb2NraW5nIHN0cmF0ZWd5OgorCSAqCisJICogbG9jazogSGVsZCBkdXJpbmcgYWxsIG9wZXJhdGlvbnMgZXhjZXB0IFRYIHBhY2tldAorCSAqICAgICAgIHByb2Nlc3NpbmcuCisJICoKKwkgKiB0eF9sb2NrOiBIZWxkIGR1cmluZyB0ZzNfc3RhcnRfeG1pdHssXzRnYnVnfSBhbmQgdGczX3R4CisJICoKKwkgKiBJZiB5b3Ugd2FudCB0byBzaHV0IHVwIGFsbCBhc3luY2hyb25vdXMgcHJvY2Vzc2luZyB5b3UgbXVzdAorCSAqIGFjcXVpcmUgYm90aCBsb2NrcywgJ2xvY2snIHRha2VuIGJlZm9yZSAndHhfbG9jaycuICBJUlFzIG11c3QKKwkgKiBiZSBkaXNhYmxlZCB0byB0YWtlICdsb2NrJyBidXQgb25seSBzb2Z0aXJxIGRpc2FibGluZyBpcworCSAqIG5lY2Vzc2FyeSBmb3IgYWNxdWlzaXRpb24gb2YgJ3R4X2xvY2snLgorCSAqLworCXNwaW5sb2NrX3QJCQlsb2NrOworCXNwaW5sb2NrX3QJCQl0eF9sb2NrOworI2VuZGlmCisKKwl1aW50MzJfdAkJCXR4X3Byb2Q7CisjaWYgMAorCXVpbnQzMl90CQkJdHhfY29uczsKKyNlbmRpZgorCXVpbnQzMl90CQkJcnhfcmNiX3B0cjsKKwl1aW50MzJfdAkJCXJ4X3N0ZF9wdHI7CisjaWYgMAorCXVpbnQzMl90CQkJcnhfanVtYm9fcHRyOworCXNwaW5sb2NrX3QJCQlpbmRpcmVjdF9sb2NrOworCisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMJCW5ldF9zdGF0czsKKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cwkJbmV0X3N0YXRzX3ByZXY7CisjZW5kaWYKKwl1bnNpZ25lZCBsb25nCQkJcGh5X2NyY19lcnJvcnM7CisKKyNpZiAwCisJdWludDMyX3QJCQlyeF9vZmZzZXQ7CisjZW5kaWYKKwl1aW50MzJfdAkJCXRnM19mbGFnczsKKyNpZiAwCisjZGVmaW5lIFRHM19GTEFHX0hPU1RfVFhEUwkJMHgwMDAwMDAwMQorI2VuZGlmCisjZGVmaW5lIFRHM19GTEFHX1RYRF9NQk9YX0hXQlVHCQkweDAwMDAwMDAyCisjZGVmaW5lIFRHM19GTEFHX1JYX0NIRUNLU1VNUwkJMHgwMDAwMDAwNAorI2RlZmluZSBURzNfRkxBR19VU0VfTElOS0NIR19SRUcJMHgwMDAwMDAwOAorI2RlZmluZSBURzNfRkxBR19VU0VfTUlfSU5URVJSVVBUCTB4MDAwMDAwMTAKKyNkZWZpbmUgVEczX0ZMQUdfRU5BQkxFX0FTRgkJMHgwMDAwMDAyMAorI2RlZmluZSBURzNfRkxBR181NzAxX1JFR19XUklURV9CVUcJMHgwMDAwMDA0MAorI2RlZmluZSBURzNfRkxBR19QT0xMX1NFUkRFUwkJMHgwMDAwMDA4MAorI2RlZmluZSBURzNfRkxBR19NQk9YX1dSSVRFX1JFT1JERVIJMHgwMDAwMDEwMAorI2RlZmluZSBURzNfRkxBR19QQ0lYX1RBUkdFVF9IV0JVRwkweDAwMDAwMjAwCisjZGVmaW5lIFRHM19GTEFHX1dPTF9TUEVFRF8xMDBNQgkweDAwMDAwNDAwCisjZGVmaW5lIFRHM19GTEFHX1dPTF9FTkFCTEUJCTB4MDAwMDA4MDAKKyNkZWZpbmUgVEczX0ZMQUdfRUVQUk9NX1dSSVRFX1BST1QJMHgwMDAwMTAwMAorI2RlZmluZSBURzNfRkxBR19OVlJBTQkJCTB4MDAwMDIwMDAKKyNkZWZpbmUgVEczX0ZMQUdfTlZSQU1fQlVGRkVSRUQJCTB4MDAwMDQwMDAKKyNkZWZpbmUgVEczX0ZMQUdfUlhfUEFVU0UJCTB4MDAwMDgwMDAKKyNkZWZpbmUgVEczX0ZMQUdfVFhfUEFVU0UJCTB4MDAwMTAwMDAKKyNkZWZpbmUgVEczX0ZMQUdfUENJWF9NT0RFCQkweDAwMDIwMDAwCisjZGVmaW5lIFRHM19GTEFHX1BDSV9ISUdIX1NQRUVECQkweDAwMDQwMDAwCisjZGVmaW5lIFRHM19GTEFHX1BDSV8zMkJJVAkJMHgwMDA4MDAwMAorI2RlZmluZSBURzNfRkxBR19OT19UWF9QU0VVRE9fQ1NVTQkweDAwMTAwMDAwCisjZGVmaW5lIFRHM19GTEFHX05PX1JYX1BTRVVET19DU1VNCTB4MDAyMDAwMDAKKyNkZWZpbmUgVEczX0ZMQUdfU0VSREVTX1dPTF9DQVAJCTB4MDA0MDAwMDAKKyNkZWZpbmUgVEczX0ZMQUdfSlVNQk9fRU5BQkxFCQkweDAwODAwMDAwCisjZGVmaW5lIFRHM19GTEFHXzEwXzEwMF9PTkxZCQkweDAxMDAwMDAwCisjZGVmaW5lIFRHM19GTEFHX1BBVVNFX0FVVE9ORUcJCTB4MDIwMDAwMDAKKyNkZWZpbmUgVEczX0ZMQUdfUEFVU0VfUlgJCTB4MDQwMDAwMDAKKyNkZWZpbmUgVEczX0ZMQUdfUEFVU0VfVFgJCTB4MDgwMDAwMDAKKyNkZWZpbmUgVEczX0ZMQUdfQlJPS0VOX0NIRUNLU1VNUwkweDEwMDAwMDAwCisjZGVmaW5lIFRHM19GTEFHX0dPVF9TRVJERVNfRkxPV0NUTAkweDIwMDAwMDAwCisjZGVmaW5lIFRHM19GTEFHX1NQTElUX01PREUJCTB4NDAwMDAwMDAKKyNkZWZpbmUgVEczX0ZMQUdfSU5JVF9DT01QTEVURQkJMHg4MDAwMDAwMAorCisJdWludDMyX3QJCQl0ZzNfZmxhZ3MyOworI2RlZmluZSBURzNfRkxHMl9SRVNUQVJUX1RJTUVSCQkweDAwMDAwMDAxCisjZGVmaW5lIFRHM19GTEcyX1NVTl81NzA0CQkweDAwMDAwMDAyCisjZGVmaW5lIFRHM19GTEcyX05PX0VUSF9XSVJFX1NQRUVECTB4MDAwMDAwMDQKKyNkZWZpbmUgVEczX0ZMRzJfSVNfNTc4OAkJMHgwMDAwMDAwOAorI2RlZmluZSBURzNfRkxHMl9NQVhfUlhQRU5EXzY0CQkweDAwMDAwMDEwCisjZGVmaW5lIFRHM19GTEcyX1RTT19DQVBBQkxFCQkweDAwMDAwMDIwCisKKworCisJdWludDMyX3QJCQlzcGxpdF9tb2RlX21heF9yZXFzOworI2RlZmluZSBTUExJVF9NT0RFXzU3MDRfTUFYX1JFUQkJMworCisjaWYgMAorCXN0cnVjdCB0aW1lcl9saXN0CQl0aW1lcjsKKwl1aW50MTZfdAkJCXRpbWVyX2NvdW50ZXI7CisJdWludDE2X3QJCQl0aW1lcl9tdWx0aXBsaWVyOworCXVpbnQzMl90CQkJdGltZXJfb2Zmc2V0OworCXVpbnQxNl90CQkJYXNmX2NvdW50ZXI7CisJdWludDE2X3QJCQlhc2ZfbXVsdGlwbGllcjsKKyNlbmRpZgorCisJc3RydWN0IHRnM19saW5rX2NvbmZpZwkJbGlua19jb25maWc7CisJc3RydWN0IHRnM19idWZtZ3JfY29uZmlnCWJ1Zm1ncl9jb25maWc7CisKKyNpZiAwCisJdWludDMyX3QJCQlyeF9wZW5kaW5nOworCXVpbnQzMl90CQkJcnhfanVtYm9fcGVuZGluZzsKKwl1aW50MzJfdAkJCXR4X3BlbmRpbmc7CisjZW5kaWYKKworCS8qIGNhY2hlIGgvdyB2YWx1ZXMsIG9mdGVuIHBhc3NlZCBzdHJhaWdodCB0byBoL3cgKi8KKwl1aW50MzJfdAkJCXJ4X21vZGU7CisJdWludDMyX3QJCQl0eF9tb2RlOworCXVpbnQzMl90CQkJbWFjX21vZGU7CisJdWludDMyX3QJCQltaV9tb2RlOworCXVpbnQzMl90CQkJbWlzY19ob3N0X2N0cmw7CisJdWludDMyX3QJCQlncmNfbW9kZTsKKwl1aW50MzJfdAkJCWdyY19sb2NhbF9jdHJsOworCXVpbnQzMl90CQkJZG1hX3J3Y3RybDsKKyNpZiAwCisJdWludDMyX3QJCQljb2FsZXNjZV9tb2RlOworI2VuZGlmCisKKwkvKiBQQ0kgYmxvY2sgKi8KKwl1aW50MTZfdAkJCXBjaV9jaGlwX3Jldl9pZDsKKyNpZiAwCisJdWludDhfdAkJCQlwY2lfY2FjaGVsaW5lX3N6OworCXVpbnQ4X3QJCQkJcGNpX2xhdF90aW1lcjsKKwl1aW50OF90CQkJCXBjaV9oZHJfdHlwZTsKKwl1aW50OF90CQkJCXBjaV9iaXN0OworI2VuZGlmCisJdWludDMyX3QJCQlwY2lfY2ZnX3N0YXRlWzY0IC8gc2l6ZW9mKHVpbnQzMl90KV07CisKKwlpbnQJCQkJcG1fY2FwOworCisJLyogUEhZIGluZm8gKi8KKwl1aW50MzJfdAkJCXBoeV9pZDsKKyNkZWZpbmUgUEhZX0lEX01BU0sJCQkweGZmZmZmZmYwCisjZGVmaW5lIFBIWV9JRF9CQ001NDAwCQkJMHg2MDAwODA0MAorI2RlZmluZSBQSFlfSURfQkNNNTQwMQkJCTB4NjAwMDgwNTAKKyNkZWZpbmUgUEhZX0lEX0JDTTU0MTEJCQkweDYwMDA4MDcwCisjZGVmaW5lIFBIWV9JRF9CQ001NzAxCQkJMHg2MDAwODExMAorI2RlZmluZSBQSFlfSURfQkNNNTcwMwkJCTB4NjAwMDgxNjAKKyNkZWZpbmUgUEhZX0lEX0JDTTU3MDQJCQkweDYwMDA4MTkwCisjZGVmaW5lIFBIWV9JRF9CQ001NzA1CQkJMHg2MDAwODFhMAorI2RlZmluZSBQSFlfSURfQkNNODAwMgkJCTB4NjAwMTAxNDAKKyNkZWZpbmUgUEhZX0lEX1NFUkRFUwkJCTB4ZmVlZGJlZTAKKyNkZWZpbmUgUEhZX0lEX0lOVkFMSUQJCQkweGZmZmZmZmZmCisjZGVmaW5lIFBIWV9JRF9SRVZfTUFTSwkJCTB4MDAwMDAwMGYKKyNkZWZpbmUgUEhZX1JFVl9CQ001NDAxX0IwCQkweDEKKyNkZWZpbmUgUEhZX1JFVl9CQ001NDAxX0IyCQkweDMKKyNkZWZpbmUgUEhZX1JFVl9CQ001NDAxX0MwCQkweDYKKyNkZWZpbmUgUEhZX1JFVl9CQ001NDExX1gwCQkweDEgLyogRm91bmQgb24gTmV0Z2VhciBHQTMwMlQgKi8KKworCWVudW0gcGh5X2xlZF9tb2RlCQlsZWRfbW9kZTsKKworCWNoYXIJCQkJYm9hcmRfcGFydF9udW1iZXJbMjRdOworCXVpbnQzMl90CQkJbmljX3NyYW1fZGF0YV9jZmc7CisJdWludDMyX3QJCQlwY2lfY2xvY2tfY3RybDsKKyNpZiAwCisJc3RydWN0IHBjaV9kZXZpY2UJCSpwZGV2X3BlZXI7CisjZW5kaWYKKworCS8qIFRoaXMgbWFjcm8gYXNzdW1lcyB0aGUgcGFzc2VkIFBIWSBJRCBpcyBhbHJlYWR5IG1hc2tlZAorCSAqIHdpdGggUEhZX0lEX01BU0suCisJICovCisjZGVmaW5lIEtOT1dOX1BIWV9JRChYKQkJXAorCSgoWCkgPT0gUEhZX0lEX0JDTTU0MDAgfHwgKFgpID09IFBIWV9JRF9CQ001NDAxIHx8IFwKKwkgKFgpID09IFBIWV9JRF9CQ001NDExIHx8IChYKSA9PSBQSFlfSURfQkNNNTcwMSB8fCBcCisJIChYKSA9PSBQSFlfSURfQkNNNTcwMyB8fCAoWCkgPT0gUEhZX0lEX0JDTTU3MDQgfHwgXAorCSAoWCkgPT0gUEhZX0lEX0JDTTU3MDUgfHwgXAorCSAoWCkgPT0gUEhZX0lEX0JDTTgwMDIgfHwgKFgpID09IFBIWV9JRF9TRVJERVMpCisKKwl1bnNpZ25lZCBsb25nCQkJcmVnczsKKwlzdHJ1Y3QgcGNpX2RldmljZQkJKnBkZXY7CisJc3RydWN0IG5pYwkJCSpuaWM7CisjaWYgMAorCXN0cnVjdCBuZXRfZGV2aWNlCQkqZGV2OworI2VuZGlmCisjaWYgVEczX1ZMQU5fVEFHX1VTRUQKKwlzdHJ1Y3Qgdmxhbl9ncm91cAkJKnZsZ3JwOworI2VuZGlmCisKKwlzdHJ1Y3QgdGczX3J4X2J1ZmZlcl9kZXNjCSpyeF9zdGQ7CisjaWYgMAorCXN0cnVjdCByaW5nX2luZm8JCSpyeF9zdGRfYnVmZmVyczsKKwlkbWFfYWRkcl90CQkJcnhfc3RkX21hcHBpbmc7CisJc3RydWN0IHRnM19yeF9idWZmZXJfZGVzYwkqcnhfanVtYm87CisJc3RydWN0IHJpbmdfaW5mbwkJKnJ4X2p1bWJvX2J1ZmZlcnM7CisJZG1hX2FkZHJfdAkJCXJ4X2p1bWJvX21hcHBpbmc7CisjZW5kaWYKKworCXN0cnVjdCB0ZzNfcnhfYnVmZmVyX2Rlc2MJKnJ4X3JjYjsKKyNpZiAwCisJZG1hX2FkZHJfdAkJCXJ4X3JjYl9tYXBwaW5nOworI2VuZGlmCisKKwkvKiBUWCBkZXNjcyBhcmUgb25seSB1c2VkIGlmIFRHM19GTEFHX0hPU1RfVFhEUyBpcyBzZXQuICovCisJc3RydWN0IHRnM190eF9idWZmZXJfZGVzYwkqdHhfcmluZzsKKyNpZiAwCisJc3RydWN0IHR4X3JpbmdfaW5mbwkJKnR4X2J1ZmZlcnM7CisJZG1hX2FkZHJfdAkJCXR4X2Rlc2NfbWFwcGluZzsKKyNlbmRpZgorCisJc3RydWN0IHRnM19od19zdGF0dXMJCSpod19zdGF0dXM7CisjaWYgMAorCWRtYV9hZGRyX3QJCQlzdGF0dXNfbWFwcGluZzsKKyNlbmRpZgorI2lmIDAKKwl1aW50MzJfdAkJCW1zZ19lbmFibGU7CisjZW5kaWYKKworCXN0cnVjdCB0ZzNfaHdfc3RhdHMJCSpod19zdGF0czsKKyNpZiAwCisJZG1hX2FkZHJfdAkJCXN0YXRzX21hcHBpbmc7CisjZW5kaWYKKworCWludAkJCQljYXJyaWVyX29rOworCXVpbnQxNl90CQkJc3Vic3lzdGVtX3ZlbmRvcjsKKwl1aW50MTZfdAkJCXN1YnN5c3RlbV9kZXZpY2U7Cit9OworCisjZW5kaWYgLyogIShfVDNfSCkgKi8KZGlmZiAtTmF1ciBncnViLTAuOTcub3JpZy9uZXRib290L3RpYXJhLmMgZ3J1Yi0wLjk3L25ldGJvb3QvdGlhcmEuYwotLS0gZ3J1Yi0wLjk3Lm9yaWcvbmV0Ym9vdC90aWFyYS5jCTIwMDMtMDctMDkgMTE6NDU6MzguMDAwMDAwMDAwICswMDAwCisrKyBncnViLTAuOTcvbmV0Ym9vdC90aWFyYS5jCTE5NzAtMDEtMDEgMDA6MDA6MDAuMDAwMDAwMDAwICswMDAwCkBAIC0xLDI1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLUV0aGVyYm9vdCAtICBCT09UUC9URlRQIEJvb3RzdHJhcCBQcm9ncmFtCi0KLVRJQVJBIChGdWppdHN1IEV0aGVyc3RhcikgTklDIGRyaXZlciBmb3IgRXRoZXJib290Ci1Db3B5cmlnaHQgKGMpIEtlbiBZYXAgMTk5OAotCi1JbmZvcm1hdGlvbiBnbGVhbmVkIGZyb206Ci0KLVRJQVJBLkFTTSBQYWNrZXQgZHJpdmVyIGJ5IEJyaWFuIEZpc2hlciwgUXVlZW5zIFUsIEtpbmdzdG9uLCBPbnRhcmlvCi1GdWppdHN1IE1CODY5NjAgc3BlYyBzaGVldCAoZGlmZmVyZW50IGNoaXAgYnV0IHNhbWUgZmFtaWx5KQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQKLSAqIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqLwotCi0vKiB0byBnZXQgc29tZSBnbG9iYWwgcm91dGluZXMgbGlrZSBwcmludGYgKi8KLSNpbmNsdWRlICJldGhlcmJvb3QuaCIKLS8qIHRvIGdldCB0aGUgaW50ZXJmYWNlIHRvIHRoZSBib2R5IG9mIHRoZSBwcm9ncmFtICovCi0jaW5jbHVkZSAibmljLmgiCi0jaW5jbHVkZSAiY2FyZHMuaCIKLQotLyoKLQlFdGhlclN0YXIgSS9PIFJlZ2lzdGVyIG9mZnNldHMKLSovCi0KLS8qIE9mZnNldHMgb2YgcmVnaXN0ZXJzICovCi0jZGVmaW5lCURMQ1JfWE1JVF9TVEFUCTB4MDAKLSNkZWZpbmUJRExDUl9YTUlUX01BU0sJMHgwMQotI2RlZmluZQlETENSX1JFQ1ZfU1RBVAkweDAyCi0jZGVmaW5lCURMQ1JfUkVDVl9NQVNLCTB4MDMKLSNkZWZpbmUJRExDUl9YTUlUX01PREUJMHgwNAotI2RlZmluZQlETENSX1JFQ1ZfTU9ERQkweDA1Ci0jZGVmaW5lCURMQ1JfRU5BQkxFCTB4MDYKLSNkZWZpbmUJRExDUl9URFJfTE9XCTB4MDcKLSNkZWZpbmUJRExDUl9OT0RFX0lECTB4MDgKLSNkZWZpbmUJRExDUl9URFJfSElHSAkweDBGCi0jZGVmaW5lCUJNUFJfTUVNX1BPUlQJMHgxMAotI2RlZmluZQlCTVBSX1BLVF9MRU4JMHgxMgotI2RlZmluZQlCTVBSX0RNQV9FTkFCTEUJMHgxNAotI2RlZmluZQlQUk9NX0lECQkweDE4Ci0KLSNkZWZpbmUJVE1TVAkJMHg4MAotI2RlZmluZQlUTVRfT0sJCTB4ODAKLSNkZWZpbmUJVE1UXzE2Q09MTAkweDAyCi0jZGVmaW5lCUJVRl9FTVBUWQkweDQwCi0KLSNkZWZpbmUJQ0FSRF9ESVNBQkxFCTB4ODAJLyogd3JpdHRlbiB0byBETENSX0VOQUJMRSB0byBkaXNhYmxlIGNhcmQgKi8KLSNkZWZpbmUJQ0FSRF9FTkFCTEUJMAkvKiB3cml0dGVuIHRvIERMQ1JfRU5BQkxFIHRvIGVuYWJsZSBjYXJkICovCi0KLSNkZWZpbmUJQ0xFQVJfU1RBVFVTCTB4MEYJLyogdXNlZCB0byBjbGVhciBzdGF0dXMgaW5mbyAqLwotLyoKLQkwMDAwMTExMUIKLQkhISEhISEhIS0tLS0tLS0tCi0JISEhISEhISstLS0tLS0tLUNMRUFSIEJVUyBXUklURSBFUlJPUgotCSEhISEhISstLS0tLS0tLS1DTEVBUiAxNiBDT0xMSVNJT04KLQkhISEhISstLS0tLS0tLS0tQ0xFQVIgQ09MTElTSU9OCi0JISEhISstLS0tLS0tLS0tLUNMRUFSIFVOREVSRkxPVwotCSEhISstLS0tLS0tLS0tLS1OQwotCSEhKy0tLS0tLS0tLS0tLS1OQwotCSErLS0tLS0tLS0tLS0tLS1OQwotCSstLS0tLS0tLS0tLS0tLS1OQwotKi8KLQotI2RlZmluZQlOT19UWF9JUlFTCTAJLyogd3JpdHRlbiB0byBjbGVhciB0cmFuc21pdCBJUlFzICovCi0KLSNkZWZpbmUJQ0xSX1JDVl9TVEFUVVMJMHhDRgkvKiBjbGVhcnMgcmVjZWl2ZSBzdGF0dXMgKi8KLQotI2RlZmluZQlFTl9SQ1ZfSVJRUwkweDgwCS8qIGVuYWJsZSByZWNlaXZlIGludGVycnVwdHMgKi8KLS8qCi0JMTAwMDAwMDBCCi0JISEhISEhISEtLS0tLS0tLQotCSEhISEhISErLS0tLS0tLS1FTkFCTEUgT1ZFUkZMT1cKLQkhISEhISErLS0tLS0tLS0tRU5BQkxFIENSQwotCSEhISEhKy0tLS0tLS0tLS1FTkFCTEUgQUxJR04KLQkhISEhKy0tLS0tLS0tLS0tRU5BQkxFIFNIT1JUIFBLVAotCSEhISstLS0tLS0tLS0tLS1ESVNBQkxFIFJFTU9URSBSRVNFVAotCSEhKy0tLS0tLS0tLS0tLS1SRVNFUlZFRAotCSErLS0tLS0tLS0tLS0tLS1SRVNFUlZFRAotCSstLS0tLS0tLS0tLS0tLS1FTkFCTEUgUEtUIFJFQURZCi0qLwotCi0jZGVmaW5lCVhNSVRfTU9ERQkweDAyCi0vKgotCTAwMDAwMDEwQgotCSEhISEhISEhLS0tLS0tLS0tRU5BQkxFIENBUlJJRVIgREVURUNUCi0JISEhISEhISstLS0tLS0tLS1ESVNBQkxFIExPT1BCQUNLCi0qLwotCi0jZGVmaW5lCVJFQ1ZfTU9ERQkweDAyCi0vKgotCTAwMDAwMDEwQgotCSEhISEhISEhLS0tLS0tLS0tQUNDRVBUIEFMTCBQQUNLRVRTCi0JISEhISEhISstLS0tLS0tLS1BQ0NFUFQgUEhZU0lDQUwsIE1VTFRJQ0FTVCwgQU5ECi0JISEhISEhKy0tLS0tLS0tLS1CUk9BRENBU1QgUEFDS0VUUwotCSEhISEhKy0tLS0tLS0tLS0tRElTQUJMRSBSRU1PVEUgUkVTRVQKLQkhISEhKy0tLS0tLS0tLS0tLURJU0FCTEUgU0hPUlQgUEFDS0VUUwotCSEhISstLS0tLS0tLS0tLS0tVVNFIDYgQllURSBBRERSRVNTCi0JISErLS0tLS0tLS0tLS0tLS1OQwotCSErLS0tLS0tLS0tLS0tLS0tTkMKLQkrLS0tLS0tLS0tLS0tLS0tLURJU0FCTEUgQ1JDIFRFU1QgTU9ERQotKi8KLQotLyogTklDIHNwZWNpZmljIHN0YXRpYyB2YXJpYWJsZXMgZ28gaGVyZSAqLwotCi1zdGF0aWMgdW5zaWduZWQgc2hvcnQJaW9hZGRyOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFU0VUIC0gUmVzZXQgYWRhcHRlcgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgdGlhcmFfcmVzZXQoc3RydWN0IG5pYyAqbmljKQotewotCWludAkJaTsKLQotCW91dGIoQ0FSRF9ESVNBQkxFLCBpb2FkZHIgKyBETENSX0VOQUJMRSk7Ci0Jb3V0YihDTEVBUl9TVEFUVVMsIGlvYWRkciArIERMQ1JfWE1JVF9TVEFUKTsKLQlvdXRiKE5PX1RYX0lSUVMsIGlvYWRkciArIERMQ1JfWE1JVF9NQVNLKTsKLQlvdXRiKENMUl9SQ1ZfU1RBVFVTLCBpb2FkZHIgKyBETENSX1JFQ1ZfU1RBVCk7Ci0Jb3V0YihYTUlUX01PREUsIGlvYWRkciArIERMQ1JfWE1JVF9NT0RFKTsKLQlvdXRiKFJFQ1ZfTU9ERSwgaW9hZGRyICsgRExDUl9SRUNWX01PREUpOwotCS8qIFZhY3V1bSByZWN2IGJ1ZmZlciAqLwotCXdoaWxlICgoaW5iKGlvYWRkciArIERMQ1JfUkVDVl9NT0RFKSAmIEJVRl9FTVBUWSkgPT0gMCkKLQkJaW5iKGlvYWRkciArIEJNUFJfTUVNX1BPUlQpOwotCS8qIFNldCBub2RlIGFkZHJlc3MgKi8KLQlmb3IgKGkgPSAwOyBpIDwgRVRIX0FMRU47ICsraSkKLQkJb3V0YihuaWMtPm5vZGVfYWRkcltpXSwgaW9hZGRyICsgRExDUl9OT0RFX0lEICsgaSk7Ci0Jb3V0YihDTFJfUkNWX1NUQVRVUywgaW9hZGRyICsgRExDUl9SRUNWX1NUQVQpOwotCW91dGIoQ0FSRF9FTkFCTEUsIGlvYWRkciArIERMQ1JfRU5BQkxFKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1QT0xMIC0gV2FpdCBmb3IgYSBmcmFtZQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIGludCB0aWFyYV9wb2xsKHN0cnVjdCBuaWMgKm5pYykKLXsKLQl1bnNpZ25lZCBpbnQJCWxlbjsKLQotCWlmIChpbmIoaW9hZGRyICsgRExDUl9SRUNWX01PREUpICYgQlVGX0VNUFRZKQotCQlyZXR1cm4gKDApOwotCS8qIEFjayBwYWNrZXQgKi8KLQlvdXR3KENMUl9SQ1ZfU1RBVFVTLCBpb2FkZHIgKyBETENSX1JFQ1ZfU1RBVCk7Ci0JbGVuID0gaW53KGlvYWRkciArIEJNUFJfTUVNX1BPUlQpOwkJLyogdGhyb3cgYXdheSBzdGF0dXMgKi8KLQlsZW4gPSBpbncoaW9hZGRyICsgQk1QUl9NRU1fUE9SVCk7Ci0JLyogRHJvcCBvdmVybGVuZ3RoIHBhY2tldHMgKi8KLQlpZiAobGVuID4gRVRIX0ZSQU1FX0xFTikKLQkJcmV0dXJuICgwKTsJCS8qIHNob3VsZCB3ZSBkcmFpbiB0aGUgYnVmZmVyPyAqLwotCWluc3coaW9hZGRyICsgQk1QUl9NRU1fUE9SVCwgbmljLT5wYWNrZXQsIGxlbiAvIDIpOwotCS8qIElmIGl0J3Mgb3VyIG93biwgZHJvcCBpdCAqLwotCWlmIChtZW1jbXAobmljLT5wYWNrZXQgKyBFVEhfQUxFTiwgbmljLT5ub2RlX2FkZHIsIEVUSF9BTEVOKSA9PSAwKQotCQlyZXR1cm4gKDApOwotCW5pYy0+cGFja2V0bGVuID0gbGVuOwotCXJldHVybiAoMSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotVFJBTlNNSVQgLSBUcmFuc21pdCBhIGZyYW1lCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCB0aWFyYV90cmFuc21pdCgKLXN0cnVjdCBuaWMgKm5pYywKLWNvbnN0IGNoYXIgKmQsCQkJLyogRGVzdGluYXRpb24gKi8KLXVuc2lnbmVkIGludCB0LAkJCS8qIFR5cGUgKi8KLXVuc2lnbmVkIGludCBzLAkJCS8qIHNpemUgKi8KLWNvbnN0IGNoYXIgKnApCQkJLyogUGFja2V0ICovCi17Ci0JdW5zaWduZWQgaW50CWxlbjsKLQl1bnNpZ25lZCBsb25nCXRpbWU7Ci0KLQlsZW4gPSBzICsgRVRIX0hMRU47Ci0JaWYgKGxlbiA8IEVUSF9aTEVOKQotCQlsZW4gPSBFVEhfWkxFTjsKLQl0ID0gaHRvbnModCk7Ci0Jb3V0c3coaW9hZGRyICsgQk1QUl9NRU1fUE9SVCwgZCwgRVRIX0FMRU4gLyAyKTsKLQlvdXRzdyhpb2FkZHIgKyBCTVBSX01FTV9QT1JULCBuaWMtPm5vZGVfYWRkciwgRVRIX0FMRU4gLyAyKTsKLQlvdXR3KHQsIGlvYWRkciArIEJNUFJfTUVNX1BPUlQpOwotCW91dHN3KGlvYWRkciArIEJNUFJfTUVNX1BPUlQsIHAsIHMgLyAyKTsKLQlpZiAocyAmIDEpCQkJCQkvKiBsYXN0IGJ5dGUgKi8KLQkJb3V0YihwW3MtMV0sIGlvYWRkciArIEJNUFJfTUVNX1BPUlQpOwotCXdoaWxlIChzKysgPCBFVEhfWkxFTiAtIEVUSF9ITEVOKQkvKiBwYWQgKi8KLQkJb3V0YigwLCBpb2FkZHIgKyBCTVBSX01FTV9QT1JUKTsKLQlvdXR3KGxlbiB8IChUTVNUIDw8IDgpLCBpb2FkZHIgKyBCTVBSX1BLVF9MRU4pOwotCS8qIHdhaXQgZm9yIHRyYW5zbWl0IGNvbXBsZXRlICovCi0JdGltZSA9IGN1cnJ0aWNrcygpICsgVElDS1NfUEVSX1NFQzsJCS8qIHdhaXQgb25lIHNlY29uZCAqLwotCXdoaWxlIChjdXJydGlja3MoKSA8IHRpbWUgJiYgKGluYihpb2FkZHIpICYgKFRNVF9PS3xUTVRfMTZDT0xMKSkgPT0gMCkKLQkJOwotCWlmICgoaW5iKGlvYWRkcikgJiAoVE1UX09LfFRNVF8xNkNPTEwpKSA9PSAwKQotCQlwcmludGYoIlRpYXJhIHRpbWVkIG91dCBvbiB0cmFuc21pdFxuIik7Ci0JLyogRG8gd2UgbmVlZCB0byBhY2sgdGhlIHRyYW5zbWl0PyAqLwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLURJU0FCTEUgLSBUdXJuIG9mZiBldGhlcm5ldCBpbnRlcmZhY2UKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIHRpYXJhX2Rpc2FibGUoc3RydWN0IG5pYyAqbmljKQotewotCS8qIEFwcGFyZW50bHkgb25seSBhIHBvd2VyIGRvd24gY2FuIGRvIHRoaXMgcHJvcGVybHkgKi8KLQlvdXRiKENBUkRfRElTQUJMRSwgaW9hZGRyICsgRExDUl9FTkFCTEUpOwotfQotCi1zdGF0aWMgaW50IHRpYXJhX3Byb2JlMShzdHJ1Y3QgbmljICpuaWMpCi17Ci0JLyogSG9wZSBhbGwgdGhlIFRpYXJhIGNhcmRzIGhhdmUgdGhpcyB2ZW5kb3IgcHJlZml4ICovCi0Jc3RhdGljIGNoYXIJdmVuZG9yX3ByZWZpeFtdID0geyAweDA4LCAweDAwLCAweDFBIH07Ci0Jc3RhdGljIGNoYXIJYWxsX29uZXNbXSA9IHsgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiB9OwotCWludAkJaTsKLQotCWZvciAoaSA9IDA7IGkgPCBFVEhfQUxFTjsgKytpKQotCQluaWMtPm5vZGVfYWRkcltpXSA9IGluYihpb2FkZHIgKyBQUk9NX0lEICsgaSk7Ci0JaWYgKG1lbWNtcChuaWMtPm5vZGVfYWRkciwgdmVuZG9yX3ByZWZpeCwgc2l6ZW9mKHZlbmRvcl9wcmVmaXgpKSAhPSAwKQotCQlyZXR1cm4gKDApOwotCWlmIChtZW1jbXAobmljLT5ub2RlX2FkZHIsIGFsbF9vbmVzLCBzaXplb2YoYWxsX29uZXMpKSA9PSAwKQotCQlyZXR1cm4gKDApOwotCXByaW50ZigiXG5UaWFyYSBpb2FkZHIgJSNoWCwgYWRkciAlIVxuIiwgaW9hZGRyLCBuaWMtPm5vZGVfYWRkcik7Ci0JcmV0dXJuICgxKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1QUk9CRSAtIExvb2sgZm9yIGFuIGFkYXB0ZXIsIHRoaXMgcm91dGluZSdzIHZpc2libGUgdG8gdGhlIG91dHNpZGUKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0cnVjdCBuaWMgKnRpYXJhX3Byb2JlKHN0cnVjdCBuaWMgKm5pYywgdW5zaWduZWQgc2hvcnQgKnByb2JlX2FkZHJzKQotewotCS8qIG1pc3NpbmcgZW50cmllcyBhcmUgYWRkcmVzc2VzIHVzdWFsbHkgYWxyZWFkeSB1c2VkICovCi0Jc3RhdGljIHVuc2lnbmVkIHNob3J0CWlvX2FkZHJzW10gPSB7Ci0JCTB4MTAwLCAweDEyMCwgMHgxNDAsIDB4MTYwLAotCQkweDE4MCwgMHgxQTAsIDB4MUMwLCAweDFFMCwKLQkJMHgyMDAsIDB4MjIwLCAweDI0MCwgLypQYXIqLwotCQkweDI4MCwgMHgyQTAsIDB4MkMwLCAvKlNlciovCi0JCTB4MzAwLCAweDMyMCwgMHgzNDAsIC8qUGFyKi8KLQkJMHgzODAsIC8qVmlkLFBhciovIDB4M0MwLCAvKlNlciovCi0JCTB4MAotCX07Ci0JdW5zaWduZWQgc2hvcnQJCSpwOwotCi0JLyogaWYgcHJvYmVfYWRkcnMgaXMgMCwgdGhlbiByb3V0aW5lIGNhbiB1c2UgYSBoYXJkd2lyZWQgZGVmYXVsdCAqLwotCWlmIChwcm9iZV9hZGRycyA9PSAwKQotCQlwcm9iZV9hZGRycyA9IGlvX2FkZHJzOwotCWZvciAocCA9IHByb2JlX2FkZHJzOyAoaW9hZGRyID0gKnApICE9IDA7ICsrcCkKLQkJaWYgKHRpYXJhX3Byb2JlMShuaWMpKQotCQkJYnJlYWs7Ci0JLyogaWYgYm9hcmQgZm91bmQgKi8KLQlpZiAoaW9hZGRyICE9IDApCi0JewotCQl0aWFyYV9yZXNldChuaWMpOwotCQkvKiBwb2ludCB0byBOSUMgc3BlY2lmaWMgcm91dGluZXMgKi8KLQkJbmljLT5yZXNldCA9IHRpYXJhX3Jlc2V0OwotCQluaWMtPnBvbGwgPSB0aWFyYV9wb2xsOwotCQluaWMtPnRyYW5zbWl0ID0gdGlhcmFfdHJhbnNtaXQ7Ci0JCW5pYy0+ZGlzYWJsZSA9IHRpYXJhX2Rpc2FibGU7Ci0JCXJldHVybiBuaWM7Ci0JfQotCWVsc2UKLQkJcmV0dXJuICgwKTsKLX0KZGlmZiAtTmF1ciBncnViLTAuOTcub3JpZy9uZXRib290L3RpbWVyLmMgZ3J1Yi0wLjk3L25ldGJvb3QvdGltZXIuYwotLS0gZ3J1Yi0wLjk3Lm9yaWcvbmV0Ym9vdC90aW1lci5jCTIwMDMtMDctMDkgMTE6NDU6MzguMDAwMDAwMDAwICswMDAwCisrKyBncnViLTAuOTcvbmV0Ym9vdC90aW1lci5jCTIwMDUtMDgtMzEgMTk6MDM6MzUuMDAwMDAwMDAwICswMDAwCkBAIC02LDEyMiArNiwyNCBAQAogICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdAogICogeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogICovCi0KLSNpbmNsdWRlCSJldGhlcmJvb3QuaCIKKyNpbmNsdWRlICAgICAgICAiZ3J1Yi5oIgogI2luY2x1ZGUJInRpbWVyLmgiCiAKLXZvaWQgbG9hZF90aW1lcjIodW5zaWduZWQgaW50IHRpY2tzKQotewotCS8qIFNldCB1cCB0aGUgdGltZXIgZ2F0ZSwgdHVybiBvZmYgdGhlIHNwZWFrZXIgKi8KLQlvdXRiKChpbmIoUFBDX1BPUlRCKSAmIH5QUENCX1NQS1IpIHwgUFBDQl9UMkdBVEUsIFBQQ19QT1JUQik7Ci0Jb3V0YihUSU1FUjJfU0VMfFdPUkRfQUNDRVNTfE1PREUwfEJJTkFSWV9DT1VOVCwgVElNRVJfTU9ERV9QT1JUKTsKLQlvdXRiKHRpY2tzICYgMHhGRiwgVElNRVIyX1BPUlQpOwotCW91dGIodGlja3MgPj4gOCwgVElNRVIyX1BPUlQpOwotfQotCi0jaWYgZGVmaW5lZChDT05GSUdfVFNDX0NVUlJUSUNLUykKLSNkZWZpbmUgcmR0c2MobG93LGhpZ2gpIFwKLSAgICAgX19hc21fXyBfX3ZvbGF0aWxlX18oInJkdHNjIiA6ICI9YSIgKGxvdyksICI9ZCIgKGhpZ2gpKQotCi0jZGVmaW5lIHJkdHNjbGwodmFsKSBcCi0gICAgIF9fYXNtX18gX192b2xhdGlsZV9fICgicmR0c2MiIDogIj1BIiAodmFsKSkKLQotCi0jZGVmaW5lIEhaIFRJQ0tTX1BFUl9TRUMKLSNkZWZpbmUgQ0xPQ0tfVElDS19SQVRFCTExOTMxODBVIC8qIFVuZGVybHlpbmcgSFogKi8KLS8qIExBVENIIGlzIHVzZWQgaW4gdGhlIGludGVydmFsIHRpbWVyIGFuZCBmdGFwZSBzZXR1cC4gKi8KLSNkZWZpbmUgTEFUQ0ggICgoQ0xPQ0tfVElDS19SQVRFICsgSFovMikgLyBIWikJLyogRm9yIGRpdmlkZXIgKi8KKy8qIE1hY2hpbmUgSW5kZXBlbmRhbnQgdGltZXIgaGVscGVyIGZ1bmN0aW9ucyAqLwogCi0KLS8qIC0tLS0tLSBDYWxpYnJhdGUgdGhlIFRTQyAtLS0tLS0tIAotICogUmV0dXJuIDJeMzIgKiAoMSAvIChUU0MgY2xvY2tzIHBlciB1c2VjKSkgZm9yIGRvX2Zhc3RfZ2V0dGltZW9mZnNldCgpLgotICogVG9vIG11Y2ggNjQtYml0IGFyaXRobWV0aWMgaGVyZSB0byBkbyB0aGlzIGNsZWFubHkgaW4gQywgYW5kIGZvcgotICogYWNjdXJhY3kncyBzYWtlIHdlIHdhbnQgdG8ga2VlcCB0aGUgb3ZlcmhlYWQgb24gdGhlIENUQyBzcGVha2VyIChjaGFubmVsIDIpCi0gKiBvdXRwdXQgYnVzeSBsb29wIGFzIGxvdyBhcyBwb3NzaWJsZS4gV2UgYXZvaWQgcmVhZGluZyB0aGUgQ1RDIHJlZ2lzdGVycwotICogZGlyZWN0bHkgYmVjYXVzZSBvZiB0aGUgYXdrd2FyZCA4LWJpdCBhY2Nlc3MgbWVjaGFuaXNtIG9mIHRoZSA4MkM1NAotICogZGV2aWNlLgotICovCi0KLSNkZWZpbmUgQ0FMSUJSQVRFX0xBVENICSg1ICogTEFUQ0gpCi0KLXN0YXRpYyB1bnNpZ25lZCBsb25nIGxvbmcgY2FsaWJyYXRlX3RzYyh2b2lkKQordm9pZCBtZGVsYXkodW5zaWduZWQgaW50IG1zZWNzKQogewotCS8qIFNldCB0aGUgR2F0ZSBoaWdoLCBkaXNhYmxlIHNwZWFrZXIgKi8KLQlvdXRiKChpbmIoMHg2MSkgJiB+MHgwMikgfCAweDAxLCAweDYxKTsKLQotCS8qCi0JICogTm93IGxldCdzIHRha2UgY2FyZSBvZiBDVEMgY2hhbm5lbCAyCi0JICoKLQkgKiBTZXQgdGhlIEdhdGUgaGlnaCwgcHJvZ3JhbSBDVEMgY2hhbm5lbCAyIGZvciBtb2RlIDAsCi0JICogKGludGVycnVwdCBvbiB0ZXJtaW5hbCBjb3VudCBtb2RlKSwgYmluYXJ5IGNvdW50LAotCSAqIGxvYWQgNSAqIExBVENIIGNvdW50LCAoTFNCIGFuZCBNU0IpIHRvIGJlZ2luIGNvdW50ZG93bi4KLQkgKi8KLQlvdXRiKDB4YjAsIDB4NDMpOwkJCS8qIGJpbmFyeSwgbW9kZSAwLCBMU0IvTVNCLCBDaCAyICovCi0Jb3V0YihDQUxJQlJBVEVfTEFUQ0ggJiAweGZmLCAweDQyKTsJLyogTFNCIG9mIGNvdW50ICovCi0Jb3V0YihDQUxJQlJBVEVfTEFUQ0ggPj4gOCwgMHg0Mik7CS8qIE1TQiBvZiBjb3VudCAqLwotCi0JewotCQl1bnNpZ25lZCBsb25nIHN0YXJ0bG93LCBzdGFydGhpZ2g7Ci0JCXVuc2lnbmVkIGxvbmcgZW5kbG93LCBlbmRoaWdoOwotCQl1bnNpZ25lZCBsb25nIGNvdW50OwotCi0JCXJkdHNjKHN0YXJ0bG93LHN0YXJ0aGlnaCk7Ci0JCWNvdW50ID0gMDsKLQkJZG8gewotCQkJY291bnQrKzsKLQkJfSB3aGlsZSAoKGluYigweDYxKSAmIDB4MjApID09IDApOwotCQlyZHRzYyhlbmRsb3csZW5kaGlnaCk7Ci0KLQkJLyogRXJyb3I6IEVDVENORVZFUlNFVCAqLwotCQlpZiAoY291bnQgPD0gMSkKLQkJCWdvdG8gYmFkX2N0YzsKLQotCQkvKiA2NC1iaXQgc3VidHJhY3QgLSBnY2MganVzdCBtZXNzZXMgdXAgd2l0aCBsb25nIGxvbmdzICovCi0JCV9fYXNtX18oInN1YmwgJTIsJTBcblx0IgotCQkJInNiYmwgJTMsJTEiCi0JCQk6Ij1hIiAoZW5kbG93KSwgIj1kIiAoZW5kaGlnaCkKLQkJCToiZyIgKHN0YXJ0bG93KSwgImciIChzdGFydGhpZ2gpLAotCQkJICIwIiAoZW5kbG93KSwgIjEiIChlbmRoaWdoKSk7Ci0KLQkJLyogRXJyb3I6IEVDUFVUT09GQVNUICovCi0JCWlmIChlbmRoaWdoKQotCQkJZ290byBiYWRfY3RjOwotCi0JCWVuZGxvdyAvPSA1OwotCQlyZXR1cm4gZW5kbG93OworCXVuc2lnbmVkIGludCBpOworCWZvcihpID0gMDsgaSA8IG1zZWNzOyBpKyspIHsKKwkJdWRlbGF5KDEwMDApOworCQlwb2xsX2ludGVycnVwdGlvbnMoKTsKIAl9Ci0KLQkvKgotCSAqIFRoZSBDVEMgd2Fzbid0IHJlbGlhYmxlOiB3ZSBnb3QgYSBoaXQgb24gdGhlIHZlcnkgZmlyc3QgcmVhZCwKLQkgKiBvciB0aGUgQ1BVIHdhcyBzbyBmYXN0L3Nsb3cgdGhhdCB0aGUgcXVvdGllbnQgd291bGRuJ3QgZml0IGluCi0JICogMzIgYml0cy4uCi0JICovCi1iYWRfY3RjOgotCXByaW50ZigiYmFkX2N0Y1xuIik7Ci0JcmV0dXJuIDA7CiB9CiAKLQotdW5zaWduZWQgbG9uZyBjdXJydGlja3Modm9pZCkKK3ZvaWQgd2FpdG9uX3RpbWVyMih1bnNpZ25lZCBpbnQgdGlja3MpCiB7Ci0Jc3RhdGljIHVuc2lnbmVkIGxvbmcgY2xvY2tzX3Blcl90aWNrOwotCXVuc2lnbmVkIGxvbmcgY2xvY2tzX2hpZ2gsIGNsb2Nrc19sb3c7Ci0JdW5zaWduZWQgbG9uZyBjdXJydGlja3M7Ci0JaWYgKCFjbG9ja3NfcGVyX3RpY2spIHsKLQkJY2xvY2tzX3Blcl90aWNrID0gY2FsaWJyYXRlX3RzYygpOwotCQlwcmludGYoImNsb2Nrc19wZXJfdGljayA9ICVkXG4iLCBjbG9ja3NfcGVyX3RpY2spOworCWxvYWRfdGltZXIyKHRpY2tzKTsKKwl3aGlsZSh0aW1lcjJfcnVubmluZygpKSB7CisJCXBvbGxfaW50ZXJydXB0aW9ucygpOwogCX0KLQotCS8qIFJlYWQgdGhlIFRpbWUgU3RhbXAgQ291bnRlciAqLwotCXJkdHNjKGNsb2Nrc19sb3csIGNsb2Nrc19oaWdoKTsKLQotCS8qIGN1cnJ0aWNrcyA9IGNsb2NrcyAvIGNsb2Nrc19wZXJfdGljazsgKi8KLQlfX2FzbV9fKCJkaXZsICUxIgotCQk6Ij1hIiAoY3VycnRpY2tzKQotCQk6InIiIChjbG9ja3NfcGVyX3RpY2spLCAiMCIgKGNsb2Nrc19sb3cpLCAiZCIgKGNsb2Nrc19oaWdoKSk7Ci0KLQotCXJldHVybiBjdXJydGlja3M7CiB9Ci0KLSNlbmRpZiAvKiBSVENfQ1VSUlRJQ0tTICovCmRpZmYgLU5hdXIgZ3J1Yi0wLjk3Lm9yaWcvbmV0Ym9vdC90aW1lci5oIGdydWItMC45Ny9uZXRib290L3RpbWVyLmgKLS0tIGdydWItMC45Ny5vcmlnL25ldGJvb3QvdGltZXIuaAkyMDAzLTA3LTA5IDExOjQ1OjM4LjAwMDAwMDAwMCArMDAwMAorKysgZ3J1Yi0wLjk3L25ldGJvb3QvdGltZXIuaAkyMDA1LTA4LTMxIDE5OjAzOjM1LjAwMDAwMDAwMCArMDAwMApAQCAtMzYsNyArMzYsOCBAQAogI2RlZmluZQlCQ0RfQ09VTlQJMHgwMQogCiAvKiBUaW1lcnMgdGljayBvdmVyIGF0IHRoaXMgcmF0ZSAqLwotI2RlZmluZQlUSUNLU19QRVJfTVMJMTE5MworI2RlZmluZSBDTE9DS19USUNLX1JBVEUJMTE5MzE4MFUKKyNkZWZpbmUJVElDS1NfUEVSX01TCShDTE9DS19USUNLX1JBVEUvMTAwMCkKIAogLyogUGFyYWxsZWwgUGVyaXBoZXJhbCBDb250cm9sbGVyIFBvcnQgQiAqLwogI2RlZmluZQlQUENfUE9SVEIJMHg2MQpAQCAtNDksMTYgKzUwLDE5IEBACiAvKiBUaWNrcyBtdXN0IGJlIGJldHdlZW4gMCBhbmQgNjU1MzUgKDAgPT0gNjU1MzYpCiAgICBiZWNhdXNlIGl0IGlzIGEgMTYgYml0IGNvdW50ZXIgKi8KIGV4dGVybiB2b2lkIGxvYWRfdGltZXIyKHVuc2lnbmVkIGludCB0aWNrcyk7Ci1leHRlcm4gaW5saW5lIGludCB0aW1lcjJfcnVubmluZyh2b2lkKQotewotCXJldHVybiAoKGluYihQUENfUE9SVEIpICYgUFBDQl9UMk9VVCkgPT0gMCk7Ci19Ci0KLWV4dGVybiBpbmxpbmUgdm9pZCB3YWl0b25fdGltZXIyKHVuc2lnbmVkIGludCB0aWNrcykKLXsKLQlsb2FkX3RpbWVyMih0aWNrcyk7Ci0Jd2hpbGUgKChpbmIoUFBDX1BPUlRCKSAmIFBQQ0JfVDJPVVQpID09IDApCi0JCTsKLX0KK2V4dGVybiBpbmxpbmUgaW50IHRpbWVyMl9ydW5uaW5nKHZvaWQpOworZXh0ZXJuIHZvaWQgd2FpdG9uX3RpbWVyMih1bnNpZ25lZCBpbnQgdGlja3MpOworZXh0ZXJuIHZvaWQgX19sb2FkX3RpbWVyMih1bnNpZ25lZCBpbnQgdGlja3MpOworCitleHRlcm4gdm9pZCBzZXR1cF90aW1lcnModm9pZCk7CitleHRlcm4gdm9pZCBuZGVsYXkodW5zaWduZWQgaW50IG5zZWNzKTsKK2V4dGVybiB2b2lkIHVkZWxheSh1bnNpZ25lZCBpbnQgdXNlY3MpOworZXh0ZXJuIHZvaWQgbWRlbGF5KHVuc2lnbmVkIGludCBtc2Vjcyk7CisvL2V4dGVybiB1bnNpZ25lZCBsb25nIGN1cnJ0aWNrcyh2b2lkKTsKKworc3RydWN0IHRpbWV2YWwgeworCWxvbmcgdHZfc2VjOworCWxvbmcgdHZfdXNlYzsKK307CiAKICNlbmRpZgkvKiBUSU1FUl9IICovCmRpZmYgLU5hdXIgZ3J1Yi0wLjk3Lm9yaWcvbmV0Ym9vdC90bGFuLmMgZ3J1Yi0wLjk3L25ldGJvb3QvdGxhbi5jCi0tLSBncnViLTAuOTcub3JpZy9uZXRib290L3RsYW4uYwkyMDAzLTA3LTA5IDExOjQ1OjM4LjAwMDAwMDAwMCArMDAwMAorKysgZ3J1Yi0wLjk3L25ldGJvb3QvdGxhbi5jCTIwMDUtMDktMDEgMDA6MDU6MjAuMDAwMDAwMDAwICswMDAwCkBAIC0xLDM3NDYgKzEsMTgxNCBAQAorI2RlZmluZSBFQjUxCisKKyNpZmRlZiBFQjUwCisjZGVmaW5lIF9fdW51c2VkIF9fYXR0cmlidXRlX18oKHVudXNlZCkpCisjZW5kaWYKKwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1FdGhlcmJvb3QgLSAgQk9PVFAvVEZUUCBCb290c3RyYXAgUHJvZ3JhbQotVExBTiBkcml2ZXIgZm9yIEV0aGVyYm9vdAorKgorKiAgICB0bGFuLmMgLS0gRXRoZXJib290IGRldmljZSBkcml2ZXIgZm9yIHRoZSBUZXhhcyBJbnN0cnVtZW50cyBUaHVuZGVyTEFOCisqICAgIFdyaXR0ZW4gMjAwMy0yMDAzIGJ5IFRpbW90aHkgTGVnZ2UgPHRsZWdnZUByb2dlcnMuY29tPgorKgorKiAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorKiAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorKiAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKiAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorKgorKiAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyogICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyogICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorKiAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorKgorKiAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorKiAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorKiAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyoKKyogICAgUG9ydGlvbnMgb2YgdGhpcyBjb2RlIGJhc2VkIG9uOgorKglsYW4uYzogTGludXggVGh1bmRlckxhbiBEcml2ZXI6CisqCisqCWJ5IEphbWVzIEJhbmtzCisqCisqICAJKEMpIDE5OTctMTk5OCBDYWxkZXJhLCBJbmMuCisqCShDKSAxOTk4IEphbWVzIEJhbmtzCisqCShDKSAxOTk5LTIwMDEgVG9yYmVuIE1hdGhpYXNlbgorKgkoQykgMjAwMiBTYW11ZWwgQ2hlc3NtYW4KKyoKKyogICAgUkVWSVNJT04gSElTVE9SWToKKyogICAgPT09PT09PT09PT09PT09PQorKiAgICB2MS4wCTA3LTA4LTIwMDMJdGltbGVnZ2UJSW5pdGlhbCBub3QgcXVpdGUgd29ya2luZyB2ZXJzaW9uCisqICAgIHYxLjEJMDctMjctMjAwMwl0aW1sZWdnZQlTeW5jIDUuMCBhbmQgNS4xIHZlcnNpb25zCisqICAgIHYxLjIJMDgtMTktMjAwMwl0aW1sZWdnZQlJbXBsZW1lbnQgTXVsdGljYXN0IFN1cHBvcnQKKyogICAgdjEuMwkwOC0yMy0yMDAzCXRpbWxlZ2dlCUZpeCB0aGUgdHJhbnNtaXQgRnVuY3Rpb24KKyogICAgdjEuNAkwMS0xNy0yMDA0CXRpbWxlZ2dlCUluaXRpYWwgZHJpdmVyIG91dHB1dCBjbGVhbnVwICAgIAorKiAgICAKKyogICAgSW5kZW50IE9wdGlvbnM6IGluZGVudCAta3IgLWk4CiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLS8qCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdAotICogeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICovCi0KIC8qIHRvIGdldCBzb21lIGdsb2JhbCByb3V0aW5lcyBsaWtlIHByaW50ZiAqLwogI2luY2x1ZGUgImV0aGVyYm9vdC5oIgogLyogdG8gZ2V0IHRoZSBpbnRlcmZhY2UgdG8gdGhlIGJvZHkgb2YgdGhlIHByb2dyYW0gKi8KICNpbmNsdWRlICJuaWMuaCIKIC8qIHRvIGdldCB0aGUgUENJIHN1cHBvcnQgZnVuY3Rpb25zLCBpZiB0aGlzIGlzIGEgUENJIE5JQyAqLwogI2luY2x1ZGUgInBjaS5oIgotLyogdG8gZ2V0IG91ciBvd24gcHJvdG90eXBlICovCi0jaW5jbHVkZSAiY2FyZHMuaCIKLQotCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCSAqIFRMYW4gRGVmaW5pdGlvbnMKLQkgKgotCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2luY2x1ZGUgInRpbWVyLmgiCisjaW5jbHVkZSAidGxhbi5oIgogCi0jZGVmaW5lIFRMQU5fTUlOX0ZSQU1FX1NJWkUJNjQKLSNkZWZpbmUgVExBTl9NQVhfRlJBTUVfU0laRQkxNjAwCisjZGVmaW5lIGRydl92ZXJzaW9uICJ2MS40IgorI2RlZmluZSBkcnZfZGF0ZSAiMDEtMTctMjAwNCIKIAotI2RlZmluZSBUTEFOX05VTV9SWF9MSVNUUwkzMgotI2RlZmluZSBUTEFOX05VTV9UWF9MSVNUUwk2NAorLyogTklDIHNwZWNpZmljIHN0YXRpYyB2YXJpYWJsZXMgZ28gaGVyZSAqLworI2RlZmluZSBIWiAxMDAKKyNkZWZpbmUgVFhfVElNRV9PVVQJICAoNipIWikKIAotI2RlZmluZSBUTEFOX0lHTk9SRQkJMAotI2RlZmluZSBUTEFOX1JFQ09SRAkJMQorI2lmZGVmIEVCNTAKKyNkZWZpbmUJY3B1X3RvX2xlMzIodmFsKSAodmFsKQorI2RlZmluZQlsZTMyX3RvX2NwdSh2YWwpICh2YWwpCisjZGVmaW5lCXZpcnRfdG9fYnVzKHgpICgodW5zaWduZWQgbG9uZykgeCkKKyNkZWZpbmUJYnVzX3RvX3ZpcnQoeCkgKCh1bnNpZ25lZCBsb25nKSB4KQorI2VuZGlmCiAKLSNkZWZpbmUgVExBTl9EQkcobHZsLCBmb3JtYXQsIGFyZ3MuLi4pCWlmIChkZWJ1ZyZsdmwpIHByaW50ZigiVExBTjogIiBmb3JtYXQsICMjYXJncyApOwotI2RlZmluZSBUTEFOX0RFQlVHX0dOUkwJCTB4MDAwMQotI2RlZmluZSBUTEFOX0RFQlVHX1RYCQkweDAwMDIKLSNkZWZpbmUgVExBTl9ERUJVR19SWAkJMHgwMDA0IAotI2RlZmluZSBUTEFOX0RFQlVHX0xJU1QJCTB4MDAwOAotI2RlZmluZSBUTEFOX0RFQlVHX1BST0JFCTB4MDAxMAorLyogQ29uZGVuc2VkIG9wZXJhdGlvbnMgZm9yIHJlYWRhYmlsaXR5LiAqLworI2RlZmluZSB2aXJ0X3RvX2xlMzJkZXNjKGFkZHIpICBjcHVfdG9fbGUzMih2aXJ0X3RvX2J1cyhhZGRyKSkKKyNkZWZpbmUgbGUzMmRlc2NfdG9fdmlydChhZGRyKSAgYnVzX3RvX3ZpcnQobGUzMl90b19jcHUoYWRkcikpCiAKLSNkZWZpbmUgTUFYX1RMQU5fQk9BUkRTCQk4CSAvKiBNYXggbnVtYmVyIG9mIGJvYXJkcyBpbnN0YWxsZWQgYXQgYSB0aW1lICovCiAKLQkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkgKiBEZXZpY2UgSWRlbnRpZmljYXRpb24gRGVmaW5pdGlvbnMKLQkgKgotCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCQkKLSNkZWZpbmUgUENJX0RFVklDRV9JRF9ORVRFTExJR0VOVF8xMF9UMgkJCTB4QjAxMgotI2RlZmluZSBQQ0lfREVWSUNFX0lEX05FVEVMTElHRU5UXzEwXzEwMF9XU181MTAwCTB4QjAzMAotI2lmbmRlZiBQQ0lfREVWSUNFX0lEX09MSUNPTV9PQzIxODMKLSNkZWZpbmUgUENJX0RFVklDRV9JRF9PTElDT01fT0MyMTgzCQkJMHgwMDEzCi0jZW5kaWYKLSNpZm5kZWYgUENJX0RFVklDRV9JRF9PTElDT01fT0MyMzI1Ci0jZGVmaW5lIFBDSV9ERVZJQ0VfSURfT0xJQ09NX09DMjMyNQkJCTB4MDAxMgotI2VuZGlmCi0jaWZuZGVmIFBDSV9ERVZJQ0VfSURfT0xJQ09NX09DMjMyNgotI2RlZmluZSBQQ0lfREVWSUNFX0lEX09MSUNPTV9PQzIzMjYJCQkweDAwMTQKLSNlbmRpZgotI2RlZmluZSBUTEFOX0FEQVBURVJfTk9ORQkJMHgwMDAwMDAwMAotI2RlZmluZSBUTEFOX0FEQVBURVJfVU5NQU5BR0VEX1BIWQkweDAwMDAwMDAxCi0jZGVmaW5lIFRMQU5fQURBUFRFUl9CSVRfUkFURV9QSFkJMHgwMDAwMDAwMgotI2RlZmluZSBUTEFOX0FEQVBURVJfVVNFX0lOVEVSTl8xMAkweDAwMDAwMDA0Ci0jZGVmaW5lIFRMQU5fQURBUFRFUl9BQ1RJVklUWV9MRUQJMHgwMDAwMDAwOAotI2RlZmluZSBUTEFOX1NQRUVEX0RFRkFVTFQJMAotI2RlZmluZSBUTEFOX1NQRUVEXzEwCQkxMAotI2RlZmluZSBUTEFOX1NQRUVEXzEwMAkJMTAwCi0jZGVmaW5lIFRMQU5fRFVQTEVYX0RFRkFVTFQJMAotI2RlZmluZSBUTEFOX0RVUExFWF9IQUxGCTEKLSNkZWZpbmUgVExBTl9EVVBMRVhfRlVMTAkyCi0jZGVmaW5lIFRMQU5fQlVGRkVSU19QRVJfTElTVAkxMAotI2RlZmluZSBUTEFOX0xBU1RfQlVGRkVSCTB4ODAwMDAwMDAKLSNkZWZpbmUgVExBTl9DU1RBVF9VTlVTRUQJMHg4MDAwCi0jZGVmaW5lIFRMQU5fQ1NUQVRfRlJNX0NNUAkweDQwMDAKLSNkZWZpbmUgVExBTl9DU1RBVF9SRUFEWQkweDMwMDAKLSNkZWZpbmUgVExBTl9DU1RBVF9FT0MJCTB4MDgwMAotI2RlZmluZSBUTEFOX0NTVEFUX1JYX0VSUk9SCTB4MDQwMAotI2RlZmluZSBUTEFOX0NTVEFUX1BBU1NfQ1JDCTB4MDIwMAotI2RlZmluZSBUTEFOX0NTVEFUX0RQX1BSCTB4MDEwMAotCi0JLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JICogUEhZIGRlZmluaXRpb25zCi0JICoKLQkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2RlZmluZSBUTEFOX1BIWV9NQVhfQUREUgkweDFGCi0jZGVmaW5lIFRMQU5fUEhZX05PTkUJCTB4MjAKLQotCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCSAqIFRMYW4gRHJpdmVyIFRpbWVyIERlZmluaXRpb25zCi0JICoKLQkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2RlZmluZSBUTEFOX1RJTUVSX0xJTktfQkVBVAkJMQotI2RlZmluZSBUTEFOX1RJTUVSX0FDVElWSVRZCQkyCi0jZGVmaW5lIFRMQU5fVElNRVJfUEhZX1BET1dOCQkzCi0jZGVmaW5lIFRMQU5fVElNRVJfUEhZX1BVUAkJNAotI2RlZmluZSBUTEFOX1RJTUVSX1BIWV9SRVNFVAkJNQotI2RlZmluZSBUTEFOX1RJTUVSX1BIWV9TVEFSVF9MSU5LCTYKLSNkZWZpbmUgVExBTl9USU1FUl9QSFlfRklOSVNIX0FOCTcKLSNkZWZpbmUgVExBTl9USU1FUl9GSU5JU0hfUkVTRVQJCTgKLSNkZWZpbmUgVExBTl9USU1FUl9BQ1RfREVMQVkJCShIWi8xMCkKLQotCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCSAqIFRMYW4gRHJpdmVyIEVlcHJvbSBEZWZpbml0aW9ucwotCSAqCi0JICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNkZWZpbmUgVExBTl9FRVBST01fQUNLCQkwCi0jZGVmaW5lIFRMQU5fRUVQUk9NX1NUT1AJMQotCi0JLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JICogSG9zdCBSZWdpc3RlciBPZmZzZXRzIGFuZCBDb250ZW50cwotCSAqCi0JICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNkZWZpbmUgVExBTl9IT1NUX0NNRAkJCTB4MDAKLSNkZWZpbmUgCVRMQU5fSENfR08JCTB4ODAwMDAwMDAKLSNkZWZpbmUJCVRMQU5fSENfU1RPUAkJMHg0MDAwMDAwMAotI2RlZmluZQkJVExBTl9IQ19BQ0sJCTB4MjAwMDAwMDAKLSNkZWZpbmUJCVRMQU5fSENfQ1NfTUFTSwkJMHgxRkUwMDAwMAotI2RlZmluZQkJVExBTl9IQ19FT0MJCTB4MDAxMDAwMDAKLSNkZWZpbmUJCVRMQU5fSENfUlQJCTB4MDAwODAwMDAKLSNkZWZpbmUJCVRMQU5fSENfTkVTCQkweDAwMDQwMDAwCi0jZGVmaW5lCQlUTEFOX0hDX0FEX1JTVAkJMHgwMDAwODAwMAotI2RlZmluZQkJVExBTl9IQ19MRF9UTVIJCTB4MDAwMDQwMDAKLSNkZWZpbmUJCVRMQU5fSENfTERfVEhSCQkweDAwMDAyMDAwCi0jZGVmaW5lCQlUTEFOX0hDX1JFUV9JTlQJCTB4MDAwMDEwMDAKLSNkZWZpbmUJCVRMQU5fSENfSU5UX09GRgkJMHgwMDAwMDgwMAotI2RlZmluZQkJVExBTl9IQ19JTlRfT04JCTB4MDAwMDA0MDAKLSNkZWZpbmUJCVRMQU5fSENfQUNfTUFTSwkJMHgwMDAwMDBGRgotI2RlZmluZSBUTEFOX0NIX1BBUk0JCQkweDA0Ci0jZGVmaW5lIFRMQU5fRElPX0FEUgkJCTB4MDgKLSNkZWZpbmUJCVRMQU5fREFfQURSX0lOQwkJMHg4MDAwCi0jZGVmaW5lCQlUTEFOX0RBX1JBTV9BRFIJCTB4NDAwMAotI2RlZmluZSBUTEFOX0hPU1RfSU5UCQkJMHgwQQotI2RlZmluZQkJVExBTl9ISV9JVl9NQVNLCQkweDFGRTAKLSNkZWZpbmUJCVRMQU5fSElfSVRfTUFTSwkJMHgwMDFDCi0jZGVmaW5lIFRMQU5fRElPX0RBVEEJCQkweDBDCi0KLS8qIFRodW5kZXJMQU4gSW50ZXJuYWwgUmVnaXN0ZXIgRElPIE9mZnNldHMgKi8KLQotI2RlZmluZSBUTEFOX05FVF9DTUQJCQkweDAwCi0jZGVmaW5lCQlUTEFOX05FVF9DTURfTlJFU0VUCTB4ODAKLSNkZWZpbmUJCVRMQU5fTkVUX0NNRF9OV1JBUAkweDQwCi0jZGVmaW5lCQlUTEFOX05FVF9DTURfQ1NGCTB4MjAKLSNkZWZpbmUJCVRMQU5fTkVUX0NNRF9DQUYJMHgxMAotI2RlZmluZQkJVExBTl9ORVRfQ01EX05PQlJYCTB4MDgKLSNkZWZpbmUJCVRMQU5fTkVUX0NNRF9EVVBMRVgJMHgwNAotI2RlZmluZQkJVExBTl9ORVRfQ01EX1RSRlJBTQkweDAyCi0jZGVmaW5lCQlUTEFOX05FVF9DTURfVFhQQUNFCTB4MDEKLSNkZWZpbmUgVExBTl9ORVRfU0lPCQkJMHgwMQotI2RlZmluZSAJVExBTl9ORVRfU0lPX01JTlRFTgkweDgwCi0jZGVmaW5lCQlUTEFOX05FVF9TSU9fRUNMT0sJMHg0MAotI2RlZmluZQkJVExBTl9ORVRfU0lPX0VUWEVOCTB4MjAKLSNkZWZpbmUJCVRMQU5fTkVUX1NJT19FREFUQQkweDEwCi0jZGVmaW5lCQlUTEFOX05FVF9TSU9fTk1SU1QJMHgwOAotI2RlZmluZQkJVExBTl9ORVRfU0lPX01DTEsJMHgwNAotI2RlZmluZQkJVExBTl9ORVRfU0lPX01UWEVOCTB4MDIKLSNkZWZpbmUJCVRMQU5fTkVUX1NJT19NREFUQQkweDAxCi0jZGVmaW5lIFRMQU5fTkVUX1NUUwkJCTB4MDIKLSNkZWZpbmUJCVRMQU5fTkVUX1NUU19NSVJRCTB4ODAKLSNkZWZpbmUJCVRMQU5fTkVUX1NUU19IQkVBVAkweDQwCi0jZGVmaW5lCQlUTEFOX05FVF9TVFNfVFhTVE9QCTB4MjAKLSNkZWZpbmUJCVRMQU5fTkVUX1NUU19SWFNUT1AJMHgxMAotI2RlZmluZQkJVExBTl9ORVRfU1RTX1JTUlZECTB4MEYKLSNkZWZpbmUgVExBTl9ORVRfTUFTSwkJCTB4MDMKLSNkZWZpbmUJCVRMQU5fTkVUX01BU0tfTUFTSzcJMHg4MAotI2RlZmluZQkJVExBTl9ORVRfTUFTS19NQVNLNgkweDQwCi0jZGVmaW5lCQlUTEFOX05FVF9NQVNLX01BU0s1CTB4MjAKLSNkZWZpbmUJCVRMQU5fTkVUX01BU0tfTUFTSzQJMHgxMAotI2RlZmluZQkJVExBTl9ORVRfTUFTS19SU1JWRAkweDBGCi0jZGVmaW5lIFRMQU5fTkVUX0NPTkZJRwkJCTB4MDQKLSNkZWZpbmUgCVRMQU5fTkVUX0NGR19SQ0xLCTB4ODAwMAotI2RlZmluZQkJVExBTl9ORVRfQ0ZHX1RDTEsJMHg0MDAwCi0jZGVmaW5lCQlUTEFOX05FVF9DRkdfQklUCTB4MjAwMAotI2RlZmluZQkJVExBTl9ORVRfQ0ZHX1JYQ1JDCTB4MTAwMAotI2RlZmluZQkJVExBTl9ORVRfQ0ZHX1BFRgkweDA4MDAKLSNkZWZpbmUJCVRMQU5fTkVUX0NGR18xRlJBRwkweDA0MDAKLSNkZWZpbmUJCVRMQU5fTkVUX0NGR18xQ0hBTgkweDAyMDAKLSNkZWZpbmUJCVRMQU5fTkVUX0NGR19NVEVTVAkweDAxMDAKLSNkZWZpbmUJCVRMQU5fTkVUX0NGR19QSFlfRU4JMHgwMDgwCi0jZGVmaW5lCQlUTEFOX05FVF9DRkdfTVNNQVNLCTB4MDA3RgotI2RlZmluZSBUTEFOX01BTl9URVNUCQkJMHgwNgotI2RlZmluZSBUTEFOX0RFRl9WRU5ET1JfSUQJCTB4MDgKLSNkZWZpbmUgVExBTl9ERUZfREVWSUNFX0lECQkweDBBCi0jZGVmaW5lIFRMQU5fREVGX1JFVklTSU9OCQkweDBDCi0jZGVmaW5lIFRMQU5fREVGX1NVQkNMQVNTCQkweDBECi0jZGVmaW5lIFRMQU5fREVGX01JTl9MQVQJCTB4MEUKLSNkZWZpbmUgVExBTl9ERUZfTUFYX0xBVAkJMHgwRgotI2RlZmluZSBUTEFOX0FSRUdfMAkJCTB4MTAKLSNkZWZpbmUgVExBTl9BUkVHXzEJCQkweDE2Ci0jZGVmaW5lIFRMQU5fQVJFR18yCQkJMHgxQwotI2RlZmluZSBUTEFOX0FSRUdfMwkJCTB4MjIKLSNkZWZpbmUgVExBTl9IQVNIXzEJCQkweDI4Ci0jZGVmaW5lIFRMQU5fSEFTSF8yCQkJMHgyQwotI2RlZmluZSBUTEFOX0dPT0RfVFhfRlJNUwkJMHgzMAotI2RlZmluZSBUTEFOX1RYX1VOREVSVU5TCQkweDMzCi0jZGVmaW5lIFRMQU5fR09PRF9SWF9GUk1TCQkweDM0Ci0jZGVmaW5lIFRMQU5fUlhfT1ZFUlJVTlMJCTB4MzcKLSNkZWZpbmUgVExBTl9ERUZFUlJFRF9UWAkJMHgzOAotI2RlZmluZSBUTEFOX0NSQ19FUlJPUlMJCQkweDNBCi0jZGVmaW5lIFRMQU5fQ09ERV9FUlJPUlMJCTB4M0IKLSNkZWZpbmUgVExBTl9NVUxUSUNPTF9GUk1TCQkweDNDCi0jZGVmaW5lIFRMQU5fU0lOR0xFQ09MX0ZSTVMJCTB4M0UKLSNkZWZpbmUgVExBTl9FWENFU1NDT0xfRlJNUwkJMHg0MAotI2RlZmluZSBUTEFOX0xBVEVfQ09MUwkJCTB4NDEKLSNkZWZpbmUgVExBTl9DQVJSSUVSX0xPU1MJCTB4NDIKLSNkZWZpbmUgVExBTl9BQ09NTUlUCQkJMHg0MwotI2RlZmluZSBUTEFOX0xFRF9SRUcJCQkweDQ0Ci0jZGVmaW5lCQlUTEFOX0xFRF9BQ1QJCTB4MTAKLSNkZWZpbmUJCVRMQU5fTEVEX0xJTksJCTB4MDEKLSNkZWZpbmUgVExBTl9CU0laRV9SRUcJCQkweDQ1Ci0jZGVmaW5lIFRMQU5fTUFYX1JYCQkJMHg0NgotI2RlZmluZSBUTEFOX0lOVF9ESVMJCQkweDQ4Ci0jZGVmaW5lCQlUTEFOX0lEX1RYX0VPQwkJMHgwNAotI2RlZmluZQkJVExBTl9JRF9SWF9FT0YJCTB4MDIKLSNkZWZpbmUJCVRMQU5fSURfUlhfRU9DCQkweDAxCi0KLS8qIFRodW5kZXJMQU4gSW50ZXJydXB0IENvZGVzICovCi0KLSNkZWZpbmUgVExBTl9JTlRfTlVNQkVSX09GX0lOVFMJOAotCi0jZGVmaW5lIFRMQU5fSU5UX05PTkUJCQkweDAwMDAKLSNkZWZpbmUgVExBTl9JTlRfVFhfRU9GCQkJMHgwMDAxCi0jZGVmaW5lIFRMQU5fSU5UX1NUQVRfT1ZFUkZMT1cJCTB4MDAwMgotI2RlZmluZSBUTEFOX0lOVF9SWF9FT0YJCQkweDAwMDMKLSNkZWZpbmUgVExBTl9JTlRfRFVNTVkJCQkweDAwMDQKLSNkZWZpbmUgVExBTl9JTlRfVFhfRU9DCQkJMHgwMDA1Ci0jZGVmaW5lIFRMQU5fSU5UX1NUQVRVU19DSEVDSwkJMHgwMDA2Ci0jZGVmaW5lIFRMQU5fSU5UX1JYX0VPQwkJCTB4MDAwNwotI2RlZmluZSBUTEFOX1RMUEhZX0lECQkJMHgxMAotI2RlZmluZSBUTEFOX1RMUEhZX0NUTAkJCTB4MTEKLSNkZWZpbmUgCVRMQU5fVENfSUdMSU5LCQkweDgwMDAKLSNkZWZpbmUJCVRMQU5fVENfU1dBUE9MCQkweDQwMDAKLSNkZWZpbmUJCVRMQU5fVENfQVVJU0VMCQkweDIwMDAKLSNkZWZpbmUJCVRMQU5fVENfU1FFRU4JCTB4MTAwMAotI2RlZmluZQkJVExBTl9UQ19NVEVTVAkJMHgwODAwCi0jZGVmaW5lCQlUTEFOX1RDX1JFU0VSVkVECTB4MDdGOAotI2RlZmluZQkJVExBTl9UQ19ORkVXCQkweDAwMDQKLSNkZWZpbmUJCVRMQU5fVENfSU5URU4JCTB4MDAwMgotI2RlZmluZQkJVExBTl9UQ19USU5UCQkweDAwMDEKLSNkZWZpbmUgVExBTl9UTFBIWV9TVFMJCQkweDEyCi0jZGVmaW5lCQlUTEFOX1RTX01JTlQJCTB4ODAwMAotI2RlZmluZQkJVExBTl9UU19QSE9LCQkweDQwMDAKLSNkZWZpbmUJCVRMQU5fVFNfUE9MT0sJCTB4MjAwMAotI2RlZmluZQkJVExBTl9UU19UUEVORVJHWQkweDEwMDAKLSNkZWZpbmUJCVRMQU5fVFNfUkVTRVJWRUQJMHgwRkZGCi0jZGVmaW5lIFRMQU5fVExQSFlfUEFSCQkJMHgxOQotI2RlZmluZQkJVExBTl9QSFlfQ0lNX1NUQVQJMHgwMDIwCi0jZGVmaW5lCQlUTEFOX1BIWV9TUEVFRF8xMDAJMHgwMDQwCi0jZGVmaW5lCQlUTEFOX1BIWV9EVVBMRVhfRlVMTAkweDAwODAKLSNkZWZpbmUJCVRMQU5fUEhZX0FOX0VOX1NUQVQgICAgIDB4MDQwMAotCi0KLS8qIFRodW5kZXJMQU4gTUlJIFJlZ2lzdGVycyAqLwotCi0vKiBHZW5lcmljIE1JSS9QSFkgUmVnaXN0ZXJzICovCi0KLSNkZWZpbmUgTUlJX0dFTl9DVEwJCQkweDAwCi0jZGVmaW5lIAlNSUlfR0NfUkVTRVQJCTB4ODAwMAotI2RlZmluZQkJTUlJX0dDX0xPT1BCSwkJMHg0MDAwCi0jZGVmaW5lCQlNSUlfR0NfU1BFRURTRUwJCTB4MjAwMAotI2RlZmluZQkJTUlJX0dDX0FVVE9FTkIJCTB4MTAwMAotI2RlZmluZQkJTUlJX0dDX1BET1dOCQkweDA4MDAKLSNkZWZpbmUJCU1JSV9HQ19JU09MQVRFCQkweDA0MDAKLSNkZWZpbmUJCU1JSV9HQ19BVVRPUlNSVAkJMHgwMjAwCi0jZGVmaW5lCQlNSUlfR0NfRFVQTEVYCQkweDAxMDAKLSNkZWZpbmUJCU1JSV9HQ19DT0xURVNUCQkweDAwODAKLSNkZWZpbmUJCU1JSV9HQ19SRVNFUlZFRAkJMHgwMDdGCi0jZGVmaW5lIE1JSV9HRU5fU1RTCQkJMHgwMQotI2RlZmluZQkJTUlJX0dTXzEwMEJUNAkJMHg4MDAwCi0jZGVmaW5lCQlNSUlfR1NfMTAwQlRYRkQJCTB4NDAwMAotI2RlZmluZQkJTUlJX0dTXzEwMEJUWEhECQkweDIwMDAKLSNkZWZpbmUJCU1JSV9HU18xMEJURkQJCTB4MTAwMAotI2RlZmluZQkJTUlJX0dTXzEwQlRIRAkJMHgwODAwCi0jZGVmaW5lCQlNSUlfR1NfUkVTRVJWRUQJCTB4MDdDMAotI2RlZmluZQkJTUlJX0dTX0FVVE9DTVBMVAkweDAwMjAKLSNkZWZpbmUJCU1JSV9HU19SRkxUCQkweDAwMTAKLSNkZWZpbmUJCU1JSV9HU19BVVRPTkVHCQkweDAwMDgKLSNkZWZpbmUJCU1JSV9HU19MSU5LCQkweDAwMDQKLSNkZWZpbmUJCU1JSV9HU19KQUJCRVIJCTB4MDAwMgotI2RlZmluZQkJTUlJX0dTX0VYVENBUAkJMHgwMDAxCi0jZGVmaW5lIE1JSV9HRU5fSURfSEkJCQkweDAyCi0jZGVmaW5lIE1JSV9HRU5fSURfTE8JCQkweDAzCi0jZGVmaW5lIAlNSUlfR0lMX09VSQkJMHhGQzAwCi0jZGVmaW5lIAlNSUlfR0lMX01PREVMCQkweDAzRjAKLSNkZWZpbmUgCU1JSV9HSUxfUkVWSVNJT04JMHgwMDBGCi0jZGVmaW5lIE1JSV9BTl9BRFYJCQkweDA0Ci0jZGVmaW5lIE1JSV9BTl9MUEEJCQkweDA1Ci0jZGVmaW5lIE1JSV9BTl9FWFAJCQkweDA2Ci0KLS8qIFRodW5kZXJMQU4gU3BlY2lmaWMgTUlJL1BIWSBSZWdpc3RlcnMgKi8KLQotI2RlZmluZSAJVExBTl9UQ19JR0xJTksJCTB4ODAwMAotI2RlZmluZQkJVExBTl9UQ19TV0FQT0wJCTB4NDAwMAotI2RlZmluZQkJVExBTl9UQ19BVUlTRUwJCTB4MjAwMAotI2RlZmluZQkJVExBTl9UQ19TUUVFTgkJMHgxMDAwCi0jZGVmaW5lCQlUTEFOX1RDX01URVNUCQkweDA4MDAKLSNkZWZpbmUJCVRMQU5fVENfUkVTRVJWRUQJMHgwN0Y4Ci0jZGVmaW5lCQlUTEFOX1RDX05GRVcJCTB4MDAwNAotI2RlZmluZQkJVExBTl9UQ19JTlRFTgkJMHgwMDAyCi0jZGVmaW5lCQlUTEFOX1RDX1RJTlQJCTB4MDAwMQotI2RlZmluZQkJVExBTl9UU19NSU5UCQkweDgwMDAKLSNkZWZpbmUJCVRMQU5fVFNfUEhPSwkJMHg0MDAwCi0jZGVmaW5lCQlUTEFOX1RTX1BPTE9LCQkweDIwMDAKLSNkZWZpbmUJCVRMQU5fVFNfVFBFTkVSR1kJMHgxMDAwCi0jZGVmaW5lCQlUTEFOX1RTX1JFU0VSVkVECTB4MEZGRgotI2RlZmluZQkJVExBTl9QSFlfQ0lNX1NUQVQJMHgwMDIwCi0jZGVmaW5lCQlUTEFOX1BIWV9TUEVFRF8xMDAJMHgwMDQwCi0jZGVmaW5lCQlUTEFOX1BIWV9EVVBMRVhfRlVMTAkweDAwODAKLSNkZWZpbmUJCVRMQU5fUEhZX0FOX0VOX1NUQVQgICAgIDB4MDQwMAotCi0vKiBOYXRpb25hbCBTZW0uICYgTGV2ZWwxIFBIWSBpZCdzICovCi0jZGVmaW5lIE5BVF9TRU1fSUQxCQkJMHgyMDAwCi0jZGVmaW5lIE5BVF9TRU1fSUQyCQkJMHg1QzAxCi0jZGVmaW5lIExFVkVMMV9JRDEJCQkweDc4MTAKLSNkZWZpbmUgTEVWRUwxX0lEMgkJCTB4MDAwMAotCi0jZGVmaW5lIFRMYW5fQ2xlYXJCaXQoIGJpdCwgcG9ydCApCW91dGJfcChpbmJfcChwb3J0KSAmIH5iaXQsIHBvcnQpCi0jZGVmaW5lIFRMYW5fR2V0Qml0KCBiaXQsIHBvcnQgKQkoKGludCkgKGluYl9wKHBvcnQpICYgYml0KSkKLSNkZWZpbmUgVExhbl9TZXRCaXQoIGJpdCwgcG9ydCApCW91dGJfcChpbmJfcChwb3J0KSB8IGJpdCwgcG9ydCkKLQotdHlwZWRlZgl1bnNpZ25lZCBpbnQJdTMyOwotdHlwZWRlZgl1bnNpZ25lZCBzaG9ydAl1MTY7Ci10eXBlZGVmCXVuc2lnbmVkIGNoYXIJdTg7CitzdGF0aWMgdm9pZCBUTGFuX1Jlc2V0TGlzdHMoc3RydWN0IG5pYyAqbmljIF9fdW51c2VkKTsKK3N0YXRpYyB2b2lkIFRMYW5fUmVzZXRBZGFwdGVyKHN0cnVjdCBuaWMgKm5pYyBfX3VudXNlZCk7CitzdGF0aWMgdm9pZCBUTGFuX0ZpbmlzaFJlc2V0KHN0cnVjdCBuaWMgKm5pYyBfX3VudXNlZCk7CiAKLS8qIFJvdXRpbmVzIHRvIGFjY2VzcyBpbnRlcm5hbCByZWdpc3RlcnMuICovCitzdGF0aWMgdm9pZCBUTGFuX0VlU2VuZFN0YXJ0KHUxNik7CitzdGF0aWMgaW50IFRMYW5fRWVTZW5kQnl0ZSh1MTYsIHU4LCBpbnQpOworc3RhdGljIHZvaWQgVExhbl9FZVJlY2VpdmVCeXRlKHUxNiwgdTggKiwgaW50KTsKK3N0YXRpYyBpbnQgVExhbl9FZVJlYWRCeXRlKHUxNiBpb19iYXNlLCB1OCwgdTggKik7CiAKLWlubGluZSB1OCBUTGFuX0Rpb1JlYWQ4KHUxNiBiYXNlX2FkZHIsIHUxNiBpbnRlcm5hbF9hZGRyKQotewotCW91dHcoaW50ZXJuYWxfYWRkciwgYmFzZV9hZGRyICsgVExBTl9ESU9fQURSKTsKLQlyZXR1cm4gKGluYigoYmFzZV9hZGRyICsgVExBTl9ESU9fREFUQSkgKyAoaW50ZXJuYWxfYWRkciAmIDB4MykpKTsKLQkKLX0gLyogVExhbl9EaW9SZWFkOCAqLworc3RhdGljIHZvaWQgVExhbl9QaHlEZXRlY3Qoc3RydWN0IG5pYyAqbmljKTsKK3N0YXRpYyB2b2lkIFRMYW5fUGh5UG93ZXJEb3duKHN0cnVjdCBuaWMgKm5pYyk7CitzdGF0aWMgdm9pZCBUTGFuX1BoeVBvd2VyVXAoc3RydWN0IG5pYyAqbmljKTsKIAotaW5saW5lIHUxNiBUTGFuX0Rpb1JlYWQxNih1MTYgYmFzZV9hZGRyLCB1MTYgaW50ZXJuYWxfYWRkcikKLXsKLQlvdXR3KGludGVybmFsX2FkZHIsIGJhc2VfYWRkciArIFRMQU5fRElPX0FEUik7Ci0JcmV0dXJuIChpbncoKGJhc2VfYWRkciArIFRMQU5fRElPX0RBVEEpICsgKGludGVybmFsX2FkZHIgJiAweDIpKSk7CiAKLX0gLyogVExhbl9EaW9SZWFkMTYgKi8KK3N0YXRpYyB2b2lkIFRMYW5fU2V0TWFjKHN0cnVjdCBuaWMgKm5pYyBfX3VudXNlZCwgaW50IGFyZWcsIGNoYXIgKm1hYyk7CiAKLWlubGluZSB1MzIgVExhbl9EaW9SZWFkMzIodTE2IGJhc2VfYWRkciwgdTE2IGludGVybmFsX2FkZHIpCi17Ci0Jb3V0dyhpbnRlcm5hbF9hZGRyLCBiYXNlX2FkZHIgKyBUTEFOX0RJT19BRFIpOwotCXJldHVybiAoaW5sKGJhc2VfYWRkciArIFRMQU5fRElPX0RBVEEpKTsKK3N0YXRpYyB2b2lkIFRMYW5fUGh5UmVzZXQoc3RydWN0IG5pYyAqbmljKTsKK3N0YXRpYyB2b2lkIFRMYW5fUGh5U3RhcnRMaW5rKHN0cnVjdCBuaWMgKm5pYyk7CitzdGF0aWMgdm9pZCBUTGFuX1BoeUZpbmlzaEF1dG9OZWcoc3RydWN0IG5pYyAqbmljKTsKIAotfSAvKiBUTGFuX0Rpb1JlYWQzMiAqLworI2lmZGVmIE1PTklUT1IKK3N0YXRpYyB2b2lkIFRMYW5fUGh5TW9uaXRvcihzdHJ1Y3QgbmljICpuaWMpOworI2VuZGlmCiAKLWlubGluZSB2b2lkIFRMYW5fRGlvV3JpdGU4KHUxNiBiYXNlX2FkZHIsIHUxNiBpbnRlcm5hbF9hZGRyLCB1OCBkYXRhKQotewotCW91dHcoaW50ZXJuYWxfYWRkciwgYmFzZV9hZGRyICsgVExBTl9ESU9fQURSKTsKLQlvdXRiKGRhdGEsIGJhc2VfYWRkciArIFRMQU5fRElPX0RBVEEgKyAoaW50ZXJuYWxfYWRkciAmIDB4MykpOwogCi19CitzdGF0aWMgdm9pZCByZWZpbGxfcngoc3RydWN0IG5pYyAqbmljIF9fdW51c2VkKTsKIAotaW5saW5lIHZvaWQgVExhbl9EaW9Xcml0ZTE2KHUxNiBiYXNlX2FkZHIsIHUxNiBpbnRlcm5hbF9hZGRyLCB1MTYgZGF0YSkKLXsKLQlvdXR3KGludGVybmFsX2FkZHIsIGJhc2VfYWRkciArIFRMQU5fRElPX0FEUik7Ci0Jb3V0dyhkYXRhLCBiYXNlX2FkZHIgKyBUTEFOX0RJT19EQVRBICsgKGludGVybmFsX2FkZHIgJiAweDIpKTsKK3N0YXRpYyBpbnQgVExhbl9NaWlSZWFkUmVnKHN0cnVjdCBuaWMgKm5pYyBfX3VudXNlZCwgdTE2LCB1MTYsIHUxNiAqKTsKK3N0YXRpYyB2b2lkIFRMYW5fTWlpU2VuZERhdGEodTE2LCB1MzIsIHVuc2lnbmVkKTsKK3N0YXRpYyB2b2lkIFRMYW5fTWlpU3luYyh1MTYpOworc3RhdGljIHZvaWQgVExhbl9NaWlXcml0ZVJlZyhzdHJ1Y3QgbmljICpuaWMgX191bnVzZWQsIHUxNiwgdTE2LCB1MTYpOwogCi19CiAKLWlubGluZSB2b2lkIFRMYW5fRGlvV3JpdGUzMih1MTYgYmFzZV9hZGRyLCB1MTYgaW50ZXJuYWxfYWRkciwgdTMyIGRhdGEpCi17Ci0Jb3V0dyhpbnRlcm5hbF9hZGRyLCBiYXNlX2FkZHIgKyBUTEFOX0RJT19BRFIpOwotCW91dGwoZGF0YSwgYmFzZV9hZGRyICsgVExBTl9ESU9fREFUQSArIChpbnRlcm5hbF9hZGRyICYgMHgyKSk7Citjb25zdCBjaGFyICptZWRpYVtdID0geworCSIxMEJhc2VULUhEICIsICIxMEJhc2VULUZEICIsICIxMDBiYXNlVHgtSEQgIiwKKwkiMTAwYmFzZVR4LUZEIiwgIjEwMGJhc2VUNCIsIDAKK307CiAKLX0KKy8qIFRoaXMgbXVjaCBtYXRjaCB0bGFuX3BjaV90YmxbXSEgICovCitlbnVtIHRsYW5fbmljcyB7CisJTkVURUwxMCA9IDAsIE5FVEVMMTAwID0gMSwgTkVURkxFWDNJID0gMiwgVEhVTkRFUiA9IDMsIE5FVEZMRVgzQiA9CisJICAgIDQsIE5FVEVMMTAwUEkgPSA1LAorCU5FVEVMMTAwRCA9IDYsIE5FVEVMMTAwSSA9IDcsIE9DMjE4MyA9IDgsIE9DMjMyNSA9IDksIE9DMjMyNiA9CisJICAgIDEwLCBORVRFTExJR0VOVF8xMF8xMDBfV1NfNTEwMCA9IDExLAorCU5FVEVMTElHRU5UXzEwX1QyID0gMTIKK307CiAKLS8qIE5JQyBzcGVjaWZpYyBzdGF0aWMgdmFyaWFibGVzIGdvIGhlcmUgKi8KK3N0cnVjdCBwY2lfaWRfaW5mbyB7CisJY29uc3QgY2hhciAqbmFtZTsKKwlpbnQgbmljX2lkOworCXN0cnVjdCBtYXRjaF9pbmZvIHsKKwkJdTMyIHBjaSwgcGNpX21hc2ssIHN1YnN5c3RlbSwgc3Vic3lzdGVtX21hc2s7CisJCXUzMiByZXZpc2lvbiwgcmV2aXNpb25fbWFzazsJLyogT25seSA4IGJpdHMuICovCisJfSBpZDsKKwl1MzIgZmxhZ3M7CisJdTE2IGFkZHJPZnM7CQkvKiBBZGRyZXNzIE9mZnNldCAqLworfTsKIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK3N0YXRpYyBzdHJ1Y3QgcGNpX2lkX2luZm8gdGxhbl9wY2lfdGJsW10gPSB7CisJeyJDb21wYXEgTmV0ZWxsaWdlbnQgMTAgVCBQQ0kgVVRQIiwgTkVURUwxMCwKKwkgezB4YWUzNDBlMTEsIDB4ZmZmZmZmZmYsIDAsIDAsIDAsIDB9LAorCSBUTEFOX0FEQVBURVJfQUNUSVZJVFlfTEVELCAweDgzfSwKKwl7IkNvbXBhcSBOZXRlbGxpZ2VudCAxMC8xMDAgVFggUENJIFVUUCIsIE5FVEVMMTAwLAorCSB7MHhhZTMyMGUxMSwgMHhmZmZmZmZmZiwgMCwgMCwgMCwgMH0sCisJIFRMQU5fQURBUFRFUl9BQ1RJVklUWV9MRUQsIDB4ODN9LAorCXsiQ29tcGFxIEludGVncmF0ZWQgTmV0RmxleC0zL1AiLCBORVRGTEVYM0ksCisJIHsweGFlMzUwZTExLCAweGZmZmZmZmZmLCAwLCAwLCAwLCAwfSwKKwkgVExBTl9BREFQVEVSX05PTkUsIDB4ODN9LAorCXsiQ29tcGFxIE5ldEZsZXgtMy9QIiwgVEhVTkRFUiwKKwkgezB4ZjEzMDBlMTEsIDB4ZmZmZmZmZmYsIDAsIDAsIDAsIDB9LAorCSBUTEFOX0FEQVBURVJfVU5NQU5BR0VEX1BIWSB8IFRMQU5fQURBUFRFUl9CSVRfUkFURV9QSFksIDB4ODN9LAorCXsiQ29tcGFxIE5ldEZsZXgtMy9QIiwgTkVURkxFWDNCLAorCSB7MHhmMTUwMGUxMSwgMHhmZmZmZmZmZiwgMCwgMCwgMCwgMH0sCisJIFRMQU5fQURBUFRFUl9OT05FLCAweDgzfSwKKwl7IkNvbXBhcSBOZXRlbGxpZ2VudCBJbnRlZ3JhdGVkIDEwLzEwMCBUWCBVVFAiLCBORVRFTDEwMFBJLAorCSB7MHhhZTQzMGUxMSwgMHhmZmZmZmZmZiwgMCwgMCwgMCwgMH0sCisJIFRMQU5fQURBUFRFUl9BQ1RJVklUWV9MRUQsIDB4ODN9LAorCXsiQ29tcGFxIE5ldGVsbGlnZW50IER1YWwgMTAvMTAwIFRYIFBDSSBVVFAiLCBORVRFTDEwMEQsCisJIHsweGFlNDAwZTExLCAweGZmZmZmZmZmLCAwLCAwLCAwLCAwfSwKKwkgVExBTl9BREFQVEVSX05PTkUsIDB4ODN9LAorCXsiQ29tcGFxIE5ldGVsbGlnZW50IDEwLzEwMCBUWCBFbWJlZGRlZCBVVFAiLCBORVRFTDEwMEksCisJIHsweGIwMTEwZTExLCAweGZmZmZmZmZmLCAwLCAwLCAwLCAwfSwKKwkgVExBTl9BREFQVEVSX05PTkUsIDB4ODN9LAorCXsiT2xpY29tIE9DLTIxODMvMjE4NSIsIE9DMjE4MywKKwkgezB4MDAxMzEwOGQsIDB4ZmZmZmZmZmYsIDAsIDAsIDAsIDB9LAorCSBUTEFOX0FEQVBURVJfVVNFX0lOVEVSTl8xMCwgMHg4M30sCisJeyJPbGljb20gT0MtMjMyNSIsIE9DMjMyNSwKKwkgezB4MDAxMjEwOGQsIDB4ZmZmZmZmZmYsIDAsIDAsIDAsIDB9LAorCSBUTEFOX0FEQVBURVJfVU5NQU5BR0VEX1BIWSwgMHhGOH0sCisJeyJPbGljb20gT0MtMjMyNiIsIE9DMjMyNiwKKwkgezB4MDAxNDEwOGQsIDB4ZmZmZmZmZmYsIDAsIDAsIDAsIDB9LAorCSBUTEFOX0FEQVBURVJfVVNFX0lOVEVSTl8xMCwgMHhGOH0sCisJeyJDb21wYXEgTmV0ZWxsaWdlbnQgMTAvMTAwIFRYIFVUUCIsIE5FVEVMTElHRU5UXzEwXzEwMF9XU181MTAwLAorCSB7MHhiMDMwMGUxMSwgMHhmZmZmZmZmZiwgMCwgMCwgMCwgMH0sCisJIFRMQU5fQURBUFRFUl9BQ1RJVklUWV9MRUQsIDB4ODN9LAorCXsiQ29tcGFxIE5ldGVsbGlnZW50IDEwIFQvMiBQQ0kgVVRQL0NvYXgiLCBORVRFTExJR0VOVF8xMF9UMiwKKwkgezB4YjAxMjBlMTEsIDB4ZmZmZmZmZmYsIDAsIDAsIDAsIDB9LAorCSBUTEFOX0FEQVBURVJfTk9ORSwgMHg4M30sCisJeyJDb21wYXEgTmV0RmxleC0zL0UiLCAwLAkvKiBFSVNBIGNhcmQgKi8KKwkgezAsIDAsIDAsIDAsIDAsIDB9LAorCSBUTEFOX0FEQVBURVJfQUNUSVZJVFlfTEVEIHwgVExBTl9BREFQVEVSX1VOTUFOQUdFRF9QSFkgfAorCSBUTEFOX0FEQVBURVJfQklUX1JBVEVfUEhZLCAweDgzfSwKKwl7IkNvbXBhcSBOZXRGbGV4LTMvRSIsIDAsCS8qIEVJU0EgY2FyZCAqLworCSB7MCwgMCwgMCwgMCwgMCwgMH0sCisJIFRMQU5fQURBUFRFUl9BQ1RJVklUWV9MRUQsIDB4ODN9LAorCXswLCAwLAorCSB7MCwgMCwgMCwgMCwgMCwgMH0sCisJIDAsIDB9LAorfTsKIAotCVRodW5kZXJMQU4gRHJpdmVyIEVlcHJvbSByb3V0aW5lcwogCi0JVGhlIENvbXBhcSBOZXRlbGxpZ2VudCAxMCBhbmQgMTAvMTAwIGNhcmRzIHVzZSBhIE1pY3JvY2hpcCAyNEMwMkEKLQlFRVBST00uICBUaGVzZSBmdW5jdGlvbnMgYXJlIGJhc2VkIG9uIGluZm9ybWF0aW9uIGluIE1pY3JvY2hpcCdzCi0JZGF0YSBzaGVldC4gIEkgZG9uJ3Qga25vdyBob3cgd2VsbCB0aGlzIGZ1bmN0aW9ucyB3aWxsIHdvcmsgd2l0aAotCW90aGVyIEVFUFJPTXMuCitzdHJ1Y3QgVExhbkxpc3QgeworCXUzMiBmb3J3YXJkOworCXUxNiBjU3RhdDsKKwl1MTYgZnJhbWVTaXplOworCXN0cnVjdCB7CisJCXUzMiBjb3VudDsKKwkJdTMyIGFkZHJlc3M7CisJfSBidWZmZXJbVExBTl9CVUZGRVJTX1BFUl9MSVNUXTsKK307CiAKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLQkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JICoJVExhbl9FZVNlbmRTdGFydAotCSAqCi0JICoJUmV0dXJuczoKLQkgKgkJTm90aGluZwotCSAqCVBhcm1zOgkKLQkgKgkJaW9fYmFzZQkJVGhlIElPIHBvcnQgYmFzZSBhZGRyZXNzIGZvciB0aGUKLQkgKgkJCQlUTEFOIGRldmljZSB3aXRoIHRoZSBFRVBST00gdG8KLQkgKgkJCQl1c2UuCi0JICoKLQkgKglUaGlzIGZ1bmN0aW9uIHNlbmRzIGEgc3RhcnQgY3ljbGUgdG8gYW4gRUVQUk9NIGF0dGFjaGVkCi0JICoJdG8gYSBUTEFOIGNoaXAuCi0JICoKLQkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXN0YXRpYyB2b2lkIFRMYW5fRWVTZW5kU3RhcnQoIHUxNiBpb19iYXNlICkKLXsKLQl1MTYJc2lvOworc3RydWN0IFRMYW5MaXN0IHR4X3JpbmdbVExBTl9OVU1fVFhfTElTVFNdOworc3RhdGljIHVuc2lnbmVkIGNoYXIgdHhiW1RMQU5fTUFYX0ZSQU1FX1NJWkUgKiBUTEFOX05VTV9UWF9MSVNUU107CiAKLQlvdXR3KCBUTEFOX05FVF9TSU8sIGlvX2Jhc2UgKyBUTEFOX0RJT19BRFIgKTsKLQlzaW8gPSBpb19iYXNlICsgVExBTl9ESU9fREFUQSArIFRMQU5fTkVUX1NJTzsKK3N0cnVjdCBUTGFuTGlzdCByeF9yaW5nW1RMQU5fTlVNX1JYX0xJU1RTXTsKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHJ4YltUTEFOX01BWF9GUkFNRV9TSVpFICogVExBTl9OVU1fUlhfTElTVFNdOwogCi0JVExhbl9TZXRCaXQoIFRMQU5fTkVUX1NJT19FQ0xPSywgc2lvICk7Ci0JVExhbl9TZXRCaXQoIFRMQU5fTkVUX1NJT19FREFUQSwgc2lvICk7Ci0JVExhbl9TZXRCaXQoIFRMQU5fTkVUX1NJT19FVFhFTiwgc2lvICk7Ci0JVExhbl9DbGVhckJpdCggVExBTl9ORVRfU0lPX0VEQVRBLCBzaW8gKTsKLQlUTGFuX0NsZWFyQml0KCBUTEFOX05FVF9TSU9fRUNMT0ssIHNpbyApOwordHlwZWRlZiB1OCBUTGFuQnVmZmVyW1RMQU5fTUFYX0ZSQU1FX1NJWkVdOwogCi19IC8qIFRMYW5fRWVTZW5kU3RhcnQgKi8KIAotCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkgKglUTGFuX0VlU2VuZEJ5dGUKLQkgKgotCSAqCVJldHVybnM6Ci0JICoJCUlmIHRoZSBjb3JyZWN0IGFjayB3YXMgcmVjZWl2ZWQsIDAsIG90aGVyd2lzZSAxCi0JICoJUGFybXM6CWlvX2Jhc2UJCVRoZSBJTyBwb3J0IGJhc2UgYWRkcmVzcyBmb3IgdGhlCi0JICoJCQkJVExBTiBkZXZpY2Ugd2l0aCB0aGUgRUVQUk9NIHRvCi0JICoJCQkJdXNlLgotCSAqCQlkYXRhCQlUaGUgOCBiaXRzIG9mIGluZm9ybWF0aW9uIHRvCi0JICoJCQkJc2VuZCB0byB0aGUgRUVQUk9NLgotCSAqCQlzdG9wCQlJZiBUTEFOX0VFUFJPTV9TVE9QIGlzIHBhc3NlZCwgYQotCSAqCQkJCXN0b3AgY3ljbGUgaXMgc2VudCBhZnRlciB0aGUKLQkgKgkJCQlieXRlIGlzIHNlbnQgYWZ0ZXIgdGhlIGFjayBpcwotCSAqCQkJCXJlYWQuCi0JICoKLQkgKglUaGlzIGZ1bmN0aW9uIHNlbmRzIGEgYnl0ZSBvbiB0aGUgc2VyaWFsIEVFUFJPTSBsaW5lLAotCSAqCWRyaXZpbmcgdGhlIGNsb2NrIHRvIHNlbmQgZWFjaCBiaXQuIFRoZSBmdW5jdGlvbiB0aGVuCi0JICoJcmV2ZXJzZXMgdHJhbnNtaXNzaW9uIGRpcmVjdGlvbiBhbmQgcmVhZHMgYW4gYWNrbm93bGVkZ2UKLQkgKgliaXQuCi0JICoKLQkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgY2hpcF9pZHg7CiAKLXN0YXRpYyBpbnQgVExhbl9FZVNlbmRCeXRlKCB1MTYgaW9fYmFzZSwgdTggZGF0YSwgaW50IHN0b3AgKQotewotCWludAllcnI7Ci0JdTgJcGxhY2U7Ci0JdTE2CXNpbzsKIAotCW91dHcoIFRMQU5fTkVUX1NJTywgaW9fYmFzZSArIFRMQU5fRElPX0FEUiApOwotCXNpbyA9IGlvX2Jhc2UgKyBUTEFOX0RJT19EQVRBICsgVExBTl9ORVRfU0lPOworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIFRMQU4gUHJpdmF0ZSBJbmZvcm1hdGlvbiBTdHJ1Y3R1cmUKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdHJ1Y3QgdGxhbl9wcml2YXRlIHsKKwl1bnNpZ25lZCBzaG9ydCB2ZW5kb3JfaWQ7CS8qIFBDSSBWZW5kb3IgY29kZSAqLworCXVuc2lnbmVkIHNob3J0IGRldl9pZDsJLyogUENJIERldmljZSBjb2RlICovCisJY29uc3QgY2hhciAqbmljX25hbWU7CisJdTggKnBhZEJ1ZmZlcjsKKwl1OCAqcnhCdWZmZXI7CisJc3RydWN0IFRMYW5MaXN0ICpyeF9oZWFkX2Rlc2M7CisJdTMyIHJ4SGVhZDsKKwl1MzIgcnhUYWlsOworCXUzMiByeEVvY0NvdW50OworCXVuc2lnbmVkIGludCBjdXJfcngsIGRpcnR5X3J4OwkvKiBQcm9kdWNlci9jb25zdW1lciByaW5nIGluZGljaWVzICovCisJdW5zaWduZWQgaW50IGN1cl90eCwgZGlydHlfdHg7CisJdW5zaWduZWQgcnhfYnVmX3N6OwkvKiBCYXNlZCBvbiBtdHUgKyBTbGFjayAqLworCXN0cnVjdCBUTGFuTGlzdCAqdHhMaXN0OworCXN0cnVjdCBUTGFuTGlzdCAqcnhMaXN0OworCXU4ICp0eEJ1ZmZlcjsKKwl1MzIgdHhIZWFkOworCXUzMiB0eEluUHJvZ3Jlc3M7CisJdTMyIHR4VGFpbDsKKwlpbnQgZW9jOworCXUzMiB0eEJ1c3lDb3VudDsKKwl1MzIgcGh5T25saW5lOworCXUzMiB0aW1lclNldEF0OworCXUzMiB0aW1lclR5cGU7CisJdTMyIGFkYXB0ZXJSZXY7CisJdTMyIGF1aTsKKwl1MzIgZGVidWc7CisJdTMyIGR1cGxleDsKKwl1MzIgcGh5WzJdOworCXUzMiBwaHlOdW07CisJdTMyIHNwZWVkOworCXU4IHRsYW5SZXY7CisJdTggdGxhbkZ1bGxEdXBsZXg7CisJY2hhciBkZXZOYW1lWzhdOworCXU4IGxpbms7CisJdTggaXNfZWlzYTsKKwl1OCBuZWdfYmVfdmVyYm9zZTsKK30gVExhblByaXZhdGVJbmZvOwogCi0JLyogQXNzdW1lIGNsb2NrIGlzIGxvdywgdHggaXMgZW5hYmxlZDsgKi8KLQlmb3IgKCBwbGFjZSA9IDB4ODA7IHBsYWNlICE9IDA7IHBsYWNlID4+PSAxICkgewotCQlpZiAoIHBsYWNlICYgZGF0YSApCi0JCQlUTGFuX1NldEJpdCggVExBTl9ORVRfU0lPX0VEQVRBLCBzaW8gKTsKLQkJZWxzZQotCQkJVExhbl9DbGVhckJpdCggVExBTl9ORVRfU0lPX0VEQVRBLCBzaW8gKTsKLQkJVExhbl9TZXRCaXQoIFRMQU5fTkVUX1NJT19FQ0xPSywgc2lvICk7Ci0JCVRMYW5fQ2xlYXJCaXQoIFRMQU5fTkVUX1NJT19FQ0xPSywgc2lvICk7Ci0JfQotCVRMYW5fQ2xlYXJCaXQoIFRMQU5fTkVUX1NJT19FVFhFTiwgc2lvICk7Ci0JVExhbl9TZXRCaXQoIFRMQU5fTkVUX1NJT19FQ0xPSywgc2lvICk7Ci0JZXJyID0gVExhbl9HZXRCaXQoIFRMQU5fTkVUX1NJT19FREFUQSwgc2lvICk7Ci0JVExhbl9DbGVhckJpdCggVExBTl9ORVRfU0lPX0VDTE9LLCBzaW8gKTsKLQlUTGFuX1NldEJpdCggVExBTl9ORVRfU0lPX0VUWEVOLCBzaW8gKTsKK3N0YXRpYyBzdHJ1Y3QgdGxhbl9wcml2YXRlICpwcml2OwogCi0JaWYgKCAoICEgZXJyICkgJiYgc3RvcCApIHsKLQkJVExhbl9DbGVhckJpdCggVExBTl9ORVRfU0lPX0VEQVRBLCBzaW8gKTsJLyogU1RPUCwgcmFpc2UgZGF0YSB3aGlsZSBjbG9jayBpcyBoaWdoICovCi0JCVRMYW5fU2V0Qml0KCBUTEFOX05FVF9TSU9fRUNMT0ssIHNpbyApOwotCQlUTGFuX1NldEJpdCggVExBTl9ORVRfU0lPX0VEQVRBLCBzaW8gKTsKLQl9Cit1MzIgQkFTRTsKIAotCXJldHVybiAoIGVyciApOwogCi19IC8qIFRMYW5fRWVTZW5kQnl0ZSAqLwogCi0JLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCSAqCVRMYW5fRWVSZWNlaXZlQnl0ZQotCSAqCi0JICoJUmV0dXJuczoKLQkgKgkJTm90aGluZwotCSAqCVBhcm1zOgotCSAqCQlpb19iYXNlCQlUaGUgSU8gcG9ydCBiYXNlIGFkZHJlc3MgZm9yIHRoZQotCSAqCQkJCVRMQU4gZGV2aWNlIHdpdGggdGhlIEVFUFJPTSB0bwotCSAqCQkJCXVzZS4KLQkgKgkJZGF0YQkJQW4gYWRkcmVzcyB0byBhIGNoYXIgdG8gaG9sZCB0aGUKLQkgKgkJCQlkYXRhIHNlbnQgZnJvbSB0aGUgRUVQUk9NLgotCSAqCQlzdG9wCQlJZiBUTEFOX0VFUFJPTV9TVE9QIGlzIHBhc3NlZCwgYQotCSAqCQkJCXN0b3AgY3ljbGUgaXMgc2VudCBhZnRlciB0aGUKLQkgKgkJCQlieXRlIGlzIHJlY2VpdmVkLCBhbmQgbm8gYWNrIGlzCi0JICoJCQkJc2VudC4KLQkgKgotCSAqCVRoaXMgZnVuY3Rpb24gcmVjZWl2ZXMgOCBiaXRzIG9mIGRhdGEgZnJvbSB0aGUgRUVQUk9NCi0JICoJb3ZlciB0aGUgc2VyaWFsIGxpbmsuICBJdCB0aGVuIHNlbmRzIGFuZCBhY2sgYml0LCBvciBubwotCSAqCWFjayBhbmQgYSBzdG9wIGJpdC4gIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byByZXRyaWV2ZQotCSAqCWRhdGEgYWZ0ZXIgdGhlIGFkZHJlc3Mgb2YgYSBieXRlIGluIHRoZSBFRVBST00gaGFzIGJlZW4KLQkgKglzZW50LgotCSAqCi0JICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKglUTGFuX1Jlc2V0TGlzdHMKKyoKKyoJUmV0dXJuczoKKyoJCU5vdGhpbmcKKyoJUGFybXM6CisqCQlkZXYJVGhlIGRldmljZSBzdHJ1Y3R1cmUgd2l0aCB0aGUgbGlzdAorKgkJCXN0dWN0dXJlcyB0byBiZSByZXNldC4KKyoKKyoJVGhpcyByb3V0aW5lIHNldHMgdGhlIHZhcmlhYmxlcyBhc3NvY2lhdGVkIHdpdGggbWFuYWdpbmcKKyoJdGhlIFRMQU4gbGlzdHMgdG8gdGhlaXIgaW5pdGlhbCB2YWx1ZXMuCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotc3RhdGljIHZvaWQgVExhbl9FZVJlY2VpdmVCeXRlKCB1MTYgaW9fYmFzZSwgdTggKmRhdGEsIGludCBzdG9wICkKK3ZvaWQgVExhbl9SZXNldExpc3RzKHN0cnVjdCBuaWMgKm5pYyBfX3VudXNlZCkKIHsKLQl1OCAgcGxhY2U7Ci0JdTE2IHNpbzsKIAotCW91dHcoIFRMQU5fTkVUX1NJTywgaW9fYmFzZSArIFRMQU5fRElPX0FEUiApOwotCXNpbyA9IGlvX2Jhc2UgKyBUTEFOX0RJT19EQVRBICsgVExBTl9ORVRfU0lPOwotCSpkYXRhID0gMDsKKwlpbnQgaTsKKwlzdHJ1Y3QgVExhbkxpc3QgKmxpc3Q7CisJcHJpdi0+dHhIZWFkID0gMDsKKwlwcml2LT50eFRhaWwgPSAwOwogCi0JLyogQXNzdW1lIGNsb2NrIGlzIGxvdywgdHggaXMgZW5hYmxlZDsgKi8KLQlUTGFuX0NsZWFyQml0KCBUTEFOX05FVF9TSU9fRVRYRU4sIHNpbyApOwotCWZvciAoIHBsYWNlID0gMHg4MDsgcGxhY2U7IHBsYWNlID4+PSAxICkgewotCQlUTGFuX1NldEJpdCggVExBTl9ORVRfU0lPX0VDTE9LLCBzaW8gKTsKLQkJaWYgKCBUTGFuX0dldEJpdCggVExBTl9ORVRfU0lPX0VEQVRBLCBzaW8gKSApCi0JCQkqZGF0YSB8PSBwbGFjZTsKLQkJVExhbl9DbGVhckJpdCggVExBTl9ORVRfU0lPX0VDTE9LLCBzaW8gKTsKKwlmb3IgKGkgPSAwOyBpIDwgVExBTl9OVU1fVFhfTElTVFM7IGkrKykgeworCQlsaXN0ID0gJnR4X3JpbmdbaV07CisJCWxpc3QtPmNTdGF0ID0gVExBTl9DU1RBVF9VTlVTRUQ7CisvKgkJbGlzdC0+YnVmZmVyWzBdLmFkZHJlc3MgPSAwOyAqLworCQlsaXN0LT5idWZmZXJbMF0uYWRkcmVzcyA9IHZpcnRfdG9fYnVzKHR4YiArIAorCQkJCShpICogVExBTl9NQVhfRlJBTUVfU0laRSkpOyAKKwkJbGlzdC0+YnVmZmVyWzJdLmNvdW50ID0gMDsKKwkJbGlzdC0+YnVmZmVyWzJdLmFkZHJlc3MgPSAwOworCQlsaXN0LT5idWZmZXJbOV0uYWRkcmVzcyA9IDA7CisvKgkJbGlzdC0+Zm9yd2FyZCA9IDA7ICovCiAJfQogCi0JVExhbl9TZXRCaXQoIFRMQU5fTkVUX1NJT19FVFhFTiwgc2lvICk7Ci0JaWYgKCAhIHN0b3AgKSB7Ci0JCVRMYW5fQ2xlYXJCaXQoIFRMQU5fTkVUX1NJT19FREFUQSwgc2lvICk7CS8qIEFjayA9IDAgKi8KLQkJVExhbl9TZXRCaXQoIFRMQU5fTkVUX1NJT19FQ0xPSywgc2lvICk7Ci0JCVRMYW5fQ2xlYXJCaXQoIFRMQU5fTkVUX1NJT19FQ0xPSywgc2lvICk7Ci0JfSBlbHNlIHsKLQkJVExhbl9TZXRCaXQoIFRMQU5fTkVUX1NJT19FREFUQSwgc2lvICk7CQkvKiBObyBhY2sgPSAxICg/KSAqLwotCQlUTGFuX1NldEJpdCggVExBTl9ORVRfU0lPX0VDTE9LLCBzaW8gKTsKLQkJVExhbl9DbGVhckJpdCggVExBTl9ORVRfU0lPX0VDTE9LLCBzaW8gKTsKLQkJVExhbl9DbGVhckJpdCggVExBTl9ORVRfU0lPX0VEQVRBLCBzaW8gKTsJLyogU1RPUCwgcmFpc2UgZGF0YSB3aGlsZSBjbG9jayBpcyBoaWdoICovCi0JCVRMYW5fU2V0Qml0KCBUTEFOX05FVF9TSU9fRUNMT0ssIHNpbyApOwotCQlUTGFuX1NldEJpdCggVExBTl9ORVRfU0lPX0VEQVRBLCBzaW8gKTsKLQl9CisJcHJpdi0+Y3VyX3J4ID0gMDsKKwlwcml2LT5yeF9idWZfc3ogPSAoVExBTl9NQVhfRlJBTUVfU0laRSk7CisJcHJpdi0+cnhfaGVhZF9kZXNjID0gJnJ4X3JpbmdbMF07CisKKwkvKiBJbml0aWFsaXplIGFsbCB0aGUgUnggZGVzY3JpcHRvcnMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgVExBTl9OVU1fUlhfTElTVFM7IGkrKykgeworCQlyeF9yaW5nW2ldLmZvcndhcmQgPSB2aXJ0X3RvX2xlMzJkZXNjKCZyeF9yaW5nW2kgKyAxXSk7CisJCXJ4X3JpbmdbaV0uY1N0YXQgPSBUTEFOX0NTVEFUX1JFQURZOworCQlyeF9yaW5nW2ldLmZyYW1lU2l6ZSA9IFRMQU5fTUFYX0ZSQU1FX1NJWkU7CisJCXJ4X3JpbmdbaV0uYnVmZmVyWzBdLmNvdW50ID0KKwkJICAgIFRMQU5fTUFYX0ZSQU1FX1NJWkUgfCBUTEFOX0xBU1RfQlVGRkVSOworCQlyeF9yaW5nW2ldLmJ1ZmZlclswXS5hZGRyZXNzID0KKwkJICAgIHZpcnRfdG9fbGUzMmRlc2MoJnJ4YltpICogVExBTl9NQVhfRlJBTUVfU0laRV0pOworCQlyeF9yaW5nW2ldLmJ1ZmZlclsxXS5jb3VudCA9IDA7CisJCXJ4X3JpbmdbaV0uYnVmZmVyWzFdLmFkZHJlc3MgPSAwOworCX0KKworCS8qIE1hcmsgdGhlIGxhc3QgZW50cnkgYXMgd3JhcHBpbmcgdGhlIHJpbmcgKi8KKwlyeF9yaW5nW2kgLSAxXS5mb3J3YXJkID0gdmlydF90b19sZTMyZGVzYygmcnhfcmluZ1swXSk7CisJcHJpdi0+ZGlydHlfcnggPSAodW5zaWduZWQgaW50KSAoaSAtIFRMQU5fTlVNX1JYX0xJU1RTKTsKIAotfSAvKiBUTGFuX0VlUmVjZWl2ZUJ5dGUgKi8KK30gLyogVExhbl9SZXNldExpc3RzICovCiAKLQkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JICoJVExhbl9FZVJlYWRCeXRlCi0JICoKLQkgKglSZXR1cm5zOgotCSAqCQlObyBlcnJvciA9IDAsIGVsc2UsIHRoZSBzdGFnZSBhdCB3aGljaCB0aGUgZXJyb3IKLQkgKgkJb2NjdXJyZWQuCi0JICoJUGFybXM6Ci0JICoJCWlvX2Jhc2UJCVRoZSBJTyBwb3J0IGJhc2UgYWRkcmVzcyBmb3IgdGhlCi0JICoJCQkJVExBTiBkZXZpY2Ugd2l0aCB0aGUgRUVQUk9NIHRvCi0JICoJCQkJdXNlLgotCSAqCQllZV9hZGRyCQlUaGUgYWRkcmVzcyBvZiB0aGUgYnl0ZSBpbiB0aGUKLQkgKgkJCQlFRVBST00gd2hvc2UgY29udGVudHMgYXJlIHRvIGJlCi0JICoJCQkJcmV0cmlldmVkLgotCSAqCQlkYXRhCQlBbiBhZGRyZXNzIHRvIGEgY2hhciB0byBob2xkIHRoZQotCSAqCQkJCWRhdGEgb2J0YWluZWQgZnJvbSB0aGUgRUVQUk9NLgotCSAqCi0JICoJVGhpcyBmdW5jdGlvbiByZWFkcyBhIGJ5dGUgb2YgaW5mb3JtYXRpb24gZnJvbSBhbiBieXRlCi0JICoJY2VsbCBpbiB0aGUgRUVQUk9NLgotCSAqCi0JICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKglUTGFuX1Jlc2V0CisqCisqCVJldHVybnM6CisqCQkwCisqCVBhcm1zOgorKgkJZGV2CVBvaW50ZXIgdG8gZGV2aWNlIHN0cnVjdHVyZSBvZiBhZGFwdGVyCisqCQkJdG8gYmUgcmVzZXQuCisqCisqCVRoaXMgZnVuY3Rpb24gcmVzZXRzIHRoZSBhZGFwdGVyIGFuZCBpdCdzIHBoeXNpY2FsCisqCWRldmljZS4gIFNlZSBDaGFwLiAzLCBwcC4gOS0xMCBvZiB0aGUgIlRodW5kZXJMQU4KKyoJUHJvZ3JhbW1lcidzIEd1aWRlIiBmb3IgZGV0YWlscy4gIFRoZSByb3V0aW5lIHRyaWVzIHRvCisqCWltcGxlbWVudCB3aGF0IGlzIGRldGFpbGVkIHRoZXJlLCB0aG91Z2ggYWRqdXN0bWVudHMKKyoJaGF2ZSBiZWVuIG1hZGUuCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotc3RhdGljIGludCBUTGFuX0VlUmVhZEJ5dGUoIHUxNiBpb19iYXNlLCB1OCBlZV9hZGRyLCB1OCAqZGF0YSApCit2b2lkIFRMYW5fUmVzZXRBZGFwdGVyKHN0cnVjdCBuaWMgKm5pYyBfX3VudXNlZCkKIHsKLQlpbnQgZXJyOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3MgPSAwOwotCWludCByZXQ9MDsKKwlpbnQgaTsKKwl1MzIgYWRkcjsKKwl1MzIgZGF0YTsKKwl1OCBkYXRhODsKIAotCVRMYW5fRWVTZW5kU3RhcnQoIGlvX2Jhc2UgKTsKLQllcnIgPSBUTGFuX0VlU2VuZEJ5dGUoIGlvX2Jhc2UsIDB4QTAsIFRMQU5fRUVQUk9NX0FDSyApOwotCWlmIChlcnIpCi0JewotCQlyZXQ9MTsKLQkJZ290byBmYWlsOwotCX0KLQllcnIgPSBUTGFuX0VlU2VuZEJ5dGUoIGlvX2Jhc2UsIGVlX2FkZHIsIFRMQU5fRUVQUk9NX0FDSyApOwotCWlmIChlcnIpCi0JewotCQlyZXQ9MjsKLQkJZ290byBmYWlsOwotCX0KLQlUTGFuX0VlU2VuZFN0YXJ0KCBpb19iYXNlICk7Ci0JZXJyID0gVExhbl9FZVNlbmRCeXRlKCBpb19iYXNlLCAweEExLCBUTEFOX0VFUFJPTV9BQ0sgKTsKLQlpZiAoZXJyKQotCXsKLQkJcmV0PTM7Ci0JCWdvdG8gZmFpbDsKLQl9Ci0JVExhbl9FZVJlY2VpdmVCeXRlKCBpb19iYXNlLCBkYXRhLCBUTEFOX0VFUFJPTV9TVE9QICk7Ci1mYWlsOgorCXByaXYtPnRsYW5GdWxsRHVwbGV4ID0gRkFMU0U7CisJcHJpdi0+cGh5T25saW5lID0gMDsKKy8qICAxLglBc3NlcnQgcmVzZXQgYml0LiAqLwogCi0JcmV0dXJuIHJldDsKKwlkYXRhID0gaW5sKEJBU0UgKyBUTEFOX0hPU1RfQ01EKTsKKwlkYXRhIHw9IFRMQU5fSENfQURfUlNUOworCW91dGwoZGF0YSwgQkFTRSArIFRMQU5fSE9TVF9DTUQpOwogCi19IC8qIFRMYW5fRWVSZWFkQnl0ZSAqLworCXVkZWxheSgxMDAwKTsKIAotI2lmCTAKLS8qIE5vdCB5ZXQgY29udmVydGVkIGZyb20gTGludXggZHJpdmVyICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyogIDIuCVR1cm4gb2ZmIGludGVycnVwdHMuICggUHJvYmFibHkgaXNuJ3QgbmVjZXNzYXJ5ICkgKi8KIAotCVRodW5kZXJMQU4gRHJpdmVyIFBIWSBMYXllciBSb3V0aW5lcworCWRhdGEgPSBpbmwoQkFTRSArIFRMQU5fSE9TVF9DTUQpOworCWRhdGEgfD0gVExBTl9IQ19JTlRfT0ZGOworCW91dGwoZGF0YSwgQkFTRSArIFRMQU5fSE9TVF9DTUQpOworLyogIDMuCUNsZWFyIEFSRUdzIGFuZCBIQVNIcy4gKi8KIAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwlmb3IgKGkgPSBUTEFOX0FSRUdfMDsgaSA8PSBUTEFOX0hBU0hfMjsgaSArPSA0KSB7CisJCVRMYW5fRGlvV3JpdGUzMihCQVNFLCAodTE2KSBpLCAwKTsKKwl9CiAKLQkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JICoJVExhbl9QaHlQcmludAotCSAqCi0JICoJUmV0dXJuczoKLQkgKgkJTm90aGluZwotCSAqCVBhcm1zOgotCSAqCQlkZXYJQSBwb2ludGVyIHRvIHRoZSBkZXZpY2Ugc3RydWN0dXJlIG9mIHRoZQotCSAqCQkJVExBTiBkZXZpY2UgaGF2aW5nIHRoZSBQSFlzIHRvIGJlIGRldGFpbGVkLgotCSAqCQkJCQotCSAqCVRoaXMgZnVuY3Rpb24gcHJpbnRzIHRoZSByZWdpc3RlcnMgYSBQSFkgKGFrYSB0cmFuY2VpdmVyKS4KLQkgKgotCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICA0LglTZXR1cCBOZXRDb25maWcgcmVnaXN0ZXIuICovCiAKLXZvaWQgVExhbl9QaHlQcmludCggc3RydWN0IG5ldF9kZXZpY2UgKmRldiApCi17Ci0JVExhblByaXZhdGVJbmZvICpwcml2ID0gZGV2LT5wcml2OwotCXUxNiBpLCBkYXRhMCwgZGF0YTEsIGRhdGEyLCBkYXRhMywgcGh5OworCWRhdGEgPQorCSAgICBUTEFOX05FVF9DRkdfMUZSQUcgfCBUTEFOX05FVF9DRkdfMUNIQU4gfCBUTEFOX05FVF9DRkdfUEhZX0VOOworCVRMYW5fRGlvV3JpdGUxNihCQVNFLCBUTEFOX05FVF9DT05GSUcsICh1MTYpIGRhdGEpOwogCi0JcGh5ID0gcHJpdi0+cGh5W3ByaXYtPnBoeU51bV07CisvKiAgNS4JTG9hZCBMZF9UbXIgYW5kIExkX1RociBpbiBIT1NUX0NNRC4gKi8KIAotCWlmICggcHJpdi0+YWRhcHRlci0+ZmxhZ3MgJiBUTEFOX0FEQVBURVJfVU5NQU5BR0VEX1BIWSApIHsKLQkJcHJpbnRrKCAiVExBTjogICBEZXZpY2UgJXMsIFVubWFuYWdlZCBQSFkuXG4iLCBkZXYtPm5hbWUgKTsKLQl9IGVsc2UgaWYgKCBwaHkgPD0gVExBTl9QSFlfTUFYX0FERFIgKSB7Ci0JCXByaW50ayggIlRMQU46ICAgRGV2aWNlICVzLCBQSFkgMHglMDJ4LlxuIiwgZGV2LT5uYW1lLCBwaHkgKTsKLQkJcHJpbnRrKCAiVExBTjogICAgICBPZmYuICArMCAgICAgKzEgICAgICsyICAgICArMyBcbiIgKTsKLSAgICAgICAgICAgICAgICBmb3IgKCBpID0gMDsgaSA8IDB4MjA7IGkrPSA0ICkgewotCQkJcHJpbnRrKCAiVExBTjogICAgICAweCUwMngiLCBpICk7Ci0JCQlUTGFuX01paVJlYWRSZWcoIGRldiwgcGh5LCBpLCAmZGF0YTAgKTsKLQkJCXByaW50ayggIiAweCUwNGh4IiwgZGF0YTAgKTsKLQkJCVRMYW5fTWlpUmVhZFJlZyggZGV2LCBwaHksIGkgKyAxLCAmZGF0YTEgKTsKLQkJCXByaW50ayggIiAweCUwNGh4IiwgZGF0YTEgKTsKLQkJCVRMYW5fTWlpUmVhZFJlZyggZGV2LCBwaHksIGkgKyAyLCAmZGF0YTIgKTsKLQkJCXByaW50ayggIiAweCUwNGh4IiwgZGF0YTIgKTsKLQkJCVRMYW5fTWlpUmVhZFJlZyggZGV2LCBwaHksIGkgKyAzLCAmZGF0YTMgKTsKLQkJCXByaW50ayggIiAweCUwNGh4XG4iLCBkYXRhMyApOwotCQl9Ci0JfSBlbHNlIHsKLQkJcHJpbnRrKCAiVExBTjogICBEZXZpY2UgJXMsIEludmFsaWQgUEhZLlxuIiwgZGV2LT5uYW1lICk7Ci0JfQorCW91dGwoVExBTl9IQ19MRF9UTVIgfCAweDNmLCBCQVNFICsgVExBTl9IT1NUX0NNRCk7CisJb3V0bChUTEFOX0hDX0xEX1RIUiB8IDB4MCwgQkFTRSArIFRMQU5fSE9TVF9DTUQpOwogCi19IC8qIFRMYW5fUGh5UHJpbnQgKi8KKy8qICA2LglVbnJlc2V0IHRoZSBNSUkgYnkgc2V0dGluZyBOTVJTVCAoaW4gTmV0U2lvKSB0byAxLiAqLwogCi0JLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCSAqCVRMYW5fUGh5RGV0ZWN0Ci0JICoKLQkgKglSZXR1cm5zOgotCSAqCQlOb3RoaW5nCi0JICoJUGFybXM6Ci0JICoJCWRldglBIHBvaW50ZXIgdG8gdGhlIGRldmljZSBzdHJ1Y3R1cmUgb2YgdGhlIGFkYXB0ZXIKLQkgKgkJCWZvciB3aGljaCB0aGUgUEhZIG5lZWRzIGRldGVybWluZWQuCi0JICoKLQkgKglTbyBmYXIgSSd2ZSBmb3VuZCB0aGF0IGFkYXB0ZXJzIHdoaWNoIGhhdmUgZXh0ZXJuYWwgUEhZcwotCSAqCW1heSBhbHNvIHVzZSB0aGUgaW50ZXJuYWwgUEhZIGZvciBwYXJ0IG9mIHRoZSBmdW5jdGlvbmFsaXR5LgotCSAqCShlZywgQVVJL1RoaW5uZXQpLiAgVGhpcyBmdW5jdGlvbiBmaW5kcyBvdXQgaWYgdGhpcyBUTEFOCi0JICoJY2hpcCBoYXMgYW4gaW50ZXJuYWwgUEhZLCBhbmQgdGhlbiBmaW5kcyB0aGUgZmlyc3QgZXh0ZXJuYWwKLQkgKglQSFkgKHN0YXJ0aW5nIGZyb20gYWRkcmVzcyAwKSBpZiBpdCBleGlzdHMpLgotCSAqCi0JICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCW91dHcoVExBTl9ORVRfU0lPLCBCQVNFICsgVExBTl9ESU9fQURSKTsKKwlhZGRyID0gQkFTRSArIFRMQU5fRElPX0RBVEEgKyBUTEFOX05FVF9TSU87CisJVExhbl9TZXRCaXQoVExBTl9ORVRfU0lPX05NUlNULCBhZGRyKTsKIAotdm9pZCBUTGFuX1BoeURldGVjdCggc3RydWN0IG5ldF9kZXZpY2UgKmRldiApCi17Ci0JVExhblByaXZhdGVJbmZvICpwcml2ID0gZGV2LT5wcml2OwotCXUxNgkJY29udHJvbDsKLQl1MTYJCWhpOwotCXUxNgkJbG87Ci0JdTMyCQlwaHk7CisvKiAgNy4JU2V0dXAgdGhlIHJlbWFpbmluZyByZWdpc3RlcnMuICovCiAKLQlpZiAoIHByaXYtPmFkYXB0ZXItPmZsYWdzICYgVExBTl9BREFQVEVSX1VOTUFOQUdFRF9QSFkgKSB7Ci0JCXByaXYtPnBoeU51bSA9IDB4RkZGRjsKLQkJcmV0dXJuOworCWlmIChwcml2LT50bGFuUmV2ID49IDB4MzApIHsKKwkJZGF0YTggPSBUTEFOX0lEX1RYX0VPQyB8IFRMQU5fSURfUlhfRU9DOworCQlUTGFuX0Rpb1dyaXRlOChCQVNFLCBUTEFOX0lOVF9ESVMsIGRhdGE4KTsKIAl9CisJVExhbl9QaHlEZXRlY3QobmljKTsKKwlkYXRhID0gVExBTl9ORVRfQ0ZHXzFGUkFHIHwgVExBTl9ORVRfQ0ZHXzFDSEFOOwogCi0JVExhbl9NaWlSZWFkUmVnKCBkZXYsIFRMQU5fUEhZX01BWF9BRERSLCBNSUlfR0VOX0lEX0hJLCAmaGkgKTsKLQkKLQlpZiAoIGhpICE9IDB4RkZGRiApIHsKLQkJcHJpdi0+cGh5WzBdID0gVExBTl9QSFlfTUFYX0FERFI7Ci0JfSBlbHNlIHsKLQkJcHJpdi0+cGh5WzBdID0gVExBTl9QSFlfTk9ORTsKKwlpZiAodGxhbl9wY2lfdGJsW2NoaXBfaWR4XS5mbGFncyAmIFRMQU5fQURBUFRFUl9CSVRfUkFURV9QSFkpIHsKKwkJZGF0YSB8PSBUTEFOX05FVF9DRkdfQklUOworCQlpZiAocHJpdi0+YXVpID09IDEpIHsKKwkJCVRMYW5fRGlvV3JpdGU4KEJBU0UsIFRMQU5fQUNPTU1JVCwgMHgwYSk7CisJCX0gZWxzZSBpZiAocHJpdi0+ZHVwbGV4ID09IFRMQU5fRFVQTEVYX0ZVTEwpIHsKKwkJCVRMYW5fRGlvV3JpdGU4KEJBU0UsIFRMQU5fQUNPTU1JVCwgMHgwMCk7CisJCQlwcml2LT50bGFuRnVsbER1cGxleCA9IFRSVUU7CisJCX0gZWxzZSB7CisJCQlUTGFuX0Rpb1dyaXRlOChCQVNFLCBUTEFOX0FDT01NSVQsIDB4MDgpOworCQl9CiAJfQogCi0JcHJpdi0+cGh5WzFdID0gVExBTl9QSFlfTk9ORTsKLQlmb3IgKCBwaHkgPSAwOyBwaHkgPD0gVExBTl9QSFlfTUFYX0FERFI7IHBoeSsrICkgewotCQlUTGFuX01paVJlYWRSZWcoIGRldiwgcGh5LCBNSUlfR0VOX0NUTCwgJmNvbnRyb2wgKTsKLQkJVExhbl9NaWlSZWFkUmVnKCBkZXYsIHBoeSwgTUlJX0dFTl9JRF9ISSwgJmhpICk7Ci0JCVRMYW5fTWlpUmVhZFJlZyggZGV2LCBwaHksIE1JSV9HRU5fSURfTE8sICZsbyApOwotCQlpZiAoICggY29udHJvbCAhPSAweEZGRkYgKSB8fCAoIGhpICE9IDB4RkZGRiApIHx8ICggbG8gIT0gMHhGRkZGICkgKSB7Ci0JCQlUTEFOX0RCRyggVExBTl9ERUJVR19HTlJMLCAiUEhZIGZvdW5kIGF0ICUwMnggJTA0eCAlMDR4ICUwNHhcbiIsIHBoeSwgY29udHJvbCwgaGksIGxvICk7Ci0JCQlpZiAoICggcHJpdi0+cGh5WzFdID09IFRMQU5fUEhZX05PTkUgKSAmJiAoIHBoeSAhPSBUTEFOX1BIWV9NQVhfQUREUiApICkgewotCQkJCXByaXYtPnBoeVsxXSA9IHBoeTsKLQkJCX0KLQkJfQorCWlmIChwcml2LT5waHlOdW0gPT0gMCkgeworCQlkYXRhIHw9IFRMQU5fTkVUX0NGR19QSFlfRU47CiAJfQorCVRMYW5fRGlvV3JpdGUxNihCQVNFLCBUTEFOX05FVF9DT05GSUcsICh1MTYpIGRhdGEpOwogCi0JaWYgKCBwcml2LT5waHlbMV0gIT0gVExBTl9QSFlfTk9ORSApIHsKLQkJcHJpdi0+cGh5TnVtID0gMTsKLQl9IGVsc2UgaWYgKCBwcml2LT5waHlbMF0gIT0gVExBTl9QSFlfTk9ORSApIHsKLQkJcHJpdi0+cGh5TnVtID0gMDsKKwlpZiAodGxhbl9wY2lfdGJsW2NoaXBfaWR4XS5mbGFncyAmIFRMQU5fQURBUFRFUl9VTk1BTkFHRURfUEhZKSB7CisJCVRMYW5fRmluaXNoUmVzZXQobmljKTsKIAl9IGVsc2UgewotCQlwcmludGsoICJUTEFOOiAgQ2Fubm90IGluaXRpYWxpemUgZGV2aWNlLCBubyBQSFkgd2FzIGZvdW5kIVxuIiApOworCQlUTGFuX1BoeVBvd2VyRG93bihuaWMpOwogCX0KIAotfSAvKiBUTGFuX1BoeURldGVjdCAqLworfQkvKiBUTGFuX1Jlc2V0QWRhcHRlciAqLwogCi12b2lkIFRMYW5fUGh5UG93ZXJEb3duKCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ICkKK3ZvaWQgVExhbl9GaW5pc2hSZXNldChzdHJ1Y3QgbmljICpuaWMpCiB7Ci0JVExhblByaXZhdGVJbmZvCSpwcml2ID0gZGV2LT5wcml2OwotCXUxNgkJdmFsdWU7CiAKLQlUTEFOX0RCRyggVExBTl9ERUJVR19HTlJMLCAiJXM6IFBvd2VyaW5nIGRvd24gUEhZKHMpLlxuIiwgZGV2LT5uYW1lICk7Ci0JdmFsdWUgPSBNSUlfR0NfUERPV04gfCBNSUlfR0NfTE9PUEJLIHwgTUlJX0dDX0lTT0xBVEU7Ci0JVExhbl9NaWlTeW5jKCBkZXYtPmJhc2VfYWRkciApOwotCVRMYW5fTWlpV3JpdGVSZWcoIGRldiwgcHJpdi0+cGh5W3ByaXYtPnBoeU51bV0sIE1JSV9HRU5fQ1RMLCB2YWx1ZSApOwotCWlmICggKCBwcml2LT5waHlOdW0gPT0gMCApICYmICggcHJpdi0+cGh5WzFdICE9IFRMQU5fUEhZX05PTkUgKSAmJiAoICEgKCBwcml2LT5hZGFwdGVyLT5mbGFncyAmIFRMQU5fQURBUFRFUl9VU0VfSU5URVJOXzEwICkgKSApIHsKLQkJVExhbl9NaWlTeW5jKCBkZXYtPmJhc2VfYWRkciApOwotCQlUTGFuX01paVdyaXRlUmVnKCBkZXYsIHByaXYtPnBoeVsxXSwgTUlJX0dFTl9DVEwsIHZhbHVlICk7CisJdTggZGF0YTsKKwl1MzIgcGh5OworCXU4IHNpbzsKKwl1MTYgc3RhdHVzOworCXUxNiBwYXJ0bmVyOworCXUxNiB0bHBoeV9jdGw7CisJdTE2IHRscGh5X3BhcjsKKwl1MTYgdGxwaHlfaWQxLCB0bHBoeV9pZDI7CisJaW50IGk7CisKKwlwaHkgPSBwcml2LT5waHlbcHJpdi0+cGh5TnVtXTsKKworCWRhdGEgPSBUTEFOX05FVF9DTURfTlJFU0VUIHwgVExBTl9ORVRfQ01EX05XUkFQOworCWlmIChwcml2LT50bGFuRnVsbER1cGxleCkgeworCQlkYXRhIHw9IFRMQU5fTkVUX0NNRF9EVVBMRVg7CiAJfQorCVRMYW5fRGlvV3JpdGU4KEJBU0UsIFRMQU5fTkVUX0NNRCwgZGF0YSk7CisJZGF0YSA9IFRMQU5fTkVUX01BU0tfTUFTSzQgfCBUTEFOX05FVF9NQVNLX01BU0s1OworCWlmIChwcml2LT5waHlOdW0gPT0gMCkgeworCQlkYXRhIHw9IFRMQU5fTkVUX01BU0tfTUFTSzc7CisJfQorCVRMYW5fRGlvV3JpdGU4KEJBU0UsIFRMQU5fTkVUX01BU0ssIGRhdGEpOworCVRMYW5fRGlvV3JpdGUxNihCQVNFLCBUTEFOX01BWF9SWCwgKCgxNTM2KSArIDcpICYgfjcpOworCVRMYW5fTWlpUmVhZFJlZyhuaWMsIHBoeSwgTUlJX0dFTl9JRF9ISSwgJnRscGh5X2lkMSk7CisJVExhbl9NaWlSZWFkUmVnKG5pYywgcGh5LCBNSUlfR0VOX0lEX0xPLCAmdGxwaHlfaWQyKTsKIAotCS8qIFdhaXQgZm9yIDUwIG1zIGFuZCBwb3dlcnVwCi0JICogVGhpcyBpcyBhYml0cmFyeS4gIEl0IGlzIGludGVuZGVkIHRvIG1ha2Ugc3VyZSB0aGUKLQkgKiB0cmFuY2VpdmVyIHNldHRsZXMuCi0JICovCi0JVExhbl9TZXRUaW1lciggZGV2LCAoSFovMjApLCBUTEFOX1RJTUVSX1BIWV9QVVAgKTsKKwlpZiAoKHRsYW5fcGNpX3RibFtjaGlwX2lkeF0uZmxhZ3MgJiBUTEFOX0FEQVBURVJfVU5NQU5BR0VEX1BIWSkKKwkgICAgfHwgKHByaXYtPmF1aSkpIHsKKwkJc3RhdHVzID0gTUlJX0dTX0xJTks7CisJCXByaW50ZigiVExBTjogICVzOiBMaW5rIGZvcmNlZC5cbiIsIHByaXYtPm5pY19uYW1lKTsKKwl9IGVsc2UgeworCQlUTGFuX01paVJlYWRSZWcobmljLCBwaHksIE1JSV9HRU5fU1RTLCAmc3RhdHVzKTsKKwkJdWRlbGF5KDEwMDApOworCQlUTGFuX01paVJlYWRSZWcobmljLCBwaHksIE1JSV9HRU5fU1RTLCAmc3RhdHVzKTsKKwkJaWYgKChzdGF0dXMgJiBNSUlfR1NfTElOSykgJiYJLyogV2Ugb25seSBzdXBwb3J0IGxpbmsgaW5mbyBvbiBOYXQuU2VtLiBQSFkncyAqLworCQkgICAgKHRscGh5X2lkMSA9PSBOQVRfU0VNX0lEMSkKKwkJICAgICYmICh0bHBoeV9pZDIgPT0gTkFUX1NFTV9JRDIpKSB7CisJCQlUTGFuX01paVJlYWRSZWcobmljLCBwaHksIE1JSV9BTl9MUEEsICZwYXJ0bmVyKTsKKwkJCVRMYW5fTWlpUmVhZFJlZyhuaWMsIHBoeSwgVExBTl9UTFBIWV9QQVIsCisJCQkJCSZ0bHBoeV9wYXIpOwogCi19IC8qIFRMYW5fUGh5UG93ZXJEb3duICovCisJCQlwcmludGYoIlRMQU46ICVzOiBMaW5rIGFjdGl2ZSB3aXRoICIsCisJCQkgICAgICAgcHJpdi0+bmljX25hbWUpOworCQkJaWYgKCEodGxwaHlfcGFyICYgVExBTl9QSFlfQU5fRU5fU1RBVCkpIHsKKwkJCQlwcmludGYoImZvcmNlZCAxMCVzTWJwcyAlcy1EdXBsZXhcbiIsCisJCQkJICAgICAgIHRscGh5X3BhciAmIFRMQU5fUEhZX1NQRUVEXzEwMCA/ICIiCisJCQkJICAgICAgIDogIjAiLAorCQkJCSAgICAgICB0bHBoeV9wYXIgJiBUTEFOX1BIWV9EVVBMRVhfRlVMTCA/CisJCQkJICAgICAgICJGdWxsIiA6ICJIYWxmIik7CisJCQl9IGVsc2UgeworCQkJCXByaW50ZgorCQkJCSAgICAoIkF1dG9OZWdvdGlhdGlvbiBlbmFibGVkLCBhdCAxMCVzTWJwcyAlcy1EdXBsZXhcbiIsCisJCQkJICAgICB0bHBoeV9wYXIgJiBUTEFOX1BIWV9TUEVFRF8xMDAgPyAiIiA6CisJCQkJICAgICAiMCIsCisJCQkJICAgICB0bHBoeV9wYXIgJiBUTEFOX1BIWV9EVVBMRVhfRlVMTCA/CisJCQkJICAgICAiRnVsbCIgOiAiSGFsZiIpOworCQkJCXByaW50ZigiVExBTjogUGFydG5lciBjYXBhYmlsaXR5OiAiKTsKKwkJCQlmb3IgKGkgPSA1OyBpIDw9IDEwOyBpKyspCisJCQkJCWlmIChwYXJ0bmVyICYgKDEgPDwgaSkpCisJCQkJCQlwcmludGYoIiVzIiwgbWVkaWFbaSAtIDVdKTsKKwkJCQlwcmludGYoIlxuIik7CisJCQl9CiAKLXZvaWQgVExhbl9QaHlQb3dlclVwKCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ICkKLXsKLQlUTGFuUHJpdmF0ZUluZm8JKnByaXYgPSBkZXYtPnByaXY7Ci0JdTE2CQl2YWx1ZTsKKwkJCVRMYW5fRGlvV3JpdGU4KEJBU0UsIFRMQU5fTEVEX1JFRywgVExBTl9MRURfTElOSyk7CisjaWZkZWYgTU9OSVRPUgorCQkJLyogV2UgaGF2ZSBsaW5rIGJlYXQuLmZvciBub3cgYW55d2F5ICovCisJCQlwcml2LT5saW5rID0gMTsKKwkJCS8qRW5hYmxpbmcgbGluayBiZWF0IG1vbml0b3JpbmcgKi8KKwkJCS8qIFRMYW5fU2V0VGltZXIoIG5pYywgKDEwKkhaKSwgVExBTl9USU1FUl9MSU5LX0JFQVQgKTsgKi8KKwkJCW1kZWxheSgxMDAwMCk7CisJCQlUTGFuX1BoeU1vbml0b3IobmljKTsKKyNlbmRpZgorCQl9IGVsc2UgaWYgKHN0YXR1cyAmIE1JSV9HU19MSU5LKSB7CisJCQlwcmludGYoIlRMQU46ICVzOiBMaW5rIGFjdGl2ZVxuIiwgcHJpdi0+bmljX25hbWUpOworCQkJVExhbl9EaW9Xcml0ZTgoQkFTRSwgVExBTl9MRURfUkVHLCBUTEFOX0xFRF9MSU5LKTsKKwkJfQorCX0KIAotCVRMQU5fREJHKCBUTEFOX0RFQlVHX0dOUkwsICIlczogUG93ZXJpbmcgdXAgUEhZLlxuIiwgZGV2LT5uYW1lICk7Ci0JVExhbl9NaWlTeW5jKCBkZXYtPmJhc2VfYWRkciApOwotCXZhbHVlID0gTUlJX0dDX0xPT1BCSzsKLQlUTGFuX01paVdyaXRlUmVnKCBkZXYsIHByaXYtPnBoeVtwcml2LT5waHlOdW1dLCBNSUlfR0VOX0NUTCwgdmFsdWUgKTsKLQlUTGFuX01paVN5bmMoZGV2LT5iYXNlX2FkZHIpOwotCS8qIFdhaXQgZm9yIDUwMCBtcyBhbmQgcmVzZXQgdGhlCi0JICogdHJhbmNlaXZlci4gIFRoZSBUTEFOIGRvY3Mgc2F5IGJvdGggNTAgbXMgYW5kCi0JICogNTAwIG1zLCBzbyBkbyB0aGUgbG9uZ2VyLCBqdXN0IGluIGNhc2UuCi0JICovCi0JVExhbl9TZXRUaW1lciggZGV2LCAoSFovMjApLCBUTEFOX1RJTUVSX1BIWV9SRVNFVCApOworCWlmIChwcml2LT5waHlOdW0gPT0gMCkgeworCQlUTGFuX01paVJlYWRSZWcobmljLCBwaHksIFRMQU5fVExQSFlfQ1RMLCAmdGxwaHlfY3RsKTsKKwkJdGxwaHlfY3RsIHw9IFRMQU5fVENfSU5URU47CisJCVRMYW5fTWlpV3JpdGVSZWcobmljLCBwaHksIFRMQU5fVExQSFlfQ1RMLCB0bHBoeV9jdGwpOworCQlzaW8gPSBUTGFuX0Rpb1JlYWQ4KEJBU0UsIFRMQU5fTkVUX1NJTyk7CisJCXNpbyB8PSBUTEFOX05FVF9TSU9fTUlOVEVOOworCQlUTGFuX0Rpb1dyaXRlOChCQVNFLCBUTEFOX05FVF9TSU8sIHNpbyk7CisJfQogCi19IC8qIFRMYW5fUGh5UG93ZXJVcCAqLworCWlmIChzdGF0dXMgJiBNSUlfR1NfTElOSykgeworCQlUTGFuX1NldE1hYyhuaWMsIDAsIG5pYy0+bm9kZV9hZGRyKTsKKwkJcHJpdi0+cGh5T25saW5lID0gMTsKKwkJb3V0YigoVExBTl9IQ19JTlRfT04gPj4gOCksIEJBU0UgKyBUTEFOX0hPU1RfQ01EICsgMSk7CisvKgkJaWYgKCBkZWJ1ZyA+PSAxICYmIGRlYnVnICE9IFRMQU5fREVCVUdfUFJPQkUgKSB7CisJCQlvdXRiKCAoIFRMQU5fSENfUkVRX0lOVCA+PiA4ICksIEJBU0UgKyBUTEFOX0hPU1RfQ01EICsgMSApOworCQl9CiAKLXZvaWQgVExhbl9QaHlSZXNldCggc3RydWN0IG5ldF9kZXZpY2UgKmRldiApCi17Ci0JVExhblByaXZhdGVJbmZvCSpwcml2ID0gZGV2LT5wcml2OwotCXUxNgkJcGh5OwotCXUxNgkJdmFsdWU7CisJCSovCisJCW91dGwodmlydF90b19idXMoJnJ4X3JpbmcpLCBCQVNFICsgVExBTl9DSF9QQVJNKTsKKwkJb3V0bChUTEFOX0hDX0dPIHwgVExBTl9IQ19SVCwgQkFTRSArIFRMQU5fSE9TVF9DTUQpOworCX0gZWxzZSB7CisJCXByaW50ZgorCQkgICAgKCJUTEFOOiAlczogTGluayBpbmFjdGl2ZSwgd2lsbCByZXRyeSBpbiAxMCBzZWNzLi4uXG4iLAorCQkgICAgIHByaXYtPm5pY19uYW1lKTsKKwkJLyogVExhbl9TZXRUaW1lciggbmljLCAoMTAqSFopLCBUTEFOX1RJTUVSX0ZJTklTSF9SRVNFVCApOyAqLworCQltZGVsYXkoMTAwMDApOworCQlUTGFuX0ZpbmlzaFJlc2V0KG5pYyk7CisJCXJldHVybjsKIAotCXBoeSA9IHByaXYtPnBoeVtwcml2LT5waHlOdW1dOworCX0KIAotCVRMQU5fREJHKCBUTEFOX0RFQlVHX0dOUkwsICIlczogUmVzZXRpbmcgUEhZLlxuIiwgZGV2LT5uYW1lICk7Ci0JVExhbl9NaWlTeW5jKCBkZXYtPmJhc2VfYWRkciApOwotCXZhbHVlID0gTUlJX0dDX0xPT1BCSyB8IE1JSV9HQ19SRVNFVDsKLQlUTGFuX01paVdyaXRlUmVnKCBkZXYsIHBoeSwgTUlJX0dFTl9DVEwsIHZhbHVlICk7Ci0JVExhbl9NaWlSZWFkUmVnKCBkZXYsIHBoeSwgTUlJX0dFTl9DVEwsICZ2YWx1ZSApOwotCXdoaWxlICggdmFsdWUgJiBNSUlfR0NfUkVTRVQgKSB7Ci0JCVRMYW5fTWlpUmVhZFJlZyggZGV2LCBwaHksIE1JSV9HRU5fQ1RMLCAmdmFsdWUgKTsKLQl9Ci0KLQkvKiBXYWl0IGZvciA1MDAgbXMgYW5kIGluaXRpYWxpemUuCi0JICogSSBkb24ndCByZW1lbWJlciB3aHkgSSB3YWl0IHRoaXMgbG9uZy4KLQkgKiBJJ3ZlIGNoYW5nZWQgdGhpcyB0byA1MG1zLCBhcyBpdCBzZWVtcyBsb25nIGVub3VnaC4KLQkgKi8KLQlUTGFuX1NldFRpbWVyKCBkZXYsIChIWi8yMCksIFRMQU5fVElNRVJfUEhZX1NUQVJUX0xJTksgKTsKLQotfSAvKiBUTGFuX1BoeVJlc2V0ICovCi0KLXZvaWQgVExhbl9QaHlTdGFydExpbmsoIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgKQotewotCVRMYW5Qcml2YXRlSW5mbwkqcHJpdiA9IGRldi0+cHJpdjsKLQl1MTYJCWFiaWxpdHk7Ci0JdTE2CQljb250cm9sOwotCXUxNgkJZGF0YTsKLQl1MTYJCXBoeTsKLQl1MTYJCXN0YXR1czsKLQl1MTYJCXRjdGw7Ci0KLQlwaHkgPSBwcml2LT5waHlbcHJpdi0+cGh5TnVtXTsKLQlUTEFOX0RCRyggVExBTl9ERUJVR19HTlJMLCAiJXM6IFRyeWluZyB0byBhY3RpdmF0ZSBsaW5rLlxuIiwgZGV2LT5uYW1lICk7Ci0JVExhbl9NaWlSZWFkUmVnKCBkZXYsIHBoeSwgTUlJX0dFTl9TVFMsICZzdGF0dXMgKTsKLQlUTGFuX01paVJlYWRSZWcoIGRldiwgcGh5LCBNSUlfR0VOX1NUUywgJmFiaWxpdHkgKTsKLQotCWlmICggKCBzdGF0dXMgJiBNSUlfR1NfQVVUT05FRyApICYmIAotCSAgICAgKCAhIHByaXYtPmF1aSApICkgewotCQlhYmlsaXR5ID0gc3RhdHVzID4+IDExOwotCQlpZiAoIHByaXYtPnNwZWVkICA9PSBUTEFOX1NQRUVEXzEwICYmIAotCQkgICAgIHByaXYtPmR1cGxleCA9PSBUTEFOX0RVUExFWF9IQUxGKSB7Ci0JCQlUTGFuX01paVdyaXRlUmVnKCBkZXYsIHBoeSwgTUlJX0dFTl9DVEwsIDB4MDAwMCk7Ci0JCX0gZWxzZSBpZiAoIHByaXYtPnNwZWVkID09IFRMQU5fU1BFRURfMTAgJiYKLQkJCSAgICBwcml2LT5kdXBsZXggPT0gVExBTl9EVVBMRVhfRlVMTCkgewotCQkJcHJpdi0+dGxhbkZ1bGxEdXBsZXggPSBUUlVFOwotCQkJVExhbl9NaWlXcml0ZVJlZyggZGV2LCBwaHksIE1JSV9HRU5fQ1RMLCAweDAxMDApOwotCQl9IGVsc2UgaWYgKCBwcml2LT5zcGVlZCA9PSBUTEFOX1NQRUVEXzEwMCAmJgotCQkJICAgIHByaXYtPmR1cGxleCA9PSBUTEFOX0RVUExFWF9IQUxGKSB7Ci0JCQlUTGFuX01paVdyaXRlUmVnKCBkZXYsIHBoeSwgTUlJX0dFTl9DVEwsIDB4MjAwMCk7Ci0JCX0gZWxzZSBpZiAoIHByaXYtPnNwZWVkID09IFRMQU5fU1BFRURfMTAwICYmCi0JCQkgICAgcHJpdi0+ZHVwbGV4ID09IFRMQU5fRFVQTEVYX0ZVTEwpIHsKLQkJCXByaXYtPnRsYW5GdWxsRHVwbGV4ID0gVFJVRTsKLQkJCVRMYW5fTWlpV3JpdGVSZWcoIGRldiwgcGh5LCBNSUlfR0VOX0NUTCwgMHgyMTAwKTsKLQkJfSBlbHNlIHsKLQkKLQkJCS8qIFNldCBBdXRvLU5lZyBhZHZlcnRpc2VtZW50ICovCi0JCQlUTGFuX01paVdyaXRlUmVnKCBkZXYsIHBoeSwgTUlJX0FOX0FEViwgKGFiaWxpdHkgPDwgNSkgfCAxKTsKLQkJCS8qIEVuYWJsZWUgQXV0by1OZWcgKi8KLQkJCVRMYW5fTWlpV3JpdGVSZWcoIGRldiwgcGh5LCBNSUlfR0VOX0NUTCwgMHgxMDAwICk7Ci0JCQkvKiBSZXN0YXJ0IEF1dG8tTmVnICovCi0JCQlUTGFuX01paVdyaXRlUmVnKCBkZXYsIHBoeSwgTUlJX0dFTl9DVEwsIDB4MTIwMCApOwotCQkJLyogV2FpdCBmb3IgNCBzZWMgZm9yIGF1dG9uZWdvdGlhdGlvbgotCQkgCSogdG8gY29tcGxldGUuICBUaGUgbWF4IHNwZWMgdGltZSBpcyBsZXNzIHRoYW4gdGhpcwotCQkgCSogYnV0IHRoZSBjYXJkIG5lZWQgYWRkaXRpb25hbCB0aW1lIHRvIHN0YXJ0IEFOLgotCQkgCSogLjUgc2VjIHNob3VsZCBiZSBwbGVudHkgZXh0cmEuCi0JCSAJKi8KLQkJCXByaW50ayggIlRMQU46ICVzOiBTdGFydGluZyBhdXRvbmVnb3RpYXRpb24uXG4iLCBkZXYtPm5hbWUgKTsKLQkJCVRMYW5fU2V0VGltZXIoIGRldiwgKDIqSFopLCBUTEFOX1RJTUVSX1BIWV9GSU5JU0hfQU4gKTsKLQkJCXJldHVybjsKLQkJfQotCQkKLQl9CQotCQotCWlmICggKCBwcml2LT5hdWkgKSAmJiAoIHByaXYtPnBoeU51bSAhPSAwICkgKSB7Ci0JCXByaXYtPnBoeU51bSA9IDA7Ci0JCWRhdGEgPSBUTEFOX05FVF9DRkdfMUZSQUcgfCBUTEFOX05FVF9DRkdfMUNIQU4gfCBUTEFOX05FVF9DRkdfUEhZX0VOOwotCQlUTGFuX0Rpb1dyaXRlMTYoIGRldi0+YmFzZV9hZGRyLCBUTEFOX05FVF9DT05GSUcsIGRhdGEgKTsKLQkJVExhbl9TZXRUaW1lciggZGV2LCAoNDAqSFovMTAwMCksIFRMQU5fVElNRVJfUEhZX1BET1dOICk7Ci0JCXJldHVybjsKLQl9ICBlbHNlIGlmICggcHJpdi0+cGh5TnVtID09IDAgKSB7Ci0gICAgICAgIAlUTGFuX01paVJlYWRSZWcoIGRldiwgcGh5LCBUTEFOX1RMUEhZX0NUTCwgJnRjdGwgKTsKLQkJaWYgKCBwcml2LT5hdWkgKSB7Ci0gICAgICAgICAgICAgICAgCXRjdGwgfD0gVExBTl9UQ19BVUlTRUw7Ci0JCX0gZWxzZSB7IAotICAgICAgICAgICAgICAgIAl0Y3RsICY9IH5UTEFOX1RDX0FVSVNFTDsKLQkJCWNvbnRyb2wgPSAwOwotCQkJaWYgKCBwcml2LT5kdXBsZXggPT0gVExBTl9EVVBMRVhfRlVMTCApIHsKLQkJCQljb250cm9sIHw9IE1JSV9HQ19EVVBMRVg7Ci0JCQkJcHJpdi0+dGxhbkZ1bGxEdXBsZXggPSBUUlVFOwotCQkJfQotCQkJaWYgKCBwcml2LT5zcGVlZCA9PSBUTEFOX1NQRUVEXzEwMCApIHsKLQkJCQljb250cm9sIHw9IE1JSV9HQ19TUEVFRFNFTDsKLQkJCX0KLSAgICAgICAJCQlUTGFuX01paVdyaXRlUmVnKCBkZXYsIHBoeSwgTUlJX0dFTl9DVEwsIGNvbnRyb2wgKTsKLQkJfQotICAgICAgICAJVExhbl9NaWlXcml0ZVJlZyggZGV2LCBwaHksIFRMQU5fVExQSFlfQ1RMLCB0Y3RsICk7Ci0JfQotCi0JLyogV2FpdCBmb3IgMiBzZWMgdG8gZ2l2ZSB0aGUgdHJhbmNlaXZlciB0aW1lCi0JICogdG8gZXN0YWJsaXNoIGxpbmsuCi0JICovCi0JVExhbl9TZXRUaW1lciggZGV2LCAoNCpIWiksIFRMQU5fVElNRVJfRklOSVNIX1JFU0VUICk7Ci0KLX0gLyogVExhbl9QaHlTdGFydExpbmsgKi8KLQotdm9pZCBUTGFuX1BoeUZpbmlzaEF1dG9OZWcoIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgKQotewotCVRMYW5Qcml2YXRlSW5mbwkqcHJpdiA9IGRldi0+cHJpdjsKLQl1MTYJCWFuX2FkdjsKLQl1MTYJCWFuX2xwYTsKLQl1MTYJCWRhdGE7Ci0JdTE2CQltb2RlOwotCXUxNgkJcGh5OwotCXUxNgkJc3RhdHVzOwotCQotCXBoeSA9IHByaXYtPnBoeVtwcml2LT5waHlOdW1dOwotCi0JVExhbl9NaWlSZWFkUmVnKCBkZXYsIHBoeSwgTUlJX0dFTl9TVFMsICZzdGF0dXMgKTsKLQl1ZGVsYXkoIDEwMDAgKTsKLQlUTGFuX01paVJlYWRSZWcoIGRldiwgcGh5LCBNSUlfR0VOX1NUUywgJnN0YXR1cyApOwotCi0JaWYgKCAhICggc3RhdHVzICYgTUlJX0dTX0FVVE9DTVBMVCApICkgewotCQkvKiBXYWl0IGZvciA4IHNlYyB0byBnaXZlIHRoZSBwcm9jZXNzCi0JCSAqIG1vcmUgdGltZS4gIFBlcmhhcHMgd2Ugc2hvdWxkIGZhaWwgYWZ0ZXIgYSB3aGlsZS4KLQkJICovCi0JCSBpZiAoIXByaXYtPm5lZ19iZV92ZXJib3NlKyspIHsKLQkJCSBwcmludGsoS0VSTl9JTkZPICJUTEFOOiAgR2l2aW5nIGF1dG9uZWdvdGlhdGlvbiBtb3JlIHRpbWUuXG4iKTsKLQkJIAkgcHJpbnRrKEtFUk5fSU5GTyAiVExBTjogIFBsZWFzZSBjaGVjayB0aGF0IHlvdXIgYWRhcHRlciBoYXNcbiIpOwotCQkgCSBwcmludGsoS0VSTl9JTkZPICJUTEFOOiAgYmVlbiBwcm9wZXJseSBjb25uZWN0ZWQgdG8gYSBIVUIgb3IgU3dpdGNoLlxuIik7Ci0JCQkgcHJpbnRrKEtFUk5fSU5GTyAiVExBTjogIFRyeWluZyB0byBlc3RhYmxpc2ggbGluayBpbiB0aGUgYmFja2dyb3VuZC4uLlxuIik7Ci0JCSB9Ci0JCVRMYW5fU2V0VGltZXIoIGRldiwgKDgqSFopLCBUTEFOX1RJTUVSX1BIWV9GSU5JU0hfQU4gKTsKLQkJcmV0dXJuOwotCX0KLQotCXByaW50ayggIlRMQU46ICVzOiBBdXRvbmVnb3RpYXRpb24gY29tcGxldGUuXG4iLCBkZXYtPm5hbWUgKTsKLQlUTGFuX01paVJlYWRSZWcoIGRldiwgcGh5LCBNSUlfQU5fQURWLCAmYW5fYWR2ICk7Ci0JVExhbl9NaWlSZWFkUmVnKCBkZXYsIHBoeSwgTUlJX0FOX0xQQSwgJmFuX2xwYSApOwotCW1vZGUgPSBhbl9hZHYgJiBhbl9scGEgJiAweDAzRTA7Ci0JaWYgKCBtb2RlICYgMHgwMTAwICkgewotCQlwcml2LT50bGFuRnVsbER1cGxleCA9IFRSVUU7Ci0JfSBlbHNlIGlmICggISAoIG1vZGUgJiAweDAwODAgKSAmJiAoIG1vZGUgJiAweDAwNDAgKSApIHsKLQkJcHJpdi0+dGxhbkZ1bGxEdXBsZXggPSBUUlVFOwotCX0KLQotCWlmICggKCAhICggbW9kZSAmIDB4MDE4MCApICkgJiYgKCBwcml2LT5hZGFwdGVyLT5mbGFncyAmIFRMQU5fQURBUFRFUl9VU0VfSU5URVJOXzEwICkgJiYgKCBwcml2LT5waHlOdW0gIT0gMCApICkgewotCQlwcml2LT5waHlOdW0gPSAwOwotCQlkYXRhID0gVExBTl9ORVRfQ0ZHXzFGUkFHIHwgVExBTl9ORVRfQ0ZHXzFDSEFOIHwgVExBTl9ORVRfQ0ZHX1BIWV9FTjsKLQkJVExhbl9EaW9Xcml0ZTE2KCBkZXYtPmJhc2VfYWRkciwgVExBTl9ORVRfQ09ORklHLCBkYXRhICk7Ci0JCVRMYW5fU2V0VGltZXIoIGRldiwgKDQwMCpIWi8xMDAwKSwgVExBTl9USU1FUl9QSFlfUERPV04gKTsKLQkJcmV0dXJuOwotCX0KLQotCWlmICggcHJpdi0+cGh5TnVtID09IDAgKSB7Ci0JCWlmICggKCBwcml2LT5kdXBsZXggPT0gVExBTl9EVVBMRVhfRlVMTCApIHx8ICggYW5fYWR2ICYgYW5fbHBhICYgMHgwMDQwICkgKSB7Ci0JCQlUTGFuX01paVdyaXRlUmVnKCBkZXYsIHBoeSwgTUlJX0dFTl9DVEwsIE1JSV9HQ19BVVRPRU5CIHwgTUlJX0dDX0RVUExFWCApOwotCQkJcHJpbnRrKCAiVExBTjogIFN0YXJ0aW5nIGludGVybmFsIFBIWSB3aXRoIEZVTEwtRFVQTEVYXG4iICk7Ci0JCX0gZWxzZSB7Ci0JCQlUTGFuX01paVdyaXRlUmVnKCBkZXYsIHBoeSwgTUlJX0dFTl9DVEwsIE1JSV9HQ19BVVRPRU5CICk7Ci0JCQlwcmludGsoICJUTEFOOiAgU3RhcnRpbmcgaW50ZXJuYWwgUEhZIHdpdGggSEFMRi1EVVBMRVhcbiIgKTsKLQkJfQotCX0KLQotCS8qIFdhaXQgZm9yIDEwMCBtcy4gIE5vIHJlYXNvbiBpbiBwYXJ0aXRpY3VsYXIuCi0JICovCi0JVExhbl9TZXRUaW1lciggZGV2LCAoSFovMTApLCBUTEFOX1RJTUVSX0ZJTklTSF9SRVNFVCApOwotCQkKLX0gLyogVExhbl9QaHlGaW5pc2hBdXRvTmVnICovCi0KLSNpZmRlZiBNT05JVE9SCi0KLSAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgICAgICAqCi0gICAgICAgICogICAgICBUTGFuX3BoeU1vbml0b3IKLSAgICAgICAgKgotICAgICAgICAqICAgICAgUmV0dXJuczogCi0gICAgICAgICogICAgICAgICAgICAgIE5vbmUKLSAgICAgICAgKgotICAgICAgICAqICAgICAgUGFyYW1zOgotICAgICAgICAqICAgICAgICAgICAgICBkZXYgICAgICAgICAgICAgVGhlIGRldmljZSBzdHJ1Y3R1cmUgb2YgdGhpcyBkZXZpY2UuCi0gICAgICAgICoKLSAgICAgICAgKiAgICAgIAotICAgICAgICAqICAgICAgVGhpcyBmdW5jdGlvbiBtb25pdG9ycyBQSFkgY29uZGl0aW9uIGJ5IHJlYWRpbmcgdGhlIHN0YXR1cwotICAgICAgICAqICAgICAgcmVnaXN0ZXIgdmlhIHRoZSBNSUkgYnVzLiBUaGlzIGNhbiBiZSB1c2VkIHRvIGdpdmUgaW5mbwotICAgICAgICAqICAgICAgYWJvdXQgbGluayBjaGFuZ2VzICh1cC9kb3duKSwgYW5kIHBvc3NpYmxlIHN3aXRjaCB0byBhbHRlcm5hdGUKLSAgICAgICAgKiAgICAgIG1lZGlhLgotICAgICAgICAqCi0gICAgICAgICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi12b2lkIFRMYW5fUGh5TW9uaXRvciggc3RydWN0IG5ldF9kZXZpY2UgKmRldiApCi17Ci0JVExhblByaXZhdGVJbmZvICpwcml2ID0gZGV2LT5wcml2OwotCXUxNiAgICAgcGh5OwotCXUxNiAgICAgcGh5X3N0YXR1czsKLQotCXBoeSA9IHByaXYtPnBoeVtwcml2LT5waHlOdW1dOwotCi0gICAgICAgIC8qIEdldCBQSFkgc3RhdHVzIHJlZ2lzdGVyICovCi0gICAgICAgIFRMYW5fTWlpUmVhZFJlZyggZGV2LCBwaHksIE1JSV9HRU5fU1RTLCAmcGh5X3N0YXR1cyApOwotCi0gICAgICAgIC8qIENoZWNrIGlmIGxpbmsgaGFzIGJlZW4gbG9zdCAqLwotICAgICAgICBpZiAoIShwaHlfc3RhdHVzICYgTUlJX0dTX0xJTkspKSB7IAotIAkgICAgICAgaWYgKHByaXYtPmxpbmspIHsKLQkJICAgICAgcHJpdi0+bGluayA9IDA7Ci0JICAgICAgICAgICAgICBwcmludGsoS0VSTl9ERUJVRyAiVExBTjogJXMgaGFzIGxvc3QgbGlua1xuIiwgZGV2LT5uYW1lKTsKLQkgICAgICAgICAgICAgIGRldi0+ZmxhZ3MgJj0gfklGRl9SVU5OSU5HOwotCQkgICAgICBUTGFuX1NldFRpbWVyKCBkZXYsICgyKkhaKSwgVExBTl9USU1FUl9MSU5LX0JFQVQgKTsKLQkJICAgICAgcmV0dXJuOwotCQl9Ci0JfQotCi0gICAgICAgIC8qIExpbmsgcmVzdGFibGlzaGVkPyAqLwotICAgICAgICBpZiAoKHBoeV9zdGF0dXMgJiBNSUlfR1NfTElOSykgJiYgIXByaXYtPmxpbmspIHsKLSAJCXByaXYtPmxpbmsgPSAxOwotICAgICAgICAJcHJpbnRrKEtFUk5fREVCVUcgIlRMQU46ICVzIGhhcyByZWVzdGFibGlzaGVkIGxpbmtcbiIsIGRldi0+bmFtZSk7Ci0gICAgICAgIAlkZXYtPmZsYWdzIHw9IElGRl9SVU5OSU5HOwotICAgICAgICB9Ci0KLQkvKiBTZXR1cCBhIG5ldyBtb25pdG9yICovCi0JVExhbl9TZXRUaW1lciggZGV2LCAoMipIWiksIFRMQU5fVElNRVJfTElOS19CRUFUICk7Ci19CQotCi0jZW5kaWYgLyogTU9OSVRPUiAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0JVGh1bmRlckxBTiBEcml2ZXIgTUlJIFJvdXRpbmVzCi0KLQlUaGVzZSByb3V0aW5lcyBhcmUgYmFzZWQgb24gdGhlIGluZm9ybWF0aW9uIGluIENoYXAuIDIgb2YgdGhlCi0JIlRodW5kZXJMQU4gUHJvZ3JhbW1lcidzIEd1aWRlIiwgcHAuIDE1LTI0LgotCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0JLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCSAqCVRMYW5fTWlpUmVhZFJlZwotCSAqCi0JICoJUmV0dXJuczoKLQkgKgkJMAlpZiBhY2sgcmVjZWl2ZWQgb2sKLQkgKgkJMQlvdGhlcndpc2UuCi0JICoKLQkgKglQYXJtczoKLQkgKgkJZGV2CQlUaGUgZGV2aWNlIHN0cnVjdHVyZSBjb250YWluaW5nCi0JICoJCQkJVGhlIGlvIGFkZHJlc3MgYW5kIGludGVycnVwdCBjb3VudAotCSAqCQkJCWZvciB0aGlzIGRldmljZS4KLQkgKgkJcGh5CQlUaGUgYWRkcmVzcyBvZiB0aGUgUEhZIHRvIGJlIHF1ZXJpZWQuCi0JICoJCXJlZwkJVGhlIHJlZ2lzdGVyIHdob3NlIGNvbnRlbnRzIGFyZSB0byBiZQotCSAqCQkJCXJldHJlaXZlZC4KLQkgKgkJdmFsCQlBIHBvaW50ZXIgdG8gYSB2YXJpYWJsZSB0byBzdG9yZSB0aGUKLQkgKgkJCQlyZXRyaWV2ZWQgdmFsdWUuCi0JICoKLQkgKglUaGlzIGZ1bmN0aW9uIHVzZXMgdGhlIFRMQU4ncyBNSUkgYnVzIHRvIHJldHJlaXZlIHRoZSBjb250ZW50cwotCSAqCW9mIGEgZ2l2ZW4gcmVnaXN0ZXIgb24gYSBQSFkuICBJdCBzZW5kcyB0aGUgYXBwcm9wcmlhdGUgaW5mbwotCSAqCWFuZCB0aGVuIHJlYWRzIHRoZSAxNi1iaXQgcmVnaXN0ZXIgdmFsdWUgZnJvbSB0aGUgTUlJIGJ1cyB2aWEKLQkgKgl0aGUgVExBTiBTSU8gcmVnaXN0ZXIuCi0JICoKLQkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLWludCBUTGFuX01paVJlYWRSZWcoIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUxNiBwaHksIHUxNiByZWcsIHUxNiAqdmFsICkKLXsKLQl1OAluYWNrOwotCXUxNglzaW8sIHRtcDsKLSAJdTMyCWk7Ci0JaW50CWVycjsKLQlpbnQJbWludGVuOwotCVRMYW5Qcml2YXRlSW5mbyAqcHJpdiA9IGRldi0+cHJpdjsKLQl1bnNpZ25lZCBsb25nIGZsYWdzID0gMDsKLQotCWVyciA9IEZBTFNFOwotCW91dHcoVExBTl9ORVRfU0lPLCBkZXYtPmJhc2VfYWRkciArIFRMQU5fRElPX0FEUik7Ci0Jc2lvID0gZGV2LT5iYXNlX2FkZHIgKyBUTEFOX0RJT19EQVRBICsgVExBTl9ORVRfU0lPOwotCQotCWlmICghaW5faXJxKCkpCi0JCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5sb2NrLCBmbGFncyk7Ci0KLQlUTGFuX01paVN5bmMoZGV2LT5iYXNlX2FkZHIpOwotCi0JbWludGVuID0gVExhbl9HZXRCaXQoIFRMQU5fTkVUX1NJT19NSU5URU4sIHNpbyApOwotCWlmICggbWludGVuICkKLQkJVExhbl9DbGVhckJpdChUTEFOX05FVF9TSU9fTUlOVEVOLCBzaW8pOwotCi0JVExhbl9NaWlTZW5kRGF0YSggZGV2LT5iYXNlX2FkZHIsIDB4MSwgMiApOwkvKiBTdGFydCAoIDAxYiApICovCi0JVExhbl9NaWlTZW5kRGF0YSggZGV2LT5iYXNlX2FkZHIsIDB4MiwgMiApOwkvKiBSZWFkICAoIDEwYiApICovCi0JVExhbl9NaWlTZW5kRGF0YSggZGV2LT5iYXNlX2FkZHIsIHBoeSwgNSApOwkvKiBEZXZpY2UgIyAgICAgICovCi0JVExhbl9NaWlTZW5kRGF0YSggZGV2LT5iYXNlX2FkZHIsIHJlZywgNSApOwkvKiBSZWdpc3RlciAjICAgICovCi0KLQlUTGFuX0NsZWFyQml0KFRMQU5fTkVUX1NJT19NVFhFTiwgc2lvKTsJCS8qIENoYW5nZSBkaXJlY3Rpb24gKi8KLQotCVRMYW5fQ2xlYXJCaXQoVExBTl9ORVRfU0lPX01DTEssIHNpbyk7CQkvKiBDbG9jayBJZGxlIGJpdCAqLwotCVRMYW5fU2V0Qml0KFRMQU5fTkVUX1NJT19NQ0xLLCBzaW8pOwotCVRMYW5fQ2xlYXJCaXQoVExBTl9ORVRfU0lPX01DTEssIHNpbyk7CQkvKiBXYWl0IDMwMG5zICovCi0KLQluYWNrID0gVExhbl9HZXRCaXQoVExBTl9ORVRfU0lPX01EQVRBLCBzaW8pOwkvKiBDaGVjayBmb3IgQUNLICovCi0JVExhbl9TZXRCaXQoVExBTl9ORVRfU0lPX01DTEssIHNpbyk7CQkvKiBGaW5pc2ggQUNLICovCi0JaWYgKG5hY2spIHsJCQkJCS8qIE5vIEFDSywgc28gZmFrZSBpdCAqLwotCQlmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykgewotCQkJVExhbl9DbGVhckJpdChUTEFOX05FVF9TSU9fTUNMSywgc2lvKTsKLQkJCVRMYW5fU2V0Qml0KFRMQU5fTkVUX1NJT19NQ0xLLCBzaW8pOwotCQl9Ci0JCXRtcCA9IDB4ZmZmZjsKLQkJZXJyID0gVFJVRTsKLQl9IGVsc2UgewkJCQkJLyogQUNLLCBzbyByZWFkIGRhdGEgKi8KLQkJZm9yICh0bXAgPSAwLCBpID0gMHg4MDAwOyBpOyBpID4+PSAxKSB7Ci0JCQlUTGFuX0NsZWFyQml0KFRMQU5fTkVUX1NJT19NQ0xLLCBzaW8pOwotCQkJaWYgKFRMYW5fR2V0Qml0KFRMQU5fTkVUX1NJT19NREFUQSwgc2lvKSkKLQkJCQl0bXAgfD0gaTsKLQkJCVRMYW5fU2V0Qml0KFRMQU5fTkVUX1NJT19NQ0xLLCBzaW8pOwotCQl9Ci0JfQotCi0JVExhbl9DbGVhckJpdChUTEFOX05FVF9TSU9fTUNMSywgc2lvKTsJCS8qIElkbGUgY3ljbGUgKi8KLQlUTGFuX1NldEJpdChUTEFOX05FVF9TSU9fTUNMSywgc2lvKTsKLQotCWlmICggbWludGVuICkKLQkJVExhbl9TZXRCaXQoVExBTl9ORVRfU0lPX01JTlRFTiwgc2lvKTsKLQotCSp2YWwgPSB0bXA7Ci0JCi0JaWYgKCFpbl9pcnEoKSkKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwotCi0JcmV0dXJuIGVycjsKLQotfSAvKiBUTGFuX01paVJlYWRSZWcgKi8KLQotCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkgKglUTGFuX01paVNlbmREYXRhCi0JICoKLQkgKglSZXR1cm5zOgotCSAqCQlOb3RoaW5nCi0JICoJUGFybXM6Ci0JICoJCWJhc2VfcG9ydAlUaGUgYmFzZSBJTyBwb3J0IG9mIHRoZSBhZGFwdGVyCWluCi0JICoJCQkJcXVlc3Rpb24uCi0JICoJCWRldgkJVGhlIGFkZHJlc3Mgb2YgdGhlIFBIWSB0byBiZSBxdWVyaWVkLgotCSAqCQlkYXRhCQlUaGUgdmFsdWUgdG8gYmUgcGxhY2VkIG9uIHRoZSBNSUkgYnVzLgotCSAqCQludW1fYml0cwlUaGUgbnVtYmVyIG9mIGJpdHMgaW4gZGF0YSB0aGF0IGFyZSB0bwotCSAqCQkJCWJlIHBsYWNlZCBvbiB0aGUgTUlJIGJ1cy4KLQkgKgotCSAqCVRoaXMgZnVuY3Rpb24gc2VuZHMgb24gc2VxdWVuY2Ugb2YgYml0cyBvbiB0aGUgTUlJCi0JICoJY29uZmlndXJhdGlvbiBidXMuCi0JICoKLQkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXZvaWQgVExhbl9NaWlTZW5kRGF0YSggdTE2IGJhc2VfcG9ydCwgdTMyIGRhdGEsIHVuc2lnbmVkIG51bV9iaXRzICkKLXsKLQl1MTYgc2lvOwotCXUzMiBpOwotCi0JaWYgKCBudW1fYml0cyA9PSAwICkKLQkJcmV0dXJuOwotCi0Jb3V0dyggVExBTl9ORVRfU0lPLCBiYXNlX3BvcnQgKyBUTEFOX0RJT19BRFIgKTsKLQlzaW8gPSBiYXNlX3BvcnQgKyBUTEFOX0RJT19EQVRBICsgVExBTl9ORVRfU0lPOwotCVRMYW5fU2V0Qml0KCBUTEFOX05FVF9TSU9fTVRYRU4sIHNpbyApOwotCi0JZm9yICggaSA9ICggMHgxIDw8ICggbnVtX2JpdHMgLSAxICkgKTsgaTsgaSA+Pj0gMSApIHsKLQkJVExhbl9DbGVhckJpdCggVExBTl9ORVRfU0lPX01DTEssIHNpbyApOwotCQkodm9pZCkgVExhbl9HZXRCaXQoIFRMQU5fTkVUX1NJT19NQ0xLLCBzaW8gKTsKLQkJaWYgKCBkYXRhICYgaSApCi0JCQlUTGFuX1NldEJpdCggVExBTl9ORVRfU0lPX01EQVRBLCBzaW8gKTsKLQkJZWxzZQotCQkJVExhbl9DbGVhckJpdCggVExBTl9ORVRfU0lPX01EQVRBLCBzaW8gKTsKLQkJVExhbl9TZXRCaXQoIFRMQU5fTkVUX1NJT19NQ0xLLCBzaW8gKTsKLQkJKHZvaWQpIFRMYW5fR2V0Qml0KCBUTEFOX05FVF9TSU9fTUNMSywgc2lvICk7Ci0JfQotCi19IC8qIFRMYW5fTWlpU2VuZERhdGEgKi8KLQotCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkgKglUTGFuX01paVN5bmMKLQkgKgotCSAqCVJldHVybnM6Ci0JICoJCU5vdGhpbmcKLQkgKglQYXJtczoKLQkgKgkJYmFzZV9wb3J0CVRoZSBiYXNlIElPIHBvcnQgb2YgdGhlIGFkYXB0ZXIgaW4KLQkgKgkJCQlxdWVzdGlvbi4KLQkgKgotCSAqCVRoaXMgZnVuY3Rpb25zIHN5bmNzIGFsbCBQSFlzIGluIHRlcm1zIG9mIHRoZSBNSUkgY29uZmlndXJhdGlvbgotCSAqCWJ1cy4KLQkgKgotCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotdm9pZCBUTGFuX01paVN5bmMoIHUxNiBiYXNlX3BvcnQgKQotewotCWludCBpOwotCXUxNiBzaW87Ci0KLQlvdXR3KCBUTEFOX05FVF9TSU8sIGJhc2VfcG9ydCArIFRMQU5fRElPX0FEUiApOwotCXNpbyA9IGJhc2VfcG9ydCArIFRMQU5fRElPX0RBVEEgKyBUTEFOX05FVF9TSU87Ci0KLQlUTGFuX0NsZWFyQml0KCBUTEFOX05FVF9TSU9fTVRYRU4sIHNpbyApOwotCWZvciAoIGkgPSAwOyBpIDwgMzI7IGkrKyApIHsKLQkJVExhbl9DbGVhckJpdCggVExBTl9ORVRfU0lPX01DTEssIHNpbyApOwotCQlUTGFuX1NldEJpdCggVExBTl9ORVRfU0lPX01DTEssIHNpbyApOwotCX0KLQotfSAvKiBUTGFuX01paVN5bmMgKi8KLQotCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkgKglUTGFuX01paVdyaXRlUmVnCi0JICoKLQkgKglSZXR1cm5zOgotCSAqCQlOb3RoaW5nCi0JICoJUGFybXM6Ci0JICoJCWRldgkJVGhlIGRldmljZSBzdHJ1Y3R1cmUgZm9yIHRoZSBkZXZpY2UKLQkgKgkJCQl0byB3cml0ZSB0by4KLQkgKgkJcGh5CQlUaGUgYWRkcmVzcyBvZiB0aGUgUEhZIHRvIGJlIHdyaXR0ZW4gdG8uCi0JICoJCXJlZwkJVGhlIHJlZ2lzdGVyIHdob3NlIGNvbnRlbnRzIGFyZSB0byBiZQotCSAqCQkJCXdyaXR0ZW4uCi0JICoJCXZhbAkJVGhlIHZhbHVlIHRvIGJlIHdyaXR0ZW4gdG8gdGhlIHJlZ2lzdGVyLgotCSAqCi0JICoJVGhpcyBmdW5jdGlvbiB1c2VzIHRoZSBUTEFOJ3MgTUlJIGJ1cyB0byB3cml0ZSB0aGUgY29udGVudHMgb2YgYQotCSAqCWdpdmVuIHJlZ2lzdGVyIG9uIGEgUEhZLiAgSXQgc2VuZHMgdGhlIGFwcHJvcHJpYXRlIGluZm8gYW5kIHRoZW4KLQkgKgl3cml0ZXMgdGhlIDE2LWJpdCByZWdpc3RlciB2YWx1ZSBmcm9tIHRoZSBNSUkgY29uZmlndXJhdGlvbiBidXMKLQkgKgl2aWEgdGhlIFRMQU4gU0lPIHJlZ2lzdGVyLgotCSAqCi0JICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi12b2lkIFRMYW5fTWlpV3JpdGVSZWcoIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUxNiBwaHksIHUxNiByZWcsIHUxNiB2YWwgKQotewotCXUxNglzaW87Ci0JaW50CW1pbnRlbjsKLQl1bnNpZ25lZCBsb25nIGZsYWdzID0gMDsKLQlUTGFuUHJpdmF0ZUluZm8gKnByaXYgPSBkZXYtPnByaXY7Ci0KLQlvdXR3KFRMQU5fTkVUX1NJTywgZGV2LT5iYXNlX2FkZHIgKyBUTEFOX0RJT19BRFIpOwotCXNpbyA9IGRldi0+YmFzZV9hZGRyICsgVExBTl9ESU9fREFUQSArIFRMQU5fTkVUX1NJTzsKLQkKLQlpZiAoIWluX2lycSgpKQotCQlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwotCi0JVExhbl9NaWlTeW5jKCBkZXYtPmJhc2VfYWRkciApOwotCi0JbWludGVuID0gVExhbl9HZXRCaXQoIFRMQU5fTkVUX1NJT19NSU5URU4sIHNpbyApOwotCWlmICggbWludGVuICkKLQkJVExhbl9DbGVhckJpdCggVExBTl9ORVRfU0lPX01JTlRFTiwgc2lvICk7Ci0KLQlUTGFuX01paVNlbmREYXRhKCBkZXYtPmJhc2VfYWRkciwgMHgxLCAyICk7CS8qIFN0YXJ0ICggMDFiICkgKi8KLQlUTGFuX01paVNlbmREYXRhKCBkZXYtPmJhc2VfYWRkciwgMHgxLCAyICk7CS8qIFdyaXRlICggMDFiICkgKi8KLQlUTGFuX01paVNlbmREYXRhKCBkZXYtPmJhc2VfYWRkciwgcGh5LCA1ICk7CS8qIERldmljZSAjICAgICAgKi8KLQlUTGFuX01paVNlbmREYXRhKCBkZXYtPmJhc2VfYWRkciwgcmVnLCA1ICk7CS8qIFJlZ2lzdGVyICMgICAgKi8KLQotCVRMYW5fTWlpU2VuZERhdGEoIGRldi0+YmFzZV9hZGRyLCAweDIsIDIgKTsJLyogU2VuZCBBQ0sgKi8KLQlUTGFuX01paVNlbmREYXRhKCBkZXYtPmJhc2VfYWRkciwgdmFsLCAxNiApOwkvKiBTZW5kIERhdGEgKi8KLQotCVRMYW5fQ2xlYXJCaXQoIFRMQU5fTkVUX1NJT19NQ0xLLCBzaW8gKTsJLyogSWRsZSBjeWNsZSAqLwotCVRMYW5fU2V0Qml0KCBUTEFOX05FVF9TSU9fTUNMSywgc2lvICk7Ci0KLQlpZiAoIG1pbnRlbiApCi0JCVRMYW5fU2V0Qml0KCBUTEFOX05FVF9TSU9fTUlOVEVOLCBzaW8gKTsKLQkKLQlpZiAoIWluX2lycSgpKQotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5sb2NrLCBmbGFncyk7Ci0KLX0gLyogVExhbl9NaWlXcml0ZVJlZyAqLwotI2VuZGlmCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVTRVQgLSBSZXNldCBhZGFwdGVyCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBza2VsX3Jlc2V0KHN0cnVjdCBuaWMgKm5pYykKLXsKLQkvKiBwdXQgdGhlIGNhcmQgaW4gaXRzIGluaXRpYWwgc3RhdGUgKi8KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1QT0xMIC0gV2FpdCBmb3IgYSBmcmFtZQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIGludCBza2VsX3BvbGwoc3RydWN0IG5pYyAqbmljKQotewotCS8qIHJldHVybiB0cnVlIGlmIHRoZXJlJ3MgYW4gZXRoZXJuZXQgcGFja2V0IHJlYWR5IHRvIHJlYWQgKi8KLQkvKiBuaWMtPnBhY2tldCBzaG91bGQgY29udGFpbiBkYXRhIG9uIHJldHVybiAqLwotCS8qIG5pYy0+cGFja2V0bGVuIHNob3VsZCBjb250YWluIGxlbmd0aCBvZiBkYXRhICovCi0JcmV0dXJuICgwKTsJLyogaW5pdGlhbGx5IGFzIHRoaXMgaXMgY2FsbGVkIHRvIGZsdXNoIHRoZSBpbnB1dCAqLwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVRSQU5TTUlUIC0gVHJhbnNtaXQgYSBmcmFtZQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgc2tlbF90cmFuc21pdCgKLQlzdHJ1Y3QgbmljICpuaWMsCi0JY29uc3QgY2hhciAqZCwJCQkvKiBEZXN0aW5hdGlvbiAqLwotCXVuc2lnbmVkIGludCB0LAkJCS8qIFR5cGUgKi8KLQl1bnNpZ25lZCBpbnQgcywJCQkvKiBzaXplICovCi0JY29uc3QgY2hhciAqcCkJCQkvKiBQYWNrZXQgKi8KLXsKLQkvKiBzZW5kIHRoZSBwYWNrZXQgdG8gZGVzdGluYXRpb24gKi8KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1ESVNBQkxFIC0gVHVybiBvZmYgZXRoZXJuZXQgaW50ZXJmYWNlCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBza2VsX2Rpc2FibGUoc3RydWN0IG5pYyAqbmljKQotewotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVBST0JFIC0gTG9vayBmb3IgYW4gYWRhcHRlciwgdGhpcyByb3V0aW5lJ3MgdmlzaWJsZSB0byB0aGUgb3V0c2lkZQotWW91IHNob3VsZCBvbWl0IHRoZSBsYXN0IGFyZ3VtZW50IHN0cnVjdCBwY2lfZGV2aWNlICogZm9yIGEgbm9uLVBDSSBOSUMKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0cnVjdCBuaWMgKnRsYW5fcHJvYmUoc3RydWN0IG5pYyAqbmljLCB1bnNpZ25lZCBzaG9ydCAqcHJvYmVfYWRkcnMsCi0Jc3RydWN0IHBjaV9kZXZpY2UgKnApCi17Ci0JLyogaWYgcHJvYmVfYWRkcnMgaXMgMCwgdGhlbiByb3V0aW5lIGNhbiB1c2UgYSBoYXJkd2lyZWQgZGVmYXVsdCAqLwotCS8qIGlmIGJvYXJkIGZvdW5kICovCi0JewotCQkvKiBwb2ludCB0byBOSUMgc3BlY2lmaWMgcm91dGluZXMgKi8KLQkJbmljLT5yZXNldCA9IHNrZWxfcmVzZXQ7Ci0JCW5pYy0+cG9sbCA9IHNrZWxfcG9sbDsKLQkJbmljLT50cmFuc21pdCA9IHNrZWxfdHJhbnNtaXQ7Ci0JCW5pYy0+ZGlzYWJsZSA9IHNrZWxfZGlzYWJsZTsKLQkJcmV0dXJuIG5pYzsKLQl9Ci0JLyogZWxzZSAqLwotCXJldHVybiAwOwotfQotCi0jaWYJMAotI2lmbmRlZiBUTEFOX0gKLSNkZWZpbmUgVExBTl9ICi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgTGludXggVGh1bmRlckxBTiBEcml2ZXIKLSAqCi0gKiAgdGxhbi5oCi0gKiAgYnkgSmFtZXMgQmFua3MKLSAqCi0gKiAgKEMpIDE5OTctMTk5OCBDYWxkZXJhLCBJbmMuCi0gKiAgKEMpIDE5OTktMjAwMSBUb3JiZW4gTWF0aGlhc2VuCi0gKiAKLSAqICBUaGlzIHNvZnR3YXJlIG1heSBiZSB1c2VkIGFuZCBkaXN0cmlidXRlZCBhY2NvcmRpbmcgdG8gdGhlIHRlcm1zCi0gKiAgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBpbmNvcnBvcmF0ZWQgaGVyZWluIGJ5IHJlZmVyZW5jZS4KLSAqCi0gKiogVGhpcyBmaWxlIGlzIGJlc3Qgdmlld2VkL2VkaXRlZCB3aXRoIHRhYnN0b3A9NCwgY29sdW1zPj0xMzIKLSAqCi0gKiAgCi0gKiAgRGVjIDEwLCAxOTk5CVRvcmJlbiBNYXRoaWFzZW4gPHRvcmJlbi5tYXRoaWFzZW5AY29tcGFxLmNvbT4KLSAqCQkJTmV3IE1haW50YWluZXIKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlIDxhc20vaW8uaD4KLSNpbmNsdWRlIDxhc20vdHlwZXMuaD4KLSNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KLQotI2RlZmluZSBGQUxTRQkJCTAKLSNkZWZpbmUgVFJVRQkJCTEKLQotI2RlZmluZSBUWF9USU1FT1VUCQkoMTAqSFopCSAvKiBXZSBuZWVkIHRpbWUgZm9yIGF1dG8tbmVnICovCi0KLXR5cGVkZWYgc3RydWN0IHRsYW5fYWRhcHRlcl9lbnRyeSB7Ci0JdTE2CXZlbmRvcklkOwotCXUxNglkZXZpY2VJZDsKLQljaGFyCSpkZXZpY2VMYWJlbDsKLQl1MzIJZmxhZ3M7Ci0JdTE2CWFkZHJPZnM7Ci19IFRMYW5BZGFwdGVyRW50cnk7Ci0KLQkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkgKiBFSVNBIERlZmluaXRpb25zCi0JICoKLQkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2RlZmluZSBFSVNBX0lEICAgICAgMHhjODAgICAvKiBFSVNBIElEIFJlZ2lzdGVycyAqLyAKLSNkZWZpbmUgRUlTQV9JRDAgICAgIDB4YzgwICAgLyogRUlTQSBJRCBSZWdpc3RlciAwICovIAotI2RlZmluZSBFSVNBX0lEMSAgICAgMHhjODEgICAvKiBFSVNBIElEIFJlZ2lzdGVyIDEgKi8gCi0jZGVmaW5lIEVJU0FfSUQyICAgICAweGM4MiAgIC8qIEVJU0EgSUQgUmVnaXN0ZXIgMiAqLyAKLSNkZWZpbmUgRUlTQV9JRDMgICAgIDB4YzgzICAgLyogRUlTQSBJRCBSZWdpc3RlciAzICovIAotI2RlZmluZSBFSVNBX0NSICAgICAgMHhjODQgICAvKiBFSVNBIENvbnRyb2wgUmVnaXN0ZXIgKi8KLSNkZWZpbmUgRUlTQV9SRUcwICAgIDB4Yzg4ICAgLyogRUlTQSBDb25maWd1cmF0aW9uIFJlZ2lzdGVyIDAgKi8KLSNkZWZpbmUgRUlTQV9SRUcxICAgIDB4Yzg5ICAgLyogRUlTQSBDb25maWd1cmF0aW9uIFJlZ2lzdGVyIDEgKi8KLSNkZWZpbmUgRUlTQV9SRUcyICAgIDB4YzhhICAgLyogRUlTQSBDb25maWd1cmF0aW9uIFJlZ2lzdGVyIDIgKi8KLSNkZWZpbmUgRUlTQV9SRUczICAgIDB4YzhmICAgLyogRUlTQSBDb25maWd1cmF0aW9uIFJlZ2lzdGVyIDMgKi8KLSNkZWZpbmUgRUlTQV9BUFJPTSAgIDB4YzkwICAgLyogRXRoZXJuZXQgQWRkcmVzcyBQUk9NICovCi0KLQkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkgKiBSeC9UeCBMaXN0IERlZmluaXRpb25zCi0JICoKLQkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotdHlwZWRlZiBzdHJ1Y3QgdGxhbl9idWZmZXJfcmVmX3RhZyB7Ci0JdTMyCWNvdW50OwotCXUzMglhZGRyZXNzOwotfSBUTGFuQnVmZmVyUmVmOwotCi10eXBlZGVmIHN0cnVjdCB0bGFuX2xpc3RfdGFnIHsKLQl1MzIJCWZvcndhcmQ7Ci0JdTE2CQljU3RhdDsKLQl1MTYJCWZyYW1lU2l6ZTsKLQlUTGFuQnVmZmVyUmVmCWJ1ZmZlcltUTEFOX0JVRkZFUlNfUEVSX0xJU1RdOwotfSBUTGFuTGlzdDsKLQotdHlwZWRlZiB1OCBUTGFuQnVmZmVyW1RMQU5fTUFYX0ZSQU1FX1NJWkVdOwotCi0JLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JICogVExBTiBQcml2YXRlIEluZm9ybWF0aW9uIFN0cnVjdHVyZQotCSAqCi0JICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXR5cGVkZWYgc3RydWN0IHRsYW5fcHJpdmF0ZV90YWcgewotCXN0cnVjdCBuZXRfZGV2aWNlICAgICAgICpuZXh0RGV2aWNlOwotCXZvaWQJCQkqZG1hU3RvcmFnZTsKLQl1OAkJCSpwYWRCdWZmZXI7Ci0JVExhbkxpc3QgICAgICAgICAgICAgICAgKnJ4TGlzdDsKLQl1OAkJCSpyeEJ1ZmZlcjsKLQl1MzIgICAgICAgICAgICAgICAgICAgICByeEhlYWQ7Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgcnhUYWlsOwotCXUzMgkJCXJ4RW9jQ291bnQ7Ci0JVExhbkxpc3QgICAgICAgICAgICAgICAgKnR4TGlzdDsKLQl1OAkJCSp0eEJ1ZmZlcjsKLQl1MzIgICAgICAgICAgICAgICAgICAgICB0eEhlYWQ7Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgdHhJblByb2dyZXNzOwotCXUzMiAgICAgICAgICAgICAgICAgICAgIHR4VGFpbDsKLQl1MzIJCQl0eEJ1c3lDb3VudDsKLQl1MzIgICAgICAgICAgICAgICAgICAgICBwaHlPbmxpbmU7Ci0JdTMyCQkJdGltZXJTZXRBdDsKLQl1MzIJCQl0aW1lclR5cGU7Ci0Jc3RydWN0IHRpbWVyX2xpc3QJdGltZXI7Ci0Jc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMJc3RhdHM7Ci0Jc3RydWN0IGJvYXJkCQkqYWRhcHRlcjsKLQl1MzIJCQlhZGFwdGVyUmV2OwotCXUzMgkJCWF1aTsKLQl1MzIJCQlkZWJ1ZzsKLQl1MzIJCQlkdXBsZXg7Ci0JdTMyCQkJcGh5WzJdOwotCXUzMgkJCXBoeU51bTsKLQl1MzIJCQlzcGVlZDsKLQl1OAkJCXRsYW5SZXY7Ci0JdTgJCQl0bGFuRnVsbER1cGxleDsKLQljaGFyICAgICAgICAgICAgICAgICAgICBkZXZOYW1lWzhdOwotCXNwaW5sb2NrX3QJCWxvY2s7Ci0JdTgJCQlsaW5rOwotCXU4CQkJaXNfZWlzYTsKLQlzdHJ1Y3QgdHFfc3RydWN0CXRsYW5fdHF1ZXVlOwotCXU4CQkJbmVnX2JlX3ZlcmJvc2U7Ci19IFRMYW5Qcml2YXRlSW5mbzsKLQotI2RlZmluZSAJVExBTl9IQ19HTwkJMHg4MDAwMDAwMAotI2RlZmluZQkJVExBTl9IQ19TVE9QCQkweDQwMDAwMDAwCi0jZGVmaW5lCQlUTEFOX0hDX0FDSwkJMHgyMDAwMDAwMAotI2RlZmluZQkJVExBTl9IQ19DU19NQVNLCQkweDFGRTAwMDAwCi0jZGVmaW5lCQlUTEFOX0hDX0VPQwkJMHgwMDEwMDAwMAotI2RlZmluZQkJVExBTl9IQ19SVAkJMHgwMDA4MDAwMAotI2RlZmluZQkJVExBTl9IQ19ORVMJCTB4MDAwNDAwMDAKLSNkZWZpbmUJCVRMQU5fSENfQURfUlNUCQkweDAwMDA4MDAwCi0jZGVmaW5lCQlUTEFOX0hDX0xEX1RNUgkJMHgwMDAwNDAwMAotI2RlZmluZQkJVExBTl9IQ19MRF9USFIJCTB4MDAwMDIwMDAKLSNkZWZpbmUJCVRMQU5fSENfUkVRX0lOVAkJMHgwMDAwMTAwMAotI2RlZmluZQkJVExBTl9IQ19JTlRfT0ZGCQkweDAwMDAwODAwCi0jZGVmaW5lCQlUTEFOX0hDX0lOVF9PTgkJMHgwMDAwMDQwMAotI2RlZmluZQkJVExBTl9IQ19BQ19NQVNLCQkweDAwMDAwMEZGCi0jZGVmaW5lCQlUTEFOX0RBX0FEUl9JTkMJCTB4ODAwMAotI2RlZmluZQkJVExBTl9EQV9SQU1fQURSCQkweDQwMDAKLSNkZWZpbmUJCVRMQU5fSElfSVZfTUFTSwkJMHgxRkUwCi0jZGVmaW5lCQlUTEFOX0hJX0lUX01BU0sJCTB4MDAxQwotCi0jZGVmaW5lCQlUTEFOX05FVF9DTURfTlJFU0VUCTB4ODAKLSNkZWZpbmUJCVRMQU5fTkVUX0NNRF9OV1JBUAkweDQwCi0jZGVmaW5lCQlUTEFOX05FVF9DTURfQ1NGCTB4MjAKLSNkZWZpbmUJCVRMQU5fTkVUX0NNRF9DQUYJMHgxMAotI2RlZmluZQkJVExBTl9ORVRfQ01EX05PQlJYCTB4MDgKLSNkZWZpbmUJCVRMQU5fTkVUX0NNRF9EVVBMRVgJMHgwNAotI2RlZmluZQkJVExBTl9ORVRfQ01EX1RSRlJBTQkweDAyCi0jZGVmaW5lCQlUTEFOX05FVF9DTURfVFhQQUNFCTB4MDEKLSNkZWZpbmUgCVRMQU5fTkVUX1NJT19NSU5URU4JMHg4MAotI2RlZmluZQkJVExBTl9ORVRfU0lPX0VDTE9LCTB4NDAKLSNkZWZpbmUJCVRMQU5fTkVUX1NJT19FVFhFTgkweDIwCi0jZGVmaW5lCQlUTEFOX05FVF9TSU9fRURBVEEJMHgxMAotI2RlZmluZQkJVExBTl9ORVRfU0lPX05NUlNUCTB4MDgKLSNkZWZpbmUJCVRMQU5fTkVUX1NJT19NQ0xLCTB4MDQKLSNkZWZpbmUJCVRMQU5fTkVUX1NJT19NVFhFTgkweDAyCi0jZGVmaW5lCQlUTEFOX05FVF9TSU9fTURBVEEJMHgwMQotI2RlZmluZQkJVExBTl9ORVRfU1RTX01JUlEJMHg4MAotI2RlZmluZQkJVExBTl9ORVRfU1RTX0hCRUFUCTB4NDAKLSNkZWZpbmUJCVRMQU5fTkVUX1NUU19UWFNUT1AJMHgyMAotI2RlZmluZQkJVExBTl9ORVRfU1RTX1JYU1RPUAkweDEwCi0jZGVmaW5lCQlUTEFOX05FVF9TVFNfUlNSVkQJMHgwRgotI2RlZmluZQkJVExBTl9ORVRfTUFTS19NQVNLNwkweDgwCi0jZGVmaW5lCQlUTEFOX05FVF9NQVNLX01BU0s2CTB4NDAKLSNkZWZpbmUJCVRMQU5fTkVUX01BU0tfTUFTSzUJMHgyMAotI2RlZmluZQkJVExBTl9ORVRfTUFTS19NQVNLNAkweDEwCi0jZGVmaW5lCQlUTEFOX05FVF9NQVNLX1JTUlZECTB4MEYKLSNkZWZpbmUgCVRMQU5fTkVUX0NGR19SQ0xLCTB4ODAwMAotI2RlZmluZQkJVExBTl9ORVRfQ0ZHX1RDTEsJMHg0MDAwCi0jZGVmaW5lCQlUTEFOX05FVF9DRkdfQklUCTB4MjAwMAotI2RlZmluZQkJVExBTl9ORVRfQ0ZHX1JYQ1JDCTB4MTAwMAotI2RlZmluZQkJVExBTl9ORVRfQ0ZHX1BFRgkweDA4MDAKLSNkZWZpbmUJCVRMQU5fTkVUX0NGR18xRlJBRwkweDA0MDAKLSNkZWZpbmUJCVRMQU5fTkVUX0NGR18xQ0hBTgkweDAyMDAKLSNkZWZpbmUJCVRMQU5fTkVUX0NGR19NVEVTVAkweDAxMDAKLSNkZWZpbmUJCVRMQU5fTkVUX0NGR19QSFlfRU4JMHgwMDgwCi0jZGVmaW5lCQlUTEFOX05FVF9DRkdfTVNNQVNLCTB4MDA3RgotI2RlZmluZQkJVExBTl9MRURfQUNUCQkweDEwCi0jZGVmaW5lCQlUTEFOX0xFRF9MSU5LCQkweDAxCi0jZGVmaW5lCQlUTEFOX0lEX1RYX0VPQwkJMHgwNAotI2RlZmluZQkJVExBTl9JRF9SWF9FT0YJCTB4MDIKLSNkZWZpbmUJCVRMQU5fSURfUlhfRU9DCQkweDAxCi0KLSNkZWZpbmUgQ0lSQ19JTkMoIGEsIGIgKSBpZiAoICsrYSA+PSBiICkgYSA9IDAKLQotI2lmZGVmIElfTElLRV9BX0ZBU1RfSEFTSF9GVU5DVElPTgotLyogZ2l2ZW4gNiBieXRlcywgdmlldyB0aGVtIGFzIDggNi1iaXQgbnVtYmVycyBhbmQgcmV0dXJuIHRoZSBYT1Igb2YgdGhvc2UgKi8KLS8qIHRoZSBjb2RlIGJlbG93IGlzIGFib3V0IHNldmVuIHRpbWVzIGFzIGZhc3QgYXMgdGhlIG9yaWdpbmFsIGNvZGUgKi8KLWlubGluZSB1MzIgVExhbl9IYXNoRnVuYyggdTggKmEgKQotewotICAgICAgICB1OCAgICAgaGFzaDsKLQotICAgICAgICBoYXNoID0gKGFbMF1eYVszXSk7ICAgICAgICAgICAgIC8qICYgMDc3ICovCi0gICAgICAgIGhhc2ggXj0gKChhWzBdXmFbM10pPj42KTsgICAgICAgLyogJiAwMDMgKi8KLSAgICAgICAgaGFzaCBePSAoKGFbMV1eYVs0XSk8PDIpOyAgICAgICAvKiAmIDA3NCAqLwotICAgICAgICBoYXNoIF49ICgoYVsxXV5hWzRdKT4+NCk7ICAgICAgIC8qICYgMDE3ICovCi0gICAgICAgIGhhc2ggXj0gKChhWzJdXmFbNV0pPDw0KTsgICAgICAgLyogJiAwNjAgKi8KLSAgICAgICAgaGFzaCBePSAoKGFbMl1eYVs1XSk+PjIpOyAgICAgICAvKiAmIDA3NyAqLwotCi0gICAgICAgIHJldHVybiAoaGFzaCAmIDA3Nyk7Ci19Ci0KLSNlbHNlIC8qIG9yaWdpbmFsIGNvZGUgKi8KLQotaW5saW5lCXUzMgl4b3IoIHUzMiBhLCB1MzIgYiApCi17Ci0JcmV0dXJuICggKCBhICYmICEgYiApIHx8ICggISBhICYmIGIgKSApOwotfQotI2RlZmluZSBYT1I4KCBhLCBiLCBjLCBkLCBlLCBmLCBnLCBoICkJeG9yKCBhLCB4b3IoIGIsIHhvciggYywgeG9yKCBkLCB4b3IoIGUsIHhvciggZiwgeG9yKCBnLCBoICkgKSApICkgKSApICkKLSNkZWZpbmUgREEoIGEsIGJpdCApCQkJCQkoICggKHU4KSBhW2JpdC84XSApICYgKCAodTgpICggMSA8PCBiaXQlOCApICkgKQotCi1pbmxpbmUgdTMyIFRMYW5fSGFzaEZ1bmMoIHU4ICphICkKLXsKLQl1MzIJaGFzaDsKLQotCWhhc2ggID0gWE9SOCggREEoYSwwKSwgREEoYSwgNiksIERBKGEsMTIpLCBEQShhLDE4KSwgREEoYSwyNCksIERBKGEsMzApLCBEQShhLDM2KSwgREEoYSw0MikgKTsKLQloYXNoIHw9IFhPUjgoIERBKGEsMSksIERBKGEsIDcpLCBEQShhLDEzKSwgREEoYSwxOSksIERBKGEsMjUpLCBEQShhLDMxKSwgREEoYSwzNyksIERBKGEsNDMpICkgPDwgMTsKLQloYXNoIHw9IFhPUjgoIERBKGEsMiksIERBKGEsIDgpLCBEQShhLDE0KSwgREEoYSwyMCksIERBKGEsMjYpLCBEQShhLDMyKSwgREEoYSwzOCksIERBKGEsNDQpICkgPDwgMjsKLQloYXNoIHw9IFhPUjgoIERBKGEsMyksIERBKGEsIDkpLCBEQShhLDE1KSwgREEoYSwyMSksIERBKGEsMjcpLCBEQShhLDMzKSwgREEoYSwzOSksIERBKGEsNDUpICkgPDwgMzsKLQloYXNoIHw9IFhPUjgoIERBKGEsNCksIERBKGEsMTApLCBEQShhLDE2KSwgREEoYSwyMiksIERBKGEsMjgpLCBEQShhLDM0KSwgREEoYSw0MCksIERBKGEsNDYpICkgPDwgNDsKLQloYXNoIHw9IFhPUjgoIERBKGEsNSksIERBKGEsMTEpLCBEQShhLDE3KSwgREEoYSwyMyksIERBKGEsMjkpLCBEQShhLDM1KSwgREEoYSw0MSksIERBKGEsNDcpICkgPDwgNTsKLQotCXJldHVybiBoYXNoOwotCi19IAotCi0jZW5kaWYgLyogSV9MSUtFX0FfRkFTVF9IQVNIX0ZVTkNUSU9OICovCi0jZW5kaWYKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIExpbnV4IFRodW5kZXJMQU4gRHJpdmVyCi0gKgotICogIHRsYW4uYwotICogIGJ5IEphbWVzIEJhbmtzCi0gKgotICogIChDKSAxOTk3LTE5OTggQ2FsZGVyYSwgSW5jLgotICogIChDKSAxOTk4IEphbWVzIEJhbmtzCi0gKiAgKEMpIDE5OTktMjAwMSBUb3JiZW4gTWF0aGlhc2VuCi0gKgotICogIFRoaXMgc29mdHdhcmUgbWF5IGJlIHVzZWQgYW5kIGRpc3RyaWJ1dGVkIGFjY29yZGluZyB0byB0aGUgdGVybXMKLSAqICBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgotICoKLSAqKiBUaGlzIGZpbGUgaXMgYmVzdCB2aWV3ZWQvZWRpdGVkIHdpdGggY29sdW1ucz49MTMyLgotICoKLSAqKiBVc2VmdWwgKGlmIG5vdCByZXF1aXJlZCkgcmVhZGluZzoKLSAqCi0gKgkJVGV4YXMgSW5zdHJ1bWVudHMsIFRodW5kZXJMQU4gUHJvZ3JhbW1lcidzIEd1aWRlLAotICoJCQlUSSBMaXRlcmF0dXJlIE51bWJlciBTUFdVMDEzQQotICoJCQlhdmFpbGFibGUgaW4gUERGIGZvcm1hdCBmcm9tIHd3dy50aS5jb20KLSAqCQlMZXZlbCBPbmUsIExYVDkwMSBhbmQgTFhUOTcwIERhdGEgU2hlZXRzCi0gKgkJCWF2YWlsYWJsZSBpbiBQREYgZm9ybWF0IGZyb20gd3d3LmxldmVsMS5jb20KLSAqCQlOYXRpb25hbCBTZW1pY29uZHVjdG9yLCBEUDgzODQwQSBEYXRhIFNoZWV0Ci0gKgkJCWF2YWlsYWJsZSBpbiBQREYgZm9ybWF0IGZyb20gd3d3Lm5hdGlvbmFsLmNvbQotICoJCU1pY3JvY2hpcCBUZWNobm9sb2d5LCAyNEMwMUEvMDJBLzA0QSBEYXRhIFNoZWV0Ci0gKgkJCWF2YWlsYWJsZSBpbiBQREYgZm9ybWF0IGZyb20gd3d3Lm1pY3JvY2hpcC5jb20KLSAqCi0gKiBDaGFuZ2UgSGlzdG9yeQotICoKLSAqCVRpZ3JhbiBBaXZhemlhbiA8dGlncmFuQHNjby5jb20+OglUTGFuX1BjaVByb2JlKCkgbm93IHVzZXMKLSAqCQkJCQkJbmV3IFBDSSBCSU9TIGludGVyZmFjZS4KLSAqCUFsYW4gQ294CTxhbGFuQHJlZGhhdC5jb20+OglGaXhlZCB0aGUgb3V0IG9mIG1lbW9yeQotICoJCQkJCQloYW5kbGluZy4KLSAqICAgICAgCi0gKglUb3JiZW4gTWF0aGlhc2VuIDx0b3JiZW4ubWF0aGlhc2VuQGNvbXBhcS5jb20+IE5ldyBNYWludGFpbmVyIQotICoKLSAqCXYxLjEgRGVjIDIwLCAxOTk5ICAgIC0gUmVtb3ZlZCBsaW51eCB2ZXJzaW9uIGNoZWNraW5nCi0gKgkJCSAgICAgICBQYXRjaCBmcm9tIFRpZ3JhbiBBaXZhemlhbi4gCi0gKgkJCSAgICAgLSB2MS4xIGluY2x1ZGVzIEFsYW4ncyBTTVAgdXBkYXRlcy4KLSAqCQkJICAgICAtIFdlIHN0aWxsIGhhdmUgcHJvYmxlbXMgb24gU01QIHRob3VnaCwKLSAqCQkJICAgICAgIGJ1dCBJJ20gbG9va2luZyBpbnRvIHRoYXQuIAotICoJCQkKLSAqCXYxLjIgSmFuIDAyLCAyMDAwICAgIC0gSG9wZWZ1bGx5IGZpeGVkIHRoZSBTTVAgZGVhZGxvY2suCi0gKgkJCSAgICAgLSBSZW1vdmVkIGRlcGVuZGVuY3kgb2YgSFogYmVpbmcgMTAwLgotICoJCQkgICAgIC0gV2Ugbm93IGFsbG93IGhpZ2hlciBwcmlvcml0eSB0aW1lcnMgdG8gCi0gKgkJCSAgICAgICBvdmVyd3JpdGUgdGltZXJzIGxpa2UgVExBTl9USU1FUl9BQ1RJVklUWQotICoJCQkgICAgICAgUGF0Y2ggZnJvbSBKb2huIENhZ2xlIDxqb2huLmNhZ2xlQGNvbXBhcS5jb20+LgotICoJCQkgICAgIC0gRml4ZWQgYSBmZXcgY29tcGlsZXIgd2FybmluZ3MuCi0gKgotICoJdjEuMyBGZWIgMDQsIDIwMDAgICAgLSBGaXhlZCB0aGUgcmVtYWluaW5nIEhaIGlzc3Vlcy4KLSAqCQkJICAgICAtIFJlbW92ZWQgY2FsbCB0byBwY2lfcHJlc2VudCgpLiAKLSAqCQkJICAgICAtIFJlbW92ZWQgU0FfSU5URVJSVVBUIGZsYWcgZnJvbSBpcnEgaGFuZGxlci4KLSAqCQkJICAgICAtIEFkZGVkIF9faW5pdCBhbmQgX19pbml0ZGF0YSB0byByZWR1Y2UgcmVzaXNkZW50IAotICoJCQkgICAgICAgY29kZSBzaXplLgotICoJCQkgICAgIC0gRHJpdmVyIG5vdyB1c2VzIG1vZHVsZV9pbml0L21vZHVsZV9leGl0LgotICoJCQkgICAgIC0gUmV3cm90ZSBpbml0X21vZHVsZSBhbmQgdGxhbl9wcm9iZSB0bwotICoJCQkgICAgICAgc2hhcmUgYSBsb3QgbW9yZSBjb2RlLiBXZSBub3cgdXNlIHRsYW5fcHJvYmUKLSAqCQkJICAgICAgIHdpdGggYnVpbHRpbiBhbmQgbW9kdWxlIGRyaXZlci4KLSAqCQkJICAgICAtIERyaXZlciBwb3J0ZWQgdG8gbmV3IG5ldCBBUEkuIAotICoJCQkgICAgIC0gdGxhbi50eHQgaGFzIGJlZW4gcmV3b3JrZWQgdG8gcmVmbGVjdCBjdXJyZW50IAotICoJCQkgICAgICAgZHJpdmVyIChhbG1vc3QpCi0gKgkJCSAgICAgLSBPdGhlciBtaW5vciBzdHVmZgotICoKLSAqCXYxLjQgRmViIDEwLCAyMDAwICAgIC0gVXBkYXRlZCB3aXRoIG1vcmUgY2hhbmdlcyByZXF1aXJlZCBhZnRlciBEYXZlJ3MKLSAqCSAgICAgICAgICAgICAgICAgICAgICAgbmV0d29yayBjbGVhbnVwIGluIDIuMy40M3ByZTcgKFRpZ3JhbiAmIG15c2VsZikKLSAqCSAgICAgICAgICAgICAgICAgICAgIC0gTWlub3Igc3R1ZmYuCi0gKgotICoJdjEuNSBNYXJjaCAyMiwgMjAwMCAgLSBGaXhlZCBhbm90aGVyIHRpbWVyIGJ1ZyB0aGF0IHdvdWxkIGhhbmcgdGhlIGRyaXZlcgotICoJCQkgICAgICAgaWYgbm8gY2FibGUvbGluayB3ZXJlIHByZXNlbnQuCi0gKgkJCSAgICAgLSBDb3NtZXRpYyBjaGFuZ2VzLgotICoJCQkgICAgIC0gVE9ETzogUG9ydCBjb21wbGV0ZWx5IHRvIG5ldyBQQ0kvRE1BIEFQSQotICoJCQkgICAgIAkgICAgIEF1dG8tTmVnIGZhbGxiYWNrLgotICoKLSAqIAl2MS42IEFwcmlsIDA0LCAyMDAwICAtIEZpeGVkIGRyaXZlciBzdXBwb3J0IGZvciBrZXJuZWwtcGFyYW1ldGVycy4gSGF2ZW4ndAotICogCQkJICAgICAgIHRlc3RlZCBpdCB0aG91Z2gsIGFzIHRoZSBrZXJuZWwgc3VwcG9ydCBpcyBjdXJyZW50bHkgCi0gKiAJCQkgICAgICAgYnJva2VuICgyLjMuOTlwNHAzKS4KLSAqIAkJCSAgICAgLSBVcGRhdGVkIHRsYW4udHh0IGFjY29yZGluZ2x5LgotICogCQkJICAgICAtIEFkanVzdGVkIG1pbmltdW0vbWF4aW11bSBmcmFtZSBsZW5ndGguCi0gKiAJCQkgICAgIC0gVGhlcmUgaXMgbm93IGEgVExBTiB3ZWJzaXRlIHVwIGF0IAotICogCQkJICAgICAgIGh0dHA6Ly90bGFuLmtlcm5lbC5kawotICoKLSAqIAl2MS43IEFwcmlsIDA3LCAyMDAwICAtIFN0YXJ0ZWQgdG8gaW1wbGVtZW50IGN1c3RvbSBpb2N0bHMuIERyaXZlciBub3cKLSAqIAkJCSAgICAgICByZXBvcnRzIFBIWSBpbmZvcm1hdGlvbiB3aGVuIHVzZWQgd2l0aCBEb25hbGQKLSAqIAkJCSAgICAgICBCZWNrZXJzIHVzZXJzcGFjZSBNSUkgZGlhZ25vc3RpY3MgdXRpbGl0eS4KLSAqCi0gKiAJdjEuOCBBcHJpbCAyMywgMjAwMCAgLSBGaXhlZCBzdXBwb3J0IGZvciBmb3JjZWQgc3BlZWQvZHVwbGV4IHNldHRpbmdzLgotICogCQkJICAgICAtIEFkZGVkIGxpbmsgaW5mb3JtYXRpb24gdG8gQXV0by1OZWcgYW5kIGZvcmNlZAotICogCQkJICAgICAgIG1vZGVzLiBXaGVuIE5JQyBvcGVyYXRlcyB3aXRoIGF1dG8tbmVnIHRoZSBkcml2ZXIKLSAqIAkJCSAgICAgICB3aWxsIHJlcG9ydCBMaW5rIHNwZWVkICYgZHVwbGV4IG1vZGVzIGFzIHdlbGwgYXMKLSAqIAkJCSAgICAgICBsaW5rIHBhcnRuZXIgYWJpbGl0aWVzLiBXaGVuIGZvcmNlZCBsaW5rIGlzIHVzZWQsCi0gKiAJCQkgICAgICAgdGhlIGRyaXZlciB3aWxsIHJlcG9ydCBzdGF0dXMgb2YgdGhlIGVzdGFibGlzaGVkCi0gKiAJCQkgICAgICAgbGluay4KLSAqIAkJCSAgICAgICBQbGVhc2UgcmVhZCB0bGFuLnR4dCBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbi4gCi0gKiAJCQkgICAgIC0gUmVtb3ZlZCBjYWxsIHRvIGNoZWNrX3JlZ2lvbigpLCBhbmQgdXNlZCAKLSAqIAkJCSAgICAgICByZXR1cm4gdmFsdWUgb2YgcmVxdWVzdF9yZWdpb24oKSBpbnN0ZWFkLgotICoJCi0gKgl2MS44YSBNYXkgMjgsIDIwMDAgICAtIE1pbm9yIHVwZGF0ZXMuCi0gKgotICoJdjEuOSBKdWx5IDI1LCAyMDAwICAgLSBGaXhlZCBhIGZldyByZW1haW5pbmcgRnVsbC1EdXBsZXggaXNzdWVzLgotICoJICAgICAgICAgICAgICAgICAgICAgLSBVcGRhdGVkIHdpdGggdGltZXIgZml4ZXMgZnJvbSBBbmRyZXcgTW9ydG9uLgotICoJICAgICAgICAgICAgICAgICAgICAgLSBGaXhlZCBtb2R1bGUgcmFjZSBpbiBUTGFuX09wZW4uCi0gKgkgICAgICAgICAgICAgICAgICAgICAtIEFkZGVkIHJvdXRpbmUgdG8gbW9uaXRvciBQSFkgc3RhdHVzLgotICoJICAgICAgICAgICAgICAgICAgICAgLSBBZGRlZCBhY3Rpdml0eSBsZWQgc3VwcG9ydCBmb3IgUHJvbGlhbnQgZGV2aWNlcy4KLSAqCi0gKgl2MS4xMCBBdWcgMzAsIDIwMDAgICAtIEFkZGVkIHN1cHBvcnQgZm9yIEVJU0EgYmFzZWQgdGxhbiBjb250cm9sbGVycyAKLSAqCQkJICAgICAgIGxpa2UgdGhlIENvbXBhcSBOZXRGbGV4My9FLiAKLSAqCQkJICAgICAtIFJld3JvdGUgdGxhbl9wcm9iZSB0byBiZXR0ZXIgaGFuZGxlIG11bHRpcGxlCi0gKgkJCSAgICAgICBidXMgcHJvYmVzLiBQcm9iaW5nIGFuZCBkZXZpY2Ugc2V0dXAgaXMgbm93Ci0gKgkJCSAgICAgICBkb25lIHRocm91Z2ggVExhbl9Qcm9iZSBhbmQgVExhbl9pbml0X29uZS4gQWN0dWFsCi0gKgkJCSAgICAgICBoYXJkd2FyZSBwcm9iZSBpcyBkb25lIHdpdGgga2VybmVsIEFQSSBhbmQgCi0gKgkJCSAgICAgICBUTGFuX0Vpc2FQcm9iZS4KLSAqCQkJICAgICAtIEFkanVzdGVkIGRlYnVnIGluZm9ybWF0aW9uIGZvciBwcm9iaW5nLgotICoJCQkgICAgIC0gRml4ZWQgYnVnIHRoYXQgd291bGQgY2F1c2UgZ2VuZXJhbCBkZWJ1ZyBpbmZvcm1hdGlvbiAKLSAqCQkJICAgICAgIHRvIGJlIHByaW50ZWQgYWZ0ZXIgZHJpdmVyIHJlbW92YWwuIAotICoJCQkgICAgIC0gQWRkZWQgdHJhbnNtaXQgdGltZW91dCBoYW5kbGluZy4KLSAqCQkJICAgICAtIEZpeGVkIE9PTSByZXR1cm4gdmFsdWVzIGluIHRsYW5fcHJvYmUuIAotICoJCQkgICAgIC0gRml4ZWQgcG9zc2libGUgbWVtIGxlYWsgaW4gdGxhbl9leGl0IAotICoJCQkgICAgICAgKG5vdyB0bGFuX3JlbW92ZV9vbmUpLgotICoJCQkgICAgIC0gRml4ZWQgdGltZXIgYnVnIGluIFRMYW5fcGh5TW9uaXRvci4KLSAqCQkJICAgICAtIFRoaXMgZHJpdmVyIHZlcnNpb24gaXMgYWxwaGEgcXVhbGl0eSwgcGxlYXNlCi0gKgkJCSAgICAgICBzZW5kIG1lIGFueSBidWcgaXNzdWVzIHlvdSBtYXkgZW5jb3VudGVyLgotICoKLSAqCXYxLjExIEF1ZyAzMSwgMjAwMCAgIC0gRG8gbm90IHRyeSB0byByZWdpc3RlciBpcnEgMCBpZiBubyBpcnEgbGluZSB3YXMgCi0gKgkJCSAgICAgICBzZXQgZm9yIEVJU0EgY2FyZHMuCi0gKgkJCSAgICAgLSBBZGRlZCBzdXBwb3J0IGZvciBOZXRGbGV4My9FIHdpdGggbmliYmxlLXJhdGUKLSAqCQkJICAgICAgIDEwQmFzZS1UIFBIWS4gVGhpcyBpcyB1bnRlc3RldCBhcyBJIGhhdmVuJ3QgZ290Ci0gKgkJCSAgICAgICBvbmUgb2YgdGhlc2UgY2FyZHMuCi0gKgkJCSAgICAgLSBGaXhlZCB0aW1lciBiZWluZyBhZGRlZCB0d2ljZS4KLSAqCQkJICAgICAtIERpc2FibGVkIFBoeU1vbml0b3JpbmcgYnkgZGVmYXVsdCBhcyB0aGlzIGlzCi0gKgkJCSAgICAgICB3b3JrIGluIHByb2dyZXNzLiBEZWZpbmUgTU9OSVRPUiB0byBlbmFibGUgaXQuCi0gKgkJCSAgICAgLSBOb3cgd2UgZG9uJ3QgZGlzcGxheSBsaW5rIGluZm8gd2l0aCBQSFlzIHRoYXQKLSAqCQkJICAgICAgIGRvZXNuJ3Qgc3VwcG9ydCBpdCAobGV2ZWwxKS4KLSAqCQkJICAgICAtIEluY3Jlc2VkIHR4X3RpbWVvdXQgYmVhY3VzZSBvZiBhdXRvLW5lZy4KLSAqCQkJICAgICAtIEFkanVzdGVkIHRpbWVycyBmb3IgZm9yY2VkIHNwZWVkcy4KLSAqCi0gKgl2MS4xMiBPY3QgMTIsIDIwMDAgICAtIE1pbm9yIGZpeGVzIChtZW1sZWFrLCBpbml0LCBldGMuKQotICoKLSAqIAl2MS4xMyBOb3YgMjgsIDIwMDAgICAtIFN0b3AgZmxvb2RpbmcgY29uc29sZSB3aXRoIGF1dG8tbmVnIGlzc3VlcwotICogCQkJICAgICAgIHdoZW4gbGluayBjYW4ndCBiZSBlc3RhYmxpc2hlZC4KLSAqCQkJICAgICAtIEFkZGVkIHRoZSBiYnVmIG9wdGlvbiBhcyBhIGtlcm5lbCBwYXJhbWV0ZXIuCi0gKgkJCSAgICAgLSBGaXhlZCBpb2FkZHIgcHJvYmUgYnVnLgotICoJCQkgICAgIC0gRml4ZWQgc3R1cGlkIGRlYWRsb2NrIHdpdGggTUlJIGludGVycnVwdHMuCi0gKgkJCSAgICAgLSBBZGRlZCBzdXBwb3J0IGZvciBzcGVlZC9kdXBsZXggc2VsZWN0aW9uIHdpdGggCi0gKgkJCSAgICAgICBtdWx0aXBsZSBuaWNzLgotICoJCQkgICAgIC0gQWRkZWQgcGFydGx5IGZpeCBmb3IgVFggQ2hhbm5lbCBsb2NrdXAgd2l0aAotICoJCQkgICAgICAgVExBTiB2MS4wIHNpbGljb24uIFRoaXMgbmVlZHMgdG8gYmUgaW52ZXN0aWdhdGVkCi0gKgkJCSAgICAgICBmdXJ0aGVyLgotICoKLSAqIAl2MS4xNCBEZWMgMTYsIDIwMDAgICAtIEFkZGVkIHN1cHBvcnQgZm9yIHNlcnZpY2luZyBtdWx0aXBsZSBmcmFtZXMgcGVyLgotICogCQkJICAgICAgIGludGVycnVwdC4gVGhhbmtzIGdvZXMgdG8KLSAqIAkJCSAgICAgICBBZGFtIEtleXMgPGFkYW1AdGkuY29tPgotICogCQkJICAgICAgIERlbmlzIEJlYXVkb2luIDxkYmVhdWRvaW5AdGkuY29tPgotICogCQkJICAgICAgIGZvciBwcm92aWRpbmcgdGhlIHBhdGNoLgotICogCQkJICAgICAtIEZpeGVkIGF1dG8tbmVnIG91dHB1dCB3aGVuIHVzaW5nIG11bHRpcGxlCi0gKiAJCQkgICAgICAgYWRhcHRlcnMuCi0gKiAJCQkgICAgIC0gQ29udmVydGVkIHRvIHVzZSBuZXcgdGFza3EgaW50ZXJmYWNlLgotICoKLSAqIAl2MS4xNGEgSmFuIDYsIDIwMDEgICAtIE1pbm9yIGFkanVzdG1lbnRzIChzcGlubG9ja3MsIGV0Yy4pCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0KLSNpbmNsdWRlICJ0bGFuLmgiCi0KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+Ci0jaW5jbHVkZSA8bGludXgvcGNpLmg+Ci0jaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgotI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+Ci0jaW5jbHVkZSA8bGludXgvbWlpLmg+Ci0KLXR5cGVkZWYgdTMyIChUTGFuSW50VmVjdG9yRnVuYykoIHN0cnVjdCBuZXRfZGV2aWNlICosIHUxNiApOwotCi0vKiBGb3IgcmVtb3ZpbmcgRUlTQSBkZXZpY2VzICovCi1zdGF0aWMJc3RydWN0IG5ldF9kZXZpY2UJKlRMYW5fRWlzYV9EZXZpY2VzOwotCi1zdGF0aWMJaW50CQlUTGFuRGV2aWNlc0luc3RhbGxlZDsKLQotLyogU2V0IHNwZWVkLCBkdXBsZXggYW5kIGF1aSBzZXR0aW5ncyAqLwotc3RhdGljICBpbnQgYXVpW01BWF9UTEFOX0JPQVJEU107Ci1zdGF0aWMgIGludCBkdXBsZXhbTUFYX1RMQU5fQk9BUkRTXTsKLXN0YXRpYyAgaW50IHNwZWVkW01BWF9UTEFOX0JPQVJEU107Ci1zdGF0aWMgIGludCBib2FyZHNfZm91bmQ7Ci0KLU1PRFVMRV9BVVRIT1IoIk1haW50YWluZXI6IFRvcmJlbiBNYXRoaWFzZW4gPHRvcmJlbi5tYXRoaWFzZW5AY29tcGFxLmNvbT4iKTsKLU1PRFVMRV9ERVNDUklQVElPTigiRHJpdmVyIGZvciBUSSBUaHVuZGVyTEFOIGJhc2VkIGV0aGVybmV0IFBDSSBhZGFwdGVycyIpOwotTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwotCi1NT0RVTEVfUEFSTShhdWksICIxLSIgX19NT0RVTEVfU1RSSU5HKE1BWF9UTEFOX0JPQVJEUykgImkiKTsKLU1PRFVMRV9QQVJNKGR1cGxleCwgIjEtIiBfX01PRFVMRV9TVFJJTkcoTUFYX1RMQU5fQk9BUkRTKSAiaSIpOwotTU9EVUxFX1BBUk0oc3BlZWQsICIxLSIgX19NT0RVTEVfU1RSSU5HKE1BWF9UTEFOX0JPQVJEUykgImkiKTsKLU1PRFVMRV9QQVJNKGRlYnVnLCAiaSIpOwotTU9EVUxFX1BBUk0oYmJ1ZiwgImkiKTsKLU1PRFVMRV9QQVJNX0RFU0MoYXVpLCAiVGh1bmRlckxBTiB1c2UgQVVJIHBvcnQocykgKDAtMSkiKTsKLU1PRFVMRV9QQVJNX0RFU0MoZHVwbGV4LCAiVGh1bmRlckxBTiBkdXBsZXggc2V0dGluZyhzKSAoMC1kZWZhdWx0LCAxLWhhbGYsIDItZnVsbCkiKTsKLU1PRFVMRV9QQVJNX0RFU0Moc3BlZWQsICJUaHVuZGVyTEFOIHBvcnQgc3BlZW4gc2V0dGluZyhzKSAoMCwxMCwxMDApIik7Ci1NT0RVTEVfUEFSTV9ERVNDKGRlYnVnLCAiVGh1bmRlckxBTiBkZWJ1ZyBtYXNrIik7Ci1NT0RVTEVfUEFSTV9ERVNDKGJidWYsICJUaHVuZGVyTEFOIHVzZSBiaWcgYnVmZmVyICgwLTEpIik7Ci1FWFBPUlRfTk9fU1lNQk9MUzsKLQotLyogRGVmaW5lIHRoaXMgdG8gZW5hYmxlIExpbmsgYmVhdCBtb25pdG9yaW5nICovCi0jdW5kZWYgTU9OSVRPUgotCi0vKiBUdXJuIG9uIGRlYnVnZ2luZy4gU2VlIGxpbnV4L0RvY3VtZW50YXRpb24vbmV0d29ya2luZy90bGFuLnR4dCBmb3IgZGV0YWlscyAqLwotc3RhdGljICBpbnQJCWRlYnVnOwotCi1zdGF0aWMJaW50CQliYnVmOwotc3RhdGljCXU4CQkqVExhblBhZEJ1ZmZlcjsKLXN0YXRpYwljaGFyCQlUTGFuU2lnbmF0dXJlW10gPSAiVExBTiI7Ci1zdGF0aWMgY29uc3QgY2hhciB0bGFuX2Jhbm5lcltdID0gIlRodW5kZXJMQU4gZHJpdmVyIHYxLjE0YVxuIjsKLXN0YXRpYyBpbnQgdGxhbl9oYXZlX3BjaTsKLXN0YXRpYyBpbnQgdGxhbl9oYXZlX2Vpc2E7Ci0KLWNvbnN0IGNoYXIgKm1lZGlhW10gPSB7Ci0JIjEwQmFzZVQtSEQgIiwgIjEwQmFzZVQtRkQgIiwiMTAwYmFzZVR4LUhEICIsIAotCSIxMDBiYXNlVHgtRkQiLCAiMTAwYmFzZVQ0IiwgMAotfTsKLQotaW50IG1lZGlhX21hcFtdID0geyAweDAwMjAsIDB4MDA0MCwgMHgwMDgwLCAweDAxMDAsIDB4MDIwMCx9OwotCi1zdGF0aWMgc3RydWN0IGJvYXJkIHsKLQljb25zdCBjaGFyCSpkZXZpY2VMYWJlbDsKLQl1MzIJICAgCWZsYWdzOwotCXUxNgkgICAJYWRkck9mczsKLX0gYm9hcmRfaW5mb1tdIF9fZGV2aW5pdGRhdGEgPSB7Ci0JeyAiQ29tcGFxIE5ldGVsbGlnZW50IDEwIFQgUENJIFVUUCIsIFRMQU5fQURBUFRFUl9BQ1RJVklUWV9MRUQsIDB4ODMgfSwKLQl7ICJDb21wYXEgTmV0ZWxsaWdlbnQgMTAvMTAwIFRYIFBDSSBVVFAiLCBUTEFOX0FEQVBURVJfQUNUSVZJVFlfTEVELCAweDgzIH0sCi0JeyAiQ29tcGFxIEludGVncmF0ZWQgTmV0RmxleC0zL1AiLCBUTEFOX0FEQVBURVJfTk9ORSwgMHg4MyB9LAotCXsgIkNvbXBhcSBOZXRGbGV4LTMvUCIsIFRMQU5fQURBUFRFUl9VTk1BTkFHRURfUEhZIHwgVExBTl9BREFQVEVSX0JJVF9SQVRFX1BIWSwgMHg4MyB9LAotCXsgIkNvbXBhcSBOZXRGbGV4LTMvUCIsIFRMQU5fQURBUFRFUl9OT05FLCAweDgzIH0sCi0JeyAiQ29tcGFxIE5ldGVsbGlnZW50IEludGVncmF0ZWQgMTAvMTAwIFRYIFVUUCIsIFRMQU5fQURBUFRFUl9BQ1RJVklUWV9MRUQsIDB4ODMgfSwKLQl7ICJDb21wYXEgTmV0ZWxsaWdlbnQgRHVhbCAxMC8xMDAgVFggUENJIFVUUCIsIFRMQU5fQURBUFRFUl9OT05FLCAweDgzIH0sCi0JeyAiQ29tcGFxIE5ldGVsbGlnZW50IDEwLzEwMCBUWCBFbWJlZGRlZCBVVFAiLCBUTEFOX0FEQVBURVJfTk9ORSwgMHg4MyB9LAotCXsgIk9saWNvbSBPQy0yMTgzLzIxODUiLCBUTEFOX0FEQVBURVJfVVNFX0lOVEVSTl8xMCwgMHg4MyB9LAotCXsgIk9saWNvbSBPQy0yMzI1IiwgVExBTl9BREFQVEVSX1VOTUFOQUdFRF9QSFksIDB4RjggfSwKLQl7ICJPbGljb20gT0MtMjMyNiIsIFRMQU5fQURBUFRFUl9VU0VfSU5URVJOXzEwLCAweEY4IH0sCi0JeyAiQ29tcGFxIE5ldGVsbGlnZW50IDEwLzEwMCBUWCBVVFAiLCBUTEFOX0FEQVBURVJfQUNUSVZJVFlfTEVELCAweDgzIH0sCi0JeyAiQ29tcGFxIE5ldGVsbGlnZW50IDEwIFQvMiBQQ0kgVVRQL0NvYXgiLCBUTEFOX0FEQVBURVJfTk9ORSwgMHg4MyB9LAotCXsgIkNvbXBhcSBOZXRGbGV4LTMvRSIsIFRMQU5fQURBUFRFUl9BQ1RJVklUWV9MRUQgfCAJLyogRUlTQSBjYXJkICovCi0JICAgICAgICAgICAgICAgICAgICAgICAgVExBTl9BREFQVEVSX1VOTUFOQUdFRF9QSFkgfCBUTEFOX0FEQVBURVJfQklUX1JBVEVfUEhZLCAweDgzIH0sCQotCXsgIkNvbXBhcSBOZXRGbGV4LTMvRSIsIFRMQU5fQURBUFRFUl9BQ1RJVklUWV9MRUQsIDB4ODMgfSwgLyogRUlTQSBjYXJkICovCi19OwotCi1zdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgdGxhbl9wY2lfdGJsW10gX19kZXZpbml0ZGF0YSA9IHsKLQl7IFBDSV9WRU5ET1JfSURfQ09NUEFRLCBQQ0lfREVWSUNFX0lEX0NPTVBBUV9ORVRFTDEwLAotCQlQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwIH0sCi0JeyBQQ0lfVkVORE9SX0lEX0NPTVBBUSwgUENJX0RFVklDRV9JRF9DT01QQVFfTkVURUwxMDAsCi0JCVBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDEgfSwKLQl7IFBDSV9WRU5ET1JfSURfQ09NUEFRLCBQQ0lfREVWSUNFX0lEX0NPTVBBUV9ORVRGTEVYM0ksCi0JCVBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDIgfSwKLQl7IFBDSV9WRU5ET1JfSURfQ09NUEFRLCBQQ0lfREVWSUNFX0lEX0NPTVBBUV9USFVOREVSLAotCQlQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAzIH0sCi0JeyBQQ0lfVkVORE9SX0lEX0NPTVBBUSwgUENJX0RFVklDRV9JRF9DT01QQVFfTkVURkxFWDNCLAotCQlQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCA0IH0sCi0JeyBQQ0lfVkVORE9SX0lEX0NPTVBBUSwgUENJX0RFVklDRV9JRF9DT01QQVFfTkVURUwxMDBQSSwKLQkJUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgNSB9LAotCXsgUENJX1ZFTkRPUl9JRF9DT01QQVEsIFBDSV9ERVZJQ0VfSURfQ09NUEFRX05FVEVMMTAwRCwKLQkJUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgNiB9LAotCXsgUENJX1ZFTkRPUl9JRF9DT01QQVEsIFBDSV9ERVZJQ0VfSURfQ09NUEFRX05FVEVMMTAwSSwKLQkJUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgNyB9LAotCXsgUENJX1ZFTkRPUl9JRF9PTElDT00sIFBDSV9ERVZJQ0VfSURfT0xJQ09NX09DMjE4MywKLQkJUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgOCB9LAotCXsgUENJX1ZFTkRPUl9JRF9PTElDT00sIFBDSV9ERVZJQ0VfSURfT0xJQ09NX09DMjMyNSwKLQkJUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgOSB9LAotCXsgUENJX1ZFTkRPUl9JRF9PTElDT00sIFBDSV9ERVZJQ0VfSURfT0xJQ09NX09DMjMyNiwKLQkJUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMTAgfSwKLQl7IFBDSV9WRU5ET1JfSURfQ09NUEFRLCBQQ0lfREVWSUNFX0lEX05FVEVMTElHRU5UXzEwXzEwMF9XU181MTAwLAotCQlQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAxMSB9LAotCXsgUENJX1ZFTkRPUl9JRF9DT01QQVEsIFBDSV9ERVZJQ0VfSURfTkVURUxMSUdFTlRfMTBfVDIsCi0JCVBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDEyIH0sCi0JeyAwLH0KLX07Ci1NT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgdGxhbl9wY2lfdGJsKTsJCQotCi1zdGF0aWMgdm9pZAlUTGFuX0Vpc2FQcm9iZSggdm9pZCApOwotc3RhdGljIHZvaWQJVExhbl9FaXNhX0NsZWFudXAoIHZvaWQgKTsKLXN0YXRpYyBpbnQgICAgICBUTGFuX0luaXQoIHN0cnVjdCBuZXRfZGV2aWNlICogKTsKLXN0YXRpYyBpbnQJVExhbl9PcGVuKCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ICk7Ci1zdGF0aWMgaW50CVRMYW5fU3RhcnRUeCggc3RydWN0IHNrX2J1ZmYgKiwgc3RydWN0IG5ldF9kZXZpY2UgKik7Ci1zdGF0aWMgdm9pZAlUTGFuX0hhbmRsZUludGVycnVwdCggaW50LCB2b2lkICosIHN0cnVjdCBwdF9yZWdzICopOwotc3RhdGljIGludAlUTGFuX0Nsb3NlKCBzdHJ1Y3QgbmV0X2RldmljZSAqKTsKLXN0YXRpYyBzdHJ1Y3QJbmV0X2RldmljZV9zdGF0cyAqVExhbl9HZXRTdGF0cyggc3RydWN0IG5ldF9kZXZpY2UgKik7Ci1zdGF0aWMgdm9pZAlUTGFuX1NldE11bHRpY2FzdExpc3QoIHN0cnVjdCBuZXRfZGV2aWNlICopOwotc3RhdGljIGludAlUTGFuX2lvY3RsKCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWZyZXEgKnJxLCBpbnQgY21kKTsKLXN0YXRpYyBpbnQgICAgICBUTGFuX3Byb2JlMSggc3RydWN0IHBjaV9kZXYgKnBkZXYsIGxvbmcgaW9hZGRyLCBpbnQgaXJxLCBpbnQgcmV2LCBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50KTsKLXN0YXRpYyB2b2lkCVRMYW5fdHhfdGltZW91dCggc3RydWN0IG5ldF9kZXZpY2UgKmRldik7Ci1zdGF0aWMgaW50IAl0bGFuX2luaXRfb25lKCBzdHJ1Y3QgcGNpX2RldiAqcGRldiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudCk7Ci0KLXN0YXRpYyB1MzIJVExhbl9IYW5kbGVJbnZhbGlkKCBzdHJ1Y3QgbmV0X2RldmljZSAqLCB1MTYgKTsKLXN0YXRpYyB1MzIJVExhbl9IYW5kbGVUeEVPRiggc3RydWN0IG5ldF9kZXZpY2UgKiwgdTE2ICk7Ci1zdGF0aWMgdTMyCVRMYW5fSGFuZGxlU3RhdE92ZXJmbG93KCBzdHJ1Y3QgbmV0X2RldmljZSAqLCB1MTYgKTsKLXN0YXRpYyB1MzIJVExhbl9IYW5kbGVSeEVPRiggc3RydWN0IG5ldF9kZXZpY2UgKiwgdTE2ICk7Ci1zdGF0aWMgdTMyCVRMYW5fSGFuZGxlRHVtbXkoIHN0cnVjdCBuZXRfZGV2aWNlICosIHUxNiApOwotc3RhdGljIHUzMglUTGFuX0hhbmRsZVR4RU9DKCBzdHJ1Y3QgbmV0X2RldmljZSAqLCB1MTYgKTsKLXN0YXRpYyB1MzIJVExhbl9IYW5kbGVTdGF0dXNDaGVjayggc3RydWN0IG5ldF9kZXZpY2UgKiwgdTE2ICk7Ci1zdGF0aWMgdTMyCVRMYW5fSGFuZGxlUnhFT0MoIHN0cnVjdCBuZXRfZGV2aWNlICosIHUxNiApOwotCi1zdGF0aWMgdm9pZAlUTGFuX1RpbWVyKCB1bnNpZ25lZCBsb25nICk7Ci0KLXN0YXRpYyB2b2lkCVRMYW5fUmVzZXRMaXN0cyggc3RydWN0IG5ldF9kZXZpY2UgKiApOwotc3RhdGljIHZvaWQJVExhbl9GcmVlTGlzdHMoIHN0cnVjdCBuZXRfZGV2aWNlICogKTsKLXN0YXRpYyB2b2lkCVRMYW5fUHJpbnREaW8oIHUxNiApOwotc3RhdGljIHZvaWQJVExhbl9QcmludExpc3QoIFRMYW5MaXN0ICosIGNoYXIgKiwgaW50ICk7Ci1zdGF0aWMgdm9pZAlUTGFuX1JlYWRBbmRDbGVhclN0YXRzKCBzdHJ1Y3QgbmV0X2RldmljZSAqLCBpbnQgKTsKLXN0YXRpYyB2b2lkCVRMYW5fUmVzZXRBZGFwdGVyKCBzdHJ1Y3QgbmV0X2RldmljZSAqICk7Ci1zdGF0aWMgdm9pZAlUTGFuX0ZpbmlzaFJlc2V0KCBzdHJ1Y3QgbmV0X2RldmljZSAqICk7Ci1zdGF0aWMgdm9pZAlUTGFuX1NldE1hYyggc3RydWN0IG5ldF9kZXZpY2UgKiwgaW50IGFyZWcsIGNoYXIgKm1hYyApOwotCi1zdGF0aWMgdm9pZAlUTGFuX1BoeVByaW50KCBzdHJ1Y3QgbmV0X2RldmljZSAqICk7Ci1zdGF0aWMgdm9pZAlUTGFuX1BoeURldGVjdCggc3RydWN0IG5ldF9kZXZpY2UgKiApOwotc3RhdGljIHZvaWQJVExhbl9QaHlQb3dlckRvd24oIHN0cnVjdCBuZXRfZGV2aWNlICogKTsKLXN0YXRpYyB2b2lkCVRMYW5fUGh5UG93ZXJVcCggc3RydWN0IG5ldF9kZXZpY2UgKiApOwotc3RhdGljIHZvaWQJVExhbl9QaHlSZXNldCggc3RydWN0IG5ldF9kZXZpY2UgKiApOwotc3RhdGljIHZvaWQJVExhbl9QaHlTdGFydExpbmsoIHN0cnVjdCBuZXRfZGV2aWNlICogKTsKLXN0YXRpYyB2b2lkCVRMYW5fUGh5RmluaXNoQXV0b05lZyggc3RydWN0IG5ldF9kZXZpY2UgKiApOwotI2lmZGVmIE1PTklUT1IKLXN0YXRpYyB2b2lkICAgICBUTGFuX1BoeU1vbml0b3IoIHN0cnVjdCBuZXRfZGV2aWNlICogKTsKLSNlbmRpZgotCi0vKgotc3RhdGljIGludAlUTGFuX1BoeU5vcCggc3RydWN0IG5ldF9kZXZpY2UgKiApOwotc3RhdGljIGludAlUTGFuX1BoeUludGVybmFsQ2hlY2soIHN0cnVjdCBuZXRfZGV2aWNlICogKTsKLXN0YXRpYyBpbnQJVExhbl9QaHlJbnRlcm5hbFNlcnZpY2UoIHN0cnVjdCBuZXRfZGV2aWNlICogKTsKLXN0YXRpYyBpbnQJVExhbl9QaHlEcDgzODQwYUNoZWNrKCBzdHJ1Y3QgbmV0X2RldmljZSAqICk7Ci0qLwotCi1zdGF0aWMgaW50CVRMYW5fTWlpUmVhZFJlZyggc3RydWN0IG5ldF9kZXZpY2UgKiwgdTE2LCB1MTYsIHUxNiAqICk7Ci1zdGF0aWMgdm9pZAlUTGFuX01paVNlbmREYXRhKCB1MTYsIHUzMiwgdW5zaWduZWQgKTsKLXN0YXRpYyB2b2lkCVRMYW5fTWlpU3luYyggdTE2ICk7Ci1zdGF0aWMgdm9pZAlUTGFuX01paVdyaXRlUmVnKCBzdHJ1Y3QgbmV0X2RldmljZSAqLCB1MTYsIHUxNiwgdTE2ICk7Ci0KLXN0YXRpYyB2b2lkCVRMYW5fRWVTZW5kU3RhcnQoIHUxNiApOwotc3RhdGljIGludAlUTGFuX0VlU2VuZEJ5dGUoIHUxNiwgdTgsIGludCApOwotc3RhdGljIHZvaWQJVExhbl9FZVJlY2VpdmVCeXRlKCB1MTYsIHU4ICosIGludCApOwotc3RhdGljIGludAlUTGFuX0VlUmVhZEJ5dGUoIHN0cnVjdCBuZXRfZGV2aWNlICosIHU4LCB1OCAqICk7Ci0KLXN0YXRpYyBUTGFuSW50VmVjdG9yRnVuYyAqVExhbkludFZlY3RvcltUTEFOX0lOVF9OVU1CRVJfT0ZfSU5UU10gPSB7Ci0JVExhbl9IYW5kbGVJbnZhbGlkLAotCVRMYW5fSGFuZGxlVHhFT0YsCi0JVExhbl9IYW5kbGVTdGF0T3ZlcmZsb3csCi0JVExhbl9IYW5kbGVSeEVPRiwKLQlUTGFuX0hhbmRsZUR1bW15LAotCVRMYW5fSGFuZGxlVHhFT0MsCi0JVExhbl9IYW5kbGVTdGF0dXNDaGVjaywKLQlUTGFuX0hhbmRsZVJ4RU9DCi19OwotCi1zdGF0aWMgaW5saW5lIHZvaWQKLVRMYW5fU2V0VGltZXIoIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUzMiB0aWNrcywgdTMyIHR5cGUgKQotewotCVRMYW5Qcml2YXRlSW5mbyAqcHJpdiA9IGRldi0+cHJpdjsKLQl1bnNpZ25lZCBsb25nIGZsYWdzID0gMDsKLQkKLQlpZiAoIWluX2lycSgpKQotCQlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwotCWlmICggcHJpdi0+dGltZXIuZnVuY3Rpb24gIT0gTlVMTCAmJgotCQlwcml2LT50aW1lclR5cGUgIT0gVExBTl9USU1FUl9BQ1RJVklUWSApIHsgCi0JCWlmICghaW5faXJxKCkpCi0JCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5sb2NrLCBmbGFncyk7Ci0JCXJldHVybjsKLQl9Ci0JcHJpdi0+dGltZXIuZnVuY3Rpb24gPSAmVExhbl9UaW1lcjsKLQlpZiAoIWluX2lycSgpKQotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5sb2NrLCBmbGFncyk7Ci0KLQlwcml2LT50aW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpIGRldjsKLQlwcml2LT50aW1lclNldEF0ID0gamlmZmllczsKLQlwcml2LT50aW1lclR5cGUgPSB0eXBlOwotCW1vZF90aW1lcigmcHJpdi0+dGltZXIsIGppZmZpZXMgKyB0aWNrcyk7Ci0JCi19IC8qIFRMYW5fU2V0VGltZXIgKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotCVRodW5kZXJMQU4gRHJpdmVyIFByaW1hcnkgRnVuY3Rpb25zCi0KLQlUaGVzZSBmdW5jdGlvbnMgYXJlIG1vcmUgb3IgbGVzcyBjb21tb24gdG8gYWxsIExpbnV4IG5ldHdvcmsgZHJpdmVycy4KLQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkgKgl0bGFuX3JlbW92ZV9vbmUKLQkgKgotCSAqCVJldHVybnM6Ci0JICoJCU5vdGhpbmcKLQkgKglQYXJtczoKLQkgKgkJTm9uZQotCSAqCi0JICoJR29lcyB0aHJvdWdoIHRoZSBUTGFuRGV2aWNlcyBsaXN0IGFuZCBmcmVlcyB0aGUgZGV2aWNlCi0JICoJc3RydWN0cyBhbmQgbWVtb3J5IGFzc29jaWF0ZWQgd2l0aCBlYWNoIGRldmljZSAobGlzdHMKLQkgKglhbmQgYnVmZmVycykuICBJdCBhbHNvIHVyZXNlcnZlcyB0aGUgSU8gcG9ydCByZWdpb25zCi0JICoJYXNzb2NpYXRlZCB3aXRoIHRoaXMgZGV2aWNlLgotCSAqCi0JICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdGF0aWMgdm9pZCBfX2RldmV4aXQgdGxhbl9yZW1vdmVfb25lKCBzdHJ1Y3QgcGNpX2RldiAqcGRldikKLXsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gcGNpX2dldF9kcnZkYXRhKCBwZGV2ICk7Ci0JVExhblByaXZhdGVJbmZvCSpwcml2ID0gZGV2LT5wcml2OwotCQotCXVucmVnaXN0ZXJfbmV0ZGV2KCBkZXYgKTsKLQotCWlmICggcHJpdi0+ZG1hU3RvcmFnZSApIHsKLQkJa2ZyZWUoIHByaXYtPmRtYVN0b3JhZ2UgKTsKLQl9Ci0KLQlyZWxlYXNlX3JlZ2lvbiggZGV2LT5iYXNlX2FkZHIsIDB4MTAgKTsKLQkKLQlrZnJlZSggZGV2ICk7Ci0JCQotCXBjaV9zZXRfZHJ2ZGF0YSggcGRldiwgTlVMTCApOwotfSAKLQotc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIHRsYW5fZHJpdmVyID0gewotCW5hbWU6CQkidGxhbiIsCi0JaWRfdGFibGU6CXRsYW5fcGNpX3RibCwKLQlwcm9iZToJCXRsYW5faW5pdF9vbmUsCi0JcmVtb3ZlOgkJdGxhbl9yZW1vdmVfb25lLAkKLX07Ci0KLXN0YXRpYyBpbnQgX19pbml0IHRsYW5fcHJvYmUodm9pZCkKLXsKLQlzdGF0aWMgaW50CXBhZF9hbGxvY2F0ZWQ7Ci0JCi0JcHJpbnRrKEtFUk5fSU5GTyAiJXMiLCB0bGFuX2Jhbm5lcik7Ci0JCi0JVExhblBhZEJ1ZmZlciA9ICh1OCAqKSBrbWFsbG9jKFRMQU5fTUlOX0ZSQU1FX1NJWkUsIAotCQkJCQlHRlBfS0VSTkVMKTsKLQotCWlmIChUTGFuUGFkQnVmZmVyID09IE5VTEwpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJUTEFOOiBDb3VsZCBub3QgYWxsb2NhdGUgbWVtb3J5IGZvciBwYWQgYnVmZmVyLlxuIik7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQotCW1lbXNldChUTGFuUGFkQnVmZmVyLCAwLCBUTEFOX01JTl9GUkFNRV9TSVpFKTsKLQlwYWRfYWxsb2NhdGVkID0gMTsKLQotCVRMQU5fREJHKFRMQU5fREVCVUdfUFJPQkUsICJTdGFydGluZyBQQ0kgUHJvYmUuLi4uXG4iKTsKLQkKLQkvKiBVc2UgbmV3IHN0eWxlIFBDSSBwcm9iaW5nLiBOb3cgdGhlIGtlcm5lbCB3aWxsCi0JICAgZG8gbW9zdCBvZiB0aGlzIGZvciB1cyAqLwotCXBjaV9yZWdpc3Rlcl9kcml2ZXIoJnRsYW5fZHJpdmVyKTsKLQotCVRMQU5fREJHKFRMQU5fREVCVUdfUFJPQkUsICJTdGFydGluZyBFSVNBIFByb2JlLi4uLlxuIik7Ci0JVExhbl9FaXNhUHJvYmUoKTsKLQkJCi0JcHJpbnRrKEtFUk5fSU5GTyAiVExBTjogJWQgZGV2aWNlJXMgaW5zdGFsbGVkLCBQQ0k6ICVkICBFSVNBOiAlZFxuIiwgCi0JCSBUTGFuRGV2aWNlc0luc3RhbGxlZCwgVExhbkRldmljZXNJbnN0YWxsZWQgPT0gMSA/ICIiIDogInMiLAotCQkgdGxhbl9oYXZlX3BjaSwgdGxhbl9oYXZlX2Vpc2EpOwotCi0JaWYgKFRMYW5EZXZpY2VzSW5zdGFsbGVkID09IDApIHsKLQkJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZ0bGFuX2RyaXZlcik7Ci0JCWtmcmVlKFRMYW5QYWRCdWZmZXIpOwotCQlyZXR1cm4gLUVOT0RFVjsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0JCi0KLXN0YXRpYyBpbnQgX19kZXZpbml0IHRsYW5faW5pdF9vbmUoIHN0cnVjdCBwY2lfZGV2ICpwZGV2LAotCQkJCSAgICBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50KQotewotCXJldHVybiBUTGFuX3Byb2JlMSggcGRldiwgLTEsIC0xLCAwLCBlbnQpOwotfQotCi0vKgotCSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCSAqCXRsYW5fcHJvYmUxCi0JICoKLQkgKglSZXR1cm5zOgotCSAqCQkwIG9uIHN1Y2Nlc3MsIGVycm9yIGNvZGUgb24gZXJyb3IKLQkgKglQYXJtczogCi0JICoJCW5vbmUKLQkgKgotCSAqCVRoZSBuYW1lIGlzIGxvd2VyIGNhc2UgdG8gZml0IGluIHdpdGggYWxsIHRoZSByZXN0IG9mCi0JICoJdGhlIG5ldGNhcmRfcHJvYmUgbmFtZXMuICBUaGlzIGZ1bmN0aW9uIGxvb2tzIGZvciAKLQkgKglhbm90aGVyIFRMYW4gYmFzZWQgYWRhcHRlciwgc2V0dGluZyBpdCB1cCB3aXRoIHRoZQotCSAqCWFsbG9jYXRlZCBkZXZpY2Ugc3RydWN0IGlmIG9uZSBpcyBmb3VuZC4KLQkgKgl0bGFuX3Byb2JlIGhhcyBiZWVuIHBvcnRlZCB0byB0aGUgbmV3IG5ldCBBUEkgYW5kCi0JICoJbm93IGFsbG9jYXRlcyBpdHMgb3duIGRldmljZSBzdHJ1Y3R1cmUuIFRoaXMgZnVuY3Rpb24KLQkgKglpcyBhbHNvIHVzZWQgYnkgbW9kdWxlcy4KLQkgKgotCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RhdGljIGludCBfX2RldmluaXQgVExhbl9wcm9iZTEoc3RydWN0IHBjaV9kZXYgKnBkZXYsIAotCQkJCWxvbmcgaW9hZGRyLCBpbnQgaXJxLCBpbnQgcmV2LCBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50ICkKLXsKLQotCXN0cnVjdCBuZXRfZGV2aWNlICAqZGV2OwotCVRMYW5Qcml2YXRlSW5mbyAgICAqcHJpdjsKLQl1OAkJICAgcGNpX3JldjsKLQl1MTYJCSAgIGRldmljZV9pZDsKLQlpbnQJCSAgIHJlZzsKLQotCWlmIChwZGV2ICYmIHBjaV9lbmFibGVfZGV2aWNlKHBkZXYpKQotCQlyZXR1cm4gLUVJTzsKLQotCWRldiA9IGluaXRfZXRoZXJkZXYoTlVMTCwgc2l6ZW9mKFRMYW5Qcml2YXRlSW5mbykpOwotCWlmIChkZXYgPT0gTlVMTCkgewotCQlwcmludGsoS0VSTl9FUlIgIlRMQU46IENvdWxkIG5vdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIGRldmljZS5cbiIpOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0JU0VUX01PRFVMRV9PV05FUihkZXYpOwotCQotCXByaXYgPSBkZXYtPnByaXY7Ci0KLQkvKiBJcyB0aGlzIGEgUENJIGRldmljZT8gKi8KLQlpZiAocGRldikgewotCQl1MzIgCQkgICBwY2lfaW9fYmFzZSA9IDA7Ci0KLQkJcHJpdi0+YWRhcHRlciA9ICZib2FyZF9pbmZvW2VudC0+ZHJpdmVyX2RhdGFdOwotCi0JCXBjaV9yZWFkX2NvbmZpZ19ieXRlICggcGRldiwgUENJX1JFVklTSU9OX0lELCAmcGNpX3Jldik7Ci0KLQkJZm9yICggcmVnPSAwOyByZWcgPD0gNTsgcmVnICsrICkgewotCQkJaWYgKHBjaV9yZXNvdXJjZV9mbGFncyhwZGV2LCByZWcpICYgSU9SRVNPVVJDRV9JTykgewotCQkJCXBjaV9pb19iYXNlID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIHJlZyk7Ci0JCQkJVExBTl9EQkcoIFRMQU5fREVCVUdfR05STCwgIklPIG1hcHBpbmcgaXMgYXZhaWxhYmxlIGF0ICV4LlxuIiwKLQkJCQkJCXBjaV9pb19iYXNlKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlpZiAoIXBjaV9pb19iYXNlKSB7Ci0JCQlwcmludGsoS0VSTl9FUlIgIlRMQU46IE5vIElPIG1hcHBpbmdzIGF2YWlsYWJsZVxuIik7Ci0JCQl1bnJlZ2lzdGVyX25ldGRldihkZXYpOwotCQkJa2ZyZWUoZGV2KTsKLQkJCXJldHVybiAtRU5PREVWOwotCQl9Ci0JCQotCQlkZXYtPmJhc2VfYWRkciA9IHBjaV9pb19iYXNlOwotCQlkZXYtPmlycSA9IHBkZXYtPmlycTsKLQkJcHJpdi0+YWRhcHRlclJldiA9IHBjaV9yZXY7IAotCQlwY2lfc2V0X21hc3RlcihwZGV2KTsKLQkJcGNpX3NldF9kcnZkYXRhKHBkZXYsIGRldik7Ci0KLQl9IGVsc2UJeyAgICAgLyogRUlTQSBjYXJkICovCi0JCS8qIFRoaXMgaXMgYSBoYWNrLiBXZSBuZWVkIHRvIGtub3cgd2hpY2ggYm9hcmQgc3RydWN0dXJlCi0JCSAqIGlzIHN1aXRlZCBmb3IgdGhpcyBhZGFwdGVyICovCi0JCWRldmljZV9pZCA9IGludyhpb2FkZHIgKyBFSVNBX0lEMik7Ci0JCXByaXYtPmlzX2Vpc2EgPSAxOwotCQlpZiAoZGV2aWNlX2lkID09IDB4MjBGMSkgewotCQkJcHJpdi0+YWRhcHRlciA9ICZib2FyZF9pbmZvWzEzXTsgCS8qIE5ldEZsZXgtMy9FICovCi0JCQlwcml2LT5hZGFwdGVyUmV2ID0gMjM7CQkJLyogVExBTiAyLjMgKi8KLQkJfSBlbHNlIHsKLQkJCXByaXYtPmFkYXB0ZXIgPSAmYm9hcmRfaW5mb1sxNF07Ci0JCQlwcml2LT5hZGFwdGVyUmV2ID0gMTA7CQkJLyogVExBTiAxLjAgKi8KLQkJfQotCQlkZXYtPmJhc2VfYWRkciA9IGlvYWRkcjsKLQkJZGV2LT5pcnEgPSBpcnE7Ci0JfQotCi0JLyogS2VybmVsIHBhcmFtZXRlcnMgKi8KLQlpZiAoZGV2LT5tZW1fc3RhcnQpIHsKLQkJcHJpdi0+YXVpICAgID0gZGV2LT5tZW1fc3RhcnQgJiAweDAxOwotCQlwcml2LT5kdXBsZXggPSAoKGRldi0+bWVtX3N0YXJ0ICYgMHgwNikgPT0gMHgwNikgPyAwIDogKGRldi0+bWVtX3N0YXJ0ICYgMHgwNikgPj4gMTsKLQkJcHJpdi0+c3BlZWQgID0gKChkZXYtPm1lbV9zdGFydCAmIDB4MTgpID09IDB4MTgpID8gMCA6IChkZXYtPm1lbV9zdGFydCAmIDB4MTgpID4+IDM7Ci0JCi0JCWlmIChwcml2LT5zcGVlZCA9PSAweDEpIHsKLQkJCXByaXYtPnNwZWVkID0gVExBTl9TUEVFRF8xMDsKLQkJfSBlbHNlIGlmIChwcml2LT5zcGVlZCA9PSAweDIpIHsKLQkJCXByaXYtPnNwZWVkID0gVExBTl9TUEVFRF8xMDA7Ci0JCX0KLQkJZGVidWcgPSBwcml2LT5kZWJ1ZyA9IGRldi0+bWVtX2VuZDsKLQl9IGVsc2UgewotCQlwcml2LT5hdWkgICAgPSBhdWlbYm9hcmRzX2ZvdW5kXTsKLQkJcHJpdi0+c3BlZWQgID0gc3BlZWRbYm9hcmRzX2ZvdW5kXTsKLQkJcHJpdi0+ZHVwbGV4ID0gZHVwbGV4W2JvYXJkc19mb3VuZF07Ci0JCXByaXYtPmRlYnVnID0gZGVidWc7Ci0JfQotCQotCS8qIFRoaXMgd2lsbCBiZSB1c2VkIHdoZW4gd2UgZ2V0IGFuIGFkYXB0ZXIgZXJyb3IgZnJvbQotCSAqIHdpdGhpbiBvdXIgaXJxIGhhbmRsZXIgKi8KLQlJTklUX0xJU1RfSEVBRCgmcHJpdi0+dGxhbl90cXVldWUubGlzdCk7Ci0JcHJpdi0+dGxhbl90cXVldWUuc3luYyA9IDA7Ci0JcHJpdi0+dGxhbl90cXVldWUucm91dGluZSA9ICh2b2lkICopKHZvaWQqKVRMYW5fdHhfdGltZW91dDsKLQlwcml2LT50bGFuX3RxdWV1ZS5kYXRhID0gZGV2OwotCi0Jc3Bpbl9sb2NrX2luaXQoJnByaXYtPmxvY2spOwotCQotCWlmIChUTGFuX0luaXQoZGV2KSkgewotCQlwcmludGsoS0VSTl9FUlIgIlRMQU46IENvdWxkIG5vdCByZWdpc3RlciBkZXZpY2UuXG4iKTsKLQkJdW5yZWdpc3Rlcl9uZXRkZXYoZGV2KTsKLQkJa2ZyZWUoZGV2KTsKLQkJcmV0dXJuIC1FQUdBSU47Ci0JfSBlbHNlIHsKLQkKLQlUTGFuRGV2aWNlc0luc3RhbGxlZCsrOwotCWJvYXJkc19mb3VuZCsrOwotCQotCS8qIHBkZXYgaXMgTlVMTCBpZiB0aGlzIGlzIGFuIEVJU0EgZGV2aWNlICovCi0JaWYgKHBkZXYpCi0JCXRsYW5faGF2ZV9wY2krKzsKLQllbHNlIHsKLQkJcHJpdi0+bmV4dERldmljZSA9IFRMYW5fRWlzYV9EZXZpY2VzOwotCQlUTGFuX0Vpc2FfRGV2aWNlcyA9IGRldjsKLQkJdGxhbl9oYXZlX2Vpc2ErKzsKLQl9Ci0JCi0JcHJpbnRrKEtFUk5fSU5GTyAiVExBTjogJXMgaXJxPSUyZCwgaW89JTA0eCwgJXMsIFJldi4gJWRcbiIsCi0JCQlkZXYtPm5hbWUsCi0JCQkoaW50KSBkZXYtPmlycSwKLQkJCShpbnQpIGRldi0+YmFzZV9hZGRyLAotCQkJcHJpdi0+YWRhcHRlci0+ZGV2aWNlTGFiZWwsCi0JCQlwcml2LT5hZGFwdGVyUmV2KTsKLQlyZXR1cm4gMDsKLQl9Ci0KLX0KK30JLyogVExhbl9GaW5pc2hSZXNldCAqLwogCi1zdGF0aWMgdm9pZCBUTGFuX0Vpc2FfQ2xlYW51cCh2b2lkKQotewotCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7Ci0JVExhblByaXZhdGVJbmZvICpwcml2OwotCQotCXdoaWxlKCB0bGFuX2hhdmVfZWlzYSApIHsKLQkJZGV2ID0gVExhbl9FaXNhX0RldmljZXM7Ci0JCXByaXYgPSBkZXYtPnByaXY7Ci0JCWlmIChwcml2LT5kbWFTdG9yYWdlKSB7Ci0JCQlrZnJlZShwcml2LT5kbWFTdG9yYWdlKTsKLQkJfQotCQlyZWxlYXNlX3JlZ2lvbiggZGV2LT5iYXNlX2FkZHIsIDB4MTApOwotCQl1bnJlZ2lzdGVyX25ldGRldiggZGV2ICk7Ci0JCVRMYW5fRWlzYV9EZXZpY2VzID0gcHJpdi0+bmV4dERldmljZTsKLQkJa2ZyZWUoIGRldiApOwotCQl0bGFuX2hhdmVfZWlzYS0tOwotCX0KLX0KLQkKLQkJCi1zdGF0aWMgdm9pZCBfX2V4aXQgdGxhbl9leGl0KHZvaWQpCi17Ci0JcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZ0bGFuX2RyaXZlcik7Ci0KLQlpZiAodGxhbl9oYXZlX2Vpc2EpCi0JCVRMYW5fRWlzYV9DbGVhbnVwKCk7Ci0KLQlrZnJlZSggVExhblBhZEJ1ZmZlciApOwotCi19Ci0KLS8qIE1vZHVsZSBsb2FkaW5nL3VubG9hZGluZyAqLwotbW9kdWxlX2luaXQodGxhbl9wcm9iZSk7Ci1tb2R1bGVfZXhpdCh0bGFuX2V4aXQpOwotCi0JLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JICogCVRMYW5fRWlzYVByb2JlCi0JICoKLQkgKiAgCVJldHVybnM6IDAgb24gc3VjY2VzcywgMSBvdGhlcndpc2UKLQkgKgotCSAqICAJUGFybXM6CSBOb25lCi0JICoKLQkgKgotCSAqICAJVGhpcyBmdW5jdGlvbnMgcHJvYmVzIGZvciBFSVNBIGRldmljZXMgYW5kIGNhbGxzIAotCSAqICAJVExhbl9wcm9iZTEgd2hlbiBvbmUgaXMgZm91bmQuIAotCSAqCi0JICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0YXRpYyB2b2lkICBfX2luaXQgVExhbl9FaXNhUHJvYmUgKHZvaWQpIAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitQT0xMIC0gV2FpdCBmb3IgYSBmcmFtZQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludCB0bGFuX3BvbGwoc3RydWN0IG5pYyAqbmljLCBpbnQgcmV0cmlldmUpCiB7Ci0JbG9uZyAJaW9hZGRyOwotCWludCAJcmMgPSAtRU5PREVWOwotCWludCAJaXJxOwotCXUxNglkZXZpY2VfaWQ7Ci0KLQlpZiAoIUVJU0FfYnVzKSB7CQotCQlUTEFOX0RCRyhUTEFOX0RFQlVHX1BST0JFLCAiTm8gRUlTQSBidXMgcHJlc2VudFxuIik7Ci0JCXJldHVybjsKLQl9Ci0JCi0JLyogTG9vcCB0aHJvdWdoIGFsbCBzbG90cyBvZiB0aGUgRUlTQSBidXMgKi8KLQlmb3IgKGlvYWRkciA9IDB4MTAwMDsgaW9hZGRyIDwgMHg5MDAwOyBpb2FkZHIgKz0gMHgxMDAwKSB7Ci0JCQotCVRMQU5fREJHKFRMQU5fREVCVUdfUFJPQkUsIkVJU0FfSUQgMHglNHg6IDB4JTR4XG4iLCAoaW50KSBpb2FkZHIgKyAweEM4MCwgaW53KGlvYWRkciArIEVJU0FfSUQpKTsJCi0JVExBTl9EQkcoVExBTl9ERUJVR19QUk9CRSwiRUlTQV9JRCAweCU0eDogMHglNHhcbiIsIChpbnQpIGlvYWRkciArIDB4QzgyLCBpbncoaW9hZGRyICsgRUlTQV9JRDIpKTsKKwkvKiByZXR1cm4gdHJ1ZSBpZiB0aGVyZSdzIGFuIGV0aGVybmV0IHBhY2tldCByZWFkeSB0byByZWFkICovCisJLyogbmljLT5wYWNrZXQgc2hvdWxkIGNvbnRhaW4gZGF0YSBvbiByZXR1cm4gKi8KKwkvKiBuaWMtPnBhY2tldGxlbiBzaG91bGQgY29udGFpbiBsZW5ndGggb2YgZGF0YSAqLworCXUzMiBmcmFtZXNpemU7CisJdTMyIGhvc3RfY21kID0gMDsKKwl1MzIgYWNrID0gMTsKKwlpbnQgZW9jID0gMDsKKwlpbnQgZW50cnkgPSBwcml2LT5jdXJfcnggJSBUTEFOX05VTV9SWF9MSVNUUzsKKwl1MTYgdG1wQ1N0YXQgPSBsZTMyX3RvX2NwdShyeF9yaW5nW2VudHJ5XS5jU3RhdCk7CisJdTE2IGhvc3RfaW50ID0gaW53KEJBU0UgKyBUTEFOX0hPU1RfSU5UKTsKIAotCQlUTEFOX0RCRyhUTEFOX0RFQlVHX1BST0JFLCAiUHJvYmluZyBmb3IgRUlTQSBhZGFwdGVyIGF0IElPOiAweCU0eCA6ICIsCi0JCQkJICAgCShpbnQpIGlvYWRkcik7Ci0JCWlmIChyZXF1ZXN0X3JlZ2lvbihpb2FkZHIsIDB4MTAsIFRMYW5TaWduYXR1cmUpID09IE5VTEwpIAotCQkJZ290byBvdXQ7Ci0KLQkJaWYgKGludyhpb2FkZHIgKyBFSVNBX0lEKSAhPSAweDExMEUpIHsJCQotCQkJcmVsZWFzZV9yZWdpb24oaW9hZGRyLCAweDEwKTsKLQkJCWdvdG8gb3V0OwotCQl9Ci0JCQotCQlkZXZpY2VfaWQgPSBpbncoaW9hZGRyICsgRUlTQV9JRDIpOwotCQlpZiAoZGV2aWNlX2lkICE9ICAweDIwRjEgJiYgZGV2aWNlX2lkICE9IDB4NDBGMSkgeyAJCQotCQkJcmVsZWFzZV9yZWdpb24gKGlvYWRkciwgMHgxMCk7Ci0JCQlnb3RvIG91dDsKLQkJfQotCQkKLQkgCWlmIChpbmIoaW9hZGRyICsgRUlTQV9DUikgIT0gMHgxKSB7IAkvKiBDaGVjayBpZiBhZGFwdGVyIGlzIGVuYWJsZWQgKi8KLQkJCXJlbGVhc2VfcmVnaW9uIChpb2FkZHIsIDB4MTApOwotCQkJZ290byBvdXQyOwotCQl9Ci0JCQotCQlpZiAoZGVidWcgPT0gMHgxMCkJCQotCQkJcHJpbnRrKCJGb3VuZCBvbmVcbiIpOworCWlmICgodG1wQ1N0YXQgJiBUTEFOX0NTVEFUX0ZSTV9DTVApICYmICFyZXRyaWV2ZSkKKwkgIHJldHVybiAxOwogCi0JCS8qIEdldCBpcnEgZnJvbSBib2FyZCAqLwotCQlzd2l0Y2ggKGluYihpb2FkZHIgKyAweENDMCkpIHsKLQkJCWNhc2UoMHgxMCk6Ci0JCQkJaXJxPTU7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlKDB4MjApOgotCQkJCWlycT05OwotCQkJCWJyZWFrOwotCQkJY2FzZSgweDQwKToKLQkJCQlpcnE9MTA7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlKDB4ODApOgotCQkJCWlycT0xMTsKLQkJCQlicmVhazsKLQkJCWRlZmF1bHQ6Ci0JCQkJZ290byBvdXQ7Ci0JCX0gICAgICAgICAgICAgICAKLQkJCi0JCQotCQkvKiBTZXR1cCB0aGUgbmV3bHkgZm91bmQgZWlzYSBhZGFwdGVyICovCi0JCXJjID0gVExhbl9wcm9iZTEoIE5VTEwsIGlvYWRkciwgaXJxLAotCQkJCQkxMiwgTlVMTCk7Ci0JCWNvbnRpbnVlOwotCQkKLQkJb3V0OgotCQkJaWYgKGRlYnVnID09IDB4MTApCi0JCQkJcHJpbnRrKCJOb25lIGZvdW5kXG4iKTsKLQkJCWNvbnRpbnVlOwotCi0JCW91dDI6CWlmIChkZWJ1ZyA9PSAweDEwKQotCQkJCXByaW50aygiQ2FyZCBmb3VuZCBidXQgaXQgaXMgbm90IGVuYWJsZWQsIHNraXBwaW5nXG4iKTsKLQkJCWNvbnRpbnVlOwotCQkKLQl9CisJb3V0dyhob3N0X2ludCwgQkFTRSArIFRMQU5fSE9TVF9JTlQpOwogCi19IC8qIFRMYW5fRWlzYVByb2JlICovCisJaWYgKCEodG1wQ1N0YXQgJiBUTEFOX0NTVEFUX0ZSTV9DTVApKQorCQlyZXR1cm4gMDsKIAotCQorCS8qIHByaW50ZigiUEktMTogMHglaFhcbiIsIGhvc3RfaW50KTsgKi8KKwlpZiAodG1wQ1N0YXQgJiBUTEFOX0NTVEFUX0VPQykKKwkJZW9jID0gMTsKIAotCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkgKglUTGFuX0luaXQKLQkgKgotCSAqCVJldHVybnM6Ci0JICoJCTAgb24gc3VjY2VzcywgZXJyb3IgY29kZSBvdGhlcndpc2UuCi0JICoJUGFybXM6Ci0JICoJCWRldglUaGUgc3RydWN0dXJlIG9mIHRoZSBkZXZpY2UgdG8gYmUKLQkgKgkJCWluaXQnZWQuCi0JICoKLQkgKglUaGlzIGZ1bmN0aW9uIGNvbXBsZXRlcyB0aGUgaW5pdGlhbGl6YXRpb24gb2YgdGhlCi0JICoJZGV2aWNlIHN0cnVjdHVyZSBhbmQgZHJpdmVyLiAgSXQgcmVzZXJ2ZXMgdGhlIElPCi0JICoJYWRkcmVzc2VzLCBhbGxvY2F0ZXMgbWVtb3J5IGZvciB0aGUgbGlzdHMgYW5kIGJvdW5jZQotCSAqCWJ1ZmZlcnMsIHJldHJpZXZlcyB0aGUgTUFDIGFkZHJlc3MgZnJvbSB0aGUgZWVwcm9tCi0JICoJYW5kIGFzc2lnbmVzIHRoZSBkZXZpY2UncyBtZXRob2RzLgotCSAqCQotCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwlmcmFtZXNpemUgPSByeF9yaW5nW2VudHJ5XS5mcmFtZVNpemU7CiAKLXN0YXRpYyBpbnQgVExhbl9Jbml0KCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ICkKLXsKLQlpbnQJCWRtYV9zaXplOwotCWludCAJCWVycjsKLQlpbnQJCWk7Ci0JVExhblByaXZhdGVJbmZvCSpwcml2OworCW5pYy0+cGFja2V0bGVuID0gZnJhbWVzaXplOwogCi0JcHJpdiA9IGRldi0+cHJpdjsKLQkKLQlpZiAoIXByaXYtPmlzX2Vpc2EpCS8qIEVJU0EgZGV2aWNlcyBoYXZlIGFscmVhZHkgcmVxdWVzdGVkIElPICovCi0JCWlmICghcmVxdWVzdF9yZWdpb24oIGRldi0+YmFzZV9hZGRyLCAweDEwLCBUTGFuU2lnbmF0dXJlICkpIHsKLQkJCXByaW50ayhLRVJOX0VSUiAiVExBTjogJXM6IElPIHBvcnQgcmVnaW9uIDB4JWx4IHNpemUgMHgleCBpbiB1c2UuXG4iLAotCQkJCWRldi0+bmFtZSwKLQkJCQlkZXYtPmJhc2VfYWRkciwKLQkJCQkweDEwICk7Ci0JCQlyZXR1cm4gLUVJTzsKKyNpZmRlZiBFQkRFQlVHCisgICAgIHByaW50ZigiLiVkLiIsIGZyYW1lc2l6ZSk7IAorI2VuZGlmCisgICAgIAorCW1lbWNweShuaWMtPnBhY2tldCwgcnhiICsKKwkgICAgICAgKHByaXYtPmN1cl9yeCAqIFRMQU5fTUFYX0ZSQU1FX1NJWkUpLCBuaWMtPnBhY2tldGxlbik7CisKKwlyeF9yaW5nW2VudHJ5XS5jU3RhdCA9IDA7CisjaWZkZWYgRUJERUJVRworCS8vaGV4X2R1bXAobmljLT5wYWNrZXQsIG5pYy0+cGFja2V0bGVuKTsKKwlwcmludGYoIiVkIiwgZW50cnkpOyAgCisjZW5kaWYKKwllbnRyeSA9IChlbnRyeSArIDEpICUgVExBTl9OVU1fUlhfTElTVFM7CisJcHJpdi0+Y3VyX3J4ID0gZW50cnk7CisJaWYgKGVvYykgeworCQlpZiAoKHJ4X3JpbmdbZW50cnldLmNTdGF0ICYgVExBTl9DU1RBVF9SRUFEWSkgPT0KKwkJICAgIFRMQU5fQ1NUQVRfUkVBRFkpIHsKKwkJCWFjayB8PSBUTEFOX0hDX0dPIHwgVExBTl9IQ19SVDsKKwkJCWhvc3RfY21kID0gVExBTl9IQ19BQ0sgfCBhY2sgfCAweDAwMUMwMDAwOworCQkJb3V0bChob3N0X2NtZCwgQkFTRSArIFRMQU5fSE9TVF9DTUQpOwogCQl9Ci0JCi0JaWYgKCBiYnVmICkgewotCQlkbWFfc2l6ZSA9ICggVExBTl9OVU1fUlhfTElTVFMgKyBUTEFOX05VTV9UWF9MSVNUUyApCi0JICAgICAgICAgICAqICggc2l6ZW9mKFRMYW5MaXN0KSArIFRMQU5fTUFYX0ZSQU1FX1NJWkUgKTsKIAl9IGVsc2UgewotCQlkbWFfc2l6ZSA9ICggVExBTl9OVU1fUlhfTElTVFMgKyBUTEFOX05VTV9UWF9MSVNUUyApCi0JICAgICAgICAgICAqICggc2l6ZW9mKFRMYW5MaXN0KSApOwotCX0KLQlwcml2LT5kbWFTdG9yYWdlID0ga21hbGxvYyhkbWFfc2l6ZSwgR0ZQX0tFUk5FTCB8IEdGUF9ETUEpOwotCWlmICggcHJpdi0+ZG1hU3RvcmFnZSA9PSBOVUxMICkgewotCQlwcmludGsoS0VSTl9FUlIgIlRMQU46ICBDb3VsZCBub3QgYWxsb2NhdGUgbGlzdHMgYW5kIGJ1ZmZlcnMgZm9yICVzLlxuIiwKLQkJCWRldi0+bmFtZSApOwotCQlyZWxlYXNlX3JlZ2lvbiggZGV2LT5iYXNlX2FkZHIsIDB4MTAgKTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCW1lbXNldCggcHJpdi0+ZG1hU3RvcmFnZSwgMCwgZG1hX3NpemUgKTsKLQlwcml2LT5yeExpc3QgPSAoVExhbkxpc3QgKikgCi0JCSAgICAgICAoICggKCAodTMyKSBwcml2LT5kbWFTdG9yYWdlICkgKyA3ICkgJiAweEZGRkZGRkY4ICk7Ci0JcHJpdi0+dHhMaXN0ID0gcHJpdi0+cnhMaXN0ICsgVExBTl9OVU1fUlhfTElTVFM7Ci0JaWYgKCBiYnVmICkgewotCQlwcml2LT5yeEJ1ZmZlciA9ICh1OCAqKSAoIHByaXYtPnR4TGlzdCArIFRMQU5fTlVNX1RYX0xJU1RTICk7Ci0JCXByaXYtPnR4QnVmZmVyID0gcHJpdi0+cnhCdWZmZXIKLQkJCQkgKyAoIFRMQU5fTlVNX1JYX0xJU1RTICogVExBTl9NQVhfRlJBTUVfU0laRSApOwotCX0KLQotCWVyciA9IDA7Ci0JZm9yICggaSA9IDA7ICBpIDwgNiA7IGkrKyApCi0JCWVyciB8PSBUTGFuX0VlUmVhZEJ5dGUoIGRldiwKLQkJCQkJKHU4KSBwcml2LT5hZGFwdGVyLT5hZGRyT2ZzICsgaSwKLQkJCQkJKHU4ICopICZkZXYtPmRldl9hZGRyW2ldICk7Ci0JaWYgKCBlcnIgKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiVExBTjogJXM6IEVycm9yIHJlYWRpbmcgTUFDIGZyb20gZWVwcm9tOiAlZFxuIiwKLQkJCWRldi0+bmFtZSwKLQkJCWVyciApOwotCX0KLQlkZXYtPmFkZHJfbGVuID0gNjsKLQkKLQkvKiBEZXZpY2UgbWV0aG9kcyAqLwotCWRldi0+b3BlbiA9ICZUTGFuX09wZW47Ci0JZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSAmVExhbl9TdGFydFR4OwotCWRldi0+c3RvcCA9ICZUTGFuX0Nsb3NlOwotCWRldi0+Z2V0X3N0YXRzID0gJlRMYW5fR2V0U3RhdHM7Ci0JZGV2LT5zZXRfbXVsdGljYXN0X2xpc3QgPSAmVExhbl9TZXRNdWx0aWNhc3RMaXN0OwotCWRldi0+ZG9faW9jdGwgPSAmVExhbl9pb2N0bDsKLQlkZXYtPnR4X3RpbWVvdXQgPSAmVExhbl90eF90aW1lb3V0OwotCWRldi0+d2F0Y2hkb2dfdGltZW8gPSBUWF9USU1FT1VUOwotCi0JcmV0dXJuIDA7Ci0KLX0gLyogVExhbl9Jbml0ICovCi0KLQkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JICoJVExhbl9PcGVuCi0JICoKLQkgKglSZXR1cm5zOgotCSAqCQkwIG9uIHN1Y2Nlc3MsIGVycm9yIGNvZGUgb3RoZXJ3aXNlLgotCSAqCVBhcm1zOgotCSAqCQlkZXYJU3RydWN0dXJlIG9mIGRldmljZSB0byBiZSBvcGVuZWQuCi0JICoKLQkgKglUaGlzIHJvdXRpbmUgcHV0cyB0aGUgZHJpdmVyIGFuZCBUTEFOIGFkYXB0ZXIgaW4gYQotCSAqCXN0YXRlIHdoZXJlIGl0IGlzIHJlYWR5IHRvIHNlbmQgYW5kIHJlY2VpdmUgcGFja2V0cy4KLQkgKglJdCBhbGxvY2F0ZXMgdGhlIElSUSwgcmVzZXRzIGFuZCBicmluZ3MgdGhlIGFkYXB0ZXIKLQkgKglvdXQgb2YgcmVzZXQsIGFuZCBhbGxvd3MgaW50ZXJydXB0cy4gIEl0IGFsc28gZGVsYXlzCi0JICoJdGhlIHN0YXJ0dXAgZm9yIGF1dG9uZWdvdGlhdGlvbiBvciBzZW5kcyBhIFJ4IEdPCi0JICoJY29tbWFuZCB0byB0aGUgYWRhcHRlciwgYXMgYXBwcm9wcmlhdGUuCi0JICoKLQkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0YXRpYyBpbnQgVExhbl9PcGVuKCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ICkKLXsKLQlUTGFuUHJpdmF0ZUluZm8JKnByaXYgPSBkZXYtPnByaXY7Ci0JaW50CQllcnI7Ci0JCi0JcHJpdi0+dGxhblJldiA9IFRMYW5fRGlvUmVhZDgoIGRldi0+YmFzZV9hZGRyLCBUTEFOX0RFRl9SRVZJU0lPTiApOwotCWVyciA9IHJlcXVlc3RfaXJxKCBkZXYtPmlycSwgVExhbl9IYW5kbGVJbnRlcnJ1cHQsIFNBX1NISVJRLCBUTGFuU2lnbmF0dXJlLCBkZXYgKTsKLQkKLQlpZiAoIGVyciApIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJUTEFOOiAgQ2Fubm90IG9wZW4gJXMgYmVjYXVzZSBJUlEgJWQgaXMgYWxyZWFkeSBpbiB1c2UuXG4iLCBkZXYtPm5hbWUsIGRldi0+aXJxICk7Ci0JCXJldHVybiBlcnI7CisJCWhvc3RfY21kID0gVExBTl9IQ19BQ0sgfCBhY2sgfCAoMHgwMDBDMDAwMCk7CisJCW91dGwoaG9zdF9jbWQsIEJBU0UgKyBUTEFOX0hPU1RfQ01EKTsKKyNpZmRlZiBFQkRFQlVHCisJCXByaW50ZigiQUM6IDB4JWhYXG4iLCBpbncoQkFTRSArIFRMQU5fQ0hfUEFSTSkpOyAKKwkJaG9zdF9pbnQgPSBpbncoQkFTRSArIFRMQU5fSE9TVF9JTlQpOworCQlwcmludGYoIlBJLTI6IDB4JWhYXG4iLCBob3N0X2ludCk7IAorI2VuZGlmCiAJfQotCQotCWluaXRfdGltZXIoJnByaXYtPnRpbWVyKTsKLQluZXRpZl9zdGFydF9xdWV1ZShkZXYpOwotCQotCS8qIE5PVEU6IEl0IG1pZ2h0IG5vdCBiZSBuZWNlc3NhcnkgdG8gcmVhZCB0aGUgc3RhdHMgYmVmb3JlIGEKLQkJCSByZXNldCBpZiB5b3UgZG9uJ3QgY2FyZSB3aGF0IHRoZSB2YWx1ZXMgYXJlLgotCSovCi0JVExhbl9SZXNldExpc3RzKCBkZXYgKTsKLQlUTGFuX1JlYWRBbmRDbGVhclN0YXRzKCBkZXYsIFRMQU5fSUdOT1JFICk7Ci0JVExhbl9SZXNldEFkYXB0ZXIoIGRldiApOwotCi0JVExBTl9EQkcoIFRMQU5fREVCVUdfR05STCwgIiVzOiBPcGVuZWQuICBUTEFOIENoaXAgUmV2OiAleFxuIiwgZGV2LT5uYW1lLCBwcml2LT50bGFuUmV2ICk7Ci0KLQlyZXR1cm4gMDsKLQotfSAvKiBUTGFuX09wZW4gKi8KLQotCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCSAqCVRMYW5faW9jdGwKLQkgKgkKLQkgKglSZXR1cm5zOgotCSAqCQkwIG9uIHN1Y2Nlc3MsIGVycm9yIGNvZGUgb3RoZXJ3aXNlCi0JICoJUGFyYW1zOgotCSAqCQlkZXYJc3RydWN0dXJlIG9mIGRldmljZSB0byByZWNlaXZlIGlvY3RsLgotCSAqCQkKLQkgKgkJcnEJaWZyZXEgc3RydWN0dXJlIHRvIGhvbGQgdXNlcnNwYWNlIGRhdGEuCi0JICoKLQkgKgkJY21kCWlvY3RsIGNvbW1hbmQuCi0JICoKLQkgKgotCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCXJlZmlsbF9yeChuaWMpOworCXJldHVybiAoMSk7CQkvKiBpbml0aWFsbHkgYXMgdGhpcyBpcyBjYWxsZWQgdG8gZmx1c2ggdGhlIGlucHV0ICovCit9CiAKLXN0YXRpYyBpbnQgVExhbl9pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWZyZXEgKnJxLCBpbnQgY21kKQorc3RhdGljIHZvaWQgcmVmaWxsX3J4KHN0cnVjdCBuaWMgKm5pYyBfX3VudXNlZCkKIHsKLQlUTGFuUHJpdmF0ZUluZm8gKnByaXYgPSBkZXYtPnByaXY7Ci0Jc3RydWN0IG1paV9pb2N0bF9kYXRhICpkYXRhID0gKHN0cnVjdCBtaWlfaW9jdGxfZGF0YSAqKSZycS0+aWZyX2RhdGE7Ci0JdTMyIHBoeSAgID0gcHJpdi0+cGh5W3ByaXYtPnBoeU51bV07Ci0JCi0JaWYgKCFwcml2LT5waHlPbmxpbmUpCi0JCXJldHVybiAtRUFHQUlOOwotCi0Jc3dpdGNoKGNtZCkgewotCWNhc2UgU0lPQ0dNSUlQSFk6CQkvKiBHZXQgYWRkcmVzcyBvZiBNSUkgUEhZIGluIHVzZS4gKi8KLQljYXNlIFNJT0NERVZQUklWQVRFOgkJLyogZm9yIGJpbmFyeSBjb21wYXQsIHJlbW92ZSBpbiAyLjUgKi8KLQkJCWRhdGEtPnBoeV9pZCA9IHBoeTsKLQotCWNhc2UgU0lPQ0dNSUlSRUc6CQkvKiBSZWFkIE1JSSBQSFkgcmVnaXN0ZXIuICovCi0JY2FzZSBTSU9DREVWUFJJVkFURSsxOgkJLyogZm9yIGJpbmFyeSBjb21wYXQsIHJlbW92ZSBpbiAyLjUgKi8KLQkJCVRMYW5fTWlpUmVhZFJlZyhkZXYsIGRhdGEtPnBoeV9pZCAmIDB4MWYsIGRhdGEtPnJlZ19udW0gJiAweDFmLCAmZGF0YS0+dmFsX291dCk7Ci0JCQlyZXR1cm4gMDsKLQkJCisJaW50IGVudHJ5ID0gMDsKIAotCWNhc2UgU0lPQ1NNSUlSRUc6CQkvKiBXcml0ZSBNSUkgUEhZIHJlZ2lzdGVyLiAqLwotCWNhc2UgU0lPQ0RFVlBSSVZBVEUrMjoJCS8qIGZvciBiaW5hcnkgY29tcGF0LCByZW1vdmUgaW4gMi41ICovCi0JCQlpZiAoIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpCi0JCQkJcmV0dXJuIC1FUEVSTTsKLQkJCVRMYW5fTWlpV3JpdGVSZWcoZGV2LCBkYXRhLT5waHlfaWQgJiAweDFmLCBkYXRhLT5yZWdfbnVtICYgMHgxZiwgZGF0YS0+dmFsX2luKTsKLQkJCXJldHVybiAwOwotCQlkZWZhdWx0OgotCQkJcmV0dXJuIC1FT1BOT1RTVVBQOworCWZvciAoOworCSAgICAgKHByaXYtPmN1cl9yeCAtIHByaXYtPmRpcnR5X3J4ICsKKwkgICAgICBUTEFOX05VTV9SWF9MSVNUUykgJSBUTEFOX05VTV9SWF9MSVNUUyA+IDA7CisJICAgICBwcml2LT5kaXJ0eV9yeCA9IChwcml2LT5kaXJ0eV9yeCArIDEpICUgVExBTl9OVU1fUlhfTElTVFMpIHsKKwkJZW50cnkgPSBwcml2LT5kaXJ0eV9yeCAlIFRMQU5fTlVNX1RYX0xJU1RTOworCQlyeF9yaW5nW2VudHJ5XS5mcmFtZVNpemUgPSBUTEFOX01BWF9GUkFNRV9TSVpFOworCQlyeF9yaW5nW2VudHJ5XS5jU3RhdCA9IFRMQU5fQ1NUQVRfUkVBRFk7CiAJfQotfSAvKiB0bGFuX2lvY3RsICovCi0KLQkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JICogCVRMYW5fdHhfdGltZW91dAotCSAqCi0JICogCVJldHVybnM6IG5vdGhpbmcKLQkgKgotCSAqIAlQYXJhbXM6Ci0JICogCQlkZXYJc3RydWN0dXJlIG9mIGRldmljZSB3aGljaCB0aW1lZCBvdXQgCi0JICogCQkJZHVyaW5nIHRyYW5zbWl0LgotCSAqCi0JICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdGF0aWMgdm9pZCBUTGFuX3R4X3RpbWVvdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKLXsKLQkKLQlUTEFOX0RCRyggVExBTl9ERUJVR19HTlJMLCAiJXM6IFRyYW5zbWl0IHRpbWVkIG91dC5cbiIsIGRldi0+bmFtZSk7Ci0JCi0JLyogT2sgc28gd2UgdGltZWQgb3V0LCBsZXRzIHNlZSB3aGF0IHdlIGNhbiBkbyBhYm91dCBpdC4uLiovCi0JVExhbl9GcmVlTGlzdHMoIGRldiApOwotCVRMYW5fUmVzZXRMaXN0cyggZGV2ICk7CQkKLQlUTGFuX1JlYWRBbmRDbGVhclN0YXRzKCBkZXYsIFRMQU5fSUdOT1JFICk7Ci0JVExhbl9SZXNldEFkYXB0ZXIoIGRldiApOwotCWRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOwotCW5ldGlmX3dha2VfcXVldWUoIGRldiApOwkKIAogfQotCQogCi0JLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCSAqCVRMYW5fU3RhcnRUeAotCSAqICAKLQkgKglSZXR1cm5zOgotCSAqCQkwIG9uIHN1Y2Nlc3MsIG5vbi16ZXJvIG9uIGZhaWx1cmUuCi0JICoJUGFybXM6Ci0JICoJCXNrYglBIHBvaW50ZXIgdG8gdGhlIHNrX2J1ZmYgY29udGFpbmluZyB0aGUKLQkgKgkJCWZyYW1lIHRvIGJlIHNlbnQuCi0JICoJCWRldglUaGUgZGV2aWNlIHRvIHNlbmQgdGhlIGRhdGEgb24uCi0JICoKLQkgKglUaGlzIGZ1bmN0aW9uIGFkZHMgYSBmcmFtZSB0byB0aGUgVHggbGlzdCB0byBiZSBzZW50Ci0JICoJQVNBUC4gIEZpcnN0IGl0CXZlcmlmaWVzIHRoYXQgdGhlIGFkYXB0ZXIgaXMgcmVhZHkgYW5kCi0JICoJdGhlcmUgaXMgcm9vbSBpbiB0aGUgcXVldWUuICBUaGVuIGl0IHNldHMgdXAgdGhlIG5leHQKLQkgKglhdmFpbGFibGUgbGlzdCwgY29waWVzIHRoZSBmcmFtZSB0byB0aGUJY29ycmVzcG9uZGluZwotCSAqCWJ1ZmZlci4gIElmIHRoZSBhZGFwdGVyIFR4IGNoYW5uZWwgaXMgaWRsZSwgaXQgZ2l2ZXMKLQkgKgl0aGUgYWRhcHRlciBhIFR4IEdvIGNvbW1hbmQgb24gdGhlIGxpc3QsIG90aGVyd2lzZSBpdAotCSAqCXNldHMgdGhlIGZvcndhcmQgYWRkcmVzcyBvZiB0aGUgcHJldmlvdXMgbGlzdCB0byBwb2ludAotCSAqCXRvIHRoaXMgb25lLiAgVGhlbiBpdCBmcmVlcyB0aGUgc2tfYnVmZi4KLQkgKgotCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICNkZWZpbmUgRUJERUJVRyAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitUUkFOU01JVCAtIFRyYW5zbWl0IGEgZnJhbWUKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIHRsYW5fdHJhbnNtaXQoc3RydWN0IG5pYyAqbmljLCBjb25zdCBjaGFyICpkLAkvKiBEZXN0aW5hdGlvbiAqLworCQkJICB1bnNpZ25lZCBpbnQgdCwJLyogVHlwZSAqLworCQkJICB1bnNpZ25lZCBpbnQgcywJLyogc2l6ZSAqLworCQkJICBjb25zdCBjaGFyICpwKQorewkJCQkvKiBQYWNrZXQgKi8KKwl1MTYgbnN0eXBlOworCXUzMiB0bzsKKwlzdHJ1Y3QgVExhbkxpc3QgKnRhaWxfbGlzdDsKKwlzdHJ1Y3QgVExhbkxpc3QgKmhlYWRfbGlzdDsKKwl1OCAqdGFpbF9idWZmZXI7CisJdTMyIGFjayA9IDA7CisJdTMyIGhvc3RfY21kOworCWludCBlb2MgPSAwOworCXUxNiB0bXBDU3RhdDsKKyNpZmRlZiBFQkRFQlVHCisJdTE2IGhvc3RfaW50ID0gaW53KEJBU0UgKyBUTEFOX0hPU1RfSU5UKTsKKyNlbmRpZgorCWludCBlbnRyeSA9IDA7CiAKLXN0YXRpYyBpbnQgVExhbl9TdGFydFR4KCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ICkKLXsKLQlUTGFuUHJpdmF0ZUluZm8gKnByaXYgPSBkZXYtPnByaXY7Ci0JVExhbkxpc3QJKnRhaWxfbGlzdDsKLQl1OAkJKnRhaWxfYnVmZmVyOwotCWludAkJcGFkOwotCXVuc2lnbmVkIGxvbmcJZmxhZ3M7Ci0KLQlpZiAoICEgcHJpdi0+cGh5T25saW5lICkgewotCQlUTEFOX0RCRyggVExBTl9ERUJVR19UWCwgIlRSQU5TTUlUOiAgJXMgUEhZIGlzIG5vdCByZWFkeVxuIiwgZGV2LT5uYW1lICk7Ci0JCWRldl9rZnJlZV9za2JfYW55KHNrYik7Ci0JCXJldHVybiAwOworI2lmZGVmIEVCREVCVUcKKwlwcmludGYoIklOVDAtMHglaFhcbiIsIGhvc3RfaW50KTsKKyNlbmRpZgorCisJaWYgKCFwcml2LT5waHlPbmxpbmUpIHsKKwkJcHJpbnRmKCJUUkFOU01JVDogICVzIFBIWSBpcyBub3QgcmVhZHlcbiIsIHByaXYtPm5pY19uYW1lKTsKKwkJcmV0dXJuOwogCX0KIAogCXRhaWxfbGlzdCA9IHByaXYtPnR4TGlzdCArIHByaXYtPnR4VGFpbDsKLQkKLQlpZiAoIHRhaWxfbGlzdC0+Y1N0YXQgIT0gVExBTl9DU1RBVF9VTlVTRUQgKSB7Ci0JCVRMQU5fREJHKCBUTEFOX0RFQlVHX1RYLCAiVFJBTlNNSVQ6ICAlcyBpcyBidXN5IChIZWFkPSVkIFRhaWw9JWQpXG4iLCBkZXYtPm5hbWUsIHByaXYtPnR4SGVhZCwgcHJpdi0+dHhUYWlsICk7Ci0JCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKworCWlmICh0YWlsX2xpc3QtPmNTdGF0ICE9IFRMQU5fQ1NUQVRfVU5VU0VEKSB7CisJCXByaW50ZigiVFJBTlNNSVQ6ICVzIGlzIGJ1c3kgKEhlYWQ9JWQgVGFpbD0lZClcbiIsCisJCSAgICAgICBwcml2LT5uaWNfbmFtZSwgcHJpdi0+dHhMaXN0LCBwcml2LT50eFRhaWwpOworCQl0eF9yaW5nW2VudHJ5XS5jU3RhdCA9IFRMQU5fQ1NUQVRfVU5VU0VEOwogCQlwcml2LT50eEJ1c3lDb3VudCsrOwotCQlyZXR1cm4gMTsKKwkJcmV0dXJuOwogCX0KIAogCXRhaWxfbGlzdC0+Zm9yd2FyZCA9IDA7CiAKLQlpZiAoIGJidWYgKSB7Ci0JCXRhaWxfYnVmZmVyID0gcHJpdi0+dHhCdWZmZXIgKyAoIHByaXYtPnR4VGFpbCAqIFRMQU5fTUFYX0ZSQU1FX1NJWkUgKTsKLQkJbWVtY3B5KCB0YWlsX2J1ZmZlciwgc2tiLT5kYXRhLCBza2ItPmxlbiApOwotCX0gZWxzZSB7Ci0JCXRhaWxfbGlzdC0+YnVmZmVyWzBdLmFkZHJlc3MgPSB2aXJ0X3RvX2J1cyggc2tiLT5kYXRhICk7Ci0JCXRhaWxfbGlzdC0+YnVmZmVyWzldLmFkZHJlc3MgPSAodTMyKSBza2I7Ci0JfQorCXRhaWxfYnVmZmVyID0gdHhiICsgKHByaXYtPnR4VGFpbCAqIFRMQU5fTUFYX0ZSQU1FX1NJWkUpOwogCi0JcGFkID0gVExBTl9NSU5fRlJBTUVfU0laRSAtIHNrYi0+bGVuOwotCi0JaWYgKCBwYWQgPiAwICkgewotCQl0YWlsX2xpc3QtPmZyYW1lU2l6ZSA9ICh1MTYpIHNrYi0+bGVuICsgcGFkOwotCQl0YWlsX2xpc3QtPmJ1ZmZlclswXS5jb3VudCA9ICh1MzIpIHNrYi0+bGVuOwotCQl0YWlsX2xpc3QtPmJ1ZmZlclsxXS5jb3VudCA9IFRMQU5fTEFTVF9CVUZGRVIgfCAodTMyKSBwYWQ7Ci0JCXRhaWxfbGlzdC0+YnVmZmVyWzFdLmFkZHJlc3MgPSB2aXJ0X3RvX2J1cyggVExhblBhZEJ1ZmZlciApOwotCX0gZWxzZSB7Ci0JCXRhaWxfbGlzdC0+ZnJhbWVTaXplID0gKHUxNikgc2tiLT5sZW47Ci0JCXRhaWxfbGlzdC0+YnVmZmVyWzBdLmNvdW50ID0gVExBTl9MQVNUX0JVRkZFUiB8ICh1MzIpIHNrYi0+bGVuOwotCQl0YWlsX2xpc3QtPmJ1ZmZlclsxXS5jb3VudCA9IDA7Ci0JCXRhaWxfbGlzdC0+YnVmZmVyWzFdLmFkZHJlc3MgPSAwOwotCX0KKwkvKiBzZW5kIHRoZSBwYWNrZXQgdG8gZGVzdGluYXRpb24gKi8KKwltZW1jcHkodGFpbF9idWZmZXIsIGQsIEVUSF9BTEVOKTsKKwltZW1jcHkodGFpbF9idWZmZXIgKyBFVEhfQUxFTiwgbmljLT5ub2RlX2FkZHIsIEVUSF9BTEVOKTsKKwluc3R5cGUgPSBodG9ucygodTE2KSB0KTsKKwltZW1jcHkodGFpbF9idWZmZXIgKyAyICogRVRIX0FMRU4sICh1OCAqKSAmIG5zdHlwZSwgMik7CisJbWVtY3B5KHRhaWxfYnVmZmVyICsgRVRIX0hMRU4sIHAsIHMpOworCisJcyArPSBFVEhfSExFTjsKKwlzICY9IDB4MEZGRjsKKwl3aGlsZSAocyA8IEVUSF9aTEVOKQorCQl0YWlsX2J1ZmZlcltzKytdID0gJ1wwJzsKKworCS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCS8qIFJlY2VpdmUKKwkgKiAwMDAwIDAwMDAgMDAwMSAxMTAwCisJICogMDAwMCAwMDAwIDAwMDAgMTEwMAorCSAqIDAwMDAgMDAwMCAwMDAwIDAwMTEgPSAweDAwMDMKKwkgKgorCSAqIDAwMDAgMDAwMCAwMDAwIDAwMDAgMDAwMCAwMDAwIDAwMDAgMDAxMQorCSAqIDAwMDAgMDAwMCAwMDAwIDExMDAgMDAwMCAwMDAwIDAwMDAgMDAwMCA9IDB4MDAwQzAwMDAKKwkgKgorCSAqIFRyYW5zbWl0CisJICogMDAwMCAwMDAwIDAwMDEgMTEwMAorCSAqIDAwMDAgMDAwMCAwMDAwIDAxMDAKKwkgKiAwMDAwIDAwMDAgMDAwMCAwMDAxID0gMHgwMDAxCisJICoKKwkgKiAwMDAwIDAwMDAgMDAwMCAwMDAwIDAwMDAgMDAwMCAwMDAwIDAwMDEKKwkgKiAwMDAwIDAwMDAgMDAwMCAwMTAwIDAwMDAgMDAwMCAwMDAwIDAwMDAgPSAweDAwMDQwMDAwCisJICogKi8KKworCS8qIFNldHVwIHRoZSB0cmFuc21pdCBkZXNjcmlwdG9yICovCisJdGFpbF9saXN0LT5mcmFtZVNpemUgPSAodTE2KSBzOworCXRhaWxfbGlzdC0+YnVmZmVyWzBdLmNvdW50ID0gVExBTl9MQVNUX0JVRkZFUiB8ICh1MzIpIHM7CisJdGFpbF9saXN0LT5idWZmZXJbMV0uY291bnQgPSAwOworCXRhaWxfbGlzdC0+YnVmZmVyWzFdLmFkZHJlc3MgPSAwOwogCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKIAl0YWlsX2xpc3QtPmNTdGF0ID0gVExBTl9DU1RBVF9SRUFEWTsKLQlpZiAoICEgcHJpdi0+dHhJblByb2dyZXNzICkgeworCisjaWZkZWYgRUJERUJVRworCWhvc3RfaW50ID0gaW53KEJBU0UgKyBUTEFOX0hPU1RfSU5UKTsKKwlwcmludGYoIklOVDEtMHglaFhcbiIsIGhvc3RfaW50KTsKKyNlbmRpZgorCisJaWYgKCFwcml2LT50eEluUHJvZ3Jlc3MpIHsKIAkJcHJpdi0+dHhJblByb2dyZXNzID0gMTsKLQkJVExBTl9EQkcoIFRMQU5fREVCVUdfVFgsICJUUkFOU01JVDogIFN0YXJ0aW5nIFRYIG9uIGJ1ZmZlciAlZFxuIiwgcHJpdi0+dHhUYWlsICk7Ci0JCW91dGwoIHZpcnRfdG9fYnVzKCB0YWlsX2xpc3QgKSwgZGV2LT5iYXNlX2FkZHIgKyBUTEFOX0NIX1BBUk0gKTsKLQkJb3V0bCggVExBTl9IQ19HTywgZGV2LT5iYXNlX2FkZHIgKyBUTEFOX0hPU1RfQ01EICk7CisJCW91dGwodmlydF90b19sZTMyZGVzYyh0YWlsX2xpc3QpLCBCQVNFICsgVExBTl9DSF9QQVJNKTsKKwkJb3V0bChUTEFOX0hDX0dPLCBCQVNFICsgVExBTl9IT1NUX0NNRCk7CiAJfSBlbHNlIHsKLQkJVExBTl9EQkcoIFRMQU5fREVCVUdfVFgsICJUUkFOU01JVDogIEFkZGluZyBidWZmZXIgJWQgdG8gVFggY2hhbm5lbFxuIiwgcHJpdi0+dHhUYWlsICk7Ci0JCWlmICggcHJpdi0+dHhUYWlsID09IDAgKSB7Ci0JCQkoIHByaXYtPnR4TGlzdCArICggVExBTl9OVU1fVFhfTElTVFMgLSAxICkgKS0+Zm9yd2FyZCA9IHZpcnRfdG9fYnVzKCB0YWlsX2xpc3QgKTsKKwkJaWYgKHByaXYtPnR4VGFpbCA9PSAwKSB7CisjaWZkZWYgRUJERUJVRworCQkJcHJpbnRmKCJPdXQgYnVmZmVyXG4iKTsKKyNlbmRpZgorCQkJKHByaXYtPnR4TGlzdCArIChUTEFOX05VTV9UWF9MSVNUUyAtIDEpKS0+Zm9yd2FyZCA9CisJCQkgICAgdmlydF90b19sZTMyZGVzYyh0YWlsX2xpc3QpOwogCQl9IGVsc2UgewotCQkJKCBwcml2LT50eExpc3QgKyAoIHByaXYtPnR4VGFpbCAtIDEgKSApLT5mb3J3YXJkID0gdmlydF90b19idXMoIHRhaWxfbGlzdCApOworI2lmZGVmIEVCREVCVUcKKwkJCXByaW50ZigiRml4IHRoaXMgXG4iKTsKKyNlbmRpZgorCQkJKHByaXYtPnR4TGlzdCArIChwcml2LT50eFRhaWwgLSAxKSktPmZvcndhcmQgPQorCQkJICAgIHZpcnRfdG9fbGUzMmRlc2ModGFpbF9saXN0KTsKIAkJfQogCX0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5sb2NrLCBmbGFncyk7Ci0KLQlDSVJDX0lOQyggcHJpdi0+dHhUYWlsLCBUTEFOX05VTV9UWF9MSVNUUyApOwotCi0JaWYgKCBiYnVmICkKLQkJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKLQkJCi0JZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7Ci0JcmV0dXJuIDA7Ci0KLX0gLyogVExhbl9TdGFydFR4ICovCi0KLQkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JICoJVExhbl9IYW5kbGVJbnRlcnJ1cHQKLQkgKiAgCi0JICoJUmV0dXJuczoJCi0JICoJCU5vdGhpbmcKLQkgKglQYXJtczoKLQkgKgkJaXJxCVRoZSBsaW5lIG9uIHdoaWNoIHRoZSBpbnRlcnJ1cHQKLQkgKgkJCW9jY3VycmVkLgotCSAqCQlkZXZfaWQJQSBwb2ludGVyIHRvIHRoZSBkZXZpY2UgYXNzaWduZWQgdG8KLQkgKgkJCXRoaXMgaXJxIGxpbmUuCi0JICoJCXJlZ3MJPz8/Ci0JICoKLQkgKglUaGlzIGZ1bmN0aW9uIGhhbmRsZXMgYW4gaW50ZXJydXB0IGdlbmVyYXRlZCBieSBpdHMKLQkgKglhc3NpZ25lZCBUTEFOIGFkYXB0ZXIuICBUaGUgZnVuY3Rpb24gZGVhY3RpdmF0ZXMKLQkgKglpbnRlcnJ1cHRzIG9uIGl0cyBhZGFwdGVyLCByZWNvcmRzIHRoZSB0eXBlIG9mCi0JICoJaW50ZXJydXB0LCBleGVjdXRlcyB0aGUgYXBwcm9wcmlhdGUgc3ViaGFuZGxlciwgYW5kCi0JICoJYWNrbm93ZGdlcyB0aGUgaW50ZXJydXB0IHRvIHRoZSBhZGFwdGVyICh0aHVzCi0JICoJcmUtZW5hYmxpbmcgYWRhcHRlciBpbnRlcnJ1cHRzLgotCSAqCi0JICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdGF0aWMgdm9pZCBUTGFuX0hhbmRsZUludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQotewotCXUzMgkJYWNrOwotCXN0cnVjdCBuZXRfZGV2aWNlCSpkZXY7Ci0JdTMyCQlob3N0X2NtZDsKLQl1MTYJCWhvc3RfaW50OwotCWludAkJdHlwZTsKLQlUTGFuUHJpdmF0ZUluZm8gKnByaXY7Ci0KLQlkZXYgPSBkZXZfaWQ7Ci0JcHJpdiA9IGRldi0+cHJpdjsKLQotCXNwaW5fbG9jaygmcHJpdi0+bG9jayk7Ci0KLQlob3N0X2ludCA9IGludyggZGV2LT5iYXNlX2FkZHIgKyBUTEFOX0hPU1RfSU5UICk7Ci0Jb3V0dyggaG9zdF9pbnQsIGRldi0+YmFzZV9hZGRyICsgVExBTl9IT1NUX0lOVCApOworCQorCUNJUkNfSU5DKHByaXYtPnR4VGFpbCwgVExBTl9OVU1fVFhfTElTVFMpOwogCi0JdHlwZSA9ICggaG9zdF9pbnQgJiBUTEFOX0hJX0lUX01BU0sgKSA+PiAyOworI2lmZGVmIEVCREVCVUcKKwlob3N0X2ludCA9IGludyhCQVNFICsgVExBTl9IT1NUX0lOVCk7CisJcHJpbnRmKCJJTlQyLTB4JWhYXG4iLCBob3N0X2ludCk7CisjZW5kaWYKIAotCWFjayA9IFRMYW5JbnRWZWN0b3JbdHlwZV0oIGRldiwgaG9zdF9pbnQgKTsKKwl0byA9IGN1cnJ0aWNrcygpICsgVFhfVElNRV9PVVQ7CisJd2hpbGUgKCh0YWlsX2xpc3QtPmNTdGF0ID09IFRMQU5fQ1NUQVRfUkVBRFkpICYmIGN1cnJ0aWNrcygpIDwgdG8pOwogCi0JaWYgKCBhY2sgKSB7Ci0JCWhvc3RfY21kID0gVExBTl9IQ19BQ0sgfCBhY2sgfCAoIHR5cGUgPDwgMTggKTsKLQkJb3V0bCggaG9zdF9jbWQsIGRldi0+YmFzZV9hZGRyICsgVExBTl9IT1NUX0NNRCApOworCWhlYWRfbGlzdCA9IHByaXYtPnR4TGlzdCArIHByaXYtPnR4SGVhZDsKKwl3aGlsZSAoKCh0bXBDU3RhdCA9IGhlYWRfbGlzdC0+Y1N0YXQpICYgVExBTl9DU1RBVF9GUk1fQ01QKSAKKwkJCSYmIChhY2sgPCAyNTUpKSB7CisJCWFjaysrOworCQlpZih0bXBDU3RhdCAmIFRMQU5fQ1NUQVRfRU9DKQorCQkJZW9jID0xOworCQloZWFkX2xpc3QtPmNTdGF0ID0gVExBTl9DU1RBVF9VTlVTRUQ7CisJCUNJUkNfSU5DKHByaXYtPnR4SGVhZCwgVExBTl9OVU1fVFhfTElTVFMpOworCQloZWFkX2xpc3QgPSBwcml2LT50eExpc3QgKyBwcml2LT50eEhlYWQ7CisJCQogCX0KKwlpZighYWNrKQorCQlwcmludGYoIkluY29tcGxldGUgVFggRnJhbWVcbiIpOwogCi0Jc3Bpbl91bmxvY2soJnByaXYtPmxvY2spOwotCi19IC8qIFRMYW5fSGFuZGxlSW50ZXJydXB0cyAqLwotCi0JLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCSAqCVRMYW5fQ2xvc2UKLQkgKiAgCi0JICogCVJldHVybnM6Ci0JICoJCUFuIGVycm9yIGNvZGUuCi0JICoJUGFybXM6Ci0JICoJCWRldglUaGUgZGV2aWNlIHN0cnVjdHVyZSBvZiB0aGUgZGV2aWNlIHRvCi0JICoJCQljbG9zZS4KLQkgKgotCSAqCVRoaXMgZnVuY3Rpb24gc2h1dHMgZG93biB0aGUgYWRhcHRlci4gIEl0IHJlY29yZHMgYW55Ci0JICoJc3RhdHMsIHB1dHMgdGhlIGFkYXB0ZXIgaW50byByZXNldCBzdGF0ZSwgZGVhY3RpdmF0ZXMKLQkgKglpdHMgdGltZSBhcyBuZWVkZWQsIGFuZAlmcmVlcyB0aGUgaXJxIGl0IGlzIHVzaW5nLgotCSAqCi0JICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdGF0aWMgaW50IFRMYW5fQ2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKLXsKLQlUTGFuUHJpdmF0ZUluZm8gKnByaXYgPSBkZXYtPnByaXY7Ci0KLQluZXRpZl9zdG9wX3F1ZXVlKGRldik7Ci0JcHJpdi0+bmVnX2JlX3ZlcmJvc2UgPSAwOwotCi0JVExhbl9SZWFkQW5kQ2xlYXJTdGF0cyggZGV2LCBUTEFOX1JFQ09SRCApOwotCW91dGwoIFRMQU5fSENfQURfUlNULCBkZXYtPmJhc2VfYWRkciArIFRMQU5fSE9TVF9DTUQgKTsKLQlpZiAoIHByaXYtPnRpbWVyLmZ1bmN0aW9uICE9IE5VTEwgKSB7Ci0JCWRlbF90aW1lcl9zeW5jKCAmcHJpdi0+dGltZXIgKTsKLQkJcHJpdi0+dGltZXIuZnVuY3Rpb24gPSBOVUxMOworCWlmKGVvYykgeworCQloZWFkX2xpc3QgPSBwcml2LT50eExpc3QgKyBwcml2LT50eEhlYWQ7CisJCWlmICgoaGVhZF9saXN0LT5jU3RhdCAmIFRMQU5fQ1NUQVRfUkVBRFkpID09IFRMQU5fQ1NUQVRfUkVBRFkpIHsKKwkJCW91dGwodmlydF90b19sZTMyZGVzYyhoZWFkX2xpc3QpLCBCQVNFICsgVExBTl9DSF9QQVJNKTsKKwkJCWFjayB8PSBUTEFOX0hDX0dPOworCQl9IGVsc2UgeworCQkJcHJpdi0+dHhJblByb2dyZXNzID0gMDsKKwkJfQogCX0KLQkKLQlmcmVlX2lycSggZGV2LT5pcnEsIGRldiApOwotCVRMYW5fRnJlZUxpc3RzKCBkZXYgKTsKLQlUTEFOX0RCRyggVExBTl9ERUJVR19HTlJMLCAiRGV2aWNlICVzIGNsb3NlZC5cbiIsIGRldi0+bmFtZSApOwotCi0JcmV0dXJuIDA7Ci0KLX0gLyogVExhbl9DbG9zZSAqLwotCi0JLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCSAqCVRMYW5fR2V0U3RhdHMKLQkgKiAgCi0JICoJUmV0dXJuczoKLQkgKgkJQSBwb2ludGVyIHRvIHRoZSBkZXZpY2UncyBzdGF0aXN0aWNzIHN0cnVjdHVyZS4KLQkgKglQYXJtczoKLQkgKgkJZGV2CVRoZSBkZXZpY2Ugc3RydWN0dXJlIHRvIHJldHVybiB0aGUKLQkgKgkJCXN0YXRzIGZvci4KLQkgKgotCSAqCVRoaXMgZnVuY3Rpb24gdXBkYXRlcyB0aGUgZGV2aWNlcyBzdGF0aXN0aWNzIGJ5IHJlYWRpbmcKLQkgKgl0aGUgVExBTiBjaGlwJ3Mgb25ib2FyZCByZWdpc3RlcnMuICBUaGVuIGl0IHJldHVybnMgdGhlCi0JICoJYWRkcmVzcyBvZiB0aGUgc3RhdGlzdGljcyBzdHJ1Y3R1cmUuCi0JICoKLQkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqVExhbl9HZXRTdGF0cyggc3RydWN0IG5ldF9kZXZpY2UgKmRldiApCi17Ci0JVExhblByaXZhdGVJbmZvCSpwcml2ID0gZGV2LT5wcml2OwotCWludCBpOwotCi0JLyogU2hvdWxkIG9ubHkgcmVhZCBzdGF0cyBpZiBvcGVuID8gKi8KLQlUTGFuX1JlYWRBbmRDbGVhclN0YXRzKCBkZXYsIFRMQU5fUkVDT1JEICk7Ci0KLQlUTEFOX0RCRyggVExBTl9ERUJVR19SWCwgIlJFQ0VJVkU6ICAlcyBFT0MgY291bnQgPSAlZFxuIiwgZGV2LT5uYW1lLCBwcml2LT5yeEVvY0NvdW50ICk7Ci0JVExBTl9EQkcoIFRMQU5fREVCVUdfVFgsICJUUkFOU01JVDogICVzIEJ1c3kgY291bnQgPSAlZFxuIiwgZGV2LT5uYW1lLCBwcml2LT50eEJ1c3lDb3VudCApOwotCWlmICggZGVidWcgJiBUTEFOX0RFQlVHX0dOUkwgKSB7Ci0JCVRMYW5fUHJpbnREaW8oIGRldi0+YmFzZV9hZGRyICk7Ci0JCVRMYW5fUGh5UHJpbnQoIGRldiApOwkJCi0JfQotCWlmICggZGVidWcgJiBUTEFOX0RFQlVHX0xJU1QgKSB7Ci0JCWZvciAoIGkgPSAwOyBpIDwgVExBTl9OVU1fUlhfTElTVFM7IGkrKyApCi0JCQlUTGFuX1ByaW50TGlzdCggcHJpdi0+cnhMaXN0ICsgaSwgIlJYIiwgaSApOwotCQlmb3IgKCBpID0gMDsgaSA8IFRMQU5fTlVNX1RYX0xJU1RTOyBpKysgKQotCQkJVExhbl9QcmludExpc3QoIHByaXYtPnR4TGlzdCArIGksICJUWCIsIGkgKTsKKwlpZihhY2spIHsKKwkJaG9zdF9jbWQgPSBUTEFOX0hDX0FDSyB8IGFjazsKKwkJb3V0bChob3N0X2NtZCwgQkFTRSArIFRMQU5fSE9TVF9DTUQpOwogCX0KIAkKLQlyZXR1cm4gKCAmKCAoVExhblByaXZhdGVJbmZvICopIGRldi0+cHJpdiApLT5zdGF0cyApOwotCi19IC8qIFRMYW5fR2V0U3RhdHMgKi8KLQotCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkgKglUTGFuX1NldE11bHRpY2FzdExpc3QKLQkgKiAgCi0JICoJUmV0dXJuczoKLQkgKgkJTm90aGluZwotCSAqCVBhcm1zOgotCSAqCQlkZXYJVGhlIGRldmljZSBzdHJ1Y3R1cmUgdG8gc2V0IHRoZQotCSAqCQkJbXVsdGljYXN0IGxpc3QgZm9yLgotCSAqCi0JICoJVGhpcyBmdW5jdGlvbiBzZXRzIHRoZSBUTEFOIGFkYXB0b3IgdG8gdmFyaW91cyByZWNlaXZlCi0JICoJbW9kZXMuICBJZiB0aGUgSUZGX1BST01JU0MgZmxhZyBpcyBzZXQsIHByb21pc2N1b3VzCi0JICoJbW9kZSBpcyBhY2l0dmlhdGVkLiAgT3RoZXJ3aXNlLAlwcm9taXNjdW91cyBtb2RlIGlzCi0JICoJdHVybmVkIG9mZi4gIElmIHRoZSBJRkZfQUxMTVVMVEkgZmxhZyBpcyBzZXQsIHRoZW4KLQkgKgl0aGUgaGFzaCB0YWJsZSBpcyBzZXQgdG8gcmVjZWl2ZSBhbGwgZ3JvdXAgYWRkcmVzc2VzLgotCSAqCU90aGVyd2lzZSwgdGhlIGZpcnN0IHRocmVlIG11bHRpY2FzdCBhZGRyZXNzZXMgYXJlCi0JICoJc3RvcmVkIGluIEFSRUdfMS0zLCBhbmQgdGhlIHJlc3QgYXJlIHNlbGVjdGVkIHZpYSB0aGUKLQkgKgloYXNoIHRhYmxlLCBhcyBuZWNlc3NhcnkuCi0JICoKLQkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0YXRpYyB2b2lkIFRMYW5fU2V0TXVsdGljYXN0TGlzdCggc3RydWN0IG5ldF9kZXZpY2UgKmRldiApCi17CQotCXN0cnVjdCBkZXZfbWNfbGlzdAkqZG1pID0gZGV2LT5tY19saXN0OwotCXUzMgkJCWhhc2gxID0gMDsKLQl1MzIJCQloYXNoMiA9IDA7Ci0JaW50CQkJaTsKLQl1MzIJCQlvZmZzZXQ7Ci0JdTgJCQl0bXA7Ci0KLQlpZiAoIGRldi0+ZmxhZ3MgJiBJRkZfUFJPTUlTQyApIHsKLQkJdG1wID0gVExhbl9EaW9SZWFkOCggZGV2LT5iYXNlX2FkZHIsIFRMQU5fTkVUX0NNRCApOwotCQlUTGFuX0Rpb1dyaXRlOCggZGV2LT5iYXNlX2FkZHIsIFRMQU5fTkVUX0NNRCwgdG1wIHwgVExBTl9ORVRfQ01EX0NBRiApOwotCX0gZWxzZSB7Ci0JCXRtcCA9IFRMYW5fRGlvUmVhZDgoIGRldi0+YmFzZV9hZGRyLCBUTEFOX05FVF9DTUQgKTsKLQkJVExhbl9EaW9Xcml0ZTgoIGRldi0+YmFzZV9hZGRyLCBUTEFOX05FVF9DTUQsIHRtcCAmIH5UTEFOX05FVF9DTURfQ0FGICk7Ci0JCWlmICggZGV2LT5mbGFncyAmIElGRl9BTExNVUxUSSApIHsKLQkJCWZvciAoIGkgPSAwOyBpIDwgMzsgaSsrICkgCi0JCQkJVExhbl9TZXRNYWMoIGRldiwgaSArIDEsIE5VTEwgKTsKLQkJCVRMYW5fRGlvV3JpdGUzMiggZGV2LT5iYXNlX2FkZHIsIFRMQU5fSEFTSF8xLCAweEZGRkZGRkZGICk7Ci0JCQlUTGFuX0Rpb1dyaXRlMzIoIGRldi0+YmFzZV9hZGRyLCBUTEFOX0hBU0hfMiwgMHhGRkZGRkZGRiApOworCWlmKHByaXYtPnRsYW5SZXYgPCAweDMwICkgeworCQlhY2sgPSAxOworCQloZWFkX2xpc3QgPSBwcml2LT50eExpc3QgKyBwcml2LT50eEhlYWQ7CisJCWlmICgoaGVhZF9saXN0LT5jU3RhdCAmIFRMQU5fQ1NUQVRfUkVBRFkpID09IFRMQU5fQ1NUQVRfUkVBRFkpIHsKKwkJCW91dGwodmlydF90b19sZTMyZGVzYyhoZWFkX2xpc3QpLCBCQVNFICsgVExBTl9DSF9QQVJNKTsKKwkJCWFjayB8PSBUTEFOX0hDX0dPOwogCQl9IGVsc2UgewotCQkJZm9yICggaSA9IDA7IGkgPCBkZXYtPm1jX2NvdW50OyBpKysgKSB7Ci0JCQkJaWYgKCBpIDwgMyApIHsKLQkJCQkJVExhbl9TZXRNYWMoIGRldiwgaSArIDEsIChjaGFyICopICZkbWktPmRtaV9hZGRyICk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJb2Zmc2V0ID0gVExhbl9IYXNoRnVuYyggKHU4ICopICZkbWktPmRtaV9hZGRyICk7Ci0JCQkJCWlmICggb2Zmc2V0IDwgMzIgKSAKLQkJCQkJCWhhc2gxIHw9ICggMSA8PCBvZmZzZXQgKTsKLQkJCQkJZWxzZQotCQkJCQkJaGFzaDIgfD0gKCAxIDw8ICggb2Zmc2V0IC0gMzIgKSApOwotCQkJCX0KLQkJCQlkbWkgPSBkbWktPm5leHQ7Ci0JCQl9Ci0JCQlmb3IgKCA7IGkgPCAzOyBpKysgKSAKLQkJCQlUTGFuX1NldE1hYyggZGV2LCBpICsgMSwgTlVMTCApOwotCQkJVExhbl9EaW9Xcml0ZTMyKCBkZXYtPmJhc2VfYWRkciwgVExBTl9IQVNIXzEsIGhhc2gxICk7Ci0JCQlUTGFuX0Rpb1dyaXRlMzIoIGRldi0+YmFzZV9hZGRyLCBUTEFOX0hBU0hfMiwgaGFzaDIgKTsKKwkJCXByaXYtPnR4SW5Qcm9ncmVzcyA9IDA7CiAJCX0KKwkJaG9zdF9jbWQgPSBUTEFOX0hDX0FDSyB8IGFjayB8IDB4MDAxNDAwMDA7CisJCW91dGwoaG9zdF9jbWQsIEJBU0UgKyBUTEFOX0hPU1RfQ01EKTsKKwkJCiAJfQorCQkJCisJaWYgKGN1cnJ0aWNrcygpID49IHRvKSB7CisJCXByaW50ZigiVFggVGltZSBPdXQiKTsKKwl9Cit9CiAKLX0gLyogVExhbl9TZXRNdWx0aWNhc3RMaXN0ICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLSAgICAgICAgVGh1bmRlckxBTiBEcml2ZXIgSW50ZXJydXB0IFZlY3RvcnMgYW5kIFRhYmxlCi0KLQlQbGVhc2Ugc2VlIENoYXAuIDQsICJJbnRlcnJ1cHQgSGFuZGxpbmciIG9mIHRoZSAiVGh1bmRlckxBTgotCVByb2dyYW1tZXIncyBHdWlkZSIgZm9yIG1vcmUgaW5mb3JtYXRpb25zIG9uIGhhbmRsaW5nIGludGVycnVwdHMKLQlnZW5lcmF0ZWQgYnkgVExBTiBiYXNlZCBhZGFwdGVycy4gIAotCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0JLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCSAqCVRMYW5fSGFuZGxlSW52YWxpZAotCSAqCi0JICoJUmV0dXJuczoKLQkgKgkJMAotCSAqCVBhcm1zOgotCSAqCQlkZXYJCURldmljZSBhc3NpZ25lZCB0aGUgSVJRIHRoYXQgd2FzCi0JICoJCQkJcmFpc2VkLgotCSAqCQlob3N0X2ludAlUaGUgY29udGVudHMgb2YgdGhlIEhPU1RfSU5UCi0JICoJCQkJcG9ydC4KLQkgKgotCSAqCVRoaXMgZnVuY3Rpb24gaGFuZGxlcyBpbnZhbGlkIGludGVycnVwdHMuICBUaGlzIHNob3VsZAotCSAqCW5ldmVyIGhhcHBlbiB1bmxlc3Mgc29tZSBvdGhlciBhZGFwdGVyIGlzIHRyeWluZyB0byB1c2UKLQkgKgl0aGUgSVJRIGxpbmUgYXNzaWduZWQgdG8gdGhlIGRldmljZS4KLQkgKgotCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotdTMyIFRMYW5fSGFuZGxlSW52YWxpZCggc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTE2IGhvc3RfaW50ICkKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorRElTQUJMRSAtIFR1cm4gb2ZmIGV0aGVybmV0IGludGVyZmFjZQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIEVCNTEKK3N0YXRpYyB2b2lkIHRsYW5fZGlzYWJsZShzdHJ1Y3QgZGV2ICpkZXYgX191bnVzZWQpCisjZWxzZQorc3RhdGljIHZvaWQgdGxhbl9kaXNhYmxlKHN0cnVjdCBuaWMgKm5pYyBfX3VudXNlZCkKKyNlbmRpZgogewotCS8qIHByaW50ayggIlRMQU46ICBJbnZhbGlkIGludGVycnVwdCBvbiAlcy5cbiIsIGRldi0+bmFtZSApOyAqLwotCXJldHVybiAwOwotCi19IC8qIFRMYW5fSGFuZGxlSW52YWxpZCAqLwotCi0JLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCSAqCVRMYW5fSGFuZGxlVHhFT0YKLQkgKgotCSAqCVJldHVybnM6Ci0JICoJCTEKLQkgKglQYXJtczoKLQkgKgkJZGV2CQlEZXZpY2UgYXNzaWduZWQgdGhlIElSUSB0aGF0IHdhcwotCSAqCQkJCXJhaXNlZC4KLQkgKgkJaG9zdF9pbnQJVGhlIGNvbnRlbnRzIG9mIHRoZSBIT1NUX0lOVAotCSAqCQkJCXBvcnQuCi0JICoKLQkgKglUaGlzIGZ1bmN0aW9uIGhhbmRsZXMgVHggRU9GIGludGVycnVwdHMgd2hpY2ggYXJlIHJhaXNlZAotCSAqCWJ5IHRoZSBhZGFwdGVyIHdoZW4gaXQgaGFzIGNvbXBsZXRlZCBzZW5kaW5nIHRoZQotCSAqCWNvbnRlbnRzIG9mIGEgYnVmZmVyLiAgSWYgZGV0ZW1pbmVzIHdoaWNoIGxpc3QvYnVmZmVyCi0JICoJd2FzIGNvbXBsZXRlZCBhbmQgcmVzZXRzIGl0LiAgSWYgdGhlIGJ1ZmZlciB3YXMgdGhlIGxhc3QKLQkgKglpbiB0aGUgY2hhbm5lbCAoRU9DKSwgdGhlbiB0aGUgZnVuY3Rpb24gY2hlY2tzIHRvIHNlZSBpZgotCSAqCWFub3RoZXIgYnVmZmVyIGlzIHJlYWR5IHRvIHNlbmQsIGFuZCBpZiBzbywgc2VuZHMgYSBUeAotCSAqCUdvIGNvbW1hbmQuICBGaW5hbGx5LCB0aGUgZHJpdmVyIGFjdGl2YXRlcy9jb250aW51ZXMgdGhlCi0JICoJYWN0aXZpdHkgTEVELgorCS8qIHB1dCB0aGUgY2FyZCBpbiBpdHMgaW5pdGlhbCBzdGF0ZSAqLworCS8qIFRoaXMgZnVuY3Rpb24gc2VydmVzIDMgcHVycG9zZXMuCisJICogVGhpcyBkaXNhYmxlcyBETUEgYW5kIGludGVycnVwdHMgc28gd2UgZG9uJ3QgcmVjZWl2ZQorCSAqICB1bmV4cGVjdGVkIHBhY2tldHMgb3IgaW50ZXJydXB0cyBmcm9tIHRoZSBjYXJkIGFmdGVyCisJICogIGV0aGVyYm9vdCBoYXMgZmluaXNoZWQuCisJICogVGhpcyBmcmVlcyByZXNvdXJjZXMgc28gZXRoZXJib290IG1heSB1c2UKKwkgKiAgdGhpcyBkcml2ZXIgb24gYW5vdGhlciBpbnRlcmZhY2UKKwkgKiBUaGlzIGFsbG93cyBldGhlcmJvb3QgdG8gcmVpbml0aWFsaXplIHRoZSBpbnRlcmZhY2UKKwkgKiAgaWYgc29tZXRoaW5nIGlzIHNvbWV0aGluZyBnb2VzIHdyb25nLgogCSAqCi0JICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCSAqLworCW91dGwoVExBTl9IQ19BRF9SU1QsIEJBU0UgKyBUTEFOX0hPU1RfQ01EKTsKK30KIAotdTMyIFRMYW5fSGFuZGxlVHhFT0YoIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUxNiBob3N0X2ludCApCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK0lSUSAtIEVuYWJsZSwgRGlzYWJsZSwgb3IgRm9yY2UgaW50ZXJydXB0cworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgdGxhbl9pcnEoc3RydWN0IG5pYyAqbmljIF9fdW51c2VkLCBpcnFfYWN0aW9uX3QgYWN0aW9uIF9fdW51c2VkKQogewotCVRMYW5Qcml2YXRlSW5mbwkqcHJpdiA9IGRldi0+cHJpdjsKLQlpbnQJCWVvYyA9IDA7Ci0JVExhbkxpc3QJKmhlYWRfbGlzdDsKLQl1MzIJCWFjayA9IDA7Ci0JdTE2CQl0bXBDU3RhdDsKLQkKLQlUTEFOX0RCRyggVExBTl9ERUJVR19UWCwgIlRSQU5TTUlUOiAgSGFuZGxpbmcgVFggRU9GIChIZWFkPSVkIFRhaWw9JWQpXG4iLCBwcml2LT50eEhlYWQsIHByaXYtPnR4VGFpbCApOwotCWhlYWRfbGlzdCA9IHByaXYtPnR4TGlzdCArIHByaXYtPnR4SGVhZDsKKyAgc3dpdGNoICggYWN0aW9uICkgeworICBjYXNlIERJU0FCTEUgOgorICAgIGJyZWFrOworICBjYXNlIEVOQUJMRSA6CisgICAgYnJlYWs7CisgIGNhc2UgRk9SQ0UgOgorICAgIGJyZWFrOworICB9Cit9CiAKLQl3aGlsZSAoKCh0bXBDU3RhdCA9IGhlYWRfbGlzdC0+Y1N0YXQgKSAmIFRMQU5fQ1NUQVRfRlJNX0NNUCkgJiYgKGFjayA8IDI1NSkpIHsKLQkJYWNrKys7Ci0JCWlmICggISBiYnVmICkgewotCQkJZGV2X2tmcmVlX3NrYl9hbnkoIChzdHJ1Y3Qgc2tfYnVmZiAqKSBoZWFkX2xpc3QtPmJ1ZmZlcls5XS5hZGRyZXNzICk7Ci0JCQloZWFkX2xpc3QtPmJ1ZmZlcls5XS5hZGRyZXNzID0gMDsKLQkJfQotCQotCQlpZiAoIHRtcENTdGF0ICYgVExBTl9DU1RBVF9FT0MgKQotCQkJZW9jID0gMTsKLQkJCQotCQlwcml2LT5zdGF0cy50eF9ieXRlcyArPSBoZWFkX2xpc3QtPmZyYW1lU2l6ZTsKK3N0YXRpYyB2b2lkIFRMYW5fU2V0TXVsdGljYXN0TGlzdChzdHJ1Y3QgbmljICpuaWMpIHsKKwlpbnQgaTsKKwl1OCB0bXA7CiAKLQkJaGVhZF9saXN0LT5jU3RhdCA9IFRMQU5fQ1NUQVRfVU5VU0VEOwotCQluZXRpZl9zdGFydF9xdWV1ZShkZXYpOwkJCi0JCUNJUkNfSU5DKCBwcml2LT50eEhlYWQsIFRMQU5fTlVNX1RYX0xJU1RTICk7IAotCQloZWFkX2xpc3QgPSBwcml2LT50eExpc3QgKyBwcml2LT50eEhlYWQ7Ci0JfQorCS8qICFJRkZfUFJPTUlTQyAqLworCXRtcCA9IFRMYW5fRGlvUmVhZDgoQkFTRSwgVExBTl9ORVRfQ01EKTsKKwlUTGFuX0Rpb1dyaXRlOChCQVNFLCBUTEFOX05FVF9DTUQsIHRtcCAmIH5UTEFOX05FVF9DTURfQ0FGKTsKKworCS8qIElGRl9BTExNVUxUSSAqLworCWZvcihpID0gMDsgaTwgMzsgaSsrKQorCQlUTGFuX1NldE1hYyhuaWMsIGkgKyAxLCBOVUxMKTsKKwlUTGFuX0Rpb1dyaXRlMzIoQkFTRSwgVExBTl9IQVNIXzEsIDB4RkZGRkZGRkYpOworCVRMYW5fRGlvV3JpdGUzMihCQVNFLCBUTEFOX0hBU0hfMiwgMHhGRkZGRkZGRik7CiAKLQlpZiAoIWFjaykKLQkJcHJpbnRrKEtFUk5fSU5GTyAiVExBTjogUmVjZWl2ZWQgaW50ZXJydXB0IGZvciB1bmNvbXBsZXRlZCBUWCBmcmFtZS5cbiIpOwotCQotCWlmICggZW9jICkgewotCQlUTEFOX0RCRyggVExBTl9ERUJVR19UWCwgIlRSQU5TTUlUOiAgSGFuZGxpbmcgVFggRU9DIChIZWFkPSVkIFRhaWw9JWQpXG4iLCBwcml2LT50eEhlYWQsIHByaXYtPnR4VGFpbCApOwotCQloZWFkX2xpc3QgPSBwcml2LT50eExpc3QgKyBwcml2LT50eEhlYWQ7Ci0JCWlmICggKCBoZWFkX2xpc3QtPmNTdGF0ICYgVExBTl9DU1RBVF9SRUFEWSApID09IFRMQU5fQ1NUQVRfUkVBRFkgKSB7Ci0JCQlvdXRsKCB2aXJ0X3RvX2J1cyggaGVhZF9saXN0ICksIGRldi0+YmFzZV9hZGRyICsgVExBTl9DSF9QQVJNICk7Ci0JCQlhY2sgfD0gVExBTl9IQ19HTzsKLQkJfSBlbHNlIHsKLQkJCXByaXYtPnR4SW5Qcm9ncmVzcyA9IDA7Ci0JCX0KLQl9CiAJCi0JaWYgKCBwcml2LT5hZGFwdGVyLT5mbGFncyAmIFRMQU5fQURBUFRFUl9BQ1RJVklUWV9MRUQgKSB7Ci0JCVRMYW5fRGlvV3JpdGU4KCBkZXYtPmJhc2VfYWRkciwgVExBTl9MRURfUkVHLCBUTEFOX0xFRF9MSU5LIHwgVExBTl9MRURfQUNUICk7Ci0JCWlmICggcHJpdi0+dGltZXIuZnVuY3Rpb24gPT0gTlVMTCApIHsKLQkJCSBwcml2LT50aW1lci5mdW5jdGlvbiA9ICZUTGFuX1RpbWVyOwotCQkJIHByaXYtPnRpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZykgZGV2OwotCQkJIHByaXYtPnRpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgVExBTl9USU1FUl9BQ1RfREVMQVk7Ci0JCQkgcHJpdi0+dGltZXJTZXRBdCA9IGppZmZpZXM7Ci0JCQkgcHJpdi0+dGltZXJUeXBlID0gVExBTl9USU1FUl9BQ1RJVklUWTsKLQkJCSBhZGRfdGltZXIoJnByaXYtPnRpbWVyKTsKLQkJfSBlbHNlIGlmICggcHJpdi0+dGltZXJUeXBlID09IFRMQU5fVElNRVJfQUNUSVZJVFkgKSB7Ci0JCQlwcml2LT50aW1lclNldEF0ID0gamlmZmllczsKK30KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUFJPQkUgLSBMb29rIGZvciBhbiBhZGFwdGVyLCB0aGlzIHJvdXRpbmUncyB2aXNpYmxlIHRvIHRoZSBvdXRzaWRlCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgYm9hcmRfZm91bmQgMQorI2RlZmluZSB2YWxpZF9saW5rIDAKKyNpZmRlZiBFQjUxCitzdGF0aWMgaW50IHRsYW5fcHJvYmUoc3RydWN0IGRldiAqZGV2LCBzdHJ1Y3QgcGNpX2RldmljZSAqcGNpKQoreworCXN0cnVjdCBuaWMgKm5pYyA9IChzdHJ1Y3QgbmljICopIGRldjsKKyNlbHNlCitzdHJ1Y3QgbmljICp0bGFuX3Byb2JlKHN0cnVjdCBuaWMgKm5pYywgdW5zaWduZWQgc2hvcnQgKmlvX2FkZHJzLCBzdHJ1Y3QgcGNpX2RldmljZSAqcGNpKQoreworI2VuZGlmCisJCXUxNiBkYXRhID0gMDsKKwlpbnQgZXJyOworCWludCBpOworCisJaWYgKHBjaS0+aW9hZGRyID09IDApCisJCXJldHVybiAwOworCisJbmljLT5pcnFubyAgPSAwOworCW5pYy0+aW9hZGRyID0gcGNpLT5pb2FkZHIgJiB+MzsKKworCUJBU0UgPSBwY2ktPmlvYWRkcjsKKwlwcmludGYoIlxuIik7CisJcHJpbnRmKCJ0bGFuLmM6ICVzLCAlc1xuIiwgZHJ2X3ZlcnNpb24sIGRydl9kYXRlKTsKKwlwcmludGYoIiVzOiBQcm9iaW5nIGZvciBWZW5kb3IgMHglaFgsIERldmljZSAweCVoWCIsCisJICAgICAgIHBjaS0+bmFtZSwgcGNpLT52ZW5kb3IsIHBjaS0+ZGV2X2lkKTsKKworCisJLyogSSByZWFsbHkgbXVzdCBmaW5kIG91dCB3aGF0IHRoaXMgZG9lcyAqLworCWFkanVzdF9wY2lfZGV2aWNlKHBjaSk7CisKKwkvKiBQb2ludCB0byBwcml2YXRlIHN0b3JhZ2UgKi8KKwlwcml2ID0gJlRMYW5Qcml2YXRlSW5mbzsKKwkvKiBGaWd1cmUgb3V0IHdoaWNoIGNoaXAgd2UncmUgZGVhbGluZyB3aXRoICovCisJaSA9IDA7CisJY2hpcF9pZHggPSAtMTsKKworCXdoaWxlICh0bGFuX3BjaV90YmxbaV0ubmFtZSkgeworCQlpZiAoKCgodTMyKSBwY2ktPmRldl9pZCA8PCAxNikgfCBwY2ktPnZlbmRvcikgPT0KKwkJICAgICh0bGFuX3BjaV90YmxbaV0uaWQucGNpICYgMHhmZmZmZmZmZikpIHsKKwkJCWNoaXBfaWR4ID0gaTsKKwkJCWJyZWFrOwogCQl9CisJCWkrKzsKIAl9CiAKLQlyZXR1cm4gYWNrOworCXByaXYtPnZlbmRvcl9pZCA9IHBjaS0+dmVuZG9yOworCXByaXYtPmRldl9pZCA9IHBjaS0+ZGV2X2lkOworCXByaXYtPm5pY19uYW1lID0gcGNpLT5uYW1lOworCXByaXYtPmVvYyA9IDA7CiAKLX0gLyogVExhbl9IYW5kbGVUeEVPRiAqLworCWVyciA9IDA7CisJZm9yIChpID0gMDsgaSA8IDY7IGkrKykKKwkJZXJyIHw9IFRMYW5fRWVSZWFkQnl0ZShCQVNFLAorCQkJCSAgICAgICAodTgpIHRsYW5fcGNpX3RibFtjaGlwX2lkeF0uCisJCQkJICAgICAgIGFkZHJPZnMgKyBpLAorCQkJCSAgICAgICAodTggKikgJiBuaWMtPm5vZGVfYWRkcltpXSk7CisJaWYgKGVycikgeworCQlwcmludGYoIlRMQU46ICVzOiBFcnJvciByZWFkaW5nIE1BQyBmcm9tIGVlcHJvbTogJWRcbiIsCisJCSAgICAgICBwY2ktPm5hbWUsIGVycik7CisJfSBlbHNlCisJCXByaW50ZigiXG5BZGRyZXNzOiAlIVxuIiwgbmljLT5ub2RlX2FkZHIpOwogCi0JLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCSAqCVRMYW5fSGFuZGxlU3RhdE92ZXJmbG93Ci0JICoKLQkgKglSZXR1cm5zOgotCSAqCQkxCi0JICoJUGFybXM6Ci0JICoJCWRldgkJRGV2aWNlIGFzc2lnbmVkIHRoZSBJUlEgdGhhdCB3YXMKLQkgKgkJCQlyYWlzZWQuCi0JICoJCWhvc3RfaW50CVRoZSBjb250ZW50cyBvZiB0aGUgSE9TVF9JTlQKLQkgKgkJCQlwb3J0LgotCSAqCi0JICoJVGhpcyBmdW5jdGlvbiBoYW5kbGVzIHRoZSBTdGF0aXN0aWNzIE92ZXJmbG93IGludGVycnVwdAotCSAqCXdoaWNoIG1lYW5zIHRoYXQgb25lIG9yIG1vcmUgb2YgdGhlIFRMQU4gc3RhdGlzdGljcwotCSAqCXJlZ2lzdGVycyBoYXMgcmVhY2hlZCAxLzIgY2FwYWNpdHkgYW5kIG5lZWRzIHRvIGJlIHJlYWQuCi0JICoKLQkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisJcHJpdi0+dGxhblJldiA9IFRMYW5fRGlvUmVhZDgoQkFTRSwgVExBTl9ERUZfUkVWSVNJT04pOworCXByaW50ZigiXG5SZXZpc2lvbiA9IDB4JWhYXG4iLCBwcml2LT50bGFuUmV2KTsKIAotdTMyIFRMYW5fSGFuZGxlU3RhdE92ZXJmbG93KCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MTYgaG9zdF9pbnQgKQotewotCVRMYW5fUmVhZEFuZENsZWFyU3RhdHMoIGRldiwgVExBTl9SRUNPUkQgKTsKKwlUTGFuX1Jlc2V0TGlzdHMobmljKTsKKwlUTGFuX1Jlc2V0QWRhcHRlcihuaWMpOworLyoKKwlkYXRhID0gaW5sKEJBU0UgKyBUTEFOX0hPU1RfQ01EKTsKKwlkYXRhIHw9IFRMQU5fSENfRU9DOworCW91dHcoZGF0YSwgQkFTRSArIFRMQU5fSE9TVF9DTUQpOworKi8KKworCWRhdGEgPSBpbmwoQkFTRSArIFRMQU5fSE9TVF9DTUQpOworCWRhdGEgfD0gVExBTl9IQ19JTlRfT0ZGOworCW91dHcoZGF0YSwgQkFTRSArIFRMQU5fSE9TVF9DTUQpOwogCisJVExhbl9TZXRNdWx0aWNhc3RMaXN0KG5pYyk7CisJdWRlbGF5KDEwMCk7IAorCXByaXYtPnR4TGlzdCA9IHR4X3Jpbmc7CisJcHJpdi0+cnhMaXN0ID0gcnhfcmluZzsKKy8qCWlmIChib2FyZF9mb3VuZCAmJiB2YWxpZF9saW5rKQorCXsqLworCS8qIHBvaW50IHRvIE5JQyBzcGVjaWZpYyByb3V0aW5lcyAqLworI2lmZGVmIEVCNTEKKwlkZXYtPmRpc2FibGUgPSB0bGFuX2Rpc2FibGU7CisJbmljLT5wb2xsID0gdGxhbl9wb2xsOworCW5pYy0+dHJhbnNtaXQgPSB0bGFuX3RyYW5zbWl0OworCW5pYy0+aXJxICAgID0gdGxhbl9pcnE7CiAJcmV0dXJuIDE7CisjZWxzZQorCW5pYy0+ZGlzYWJsZSA9IHRsYW5fZGlzYWJsZTsKKwluaWMtPnBvbGwgPSB0bGFuX3BvbGw7CisJbmljLT50cmFuc21pdCA9IHRsYW5fdHJhbnNtaXQ7CisJbmljLT5pcnEgICAgPSB0bGFuX2lycTsKKwlyZXR1cm4gbmljOworI2VuZGlmCit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworCVRodW5kZXJMQU4gRHJpdmVyIEVlcHJvbSByb3V0aW5lcworCisJVGhlIENvbXBhcSBOZXRlbGxpZ2VudCAxMCBhbmQgMTAvMTAwIGNhcmRzIHVzZSBhIE1pY3JvY2hpcCAyNEMwMkEKKwlFRVBST00uICBUaGVzZSBmdW5jdGlvbnMgYXJlIGJhc2VkIG9uIGluZm9ybWF0aW9uIGluIE1pY3JvY2hpcCdzCisJZGF0YSBzaGVldC4gIEkgZG9uJ3Qga25vdyBob3cgd2VsbCB0aGlzIGZ1bmN0aW9ucyB3aWxsIHdvcmsgd2l0aAorCW90aGVyIEVFUFJPTXMuCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLX0gLyogVExhbl9IYW5kbGVTdGF0T3ZlcmZsb3cgKi8KIAogCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkgKglUTGFuX0hhbmRsZVJ4RU9GCisJICoJVExhbl9FZVNlbmRTdGFydAogCSAqCiAJICoJUmV0dXJuczoKLQkgKgkJMQorCSAqCQlOb3RoaW5nCiAJICoJUGFybXM6Ci0JICoJCWRldgkJRGV2aWNlIGFzc2lnbmVkIHRoZSBJUlEgdGhhdCB3YXMKLQkgKgkJCQlyYWlzZWQuCi0JICoJCWhvc3RfaW50CVRoZSBjb250ZW50cyBvZiB0aGUgSE9TVF9JTlQKLQkgKgkJCQlwb3J0LgotCSAqCi0JICoJVGhpcyBmdW5jdGlvbiBoYW5kbGVzIHRoZSBSeCBFT0YgaW50ZXJydXB0IHdoaWNoCi0JICoJaW5kaWNhdGVzIGEgZnJhbWUgaGFzIGJlZW4gcmVjZWl2ZWQgYnkgdGhlIGFkYXB0ZXIgZnJvbQotCSAqCXRoZSBuZXQgYW5kIHRoZSBmcmFtZSBoYXMgYmVlbiB0cmFuc2ZlcnJlZCB0byBtZW1vcnkuCi0JICoJVGhlIGZ1bmN0aW9uIGRldGVybWluZXMgdGhlIGJvdW5jZSBidWZmZXIgdGhlIGZyYW1lIGhhcwotCSAqCWJlZW4gbG9hZGVkIGludG8sIGNyZWF0ZXMgYSBuZXcgc2tfYnVmZiBiaWcgZW5vdWdoIHRvCi0JICoJaG9sZCB0aGUgZnJhbWUsIGFuZCBzZW5kcyBpdCB0byBwcm90b2NvbCBzdGFjay4gIEl0Ci0JICoJdGhlbiByZXNldHMgdGhlIHVzZWQgYnVmZmVyIGFuZCBhcHBlbmRzIGl0IHRvIHRoZSBlbmQKLQkgKglvZiB0aGUgbGlzdC4gIElmIHRoZSBmcmFtZSB3YXMgdGhlIGxhc3QgaW4gdGhlIFJ4Ci0JICoJY2hhbm5lbCAoRU9DKSwgdGhlIGZ1bmN0aW9uIHJlc3RhcnRzIHRoZSByZWNlaXZlIGNoYW5uZWwKLQkgKglieSBzZW5kaW5nIGFuIFJ4IEdvIGNvbW1hbmQgdG8gdGhlIGFkYXB0ZXIuICBUaGVuIGl0Ci0JICoJYWN0aXZhdGVzL2NvbnRpbnVlcyB0aGUgYWN0aXZpdHkgTEVELgorCSAqCQlpb19iYXNlCQlUaGUgSU8gcG9ydCBiYXNlIGFkZHJlc3MgZm9yIHRoZQorCSAqCQkJCVRMQU4gZGV2aWNlIHdpdGggdGhlIEVFUFJPTSB0bworCSAqCQkJCXVzZS4KKwkgKgorCSAqCVRoaXMgZnVuY3Rpb24gc2VuZHMgYSBzdGFydCBjeWNsZSB0byBhbiBFRVBST00gYXR0YWNoZWQKKwkgKgl0byBhIFRMQU4gY2hpcC4KIAkgKgogCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotdTMyIFRMYW5fSGFuZGxlUnhFT0YoIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUxNiBob3N0X2ludCApCit2b2lkIFRMYW5fRWVTZW5kU3RhcnQodTE2IGlvX2Jhc2UpCiB7Ci0JVExhblByaXZhdGVJbmZvCSpwcml2ID0gZGV2LT5wcml2OwotCXUzMgkJYWNrID0gMDsKLQlpbnQJCWVvYyA9IDA7Ci0JdTgJCSpoZWFkX2J1ZmZlcjsKLQlUTGFuTGlzdAkqaGVhZF9saXN0OwotCXN0cnVjdCBza19idWZmCSpza2I7Ci0JVExhbkxpc3QJKnRhaWxfbGlzdDsKLQl2b2lkCQkqdDsKLQl1MzIJCWZyYW1lU2l6ZTsKLQl1MTYJCXRtcENTdGF0OwotCi0JVExBTl9EQkcoIFRMQU5fREVCVUdfUlgsICJSRUNFSVZFOiAgSGFuZGxpbmcgUlggRU9GIChIZWFkPSVkIFRhaWw9JWQpXG4iLCBwcml2LT5yeEhlYWQsIHByaXYtPnJ4VGFpbCApOwotCWhlYWRfbGlzdCA9IHByaXYtPnJ4TGlzdCArIHByaXYtPnJ4SGVhZDsKLQkKLQl3aGlsZSAoKCh0bXBDU3RhdCA9IGhlYWRfbGlzdC0+Y1N0YXQpICYgVExBTl9DU1RBVF9GUk1fQ01QKSAmJiAoYWNrIDwgMjU1KSkgewotCQlmcmFtZVNpemUgPSBoZWFkX2xpc3QtPmZyYW1lU2l6ZTsKLQkJYWNrKys7Ci0JCWlmICh0bXBDU3RhdCAmIFRMQU5fQ1NUQVRfRU9DKQotCQkJZW9jID0gMTsKLQkJCi0JCWlmIChiYnVmKSB7Ci0JCQlza2IgPSBkZXZfYWxsb2Nfc2tiKGZyYW1lU2l6ZSArIDcpOwotCQkJaWYgKHNrYiA9PSBOVUxMKQotCQkJCXByaW50ayhLRVJOX0lORk8gIlRMQU46IENvdWxkbid0IGFsbG9jYXRlIG1lbW9yeSBmb3IgcmVjZWl2ZWQgZGF0YS5cbiIpOwotCQkJZWxzZSB7Ci0JCQkJaGVhZF9idWZmZXIgPSBwcml2LT5yeEJ1ZmZlciArIChwcml2LT5yeEhlYWQgKiBUTEFOX01BWF9GUkFNRV9TSVpFKTsKLQkJCQlza2ItPmRldiA9IGRldjsKLQkJCQlza2JfcmVzZXJ2ZShza2IsIDIpOwotCQkJCXQgPSAodm9pZCAqKSBza2JfcHV0KHNrYiwgZnJhbWVTaXplKTsKLQkJCi0JCQkJcHJpdi0+c3RhdHMucnhfYnl0ZXMgKz0gaGVhZF9saXN0LT5mcmFtZVNpemU7Ci0KLQkJCQltZW1jcHkoIHQsIGhlYWRfYnVmZmVyLCBmcmFtZVNpemUgKTsKLQkJCQlza2ItPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMoIHNrYiwgZGV2ICk7Ci0JCQkJbmV0aWZfcngoIHNrYiApOwotCQkJfQotCQl9IGVsc2UgewotCQkJc3RydWN0IHNrX2J1ZmYgKm5ld19za2I7Ci0JCQotCQkJLyoKLQkJIAkqCUkgY2hhbmdlZCB0aGUgYWxnb3JpdGhtIGhlcmUuIFdoYXQgd2Ugbm93IGRvCi0JCSAJKglpcyBhbGxvY2F0ZSB0aGUgbmV3IGZyYW1lLiBJZiB0aGlzIGZhaWxzIHdlCi0JCSAJKglzaW1wbHkgcmVjeWNsZSB0aGUgZnJhbWUuCi0JCSAJKi8KLQkJCi0JCQluZXdfc2tiID0gZGV2X2FsbG9jX3NrYiggVExBTl9NQVhfRlJBTUVfU0laRSArIDcgKTsKLQkJCQotCQkJaWYgKCBuZXdfc2tiICE9IE5VTEwgKSB7Ci0JCQkJLyogSWYgdGhpcyBldmVyIGhhcHBlbmVkIGl0IHdvdWxkIGJlIGEgcHJvYmxlbSAqLwotCQkJCS8qIG5vdCBhbnkgbW9yZSAtIGFjICovCi0JCQkJc2tiID0gKHN0cnVjdCBza19idWZmICopIGhlYWRfbGlzdC0+YnVmZmVyWzldLmFkZHJlc3M7Ci0JCQkJc2tiX3RyaW0oIHNrYiwgZnJhbWVTaXplICk7Ci0KLQkJCQlwcml2LT5zdGF0cy5yeF9ieXRlcyArPSBmcmFtZVNpemU7CisJdTE2IHNpbzsKIAotCQkJCXNrYi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyggc2tiLCBkZXYgKTsKLQkJCQluZXRpZl9yeCggc2tiICk7Ci0JCi0JCQkJbmV3X3NrYi0+ZGV2ID0gZGV2OwotCQkJCXNrYl9yZXNlcnZlKCBuZXdfc2tiLCAyICk7Ci0JCQkJdCA9ICh2b2lkICopIHNrYl9wdXQoIG5ld19za2IsIFRMQU5fTUFYX0ZSQU1FX1NJWkUgKTsKLQkJCQloZWFkX2xpc3QtPmJ1ZmZlclswXS5hZGRyZXNzID0gdmlydF90b19idXMoIHQgKTsKLQkJCQloZWFkX2xpc3QtPmJ1ZmZlcls4XS5hZGRyZXNzID0gKHUzMikgdDsKLQkJCQloZWFkX2xpc3QtPmJ1ZmZlcls5XS5hZGRyZXNzID0gKHUzMikgbmV3X3NrYjsKLQkJCX0gZWxzZSAKLQkJCQlwcmludGsoS0VSTl9XQVJOSU5HICJUTEFOOiAgQ291bGRuJ3QgYWxsb2NhdGUgbWVtb3J5IGZvciByZWNlaXZlZCBkYXRhLlxuIiApOwotCQl9CisJb3V0dyhUTEFOX05FVF9TSU8sIGlvX2Jhc2UgKyBUTEFOX0RJT19BRFIpOworCXNpbyA9IGlvX2Jhc2UgKyBUTEFOX0RJT19EQVRBICsgVExBTl9ORVRfU0lPOwogCi0JCWhlYWRfbGlzdC0+Zm9yd2FyZCA9IDA7Ci0JCWhlYWRfbGlzdC0+Y1N0YXQgPSAwOwotCQl0YWlsX2xpc3QgPSBwcml2LT5yeExpc3QgKyBwcml2LT5yeFRhaWw7Ci0JCXRhaWxfbGlzdC0+Zm9yd2FyZCA9IHZpcnRfdG9fYnVzKCBoZWFkX2xpc3QgKTsKLQotCQlDSVJDX0lOQyggcHJpdi0+cnhIZWFkLCBUTEFOX05VTV9SWF9MSVNUUyApOwotCQlDSVJDX0lOQyggcHJpdi0+cnhUYWlsLCBUTEFOX05VTV9SWF9MSVNUUyApOwotCQloZWFkX2xpc3QgPSBwcml2LT5yeExpc3QgKyBwcml2LT5yeEhlYWQ7Ci0JfQorCVRMYW5fU2V0Qml0KFRMQU5fTkVUX1NJT19FQ0xPSywgc2lvKTsKKwlUTGFuX1NldEJpdChUTEFOX05FVF9TSU9fRURBVEEsIHNpbyk7CisJVExhbl9TZXRCaXQoVExBTl9ORVRfU0lPX0VUWEVOLCBzaW8pOworCVRMYW5fQ2xlYXJCaXQoVExBTl9ORVRfU0lPX0VEQVRBLCBzaW8pOworCVRMYW5fQ2xlYXJCaXQoVExBTl9ORVRfU0lPX0VDTE9LLCBzaW8pOwogCi0JaWYgKCFhY2spCi0JCXByaW50ayhLRVJOX0lORk8gIlRMQU46IFJlY2VpdmVkIGludGVycnVwdCBmb3IgdW5jb21wbGV0ZWQgUlggZnJhbWUuXG4iKTsKLQkKK30JCQkJLyogVExhbl9FZVNlbmRTdGFydCAqLwogCi0JaWYgKCBlb2MgKSB7IAotCQlUTEFOX0RCRyggVExBTl9ERUJVR19SWCwgIlJFQ0VJVkU6ICBIYW5kbGluZyBSWCBFT0MgKEhlYWQ9JWQgVGFpbD0lZClcbiIsIHByaXYtPnJ4SGVhZCwgcHJpdi0+cnhUYWlsICk7Ci0JCWhlYWRfbGlzdCA9IHByaXYtPnJ4TGlzdCArIHByaXYtPnJ4SGVhZDsKLQkJb3V0bCggdmlydF90b19idXMoIGhlYWRfbGlzdCApLCBkZXYtPmJhc2VfYWRkciArIFRMQU5fQ0hfUEFSTSApOwotCQlhY2sgfD0gVExBTl9IQ19HTyB8IFRMQU5fSENfUlQ7Ci0JCXByaXYtPnJ4RW9jQ291bnQrKzsKLQl9Ci0KLQlpZiAoIHByaXYtPmFkYXB0ZXItPmZsYWdzICYgVExBTl9BREFQVEVSX0FDVElWSVRZX0xFRCApIHsKLQkJVExhbl9EaW9Xcml0ZTgoIGRldi0+YmFzZV9hZGRyLCBUTEFOX0xFRF9SRUcsIFRMQU5fTEVEX0xJTksgfCBUTEFOX0xFRF9BQ1QgKTsKLQkJaWYgKCBwcml2LT50aW1lci5mdW5jdGlvbiA9PSBOVUxMICkgIHsKLQkJCXByaXYtPnRpbWVyLmZ1bmN0aW9uID0gJlRMYW5fVGltZXI7Ci0JCQlwcml2LT50aW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpIGRldjsKLQkJCXByaXYtPnRpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgVExBTl9USU1FUl9BQ1RfREVMQVk7Ci0JCQlwcml2LT50aW1lclNldEF0ID0gamlmZmllczsKLQkJCXByaXYtPnRpbWVyVHlwZSA9IFRMQU5fVElNRVJfQUNUSVZJVFk7Ci0JCQlhZGRfdGltZXIoJnByaXYtPnRpbWVyKTsKLQkJfSBlbHNlIGlmICggcHJpdi0+dGltZXJUeXBlID09IFRMQU5fVElNRVJfQUNUSVZJVFkgKSB7Ci0JCQlwcml2LT50aW1lclNldEF0ID0gamlmZmllczsKLQkJfQotCX0KIAotCWRldi0+bGFzdF9yeCA9IGppZmZpZXM7Ci0JCi0JcmV0dXJuIGFjazsKIAotfSAvKiBUTGFuX0hhbmRsZVJ4RU9GICovCiAKIAkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JICoJVExhbl9IYW5kbGVEdW1teQorCSAqCVRMYW5fRWVTZW5kQnl0ZQogCSAqCiAJICoJUmV0dXJuczoKLQkgKgkJMQotCSAqCVBhcm1zOgotCSAqCQlkZXYJCURldmljZSBhc3NpZ25lZCB0aGUgSVJRIHRoYXQgd2FzCi0JICoJCQkJcmFpc2VkLgotCSAqCQlob3N0X2ludAlUaGUgY29udGVudHMgb2YgdGhlIEhPU1RfSU5UCi0JICoJCQkJcG9ydC4KLQkgKgotCSAqCVRoaXMgZnVuY3Rpb24gaGFuZGxlcyB0aGUgRHVtbXkgaW50ZXJydXB0LCB3aGljaCBpcwotCSAqCXJhaXNlZCB3aGVuZXZlciBhIHRlc3QgaW50ZXJydXB0IGlzIGdlbmVyYXRlZCBieSBzZXR0aW5nCi0JICoJdGhlIFJlcV9JbnQgYml0IG9mIEhPU1RfQ01EIHRvIDEuCisJICoJCUlmIHRoZSBjb3JyZWN0IGFjayB3YXMgcmVjZWl2ZWQsIDAsIG90aGVyd2lzZSAxCisJICoJUGFybXM6CWlvX2Jhc2UJCVRoZSBJTyBwb3J0IGJhc2UgYWRkcmVzcyBmb3IgdGhlCisJICoJCQkJVExBTiBkZXZpY2Ugd2l0aCB0aGUgRUVQUk9NIHRvCisJICoJCQkJdXNlLgorCSAqCQlkYXRhCQlUaGUgOCBiaXRzIG9mIGluZm9ybWF0aW9uIHRvCisJICoJCQkJc2VuZCB0byB0aGUgRUVQUk9NLgorCSAqCQlzdG9wCQlJZiBUTEFOX0VFUFJPTV9TVE9QIGlzIHBhc3NlZCwgYQorCSAqCQkJCXN0b3AgY3ljbGUgaXMgc2VudCBhZnRlciB0aGUKKwkgKgkJCQlieXRlIGlzIHNlbnQgYWZ0ZXIgdGhlIGFjayBpcworCSAqCQkJCXJlYWQuCisJICoKKwkgKglUaGlzIGZ1bmN0aW9uIHNlbmRzIGEgYnl0ZSBvbiB0aGUgc2VyaWFsIEVFUFJPTSBsaW5lLAorCSAqCWRyaXZpbmcgdGhlIGNsb2NrIHRvIHNlbmQgZWFjaCBiaXQuIFRoZSBmdW5jdGlvbiB0aGVuCisJICoJcmV2ZXJzZXMgdHJhbnNtaXNzaW9uIGRpcmVjdGlvbiBhbmQgcmVhZHMgYW4gYWNrbm93bGVkZ2UKKwkgKgliaXQuCiAJICoKIAkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXUzMiBUTGFuX0hhbmRsZUR1bW15KCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MTYgaG9zdF9pbnQgKQoraW50IFRMYW5fRWVTZW5kQnl0ZSh1MTYgaW9fYmFzZSwgdTggZGF0YSwgaW50IHN0b3ApCiB7Ci0JcHJpbnRrKCAiVExBTjogIFRlc3QgaW50ZXJydXB0IG9uICVzLlxuIiwgZGV2LT5uYW1lICk7Ci0JcmV0dXJuIDE7CisJaW50IGVycjsKKwl1OCBwbGFjZTsKKwl1MTYgc2lvOwogCi19IC8qIFRMYW5fSGFuZGxlRHVtbXkgKi8KKwlvdXR3KFRMQU5fTkVUX1NJTywgaW9fYmFzZSArIFRMQU5fRElPX0FEUik7CisJc2lvID0gaW9fYmFzZSArIFRMQU5fRElPX0RBVEEgKyBUTEFOX05FVF9TSU87CiAKLQkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JICoJVExhbl9IYW5kbGVUeEVPQwotCSAqCi0JICoJUmV0dXJuczoKLQkgKgkJMQotCSAqCVBhcm1zOgotCSAqCQlkZXYJCURldmljZSBhc3NpZ25lZCB0aGUgSVJRIHRoYXQgd2FzCi0JICoJCQkJcmFpc2VkLgotCSAqCQlob3N0X2ludAlUaGUgY29udGVudHMgb2YgdGhlIEhPU1RfSU5UCi0JICoJCQkJcG9ydC4KLQkgKgotCSAqCVRoaXMgZHJpdmVyIGlzIHN0cnVjdHVyZWQgdG8gZGV0ZXJtaW5lIEVPQyBvY2N1cmFuY2VzIGJ5Ci0JICoJcmVhZGluZyB0aGUgQ1NUQVQgbWVtYmVyIG9mIHRoZSBsaXN0IHN0cnVjdHVyZS4gIFR4IEVPQwotCSAqCWludGVycnVwdHMgYXJlIGRpc2FibGVkIHZpYSB0aGUgRElPIElOVERJUyByZWdpc3Rlci4KLQkgKglIb3dldmVyLCBUTEFOIGNoaXBzIGJlZm9yZSByZXZpc2lvbiAzLjAgZGlkbid0IGhhdmUgdGhpcwotCSAqCWZ1bmN0aW9uYWxpdHksIHNvIHByb2Nlc3MgRU9DIGV2ZW50cyBpZiB0aGlzIGlzIHRoZQotCSAqCWNhc2UuCi0JICoKLQkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisJLyogQXNzdW1lIGNsb2NrIGlzIGxvdywgdHggaXMgZW5hYmxlZDsgKi8KKwlmb3IgKHBsYWNlID0gMHg4MDsgcGxhY2UgIT0gMDsgcGxhY2UgPj49IDEpIHsKKwkJaWYgKHBsYWNlICYgZGF0YSkKKwkJCVRMYW5fU2V0Qml0KFRMQU5fTkVUX1NJT19FREFUQSwgc2lvKTsKKwkJZWxzZQorCQkJVExhbl9DbGVhckJpdChUTEFOX05FVF9TSU9fRURBVEEsIHNpbyk7CisJCVRMYW5fU2V0Qml0KFRMQU5fTkVUX1NJT19FQ0xPSywgc2lvKTsKKwkJVExhbl9DbGVhckJpdChUTEFOX05FVF9TSU9fRUNMT0ssIHNpbyk7CisJfQorCVRMYW5fQ2xlYXJCaXQoVExBTl9ORVRfU0lPX0VUWEVOLCBzaW8pOworCVRMYW5fU2V0Qml0KFRMQU5fTkVUX1NJT19FQ0xPSywgc2lvKTsKKwllcnIgPSBUTGFuX0dldEJpdChUTEFOX05FVF9TSU9fRURBVEEsIHNpbyk7CisJVExhbl9DbGVhckJpdChUTEFOX05FVF9TSU9fRUNMT0ssIHNpbyk7CisJVExhbl9TZXRCaXQoVExBTl9ORVRfU0lPX0VUWEVOLCBzaW8pOwogCi11MzIgVExhbl9IYW5kbGVUeEVPQyggc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTE2IGhvc3RfaW50ICkKLXsKLQlUTGFuUHJpdmF0ZUluZm8JKnByaXYgPSBkZXYtPnByaXY7Ci0JVExhbkxpc3QJCSpoZWFkX2xpc3Q7Ci0JdTMyCQkJYWNrID0gMTsKLQkKLQlob3N0X2ludCA9IDA7Ci0JaWYgKCBwcml2LT50bGFuUmV2IDwgMHgzMCApIHsKLQkJVExBTl9EQkcoIFRMQU5fREVCVUdfVFgsICJUUkFOU01JVDogIEhhbmRsaW5nIFRYIEVPQyAoSGVhZD0lZCBUYWlsPSVkKSAtLSBJUlFcbiIsIHByaXYtPnR4SGVhZCwgcHJpdi0+dHhUYWlsICk7Ci0JCWhlYWRfbGlzdCA9IHByaXYtPnR4TGlzdCArIHByaXYtPnR4SGVhZDsKLQkJaWYgKCAoIGhlYWRfbGlzdC0+Y1N0YXQgJiBUTEFOX0NTVEFUX1JFQURZICkgPT0gVExBTl9DU1RBVF9SRUFEWSApIHsKLQkJCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKLQkJCW91dGwoIHZpcnRfdG9fYnVzKCBoZWFkX2xpc3QgKSwgZGV2LT5iYXNlX2FkZHIgKyBUTEFOX0NIX1BBUk0gKTsKLQkJCWFjayB8PSBUTEFOX0hDX0dPOwotCQl9IGVsc2UgewotCQkJcHJpdi0+dHhJblByb2dyZXNzID0gMDsKLQkJfQorCWlmICgoIWVycikgJiYgc3RvcCkgeworCQlUTGFuX0NsZWFyQml0KFRMQU5fTkVUX1NJT19FREFUQSwgc2lvKTsJLyogU1RPUCwgcmFpc2UgZGF0YSB3aGlsZSBjbG9jayBpcyBoaWdoICovCisJCVRMYW5fU2V0Qml0KFRMQU5fTkVUX1NJT19FQ0xPSywgc2lvKTsKKwkJVExhbl9TZXRCaXQoVExBTl9ORVRfU0lPX0VEQVRBLCBzaW8pOwogCX0KIAotCXJldHVybiBhY2s7CisJcmV0dXJuIChlcnIpOworCit9CQkJCS8qIFRMYW5fRWVTZW5kQnl0ZSAqLworCisKIAotfSAvKiBUTGFuX0hhbmRsZVR4RU9DICovCiAKIAkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JICoJVExhbl9IYW5kbGVTdGF0dXNDaGVjaworCSAqCVRMYW5fRWVSZWNlaXZlQnl0ZQogCSAqCiAJICoJUmV0dXJuczoKLQkgKgkJMCBpZiBBZGFwdGVyIGNoZWNrLCAxIGlmIE5ldHdvcmsgU3RhdHVzIGNoZWNrLgorCSAqCQlOb3RoaW5nCiAJICoJUGFybXM6Ci0JICoJCWRldgkJRGV2aWNlIGFzc2lnbmVkIHRoZSBJUlEgdGhhdCB3YXMKLQkgKgkJCQlyYWlzZWQuCi0JICoJCWhvc3RfaW50CVRoZSBjb250ZW50cyBvZiB0aGUgSE9TVF9JTlQKLQkgKgkJCQlwb3J0LgotCSAqCi0JICoJVGhpcyBmdW5jdGlvbiBoYW5kbGVzIEFkYXB0ZXIgQ2hlY2svTmV0d29yayBTdGF0dXMKLQkgKglpbnRlcnJ1cHRzIGdlbmVyYXRlZCBieSB0aGUgYWRhcHRlci4gIEl0IGNoZWNrcyB0aGUKLQkgKgl2ZWN0b3IgaW4gdGhlIEhPU1RfSU5UIHJlZ2lzdGVyIHRvIGRldGVybWluZSBpZiBpdCBpcwotCSAqCWFuIEFkYXB0ZXIgQ2hlY2sgaW50ZXJydXB0LiAgSWYgc28sIGl0IHJlc2V0cyB0aGUKLQkgKglhZGFwdGVyLiAgT3RoZXJ3aXNlIGl0IGNsZWFycyB0aGUgc3RhdHVzIHJlZ2lzdGVycwotCSAqCWFuZCBzZXJ2aWNlcyB0aGUgUEhZLgorCSAqCQlpb19iYXNlCQlUaGUgSU8gcG9ydCBiYXNlIGFkZHJlc3MgZm9yIHRoZQorCSAqCQkJCVRMQU4gZGV2aWNlIHdpdGggdGhlIEVFUFJPTSB0bworCSAqCQkJCXVzZS4KKwkgKgkJZGF0YQkJQW4gYWRkcmVzcyB0byBhIGNoYXIgdG8gaG9sZCB0aGUKKwkgKgkJCQlkYXRhIHNlbnQgZnJvbSB0aGUgRUVQUk9NLgorCSAqCQlzdG9wCQlJZiBUTEFOX0VFUFJPTV9TVE9QIGlzIHBhc3NlZCwgYQorCSAqCQkJCXN0b3AgY3ljbGUgaXMgc2VudCBhZnRlciB0aGUKKwkgKgkJCQlieXRlIGlzIHJlY2VpdmVkLCBhbmQgbm8gYWNrIGlzCisJICoJCQkJc2VudC4KKwkgKgorCSAqCVRoaXMgZnVuY3Rpb24gcmVjZWl2ZXMgOCBiaXRzIG9mIGRhdGEgZnJvbSB0aGUgRUVQUk9NCisJICoJb3ZlciB0aGUgc2VyaWFsIGxpbmsuICBJdCB0aGVuIHNlbmRzIGFuZCBhY2sgYml0LCBvciBubworCSAqCWFjayBhbmQgYSBzdG9wIGJpdC4gIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byByZXRyaWV2ZQorCSAqCWRhdGEgYWZ0ZXIgdGhlIGFkZHJlc3Mgb2YgYSBieXRlIGluIHRoZSBFRVBST00gaGFzIGJlZW4KKwkgKglzZW50LgogCSAqCiAJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi11MzIgVExhbl9IYW5kbGVTdGF0dXNDaGVjayggc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTE2IGhvc3RfaW50ICkKLXsJCi0JVExhblByaXZhdGVJbmZvCSpwcml2ID0gZGV2LT5wcml2OwotCXUzMgkJYWNrOwotCXUzMgkJZXJyb3I7Ci0JdTgJCW5ldF9zdHM7Ci0JdTMyCQlwaHk7Ci0JdTE2CQl0bHBoeV9jdGw7Ci0JdTE2CQl0bHBoeV9zdHM7Ci0JCi0JYWNrID0gMTsKLQlpZiAoIGhvc3RfaW50ICYgVExBTl9ISV9JVl9NQVNLICkgewotCQluZXRpZl9zdG9wX3F1ZXVlKCBkZXYgKTsKLQkJZXJyb3IgPSBpbmwoIGRldi0+YmFzZV9hZGRyICsgVExBTl9DSF9QQVJNICk7Ci0JCXByaW50ayggIlRMQU46ICAlczogQWRhcHRvciBFcnJvciA9IDB4JXhcbiIsIGRldi0+bmFtZSwgZXJyb3IgKTsKLQkJVExhbl9SZWFkQW5kQ2xlYXJTdGF0cyggZGV2LCBUTEFOX1JFQ09SRCApOwotCQlvdXRsKCBUTEFOX0hDX0FEX1JTVCwgZGV2LT5iYXNlX2FkZHIgKyBUTEFOX0hPU1RfQ01EICk7Ci0JCQotCQlxdWV1ZV90YXNrKCZwcml2LT50bGFuX3RxdWV1ZSwgJnRxX2ltbWVkaWF0ZSk7Ci0JCW1hcmtfYmgoSU1NRURJQVRFX0JIKTsKLQkJCi0JCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKLQkJYWNrID0gMDsKLQl9IGVsc2UgewotCQlUTEFOX0RCRyggVExBTl9ERUJVR19HTlJMLCAiJXM6IFN0YXR1cyBDaGVja1xuIiwgZGV2LT5uYW1lICk7Ci0JCXBoeSA9IHByaXYtPnBoeVtwcml2LT5waHlOdW1dOwordm9pZCBUTGFuX0VlUmVjZWl2ZUJ5dGUodTE2IGlvX2Jhc2UsIHU4ICogZGF0YSwgaW50IHN0b3ApCit7CisJdTggcGxhY2U7CisJdTE2IHNpbzsKIAotCQluZXRfc3RzID0gVExhbl9EaW9SZWFkOCggZGV2LT5iYXNlX2FkZHIsIFRMQU5fTkVUX1NUUyApOwotCQlpZiAoIG5ldF9zdHMgKSB7Ci0JCQlUTGFuX0Rpb1dyaXRlOCggZGV2LT5iYXNlX2FkZHIsIFRMQU5fTkVUX1NUUywgbmV0X3N0cyApOwotCQkJVExBTl9EQkcoIFRMQU5fREVCVUdfR05STCwgIiVzOiAgICBOZXRfU3RzID0gJXhcbiIsIGRldi0+bmFtZSwgKHVuc2lnbmVkKSBuZXRfc3RzICk7Ci0JCX0KLQkJaWYgKCAoIG5ldF9zdHMgJiBUTEFOX05FVF9TVFNfTUlSUSApICYmICAoIHByaXYtPnBoeU51bSA9PSAwICkgKSB7Ci0JCQlUTGFuX01paVJlYWRSZWcoIGRldiwgcGh5LCBUTEFOX1RMUEhZX1NUUywgJnRscGh5X3N0cyApOwotCQkJVExhbl9NaWlSZWFkUmVnKCBkZXYsIHBoeSwgVExBTl9UTFBIWV9DVEwsICZ0bHBoeV9jdGwgKTsKLSAgICAgICAgCQlpZiAoICEgKCB0bHBoeV9zdHMgJiBUTEFOX1RTX1BPTE9LICkgJiYgISAoIHRscGh5X2N0bCAmIFRMQU5fVENfU1dBUE9MICkgKSB7Ci0gICAgICAgICAgICAgICAgCQl0bHBoeV9jdGwgfD0gVExBTl9UQ19TV0FQT0w7Ci0gICAgICAgICAgICAgICAgCQlUTGFuX01paVdyaXRlUmVnKCBkZXYsIHBoeSwgVExBTl9UTFBIWV9DVEwsIHRscGh5X2N0bCk7Ci0gICAgICAgIAkJfSBlbHNlIGlmICggKCB0bHBoeV9zdHMgJiBUTEFOX1RTX1BPTE9LICkgJiYgKCB0bHBoeV9jdGwgJiBUTEFOX1RDX1NXQVBPTCApICkgewotICAgICAgICAgICAgICAgIAkJdGxwaHlfY3RsICY9IH5UTEFOX1RDX1NXQVBPTDsKLSAgICAgICAgICAgICAgICAJCVRMYW5fTWlpV3JpdGVSZWcoIGRldiwgcGh5LCBUTEFOX1RMUEhZX0NUTCwgdGxwaHlfY3RsKTsKLSAgICAgICAgCQl9CisJb3V0dyhUTEFOX05FVF9TSU8sIGlvX2Jhc2UgKyBUTEFOX0RJT19BRFIpOworCXNpbyA9IGlvX2Jhc2UgKyBUTEFOX0RJT19EQVRBICsgVExBTl9ORVRfU0lPOworCSpkYXRhID0gMDsKIAotCQkJaWYgKGRlYnVnKSB7Ci0JCQkJVExhbl9QaHlQcmludCggZGV2ICk7CQkKLQkJCX0KLQkJfQorCS8qIEFzc3VtZSBjbG9jayBpcyBsb3csIHR4IGlzIGVuYWJsZWQ7ICovCisJVExhbl9DbGVhckJpdChUTEFOX05FVF9TSU9fRVRYRU4sIHNpbyk7CisJZm9yIChwbGFjZSA9IDB4ODA7IHBsYWNlOyBwbGFjZSA+Pj0gMSkgeworCQlUTGFuX1NldEJpdChUTEFOX05FVF9TSU9fRUNMT0ssIHNpbyk7CisJCWlmIChUTGFuX0dldEJpdChUTEFOX05FVF9TSU9fRURBVEEsIHNpbykpCisJCQkqZGF0YSB8PSBwbGFjZTsKKwkJVExhbl9DbGVhckJpdChUTEFOX05FVF9TSU9fRUNMT0ssIHNpbyk7CisJfQorCisJVExhbl9TZXRCaXQoVExBTl9ORVRfU0lPX0VUWEVOLCBzaW8pOworCWlmICghc3RvcCkgeworCQlUTGFuX0NsZWFyQml0KFRMQU5fTkVUX1NJT19FREFUQSwgc2lvKTsJLyogQWNrID0gMCAqLworCQlUTGFuX1NldEJpdChUTEFOX05FVF9TSU9fRUNMT0ssIHNpbyk7CisJCVRMYW5fQ2xlYXJCaXQoVExBTl9ORVRfU0lPX0VDTE9LLCBzaW8pOworCX0gZWxzZSB7CisJCVRMYW5fU2V0Qml0KFRMQU5fTkVUX1NJT19FREFUQSwgc2lvKTsJLyogTm8gYWNrID0gMSAoPykgKi8KKwkJVExhbl9TZXRCaXQoVExBTl9ORVRfU0lPX0VDTE9LLCBzaW8pOworCQlUTGFuX0NsZWFyQml0KFRMQU5fTkVUX1NJT19FQ0xPSywgc2lvKTsKKwkJVExhbl9DbGVhckJpdChUTEFOX05FVF9TSU9fRURBVEEsIHNpbyk7CS8qIFNUT1AsIHJhaXNlIGRhdGEgd2hpbGUgY2xvY2sgaXMgaGlnaCAqLworCQlUTGFuX1NldEJpdChUTEFOX05FVF9TSU9fRUNMT0ssIHNpbyk7CisJCVRMYW5fU2V0Qml0KFRMQU5fTkVUX1NJT19FREFUQSwgc2lvKTsKIAl9CiAKLQlyZXR1cm4gYWNrOworfQkJCQkvKiBUTGFuX0VlUmVjZWl2ZUJ5dGUgKi8KKwogCi19IC8qIFRMYW5fSGFuZGxlU3RhdHVzQ2hlY2sgKi8KIAogCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkgKglUTGFuX0hhbmRsZVJ4RU9DCisJICoJVExhbl9FZVJlYWRCeXRlCiAJICoKIAkgKglSZXR1cm5zOgotCSAqCQkxCisJICoJCU5vIGVycm9yID0gMCwgZWxzZSwgdGhlIHN0YWdlIGF0IHdoaWNoIHRoZSBlcnJvcgorCSAqCQlvY2N1cnJlZC4KIAkgKglQYXJtczoKLQkgKgkJZGV2CQlEZXZpY2UgYXNzaWduZWQgdGhlIElSUSB0aGF0IHdhcwotCSAqCQkJCXJhaXNlZC4KLQkgKgkJaG9zdF9pbnQJVGhlIGNvbnRlbnRzIG9mIHRoZSBIT1NUX0lOVAotCSAqCQkJCXBvcnQuCi0JICoKLQkgKglUaGlzIGRyaXZlciBpcyBzdHJ1Y3R1cmVkIHRvIGRldGVybWluZSBFT0Mgb2NjdXJhbmNlcyBieQotCSAqCXJlYWRpbmcgdGhlIENTVEFUIG1lbWJlciBvZiB0aGUgbGlzdCBzdHJ1Y3R1cmUuICBSeCBFT0MKLQkgKglpbnRlcnJ1cHRzIGFyZSBkaXNhYmxlZCB2aWEgdGhlIERJTyBJTlRESVMgcmVnaXN0ZXIuCi0JICoJSG93ZXZlciwgVExBTiBjaGlwcyBiZWZvcmUgcmV2aXNpb24gMy4wIGRpZG4ndCBoYXZlIHRoaXMKLQkgKglDU1RBVCBtZW1iZXIgb3IgYSBJTlRESVMgcmVnaXN0ZXIsIHNvIGlmIHRoaXMgY2hpcCBpcwotCSAqCXByZS0zLjAsIHByb2Nlc3MgRU9DIGludGVycnVwdHMgbm9ybWFsbHkuCisJICoJCWlvX2Jhc2UJCVRoZSBJTyBwb3J0IGJhc2UgYWRkcmVzcyBmb3IgdGhlCisJICoJCQkJVExBTiBkZXZpY2Ugd2l0aCB0aGUgRUVQUk9NIHRvCisJICoJCQkJdXNlLgorCSAqCQllZV9hZGRyCQlUaGUgYWRkcmVzcyBvZiB0aGUgYnl0ZSBpbiB0aGUKKwkgKgkJCQlFRVBST00gd2hvc2UgY29udGVudHMgYXJlIHRvIGJlCisJICoJCQkJcmV0cmlldmVkLgorCSAqCQlkYXRhCQlBbiBhZGRyZXNzIHRvIGEgY2hhciB0byBob2xkIHRoZQorCSAqCQkJCWRhdGEgb2J0YWluZWQgZnJvbSB0aGUgRUVQUk9NLgorCSAqCisJICoJVGhpcyBmdW5jdGlvbiByZWFkcyBhIGJ5dGUgb2YgaW5mb3JtYXRpb24gZnJvbSBhbiBieXRlCisJICoJY2VsbCBpbiB0aGUgRUVQUk9NLgogCSAqCiAJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi11MzIgVExhbl9IYW5kbGVSeEVPQyggc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTE2IGhvc3RfaW50ICkKK2ludCBUTGFuX0VlUmVhZEJ5dGUodTE2IGlvX2Jhc2UsIHU4IGVlX2FkZHIsIHU4ICogZGF0YSkKIHsKLQlUTGFuUHJpdmF0ZUluZm8JKnByaXYgPSBkZXYtPnByaXY7Ci0JVExhbkxpc3QJKmhlYWRfbGlzdDsKLQl1MzIJCWFjayA9IDE7CisJaW50IGVycjsKKwlpbnQgcmV0ID0gMDsKIAotCWlmICggIHByaXYtPnRsYW5SZXYgPCAweDMwICkgewotCQlUTEFOX0RCRyggVExBTl9ERUJVR19SWCwgIlJFQ0VJVkU6ICBIYW5kbGluZyBSWCBFT0MgKEhlYWQ9JWQgVGFpbD0lZCkgLS0gSVJRXG4iLCBwcml2LT5yeEhlYWQsIHByaXYtPnJ4VGFpbCApOwotCQloZWFkX2xpc3QgPSBwcml2LT5yeExpc3QgKyBwcml2LT5yeEhlYWQ7Ci0JCW91dGwoIHZpcnRfdG9fYnVzKCBoZWFkX2xpc3QgKSwgZGV2LT5iYXNlX2FkZHIgKyBUTEFOX0NIX1BBUk0gKTsKLQkJYWNrIHw9IFRMQU5fSENfR08gfCBUTEFOX0hDX1JUOwotCQlwcml2LT5yeEVvY0NvdW50Kys7CisKKwlUTGFuX0VlU2VuZFN0YXJ0KGlvX2Jhc2UpOworCWVyciA9IFRMYW5fRWVTZW5kQnl0ZShpb19iYXNlLCAweEEwLCBUTEFOX0VFUFJPTV9BQ0spOworCWlmIChlcnIpIHsKKwkJcmV0ID0gMTsKKwkJZ290byBmYWlsOworCX0KKwllcnIgPSBUTGFuX0VlU2VuZEJ5dGUoaW9fYmFzZSwgZWVfYWRkciwgVExBTl9FRVBST01fQUNLKTsKKwlpZiAoZXJyKSB7CisJCXJldCA9IDI7CisJCWdvdG8gZmFpbDsKKwl9CisJVExhbl9FZVNlbmRTdGFydChpb19iYXNlKTsKKwllcnIgPSBUTGFuX0VlU2VuZEJ5dGUoaW9fYmFzZSwgMHhBMSwgVExBTl9FRVBST01fQUNLKTsKKwlpZiAoZXJyKSB7CisJCXJldCA9IDM7CisJCWdvdG8gZmFpbDsKIAl9CisJVExhbl9FZVJlY2VpdmVCeXRlKGlvX2Jhc2UsIGRhdGEsIFRMQU5fRUVQUk9NX1NUT1ApOworICAgICAgZmFpbDoKIAotCXJldHVybiBhY2s7CisJcmV0dXJuIHJldDsKKworfQkJCQkvKiBUTGFuX0VlUmVhZEJ5dGUgKi8KIAotfSAvKiBUTGFuX0hhbmRsZVJ4RU9DICovCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAKLQlUaHVuZGVyTEFOIERyaXZlciBUaW1lciBGdW5jdGlvbgorCVRodW5kZXJMQU4gRHJpdmVyIE1JSSBSb3V0aW5lcworCisJVGhlc2Ugcm91dGluZXMgYXJlIGJhc2VkIG9uIHRoZSBpbmZvcm1hdGlvbiBpbiBDaGFwLiAyIG9mIHRoZQorCSJUaHVuZGVyTEFOIFByb2dyYW1tZXIncyBHdWlkZSIsIHBwLiAxNS0yNC4KIAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAorCiAJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCSAqCVRMYW5fVGltZXIKKwkgKglUTGFuX01paVJlYWRSZWcKIAkgKgogCSAqCVJldHVybnM6Ci0JICoJCU5vdGhpbmcKKwkgKgkJMAlpZiBhY2sgcmVjZWl2ZWQgb2sKKwkgKgkJMQlvdGhlcndpc2UuCisJICoKIAkgKglQYXJtczoKLQkgKgkJZGF0YQlBIHZhbHVlIGdpdmVuIHRvIGFkZCB0aW1lciB3aGVuCi0JICoJCQlhZGRfdGltZXIgd2FzIGNhbGxlZC4KKwkgKgkJZGV2CQlUaGUgZGV2aWNlIHN0cnVjdHVyZSBjb250YWluaW5nCisJICoJCQkJVGhlIGlvIGFkZHJlc3MgYW5kIGludGVycnVwdCBjb3VudAorCSAqCQkJCWZvciB0aGlzIGRldmljZS4KKwkgKgkJcGh5CQlUaGUgYWRkcmVzcyBvZiB0aGUgUEhZIHRvIGJlIHF1ZXJpZWQuCisJICoJCXJlZwkJVGhlIHJlZ2lzdGVyIHdob3NlIGNvbnRlbnRzIGFyZSB0byBiZQorCSAqCQkJCXJldHJlaXZlZC4KKwkgKgkJdmFsCQlBIHBvaW50ZXIgdG8gYSB2YXJpYWJsZSB0byBzdG9yZSB0aGUKKwkgKgkJCQlyZXRyaWV2ZWQgdmFsdWUuCiAJICoKLQkgKglUaGlzIGZ1bmN0aW9uIGhhbmRsZXMgdGltZWQgZnVuY3Rpb25hbGl0eSBmb3IgdGhlCi0JICoJVExBTiBkcml2ZXIuICBUaGUgdHdvIGN1cnJlbnQgdGltZXIgdXNlcyBhcmUgZm9yCi0JICoJZGVsYXlpbmcgZm9yIGF1dG9uZWdvdGlvbmF0aW9uIGFuZCBkcml2aW5nIHRoZSBBQ1QgTEVELgotCSAqCS0JQXV0b25lZ290aWF0aW9uIHJlcXVpcmVzIGJlaW5nIGFsbG93ZWQgYWJvdXQKLQkgKgkJMiAxLzIgc2Vjb25kcyBiZWZvcmUgYXR0ZW1wdGluZyB0byB0cmFuc21pdCBhCi0JICoJCXBhY2tldC4gIEl0IHdvdWxkIGJlIGEgdmVyeSBiYWQgdGhpbmcgdG8gaGFuZwotCSAqCQl0aGUga2VybmVsIHRoaXMgbG9uZywgc28gdGhlIGRyaXZlciBkb2Vzbid0Ci0JICoJCWFsbG93IHRyYW5zbWlzc2lvbiAndGlsIGFmdGVyIHRoaXMgdGltZSwgZm9yCi0JICoJCWNlcnRhaW4gUEhZcy4gIEl0IHdvdWxkIGJlIG11Y2ggbmljZXIgaWYgYWxsCi0JICoJCVBIWXMgd2VyZSBpbnRlcnJ1cHQtY2FwYWJsZSBsaWtlIHRoZSBpbnRlcm5hbAotCSAqCQlQSFkuCi0JICoJLQlUaGUgQUNUIExFRCwgd2hpY2ggc2hvd3MgYWRhcHRlciBhY3Rpdml0eSwgaXMKLQkgKgkJZHJpdmVuIGJ5IHRoZSBkcml2ZXIsIGFuZCBzbyBtdXN0IGJlIGxlZnQgb24KLQkgKgkJZm9yIGEgc2hvcnQgcGVyaW9kIHRvIHBvd2VyIHVwIHRoZSBMRUQgc28gaXQKLQkgKgkJY2FuIGJlIHNlZW4uICBUaGlzIGRlbGF5IGNhbiBiZSBjaGFuZ2VkIGJ5Ci0JICoJCWNoYW5naW5nIHRoZSBUTEFOX1RJTUVSX0FDVF9ERUxBWSBpbiB0bGFuLmgsCi0JICoJCWlmIGRlc2lyZWQuICAxMDAgbXMgIHByb2R1Y2VzIGEgc2xpZ2h0bHkKLQkgKgkJc2x1Z2dpc2ggcmVzcG9uc2UuCisJICoJVGhpcyBmdW5jdGlvbiB1c2VzIHRoZSBUTEFOJ3MgTUlJIGJ1cyB0byByZXRyZWl2ZSB0aGUgY29udGVudHMKKwkgKglvZiBhIGdpdmVuIHJlZ2lzdGVyIG9uIGEgUEhZLiAgSXQgc2VuZHMgdGhlIGFwcHJvcHJpYXRlIGluZm8KKwkgKglhbmQgdGhlbiByZWFkcyB0aGUgMTYtYml0IHJlZ2lzdGVyIHZhbHVlIGZyb20gdGhlIE1JSSBidXMgdmlhCisJICoJdGhlIFRMQU4gU0lPIHJlZ2lzdGVyLgogCSAqCiAJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi12b2lkIFRMYW5fVGltZXIoIHVuc2lnbmVkIGxvbmcgZGF0YSApCitpbnQgVExhbl9NaWlSZWFkUmVnKHN0cnVjdCBuaWMgKm5pYyBfX3VudXNlZCwgdTE2IHBoeSwgdTE2IHJlZywgdTE2ICogdmFsKQogewotCXN0cnVjdCBuZXRfZGV2aWNlCSpkZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKikgZGF0YTsKLQlUTGFuUHJpdmF0ZUluZm8JKnByaXYgPSBkZXYtPnByaXY7Ci0JdTMyCQllbGFwc2VkOwotCXVuc2lnbmVkIGxvbmcJZmxhZ3MgPSAwOwotCi0JcHJpdi0+dGltZXIuZnVuY3Rpb24gPSBOVUxMOwotCi0Jc3dpdGNoICggcHJpdi0+dGltZXJUeXBlICkgewotI2lmZGVmIE1PTklUT1IJCQotCQljYXNlIFRMQU5fVElNRVJfTElOS19CRUFUOgotCQkJVExhbl9QaHlNb25pdG9yKCBkZXYgKTsKLQkJCWJyZWFrOwotI2VuZGlmCi0JCWNhc2UgVExBTl9USU1FUl9QSFlfUERPV046Ci0JCQlUTGFuX1BoeVBvd2VyRG93biggZGV2ICk7Ci0JCQlicmVhazsKLQkJY2FzZSBUTEFOX1RJTUVSX1BIWV9QVVA6Ci0JCQlUTGFuX1BoeVBvd2VyVXAoIGRldiApOwotCQkJYnJlYWs7Ci0JCWNhc2UgVExBTl9USU1FUl9QSFlfUkVTRVQ6Ci0JCQlUTGFuX1BoeVJlc2V0KCBkZXYgKTsKLQkJCWJyZWFrOwotCQljYXNlIFRMQU5fVElNRVJfUEhZX1NUQVJUX0xJTks6Ci0JCQlUTGFuX1BoeVN0YXJ0TGluayggZGV2ICk7Ci0JCQlicmVhazsKLQkJY2FzZSBUTEFOX1RJTUVSX1BIWV9GSU5JU0hfQU46Ci0JCQlUTGFuX1BoeUZpbmlzaEF1dG9OZWcoIGRldiApOwotCQkJYnJlYWs7Ci0JCWNhc2UgVExBTl9USU1FUl9GSU5JU0hfUkVTRVQ6Ci0JCQlUTGFuX0ZpbmlzaFJlc2V0KCBkZXYgKTsKLQkJCWJyZWFrOwotCQljYXNlIFRMQU5fVElNRVJfQUNUSVZJVFk6Ci0JCQlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwotCQkJaWYgKCBwcml2LT50aW1lci5mdW5jdGlvbiA9PSBOVUxMICkgewotCQkJCWVsYXBzZWQgPSBqaWZmaWVzIC0gcHJpdi0+dGltZXJTZXRBdDsKLQkJCQlpZiAoIGVsYXBzZWQgPj0gVExBTl9USU1FUl9BQ1RfREVMQVkgKSB7Ci0JCQkJCVRMYW5fRGlvV3JpdGU4KCBkZXYtPmJhc2VfYWRkciwgVExBTl9MRURfUkVHLCBUTEFOX0xFRF9MSU5LICk7Ci0JCQkJfSBlbHNlICB7Ci0JCQkJCXByaXYtPnRpbWVyLmZ1bmN0aW9uID0gJlRMYW5fVGltZXI7Ci0JCQkJCXByaXYtPnRpbWVyLmV4cGlyZXMgPSBwcml2LT50aW1lclNldEF0ICsgVExBTl9USU1FUl9BQ1RfREVMQVk7Ci0JCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKLQkJCQkJYWRkX3RpbWVyKCAmcHJpdi0+dGltZXIgKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlicmVhazsKKwl1OCBuYWNrOworCXUxNiBzaW8sIHRtcDsKKwl1MzIgaTsKKwlpbnQgZXJyOworCWludCBtaW50ZW47CisKKwllcnIgPSBGQUxTRTsKKwlvdXR3KFRMQU5fTkVUX1NJTywgQkFTRSArIFRMQU5fRElPX0FEUik7CisJc2lvID0gQkFTRSArIFRMQU5fRElPX0RBVEEgKyBUTEFOX05FVF9TSU87CisKKwlUTGFuX01paVN5bmMoQkFTRSk7CisKKwltaW50ZW4gPSBUTGFuX0dldEJpdChUTEFOX05FVF9TSU9fTUlOVEVOLCBzaW8pOworCWlmIChtaW50ZW4pCisJCVRMYW5fQ2xlYXJCaXQoVExBTl9ORVRfU0lPX01JTlRFTiwgc2lvKTsKKworCVRMYW5fTWlpU2VuZERhdGEoQkFTRSwgMHgxLCAyKTsJLyogU3RhcnQgKCAwMWIgKSAqLworCVRMYW5fTWlpU2VuZERhdGEoQkFTRSwgMHgyLCAyKTsJLyogUmVhZCAgKCAxMGIgKSAqLworCVRMYW5fTWlpU2VuZERhdGEoQkFTRSwgcGh5LCA1KTsJLyogRGV2aWNlICMgICAgICAqLworCVRMYW5fTWlpU2VuZERhdGEoQkFTRSwgcmVnLCA1KTsJLyogUmVnaXN0ZXIgIyAgICAqLworCisKKwlUTGFuX0NsZWFyQml0KFRMQU5fTkVUX1NJT19NVFhFTiwgc2lvKTsJLyogQ2hhbmdlIGRpcmVjdGlvbiAqLworCisJVExhbl9DbGVhckJpdChUTEFOX05FVF9TSU9fTUNMSywgc2lvKTsJLyogQ2xvY2sgSWRsZSBiaXQgKi8KKwlUTGFuX1NldEJpdChUTEFOX05FVF9TSU9fTUNMSywgc2lvKTsKKwlUTGFuX0NsZWFyQml0KFRMQU5fTkVUX1NJT19NQ0xLLCBzaW8pOwkvKiBXYWl0IDMwMG5zICovCisKKwluYWNrID0gVExhbl9HZXRCaXQoVExBTl9ORVRfU0lPX01EQVRBLCBzaW8pOwkvKiBDaGVjayBmb3IgQUNLICovCisJVExhbl9TZXRCaXQoVExBTl9ORVRfU0lPX01DTEssIHNpbyk7CS8qIEZpbmlzaCBBQ0sgKi8KKwlpZiAobmFjaykgewkJLyogTm8gQUNLLCBzbyBmYWtlIGl0ICovCisJCWZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKSB7CisJCQlUTGFuX0NsZWFyQml0KFRMQU5fTkVUX1NJT19NQ0xLLCBzaW8pOworCQkJVExhbl9TZXRCaXQoVExBTl9ORVRfU0lPX01DTEssIHNpbyk7CisJCX0KKwkJdG1wID0gMHhmZmZmOworCQllcnIgPSBUUlVFOworCX0gZWxzZSB7CQkvKiBBQ0ssIHNvIHJlYWQgZGF0YSAqLworCQlmb3IgKHRtcCA9IDAsIGkgPSAweDgwMDA7IGk7IGkgPj49IDEpIHsKKwkJCVRMYW5fQ2xlYXJCaXQoVExBTl9ORVRfU0lPX01DTEssIHNpbyk7CisJCQlpZiAoVExhbl9HZXRCaXQoVExBTl9ORVRfU0lPX01EQVRBLCBzaW8pKQorCQkJCXRtcCB8PSBpOworCQkJVExhbl9TZXRCaXQoVExBTl9ORVRfU0lPX01DTEssIHNpbyk7CisJCX0KIAl9CiAKLX0gLyogVExhbl9UaW1lciAqLwogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCVRMYW5fQ2xlYXJCaXQoVExBTl9ORVRfU0lPX01DTEssIHNpbyk7CS8qIElkbGUgY3ljbGUgKi8KKwlUTGFuX1NldEJpdChUTEFOX05FVF9TSU9fTUNMSywgc2lvKTsKIAotCVRodW5kZXJMQU4gRHJpdmVyIEFkYXB0ZXIgUmVsYXRlZCBSb3V0aW5lcworCWlmIChtaW50ZW4pCisJCVRMYW5fU2V0Qml0KFRMQU5fTkVUX1NJT19NSU5URU4sIHNpbyk7CiAKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisJKnZhbCA9IHRtcDsKKworCXJldHVybiBlcnI7CisKK30JCQkJLyogVExhbl9NaWlSZWFkUmVnICovCiAKIAkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JICoJVExhbl9SZXNldExpc3RzCi0JICogIAorCSAqCVRMYW5fTWlpU2VuZERhdGEKKwkgKgogCSAqCVJldHVybnM6CiAJICoJCU5vdGhpbmcKIAkgKglQYXJtczoKLQkgKgkJZGV2CVRoZSBkZXZpY2Ugc3RydWN0dXJlIHdpdGggdGhlIGxpc3QKLQkgKgkJCXN0dWN0dXJlcyB0byBiZSByZXNldC4KKwkgKgkJYmFzZV9wb3J0CVRoZSBiYXNlIElPIHBvcnQgb2YgdGhlIGFkYXB0ZXIJaW4KKwkgKgkJCQlxdWVzdGlvbi4KKwkgKgkJZGV2CQlUaGUgYWRkcmVzcyBvZiB0aGUgUEhZIHRvIGJlIHF1ZXJpZWQuCisJICoJCWRhdGEJCVRoZSB2YWx1ZSB0byBiZSBwbGFjZWQgb24gdGhlIE1JSSBidXMuCisJICoJCW51bV9iaXRzCVRoZSBudW1iZXIgb2YgYml0cyBpbiBkYXRhIHRoYXQgYXJlIHRvCisJICoJCQkJYmUgcGxhY2VkIG9uIHRoZSBNSUkgYnVzLgogCSAqCi0JICoJVGhpcyByb3V0aW5lIHNldHMgdGhlIHZhcmlhYmxlcyBhc3NvY2lhdGVkIHdpdGggbWFuYWdpbmcKLQkgKgl0aGUgVExBTiBsaXN0cyB0byB0aGVpciBpbml0aWFsIHZhbHVlcy4KKwkgKglUaGlzIGZ1bmN0aW9uIHNlbmRzIG9uIHNlcXVlbmNlIG9mIGJpdHMgb24gdGhlIE1JSQorCSAqCWNvbmZpZ3VyYXRpb24gYnVzLgogCSAqCiAJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi12b2lkIFRMYW5fUmVzZXRMaXN0cyggc3RydWN0IG5ldF9kZXZpY2UgKmRldiApCit2b2lkIFRMYW5fTWlpU2VuZERhdGEodTE2IGJhc2VfcG9ydCwgdTMyIGRhdGEsIHVuc2lnbmVkIG51bV9iaXRzKQogewotCVRMYW5Qcml2YXRlSW5mbyAqcHJpdiA9IGRldi0+cHJpdjsKLQlpbnQJCWk7Ci0JVExhbkxpc3QJKmxpc3Q7Ci0Jc3RydWN0IHNrX2J1ZmYJKnNrYjsKLQl2b2lkCQkqdCA9IE5VTEw7CisJdTE2IHNpbzsKKwl1MzIgaTsKIAotCXByaXYtPnR4SGVhZCA9IDA7Ci0JcHJpdi0+dHhUYWlsID0gMDsKLQlmb3IgKCBpID0gMDsgaSA8IFRMQU5fTlVNX1RYX0xJU1RTOyBpKysgKSB7Ci0JCWxpc3QgPSBwcml2LT50eExpc3QgKyBpOwotCQlsaXN0LT5jU3RhdCA9IFRMQU5fQ1NUQVRfVU5VU0VEOwotCQlpZiAoIGJidWYgKSB7Ci0JCQlsaXN0LT5idWZmZXJbMF0uYWRkcmVzcyA9IHZpcnRfdG9fYnVzKCBwcml2LT50eEJ1ZmZlciArICggaSAqIFRMQU5fTUFYX0ZSQU1FX1NJWkUgKSApOwotCQl9IGVsc2UgewotCQkJbGlzdC0+YnVmZmVyWzBdLmFkZHJlc3MgPSAwOwotCQl9Ci0JCWxpc3QtPmJ1ZmZlclsyXS5jb3VudCA9IDA7Ci0JCWxpc3QtPmJ1ZmZlclsyXS5hZGRyZXNzID0gMDsKLQkJbGlzdC0+YnVmZmVyWzldLmFkZHJlc3MgPSAwOwotCX0KKwlpZiAobnVtX2JpdHMgPT0gMCkKKwkJcmV0dXJuOworCisJb3V0dyhUTEFOX05FVF9TSU8sIGJhc2VfcG9ydCArIFRMQU5fRElPX0FEUik7CisJc2lvID0gYmFzZV9wb3J0ICsgVExBTl9ESU9fREFUQSArIFRMQU5fTkVUX1NJTzsKKwlUTGFuX1NldEJpdChUTEFOX05FVF9TSU9fTVRYRU4sIHNpbyk7CiAKLQlwcml2LT5yeEhlYWQgPSAwOwotCXByaXYtPnJ4VGFpbCA9IFRMQU5fTlVNX1JYX0xJU1RTIC0gMTsKLQlmb3IgKCBpID0gMDsgaSA8IFRMQU5fTlVNX1JYX0xJU1RTOyBpKysgKSB7Ci0JCWxpc3QgPSBwcml2LT5yeExpc3QgKyBpOwotCQlsaXN0LT5jU3RhdCA9IFRMQU5fQ1NUQVRfUkVBRFk7Ci0JCWxpc3QtPmZyYW1lU2l6ZSA9IFRMQU5fTUFYX0ZSQU1FX1NJWkU7Ci0JCWxpc3QtPmJ1ZmZlclswXS5jb3VudCA9IFRMQU5fTUFYX0ZSQU1FX1NJWkUgfCBUTEFOX0xBU1RfQlVGRkVSOwotCQlpZiAoIGJidWYgKSB7Ci0JCQlsaXN0LT5idWZmZXJbMF0uYWRkcmVzcyA9IHZpcnRfdG9fYnVzKCBwcml2LT5yeEJ1ZmZlciArICggaSAqIFRMQU5fTUFYX0ZSQU1FX1NJWkUgKSApOwotCQl9IGVsc2UgewotCQkJc2tiID0gZGV2X2FsbG9jX3NrYiggVExBTl9NQVhfRlJBTUVfU0laRSArIDcgKTsKLQkJCWlmICggc2tiID09IE5VTEwgKSB7Ci0JCQkJcHJpbnRrKCAiVExBTjogIENvdWxkbid0IGFsbG9jYXRlIG1lbW9yeSBmb3IgcmVjZWl2ZWQgZGF0YS5cbiIgKTsKLQkJCQkvKiBJZiB0aGlzIGV2ZXIgaGFwcGVuZWQgaXQgd291bGQgYmUgYSBwcm9ibGVtICovCi0JCQl9IGVsc2UgewotCQkJCXNrYi0+ZGV2ID0gZGV2OwotCQkJCXNrYl9yZXNlcnZlKCBza2IsIDIgKTsKLQkJCQl0ID0gKHZvaWQgKikgc2tiX3B1dCggc2tiLCBUTEFOX01BWF9GUkFNRV9TSVpFICk7Ci0JCQl9Ci0JCQlsaXN0LT5idWZmZXJbMF0uYWRkcmVzcyA9IHZpcnRfdG9fYnVzKCB0ICk7Ci0JCQlsaXN0LT5idWZmZXJbOF0uYWRkcmVzcyA9ICh1MzIpIHQ7Ci0JCQlsaXN0LT5idWZmZXJbOV0uYWRkcmVzcyA9ICh1MzIpIHNrYjsKLQkJfQotCQlsaXN0LT5idWZmZXJbMV0uY291bnQgPSAwOwotCQlsaXN0LT5idWZmZXJbMV0uYWRkcmVzcyA9IDA7Ci0JCWlmICggaSA8IFRMQU5fTlVNX1JYX0xJU1RTIC0gMSApCi0JCQlsaXN0LT5mb3J3YXJkID0gdmlydF90b19idXMoIGxpc3QgKyAxICk7CisJZm9yIChpID0gKDB4MSA8PCAobnVtX2JpdHMgLSAxKSk7IGk7IGkgPj49IDEpIHsKKwkJVExhbl9DbGVhckJpdChUTEFOX05FVF9TSU9fTUNMSywgc2lvKTsKKwkJKHZvaWQpIFRMYW5fR2V0Qml0KFRMQU5fTkVUX1NJT19NQ0xLLCBzaW8pOworCQlpZiAoZGF0YSAmIGkpCisJCQlUTGFuX1NldEJpdChUTEFOX05FVF9TSU9fTURBVEEsIHNpbyk7CiAJCWVsc2UKLQkJCWxpc3QtPmZvcndhcmQgPSAwOworCQkJVExhbl9DbGVhckJpdChUTEFOX05FVF9TSU9fTURBVEEsIHNpbyk7CisJCVRMYW5fU2V0Qml0KFRMQU5fTkVUX1NJT19NQ0xLLCBzaW8pOworCQkodm9pZCkgVExhbl9HZXRCaXQoVExBTl9ORVRfU0lPX01DTEssIHNpbyk7CiAJfQogCi19IC8qIFRMYW5fUmVzZXRMaXN0cyAqLworfQkJCQkvKiBUTGFuX01paVNlbmREYXRhICovCiAKLXZvaWQgVExhbl9GcmVlTGlzdHMoIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgKQotewotCVRMYW5Qcml2YXRlSW5mbyAqcHJpdiA9IGRldi0+cHJpdjsKLQlpbnQJCWk7Ci0JVExhbkxpc3QJKmxpc3Q7Ci0Jc3RydWN0IHNrX2J1ZmYJKnNrYjsKLQotCWlmICggISBiYnVmICkgewotCQlmb3IgKCBpID0gMDsgaSA8IFRMQU5fTlVNX1RYX0xJU1RTOyBpKysgKSB7Ci0JCQlsaXN0ID0gcHJpdi0+dHhMaXN0ICsgaTsKLQkJCXNrYiA9IChzdHJ1Y3Qgc2tfYnVmZiAqKSBsaXN0LT5idWZmZXJbOV0uYWRkcmVzczsKLQkJCWlmICggc2tiICkgewotCQkJCWRldl9rZnJlZV9za2JfYW55KCBza2IgKTsKLQkJCQlsaXN0LT5idWZmZXJbOV0uYWRkcmVzcyA9IDA7Ci0JCQl9Ci0JCX0KIAotCQlmb3IgKCBpID0gMDsgaSA8IFRMQU5fTlVNX1JYX0xJU1RTOyBpKysgKSB7Ci0JCQlsaXN0ID0gcHJpdi0+cnhMaXN0ICsgaTsKLQkJCXNrYiA9IChzdHJ1Y3Qgc2tfYnVmZiAqKSBsaXN0LT5idWZmZXJbOV0uYWRkcmVzczsKLQkJCWlmICggc2tiICkgewotCQkJCWRldl9rZnJlZV9za2JfYW55KCBza2IgKTsKLQkJCQlsaXN0LT5idWZmZXJbOV0uYWRkcmVzcyA9IDA7Ci0JCQl9Ci0JCX0KLQl9CiAKLX0gLyogVExhbl9GcmVlTGlzdHMgKi8KIAogCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkgKglUTGFuX1ByaW50RGlvCi0JICogIAorCSAqCVRMYW5fTWlpU3luYworCSAqCiAJICoJUmV0dXJuczoKIAkgKgkJTm90aGluZwogCSAqCVBhcm1zOgotCSAqCQlpb19iYXNlCQlCYXNlIElPIHBvcnQgb2YgdGhlIGRldmljZSBvZgotCSAqCQkJCXdoaWNoIHRvIHByaW50IERJTyByZWdpc3RlcnMuCisJICoJCWJhc2VfcG9ydAlUaGUgYmFzZSBJTyBwb3J0IG9mIHRoZSBhZGFwdGVyIGluCisJICoJCQkJcXVlc3Rpb24uCiAJICoKLQkgKglUaGlzIGZ1bmN0aW9uIHByaW50cyBvdXQgYWxsIHRoZSBpbnRlcm5hbCAoRElPKQotCSAqCXJlZ2lzdGVycyBvZiBhIFRMQU4gY2hpcC4KKwkgKglUaGlzIGZ1bmN0aW9ucyBzeW5jcyBhbGwgUEhZcyBpbiB0ZXJtcyBvZiB0aGUgTUlJIGNvbmZpZ3VyYXRpb24KKwkgKglidXMuCiAJICoKIAkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXZvaWQgVExhbl9QcmludERpbyggdTE2IGlvX2Jhc2UgKQordm9pZCBUTGFuX01paVN5bmModTE2IGJhc2VfcG9ydCkKIHsKLQl1MzIgZGF0YTAsIGRhdGExOwotCWludAlpOworCWludCBpOworCXUxNiBzaW87CiAKLQlwcmludGsoICJUTEFOOiAgIENvbnRlbnRzIG9mIGludGVybmFsIHJlZ2lzdGVycyBmb3IgaW8gYmFzZSAweCUwNGh4LlxuIiwgaW9fYmFzZSApOwotCXByaW50ayggIlRMQU46ICAgICAgT2ZmLiAgKzAgICAgICAgICArNFxuIiApOwotCWZvciAoIGkgPSAwOyBpIDwgMHg0QzsgaSs9IDggKSB7Ci0JCWRhdGEwID0gVExhbl9EaW9SZWFkMzIoIGlvX2Jhc2UsIGkgKTsKLQkJZGF0YTEgPSBUTGFuX0Rpb1JlYWQzMiggaW9fYmFzZSwgaSArIDB4NCApOwotCQlwcmludGsoICJUTEFOOiAgICAgIDB4JTAyeCAgMHglMDh4IDB4JTA4eFxuIiwgaSwgZGF0YTAsIGRhdGExICk7CisJb3V0dyhUTEFOX05FVF9TSU8sIGJhc2VfcG9ydCArIFRMQU5fRElPX0FEUik7CisJc2lvID0gYmFzZV9wb3J0ICsgVExBTl9ESU9fREFUQSArIFRMQU5fTkVUX1NJTzsKKworCVRMYW5fQ2xlYXJCaXQoVExBTl9ORVRfU0lPX01UWEVOLCBzaW8pOworCWZvciAoaSA9IDA7IGkgPCAzMjsgaSsrKSB7CisJCVRMYW5fQ2xlYXJCaXQoVExBTl9ORVRfU0lPX01DTEssIHNpbyk7CisJCVRMYW5fU2V0Qml0KFRMQU5fTkVUX1NJT19NQ0xLLCBzaW8pOwogCX0KIAotfSAvKiBUTGFuX1ByaW50RGlvICovCit9CQkJCS8qIFRMYW5fTWlpU3luYyAqLworCisKKwogCiAJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCSAqCVRMYW5fUHJpbnRMaXN0Ci0JICogIAorCSAqCVRMYW5fTWlpV3JpdGVSZWcKKwkgKgogCSAqCVJldHVybnM6CiAJICoJCU5vdGhpbmcKIAkgKglQYXJtczoKLQkgKgkJbGlzdAlBIHBvaW50ZXIgdG8gdGhlIFRMYW5MaXN0IHN0cnVjdHVyZSB0bwotCSAqCQkJYmUgcHJpbnRlZC4KLQkgKgkJdHlwZQlBIHN0cmluZyB0byBkZXNpZ25hdGUgdHlwZSBvZiBsaXN0LAotCSAqCQkJIlJ4IiBvciAiVHgiLgotCSAqCQludW0JVGhlIGluZGV4IG9mIHRoZSBsaXN0LgorCSAqCQlkZXYJCVRoZSBkZXZpY2Ugc3RydWN0dXJlIGZvciB0aGUgZGV2aWNlCisJICoJCQkJdG8gd3JpdGUgdG8uCisJICoJCXBoeQkJVGhlIGFkZHJlc3Mgb2YgdGhlIFBIWSB0byBiZSB3cml0dGVuIHRvLgorCSAqCQlyZWcJCVRoZSByZWdpc3RlciB3aG9zZSBjb250ZW50cyBhcmUgdG8gYmUKKwkgKgkJCQl3cml0dGVuLgorCSAqCQl2YWwJCVRoZSB2YWx1ZSB0byBiZSB3cml0dGVuIHRvIHRoZSByZWdpc3Rlci4KIAkgKgotCSAqCVRoaXMgZnVuY3Rpb24gcHJpbnRzIG91dCB0aGUgY29udGVudHMgb2YgdGhlIGxpc3QKLQkgKglwb2ludGVkIHRvIGJ5IHRoZSBsaXN0IHBhcmFtZXRlci4KKwkgKglUaGlzIGZ1bmN0aW9uIHVzZXMgdGhlIFRMQU4ncyBNSUkgYnVzIHRvIHdyaXRlIHRoZSBjb250ZW50cyBvZiBhCisJICoJZ2l2ZW4gcmVnaXN0ZXIgb24gYSBQSFkuICBJdCBzZW5kcyB0aGUgYXBwcm9wcmlhdGUgaW5mbyBhbmQgdGhlbgorCSAqCXdyaXRlcyB0aGUgMTYtYml0IHJlZ2lzdGVyIHZhbHVlIGZyb20gdGhlIE1JSSBjb25maWd1cmF0aW9uIGJ1cworCSAqCXZpYSB0aGUgVExBTiBTSU8gcmVnaXN0ZXIuCiAJICoKIAkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXZvaWQgVExhbl9QcmludExpc3QoIFRMYW5MaXN0ICpsaXN0LCBjaGFyICp0eXBlLCBpbnQgbnVtKQordm9pZCBUTGFuX01paVdyaXRlUmVnKHN0cnVjdCBuaWMgKm5pYyBfX3VudXNlZCwgdTE2IHBoeSwgdTE2IHJlZywgdTE2IHZhbCkKIHsKLQlpbnQgaTsKKwl1MTYgc2lvOworCWludCBtaW50ZW47CisKKwlvdXR3KFRMQU5fTkVUX1NJTywgQkFTRSArIFRMQU5fRElPX0FEUik7CisJc2lvID0gQkFTRSArIFRMQU5fRElPX0RBVEEgKyBUTEFOX05FVF9TSU87CisKKwlUTGFuX01paVN5bmMoQkFTRSk7CisKKwltaW50ZW4gPSBUTGFuX0dldEJpdChUTEFOX05FVF9TSU9fTUlOVEVOLCBzaW8pOworCWlmIChtaW50ZW4pCisJCVRMYW5fQ2xlYXJCaXQoVExBTl9ORVRfU0lPX01JTlRFTiwgc2lvKTsKKworCVRMYW5fTWlpU2VuZERhdGEoQkFTRSwgMHgxLCAyKTsJLyogU3RhcnQgKCAwMWIgKSAqLworCVRMYW5fTWlpU2VuZERhdGEoQkFTRSwgMHgxLCAyKTsJLyogV3JpdGUgKCAwMWIgKSAqLworCVRMYW5fTWlpU2VuZERhdGEoQkFTRSwgcGh5LCA1KTsJLyogRGV2aWNlICMgICAgICAqLworCVRMYW5fTWlpU2VuZERhdGEoQkFTRSwgcmVnLCA1KTsJLyogUmVnaXN0ZXIgIyAgICAqLworCisJVExhbl9NaWlTZW5kRGF0YShCQVNFLCAweDIsIDIpOwkvKiBTZW5kIEFDSyAqLworCVRMYW5fTWlpU2VuZERhdGEoQkFTRSwgdmFsLCAxNik7CS8qIFNlbmQgRGF0YSAqLworCisJVExhbl9DbGVhckJpdChUTEFOX05FVF9TSU9fTUNMSywgc2lvKTsJLyogSWRsZSBjeWNsZSAqLworCVRMYW5fU2V0Qml0KFRMQU5fTkVUX1NJT19NQ0xLLCBzaW8pOworCisJaWYgKG1pbnRlbikKKwkJVExhbl9TZXRCaXQoVExBTl9ORVRfU0lPX01JTlRFTiwgc2lvKTsKIAotCXByaW50ayggIlRMQU46ICAgJXMgTGlzdCAlZCBhdCAweCUwOHhcbiIsIHR5cGUsIG51bSwgKHUzMikgbGlzdCApOwotCXByaW50ayggIlRMQU46ICAgICAgRm9yd2FyZCAgICA9IDB4JTA4eFxuIiwgIGxpc3QtPmZvcndhcmQgKTsKLQlwcmludGsoICJUTEFOOiAgICAgIENTVEFUICAgICAgPSAweCUwNGh4XG4iLCBsaXN0LT5jU3RhdCApOwotCXByaW50ayggIlRMQU46ICAgICAgRnJhbWUgU2l6ZSA9IDB4JTA0aHhcbiIsIGxpc3QtPmZyYW1lU2l6ZSApOwotCS8qIGZvciAoIGkgPSAwOyBpIDwgMTA7IGkrKyApIHsgKi8KLQlmb3IgKCBpID0gMDsgaSA8IDI7IGkrKyApIHsKLQkJcHJpbnRrKCAiVExBTjogICAgICBCdWZmZXJbJWRdLmNvdW50LCBhZGRyID0gMHglMDh4LCAweCUwOHhcbiIsIGksIGxpc3QtPmJ1ZmZlcltpXS5jb3VudCwgbGlzdC0+YnVmZmVyW2ldLmFkZHJlc3MgKTsKLQl9CiAKLX0gLyogVExhbl9QcmludExpc3QgKi8KK30JCQkJLyogVExhbl9NaWlXcml0ZVJlZyAqLwogCiAJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCSAqCVRMYW5fUmVhZEFuZENsZWFyU3RhdHMKKwkgKglUTGFuX1NldE1hYwogCSAqCiAJICoJUmV0dXJuczoKIAkgKgkJTm90aGluZwogCSAqCVBhcm1zOgogCSAqCQlkZXYJUG9pbnRlciB0byBkZXZpY2Ugc3RydWN0dXJlIG9mIGFkYXB0ZXIKLQkgKgkJCXRvIHdoaWNoIHRvIHJlYWQgc3RhdHMuCi0JICoJCXJlY29yZAlGbGFnIGluZGljYXRpbmcgd2hldGhlciB0byBhZGQgCisJICoJCQlvbiB3aGljaCB0byBjaGFuZ2UgdGhlIEFSRUcuCisJICoJCWFyZWcJVGhlIEFSRUcgdG8gc2V0IHRoZSBhZGRyZXNzIGluICgwIC0gMykuCisJICoJCW1hYwlBIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgY2hhcnMuICBFYWNoCisJICoJCQllbGVtZW50IHN0b3JlcyBvbmUgYnl0ZSBvZiB0aGUgYWRkcmVzcy4KKwkgKgkJCUlFLCBpdCBpc24ndCBpbiBhc2NpaS4KIAkgKgotCSAqCVRoaXMgZnVuY3Rpb25zIHJlYWRzIGFsbCB0aGUgaW50ZXJuYWwgc3RhdHVzIHJlZ2lzdGVycwotCSAqCW9mIHRoZSBUTEFOIGNoaXAsIHdoaWNoIGNsZWFycyB0aGVtIGFzIGEgc2lkZSBlZmZlY3QuCi0JICoJSXQgdGhlbiBlaXRoZXIgYWRkcyB0aGUgdmFsdWVzIHRvIHRoZSBkZXZpY2UncyBzdGF0dXMKLQkgKglzdHJ1Y3QsIG9yIGRpc2NhcmRzIHRoZW0sIGRlcGVuZGluZyBvbiB3aGV0aGVyIHJlY29yZAotCSAqCWlzIFRMQU5fUkVDT1JEICghPTApICBvciBUTEFOX0lHTk9SRSAoPT0wKS4KKwkgKglUaGlzIGZ1bmN0aW9uIHRyYW5zZmVycyBhIE1BQyBhZGRyZXNzIHRvIG9uZSBvZiB0aGUKKwkgKglUTEFOIEFSRUdzIChhZGRyZXNzIHJlZ2lzdGVycykuICBUaGUgVExBTiBjaGlwIGxvY2tzCisJICoJdGhlIHJlZ2lzdGVyIG9uIHdyaXRpbmcgdG8gb2Zmc2V0IDAgYW5kIHVubG9ja3MgdGhlCisJICoJcmVnaXN0ZXIgYWZ0ZXIgd3JpdGluZyB0byBvZmZzZXQgNS4gIElmIE5VTEwgaXMgcGFzc2VkCisJICoJaW4gbWFjLCB0aGVuIHRoZSBBUkVHIGlzIGZpbGxlZCB3aXRoIDAncy4KIAkgKgogCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotdm9pZCBUTGFuX1JlYWRBbmRDbGVhclN0YXRzKCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgcmVjb3JkICkKK3ZvaWQgVExhbl9TZXRNYWMoc3RydWN0IG5pYyAqbmljIF9fdW51c2VkLCBpbnQgYXJlZywgY2hhciAqbWFjKQogewotCVRMYW5Qcml2YXRlSW5mbwkqcHJpdiA9IGRldi0+cHJpdjsKLQl1MzIJCXR4X2dvb2QsIHR4X3VuZGVyOwotCXUzMgkJcnhfZ29vZCwgcnhfb3ZlcjsKLQl1MzIJCWRlZl90eCwgY3JjLCBjb2RlOwotCXUzMgkJbXVsdGlfY29sLCBzaW5nbGVfY29sOwotCXUzMgkJZXhjZXNzX2NvbCwgbGF0ZV9jb2wsIGxvc3M7Ci0KLQlvdXR3KCBUTEFOX0dPT0RfVFhfRlJNUywgZGV2LT5iYXNlX2FkZHIgKyBUTEFOX0RJT19BRFIgKTsKLQl0eF9nb29kICA9IGluYiggZGV2LT5iYXNlX2FkZHIgKyBUTEFOX0RJT19EQVRBICk7Ci0JdHhfZ29vZCArPSBpbmIoIGRldi0+YmFzZV9hZGRyICsgVExBTl9ESU9fREFUQSArIDEgKSA8PCA4OwotCXR4X2dvb2QgKz0gaW5iKCBkZXYtPmJhc2VfYWRkciArIFRMQU5fRElPX0RBVEEgKyAyICkgPDwgMTY7Ci0JdHhfdW5kZXIgPSBpbmIoIGRldi0+YmFzZV9hZGRyICsgVExBTl9ESU9fREFUQSArIDMgKTsKLQotCW91dHcoIFRMQU5fR09PRF9SWF9GUk1TLCBkZXYtPmJhc2VfYWRkciArIFRMQU5fRElPX0FEUiApOwotCXJ4X2dvb2QgID0gaW5iKCBkZXYtPmJhc2VfYWRkciArIFRMQU5fRElPX0RBVEEgKTsKLQlyeF9nb29kICs9IGluYiggZGV2LT5iYXNlX2FkZHIgKyBUTEFOX0RJT19EQVRBICsgMSApIDw8IDg7Ci0JcnhfZ29vZCArPSBpbmIoIGRldi0+YmFzZV9hZGRyICsgVExBTl9ESU9fREFUQSArIDIgKSA8PCAxNjsKLQlyeF9vdmVyICA9IGluYiggZGV2LT5iYXNlX2FkZHIgKyBUTEFOX0RJT19EQVRBICsgMyApOwotCQkKLQlvdXR3KCBUTEFOX0RFRkVSUkVEX1RYLCBkZXYtPmJhc2VfYWRkciArIFRMQU5fRElPX0FEUiApOwotCWRlZl90eCAgPSBpbmIoIGRldi0+YmFzZV9hZGRyICsgVExBTl9ESU9fREFUQSApOwotCWRlZl90eCArPSBpbmIoIGRldi0+YmFzZV9hZGRyICsgVExBTl9ESU9fREFUQSArIDEgKSA8PCA4OwotCWNyYyAgICAgPSBpbmIoIGRldi0+YmFzZV9hZGRyICsgVExBTl9ESU9fREFUQSArIDIgKTsKLQljb2RlICAgID0gaW5iKCBkZXYtPmJhc2VfYWRkciArIFRMQU5fRElPX0RBVEEgKyAzICk7Ci0JCi0Jb3V0dyggVExBTl9NVUxUSUNPTF9GUk1TLCBkZXYtPmJhc2VfYWRkciArIFRMQU5fRElPX0FEUiApOwotCW11bHRpX2NvbCAgID0gaW5iKCBkZXYtPmJhc2VfYWRkciArIFRMQU5fRElPX0RBVEEgKTsKLQltdWx0aV9jb2wgICs9IGluYiggZGV2LT5iYXNlX2FkZHIgKyBUTEFOX0RJT19EQVRBICsgMSApIDw8IDg7Ci0Jc2luZ2xlX2NvbCAgPSBpbmIoIGRldi0+YmFzZV9hZGRyICsgVExBTl9ESU9fREFUQSArIDIgKTsKLQlzaW5nbGVfY29sICs9IGluYiggZGV2LT5iYXNlX2FkZHIgKyBUTEFOX0RJT19EQVRBICsgMyApIDw8IDg7Ci0KLQlvdXR3KCBUTEFOX0VYQ0VTU0NPTF9GUk1TLCBkZXYtPmJhc2VfYWRkciArIFRMQU5fRElPX0FEUiApOwotCWV4Y2Vzc19jb2wgPSBpbmIoIGRldi0+YmFzZV9hZGRyICsgVExBTl9ESU9fREFUQSApOwotCWxhdGVfY29sICAgPSBpbmIoIGRldi0+YmFzZV9hZGRyICsgVExBTl9ESU9fREFUQSArIDEgKTsKLQlsb3NzICAgICAgID0gaW5iKCBkZXYtPmJhc2VfYWRkciArIFRMQU5fRElPX0RBVEEgKyAyICk7Ci0KLQlpZiAoIHJlY29yZCApIHsKLQkJcHJpdi0+c3RhdHMucnhfcGFja2V0cyArPSByeF9nb29kOwotCQlwcml2LT5zdGF0cy5yeF9lcnJvcnMgICs9IHJ4X292ZXIgKyBjcmMgKyBjb2RlOwotCQlwcml2LT5zdGF0cy50eF9wYWNrZXRzICs9IHR4X2dvb2Q7Ci0JCXByaXYtPnN0YXRzLnR4X2Vycm9ycyAgKz0gdHhfdW5kZXIgKyBsb3NzOwotCQlwcml2LT5zdGF0cy5jb2xsaXNpb25zICs9IG11bHRpX2NvbCArIHNpbmdsZV9jb2wgKyBleGNlc3NfY29sICsgbGF0ZV9jb2w7Ci0KLQkJcHJpdi0+c3RhdHMucnhfb3Zlcl9lcnJvcnMgICAgKz0gcnhfb3ZlcjsKLQkJcHJpdi0+c3RhdHMucnhfY3JjX2Vycm9ycyAgICAgKz0gY3JjOwotCQlwcml2LT5zdGF0cy5yeF9mcmFtZV9lcnJvcnMgICArPSBjb2RlOworCWludCBpOwogCi0JCXByaXYtPnN0YXRzLnR4X2Fib3J0ZWRfZXJyb3JzICs9IHR4X3VuZGVyOwotCQlwcml2LT5zdGF0cy50eF9jYXJyaWVyX2Vycm9ycyArPSBsb3NzOworCWFyZWcgKj0gNjsKKworCWlmIChtYWMgIT0gTlVMTCkgeworCQlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQorCQkJVExhbl9EaW9Xcml0ZTgoQkFTRSwgVExBTl9BUkVHXzAgKyBhcmVnICsgaSwKKwkJCQkgICAgICAgbWFjW2ldKTsKKwl9IGVsc2UgeworCQlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQorCQkJVExhbl9EaW9Xcml0ZTgoQkFTRSwgVExBTl9BUkVHXzAgKyBhcmVnICsgaSwgMCk7CiAJfQotCQkJCi19IC8qIFRMYW5fUmVhZEFuZENsZWFyU3RhdHMgKi8KIAotCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkgKglUTGFuX1Jlc2V0Cit9CQkJCS8qIFRMYW5fU2V0TWFjICovCisKKwkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJICoJVExhbl9QaHlEZXRlY3QKIAkgKgogCSAqCVJldHVybnM6Ci0JICoJCTAKKwkgKgkJTm90aGluZwogCSAqCVBhcm1zOgotCSAqCQlkZXYJUG9pbnRlciB0byBkZXZpY2Ugc3RydWN0dXJlIG9mIGFkYXB0ZXIKLQkgKgkJCXRvIGJlIHJlc2V0LgorCSAqCQlkZXYJQSBwb2ludGVyIHRvIHRoZSBkZXZpY2Ugc3RydWN0dXJlIG9mIHRoZSBhZGFwdGVyCisJICoJCQlmb3Igd2hpY2ggdGhlIFBIWSBuZWVkcyBkZXRlcm1pbmVkLgogCSAqCi0JICoJVGhpcyBmdW5jdGlvbiByZXNldHMgdGhlIGFkYXB0ZXIgYW5kIGl0J3MgcGh5c2ljYWwKLQkgKglkZXZpY2UuICBTZWUgQ2hhcC4gMywgcHAuIDktMTAgb2YgdGhlICJUaHVuZGVyTEFOCi0JICoJUHJvZ3JhbW1lcidzIEd1aWRlIiBmb3IgZGV0YWlscy4gIFRoZSByb3V0aW5lIHRyaWVzIHRvCi0JICoJaW1wbGVtZW50IHdoYXQgaXMgZGV0YWlsZWQgdGhlcmUsIHRob3VnaCBhZGp1c3RtZW50cwotCSAqCWhhdmUgYmVlbiBtYWRlLgorCSAqCVNvIGZhciBJJ3ZlIGZvdW5kIHRoYXQgYWRhcHRlcnMgd2hpY2ggaGF2ZSBleHRlcm5hbCBQSFlzCisJICoJbWF5IGFsc28gdXNlIHRoZSBpbnRlcm5hbCBQSFkgZm9yIHBhcnQgb2YgdGhlIGZ1bmN0aW9uYWxpdHkuCisJICoJKGVnLCBBVUkvVGhpbm5ldCkuICBUaGlzIGZ1bmN0aW9uIGZpbmRzIG91dCBpZiB0aGlzIFRMQU4KKwkgKgljaGlwIGhhcyBhbiBpbnRlcm5hbCBQSFksIGFuZCB0aGVuIGZpbmRzIHRoZSBmaXJzdCBleHRlcm5hbAorCSAqCVBIWSAoc3RhcnRpbmcgZnJvbSBhZGRyZXNzIDApIGlmIGl0IGV4aXN0cykuCiAJICoKLQkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi12b2lkCi1UTGFuX1Jlc2V0QWRhcHRlciggc3RydWN0IG5ldF9kZXZpY2UgKmRldiApCit2b2lkIFRMYW5fUGh5RGV0ZWN0KHN0cnVjdCBuaWMgKm5pYykKIHsKLQlUTGFuUHJpdmF0ZUluZm8JKnByaXYgPSBkZXYtPnByaXY7Ci0JaW50CQlpOwotCXUzMgkJYWRkcjsKLQl1MzIJCWRhdGE7Ci0JdTgJCWRhdGE4OworCXUxNiBjb250cm9sOworCXUxNiBoaTsKKwl1MTYgbG87CisJdTMyIHBoeTsKIAotCXByaXYtPnRsYW5GdWxsRHVwbGV4ID0gRkFMU0U7Ci0JcHJpdi0+cGh5T25saW5lPTA7Ci0vKiAgMS4JQXNzZXJ0IHJlc2V0IGJpdC4gKi8KKwlpZiAodGxhbl9wY2lfdGJsW2NoaXBfaWR4XS5mbGFncyAmIFRMQU5fQURBUFRFUl9VTk1BTkFHRURfUEhZKSB7CisJCXByaXYtPnBoeU51bSA9IDB4RkZGRjsKKwkJcmV0dXJuOworCX0KIAotCWRhdGEgPSBpbmwoZGV2LT5iYXNlX2FkZHIgKyBUTEFOX0hPU1RfQ01EKTsKLQlkYXRhIHw9IFRMQU5fSENfQURfUlNUOwotCW91dGwoZGF0YSwgZGV2LT5iYXNlX2FkZHIgKyBUTEFOX0hPU1RfQ01EKTsKLQkKLQl1ZGVsYXkoMTAwMCk7CisJVExhbl9NaWlSZWFkUmVnKG5pYywgVExBTl9QSFlfTUFYX0FERFIsIE1JSV9HRU5fSURfSEksICZoaSk7CiAKLS8qICAyLglUdXJuIG9mZiBpbnRlcnJ1cHRzLiAoIFByb2JhYmx5IGlzbid0IG5lY2Vzc2FyeSApICovCisJaWYgKGhpICE9IDB4RkZGRikgeworCQlwcml2LT5waHlbMF0gPSBUTEFOX1BIWV9NQVhfQUREUjsKKwl9IGVsc2UgeworCQlwcml2LT5waHlbMF0gPSBUTEFOX1BIWV9OT05FOworCX0KIAotCWRhdGEgPSBpbmwoZGV2LT5iYXNlX2FkZHIgKyBUTEFOX0hPU1RfQ01EKTsKLQlkYXRhIHw9IFRMQU5fSENfSU5UX09GRjsKLQlvdXRsKGRhdGEsIGRldi0+YmFzZV9hZGRyICsgVExBTl9IT1NUX0NNRCk7CisJcHJpdi0+cGh5WzFdID0gVExBTl9QSFlfTk9ORTsKKwlmb3IgKHBoeSA9IDA7IHBoeSA8PSBUTEFOX1BIWV9NQVhfQUREUjsgcGh5KyspIHsKKwkJVExhbl9NaWlSZWFkUmVnKG5pYywgcGh5LCBNSUlfR0VOX0NUTCwgJmNvbnRyb2wpOworCQlUTGFuX01paVJlYWRSZWcobmljLCBwaHksIE1JSV9HRU5fSURfSEksICZoaSk7CisJCVRMYW5fTWlpUmVhZFJlZyhuaWMsIHBoeSwgTUlJX0dFTl9JRF9MTywgJmxvKTsKKwkJaWYgKChjb250cm9sICE9IDB4RkZGRikgfHwgKGhpICE9IDB4RkZGRikKKwkJICAgIHx8IChsbyAhPSAweEZGRkYpKSB7CisJCQlwcmludGYoIlBIWSBmb3VuZCBhdCAlaFggJWhYICVoWCAlaFhcbiIsIHBoeSwKKwkJCSAgICAgICBjb250cm9sLCBoaSwgbG8pOworCQkJaWYgKChwcml2LT5waHlbMV0gPT0gVExBTl9QSFlfTk9ORSkKKwkJCSAgICAmJiAocGh5ICE9IFRMQU5fUEhZX01BWF9BRERSKSkgeworCQkJCXByaXYtPnBoeVsxXSA9IHBoeTsKKwkJCX0KKwkJfQorCX0KIAotLyogIDMuCUNsZWFyIEFSRUdzIGFuZCBIQVNIcy4gKi8KKwlpZiAocHJpdi0+cGh5WzFdICE9IFRMQU5fUEhZX05PTkUpIHsKKwkJcHJpdi0+cGh5TnVtID0gMTsKKwl9IGVsc2UgaWYgKHByaXYtPnBoeVswXSAhPSBUTEFOX1BIWV9OT05FKSB7CisJCXByaXYtPnBoeU51bSA9IDA7CisJfSBlbHNlIHsKKwkJcHJpbnRmCisJCSAgICAoIlRMQU46ICBDYW5ub3QgaW5pdGlhbGl6ZSBkZXZpY2UsIG5vIFBIWSB3YXMgZm91bmQhXG4iKTsKKwl9CisKK30JCQkJLyogVExhbl9QaHlEZXRlY3QgKi8KIAotIAlmb3IgKCBpID0gVExBTl9BUkVHXzA7IGkgPD0gVExBTl9IQVNIXzI7IGkgKz0gNCApIHsKLQkJVExhbl9EaW9Xcml0ZTMyKCBkZXYtPmJhc2VfYWRkciwgKHUxNikgaSwgMCApOwordm9pZCBUTGFuX1BoeVBvd2VyRG93bihzdHJ1Y3QgbmljICpuaWMpCit7CisKKwl1MTYgdmFsdWU7CisJcHJpbnRmKCIlczogUG93ZXJpbmcgZG93biBQSFkocykuXG4iLCBwcml2LT5uaWNfbmFtZSk7CisJdmFsdWUgPSBNSUlfR0NfUERPV04gfCBNSUlfR0NfTE9PUEJLIHwgTUlJX0dDX0lTT0xBVEU7CisJVExhbl9NaWlTeW5jKEJBU0UpOworCVRMYW5fTWlpV3JpdGVSZWcobmljLCBwcml2LT5waHlbcHJpdi0+cGh5TnVtXSwgTUlJX0dFTl9DVEwsIHZhbHVlKTsKKwlpZiAoKHByaXYtPnBoeU51bSA9PSAwKSAmJiAocHJpdi0+cGh5WzFdICE9IFRMQU5fUEhZX05PTkUpCisJICAgICYmCisJICAgICghKHRsYW5fcGNpX3RibFtjaGlwX2lkeF0uCisJICAgICAgIGZsYWdzICYgVExBTl9BREFQVEVSX1VTRV9JTlRFUk5fMTApKSkgeworCQlUTGFuX01paVN5bmMoQkFTRSk7CisJCVRMYW5fTWlpV3JpdGVSZWcobmljLCBwcml2LT5waHlbMV0sIE1JSV9HRU5fQ1RMLCB2YWx1ZSk7CiAJfQogCi0vKiAgNC4JU2V0dXAgTmV0Q29uZmlnIHJlZ2lzdGVyLiAqLworCS8qIFdhaXQgZm9yIDUwIG1zIGFuZCBwb3dlcnVwCisJICogVGhpcyBpcyBhYml0cmFyeS4gIEl0IGlzIGludGVuZGVkIHRvIG1ha2Ugc3VyZSB0aGUKKwkgKiB0cmFuY2VpdmVyIHNldHRsZXMuCisJICovCisJLyogVExhbl9TZXRUaW1lciggZGV2LCAoSFovMjApLCBUTEFOX1RJTUVSX1BIWV9QVVAgKTsgKi8KKwltZGVsYXkoNTApOworCVRMYW5fUGh5UG93ZXJVcChuaWMpOwogCi0JZGF0YSA9IFRMQU5fTkVUX0NGR18xRlJBRyB8IFRMQU5fTkVUX0NGR18xQ0hBTiB8IFRMQU5fTkVUX0NGR19QSFlfRU47Ci0JVExhbl9EaW9Xcml0ZTE2KCBkZXYtPmJhc2VfYWRkciwgVExBTl9ORVRfQ09ORklHLCAodTE2KSBkYXRhICk7Cit9CQkJCS8qIFRMYW5fUGh5UG93ZXJEb3duICovCiAKLS8qICA1LglMb2FkIExkX1RtciBhbmQgTGRfVGhyIGluIEhPU1RfQ01ELiAqLwogCi0gCW91dGwoIFRMQU5fSENfTERfVE1SIHwgMHgzZiwgZGV2LT5iYXNlX2FkZHIgKyBUTEFOX0hPU1RfQ01EICk7Ci0gCW91dGwoIFRMQU5fSENfTERfVEhSIHwgMHg5LCBkZXYtPmJhc2VfYWRkciArIFRMQU5fSE9TVF9DTUQgKTsKK3ZvaWQgVExhbl9QaHlQb3dlclVwKHN0cnVjdCBuaWMgKm5pYykKK3sKKwl1MTYgdmFsdWU7CiAKLS8qICA2LglVbnJlc2V0IHRoZSBNSUkgYnkgc2V0dGluZyBOTVJTVCAoaW4gTmV0U2lvKSB0byAxLiAqLworCXByaW50ZigiJXM6IFBvd2VyaW5nIHVwIFBIWS5cbiIsIHByaXYtPm5pY19uYW1lKTsKKwlUTGFuX01paVN5bmMoQkFTRSk7CisJdmFsdWUgPSBNSUlfR0NfTE9PUEJLOworCVRMYW5fTWlpV3JpdGVSZWcobmljLCBwcml2LT5waHlbcHJpdi0+cGh5TnVtXSwgTUlJX0dFTl9DVEwsIHZhbHVlKTsKKwlUTGFuX01paVN5bmMoQkFTRSk7CisJLyogV2FpdCBmb3IgNTAwIG1zIGFuZCByZXNldCB0aGUKKwkgKiB0cmFuY2VpdmVyLiAgVGhlIFRMQU4gZG9jcyBzYXkgYm90aCA1MCBtcyBhbmQKKwkgKiA1MDAgbXMsIHNvIGRvIHRoZSBsb25nZXIsIGp1c3QgaW4gY2FzZS4KKwkgKi8KKwltZGVsYXkoNTAwKTsKKwlUTGFuX1BoeVJlc2V0KG5pYyk7CisJLyogVExhbl9TZXRUaW1lciggZGV2LCAoSFovMjApLCBUTEFOX1RJTUVSX1BIWV9SRVNFVCApOyAqLwogCi0Jb3V0dyggVExBTl9ORVRfU0lPLCBkZXYtPmJhc2VfYWRkciArIFRMQU5fRElPX0FEUiApOwotCWFkZHIgPSBkZXYtPmJhc2VfYWRkciArIFRMQU5fRElPX0RBVEEgKyBUTEFOX05FVF9TSU87Ci0JVExhbl9TZXRCaXQoIFRMQU5fTkVUX1NJT19OTVJTVCwgYWRkciApOworfQkJCQkvKiBUTGFuX1BoeVBvd2VyVXAgKi8KIAotLyogIDcuCVNldHVwIHRoZSByZW1haW5pbmcgcmVnaXN0ZXJzLiAqLwordm9pZCBUTGFuX1BoeVJlc2V0KHN0cnVjdCBuaWMgKm5pYykKK3sKKwl1MTYgcGh5OworCXUxNiB2YWx1ZTsKIAotCWlmICggcHJpdi0+dGxhblJldiA+PSAweDMwICkgewotCQlkYXRhOCA9IFRMQU5fSURfVFhfRU9DIHwgVExBTl9JRF9SWF9FT0M7Ci0JCVRMYW5fRGlvV3JpdGU4KCBkZXYtPmJhc2VfYWRkciwgVExBTl9JTlRfRElTLCBkYXRhOCApOworCXBoeSA9IHByaXYtPnBoeVtwcml2LT5waHlOdW1dOworCisJcHJpbnRmKCIlczogUmVzZXRpbmcgUEhZLlxuIiwgcHJpdi0+bmljX25hbWUpOworCVRMYW5fTWlpU3luYyhCQVNFKTsKKwl2YWx1ZSA9IE1JSV9HQ19MT09QQksgfCBNSUlfR0NfUkVTRVQ7CisJVExhbl9NaWlXcml0ZVJlZyhuaWMsIHBoeSwgTUlJX0dFTl9DVEwsIHZhbHVlKTsKKwlUTGFuX01paVJlYWRSZWcobmljLCBwaHksIE1JSV9HRU5fQ1RMLCAmdmFsdWUpOworCXdoaWxlICh2YWx1ZSAmIE1JSV9HQ19SRVNFVCkgeworCQlUTGFuX01paVJlYWRSZWcobmljLCBwaHksIE1JSV9HRU5fQ1RMLCAmdmFsdWUpOwogCX0KLQlUTGFuX1BoeURldGVjdCggZGV2ICk7Ci0JZGF0YSA9IFRMQU5fTkVUX0NGR18xRlJBRyB8IFRMQU5fTkVUX0NGR18xQ0hBTjsKLQkKLQlpZiAoIHByaXYtPmFkYXB0ZXItPmZsYWdzICYgVExBTl9BREFQVEVSX0JJVF9SQVRFX1BIWSApIHsKLQkJZGF0YSB8PSBUTEFOX05FVF9DRkdfQklUOwotCQlpZiAoIHByaXYtPmF1aSA9PSAxICkgewotCQkJVExhbl9EaW9Xcml0ZTgoIGRldi0+YmFzZV9hZGRyLCBUTEFOX0FDT01NSVQsIDB4MGEgKTsKLQkJfSBlbHNlIGlmICggcHJpdi0+ZHVwbGV4ID09IFRMQU5fRFVQTEVYX0ZVTEwgKSB7Ci0JCQlUTGFuX0Rpb1dyaXRlOCggZGV2LT5iYXNlX2FkZHIsIFRMQU5fQUNPTU1JVCwgMHgwMCApOworCisJLyogV2FpdCBmb3IgNTAwIG1zIGFuZCBpbml0aWFsaXplLgorCSAqIEkgZG9uJ3QgcmVtZW1iZXIgd2h5IEkgd2FpdCB0aGlzIGxvbmcuCisJICogSSd2ZSBjaGFuZ2VkIHRoaXMgdG8gNTBtcywgYXMgaXQgc2VlbXMgbG9uZyBlbm91Z2guCisJICovCisJLyogVExhbl9TZXRUaW1lciggZGV2LCAoSFovMjApLCBUTEFOX1RJTUVSX1BIWV9TVEFSVF9MSU5LICk7ICovCisJbWRlbGF5KDUwKTsKKwlUTGFuX1BoeVN0YXJ0TGluayhuaWMpOworCit9CQkJCS8qIFRMYW5fUGh5UmVzZXQgKi8KKworCit2b2lkIFRMYW5fUGh5U3RhcnRMaW5rKHN0cnVjdCBuaWMgKm5pYykKK3sKKworCXUxNiBhYmlsaXR5OworCXUxNiBjb250cm9sOworCXUxNiBkYXRhOworCXUxNiBwaHk7CisJdTE2IHN0YXR1czsKKwl1MTYgdGN0bDsKKworCXBoeSA9IHByaXYtPnBoeVtwcml2LT5waHlOdW1dOworCXByaW50ZigiJXM6IFRyeWluZyB0byBhY3RpdmF0ZSBsaW5rLlxuIiwgcHJpdi0+bmljX25hbWUpOworCVRMYW5fTWlpUmVhZFJlZyhuaWMsIHBoeSwgTUlJX0dFTl9TVFMsICZzdGF0dXMpOworCVRMYW5fTWlpUmVhZFJlZyhuaWMsIHBoeSwgTUlJX0dFTl9TVFMsICZhYmlsaXR5KTsKKworCWlmICgoc3RhdHVzICYgTUlJX0dTX0FVVE9ORUcpICYmICghcHJpdi0+YXVpKSkgeworCQlhYmlsaXR5ID0gc3RhdHVzID4+IDExOworCQlpZiAocHJpdi0+c3BlZWQgPT0gVExBTl9TUEVFRF8xMCAmJgorCQkgICAgcHJpdi0+ZHVwbGV4ID09IFRMQU5fRFVQTEVYX0hBTEYpIHsKKwkJCVRMYW5fTWlpV3JpdGVSZWcobmljLCBwaHksIE1JSV9HRU5fQ1RMLCAweDAwMDApOworCQl9IGVsc2UgaWYgKHByaXYtPnNwZWVkID09IFRMQU5fU1BFRURfMTAgJiYKKwkJCSAgIHByaXYtPmR1cGxleCA9PSBUTEFOX0RVUExFWF9GVUxMKSB7CisJCQlwcml2LT50bGFuRnVsbER1cGxleCA9IFRSVUU7CisJCQlUTGFuX01paVdyaXRlUmVnKG5pYywgcGh5LCBNSUlfR0VOX0NUTCwgMHgwMTAwKTsKKwkJfSBlbHNlIGlmIChwcml2LT5zcGVlZCA9PSBUTEFOX1NQRUVEXzEwMCAmJgorCQkJICAgcHJpdi0+ZHVwbGV4ID09IFRMQU5fRFVQTEVYX0hBTEYpIHsKKwkJCVRMYW5fTWlpV3JpdGVSZWcobmljLCBwaHksIE1JSV9HRU5fQ1RMLCAweDIwMDApOworCQl9IGVsc2UgaWYgKHByaXYtPnNwZWVkID09IFRMQU5fU1BFRURfMTAwICYmCisJCQkgICBwcml2LT5kdXBsZXggPT0gVExBTl9EVVBMRVhfRlVMTCkgewogCQkJcHJpdi0+dGxhbkZ1bGxEdXBsZXggPSBUUlVFOworCQkJVExhbl9NaWlXcml0ZVJlZyhuaWMsIHBoeSwgTUlJX0dFTl9DVEwsIDB4MjEwMCk7CiAJCX0gZWxzZSB7Ci0JCQlUTGFuX0Rpb1dyaXRlOCggZGV2LT5iYXNlX2FkZHIsIFRMQU5fQUNPTU1JVCwgMHgwOCApOworCisJCQkvKiBTZXQgQXV0by1OZWcgYWR2ZXJ0aXNlbWVudCAqLworCQkJVExhbl9NaWlXcml0ZVJlZyhuaWMsIHBoeSwgTUlJX0FOX0FEViwKKwkJCQkJIChhYmlsaXR5IDw8IDUpIHwgMSk7CisJCQkvKiBFbmFibGVlIEF1dG8tTmVnICovCisJCQlUTGFuX01paVdyaXRlUmVnKG5pYywgcGh5LCBNSUlfR0VOX0NUTCwgMHgxMDAwKTsKKwkJCS8qIFJlc3RhcnQgQXV0by1OZWcgKi8KKwkJCVRMYW5fTWlpV3JpdGVSZWcobmljLCBwaHksIE1JSV9HRU5fQ1RMLCAweDEyMDApOworCQkJLyogV2FpdCBmb3IgNCBzZWMgZm9yIGF1dG9uZWdvdGlhdGlvbgorCQkJICogdG8gY29tcGxldGUuICBUaGUgbWF4IHNwZWMgdGltZSBpcyBsZXNzIHRoYW4gdGhpcworCQkJICogYnV0IHRoZSBjYXJkIG5lZWQgYWRkaXRpb25hbCB0aW1lIHRvIHN0YXJ0IEFOLgorCQkJICogLjUgc2VjIHNob3VsZCBiZSBwbGVudHkgZXh0cmEuCisJCQkgKi8KKwkJCXByaW50ZigiVExBTjogJXM6IFN0YXJ0aW5nIGF1dG9uZWdvdGlhdGlvbi5cbiIsCisJCQkgICAgICAgcHJpdi0+bmljX25hbWUpOworCQkJbWRlbGF5KDQwMDApOworCQkJVExhbl9QaHlGaW5pc2hBdXRvTmVnKG5pYyk7CisJCQkvKiBUTGFuX1NldFRpbWVyKCBkZXYsICgyKkhaKSwgVExBTl9USU1FUl9QSFlfRklOSVNIX0FOICk7ICovCisJCQlyZXR1cm47CiAJCX0KLQl9CiAKLQlpZiAoIHByaXYtPnBoeU51bSA9PSAwICkgewotCQlkYXRhIHw9IFRMQU5fTkVUX0NGR19QSFlfRU47CiAJfQotCVRMYW5fRGlvV3JpdGUxNiggZGV2LT5iYXNlX2FkZHIsIFRMQU5fTkVUX0NPTkZJRywgKHUxNikgZGF0YSApOwogCi0JaWYgKCBwcml2LT5hZGFwdGVyLT5mbGFncyAmIFRMQU5fQURBUFRFUl9VTk1BTkFHRURfUEhZICkgewotCQlUTGFuX0ZpbmlzaFJlc2V0KCBkZXYgKTsKLQl9IGVsc2UgewotCQlUTGFuX1BoeVBvd2VyRG93biggZGV2ICk7CisJaWYgKChwcml2LT5hdWkpICYmIChwcml2LT5waHlOdW0gIT0gMCkpIHsKKwkJcHJpdi0+cGh5TnVtID0gMDsKKwkJZGF0YSA9CisJCSAgICBUTEFOX05FVF9DRkdfMUZSQUcgfCBUTEFOX05FVF9DRkdfMUNIQU4gfAorCQkgICAgVExBTl9ORVRfQ0ZHX1BIWV9FTjsKKwkJVExhbl9EaW9Xcml0ZTE2KEJBU0UsIFRMQU5fTkVUX0NPTkZJRywgZGF0YSk7CisJCW1kZWxheSg1MCk7CisJCS8qIFRMYW5fU2V0VGltZXIoIGRldiwgKDQwKkhaLzEwMDApLCBUTEFOX1RJTUVSX1BIWV9QRE9XTiApOyAqLworCQlUTGFuX1BoeVBvd2VyRG93bihuaWMpOworCQlyZXR1cm47CisJfSBlbHNlIGlmIChwcml2LT5waHlOdW0gPT0gMCkgeworCQljb250cm9sID0gMDsKKwkJVExhbl9NaWlSZWFkUmVnKG5pYywgcGh5LCBUTEFOX1RMUEhZX0NUTCwgJnRjdGwpOworCQlpZiAocHJpdi0+YXVpKSB7CisJCQl0Y3RsIHw9IFRMQU5fVENfQVVJU0VMOworCQl9IGVsc2UgeworCQkJdGN0bCAmPSB+VExBTl9UQ19BVUlTRUw7CisJCQlpZiAocHJpdi0+ZHVwbGV4ID09IFRMQU5fRFVQTEVYX0ZVTEwpIHsKKwkJCQljb250cm9sIHw9IE1JSV9HQ19EVVBMRVg7CisJCQkJcHJpdi0+dGxhbkZ1bGxEdXBsZXggPSBUUlVFOworCQkJfQorCQkJaWYgKHByaXYtPnNwZWVkID09IFRMQU5fU1BFRURfMTAwKSB7CisJCQkJY29udHJvbCB8PSBNSUlfR0NfU1BFRURTRUw7CisJCQl9CisJCX0KKwkJVExhbl9NaWlXcml0ZVJlZyhuaWMsIHBoeSwgTUlJX0dFTl9DVEwsIGNvbnRyb2wpOworCQlUTGFuX01paVdyaXRlUmVnKG5pYywgcGh5LCBUTEFOX1RMUEhZX0NUTCwgdGN0bCk7CiAJfQogCi19IC8qIFRMYW5fUmVzZXRBZGFwdGVyICovCisJLyogV2FpdCBmb3IgMiBzZWMgdG8gZ2l2ZSB0aGUgdHJhbmNlaXZlciB0aW1lCisJICogdG8gZXN0YWJsaXNoIGxpbmsuCisJICovCisJLyogVExhbl9TZXRUaW1lciggZGV2LCAoNCpIWiksIFRMQU5fVElNRVJfRklOSVNIX1JFU0VUICk7ICovCisJbWRlbGF5KDIwMDApOworCVRMYW5fRmluaXNoUmVzZXQobmljKTsKKworfQkJCQkvKiBUTGFuX1BoeVN0YXJ0TGluayAqLwogCi12b2lkCi1UTGFuX0ZpbmlzaFJlc2V0KCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ICkKK3ZvaWQgVExhbl9QaHlGaW5pc2hBdXRvTmVnKHN0cnVjdCBuaWMgKm5pYykKIHsKLQlUTGFuUHJpdmF0ZUluZm8JKnByaXYgPSBkZXYtPnByaXY7Ci0JdTgJCWRhdGE7Ci0JdTMyCQlwaHk7Ci0JdTgJCXNpbzsKLQl1MTYJCXN0YXR1czsKLQl1MTYJCXBhcnRuZXI7Ci0JdTE2CQl0bHBoeV9jdGw7Ci0JdTE2IAkJdGxwaHlfcGFyOwotCXUxNgkJdGxwaHlfaWQxLCB0bHBoeV9pZDI7Ci0JaW50IAkJaTsKKworCXUxNiBhbl9hZHY7CisJdTE2IGFuX2xwYTsKKwl1MTYgZGF0YTsKKwl1MTYgbW9kZTsKKwl1MTYgcGh5OworCXUxNiBzdGF0dXM7CiAKIAlwaHkgPSBwcml2LT5waHlbcHJpdi0+cGh5TnVtXTsKIAotCWRhdGEgPSBUTEFOX05FVF9DTURfTlJFU0VUIHwgVExBTl9ORVRfQ01EX05XUkFQOwotCWlmICggcHJpdi0+dGxhbkZ1bGxEdXBsZXggKSB7Ci0JCWRhdGEgfD0gVExBTl9ORVRfQ01EX0RVUExFWDsKKwlUTGFuX01paVJlYWRSZWcobmljLCBwaHksIE1JSV9HRU5fU1RTLCAmc3RhdHVzKTsKKwl1ZGVsYXkoMTAwMCk7CisJVExhbl9NaWlSZWFkUmVnKG5pYywgcGh5LCBNSUlfR0VOX1NUUywgJnN0YXR1cyk7CisKKwlpZiAoIShzdGF0dXMgJiBNSUlfR1NfQVVUT0NNUExUKSkgeworCQkvKiBXYWl0IGZvciA4IHNlYyB0byBnaXZlIHRoZSBwcm9jZXNzCisJCSAqIG1vcmUgdGltZS4gIFBlcmhhcHMgd2Ugc2hvdWxkIGZhaWwgYWZ0ZXIgYSB3aGlsZS4KKwkJICovCisJCWlmICghcHJpdi0+bmVnX2JlX3ZlcmJvc2UrKykgeworCQkJcHJpbnRmCisJCQkgICAgKCJUTEFOOiAgR2l2aW5nIGF1dG9uZWdvdGlhdGlvbiBtb3JlIHRpbWUuXG4iKTsKKwkJCXByaW50ZgorCQkJICAgICgiVExBTjogIFBsZWFzZSBjaGVjayB0aGF0IHlvdXIgYWRhcHRlciBoYXNcbiIpOworCQkJcHJpbnRmCisJCQkgICAgKCJUTEFOOiAgYmVlbiBwcm9wZXJseSBjb25uZWN0ZWQgdG8gYSBIVUIgb3IgU3dpdGNoLlxuIik7CisJCQlwcmludGYKKwkJCSAgICAoIlRMQU46ICBUcnlpbmcgdG8gZXN0YWJsaXNoIGxpbmsgaW4gdGhlIGJhY2tncm91bmQuLi5cbiIpOworCQl9CisJCW1kZWxheSg4MDAwKTsKKwkJVExhbl9QaHlGaW5pc2hBdXRvTmVnKG5pYyk7CisJCS8qIFRMYW5fU2V0VGltZXIoIGRldiwgKDgqSFopLCBUTEFOX1RJTUVSX1BIWV9GSU5JU0hfQU4gKTsgKi8KKwkJcmV0dXJuOwogCX0KLQlUTGFuX0Rpb1dyaXRlOCggZGV2LT5iYXNlX2FkZHIsIFRMQU5fTkVUX0NNRCwgZGF0YSApOwotCWRhdGEgPSBUTEFOX05FVF9NQVNLX01BU0s0IHwgVExBTl9ORVRfTUFTS19NQVNLNTsgCi0JaWYgKCBwcml2LT5waHlOdW0gPT0gMCApIHsKLQkJZGF0YSB8PSBUTEFOX05FVF9NQVNLX01BU0s3OyAKLQl9Ci0JVExhbl9EaW9Xcml0ZTgoIGRldi0+YmFzZV9hZGRyLCBUTEFOX05FVF9NQVNLLCBkYXRhICk7Ci0JVExhbl9EaW9Xcml0ZTE2KCBkZXYtPmJhc2VfYWRkciwgVExBTl9NQVhfUlgsICgoMTUzNikrNykmfjcgKTsKLQlUTGFuX01paVJlYWRSZWcoIGRldiwgcGh5LCBNSUlfR0VOX0lEX0hJLCAmdGxwaHlfaWQxICk7Ci0JVExhbl9NaWlSZWFkUmVnKCBkZXYsIHBoeSwgTUlJX0dFTl9JRF9MTywgJnRscGh5X2lkMiApOwotCQotCWlmICggKCBwcml2LT5hZGFwdGVyLT5mbGFncyAmIFRMQU5fQURBUFRFUl9VTk1BTkFHRURfUEhZICkgfHwgKCBwcml2LT5hdWkgKSApIHsKLQkJc3RhdHVzID0gTUlJX0dTX0xJTks7Ci0JCXByaW50ayggIlRMQU46ICAlczogTGluayBmb3JjZWQuXG4iLCBkZXYtPm5hbWUgKTsKLQl9IGVsc2UgewotCQlUTGFuX01paVJlYWRSZWcoIGRldiwgcGh5LCBNSUlfR0VOX1NUUywgJnN0YXR1cyApOwotCQl1ZGVsYXkoIDEwMDAgKTsKLQkJVExhbl9NaWlSZWFkUmVnKCBkZXYsIHBoeSwgTUlJX0dFTl9TVFMsICZzdGF0dXMgKTsKLQkJaWYgKCAoc3RhdHVzICYgTUlJX0dTX0xJTkspICYmCSAvKiBXZSBvbmx5IHN1cHBvcnQgbGluayBpbmZvIG9uIE5hdC5TZW0uIFBIWSdzICovIAotCQkJKHRscGh5X2lkMSA9PSBOQVRfU0VNX0lEMSkgJiYKLQkJCSh0bHBoeV9pZDIgPT0gTkFUX1NFTV9JRDIpICkgewotCQkJVExhbl9NaWlSZWFkUmVnKCBkZXYsIHBoeSwgTUlJX0FOX0xQQSwgJnBhcnRuZXIgKTsKLQkJCVRMYW5fTWlpUmVhZFJlZyggZGV2LCBwaHksIFRMQU5fVExQSFlfUEFSLCAmdGxwaHlfcGFyICk7Ci0JCQkKLQkJCXByaW50ayggIlRMQU46ICVzOiBMaW5rIGFjdGl2ZSB3aXRoICIsIGRldi0+bmFtZSApOwotCQkJaWYgKCEodGxwaHlfcGFyICYgVExBTl9QSFlfQU5fRU5fU1RBVCkpIHsKLQkJCSAgICAgIAkgcHJpbnRrKCAiZm9yY2VkIDEwJXNNYnBzICVzLUR1cGxleFxuIiwgCi0JCQkJCQl0bHBoeV9wYXIgJiBUTEFOX1BIWV9TUEVFRF8xMDAgPyAiIiA6ICIwIiwKLQkJCQkJCXRscGh5X3BhciAmIFRMQU5fUEhZX0RVUExFWF9GVUxMID8gIkZ1bGwiIDogIkhhbGYiKTsKLQkJCX0gZWxzZSB7Ci0JCQkJcHJpbnRrKCAiQXV0b05lZ290aWF0aW9uIGVuYWJsZWQsIGF0IDEwJXNNYnBzICVzLUR1cGxleFxuIiwKLQkJCQkJCXRscGh5X3BhciAmIFRMQU5fUEhZX1NQRUVEXzEwMCA/ICIiIDogIjAiLAotCQkJCQkJdGxwaHlfcGFyICYgVExBTl9QSFlfRFVQTEVYX0ZVTEwgPyAiRnVsbCIgOiAiSGFsZiIpOwotCQkJCXByaW50aygiVExBTjogUGFydG5lciBjYXBhYmlsaXR5OiAiKTsKLQkJCQkJZm9yIChpID0gNTsgaSA8PSAxMDsgaSsrKQotCQkJCQkJaWYgKHBhcnRuZXIgJiAoMTw8aSkpCi0JCQkJCQkJcHJpbnRrKCIlcyIsIG1lZGlhW2ktNV0pOwotCQkJCQkJCXByaW50aygiXG4iKTsKLQkJCX0KIAotCQkJVExhbl9EaW9Xcml0ZTgoIGRldi0+YmFzZV9hZGRyLCBUTEFOX0xFRF9SRUcsIFRMQU5fTEVEX0xJTksgKTsKLSNpZmRlZiBNT05JVE9SCQkJCi0JCQkvKiBXZSBoYXZlIGxpbmsgYmVhdC4uZm9yIG5vdyBhbnl3YXkgKi8KLQkgICAgICAgIAlwcml2LT5saW5rID0gMTsKLQkgICAgICAgIAkvKkVuYWJsaW5nIGxpbmsgYmVhdCBtb25pdG9yaW5nICovCi0JCQlUTGFuX1NldFRpbWVyKCBkZXYsICgxMCpIWiksIFRMQU5fVElNRVJfTElOS19CRUFUICk7Ci0jZW5kaWYgCi0JCX0gZWxzZSBpZiAoc3RhdHVzICYgTUlJX0dTX0xJTkspICB7Ci0JCQlwcmludGsoICJUTEFOOiAlczogTGluayBhY3RpdmVcbiIsIGRldi0+bmFtZSApOwotCQkJVExhbl9EaW9Xcml0ZTgoIGRldi0+YmFzZV9hZGRyLCBUTEFOX0xFRF9SRUcsIFRMQU5fTEVEX0xJTksgKTsKLQkJfQorCXByaW50ZigiVExBTjogJXM6IEF1dG9uZWdvdGlhdGlvbiBjb21wbGV0ZS5cbiIsIHByaXYtPm5pY19uYW1lKTsKKwlUTGFuX01paVJlYWRSZWcobmljLCBwaHksIE1JSV9BTl9BRFYsICZhbl9hZHYpOworCVRMYW5fTWlpUmVhZFJlZyhuaWMsIHBoeSwgTUlJX0FOX0xQQSwgJmFuX2xwYSk7CisJbW9kZSA9IGFuX2FkdiAmIGFuX2xwYSAmIDB4MDNFMDsKKwlpZiAobW9kZSAmIDB4MDEwMCkgeworCQlwcmludGYoIkZ1bGwgRHVwbGV4XG4iKTsKKwkJcHJpdi0+dGxhbkZ1bGxEdXBsZXggPSBUUlVFOworCX0gZWxzZSBpZiAoIShtb2RlICYgMHgwMDgwKSAmJiAobW9kZSAmIDB4MDA0MCkpIHsKKwkJcHJpdi0+dGxhbkZ1bGxEdXBsZXggPSBUUlVFOworCQlwcmludGYoIkZ1bGwgRHVwbGV4XG4iKTsKIAl9CiAKLQlpZiAoIHByaXYtPnBoeU51bSA9PSAwICkgewotICAgICAgICAJVExhbl9NaWlSZWFkUmVnKCBkZXYsIHBoeSwgVExBTl9UTFBIWV9DVEwsICZ0bHBoeV9jdGwgKTsKLSAgICAgICAgCXRscGh5X2N0bCB8PSBUTEFOX1RDX0lOVEVOOwotICAgICAgICAJVExhbl9NaWlXcml0ZVJlZyggZGV2LCBwaHksIFRMQU5fVExQSFlfQ1RMLCB0bHBoeV9jdGwgKTsKLSAgICAgICAgCXNpbyA9IFRMYW5fRGlvUmVhZDgoIGRldi0+YmFzZV9hZGRyLCBUTEFOX05FVF9TSU8gKTsKLSAgICAgICAgCXNpbyB8PSBUTEFOX05FVF9TSU9fTUlOVEVOOwotICAgICAgICAJVExhbl9EaW9Xcml0ZTgoIGRldi0+YmFzZV9hZGRyLCBUTEFOX05FVF9TSU8sIHNpbyApOworCWlmICgoIShtb2RlICYgMHgwMTgwKSkKKwkgICAgJiYgKHRsYW5fcGNpX3RibFtjaGlwX2lkeF0uZmxhZ3MgJiBUTEFOX0FEQVBURVJfVVNFX0lOVEVSTl8xMCkKKwkgICAgJiYgKHByaXYtPnBoeU51bSAhPSAwKSkgeworCQlwcml2LT5waHlOdW0gPSAwOworCQlkYXRhID0KKwkJICAgIFRMQU5fTkVUX0NGR18xRlJBRyB8IFRMQU5fTkVUX0NGR18xQ0hBTiB8CisJCSAgICBUTEFOX05FVF9DRkdfUEhZX0VOOworCQlUTGFuX0Rpb1dyaXRlMTYoQkFTRSwgVExBTl9ORVRfQ09ORklHLCBkYXRhKTsKKwkJLyogVExhbl9TZXRUaW1lciggbmljLCAoNDAwKkhaLzEwMDApLCBUTEFOX1RJTUVSX1BIWV9QRE9XTiApOyAqLworCQltZGVsYXkoNDAwKTsKKwkJVExhbl9QaHlQb3dlckRvd24obmljKTsKKwkJcmV0dXJuOwogCX0KIAotCWlmICggc3RhdHVzICYgTUlJX0dTX0xJTksgKSB7Ci0JCVRMYW5fU2V0TWFjKCBkZXYsIDAsIGRldi0+ZGV2X2FkZHIgKTsKLQkJcHJpdi0+cGh5T25saW5lID0gMTsKLQkJb3V0YiggKCBUTEFOX0hDX0lOVF9PTiA+PiA4ICksIGRldi0+YmFzZV9hZGRyICsgVExBTl9IT1NUX0NNRCArIDEgKTsKLQkJaWYgKCBkZWJ1ZyA+PSAxICYmIGRlYnVnICE9IFRMQU5fREVCVUdfUFJPQkUgKSB7Ci0JCQlvdXRiKCAoIFRMQU5fSENfUkVRX0lOVCA+PiA4ICksIGRldi0+YmFzZV9hZGRyICsgVExBTl9IT1NUX0NNRCArIDEgKTsKKwlpZiAocHJpdi0+cGh5TnVtID09IDApIHsKKwkJaWYgKChwcml2LT5kdXBsZXggPT0gVExBTl9EVVBMRVhfRlVMTCkKKwkJICAgIHx8IChhbl9hZHYgJiBhbl9scGEgJiAweDAwNDApKSB7CisJCQlUTGFuX01paVdyaXRlUmVnKG5pYywgcGh5LCBNSUlfR0VOX0NUTCwKKwkJCQkJIE1JSV9HQ19BVVRPRU5CIHwgTUlJX0dDX0RVUExFWCk7CisJCQlwcmludGYKKwkJCSAgICAoIlRMQU46ICBTdGFydGluZyBpbnRlcm5hbCBQSFkgd2l0aCBGVUxMLURVUExFWFxuIik7CisJCX0gZWxzZSB7CisJCQlUTGFuX01paVdyaXRlUmVnKG5pYywgcGh5LCBNSUlfR0VOX0NUTCwKKwkJCQkJIE1JSV9HQ19BVVRPRU5CKTsKKwkJCXByaW50ZgorCQkJICAgICgiVExBTjogIFN0YXJ0aW5nIGludGVybmFsIFBIWSB3aXRoIEhBTEYtRFVQTEVYXG4iKTsKIAkJfQotCQlvdXRsKCB2aXJ0X3RvX2J1cyggcHJpdi0+cnhMaXN0ICksIGRldi0+YmFzZV9hZGRyICsgVExBTl9DSF9QQVJNICk7Ci0JCW91dGwoIFRMQU5fSENfR08gfCBUTEFOX0hDX1JULCBkZXYtPmJhc2VfYWRkciArIFRMQU5fSE9TVF9DTUQgKTsKLQl9IGVsc2UgewotCQlwcmludGsoICJUTEFOOiAlczogTGluayBpbmFjdGl2ZSwgd2lsbCByZXRyeSBpbiAxMCBzZWNzLi4uXG4iLCBkZXYtPm5hbWUgKTsKLQkJVExhbl9TZXRUaW1lciggZGV2LCAoMTAqSFopLCBUTEFOX1RJTUVSX0ZJTklTSF9SRVNFVCApOwotCQlyZXR1cm47CiAJfQogCi19IC8qIFRMYW5fRmluaXNoUmVzZXQgKi8KKwkvKiBXYWl0IGZvciAxMDAgbXMuICBObyByZWFzb24gaW4gcGFydGl0aWN1bGFyLgorCSAqLworCS8qIFRMYW5fU2V0VGltZXIoIGRldiwgKEhaLzEwKSwgVExBTl9USU1FUl9GSU5JU0hfUkVTRVQgKTsgKi8KKwltZGVsYXkoMTAwKTsKKwlUTGFuX0ZpbmlzaFJlc2V0KG5pYyk7CiAKLQkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JICoJVExhbl9TZXRNYWMKLQkgKgotCSAqCVJldHVybnM6Ci0JICoJCU5vdGhpbmcKLQkgKglQYXJtczoKLQkgKgkJZGV2CVBvaW50ZXIgdG8gZGV2aWNlIHN0cnVjdHVyZSBvZiBhZGFwdGVyCi0JICoJCQlvbiB3aGljaCB0byBjaGFuZ2UgdGhlIEFSRUcuCi0JICoJCWFyZWcJVGhlIEFSRUcgdG8gc2V0IHRoZSBhZGRyZXNzIGluICgwIC0gMykuCi0JICoJCW1hYwlBIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgY2hhcnMuICBFYWNoCi0JICoJCQllbGVtZW50IHN0b3JlcyBvbmUgYnl0ZSBvZiB0aGUgYWRkcmVzcy4KLQkgKgkJCUlFLCBpdCBpc24ndCBpbiBhc2NpaS4KLQkgKgotCSAqCVRoaXMgZnVuY3Rpb24gdHJhbnNmZXJzIGEgTUFDIGFkZHJlc3MgdG8gb25lIG9mIHRoZQotCSAqCVRMQU4gQVJFR3MgKGFkZHJlc3MgcmVnaXN0ZXJzKS4gIFRoZSBUTEFOIGNoaXAgbG9ja3MKLQkgKgl0aGUgcmVnaXN0ZXIgb24gd3JpdGluZyB0byBvZmZzZXQgMCBhbmQgdW5sb2NrcyB0aGUKLQkgKglyZWdpc3RlciBhZnRlciB3cml0aW5nIHRvIG9mZnNldCA1LiAgSWYgTlVMTCBpcyBwYXNzZWQKLQkgKglpbiBtYWMsIHRoZW4gdGhlIEFSRUcgaXMgZmlsbGVkIHdpdGggMCdzLgotCSAqCi0JICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworfQkJCQkvKiBUTGFuX1BoeUZpbmlzaEF1dG9OZWcgKi8KKworI2lmZGVmIE1PTklUT1IKKworCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgKgorICAgICAgICAqICAgICAgVExhbl9waHlNb25pdG9yCisgICAgICAgICoKKyAgICAgICAgKiAgICAgIFJldHVybnM6CisgICAgICAgICogICAgICAgICAgICAgIE5vbmUKKyAgICAgICAgKgorICAgICAgICAqICAgICAgUGFyYW1zOgorICAgICAgICAqICAgICAgICAgICAgICBkZXYgICAgICAgICAgICAgVGhlIGRldmljZSBzdHJ1Y3R1cmUgb2YgdGhpcyBkZXZpY2UuCisgICAgICAgICoKKyAgICAgICAgKgorICAgICAgICAqICAgICAgVGhpcyBmdW5jdGlvbiBtb25pdG9ycyBQSFkgY29uZGl0aW9uIGJ5IHJlYWRpbmcgdGhlIHN0YXR1cworICAgICAgICAqICAgICAgcmVnaXN0ZXIgdmlhIHRoZSBNSUkgYnVzLiBUaGlzIGNhbiBiZSB1c2VkIHRvIGdpdmUgaW5mbworICAgICAgICAqICAgICAgYWJvdXQgbGluayBjaGFuZ2VzICh1cC9kb3duKSwgYW5kIHBvc3NpYmxlIHN3aXRjaCB0byBhbHRlcm5hdGUKKyAgICAgICAgKiAgICAgIG1lZGlhLgorICAgICAgICAqCisgICAgICAgICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi12b2lkIFRMYW5fU2V0TWFjKCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgYXJlZywgY2hhciAqbWFjICkKK3ZvaWQgVExhbl9QaHlNb25pdG9yKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7Ci0JaW50IGk7Ci0JCQkKLQlhcmVnICo9IDY7CisJVExhblByaXZhdGVJbmZvICpwcml2ID0gZGV2LT5wcml2OworCXUxNiBwaHk7CisJdTE2IHBoeV9zdGF0dXM7CiAKLQlpZiAoIG1hYyAhPSBOVUxMICkgewotCQlmb3IgKCBpID0gMDsgaSA8IDY7IGkrKyApCi0JCQlUTGFuX0Rpb1dyaXRlOCggZGV2LT5iYXNlX2FkZHIsIFRMQU5fQVJFR18wICsgYXJlZyArIGksIG1hY1tpXSApOwotCX0gZWxzZSB7Ci0JCWZvciAoIGkgPSAwOyBpIDwgNjsgaSsrICkKLQkJCVRMYW5fRGlvV3JpdGU4KCBkZXYtPmJhc2VfYWRkciwgVExBTl9BUkVHXzAgKyBhcmVnICsgaSwgMCApOworCXBoeSA9IHByaXYtPnBoeVtwcml2LT5waHlOdW1dOworCisJLyogR2V0IFBIWSBzdGF0dXMgcmVnaXN0ZXIgKi8KKwlUTGFuX01paVJlYWRSZWcobmljLCBwaHksIE1JSV9HRU5fU1RTLCAmcGh5X3N0YXR1cyk7CisKKwkvKiBDaGVjayBpZiBsaW5rIGhhcyBiZWVuIGxvc3QgKi8KKwlpZiAoIShwaHlfc3RhdHVzICYgTUlJX0dTX0xJTkspKSB7CisJCWlmIChwcml2LT5saW5rKSB7CisJCQlwcml2LT5saW5rID0gMDsKKwkJCXByaW50ZigiVExBTjogJXMgaGFzIGxvc3QgbGlua1xuIiwgcHJpdi0+bmljX25hbWUpOworCQkJcHJpdi0+ZmxhZ3MgJj0gfklGRl9SVU5OSU5HOworCQkJbWRlbGF5KDIwMDApOworCQkJVExhbl9QaHlNb25pdG9yKG5pYyk7CisJCQkvKiBUTGFuX1NldFRpbWVyKCBkZXYsICgyKkhaKSwgVExBTl9USU1FUl9MSU5LX0JFQVQgKTsgKi8KKwkJCXJldHVybjsKKwkJfQogCX0KIAotfSAvKiBUTGFuX1NldE1hYyAqLworCS8qIExpbmsgcmVzdGFibGlzaGVkPyAqLworCWlmICgocGh5X3N0YXR1cyAmIE1JSV9HU19MSU5LKSAmJiAhcHJpdi0+bGluaykgeworCQlwcml2LT5saW5rID0gMTsKKwkJcHJpbnRmKCJUTEFOOiAlcyBoYXMgcmVlc3RhYmxpc2hlZCBsaW5rXG4iLAorCQkgICAgICAgcHJpdi0+bmljX25hbWUpOworCQlwcml2LT5mbGFncyB8PSBJRkZfUlVOTklORzsKKwl9CisKKwkvKiBTZXR1cCBhIG5ldyBtb25pdG9yICovCisJLyogVExhbl9TZXRUaW1lciggZGV2LCAoMipIWiksIFRMQU5fVElNRVJfTElOS19CRUFUICk7ICovCisJbWRlbGF5KDIwMDApOworCVRMYW5fUGh5TW9uaXRvcihuaWMpOworfQogCisjZW5kaWYJCQkJLyogTU9OSVRPUiAqLworCisjaWZkZWYgRUI1MQorc3RhdGljIHN0cnVjdCBwY2lfaWQgdGxhbl9uaWNzW10gPSB7CisJUENJX1JPTSgweDBlMTEsIDB4YWUzNCwgIm5ldGVsMTAiLCAiQ29tcGFxIE5ldGVsbGlnZW50IDEwIFQgUENJIFVUUCIpLAorCVBDSV9ST00oMHgwZTExLCAweGFlMzIsICJuZXRlbDEwMCIsIkNvbXBhcSBOZXRlbGxpZ2VudCAxMC8xMDAgVFggUENJIFVUUCIpLAorCVBDSV9ST00oMHgwZTExLCAweGFlMzUsICJuZXRmbGV4M2kiLCAiQ29tcGFxIEludGVncmF0ZWQgTmV0RmxleC0zL1AiKSwKKwlQQ0lfUk9NKDB4MGUxMSwgMHhmMTMwLCAidGh1bmRlciIsICJDb21wYXEgTmV0RmxleC0zL1AiKSwKKwlQQ0lfUk9NKDB4MGUxMSwgMHhmMTUwLCAibmV0ZmxleDNiIiwgIkNvbXBhcSBOZXRGbGV4LTMvUCIpLAorCVBDSV9ST00oMHgwZTExLCAweGFlNDMsICJuZXRlbDEwMHBpIiwgIkNvbXBhcSBOZXRlbGxpZ2VudCBJbnRlZ3JhdGVkIDEwLzEwMCBUWCBVVFAiKSwKKwlQQ0lfUk9NKDB4MGUxMSwgMHhhZTQwLCAibmV0ZWwxMDBkIiwgIkNvbXBhcSBOZXRlbGxpZ2VudCBEdWFsIDEwLzEwMCBUWCBQQ0kgVVRQIiksCisJUENJX1JPTSgweDBlMTEsIDB4YjAxMSwgIm5ldGVsMTAwaSIsICJDb21wYXEgTmV0ZWxsaWdlbnQgMTAvMTAwIFRYIEVtYmVkZGVkIFVUUCIpLAorCVBDSV9ST00oMHgxMDhkLCAweDAwMTMsICJvYzIxODMiLCAiT2xpY29tIE9DLTIxODMvMjE4NSIpLAorCVBDSV9ST00oMHgxMDhkLCAweDAwMTIsICJvYzIzMjUiLCAiT2xpY29tIE9DLTIzMjUiKSwKKwlQQ0lfUk9NKDB4MTA4ZCwgMHgwMDE0LCAib2MyMzI2IiwgIk9saWNvbSBPQy0yMzI2IiksCisJUENJX1JPTSgweDBlMTEsIDB4YjAzMCwgIm5ldGVsbGlnZW50XzEwXzEwMF93c181MTAwIiwgIkNvbXBhcSBOZXRlbGxpZ2VudCAxMC8xMDAgVFggVVRQIiksCisJUENJX1JPTSgweDBlMTEsIDB4YjAxMiwgIm5ldGVsbGlnZW50XzEwX3QyIiwgIkNvbXBhcSBOZXRlbGxpZ2VudCAxMCBULzIgUENJIFVUUC9Db2F4IiksCit9OworCitzdHJ1Y3QgcGNpX2RyaXZlciB0bGFuX2RyaXZlciA9IHsKKwkudHlwZSA9IE5JQ19EUklWRVIsCisJLm5hbWUgPSAiVExBTi9QQ0kiLAorCS5wcm9iZSA9IHRsYW5fcHJvYmUsCisJLmlkcyA9IHRsYW5fbmljcywKKwkuaWRfY291bnQgPSBzaXplb2YodGxhbl9uaWNzKSAvIHNpemVvZih0bGFuX25pY3NbMF0pLAorCS5jbGFzcyA9IDAsCit9OwogI2VuZGlmCmRpZmYgLU5hdXIgZ3J1Yi0wLjk3Lm9yaWcvbmV0Ym9vdC90bGFuLmggZ3J1Yi0wLjk3L25ldGJvb3QvdGxhbi5oCi0tLSBncnViLTAuOTcub3JpZy9uZXRib290L3RsYW4uaAkxOTcwLTAxLTAxIDAwOjAwOjAwLjAwMDAwMDAwMCArMDAwMAorKysgZ3J1Yi0wLjk3L25ldGJvb3QvdGxhbi5oCTIwMDUtMDgtMzEgMTk6MDM6MzUuMDAwMDAwMDAwICswMDAwCkBAIC0wLDAgKzEsNTM2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogICAgdGxhbi5jIC0tIEV0aGVyYm9vdCBkZXZpY2UgZHJpdmVyIGZvciB0aGUgVGV4YXMgSW5zdHJ1bWVudHMgVGh1bmRlckxBTgorKiAgICBXcml0dGVuIDIwMDMtMjAwMyBieSBUaW1vdGh5IExlZ2dlIDx0bGVnZ2VAcm9nZXJzLmNvbT4KKyoKKyogICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyogICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyogICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyogICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyoKKyogICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisqICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisqICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyogICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyoKKyogICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyogICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyogICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisqCisqICAgIFBvcnRpb25zIG9mIHRoaXMgY29kZSAoYWxtb3N0IGFsbCkgYmFzZWQgb246CisqICAgICAgICAgICAgICAgdGxhbi5jOiBMaW51eCBUaHVuZGVyTGFuIERyaXZlcjoKKyoKKyoJCQkJYnkgSmFtZXMgQmFua3MKKyoKKyogIAkJCQkoQykgMTk5Ny0xOTk4IENhbGRlcmEsIEluYy4KKyoJCQkgIAkoQykgMTk5OCBKYW1lcyBCYW5rcworKgkJCQkoQykgMTk5OS0yMDAxIFRvcmJlbiBNYXRoaWFzZW4KKyoJCQkJKEMpIDIwMDIgU2FtdWVsIENoZXNzbWFuCisqCisqICAgIFJFVklTSU9OIEhJU1RPUlk6CisqICAgID09PT09PT09PT09PT09PT0KKyogICAgdjEuMAkwNy0wOC0yMDAzCXRpbWxlZ2dlCUluaXRpYWwgbm90IHF1aXRlIHdvcmtpbmcgdmVyc2lvbgorKgorKiBJbmRlbnQgU3R5bGU6IGluZGVudCAta3IgLWk4CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisqLworCit0eXBlZGVmIHVuc2lnbmVkIGNoYXIgdTg7Cit0eXBlZGVmIHNpZ25lZCBjaGFyIHM4OwordHlwZWRlZiB1bnNpZ25lZCBzaG9ydCB1MTY7Cit0eXBlZGVmIHNpZ25lZCBzaG9ydCBzMTY7Cit0eXBlZGVmIHVuc2lnbmVkIGludCB1MzI7Cit0eXBlZGVmIHNpZ25lZCBpbnQgczMyOworCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCSAqIFRMYW4gRGVmaW5pdGlvbnMKKwkgKgorCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIEZBTFNFCQkJMAorI2RlZmluZSBUUlVFCQkJMQorCisjZGVmaW5lIFRMQU5fTUlOX0ZSQU1FX1NJWkUJNjQKKyNkZWZpbmUgVExBTl9NQVhfRlJBTUVfU0laRQkxNjAwCisKKyNkZWZpbmUgVExBTl9OVU1fUlhfTElTVFMJNAorI2RlZmluZSBUTEFOX05VTV9UWF9MSVNUUwkyCisKKyNkZWZpbmUgVExBTl9JR05PUkUJCTAKKyNkZWZpbmUgVExBTl9SRUNPUkQJCTEKKy8qCisjZGVmaW5lIFRMQU5fREJHKGx2bCwgZm9ybWF0LCBhcmdzLi4uKQlpZiAoZGVidWcmbHZsKSBwcmludGYoIlRMQU46ICIgZm9ybWF0LCAjI2FyZ3MgKTsKKyovCisjZGVmaW5lIFRMQU5fREVCVUdfR05STAkJMHgwMDAxCisjZGVmaW5lIFRMQU5fREVCVUdfVFgJCTB4MDAwMgorI2RlZmluZSBUTEFOX0RFQlVHX1JYCQkweDAwMDQKKyNkZWZpbmUgVExBTl9ERUJVR19MSVNUCQkweDAwMDgKKyNkZWZpbmUgVExBTl9ERUJVR19QUk9CRQkweDAwMTAKKworI2RlZmluZSBUWF9USU1FT1VUCQkoMTAqSFopCS8qIFdlIG5lZWQgdGltZSBmb3IgYXV0by1uZWcgKi8KKyNkZWZpbmUgTUFYX1RMQU5fQk9BUkRTCQk4CS8qIE1heCBudW1iZXIgb2YgYm9hcmRzIGluc3RhbGxlZCBhdCBhIHRpbWUgKi8KKworCisJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJICogRGV2aWNlIElkZW50aWZpY2F0aW9uIERlZmluaXRpb25zCisJICoKKwkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBQQ0lfREVWSUNFX0lEX05FVEVMTElHRU5UXzEwX1QyCQkJMHhCMDEyCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTkVURUxMSUdFTlRfMTBfMTAwX1dTXzUxMDAJMHhCMDMwCisjaWZuZGVmIFBDSV9ERVZJQ0VfSURfT0xJQ09NX09DMjE4MworI2RlZmluZSBQQ0lfREVWSUNFX0lEX09MSUNPTV9PQzIxODMJCQkweDAwMTMKKyNlbmRpZgorI2lmbmRlZiBQQ0lfREVWSUNFX0lEX09MSUNPTV9PQzIzMjUKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9PTElDT01fT0MyMzI1CQkJMHgwMDEyCisjZW5kaWYKKyNpZm5kZWYgUENJX0RFVklDRV9JRF9PTElDT01fT0MyMzI2CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfT0xJQ09NX09DMjMyNgkJCTB4MDAxNAorI2VuZGlmCisKK3R5cGVkZWYgc3RydWN0IHRsYW5fYWRhcHRlcl9lbnRyeSB7CisJdTE2IHZlbmRvcklkOworCXUxNiBkZXZpY2VJZDsKKwljaGFyICpkZXZpY2VMYWJlbDsKKwl1MzIgZmxhZ3M7CisJdTE2IGFkZHJPZnM7Cit9IFRMYW5BZGFwdGVyRW50cnk7CisKKyNkZWZpbmUgVExBTl9BREFQVEVSX05PTkUJCTB4MDAwMDAwMDAKKyNkZWZpbmUgVExBTl9BREFQVEVSX1VOTUFOQUdFRF9QSFkJMHgwMDAwMDAwMQorI2RlZmluZSBUTEFOX0FEQVBURVJfQklUX1JBVEVfUEhZCTB4MDAwMDAwMDIKKyNkZWZpbmUgVExBTl9BREFQVEVSX1VTRV9JTlRFUk5fMTAJMHgwMDAwMDAwNAorI2RlZmluZSBUTEFOX0FEQVBURVJfQUNUSVZJVFlfTEVECTB4MDAwMDAwMDgKKworI2RlZmluZSBUTEFOX1NQRUVEX0RFRkFVTFQJMAorI2RlZmluZSBUTEFOX1NQRUVEXzEwCQkxMAorI2RlZmluZSBUTEFOX1NQRUVEXzEwMAkJMTAwCisKKyNkZWZpbmUgVExBTl9EVVBMRVhfREVGQVVMVAkwCisjZGVmaW5lIFRMQU5fRFVQTEVYX0hBTEYJMQorI2RlZmluZSBUTEFOX0RVUExFWF9GVUxMCTIKKworCisKKwkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkgKiBFSVNBIERlZmluaXRpb25zCisJICoKKwkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBFSVNBX0lEICAgICAgMHhjODAJLyogRUlTQSBJRCBSZWdpc3RlcnMgKi8KKyNkZWZpbmUgRUlTQV9JRDAgICAgIDB4YzgwCS8qIEVJU0EgSUQgUmVnaXN0ZXIgMCAqLworI2RlZmluZSBFSVNBX0lEMSAgICAgMHhjODEJLyogRUlTQSBJRCBSZWdpc3RlciAxICovCisjZGVmaW5lIEVJU0FfSUQyICAgICAweGM4MgkvKiBFSVNBIElEIFJlZ2lzdGVyIDIgKi8KKyNkZWZpbmUgRUlTQV9JRDMgICAgIDB4YzgzCS8qIEVJU0EgSUQgUmVnaXN0ZXIgMyAqLworI2RlZmluZSBFSVNBX0NSICAgICAgMHhjODQJLyogRUlTQSBDb250cm9sIFJlZ2lzdGVyICovCisjZGVmaW5lIEVJU0FfUkVHMCAgICAweGM4OAkvKiBFSVNBIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgMCAqLworI2RlZmluZSBFSVNBX1JFRzEgICAgMHhjODkJLyogRUlTQSBDb25maWd1cmF0aW9uIFJlZ2lzdGVyIDEgKi8KKyNkZWZpbmUgRUlTQV9SRUcyICAgIDB4YzhhCS8qIEVJU0EgQ29uZmlndXJhdGlvbiBSZWdpc3RlciAyICovCisjZGVmaW5lIEVJU0FfUkVHMyAgICAweGM4ZgkvKiBFSVNBIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgMyAqLworI2RlZmluZSBFSVNBX0FQUk9NICAgMHhjOTAJLyogRXRoZXJuZXQgQWRkcmVzcyBQUk9NICovCisKKworCisJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJICogUngvVHggTGlzdCBEZWZpbml0aW9ucworCSAqCisJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgVExBTl9CVUZGRVJTX1BFUl9MSVNUCTEwCisjZGVmaW5lIFRMQU5fTEFTVF9CVUZGRVIJMHg4MDAwMDAwMAorI2RlZmluZSBUTEFOX0NTVEFUX1VOVVNFRAkweDgwMDAKKyNkZWZpbmUgVExBTl9DU1RBVF9GUk1fQ01QCTB4NDAwMAorI2RlZmluZSBUTEFOX0NTVEFUX1JFQURZCTB4MzAwMAorI2RlZmluZSBUTEFOX0NTVEFUX0VPQwkJMHgwODAwCisjZGVmaW5lIFRMQU5fQ1NUQVRfUlhfRVJST1IJMHgwNDAwCisjZGVmaW5lIFRMQU5fQ1NUQVRfUEFTU19DUkMJMHgwMjAwCisjZGVmaW5lIFRMQU5fQ1NUQVRfRFBfUFIJMHgwMTAwCisKKworCisKKworCisJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJICogUEhZIGRlZmluaXRpb25zCisJICoKKwkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBUTEFOX1BIWV9NQVhfQUREUgkweDFGCisjZGVmaW5lIFRMQU5fUEhZX05PTkUJCTB4MjAKKworCisKKwkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkgKiBUTGFuIERyaXZlciBUaW1lciBEZWZpbml0aW9ucworCSAqCisJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgVExBTl9USU1FUl9MSU5LX0JFQVQJCTEKKyNkZWZpbmUgVExBTl9USU1FUl9BQ1RJVklUWQkJMgorI2RlZmluZSBUTEFOX1RJTUVSX1BIWV9QRE9XTgkJMworI2RlZmluZSBUTEFOX1RJTUVSX1BIWV9QVVAJCTQKKyNkZWZpbmUgVExBTl9USU1FUl9QSFlfUkVTRVQJCTUKKyNkZWZpbmUgVExBTl9USU1FUl9QSFlfU1RBUlRfTElOSwk2CisjZGVmaW5lIFRMQU5fVElNRVJfUEhZX0ZJTklTSF9BTgk3CisjZGVmaW5lIFRMQU5fVElNRVJfRklOSVNIX1JFU0VUCQk4CisKKyNkZWZpbmUgVExBTl9USU1FUl9BQ1RfREVMQVkJCShIWi8xMCkKKworCisKKworCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCSAqIFRMYW4gRHJpdmVyIEVlcHJvbSBEZWZpbml0aW9ucworCSAqCisJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgVExBTl9FRVBST01fQUNLCQkwCisjZGVmaW5lIFRMQU5fRUVQUk9NX1NUT1AJMQorCisKKworCisJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJICogSG9zdCBSZWdpc3RlciBPZmZzZXRzIGFuZCBDb250ZW50cworCSAqCisJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgVExBTl9IT1NUX0NNRAkJCTB4MDAKKyNkZWZpbmUgCVRMQU5fSENfR08JCTB4ODAwMDAwMDAKKyNkZWZpbmUJCVRMQU5fSENfU1RPUAkJMHg0MDAwMDAwMAorI2RlZmluZQkJVExBTl9IQ19BQ0sJCTB4MjAwMDAwMDAKKyNkZWZpbmUJCVRMQU5fSENfQ1NfTUFTSwkJMHgxRkUwMDAwMAorI2RlZmluZQkJVExBTl9IQ19FT0MJCTB4MDAxMDAwMDAKKyNkZWZpbmUJCVRMQU5fSENfUlQJCTB4MDAwODAwMDAKKyNkZWZpbmUJCVRMQU5fSENfTkVTCQkweDAwMDQwMDAwCisjZGVmaW5lCQlUTEFOX0hDX0FEX1JTVAkJMHgwMDAwODAwMAorI2RlZmluZQkJVExBTl9IQ19MRF9UTVIJCTB4MDAwMDQwMDAKKyNkZWZpbmUJCVRMQU5fSENfTERfVEhSCQkweDAwMDAyMDAwCisjZGVmaW5lCQlUTEFOX0hDX1JFUV9JTlQJCTB4MDAwMDEwMDAKKyNkZWZpbmUJCVRMQU5fSENfSU5UX09GRgkJMHgwMDAwMDgwMAorI2RlZmluZQkJVExBTl9IQ19JTlRfT04JCTB4MDAwMDA0MDAKKyNkZWZpbmUJCVRMQU5fSENfQUNfTUFTSwkJMHgwMDAwMDBGRgorI2RlZmluZSBUTEFOX0NIX1BBUk0JCQkweDA0CisjZGVmaW5lIFRMQU5fRElPX0FEUgkJCTB4MDgKKyNkZWZpbmUJCVRMQU5fREFfQURSX0lOQwkJMHg4MDAwCisjZGVmaW5lCQlUTEFOX0RBX1JBTV9BRFIJCTB4NDAwMAorI2RlZmluZSBUTEFOX0hPU1RfSU5UCQkJMHgwQQorI2RlZmluZQkJVExBTl9ISV9JVl9NQVNLCQkweDFGRTAKKyNkZWZpbmUJCVRMQU5fSElfSVRfTUFTSwkJMHgwMDFDCisjZGVmaW5lIFRMQU5fRElPX0RBVEEJCQkweDBDCisKKworLyogVGh1bmRlckxBTiBJbnRlcm5hbCBSZWdpc3RlciBESU8gT2Zmc2V0cyAqLworCisjZGVmaW5lIFRMQU5fTkVUX0NNRAkJCTB4MDAKKyNkZWZpbmUJCVRMQU5fTkVUX0NNRF9OUkVTRVQJMHg4MAorI2RlZmluZQkJVExBTl9ORVRfQ01EX05XUkFQCTB4NDAKKyNkZWZpbmUJCVRMQU5fTkVUX0NNRF9DU0YJMHgyMAorI2RlZmluZQkJVExBTl9ORVRfQ01EX0NBRgkweDEwCisjZGVmaW5lCQlUTEFOX05FVF9DTURfTk9CUlgJMHgwOAorI2RlZmluZQkJVExBTl9ORVRfQ01EX0RVUExFWAkweDA0CisjZGVmaW5lCQlUTEFOX05FVF9DTURfVFJGUkFNCTB4MDIKKyNkZWZpbmUJCVRMQU5fTkVUX0NNRF9UWFBBQ0UJMHgwMQorI2RlZmluZSBUTEFOX05FVF9TSU8JCQkweDAxCisjZGVmaW5lIAlUTEFOX05FVF9TSU9fTUlOVEVOCTB4ODAKKyNkZWZpbmUJCVRMQU5fTkVUX1NJT19FQ0xPSwkweDQwCisjZGVmaW5lCQlUTEFOX05FVF9TSU9fRVRYRU4JMHgyMAorI2RlZmluZQkJVExBTl9ORVRfU0lPX0VEQVRBCTB4MTAKKyNkZWZpbmUJCVRMQU5fTkVUX1NJT19OTVJTVAkweDA4CisjZGVmaW5lCQlUTEFOX05FVF9TSU9fTUNMSwkweDA0CisjZGVmaW5lCQlUTEFOX05FVF9TSU9fTVRYRU4JMHgwMgorI2RlZmluZQkJVExBTl9ORVRfU0lPX01EQVRBCTB4MDEKKyNkZWZpbmUgVExBTl9ORVRfU1RTCQkJMHgwMgorI2RlZmluZQkJVExBTl9ORVRfU1RTX01JUlEJMHg4MAorI2RlZmluZQkJVExBTl9ORVRfU1RTX0hCRUFUCTB4NDAKKyNkZWZpbmUJCVRMQU5fTkVUX1NUU19UWFNUT1AJMHgyMAorI2RlZmluZQkJVExBTl9ORVRfU1RTX1JYU1RPUAkweDEwCisjZGVmaW5lCQlUTEFOX05FVF9TVFNfUlNSVkQJMHgwRgorI2RlZmluZSBUTEFOX05FVF9NQVNLCQkJMHgwMworI2RlZmluZQkJVExBTl9ORVRfTUFTS19NQVNLNwkweDgwCisjZGVmaW5lCQlUTEFOX05FVF9NQVNLX01BU0s2CTB4NDAKKyNkZWZpbmUJCVRMQU5fTkVUX01BU0tfTUFTSzUJMHgyMAorI2RlZmluZQkJVExBTl9ORVRfTUFTS19NQVNLNAkweDEwCisjZGVmaW5lCQlUTEFOX05FVF9NQVNLX1JTUlZECTB4MEYKKyNkZWZpbmUgVExBTl9ORVRfQ09ORklHCQkJMHgwNAorI2RlZmluZSAJVExBTl9ORVRfQ0ZHX1JDTEsJMHg4MDAwCisjZGVmaW5lCQlUTEFOX05FVF9DRkdfVENMSwkweDQwMDAKKyNkZWZpbmUJCVRMQU5fTkVUX0NGR19CSVQJMHgyMDAwCisjZGVmaW5lCQlUTEFOX05FVF9DRkdfUlhDUkMJMHgxMDAwCisjZGVmaW5lCQlUTEFOX05FVF9DRkdfUEVGCTB4MDgwMAorI2RlZmluZQkJVExBTl9ORVRfQ0ZHXzFGUkFHCTB4MDQwMAorI2RlZmluZQkJVExBTl9ORVRfQ0ZHXzFDSEFOCTB4MDIwMAorI2RlZmluZQkJVExBTl9ORVRfQ0ZHX01URVNUCTB4MDEwMAorI2RlZmluZQkJVExBTl9ORVRfQ0ZHX1BIWV9FTgkweDAwODAKKyNkZWZpbmUJCVRMQU5fTkVUX0NGR19NU01BU0sJMHgwMDdGCisjZGVmaW5lIFRMQU5fTUFOX1RFU1QJCQkweDA2CisjZGVmaW5lIFRMQU5fREVGX1ZFTkRPUl9JRAkJMHgwOAorI2RlZmluZSBUTEFOX0RFRl9ERVZJQ0VfSUQJCTB4MEEKKyNkZWZpbmUgVExBTl9ERUZfUkVWSVNJT04JCTB4MEMKKyNkZWZpbmUgVExBTl9ERUZfU1VCQ0xBU1MJCTB4MEQKKyNkZWZpbmUgVExBTl9ERUZfTUlOX0xBVAkJMHgwRQorI2RlZmluZSBUTEFOX0RFRl9NQVhfTEFUCQkweDBGCisjZGVmaW5lIFRMQU5fQVJFR18wCQkJMHgxMAorI2RlZmluZSBUTEFOX0FSRUdfMQkJCTB4MTYKKyNkZWZpbmUgVExBTl9BUkVHXzIJCQkweDFDCisjZGVmaW5lIFRMQU5fQVJFR18zCQkJMHgyMgorI2RlZmluZSBUTEFOX0hBU0hfMQkJCTB4MjgKKyNkZWZpbmUgVExBTl9IQVNIXzIJCQkweDJDCisjZGVmaW5lIFRMQU5fR09PRF9UWF9GUk1TCQkweDMwCisjZGVmaW5lIFRMQU5fVFhfVU5ERVJVTlMJCTB4MzMKKyNkZWZpbmUgVExBTl9HT09EX1JYX0ZSTVMJCTB4MzQKKyNkZWZpbmUgVExBTl9SWF9PVkVSUlVOUwkJMHgzNworI2RlZmluZSBUTEFOX0RFRkVSUkVEX1RYCQkweDM4CisjZGVmaW5lIFRMQU5fQ1JDX0VSUk9SUwkJCTB4M0EKKyNkZWZpbmUgVExBTl9DT0RFX0VSUk9SUwkJMHgzQgorI2RlZmluZSBUTEFOX01VTFRJQ09MX0ZSTVMJCTB4M0MKKyNkZWZpbmUgVExBTl9TSU5HTEVDT0xfRlJNUwkJMHgzRQorI2RlZmluZSBUTEFOX0VYQ0VTU0NPTF9GUk1TCQkweDQwCisjZGVmaW5lIFRMQU5fTEFURV9DT0xTCQkJMHg0MQorI2RlZmluZSBUTEFOX0NBUlJJRVJfTE9TUwkJMHg0MgorI2RlZmluZSBUTEFOX0FDT01NSVQJCQkweDQzCisjZGVmaW5lIFRMQU5fTEVEX1JFRwkJCTB4NDQKKyNkZWZpbmUJCVRMQU5fTEVEX0FDVAkJMHgxMAorI2RlZmluZQkJVExBTl9MRURfTElOSwkJMHgwMQorI2RlZmluZSBUTEFOX0JTSVpFX1JFRwkJCTB4NDUKKyNkZWZpbmUgVExBTl9NQVhfUlgJCQkweDQ2CisjZGVmaW5lIFRMQU5fSU5UX0RJUwkJCTB4NDgKKyNkZWZpbmUJCVRMQU5fSURfVFhfRU9DCQkweDA0CisjZGVmaW5lCQlUTEFOX0lEX1JYX0VPRgkJMHgwMgorI2RlZmluZQkJVExBTl9JRF9SWF9FT0MJCTB4MDEKKworCisKKy8qIFRodW5kZXJMQU4gSW50ZXJydXB0IENvZGVzICovCisKKyNkZWZpbmUgVExBTl9JTlRfTlVNQkVSX09GX0lOVFMJOAorCisjZGVmaW5lIFRMQU5fSU5UX05PTkUJCQkweDAwMDAKKyNkZWZpbmUgVExBTl9JTlRfVFhfRU9GCQkJMHgwMDAxCisjZGVmaW5lIFRMQU5fSU5UX1NUQVRfT1ZFUkZMT1cJCTB4MDAwMgorI2RlZmluZSBUTEFOX0lOVF9SWF9FT0YJCQkweDAwMDMKKyNkZWZpbmUgVExBTl9JTlRfRFVNTVkJCQkweDAwMDQKKyNkZWZpbmUgVExBTl9JTlRfVFhfRU9DCQkJMHgwMDA1CisjZGVmaW5lIFRMQU5fSU5UX1NUQVRVU19DSEVDSwkJMHgwMDA2CisjZGVmaW5lIFRMQU5fSU5UX1JYX0VPQwkJCTB4MDAwNworCisKKworLyogVGh1bmRlckxBTiBNSUkgUmVnaXN0ZXJzICovCisKKy8qIEdlbmVyaWMgTUlJL1BIWSBSZWdpc3RlcnMgKi8KKworI2RlZmluZSBNSUlfR0VOX0NUTAkJCTB4MDAKKyNkZWZpbmUgCU1JSV9HQ19SRVNFVAkJMHg4MDAwCisjZGVmaW5lCQlNSUlfR0NfTE9PUEJLCQkweDQwMDAKKyNkZWZpbmUJCU1JSV9HQ19TUEVFRFNFTAkJMHgyMDAwCisjZGVmaW5lCQlNSUlfR0NfQVVUT0VOQgkJMHgxMDAwCisjZGVmaW5lCQlNSUlfR0NfUERPV04JCTB4MDgwMAorI2RlZmluZQkJTUlJX0dDX0lTT0xBVEUJCTB4MDQwMAorI2RlZmluZQkJTUlJX0dDX0FVVE9SU1JUCQkweDAyMDAKKyNkZWZpbmUJCU1JSV9HQ19EVVBMRVgJCTB4MDEwMAorI2RlZmluZQkJTUlJX0dDX0NPTFRFU1QJCTB4MDA4MAorI2RlZmluZQkJTUlJX0dDX1JFU0VSVkVECQkweDAwN0YKKyNkZWZpbmUgTUlJX0dFTl9TVFMJCQkweDAxCisjZGVmaW5lCQlNSUlfR1NfMTAwQlQ0CQkweDgwMDAKKyNkZWZpbmUJCU1JSV9HU18xMDBCVFhGRAkJMHg0MDAwCisjZGVmaW5lCQlNSUlfR1NfMTAwQlRYSEQJCTB4MjAwMAorI2RlZmluZQkJTUlJX0dTXzEwQlRGRAkJMHgxMDAwCisjZGVmaW5lCQlNSUlfR1NfMTBCVEhECQkweDA4MDAKKyNkZWZpbmUJCU1JSV9HU19SRVNFUlZFRAkJMHgwN0MwCisjZGVmaW5lCQlNSUlfR1NfQVVUT0NNUExUCTB4MDAyMAorI2RlZmluZQkJTUlJX0dTX1JGTFQJCTB4MDAxMAorI2RlZmluZQkJTUlJX0dTX0FVVE9ORUcJCTB4MDAwOAorI2RlZmluZQkJTUlJX0dTX0xJTksJCTB4MDAwNAorI2RlZmluZQkJTUlJX0dTX0pBQkJFUgkJMHgwMDAyCisjZGVmaW5lCQlNSUlfR1NfRVhUQ0FQCQkweDAwMDEKKyNkZWZpbmUgTUlJX0dFTl9JRF9ISQkJCTB4MDIKKyNkZWZpbmUgTUlJX0dFTl9JRF9MTwkJCTB4MDMKKyNkZWZpbmUgCU1JSV9HSUxfT1VJCQkweEZDMDAKKyNkZWZpbmUgCU1JSV9HSUxfTU9ERUwJCTB4MDNGMAorI2RlZmluZSAJTUlJX0dJTF9SRVZJU0lPTgkweDAwMEYKKyNkZWZpbmUgTUlJX0FOX0FEVgkJCTB4MDQKKyNkZWZpbmUgTUlJX0FOX0xQQQkJCTB4MDUKKyNkZWZpbmUgTUlJX0FOX0VYUAkJCTB4MDYKKworLyogVGh1bmRlckxBTiBTcGVjaWZpYyBNSUkvUEhZIFJlZ2lzdGVycyAqLworCisjZGVmaW5lIFRMQU5fVExQSFlfSUQJCQkweDEwCisjZGVmaW5lIFRMQU5fVExQSFlfQ1RMCQkJMHgxMQorI2RlZmluZSAJVExBTl9UQ19JR0xJTksJCTB4ODAwMAorI2RlZmluZQkJVExBTl9UQ19TV0FQT0wJCTB4NDAwMAorI2RlZmluZQkJVExBTl9UQ19BVUlTRUwJCTB4MjAwMAorI2RlZmluZQkJVExBTl9UQ19TUUVFTgkJMHgxMDAwCisjZGVmaW5lCQlUTEFOX1RDX01URVNUCQkweDA4MDAKKyNkZWZpbmUJCVRMQU5fVENfUkVTRVJWRUQJMHgwN0Y4CisjZGVmaW5lCQlUTEFOX1RDX05GRVcJCTB4MDAwNAorI2RlZmluZQkJVExBTl9UQ19JTlRFTgkJMHgwMDAyCisjZGVmaW5lCQlUTEFOX1RDX1RJTlQJCTB4MDAwMQorI2RlZmluZSBUTEFOX1RMUEhZX1NUUwkJCTB4MTIKKyNkZWZpbmUJCVRMQU5fVFNfTUlOVAkJMHg4MDAwCisjZGVmaW5lCQlUTEFOX1RTX1BIT0sJCTB4NDAwMAorI2RlZmluZQkJVExBTl9UU19QT0xPSwkJMHgyMDAwCisjZGVmaW5lCQlUTEFOX1RTX1RQRU5FUkdZCTB4MTAwMAorI2RlZmluZQkJVExBTl9UU19SRVNFUlZFRAkweDBGRkYKKyNkZWZpbmUgVExBTl9UTFBIWV9QQVIJCQkweDE5CisjZGVmaW5lCQlUTEFOX1BIWV9DSU1fU1RBVAkweDAwMjAKKyNkZWZpbmUJCVRMQU5fUEhZX1NQRUVEXzEwMAkweDAwNDAKKyNkZWZpbmUJCVRMQU5fUEhZX0RVUExFWF9GVUxMCTB4MDA4MAorI2RlZmluZQkJVExBTl9QSFlfQU5fRU5fU1RBVCAgICAgMHgwNDAwCisKKy8qIE5hdGlvbmFsIFNlbS4gJiBMZXZlbDEgUEhZIGlkJ3MgKi8KKyNkZWZpbmUgTkFUX1NFTV9JRDEJCQkweDIwMDAKKyNkZWZpbmUgTkFUX1NFTV9JRDIJCQkweDVDMDEKKyNkZWZpbmUgTEVWRUwxX0lEMQkJCTB4NzgxMAorI2RlZmluZSBMRVZFTDFfSUQyCQkJMHgwMDAwCisKKyNkZWZpbmUgQ0lSQ19JTkMoIGEsIGIgKSBpZiAoICsrYSA+PSBiICkgYSA9IDAKKworLyogUm91dGluZXMgdG8gYWNjZXNzIGludGVybmFsIHJlZ2lzdGVycy4gKi8KKworaW5saW5lIHU4IFRMYW5fRGlvUmVhZDgodTE2IGJhc2VfYWRkciwgdTE2IGludGVybmFsX2FkZHIpCit7CisJb3V0dyhpbnRlcm5hbF9hZGRyLCBiYXNlX2FkZHIgKyBUTEFOX0RJT19BRFIpOworCXJldHVybiAoaW5iKChiYXNlX2FkZHIgKyBUTEFOX0RJT19EQVRBKSArIChpbnRlcm5hbF9hZGRyICYgMHgzKSkpOworCit9CQkJCS8qIFRMYW5fRGlvUmVhZDggKi8KKworCisKKworaW5saW5lIHUxNiBUTGFuX0Rpb1JlYWQxNih1MTYgYmFzZV9hZGRyLCB1MTYgaW50ZXJuYWxfYWRkcikKK3sKKwlvdXR3KGludGVybmFsX2FkZHIsIGJhc2VfYWRkciArIFRMQU5fRElPX0FEUik7CisJcmV0dXJuIChpbncoKGJhc2VfYWRkciArIFRMQU5fRElPX0RBVEEpICsgKGludGVybmFsX2FkZHIgJiAweDIpKSk7CisKK30JCQkJLyogVExhbl9EaW9SZWFkMTYgKi8KKworCisKKworaW5saW5lIHUzMiBUTGFuX0Rpb1JlYWQzMih1MTYgYmFzZV9hZGRyLCB1MTYgaW50ZXJuYWxfYWRkcikKK3sKKwlvdXR3KGludGVybmFsX2FkZHIsIGJhc2VfYWRkciArIFRMQU5fRElPX0FEUik7CisJcmV0dXJuIChpbmwoYmFzZV9hZGRyICsgVExBTl9ESU9fREFUQSkpOworCit9CQkJCS8qIFRMYW5fRGlvUmVhZDMyICovCisKKworCisKK2lubGluZSB2b2lkIFRMYW5fRGlvV3JpdGU4KHUxNiBiYXNlX2FkZHIsIHUxNiBpbnRlcm5hbF9hZGRyLCB1OCBkYXRhKQoreworCW91dHcoaW50ZXJuYWxfYWRkciwgYmFzZV9hZGRyICsgVExBTl9ESU9fQURSKTsKKwlvdXRiKGRhdGEsIGJhc2VfYWRkciArIFRMQU5fRElPX0RBVEEgKyAoaW50ZXJuYWxfYWRkciAmIDB4MykpOworCit9CisKKworCisKK2lubGluZSB2b2lkIFRMYW5fRGlvV3JpdGUxNih1MTYgYmFzZV9hZGRyLCB1MTYgaW50ZXJuYWxfYWRkciwgdTE2IGRhdGEpCit7CisJb3V0dyhpbnRlcm5hbF9hZGRyLCBiYXNlX2FkZHIgKyBUTEFOX0RJT19BRFIpOworCW91dHcoZGF0YSwgYmFzZV9hZGRyICsgVExBTl9ESU9fREFUQSArIChpbnRlcm5hbF9hZGRyICYgMHgyKSk7CisKK30KKworCisKKworaW5saW5lIHZvaWQgVExhbl9EaW9Xcml0ZTMyKHUxNiBiYXNlX2FkZHIsIHUxNiBpbnRlcm5hbF9hZGRyLCB1MzIgZGF0YSkKK3sKKwlvdXR3KGludGVybmFsX2FkZHIsIGJhc2VfYWRkciArIFRMQU5fRElPX0FEUik7CisJb3V0bChkYXRhLCBiYXNlX2FkZHIgKyBUTEFOX0RJT19EQVRBICsgKGludGVybmFsX2FkZHIgJiAweDIpKTsKKworfQorCisKKworI2lmIDAKK2lubGluZSB2b2lkIFRMYW5fQ2xlYXJCaXQodTggYml0LCB1MTYgcG9ydCkKK3sKKwlvdXRiX3AoaW5iX3AocG9ydCkgJiB+Yml0LCBwb3J0KTsKK30KKworCisKKworaW5saW5lIGludCBUTGFuX0dldEJpdCh1OCBiaXQsIHUxNiBwb3J0KQoreworCXJldHVybiAoKGludCkgKGluYl9wKHBvcnQpICYgYml0KSk7Cit9CisKKworCisKK2lubGluZSB2b2lkIFRMYW5fU2V0Qml0KHU4IGJpdCwgdTE2IHBvcnQpCit7CisJb3V0Yl9wKGluYl9wKHBvcnQpIHwgYml0LCBwb3J0KTsKK30KKyNlbmRpZgorCisjZGVmaW5lIFRMYW5fQ2xlYXJCaXQoIGJpdCwgcG9ydCApCW91dGJfcChpbmJfcChwb3J0KSAmIH5iaXQsIHBvcnQpCisjZGVmaW5lIFRMYW5fR2V0Qml0KCBiaXQsIHBvcnQgKQkoKGludCkgKGluYl9wKHBvcnQpICYgYml0KSkKKyNkZWZpbmUgVExhbl9TZXRCaXQoIGJpdCwgcG9ydCApCW91dGJfcChpbmJfcChwb3J0KSB8IGJpdCwgcG9ydCkKKworI2lmZGVmIElfTElLRV9BX0ZBU1RfSEFTSF9GVU5DVElPTgorLyogZ2l2ZW4gNiBieXRlcywgdmlldyB0aGVtIGFzIDggNi1iaXQgbnVtYmVycyBhbmQgcmV0dXJuIHRoZSBYT1Igb2YgdGhvc2UgKi8KKy8qIHRoZSBjb2RlIGJlbG93IGlzIGFib3V0IHNldmVuIHRpbWVzIGFzIGZhc3QgYXMgdGhlIG9yaWdpbmFsIGNvZGUgKi8KK2lubGluZSB1MzIgVExhbl9IYXNoRnVuYyh1OCAqIGEpCit7CisJdTggaGFzaDsKKworCWhhc2ggPSAoYVswXSBeIGFbM10pOwkvKiAmIDA3NyAqLworCWhhc2ggXj0gKChhWzBdIF4gYVszXSkgPj4gNik7CS8qICYgMDAzICovCisJaGFzaCBePSAoKGFbMV0gXiBhWzRdKSA8PCAyKTsJLyogJiAwNzQgKi8KKwloYXNoIF49ICgoYVsxXSBeIGFbNF0pID4+IDQpOwkvKiAmIDAxNyAqLworCWhhc2ggXj0gKChhWzJdIF4gYVs1XSkgPDwgNCk7CS8qICYgMDYwICovCisJaGFzaCBePSAoKGFbMl0gXiBhWzVdKSA+PiAyKTsJLyogJiAwNzcgKi8KKworCXJldHVybiAoaGFzaCAmIDA3Nyk7Cit9CisKKyNlbHNlCQkJCS8qIG9yaWdpbmFsIGNvZGUgKi8KKworaW5saW5lIHUzMiB4b3IodTMyIGEsIHUzMiBiKQoreworCXJldHVybiAoKGEgJiYgIWIpIHx8ICghYSAmJiBiKSk7Cit9CisKKyNkZWZpbmUgWE9SOCggYSwgYiwgYywgZCwgZSwgZiwgZywgaCApCXhvciggYSwgeG9yKCBiLCB4b3IoIGMsIHhvciggZCwgeG9yKCBlLCB4b3IoIGYsIHhvciggZywgaCApICkgKSApICkgKSApCisjZGVmaW5lIERBKCBhLCBiaXQgKQkJCQkJKCAoICh1OCkgYVtiaXQvOF0gKSAmICggKHU4KSAoIDEgPDwgYml0JTggKSApICkKKworaW5saW5lIHUzMiBUTGFuX0hhc2hGdW5jKHU4ICogYSkKK3sKKwl1MzIgaGFzaDsKKworCWhhc2ggPQorCSAgICBYT1I4KERBKGEsIDApLCBEQShhLCA2KSwgREEoYSwgMTIpLCBEQShhLCAxOCksIERBKGEsIDI0KSwKKwkJIERBKGEsIDMwKSwgREEoYSwgMzYpLCBEQShhLCA0MikpOworCWhhc2ggfD0KKwkgICAgWE9SOChEQShhLCAxKSwgREEoYSwgNyksIERBKGEsIDEzKSwgREEoYSwgMTkpLCBEQShhLCAyNSksCisJCSBEQShhLCAzMSksIERBKGEsIDM3KSwgREEoYSwgNDMpKSA8PCAxOworCWhhc2ggfD0KKwkgICAgWE9SOChEQShhLCAyKSwgREEoYSwgOCksIERBKGEsIDE0KSwgREEoYSwgMjApLCBEQShhLCAyNiksCisJCSBEQShhLCAzMiksIERBKGEsIDM4KSwgREEoYSwgNDQpKSA8PCAyOworCWhhc2ggfD0KKwkgICAgWE9SOChEQShhLCAzKSwgREEoYSwgOSksIERBKGEsIDE1KSwgREEoYSwgMjEpLCBEQShhLCAyNyksCisJCSBEQShhLCAzMyksIERBKGEsIDM5KSwgREEoYSwgNDUpKSA8PCAzOworCWhhc2ggfD0KKwkgICAgWE9SOChEQShhLCA0KSwgREEoYSwgMTApLCBEQShhLCAxNiksIERBKGEsIDIyKSwgREEoYSwgMjgpLAorCQkgREEoYSwgMzQpLCBEQShhLCA0MCksIERBKGEsIDQ2KSkgPDwgNDsKKwloYXNoIHw9CisJICAgIFhPUjgoREEoYSwgNSksIERBKGEsIDExKSwgREEoYSwgMTcpLCBEQShhLCAyMyksIERBKGEsIDI5KSwKKwkJIERBKGEsIDM1KSwgREEoYSwgNDEpLCBEQShhLCA0NykpIDw8IDU7CisKKwlyZXR1cm4gaGFzaDsKKworfQorCisjZW5kaWYJCQkJLyogSV9MSUtFX0FfRkFTVF9IQVNIX0ZVTkNUSU9OICovCmRpZmYgLU5hdXIgZ3J1Yi0wLjk3Lm9yaWcvbmV0Ym9vdC90dWxpcC5jIGdydWItMC45Ny9uZXRib290L3R1bGlwLmMKLS0tIGdydWItMC45Ny5vcmlnL25ldGJvb3QvdHVsaXAuYwkyMDAzLTA3LTA5IDExOjQ1OjM4LjAwMDAwMDAwMCArMDAwMAorKysgZ3J1Yi0wLjk3L25ldGJvb3QvdHVsaXAuYwkyMDA1LTA4LTMxIDE5OjAzOjM1LjAwMDAwMDAwMCArMDAwMApAQCAtNDgsNiArNDgsNyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyoKKyAgMDcgU2VwIDIwMDMgIHRpbWxlZ2dlCU11bHRpY2FzdCBTdXBwb3J0IEFkZGVkCiAgIDExIEFwciAyMDAxICBtZGMgICAgIFtwYXRjaCB0byBldGhlcmJvb3QgNC43LjI0XQogICAgICBNYWpvciByZXdyaXRlIHRvIGluY2x1ZGUgTGludXggdHVsaXAgZHJpdmVyIG1lZGlhIGRldGVjdGlvbgogICAgICBjb2RlLiAgVGhpcyBkcml2ZXIgc2hvdWxkIHN1cHBvcnQgYSBsb3QgbW9yZSBjYXJkcyBub3cuCkBAIC05OCw3ICs5OSw2IEBACiAgICAgIGFuZCB0aGluZ3VpbiBtYWlsaW5nIGxpc3RzLgogKi8KIAotDAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qIERlY2xhcmF0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtMTA2LDMxICsxMDYsMjkgQEAKICNpbmNsdWRlICJldGhlcmJvb3QuaCIKICNpbmNsdWRlICJuaWMuaCIKICNpbmNsdWRlICJwY2kuaCIKLSNpbmNsdWRlICJjYXJkcy5oIgogCiAvKiBVc2VyIHNldHRhYmxlIHBhcmFtZXRlcnMgKi8KIAotI3VuZGVmICAgVFVMSVBfREVCVUcKLSN1bmRlZiAgIFRVTElQX0RFQlVHX1dIRVJFCisjdW5kZWYJVFVMSVBfREVCVUcKKyN1bmRlZglUVUxJUF9ERUJVR19XSEVSRQorI2lmZGVmCVRVTElQX0RFQlVHCiBzdGF0aWMgaW50IHR1bGlwX2RlYnVnID0gMjsgICAgICAgICAgICAgLyogMSBub3JtYWwgbWVzc2FnZXMsIDAgcXVpZXQgLi4gNyB2ZXJib3NlLiAqLworI2VuZGlmCiAKICNkZWZpbmUgVFhfVElNRV9PVVQgICAgICAgMipUSUNLU19QRVJfU0VDCiAKLXR5cGVkZWYgdW5zaWduZWQgY2hhciAgdTg7Ci10eXBlZGVmICAgc2lnbmVkIGNoYXIgIHM4OwotdHlwZWRlZiB1bnNpZ25lZCBzaG9ydCB1MTY7Ci10eXBlZGVmICAgc2lnbmVkIHNob3J0IHMxNjsKLXR5cGVkZWYgdW5zaWduZWQgaW50ICAgdTMyOwotdHlwZWRlZiAgIHNpZ25lZCBpbnQgICBzMzI7Cit0eXBlZGVmIHVpbnQ4X3QgICAgdTg7Cit0eXBlZGVmICBpbnQ4X3QgICAgczg7Cit0eXBlZGVmIHVpbnQxNl90ICAgdTE2OwordHlwZWRlZiAgaW50MTZfdCAgIHMxNjsKK3R5cGVkZWYgdWludDMyX3QgICB1MzI7Cit0eXBlZGVmICBpbnQzMl90ICAgczMyOwogCiAvKiBoZWxwZnVsIG1hY3JvcyBpZiBvbiBhIGJpZ19lbmRpYW4gbWFjaGluZSBmb3IgY2hhbmdpbmcgYnl0ZSBvcmRlci4KICAgIG5vdCBzdHJpY3RseSBuZWVkZWQgb24gSW50ZWwgKi8KLSNkZWZpbmUgbGUxNl90b19jcHUodmFsKSAodmFsKQotI2RlZmluZSBjcHVfdG9fbGUzMih2YWwpICh2YWwpCiAjZGVmaW5lIGdldF91bmFsaWduZWQocHRyKSAoKihwdHIpKQogI2RlZmluZSBwdXRfdW5hbGlnbmVkKHZhbCwgcHRyKSAoKHZvaWQpKCAqKHB0cikgPSAodmFsKSApKQogI2RlZmluZSBnZXRfdTE2KHB0cikgKCoodTE2ICopKHB0cikpCi0jZGVmaW5lIHZpcnRfdG9fYnVzKHgpICgodW5zaWduZWQgbG9uZyl4KQogI2RlZmluZSB2aXJ0X3RvX2xlMzJkZXNjKGFkZHIpICB2aXJ0X3RvX2J1cyhhZGRyKQogCiAjZGVmaW5lIFRVTElQX0lPVFlQRSAgUENJX1VTRVNfTUFTVEVSIHwgUENJX1VTRVNfSU8gfCBQQ0lfQUREUjAKQEAgLTIxMiw2ICsyMTAsOCBAQAogICAgICAgVFVMSVBfSU9UWVBFLCAyNTYsIFBOSUMyIH0sCiAgICAgeyAiQURNdGVrIEFOOTgxIENvbWV0IiwgeyAweDA5ODExMzE3LCAweGZmZmZmZmZmLCAwLCAwLCAwLCAwIH0sCiAgICAgICBUVUxJUF9JT1RZUEUsIDI1NiwgQ09NRVQgfSwKKyAgICB7ICJBRE1UZWsgQU45ODMgQ29tZXQiLCB7IDB4MTIxNjExMTMsIDB4ZmZmZmZmZmYsIDAsIDAsIDAsIDAgfSwKKyAgICAgIFRVTElQX0lPVFlQRSwgMjU2LCBDT01FVCB9LAogICAgIHsgIkFETXRlayBDZW50YXVyLVAiLCB7IDB4MDk4NTEzMTcsIDB4ZmZmZmZmZmYsIDAsIDAsIDAsIDAgfSwKICAgICAgIFRVTElQX0lPVFlQRSwgMjU2LCBDT01FVCB9LAogICAgIHsgIkFETXRlayBDZW50YXVyLUMiLCB7IDB4MTk4NTEzMTcsIDB4ZmZmZmZmZmYsIDAsIDAsIDAsIDAgfSwKQEAgLTI4MCw5ICsyODAsMTMgQEAKIHN0YXRpYyB1MTYgdDIxMDQxX2NzcjE0W10gPSB7IDB4RkZGRiwgMHhGN0ZELCAweEY3RkQsIDB4N0YzRiwgMHg3RjNELCB9Owogc3RhdGljIHUxNiB0MjEwNDFfY3NyMTVbXSA9IHsgMHgwMDA4LCAweDAwMDYsIDB4MDAwRSwgMHgwMDA4LCAweDAwMDgsIH07CiAKKy8qIG5vdCB1c2VkCiBzdGF0aWMgdTE2IHQyMTE0Ml9jc3IxM1tdID0geyAweDAwMDEsIDB4MDAwOSwgMHgwMDA5LCAweDAwMDAsIDB4MDAwMSwgfTsKKyovCiBzdGF0aWMgdTE2IHQyMTE0Ml9jc3IxNFtdID0geyAweEZGRkYsIDB4MDcwNSwgMHgwNzA1LCAweDAwMDAsIDB4N0YzRCwgfTsKKy8qIG5vdCB1c2VkCiBzdGF0aWMgdTE2IHQyMTE0Ml9jc3IxNVtdID0geyAweDAwMDgsIDB4MDAwNiwgMHgwMDBFLCAweDAwMDgsIDB4MDAwOCwgfTsKKyovCiAKIC8qIE9mZnNldHMgdG8gdGhlIENvbW1hbmQgYW5kIFN0YXR1cyBSZWdpc3RlcnMsICJDU1JzIi4gIEFsbCBhY2Nlc3NlcwogICAgbXVzdCBiZSBsb25nd29yZCBpbnN0cnVjdGlvbnMgYW5kIHF1YWR3b3JkIGFsaWduZWQuICovCkBAIC0zMDAsNiArMzA0LDE0IEBACiAgICAgVHhGSUZPVW5kZXJmbG93PTB4MjAsIFR4SmFiYmVyPTB4MDgsIFR4Tm9CdWY9MHgwNCwgVHhEaWVkPTB4MDIsIFR4SW50cj0weDAxLAogfTsKIAorLyogVGhlIGNvbmZpZ3VyYXRpb24gYml0cyBpbiBDU1I2LiAqLworZW51bSBjc3I2X21vZGVfYml0cyB7CisJVHhPbj0weDIwMDAsIFJ4T249MHgwMDAyLCBGdWxsRHVwbGV4PTB4MDIwMCwKKwlBY2NlcHRCcm9hZGNhc3Q9MHgwMTAwLCBBY2NlcHRBbGxNdWx0aWNhc3Q9MHgwMDgwLAorCUFjY2VwdEFsbFBoeXM9MHgwMDQwLCBBY2NlcHRSdW50PTB4MDAwOCwKK307CisKKwogZW51bSBkZXNjX3N0YXR1c19iaXRzIHsKICAgICBEZXNjT3duZGVkPTB4ODAwMDAwMDAsIFJ4RGVzY0ZhdGFsRXJyPTB4ODAwMCwgUnhXaG9sZVBrdD0weDAzMDAsCiB9OwpAQCAtMzg0LDIxICszOTYsMTEgQEAKIAogI2RlZmluZSBUWF9SSU5HX1NJWkUJMgogc3RhdGljIHN0cnVjdCB0dWxpcF90eF9kZXNjIHR4X3JpbmdbVFhfUklOR19TSVpFXSBfX2F0dHJpYnV0ZV9fICgoYWxpZ25lZCg0KSkpOwotCi0jaWZkZWYgVVNFX0xPV01FTV9CVUZGRVIKLSNkZWZpbmUgdHhiICgoY2hhciAqKTB4MTAwMDAgLSBCVUZMRU4pCi0jZWxzZQogc3RhdGljIHVuc2lnbmVkIGNoYXIgdHhiW0JVRkxFTl0gX19hdHRyaWJ1dGVfXyAoKGFsaWduZWQoNCkpKTsKLSNlbmRpZgogCiAjZGVmaW5lIFJYX1JJTkdfU0laRQk0CiBzdGF0aWMgc3RydWN0IHR1bGlwX3J4X2Rlc2MgcnhfcmluZ1tSWF9SSU5HX1NJWkVdIF9fYXR0cmlidXRlX18gKChhbGlnbmVkKDQpKSk7Ci0KLSNpZmRlZiBVU0VfTE9XTUVNX0JVRkZFUgotI2RlZmluZSByeGIgKChjaGFyICopMHgxMDAwMCAtIFJYX1JJTkdfU0laRSAqIEJVRkxFTiAtIEJVRkxFTikKLSNlbHNlCiBzdGF0aWMgdW5zaWduZWQgY2hhciByeGJbUlhfUklOR19TSVpFICogQlVGTEVOXSBfX2F0dHJpYnV0ZV9fICgoYWxpZ25lZCg0KSkpOwotI2VuZGlmCiAKIHN0YXRpYyBzdHJ1Y3QgdHVsaXBfcHJpdmF0ZSB7CiAgICAgaW50IGN1cl9yeDsKQEAgLTQ3MSw3ICs0NzMsNiBAQAogc3RhdGljIGNvbnN0IGNoYXIgKiBibG9ja19uYW1lW10gPSB7IjIxMTQwIG5vbi1NSUkiLCAiMjExNDAgTUlJIFBIWSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMjExNDIgU2VyaWFsIFBIWSIsICIyMTE0MiBNSUkgUEhZIiwgIjIxMTQzIFNZTSBQSFkiLCAiMjExNDMgcmVzZXQgbWV0aG9kIn07CiAKLQwKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiBGdW5jdGlvbiBQcm90b3R5cGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTQ3OSwxNCArNDgwLDEzIEBACiBzdGF0aWMgdm9pZCBtZGlvX3dyaXRlKHN0cnVjdCBuaWMgKm5pYywgaW50IHBoeV9pZCwgaW50IGxvY2F0aW9uLCBpbnQgdmFsdWUpOwogc3RhdGljIGludCByZWFkX2VlcHJvbSh1bnNpZ25lZCBsb25nIGlvYWRkciwgaW50IGxvY2F0aW9uLCBpbnQgYWRkcl9sZW4pOwogc3RhdGljIHZvaWQgcGFyc2VfZWVwcm9tKHN0cnVjdCBuaWMgKm5pYyk7Ci1zdHJ1Y3QgbmljICp0dWxpcF9wcm9iZShzdHJ1Y3QgbmljICpuaWMsIHVuc2lnbmVkIHNob3J0ICppb19hZGRycywKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBwY2lfZGV2aWNlICpwY2kpOworc3RhdGljIGludCB0dWxpcF9wcm9iZShzdHJ1Y3QgZGV2ICpkZXYsIHN0cnVjdCBwY2lfZGV2aWNlICpwY2kpOwogc3RhdGljIHZvaWQgdHVsaXBfaW5pdF9yaW5nKHN0cnVjdCBuaWMgKm5pYyk7CiBzdGF0aWMgdm9pZCB0dWxpcF9yZXNldChzdHJ1Y3QgbmljICpuaWMpOwogc3RhdGljIHZvaWQgdHVsaXBfdHJhbnNtaXQoc3RydWN0IG5pYyAqbmljLCBjb25zdCBjaGFyICpkLCB1bnNpZ25lZCBpbnQgdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBzLCBjb25zdCBjaGFyICpwKTsKLXN0YXRpYyBpbnQgdHVsaXBfcG9sbChzdHJ1Y3QgbmljICpuaWMpOwotc3RhdGljIHZvaWQgdHVsaXBfZGlzYWJsZShzdHJ1Y3QgbmljICpuaWMpOworc3RhdGljIGludCB0dWxpcF9wb2xsKHN0cnVjdCBuaWMgKm5pYywgaW50IHJldHJpZXZlKTsKK3N0YXRpYyB2b2lkIHR1bGlwX2Rpc2FibGUoc3RydWN0IGRldiAqZGV2KTsKIHN0YXRpYyB2b2lkIG53YXlfc3RhcnQoc3RydWN0IG5pYyAqbmljKTsKIHN0YXRpYyB2b2lkIHBuaWNfZG9fbndheShzdHJ1Y3QgbmljICpuaWMpOwogc3RhdGljIHZvaWQgc2VsZWN0X21lZGlhKHN0cnVjdCBuaWMgKm5pYywgaW50IHN0YXJ0dXApOwpAQCAtNTA0LDcgKzUwNCw2IEBACiBzdGF0aWMgdm9pZCB0dWxpcF9tb3JlKHZvaWQpOwogI2VuZGlmCiAKLQwKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiBVdGlsaXR5IFJvdXRpbmVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTUzNSw3ICs1MzQsNiBAQAogICAgICAgICAvKiB3YWl0ICovIDsKIH0KIAotDAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qIE1lZGlhIERlc2NyaXB0b3IgQ29kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtNTY1LDcgKzU2Myw3IEBACiAgICBNRElPIHByb3RvY29sLiAgU2VlIHRoZSBNSUkgc3BlY2lmaWNhdGlvbnMgb3IgRFA4Mzg0MEEgZGF0YSBzaGVldAogICAgZm9yIGRldGFpbHMuICovCiAKLWludCBtZGlvX3JlYWQoc3RydWN0IG5pYyAqbmljLCBpbnQgcGh5X2lkLCBpbnQgbG9jYXRpb24pCitpbnQgbWRpb19yZWFkKHN0cnVjdCBuaWMgKm5pYyBfX3VudXNlZCwgaW50IHBoeV9pZCwgaW50IGxvY2F0aW9uKQogewogICAgIGludCBpOwogICAgIGludCByZWFkX2NtZCA9ICgweGY2IDw8IDEwKSB8IChwaHlfaWQgPDwgNSkgfCBsb2NhdGlvbjsKQEAgLTYyNiw3ICs2MjQsNyBAQAogICAgIHJldHVybiAocmV0dmFsPj4xKSAmIDB4ZmZmZjsKIH0KIAotdm9pZCBtZGlvX3dyaXRlKHN0cnVjdCBuaWMgKm5pYywgaW50IHBoeV9pZCwgaW50IGxvY2F0aW9uLCBpbnQgdmFsdWUpCit2b2lkIG1kaW9fd3JpdGUoc3RydWN0IG5pYyAqbmljIF9fdW51c2VkLCBpbnQgcGh5X2lkLCBpbnQgbG9jYXRpb24sIGludCB2YWx1ZSkKIHsKICAgICBpbnQgaTsKICAgICBpbnQgY21kID0gKDB4NTAwMiA8PCAxNikgfCAocGh5X2lkIDw8IDIzKSB8IChsb2NhdGlvbjw8MTgpIHwgdmFsdWU7CkBAIC02ODIsNyArNjgwLDYgQEAKICAgICB9CiB9CiAKLQwKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiBFRVBST00gUmVhZGluZyBDb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTcyNyw3ICs3MjQsNiBAQAogICAgIHJldHVybiByZXR2YWw7CiB9CiAKLQwKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiBFRVBST00gUGFyc2luZyBDb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTg5NSwxMSArODkxLDEwIEBACiAgICAgfQogfQogCi0MCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogdHVsaXBfaW5pdF9yaW5nIC0gc2V0dXAgdGhlIHR4IGFuZCByeCBkZXNjcmlwdG9ycyAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIHR1bGlwX2luaXRfcmluZyhzdHJ1Y3QgbmljICpuaWMpCitzdGF0aWMgdm9pZCB0dWxpcF9pbml0X3Jpbmcoc3RydWN0IG5pYyAqbmljIF9fdW51c2VkKQogewogICAgIGludCBpOwogCkBAIC05MzUsNyArOTMwLDIyIEBACiAgICAgLyogTWFyayB0aGUgbGFzdCBlbnRyeSBhcyB3cmFwcGluZyB0aGUgcmluZywgdGhvdWdoIHRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbiAqLwogICAgIHR4X3JpbmdbMV0ubGVuZ3RoICA9IGNwdV90b19sZTMyKERFU0NfUklOR19XUkFQIHwgQlVGTEVOKTsKIH0KLQwKKworc3RhdGljIHZvaWQgc2V0X3J4X21vZGUoc3RydWN0IG5pYyAqbmljIF9fdW51c2VkKSB7CisJaW50IGNzcjYgPSBpbmwoaW9hZGRyICsgQ1NSNikgJiB+MHgwMEQ1OworCisJdHAtPmNzcjYgJj0gfjB4MDBENTsKKyAKKwkvKiAhSUZGX1BST01JU0MgKi8KKwl0cC0+Y3NyNiB8PSBBY2NlcHRBbGxNdWx0aWNhc3Q7CisJY3NyNiB8PSBBY2NlcHRBbGxNdWx0aWNhc3Q7CisKKwlvdXRsKGNzcjYsIGlvYWRkciArIENTUjYpOworCisJCisJCit9CisKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiBldGhfcmVzZXQgLSBSZXNldCBhZGFwdGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTk0Myw3ICs5NTMsNiBAQAogewogICAgIGludCBpOwogICAgIHVuc2lnbmVkIGxvbmcgdG87Ci0gICAgdTMyIGFkZHJfbG93LCBhZGRyX2hpZ2g7CiAKICNpZmRlZiBUVUxJUF9ERUJVR19XSEVSRQogICAgIHdoZXJlYW1pKCJ0dWxpcF9yZXNldFxuIik7CkBAIC05NTYsNyArOTY1LDcgQEAKICAgICBpZiAodHAtPm1paV9jbnQgIHx8ICAodHAtPm10YWJsZSAgJiYgIHRwLT5tdGFibGUtPmhhc19taWkpKSB7CiAJb3V0bCgweDgxNEMwMDAwLCBpb2FkZHIgKyBDU1I2KTsKICAgICB9Ci0gIAorIAogICAgIC8qIFJlc2V0IHRoZSBjaGlwLCBob2xkaW5nIGJpdCAwIHNldCBhdCBsZWFzdCA1MCBQQ0kgY3ljbGVzLiAqLwogICAgIG91dGwoMHgwMDAwMDAwMSwgaW9hZGRyICsgQ1NSMCk7CiAgICAgdHVsaXBfd2FpdCgxKTsKQEAgLTEwMjIsOCArMTAzMSw4IEBACiAgICAgfQogCiAgICAgLyogUG9pbnQgdG8gcnggYW5kIHR4IGRlc2NyaXB0b3JzICovCi0gICAgb3V0bCgodW5zaWduZWQgbG9uZykmcnhfcmluZ1swXSwgaW9hZGRyICsgQ1NSMyk7Ci0gICAgb3V0bCgodW5zaWduZWQgbG9uZykmdHhfcmluZ1swXSwgaW9hZGRyICsgQ1NSNCk7CisgICAgb3V0bCh2aXJ0X3RvX2xlMzJkZXNjKCZyeF9yaW5nWzBdKSwgaW9hZGRyICsgQ1NSMyk7CisgICAgb3V0bCh2aXJ0X3RvX2xlMzJkZXNjKCZ0eF9yaW5nWzBdKSwgaW9hZGRyICsgQ1NSNCk7CiAKICAgICBpbml0X21lZGlhKG5pYyk7CiAKQEAgLTEwNDksMTEgKzEwNTgsMTIgQEAKICAgICBpZiAodHAtPmNoaXBfaWQgPT0gTEM4MkMxNjgpCiAJdHVsaXBfY2hlY2tfZHVwbGV4KG5pYyk7CiAKKyAgICBzZXRfcnhfbW9kZShuaWMpOyAJCisgICAgICAgIAogICAgIC8qIGVuYWJsZSB0cmFuc21pdCBhbmQgcmVjZWl2ZSAqLwogICAgIG91dGwodHAtPmNzcjYgfCAweDAwMDAyMDAyLCBpb2FkZHIgKyBDU1I2KTsKIH0KIAotDAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qIGV0aF90cmFuc21pdCAtIFRyYW5zbWl0IGEgZnJhbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtMTA5NSw3ICsxMTA1LDcgQEAKICAgICB0eF9yaW5nWzBdLnN0YXR1cyA9IGNwdV90b19sZTMyKDB4ODAwMDAwMDApOwogCiAgICAgLyogUG9pbnQgdG8gdHJhbnNtaXQgZGVzY3JpcHRvciAqLwotICAgIG91dGwoKHUzMikmdHhfcmluZ1swXSwgaW9hZGRyICsgQ1NSNCk7CisgICAgb3V0bCh2aXJ0X3RvX2xlMzJkZXNjKCZ0eF9yaW5nWzBdKSwgaW9hZGRyICsgQ1NSNCk7CiAKICAgICAvKiBFbmFibGUgVHggKi8KICAgICBvdXRsKGNzcjYgfCAweDAwMDAyMDAwLCBpb2FkZHIgKyBDU1I2KTsKQEAgLTExMTMsMTEgKzExMjMsMTEgQEAKICAgICAvKiBEaXNhYmxlIFR4ICovCiAgICAgb3V0bChjc3I2ICYgfjB4MDAwMDIwMDAsIGlvYWRkciArIENTUjYpOwogfQotDAorCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogZXRoX3BvbGwgLSBXYWl0IGZvciBhIGZyYW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgaW50IHR1bGlwX3BvbGwoc3RydWN0IG5pYyAqbmljKQorc3RhdGljIGludCB0dWxpcF9wb2xsKHN0cnVjdCBuaWMgKm5pYywgaW50IHJldHJpZXZlKQogewogCiAjaWZkZWYgVFVMSVBfREVCVUdfV0hFUkUKQEAgLTExMjgsNiArMTEzOCw4IEBACiAgICAgaWYgKHJ4X3JpbmdbdHAtPmN1cl9yeF0uc3RhdHVzICYgMHg4MDAwMDAwMCkKICAgICAgICAgcmV0dXJuIDA7CiAKKyAgICBpZiAoICEgcmV0cmlldmUgKSByZXR1cm4gMTsKKwogI2lmZGVmIFRVTElQX0RFQlVHX1dIRVJFCiAgICAgd2hlcmVhbWkoInR1bGlwX3BvbGwgZ290IG9uZVxuIik7CiAjZW5kaWYKQEAgLTExNTEsMTcgKzExNjMsMjAgQEAKIAogICAgIHJldHVybiAxOwogfQotDAorCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogZXRoX2Rpc2FibGUgLSBEaXNhYmxlIHRoZSBpbnRlcmZhY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCB0dWxpcF9kaXNhYmxlKHN0cnVjdCBuaWMgKm5pYykKK3N0YXRpYyB2b2lkIHR1bGlwX2Rpc2FibGUoc3RydWN0IGRldiAqZGV2KQogewotCisgICAgc3RydWN0IG5pYyAqbmljID0gKHN0cnVjdCBuaWMgKilkZXY7CiAjaWZkZWYgVFVMSVBfREVCVUdfV0hFUkUKICAgICB3aGVyZWFtaSgidHVsaXBfZGlzYWJsZVxuIik7CiAjZW5kaWYKIAorICAgIC8qIG1lcmdlIHJlc2V0IGFuZCBkaXNhYmxlICovCisgICAgdHVsaXBfcmVzZXQobmljKTsKKwogICAgIC8qIGRpc2FibGUgaW50ZXJydXB0cyAqLwogICAgIG91dGwoMHgwMDAwMDAwMCwgaW9hZGRyICsgQ1NSNyk7CiAKQEAgLTExNzEsMjQgKzExODYsNDEgQEAKICAgICAvKiBDbGVhciB0aGUgbWlzc2VkLXBhY2tldCBjb3VudGVyLiAqLwogICAgICh2b2xhdGlsZSB1bnNpZ25lZCBsb25nKWlubChpb2FkZHIgKyBDU1I4KTsKIH0KLQwKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qSVJRIC0gRW5hYmxlLCBEaXNhYmxlLCBvciBGb3JjZSBpbnRlcnJ1cHRzICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgdHVsaXBfaXJxKHN0cnVjdCBuaWMgKm5pYyBfX3VudXNlZCwgaXJxX2FjdGlvbl90IGFjdGlvbiBfX3VudXNlZCkKK3sKKyAgc3dpdGNoICggYWN0aW9uICkgeworICBjYXNlIERJU0FCTEUgOgorICAgIGJyZWFrOworICBjYXNlIEVOQUJMRSA6CisgICAgYnJlYWs7CisgIGNhc2UgRk9SQ0UgOgorICAgIGJyZWFrOworICB9Cit9CisKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiBldGhfcHJvYmUgLSBMb29rIGZvciBhbiBhZGFwdGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0cnVjdCBuaWMgKnR1bGlwX3Byb2JlKHN0cnVjdCBuaWMgKm5pYywgdW5zaWduZWQgc2hvcnQgKmlvX2FkZHJzLAotICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHBjaV9kZXZpY2UgKnBjaSkKK3N0YXRpYyBpbnQgdHVsaXBfcHJvYmUoc3RydWN0IGRldiAqZGV2LCBzdHJ1Y3QgcGNpX2RldmljZSAqcGNpKQogewotICAgIHUzMiBpLCBsMSwgbDI7CisgICAgc3RydWN0IG5pYyAqbmljID0gKHN0cnVjdCBuaWMgKilkZXY7CisgICAgdTMyIGk7CiAgICAgdTggIGNoaXBfcmV2OwogICAgIHU4IGVlX2RhdGFbRUVQUk9NX1NJWkVdOwogICAgIHVuc2lnbmVkIHNob3J0IHN1bTsKICAgICBpbnQgY2hpcF9pZHg7CiAgICAgc3RhdGljIHVuc2lnbmVkIGNoYXIgbGFzdF9waHlzX2FkZHJbRVRIX0FMRU5dID0gezB4MDAsICdMJywgJ2knLCAnbicsICd1JywgJ3gnfTsKIAotICAgIGlmIChpb19hZGRycyA9PSAwIHx8ICppb19hZGRycyA9PSAwKQorICAgIGlmIChwY2ktPmlvYWRkciA9PSAwKQogICAgICAgICByZXR1cm4gMDsKIAotICAgIGlvYWRkciAgICAgICAgID0gKmlvX2FkZHJzOworICAgIGlvYWRkciAgICAgICAgID0gcGNpLT5pb2FkZHI7CisgICAgbmljLT5pb2FkZHIgICAgPSBwY2ktPmlvYWRkciAmIH4zOworICAgIG5pYy0+aXJxbm8gICAgID0gMDsKIAogICAgIC8qIHBvaW50IHRvIHByaXZhdGUgc3RvcmFnZSAqLwogICAgIHRwID0gJnRweDsKQEAgLTEzNzgsMTUgKzE0MTAsMTUgQEAKICAgICAvKiByZXNldCB0aGUgZGV2aWNlIGFuZCBtYWtlIHJlYWR5IGZvciB0eCBhbmQgcnggb2YgcGFja2V0cyAqLwogICAgIHR1bGlwX3Jlc2V0KG5pYyk7CiAKLSAgICBuaWMtPnJlc2V0ICAgID0gdHVsaXBfcmVzZXQ7CisgICAgZGV2LT5kaXNhYmxlICA9IHR1bGlwX2Rpc2FibGU7CiAgICAgbmljLT5wb2xsICAgICA9IHR1bGlwX3BvbGw7CiAgICAgbmljLT50cmFuc21pdCA9IHR1bGlwX3RyYW5zbWl0OwotICAgIG5pYy0+ZGlzYWJsZSAgPSB0dWxpcF9kaXNhYmxlOworICAgIG5pYy0+aXJxICAgICAgPSB0dWxpcF9pcnE7CiAKICAgICAvKiBnaXZlIHRoZSBib2FyZCBhIGNoYW5jZSB0byByZXNldCBiZWZvcmUgcmV0dXJuaW5nICovCiAgICAgdHVsaXBfd2FpdCg0KlRJQ0tTX1BFUl9TRUMpOwogCi0gICAgcmV0dXJuIG5pYzsKKyAgICByZXR1cm4gMTsKIH0KIAogc3RhdGljIHZvaWQgc3RhcnRfbGluayhzdHJ1Y3QgbmljICpuaWMpCkBAIC0xNTA4LDcgKzE1NDAsNyBAQAogICAgIH0KIH0KIAotc3RhdGljIHZvaWQgbndheV9zdGFydChzdHJ1Y3QgbmljICpuaWMpCitzdGF0aWMgdm9pZCBud2F5X3N0YXJ0KHN0cnVjdCBuaWMgKm5pYyBfX3VudXNlZCkKIHsKICAgICBpbnQgY3NyMTQgPSAoKHRwLT5zeW1fYWR2ZXJ0aXNlICYgMHgwNzgwKSA8PCA5KSAgfAogICAgICAgICAoKHRwLT5zeW1fYWR2ZXJ0aXNlJjB4MDAyMCk8PDEpIHwgMHhmZmJmOwpAQCAtMTY2Miw3ICsxNjk0LDcgQEAKICAgICB9CiB9CiAKLXN0YXRpYyB2b2lkIHBuaWNfZG9fbndheShzdHJ1Y3QgbmljICpuaWMpCitzdGF0aWMgdm9pZCBwbmljX2RvX253YXkoc3RydWN0IG5pYyAqbmljIF9fdW51c2VkKQogewogICAgIHUzMiBwaHlfcmVnID0gaW5sKGlvYWRkciArIDB4QjgpOwogICAgIHUzMiBuZXdfY3NyNiA9IHRwLT5jc3I2ICYgfjB4NDBDNDAyMDA7CkBAIC0xODg2LDggKzE5MTgsOCBAQAogICAgICAgICB9CiAgICAgfSBlbHNlIGlmICh0cC0+Y2hpcF9pZCA9PSBEQzIxMDQwKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDIxMDQwICovCiAgICAgICAgIC8qIFR1cm4gb24gdGhlIHhjdnIgaW50ZXJmYWNlLiAqLwotICAgICAgICBpbnQgY3NyMTIgPSBpbmwoaW9hZGRyICsgQ1NSMTIpOwogI2lmZGVmIFRVTElQX0RFQlVHCisgICAgICAgIGludCBjc3IxMiA9IGlubChpb2FkZHIgKyBDU1IxMik7CiAgICAgICAgIGlmICh0dWxpcF9kZWJ1ZyA+IDEpCiAgICAgICAgICAgICBwcmludGYoIiVzOiAyMTA0MCBtZWRpYSB0eXBlIGlzICVzLCBDU1IxMiBpcyAlaGhYLlxuIiwKICAgICAgICAgICAgICAgICAgICB0cC0+bmljX25hbWUsIG1lZGlhbmFtZVt0cC0+aWZfcG9ydF0sIGNzcjEyKTsKQEAgLTE5ODcsMyArMjAxOSw1MSBAQAogCiAgICAgICAgIHJldHVybiAwOwogfQorCitzdGF0aWMgc3RydWN0IHBjaV9pZCB0dWxpcF9uaWNzW10gPSB7CitQQ0lfUk9NKDB4MTAxMSwgMHgwMDAyLCAiZGMyMTA0MCIsICAgICAiRGlnaXRhbCBUdWxpcCIpLAorUENJX1JPTSgweDEwMTEsIDB4MDAwOSwgImRzMjExNDAiLCAgICAgIkRpZ2l0YWwgVHVsaXAgRmFzdCIpLAorUENJX1JPTSgweDEwMTEsIDB4MDAxNCwgImRjMjEwNDEiLCAgICAgIkRpZ2l0YWwgVHVsaXArIiksCitQQ0lfUk9NKDB4MTAxMSwgMHgwMDE5LCAiZHMyMTE0MiIsICAgICAiRGlnaXRhbCBUdWxpcCAyMTE0MiIpLAorUENJX1JPTSgweDEwYjcsIDB4OTMwMCwgIjNjc29obzEwMGItdHgiLCIzQ29tU09ITzEwMEItVFgiKSwKK1BDSV9ST00oMHgxMGI5LCAweDUyNjEsICJhbGkxNTYzIiwgICAgICJBTGkgMTU2MyBpbnRlZ3JhdGVkIGV0aGVybmV0IiksCitQQ0lfUk9NKDB4MTBkOSwgMHgwNTEyLCAibXg5ODcxMyIsICAgICAiTWFjcm9uaXggTVg5ODd4MyIpLAorUENJX1JPTSgweDEwZDksIDB4MDUzMSwgIm14OTg3MTUiLCAgICAgIk1hY3Jvbml4IE1YOTg3eDUiKSwKK1BDSV9ST00oMHgxMTEzLCAweDEyMTcsICJteGljLTk4NzE1IiwgICJNYWNyb25peCBNWDk4N3g1IiksCitQQ0lfUk9NKDB4MTFhZCwgMHhjMTE1LCAibGM4MmMxMTUiLCAgICAiTGlua1N5cyBMTkUxMDBUWCIpLAorUENJX1JPTSgweDExYWQsIDB4MDAwMiwgIjgyYzE2OCIsICAgICAgIk5ldGdlYXIgRkEzMTBUWCIpLAorUENJX1JPTSgweDEyODIsIDB4OTEwMCwgImRtOTEwMCIsICAgICAgIkRhdmljb20gOTEwMCIpLAorUENJX1JPTSgweDEyODIsIDB4OTEwMiwgImRtOTEwMiIsICAgICAgIkRhdmljb20gOTEwMiIpLAorUENJX1JPTSgweDEyODIsIDB4OTAwOSwgImRtOTAwOSIsICAgICAgIkRhdmljb20gOTAwOSIpLAorUENJX1JPTSgweDEyODIsIDB4OTEzMiwgImRtOTEzMiIsICAgICAgIkRhdmljb20gOTEzMiIpLAorUENJX1JPTSgweDEzMTcsIDB4MDk4NSwgImNlbnRhdXItcCIsICAgIkFETXRlayBDZW50YXVyLVAiKSwKK1BDSV9ST00oMHgxMzE3LCAweDA5ODEsICJhbjk4MSIsICAgICAgICJBRE10ZWsgQU45ODEgQ29tZXQiKSwJCS8qIEFETVRlayBDZW50YXVyLVAgKHN0bWljcm8pICovCitQQ0lfUk9NKDB4MTExMywgMHgxMjE2LCAiYW45ODMiLCAgICAgICAiQURNVGVrIEFOOTgzIENvbWV0IiksCitQQ0lfUk9NKDB4MTMxNywgMHg5NTExLCAiYW45ODNiIiwgICAgICAiQURNVGVrIENvbWV0IDk4M2IiKSwKK1BDSV9ST00oMHgxMzE3LCAweDE5ODUsICJjZW50YXVyLWMiLCAgICJBRE1UZWsgQ2VudGF1ci1DIiksCitQQ0lfUk9NKDB4ODA4NiwgMHgwMDM5LCAiaW50ZWwyMTE0NSIsICAiSW50ZWwgVHVsaXAiKSwKK1BDSV9ST00oMHgxMjViLCAweDE0MDAsICJheDg4MTQwIiwgICAgICJBU0lYIEFYODgxNDAiKSwKK1BDSV9ST00oMHgxMWY2LCAweDk4ODEsICJybDEwMHR4IiwgICAgICJDb21wZXggUkwxMDAtVFgiKSwKK1BDSV9ST00oMHgxMTVkLCAweDAwMDMsICJ4aXJjb210dWxpcCIsICJYaXJjb20gVHVsaXAiKSwKK1BDSV9ST00oMHgxMDRhLCAweDA5ODEsICJ0dWxpcC0wOTgxIiwgICJUdWxpcCAweDEwNGEgMHgwOTgxIiksCitQQ0lfUk9NKDB4MTA0YSwgMHgyNzc0LCAidHVsaXAtMjc3NCIsICAiVHVsaXAgMHgxMDRhIDB4Mjc3NCIpLAorUENJX1JPTSgweDExMTMsIDB4OTUxMSwgInR1bGlwLTk1MTEiLCAgIlR1bGlwIDB4MTExMyAweDk1MTEiKSwKK1BDSV9ST00oMHgxMTg2LCAweDE1NjEsICJ0dWxpcC0xNTYxIiwgICJUdWxpcCAweDExODYgMHgxNTYxIiksCitQQ0lfUk9NKDB4MTI1OSwgMHhhMTIwLCAidHVsaXAtYTEyMCIsICAiVHVsaXAgMHgxMjU5IDB4YTEyMCIpLAorUENJX1JPTSgweDEzZDEsIDB4YWIwMiwgInR1bGlwLWFiMDIiLCAgIlR1bGlwIDB4MTNkMSAweGFiMDIiKSwKK1BDSV9ST00oMHgxM2QxLCAweGFiMDMsICJ0dWxpcC1hYjAzIiwgICJUdWxpcCAweDEzZDEgMHhhYjAzIiksCitQQ0lfUk9NKDB4MTNkMSwgMHhhYjA4LCAidHVsaXAtYWIwOCIsICAiVHVsaXAgMHgxM2QxIDB4YWIwOCIpLAorUENJX1JPTSgweDE0ZjEsIDB4MTgwMywgImxhbmZpbml0eSIsICAgIkNvbmV4YW50IExBTmZpbml0eSIpLAorUENJX1JPTSgweDE2MjYsIDB4ODQxMCwgInR1bGlwLTg0MTAiLCAgIlR1bGlwIDB4MTYyNiAweDg0MTAiKSwKK1BDSV9ST00oMHgxNzM3LCAweGFiMDgsICJ0dWxpcC0xNzM3LWFiMDgiLCJUdWxpcCAweDE3MzcgMHhhYjA4IiksCitQQ0lfUk9NKDB4MTczNywgMHhhYjA5LCAidHVsaXAtYWIwOSIsICAiVHVsaXAgMHgxNzM3IDB4YWIwOSIpLAorfTsKKworc3RydWN0IHBjaV9kcml2ZXIgdHVsaXBfZHJpdmVyID0geworCS50eXBlICAgICA9IE5JQ19EUklWRVIsCisJLm5hbWUgICAgID0gIlR1bGlwIiwKKwkucHJvYmUgICAgPSB0dWxpcF9wcm9iZSwKKwkuaWRzICAgICAgPSB0dWxpcF9uaWNzLAorCS5pZF9jb3VudCA9IHNpemVvZih0dWxpcF9uaWNzKS9zaXplb2YodHVsaXBfbmljc1swXSksCisJLmNsYXNzICAgID0gMCwKK307CmRpZmYgLU5hdXIgZ3J1Yi0wLjk3Lm9yaWcvbmV0Ym9vdC90dWxpcC50eHQgZ3J1Yi0wLjk3L25ldGJvb3QvdHVsaXAudHh0Ci0tLSBncnViLTAuOTcub3JpZy9uZXRib290L3R1bGlwLnR4dAkyMDAzLTA3LTA5IDExOjQ1OjM4LjAwMDAwMDAwMCArMDAwMAorKysgZ3J1Yi0wLjk3L25ldGJvb3QvdHVsaXAudHh0CTE5NzAtMDEtMDEgMDA6MDA6MDAuMDAwMDAwMDAwICswMDAwCkBAIC0xLDUzICswLDAgQEAKLVRoaXMgc29mdHdhcmUgbWF5IGJlIHVzZWQgYW5kIGRpc3RyaWJ1dGVkIGFjY29yZGluZyB0byB0aGUgdGVybXMgb2YKLXRoZSBHTlUgUHVibGljIExpY2Vuc2UsIGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgotCi1UaGlzIGlzIGEgdHVsaXAgYW5kIGNsb25lIGRyaXZlciBmb3IgRXRoZXJib290LiAgU2VlIHRoZSByZXZpc2lvbgotaGlzdG9yeSBpbiB0aGUgdHVsaXAuYyBmaWxlIGZvciBpbmZvcm1hdGlvbiBvbiBjaGFuZ2VzLiAgVGhpcyB2ZXJzaW9uCi1vZiB0aGUgZHJpdmVyIGluY29ycG9yYXRlcyBjaGFuZ2VzIGZyb20gQm9iIEVkd2FyZHMgYW5kIFBhdWwgTWFja2VycmFzCi13aG8gY2FudHJpYnV0ZWQgY2hhbmdlcyB0byBzdXBwb3J0IHRoZSBUUkVORG5ldCBURTEwMC1QQ0lBIE5JQyB3aGljaAotdXNlcyBhIGdlbnVpbmUgSW50ZWwgMjExNDMtUEQgY2hpcHNldC4gIFRoZXJlIGFyZSBhbHNvIHZhcmlvdXMgY29kZQotY2xlYW51cHMgdG8gbWFrZSB0aW1lLWJhc2VkIGFjdGl2aXRpZXMgbW9yZSByZWxpYWJsZS4KLQotT2YgY291cnNlIHlvdSBoYXZlIHRvIGhhdmUgYWxsIHRoZSB1c3VhbCBFdGhlcmJvb3QgZW52aXJvbm1lbnQKLShib290cC9kaGNwL05GUykgc2V0IHVwLCBhbmQgeW91IG5lZWQgYSBMaW51eCBrZXJuZWwgd2l0aCB2MC45MWcKLSg3LjE2Ljk5KSBvciBsYXRlciBvZiB0aGUgdHVsaXAuYyBkcml2ZXIgY29tcGlsZWQgaW4gdG8gc3VwcG9ydCBzb21lCi1NWDk4NzE1IGJhc2VkIGNhcmRzLiAgVGhhdCBmaWxlIGlzIGF2YWlsYWJsZSBhdDoKLQotICBodHRwOi8vY2VzZGlzLmdzZmMubmFzYS5nb3YvbGludXgvZHJpdmVycy90ZXN0L3R1bGlwLmMKLQotTk9URVMKLQotSSd2ZSB0ZXN0ZWQgdGhpcyBkcml2ZXIgd2l0aCBhIFNPSE93YXJlIEZhc3QgMTAvMTAwIE1vZGVsIFNEQTExMEEsCi1hIExpbmtzeXMgTE5FMTAwVFggdjIuMCwgYW5kIGEgTmV0Z2VhciBGQTMxMFRYIGNhcmQsIGFuZCBpdCB3b3JrZWQgYXQKLWJvdGggMTAgYW5kIDEwMCBtYml0cy4gT3RoZXIgY2FyZHMgYmFzZWQgb24gdGhlIHR1bGlwIGZhbWlseSBtYXkgd29yayBhcwotd2VsbC4KLQotVGhlc2UgY2FyZHMgYXJlIGFib3V0IDIwJFVTLCBhcmUgc3VwcG9ydGVkIGJ5IExpbnV4IGFuZCBub3cgRXRoZXJib290LAotYW5kIGJlaW5nIFBDSSwgdGhleSBhdXRvLWNvbmZpZ3VyZSBJUlEgYW5kIElPQUREUiBhbmQgYXV0by1uZWdvdGlhdGUKLTEwLzEwMCBoYWxmL2Z1bGwgZHVwbGV4LiBJdCBzZWVtcyBsaWtlIGEgcHJldHR5IGdvb2QgdmFsdWUgY29tcGFyZWQgdG8KLXNvbWUgb2YgdGhlIHByaWNpZXIgY2FyZHMsIGFuZCBjYW4gbG93ZXIgdGhlIGNvc3Qgb2YgYnVpbGRpbmcvYWRhcHRpbmcKLXRoaW4gY2xpZW50IHdvcmtzdGF0aW9ucyBzdWJzdGFudGlhbGx5IHdoaWxlIGdpdmluZyBhIGNvbnNpZGVyYWJsZQotcGVyZm9ybWFuY2UgaW5jcmVhc2UuCi0KLU9uIHNvbWUgUENJIHR1bGlwIGNsb25lIGNoaXBzZXRzIChNWDk4N3g1LCBMQzgyQzExNSwgTEM4MkMxNjgpIHRoaXMgZHJpdmVyIAotbGV0cyB0aGUgY2FyZCBjaG9vc2UgdGhlIGZhc3Rlc3Qgc3BlZWQgaXQgY2FuIG5lZ290aWF0ZSB3aXRoIHRoZSBwZWVyCi1kZXZpY2UuICBPbiBvdGhlciBjYXJkcywgaXQgY2hvb3NlcyAxMG1iaXQgaGFsZi1kdXBsZXguCi0KLUkgYnVybmVkIGFuIEFNMjdDMjU2ICgzMktCeXRlKSBFUFJPTSB3aXRoIG14OTg3eDUubHpyb20gYW5kIGl0IHdvcmtlZC4KLUFjY29yZGluZyB0byB0aGUgZGF0YSBzaGVldCB0aGUgTVg5ODcxNUEgc3VwcG9ydHMgdXAgdG8gNjRLICgyN0M1MTIpCi1FUFJPTXMsIAotCi1JJ3ZlIGxpYmVyYWxseSBjb21tZW50ZWQgdGhlIGNvZGUgYW5kIGhlYWRlciBmaWxlcyBpbiB0aGUgaG9wZSB0aGF0IGl0Ci13aWxsIGhlbHAgdGhlIG5leHQgcGVyc29uIHdobyBoYWNrcyB0aGUgY29kZSBvciBuZWVkcyB0byBzdXBwb3J0IHNvbWUKLXR1bGlwIGNsb25lIGNhcmQsIG9yIHdpc2hlcyB0byBhZGQgZnVuY3Rpb25hbGl0eS4KLQotQW55d2F5LCBwbGVhc2UgdGVzdCB0aGlzIGlmIHlvdSBjYW4gb24geW91ciB0dWxpcCBiYXNlZCBjYXJkLCBhbmQgbGV0Ci1tZSAobWRjQHRoaW5ndWluLm9yZykgYW5kIHRoZSBuZXRib290IGxpc3QgKG5ldGJvb3RAYmFnaGlyYS5oYW4uZGUpCi1rbm93IGhvdyB0aGluZ3MgZ28uICBJIGFsc28gd291bGQgYXBwcmVjaWF0ZSBjb2RlIHJldmlldyBieSBwZW9wbGUgd2hvCi1wcm9ncmFtLiAgSSdtIGEgc3Ryb25nIGJlbGlldmVyIGluICJhbm90aGVyIHNldCBvZiBleWVzIi4KLQotUmVnYXJkcywKLQotTWFydHkgQ29ubm9yCi1tZGNAdGhpbmd1aW4ub3JnCi1odHRwOi8vd3d3LnRoaW5ndWluLm9yZy8KZGlmZiAtTmF1ciBncnViLTAuOTcub3JpZy9uZXRib290L3R5cGVzLmggZ3J1Yi0wLjk3L25ldGJvb3QvdHlwZXMuaAotLS0gZ3J1Yi0wLjk3Lm9yaWcvbmV0Ym9vdC90eXBlcy5oCTE5NzAtMDEtMDEgMDA6MDA6MDAuMDAwMDAwMDAwICswMDAwCisrKyBncnViLTAuOTcvbmV0Ym9vdC90eXBlcy5oCTIwMDUtMDgtMzEgMTk6MDM6MzUuMDAwMDAwMDAwICswMDAwCkBAIC0wLDAgKzEsNDQgQEAKKyNpZm5kZWYgX1RZUEVTX0gKKyNkZWZpbmUgX1RZUEVTX0gKKworLyogSSdtIGFyY2hpdGVjdHVyZSBpbmRlcGVuZGVkIDotKSAqLworCisvKiAKKyAqIEl0J3MgYXJjaGl0ZWN0dXJlIGRlcGVuZGVkIGhlYWRlcnMgZm9yIGNvbW1vbiBpbnRlZ2VyIHR5cGVzCisgKi8KKyNpbmNsdWRlICJzdGRpbnQuaCIKKworLyogCisgKiBIZXJlIGFyZSBzb21lIFJQQyB0eXBlcyBkZWZpbmUgZnJvbSBsaW51eCAvdXNyL2luY2x1ZGUvcnBjL3R5cGVzLmgKKyAqLwordHlwZWRlZiBpbnQgYm9vbF90OwordHlwZWRlZiBpbnQgZW51bV90OwordHlwZWRlZiB1aW50MzJfdCBycGNwcm9nX3Q7Cit0eXBlZGVmIHVpbnQzMl90IHJwY3ZlcnNfdDsKK3R5cGVkZWYgdWludDMyX3QgcnBjcHJvY190OwordHlwZWRlZiB1aW50MzJfdCBycGNwcm90X3Q7Cit0eXBlZGVmIHVpbnQzMl90IHJwY3BvcnRfdDsKKworLyogRm9yIGJvb2xfdCAqLworLyogdHlwZWRlZiBlbnVtIHsgKi8KKy8qICAJRkFMU0UgPSAwLCAqLworLyogIAlUUlVFID0gMSAqLworLyogfSBib29sZWFuX3Q7ICovCisKKworCisvKiBTb21lIEJTRCBvciBSUEMgc3R5bGUgdHlwZXMgKi8KK3R5cGVkZWYgdW5zaWduZWQgY2hhciB1X2NoYXI7Cit0eXBlZGVmIHVuc2lnbmVkIHNob3J0IHVfc2hvcnQ7Cit0eXBlZGVmIHVuc2lnbmVkIGludCB1X2ludDsKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyB1X2xvbmc7Cit0eXBlZGVmIGxvbmcgbG9uZyBxdWFkX3Q7Cit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgbG9uZyB1X3F1YWRfdDsKK3R5cGVkZWYgc3RydWN0IHsKKwlpbnQgX192YWxbMl07Cit9ZnNpZF90OwkJCS8qIFR5cGUgb2YgZmlsZSBzeXN0ZW0gSURzLCBmcm9tIGJpdHMvdHlwZXMuaCAqLworCit0eXBlZGVmIGludCBkYWRkcl90OwkJLyogVGhlIHR5cGUgb2YgYSBkaXNrIGFkZHJlc3MsIGZyb20gYml0cy90eXBlcy5oICovCit0eXBlZGVmIGNoYXIgKiBjYWRkcl90OworCisjZW5kaWYgLyogX1RZUEVTX0ggKi8KZGlmZiAtTmF1ciBncnViLTAuOTcub3JpZy9uZXRib290L3VkcC5oIGdydWItMC45Ny9uZXRib290L3VkcC5oCi0tLSBncnViLTAuOTcub3JpZy9uZXRib290L3VkcC5oCTE5NzAtMDEtMDEgMDA6MDA6MDAuMDAwMDAwMDAwICswMDAwCisrKyBncnViLTAuOTcvbmV0Ym9vdC91ZHAuaAkyMDA1LTA4LTMxIDE5OjAzOjM1LjAwMDAwMDAwMCArMDAwMApAQCAtMCwwICsxLDMwIEBACisjaWZuZGVmCV9VRFBfSAorI2RlZmluZQlfVURQX0gKKworLyogV2UgbmVlZCAndWludDE2X3QnIGFuZCAndWludDhfdCcgICovCisjaW5jbHVkZSAidHlwZXMuaCIKKy8qIFdlIG5lZWQgJ2luX2FkZHInICovCisjaW5jbHVkZSAiaW4uaCIKKworc3RydWN0IHVkcF9wc2V1ZG9faGRyIHsKKwlpbl9hZGRyICBzcmM7CisJaW5fYWRkciAgZGVzdDsKKwl1aW50OF90ICB1bnVzZWQ7CisJdWludDhfdCAgcHJvdG9jb2w7CisJdWludDE2X3QgbGVuOworfTsKK3N0cnVjdCB1ZHBoZHIgeworCXVpbnQxNl90IHNyYzsKKwl1aW50MTZfdCBkZXN0OworCXVpbnQxNl90IGxlbjsKKwl1aW50MTZfdCBjaGtzdW07Cit9OworCitleHRlcm4gdm9pZCBidWlsZF91ZHBfaGRyKHVuc2lnbmVkIGxvbmcgX19kZXN0aXAsIHVuc2lnbmVkIGludCBfX3NyY3NvY2ssIAorCSAgICAgIHVuc2lnbmVkIGludCBfX2Rlc3Rzb2NrLCBpbnQgX190dGwsIGludCBfX2xlbiwgCisJICAgICAgY29uc3Qgdm9pZCAqIF9fYnVmKTsKKworZXh0ZXJuIGludCB1ZHBfdHJhbnNtaXQodW5zaWduZWQgbG9uZyBfX2Rlc3RpcCwgdW5zaWduZWQgaW50IF9fc3Jjc29jaywKKwkJCXVuc2lnbmVkIGludCBfX2Rlc3Rzb2NrLCBpbnQgX19sZW4sIGNvbnN0IHZvaWQgKiBfX2J1Zik7CisKKyNlbmRpZgkvKiBfVURQX0ggKi8KZGlmZiAtTmF1ciBncnViLTAuOTcub3JpZy9uZXRib290L3ZpYS1yaGluZS5jIGdydWItMC45Ny9uZXRib290L3ZpYS1yaGluZS5jCi0tLSBncnViLTAuOTcub3JpZy9uZXRib290L3ZpYS1yaGluZS5jCTIwMDMtMDctMDkgMTE6NDU6MzguMDAwMDAwMDAwICswMDAwCisrKyBncnViLTAuOTcvbmV0Ym9vdC92aWEtcmhpbmUuYwkyMDA1LTA4LTMxIDE5OjAzOjM1LjAwMDAwMDAwMCArMDAwMApAQCAtMTgsNyArMTgsNyBAQAogCiAqLwogCi1zdGF0aWMgY29uc3QgY2hhciAqdmVyc2lvbiA9ICJyaGluZS5jIHYxLjAuMCAyMDAwLTAxLTA3XG4iOworc3RhdGljIGNvbnN0IGNoYXIgKnZlcnNpb24gPSAicmhpbmUuYyB2MS4wLjEgMjAwMy0wMi0wNlxuIjsKIAogLyogQSBmZXcgdXNlci1jb25maWd1cmFibGUgdmFsdWVzLiAqLwogCkBAIC00Niw3ICs0Niw2IEBACiAjaW5jbHVkZSAiZXRoZXJib290LmgiCiAjaW5jbHVkZSAibmljLmgiCiAjaW5jbHVkZSAicGNpLmgiCi0jaW5jbHVkZSAiY2FyZHMuaCIKIAogLyogZGVmaW5lIGFsbCBpb2FkZHIgKi8KIApAQCAtMTAzLDYgKzEwMiwxMSBAQAogI2RlZmluZSBieUNGR0QJCQkJaW9hZGRyICsgMHg3YgogI2RlZmluZSB3VGFsbHlDbnRNUEEJCQlpb2FkZHIgKyAweDdjCiAjZGVmaW5lIHdUYWxseUNudENSQwkJCWlvYWRkciArIDB4N2QKKyNkZWZpbmUgYnlTVElDS0hXCQkJaW9hZGRyICsgMHg4MworI2RlZmluZSBieVdPTGNyQ2xyCQkJaW9hZGRyICsgMHhBNAorI2RlZmluZSBieVdPTGNnQ2xyCQkJaW9hZGRyICsgMHhBNworI2RlZmluZSBieVB3cmNzckNscgkJCWlvYWRkciArIDB4QUMKKwogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0gIEV4aW9hZGRyIERlZmluaXRpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCiAvKgpAQCAtNjE3LDkgKzYyMSw2IEBACiAKICovCiAKLSNkZWZpbmUgUENJX1ZFTkRPUl9JRF9GRVQJCTB4MTEwNgotI2RlZmluZSBQQ0lfREVWSUNFX0lEX0ZFVF8zMDQzCQkweDMwNDMKLQogLyogVGhlIHJlc3Qgb2YgdGhlc2UgdmFsdWVzIHNob3VsZCBuZXZlciBjaGFuZ2UuICovCiAjZGVmaW5lIE5VTV9UWF9ERVNDCTIJLyogTnVtYmVyIG9mIFR4IGRlc2NyaXB0b3IgcmVnaXN0ZXJzLiAqLwogCkBAIC02NTIsMjMgKzY1MywxOSBAQAogfQogcmhpbmU7CiAKLXN0YXRpYyBzdHJ1Y3QgbmljICpyaGluZV9wcm9iZTEgKHN0cnVjdCBuaWMgKmRldiwgaW50IGlvYWRkciwKK3N0YXRpYyB2b2lkIHJoaW5lX3Byb2JlMSAoc3RydWN0IG5pYyAqbmljLCBpbnQgaW9hZGRyLAogCQkJCSBpbnQgY2hpcF9pZCwgaW50IG9wdGlvbnMpOwogc3RhdGljIGludCBRdWVyeUF1dG8gKGludCk7CiBzdGF0aWMgaW50IFJlYWRNSUkgKGludCBieU1JSUluZGV4LCBpbnQpOwogc3RhdGljIHZvaWQgV3JpdGVNSUkgKGNoYXIsIGNoYXIsIGNoYXIsIGludCk7CiBzdGF0aWMgdm9pZCBNSUlEZWxheSAodm9pZCk7CiBzdGF0aWMgdm9pZCByaGluZV9pbml0X3JpbmcgKHN0cnVjdCBuaWMgKmRldik7Ci1zdGF0aWMgdm9pZCByaGluZV9kaXNhYmxlIChzdHJ1Y3QgbmljICpuaWMpOworc3RhdGljIHZvaWQgcmhpbmVfZGlzYWJsZSAoc3RydWN0IGRldiAqZGV2KTsKIHN0YXRpYyB2b2lkIHJoaW5lX3Jlc2V0IChzdHJ1Y3QgbmljICpuaWMpOwotc3RhdGljIGludCByaGluZV9wb2xsIChzdHJ1Y3QgbmljICpuaWMpOworc3RhdGljIGludCByaGluZV9wb2xsIChzdHJ1Y3QgbmljICpuaWMsIGludCByZXRyZWl2ZSk7CiBzdGF0aWMgdm9pZCByaGluZV90cmFuc21pdCAoc3RydWN0IG5pYyAqbmljLCBjb25zdCBjaGFyICpkLCB1bnNpZ25lZCBpbnQgdCwKIAkJCSAgICB1bnNpZ25lZCBpbnQgcywgY29uc3QgY2hhciAqcCk7CiAKLS8qIExpbnV4IHN1cHBvcnQgZnVuY3Rpb25zICovCi0jZGVmaW5lIHZpcnRfdG9fYnVzKHgpICgodW5zaWduZWQgbG9uZyl4KQotI2RlZmluZSBidXNfdG9fdmlydCh4KSAoKHZvaWQgKil4KQotCiAvKiBJbml0aWFsaXplIHRoZSBSeCBhbmQgVHggcmluZ3MsIGFsb25nIHdpdGggdmFyaW91cyAnZGV2JyBiaXRzLiAqLwogc3RhdGljIHZvaWQKIHJoaW5lX2luaXRfcmluZyAoc3RydWN0IG5pYyAqbmljKQpAQCAtODU0LDI2ICs4NTEsOTkgQEAKICAgICB9CiB9CiAKLXN0cnVjdCBuaWMgKgotcmhpbmVfcHJvYmUgKHN0cnVjdCBuaWMgKm5pYywgdW5zaWduZWQgc2hvcnQgKnByb2JlYWRkcnMsCi0JICAgICAgIHN0cnVjdCBwY2lfZGV2aWNlICpwY2kpCisvKiBPZmZzZXRzIHRvIHRoZSBkZXZpY2UgcmVnaXN0ZXJzLiAqLworZW51bSByZWdpc3Rlcl9vZmZzZXRzIHsKKyAgICAgICAgU3RhdGlvbkFkZHI9MHgwMCwgUnhDb25maWc9MHgwNiwgVHhDb25maWc9MHgwNywgQ2hpcENtZD0weDA4LAorICAgICAgICBJbnRyU3RhdHVzPTB4MEMsIEludHJFbmFibGU9MHgwRSwKKyAgICAgICAgTXVsdGljYXN0RmlsdGVyMD0weDEwLCBNdWx0aWNhc3RGaWx0ZXIxPTB4MTQsCisgICAgICAgIFJ4UmluZ1B0cj0weDE4LCBUeFJpbmdQdHI9MHgxQywgR0ZJRk9UZXN0PTB4NTQsCisgICAgICAgIE1JSVBoeUFkZHI9MHg2QywgTUlJU3RhdHVzPTB4NkQsIFBDSUJ1c0NvbmZpZz0weDZFLAorICAgICAgICBNSUlDbWQ9MHg3MCwgTUlJUmVnQWRkcj0weDcxLCBNSUlEYXRhPTB4NzIsIE1BQ1JlZ0VFY3NyPTB4NzQsCisgICAgICAgIENvbmZpZ0E9MHg3OCwgQ29uZmlnQj0weDc5LCBDb25maWdDPTB4N0EsIENvbmZpZ0Q9MHg3QiwKKyAgICAgICAgUnhNaXNzZWQ9MHg3QywgUnhDUkNFcnJzPTB4N0UsIE1pc2NDbWQ9MHg4MSwKKyAgICAgICAgU3RpY2t5SFc9MHg4MywgSW50clN0YXR1czI9MHg4NCwgV09MY3JDbHI9MHhBNCwgV09MY2dDbHI9MHhBNywKKyAgICAgICAgUHdyY3NyQ2xyPTB4QUMsCit9OworCisvKiBCaXRzIGluIHRoZSBpbnRlcnJ1cHQgc3RhdHVzL21hc2sgcmVnaXN0ZXJzLiAqLworZW51bSBpbnRyX3N0YXR1c19iaXRzIHsKKyAgICAgICAgSW50clJ4RG9uZT0weDAwMDEsIEludHJSeEVycj0weDAwMDQsIEludHJSeEVtcHR5PTB4MDAyMCwKKyAgICAgICAgSW50clR4RG9uZT0weDAwMDIsIEludHJUeEVycm9yPTB4MDAwOCwgSW50clR4VW5kZXJydW49MHgwMjEwLAorICAgICAgICBJbnRyUENJRXJyPTB4MDA0MCwKKyAgICAgICAgSW50clN0YXRzTWF4PTB4MDA4MCwgSW50clJ4RWFybHk9MHgwMTAwLAorICAgICAgICBJbnRyUnhPdmVyZmxvdz0weDA0MDAsIEludHJSeERyb3BwZWQ9MHgwODAwLCBJbnRyUnhOb0J1Zj0weDEwMDAsCisgICAgICAgIEludHJUeEFib3J0ZWQ9MHgyMDAwLCBJbnRyTGlua0NoYW5nZT0weDQwMDAsCisgICAgICAgIEludHJSeFdha2VVcD0weDgwMDAsCisgICAgICAgIEludHJOb3JtYWxTdW1tYXJ5PTB4MDAwMywgSW50ckFibm9ybWFsU3VtbWFyeT0weEMyNjAsCisgICAgICAgIEludHJUeERlc2NSYWNlPTB4MDgwMDAwLCAgICAgICAgLyogbWFwcGVkIGZyb20gSW50clN0YXR1czIgKi8KKyAgICAgICAgSW50clR4RXJyU3VtbWFyeT0weDA4MjIxOCwKK307CisjZGVmaW5lIERFRkFVTFRfSU5UUiAoSW50clJ4RG9uZSB8IEludHJSeEVyciB8IEludHJSeEVtcHR5fCBJbnRyUnhPdmVyZmxvdyB8IFwKKyAgICAgICAgICAgICAgICAgICBJbnRyUnhEcm9wcGVkIHwgSW50clJ4Tm9CdWYpIAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgSVJRIC0gUFhFIElSUSBIYW5kbGVyCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHJoaW5lX2lycSAoIHN0cnVjdCBuaWMgKm5pYywgaXJxX2FjdGlvbl90IGFjdGlvbiApIHsKKyAgICAgc3RydWN0IHJoaW5lX3ByaXZhdGUgKnRwID0gKHN0cnVjdCByaGluZV9wcml2YXRlICopIG5pYy0+cHJpdl9kYXRhOworICAgICAvKiBFbmFibGUgaW50ZXJydXB0cyBieSBzZXR0aW5nIHRoZSBpbnRlcnJ1cHQgbWFzay4gKi8KKyAgICAgdW5zaWduZWQgaW50IGludHJfc3RhdHVzOworCisgICAgIHN3aXRjaCAoIGFjdGlvbiApIHsKKyAgICAgICAgICBjYXNlIERJU0FCTEUgOgorICAgICAgICAgIGNhc2UgRU5BQkxFIDoKKyAgICAgICAgICAgICAgIGludHJfc3RhdHVzID0gaW53KG5pYy0+aW9hZGRyICsgSW50clN0YXR1cyk7CisgICAgICAgICAgICAgICAvKiBPbiBSaGluZS1JSSwgQml0IDMgaW5kaWNhdGVzIFR4IGRlc2NyaXB0b3Igd3JpdGUtYmFjayByYWNlLiAqLworICAgICAgICAgICAgICAgaWYgKHRwLT5jaGlwX2lkID09IDB4MzA2NSkKKyAgICAgICAgICAgICAgICAgICBpbnRyX3N0YXR1cyB8PSBpbmIobmljLT5pb2FkZHIgKyBJbnRyU3RhdHVzMikgPDwgMTY7CisgICAgICAgICAgICAgICBpbnRyX3N0YXR1cyA9IChpbnRyX3N0YXR1cyAmIH5ERUZBVUxUX0lOVFIpOworICAgICAgICAgICAgICAgaWYgKCBhY3Rpb24gPT0gRU5BQkxFICkgCisgICAgICAgICAgICAgICAgICAgaW50cl9zdGF0dXMgPSBpbnRyX3N0YXR1cyB8IERFRkFVTFRfSU5UUjsKKyAgICAgICAgICAgICAgIG91dHcoaW50cl9zdGF0dXMsIG5pYy0+aW9hZGRyICsgSW50ckVuYWJsZSk7CisgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgIGNhc2UgRk9SQ0UgOgorICAgICAgICAgICAgICAgb3V0dygweDAwMTAsIG5pYy0+aW9hZGRyICsgMHg4NCk7CisgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgIH0KK30KKworc3RhdGljIGludAorcmhpbmVfcHJvYmUgKHN0cnVjdCBkZXYgKmRldiwgc3RydWN0IHBjaV9kZXZpY2UgKnBjaSkKIHsKKyAgICBzdHJ1Y3QgbmljICpuaWMgPSAoc3RydWN0IG5pYyAqKWRldjsKKyAgICBzdHJ1Y3QgcmhpbmVfcHJpdmF0ZSAqdHAgPSAmcmhpbmU7CiAgICAgaWYgKCFwY2ktPmlvYWRkcikKLQlyZXR1cm4gTlVMTDsKLSAgICBuaWMgPSByaGluZV9wcm9iZTEgKG5pYywgcGNpLT5pb2FkZHIsIDAsIC0xKTsKKwlyZXR1cm4gMDsKKyAgICByaGluZV9wcm9iZTEgKG5pYywgcGNpLT5pb2FkZHIsIHBjaS0+ZGV2X2lkLCAtMSk7CiAKLSAgICBpZiAobmljKQotCWFkanVzdF9wY2lfZGV2aWNlKHBjaSk7Ci0gICAgbmljLT5wb2xsID0gcmhpbmVfcG9sbDsKLSAgICBuaWMtPnRyYW5zbWl0ID0gcmhpbmVfdHJhbnNtaXQ7Ci0gICAgbmljLT5yZXNldCA9IHJoaW5lX3Jlc2V0OwotICAgIG5pYy0+ZGlzYWJsZSA9IHJoaW5lX2Rpc2FibGU7CisgICAgYWRqdXN0X3BjaV9kZXZpY2UocGNpKTsKICAgICByaGluZV9yZXNldCAobmljKTsKIAotICAgIHJldHVybiBuaWM7CisgICAgZGV2LT5kaXNhYmxlICA9IHJoaW5lX2Rpc2FibGU7CisgICAgbmljLT5wb2xsICAgICA9IHJoaW5lX3BvbGw7CisgICAgbmljLT50cmFuc21pdCA9IHJoaW5lX3RyYW5zbWl0OworICAgIG5pYy0+aXJxbm8JICA9IHBjaS0+aXJxOworICAgIG5pYy0+aXJxICAgICAgPSByaGluZV9pcnE7CisgICAgbmljLT5pb2FkZHIgICA9IHRwLT5pb2FkZHI7CisKKworICAgIHJldHVybiAxOworfQorCitzdGF0aWMgdm9pZCBzZXRfcnhfbW9kZShzdHJ1Y3QgbmljICpuaWMgX191bnVzZWQpIHsKKyAgICAJc3RydWN0IHJoaW5lX3ByaXZhdGUgKnRwID0gKHN0cnVjdCByaGluZV9wcml2YXRlICopIG5pYy0+cHJpdl9kYXRhOworCXVuc2lnbmVkIGNoYXIgcnhfbW9kZTsKKyAgICAJaW50IGlvYWRkciA9IHRwLT5pb2FkZHI7CisKKwkvKiAhIElGRl9QUk9NSVNDICovCisJb3V0bCgweGZmZmZmZmZmLCBieU1BUjApOworCW91dGwoMHhmZmZmZmZmZiwgYnlNQVI0KTsKKwlyeF9tb2RlID0gMHgwQzsKKworCW91dGIoMHg2MCAvKiB0aHJlc2ggKi8gfCByeF9tb2RlLCBieVJDUiApOwogfQogCi1zdGF0aWMgc3RydWN0IG5pYyAqCitzdGF0aWMgdm9pZAogcmhpbmVfcHJvYmUxIChzdHJ1Y3QgbmljICpuaWMsIGludCBpb2FkZHIsIGludCBjaGlwX2lkLCBpbnQgb3B0aW9ucykKIHsKICAgICBzdHJ1Y3QgcmhpbmVfcHJpdmF0ZSAqdHA7CkBAIC04ODUsNiArOTU1LDI5IEBACiAKICAgICBpZiAocmhpbmVfZGVidWcgPiAwICYmIGRpZF92ZXJzaW9uKysgPT0gMCkKIAlwcmludGYgKHZlcnNpb24pOworCisgICAgLyogRC1MaW5rIHByb3ZpZGVkIHJlc2V0IGNvZGUgKHdpdGggY29tbWVudCBhZGRpdGlvbnMpICovCisgICAgaWYoKGNoaXBfaWQgIT0gMHgzMDQzKSAmJiAoY2hpcF9pZCAhPSAweDYxMDApKSB7CisJdW5zaWduZWQgY2hhciBieU9yZ1ZhbHVlOworCQorCWlmKHJoaW5lX2RlYnVnID4gMCkKKwkJcHJpbnRmKCJFbmFibGluZyBTdGlja3kgQml0IFdvcmthcm91bmQgZm9yIENoaXBfaWQ6IDB4JWhYXG4iCisJCQkJLCBjaGlwX2lkKTsKKwkvKiBjbGVhciBzdGlja3kgYml0IGJlZm9yZSByZXNldCAmIHJlYWQgZXRoZXJuZXQgYWRkcmVzcyAqLworCWJ5T3JnVmFsdWUgPSBpbmIoYnlTVElDS0hXKTsKKwlieU9yZ1ZhbHVlID0gYnlPcmdWYWx1ZSAmIDB4RkM7CisJb3V0YihieU9yZ1ZhbHVlLCBieVNUSUNLSFcpOworCisJLyogKGJpdHMgd3JpdHRlbiBhcmUgY2xlYXJlZD8pICovCisJLyogZGlzYWJsZSBmb3JjZSBQTUUtZW5hYmxlICovCisJb3V0YigweDgwLCBieVdPTGNnQ2xyKTsKKwkvKiBkaXNhYmxlIHBvd2VyLWV2ZW50IGNvbmZpZyBiaXQgKi8KKwlvdXRiKDB4RkYsIGJ5V09MY3JDbHIpOworCS8qIGNsZWFyIHBvd2VyIHN0YXR1cyAodW5kb2N1bWVudGVkIGluIHZ0NjEwMiBkb2NzPykgKi8KKwlvdXRiKDB4RkYsIGJ5UHdyY3NyQ2xyKTsKKwkKKyAgICB9CisKICAgICAvKiBQZXJoYXBzIHRoaXMgc2hvdWxkIGJlIHJlYWQgZnJvbSB0aGUgRUVQUk9NPyAqLwogICAgIGZvciAoaSA9IDA7IGkgPCBFVEhfQUxFTjsgaSsrKQogCW5pYy0+bm9kZV9hZGRyW2ldID0gaW5iIChieVBBUjAgKyBpKTsKQEAgLTkyMCw2ICsxMDEzLDcgQEAKIAl9CiAjZW5kaWYKIAorICAgIAogICAgIC8qIHF1ZXJ5IE1JSSB0byBrbm93IExpbmVTcGVlZCxkdXBsZXggbW9kZSAqLwogICAgIGJ5TUlJdmFsdWUgPSBpbmIgKGlvYWRkciArIDB4NmQpOwogICAgIExpbmVTcGVlZCA9IGJ5TUlJdmFsdWUgJiBNSUlTUl9TUEVFRDsKQEAgLTk3MSwxNSArMTA2NSwxOSBAQAogCWlmICh0cC0+ZGVmYXVsdF9wb3J0KQogCSAgICB0cC0+bWVkaWFsb2NrID0gMTsKICAgICB9Ci0gICAgcmV0dXJuIG5pYzsKKyAgICByZXR1cm47CiB9CiAKLXN0YXRpYyB2b2lkCi1yaGluZV9kaXNhYmxlIChzdHJ1Y3QgbmljICpuaWMpCitzdGF0aWMgdm9pZCAKK3JoaW5lX2Rpc2FibGUgKHN0cnVjdCBkZXYgKmRldikKIHsKKyAgICBzdHJ1Y3QgbmljICpuaWMgPSAoc3RydWN0IG5pYyAqKWRldjsKICAgICBzdHJ1Y3QgcmhpbmVfcHJpdmF0ZSAqdHAgPSAoc3RydWN0IHJoaW5lX3ByaXZhdGUgKikgbmljLT5wcml2X2RhdGE7CiAgICAgaW50IGlvYWRkciA9IHRwLT5pb2FkZHI7CiAKKyAgICAvKiBtZXJnZSByZXNldCBhbmQgZGlzYWJsZSAqLworICAgIHJoaW5lX3Jlc2V0KG5pYyk7CisKICAgICBwcmludGYgKCJyaGluZSBkaXNhYmxlXG4iKTsKICAgICAvKiBTd2l0Y2ggdG8gbG9vcGJhY2sgbW9kZSB0byBhdm9pZCBoYXJkd2FyZSByYWNlcy4gKi8KICAgICB3cml0ZWIoMHg2MCB8IDB4MDEsIGJ5VENSKTsKQEAgLTEwMDIsMTcgKzExMDAsMTAgQEAKICAgICBpbnQgcnhfYnVmc190bXAsIHJ4X2J1ZnNfdG1wMTsKICAgICBpbnQgdHhfYnVmc190bXAsIHR4X2J1ZnNfdG1wMTsKIAotI2lmZGVmCVVTRV9MT1dNRU1fQlVGRkVSCi0jZGVmaW5lIGJ1ZjEgKDB4MTAwMDAgLSAoUlhfUklOR19TSVpFICogUEtUX0JVRl9TWiArIDMyKSkKLSNkZWZpbmUgYnVmMiAoYnVmMSAtIChSWF9SSU5HX1NJWkUgKiBQS1RfQlVGX1NaICsgMzIpKQotI2RlZmluZSBkZXNjMSAoYnVmMiAtIChUWF9SSU5HX1NJWkUgKiBzaXplb2YgKHN0cnVjdCByaGluZV90eF9kZXNjKSArIDMyKSkKLSNkZWZpbmUgZGVzYzIgKGRlc2MxIC0gKFRYX1JJTkdfU0laRSAqIHNpemVvZiAoc3RydWN0IHJoaW5lX3R4X2Rlc2MpICsgMzIpKQotI2Vsc2UKICAgICBzdGF0aWMgY2hhciBidWYxW1JYX1JJTkdfU0laRSAqIFBLVF9CVUZfU1ogKyAzMl07CiAgICAgc3RhdGljIGNoYXIgYnVmMltSWF9SSU5HX1NJWkUgKiBQS1RfQlVGX1NaICsgMzJdOwogICAgIHN0YXRpYyBjaGFyIGRlc2MxW1RYX1JJTkdfU0laRSAqIHNpemVvZiAoc3RydWN0IHJoaW5lX3R4X2Rlc2MpICsgMzJdOwogICAgIHN0YXRpYyBjaGFyIGRlc2MyW1RYX1JJTkdfU0laRSAqIHNpemVvZiAoc3RydWN0IHJoaW5lX3R4X2Rlc2MpICsgMzJdOwotI2VuZGlmCiAKICAgICAvKiBwcmludGYgKCJyaGluZV9yZXNldFxuIik7ICovCiAgICAgLyogU29mdCByZXNldCB0aGUgY2hpcC4gKi8KQEAgLTEwNjksNiArMTE2MCw5IEBACiAgICAgb3V0bCAodmlydF90b19idXMgKHRwLT5yeF9yaW5nKSwgZHdDdXJyZW50UnhEZXNjQWRkcik7CiAgICAgb3V0bCAodmlydF90b19idXMgKHRwLT50eF9yaW5nKSwgZHdDdXJyZW50VHhEZXNjQWRkcik7CiAKKyAgICAvKiBTZXR1cCBNdWx0aWNhc3QgKi8JCisgICAgc2V0X3J4X21vZGUobmljKTsKKwogICAgIC8qIGNsb3NlIElNUiAqLwogICAgIG91dHcgKDB4MDAwMCwgYnlJTVIwKTsKIApAQCAtMTA5MywxNSArMTE4NywzNCBAQAogICAgIC8qc2V0IElNUiB0byB3b3JrICovCiAgICAgb3V0dyAoSU1SU2hhZG93LCBieUlNUjApOwogfQorLyogQmV3YXJlIG9mIFBDSSBwb3N0ZWQgd3JpdGVzICovCisjZGVmaW5lIElPU1lOQyAgZG8geyByZWFkYihuaWMtPmlvYWRkciArIFN0YXRpb25BZGRyKTsgfSB3aGlsZSAoMCkKIAogc3RhdGljIGludAotcmhpbmVfcG9sbCAoc3RydWN0IG5pYyAqbmljKQorcmhpbmVfcG9sbCAoc3RydWN0IG5pYyAqbmljLCBpbnQgcmV0cmVpdmUpCiB7CiAgICAgc3RydWN0IHJoaW5lX3ByaXZhdGUgKnRwID0gKHN0cnVjdCByaGluZV9wcml2YXRlICopIG5pYy0+cHJpdl9kYXRhOwogICAgIGludCByeHN0YXR1cywgZ29vZCA9IDA7OwogCiAgICAgaWYgKHRwLT5yeF9yaW5nW3RwLT5jdXJfcnhdLnJ4X3N0YXR1cy5iaXRzLm93bl9iaXQgPT0gMCkKICAgICB7CisgICAgICAgIHVuc2lnbmVkIGludCBpbnRyX3N0YXR1czsKKyAgICAgICAgLyogVGhlcmUgaXMgYSBwYWNrZXQgcmVhZHkgKi8KKyAgICAgICAgaWYoIXJldHJlaXZlKQorICAgICAgICAgICAgcmV0dXJuIDE7CisKKyAgICAgICAgaW50cl9zdGF0dXMgPSBpbncobmljLT5pb2FkZHIgKyBJbnRyU3RhdHVzKTsKKyAgICAgICAgLyogT24gUmhpbmUtSUksIEJpdCAzIGluZGljYXRlcyBUeCBkZXNjcmlwdG9yIHdyaXRlLWJhY2sgcmFjZS4gKi8KKyNpZiAwCisJaWYgKHRwLT5jaGlwX2lkID09IDB4MzA2NSkKKwkgIGludHJfc3RhdHVzIHw9IGluYihuaWMtPmlvYWRkciArIEludHJTdGF0dXMyKSA8PCAxNjsKKyNlbmRpZgorICAgICAgICAvKiBBY2tub3dsZWRnZSBhbGwgb2YgdGhlIGN1cnJlbnQgaW50ZXJydXB0IHNvdXJjZXMgQVNBUC4gKi8KKyAgICAgICAgaWYgKGludHJfc3RhdHVzICYgSW50clR4RGVzY1JhY2UpCisgICAgICAgICAgIG91dGIoMHgwOCwgbmljLT5pb2FkZHIgKyBJbnRyU3RhdHVzMik7CisgICAgICAgIG91dHcoaW50cl9zdGF0dXMgJiAweGZmZmYsIG5pYy0+aW9hZGRyICsgSW50clN0YXR1cyk7CisJSU9TWU5DOworCiAJcnhzdGF0dXMgPSB0cC0+cnhfcmluZ1t0cC0+Y3VyX3J4XS5yeF9zdGF0dXMubHc7CiAJaWYgKChyeHN0YXR1cyAmIDB4MDMwMCkgIT0gMHgwMzAwKQogCXsKQEAgLTExMjQsNiArMTIzNywxMSBAQAogCXRwLT5jdXJfcngrKzsKIAl0cC0+Y3VyX3J4ID0gdHAtPmN1cl9yeCAlIFJYX1JJTkdfU0laRTsKICAgICB9CisgICAgICAgIC8qIEFja25vd2xlZGdlIGFsbCBvZiB0aGUgY3VycmVudCBpbnRlcnJ1cHQgc291cmNlcyBBU0FQLiAqLworICAgICAgICBvdXR3KERFRkFVTFRfSU5UUiAmIH5JbnRyUnhEb25lLCBuaWMtPmlvYWRkciArIEludHJTdGF0dXMpOworCisgICAgICAgIElPU1lOQzsKKwogICAgIHJldHVybiBnb29kOwogfQogCkBAIC0xMTUyLDcgKzEyNzAsNyBAQAogICAgIHdoaWxlIChzIDwgRVRIX1pMRU4pCiAJKigoY2hhciAqKSB0cC0+dHhfYnVmZnNbZW50cnldICsgRVRIX0hMRU4gKyAocysrKSkgPSAwOwogCi0gICAgdHAtPnR4X3JpbmdbZW50cnldLnR4X2N0cmwuYml0cy50eF9idWZfc2l6ZSA9IEVUSF9ITEVOICsgczsKKyAgICB0cC0+dHhfcmluZ1tlbnRyeV0udHhfY3RybC5iaXRzLnR4X2J1Zl9zaXplID0gczsKIAogICAgIHRwLT50eF9yaW5nW2VudHJ5XS50eF9zdGF0dXMuYml0cy5vd25fYml0ID0gMTsKIApAQCAtMTE3MCw2ICsxMjg4LDkgQEAKICAgICAvKnByaW50ZigidGQ0PVslWF0iLGlubChkd0N1cnJlbnRURFNFMykpOyAqLwogCiAgICAgb3V0YiAoQ1IxYmFrLCBieUNSMSk7CisgICAgLyogV2FpdCB1bnRpbCB0cmFuc21pdCBpcyBmaW5pc2hlZCAqLworICAgIHdoaWxlICh0cC0+dHhfcmluZ1tlbnRyeV0udHhfc3RhdHVzLmJpdHMub3duX2JpdCAhPSAwKQorCTsKICAgICB0cC0+Y3VyX3R4Kys7CiAKICAgICAvKm91dHcoSU1SU2hhZG93LGJ5SU1SMCk7ICovCkBAIC0xMTc3LDQgKzEyOTgsMjEgQEAKICAgICAvKnRwLT50eF9za2J1ZmZbZW50cnldID0gMDsgKi8KIH0KIAorc3RhdGljIHN0cnVjdCBwY2lfaWQgcmhpbmVfbmljc1tdID0geworUENJX1JPTSgweDExMDYsIDB4MzA2NSwgImRsaW5rLTUzMHR4IiwgICAgICJWSUEgNjEwMiIpLAorUENJX1JPTSgweDExMDYsIDB4MzEwNiwgInZpYS1yaGluZS02MTA1IiwgICJWSUEgNjEwNSIpLAorUENJX1JPTSgweDExMDYsIDB4MzA0MywgImRsaW5rLTUzMHR4LW9sZCIsICJWSUEgMzA0MyIpLAkJLyogUmhpbmUtSSA4NmMxMDBhICovCitQQ0lfUk9NKDB4MTEwNiwgMHgzMDUzLCAidmlhNjEwNW0iLCAgICAgICAgIlZJQSA2MTA1TSIpLAkKK1BDSV9ST00oMHgxMTA2LCAweDYxMDAsICJ2aWEtcmhpbmUtb2xkIiwgICAiVklBIDg2QzEwMEEiKSwJLyogUmhpbmUtSUkgKi8KK307CisKK3N0cnVjdCBwY2lfZHJpdmVyIHJoaW5lX2RyaXZlciA9IHsKKwkudHlwZSAgICAgPSBOSUNfRFJJVkVSLAorCS5uYW1lICAgICA9ICJWSUEgODZDMTAwIiwKKwkucHJvYmUgICAgPSByaGluZV9wcm9iZSwKKwkuaWRzICAgICAgPSByaGluZV9uaWNzLAorCS5pZF9jb3VudCA9IHNpemVvZihyaGluZV9uaWNzKS9zaXplb2YocmhpbmVfbmljc1swXSksCisJLmNsYXNzICAgID0gMCwKK307CisKIC8qIEVPRiB2aWEtcmhpbmUuYyAqLwpkaWZmIC1OYXVyIGdydWItMC45Ny5vcmlnL25ldGJvb3Qvdzg5Yzg0MC5jIGdydWItMC45Ny9uZXRib290L3c4OWM4NDAuYwotLS0gZ3J1Yi0wLjk3Lm9yaWcvbmV0Ym9vdC93ODljODQwLmMJMjAwMy0wNy0wOSAxMTo0NTozOC4wMDAwMDAwMDAgKzAwMDAKKysrIGdydWItMC45Ny9uZXRib290L3c4OWM4NDAuYwkyMDA1LTA4LTMxIDE5OjAzOjM1LjAwMDAwMDAwMCArMDAwMApAQCAtNDMsNiArNDMsOSBAQAogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2luZyB0aW1lcjIgcm91dGluZXMuIFByb3Bvc2VkCiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5IEtlbiBZYXAgdG8gZWxpbWluYXRlIENQVSBzcGVlZAogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXBlbmRlbmN5LgorICogICAgICAgICAgICAgRGVjIDEyIDIwMDMgIFYwLjk0ICAgdGltbGVnZ2UJRml4ZWQgaXNzdWVzIGluIDUuMiwgcmVtb3ZlZCAKKyAqICAgICAgICAgICAgIAkJCQkJaW50ZXJydXB0IHVzYWdlLCBlbmFibGVkCisgKiAgICAgICAgICAgICAJCQkJCW11bHRpY2FzdCBzdXBwb3J0CiAgKgogICogVGhpcyBpcyB0aGUgZXRoZXJib290IGRyaXZlciBmb3IgY2FyZHMgYmFzZWQgb24gV2luYm9uZCBXODljODQwRiBjaGlwLgogICoKQEAgLTc3LDEwICs4MCw5IEBACiAjaW5jbHVkZSAiZXRoZXJib290LmgiCiAjaW5jbHVkZSAibmljLmgiCiAjaW5jbHVkZSAicGNpLmgiCi0jaW5jbHVkZSAiY2FyZHMuaCIKICNpbmNsdWRlICJ0aW1lci5oIgogCi1zdGF0aWMgY29uc3QgY2hhciAqdzg5Yzg0MF92ZXJzaW9uID0gImRpdmVyIFZlcnNpb24gMC45MiAtIEF1Z3VzdCAyNywgMjAwMCI7CitzdGF0aWMgY29uc3QgY2hhciAqdzg5Yzg0MF92ZXJzaW9uID0gImRyaXZlciBWZXJzaW9uIDAuOTQgLSBEZWNlbWJlciAxMiwgMjAwMyI7CiAKIHR5cGVkZWYgdW5zaWduZWQgY2hhciAgdTg7CiB0eXBlZGVmICAgc2lnbmVkIGNoYXIgIHM4OwpAQCAtOTAsOSArOTIsNiBAQAogdHlwZWRlZiAgIHNpZ25lZCBpbnQgICBzMzI7CiAKIC8qIExpbnV4IHN1cHBvcnQgZnVuY3Rpb25zICovCi0jZGVmaW5lIHZpcnRfdG9fYnVzKHgpICgodW5zaWduZWQgbG9uZyl4KQotI2RlZmluZSBidXNfdG9fdmlydCh4KSAoKHZvaWQgKil4KQotCiAjZGVmaW5lIHZpcnRfdG9fbGUzMmRlc2MoYWRkcikgIHZpcnRfdG9fYnVzKGFkZHIpCiAjZGVmaW5lIGxlMzJkZXNjX3RvX3ZpcnQoYWRkcikgIGJ1c190b192aXJ0KGFkZHIpCiAKQEAgLTEwOSw3ICsxMDgsNiBAQAogICAgYm9uZGluZyBhbmQgcGFja2V0IHByaW9yaXR5LgogICAgVGhlcmUgYXJlIG5vIGlsbCBlZmZlY3RzIGZyb20gdG9vLWxhcmdlIHJlY2VpdmUgcmluZ3MuICovCiAjZGVmaW5lIFRYX1JJTkdfU0laRSAgICAyCi0KICNkZWZpbmUgUlhfUklOR19TSVpFICAgIDIKIAogLyogVGhlIHByZXN1bWVkIEZJRk8gc2l6ZSBmb3Igd29ya2luZyBhcm91bmQgdGhlIFR4LUZJRk8tb3ZlcmZsb3cgYnVnLgpAQCAtMjYwLDMyICsyNTgsMjAgQEAKIAogc3RhdGljIGludCBpb2FkZHI7CiBzdGF0aWMgdW5zaWduZWQgc2hvcnQgZWVwcm9tIFsweDQwXTsKLQotI2lmZGVmICAgIFVTRV9MT1dNRU1fQlVGRkVSCi0jZGVmaW5lIHJ4X3BhY2tldCAoKGNoYXIgKikweDEwMDAwIC0gUEtUX0JVRl9TWiAqIFJYX1JJTkdfU0laRSkKLSNkZWZpbmUgdHhfcGFja2V0ICgoY2hhciAqKTB4MTAwMDAgLSBQS1RfQlVGX1NaICogUlhfUklOR19TSVpFIC0gUEtUX0JVRl9TWiAqIFRYX1JJTkdfU0laRSkKLSNlbHNlCiBzdGF0aWMgY2hhciAgICAgICAgcnhfcGFja2V0W1BLVF9CVUZfU1ogKiBSWF9SSU5HX1NJWkVdOwogc3RhdGljIGNoYXIgICAgICAgIHR4X3BhY2tldFtQS1RfQlVGX1NaICogVFhfUklOR19TSVpFXTsKLSNlbmRpZgogCiBzdGF0aWMgaW50ICBlZXByb21fcmVhZChsb25nIGlvYWRkciwgaW50IGxvY2F0aW9uKTsKIHN0YXRpYyBpbnQgIG1kaW9fcmVhZChpbnQgYmFzZV9hZGRyZXNzLCBpbnQgcGh5X2lkLCBpbnQgbG9jYXRpb24pOworI2lmIDAKIHN0YXRpYyB2b2lkIG1kaW9fd3JpdGUoaW50IGJhc2VfYWRkcmVzcywgaW50IHBoeV9pZCwgaW50IGxvY2F0aW9uLCBpbnQgdmFsdWUpOworI2VuZGlmCiAKIHN0YXRpYyB2b2lkIGNoZWNrX2R1cGxleCh2b2lkKTsKIHN0YXRpYyB2b2lkIHNldF9yeF9tb2RlKHZvaWQpOwogc3RhdGljIHZvaWQgaW5pdF9yaW5nKHZvaWQpOwogCi0vKgotc3RhdGljIHZvaWQgd2FpdF9sb25nX3RpbWUodm9pZCkKLXsKLSAgICBwcmludGYoIlBhdXNlZCAtIHBsZWFzZSByZWFkIG91dHB1dCBhYm92ZSB0aGlzIGxpbmVcbiIpOwotICAgIHNsZWVwKDMpOwotfQotKi8KLQotI2lmIGRlZmluZWQgVzg5Qzg0MF9ERUJVRworI2lmIGRlZmluZWQoVzg5Qzg0MF9ERUJVRykKIHN0YXRpYyB2b2lkIGRlY29kZV9pbnRlcnJ1cHQodTMyIGludHJfc3RhdHVzKQogewogICAgIHByaW50ZigiSW50ZXJydXB0IHN0YXR1czogIik7CkBAIC0zNDksMTUgKzMzNSwxNyBAQAogICAgIGNoZWNrX2R1cGxleCgpOwogICAgIHNldF9yeF9tb2RlKCk7CiAKLSAgICAvKiBDbGVhciBhbmQgRW5hYmxlIGludGVycnVwdHMgYnkgc2V0dGluZyB0aGUgaW50ZXJydXB0IG1hc2suICovCisgICAgLyogRG8gbm90IGVuYWJsZSB0aGUgaW50ZXJydXB0cyBFdGhlcmJvb3QgZG9lc24ndCBuZWVkIHRoZW0gKi8KKy8qCiAgICAgd3JpdGVsKDB4MUEwRjUsIGlvYWRkciArIEludHJTdGF0dXMpOwogICAgIHdyaXRlbCgweDFBMEY1LCBpb2FkZHIgKyBJbnRyRW5hYmxlKTsKLQorKi8KICNpZiBkZWZpbmVkKFc4OUM4NDBfREVCVUcpCiAgICAgcHJpbnRmKCJ3aW5ib25kLTg0MCA6IERvbmUgcmVzZXQuXG4iKTsKICNlbmRpZgogfQogCisjaWYgMAogc3RhdGljIHZvaWQgaGFuZGxlX2ludHIodTMyIGludHJfc3RhdCkKIHsKICAgICBpZiAoKGludHJfc3RhdCAmIChOb3JtYWxJbnRyfEFibm9ybWFsSW50cikpID09IDApIHsKQEAgLTM3Miw3ICszNjAsNyBAQAogICAgICAgICAvKiBUaGVyZSB3YXMgYW4gYWJub3JtYWwgaW50ZXJydXB0ICovCiAgICAgICAgIHByaW50ZigiXG4tPS0gQWJub3JtYWwgaW50ZXJydXB0LlxuIik7CiAKLSNpZiBkZWZpbmVkIChXODlDODQwX0RFQlVHKQorI2lmIGRlZmluZWQoVzg5Qzg0MF9ERUJVRykKICAgICAgICAgZGVjb2RlX2ludGVycnVwdChpbnRyX3N0YXQpOwogI2VuZGlmCiAKQEAgLTM4MywxOSArMzcxLDIxIEBACiAgICAgICAgIH0KICAgICB9CiB9CisjZW5kaWYKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiB3ODljODQwX3BvbGwgLSBXYWl0IGZvciBhIGZyYW1lCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgaW50IHc4OWM4NDBfcG9sbChzdHJ1Y3QgbmljICpuaWMpCitzdGF0aWMgaW50IHc4OWM4NDBfcG9sbChzdHJ1Y3QgbmljICpuaWMsIGludCByZXRyaWV2ZSkKIHsKICAgICAvKiByZXR1cm4gdHJ1ZSBpZiB0aGVyZSdzIGFuIGV0aGVybmV0IHBhY2tldCByZWFkeSB0byByZWFkICovCiAgICAgLyogbmljLT5wYWNrZXQgc2hvdWxkIGNvbnRhaW4gZGF0YSBvbiByZXR1cm4gKi8KICAgICAvKiBuaWMtPnBhY2tldGxlbiBzaG91bGQgY29udGFpbiBsZW5ndGggb2YgZGF0YSAqLwogICAgIGludCBwYWNrZXRfcmVjZWl2ZWQgPSAwOwogCisjaWYgZGVmaW5lZChXODlDODQwX0RFQlVHKQogICAgIHUzMiBpbnRyX3N0YXR1cyA9IHJlYWRsKGlvYWRkciArIEludHJTdGF0dXMpOwotICAgIC8qIGhhbmRsZV9pbnRyKGludHJfc3RhdHVzKTsgKi8gLyogLS0gaGFuZGxlZCBsYXRlciAqLworI2VuZGlmCiAKICAgICBkbyB7CiAgICAgICAgIC8qIENvZGUgZnJvbSBuZXRkZXZfcngoZGV2KSAqLwpAQCAtNDExLDYgKzQwMSwxMSBAQAogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIAorICAgICAgICBpZiAoICFyZXRyaWV2ZSApIHsKKyAgICAgICAgICAgIHBhY2tldF9yZWNlaXZlZCA9IDE7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCiAgICAgICAgIGlmICgoc3RhdHVzICYgMHgzODAwODMwMCkgIT0gMHgwMzAwKSB7CiAgICAgICAgICAgICBpZiAoKHN0YXR1cyAmIDB4MzgwMDAzMDApICE9IDB4MDMwMCkgewogICAgICAgICAgICAgICAgIC8qIEluZ29yZSBlYXJsaWVyIGJ1ZmZlcnMuICovCkBAIC00NzgsMTEgKzQ3Myw3IEBACiAgICAgICAgIGVudHJ5ID0gKCsrdzg0MHByaXZhdGUuY3VyX3J4KSAlIFJYX1JJTkdfU0laRTsKICAgICAgICAgdzg0MHByaXZhdGUucnhfaGVhZF9kZXNjID0gJnc4NDBwcml2YXRlLnJ4X3JpbmdbZW50cnldOwogICAgIH0gd2hpbGUgKDApOwotCi0gICAgaWYgKGludHJfc3RhdHVzICYgKEFibm9ybWFsSW50ciB8IFR4RklGT1VuZGVyZmxvdyB8IEludHJQQ0lFcnIgfFRpbWVySW50IHwgSW50clR4U3RvcHBlZCkpIHsKLSAgICAgICAgaGFuZGxlX2ludHIoaW50cl9zdGF0dXMpOwotICAgIH0KLQorICAgIAogICAgIHJldHVybiBwYWNrZXRfcmVjZWl2ZWQ7CiB9CiAKQEAgLTUyMSwxMyArNTEyLDEzIEBACiAKICAgICB3ODQwcHJpdmF0ZS50eF9yaW5nW2VudHJ5XS5idWZmZXIxID0gdmlydF90b19sZTMyZGVzYyh0eF9wYWNrZXQpOwogCi0gICAgdzg0MHByaXZhdGUudHhfcmluZ1tlbnRyeV0ubGVuZ3RoID0gKERlc2NXaG9sZVBrdCB8IHMpOworICAgIHc4NDBwcml2YXRlLnR4X3JpbmdbZW50cnldLmxlbmd0aCA9IChEZXNjV2hvbGVQa3QgfCAodTMyKSBzKTsKICAgICBpZiAoZW50cnkgPj0gVFhfUklOR19TSVpFLTEpICAgICAgICAgLyogV3JhcCByaW5nICovCiAgICAgICAgIHc4NDBwcml2YXRlLnR4X3JpbmdbZW50cnldLmxlbmd0aCB8PSAoRGVzY0ludHIgfCBEZXNjRW5kUmluZyk7CiAgICAgdzg0MHByaXZhdGUudHhfcmluZ1tlbnRyeV0uc3RhdHVzID0gKERlc2NPd24pOwogICAgIHc4NDBwcml2YXRlLmN1cl90eCsrOwogCi0gICAgdzg0MHByaXZhdGUudHhfcV9ieXRlcyArPSBzOworICAgIHc4NDBwcml2YXRlLnR4X3FfYnl0ZXMgPSAodTE2KSBzOwogICAgIHdyaXRlbCgwLCBpb2FkZHIgKyBUeFN0YXJ0RGVtYW5kKTsKIAogICAgIC8qIFdvcmsgYXJvdW5kIGhvcnJpYmxlIGJ1ZyBpbiB0aGUgY2hpcCBieSBtYXJraW5nIHRoZSBxdWV1ZSBhcyBmdWxsCkBAIC01NTAsMzMgKzU0MSwyOSBAQAogICAgIGxvYWRfdGltZXIyKFRYX1RJTUVPVVQpOwogCiAgICAgeworI2lmIGRlZmluZWQgVzg5Qzg0MF9ERUJVRwogICAgICAgICB1MzIgaW50cl9zdGF0ID0gMDsKLQorI2VuZGlmCiAgICAgICAgIHdoaWxlICgxKSB7CiAKLSAgICAgICAgICAgIGludHJfc3RhdCA9IHJlYWRsKGlvYWRkciArIEludHJTdGF0dXMpOwogI2lmIGRlZmluZWQoVzg5Qzg0MF9ERUJVRykKLSAgICAgICAgICAgIGRlY29kZV9pbnRlcnJ1cHQoaW50cl9zdGF0KTsKKwkgICAgICBkZWNvZGVfaW50ZXJydXB0KGludHJfc3RhdCk7CiAjZW5kaWYKIAotICAgICAgICAgICAgaWYgKGludHJfc3RhdCAmIChOb3JtYWxJbnRyIHwgSW50clR4RG9uZSkpIHsKLQogICAgICAgICAgICAgICAgIHdoaWxlICggKHRyYW5zbWl0X3N0YXR1cyAmIERlc2NPd24pICYmIHRpbWVyMl9ydW5uaW5nKCkpIHsKIAogICAgICAgICAgICAgICAgICAgICB0cmFuc21pdF9zdGF0dXMgPSB3ODQwcHJpdmF0ZS50eF9yaW5nW2VudHJ5XS5zdGF0dXM7CiAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgd3JpdGVsKGludHJfc3RhdCAmIDB4MDAwMWZmZmYsIGlvYWRkciArIEludHJTdGF0dXMpOwogICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogCiAgICAgaWYgKCh0cmFuc21pdF9zdGF0dXMgJiBEZXNjT3duKSA9PSAwKSB7CiAKICNpZiBkZWZpbmVkKFc4OUM4NDBfREVCVUcpCi0gICAgICAgIHByaW50Zigid2luYm9uZC04NDAgOiB0cmFuc21pc3Npb24gY29tcGxldGUgYWZ0ZXIgJWQgd2FpdCBsb29wIGl0ZXJhdGlvbnMsIHN0YXR1cyAlWFxuIiwKLSAgICAgICAgICAgICAgIFRYX0xPT1BfQ09VTlQgLSB0cmFuc21pdF9sb29wX2NvdW50ZXIsIHc4NDBwcml2YXRlLnR4X3JpbmdbZW50cnldLnN0YXR1cyk7CisgICAgICAgIHByaW50Zigid2luYm9uZC04NDAgOiB0cmFuc21pc3Npb24gY29tcGxldGUgYWZ0ZXIgd2FpdCBsb29wIGl0ZXJhdGlvbnMsIHN0YXR1cyAlWFxuIiwKKyAgICAgICAgICAgICAgICB3ODQwcHJpdmF0ZS50eF9yaW5nW2VudHJ5XS5zdGF0dXMpOwogI2VuZGlmCiAKICAgICAgICAgcmV0dXJuOwpAQCAtNTkyLDggKzU3OSwxMiBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiB3ODljODQwX2Rpc2FibGUgLSBUdXJuIG9mZiBldGhlcm5ldCBpbnRlcmZhY2UKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIHc4OWM4NDBfZGlzYWJsZShzdHJ1Y3QgbmljICpuaWMpCitzdGF0aWMgdm9pZCB3ODljODQwX2Rpc2FibGUoc3RydWN0IGRldiAqZGV2KQogeworICAgIHN0cnVjdCBuaWMgKm5pYyA9IChzdHJ1Y3QgbmljICopZGV2OworICAgIC8qIG1lcmdlIHJlc2V0IGFuZCBkaXNhYmxlICovCisgICAgdzg5Yzg0MF9yZXNldChuaWMpOworCiAgICAgLyogRG9uJ3Qga25vdyB3aGF0IHRvIGRvIHRvIGRpc2FibGUgdGhlIGJvYXJkLiBJcyB0aGlzIG5lZWRlZCBhdCBhbGw/ICovCiAgICAgLyogWWVzLCBhIGxpdmUgTklDIGNhbiBjb3JydXB0IHRoZSBsb2FkZWQgbWVtb3J5IGxhdGVyIFtLZW5dICovCiAgICAgLyogU3RvcCB0aGUgY2hpcCdzIFR4IGFuZCBSeCBwcm9jZXNzZXMuICovCkBAIC02MDEsMjAgKzU5MiwzNyBAQAogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK3c4OWM4NDBfaXJxIC0gRW5hYmxlLCBEaXNhYmxlLCBvciBGb3JjZSBpbnRlcnJ1cHRzCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCB3ODljODQwX2lycShzdHJ1Y3QgbmljICpuaWMgX191bnVzZWQsIGlycV9hY3Rpb25fdCBhY3Rpb24gX191bnVzZWQpCit7CisgIHN3aXRjaCAoIGFjdGlvbiApIHsKKyAgY2FzZSBESVNBQkxFIDoKKyAgICBicmVhazsKKyAgY2FzZSBFTkFCTEUgOgorICAgIGJyZWFrOworICBjYXNlIEZPUkNFIDoKKyAgICBicmVhazsKKyAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIHc4OWM4NDBfcHJvYmUgLSBMb29rIGZvciBhbiBhZGFwdGVyLCB0aGlzIHJvdXRpbmUncyB2aXNpYmxlIHRvIHRoZSBvdXRzaWRlCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdHJ1Y3QgbmljICp3ODljODQwX3Byb2JlKHN0cnVjdCBuaWMgKm5pYywgdW5zaWduZWQgc2hvcnQgKnByb2JlX2FkZHJzLCBzdHJ1Y3QgcGNpX2RldmljZSAqcCkKK3N0YXRpYyBpbnQgdzg5Yzg0MF9wcm9iZShzdHJ1Y3QgZGV2ICpkZXYsIHN0cnVjdCBwY2lfZGV2aWNlICpwKQogeworICAgIHN0cnVjdCBuaWMgKm5pYyA9IChzdHJ1Y3QgbmljICopZGV2OwogICAgIHUxNiBzdW0gPSAwOwotICAgIGludCBpLCBqLCB0bzsKKyAgICBpbnQgaSwgajsKICAgICB1bnNpZ25lZCBzaG9ydCB2YWx1ZTsKLSAgICBpbnQgb3B0aW9uczsKLSAgICBpbnQgcHJvbWlzYzsKIAotICAgIGlmIChwcm9iZV9hZGRycyA9PSAwIHx8IHByb2JlX2FkZHJzWzBdID09IDApCisgICAgaWYgKHAtPmlvYWRkciA9PSAwKQogICAgICAgICByZXR1cm4gMDsKIAotICAgIGlvYWRkciA9IHByb2JlX2FkZHJzWzBdOyAvKiBNYXNrIHRoZSBiaXQgdGhhdCBzYXlzICJ0aGlzIGlzIGFuIGlvIGFkZHIiICovCisgICAgaW9hZGRyICAgICAgPSBwLT5pb2FkZHI7CisgICAgbmljLT5pb2FkZHIgPSBwLT5pb2FkZHIgJiB+MzsKKyAgICBuaWMtPmlycW5vICA9IDA7CisKIAogI2lmIGRlZmluZWQoVzg5Qzg0MF9ERUJVRykKICAgICBwcmludGYoIndpbmJvbmQtODQwOiBQQ0kgYnVzICVoaFggZGV2aWNlIGZ1bmN0aW9uICVoaFg6IEkvTyBhZGRyZXNzOiAlaFhcbiIsIHAtPmJ1cywgcC0+ZGV2Zm4sIGlvYWRkcik7CkBAIC02MjIsOCArNjMwLDYgQEAKIAogICAgIGlvYWRkciA9IGlvYWRkciAmIH4zOyAvKiBNYXNrIHRoZSBiaXQgdGhhdCBzYXlzICJ0aGlzIGlzIGFuIGlvIGFkZHIiICovCiAKLSAgICAvKiBpZiBwcm9iZV9hZGRycyBpcyAwLCB0aGVuIHJvdXRpbmUgY2FuIHVzZSBhIGhhcmR3aXJlZCBkZWZhdWx0ICovCi0KICAgICAvKiBGcm9tIE1hdHQgSG9ydG1hbiA8bWJob3J0bWFuQGFjcHRoaW5jbGllbnQuY29tPiAqLwogICAgIGlmIChwLT52ZW5kb3IgPT0gUENJX1ZFTkRPUl9JRF9XSU5CT05EMgogICAgICAgICAmJiBwLT5kZXZfaWQgPT0gUENJX0RFVklDRV9JRF9XSU5CT05EMl84OUM4NDApIHsKQEAgLTY4OSwxNCArNjk1LDE0IEBACiAgICAgfQogCiAgICAgLyogcG9pbnQgdG8gTklDIHNwZWNpZmljIHJvdXRpbmVzICovCi0gICAgbmljLT5yZXNldCA9IHc4OWM4NDBfcmVzZXQ7Ci0gICAgbmljLT5wb2xsID0gdzg5Yzg0MF9wb2xsOworICAgIGRldi0+ZGlzYWJsZSAgPSB3ODljODQwX2Rpc2FibGU7CisgICAgbmljLT5wb2xsICAgICA9IHc4OWM4NDBfcG9sbDsKICAgICBuaWMtPnRyYW5zbWl0ID0gdzg5Yzg0MF90cmFuc21pdDsKLSAgICBuaWMtPmRpc2FibGUgPSB3ODljODQwX2Rpc2FibGU7CisgICAgbmljLT5pcnEgICAgICA9IHc4OWM4NDBfaXJxOwogCiAgICAgdzg5Yzg0MF9yZXNldChuaWMpOwogCi0gICAgcmV0dXJuIG5pYzsKKyAgICByZXR1cm4gMTsKIH0KIAogLyogUmVhZCB0aGUgRUVQUk9NIGFuZCBNSUkgTWFuYWdlbWVudCBEYXRhIEkvTyAoTURJTykgaW50ZXJmYWNlcy4gIFRoZXNlIGFyZQpAQCAtODE0LDYgKzgyMCw3IEBACiAgICAgcmV0dXJuIChyZXR2YWw+PjEpICYgMHhmZmZmOwogfQogCisjaWYgMAogc3RhdGljIHZvaWQgbWRpb193cml0ZShpbnQgYmFzZV9hZGRyZXNzLCBpbnQgcGh5X2lkLCBpbnQgbG9jYXRpb24sIGludCB2YWx1ZSkKIHsKICAgICBsb25nIG1kaW9fYWRkciA9IGJhc2VfYWRkcmVzcyArIE1JSUN0cmw7CkBAIC04NDQsNiArODUxLDcgQEAKICAgICB9CiAgICAgcmV0dXJuOwogfQorI2VuZGlmCiAKIHN0YXRpYyB2b2lkIGNoZWNrX2R1cGxleCh2b2lkKQogewpAQCAtODc3LDEyICs4ODUsMTAgQEAKICAgICBtZW1zZXQobWNfZmlsdGVyLCAweGZmLCBzaXplb2YobWNfZmlsdGVyKSk7CiAKIC8qCi0gKiBBY3R1YWxseSwgc2hvdWxkIHdvcmsgT0sgd2l0aCBtdWx0aWNhc3QgZW5hYmxlZC4gLS0gaWtvCi0gKi8KLS8qCi0gKiAgcnhfbW9kZSA9IEFjY2VwdEJyb2FkY2FzdCB8IEFjY2VwdE15UGh5cyB8IEFjY2VwdE11bHRpY2FzdDsKKyAqIHdvcmtzIE9LIHdpdGggbXVsdGljYXN0IGVuYWJsZWQuIAogICovCi0gICAgcnhfbW9kZSA9IEFjY2VwdEJyb2FkY2FzdCB8IEFjY2VwdE15UGh5czsKKworICAgIHJ4X21vZGUgPSBBY2NlcHRCcm9hZGNhc3QgfCBBY2NlcHRNeVBoeXMgfCBBY2NlcHRNdWx0aWNhc3Q7CiAKICAgICB3cml0ZWwobWNfZmlsdGVyWzBdLCBpb2FkZHIgKyBNdWx0aWNhc3RGaWx0ZXIwKTsKICAgICB3cml0ZWwobWNfZmlsdGVyWzFdLCBpb2FkZHIgKyBNdWx0aWNhc3RGaWx0ZXIxKTsKQEAgLTkzMiwzICs5MzgsMTggQEAKICAgICB9CiAgICAgcmV0dXJuOwogfQorCisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2lkIHc4OWM4NDBfbmljc1tdID0geworUENJX1JPTSgweDEwNTAsIDB4MDg0MCwgIndpbmJvbmQ4NDAiLCAgICAgIldpbmJvbmQgVzg5Qzg0MEYiKSwKK1BDSV9ST00oMHgxMWY2LCAweDIwMTEsICJjb21wZXhybDEwMGF0eCIsICJDb21wZXggUkwxMDBBVFgiKSwKK307CisKK3N0cnVjdCBwY2lfZHJpdmVyIHc4OWM4NDBfZHJpdmVyID0geworCS50eXBlICAgICA9IE5JQ19EUklWRVIsCisJLm5hbWUgICAgID0gIlc4OUM4NDBGIiwKKwkucHJvYmUgICAgPSB3ODljODQwX3Byb2JlLAorCS5pZHMgICAgICA9IHc4OWM4NDBfbmljcywKKwkuaWRfY291bnQgPSBzaXplb2Yodzg5Yzg0MF9uaWNzKS9zaXplb2Yodzg5Yzg0MF9uaWNzWzBdKSwKKwkuY2xhc3MgICAgPSAwLAorfTsKZGlmZiAtTmF1ciBncnViLTAuOTcub3JpZy9zdGFnZTIvZGlza19pby5jIGdydWItMC45Ny9zdGFnZTIvZGlza19pby5jCi0tLSBncnViLTAuOTcub3JpZy9zdGFnZTIvZGlza19pby5jCTIwMDQtMDUtMjMgMTY6MzU6MjQuMDAwMDAwMDAwICswMDAwCisrKyBncnViLTAuOTcvc3RhZ2UyL2Rpc2tfaW8uYwkyMDA1LTA4LTMxIDE5OjAzOjM1LjAwMDAwMDAwMCArMDAwMApAQCAtMjUsNiArMjUsNyBAQAogI2lmZGVmIFNVUFBPUlRfTkVUQk9PVAogIyBkZWZpbmUgR1JVQgkxCiAjIGluY2x1ZGUgPGV0aGVyYm9vdC5oPgorIyBpbmNsdWRlIDxncnViLmg+CiAjZW5kaWYKIAogI2lmZGVmIEdSVUJfVVRJTAo=