LyoKICogKEMpIENvcHlyaWdodCAyMDAyCiAqIFN05HVibGkgRmF2ZXJnZXMgLSA8d3d3LnN0YXVibGkuY29tPgogKiBQaWVycmUgQVVCRVJUICBwLmF1YmVydEBzdGF1YmxpLmNvbQogKgogKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcwogKiBwcm9qZWN0LgogKgogKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCiAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCiAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQogKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKgogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQogKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAogKiBNQSAwMjExMS0xMzA3IFVTQQogKi8KCiNpZm5kZWYgX0ZET1NfSF8KI2RlZmluZSBfRkRPU19IXwoKCiN1bmRlZglGRE9TX0RFQlVHCgojaWZkZWYJRkRPU19ERUJVRwojZGVmaW5lCVBSSU5URihmbXQsYXJncy4uLikJcHJpbnRmIChmbXQgLCMjYXJncykKI2Vsc2UKI2RlZmluZSBQUklOVEYoZm10LGFyZ3MuLi4pCiNlbmRpZgoKLyogRGF0YSBzdHJ1Y3R1cmUgZGVzY3JpYmluZyBtZWRpYSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwp0eXBlZGVmIHN0cnVjdCBmcwp7CiAgICB1bnNpZ25lZCBsb25nICAgICAgIHRvdF9zZWN0b3JzOwoKICAgIGludCAgICAgICAgICAgICAgICAgY2x1c3Rlcl9zaXplOwogICAgaW50ICAgICAgICAgICAgICAgICBudW1fY2x1czsKCiAgICBpbnQgICAgICAgICAgICAgICAgIGZhdF9zdGFydDsKICAgIGludCAgICAgICAgICAgICAgICAgZmF0X2xlbjsKICAgIGludCAgICAgICAgICAgICAgICAgbmJfZmF0OwogICAgaW50ICAgICAgICAgICAgICAgICBudW1fZmF0OwoKICAgIGludCAgICAgICAgICAgICAgICAgZGlyX3N0YXJ0OwogICAgaW50ICAgICAgICAgICAgICAgICBkaXJfbGVuOwoKICAgIHVuc2lnbmVkIGNoYXIgICAgICAgKmZhdF9idWY7Cgp9IEZzX3Q7CgovKiBEYXRhIHN0cnVjdHVyZSBkZXNjcmliaW5nIG9uZSBmaWxlIHN5c3RlbSBzbG90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCnR5cGVkZWYgc3RydWN0IHNsb3QgewogICAgaW50ICgqbWFwKSAoc3RydWN0IGZzICpmcywKCQlzdHJ1Y3Qgc2xvdCAqZmlsZSwKCQlpbnQgd2hlcmUsCgkJaW50ICpsZW4pOwogICAgdW5zaWduZWQgbG9uZyBGaWxlU2l6ZTsKCiAgICB1bnNpZ25lZCBzaG9ydCBpbnQgRmlyc3RBYnNDbHVOcjsKICAgIHVuc2lnbmVkIHNob3J0IGludCBQcmV2aW91c0Fic0NsdU5yOwogICAgdW5zaWduZWQgc2hvcnQgaW50IFByZXZpb3VzUmVsQ2x1TnI7CgogICAgRGlyZWN0b3J5X3QgZGlyOwp9IFNsb3RfdDsKCnR5cGVkZWYgc3RydWN0IGZpbGUgewogICAgY2hhciAgICAgICAgICAgICAgICAqbmFtZTsKICAgIGludCAgICAgICAgICAgICAgICAgQ2FzZTsKICAgIEZzX3QgICAgICAgICAgICAgICAgKmZzOwogICAgU2xvdF90ICAgICAgICAgICAgICBzdWJkaXI7CiAgICBTbG90X3QgICAgICAgICAgICAgIGZpbGU7Cn0gRmlsZV90OwoKCi8qIGRldi5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KaW50IGRldl9yZWFkICh2b2lkICpidWZmZXIsIGludCB3aGVyZSwgaW50IGxlbik7CmludCBkZXZfb3BlbiAodm9pZCk7CmludCBjaGVja19kZXYgKEJvb3RTZWN0b3JfdCAqYm9vdCwgRnNfdCAqZnMpOwoKLyogZmF0LmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwp1bnNpZ25lZCBpbnQgZmF0X2RlY29kZSAoRnNfdCAqZnMsIHVuc2lnbmVkIGludCBudW0pOwppbnQgcmVhZF9mYXQgKEJvb3RTZWN0b3JfdCAqYm9vdCwgRnNfdCAqZnMpOwoKLyogdmZhdC5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwppbnQgdmZhdF9sb29rdXAgKFNsb3RfdCAqZGlyLAoJCSBGc190ICpmcywKCQkgRGlyZWN0b3J5X3QgKmRpcmVudCwKCQkgaW50ICplbnRyeSwKCQkgaW50ICp2ZmF0X3N0YXJ0LAoJCSBjaGFyICpmaWxlbmFtZSwKCQkgaW50IGZsYWdzLAoJCSBjaGFyICpvdXRuYW1lLAoJCSBTbG90X3QgKmZpbGUpOwoKLyogc3ViZGlyLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpjaGFyICpiYXNlbmFtZSAoY2hhciAqbmFtZSk7CmludCBvcGVuX3N1YmRpciAoRmlsZV90ICpkZXNjKTsKaW50IG9wZW5fZmlsZSAoU2xvdF90ICpmaWxlLCBEaXJlY3RvcnlfdCAqZGlyKTsKaW50IHJlYWRfZmlsZSAoRnNfdCAqZnMsCgkgICAgICAgU2xvdF90ICpmaWxlLAoJICAgICAgIGNoYXIgKmJ1ZiwKCSAgICAgICBpbnQgd2hlcmUsCgkgICAgICAgaW50IGxlbik7CnZvaWQgaW5pdF9zdWJkaXIgKHZvaWQpOwoKLyogZnMuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwppbnQgZnNfaW5pdCAoRnNfdCAqZnMpOwoKCiNlbmRpZgo=