LyoKICogKEMpIENvcHlyaWdodCAyMDAyCiAqIERhbmllbCBFbmdzdHL2bSwgT21pY3JvbiBDZXRpIEFCLCBkYW5pZWxAb21pY3Jvbi5zZQogKiAKICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKICogcHJvamVjdC4KICoKICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwogKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgogKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKICogTUEgMDIxMTEtMTMwNyBVU0EKICovCgoKLyogMzJiaXQgLT4gMTZiaXQgLT4gMzJiaXQgbW9kZSBzd2l0Y2ggY29kZSAqLwoKLyoKICogU3RhY2sgZnJhbWUgYXQgMHhlMDAKICogICAgICBlMDAgZWJ4OwogKgllMDQgZWN4OwogKgllMDggZWR4OwogKgllMGMgZXNpOwogKgllMTAgZWRpOwogKgllMTQgZWJwOyAKICoJZTE4IGVheDsKICoJZTFjIGRzOyAgCiAqCWUyMCBlczsKICoJZTI0IGZzOyAgCiAqCWUyOCBnczsKICoJZTJjIG9yaWdfZWF4OwogKgllMzAgZWlwOwogKgllMzQgY3M7CiAqCWUzOCBlZmxhZ3M7CiAqCWUzYyBlc3A7CiAqCWU0MCBzczsKICovCgojZGVmaW5lIGEzMgkJLmJ5dGUgMHg2NzsJCS8qIGFkZHJlc3Mgc2l6ZSBwcmVmaXggMzIgKi8KI2RlZmluZSBvMzIJCS5ieXRlIDB4NjY7CQkvKiBvcGVyYW5kIHNpemUgcHJlZml4IDMyICovIAoKLnNlY3Rpb24gLnJlYWxtb2RlLCAiYXgiCi5jb2RlMTYKCQkJCQkJLyogMTZiaXQgcHJvdGVjdGVkIG1vZGUgY29kZSBoZXJlICovCi5nbG9ibCByZWFsbW9kZV9lbnRlcgpyZWFsbW9kZV9lbnRlcjoKbzMyCXB1c2hhCm8zMglwdXNoZgoJY2xpCiAgICAgICAgc2lkdCAgIAlzYXZlZF9pZHQKICAgICAgICBzZ2R0ICAgIHNhdmVkX2dkdAogICAgICAgIG1vdmwgICAgJWVzcCwgJWVheAogICAgICAgIG1vdmwgICAgJWVheCwgc2F2ZWRfcHJvdGVjdGVkX21vZGVfZXNwCgkKCW1vdmwJJDB4MTAsICVlYXgKCW1vdmwgICAgJWVheCwgJWVzcAoJbW92dwkkMHgyOCwgJWF4Cgltb3Z3CSVheCwgJWRzCgltb3Z3CSVheCwgJWVzCgltb3Z3CSVheCwgJWZzCgltb3Z3CSVheCwgJWdzCgoJbGlkdAlyZWFsbW9kZV9pZHRfcHRyCgltb3ZsCSVjcjAsICVlYXggICAgICAgICAgICAgICAgCS8qIEdvIGJhY2sgaW50byByZWFsIG1vZGUgYnkgKi8KCWFuZGwJJDB4N2ZmZmZmZmUsICVlYXggICAgICAgICAJLyogY2xlYXJpbmcgUEUgdG8gMCAqLwoJbW92bAklZWF4LCAlY3IwCglsam1wCSQweDAsJGRvX3JlYWxtb2RlICAgICAgICAgICAgIAkvKiBzd2l0Y2ggdG8gcmVhbCBtb2RlICovCgkJCQkJCQpkb19yZWFsbW9kZToJCQkJCS8qIHJlYWxtb2RlIGNvZGUgZnJvbSBoZXJlICovIAoJbW92dwklY3MsJWF4Cgltb3Z3CSVheCwlZHMKCW1vdncJJWF4LCVlcwoJbW92dwklYXgsJWZzCgltb3Z3CSVheCwlZ3MKCQoJCQkJCQkvKiBjcmVhdGUgYSB0ZW1wb3Jhcnkgc3RhY2sgKi8KCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKCW1vdncJJDB4YzAsICVheCAgICAgICAgICAgICAKCW1vdncJJWF4LCAlc3MgICAgICAgICAgICAgICAgCgltb3Z3CSQweDIwMCwgJWF4ICAgICAgICAgICAKCW1vdncJJWF4LCAlc3AgCgkKCXBvcGwJJWVieAoJcG9wbAklZWN4Cglwb3BsCSVlZHgKCXBvcGwJJWVzaQoJcG9wbAklZWRpCglwb3BsCSVlYnAKCXBvcGwJJWVheAoJbW92bAklZWF4LCB0ZW1wX2VheAoJcG9wbAklZWF4Cgltb3Z3CSVheCwgJWRzCglwb3BsCSVlYXgKCW1vdncJJWF4LCAlZXMKCXBvcGwJJWVheAoJbW92dwklYXgsICVmcwoJcG9wbAklZWF4Cgltb3Z3CSVheCwgJWdzCglwb3BsCSVlYXgJCQkJLyogb3JpZ19lYXggKi8KCXBvcGwJJWVheApjcwltb3Z3CSVheCwgdGVtcF9pcAoJcG9wbAklZWF4CmNzCW1vdncJJWF4LCB0ZW1wX2NzCm8zMglwb3BmCglwb3BsCSVlYXgKCXBvcHcJJXNzCgltb3ZsCSVlYXgsICVlc3AKY3MJbW92bAl0ZW1wX2VheCwgJWVheAoJd2JpbnZkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNlbGYtbW9kaWZ5aW5nIGNvZGUsCgkJCQkJCSAqIGJldHRlciBmbHVzaCB0aGUgY2FjaGUgKi8KCQoJLmJ5dGUJMHg5YQkJCQkvKiBsY2FsbCAqLwp0ZW1wX2lwOgoJLndvcmQJMAkgICAgIAkJCS8qIG5ldyBpcCAqLwp0ZW1wX2NzOgkKCS53b3JkICAgMAkJCQkvKiBuZXcgY3MgKi8KcmVhbG1vZGVfcmV0OgoJCQkJCQkvKiBzYXZlIGVheCwgZXNwIGFuZCBzcyAqLwpjcwltb3ZsCSVlYXgsIHNhdmVkX2VheAoJbW92bAklZXNwLCAlZWF4CmNzCW1vdmwJJWVheCwgc2F2ZWRfZXNwCgltb3Z3ICAgICVzcywgJWF4CmNzCW1vdncJJWF4LCBzYXZlZF9zcwoJCgkvKiByZXN0b3JlIHRoZSBzdGFjaywgbm90ZSB0aGF0IHdlIHNldCBzcCB0byAweDI0NDsKCSAqIHB0X3JlZ3MgaXMgMHg0NCBieXRlcyBsb25nIGFuZCB3ZSBwdXNoIHRoZSBzdHJ1Y3R1cmUKCSAqIGJhY2t3YXJkcyBvbiB0byB0aGUgc3RhY2ssIGJvdHRvbSBmaXJzdCAqLwoJIAoJbW92dwkkMHhjMCwgJWF4ICAgICAgICAgICAgIAoJbW92dwklYXgsICVzcyAgICAgICAgICAgICAgICAKCW1vdncJJDB4MjQ0LCAlYXggICAgICAgICAgIAoJbW92dwklYXgsICVzcCAKCQoJeG9ybAklZWF4LCVlYXgKY3MJbW92dwlzYXZlZF9zcywgJWF4CglwdXNobAklZWF4CmNzCW1vdmwJc2F2ZWRfZXNwLCAlZWF4CglwdXNobAklZWF4Cm8zMglwdXNoZgoJeG9ybAklZWF4LCVlYXgKY3MJbW92dwl0ZW1wX2NzLCAlYXgKCXB1c2hsCSVlYXgKY3MJbW92dwl0ZW1wX2lwLCAlYXgKCXB1c2hsCSVlYXgKCXB1c2hsCSQwCgltb3Z3CSVncywgJWF4CglwdXNobAklZWF4Cgltb3Z3CSVmcywgJWF4CglwdXNobAklZWF4Cgltb3Z3CSVlcywgJWF4CglwdXNobAklZWF4Cgltb3Z3CSVkcywgJWF4CglwdXNobAklZWF4Cgltb3ZsCXNhdmVkX2VheCwgJWVheAoJcHVzaGwJJWVheAoJcHVzaGwJJWVicAoJcHVzaGwJJWVkaQoJcHVzaGwJJWVzaQoJcHVzaGwJJWVkeAoJcHVzaGwJJWVjeAoJcHVzaGwJJWVieAoKbzMyIGNzCWxpZHQJc2F2ZWRfaWR0Cm8zMiBjcwlsZ2R0ICAgIHNhdmVkX2dkdAkJCS8qIFNldCBHRFRSICovCgogICAgICAgIG1vdmwgICAgJWNyMCwgJWVheCAgICAgICAgICAgICAgCS8qIEdvIGJhY2sgaW50byBwcm90ZWN0ZWQgbW9kZSAqLwogICAgICAgIG9ybCAgICAgJDEsJWVheCAgICAgICAgICAgICAgICAgCS8qIHJlc2V0IFBFIHRvIDEgKi8KICAgICAgICBtb3ZsICAgICVlYXgsICVjcjAgICAgICAgICAgICAgICAKICAgICAgICBqbXAgICAgIG5leHRfbGluZSAgICAgICAgICAgICAgIAkvKiBmbHVzaCBwcmVmZXRjaCBxdWV1ZSAqLwpuZXh0X2xpbmU6ICAgIAogICAgICAgIG1vdncJJHJldHVybl9wdHIsICVheCAgICAgICAgICAKICAgICAgICBtb3Z3ICAgICVheCwlYnAKbzMyIGNzCWxqbXAJKiglYnApCgouY29kZTMyCnByb3RlY3RlZF9tb2RlOgogICAgICAgIG1vdmwgICAgJDB4MTgsJWVheCAgICAgICAgIAkJLyogcmVsb2FkIEdEVFszXSAqLwogICAgICAgIG1vdncgICAgJWF4LCVmcyAgICAgICAgICAgICAgICAgCS8qIHJlc2V0IEZTICovCgltb3Z3CSVheCwlZHMgICAgICAgICAgICAgICAgCQkvKiByZXNldCBEUyAqLwogICAgICAgIG1vdncgICAgJWF4LCVncyAgICAgICAgICAgICAgICAgCS8qIHJlc2V0IEdTICovCiAgICAgICAgbW92dyAgICAlYXgsJWVzICAgICAgICAgICAgICAgICAJLyogcmVzZXQgRVMgKi8KICAgICAgICBtb3Z3ICAgICVheCwlc3MgICAgICAgICAgICAgICAgIAkvKiByZXNldCBTUyAqLwogICAgICAgIG1vdmwgICAgc2F2ZWRfcHJvdGVjdGVkX21vZGVfZXNwLCAlZWF4Cgltb3ZsCSVlYXgsICVlc3AKCXBvcGYKCXBvcGEKICAgICAgICByZXQKCnRlbXBfZWF4OgoJLmxvbmcJMAoKc2F2ZWRfc3M6Cgkud29yZCAgIDAKc2F2ZWRfZXNwOgoJLmxvbmcJMApzYXZlZF9lYXg6CgkubG9uZwkwCgkKcmVhbG1vZGVfaWR0X3B0cjoKCS53b3JkCTB4NDAwCQkJICAgICAgIAoJLndvcmQJMHgwLCAweDAJCQoJCnNhdmVkX2dkdDogIAogIAkud29yZCAJMCwgMCwgMCwgMApzYXZlZF9pZHQ6CiAgCS53b3JkIAkwLCAwLCAwLCAwCgpzYXZlZF9wcm90ZWN0ZWRfbW9kZV9lc3A6CgkubG9uZyAJMAoJCnJldHVybl9wdHI6CgkubG9uZwlwcm90ZWN0ZWRfbW9kZQoJLndvcmQJMHgxMAo=