LyoKICogKEMpIENvcHlyaWdodCAyMDAyCiAqIFN05HVibGkgRmF2ZXJnZXMgLSA8d3d3LnN0YXVibGkuY29tPgogKiBQaWVycmUgQVVCRVJUICBwLmF1YmVydEBzdGF1YmxpLmNvbQogKgogKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcwogKiBwcm9qZWN0LgogKgogKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCiAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCiAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQogKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKgogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQogKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAogKiBNQSAwMjExMS0xMzA3IFVTQQogKi8KCiNpbmNsdWRlIDxjb21tb24uaD4KI2luY2x1ZGUgPGNvbmZpZy5oPgoKI2lmIGRlZmluZWQoQ09ORklHX0NNRF9GRE9TKQojaW5jbHVkZSA8bWFsbG9jLmg+CiNpbmNsdWRlICJkb3MuaCIKI2luY2x1ZGUgImZkb3MuaCIKCgpjb25zdCBjaGFyICptb250aCBbXSA9IHsiSmFuIiwgIkZlYiIsICJNYXIiLCAiQXByIiwgIk1heSIsICJKdW4iLCAiSnVsIiwgIkF1ZyIsICJTZXAiLCAiT2N0IiwgIk5vdiIsICJEZWMifTsKCkZzX3QgICAgZnM7CkZpbGVfdCAgZmlsZTsKCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICogZG9zX29wZW4gLS0KICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKi8KaW50IGRvc19vcGVuKGNoYXIgKm5hbWUpCnsKICAgIGludCBsZzsKICAgIGludCBlbnRyeTsKICAgIGNoYXIgKmZuYW1lOwoKICAgIC8qIFdlIG5lZWQgdG8gc3VwcHJlc3MgdGhlICIgY2hhciBhcm91bmQgdGhlIG5hbWUgICAgICAgICAgICAgICAgICAgICAgICAqLwogICAgaWYgKG5hbWUgWzBdID09ICciJykgewoJbmFtZSArKzsKICAgIH0KICAgIGxnID0gc3RybGVuIChuYW1lKTsKICAgIGlmIChuYW1lIFtsZyAtIDFdID09ICciJykgewoJbmFtZSBbbGcgLSAxXSA9ICdcMCc7CiAgICB9CgogICAgLyogT3BlbiBmaWxlIHN5c3RlbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgICBpZiAoZnNfaW5pdCAoJmZzKSA8IDApIHsKCXJldHVybiAtMTsKICAgIH0KCiAgICAvKiBJbml0IHRoZSBmaWxlIGRlc2NyaXB0b3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgIGZpbGUubmFtZSA9IG5hbWU7CiAgICBmaWxlLmZzID0gJmZzOwoKICAgIC8qIGZpbmQgdGhlIHN1YmRpcmVjdG9yeSBjb250YWluaW5nIHRoZSBmaWxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICAgaWYgKG9wZW5fc3ViZGlyICgmZmlsZSkgPCAwKSB7CglyZXR1cm4gKC0xKTsKICAgIH0KCiAgICBmbmFtZSA9IGJhc2VuYW1lIChuYW1lKTsKCiAgICAvKiBpZiB3ZSB0cnkgdG8gb3BlbiByb290IGRpcmVjdG9yeSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgIGlmICgqZm5hbWUgPT0gJ1wwJykgewoJZmlsZS5maWxlID0gZmlsZS5zdWJkaXI7CglyZXR1cm4gKDApOwogICAgfQoKICAgIC8qIGZpbmQgdGhlIGZpbGUgaW4gdGhlIHN1YmRpciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICAgZW50cnkgPSAwOwogICAgaWYgKHZmYXRfbG9va3VwICgmZmlsZS5zdWJkaXIsCgkJICAgICBmaWxlLmZzLAoJCSAgICAgJmZpbGUuZmlsZS5kaXIsCgkJICAgICAmZW50cnksCgkJICAgICAwLAoJCSAgICAgZm5hbWUsCgkJICAgICBBQ0NFUFRfRElSIHwgQUNDRVBUX1BMQUlOIHwgU0lOR0xFIHwgRE9fT1BFTiwKCQkgICAgIDAsCgkJICAgICAmZmlsZS5maWxlKSAhPSAwKSB7CgkvKiBGaWxlIG5vdCBmb3VuZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwoJcHJpbnRmICgiRmlsZSBub3QgZm91bmRcbiIpOwoJcmV0dXJuICgtMSk7CiAgICB9CgogICAgcmV0dXJuIDA7Cn0KCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICogZG9zX3JlYWQgLS0KICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKi8KaW50IGRvc19yZWFkICh1bG9uZyBhZGRyKQp7CiAgICBpbnQgcmVhZCA9IDAsIG5iOwoKICAgIC8qIFRyeSB0byBib290IGEgZGlyZWN0b3J5ID8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICAgaWYgKGZpbGUuZmlsZS5kaXIuYXR0ciAmIChBVFRSX0RJUkVDVE9SWSB8IEFUVFJfVk9MVU1FKSkgewoJcHJpbnRmICgiVW5hYmxlIHRvIGJvb3QgJXMgISFcbiIsIGZpbGUubmFtZSk7CglyZXR1cm4gKC0xKTsKICAgIH0KICAgIHdoaWxlIChyZWFkIDwgZmlsZS5maWxlLkZpbGVTaXplKSB7CglQUklOVEYgKCJyZWFkX2ZpbGUgKCVsZClcbiIsIChmaWxlLmZpbGUuRmlsZVNpemUgLSByZWFkKSk7CgluYiA9IHJlYWRfZmlsZSAoJmZzLAoJCQkmZmlsZS5maWxlLAoJCQkoY2hhciAqKWFkZHIgKyByZWFkLAoJCQlyZWFkLAoJCQkoZmlsZS5maWxlLkZpbGVTaXplIC0gcmVhZCkpOwoJUFJJTlRGICgicmVhZF9maWxlIC0+ICVkXG4iLCBuYik7CglpZiAobmIgPCAwKSB7CgkgICAgcHJpbnRmICgicmVhZCBlcnJvclxuIik7CgkgICAgcmV0dXJuICgtMSk7Cgl9CglyZWFkICs9IG5iOwogICAgfQogICAgcmV0dXJuIChyZWFkKTsKfQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqIGRvc19kaXIgLS0KICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKi8KaW50IGRvc19kaXIgKHZvaWQpCnsKICAgIGludCBlbnRyeTsKICAgIERpcmVjdG9yeV90IGRpcjsKICAgIGNoYXIgKm5hbWU7CgoKICAgIGlmICgoZmlsZS5maWxlLmRpci5hdHRyICYgQVRUUl9ESVJFQ1RPUlkpID09IDApIHsKCXByaW50ZiAoIiVzOiBub3QgYSBkaXJlY3RvcnkgISFcbiIsIGZpbGUubmFtZSk7CglyZXR1cm4gKDEpOwogICAgfQogICAgZW50cnkgPSAwOwogICAgaWYgKChuYW1lID0gbWFsbG9jIChNQVhfVk5BTUVMRU4gKyAxKSkgPT0gTlVMTCkgewoJUFJJTlRGICgiQWxsY2F0aW9uIGVycm9yXG4iKTsKCXJldHVybiAoMSk7CiAgICB9CgogICAgd2hpbGUgKHZmYXRfbG9va3VwICgmZmlsZS5maWxlLAoJCQlmaWxlLmZzLAoJCQkmZGlyLAoJCQkmZW50cnksCgkJCTAsCgkJCU5VTEwsCgkJCUFDQ0VQVF9ESVIgfCBBQ0NFUFRfUExBSU4gfCBNQVRDSF9BTlksCgkJCW5hbWUsCgkJCU5VTEwpID09IDApIHsKCS8qIERpc3BsYXkgZmlsZSBpbmZvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCglwcmludGYgKCIlMy4zcyAlOWQgJXMgJTAyZCAlMDRkICUwMmQ6JTAyZDolMDJkICVzXG4iLAoJCShkaXIuYXR0ciAmIEFUVFJfRElSRUNUT1JZKSA/ICJkaXIiIDogIiAgICIsCgkJX19sZTMyX3RvX2NwdSAoZGlyLnNpemUpLAoJCW1vbnRoIFtET1NfTU9OVEggKCZkaXIpIC0gMV0sCgkJRE9TX0RBWSAoJmRpciksCgkJRE9TX1lFQVIgKCZkaXIpLAoJCURPU19IT1VSICgmZGlyKSwKCQlET1NfTUlOVVRFICgmZGlyKSwKCQlET1NfU0VDICgmZGlyKSwKCQluYW1lKTsKCiAgICB9CiAgICBmcmVlIChuYW1lKTsKICAgIHJldHVybiAoMCk7Cn0KCiNlbmRpZgo=