LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqDQoqICAgICAgICAgICAgICAgICAgQ29weXJpZ2h0IChjKSAyMDEzIFpURSBDb3Jwb3JhdGlvbi4NCioNCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiDEoyC/6SDD+yA6IGNjDQoqIM7EILz+IMP7IDogY2NfcHJvYy5oDQoqIM/gudjOxLz+IDoNCiogyrXP1rmmxNwgOmNjw/zB7reiy826zb3hufu0psDtxKO/6brqoaLA4NDNtqjS5Q0KKiDX9yAgICDV3yA6IA0KKiCw5iAgICCxviA6IA0KKiDN6rPJyNXG2iA6IA0KKiDG5Mv8y7XD9yA6DQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqINDeuMS8x8K8IDoNCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiDQ3rjEseC6xSA6IDAwMDENCiog0N4guMQgyMsgOg0KKiDQ3rjEyNXG2iA6DQoqINDeuMTE2sjdIDoNCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KI2lmbmRlZiBfQ0NfUFJPQ19IDQojZGVmaW5lIF9DQ19QUk9DX0gNCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqICNpbmNsdWRlx/gNCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLy8jaW5jbHVkZSAiRHJ2c192b2ljZXByb2Nlc3MuaCINCiNpbmNsdWRlICJzdGRpby5oIg0KI2luY2x1ZGUgImF0X21zZy5oIg0KI2luY2x1ZGUgIm9zX3R5cGVfZGVmLmgiDQojaW5jbHVkZSAiYXRfb3RoZXJfYXBpLmgiDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogs6PBv7ao0uXH+A0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQojZGVmaW5lIFpBVF9UQUJfUkVQTEFDRSAgICAgICAgICAgICAgICAgICAgICgodW5zaWduZWQgY2hhciApKDB4RkMpKSAgICAvKiDWxrHtt/vM5ru7t/sgICAgICovDQojZGVmaW5lIFpBVF9OVUxMX0ZJTEwgICAgICAgICAgICAgICAgICAgICAgICgodW5zaWduZWQgY2hhciApKDB4RkQpKSAgICAvKiC/1bSu1bzOu7f7ICAgICAgICovDQojZGVmaW5lIFpBVF9TUEFDRV9SRVBMQUNFICAgICAgICAgICAgICAgICAgICgodW5zaWduZWQgY2hhciApKDB4RkUpKSAgICAvKiC/1bjxzOa7u7f7ICAgICAgICovDQoNCiNkZWZpbmUgWkNDX0FQUF9BVF9CVUZfTUFYX0xFTiAgICAgICA0MDANCiNkZWZpbmUgWkNDX0FQUF9BVF9CVUZfV0FJVF9USU1FICAgICAzMDANCiNkZWZpbmUgWkNDX01TR19EQVRBX01BWExFTiA2NDANCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIMr9vt294bm5tqjS5cf4DQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnR5cGVkZWYgVk9JRCAoKnBDY1NsYXZlRnNtRnVuYykoVUlOVDgpOw0KDQojZGVmaW5lICAgU0NfTEVOICAgICAyOSAgDQojZGVmaW5lICAgU0NfTUFYTEVOICAgICAoU0NfTEVOLTEpICAvLyDHsNequsXC67OktsjX7rTzzqogU0NfTUFYTEVOIC01DQp0eXBlZGVmIHN0cnVjdCANCnsNCiAgICBVSU5UOCAgIHNjTmFtZTsNCiAgICBVSU5UOCAgIHNjTWluTGVuOyAvL8bazfu1xLK5s+TStc7xstnX98Lr1+7QobOktsgNCiAgICBVSU5UOCAgIHNjTWF4TGVuOyAvL8bazfu1xLK5s+TStc7xstnX98Lr1+6087OktsgNCiAgICBjaGFyICAgc2NbU0NfTEVOXTsNCn1UX3pDY19TY1RhYjsNCnR5cGVkZWYgIGVudW0NCnsNCiAgICBDQ19BUFBfQVRfQ01EX05PTkUsIA0KICAgICAgICANCiAgICBDQ19BUFBfQVRfQ01EX1JFUV9ELA0KICAgIENDX0FQUF9BVF9DTURfUkVRX0EsDQogICAgQ0NfQVBQX0FUX0NNRF9SRVFfQ0hVUCwNCiAgICBDQ19BUFBfQVRfQ01EX1JFUV9aTEVEVk9MVEUsDQoNCiAgICBDQ19BUFBfQVRfQ01EX1JFUV9WVFMsDQogICAgQ0NfQVBQX0FUX0NNRF9SRVFfQ01VVCwNCiAgICBDQ19BUFBfQVRfQ01EX1JFUV9DTFZMLA0KICAgIENDX0FQUF9BVF9DTURfUkVRX1ZPSUNFTE9PUCwNCiAgICBDQ19BUFBfQVRfQ01EX1JFUV9JTVNQTFVTLA0KDQogICAgQ0NfQVBQX0FUX0NNRF9SRVFfU0VUX0NITEQsDQogICAgQ0NfQVBQX0FUX0NNRF9SRVFfU0VUX0NDRkMsDQogICAgQ0NfQVBQX0FUX0NNRF9SRVFfU0VUX0NDV0EsDQogICAgQ0NfQVBQX0FUX0NNRF9SRVFfU0VUX0NMQ0ssDQogICAgQ0NfQVBQX0FUX0NNRF9SRVFfR0VUX0NDRkMsDQogICAgQ0NfQVBQX0FUX0NNRF9SRVFfR0VUX0NDV0EsIA0KICAgIENDX0FQUF9BVF9DTURfUkVRX1NFVF9DUFdELA0KICAgIA0KICAgIENDX0FQUF9BVF9DTURfUkVRX0dFVF9DTENDLA0KfUVfQ0NfQVBQX0F0UmVxQ21kSWQ7DQovKiBEZWZpbmUga25vd24gZXZlbnRzLiBFdmVudHMgYXJlIHJlY2VpdmVkIGZyb20gdlRTUCBhbmQgU0lQLiAqLw0KdHlwZWRlZiBlbnVtIHsNCiAgICBaQ0NfTk9fRSAgICAgICAgICAgPSAwLA0KICAgIC8vWkNDX1JFU0VUX0UgICAgICAgID0gMSwNCiAgICBaQ0NfRFRNRl9FICAgICAgID0gMSwNCiAgICAvL1pDQ19EVE1GTEVfRSAgICAgICA9IDIsDQogICAgLy9aQ0NfRFRNRlRFX0UgICAgICAgPSAzLA0KICAgIFpDQ19ESUFMX0UgICAgICAgICA9IDQsDQogICAgWkNDX0NOQ1RfRSAgICAgICAgID0gNSwNCiAgICBaQ0NfRElTQ05fRSAgICAgICAgPSA2LA0KICAgIFpDQ19CU1lfRSAgICAgICAgICA9IDcsDQogICAgWkNDX01BVENIX0UgICAgICAgID0gOCwNCiAgICBaQ0NfVElNRVJfRSAgICAgICAgPSAxNiwNCg0KICAgIFpDQ19TRUlaRV9FICAgICAgICA9IDIwLA0KICAgIFpDQ19SRUxFQVNFX0UgICAgICA9IDIxLA0KICAgIFpDQ19GTEFTSF9FICAgICAgICA9IDIyLA0KDQogICAgWkNDX0NJRENXX0UgICAgICAgID0gMjksDQogICAgWkNDX1NJTlZJVEVfRSAgICAgID0gNDIsDQogICAgWkNDX1NESVNDTl9NT19FICAgICAgID0gNDMsDQogICAgWkNDX1NBTlNfRSAgICAgICAgID0gNDQsDQogICAgWkNDX1NSSU5HX0UgICAgICAgID0gNDUsDQogICAgWkNDX1NESUFMTElOR19FICAgICAgICA9IDQ2LA0KICAgIFpDQ19CVVNZVE9ORVRJTUVSX0UgICAgICAgID0gNDcsDQogICAgWkNDX0hPT0tPRkZUSU1FUl9FICAgICAgICA9IDQ4LA0KICAgIFpDQ19TU0RJQUxUT05FVElNRVJfRSAgICAgICAgPSA0OSwNCiAgICBaQ0NfRFRNRlRJTUVSX0UgICAgICAgID0gNTAsDQogICAgWkNDX1RLWVRJTUVSX0UgICAgICAgID0gNTEsDQogICAgWkNDX1NESVNDTl9NVF9FICAgICAgID0gNTIsDQogICAgWkNDX1NESUFMX0VSUl9FICAgICAgID0gNTMsDQogICAgWkNDX0hPT0tPRkZfSURMRV9USU1FUl9FICA9IDU0LA0KICAgIFpDQ19SRVNPVVJDRV9SRUFEWV9FID0gMTE1LA0KICAgIFpDQ19BU1NJU1RfTVNHX0UgPSAgMTI4DQp9IFRfekNjX0V2ZW50Oy8qIM/7z6K94bm5zOUgKi8NCg0KDQp0eXBlZGVmIFNJTlQzMiAoKnpDY0FwcF9SZWN2QXRJbmRGdW4pKE1TR19CVUYgKnB0TXNnQnVmKTsNCnR5cGVkZWYgU0lOVDMyICgqekNjQXBwX0F0SW5kUHJvY0Z1bikoTVNHX0JVRiAqcHRNc2dCdWYpOw0KdHlwZWRlZiAgc3RydWN0DQp7DQogICAgaW50ICAgICAgICAgICAgICAgICAgICAgQXRJbmRDbWQ7DQogICAgekNjQXBwX1JlY3ZBdEluZEZ1biAgICAgICAgICAgICBSZWN2QXRJbmRQcm9jRnVuOw0KfVRfQ0NfQVBQX1JlY3ZBdEluZEl0ZW07DQoNClNJTlQzMiB6Q2NfRHNjaUluZFByb2MoTVNHX0JVRiAqcHRNc2dCdWYpOw0KLy9TSU5UMzIgekNjX0NlbmRJbmRQcm9jKE1TR19CVUYgKnB0TXNnQnVmKTsNClNJTlQzMiB6Q2NfWmNwaUluZFByb2MoTVNHX0JVRiAqcHRNc2dCdWYpOw0KU0lOVDMyIHpDY19aaW1zcGx1c1Byb2MoTVNHX0JVRiAqcHRNc2dCdWYpOw0KU0lOVDMyIHpDY19adm9pY2VjaG5sUHJvYyhNU0dfQlVGICpwdE1zZ0J1Zik7DQoNCg0KdHlwZWRlZiAgc3RydWN0DQp7DQogICAgVUxPTkcgICAgICAgICAgICAgICAgICAgICBjbWRJZDsNCiAgICB6Q2NBcHBfQXRJbmRQcm9jRnVuICAgICAgICAgICAgIEF0SW5kUHJvY0Z1bjsNCn1UX0NDX0FQUF9BdEluZFByb2NJdGVtOw0KDQoNCg0KZXh0ZXJuIGNoYXIgZ196Q2NBcHBfQXRJbmRCdWZbWkNDX0FQUF9BVF9CVUZfTUFYX0xFTisxXTsNClNJTlQzMiB6Q2NBcHBfQXRJbmRQcm9jKGNoYXIqIEF0QnVmZiwgU0lOVDMyIEF0TGVuKTsNClZPSUQgekNjX1NlbmRBdERpYWxSZXEoUFNUUiBwQXRDbWRQYXJhKTsNClZPSUQgekNjX1NlbmRBdER0bWZSZXEoY2hhciogZHRtZmNoYXIpOw0KU0lOVDMyIHpDY19TZW5kQXRDaGxkUmVxKGludCBjaGxkdHlwZSk7DQpWT0lEIHpDY19TZW5kQXRBbnN3ZXJSZXEoVk9JRCk7DQpWT0lEIHpDY19TZW5kQXRIYW5ndXBSZXEoVk9JRCk7DQpTSU5UMzIgekNjX1JlY3ZEc2NpSW5kKE1TR19CVUYgKnB0TXNnQnVmKTsNClNJTlQzMiB6Q2NfUmVjdlpjcGlJbmQoTVNHX0JVRiAqcHRNc2dCdWYpOw0KU0lOVDMyIHpDY19SZWN2SW1zcGx1c0luZChNU0dfQlVGICpwdE1zZ0J1Zik7DQpTSU5UMzIgekNjX1JlY3Zadm9pY2VDaG5sKE1TR19CVUYgKnB0TXNnQnVmKTsNClZPSUQgekNjX0RpZ2l0c01hdGNoUmx0UHJvYyhVSU5UOCAgIHJldCk7DQpVSU5UOCB6Q2NfRGlnaXRzTWF0Y2goVk9JRCk7DQpWT0lEIHpDY19DbGVhckRpZ2l0cyhWT0lEKTsNClZPSUQgekNjX0luaXRTbGF2ZU9iaihVSU5UOCBzbGF2ZSk7DQpWT0lEIHpDY19TSWRsZVN0YXRlKFVJTlQ4ICAgc2xhdmUpOw0KVk9JRCB6Q2NfU0R0U3RhdGUoVUlOVDggICBzbGF2ZSk7DQpWT0lEIHpDY19TRGFjY21TdGF0ZShVSU5UOCAgIHNsYXZlKTsNClZPSUQgekNjX1NEaWFsaW5nU3RhdGUoVUlOVDggICBzbGF2ZSk7DQpWT0lEIHpDY19TUmluZ2JhY2tTdGF0ZShVSU5UOCAgIHNsYXZlKTsNClZPSUQgekNjX1NUYWxraW5nU3RhdGUoVUlOVDggICBzbGF2ZSk7DQpWT0lEIHpDY19TV2FpdFJlc291cmNlU3RhdGUoVUlOVDggICBzbGF2ZSk7DQpWT0lEIHpDY19TVHJ5aW5nU3RhdGUoVUlOVDggICBzbGF2ZSk7DQpWT0lEIHpDY19TQnN5VG9uZVN0YXRlKFVJTlQ4ICAgc2xhdmUpOw0KVk9JRCB6Q2NfU1RreXRTdGF0ZShVSU5UOCAgIHNsYXZlKTsNClZPSUQgekNjX1NTaWxTdGF0ZShVSU5UOCAgIHNsYXZlKTsNClZPSUQgekNjQXBwX0RpYWwoY2hhciAqcHRNc2dCdWYpOw0KU0lOVDMyIHpDY0FwcF9BbnN3ZXIoVk9JRCk7DQpTSU5UMzIgekNjQXBwX0NodXAoVk9JRCk7DQpTSU5UMzIgekNjQXBwX1Z0cyhjaGFyKiBkdG1mY2hhcik7DQpTSU5UMzIgekNjQXBwX0NobGQoaW50IGNobGR0eXBlKTsNClVJTlQ4IHpDY19DYWxsQ291bnQoVk9JRCk7DQp2b2lkIHpDY0FwcF9TZXRBdENobmxDbWRJZChFX0NDX0FQUF9BdFJlcUNtZElkIEF0Q21kSWQpOw0KVk9JRCB6Q2NfUnVuU2xhdmUoVUlOVDggICBzbGF2ZSk7DQpWT0lEIHpDY19SdW5NYXN0ZXIoTVNHX0JVRiAqcHRNc2dCdWYpOw0KU0lOVDMyIHpDY0FwcF9DY2ZjKFRfekNjYXBwX0NjZmNSZXEgKnB0Y2NmY3JlcSk7DQpTSU5UMzIgekNjQXBwX0NsY2soVF96Q2NhcHBfQ2xja1JlcSAqcHRjbGNrcmVxKTsNClNJTlQzMiB6Q2NBcHBfU2V0SW1zUGx1cyhpbnQgcmF0ZSwgaW50IHNldGZnKTsNClNJTlQzMiB6Q2NBcHBfQXRJbmRSc3BQcm9jKE1TR19CVUYgKnB0TXNnQnVmKTsNClNJTlQzMiB6Q2NfUmVjdlJzcChNU0dfQlVGICpwdE1zZ0J1Zik7DQpMT05HIHpDY0FwcF9zZW5kX21lc3NhZ2UodW5zaWduZWQgc2hvcnQgTXNnX2NtZCx1bnNpZ25lZCBzaG9ydCB1c19EYXRhTGVuLHVuc2lnbmVkIGNoYXIgKnBEYXRhKTsNClZPSUQgekNjX1NlbmRBdEltc1BsdXNSZXEoaW50IHJhdGUsIGludCBzZXRmZyk7DQoNClZPSUQgekNjX0NoZWNrU2xhdmVTdGF0ZShjb25zdCBjaGFyICp0aXBzKTsNClZPSUQgekNjX1Nob3dBbGxTbGF2ZShWT0lEKTsNCnZvaWQgekNjQXBwX1Z0c19DbGVhblJlcSh2b2lkKTsNCnZvaWQgekNjQXBwX1Z0c19Sc3Aodm9pZCk7DQoNCiNlbmRpZg0K