LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogQWdlcmUgU3lzdGVtcyBJbmMuCiAqIFdpcmVsZXNzIGRldmljZSBkcml2ZXIgZm9yIExpbnV4ICh3bGFnczQ5KS4KICoKICogQ29weXJpZ2h0IChjKSAxOTk4LTIwMDMgQWdlcmUgU3lzdGVtcyBJbmMuCiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAqICAgaHR0cDovL3d3dy5hZ2VyZS5jb20KICoKICogSW5pdGlhbGx5IGRldmVsb3BlZCBieSBUcmlwbGVQb2ludCwgSW5jLgogKiAgIGh0dHA6Ly93d3cudHJpcGxlcG9pbnQuY29tCiAqCiAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqCiAqICAgVGhpcyBmaWxlIGNvbnRhaW5zIHByb2Nlc3NpbmcgYW5kIGluaXRpYWxpemF0aW9uIHNwZWNpZmljIHRvIFBDSS9taW5pUENJCiAqICAgZGV2aWNlcy4KICoKICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICoKICogU09GVFdBUkUgTElDRU5TRQogKgogKiBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyB0ZXJtcyBhbmQgY29uZGl0aW9ucywKICogd2hpY2ggeW91IHNob3VsZCByZWFkIGNhcmVmdWxseSBiZWZvcmUgdXNpbmcgdGhlIHNvZnR3YXJlLiAgVXNpbmcgdGhpcwogKiBzb2Z0d2FyZSBpbmRpY2F0ZXMgeW91ciBhY2NlcHRhbmNlIG9mIHRoZXNlIHRlcm1zIGFuZCBjb25kaXRpb25zLiAgSWYgeW91IGRvCiAqIG5vdCBhZ3JlZSB3aXRoIHRoZXNlIHRlcm1zIGFuZCBjb25kaXRpb25zLCBkbyBub3QgdXNlIHRoZSBzb2Z0d2FyZS4KICoKICogQ29weXJpZ2h0IKkgMjAwMyBBZ2VyZSBTeXN0ZW1zIEluYy4KICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICoKICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2Ugb3IgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKICogbW9kaWZpY2F0aW9ucywgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgogKgogKiAuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcwogKiAgICBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgRGlzY2xhaW1lciBhcyBjb21tZW50cyBpbiB0aGUgY29kZSBhcwogKiAgICB3ZWxsIGFzIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKICogICAgZGlzdHJpYnV0aW9uLgogKgogKiAuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKICogICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgRGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbgogKiAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KICoKICogLiBOZWl0aGVyIHRoZSBuYW1lIG9mIEFnZXJlIFN5c3RlbXMgSW5jLiBub3IgdGhlIG5hbWVzIG9mIHRoZSBjb250cmlidXRvcnMKICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCiAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgogKgogKiBEaXNjbGFpbWVyCiAqCiAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgk0FTIElTlCBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAogKiBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgSU5GUklOR0VNRU5UIEFORCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCiAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBBTlkKICogVVNFLCBNT0RJRklDQVRJT04gT1IgRElTVFJJQlVUSU9OIE9GIFRISVMgU09GVFdBUkUgSVMgU09MRUxZIEFUIFRIRSBVU0VSUyBPV04KICogUklTSy4gSU4gTk8gRVZFTlQgU0hBTEwgQUdFUkUgU1lTVEVNUyBJTkMuIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWQogKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUwogKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CiAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAogKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIENPTlRSQUNULCBTVFJJQ1QKICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0gKICogREFNQUdFLgogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogaW5jbHVkZSBmaWxlcwogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwojaW5jbHVkZSA8d2lyZWxlc3Mvd2xfdmVyc2lvbi5oPgoKI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgojaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgojaW5jbHVkZSA8bGludXgvcGNpLmg+CiNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgojaW5jbHVkZSA8bGludXgvcHRyYWNlLmg+CiNpbmNsdWRlIDxsaW51eC9jdHlwZS5oPgojaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+Ci8vI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CiNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KI2luY2x1ZGUgPGxpbnV4L2luLmg+CiNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgojaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgojaW5jbHVkZSA8YXNtL2lvLmg+CiNpbmNsdWRlIDxhc20vaXJxLmg+CiNpbmNsdWRlIDxhc20vYml0b3BzLmg+CiNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgoKI2luY2x1ZGUgPGxpbnV4L2V0aHRvb2wuaD4KI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgojaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgojaW5jbHVkZSA8bGludXgvaWZfYXJwLmg+CiNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KCiNpbmNsdWRlIDxoY2YvZGVidWcuaD4KCiNpbmNsdWRlIDxoY2YuaD4KI2luY2x1ZGUgPGRoZi5oPgojaW5jbHVkZSA8aGNmZGVmLmg+CgojaW5jbHVkZSA8d2lyZWxlc3Mvd2xfaWYuaD4KI2luY2x1ZGUgPHdpcmVsZXNzL3dsX2ludGVybmFsLmg+CiNpbmNsdWRlIDx3aXJlbGVzcy93bF91dGlsLmg+CiNpbmNsdWRlIDx3aXJlbGVzcy93bF9tYWluLmg+CiNpbmNsdWRlIDx3aXJlbGVzcy93bF9uZXRkZXYuaD4KI2luY2x1ZGUgPHdpcmVsZXNzL3dsX3BjaS5oPgoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIGdsb2JhbCB2YXJpYWJsZXMKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KI2lmIERCRwpleHRlcm4gZGJnX2luZm9fdCAqRGJnSW5mbzsKI2VuZGlmICAvLyBEQkcKCi8qIGRlZmluZSB0aGUgUENJIGRldmljZSBUYWJsZSBDYXJkbmFtZSBhbmQgaWQgdGFibGVzICovCmVudW0gaGVybWVzX3BjaV92ZXJzaW9ucyB7CglDSF9BZ2VyZV9TeXN0ZW1zX01pbmlfUENJX1YxID0gMCwKfTsKCnN0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCB3bF9wY2lfdGJsW10gX19kZXZpbml0ZGF0YSA9IHsKCXsgV0xfTEtNX1BDSV9WRU5ET1JfSUQsIFdMX0xLTV9QQ0lfREVWSUNFX0lEXzAsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENIX0FnZXJlX1N5c3RlbXNfTWluaV9QQ0lfVjEgfSwKICAgIHsgV0xfTEtNX1BDSV9WRU5ET1JfSUQsIFdMX0xLTV9QQ0lfREVWSUNFX0lEXzEsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENIX0FnZXJlX1N5c3RlbXNfTWluaV9QQ0lfVjEgfSwKICAgIHsgV0xfTEtNX1BDSV9WRU5ET1JfSUQsIFdMX0xLTV9QQ0lfREVWSUNFX0lEXzIsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENIX0FnZXJlX1N5c3RlbXNfTWluaV9QQ0lfVjEgfSwKCXsgfQkJCS8qIFRlcm1pbmF0aW5nIGVudHJ5ICovCn07CgpNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgd2xfcGNpX3RibCk7CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBmdW5jdGlvbiBwcm90b3R5cGVzCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmludCBfX2RldmluaXQgd2xfcGNpX3Byb2JlKCBzdHJ1Y3QgcGNpX2RldiAqcGRldiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50ICk7CnZvaWQgX19kZXZleGl0IHdsX3BjaV9yZW1vdmUoc3RydWN0IHBjaV9kZXYgKnBkZXYpOwppbnQgd2xfcGNpX3NldHVwKCBzdHJ1Y3QgcGNpX2RldiAqcGRldiApOwp2b2lkIHdsX3BjaV9lbmFibGVfY2FyZGJ1c19pbnRlcnJ1cHRzKCBzdHJ1Y3QgcGNpX2RldiAqcGRldiApOwoKI2lmZGVmIEVOQUJMRV9ETUEKaW50IHdsX3BjaV9kbWFfYWxsb2MoIHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHAgKTsKaW50IHdsX3BjaV9kbWFfZnJlZSggc3RydWN0IHBjaV9kZXYgKnBkZXYsIHN0cnVjdCB3bF9wcml2YXRlICpscCApOwppbnQgd2xfcGNpX2RtYV9hbGxvY190eF9wYWNrZXQoIHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVTQ19TVFJDVCAqKmRlc2MgKTsKaW50IHdsX3BjaV9kbWFfZnJlZV90eF9wYWNrZXQoIHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVTQ19TVFJDVCAqKmRlc2MgKTsKaW50IHdsX3BjaV9kbWFfYWxsb2NfcnhfcGFja2V0KCBzdHJ1Y3QgcGNpX2RldiAqcGRldiwgc3RydWN0IHdsX3ByaXZhdGUgKmxwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFU0NfU1RSQ1QgKipkZXNjICk7CmludCB3bF9wY2lfZG1hX2ZyZWVfcnhfcGFja2V0KCBzdHJ1Y3QgcGNpX2RldiAqcGRldiwgc3RydWN0IHdsX3ByaXZhdGUgKmxwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFU0NfU1RSQ1QgKipkZXNjICk7CmludCB3bF9wY2lfZG1hX2FsbG9jX2Rlc2NfYW5kX2J1Ziggc3RydWN0IHBjaV9kZXYgKnBkZXYsIHN0cnVjdCB3bF9wcml2YXRlICpscCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERVNDX1NUUkNUICoqZGVzYywgaW50IHNpemUgKTsKaW50IHdsX3BjaV9kbWFfZnJlZV9kZXNjX2FuZF9idWYoIHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVTQ19TVFJDVCAqKmRlc2MgKTsKaW50IHdsX3BjaV9kbWFfYWxsb2NfZGVzYyggc3RydWN0IHBjaV9kZXYgKnBkZXYsIHN0cnVjdCB3bF9wcml2YXRlICpscCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgREVTQ19TVFJDVCAqKmRlc2MgKTsKaW50IHdsX3BjaV9kbWFfZnJlZV9kZXNjKCBzdHJ1Y3QgcGNpX2RldiAqcGRldiwgc3RydWN0IHdsX3ByaXZhdGUgKmxwLAogICAgICAgICAgICAgICAgICAgICAgICAgICBERVNDX1NUUkNUICoqZGVzYyApOwppbnQgd2xfcGNpX2RtYV9hbGxvY19idWYoIHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgREVTQ19TVFJDVCAqZGVzYywgaW50IHNpemUgKTsKaW50IHdsX3BjaV9kbWFfZnJlZV9idWYoIHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgREVTQ19TVFJDVCAqZGVzYyApOwoKdm9pZCB3bF9wY2lfZG1hX2hjZl9yZWNsYWltX3J4KCBzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHAgKTsKI2VuZGlmICAvLyBFTkFCTEVfRE1BCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBQQ0kgbW9kdWxlIGZ1bmN0aW9uIHJlZ2lzdHJhdGlvbgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgd2xfZHJpdmVyID0KewoJbmFtZToJCU1PRFVMRV9OQU1FLAogICAgaWRfdGFibGU6CXdsX3BjaV90YmwsCglwcm9iZToJCXdsX3BjaV9wcm9iZSwKCXJlbW92ZToJCV9fZGV2ZXhpdF9wKHdsX3BjaV9yZW1vdmUpLAogICAgc3VzcGVuZDogICAgTlVMTCwKICAgIHJlc3VtZTogICAgIE5VTEwsCn07CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgl3bF9hZGFwdGVyX2luaXRfbW9kdWxlKCkKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoKICogIERFU0NSSVBUSU9OOgogKgogKiAgICAgIENhbGxlZCBieSBpbml0X21vZHVsZSgpIHRvIHBlcmZvcm0gUENJLXNwZWNpZmljIGRyaXZlciBpbml0aWFsaXphdGlvbi4KICoKICogIFBBUkFNRVRFUlM6CiAqCiAqICAgICAgTi9BCiAqCiAqICBSRVRVUk5TOgogKgogKiAgICAgIDAKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KaW50IHdsX2FkYXB0ZXJfaW5pdF9tb2R1bGUoIHZvaWQgKQp7CiAgICBpbnQgcmVzdWx0OwogICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKICAgIERCR19GVU5DKCAid2xfYWRhcHRlcl9pbml0X21vZHVsZSgpIiApOwogICAgREJHX0VOVEVSKCBEYmdJbmZvICk7CiAgICBEQkdfVFJBQ0UoIERiZ0luZm8sICJ3bF9hZGFwdGVyX2luaXRfbW9kdWxlKCkgLS0gUENJXG4iICk7CgogICAgcmVzdWx0ID0gcGNpX3JlZ2lzdGVyX2RyaXZlciggJndsX2RyaXZlciApOyAvLzs/cmVwbGFjZSB3aXRoIHBjaV9tb2R1bGVfaW5pdCwgUnViaW5pIHBnIDQ5MAoJLy87PyB3aHkgbm90IGRvIHNvbWV0aGluZyB3aXRoIHRoZSByZXN1bHQKCiAgICBEQkdfTEVBVkUoIERiZ0luZm8gKTsKICAgIHJldHVybiAwOwp9IC8vIHdsX2FkYXB0ZXJfaW5pdF9tb2R1bGUKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCXdsX2FkYXB0ZXJfY2xlYW51cF9tb2R1bGUoKQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgogKiAgREVTQ1JJUFRJT046CiAqCiAqICAgICAgQ2FsbGVkIGJ5IGNsZWFudXBfbW9kdWxlKCkgdG8gcGVyZm9ybSBQQ0ktc3BlY2lmaWMgZHJpdmVyIGNsZWFudXAuCiAqCiAqICBQQVJBTUVURVJTOgogKgogKiAgICAgIE4vQQogKgogKiAgUkVUVVJOUzoKICoKICogICAgICBOL0EKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kdm9pZCB3bF9hZGFwdGVyX2NsZWFudXBfbW9kdWxlKCB2b2lkICkKewoJLy87P2hvdyBjb21lcyB3bF9hZGFwdGVyX2NsZWFudXBfbW9kdWxlIGlzIGxvY2F0ZWQgaW4gYSBzZWVtaW5nbHkgcGNpIHNwZWNpZmljIG1vZHVsZQogICAgREJHX0ZVTkMoICJ3bF9hZGFwdGVyX2NsZWFudXBfbW9kdWxlIiApOwogICAgREJHX0VOVEVSKCBEYmdJbmZvICk7CgoJLy87P0RCR19UUkFDRSBiZWxvdyBmZWVscyBsaWtlIG5lYXJseSByZWR1bmRhbnQgaW4gdGhlIGxpZ2h0IG9mIERCR19FTlRFUiBhYm92ZQogICAgREJHX1RSQUNFKCBEYmdJbmZvLCAid2xfYWRhcHRlcl9jbGVhbnVwX21vZHVsZSgpIC0tIFBDSVxuIiApOwoKICAgIHBjaV91bnJlZ2lzdGVyX2RyaXZlciggJndsX2RyaXZlciApOwoKICAgIERCR19MRUFWRSggRGJnSW5mbyApOwogICAgcmV0dXJuOwp9IC8vIHdsX2FkYXB0ZXJfY2xlYW51cF9tb2R1bGUKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCXdsX2FkYXB0ZXJfaW5zZXJ0KCkKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoKICogIERFU0NSSVBUSU9OOgogKgogKiAgICAgIENhbGxlZCBieSB3bF9wY2lfcHJvYmUoKSB0byBjb250aW51ZSB0aGUgcHJvY2VzcyBvZiBkZXZpY2UgaW5zZXJ0aW9uLgogKgogKiAgUEFSQU1FVEVSUzoKICoKICogICAgICBkZXYgLSBhIHBvaW50ZXIgdG8gdGhlIGRldmljZSdzIG5ldF9kZXZpY2Ugc3RydWN0dXJlCiAqCiAqICBSRVRVUk5TOgogKgogKiAgICAgIFRSVUUgb3IgRkFMU0UKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KaW50IHdsX2FkYXB0ZXJfaW5zZXJ0KCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ICkKewogICAgaW50IHJlc3VsdCA9IEZBTFNFOwogICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKICAgIERCR19GVU5DKCAid2xfYWRhcHRlcl9pbnNlcnQiICk7CiAgICBEQkdfRU5URVIoIERiZ0luZm8gKTsKCiAgICBEQkdfVFJBQ0UoIERiZ0luZm8sICJ3bF9hZGFwdGVyX2luc2VydCgpIC0tIFBDSVxuIiApOwoKICAgIGlmKCBkZXYgPT0gTlVMTCApIHsKICAgICAgICBEQkdfRVJST1IoIERiZ0luZm8sICJuZXRfZGV2aWNlIHBvaW50ZXIgaXMgTlVMTCEhIVxuIiApOwogICAgfSBlbHNlIGlmKCBkZXYtPnByaXYgPT0gTlVMTCApIHsKICAgICAgICBEQkdfRVJST1IoIERiZ0luZm8sICJ3bF9wcml2YXRlIHBvaW50ZXIgaXMgTlVMTCEhIVxuIiApOwogICAgfSBlbHNlIGlmKCB3bF9pbnNlcnQoIGRldiApICkgeyAvKiBQZXJmb3JtIHJlbWFpbmluZyBkZXZpY2UgaW5pdGlhbGl6YXRpb24gKi8KCQlyZXN1bHQgPSBUUlVFOwoJfSBlbHNlIHsKICAgICAgICBEQkdfVFJBQ0UoIERiZ0luZm8sICJ3bF9pbnNlcnQoKSBGQUlMRURcbiIgKTsKICAgIH0KICAgIERCR19MRUFWRSggRGJnSW5mbyApOwogICAgcmV0dXJuIHJlc3VsdDsKfSAvLyB3bF9hZGFwdGVyX2luc2VydAovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJd2xfYWRhcHRlcl9vcGVuKCkKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoKICogIERFU0NSSVBUSU9OOgogKgogKiAgICAgIE9wZW4gdGhlIGRldmljZS4KICoKICogIFBBUkFNRVRFUlM6CiAqCiAqICAgICAgZGV2IC0gYSBwb2ludGVyIHRvIHRoZSBkZXZpY2UncyBuZXRfZGV2aWNlIHN0cnVjdHVyZQogKgogKiAgUkVUVVJOUzoKICoKICogICAgICBhbiBIQ0Ygc3RhdHVzIGNvZGUKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KaW50IHdsX2FkYXB0ZXJfb3Blbiggc3RydWN0IG5ldF9kZXZpY2UgKmRldiApCnsKICAgIGludCAgICAgICAgIHJlc3VsdCA9IDA7CiAgICBpbnQgICAgICAgICBoY2Zfc3RhdHVzID0gSENGX1NVQ0NFU1M7CiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgogICAgREJHX0ZVTkMoICJ3bF9hZGFwdGVyX29wZW4iICk7CiAgICBEQkdfRU5URVIoIERiZ0luZm8gKTsKCiAgICBEQkdfVFJBQ0UoIERiZ0luZm8sICJ3bF9hZGFwdGVyX29wZW4oKSAtLSBQQ0lcbiIgKTsKCiAgICBoY2Zfc3RhdHVzID0gd2xfb3BlbiggZGV2ICk7CgogICAgaWYoIGhjZl9zdGF0dXMgIT0gSENGX1NVQ0NFU1MgKSB7CiAgICAgICAgcmVzdWx0ID0gLUVOT0RFVjsKICAgIH0KCiAgICBEQkdfTEVBVkUoIERiZ0luZm8gKTsKICAgIHJldHVybiByZXN1bHQ7Cn0gLy8gd2xfYWRhcHRlcl9vcGVuCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgl3bF9hZGFwdGVyX2Nsb3NlKCkKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoKICogIERFU0NSSVBUSU9OOgogKgogKiAgICAgIENsb3NlIHRoZSBkZXZpY2UKICoKICogIFBBUkFNRVRFUlM6CiAqCiAqICAgICAgZGV2IC0gYSBwb2ludGVyIHRvIHRoZSBkZXZpY2UncyBuZXRfZGV2aWNlIHN0cnVjdHVyZQogKgogKiAgUkVUVVJOUzoKICoKICogICAgICAwCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmludCB3bF9hZGFwdGVyX2Nsb3NlKCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ICkKewogICAgREJHX0ZVTkMoICJ3bF9hZGFwdGVyX2Nsb3NlIiApOwogICAgREJHX0VOVEVSKCBEYmdJbmZvICk7CgogICAgREJHX1RSQUNFKCBEYmdJbmZvLCAid2xfYWRhcHRlcl9jbG9zZSgpIC0tIFBDSVxuIiApOwogICAgREJHX1RSQUNFKCBEYmdJbmZvLCAiJXM6IFNodXR0aW5nIGRvd24gYWRhcHRlci5cbiIsIGRldi0+bmFtZSApOwoKICAgIHdsX2Nsb3NlKCBkZXYgKTsKCiAgICBEQkdfTEVBVkUoIERiZ0luZm8gKTsKICAgIHJldHVybiAwOwp9IC8vIHdsX2FkYXB0ZXJfY2xvc2UKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCXdsX2FkYXB0ZXJfaXNfb3BlbigpCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCiAqICBERVNDUklQVElPTjoKICoKICogICAgICBDaGVjayB3aGV0aGVyIHRoaXMgZGV2aWNlIGlzIG9wZW4uIFJldHVybnMKICoKICogIFBBUkFNRVRFUlM6CiAqCiAqICAgICAgZGV2IC0gYSBwb2ludGVyIHRvIHRoZSBkZXZpY2UncyBuZXRfZGV2aWNlIHN0cnVjdHVyZQogKgogKiAgUkVUVVJOUzoKICoKICogICAgICBub256ZXJvIGlmIGRldmljZSBpcyBvcGVuLgogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwppbnQgd2xfYWRhcHRlcl9pc19vcGVuKCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ICkKewogICAgLyogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIGluIFBDTUNJQSB0byBjaGVjayB0aGUgc3RhdHVzIG9mIHRoZSAnb3BlbicgZmllbGQKICAgICAgIGluIHRoZSBkZXZfbGlua190IHN0cnVjdHVyZSBhc3NvY2lhdGVkIHdpdGggYSBuZXR3b3JrIGRldmljZS4gVGhlcmUKICAgICAgIGRvZXNuJ3Qgc2VlbSB0byBiZSBhbiBhbmFsb2cgdG8gdGhpcyBmb3IgUENJLCBhbmQgY2hlY2tpbmcgdGhlIHN0YXR1cwogICAgICAgY29udGFpbmVkIGluIHRoZSBuZXRfZGV2aWNlIHN0cnVjdHVyZSBkb2Vzbid0IGhhdmUgdGhlIHNhbWUgZWZmZWN0LgogICAgICAgRm9yIG5vdywgcmV0dXJuIFRSVUUsIGJ1dCBmaW5kIG91dCBpZiB0aGlzIGlzIG5lY2Vzc2FyeSBmb3IgUENJLiAqLwoKICAgIHJldHVybiBUUlVFOwp9IC8vIHdsX2FkYXB0ZXJfaXNfb3BlbgovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJd2xfcGNpX3Byb2JlKCkKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoKICogIERFU0NSSVBUSU9OOgogKgogKiAgICAgIFJlZ2lzdGVyZWQgaW4gdGhlIHBjaV9kcml2ZXIgc3RydWN0dXJlLCB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIHRoZQogKiAgUENJIHN1YnN5c3RlbSBmaW5kcyBhIG5ldyBQQ0kgZGV2aWNlIHdoaWNoIG1hdGNoZXMgdGhlIGluZm9tYXRpb24gY29udGFpbmVkCiAqICBpbiB0aGUgcGNpX2RldmljZV9pZCB0YWJsZS4KICoKICogIFBBUkFNRVRFUlM6CiAqCiAqICAgICAgcGRldiAgICAtIGEgcG9pbnRlciB0byB0aGUgZGV2aWNlJ3MgcGNpX2RldiBzdHJ1Y3R1cmUKICogICAgICBlbnQgICAgIC0gdGhpcyBkZXZpY2UncyBlbnRyeSBpbiB0aGUgcGNpX2RldmljZV9pZCB0YWJsZQogKgogKiAgUkVUVVJOUzoKICoKICogICAgICAwIG9uIHN1Y2Nlc3MKICogICAgICBlcnJubyB2YWx1ZSBvdGhlcndpc2UKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KaW50IF9fZGV2aW5pdCB3bF9wY2lfcHJvYmUoIHN0cnVjdCBwY2lfZGV2ICpwZGV2LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQgKQp7CiAgICBpbnQgcmVzdWx0OwogICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKICAgIERCR19GVU5DKCAid2xfcGNpX3Byb2JlIiApOwogICAgREJHX0VOVEVSKCBEYmdJbmZvICk7CglEQkdfUFJJTlQoICIlc1xuIiwgVkVSU0lPTl9JTkZPICk7CgogICAgcmVzdWx0ID0gd2xfcGNpX3NldHVwKCBwZGV2ICk7CgogICAgREJHX0xFQVZFKCBEYmdJbmZvICk7CgogICAgcmV0dXJuIHJlc3VsdDsKfSAvLyB3bF9wY2lfcHJvYmUKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCXdsX3BjaV9yZW1vdmUoKQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgogKiAgREVTQ1JJUFRJT046CiAqCiAqICAgICAgUmVnaXN0ZXJlZCBpbiB0aGUgcGNpX2RyaXZlciBzdHJ1Y3R1cmUsIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gdGhlCiAqICBQQ0kgc3Vic3lzdGVtIGRldGVjdHMgdGhhdCBhIFBDSSBkZXZpY2Ugd2hpY2ggbWF0Y2hlcyB0aGUgaW5mb21hdGlvbgogKiAgY29udGFpbmVkIGluIHRoZSBwY2lfZGV2aWNlX2lkIHRhYmxlIGhhcyBiZWVuIHJlbW92ZWQuCiAqCiAqICBQQVJBTUVURVJTOgogKgogKiAgICAgIHBkZXYgLSBhIHBvaW50ZXIgdG8gdGhlIGRldmljZSdzIHBjaV9kZXYgc3RydWN0dXJlCiAqCiAqICBSRVRVUk5TOgogKgogKiAgICAgIE4vQQogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwp2b2lkIF9fZGV2ZXhpdCB3bF9wY2lfcmVtb3ZlKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQp7CiAgICBzdHJ1Y3QgbmV0X2RldmljZSAgICAgICAqZGV2ID0gTlVMTDsKICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCiAgICBEQkdfRlVOQyggIndsX3BjaV9yZW1vdmUiICk7CiAgICBEQkdfRU5URVIoIERiZ0luZm8gKTsKCiAgICAvKiBNYWtlIHN1cmUgdGhlIHBjaV9kZXYgcG9pbnRlciBwYXNzZWQgaW4gaXMgdmFsaWQgKi8KICAgIGlmKCBwZGV2ID09IE5VTEwgKSB7CiAgICAgICAgREJHX0VSUk9SKCBEYmdJbmZvLCAiUENJIHN1YnN5cyBwYXNzZWQgaW4gYW4gaW52YWxpZCBwY2lfZGV2IHBvaW50ZXJcbiIgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopcGNpX2dldF9kcnZkYXRhKCBwZGV2ICk7CiAgICBpZiggZGV2ID09IE5VTEwgKSB7CiAgICAgICAgREJHX0VSUk9SKCBEYmdJbmZvLCAiQ291bGQgbm90IHJldHJpZXZlIG5ldF9kZXZpY2Ugc3RydWN0dXJlXG4iICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIC8qIFBlcmZvcm0gZGV2aWNlIGNsZWFudXAgKi8KICAgIHdsX3JlbW92ZSggZGV2ICk7CiAgICBmcmVlX2lycSggZGV2LT5pcnEsIGRldiApOwoKI2lmZGVmIEVOQUJMRV9ETUEKICAgIHdsX3BjaV9kbWFfZnJlZSggcGRldiwgKHN0cnVjdCB3bF9wcml2YXRlICopZGV2LT5wcml2ICk7CiNlbmRpZgoKICAgIHdsX2RldmljZV9kZWFsbG9jKCBkZXYgKTsKCiAgICBEQkdfTEVBVkUoIERiZ0luZm8gKTsKICAgIHJldHVybjsKfSAvLyB3bF9wY2lfcmVtb3ZlCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgl3bF9wY2lfc2V0dXAoKQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgogKiAgREVTQ1JJUFRJT046CiAqCiAqICAgICAgQ2FsbGVkIGJ5IHdsX3BjaV9wcm9iZSgpIHRvIGJlZ2luIGEgZGV2aWNlJ3MgaW5pdGlhbGl6YXRpb24gcHJvY2Vzcy4KICoKICogIFBBUkFNRVRFUlM6CiAqCiAqICAgICAgcGRldiAtIGEgcG9pbnRlciB0byB0aGUgZGV2aWNlJ3MgcGNpX2RldiBzdHJ1Y3R1cmUKICoKICogIFJFVFVSTlM6CiAqCiAqICAgICAgMCBvbiBzdWNjZXNzCiAqICAgICAgZXJybm8gdmFsdWUgb3RoZXJ3aXNlCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmludCB3bF9wY2lfc2V0dXAoIHN0cnVjdCBwY2lfZGV2ICpwZGV2ICkKewogICAgaW50ICAgICAgICAgICAgICAgICByZXN1bHQgPSAwOwogICAgc3RydWN0IG5ldF9kZXZpY2UgICAqZGV2ID0gTlVMTDsKICAgIHN0cnVjdCB3bF9wcml2YXRlICAgKmxwID0gTlVMTDsKICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCiAgICBEQkdfRlVOQyggIndsX3BjaV9zZXR1cCIgKTsKICAgIERCR19FTlRFUiggRGJnSW5mbyApOwoKICAgIC8qIE1ha2Ugc3VyZSB0aGUgcGNpX2RldiBwb2ludGVyIHBhc3NlZCBpbiBpcyB2YWxpZCAqLwogICAgaWYoIHBkZXYgPT0gTlVMTCApIHsKICAgICAgICBEQkdfRVJST1IoIERiZ0luZm8sICJQQ0kgc3Vic3lzIHBhc3NlZCBpbiBhbiBpbnZhbGlkIHBjaV9kZXYgcG9pbnRlclxuIiApOwogICAgICAgIHJldHVybiAtRU5PREVWOwogICAgfQoKICAgIHJlc3VsdCA9IHBjaV9lbmFibGVfZGV2aWNlKCBwZGV2ICk7CiAgICBpZiggcmVzdWx0ICE9IDAgKSB7CiAgICAgICAgREJHX0VSUk9SKCBEYmdJbmZvLCAicGNpX2VuYWJsZV9kZXZpY2UoKSBmYWlsZWRcbiIgKTsKICAgICAgICBEQkdfTEVBVkUoIERiZ0luZm8gKTsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgfQoKICAgIC8qIFdlIGZvdW5kIG91ciBkZXZpY2UhIExldCdzIHJlZ2lzdGVyIGl0IHdpdGggdGhlIHN5c3RlbSAqLwogICAgREJHX1RSQUNFKCBEYmdJbmZvLCAiRm91bmQgb3VyIGRldmljZSwgbm93IHJlZ2lzdGVyaW5nXG4iICk7CiAgICBkZXYgPSB3bF9kZXZpY2VfYWxsb2MoICk7CiAgICBpZiggZGV2ID09IE5VTEwgKSB7CiAgICAgICAgREJHX0VSUk9SKCBEYmdJbmZvLCAiQ291bGQgbm90IHJlZ2lzdGVyIGRldmljZSEhIVxuIiApOwogICAgICAgIERCR19MRUFWRSggRGJnSW5mbyApOwogICAgICAgIHJldHVybiAtRU5PTUVNOwogICAgfQoKICAgIC8qIE1ha2Ugc3VyZSB0aGF0IHNwYWNlIHdhcyBhbGxvY2F0ZWQgZm9yIG91ciBwcml2YXRlIGFkYXB0ZXIgc3RydWN0ICovCiAgICBpZiggZGV2LT5wcml2ID09IE5VTEwgKSB7CiAgICAgICAgREJHX0VSUk9SKCBEYmdJbmZvLCAiUHJpdmF0ZSBhZGFwdGVyIHN0cnVjdCB3YXMgbm90IGFsbG9jYXRlZCEhIVxuIiApOwogICAgICAgIERCR19MRUFWRSggRGJnSW5mbyApOwogICAgICAgIHJldHVybiAtRU5PTUVNOwogICAgfQoKI2lmZGVmIEVOQUJMRV9ETUEKICAgIC8qIEFsbG9jYXRlIERNQSBEZXNjcmlwdG9ycyAqLwogICAgaWYoIHdsX3BjaV9kbWFfYWxsb2MoIHBkZXYsIChzdHJ1Y3Qgd2xfcHJpdmF0ZSAqKWRldi0+cHJpdiApIDwgMCApIHsKICAgICAgICBEQkdfRVJST1IoIERiZ0luZm8sICJDb3VsZCBub3QgYWxsb2NhdGUgRE1BIGRlc2NyaXB0b3IgbWVtb3J5ISEhXG4iICk7CiAgICAgICAgREJHX0xFQVZFKCBEYmdJbmZvICk7CiAgICAgICAgcmV0dXJuIC1FTk9NRU07CiAgICB9CiNlbmRpZgoKICAgIC8qIFJlZ2lzdGVyIG91ciBwcml2YXRlIGFkYXB0ZXIgc3RydWN0dXJlIHdpdGggUENJICovCiAgICBwY2lfc2V0X2RydmRhdGEoIHBkZXYsIGRldiApOwoKICAgIC8qIEZpbGwgb3V0IGJ1cyBzcGVjaWZpYyBpbmZvcm1hdGlvbiBpbiB0aGUgbmV0X2RldmljZSBzdHJ1Y3QgKi8KICAgIGRldi0+aXJxID0gcGRldi0+aXJxOwogICAgU0VUX01PRFVMRV9PV05FUiggZGV2ICk7CgogICAgREJHX1RSQUNFKCBEYmdJbmZvLCAiRGV2aWNlIEJhc2UgQWRkcmVzczogJSMwM2x4XG4iLCBwZGV2LT5yZXNvdXJjZVswXS5zdGFydCApOwoJZGV2LT5iYXNlX2FkZHIgPSBwZGV2LT5yZXNvdXJjZVswXS5zdGFydDsKCiAgICAvKiBJbml0aWFsaXplIG91ciBkZXZpY2UgaGVyZSAqLwogICAgaWYoICF3bF9hZGFwdGVyX2luc2VydCggZGV2ICkpIHsKICAgICAgICBEQkdfRVJST1IoIERiZ0luZm8sICJ3bF9hZGFwdGVyX2luc2VydCgpIEZBSUxFRCEhIVxuIiApOwogICAgICAgIHdsX2RldmljZV9kZWFsbG9jKCBkZXYgKTsKICAgICAgICBEQkdfTEVBVkUoIERiZ0luZm8gKTsKICAgICAgICByZXR1cm4gLUVJTlZBTDsKICAgIH0KCiAgICAvKiBSZWdpc3RlciBvdXIgSVNSICovCiAgICBEQkdfVFJBQ0UoIERiZ0luZm8sICJSZWdpc3RlcmluZyBJU1IuLi5cbiIgKTsKCiAgICByZXN1bHQgPSByZXF1ZXN0X2lycShkZXYtPmlycSwgd2xfaXNyLCBTQV9TSElSUSwgZGV2LT5uYW1lLCBkZXYpOwogICAgaWYoIHJlc3VsdCApIHsKICAgICAgICBEQkdfV0FSTklORyggRGJnSW5mbywgIkNvdWxkIG5vdCByZWdpc3RlciBJU1IhISFcbiIgKTsKICAgICAgICBEQkdfTEVBVkUoIERiZ0luZm8gKTsKICAgICAgICByZXR1cm4gcmVzdWx0OwoJfQoKICAgIC8qIE1ha2Ugc3VyZSBpbnRlcnJ1cHRzIGFyZSBlbmFibGVkIHByb3Blcmx5IGZvciBDYXJkQnVzICovCiAgICBscCA9IChzdHJ1Y3Qgd2xfcHJpdmF0ZSAqKWRldi0+cHJpdjsKCiAgICBpZiggbHAtPmhjZkN0eC5JRkJfQnVzVHlwZSA9PSBDRkdfTklDX0JVU19UWVBFX0NBUkRCVVMgfHwKCSAgICBscC0+aGNmQ3R4LklGQl9CdXNUeXBlID09IENGR19OSUNfQlVTX1RZUEVfUENJIAkJKSB7CiAgICAgICAgREJHX1RSQUNFKCBEYmdJbmZvLCAiVGhpcyBpcyBhIFBDSS9DYXJkQnVzIGNhcmQsIGVuYWJsZSBpbnRlcnJ1cHRzXG4iICk7CiAgICAgICAgd2xfcGNpX2VuYWJsZV9jYXJkYnVzX2ludGVycnVwdHMoIHBkZXYgKTsKICAgIH0KCiAgICAvKiBFbmFibGUgYnVzIG1hc3RlcmluZyAqLwogICAgcGNpX3NldF9tYXN0ZXIoIHBkZXYgKTsKCiAgICBEQkdfTEVBVkUoIERiZ0luZm8gKTsKICAgIHJldHVybiAwOwp9IC8vIHdsX3BjaV9zZXR1cAovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJd2xfcGNpX2VuYWJsZV9jYXJkYnVzX2ludGVycnVwdHMoKQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgogKiAgREVTQ1JJUFRJT046CiAqCiAqICAgICAgQ2FsbGVkIGJ5IHdsX3BjaV9zZXR1cCgpIHRvIGVuYWJsZSBpbnRlcnJ1cHRzIG9uIGEgQ2FyZEJ1cyBkZXZpY2UuIFRoaXMKICogIGlzIGRvbmUgYnkgd3JpdGluZyBiaXQgMTUgdG8gdGhlIGZ1bmN0aW9uIGV2ZW50IG1hc2sgcmVnaXN0ZXIuIFRoaXMKICogIENhcmRCdXMtc3BlY2lmaWMgcmVnaXN0ZXIgaXMgbG9jYXRlZCBpbiBCQVIyIChjb3VudGluZyBmcm9tIEJBUjApLCBpbiBtZW1vcnkKICogIHNwYWNlIGF0IGJ5dGUgb2Zmc2V0IDFmNCAoN2Y0IGZvciBXQVJQKS4KICoKICogIFBBUkFNRVRFUlM6CiAqCiAqICAgICAgcGRldiAtIGEgcG9pbnRlciB0byB0aGUgZGV2aWNlJ3MgcGNpX2RldiBzdHJ1Y3R1cmUKICoKICogIFJFVFVSTlM6CiAqCiAqICAgICAgTi9BCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnZvaWQgd2xfcGNpX2VuYWJsZV9jYXJkYnVzX2ludGVycnVwdHMoIHN0cnVjdCBwY2lfZGV2ICpwZGV2ICkKewogICAgdTMyICAgICAgICAgICAgICAgICBiYXIyX3JlZzsKICAgIHUzMiAgICAgICAgICAgICAgICAgbWVtX2FkZHJfYnVzOwogICAgdTMyICAgICAgICAgICAgICAgICBmdW5jX2V2dF9tYXNrX3JlZzsKICAgIHZvaWQgICAgICAgICAgICAgICAgKm1lbV9hZGRyX2tlcm4gPSBOVUxMOwogICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKICAgIERCR19GVU5DKCAid2xfcGNpX2VuYWJsZV9jYXJkYnVzX2ludGVycnVwdHMiICk7CiAgICBEQkdfRU5URVIoIERiZ0luZm8gKTsKCiAgICAvKiBJbml0aWFsaXplIHRvIGtub3duIGJhZCB2YWx1ZXMgKi8KICAgIGJhcjJfcmVnID0gMHhkZWFkYmVlZjsKICAgIG1lbV9hZGRyX2J1cyA9IDB4ZGVhZGJlZWY7CgogICAgLyogUmVhZCB0aGUgQkFSMiByZWdpc3RlcjsgdGhpcyByZWdpc3RlciBjb250YWlucyB0aGUgYmFzZSBhZGRyZXNzIG9mIHRoZQogICAgICAgbWVtb3J5IHJlZ2lvbiB3aGVyZSB0aGUgZnVuY3Rpb24gZXZlbnQgbWFzayByZWdpc3RlciBsaXZlcyAqLwogICAgcGNpX3JlYWRfY29uZmlnX2R3b3JkKCBwZGV2LCBQQ0lfQkFTRV9BRERSRVNTXzIsICZiYXIyX3JlZyApOwogICAgbWVtX2FkZHJfYnVzID0gYmFyMl9yZWcgJiBQQ0lfQkFTRV9BRERSRVNTX01FTV9NQVNLOwoKICAgIC8qIE9uY2UgdGhlIGJhc2UgYWRkcmVzcyBpcyBvYnRhaW5lZCwgcmVtYXAgdGhlIG1lbW9yeSByZWdpb24gdG8ga2VybmVsCiAgICAgICBzcGFjZSBzbyB3ZSBjYW4gcmV0cmlldmUgdGhlIHJlZ2lzdGVyICovCiAgICBtZW1fYWRkcl9rZXJuID0gaW9yZW1hcCggbWVtX2FkZHJfYnVzLCAweDIwMCApOwoKI2lmZGVmIEhFUk1FUzI1CiNkZWZpbmUgUkVHX09GRlNFVCAgMHgwN0Y0CiNlbHNlCiNkZWZpbmUgUkVHX09GRlNFVCAgMHgwMUY0CiNlbmRpZiAvLyBIRVJNRVMyNQoKI2RlZmluZSBCSVQxNSAgICAgICAweDgwMDAKCiAgICAvKiBSZXRyaWV2ZSB0aGUgZnVuY3Rpb25hbCBldmVudCBtYXNrIHJlZ2lzdGVyLCBlbmFibGUgaW50ZXJydXB0cyBieQogICAgICAgc2V0dGluZyBCaXQgMTUsIGFuZCB3cml0ZSBiYWNrIHRoZSB2YWx1ZSAqLwogICAgZnVuY19ldnRfbWFza19yZWcgPSAqKHUzMiAqKSggbWVtX2FkZHJfa2VybiArIFJFR19PRkZTRVQgKTsKICAgIGZ1bmNfZXZ0X21hc2tfcmVnIHw9IEJJVDE1OwogICAgKih1MzIgKikoIG1lbV9hZGRyX2tlcm4gKyBSRUdfT0ZGU0VUICkgPSBmdW5jX2V2dF9tYXNrX3JlZzsKCiAgICAvKiBPbmNlIGNvbXBsZXRlLCB1bm1hcCB0aGUgcmVnaW9uIGFuZCBleGl0ICovCiAgICBpb3VubWFwKCBtZW1fYWRkcl9rZXJuICk7CgogICAgREJHX0xFQVZFKCBEYmdJbmZvICk7CiAgICByZXR1cm47Cn0gLy8gd2xfcGNpX2VuYWJsZV9jYXJkYnVzX2ludGVycnVwdHMKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KCiNpZmRlZiBFTkFCTEVfRE1BCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCXdsX3BjaV9kbWFfYWxsb2MoKQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgogKiAgREVTQ1JJUFRJT046CiAqCiAqICAgICAgQWxsb2NhdGVzIGFsbCByZXNvdXJjZXMgbmVlZGVkIGZvciBQQ0kvQ2FyZEJ1cyBETUEgb3BlcmF0aW9uCiAqCiAqICBQQVJBTUVURVJTOgogKgogKiAgICAgIHBkZXYgLSBhIHBvaW50ZXIgdG8gdGhlIGRldmljZSdzIHBjaV9kZXYgc3RydWN0dXJlCiAqICAgICAgbHAgIC0gdGhlIGRldmljZSdzIHByaXZhdGUgYWRhcHRlciBzdHJ1Y3R1cmUKICoKICogIFJFVFVSTlM6CiAqCiAqICAgICAgMCBvbiBzdWNjZXNzCiAqICAgICAgZXJybm8gdmFsdWUgb3RoZXJ3aXNlCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmludCB3bF9wY2lfZG1hX2FsbG9jKCBzdHJ1Y3QgcGNpX2RldiAqcGRldiwgc3RydWN0IHdsX3ByaXZhdGUgKmxwICkKewogICAgaW50IGk7CiAgICBpbnQgc3RhdHVzID0gMDsKICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCiAgICBEQkdfRlVOQyggIndsX3BjaV9kbWFfYWxsb2MiICk7CiAgICBEQkdfRU5URVIoIERiZ0luZm8gKTsKCi8vICAgICBscC0+ZG1hLnR4X3JzY19pbmQgPSBscC0+ZG1hLnJ4X3JzY19pbmQgPSAwOwovLwovLyAgICAgLyogQWxsb2MgZm9yIHRoZSBUeCBjaGFpbiBhbmQgaXRzIHJlY2xhaW0gZGVzY3JpcHRvciAqLwovLyAgICAgZm9yKCBpID0gMDsgaSA8IE5VTV9UWF9ERVNDOyBpKysgKSB7Ci8vICAgICAgICAgc3RhdHVzID0gd2xfcGNpX2RtYV9hbGxvY190eF9wYWNrZXQoIHBkZXYsIGxwLCAmbHAtPmRtYS50eF9wYWNrZXRbaV0gKTsKLy8gICAgICAgICBpZiggc3RhdHVzID09IDAgKSB7Ci8vICAgICAgICAgICAgIERCR19QUklOVCggImxwLT5kbWEudHhfcGFja2V0WyVkXSA6ICAgICAgICAgICAgICAgICAweCVwXG4iLCBpLCBscC0+ZG1hLnR4X3BhY2tldFtpXSApOwovLyAgICAgICAgICAgICBEQkdfUFJJTlQoICJscC0+ZG1hLnR4X3BhY2tldFslZF0tPm5leHRfZGVzY19hZGRyIDogMHglcFxuIiwgaSwgbHAtPmRtYS50eF9wYWNrZXRbaV0tPm5leHRfZGVzY19hZGRyICk7Ci8vICAgICAgICAgICAgIGxwLT5kbWEudHhfcnNjX2luZCsrOwovLyAgICAgICAgIH0gZWxzZSB7Ci8vICAgICAgICAgICAgIERCR19FUlJPUiggRGJnSW5mbywgIkNvdWxkIG5vdCBhbGxvYyBETUEgVHggUGFja2V0XG4iICk7Ci8vICAgICAgICAgICAgIGJyZWFrOwovLyAgICAgICAgIH0KLy8gICAgIH0KLy8gICAgIGlmKCBzdGF0dXMgPT0gMCApIHsKLy8gICAgICAgICBzdGF0dXMgPSB3bF9wY2lfZG1hX2FsbG9jX2Rlc2MoIHBkZXYsIGxwLCAmbHAtPmRtYS50eF9yZWNsYWltX2Rlc2MgKTsKLy8gICAgICAgICBEQkdfUFJJTlQoICJscC0+ZG1hLnR4X3JlY2xhaW1fZGVzYzogMHglcFxuIiwgbHAtPmRtYS50eF9yZWNsYWltX2Rlc2MgKTsKLy8gICAgIH0KLy8gICAgIC8qIEFsbG9jIGZvciB0aGUgUnggY2hhaW4gYW5kIGl0cyByZWNsYWltIGRlc2NyaXB0b3IgKi8KLy8gICAgIGlmKCBzdGF0dXMgPT0gMCApIHsKLy8gICAgICAgICBmb3IoIGkgPSAwOyBpIDwgTlVNX1JYX0RFU0M7IGkrKyApIHsKLy8gICAgICAgICAgICAgc3RhdHVzID0gd2xfcGNpX2RtYV9hbGxvY19yeF9wYWNrZXQoIHBkZXYsIGxwLCAmbHAtPmRtYS5yeF9wYWNrZXRbaV0gKTsKLy8gICAgICAgICAgICAgaWYoIHN0YXR1cyA9PSAwICkgewovLyAgICAgICAgICAgICAgICAgREJHX1BSSU5UKCAibHAtPmRtYS5yeF9wYWNrZXRbJWRdICAgICAgICAgICAgICAgICA6IDB4JXBcbiIsIGksIGxwLT5kbWEucnhfcGFja2V0W2ldICk7Ci8vICAgICAgICAgICAgICAgICBEQkdfUFJJTlQoICJscC0+ZG1hLnJ4X3BhY2tldFslZF0tPm5leHRfZGVzY19hZGRyIDogMHglcFxuIiwgaSwgbHAtPmRtYS5yeF9wYWNrZXRbaV0tPm5leHRfZGVzY19hZGRyICk7Ci8vICAgICAgICAgICAgICAgICBscC0+ZG1hLnJ4X3JzY19pbmQrKzsKLy8gICAgICAgICAgICAgfSBlbHNlIHsKLy8gICAgICAgICAgICAgICAgIERCR19FUlJPUiggRGJnSW5mbywgIkNvdWxkIG5vdCBhbGxvYyBETUEgUnggUGFja2V0XG4iICk7Ci8vICAgICAgICAgICAgICAgICBicmVhazsKLy8gICAgICAgICAgICAgfQovLyAgICAgICAgIH0KLy8gICAgIH0KLy8gICAgIGlmKCBzdGF0dXMgPT0gMCApIHsKLy8gICAgICAgICBzdGF0dXMgPSB3bF9wY2lfZG1hX2FsbG9jX2Rlc2MoIHBkZXYsIGxwLCAmbHAtPmRtYS5yeF9yZWNsYWltX2Rlc2MgKTsKLy8gICAgICAgICBEQkdfUFJJTlQoICJscC0+ZG1hLnJ4X3JlY2xhaW1fZGVzYzogMHglcFxuIiwgbHAtPmRtYS5yeF9yZWNsYWltX2Rlc2MgKTsKLy8gICAgIH0KLy8gICAgIC8qIFN0b3JlIHN0YXR1cywgYXMgaG9zdCBzaG91bGQgbm90IGNhbGwgSENGIGZ1bmN0aW9ucyBpZiB0aGlzIGZhaWxzICovCi8vICAgICBscC0+ZG1hLnN0YXR1cyA9IHN0YXR1czsgIC8vOz9hbGwgdXNlYWdlcyBvZiBkbWEuc3RhdHVzIGhhdmUgYmVlbiBjb21tZW50ZWQgb3V0Ci8vICAgICBEQkdfTEVBVkUoIERiZ0luZm8gKTsKICAgIHJldHVybiBzdGF0dXM7Cn0gLy8gd2xfcGNpX2RtYV9hbGxvYwovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJd2xfcGNpX2RtYV9mcmVlKCkKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoKICogIERFU0NSSVBUSU9OOgogKgogKiAgICAgIERlYWxsb2NhdGVkIGFsbCByZXNvdXJjZXMgbmVlZGVkIGZvciBQQ0kvQ2FyZEJ1cyBETUEgb3BlcmF0aW9uCiAqCiAqICBQQVJBTUVURVJTOgogKgogKiAgICAgIHBkZXYgLSBhIHBvaW50ZXIgdG8gdGhlIGRldmljZSdzIHBjaV9kZXYgc3RydWN0dXJlCiAqICAgICAgbHAgIC0gdGhlIGRldmljZSdzIHByaXZhdGUgYWRhcHRlciBzdHJ1Y3R1cmUKICoKICogIFJFVFVSTlM6CiAqCiAqICAgICAgMCBvbiBzdWNjZXNzCiAqICAgICAgZXJybm8gdmFsdWUgb3RoZXJ3aXNlCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmludCB3bF9wY2lfZG1hX2ZyZWUoIHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHAgKQp7CiAgICBpbnQgaTsKICAgIGludCBzdGF0dXMgPSAwOwogICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKICAgIERCR19GVU5DKCAid2xfcGNpX2RtYV9mcmVlIiApOwogICAgREJHX0VOVEVSKCBEYmdJbmZvICk7CgogICAgLyogUmVjbGFpbSBhbGwgUnggcGFja2V0cyB0aGF0IHdlcmUgaGFuZGVkIG92ZXIgdG8gdGhlIEhDRiAqLwogICAgLyogRG8gSSBuZWVkIHRvIGRvIHRoaXM/IEJlZm9yZSB0aGlzIGZyZWUgaXMgY2FsbGVkLCBJJ3ZlIGFscmVhZHkgZGlzYWJsZWQKICAgICAgIHRoZSBwb3J0IHdoaWNoIHdpbGwgY2FsbCB3bF9wY2lfZG1hX2hjZl9yZWNsYWltICovCiAgICAvL2lmKCBscC0+ZG1hLnN0YXR1cyA9PSAwICkKICAgIC8vewogICAgLy8gICAgd2xfcGNpX2RtYV9oY2ZfcmVjbGFpbSggbHAgKTsKICAgIC8vfQoKICAgIC8qIEZyZWUgZXZlcnl0aGluZyBuZWVkZWQgZm9yIERNQSBSeCAqLwogICAgZm9yKCBpID0gMDsgaSA8IE5VTV9SWF9ERVNDOyBpKysgKSB7CiAgICAgICAgaWYoIGxwLT5kbWEucnhfcGFja2V0W2ldICkgewogICAgICAgICAgICBzdGF0dXMgPSB3bF9wY2lfZG1hX2ZyZWVfcnhfcGFja2V0KCBwZGV2LCBscCwgJmxwLT5kbWEucnhfcGFja2V0W2ldICk7CiAgICAgICAgICAgIGlmKCBzdGF0dXMgIT0gMCApIHsKICAgICAgICAgICAgICAgIERCR19XQVJOSU5HKCBEYmdJbmZvLCAiUHJvYmxlbSBmcmVlaW5nIFJ4IHBhY2tldFxuIiApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgbHAtPmRtYS5yeF9yc2NfaW5kID0gMDsKCiAgICBpZiggbHAtPmRtYS5yeF9yZWNsYWltX2Rlc2MgKSB7CiAgICAgICAgc3RhdHVzID0gd2xfcGNpX2RtYV9mcmVlX2Rlc2MoIHBkZXYsIGxwLCAmbHAtPmRtYS5yeF9yZWNsYWltX2Rlc2MgKTsKICAgICAgICBpZiggc3RhdHVzICE9IDAgKSB7CiAgICAgICAgICAgIERCR19XQVJOSU5HKCBEYmdJbmZvLCAiUHJvYmxlbSBmcmVlaW5nIFJ4IHJlY2xhaW0gZGVzY3JpcHRvclxuIiApOwogICAgICAgIH0KICAgIH0KCiAgICAvKiBGcmVlIGV2ZXJ5dGhpbmcgbmVlZGVkIGZvciBETUEgVHggKi8KICAgIGZvciggaSA9IDA7IGkgPCBOVU1fVFhfREVTQzsgaSsrICkgewogICAgICAgIGlmKCBscC0+ZG1hLnR4X3BhY2tldFtpXSApIHsKICAgICAgICAgICAgc3RhdHVzID0gd2xfcGNpX2RtYV9mcmVlX3R4X3BhY2tldCggcGRldiwgbHAsICZscC0+ZG1hLnR4X3BhY2tldFtpXSApOwogICAgICAgICAgICBpZiggc3RhdHVzICE9IDAgKSB7CiAgICAgICAgICAgICAgICBEQkdfV0FSTklORyggRGJnSW5mbywgIlByb2JsZW0gZnJlZWluZyBUeCBwYWNrZXRcbiIgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIGxwLT5kbWEudHhfcnNjX2luZCA9IDA7CgogICAgaWYoIGxwLT5kbWEudHhfcmVjbGFpbV9kZXNjICkgewogICAgICAgIHN0YXR1cyA9IHdsX3BjaV9kbWFfZnJlZV9kZXNjKCBwZGV2LCBscCwgJmxwLT5kbWEudHhfcmVjbGFpbV9kZXNjICk7CiAgICAgICAgaWYoIHN0YXR1cyAhPSAwICkgewogICAgICAgICAgICBEQkdfV0FSTklORyggRGJnSW5mbywgIlByb2JsZW0gZnJlZWluZyBUeCByZWNsYWltIGRlc2NyaXB0b3JcbiIgKTsKICAgICAgICB9CiAgICB9CgogICAgREJHX0xFQVZFKCBEYmdJbmZvICk7CiAgICByZXR1cm4gc3RhdHVzOwp9IC8vIHdsX3BjaV9kbWFfZnJlZQoKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCXdsX3BjaV9kbWFfYWxsb2NfdHhfcGFja2V0KCkKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoKICogIERFU0NSSVBUSU9OOgogKgogKiAgICAgIEFsbG9jYXRlcyBhIHNpbmdsZSBUeCBwYWNrZXQsIGNvbnNpc3Rpbmcgb2Ygc2V2ZXJhbCBkZXNjcmlwdG9ycyBhbmQKICogICAgICBidWZmZXJzLiBEYXRhIHRvIHRyYW5zbWl0IGlzIGZpcnN0IGNvcGllZCBpbnRvIHRoZSAncGF5bG9hZCcgYnVmZmVyCiAqICAgICAgYmVmb3JlIGJlaW5nIHRyYW5zbWl0dGVkLgogKgogKiAgUEFSQU1FVEVSUzoKICoKICogICAgICBwZGV2ICAgIC0gYSBwb2ludGVyIHRvIHRoZSBkZXZpY2UncyBwY2lfZGV2IHN0cnVjdHVyZQogKiAgICAgIGxwICAgICAgLSB0aGUgZGV2aWNlJ3MgcHJpdmF0ZSBhZGFwdGVyIHN0cnVjdHVyZQogKiAgICAgIGRlc2MgICAgLSBhIHBvaW50ZXIgd2hpY2ggd2lsbCByZWZlcmVuY2UgdGhlIGRlc2NyaXB0b3IgdG8gYmUgYWxsb2MnZC4KICoKICogIFJFVFVSTlM6CiAqCiAqICAgICAgMCBvbiBzdWNjZXNzCiAqICAgICAgZXJybm8gdmFsdWUgb3RoZXJ3aXNlCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmludCB3bF9wY2lfZG1hX2FsbG9jX3R4X3BhY2tldCggc3RydWN0IHBjaV9kZXYgKnBkZXYsIHN0cnVjdCB3bF9wcml2YXRlICpscCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERVNDX1NUUkNUICoqZGVzYyApCnsKLy8gICAgIGludCBzdGF0dXMgPSAwOwovLyAgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwovLwovLyAgICAgaWYoIGRlc2MgPT0gTlVMTCApIHsKLy8gICAgICAgICBzdGF0dXMgPSAtRUZBVUxUOwovLyAgICAgfQovLyAgICAgaWYoIHN0YXR1cyA9PSAwICkgewovLyAgICAgICAgIHN0YXR1cyA9IHdsX3BjaV9kbWFfYWxsb2NfZGVzY19hbmRfYnVmKCBwZGV2LCBscCwgZGVzYywKLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSENGX0RNQV9UWF9CVUYxX1NJWkUgKTsKLy8KLy8gICAgICAgICBpZiggc3RhdHVzID09IDAgKSB7Ci8vICAgICAgICAgICAgIHN0YXR1cyA9IHdsX3BjaV9kbWFfYWxsb2NfZGVzY19hbmRfYnVmKCBwZGV2LCBscCwKLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYoICgqZGVzYyktPm5leHRfZGVzY19hZGRyICksCi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQ0ZfTUFYX1BBQ0tFVF9TSVpFICk7Ci8vICAgICAgICAgfQovLyAgICAgfQovLyAgICAgaWYoIHN0YXR1cyA9PSAwICkgewovLyAgICAgICAgICgqZGVzYyktPm5leHRfZGVzY19waHlzX2FkZHIgPSAoKmRlc2MpLT5uZXh0X2Rlc2NfYWRkci0+ZGVzY19waHlzX2FkZHI7Ci8vICAgICB9Ci8vICAgICByZXR1cm4gc3RhdHVzOwp9IC8vIHdsX3BjaV9kbWFfYWxsb2NfdHhfcGFja2V0Ci8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgl3bF9wY2lfZG1hX2ZyZWVfdHhfcGFja2V0KCkKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoKICogIERFU0NSSVBUSU9OOgogKgogKiAgICAgIEZyZWVzIGEgc2luZ2xlIFR4IHBhY2tldCwgZGVzY3JpYmVkIGluIHRoZSBjb3JyZXNwb25kaW5nIGFsbG9jIGZ1bmN0aW9uLgogKgogKiAgUEFSQU1FVEVSUzoKICoKICogICAgICBwZGV2ICAgIC0gYSBwb2ludGVyIHRvIHRoZSBkZXZpY2UncyBwY2lfZGV2IHN0cnVjdHVyZQogKiAgICAgIGxwICAgICAgLSB0aGUgZGV2aWNlJ3MgcHJpdmF0ZSBhZGFwdGVyIHN0cnVjdHVyZQogKiAgICAgIGRlc2MgICAgLSBhIHBvaW50ZXIgd2hpY2ggd2lsbCByZWZlcmVuY2UgdGhlIGRlc2NyaXB0b3IgdG8gYmUgYWxsb2MnZC4KICoKICogIFJFVFVSTlM6CiAqCiAqICAgICAgMCBvbiBzdWNjZXNzCiAqICAgICAgZXJybm8gdmFsdWUgb3RoZXJ3aXNlCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmludCB3bF9wY2lfZG1hX2ZyZWVfdHhfcGFja2V0KCBzdHJ1Y3QgcGNpX2RldiAqcGRldiwgc3RydWN0IHdsX3ByaXZhdGUgKmxwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFU0NfU1RSQ1QgKipkZXNjICkKewogICAgaW50IHN0YXR1cyA9IDA7CiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgogICAgaWYoICpkZXNjID09IE5VTEwgKSB7CiAgICAgICAgREJHX1BSSU5UKCAiTnVsbCBkZXNjcmlwdG9yXG4iICk7CiAgICAgICAgc3RhdHVzID0gLUVGQVVMVDsKICAgIH0KCS8vOz90aGUgImxpbWl0ZWQiIE5ESVMgc3RyYXRlZ3ksIGFzc3VtaW5nIGEgZnJhbWUgY29uc2lzdHMgQUxXQVlTIG91dCBvZiAyCgkvL2Rlc2NyaXB0b3JzLCBtYWtlIHRoaXMgcm9idXN0CiAgICBpZiggc3RhdHVzID09IDAgJiYgKCpkZXNjKS0+bmV4dF9kZXNjX2FkZHIgKSB7CiAgICAgICAgc3RhdHVzID0gd2xfcGNpX2RtYV9mcmVlX2Rlc2NfYW5kX2J1ZiggcGRldiwgbHAsICYoKmRlc2MpLT5uZXh0X2Rlc2NfYWRkciApOwogICAgfQogICAgaWYoIHN0YXR1cyA9PSAwICkgewogICAgICAgIHN0YXR1cyA9IHdsX3BjaV9kbWFfZnJlZV9kZXNjX2FuZF9idWYoIHBkZXYsIGxwLCBkZXNjICk7CiAgICB9CiAgICByZXR1cm4gc3RhdHVzOwp9IC8vIHdsX3BjaV9kbWFfZnJlZV90eF9wYWNrZXQKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCXdsX3BjaV9kbWFfYWxsb2NfcnhfcGFja2V0KCkKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoKICogIERFU0NSSVBUSU9OOgogKgogKiAgICAgIEFsbG9jYXRlcyBhIHNpbmdsZSBSeCBwYWNrZXQsIGNvbnNpc3Rpbmcgb2YgdHdvIGRlc2NyaXB0b3JzIGFuZCBvbmUKICogICAgICBjb250aWd1b3VzIGJ1ZmZlci4gVEhlIGJ1ZmZlciBzdGFydHMgd2l0aCB0aGUgaGVybWVzLXNwZWNpZmljIGhlYWRlci4KICogICAgICBPbmUgZGVzY3JpcHRvciBwb2ludHMgYXQgdGhlIHN0YXJ0LCB0aGUgb3RoZXIgYXQgb2Zmc2V0IDB4M2Egb2YgdGhlCiAqICAgICAgYnVmZmVyLgogKgogKiAgUEFSQU1FVEVSUzoKICoKICogICAgICBwZGV2ICAgIC0gYSBwb2ludGVyIHRvIHRoZSBkZXZpY2UncyBwY2lfZGV2IHN0cnVjdHVyZQogKiAgICAgIGxwICAgICAgLSB0aGUgZGV2aWNlJ3MgcHJpdmF0ZSBhZGFwdGVyIHN0cnVjdHVyZQogKiAgICAgIGRlc2MgICAgLSBhIHBvaW50ZXIgd2hpY2ggd2lsbCByZWZlcmVuY2UgdGhlIGRlc2NyaXB0b3IgdG8gYmUgYWxsb2MnZC4KICoKICogIFJFVFVSTlM6CiAqCiAqICAgICAgMCBvbiBzdWNjZXNzCiAqICAgICAgZXJybm8gdmFsdWUgb3RoZXJ3aXNlCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmludCB3bF9wY2lfZG1hX2FsbG9jX3J4X3BhY2tldCggc3RydWN0IHBjaV9kZXYgKnBkZXYsIHN0cnVjdCB3bF9wcml2YXRlICpscCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERVNDX1NUUkNUICoqZGVzYyApCnsKICAgIGludCAgICAgICAgIHN0YXR1cyA9IDA7CiAgICBERVNDX1NUUkNUICAqcDsKICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCi8vICAgICBpZiggZGVzYyA9PSBOVUxMICkgewovLyAgICAgICAgIHN0YXR1cyA9IC1FRkFVTFQ7Ci8vICAgICB9Ci8vIAkvLzs/dGhlICJsaW1pdGVkIiBORElTIHN0cmF0ZWd5LCBhc3N1bWluZyBhIGZyYW1lIGNvbnNpc3RzIEFMV0FZUyBvdXQgb2YgMgovLyAJLy9kZXNjcmlwdG9ycywgbWFrZSB0aGlzIHJvYnVzdAovLyAgICAgaWYoIHN0YXR1cyA9PSAwICkgewovLyAgICAgICAgIHN0YXR1cyA9IHdsX3BjaV9kbWFfYWxsb2NfZGVzYyggcGRldiwgbHAsIGRlc2MgKTsKLy8gCX0KLy8gICAgIGlmKCBzdGF0dXMgPT0gMCApIHsKLy8gICAgICAgICBzdGF0dXMgPSB3bF9wY2lfZG1hX2FsbG9jX2J1ZiggcGRldiwgbHAsICpkZXNjLCBIQ0ZfTUFYX1BBQ0tFVF9TSVpFICk7Ci8vICAgICB9Ci8vICAgICBpZiggc3RhdHVzID09IDAgKSB7Ci8vICAgICAgICAgc3RhdHVzID0gd2xfcGNpX2RtYV9hbGxvY19kZXNjKCBwZGV2LCBscCwgJnAgKTsKLy8gICAgIH0KLy8gICAgIGlmKCBzdGF0dXMgPT0gMCApIHsKLy8gICAgICAgICAvKiBTaXplIG9mIDFzdCBkZXNjcmlwdG9yIGJlY29tZXMgMHgzYSBieXRlcyAqLwovLyAgICAgICAgIFNFVF9CVUZfU0laRSggKmRlc2MsIEhDRl9ETUFfUlhfQlVGMV9TSVpFICk7Ci8vCi8vICAgICAgICAgLyogTWFrZSAybmQgZGVzY3JpcHRvciBwb2ludCBhdCBvZmZzZXQgMHgzYSBvZiB0aGUgYnVmZmVyICovCi8vICAgICAgICAgU0VUX0JVRl9TSVpFKCBwLCAoIEhDRl9NQVhfUEFDS0VUX1NJWkUgLSBIQ0ZfRE1BX1JYX0JVRjFfU0laRSApKTsKLy8gICAgICAgICBwLT5idWZfYWRkciAgICAgICA9ICgqZGVzYyktPmJ1Zl9hZGRyICsgSENGX0RNQV9SWF9CVUYxX1NJWkU7Ci8vICAgICAgICAgcC0+YnVmX3BoeXNfYWRkciAgPSAoKmRlc2MpLT5idWZfcGh5c19hZGRyICsgSENGX0RNQV9SWF9CVUYxX1NJWkU7Ci8vICAgICAgICAgcC0+bmV4dF9kZXNjX2FkZHIgPSBOVUxMOwovLwovLyAgICAgICAgIC8qIENoYWluIDJuZCBkZXNjcmlwdG9yIHRvIDFzdCBkZXNjcmlwdG9yICovCi8vICAgICAgICAgKCpkZXNjKS0+bmV4dF9kZXNjX2FkZHIgICAgICA9IHA7Ci8vICAgICAgICAgKCpkZXNjKS0+bmV4dF9kZXNjX3BoeXNfYWRkciA9IHAtPmRlc2NfcGh5c19hZGRyOwovLyAgICAgfQoKICAgIHJldHVybiBzdGF0dXM7Cn0gLy8gd2xfcGNpX2RtYV9hbGxvY19yeF9wYWNrZXQKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCXdsX3BjaV9kbWFfZnJlZV9yeF9wYWNrZXQoKQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgogKiAgREVTQ1JJUFRJT046CiAqCiAqICAgICAgRnJlZXMgYSBzaW5nbGUgUnggcGFja2V0LCBkZXNjcmliZWQgaW4gdGhlIGNvcnJlc3BvbmRpbmcgYWxsb2MgZnVuY3Rpb24uCiAqCiAqICBQQVJBTUVURVJTOgogKgogKiAgICAgIHBkZXYgICAgLSBhIHBvaW50ZXIgdG8gdGhlIGRldmljZSdzIHBjaV9kZXYgc3RydWN0dXJlCiAqICAgICAgbHAgICAgICAtIHRoZSBkZXZpY2UncyBwcml2YXRlIGFkYXB0ZXIgc3RydWN0dXJlCiAqICAgICAgZGVzYyAgICAtIGEgcG9pbnRlciB3aGljaCB3aWxsIHJlZmVyZW5jZSB0aGUgZGVzY3JpcHRvciB0byBiZSBhbGxvYydkLgogKgogKiAgUkVUVVJOUzoKICoKICogICAgICAwIG9uIHN1Y2Nlc3MKICogICAgICBlcnJubyB2YWx1ZSBvdGhlcndpc2UKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KaW50IHdsX3BjaV9kbWFfZnJlZV9yeF9wYWNrZXQoIHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVTQ19TVFJDVCAqKmRlc2MgKQp7CiAgICBpbnQgc3RhdHVzID0gMDsKICAgIERFU0NfU1RSQ1QgKnA7CiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgogICAgaWYoICpkZXNjID09IE5VTEwgKSB7CiAgICAgICAgc3RhdHVzID0gLUVGQVVMVDsKICAgIH0KICAgIGlmKCBzdGF0dXMgPT0gMCApIHsKICAgICAgICBwID0gKCpkZXNjKS0+bmV4dF9kZXNjX2FkZHI7CgogICAgICAgIC8qIEZyZWUgdGhlIDJuZCBkZXNjcmlwdG9yICovCiAgICAgICAgaWYoIHAgIT0gTlVMTCApIHsKICAgICAgICAgICAgcC0+YnVmX2FkZHIgICAgICA9IE5VTEw7CiAgICAgICAgICAgIHAtPmJ1Zl9waHlzX2FkZHIgPSAwOwoKICAgICAgICAgICAgc3RhdHVzID0gd2xfcGNpX2RtYV9mcmVlX2Rlc2MoIHBkZXYsIGxwLCAmcCApOwogICAgICAgIH0KICAgIH0KCiAgICAvKiBGcmVlIHRoZSBidWZmZXIgYW5kIDFzdCBkZXNjcmlwdG9yICovCiAgICBpZiggc3RhdHVzID09IDAgKSB7CiAgICAgICAgU0VUX0JVRl9TSVpFKCAqZGVzYywgSENGX01BWF9QQUNLRVRfU0laRSApOwogICAgICAgIHN0YXR1cyA9IHdsX3BjaV9kbWFfZnJlZV9kZXNjX2FuZF9idWYoIHBkZXYsIGxwLCBkZXNjICk7CiAgICB9CiAgICByZXR1cm4gc3RhdHVzOwp9IC8vIHdsX3BjaV9kbWFfZnJlZV9yeF9wYWNrZXQKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCXdsX3BjaV9kbWFfYWxsb2NfZGVzY19hbmRfYnVmKCkKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoKICogIERFU0NSSVBUSU9OOgogKgogKiAgICAgIEFsbG9jYXRlcyBhIERNQSBkZXNjcmlwdG9yIGFuZCBidWZmZXIsIGFuZCBhc3NvY2lhdGVzIHRoZW0gd2l0aCBvbmUKICogICAgICBhbm90aGVyLgogKgogKiAgUEFSQU1FVEVSUzoKICoKICogICAgICBwZGV2ICAtIGEgcG9pbnRlciB0byB0aGUgZGV2aWNlJ3MgcGNpX2RldiBzdHJ1Y3R1cmUKICogICAgICBscCAgICAtIHRoZSBkZXZpY2UncyBwcml2YXRlIGFkYXB0ZXIgc3RydWN0dXJlCiAqICAgICAgZGVzYyAgLSBhIHBvaW50ZXIgd2hpY2ggd2lsbCByZWZlcmVuY2UgdGhlIGRlc2NyaXB0b3IgdG8gYmUgYWxsb2MnZAogKgogKiAgUkVUVVJOUzoKICoKICogICAgICAwIG9uIHN1Y2Nlc3MKICogICAgICBlcnJubyB2YWx1ZSBvdGhlcndpc2UKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KaW50IHdsX3BjaV9kbWFfYWxsb2NfZGVzY19hbmRfYnVmKCBzdHJ1Y3QgcGNpX2RldiAqcGRldiwgc3RydWN0IHdsX3ByaXZhdGUgKmxwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFU0NfU1RSQ1QgKipkZXNjLCBpbnQgc2l6ZSApCnsKICAgIGludCBzdGF0dXMgPSAwOwogICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKLy8gICAgIGlmKCBkZXNjID09IE5VTEwgKSB7Ci8vICAgICAgICAgc3RhdHVzID0gLUVGQVVMVDsKLy8gICAgIH0KLy8gICAgIGlmKCBzdGF0dXMgPT0gMCApIHsKLy8gICAgICAgICBzdGF0dXMgPSB3bF9wY2lfZG1hX2FsbG9jX2Rlc2MoIHBkZXYsIGxwLCBkZXNjICk7Ci8vCi8vICAgICAgICAgaWYoIHN0YXR1cyA9PSAwICkgewovLyAgICAgICAgICAgICBzdGF0dXMgPSB3bF9wY2lfZG1hX2FsbG9jX2J1ZiggcGRldiwgbHAsICpkZXNjLCBzaXplICk7Ci8vICAgICAgICAgfQovLyAgICAgfQogICAgcmV0dXJuIHN0YXR1czsKfSAvLyB3bF9wY2lfZG1hX2FsbG9jX2Rlc2NfYW5kX2J1ZgovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJd2xfcGNpX2RtYV9mcmVlX2Rlc2NfYW5kX2J1ZigpCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCiAqICBERVNDUklQVElPTjoKICoKICogICAgICBGcmVlcyBhIERNQSBkZXNjcmlwdG9yIGFuZCBhc3NvY2lhdGVkIGJ1ZmZlci4KICoKICogIFBBUkFNRVRFUlM6CiAqCiAqICAgICAgcGRldiAgLSBhIHBvaW50ZXIgdG8gdGhlIGRldmljZSdzIHBjaV9kZXYgc3RydWN0dXJlCiAqICAgICAgbHAgICAgLSB0aGUgZGV2aWNlJ3MgcHJpdmF0ZSBhZGFwdGVyIHN0cnVjdHVyZQogKiAgICAgIGRlc2MgIC0gYSBwb2ludGVyIHdoaWNoIHdpbGwgcmVmZXJlbmNlIHRoZSBkZXNjcmlwdG9yIHRvIGJlIGFsbG9jJ2QKICoKICogIFJFVFVSTlM6CiAqCiAqICAgICAgMCBvbiBzdWNjZXNzCiAqICAgICAgZXJybm8gdmFsdWUgb3RoZXJ3aXNlCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmludCB3bF9wY2lfZG1hX2ZyZWVfZGVzY19hbmRfYnVmKCBzdHJ1Y3QgcGNpX2RldiAqcGRldiwgc3RydWN0IHdsX3ByaXZhdGUgKmxwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFU0NfU1RSQ1QgKipkZXNjICkKewogICAgaW50IHN0YXR1cyA9IDA7CiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgogICAgaWYoIGRlc2MgPT0gTlVMTCApIHsKICAgICAgICBzdGF0dXMgPSAtRUZBVUxUOwogICAgfQogICAgaWYoIHN0YXR1cyA9PSAwICYmICpkZXNjID09IE5VTEwgKSB7CiAgICAgICAgc3RhdHVzID0gLUVGQVVMVDsKICAgIH0KICAgIGlmKCBzdGF0dXMgPT0gMCApIHsKICAgICAgICBzdGF0dXMgPSB3bF9wY2lfZG1hX2ZyZWVfYnVmKCBwZGV2LCBscCwgKmRlc2MgKTsKCiAgICAgICAgaWYoIHN0YXR1cyA9PSAwICkgewogICAgICAgICAgICBzdGF0dXMgPSB3bF9wY2lfZG1hX2ZyZWVfZGVzYyggcGRldiwgbHAsIGRlc2MgKTsKICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gc3RhdHVzOwp9IC8vIHdsX3BjaV9kbWFfZnJlZV9kZXNjX2FuZF9idWYKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCXdsX3BjaV9kbWFfYWxsb2NfZGVzYygpCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCiAqICBERVNDUklQVElPTjoKICoKICogICAgICBBbGxvY2F0ZXMgb25lIERNQSBkZXNjcmlwdG9yIGluIGNhY2hlIGNvaGVyZW50IG1lbW9yeS4KICoKICogIFBBUkFNRVRFUlM6CiAqCiAqICAgICAgcGRldiAtIGEgcG9pbnRlciB0byB0aGUgZGV2aWNlJ3MgcGNpX2RldiBzdHJ1Y3R1cmUKICogICAgICBscCAgLSB0aGUgZGV2aWNlJ3MgcHJpdmF0ZSBhZGFwdGVyIHN0cnVjdHVyZQogKgogKiAgUkVUVVJOUzoKICoKICogICAgICAwIG9uIHN1Y2Nlc3MKICogICAgICBlcnJubyB2YWx1ZSBvdGhlcndpc2UKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KaW50IHdsX3BjaV9kbWFfYWxsb2NfZGVzYyggc3RydWN0IHBjaV9kZXYgKnBkZXYsIHN0cnVjdCB3bF9wcml2YXRlICpscCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgREVTQ19TVFJDVCAqKmRlc2MgKQp7Ci8vICAgICBpbnQgICAgICAgICBzdGF0dXMgPSAwOwovLyAgICAgZG1hX2FkZHJfdCAgcGE7Ci8vICAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi8vCi8vICAgICBEQkdfRlVOQyggIndsX3BjaV9kbWFfYWxsb2NfZGVzYyIgKTsKLy8gICAgIERCR19FTlRFUiggRGJnSW5mbyApOwovLwovLyAgICAgaWYoIGRlc2MgPT0gTlVMTCApIHsKLy8gICAgICAgICBzdGF0dXMgPSAtRUZBVUxUOwovLyAgICAgfQovLyAgICAgaWYoIHN0YXR1cyA9PSAwICkgewovLyAgICAgICAgICpkZXNjID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQoIHBkZXYsIHNpemVvZiggREVTQ19TVFJDVCApLCAmcGEgKTsKLy8gICAgIH0KLy8gICAgIGlmKCAqZGVzYyA9PSBOVUxMICkgewovLyAgICAgICAgIERCR19FUlJPUiggRGJnSW5mbywgInBjaV9hbGxvY19jb25zaXN0ZW50KCkgZmFpbGVkXG4iICk7Ci8vICAgICAgICAgc3RhdHVzID0gLUVOT01FTTsKLy8gICAgIH0gZWxzZSB7Ci8vICAgICAgICAgbWVtc2V0KCAqZGVzYywgMCwgc2l6ZW9mKCBERVNDX1NUUkNUICkpOwovLyAgICAgICAgICgqZGVzYyktPmRlc2NfcGh5c19hZGRyID0gY3B1X3RvX2xlMzIoIHBhICk7Ci8vICAgICB9Ci8vICAgICBEQkdfTEVBVkUoIERiZ0luZm8gKTsKLy8gICAgIHJldHVybiBzdGF0dXM7Cn0gLy8gd2xfcGNpX2RtYV9hbGxvY19kZXNjCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgl3bF9wY2lfZG1hX2ZyZWVfZGVzYygpCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCiAqICBERVNDUklQVElPTjoKICoKICogICAgICBGcmVlcyBvbmUgRE1BIGRlc2NyaXB0b3IgaW4gY2FjaGUgY29oZXJlbnQgbWVtb3J5LgogKgogKiAgUEFSQU1FVEVSUzoKICoKICogICAgICBwZGV2IC0gYSBwb2ludGVyIHRvIHRoZSBkZXZpY2UncyBwY2lfZGV2IHN0cnVjdHVyZQogKiAgICAgIGxwICAtIHRoZSBkZXZpY2UncyBwcml2YXRlIGFkYXB0ZXIgc3RydWN0dXJlCiAqCiAqICBSRVRVUk5TOgogKgogKiAgICAgIDAgb24gc3VjY2VzcwogKiAgICAgIGVycm5vIHZhbHVlIG90aGVyd2lzZQogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwppbnQgd2xfcGNpX2RtYV9mcmVlX2Rlc2MoIHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIERFU0NfU1RSQ1QgKipkZXNjICkKewogICAgaW50ICAgICAgICAgc3RhdHVzID0gMDsKICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCiAgICBpZiggKmRlc2MgPT0gTlVMTCApIHsKICAgICAgICBzdGF0dXMgPSAtRUZBVUxUOwogICAgfQogICAgaWYoIHN0YXR1cyA9PSAwICkgewogICAgICAgIHBjaV9mcmVlX2NvbnNpc3RlbnQoIHBkZXYsIHNpemVvZiggREVTQ19TVFJDVCApLCAqZGVzYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKmRlc2MpLT5kZXNjX3BoeXNfYWRkciApOwogICAgfQogICAgKmRlc2MgPSBOVUxMOwogICAgcmV0dXJuIHN0YXR1czsKfSAvLyB3bF9wY2lfZG1hX2ZyZWVfZGVzYwovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJd2xfcGNpX2RtYV9hbGxvY19idWYoKQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgogKiAgREVTQ1JJUFRJT046CiAqCiAqICAgICAgQWxsb2NhdGVzIG9uZSBETUEgYnVmZmVyIGluIGNhY2hlIGNvaGVyZW50IG1lbW9yeSwgYW5kIGFzc29jaWF0ZXMgYSBETUEKICogICAgICBkZXNjcmlwdG9yIHdpdGggdGhpcyBidWZmZXIuCiAqCiAqICBQQVJBTUVURVJTOgogKgogKiAgICAgIHBkZXYgLSBhIHBvaW50ZXIgdG8gdGhlIGRldmljZSdzIHBjaV9kZXYgc3RydWN0dXJlCiAqICAgICAgbHAgIC0gdGhlIGRldmljZSdzIHByaXZhdGUgYWRhcHRlciBzdHJ1Y3R1cmUKICoKICogIFJFVFVSTlM6CiAqCiAqICAgICAgMCBvbiBzdWNjZXNzCiAqICAgICAgZXJybm8gdmFsdWUgb3RoZXJ3aXNlCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmludCB3bF9wY2lfZG1hX2FsbG9jX2J1Ziggc3RydWN0IHBjaV9kZXYgKnBkZXYsIHN0cnVjdCB3bF9wcml2YXRlICpscCwKICAgICAgICAgICAgICAgICAgICAgICAgICBERVNDX1NUUkNUICpkZXNjLCBpbnQgc2l6ZSApCnsKICAgIGludCAgICAgICAgIHN0YXR1cyA9IDA7CiAgICBkbWFfYWRkcl90ICBwYTsKICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCi8vICAgICBEQkdfRlVOQyggIndsX3BjaV9kbWFfYWxsb2NfYnVmIiApOwovLyAgICAgREJHX0VOVEVSKCBEYmdJbmZvICk7Ci8vCi8vICAgICBpZiggZGVzYyA9PSBOVUxMICkgewovLyAgICAgICAgIHN0YXR1cyA9IC1FRkFVTFQ7Ci8vICAgICB9Ci8vICAgICBpZiggc3RhdHVzID09IDAgJiYgZGVzYy0+YnVmX2FkZHIgIT0gTlVMTCApIHsKLy8gICAgICAgICBzdGF0dXMgPSAtRUZBVUxUOwovLyAgICAgfQovLyAgICAgaWYoIHN0YXR1cyA9PSAwICkgewovLyAgICAgICAgIGRlc2MtPmJ1Zl9hZGRyID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQoIHBkZXYsIHNpemUsICZwYSApOwovLyAgICAgfQovLyAgICAgaWYoIGRlc2MtPmJ1Zl9hZGRyID09IE5VTEwgKSB7Ci8vICAgICAgICAgREJHX0VSUk9SKCBEYmdJbmZvLCAicGNpX2FsbG9jX2NvbnNpc3RlbnQoKSBmYWlsZWRcbiIgKTsKLy8gICAgICAgICBzdGF0dXMgPSAtRU5PTUVNOwovLyAgICAgfSBlbHNlIHsKLy8gICAgICAgICBkZXNjLT5idWZfcGh5c19hZGRyID0gY3B1X3RvX2xlMzIoIHBhICk7Ci8vICAgICAgICAgU0VUX0JVRl9TSVpFKCBkZXNjLCBzaXplICk7Ci8vICAgICB9Ci8vICAgICBEQkdfTEVBVkUoIERiZ0luZm8gKTsKICAgIHJldHVybiBzdGF0dXM7Cn0gLy8gd2xfcGNpX2RtYV9hbGxvY19idWYKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCXdsX3BjaV9kbWFfZnJlZV9idWYoKQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgogKiAgREVTQ1JJUFRJT046CiAqCiAqICAgICAgQWxsb2NhdGVzIG9uZSBETUEgYnVmZmVyIGluIGNhY2hlIGNvaGVyZW50IG1lbW9yeSwgYW5kIGFzc29jaWF0ZXMgYSBETUEKICogICAgICBkZXNjcmlwdG9yIHdpdGggdGhpcyBidWZmZXIuCiAqCiAqICBQQVJBTUVURVJTOgogKgogKiAgICAgIHBkZXYgLSBhIHBvaW50ZXIgdG8gdGhlIGRldmljZSdzIHBjaV9kZXYgc3RydWN0dXJlCiAqICAgICAgbHAgIC0gdGhlIGRldmljZSdzIHByaXZhdGUgYWRhcHRlciBzdHJ1Y3R1cmUKICoKICogIFJFVFVSTlM6CiAqCiAqICAgICAgMCBvbiBzdWNjZXNzCiAqICAgICAgZXJybm8gdmFsdWUgb3RoZXJ3aXNlCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmludCB3bF9wY2lfZG1hX2ZyZWVfYnVmKCBzdHJ1Y3QgcGNpX2RldiAqcGRldiwgc3RydWN0IHdsX3ByaXZhdGUgKmxwLAogICAgICAgICAgICAgICAgICAgICAgICAgREVTQ19TVFJDVCAqZGVzYyApCnsKICAgIGludCAgICAgICAgIHN0YXR1cyA9IDA7CiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgogICAgaWYoIGRlc2MgPT0gTlVMTCApIHsKICAgICAgICBzdGF0dXMgPSAtRUZBVUxUOwogICAgfQogICAgaWYoIHN0YXR1cyA9PSAwICYmIGRlc2MtPmJ1Zl9hZGRyID09IE5VTEwgKSB7CiAgICAgICAgc3RhdHVzID0gLUVGQVVMVDsKICAgIH0KICAgIGlmKCBzdGF0dXMgPT0gMCApIHsKICAgICAgICBwY2lfZnJlZV9jb25zaXN0ZW50KCBwZGV2LCBHRVRfQlVGX1NJWkUoIGRlc2MgKSwgZGVzYy0+YnVmX2FkZHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzYy0+YnVmX3BoeXNfYWRkciApOwoKICAgICAgICBkZXNjLT5idWZfYWRkciA9IDA7CiAgICAgICAgZGVzYy0+YnVmX3BoeXNfYWRkciA9IDA7CiAgICAgICAgU0VUX0JVRl9TSVpFKCBkZXNjLCAwICk7CiAgICB9CiAgICByZXR1cm4gc3RhdHVzOwp9IC8vIHdsX3BjaV9kbWFfZnJlZV9idWYKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCXdsX3BjaV9kbWFfaGNmX3N1cHBseSgpCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCiAqICBERVNDUklQVElPTjoKICoKICogICAgICBTdXBwbHkgSENGIHdpdGggRE1BLXJlbGF0ZWQgcmVzb3VyY2VzLiBUaGVzZSBjb25zaXN0IG9mOgogKiAgICAgICAgICAtIGJ1ZmZlcnMgYW5kIGRlc2NyaXB0b3JzIGZvciByZWNlaXZlIHB1cnBvc2VzCiAqICAgICAgICAgIC0gb25lICdyZWNsYWltJyBkZXNjcmlwdG9yIGZvciB0aGUgdHJhbnNtaXQgcGF0aCwgdXNlZCB0byBmdWxmaWxsIGEKICogICAgICAgICAgICBjZXJ0YWluIEgyNSBETUEgZW5naW5lIHJlcXVpcmVtZW50CiAqICAgICAgICAgIC0gb25lICdyZWNsYWltJyBkZXNjcmlwdG9yIGZvciB0aGUgcmVjZWl2ZSBwYXRoLCB1c2VkIHRvIGZ1bGZpbGwgYQogKiAgICAgICAgICAgIGNlcnRhaW4gSDI1IERNQSBlbmdpbmUgcmVxdWlyZW1lbnQKICoKICogICAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBhdCBzdGFydC1vZi1kYXkgb3IgYXQgcmUtaW5pdGlhbGl6YXRpb24uCiAqCiAqICBQQVJBTUVURVJTOgogKgogKiAgICAgIGxwICAtIHRoZSBkZXZpY2UncyBwcml2YXRlIGFkYXB0ZXIgc3RydWN0dXJlCiAqCiAqICBSRVRVUk5TOgogKgogKiAgICAgIDAgb24gc3VjY2VzcwogKiAgICAgIGVycm5vIHZhbHVlIG90aGVyd2lzZQogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwp2b2lkIHdsX3BjaV9kbWFfaGNmX3N1cHBseSggc3RydWN0IHdsX3ByaXZhdGUgKmxwICkKewogICAgaW50IGk7CiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgogICAgREJHX0ZVTkMoICJ3bF9wY2lfZG1hX2hjZl9zdXBwbHkiICk7CiAgICBEQkdfRU5URVIoIERiZ0luZm8gKTsKCiAgICAvL2lmKCBscC0+ZG1hLnN0YXR1cyA9PSAwICk7CiAgICAvL3sKICAgICAgICAvKiBIYW5kIG92ZXIgdGhlIFJ4L1R4IHJlY2xhaW0gZGVzY3JpcHRvcnMgdG8gdGhlIEhDRiAqLwogICAgICAgIGlmKCBscC0+ZG1hLnR4X3JlY2xhaW1fZGVzYyApIHsKICAgICAgICAgICAgREJHX1BSSU5UKCAibHAtPmRtYS50eF9yZWNsYWltX2Rlc2M6IDB4JXBcbiIsIGxwLT5kbWEudHhfcmVjbGFpbV9kZXNjICk7CiAgICAgICAgICAgIGhjZl9kbWFfdHhfcHV0KCAmbHAtPmhjZkN0eCwgbHAtPmRtYS50eF9yZWNsYWltX2Rlc2MsIDAgKTsKICAgICAgICAgICAgbHAtPmRtYS50eF9yZWNsYWltX2Rlc2MgPSBOVUxMOwogICAgICAgICAgICBEQkdfUFJJTlQoICJscC0+ZG1hLnR4X3JlY2xhaW1fZGVzYzogMHglcFxuIiwgbHAtPmRtYS50eF9yZWNsYWltX2Rlc2MgKTsKICAgICAgICB9CiAgICAgICAgaWYoIGxwLT5kbWEucnhfcmVjbGFpbV9kZXNjICkgewogICAgICAgICAgICBEQkdfUFJJTlQoICJscC0+ZG1hLnJ4X3JlY2xhaW1fZGVzYzogMHglcFxuIiwgbHAtPmRtYS5yeF9yZWNsYWltX2Rlc2MgKTsKICAgICAgICAgICAgaGNmX2RtYV9yeF9wdXQoICZscC0+aGNmQ3R4LCBscC0+ZG1hLnJ4X3JlY2xhaW1fZGVzYyApOwogICAgICAgICAgICBscC0+ZG1hLnJ4X3JlY2xhaW1fZGVzYyA9IE5VTEw7CiAgICAgICAgICAgIERCR19QUklOVCggImxwLT5kbWEucnhfcmVjbGFpbV9kZXNjOiAweCVwXG4iLCBscC0+ZG1hLnJ4X3JlY2xhaW1fZGVzYyApOwogICAgICAgIH0KICAgICAgICAvKiBIYW5kIG92ZXIgdGhlIFJ4IGRlc2NyaXB0b3IgY2hhaW4gdG8gdGhlIEhDRiAqLwogICAgICAgIGZvciggaSA9IDA7IGkgPCBOVU1fUlhfREVTQzsgaSsrICkgewogICAgICAgICAgICBEQkdfUFJJTlQoICJscC0+ZG1hLnJ4X3BhY2tldFslZF06ICAgIDB4JXBcbiIsIGksIGxwLT5kbWEucnhfcGFja2V0W2ldICk7CiAgICAgICAgICAgIGhjZl9kbWFfcnhfcHV0KCAmbHAtPmhjZkN0eCwgbHAtPmRtYS5yeF9wYWNrZXRbaV0gKTsKICAgICAgICAgICAgbHAtPmRtYS5yeF9wYWNrZXRbaV0gPSBOVUxMOwogICAgICAgICAgICBEQkdfUFJJTlQoICJscC0+ZG1hLnJ4X3BhY2tldFslZF06ICAgIDB4JXBcbiIsIGksIGxwLT5kbWEucnhfcGFja2V0W2ldICk7CiAgICAgICAgfQogICAgLy99CgogICAgREJHX0xFQVZFKCBEYmdJbmZvICk7CiAgICByZXR1cm47Cn0gLy8gd2xfcGNpX2RtYV9oY2Zfc3VwcGx5Ci8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgl3bF9wY2lfZG1hX2hjZl9yZWNsYWltKCkKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoKICogIERFU0NSSVBUSU9OOgogKgogKiAgICAgIFJldHVybiBETUEtcmVsYXRlZCByZXNvdXJjZXMgZnJvbSB0aGUgSENGLiBUaGVzZSBjb25zaXN0IG9mOgogKiAgICAgICAgICAtIGJ1ZmZlcnMgYW5kIGRlc2NyaXB0b3JzIGZvciByZWNlaXZlIHB1cnBvc2VzCiAqICAgICAgICAgIC0gYnVmZmVycyBhbmQgZGVzY3JpcHRvcnMgZm9yIHRyYW5zbWl0IHB1cnBvc2VzCiAqICAgICAgICAgIC0gb25lICdyZWNsYWltJyBkZXNjcmlwdG9yIGZvciB0aGUgdHJhbnNtaXQgcGF0aCwgdXNlZCB0byBmdWxmaWxsIGEKICogICAgICAgICAgICBjZXJ0YWluIEgyNSBETUEgZW5naW5lIHJlcXVpcmVtZW50CiAqICAgICAgICAgIC0gb25lICdyZWNsYWltJyBkZXNjcmlwdG9yIGZvciB0aGUgcmVjZWl2ZSBwYXRoLCB1c2VkIHRvIGZ1bGZpbGwgYQogKiAgICAgICAgICAgIGNlcnRhaW4gSDI1IERNQSBlbmdpbmUgcmVxdWlyZW1lbnQKICoKICogICAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBhdCBlbmQtb2YtZGF5IG9yIGF0IHJlLWluaXRpYWxpemF0aW9uLgogKgogKiAgUEFSQU1FVEVSUzoKICoKICogICAgICBscCAgLSB0aGUgZGV2aWNlJ3MgcHJpdmF0ZSBhZGFwdGVyIHN0cnVjdHVyZQogKgogKiAgUkVUVVJOUzoKICoKICogICAgICAwIG9uIHN1Y2Nlc3MKICogICAgICBlcnJubyB2YWx1ZSBvdGhlcndpc2UKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kdm9pZCB3bF9wY2lfZG1hX2hjZl9yZWNsYWltKCBzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHAgKQp7CiAgICBpbnQgaTsKICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCiAgICBEQkdfRlVOQyggIndsX3BjaV9kbWFfaGNmX3JlY2xhaW0iICk7CiAgICBEQkdfRU5URVIoIERiZ0luZm8gKTsKCiAgICB3bF9wY2lfZG1hX2hjZl9yZWNsYWltX3J4KCBscCApOwogICAgZm9yKCBpID0gMDsgaSA8IE5VTV9SWF9ERVNDOyBpKysgKSB7CiAgICAgICAgREJHX1BSSU5UKCAicnhfcGFja2V0WyVkXSAweCVwXG4iLCBpLCBscC0+ZG1hLnJ4X3BhY2tldFtpXSApOwovLyAgICAgICAgIGlmKCBscC0+ZG1hLnJ4X3BhY2tldFtpXSA9PSBOVUxMICkgewovLyAgICAgICAgICAgICBEQkdfUFJJTlQoICJ3bF9wY2lfZG1hX2hjZl9yZWNsYWltOiByeF9wYWNrZXRbJWRdIE5VTExcbiIsIGkgKTsKLy8gICAgICAgICB9CiAgICB9CgogICAgd2xfcGNpX2RtYV9oY2ZfcmVjbGFpbV90eCggbHAgKTsKICAgIGZvciggaSA9IDA7IGkgPCBOVU1fVFhfREVTQzsgaSsrICkgewogICAgICAgIERCR19QUklOVCggInR4X3BhY2tldFslZF0gMHglcFxuIiwgaSwgbHAtPmRtYS50eF9wYWNrZXRbaV0gKTsKLy8gICAgICAgICBpZiggbHAtPmRtYS50eF9wYWNrZXRbaV0gPT0gTlVMTCApIHsKLy8gICAgICAgICAgICAgREJHX1BSSU5UKCAid2xfcGNpX2RtYV9oY2ZfcmVjbGFpbTogdHhfcGFja2V0WyVkXSBOVUxMXG4iLCBpICk7Ci8vICAgICAgICAgfQogICAgIH0KCiAgICBEQkdfTEVBVkUoIERiZ0luZm8gKTsKICAgIHJldHVybjsKfSAvLyB3bF9wY2lfZG1hX2hjZl9yZWNsYWltCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgl3bF9wY2lfZG1hX2hjZl9yZWNsYWltX3J4KCkKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoKICogIERFU0NSSVBUSU9OOgogKgogKiAgICAgIFJlY2xhaW0gUnggcGFja2V0cyB0aGF0IGhhdmUgYWxyZWFkeSBiZWVuIHByb2Nlc3NlZCBieSB0aGUgSENGLgogKgogKiAgUEFSQU1FVEVSUzoKICoKICogICAgICBscCAgLSB0aGUgZGV2aWNlJ3MgcHJpdmF0ZSBhZGFwdGVyIHN0cnVjdHVyZQogKgogKiAgUkVUVVJOUzoKICoKICogICAgICAwIG9uIHN1Y2Nlc3MKICogICAgICBlcnJubyB2YWx1ZSBvdGhlcndpc2UKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kdm9pZCB3bF9wY2lfZG1hX2hjZl9yZWNsYWltX3J4KCBzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHAgKQp7CiAgICBpbnQgICAgICAgICBpOwogICAgREVTQ19TVFJDVCAqcDsKICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCiAgICBEQkdfRlVOQyggIndsX3BjaV9kbWFfaGNmX3JlY2xhaW1fcngiICk7CiAgICBEQkdfRU5URVIoIERiZ0luZm8gKTsKCiAgICAvL2lmKCBscC0+ZG1hLnN0YXR1cyA9PSAwICkKICAgIC8vewogICAgICAgIHdoaWxlICggKCBwID0gaGNmX2RtYV9yeF9nZXQoICZscC0+aGNmQ3R4ICkgKSAhPSBOVUxMICkgewogICAgICAgICAgICBpZiggcCAmJiBwLT5idWZfYWRkciA9PSBOVUxMICkgewogICAgICAgICAgICAgICAgLyogQSByZWNsYWltIGRlc2NyaXB0b3IgaXMgYmVpbmcgZ2l2ZW4gYmFjayBieSB0aGUgSENGLiBSZWNsYWltCiAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9ycyBoYXZlIGEgTlVMTCBidWZfYWRkciAqLwogICAgICAgICAgICAgICAgbHAtPmRtYS5yeF9yZWNsYWltX2Rlc2MgPSBwOwogICAgICAgICAgICAJREJHX1BSSU5UKCAicmVjbGFpbV9kZXNjcmlwdG9yOiAweCVwXG4iLCBwICk7CiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBmb3IoIGkgPSAwOyBpIDwgTlVNX1JYX0RFU0M7IGkrKyApIHsKICAgICAgICAgICAgICAgIGlmKCBscC0+ZG1hLnJ4X3BhY2tldFtpXSA9PSBOVUxMICkgewogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIC8qIEFuIFJ4IGJ1ZmZlciBkZXNjcmlwdG9yIGlzIGJlaW5nIGdpdmVuIGJhY2sgYnkgdGhlIEhDRiAqLwogICAgICAgICAgICBscC0+ZG1hLnJ4X3BhY2tldFtpXSA9IHA7CiAgICAgICAgICAgIGxwLT5kbWEucnhfcnNjX2luZCsrOwogICAgICAgIAlEQkdfUFJJTlQoICJyeF9wYWNrZXRbJWRdIDB4JXBcbiIsIGksIGxwLT5kbWEucnhfcGFja2V0W2ldICk7CiAgICAgICAgfQogICAgLy99CiAgICBEQkdfTEVBVkUoIERiZ0luZm8gKTsKfSAvLyB3bF9wY2lfZG1hX2hjZl9yZWNsYWltX3J4Ci8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgl3bF9wY2lfZG1hX2dldF90eF9wYWNrZXQoKQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgogKiAgREVTQ1JJUFRJT046CiAqCiAqICAgICAgT2J0YWlucyBhIFR4IGRlc2NyaXB0b3IgZnJvbSB0aGUgY2hhaW4gdG8gdXNlIGZvciBUeC4KICoKICogIFBBUkFNRVRFUlM6CiAqCiAqICAgICAgbHAgLSBhIHBvaW50ZXIgdG8gdGhlIGRldmljZSdzIHdsX3ByaXZhdGUgc3RydWN0dXJlLgogKgogKiAgUkVUVVJOUzoKICoKICogICAgICBBIHBvaW50ZXIgdG8gdGhlIHJldHJpZXZlZCBkZXNjcmlwdG9yCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkRFU0NfU1RSQ1QgKiB3bF9wY2lfZG1hX2dldF90eF9wYWNrZXQoIHN0cnVjdCB3bF9wcml2YXRlICpscCApCnsKICAgIGludCBpOwogICAgREVTQ19TVFJDVCAqZGVzYyA9IE5VTEw7CiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgogICAgZm9yKCBpID0gMDsgaSA8IE5VTV9UWF9ERVNDOyBpKysgKSB7CiAgICAgICAgaWYoIGxwLT5kbWEudHhfcGFja2V0W2ldICkgewogICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICB9CgogICAgaWYoIGkgIT0gTlVNX1RYX0RFU0MgKSB7CiAgICAgICAgZGVzYyA9IGxwLT5kbWEudHhfcGFja2V0W2ldOwoKICAgICAgICBscC0+ZG1hLnR4X3BhY2tldFtpXSA9IE5VTEw7CiAgICAgICAgbHAtPmRtYS50eF9yc2NfaW5kLS07CgogICAgICAgIG1lbXNldCggZGVzYy0+YnVmX2FkZHIsIDAsIEhDRl9ETUFfVFhfQlVGMV9TSVpFICk7CiAgICB9CgogICAgcmV0dXJuIGRlc2M7Cn0gLy8gd2xfcGNpX2RtYV9nZXRfdHhfcGFja2V0Ci8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgl3bF9wY2lfZG1hX3B1dF90eF9wYWNrZXQoKQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgogKiAgREVTQ1JJUFRJT046CiAqCiAqICAgICAgUmV0dXJucyBhIFR4IGRlc2NyaXB0b3IgdG8gdGhlIGNoYWluLgogKgogKiAgUEFSQU1FVEVSUzoKICoKICogICAgICBscCAgIC0gYSBwb2ludGVyIHRvIHRoZSBkZXZpY2UncyB3bF9wcml2YXRlIHN0cnVjdHVyZS4KICogICAgICBkZXNjIC0gYSBwb2ludGVyIHRvIHRoZSBkZXNjcmlwdG9yIHRvIHJldHVybi4KICoKICogIFJFVFVSTlM6CiAqCiAqICAgICAgTi9BCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnZvaWQgd2xfcGNpX2RtYV9wdXRfdHhfcGFja2V0KCBzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHAsIERFU0NfU1RSQ1QgKmRlc2MgKQp7CiAgICBpbnQgaTsKICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCiAgICBmb3IoIGkgPSAwOyBpIDwgTlVNX1RYX0RFU0M7IGkrKyApIHsKICAgICAgICBpZiggbHAtPmRtYS50eF9wYWNrZXRbaV0gPT0gTlVMTCApIHsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgfQoKICAgIGlmKCBpICE9IE5VTV9UWF9ERVNDICkgewogICAgICAgIGxwLT5kbWEudHhfcGFja2V0W2ldID0gZGVzYzsKICAgICAgICBscC0+ZG1hLnR4X3JzY19pbmQrKzsKICAgIH0KfSAvLyB3bF9wY2lfZG1hX3B1dF90eF9wYWNrZXQKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCXdsX3BjaV9kbWFfaGNmX3JlY2xhaW1fdHgoKQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgogKiAgREVTQ1JJUFRJT046CiAqCiAqICAgICAgUmVjbGFpbSBUeCBwYWNrZXRzIHRoYXQgaGF2ZSBlaXRoZXIgYmVlbiBwcm9jZXNzZWQgYnkgdGhlIEhDRiBkdWUgdG8gYQogKiAgICAgIHBvcnQgZGlzYWJsZSBvciBhIFR4IGNvbXBsZXRpb24uCiAqCiAqICBQQVJBTUVURVJTOgogKgogKiAgICAgIGxwICAtIHRoZSBkZXZpY2UncyBwcml2YXRlIGFkYXB0ZXIgc3RydWN0dXJlCiAqCiAqICBSRVRVUk5TOgogKgogKiAgICAgIDAgb24gc3VjY2VzcwogKiAgICAgIGVycm5vIHZhbHVlIG90aGVyd2lzZQogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwp2b2lkIHdsX3BjaV9kbWFfaGNmX3JlY2xhaW1fdHgoIHN0cnVjdCB3bF9wcml2YXRlICpscCApCnsKICAgIGludCAgICAgICAgIGk7CiAgICBERVNDX1NUUkNUICpwOwogICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKICAgIERCR19GVU5DKCAid2xfcGNpX2RtYV9oY2ZfcmVjbGFpbV90eCIgKTsKICAgIERCR19FTlRFUiggRGJnSW5mbyApOwoKICAgIC8vaWYoIGxwLT5kbWEuc3RhdHVzID09IDAgKQogICAgLy97CiAgICAgICAgd2hpbGUgKCAoIHAgPSBoY2ZfZG1hX3R4X2dldCggJmxwLT5oY2ZDdHggKSApICE9IE5VTEwgKSB7CgogICAgICAgICAgICBpZiggcCAhPSBOVUxMICYmIHAtPmJ1Zl9hZGRyID09IE5VTEwgKSB7CiAgICAgICAgICAgICAgICAvKiBBIFJlY2xhaW0gZGVzY3JpcHRvciBpcyBiZWluZyBnaXZlbiBiYWNrIGJ5IHRoZSBIQ0YuIFJlY2xhaW0KICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3JzIGhhdmUgYSBOVUxMIGJ1Zl9hZGRyICovCiAgICAgICAgICAgICAgICBscC0+ZG1hLnR4X3JlY2xhaW1fZGVzYyA9IHA7CiAgICAgICAgICAgIAlEQkdfUFJJTlQoICJyZWNsYWltX2Rlc2NyaXB0b3I6IDB4JXBcbiIsIHAgKTsKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZvciggaSA9IDA7IGkgPCBOVU1fVFhfREVTQzsgaSsrICkgewogICAgICAgICAgICAgICAgaWYoIGxwLT5kbWEudHhfcGFja2V0W2ldID09IE5VTEwgKSB7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLyogQW4gUnggYnVmZmVyIGRlc2NyaXB0b3IgaXMgYmVpbmcgZ2l2ZW4gYmFjayBieSB0aGUgSENGICovCiAgICAgICAgICAgIGxwLT5kbWEudHhfcGFja2V0W2ldID0gcDsKICAgICAgICAgICAgbHAtPmRtYS50eF9yc2NfaW5kKys7CiAgICAgICAgCURCR19QUklOVCggInR4X3BhY2tldFslZF0gMHglcFxuIiwgaSwgbHAtPmRtYS50eF9wYWNrZXRbaV0gKTsKICAgICAgICB9CiAgICAvL30KCiAgICBpZiggbHAtPm5ldGlmX3F1ZXVlX29uID09IEZBTFNFICkgewogICAgICAgIG5ldGlmX3dha2VfcXVldWUoIGxwLT5kZXYgKTsKICAgICAgICBXTF9XRFNfTkVUSUZfV0FLRV9RVUVVRSggbHAgKTsKICAgICAgICBscC0+bmV0aWZfcXVldWVfb24gPSBUUlVFOwogICAgfQogICAgREJHX0xFQVZFKCBEYmdJbmZvICk7CiAgICByZXR1cm47Cn0gLy8gd2xfcGNpX2RtYV9oY2ZfcmVjbGFpbV90eAovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwojZW5kaWYgIC8vIEVOQUJMRV9ETUEK