LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogIGZ0c3lzdGVtLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogICAgQW1pZ2Etc3BlY2lmaWMgRnJlZVR5cGUgbG93LWxldmVsIHN5c3RlbSBpbnRlcmZhY2UgKGJvZHkpLiAgICAgICAgICAgKi8KLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogIENvcHlyaWdodCAxOTk2LTIwMTcgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIFdlcm5lciBMZW1iZXJnIGFuZCBEZXRsZWYgV/xya25lci4gICAgICAgKi8KLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCiAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgLyogVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBBbWlnYSBpbnRlcmZhY2UgdXNlZCBieSBGcmVlVHlwZSB0byBhY2Nlc3MgICAgICovCiAgLyogbG93LWxldmVsLCBpLmUuIG1lbW9yeSBtYW5hZ2VtZW50LCBpL28gYWNjZXNzIGFzIHdlbGwgYXMgdGhyZWFkICAgICAgICovCiAgLyogc3luY2hyb25pc2F0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgoKICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAvKiBNYWludGFpbmVkIGJ5IERldGxlZiBX/HJrbmVyIDxUZXRpU29mdEBhcGcubGFobi5kZT4gICAgICAgICAgICAgICAgICAgKi8KICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAvKiBCYXNlZCBvbiB0aGUgb3JpZ2luYWwgZnRzeXN0ZW0uYywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAvKiBtb2RpZmllZCB0byBhdm9pZCBmb3BlbigpLCBmY2xvc2UoKSwgZnJlYWQoKSwgZnNlZWsoKSwgZnRlbGwoKSwgICAgICAgKi8KICAvKiBtYWxsb2MoKSwgcmVhbGxvYygpLCBhbmQgZnJlZSgpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAvKiBUaG9zZSBDIGxpYnJhcnkgZnVuY3Rpb25zIGFyZSBvZnRlbiBub3QgdGhyZWFkLXNhZmUgb3IgY2FudCBiZSAgICAgICAgKi8KICAvKiB1c2VkIGluIGEgc2hhcmVkIEFtaWdhIGxpYnJhcnkuIElmIHRoYXQncyBub3QgYSBwcm9ibGVtIGZvciB5b3UsICAgICAgICovCiAgLyogeW91IGNhbiBvZiBjb3Vyc2UgdXNlIHRoZSBkZWZhdWx0IGZ0c3lzdGVtLmMgd2l0aCBDIGxpYnJhcnkgY2FsbHMgICAgICovCiAgLyogaW5zdGVhZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgLyogVGhpcyBpbXBsZW1lbnRhdGlvbiBuZWVkcyBleGVjIFYzOSsgYmVjYXVzZSBpdCB1c2VzIEFsbG9jUG9vbGVkKCkgZXRjICovCiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgojZGVmaW5lIF9fTk9MSUJCQVNFX18KI2RlZmluZSBfX05PR0xPQkFMSUZBQ0VfXwojZGVmaW5lIF9fVVNFX0lOTElORV9fCiNpbmNsdWRlIDxwcm90by9leGVjLmg+CiNpbmNsdWRlIDxkb3Mvc3RkaW8uaD4KI2luY2x1ZGUgPHByb3RvL2Rvcy5oPgojaWZkZWYgX19hbWlnYW9zNF9fCmV4dGVybiBzdHJ1Y3QgRXhlY0lGYWNlICpJRXhlYzsKZXh0ZXJuIHN0cnVjdCBET1NJRmFjZSAgKklET1M7CiNlbHNlCmV4dGVybiBzdHJ1Y3QgTGlicmFyeSAgICpTeXNCYXNlOwpleHRlcm4gc3RydWN0IExpYnJhcnkgICAqRE9TQmFzZTsKI2VuZGlmCgojZGVmaW5lIElPQlVGX1NJWkUgNTEyCgovKiBzdHJ1Y3R1cmUgdGhhdCBoZWxwcyB1cyB0byBhdm9pZAogKiB1c2VsZXNzIGNhbGxzIG9mIFNlZWsoKSBhbmQgUmVhZCgpCiAqLwpzdHJ1Y3QgU3lzRmlsZQp7CiAgQlBUUiAgZmlsZTsKICBVTE9ORyBpb2J1Zl9zdGFydDsKICBVTE9ORyBpb2J1Zl9lbmQ7CiAgVUJZVEUgaW9idWZbSU9CVUZfU0laRV07Cn07CgojaWZuZGVmIF9fYW1pZ2FvczRfXwovKiBDIGltcGxlbWVudGF0aW9uIG9mIEFsbG9jVmVjUG9vbGVkIChzZWUgYXV0b2RvYyBleGVjL0FsbG9jUG9vbGVkKSAqLwpBUFRSCkFsbG9jX1ZlY1Bvb2xlZCggQVBUUiAgIHBvb2xIZWFkZXIsCiAgICAgICAgICAgICAgICAgVUxPTkcgIG1lbVNpemUgKQp7CiAgVUxPTkcgIG5ld1NpemUgPSBtZW1TaXplICsgc2l6ZW9mICggVUxPTkcgKTsKICBVTE9ORyAgKm1lbSA9IEFsbG9jUG9vbGVkKCBwb29sSGVhZGVyLCBuZXdTaXplICk7CgogIGlmICggIW1lbSApCiAgICByZXR1cm4gTlVMTDsKICAqbWVtID0gbmV3U2l6ZTsKICByZXR1cm4gbWVtICsgMTsKfQoKLyogQyBpbXBsZW1lbnRhdGlvbiBvZiBGcmVlVmVjUG9vbGVkIChzZWUgYXV0b2RvYyBleGVjL0FsbG9jUG9vbGVkKSAqLwp2b2lkCkZyZWVfVmVjUG9vbGVkKCBBUFRSICBwb29sSGVhZGVyLAogICAgICAgICAgICAgICAgQVBUUiAgbWVtb3J5ICkKewogIFVMT05HICAqcmVhbG1lbSA9IChVTE9ORyAqKW1lbW9yeSAtIDE7CgogIEZyZWVQb29sZWQoIHBvb2xIZWFkZXIsIHJlYWxtZW0sICpyZWFsbWVtICk7Cn0KI2VuZGlmCgojaW5jbHVkZSA8ZnQyYnVpbGQuaD4KI2luY2x1ZGUgRlRfQ09ORklHX0NPTkZJR19ICiNpbmNsdWRlIEZUX0lOVEVSTkFMX0RFQlVHX0gKI2luY2x1ZGUgRlRfU1lTVEVNX0gKI2luY2x1ZGUgRlRfRVJST1JTX0gKI2luY2x1ZGUgRlRfVFlQRVNfSAoKI2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPHN0cmluZy5oPgoKCiAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgLyogICAgICAgICAgICAgICAgICAgICAgIE1FTU9SWSBNQU5BR0VNRU5UIElOVEVSRkFDRSAgICAgICAgICAgICAgICAgICAgICovCiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgogIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogIC8qIEl0IGlzIG5vdCBuZWNlc3NhcnkgdG8gZG8gYW55IGVycm9yIGNoZWNraW5nIGZvciB0aGUgICAgICAgICAgICAgICAgICAqLwogIC8qIGFsbG9jYXRpb24tcmVsYXRlZCBmdW5jdGlvbnMuICBUaGlzIGlzIGRvbmUgYnkgdGhlIGhpZ2hlciBsZXZlbCAgICAgICAqLwogIC8qIHJvdXRpbmVzIGxpa2UgZnRfbWVtX2FsbG9jKCkgb3IgZnRfbWVtX3JlYWxsb2MoKS4gICAgICAgICAgICAgICAgICAgICAqLwogIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKCiAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgLyogICAgZnRfYWxsb2MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgLyogICAgVGhlIG1lbW9yeSBhbGxvY2F0aW9uIGZ1bmN0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgLyogICAgbWVtb3J5IDo6IEEgcG9pbnRlciB0byB0aGUgbWVtb3J5IG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgLyogICAgc2l6ZSAgIDo6IFRoZSByZXF1ZXN0ZWQgc2l6ZSBpbiBieXRlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgLyogICAgVGhlIGFkZHJlc3Mgb2YgbmV3bHkgYWxsb2NhdGVkIGJsb2NrLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgRlRfQ0FMTEJBQ0tfREVGKCB2b2lkKiApCiAgZnRfYWxsb2MoIEZUX01lbW9yeSAgbWVtb3J5LAogICAgICAgICAgICBsb25nICAgICAgIHNpemUgKQogIHsKI2lmZGVmIF9fYW1pZ2FvczRfXwogICAgcmV0dXJuIEFsbG9jVmVjUG9vbGVkKCBtZW1vcnktPnVzZXIsIHNpemUgKTsKI2Vsc2UKICAgIHJldHVybiBBbGxvY19WZWNQb29sZWQoIG1lbW9yeS0+dXNlciwgc2l6ZSApOwojZW5kaWYKICB9CgoKICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAvKiAgICBmdF9yZWFsbG9jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAvKiAgICBUaGUgbWVtb3J5IHJlYWxsb2NhdGlvbiBmdW5jdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAvKiAgICBtZW1vcnkgICA6OiBBIHBvaW50ZXIgdG8gdGhlIG1lbW9yeSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAvKiAgICBjdXJfc2l6ZSA6OiBUaGUgY3VycmVudCBzaXplIG9mIHRoZSBhbGxvY2F0ZWQgbWVtb3J5IGJsb2NrLiAgICAgICAgKi8KICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAvKiAgICBuZXdfc2l6ZSA6OiBUaGUgbmV3bHkgcmVxdWVzdGVkIHNpemUgaW4gYnl0ZXMuICAgICAgICAgICAgICAgICAgICAgKi8KICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAvKiAgICBibG9jayAgICA6OiBUaGUgY3VycmVudCBhZGRyZXNzIG9mIHRoZSBibG9jayBpbiBtZW1vcnkuICAgICAgICAgICAgKi8KICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAvKiAgICBUaGUgYWRkcmVzcyBvZiB0aGUgcmVhbGxvY2F0ZWQgbWVtb3J5IGJsb2NrLiAgICAgICAgICAgICAgICAgICAgICAgKi8KICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICBGVF9DQUxMQkFDS19ERUYoIHZvaWQqICkKICBmdF9yZWFsbG9jKCBGVF9NZW1vcnkgIG1lbW9yeSwKICAgICAgICAgICAgICBsb25nICAgICAgIGN1cl9zaXplLAogICAgICAgICAgICAgIGxvbmcgICAgICAgbmV3X3NpemUsCiAgICAgICAgICAgICAgdm9pZCogICAgICBibG9jayApCiAgewogICAgdm9pZCogbmV3X2Jsb2NrOwoKI2lmZGVmIF9fYW1pZ2FvczRfXwogICAgbmV3X2Jsb2NrID0gQWxsb2NWZWNQb29sZWQgKCBtZW1vcnktPnVzZXIsIG5ld19zaXplICk7CiNlbHNlCiAgICBuZXdfYmxvY2sgPSBBbGxvY19WZWNQb29sZWQgKCBtZW1vcnktPnVzZXIsIG5ld19zaXplICk7CiNlbmRpZgogICAgaWYgKCBuZXdfYmxvY2sgIT0gTlVMTCApCiAgICB7CiAgICAgIENvcHlNZW0gKCBibG9jaywgbmV3X2Jsb2NrLAogICAgICAgICAgICAgICAgKCBuZXdfc2l6ZSA+IGN1cl9zaXplICkgPyBjdXJfc2l6ZSA6IG5ld19zaXplICk7CiNpZmRlZiBfX2FtaWdhb3M0X18KICAgICAgRnJlZVZlY1Bvb2xlZCAoIG1lbW9yeS0+dXNlciwgYmxvY2sgKTsKI2Vsc2UKICAgICAgRnJlZV9WZWNQb29sZWQgKCBtZW1vcnktPnVzZXIsIGJsb2NrICk7CiNlbmRpZgogICAgfQogICAgcmV0dXJuIG5ld19ibG9jazsKICB9CgoKICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAvKiAgICBmdF9mcmVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAvKiAgICBUaGUgbWVtb3J5IHJlbGVhc2UgZnVuY3Rpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAvKiAgICBtZW1vcnkgIDo6IEEgcG9pbnRlciB0byB0aGUgbWVtb3J5IG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAvKiAgICBibG9jayAgIDo6IFRoZSBhZGRyZXNzIG9mIGJsb2NrIGluIG1lbW9yeSB0byBiZSBmcmVlZC4gICAgICAgICAgICAgKi8KICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICBGVF9DQUxMQkFDS19ERUYoIHZvaWQgKQogIGZ0X2ZyZWUoIEZUX01lbW9yeSAgbWVtb3J5LAogICAgICAgICAgIHZvaWQqICAgICAgYmxvY2sgKQogIHsKI2lmZGVmIF9fYW1pZ2FvczRfXwogICAgRnJlZVZlY1Bvb2xlZCggbWVtb3J5LT51c2VyLCBibG9jayApOwojZWxzZQogICAgRnJlZV9WZWNQb29sZWQoIG1lbW9yeS0+dXNlciwgYmxvY2sgKTsKI2VuZGlmCiAgfQoKCiAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgLyogICAgICAgICAgICAgICAgICAgICBSRVNPVVJDRSBNQU5BR0VNRU5UIElOVEVSRkFDRSAgICAgICAgICAgICAgICAgICAgICovCiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgoKICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAvKiBUaGUgbWFjcm8gRlRfQ09NUE9ORU5UIGlzIHVzZWQgaW4gdHJhY2UgbW9kZS4gIEl0IGlzIGFuIGltcGxpY2l0ICAgICAgKi8KICAvKiBwYXJhbWV0ZXIgb2YgdGhlIEZUX1RSQUNFKCkgYW5kIEZUX0VSUk9SKCkgbWFjcm9zLCB1c2VkIHRvIHByaW50L2xvZyAgKi8KICAvKiBtZXNzYWdlcyBkdXJpbmcgZXhlY3V0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KI3VuZGVmICBGVF9DT01QT05FTlQKI2RlZmluZSBGVF9DT01QT05FTlQgIHRyYWNlX2lvCgogIC8qIFdlIHVzZSB0aGUgbWFjcm8gU1RSRUFNX0ZJTEUgZm9yIGNvbnZlbmllbmNlIHRvIGV4dHJhY3QgdGhlICAgICAgICovCiAgLyogc3lzdGVtLXNwZWNpZmljIHN0cmVhbSBoYW5kbGUgZnJvbSBhIGdpdmVuIEZyZWVUeXBlIHN0cmVhbSBvYmplY3QgKi8KI2RlZmluZSBTVFJFQU1fRklMRSggc3RyZWFtICkgICggKHN0cnVjdCBTeXNGaWxlICopc3RyZWFtLT5kZXNjcmlwdG9yLnBvaW50ZXIgKQoKCiAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgLyogICAgZnRfYW1pZ2Ffc3RyZWFtX2Nsb3NlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgLyogICAgVGhlIGZ1bmN0aW9uIHRvIGNsb3NlIGEgc3RyZWFtLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgLyogICAgc3RyZWFtIDo6IEEgcG9pbnRlciB0byB0aGUgc3RyZWFtIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgRlRfQ0FMTEJBQ0tfREVGKCB2b2lkICkKICBmdF9hbWlnYV9zdHJlYW1fY2xvc2UoIEZUX1N0cmVhbSAgc3RyZWFtICkKICB7CiAgICBzdHJ1Y3QgU3lzRmlsZSogc3lzZmlsZTsKCiAgICBzeXNmaWxlID0gU1RSRUFNX0ZJTEUoIHN0cmVhbSApOwogICAgQ2xvc2UgKCBzeXNmaWxlLT5maWxlICk7CiAgICBGcmVlTWVtICggc3lzZmlsZSwgc2l6ZW9mICggc3RydWN0IFN5c0ZpbGUgKSk7CgogICAgc3RyZWFtLT5kZXNjcmlwdG9yLnBvaW50ZXIgPSBOVUxMOwogICAgc3RyZWFtLT5zaXplICAgICAgICAgICAgICAgPSAwOwogICAgc3RyZWFtLT5iYXNlICAgICAgICAgICAgICAgPSAwOwogIH0KCgogIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogIC8qICAgIGZ0X2FtaWdhX3N0cmVhbV9pbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogIC8qICAgIFRoZSBmdW5jdGlvbiB0byBvcGVuIGEgc3RyZWFtLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogIC8qICAgIHN0cmVhbSA6OiBBIHBvaW50ZXIgdG8gdGhlIHN0cmVhbSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogIC8qICAgIG9mZnNldCA6OiBUaGUgcG9zaXRpb24gaW4gdGhlIGRhdGEgc3RyZWFtIHRvIHN0YXJ0IHJlYWRpbmcuICAgICAgICAqLwogIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogIC8qICAgIGJ1ZmZlciA6OiBUaGUgYWRkcmVzcyBvZiBidWZmZXIgdG8gc3RvcmUgdGhlIHJlYWQgZGF0YS4gICAgICAgICAgICAqLwogIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogIC8qICAgIGNvdW50ICA6OiBUaGUgbnVtYmVyIG9mIGJ5dGVzIHRvIHJlYWQgZnJvbSB0aGUgc3RyZWFtLiAgICAgICAgICAgICAqLwogIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogIC8qICAgIFRoZSBudW1iZXIgb2YgYnl0ZXMgYWN0dWFsbHkgcmVhZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogIEZUX0NBTExCQUNLX0RFRiggdW5zaWduZWQgbG9uZyApCiAgZnRfYW1pZ2Ffc3RyZWFtX2lvKCBGVF9TdHJlYW0gICAgICAgc3RyZWFtLAogICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyAgIG9mZnNldCwKICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIqICBidWZmZXIsCiAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nICAgY291bnQgKQogIHsKICAgIHN0cnVjdCBTeXNGaWxlKiBzeXNmaWxlOwogICAgdW5zaWduZWQgbG9uZyAgIHJlYWRfYnl0ZXM7CgogICAgaWYgKCBjb3VudCAhPSAwICkKICAgIHsKICAgICAgc3lzZmlsZSA9IFNUUkVBTV9GSUxFKCBzdHJlYW0gKTsKCiAgICAgIC8qIGhhbmRsZSB0aGUgc2VlayAqLwogICAgICBpZiAoIChvZmZzZXQgPCBzeXNmaWxlLT5pb2J1Zl9zdGFydCkgfHwgKG9mZnNldCArIGNvdW50ID4gc3lzZmlsZS0+aW9idWZfZW5kKSApCiAgICAgIHsKICAgICAgICAvKiByZXF1ZXN0ZWQgb2Zmc2V0IGltcGxpZXMgd2UgbmVlZCBhIGJ1ZmZlciByZWZpbGwgKi8KICAgICAgICBpZiAoICFzeXNmaWxlLT5pb2J1Zl9lbmQgfHwgb2Zmc2V0ICE9IHN5c2ZpbGUtPmlvYnVmX2VuZCApCiAgICAgICAgewogICAgICAgICAgLyogYSBwaHlzaWNhbCBzZWVrIGlzIG5lY2Vzc2FyeSAqLwogICAgICAgICAgU2Vlayggc3lzZmlsZS0+ZmlsZSwgb2Zmc2V0LCBPRkZTRVRfQkVHSU5OSU5HICk7CiAgICAgICAgfQogICAgICAgIHN5c2ZpbGUtPmlvYnVmX3N0YXJ0ID0gb2Zmc2V0OwogICAgICAgIHN5c2ZpbGUtPmlvYnVmX2VuZCA9IDA7IC8qIHRyaWdnZXIgYSBidWZmZXIgcmVmaWxsICovCiAgICAgIH0KCiAgICAgIC8qIGhhbmRsZSB0aGUgcmVhZCAqLwogICAgICBpZiAoIG9mZnNldCArIGNvdW50IDw9IHN5c2ZpbGUtPmlvYnVmX2VuZCApCiAgICAgIHsKICAgICAgICAvKiB3ZSBoYXZlIGJ1ZmZlciBhbmQgcmVxdWVzdGVkIGJ5dGVzIGFyZSBhbGwgaW5zaWRlIG91ciBidWZmZXIgKi8KICAgICAgICBDb3B5TWVtKCAmc3lzZmlsZS0+aW9idWZbb2Zmc2V0IC0gc3lzZmlsZS0+aW9idWZfc3RhcnRdLCBidWZmZXIsIGNvdW50ICk7CiAgICAgICAgcmVhZF9ieXRlcyA9IGNvdW50OwogICAgICB9CiAgICAgIGVsc2UKICAgICAgewogICAgICAgIC8qIChyZSlmaWxsIGJ1ZmZlciAqLwogICAgICAgIGlmICggY291bnQgPD0gSU9CVUZfU0laRSApCiAgICAgICAgewogICAgICAgICAgLyogcmVxdWVzdGVkIGJ5dGVzIGlzIGEgc3Vic2V0IG9mIHRoZSBidWZmZXIgKi8KICAgICAgICAgIHJlYWRfYnl0ZXMgPSBSZWFkKCBzeXNmaWxlLT5maWxlLCBzeXNmaWxlLT5pb2J1ZiwgSU9CVUZfU0laRSApOwogICAgICAgICAgaWYgKCByZWFkX2J5dGVzID09IC0xVUwgKQogICAgICAgICAgewogICAgICAgICAgICAvKiBlcnJvciAqLwogICAgICAgICAgICByZWFkX2J5dGVzID0gMDsKICAgICAgICAgIH0KICAgICAgICAgIGVsc2UKICAgICAgICAgIHsKICAgICAgICAgICAgc3lzZmlsZS0+aW9idWZfZW5kID0gb2Zmc2V0ICsgcmVhZF9ieXRlczsKICAgICAgICAgICAgQ29weU1lbSggc3lzZmlsZS0+aW9idWYsIGJ1ZmZlciwgY291bnQgKTsKICAgICAgICAgICAgaWYgKCByZWFkX2J5dGVzID4gY291bnQgKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgcmVhZF9ieXRlcyA9IGNvdW50OwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAvKiB3ZSBhY3R1YWxseSBuZWVkIG1vcmUgdGhhbiBvdXIgYnVmZmVyIGNhbiBob2xkLCBzbyB3ZSBkZWNpZGUKICAgICAgICAgICoqIHRvIGRvIGEgc2luZ2xlIGJpZyByZWFkLCBhbmQgdGhlbiBjb3B5IHRoZSBsYXN0IElPQlVGX1NJWkUKICAgICAgICAgICoqIGJ5dGVzIG9mIHRoYXQgdG8gb3VyIGludGVybmFsIGJ1ZmZlciBmb3IgbGF0ZXIgdXNlICovCiAgICAgICAgICByZWFkX2J5dGVzID0gUmVhZCggc3lzZmlsZS0+ZmlsZSwgYnVmZmVyLCBjb3VudCApOwogICAgICAgICAgaWYgKCByZWFkX2J5dGVzID09IC0xVUwgKQogICAgICAgICAgewogICAgICAgICAgICAvKiBlcnJvciAqLwogICAgICAgICAgICByZWFkX2J5dGVzID0gMDsKICAgICAgICAgIH0KICAgICAgICAgIGVsc2UKICAgICAgICAgIHsKICAgICAgICAgICAgVUxPTkcgYnVmc2l6ZTsKCiAgICAgICAgICAgIGJ1ZnNpemUgPSAoIHJlYWRfYnl0ZXMgPiBJT0JVRl9TSVpFICkgPyBJT0JVRl9TSVpFIDogcmVhZF9ieXRlczsKICAgICAgICAgICAgc3lzZmlsZS0+aW9idWZfZW5kID0gb2Zmc2V0ICsgcmVhZF9ieXRlczsKICAgICAgICAgICAgc3lzZmlsZS0+aW9idWZfc3RhcnQgPSBzeXNmaWxlLT5pb2J1Zl9lbmQgLSBidWZzaXplOwogICAgICAgICAgICBDb3B5TWVtKCAmYnVmZmVyW3JlYWRfYnl0ZXMgLSBidWZzaXplXSAsIHN5c2ZpbGUtPmlvYnVmLCBidWZzaXplICk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgIHJlYWRfYnl0ZXMgPSAwOwogICAgfQoKICAgIHJldHVybiByZWFkX2J5dGVzOwogIH0KCgogIC8qIGRvY3VtZW50YXRpb24gaXMgaW4gZnRvYmpzLmggKi8KCiAgRlRfQkFTRV9ERUYoIEZUX0Vycm9yICkKICBGVF9TdHJlYW1fT3BlbiggRlRfU3RyZWFtICAgIHN0cmVhbSwKICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogIGZpbGVwYXRobmFtZSApCiAgewogICAgc3RydWN0IEZpbGVJbmZvQmxvY2sqICBmaWI7CiAgICBzdHJ1Y3QgU3lzRmlsZSogICAgICAgIHN5c2ZpbGU7CgoKICAgIGlmICggIXN0cmVhbSApCiAgICAgIHJldHVybiBGVF9USFJPVyggSW52YWxpZF9TdHJlYW1fSGFuZGxlICk7CgojaWZkZWYgX19hbWlnYW9zNF9fCiAgICBzeXNmaWxlID0gQWxsb2NNZW0gKCBzaXplb2YgKHN0cnVjdCBTeXNGaWxlICksIE1FTUZfU0hBUkVEICk7CiNlbHNlCiAgICBzeXNmaWxlID0gQWxsb2NNZW0gKCBzaXplb2YgKHN0cnVjdCBTeXNGaWxlICksIE1FTUZfUFVCTElDICk7CiNlbmRpZgogICAgaWYgKCAhc3lzZmlsZSApCiAgICB7CiAgICAgIEZUX0VSUk9SKCggIkZUX1N0cmVhbV9PcGVuOiIgKSk7CiAgICAgIEZUX0VSUk9SKCggIiBjb3VsZCBub3Qgb3BlbiBgJXMnXG4iLCBmaWxlcGF0aG5hbWUgKSk7CgogICAgICByZXR1cm4gRlRfVEhST1coIENhbm5vdF9PcGVuX1Jlc291cmNlICk7CiAgICB9CiAgICBzeXNmaWxlLT5maWxlID0gT3BlbiggKFNUUlBUUilmaWxlcGF0aG5hbWUsIE1PREVfT0xERklMRSApOwogICAgaWYgKCAhc3lzZmlsZS0+ZmlsZSApCiAgICB7CiAgICAgIEZyZWVNZW0gKCBzeXNmaWxlLCBzaXplb2YgKCBzdHJ1Y3QgU3lzRmlsZSApKTsKICAgICAgRlRfRVJST1IoKCAiRlRfU3RyZWFtX09wZW46IiApKTsKICAgICAgRlRfRVJST1IoKCAiIGNvdWxkIG5vdCBvcGVuIGAlcydcbiIsIGZpbGVwYXRobmFtZSApKTsKCiAgICAgIHJldHVybiBGVF9USFJPVyggQ2Fubm90X09wZW5fUmVzb3VyY2UgKTsKICAgIH0KCiAgICBmaWIgPSBBbGxvY0Rvc09iamVjdCggRE9TX0ZJQiwgTlVMTCApOwogICAgaWYgKCAhZmliICkKICAgIHsKICAgICAgQ2xvc2UgKCBzeXNmaWxlLT5maWxlICk7CiAgICAgIEZyZWVNZW0gKCBzeXNmaWxlLCBzaXplb2YgKCBzdHJ1Y3QgU3lzRmlsZSApKTsKICAgICAgRlRfRVJST1IoKCAiRlRfU3RyZWFtX09wZW46IiApKTsKICAgICAgRlRfRVJST1IoKCAiIGNvdWxkIG5vdCBvcGVuIGAlcydcbiIsIGZpbGVwYXRobmFtZSApKTsKCiAgICAgIHJldHVybiBGVF9USFJPVyggQ2Fubm90X09wZW5fUmVzb3VyY2UgKTsKICAgIH0KICAgIGlmICggISggRXhhbWluZUZIKCBzeXNmaWxlLT5maWxlLCBmaWIgKSApICkKICAgIHsKICAgICAgRnJlZURvc09iamVjdCggRE9TX0ZJQiwgZmliICk7CiAgICAgIENsb3NlICggc3lzZmlsZS0+ZmlsZSApOwogICAgICBGcmVlTWVtICggc3lzZmlsZSwgc2l6ZW9mICggc3RydWN0IFN5c0ZpbGUgKSk7CiAgICAgIEZUX0VSUk9SKCggIkZUX1N0cmVhbV9PcGVuOiIgKSk7CiAgICAgIEZUX0VSUk9SKCggIiBjb3VsZCBub3Qgb3BlbiBgJXMnXG4iLCBmaWxlcGF0aG5hbWUgKSk7CgogICAgICByZXR1cm4gRlRfVEhST1coIENhbm5vdF9PcGVuX1Jlc291cmNlICk7CiAgICB9CiAgICBzdHJlYW0tPnNpemUgPSBmaWItPmZpYl9TaXplOwogICAgRnJlZURvc09iamVjdCggRE9TX0ZJQiwgZmliICk7CgogICAgc3RyZWFtLT5kZXNjcmlwdG9yLnBvaW50ZXIgPSAodm9pZCAqKXN5c2ZpbGU7CiAgICBzdHJlYW0tPnBhdGhuYW1lLnBvaW50ZXIgICA9IChjaGFyKilmaWxlcGF0aG5hbWU7CiAgICBzeXNmaWxlLT5pb2J1Zl9zdGFydCAgICAgICA9IDA7CiAgICBzeXNmaWxlLT5pb2J1Zl9lbmQgICAgICAgICA9IDA7CiAgICBzdHJlYW0tPnBvcyAgICAgICAgICAgICAgICA9IDA7CgogICAgc3RyZWFtLT5yZWFkICA9IGZ0X2FtaWdhX3N0cmVhbV9pbzsKICAgIHN0cmVhbS0+Y2xvc2UgPSBmdF9hbWlnYV9zdHJlYW1fY2xvc2U7CgogICAgaWYgKCAhc3RyZWFtLT5zaXplICkKICAgIHsKICAgICAgZnRfYW1pZ2Ffc3RyZWFtX2Nsb3NlKCBzdHJlYW0gKTsKICAgICAgRlRfRVJST1IoKCAiRlRfU3RyZWFtX09wZW46IiApKTsKICAgICAgRlRfRVJST1IoKCAiIG9wZW5lZCBgJXMnIGJ1dCB6ZXJvLXNpemVkXG4iLCBmaWxlcGF0aG5hbWUgKSk7CiAgICAgIHJldHVybiBGVF9USFJPVyggQ2Fubm90X09wZW5fU3RyZWFtICk7CiAgICB9CgogICAgRlRfVFJBQ0UxKCggIkZUX1N0cmVhbV9PcGVuOiIgKSk7CiAgICBGVF9UUkFDRTEoKCAiIG9wZW5lZCBgJXMnICglbGQgYnl0ZXMpIHN1Y2Nlc3NmdWxseVxuIiwKICAgICAgICAgICAgICAgIGZpbGVwYXRobmFtZSwgc3RyZWFtLT5zaXplICkpOwoKICAgIHJldHVybiBGVF9FcnJfT2s7CiAgfQoKCiNpZmRlZiBGVF9ERUJVR19NRU1PUlkKCiAgZXh0ZXJuIEZUX0ludAogIGZ0X21lbV9kZWJ1Z19pbml0KCBGVF9NZW1vcnkgIG1lbW9yeSApOwoKICBleHRlcm4gdm9pZAogIGZ0X21lbV9kZWJ1Z19kb25lKCBGVF9NZW1vcnkgIG1lbW9yeSApOwoKI2VuZGlmCgoKICAvKiBkb2N1bWVudGF0aW9uIGlzIGluIGZ0b2Jqcy5oICovCgogIEZUX0JBU0VfREVGKCBGVF9NZW1vcnkgKQogIEZUX05ld19NZW1vcnkoIHZvaWQgKQogIHsKICAgIEZUX01lbW9yeSAgbWVtb3J5OwoKCiNpZmRlZiBfX2FtaWdhb3M0X18KICAgIG1lbW9yeSA9IChGVF9NZW1vcnkpQWxsb2NWZWMoIHNpemVvZiAoICptZW1vcnkgKSwgTUVNRl9TSEFSRUQgKTsKI2Vsc2UKICAgIG1lbW9yeSA9IChGVF9NZW1vcnkpQWxsb2NWZWMoIHNpemVvZiAoICptZW1vcnkgKSwgTUVNRl9QVUJMSUMgKTsKI2VuZGlmCiAgICBpZiAoIG1lbW9yeSApCiAgICB7CiNpZmRlZiBfX2FtaWdhb3M0X18KICAgICAgbWVtb3J5LT51c2VyID0gQ3JlYXRlUG9vbCggTUVNRl9TSEFSRUQsIDE2Mzg0LCAxNjM4NCApOwojZWxzZQogICAgICBtZW1vcnktPnVzZXIgPSBDcmVhdGVQb29sKCBNRU1GX1BVQkxJQywgMTYzODQsIDE2Mzg0ICk7CiNlbmRpZgogICAgICBpZiAoIG1lbW9yeS0+dXNlciA9PSBOVUxMICkKICAgICAgewogICAgICAgIEZyZWVWZWMoIG1lbW9yeSApOwogICAgICAgIG1lbW9yeSA9IE5VTEw7CiAgICAgIH0KICAgICAgZWxzZQogICAgICB7CiAgICAgICAgbWVtb3J5LT5hbGxvYyAgID0gZnRfYWxsb2M7CiAgICAgICAgbWVtb3J5LT5yZWFsbG9jID0gZnRfcmVhbGxvYzsKICAgICAgICBtZW1vcnktPmZyZWUgICAgPSBmdF9mcmVlOwojaWZkZWYgRlRfREVCVUdfTUVNT1JZCiAgICAgICAgZnRfbWVtX2RlYnVnX2luaXQoIG1lbW9yeSApOwojZW5kaWYKICAgICAgfQogICAgfQoKICAgIHJldHVybiBtZW1vcnk7CiAgfQoKCiAgLyogZG9jdW1lbnRhdGlvbiBpcyBpbiBmdG9ianMuaCAqLwoKICBGVF9CQVNFX0RFRiggdm9pZCApCiAgRlRfRG9uZV9NZW1vcnkoIEZUX01lbW9yeSAgbWVtb3J5ICkKICB7CiNpZmRlZiBGVF9ERUJVR19NRU1PUlkKICAgIGZ0X21lbV9kZWJ1Z19kb25lKCBtZW1vcnkgKTsKI2VuZGlmCgogICAgRGVsZXRlUG9vbCggbWVtb3J5LT51c2VyICk7CiAgICBGcmVlVmVjKCBtZW1vcnkgKTsKICB9CgovKgpMb2NhbCBWYXJpYWJsZXM6CmNvZGluZzogbGF0aW4tMQpFbmQ6CiovCi8qIEVORCAqLwo=