LyoqDQogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KICAqIEBmaWxlICAgIHN0bTMyZjEweF9kYWMuYw0KICAqIEBhdXRob3IgIE1DRCBBcHBsaWNhdGlvbiBUZWFtDQogICogQHZlcnNpb24gVjMuNC4wDQogICogQGRhdGUgICAgMTAvMTUvMjAxMA0KICAqIEBicmllZiAgIFRoaXMgZmlsZSBwcm92aWRlcyBhbGwgdGhlIERBQyBmaXJtd2FyZSBmdW5jdGlvbnMuDQogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KICAqIEBjb3B5DQogICoNCiAgKiBUSEUgUFJFU0VOVCBGSVJNV0FSRSBXSElDSCBJUyBGT1IgR1VJREFOQ0UgT05MWSBBSU1TIEFUIFBST1ZJRElORyBDVVNUT01FUlMNCiAgKiBXSVRIIENPRElORyBJTkZPUk1BVElPTiBSRUdBUkRJTkcgVEhFSVIgUFJPRFVDVFMgSU4gT1JERVIgRk9SIFRIRU0gVE8gU0FWRQ0KICAqIFRJTUUuIEFTIEEgUkVTVUxULCBTVE1JQ1JPRUxFQ1RST05JQ1MgU0hBTEwgTk9UIEJFIEhFTEQgTElBQkxFIEZPUiBBTlkNCiAgKiBESVJFQ1QsIElORElSRUNUIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBXSVRIIFJFU1BFQ1QgVE8gQU5ZIENMQUlNUyBBUklTSU5HDQogICogRlJPTSBUSEUgQ09OVEVOVCBPRiBTVUNIIEZJUk1XQVJFIEFORC9PUiBUSEUgVVNFIE1BREUgQlkgQ1VTVE9NRVJTIE9GIFRIRQ0KICAqIENPRElORyBJTkZPUk1BVElPTiBDT05UQUlORUQgSEVSRUlOIElOIENPTk5FQ1RJT04gV0lUSCBUSEVJUiBQUk9EVUNUUy4NCiAgKg0KICAqIDxoMj48Y2VudGVyPiZjb3B5OyBDT1BZUklHSFQgMjAxMCBTVE1pY3JvZWxlY3Ryb25pY3M8L2NlbnRlcj48L2gyPg0KICAqLyANCg0KLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCiNpbmNsdWRlICJzdG0zMmYxMHhfZGFjLmgiDQojaW5jbHVkZSAic3RtMzJmMTB4X3JjYy5oIg0KDQovKiogQGFkZHRvZ3JvdXAgU1RNMzJGMTB4X1N0ZFBlcmlwaF9Ecml2ZXINCiAgKiBAew0KICAqLw0KDQovKiogQGRlZmdyb3VwIERBQyANCiAgKiBAYnJpZWYgREFDIGRyaXZlciBtb2R1bGVzDQogICogQHsNCiAgKi8gDQoNCi8qKiBAZGVmZ3JvdXAgREFDX1ByaXZhdGVfVHlwZXNEZWZpbml0aW9ucw0KICAqIEB7DQogICovDQoNCi8qKg0KICAqIEB9DQogICovDQoNCi8qKiBAZGVmZ3JvdXAgREFDX1ByaXZhdGVfRGVmaW5lcw0KICAqIEB7DQogICovDQoNCi8qIENSIHJlZ2lzdGVyIE1hc2sgKi8NCiNkZWZpbmUgQ1JfQ0xFQVJfTUFTSyAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwRkZFKQ0KDQovKiBEQUMgRHVhbCBDaGFubmVscyBTV1RSSUcgbWFza3MgKi8NCiNkZWZpbmUgRFVBTF9TV1RSSUdfU0VUICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDAzKQ0KI2RlZmluZSBEVUFMX1NXVFJJR19SRVNFVCAgICAgICAgICAoKHVpbnQzMl90KTB4RkZGRkZGRkMpDQoNCi8qIERIUiByZWdpc3RlcnMgb2Zmc2V0cyAqLw0KI2RlZmluZSBESFIxMlIxX09GRlNFVCAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMDgpDQojZGVmaW5lIERIUjEyUjJfT0ZGU0VUICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDAxNCkNCiNkZWZpbmUgREhSMTJSRF9PRkZTRVQgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDIwKQ0KDQovKiBET1IgcmVnaXN0ZXIgb2Zmc2V0ICovDQojZGVmaW5lIERPUl9PRkZTRVQgICAgICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDAyQykNCi8qKg0KICAqIEB9DQogICovDQoNCi8qKiBAZGVmZ3JvdXAgREFDX1ByaXZhdGVfTWFjcm9zDQogICogQHsNCiAgKi8NCg0KLyoqDQogICogQH0NCiAgKi8NCg0KLyoqIEBkZWZncm91cCBEQUNfUHJpdmF0ZV9WYXJpYWJsZXMNCiAgKiBAew0KICAqLw0KDQovKioNCiAgKiBAfQ0KICAqLw0KDQovKiogQGRlZmdyb3VwIERBQ19Qcml2YXRlX0Z1bmN0aW9uUHJvdG90eXBlcw0KICAqIEB7DQogICovDQoNCi8qKg0KICAqIEB9DQogICovDQoNCi8qKiBAZGVmZ3JvdXAgREFDX1ByaXZhdGVfRnVuY3Rpb25zDQogICogQHsNCiAgKi8NCg0KLyoqDQogICogQGJyaWVmICBEZWluaXRpYWxpemVzIHRoZSBEQUMgcGVyaXBoZXJhbCByZWdpc3RlcnMgdG8gdGhlaXIgZGVmYXVsdCByZXNldCB2YWx1ZXMuDQogICogQHBhcmFtICBOb25lDQogICogQHJldHZhbCBOb25lDQogICovDQp2b2lkIERBQ19EZUluaXQodm9pZCkNCnsNCiAgLyogRW5hYmxlIERBQyByZXNldCBzdGF0ZSAqLw0KICBSQ0NfQVBCMVBlcmlwaFJlc2V0Q21kKFJDQ19BUEIxUGVyaXBoX0RBQywgRU5BQkxFKTsNCiAgLyogUmVsZWFzZSBEQUMgZnJvbSByZXNldCBzdGF0ZSAqLw0KICBSQ0NfQVBCMVBlcmlwaFJlc2V0Q21kKFJDQ19BUEIxUGVyaXBoX0RBQywgRElTQUJMRSk7DQp9DQoNCi8qKg0KICAqIEBicmllZiAgSW5pdGlhbGl6ZXMgdGhlIERBQyBwZXJpcGhlcmFsIGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWVkIA0KICAqICAgcGFyYW1ldGVycyBpbiB0aGUgREFDX0luaXRTdHJ1Y3QuDQogICogQHBhcmFtICBEQUNfQ2hhbm5lbDogdGhlIHNlbGVjdGVkIERBQyBjaGFubmVsLiANCiAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQogICogICAgIEBhcmcgREFDX0NoYW5uZWxfMTogREFDIENoYW5uZWwxIHNlbGVjdGVkDQogICogICAgIEBhcmcgREFDX0NoYW5uZWxfMjogREFDIENoYW5uZWwyIHNlbGVjdGVkDQogICogQHBhcmFtICBEQUNfSW5pdFN0cnVjdDogcG9pbnRlciB0byBhIERBQ19Jbml0VHlwZURlZiBzdHJ1Y3R1cmUgdGhhdA0KICAqICAgY29udGFpbnMgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgREFDIGNoYW5uZWwuDQogICogQHJldHZhbCBOb25lDQogICovDQp2b2lkIERBQ19Jbml0KHVpbnQzMl90IERBQ19DaGFubmVsLCBEQUNfSW5pdFR5cGVEZWYqIERBQ19Jbml0U3RydWN0KQ0Kew0KICB1aW50MzJfdCB0bXByZWcxID0gMCwgdG1wcmVnMiA9IDA7DQogIC8qIENoZWNrIHRoZSBEQUMgcGFyYW1ldGVycyAqLw0KICBhc3NlcnRfcGFyYW0oSVNfREFDX1RSSUdHRVIoREFDX0luaXRTdHJ1Y3QtPkRBQ19UcmlnZ2VyKSk7DQogIGFzc2VydF9wYXJhbShJU19EQUNfR0VORVJBVEVfV0FWRShEQUNfSW5pdFN0cnVjdC0+REFDX1dhdmVHZW5lcmF0aW9uKSk7DQogIGFzc2VydF9wYXJhbShJU19EQUNfTEZTUl9VTk1BU0tfVFJJQU5HTEVfQU1QTElUVURFKERBQ19Jbml0U3RydWN0LT5EQUNfTEZTUlVubWFza19UcmlhbmdsZUFtcGxpdHVkZSkpOw0KICBhc3NlcnRfcGFyYW0oSVNfREFDX09VVFBVVF9CVUZGRVJfU1RBVEUoREFDX0luaXRTdHJ1Y3QtPkRBQ19PdXRwdXRCdWZmZXIpKTsNCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBEQUMgQ1IgQ29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQogIC8qIEdldCB0aGUgREFDIENSIHZhbHVlICovDQogIHRtcHJlZzEgPSBEQUMtPkNSOw0KICAvKiBDbGVhciBCT0ZGeCwgVEVOeCwgVFNFTHgsIFdBVkV4IGFuZCBNQU1QeCBiaXRzICovDQogIHRtcHJlZzEgJj0gfihDUl9DTEVBUl9NQVNLIDw8IERBQ19DaGFubmVsKTsNCiAgLyogQ29uZmlndXJlIGZvciB0aGUgc2VsZWN0ZWQgREFDIGNoYW5uZWw6IGJ1ZmZlciBvdXRwdXQsIHRyaWdnZXIsIHdhdmUgZ2VucmF0aW9uLA0KICAgICBtYXNrL2FtcGxpdHVkZSBmb3Igd2F2ZSBnZW5yYXRpb24gKi8NCiAgLyogU2V0IFRTRUx4IGFuZCBURU54IGJpdHMgYWNjb3JkaW5nIHRvIERBQ19UcmlnZ2VyIHZhbHVlICovDQogIC8qIFNldCBXQVZFeCBiaXRzIGFjY29yZGluZyB0byBEQUNfV2F2ZUdlbmVyYXRpb24gdmFsdWUgKi8NCiAgLyogU2V0IE1BTVB4IGJpdHMgYWNjb3JkaW5nIHRvIERBQ19MRlNSVW5tYXNrX1RyaWFuZ2xlQW1wbGl0dWRlIHZhbHVlICovIA0KICAvKiBTZXQgQk9GRnggYml0IGFjY29yZGluZyB0byBEQUNfT3V0cHV0QnVmZmVyIHZhbHVlICovICAgDQogIHRtcHJlZzIgPSAoREFDX0luaXRTdHJ1Y3QtPkRBQ19UcmlnZ2VyIHwgREFDX0luaXRTdHJ1Y3QtPkRBQ19XYXZlR2VuZXJhdGlvbiB8DQogICAgICAgICAgICAgREFDX0luaXRTdHJ1Y3QtPkRBQ19MRlNSVW5tYXNrX1RyaWFuZ2xlQW1wbGl0dWRlIHwgREFDX0luaXRTdHJ1Y3QtPkRBQ19PdXRwdXRCdWZmZXIpOw0KICAvKiBDYWxjdWxhdGUgQ1IgcmVnaXN0ZXIgdmFsdWUgZGVwZW5kaW5nIG9uIERBQ19DaGFubmVsICovDQogIHRtcHJlZzEgfD0gdG1wcmVnMiA8PCBEQUNfQ2hhbm5lbDsNCiAgLyogV3JpdGUgdG8gREFDIENSICovDQogIERBQy0+Q1IgPSB0bXByZWcxOw0KfQ0KDQovKioNCiAgKiBAYnJpZWYgIEZpbGxzIGVhY2ggREFDX0luaXRTdHJ1Y3QgbWVtYmVyIHdpdGggaXRzIGRlZmF1bHQgdmFsdWUuDQogICogQHBhcmFtICBEQUNfSW5pdFN0cnVjdCA6IHBvaW50ZXIgdG8gYSBEQUNfSW5pdFR5cGVEZWYgc3RydWN0dXJlIHdoaWNoIHdpbGwNCiAgKiAgIGJlIGluaXRpYWxpemVkLg0KICAqIEByZXR2YWwgTm9uZQ0KICAqLw0Kdm9pZCBEQUNfU3RydWN0SW5pdChEQUNfSW5pdFR5cGVEZWYqIERBQ19Jbml0U3RydWN0KQ0Kew0KLyotLS0tLS0tLS0tLS0tLS0gUmVzZXQgREFDIGluaXQgc3RydWN0dXJlIHBhcmFtZXRlcnMgdmFsdWVzIC0tLS0tLS0tLS0tLS0tLS0tKi8NCiAgLyogSW5pdGlhbGl6ZSB0aGUgREFDX1RyaWdnZXIgbWVtYmVyICovDQogIERBQ19Jbml0U3RydWN0LT5EQUNfVHJpZ2dlciA9IERBQ19UcmlnZ2VyX05vbmU7DQogIC8qIEluaXRpYWxpemUgdGhlIERBQ19XYXZlR2VuZXJhdGlvbiBtZW1iZXIgKi8NCiAgREFDX0luaXRTdHJ1Y3QtPkRBQ19XYXZlR2VuZXJhdGlvbiA9IERBQ19XYXZlR2VuZXJhdGlvbl9Ob25lOw0KICAvKiBJbml0aWFsaXplIHRoZSBEQUNfTEZTUlVubWFza19UcmlhbmdsZUFtcGxpdHVkZSBtZW1iZXIgKi8NCiAgREFDX0luaXRTdHJ1Y3QtPkRBQ19MRlNSVW5tYXNrX1RyaWFuZ2xlQW1wbGl0dWRlID0gREFDX0xGU1JVbm1hc2tfQml0MDsNCiAgLyogSW5pdGlhbGl6ZSB0aGUgREFDX091dHB1dEJ1ZmZlciBtZW1iZXIgKi8NCiAgREFDX0luaXRTdHJ1Y3QtPkRBQ19PdXRwdXRCdWZmZXIgPSBEQUNfT3V0cHV0QnVmZmVyX0VuYWJsZTsNCn0NCg0KLyoqDQogICogQGJyaWVmICBFbmFibGVzIG9yIGRpc2FibGVzIHRoZSBzcGVjaWZpZWQgREFDIGNoYW5uZWwuDQogICogQHBhcmFtICBEQUNfQ2hhbm5lbDogdGhlIHNlbGVjdGVkIERBQyBjaGFubmVsLiANCiAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQogICogICAgIEBhcmcgREFDX0NoYW5uZWxfMTogREFDIENoYW5uZWwxIHNlbGVjdGVkDQogICogICAgIEBhcmcgREFDX0NoYW5uZWxfMjogREFDIENoYW5uZWwyIHNlbGVjdGVkDQogICogQHBhcmFtICBOZXdTdGF0ZTogbmV3IHN0YXRlIG9mIHRoZSBEQUMgY2hhbm5lbC4gDQogICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmU6IEVOQUJMRSBvciBESVNBQkxFLg0KICAqIEByZXR2YWwgTm9uZQ0KICAqLw0Kdm9pZCBEQUNfQ21kKHVpbnQzMl90IERBQ19DaGFubmVsLCBGdW5jdGlvbmFsU3RhdGUgTmV3U3RhdGUpDQp7DQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydF9wYXJhbShJU19EQUNfQ0hBTk5FTChEQUNfQ2hhbm5lbCkpOw0KICBhc3NlcnRfcGFyYW0oSVNfRlVOQ1RJT05BTF9TVEFURShOZXdTdGF0ZSkpOw0KICBpZiAoTmV3U3RhdGUgIT0gRElTQUJMRSkNCiAgew0KICAgIC8qIEVuYWJsZSB0aGUgc2VsZWN0ZWQgREFDIGNoYW5uZWwgKi8NCiAgICBEQUMtPkNSIHw9IChEQUNfQ1JfRU4xIDw8IERBQ19DaGFubmVsKTsNCiAgfQ0KICBlbHNlDQogIHsNCiAgICAvKiBEaXNhYmxlIHRoZSBzZWxlY3RlZCBEQUMgY2hhbm5lbCAqLw0KICAgIERBQy0+Q1IgJj0gfihEQUNfQ1JfRU4xIDw8IERBQ19DaGFubmVsKTsNCiAgfQ0KfQ0KI2lmIGRlZmluZWQgKFNUTTMyRjEwWF9MRF9WTCkgfHwgZGVmaW5lZCAoU1RNMzJGMTBYX01EX1ZMKSB8fCBkZWZpbmVkIChTVE0zMkYxMFhfSERfVkwpDQovKioNCiAgKiBAYnJpZWYgIEVuYWJsZXMgb3IgZGlzYWJsZXMgdGhlIHNwZWNpZmllZCBEQUMgaW50ZXJydXB0cy4NCiAgKiBAcGFyYW0gIERBQ19DaGFubmVsOiB0aGUgc2VsZWN0ZWQgREFDIGNoYW5uZWwuIA0KICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCiAgKiAgICAgQGFyZyBEQUNfQ2hhbm5lbF8xOiBEQUMgQ2hhbm5lbDEgc2VsZWN0ZWQNCiAgKiAgICAgQGFyZyBEQUNfQ2hhbm5lbF8yOiBEQUMgQ2hhbm5lbDIgc2VsZWN0ZWQNCiAgKiBAcGFyYW0gIERBQ19JVDogc3BlY2lmaWVzIHRoZSBEQUMgaW50ZXJydXB0IHNvdXJjZXMgdG8gYmUgZW5hYmxlZCBvciBkaXNhYmxlZC4gDQogICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQogICogICAgIEBhcmcgREFDX0lUX0RNQVVEUjogRE1BIHVuZGVycnVuIGludGVycnVwdCBtYXNrICAgICAgICAgICAgICAgICAgICAgIA0KICAqIEBwYXJhbSAgTmV3U3RhdGU6IG5ldyBzdGF0ZSBvZiB0aGUgc3BlY2lmaWVkIERBQyBpbnRlcnJ1cHRzLg0KICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlOiBFTkFCTEUgb3IgRElTQUJMRS4NCiAgKiBAcmV0dmFsIE5vbmUNCiAgKi8gDQp2b2lkIERBQ19JVENvbmZpZyh1aW50MzJfdCBEQUNfQ2hhbm5lbCwgdWludDMyX3QgREFDX0lULCBGdW5jdGlvbmFsU3RhdGUgTmV3U3RhdGUpICANCnsNCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0X3BhcmFtKElTX0RBQ19DSEFOTkVMKERBQ19DaGFubmVsKSk7DQogIGFzc2VydF9wYXJhbShJU19GVU5DVElPTkFMX1NUQVRFKE5ld1N0YXRlKSk7DQogIGFzc2VydF9wYXJhbShJU19EQUNfSVQoREFDX0lUKSk7IA0KDQogIGlmIChOZXdTdGF0ZSAhPSBESVNBQkxFKQ0KICB7DQogICAgLyogRW5hYmxlIHRoZSBzZWxlY3RlZCBEQUMgaW50ZXJydXB0cyAqLw0KICAgIERBQy0+Q1IgfD0gIChEQUNfSVQgPDwgREFDX0NoYW5uZWwpOw0KICB9DQogIGVsc2UNCiAgew0KICAgIC8qIERpc2FibGUgdGhlIHNlbGVjdGVkIERBQyBpbnRlcnJ1cHRzICovDQogICAgREFDLT5DUiAmPSAofih1aW50MzJfdCkoREFDX0lUIDw8IERBQ19DaGFubmVsKSk7DQogIH0NCn0NCiNlbmRpZg0KDQovKioNCiAgKiBAYnJpZWYgIEVuYWJsZXMgb3IgZGlzYWJsZXMgdGhlIHNwZWNpZmllZCBEQUMgY2hhbm5lbCBETUEgcmVxdWVzdC4NCiAgKiBAcGFyYW0gIERBQ19DaGFubmVsOiB0aGUgc2VsZWN0ZWQgREFDIGNoYW5uZWwuIA0KICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCiAgKiAgICAgQGFyZyBEQUNfQ2hhbm5lbF8xOiBEQUMgQ2hhbm5lbDEgc2VsZWN0ZWQNCiAgKiAgICAgQGFyZyBEQUNfQ2hhbm5lbF8yOiBEQUMgQ2hhbm5lbDIgc2VsZWN0ZWQNCiAgKiBAcGFyYW0gIE5ld1N0YXRlOiBuZXcgc3RhdGUgb2YgdGhlIHNlbGVjdGVkIERBQyBjaGFubmVsIERNQSByZXF1ZXN0Lg0KICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlOiBFTkFCTEUgb3IgRElTQUJMRS4NCiAgKiBAcmV0dmFsIE5vbmUNCiAgKi8NCnZvaWQgREFDX0RNQUNtZCh1aW50MzJfdCBEQUNfQ2hhbm5lbCwgRnVuY3Rpb25hbFN0YXRlIE5ld1N0YXRlKQ0Kew0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnRfcGFyYW0oSVNfREFDX0NIQU5ORUwoREFDX0NoYW5uZWwpKTsNCiAgYXNzZXJ0X3BhcmFtKElTX0ZVTkNUSU9OQUxfU1RBVEUoTmV3U3RhdGUpKTsNCiAgaWYgKE5ld1N0YXRlICE9IERJU0FCTEUpDQogIHsNCiAgICAvKiBFbmFibGUgdGhlIHNlbGVjdGVkIERBQyBjaGFubmVsIERNQSByZXF1ZXN0ICovDQogICAgREFDLT5DUiB8PSAoREFDX0NSX0RNQUVOMSA8PCBEQUNfQ2hhbm5lbCk7DQogIH0NCiAgZWxzZQ0KICB7DQogICAgLyogRGlzYWJsZSB0aGUgc2VsZWN0ZWQgREFDIGNoYW5uZWwgRE1BIHJlcXVlc3QgKi8NCiAgICBEQUMtPkNSICY9IH4oREFDX0NSX0RNQUVOMSA8PCBEQUNfQ2hhbm5lbCk7DQogIH0NCn0NCg0KLyoqDQogICogQGJyaWVmICBFbmFibGVzIG9yIGRpc2FibGVzIHRoZSBzZWxlY3RlZCBEQUMgY2hhbm5lbCBzb2Z0d2FyZSB0cmlnZ2VyLg0KICAqIEBwYXJhbSAgREFDX0NoYW5uZWw6IHRoZSBzZWxlY3RlZCBEQUMgY2hhbm5lbC4gDQogICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KICAqICAgICBAYXJnIERBQ19DaGFubmVsXzE6IERBQyBDaGFubmVsMSBzZWxlY3RlZA0KICAqICAgICBAYXJnIERBQ19DaGFubmVsXzI6IERBQyBDaGFubmVsMiBzZWxlY3RlZA0KICAqIEBwYXJhbSAgTmV3U3RhdGU6IG5ldyBzdGF0ZSBvZiB0aGUgc2VsZWN0ZWQgREFDIGNoYW5uZWwgc29mdHdhcmUgdHJpZ2dlci4NCiAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZTogRU5BQkxFIG9yIERJU0FCTEUuDQogICogQHJldHZhbCBOb25lDQogICovDQp2b2lkIERBQ19Tb2Z0d2FyZVRyaWdnZXJDbWQodWludDMyX3QgREFDX0NoYW5uZWwsIEZ1bmN0aW9uYWxTdGF0ZSBOZXdTdGF0ZSkNCnsNCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0X3BhcmFtKElTX0RBQ19DSEFOTkVMKERBQ19DaGFubmVsKSk7DQogIGFzc2VydF9wYXJhbShJU19GVU5DVElPTkFMX1NUQVRFKE5ld1N0YXRlKSk7DQogIGlmIChOZXdTdGF0ZSAhPSBESVNBQkxFKQ0KICB7DQogICAgLyogRW5hYmxlIHNvZnR3YXJlIHRyaWdnZXIgZm9yIHRoZSBzZWxlY3RlZCBEQUMgY2hhbm5lbCAqLw0KICAgIERBQy0+U1dUUklHUiB8PSAodWludDMyX3QpREFDX1NXVFJJR1JfU1dUUklHMSA8PCAoREFDX0NoYW5uZWwgPj4gNCk7DQogIH0NCiAgZWxzZQ0KICB7DQogICAgLyogRGlzYWJsZSBzb2Z0d2FyZSB0cmlnZ2VyIGZvciB0aGUgc2VsZWN0ZWQgREFDIGNoYW5uZWwgKi8NCiAgICBEQUMtPlNXVFJJR1IgJj0gfigodWludDMyX3QpREFDX1NXVFJJR1JfU1dUUklHMSA8PCAoREFDX0NoYW5uZWwgPj4gNCkpOw0KICB9DQp9DQoNCi8qKg0KICAqIEBicmllZiAgRW5hYmxlcyBvciBkaXNhYmxlcyBzaW11bHRhbmVvdXNseSB0aGUgdHdvIERBQyBjaGFubmVscyBzb2Z0d2FyZQ0KICAqICAgdHJpZ2dlcnMuDQogICogQHBhcmFtICBOZXdTdGF0ZTogbmV3IHN0YXRlIG9mIHRoZSBEQUMgY2hhbm5lbHMgc29mdHdhcmUgdHJpZ2dlcnMuDQogICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmU6IEVOQUJMRSBvciBESVNBQkxFLg0KICAqIEByZXR2YWwgTm9uZQ0KICAqLw0Kdm9pZCBEQUNfRHVhbFNvZnR3YXJlVHJpZ2dlckNtZChGdW5jdGlvbmFsU3RhdGUgTmV3U3RhdGUpDQp7DQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydF9wYXJhbShJU19GVU5DVElPTkFMX1NUQVRFKE5ld1N0YXRlKSk7DQogIGlmIChOZXdTdGF0ZSAhPSBESVNBQkxFKQ0KICB7DQogICAgLyogRW5hYmxlIHNvZnR3YXJlIHRyaWdnZXIgZm9yIGJvdGggREFDIGNoYW5uZWxzICovDQogICAgREFDLT5TV1RSSUdSIHw9IERVQUxfU1dUUklHX1NFVCA7DQogIH0NCiAgZWxzZQ0KICB7DQogICAgLyogRGlzYWJsZSBzb2Z0d2FyZSB0cmlnZ2VyIGZvciBib3RoIERBQyBjaGFubmVscyAqLw0KICAgIERBQy0+U1dUUklHUiAmPSBEVUFMX1NXVFJJR19SRVNFVDsNCiAgfQ0KfQ0KDQovKioNCiAgKiBAYnJpZWYgIEVuYWJsZXMgb3IgZGlzYWJsZXMgdGhlIHNlbGVjdGVkIERBQyBjaGFubmVsIHdhdmUgZ2VuZXJhdGlvbi4NCiAgKiBAcGFyYW0gIERBQ19DaGFubmVsOiB0aGUgc2VsZWN0ZWQgREFDIGNoYW5uZWwuIA0KICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCiAgKiAgICAgQGFyZyBEQUNfQ2hhbm5lbF8xOiBEQUMgQ2hhbm5lbDEgc2VsZWN0ZWQNCiAgKiAgICAgQGFyZyBEQUNfQ2hhbm5lbF8yOiBEQUMgQ2hhbm5lbDIgc2VsZWN0ZWQNCiAgKiBAcGFyYW0gIERBQ19XYXZlOiBTcGVjaWZpZXMgdGhlIHdhdmUgdHlwZSB0byBlbmFibGUgb3IgZGlzYWJsZS4NCiAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQogICogICAgIEBhcmcgREFDX1dhdmVfTm9pc2U6IG5vaXNlIHdhdmUgZ2VuZXJhdGlvbg0KICAqICAgICBAYXJnIERBQ19XYXZlX1RyaWFuZ2xlOiB0cmlhbmdsZSB3YXZlIGdlbmVyYXRpb24NCiAgKiBAcGFyYW0gIE5ld1N0YXRlOiBuZXcgc3RhdGUgb2YgdGhlIHNlbGVjdGVkIERBQyBjaGFubmVsIHdhdmUgZ2VuZXJhdGlvbi4NCiAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZTogRU5BQkxFIG9yIERJU0FCTEUuDQogICogQHJldHZhbCBOb25lDQogICovDQp2b2lkIERBQ19XYXZlR2VuZXJhdGlvbkNtZCh1aW50MzJfdCBEQUNfQ2hhbm5lbCwgdWludDMyX3QgREFDX1dhdmUsIEZ1bmN0aW9uYWxTdGF0ZSBOZXdTdGF0ZSkNCnsNCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0X3BhcmFtKElTX0RBQ19DSEFOTkVMKERBQ19DaGFubmVsKSk7DQogIGFzc2VydF9wYXJhbShJU19EQUNfV0FWRShEQUNfV2F2ZSkpOyANCiAgYXNzZXJ0X3BhcmFtKElTX0ZVTkNUSU9OQUxfU1RBVEUoTmV3U3RhdGUpKTsNCiAgaWYgKE5ld1N0YXRlICE9IERJU0FCTEUpDQogIHsNCiAgICAvKiBFbmFibGUgdGhlIHNlbGVjdGVkIHdhdmUgZ2VuZXJhdGlvbiBmb3IgdGhlIHNlbGVjdGVkIERBQyBjaGFubmVsICovDQogICAgREFDLT5DUiB8PSBEQUNfV2F2ZSA8PCBEQUNfQ2hhbm5lbDsNCiAgfQ0KICBlbHNlDQogIHsNCiAgICAvKiBEaXNhYmxlIHRoZSBzZWxlY3RlZCB3YXZlIGdlbmVyYXRpb24gZm9yIHRoZSBzZWxlY3RlZCBEQUMgY2hhbm5lbCAqLw0KICAgIERBQy0+Q1IgJj0gfihEQUNfV2F2ZSA8PCBEQUNfQ2hhbm5lbCk7DQogIH0NCn0NCg0KLyoqDQogICogQGJyaWVmICBTZXQgdGhlIHNwZWNpZmllZCBkYXRhIGhvbGRpbmcgcmVnaXN0ZXIgdmFsdWUgZm9yIERBQyBjaGFubmVsMS4NCiAgKiBAcGFyYW0gIERBQ19BbGlnbjogU3BlY2lmaWVzIHRoZSBkYXRhIGFsaWduZW1lbnQgZm9yIERBQyBjaGFubmVsMS4NCiAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQogICogICAgIEBhcmcgREFDX0FsaWduXzhiX1I6IDhiaXQgcmlnaHQgZGF0YSBhbGlnbmVtZW50IHNlbGVjdGVkDQogICogICAgIEBhcmcgREFDX0FsaWduXzEyYl9MOiAxMmJpdCBsZWZ0IGRhdGEgYWxpZ25lbWVudCBzZWxlY3RlZA0KICAqICAgICBAYXJnIERBQ19BbGlnbl8xMmJfUjogMTJiaXQgcmlnaHQgZGF0YSBhbGlnbmVtZW50IHNlbGVjdGVkDQogICogQHBhcmFtICBEYXRhIDogRGF0YSB0byBiZSBsb2FkZWQgaW4gdGhlIHNlbGVjdGVkIGRhdGEgaG9sZGluZyByZWdpc3Rlci4NCiAgKiBAcmV0dmFsIE5vbmUNCiAgKi8NCnZvaWQgREFDX1NldENoYW5uZWwxRGF0YSh1aW50MzJfdCBEQUNfQWxpZ24sIHVpbnQxNl90IERhdGEpDQp7ICANCiAgX19JTyB1aW50MzJfdCB0bXAgPSAwOw0KICANCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0X3BhcmFtKElTX0RBQ19BTElHTihEQUNfQWxpZ24pKTsNCiAgYXNzZXJ0X3BhcmFtKElTX0RBQ19EQVRBKERhdGEpKTsNCiAgDQogIHRtcCA9ICh1aW50MzJfdClEQUNfQkFTRTsgDQogIHRtcCArPSBESFIxMlIxX09GRlNFVCArIERBQ19BbGlnbjsNCg0KICAvKiBTZXQgdGhlIERBQyBjaGFubmVsMSBzZWxlY3RlZCBkYXRhIGhvbGRpbmcgcmVnaXN0ZXIgKi8NCiAgKihfX0lPIHVpbnQzMl90ICopIHRtcCA9IERhdGE7DQp9DQoNCi8qKg0KICAqIEBicmllZiAgU2V0IHRoZSBzcGVjaWZpZWQgZGF0YSBob2xkaW5nIHJlZ2lzdGVyIHZhbHVlIGZvciBEQUMgY2hhbm5lbDIuDQogICogQHBhcmFtICBEQUNfQWxpZ246IFNwZWNpZmllcyB0aGUgZGF0YSBhbGlnbmVtZW50IGZvciBEQUMgY2hhbm5lbDIuDQogICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KICAqICAgICBAYXJnIERBQ19BbGlnbl84Yl9SOiA4Yml0IHJpZ2h0IGRhdGEgYWxpZ25lbWVudCBzZWxlY3RlZA0KICAqICAgICBAYXJnIERBQ19BbGlnbl8xMmJfTDogMTJiaXQgbGVmdCBkYXRhIGFsaWduZW1lbnQgc2VsZWN0ZWQNCiAgKiAgICAgQGFyZyBEQUNfQWxpZ25fMTJiX1I6IDEyYml0IHJpZ2h0IGRhdGEgYWxpZ25lbWVudCBzZWxlY3RlZA0KICAqIEBwYXJhbSAgRGF0YSA6IERhdGEgdG8gYmUgbG9hZGVkIGluIHRoZSBzZWxlY3RlZCBkYXRhIGhvbGRpbmcgcmVnaXN0ZXIuDQogICogQHJldHZhbCBOb25lDQogICovDQp2b2lkIERBQ19TZXRDaGFubmVsMkRhdGEodWludDMyX3QgREFDX0FsaWduLCB1aW50MTZfdCBEYXRhKQ0Kew0KICBfX0lPIHVpbnQzMl90IHRtcCA9IDA7DQoNCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0X3BhcmFtKElTX0RBQ19BTElHTihEQUNfQWxpZ24pKTsNCiAgYXNzZXJ0X3BhcmFtKElTX0RBQ19EQVRBKERhdGEpKTsNCiAgDQogIHRtcCA9ICh1aW50MzJfdClEQUNfQkFTRTsNCiAgdG1wICs9IERIUjEyUjJfT0ZGU0VUICsgREFDX0FsaWduOw0KDQogIC8qIFNldCB0aGUgREFDIGNoYW5uZWwyIHNlbGVjdGVkIGRhdGEgaG9sZGluZyByZWdpc3RlciAqLw0KICAqKF9fSU8gdWludDMyX3QgKil0bXAgPSBEYXRhOw0KfQ0KDQovKioNCiAgKiBAYnJpZWYgIFNldCB0aGUgc3BlY2lmaWVkIGRhdGEgaG9sZGluZyByZWdpc3RlciB2YWx1ZSBmb3IgZHVhbCBjaGFubmVsDQogICogICBEQUMuDQogICogQHBhcmFtICBEQUNfQWxpZ246IFNwZWNpZmllcyB0aGUgZGF0YSBhbGlnbmVtZW50IGZvciBkdWFsIGNoYW5uZWwgREFDLg0KICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCiAgKiAgICAgQGFyZyBEQUNfQWxpZ25fOGJfUjogOGJpdCByaWdodCBkYXRhIGFsaWduZW1lbnQgc2VsZWN0ZWQNCiAgKiAgICAgQGFyZyBEQUNfQWxpZ25fMTJiX0w6IDEyYml0IGxlZnQgZGF0YSBhbGlnbmVtZW50IHNlbGVjdGVkDQogICogICAgIEBhcmcgREFDX0FsaWduXzEyYl9SOiAxMmJpdCByaWdodCBkYXRhIGFsaWduZW1lbnQgc2VsZWN0ZWQNCiAgKiBAcGFyYW0gIERhdGEyOiBEYXRhIGZvciBEQUMgQ2hhbm5lbDIgdG8gYmUgbG9hZGVkIGluIHRoZSBzZWxlY3RlZCBkYXRhIA0KICAqICAgaG9sZGluZyByZWdpc3Rlci4NCiAgKiBAcGFyYW0gIERhdGExOiBEYXRhIGZvciBEQUMgQ2hhbm5lbDEgdG8gYmUgbG9hZGVkIGluIHRoZSBzZWxlY3RlZCBkYXRhIA0KICAqICAgaG9sZGluZyByZWdpc3Rlci4NCiAgKiBAcmV0dmFsIE5vbmUNCiAgKi8NCnZvaWQgREFDX1NldER1YWxDaGFubmVsRGF0YSh1aW50MzJfdCBEQUNfQWxpZ24sIHVpbnQxNl90IERhdGEyLCB1aW50MTZfdCBEYXRhMSkNCnsNCiAgdWludDMyX3QgZGF0YSA9IDAsIHRtcCA9IDA7DQogIA0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnRfcGFyYW0oSVNfREFDX0FMSUdOKERBQ19BbGlnbikpOw0KICBhc3NlcnRfcGFyYW0oSVNfREFDX0RBVEEoRGF0YTEpKTsNCiAgYXNzZXJ0X3BhcmFtKElTX0RBQ19EQVRBKERhdGEyKSk7DQogIA0KICAvKiBDYWxjdWxhdGUgYW5kIHNldCBkdWFsIERBQyBkYXRhIGhvbGRpbmcgcmVnaXN0ZXIgdmFsdWUgKi8NCiAgaWYgKERBQ19BbGlnbiA9PSBEQUNfQWxpZ25fOGJfUikNCiAgew0KICAgIGRhdGEgPSAoKHVpbnQzMl90KURhdGEyIDw8IDgpIHwgRGF0YTE7IA0KICB9DQogIGVsc2UNCiAgew0KICAgIGRhdGEgPSAoKHVpbnQzMl90KURhdGEyIDw8IDE2KSB8IERhdGExOw0KICB9DQogIA0KICB0bXAgPSAodWludDMyX3QpREFDX0JBU0U7DQogIHRtcCArPSBESFIxMlJEX09GRlNFVCArIERBQ19BbGlnbjsNCg0KICAvKiBTZXQgdGhlIGR1YWwgREFDIHNlbGVjdGVkIGRhdGEgaG9sZGluZyByZWdpc3RlciAqLw0KICAqKF9fSU8gdWludDMyX3QgKil0bXAgPSBkYXRhOw0KfQ0KDQovKioNCiAgKiBAYnJpZWYgIFJldHVybnMgdGhlIGxhc3QgZGF0YSBvdXRwdXQgdmFsdWUgb2YgdGhlIHNlbGVjdGVkIERBQyBjYWhubmVsLg0KICAqIEBwYXJhbSAgREFDX0NoYW5uZWw6IHRoZSBzZWxlY3RlZCBEQUMgY2hhbm5lbC4gDQogICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KICAqICAgICBAYXJnIERBQ19DaGFubmVsXzE6IERBQyBDaGFubmVsMSBzZWxlY3RlZA0KICAqICAgICBAYXJnIERBQ19DaGFubmVsXzI6IERBQyBDaGFubmVsMiBzZWxlY3RlZA0KICAqIEByZXR2YWwgVGhlIHNlbGVjdGVkIERBQyBjaGFubmVsIGRhdGEgb3V0cHV0IHZhbHVlLg0KICAqLw0KdWludDE2X3QgREFDX0dldERhdGFPdXRwdXRWYWx1ZSh1aW50MzJfdCBEQUNfQ2hhbm5lbCkNCnsNCiAgX19JTyB1aW50MzJfdCB0bXAgPSAwOw0KICANCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0X3BhcmFtKElTX0RBQ19DSEFOTkVMKERBQ19DaGFubmVsKSk7DQogIA0KICB0bXAgPSAodWludDMyX3QpIERBQ19CQVNFIDsNCiAgdG1wICs9IERPUl9PRkZTRVQgKyAoKHVpbnQzMl90KURBQ19DaGFubmVsID4+IDIpOw0KICANCiAgLyogUmV0dXJucyB0aGUgREFDIGNoYW5uZWwgZGF0YSBvdXRwdXQgcmVnaXN0ZXIgdmFsdWUgKi8NCiAgcmV0dXJuICh1aW50MTZfdCkgKCooX19JTyB1aW50MzJfdCopIHRtcCk7DQp9DQoNCiNpZiBkZWZpbmVkIChTVE0zMkYxMFhfTERfVkwpIHx8IGRlZmluZWQgKFNUTTMyRjEwWF9NRF9WTCkgfHwgZGVmaW5lZCAoU1RNMzJGMTBYX0hEX1ZMKQ0KLyoqDQogICogQGJyaWVmICBDaGVja3Mgd2hldGhlciB0aGUgc3BlY2lmaWVkIERBQyBmbGFnIGlzIHNldCBvciBub3QuDQogICogQHBhcmFtICBEQUNfQ2hhbm5lbDogdGhlZSBzZWxlY3RlZCBEQUMgY2hhbm5lbC4gDQogICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KICAqICAgICBAYXJnIERBQ19DaGFubmVsXzE6IERBQyBDaGFubmVsMSBzZWxlY3RlZA0KICAqICAgICBAYXJnIERBQ19DaGFubmVsXzI6IERBQyBDaGFubmVsMiBzZWxlY3RlZA0KICAqIEBwYXJhbSAgREFDX0ZMQUc6IHNwZWNpZmllcyB0aGUgZmxhZyB0byBjaGVjay4gDQogICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25seSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlOg0KICAqICAgICBAYXJnIERBQ19GTEFHX0RNQVVEUjogRE1BIHVuZGVycnVuIGZsYWcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogICogQHJldHZhbCBUaGUgbmV3IHN0YXRlIG9mIERBQ19GTEFHIChTRVQgb3IgUkVTRVQpLg0KICAqLw0KRmxhZ1N0YXR1cyBEQUNfR2V0RmxhZ1N0YXR1cyh1aW50MzJfdCBEQUNfQ2hhbm5lbCwgdWludDMyX3QgREFDX0ZMQUcpDQp7DQogIEZsYWdTdGF0dXMgYml0c3RhdHVzID0gUkVTRVQ7DQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydF9wYXJhbShJU19EQUNfQ0hBTk5FTChEQUNfQ2hhbm5lbCkpOw0KICBhc3NlcnRfcGFyYW0oSVNfREFDX0ZMQUcoREFDX0ZMQUcpKTsNCg0KICAvKiBDaGVjayB0aGUgc3RhdHVzIG9mIHRoZSBzcGVjaWZpZWQgREFDIGZsYWcgKi8NCiAgaWYgKChEQUMtPlNSICYgKERBQ19GTEFHIDw8IERBQ19DaGFubmVsKSkgIT0gKHVpbnQ4X3QpUkVTRVQpDQogIHsNCiAgICAvKiBEQUNfRkxBRyBpcyBzZXQgKi8NCiAgICBiaXRzdGF0dXMgPSBTRVQ7DQogIH0NCiAgZWxzZQ0KICB7DQogICAgLyogREFDX0ZMQUcgaXMgcmVzZXQgKi8NCiAgICBiaXRzdGF0dXMgPSBSRVNFVDsNCiAgfQ0KICAvKiBSZXR1cm4gdGhlIERBQ19GTEFHIHN0YXR1cyAqLw0KICByZXR1cm4gIGJpdHN0YXR1czsNCn0NCg0KLyoqDQogICogQGJyaWVmICBDbGVhcnMgdGhlIERBQyBjaGFubmVseCdzIHBlbmRpbmcgZmxhZ3MuDQogICogQHBhcmFtICBEQUNfQ2hhbm5lbDogdGhlIHNlbGVjdGVkIERBQyBjaGFubmVsLiANCiAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQogICogICAgIEBhcmcgREFDX0NoYW5uZWxfMTogREFDIENoYW5uZWwxIHNlbGVjdGVkDQogICogICAgIEBhcmcgREFDX0NoYW5uZWxfMjogREFDIENoYW5uZWwyIHNlbGVjdGVkDQogICogQHBhcmFtICBEQUNfRkxBRzogc3BlY2lmaWVzIHRoZSBmbGFnIHRvIGNsZWFyLiANCiAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlOg0KICAqICAgICBAYXJnIERBQ19GTEFHX0RNQVVEUjogRE1BIHVuZGVycnVuIGZsYWcgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgKiBAcmV0dmFsIE5vbmUNCiAgKi8NCnZvaWQgREFDX0NsZWFyRmxhZyh1aW50MzJfdCBEQUNfQ2hhbm5lbCwgdWludDMyX3QgREFDX0ZMQUcpDQp7DQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydF9wYXJhbShJU19EQUNfQ0hBTk5FTChEQUNfQ2hhbm5lbCkpOw0KICBhc3NlcnRfcGFyYW0oSVNfREFDX0ZMQUcoREFDX0ZMQUcpKTsNCg0KICAvKiBDbGVhciB0aGUgc2VsZWN0ZWQgREFDIGZsYWdzICovDQogIERBQy0+U1IgPSAoREFDX0ZMQUcgPDwgREFDX0NoYW5uZWwpOw0KfQ0KDQovKioNCiAgKiBAYnJpZWYgIENoZWNrcyB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgREFDIGludGVycnVwdCBoYXMgb2NjdXJyZWQgb3Igbm90Lg0KICAqIEBwYXJhbSAgREFDX0NoYW5uZWw6IHRoZSBzZWxlY3RlZCBEQUMgY2hhbm5lbC4gDQogICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KICAqICAgICBAYXJnIERBQ19DaGFubmVsXzE6IERBQyBDaGFubmVsMSBzZWxlY3RlZA0KICAqICAgICBAYXJnIERBQ19DaGFubmVsXzI6IERBQyBDaGFubmVsMiBzZWxlY3RlZA0KICAqIEBwYXJhbSAgREFDX0lUOiBzcGVjaWZpZXMgdGhlIERBQyBpbnRlcnJ1cHQgc291cmNlIHRvIGNoZWNrLiANCiAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSB0aGUgZm9sbG93aW5nIHZhbHVlczoNCiAgKiAgICAgQGFyZyBEQUNfSVRfRE1BVURSOiBETUEgdW5kZXJydW4gaW50ZXJydXB0IG1hc2sgICAgICAgICAgICAgICAgICAgICAgIA0KICAqIEByZXR2YWwgVGhlIG5ldyBzdGF0ZSBvZiBEQUNfSVQgKFNFVCBvciBSRVNFVCkuDQogICovDQpJVFN0YXR1cyBEQUNfR2V0SVRTdGF0dXModWludDMyX3QgREFDX0NoYW5uZWwsIHVpbnQzMl90IERBQ19JVCkNCnsNCiAgSVRTdGF0dXMgYml0c3RhdHVzID0gUkVTRVQ7DQogIHVpbnQzMl90IGVuYWJsZXN0YXR1cyA9IDA7DQogIA0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnRfcGFyYW0oSVNfREFDX0NIQU5ORUwoREFDX0NoYW5uZWwpKTsNCiAgYXNzZXJ0X3BhcmFtKElTX0RBQ19JVChEQUNfSVQpKTsNCg0KICAvKiBHZXQgdGhlIERBQ19JVCBlbmFibGUgYml0IHN0YXR1cyAqLw0KICBlbmFibGVzdGF0dXMgPSAoREFDLT5DUiAmIChEQUNfSVQgPDwgREFDX0NoYW5uZWwpKSA7DQogIA0KICAvKiBDaGVjayB0aGUgc3RhdHVzIG9mIHRoZSBzcGVjaWZpZWQgREFDIGludGVycnVwdCAqLw0KICBpZiAoKChEQUMtPlNSICYgKERBQ19JVCA8PCBEQUNfQ2hhbm5lbCkpICE9ICh1aW50MzJfdClSRVNFVCkgJiYgZW5hYmxlc3RhdHVzKQ0KICB7DQogICAgLyogREFDX0lUIGlzIHNldCAqLw0KICAgIGJpdHN0YXR1cyA9IFNFVDsNCiAgfQ0KICBlbHNlDQogIHsNCiAgICAvKiBEQUNfSVQgaXMgcmVzZXQgKi8NCiAgICBiaXRzdGF0dXMgPSBSRVNFVDsNCiAgfQ0KICAvKiBSZXR1cm4gdGhlIERBQ19JVCBzdGF0dXMgKi8NCiAgcmV0dXJuICBiaXRzdGF0dXM7DQp9DQoNCi8qKg0KICAqIEBicmllZiAgQ2xlYXJzIHRoZSBEQUMgY2hhbm5lbHiScyBpbnRlcnJ1cHQgcGVuZGluZyBiaXRzLg0KICAqIEBwYXJhbSAgREFDX0NoYW5uZWw6IHRoZSBzZWxlY3RlZCBEQUMgY2hhbm5lbC4gDQogICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KICAqICAgICBAYXJnIERBQ19DaGFubmVsXzE6IERBQyBDaGFubmVsMSBzZWxlY3RlZA0KICAqICAgICBAYXJnIERBQ19DaGFubmVsXzI6IERBQyBDaGFubmVsMiBzZWxlY3RlZA0KICAqIEBwYXJhbSAgREFDX0lUOiBzcGVjaWZpZXMgdGhlIERBQyBpbnRlcnJ1cHQgcGVuZGluZyBiaXQgdG8gY2xlYXIuDQogICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQogICogICAgIEBhcmcgREFDX0lUX0RNQVVEUjogRE1BIHVuZGVycnVuIGludGVycnVwdCBtYXNrICAgICAgICAgICAgICAgICAgICAgICAgIA0KICAqIEByZXR2YWwgTm9uZQ0KICAqLw0Kdm9pZCBEQUNfQ2xlYXJJVFBlbmRpbmdCaXQodWludDMyX3QgREFDX0NoYW5uZWwsIHVpbnQzMl90IERBQ19JVCkNCnsNCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0X3BhcmFtKElTX0RBQ19DSEFOTkVMKERBQ19DaGFubmVsKSk7DQogIGFzc2VydF9wYXJhbShJU19EQUNfSVQoREFDX0lUKSk7IA0KDQogIC8qIENsZWFyIHRoZSBzZWxlY3RlZCBEQUMgaW50ZXJydXB0IHBlbmRpbmcgYml0cyAqLw0KICBEQUMtPlNSID0gKERBQ19JVCA8PCBEQUNfQ2hhbm5lbCk7DQp9DQojZW5kaWYNCg0KLyoqDQogICogQH0NCiAgKi8NCg0KLyoqDQogICogQH0NCiAgKi8NCg0KLyoqDQogICogQH0NCiAgKi8NCg0KLyoqKioqKioqKioqKioqKioqKiogKEMpIENPUFlSSUdIVCAyMDEwIFNUTWljcm9lbGVjdHJvbmljcyAqKioqKkVORCBPRiBGSUxFKioqKi8NCg==