LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KLyogKiAgICAgICAgRFlOQU1JQyBNRU1PUlkgTUFOQUdFTUVOVCBNT0RVTEUgICAgICAgICAgICAgICAgKiAqLwovKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCi8qICogICRNb2R1bGU6ICAgTUVNT1JZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8gCi8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KLyogKiAgQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5LCAyMDAwLCAyMDAxICAgICAgKiAqLwovKiAqICBNUEkgZnVlciBJbmZvcm1hdGlrICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCi8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KLyogKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlICAgKiAqLwovKiAqICBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VICAgICAgICAqICovCi8qICogIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlICAgICAgICogKi8KLyogKiAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgKiAqLwovKiAqICBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAqICovCi8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KLyogKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCAgKiAqLwovKiAqICBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuICAgICAqICovCi8qICogIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTICAgICogKi8KLyogKiAgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgKiAqLwovKiAqICBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCi8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KLyogKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgICAgKiAqLwovKiAqICBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSAqICovCi8qICogIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSAgICAgICogKi8KLyogKiAgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBICAgICAgICAgKiAqLwovKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCi8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KLyogJFJldmlzaW9uJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCi8qICRTdGF0ZSQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KLyogJERhdGUkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCi8qICRBdXRob3IkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLwovKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCi8qICogICAgICAgICAgICAgQ29udGFjdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KLyogKiAgICAgICAgICAgICBDaHJpc3RvcGggV2VpZGVuYmFjaCAgICAgICAgICAgICAgICAgICAgICAgKiAqLwovKiAqICAgICAgICAgICAgIE1QSSBmdWVyIEluZm9ybWF0aWsgICAgICAgICAgICAgICAgICAgICAgICAqICovCi8qICogICAgICAgICAgICAgU3R1aGxzYXR6ZW5oYXVzd2VnIDg1ICAgICAgICAgICAgICAgICAgICAgICogKi8KLyogKiAgICAgICAgICAgICA2NjEyMyBTYWFyYnJ1ZWNrZW4gICAgICAgICAgICAgICAgICAgICAgICAgKiAqLwovKiAqICAgICAgICAgICAgIEVtYWlsOiB3ZWlkZW5iQG1waS1zYi5tcGcuZGUgICAgICAgICAgICAgICAqICovCi8qICogICAgICAgICAgICAgR2VybWFueSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLwovKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCgovKiAkUkNTZmlsZSQgKi8KCgojaWZuZGVmIF9NRU1PUllfCiNkZWZpbmUgX01FTU9SWV8KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyogSW5jbHVkZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgojaW5jbHVkZSAibWlzYy5oIgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKiBEYXRhIHN0cnVjdHVyZXMgYW5kIGNvbnN0YW50cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCiNpZm5kZWYgbWVtb3J5X19EWU5NQVhTSVpFCiNkZWZpbmUgbWVtb3J5X19EWU5NQVhTSVpFICAgMTAyNCAvKiBBdCBtb3N0IGJsb2NrcyBvZiBzaXplIG1lbW9yeV9fRFlOTUFYU0laRQoJCQkJICAgICBieXRlcyBhcmUgYWRtaW5pc3RyYXRlZCBieSB0aGUKCQkJCSAgICAgbW9kdWxlLCBsYXJnZXIgcmVxdWVzdHMgYXJlCgkJCQkgICAgIGRpcmVjdGx5IG1hcHBlZCB0byBzeXN0ZW0gY2FsbHMgKi8KI2VuZGlmCgojaWZuZGVmIG1lbW9yeV9fU0hBUkVEUEFHRVMKI2RlZmluZSBtZW1vcnlfX1NIQVJFRFBBR0VTICAgIDEgIC8qIE51bWJlciBvZiBibG9jayBzaXplcyBzaGFyaW5nIGFuIGFsbG9jYXRlZCAKCQkJCSAgICAgcGFnZS4gQnkgc2V0dGluZyBtZW1vcnlfX1NIQVJFRFBBR0VTIHRvIDQsIAoJCQkJICAgICB0aGUgbW9kdWxlIHdvdWxkIGFkbWluaXN0cmF0ZSByZXF1ZXN0cyAKCQkJCSAgICAgZm9yIDEsIDIsIDMgYW5kIDQgYnl0ZXMgb24gdGhlIHNhbWUgc2V0IG9mIAoJCQkJICAgICBwYWdlcywgcmVxdWVzdHMgZm9yIDUsIDYsIDcgYW5kIDggb24gYW5vdGhlciAKCQkJCSAgICAgb25lLCBldGMuIEJ5IGRlZmF1bHQgZXZlcnkgYmxvY2sgc2l6ZSBoYXMgCgkJCQkgICAgIGl0cyBvd24gc2V0IG9mIHBhZ2VzICovCiNlbmRpZgoKI2lmbmRlZiBtZW1vcnlfX0ZSRUVTSFJFRERFUgojZGVmaW5lIG1lbW9yeV9fRlJFRVNIUkVEREVSICAnUycgLyogIFRoZSBkZWNpbWFsIG51bWJlciA4Mywgd2hpY2ggY2FuIGFsc28gYmUgCgkJCQkgICAgICByZWFkIGFzIDUzIGhleGFkZWNpbWFsLCBvciB0aGUgY2hhcmFjdGVyIAoJCQkJICAgICAgJ1MnIGluIEFTQ0lJIGNvZGUgKi8KI2VuZGlmCgojZGVmaW5lIG1lbW9yeV9fS0lMT0JZVEUgICAgICAgIDEwMjQKCiNpZm5kZWYgbWVtb3J5X19ERUZBVUxUUEFHRVNJWkUKI2RlZmluZSBtZW1vcnlfX0RFRkFVTFRQQUdFU0laRSAoOCAqIG1lbW9yeV9fS0lMT0JZVEUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBVc2VkIHRvIHNldCB0aGUgZGVmYXVsdCBzaXplIG9mIGEgcGFnZS4gCgkJCQkgICAgIElmIHRoZSBkZWZhdWx0IHBhZ2Ugc2l6ZSBpcyB0b28gc21hbGwgdG8gCgkJCQkgICAgIGNvbnRhaW4gdHdvIG9iamVjdHMgb2Ygc2l6ZSBtZW1vcnlfX0RZTk1BWFNJWkUKCQkJCSAgICAgdGhlIGRlZmF1bHQgcGFnZSBzaXplIGlzIGF1dG9tYXRpY2FsbHkgCgkJCQkgICAgIGluY3JlYXNlZCBieSB0aGUgZnVuY3Rpb24gbWVtb3J5X0luaXQgKi8KI2VuZGlmCgojaWZuZGVmIG1lbW9yeV9fVU5MSU1JVEVECiNkZWZpbmUgbWVtb3J5X19VTkxJTUlURUQgICAgICAgKC0xKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVXNlZCB0byBzZXQgdGhlIG1heGltYWwgYW1vdW50IG9mIG1lbW9yeQoJCQkJICAgICBhdmFpbGFibGUgZm9yIHRoZSBtZW1vcnkgbW9kdWxlIHRvCgkJCQkgICAgICJ1bmxpbWl0ZWQiIHdoZW4gY2FsbGluZyBtZW1vcnlfSW5pdC4gKi8KI2VuZGlmCgp0eXBlZGVmIHN0cnVjdCBNRU1PUllfUkVTT1VSQ0VIRUxQIHsKICBQT0lOVEVSIGZyZWU7ICAgICAgICAgICAgICAgICAgICAvKiBwb2ludGVyIHRvIHRoZSBuZXh0IGZyZWUgYmxvY2sgaW4gbGlzdCAgKi8KICBQT0lOVEVSIG5leHQ7ICAgICAgICAgICAgICAgICAgICAvKiBwb2ludGVyIHRvIHRoZSBuZXh0IGZyZXNoIGJsb2NrICAgICAgICAgKi8KICBQT0lOVEVSIHBhZ2U7ICAgICAgICAgICAgICAgICAgICAvKiBwb2ludGVyIHRvIGhlYWQgb2YgcGFnZSBsaXN0ICAgICAgICAgICAgKi8KICBQT0lOVEVSIGVuZF9vZl9wYWdlOyAgICAgICAgICAgICAvKiBwb2ludGVyIHRvIHRoZSBlbmQgb2YgY3VycmVudCBwYWdlICAgICAgKi8KICBpbnQgICAgIHRvdGFsX3NpemU7ICAgICAgICAgICAgICAvKiB0b3RhbCBibG9jayBzaXplIGluYy4gZGVidWcgbWFya3MgICAgICAgKi8KICBpbnQgICAgIGFsaWduZWRfc2l6ZTsgICAgICAgICAgICAvKiBibG9jayBzaXplIHdpdGhvdXQgZGVidWcgbWFya3MgICAgICAgICAgKi8KICBpbnQgICAgIG9mZnNldDsgICAgICAgICAgICAgICAgICAvKiBvZmZzZXQgb2YgbGFzdCB1c2FibGUgYmxvY2sgb24gcGFnZSAgICAgKi8KfSBNRU1PUllfUkVTT1VSQ0U7CgpleHRlcm4gTUVNT1JZX1JFU09VUkNFICogbWVtb3J5X0FSUkFZW107CgojaWYgZGVmaW5lZChDSEVDSykKdHlwZWRlZiBzdHJ1Y3QgTUVNT1JZX0lORk9IRUxQIHsKICBjb25zdCBjaGFyICogbWFsbG9jSW5GaWxlOyAgICAgICAvKiBvcmlnaW4gb2YgYWxsb2NhdGlvbiByZXF1ZXN0OiAgIGZpbGUgICAgKi8KICBjb25zdCBjaGFyICogZnJlZUluRmlsZTsgICAgICAgICAvKiBvcmlnaW4gb2YgZGVhbGxvY2F0aW9uIHJlcXVlc3Q6IGZpbGUgICAgKi8KICB1bnNpZ25lZCBzaG9ydCBpbnQgbWFsbG9jQXRMaW5lOyAvKiBvcmlnaW4gb2YgYWxsb2NhdGlvbiByZXF1ZXN0OiAgIGxpbmUgICAgKi8KICB1bnNpZ25lZCBzaG9ydCBpbnQgZnJlZUF0TGluZTsgICAvKiBvcmlnaW4gb2YgZGVhbGxvY2F0aW9uIHJlcXVlc3Q6IGxpbmUgICAgKi8KfSBNRU1PUllfSU5GT05PREUsICogTUVNT1JZX0lORk87CgojZW5kaWYKCnR5cGVkZWYgc3RydWN0IE1FTU9SWV9CSUdCTE9DS0hFQURFUkhFTFAgewogIHN0cnVjdCBNRU1PUllfQklHQkxPQ0tIRUFERVJIRUxQICogcHJldmlvdXMsICogbmV4dDsKfSBNRU1PUllfQklHQkxPQ0tIRUFERVJOT0RFLCAqIE1FTU9SWV9CSUdCTE9DS0hFQURFUjsKCmV4dGVybiBsb25nICAgICAgICAgICAgICAgICAgbWVtb3J5X01BWE1FTTsKCmV4dGVybiB1bnNpZ25lZCBsb25nICAgICAgICAgbWVtb3J5X05FV0JZVEVTOwpleHRlcm4gdW5zaWduZWQgbG9uZyAgICAgICAgIG1lbW9yeV9GUkVFREJZVEVTOwoKZXh0ZXJuIGNvbnN0IHVuc2lnbmVkIGludCAgICBtZW1vcnlfTUFHSUNNQUxMT0M7CmV4dGVybiBjb25zdCB1bnNpZ25lZCBpbnQgICAgbWVtb3J5X01BR0lDRlJFRTsKCmV4dGVybiBjb25zdCB1bnNpZ25lZCBpbnQgICAgbWVtb3J5X0FMSUdOOwoKZXh0ZXJuIE1FTU9SWV9CSUdCTE9DS0hFQURFUiBtZW1vcnlfQklHQkxPQ0tTOwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKiBEZWJ1ZyBJbmZvcm1hdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCmV4dGVybiB1bnNpZ25lZCBpbnQgbWVtb3J5X01BUktTSVpFOwpleHRlcm4gdW5zaWduZWQgaW50IG1lbW9yeV9PRkZTRVQ7CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qIENoZWNrIEZ1bmN0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKI2lmZGVmIF9fY3BsdXNwbHVzCmV4dGVybiAiQyIgewojZW5kaWYKCgojaWZkZWYgQ0hFQ0sKdm9pZCAgICBtZW1vcnlfQ2hlY2tGcmVlKFBPSU5URVIgRnJlZXBvaW50ZXIsIHVuc2lnbmVkIGludCBTaXplLCB1bnNpZ25lZCBpbnQgUmVhbEJsb2NrU2l6ZSwgY29uc3QgY2hhciAqIEZpbGUsIHVuc2lnbmVkIHNob3J0IGludCBMaW5lKTsKI2VuZGlmIC8qIENIRUNLICovCgojaWZkZWYgX19jcGx1c3BsdXMKfQojZW5kaWYKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyogSW5saW5lIEZ1bmN0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgoKc3RhdGljIF9faW5saW5lX18gdW5zaWduZWQgaW50IG1lbW9yeV9DYWxjdWxhdGVSZWFsQmxvY2tTaXplKHVuc2lnbmVkIGludCAKCQkJCQkJCSAgICAgQmxvY2tTaXplKQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogIElOUFVUICA6IFNpemUgb2YgYSBibG9jayBvZiBtZW1vcnkuCiAgUkVUVVJOUzogaXRzIHJlYWwgc2l6ZS4KICBTVU1NQVJZOiBDYWxjdWxhdGVzIHRoZSBzaXplIG9mIGEgbWVtb3J5IGJsb2NrLCAKICAgICAgICAgICBpbmNsdWRpbmcgcGFkZGluZyBkdWUgdG8gbWVtb3J5IGFsaWdubWVudCBhbmQKICAgICAgICAgICBwYWdlIHNoYXJpbmcKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KeyAgCiAgdW5zaWduZWQgaW50IFJlYWxTaXplOwoKICBSZWFsU2l6ZSA9IEJsb2NrU2l6ZTsKCiAgaWYgKFJlYWxTaXplICUgbWVtb3J5X19TSEFSRURQQUdFUykgewogICAgUmVhbFNpemUgKz0gbWVtb3J5X19TSEFSRURQQUdFUyAtIChSZWFsU2l6ZSAlIG1lbW9yeV9fU0hBUkVEUEFHRVMpOwogIH0KCiAgaWYgKFJlYWxTaXplICUgbWVtb3J5X0FMSUdOKSB7CiAgICBSZWFsU2l6ZSArPSBtZW1vcnlfQUxJR04gLSAoUmVhbFNpemUgJSBtZW1vcnlfQUxJR04pOwogIH0KCiAgcmV0dXJuIFJlYWxTaXplOwoKfQoKc3RhdGljIF9faW5saW5lX18gdW5zaWduZWQgaW50IG1lbW9yeV9Mb29rdXBSZWFsQmxvY2tTaXplKHVuc2lnbmVkIGludCAKCQkJCQkJCSAgQmxvY2tTaXplKQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogIElOUFVUICA6IFNpemUgb2YgYSBibG9jayBvZiBtZW1vcnkuCiAgUkVUVVJOUzogaXRzIHJlYWwgc2l6ZS4KICBTVU1NQVJZOiBSZXR1cm5zIHRoZSBzaXplIG9mIGEgbWVtb3J5IGJsb2NrLCAKICAgICAgICAgICBpbmNsdWRpbmcgcGFkZGluZyBkdWUgdG8gbWVtb3J5IGFsaWdubWVudCBhbmQKICAgICAgICAgICBwYWdlIHNoYXJpbmcuCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnsgIAoKICB1bnNpZ25lZCBpbnQgUmVhbFNpemU7CgogIGlmIChCbG9ja1NpemUgPCBtZW1vcnlfX0RZTk1BWFNJWkUpIHsKICAgIFJlYWxTaXplID0gbWVtb3J5X0FSUkFZW0Jsb2NrU2l6ZV0tPmFsaWduZWRfc2l6ZTsKICB9CiAgZWxzZSB7CiAgICBSZWFsU2l6ZSA9IG1lbW9yeV9DYWxjdWxhdGVSZWFsQmxvY2tTaXplKEJsb2NrU2l6ZSk7CiAgfQoKICByZXR1cm4gUmVhbFNpemU7Cgp9CgojaWZkZWYgQ0hFQ0sKc3RhdGljIF9faW5saW5lX18gdm9pZCBtZW1vcnlfU2V0QmxvY2tTdGF0dXNBbmRTaXplKFBPSU5URVIgTWVtLCAKCQkJCQkJICAgIHVuc2lnbmVkIGludCBTdGF0dXMsCgkJCQkJCSAgICB1bnNpZ25lZCBpbnQgU2l6ZSkKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICBJTlBVVCAgOiBhIHBvaW50ZXIgdG8gYSBibG9jayBvZiBtZW1vcnksIGl0cyBzdGF0dXMKICAgICAgICAgICAobWVtb3J5X01BR0lDTUFMTE9DIG9yIG1lbW9yeV9NQUdJQ0ZSRUUpLCBhbmQKICAgICAgICAgICBzaXplLgogIFJFVFVSTlM6IE5vbmUuCiAgU1VNTUFSWTogU2V0cyBhIHN0YXR1cyBmbGFnIChtZW1vcnlfTUFHSUNNQUxMT0Mgb3IKICAgICAgICAgICBtZW1vcnlfTUFHSUNGUkVFKSBhbmQgYmxvY2sgc2l6ZS4KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KewogICooKGludCAqKU1lbSAtIDEpID0gU2l6ZTsgCiAgKigoaW50ICopKChjaGFyICopTWVtICsgbWVtb3J5X0xvb2t1cFJlYWxCbG9ja1NpemUoU2l6ZSkpKSA9IFN0YXR1czsKfQoKc3RhdGljIF9faW5saW5lX18gdW5zaWduZWQgaW50IG1lbW9yeV9HZXRCbG9ja1NpemUoUE9JTlRFUiBNZW0pCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgSU5QVVQgIDogQSBwb2ludGVyIHRvIGEgYmxvY2sgb2YgbWVtb3J5LgogIFJFVFVSTlM6IGl0cyBzaXplLgogIFNVTU1BUlk6IFJldHVybnMgdGhlIHNpemUgb2YgYSBtZW1vcnkgYmxvY2suCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnsKICByZXR1cm4gKigoaW50ICopTWVtIC0gMSk7Cn0KCnN0YXRpYyBfX2lubGluZV9fIHVuc2lnbmVkIGludCBtZW1vcnlfR2V0UmVhbEJsb2NrU2l6ZShQT0lOVEVSIE1lbSkKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICBJTlBVVCAgOiBBIHBvaW50ZXIgdG8gYSBibG9jayBvZiBtZW1vcnkuCiAgUkVUVVJOUzogaXRzIHJlYWwgc2l6ZS4KICBTVU1NQVJZOiBSZXR1cm5zIHRoZSByZWFsIHNpemUgb2YgYSBtZW1vcnkgYmxvY2ssCiAgICAgICAgICAgaW5jbHVkaW5nIHBhZGRpbmcgYnl0ZXMuCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnsKICByZXR1cm4gbWVtb3J5X0xvb2t1cFJlYWxCbG9ja1NpemUobWVtb3J5X0dldEJsb2NrU2l6ZShNZW0pKTsKfQoKc3RhdGljIF9faW5saW5lX18gdW5zaWduZWQgaW50IG1lbW9yeV9HZXRCbG9ja1N0YXR1cyhQT0lOVEVSIE1lbSkgCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgSU5QVVQgIDogQSBwb2ludGVyIHRvIGEgYmxvY2sgb2YgbWVtb3J5LgogIFJFVFVSTlM6IGl0cyBzdGF0dXMuCiAgU1VNTUFSWTogUmV0dXJucyB0aGUgc3RhdHVzIG9mIGEgbWVtb3J5IGJsb2NrLgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwp7CiAgdW5zaWduZWQgaW50IFNpemU7CgogIFNpemUgPSBtZW1vcnlfR2V0QmxvY2tTaXplKE1lbSk7IAoKICByZXR1cm4gICooKGludCAqKSgoY2hhciAqKU1lbSArIG1lbW9yeV9Mb29rdXBSZWFsQmxvY2tTaXplKFNpemUpKSk7Cn0KCnN0YXRpYyBfX2lubGluZV9fIHZvaWQgbWVtb3J5X1NldEluZm8oTUVNT1JZX0lORk8gSW5mbywKCQkJCSAgICAgIGNvbnN0IGNoYXIgKiBNYWxsb2NJbkZpbGUsCgkJCQkgICAgICB1bnNpZ25lZCBzaG9ydCBpbnQgTWFsbG9jQXRMaW5lLAoJCQkJICAgICAgY29uc3QgY2hhciAqIEZyZWVJbkZpbGUsCgkJCQkgICAgICB1bnNpZ25lZCBzaG9ydCBpbnQgRnJlZUF0TGluZSkKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICBJTlBVVCAgOiBhIG1lbW9yeSBpbmZvIHN0cnVjdHVyZSwgc3RyaW5ncyBmb3IgZmlsZXMgd2hlcmUKICAgICAgICAgICB0aGUgYmxvY2sgd2FzIGFsbG9jYXRlZCBhbmQgZnJlZWQsIGFuZCBzaG9ydCAKCSAgIGludGVnZXJzIGZvciB0aGUgY29ycmVzcG9uZGluZyBsaW5lcy4KICBSRVRVUk5TOiBOb25lLgogIFNVTU1BUlk6IFNldHMgdGhlIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiBmb3IgYSBtZW1vcnkgYmxvY2sKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KewogIGlmICghSW5mbykgewogICAgbWlzY19TdGFydEVycm9yUmVwb3J0KCk7CiAgICBtaXNjX0Vycm9yUmVwb3J0KCJcbiBJbiBtZW1vcnlfU2V0SW5mbzoiKTsKICAgIG1pc2NfRXJyb3JSZXBvcnQoIlxuIE1lbW9yeSBFcnJvci4gSW5mbyBpcyBhIE5VTEwgcG9pbnRlci5cbiIpOwogICAgbWlzY19GaW5pc2hFcnJvclJlcG9ydCgpOwogIH0KIAogIEluZm8tPm1hbGxvY0F0TGluZSAgID0gTWFsbG9jQXRMaW5lOwogIEluZm8tPm1hbGxvY0luRmlsZSAgID0gTWFsbG9jSW5GaWxlOwogIEluZm8tPmZyZWVBdExpbmUgICAgID0gRnJlZUF0TGluZTsKICBJbmZvLT5mcmVlSW5GaWxlICAgICA9IEZyZWVJbkZpbGU7Cn0KI2VuZGlmCgpzdGF0aWMgX19pbmxpbmVfXyB1bnNpZ25lZCBsb25nIG1lbW9yeV9EZW1hbmRlZEJ5dGVzKHZvaWQpCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgSU5QVVQgIDogTm90aGluZy4KICBSRVRVUk5TOiBNYXhpbXVtIG51bWJlciBvZiBieXRlcyBhbGxvY2F0ZWQgYXQgdGhlIHNhbWUgCiAgICAgICAgICAgdGltZSBieSB0aGUgbW9kdWxlLgogIFNVTU1BUlk6IFJldHVybnMgbWF4aW11bSBudW1iZXIgb2YgYWxsb2NhdGVkIGJ5dGVzIGF0IHRoZQogICAgICAgICAgIHNhbWUgdGltZS4KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KewogIHJldHVybiBtZW1vcnlfTkVXQllURVM7Cn0KCgpzdGF0aWMgX19pbmxpbmVfXyB1bnNpZ25lZCBsb25nIG1lbW9yeV9Vc2VkQnl0ZXModm9pZCkKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICBJTlBVVCAgOiBOb3RoaW5nLgogIFJFVFVSTlM6IE51bWJlciBvZiBieXRlcyBjdXJyZW50bHkgaW4gdXNlIGJ5IHlvdXIgcHJvZ3JhbS4KICBTVU1NQVJZOiBSZXR1cm5zIG51bWJlciBvZiBieXRlcyBjdXJyZW50bHkgYWxsb2NhdGVkLgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwp7CiAgcmV0dXJuIG1lbW9yeV9ORVdCWVRFUy1tZW1vcnlfRlJFRURCWVRFUzsKfQoKI2lmZGVmIE5PX01FTU9SWV9NQU5BR0VNRU5UCgpzdGF0aWMgX19pbmxpbmVfXyB2b2lkIG1lbW9yeV9GcmVlKFBPSU5URVIgRnJlZXBvaW50ZXIsIHVuc2lnbmVkIGludCBTaXplKQp7CiAgZnJlZSgoY2hhciopRnJlZXBvaW50ZXIpOwp9CgojZWxzZQoKI2lmZGVmIENIRUNLCnN0YXRpYyBfX2lubGluZV9fIHZvaWQgbWVtb3J5X0ZyZWVJbnRlcm4oUE9JTlRFUiAgRnJlZXBvaW50ZXIsIAoJCQkJCSB1bnNpZ25lZCBpbnQgU2l6ZSwgCgkJCQkJIGNvbnN0IGNoYXIgKiBGaWxlLCAKCQkJCQkgdW5zaWduZWQgc2hvcnQgaW50IExpbmUpCiNlbHNlCnN0YXRpYyBfX2lubGluZV9fIHZvaWQgbWVtb3J5X0ZyZWUoUE9JTlRFUiBGcmVlcG9pbnRlciwgdW5zaWduZWQgaW50IFNpemUpCiNlbmRpZgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogIElOUFVUICA6IFBvaW50ZXIgdG8gdGhlIGJsb2NrIG9mIG1lbW9yeSB0byBiZSBmcmVlZCwgCiAgICAgICAgICAgYW5kIHRoZSBibG9jaydzIHNpemUKICBSRVRVUk5TOiBOb3RoaW5nLgogIFNVTU1BUlk6IEZyZWVzIGEgYmxvY2sgb2YgbWVtb3J5IGZvciByZWFsbG9jYXRpb24uCiAgICAgICAgICAgVGhpcyBmdW5jdGlvbiBwZXJmb3JtcyBjb3JyZWN0bmVzcyBjaGVja3MKCSAgIGluIGRlYnVnZ2luZyBtb2RlLgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwp7IAogIHVuc2lnbmVkIGludCBSZWFsQmxvY2tTaXplOyAvKiBibG9ja7RzIGFsaWdubWVudCBjb3JyZWN0IHNpemUgKi8KCiAgUmVhbEJsb2NrU2l6ZSA9IG1lbW9yeV9Mb29rdXBSZWFsQmxvY2tTaXplKFNpemUpOwoKI2lmZGVmIENIRUNLCiAgbWVtb3J5X0NoZWNrRnJlZShGcmVlcG9pbnRlciwgU2l6ZSwgUmVhbEJsb2NrU2l6ZSwgRmlsZSwgTGluZSk7CiNlbmRpZgoKCiAgLyogQ2hlY2sgaWYgY3VycmVudCBibG9jayBpcyBhIGJpZyBibG9jayAqLyAKICBpZiAoU2l6ZSA+PSBtZW1vcnlfX0RZTk1BWFNJWkUpIHsKICAgIC8qIGlmIHRoYXS0cyB0cnVlLCByZW1vdmUgaXQgZnJvbSB0aGUgZG91YmxlIGxpbmtlZCBiaWcgYmxvY2sgbGlzdCAqLwogICAgTUVNT1JZX0JJR0JMT0NLSEVBREVSIEJpZ0Jsb2NrSGVhZGVyOwoKICAgIEJpZ0Jsb2NrSGVhZGVyID0gCiAgICAgIChNRU1PUllfQklHQkxPQ0tIRUFERVIpICgoY2hhciAqKSBGcmVlcG9pbnRlciAtIG1lbW9yeV9PRkZTRVQKCQkJICAgICAgIC0gc2l6ZW9mKE1FTU9SWV9CSUdCTE9DS0hFQURFUk5PREUpKTsKCiAgICAvKiBDaGVjayBpZiBjdXJyZW50IGJpZyBibG9jayBpcyB0aGUgZmlyc3QgYmxvY2sgaW4gdGhlIGxpc3QgKi8KICAgIGlmIChCaWdCbG9ja0hlYWRlci0+cHJldmlvdXMgIT0gTlVMTCkgewogICAgICAvKiBpZiB0aGF0tHMgbm90IHRydWUsIHNldCBwcmV2aW91cyBibG9ja7RzIHN1Y2Nlc3NvcgoJIHRvIGN1cnJlbnQgYmxvY2u0cyBzdWNjZXNzb3IKICAgICAgKi8KICAgICAgQmlnQmxvY2tIZWFkZXItPnByZXZpb3VzLT5uZXh0ID0gQmlnQmxvY2tIZWFkZXItPm5leHQ7CiAgICB9CiAgICBlbHNlIHsKICAgICAgLyogb3RoZXJ3aXNlIHNldCB0aGUgZmlyc3QgYmxvY2sgaW4gdGhlIGJpZyBibG9ja3MgbGlzdAoJIHRvIGN1cnJlbnQgYmxvY2u0cyBzdWNjZXNzb3IKICAgICAgKi8KICAgICAgbWVtb3J5X0JJR0JMT0NLUyA9IEJpZ0Jsb2NrSGVhZGVyLT5uZXh0OwogICAgfQoKICAgIC8qIENoZWNrIGlmIGN1cnJlbnQgYmxvY2sgaXMgdGhlIGxhc3QgYmxvY2sgaW4gdGhlIGxpc3QgKi8KICAgIGlmIChCaWdCbG9ja0hlYWRlci0+bmV4dCAhPSBOVUxMKSB7CiAgICAgIC8qIGlmIHRoYXS0cyBub3QgdHJ1ZSwgc2V0IG5leHQgYmxvY2u0IHByZWRlY2Vzc29yIHRvCgkgY3VycmVudCBibG9ja7RzIHByZWRlY2Vzc29yIAogICAgICAqLwogICAgICBCaWdCbG9ja0hlYWRlci0+bmV4dC0+cHJldmlvdXMgPSBCaWdCbG9ja0hlYWRlci0+cHJldmlvdXM7CiAgICB9CgogICAgLyogQWRhcHQgdG90YWwgbnVtYmVyIG9mIGZyZWVkIGJ5dGVzIAogICAgICAgYW5kIG51bWJlciBvZiBieXRlcyBhdmFpbGFibGUgZm9yIGFsbG9jYXRpb24KICAgICAgIGFjY29yZGluZ2x5CiAgICAqLwogICAgbWVtb3J5X0ZSRUVEQllURVMgICAgICAgKz0gUmVhbEJsb2NrU2l6ZSArIG1lbW9yeV9NQVJLU0laRSArIAogICAgICBzaXplb2YoTUVNT1JZX0JJR0JMT0NLSEVBREVSTk9ERSk7CgogICAgaWYgKG1lbW9yeV9NQVhNRU0gPj0gMCkgewogICAgICBtZW1vcnlfTUFYTUVNICAgICAgICAgICArPSBSZWFsQmxvY2tTaXplICsgbWVtb3J5X01BUktTSVpFICsgCglzaXplb2YoTUVNT1JZX0JJR0JMT0NLSEVBREVSTk9ERSk7CiAgICB9CgogICAgLyogcGFzcyB0aGUgY2FsbCB0aG91Z2ggdG8gZnJlZSgpIHdpdGggY29ycmVjdCBwb2ludGVyIHZhbHVlICovCiNpZmRlZiBDSEVDSwogICAgZnJlZSgoY2hhciAqKUZyZWVwb2ludGVyIC0gbWVtb3J5X09GRlNFVCAKCSAtIHNpemVvZihNRU1PUllfQklHQkxPQ0tIRUFERVJOT0RFKSk7CiNlbHNlCiAgICBmcmVlKChjaGFyKikgRnJlZXBvaW50ZXIgLSBzaXplb2YoTUVNT1JZX0JJR0JMT0NLSEVBREVSTk9ERSkpOwojZW5kaWYKICB9CiAgZWxzZSB7CiAgICAvKiBjdXJyZW50IGJsb2NrIGlzIG5vdCBhIGJpZyBibG9jayAqLwogICAgLyogQWRhcHQgbnVtYmVyIG9mIGFsbG9jYXRlZCBieXRlcyAKICAgICAgIGFuZCB0aGUgZnJlZWQgYmxvY2tzIGxpc3QgYWNjb3JkaW5nbHkgCiAgICAqLwogICAgbWVtb3J5X0ZSRUVEQllURVMgICAgICAgKz0gbWVtb3J5X0FSUkFZW1NpemVdLT50b3RhbF9zaXplOwogICAgKihQT0lOVEVSICopRnJlZXBvaW50ZXIgID0gbWVtb3J5X0FSUkFZW1NpemVdLT5mcmVlOwogICAgbWVtb3J5X0FSUkFZW1NpemVdLT5mcmVlID0gRnJlZXBvaW50ZXI7CiAgfQoKfQoKI2VuZGlmCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qIEZ1bmN0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKI2lmZGVmIF9fY3BsdXNwbHVzCmV4dGVybiAiQyIgewojZW5kaWYKCgp2b2lkICAgIG1lbW9yeV9Jbml0KGxvbmcpOwp2b2lkICAgIG1lbW9yeV9SZXN0cmljdChsb25nKTsKCnZvaWQgICAgbWVtb3J5X1ByaW50KHZvaWQpOwp2b2lkICAgIG1lbW9yeV9GUHJpbnQoRklMRSopOwogIAp2b2lkICAgIG1lbW9yeV9QcmludExlYWtzKHZvaWQpOwp2b2lkICAgIG1lbW9yeV9QcmludERldGFpbGVkKHZvaWQpOwp2b2lkICAgIG1lbW9yeV9QcmludEFsbG9jYXRlZEJsb2Nrcyh1bnNpZ25lZCBpbnQgU2l6ZSk7CnZvaWQgICAgbWVtb3J5X1ByaW50RnJlZWRCbG9ja3ModW5zaWduZWQgaW50IFNpemUpOwp2b2lkICAgIG1lbW9yeV9QcmludEFsbG9jYXRlZEJpZ0Jsb2Nrcyh2b2lkKTsKICAKdm9pZCAgICBtZW1vcnlfRnJlZUFsbE1lbSh2b2lkKTsKCiNpZmRlZiBfX2NwbHVzcGx1cwp9CiNlbmRpZgoKI2lmIGRlZmluZWQoQ0hFQ0spICYmICFkZWZpbmVkKE5PX01FTU9SWV9NQU5BR0VNRU5UKQovKiBkZWNsYXJlIGRyb3AtaW4gZGVidWcgdmVyc2lvbnMgbWVtb3J5IGZ1bmN0aW9ucyAqLwojaWZkZWYgX19jcGx1c3BsdXMKZXh0ZXJuICJDIiB7CiNlbmRpZgpQT0lOVEVSIG1lbW9yeV9NYWxsb2NJbnRlcm4odW5zaWduZWQgaW50LCBjb25zdCBjaGFyICosIHVuc2lnbmVkIHNob3J0IGludCk7ClBPSU5URVIgbWVtb3J5X0NhbGxvY0ludGVybih1bnNpZ25lZCBpbnQsCgkJCSAgICB1bnNpZ25lZCBpbnQsIAoJCQkgICAgY29uc3QgY2hhciAqLCAKCQkJICAgIHVuc2lnbmVkIHNob3J0IGludCk7CiNpZmRlZiBfX2NwbHVzcGx1cwp9CiNlbmRpZgojZGVmaW5lIG1lbW9yeV9NYWxsb2MoU2l6ZSkgbWVtb3J5X01hbGxvY0ludGVybigoU2l6ZSksIF9fRklMRV9fLCBfX0xJTkVfXykKI2RlZmluZSBtZW1vcnlfQ2FsbG9jKEVsZW1lbnRzLCBTaXplKSBcCm1lbW9yeV9DYWxsb2NJbnRlcm4oKEVsZW1lbnRzKSwgKFNpemUpLCBfX0ZJTEVfXywgX19MSU5FX18pCiNkZWZpbmUgbWVtb3J5X0ZyZWUoUG9pbnRlciwgU2l6ZSkgXAptZW1vcnlfRnJlZUludGVybigoUG9pbnRlciksIChTaXplKSwgX19GSUxFX18sIF9fTElORV9fKQojZWxzZQojaWZkZWYgX19jcGx1c3BsdXMKZXh0ZXJuICJDIiB7CiNlbmRpZgpQT0lOVEVSIG1lbW9yeV9NYWxsb2ModW5zaWduZWQgaW50KTsKUE9JTlRFUiBtZW1vcnlfQ2FsbG9jKHVuc2lnbmVkIGludCwgdW5zaWduZWQgaW50KTsKI2lmZGVmIF9fY3BsdXNwbHVzCn0KI2VuZGlmCiNlbmRpZgoKI2VuZGlmCg==