LyoKICogKEMpIENvcHlyaWdodCAyMDAyCiAqIERhbmllbCBFbmdzdHL2bSwgT21pY3JvbiBDZXRpIEFCLCBkYW5pZWxAb21pY3Jvbi5zZS4KICoKICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKICogcHJvamVjdC4KICoKICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwogKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgogKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKICogTUEgMDIxMTEtMTMwNyBVU0EKICovCgpPVVRQVVRfRk9STUFUKCJlbGYzMi1pMzg2IiwgImVsZjMyLWkzODYiLCAiZWxmMzItaTM4NiIpCk9VVFBVVF9BUkNIKGkzODYpCkVOVFJZKF9zdGFydCkKClNFQ1RJT05TCnsKCS4gPSBDT05GSUdfU1lTX1RFWFRfQkFTRTsJLyogTG9jYXRpb24gb2YgYm9vdGNvZGUgaW4gZmxhc2ggKi8KCV9fdGV4dF9zdGFydCA9IC47CgkudGV4dCAgOiB7ICooLnRleHQqKTsgfQoKCS4gPSBBTElHTig0KTsKCV9fdV9ib290X2NtZF9zdGFydCA9IC47CgkudV9ib290X2NtZCA6IHsgKigudV9ib290X2NtZCkgfQoJLiA9IEFMSUdOKDQpOwoJX191X2Jvb3RfY21kX2VuZCA9IC47CgoJLiA9IEFMSUdOKDQpOwoJLnJvZGF0YSA6IHsgKihTT1JUX0JZX0FMSUdOTUVOVChTT1JUX0JZX05BTUUoLnJvZGF0YSopKSkgfQoKCS4gPSBBTElHTig0KTsKCS5kYXRhIDogeyAqKC5kYXRhKikgfQoKCS4gPSBBTElHTig0KTsKCS5keW5zeW0gOiB7ICooLmR5bnN5bSopIH0KCgkuID0gQUxJR04oNCk7CgkuaGFzaCA6IHsgKiguaGFzaCopIH0KCgkuID0gQUxJR04oNCk7CgkuZ290IDogeyAqKC5nb3QqKSB9CgoJLiA9IEFMSUdOKDQpOwoJX19kYXRhX2VuZCA9IC47CgoJLiA9IEFMSUdOKDQpOwoJX19ic3Nfc3RhcnQgPSBBQlNPTFVURSguKTsKCS5ic3MgKE5PTE9BRCkgOiB7ICooLmJzcykgfQoJLiA9IEFMSUdOKDQpOwoJX19ic3NfZW5kID0gQUJTT0xVVEUoLik7CgoJLiA9IEFMSUdOKDQpOwoJX19yZWxfZHluX3N0YXJ0ID0gLjsKCS5yZWwuZHluIDogeyAqKC5yZWwuZHluKSB9CglfX3JlbF9keW5fZW5kID0gLjsKCgkvRElTQ0FSRC8gOiB7ICooLmR5bnN0ciopIH0KCS9ESVNDQVJELyA6IHsgKiguZHluYW1pYyopIH0KCS9ESVNDQVJELyA6IHsgKigucGx0KikgfQoJL0RJU0NBUkQvIDogeyAqKC5pbnRlcnAqKSB9CgkvRElTQ0FSRC8gOiB7ICooLmdudSopIH0KCgkvKiAxNmJpdCByZWFsbW9kZSB0cmFtcG9saW5lIGNvZGUgKi8KCS5yZWFsbW9kZSBSRUFMTU9ERV9CQVNFIDogQVQgKCBMT0FEQUREUigucmVsLmR5bikgKyBTSVpFT0YoLnJlbC5keW4pICkgeyBLRUVQKCooLnJlYWxtb2RlKSkgfQoKCV9fcmVhbG1vZGVfc3RhcnQgPSBMT0FEQUREUigucmVhbG1vZGUpOwoJX19yZWFsbW9kZV9zaXplID0gU0laRU9GKC5yZWFsbW9kZSk7CgoJLyogMTZiaXQgQklPUyBlbXVsYXRpb24gY29kZSAoanVzdCBlbm91Z2ggdG8gYm9vdCBMaW51eCkgKi8KCS5iaW9zIDAgOiBBVCAoIExPQURBRERSKC5yZWFsbW9kZSkgKyBTSVpFT0YoLnJlYWxtb2RlKSApIHsgS0VFUCgqKC5iaW9zKSkgfQoKCV9fYmlvc19zdGFydCA9IExPQURBRERSKC5iaW9zKTsKCV9fYmlvc19zaXplID0gU0laRU9GKC5iaW9zKTsKCgkvKgoJICogVGhlIGZvbGxvd2luZyBleHByZXNzaW9ucyBwbGFjZSB0aGUgMTYtYml0IFJlYWwtTW9kZSBjb2RlIGFuZAoJICogUmVzZXQgVmVjdG9yIGF0IHRoZSBlbmQgb2YgdGhlIEZsYXNoIFJPTQoJICovCgkuID0gU1RBUlRfMTY7Cgkuc3RhcnQxNiA6IEFUIChDT05GSUdfU1lTX1RFWFRfQkFTRSArIChGTEFTSF9TSVpFIC0gUkVTRVRfU0VHX1NJWkUgKyBTVEFSVF8xNikpIHsgS0VFUCgqKC5zdGFydDE2KSk7IH0KCgkuID0gUkVTRVRfVkVDX0xPQzsKCS5yZXNldHZlYyA6IEFUIChDT05GSUdfU1lTX1RFWFRfQkFTRSArIChGTEFTSF9TSVpFIC0gUkVTRVRfU0VHX1NJWkUgKyBSRVNFVF9WRUNfTE9DKSkgeyBLRUVQKCooLnJlc2V0dmVjKSk7IH0KfQo=