LyoKICogKEMpIENvcHlyaWdodCAyMDAyCiAqIERhbmllbCBFbmdzdHL2bSwgT21pY3JvbiBDZXRpIEFCLCBkYW5pZWxAb21pY3Jvbi5zZS4KICoKICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKICogcHJvamVjdC4KICoKICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwogKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgogKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKICogTUEgMDIxMTEtMTMwNyBVU0EKICovCgpPVVRQVVRfRk9STUFUKCJlbGYzMi1pMzg2IiwgImVsZjMyLWkzODYiLCAiZWxmMzItaTM4NiIpCk9VVFBVVF9BUkNIKGkzODYpCkVOVFJZKF9zdGFydCkKClNFQ1RJT05TCnsJCgkuID0gMHgzODdjMDAwMDsgICAgICAgICAgICAgICAgICAgICAvKiBXaGVyZSBib290Y29kZSBpbiB0aGUgZmxhc2ggaXMgbWFwcGVkICovCgkudGV4dCAgOiB7ICooLnRleHQpOyB9CgkKICAgICAgICAuID0gQUxJR04oNCk7CiAgICAgICAgLnJvZGF0YSA6IHsgKigucm9kYXRhKSB9CgogICAgICAgIC4gPSAweDQwMDAwMDsgCSAgICAgICAgICAgICAgICAgICAgLyogUmFtIGRhdGEgc2VnbWVudCB0byB1c2UgKi8KCV9pMzg2Ym9vdF9yb21kYXRhX2Rlc3QgPSBBQlNPTFVURSguKTsKICAgICAgICAuZGF0YSA6IEFUICggTE9BREFERFIoLnJvZGF0YSkgKyBTSVpFT0YoLnJvZGF0YSkgKSB7ICooLmRhdGEpIH0KCV9pMzg2Ym9vdF9yb21kYXRhX3N0YXJ0ID0gTE9BREFERFIoLmRhdGEpOyAJCgogICAgICAgIC4gPSBBTElHTig0KTsKICAgICAgICAuZ290IDogQVQgKCBMT0FEQUREUiguZGF0YSkgKyBTSVpFT0YoLmRhdGEpICkgeyAqKC5nb3QpIH0KCV9pMzg2Ym9vdF9yb21kYXRhX3NpemUgPSBTSVpFT0YoLmRhdGEpICsgU0laRU9GKC5nb3QpOyAJCgoKICAgICAgICAuID0gQUxJR04oNCk7CglfaTM4NmJvb3RfYnNzX3N0YXJ0ID0gQUJTT0xVVEUoLik7CiAgICAgICAgLmJzcyA6IHsgKiguYnNzKSB9CQoJX2kzODZib290X2Jzc19zaXplID0gU0laRU9GKC5ic3MpOwoJCgkKCS8qIDE2Yml0IHJlYWxtb2RlIHRyYW1wb2xpbmUgY29kZSAqLwoJLnJlYWxtb2RlIDB4N2MwIDogQVQgKCBMT0FEQUREUiguZ290KSArIFNJWkVPRiguZ290KSApIHsgKigucmVhbG1vZGUpIH0KICAgIAoJX2kzODZib290X3JlYWxtb2RlID0gTE9BREFERFIoLnJlYWxtb2RlKTsKCV9pMzg2Ym9vdF9yZWFsbW9kZV9zaXplID0gU0laRU9GKC5yZWFsbW9kZSk7CgkKCS8qIDE2Yml0IEJJT1MgZW11bGF0aW9uIGNvZGUgKGp1c3QgZW5vdWdoIHRvIGJvb3QgTGludXgpICovCgkuYmlvcyAwIDogQVQgKCBMT0FEQUREUigucmVhbG1vZGUpICsgU0laRU9GKC5yZWFsbW9kZSkgKSB7ICooLmJpb3MpIH0KICAgIAoJX2kzODZib290X2Jpb3MgPSBMT0FEQUREUiguYmlvcyk7CglfaTM4NmJvb3RfYmlvc19zaXplID0gU0laRU9GKC5iaW9zKTsKCQoKCS8qIFRoZSBsb2FkIGFkZHJlc3NlcyBiZWxvdyBhc3N1bWVzIHRoYXQgdGhlIGZsYXNoCgkgKiB3aWxsIGJlIG1hcHBlZCBzbyB0aGF0IDB4Mzg3ZjAwMDAgPT0gMHhmZmZmMDAwMAoJICogYXQgcmVzZXQgdGltZQoJICoKCSAqIFRoZSBmZTAwIGFuZCBmZjAwIG9mZnNldHMgb2YgdGhlIHN0YXJ0MzIgYW5kIHN0YXJ0MTYgCgkgKiBzZWdtZW50cyBhcmUgYXJiaXRyYXJ5LCB0aGUganVzdCBoYXZlIHRvIGJlIG1hcHBlZAoJICogYXQgcmVzZXQgYW5kIHRoZSBjb2RlIGhhdmUgdG8gZml0LgoJICogVGhlIGZmZjAgb2Zmc2V0IG9mIHJlc2V0IGlzIGltcG9ydGFudCwgaG93ZXZlci4KCSAqLwoJIAoJIAoJLiA9IDB4ZmZmZmZlMDA7Cgkuc3RhcnQzMiA6IEFUICgweDM4N2ZmZTAwKSB7ICooLnN0YXJ0MzIpOyB9IAoJCgkuID0gMHhmZjAwOwoJLnN0YXJ0MTYgOiBBVCAoMHgzODdmZmYwMCkgeyAqKC5zdGFydDE2KTsgfSAgCgkKCS4gPSAweGZmZjA7CgkucmVzZXQgOiBBVCAoMHgzODdmZmZmMCkgeyAqKC5yZXNldCk7IH0gIAoJX2kzODZib290X2VuZCA9IChMT0FEQUREUigucmVzZXQpICsgU0laRU9GKC5yZXNldCkgKTsKfQo=