LyoKICogIFUtYm9vdCAtIGkzODYgU3RhcnR1cCBDb2RlCiAqCiAqICBDb3B5cmlnaHQgKGMpIDIwMDIJT21pY3JvbiBDZXRpIEFCLCBEYW5pZWwgRW5nc3Ry9m0gPGRlbmFpZWxAb21pY3Jvbi5zZT4KICoKICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKICogcHJvamVjdC4KICoKICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwogKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgogKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKICogTUEgMDIxMTEtMTMwNyBVU0EKICovCgoKI2luY2x1ZGUgPGNvbmZpZy5oPgojaW5jbHVkZSA8dmVyc2lvbi5oPgoKCi5zZWN0aW9uIC50ZXh0Ci5jb2RlMzIKLmdsb2JsIF9zdGFydAoudHlwZSBfc3RhcnQsIEBmdW5jdGlvbgouZ2xvYmwgX2kzODZib290X3N0YXJ0Cl9pMzg2Ym9vdF9zdGFydDoKX3N0YXJ0OgoJbW92bCAgICAkMHgxOCwlZWF4CS8qIExvYWQgb3VyIHNlZ2VtZW50IHJlZ2lzdGVzLCB0aGUKCQkJCSAqIGdkdCBoYXZlIGFscmVhZHkgYmVlbiBsb2FkZWQgYnkgc3RhcnQxNi5TICovCgltb3Z3ICAgICVheCwlZnMKCW1vdncJJWF4LCVkcwoJbW92dyAgICAlYXgsJWdzCgltb3Z3ICAgICVheCwlZXMKCW1vdncgICAgJWF4LCVzcwoKCS8qIFdlIGNhbGwgYSBmZXcgZnVuY3Rpb25zIGluIHRoZSBib2FyZCBzdXBwb3J0IHBhY2thZ2UKCSAqIHNpbmNlIHdlIGhhdmUgbm8gc3RhY2sgeWV0IHdlJ2xsIGhhdmUgdG8gdXNlICVlYnAKCSAqIHRvIHN0b3JlIHRoZSByZXR1cm4gYWRkcmVzcyAqLwoKCS8qIEVhcmx5IHBsYXRmb3JtIGluaXQgKHNldHVwIGdwaW8sIGV0YyApICovCgltb3YgICAgICRlYXJseV9ib2FyZF9pbml0X3JldCwgJWVicAoJam1wCWVhcmx5X2JvYXJkX2luaXQKZWFybHlfYm9hcmRfaW5pdF9yZXQ6CgoJLyogVGhlIF9fcG9ydDgwIGVudHJ5LXBvaW50IHNob3VsZCBiZSB1c2FiZSBieSBub3cgKi8KCS8qIHNvIHdlIHRyeSB0byBpbmRpY2F0ZSBwcm9ncmVzcyAqLwoJbW92dwkkMHgwMSwgJWF4Cgltb3ZsCSQucHJvZ3Jlc3MwLCAlZWJwCglqbXAJc2hvd19ib290X3Byb2dyZXNzCi5wcm9ncmVzczA6CgoJLyogc2l6ZSBtZW1vcnkgKi8KCW1vdgkkbWVtX2luaXRfcmV0LCAlZWJwCglqbXAgICAgIG1lbV9pbml0Cm1lbV9pbml0X3JldDoKCgkvKiBjaGVjayBhbW1vdW50IG9mIGNvbmZpZ3VyZWQgbWVtb3J5CgkgKiAod2UgbmVlZCBhdGxlYXN0IGJzcyBzdGFydCtic3Mgc2l6ZStzdGFjayBzaXplKSAqLwoJbW92bAkkX2kzODZib290X2Jzc19zdGFydCwgJWVjeCAgICAgICAgLyogQlNTIHN0YXJ0ICovCglhZGRsCSRfaTM4NmJvb3RfYnNzX3NpemUsICVlY3ggICAgICAgICAvKiBCU1Mgc2l6ZSAqLwoJYWRkbAkkQ0ZHX1NUQUNLX1NJWkUsICVlY3gKCWNtcGwJJWVjeCwgJWVheAoJamFlCW1lbV9vawoKCS8qIGluZGljYXRlIChsYWNrIG9mKSBwcm9ncmVzcyAqLwoJbW92dwkkMHg4MSwgJWF4Cgltb3ZsCSQucHJvZ3Jlc3MwYSwgJWVicAoJam1wCXNob3dfYm9vdF9wcm9ncmVzcwoucHJvZ3Jlc3MwYToKCWptcAlkaWUKbWVtX29rOgoKCS8qIGluZGljYXRlIHByb2dyZXNzICovCgltb3Z3CSQweDAyLCAlYXgKCW1vdmwJJC5wcm9ncmVzczEsICVlYnAKCWptcAlzaG93X2Jvb3RfcHJvZ3Jlc3MKLnByb2dyZXNzMToKCgkvKiBjcmVhdGUgYSBzdGFjayBhZnRlciB0aGUgYnNzICovCgltb3ZsICAgICRfaTM4NmJvb3RfYnNzX3N0YXJ0LCAlZWF4CglhZGRsCSRfaTM4NmJvb3RfYnNzX3NpemUsICVlYXgKCWFkZGwJJENGR19TVEFDS19TSVpFLCAlZWF4Cgltb3ZsICAgICVlYXgsICVlc3AKCglwdXNobAkkMAoJcG9wbAklZWF4CgljbXBsCSQwLCAlZWF4CglqbmUJbm9fc3RhY2sKCXB1c2gJJDB4NTVhYTU1YWEKCXBvcGwJJWVieAoJY21wbAkkMHg1NWFhNTVhYSwgJWVieAoJamUJc3RhY2tfb2sKCm5vX3N0YWNrOgoJLyogaW5kaWNhdGUgKGxhY2sgb2YpIHByb2dyZXNzICovCgltb3Z3CSQweDgyLCAlYXgKCW1vdmwJJC5wcm9ncmVzczFhLCAlZWJwCglqbXAJc2hvd19ib290X3Byb2dyZXNzCi5wcm9ncmVzczFhOgoJam1wIGRpZQoKCnN0YWNrX29rOgoJLyogaW5kaWNhdGUgcHJvZ3Jlc3MgKi8KCW1vdncJJDB4MDMsICVheAoJbW92bAkkLnByb2dyZXNzMiwgJWVicAoJam1wCXNob3dfYm9vdF9wcm9ncmVzcwoucHJvZ3Jlc3MyOgoKCS8qIGNvcHkgZGF0YSBzZWN0aW9uIHRvIHJhbSwgc2l6ZSBtdXN0IGJlIDQtYnl0ZSBhbGlnbmVkICovCgltb3ZsCSRfaTM4NmJvb3Rfcm9tZGF0YV9kZXN0LCAlZWRpCSAgLyogZGVzdGluYXRpb24gYWRkcmVzcyAqLwoJbW92bAkkX2kzODZib290X3JvbWRhdGFfc3RhcnQsICVlc2kJICAvKiBzb3VyY2UgYWRkcmVzcyAqLwoJbW92bAkkX2kzODZib290X3JvbWRhdGFfc2l6ZSwgJWVjeCAgICAgLyogbnVtYmVyIG9mIGJ5dGVzIHRvIGNvcHkgKi8KCW1vdmwJJWVjeCwgJWVheAoJYW5kbAkkMywgJWVheAoJam56CWRhdGFfZmFpbAoKCXNocmwJJDIsICVlY3gJICAgICAgICAgICAgICAgICAgLyogY29weSA0IGJ5dGUgZWFjaCB0aW1lICovCgljbGQKCWNtcGwJJDAsICVlY3gKCWplCWRhdGFfb2sKZGF0YV9zZWdtZW50OgoJbW92c2wKCWxvb3AJZGF0YV9zZWdtZW50CglqbXAJZGF0YV9vawpkYXRhX2ZhaWw6CgkvKiBpbmRpY2F0ZSAobGFjayBvZikgcHJvZ3Jlc3MgKi8KCW1vdncJJDB4ODMsICVheAoJbW92bAkkLnByb2dyZXNzMmEsICVlYnAKCWptcAlzaG93X2Jvb3RfcHJvZ3Jlc3MKLnByb2dyZXNzMmE6CglqbXAJZGllCgpkYXRhX29rOgoKCS8qIGluZGljYXRlIHByb2dyZXNzICovCgltb3Z3CSQweDA0LCAlYXgKCW1vdmwJJC5wcm9ncmVzczMsICVlYnAKCWptcAlzaG93X2Jvb3RfcHJvZ3Jlc3MKLnByb2dyZXNzMzoKCgkvKiBjbGVhciBic3Mgc2VjdGlvbiBpbiByYW0sIHNpemUgbXVzdCBiZSA0LWJ5dGUgYWxpZ25lZCAgKi8KCW1vdmwJJF9pMzg2Ym9vdF9ic3Nfc3RhcnQsICVlZGkgICAgICAgIC8qIE1LX0NIRyBCU1Mgc3RhcnQgKi8KCW1vdmwJJF9pMzg2Ym9vdF9ic3Nfc2l6ZSwgJWVjeCAgICAgICAgIC8qIEJTUyBzaXplICovCgltb3ZsCSVlY3gsICVlYXgKCWFuZGwJJDMsICVlYXgKCWpueglic3NfZmFpbAoJc2hybAkkMiwgJWVjeAkgICAgICAgICAgICAgICAgICAvKiBjbGVhciA0IGJ5dGUgZWFjaCB0aW1lICovCgljbGQKCWNtcGwJJDAsICVlY3gKCWplCWJzc19vawpic3M6Cgltb3ZsCSQwLCAoJWVkaSkKCWFkZAkkNCwgJWVkaQoJbG9vcAlic3MKCWptcAlic3Nfb2sKCmJzc19mYWlsOgoJLyogaW5kaWNhdGUgKGxhY2sgb2YpIHByb2dyZXNzICovCgltb3Z3CSQweDg0LCAlYXgKCW1vdmwJJC5wcm9ncmVzczNhLCAlZWJwCglqbXAJc2hvd19ib290X3Byb2dyZXNzCi5wcm9ncmVzczNhOgoJam1wCWRpZQoKYnNzX29rOgoKCXdiaW52ZAoKCgkvKiBpbmRpY2F0ZSBwcm9ncmVzcyAqLwoJbW92dwkkMHgwNSwgJWF4Cgltb3ZsCSQucHJvZ3Jlc3M0LCAlZWJwCglqbXAJc2hvd19ib290X3Byb2dyZXNzCi5wcm9ncmVzczQ6CgoJY2FsbAlzdGFydF9pMzg2Ym9vdCAgLyogRW50ZXIsIFUtYm9vdCEgKi8KCgkvKiBpbmRpY2F0ZSAobGFjayBvZikgcHJvZ3Jlc3MgKi8KCW1vdncJJDB4ODUsICVheAoJbW92bAkkLnByb2dyZXNzNGEsICVlYnAKCWptcAlzaG93X2Jvb3RfcHJvZ3Jlc3MKLnByb2dyZXNzNGE6CgpkaWU6CWhsdAoJam1wCWRpZQoJaGx0Cg==