LyoKQ29weXJpZ2h0IChjKSAyMDExLTIwMTIsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgoKUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Cm1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKbWV0OgogICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAogICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCiAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKICAgICAgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkCiAgICAgIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBUaGUgTGludXggRm91bmRhdGlvbiBub3IgdGhlIG5hbWVzIG9mIGl0cwogICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgoKVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECldBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCk1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTi1JTkZSSU5HRU1FTlQKQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUwpCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCkNPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GClNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUgpCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwKV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UKT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTgpJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKi8KCiNpZm5kZWYgX19NTV9DQU1FUkFfSU5URVJGQUNFMl9IX18KI2RlZmluZSBfX01NX0NBTUVSQV9JTlRFUkZBQ0UyX0hfXwojaW5jbHVkZSA8bGludXgvbXNtX2lvbi5oPgojaW5jbHVkZSA8bGludXgvdmlkZW9kZXYyLmg+CiNpbmNsdWRlIDxtZWRpYS9tc21fY2FtZXJhLmg+CiNpbmNsdWRlICJRQ2FtZXJhX0ludGYuaCIKI2luY2x1ZGUgIm1tX29teF9qcGVnX2VuY29kZXIuaCIKCiNkZWZpbmUgTU1fQ0FNRVJBX01BWF9OVU1fRlJBTUVTICAgICAgICAxNgoKdHlwZWRlZiBzdHJ1Y3QgewogICAgaW50IG51bTsKICAgIHVpbnQzMl90IGZyYW1lX2xlbjsKICAgIHN0cnVjdCBtc21fZnJhbWUgZnJhbWVbTU1fQ0FNRVJBX01BWF9OVU1fRlJBTUVTXTsKfSBtbV9jYW1lYXJhX3N0cmVhbV9idWZfdDsKCnR5cGVkZWYgc3RydWN0IHsKICAgIGludDMyX3Qgd2lkdGg7CiAgICBpbnQzMl90IGhlaWdodDsKfW1tX2NhbWVyYV9kaW1lbnNpb25fdDsKCnR5cGVkZWYgZW51bSB7CiAgICBNTV9DQU1FUkFfT0ssCiAgICBNTV9DQU1FUkFfRV9HRU5FUkFMLAogICAgTU1fQ0FNRVJBX0VfTk9fTUVNT1JZLAogICAgTU1fQ0FNRVJBX0VfTk9UX1NVUFBPUlRFRCwKICAgIE1NX0NBTUVSQV9FX0lOVkFMSURfSU5QVVQsCiAgICBNTV9DQU1FUkFfRV9JTlZBTElEX09QRVJBVElPTiwgLyogNSAqLwogICAgTU1fQ0FNRVJBX0VfRU5DT0RFLAogICAgTU1fQ0FNRVJBX0VfQlVGRkVSX1JFRywKICAgIE1NX0NBTUVSQV9FX1BNRU1fQUxMT0MsCiAgICBNTV9DQU1FUkFfRV9DQVBUVVJFX0ZBSUxFRCwKICAgIE1NX0NBTUVSQV9FX0NBUFRVUkVfVElNRU9VVCwgLyogMTAgKi8KfW1tX2NhbWVyYV9zdGF0dXNfdHlwZV90OwoKdHlwZWRlZiBlbnVtIHsKICAgIE1NX0NBTUVSQV9PUF9NT0RFX05PVFVTRUQsCiAgICBNTV9DQU1FUkFfT1BfTU9ERV9DQVBUVVJFLAogICAgTU1fQ0FNRVJBX09QX01PREVfVklERU8sCiAgICBNTV9DQU1FUkFfT1BfTU9ERV9aU0wsCiAgICBNTV9DQU1FUkFfT1BfTU9ERV9NQVgKfW1tX2NhbWVyYV9vcF9tb2RlX3R5cGVfdDsKCiNkZWZpbmUgTU1fQ0FNRVJBX1BBUk1fU1VQUE9SVF9TRVQgICAgICAweDAxCiNkZWZpbmUgTU1fQ0FNRVJBX1BBUk1fU1VQUE9SVF9HRVQgICAgICAweDAyCiNkZWZpbmUgTU1fQ0FNRVJBX1BBUk1fU1VQUE9SVF9CT1RIICAgICAweDAzCgp0eXBlZGVmIHN0cnVjdCAgewogICAgaW50MzJfdCBsZWZ0OwogICAgaW50MzJfdCB0b3A7CiAgICBpbnQzMl90IHdpZHRoOwogICAgaW50MzJfdCBoZWlnaHQ7Cn0gbW1fY2FtZXJhX3JlY3RfdDsKCnR5cGVkZWYgZW51bSB7CiAgICBXSElURV9CQUxBTkNFX0FVVE8gICAgICAgICA9IDEsCiAgICBXSElURV9CQUxBTkNFX0lOQ0FOREVTQ0VOVCA9IDMsCiAgICBXSElURV9CQUxBTkNFX0ZMVU9SRVNDRU5UICA9IDQsCiAgICBXSElURV9CQUxBTkNFX0RBWUxJR0hUICAgICA9IDUsCiAgICBXSElURV9CQUxBTkNFX0NMT1VEWSAgICAgICA9IDYsCiAgICBXSElURV9CQUxBTkNFX09GRiAgICAgICAgICA9IDksCn0gV2hpdGVfQmFsYW5jZV9tb2RlczsKCnR5cGVkZWYgZW51bSB7CiAgICBNTV9DQU1FUkFfQ0hfUFJFVklFVywKICAgIE1NX0NBTUVSQV9DSF9WSURFTywKICAgIE1NX0NBTUVSQV9DSF9TTkFQU0hPVCwKICAgIE1NX0NBTUVSQV9DSF9SQVcsCiAgICBNTV9DQU1FUkFfQ0hfTUFYCn0gbW1fY2FtZXJhX2NoYW5uZWxfdHlwZV90OwoKdHlwZWRlZiBlbnVtIHsKICAgIE1NX0NBTUVSQV9XSElURV9CQUxBTkNFX0FVVE8gICAgICAgICA9IDEsCiAgICBNTV9DQU1FUkFfV0hJVEVfQkFMQU5DRV9PRkYgICAgICAgICAgPSAyLAogICAgTU1fQ0FNRVJBX1dISVRFX0JBTEFOQ0VfREFZTElHSFQgICAgID0gMywKICAgIE1NX0NBTUVSQV9XSElURV9CQUxBTkNFX0lOQ0FOREVTQ0VOVCA9IDQsCiAgICBNTV9DQU1FUkFfV0hJVEVfQkFMQU5DRV9GTFVPUkVTQ0VOVCAgPSA1LAp9IG1tX2NhbWVyYV93aGl0ZV9iYWxhbmNlX21vZGVfdHlwZV90OwovKiBNTV9DQU1FUkFfUEFSTV9SQVdfSU1BR0VfRk1UICovCnR5cGVkZWYgc3RydWN0IHsKICAgIGNhbV9mb3JtYXRfdCBmbXQ7CiAgICBtbV9jYW1lcmFfZGltZW5zaW9uX3QgZGltOwp9IG1tX2NhbWVyYV9pbWFnZV9mbXRfdDsKCnR5cGVkZWYgc3RydWN0IHsKICAgIG1tX2NhbWVyYV9pbWFnZV9mbXRfdCBtYWluOwogICAgbW1fY2FtZXJhX2ltYWdlX2ZtdF90IHRodW1ibmFpbDsKfSBtbV9jYW1lcmFfY2hfaW1hZ2VfZm10X3NuYXBzaG90X3Q7Cgp0eXBlZGVmIGVudW0gewogICAgTU1fQ0FNRVJBX1JBV19TVFJFQU1JTkdfQ0FQVFVSRV9TSU5HTEUsCiAgICBNTV9DQU1FUkFfUkFXX1NUUkVBTUlOR19NQVgKfSBtbV9jYW1lcmFfcmF3X3N0cmVhbWluZ190eXBlX3Q7Cgp0eXBlZGVmIHN0cnVjdCB7CiAgICBtbV9jYW1lcmFfaW1hZ2VfZm10X3QgbWFpbjsKICAgIG1tX2NhbWVyYV9pbWFnZV9mbXRfdCB2aWRlbzsKfSBtbV9jYW1lcmFfY2hfaW1hZ2VfZm10X3ZpZGVvX3Q7Cgp0eXBlZGVmIHN0cnVjdCB7CiAgICBtbV9jYW1lcmFfY2hhbm5lbF90eXBlX3QgY2hfdHlwZTsKICAgIHVuaW9uIHsKICAgICAgICBtbV9jYW1lcmFfaW1hZ2VfZm10X3QgZGVmOwogICAgICAgIG1tX2NhbWVyYV9jaF9pbWFnZV9mbXRfc25hcHNob3RfdCBzbmFwc2hvdDsKICAgICAgICBtbV9jYW1lcmFfY2hfaW1hZ2VfZm10X3ZpZGVvX3QgdmlkZW87CiAgICB9Owp9IG1tX2NhbWVyYV9jaF9pbWFnZV9mbXRfcGFybV90Owp0eXBlZGVmIHN0cnVjdCB7CiAgICBtbV9jYW1lcmFfcmVjdF90IG1haW5fY3JvcDsKICAgIG1tX2NhbWVyYV9yZWN0X3QgdGh1bWJuYWlsX2Nyb3A7Cn0gbW1fY2FtZXJhX2Nyb3Bfc25hcHNob3RfdDsKCnR5cGVkZWYgc3RydWN0IHsKICAgIG1tX2NhbWVyYV9jaGFubmVsX3R5cGVfdCBjaF90eXBlOwogICAgdW5pb24gewogICAgbW1fY2FtZXJhX3JlY3RfdCBjcm9wOwogICAgbW1fY2FtZXJhX2Nyb3Bfc25hcHNob3RfdCBzbmFwc2hvdDsKICAgIH07Cn0gbW1fY2FtZXJhX2NoX2Nyb3BfdDsKCnR5cGVkZWYgc3RydWN0IHsKICAgIHVpbnQ4X3QgbmFtZVszMl07CiAgICBpbnQzMl90IG1pbl92YWx1ZTsKICAgIGludDMyX3QgbWF4X3ZhbHVlOwogICAgaW50MzJfdCBzdGVwOwogICAgaW50MzJfdCBkZWZhdWx0X3ZhbHVlOwp9IG1tX2NhbWVyYV9jdHJsX2NhcF9zaGFycG5lc3NfdDsKCnR5cGVkZWYgc3RydWN0IHsKICAgIGludDE2X3QgKnpvb21fcmF0aW9fdGJsOwogICAgaW50MzJfdCBzaXplOwp9IG1tX2NhbWVyYV96b29tX3RibF90OwoKI2RlZmluZSBNTV9DQU1FUkFfTUFYX0ZSQU1FX05VTSAxNgoKdHlwZWRlZiBzdHJ1Y3QgewogICAgdWludDMyX3QgKmZyYW1lX29mZnNldDsKICAgIHN0cnVjdCBtc21fZnJhbWUgKmZyYW1lOwp9IG1tX2NhbWVyYV9zcF9idWZfdDsKCnR5cGVkZWYgc3RydWN0IHsKICAgIGludDhfdCBudW1fcGxhbmVzOwogICAgc3RydWN0IHY0bDJfcGxhbmUgcGxhbmVzW1ZJREVPX01BWF9QTEFORVNdOwogICAgdWludDMyX3QgZnJhbWVfb2Zmc2V0OwogICAgc3RydWN0IG1zbV9mcmFtZSBmcmFtZTsKICAgIGludCBpZHg7IC8qIGluZGV4IHRvIHN0cmVhbSBmcmFtZSAqLwp9IG1tX2NhbWVyYV9tcF9idWZfdDsKCnR5cGVkZWYgc3RydWN0IHsKICBpbnQ4X3QgbnVtOwogIHVuaW9uIHsKICAgICAgbW1fY2FtZXJhX3NwX2J1Zl90IHNwOwogICAgICBtbV9jYW1lcmFfbXBfYnVmX3QgKm1wOwogIH1idWY7Cn0gbW1fY2FtZXJhX2J1Zl9kZWZfdDsKCnR5cGVkZWYgc3RydWN0IHsKICAgIG1tX2NhbWVyYV9idWZfZGVmX3QgdGh1bWJuYWlsOwogICAgbW1fY2FtZXJhX2J1Zl9kZWZfdCBtYWluOwp9IG1tX2NhbWVyYV9idWZfc25hcHNob3RfdDsKCnR5cGVkZWYgc3RydWN0IHsKICAgIG1tX2NhbWVyYV9idWZfZGVmX3QgdmlkZW87CiAgICBtbV9jYW1lcmFfYnVmX2RlZl90IG1haW47Cn0gbW1fY2FtZXJhX2J1Zl92aWRlb190OwoKdHlwZWRlZiBzdHJ1Y3QgewogICAgbW1fY2FtZXJhX2NoYW5uZWxfdHlwZV90IGNoX3R5cGU7CiAgICB1bmlvbiB7CiAgICAgICAgbW1fY2FtZXJhX2J1Zl9kZWZfdCBkZWY7CiAgICAgICAgbW1fY2FtZXJhX2J1Zl9kZWZfdCBwcmV2aWV3OwogICAgICAgIG1tX2NhbWVyYV9idWZfc25hcHNob3RfdCBzbmFwc2hvdDsKICAgICAgICBtbV9jYW1lcmFfYnVmX3ZpZGVvX3QgdmlkZW87CiAgICB9Owp9IG1tX2NhbWVyYV9yZWdfYnVmX3Q7Cgp0eXBlZGVmIGVudW0gewogICAgTU1fQ0FNRVJBX09QU19QUkVWSUVXLCAgICAgICAgICAgICAgICAgICAgLy8gc3RhcnQvc3RvcCBwcmV2aWV3CiAgICBNTV9DQU1FUkFfT1BTX1ZJREVPLCAgICAgICAgICAgICAgICAgICAgICAvLyBzdGFydC9zdG9wIHZpZGVvCiAgICBNTV9DQU1FUkFfT1BTX1BSRVBBUkVfU05BUFNIT1QsICAgICAgICAgICAvLyBwcmVwYXJlIGNhcHR1cmUgaW4gY2FwdHVyZSBtb2RlCiAgICBNTV9DQU1FUkFfT1BTX1NOQVBTSE9ULCAgICAgICAgICAgICAgICAgICAvLyB0YWtlIHNuYXBzaG90IChIRFIsWlNMLGxpdmUgc2hvdCkKICAgIE1NX0NBTUVSQV9PUFNfUkFXLCAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRha2UgcmF3IHN0cmVhbWluZyAocmF3IHNuYXBzaG90LCBldGMpCiAgICBNTV9DQU1FUkFfT1BTX1pTTCwgICAgICAgICAgICAgICAgICAgICAgICAvLyBzdGFydC9zdG9wIHpzbAogICAgLy8gbW1fY2FtZXJhX29wc19wYXJtX2dldF9idWZmZXJlZF9mcmFtZV90IGlzIHVzZWQgZm9yIE1NX0NBTUVSQV9PUFNfR0VUX0JVRkZFUkVEX0ZSQU1FCiAgICBNTV9DQU1FUkFfT1BTX0dFVF9CVUZGRVJFRF9GUkFNRSwgICAgICAgICAvLyBjaGFubmVsIHRvIGRpc3BhdGNoIGJ1ZmZlcmVkIGZyYW1lIHRvIGFwcCB0aHJvdWdoIGNhbGwgYmFjawogICAgTU1fQ0FNRVJBX09QU19GT0NVUywgICAgICAgICAgICAgICAgICAgICAgLy8gY2hhbmdlIGZvY3VzLGlzcDNhX2FmX21vZGVfdCogdXNlZCBpbiB2YWwKICAgIE1NX0NBTUVSQV9PUFNfTUFYICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1heCBvcHMKfW1tX2NhbWVyYV9vcHNfdHlwZV90OwoKLyogVGVtcDogV2UgYXJlIGRlY2xhcmluZyBpdCBoZXJlIHNvIHRoYXQgd2UgY2FuIHN0aWxsIHVzZSB0aGUKICAgIGxlZ2FjeSBHRVRfQ0FQQUJJTElUSUVTIGNhbGwgdG8gY29uZmlnIHRocmVhZC4gQSBuZXcgZGVzaWduCiAgICB0byBxdWVyeSBjYXBhYmlsaXRpZXMgYmFzZWQgb24gVjRMMiBpbnRlcmZhY2UgaXMgYmVpbmcKICAgIGRpc2N1c3NlZC4gKi8KdHlwZWRlZiBlbnVtIHsKICAgIENBTUVSQV9PUFNfTE9DQUwgPSAtMSwgIC8qbm8gbmVlZCB0byBxdWVyeSBtbS1jYW1lcmEqLwogICAgQ0FNRVJBX09QU19TVFJFQU1JTkdfUFJFVklFVyA9IDAsCiAgICBDQU1FUkFfT1BTX1NUUkVBTUlOR19aU0wsCiAgICBDQU1FUkFfT1BTX1NUUkVBTUlOR19WSURFTywKICAgIENBTUVSQV9PUFNfQ0FQVFVSRSwgLypub3Qgc3VwcG9ydGVkKi8KICAgIENBTUVSQV9PUFNfRk9DVVMsCiAgICBDQU1FUkFfT1BTX0dFVF9QSUNUVVJFLCAvKjUqLwogICAgQ0FNRVJBX09QU19QUkVQQVJFX1NOQVBTSE9ULAogICAgQ0FNRVJBX09QU19TTkFQU0hPVCwKICAgIENBTUVSQV9PUFNfTElWRVNIT1QsCiAgICBDQU1FUkFfT1BTX1JBV19TTkFQU0hPVCwKICAgIENBTUVSQV9PUFNfVklERU9fUkVDT1JESU5HLCAvKjEwKi8KICAgIENBTUVSQV9PUFNfUkVHSVNURVJfQlVGRkVSLAogICAgQ0FNRVJBX09QU19VTlJFR0lTVEVSX0JVRkZFUiwKICAgIENBTUVSQV9PUFNfQ0FQVFVSRV9BTkRfRU5DT0RFLAogICAgQ0FNRVJBX09QU19SQVdfQ0FQVFVSRSwKICAgIENBTUVSQV9PUFNfRU5DT0RFLCAvKjE1Ki8KICAgIENBTUVSQV9PUFNfWlNMX1NUUkVBTUlOR19DQiwKICAgIC8qIGFkZCBuZXcgYWJvdmUqLwogICAgQ0FNRVJBX09QU19NQVgKfW1tX2NhbWVyYV9sZWdhY3lfb3BzX3R5cGVfdDsKCnR5cGVkZWYgZW51bSB7CiAgICBNTV9DQU1FUkFfQ0hfQVRUUl9SQVdfU1RSRUFNSU5HX1RZUEUsCiAgICBNTV9DQU1FUkFfQ0hfQVRUUl9CVUZGRVJJTkdfRlJBTUUsCiAgICBNTV9DQU1FUkFfQ0hfQVRUUl9NQVgKfSBtbV9jYW1lcmFfY2hhbm5lbF9hdHRyX3R5cGVfdDsKCnR5cGVkZWYgc3RydWN0IHsKICAgIC8qIGhvdyBkZWVwIHRoZSBjaXJjdWxhciBmcmFtZSBxdWV1ZSAqLwogICAgaW50IHdhdGVyX21hcms7CiAgICBpbnQgbG9va19iYWNrOwogICAgaW50IGludGVydmFsOyAgLypza2lwcGluZyBuLTEgZnJhbWVzKi8KfSBtbV9jYW1lcmFfY2hhbm5lbF9hdHRyX2J1ZmZlcmluZ19mcmFtZV90OwoKdHlwZWRlZiBzdHJ1Y3QgewogICAgbW1fY2FtZXJhX2NoYW5uZWxfYXR0cl90eXBlX3QgdHlwZTsKICAgIHVuaW9uIHsKICAgICAgICAvKiBhZGQgbW9yZSBpZiBuZWVkZWQgKi8KICAgICAgICBtbV9jYW1lcmFfcmF3X3N0cmVhbWluZ190eXBlX3QgcmF3X3N0cmVhbWluZ19tb2RlOwogICAgICAgIG1tX2NhbWVyYV9jaGFubmVsX2F0dHJfYnVmZmVyaW5nX2ZyYW1lX3QgYnVmZmVyaW5nX2ZyYW1lOwogICAgfTsKfSBtbV9jYW1lcmFfY2hhbm5lbF9hdHRyX3Q7Cgp0eXBlZGVmIHN0cnVjdCB7CiAgICBtbV9jYW1lcmFfY2hhbm5lbF90eXBlX3QgY2hfdHlwZTsKfSBtbV9jYW1lcmFfb3BzX3Bhcm1fZ2V0X2J1ZmZlcmVkX2ZyYW1lX3Q7Cgp0eXBlZGVmIHN0cnVjdCBtbV9jYW1lcmEgbW1fY2FtZXJhX3Q7Cgp0eXBlZGVmIHN0cnVjdCB7CiAgICAvKiBpZiB0aGUgcGFybSBpcyBzdXBwb3J0ZWQgKi8KICAgIHVpbnQ4X3QgKCppc19wYXJtX3N1cHBvcnRlZCkobW1fY2FtZXJhX3QgKmNhbWVyYSwgbW1fY2FtZXJhX3Bhcm1fdHlwZV90IHBhcm1fdHlwZSk7CiAgICAvKiBpZiB0aGUgY2hhbm5lbCBpcyBzdXBwb3J0ZWQgKi8KICAgIHVpbnQ4X3QgKCppc19jaF9zdXBwb3J0ZWQpKG1tX2NhbWVyYV90ICpjYW1lcmEsIG1tX2NhbWVyYV9jaGFubmVsX3R5cGVfdCBjaF90eXBlKTsKICAgIC8qIHNldCBhIHBhcm2ScyBjdXJyZW50IHZhbHVlICovCiAgICBpbnQzMl90ICgqc2V0X3Bhcm0pKG1tX2NhbWVyYV90ICpjYW1lcmEsIG1tX2NhbWVyYV9wYXJtX3R5cGVfdCBwYXJtX3R5cGUsCiAgICAgICAgICB2b2lkKiBwX3ZhbHVlKTsKICAgIC8qIGdldCBhIHBhcm2ScyBjdXJyZW50IHZhbHVlICovCiAgICBpbnQzMl90ICgqZ2V0X3Bhcm0pKG1tX2NhbWVyYV90ICpjYW1lcmEsIG1tX2NhbWVyYV9wYXJtX3R5cGVfdCBwYXJtX3R5cGUsCiAgICAgICAgICB2b2lkKiBwX3ZhbHVlKTsKICAgIGludDMyX3QgKCpyZXF1ZXN0X2J1ZikgKG1tX2NhbWVyYV90ICpjYW1lcmEsIG1tX2NhbWVyYV9yZWdfYnVmX3QgKmJ1Zik7CiAgICBpbnQzMl90ICgqZW5xdWV1ZV9idWYpIChtbV9jYW1lcmFfdCAqY2FtZXJhLCBtbV9jYW1lcmFfcmVnX2J1Zl90ICpidWYpOwogICAgaW50MzJfdCAoKnByZXBhcmVfYnVmKSAobW1fY2FtZXJhX3QgKmNhbWVyYSwgbW1fY2FtZXJhX3JlZ19idWZfdCAqYnVmKTsKICAgIGludDMyX3QgKCp1bnByZXBhcmVfYnVmKSAobW1fY2FtZXJhX3QgKmNhbWVyYSwgbW1fY2FtZXJhX2NoYW5uZWxfdHlwZV90IGNoX3R5cGUpOwp9IG1tX2NhbWVyYV9jb25maWdfdDsKCnR5cGVkZWYgc3RydWN0IHsKICAgIHVpbnQ4X3QgKCppc19vcF9zdXBwb3J0ZWQpKG1tX2NhbWVyYV90ICogY2FtZXJhLCBtbV9jYW1lcmFfb3BzX3R5cGVfdCBvcGNvZGUpOwogICAgLyogdmFsIGlzIHJlc2VydmVkIGZvciBzb21lIGFjdGlvbiBzdWNoIGFzIE1NX0NBTUVSQV9PUFNfRk9DVVMgKi8KICAgIGludDMyX3QgKCphY3Rpb24pKG1tX2NhbWVyYV90ICogY2FtZXJhLCB1aW50OF90IHN0YXJ0LAogICAgICAgICAgICAgICAgICAgIG1tX2NhbWVyYV9vcHNfdHlwZV90IG9wY29kZSwgdm9pZCAqdmFsKTsKICAgIGludDMyX3QgKCpvcGVuKShtbV9jYW1lcmFfdCAqIGNhbWVyYSwgbW1fY2FtZXJhX29wX21vZGVfdHlwZV90IG9wX21vZGUpOwogICAgdm9pZCAoKmNsb3NlKShtbV9jYW1lcmFfdCAqIGNhbWVyYSk7CiAgICB2b2lkICgqc3RvcCkobW1fY2FtZXJhX3QgKiBjYW1lcmEpOwogICAgaW50MzJfdCAoKmNoX2FjcXVpcmUpKG1tX2NhbWVyYV90ICogY2FtZXJhLCBtbV9jYW1lcmFfY2hhbm5lbF90eXBlX3QgY2hfdHlwZSk7CiAgICB2b2lkICgqY2hfcmVsZWFzZSkobW1fY2FtZXJhX3QgKiBjYW1lcmEsIG1tX2NhbWVyYV9jaGFubmVsX3R5cGVfdCBjaF90eXBlKTsKICAgIGludDMyX3QgKCpjaF9zZXRfYXR0cikobW1fY2FtZXJhX3QgKiBjYW1lcmEsIG1tX2NhbWVyYV9jaGFubmVsX3R5cGVfdCBjaF90eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW1fY2FtZXJhX2NoYW5uZWxfYXR0cl90ICphdHRyKTsKICAgIGludDMyX3QgKCpzZW5kbXNnKShtbV9jYW1lcmFfdCAqIGNhbWVyYSwgdm9pZCAqbXNnLCB1aW50MzJfdCBidWZfc2l6ZSwgaW50IHNlbmRmZCk7Cn0gbW1fY2FtZXJhX29wc190OwoKdHlwZWRlZiBzdHJ1Y3QgewogICAgaW50IHR5cGU7CiAgICB1aW50MzJfdCBsZW5ndGg7CiAgICB2b2lkICp2YWx1ZTsKfSBtbV9jYW1lcmFfc3RhdHNfdDsKCnR5cGVkZWYgc3RydWN0IHsKICAgIGludCBpZHg7CiAgICBzdHJ1Y3QgbXNtX2ZyYW1lICpmcmFtZTsKfSBtbV9jYW1lcmFfbm90aWZ5X2ZyYW1lX3Q7Cgp0eXBlZGVmIHN0cnVjdCB7CiAgICBtbV9jYW1lcmFfbm90aWZ5X2ZyYW1lX3QgdmlkZW87CiAgICBtbV9jYW1lcmFfbm90aWZ5X2ZyYW1lX3QgbWFpbjsKfSBtbV9jYW1lcmFfbm90aWZ5X3ZpZGVvX2J1Zl90OwoKdHlwZWRlZiBzdHJ1Y3QgewogICAgbW1fY2FtZXJhX25vdGlmeV9mcmFtZV90IHRodW1ibmFpbDsKICAgIG1tX2NhbWVyYV9ub3RpZnlfZnJhbWVfdCBtYWluOwp9IG1tX2NhbWVyYV9ub3RpZnlfc25hcHNob3RfYnVmX3Q7Cgp0eXBlZGVmIHN0cnVjdCB7CiAgICBtbV9jYW1lcmFfY2hhbm5lbF90eXBlX3QgdHlwZTsKLy8gICAgdW5pb24gewogICAgICAgIG1tX2NhbWVyYV9ub3RpZnlfc25hcHNob3RfYnVmX3Qgc25hcHNob3Q7CiAgICAgICAgbW1fY2FtZXJhX25vdGlmeV92aWRlb19idWZfdCB2aWRlbzsKICAgICAgICBtbV9jYW1lcmFfbm90aWZ5X2ZyYW1lX3QgZGVmOwovLyAgICB9Owp9IG1tX2NhbWVyYV9jaF9kYXRhX2J1Zl90OwoKCnR5cGVkZWYgZW51bSB7CiAgICBNTV9DQU1FUkFfUkVHX0JVRl9DQl9PTkNFLAogICAgTU1fQ0FNRVJBX1JFR19CVUZfQ0JfQ09VTlQsCiAgICBNTV9DQU1FUkFfUkVHX0JVRl9DQl9JTkZJTklURQp9IG1tX2NhbWVyYV9yZWdpc3Rlcl9idWZfY2JfdHlwZV90OwoKdHlwZWRlZiB2b2lkICgqbW1fY2FtZXJhX2V2ZW50X25vdGlmeV90KShtbV9jYW1lcmFfZXZlbnRfdCAqZXZ0LAogICAgdm9pZCAqdXNlcl9kYXRhKTsKCnR5cGVkZWYgdm9pZCAoKm1tX2NhbWVyYV9idWZfbm90aWZ5X3QpKG1tX2NhbWVyYV9jaF9kYXRhX2J1Zl90ICpidWZzLAogICAgdm9pZCAqdXNlcl9kYXRhKTsKCnR5cGVkZWYgc3RydWN0IHsKICAgIHVpbnQ4X3QgKCppc19ldmVudF9zdXBwb3J0ZWQpKG1tX2NhbWVyYV90ICogY2FtZXJhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbV9jYW1lcmFfZXZlbnRfdHlwZV90IGV2dF90eXBlKTsKICAgIGludDMyX3QgKCpyZWdpc3Rlcl9ldmVudF9ub3RpZnkpKG1tX2NhbWVyYV90ICogY2FtZXJhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbV9jYW1lcmFfZXZlbnRfbm90aWZ5X3QgZXZ0X2NiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqIHVzZXJfZGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW1fY2FtZXJhX2V2ZW50X3R5cGVfdCBldnRfdHlwZSk7CiAgICBpbnQzMl90ICgqcmVnaXN0ZXJfYnVmX25vdGlmeSkobW1fY2FtZXJhX3QgKiBjYW1lcmEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW1fY2FtZXJhX2NoYW5uZWxfdHlwZV90IGNoX3R5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW1fY2FtZXJhX2J1Zl9ub3RpZnlfdCBidWZfY2IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW1fY2FtZXJhX3JlZ2lzdGVyX2J1Zl9jYl90eXBlX3QgY2JfdHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjYl9jb3VudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICogdXNlcl9kYXRhKTsKICAgIGludDMyX3QgKCpidWZfZG9uZSkobW1fY2FtZXJhX3QgKiBjYW1lcmEsIG1tX2NhbWVyYV9jaF9kYXRhX2J1Zl90ICpidWZzKTsKfSBtbV9jYW1lcmFfbm90aWZ5X3Q7Cgp0eXBlZGVmIGVudW0gewogICAgTU1fQ0FNRVJBX0pQRUdfUEFSTV9ST1RBVElPTiwKICAgIE1NX0NBTUVSQV9KUEVHX1BBUk1fTUFJTklNR19RVUFMSVRZLAogICAgTU1fQ0FNRVJBX0pQRUdfUEFSTV9USFVNQl9RVUFMSVRZLAogICAgTU1fQ0FNRVJBX0pQRUdfUEFSTV9NQVgKfSBtbV9jYW1lcmFfanBlZ19wYXJtX3R5cGVfdDsKCnR5cGVkZWYgc3RydWN0IHsKICAgIHVpbnQ4X3QqIHB0cjsKICAgIHVpbnQzMl90IGZpbGxlZF9zaXplOwogICAgdWludDMyX3Qgc2l6ZTsKICAgIGludDMyX3QgZmQ7CiAgICB1aW50MzJfdCBvZmZzZXQ7Cn1tbV9jYW1lcmFfYnVmZmVyX3Q7Cgp0eXBlZGVmIHN0cnVjdCB7CiAgICBleGlmX3RhZ3NfaW5mb190KiBleGlmX2RhdGE7CiAgICBpbnQgZXhpZl9udW1FbnRyaWVzOwogICAgbW1fY2FtZXJhX2J1ZmZlcl90KiBwX291dHB1dF9idWZmZXI7CiAgICB1aW50OF90IGJ1ZmZlcl9jb3VudDsKICAgIHVpbnQzMl90IHJvdGF0aW9uOwogICAgdWludDMyX3QgcXVhbGl0eTsKICAgIGludCB5X29mZnNldDsKICAgIGludCBjYmNyX29mZnNldDsKICAgIC8qIGJpdG1hc2sgZm9yIHRoZSBpbWFnZXMgdG8gYmUgZW5jb2RlZC4gaWYgY2FwdHVyZV9hbmRfZW5jb2RlCiAgICAgKiBvcHRpb24gaXMgc2VsZWN0ZWQsIGFsbCB0aGUgaW1hZ2VzIHdpbGwgYmUgZW5jb2RlZCBpcnJlc3BlY3RpdmUKICAgICAqIG9mIGJpdG1hc2suCiAgICAgKi8KICAgIHVpbnQ4X3QgZW5jb2RlQml0TWFzazsKICAgIHVpbnQzMl90IG91dHB1dF9waWN0dXJlX3dpZHRoOwogICAgdWludDMyX3Qgb3V0cHV0X3BpY3R1cmVfaGVpZ2h0OwogICAgaW50IGZvcm1hdDNkOwp9ZW5jb2RlX3BhcmFtc190OwoKdHlwZWRlZiBzdHJ1Y3QgewogICAgdm9pZCAqIHNyY19pbWcxX2J1ZjsgICAgICAgICAgICAvLyBpbnB1dCBtYWluIGltYWdlIGJ1ZmZlcgogICAgdWludDMyX3Qgc3JjX2ltZzFfc2l6ZTsgICAgIC8vIGlucHV0IG1haW4gaW1hZ2Ugc2l6ZQogICAgdm9pZCAqIHNyY19pbWcyX2J1ZjsgICAgICAgICAgICAvLyBpbnB1dCB0aHVtYm5haWwgaW1hZ2UgYnVmZmVyCiAgICB1aW50MzJfdCBzcmNfaW1nMl9zaXplOyAgICAgLy8gaW5wdXQgdGh1bWJuYWlsIGltYWdlIHNpemUKICAgIHZvaWQqIG91dF9qcGVnMV9idWY7ICAgICAgICAgICAgLy8gb3V0IGpwZWcgYnVmZmVyCiAgICB1aW50MzJfdCBvdXRfanBlZzFfc2l6ZTsgICAgLy8gSU4vT1VULXJlc3VsdCBidWYgc2l6ZS9qcGVnIGltYWdlIHNpemUKICAgIHZvaWQqIG91dF9qcGVnMl9idWY7ICAgICAgICAgICAgLy8gb3V0IGpwZWcgYnVmZmVyCiAgICB1aW50MzJfdCBvdXRfanBlZzJfc2l6ZTsgICAgLy8gSU4vT1VULXJlc3VsdCBidWYgc2l6ZS9qcGVnIGltYWdlIHNpemUKICAgIG1tX2NhbWVyYV9zdGF0dXNfdHlwZV90IHN0YXR1czsgLy8gcmVzdWx0IHN0YXR1cyBwbGFjZSBob2xkZXIKfSBtbV9jYW1lcmFfanBlZ19lbmNvZGVfdDsKCnR5cGVkZWYgdm9pZCAoKm1tX2NhbWVyYV9qcGVnX2NiX3QpKG1tX2NhbWVyYV9qcGVnX2VuY29kZV90ICpyZXN1bHQsCiAgICB2b2lkICp1c2VyX2RhdGEpOwoKdHlwZWRlZiBzdHJ1Y3QgewogICAgdWludDhfdCAoKmlzX2pwZWdfc3VwcG9ydGVkKSggbW1fY2FtZXJhX3QgKiBjYW1lcmEpOwogICAgaW50MzJfdCAoKnNldF9wYXJtKShtbV9jYW1lcmFfdCAqIGNhbWVyYSwgbW1fY2FtZXJhX2pwZWdfcGFybV90eXBlX3QgcGFybV90eXBlLAogICAgICAgICAgICAgdm9pZCogcF92YWx1ZSk7CiAgICBpbnQzMl90ICgqZ2V0X3Bhcm0pKG1tX2NhbWVyYV90ICogY2FtZXJhLCBtbV9jYW1lcmFfanBlZ19wYXJtX3R5cGVfdCBwYXJtX3R5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBfdmFsdWUpOwogICAgaW50MzJfdCAoKiByZWdpc3Rlcl9ldmVudF9jYikobW1fY2FtZXJhX3QgKiBjYW1lcmEsIG1tX2NhbWVyYV9qcGVnX2NiX3QgKiBldnRfY2IsCiAgICAgICAgICAgICB2b2lkICogdXNlcl9kYXRhKTsKICAgIGludDMyX3QgKCplbmNvZGUpKG1tX2NhbWVyYV90ICogY2FtZXJhLCB1aW50OF90IHN0YXJ0LAogICAgICAgIG1tX2NhbWVyYV9qcGVnX2VuY29kZV90ICpkYXRhKTsKfSBtbV9jYW1lcmFfanBlZ190OwoKc3RydWN0IG1tX2NhbWVyYSB7CiAgICBtbV9jYW1lcmFfY29uZmlnX3QgKmNmZzsgICAgICAgICAgICAgICAgLy8gY29uZmlnIGludGVyZmFjZQogICAgbW1fY2FtZXJhX29wc190ICpvcHM7ICAgICAgICAgICAgICAgICAgIC8vIG9wZXJhdGlvbiBpbnRlcmZhY2UKICAgIG1tX2NhbWVyYV9ub3RpZnlfdCAqZXZ0OyAgICAgICAgICAgICAgICAvLyBldnQgY2FsbGJhY2sgaW50ZXJmYWNlCiAgICBtbV9jYW1lcmFfanBlZ190ICpqcGVnX29wczsgICAgICAgICAvLyBqcGVnIGNvbmZpZyBhbmQgZW5jb2RpbmcgaW50ZXJmYWNlCiAgICBxY2FtZXJhX2luZm9fdCBjYW1lcmFfaW5mbzsgICAgICAvLyBwb3N0aW9uLCBtb3VudF9hbmdsZSwgZXRjLgogICAgZW51bSBzZW5zb3JfdHlwZV90IHNlbnNvcl90eXBlOyAvLyBCQVlFUiwgWVVWLCBKUEVHX1NPQywgZXRjLgogICAgY2hhciB2aWRlb19kZXZfbmFtZVszMl07ICAgICAgICAgICAvLyBkZXZpY2Ugbm9kZSBuYW1lLCBlLmcuIC9kZXYvdmlkZW8xCn07Cgp0eXBlZGVmIGVudW0gewogICAgTU1fQ0FNRVJBX1BBRF9XT1JELAogICAgTU1fQ0FNRVJBX1BBRF8ySywKICAgIE1NX0NBTUVSQV9QQURfTUFYCn0gbW1fY2FtZXJhX3BhZF90eXBlX3Q7Cgp0eXBlZGVmIHN0cnVjdAp7CiAgICBzdHJ1Y3QgY2FtZXJhX3NpemVfdHlwZSAqc2l6ZXNfdGJsOwogICAgdWludDMyX3QgdGJsX3NpemU7Cn1kZWZhdWx0X3NpemVzX3RibF90OwoKLypjb25maWd1cmUgbWV0aG9kcyovCnVpbnQ4X3QgY2FtX2NvbmZpZ19pc19wYXJtX3N1cHBvcnRlZCgKICBpbnQgY2FtX2lkLAogIG1tX2NhbWVyYV9wYXJtX3R5cGVfdCBwYXJtX3R5cGUpOwp1aW50OF90IGNhbV9jb25maWdfaXNfY2hfc3VwcG9ydGVkKAogIGludCBjYW1faWQsCiAgbW1fY2FtZXJhX2NoYW5uZWxfdHlwZV90IGNoX3R5cGUpOwovKiBzZXQgYSBwYXJtknMgY3VycmVudCB2YWx1ZSAqLwppbnQzMl90IGNhbV9jb25maWdfc2V0X3Bhcm0oCiAgaW50IGNhbV9pZCwKICBtbV9jYW1lcmFfcGFybV90eXBlX3QgcGFybV90eXBlLAogIHZvaWQqIHBfdmFsdWUpOwovKiBnZXQgYSBwYXJtknMgY3VycmVudCB2YWx1ZSAqLwppbnQzMl90IGNhbV9jb25maWdfZ2V0X3Bhcm0oCiAgaW50IGNhbV9pZCwKICBtbV9jYW1lcmFfcGFybV90eXBlX3QgcGFybV90eXBlLAogIHZvaWQqIHBfdmFsdWUpOwppbnQzMl90IGNhbV9jb25maWdfcmVxdWVzdF9idWYoaW50IGNhbV9pZCwgbW1fY2FtZXJhX3JlZ19idWZfdCAqYnVmKTsKaW50MzJfdCBjYW1fY29uZmlnX2VucXVldWVfYnVmKGludCBjYW1faWQsIG1tX2NhbWVyYV9yZWdfYnVmX3QgKmJ1Zik7CmludDMyX3QgY2FtX2NvbmZpZ19wcmVwYXJlX2J1ZihpbnQgY2FtX2lkLCBtbV9jYW1lcmFfcmVnX2J1Zl90ICpidWYpOwppbnQzMl90IGNhbV9jb25maWdfdW5wcmVwYXJlX2J1ZihpbnQgY2FtX2lkLCBtbV9jYW1lcmFfY2hhbm5lbF90eXBlX3QgY2hfdHlwZSk7CgovKm9wZXJhdGlvbiBtZXRob2RzKi8KdWludDhfdCBjYW1fb3BzX2lzX29wX3N1cHBvcnRlZChpbnQgY2FtX2lkLCBtbV9jYW1lcmFfb3BzX3R5cGVfdCBvcGNvZGUpOwovKiB2YWwgaXMgcmVzZXJ2ZWQgZm9yIHNvbWUgYWN0aW9uIHN1Y2ggYXMgTU1fQ0FNRVJBX09QU19GT0NVUyAqLwppbnQzMl90IGNhbV9vcHNfYWN0aW9uKGludCBjYW1faWQsIHVpbnQ4X3Qgc3RhcnQsCiAgbW1fY2FtZXJhX29wc190eXBlX3Qgb3Bjb2RlLCB2b2lkICp2YWwpOwppbnQzMl90IGNhbV9vcHNfb3BlbihpbnQgY2FtX2lkLCBtbV9jYW1lcmFfb3BfbW9kZV90eXBlX3Qgb3BfbW9kZSk7CnZvaWQgY2FtX29wc19jbG9zZShpbnQgY2FtX2lkKTsKdm9pZCBjYW1fb3BzX3N0b3AoaW50IGNhbV9pZCk7CmludDMyX3QgY2FtX29wc19jaF9hY3F1aXJlKGludCBjYW1faWQsIG1tX2NhbWVyYV9jaGFubmVsX3R5cGVfdCBjaF90eXBlKTsKdm9pZCBjYW1fb3BzX2NoX3JlbGVhc2UoaW50IGNhbV9pZCwgbW1fY2FtZXJhX2NoYW5uZWxfdHlwZV90IGNoX3R5cGUpOwppbnQzMl90IGNhbV9vcHNfY2hfc2V0X2F0dHIoaW50IGNhbV9pZCwgbW1fY2FtZXJhX2NoYW5uZWxfdHlwZV90IGNoX3R5cGUsCiAgbW1fY2FtZXJhX2NoYW5uZWxfYXR0cl90ICphdHRyKTsKaW50MzJfdCBjYW1fb3BzX3NlbmRtc2coaW50IGNhbV9pZCwgdm9pZCAqbXNnLCB1aW50MzJfdCBidWZfc2l6ZSwgaW50IHNlbmRmZCk7CgovKmNhbGwtYmFjayBub3RpZnkgbWV0aG9kcyovCnVpbnQ4X3QgY2FtX2V2dF9pc19ldmVudF9zdXBwb3J0ZWQoaW50IGNhbV9pZCwgbW1fY2FtZXJhX2V2ZW50X3R5cGVfdCBldnRfdHlwZSk7CmludDMyX3QgY2FtX2V2dF9yZWdpc3Rlcl9ldmVudF9ub3RpZnkoaW50IGNhbV9pZCwKICBtbV9jYW1lcmFfZXZlbnRfbm90aWZ5X3QgZXZ0X2NiLAogIHZvaWQgKiB1c2VyX2RhdGEsCiAgbW1fY2FtZXJhX2V2ZW50X3R5cGVfdCBldnRfdHlwZSk7CmludDMyX3QgY2FtX2V2dF9yZWdpc3Rlcl9idWZfbm90aWZ5KGludCBjYW1faWQsCiAgbW1fY2FtZXJhX2NoYW5uZWxfdHlwZV90IGNoX3R5cGUsCiAgbW1fY2FtZXJhX2J1Zl9ub3RpZnlfdCBidWZfY2IsCiAgbW1fY2FtZXJhX3JlZ2lzdGVyX2J1Zl9jYl90eXBlX3QgY2JfdHlwZSwKICB1aW50MzJfdCBjYl9jb3VudCwKICB2b2lkICogdXNlcl9kYXRhKTsKCmludDMyX3QgY2FtX2V2dF9idWZfZG9uZShpbnQgY2FtX2lkLCBtbV9jYW1lcmFfY2hfZGF0YV9idWZfdCAqYnVmcyk7CgovKmNhbWVyYSBKUEVHIG1ldGhvZHMqLwp1aW50OF90IGNhbV9qcGVnX2lzX2pwZWdfc3VwcG9ydGVkKGludCBjYW1faWQpOwppbnQzMl90IGNhbV9qcGVnX3NldF9wYXJtKGludCBjYW1faWQsIG1tX2NhbWVyYV9qcGVnX3Bhcm1fdHlwZV90IHBhcm1fdHlwZSwKICB2b2lkKiBwX3ZhbHVlKTsKaW50MzJfdCBjYW1fanBlZ19nZXRfcGFybShpbnQgY2FtX2lkLCBtbV9jYW1lcmFfanBlZ19wYXJtX3R5cGVfdCBwYXJtX3R5cGUsCiAgdm9pZCogcF92YWx1ZSk7CmludDMyX3QgY2FtX2pwZWdfcmVnaXN0ZXJfZXZlbnRfY2IoaW50IGNhbV9pZCwgbW1fY2FtZXJhX2pwZWdfY2JfdCAqIGV2dF9jYiwKICB2b2lkICogdXNlcl9kYXRhKTsKaW50MzJfdCBjYW1fanBlZ19lbmNvZGUoaW50IGNhbV9pZCwgdWludDhfdCBzdGFydCwKICBtbV9jYW1lcmFfanBlZ19lbmNvZGVfdCAqZGF0YSk7CgpleHRlcm4gbW1fY2FtZXJhX3QgKiBtbV9jYW1lcmFfcXVlcnkodWludDhfdCAqbnVtX2NhbWVyYXMpOwpleHRlcm4gdWludDhfdCAqbW1fY2FtZXJhX2RvX21tYXAodWludDMyX3Qgc2l6ZSwgaW50ICpwbWVtRmQpOwpleHRlcm4gaW50IG1tX2NhbWVyYV9kb19tdW5tYXAoaW50IHBtZW1fZmQsIHZvaWQgKmFkZHIsIHNpemVfdCBzaXplKTsKZXh0ZXJuIHVpbnQ4X3QgKm1tX2NhbWVyYV9kb19tbWFwX2lvbihpbnQgaW9uX2ZkLCBzdHJ1Y3QgaW9uX2FsbG9jYXRpb25fZGF0YSAqYWxsb2MsCgkJICAgICBzdHJ1Y3QgaW9uX2ZkX2RhdGEgKmlvbl9pbmZvX2ZkLCBpbnQgKm1hcEZkKTsKZXh0ZXJuIGludCBtbV9jYW1lcmFfZG9fbXVubWFwX2lvbiAoaW50IGlvbl9mZCwgc3RydWN0IGlvbl9mZF9kYXRhICppb25faW5mb19mZCwKICAgICAgICAgICAgICAgICAgIHZvaWQgKmFkZHIsIHNpemVfdCBzaXplKTsKZXh0ZXJuIGludCBtbV9jYW1lcmFfZHVtcF9pbWFnZSh2b2lkICphZGRyLCB1aW50MzJfdCBzaXplLCBjaGFyICpmaWxlbmFtZSk7CmV4dGVybiB1aW50MzJfdCBtbV9jYW1lcmFfZ2V0X21zbV9mcmFtZV9sZW4oY2FtX2Zvcm1hdF90IGZtdF90eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbWVyYV9tb2RlX3QgbW9kZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhlaWdodCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW1hZ2VfdHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpudW1fcGxhbmVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHBsYW5lc1tdKTsKdWludDhfdCAqbW1fY2FtZXJhX2RvX21tYXBfaW9uKGludCBpb25fZmQsIHN0cnVjdCBpb25fYWxsb2NhdGlvbl9kYXRhICphbGxvYywKICBzdHJ1Y3QgaW9uX2ZkX2RhdGEgKmlvbl9pbmZvX2ZkLCBpbnQgKm1hcEZkKTsKaW50IG1tX2NhbWVyYV9kb19tdW5tYXBfaW9uIChpbnQgaW9uX2ZkLCBzdHJ1Y3QgaW9uX2ZkX2RhdGEgKmlvbl9pbmZvX2ZkLAogICAgICAgICAgICAgICAgICAgdm9pZCAqYWRkciwgc2l6ZV90IHNpemUpOwpleHRlcm4gdm9pZCBtbV9jYW1lcmFfdXRpbF9wcm9maWxlKGNvbnN0IGNoYXIgKnN0cik7CiNlbmRpZiAvKl9fTU1fQ0FNRVJBX0lOVEVSRkFDRTJfSF9fKi8K