LyoKICogJFhGcmVlODY6IHhjL2xpYi9mb250Y29uZmlnL3NyYy9mY2ludC5oLHYgMS4yNyAyMDAyLzA4LzMxIDIyOjE3OjMyIGtlaXRocCBFeHAgJAogKgogKiBDb3B5cmlnaHQgqSAyMDAwIEtlaXRoIFBhY2thcmQsIG1lbWJlciBvZiBUaGUgWEZyZWU4NiBQcm9qZWN0LCBJbmMuCiAqCiAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUsIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUgYW5kIGl0cwogKiBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdAogKiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdCBib3RoIHRoYXQKICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZwogKiBkb2N1bWVudGF0aW9uLCBhbmQgdGhhdCB0aGUgbmFtZSBvZiBLZWl0aCBQYWNrYXJkIG5vdCBiZSB1c2VkIGluCiAqIGFkdmVydGlzaW5nIG9yIHB1YmxpY2l0eSBwZXJ0YWluaW5nIHRvIGRpc3RyaWJ1dGlvbiBvZiB0aGUgc29mdHdhcmUgd2l0aG91dAogKiBzcGVjaWZpYywgd3JpdHRlbiBwcmlvciBwZXJtaXNzaW9uLiAgS2VpdGggUGFja2FyZCBtYWtlcyBubwogKiByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLiAgSXQKICogaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KICoKICogS0VJVEggUEFDS0FSRCBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSwKICogSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLCBJTiBOTwogKiBFVkVOVCBTSEFMTCBLRUlUSCBQQUNLQVJEIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIElORElSRUNUIE9SCiAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLAogKiBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCiAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KICovCgojaWZuZGVmIF9GQ0lOVF9IXwojZGVmaW5lIF9GQ0lOVF9IXwoKI2luY2x1ZGUgPHN0ZGxpYi5oPgojaW5jbHVkZSA8c3RkaW8uaD4KI2luY2x1ZGUgPHN0cmluZy5oPgojaW5jbHVkZSA8Y3R5cGUuaD4KI2luY2x1ZGUgPGVycm5vLmg+CiNpbmNsdWRlIDx1bmlzdGQuaD4KI2luY2x1ZGUgPHN5cy90eXBlcy5oPgojaW5jbHVkZSA8c3lzL3N0YXQuaD4KI2luY2x1ZGUgPHRpbWUuaD4KI2luY2x1ZGUgPGZvbnRjb25maWcvZm9udGNvbmZpZy5oPgojaW5jbHVkZSA8Zm9udGNvbmZpZy9mY3ByaXZhdGUuaD4KI2luY2x1ZGUgPGZvbnRjb25maWcvZmNmcmVldHlwZS5oPgojaWZkZWYgSEFWRV9DT05GSUdfSAojaW5jbHVkZSA8Y29uZmlnLmg+CiNlbmRpZgoKdHlwZWRlZiBzdHJ1Y3QgX0ZjU3ltYm9saWMgewogICAgY29uc3QgY2hhcgkqbmFtZTsKICAgIGludAkJdmFsdWU7Cn0gRmNTeW1ib2xpYzsKCiNpZm5kZWYgRkNfQ09ORklHX1BBVEgKI2RlZmluZSBGQ19DT05GSUdfUEFUSCAiZm9udHMuY29uZiIKI2VuZGlmCgojZGVmaW5lIEZDX0ZPTlRfRklMRV9JTlZBTElECSgoRmNDaGFyOCAqKSAiLiIpCiNkZWZpbmUgRkNfRk9OVF9GSUxFX0RJUgkoKEZjQ2hhcjggKikgIi5kaXIiKQoKI2RlZmluZSBGQ19EQkdfTUFUQ0gJMQojZGVmaW5lIEZDX0RCR19NQVRDSFYJMgojZGVmaW5lIEZDX0RCR19FRElUCTQKI2RlZmluZSBGQ19EQkdfRk9OVFNFVAk4CiNkZWZpbmUgRkNfREJHX0NBQ0hFCTE2CiNkZWZpbmUgRkNfREJHX0NBQ0hFVgkzMgojZGVmaW5lIEZDX0RCR19QQVJTRQk2NAojZGVmaW5lIEZDX0RCR19TQ0FOCTEyOAojZGVmaW5lIEZDX0RCR19TQ0FOVgkyNTYKI2RlZmluZSBGQ19EQkdfTUVNT1JZCTUxMgoKI2RlZmluZSBGQ19NRU1fQ0hBUlNFVAkgICAgMAojZGVmaW5lIEZDX01FTV9DSEFSTEVBRgkgICAgMQojZGVmaW5lIEZDX01FTV9GT05UU0VUCSAgICAyCiNkZWZpbmUgRkNfTUVNX0ZPTlRQVFIJICAgIDMKI2RlZmluZSBGQ19NRU1fT0JKRUNUU0VUICAgIDQKI2RlZmluZSBGQ19NRU1fT0JKRUNUUFRSICAgIDUKI2RlZmluZSBGQ19NRU1fTUFUUklYCSAgICA2CiNkZWZpbmUgRkNfTUVNX1BBVFRFUk4JICAgIDcKI2RlZmluZSBGQ19NRU1fUEFURUxUCSAgICA4CiNkZWZpbmUgRkNfTUVNX1ZBTExJU1QJICAgIDkKI2RlZmluZSBGQ19NRU1fU1VCU1RBVEUJICAgIDEwCiNkZWZpbmUgRkNfTUVNX1NUUklORwkgICAgMTEKI2RlZmluZSBGQ19NRU1fTElTVEJVQ0sJICAgIDEyCiNkZWZpbmUgRkNfTUVNX1NUUlNFVAkgICAgMTMKI2RlZmluZSBGQ19NRU1fU1RSTElTVAkgICAgMTQKI2RlZmluZSBGQ19NRU1fQ09ORklHCSAgICAxNQojZGVmaW5lIEZDX01FTV9MQU5HU0VUCSAgICAxNgojZGVmaW5lIEZDX01FTV9BVE9NSUMJICAgIDE3CiNkZWZpbmUgRkNfTUVNX0JMQU5LUwkgICAgMTgKI2RlZmluZSBGQ19NRU1fQ0FDSEUJICAgIDE5CiNkZWZpbmUgRkNfTUVNX1NUUkJVRgkgICAgMjAKI2RlZmluZSBGQ19NRU1fU1VCU1QJICAgIDIxCiNkZWZpbmUgRkNfTUVNX09CSkVDVFRZUEUgICAyMgojZGVmaW5lIEZDX01FTV9DT05TVEFOVAkgICAgMjMKI2RlZmluZSBGQ19NRU1fVEVTVAkgICAgMjQKI2RlZmluZSBGQ19NRU1fRVhQUgkgICAgMjUKI2RlZmluZSBGQ19NRU1fVlNUQUNLCSAgICAyNgojZGVmaW5lIEZDX01FTV9BVFRSCSAgICAyNwojZGVmaW5lIEZDX01FTV9QU1RBQ0sJICAgIDI4CgojZGVmaW5lIEZDX01FTV9OVU0JICAgIDI5Cgp0eXBlZGVmIGVudW0gX0ZjVmFsdWVCaW5kaW5nIHsKICAgIEZjVmFsdWVCaW5kaW5nV2VhaywgRmNWYWx1ZUJpbmRpbmdTdHJvbmcKfSBGY1ZhbHVlQmluZGluZzsKCnR5cGVkZWYgc3RydWN0IF9GY1ZhbHVlTGlzdCB7CiAgICBzdHJ1Y3QgX0ZjVmFsdWVMaXN0ICAgICpuZXh0OwogICAgRmNWYWx1ZQkJICAgIHZhbHVlOwogICAgRmNWYWx1ZUJpbmRpbmcJICAgIGJpbmRpbmc7Cn0gRmNWYWx1ZUxpc3Q7Cgp0eXBlZGVmIHN0cnVjdCBfRmNQYXR0ZXJuRWx0IHsKICAgIGNvbnN0IGNoYXIJICAgICpvYmplY3Q7CiAgICBGY1ZhbHVlTGlzdAkgICAgKnZhbHVlczsKfSBGY1BhdHRlcm5FbHQ7CgoKc3RydWN0IF9GY1BhdHRlcm4gewogICAgaW50CQkgICAgbnVtOwogICAgaW50CQkgICAgc2l6ZTsKICAgIEZjUGF0dGVybkVsdCAgICAqZWx0czsKICAgIGludAkJICAgIHJlZjsKfTsKCnR5cGVkZWYgZW51bSBfRmNPcCB7CiAgICBGY09wSW50ZWdlciwgRmNPcERvdWJsZSwgRmNPcFN0cmluZywgRmNPcE1hdHJpeCwgRmNPcEJvb2wsIEZjT3BDaGFyU2V0LCAKICAgIEZjT3BOaWwsCiAgICBGY09wRmllbGQsIEZjT3BDb25zdCwKICAgIEZjT3BBc3NpZ24sIEZjT3BBc3NpZ25SZXBsYWNlLCAKICAgIEZjT3BQcmVwZW5kRmlyc3QsIEZjT3BQcmVwZW5kLCBGY09wQXBwZW5kLCBGY09wQXBwZW5kTGFzdCwKICAgIEZjT3BRdWVzdCwKICAgIEZjT3BPciwgRmNPcEFuZCwgRmNPcEVxdWFsLCBGY09wTm90RXF1YWwsIEZjT3BDb250YWlucywgRmNPcE5vdENvbnRhaW5zLAogICAgRmNPcExlc3MsIEZjT3BMZXNzRXF1YWwsIEZjT3BNb3JlLCBGY09wTW9yZUVxdWFsLAogICAgRmNPcFBsdXMsIEZjT3BNaW51cywgRmNPcFRpbWVzLCBGY09wRGl2aWRlLAogICAgRmNPcE5vdCwgRmNPcENvbW1hLCBGY09wSW52YWxpZAp9IEZjT3A7Cgp0eXBlZGVmIHN0cnVjdCBfRmNFeHByIHsKICAgIEZjT3AgICBvcDsKICAgIHVuaW9uIHsKCWludAkgICAgaXZhbDsKCWRvdWJsZQkgICAgZHZhbDsKCUZjQ2hhcjgJICAgICpzdmFsOwoJRmNNYXRyaXggICAgKm12YWw7CglGY0Jvb2wJICAgIGJ2YWw7CglGY0NoYXJTZXQgICAqY3ZhbDsKCWNoYXIJICAgICpmaWVsZDsKCUZjQ2hhcjgJICAgICpjb25zdGFudDsKCXN0cnVjdCB7CgkgICAgc3RydWN0IF9GY0V4cHIgKmxlZnQsICpyaWdodDsKCX0gdHJlZTsKICAgIH0gdTsKfSBGY0V4cHI7Cgp0eXBlZGVmIGVudW0gX0ZjUXVhbCB7CiAgICBGY1F1YWxBbnksIEZjUXVhbEFsbCwgRmNRdWFsRmlyc3QsIEZjUXVhbE5vdEZpcnN0Cn0gRmNRdWFsOwoKI2RlZmluZSBGY01hdGNoRGVmYXVsdAkoKEZjTWF0Y2hLaW5kKSAtMSkKCnR5cGVkZWYgc3RydWN0IF9GY1Rlc3QgewogICAgc3RydWN0IF9GY1Rlc3QJKm5leHQ7CiAgICBGY01hdGNoS2luZAkJa2luZDsKICAgIEZjUXVhbAkJcXVhbDsKICAgIGNvbnN0IGNoYXIJCSpmaWVsZDsKICAgIEZjT3AJCW9wOwogICAgRmNFeHByCQkqZXhwcjsKfSBGY1Rlc3Q7Cgp0eXBlZGVmIHN0cnVjdCBfRmNFZGl0IHsKICAgIHN0cnVjdCBfRmNFZGl0ICpuZXh0OwogICAgY29uc3QgY2hhcgkgICAgKmZpZWxkOwogICAgRmNPcAkgICAgb3A7CiAgICBGY0V4cHIJICAgICpleHByOwogICAgRmNWYWx1ZUJpbmRpbmcgIGJpbmRpbmc7Cn0gRmNFZGl0OwoKdHlwZWRlZiBzdHJ1Y3QgX0ZjU3Vic3QgewogICAgc3RydWN0IF9GY1N1YnN0CSpuZXh0OwogICAgRmNUZXN0CQkqdGVzdDsKICAgIEZjRWRpdAkJKmVkaXQ7Cn0gRmNTdWJzdDsKCnR5cGVkZWYgc3RydWN0IF9GY0NoYXJMZWFmIHsKICAgIEZjQ2hhcjMyCW1hcFsyNTYvMzJdOwp9IEZjQ2hhckxlYWY7CgojZGVmaW5lIEZDX1JFRl9DT05TVEFOVAkgICAgLTEKCnN0cnVjdCBfRmNDaGFyU2V0IHsKICAgIGludAkJICAgIHJlZjsJLyogcmVmZXJlbmNlIGNvdW50ICovCiAgICBpbnQJCSAgICBudW07CS8qIHNpemUgb2YgbGVhdmVzIGFuZCBudW1iZXJzIGFycmF5cyAqLwogICAgRmNDaGFyTGVhZgkgICAgKipsZWF2ZXM7CiAgICBGY0NoYXIxNgkgICAgKm51bWJlcnM7Cn07CgpzdHJ1Y3QgX0ZjU3RyU2V0IHsKICAgIGludAkJICAgIHJlZjsJLyogcmVmZXJlbmNlIGNvdW50ICovCiAgICBpbnQJCSAgICBudW07CiAgICBpbnQJCSAgICBzaXplOwogICAgRmNDaGFyOAkgICAgKipzdHJzOwp9OwoKc3RydWN0IF9GY1N0ckxpc3QgewogICAgRmNTdHJTZXQJICAgICpzZXQ7CiAgICBpbnQJCSAgICBuOwp9OwoKdHlwZWRlZiBzdHJ1Y3QgX0ZjU3RyQnVmIHsKICAgIEZjQ2hhcjggKmJ1ZjsKICAgIEZjQm9vbCAgYWxsb2NhdGVkOwogICAgRmNCb29sICBmYWlsZWQ7CiAgICBpbnQJICAgIGxlbjsKICAgIGludAkgICAgc2l6ZTsKfSBGY1N0ckJ1ZjsKCi8qCiAqIFRoZSBwZXItdXNlciB+Ly5mb250cy5jYWNoZS08dmVyc2lvbj4gZmlsZSBpcyBsb2FkZWQgaW50bwogKiB0aGlzIGRhdGEgc3RydWN0dXJlLiAgRWFjaCBkaXJlY3RvcnkgZ2V0cyBhIHN1YnN0cnVjdHVyZQogKiB3aGljaCBpcyB2YWxpZGF0ZWQgYnkgY29tcGFyaW5nIHRoZSBkaXJlY3RvcnkgdGltZXN0YW1wIHdpdGgKICogdGhhdCBzYXZlZCBpbiB0aGUgY2FjaGUuICBXaGVuIHZhbGlkLCB0aGUgZW50aXJlIGRpcmVjdG9yeSBjYWNoZQogKiBjYW4gYmUgaW1tZWRpYXRlbHkgbG9hZGVkIHdpdGhvdXQgcmVhZGluZyB0aGUgZGlyZWN0b3J5LiAgT3RoZXJ3aXNlLAogKiB0aGUgZmlsZXMgYXJlIGNoZWNrZWQgaW5kaXZpZHVhbGx5OyB1cGRhdGVkIGZpbGVzIGFyZSBsb2FkZWQgaW50byB0aGUKICogY2FjaGUgd2hpY2ggaXMgdGhlbiByZXdyaXR0ZW4gdG8gdGhlIHVzZXJzIGhvbWUgZGlyZWN0b3J5CiAqLwoKI2RlZmluZSBGQ19HTE9CQUxfQ0FDSEVfRElSX0hBU0hfU0laRQkgICAgMzcKI2RlZmluZSBGQ19HTE9CQUxfQ0FDSEVfRklMRV9IQVNIX1NJWkUJICAgIDY3Cgp0eXBlZGVmIHN0cnVjdCBfRmNHbG9iYWxDYWNoZUluZm8gewogICAgdW5zaWduZWQgaW50CQloYXNoOwogICAgRmNDaGFyOAkJCSpmaWxlOwogICAgdGltZV90CQkJdGltZTsKICAgIEZjQm9vbAkJCXJlZmVyZW5jZWQ7Cn0gRmNHbG9iYWxDYWNoZUluZm87Cgp0eXBlZGVmIHN0cnVjdCBfRmNHbG9iYWxDYWNoZUZpbGUgewogICAgc3RydWN0IF9GY0dsb2JhbENhY2hlRmlsZQkqbmV4dDsKICAgIEZjR2xvYmFsQ2FjaGVJbmZvCQlpbmZvOwogICAgaW50CQkJCWlkOwogICAgRmNDaGFyOAkJCSpuYW1lOwp9IEZjR2xvYmFsQ2FjaGVGaWxlOwoKdHlwZWRlZiBzdHJ1Y3QgX0ZjR2xvYmFsQ2FjaGVEaXIgRmNHbG9iYWxDYWNoZURpcjsKCnR5cGVkZWYgc3RydWN0IF9GY0dsb2JhbENhY2hlU3ViZGlyIHsKICAgIHN0cnVjdCBfRmNHbG9iYWxDYWNoZVN1YmRpcgkqbmV4dDsKICAgIEZjR2xvYmFsQ2FjaGVEaXIJCSplbnQ7Cn0gRmNHbG9iYWxDYWNoZVN1YmRpcjsKCnN0cnVjdCBfRmNHbG9iYWxDYWNoZURpciB7CiAgICBzdHJ1Y3QgX0ZjR2xvYmFsQ2FjaGVEaXIJKm5leHQ7CiAgICBGY0dsb2JhbENhY2hlSW5mbyAgICAJaW5mbzsKICAgIGludAkJCQlsZW47CiAgICBGY0dsb2JhbENhY2hlRmlsZQkJKmVudHNbRkNfR0xPQkFMX0NBQ0hFX0ZJTEVfSEFTSF9TSVpFXTsKICAgIEZjR2xvYmFsQ2FjaGVTdWJkaXIJCSpzdWJkaXJzOwp9OwoKdHlwZWRlZiBzdHJ1Y3QgX0ZjR2xvYmFsQ2FjaGUgewogICAgRmNHbG9iYWxDYWNoZURpcgkJKmVudHNbRkNfR0xPQkFMX0NBQ0hFX0RJUl9IQVNIX1NJWkVdOwogICAgRmNCb29sCQkJdXBkYXRlZDsKICAgIEZjQm9vbAkJCWJyb2tlbjsKICAgIGludAkJCQllbnRyaWVzOwogICAgaW50CQkJCXJlZmVyZW5jZWQ7Cn0gRmNHbG9iYWxDYWNoZTsKCnN0cnVjdCBfRmNBdG9taWMgewogICAgRmNDaGFyOAkqZmlsZTsJCS8qIG9yaWdpbmFsIGZpbGUgbmFtZSAqLwogICAgRmNDaGFyOAkqbmV3OwkJLyogdGVtcCBmaWxlIG5hbWUgLS0gd3JpdGUgZGF0YSBoZXJlICovCiAgICBGY0NoYXI4CSpsY2s7CQkvKiBsb2NrZmlsZSBuYW1lICh1c2VkIGZvciBsb2NraW5nKSAqLwogICAgRmNDaGFyOAkqdG1wOwkJLyogdG1wZmlsZSBuYW1lICh1c2VkIGZvciBsb2NraW5nKSAqLwp9OwoKc3RydWN0IF9GY0JsYW5rcyB7CiAgICBpbnQJCW5ibGFuazsKICAgIGludAkJc2JsYW5rOwogICAgRmNDaGFyMzIJKmJsYW5rczsKfTsKCnN0cnVjdCBfRmNDb25maWcgewogICAgLyoKICAgICAqIEZpbGUgbmFtZXMgbG9hZGVkIGZyb20gdGhlIGNvbmZpZ3VyYXRpb24gLS0gc2F2ZWQgaGVyZSBhcyB0aGUKICAgICAqIGNhY2hlIGZpbGUgbXVzdCBiZSBjb25zdWx0ZWQgYmVmb3JlIHRoZSBkaXJlY3RvcmllcyBhcmUgc2Nhbm5lZCwKICAgICAqIGFuZCB0aG9zZSBkaXJlY3RpdmVzIG1heSBvY2N1ciBpbiBhbnkgb3JkZXIKICAgICAqLwogICAgRmNTdHJTZXQJKmNvbmZpZ0RpcnM7CSAgICAvKiBkaXJlY3RvcmllcyB0byBzY2FuIGZvciBmb250cyAqLwogICAgRmNDaGFyOAkqY2FjaGU7CQkgICAgLyogbmFtZSBvZiBwZXItdXNlciBjYWNoZSBmaWxlICovCiAgICAvKgogICAgICogU2V0IG9mIGFsbG93ZWQgYmxhbmsgY2hhcnMgLS0gdXNlZCB0bwogICAgICogdHJpbSBmb250cyBvZiBib2d1cyBnbHlwaHMKICAgICAqLwogICAgRmNCbGFua3MJKmJsYW5rczsKICAgIC8qCiAgICAgKiBMaXN0IG9mIGRpcmVjdG9yaWVzIGNvbnRhaW5pbmcgZm9udHMsCiAgICAgKiBidWlsdCBieSByZWN1cnNpdmVseSBzY2FubmluZyB0aGUgc2V0IAogICAgICogb2YgY29uZmlndXJlZCBkaXJlY3RvcmllcwogICAgICovCiAgICBGY1N0clNldAkqZm9udERpcnM7CiAgICAvKgogICAgICogTmFtZXMgb2YgYWxsIG9mIHRoZSBjb25maWd1cmF0aW9uIGZpbGVzIHVzZWQKICAgICAqIHRvIGNyZWF0ZSB0aGlzIGNvbmZpZ3VyYXRpb24KICAgICAqLwogICAgRmNTdHJTZXQJKmNvbmZpZ0ZpbGVzOwkgICAgLyogY29uZmlnIGZpbGVzIGxvYWRlZCAqLwogICAgLyoKICAgICAqIFN1YnN0aXR1dGlvbiBpbnN0cnVjdGlvbnMgZm9yIHBhdHRlcm5zIGFuZCBmb250czsKICAgICAqIG1heE9iamVjdHMgaXMgdXNlZCB0byBhbGxvY2F0ZSBhcHByb3ByaWF0ZSBpbnRlcm1lZGlhdGUgc3RvcmFnZQogICAgICogd2hpbGUgcGVyZm9ybWluZyBhIHdob2xlIHNldCBvZiBzdWJzdGl0dXRpb25zCiAgICAgKi8KICAgIEZjU3Vic3QJKnN1YnN0UGF0dGVybjsJICAgIC8qIHN1YnN0aXR1dGlvbnMgZm9yIHBhdHRlcm5zICovCiAgICBGY1N1YnN0CSpzdWJzdEZvbnQ7CSAgICAvKiBzdWJzdGl0dXRpb25zIGZvciBmb250cyAqLwogICAgaW50CQltYXhPYmplY3RzOwkgICAgLyogbWF4aW11bSBudW1iZXIgb2YgdGVzdHMgaW4gYWxsIHN1YnN0cyAqLwogICAgLyoKICAgICAqIFRoZSBzZXQgb2YgZm9udHMgbG9hZGVkIGZyb20gdGhlIGxpc3RlZCBkaXJlY3RvcmllczsgdGhlCiAgICAgKiBvcmRlciB3aXRoaW4gdGhlIHNldCBkb2VzIG5vdCBkZXRlcm1pbmUgdGhlIGZvbnQgc2VsZWN0aW9uLAogICAgICogZXhjZXB0IGluIHRoZSBjYXNlIG9mIGlkZW50aWNhbCBtYXRjaGVzIGluIHdoaWNoIGNhc2UgZWFybGllciBmb250cwogICAgICogbWF0Y2ggcHJlZmVycmVudGlhbGx5CiAgICAgKi8KICAgIEZjRm9udFNldAkqZm9udHNbRmNTZXRBcHBsaWNhdGlvbiArIDFdOwogICAgLyoKICAgICAqIEZvbnRjb25maWcgY2FuIHBlcmlvZGljYWxseSByZXNjYW4gdGhlIHN5c3RlbSBjb25maWd1cmF0aW9uCiAgICAgKiBhbmQgZm9udCBkaXJlY3Rvcmllcy4gIFRoaXMgcmVzY2FubmluZyBvY2N1cnMgd2hlbiBmb250CiAgICAgKiBsaXN0aW5nIHJlcXVlc3RzIGFyZSBtYWRlLCBidXQgbm8gbW9yZSBvZnRlbiB0aGFuIHJlc2NhbkludGVydmFsCiAgICAgKiBzZWNvbmRzIGFwYXJ0LgogICAgICovCiAgICB0aW1lX3QJcmVzY2FuVGltZTsJICAgIC8qIGxhc3QgdGltZSBpbmZvcm1hdGlvbiB3YXMgc2Nhbm5lZCAqLwogICAgaW50CQlyZXNjYW5JbnRlcnZhbDsJICAgIC8qIGludGVydmFsIGJldHdlZW4gc2NhbnMgKi8KfTsKIApleHRlcm4gRmNDb25maWcJKl9mY0NvbmZpZzsKCnR5cGVkZWYgc3RydWN0IF9GY0NoYXJNYXAgRmNDaGFyTWFwOwoKLyogZmNibGFua3MuYyAqLwoKLyogZmNjYWNoZS5jICovCgpGY0dsb2JhbENhY2hlICoKRmNHbG9iYWxDYWNoZUNyZWF0ZSAodm9pZCk7Cgp2b2lkCkZjR2xvYmFsQ2FjaGVEZXN0cm95IChGY0dsb2JhbENhY2hlICpjYWNoZSk7CgpGY0Jvb2wKRmNHbG9iYWxDYWNoZUNoZWNrVGltZSAoRmNHbG9iYWxDYWNoZUluZm8gKmluZm8pOwoKdm9pZApGY0dsb2JhbENhY2hlUmVmZXJlbmNlZCAoRmNHbG9iYWxDYWNoZQkgICAgKmNhY2hlLAoJCQkgRmNHbG9iYWxDYWNoZUluZm8gICppbmZvKTsKCkZjR2xvYmFsQ2FjaGVEaXIgKgpGY0dsb2JhbENhY2hlRGlyR2V0IChGY0dsb2JhbENhY2hlICAqY2FjaGUsCgkJICAgICBjb25zdCBGY0NoYXI4ICAqZGlyLAoJCSAgICAgaW50CSAgICBsZW4sCgkJICAgICBGY0Jvb2wJICAgIGNyZWF0ZV9taXNzaW5nKTsKCkZjQm9vbApGY0dsb2JhbENhY2hlU2NhbkRpciAoRmNGb250U2V0CQkqc2V0LAoJCSAgICAgIEZjU3RyU2V0CQkqZGlycywKCQkgICAgICBGY0dsb2JhbENhY2hlCSpjYWNoZSwKCQkgICAgICBjb25zdCBGY0NoYXI4CSpkaXIpOwoKRmNHbG9iYWxDYWNoZUZpbGUgKgpGY0dsb2JhbENhY2hlRmlsZUdldCAoRmNHbG9iYWxDYWNoZSAqY2FjaGUsCgkJICAgICAgY29uc3QgRmNDaGFyOCAqZmlsZSwKCQkgICAgICBpbnQJICAgIGlkLAoJCSAgICAgIGludAkgICAgKmNvdW50KTsKCgp2b2lkCkZjR2xvYmFsQ2FjaGVMb2FkIChGY0dsb2JhbENhY2hlICAgICpjYWNoZSwKCQkgICBjb25zdCBGY0NoYXI4ICAgICpjYWNoZV9maWxlKTsKCkZjQm9vbApGY0dsb2JhbENhY2hlVXBkYXRlIChGY0dsb2JhbENhY2hlICAqY2FjaGUsCgkJICAgICBjb25zdCBGY0NoYXI4ICAqZmlsZSwKCQkgICAgIGludAkgICAgaWQsCgkJICAgICBjb25zdCBGY0NoYXI4ICAqbmFtZSk7CgpGY0Jvb2wKRmNHbG9iYWxDYWNoZVNhdmUgKEZjR2xvYmFsQ2FjaGUgICAgKmNhY2hlLAoJCSAgIGNvbnN0IEZjQ2hhcjggICAgKmNhY2hlX2ZpbGUpOwoKRmNCb29sCkZjRGlyQ2FjaGVSZWFkRGlyIChGY0ZvbnRTZXQgKnNldCwgRmNTdHJTZXQgKmRpcnMsIGNvbnN0IEZjQ2hhcjggKmRpcik7CgpGY0Jvb2wKRmNEaXJDYWNoZVdyaXRlRGlyIChGY0ZvbnRTZXQgKnNldCwgRmNTdHJTZXQgKmRpcnMsIGNvbnN0IEZjQ2hhcjggKmRpcik7CiAgICAKLyogZmNjZmcuYyAqLwoKRmNCb29sCkZjQ29uZmlnQWRkQ29uZmlnRGlyIChGY0NvbmZpZwkgICAgKmNvbmZpZywKCQkgICAgICBjb25zdCBGY0NoYXI4ICpkKTsKCkZjQm9vbApGY0NvbmZpZ0FkZEZvbnREaXIgKEZjQ29uZmlnCSAgICAqY29uZmlnLAoJCSAgICBjb25zdCBGY0NoYXI4ICAgKmQpOwoKRmNCb29sCkZjQ29uZmlnQWRkRGlyIChGY0NvbmZpZwkqY29uZmlnLAoJCWNvbnN0IEZjQ2hhcjgJKmQpOwoKRmNCb29sCkZjQ29uZmlnQWRkQ29uZmlnRmlsZSAoRmNDb25maWcJCSpjb25maWcsCgkJICAgICAgIGNvbnN0IEZjQ2hhcjgJKmYpOwoKRmNCb29sCkZjQ29uZmlnU2V0Q2FjaGUgKEZjQ29uZmlnCSpjb25maWcsCgkJICBjb25zdCBGY0NoYXI4CSpjKTsKCkZjQm9vbApGY0NvbmZpZ0FkZEJsYW5rIChGY0NvbmZpZwkqY29uZmlnLAoJCSAgRmNDaGFyMzIgICAgCWJsYW5rKTsKCkZjQm9vbApGY0NvbmZpZ0FkZEVkaXQgKEZjQ29uZmlnCSpjb25maWcsCgkJIEZjVGVzdAkJKnRlc3QsCgkJIEZjRWRpdAkJKmVkaXQsCgkJIEZjTWF0Y2hLaW5kCWtpbmQpOwoKdm9pZApGY0NvbmZpZ1NldEZvbnRzIChGY0NvbmZpZwkqY29uZmlnLAoJCSAgRmNGb250U2V0CSpmb250cywKCQkgIEZjU2V0TmFtZQlzZXQpOwoKRmNCb29sCkZjQ29uZmlnQ29tcGFyZVZhbHVlIChjb25zdCBGY1ZhbHVlIG0sCgkJICAgICAgRmNPcAkgICAgb3AsCgkJICAgICAgY29uc3QgRmNWYWx1ZSB2KTsKCi8qIGZjY2hhcnNldC5jICovCkZjQ2hhclNldCAqCkZjQ2hhclNldEZyZWV6ZSAoRmNDaGFyU2V0ICpjcyk7CgpGY0Jvb2wKRmNOYW1lVW5wYXJzZUNoYXJTZXQgKEZjU3RyQnVmICpidWYsIGNvbnN0IEZjQ2hhclNldCAqYyk7CgpGY0NoYXJTZXQgKgpGY05hbWVQYXJzZUNoYXJTZXQgKEZjQ2hhcjggKnN0cmluZyk7CgpGY0NoYXIzMgpGY0ZyZWVUeXBlVWNzNFRvUHJpdmF0ZSAoRmNDaGFyMzIgdWNzNCwgY29uc3QgRmNDaGFyTWFwICptYXApOwoKRmNDaGFyMzIKRmNGcmVlVHlwZVByaXZhdGVUb1VjczQgKEZjQ2hhcjMyIHByaXZhdGUsIGNvbnN0IEZjQ2hhck1hcCAqbWFwKTsKCmNvbnN0IEZjQ2hhck1hcCAqCkZjRnJlZVR5cGVHZXRQcml2YXRlTWFwIChGVF9FbmNvZGluZyBlbmNvZGluZyk7CiAgICAKLyogZmNkYmcuYyAqLwp2b2lkCkZjVmFsdWVMaXN0UHJpbnQgKGNvbnN0IEZjVmFsdWVMaXN0ICpsKTsKCnZvaWQKRmNPcFByaW50IChGY09wIG9wKTsKCnZvaWQKRmNUZXN0UHJpbnQgKGNvbnN0IEZjVGVzdCAqdGVzdCk7Cgp2b2lkCkZjRXhwclByaW50IChjb25zdCBGY0V4cHIgKmV4cHIpOwoKdm9pZApGY0VkaXRQcmludCAoY29uc3QgRmNFZGl0ICplZGl0KTsKCnZvaWQKRmNTdWJzdFByaW50IChjb25zdCBGY1N1YnN0ICpzdWJzdCk7CgppbnQKRmNEZWJ1ZyAodm9pZCk7CgovKiBmY2Rpci5jICovCgovKiBmY2ZvbnQuYyAqLwppbnQKRmNGb250RGVidWcgKHZvaWQpOwogICAgCi8qIGZjZnJlZXR5cGUuYyAqLwpGY0Jvb2wKRmNGcmVlVHlwZUlzRXhjbHVzaXZlTGFuZyAoY29uc3QgRmNDaGFyOCAgKmxhbmcpOwoKRmNCb29sCkZjRnJlZVR5cGVIYXNMYW5nIChGY1BhdHRlcm4gKnBhdHRlcm4sIGNvbnN0IEZjQ2hhcjggKmxhbmcpOwoKLyogZmNmcy5jICovCi8qIGZjZ3JhbS55ICovCmludApGY0NvbmZpZ3BhcnNlICh2b2lkKTsKCmludApGY0NvbmZpZ3dyYXAgKHZvaWQpOwogICAgCnZvaWQKRmNDb25maWdlcnJvciAoY2hhciAqZm10LCAuLi4pOwogICAgCmNoYXIgKgpGY0NvbmZpZ1NhdmVGaWVsZCAoY29uc3QgY2hhciAqZmllbGQpOwoKRmNUZXN0ICoKRmNUZXN0Q3JlYXRlIChGY01hdGNoS2luZCAgIGtpbmQsCgkgICAgICBGY1F1YWwJICAgIHF1YWwsCgkgICAgICBjb25zdCBGY0NoYXI4ICpmaWVsZCwKCSAgICAgIEZjT3AJICAgIGNvbXBhcmUsCgkgICAgICBGY0V4cHIJICAgICpleHByKTsKCnZvaWQKRmNUZXN0RGVzdHJveSAoRmNUZXN0ICp0ZXN0KTsKCkZjRXhwciAqCkZjRXhwckNyZWF0ZUludGVnZXIgKGludCBpKTsKCkZjRXhwciAqCkZjRXhwckNyZWF0ZURvdWJsZSAoZG91YmxlIGQpOwoKRmNFeHByICoKRmNFeHByQ3JlYXRlU3RyaW5nIChjb25zdCBGY0NoYXI4ICpzKTsKCkZjRXhwciAqCkZjRXhwckNyZWF0ZU1hdHJpeCAoY29uc3QgRmNNYXRyaXggKm0pOwoKRmNFeHByICoKRmNFeHByQ3JlYXRlQm9vbCAoRmNCb29sIGIpOwoKRmNFeHByICoKRmNFeHByQ3JlYXRlTmlsICh2b2lkKTsKCkZjRXhwciAqCkZjRXhwckNyZWF0ZUZpZWxkIChjb25zdCBjaGFyICpmaWVsZCk7CgpGY0V4cHIgKgpGY0V4cHJDcmVhdGVDb25zdCAoY29uc3QgRmNDaGFyOCAqY29uc3RhbnQpOwoKRmNFeHByICoKRmNFeHByQ3JlYXRlT3AgKEZjRXhwciAqbGVmdCwgRmNPcCBvcCwgRmNFeHByICpyaWdodCk7Cgp2b2lkCkZjRXhwckRlc3Ryb3kgKEZjRXhwciAqZSk7CgpGY0VkaXQgKgpGY0VkaXRDcmVhdGUgKGNvbnN0IGNoYXIgKmZpZWxkLCBGY09wIG9wLCBGY0V4cHIgKmV4cHIsIEZjVmFsdWVCaW5kaW5nIGJpbmRpbmcpOwoKdm9pZApGY0VkaXREZXN0cm95IChGY0VkaXQgKmUpOwoKLyogZmNpbml0LmMgKi8KCnZvaWQKRmNNZW1SZXBvcnQgKHZvaWQpOwoKdm9pZApGY01lbUFsbG9jIChpbnQga2luZCwgaW50IHNpemUpOwoKdm9pZApGY01lbUZyZWUgKGludCBraW5kLCBpbnQgc2l6ZSk7CgovKiBmY2xhbmcuYyAqLwpGY0xhbmdTZXQgKgpGY0ZyZWVUeXBlTGFuZ1NldCAoY29uc3QgRmNDaGFyU2V0ICAqY2hhcnNldCwgCgkJICAgY29uc3QgRmNDaGFyOCAgICAqZXhjbHVzaXZlTGFuZyk7CgpGY0xhbmdSZXN1bHQKRmNMYW5nQ29tcGFyZSAoY29uc3QgRmNDaGFyOCAqczEsIGNvbnN0IEZjQ2hhcjggKnMyKTsKICAgIApjb25zdCBGY0NoYXJTZXQgKgpGY0NoYXJTZXRGb3JMYW5nIChjb25zdCBGY0NoYXI4ICpsYW5nKTsKCkZjTGFuZ1NldCAqCkZjTGFuZ1NldFByb21vdGUgKGNvbnN0IEZjQ2hhcjggKmxhbmcpOwoKRmNMYW5nU2V0ICoKRmNOYW1lUGFyc2VMYW5nU2V0IChjb25zdCBGY0NoYXI4ICpzdHJpbmcpOwoKRmNCb29sCkZjTmFtZVVucGFyc2VMYW5nU2V0IChGY1N0ckJ1ZiAqYnVmLCBjb25zdCBGY0xhbmdTZXQgKmxzKTsKCi8qIGZjbGlzdC5jICovCgovKiBmY21hdGNoLmMgKi8KCi8qIGZjbmFtZS5jICovCgpGY0Jvb2wKRmNOYW1lQm9vbCAoRmNDaGFyOCAqdiwgRmNCb29sICpyZXN1bHQpOwoKLyogZmNwYXQuYyAqLwp2b2lkCkZjVmFsdWVMaXN0RGVzdHJveSAoRmNWYWx1ZUxpc3QgKmwpOwogICAgCkZjUGF0dGVybkVsdCAqCkZjUGF0dGVybkZpbmRFbHQgKGNvbnN0IEZjUGF0dGVybiAqcCwgY29uc3QgY2hhciAqb2JqZWN0KTsKCkZjUGF0dGVybkVsdCAqCkZjUGF0dGVybkluc2VydEVsdCAoRmNQYXR0ZXJuICpwLCBjb25zdCBjaGFyICpvYmplY3QpOwoKRmNCb29sCkZjUGF0dGVybkFkZFdpdGhCaW5kaW5nICAoRmNQYXR0ZXJuCSAgICAqcCwKCQkJICBjb25zdCBjaGFyCSAgICAqb2JqZWN0LAoJCQkgIEZjVmFsdWUJICAgIHZhbHVlLAoJCQkgIEZjVmFsdWVCaW5kaW5nICAgIGJpbmRpbmcsCgkJCSAgRmNCb29sCSAgICBhcHBlbmQpOwoKRmNQYXR0ZXJuICoKRmNQYXR0ZXJuRnJlZXplIChGY1BhdHRlcm4gKnApOwoKLyogZmNyZW5kZXIuYyAqLwoKLyogZmNtYXRyaXguYyAqLwoKZXh0ZXJuIGNvbnN0IEZjTWF0cml4ICAgIEZjSWRlbnRpdHlNYXRyaXg7Cgp2b2lkCkZjTWF0cml4RnJlZSAoRmNNYXRyaXggKm1hdCk7CgovKiBmY3N0ci5jICovCkZjQ2hhcjggKgpGY1N0clBsdXMgKGNvbnN0IEZjQ2hhcjggKnMxLCBjb25zdCBGY0NoYXI4ICpzMik7CiAgICAKdm9pZApGY1N0ckZyZWUgKEZjQ2hhcjggKnMpOwoKdm9pZApGY1N0ckJ1ZkluaXQgKEZjU3RyQnVmICpidWYsIEZjQ2hhcjggKmluaXQsIGludCBzaXplKTsKCnZvaWQKRmNTdHJCdWZEZXN0cm95IChGY1N0ckJ1ZiAqYnVmKTsKCkZjQ2hhcjggKgpGY1N0ckJ1ZkRvbmUgKEZjU3RyQnVmICpidWYpOwoKRmNCb29sCkZjU3RyQnVmQ2hhciAoRmNTdHJCdWYgKmJ1ZiwgRmNDaGFyOCBjKTsKCkZjQm9vbApGY1N0ckJ1ZlN0cmluZyAoRmNTdHJCdWYgKmJ1ZiwgY29uc3QgRmNDaGFyOCAqcyk7CgpGY0Jvb2wKRmNTdHJCdWZEYXRhIChGY1N0ckJ1ZiAqYnVmLCBjb25zdCBGY0NoYXI4ICpzLCBpbnQgbGVuKTsKCmludApGY1N0ckNtcElnbm9yZUJsYW5rc0FuZENhc2UgKGNvbnN0IEZjQ2hhcjggKnMxLCBjb25zdCBGY0NoYXI4ICpzMik7CgojZW5kaWYgLyogX0ZDX0lOVF9IXyAqLwo=