LyoKICogKEMpIENvcHlyaWdodCAyMDAyCiAqIERhbmllbCBFbmdzdHL2bSwgT21pY3JvbiBDZXRpIEFCLCBkYW5pZWxAb21pY3Jvbi5zZQogKiAKICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKICogcHJvamVjdC4KICoKICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwogKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgogKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKICogTUEgMDIxMTEtMTMwNyBVU0EKICovCgoKLyogMzJiaXQgLT4gMTZiaXQgLT4gMzJiaXQgbW9kZSBzd2l0Y2ggY29kZSAqLwoKLyoKICogU3RhY2sgZnJhbWUgYXQgMHhlMDAKICogICAgICBlMDAgZWJ4OwogKgllMDQgZWN4OwogKgllMDggZWR4OwogKgllMGMgZXNpOwogKgllMTAgZWRpOwogKgllMTQgZWJwOyAKICoJZTE4IGVheDsKICoJZTFjIGRzOyAgCiAqCWUyMCBlczsKICoJZTI0IGZzOyAgCiAqCWUyOCBnczsKICoJZTJjIG9yaWdfZWF4OwogKgllMzAgZWlwOwogKgllMzQgY3M7CiAqCWUzOCBlZmxhZ3M7CiAqCWUzYyBlc3A7CiAqCWU0MCBzczsKICovCgojZGVmaW5lIGEzMgkJLmJ5dGUgMHg2NzsJCS8qIGFkZHJlc3Mgc2l6ZSBwcmVmaXggMzIgKi8KI2RlZmluZSBvMzIJCS5ieXRlIDB4NjY7CQkvKiBvcGVyYW5kIHNpemUgcHJlZml4IDMyICovIAoKLnNlY3Rpb24gLnJlYWxtb2RlLCAiYXgiCi5jb2RlMTYKCgkJCQkJCS8qIDE2Yml0IHByb3RlY3RlZCBtb2RlIGNvZGUgaGVyZSAqLwouZ2xvYmwgcmVhbG1vZGVfZW50ZXIKcmVhbG1vZGVfZW50ZXI6Cm8zMglwdXNoYQpvMzIJcHVzaGYKCWNsaQogICAgICAgIHNpZHQgICAJc2F2ZWRfaWR0CiAgICAgICAgc2dkdCAgICBzYXZlZF9nZHQKICAgICAgICBtb3ZsICAgICVlc3AsICVlYXgKICAgICAgICBtb3ZsICAgICVlYXgsIHNhdmVkX3Byb3RlY3RlZF9tb2RlX2VzcAoJCgltb3ZsCSQweDEwLCAlZWF4Cgltb3ZsICAgICVlYXgsICVlc3AKCW1vdncJJDB4MjgsICVheAoJbW92dwklYXgsICVkcwoJbW92dwklYXgsICVlcwoJbW92dwklYXgsICVmcwoJbW92dwklYXgsICVncwoKCWxpZHQJcmVhbG1vZGVfaWR0X3B0cgoJbW92bAklY3IwLCAlZWF4ICAgICAgICAgICAgICAgIAkvKiBHbyBiYWNrIGludG8gcmVhbCBtb2RlIGJ5ICovCglhbmRsCSQweDdmZmZmZmZlLCAlZWF4ICAgICAgICAgCS8qIGNsZWFyaW5nIFBFIHRvIDAgKi8KCW1vdmwJJWVheCwgJWNyMAoJbGptcAkkMHgwLCRkb19yZWFsbW9kZSAgICAgICAgICAgICAJLyogc3dpdGNoIHRvIHJlYWwgbW9kZSAqLwoJCQkJCQkKZG9fcmVhbG1vZGU6CQkJCQkvKiByZWFsbW9kZSBjb2RlIGZyb20gaGVyZSAqLyAKCW1vdncJJWNzLCVheAoJbW92dwklYXgsJWRzCgltb3Z3CSVheCwlZXMKCW1vdncJJWF4LCVmcwoJbW92dwklYXgsJWdzCgkKCQkJCQkJLyogY3JlYXRlIGEgdGVtcG9yYXJ5IHN0YWNrICovCgkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCgltb3Z3CSQweGMwLCAlYXggICAgICAgICAgICAgCgltb3Z3CSVheCwgJXNzICAgICAgICAgICAgICAgIAoJbW92dwkkMHgyMDAsICVheCAgICAgICAgICAgCgltb3Z3CSVheCwgJXNwIAoJCglwb3BsCSVlYngKCXBvcGwJJWVjeAoJcG9wbAklZWR4Cglwb3BsCSVlc2kKCXBvcGwJJWVkaQoJcG9wbAklZWJwCglwb3BsCSVlYXgKCW1vdmwJJWVheCwgdGVtcF9lYXgKCXBvcGwJJWVheAoJbW92dwklYXgsICVkcwoJcG9wbAklZWF4Cgltb3Z3CSVheCwgJWVzCglwb3BsCSVlYXgKCW1vdncJJWF4LCAlZnMKCXBvcGwJJWVheAoJbW92dwklYXgsICVncwoJcG9wbAklZWF4CQkJCS8qIG9yaWdfZWF4ICovCglwb3BsCSVlYXgKY3MJbW92dwklYXgsIHRlbXBfaXAKCXBvcGwJJWVheApjcwltb3Z3CSVheCwgdGVtcF9jcwpvMzIJcG9wZgoJcG9wbAklZWF4Cglwb3B3CSVzcwoJbW92bAklZWF4LCAlZXNwCmNzCW1vdmwJdGVtcF9lYXgsICVlYXgKCXdiaW52ZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzZWxmLW1vZGlmeWluZyBjb2RlLAoJCQkJCQkgKiBiZXR0ZXIgZmx1c2ggdGhlIGNhY2hlICovCgkKCS5ieXRlCTB4OWEJCQkJLyogbGNhbGwgKi8KdGVtcF9pcDoKCS53b3JkCTAJICAgICAJCQkvKiBuZXcgaXAgKi8KdGVtcF9jczoJCgkud29yZCAgIDAJCQkJLyogbmV3IGNzICovCnJlYWxtb2RlX3JldDoKCQkJCQkJLyogc2F2ZSBlYXgsIGVzcCBhbmQgc3MgKi8KY3MJbW92bAklZWF4LCBzYXZlZF9lYXgKCW1vdmwJJWVzcCwgJWVheApjcwltb3ZsCSVlYXgsIHNhdmVkX2VzcAoJbW92dyAgICAlc3MsICVheApjcwltb3Z3CSVheCwgc2F2ZWRfc3MKCQoJLyogcmVzdG9yZSB0aGUgc3RhY2ssIG5vdGUgdGhhdCB3ZSBzZXQgc3AgdG8gMHgyNDQ7CgkgKiBwdF9yZWdzIGlzIDB4NDQgYnl0ZXMgbG9uZyBhbmQgd2UgcHVzaCB0aGUgc3RydWN0dXJlCgkgKiBiYWNrd2FyZHMgb24gdG8gdGhlIHN0YWNrLCBib3R0b20gZmlyc3QgKi8KCSAKCW1vdncJJDB4YzAsICVheCAgICAgICAgICAgICAKCW1vdncJJWF4LCAlc3MgICAgICAgICAgICAgICAgCgltb3Z3CSQweDI0NCwgJWF4ICAgICAgICAgICAKCW1vdncJJWF4LCAlc3AgCgkKCXhvcmwJJWVheCwlZWF4CmNzCW1vdncJc2F2ZWRfc3MsICVheAoJcHVzaGwJJWVheApjcwltb3ZsCXNhdmVkX2VzcCwgJWVheAoJcHVzaGwJJWVheApvMzIJcHVzaGYKCXhvcmwJJWVheCwlZWF4CmNzCW1vdncJdGVtcF9jcywgJWF4CglwdXNobAklZWF4CmNzCW1vdncJdGVtcF9pcCwgJWF4CglwdXNobAklZWF4CglwdXNobAkkMAoJbW92dwklZ3MsICVheAoJcHVzaGwJJWVheAoJbW92dwklZnMsICVheAoJcHVzaGwJJWVheAoJbW92dwklZXMsICVheAoJcHVzaGwJJWVheAoJbW92dwklZHMsICVheAoJcHVzaGwJJWVheAoJbW92bAlzYXZlZF9lYXgsICVlYXgKCXB1c2hsCSVlYXgKCXB1c2hsCSVlYnAKCXB1c2hsCSVlZGkKCXB1c2hsCSVlc2kKCXB1c2hsCSVlZHgKCXB1c2hsCSVlY3gKCXB1c2hsCSVlYngKCm8zMiBjcwlsaWR0CXNhdmVkX2lkdApvMzIgY3MJbGdkdCAgICBzYXZlZF9nZHQJCQkvKiBTZXQgR0RUUiAqLwoKICAgICAgICBtb3ZsICAgICVjcjAsICVlYXggICAgICAgICAgICAgIAkvKiBHbyBiYWNrIGludG8gcHJvdGVjdGVkIG1vZGUgKi8KICAgICAgICBvcmwgICAgICQxLCVlYXggICAgICAgICAgICAgICAgIAkvKiByZXNldCBQRSB0byAxICovCiAgICAgICAgbW92bCAgICAlZWF4LCAlY3IwICAgICAgICAgICAgICAgCiAgICAgICAgam1wICAgICBuZXh0X2xpbmUgICAgICAgICAgICAgICAJLyogZmx1c2ggcHJlZmV0Y2ggcXVldWUgKi8KbmV4dF9saW5lOiAgICAKICAgICAgICBtb3Z3CSRyZXR1cm5fcHRyLCAlYXggICAgICAgICAgCiAgICAgICAgbW92dyAgICAlYXgsJWJwCm8zMiBjcwlsam1wCSooJWJwKQoKLmNvZGUzMgpwcm90ZWN0ZWRfbW9kZToKICAgICAgICBtb3ZsICAgICQweDE4LCVlYXggICAgICAgICAJCS8qIHJlbG9hZCBHRFRbM10gKi8KICAgICAgICBtb3Z3ICAgICVheCwlZnMgICAgICAgICAgICAgICAgIAkvKiByZXNldCBGUyAqLwoJbW92dwklYXgsJWRzICAgICAgICAgICAgICAgIAkJLyogcmVzZXQgRFMgKi8KICAgICAgICBtb3Z3ICAgICVheCwlZ3MgICAgICAgICAgICAgICAgIAkvKiByZXNldCBHUyAqLwogICAgICAgIG1vdncgICAgJWF4LCVlcyAgICAgICAgICAgICAgICAgCS8qIHJlc2V0IEVTICovCiAgICAgICAgbW92dyAgICAlYXgsJXNzICAgICAgICAgICAgICAgICAJLyogcmVzZXQgU1MgKi8KICAgICAgICBtb3ZsICAgIHNhdmVkX3Byb3RlY3RlZF9tb2RlX2VzcCwgJWVheAoJbW92bAklZWF4LCAlZXNwCglwb3BmCglwb3BhCiAgICAgICAgcmV0Cgp0ZW1wX2VheDoKCS5sb25nCTAKCnNhdmVkX3NzOgoJLndvcmQgICAwCnNhdmVkX2VzcDoKCS5sb25nCTAKc2F2ZWRfZWF4OgoJLmxvbmcJMAoJCnJlYWxtb2RlX2lkdF9wdHI6Cgkud29yZAkweDQwMAkJCSAgICAgICAKCS53b3JkCTB4MCwgMHgwCQkKCQpzYXZlZF9nZHQ6ICAKICAJLndvcmQgCTAsIDAsIDAsIDAKc2F2ZWRfaWR0OgogIAkud29yZCAJMCwgMCwgMCwgMAoKc2F2ZWRfcHJvdGVjdGVkX21vZGVfZXNwOgoJLmxvbmcgCTAKCQpyZXR1cm5fcHRyOgoJLmxvbmcJcHJvdGVjdGVkX21vZGUKCS53b3JkCTB4MTAK