LyoKICogVVNCIFZpQ2FtIFdlYkNhbSBkcml2ZXIKICogQ29weXJpZ2h0IChjKSAyMDAyIEpvZSBCdXJrcyAoamJ1cmtzQHdhdmljbGUub3JnKSwKICogICAgICAgICAgICAgICAgICAgIENocmlzdG9waGVyIEwgQ2hlbmV5IChjY2hlbmV5QGNoZW5leS5jeCksCiAqICAgICAgICAgICAgICAgICAgICBQYXZlbCBNYWNoZWsgKHBhdmVsQHN1c2UuY3opLAogKiAgICAgICAgICAgICAgICAgICAgSm9obiBUeW5lciAoanR5bmVyQGNzLnVjci5lZHUpLAogKiAgICAgICAgICAgICAgICAgICAgTW9ucm9lIFdpbGxpYW1zIChtb25yb2VAcG9ib3guY29tKQogKgogKiBTdXBwb3J0cyAzQ09NIEhvbWVDb25uZWN0IFBDIERpZ2l0YWwgV2ViQ2FtCiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CiAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCiAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCiAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgogKgogKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGJhc2VkIGhlYXZpbHkgb24gdGhlIENQaUEgd2ViY2FtIGRyaXZlciB3aGljaCB3YXMKICogd3JpdHRlbiBieSBQZXRlciBQcmVnbGVyLCBTY290dCBKLiBCZXJ0aW4gYW5kIEpvaGFubmVzIEVyZGZlbHQKICoKICogUG9ydGlvbnMgb2YgdGhpcyBjb2RlIHdlcmUgYWxzbyBjb3BpZWQgZnJvbSB1c2J2aWRlby5jCiAqCiAqIFNwZWNpYWwgdGhhbmtzIHRvIHRoZSB0aGUgd2hvbGUgdGVhbSBhdCBTb3VyY2Vmb3JnZSBmb3IgaGVscCBtYWtpbmcKICogdGhpcyBkcml2ZXIgYmVjb21lIGEgcmVhbGl0eS4gIE5vdGFibHk6CiAqIEFuZHkgQXJtc3Ryb25nIHdobyByZXZlcnNlIGVuZ2luZWVyZWQgdGhlIGNvbG9yIGVuY29kaW5nIGFuZAogKiBQYXZlbCBNYWNoZWsgYW5kIENocmlzIENoZW5leSB3aG8gd29ya2VkIG9uIHJldmVyc2UgZW5naW5lZXJpbmcgdGhlCiAqICAgIGNhbWVyYSBjb250cm9scyBhbmQgd3JvdGUgdGhlIGZpcnN0IGdlbmVyYXRpb24gZHJpdmVyLgogKi8KCiNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgojaW5jbHVkZSA8bGludXgvaW5pdC5oPgojaW5jbHVkZSA8bGludXgvdmlkZW9kZXYuaD4KI2luY2x1ZGUgPGxpbnV4L3VzYi5oPgojaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgojaW5jbHVkZSA8bGludXgvc2xhYi5oPgojaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgojaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KI2luY2x1ZGUgInVzYnZpZGVvLmgiCgovLyAjZGVmaW5lIFZJQ0FNX0RFQlVHCgojaWZkZWYgVklDQU1fREVCVUcKI2RlZmluZSBBREJHKGxpbmVubyxmbXQsYXJncy4uLikgcHJpbnRrKGZtdCwgamlmZmllcywgX19GVU5DVElPTl9fLCBsaW5lbm8sICMjYXJncykKI2RlZmluZSBEQkcoZm10LGFyZ3MuLi4pIEFEQkcoKF9fTElORV9fKSxLRVJOX0RFQlVHIF9fRklMRV9fIiglbGQpOiVzICglZCk6ImZtdCwjI2FyZ3MpCiNlbHNlCiNkZWZpbmUgREJHKGZtbixhcmdzLi4uKSBkbyB7fSB3aGlsZSgwKQojZW5kaWYKCiNkZWZpbmUgRFJJVkVSX0FVVEhPUiAgICAgICAgICAgIkpvZSBCdXJrcywgamJ1cmtzQHdhdmljbGUub3JnIgojZGVmaW5lIERSSVZFUl9ERVNDICAgICAgICAgICAgICJWaUNhbSBXZWJDYW0gRHJpdmVyIgoKLyogRGVmaW5lIHRoZXNlIHZhbHVlcyB0byBtYXRjaCB5b3VyIGRldmljZSAqLwojZGVmaW5lIFVTQl9WSUNBTV9WRU5ET1JfSUQJMHgwNGMxCiNkZWZpbmUgVVNCX1ZJQ0FNX1BST0RVQ1RfSUQJMHgwMDlkCgojZGVmaW5lIFZJQ0FNX0JZVEVTX1BFUl9QSVhFTCAgIDMKI2RlZmluZSBWSUNBTV9NQVhfUkVBRF9TSVpFICAgICAoNTEyKjI0MisxMjgpCiNkZWZpbmUgVklDQU1fTUFYX0ZSQU1FX1NJWkUgICAgKFZJQ0FNX0JZVEVTX1BFUl9QSVhFTCozMjAqMjQwKQojZGVmaW5lIFZJQ0FNX0ZSQU1FUyAgICAgICAgICAgIDIKCiNkZWZpbmUgVklDQU1fSEVBREVSX1NJWkUgICAgICAgNjQKCiNkZWZpbmUgY2xhbXAoIHgsIGwsIGggKSAgICAgICAgbWF4X3QoIF9fdHlwZW9mX18oIHggKSwgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICggbCApLCAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbl90KCBfX3R5cGVvZl9fKCB4ICksICBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoIGggKSwgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoIHggKSApICkKCi8qIE5vdCBzdXJlIHdoYXQgYWxsIHRoZSBieXRlcyBpbiB0aGVzZSBjaGFyCiAqIGFycmF5cyBkbywgYnV0IHRoZXkncmUgbmVjZXNzYXJ5IHRvIG1ha2UKICogdGhlIGNhbWVyYSB3b3JrLgogKi8KCnN0YXRpYyB1bnNpZ25lZCBjaGFyIHNldHVwMVtdID0gewoJMHhCNiwgMHhDMywgMHgxRiwgMHgwMCwgMHgwMiwgMHg2NCwgMHhFNywgMHg2NywKCTB4RkQsIDB4RkYsIDB4MEUsIDB4QzAsIDB4RTcsIDB4MDksIDB4REUsIDB4MDAsCgkweDhFLCAweDAwLCAweEMwLCAweDA5LCAweDQwLCAweDAzLCAweEMwLCAweDE3LAoJMHg0NCwgMHgwMywgMHg0QiwgMHhBRiwgMHhDMCwgMHgwNywgMHgwMCwgMHgwMCwKCTB4NEIsIDB4QUYsIDB4OTcsIDB4Q0YsIDB4MDAsIDB4MDAKfTsKCnN0YXRpYyB1bnNpZ25lZCBjaGFyIHNldHVwMltdID0gewoJMHhCNiwgMHhDMywgMHgwMywgMHgwMCwgMHgwMywgMHg2NCwgMHgxOCwgMHgwMCwKCTB4MDAsIDB4MDAKfTsKCnN0YXRpYyB1bnNpZ25lZCBjaGFyIHNldHVwM1tdID0gewoJMHhCNiwgMHhDMywgMHgwMSwgMHgwMCwgMHgwNiwgMHg2NCwgMHgwMCwgMHgwMAp9OwoKc3RhdGljIHVuc2lnbmVkIGNoYXIgc2V0dXA0W10gPSB7CgkweEI2LCAweEMzLCAweDhGLCAweDA2LCAweDAyLCAweDY0LCAweEU3LCAweDA3LAoJMHgwMCwgMHgwMCwgMHgwOCwgMHhDMCwgMHhFNywgMHgwNywgMHgwMCwgMHgwMCwKCTB4M0UsIDB4QzAsIDB4RTcsIDB4MDcsIDB4NTQsIDB4MDEsIDB4QUEsIDB4MDAsCgkweEU3LCAweDA3LCAweEM4LCAweDA1LCAweEI2LCAweDAwLCAweEU3LCAweDA3LAoJMHg0MiwgMHgwMSwgMHhEMiwgMHgwMCwgMHhFNywgMHgwNywgMHg3QywgMHgwMCwKCTB4MTYsIDB4MDAsIDB4RTcsIDB4MDcsIDB4NTYsIDB4MDAsIDB4MTgsIDB4MDAsCgkweEU3LCAweDA3LCAweDA2LCAweDAwLCAweDkyLCAweEMwLCAweEU3LCAweDA3LAoJMHgwMCwgMHgwMCwgMHgxRSwgMHhDMCwgMHhFNywgMHgwNywgMHhGRiwgMHhGRiwKCTB4MjIsIDB4QzAsIDB4RTcsIDB4MDcsIDB4MDQsIDB4MDAsIDB4MjQsIDB4QzAsCgkweEU3LCAweDA3LCAweEVDLCAweDI3LCAweDI4LCAweEMwLCAweEU3LCAweDA3LAoJMHgxNiwgMHgwMSwgMHg4RSwgMHgwMCwgMHhFNywgMHg4NywgMHgwMSwgMHgwMCwKCTB4MEUsIDB4QzAsIDB4OTcsIDB4Q0YsIDB4RDcsIDB4MDksIDB4MDAsIDB4QzAsCgkweEU3LCAweDc3LCAweDAxLCAweDAwLCAweDkyLCAweEMwLCAweDA5LCAweEMxLAoJMHhFNywgMHgwOSwgMHhGRSwgMHgwNSwgMHgyNCwgMHgwMSwgMHhFNywgMHgwOSwKCTB4MDQsIDB4MDYsIDB4MjYsIDB4MDEsIDB4RTcsIDB4MDcsIDB4MDcsIDB4MDAsCgkweDkyLCAweEMwLCAweEU3LCAweDA1LCAweDAwLCAweEMwLCAweEMwLCAweERGLAoJMHg5NywgMHhDRiwgMHgxNywgMHgwMCwgMHg1NywgMHgwMCwgMHgxNywgMHgwMiwKCTB4RDcsIDB4MDksIDB4MDAsIDB4QzAsIDB4RTcsIDB4NzcsIDB4MDEsIDB4MDAsCgkweDkyLCAweEMwLCAweDBBLCAweEMxLCAweEU3LCAweDU3LCAweEZGLCAweEZGLAoJMHhGQSwgMHgwNSwgMHgwRCwgMHhDMCwgMHhFNywgMHg1NywgMHgwMCwgMHgwMCwKCTB4RkEsIDB4MDUsIDB4MEYsIDB4QzAsIDB4OUYsIDB4QUYsIDB4QzYsIDB4MDAsCgkweEU3LCAweDA1LCAweDAwLCAweEMwLCAweEM4LCAweDA1LCAweEMxLCAweDA1LAoJMHhDMCwgMHgwNSwgMHhDMCwgMHhERiwgMHg5NywgMHhDRiwgMHgyNywgMHhEQSwKCTB4RkEsIDB4MDUsIDB4RUYsIDB4MDcsIDB4MDEsIDB4MDAsIDB4MEIsIDB4MDYsCgkweDczLCAweENGLCAweDlGLCAweEFGLCAweDc4LCAweDAxLCAweDlGLCAweEFGLAoJMHgxQSwgMHgwMywgMHg2RSwgMHhDRiwgMHhFNywgMHgwOSwgMHhGQywgMHgwNSwKCTB4MjQsIDB4MDEsIDB4RTcsIDB4MDksIDB4MDIsIDB4MDYsIDB4MjYsIDB4MDEsCgkweEU3LCAweDA3LCAweDA3LCAweDAwLCAweDkyLCAweEMwLCAweEU3LCAweDA5LAoJMHhGQywgMHgwNSwgMHhGRSwgMHgwNSwgMHhFNywgMHgwOSwgMHgwMiwgMHgwNiwKCTB4MDQsIDB4MDYsIDB4RTcsIDB4MDksIDB4MDAsIDB4MDYsIDB4RkMsIDB4MDUsCgkweEU3LCAweDA5LCAweEZFLCAweDA1LCAweDAwLCAweDA2LCAweDI3LCAweERBLAoJMHhGQSwgMHgwNSwgMHhFNywgMHg1NywgMHgwMSwgMHgwMCwgMHhGQSwgMHgwNSwKCTB4MDIsIDB4Q0EsIDB4MDQsIDB4QzAsIDB4OTcsIDB4Q0YsIDB4OUYsIDB4QUYsCgkweDY2LCAweDA1LCAweDk3LCAweENGLCAweEU3LCAweDA3LCAweDQwLCAweDAwLAoJMHgwMiwgMHgwNiwgMHhDOCwgMHgwOSwgMHhGQywgMHgwNSwgMHg5RiwgMHhBRiwKCTB4REEsIDB4MDIsIDB4OTcsIDB4Q0YsIDB4Q0YsIDB4MTcsIDB4MDIsIDB4MDAsCgkweEVGLCAweDU3LCAweDgxLCAweDAwLCAweDA5LCAweDA2LCAweDlGLCAweEEwLAoJMHhCNiwgMHgwMSwgMHhFRiwgMHg1NywgMHg4MCwgMHgwMCwgMHgwOSwgMHgwNiwKCTB4OUYsIDB4QTAsIDB4NDAsIDB4MDIsIDB4RUYsIDB4NTcsIDB4MDEsIDB4MDAsCgkweDBCLCAweDA2LCAweDlGLCAweEEwLCAweDQ2LCAweDAzLCAweEU3LCAweDA3LAoJMHgwMSwgMHgwMCwgMHgwQSwgMHhDMCwgMHg0NiwgMHhBRiwgMHg0NywgMHhBRiwKCTB4OUYsIDB4QUYsIDB4NDAsIDB4MDIsIDB4RTcsIDB4MDcsIDB4MkUsIDB4MDAsCgkweDBBLCAweEMwLCAweEVGLCAweDg3LCAweDgwLCAweDAwLCAweDA5LCAweDA2LAoJMHg5NywgMHhDRiwgMHgwMCwgMHgwRSwgMHgwMSwgMHgwMCwgMHhDMCwgMHg1NywKCTB4NTEsIDB4MDAsIDB4OUYsIDB4QzAsIDB4OUUsIDB4MDIsIDB4QzAsIDB4NTcsCgkweDUwLCAweDAwLCAweDIwLCAweEMwLCAweEMwLCAweDU3LCAweDU1LCAweDAwLAoJMHgxMiwgMHhDMCwgMHhDMCwgMHg1NywgMHg1NiwgMHgwMCwgMHg5RiwgMHhDMCwKCTB4NzIsIDB4MDIsIDB4OUYsIDB4Q0YsIDB4RDYsIDB4MDIsIDB4QzEsIDB4MEIsCgkweDA4LCAweDA2LCAweDAxLCAweEQwLCAweDZGLCAweDkwLCAweDA4LCAweDA2LAoJMHhDMCwgMHgwNywgMHgwOCwgMHgwMCwgMHhDMSwgMHgwQiwgMHgwOCwgMHgwNiwKCTB4OUYsIDB4QUYsIDB4MjgsIDB4MDUsIDB4OTcsIDB4Q0YsIDB4MkYsIDB4MEUsCgkweDAyLCAweDAwLCAweDA4LCAweDA2LCAweEMwLCAweDA3LCAweDA4LCAweDAwLAoJMHhDMSwgMHgwQiwgMHgwOCwgMHgwNiwgMHg5RiwgMHhBRiwgMHgyOCwgMHgwNSwKCTB4OUYsIDB4Q0YsIDB4RDYsIDB4MDIsIDB4MkYsIDB4MEUsIDB4MDIsIDB4MDAsCgkweDA5LCAweDA2LCAweEVGLCAweDg3LCAweDgwLCAweDAwLCAweDA5LCAweDA2LAoJMHg5RiwgMHhDRiwgMHhENiwgMHgwMiwgMHhFRiwgMHg2NywgMHg3RiwgMHhGRiwKCTB4MDksIDB4MDYsIDB4RTcsIDB4NjcsIDB4RkYsIDB4RkQsIDB4MjIsIDB4QzAsCgkweEU3LCAweDY3LCAweEVGLCAweEZGLCAweDI0LCAweEMwLCAweEU3LCAweDg3LAoJMHgxMCwgMHgwMCwgMHgyOCwgMHhDMCwgMHg5RiwgMHhBRiwgMHhCOCwgMHgwNSwKCTB4RTcsIDB4ODcsIDB4RTAsIDB4MjEsIDB4MjQsIDB4QzAsIDB4OUYsIDB4QUYsCgkweEE4LCAweDA1LCAweEU3LCAweDg3LCAweDA4LCAweDAwLCAweDI0LCAweEMwLAoJMHhFNywgMHg2NywgMHhERiwgMHhGRiwgMHgyNCwgMHhDMCwgMHhDOCwgMHgwNywKCTB4MEEsIDB4MDAsIDB4QzAsIDB4MDcsIDB4MDAsIDB4MDAsIDB4QzEsIDB4MDcsCgkweDAxLCAweDAwLCAweDlGLCAweEFGLCAweDI4LCAweDA1LCAweDlGLCAweEFGLAoJMHhCOCwgMHgwNSwgMHhDMCwgMHgwNywgMHg5RSwgMHgwMCwgMHg5RiwgMHhBRiwKCTB4NDQsIDB4MDUsIDB4RTcsIDB4NjcsIDB4RkYsIDB4RkUsIDB4MjQsIDB4QzAsCgkweEMwLCAweDA5LCAweDIwLCAweEMwLCAweEU3LCAweDg3LCAweDAwLCAweDAxLAoJMHgyNCwgMHhDMCwgMHhDMCwgMHg3NywgMHgwMCwgMHgwMiwgMHgwRiwgMHhDMSwKCTB4RTcsIDB4NjcsIDB4RjcsIDB4RkYsIDB4MjQsIDB4QzAsIDB4RTcsIDB4NjcsCgkweEY3LCAweEZGLCAweDI0LCAweEMwLCAweEU3LCAweDg3LCAweDA4LCAweDAwLAoJMHgyNCwgMHhDMCwgMHgwOCwgMHhEQSwgMHg1RSwgMHhDMSwgMHhFRiwgMHgwNywKCTB4ODAsIDB4MDAsIDB4MDksIDB4MDYsIDB4OTcsIDB4Q0YsIDB4RUYsIDB4MDcsCgkweDAxLCAweDAwLCAweDBBLCAweDA2LCAweDk3LCAweENGLCAweEVGLCAweDA3LAoJMHgwMCwgMHgwMCwgMHgwQiwgMHgwNiwgMHhFRiwgMHgwNywgMHgwMCwgMHgwMCwKCTB4MEEsIDB4MDYsIDB4RUYsIDB4NjcsIDB4N0YsIDB4RkYsIDB4MDksIDB4MDYsCgkweEVGLCAweDA3LCAweDAwLCAweDAwLCAweDBELCAweDA2LCAweEU3LCAweDY3LAoJMHhFRiwgMHhGRiwgMHgyOCwgMHhDMCwgMHhFNywgMHg2NywgMHgxNywgMHhEOCwKCTB4MjQsIDB4QzAsIDB4RTcsIDB4MDcsIDB4MDAsIDB4MDAsIDB4MUUsIDB4QzAsCgkweEU3LCAweDA3LCAweEZGLCAweEZGLCAweDIyLCAweEMwLCAweDk3LCAweENGLAoJMHhDOCwgMHgwNywgMHgwRSwgMHgwNiwgMHg5RiwgMHhBRiwgMHhEQSwgMHgwMiwKCTB4RTcsIDB4MDcsIDB4MDAsIDB4MDAsIDB4RjIsIDB4MDUsIDB4RTcsIDB4MDcsCgkweDEwLCAweDAwLCAweEY2LCAweDA1LCAweEU3LCAweDA3LCAweDBFLCAweDA2LAoJMHhGNCwgMHgwNSwgMHhFNywgMHgwNywgMHhENiwgMHgwMiwgMHhGOCwgMHgwNSwKCTB4QzgsIDB4MDcsIDB4RjIsIDB4MDUsIDB4QzEsIDB4MDcsIDB4MDAsIDB4ODAsCgkweDUwLCAweEFGLCAweDk3LCAweENGLCAweDJGLCAweDBDLCAweDAyLCAweDAwLAoJMHgwNywgMHgwNiwgMHgyRiwgMHgwQywgMHgwNCwgMHgwMCwgMHgwNiwgMHgwNiwKCTB4RTcsIDB4MDcsIDB4MDAsIDB4MDAsIDB4RjIsIDB4MDUsIDB4RTcsIDB4MDcsCgkweDEwLCAweDAwLCAweEY2LCAweDA1LCAweEU3LCAweDA3LCAweEUyLCAweDA1LAoJMHhGNCwgMHgwNSwgMHhFNywgMHgwNywgMHhDRSwgMHgwMiwgMHhGOCwgMHgwNSwKCTB4QzgsIDB4MDcsIDB4RjIsIDB4MDUsIDB4QzEsIDB4MDcsIDB4MDAsIDB4ODAsCgkweDUxLCAweEFGLCAweDk3LCAweENGLCAweDlGLCAweEFGLCAweDY2LCAweDA0LAoJMHg5RiwgMHhBRiwgMHgxQSwgMHgwMywgMHg1OSwgMHhBRiwgMHg5NywgMHhDRiwKCTB4QzAsIDB4MDcsIDB4MEUsIDB4MDAsIDB4QzEsIDB4MEIsIDB4MEMsIDB4MDYsCgkweDQxLCAweEQxLCAweDlGLCAweEFGLCAweDI4LCAweDA1LCAweEMwLCAweDA3LAoJMHgzQywgMHgwMCwgMHg5RiwgMHhBRiwgMHg0NCwgMHgwNSwgMHg2OCwgMHgwMCwKCTB4QzAsIDB4MDcsIDB4M0IsIDB4MDAsIDB4OUYsIDB4QUYsIDB4NDQsIDB4MDUsCgkweDZGLCAweDAwLCAweDBDLCAweDA2LCAweDY4LCAweDAwLCAweEUwLCAweDA3LAoJMHgwNCwgMHgwMSwgMHhFOCwgMHgwQiwgMHgwQSwgMHgwNiwgMHhFOCwgMHgwNywKCTB4MDAsIDB4MDAsIDB4RTAsIDB4MDcsIDB4MDAsIDB4MDIsIDB4RTAsIDB4MDcsCgkweEVDLCAweDAxLCAweEUwLCAweDA3LCAweEZDLCAweEZGLCAweDk3LCAweENGLAoJMHhFNywgMHgwNywgMHhGRiwgMHhGRiwgMHhGQSwgMHgwNSwgMHhFRiwgMHgwNywKCTB4MDAsIDB4MDAsIDB4MEIsIDB4MDYsIDB4RTcsIDB4MDcsIDB4MEUsIDB4MDYsCgkweDI0LCAweDAxLCAweEU3LCAweDA3LCAweDBFLCAweDA2LCAweEZFLCAweDA1LAoJMHhFNywgMHgwNywgMHg0MCwgMHgwMCwgMHgyNiwgMHgwMSwgMHhFNywgMHgwNywKCTB4NDAsIDB4MDAsIDB4MDQsIDB4MDYsIDB4RTcsIDB4MDcsIDB4MDcsIDB4MDAsCgkweDkyLCAweEMwLCAweDk3LCAweENGLCAweEVGLCAweDA3LCAweDAyLCAweDAwLAoJMHgwQiwgMHgwNiwgMHg5RiwgMHhBRiwgMHg3OCwgMHgwMSwgMHhFRiwgMHg3NywKCTB4ODAsIDB4MDAsIDB4MDcsIDB4MDYsIDB4OUYsIDB4QzAsIDB4MTQsIDB4MDQsCgkweEVGLCAweDc3LCAweDAxLCAweDAwLCAweDA3LCAweDA2LCAweDM3LCAweEMwLAoJMHhFRiwgMHg3NywgMHgwMSwgMHgwMCwgMHgwRCwgMHgwNiwgMHgwRiwgMHhDMSwKCTB4RUYsIDB4MDcsIDB4MDEsIDB4MDAsIDB4MEQsIDB4MDYsIDB4QzAsIDB4MDcsCgkweDAyLCAweDAwLCAweEMxLCAweDA3LCAweDMwLCAweDAwLCAweDlGLCAweEFGLAoJMHgyOCwgMHgwNSwgMHhDMCwgMHgwNywgMHgwMSwgMHgwMCwgMHhDMSwgMHgwNywKCTB4MDIsIDB4MDAsIDB4OUYsIDB4QUYsIDB4MjgsIDB4MDUsIDB4QzgsIDB4MDcsCgkweEZGLCAweDRGLCAweDlGLCAweEFGLCAweEE4LCAweDA1LCAweEMwLCAweDA3LAoJMHgzOCwgMHgwMCwgMHg5RiwgMHhBRiwgMHg0NCwgMHgwNSwgMHhDMSwgMHg3NywKCTB4MDMsIDB4MDAsIDB4MDIsIDB4QzEsIDB4MDgsIDB4REEsIDB4NzUsIDB4QzEsCgkweEMxLCAweDc3LCAweDAxLCAweDAwLCAweDBBLCAweEMxLCAweEMwLCAweDA3LAoJMHgwMSwgMHgwMCwgMHhDMSwgMHgwNywgMHgwMiwgMHgwMCwgMHg5RiwgMHhBRiwKCTB4MjgsIDB4MDUsIDB4RUYsIDB4MDcsIDB4MDEsIDB4MDAsIDB4MDYsIDB4MDYsCgkweDJDLCAweENGLCAweEMwLCAweDA3LCAweDAxLCAweDAwLCAweEMxLCAweDA3LAoJMHgwNCwgMHgwMCwgMHg5RiwgMHhBRiwgMHgyOCwgMHgwNSwgMHhFRiwgMHgwNywKCTB4MDAsIDB4MDAsIDB4MDYsIDB4MDYsIDB4MjIsIDB4Q0YsIDB4RUYsIDB4MDcsCgkweDAwLCAweDAwLCAweDBELCAweDA2LCAweEVGLCAweDU3LCAweDAxLCAweDAwLAoJMHgwNiwgMHgwNiwgMHgxQiwgMHhDMCwgMHhDMCwgMHgwNywgMHgwMSwgMHgwMCwKCTB4QzEsIDB4MDcsIDB4MDEsIDB4MDAsIDB4OUYsIDB4QUYsIDB4MjgsIDB4MDUsCgkweEMwLCAweDA3LCAweDAyLCAweDAwLCAweEMxLCAweDA3LCAweDMwLCAweDAwLAoJMHg5RiwgMHhBRiwgMHgyOCwgMHgwNSwgMHhDOCwgMHgwNywgMHhGRiwgMHg0RiwKCTB4OUYsIDB4QUYsIDB4QTgsIDB4MDUsIDB4QzAsIDB4MDcsIDB4MzgsIDB4MDAsCgkweDlGLCAweEFGLCAweDQ0LCAweDA1LCAweEMxLCAweDY3LCAweDAzLCAweDAwLAoJMHhDMSwgMHg1NywgMHgwMywgMHgwMCwgMHgwMiwgMHhDMCwgMHgwOCwgMHhEQSwKCTB4NzMsIDB4QzEsIDB4QzAsIDB4MDcsIDB4MDIsIDB4MDAsIDB4QzEsIDB4MDcsCgkweDEyLCAweDAwLCAweEVGLCAweDU3LCAweDAwLCAweDAwLCAweDA2LCAweDA2LAoJMHgwMiwgMHhDMCwgMHhDMSwgMHgwNywgMHgyMywgMHgwMCwgMHg5RiwgMHhBRiwKCTB4MjgsIDB4MDUsIDB4QzAsIDB4MDcsIDB4MTQsIDB4MDAsIDB4QzEsIDB4MEIsCgkweEVBLCAweDA1LCAweDlGLCAweEFGLCAweDI4LCAweDA1LCAweEMwLCAweDA3LAoJMHgzRSwgMHgwMCwgMHg5RiwgMHhBRiwgMHgwQSwgMHgwNSwgMHhFNywgMHgwOSwKCTB4RTQsIDB4MDUsIDB4RkEsIDB4MDUsIDB4MjcsIDB4RDgsIDB4RkEsIDB4MDUsCgkweEU3LCAweDA3LCAweDBFLCAweDA2LCAweEZDLCAweDA1LCAweEU3LCAweDA3LAoJMHg0RSwgMHgwNiwgMHgwMCwgMHgwNiwgMHhFNywgMHgwNywgMHg0MCwgMHgwMCwKCTB4MDIsIDB4MDYsIDB4OUYsIDB4QUYsIDB4NjYsIDB4MDUsIDB4OUYsIDB4QUYsCgkweEM2LCAweDAwLCAweDk3LCAweENGLCAweEMxLCAweDBCLCAweEUyLCAweDA1LAoJMHg0MSwgMHhEMCwgMHgwMSwgMHhEMiwgMHhDMSwgMHgxNywgMHgyMywgMHgwMCwKCTB4OUYsIDB4QUYsIDB4REMsIDB4MDQsIDB4QzAsIDB4MDcsIDB4MDQsIDB4MDAsCgkweEMxLCAweDBCLCAweEUzLCAweDA1LCAweDlGLCAweEFGLCAweDI4LCAweDA1LAoJMHhDMCwgMHgwNywgMHgwNiwgMHgwMCwgMHhDMSwgMHgwOSwgMHhFNiwgMHgwNSwKCTB4OUYsIDB4QUYsIDB4MjgsIDB4MDUsIDB4QzAsIDB4MDcsIDB4MDcsIDB4MDAsCgkweEMxLCAweDA5LCAweEU2LCAweDA1LCAweEMxLCAweEQxLCAweDlGLCAweEFGLAoJMHgyOCwgMHgwNSwgMHhDMCwgMHgwNywgMHgwQiwgMHgwMCwgMHhDMSwgMHgwOSwKCTB4RTgsIDB4MDUsIDB4OUYsIDB4QUYsIDB4MjgsIDB4MDUsIDB4QzAsIDB4MDcsCgkweDBDLCAweDAwLCAweEMxLCAweDA5LCAweEU4LCAweDA1LCAweEMxLCAweEQxLAoJMHg5RiwgMHhBRiwgMHgyOCwgMHgwNSwgMHhDMCwgMHgwNywgMHgwRCwgMHgwMCwKCTB4QzEsIDB4MDcsIDB4MDksIDB4MDAsIDB4OUYsIDB4QUYsIDB4MjgsIDB4MDUsCgkweEMwLCAweDA3LCAweDAzLCAweDAwLCAweEMxLCAweDA3LCAweDMyLCAweDAwLAoJMHg5RiwgMHhBRiwgMHgyOCwgMHgwNSwgMHhDMCwgMHgwNywgMHgwRiwgMHgwMCwKCTB4QzEsIDB4MDcsIDB4MDAsIDB4MDAsIDB4OUYsIDB4QUYsIDB4MjgsIDB4MDUsCgkweDk3LCAweENGLCAweEU3LCAweDY3LCAweEZGLCAweEQ5LCAweDI0LCAweEMwLAoJMHhDOCwgMHgwNywgMHgwQSwgMHgwMCwgMHg0MCwgMHgwMCwgMHhDMCwgMHg2NywKCTB4MDAsIDB4MDIsIDB4MjcsIDB4ODAsIDB4MjQsIDB4QzAsIDB4RTcsIDB4ODcsCgkweDAwLCAweDA0LCAweDI0LCAweEMwLCAweEU3LCAweDY3LCAweEZGLCAweEY5LAoJMHgyNCwgMHhDMCwgMHgwMSwgMHhEMiwgMHgwOCwgMHhEQSwgMHg3MiwgMHhDMSwKCTB4RTcsIDB4ODcsIDB4MDAsIDB4MjAsIDB4MjQsIDB4QzAsIDB4OTcsIDB4Q0YsCgkweDI3LCAweDAwLCAweDFFLCAweEMwLCAweEU3LCAweDg3LCAweEZGLCAweDAwLAoJMHgyMiwgMHhDMCwgMHhFNywgMHg2NywgMHg3RiwgMHhGRiwgMHgyNCwgMHhDMCwKCTB4RTcsIDB4ODcsIDB4ODAsIDB4MDAsIDB4MjQsIDB4QzAsIDB4RTcsIDB4ODcsCgkweDgwLCAweDAwLCAweDI0LCAweEMwLCAweDk3LCAweENGLCAweDlGLCAweEFGLAoJMHgwQSwgMHgwNSwgMHg2NywgMHgwMCwgMHgxRSwgMHhDMCwgMHhFNywgMHg2NywKCTB4QkYsIDB4RkYsIDB4MjQsIDB4QzAsIDB4RTcsIDB4ODcsIDB4NDAsIDB4MDAsCgkweDI0LCAweEMwLCAweEU3LCAweDg3LCAweDQwLCAweDAwLCAweDI0LCAweEMwLAoJMHg5NywgMHhDRiwgMHg5RiwgMHhBRiwgMHgwQSwgMHgwNSwgMHhFNywgMHg2NywKCTB4MDAsIDB4RkYsIDB4MjIsIDB4QzAsIDB4RTcsIDB4NjcsIDB4RkYsIDB4RkUsCgkweDI0LCAweEMwLCAweEU3LCAweDY3LCAweEZGLCAweEZFLCAweDI0LCAweEMwLAoJMHhDMSwgMHgwOSwgMHgyMCwgMHhDMCwgMHhFNywgMHg4NywgMHgwMCwgMHgwMSwKCTB4MjQsIDB4QzAsIDB4OTcsIDB4Q0YsIDB4QzAsIDB4MDcsIDB4NDAsIDB4MDAsCgkweEM4LCAweDA5LCAweEZDLCAweDA1LCAweEU3LCAweDY3LCAweDAwLCAweEZGLAoJMHgyMiwgMHhDMCwgMHhFNywgMHg2NywgMHhGRiwgMHhGRSwgMHgyNCwgMHhDMCwKCTB4RTcsIDB4NjcsIDB4QkYsIDB4RkYsIDB4MjQsIDB4QzAsIDB4RTcsIDB4NjcsCgkweEJGLCAweEZGLCAweDI0LCAweEMwLCAweDAwLCAweERBLCAweEU4LCAweDA5LAoJMHgyMCwgMHhDMCwgMHhFNywgMHg4NywgMHg0MCwgMHgwMCwgMHgyNCwgMHhDMCwKCTB4RTcsIDB4ODcsIDB4NDAsIDB4MDAsIDB4MjQsIDB4QzAsIDB4MDAsIDB4REEsCgkweEU4LCAweDA5LCAweDIwLCAweEMwLCAweDZELCAweEMxLCAweEU3LCAweDg3LAoJMHgwMCwgMHgwMSwgMHgyNCwgMHhDMCwgMHg5NywgMHhDRiwgMHhFNywgMHgwNywKCTB4MzIsIDB4MDAsIDB4MTIsIDB4QzAsIDB4RTcsIDB4NzcsIDB4MDAsIDB4ODAsCgkweDEyLCAweEMwLCAweDdDLCAweEMwLCAweDk3LCAweENGLCAweEU3LCAweDA3LAoJMHgyMCwgMHg0RSwgMHgxMiwgMHhDMCwgMHhFNywgMHg3NywgMHgwMCwgMHg4MCwKCTB4MTIsIDB4QzAsIDB4N0MsIDB4QzAsIDB4OTcsIDB4Q0YsIDB4MDksIDB4MDIsCgkweDE5LCAweDAwLCAweDAxLCAweDAxLCAweDAwLCAweDgwLCAweDk2LCAweDA5LAoJMHgwNCwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKCTB4MDcsIDB4MDUsIDB4ODEsIDB4MDIsIDB4NDAsIDB4MDAsIDB4MDAsIDB4MDAsCgkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAoJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCgkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAoJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCgkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAoJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCgkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAoJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCgkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAoJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCgkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAoJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCgkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAoJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCgkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAp9OwoKc3RhdGljIHVuc2lnbmVkIGNoYXIgc2V0dXA1W10gPSB7CgkweEI2LCAweEMzLCAweDJGLCAweDAxLCAweDAzLCAweDY0LCAweDBFLCAweDAwLAoJMHgxNCwgMHgwMCwgMHgxQSwgMHgwMCwgMHgyMCwgMHgwMCwgMHgyNiwgMHgwMCwKCTB4NEEsIDB4MDAsIDB4NjQsIDB4MDAsIDB4NkEsIDB4MDAsIDB4OTIsIDB4MDAsCgkweDlBLCAweDAwLCAweEEwLCAweDAwLCAweEIyLCAweDAwLCAweEI4LCAweDAwLAoJMHhCRSwgMHgwMCwgMHhDMiwgMHgwMCwgMHhDOCwgMHgwMCwgMHhDRSwgMHgwMCwKCTB4REMsIDB4MDAsIDB4REEsIDB4MDAsIDB4RTIsIDB4MDAsIDB4RTAsIDB4MDAsCgkweEU4LCAweDAwLCAweEU2LCAweDAwLCAweEVFLCAweDAwLCAweEVDLCAweDAwLAoJMHhGMiwgMHgwMCwgMHhGOCwgMHgwMCwgMHgwMiwgMHgwMSwgMHgwQSwgMHgwMSwKCTB4MEUsIDB4MDEsIDB4MTIsIDB4MDEsIDB4MUUsIDB4MDEsIDB4MjIsIDB4MDEsCgkweDI4LCAweDAxLCAweDJDLCAweDAxLCAweDMyLCAweDAxLCAweDM2LCAweDAxLAoJMHg0NCwgMHgwMSwgMHg1MCwgMHgwMSwgMHg1RSwgMHgwMSwgMHg3MiwgMHgwMSwKCTB4NzYsIDB4MDEsIDB4N0EsIDB4MDEsIDB4ODAsIDB4MDEsIDB4ODgsIDB4MDEsCgkweDhDLCAweDAxLCAweDk0LCAweDAxLCAweDlDLCAweDAxLCAweEEwLCAweDAxLAoJMHhBNCwgMHgwMSwgMHhBQSwgMHgwMSwgMHhCMCwgMHgwMSwgMHhCNCwgMHgwMSwKCTB4QkEsIDB4MDEsIDB4RDAsIDB4MDEsIDB4REEsIDB4MDEsIDB4RjYsIDB4MDEsCgkweEZBLCAweDAxLCAweDAyLCAweDAyLCAweDM0LCAweDAyLCAweDNDLCAweDAyLAoJMHg0NCwgMHgwMiwgMHg0QSwgMHgwMiwgMHg1MCwgMHgwMiwgMHg1NiwgMHgwMiwKCTB4NzQsIDB4MDIsIDB4NzgsIDB4MDIsIDB4N0UsIDB4MDIsIDB4ODQsIDB4MDIsCgkweDhBLCAweDAyLCAweDg4LCAweDAyLCAweDkwLCAweDAyLCAweDhFLCAweDAyLAoJMHg5NCwgMHgwMiwgMHhBMiwgMHgwMiwgMHhBOCwgMHgwMiwgMHhBRSwgMHgwMiwKCTB4QjQsIDB4MDIsIDB4QkEsIDB4MDIsIDB4QjgsIDB4MDIsIDB4QzAsIDB4MDIsCgkweEJFLCAweDAyLCAweEM0LCAweDAyLCAweEQwLCAweDAyLCAweEQ0LCAweDAyLAoJMHhFMCwgMHgwMiwgMHhFNiwgMHgwMiwgMHhFRSwgMHgwMiwgMHhGOCwgMHgwMiwKCTB4RkMsIDB4MDIsIDB4MDYsIDB4MDMsIDB4MUUsIDB4MDMsIDB4MjQsIDB4MDMsCgkweDI4LCAweDAzLCAweDMwLCAweDAzLCAweDJFLCAweDAzLCAweDNDLCAweDAzLAoJMHg0QSwgMHgwMywgMHg0RSwgMHgwMywgMHg1NCwgMHgwMywgMHg1OCwgMHgwMywKCTB4NUUsIDB4MDMsIDB4NjYsIDB4MDMsIDB4NkUsIDB4MDMsIDB4N0EsIDB4MDMsCgkweDg2LCAweDAzLCAweDhFLCAweDAzLCAweDk2LCAweDAzLCAweEIyLCAweDAzLAoJMHhCOCwgMHgwMywgMHhDNiwgMHgwMywgMHhDQywgMHgwMywgMHhENCwgMHgwMywKCTB4REEsIDB4MDMsIDB4RTgsIDB4MDMsIDB4RjQsIDB4MDMsIDB4RkMsIDB4MDMsCgkweDA0LCAweDA0LCAweDIwLCAweDA0LCAweDJBLCAweDA0LCAweDMyLCAweDA0LAoJMHgzNiwgMHgwNCwgMHgzRSwgMHgwNCwgMHg0NCwgMHgwNCwgMHg0MiwgMHgwNCwKCTB4NDgsIDB4MDQsIDB4NEUsIDB4MDQsIDB4NEMsIDB4MDQsIDB4NTQsIDB4MDQsCgkweDUyLCAweDA0LCAweDVBLCAweDA0LCAweDVFLCAweDA0LCAweDYyLCAweDA0LAoJMHg2OCwgMHgwNCwgMHg3NCwgMHgwNCwgMHg3QywgMHgwNCwgMHg4MCwgMHgwNCwKCTB4ODgsIDB4MDQsIDB4OEMsIDB4MDQsIDB4OTQsIDB4MDQsIDB4OUEsIDB4MDQsCgkweEEyLCAweDA0LCAweEE2LCAweDA0LCAweEFFLCAweDA0LCAweEI0LCAweDA0LAoJMHhDMCwgMHgwNCwgMHhDQywgMHgwNCwgMHhEOCwgMHgwNCwgMHgyQSwgMHgwNSwKCTB4NDYsIDB4MDUsIDB4NkMsIDB4MDUsIDB4MDAsIDB4MDAKfTsKCi8qIHJ2bWFsbG9jIC8gcnZmcmVlIGNvcGllZCBmcm9tIHVzYnZpZGVvLmMKICoKICogTm90IHN1cmUgd2h5IHRoZXNlIGFyZSBub3QgeWV0IG5vbi1zdGF0aWNzIHdoaWNoIEkgY2FuIHJlZmVyZW5jZSB0aHJvdWdoCiAqIHVzYnZpZGVvLmggdGhlIHNhbWUgYXMgaXQgaXMgaW4gMi40LjIwLiAgSSBiZXQgdGhpcyB3aWxsIGdldCBmaXhlZCBzb21ldGltZQogKiBpbiB0aGUgZnV0dXJlLgogKiAKKi8Kc3RhdGljIHZvaWQgKnJ2bWFsbG9jKHVuc2lnbmVkIGxvbmcgc2l6ZSkKewoJdm9pZCAqbWVtOwoJdW5zaWduZWQgbG9uZyBhZHI7CgoJc2l6ZSA9IFBBR0VfQUxJR04oc2l6ZSk7CgltZW0gPSB2bWFsbG9jXzMyKHNpemUpOwoJaWYgKCFtZW0pCgkJcmV0dXJuIE5VTEw7CgoJbWVtc2V0KG1lbSwgMCwgc2l6ZSk7IC8qIENsZWFyIHRoZSByYW0gb3V0LCBubyBqdW5rIHRvIHRoZSB1c2VyICovCglhZHIgPSAodW5zaWduZWQgbG9uZykgbWVtOwoJd2hpbGUgKHNpemUgPiAwKSB7CgkJU2V0UGFnZVJlc2VydmVkKHZtYWxsb2NfdG9fcGFnZSgodm9pZCAqKWFkcikpOwoJCWFkciArPSBQQUdFX1NJWkU7CgkJc2l6ZSAtPSBQQUdFX1NJWkU7Cgl9CgoJcmV0dXJuIG1lbTsKfQoKc3RhdGljIHZvaWQgcnZmcmVlKHZvaWQgKm1lbSwgdW5zaWduZWQgbG9uZyBzaXplKQp7Cgl1bnNpZ25lZCBsb25nIGFkcjsKCglpZiAoIW1lbSkKCQlyZXR1cm47CgoJYWRyID0gKHVuc2lnbmVkIGxvbmcpIG1lbTsKCXdoaWxlICgobG9uZykgc2l6ZSA+IDApIHsKCQlDbGVhclBhZ2VSZXNlcnZlZCh2bWFsbG9jX3RvX3BhZ2UoKHZvaWQgKilhZHIpKTsKCQlhZHIgKz0gUEFHRV9TSVpFOwoJCXNpemUgLT0gUEFHRV9TSVpFOwoJfQoJdmZyZWUobWVtKTsKfQoKc3RydWN0IHZpY2FtX2NhbWVyYSB7Cgl1MTYgc2h1dHRlcl9zcGVlZDsJLy8gY2FwdHVyZSBzaHV0dGVyIHNwZWVkCgl1MTYgZ2FpbjsJCS8vIGNhcHR1cmUgZ2FpbgoKCXU4ICpyYXdfaW1hZ2U7CQkvLyByYXcgZGF0YSBjYXB0dXJlZCBmcm9tIHRoZSBjYW1lcmEKCXU4ICpmcmFtZWJ1ZjsJCS8vIHByb2Nlc3NlZCBkYXRhIGluIFJHQjI0IGZvcm1hdAoJdTggKmNudHJsYnVmOwkJLy8gYXJlYSB1c2VkIHRvIHNlbmQgY29udHJvbCBtc2dzCgoJc3RydWN0IHZpZGVvX2RldmljZSB2ZGV2OwkvLyB2NGwgdmlkZW8gZGV2aWNlCglzdHJ1Y3QgdXNiX2RldmljZSAqdWRldjsJLy8gdXNiIGRldmljZQoKCS8qIGd1YXJkIGFnYWluc3Qgc2ltdWx0YW5lb3VzIGFjY2Vzc2VzIHRvIHRoZSBjYW1lcmEgKi8KCXN0cnVjdCBtdXRleCBjYW1fbG9jazsKCglpbnQgaXNfaW5pdGlhbGl6ZWQ7Cgl1OCBvcGVuX2NvdW50OwoJdTggYnVsa0VuZHBvaW50OwoJaW50IG5lZWRzRHVtbXlSZWFkOwoKI2lmIGRlZmluZWQoQ09ORklHX1ZJREVPX1BST0NfRlMpCglzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnByb2NfZGlyOwojZW5kaWYKCn07CgpzdGF0aWMgaW50IHZpY2FtX3Byb2JlKCBzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiwgY29uc3Qgc3RydWN0IHVzYl9kZXZpY2VfaWQgKmlkKTsKc3RhdGljIHZvaWQgdmljYW1fZGlzY29ubmVjdChzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50Zik7CnN0YXRpYyB2b2lkIHJlYWRfZnJhbWUoc3RydWN0IHZpY2FtX2NhbWVyYSAqY2FtLCBpbnQgZnJhbWVudW0pOwpzdGF0aWMgdm9pZCB2aWNhbV9kZWNvZGVfY29sb3IoY29uc3QgdTggKiwgdTggKik7CgpzdGF0aWMgaW50IF9fc2VuZF9jb250cm9sX21zZyhzdHJ1Y3QgdmljYW1fY2FtZXJhICpjYW0sCgkJCSAgICAgIHU4IHJlcXVlc3QsCgkJCSAgICAgIHUxNiB2YWx1ZSwKCQkJICAgICAgdTE2IGluZGV4LAoJCQkgICAgICB1bnNpZ25lZCBjaGFyICpjcCwKCQkJICAgICAgdTE2IHNpemUpCnsKCWludCBzdGF0dXM7CgoJLyogY3AgbXVzdCBiZSBtZW1vcnkgdGhhdCBoYXMgYmVlbiBhbGxvY2F0ZWQgYnkga21hbGxvYyAqLwoKCXN0YXR1cyA9IHVzYl9jb250cm9sX21zZyhjYW0tPnVkZXYsCgkJCQkgdXNiX3NuZGN0cmxwaXBlKGNhbS0+dWRldiwgMCksCgkJCQkgcmVxdWVzdCwKCQkJCSBVU0JfRElSX09VVCB8IFVTQl9UWVBFX1ZFTkRPUiB8CgkJCQkgVVNCX1JFQ0lQX0RFVklDRSwgdmFsdWUsIGluZGV4LAoJCQkJIGNwLCBzaXplLCAxMDAwKTsKCglzdGF0dXMgPSBtaW4oc3RhdHVzLCAwKTsKCglpZiAoc3RhdHVzIDwgMCkgewoJCXByaW50ayhLRVJOX0lORk8gIkZhaWxlZCBzZW5kaW5nIGNvbnRyb2wgbWVzc2FnZSwgZXJyb3IgJWQuXG4iLAoJCSAgICAgICBzdGF0dXMpOwoJfQoKCXJldHVybiBzdGF0dXM7Cn0KCnN0YXRpYyBpbnQgc2VuZF9jb250cm9sX21zZyhzdHJ1Y3QgdmljYW1fY2FtZXJhICpjYW0sCgkJCSAgICB1OCByZXF1ZXN0LAoJCQkgICAgdTE2IHZhbHVlLAoJCQkgICAgdTE2IGluZGV4LAoJCQkgICAgdW5zaWduZWQgY2hhciAqY3AsCgkJCSAgICB1MTYgc2l6ZSkKewoJaW50IHN0YXR1cyA9IC1FTk9ERVY7CgltdXRleF9sb2NrKCZjYW0tPmNhbV9sb2NrKTsKCWlmIChjYW0tPnVkZXYpIHsKCQlzdGF0dXMgPSBfX3NlbmRfY29udHJvbF9tc2coY2FtLCByZXF1ZXN0LCB2YWx1ZSwKCQkJCQkgICAgaW5kZXgsIGNwLCBzaXplKTsKCX0KCW11dGV4X3VubG9jaygmY2FtLT5jYW1fbG9jayk7CglyZXR1cm4gc3RhdHVzOwp9CnN0YXRpYyBpbnQKaW5pdGlhbGl6ZV9jYW1lcmEoc3RydWN0IHZpY2FtX2NhbWVyYSAqY2FtKQp7Cgljb25zdCBzdHJ1Y3QgewoJCXU4ICpkYXRhOwoJCXUzMiBzaXplOwoJfSBmaXJtd2FyZVtdID0gewoJCXsgLmRhdGEgPSBzZXR1cDEsIC5zaXplID0gc2l6ZW9mKHNldHVwMSkgfSwKCQl7IC5kYXRhID0gc2V0dXAyLCAuc2l6ZSA9IHNpemVvZihzZXR1cDIpIH0sCgkJeyAuZGF0YSA9IHNldHVwMywgLnNpemUgPSBzaXplb2Yoc2V0dXAzKSB9LAoJCXsgLmRhdGEgPSBzZXR1cDQsIC5zaXplID0gc2l6ZW9mKHNldHVwNCkgfSwKCQl7IC5kYXRhID0gc2V0dXA1LCAuc2l6ZSA9IHNpemVvZihzZXR1cDUpIH0sCgkJeyAuZGF0YSA9IHNldHVwMywgLnNpemUgPSBzaXplb2Yoc2V0dXAzKSB9LAoJCXsgLmRhdGEgPSBOVUxMLCAuc2l6ZSA9IDAgfQoJfTsKCglpbnQgZXJyLCBpOwoKCWZvciAoaSA9IDAsIGVyciA9IDA7IGZpcm13YXJlW2ldLmRhdGEgJiYgIWVycjsgaSsrKSB7CgkJbWVtY3B5KGNhbS0+Y250cmxidWYsIGZpcm13YXJlW2ldLmRhdGEsIGZpcm13YXJlW2ldLnNpemUpOwoKCQllcnIgPSBzZW5kX2NvbnRyb2xfbXNnKGNhbSwgMHhmZiwgMCwgMCwKCQkJCSAgICAgICBjYW0tPmNudHJsYnVmLCBmaXJtd2FyZVtpXS5zaXplKTsKCX0KCglyZXR1cm4gZXJyOwp9CgpzdGF0aWMgaW50CnNldF9jYW1lcmFfcG93ZXIoc3RydWN0IHZpY2FtX2NhbWVyYSAqY2FtLCBpbnQgc3RhdGUpCnsKCWludCBzdGF0dXM7CgoJaWYgKChzdGF0dXMgPSBzZW5kX2NvbnRyb2xfbXNnKGNhbSwgMHg1MCwgc3RhdGUsIDAsIE5VTEwsIDApKSA8IDApCgkJcmV0dXJuIHN0YXR1czsKCglpZiAoc3RhdGUpIHsKCQlzZW5kX2NvbnRyb2xfbXNnKGNhbSwgMHg1NSwgMSwgMCwgTlVMTCwgMCk7Cgl9CgoJcmV0dXJuIDA7Cn0KCnN0YXRpYyBpbnQKdmljYW1faW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBpb2N0bG5yLCB1bnNpZ25lZCBsb25nIGFyZykKewoJdm9pZCBfX3VzZXIgKnVzZXJfYXJnID0gKHZvaWQgX191c2VyICopYXJnOwoJc3RydWN0IHZpY2FtX2NhbWVyYSAqY2FtID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwoJaW50IHJldHZhbCA9IDA7CgoJaWYgKCFjYW0pCgkJcmV0dXJuIC1FTk9ERVY7CgoJc3dpdGNoIChpb2N0bG5yKSB7CgkJLyogcXVlcnkgY2FwYWJpbGl0aWVzICovCgljYXNlIFZJRElPQ0dDQVA6CgkJewoJCQlzdHJ1Y3QgdmlkZW9fY2FwYWJpbGl0eSBiOwoKCQkJREJHKCJWSURJT0NHQ0FQXG4iKTsKCQkJbWVtc2V0KCZiLCAwLCBzaXplb2YoYikpOwoJCQlzdHJjcHkoYi5uYW1lLCAiVmlDYW0tYmFzZWQgQ2FtZXJhIik7CgkJCWIudHlwZSA9IFZJRF9UWVBFX0NBUFRVUkU7CgkJCWIuY2hhbm5lbHMgPSAxOwoJCQliLmF1ZGlvcyA9IDA7CgkJCWIubWF4d2lkdGggPSAzMjA7CS8qIFZJREVPU0laRV9DSUYgKi8KCQkJYi5tYXhoZWlnaHQgPSAyNDA7CgkJCWIubWlud2lkdGggPSAzMjA7CS8qIFZJREVPU0laRV80OF80OCAqLwoJCQliLm1pbmhlaWdodCA9IDI0MDsKCgkJCWlmIChjb3B5X3RvX3VzZXIodXNlcl9hcmcsICZiLCBzaXplb2YoYikpKQoJCQkJcmV0dmFsID0gLUVGQVVMVDsKCgkJCWJyZWFrOwoJCX0KCQkvKiBnZXQvc2V0IHZpZGVvIHNvdXJjZSAtIHdlIGFyZSBhIGNhbWVyYSBhbmQgbm90aGluZyBlbHNlICovCgljYXNlIFZJRElPQ0dDSEFOOgoJCXsKCQkJc3RydWN0IHZpZGVvX2NoYW5uZWwgdjsKCgkJCURCRygiVklESU9DR0NIQU5cbiIpOwoJCQlpZiAoY29weV9mcm9tX3VzZXIoJnYsIHVzZXJfYXJnLCBzaXplb2YodikpKSB7CgkJCQlyZXR2YWwgPSAtRUZBVUxUOwoJCQkJYnJlYWs7CgkJCX0KCQkJaWYgKHYuY2hhbm5lbCAhPSAwKSB7CgkJCQlyZXR2YWwgPSAtRUlOVkFMOwoJCQkJYnJlYWs7CgkJCX0KCgkJCXYuY2hhbm5lbCA9IDA7CgkJCXN0cmNweSh2Lm5hbWUsICJDYW1lcmEiKTsKCQkJdi50dW5lcnMgPSAwOwoJCQl2LmZsYWdzID0gMDsKCQkJdi50eXBlID0gVklERU9fVFlQRV9DQU1FUkE7CgkJCXYubm9ybSA9IDA7CgoJCQlpZiAoY29weV90b191c2VyKHVzZXJfYXJnLCAmdiwgc2l6ZW9mKHYpKSkKCQkJCXJldHZhbCA9IC1FRkFVTFQ7CgkJCWJyZWFrOwoJCX0KCgljYXNlIFZJRElPQ1NDSEFOOgoJCXsKCQkJaW50IHY7CgoJCQlpZiAoY29weV9mcm9tX3VzZXIoJnYsIHVzZXJfYXJnLCBzaXplb2YodikpKQoJCQkJcmV0dmFsID0gLUVGQVVMVDsKCQkJREJHKCJWSURJT0NTQ0hBTiAlZFxuIiwgdik7CgoJCQlpZiAocmV0dmFsID09IDAgJiYgdiAhPSAwKQoJCQkJcmV0dmFsID0gLUVJTlZBTDsKCgkJCWJyZWFrOwoJCX0KCgkJLyogaW1hZ2UgcHJvcGVydGllcyAqLwoJY2FzZSBWSURJT0NHUElDVDoKCQl7CgkJCXN0cnVjdCB2aWRlb19waWN0dXJlIHZwOwoJCQlEQkcoIlZJRElPQ0dQSUNUXG4iKTsKCQkJbWVtc2V0KCZ2cCwgMCwgc2l6ZW9mIChzdHJ1Y3QgdmlkZW9fcGljdHVyZSkpOwoJCQl2cC5icmlnaHRuZXNzID0gY2FtLT5nYWluIDw8IDg7CgkJCXZwLmRlcHRoID0gMjQ7CgkJCXZwLnBhbGV0dGUgPSBWSURFT19QQUxFVFRFX1JHQjI0OwoJCQlpZiAoY29weV90b191c2VyKHVzZXJfYXJnLCAmdnAsIHNpemVvZiAoc3RydWN0IHZpZGVvX3BpY3R1cmUpKSkKCQkJCXJldHZhbCA9IC1FRkFVTFQ7CgkJCWJyZWFrOwoJCX0KCgljYXNlIFZJRElPQ1NQSUNUOgoJCXsKCQkJc3RydWN0IHZpZGVvX3BpY3R1cmUgdnA7CgkJCQoJCQlpZiAoY29weV9mcm9tX3VzZXIoJnZwLCB1c2VyX2FyZywgc2l6ZW9mKHZwKSkpIHsKCQkJCXJldHZhbCA9IC1FRkFVTFQ7CgkJCQlicmVhazsKCQkJfQoJCQkKCQkJREJHKCJWSURJT0NTUElDVCBkZXB0aCA9ICVkLCBwYWwgPSAlZFxuIiwgdnAuZGVwdGgsCgkJCSAgICB2cC5wYWxldHRlKTsKCgkJCWNhbS0+Z2FpbiA9IHZwLmJyaWdodG5lc3MgPj4gODsKCgkJCWlmICh2cC5kZXB0aCAhPSAyNAoJCQkgICAgfHwgdnAucGFsZXR0ZSAhPSBWSURFT19QQUxFVFRFX1JHQjI0KQoJCQkJcmV0dmFsID0gLUVJTlZBTDsKCgkJCWJyZWFrOwoJCX0KCgkJLyogZ2V0L3NldCBjYXB0dXJlIHdpbmRvdyAqLwoJY2FzZSBWSURJT0NHV0lOOgoJCXsKCQkJc3RydWN0IHZpZGVvX3dpbmRvdyB2dzsKCQkJdncueCA9IDA7CgkJCXZ3LnkgPSAwOwoJCQl2dy53aWR0aCA9IDMyMDsKCQkJdncuaGVpZ2h0ID0gMjQwOwoJCQl2dy5jaHJvbWFrZXkgPSAwOwoJCQl2dy5mbGFncyA9IDA7CgkJCXZ3LmNsaXBzID0gTlVMTDsKCQkJdncuY2xpcGNvdW50ID0gMDsKCgkJCURCRygiVklESU9DR1dJTlxuIik7CgoJCQlpZiAoY29weV90b191c2VyKHVzZXJfYXJnLCAodm9pZCAqKSZ2dywgc2l6ZW9mKHZ3KSkpCgkJCQlyZXR2YWwgPSAtRUZBVUxUOwoKCQkJLy8gSSdtIG5vdCBzdXJlIHdoYXQgdGhlIGRlYWwgd2l0aCBhIGNhcHR1cmUgd2luZG93IGlzLCBpdCBpcyB2ZXJ5IHBvb3JseSBkZXNjcmliZWQKCQkJLy8gaW4gdGhlIGRvYy4gIFNvIEkgd29uJ3Qgc3VwcG9ydCBpdCBub3cuCgkJCWJyZWFrOwoJCX0KCgljYXNlIFZJRElPQ1NXSU46CgkJewoKCQkJc3RydWN0IHZpZGVvX3dpbmRvdyB2dzsKCgkJCWlmIChjb3B5X2Zyb21fdXNlcigmdncsIHVzZXJfYXJnLCBzaXplb2YodncpKSkgewoJCQkJcmV0dmFsID0gLUVGQVVMVDsKCQkJCWJyZWFrOwoJCQl9CgoJCQlEQkcoIlZJRElPQ1NXSU4gJWQgeCAlZFxuIiwgdncud2lkdGgsIHZ3LmhlaWdodCk7CgkJCQoJCQlpZiAoIHZ3LndpZHRoICE9IDMyMCB8fCB2dy5oZWlnaHQgIT0gMjQwICkKCQkJCXJldHZhbCA9IC1FRkFVTFQ7CgoJCQlicmVhazsKCQl9CgoJCS8qIG1tYXAgaW50ZXJmYWNlICovCgljYXNlIFZJRElPQ0dNQlVGOgoJCXsKCQkJc3RydWN0IHZpZGVvX21idWYgdm07CgkJCWludCBpOwoKCQkJREJHKCJWSURJT0NHTUJVRlxuIik7CgkJCW1lbXNldCgmdm0sIDAsIHNpemVvZiAodm0pKTsKCQkJdm0uc2l6ZSA9CgkJCSAgICBWSUNBTV9NQVhfRlJBTUVfU0laRSAqIFZJQ0FNX0ZSQU1FUzsKCQkJdm0uZnJhbWVzID0gVklDQU1fRlJBTUVTOwoJCQlmb3IgKGkgPSAwOyBpIDwgVklDQU1fRlJBTUVTOyBpKyspCgkJCQl2bS5vZmZzZXRzW2ldID0gVklDQU1fTUFYX0ZSQU1FX1NJWkUgKiBpOwoKCQkJaWYgKGNvcHlfdG9fdXNlcih1c2VyX2FyZywgKHZvaWQgKikmdm0sIHNpemVvZih2bSkpKQoJCQkJcmV0dmFsID0gLUVGQVVMVDsKCgkJCWJyZWFrOwoJCX0KCgljYXNlIFZJRElPQ01DQVBUVVJFOgoJCXsKCQkJc3RydWN0IHZpZGVvX21tYXAgdm07CgkJCS8vIGludCB2aWRlb19zaXplOwoKCQkJaWYgKGNvcHlfZnJvbV91c2VyKCh2b2lkICopJnZtLCB1c2VyX2FyZywgc2l6ZW9mKHZtKSkpIHsKCQkJCXJldHZhbCA9IC1FRkFVTFQ7CgkJCQlicmVhazsKCQkJfQoKCQkJREJHKCJWSURJT0NNQ0FQVFVSRSBmcmFtZT0lZCwgaGVpZ2h0PSVkLCB3aWR0aD0lZCwgZm9ybWF0PSVkLlxuIix2bS5mcmFtZSx2bS53aWR0aCx2bS5oZWlnaHQsdm0uZm9ybWF0KTsKCgkJCWlmICggdm0uZnJhbWUgPj0gVklDQU1fRlJBTUVTIHx8IHZtLmZvcm1hdCAhPSBWSURFT19QQUxFVFRFX1JHQjI0ICkKCQkJCXJldHZhbCA9IC1FSU5WQUw7CgoJCQkvLyBpbiB0aGVvcnkgcmlnaHQgaGVyZSB3ZSdkIHN0YXJ0IHRoZSBpbWFnZSBjYXB0dXJpbmcKCQkJLy8gKGZpbGwgaW4gYSBidWxrIHVyYiBhbmQgc3VibWl0IGl0IGFzeW5jaHJvbm91c2x5KQoJCQkvLwoJCQkvLyBJbnN0ZWFkIHdlJ3JlIGdvaW5nIHRvIGRvIGEgdG90YWwgaGFjayBqb2IgZm9yIG5vdyBhbmQKCQkJLy8gcmV0cmlldmUgdGhlIGZyYW1lIGluIFZJRElPQ1NZTkMKCgkJCWJyZWFrOwoJCX0KCgljYXNlIFZJRElPQ1NZTkM6CgkJewoJCQlpbnQgZnJhbWU7CgoJCQlpZiAoY29weV9mcm9tX3VzZXIoKHZvaWQgKikmZnJhbWUsIHVzZXJfYXJnLCBzaXplb2YoaW50KSkpIHsKCQkJCXJldHZhbCA9IC1FRkFVTFQ7CgkJCQlicmVhazsKCQkJfQoJCQlEQkcoIlZJRElPQ1NZTkM6ICVkXG4iLCBmcmFtZSk7CgoJCQlyZWFkX2ZyYW1lKGNhbSwgZnJhbWUpOwoJCQl2aWNhbV9kZWNvZGVfY29sb3IoY2FtLT5yYXdfaW1hZ2UsCgkJCQkJICAgY2FtLT5mcmFtZWJ1ZiArCgkJCQkJICAgZnJhbWUgKiBWSUNBTV9NQVhfRlJBTUVfU0laRSApOwoKCQkJYnJlYWs7CgkJfQoKCQkvKiBwb2ludGxlc3MgdG8gaW1wbGVtZW50IG92ZXJsYXkgd2l0aCB0aGlzIGNhbWVyYSAqLwoJY2FzZSBWSURJT0NDQVBUVVJFOgoJY2FzZSBWSURJT0NHRkJVRjoKCWNhc2UgVklESU9DU0ZCVUY6CgljYXNlIFZJRElPQ0tFWToKCQlyZXR2YWwgPSAtRUlOVkFMOwoJCWJyZWFrOwoKCQkvKiB0dW5lciBpbnRlcmZhY2UgLSB3ZSBoYXZlIG5vbmUgKi8KCWNhc2UgVklESU9DR1RVTkVSOgoJY2FzZSBWSURJT0NTVFVORVI6CgljYXNlIFZJRElPQ0dGUkVROgoJY2FzZSBWSURJT0NTRlJFUToKCQlyZXR2YWwgPSAtRUlOVkFMOwoJCWJyZWFrOwoKCQkvKiBhdWRpbyBpbnRlcmZhY2UgLSB3ZSBoYXZlIG5vbmUgKi8KCWNhc2UgVklESU9DR0FVRElPOgoJY2FzZSBWSURJT0NTQVVESU86CgkJcmV0dmFsID0gLUVJTlZBTDsKCQlicmVhazsKCWRlZmF1bHQ6CgkJcmV0dmFsID0gLUVOT0lPQ1RMQ01EOwoJCWJyZWFrOwoJfQoKCXJldHVybiByZXR2YWw7Cn0KCnN0YXRpYyBpbnQKdmljYW1fb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKewoJc3RydWN0IHZpZGVvX2RldmljZSAqZGV2ID0gdmlkZW9fZGV2ZGF0YShmaWxlKTsKCXN0cnVjdCB2aWNhbV9jYW1lcmEgKmNhbSA9CgkgICAgKHN0cnVjdCB2aWNhbV9jYW1lcmEgKikgZGV2LT5wcml2OwoJREJHKCJvcGVuXG4iKTsKCglpZiAoIWNhbSkgewoJCXByaW50ayhLRVJOX0VSUgoJCSAgICAgICAidmljYW0gdmlkZW9fZGV2aWNlIGltcHJvcGVybHkgaW5pdGlhbGl6ZWQiKTsKCQlyZXR1cm4gLUVJTlZBTDsKCX0KCgkvKiB0aGUgdmlkZW9kZXZfbG9jayBoZWxkIGFib3ZlIHVzIHByb3RlY3RzIHVzIGZyb20KCSAqIHNpbXVsdGFuZW91cyBvcGVucy4uLmZvciBub3cuIHdlIHByb2JhYmx5IHNob3VsZG4ndAoJICogcmVseSBvbiB0aGlzIGZhY3QgZm9yZXZlci4KCSAqLwoKCWlmIChjYW0tPm9wZW5fY291bnQgPiAwKSB7CgkJcHJpbnRrKEtFUk5fSU5GTwoJCSAgICAgICAidmljYW1fb3BlbiBjYWxsZWQgb24gYWxyZWFkeSBvcGVuZWQgY2FtZXJhIik7CgkJcmV0dXJuIC1FQlVTWTsKCX0KCgljYW0tPnJhd19pbWFnZSA9IGttYWxsb2MoVklDQU1fTUFYX1JFQURfU0laRSwgR0ZQX0tFUk5FTCk7CglpZiAoIWNhbS0+cmF3X2ltYWdlKSB7CgkJcmV0dXJuIC1FTk9NRU07Cgl9CgoJY2FtLT5mcmFtZWJ1ZiA9IHJ2bWFsbG9jKFZJQ0FNX01BWF9GUkFNRV9TSVpFICogVklDQU1fRlJBTUVTKTsKCWlmICghY2FtLT5mcmFtZWJ1ZikgewoJCWtmcmVlKGNhbS0+cmF3X2ltYWdlKTsKCQlyZXR1cm4gLUVOT01FTTsKCX0KCgljYW0tPmNudHJsYnVmID0ga21hbGxvYyhQQUdFX1NJWkUsIEdGUF9LRVJORUwpOwoJaWYgKCFjYW0tPmNudHJsYnVmKSB7CgkJa2ZyZWUoY2FtLT5yYXdfaW1hZ2UpOwoJCXJ2ZnJlZShjYW0tPmZyYW1lYnVmLCBWSUNBTV9NQVhfRlJBTUVfU0laRSAqIFZJQ0FNX0ZSQU1FUyk7CgkJcmV0dXJuIC1FTk9NRU07Cgl9CgoJLy8gRmlyc3QgdXBsb2FkIGZpcm13YXJlLCB0aGVuIHR1cm4gdGhlIGNhbWVyYSBvbgoKCWlmICghY2FtLT5pc19pbml0aWFsaXplZCkgewoJCWluaXRpYWxpemVfY2FtZXJhKGNhbSk7CgoJCWNhbS0+aXNfaW5pdGlhbGl6ZWQgPSAxOwoJfQoKCXNldF9jYW1lcmFfcG93ZXIoY2FtLCAxKTsKCgljYW0tPm5lZWRzRHVtbXlSZWFkID0gMTsKCWNhbS0+b3Blbl9jb3VudCsrOwoKCWZpbGUtPnByaXZhdGVfZGF0YSA9IGNhbTsJCgkKCXJldHVybiAwOwp9CgpzdGF0aWMgaW50IAp2aWNhbV9jbG9zZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKewoJc3RydWN0IHZpY2FtX2NhbWVyYSAqY2FtID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwoJaW50IG9wZW5fY291bnQ7CglzdHJ1Y3QgdXNiX2RldmljZSAqdWRldjsKCglEQkcoImNsb3NlXG4iKTsKCgkvKiBpdCdzIG5vdCB0aGUgZW5kIG9mIHRoZSB3b3JsZCBpZgoJICogd2UgZmFpbCB0byB0dXJuIHRoZSBjYW1lcmEgb2ZmLgoJICovCgoJc2V0X2NhbWVyYV9wb3dlcihjYW0sIDApOwoKCWtmcmVlKGNhbS0+cmF3X2ltYWdlKTsKCXJ2ZnJlZShjYW0tPmZyYW1lYnVmLCBWSUNBTV9NQVhfRlJBTUVfU0laRSAqIFZJQ0FNX0ZSQU1FUyk7CglrZnJlZShjYW0tPmNudHJsYnVmKTsKCgltdXRleF9sb2NrKCZjYW0tPmNhbV9sb2NrKTsKCgljYW0tPm9wZW5fY291bnQtLTsKCW9wZW5fY291bnQgPSBjYW0tPm9wZW5fY291bnQ7Cgl1ZGV2ID0gY2FtLT51ZGV2OwoKCW11dGV4X3VubG9jaygmY2FtLT5jYW1fbG9jayk7CgoJaWYgKCFvcGVuX2NvdW50ICYmICF1ZGV2KSB7CgkJa2ZyZWUoY2FtKTsKCX0KCglyZXR1cm4gMDsKfQoKc3RhdGljIHZvaWQgdmljYW1fZGVjb2RlX2NvbG9yKGNvbnN0IHU4ICpkYXRhLCB1OCAqcmdiKQp7CgkvKiB2aWNhbV9kZWNvZGVfY29sb3IgLSBDb252ZXJ0IGZyb20gVmljYW0gWS1Dci1DYiB0byBSR0IKCSAqIENvcHlyaWdodCAoQykgMjAwMiBNb25yb2UgV2lsbGlhbXMgKG1vbnJvZUBwb2JveC5jb20pCgkgKi8KCglpbnQgaSwgcHJldlksIG5leHRZOwoKCXByZXZZID0gNTEyOwoJbmV4dFkgPSA1MTI7CgoJZGF0YSArPSBWSUNBTV9IRUFERVJfU0laRTsKCglmb3IoIGkgPSAwOyBpIDwgMjQwOyBpKyssIGRhdGEgKz0gNTEyICkgewoJCWNvbnN0IGludCB5ID0gKCBpICogMjQyICkgLyAyNDA7CgoJCWludCBqLCBwcmV2WCwgbmV4dFg7CgkJaW50IFksIENyLCBDYjsKCgkJaWYgKCB5ID09IDI0MiAtIDEgKSB7CgkJCW5leHRZID0gLTUxMjsKCQl9CgoJCXByZXZYID0gMTsKCQluZXh0WCA9IDE7CgoJCWZvciAoIGogPSAwOyBqIDwgMzIwOyBqKyssIHJnYiArPSAzICkgewoJCQljb25zdCBpbnQgeCA9ICggaiAqIDUxMiApIC8gMzIwOwoJCQljb25zdCB1OCAqIGNvbnN0IHNyYyA9ICZkYXRhW3hdOwoKCQkJaWYgKCB4ID09IDUxMiAtIDEgKSB7CgkJCQluZXh0WCA9IC0xOwoJCQl9CgoJCQlDciA9ICggc3JjW3ByZXZYXSAtIHNyY1swXSApICsKCQkJCSggc3JjW25leHRYXSAtIHNyY1swXSApOwoJCQlDciAvPSAyOwoKCQkJQ2IgPSAoIHNyY1twcmV2WV0gLSBzcmNbcHJldlggKyBwcmV2WV0gKSArCgkJCQkoIHNyY1twcmV2WV0gLSBzcmNbbmV4dFggKyBwcmV2WV0gKSArCgkJCQkoIHNyY1tuZXh0WV0gLSBzcmNbcHJldlggKyBuZXh0WV0gKSArCgkJCQkoIHNyY1tuZXh0WV0gLSBzcmNbbmV4dFggKyBuZXh0WV0gKTsKCQkJQ2IgLz0gNDsKCgkJCVkgPSAxMTYwICogKCBzcmNbMF0gKyAoIENyIC8gMiApIC0gMTYgKTsKCgkJCWlmICggaSAmIDEgKSB7CgkJCQlpbnQgQ3QgPSBDcjsKCQkJCUNyID0gQ2I7CgkJCQlDYiA9IEN0OwoJCQl9CgoJCQlpZiAoICggeCBeIGkgKSAmIDEgKSB7CgkJCQlDciA9IC1DcjsKCQkJCUNiID0gLUNiOwoJCQl9CgoJCQlyZ2JbMF0gPSBjbGFtcCggKCAoIFkgKyAoIDIwMTcgKiBDYiApICkgKwoJCQkJCTUwMCApIC8gOTAwLCAwLCAyNTUgKTsKCQkJcmdiWzFdID0gY2xhbXAoICggKCBZIC0gKCAzOTIgKiBDYiApIC0KCQkJCQkgICggODEzICogQ3IgKSApICsKCQkJCQkgIDUwMCApIC8gMTAwMCwgMCwgMjU1ICk7CgkJCXJnYlsyXSA9IGNsYW1wKCAoICggWSArICggMTU5NCAqIENyICkgKSArCgkJCQkJNTAwICkgLyAxMzAwLCAwLCAyNTUgKTsKCgkJCXByZXZYID0gLTE7CgkJfQoKCQlwcmV2WSA9IC01MTI7Cgl9Cn0KCnN0YXRpYyB2b2lkCnJlYWRfZnJhbWUoc3RydWN0IHZpY2FtX2NhbWVyYSAqY2FtLCBpbnQgZnJhbWVudW0pCnsKCXVuc2lnbmVkIGNoYXIgKnJlcXVlc3QgPSBjYW0tPmNudHJsYnVmOwoJaW50IHJlYWxTaHV0dGVyOwoJaW50IG47CglpbnQgYWN0dWFsX2xlbmd0aDsKCglpZiAoY2FtLT5uZWVkc0R1bW15UmVhZCkgewoJCWNhbS0+bmVlZHNEdW1teVJlYWQgPSAwOwoJCXJlYWRfZnJhbWUoY2FtLCBmcmFtZW51bSk7Cgl9CgoJbWVtc2V0KHJlcXVlc3QsIDAsIDE2KTsKCXJlcXVlc3RbMF0gPSBjYW0tPmdhaW47CS8vIDAgPSAwJSBnYWluLCBGRiA9IDEwMCUgZ2FpbgoKCXJlcXVlc3RbMV0gPSAwOwkvLyA1MTJ4MjQyIGNhcHR1cmUKCglyZXF1ZXN0WzJdID0gMHg5MDsJLy8gdGhlIGZ1bmN0aW9uIG9mIHRoZXNlIHR3byBieXRlcwoJcmVxdWVzdFszXSA9IDB4MDc7CS8vIGlzIG5vdCB5ZXQgdW5kZXJzdG9vZAoKCWlmIChjYW0tPnNodXR0ZXJfc3BlZWQgPiA2MCkgewoJCS8vIFNob3J0IGV4cG9zdXJlCgkJcmVhbFNodXR0ZXIgPQoJCSAgICAoKC0xNTYzMTkwMCAvIGNhbS0+c2h1dHRlcl9zcGVlZCkgKyAyNjA1MzMpIC8gMTAwMDsKCQlyZXF1ZXN0WzRdID0gcmVhbFNodXR0ZXIgJiAweEZGOwoJCXJlcXVlc3RbNV0gPSAocmVhbFNodXR0ZXIgPj4gOCkgJiAweEZGOwoJCXJlcXVlc3RbNl0gPSAweDAzOwoJCXJlcXVlc3RbN10gPSAweDAxOwoJfSBlbHNlIHsKCQkvLyBMb25nIGV4cG9zdXJlCgkJcmVhbFNodXR0ZXIgPSAxNTYwMCAvIGNhbS0+c2h1dHRlcl9zcGVlZCAtIDE7CgkJcmVxdWVzdFs0XSA9IDA7CgkJcmVxdWVzdFs1XSA9IDA7CgkJcmVxdWVzdFs2XSA9IHJlYWxTaHV0dGVyICYgMHhGRjsKCQlyZXF1ZXN0WzddID0gcmVhbFNodXR0ZXIgPj4gODsKCX0KCgkvLyBQZXIgSm9obiBNYXJrdXMgQmr4cm5kYWxlbiwgYnl0ZSBhdCBpbmRleCA4IGNhdXNlcyBwcm9ibGVtcyBpZiBpdCBpc24ndCAwCglyZXF1ZXN0WzhdID0gMDsKCS8vIGJ5dGVzIDktMTUgZG8gbm90IHNlZW0gdG8gYWZmZWN0IGV4cG9zdXJlIG9yIGltYWdlIHF1YWxpdHkKCgltdXRleF9sb2NrKCZjYW0tPmNhbV9sb2NrKTsKCglpZiAoIWNhbS0+dWRldikgewoJCWdvdG8gZG9uZTsKCX0KCgluID0gX19zZW5kX2NvbnRyb2xfbXNnKGNhbSwgMHg1MSwgMHg4MCwgMCwgcmVxdWVzdCwgMTYpOwoKCWlmIChuIDwgMCkgewoJCXByaW50ayhLRVJOX0VSUgoJCSAgICAgICAiIFByb2JsZW0gc2VuZGluZyBmcmFtZSBjYXB0dXJlIGNvbnRyb2wgbWVzc2FnZSIpOwoJCWdvdG8gZG9uZTsKCX0KCgluID0gdXNiX2J1bGtfbXNnKGNhbS0+dWRldiwKCQkJIHVzYl9yY3ZidWxrcGlwZShjYW0tPnVkZXYsIGNhbS0+YnVsa0VuZHBvaW50KSwKCQkJIGNhbS0+cmF3X2ltYWdlLAoJCQkgNTEyICogMjQyICsgMTI4LCAmYWN0dWFsX2xlbmd0aCwgMTAwMDApOwoKCWlmIChuIDwgMCkgewoJCXByaW50ayhLRVJOX0VSUiAiUHJvYmxlbSBkdXJpbmcgYnVsayByZWFkIG9mIGZyYW1lIGRhdGE6ICVkXG4iLAoJCSAgICAgICBuKTsKCX0KCiBkb25lOgoJbXV0ZXhfdW5sb2NrKCZjYW0tPmNhbV9sb2NrKTsKfQoKc3RhdGljIHNzaXplX3QKdmljYW1fcmVhZCggc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWYsIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zICkKewoJc3RydWN0IHZpY2FtX2NhbWVyYSAqY2FtID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwoKCURCRygicmVhZCAlZCBieXRlcy5cbiIsIChpbnQpIGNvdW50KTsKCglpZiAoKnBwb3MgPj0gVklDQU1fTUFYX0ZSQU1FX1NJWkUpIHsKCQkqcHBvcyA9IDA7CgkJcmV0dXJuIDA7Cgl9CgoJaWYgKCpwcG9zID09IDApIHsKCQlyZWFkX2ZyYW1lKGNhbSwgMCk7CgkJdmljYW1fZGVjb2RlX2NvbG9yKGNhbS0+cmF3X2ltYWdlLAoJCQkJICAgY2FtLT5mcmFtZWJ1ZiArCgkJCQkgICAwICogVklDQU1fTUFYX0ZSQU1FX1NJWkUpOwoJfQoKCWNvdW50ID0gbWluX3Qoc2l6ZV90LCBjb3VudCwgVklDQU1fTUFYX0ZSQU1FX1NJWkUgLSAqcHBvcyk7CgoJaWYgKGNvcHlfdG9fdXNlcihidWYsICZjYW0tPmZyYW1lYnVmWypwcG9zXSwgY291bnQpKSB7CgkJY291bnQgPSAtRUZBVUxUOwoJfSBlbHNlIHsKCQkqcHBvcyArPSBjb3VudDsKCX0KCglpZiAoY291bnQgPT0gVklDQU1fTUFYX0ZSQU1FX1NJWkUpIHsKCQkqcHBvcyA9IDA7Cgl9CgoJcmV0dXJuIGNvdW50Owp9CgoKc3RhdGljIGludAp2aWNhbV9tbWFwKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKewoJLy8gVE9ETzogYWxsb2NhdGUgdGhlIHJhdyBmcmFtZSBidWZmZXIgaWYgbmVjZXNzYXJ5Cgl1bnNpZ25lZCBsb25nIHBhZ2UsIHBvczsKCXVuc2lnbmVkIGxvbmcgc3RhcnQgPSB2bWEtPnZtX3N0YXJ0OwoJdW5zaWduZWQgbG9uZyBzaXplICA9IHZtYS0+dm1fZW5kLXZtYS0+dm1fc3RhcnQ7CglzdHJ1Y3QgdmljYW1fY2FtZXJhICpjYW0gPSBmaWxlLT5wcml2YXRlX2RhdGE7CgoJaWYgKCFjYW0pCgkJcmV0dXJuIC1FTk9ERVY7CgoJREJHKCJ2aWNhbV9tbWFwOiAlbGRcbiIsIHNpemUpOwoKCS8qIFdlIGxldCBtbWFwIGFsbG9jYXRlIGFzIG11Y2ggYXMgaXQgd2FudHMgYmVjYXVzZSBMaW51eCB3YXMgYWRkaW5nIDIwNDggYnl0ZXMKCSAqIHRvIHRoZSBzaXplIHRoZSBhcHBsaWNhdGlvbiByZXF1ZXN0ZWQgZm9yIG1tYXAgYW5kIGl0IHdhcyBzY3Jld2luZyBhcHBzIHVwLgoJIGlmIChzaXplID4gVklDQU1fRlJBTUVTKlZJQ0FNX01BWF9GUkFNRV9TSVpFKQoJIHJldHVybiAtRUlOVkFMOwoJICovCgoJcG9zID0gKHVuc2lnbmVkIGxvbmcpY2FtLT5mcmFtZWJ1ZjsKCXdoaWxlIChzaXplID4gMCkgewoJCXBhZ2UgPSB2bWFsbG9jX3RvX3Bmbigodm9pZCAqKXBvcyk7CgkJaWYgKHJlbWFwX3Bmbl9yYW5nZSh2bWEsIHN0YXJ0LCBwYWdlLCBQQUdFX1NJWkUsIFBBR0VfU0hBUkVEKSkKCQkJcmV0dXJuIC1FQUdBSU47CgoJCXN0YXJ0ICs9IFBBR0VfU0laRTsKCQlwb3MgKz0gUEFHRV9TSVpFOwoJCWlmIChzaXplID4gUEFHRV9TSVpFKQoJCQlzaXplIC09IFBBR0VfU0laRTsKCQllbHNlCgkJCXNpemUgPSAwOwoJfQoKCXJldHVybiAwOwp9CgojaWYgZGVmaW5lZChDT05GSUdfVklERU9fUFJPQ19GUykKCnN0YXRpYyBzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnZpY2FtX3Byb2Nfcm9vdCA9IE5VTEw7CgpzdGF0aWMgaW50IHZpY2FtX3JlYWRfaGVscGVyKGNoYXIgKnBhZ2UsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2ZmLAoJCQkJaW50IGNvdW50LCBpbnQgKmVvZiwgaW50IHZhbHVlKQp7CgljaGFyICpvdXQgPSBwYWdlOwoJaW50IGxlbjsKCglvdXQgKz0gc3ByaW50ZihvdXQsICIlZCIsdmFsdWUpOwoKCWxlbiA9IG91dCAtIHBhZ2U7CglsZW4gLT0gb2ZmOwoJaWYgKGxlbiA8IGNvdW50KSB7CgkJKmVvZiA9IDE7CgkJaWYgKGxlbiA8PSAwKQoJCQlyZXR1cm4gMDsKCX0gZWxzZQoJCWxlbiA9IGNvdW50OwoKCSpzdGFydCA9IHBhZ2UgKyBvZmY7CglyZXR1cm4gbGVuOwp9CgpzdGF0aWMgaW50IHZpY2FtX3JlYWRfcHJvY19zaHV0dGVyKGNoYXIgKnBhZ2UsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2ZmLAoJCQkJaW50IGNvdW50LCBpbnQgKmVvZiwgdm9pZCAqZGF0YSkKewoJcmV0dXJuIHZpY2FtX3JlYWRfaGVscGVyKHBhZ2Usc3RhcnQsb2ZmLGNvdW50LGVvZiwKCQkJCSgoc3RydWN0IHZpY2FtX2NhbWVyYSAqKWRhdGEpLT5zaHV0dGVyX3NwZWVkKTsKfQoKc3RhdGljIGludCB2aWNhbV9yZWFkX3Byb2NfZ2FpbihjaGFyICpwYWdlLCBjaGFyICoqc3RhcnQsIG9mZl90IG9mZiwKCQkJCWludCBjb3VudCwgaW50ICplb2YsIHZvaWQgKmRhdGEpCnsKCXJldHVybiB2aWNhbV9yZWFkX2hlbHBlcihwYWdlLHN0YXJ0LG9mZixjb3VudCxlb2YsCgkJCQkoKHN0cnVjdCB2aWNhbV9jYW1lcmEgKilkYXRhKS0+Z2Fpbik7Cn0KCnN0YXRpYyBpbnQKdmljYW1fd3JpdGVfcHJvY19zaHV0dGVyKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyICpidWZmZXIsCgkJCSB1bnNpZ25lZCBsb25nIGNvdW50LCB2b2lkICpkYXRhKQp7Cgl1MTYgc3RtcDsKCWNoYXIga2J1Zls4XTsKCXN0cnVjdCB2aWNhbV9jYW1lcmEgKmNhbSA9IChzdHJ1Y3QgdmljYW1fY2FtZXJhICopIGRhdGE7CgoJaWYgKGNvdW50ID4gNikKCQlyZXR1cm4gLUVJTlZBTDsKCglpZiAoY29weV9mcm9tX3VzZXIoa2J1ZiwgYnVmZmVyLCBjb3VudCkpCgkJcmV0dXJuIC1FRkFVTFQ7CgoJc3RtcCA9ICh1MTYpIHNpbXBsZV9zdHJ0b3VsKGtidWYsIE5VTEwsIDEwKTsKCWlmIChzdG1wIDwgNCB8fCBzdG1wID4gMzIwMDApCgkJcmV0dXJuIC1FSU5WQUw7CgoJY2FtLT5zaHV0dGVyX3NwZWVkID0gc3RtcDsKCglyZXR1cm4gY291bnQ7Cn0KCnN0YXRpYyBpbnQKdmljYW1fd3JpdGVfcHJvY19nYWluKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyICpidWZmZXIsCgkJICAgICAgdW5zaWduZWQgbG9uZyBjb3VudCwgdm9pZCAqZGF0YSkKewoJdTE2IGd0bXA7CgljaGFyIGtidWZbOF07CgoJc3RydWN0IHZpY2FtX2NhbWVyYSAqY2FtID0gKHN0cnVjdCB2aWNhbV9jYW1lcmEgKikgZGF0YTsKCglpZiAoY291bnQgPiA0KQoJCXJldHVybiAtRUlOVkFMOwoKCWlmIChjb3B5X2Zyb21fdXNlcihrYnVmLCBidWZmZXIsIGNvdW50KSkKCQlyZXR1cm4gLUVGQVVMVDsKCglndG1wID0gKHUxNikgc2ltcGxlX3N0cnRvdWwoa2J1ZiwgTlVMTCwgMTApOwoJaWYgKGd0bXAgPiAyNTUpCgkJcmV0dXJuIC1FSU5WQUw7CgljYW0tPmdhaW4gPSBndG1wOwoKCXJldHVybiBjb3VudDsKfQoKc3RhdGljIHZvaWQKdmljYW1fY3JlYXRlX3Byb2Nfcm9vdCh2b2lkKQp7Cgl2aWNhbV9wcm9jX3Jvb3QgPSBwcm9jX21rZGlyKCJ2aWRlby92aWNhbSIsIE5VTEwpOwoKCWlmICh2aWNhbV9wcm9jX3Jvb3QpCgkJdmljYW1fcHJvY19yb290LT5vd25lciA9IFRISVNfTU9EVUxFOwoJZWxzZQoJCXByaW50ayhLRVJOX0VSUgoJCSAgICAgICAiY291bGQgbm90IGNyZWF0ZSAvcHJvYyBlbnRyeSBmb3IgdmljYW0hIik7Cn0KCnN0YXRpYyB2b2lkCnZpY2FtX2Rlc3Ryb3lfcHJvY19yb290KHZvaWQpCnsKCWlmICh2aWNhbV9wcm9jX3Jvb3QpCgkJcmVtb3ZlX3Byb2NfZW50cnkoInZpZGVvL3ZpY2FtIiwgMCk7Cn0KCnN0YXRpYyB2b2lkCnZpY2FtX2NyZWF0ZV9wcm9jX2VudHJ5KHN0cnVjdCB2aWNhbV9jYW1lcmEgKmNhbSkKewoJY2hhciBuYW1lWzY0XTsKCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqZW50OwoKCURCRyhLRVJOX0lORk8gInZpY2FtOiBjcmVhdGluZyBwcm9jIGVudHJ5XG4iKTsKCglpZiAoIXZpY2FtX3Byb2Nfcm9vdCB8fCAhY2FtKSB7CgkJcHJpbnRrKEtFUk5fSU5GTwoJCSAgICAgICAidmljYW06IGNvdWxkIG5vdCBjcmVhdGUgcHJvYyBlbnRyeSwgJXMgcG9pbnRlciBpcyBudWxsLlxuIiwKCQkgICAgICAgKCFjYW0gPyAiY2FtZXJhIiA6ICJyb290IikpOwoJCXJldHVybjsKCX0KCglzcHJpbnRmKG5hbWUsICJ2aWRlbyVkIiwgY2FtLT52ZGV2Lm1pbm9yKTsKCgljYW0tPnByb2NfZGlyID0gcHJvY19ta2RpcihuYW1lLCB2aWNhbV9wcm9jX3Jvb3QpOwoKCWlmICggIWNhbS0+cHJvY19kaXIgKQoJCXJldHVybjsgLy8gRklYTUU6IFdlIHNob3VsZCBwcm9iYWJseSByZXR1cm4gYW4gZXJyb3IgaGVyZQoJCgllbnQgPSBjcmVhdGVfcHJvY19lbnRyeSgic2h1dHRlciIsIFNfSUZSRUcgfCBTX0lSVUdPIHwgU19JV1VTUiwKCQkJCWNhbS0+cHJvY19kaXIpOwoJaWYgKGVudCkgewoJCWVudC0+ZGF0YSA9IGNhbTsKCQllbnQtPnJlYWRfcHJvYyA9IHZpY2FtX3JlYWRfcHJvY19zaHV0dGVyOwoJCWVudC0+d3JpdGVfcHJvYyA9IHZpY2FtX3dyaXRlX3Byb2Nfc2h1dHRlcjsKCQllbnQtPnNpemUgPSA2NDsKCX0KCgllbnQgPSBjcmVhdGVfcHJvY19lbnRyeSgiZ2FpbiIsIFNfSUZSRUcgfCBTX0lSVUdPIHwgU19JV1VTUiwKCQkJCWNhbS0+cHJvY19kaXIpOwoJaWYgKGVudCkgewoJCWVudC0+ZGF0YSA9IGNhbTsKCQllbnQtPnJlYWRfcHJvYyA9IHZpY2FtX3JlYWRfcHJvY19nYWluOwoJCWVudC0+d3JpdGVfcHJvYyA9IHZpY2FtX3dyaXRlX3Byb2NfZ2FpbjsKCQllbnQtPnNpemUgPSA2NDsKCX0KfQoKc3RhdGljIHZvaWQKdmljYW1fZGVzdHJveV9wcm9jX2VudHJ5KHZvaWQgKnB0cikKewoJc3RydWN0IHZpY2FtX2NhbWVyYSAqY2FtID0gKHN0cnVjdCB2aWNhbV9jYW1lcmEgKikgcHRyOwoJY2hhciBuYW1lWzE2XTsKCglpZiAoICFjYW0tPnByb2NfZGlyICkKCQlyZXR1cm47CgoJc3ByaW50ZihuYW1lLCAidmlkZW8lZCIsIGNhbS0+dmRldi5taW5vcik7CglyZW1vdmVfcHJvY19lbnRyeSgic2h1dHRlciIsIGNhbS0+cHJvY19kaXIpOwoJcmVtb3ZlX3Byb2NfZW50cnkoImdhaW4iLCBjYW0tPnByb2NfZGlyKTsKCXJlbW92ZV9wcm9jX2VudHJ5KG5hbWUsdmljYW1fcHJvY19yb290KTsKCWNhbS0+cHJvY19kaXIgPSBOVUxMOwoKfQoKI2Vsc2UKc3RhdGljIGlubGluZSB2b2lkIHZpY2FtX2NyZWF0ZV9wcm9jX3Jvb3Qodm9pZCkgeyB9CnN0YXRpYyBpbmxpbmUgdm9pZCB2aWNhbV9kZXN0cm95X3Byb2Nfcm9vdCh2b2lkKSB7IH0Kc3RhdGljIGlubGluZSB2b2lkIHZpY2FtX2NyZWF0ZV9wcm9jX2VudHJ5KHN0cnVjdCB2aWNhbV9jYW1lcmEgKmNhbSkgeyB9CnN0YXRpYyBpbmxpbmUgdm9pZCB2aWNhbV9kZXN0cm95X3Byb2NfZW50cnkodm9pZCAqcHRyKSB7IH0KI2VuZGlmCgpzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyB2aWNhbV9mb3BzID0gewoJLm93bmVyCQk9IFRISVNfTU9EVUxFLAoJLm9wZW4JCT0gdmljYW1fb3BlbiwKCS5yZWxlYXNlCT0gdmljYW1fY2xvc2UsCgkucmVhZAkJPSB2aWNhbV9yZWFkLAoJLm1tYXAJCT0gdmljYW1fbW1hcCwKCS5pb2N0bAkJPSB2aWNhbV9pb2N0bCwKCS5jb21wYXRfaW9jdGwJPSB2NGxfY29tcGF0X2lvY3RsMzIsCgkubGxzZWVrCQk9IG5vX2xsc2VlaywKfTsKCnN0YXRpYyBzdHJ1Y3QgdmlkZW9fZGV2aWNlIHZpY2FtX3RlbXBsYXRlID0gewoJLm93bmVyIAkJPSBUSElTX01PRFVMRSwKCS5uYW1lIAkJPSAiVmlDYW0tYmFzZWQgVVNCIENhbWVyYSIsCgkudHlwZSAJCT0gVklEX1RZUEVfQ0FQVFVSRSwKCS5oYXJkd2FyZSAJPSBWSURfSEFSRFdBUkVfVklDQU0sCgkuZm9wcyAJCT0gJnZpY2FtX2ZvcHMsCgkubWlub3IgCQk9IC0xLAp9OwoKLyogdGFibGUgb2YgZGV2aWNlcyB0aGF0IHdvcmsgd2l0aCB0aGlzIGRyaXZlciAqLwpzdGF0aWMgc3RydWN0IHVzYl9kZXZpY2VfaWQgdmljYW1fdGFibGVbXSA9IHsKCXtVU0JfREVWSUNFKFVTQl9WSUNBTV9WRU5ET1JfSUQsIFVTQl9WSUNBTV9QUk9EVUNUX0lEKX0sCgl7fQkJCS8qIFRlcm1pbmF0aW5nIGVudHJ5ICovCn07CgpNT0RVTEVfREVWSUNFX1RBQkxFKHVzYiwgdmljYW1fdGFibGUpOwoKc3RhdGljIHN0cnVjdCB1c2JfZHJpdmVyIHZpY2FtX2RyaXZlciA9IHsKCS5uYW1lCQk9ICJ2aWNhbSIsCgkucHJvYmUJCT0gdmljYW1fcHJvYmUsCgkuZGlzY29ubmVjdAk9IHZpY2FtX2Rpc2Nvbm5lY3QsCgkuaWRfdGFibGUJPSB2aWNhbV90YWJsZQp9OwoKLyoqCiAqCXZpY2FtX3Byb2JlCiAqCUBpbnRmOiB0aGUgaW50ZXJmYWNlCiAqCUBpZDogdGhlIGRldmljZSBpZAogKgogKglDYWxsZWQgYnkgdGhlIHVzYiBjb3JlIHdoZW4gYSBuZXcgZGV2aWNlIGlzIGNvbm5lY3RlZCB0aGF0IGl0IHRoaW5rcwogKgl0aGlzIGRyaXZlciBtaWdodCBiZSBpbnRlcmVzdGVkIGluLgogKi8Kc3RhdGljIGludAp2aWNhbV9wcm9iZSggc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYsIGNvbnN0IHN0cnVjdCB1c2JfZGV2aWNlX2lkICppZCkKewoJc3RydWN0IHVzYl9kZXZpY2UgKmRldiA9IGludGVyZmFjZV90b191c2JkZXYoaW50Zik7CglpbnQgYnVsa0VuZHBvaW50ID0gMDsKCWNvbnN0IHN0cnVjdCB1c2JfaG9zdF9pbnRlcmZhY2UgKmludGVyZmFjZTsKCWNvbnN0IHN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciAqZW5kcG9pbnQ7CglzdHJ1Y3QgdmljYW1fY2FtZXJhICpjYW07CgkKCXByaW50ayhLRVJOX0lORk8gIlZpQ2FtIGJhc2VkIHdlYmNhbSBjb25uZWN0ZWRcbiIpOwoKCWludGVyZmFjZSA9IGludGYtPmN1cl9hbHRzZXR0aW5nOwoKCURCRyhLRVJOX0RFQlVHICJJbnRlcmZhY2UgJWQuIGhhcyAldS4gZW5kcG9pbnRzIVxuIiwKCSAgICAgICBpbnRlcmZhY2UtPmRlc2MuYkludGVyZmFjZU51bWJlciwgKHVuc2lnbmVkKSAoaW50ZXJmYWNlLT5kZXNjLmJOdW1FbmRwb2ludHMpKTsKCWVuZHBvaW50ID0gJmludGVyZmFjZS0+ZW5kcG9pbnRbMF0uZGVzYzsKCglpZiAoKGVuZHBvaW50LT5iRW5kcG9pbnRBZGRyZXNzICYgMHg4MCkgJiYKCSAgICAoKGVuZHBvaW50LT5ibUF0dHJpYnV0ZXMgJiAzKSA9PSAweDAyKSkgewoJCS8qIHdlIGZvdW5kIGEgYnVsayBpbiBlbmRwb2ludCAqLwoJCWJ1bGtFbmRwb2ludCA9IGVuZHBvaW50LT5iRW5kcG9pbnRBZGRyZXNzOwoJfSBlbHNlIHsKCQlwcmludGsoS0VSTl9FUlIKCQkgICAgICAgIk5vIGJ1bGsgaW4gZW5kcG9pbnQgd2FzIGZvdW5kID8hICh0aGlzIGlzIGJhZClcbiIpOwoJfQoKCWlmICgoY2FtID0KCSAgICAga21hbGxvYyhzaXplb2YgKHN0cnVjdCB2aWNhbV9jYW1lcmEpLCBHRlBfS0VSTkVMKSkgPT0gTlVMTCkgewoJCXByaW50ayhLRVJOX1dBUk5JTkcKCQkgICAgICAgImNvdWxkIG5vdCBhbGxvY2F0ZSBrZXJuZWwgbWVtb3J5IGZvciB2aWNhbV9jYW1lcmEgc3RydWN0XG4iKTsKCQlyZXR1cm4gLUVOT01FTTsKCX0KCgltZW1zZXQoY2FtLCAwLCBzaXplb2YgKHN0cnVjdCB2aWNhbV9jYW1lcmEpKTsKCgljYW0tPnNodXR0ZXJfc3BlZWQgPSAxNTsKCgltdXRleF9pbml0KCZjYW0tPmNhbV9sb2NrKTsKCgltZW1jcHkoJmNhbS0+dmRldiwgJnZpY2FtX3RlbXBsYXRlLAoJICAgICAgIHNpemVvZiAodmljYW1fdGVtcGxhdGUpKTsKCWNhbS0+dmRldi5wcml2ID0gY2FtOwkvLyBzb3J0IG9mIGEgcmV2ZXJzZSBtYXBwaW5nIGZvciB0aG9zZSBmdW5jdGlvbnMgdGhhdCBnZXQgdmRldiBvbmx5CgoJY2FtLT51ZGV2ID0gZGV2OwoJY2FtLT5idWxrRW5kcG9pbnQgPSBidWxrRW5kcG9pbnQ7CgoJaWYgKHZpZGVvX3JlZ2lzdGVyX2RldmljZSgmY2FtLT52ZGV2LCBWRkxfVFlQRV9HUkFCQkVSLCAtMSkgPT0gLTEpIHsKCQlrZnJlZShjYW0pOwoJCXByaW50ayhLRVJOX1dBUk5JTkcgInZpZGVvX3JlZ2lzdGVyX2RldmljZSBmYWlsZWRcbiIpOwoJCXJldHVybiAtRUlPOwoJfQoKCXZpY2FtX2NyZWF0ZV9wcm9jX2VudHJ5KGNhbSk7CgoJcHJpbnRrKEtFUk5fSU5GTyAiVmlDYW0gd2ViY2FtIGRyaXZlciBub3cgY29udHJvbGxpbmcgdmlkZW8gZGV2aWNlICVkXG4iLGNhbS0+dmRldi5taW5vcik7CgoJdXNiX3NldF9pbnRmZGF0YSAoaW50ZiwgY2FtKTsKCQoJcmV0dXJuIDA7Cn0KCnN0YXRpYyB2b2lkCnZpY2FtX2Rpc2Nvbm5lY3Qoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYpCnsKCWludCBvcGVuX2NvdW50OwoJc3RydWN0IHZpY2FtX2NhbWVyYSAqY2FtID0gdXNiX2dldF9pbnRmZGF0YSAoaW50Zik7Cgl1c2Jfc2V0X2ludGZkYXRhIChpbnRmLCBOVUxMKTsKCgkvKiB3ZSBtdXN0IHVucmVnaXN0ZXIgdGhlIGRldmljZSBiZWZvcmUgdGFraW5nIGl0cwoJICogY2FtX2xvY2suIFRoaXMgaXMgYmVjYXVzZSB0aGUgdmlkZW8gb3BlbiBjYWxsCgkgKiBob2xkcyB0aGUgc2FtZSBsb2NrIGFzIHZpZGVvIHVucmVnaXN0ZXIuIGlmIHdlCgkgKiB1bnJlZ2lzdGVyIGluc2lkZSBvZiB0aGUgY2FtX2xvY2sgYW5kIG9wZW4gYWxzbwoJICogdXNlcyB0aGUgY2FtX2xvY2ssIHdlIGdldCBkZWFkbG9jay4KCSAqLwoKCXZpZGVvX3VucmVnaXN0ZXJfZGV2aWNlKCZjYW0tPnZkZXYpOwoKCS8qIHN0b3AgdGhlIGNhbWVyYSBmcm9tIGJlaW5nIHVzZWQgKi8KCgltdXRleF9sb2NrKCZjYW0tPmNhbV9sb2NrKTsKCgkvKiBtYXJrIHRoZSBjYW1lcmEgYXMgZ29uZSAqLwoKCWNhbS0+dWRldiA9IE5VTEw7CgoJdmljYW1fZGVzdHJveV9wcm9jX2VudHJ5KGNhbSk7CgoJLyogdGhlIG9ubHkgdGhpbmcgbGVmdCB0byBkbyBpcyBzeW5jaHJvbml6ZSB3aXRoCgkgKiBvdXIgY2xvc2UvcmVsZWFzZSBmdW5jdGlvbiBvbiB3aG8gc2hvdWxkIHJlbGVhc2UKCSAqIHRoZSBjYW1lcmEgbWVtb3J5LiBpZiB0aGVyZSBhcmUgYW55IHVzZXJzIHVzaW5nIHRoZQoJICogY2FtZXJhLCBpdCdzIHRoZWlyIGpvYi4gaWYgdGhlcmUgYXJlIG5vIHVzZXJzLAoJICogaXQncyBvdXJzLgoJICovCgoJb3Blbl9jb3VudCA9IGNhbS0+b3Blbl9jb3VudDsKCgltdXRleF91bmxvY2soJmNhbS0+Y2FtX2xvY2spOwoKCWlmICghb3Blbl9jb3VudCkgewoJCWtmcmVlKGNhbSk7Cgl9CgoJcHJpbnRrKEtFUk5fREVCVUcgIlZpQ2FtLWJhc2VkIFdlYkNhbSBkaXNjb25uZWN0ZWRcbiIpOwp9CgovKgogKi8Kc3RhdGljIGludCBfX2luaXQKdXNiX3ZpY2FtX2luaXQodm9pZCkKewoJaW50IHJldHZhbDsKCURCRyhLRVJOX0lORk8gIlZpQ2FtLWJhc2VkIFdlYkNhbSBkcml2ZXIgc3RhcnR1cFxuIik7Cgl2aWNhbV9jcmVhdGVfcHJvY19yb290KCk7CglyZXR2YWwgPSB1c2JfcmVnaXN0ZXIoJnZpY2FtX2RyaXZlcik7CglpZiAocmV0dmFsKQoJCXByaW50ayhLRVJOX1dBUk5JTkcgInVzYl9yZWdpc3RlciBmYWlsZWQhXG4iKTsKCXJldHVybiByZXR2YWw7Cn0KCnN0YXRpYyB2b2lkIF9fZXhpdAp1c2JfdmljYW1fZXhpdCh2b2lkKQp7CglEQkcoS0VSTl9JTkZPCgkgICAgICAgIlZpQ2FtLWJhc2VkIFdlYkNhbSBkcml2ZXIgc2h1dGRvd25cbiIpOwoKCXVzYl9kZXJlZ2lzdGVyKCZ2aWNhbV9kcml2ZXIpOwoJdmljYW1fZGVzdHJveV9wcm9jX3Jvb3QoKTsKfQoKbW9kdWxlX2luaXQodXNiX3ZpY2FtX2luaXQpOwptb2R1bGVfZXhpdCh1c2JfdmljYW1fZXhpdCk7CgpNT0RVTEVfQVVUSE9SKERSSVZFUl9BVVRIT1IpOwpNT0RVTEVfREVTQ1JJUFRJT04oRFJJVkVSX0RFU0MpOwpNT0RVTEVfTElDRU5TRSgiR1BMIik7Cg==