LyoqDQogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KICAqIEBmaWxlICAgIHN0bTMybDE1Ml9ldmFsX2xjZC5jDQogICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0NCiAgKiBAdmVyc2lvbiBWNC40LjBSQzENCiAgKiBAZGF0ZSAgICAwNy8wMi8yMDEwDQogICogQGJyaWVmICAgVGhpcyBmaWxlIGluY2x1ZGVzIHRoZSBMQ0QgZHJpdmVyIGZvciBBTS0yNDAzMjBMOFROUVcwMEggKExDRF9JTEk5MzIwKSwNCiAgKiAgICAgICAgICBBTS0yNDAzMjBMRFROUVcwMEggKExDRF9TUEZENTQwOEIpIExpcXVpZCBDcnlzdGFsIERpc3BsYXkgTW9kdWxlDQogICogICAgICAgICAgb2YgU1RNMzJMMTUyLUVWQUwgYm9hcmQuDQogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KICAqIEBjb3B5DQogICoNCiAgKiBUSEUgUFJFU0VOVCBGSVJNV0FSRSBXSElDSCBJUyBGT1IgR1VJREFOQ0UgT05MWSBBSU1TIEFUIFBST1ZJRElORyBDVVNUT01FUlMNCiAgKiBXSVRIIENPRElORyBJTkZPUk1BVElPTiBSRUdBUkRJTkcgVEhFSVIgUFJPRFVDVFMgSU4gT1JERVIgRk9SIFRIRU0gVE8gU0FWRQ0KICAqIFRJTUUuIEFTIEEgUkVTVUxULCBTVE1JQ1JPRUxFQ1RST05JQ1MgU0hBTEwgTk9UIEJFIEhFTEQgTElBQkxFIEZPUiBBTlkNCiAgKiBESVJFQ1QsIElORElSRUNUIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBXSVRIIFJFU1BFQ1QgVE8gQU5ZIENMQUlNUyBBUklTSU5HDQogICogRlJPTSBUSEUgQ09OVEVOVCBPRiBTVUNIIEZJUk1XQVJFIEFORC9PUiBUSEUgVVNFIE1BREUgQlkgQ1VTVE9NRVJTIE9GIFRIRQ0KICAqIENPRElORyBJTkZPUk1BVElPTiBDT05UQUlORUQgSEVSRUlOIElOIENPTk5FQ1RJT04gV0lUSCBUSEVJUiBQUk9EVUNUUy4NCiAgKg0KICAqIDxoMj48Y2VudGVyPiZjb3B5OyBDT1BZUklHSFQgMjAxMCBTVE1pY3JvZWxlY3Ryb25pY3M8L2NlbnRlcj48L2gyPg0KICAqLw0KDQovKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KI2luY2x1ZGUgInN0bTMybDE1Ml9ldmFsX2xjZC5oIg0KI2luY2x1ZGUgIi4uL0NvbW1vbi9mb250cy5jIg0KDQovKiogQGFkZHRvZ3JvdXAgVXRpbGl0aWVzDQogICogQHsNCiAgKi8NCg0KLyoqIEBhZGR0b2dyb3VwIFNUTTMyX0VWQUwNCiAgKiBAew0KICAqLw0KDQovKiogQGFkZHRvZ3JvdXAgU1RNMzJMMTUyX0VWQUwNCiAgKiBAew0KICAqLw0KDQovKiogQGRlZmdyb3VwIFNUTTMyTDE1Ml9FVkFMX0xDRA0KICAqIEBicmllZiAgIFRoaXMgZmlsZSBpbmNsdWRlcyB0aGUgTENEIGRyaXZlciBmb3IgQU0tMjQwMzIwTDhUTlFXMDBIIChMQ0RfSUxJOTMyMCksDQogICogICAgICAgICAgQU0tMjQwMzIwTERUTlFXMDBIIChMQ0RfU1BGRDU0MDhCKSBMaXF1aWQgQ3J5c3RhbCBEaXNwbGF5IE1vZHVsZQ0KICAqICAgICAgICAgIG9mIFNUTTMyTDE1Mi1FVkFMIGJvYXJkLg0KICAqIEB7DQogICovDQoNCi8qKiBAZGVmZ3JvdXAgU1RNMzJMMTUyX0VWQUxfTENEX1ByaXZhdGVfVHlwZXMNCiAgKiBAew0KICAqLw0KLyoqDQogICogQH0NCiAgKi8NCg0KLyoqIEBkZWZncm91cCBTVE0zMkwxNTJfRVZBTF9MQ0RfUHJpdmF0ZV9EZWZpbmVzDQogICogQHsNCiAgKi8NCiNkZWZpbmUgTENEX0lMSTkzMjAgICAgICAgIDB4OTMyMA0KI2RlZmluZSBMQ0RfU1BGRDU0MDggICAgICAgMHg1NDA4DQojZGVmaW5lIFNUQVJUX0JZVEUgICAgICAgICAweDcwDQojZGVmaW5lIFNFVF9JTkRFWCAgICAgICAgICAweDAwDQojZGVmaW5lIFJFQURfU1RBVFVTICAgICAgICAweDAxDQojZGVmaW5lIExDRF9XUklURV9SRUcgICAgICAweDAyDQojZGVmaW5lIExDRF9SRUFEX1JFRyAgICAgICAweDAzDQojZGVmaW5lIE1BWF9QT0xZX0NPUk5FUlMgICAyMDANCiNkZWZpbmUgUE9MWV9ZKFopICAgICAgICAgICgoaW50MzJfdCkoKFBvaW50cyArIFopLT5YKSkNCiNkZWZpbmUgUE9MWV9YKFopICAgICAgICAgICgoaW50MzJfdCkoKFBvaW50cyArIFopLT5ZKSkNCi8qKg0KICAqIEB9DQogICovDQoNCi8qKiBAZGVmZ3JvdXAgU1RNMzJMMTUyX0VWQUxfTENEX1ByaXZhdGVfTWFjcm9zDQogICogQHsNCiAgKi8NCiNkZWZpbmUgQUJTKFgpICAoKFgpID4gMCA/IChYKSA6IC0oWCkpDQovKioNCiAgKiBAfQ0KICAqLw0KDQovKiogQGRlZmdyb3VwIFNUTTMyTDE1Ml9FVkFMX0xDRF9Qcml2YXRlX1ZhcmlhYmxlcw0KICAqIEB7DQogICovDQpzdGF0aWMgc0ZPTlQgKkxDRF9DdXJyZW50Zm9udHM7DQovKiBHbG9iYWwgdmFyaWFibGVzIHRvIHNldCB0aGUgd3JpdHRlbiB0ZXh0IGNvbG9yICovDQpzdGF0aWMgX19JTyB1aW50MTZfdCBUZXh0Q29sb3IgPSAweDAwMDAsIEJhY2tDb2xvciA9IDB4RkZGRjsNCnN0YXRpYyBfX0lPIHVpbnQzMl90IExDRFR5cGUgPSBMQ0RfU1BGRDU0MDg7DQovKioNCiAgKiBAfQ0KICAqLw0KDQovKiogQGRlZmdyb3VwIFNUTTMyTDE1Ml9FVkFMX0xDRF9Qcml2YXRlX0Z1bmN0aW9uX1Byb3RvdHlwZXMNCiAgKiBAew0KICAqLw0KI2lmbmRlZiBVU0VfRGVsYXkNCnN0YXRpYyB2b2lkIGRlbGF5KF9fSU8gdWludDMyX3QgbkNvdW50KTsNCiNlbmRpZiAvKiBVU0VfRGVsYXkqLw0KDQpzdGF0aWMgdm9pZCBQdXRQaXhlbChpbnQxNl90IHgsIGludDE2X3QgeSk7DQpzdGF0aWMgdm9pZCBMQ0RfUG9seUxpbmVSZWxhdGl2ZUNsb3NlZChwUG9pbnQgUG9pbnRzLCB1aW50MTZfdCBQb2ludENvdW50LCB1aW50MTZfdCBDbG9zZWQpOw0KDQovKioNCiAgKiBAfQ0KICAqLw0KDQovKiogQGRlZmdyb3VwIFNUTTMyTDE1Ml9FVkFMX0xDRF9Qcml2YXRlX0Z1bmN0aW9ucw0KICAqIEB7DQogICovDQoNCi8qKg0KICAqIEBicmllZiAgRGVJbml0aWFsaXplcyB0aGUgTENELg0KICAqIEBwYXJhbSAgTm9uZQ0KICAqIEByZXR2YWwgTm9uZQ0KICAqLw0Kdm9pZCBTVE0zMkwxNTJfTENEX0RlSW5pdCh2b2lkKQ0Kew0KICBHUElPX0luaXRUeXBlRGVmIEdQSU9fSW5pdFN0cnVjdHVyZTsNCg0KICAvKiE8IExDRCBEaXNwbGF5IE9mZiAqLw0KICBMQ0RfRGlzcGxheU9mZigpOw0KDQogIC8qITwgTENEX1NQSSBkaXNhYmxlICovDQogIFNQSV9DbWQoTENEX1NQSSwgRElTQUJMRSk7DQoNCiAgLyohPCBMQ0RfU1BJIERlSW5pdCAqLw0KICBTUElfRGVJbml0KExDRF9TUEkpOw0KDQogIC8qITwgRGlzYWJsZSBTUEkgY2xvY2sgICovDQogIFJDQ19BUEIxUGVyaXBoQ2xvY2tDbWQoTENEX1NQSV9DTEssIERJU0FCTEUpOw0KDQogIC8qIENvbmZpZ3VyZSBOQ1MgaW4gT3V0cHV0IFB1c2gtUHVsbCBtb2RlICovDQogIEdQSU9fSW5pdFN0cnVjdHVyZS5HUElPX1BpbiA9IExDRF9OQ1NfUElOOw0KICBHUElPX0luaXRTdHJ1Y3R1cmUuR1BJT19Nb2RlID0gR1BJT19Nb2RlX0lOOw0KICBHUElPX0luaXRTdHJ1Y3R1cmUuR1BJT19QdVBkID0gR1BJT19QdVBkX05PUFVMTDsNCiAgR1BJT19Jbml0KExDRF9OQ1NfR1BJT19QT1JULCAmR1BJT19Jbml0U3RydWN0dXJlKTsNCg0KICAvKiBDb25maWd1cmUgU1BJIHBpbnM6IFNDSywgTUlTTyBhbmQgTU9TSSAqLw0KICBHUElPX0luaXRTdHJ1Y3R1cmUuR1BJT19QaW4gPSBMQ0RfU1BJX1NDS19QSU47DQogIEdQSU9fSW5pdChMQ0RfU1BJX1NDS19HUElPX1BPUlQsICZHUElPX0luaXRTdHJ1Y3R1cmUpOw0KDQogIEdQSU9fSW5pdFN0cnVjdHVyZS5HUElPX1BpbiA9IExDRF9TUElfTUlTT19QSU47DQogIEdQSU9fSW5pdChMQ0RfU1BJX01JU09fR1BJT19QT1JULCAmR1BJT19Jbml0U3RydWN0dXJlKTsNCg0KICBHUElPX0luaXRTdHJ1Y3R1cmUuR1BJT19QaW4gPSBMQ0RfU1BJX01PU0lfUElOOw0KICBHUElPX0luaXQoTENEX1NQSV9NT1NJX0dQSU9fUE9SVCwgJkdQSU9fSW5pdFN0cnVjdHVyZSk7DQp9DQoNCi8qKg0KICAqIEBicmllZiAgU2V0dXBzIHRoZSBMQ0QuDQogICogQHBhcmFtICBOb25lDQogICogQHJldHZhbCBOb25lDQogICovDQp2b2lkIExDRF9TZXR1cCh2b2lkKQ0Kew0KLyogQ29uZmlndXJlIHRoZSBMQ0QgQ29udHJvbCBwaW5zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCiAgTENEX0N0cmxMaW5lc0NvbmZpZygpOw0KDQovKiBDb25maWd1cmUgdGhlIExDRF9TUEkgaW50ZXJmYWNlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KICBMQ0RfU1BJQ29uZmlnKCk7DQoNCiAgaWYoTENEVHlwZSA9PSBMQ0RfU1BGRDU0MDgpDQogIHsNCiAgICAvKiBTdGFydCBJbml0aWFsIFNlcXVlbmNlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCiAgICBMQ0RfV3JpdGVSZWcoTENEX1JFR18yMjcsIDB4MzAwOCk7IC8qIFNldCBpbnRlcm5hbCB0aW1pbmcgKi8NCiAgICBMQ0RfV3JpdGVSZWcoTENEX1JFR18yMzEsIDB4MDAxMik7IC8qIFNldCBpbnRlcm5hbCB0aW1pbmcgKi8NCiAgICBMQ0RfV3JpdGVSZWcoTENEX1JFR18yMzksIDB4MTIzMSk7IC8qIFNldCBpbnRlcm5hbCB0aW1pbmcgKi8NCiAgICBMQ0RfV3JpdGVSZWcoTENEX1JFR18xLCAweDAxMDApOyAgIC8qIFNldCBTUyBhbmQgU00gYml0ICovDQogICAgTENEX1dyaXRlUmVnKExDRF9SRUdfMiwgMHgwNzAwKTsgICAvKiBTZXQgMSBsaW5lIGludmVyc2lvbiAqLw0KICAgIExDRF9Xcml0ZVJlZyhMQ0RfUkVHXzMsIDB4MTAzMCk7ICAgLyogU2V0IEdSQU0gd3JpdGUgZGlyZWN0aW9uIGFuZCBCR1I9MS4gKi8NCiAgICBMQ0RfV3JpdGVSZWcoTENEX1JFR180LCAweDAwMDApOyAgIC8qIFJlc2l6ZSByZWdpc3RlciAqLw0KICAgIExDRF9Xcml0ZVJlZyhMQ0RfUkVHXzgsIDB4MDIwMik7ICAgLyogU2V0IHRoZSBiYWNrIHBvcmNoIGFuZCBmcm9udCBwb3JjaCAqLw0KICAgIExDRF9Xcml0ZVJlZyhMQ0RfUkVHXzksIDB4MDAwMCk7ICAgLyogU2V0IG5vbi1kaXNwbGF5IGFyZWEgcmVmcmVzaCBjeWNsZSBJU0NbMzowXSAqLw0KICAgIExDRF9Xcml0ZVJlZyhMQ0RfUkVHXzEwLCAweDAwMDApOyAgLyogRk1BUksgZnVuY3Rpb24gKi8NCiAgICBMQ0RfV3JpdGVSZWcoTENEX1JFR18xMiwgMHgwMDAwKTsgIC8qIFJHQiBpbnRlcmZhY2Ugc2V0dGluZyAqLw0KICAgIExDRF9Xcml0ZVJlZyhMQ0RfUkVHXzEzLCAweDAwMDApOyAgLyogRnJhbWUgbWFya2VyIFBvc2l0aW9uICovDQogICAgTENEX1dyaXRlUmVnKExDRF9SRUdfMTUsIDB4MDAwMCk7ICAvKiBSR0IgaW50ZXJmYWNlIHBvbGFyaXR5ICovDQogICAgLyogUG93ZXIgT24gc2VxdWVuY2UgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQogICAgTENEX1dyaXRlUmVnKExDRF9SRUdfMTYsIDB4MDAwMCk7ICAvKiBTQVAsIEJUWzM6MF0sIEFQLCBEU1RCLCBTTFAsIFNUQiAqLw0KICAgIExDRF9Xcml0ZVJlZyhMQ0RfUkVHXzE3LCAweDAwMDApOyAgLyogREMxWzI6MF0sIERDMFsyOjBdLCBWQ1syOjBdICovDQogICAgTENEX1dyaXRlUmVnKExDRF9SRUdfMTgsIDB4MDAwMCk7ICAvKiBWUkVHMU9VVCB2b2x0YWdlICovDQogICAgTENEX1dyaXRlUmVnKExDRF9SRUdfMTksIDB4MDAwMCk7ICAvKiBWRFZbNDowXSBmb3IgVkNPTSBhbXBsaXR1ZGUgKi8NCiAgICBfZGVsYXlfKDIwKTsgICAgICAgICAgICAgICAgLyogRGlzLWNoYXJnZSBjYXBhY2l0b3IgcG93ZXIgdm9sdGFnZSAoMjAwbXMpICovDQogICAgTENEX1dyaXRlUmVnKExDRF9SRUdfMTcsIDB4MDAwNyk7ICAvKiBEQzFbMjowXSwgREMwWzI6MF0sIFZDWzI6MF0gKi8NCiAgICBfZGVsYXlfKDUpOyAgICAgICAgICAgICAgICAgLyogRGVsYXkgNTAgbXMgKi8NCiAgICBMQ0RfV3JpdGVSZWcoTENEX1JFR18xNiwgMHgxMkIwKTsgIC8qIFNBUCwgQlRbMzowXSwgQVAsIERTVEIsIFNMUCwgU1RCICovDQogICAgX2RlbGF5Xyg1KTsgICAgICAgICAgICAgICAgICAvKiBEZWxheSA1MCBtcyAqLw0KICAgIExDRF9Xcml0ZVJlZyhMQ0RfUkVHXzE4LCAweDAxQkQpOyAgLyogRXh0ZXJuYWwgcmVmZXJlbmNlIHZvbHRhZ2U9IFZjaSAqLw0KICAgIF9kZWxheV8oNSk7ICAgICAgICAgICAgICAgICAvKiBEZWxheSA1MCBtcyAqLw0KICAgIExDRF9Xcml0ZVJlZyhMQ0RfUkVHXzE5LCAweDE0MDApOyAgICAgICAvKiBWRFZbNDowXSBmb3IgVkNPTSBhbXBsaXR1ZGUgKi8NCiAgICBMQ0RfV3JpdGVSZWcoTENEX1JFR180MSwgMHgwMDBFKTsgIC8qIFZDTVs0OjBdIGZvciBWQ09NSCAqLw0KICAgIF9kZWxheV8oNSk7ICAgICAgICAgICAgICAgICAvKiBEZWxheSA1MCBtcyAqLw0KICAgIExDRF9Xcml0ZVJlZyhMQ0RfUkVHXzMyLCAweDAwMDApOyAgLyogR1JBTSBob3Jpem9udGFsIEFkZHJlc3MgKi8NCiAgICBMQ0RfV3JpdGVSZWcoTENEX1JFR18zMywgMHgwMTNGKTsgIC8qIEdSQU0gVmVydGljYWwgQWRkcmVzcyAqLw0KICAgIC8qIEFkanVzdCB0aGUgR2FtbWEgQ3VydmUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KICAgIExDRF9Xcml0ZVJlZyhMQ0RfUkVHXzQ4LCAweDAwMDcpOw0KICAgIExDRF9Xcml0ZVJlZyhMQ0RfUkVHXzQ5LCAweDAzMDIpOw0KICAgIExDRF9Xcml0ZVJlZyhMQ0RfUkVHXzUwLCAweDAxMDUpOw0KICAgIExDRF9Xcml0ZVJlZyhMQ0RfUkVHXzUzLCAweDAyMDYpOw0KICAgIExDRF9Xcml0ZVJlZyhMQ0RfUkVHXzU0LCAweDA4MDgpOw0KICAgIExDRF9Xcml0ZVJlZyhMQ0RfUkVHXzU1LCAweDAyMDYpOw0KICAgIExDRF9Xcml0ZVJlZyhMQ0RfUkVHXzU2LCAweDA1MDQpOw0KICAgIExDRF9Xcml0ZVJlZyhMQ0RfUkVHXzU3LCAweDAwMDcpOw0KICAgIExDRF9Xcml0ZVJlZyhMQ0RfUkVHXzYwLCAweDAxMDUpOw0KICAgIExDRF9Xcml0ZVJlZyhMQ0RfUkVHXzYxLCAweDA4MDgpOw0KICAgIC8qIFNldCBHUkFNIGFyZWEgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KICAgIExDRF9Xcml0ZVJlZyhMQ0RfUkVHXzgwLCAweDAwMDApOyAgLyogSG9yaXpvbnRhbCBHUkFNIFN0YXJ0IEFkZHJlc3MgKi8NCiAgICBMQ0RfV3JpdGVSZWcoTENEX1JFR184MSwgMHgwMEVGKTsgIC8qIEhvcml6b250YWwgR1JBTSBFbmQgQWRkcmVzcyAqLw0KICAgIExDRF9Xcml0ZVJlZyhMQ0RfUkVHXzgyLCAweDAwMDApOyAgLyogVmVydGljYWwgR1JBTSBTdGFydCBBZGRyZXNzICovDQogICAgTENEX1dyaXRlUmVnKExDRF9SRUdfODMsIDB4MDEzRik7ICAvKiBWZXJ0aWNhbCBHUkFNIEVuZCBBZGRyZXNzICovDQogICAgTENEX1dyaXRlUmVnKExDRF9SRUdfOTYsICAweEE3MDApOyAvKiBHYXRlIFNjYW4gTGluZSAqLw0KICAgIExDRF9Xcml0ZVJlZyhMQ0RfUkVHXzk3LCAgMHgwMDAxKTsgLyogTkRMLFZMRSwgUkVWICovDQogICAgTENEX1dyaXRlUmVnKExDRF9SRUdfMTA2LCAweDAwMDApOyAvKiBTZXQgc2Nyb2xsaW5nIGxpbmUgKi8NCiAgICAvKiBQYXJ0aWFsIERpc3BsYXkgQ29udHJvbCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCiAgICBMQ0RfV3JpdGVSZWcoTENEX1JFR18xMjgsIDB4MDAwMCk7DQogICAgTENEX1dyaXRlUmVnKExDRF9SRUdfMTI5LCAweDAwMDApOw0KICAgIExDRF9Xcml0ZVJlZyhMQ0RfUkVHXzEzMCwgMHgwMDAwKTsNCiAgICBMQ0RfV3JpdGVSZWcoTENEX1JFR18xMzEsIDB4MDAwMCk7DQogICAgTENEX1dyaXRlUmVnKExDRF9SRUdfMTMyLCAweDAwMDApOw0KICAgIExDRF9Xcml0ZVJlZyhMQ0RfUkVHXzEzMywgMHgwMDAwKTsNCiAgICAvKiBQYW5lbCBDb250cm9sIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCiAgICBMQ0RfV3JpdGVSZWcoTENEX1JFR18xNDQsIDB4MDAxMCk7DQogICAgTENEX1dyaXRlUmVnKExDRF9SRUdfMTQ2LCAweDAwMDApOw0KICAgIExDRF9Xcml0ZVJlZyhMQ0RfUkVHXzE0NywgMHgwMDAzKTsNCiAgICBMQ0RfV3JpdGVSZWcoTENEX1JFR18xNDksIDB4MDExMCk7DQogICAgTENEX1dyaXRlUmVnKExDRF9SRUdfMTUxLCAweDAwMDApOw0KICAgIExDRF9Xcml0ZVJlZyhMQ0RfUkVHXzE1MiwgMHgwMDAwKTsNCiAgICAvKiBTZXQgR1JBTSB3cml0ZSBkaXJlY3Rpb24gYW5kIEJHUiA9IDENCiAgICAgICBJL0Q9MDEgKEhvcml6b250YWwgOiBpbmNyZW1lbnQsIFZlcnRpY2FsIDogZGVjcmVtZW50KQ0KICAgICAgIEFNPTEgKGFkZHJlc3MgaXMgdXBkYXRlZCBpbiB2ZXJ0aWNhbCB3cml0aW5nIGRpcmVjdGlvbikgKi8NCiAgICBMQ0RfV3JpdGVSZWcoTENEX1JFR18zLCAweDEwMTgpOw0KICAgIExDRF9Xcml0ZVJlZyhMQ0RfUkVHXzcsIDB4MDExMik7ICAgLyogMjYySyBjb2xvciBhbmQgZGlzcGxheSBPTiAqLw0KICB9DQogIGVsc2UgaWYoTENEVHlwZSA9PSBMQ0RfSUxJOTMyMCkNCiAgew0KICAgIF9kZWxheV8oNSk7IC8qIERlbGF5IDUwIG1zICovDQogICAgLyogU3RhcnQgSW5pdGlhbCBTZXF1ZW5jZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KICAgIExDRF9Xcml0ZVJlZyhMQ0RfUkVHXzIyOSwgMHg4MDAwKTsgLyogU2V0IHRoZSBpbnRlcm5hbCB2Y29yZSB2b2x0YWdlICovDQogICAgTENEX1dyaXRlUmVnKExDRF9SRUdfMCwgIDB4MDAwMSk7IC8qIFN0YXJ0IGludGVybmFsIE9TQy4gKi8NCiAgICBMQ0RfV3JpdGVSZWcoTENEX1JFR18xLCAgMHgwMTAwKTsgLyogc2V0IFNTIGFuZCBTTSBiaXQgKi8NCiAgICBMQ0RfV3JpdGVSZWcoTENEX1JFR18yLCAgMHgwNzAwKTsgLyogc2V0IDEgbGluZSBpbnZlcnNpb24gKi8NCiAgICBMQ0RfV3JpdGVSZWcoTENEX1JFR18zLCAgMHgxMDMwKTsgLyogc2V0IEdSQU0gd3JpdGUgZGlyZWN0aW9uIGFuZCBCR1I9MS4gKi8NCiAgICBMQ0RfV3JpdGVSZWcoTENEX1JFR180LCAgMHgwMDAwKTsgLyogUmVzaXplIHJlZ2lzdGVyICovDQogICAgTENEX1dyaXRlUmVnKExDRF9SRUdfOCwgIDB4MDIwMik7IC8qIHNldCB0aGUgYmFjayBwb3JjaCBhbmQgZnJvbnQgcG9yY2ggKi8NCiAgICBMQ0RfV3JpdGVSZWcoTENEX1JFR185LCAgMHgwMDAwKTsgLyogc2V0IG5vbi1kaXNwbGF5IGFyZWEgcmVmcmVzaCBjeWNsZSBJU0NbMzowXSAqLw0KICAgIExDRF9Xcml0ZVJlZyhMQ0RfUkVHXzEwLCAweDAwMDApOyAvKiBGTUFSSyBmdW5jdGlvbiAqLw0KICAgIExDRF9Xcml0ZVJlZyhMQ0RfUkVHXzEyLCAweDAwMDApOyAvKiBSR0IgaW50ZXJmYWNlIHNldHRpbmcgKi8NCiAgICBMQ0RfV3JpdGVSZWcoTENEX1JFR18xMywgMHgwMDAwKTsgLyogRnJhbWUgbWFya2VyIFBvc2l0aW9uICovDQogICAgTENEX1dyaXRlUmVnKExDRF9SRUdfMTUsIDB4MDAwMCk7IC8qIFJHQiBpbnRlcmZhY2UgcG9sYXJpdHkgKi8NCiAgICAvKiBQb3dlciBPbiBzZXF1ZW5jZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQogICAgTENEX1dyaXRlUmVnKExDRF9SRUdfMTYsIDB4MDAwMCk7IC8qIFNBUCwgQlRbMzowXSwgQVAsIERTVEIsIFNMUCwgU1RCICovDQogICAgTENEX1dyaXRlUmVnKExDRF9SRUdfMTcsIDB4MDAwMCk7IC8qIERDMVsyOjBdLCBEQzBbMjowXSwgVkNbMjowXSAqLw0KICAgIExDRF9Xcml0ZVJlZyhMQ0RfUkVHXzE4LCAweDAwMDApOyAvKiBWUkVHMU9VVCB2b2x0YWdlICovDQogICAgTENEX1dyaXRlUmVnKExDRF9SRUdfMTksIDB4MDAwMCk7IC8qIFZEVls0OjBdIGZvciBWQ09NIGFtcGxpdHVkZSAqLw0KICAgIF9kZWxheV8oMjApOyAgICAgICAgICAgICAgICAgICAgICAvKiBEaXMtY2hhcmdlIGNhcGFjaXRvciBwb3dlciB2b2x0YWdlICgyMDBtcykgKi8NCiAgICBMQ0RfV3JpdGVSZWcoTENEX1JFR18xNiwgMHgxN0IwKTsgLyogU0FQLCBCVFszOjBdLCBBUCwgRFNUQiwgU0xQLCBTVEIgKi8NCiAgICBMQ0RfV3JpdGVSZWcoTENEX1JFR18xNywgMHgwMTM3KTsgLyogREMxWzI6MF0sIERDMFsyOjBdLCBWQ1syOjBdICovDQogICAgX2RlbGF5Xyg1KTsgICAgICAgICAgICAgICAgICAgICAgIC8qIERlbGF5IDUwIG1zICovDQogICAgTENEX1dyaXRlUmVnKExDRF9SRUdfMTgsIDB4MDEzOSk7IC8qIFZSRUcxT1VUIHZvbHRhZ2UgKi8NCiAgICBfZGVsYXlfKDUpOyAgICAgICAgICAgICAgICAgICAgICAgLyogRGVsYXkgNTAgbXMgKi8NCiAgICBMQ0RfV3JpdGVSZWcoTENEX1JFR18xOSwgMHgxZDAwKTsgLyogVkRWWzQ6MF0gZm9yIFZDT00gYW1wbGl0dWRlICovDQogICAgTENEX1dyaXRlUmVnKExDRF9SRUdfNDEsIDB4MDAxMyk7IC8qIFZDTVs0OjBdIGZvciBWQ09NSCAqLw0KICAgIF9kZWxheV8oNSk7ICAgICAgICAgICAgICAgICAgICAgICAvKiBEZWxheSA1MCBtcyAqLw0KICAgIExDRF9Xcml0ZVJlZyhMQ0RfUkVHXzMyLCAweDAwMDApOyAvKiBHUkFNIGhvcml6b250YWwgQWRkcmVzcyAqLw0KICAgIExDRF9Xcml0ZVJlZyhMQ0RfUkVHXzMzLCAweDAwMDApOyAvKiBHUkFNIFZlcnRpY2FsIEFkZHJlc3MgKi8NCiAgICAvKiBBZGp1c3QgdGhlIEdhbW1hIEN1cnZlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQogICAgTENEX1dyaXRlUmVnKExDRF9SRUdfNDgsIDB4MDAwNik7DQogICAgTENEX1dyaXRlUmVnKExDRF9SRUdfNDksIDB4MDEwMSk7DQogICAgTENEX1dyaXRlUmVnKExDRF9SRUdfNTAsIDB4MDAwMyk7DQogICAgTENEX1dyaXRlUmVnKExDRF9SRUdfNTMsIDB4MDEwNik7DQogICAgTENEX1dyaXRlUmVnKExDRF9SRUdfNTQsIDB4MGIwMik7DQogICAgTENEX1dyaXRlUmVnKExDRF9SRUdfNTUsIDB4MDMwMik7DQogICAgTENEX1dyaXRlUmVnKExDRF9SRUdfNTYsIDB4MDcwNyk7DQogICAgTENEX1dyaXRlUmVnKExDRF9SRUdfNTcsIDB4MDAwNyk7DQogICAgTENEX1dyaXRlUmVnKExDRF9SRUdfNjAsIDB4MDYwMCk7DQogICAgTENEX1dyaXRlUmVnKExDRF9SRUdfNjEsIDB4MDIwYik7DQoNCiAgICAvKiBTZXQgR1JBTSBhcmVhIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQogICAgTENEX1dyaXRlUmVnKExDRF9SRUdfODAsIDB4MDAwMCk7IC8qIEhvcml6b250YWwgR1JBTSBTdGFydCBBZGRyZXNzICovDQogICAgTENEX1dyaXRlUmVnKExDRF9SRUdfODEsIDB4MDBFRik7IC8qIEhvcml6b250YWwgR1JBTSBFbmQgQWRkcmVzcyAqLw0KICAgIExDRF9Xcml0ZVJlZyhMQ0RfUkVHXzgyLCAweDAwMDApOyAvKiBWZXJ0aWNhbCBHUkFNIFN0YXJ0IEFkZHJlc3MgKi8NCiAgICBMQ0RfV3JpdGVSZWcoTENEX1JFR184MywgMHgwMTNGKTsgLyogVmVydGljYWwgR1JBTSBFbmQgQWRkcmVzcyAqLw0KICAgIExDRF9Xcml0ZVJlZyhMQ0RfUkVHXzk2LCAgMHgyNzAwKTsgLyogR2F0ZSBTY2FuIExpbmUgKi8NCiAgICBMQ0RfV3JpdGVSZWcoTENEX1JFR185NywgIDB4MDAwMSk7IC8qIE5ETCxWTEUsIFJFViAqLw0KICAgIExDRF9Xcml0ZVJlZyhMQ0RfUkVHXzEwNiwgMHgwMDAwKTsgLyogc2V0IHNjcm9sbGluZyBsaW5lICovDQogICAgLyogUGFydGlhbCBEaXNwbGF5IENvbnRyb2wgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KICAgIExDRF9Xcml0ZVJlZyhMQ0RfUkVHXzEyOCwgMHgwMDAwKTsNCiAgICBMQ0RfV3JpdGVSZWcoTENEX1JFR18xMjksIDB4MDAwMCk7DQogICAgTENEX1dyaXRlUmVnKExDRF9SRUdfMTMwLCAweDAwMDApOw0KICAgIExDRF9Xcml0ZVJlZyhMQ0RfUkVHXzEzMSwgMHgwMDAwKTsNCiAgICBMQ0RfV3JpdGVSZWcoTENEX1JFR18xMzIsIDB4MDAwMCk7DQogICAgTENEX1dyaXRlUmVnKExDRF9SRUdfMTMzLCAweDAwMDApOw0KICAgIC8qIFBhbmVsIENvbnRyb2wgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCiAgICBMQ0RfV3JpdGVSZWcoTENEX1JFR18xNDQsIDB4MDAxMCk7DQogICAgTENEX1dyaXRlUmVnKExDRF9SRUdfMTQ2LCAweDAwMDApOw0KICAgIExDRF9Xcml0ZVJlZyhMQ0RfUkVHXzE0NywgMHgwMDAzKTsNCiAgICBMQ0RfV3JpdGVSZWcoTENEX1JFR18xNDksIDB4MDExMCk7DQogICAgTENEX1dyaXRlUmVnKExDRF9SRUdfMTUxLCAweDAwMDApOw0KICAgIExDRF9Xcml0ZVJlZyhMQ0RfUkVHXzE1MiwgMHgwMDAwKTsNCiAgICAvKiBTZXQgR1JBTSB3cml0ZSBkaXJlY3Rpb24gYW5kIEJHUiA9IDEgKi8NCiAgICAvKiBJL0Q9MDEgKEhvcml6b250YWwgOiBpbmNyZW1lbnQsIFZlcnRpY2FsIDogZGVjcmVtZW50KSAqLw0KICAgIC8qIEFNPTEgKGFkZHJlc3MgaXMgdXBkYXRlZCBpbiB2ZXJ0aWNhbCB3cml0aW5nIGRpcmVjdGlvbikgKi8NCiAgICBMQ0RfV3JpdGVSZWcoTENEX1JFR18zLCAweDEwMTgpOw0KICAgIExDRF9Xcml0ZVJlZyhMQ0RfUkVHXzcsIDB4MDE3Myk7IC8qIDI2MksgY29sb3IgYW5kIGRpc3BsYXkgT04gKi8NCiAgfQ0KfQ0KDQoNCi8qKg0KICAqIEBicmllZiAgSW5pdGlhbGl6ZXMgdGhlIExDRC4NCiAgKiBAcGFyYW0gIE5vbmUNCiAgKiBAcmV0dmFsIE5vbmUNCiAgKi8NCnZvaWQgU1RNMzJMMTUyX0xDRF9Jbml0KHZvaWQpDQp7DQogIC8qIFNldHVwcyB0aGUgTENEICovDQogIExDRF9TZXR1cCgpOw0KDQogIC8qIFRyeSB0byByZWFkIG5ldyBMQ0QgY29udHJvbGxlciBJRCAweDU0MDggKi8NCiAgaWYgKExDRF9SZWFkUmVnKExDRF9SRUdfMCkgPT0gTENEX1NQRkQ1NDA4KQ0KICB7DQogICAgTENEVHlwZSA9IExDRF9TUEZENTQwODsNCiAgfQ0KICBlbHNlDQogIHsNCiAgICBMQ0RUeXBlID0gTENEX0lMSTkzMjA7DQogICAgLyogU2V0dXBzIHRoZSBMQ0QgKi8NCiAgICBMQ0RfU2V0dXAoKTsNCiAgfQ0KDQogIExDRF9TZXRGb250KCZMQ0RfREVGQVVMVF9GT05UKTsNCn0NCg0KLyoqDQogICogQGJyaWVmICBTZXRzIHRoZSBMQ0QgVGV4dCBhbmQgQmFja2dyb3VuZCBjb2xvcnMuDQogICogQHBhcmFtICBfVGV4dENvbG9yOiBzcGVjaWZpZXMgdGhlIFRleHQgQ29sb3IuDQogICogQHBhcmFtICBfQmFja0NvbG9yOiBzcGVjaWZpZXMgdGhlIEJhY2tncm91bmQgQ29sb3IuDQogICogQHJldHZhbCBOb25lDQogICovDQp2b2lkIExDRF9TZXRDb2xvcnMoX19JTyB1aW50MTZfdCBfVGV4dENvbG9yLCBfX0lPIHVpbnQxNl90IF9CYWNrQ29sb3IpDQp7DQogIFRleHRDb2xvciA9IF9UZXh0Q29sb3I7DQogIEJhY2tDb2xvciA9IF9CYWNrQ29sb3I7DQp9DQoNCi8qKg0KICAqIEBicmllZiAgR2V0cyB0aGUgTENEIFRleHQgYW5kIEJhY2tncm91bmQgY29sb3JzLg0KICAqIEBwYXJhbSAgX1RleHRDb2xvcjogcG9pbnRlciB0byB0aGUgdmFyaWFibGUgdGhhdCB3aWxsIGNvbnRhaW4gdGhlIFRleHQNCiAgICAgICAgICAgIENvbG9yLg0KICAqIEBwYXJhbSAgX0JhY2tDb2xvcjogcG9pbnRlciB0byB0aGUgdmFyaWFibGUgdGhhdCB3aWxsIGNvbnRhaW4gdGhlIEJhY2tncm91bmQNCiAgICAgICAgICAgIENvbG9yLg0KICAqIEByZXR2YWwgTm9uZQ0KICAqLw0Kdm9pZCBMQ0RfR2V0Q29sb3JzKF9fSU8gdWludDE2X3QgKl9UZXh0Q29sb3IsIF9fSU8gdWludDE2X3QgKl9CYWNrQ29sb3IpDQp7DQogICpfVGV4dENvbG9yID0gVGV4dENvbG9yOyAqX0JhY2tDb2xvciA9IEJhY2tDb2xvcjsNCn0NCg0KLyoqDQogICogQGJyaWVmICBTZXRzIHRoZSBUZXh0IGNvbG9yLg0KICAqIEBwYXJhbSAgQ29sb3I6IHNwZWNpZmllcyB0aGUgVGV4dCBjb2xvciBjb2RlIFJHQig1LTYtNSkuDQogICogQHJldHZhbCBOb25lDQogICovDQp2b2lkIExDRF9TZXRUZXh0Q29sb3IoX19JTyB1aW50MTZfdCBDb2xvcikNCnsNCiAgVGV4dENvbG9yID0gQ29sb3I7DQp9DQoNCg0KLyoqDQogICogQGJyaWVmICBTZXRzIHRoZSBCYWNrZ3JvdW5kIGNvbG9yLg0KICAqIEBwYXJhbSAgQ29sb3I6IHNwZWNpZmllcyB0aGUgQmFja2dyb3VuZCBjb2xvciBjb2RlIFJHQig1LTYtNSkuDQogICogQHJldHZhbCBOb25lDQogICovDQp2b2lkIExDRF9TZXRCYWNrQ29sb3IoX19JTyB1aW50MTZfdCBDb2xvcikNCnsNCiAgQmFja0NvbG9yID0gQ29sb3I7DQp9DQoNCi8qKg0KICAqIEBicmllZiAgU2V0cyB0aGUgVGV4dCBGb250Lg0KICAqIEBwYXJhbSAgZm9udHM6IHNwZWNpZmllcyB0aGUgZm9udCB0byBiZSB1c2VkLg0KICAqIEByZXR2YWwgTm9uZQ0KICAqLw0Kdm9pZCBMQ0RfU2V0Rm9udChzRk9OVCAqZm9udHMpDQp7DQogIExDRF9DdXJyZW50Zm9udHMgPSBmb250czsNCn0NCg0KLyoqDQogICogQGJyaWVmICBHZXRzIHRoZSBUZXh0IEZvbnQuDQogICogQHBhcmFtICBOb25lLg0KICAqIEByZXR2YWwgdGhlIHVzZWQgZm9udC4NCiAgKi8NCnNGT05UICpMQ0RfR2V0Rm9udCh2b2lkKQ0Kew0KICByZXR1cm4gTENEX0N1cnJlbnRmb250czsNCn0NCg0KLyoqDQogICogQGJyaWVmICBDbGVhcnMgdGhlIHNlbGVjdGVkIGxpbmUuDQogICogQHBhcmFtICBMaW5lOiB0aGUgTGluZSB0byBiZSBjbGVhcmVkLg0KICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCiAgKiAgICAgQGFyZyBMaW5leDogd2hlcmUgeCBjYW4gYmUgMC4ubg0KICAqIEByZXR2YWwgTm9uZQ0KICAqLw0Kdm9pZCBMQ0RfQ2xlYXJMaW5lKHVpbnQ4X3QgTGluZSkNCnsNCiAgdWludDE2X3QgcmVmY29sdW1uID0gTENEX1BJWEVMX1dJRFRIIC0gMTsNCg0KICAvKiBTZW5kIHRoZSBzdHJpbmcgY2hhcmFjdGVyIGJ5IGNoYXJhY3RlciBvbiBsQ0QgKi8NCiAgd2hpbGUgKCgocmVmY29sdW1uICsgMSkgJiAweEZGRkYpID49IExDRF9DdXJyZW50Zm9udHMtPldpZHRoKQ0KICB7DQogICAgLyogRGlzcGxheSBvbmUgY2hhcmFjdGVyIG9uIExDRCAqLw0KICAgIExDRF9EaXNwbGF5Q2hhcihMaW5lLCByZWZjb2x1bW4sICcgJyk7DQogICAgLyogRGVjcmVtZW50IHRoZSBjb2x1bW4gcG9zaXRpb24gYnkgMTYgKi8NCiAgICByZWZjb2x1bW4gLT0gTENEX0N1cnJlbnRmb250cy0+V2lkdGg7DQogIH0NCn0NCg0KDQovKioNCiAgKiBAYnJpZWYgIENsZWFycyB0aGUgaG9sZSBMQ0QuDQogICogQHBhcmFtICBDb2xvcjogdGhlIGNvbG9yIG9mIHRoZSBiYWNrZ3JvdW5kLg0KICAqIEByZXR2YWwgTm9uZQ0KICAqLw0Kdm9pZCBMQ0RfQ2xlYXIodWludDE2X3QgQ29sb3IpDQp7DQogIHVpbnQzMl90IGluZGV4ID0gMDsNCg0KICBMQ0RfU2V0Q3Vyc29yKDB4MDAsIDB4MDEzRik7DQoNCiAgTENEX1dyaXRlUkFNX1ByZXBhcmUoKTsgLyogUHJlcGFyZSB0byB3cml0ZSBHUkFNICovDQoNCiAgZm9yKGluZGV4ID0gMDsgaW5kZXggPCA3NjgwMDsgaW5kZXgrKykNCiAgew0KICAgIExDRF9Xcml0ZVJBTShDb2xvcik7DQogIH0NCg0KICBMQ0RfQ3RybExpbmVzV3JpdGUoTENEX05DU19HUElPX1BPUlQsIExDRF9OQ1NfUElOLCBCaXRfU0VUKTsNCg0KfQ0KDQoNCi8qKg0KICAqIEBicmllZiAgU2V0cyB0aGUgY3Vyc29yIHBvc2l0aW9uLg0KICAqIEBwYXJhbSAgWHBvczogc3BlY2lmaWVzIHRoZSBYIHBvc2l0aW9uLg0KICAqIEBwYXJhbSAgWXBvczogc3BlY2lmaWVzIHRoZSBZIHBvc2l0aW9uLg0KICAqIEByZXR2YWwgTm9uZQ0KICAqLw0Kdm9pZCBMQ0RfU2V0Q3Vyc29yKHVpbnQ4X3QgWHBvcywgdWludDE2X3QgWXBvcykNCnsNCiAgTENEX1dyaXRlUmVnKExDRF9SRUdfMzIsIFhwb3MpOw0KICBMQ0RfV3JpdGVSZWcoTENEX1JFR18zMywgWXBvcyk7DQp9DQoNCg0KLyoqDQogICogQGJyaWVmICBEcmF3cyBhIGNoYXJhY3RlciBvbiBMQ0QuDQogICogQHBhcmFtICBYcG9zOiB0aGUgTGluZSB3aGVyZSB0byBkaXNwbGF5IHRoZSBjaGFyYWN0ZXIgc2hhcGUuDQogICogQHBhcmFtICBZcG9zOiBzdGFydCBjb2x1bW4gYWRkcmVzcy4NCiAgKiBAcGFyYW0gIGM6IHBvaW50ZXIgdG8gdGhlIGNoYXJhY3RlciBkYXRhLg0KICAqIEByZXR2YWwgTm9uZQ0KICAqLw0Kdm9pZCBMQ0RfRHJhd0NoYXIodWludDhfdCBYcG9zLCB1aW50MTZfdCBZcG9zLCBjb25zdCB1aW50MTZfdCAqYykNCnsNCiAgdWludDMyX3QgaW5kZXggPSAwLCBpID0gMDsNCiAgdWludDhfdCBYYWRkcmVzcyA9IDA7DQoNCiAgWGFkZHJlc3MgPSBYcG9zOw0KDQogIExDRF9TZXRDdXJzb3IoWGFkZHJlc3MsIFlwb3MpOw0KDQogIGZvcihpbmRleCA9IDA7IGluZGV4IDwgTENEX0N1cnJlbnRmb250cy0+SGVpZ2h0OyBpbmRleCsrKQ0KICB7DQogICAgTENEX1dyaXRlUkFNX1ByZXBhcmUoKTsgLyogUHJlcGFyZSB0byB3cml0ZSBHUkFNICovDQoNCiAgICBmb3IoaSA9IDA7IGkgPCBMQ0RfQ3VycmVudGZvbnRzLT5XaWR0aDsgaSsrKQ0KICAgIHsNCiAgICAgIGlmKCgoKGNbaW5kZXhdICYgKCgweDgwIDw8ICgoTENEX0N1cnJlbnRmb250cy0+V2lkdGggLyAxMiApICogOCApICkgPj4gaSkpID09IDB4MDApICYmKExDRF9DdXJyZW50Zm9udHMtPldpZHRoIDw9IDEyKSl8fA0KICAgICAgICAoKChjW2luZGV4XSAmICgweDEgPDwgaSkpID09IDB4MDApJiYoTENEX0N1cnJlbnRmb250cy0+V2lkdGggPiAxMiApKSkNCg0KICAgICAgew0KICAgICAgICBMQ0RfV3JpdGVSQU0oQmFja0NvbG9yKTsNCiAgICAgIH0NCiAgICAgIGVsc2UNCiAgICAgIHsNCiAgICAgICAgTENEX1dyaXRlUkFNKFRleHRDb2xvcik7DQogICAgICB9DQogICAgfQ0KDQogICAgTENEX0N0cmxMaW5lc1dyaXRlKExDRF9OQ1NfR1BJT19QT1JULCBMQ0RfTkNTX1BJTiwgQml0X1NFVCk7DQogICAgWGFkZHJlc3MrKzsNCiAgICBMQ0RfU2V0Q3Vyc29yKFhhZGRyZXNzLCBZcG9zKTsNCiAgfQ0KfQ0KDQoNCi8qKg0KICAqIEBicmllZiAgRGlzcGxheXMgb25lIGNoYXJhY3RlciAoMTZkb3RzIHdpZHRoLCAyNGRvdHMgaGVpZ2h0KS4NCiAgKiBAcGFyYW0gIExpbmU6IHRoZSBMaW5lIHdoZXJlIHRvIGRpc3BsYXkgdGhlIGNoYXJhY3RlciBzaGFwZSAuDQogICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KICAqICAgICBAYXJnIExpbmV4OiB3aGVyZSB4IGNhbiBiZSAwLi45DQogICogQHBhcmFtICBDb2x1bW46IHN0YXJ0IGNvbHVtbiBhZGRyZXNzLg0KICAqIEBwYXJhbSAgQXNjaWk6IGNoYXJhY3RlciBhc2NpaSBjb2RlLCBtdXN0IGJlIGJldHdlZW4gMHgyMCBhbmQgMHg3RS4NCiAgKiBAcmV0dmFsIE5vbmUNCiAgKi8NCnZvaWQgTENEX0Rpc3BsYXlDaGFyKHVpbnQ4X3QgTGluZSwgdWludDE2X3QgQ29sdW1uLCB1aW50OF90IEFzY2lpKQ0Kew0KICBBc2NpaSAtPSAzMjsNCiAgTENEX0RyYXdDaGFyKExpbmUsIENvbHVtbiwgJkxDRF9DdXJyZW50Zm9udHMtPnRhYmxlW0FzY2lpICogTENEX0N1cnJlbnRmb250cy0+SGVpZ2h0XSk7DQp9DQoNCg0KLyoqDQogICogQGJyaWVmICBEaXNwbGF5cyBhIG1heGltdW0gb2YgMjAgY2hhciBvbiB0aGUgTENELg0KICAqIEBwYXJhbSAgTGluZTogdGhlIExpbmUgd2hlcmUgdG8gZGlzcGxheSB0aGUgY2hhcmFjdGVyIHNoYXBlIC4NCiAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQogICogICAgIEBhcmcgTGluZXg6IHdoZXJlIHggY2FuIGJlIDAuLjkNCiAgKiBAcGFyYW0gICpwdHI6IHBvaW50ZXIgdG8gc3RyaW5nIHRvIGRpc3BsYXkgb24gTENELg0KICAqIEByZXR2YWwgTm9uZQ0KICAqLw0Kdm9pZCBMQ0RfRGlzcGxheVN0cmluZ0xpbmUodWludDhfdCBMaW5lLCB1aW50OF90ICpwdHIpDQp7DQogIHVpbnQxNl90IHJlZmNvbHVtbiA9IExDRF9QSVhFTF9XSURUSCAtIDE7DQoNCiAgLyogU2VuZCB0aGUgc3RyaW5nIGNoYXJhY3RlciBieSBjaGFyYWN0ZXIgb24gbENEICovDQogIHdoaWxlICgoKnB0ciAhPSAwKSAmICgoKHJlZmNvbHVtbiArIDEpICYgMHhGRkZGKSA+PSBMQ0RfQ3VycmVudGZvbnRzLT5XaWR0aCkpDQogIHsNCiAgICAvKiBEaXNwbGF5IG9uZSBjaGFyYWN0ZXIgb24gTENEICovDQogICAgTENEX0Rpc3BsYXlDaGFyKExpbmUsIHJlZmNvbHVtbiwgKnB0cik7DQogICAgLyogRGVjcmVtZW50IHRoZSBjb2x1bW4gcG9zaXRpb24gYnkgMTYgKi8NCiAgICByZWZjb2x1bW4gLT0gTENEX0N1cnJlbnRmb250cy0+V2lkdGg7DQogICAgLyogUG9pbnQgb24gdGhlIG5leHQgY2hhcmFjdGVyICovDQogICAgcHRyKys7DQogIH0NCn0NCg0KDQovKioNCiAgKiBAYnJpZWYgIFNldHMgYSBkaXNwbGF5IHdpbmRvdw0KICAqIEBwYXJhbSAgWHBvczogc3BlY2lmaWVzIHRoZSBYIGJ1dHRvbSBsZWZ0IHBvc2l0aW9uLg0KICAqIEBwYXJhbSAgWXBvczogc3BlY2lmaWVzIHRoZSBZIGJ1dHRvbSBsZWZ0IHBvc2l0aW9uLg0KICAqIEBwYXJhbSAgSGVpZ2h0OiBkaXNwbGF5IHdpbmRvdyBoZWlnaHQuDQogICogQHBhcmFtICBXaWR0aDogZGlzcGxheSB3aW5kb3cgd2lkdGguDQogICogQHJldHZhbCBOb25lDQogICovDQp2b2lkIExDRF9TZXREaXNwbGF5V2luZG93KHVpbnQ4X3QgWHBvcywgdWludDE2X3QgWXBvcywgdWludDhfdCBIZWlnaHQsIHVpbnQxNl90IFdpZHRoKQ0Kew0KICAvKiBIb3Jpem9udGFsIEdSQU0gU3RhcnQgQWRkcmVzcyAqLw0KICBpZihYcG9zID49IEhlaWdodCkNCiAgew0KICAgIExDRF9Xcml0ZVJlZyhMQ0RfUkVHXzgwLCAoWHBvcyAtIEhlaWdodCArIDEpKTsNCiAgfQ0KICBlbHNlDQogIHsNCiAgICBMQ0RfV3JpdGVSZWcoTENEX1JFR184MCwgMCk7DQogIH0NCiAgLyogSG9yaXpvbnRhbCBHUkFNIEVuZCBBZGRyZXNzICovDQogIExDRF9Xcml0ZVJlZyhMQ0RfUkVHXzgxLCBYcG9zKTsNCiAgLyogVmVydGljYWwgR1JBTSBTdGFydCBBZGRyZXNzICovDQogIGlmKFlwb3MgPj0gV2lkdGgpDQogIHsNCiAgICBMQ0RfV3JpdGVSZWcoTENEX1JFR184MiwgKFlwb3MgLSBXaWR0aCArIDEpKTsNCiAgfQ0KICBlbHNlDQogIHsNCiAgICBMQ0RfV3JpdGVSZWcoTENEX1JFR184MiwgMCk7DQogIH0NCiAgLyogVmVydGljYWwgR1JBTSBFbmQgQWRkcmVzcyAqLw0KICBMQ0RfV3JpdGVSZWcoTENEX1JFR184MywgWXBvcyk7DQoNCiAgTENEX1NldEN1cnNvcihYcG9zLCBZcG9zKTsNCn0NCg0KDQovKioNCiAgKiBAYnJpZWYgIERpc2FibGVzIExDRCBXaW5kb3cgbW9kZS4NCiAgKiBAcGFyYW0gIE5vbmUNCiAgKiBAcmV0dmFsIE5vbmUNCiAgKi8NCnZvaWQgTENEX1dpbmRvd01vZGVEaXNhYmxlKHZvaWQpDQp7DQogIExDRF9TZXREaXNwbGF5V2luZG93KDIzOSwgMHgxM0YsIDI0MCwgMzIwKTsNCiAgTENEX1dyaXRlUmVnKExDRF9SRUdfMywgMHgxMDE4KTsNCn0NCg0KLyoqDQogICogQGJyaWVmICBEaXNwbGF5cyBhIGxpbmUuDQogICogQHBhcmFtICBYcG9zOiBzcGVjaWZpZXMgdGhlIFggcG9zaXRpb24uDQogICogQHBhcmFtICBZcG9zOiBzcGVjaWZpZXMgdGhlIFkgcG9zaXRpb24uDQogICogQHBhcmFtICBMZW5ndGg6IGxpbmUgbGVuZ3RoLg0KICAqIEBwYXJhbSAgRGlyZWN0aW9uOiBsaW5lIGRpcmVjdGlvbi4NCiAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6IFZlcnRpY2FsIG9yIEhvcml6b250YWwuDQogICogQHJldHZhbCBOb25lDQogICovDQp2b2lkIExDRF9EcmF3TGluZSh1aW50OF90IFhwb3MsIHVpbnQxNl90IFlwb3MsIHVpbnQxNl90IExlbmd0aCwgdWludDhfdCBEaXJlY3Rpb24pDQp7DQogIHVpbnQzMl90IGkgPSAwOw0KDQogIExDRF9TZXRDdXJzb3IoWHBvcywgWXBvcyk7DQoNCiAgaWYoRGlyZWN0aW9uID09IExDRF9ESVJfSE9SSVpPTlRBTCkNCiAgew0KICAgIExDRF9Xcml0ZVJBTV9QcmVwYXJlKCk7IC8qIFByZXBhcmUgdG8gd3JpdGUgR1JBTSAqLw0KDQogICAgZm9yKGkgPSAwOyBpIDwgTGVuZ3RoOyBpKyspDQogICAgew0KICAgICAgTENEX1dyaXRlUkFNKFRleHRDb2xvcik7DQogICAgfQ0KICAgIExDRF9DdHJsTGluZXNXcml0ZShMQ0RfTkNTX0dQSU9fUE9SVCwgTENEX05DU19QSU4sIEJpdF9TRVQpOw0KICB9DQogIGVsc2UNCiAgew0KICAgIGZvcihpID0gMDsgaSA8IExlbmd0aDsgaSsrKQ0KICAgIHsNCiAgICAgIExDRF9Xcml0ZVJBTVdvcmQoVGV4dENvbG9yKTsNCiAgICAgIFhwb3MrKzsNCiAgICAgIExDRF9TZXRDdXJzb3IoWHBvcywgWXBvcyk7DQogICAgfQ0KICB9DQp9DQoNCg0KLyoqDQogICogQGJyaWVmICBEaXNwbGF5cyBhIHJlY3RhbmdsZS4NCiAgKiBAcGFyYW0gIFhwb3M6IHNwZWNpZmllcyB0aGUgWCBwb3NpdGlvbi4NCiAgKiBAcGFyYW0gIFlwb3M6IHNwZWNpZmllcyB0aGUgWSBwb3NpdGlvbi4NCiAgKiBAcGFyYW0gIEhlaWdodDogZGlzcGxheSByZWN0YW5nbGUgaGVpZ2h0Lg0KICAqIEBwYXJhbSAgV2lkdGg6IGRpc3BsYXkgcmVjdGFuZ2xlIHdpZHRoLg0KICAqIEByZXR2YWwgTm9uZQ0KICAqLw0Kdm9pZCBMQ0RfRHJhd1JlY3QodWludDhfdCBYcG9zLCB1aW50MTZfdCBZcG9zLCB1aW50OF90IEhlaWdodCwgdWludDE2X3QgV2lkdGgpDQp7DQogIExDRF9EcmF3TGluZShYcG9zLCBZcG9zLCBXaWR0aCwgTENEX0RJUl9IT1JJWk9OVEFMKTsNCiAgTENEX0RyYXdMaW5lKChYcG9zICsgSGVpZ2h0KSwgWXBvcywgV2lkdGgsIExDRF9ESVJfSE9SSVpPTlRBTCk7DQoNCiAgTENEX0RyYXdMaW5lKFhwb3MsIFlwb3MsIEhlaWdodCwgTENEX0RJUl9WRVJUSUNBTCk7DQogIExDRF9EcmF3TGluZShYcG9zLCAoWXBvcyAtIFdpZHRoICsgMSksIEhlaWdodCwgTENEX0RJUl9WRVJUSUNBTCk7DQp9DQoNCg0KLyoqDQogICogQGJyaWVmICBEaXNwbGF5cyBhIGNpcmNsZS4NCiAgKiBAcGFyYW0gIFhwb3M6IHNwZWNpZmllcyB0aGUgWCBwb3NpdGlvbi4NCiAgKiBAcGFyYW0gIFlwb3M6IHNwZWNpZmllcyB0aGUgWSBwb3NpdGlvbi4NCiAgKiBAcGFyYW0gIFJhZGl1cw0KICAqIEByZXR2YWwgTm9uZQ0KICAqLw0Kdm9pZCBMQ0RfRHJhd0NpcmNsZSh1aW50OF90IFhwb3MsIHVpbnQxNl90IFlwb3MsIHVpbnQxNl90IFJhZGl1cykNCnsNCiAgaW50MzJfdCAgRDsvKiBEZWNpc2lvbiBWYXJpYWJsZSAqLw0KICB1aW50MzJfdCAgQ3VyWDsvKiBDdXJyZW50IFggVmFsdWUgKi8NCiAgdWludDMyX3QgIEN1clk7LyogQ3VycmVudCBZIFZhbHVlICovDQoNCiAgRCA9IDMgLSAoUmFkaXVzIDw8IDEpOw0KICBDdXJYID0gMDsNCiAgQ3VyWSA9IFJhZGl1czsNCg0KICB3aGlsZSAoQ3VyWCA8PSBDdXJZKQ0KICB7DQogICAgTENEX1NldEN1cnNvcihYcG9zICsgQ3VyWCwgWXBvcyArIEN1clkpOw0KICAgIExDRF9Xcml0ZVJBTVdvcmQoVGV4dENvbG9yKTsNCiAgICBMQ0RfU2V0Q3Vyc29yKFhwb3MgKyBDdXJYLCBZcG9zIC0gQ3VyWSk7DQogICAgTENEX1dyaXRlUkFNV29yZChUZXh0Q29sb3IpOw0KDQogICAgTENEX1NldEN1cnNvcihYcG9zIC0gQ3VyWCwgWXBvcyArIEN1clkpOw0KICAgIExDRF9Xcml0ZVJBTVdvcmQoVGV4dENvbG9yKTsNCg0KICAgIExDRF9TZXRDdXJzb3IoWHBvcyAtIEN1clgsIFlwb3MgLSBDdXJZKTsNCiAgICBMQ0RfV3JpdGVSQU1Xb3JkKFRleHRDb2xvcik7DQoNCiAgICBMQ0RfU2V0Q3Vyc29yKFhwb3MgKyBDdXJZLCBZcG9zICsgQ3VyWCk7DQogICAgTENEX1dyaXRlUkFNV29yZChUZXh0Q29sb3IpOw0KDQogICAgTENEX1NldEN1cnNvcihYcG9zICsgQ3VyWSwgWXBvcyAtIEN1clgpOw0KICAgIExDRF9Xcml0ZVJBTVdvcmQoVGV4dENvbG9yKTsNCg0KICAgIExDRF9TZXRDdXJzb3IoWHBvcyAtIEN1clksIFlwb3MgKyBDdXJYKTsNCiAgICBMQ0RfV3JpdGVSQU1Xb3JkKFRleHRDb2xvcik7DQoNCiAgICBMQ0RfU2V0Q3Vyc29yKFhwb3MgLSBDdXJZLCBZcG9zIC0gQ3VyWCk7DQogICAgTENEX1dyaXRlUkFNV29yZChUZXh0Q29sb3IpOw0KDQogICAgaWYgKEQgPCAwKQ0KICAgIHsNCiAgICAgIEQgKz0gKEN1clggPDwgMikgKyA2Ow0KICAgIH0NCiAgICBlbHNlDQogICAgew0KICAgICAgRCArPSAoKEN1clggLSBDdXJZKSA8PCAyKSArIDEwOw0KICAgICAgQ3VyWS0tOw0KICAgIH0NCiAgICBDdXJYKys7DQogIH0NCn0NCg0KDQovKioNCiAgKiBAYnJpZWYgIERpc3BsYXlzIGEgbW9ub2NvbG9yIHBpY3R1cmUuDQogICogQHBhcmFtICBQaWN0OiBwb2ludGVyIHRvIHRoZSBwaWN0dXJlIGFycmF5Lg0KICAqIEByZXR2YWwgTm9uZQ0KICAqLw0Kdm9pZCBMQ0RfRHJhd01vbm9QaWN0KGNvbnN0IHVpbnQzMl90ICpQaWN0KQ0Kew0KICB1aW50MzJfdCBpbmRleCA9IDAsIGkgPSAwOw0KICBMQ0RfU2V0Q3Vyc29yKDAsIChMQ0RfUElYRUxfV0lEVEggLSAxKSk7DQoNCiAgTENEX1dyaXRlUkFNX1ByZXBhcmUoKTsgLyogUHJlcGFyZSB0byB3cml0ZSBHUkFNICovDQoNCiAgZm9yKGluZGV4ID0gMDsgaW5kZXggPCAyNDAwOyBpbmRleCsrKQ0KICB7DQogICAgZm9yKGkgPSAwOyBpIDwgMzI7IGkrKykNCiAgICB7DQogICAgICBpZigoUGljdFtpbmRleF0gJiAoMSA8PCBpKSkgPT0gMHgwMCkNCiAgICAgIHsNCiAgICAgICAgTENEX1dyaXRlUkFNKEJhY2tDb2xvcik7DQogICAgICB9DQogICAgICBlbHNlDQogICAgICB7DQogICAgICAgIExDRF9Xcml0ZVJBTShUZXh0Q29sb3IpOw0KICAgICAgfQ0KICAgIH0NCiAgfQ0KDQogIExDRF9DdHJsTGluZXNXcml0ZShMQ0RfTkNTX0dQSU9fUE9SVCwgTENEX05DU19QSU4sIEJpdF9TRVQpOw0KfQ0KDQojaWZkZWYgVVNFX0xDRF9EcmF3Qk1QDQovKioNCiAgKiBAYnJpZWYgIERpc3BsYXlzIGEgYml0bWFwIHBpY3R1cmUgbG9hZGVkIGluIHRoZSBTUEkgRmxhc2guDQogICogQHBhcmFtICBCbXBBZGRyZXNzOiBCbXAgcGljdHVyZSBhZGRyZXNzIGluIHRoZSBTUEkgRmxhc2guDQogICogQHJldHZhbCBOb25lDQogICovDQp2b2lkIExDRF9EcmF3Qk1QKHVpbnQzMl90IEJtcEFkZHJlc3MpDQp7DQogIHVpbnQzMl90IGkgPSAwLCBzaXplID0gMDsNCiAgLyogUmVhZCBiaXRtYXAgc2l6ZSAqLw0KICBTUElfRkxBU0hfQnVmZmVyUmVhZCgodWludDhfdCopJnNpemUsIEJtcEFkZHJlc3MgKyAyLCA0KTsNCiAgLyogZ2V0IGJpdG1hcCBkYXRhIGFkZHJlc3Mgb2Zmc2V0ICovDQogIFNQSV9GTEFTSF9CdWZmZXJSZWFkKCh1aW50OF90KikmaSwgQm1wQWRkcmVzcyArIDEwLCA0KTsNCg0KICBzaXplID0gKHNpemUgLSBpKS8yOw0KICBTUElfRkxBU0hfU3RhcnRSZWFkU2VxdWVuY2UoQm1wQWRkcmVzcyArIGkpOw0KICAvKiBEaXNhYmxlIFNQSTEgICovDQogIFNQSV9DbWQoU1BJMSwgRElTQUJMRSk7DQogIC8qIFNQSSBpbiAxNi1iaXQgbW9kZSAqLw0KICBTUElfRGF0YVNpemVDb25maWcoU1BJMSwgU1BJX0RhdGFTaXplXzE2Yik7DQogIC8qIEVuYWJsZSBTUEkxICAqLw0KICBTUElfQ21kKFNQSTEsIEVOQUJMRSk7DQoNCiAgaWYoKExDRFR5cGUgPT0gTENEX0lMSTkzMjApIHx8IChMQ0RUeXBlID09IExDRF9TUEZENTQwOCkpDQogIHsNCiAgICAvKiBTZXQgR1JBTSB3cml0ZSBkaXJlY3Rpb24gYW5kIEJHUiA9IDEgKi8NCiAgICAvKiBJL0Q9MDAgKEhvcml6b250YWwgOiBkZWNyZW1lbnQsIFZlcnRpY2FsIDogZGVjcmVtZW50KSAqLw0KICAgIC8qIEFNPTEgKGFkZHJlc3MgaXMgdXBkYXRlZCBpbiB2ZXJ0aWNhbCB3cml0aW5nIGRpcmVjdGlvbikgKi8NCiAgICBMQ0RfV3JpdGVSZWcoTENEX1JFR18zLCAweDEwMDgpOw0KICAgIExDRF9Xcml0ZVJBTV9QcmVwYXJlKCk7IC8qIFByZXBhcmUgdG8gd3JpdGUgR1JBTSAqLw0KICB9DQoNCiAgLyogUmVhZCBiaXRtYXAgZGF0YSBmcm9tIFNQSSBGbGFzaCBhbmQgc2VuZCB0aGVtIHRvIExDRCAqLw0KICBmb3IoaSA9IDA7IGkgPCBzaXplOyBpKyspDQogIHsNCiAgICBMQ0RfV3JpdGVSQU0oX19SRVYxNihTUElfRkxBU0hfU2VuZEhhbGZXb3JkKDB4QTVBNSkpKTsNCiAgfQ0KICBpZigoTENEVHlwZSA9PSBMQ0RfSUxJOTMyMCkgfHwgKExDRFR5cGUgPT0gTENEX1NQRkQ1NDA4KSkNCiAgew0KICAgIExDRF9DdHJsTGluZXNXcml0ZShMQ0RfTkNTX0dQSU9fUE9SVCwgTENEX05DU19QSU4sIEJpdF9TRVQpOw0KICB9DQoNCiAgLyogRGVzZWxlY3QgdGhlIEZMQVNIOiBDaGlwIFNlbGVjdCBoaWdoICovDQogIFNQSV9GTEFTSF9DU19ISUdIKCk7DQogIC8qIERpc2FibGUgU1BJMSAgKi8NCiAgU1BJX0NtZChTUEkxLCBESVNBQkxFKTsNCiAgLyogU1BJIGluIDgtYml0IG1vZGUgKi8NCiAgU1BJX0RhdGFTaXplQ29uZmlnKFNQSTEsIFNQSV9EYXRhU2l6ZV84Yik7DQogIC8qIEVuYWJsZSBTUEkxICAqLw0KICBTUElfQ21kKFNQSTEsIEVOQUJMRSk7DQoNCiAgaWYoKExDRFR5cGUgPT0gTENEX0lMSTkzMjApIHx8IChMQ0RUeXBlID09IExDRF9TUEZENTQwOCkpDQogIHsNCiAgICAvKiBTZXQgR1JBTSB3cml0ZSBkaXJlY3Rpb24gYW5kIEJHUiA9IDEgKi8NCiAgICAvKiBJL0QgPSAwMSAoSG9yaXpvbnRhbCA6IGluY3JlbWVudCwgVmVydGljYWwgOiBkZWNyZW1lbnQpICovDQogICAgLyogQU0gPSAxIChhZGRyZXNzIGlzIHVwZGF0ZWQgaW4gdmVydGljYWwgd3JpdGluZyBkaXJlY3Rpb24pICovDQogICAgTENEX1dyaXRlUmVnKExDRF9SRUdfMywgMHgxMDE4KTsNCiAgfQ0KfQ0KI2VuZGlmIC8qIFVTRV9MQ0RfRHJhd0JNUCAqLw0KDQovKioNCiAgKiBAYnJpZWYgIERpc3BsYXlzIGEgZnVsbCByZWN0YW5nbGUuDQogICogQHBhcmFtICBYcG9zOiBzcGVjaWZpZXMgdGhlIFggcG9zaXRpb24uDQogICogQHBhcmFtICBZcG9zOiBzcGVjaWZpZXMgdGhlIFkgcG9zaXRpb24uDQogICogQHBhcmFtICBIZWlnaHQ6IHJlY3RhbmdsZSBoZWlnaHQuDQogICogQHBhcmFtICBXaWR0aDogcmVjdGFuZ2xlIHdpZHRoLg0KICAqIEByZXR2YWwgTm9uZQ0KICAqLw0Kdm9pZCBMQ0RfRHJhd0Z1bGxSZWN0KHVpbnQxNl90IFhwb3MsIHVpbnQxNl90IFlwb3MsIHVpbnQxNl90IFdpZHRoLCB1aW50MTZfdCBIZWlnaHQpDQp7DQogIExDRF9TZXRUZXh0Q29sb3IoVGV4dENvbG9yKTsNCg0KICBMQ0RfRHJhd0xpbmUoWHBvcywgWXBvcywgV2lkdGgsIExDRF9ESVJfSE9SSVpPTlRBTCk7DQogIExDRF9EcmF3TGluZSgoWHBvcyArIEhlaWdodCksIFlwb3MsIFdpZHRoLCBMQ0RfRElSX0hPUklaT05UQUwpOw0KDQogIExDRF9EcmF3TGluZShYcG9zLCBZcG9zLCBIZWlnaHQsIExDRF9ESVJfVkVSVElDQUwpOw0KICBMQ0RfRHJhd0xpbmUoWHBvcywgKFlwb3MgLSBXaWR0aCArIDEpLCBIZWlnaHQsIExDRF9ESVJfVkVSVElDQUwpOw0KDQogIFdpZHRoIC09IDI7DQogIEhlaWdodC0tOw0KICBZcG9zLS07DQoNCiAgTENEX1NldFRleHRDb2xvcihCYWNrQ29sb3IpOw0KDQogIHdoaWxlKEhlaWdodC0tKQ0KICB7DQogICAgTENEX0RyYXdMaW5lKCsrWHBvcywgWXBvcywgV2lkdGgsIExDRF9ESVJfSE9SSVpPTlRBTCk7DQogIH0NCg0KICBMQ0RfU2V0VGV4dENvbG9yKFRleHRDb2xvcik7DQp9DQoNCi8qKg0KICAqIEBicmllZiAgRGlzcGxheXMgYSBmdWxsIGNpcmNsZS4NCiAgKiBAcGFyYW0gIFhwb3M6IHNwZWNpZmllcyB0aGUgWCBwb3NpdGlvbi4NCiAgKiBAcGFyYW0gIFlwb3M6IHNwZWNpZmllcyB0aGUgWSBwb3NpdGlvbi4NCiAgKiBAcGFyYW0gIFJhZGl1cw0KICAqIEByZXR2YWwgTm9uZQ0KICAqLw0Kdm9pZCBMQ0RfRHJhd0Z1bGxDaXJjbGUodWludDE2X3QgWHBvcywgdWludDE2X3QgWXBvcywgdWludDE2X3QgUmFkaXVzKQ0Kew0KICBpbnQzMl90ICBEOyAgICAvKiBEZWNpc2lvbiBWYXJpYWJsZSAqLw0KICB1aW50MzJfdCAgQ3VyWDsvKiBDdXJyZW50IFggVmFsdWUgKi8NCiAgdWludDMyX3QgIEN1clk7LyogQ3VycmVudCBZIFZhbHVlICovDQoNCiAgRCA9IDMgLSAoUmFkaXVzIDw8IDEpOw0KDQogIEN1clggPSAwOw0KICBDdXJZID0gUmFkaXVzOw0KDQogIExDRF9TZXRUZXh0Q29sb3IoQmFja0NvbG9yKTsNCg0KICB3aGlsZSAoQ3VyWCA8PSBDdXJZKQ0KICB7DQogICAgaWYoQ3VyWSA+IDApDQogICAgew0KICAgICAgTENEX0RyYXdMaW5lKFhwb3MgLSBDdXJYLCBZcG9zICsgQ3VyWSwgMipDdXJZLCBMQ0RfRElSX0hPUklaT05UQUwpOw0KICAgICAgTENEX0RyYXdMaW5lKFhwb3MgKyBDdXJYLCBZcG9zICsgQ3VyWSwgMipDdXJZLCBMQ0RfRElSX0hPUklaT05UQUwpOw0KICAgIH0NCg0KICAgIGlmKEN1clggPiAwKQ0KICAgIHsNCiAgICAgIExDRF9EcmF3TGluZShYcG9zIC0gQ3VyWSwgWXBvcyArIEN1clgsIDIqQ3VyWCwgTENEX0RJUl9IT1JJWk9OVEFMKTsNCiAgICAgIExDRF9EcmF3TGluZShYcG9zICsgQ3VyWSwgWXBvcyArIEN1clgsIDIqQ3VyWCwgTENEX0RJUl9IT1JJWk9OVEFMKTsNCiAgICB9DQogICAgaWYgKEQgPCAwKQ0KICAgIHsNCiAgICAgIEQgKz0gKEN1clggPDwgMikgKyA2Ow0KICAgIH0NCiAgICBlbHNlDQogICAgew0KICAgICAgRCArPSAoKEN1clggLSBDdXJZKSA8PCAyKSArIDEwOw0KICAgICAgQ3VyWS0tOw0KICAgIH0NCiAgICBDdXJYKys7DQogIH0NCg0KICBMQ0RfU2V0VGV4dENvbG9yKFRleHRDb2xvcik7DQogIExDRF9EcmF3Q2lyY2xlKFhwb3MsIFlwb3MsIFJhZGl1cyk7DQp9DQoNCi8qKg0KICAqIEBicmllZiAgRGlzcGxheXMgYW4gdW5pIGxpbmUgKGJldHdlZW4gdHdvIHBvaW50cykuDQogICogQHBhcmFtICB4MTogc3BlY2lmaWVzIHRoZSBwb2ludCAxIHggcG9zaXRpb24uDQogICogQHBhcmFtICB5MTogc3BlY2lmaWVzIHRoZSBwb2ludCAxIHkgcG9zaXRpb24uDQogICogQHBhcmFtICB4Mjogc3BlY2lmaWVzIHRoZSBwb2ludCAyIHggcG9zaXRpb24uDQogICogQHBhcmFtICB5Mjogc3BlY2lmaWVzIHRoZSBwb2ludCAyIHkgcG9zaXRpb24uDQogICogQHJldHZhbCBOb25lDQogICovDQp2b2lkIExDRF9EcmF3VW5pTGluZSh1aW50MTZfdCB4MSwgdWludDE2X3QgeTEsIHVpbnQxNl90IHgyLCB1aW50MTZfdCB5MikNCnsNCiAgaW50MTZfdCBkZWx0YXggPSAwLCBkZWx0YXkgPSAwLCB4ID0gMCwgeSA9IDAsIHhpbmMxID0gMCwgeGluYzIgPSAwLA0KICB5aW5jMSA9IDAsIHlpbmMyID0gMCwgZGVuID0gMCwgbnVtID0gMCwgbnVtYWRkID0gMCwgbnVtcGl4ZWxzID0gMCwNCiAgY3VycGl4ZWwgPSAwOw0KDQogIGRlbHRheCA9IEFCUyh4MiAtIHgxKTsgICAgICAgIC8qIFRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIHgncyAqLw0KICBkZWx0YXkgPSBBQlMoeTIgLSB5MSk7ICAgICAgICAvKiBUaGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSB5J3MgKi8NCiAgeCA9IHgxOyAgICAgICAgICAgICAgICAgICAgICAgLyogU3RhcnQgeCBvZmYgYXQgdGhlIGZpcnN0IHBpeGVsICovDQogIHkgPSB5MTsgICAgICAgICAgICAgICAgICAgICAgIC8qIFN0YXJ0IHkgb2ZmIGF0IHRoZSBmaXJzdCBwaXhlbCAqLw0KDQogIGlmICh4MiA+PSB4MSkgICAgICAgICAgICAgICAgIC8qIFRoZSB4LXZhbHVlcyBhcmUgaW5jcmVhc2luZyAqLw0KICB7DQogICAgeGluYzEgPSAxOw0KICAgIHhpbmMyID0gMTsNCiAgfQ0KICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBUaGUgeC12YWx1ZXMgYXJlIGRlY3JlYXNpbmcgKi8NCiAgew0KICAgIHhpbmMxID0gLTE7DQogICAgeGluYzIgPSAtMTsNCiAgfQ0KDQogIGlmICh5MiA+PSB5MSkgICAgICAgICAgICAgICAgIC8qIFRoZSB5LXZhbHVlcyBhcmUgaW5jcmVhc2luZyAqLw0KICB7DQogICAgeWluYzEgPSAxOw0KICAgIHlpbmMyID0gMTsNCiAgfQ0KICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBUaGUgeS12YWx1ZXMgYXJlIGRlY3JlYXNpbmcgKi8NCiAgew0KICAgIHlpbmMxID0gLTE7DQogICAgeWluYzIgPSAtMTsNCiAgfQ0KDQogIGlmIChkZWx0YXggPj0gZGVsdGF5KSAgICAgICAgIC8qIFRoZXJlIGlzIGF0IGxlYXN0IG9uZSB4LXZhbHVlIGZvciBldmVyeSB5LXZhbHVlICovDQogIHsNCiAgICB4aW5jMSA9IDA7ICAgICAgICAgICAgICAgICAgLyogRG9uJ3QgY2hhbmdlIHRoZSB4IHdoZW4gbnVtZXJhdG9yID49IGRlbm9taW5hdG9yICovDQogICAgeWluYzIgPSAwOyAgICAgICAgICAgICAgICAgIC8qIERvbid0IGNoYW5nZSB0aGUgeSBmb3IgZXZlcnkgaXRlcmF0aW9uICovDQogICAgZGVuID0gZGVsdGF4Ow0KICAgIG51bSA9IGRlbHRheCAvIDI7DQogICAgbnVtYWRkID0gZGVsdGF5Ow0KICAgIG51bXBpeGVscyA9IGRlbHRheDsgICAgICAgICAvKiBUaGVyZSBhcmUgbW9yZSB4LXZhbHVlcyB0aGFuIHktdmFsdWVzICovDQogIH0NCiAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVGhlcmUgaXMgYXQgbGVhc3Qgb25lIHktdmFsdWUgZm9yIGV2ZXJ5IHgtdmFsdWUgKi8NCiAgew0KICAgIHhpbmMyID0gMDsgICAgICAgICAgICAgICAgICAvKiBEb24ndCBjaGFuZ2UgdGhlIHggZm9yIGV2ZXJ5IGl0ZXJhdGlvbiAqLw0KICAgIHlpbmMxID0gMDsgICAgICAgICAgICAgICAgICAvKiBEb24ndCBjaGFuZ2UgdGhlIHkgd2hlbiBudW1lcmF0b3IgPj0gZGVub21pbmF0b3IgKi8NCiAgICBkZW4gPSBkZWx0YXk7DQogICAgbnVtID0gZGVsdGF5IC8gMjsNCiAgICBudW1hZGQgPSBkZWx0YXg7DQogICAgbnVtcGl4ZWxzID0gZGVsdGF5OyAgICAgICAgIC8qIFRoZXJlIGFyZSBtb3JlIHktdmFsdWVzIHRoYW4geC12YWx1ZXMgKi8NCiAgfQ0KDQogIGZvciAoY3VycGl4ZWwgPSAwOyBjdXJwaXhlbCA8PSBudW1waXhlbHM7IGN1cnBpeGVsKyspDQogIHsNCiAgICBQdXRQaXhlbCh4LCB5KTsgICAgICAgICAgICAgLyogRHJhdyB0aGUgY3VycmVudCBwaXhlbCAqLw0KICAgIG51bSArPSBudW1hZGQ7ICAgICAgICAgICAgICAvKiBJbmNyZWFzZSB0aGUgbnVtZXJhdG9yIGJ5IHRoZSB0b3Agb2YgdGhlIGZyYWN0aW9uICovDQogICAgaWYgKG51bSA+PSBkZW4pICAgICAgICAgICAgIC8qIENoZWNrIGlmIG51bWVyYXRvciA+PSBkZW5vbWluYXRvciAqLw0KICAgIHsNCiAgICAgIG51bSAtPSBkZW47ICAgICAgICAgICAgICAgLyogQ2FsY3VsYXRlIHRoZSBuZXcgbnVtZXJhdG9yIHZhbHVlICovDQogICAgICB4ICs9IHhpbmMxOyAgICAgICAgICAgICAgIC8qIENoYW5nZSB0aGUgeCBhcyBhcHByb3ByaWF0ZSAqLw0KICAgICAgeSArPSB5aW5jMTsgICAgICAgICAgICAgICAvKiBDaGFuZ2UgdGhlIHkgYXMgYXBwcm9wcmlhdGUgKi8NCiAgICB9DQogICAgeCArPSB4aW5jMjsgICAgICAgICAgICAgICAgIC8qIENoYW5nZSB0aGUgeCBhcyBhcHByb3ByaWF0ZSAqLw0KICAgIHkgKz0geWluYzI7ICAgICAgICAgICAgICAgICAvKiBDaGFuZ2UgdGhlIHkgYXMgYXBwcm9wcmlhdGUgKi8NCiAgfQ0KfQ0KDQovKioNCiAgKiBAYnJpZWYgIERpc3BsYXlzIGFuIHBvbHlsaW5lIChiZXR3ZWVuIG1hbnkgcG9pbnRzKS4NCiAgKiBAcGFyYW0gIFBvaW50czogcG9pbnRlciB0byB0aGUgcG9pbnRzIGFycmF5Lg0KICAqIEBwYXJhbSAgUG9pbnRDb3VudDogTnVtYmVyIG9mIHBvaW50cy4NCiAgKiBAcmV0dmFsIE5vbmUNCiAgKi8NCnZvaWQgTENEX1BvbHlMaW5lKHBQb2ludCBQb2ludHMsIHVpbnQxNl90IFBvaW50Q291bnQpDQp7DQogIGludDE2X3QgWCA9IDAsIFkgPSAwOw0KDQogIGlmKFBvaW50Q291bnQgPCAyKQ0KICB7DQogICAgcmV0dXJuOw0KICB9DQoNCiAgd2hpbGUoLS1Qb2ludENvdW50KQ0KICB7DQogICAgWCA9IFBvaW50cy0+WDsNCiAgICBZID0gUG9pbnRzLT5ZOw0KICAgIFBvaW50cysrOw0KICAgIExDRF9EcmF3VW5pTGluZShYLCBZLCBQb2ludHMtPlgsIFBvaW50cy0+WSk7DQogIH0NCn0NCg0KLyoqDQogICogQGJyaWVmICBEaXNwbGF5cyBhbiByZWxhdGl2ZSBwb2x5bGluZSAoYmV0d2VlbiBtYW55IHBvaW50cykuDQogICogQHBhcmFtICBQb2ludHM6IHBvaW50ZXIgdG8gdGhlIHBvaW50cyBhcnJheS4NCiAgKiBAcGFyYW0gIFBvaW50Q291bnQ6IE51bWJlciBvZiBwb2ludHMuDQogICogQHBhcmFtICBDbG9zZWQ6IHNwZWNpZmllcyBpZiB0aGUgZHJhdyBpcyBjbG9zZWQgb3Igbm90Lg0KICAqICAgICAgICAgICAxOiBjbG9zZWQsIDAgOiBub3QgY2xvc2VkLg0KICAqIEByZXR2YWwgTm9uZQ0KICAqLw0Kc3RhdGljIHZvaWQgTENEX1BvbHlMaW5lUmVsYXRpdmVDbG9zZWQocFBvaW50IFBvaW50cywgdWludDE2X3QgUG9pbnRDb3VudCwgdWludDE2X3QgQ2xvc2VkKQ0Kew0KICBpbnQxNl90IFggPSAwLCBZID0gMDsNCiAgcFBvaW50IEZpcnN0ID0gUG9pbnRzOw0KDQogIGlmKFBvaW50Q291bnQgPCAyKQ0KICB7DQogICAgcmV0dXJuOw0KICB9DQogIFggPSBQb2ludHMtPlg7DQogIFkgPSBQb2ludHMtPlk7DQogIHdoaWxlKC0tUG9pbnRDb3VudCkNCiAgew0KICAgIFBvaW50cysrOw0KICAgIExDRF9EcmF3VW5pTGluZShYLCBZLCBYICsgUG9pbnRzLT5YLCBZICsgUG9pbnRzLT5ZKTsNCiAgICBYID0gWCArIFBvaW50cy0+WDsNCiAgICBZID0gWSArIFBvaW50cy0+WTsNCiAgfQ0KICBpZihDbG9zZWQpDQogIHsNCiAgICBMQ0RfRHJhd1VuaUxpbmUoRmlyc3QtPlgsIEZpcnN0LT5ZLCBYLCBZKTsNCiAgfQ0KfQ0KDQovKioNCiAgKiBAYnJpZWYgIERpc3BsYXlzIGEgY2xvc2VkIHBvbHlsaW5lIChiZXR3ZWVuIG1hbnkgcG9pbnRzKS4NCiAgKiBAcGFyYW0gIFBvaW50czogcG9pbnRlciB0byB0aGUgcG9pbnRzIGFycmF5Lg0KICAqIEBwYXJhbSAgUG9pbnRDb3VudDogTnVtYmVyIG9mIHBvaW50cy4NCiAgKiBAcmV0dmFsIE5vbmUNCiAgKi8NCnZvaWQgTENEX0Nsb3NlZFBvbHlMaW5lKHBQb2ludCBQb2ludHMsIHVpbnQxNl90IFBvaW50Q291bnQpDQp7DQogIExDRF9Qb2x5TGluZShQb2ludHMsIFBvaW50Q291bnQpOw0KICBMQ0RfRHJhd1VuaUxpbmUoUG9pbnRzLT5YLCBQb2ludHMtPlksIChQb2ludHMrUG9pbnRDb3VudC0xKS0+WCwgKFBvaW50cytQb2ludENvdW50LTEpLT5ZKTsNCn0NCg0KLyoqDQogICogQGJyaWVmICBEaXNwbGF5cyBhIHJlbGF0aXZlIHBvbHlsaW5lIChiZXR3ZWVuIG1hbnkgcG9pbnRzKS4NCiAgKiBAcGFyYW0gIFBvaW50czogcG9pbnRlciB0byB0aGUgcG9pbnRzIGFycmF5Lg0KICAqIEBwYXJhbSAgUG9pbnRDb3VudDogTnVtYmVyIG9mIHBvaW50cy4NCiAgKiBAcmV0dmFsIE5vbmUNCiAgKi8NCnZvaWQgTENEX1BvbHlMaW5lUmVsYXRpdmUocFBvaW50IFBvaW50cywgdWludDE2X3QgUG9pbnRDb3VudCkNCnsNCiAgTENEX1BvbHlMaW5lUmVsYXRpdmVDbG9zZWQoUG9pbnRzLCBQb2ludENvdW50LCAwKTsNCn0NCg0KLyoqDQogICogQGJyaWVmICBEaXNwbGF5cyBhIGNsb3NlZCByZWxhdGl2ZSBwb2x5bGluZSAoYmV0d2VlbiBtYW55IHBvaW50cykuDQogICogQHBhcmFtICBQb2ludHM6IHBvaW50ZXIgdG8gdGhlIHBvaW50cyBhcnJheS4NCiAgKiBAcGFyYW0gIFBvaW50Q291bnQ6IE51bWJlciBvZiBwb2ludHMuDQogICogQHJldHZhbCBOb25lDQogICovDQp2b2lkIExDRF9DbG9zZWRQb2x5TGluZVJlbGF0aXZlKHBQb2ludCBQb2ludHMsIHVpbnQxNl90IFBvaW50Q291bnQpDQp7DQogIExDRF9Qb2x5TGluZVJlbGF0aXZlQ2xvc2VkKFBvaW50cywgUG9pbnRDb3VudCwgMSk7DQp9DQoNCg0KLyoqDQogICogQGJyaWVmICBEaXNwbGF5cyBhICBmdWxsIHBvbHlsaW5lIChiZXR3ZWVuIG1hbnkgcG9pbnRzKS4NCiAgKiBAcGFyYW0gIFBvaW50czogcG9pbnRlciB0byB0aGUgcG9pbnRzIGFycmF5Lg0KICAqIEBwYXJhbSAgUG9pbnRDb3VudDogTnVtYmVyIG9mIHBvaW50cy4NCiAgKiBAcmV0dmFsIE5vbmUNCiAgKi8NCnZvaWQgTENEX0ZpbGxQb2x5TGluZShwUG9pbnQgUG9pbnRzLCB1aW50MTZfdCBQb2ludENvdW50KQ0Kew0KICAvKiAgcHVibGljLWRvbWFpbiBjb2RlIGJ5IERhcmVsIFJleCBGaW5sZXksIDIwMDcgKi8NCiAgdWludDE2X3QgIG5vZGVzID0gMCwgbm9kZVhbTUFYX1BPTFlfQ09STkVSU10sIHBpeGVsWCA9IDAsIHBpeGVsWSA9IDAsIGkgPSAwLA0KICBqID0gMCwgc3dhcCA9IDA7DQogIHVpbnQxNl90ICBJTUFHRV9MRUZUID0gMCwgSU1BR0VfUklHSFQgPSAwLCBJTUFHRV9UT1AgPSAwLCBJTUFHRV9CT1RUT00gPSAwOw0KDQogIElNQUdFX0xFRlQgPSBJTUFHRV9SSUdIVCA9IFBvaW50cy0+WDsNCiAgSU1BR0VfVE9QPSBJTUFHRV9CT1RUT00gPSBQb2ludHMtPlk7DQoNCiAgZm9yKGkgPSAxOyBpIDwgUG9pbnRDb3VudDsgaSsrKQ0KICB7DQogICAgcGl4ZWxYID0gUE9MWV9YKGkpOw0KICAgIGlmKHBpeGVsWCA8IElNQUdFX0xFRlQpDQogICAgew0KICAgICAgSU1BR0VfTEVGVCA9IHBpeGVsWDsNCiAgICB9DQogICAgaWYocGl4ZWxYID4gSU1BR0VfUklHSFQpDQogICAgew0KICAgICAgSU1BR0VfUklHSFQgPSBwaXhlbFg7DQogICAgfQ0KDQogICAgcGl4ZWxZID0gUE9MWV9ZKGkpOw0KICAgIGlmKHBpeGVsWSA8IElNQUdFX1RPUCkNCiAgICB7DQogICAgICBJTUFHRV9UT1AgPSBwaXhlbFk7DQogICAgfQ0KICAgIGlmKHBpeGVsWSA+IElNQUdFX0JPVFRPTSkNCiAgICB7DQogICAgICBJTUFHRV9CT1RUT00gPSBwaXhlbFk7DQogICAgfQ0KICB9DQoNCiAgTENEX1NldFRleHRDb2xvcihCYWNrQ29sb3IpOw0KDQogIC8qICBMb29wIHRocm91Z2ggdGhlIHJvd3Mgb2YgdGhlIGltYWdlLiAqLw0KICBmb3IgKHBpeGVsWSA9IElNQUdFX1RPUDsgcGl4ZWxZIDwgSU1BR0VfQk9UVE9NOyBwaXhlbFkrKykNCiAgew0KICAgIC8qIEJ1aWxkIGEgbGlzdCBvZiBub2Rlcy4gKi8NCiAgICBub2RlcyA9IDA7IGogPSBQb2ludENvdW50LTE7DQoNCiAgICBmb3IgKGkgPSAwOyBpIDwgUG9pbnRDb3VudDsgaSsrKQ0KICAgIHsNCiAgICAgIGlmIChQT0xZX1koaSk8KGRvdWJsZSkgcGl4ZWxZICYmIFBPTFlfWShqKT49KGRvdWJsZSkgcGl4ZWxZIHx8IFBPTFlfWShqKTwoZG91YmxlKSBwaXhlbFkgJiYgUE9MWV9ZKGkpPj0oZG91YmxlKSBwaXhlbFkpDQogICAgICB7DQogICAgICAgIG5vZGVYW25vZGVzKytdPShpbnQpIChQT0xZX1goaSkrKChwaXhlbFktUE9MWV9ZKGkpKSooUE9MWV9YKGopLVBPTFlfWChpKSkpLyhQT0xZX1koaiktUE9MWV9ZKGkpKSk7DQogICAgICB9DQogICAgICBqID0gaTsNCiAgICB9DQoNCiAgICAvKiBTb3J0IHRoZSBub2RlcywgdmlhIGEgc2ltcGxlIJNCdWJibGWUIHNvcnQuICovDQogICAgaSA9IDA7DQogICAgd2hpbGUgKGkgPCBub2Rlcy0xKQ0KICAgIHsNCiAgICAgIGlmIChub2RlWFtpXT5ub2RlWFtpKzFdKQ0KICAgICAgew0KICAgICAgICBzd2FwID0gbm9kZVhbaV07DQogICAgICAgIG5vZGVYW2ldID0gbm9kZVhbaSsxXTsNCiAgICAgICAgbm9kZVhbaSsxXSA9IHN3YXA7DQogICAgICAgIGlmKGkpDQogICAgICAgIHsNCiAgICAgICAgICBpLS07DQogICAgICAgIH0NCiAgICAgIH0NCiAgICAgIGVsc2UNCiAgICAgIHsNCiAgICAgICAgaSsrOw0KICAgICAgfQ0KICAgIH0NCg0KICAgIC8qICBGaWxsIHRoZSBwaXhlbHMgYmV0d2VlbiBub2RlIHBhaXJzLiAqLw0KICAgIGZvciAoaSA9IDA7IGkgPCBub2RlczsgaSs9MikNCiAgICB7DQogICAgICBpZihub2RlWFtpXSA+PSBJTUFHRV9SSUdIVCkNCiAgICAgIHsNCiAgICAgICAgYnJlYWs7DQogICAgICB9DQogICAgICBpZihub2RlWFtpKzFdID4gSU1BR0VfTEVGVCkNCiAgICAgIHsNCiAgICAgICAgaWYgKG5vZGVYW2ldIDwgSU1BR0VfTEVGVCkNCiAgICAgICAgew0KICAgICAgICAgIG5vZGVYW2ldPUlNQUdFX0xFRlQ7DQogICAgICAgIH0NCiAgICAgICAgaWYobm9kZVhbaSsxXSA+IElNQUdFX1JJR0hUKQ0KICAgICAgICB7DQogICAgICAgICAgbm9kZVhbaSsxXSA9IElNQUdFX1JJR0hUOw0KICAgICAgICB9DQogICAgICAgIExDRF9TZXRUZXh0Q29sb3IoQmFja0NvbG9yKTsNCiAgICAgICAgTENEX0RyYXdMaW5lKHBpeGVsWSwgbm9kZVhbaSsxXSwgbm9kZVhbaSsxXSAtIG5vZGVYW2ldLCBMQ0RfRElSX0hPUklaT05UQUwpOw0KICAgICAgICBMQ0RfU2V0VGV4dENvbG9yKFRleHRDb2xvcik7DQogICAgICAgIFB1dFBpeGVsKHBpeGVsWSwgbm9kZVhbaSsxXSk7DQogICAgICAgIFB1dFBpeGVsKHBpeGVsWSwgbm9kZVhbaV0pOw0KICAgICAgICAvKiBmb3IgKGo9bm9kZVhbaV07IGo8bm9kZVhbaSsxXTsgaisrKSBQdXRQaXhlbChqLHBpeGVsWSk7ICovDQogICAgICB9DQogICAgfQ0KICB9DQoNCiAgLyogZHJhdyB0aGUgZWRnZXMgKi8NCiAgTENEX1NldFRleHRDb2xvcihUZXh0Q29sb3IpOw0KfQ0KDQovKioNCiAgKiBAYnJpZWYgIFJlc2V0IExDRCBjb250cm9sIGxpbmUoL0NTKSBhbmQgU2VuZCBTdGFydC1CeXRlDQogICogQHBhcmFtICBTdGFydF9CeXRlOiB0aGUgU3RhcnQtQnl0ZSB0byBiZSBzZW50DQogICogQHJldHZhbCBOb25lDQogICovDQp2b2lkIExDRF9uQ1NfU3RhcnRCeXRlKHVpbnQ4X3QgU3RhcnRfQnl0ZSkNCnsNCiAgTENEX0N0cmxMaW5lc1dyaXRlKExDRF9OQ1NfR1BJT19QT1JULCBMQ0RfTkNTX1BJTiwgQml0X1JFU0VUKTsNCg0KICBTUElfU2VuZERhdGEoTENEX1NQSSwgU3RhcnRfQnl0ZSk7DQoNCiAgd2hpbGUoU1BJX0dldEZsYWdTdGF0dXMoTENEX1NQSSwgU1BJX0ZMQUdfQlNZKSAhPSBSRVNFVCkNCiAgew0KICB9DQp9DQoNCg0KLyoqDQogICogQGJyaWVmICBXcml0ZXMgaW5kZXggdG8gc2VsZWN0IHRoZSBMQ0QgcmVnaXN0ZXIuDQogICogQHBhcmFtICBMQ0RfUmVnOiBhZGRyZXNzIG9mIHRoZSBzZWxlY3RlZCByZWdpc3Rlci4NCiAgKiBAcmV0dmFsIE5vbmUNCiAgKi8NCnZvaWQgTENEX1dyaXRlUmVnSW5kZXgodWludDhfdCBMQ0RfUmVnKQ0Kew0KICAvKiBSZXNldCBMQ0QgY29udHJvbCBsaW5lKC9DUykgYW5kIFNlbmQgU3RhcnQtQnl0ZSAqLw0KICBMQ0RfbkNTX1N0YXJ0Qnl0ZShTVEFSVF9CWVRFIHwgU0VUX0lOREVYKTsNCg0KICAvKiBXcml0ZSAxNi1iaXQgUmVnIEluZGV4IChIaWdoIEJ5dGUgaXMgMCkgKi8NCiAgU1BJX1NlbmREYXRhKExDRF9TUEksIDB4MDApOw0KDQogIHdoaWxlKFNQSV9HZXRGbGFnU3RhdHVzKExDRF9TUEksIFNQSV9GTEFHX0JTWSkgIT0gUkVTRVQpDQogIHsNCiAgfQ0KDQogIFNQSV9TZW5kRGF0YShMQ0RfU1BJLCBMQ0RfUmVnKTsNCg0KICB3aGlsZShTUElfR2V0RmxhZ1N0YXR1cyhMQ0RfU1BJLCBTUElfRkxBR19CU1kpICE9IFJFU0VUKQ0KICB7DQogIH0NCg0KICBMQ0RfQ3RybExpbmVzV3JpdGUoTENEX05DU19HUElPX1BPUlQsIExDRF9OQ1NfUElOLCBCaXRfU0VUKTsNCn0NCg0KDQovKioNCiAgKiBAYnJpZWYgIFdyaXRlcyB0byB0aGUgc2VsZWN0ZWQgTENEIElMSTkzMjAgcmVnaXN0ZXIuDQogICogQHBhcmFtICBMQ0RfUmVnOiBhZGRyZXNzIG9mIHRoZSBzZWxlY3RlZCByZWdpc3Rlci4NCiAgKiBAcGFyYW0gIExDRF9SZWdWYWx1ZTogdmFsdWUgdG8gd3JpdGUgdG8gdGhlIHNlbGVjdGVkIHJlZ2lzdGVyLg0KICAqIEByZXR2YWwgTm9uZQ0KICAqLw0Kdm9pZCBMQ0RfV3JpdGVSZWcodWludDhfdCBMQ0RfUmVnLCB1aW50MTZfdCBMQ0RfUmVnVmFsdWUpDQp7DQogIC8qIFdyaXRlIDE2LWJpdCBJbmRleCAodGhlbiBXcml0ZSBSZWcpICovDQogIExDRF9Xcml0ZVJlZ0luZGV4KExDRF9SZWcpOw0KDQogIC8qIFdyaXRlIDE2LWJpdCBSZWcgKi8NCiAgLyogUmVzZXQgTENEIGNvbnRyb2wgbGluZSgvQ1MpIGFuZCBTZW5kIFN0YXJ0LUJ5dGUgKi8NCiAgTENEX25DU19TdGFydEJ5dGUoU1RBUlRfQllURSB8IExDRF9XUklURV9SRUcpOw0KDQogIFNQSV9TZW5kRGF0YShMQ0RfU1BJLCBMQ0RfUmVnVmFsdWUgPj4gOCk7DQoNCiAgd2hpbGUoU1BJX0dldEZsYWdTdGF0dXMoTENEX1NQSSwgU1BJX0ZMQUdfQlNZKSAhPSBSRVNFVCkNCiAgew0KICB9DQoNCiAgU1BJX1NlbmREYXRhKExDRF9TUEksIChMQ0RfUmVnVmFsdWUgJiAweEZGKSk7DQoNCiAgd2hpbGUoU1BJX0dldEZsYWdTdGF0dXMoTENEX1NQSSwgU1BJX0ZMQUdfQlNZKSAhPSBSRVNFVCkNCiAgew0KICB9DQoNCiAgTENEX0N0cmxMaW5lc1dyaXRlKExDRF9OQ1NfR1BJT19QT1JULCBMQ0RfTkNTX1BJTiwgQml0X1NFVCk7DQp9DQoNCg0KLyoqDQogICogQGJyaWVmICBSZWFkcyB0aGUgc2VsZWN0ZWQgTENEIFJlZ2lzdGVyLg0KICAqIEBwYXJhbSAgTENEX1JlZzogYWRkcmVzcyBvZiB0aGUgc2VsZWN0ZWQgcmVnaXN0ZXIuDQogICogQHJldHZhbCBMQ0QgUmVnaXN0ZXIgVmFsdWUuDQogICovDQp1aW50MTZfdCBMQ0RfUmVhZFJlZyh1aW50OF90IExDRF9SZWcpDQp7DQogIHVpbnQxNl90IHRtcCA9IDA7DQogIHVpbnQ4X3QgaSA9IDA7DQoNCiAgLyogTENEX1NQSSBwcmVzY2FsZXI6IDQgKi8NCiAgTENEX1NQSS0+Q1IxICY9IDB4RkZDNzsNCiAgTENEX1NQSS0+Q1IxIHw9IDB4MDAwODsNCiAgLyogV3JpdGUgMTYtYml0IEluZGV4ICh0aGVuIFJlYWQgUmVnKSAqLw0KICBMQ0RfV3JpdGVSZWdJbmRleChMQ0RfUmVnKTsNCiAgLyogUmVhZCAxNi1iaXQgUmVnICovDQogIC8qIFJlc2V0IExDRCBjb250cm9sIGxpbmUoL0NTKSBhbmQgU2VuZCBTdGFydC1CeXRlICovDQogIExDRF9uQ1NfU3RhcnRCeXRlKFNUQVJUX0JZVEUgfCBMQ0RfUkVBRF9SRUcpOw0KDQogIGZvcihpID0gMDsgaSA8IDU7IGkrKykNCiAgew0KICAgIFNQSV9TZW5kRGF0YShMQ0RfU1BJLCAweEZGKTsNCiAgICB3aGlsZShTUElfR2V0RmxhZ1N0YXR1cyhMQ0RfU1BJLCBTUElfRkxBR19CU1kpICE9IFJFU0VUKQ0KICAgIHsNCiAgICB9DQogICAgLyogT25lIGJ5dGUgb2YgaW52YWxpZCBkdW1teSBkYXRhIHJlYWQgYWZ0ZXIgdGhlIHN0YXJ0IGJ5dGUgKi8NCiAgICB3aGlsZShTUElfR2V0RmxhZ1N0YXR1cyhMQ0RfU1BJLCBTUElfRkxBR19SWE5FKSA9PSBSRVNFVCkNCiAgICB7DQogICAgfQ0KICAgIFNQSV9SZWNlaXZlRGF0YShMQ0RfU1BJKTsNCiAgfQ0KDQogIFNQSV9TZW5kRGF0YShMQ0RfU1BJLCAweEZGKTsNCg0KICAvKiBSZWFkIHVwcGVyIGJ5dGUgKi8NCiAgd2hpbGUoU1BJX0dldEZsYWdTdGF0dXMoTENEX1NQSSwgU1BJX0ZMQUdfQlNZKSAhPSBSRVNFVCkNCiAgew0KICB9DQoNCiAgLyogUmVhZCBsb3dlciBieXRlICovDQogIHdoaWxlKFNQSV9HZXRGbGFnU3RhdHVzKExDRF9TUEksIFNQSV9GTEFHX1JYTkUpID09IFJFU0VUKQ0KICB7DQogIH0NCiAgdG1wID0gU1BJX1JlY2VpdmVEYXRhKExDRF9TUEkpOw0KDQoNCiAgU1BJX1NlbmREYXRhKExDRF9TUEksIDB4RkYpOw0KICB3aGlsZShTUElfR2V0RmxhZ1N0YXR1cyhMQ0RfU1BJLCBTUElfRkxBR19CU1kpICE9IFJFU0VUKQ0KICB7DQogIH0NCg0KICAvKiBSZWFkIGxvd2VyIGJ5dGUgKi8NCiAgd2hpbGUoU1BJX0dldEZsYWdTdGF0dXMoTENEX1NQSSwgU1BJX0ZMQUdfUlhORSkgPT0gUkVTRVQpDQogIHsNCiAgfQ0KDQogIHRtcCA9ICgodG1wICYgMHhGRikgPDwgOCkgfCBTUElfUmVjZWl2ZURhdGEoTENEX1NQSSk7DQogIExDRF9DdHJsTGluZXNXcml0ZShMQ0RfTkNTX0dQSU9fUE9SVCwgTENEX05DU19QSU4sIEJpdF9TRVQpOw0KDQogIC8qIExDRF9TUEkgcHJlc2NhbGVyOiAyICovDQogIExDRF9TUEktPkNSMSAmPSAweEZGQzc7DQoNCiAgcmV0dXJuIHRtcDsNCn0NCg0KDQovKioNCiAgKiBAYnJpZWYgIFByZXBhcmUgdG8gd3JpdGUgdG8gdGhlIExDRCBSQU0uDQogICogQHBhcmFtICBOb25lDQogICogQHJldHZhbCBOb25lDQogICovDQp2b2lkIExDRF9Xcml0ZVJBTV9QcmVwYXJlKHZvaWQpDQp7DQogIExDRF9Xcml0ZVJlZ0luZGV4KExDRF9SRUdfMzQpOyAvKiBTZWxlY3QgR1JBTSBSZWcgKi8NCg0KICAvKiBSZXNldCBMQ0QgY29udHJvbCBsaW5lKC9DUykgYW5kIFNlbmQgU3RhcnQtQnl0ZSAqLw0KICBMQ0RfbkNTX1N0YXJ0Qnl0ZShTVEFSVF9CWVRFIHwgTENEX1dSSVRFX1JFRyk7DQp9DQoNCg0KLyoqDQogICogQGJyaWVmICBXcml0ZXMgMSB3b3JkIHRvIHRoZSBMQ0QgUkFNLg0KICAqIEBwYXJhbSAgUkdCX0NvZGU6IHRoZSBwaXhlbCBjb2xvciBpbiBSR0IgbW9kZSAoNS02LTUpLg0KICAqIEByZXR2YWwgTm9uZQ0KICAqLw0Kdm9pZCBMQ0RfV3JpdGVSQU1Xb3JkKHVpbnQxNl90IFJHQl9Db2RlKQ0Kew0KICBMQ0RfV3JpdGVSQU1fUHJlcGFyZSgpOw0KDQogIExDRF9Xcml0ZVJBTShSR0JfQ29kZSk7DQoNCiAgTENEX0N0cmxMaW5lc1dyaXRlKExDRF9OQ1NfR1BJT19QT1JULCBMQ0RfTkNTX1BJTiwgQml0X1NFVCk7DQp9DQoNCi8qKg0KICAqIEBicmllZiAgV3JpdGVzIHRvIHRoZSBMQ0QgUkFNLg0KICAqIEBwYXJhbSAgUkdCX0NvZGU6IHRoZSBwaXhlbCBjb2xvciBpbiBSR0IgbW9kZSAoNS02LTUpLg0KICAqIEByZXR2YWwgTm9uZQ0KICAqLw0Kdm9pZCBMQ0RfV3JpdGVSQU0odWludDE2X3QgUkdCX0NvZGUpDQp7DQogIFNQSV9TZW5kRGF0YShMQ0RfU1BJLCBSR0JfQ29kZSA+PiA4KTsNCiAgd2hpbGUoU1BJX0dldEZsYWdTdGF0dXMoTENEX1NQSSwgU1BJX0ZMQUdfQlNZKSAhPSBSRVNFVCkNCiAgew0KICB9DQogIFNQSV9TZW5kRGF0YShMQ0RfU1BJLCBSR0JfQ29kZSAmIDB4RkYpOw0KICB3aGlsZShTUElfR2V0RmxhZ1N0YXR1cyhMQ0RfU1BJLCBTUElfRkxBR19CU1kpICE9IFJFU0VUKQ0KICB7DQogIH0NCn0NCg0KDQovKioNCiAgKiBAYnJpZWYgIFBvd2VyIG9uIHRoZSBMQ0QuDQogICogQHBhcmFtICBOb25lDQogICogQHJldHZhbCBOb25lDQogICovDQp2b2lkIExDRF9Qb3dlck9uKHZvaWQpDQp7DQogIC8qIFBvd2VyIE9uIHNlcXVlbmNlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQogIExDRF9Xcml0ZVJlZyhMQ0RfUkVHXzE2LCAweDAwMDApOyAvKiBTQVAsIEJUWzM6MF0sIEFQLCBEU1RCLCBTTFAsIFNUQiAqLw0KICBMQ0RfV3JpdGVSZWcoTENEX1JFR18xNywgMHgwMDAwKTsgLyogREMxWzI6MF0sIERDMFsyOjBdLCBWQ1syOjBdICovDQogIExDRF9Xcml0ZVJlZyhMQ0RfUkVHXzE4LCAweDAwMDApOyAvKiBWUkVHMU9VVCB2b2x0YWdlICovDQogIExDRF9Xcml0ZVJlZyhMQ0RfUkVHXzE5LCAweDAwMDApOyAvKiBWRFZbNDowXSBmb3IgVkNPTSBhbXBsaXR1ZGUgKi8NCiAgX2RlbGF5XygyMCk7ICAgICAgICAgICAgICAgICAvKiBEaXMtY2hhcmdlIGNhcGFjaXRvciBwb3dlciB2b2x0YWdlICgyMDBtcykgKi8NCiAgTENEX1dyaXRlUmVnKExDRF9SRUdfMTYsIDB4MTdCMCk7IC8qIFNBUCwgQlRbMzowXSwgQVAsIERTVEIsIFNMUCwgU1RCICovDQogIExDRF9Xcml0ZVJlZyhMQ0RfUkVHXzE3LCAweDAxMzcpOyAvKiBEQzFbMjowXSwgREMwWzI6MF0sIFZDWzI6MF0gKi8NCiAgX2RlbGF5Xyg1KTsgICAgICAgICAgICAgICAgLyogRGVsYXkgNTAgbXMgKi8NCiAgTENEX1dyaXRlUmVnKExDRF9SRUdfMTgsIDB4MDEzOSk7IC8qIFZSRUcxT1VUIHZvbHRhZ2UgKi8NCiAgX2RlbGF5Xyg1KTsgICAgICAgICAgICAgICAgLyogZGVsYXkgNTAgbXMgKi8NCiAgTENEX1dyaXRlUmVnKExDRF9SRUdfMTksIDB4MWQwMCk7IC8qIFZEVls0OjBdIGZvciBWQ09NIGFtcGxpdHVkZSAqLw0KICBMQ0RfV3JpdGVSZWcoTENEX1JFR180MSwgMHgwMDEzKTsgLyogVkNNWzQ6MF0gZm9yIFZDT01IICovDQogIF9kZWxheV8oNSk7ICAgICAgICAgICAgICAgIC8qIGRlbGF5IDUwIG1zICovDQogIExDRF9Xcml0ZVJlZyhMQ0RfUkVHXzcsIDB4MDE3Myk7ICAvKiAyNjJLIGNvbG9yIGFuZCBkaXNwbGF5IE9OICovDQp9DQoNCg0KLyoqDQogICogQGJyaWVmICBFbmFibGVzIHRoZSBEaXNwbGF5Lg0KICAqIEBwYXJhbSAgTm9uZQ0KICAqIEByZXR2YWwgTm9uZQ0KICAqLw0Kdm9pZCBMQ0RfRGlzcGxheU9uKHZvaWQpDQp7DQogIC8qIERpc3BsYXkgT24gKi8NCiAgTENEX1dyaXRlUmVnKExDRF9SRUdfNywgMHgwMTczKTsgLyogMjYySyBjb2xvciBhbmQgZGlzcGxheSBPTiAqLw0KfQ0KDQoNCi8qKg0KICAqIEBicmllZiAgRGlzYWJsZXMgdGhlIERpc3BsYXkuDQogICogQHBhcmFtICBOb25lDQogICogQHJldHZhbCBOb25lDQogICovDQp2b2lkIExDRF9EaXNwbGF5T2ZmKHZvaWQpDQp7DQogIC8qIERpc3BsYXkgT2ZmICovDQogIExDRF9Xcml0ZVJlZyhMQ0RfUkVHXzcsIDB4MCk7DQp9DQoNCg0KLyoqDQogICogQGJyaWVmICBDb25maWd1cmVzIExDRCBjb250cm9sIGxpbmVzIGluIE91dHB1dCBQdXNoLVB1bGwgbW9kZS4NCiAgKiBAcGFyYW0gIE5vbmUNCiAgKiBAcmV0dmFsIE5vbmUNCiAgKi8NCnZvaWQgTENEX0N0cmxMaW5lc0NvbmZpZyh2b2lkKQ0Kew0KICBHUElPX0luaXRUeXBlRGVmIEdQSU9fSW5pdFN0cnVjdHVyZTsNCg0KICBSQ0NfQUhCUGVyaXBoQ2xvY2tDbWQoTENEX05DU19HUElPX0NMSywgRU5BQkxFKTsNCg0KICAvKiBDb25maWd1cmUgTkNTIChQRi4wMikgaW4gT3V0cHV0IFB1c2gtUHVsbCBtb2RlICovDQogIEdQSU9fSW5pdFN0cnVjdHVyZS5HUElPX1BpbiA9IExDRF9OQ1NfUElOOw0KICBHUElPX0luaXRTdHJ1Y3R1cmUuR1BJT19TcGVlZCA9IEdQSU9fU3BlZWRfMk1IejsNCiAgR1BJT19Jbml0U3RydWN0dXJlLkdQSU9fTW9kZSA9IEdQSU9fTW9kZV9PVVQ7DQogIEdQSU9fSW5pdFN0cnVjdHVyZS5HUElPX09UeXBlID0gR1BJT19PVHlwZV9QUDsNCiAgR1BJT19Jbml0U3RydWN0dXJlLkdQSU9fUHVQZCA9IEdQSU9fUHVQZF9OT1BVTEw7DQogIEdQSU9fSW5pdChMQ0RfTkNTX0dQSU9fUE9SVCwgJkdQSU9fSW5pdFN0cnVjdHVyZSk7DQoNCiAgTENEX0N0cmxMaW5lc1dyaXRlKExDRF9OQ1NfR1BJT19QT1JULCBMQ0RfTkNTX1BJTiwgQml0X1NFVCk7DQp9DQoNCg0KLyoqDQogICogQGJyaWVmICBTZXRzIG9yIHJlc2V0IExDRCBjb250cm9sIGxpbmVzLg0KICAqIEBwYXJhbSAgR1BJT3g6IHdoZXJlIHggY2FuIGJlIEIgb3IgRCB0byBzZWxlY3QgdGhlIEdQSU8gcGVyaXBoZXJhbC4NCiAgKiBAcGFyYW0gIEN0cmxQaW5zOiB0aGUgQ29udHJvbCBsaW5lLg0KICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlOg0KICAqICAgICBAYXJnIExDRF9OQ1NfUElOOiBDaGlwIFNlbGVjdCBwaW4NCiAgKiAgICAgQGFyZyBMQ0RfTldSX1BJTjogUmVhZC9Xcml0ZSBTZWxlY3Rpb24gcGluDQogICogICAgIEBhcmcgTENEX1JTX1BJTjogUmVnaXN0ZXIvUkFNIFNlbGVjdGlvbiBwaW4NCiAgKiBAcGFyYW0gIEJpdFZhbDogc3BlY2lmaWVzIHRoZSB2YWx1ZSB0byBiZSB3cml0dGVuIHRvIHRoZSBzZWxlY3RlZCBiaXQuDQogICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmU6DQogICogICAgIEBhcmcgQml0X1JFU0VUOiB0byBjbGVhciB0aGUgcG9ydCBwaW4NCiAgKiAgICAgQGFyZyBCaXRfU0VUOiB0byBzZXQgdGhlIHBvcnQgcGluDQogICogQHJldHZhbCBOb25lDQogICovDQp2b2lkIExDRF9DdHJsTGluZXNXcml0ZShHUElPX1R5cGVEZWYqIEdQSU94LCB1aW50MTZfdCBDdHJsUGlucywgQml0QWN0aW9uIEJpdFZhbCkNCnsNCiAgLyogU2V0IG9yIFJlc2V0IHRoZSBjb250cm9sIGxpbmUgKi8NCiAgR1BJT19Xcml0ZUJpdChHUElPeCwgQ3RybFBpbnMsIEJpdFZhbCk7DQp9DQoNCg0KLyoqDQogICogQGJyaWVmICBDb25maWd1cmVzIHRoZSBMQ0RfU1BJIGludGVyZmFjZS4NCiAgKiBAcGFyYW0gIE5vbmUNCiAgKiBAcmV0dmFsIE5vbmUNCiAgKi8NCnZvaWQgTENEX1NQSUNvbmZpZyh2b2lkKQ0Kew0KICBTUElfSW5pdFR5cGVEZWYgICAgU1BJX0luaXRTdHJ1Y3R1cmU7DQogIEdQSU9fSW5pdFR5cGVEZWYgICBHUElPX0luaXRTdHJ1Y3R1cmU7DQoNCiAgLyogRW5hYmxlIExDRF9TUElfU0NLX0dQSU9fQ0xLLCBMQ0RfU1BJX01JU09fR1BJT19DTEsgYW5kIExDRF9TUElfTU9TSV9HUElPX0NMSyBjbG9jayAqLw0KICBSQ0NfQUhCUGVyaXBoQ2xvY2tDbWQoTENEX1NQSV9TQ0tfR1BJT19DTEsgfCBMQ0RfU1BJX01JU09fR1BJT19DTEsgfCBMQ0RfU1BJX01PU0lfR1BJT19DTEssIEVOQUJMRSk7DQoNCiAgLyogRW5hYmxlIExDRF9TUEkgYW5kIFNZU0NGRyBjbG9jayAgKi8NCiAgUkNDX0FQQjJQZXJpcGhDbG9ja0NtZChMQ0RfU1BJX0NMSyB8IFJDQ19BUEIyUGVyaXBoX1NZU0NGRywgRU5BQkxFKTsNCg0KICAvKiBDb25maWd1cmUgTENEX1NQSSBTQ0sgcGluICovDQogIEdQSU9fSW5pdFN0cnVjdHVyZS5HUElPX1BpbiA9IExDRF9TUElfU0NLX1BJTjsNCiAgR1BJT19Jbml0U3RydWN0dXJlLkdQSU9fU3BlZWQgPSBHUElPX1NwZWVkXzQwTUh6Ow0KICBHUElPX0luaXRTdHJ1Y3R1cmUuR1BJT19Nb2RlID0gR1BJT19Nb2RlX0FGOw0KICBHUElPX0luaXRTdHJ1Y3R1cmUuR1BJT19PVHlwZSA9IEdQSU9fT1R5cGVfUFA7DQogIEdQSU9fSW5pdFN0cnVjdHVyZS5HUElPX1B1UGQgPSBHUElPX1B1UGRfTk9QVUxMOw0KICBHUElPX0luaXQoTENEX1NQSV9TQ0tfR1BJT19QT1JULCAmR1BJT19Jbml0U3RydWN0dXJlKTsNCg0KICAvKiBDb25maWd1cmUgTENEX1NQSSBNSVNPIHBpbiAqLw0KICBHUElPX0luaXRTdHJ1Y3R1cmUuR1BJT19QaW4gPSBMQ0RfU1BJX01JU09fUElOOw0KICBHUElPX0luaXQoTENEX1NQSV9NSVNPX0dQSU9fUE9SVCwgJkdQSU9fSW5pdFN0cnVjdHVyZSk7DQoNCiAgLyogQ29uZmlndXJlIExDRF9TUEkgTU9TSSBwaW4gKi8NCiAgR1BJT19Jbml0U3RydWN0dXJlLkdQSU9fUGluID0gTENEX1NQSV9NT1NJX1BJTjsNCiAgR1BJT19Jbml0KExDRF9TUElfTU9TSV9HUElPX1BPUlQsICZHUElPX0luaXRTdHJ1Y3R1cmUpOw0KDQogIC8qIENvbm5lY3QgUEUuMTMgdG8gU1BJIFNDSyAqLw0KICBHUElPX1BpbkFGQ29uZmlnKExDRF9TUElfU0NLX0dQSU9fUE9SVCwgTENEX1NQSV9TQ0tfU09VUkNFLCBMQ0RfU1BJX1NDS19BRik7DQoNCiAgLyogQ29ubmVjdCBQRS4xNCB0byBTUEkgTUlTTyAqLw0KICBHUElPX1BpbkFGQ29uZmlnKExDRF9TUElfTUlTT19HUElPX1BPUlQsIExDRF9TUElfTUlTT19TT1VSQ0UsIExDRF9TUElfTUlTT19BRik7DQoNCiAgLyogQ29ubmVjdCBQRS4xNSB0byBTUEkgTU9TSSAqLw0KICBHUElPX1BpbkFGQ29uZmlnKExDRF9TUElfTU9TSV9HUElPX1BPUlQsIExDRF9TUElfTU9TSV9TT1VSQ0UsIExDRF9TUElfTU9TSV9BRik7DQoNCiAgU1BJX0RlSW5pdChMQ0RfU1BJKTsNCg0KICAvKiBTUEkgQ29uZmlnICovDQogIFNQSV9Jbml0U3RydWN0dXJlLlNQSV9EaXJlY3Rpb24gPSBTUElfRGlyZWN0aW9uXzJMaW5lc19GdWxsRHVwbGV4Ow0KICBTUElfSW5pdFN0cnVjdHVyZS5TUElfTW9kZSA9IFNQSV9Nb2RlX01hc3RlcjsNCiAgU1BJX0luaXRTdHJ1Y3R1cmUuU1BJX0RhdGFTaXplID0gU1BJX0RhdGFTaXplXzhiOw0KICBTUElfSW5pdFN0cnVjdHVyZS5TUElfQ1BPTCA9IFNQSV9DUE9MX0hpZ2g7DQogIFNQSV9Jbml0U3RydWN0dXJlLlNQSV9DUEhBID0gU1BJX0NQSEFfMkVkZ2U7DQogIFNQSV9Jbml0U3RydWN0dXJlLlNQSV9OU1MgPSBTUElfTlNTX1NvZnQ7DQogIFNQSV9Jbml0U3RydWN0dXJlLlNQSV9CYXVkUmF0ZVByZXNjYWxlciA9IFNQSV9CYXVkUmF0ZVByZXNjYWxlcl8yOw0KICBTUElfSW5pdFN0cnVjdHVyZS5TUElfRmlyc3RCaXQgPSBTUElfRmlyc3RCaXRfTVNCOw0KICBTUElfSW5pdFN0cnVjdHVyZS5TUElfQ1JDUG9seW5vbWlhbCA9IDc7DQogIFNQSV9Jbml0KExDRF9TUEksICZTUElfSW5pdFN0cnVjdHVyZSk7DQoNCiAgLyogU1BJIGVuYWJsZSAqLw0KICBTUElfQ21kKExDRF9TUEksIEVOQUJMRSk7DQp9DQoNCi8qKg0KICAqIEBicmllZiAgRGlzcGxheXMgYSBwaXhlbC4NCiAgKiBAcGFyYW0gIHg6IHBpeGVsIHguDQogICogQHBhcmFtICB5OiBwaXhlbCB5Lg0KICAqIEByZXR2YWwgTm9uZQ0KICAqLw0Kc3RhdGljIHZvaWQgUHV0UGl4ZWwoaW50MTZfdCB4LCBpbnQxNl90IHkpDQp7DQogIGlmKHggPCAwIHx8IHggPiAyMzkgfHwgeSA8IDAgfHwgeSA+IDMxOSkNCiAgew0KICAgIHJldHVybjsNCiAgfQ0KICBMQ0RfRHJhd0xpbmUoeCwgeSwgMSwgTENEX0RJUl9IT1JJWk9OVEFMKTsNCn0NCg0KI2lmbmRlZiBVU0VfRGVsYXkNCi8qKg0KICAqIEBicmllZiAgSW5zZXJ0cyBhIGRlbGF5IHRpbWUuDQogICogQHBhcmFtICBuQ291bnQ6IHNwZWNpZmllcyB0aGUgZGVsYXkgdGltZSBsZW5ndGguDQogICogQHJldHZhbCBOb25lDQogICovDQpzdGF0aWMgdm9pZCBkZWxheShfX0lPIHVpbnQzMl90IG5Db3VudCkNCnsNCiAgX19JTyB1aW50MzJfdCBpbmRleCA9IDA7DQogIGZvcihpbmRleCA9ICgzNDAwMCAqIG5Db3VudCk7IGluZGV4ICE9IDA7IGluZGV4LS0pDQogIHsNCiAgfQ0KfQ0KI2VuZGlmIC8qIFVTRV9EZWxheSovDQovKioNCiAgKiBAfQ0KICAqLw0KDQovKioNCiAgKiBAfQ0KICAqLw0KDQovKioNCiAgKiBAfQ0KICAqLw0KDQovKioNCiAgKiBAfQ0KICAqLw0KDQovKioNCiAgKiBAfQ0KICAqLw0KDQovKioqKioqKioqKioqKioqKioqKiAoQykgQ09QWVJJR0hUIDIwMTAgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLw0K