LyoKICogKEMpIENvcHlyaWdodCAyMDAyCiAqIERhbmllbCBFbmdzdHL2bSwgT21pY3JvbiBDZXRpIEFCLCBkYW5pZWxAb21pY3Jvbi5zZS4KICoKICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKICogcHJvamVjdC4KICoKICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwogKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgogKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKICogTUEgMDIxMTEtMTMwNyBVU0EKICovCgpPVVRQVVRfRk9STUFUKCJlbGYzMi1pMzg2IiwgImVsZjMyLWkzODYiLCAiZWxmMzItaTM4NiIpCk9VVFBVVF9BUkNIKGkzODYpCkVOVFJZKF9zdGFydCkKClNFQ1RJT05TCnsKCS4gPSAweDM4MDQwMDAwOwkJLyogTG9jYXRpb24gb2YgYm9vdGNvZGUgaW4gZmxhc2ggKi8KCS50ZXh0ICA6IHsgKigudGV4dCk7IH0KCgkuID0gQUxJR04oNCk7Cgkucm9kYXRhIDogeyAqKFNPUlRfQllfQUxJR05NRU5UKFNPUlRfQllfTkFNRSgucm9kYXRhKikpKSB9CgoJX2kzODZib290X3RleHRfc2l6ZSA9IFNJWkVPRigudGV4dCkgKyBTSVpFT0YoLnJvZGF0YSk7CgoJLiA9IDB4MDNGRjAwMDA7CQkvKiBSYW0gZGF0YSBzZWdtZW50IHRvIHVzZSAqLwoJX2kzODZib290X3JvbWRhdGFfZGVzdCA9IEFCU09MVVRFKC4pOwoJLmRhdGEgOiBBVCAoIExPQURBRERSKC5yb2RhdGEpICsgU0laRU9GKC5yb2RhdGEpICkgeyAqKC5kYXRhKSB9CglfaTM4NmJvb3Rfcm9tZGF0YV9zdGFydCA9IExPQURBRERSKC5kYXRhKTsKCgkuID0gQUxJR04oNCk7CgkuZ290IDogQVQgKCBMT0FEQUREUiguZGF0YSkgKyBTSVpFT0YoLmRhdGEpICkgeyAqKC5nb3QpIH0KCgkuID0gQUxJR04oNCk7CglfX3VfYm9vdF9jbWRfc3RhcnQgPSAuOwoJLnVfYm9vdF9jbWQgOiB7ICooLnVfYm9vdF9jbWQpIH0KCV9fdV9ib290X2NtZF9lbmQgPSAuOwoJX2kzODZib290X2NtZF9zdGFydCA9IExPQURBRERSKC51X2Jvb3RfY21kKTsKCglfaTM4NmJvb3Rfcm9tZGF0YV9zaXplID0gU0laRU9GKC5kYXRhKSArIFNJWkVPRiguZ290KSArIFNJWkVPRigudV9ib290X2NtZCk7CgoJLiA9IEFMSUdOKDQpOwoJX2kzODZib290X2Jzc19zdGFydCA9IEFCU09MVVRFKC4pOwoJLmJzcyAoTk9MT0FEKSA6IHsgKiguYnNzKSB9CglfaTM4NmJvb3RfYnNzX3NpemUgPSBTSVpFT0YoLmJzcyk7CgoJLyogMTZiaXQgcmVhbG1vZGUgdHJhbXBvbGluZSBjb2RlICovCgkucmVhbG1vZGUgMHg3YzAgOiBBVCAoIExPQURBRERSKC5nb3QpICsgU0laRU9GKC5nb3QpICsgU0laRU9GKC51X2Jvb3RfY21kKSkgeyAqKC5yZWFsbW9kZSkgfQoKCV9pMzg2Ym9vdF9yZWFsbW9kZSA9IExPQURBRERSKC5yZWFsbW9kZSk7CglfaTM4NmJvb3RfcmVhbG1vZGVfc2l6ZSA9IFNJWkVPRigucmVhbG1vZGUpOwoKCS8qIDE2Yml0IEJJT1MgZW11bGF0aW9uIGNvZGUgKGp1c3QgZW5vdWdoIHRvIGJvb3QgTGludXgpICovCgkuYmlvcyAwIDogQVQgKCBMT0FEQUREUigucmVhbG1vZGUpICsgU0laRU9GKC5yZWFsbW9kZSkgKSB7ICooLmJpb3MpIH0KCglfaTM4NmJvb3RfYmlvcyA9IExPQURBRERSKC5iaW9zKTsKCV9pMzg2Ym9vdF9iaW9zX3NpemUgPSBTSVpFT0YoLmJpb3MpOwoKCS8qIFRoZSBsb2FkIGFkZHJlc3NlcyBiZWxvdyBhc3N1bWVzIHRoYXQgdGhlIGZsYXNoCgkgKiB3aWxsIGJlIG1hcHBlZCBzbyB0aGF0IDB4Mzg3ZjAwMDAgPT0gMHhmZmZmMDAwMAoJICogYXQgcmVzZXQgdGltZQoJICoKCSAqIFRoZSBmZTAwIGFuZCBmZjAwIG9mZnNldHMgb2YgdGhlIHN0YXJ0MzIgYW5kIHN0YXJ0MTYKCSAqIHNlZ21lbnRzIGFyZSBhcmJpdHJhcnksIHRoZSBqdXN0IGhhdmUgdG8gYmUgbWFwcGVkCgkgKiBhdCByZXNldCBhbmQgdGhlIGNvZGUgaGF2ZSB0byBmaXQuCgkgKiBUaGUgZmZmMCBvZmZzZXQgb2YgcmVzZXR2ZWMgaXMgaW1wb3J0YW50LCBob3dldmVyLgoJICovCgoJLiA9IDB4ZmZmZmZlMDA7Cgkuc3RhcnQzMiA6IEFUICgweDM4MDdmZTAwKSB7ICooLnN0YXJ0MzIpOyB9CgoJLiA9IDB4ZjgwMDsKCS5zdGFydDE2IDogQVQgKDB4MzgwN2Y4MDApIHsgKiguc3RhcnQxNik7IH0KCgkuID0gMHhmZmYwOwoJLnJlc2V0dmVjIDogQVQgKDB4MzgwN2ZmZjApIHsgKigucmVzZXR2ZWMpOyB9CglfaTM4NmJvb3RfZW5kID0gKExPQURBRERSKC5yZXNldHZlYykgKyBTSVpFT0YoLnJlc2V0dmVjKSApOwp9Cg==