LyoKICogIFUtYm9vdCAtIGkzODYgU3RhcnR1cCBDb2RlCiAqCiAqICBDb3B5cmlnaHQgKGMpIDIwMDIJT21pY3JvbiBDZXRpIEFCLCBEYW5pZWwgRW5nc3Ry9m0gPGRlbmFpZWxAb21pY3Jvbi5zZT4KICoKICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKICogcHJvamVjdC4KICoKICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwogKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgogKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKICogTUEgMDIxMTEtMTMwNyBVU0EKICovCgoKI2luY2x1ZGUgPGNvbmZpZy5oPgojaW5jbHVkZSA8dmVyc2lvbi5oPgoKCi5zZWN0aW9uIC50ZXh0Ci5jb2RlMzIKLmdsb2JsIF9zdGFydAoudHlwZSBfc3RhcnQsIEBmdW5jdGlvbgouZ2xvYmwgX2kzODZib290X3N0YXJ0Cl9pMzg2Ym9vdF9zdGFydDoKX3N0YXJ0OgoJbW92bCAgICAkMHgxOCwlZWF4CS8qIExvYWQgb3VyIHNlZ2VtZW50IHJlZ2lzdGVzLCB0aGUKCQkJCSAqIGdkdCBoYXZlIGFscmVhZHkgYmVlbiBsb2FkZWQgYnkgc3RhcnQxNi5TICovCgltb3Z3ICAgICVheCwlZnMKCW1vdncJJWF4LCVkcwoJbW92dyAgICAlYXgsJWdzCgltb3Z3ICAgICVheCwlZXMKCW1vdncgICAgJWF4LCVzcwoKCS8qIFdlIGNhbGwgYSBmZXcgZnVuY3Rpb25zIGluIHRoZSBib2FyZCBzdXBwb3J0IHBhY2thZ2UKCSAqIHNpbmNlIHdlIGhhdmUgbm8gc3RhY2sgeWV0IHdlJ2xsIGhhdmUgdG8gdXNlICVlYnAKCSAqIHRvIHN0b3JlIHRoZSByZXR1cm4gYWRkcmVzcyAqLwoKCS8qIEVhcmx5IHBsYXRmb3JtIGluaXQgKHNldHVwIGdwaW8sIGV0YyApICovCgltb3YgICAgICRlYXJseV9ib2FyZF9pbml0X3JldCwgJWVicAoJam1wCWVhcmx5X2JvYXJkX2luaXQKZWFybHlfYm9hcmRfaW5pdF9yZXQ6CgoJLyogVGhlIF9fcG9ydDgwIGVudHJ5LXBvaW50IHNob3VsZCBiZSB1c2FiZSBieSBub3cgKi8KCS8qIHNvIHdlIHRyeSB0byBpbmRpY2F0ZSBwcm9ncmVzcyAqLwoJbW92dwkkMHgwMSwgJWF4Cgltb3ZsCSQucHJvZ3Jlc3MwLCAlZWJwCglqbXAJc2hvd19ib290X3Byb2dyZXNzX2FzbQoucHJvZ3Jlc3MwOgoKCS8qIHNpemUgbWVtb3J5ICovCgltb3YJJG1lbV9pbml0X3JldCwgJWVicAoJam1wICAgICBtZW1faW5pdAptZW1faW5pdF9yZXQ6CgoJLyogQ2hlY2sgd2UgaGF2ZSBlbm91Z2ggbWVtb3J5IGZvciBzdGFjayAqLwoJbW92bAkkQ09ORklHX1NZU19TVEFDS19TSVpFLCAlZWN4CgljbXBsCSVlY3gsICVlYXgKCWphZQltZW1fb2sKCgkvKiBpbmRpY2F0ZSAobGFjayBvZikgcHJvZ3Jlc3MgKi8KCW1vdncJJDB4ODEsICVheAoJbW92bAkkLnByb2dyZXNzMGEsICVlYnAKCWptcAlzaG93X2Jvb3RfcHJvZ3Jlc3NfYXNtCi5wcm9ncmVzczBhOgoJam1wCWRpZQptZW1fb2s6CgkvKiBTZXQgc3RhY2sgcG9pbnRlciB0byB1cHBlciBtZW1vcnkgbGltaXQqLwoJbW92bCAgICAlZWF4LCAlZXNwCgoJLyogaW5kaWNhdGUgcHJvZ3Jlc3MgKi8KCW1vdncJJDB4MDIsICVheAoJbW92bAkkLnByb2dyZXNzMSwgJWVicAoJam1wCXNob3dfYm9vdF9wcm9ncmVzc19hc20KLnByb2dyZXNzMToKCgkvKiBUZXN0IHRoZSBzdGFjayAqLwoJcHVzaGwJJDAKCXBvcGwJJWVheAoJY21wbAkkMCwgJWVheAoJam5lCW5vX3N0YWNrCglwdXNoCSQweDU1YWE1NWFhCglwb3BsCSVlYngKCWNtcGwJJDB4NTVhYTU1YWEsICVlYngKCWplCXN0YWNrX29rCgpub19zdGFjazoKCS8qIGluZGljYXRlIChsYWNrIG9mKSBwcm9ncmVzcyAqLwoJbW92dwkkMHg4MiwgJWF4Cgltb3ZsCSQucHJvZ3Jlc3MxYSwgJWVicAoJam1wCXNob3dfYm9vdF9wcm9ncmVzc19hc20KLnByb2dyZXNzMWE6CglqbXAgZGllCgoKc3RhY2tfb2s6CgkvKiBpbmRpY2F0ZSBwcm9ncmVzcyAqLwoJbW92dwkkMHgwMywgJWF4Cgltb3ZsCSQucHJvZ3Jlc3MyLCAlZWJwCglqbXAJc2hvd19ib290X3Byb2dyZXNzX2FzbQoucHJvZ3Jlc3MyOgoKCXdiaW52ZAoKCS8qIEdldCB1cHBlciBtZW1vcnkgbGltaXQgKi8KCW1vdmwgJWVzcCwgJWVjeAoJc3VibCAkQ09ORklHX1NZU19TVEFDS19TSVpFLCAlZWN4CgoJLyogQ3JlYXRlIGEgU3RhY2sgRnJhbWUgKi8KCXB1c2hsICVlYnAKCW1vdmwgJWVzcCwgJWVicAoKCS8qIHN0YWNrX2xpbWl0IHBhcmFtZXRlciAqLwoJcHVzaGwJJWVjeAoJY2FsbAlib2FyZF9pbml0X2YJLyogRW50ZXIsIFUtYm9vdCEgKi8KCgkvKiBpbmRpY2F0ZSAobGFjayBvZikgcHJvZ3Jlc3MgKi8KCW1vdncJJDB4ODUsICVheAoJbW92bAkkLnByb2dyZXNzNGEsICVlYnAKCWptcAlzaG93X2Jvb3RfcHJvZ3Jlc3NfYXNtCi5wcm9ncmVzczRhOgoKZGllOglobHQKCWptcAlkaWUKCWhsdAo=