ZGlmZiAtLWdpdCBhL2luY2x1ZGUvZnJlZURpYW1ldGVyL2xpYmZkcHJvdG8uaCBiL2luY2x1ZGUvZnJlZURpYW1ldGVyL2xpYmZkcHJvdG8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMGQwNzQ0Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9mcmVlRGlhbWV0ZXIvbGliZmRwcm90by5oCkBAIC0wLDAgKzEsMzI1NCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBTb2Z0d2FyZSBMaWNlbnNlIEFncmVlbWVudCAoQlNEIExpY2Vuc2UpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorKiBBdXRob3I6IFNlYmFzdGllbiBEZWN1Z2lzIDxzZGVjdWdpc0BmcmVlZGlhbWV0ZXIubmV0PgkJCQkJCQkgKgorKgkJCQkJCQkJCQkJCQkgKgorKiBDb3B5cmlnaHQgKGMpIDIwMTUsIFdJREUgUHJvamVjdCBhbmQgTklDVAkJCQkJCQkJICoKKyogQWxsIHJpZ2h0cyByZXNlcnZlZC4JCQkJCQkJCQkJCSAqCisqIAkJCQkJCQkJCQkJCQkgKgorKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIG9mIHRoaXMgc29mdHdhcmUgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSAgKgorKiBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIAkJCQkJCSAqCisqICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSAJCQkJCQkJICoKKyogICBmb2xsb3dpbmcgZGlzY2xhaW1lci4JCQkJCQkJCQkJICoKKyogICAgCQkJCQkJCQkJCQkJCSAqCisqICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSAJCQkJCQkgKgorKiAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgCQkJCQkJCSAqCisqICAgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyCQkJCQkJICoKKyogICBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgkJCQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqICogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgV0lERSBQcm9qZWN0IG9yIE5JQ1Qgbm9yIHRoZSAJCQkJCQkgKgorKiAgIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciAJCQkJCQkgKgorKiAgIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCAJCQkJCQkgKgorKiAgIHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiBXSURFIFByb2plY3QgYW5kIAkJCQkJCSAqCisqICAgTklDVC4JCQkJCQkJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEICoKKyogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBICoKKyogUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SICoKKyogQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgCSAqCisqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyAJICoKKyogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SICoKKyogVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgU19PVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGICAgKgorKiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4JCQkJCQkJCSAqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIFRoaXMgZmlsZSBjb250YWlucyB0aGUgZGVmaW5pdGlvbnMgb2YgZnVuY3Rpb25zIGFuZCB0eXBlcyB1c2VkIGJ5IHRoZSBsaWJmcmVlRGlhbWV0ZXIgbGlicmFyeS4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgbWVhbnQgdG8gYmUgdXNlZCBieSBib3RoIHRoZSBmcmVlRGlhbWV0ZXIgZGFlbW9uIGFuZCBpdHMgZXh0ZW5zaW9ucy4KKyAqIEl0IHByb3ZpZGVzIHRoZSB0b29scyB0byBtYW5pcHVsYXRlIERpYW1ldGVyIG1lc3NhZ2VzIGFuZCByZWxhdGVkIGRhdGEuCisgKiBUaGlzIGZpbGUgc2hvdWxkIGFsd2F5cyBiZSBpbmNsdWRlZCBhcyAjaW5jbHVkZSA8ZnJlZURpYW1ldGVyL2xpYmZyZWVEaWFtZXRlci5oPgorICoKKyAqIElmIGFueSBjaGFuZ2UgaXMgbWFkZSB0byB0aGlzIGZpbGUsIHlvdSBtdXN0IGluY3JlbWVudCB0aGUgRkRfUFJPSkVDVF9WRVJTSU9OX0FQSSB2ZXJzaW9uLgorICoKKyAqIFRoZSBmaWxlIGNvbnRhaW5zIHRoZSBmb2xsb3dpbmcgcGFydHM6CisgKglERUJVRworICoJTUFDUk9TCisgKiAgICAgIE9DVEVUIFNUUklOR1MKKyAqCVRIUkVBRFMKKyAqCUxJU1RTCisgKglESUNUSU9OQVJZCisgKglTRVNTSU9OUworICoJTUVTU0FHRVMKKyAqCURJU1BBVENICisgKglRVUVVRVMKKyAqLworCisjaWZuZGVmIF9MSUJGRFBST1RPX0gKKyNkZWZpbmUgX0xJQkZEUFJPVE9fSAorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKyNpZm5kZWYgRkRfSVNfQ09ORklHCisjZXJyb3IgIllvdSBtdXN0IGluY2x1ZGUgJ2ZyZWVEaWFtZXRlci1ob3N0LmgnIGJlZm9yZSB0aGlzIGZpbGUuIgorI2VuZGlmIC8qIEZEX0lTX0NPTkZJRyAqLworCisjaW5jbHVkZSA8cHRocmVhZC5oPgorI2luY2x1ZGUgPHNjaGVkLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisjaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2luY2x1ZGUgPG5ldGRiLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzdGRhcmcuaD4KKworI2luY2x1ZGUgPGxpYmdlbi5oPgkvKiBmb3IgYmFzZW5hbWUgKi8KKworI2lmZGVmIFNXSUcKKyNkZWZpbmUgX0FUVFJJQlVURV9QUklOVEZMSUtFXyhfZixfdikKKyNlbHNlCisjZGVmaW5lIF9BVFRSSUJVVEVfUFJJTlRGTElLRV8oX2YsX3YpIF9fYXR0cmlidXRlX18gKChmb3JtYXQgKHByaW50ZiwgX2YsIF92KSkpCisjZW5kaWYgLyogU1dJRyAqLworCisvKiBSZW1vdmUgc29tZSBkZXByZWNhdGVkIHdhcm5pbmdzIGZyb20gc29tZSBnbnV0bHMgdmVyc2lvbnMsIHdoZW4gcG9zc2libGUgKi8KKyNpZiBkZWZpbmVkKF9fR05VQ19fKQorIyBkZWZpbmUgR0NDX0RJQUdfRE9fUFJBR01BKHgpIF9QcmFnbWEgKCN4KQorIyBkZWZpbmUgR0NDX0RJQUdfUFJBR01BKHgpIEdDQ19ESUFHX0RPX1BSQUdNQShHQ0MgZGlhZ25vc3RpYyB4KQorIyBpZiAoKF9fR05VQ19fICogMTAwKSArIF9fR05VQ19NSU5PUl9fKSA+PSA0MDYJCS8qIDQuNi54ICovCisjICBkZWZpbmUgR0NDX0RJQUdfT0ZGKHgpIEdDQ19ESUFHX1BSQUdNQShwdXNoKSBcCisgICAgIEdDQ19ESUFHX1BSQUdNQShpZ25vcmVkIHgpCisjICBkZWZpbmUgR0NDX0RJQUdfT04oeCkgR0NDX0RJQUdfUFJBR01BKHBvcCkKKyMgZWxzZQkJCQkJCQkvKiBvbGRlciAqLworIyAgZGVmaW5lIEdDQ19ESUFHX09GRih4KSBHQ0NfRElBR19QUkFHTUEoaWdub3JlZCB4KQorIyAgZGVmaW5lIEdDQ19ESUFHX09OKHgpICBHQ0NfRElBR19QUkFHTUEod2FybmluZyB4KQorIyBlbmRpZgorI2Vsc2UKKyMgZGVmaW5lIEdDQ19ESUFHX09GRih4KQorIyBkZWZpbmUgR0NDX0RJQUdfT04oeCkKKyNlbmRpZgorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisvKiAgICAgICAgICAgICAgICAgICAgICAgQ09OU1RBTlRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKyNkZWZpbmUgRElBTUVURVJfUE9SVAkJMzg2OAorI2RlZmluZSBESUFNRVRFUl9TRUNVUkVfUE9SVAk1ODY4CisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworLyogICAgICAgICAgICAgICAgICAgICAgICAgIElOSVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisvKiBUaGlzIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIGZpcnN0LCBiZWZvcmUgYW55IGNhbGwgdG8gYW5vdGhlciBsaWJyYXJ5IGZ1bmN0aW9uICovCitpbnQgZmRfbGlicHJvdG9faW5pdCh2b2lkKTsgLyogbm90ZSBpZiB5b3UgYXJlIHVzaW5nIGxpYmZkY29yZSwgaXQgaGFuZGxlcyB0aGlzIGFscmVhZHkgKi8KKworLyogQ2FsbCB0aGlzIG9uZSB3aGVuIHRoZSBhcHBsaWNhdGlvbiB0ZXJtaW5hdGVzLCB0byBkZXN0cm95IGludGVybmFsIHRocmVhZHMgKi8KK3ZvaWQgZmRfbGlicHJvdG9fZmluaSh2b2lkKTsKKworLyogUmV0cmlldmUgdGhlIHZlcnNpb24gb2YgdGhlIGJpbmFyeSAqLworZXh0ZXJuIGNvbnN0IGNoYXIgZmRfbGlicHJvdG9fdmVyc2lvbltdOworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgREVCVUcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKworLyoKKyAqIEZVTkNUSU9OOglmZF9sb2cKKyAqCisgKiBQQVJBTUVURVJTOgorICogIGxvZ2xldmVsCTogSW50ZWdlciwgaG93IGltcG9ydGFudCB0aGUgbWVzc2FnZSBpcy4gVmFsaWQgdmFsdWVzIGFyZSBtYWNyb3MgRkRfTE9HXyoKKyAqICBmb3JtYXQgCTogU2FtZSBmb3JtYXQgc3RyaW5nIGFzIGluIHRoZSBwcmludGYgZnVuY3Rpb24KKyAqICAuLi4JCTogU2FtZSBsaXN0IGFzIHByaW50ZgorICoKKyAqIERFU0NSSVBUSU9OOiAKKyAqIFdyaXRlIGluZm9ybWF0aW9uIHRvIGxvZy4KKyAqIFRoZSBmb3JtYXQgYW5kIGFyZ3VtZW50cyBtYXkgY29udGFpbiBVVEYtOCBlbmNvZGVkIGRhdGEuIFRoZQorICogb3V0cHV0IG1lZGl1bSBpcyBleHBlY3RlZCB0byBzdXBwb3J0IHRoaXMgZW5jb2RpbmcuCisgKgorICogUkVUVVJOIFZBTFVFOgorICogIE5vbmUuCisgKi8KK3ZvaWQgZmRfbG9nICggaW50LCBjb25zdCBjaGFyICosIC4uLiApIF9BVFRSSUJVVEVfUFJJTlRGTElLRV8oMiwzKTsKKyNpZm5kZWYgU1dJRwordm9pZCBmZF9sb2dfdmEoIGludCwgY29uc3QgY2hhciAqLCB2YV9saXN0KTsKKyNlbmRpZiAvKiBTV0lHICovCisKKy8qIHRoZXNlIGFyZSBpbnRlcm5hbCBvYmplY3RzIG9mIHRoZSBkZWJ1ZyBmYWNpbGl0eSwgCittaWdodCBiZSB1c2VmdWwgdG8gY29udHJvbCB0aGUgYmVoYXZpb3IgZnJvbSBvdXRzaWRlICovCitleHRlcm4gcHRocmVhZF9tdXRleF90CWZkX2xvZ19sb2NrOworZXh0ZXJuIGNoYXIgKiBmZF9kZWJ1Z19vbmVfZnVuY3Rpb247CitleHRlcm4gY2hhciAqIGZkX2RlYnVnX29uZV9maWxlOworCisvKgorICogRlVOQ1RJT046CWZkX2xvZ190aHJlYWRuYW1lCisgKgorICogUEFSQU1FVEVSUzoKKyAqICBuYW1lIAk6IFwwLXRlcm1pbmF0ZWQgc3RyaW5nIGNvbnRhaW5pbmcgYSBuYW1lIHRvIGlkZW50aWZ5IHRoZSBjdXJyZW50IHRocmVhZC4KKyAqCisgKiBERVNDUklQVElPTjogCisgKiAgTmFtZSB0aGUgY3VycmVudCB0aHJlYWQsIHVzZWZ1bCBmb3IgZGVidWdnaW5nIG11bHRpLXRocmVhZGVkIHByb2JsZW1zLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gYXNzdW1lcyB0aGF0IGEgZ2xvYmFsIHRocmVhZC1zcGVjaWZpYyBrZXkgY2FsbGVkICJmZF9sb2dfdGhuYW1lIiBleGlzdHMKKyAqIGluIHRoZSBhZGRyZXNzIHNwYWNlIG9mIHRoZSBjdXJyZW50IHByb2Nlc3MuCisgKgorICogUkVUVVJOIFZBTFVFOgorICogIE5vbmUuCisgKi8KK3ZvaWQgZmRfbG9nX3RocmVhZG5hbWUgKCBjb25zdCBjaGFyICogbmFtZSApOworZXh0ZXJuIHB0aHJlYWRfa2V5X3QJZmRfbG9nX3RobmFtZTsKKworLyoKKyAqIEZVTkNUSU9OOglmZF9sb2dfdGltZQorICoKKyAqIFBBUkFNRVRFUlM6CisgKiAgdHMJIAk6IFRoZSB0aW1lc3RhbXAgdG8gbG9nLCBvciBOVUxMIGZvciAibm93IgorICogIGJ1ZiAJOiBBbiBhcnJheSB3aGVyZSB0aGUgdGltZSBtdXN0IGJlIHN0b3JlZAorICogIGxlbgkJOiBzaXplIG9mIHRoZSBidWZmZXIKKyAqICBpbmNsX2RhdGUgICA6IFRoZSBkYXkgb2YgeWVhciBpcyBpbmNsdWRlZCBpbiB0aGUgb3V0cHV0CisgKiAgaW5jbF9tcyAgICAgOiBtaWxsaXNlY29uZCB2YWx1ZSBpcyBpbmNsdWRlZCBpbiB0aGUgb3V0cHV0CisgKgorICogREVTQ1JJUFRJT046IAorICogIFdyaXRlcyB0aGUgdGltZXN0YW1wIChpbiBodW1hbiByZWFkYWJsZSBmb3JtYXQpIGluIGEgYnVmZmVyLiAKKyAqCisgKiBSRVRVUk4gVkFMVUU6CisgKiAgcG9pbnRlciB0byBidWYuCisgKi8KK2NoYXIgKiBmZF9sb2dfdGltZSAoIHN0cnVjdCB0aW1lc3BlYyAqIHRzLCBjaGFyICogYnVmLCBzaXplX3QgbGVuLCBpbnQgaW5jbF9kYXRlLCBpbnQgaW5jbF9tcyApOworCisvKgorICogRlVOQ1RJT046ICAgIGZkX2xvZ19oYW5kbGVyX3JlZ2lzdGVyCisgKiBNQUNSTzoKKyAqCisgKiBQQVJBTUVURVJTOgorICogIGxvZ2xldmVsICAgIDogcHJpb3JpdHkgb2YgdGhlIG1lc3NhZ2UKKyAqICBmb3JtYXQgICAgICA6IFNhbWUgZm9ybWF0IHN0cmluZyBhcyBpbiB0aGUgcHJpbnRmIGZ1bmN0aW9uCisgKiAgdmFfbGlzdCAgICAgOiBBcmd1bWVudCBsaXN0CisgKgorICogREVTQ1JJUFRJT046CisgKiBSZWdpc3RlciBhbiBleHRlcm5hbCBtZXRob2QgZm9yIGxvZ2dpbmcgcHVycG9zZXMuCisgKgorICogUkVUVVJOIFZBTFVFOgorICogaW50ICAgICAgICAgIDogU3VjY2VzcyBvciBmYWlsdXJlCisgKi8KK2ludCBmZF9sb2dfaGFuZGxlcl9yZWdpc3RlciAoIHZvaWQgKCpsb2dnZXIpKGludCBsb2dsZXZlbCwgY29uc3QgY2hhciAqIGZvcm1hdCwgdmFfbGlzdCBhcmdzKSApOworCisvKgorICogRlVOQ1RJT046ICAgIGZkX2xvZ19oYW5kbGVyX3VucmVnaXN0ZXIKKyAqIE1BQ1JPOgorICoKKyAqIFBBUkFNRVRFUlM6CisgKgorICogREVTQ1JJUFRJT046CisgKiBVbnJlZ2lzdGVyIHRoZSBleHRlcm5hbCBsb2dnaW5nIGZ1bmN0aW9uLgorICoKKyAqIFJFVFVSTiBWQUxVRToKKyAqIGludCAgICAgICAgICA6IFN1Y2Nlc3Mgb3IgZmFpbHVyZQorICovCitpbnQgZmRfbG9nX2hhbmRsZXJfdW5yZWdpc3RlciAoIHZvaWQgKTsKKworCisvKiBBbGwgZHVtcCBmdW5jdGlvbnMgZm9sbG93IHRoaXMgc2FtZSBwcm90b3R5cGU6CisgKiBQQVJBTUVURVJTOgorICogICBidWYgICA6ICpidWYgY2FuIGJlIE5VTEwgb24gZW50cnksIGl0IHdpbGwgYmUgbWFsbG9jJ2QuIE90aGVyd2lzZSBpdCBpcyByZWFsbG9jJ2QgaWYgbmVlZGVkLgorICogICBsZW4gICA6IHRoZSBjdXJyZW50IHNpemUgb2YgdGhlIGJ1ZmZlciAoaW4vb3V0KQorICogICBvZmZzZXQ6IChvcHRpb25hbCkgaWYgcHJvdmlkZWQsIHN0YXJ0cyB3cml0aW5nIGR1bXAgYXQgb2Zmc2V0IGluIHRoZSBidWZmZXIsIGFuZCB1cGRhdGVkIHVwb24gZXhpdC4gaWYgTlVMTCwgc3RhcnRzIGF0IG9mZnNldCBPLgorICoKKyAqIFJFVFVSTiBWQUxVRToKKyAqICAgKmJ1ZiB1cG9uIHN1Y2Nlc3MsIE5VTEwgdXBvbiBmYWlsdXJlLgorICoKKyAqIFJFTUFSS1M6CisgKiAgLSBBZnRlciB0aGUgYnVmZmVyIGhhcyBiZWVuIHVzZWQsIGl0IHNob3VsZCBiZSBmcmVlZC4KKyAqICAtIERlcGVuZGluZyBvbiB0aGUgZnVuY3Rpb24sIHRoZSBjcmVhdGVkIHN0cmluZyBtYXkgYmUgbXVsdGktbGluZS4gSG93ZXZlciwgaXQgc2hvdWxkIG5ldmVyIGJlIHRlcm1pbmF0ZWQgd2l0aCBhICdcbicuCisgKi8KKyNkZWZpbmUgREVDTEFSRV9GRF9EVU1QX1BST1RPVFlQRSggZnVuY3Rpb25fbmFtZSwgYXJncy4uLiApCVwKKwljaGFyICogZnVuY3Rpb25fbmFtZShjaGFyICoqIGJ1Ziwgc2l6ZV90ICpsZW4sIHNpemVfdCAqb2Zmc2V0LCAjI2FyZ3MpCisKKyNpZmRlZiBTV0lHCisjZGVmaW5lIERFQ0xBUkVfRkRfRFVNUF9QUk9UT1RZUEVfc2ltcGxlKCBmdW5jdGlvbl9uYW1lICkJXAorCWNoYXIgKiBmdW5jdGlvbl9uYW1lKGNoYXIgKiogYnVmLCBzaXplX3QgKmxlbiwgc2l6ZV90ICpvZmZzZXQpCisjZW5kaWYgLyogU1dJRyAqLworCQorCisvKiBIZWxwZXIgZnVuY3Rpb25zIGZvciB0aGUgKmR1bXAgZnVuY3Rpb25zIHRoYXQgYWRkIGludG8gYSBidWZmZXIgKi8KK0RFQ0xBUkVfRkRfRFVNUF9QUk9UT1RZUEUoIGZkX2R1bXBfZXh0ZW5kLCBjb25zdCBjaGFyICogZm9ybWF0LCAuLi4gKSBfQVRUUklCVVRFX1BSSU5URkxJS0VfKDQsNSk7CitERUNMQVJFX0ZEX0RVTVBfUFJPVE9UWVBFKCBmZF9kdW1wX2V4dGVuZF9oZXhkdW1wLCB1aW50OF90ICpkYXRhLCBzaXplX3QgZGF0YWxlbiwgc2l6ZV90IHRydW5jLCBzaXplX3Qgd3JhcCApOworCisKKy8qIFNvbWUgaGVscGVycyBtYWNybyBmb3Igd3JpdGluZyBzdWNoICpfZHVtcCByb3V0aW5lICovCisjZGVmaW5lIEZEX0RVTVBfU1REX1BBUkFNUyAgYnVmLCBsZW4sIG9mZnNldAorI2RlZmluZSBGRF9EVU1QX0hBTkRMRV9PRkZTRVQoKSAgc2l6ZV90IG8gPSAwOyBpZiAoIW9mZnNldCkgb2Zmc2V0ID0gJm87IGlmIChidWYgJiYgKCpidWYpICYmICEoKm9mZnNldCkpICoqYnVmPSdcMCcKKyNkZWZpbmUgRkRfRFVNUF9IQU5ETEVfVFJBSUwoKQl3aGlsZSAoKCpidWYpICYmICgqb2Zmc2V0ID4gMCkgJiYgKCgqYnVmKVsqb2Zmc2V0IC0gMV0gPT0gJ1xuJykpIHsgKm9mZnNldCAtPSAxOyAoKmJ1ZilbKm9mZnNldF0gPSAnXDAnOyB9CisKKworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisvKiAgICAgICAgICAgICAgICAgICAgREVCVUcgTUFDUk9TICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKyNpZm5kZWYgQVNTRVJUCisjZGVmaW5lIEFTU0VSVCh4KSBhc3NlcnQoeCkKKyNlbmRpZiAvKiBBU1NFUlQgKi8KKworLyogbG9nIGxldmVscyBkZWZpbml0aW9ucywgdGhhdCBhcmUgcGFzc2VkIHRvIHRoZSBsb2dnZXIgKi8KKyNkZWZpbmUgRkRfTE9HX0FOTk9ZSU5HICAwICAvKiB2ZXJ5IHZlcmJvc2UgbG9vcHMgYW5kIHN1Y2ggIm92ZXJraWxsIiB0cmFjZXMuIE9ubHkgYWN0aXZlIHdoZW4gdGhlIGZyYW1ld29yayBpcyBjb21waWxlZCBpbiBERUJVRyBtb2RlLiAqLworI2RlZmluZSBGRF9MT0dfREVCVUcgICAgIDEgIC8qIEdldCBhIGRldGFpbGVkIHNlbnNlIG9mIHdoYXQgaXMgZ29pbmcgb24gaW4gdGhlIGZyYW1ld29yay4gVXNlIHRoaXMgbGV2ZWwgZm9yIG5vcm1hbCBkZWJ1ZyAqLworI2RlZmluZSBGRF9MT0dfTk9USUNFICAgIDMgIC8qIE5vcm1hbCBleGVjdXRpb24gc3RhdGVzIHdvcnRoIG5vdGluZyAqLworI2RlZmluZSBGRF9MT0dfRVJST1IgICAgIDUgIC8qIFJlY292ZXJhYmxlIG9yIGV4cGVjdGVkIGVycm9yIGNvbmRpdGlvbnMgKi8KKyNkZWZpbmUgRkRfTE9HX0ZBVEFMICAgICA2ICAvKiBVbnJlY292ZXJhYmxlIGVycm9yLCBlLmcuIG1hbGxvYyBmYWlsLCBldGMuIHRoYXQgcmVxdWlyZXMgdGhlIGZyYW1ld29yayB0byBzaHV0ZG93biAqLworCisvKiBUaGUgbGV2ZWwgdXNlZCBieSB0aGUgZGVmYXVsdCBsb2dnZXIsIGNhbiBiZSBjaGFuZ2VkIGJ5IGNvbW1hbmQtbGluZSBhcmd1bWVudHMuIElnbm9yZWQgZm9yIG90aGVyIGxvZ2dlcnMuICovCitleHRlcm4gaW50IGZkX2dfZGVidWdfbHZsOworCisvKiBTb21lIHBvcnRhYmlsaXR5IGNvZGUgdG8gZ2V0IG5pY2UgZnVuY3Rpb24gbmFtZSBpbiBfX1BSRVRUWV9GVU5DVElPTl9fICovCisjaWYgKCFkZWZpbmVkKCBfX2Z1bmNfXykpICYmIChfX1NURENfVkVSU0lPTl9fIDwgMTk5OTAxTCkKKyMgaWYgX19HTlVDX18gPj0gMgorIyAgZGVmaW5lIF9fZnVuY19fIF9fRlVOQ1RJT05fXworIyBlbHNlIC8qIF9fR05VQ19fID49IDIgKi8KKyMgIGRlZmluZSBfX2Z1bmNfXyAiPHVua25vd24+IgorIyBlbmRpZiAvKiBfX0dOVUNfXyA+PSAyICovCisjZW5kaWYgLyooIWRlZmluZWQoIF9fZnVuY19fKSkgJiYgKF9fU1REQ19WRVJTSU9OX18gPCAxOTk5MDFMKSAqLworI2lmbmRlZiBfX1BSRVRUWV9GVU5DVElPTl9fCisjZGVmaW5lIF9fUFJFVFRZX0ZVTkNUSU9OX18gX19mdW5jX18KKyNlbmRpZiAvKiBfX1BSRVRUWV9GVU5DVElPTl9fICovCisKKy8qIEEgdmVyc2lvbiBvZiBfX0ZJTEVfXyB3aXRob3V0IHRoZSBmdWxsIHBhdGguIFRoaXMgaXMgc3BlY2lmaWMgdG8gZWFjaCBDIGZpbGUgYmVpbmcgY29tcGlsZWQgKi8KK3N0YXRpYyBjaGFyICogZmlsZV9ibmFtZSA9IE5VTEw7CitzdGF0aWMgY2hhciAqIGZpbGVfYm5hbWVfaW5pdChjaGFyICogZnVsbCkgeyBmaWxlX2JuYW1lID0gYmFzZW5hbWUoZnVsbCk7IHJldHVybiBmaWxlX2JuYW1lOyB9CisjZGVmaW5lIF9fU1RSSVBQRURfRklMRV9fCShmaWxlX2JuYW1lID86IGZpbGVfYm5hbWVfaW5pdCgoY2hhciAqKV9fRklMRV9fKSkKKworCisKKy8qIEluIERFQlVHIG1vZGUsIHdlIGFkZCBtZXRhLWluZm9ybWF0aW9uIGFsb25nIGVhY2ggdHJhY2UuIFRoaXMgbWFrZXMgbXVsdGktdGhyZWFkaW5nIHByb2JsZW1zIGVhc2llciB0byBkZWJ1Zy4gKi8KKyNpZiAoZGVmaW5lZChERUJVRykgJiYgZGVmaW5lZChERUJVR19XSVRIX01FVEEpKQorIyBkZWZpbmUgU1REX1RSQUNFX0ZNVF9TVFJJTkcgInBpZDolcyBpbiAlc0AlczolZDogIgorIyBkZWZpbmUgU1REX1RSQUNFX0ZNVF9BUkdTICAgLCAoKGNoYXIgKilwdGhyZWFkX2dldHNwZWNpZmljKGZkX2xvZ190aG5hbWUpID86ICJ1bm5hbWVkIiksIF9fUFJFVFRZX0ZVTkNUSU9OX18sIF9fU1RSSVBQRURfRklMRV9fLCBfX0xJTkVfXworI2Vsc2UgLyogREVCVUcgJiYgREVCVUdfV0lUSF9NRVRBICovCisjIGRlZmluZSBTVERfVFJBQ0VfRk1UX1NUUklORyAiIgorIyBkZWZpbmUgU1REX1RSQUNFX0ZNVF9BUkdTCisjZW5kaWYgLyogREVCVUcgJiYgREVCVUdfV0lUSF9NRVRBICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqCisgIFRoZSBnZW5lcmFsIGRlYnVnIG1hY3JvCisgKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgTE9HKHByaW50bGV2ZWwsZm9ybWF0LGFyZ3MuLi4gKSBcCisJZmRfbG9nKChwcmludGxldmVsKSwgU1REX1RSQUNFX0ZNVF9TVFJJTkcgZm9ybWF0IFNURF9UUkFDRV9GTVRfQVJHUywgIyMgYXJncykKKworLyoKKyAqIFVzZSB0aGUgZm9sbG93aW5nIG1hY3JvcyBpbiB0aGUgY29kZSB0byBnZXQgdHJhY2VzIHdpdGggbG9jYXRpb24gJiBwaWQgaW4gZGVidWcgbW9kZTogCisgKi8KKyNpZmRlZiBERUJVRworIyBkZWZpbmUgTE9HX0EoZm9ybWF0LGFyZ3MuLi4gKSBcCisJCWRvIHsgaWYgKChmZF9kZWJ1Z19vbmVfZnVuY3Rpb24gJiYgIXN0cmNtcChmZF9kZWJ1Z19vbmVfZnVuY3Rpb24sIF9fUFJFVFRZX0ZVTkNUSU9OX18pKSBcCisJCSB8fCAoZmRfZGVidWdfb25lX2ZpbGUgJiYgIXN0cmNtcChmZF9kZWJ1Z19vbmVfZmlsZSwgX19TVFJJUFBFRF9GSUxFX18pICkgKSB7CQlcCisJCSAJTE9HKEZEX0xPR19ERUJVRywiW0RCR19NQVRDSF0gIiBmb3JtYXQsIyNhcmdzKTsJCQkJCVwKKwkJfSBlbHNlIHsJCQkJCQkJCQkJXAorCQkJTE9HKEZEX0xPR19BTk5PWUlORyxmb3JtYXQsIyNhcmdzKTsJCQkJCQlcCisJCX0gfSB3aGlsZSAoMCkKKyNlbHNlIC8qIERFQlVHICovCisjIGRlZmluZSBMT0dfQShmb3JtYXQsYXJncy4uLiApIC8qIG5vdCBkZWZpbmVkIGluIHJlbGVhc2UgKi8KKyNlbmRpZiAvKiBERUJVRyAqLworCisvKiBEZWJ1ZyBpbmZvcm1hdGlvbiB1c2VmdWwgdG8gZm9sbG93IGluIGRldGFpbCB3aGF0IGlzIGdvaW5nIG9uICovCisjZGVmaW5lIExPR19EKGZvcm1hdCxhcmdzLi4uICkgXAorCQlMT0coRkRfTE9HX0RFQlVHLCBmb3JtYXQsICMjYXJncykKKworLyogUmVwb3J0IGEgbm9ybWFsIG1lc3NhZ2UgdGhhdCBpcyB1c2VmdWwgZm9yIG5vcm1hbCBhZG1pbiBtb25pdG9yaW5nICovCisjZGVmaW5lIExPR19OKGZvcm1hdCxhcmdzLi4uICkgXAorCQlMT0coRkRfTE9HX05PVElDRSwgZm9ybWF0LCMjYXJncykKKworLyogUmVwb3J0IGFuIGVycm9yICovCisjZGVmaW5lIExPR19FKGZvcm1hdCxhcmdzLi4uICkgXAorCQlMT0coRkRfTE9HX0VSUk9SLCBmb3JtYXQsICMjYXJncykKKworLyogUmVwb3J0IGEgZmF0YWwgZXJyb3IgKi8KKyNkZWZpbmUgTE9HX0YoZm9ybWF0LGFyZ3MuLi4gKSBcCisJCUxPRyhGRF9MT0dfRkFUQUwsIGZvcm1hdCwgIyNhcmdzKQorCisKKy8qKioqKioqKioqKioqCisgRGVyaXZhdGl2ZXMKKyAqKioqKioqKioqKiovCisvKiBUcmFjZSBhIGJpbmFyeSBidWZmZXIgY29udGVudCAqLworI2RlZmluZSBMT0dfQlVGRkVSKHByaW50bGV2ZWwsIHByZWZpeCwgYnVmLCBidWZzeiwgc3VmZml4ICkgewkJCQkJCQkJXAorCWludCBfX2k7CQkJCQkJCQkJCQkJCVwKKwlzaXplX3QgX19zeiA9IChzaXplX3QpKGJ1ZnN6KTsJCQkJCQkJCQkJCVwKKwl1aW50OF90ICogX19idWYgPSAodWludDhfdCAqKShidWYpOwkJCQkJCQkJCQlcCisJY2hhciBfX3N0cmJ1ZlsxMDI0KzFdOwkJCQkJCQkJCQkJCVwKKwlmb3IgKF9faSA9IDA7IChfX2kgPCBfX3N6KSAmJiAoX19pPChzaXplb2YoX19zdHJidWYpLzIpKTsgX19pKyspIHsJCQkJCQlcCisJCXNwcmludGYoX19zdHJidWYgKyAoMiAqIF9faSksICIlMDJoaHgiLCBfX2J1ZltfX2ldKTsgICAgIAkJCQkJCVwKKwl9CQkJCQkJCQkJCQkJCQlcCisgICAgICAgIGZkX2xvZyhwcmludGxldmVsLCBTVERfVFJBQ0VfRk1UX1NUUklORyAiJXMlcyVzIiBTVERfVFJBQ0VfRk1UX0FSR1MsICAJCQkJCQlcCisgICAgICAgICAgICAgICAocHJlZml4KSwgX19zdHJidWYsIChzdWZmaXgpKTsJCQkJCQkJCQkJXAorfQorCisvKiBTcGxpdCBhIG11bHRpLWxpbmUgYnVmZmVyIGludG8gc2VwYXJhdGUgY2FsbHMgdG8gdGhlIExPRyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgTE9HX1NQTElUKHByaW50bGV2ZWwsIHBlcl9saW5lX3ByZWZpeCwgbWxidWYsIHBlcl9saW5lX3N1ZmZpeCApIHsJCQkJCQlcCisJY2hhciAqIF9fbGluZSA9IChtbGJ1ZiksICpfX25leHQ7CQkJCQkJCQkJCVwKKwljaGFyICogX19wID0gKHBlcl9saW5lX3ByZWZpeCksICpfX3MgPSAocGVyX2xpbmVfc3VmZml4KTsJCQkJCQkJXAorCXdoaWxlICgoX19uZXh0ID0gc3RyY2hyKF9fbGluZSwgJ1xuJykpICE9IE5VTEwpIHsJCQkJCQkJCVwKKwkJTE9HKHByaW50bGV2ZWwsICIlcyUuKnMlcyIsIF9fcCA/OiIiLCAoaW50KShfX25leHQgLSBfX2xpbmUpLCBfX2xpbmUsIF9fcyA/OiIiKTsJCQlcCisJCV9fbGluZSA9IF9fbmV4dCArIDE7CQkJCQkJCQkJCQlcCisJfQkJCQkJCQkJCQkJCQkJXAorCUxPRyhwcmludGxldmVsLCAiJXMlcyVzIiwgX19wID86IiIsIF9fbGluZSwgX19zID86IiIpOwkJCQkJCQkJXAorfQorCisvKiBIZWxwZXIgZm9yIGZ1bmN0aW9uIGVudHJ5IC0tIGZvciB2ZXJ5IGRldGFpbGVkIHRyYWNlIG9mIHRoZSBleGVjdXRpb24gKi8KKyNkZWZpbmUgVFJBQ0VfRU5UUlkoX2Zvcm1hdCxfYXJncy4uLiApIFwKKwkJTE9HX0EoIltlbnRlcl0gJXMoIiBfZm9ybWF0ICIpIHsiICNfYXJncyAifSIsIF9fUFJFVFRZX0ZVTkNUSU9OX18sICMjX2FyZ3MgKTsKKworLyogSGVscGVyIGZvciBkZWJ1Z2dpbmcgYnkgYWRkaW5nIHRyYWNlcyAtLSBmb3IgZGVidWdpbmcgYSBzcGVjaWZpYyBsb2NhdGlvbiBvZiB0aGUgY29kZSAqLworI2RlZmluZSBUUkFDRV9IRVJFKCkJXAorCQlMT0dfRigiIC0tIGRlYnVnIGNoZWNrcG9pbnQgJWQgLS0gIiwgZmRfYnJlYWtoZXJlKCkpOworaW50IGZkX2JyZWFraGVyZSh2b2lkKTsKKworLyogSGVscGVyIGZvciB0cmFjaW5nIHRoZSBDSEVDS18qIG1hY3JvcyBiZWxvdyAtLSB2ZXJ5IHZlcnkgdmVyYm9zZSBjb2RlIGV4ZWN1dGlvbiEgKi8KKyNkZWZpbmUgVFJBQ0VfQ0FMTCggc3RyLi4uICkgCVwKKwkgCUxPR19BKCBzdHIgKQorCisvKiBGb3IgZGV2ZWxvcG1lbnQgb25seSwgdG8ga2VlcCB0cmFjayBvZiBUT0RPIGxvY2F0aW9ucyBpbiB0aGUgY29kZSAqLworI2lmbmRlZiBFUlJPUlNfT05fVE9ETworIyBkZWZpbmUgVE9ETyggX21zZywgX2FyZ3MuLi4gKSBcCisJCUxPR19GKCAiVE9ETzogIiBfbXNnICwgIyNfYXJncyk7CisjZWxzZSAvKiBFUlJPUlNfT05fVE9ETyAqLworIyBkZWZpbmUgVE9ETyggX21zZywgX2FyZ3MuLi4gKSBcCisJCSJUT0RPIiA9IF9tc2cgIyMgX2FyZ3M7IC8qIGp1c3QgYSBzdHVwaWQgY29tcGlsYXRpb24gZXJyb3IgdG8gc3BvdCB0aGUgdG9kbyAqLworI2VuZGlmIC8qIEVSUk9SU19PTl9UT0RPICovCisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworLyogICAgICAgICAgICAgICAgICBFUlJPUiBDSEVDS0lORyBNQUNSTyAgICAgICAgICAgICAgICAgICAgICAqLworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisvKiBNYWNyb3MgdG8gY2hlY2sgYSByZXR1cm4gdmFsdWUgYW5kIGJyYW5jaCBvdXQgaW4gY2FzZSBvZiBlcnJvci4KKyAqIFRoZXNlIG1hY3JvIGFkZGl0aW9uYWxseSBwcm92aWRlIHRoZSBsb2dnaW5nIGluZm9ybWF0aW9uLgorICoKKyAqIFRoZSBuYW1lICJfX3JldF9fIiBpcyBhbHdheXMgYXZhaWxhYmxlIGluIHRoZSBfX2ZhbGxiYWNrX18gcGFyYW1ldGVyIGFuZCBjb250YWlucyB0aGUgZXJyb3IgY29kZS4KKyAqLworIAorI2RlZmluZSBDSEVDS19QUkVMVURFKF9fY2FsbF9fKSAJCQlcCisJCWludCBfX3JldF9fOyAJCQkJXAorCQlUUkFDRV9DQUxMKCJDaGVjazogJXMiLCAjX19jYWxsX18gKTsJXAorCQlfX3JldF9fID0gKF9fY2FsbF9fKQorCQorI2RlZmluZSBERUZBVUxUX0ZCCXJldHVybiBfX3JldF9fOworCisvKiBTeXN0ZW0gY2hlY2s6IGVycm9yIGNhc2UgaWYgPCAwLCBlcnJvciB2YWx1ZSBpbiBlcnJubyAqLworI2RlZmluZSBDSEVDS19TWVNfR0VOKCBmYWlsbGV2ZWwsIF9fY2FsbF9fLCBfX2ZhbGxiYWNrX18gICkgeyAJCQkJCQlcCisJCUNIRUNLX1BSRUxVREUoX19jYWxsX18pOwkJCQkJCQkJXAorCQlpZiAoX19yZXRfXyA8IDApIHsJCQkJCQkJCQlcCisJCQlfX3JldF9fID0gZXJybm87CQkJCQkJCQlcCisJCQlMT0coZmFpbGxldmVsLCAiRVJST1I6IGluICclcycgOlx0JXMiLCAgI19fY2FsbF9fICwgc3RyZXJyb3IoX19yZXRfXykpOyAgICAJXAorCQkJX19mYWxsYmFja19fOwkJCQkJCQkJCVwKKwkJfQkJCQkJCQkJCQkJXAorfQorCisKKy8qIENoZWNrIHRoZSByZXR1cm4gdmFsdWUgb2YgYSBmdW5jdGlvbiBhbmQgZXhlY3V0ZSBmYWxsYmFjayBpbiBjYXNlIG9mIGVycm9yIG9yIHNwZWNpYWwgdmFsdWUgKi8KKyNkZWZpbmUgQ0hFQ0tfRkNUX0dFTjIoIGZhaWxsZXZlbCwgX19jYWxsX18sIF9fc3BldmFsX18sIF9fZmFsbGJhY2sxX18sIF9fZmFsbGJhY2syX18gKSB7CQlcCisJCUNIRUNLX1BSRUxVREUoX19jYWxsX18pOwkJCQkJCQkJXAorCQlpZiAoX19yZXRfXyAhPSAwKSB7CQkJCQkJCQkJXAorCQkJaWYgKF9fcmV0X18gPT0gKF9fc3BldmFsX18pKSB7CQkJCQkJCVwKKwkJCQlfX2ZhbGxiYWNrMV9fOwkJCQkJCQkJXAorCQkJfSBlbHNlIHsJCQkJCQkJCQlcCisJCQkJTE9HKGZhaWxsZXZlbCwgIkVSUk9SOiBpbiAnJXMnIDpcdCVzIiwgI19fY2FsbF9fICwgc3RyZXJyb3IoX19yZXRfXykpOwlcCisJCQkJX19mYWxsYmFjazJfXzsJCQkJCQkJCVwKKwkJCX0JCQkJCQkJCQkJXAorCQl9CQkJCQkJCQkJCQlcCit9CisKKy8qIENoZWNrIHRoZSByZXR1cm4gdmFsdWUgb2YgYSBmdW5jdGlvbiBhbmQgZXhlY3V0ZSBmYWxsYmFjayBpbiBjYXNlIG9mIGVycm9yIChyZXR1cm4gdmFsdWUgZGlmZmVyZW50IGZyb20gMCkgKi8KKyNkZWZpbmUgQ0hFQ0tfRkNUX0dFTiggZmFpbGxldmVsLCBfX2NhbGxfXywgX19mYWxsYmFja19fKSBcCisJICAgICAgIENIRUNLX0ZDVF9HRU4yKCBmYWlsbGV2ZWwsIChfX2NhbGxfXyksIDAsICwgKF9fZmFsbGJhY2tfXykgKQorCisvKiBDaGVjayB0aGF0IGEgbWVtb3J5IGFsbG9jYXRvciBkaWQgbm90IHJldHVybiBOVUxMLCBvdGhlcndpc2UgbG9nIGFuIGVycm9yIGFuZCBleGVjdXRlIGZhbGxiYWNrICovCisjZGVmaW5lIENIRUNLX01BTExPQ19HRU4oIGZhaWxsZXZlbCwgX19jYWxsX18sIF9fZmFsbGJhY2tfXyApIHsgCQkJCSAgICAgICBcCisJICAgICAgIHZvaWQgKiAgX19wdHJfXzsgCQkJCQkJCQkgICAgICAgXAorCSAgICAgICBUUkFDRV9DQUxMKCJDaGVjazogJXMiLCAjX19jYWxsX18gKTsJCQkJCQkgICAgICAgXAorCSAgICAgICBfX3B0cl9fID0gKHZvaWQgKikoX19jYWxsX18pOwkJCQkJCQkgICAgICAgXAorCSAgICAgICBpZiAoX19wdHJfXyA9PSBOVUxMKSB7CQkJCQkJCQkgICAgICAgXAorCQkgICAgICAgaW50IF9fcmV0X18gPSBlcnJubzsJCQkJCQkJICAgICAgIFwKKwkJICAgICAgIExPRyhmYWlsbGV2ZWwsICJFUlJPUjogaW4gJyVzJyA6XHQlcyIsICAjX19jYWxsX18gLCBzdHJlcnJvcihfX3JldF9fKSk7ICAgICAgICAgXAorCQkgICAgICAgX19mYWxsYmFja19fOwkJCQkJCQkJICAgICAgIFwKKwkgICAgICAgfQkJCQkJCQkJCQkgICAgICAgXAorfQorCisvKiBDaGVjayBwYXJhbWV0ZXJzIGF0IGZ1bmN0aW9uIGVudHJ5LCBleGVjdXRlIGZhbGxiYWNrIG9uIGVycm9yICovCisjZGVmaW5lIENIRUNLX1BBUkFNU19HRU4oIGZhaWxsZXZlbCwgX19ib29sX18sIF9fZmFsbGJhY2tfXyApIHsJCQkJCSAgICAgICBcCisJICAgICAgIFRSQUNFX0NBTEwoIkNoZWNrOiAlcyIsICNfX2Jvb2xfXyApOwkJCQkJCSAgICAgICBcCisJICAgICAgIGlmICggISAoX19ib29sX18pICkgewkJCQkJCQkJICAgICAgIFwKKwkJICAgICAgIGludCBfX3JldF9fID0gRUlOVkFMOwkJCQkJCQkgICAgICAgXAorCQkgICAgICAgTE9HKGZhaWxsZXZlbCwgIkVSUk9SOiBpbnZhbGlkIHBhcmFtZXRlciAnJXMnIiwgICNfX2Jvb2xfXyApOyAgCSAgICAgICAJICAgICAgIFwKKwkJICAgICAgIF9fZmFsbGJhY2tfXzsJCQkJCQkJCSAgICAgICBcCisJICAgICAgIH0JCQkJCQkJCQkJICAgICAgIFwKK30KKworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisvKiAgICAgICAgICBDT01QQVRJQklMSVRZIE1BQ1JPUywgVE8gQkUgUkVNT1ZFRAkJICAgICAgKi8KKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKy8qIFJlZGVmaW5lIHRoZSBvbGQgbWFjcm9zIGZvciB0cmFuc2l0aW9uIG9mIHRoZSBjb2RlICovCisjaWZuZGVmIEVYQ0xVREVfREVQUkVDQVRFRAorCisjZGVmaW5lIE1BUktfREVQUkVDQVRFRAkvKiBfX2F0dHJpYnV0ZV9fICgoZGVwcmVjYXRlZCkpICovCisKK2VudW0gb2xkX2xldmVscyB7CisJTk9ORSA9IDAsCisJSU5GTyA9IDEsCisJRlVMTCA9IDIsCisJQU5OT1lJTkcgPSA0LAorCUZDVFMgPSA2LAorCUNBTEwgPSA5Cit9IE1BUktfREVQUkVDQVRFRDsKKworc3RhdGljIF9faW5saW5lX18gaW50IG9sZF9UUkFDRV9CT09MKCBlbnVtIG9sZF9sZXZlbHMgbGV2ZWwsIGNvbnN0IGNoYXIgKiBmaWxlLCBjb25zdCBjaGFyICogZnVuYyApIE1BUktfREVQUkVDQVRFRAoreworCWlmICgoZmRfZGVidWdfb25lX2Z1bmN0aW9uICYmICFzdHJjbXAoZmRfZGVidWdfb25lX2Z1bmN0aW9uLCBmdW5jKSkKKwkJfHwgKGZkX2RlYnVnX29uZV9maWxlICYmICFzdHJjbXAoZmRfZGVidWdfb25lX2ZpbGUsIGZpbGUpICkpCisJCXJldHVybiAyOyAvKiBMZXZlbCBvdmVycmlkZSAqLworCWlmICgoaW50KWxldmVsIDw9IGZkX2dfZGVidWdfbHZsKQorCQlyZXR1cm4gMTsgLyogTm9ybWFsIGxldmVsICovCisJcmV0dXJuIDA7ICAvKiBObyB0cmFjZSAqLworfQorI2RlZmluZSBUUkFDRV9CT09MKGxldmVsKSAgb2xkX1RSQUNFX0JPT0woKGxldmVsKSwgX19TVFJJUFBFRF9GSUxFX18sIF9fUFJFVFRZX0ZVTkNUSU9OX18pCisKKyNpZm5kZWYgU1dJRworc3RhdGljIF9faW5saW5lX18gdm9pZCBmZF9sb2dfZGVwcmVjYXRlZCggaW50IGxldmVsLCBjb25zdCBjaGFyICpmb3JtYXQsIC4uLiApIE1BUktfREVQUkVDQVRFRAoreyAKKwl2YV9saXN0IGFwOworCXZhX3N0YXJ0KGFwLCBmb3JtYXQpOworCWZkX2xvZ192YShsZXZlbCwgZm9ybWF0LCBhcCk7CisJdmFfZW5kKGFwKTsKK30KKyNlbHNlIC8qIFNXSUcgKi8KK3ZvaWQgZmRfbG9nX2RlcHJlY2F0ZWQoIGludCBsZXZlbCwgY29uc3QgY2hhciAqZm9ybWF0LCAuLi4gKTsKKyNlbmRpZiAvKiBTV0lHICovCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIHJlcGxhY2VfbWUoKSBNQVJLX0RFUFJFQ0FURUQgeyB9CisKKyNkZWZpbmUgVFJBQ0VfQlVGRkVSKC4uLikgcmVwbGFjZV9tZSgpOworI2RlZmluZSBUUkFDRV9OT1RJQ0UoLi4uKSByZXBsYWNlX21lKCk7CisKKworLyogVXNlIHRoZSBMT0dfKiBpbnN0ZWFkLCBvciB1c2UgdGhlIG5ldyAqX2R1bXAgZnVuY3Rpb25zIHdoZW4gZHVtcGluZyBhbiBvYmplY3QgKi8KKyNkZWZpbmUgZmRfbG9nX2RlYnVnKGZvcm1hdCxhcmdzLi4uKSAgZmRfbG9nX2RlcHJlY2F0ZWQoRkRfTE9HX0RFQlVHLCBmb3JtYXQsICMjIGFyZ3MpCisjZGVmaW5lIGZkX2xvZ19ub3RpY2UoZm9ybWF0LGFyZ3MuLi4pIGZkX2xvZ19kZXByZWNhdGVkKEZEX0xPR19OT1RJQ0UsIGZvcm1hdCwgIyMgYXJncykKKyNkZWZpbmUgZmRfbG9nX2Vycm9yKGZvcm1hdCxhcmdzLi4uKSAgZmRfbG9nX2RlcHJlY2F0ZWQoRkRfTE9HX0VSUk9SLCBmb3JtYXQsICMjIGFyZ3MpCisKKy8qIG9sZCBtYWNybyBmb3IgdHJhY2VzLiBUbyBiZSByZXBsYWNlZCBieSBhcHByb3ByaWF0ZSBMT0dfKiBtYWNyb3MuICovCisjIGRlZmluZSBUUkFDRV9ERUJVRyhvbGRsZXZlbCwgZm9ybWF0LGFyZ3MuLi4gKSB7CQkJCQlcCisJCWludCBfX2xfXzsJCQkJCQkJCVwKKwkJaWYgKChfX2xfXyA9IFRSQUNFX0JPT0wob2xkbGV2ZWwpKSkgewkJCQkJXAorCQkJaWYgICAgICAob2xkbGV2ZWwgPD0gTk9ORSkgeyBMT0dfRShmb3JtYXQsIyNhcmdzKTsgfQkJXAorCQkJZWxzZSBpZiAob2xkbGV2ZWwgPD0gSU5GTykgeyBMT0dfTihmb3JtYXQsIyNhcmdzKTsgfQkJXAorCQkJZWxzZSBpZiAoX19sX18gPT0gMikgICAgICAgeyBMT0dfTihmb3JtYXQsIyNhcmdzKTsgfQkJXAorCQkJZWxzZSBpZiAob2xkbGV2ZWwgPD0gRlVMTCkgeyBMT0dfRChmb3JtYXQsIyNhcmdzKTsgfQkJXAorCQkJZWxzZSAgICAgICAgICAgICAgICAgICAgICAgeyBMT0dfQShmb3JtYXQsIyNhcmdzKTsgfQkJXAorfQkJfQorCisvKiB0aGUgZm9sbG93aW5nIG1hY3JvIG11c3QgYmUgcmVwbGFjZWQgd2l0aCBMT0dfRSBvciBMT0dfRiAqLworIyBkZWZpbmUgVFJBQ0VfRVJST1IJTE9HX0UKKworCisvKiBUaGUgZm9sbG93aW5nIG1hY3JvcyBhcmUgbWlzc2luZyB0aGUgZmFpbGxldmVsIGluZm9ybWF0aW9uLCB3aGljaCBpbmRpY2F0ZXMgYXQgd2hhdCBsb2cgbGV2ZWwgdGhlIGVycm9yIGNhc2Ugc2hvdWxkIGJlIGRpc3BsYXllZC4gKi8KKyMgZGVmaW5lIENIRUNLX1NZU19ETyggX19jYWxsX18sIF9fZmFsbGJhY2tfXyAgKSB7IAkJCQkJCQlcCisJCUNIRUNLX1BSRUxVREUoX19jYWxsX18pOwkJCQkJCQkJXAorCQlpZiAoX19yZXRfXyA8IDApIHsJCQkJCQkJCQlcCisJCQlfX3JldF9fID0gZXJybm87CQkJCQkJCQlcCisJCQlUUkFDRV9FUlJPUigiRVJST1I6IGluICclcycgOlx0JXMiLCAgI19fY2FsbF9fICwgc3RyZXJyb3IoX19yZXRfXykpOyAgICAJXAorCQkJX19mYWxsYmFja19fOwkJCQkJCQkJCVwKKwkJfQkJCQkJCQkJCQkJXAorfQorCisjIGRlZmluZSBDSEVDS19TWVMoIF9fY2FsbF9fICApIFwKKwkJQ0hFQ0tfU1lTX0RPKCAoX19jYWxsX18pLCByZXR1cm4gX19yZXRfXyAgKQorCisKKyMgZGVmaW5lIENIRUNLX1BPU0lYX0RPMiggX19jYWxsX18sIF9fc3BldmFsX18sIF9fZmFsbGJhY2sxX18sIF9fZmFsbGJhY2syX18gKSB7CQkJXAorCQlDSEVDS19QUkVMVURFKF9fY2FsbF9fKTsJCQkJCQkJCVwKKwkJaWYgKF9fcmV0X18gIT0gMCkgewkJCQkJCQkJCVwKKwkJCWlmIChfX3JldF9fID09IChfX3NwZXZhbF9fKSkgewkJCQkJCQlcCisJCQkJX19mYWxsYmFjazFfXzsJCQkJCQkJCVwKKwkJCX0gZWxzZSB7CQkJCQkJCQkJXAorCQkJCVRSQUNFX0VSUk9SKCJFUlJPUjogaW4gJyVzJyA6XHQlcyIsICNfX2NhbGxfXyAsIHN0cmVycm9yKF9fcmV0X18pKTsJXAorCQkJCV9fZmFsbGJhY2syX187CQkJCQkJCQlcCisJCQl9CQkJCQkJCQkJCVwKKwkJfQkJCQkJCQkJCQkJXAorfQorCisjIGRlZmluZSBDSEVDS19QT1NJWF9ETyggX19jYWxsX18sIF9fZmFsbGJhY2tfXyApCVwKKwkJQ0hFQ0tfUE9TSVhfRE8yKCAoX19jYWxsX18pLCAwLCAsIF9fZmFsbGJhY2tfXyApCisKKyMgZGVmaW5lIENIRUNLX1BPU0lYKCBfX2NhbGxfXyApCVwKKwkJQ0hFQ0tfUE9TSVhfRE8oIChfX2NhbGxfXyksIHJldHVybiBfX3JldF9fICkKKwkJCisjIGRlZmluZSBDSEVDS19NQUxMT0NfRE8oIF9fY2FsbF9fLCBfX2ZhbGxiYWNrX18gKSB7IAkJCQkgICAJCSAgICAgICBcCisJICAgICAgIHZvaWQgKiAgX19wdHJfXzsgCQkJCQkJCQkgICAgICAgXAorCSAgICAgICBUUkFDRV9DQUxMKCJDaGVjazogJXMiLCAjX19jYWxsX18gKTsJCQkJCQkgICAgICAgXAorCSAgICAgICBfX3B0cl9fID0gKHZvaWQgKikoX19jYWxsX18pOwkJCQkJCQkgICAgICAgXAorCSAgICAgICBpZiAoX19wdHJfXyA9PSBOVUxMKSB7CQkJCQkJCQkgICAgICAgXAorCQkgICAgICAgaW50IF9fcmV0X18gPSBlcnJubzsJCQkJCQkJICAgICAgIFwKKwkJICAgICAgVFJBQ0VfRVJST1IoIkVSUk9SOiBpbiAnJXMnIDpcdCVzIiwgICNfX2NhbGxfXyAsIHN0cmVycm9yKF9fcmV0X18pKTsgICAgICAgICAgICAgXAorCQkgICAgICAgX19mYWxsYmFja19fOwkJCQkJCQkJICAgICAgIFwKKwkgICAgICAgfQkJCQkJCQkJCQkgICAgICAgXAorfQorCisjIGRlZmluZSBDSEVDS19NQUxMT0MoIF9fY2FsbF9fICkJXAorCQlDSEVDS19NQUxMT0NfRE8oIChfX2NhbGxfXyksIHJldHVybiBfX3JldF9fICkKKwkKKyMgZGVmaW5lIENIRUNLX1BBUkFNU19ETyggX19ib29sX18sIF9fZmFsbGJhY2tfXyApIHsJCQkJCSAgICAgICAJICAgICAgIFwKKwkgICAgICAgVFJBQ0VfQ0FMTCgiQ2hlY2s6ICVzIiwgI19fYm9vbF9fICk7CQkJCQkJICAgICAgIFwKKwkgICAgICAgaWYgKCAhIChfX2Jvb2xfXykgKSB7CQkJCQkJCQkgICAgICAgXAorCQkgICAgICAgaW50IF9fcmV0X18gPSBFSU5WQUw7CQkJCQkJCSAgICAgICBcCisJCSAgICAgICBUUkFDRV9FUlJPUigiRVJST1I6IEludmFsaWQgcGFyYW1ldGVyICclcycsICVkIiwgICNfX2Jvb2xfXywgX19yZXRfXyApOyAgICAgICAgIFwKKwkJICAgICAgIF9fZmFsbGJhY2tfXzsJCQkJCQkJCSAgICAgICBcCisJICAgICAgIH0JCQkJCQkJCQkJICAgICAgIFwKK30KKworIyBkZWZpbmUgQ0hFQ0tfUEFSQU1TKCBfX2Jvb2xfXyApCVwKKwkJQ0hFQ0tfUEFSQU1TX0RPKCAoX19ib29sX18pLCByZXR1cm4gX19yZXRfXyApCisKKyMgZGVmaW5lIENIRUNLX0ZDVF9ETwlDSEVDS19QT1NJWF9ETworIyBkZWZpbmUgQ0hFQ0tfRkNUCUNIRUNLX1BPU0lYCisKKyNlbmRpZiAvKiBFWENMVURFX0RFUFJFQ0FURUQgKi8KKwkgICAgICAgCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKy8qCU9wdGltaXplZCBjb2RlOiByZW1vdmUgYWxsIGRlYnVnZ2luZyBjb2RlCSAgICAgICovCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisjaWZkZWYgU1RSSVBfREVCVUdfQ09ERQorI3VuZGVmIExPR19ECisjdW5kZWYgTE9HX04KKyN1bmRlZiBMT0dfRQorI3VuZGVmIExPR19GCisjdW5kZWYgTE9HX0JVRkZFUgorCisjZGVmaW5lIExPR19EKGZvcm1hdCxhcmdzLi4uICkgLyogbm9vcCAqLworI2RlZmluZSBMT0dfTihmb3JtYXQsYXJncy4uLikgZmRfbG9nKEZEX0xPR19OT1RJQ0UsIGZvcm1hdCwgIyMgYXJncykKKyNkZWZpbmUgTE9HX0UoZm9ybWF0LGFyZ3MuLi4pIGZkX2xvZyhGRF9MT0dfRVJST1IsIGZvcm1hdCwgIyMgYXJncykKKyNkZWZpbmUgTE9HX0YoZm9ybWF0LGFyZ3MuLi4pIGZkX2xvZyhGRF9MT0dfRkFUQUwsIGZvcm1hdCwgIyMgYXJncykKKyNkZWZpbmUgTE9HX0JVRkZFUihwcmludGxldmVsLCBsZXZlbCwgcHJlZml4LCBidWYsIGJ1ZnN6LCBzdWZmaXggKSB7CQkJCQkJCQlcCisJaWYgKHByaW50bGV2ZWwgPiBGRF9MT0dfREVCVUcpIHsJCQkJCQkJCQkJCVwKKwkJaW50IF9faTsJCQkJCQkJCQkJCQkJXAorCQlzaXplX3QgX19zeiA9IChzaXplX3QpKGJ1ZnN6KTsJCQkJCQkJCQkJCVwKKwkJdWludDhfdCAqIF9fYnVmID0gKHVpbnQ4X3QgKikoYnVmKTsJCQkJCQkJCQkJXAorCQljaGFyICogX19zdHJidWZbMTAyNCsxXTsJCQkJCQkJCQkJCVwKKwkJZm9yIChfX2kgPSAwOyAoX19pIDwgX19zeikgJiYgKF9faTwoc2l6ZW9mKF9fc3RyYnVmKS8yKTsgX19pKyspIHsJCQkJCQlcCisJCQlzcHJpbnRmKF9fc3RyYnVmICsgKDIgKiBfX2kpLCAiJTAyLjJoaHgiLCBfX2J1ZltfX2ldKTsgICAgIAkJCQkJCVwKKwkJfQkJCQkJCQkJCQkJCQkJXAorICAgICAgICAgICAgICAgIGZkX2xvZyhwcmludGxldmVsLCBwcmVmaXgiJXMic3VmZml4LCBfX3N0cmJ1Zik7CQkJCQkJCQkJXAorCX0KKyNlbmRpZiAvKiBTVFJJUF9ERUJVR19DT0RFICovCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKy8qCQkgICAgT1RIRVIgTUFDUk9TCQkJICAgICAgKi8KKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKy8qIGhlbHBlciBtYWNyb3MgKHByZS1wcm9jZXNzb3IgaGFja3MgdG8gYWxsb3cgbWFjcm8gYXJndW1lbnRzKSAqLworI2RlZmluZSBfX3Rvc3RyKCBhcmcgKSAgI2FyZworI2RlZmluZSBfc3RyaW5naXplKCBhcmcgKSBfX3Rvc3RyKCBhcmcgKQorI2RlZmluZSBfX2FnciggYXJnMSwgYXJnMiApIGFyZzEgIyMgYXJnMgorI2RlZmluZSBfYWdncmVnYXRlKCBhcmcxLCBhcmcyICkgX19hZ3IoIGFyZzEsIGFyZzIgKQorCisvKiBTb21lIGFsaWFzZXMgdG8gc29ja2V0IGFkZHJlc3NlcyBzdHJ1Y3R1cmVzICovCisjZGVmaW5lIHNTUwlzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZQorI2RlZmluZSBzU0EJc3RydWN0IHNvY2thZGRyCisjZGVmaW5lIHNTQTQJc3RydWN0IHNvY2thZGRyX2luCisjZGVmaW5lIHNTQTYJc3RydWN0IHNvY2thZGRyX2luNgorCisvKiBUaGUgc29ja2FkZHIgbGVuZ3RoIG9mIGEgc1NTIHN0cnVjdHVyZSAqLworI2RlZmluZSBzU0FsZW4oIF9zYV8gKQlcCisJKCAoc29ja2xlbl90KSAoICgoKHNTQSAqKV9zYV8pLT5zYV9mYW1pbHkgPT0gQUZfSU5FVCkgPyAoc2l6ZW9mKHNTQTQpKSA6CQlcCisJCQkJKCgoKHNTQSAqKV9zYV8pLT5zYV9mYW1pbHkgPT0gQUZfSU5FVDYpID8gKHNpemVvZihzU0E2KSkgOglcCisJCQkJCTAgKSApICkKKyNkZWZpbmUgc1NBcG9ydCggX3NhXyApCVwKKwkoIChzb2NrbGVuX3QpICggKCgoc1NBICopX3NhXyktPnNhX2ZhbWlseSA9PSBBRl9JTkVUKSA/ICgoKHNTQTQgKikoX3NhXykpLT5zaW5fcG9ydCkgOgkJXAorCQkJCSgoKChzU0EgKilfc2FfKS0+c2FfZmFtaWx5ID09IEFGX0lORVQ2KSA/ICgoKHNTQTYgKikoX3NhXykpLT5zaW42X3BvcnQpIDoJXAorCQkJCQkwICkgKSApCisKK0RFQ0xBUkVfRkRfRFVNUF9QUk9UT1RZUEUoZmRfc2FfZHVtcCwgc1NBICogc2EsIGludCBmbGFncyk7CisjZGVmaW5lIHNTQV9EVU1QX1NUUkxFTgkoSU5FVDZfQUREUlNUUkxFTiArIDEgKyAzMiArIDIpCit2b2lkIGZkX3NhX3NkdW1wX251bWVyaWMoY2hhciAqIGJ1ZiAvKiBtdXN0IGJlIGF0IGxlYXN0IHNTQV9EVU1QX1NUUkxFTiAqLywgc1NBICogc2EpOworCisKKy8qIEEgbDQgcHJvdG9jb2wgbmFtZSAoVENQIC8gU0NUUCkgKi8KKyNpZmRlZiBESVNBQkxFX1NDVFAKKyNkZWZpbmUgSVBQUk9UT19OQU1FKCBfcHJvdG8gKQkJCQkJXAorCSgoKF9wcm90bykgPT0gSVBQUk9UT19UQ1ApID8gIlRDUCIgOgkJCVwKKwkJCSJVbmtub3duIikKKyNlbHNlIC8qIERJU0FCTEVfU0NUUCAqLworI2RlZmluZSBJUFBST1RPX05BTUUoIF9wcm90byApCQkJCQlcCisJKCAoKF9wcm90bykgPT0gSVBQUk9UT19UQ1ApID8gIlRDUCIgOgkJCVwKKwkJKCgoX3Byb3RvKSA9PSBJUFBST1RPX1NDVFApID8gIlNDVFAiIDoJCVwKKwkJCSJVbmtub3duIikpCisjZW5kaWYgLyogRElTQUJMRV9TQ1RQICovCisKKy8qIERlZmluZSB0aGUgdmFsdWUgb2YgSVAgbG9vcGJhY2sgYWRkcmVzcyAqLworI2lmbmRlZiBJTkFERFJfTE9PUEJBQ0sgCisjZGVmaW5lIElOQUREUl9MT09QQkFDSwlpbmV0X2FkZHIoIjEyNy4wLjAuMSIpCisjZW5kaWYgLyogSU5BRERSX0xPT1BCQUNLICovCisKKyNpZm5kZWYgSU5BRERSX0JST0FEQ0FTVAorI2RlZmluZQlJTkFERFJfQlJPQURDQVNUCSgoaW5fYWRkcl90KSAweGZmZmZmZmZmKQorI2VuZGlmIC8qIElOQUREUl9CUk9BRENBU1QgKi8KKworLyogQW4gSVAgZXF1aXZhbGVudCB0byBJTjZfSVNfQUREUl9MT09QQkFDSyAqLworI2lmbmRlZiBJTl9JU19BRERSX0xPT1BCQUNLCisjZGVmaW5lIElOX0lTX0FERFJfTE9PUEJBQ0soYSkgXAorICAoKCgobG9uZyBpbnQpIChhKS0+c19hZGRyKSAmIG50b2hsKDB4ZmYwMDAwMDApKSA9PSBudG9obCgweDdmMDAwMDAwKSkKKyNlbmRpZiAvKiBJTl9JU19BRERSX0xPT1BCQUNLICovCisKKy8qIEFuIElQIGVxdWl2YWxlbnQgdG8gSU42X0lTX0FERFJfVU5TUEVDSUZJRUQgKi8KKyNpZm5kZWYgSU5fSVNfQUREUl9VTlNQRUNJRklFRAorI2RlZmluZSBJTl9JU19BRERSX1VOU1BFQ0lGSUVEKGEpIFwKKyAgKCgobG9uZyBpbnQpIChhKS0+c19hZGRyKSA9PSAweDAwMDAwMDAwKQorI2VuZGlmIC8qIElOX0lTX0FERFJfVU5TUEVDSUZJRUQgKi8KKworLyogY3JlYXRlIGEgVjRNQVBQRUQgYWRkcmVzcyAqLworI2RlZmluZSBJTjZfQUREUl9WNE1BUCggYTYsIGE0ICkgewkJCVwKKwkoKHVpbnQzMl90ICopKGE2KSlbMF0gPSAwOwkJCVwKKwkoKHVpbnQzMl90ICopKGE2KSlbMV0gPSAwOwkJCVwKKwkoKHVpbnQzMl90ICopKGE2KSlbMl0gPSBodG9ubCgweGZmZmYpOwkJXAorCSgodWludDMyX3QgKikoYTYpKVszXSA9ICh1aW50MzJfdCkoYTQpOwkJXAorfQorCisvKiBSZXRyaWV2ZSBhIHY0IHZhbHVlIGZyb20gVjRNQVBQRUQgYWRkcmVzcyAoIHRha2VzIGEgczZfYWRkciBhcyBwYXJhbSkgKi8KKyNkZWZpbmUgSU42X0FERFJfVjRVTk1BUCggYTYgKSAJCQkJXAorCSgoKGluX2FkZHJfdCAqKShhNikpWzNdKQorCisKKy8qIFdlIHByb3ZpZGUgbWFjcm9zIHRvIGNvbnZlcnQgNjQgYml0IHZhbHVlcyB0byBhbmQgZnJvbSBuZXR3b3JrIGJ5dGUtb3JkZXIsIG9uIHN5c3RlbXMgd2hlcmUgaXQgaXMgbm90IGFscmVhZHkgcHJvdmlkZWQuICovCisjaWZuZGVmIEhBVkVfTlRPSExMCS8qIERlZmluZWQgYnkgdGhlIGNtYWtlIHN0ZXAsIGlmIHRoZSBudG9obGwgc3ltYm9sIGlzIGRlZmluZWQgb24gdGhlIHN5c3RlbSAqLworIyBpZiBIT1NUX0JJR19FTkRJQU4KKyAgICAvKiBJbiBiaWctZW5kaWFuIHN5c3RlbXMsIHdlIGRvbid0IGhhdmUgdG8gY2hhbmdlIHRoZSB2YWx1ZXMsIHNpbmNlIHRoZSBvcmRlciBpcyB0aGUgc2FtZSBhcyBuZXR3b3JrICovCisjICAgZGVmaW5lIG50b2hsbCh4KSAoeCkKKyMgICBkZWZpbmUgaHRvbmxsKHgpICh4KQorIyBlbHNlIC8qIEhPU1RfQklHX0VORElBTiAqLworICAgIC8qIEZvciB0aGVzZSBzeXN0ZW1zLCB3ZSBtdXN0IHJldmVyc2UgdGhlIGJ5dGVzLiBVc2UgbnRvaGwgYW5kIGh0b25sIG9uIHN1Yi0zMiBibG9jcywgYW5kIGludmVyc2UgdGhlc2UgYmxvY3MuICovCisjICAgZGVmaW5lIG50b2hsbCh4KSAodHlwZW9mICh4KSkoICgoKHVpbnQ2NF90KW50b2hsKCAodWludDMyX3QpKHgpKSkgPDwgMzIgKSB8ICgodWludDY0X3QpIG50b2hsKCAoKHVpbnQ2NF90KSh4KSkgPj4gMzIgKSkpIAorIyAgIGRlZmluZSBodG9ubGwoeCkgKHR5cGVvZiAoeCkpKCAoKCh1aW50NjRfdClodG9ubCggKHVpbnQzMl90KSh4KSkpIDw8IDMyICkgfCAoKHVpbnQ2NF90KSBodG9ubCggKCh1aW50NjRfdCkoeCkpID4+IDMyICkpKSAKKyMgZW5kaWYgLyogSE9TVF9CSUdfRU5ESUFOICovCisjZW5kaWYgLyogSEFWRV9OVE9ITEwgKi8KKworLyogVGhpcyBtYWNybyB3aWxsIGdpdmUgdGhlIG5leHQgbXVsdGlwbGUgb2YgNCBmb3IgYW4gaW50ZWdlciAodXNlZCBmb3IgcGFkZGluZyBzaXplcyBvZiBBVlApLiAqLworI2RlZmluZSBQQUQ0KF94KSAoKF94KSArICggKDQgLSAoX3gpKSAmIDMgKSApCisKKy8qIFVzZWZ1bCB0byBkaXNwbGF5IGFueSB2YWx1ZSBhcyAoc2FmZSkgQVNDSUkgKHdpbGwgZ2FyYmFnZSBVVEYtOCBvdXRwdXQuLi4pICovCisjZGVmaW5lIEFTQ0lJKF9jKSAoICgoX2MgPCAzMikgfHwgKF9jID4gMTI3KSkgPyAoIF9jID8gJz8nIDogJyAnICkgOiBfYyApCisKKy8qIENvbXBhcmUgdGltZXNwZWMgc3RydWN0dXJlcyAqLworI2RlZmluZSBUU19JU19JTkZFUklPUiggdHMxLCB0czIgKSAJCVwKKwkoICAgICgodHMxKS0+dHZfc2VjICA8ICh0czIpLT50dl9zZWMgKSAJXAorCSAgfHwgKCgodHMxKS0+dHZfc2VjICA9PSAodHMyKS0+dHZfc2VjICkgJiYgKCh0czEpLT50dl9uc2VjIDwgKHRzMiktPnR2X25zZWMpICkpCisKKy8qIENvbXB1dGUgZGlmZiBiZXR3ZWVuIHR3byB0aW1lc3BlY3MgKHBvaW50ZXJzKSAqLworI2RlZmluZSBUU19ESUZGRVJFTkNFKCB0c2RpZmYsIHRzc3RhcnQsIHRzZW5kICkJewkJCQkJXAorCWlmICgodHNlbmQpLT50dl9uc2VjIDwgKHRzc3RhcnQpLT50dl9uc2VjICkgewkJCQkJXAorCQkodHNkaWZmKS0+dHZfc2VjID0gKHRzZW5kKS0+dHZfc2VjIC0gKHRzc3RhcnQpLT50dl9zZWMgLSAxOwkJXAorCQkodHNkaWZmKS0+dHZfbnNlYyA9ICh0c2VuZCktPnR2X25zZWMgKyAxMDAwMDAwMDAwIC0gKHRzc3RhcnQpLT50dl9uc2VjOwlcCisJfSBlbHNlIHsJCQkJCQkJCQlcCisJCSh0c2RpZmYpLT50dl9zZWMgID0gKHRzZW5kKS0+dHZfc2VjICAtICh0c3N0YXJ0KS0+dHZfc2VjOwkJXAorCQkodHNkaWZmKS0+dHZfbnNlYyA9ICh0c2VuZCktPnR2X25zZWMgLSAodHNzdGFydCktPnR2X25zZWM7CQlcCisJfX0KKwkJCisKKy8qIFRoaXMgZ2l2ZXMgYSBnb29kIHNpemUgZm9yIGJ1ZmZlcmVkIHJlYWRzICovCisjaWZuZGVmIEJVRlNJWgorI2RlZmluZSBCVUZTSVogOTYKKyNlbmRpZiAvKiBCVUZTSVogKi8KKworLyogVGhpcyBnaXZlcyB0aGUgbGVuZ3RoIG9mIGEgY29uc3Qgc3RyaW5nICovCisjZGVmaW5lIENPTlNUU1RSTEVOKCBzdHIgKSAoc2l6ZW9mKHN0cikgLSAxKQorCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgIFBPUlRBQklMSVRZICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKyNpZm5kZWYgSEFWRV9DTE9DS19HRVRUSU1FCisgICNkZWZpbmUgQ0xPQ0tfUkVBTFRJTUUgIDAKKyAgI2luY2x1ZGUgPHN5cy90aW1lLmg+CisgIGludCBjbG9ja19nZXR0aW1lKGludCBjbGtfaWQsIHN0cnVjdCB0aW1lc3BlYyogdHMpOworI2VuZGlmIC8qIEhBVkVfQ0xPQ0tfR0VUVElNRSAqLworCisjaWZuZGVmIEhBVkVfU1RSTkRVUAorY2hhciAqIHN0cm5kdXAgKGNoYXIgKnN0ciwgc2l6ZV90IGxlbik7CisjZW5kaWYgLyogSEFWRV9TVFJORFVQICovCisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworLyogICAgICAgICAgICAgICAgICAgICAgICAgQklOQVJZIFNUUklOR1MgICAgICAgICAgICAgICAgICAgICAqLworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisvKiBDb21wdXRlIGEgaGFzaCB2YWx1ZSBvZiBhIGJpbmFyeSBzdHJpbmcuIAorVGhlIGhhc2ggbXVzdCByZW1haW4gbG9jYWwgdG8gdGhpcyBtYWNoaW5lLCB0aGVyZSBpcyBubyBndWFyYW50ZWUgdGhhdCBzYW1lIGlucHV0Cit3aWxsIGdpdmUgc2FtZSBvdXRwdXQgb24gYSBkaWZmZXJlbnQgc3lzdGVtIChlbmRpYW5uZXNzKSAqLwordWludDMyX3QgZmRfb3NfaGFzaCAoIHVpbnQ4X3QgKiBzdHJpbmcsIHNpemVfdCBsZW4gKTsKKworLyogVGhpcyB0eXBlIHVzZWQgZm9yIGJpbmFyeSBzdHJpbmdzIHRoYXQgY29udGFpbiBubyBcMCBleGNlcHQgYXMgdGhlaXIgbGFzdCBjaGFyYWN0ZXIuIAorSXQgbWVhbnMgc29tZSBzdHJpbmcgb3BlcmF0aW9ucyBjYW4gYmUgdXNlZCBvbiBpdC4gKi8KK3R5cGVkZWYgdWludDhfdCAqIG9zMF90OworCisvKiBTYW1lIGFzIHN0cmR1cCBidXQgZm9yIG9zMF90IHN0cmluZ3MgKi8KK29zMF90IG9zMGR1cF9pbnQob3MwX3Qgcywgc2l6ZV90IGwpOworI2RlZmluZSBvczBkdXAoIF9zLCBfbCkgICh2b2lkICopb3MwZHVwX2ludCgob3MwX3QpKF9zKSwgX2wpCisKKy8qIENoZWNrIHRoYXQgYW4gb2N0ZXQgc3RyaW5nIHZhbHVlIGNhbiBiZSB1c2VkIGFzIG9zMF90ICovCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgZmRfb3NfaXNfdmFsaWRfb3MwKHVpbnQ4X3QgKiBvcywgc2l6ZV90IG9zbGVuKSB7CisJLyogVGhlIG9ubHkgc2l0dWF0aW9uIHdoZXJlIGl0IGlzIG5vdCB2YWxpZCBpcyB3aGVuIGl0IGNvbnRhaW5zIGEgXDAgaW5zaWRlIHRoZSBvY3RldCBzdHJpbmcgKi8KKwlyZXR1cm4gKG1lbWNocihvcywgJ1wwJywgb3NsZW4pID09IE5VTEwpOworfQorCisvKiBUaGUgZm9sbG93aW5nIHR5cGUgZGVub3RlcyBhIHZlcmlmaWVkIERpYW1ldGVySWRlbnRpdHkgdmFsdWUgKHRoYXQgY29udGFpbnMgb25seSBwdXJlIGxldHRlcnMsIGRpZ2l0cywgaHlwaGVuLCBkb3QpICovCit0eXBlZGVmIGNoYXIgKiBEaWFtSWRfdDsKKworLyogTWF4aW11bSBsZW5ndGggb2YgYSBob3N0bmFtZSB3ZSBhY2NlcHQgKi8KKyNpZm5kZWYgSE9TVF9OQU1FX01BWAorI2RlZmluZSBIT1NUX05BTUVfTUFYIDUxMgorI2VuZGlmIC8qIEhPU1RfTkFNRV9NQVggKi8KKworLyogQ2hlY2sgaWYgYSBiaW5hcnkgc3RyaW5nIGNvbnRhaW5zIGEgdmFsaWQgRGlhbWV0ZXIgSWRlbnRpdHkgdmFsdWUuCisgIHJmYzM1ODggc3RhdGVzIGV4cGxpY2l0ZWx5IHRoYXQgc3VjaCBhIERpYW1ldGVyIElkZW50aXR5IGNvbnNpc3RzIG9ubHkgb2YgQVNDSUkgY2hhcmFjdGVycy4gKi8KK2ludCBmZF9vc19pc192YWxpZF9EaWFtZXRlcklkZW50aXR5KHVpbnQ4X3QgKiBvcywgc2l6ZV90IG9zc3opOworCisvKiBUaGUgZm9sbG93aW5nIGZ1bmN0aW9uIHZhbGlkYXRlcyBhIHN0cmluZyBhcyBhIERpYW1ldGVyIElkZW50aXR5IG9yIGFwcGxpZXMgdGhlIElETkEgdHJhbnNmb3JtYXRpb24gb24gaXQgCisgaWYgKmlub3V0c3ogaXMgIT0gMCBvbiBlbnRyeSwgKmlkIG1heSBub3QgYmUgXDAtdGVybWluYXRlZC4KKyBtZW1vcnkgaGFzIHRoZSBmb2xsb3dpbmcgbWVhbmluZzogMDogKmlkIGNhbiBiZSByZWFsbG9jJ2QuIDE6ICppZCBtdXN0IGJlIG1hbGxvYydkIG9uIG91dHB1dCAod2FzIHN0YXRpYykKKyovCitpbnQgZmRfb3NfdmFsaWRhdGVfRGlhbWV0ZXJJZGVudGl0eShjaGFyICoqIGlkLCBzaXplX3QgKiBpbm91dHN6LCBpbnQgbWVtb3J5KTsKKworLyogQ3JlYXRlIGFuIG9yZGVyIHJlbGF0aW9uc2hpcCBmb3IgYmluYXJ5IHN0cmluZ3MgKG5vdCBuZWVkZWQgdG8gYmUgXDAgdGVybWluYXRlZCkuIAorICAgSXQgZG9lcyBOT1QgbWltaWMgc3RyaW5ncyByZWxhdGlvbnNoaXBzIHNvIHRoYXQgaXQgaXMgbW9yZSBlZmZpY2llbnQuIEl0IGlzIGNhc2Ugc2Vuc2l0aXZlLgorICAgKHRoZSBzdHJpbmdzIGFyZSBhY3R1YWxseSBmaXJzdCBvcmRlcmVkIGJ5IHRoZWlyIGxlbmdoLCB0aGVuIGJ5IHRoZWlyIGJ5dGVzIGNvbnRlbnRzKQorICAgcmV0dXJuczogLTEgaWYgb3MxIDwgb3MyOyAgKzEgaWYgb3MxID4gb3MyOyAgMCBpZiB0aGV5IGFyZSBlcXVhbCAqLworaW50IGZkX29zX2NtcF9pbnQob3MwX3Qgb3MxLCBzaXplX3Qgb3Mxc3osIG9zMF90IG9zMiwgc2l6ZV90IG9zMnN6KTsKKyNkZWZpbmUgZmRfb3NfY21wKF9vMSwgX2wxLCBfbzIsIF9sMikgIGZkX29zX2NtcF9pbnQoKG9zMF90KShfbzEpLCBfbDEsIChvczBfdCkoX28yKSwgX2wyKQorCisvKiBBIHJvdWdobHkgY2FzZS1pbnNlbnNpdGl2ZSB2YXJpYW50LCB3aGljaCBhY3R1YWxseSBvbmx5IGNvbXBhcmVzIEFTQ0lJIGNoYXJzICgwLTEyNykgaW4gYSBjYXNlLWluc2VudGl0aXZlIG1hbmVlciAKKyAgLS0gaXQgZG9lcyBub3Qgc3VwcG9ydCBsb2NhbGVzIHdoZXJlIGEgbG93ZXJjYXNlIGxldHRlciB1c2VzIG1vcmUgc3BhY2UgdGhhbiB1cHBlciBjYXNlLCBzdWNoIGFzIN8gLT4gc3MKKyBJdCBpcyBzbG93ZXIgdGhhbiBmZF9vc19jbXAuCisgTm90ZSB0aGF0IHRoZSByZXN1bHQgaXMgTk9UIHRoZSBzYW1lIGFzIHN0cmNhc2VjbXAgISEhCisgCisgVGhpcyBmdW5jdGlvbiBnaXZlcyB0aGUgc2FtZSBvcmRlciBhcyBmZF9vc19jbXAsIGV4Y2VwdCB3aGVuIGl0IGZpbmRzIDIgc3RyaW5ncyB0byBiZSBlcXVhbC4KKyBIb3dldmVyIHRoaXMgaXMgbm90IGFsd2F5cyBzdWZmaWNpZW50OgorIAlmb3IgZXhhbXBsZSBmZF9vc19jbXAgZ2l2ZXM6ICJBYyIgPCAiYUIiIDwgImFhIgorCWlmIHlvdSBhdHRlbXB0IHRvIGZkX29zX2FsbW9zdGNhc2VzcmNoICJBYSIgeW91IHdpbGwgYWN0dWFsbHkgaGF2ZSB0byBnbyBwYXN0ICJhQiIgd2hpY2ggaXMgPiAiQWEiLgorCVRoZXJlZm9yZSB5b3UgY2FuIHVzZSB0aGUgbWF5YmVmdXJ0aGVyIHBhcmFtZXRlci4KKwlUaGlzIHBhcmFtZXRlciBpcyAxIG9uIHJldHVybiBpZiBvczEgbWF5IGhhdmUgYmVlbiBzdG9yZWQgZnVydGhlciB0aGF0IG9zMiAoYXNzdW1pbmcgb3MyIHZhbHVlcyBhcmUgb3JkZXJlZCBieSBmZF9vc19jbXApCisJYW5kIDAgaWYgd2UgYXJlIHN1cmUgdGhhdCBpdCBpcyBub3QgdGhlIGNhc2UuCisJV2hlbiBsb29waW5nIHRocm91Z2ggYSBsaXN0IG9mIGZkX29zX2NtcCBjbGFzc2lmaWVkIHZhbHVlcywgdGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSB1c2VkIHRvIHN0b3AgbG9vcGluZywgaW4gYWRkaXRpb24gdG8gdGhlIGNvbXAgcmVzdWx0LgorICovCitpbnQgZmRfb3NfYWxtb3N0Y2FzZXNyY2hfaW50KHVpbnQ4X3QgKiBvczEsIHNpemVfdCBvczFzeiwgdWludDhfdCAqIG9zMiwgc2l6ZV90IG9zMnN6LCBpbnQgKiBtYXliZWZ1cnRoZXIpOworI2RlZmluZSBmZF9vc19hbG1vc3RjYXNlc3JjaChfbzEsIF9sMSwgX28yLCBfbDIsIF9tYikgIGZkX29zX2FsbW9zdGNhc2VzcmNoX2ludCgob3MwX3QpKF9vMSksIF9sMSwgKG9zMF90KShfbzIpLCBfbDIsIF9tYikKKworLyogQW5hbHl6ZSBhIERpYW1ldGVyVVJJIGFuZCByZXR1cm4gaXRzIGNvbXBvbmVudHMuIAorICBSZXR1cm4gRUlOVkFMIGlmIHRoZSBVUkkgaXMgbm90IHZhbGlkLiAKKyAgKmRpYW1pZCBpcyBtYWxsb2MnZCBvbiBmdW5jdGlvbiByZXR1cm4gYW5kIG11c3QgYmUgZnJlZWQgKGl0IGlzIHByb2Nlc3NlZCBieSBmZF9vc192YWxpZGF0ZV9EaWFtZXRlcklkZW50aXR5KS4KKyAgKnNlY3VyZSBpcyAwIChubyBzZWN1cml0eSkgb3IgMSAoc2VjdXJpdHkgZW5hYmxlZCkgb24gcmV0dXJuLgorICAqcG9ydCBpcyAwIChkZWZhdWx0KSBvciBhIHZhbHVlIGluIGhvc3QgYnl0ZSBvcmRlciBvbiByZXR1cm4uCisgICp0cmFuc3BvcnQgaXMgMCAoZGVmYXVsdCkgb3IgSVBQUk9UT18qIG9uIHJldHVybi4KKyAgKnByb3RvIGlzIDAgKGRlZmF1bHQpIG9yICdkJyAoZGlhbWV0ZXIpLCAncicgKHJhZGl1cyksIG9yICd0JyAodGFjYWNzKykgb24gcmV0dXJuLgorICAqLworaW50IGZkX29zX3BhcnNlX0RpYW1ldGVyVVJJKHVpbnQ4X3QgKiB1cmksIHNpemVfdCB1cmlzeiwgRGlhbUlkX3QgKiBkaWFtaWQsIHNpemVfdCAqIGRpYW1pZGxlbiwgaW50ICogc2VjdXJlLCB1aW50MTZfdCAqIHBvcnQsIGludCAqIHRyYW5zcG9ydCwgY2hhciAqcHJvdG8pOworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgVEhSRUFEUyAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKy8qIFRlcm1pbmF0ZSBhIHRocmVhZCAqLworc3RhdGljIF9faW5saW5lX18gaW50IGZkX3Rocl90ZXJtKHB0aHJlYWRfdCAqIHRoKQoreworCXZvaWQgKiB0aF9yZXQgPSBOVUxMOworCQorCUNIRUNLX1BBUkFNUyh0aCk7CisJCisJLyogVGVzdCBpZiBpdCB3YXMgYWxyZWFkeSB0ZXJtaW5hdGVkICovCisJaWYgKCp0aCA9PSAocHRocmVhZF90KU5VTEwpCisJCXJldHVybiAwOworCQorCS8qIENhbmNlbCB0aGUgdGhyZWFkIGlmIGl0IGlzIHN0aWxsIHJ1bm5pbmcgLSBpZ25vcmUgZXJyb3IgaWYgaXQgd2FzIGFscmVhZHkgdGVybWluYXRlZCAqLworCSh2b2lkKSBwdGhyZWFkX2NhbmNlbCgqdGgpOworCQorCS8qIFRoZW4gam9pbiB0aGUgdGhyZWFkICovCisJQ0hFQ0tfUE9TSVgoIHB0aHJlYWRfam9pbigqdGgsICZ0aF9yZXQpICk7CisJCisJaWYgKHRoX3JldCA9PSBQVEhSRUFEX0NBTkNFTEVEKSB7CisJCVRSQUNFX0RFQlVHKEFOTk9ZSU5HLCAiVGhlIHRocmVhZCAlcCB3YXMgY2FuY2VsZWQiLCAodm9pZCAqKSp0aCk7CisJfSBlbHNlIHsKKwkJVFJBQ0VfREVCVUcoQ0FMTCwgIlRoZSB0aHJlYWQgJXAgcmV0dXJuZWQgJXAiLCAodm9pZCAqKSp0aCwgdGhfcmV0KTsKKwl9CisJCisJLyogQ2xlYW4gdGhlIGxvY2F0aW9uICovCisJKnRoID0gKHB0aHJlYWRfdClOVUxMOworCQorCXJldHVybiAwOworfQorCisKKy8qKioqKioqKioqKioqCisgQ2FuY2VsYXRpb24gY2xlYW51cCBoYW5kbGVycyBmb3IgY29tbW9uIG9iamVjdHMgCisgKioqKioqKioqKioqKi8KK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgZmRfY2xlYW51cF9tdXRleCggdm9pZCAqIG11dGV4ICkKK3sKKwlDSEVDS19QT1NJWF9ETyggcHRocmVhZF9tdXRleF91bmxvY2soKHB0aHJlYWRfbXV0ZXhfdCAqKW11dGV4KSwgLyogKi8pOworfQorCQkKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgZmRfY2xlYW51cF9yd2xvY2soIHZvaWQgKiByd2xvY2sgKQoreworCUNIRUNLX1BPU0lYX0RPKCBwdGhyZWFkX3J3bG9ja191bmxvY2soKHB0aHJlYWRfcndsb2NrX3QgKilyd2xvY2spLCAvKiAqLyk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgZmRfY2xlYW51cF9idWZmZXIoIHZvaWQgKiBidWZmZXIgKQoreworCWZyZWUoYnVmZmVyKTsKK30KK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgZmRfY2xlYW51cF9zb2NrZXQodm9pZCAqIHNvY2twdHIpCit7CisJaWYgKHNvY2twdHIgJiYgKCooaW50ICopc29ja3B0ciA+IDApKSB7CisJCUNIRUNLX1NZU19ETyggY2xvc2UoKihpbnQgKilzb2NrcHRyKSwgLyogaWdub3JlICovICk7CisJCSooaW50ICopc29ja3B0ciA9IC0xOworCX0KK30KKworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgTElTVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKy8qIFRoZSBmb2xsb3dpbmcgc3RydWN0dXJlIHJlcHJlc2VudHMgYSBjaGFpbmVkIGxpc3QgZWxlbWVudCAgKi8KK3N0cnVjdCBmZF9saXN0IHsKKwlzdHJ1Y3QgZmRfbGlzdCAJKm5leHQ7IC8qIG5leHQgZWxlbWVudCBpbiB0aGUgbGlzdCAqLworCXN0cnVjdCBmZF9saXN0IAkqcHJldjsgLyogcHJldmlvdXMgZWxlbWVudCBpbiB0aGUgbGlzdCAqLworCXN0cnVjdCBmZF9saXN0IAkqaGVhZDsgLyogaGVhZCBvZiB0aGUgbGlzdCAqLworCXZvaWQJCSpvOyAgICAvKiBhZGRpdGlvbmFsIHBvaW50ZXIsIHVzZWQgZm9yIGFueSBwdXJwb3NlIChleDogc3RhcnQgb2YgdGhlIHBhcmVudCBvYmplY3QpICovCit9OworCisvKiBJbml0aWFsaXplIGEgbGlzdCBlbGVtZW50ICovCisjZGVmaW5lIEZEX0xJU1RfSU5JVElBTElaRVIoIF9saXN0X25hbWUgKSBcCisJeyAubmV4dCA9ICYgX2xpc3RfbmFtZSwgLnByZXYgPSAmIF9saXN0X25hbWUsIC5oZWFkID0gJiBfbGlzdF9uYW1lLCAubyA9IE5VTEwgfQorI2RlZmluZSBGRF9MSVNUX0lOSVRJQUxJWkVSX08oIF9saXN0X25hbWUsIF9vYmogKSBcCisJeyAubmV4dCA9ICYgX2xpc3RfbmFtZSwgLnByZXYgPSAmIF9saXN0X25hbWUsIC5oZWFkID0gJiBfbGlzdF9uYW1lLCAubyA9IF9vYmogfQordm9pZCBmZF9saXN0X2luaXQgKCBzdHJ1Y3QgZmRfbGlzdCAqIGxpc3QsIHZvaWQgKiBvYmogKTsKKworLyogUmV0dXJuIGJvb2xlYW4sIHRydWUgaWYgdGhlIGxpc3QgaXMgZW1wdHkgKi8KKyNkZWZpbmUgRkRfSVNfTElTVF9FTVBUWSggX2xpc3QgKSAoKCgoc3RydWN0IGZkX2xpc3QgKikoX2xpc3QpKS0+aGVhZCA9PSAoX2xpc3QpKSAmJiAoKChzdHJ1Y3QgZmRfbGlzdCAqKShfbGlzdCkpLT5uZXh0ID09IChfbGlzdCkpKQorCisvKiBJbnNlcnQgYW4gaXRlbSBpbiBhIGxpc3QgYXQga25vd24gcG9zaXRpb24gKi8KK3ZvaWQgZmRfbGlzdF9pbnNlcnRfYWZ0ZXIgICggc3RydWN0IGZkX2xpc3QgKiByZWYsIHN0cnVjdCBmZF9saXN0ICogaXRlbSApOwordm9pZCBmZF9saXN0X2luc2VydF9iZWZvcmUgKCBzdHJ1Y3QgZmRfbGlzdCAqIHJlZiwgc3RydWN0IGZkX2xpc3QgKiBpdGVtICk7CisKKy8qIE1vdmUgYWxsIGVsZW1lbnRzIGZyb20gYSBsaXN0IGF0IHRoZSBlbmQgb2YgYW5vdGhlciAqLwordm9pZCBmZF9saXN0X21vdmVfZW5kKHN0cnVjdCBmZF9saXN0ICogcmVmLCBzdHJ1Y3QgZmRfbGlzdCAqIHNlbnRpKTsKKworLyogSW5zZXJ0IGFuIGl0ZW0gaW4gYW4gb3JkZXJlZCBsaXN0IC0tIG9yZGVyaW5nIGZ1bmN0aW9uIG11c3QgYmUgcHJvdmlkZWQuIElmIGR1cGxpY2F0ZSBvYmplY3QgZm91bmQsIEVFWElTVCBhbmQgaXQgaXMgcmV0dXJuZWQgaW4gcmVmX2R1cGxpY2F0ZSAqLworaW50IGZkX2xpc3RfaW5zZXJ0X29yZGVyZWQoIHN0cnVjdCBmZF9saXN0ICogaGVhZCwgc3RydWN0IGZkX2xpc3QgKiBpdGVtLCBpbnQgKCpjbXBfZmN0KSh2b2lkICosIHZvaWQgKiksIHZvaWQgKiogcmVmX2R1cGxpY2F0ZSk7CisKKy8qIFVubGluayBhbiBpdGVtIGZyb20gYSBsaXN0ICovCit2b2lkIGZkX2xpc3RfdW5saW5rICggc3RydWN0IGZkX2xpc3QgKiBpdGVtICk7CisKKworCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgRElDVElPTkFSWSAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworLyogU3RydWN0dXJlIHRoYXQgY29udGFpbnMgdGhlIGNvbXBsZXRlIGRpY3Rpb25hcnkgZGVmaW5pdGlvbnMgKi8KK3N0cnVjdCBkaWN0aW9uYXJ5OworCisvKiBTdHJ1Y3R1cmUgdGhhdCBjb250YWlucyBhIGRpY3Rpb25hcnkgb2JqZWN0ICovCitzdHJ1Y3QgZGljdF9vYmplY3Q7CisKKy8qIFR5cGVzIG9mIG9iamVjdCBpbiB0aGUgZGljdGlvbmFyeS4gKi8KK2VudW0gZGljdF9vYmplY3RfdHlwZSB7CisJRElDVF9WRU5ET1IJPSAxLAkvKiBWZW5kb3IgKi8KKwlESUNUX0FQUExJQ0FUSU9OLAkvKiBEaWFtZXRlciBBcHBsaWNhdGlvbiAqLworCURJQ1RfVFlQRSwJCS8qIEFWUCBkYXRhIHR5cGUgKi8KKwlESUNUX0VOVU1WQUwsCQkvKiBOYW1lZCBjb25zdGFudCAodmFsdWUgb2YgYW4gZW51bWVyYXRlZCBBVlAgdHlwZSkgKi8KKwlESUNUX0FWUCwJCS8qIEFWUCAqLworCURJQ1RfQ09NTUFORCwJCS8qIERpYW1ldGVyIENvbW1hbmQgKi8KKwlESUNUX1JVTEUJCS8qIGEgUnVsZSBmb3IgQVZQIGluIGNvbW1hbmQgb3IgZ3JvdXBlZCBBVlAgKi8KKyNkZWZpbmUgRElDVF9UWVBFX01BWAlESUNUX1JVTEUKK307CisJCisvKiBJbml0aWFsaXplIGEgZGljdGlvbmFyeSAqLworaW50IGZkX2RpY3RfaW5pdChzdHJ1Y3QgZGljdGlvbmFyeSAqKiBkaWN0KTsKKy8qIERlc3Ryb3kgYSBkaWN0aW9uYXJ5ICovCitpbnQgZmRfZGljdF9maW5pKHN0cnVjdCBkaWN0aW9uYXJ5ICoqIGRpY3QpOworCisvKgorICogRlVOQ1RJT046CWZkX2RpY3RfbmV3CisgKgorICogUEFSQU1FVEVSUzoKKyAqICBkaWN0CTogUG9pbnRlciB0byB0aGUgZGljdGlvbm5hcnkgd2hlcmUgdGhlIG9iamVjdCBpcyBjcmVhdGVkCisgKiAgdHlwZSAJOiBXaGF0IGtpbmQgb2Ygb2JqZWN0IG11c3QgYmUgY3JlYXRlZAorICogIGRhdGEgCTogcG9pbnRlciB0byB0aGUgZGF0YSBmb3IgdGhlIG9iamVjdC4gCisgKiAgICAgICAgICAJIHR5cGUgcGFyYW1ldGVyIGlzIHVzZWQgdG8gZGV0ZXJtaW5lIHRoZSB0eXBlIG9mIGRhdGEgKHNlZSBiZWxvdyBmb3IgZGV0YWlsKS4KKyAqICBwYXJlbnQgCTogYSByZWZlcmVuY2UgdG8gYSBwYXJlbnQgb2JqZWN0LCBpZiBuZWVkZWQuCisgKiAgcmVmIAk6IHVwb24gc3VjY2Vzc2Z1bCBjcmVhdGlvbiwgcmVmZXJlbmNlIHRvIG5ldyBvYmplY3QgaXMgc3RvcmVkIGhlcmUgaWYgIW51bGwuCisgKgorICogREVTQ1JJUFRJT046IAorICogIENyZWF0ZSBhIG5ldyBvYmplY3QgaW4gdGhlIGRpY3Rpb25hcnkuIAorICogIFNlZSBmb2xsb3dpbmcgb2JqZWN0IHNlY3Rpb25zIGluIHRoaXMgaGVhZGVyIGZpbGUgZm9yIG1vcmUgaW5mb3JtYXRpb24gb24gZGF0YSBhbmQgcGFyZW50IHBhcmFtZXRlcnMgZm9ybWF0LgorICoKKyAqIFJFVFVSTiBWQUxVRToKKyAqICAwICAgICAgCTogVGhlIG9iamVjdCBpcyBjcmVhdGVkIGluIHRoZSBkaWN0aW9uYXJ5LgorICogIEVJTlZBTCAJOiBBIHBhcmFtZXRlciBpcyBpbnZhbGlkLgorICogIEVFWElTVCAJOiBUaGlzIG9iamVjdCBpcyBhbHJlYWR5IGRlZmluZWQgaW4gdGhlIGRpY3Rpb25hcnkgKHdpdGggY29uZmxpY3RpbmcgZGF0YSkuIAorICogICAgICAgICAgICAgICAgSWYgInJlZiIgaXMgbm90IE5VTEwsIGl0IHBvaW50cyB0byB0aGUgZXhpc3RpbmcgZWxlbWVudCBvbiByZXR1cm4uCisgKiAgKG90aGVyIHN0YW5kYXJkIGVycm9ycyBtYXkgYmUgcmV0dXJuZWQsIHRvbywgd2l0aCB0aGVpciBzdGFuZGFyZCBtZWFuaW5nLiBFeGFtcGxlOgorICogICAgRU5PTUVNIAk6IE1lbW9yeSBhbGxvY2F0aW9uIGZvciB0aGUgbmV3IG9iamVjdCBlbGVtZW50IGZhaWxlZC4pCisgKi8KK2ludCBmZF9kaWN0X25ldyAoIHN0cnVjdCBkaWN0aW9uYXJ5ICogZGljdCwgZW51bSBkaWN0X29iamVjdF90eXBlIHR5cGUsIHZvaWQgKiBkYXRhLCBzdHJ1Y3QgZGljdF9vYmplY3QgKiBwYXJlbnQsIHN0cnVjdCBkaWN0X29iamVjdCAqKiByZWYgKTsKKworLyoKKyAqIEZVTkNUSU9OOiAJZmRfZGljdF9zZWFyY2gKKyAqCisgKiBQQVJBTUVURVJTOgorICogIGRpY3QJOiBQb2ludGVyIHRvIHRoZSBkaWN0aW9ubmFyeSB3aGVyZSB0aGUgb2JqZWN0IGlzIHNlYXJjaGVkCisgKiAgdHlwZSAJOiB0eXBlIG9mIG9iamVjdCB0aGF0IGlzIGJlaW5nIHNlYXJjaGVkCisgKiAgY3JpdGVyaWEgCTogaG93IHRoZSBvYmplY3QgbXVzdCBiZSBzZWFyY2hlZC4gU2VlIG9iamVjdC1yZWxhdGVkIHNlY3Rpb25zIGJlbG93IGZvciBtb3JlIGluZm9ybWF0aW9uLgorICogIHdoYXQgCTogZGVwZW5kaW5nIG9uIGNyaXRlcmlhLCB0aGUgZGF0YSB0aGF0IG11c3QgYmUgc2VhcmNoZWQuCisgKiAgcmVzdWx0IAk6IE9uIHN1Y2Nlc3NmdWwgcmV0dXJuLCBwb2ludGVyIHRvIHRoZSBvYmplY3QgaXMgc3RvcmVkIGhlcmUuCisgKiAgcmV0dmFsCTogdGhpcyB2YWx1ZSBpcyByZXR1cm5lZCBpZiB0aGUgb2JqZWN0IGlzIG5vdCBmb3VuZCBhbmQgcmVzdWx0IGlzIG5vdCBOVUxMLgorICoKKyAqIERFU0NSSVBUSU9OOiAKKyAqICAgUGVyZm9ybSBhIHNlYXJjaCBpbiB0aGUgZGljdGlvbmFyeS4gCisgKiAgIFNlZSB0aGUgb2JqZWN0LXNwZWNpZmljIHNlY3Rpb25zIGJlbG93IHRvIGZpbmQgaG93IHRvIGxvb2sgZm9yIGVhY2ggb2JqZWN0cy4KKyAqICAgSWYgdGhlICJyZXN1bHQiIHBhcmFtZXRlciBpcyBOVUxMLCB0aGUgZnVuY3Rpb24gaXMgdXNlZCB0byBjaGVjayBpZiBhbiBvYmplY3QgaXMgaW4gdGhlIGRpY3Rpb25hcnkuCisgKiAgIE90aGVyd2lzZSwgYSByZWZlcmVuY2UgdG8gdGhlIG9iamVjdCBpcyBzdG9yZWQgaW4gcmVzdWx0IGlmIGZvdW5kLgorICogICBJZiByZXN1bHQgaXMgbm90IE5VTEwgYW5kIHRoZSBvYmplY3QgaXMgbm90IGZvdW5kLCByZXR2YWwgaXMgcmV0dXJuZWQgKHNob3VsZCBiZSAwIG9yIEVOT0VOVCB1c3VhbGx5KQorICoKKyAqIFJFVFVSTiBWQUxVRToKKyAqICAwICAgICAgCTogVGhlIG9iamVjdCBoYXMgYmVlbiBmb3VuZCBpbiB0aGUgZGljdGlvbmFyeSwgb3IgKnJlc3VsdCBpcyBOVUxMLgorICogIEVJTlZBTCAJOiBBIHBhcmFtZXRlciBpcyBpbnZhbGlkLgorICogIEVOT0VOVAk6IE5vIG1hdGNoaW5nIG9iamVjdCBoYXMgYmVlbiBmb3VuZCwgYW5kIHJlc3VsdCB3YXMgTlVMTC4KKyAqLworaW50IGZkX2RpY3Rfc2VhcmNoICggc3RydWN0IGRpY3Rpb25hcnkgKiBkaWN0LCBlbnVtIGRpY3Rfb2JqZWN0X3R5cGUgdHlwZSwgaW50IGNyaXRlcmlhLCBjb25zdCB2b2lkICogd2hhdCwgc3RydWN0IGRpY3Rfb2JqZWN0ICoqIHJlc3VsdCwgaW50IHJldHZhbCApOworCisvKiBTcGVjaWFsIGNhc2U6IGdldCB0aGUgZ2VuZXJpYyBlcnJvciBjb21tYW5kIG9iamVjdCAqLworaW50IGZkX2RpY3RfZ2V0X2Vycm9yX2NtZChzdHJ1Y3QgZGljdGlvbmFyeSAqIGRpY3QsIHN0cnVjdCBkaWN0X29iamVjdCAqKiBvYmopOworCisvKgorICogRlVOQ1RJT046CWZkX2RpY3RfZ2V0dmFsCisgKgorICogUEFSQU1FVEVSUzoKKyAqICBvYmplY3QgCTogUG9pbnRlciB0byBhIGRpY3Rpb25hcnkgb2JqZWN0LgorICogIGRhdGEgCTogcG9pbnRlciB0byBhIHN0cnVjdHVyZSB0byBob2xkIHRoZSBkYXRhIGZvciB0aGUgb2JqZWN0LgorICogICAgICAgICAgCSAgVGhlIHR5cGUgaXMgdGhlIHNhbWUgYXMgImRhdGEiIHBhcmFtZXRlciBpbiBmZF9kaWN0X25ldyBmdW5jdGlvbi4KKyAqCisgKiBERVNDUklQVElPTjogCisgKiAgUmV0cmlldmUgY29udGVudCBvZiBhIGRpY3Rpb25hcnkgb2JqZWN0LgorICogIFNlZSBmb2xsb3dpbmcgb2JqZWN0IHNlY3Rpb25zIGluIHRoaXMgaGVhZGVyIGZpbGUgZm9yIG1vcmUgaW5mb3JtYXRpb24gb24gZGF0YSBhbmQgcGFyZW50IHBhcmFtZXRlcnMgZm9ybWF0LgorICoKKyAqIFJFVFVSTiBWQUxVRToKKyAqICAwICAgICAgCTogVGhlIGNvbnRlbnQgb2YgdGhlIG9iamVjdCBoYXMgYmVlbiByZXRyaWV2ZWQuCisgKiAgRUlOVkFMIAk6IEEgcGFyYW1ldGVyIGlzIGludmFsaWQuCisgKi8KK2ludCBmZF9kaWN0X2dldHZhbCAoIHN0cnVjdCBkaWN0X29iamVjdCAqIG9iamVjdCwgdm9pZCAqIHZhbCk7CitpbnQgZmRfZGljdF9nZXR0eXBlICggc3RydWN0IGRpY3Rfb2JqZWN0ICogb2JqZWN0LCBlbnVtIGRpY3Rfb2JqZWN0X3R5cGUgKiB0eXBlKTsKK2ludCBmZF9kaWN0X2dldGRpY3QgKCBzdHJ1Y3QgZGljdF9vYmplY3QgKiBvYmplY3QsIHN0cnVjdCBkaWN0aW9uYXJ5ICoqIGRpY3QpOworCisvKiBEZWJ1ZyBmdW5jdGlvbnMgKi8KK0RFQ0xBUkVfRkRfRFVNUF9QUk9UT1RZUEUoZmRfZGljdF9kdW1wX29iamVjdCwgc3RydWN0IGRpY3Rfb2JqZWN0ICogb2JqKTsKK0RFQ0xBUkVfRkRfRFVNUF9QUk9UT1RZUEUoZmRfZGljdF9kdW1wLCBzdHJ1Y3QgZGljdGlvbmFyeSAqIGRpY3QpOworCisvKiBGdW5jdGlvbiB0byBhY2Nlc3MgZnVsbCBjb250ZW50cyBvZiB0aGUgZGljdGlvbmFyeSwgc2VlIGRvYyBpbiBkaWN0aW9uYXJ5LmMgKi8KK2ludCBmZF9kaWN0X2dldGxpc3RvZihpbnQgY3JpdGVyaWEsIHZvaWQgKiBwYXJlbnQsIHN0cnVjdCBmZF9saXN0ICoqIHNlbnRpbmVsKTsKKworLyogRnVuY3Rpb24gdG8gcmVtb3ZlIGFuIGVudHJ5IGZyb20gdGhlIGRpY3Rpb25hcnkuCisgIFRoaXMgY2Fubm90IGJlIHVzZWQgaWYgdGhlIG9iamVjdCBoYXMgY2hpbGRyZW4gKGZvciBleGFtcGxlIGEgdmVuZG9yIHdpdGggdmVuZG9yLXNwZWNpZmljIEFWUHMpLgorICBJbiBzdWNoIGNhc2UsIHRoZSBjaGlsZHJlbiBtdXN0IGJlIHJlbW92ZWQgZmlyc3QuICovCitpbnQgZmRfZGljdF9kZWxldGUoc3RydWN0IGRpY3Rfb2JqZWN0ICogb2JqKTsKKworLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBWZW5kb3Igb2JqZWN0IAorICoKKyAqIFRoZXNlIHR5cGVzIGFyZSB1c2VkIHRvIG1hbmFnZSB2ZW5kb3JzIGluIHRoZSBkaWN0aW9uYXJ5CisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCisKKy8qIFR5cGUgdG8gaG9sZCBhIFZlbmRvciBJRDogIlNNSSBOZXR3b3JrIE1hbmFnZW1lbnQgUHJpdmF0ZSBFbnRlcnByaXNlIENvZGVzIiAoUkZDMzIzMikgKi8KK3R5cGVkZWYgdWludDMyX3QJdmVuZG9yX2lkX3Q7CisKKy8qIFR5cGUgdG8gaG9sZCBkYXRhIGFzc29jaWF0ZWQgdG8gYSB2ZW5kb3IgKi8KK3N0cnVjdCBkaWN0X3ZlbmRvcl9kYXRhIHsKKwl2ZW5kb3JfaWRfdAkgdmVuZG9yX2lkOwkvKiBJRCBvZiBhIHZlbmRvciAqLworCWNoYXIgKgkgCSB2ZW5kb3JfbmFtZTsJLyogVGhlIG5hbWUgb2YgdGhpcyB2ZW5kb3IgKi8KK307CisKKy8qIFRoZSBjcml0ZXJpYSBmb3Igc2VhcmNoaW5nIGEgdmVuZG9yIG9iamVjdCBpbiB0aGUgZGljdGlvbmFyeSAqLworZW51bSB7CisJVkVORE9SX0JZX0lEID0gMTAsCS8qICJ3aGF0IiBwb2ludHMgdG8gYSB2ZW5kb3JfaWRfdCAqLworCVZFTkRPUl9CWV9OQU1FLAkJLyogIndoYXQiIHBvaW50cyB0byBhIGNoYXIgKiAqLworCVZFTkRPUl9PRl9BUFBMSUNBVElPTiwJLyogIndoYXQiIHBvaW50cyB0byBhIHN0cnVjdCBkaWN0X29iamVjdCBjb250YWluaW5nIGFuIGFwcGxpY2F0aW9uIChzZWUgYmVsb3cpICovCisJVkVORE9SX09GX0FWUCwJCS8qICJ3aGF0IiBwb2ludHMgdG8gYSBzdHJ1Y3QgZGljdF9vYmplY3QgY29udGFpbmluZyBhbiBhdnAgKHNlZSBiZWxvdykgKi8KK307CisKKy8qKioKKyAqICBBUEkgdXNhZ2UgOgorCitOb3RlOiB0aGUgdmFsdWUgb2YgInZlbmRvcl9uYW1lIiBpcyBjb3BpZWQgd2hlbiB0aGUgb2JqZWN0IGlzIGNyZWF0ZWQsIGFuZCB0aGUgc3RyaW5nIG1heSBiZSBkaXNwb3NlZCBhZnRlcndhcmRzLgorT24gdGhlIG90aGVyIHNpZGUsIHdoZW4gdmFsdWUgaXMgcmV0cmlldmVkIHdpdGggZGljdF9nZXR2YWwsIHRoZSBzdHJpbmcgaXMgbm90IGNvcGllZCBhbmQgTVVTVCBOT1QgYmUgZnJlZWQuIEl0IHdpbGwKK2JlIGZyZWVkIGF1dG9tYXRpY2FsbHkgYWxvbmcgd2l0aCB0aGUgb2JqZWN0IGl0c2VsZiB3aXRoIGNhbGwgdG8gZGljdF9maW5pIGxhdGVyLgorIAorLSBmZF9kaWN0X25ldzoKKyBUaGUgInBhcmVudCIgcGFyYW1ldGVyIGlzIG5vdCB1c2VkIGZvciB2ZW5kb3JzLiAKKyBTYW1wbGUgY29kZSB0byBjcmVhdGUgYSB2ZW5kb3I6CisgeworCSBpbnQgcmV0OworCSBzdHJ1Y3QgZGljdF9vYmplY3QgKiBteXZlbmRvcjsKKwkgc3RydWN0IGRpY3RfdmVuZG9yX2RhdGEgbXl2ZW5kb3JkYXRhID0geyAyMzQ1NSwgIm15IHZlbmRvciBuYW1lIiB9OyAgLS0ganVzdCBhbiBleGFtcGxlLi4uCisJIHJldCA9IGZkX2RpY3RfbmV3ICggZGljdCwgRElDVF9WRU5ET1IsICZteXZlbmRvcmRhdGEsIE5VTEwsICZteXZlbmRvciApOworIH0KKworLSBmZF9kaWN0X3NlYXJjaDoKKyBTYW1wbGUgY29kZXMgdG8gbG9vayBmb3IgYSB2ZW5kb3Igb2JqZWN0LCBieSBpdHMgaWQgb3IgbmFtZToKKyB7CisJIGludCByZXQ7CisJIHN0cnVjdCBkaWN0X29iamVjdCAqIHZlbmRvcl9mb3VuZDsKKwkgdmVuZG9yX2lkX3QgdmVuZG9yaWQgPSAyMzQ1NTsKKwkgcmV0ID0gZmRfZGljdF9zZWFyY2ggKCBkaWN0LCBESUNUX1ZFTkRPUiwgVkVORE9SX0JZX0lELCAmdmVuZG9yaWQsICZ2ZW5kb3JfZm91bmQsIEVOT0VOVCk7CisJIC0gb3IgLQorCSByZXQgPSBmZF9kaWN0X3NlYXJjaCAoIGRpY3QsIERJQ1RfVkVORE9SLCBWRU5ET1JfQllfTkFNRSwgIm15IHZlbmRvciBuYW1lIiwgJnZlbmRvcl9mb3VuZCwgRU5PRU5UKTsKKyB9CisgCisgLSBmZF9kaWN0X2dldHZhbDoKKyBTYW1wbGUgY29kZSB0byByZXRyaWV2ZSB0aGUgZGF0YSBmcm9tIGEgdmVuZG9yIG9iamVjdDoKKyB7CisJIGludCByZXQ7CisJIHN0cnVjdCBkaWN0X29iamVjdCAqIG15dmVuZG9yOworCSBzdHJ1Y3QgZGljdF92ZW5kb3JfZGF0YSBteXZlbmRvcmRhdGE7CisJIHJldCA9IGZkX2RpY3Rfc2VhcmNoICggZGljdCwgRElDVF9WRU5ET1IsIFZFTkRPUl9CWV9OQU1FLCAibXkgdmVuZG9yIG5hbWUiLCAmbXl2ZW5kb3IsIEVOT0VOVCk7CisJIHJldCA9IGZkX2RpY3RfZ2V0dmFsICggbXl2ZW5kb3IsICZteXZlbmRvcmRhdGEgKTsKKwkgcHJpbnRmKCJteSB2ZW5kb3IgaWQ6ICVkXG4iLCBteXZlbmRvcmRhdGEudmVuZG9yX2lkICk7CisgfQorCQkgCisqLworCQkKKy8qIFNwZWNpYWwgZnVuY3Rpb246ICovCit1aW50MzJfdCAqIGZkX2RpY3RfZ2V0X3ZlbmRvcmlkX2xpc3Qoc3RydWN0IGRpY3Rpb25hcnkgKiBkaWN0KTsKKwkgCisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEFwcGxpY2F0aW9uIG9iamVjdCAKKyAqCisgKiBUaGVzZSB0eXBlcyBhcmUgdXNlZCB0byBtYW5hZ2UgRGlhbWV0ZXIgYXBwbGljYXRpb25zIGluIHRoZSBkaWN0aW9uYXJ5CisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCisKKy8qIFR5cGUgdG8gaG9sZCBhIERpYW1ldGVyIGFwcGxpY2F0aW9uIElEOiBJQU5BIGFzc2lnbmVkIHZhbHVlIGZvciB0aGlzIGFwcGxpY2F0aW9uLiAqLwordHlwZWRlZiB1aW50MzJfdAlhcHBsaWNhdGlvbl9pZF90OworCisvKiBUeXBlIHRvIGhvbGQgZGF0YSBhc3NvY2lhdGVkIHRvIGFuIGFwcGxpY2F0aW9uICovCitzdHJ1Y3QgZGljdF9hcHBsaWNhdGlvbl9kYXRhIHsKKwlhcHBsaWNhdGlvbl9pZF90CSBhcHBsaWNhdGlvbl9pZDsJLyogSUQgb2YgdGhlIGFwcGxpY2F0aW9uICovCisJY2hhciAqCSAJCSBhcHBsaWNhdGlvbl9uYW1lOwkvKiBUaGUgbmFtZSBvZiB0aGlzIGFwcGxpY2F0aW9uICovCit9OworCisvKiBUaGUgY3JpdGVyaWEgZm9yIHNlYXJjaGluZyBhbiBhcHBsaWNhdGlvbiBvYmplY3QgaW4gdGhlIGRpY3Rpb25hcnkgKi8KK2VudW0geworCUFQUExJQ0FUSU9OX0JZX0lEID0gMjAsCQkvKiAid2hhdCIgcG9pbnRzIHRvIGEgYXBwbGljYXRpb25faWRfdCAqLworCUFQUExJQ0FUSU9OX0JZX05BTUUsCQkvKiAid2hhdCIgcG9pbnRzIHRvIGEgY2hhciAqICovCisJQVBQTElDQVRJT05fT0ZfVFlQRSwJCS8qICJ3aGF0IiBwb2ludHMgdG8gYSBzdHJ1Y3QgZGljdF9vYmplY3QgY29udGFpbmluZyBhIHR5cGUgb2JqZWN0IChzZWUgYmVsb3cpICovCisJQVBQTElDQVRJT05fT0ZfQ09NTUFORAkJLyogIndoYXQiIHBvaW50cyB0byBhIHN0cnVjdCBkaWN0X29iamVjdCBjb250YWluaW5nIGEgY29tbWFuZCAoc2VlIGJlbG93KSAqLworfTsKKworLyoqKgorICogIEFQSSB1c2FnZSA6CisKK1RoZSAicGFyZW50IiBwYXJhbWV0ZXIgb2YgZGljdF9uZXcgbWF5IHBvaW50IHRvIGEgdmVuZG9yIG9iamVjdCB0byBpbmZvcm0gb2Ygd2hhdCB2ZW5kb3IgZGVmaW5lcyB0aGUgYXBwbGljYXRpb24uCitmb3Igc3RhbmRhcmQtdHJhY2sgYXBwbGljYXRpb25zLCB0aGUgInBhcmVudCIgcGFyYW1ldGVyIHNob3VsZCBiZSBOVUxMLgorVGhlIHZlbmRvciBhc3NvY2lhdGVkIHRvIGFuIGFwcGxpY2F0aW9uIGlzIHJldHJpZXZlZCB3aXRoIFZFTkRPUl9PRl9BUFBMSUNBVElPTiBzZWFyY2ggY3JpdGVyaWEgb24gdmVuZG9ycy4KKworLSBmZF9kaWN0X25ldzoKKyBTYW1wbGUgY29kZSBmb3IgYXBwbGljYXRpb24gY3JlYXRpb246CisgeworCSBpbnQgcmV0OworCSBzdHJ1Y3QgZGljdF9vYmplY3QgKiB2ZW5kb3I7CisJIHN0cnVjdCBkaWN0X29iamVjdCAqIGFwcGw7CisJIHN0cnVjdCBkaWN0X3ZlbmRvcl9kYXRhIHZlbmRvcl9kYXRhID0geworCQkgMjM0NTUsCisJCSAibXkgdmVuZG9yIG5hbWUiCisJIH07CisJIHN0cnVjdCBkaWN0X2FwcGxpY2F0aW9uX2RhdGEgYXBwX2RhdGEgPSB7CisJCSA5Nzg5LAorCQkgIm15IHZlbmRvcidzIGFwcGxpY2F0aW9uIgorCSB9OworCQorCSByZXQgPSBmZF9kaWN0X25ldyAoIGRpY3QsIERJQ1RfVkVORE9SLCAmdmVuZG9yX2RhdGEsIE5VTEwsICZ2ZW5kb3IgKTsKKwkgcmV0ID0gZmRfZGljdF9uZXcgKCBkaWN0LCBESUNUX0FQUExJQ0FUSU9OLCAmYXBwX2RhdGEsIHZlbmRvciwgJmFwcGwgKTsKKyB9CisKKy0gZmRfZGljdF9zZWFyY2g6CisgU2FtcGxlIGNvZGUgdG8gcmV0cmlldmUgdGhlIHZlbmRvciBvZiBhbiBhcHBsaWNhdGlvbgorIHsKKwkgaW50IHJldDsKKwkgc3RydWN0IGRpY3Rfb2JqZWN0ICogdmVuZG9yLCAqIGFwcGxpOworCSAKKwkgcmV0ID0gZmRfZGljdF9zZWFyY2ggKCBkaWN0LCBESUNUX0FQUExJQ0FUSU9OLCBBUFBMSUNBVElPTl9CWV9OQU1FLCAibXkgdmVuZG9yJ3MgYXBwbGljYXRpb24iLCAmYXBwbGksIEVOT0VOVCk7CisJIHJldCA9IGZkX2RpY3Rfc2VhcmNoICggZGljdCwgRElDVF9WRU5ET1IsIFZFTkRPUl9PRl9BUFBMSUNBVElPTiwgYXBwbGksICZ2ZW5kb3IsIEVOT0VOVCk7CisgfQorIAorIC0gZmRfZGljdF9nZXR2YWw6CisgU2FtcGxlIGNvZGUgdG8gcmV0cmlldmUgdGhlIGRhdGEgZnJvbSBhbiBhcHBsaWNhdGlvbiBvYmplY3Q6CisgeworCSBpbnQgcmV0OworCSBzdHJ1Y3QgZGljdF9vYmplY3QgKiBhcHBsaTsKKwkgc3RydWN0IGRpY3RfYXBwbGljYXRpb25fZGF0YSBhcHBsX2RhdGE7CisJIHJldCA9IGZkX2RpY3Rfc2VhcmNoICggZGljdCwgRElDVF9BUFBMSUNBVElPTiwgQVBQTElDQVRJT05fQllfTkFNRSwgIm15IHZlbmRvcidzIGFwcGxpY2F0aW9uIiwgJmFwcGxpLCBFTk9FTlQpOworCSByZXQgPSBmZF9kaWN0X2dldHZhbCAoIGFwcGxpLCAmYXBwbF9kYXRhICk7CisJIHByaW50ZigibXkgYXBwbGljYXRpb24gaWQ6ICVzXG4iLCBhcHBsX2RhdGEuYXBwbGljYXRpb25faWQgKTsKKyB9CisKKyovCisKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogVHlwZSBvYmplY3QgCisgKgorICogVGhlc2UgdHlwZXMgYXJlIHVzZWQgdG8gbWFuYWdlIEFWUCBkYXRhIHR5cGVzIGluIHRoZSBkaWN0aW9uYXJ5CisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCisKKy8qIFR5cGUgdG8gc3RvcmUgYW55IEFWUCB2YWx1ZSAqLyAKK3VuaW9uIGF2cF92YWx1ZSB7CisJc3RydWN0IHsKKwkJdWludDhfdCAqZGF0YTsJLyogYnl0ZXMgYnVmZmVyICovCisJCXNpemVfdCAgIGxlbjsJLyogbGVuZ3RoIG9mIHRoZSBkYXRhIGJ1ZmZlciAqLworCX0gICAgICAgICAgIG9zOwkJLyogU3RvcmFnZSBmb3IgYW4gb2N0ZXQgc3RyaW5nICovCisJaW50MzJfdCAgICAgaTMyOwkvKiBpbnRlZ2VyIDMyICovCisJaW50NjRfdCAgICAgaTY0OwkvKiBpbnRlZ2VyIDY0ICovCisJdWludDMyX3QgICAgdTMyOwkvKiB1bnNpZ25lZCAzMiAqLworCXVpbnQ2NF90ICAgIHU2NDsJLyogdW5zaWduZWQgNjQgKi8KKwlmbG9hdCAgICAgICBmMzI7CS8qIGZsb2F0IDMyICovCisJZG91YmxlIAkgICAgZjY0OwkvKiBmbG9hdCA2NCAqLworfTsKKworLyogVGhlc2UgYXJlIHRoZSBiYXNpYyBBVlAgdHlwZXMgZGVmaW5lZCBpbiBSRkMzNTg4YmlzICovCitlbnVtIGRpY3RfYXZwX2Jhc2V0eXBlIHsKKwlBVlBfVFlQRV9HUk9VUEVELAorCUFWUF9UWVBFX09DVEVUU1RSSU5HLAorCUFWUF9UWVBFX0lOVEVHRVIzMiwKKwlBVlBfVFlQRV9JTlRFR0VSNjQsCisJQVZQX1RZUEVfVU5TSUdORUQzMiwKKwlBVlBfVFlQRV9VTlNJR05FRDY0LAorCUFWUF9UWVBFX0ZMT0FUMzIsCisJQVZQX1RZUEVfRkxPQVQ2NAorI2RlZmluZSBBVlBfVFlQRV9NQVggQVZQX1RZUEVfRkxPQVQ2NAorfTsKKworLyogQ2FsbGJhY2tzIHRoYXQgY2FuIGJlIGFzc29jaWF0ZWQgd2l0aCBhIGRlcml2ZWQgdHlwZSB0byBlYXNpbHkgaW50ZXJwcmV0IHRoZSBBVlAgdmFsdWUuICovCisvKgorICogQ0FMTEJBQ0s6CWRpY3RfYXZwZGF0YV9pbnRlcnByZXQKKyAqCisgKiBQQVJBTUVURVJTOgorICogICB2YWwgICAgICAgICA6IFBvaW50ZXIgdG8gdGhlIEFWUCB2YWx1ZSB0aGF0IG11c3QgYmUgaW50ZXJwcmV0ZWQuCisgKiAgIGludGVycHJldGVkIDogVGhlIHJlc3VsdCBvZiBpbnRlcnByZXRhdGlvbiBpcyBzdG9yZWQgaGVyZS4gVGhlIGZvcm1hdCBhbmQgbWVhbmluZyBkZXBlbmRzIG9uIGVhY2ggdHlwZS4KKyAqCisgKiBERVNDUklQVElPTjogCisgKiAgIFRoaXMgY2FsbGJhY2sgY2FuIGJlIHByb3ZpZGVkIHdpdGggYSBkZXJpdmVkIHR5cGUgaW4gb3JkZXIgdG8gZmFjaWxpdGF0ZSB0aGUgaW50ZXJwcmV0YXRpb24gb2YgZm9ybWF0ZWQgZGF0YS4KKyAqICBGb3IgZXhhbXBsZSwgd2hlbiBhbiBBVlAgb2YgdHlwZSAiQWRkcmVzcyIgaXMgcmVjZWl2ZWQsIGl0IGNhbiBiZSB1c2VkIHRvIGNvbnZlcnQgdGhlIG9jdGV0c3RyaW5nIGludG8gYSBzdHJ1Y3Qgc29ja2FkZHIuCisgKiAgVGhpcyBjYWxsYmFjayBpcyBub3QgY2FsbGVkIGRpcmVjdGx5LCBidXQgdGhyb3VnaCB0aGUgbWVzc2FnZSdzIEFQSSBtc2dfYXZwX3ZhbHVlX2ludGVycHJldCBmdW5jdGlvbi4KKyAqCisgKiBSRVRVUk4gVkFMVUU6CisgKiAgMCAgICAgIAk6IE9wZXJhdGlvbiBjb21wbGV0ZS4KKyAqICAhMCAJCTogQW4gZXJyb3Igb2NjdXJyZWQsIHRoZSBlcnJvciBjb2RlIGlzIHJldHVybmVkLgorICovCit0eXBlZGVmIGludCAoKmRpY3RfYXZwZGF0YV9pbnRlcnByZXQpICh1bmlvbiBhdnBfdmFsdWUgKiB2YWx1ZSwgdm9pZCAqIGludGVycHJldGVkKTsKKy8qCisgKiBDQUxMQkFDSzoJZGljdF9hdnBkYXRhX2VuY29kZQorICoKKyAqIFBBUkFNRVRFUlM6CisgKiAgIGRhdGEJOiBUaGUgZm9ybWF0ZWQgZGF0YSB0aGF0IG11c3QgYmUgc3RvcmVkIGluIHRoZSBBVlAgdmFsdWUuCisgKiAgIHZhbAk6IFBvaW50ZXIgdG8gdGhlIEFWUCB2YWx1ZSBzdG9yYWdlIGFyZWEgd2hlcmUgdGhlIGRhdGEgbXVzdCBiZSBzdG9yZWQuCisgKgorICogREVTQ1JJUFRJT046IAorICogICBUaGlzIGNhbGxiYWNrIGNhbiBiZSBwcm92aWRlZCB3aXRoIGEgZGVyaXZlZCB0eXBlIGluIG9yZGVyIHRvIGZhY2lsaXRhdGUgdGhlIGVuY29kaW5nIG9mIGZvcm1hdGVkIGRhdGEuCisgKiAgRm9yIGV4YW1wbGUsIGl0IGNhbiBiZSB1c2VkIHRvIGNvbnZlcnQgYSBzdHJ1Y3Qgc29ja2FkZHIgaW4gYW4gQVZQIHZhbHVlIG9mIHR5cGUgQWRkcmVzcy4KKyAqICBUaGlzIGNhbGxiYWNrIGlzIG5vdCBjYWxsZWQgZGlyZWN0bHksIGJ1dCB0aHJvdWdoIHRoZSBtZXNzYWdlJ3MgQVBJIG1zZ19hdnBfdmFsdWVfZW5jb2RlIGZ1bmN0aW9uLgorICogIElmIHRoZSBjYWxsYmFjayBpcyBkZWZpbmVkIGZvciBhbiBPY3RldFN0cmluZyBiYXNlZCB0eXBlLCB0aGUgY3JlYXRlZCBzdHJpbmcgbXVzdCBiZSBtYWxsb2MnZC4gZnJlZSB3aWxsIGJlIGNhbGxlZCAKKyAqICBhdXRvbWF0aWNhbGx5IGxhdGVyLgorICoKKyAqIFJFVFVSTiBWQUxVRToKKyAqICAwICAgICAgCTogT3BlcmF0aW9uIGNvbXBsZXRlLgorICogICEwIAkJOiBBbiBlcnJvciBvY2N1cnJlZCwgdGhlIGVycm9yIGNvZGUgaXMgcmV0dXJuZWQuCisgKi8KK3R5cGVkZWYgaW50ICgqZGljdF9hdnBkYXRhX2VuY29kZSkgKHZvaWQgKiBkYXRhLCB1bmlvbiBhdnBfdmFsdWUgKiB2YWwpOworCisvKgorICogQ0FMTEJBQ0s6CWRpY3RfYXZwZGF0YV9jaGVjaworICoKKyAqIFBBUkFNRVRFUlM6CisgKiAgIHZhbAk6IFBvaW50ZXIgdG8gdGhlIEFWUCB2YWx1ZSB0aGF0IHdhcyByZWNlaXZlZCBhbmQgbmVlZHMgdG8gYmUgc2FuaXR5IGNoZWNrZWQuCisgKiAgIGRhdGEgICAgICA6IGEgcGFyYW1ldGVyIHN0b3JlZCBpbiB0aGUgdHlwZSBzdHJ1Y3R1cmUgKHRvIGVuYWJsZSBtb3JlIGdlbmVyaWMgY2hlY2sgZnVuY3Rpb25zKQorICogICBlcnJvcl9tc2c6IHVwb24gZXJyb25lb3VzIHZhbHVlLCBhIHN0cmluZyBkZXNjcmliaW5nIHRoZSBlcnJvciBjYW4gYmUgcmV0dXJuZWQgaGVyZSAoaXQgd2lsbCBiZSBzdHJjcHkgYnkgY2FsbGVyKS4gVGhpcyBkZXNjcmlwdGlvbiB3aWxsIGJlIHJldHVybmVkIGluIHRoZSBlcnJvciBtZXNzYWdlLCBpZiBhbnkuIAorICoKKyAqIERFU0NSSVBUSU9OOiAKKyAqICAgVGhpcyBjYWxsYmFjayBjYW4gYmUgcHJvdmlkZWQgd2l0aCBhIGRlcml2ZWQgdHlwZSBpbiBvcmRlciB0byBpbXByb3ZlIHRoZSBvcGVyYXRpb24gb2YgdGhlCisgKiAgZmRfbXNnX3BhcnNlX2RpY3QgZnVuY3Rpb24uIFdoZW4gdGhpcyBjYWxsYmFjayBpcyBwcmVzZW50LCB0aGUgdmFsdWUgb2YgdGhlIEFWUCB0aGF0IGhhcworICogYmVlbiBwYXJzZWQgaXMgcGFzc2VkIHRvIHRoaXMgZnVuY3Rpb24gZm9yIGZpbmVyIGdyYW51bGFyaXR5IGNoZWNrLiBGb3IgZXhhbXBsZSBmb3Igc29tZSAKKyAqIHNwZWNjaWZpYyBBVlAsIHRoZSBmb3JtYXQgb2YgYW4gT0NURVRTVFJJTkcgdmFsdWUgY2FuIGJlIGZ1cnRoZXIgY2hlY2tlZCwgb3IgdGhlCisgKiBpbnRlcmdlciB2YWx1ZSBjYW4gYmUgdmVyaWZpZWQuCisgKgorICogUkVUVVJOIFZBTFVFOgorICogIDAgICAgICAJOiBUaGUgdmFsdWUgaXMgdmFsaWQuCisgKiAgITAgICAgICAgICAgOiBBbiBlcnJvciBvY2N1cnJlZCwgdGhlIGVycm9yIGNvZGUgaXMgcmV0dXJuZWQuIEl0IGlzIGFkdmlzZWQgdG8gcmV0dXJuIEVJTlZBTCBvbiBpbmNvcnJlY3QgdmFsCisgKi8KK3R5cGVkZWYgaW50ICgqZGljdF9hdnBkYXRhX2NoZWNrKSAodm9pZCAqIGRhdGEsIHVuaW9uIGF2cF92YWx1ZSAqIHZhbCwgY2hhciAqKiBlcnJvcl9tc2cpOworCisKKworLyogVHlwZSB0byBob2xkIGRhdGEgYXNzb2NpYXRlZCB0byBhIGRlcml2ZWQgQVZQIGRhdGEgdHlwZSAqLworc3RydWN0IGRpY3RfdHlwZV9kYXRhIHsKKwllbnVtIGRpY3RfYXZwX2Jhc2V0eXBlCSB0eXBlX2Jhc2U7CS8qIEhvdyB0aGUgZGF0YSBvZiBzdWNoIEFWUCBtdXN0IGJlIGludGVycHJldGVkICovCisJY2hhciAqCSAJCSB0eXBlX25hbWU7CS8qIFRoZSBuYW1lIG9mIHRoaXMgdHlwZSAqLworCWRpY3RfYXZwZGF0YV9pbnRlcnByZXQJIHR5cGVfaW50ZXJwcmV0Oy8qIGNiIHRvIGNvbnZlcnQgdGhlIEFWUCB2YWx1ZSBpbiBtb3JlIGNvbXByZWhlbnNpdmUgZm9ybWF0IChvciBOVUxMKSAqLworCWRpY3RfYXZwZGF0YV9lbmNvZGUJIHR5cGVfZW5jb2RlOwkvKiBjYiB0byBjb252ZXJ0IGZvcm1hdHRlZCBkYXRhIGludG8gYW4gQVZQIHZhbHVlIChvciBOVUxMKSAqLworCURFQ0xBUkVfRkRfRFVNUF9QUk9UT1RZUEUoKCp0eXBlX2R1bXApLCB1bmlvbiBhdnBfdmFsdWUgKiB2YWwpOyAvKiBjYiBjYWxsZWQgYnkgZmRfbXNnX2R1bXBfKiBmb3IgdGhpcyB0eXBlIG9mIGRhdGEgKGlmICE9IE5VTEwpLiBSZXR1cm5lZCBzdHJpbmcgbXVzdCBiZSBmcmVlZC4gICovCisJZGljdF9hdnBkYXRhX2NoZWNrICAgICAgIHR5cGVfY2hlY2s7CisJdm9pZCAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZV9jaGVja19wYXJhbTsKK307CisKKy8qIFRoZSBjcml0ZXJpYSBmb3Igc2VhcmNoaW5nIGEgdHlwZSBvYmplY3QgaW4gdGhlIGRpY3Rpb25hcnkgKi8KK2VudW0geworCVRZUEVfQllfTkFNRSA9IDMwLAkJLyogIndoYXQiIHBvaW50cyB0byBhIGNoYXIgKiAqLworCVRZUEVfT0ZfRU5VTVZBTCwJCS8qICJ3aGF0IiBwb2ludHMgdG8gYSBzdHJ1Y3QgZGljdF9vYmplY3QgY29udGFpbmluZyBhbiBlbnVtZXJhdGVkIGNvbnN0YW50IChESUNUX0VOVU1WQUwsIHNlZSBiZWxvdykuICovCisJVFlQRV9PRl9BVlAJCQkvKiAid2hhdCIgcG9pbnRzIHRvIGEgc3RydWN0IGRpY3Rfb2JqZWN0IGNvbnRhaW5pbmcgYW4gQVZQIG9iamVjdC4gKi8KK307CisKKy8qKioqCisgQ2FsbGJhY2tzIGRlZmluZWQgaW4gbGliZmRwcm90by9kaWN0aW9uYXJ5X2Z1bmN0aW9ucy5jIGZpbGUgLS0gc2VlIHRoYXQgZmlsZSBmb3IgdXNhZ2UuIAorICovCisKKy8qIENvbnZlcnQgYW4gQWRkcmVzcyB0eXBlIEFWUCBpbnRvIGEgc3RydWN0IHNvY2thZGRyX3N0b3JhZ2UgKi8KK2ludCBmZF9kaWN0ZmN0X0FkZHJlc3NfZW5jb2RlKHZvaWQgKiBkYXRhLCB1bmlvbiBhdnBfdmFsdWUgKiBhdnBfdmFsdWUpOworaW50IGZkX2RpY3RmY3RfQWRkcmVzc19pbnRlcnByZXQodW5pb24gYXZwX3ZhbHVlICogYXZwX3ZhbHVlLCB2b2lkICogaW50ZXJwcmV0ZWQpOworREVDTEFSRV9GRF9EVU1QX1BST1RPVFlQRShmZF9kaWN0ZmN0X0FkZHJlc3NfZHVtcCwgdW5pb24gYXZwX3ZhbHVlICogYXZwX3ZhbHVlKTsKKworLyogRGlzcGxheSB0aGUgY29udGVudCBvZiBhbiBBVlAgb2YgdHlwZSBVVEY4U3RyaW5nIGluIHRoZSBsb2cgZmlsZSAqLworREVDTEFSRV9GRF9EVU1QX1BST1RPVFlQRShmZF9kaWN0ZmN0X1VURjhTdHJpbmdfZHVtcCwgdW5pb24gYXZwX3ZhbHVlICogYXZwX3ZhbHVlKTsKKworLyogRm9yIFRpbWUgQVZQcywgbWFwIHdpdGggdGltZV90IHZhbHVlIGRpcmVjdGx5ICovCitpbnQgZmRfZGljdGZjdF9UaW1lX2VuY29kZSh2b2lkICogZGF0YSwgdW5pb24gYXZwX3ZhbHVlICogYXZwX3ZhbHVlKTsKK2ludCBmZF9kaWN0ZmN0X1RpbWVfaW50ZXJwcmV0KHVuaW9uIGF2cF92YWx1ZSAqIGF2cF92YWx1ZSwgdm9pZCAqIGludGVycHJldGVkKTsKK0RFQ0xBUkVfRkRfRFVNUF9QUk9UT1RZUEUoZmRfZGljdGZjdF9UaW1lX2R1bXAsIHVuaW9uIGF2cF92YWx1ZSAqIGF2cF92YWx1ZSk7CisKKworLyogRm9yIHN0cmluZyBBVlAsIHRoZSBmb2xsb3dpbmcgdHlwZV9jaGVjayBmdW5jdGlvbiBwcm92aWRlcyBzaW1wbGUgYmFzaWMgY2hlY2sgZm9yIHNwZWNpZmljIGNoYXJhY3RlcnMgcHJlc2VuY2UsIGUuZy4gdXNlICJALiIgZm9yIHRyaXZpYWwgZW1haWwgYWRkcmVzcyBjaGVjayAqLworaW50IGZkX2RpY3RmY3RfQ2hhckluT1NfY2hlY2sodm9pZCAqIGRhdGEsIHVuaW9uIGF2cF92YWx1ZSAqIHZhbCwgY2hhciAqKiBlcnJvcl9tc2cpOworCisKKy8qKioqLworCisvKioqCisgKiAgQVBJIHVzYWdlIDoKKworLSBmZF9kaWN0X25ldzoKKyBUaGUgInBhcmVudCIgcGFyYW1ldGVyIG1heSBwb2ludCB0byBhbiBhcHBsaWNhdGlvbiBvYmplY3QsIHdoZW4gYSB0eXBlIGlzIGRlZmluZWQgYnkgYSBEaWFtZXRlciBhcHBsaWNhdGlvbi4gCisgCisgU2FtcGxlIGNvZGU6CisgeworCSBpbnQgcmV0OworCSBzdHJ1Y3QgZGljdF9vYmplY3QgKiBteXR5cGU7CisJIHN0cnVjdCBkaWN0X3R5cGVfZGF0YSBteXR5cGVkYXRhID0gCisJCXsgCisJCSBBVlBfVFlQRV9PQ1RFVFNUUklORywKKwkJICJBZGRyZXNzIiwKKwkJIE5VTEwsCisJCSBOVUxMCisJCX07CisJIHJldCA9IGZkX2RpY3RfbmV3ICggZGljdCwgRElDVF9UWVBFLCAmbXl0eXBlZGF0YSwgTlVMTCwgJm15dHlwZSApOworIH0KKworLSBmZF9kaWN0X3NlYXJjaDoKKyBTYW1wbGUgY29kZToKKyB7CisJIGludCByZXQ7CisJIHN0cnVjdCBkaWN0X29iamVjdCAqIGFkZHJlc3NfdHlwZTsKKwkgcmV0ID0gZmRfZGljdF9zZWFyY2ggKCBkaWN0LCBESUNUX1RZUEUsIFRZUEVfQllfTkFNRSwgIkFkZHJlc3MiLCAmYWRkcmVzc190eXBlLCBFTk9FTlQpOworIH0KKyAKKyovCisKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRW51bWVyYXRlZCB2YWx1ZXMgb2JqZWN0IAorICoKKyAqIFRoZXNlIHR5cGVzIGFyZSB1c2VkIHRvIG1hbmFnZSBuYW1lZCBjb25zdGFudHMgb2Ygc29tZSBBVlAsCisgKiBmb3IgZW51bWVyYXRlZCB0eXBlcy4gZnJlZURpYW1ldGVyIGFsbG93cyBjb25zdGFudHMgZm9yIHR5cGVzIG90aGVycyB0aGFuIFVuc2lnbmVkMzIKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KKworLyogVHlwZSB0byBob2xkIGRhdGEgb2YgbmFtZWQgY29uc3RhbnRzIGZvciBBVlAgKi8KK3N0cnVjdCBkaWN0X2VudW12YWxfZGF0YSB7CisJY2hhciAqCSAJIGVudW1fbmFtZTsJLyogVGhlIG5hbWUgb2YgdGhpcyBjb25zdGFudCAqLworCXVuaW9uIGF2cF92YWx1ZSAgZW51bV92YWx1ZTsJLyogVmFsdWUgb2YgdGhlIGNvbnN0YW50LiBVbmlvbiB0ZXJtIGRlcGVuZHMgb24gcGFyZW50IHR5cGUncyBiYXNlIHR5cGUuICovCit9OworCisvKiBUaGUgY3JpdGVyaWEgZm9yIHNlYXJjaGluZyBhIGNvbnN0YW50IGluIHRoZSBkaWN0aW9uYXJ5ICovCitlbnVtIHsKKwlFTlVNVkFMX0JZX1NUUlVDVCA9IDQwLAkvKiAid2hhdCIgcG9pbnRzIHRvIGEgc3RydWN0IGRpY3RfZW51bXZhbF9yZXF1ZXN0IGFzIGRlZmluZWQgYmVsb3cgKi8KKwlFTlVNVkFMX0JZX05BTUUsCS8qIFRoaXMgY2Fubm90IGJlIHVzZWQgZm9yIHJlc2VhcmNoZXMgKi8KKwlFTlVNVkFMX0JZX1ZBTFVFCS8qIFRoaXMgY2Fubm90IGJlIHVzZWQgZm9yIHJlc2VhcmNoZXMgKi8KK307CisKK3N0cnVjdCBkaWN0X2VudW12YWxfcmVxdWVzdCB7CisJLyogSWRlbnRpZmllciBvZiB0aGUgcGFyZW50IHR5cGUsIG9uZSBvZiB0aGUgZm9sbG93aW5nIG11c3Qgbm90IGJlIE5VTEwgKi8KKwlzdHJ1Y3QgZGljdF9vYmplY3QJKnR5cGVfb2JqOworCWNoYXIgKgkJCSB0eXBlX25hbWU7CisJCisJLyogU2VhcmNoIGNyaXRlcmlhIGZvciB0aGUgY29uc3RhbnQgKi8KKwlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgc2VhcmNoOyAvKiBzZWFyY2guZW51bV92YWx1ZSBpcyB1c2VkIG9ubHkgaWYgc2VhcmNoLmVudW1fbmFtZSA9PSBOVUxMICovCit9OworCisvKioqCisgKiAgQVBJIHVzYWdlIDoKKworLSBmZF9kaWN0X25ldzoKKyBUaGUgInBhcmVudCIgcGFyYW1ldGVyIG11c3QgcG9pbnQgdG8gYSBkZXJpdmVkIHR5cGUgb2JqZWN0LiAKKyBTYW1wbGUgY29kZSB0byBjcmVhdGUgYSB0eXBlICJCb29sZWFuIiB3aXRoIHR3byBjb25zdGFudHMgIlRydWUiIGFuZCAiRmFsc2UiOgorIHsKKwkgaW50IHJldDsKKwkgc3RydWN0IGRpY3Rfb2JqZWN0ICogdHlwZV9ib29sZWFuOworCSBzdHJ1Y3QgZGljdF90eXBlX2RhdGEgdHlwZV9ib29sZWFuX2RhdGEgPSAKKwkJeyAKKwkJIEFWUF9UWVBFX0lOVEVHRVIzMiwKKwkJICJCb29sZWFuIiwKKwkJIE5VTEwsCisJCSBOVUxMCisJCX07CisJIHN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSBib29sZWFuX2ZhbHNlID0KKwkgCXsKKwkJIC5lbnVtX25hbWU9IkZhbHNlIiwKKwkJIC5lbnVtX3ZhbHVlLmkzMiA9IDAKKwkgCX07CisJIHN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSBib29sZWFuX3RydWUgPQorCSAJeworCQkgLmVudW1fbmFtZT0iVHJ1ZSIsCisJCSAuZW51bV92YWx1ZS5pMzIgPSAtMQorCSAJfTsKKwkgcmV0ID0gZmRfZGljdF9uZXcgKCBkaWN0LCBESUNUX1RZUEUsICZ0eXBlX2Jvb2xlYW5fZGF0YSwgTlVMTCwgJnR5cGVfYm9vbGVhbiApOworCSByZXQgPSBmZF9kaWN0X25ldyAoIGRpY3QsIERJQ1RfRU5VTVZBTCwgJmJvb2xlYW5fZmFsc2UsIHR5cGVfYm9vbGVhbiwgTlVMTCApOworCSByZXQgPSBmZF9kaWN0X25ldyAoIGRpY3QsIERJQ1RfRU5VTVZBTCwgJmJvb2xlYW5fdHJ1ZSAsIHR5cGVfYm9vbGVhbiwgTlVMTCApOworCSAKKyB9CisKKy0gZmRfZGljdF9zZWFyY2g6CisgU2FtcGxlIGNvZGUgdG8gbG9vayBmb3IgYSBjb25zdGFudCBuYW1lLCBieSBpdHMgdmFsdWU6CisgeworCSBpbnQgcmV0OworCSBzdHJ1Y3QgZGljdF9vYmplY3QgKiB2YWx1ZV9mb3VuZDsKKwkgc3RydWN0IGRpY3RfZW51bXZhbF9yZXF1ZXN0IGJvb2xlYW5fYnlfdmFsdWUgPQorCSAJeworCQkgLnR5cGVfbmFtZSA9ICJCb29sZWFuIiwKKwkJIC5zZWFyY2guZW51bV9uYW1lPU5VTEwsCisJCSAuc2VhcmNoLmVudW1fdmFsdWUuaTMyID0gLTEKKwkgCX07CisJIAorCSByZXQgPSBmZF9kaWN0X3NlYXJjaCAoIGRpY3QsIERJQ1RfRU5VTVZBTCwgRU5VTVZBTF9CWV9TVFJVQ1QsICZib29sZWFuX2J5X3ZhbHVlLCAmdmFsdWVfZm91bmQsIEVOT0VOVCk7CisgfQorIAorIC0gZmRfZGljdF9nZXR2YWw6CisgU2FtcGxlIGNvZGUgdG8gcmV0cmlldmUgdGhlIGRhdGEgZnJvbSBhIGNvbnN0YW50IG9iamVjdDoKKyB7CisJIGludCByZXQ7CisJIHN0cnVjdCBkaWN0X29iamVjdCAqIHZhbHVlX2ZvdW5kOworCSBzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgYm9vbGVhbl9kYXRhID0gTlVMTDsKKwkgc3RydWN0IGRpY3RfZW51bXZhbF9yZXF1ZXN0IGJvb2xlYW5fYnlfdmFsdWUgPQorCSAJeworCQkgLnR5cGVfbmFtZSA9ICJCb29sZWFuIiwKKwkJIC5zZWFyY2guZW51bV9uYW1lPU5VTEwsCisJCSAuc2VhcmNoLmVudW1fdmFsdWUuaTMyID0gMAorCSAJfTsKKwkgCisJIHJldCA9IGZkX2RpY3Rfc2VhcmNoICggZGljdCwgRElDVF9FTlVNVkFMLCBFTlVNVkFMX0JZX1NUUlVDVCwgJmJvb2xlYW5fYnlfdmFsdWUsICZ2YWx1ZV9mb3VuZCwgRU5PRU5UKTsKKwkgcmV0ID0gZmRfZGljdF9nZXR2YWwgKCB2YWx1ZV9mb3VuZCwgJmJvb2xlYW5fZGF0YSApOworCSBwcmludGYoIiBCb29sZWFuIHdpdGggdmFsdWUgMDogJXMiLCBib29sZWFuX2RhdGEuZW51bV9uYW1lICk7CisgfQorKi8KKwkgCisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEFWUCBvYmplY3QgCisgKgorICogVGhlc2Ugb2JqZWN0cyBhcmUgdXNlZCB0byBtYW5hZ2UgQVZQIGRlZmluaXRpb25zIGluIHRoZSBkaWN0aW9uYXJ5CisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCisKKy8qIFR5cGUgdG8gaG9sZCBhbiBBVlAgY29kZS4gRm9yIHZlbmRvciAwLCB0aGVzZSBjb2RlcyBhcmUgYXNzaWduZWQgYnkgSUFOQS4gT3RoZXJ3aXNlLCBpdCBpcyBtYW5hZ2VkIGJ5IHRoZSB2ZW5kb3IgKi8KK3R5cGVkZWYgdWludDMyX3QJYXZwX2NvZGVfdDsKKworLyogVmFsdWVzIG9mIEFWUCBmbGFncyAqLworI2RlZmluZQlBVlBfRkxBR19WRU5ET1IJICAJMHg4MAorI2RlZmluZQlBVlBfRkxBR19NQU5EQVRPUlkJMHg0MAorI2RlZmluZQlBVlBfRkxBR19SRVNFUlZFRDMJMHgyMAorI2RlZmluZQlBVlBfRkxBR19SRVNFUlZFRDQJMHgxMAorI2RlZmluZQlBVlBfRkxBR19SRVNFUlZFRDUJMHgwOAorI2RlZmluZQlBVlBfRkxBR19SRVNFUlZFRDYJMHgwNAorI2RlZmluZQlBVlBfRkxBR19SRVNFUlZFRDcJMHgwMgorI2RlZmluZQlBVlBfRkxBR19SRVNFUlZFRDgJMHgwMQorCisvKiBGb3IgZHVtcGluZyBmbGFncyBhbmQgdmFsdWVzICovCisjZGVmaW5lIERVTVBfQVZQRkxfc3RyCSIlYyVjJXMlcyVzJXMlcyVzIgorI2RlZmluZSBEVU1QX0FWUEZMX3ZhbChfdmFsKSAoX3ZhbCAmIEFWUF9GTEFHX1ZFTkRPUik/J1YnOictJyAsIChfdmFsICYgQVZQX0ZMQUdfTUFOREFUT1JZKT8nTSc6Jy0nLAlcCisJCQkJKF92YWwgJiBBVlBfRkxBR19SRVNFUlZFRDMpPyIzIjoiIiwgKF92YWwgJiBBVlBfRkxBR19SRVNFUlZFRDQpPyI0IjoiIiwgXAorCQkJCShfdmFsICYgQVZQX0ZMQUdfUkVTRVJWRUQ1KT8iNSI6IiIsIChfdmFsICYgQVZQX0ZMQUdfUkVTRVJWRUQ2KT8iNiI6IiIsIChfdmFsICYgQVZQX0ZMQUdfUkVTRVJWRUQ3KT8iNyI6IiIsIChfdmFsICYgQVZQX0ZMQUdfUkVTRVJWRUQ4KT8iOCI6IiIKKworLyogVHlwZSB0byBob2xkIGRhdGEgYXNzb2NpYXRlZCB0byBhbiBhdnAgKi8KK3N0cnVjdCBkaWN0X2F2cF9kYXRhIHsKKwlhdnBfY29kZV90CSAJIGF2cF9jb2RlOwkvKiBDb2RlIG9mIHRoZSBhdnAgKi8KKwl2ZW5kb3JfaWRfdAkgCSBhdnBfdmVuZG9yOwkvKiBWZW5kb3Igb2YgdGhlIEFWUCwgb3IgMCAqLworCWNoYXIgKgkJCSBhdnBfbmFtZTsJLyogTmFtZSBvZiB0aGlzIEFWUCAqLworCXVpbnQ4X3QJCSAJIGF2cF9mbGFnX21hc2s7CS8qIE1hc2sgb2YgZml4ZWQgQVZQIGZsYWdzICovCisJdWludDhfdAkJIAkgYXZwX2ZsYWdfdmFsOwkvKiBWYWx1ZXMgb2YgdGhlIGZpeGVkIGZsYWdzICovCisJZW51bSBkaWN0X2F2cF9iYXNldHlwZSAJIGF2cF9iYXNldHlwZTsJLyogQmFzaWMgdHlwZSBvZiBkYXRhIGZvdW5kIGluIHRoZSBBVlAgKi8KK307CisKKy8qIFRoZSBjcml0ZXJpYSBmb3Igc2VhcmNoaW5nIGFuIGF2cCBvYmplY3QgaW4gdGhlIGRpY3Rpb25hcnkgKi8KK2VudW0geworCUFWUF9CWV9DT0RFID0gNTAsCS8qICJ3aGF0IiBwb2ludHMgdG8gYW4gYXZwX2NvZGVfdCwgdmVuZG9yIGlzIGFsd2F5cyAwICovCisJQVZQX0JZX05BTUUsCQkvKiAid2hhdCIgcG9pbnRzIHRvIGEgY2hhciAqLCB2ZW5kb3IgaXMgYWx3YXlzIDAgKi8KKwlBVlBfQllfTkFNRV9BTExfVkVORE9SUywvKiAid2hhdCIgcG9pbnRzIHRvIGEgc3RyaW5nLiBNaWdodCBiZSBxdWl0ZSBzbG93Li4uICovCisJQVZQX0JZX1NUUlVDVCwJCS8qICJ3aGF0IiBwb2ludHMgdG8gYSBzdHJ1Y3QgZGljdF9hdnBfcmVxdWVzdF9leCAoc2VlIGJlbG93KSAqLworCQkJCisJLyoga2VwdCBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSwgYmV0dGVyIHVzZSBBVlBfQllfU1RSVUNUIGFib3ZlIGluc3RlYWQgKi8KKwlBVlBfQllfQ09ERV9BTkRfVkVORE9SLAkvKiAid2hhdCIgcG9pbnRzIHRvIGEgc3RydWN0IGRpY3RfYXZwX3JlcXVlc3QgKHNlZSBiZWxvdyksIHdoZXJlIGF2cF92ZW5kb3IgYW5kIGF2cF9jb2RlIGFyZSBzZXQgKi8KKwlBVlBfQllfTkFNRV9BTkRfVkVORE9SCS8qICJ3aGF0IiBwb2ludHMgdG8gYSBzdHJ1Y3QgZGljdF9hdnBfcmVxdWVzdCAoc2VlIGJlbG93KSwgd2hlcmUgYXZwX3ZlbmRvciBhbmQgYXZwX25hbWUgYXJlIHNldCAqLworfTsKKworLyogU3RydWN0IHVzZWQgZm9yIHNvbWUgcmVzZWFyY2hzICovCitzdHJ1Y3QgZGljdF9hdnBfcmVxdWVzdF9leCB7CisJc3RydWN0IHsKKwkJLyogT25seSBvbmUgb2YgdGhlIGZvbGxvd2luZyBmaWVsZHMgbXVzdCBiZSBzZXQuICovCisJCXN0cnVjdCBkaWN0X29iamVjdCAqIAl2ZW5kb3I7CQkvKiBtb3N0IGVmZmljaWVudCBpZiBhbHJlYWR5IGtub3duLCBzZXQgdG8gTlVMTCB0byBpZ25vcmUgKi8KKwkJdmVuZG9yX2lkX3QJIAl2ZW5kb3JfaWQ7IAkvKiBzZXQgdG8gMCB0byBpZ25vcmUgLS0gcHJlZmVyIEFWUF9CWV9DT0RFIG9yIEFWUF9CWV9OQU1FIGZvciB2ZW5kb3IgMCAqLworCQljb25zdCBjaGFyICoJCQl2ZW5kb3JfbmFtZTsJLyogc2V0IHRvIE5VTEwgdG8gaWdub3JlICovCisJfSBhdnBfdmVuZG9yOworCQorCXN0cnVjdCB7CisJCS8qIE9ubHkgb25lIG9mIHRoZSBmb2xsb3dpbmcgZmllbGRzIG11c3QgYmUgc2V0ICovCisJCWF2cF9jb2RlX3QJIGF2cF9jb2RlOyAvKiBzZXQgdG8gMCB0byBpZ25vcmUgKi8KKwkJY29uc3QgY2hhciAqCQkgYXZwX25hbWU7IC8qIHNldCB0byBOVUxMIHRvIGlnbm9yZSAqLworCX0gYXZwX2RhdGE7Cit9OworCitzdHJ1Y3QgZGljdF9hdnBfcmVxdWVzdCB7CisJdmVuZG9yX2lkX3QJIGF2cF92ZW5kb3I7CisJYXZwX2NvZGVfdAkgYXZwX2NvZGU7CisJY2hhciAqCQkgYXZwX25hbWU7Cit9OworCisKKworLyoqKgorICogIEFQSSB1c2FnZSA6CisKK0lmICJwYXJlbnQiIHBhcmFtZXRlciBpcyBub3QgTlVMTCBkdXJpbmcgQVZQIGNyZWF0aW9uLCBpdCBtdXN0IHBvaW50IHRvIGEgRElDVF9UWVBFIG9iamVjdC4gCitUaGUgZXh0ZW5kZWQgdHlwZSBpcyB0aGVuIGF0dGFjaGVkIHRvIHRoZSBBVlAuIEluIGNhc2Ugd2hlcmUgaXQgaXMgYW4gZW51bWVyYXRlZCB0eXBlLCB0aGUgdmFsdWUgb2YgCitBVlAgaXMgYXV0b21hdGljYWxseSBpbnRlcnByZXRlZCBpbiBkZWJ1ZyBtZXNzYWdlcywgYW5kIGluIG1lc3NhZ2UgY2hlY2tzLgorVGhlIGRlcml2ZWQgdHlwZSBvZiBhbiBBVlAgY2FuIGJlIHJldHJpZXZlZCB3aXRoOiBkaWN0X3NlYXJjaCAoIERJQ1RfVFlQRSwgVFlQRV9PRl9BVlAsIGF2cCwgLi4uICkKKworVG8gY3JlYXRlIHRoZSBydWxlcyAoQUJORikgZm9yIGNoaWxkcmVuIG9mIEdyb3VwZWQgQVZQLCBzZWUgdGhlIERJQ1RfUlVMRSByZWxhdGVkIHBhcnQuCisKKy0gZmRfZGljdF9uZXc6CisgU2FtcGxlIGNvZGUgZm9yIEFWUCBjcmVhdGlvbjoKKyB7CisJIGludCByZXQ7CisJIHN0cnVjdCBkaWN0X29iamVjdCAqIHVzZXJfbmFtZV9hdnA7CisJIHN0cnVjdCBkaWN0X29iamVjdCAqIGJvb2xlYW5fdHlwZTsKKwkgc3RydWN0IGRpY3Rfb2JqZWN0ICogc2FtcGxlX2Jvb2xlYW5fYXZwOworCSBzdHJ1Y3QgZGljdF9hdnBfZGF0YSB1c2VyX25hbWVfZGF0YSA9IHsKKwkJIDEsCQkJCQkvLyBjb2RlCisJCSAwLAkJCQkJLy8gdmVuZG9yCisJCSAiVXNlci1OYW1lIiwJCQkJLy8gbmFtZQorCQkgQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvLyBmaXhlZCBtYXNrOiBWIGFuZCBNIHZhbHVlcyBtdXN0IGFsd2F5cyBiZSBkZWZpbmVkIGFzIGZvbGxvdy4gb3RoZXIgZmxhZ3MgY2FuIGJlIHNldCBvciBjbGVhcmVkCisJCSBBVlBfRkxBR19NQU5EQVRPUlksCQkJLy8gdGhlIFYgZmxhZyBtdXN0IGJlIGNsZWFyZWQsIHRoZSBNIGZsYWcgbXVzdCBiZSBzZXQuCisJCSBBVlBfVFlQRV9PQ1RFVFNUUklORwkJCS8vIFVzZXItTmFtZSBBVlAgY29udGFpbnMgT2N0ZXRTdHJpbmcgZGF0YSAoZnVydGhlciBwcmVjaXNpb24gc3VjaCBhcyBVVEY4U3RyaW5nIGNhbiBiZSBnaXZlbiB3aXRoIGEgcGFyZW50IGRlcml2ZWQgdHlwZSkKKwkgfTsKKwkgc3RydWN0IGRpY3RfYXZwX2RhdGEgc2FtcGxlX2Jvb2xlYW5fZGF0YSA9IHsKKwkJIDMxMzM3LAorCQkgMjM0NTUsCisJCSAiU2FtcGxlLUJvb2xlYW4iLAorCQkgQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAorCQkgQVZQX0ZMQUdfVkVORE9SLAorCQkgQVZQX1RZUEVfSU5URUdFUjMyCQkJLy8gVGhpcyBNVVNUIGJlIHRoZSBzYW1lIGFzIHBhcmVudCB0eXBlJ3MKKwkgfTsKKwkKKyAJIC0tIENyZWF0ZSBhbiBBVlAgd2l0aCBhIGJhc2UgdHlwZSAtLQorCSByZXQgPSBmZF9kaWN0X25ldyAoIGRpY3QsIERJQ1RfQVZQLCAmdXNlcl9uYW1lX2RhdGEsIE5VTEwsICZ1c2VyX25hbWVfYXZwICk7CisJIAorCSAtLSBDcmVhdGUgYW4gQVZQIHdpdGggYSBkZXJpdmVkIHR5cGUgLS0KKwkgcmV0ID0gZmRfZGljdF9zZWFyY2ggKCBkaWN0LCBESUNUX1RZUEUsIFRZUEVfQllfTkFNRSwgIkJvb2xlYW4iLCAmYm9vbGVhbl90eXBlLCBFTk9FTlQpOworCSByZXQgPSBmZF9kaWN0X25ldyAoIGRpY3QsIERJQ1RfQVZQLCAmc2FtcGxlX2Jvb2xlYW5fZGF0YSAsIGJvb2xlYW5fdHlwZSwgJnNhbXBsZV9ib29sZWFuX2F2cCApOworCSAKKyB9CisKKy0gZmRfZGljdF9zZWFyY2g6CisgU2FtcGxlIGNvZGUgdG8gbG9vayBmb3IgYW4gQVZQCisgeworCSBpbnQgcmV0OworCSBzdHJ1Y3QgZGljdF9vYmplY3QgKiBhdnBfdXNlcm5hbWU7CisJIHN0cnVjdCBkaWN0X29iamVjdCAqIGF2cF9zYW1wbGVib29sZWFuOworCSBzdHJ1Y3QgZGljdF9hdnBfcmVxdWVzdCBhdnB2ZW5kb3Jib29sZWFuID0KKwkgCXsKKwkJIC5hdnBfdmVuZG9yID0gMjM0NTUsCisJCSAuYXZwX25hbWUgICA9ICJTYW1wbGUtQm9vbGVhbiIKKwkgCX07CisJIAorCSByZXQgPSBmZF9kaWN0X3NlYXJjaCAoIGRpY3QsIERJQ1RfQVZQLCBBVlBfQllfTkFNRSwgIlVzZXItTmFtZSIsICZhdnBfdXNlcm5hbWUsIEVOT0VOVCk7CisJIAorCSByZXQgPSBmZF9kaWN0X3NlYXJjaCAoIGRpY3QsIERJQ1RfQVZQLCBBVlBfQllfTkFNRV9BTkRfVkVORE9SLCAmYXZwdmVuZG9yYm9vbGVhbiwgJmF2cF9zYW1wbGVib29sZWFuLCBFTk9FTlQpOworCisJIC0tIHRoaXMgd291bGQgYWxzbyB3b3JrLCBidXQgYmUgc2xvd2VyLCBiZWNhdXNlIGl0IGhhcyB0byBzZWFyY2ggYWxsIHZlbmRvciBkaWN0aW9uYXJpZXMgLS0KKwkgcmV0ID0gZmRfZGljdF9zZWFyY2ggKCBkaWN0LCBESUNUX0FWUCwgQVZQX0JZX05BTUVfQUxMX1ZFTkRPUlMsICJTYW1wbGUtQm9vbGVhbiIsICZhdnBfc2FtcGxlYm9vbGVhbiwgRU5PRU5UKTsKKwkgCisgfQorIAorIC0gZmRfZGljdF9nZXR2YWw6CisgU2FtcGxlIGNvZGUgdG8gcmV0cmlldmUgdGhlIGRhdGEgZnJvbSBhbiBBVlAgb2JqZWN0OgorIHsKKwkgaW50IHJldDsKKwkgc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwX3VzZXJuYW1lOworCSBzdHJ1Y3QgZGljdF9hdnBfZGF0YSB1c2VyX25hbWVfZGF0YTsKKwkgcmV0ID0gZmRfZGljdF9zZWFyY2ggKCBkaWN0LCBESUNUX0FWUCwgQVZQX0JZX05BTUUsICJVc2VyLU5hbWUiLCAmYXZwX3VzZXJuYW1lLCBFTk9FTlQpOworCSByZXQgPSBmZF9kaWN0X2dldHZhbCAoIGF2cF91c2VybmFtZSwgJnVzZXJfbmFtZV9kYXRhICk7CisJIHByaW50ZigiVXNlci1OYW1lIGNvZGU6ICVkXG4iLCB1c2VyX25hbWVfZGF0YS5hdnBfY29kZSApOworIH0KKworKi8KKworLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBDb21tYW5kIG9iamVjdCAKKyAqCisgKiBUaGVzZSB0eXBlcyBhcmUgdXNlZCB0byBtYW5hZ2UgY29tbWFuZHMgb2JqZWN0cyBpbiB0aGUgZGljdGlvbmFyeQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworCisvKiBUeXBlIHRvIGhvbGQgYSBEaWFtZXRlciBjb21tYW5kIGNvZGU6IElBTkEgYXNzaWduZWQgdmFsdWVzLiAweDAtMHg3ZmZmZmY9c3RhbmRhcmQsIDB4ODAwMDAwLTB4ZmZmZmZkPXZlbmRvcnMsIDB4ZmZmZmZlLTB4ZmZmZmZmPWV4cGVyaW1lbnRhbCAqLwordHlwZWRlZiB1aW50MzJfdAljb21tYW5kX2NvZGVfdDsKKworLyogVmFsdWVzIG9mIGNvbW1hbmQgZmxhZ3MgKi8KKyNkZWZpbmUgQ01EX0ZMQUdfUkVRVUVTVAkweDgwCisjZGVmaW5lIENNRF9GTEFHX1BST1hJQUJMRQkweDQwCisjZGVmaW5lIENNRF9GTEFHX0VSUk9SCQkweDIwCisjZGVmaW5lIENNRF9GTEFHX1JFVFJBTlNNSVQJMHgxMAorI2RlZmluZSBDTURfRkxBR19SRVNFUlZFRDUJMHgwOAorI2RlZmluZSBDTURfRkxBR19SRVNFUlZFRDYJMHgwNAorI2RlZmluZSBDTURfRkxBR19SRVNFUlZFRDcJMHgwMgorI2RlZmluZSBDTURfRkxBR19SRVNFUlZFRDgJMHgwMQorCisvKiBGb3IgZHVtcGluZyBmbGFncyBhbmQgdmFsdWVzICovCisjZGVmaW5lIERVTVBfQ01ERkxfc3RyCSIlYyVjJWMlYyVzJXMlcyVzIgorI2RlZmluZSBEVU1QX0NNREZMX3ZhbChfdmFsKSAoX3ZhbCAmIENNRF9GTEFHX1JFUVVFU1QpPydSJzonLScgLCAoX3ZhbCAmIENNRF9GTEFHX1BST1hJQUJMRSk/J1AnOictJyAsIChfdmFsICYgQ01EX0ZMQUdfRVJST1IpPydFJzonLScgLCAoX3ZhbCAmIENNRF9GTEFHX1JFVFJBTlNNSVQpPydUJzonLScsIFwKKwkJCQkoX3ZhbCAmIENNRF9GTEFHX1JFU0VSVkVENSk/IjUiOiIiLCAoX3ZhbCAmIENNRF9GTEFHX1JFU0VSVkVENik/IjYiOiIiLCAoX3ZhbCAmIENNRF9GTEFHX1JFU0VSVkVENyk/IjciOiIiLCAoX3ZhbCAmIENNRF9GTEFHX1JFU0VSVkVEOCk/IjgiOiIiCisKKy8qIFR5cGUgdG8gaG9sZCBkYXRhIGFzc29jaWF0ZWQgdG8gYSBjb21tYW5kICovCitzdHJ1Y3QgZGljdF9jbWRfZGF0YSB7CisJY29tbWFuZF9jb2RlX3QJIGNtZF9jb2RlOwkvKiBjb2RlIG9mIHRoZSBjb21tYW5kICovCisJY2hhciAqCQkgY21kX25hbWU7CS8qIE5hbWUgb2YgdGhlIGNvbW1hbmQgKi8KKwl1aW50OF90CQkgY21kX2ZsYWdfbWFzazsJLyogTWFzayBvZiBmaXhlZC12YWx1ZSBmbGFncyAqLworCXVpbnQ4X3QJCSBjbWRfZmxhZ192YWw7CS8qIHZhbHVlcyBvZiB0aGUgZml4ZWQgZmxhZ3MgKi8KK307CisKKy8qIFRoZSBjcml0ZXJpYSBmb3Igc2VhcmNoaW5nIGFuIGF2cCBvYmplY3QgaW4gdGhlIGRpY3Rpb25hcnkgKi8KK2VudW0geworCUNNRF9CWV9OQU1FID0gNjAsCS8qICJ3aGF0IiBwb2ludHMgdG8gYSBjaGFyICogKi8KKwlDTURfQllfQ09ERV9SLAkJLyogIndoYXQiIHBvaW50cyB0byBhIGNvbW1hbmRfY29kZV90LiBUaGUgIlJlcXVlc3QiIGNvbW1hbmQgaXMgcmV0dXJuZWQuICovCisJQ01EX0JZX0NPREVfQSwJCS8qICJ3aGF0IiBwb2ludHMgdG8gYSBjb21tYW5kX2NvZGVfdC4gVGhlICJBbnN3ZXIiIGNvbW1hbmQgaXMgcmV0dXJuZWQuICovCisJQ01EX0FOU1dFUgkJLyogIndoYXQiIHBvaW50cyB0byBhIHN0cnVjdCBkaWN0X29iamVjdCBvZiBhIHJlcXVlc3QgY29tbWFuZC4gVGhlIGNvcnJlc3BvbmRpbmcgIkFuc3dlciIgY29tbWFuZCBpcyByZXR1cm5lZC4gKi8KK307CisKKworLyoqKgorICogIEFQSSB1c2FnZSA6CisKK1RoZSAicGFyZW50IiBwYXJhbWV0ZXIgb2YgZGljdF9uZXcgbWF5IHBvaW50IHRvIGFuIGFwcGxpY2F0aW9uIG9iamVjdCB0byBpbmZvcm0gb2Ygd2hhdCBhcHBsaWNhdGlvbiBkZWZpbmVzIHRoZSBjb21tYW5kLgorVGhlIGFwcGxpY2F0aW9uIGFzc29jaWF0ZWQgdG8gYSBjb21tYW5kIGlzIHJldHJpZXZlZCB3aXRoIEFQUExJQ0FUSU9OX09GX0NPTU1BTkQgc2VhcmNoIGNyaXRlcmlhIG9uIGFwcGxpY2F0aW9ucy4KKworVG8gY3JlYXRlIHRoZSBydWxlcyBmb3IgY2hpbGRyZW4gb2YgY29tbWFuZHMsIHNlZSB0aGUgRElDVF9SVUxFIHJlbGF0ZWQgcGFydC4KKworTm90ZSB0aGF0IHRoZSAiUmVxdWVzdCIgYW5kICJBbnN3ZXIiIGNvbW1hbmRzIGFyZSB0d28gaW5kZXBlbmRhbnQgb2JqZWN0cy4gVGhpcyBhbGxvd3MgdG8gaGF2ZSBkaWZmZXJlbnQgcnVsZXMgZm9yIGVhY2guCisKKy0gZmRfZGljdF9uZXc6CisgU2FtcGxlIGNvZGUgZm9yIGNvbW1hbmQgY3JlYXRpb246CisgeworCSBpbnQgcmV0OworCSBzdHJ1Y3QgZGljdF9vYmplY3QgKiBjZXI7CisJIHN0cnVjdCBkaWN0X29iamVjdCAqIGNlYTsKKwkgc3RydWN0IGRpY3RfY21kX2RhdGEgY2VfZGF0YSA9IHsKKwkJIDI1NywJCQkJCS8vIGNvZGUKKwkJICJDYXBhYmlsaXRpZXMtRXhjaGFuZ2UtUmVxdWVzdCIsCS8vIG5hbWUKKwkJIENNRF9GTEFHX1JFUVVFU1QsCQkJLy8gbWFzaworCQkgQ01EX0ZMQUdfUkVRVUVTVAkJCS8vIHZhbHVlLiBPbmx5IHRoZSAiUiIgZmxhZyBpcyBjb25zdHJhaW5lZCBoZXJlLCBzZXQuCisJIH07CisJCisJIHJldCA9IGZkX2RpY3RfbmV3IChkaWN0LCAgRElDVF9DT01NQU5ELCAmY2VfZGF0YSwgTlVMTCwgJmNlciApOworCSAKKwkgY2VfZGF0YS5jbWRfbmFtZSA9ICJDYXBhYmlsaXRpZXMtRXhjaGFuZ2UtQW5zd2VyIjsKKwkgY2VfZGF0YS5jbWRfZmxhZ192YWwgPSAwOwkJCS8vIFNhbWUgY29uc3RyYWludCBvbiAiUiIgZmxhZywgYnV0IHRoaXMgdGltZSBpdCBtdXN0IGJlIGNsZWFyZWQuCisKKwkgcmV0ID0gZmRfZGljdF9uZXcgKCBkaWN0LCBESUNUX0NPTU1BTkQsICZjZV9kYXRhLCBOVUxMLCAmY2VhICk7CisgfQorCistIGZkX2RpY3Rfc2VhcmNoOgorIFNhbXBsZSBjb2RlIHRvIGxvb2sgZm9yIGEgY29tbWFuZAorIHsKKwkgaW50IHJldDsKKwkgc3RydWN0IGRpY3Rfb2JqZWN0ICogY2VyLCAqIGNlYTsKKwkgY29tbWFuZF9jb2RlX3QJY29kZSA9IDI1NzsKKwkgcmV0ID0gZmRfZGljdF9zZWFyY2ggKCBkaWN0LCBESUNUX0NPTU1BTkQsIENNRF9CWV9OQU1FLCAiQ2FwYWJpbGl0aWVzLUV4Y2hhbmdlLVJlcXVlc3QiLCAmY2VyLCBFTk9FTlQpOworCSByZXQgPSBmZF9kaWN0X3NlYXJjaCAoIGRpY3QsIERJQ1RfQ09NTUFORCwgQ01EX0JZX0NPREVfUiwgJmNvZGUsICZjZXIsIEVOT0VOVCk7CisgfQorIAorIC0gZmRfZGljdF9nZXR2YWw6CisgU2FtcGxlIGNvZGUgdG8gcmV0cmlldmUgdGhlIGRhdGEgZnJvbSBhIGNvbW1hbmQgb2JqZWN0OgorIHsKKwkgaW50IHJldDsKKwkgc3RydWN0IGRpY3Rfb2JqZWN0ICogY2VyOworCSBzdHJ1Y3QgZGljdF9vYmplY3QgKiBjZWE7CisJIHN0cnVjdCBkaWN0X2NtZF9kYXRhIGNlYV9kYXRhOworCSByZXQgPSBmZF9kaWN0X3NlYXJjaCAoIGRpY3QsIERJQ1RfQ09NTUFORCwgQ01EX0JZX05BTUUsICJDYXBhYmlsaXRpZXMtRXhjaGFuZ2UtUmVxdWVzdCIsICZjZXIsIEVOT0VOVCk7CisJIHJldCA9IGZkX2RpY3Rfc2VhcmNoICggZGljdCwgRElDVF9DT01NQU5ELCBDTURfQU5TV0VSLCBjZXIsICZjZWEsIEVOT0VOVCk7CisJIHJldCA9IGZkX2RpY3RfZ2V0dmFsICggY2VhLCAmY2VhX2RhdGEgKTsKKwkgcHJpbnRmKCJBbnN3ZXIgdG8gQ0VSOiAlc1xuIiwgY2VhX2RhdGEuY21kX25hbWUgKTsKKyB9CisKKyovCisKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogUnVsZSBvYmplY3QKKyAqCisgKiBUaGVzZSBvYmplY3RzIGFyZSB1c2VkIHRvIG1hbmFnZSBydWxlcyBpbiB0aGUgZGljdGlvbmFyeSAoQUJORiBpbXBsZW1lbnRhdGlvbikKKyAqIFRoaXMgaXMgdXNlZCBmb3IgY2hlY2tpbmcgbWVzc2FnZXMgdmFsaWRpdHkgKG1vcmUgcG93ZXJmdWwgdGhhbiBhIERURCkKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KKworLyogVGhpcyBkZWZpbmVzIHRoZSBraW5kIG9mIHJ1bGUgdGhhdCBpcyBkZWZpbmVkICovCitlbnVtIHJ1bGVfcG9zaXRpb24geworCVJVTEVfRklYRURfSEVBRCA9IDEsCS8qIFRoZSBBVlAgbXVzdCBiZSBhdCB0aGUgaGVhZCBvZiB0aGUgZ3JvdXAuIFRoZSBydWxlX29yZGVyIGZpZWxkIGlzIHVzZWQgdG8gc3BlY2lmeSB0aGUgcG9zaXRpb24uICovCisJUlVMRV9SRVFVSVJFRCwJCS8qIFRoZSBBVlAgbXVzdCBiZSBwcmVzZW50IGluIHRoZSBwYXJlbnQsIGJ1dCBpdHMgcG9zaXRpb24gaXMgbm90IGRlZmluZWQuICovCisJUlVMRV9PUFRJT05BTCwJCS8qIFRoZSBBVlAgbWF5IGJlIHByZXNlbnQgaW4gdGhlIG1lc3NhZ2UuIFVzZWQgdG8gc3BlY2lmeSBhIG1heCBudW1iZXIgb2Ygb2NjdXJlbmNlcyBmb3IgZXhhbXBsZSAqLworCVJVTEVfRklYRURfVEFJTAkJLyogVGhlIEFWUCBtdXN0IGJlIGF0IHRoZSBlbmQgb2YgdGhlIGdyb3VwLiBUaGUgcnVsZV9vcmRlciBmaWVsZCBpcyB1c2VkIHRvIHNwZWNpZnkgdGhlIHBvc2l0aW9uLiAqLworfTsKKworLyogQ29udGVudCBvZiBhIFJVTEUgb2JqZWN0IGRhdGEgKi8KK3N0cnVjdCBkaWN0X3J1bGVfZGF0YSB7CisJc3RydWN0IGRpY3Rfb2JqZWN0CSpydWxlX2F2cDsJLyogUG9pbnRlciB0byB0aGUgQVZQIG9iamVjdCB0aGF0IGlzIGNvbmNlcm5lZCBieSB0aGlzIHJ1bGUgKi8KKwllbnVtIHJ1bGVfcG9zaXRpb24JIHJ1bGVfcG9zaXRpb247CS8qIFRoZSBwb3NpdGlvbiBpbiB3aGljaCB0aGUgcnVsZV9hdnAgbXVzdCBhcHBlYXIgaW4gdGhlIHBhcmVudCAqLworCXVuc2lnbmVkCQkgcnVsZV9vcmRlcjsJLyogZm9yIFJVTEVfRklYRURfKiBydWxlcywgdGhlIHBsYWNlLiAxLDIsMy4uIGZvciBIRUFEIHJ1bGVzOyAuLi4sMywyLDEgZm9yIFRBSUwgcnVsZXMuICovCisJaW50CSAJCSBydWxlX21pbjsJLyogTWluaW11bSBudW1iZXIgb2Ygb2NjdXJlbmNlcy4gLTEgbWVhbnMgImRlZmF1bHQiOiAwIGZvciBvcHRpb25hbCBydWxlcywgMSBmb3Igb3RoZXIgcnVsZXMgKi8KKwlpbnQJCQkgcnVsZV9tYXg7CS8qIE1heGltdW0gbnVtYmVyIG9mIG9jY3VyZW5jZXMuIC0xIG1lYW5zIG5vIG1heGltdW0uIDAgbWVhbnMgdGhlIEFWUCBpcyBmb3JiaWRkZW4uICovCit9OworCisvKiBUaGUgY3JpdGVyaWEgZm9yIHNlYXJjaGluZyBhIHJ1bGUgaW4gdGhlIGRpY3Rpb25hcnkgKi8KK2VudW0geworCVJVTEVfQllfQVZQX0FORF9QQVJFTlQgPSA3MAkvKiAid2hhdCIgcG9pbnRzIHRvIGEgc3RydWN0IGRpY3RfcnVsZV9yZXF1ZXN0IC0tIHNlZSBiZWxvdy4gVGhpcyBpcyB1c2VkIHRvIHF1ZXJ5ICJ3aGF0IGlzIHRoZSBydWxlIGZvciB0aGlzIEFWUCBpbiB0aGlzIGdyb3VwPyIgKi8KK307CisKKy8qIFN0cnVjdHVyZSBmb3IgcXVlcnlpbmcgdGhlIGRpY3Rpb25hcnkgYWJvdXQgYSBydWxlICovCitzdHJ1Y3QgZGljdF9ydWxlX3JlcXVlc3QgeworCXN0cnVjdCBkaWN0X29iamVjdAkqcnVsZV9wYXJlbnQ7CS8qIFRoZSBncm91cGVkIGF2cCBvciBjb21tYW5kIHRvIHdoaWNoIHRoZSBydWxlIGFwcGx5ICovCisJc3RydWN0IGRpY3Rfb2JqZWN0CSpydWxlX2F2cDsJLyogVGhlIEFWUCBjb25jZXJuZWQgYnkgdGhpcyBydWxlICovCit9OworCisKKy8qKioKKyAqICBBUEkgdXNhZ2UgOgorCitUaGUgInBhcmVudCIgcGFyYW1ldGVyIGNhbiBub3QgYmUgTlVMTC4gSXQgcG9pbnRzIHRvIHRoZSBvYmplY3QgKGdyb3VwZWQgYXZwIG9yIGNvbW1hbmQpIHRvIHdoaWNoIHRoaXMgcnVsZSBhcHBseSAoaS5lLiBmb3Igd2hpY2ggdGhlIEFCTkYgaXMgZGVmaW5lZCkuCisKKy0gZmRfZGljdF9uZXc6CisgU2FtcGxlIGNvZGUgZm9yIHJ1bGUgY3JlYXRpb24uIExldCdzIGNyZWF0ZSB0aGUgUHJveHktSW5mbyBncm91cGVkIEFWUCBmb3IgZXhhbXBsZS4KKyB7CisJaW50IHJldDsKKwlzdHJ1Y3QgZGljdF9vYmplY3QgKiBwcm94eV9pbmZvX2F2cDsKKwlzdHJ1Y3QgZGljdF9vYmplY3QgKiBwcm94eV9ob3N0X2F2cDsKKwlzdHJ1Y3QgZGljdF9vYmplY3QgKiBwcm94eV9zdGF0ZV9hdnA7CisJc3RydWN0IGRpY3Rfb2JqZWN0ICogZGlhbWV0ZXJpZGVudGl0eV90eXBlOworCXN0cnVjdCBkaWN0X3J1bGVfZGF0YSBydWxlX2RhdGE7CisJc3RydWN0IGRpY3RfdHlwZV9kYXRhIGRpX3R5cGVfZGF0YSA9IHsgQVZQX1RZUEVfT0NURVRTVFJJTkcsICJEaWFtZXRlcklkZW50aXR5IiwgTlVMTCwgTlVMTCB9OworCXN0cnVjdCBkaWN0X2F2cF9kYXRhIHByb3h5X2luZm9fZGF0YSA9IHsgMjg0LCAwLCAiUHJveHktSW5mbyIsIEFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwgQVZQX0ZMQUdfTUFOREFUT1JZLCBBVlBfVFlQRV9HUk9VUEVEIH07CisJc3RydWN0IGRpY3RfYXZwX2RhdGEgcHJveHlfaG9zdF9kYXRhID0geyAyODAsIDAsICJQcm94eS1Ib3N0IiwgQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLCBBVlBfRkxBR19NQU5EQVRPUlksIEFWUF9UWVBFX09DVEVUU1RSSU5HIH07CisJc3RydWN0IGRpY3RfYXZwX2RhdGEgcHJveHlfc3RhdGVfZGF0YSA9IHsgMzMsIDAsICJQcm94eS1TdGF0ZSIsQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLCBBVlBfRkxBR19NQU5EQVRPUlksIEFWUF9UWVBFX09DVEVUU1RSSU5HIH07CisJCisJLS0gQ3JlYXRlIHRoZSBwYXJlbnQgQVZQCisJcmV0ID0gZmRfZGljdF9uZXcgKCBkaWN0LCBESUNUX0FWUCwgJnByb3h5X2luZm9fZGF0YSwgTlVMTCwgJnByb3h5X2luZm9fYXZwICk7CisJCisJLS0gQ3JlYXRlIHRoZSBmaXJzdCBjaGlsZCBBVlAuCisJcmV0ID0gZmRfZGljdF9uZXcgKCBkaWN0LCBESUNUX1RZUEUsICZkaV90eXBlX2RhdGEsIE5VTEwsICZkaWFtZXRlcmlkZW50aXR5X3R5cGUgKTsKKwlyZXQgPSBmZF9kaWN0X25ldyAoIGRpY3QsIERJQ1RfQVZQLCAmcHJveHlfaG9zdF9kYXRhLCBkaWFtZXRlcmlkZW50aXR5X3R5cGUsICZwcm94eV9ob3N0X2F2cCApOworCQorCS0tIENyZWF0ZSB0aGUgb3RoZXIgY2hpbGQgQVZQCisJcmV0ID0gZmRfZGljdF9uZXcgKCBkaWN0LCBESUNUX0FWUCwgJnByb3h5X3N0YXRlX2RhdGEsIE5VTEwsICZwcm94eV9zdGF0ZV9hdnAgKTsKKwkKKwktLSBOb3cgd2UgY2FuIGNyZWF0ZSB0aGUgcnVsZXMuIEJvdGggY2hpbGRyZW4gQVZQIGFyZSBtYW5kYXRvcnkuCisJcnVsZV9kYXRhLnJ1bGVfcG9zaXRpb24gPSBSVUxFX1JFUVVJUkVEOworCXJ1bGVfZGF0YS5ydWxlX21pbiA9IC0xOworCXJ1bGVfZGF0YS5ydWxlX21heCA9IC0xOworCQorCXJ1bGVfZGF0YS5ydWxlX2F2cCA9IHByb3h5X2hvc3RfYXZwOworCXJldCA9IGZkX2RpY3RfbmV3ICggZGljdCwgRElDVF9SVUxFLCAmcnVsZV9kYXRhLCBwcm94eV9pbmZvX2F2cCwgTlVMTCApOworCQorCXJ1bGVfZGF0YS5ydWxlX2F2cCA9IHByb3h5X3N0YXRlX2F2cDsKKwlyZXQgPSBmZF9kaWN0X25ldyAoIGRpY3QsIERJQ1RfUlVMRSwgJnJ1bGVfZGF0YSwgcHJveHlfaW5mb19hdnAsIE5VTEwgKTsKK30KKworLSBmZF9kaWN0X3NlYXJjaCBhbmQgZmRfZGljdF9nZXR2YWwgYXJlIHNpbWlsYXIgdG8gcHJldmlvdXMgZXhhbXBsZXMuCisKKyovCisJCQorLyogRGVmaW5lIHNvbWUgaGFyZC1jb2RlZCB2YWx1ZXMgKi8KKy8qIEFwcGxpY2F0aW9uICovCisjZGVmaW5lIEFJX1JFTEFZCQkJMHhmZmZmZmZmZgorCisvKiBDb21tYW5kcyBDb2RlcyAqLworI2RlZmluZSBDQ19DQVBBQklMSVRJRVNfRVhDSEFOR0UJMjU3CisjZGVmaW5lIENDX1JFX0FVVEgJCQkyNTgKKyNkZWZpbmUgQ0NfQUNDT1VOVElORwkJCTI3MQorI2RlZmluZSBDQ19BQk9SVF9TRVNTSU9OCQkyNzQKKyNkZWZpbmUgQ0NfU0VTU0lPTl9URVJNSU5BVElPTgkJMjc1CisjZGVmaW5lIENDX0RFVklDRV9XQVRDSERPRwkJMjgwCisjZGVmaW5lIENDX0RJU0NPTk5FQ1RfUEVFUgkJMjgyCisKKy8qIEFWUHMgKFZlbmRvciAwKSAqLworI2RlZmluZSBBQ19VU0VSX05BTUUJCQkxCisjZGVmaW5lIEFDX1BST1hZX1NUQVRFCQkJMzMKKyNkZWZpbmUgQUNfSE9TVF9JUF9BRERSRVNTCQkyNTcKKyNkZWZpbmUgQUNfQVVUSF9BUFBMSUNBVElPTl9JRAkJMjU4CisjZGVmaW5lIEFDX0FDQ1RfQVBQTElDQVRJT05fSUQJCTI1OQorI2RlZmluZSBBQ19WRU5ET1JfU1BFQ0lGSUNfQVBQTElDQVRJT05fSUQgMjYwCisjZGVmaW5lIEFDX1JFRElSRUNUX0hPU1RfVVNBR0UJCTI2MQorI2RlZmluZSBBQ19SRURJUkVDVF9NQVhfQ0FDSEVfVElNRQkyNjIKKyNkZWZpbmUgQUNfU0VTU0lPTl9JRCAJCQkyNjMKKyNkZWZpbmUgQUNfT1JJR0lOX0hPU1QJCQkyNjQKKyNkZWZpbmUgQUNfU1VQUE9SVEVEX1ZFTkRPUl9JRAkJMjY1CisjZGVmaW5lIEFDX1ZFTkRPUl9JRAkJCTI2NgorI2RlZmluZSBBQ19GSVJNV0FSRV9SRVZJU0lPTgkJMjY3CisjZGVmaW5lIEFDX1JFU1VMVF9DT0RFCQkJMjY4CisjZGVmaW5lIEFDX1BST0RVQ1RfTkFNRQkJCTI2OQorI2RlZmluZSBBQ19ESVNDT05ORUNUX0NBVVNFCQkyNzMKKyNkZWZpbmUgQUNWX0RDX1JFQk9PVElORwkJCTAKKyNkZWZpbmUgQUNWX0RDX0JVU1kJCQkJMQorI2RlZmluZSBBQ1ZfRENfTk9UX0ZSSUVORAkJCTIKKyNkZWZpbmUgQUNfT1JJR0lOX1NUQVRFX0lECQkyNzgKKyNkZWZpbmUgQUNfRkFJTEVEX0FWUAkJCTI3OQorI2RlZmluZSBBQ19QUk9YWV9IT1NUCQkJMjgwCisjZGVmaW5lIEFDX0VSUk9SX01FU1NBR0UJCTI4MQorI2RlZmluZSBBQ19ST1VURV9SRUNPUkQJCQkyODIKKyNkZWZpbmUgQUNfREVTVElOQVRJT05fUkVBTE0JCTI4MworI2RlZmluZSBBQ19QUk9YWV9JTkZPCQkJMjg0CisjZGVmaW5lIEFDX1JFRElSRUNUX0hPU1QJCTI5MgorI2RlZmluZSBBQ19ERVNUSU5BVElPTl9IT1NUCQkyOTMKKyNkZWZpbmUgQUNfRVJST1JfUkVQT1JUSU5HX0hPU1QJCTI5NAorI2RlZmluZSBBQ19PUklHSU5fUkVBTE0JCQkyOTYKKyNkZWZpbmUgQUNfSU5CQU5EX1NFQ1VSSVRZX0lECQkyOTkKKyNkZWZpbmUgQUNWX0lTSV9OT19JTkJBTkRfU0VDVVJJVFkJCTAKKyNkZWZpbmUgQUNWX0lTSV9UTFMJCQkJMQorCisvKiBFcnJvciBjb2RlcyBmcm9tIEJhc2UgcHJvdG9jb2wKKyhyZWZlcmVuY2U6IGh0dHA6Ly93d3cuaWFuYS5vcmcvYXNzaWdubWVudHMvYWFhLXBhcmFtZXRlcnMvYWFhLXBhcmFtZXRlcnMueG1sI2FhYS1wYXJhbWV0ZXJzLTQpCitOb3RlIHRoYXQgY3VycmVudGx5LCByZmMzNTg4YmlzLTI2IGhhcyBzb21lIGRpZmZlcmVudCB2YWx1ZXMgZm9yIHNvbWUgb2YgdGhlc2UgCisqLworI2RlZmluZSBFUl9ESUFNRVRFUl9NVUxUSV9ST1VORF9BVVRICQkJMTAwMQorCisjZGVmaW5lIEVSX0RJQU1FVEVSX1NVQ0NFU1MJCQkJMjAwMQorI2RlZmluZSBFUl9ESUFNRVRFUl9MSU1JVEVEX1NVQ0NFU1MJCQkyMDAyCisKKyNkZWZpbmUgRVJfRElBTUVURVJfQ09NTUFORF9VTlNVUFBPUlRFRAkJCTMwMDEgLyogNTAxOSA/ICovCisjZGVmaW5lIEVSX0RJQU1FVEVSX1VOQUJMRV9UT19ERUxJVkVSCQkJMzAwMgorI2RlZmluZSBFUl9ESUFNRVRFUl9SRUFMTV9OT1RfU0VSVkVECQkJMzAwMworI2RlZmluZSBFUl9ESUFNRVRFUl9UT09fQlVTWQkJCQkzMDA0CisjZGVmaW5lIEVSX0RJQU1FVEVSX0xPT1BfREVURUNURUQJCQkzMDA1CisjZGVmaW5lIEVSX0RJQU1FVEVSX1JFRElSRUNUX0lORElDQVRJT04JCQkzMDA2CisjZGVmaW5lIEVSX0RJQU1FVEVSX0FQUExJQ0FUSU9OX1VOU1VQUE9SVEVECQkzMDA3CisjZGVmaW5lIEVSX0RJQU1FVEVSX0lOVkFMSURfSERSX0JJVFMJCQkzMDA4IC8qIDUwMjAgPyAqLworI2RlZmluZSBFUl9ESUFNRVRFUl9JTlZBTElEX0FWUF9CSVRTCQkJMzAwOSAvKiA1MDIxID8gKi8KKyNkZWZpbmUgRVJfRElBTUVURVJfVU5LTk9XTl9QRUVSCQkJMzAxMCAvKiA1MDE4ID8gKi8KKworI2RlZmluZSBFUl9ESUFNRVRFUl9BVVRIRU5USUNBVElPTl9SRUpFQ1RFRAkJNDAwMQorI2RlZmluZSBFUl9ESUFNRVRFUl9PVVRfT0ZfU1BBQ0UJCQk0MDAyCisjZGVmaW5lIEVSX0VMRUNUSU9OX0xPU1QJCQkJNDAwMworCisjZGVmaW5lIEVSX0RJQU1FVEVSX0FWUF9VTlNVUFBPUlRFRAkJCTUwMDEKKyNkZWZpbmUgRVJfRElBTUVURVJfVU5LTk9XTl9TRVNTSU9OX0lECQkJNTAwMgorI2RlZmluZSBFUl9ESUFNRVRFUl9BVVRIT1JJWkFUSU9OX1JFSkVDVEVECQk1MDAzCisjZGVmaW5lIEVSX0RJQU1FVEVSX0lOVkFMSURfQVZQX1ZBTFVFCQkJNTAwNAorI2RlZmluZSBFUl9ESUFNRVRFUl9NSVNTSU5HX0FWUAkJCQk1MDA1CisjZGVmaW5lIEVSX0RJQU1FVEVSX1JFU09VUkNFU19FWENFRURFRAkJCTUwMDYKKyNkZWZpbmUgRVJfRElBTUVURVJfQ09OVFJBRElDVElOR19BVlBTCQkJNTAwNworI2RlZmluZSBFUl9ESUFNRVRFUl9BVlBfTk9UX0FMTE9XRUQJCQk1MDA4CisjZGVmaW5lIEVSX0RJQU1FVEVSX0FWUF9PQ0NVUlNfVE9PX01BTllfVElNRVMJCTUwMDkKKyNkZWZpbmUgRVJfRElBTUVURVJfTk9fQ09NTU9OX0FQUExJQ0FUSU9OCQk1MDEwCisjZGVmaW5lIEVSX0RJQU1FVEVSX1VOU1VQUE9SVEVEX1ZFUlNJT04JCQk1MDExCisjZGVmaW5lIEVSX0RJQU1FVEVSX1VOQUJMRV9UT19DT01QTFkJCQk1MDEyCisjZGVmaW5lIEVSX0RJQU1FVEVSX0lOVkFMSURfQklUX0lOX0hFQURFUgkJNTAxMyAvKiAzMDExID8gKi8KKyNkZWZpbmUgRVJfRElBTUVURVJfSU5WQUxJRF9BVlBfTEVOR1RICQkJNTAxNAorI2RlZmluZSBFUl9ESUFNRVRFUl9JTlZBTElEX01FU1NBR0VfTEVOR1RICQk1MDE1IC8qIDMwMTIgPyAqLworI2RlZmluZSBFUl9ESUFNRVRFUl9JTlZBTElEX0FWUF9CSVRfQ09NQk8JCTUwMTYgLyogZGVwcmVjYXRlZD8gKi8KKyNkZWZpbmUgRVJfRElBTUVURVJfTk9fQ09NTU9OX1NFQ1VSSVRZCQkJNTAxNworCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgIFNFU1NJT05TICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworLyogTW9kdWxlcyB0aGF0IHdhbnQgdG8gYXNzb2NpYXRlIGEgc3RhdGUgd2l0aCBhIFNlc3Npb24tSWQgbXVzdCBmaXJzdCByZWdpc3RlciBhIGhhbmRsZXIgb2YgdGhpcyB0eXBlICovCitzdHJ1Y3Qgc2Vzc2lvbl9oYW5kbGVyOworCisvKiBUaGlzIG9wYXF1ZSBzdHJ1Y3R1cmUgcmVwcmVzZW50cyBhIHNlc3Npb24gYXNzb2NpYXRlZCB3aXRoIGEgU2Vzc2lvbi1JZCAqLworc3RydWN0IHNlc3Npb247CisKKy8qIFRoZSBzdGF0ZSBpbmZvcm1hdGlvbiB0aGF0IGEgbW9kdWxlIGFzc29jaWF0ZSB3aXRoIGEgc2Vzc2lvbiAtLSBlYWNoIG1vZHVsZSBkZWZpbmVzIGl0cyBvd24gZGF0YSBmb3JtYXQgKi8KK3N0cnVjdCBzZXNzX3N0YXRlOyAvKiBkZWNsYXJlIHRoaXMgaW4geW91ciBvd24gZXh0ZW5zaW9uICovCisKK3R5cGVkZWYgREVDTEFSRV9GRF9EVU1QX1BST1RPVFlQRSgoKnNlc3Npb25fc3RhdGVfZHVtcCksIHN0cnVjdCBzZXNzX3N0YXRlICogc3QpOworCisvKiBUaGUgZm9sbG93aW5nIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIHRvIGFjdGl2YXRlIHRoZSBzZXNzaW9uIGV4cGlyeSBtZWNoYW5pc20gKi8KK2ludCBmZF9zZXNzX3N0YXJ0KHZvaWQpOworCisvKgorICogRlVOQ1RJT046CWZkX3Nlc3NfaGFuZGxlcl9jcmVhdGUKKyAqCisgKiBQQVJBTUVURVJTOgorICogIGhhbmRsZXIJOiBsb2NhdGlvbiB3aGVyZSB0aGUgbmV3IGhhbmRsZXIgbXVzdCBiZSBzdG9yZWQuCisgKiAgY2xlYW51cAk6IGEgY2FsbGJhY2sgZnVuY3Rpb24gdGhhdCBtdXN0IGJlIGNhbGxlZCB3aGVuIHRoZSBzZXNzaW9uIHdpdGggYXNzb2NpYXRlZCBkYXRhIGlzIGRlc3Ryb3llZC4KKyAqICBkdW1wZXIgICAgICA6IGlmIG5vdCBOVUxMLCB3aWxsIGJlIGNhbGxlZCBkdXJpbmcgZmRfc2Vzc19kdW1wIHRvIGRpc3BsYXkgdGhlIGRhdGEgYXNzb2NpYXRlZCB3aXRoIGEgc2Vzc2lvbi4gTlVMTCBvdGhlcndpc2UuCisgKiAgb3BhcXVlICAgICAgOiBBIHBvaW50ZXIgdGhhdCBpcyBwYXNzZWQgdG8gdGhlIGNsZWFudXAgY2FsbGJhY2sgLS0gdGhlIGNvbnRlbnQgaXMgbmV2ZXIgZXhhbWluZWQgYnkgdGhlIGZyYW1ld29yay4KKyAqCisgKiBERVNDUklQVElPTjogCisgKiAgQ3JlYXRlIGEgbmV3IHNlc3Npb24gaGFuZGxlci4gVGhpcyBpcyBuZWVkZWQgYnkgYSBtb2R1bGUgdG8gYXNzb2NpYXRlIGEgc3RhdGUgd2l0aCBhIHNlc3Npb24gb2JqZWN0LgorICogVGhlIGNsZWFudXAgaGFuZGxlciBpcyBjYWxsZWQgd2hlbiB0aGUgc2Vzc2lvbiB0aW1lb3V0IGV4cGlyZXMsIG9yIGZkX3Nlc3NfZGVzdHJveSBpcyBjYWxsZWQuIEl0IG11c3QgZnJlZQorICogdGhlIHN0YXRlIGFzc29jaWF0ZWQgd2l0aCB0aGUgc2Vzc2lvbiwgYW5kIGV2ZW50dWFsbHkgdHJpZyBvdGhlciBhY3Rpb25zIChzZW5kIGEgU1RSLCAuLi4pLgorICoKKyAqIFJFVFVSTiBWQUxVRToKKyAqICAwICAgICAgCTogVGhlIG5ldyBoYW5kbGVyIGhhcyBiZWVuIGNyZWF0ZWQuCisgKiAgRUlOVkFMIAk6IEEgcGFyYW1ldGVyIGlzIGludmFsaWQuCisgKiAgRU5PTUVNCTogTm90IGVub3VnaCBtZW1vcnkgdG8gY29tcGxldGUgdGhlIG9wZXJhdGlvbgorICovCitpbnQgZmRfc2Vzc19oYW5kbGVyX2NyZWF0ZSAoIHN0cnVjdCBzZXNzaW9uX2hhbmRsZXIgKiogaGFuZGxlciwgdm9pZCAoKmNsZWFudXApKHN0cnVjdCBzZXNzX3N0YXRlICogc3RhdGUsIG9zMF90IHNpZCwgdm9pZCAqIG9wYXF1ZSksIHNlc3Npb25fc3RhdGVfZHVtcCBkdW1wZXIsIHZvaWQgKiBvcGFxdWUgKTsKKworCQorLyoKKyAqIEZVTkNUSU9OOglmZF9zZXNzX2hhbmRsZXJfZGVzdHJveQorICoKKyAqIFBBUkFNRVRFUlM6CisgKiAgaGFuZGxlcgk6IGxvY2F0aW9uIG9mIGFuIGhhbmRsZXIgY3JlYXRlZCBieSBmZF9zZXNzX2hhbmRsZXJfY3JlYXRlLgorICogIG9wYXF1ZSAgICAgIDogdGhlIG9wYXF1ZSBwb2ludGVyIHJlZ2lzdGVyZWQgd2l0aCB0aGUgY2FsbGJhY2sgaXMgcmVzdG9yZWQgaGVyZSAoaWYgISBOVUxMKS4KKyAqCisgKiBERVNDUklQVElPTjogCisgKiAgVGhpcyBkZXN0cm95cyBhIHNlc3Npb24gaGFuZGxlciAodHlwaWNhbGx5IGNhbGxlZCB3aGVuIGFuIGFwcGxpY2F0aW9uIGlzIHNodXR0aW5nIGRvd24pLgorICogSWYgc2Vzc2lvbnMgc3RhdGVzIGFyZSByZWdpc3RlcmVkIHdpdGggdGhpcyBoYW5kbGVyLCB0aGUgY2xlYW51cCBjYWxsYmFjayBpcyBjYWxsZWQgb24gdGhlbS4KKyAqCisgKiBSRVRVUk4gVkFMVUU6CisgKiAgMCAgICAgIAk6IFRoZSBoYW5kbGVyIHdhcyBkZXN0cm95ZWQuCisgKiAgRUlOVkFMIAk6IEEgcGFyYW1ldGVyIGlzIGludmFsaWQuCisgKiAgRU5PTUVNCTogTm90IGVub3VnaCBtZW1vcnkgdG8gY29tcGxldGUgdGhlIG9wZXJhdGlvbgorICovCitpbnQgZmRfc2Vzc19oYW5kbGVyX2Rlc3Ryb3kgKCBzdHJ1Y3Qgc2Vzc2lvbl9oYW5kbGVyICoqIGhhbmRsZXIsIHZvaWQgKipvcGFxdWUgKTsKKworCisKKy8qCisgKiBGVU5DVElPTjoJZmRfc2Vzc19uZXcKKyAqCisgKiBQQVJBTUVURVJTOgorICogIHNlc3Npb24JICA6IFRoZSBsb2NhdGlvbiB3aGVyZSB0aGUgc2Vzc2lvbiBvYmplY3Qgd2lsbCBiZSBjcmVhdGVkIHVwb24gc3VjY2Vzcy4KKyAqICBkaWFtaWQJICA6IGEgRGlhbWV0ZXIgSWRlbnRpdHksIG9yIE5VTEwuCisgKiAgZGlhbWlkbGVuCSAgOiBpZiBkaWFtaWQgaXMgXDAtdGVybWluYXRlZCwgdGhpcyBjYW4gYmUgMC4gT3RoZXJ3aXNlLCB0aGUgbGVuZ3RoIG9mIGRpYW1pZC4KKyAqICBvcHQgICAgICAgICAgIDogQWRkaXRpb25hbCBzdHJpbmcsIG9yIE5VTEwuIFVzYWdlIGlzIGRlc2NyaWJlZCBiZWxvdy4KKyAqICBvcHRsZW4JICA6IGlmIG9wdCBpcyBcMC10ZXJtaW5hdGVkLCB0aGlzIGNhbiBiZSAwLiBPdGhlcndpc2UsIHRoZSBsZW5ndGggb2Ygb3B0LgorICoKKyAqIERFU0NSSVBUSU9OOiAKKyAqICAgQ3JlYXRlIGEgbmV3IHNlc3Npb24gb2JqZWN0LiBUaGUgU2Vzc2lvbi1JZCBzdHJpbmcgYXNzb2NpYXRlZCB3aXRoIHRoaXMgc2Vzc2lvbiBpcyBnZW5lcmF0ZWQgYXMgZm9sbG93OgorICogIElmIGRpYW1JZCBwYXJhbWV0ZXIgaXMgcHJvdmlkZWQsIHRoZSBzdHJpbmcgaXMgY3JlYXRlZCBhY2NvcmRpbmcgdG8gdGhlIFJGQzogPGRpYW1JZD47PGhpZ2gzMj47PGxvdzMyPls7b3B0XSB3aGVyZQorICogICAgZGlhbUlkIGlzIGEgRGlhbWV0ZXIgSWRlbnRpdHkuCisgKiAgICBoaWdoMzIgYW5kIGxvdzMyIGFyZSB0aGUgcGFydHMgb2YgYSBtb25vdG9uaWMgNjQgYml0cyBjb3VudGVyIGluaXRpYWxpemVkIHRvICh0aW1lLCAwKSBhdCBzdGFydHVwLgorICogICAgb3B0IGlzIGFuIG9wdGlvbmFsIHN0cmluZyB0aGF0IGNhbiBiZSBjb25jYXRlbmF0ZWQgdG8gdGhlIGlkZW50aWZpZXIuCisgKiAgSWYgZGlhbUlkIGlzIE5VTEwsIHRoZSBzdHJpbmcgaXMgZXhhY3RseSB0aGUgY29udGVudCBvZiBvcHQuCisgKgorICogUkVUVVJOIFZBTFVFOgorICogIDAgICAgICAJOiBUaGUgc2Vzc2lvbiBpcyBjcmVhdGVkLCB0aGUgaW5pdGlhbCBtc2cgcmVmY291bnQgaXMgMS4KKyAqICBFSU5WQUwgCTogQSBwYXJhbWV0ZXIgaXMgaW52YWxpZC4KKyAqICBFQUxSRUFEWQk6IEEgc2Vzc2lvbiB3aXRoIHRoZSBzYW1lIG5hbWUgYWxyZWFkeSBleGlzdHMgKHJldHVybmVkIGluICpzZXNzaW9uKSwgdGhlIG1zZyByZWZjb3VudCBpcyBpbmNyZWFzZWQuCisgKiAgRU5PTUVNCTogTm90IGVub3VnaCBtZW1vcnkgdG8gY29tcGxldGUgdGhlIG9wZXJhdGlvbgorICovCitpbnQgZmRfc2Vzc19uZXcgKCBzdHJ1Y3Qgc2Vzc2lvbiAqKiBzZXNzaW9uLCBEaWFtSWRfdCBkaWFtaWQsIHNpemVfdCBkaWFtaWRsZW4sIHVpbnQ4X3QgKiBvcHQsIHNpemVfdCBvcHRsZW4gKTsKKworLyoKKyAqIEZVTkNUSU9OOglmZF9zZXNzX2Zyb21zaWQKKyAqCisgKiBQQVJBTUVURVJTOgorICogIHNpZAkgIAk6IHBvaW50ZXIgdG8gYSBzdHJpbmcgY29udGFpbmluZyBhIFNlc3Npb24tSWQgKHNob3VsZCBiZSBVVEYtOCkuCisgKiAgbGVuCQk6IGxlbmd0aCBvZiB0aGUgc2lkIHN0cmluZyAod2hpY2ggZG9lcyBub3QgbmVlZCB0byBiZSAnXDAnLXRlcm1pbmF0ZWQpCisgKiAgc2Vzc2lvbgk6IE9uIHN1Y2Nlc3MsIHBvaW50ZXIgdG8gdGhlIHNlc3Npb24gb2JqZWN0IGNyZWF0ZWQgLyByZXRyaWV2ZWQuCisgKiAgaXNuZXcJOiBpZiBub3QgTlVMTCwgc2V0IHRvIDEgb24gcmV0dXJuIGlmIHRoZSBzZXNzaW9uIG9iamVjdCBoYXMgYmVlbiBjcmVhdGVkLCAwIGlmIGl0IHdhcyBzaW1wbHkgcmV0cmlldmVkLgorICoKKyAqIERFU0NSSVBUSU9OOiAKKyAqICAgUmV0cmlldmUgYSBzZXNzaW9uIG9iamVjdCBmcm9tIGEgU2Vzc2lvbi1JZCBzdHJpbmcuIEluIGNhc2Ugbm8gc2Vzc2lvbiBvYmplY3Qgd2FzIHByZXZpb3VzbHkgZXhpc3Rpbmcgd2l0aCB0aGlzIAorICogIGlkLCBhIG5ldyBvYmplY3QgaXMgc2lsZW50bHkgY3JlYXRlZCAoZXF1aXZhbGVudCB0byBmZF9zZXNzX25ldyB3aXRoIGZsYWcgU0VTU0lPTl9ORVdfRlVMTCkuCisgKgorICogUkVUVVJOIFZBTFVFOgorICogIDAgICAgICAJOiBUaGUgc2Vzc2lvbiBwYXJhbWV0ZXIgaGFzIGJlZW4gdXBkYXRlZC4KKyAqICBFSU5WQUwgCTogQSBwYXJhbWV0ZXIgaXMgaW52YWxpZC4KKyAqICBFTk9NRU0JOiBOb3QgZW5vdWdoIG1lbW9yeSB0byBjb21wbGV0ZSB0aGUgb3BlcmF0aW9uCisgKi8KK2ludCBmZF9zZXNzX2Zyb21zaWQgKCB1aW50OF90ICogc2lkLCBzaXplX3QgbGVuLCBzdHJ1Y3Qgc2Vzc2lvbiAqKiBzZXNzaW9uLCBpbnQgKiBpc25ldyk7CisKKy8qIG9ubHkgdXNlIHRoZSBmb2xsb3dpbmcgaW4gc3BlY2lmaWMgc2l0dWF0aW9ucywgZS5nLiBhcHBfcmFkZ3cgZXh0ZW5zaW9uLiBUaGV5IGFyZSBub3JtYWxseSBoYW5kbGVkIGJ5IHRoZSBmcmFtZXdvcmsgb25seSAqLworaW50IGZkX3Nlc3NfZnJvbXNpZF9tc2cgKCB1aW50OF90ICogc2lkLCBzaXplX3QgbGVuLCBzdHJ1Y3Qgc2Vzc2lvbiAqKiBzZXNzaW9uLCBpbnQgKiBpc25ldyk7IAoraW50IGZkX3Nlc3NfcmVmX21zZyAoIHN0cnVjdCBzZXNzaW9uICogc2Vzc2lvbiApOworCisvKgorICogRlVOQ1RJT046CWZkX3Nlc3NfZ2V0c2lkCisgKgorICogUEFSQU1FVEVSUzoKKyAqICBzZXNzaW9uCTogUG9pbnRlciB0byBhIHNlc3Npb24gb2JqZWN0LgorICogIHNpZAkgIAk6IE9uIHN1Y2Nlc3MsIHRoZSBsb2NhdGlvbiBvZiB0aGUgc2lkIGlzIHN0b3JlZCBoZXJlLgorICoKKyAqIERFU0NSSVBUSU9OOiAKKyAqICAgUmV0cmlldmUgdGhlIHNlc3Npb24gaWRlbnRpZmllciAoU2Vzc2lvbi1JZCkgY29ycmVzcG9uZGluZyB0byBhIHNlc3Npb24gb2JqZWN0LgorICogIFRoZSByZXR1cm5lZCBzaWQgaXMgYSBcMC10ZXJtaW5hdGVkIGJpbmFyeSBzdHJpbmcgd2hpY2ggbWlnaHQgYmUgVVRGLTggKGJ1dCB0aGVyZSBpcyBubyBndWFyYW50ZWUgaW4gdGhlIGZyYW1ld29yaykuCisgKiAgSXQgbWF5IGJlIHVzZWQgZm9yIGV4YW1wbGUgdG8gc2V0IHRoZSB2YWx1ZSBvZiBhbiBBVlAuCisgKiAgTm90ZSB0aGF0IHRoZSBzaWQgc3RyaW5nIGlzIG5vdCBjb3BpZWQsIGp1c3QgaXRzIHJlZmVyZW5jZS4uLiBkbyBub3QgZnJlZSBpdCEKKyAqCisgKiBSRVRVUk4gVkFMVUU6CisgKiAgMCAgICAgIAk6IFRoZSBzaWQgJiBsZW4gcGFyYW1ldGVycyBoYXZlIGJlZW4gdXBkYXRlZC4KKyAqICBFSU5WQUwgCTogQSBwYXJhbWV0ZXIgaXMgaW52YWxpZC4KKyAqLworaW50IGZkX3Nlc3NfZ2V0c2lkICggc3RydWN0IHNlc3Npb24gKiBzZXNzaW9uLCBvczBfdCAqIHNpZCwgc2l6ZV90ICogc2lkbGVuICk7CisKKy8qCisgKiBGVU5DVElPTjoJZmRfc2Vzc19zZXR0aW1lb3V0CisgKgorICogUEFSQU1FVEVSUzoKKyAqICBzZXNzaW9uCTogVGhlIHNlc3Npb24gZm9yIHdoaWNoIHRvIHNldCB0aGUgdGltZW91dC4KKyAqICB0aW1lb3V0CTogVGhlIGRhdGUgd2hlbiB0aGUgc2Vzc2lvbiB0aW1lcyBvdXQuCisgKgorICogREVTQ1JJUFRJT046IAorICogICBTZXQgdGhlIGxpZmV0aW1lIGZvciBhIGdpdmVuIHNlc3Npb24gb2JqZWN0LiBUaGlzIGZ1bmN0aW9uIG1heSBiZSAKKyAqIGNhbGxlZCBzZXZlcmFsIHRpbWVzIG9uIHRoZSBzYW1lIG9iamVjdCB0byB1cGRhdGUgdGhlIHRpbWVvdXQgdmFsdWUuCisgKiAgIFdoZW4gdGhlIHRpbWVvdXQgZGF0ZSBpcyByZWFjaGVkLCB0aGUgY2xlYW51cCBoYW5kbGVyIG9mIGVhY2ggCisgKiBtb2R1bGUgdGhhdCByZWdpc3RlcmVkIGRhdGEgd2l0aCB0aGlzIHNlc3Npb24gaXMgY2FsbGVkLCB0aGVuIHRoZSAKKyAqIHNlc3Npb24gaXMgY2xlYXJlZC4KKyAqCisgKiAgIFRoZXJlIGlzIGEgcG9zc2libGUgcmFjZSBjb25kaXRpb24gYmV0d2VlbiBjbGVhbnVwIG9mIHRoZSBzZXNzaW9uCisgKiBhbmQgdXNlIG9mIGl0cyBkYXRhOyBhcHBsaWNhdGlvbnMgc2hvdWxkIGVuc3VyZSB0aGF0IHRoZXkgYXJlIG5vdCAKKyAqIHVzaW5nIGRhdGEgZnJvbSBhIHNlc3Npb24gdGhhdCBpcyBhYm91dCB0byBleHBpcmUgLyBleHBpcmVkLgorICoKKyAqIFJFVFVSTiBWQUxVRToKKyAqICAwICAgICAgCTogVGhlIHNlc3Npb24gdGltZW91dCBoYXMgYmVlbiB1cGRhdGVkLgorICogIEVJTlZBTCAJOiBBIHBhcmFtZXRlciBpcyBpbnZhbGlkLgorICovCitpbnQgZmRfc2Vzc19zZXR0aW1lb3V0KCBzdHJ1Y3Qgc2Vzc2lvbiAqIHNlc3Npb24sIGNvbnN0IHN0cnVjdCB0aW1lc3BlYyAqIHRpbWVvdXQgKTsKKworLyoKKyAqIEZVTkNUSU9OOglmZF9zZXNzX2Rlc3Ryb3kKKyAqCisgKiBQQVJBTUVURVJTOgorICogIHNlc3Npb24JOiBQb2ludGVyIHRvIGEgc2Vzc2lvbiBvYmplY3QuCisgKgorICogREVTQ1JJUFRJT046IAorICogICBEZXN0cm95cyBhbGwgYXNzb2NpYXRlZCBzdGF0ZXMgb2YgYSBzZXNzaW9uLCBpZiBhbnkuCisgKiBFcXVpdmFsZW50IHRvIGEgc2Vzc2lvbiB0aW1lb3V0IGV4cGlyZWQsIGJ1dCB0aGUgZWZmZWN0IGlzIGltbWVkaWF0ZS4KKyAqIFRoZSBzZXNzaW9uIGl0c2VsZiBpcyBtYXJrZWQgYXMgZGVsZXRlZCwgYW5kIHdpbGwgYmUgZnJlZWQgd2hlbiBpdCBpcyBub3QgcmVmZXJlbmNlZCAKKyAqIGJ5IGFueSBtZXNzYWdlIGFueW1vcmUuCisgKgorICogUkVUVVJOIFZBTFVFOgorICogIDAgICAgICAJOiBUaGUgc2Vzc2lvbiBubyBsb25nZXIgZXhpc3RzLgorICogIEVJTlZBTCAJOiBBIHBhcmFtZXRlciBpcyBpbnZhbGlkLgorICovCitpbnQgZmRfc2Vzc19kZXN0cm95ICggc3RydWN0IHNlc3Npb24gKiogc2Vzc2lvbiApOworCisvKgorICogRlVOQ1RJT046CWZkX3Nlc3NfcmVjbGFpbQorICoKKyAqIFBBUkFNRVRFUlM6CisgKiAgc2Vzc2lvbgk6IFBvaW50ZXIgdG8gYSBzZXNzaW9uIG9iamVjdC4KKyAqCisgKiBERVNDUklQVElPTjogCisgKiAgIEVxdWl2YWxlbnQgdG8gZmRfc2Vzc19kZXN0cm95LCBvbmx5IGlmIG5vIHNlc3Npb25fc3RhdGUgaXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBzZXNzaW9uLgorICogIE90aGVyd2lzZSwgdGhpcyBmdW5jdGlvbiBoYXMgbm8gZWZmZWN0IChleGNlcHQgdGhhdCBpdCBzZXRzICpzZXNzaW9uIHRvIE5VTEwpLgorICoKKyAqIFJFVFVSTiBWQUxVRToKKyAqICAwICAgICAgCTogVGhlIHNlc3Npb24gd2FzIHJlY2xhaW1lZC4KKyAqICBFSU5WQUwgCTogQSBwYXJhbWV0ZXIgaXMgaW52YWxpZC4KKyAqLworaW50IGZkX3Nlc3NfcmVjbGFpbSAoIHN0cnVjdCBzZXNzaW9uICoqIHNlc3Npb24gKTsKKworCisKKworLyoKKyAqIEZVTkNUSU9OOglmZF9zZXNzX3N0YXRlX3N0b3JlCisgKgorICogUEFSQU1FVEVSUzoKKyAqICBoYW5kbGVyCTogVGhlIGhhbmRsZXIgd2l0aCB3aGljaCB0aGUgc3RhdGUgaXMgcmVnaXN0ZXJlZC4KKyAqICBzZXNzaW9uCTogVGhlIHNlc3Npb24gb2JqZWN0IHdpdGggd2hpY2ggdGhlIHN0YXRlIGlzIHJlZ2lzdGVyZWQuCisgKiAgc3RhdGUJOiBBbiBhcHBsaWNhdGlvbiBzdGF0ZSAob3BhcXVlIGRhdGEpIHRvIHN0b3JlIHdpdGggdGhlIHNlc3Npb24uCisgKgorICogREVTQ1JJUFRJT046IAorICogIFN0b3JlcyBhbiBhcHBsaWNhdGlvbiBzdGF0ZSB3aXRoIGEgc2Vzc2lvbi4gVGhpcyBzdGF0ZSBjYW4gbGF0ZXIgYmUgcmV0cmlldmVkCisgKiB3aXRoIGZkX3Nlc3Nfc3RhdGVfcmV0cmlldmUsIG9yIGltcGxpY2l0bHkgaW4gdGhlIGNsZWFudXAgaGFuZGxlciB3aGVuIHRoZSBzZXNzaW9uCisgKiBpcyBkZXN0cm95ZWQuCisgKgorICogUkVUVVJOIFZBTFVFOgorICogIDAgICAgICAJOiBUaGUgc3RhdGUgaGFzIGJlZW4gc3RvcmVkLgorICogIEVJTlZBTCAJOiBBIHBhcmFtZXRlciBpcyBpbnZhbGlkLgorICogIEVBTFJFQURZCTogRGF0YSB3YXMgYWxyZWFkeSBhc3NvY2lhdGVkIHdpdGggdGhpcyBzZXNzaW9uIGFuZCBjbGllbnQuCisgKiAgRU5PTUVNCTogTm90IGVub3VnaCBtZW1vcnkgdG8gY29tcGxldGUgdGhlIG9wZXJhdGlvbgorICovCitpbnQgZmRfc2Vzc19zdGF0ZV9zdG9yZSAoIHN0cnVjdCBzZXNzaW9uX2hhbmRsZXIgKiBoYW5kbGVyLCBzdHJ1Y3Qgc2Vzc2lvbiAqIHNlc3Npb24sIHN0cnVjdCBzZXNzX3N0YXRlICoqIHN0YXRlICk7CisKKy8qCisgKiBGVU5DVElPTjoJZmRfc2Vzc19zdGF0ZV9yZXRyaWV2ZQorICoKKyAqIFBBUkFNRVRFUlM6CisgKiAgaGFuZGxlcgk6IFRoZSBoYW5kbGVyIHdpdGggd2hpY2ggdGhlIHN0YXRlIHdhcyByZWdpc3RlcmVkLgorICogIHNlc3Npb24JOiBUaGUgc2Vzc2lvbiBvYmplY3Qgd2l0aCB3aGljaCB0aGUgc3RhdGUgd2FzIHJlZ2lzdGVyZWQuCisgKiAgc3RhdGUJOiBMb2NhdGlvbiB3aGVyZSB0aGUgc3RhdGUgbXVzdCBiZSBzYXZlZCBpZiBpdCBpcyBmb3VuZC4KKyAqCisgKiBERVNDUklQVElPTjogCisgKiAgUmV0cmlldmVzIGEgc3RhdGUgc2F2ZWQgYnkgZmRfc2Vzc19zdGF0ZV9zdG9yZS4KKyAqIEFmdGVyIHRoaXMgZnVuY3Rpb24gaGFzIGJlZW4gY2FsbGVkLCB0aGUgc3RhdGUgaXMgbm8gbG9uZ2VyIGFzc29jaWF0ZWQgd2l0aCAKKyAqIHRoZSBzZXNzaW9uLiBBIG5ldyBjYWxsIHRvIGZkX3Nlc3Nfc3RhdGVfc3RvcmUgbXVzdCBiZSBwZXJmb3JtZWQgaW4gb3JkZXIgdG8KKyAqIHN0b3JlIGFnYWluIHRoZSBkYXRhIHdpdGggdGhlIHNlc3Npb24uCisgKgorICogUkVUVVJOIFZBTFVFOgorICogIDAgICAgICAJOiAqc3RhdGUgaXMgdXBkYXRlZCAoTlVMTCBvciBwb2ludHMgdG8gdGhlIHN0YXRlIGlmIGl0IHdhcyBmb3VuZCkuCisgKiAgRUlOVkFMIAk6IEEgcGFyYW1ldGVyIGlzIGludmFsaWQuCisgKi8KK2ludCBmZF9zZXNzX3N0YXRlX3JldHJpZXZlICggc3RydWN0IHNlc3Npb25faGFuZGxlciAqIGhhbmRsZXIsIHN0cnVjdCBzZXNzaW9uICogc2Vzc2lvbiwgc3RydWN0IHNlc3Nfc3RhdGUgKiogc3RhdGUgKTsgCisKKworLyogRm9yIGRlYnVnICovCitERUNMQVJFX0ZEX0RVTVBfUFJPVE9UWVBFKGZkX3Nlc3NfZHVtcCwgc3RydWN0IHNlc3Npb24gKiBzZXNzaW9uLCBpbnQgd2l0aF9zdGF0ZXMpOworREVDTEFSRV9GRF9EVU1QX1BST1RPVFlQRShmZF9zZXNzX2R1bXBfaGRsLCBzdHJ1Y3Qgc2Vzc2lvbl9oYW5kbGVyICogaGFuZGxlcik7CisKKy8qIEZvciBzdGF0aXN0aWNzIC8gbW9uaXRvcmluZzogZ2V0IHRoZSBudW1iZXIgb2Ygc3RydWN0IHNlc3Npb24gaW4gbWVtb3J5ICovCitpbnQgZmRfc2Vzc19nZXRjb3VudCh1aW50MzJfdCAqY250KTsKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworLyogICAgICAgICAgICAgICAgICAgICAgICAgUk9VVElORyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisvKiBUaGUgZm9sbG93aW5nIGZ1bmN0aW9ucyBhcmUgaGVscGVycyBmb3IgdGhlIHJvdXRpbmcgbW9kdWxlLiAKKyAgVGhlIHJvdXRpbmcgZGF0YSBpcyBzdG9yZWQgaW4gdGhlIG1lc3NhZ2UgaXRzZWxmLiAqLworCisvKiBTdHJ1Y3R1cmUgdGhhdCBjb250YWlucyB0aGUgcm91dGluZyBkYXRhIGZvciBhIG1lc3NhZ2UgKi8KK3N0cnVjdCBydF9kYXRhOworCisvKiBGb2xsb3dpbmcgZnVuY3Rpb25zIGFyZSBoZWxwZXJzIHRvIGNyZWF0ZSB0aGUgcm91dGluZyBkYXRhIG9mIGEgbWVzc2FnZSAqLworaW50ICBmZF9ydGRfaW5pdChzdHJ1Y3QgcnRfZGF0YSAqKiBydGQpOwordm9pZCBmZF9ydGRfZnJlZShzdHJ1Y3QgcnRfZGF0YSAqKiBydGQpOworCisvKiBBZGQgYSBwZWVyIHRvIHRoZSBjYW5kaWRhdGVzIGxpc3QuICovCitpbnQgIGZkX3J0ZF9jYW5kaWRhdGVfYWRkKHN0cnVjdCBydF9kYXRhICogcnRkLCBEaWFtSWRfdCBwZWVyaWQsIHNpemVfdCBwZWVyaWRsZW4sIERpYW1JZF90IHJlYWxtLCBzaXplX3QgcmVhbG1sZW4pOworCisvKiBSZW1vdmUgYSBwZWVyIGZyb20gdGhlIGNhbmRpZGF0ZXMgKGlmIGl0IGlzIGZvdW5kKS4gVGhlIHNlYXJjaCBpcyBjYXNlLWluc2Vuc2l0aXZlLiAqLwordm9pZCBmZF9ydGRfY2FuZGlkYXRlX2RlbChzdHJ1Y3QgcnRfZGF0YSAqIHJ0ZCwgdWludDhfdCAqIGlkLCBzaXplX3QgaWRzeik7CisKKy8qIEV4dHJhY3QgdGhlIGxpc3Qgb2YgdmFsaWQgY2FuZGlkYXRlcywgYW5kIGluaXRpYWxpemUgdGhlaXIgc2NvcmVzIHRvIDAgKi8KK3ZvaWQgZmRfcnRkX2NhbmRpZGF0ZV9leHRyYWN0KHN0cnVjdCBydF9kYXRhICogcnRkLCBzdHJ1Y3QgZmRfbGlzdCAqKiBjYW5kaWRhdGVzLCBpbnQgaW5pX3Njb3JlKTsKKworLyogSWYgYSBwZWVyIHJldHVybmVkIGEgcHJvdG9jb2wgZXJyb3IgZm9yIHRoaXMgbWVzc2FnZSwgc2F2ZSBpdCBzbyB0aGF0IHdlIGRvbid0IHRyeSB0byBzZW5kIGl0IHRoZXJlIGFnYWluLiBPcHRpb25hbGx5IHJldHJpZXZlIHRoZSBjdXJyZW50IGxpc3Qgb2YgY2FuZGlkYXRlcy4gKi8KK2ludCAgZmRfcnRkX2Vycm9yX2FkZChzdHJ1Y3QgcnRfZGF0YSAqIHJ0ZCwgRGlhbUlkX3Qgc2VudHRvLCBzaXplX3Qgc2VudHRvbGVuLCB1aW50OF90ICogb3JpZ2luLCBzaXplX3Qgb3JpZ2luc3osIHVpbnQzMl90IHJjb2RlLCBzdHJ1Y3QgZmRfbGlzdCAqKiBjYW5kaWRhdGVzLCBpbnQgKiBzZW5kaW5nYXR0ZW10cHMpOworCisvKiBPbmx5IHJldHJpZXZlIHRoZSBudW1iZXIgb2YgdGltZXMgdGhpcyBtZXNzYWdlIGhhcyBiZWVuIHByb2Nlc3NlZCBieSB0aGUgcm91dGluZy1vdXQgbWVjaGFuaXNtIChpLmUuIG51bWJlciBvZiB0aW1lcyBpdCB3YXMgZmFpbGVkIG92ZXIpICovCitpbnQgIGZkX3J0ZF9nZXRfbmJfYXR0ZW1wdHMoc3RydWN0IHJ0X2RhdGEgKiBydGQsIGludCAqIHNlbmRpbmdhdHRlbXRwcyk7CisKKy8qIFRoZSBleHRyYWN0ZWQgbGlzdCBpdGVtcyBoYXZlIHRoZSBmb2xsb3dpbmcgc3RydWN0dXJlOiAqLworc3RydWN0IHJ0ZF9jYW5kaWRhdGUgeworCXN0cnVjdCBmZF9saXN0CWNoYWluOwkvKiBsaW5rIGluIHRoZSBsaXN0IHJldHVybmVkIGJ5IHRoZSBwcmV2aW91cyBmY3RzICovCisJRGlhbUlkX3QJZGlhbWlkOwkvKiB0aGUgZGlhbWV0ZXIgSWQgb2YgdGhlIHBlZXIgKi8KKwlzaXplX3QJCWRpYW1pZGxlbjsgLyogY2FjaGVkIHNpemUgb2YgdGhlIGRpYW1pZCBzdHJpbmcgKi8KKwlEaWFtSWRfdAlyZWFsbTsJLyogdGhlIGRpYW1ldGVyIHJlYWxtIG9mIHRoZSBwZWVyICovCisJc2l6ZV90CQlyZWFsbWxlbjsgLyogY2FjaGVkIHNpemUgb2YgcmVhbG0gKi8KKwlpbnQJCXNjb3JlOwkvKiB0aGUgY3VycmVudCByb3V0aW5nIHNjb3JlIGZvciB0aGlzIHBlZXIsIHNlZSBmZF9ydF9vdXRfcmVnaXN0ZXIgZGVmaW5pdGlvbiBmb3IgZGV0YWlscyAqLworfTsKKworLyogUmVvcmRlciB0aGUgbGlzdCBvZiBwZWVycyBieSBzY29yZSAqLworaW50ICBmZF9ydGRfY2FuZGlkYXRlX3Jlb3JkZXIoc3RydWN0IGZkX2xpc3QgKiBjYW5kaWRhdGVzKTsKKworLyogTm90ZSA6IGl0IGlzIGZpbmUgZm9yIGEgY2FsbGJhY2sgdG8gYWRkIGEgbmV3IGVudHJ5IGluIHRoZSBjYW5kaWRhdGVzIGxpc3QgYWZ0ZXIgdGhlIGxpc3QgaGFzIGJlZW4gZXh0cmFjdGVkLiBUaGUgZGlhbWlkIG11c3QgdGhlbiBiZSBtYWxsb2MnZC4gKi8KKy8qIEJld2FyZSB0aGF0IHRoaXMgY291bGQgbGVhZCB0byByb3V0aW5nIGxvb3BzICovCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgIE1FU1NBR0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworLyogVGhlIGZvbGxvd2luZyB0eXBlcyBhcmUgb3BhcXVlICovCitzdHJ1Y3QJbXNnOwkvKiBBIG1lc3NhZ2U6IGNvbW1hbmQgd2l0aCBjaGlsZHJlbiBBVlBzIChwb3NzaWJseSBncmFuZCBjaGlsZHJlbikgKi8KK3N0cnVjdAlhdnA7CS8qIEFWUCBvYmplY3QgKi8KKworLyogU29tZSBkZXRhaWxzIGFib3V0IGNoYWluaW5nOgorICoKKyAqICBBIG1lc3NhZ2UgaXMgbWFkZSBvZiBhIGhlYWRlciAoIG1zZyApIGFuZCAwIG9yIG1vcmUgQVZQcyAoIGF2cCApLgorICogVGhlIHN0cnVjdHVyZSBpcyBhIGtpbmQgb2YgdHJlZSwgd2hlcmUgc29tZSBBVlBzIChncm91cGVkIEFWUHMpIGNhbiBjb250YWluIG90aGVyIEFWUHMuCisgKiBFeGFtcGxlOgorICogbXNnCisgKiAgfC1hdnAKKyAqICB8LWdhdnAKKyAqICB8ICAgfC1hdnAKKyAqICB8ICAgfC1hdnAKKyAqICB8ICAgXC1hdnAKKyAqICB8LWF2cAorICogIFwtYXZwCisgKgorICovCisKKy8qIFRoZSBmb2xsb3dpbmcgdHlwZSBpcyB1c2VkIHRvIHBvaW50IHRvIGVpdGhlciBhIG1zZyBvciBhbiBBVlAgKi8KK3R5cGVkZWYgdm9pZCBtc2dfb3JfYXZwOworCisvKiBUaGUgRGlhbWV0ZXIgcHJvdG9jb2wgdmVyc2lvbiAqLworI2RlZmluZSBESUFNRVRFUl9WRVJTSU9OCTEKKworLyogSW4gdGhlIHR3byBmb2xsb3dpbmcgdHlwZXMsIHNvbWUgZmllbGRzIGFyZSBtYXJrZWQgKFJFQURPTkxZKS4gCisgKiBUaGlzIG1lYW5zIHRoYXQgdGhlIGNvbnRlbnQgb2YgdGhlc2UgZmllbGRzIHdpbGwgYmUgb3ZlcndyaXR0ZW4gYnkgdGhlIGRhZW1vbiBzbyBtb2RpZnlpbmcgaXQgaXMgdXNlbGVzcy4KKyAqLworCisvKiBUaGUgZm9sbG93aW5nIHN0cnVjdHVyZSByZXByZXNlbnRzIHRoZSBoZWFkZXIgb2YgYSBtZXNzYWdlLiBBbGwgZGF0YSBpcyBpbiBob3N0IGJ5dGUgb3JkZXIuICovCitzdHJ1Y3QgbXNnX2hkciB7CisJdWludDhfdAkJIG1zZ192ZXJzaW9uOwkJLyogKFJFQURPTkxZKSBWZXJzaW9uIG9mIERpYW1ldGVyOiBtdXN0IGJlIERJQU1FVEVSX1ZFUlNJT04uICovCisJdWludDMyX3QJIG1zZ19sZW5ndGg7CQkvKiAoUkVBRE9OTFkpKDMgYnl0ZXMpIGluZGljYXRlcyB0aGUgbGVuZ3RoIG9mIHRoZSBtZXNzYWdlICovCisJdWludDhfdAkJIG1zZ19mbGFnczsJCS8qIE1lc3NhZ2UgZmxhZ3M6IENNRF9GTEFHXyogKi8KKwljb21tYW5kX2NvZGVfdAkgbXNnX2NvZGU7CQkvKiAoMyBieXRlcykgdGhlIGNvbW1hbmQtY29kZS4gU2VlIGRpY3Rpb25hcnktYXBpLmggZm9yIG1vcmUgZGV0YWlsICovCisJYXBwbGljYXRpb25faWRfdCBtc2dfYXBwbDsJCS8qIFRoZSBhcHBsaWNhdGlvbiBpc3N1aW5nIHRoaXMgbWVzc2FnZSAqLworCXVpbnQzMl90CSBtc2dfaGJoaWQ7CQkvKiBUaGUgSG9wLWJ5LUhvcCBpZGVudGlmaWVyIG9mIHRoZSBtZXNzYWdlICovCisJdWludDMyX3QJIG1zZ19ldGVpZDsJCS8qIFRoZSBFbmQtdG8tRW5kIGlkZW50aWZpZXIgb2YgdGhlIG1lc3NhZ2UgKi8KK307CisKKy8qIFRoZSBmb2xsb3dpbmcgc3RydWN0dXJlIHJlcHJlc2VudHMgdGhlIHZpc2libGUgY29udGVudCBvZiBhbiBBVlAuIEFsbCBkYXRhIGlzIGluIGhvc3QgYnl0ZSBvcmRlci4gKi8KK3N0cnVjdCBhdnBfaGRyIHsKKwlhdnBfY29kZV90CSBhdnBfY29kZTsJCS8qIHRoZSBBVlAgQ29kZSAqLworCXVpbnQ4X3QJCSBhdnBfZmxhZ3M7CQkvKiBBVlBfRkxBR18qIGZsYWdzICovCisJdWludDMyX3QJIGF2cF9sZW47CQkvKiAoUkVBRE9OTFkpKE9ubHkgMyBieXRlcyBhcmUgdXNlZCkgdGhlIGxlbmd0aCBvZiB0aGUgQVZQIGFzIGRlc2NyaWJlZCBpbiB0aGUgUkZDICovCisJdmVuZG9yX2lkX3QJIGF2cF92ZW5kb3I7CQkvKiBPbmx5IHVzZWQgaWYgQVZQX0ZMQUdfVkVORE9SIGlzIHByZXNlbnQgKi8KKwl1bmlvbiBhdnBfdmFsdWUgKmF2cF92YWx1ZTsJCS8qIHBvaW50ZXIgdG8gdGhlIHZhbHVlIG9mIHRoZSBBVlAuIE5VTEwgbWVhbnMgdGhhdCB0aGUgdmFsdWUgaXMgbm90IHNldCAvIG5vdCB1bmRlcnN0b29kLgorCQkJCQkJICAgT25lIHNob3VsZCBub3QgZGlyZWN0bHkgY2hhbmdlIHRoaXMgdmFsdWUuIFVzZSB0aGUgbXNnX2F2cF9zZXR2YWx1ZSBmdW5jdGlvbiBpbnN0ZWFkLgorCQkJCQkJICAgVGhlIGNvbnRlbnQgb2YgdGhlIHBvaW50ZWQgc3RydWN0dXJlIGNhbiBiZSBjaGFuZ2VkIGRpcmVjdGx5LCB3aXRoIHRoaXMgcmVzdHJpY3Rpb246CisJCQkJCQkgICAgIGlmIHRoZSBBVlAgaXMgYW4gT2N0ZXRTdHJpbmcsIGFuZCB5b3UgY2hhbmdlIHRoZSB2YWx1ZSBvZiB0aGUgcG9pbnRlciBhdnBfdmFsdWUtPm9zLmRhdGEsIHRoZW4KKwkJCQkJCSAgICAgeW91IG11c3QgY2FsbCBmcmVlKCkgb24gdGhlIHByZXZpb3VzIHZhbHVlLCBhbmQgdGhlIG5ldyBvbmUgbXVzdCBiZSBmcmVlKCktYWJsZS4KKwkJCQkJCSAqLworfTsKKworLyogVGhlIGZvbGxvd2luZyBlbnVtIGlzIHVzZWQgdG8gYnJvd3NlIGluc2lkZSBtZXNzYWdlIGhpZXJhcmNoeSAobXNnLCBnYXZwLCBhdnApICovCitlbnVtIG1zZ19icndfZGlyIHsKKwlNU0dfQlJXX05FWFQgPSAxLAkvKiBHZXQgdGhlIG5leHQgZWxlbWVudCBhdCB0aGUgc2FtZSBsZXZlbCwgb3IgTlVMTCBpZiB0aGlzIGlzIHRoZSBsYXN0IGVsZW1lbnQuICovCisJTVNHX0JSV19QUkVWLAkJLyogR2V0IHRoZSBwcmV2aW91cyBlbGVtZW50IGF0IHRoZSBzYW1lIGxldmVsLCBvciBOVUxMIGlmIHRoaXMgaXMgdGhlIGZpcnN0IGVsZW1lbnQuICovCisJTVNHX0JSV19GSVJTVF9DSElMRCwJLyogR2V0IHRoZSBmaXJzdCBjaGlsZCBBVlAgb2YgdGhpcyBlbGVtZW50LCBpZiBhbnkuICovCisJTVNHX0JSV19MQVNUX0NISUxELAkvKiBHZXQgdGhlIGxhc3QgY2hpbGQgQVZQIG9mIHRoaXMgZWxlbWVudCwgaWYgYW55LiAqLworCU1TR19CUldfUEFSRU5ULAkJLyogR2V0IHRoZSBwYXJlbnQgZWxlbWVudCBvZiB0aGlzIGVsZW1lbnQsIGlmIGFueS4gT25seSB0aGUgbXNnX3Qgb2JqZWN0IGhhcyBubyBwYXJlbnQuICovCisJTVNHX0JSV19XQUxLCQkvKiBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gRklSU1RfQ0hJTEQgb3IgTkVYVCBvciBQQVJFTlQtPm5leHQsIGZpcnN0IHRoYXQgaXMgbm90IE5VTEwuIFVzZSB0aGlzIHRvIHdhbGsgaW5zaWRlIGFsbCBBVlBzLiAqLworfTsKKworLyogU29tZSBmbGFncyB1c2VkIGluIHRoZSBmdW5jdGlvbnMgYmVsb3cgKi8KKyNkZWZpbmUgQVZQRkxfU0VUX0JMQU5LX1ZBTFVFCSAgIDB4MDEJLyogV2hlbiBjcmVhdGluZyBhbiBBVlAsIGluaXRpYWxpemUgaXRzIHZhbHVlIHRvIGEgYmxhbmsgYXJlYSAqLworI2RlZmluZSBBVlBGTF9TRVRfUkFXREFUQV9GUk9NX0FWUCAweDAyIC8qIFdoZW4gY3JlYXRpbmcgYW4gQVZQLCBpbml0aWFsaXplIGl0cyByYXdkYXRhIGFyZWEgZnJvbSBhbiBleGlzdGluZyBBVlAgLS0gaXQgaXMgb25seSBibGFuayBwYWRkaW5nIChmb3IgZXJyb3IgcmVwb3J0aW5nKSAqLworI2RlZmluZSBBVlBGTF9NQVgJCSAgIEFWUEZMX1NFVF9SQVdEQVRBX0ZST01fQVZQCS8qIFRoZSBiaWdnZXN0IHZhbGlkIGZsYWcgdmFsdWUgKi8KKwkKKyNkZWZpbmUgTVNHRkxfQUxMT0NfRVRFSUQJMHgwMQkvKiBXaGVuIGNyZWF0aW5nIGEgbWVzc2FnZSwgYSBuZXcgZW5kLXRvLWVuZCBJRCBpcyBhbGxvY2F0ZWQgYW5kIHNldCBpbiB0aGUgbWVzc2FnZSAqLworI2RlZmluZSBNU0dGTF9BTlNXX0VSUk9SCTB4MDIJLyogV2hlbiBjcmVhdGluZyBhbiBhbnN3ZXIgbWVzc2FnZSwgc2V0IHRoZSAnRScgYml0IGFuZCB1c2UgdGhlIGdlbmVyaWMgZXJyb3IgQUJORiBpbnN0ZWFkIG9mIGNvbW1hbmQtc3BlY2lmaWMgQUJORiAqLworI2RlZmluZSBNU0dGTF9BTlNXX05PU0lECTB4MDQJLyogV2hlbiBjcmVhdGluZyBhbiBhbnN3ZXIgbWVzc2FnZSwgZG8gbm90IGFkZCB0aGUgU2Vzc2lvbi1JZCBldmVuIGlmIHByZXNlbnQgaW4gcmVxdWVzdCAqLworI2RlZmluZSBNU0dGTF9BTlNXX05PUFJPWFlJTkZPCTB4MDgJLyogV2hlbiBjcmVhdGluZyBhbiBhbnN3ZXIgbWVzc2FnZSwgZG8gbm90IGFkZCB0aGUgUHJveHktSW5mbyBBVlBzIHByZXNlbnRzIGluIHJlcXVlc3QgKi8KKyNkZWZpbmUgTVNHRkxfTUFYCQlNU0dGTF9BTlNXX05PUFJPWFlJTkZPCS8qIFRoZSBiaWdnZXN0IHZhbGlkIGZsYWcgdmFsdWUgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICBNZXNzYWdlIGNyZWF0aW9uLCBtYW5pcHVsYXRpb24sIGRpc3Bvc2FsICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIEZVTkNUSU9OOglmZF9tc2dfYXZwX25ldworICoKKyAqIFBBUkFNRVRFUlM6CisgKiAgbW9kZWwgCTogUG9pbnRlciB0byBhIERJQ1RfQVZQIGRpY3Rpb25hcnkgb2JqZWN0IGRlc2NyaWJpbmcgdGhlIGF2cCB0byBjcmVhdGUsIG9yIE5VTEwgaWYgZmxhZ3MgYXJlIHVzZWQuCisgKiAgZmxhZ3MJOiBGbGFncyB0byB1c2UgaW4gY3JlYXRpb24gKEFWUEZMXyosIHNlZSBhYm92ZSkuCisgKiAgYXZwIAk6IFVwb24gc3VjY2VzcywgcG9pbnRlciB0byB0aGUgbmV3IGF2cCBpcyBzdG9yZWQgaGVyZS4gSXQgcG9pbnRzIHRvIHJlZmVyZW5jZSBBVlAgdXBvbiBmdW5jdGlvbiBjYWxsIHdoZW4gZmxhZ3MgYXJlIHVzZWQuCisgKgorICogREVTQ1JJUFRJT046IAorICogICBDcmVhdGUgYSBuZXcgQVZQIGluc3RhbmNlLgorICoKKyAqIFJFVFVSTiBWQUxVRToKKyAqICAwICAgICAgCTogVGhlIEFWUCBpcyBjcmVhdGVkLgorICogIEVJTlZBTCAJOiBBIHBhcmFtZXRlciBpcyBpbnZhbGlkLgorICogIChvdGhlciBzdGFuZGFyZCBlcnJvcnMgbWF5IGJlIHJldHVybmVkLCB0b28sIHdpdGggdGhlaXIgc3RhbmRhcmQgbWVhbmluZy4gRXhhbXBsZToKKyAqICAgIEVOT01FTSAJOiBNZW1vcnkgYWxsb2NhdGlvbiBmb3IgdGhlIG5ldyBhdnAgZmFpbGVkLikKKyAqLworaW50IGZkX21zZ19hdnBfbmV3ICggc3RydWN0IGRpY3Rfb2JqZWN0ICogbW9kZWwsIGludCBmbGFncywgc3RydWN0IGF2cCAqKiBhdnAgKTsKKworLyoKKyAqIEZVTkNUSU9OOglmZF9tc2dfbmV3CisgKgorICogUEFSQU1FVEVSUzoKKyAqICBtb2RlbCAJOiBQb2ludGVyIHRvIGEgRElDVF9DT01NQU5EIGRpY3Rpb25hcnkgb2JqZWN0IGRlc2NyaWJpbmcgdGhlIG1lc3NhZ2UgdG8gY3JlYXRlLCBvciBOVUxMLgorICogIGZsYWdzCTogY29tYmluYXRpb24gb2YgTVNHRkxfKiBmbGFncy4KKyAqICBtc2cgCTogVXBvbiBzdWNjZXNzLCBwb2ludGVyIHRvIHRoZSBuZXcgbWVzc2FnZSBpcyBzdG9yZWQgaGVyZS4KKyAqCisgKiBERVNDUklQVElPTjogCisgKiAgIENyZWF0ZSBhIG5ldyBlbXB0eSBEaWFtZXRlciBtZXNzYWdlLiAKKyAqCisgKiBSRVRVUk4gVkFMVUU6CisgKiAgMCAgICAgIAk6IFRoZSBtZXNzYWdlIGlzIGNyZWF0ZWQuCisgKiAgRUlOVkFMIAk6IEEgcGFyYW1ldGVyIGlzIGludmFsaWQuCisgKiAgKG90aGVyIHN0YW5kYXJkIGVycm9ycyBtYXkgYmUgcmV0dXJuZWQsIHRvbywgd2l0aCB0aGVpciBzdGFuZGFyZCBtZWFuaW5nLiBFeGFtcGxlOgorICogICAgRU5PTUVNIAk6IE1lbW9yeSBhbGxvY2F0aW9uIGZvciB0aGUgbmV3IG1lc3NhZ2UgZmFpbGVkLikKKyAqLworaW50IGZkX21zZ19uZXcgKCBzdHJ1Y3QgZGljdF9vYmplY3QgKiBtb2RlbCwgaW50IGZsYWdzLCBzdHJ1Y3QgbXNnICoqIG1zZyApOworaW50IGZkX21zZ19uZXdfYXBwbCAoIHN0cnVjdCBkaWN0X29iamVjdCAqIG1vZGVsLCBzdHJ1Y3QgZGljdF9vYmplY3QgKiBhcHBsLCBpbnQgZmxhZ3MsIHN0cnVjdCBtc2cgKiogbXNnICk7CisKKy8qCisgKiBGVU5DVElPTjoJbXNnX25ld19hbnN3ZXJfZnJvbV9yZXEKKyAqCisgKiBQQVJBTUVURVJTOgorICogIGRpY3QJOiBQb2ludGVyIHRvIHRoZSBkaWN0aW9uYXJ5IGNvbnRhaW5pbmcgdGhlIG1vZGVsIG9mIHRoZSBxdWVyeS4KKyAqICBtc2cJCTogVGhlIGxvY2F0aW9uIG9mIHRoZSBxdWVyeSBvbiBmdW5jdGlvbiBjYWxsLiBVcGRhdGVkIGJ5IHRoZSBsb2NhdGlvbiBvZiBhbnN3ZXIgbWVzc2FnZSBvbiByZXR1cm4uCisgKiAgZmxhZyAgICAgICAgOiBQYXNzIE1TR0ZMX0FOU1dfRVJST1IgdG8gaW5kaWNhdGUgaWYgdGhlIGFuc3dlciBpcyBhbiBlcnJvciBtZXNzYWdlICh3aWxsIHNldCB0aGUgJ0UnIGJpdCkKKyAqICAgICAgICAgICAgICA6IFNlZSBvdGhlciBNU0dGTF9BTlNXXyogZGVmaW5pdGlvbiBhYm92ZSBmb3Igb3RoZXIgZmxhZ3MuCisgKgorICogREVTQ1JJUFRJT046IAorICogICBUaGlzIGZ1bmN0aW9uIGNyZWF0ZXMgdGhlIGVtcHR5IGFuc3dlciBtZXNzYWdlIGNvcnJlc3BvbmRpbmcgdG8gYSByZXF1ZXN0LgorICogIFRoZSBoZWFkZXIgaXMgc2V0IHByb3Blcmx5IChSIGZsYWcsIGNjb2RlLCBhcHBpZCwgaGJoaWQsIGV0ZWlkKQorICogIFRoZSBTZXNzaW9uLUlkIEFWUCBpcyBjb3BpZWQgaWYgcHJlc2VudC4KKyAqICBUaGUgY2FsbGluZyBjb2RlIHNob3VsZCB1c3VhbGx5IGNhbGwgZmRfbXNnX3Jlc2NvZGVfc2V0IGZ1bmN0aW9uIG9uIHRoZSBhbnN3ZXIuCisgKiAgVXBvbiByZXR1cm4sIHRoZSBvcmlnaW5hbCBxdWVyeSBtYXkgYmUgcmV0cmlldmVkIGJ5IGNhbGxpbmcgZmRfbXNnX2Fuc3dfZ2V0cSBvbiB0aGUgbWVzc2FnZS4KKyAqCisgKiBSRVRVUk4gVkFMVUU6CisgKiAgMCAgICAgIAk6IE9wZXJhdGlvbiBjb21wbGV0ZS4KKyAqICAhMCAgICAgIAk6IGFuIGVycm9yIG9jY3VycmVkLgorICovCitpbnQgZmRfbXNnX25ld19hbnN3ZXJfZnJvbV9yZXEgKCBzdHJ1Y3QgZGljdGlvbmFyeSAqIGRpY3QsIHN0cnVjdCBtc2cgKiogbXNnLCBpbnQgZmxhZyApOworCisvKgorICogRlVOQ1RJT046CWZkX21zZ19icm93c2UKKyAqCisgKiBQQVJBTUVURVJTOgorICogIHJlZmVyZW5jZSAJOiBQb2ludGVyIHRvIGEgc3RydWN0IG1zZyBvciBzdHJ1Y3QgYXZwLgorICogIGRpciAgICAgICAgIDogRGlyZWN0aW9uIGZvciBicm93c2luZworICogIGZvdW5kICAgICAgIDogSWYgbm90IE5VTEwsIHVwZGF0ZWQgd2l0aCB0aGUgZWxlbWVudCB0aGF0IGhhcyBiZWVuIGZvdW5kLCBpZiBhbnksIG9yIE5VTEwgaWYgbm8gZWxlbWVudCB3YXMgZm91bmQgLyBhbiBlcnJvciBvY2N1cnJlZC4KKyAqICBkZXB0aAk6IElmIG5vdCBOVUxMLCBwb2ludHMgdG8gYW4gaW50ZWdlciByZXByZXNlbnRpbmcgdGhlICJkZXB0aCIgb2YgdGhpcyBvYmplY3QgaW4gdGhlIHRyZWUuIFRoaXMgaXMgYSByZWxhdGl2ZSB2YWx1ZSwgdXBkYXRlZCBvbiByZXR1cm4uCisgKgorICogREVTQ1JJUFRJT046IAorICogICBFeHBsb3JlIHRoZSBjb250ZW50IG9mIGEgbWVzc2FnZSBvYmplY3QgKGhpZXJhcmNoeSkuIElmICJmb3VuZCIgaXMgbnVsbCwgb25seSBlcnJvciBjaGVja2luZyBpcyBwZXJmb3JtZWQuCisgKiAgSWYgImRlcHRoIiBpcyBwcm92aWRlZCwgaXQgaXMgdXBkYXRlZCBhcyBmb2xsb3cgb24gc3VjY2Vzc2Z1bCBmdW5jdGlvbiByZXR1cm46CisgKiAgIC0gbm90IG1vZGlmaWVkIGZvciBNU0dfQlJXX05FWFQgYW5kIE1TR19CUldfUFJFVi4KKyAqICAgLSAqZGVwdGggPSAqZGVwdGggKyAxIGZvciBNU0dfQlJXX0ZJUlNUX0NISUxEIGFuZCBNU0dfQlJXX0xBU1RfQ0hJTEQuCisgKiAgIC0gKmRlcHRoID0gKmRlcHRoIC0gMSBmb3IgTVNHX0JSV19QQVJFTlQuCisgKiAgIC0gKmRlcHRoID0gKmRlcHRoICsgWCBmb3IgTVNHX0JSV19XQUxLLCB3aXRoIFggYmV0d2VlbiAxIChyZXR1cm5lZCB0aGUgMXN0IGNoaWxkKSBhbmQgLU4gKHJldHVybmVkIHRoZSBOdGggcGFyZW50J3MgbmV4dCkuCisgKgorICogUkVUVVJOIFZBTFVFOgorICogIDAgICAgICAJOiBmb3VuZCBoYXMgYmVlbiB1cGRhdGVkIChpZiBub24gTlVMTCkuCisgKiAgRUlOVkFMIAk6IEEgcGFyYW1ldGVyIGlzIGludmFsaWQuCisgKiAgRU5PRU5UCTogTm8gZWxlbWVudCBoYXMgYmVlbiBmb3VuZCB3aGVyZSByZXF1ZXN0ZWQsIGFuZCAiZm91bmQiIHdhcyBOVUxMIChvdGhlcndpc2UsICpmb3VuZCBpcyBzZXQgdG8gTlVMTCBhbmQgMCBpcyByZXR1cm5lZCkuIAorICovCitpbnQgZmRfbXNnX2Jyb3dzZV9pbnRlcm5hbCAoIG1zZ19vcl9hdnAgKiByZWZlcmVuY2UsIGVudW0gbXNnX2Jyd19kaXIgZGlyLCBtc2dfb3JfYXZwICoqIGZvdW5kLCBpbnQgKiBkZXB0aCApOworLyogTWFjcm8gdG8gYXZvaWQgaGF2aW5nIHRvIGNhc3QgdGhlIHRoaXJkIHBhcmFtZXRlciBldmVyeXdoZXJlICovCisjZGVmaW5lIGZkX21zZ19icm93c2UoIHJlZiwgZGlyLCBmb3VuZCwgZGVwdGggKQlcCisJZmRfbXNnX2Jyb3dzZV9pbnRlcm5hbCggKHJlZiksIChkaXIpLCAodm9pZCAqKShmb3VuZCksIChkZXB0aCkgKQorCisKKy8qCisgKiBGVU5DVElPTjoJZmRfbXNnX2F2cF9hZGQKKyAqCisgKiBQQVJBTUVURVJTOgorICogIHJlZmVyZW5jZSAJOiBQb2ludGVyIHRvIGEgdmFsaWQgbXNnIG9yIGF2cC4KKyAqICBkaXIgICAgICAgICA6IGxvY2F0aW9uIHdoZXJlIHRoZSBuZXcgQVZQIHNob3VsZCBiZSBpbnNlcnRlZCwgcmVsYXRpdmUgdG8gdGhlIHJlZmVyZW5jZS4gTVNHX0JSV19QQVJFTlQgYW5kIE1TR19CUldfV0FMSyBhcmUgbm90IHZhbGlkLgorICogIGF2cCAgICAgICAgIDogcG9pbnRlciB0byB0aGUgQVZQIG9iamVjdCB0aGF0IG11c3QgYmUgaW5zZXJ0ZWQuCisgKgorICogREVTQ1JJUFRJT046IAorICogICBBZGRzIGFuIEFWUCBpbnRvIGFuIG9iamVjdCB0aGF0IGNhbiBjb250YWluIGl0OiBncm91cGVkIEFWUCBvciBtZXNzYWdlLgorICogTm90ZSB0aGF0IHRoZSBhZGRlZCBBVlAgd2lsbCBiZSBmcmVlZCBhdCB0aGUgc2FtZSB0aW1lIGFzIHRoZSBvYmplY3QgaXQgaXMgYWRkZWQgdG8sIAorICogc28gaXQgc2hvdWxkIG5vdCBiZSBmcmVlZCBhZnRlciB0aGUgY2FsbCB0byB0aGlzIGZ1bmN0aW9uLgorICoKKyAqIFJFVFVSTiBWQUxVRToKKyAqICAwICAgICAgCTogVGhlIEFWUCBoYXMgYmVlbiBhZGRlZC4KKyAqICBFSU5WQUwgCTogQSBwYXJhbWV0ZXIgaXMgaW52YWxpZC4KKyAqLworaW50IGZkX21zZ19hdnBfYWRkICggbXNnX29yX2F2cCAqIHJlZmVyZW5jZSwgZW51bSBtc2dfYnJ3X2RpciBkaXIsIHN0cnVjdCBhdnAgKmF2cCk7CisKKy8qCisgKiBGVU5DVElPTjoJZmRfbXNnX3NlYXJjaF9hdnAKKyAqCisgKiBQQVJBTUVURVJTOgorICogIG1zZyAJOiBUaGUgbWVzc2FnZSBzdHJ1Y3R1cmUgaW4gd2hpY2ggdG8gc2VhcmNoIHRoZSBBVlAuCisgKiAgd2hhdCAJOiBUaGUgZGljdGlvbmFyeSBtb2RlbCBvZiB0aGUgQVZQIHRvIHNlYXJjaC4KKyAqICBhdnAJCTogbG9jYXRpb24gd2hlcmUgdGhlIEFWUCByZWZlcmVuY2UgaXMgc3RvcmVkIGlmIGZvdW5kLgorICoKKyAqIERFU0NSSVBUSU9OOiAKKyAqICAgU2VhcmNoIHRoZSBmaXJzdCB0b3AtbGV2ZWwgQVZQIG9mIGEgZ2l2ZW4gbW9kZWwgaW5zaWRlIGEgbWVzc2FnZS4KKyAqIE5vdGU6IG9ubHkgdGhlIGZpcnN0IGluc3RhbmNlIG9mIHRoZSBBVlAgaXMgcmV0dXJuZWQgYnkgdGhpcyBmdW5jdGlvbi4KKyAqIE5vdGU6IG9ubHkgdG9wLWxldmVsIEFWUHMgYXJlIHNlYXJjaGVkLCBub3QgaW5zaWRlIGdyb3VwZWQgQVZQcy4KKyAqIFVzZSBtc2dfYnJvd3NlIGlmIHlvdSBuZWVkIG1vcmUgYWR2YW5jZWQgcmVzZWFyY2ggZmVhdHVyZXMuCisgKgorICogUkVUVVJOIFZBTFVFOgorICogIDAgICAgICAJOiBUaGUgQVZQIGhhcyBiZWVuIGZvdW5kLgorICogIEVJTlZBTCAJOiBBIHBhcmFtZXRlciBpcyBpbnZhbGlkLgorICogIEVOT0VOVAk6IE5vIEFWUCBoYXMgYmVlbiBmb3VuZCwgYW5kICJhdnAiIHdhcyBOVUxMIChvdGhlcndpc2UsICphdnAgaXMgc2V0IHRvIE5VTEwgYW5kIDAgcmV0dXJuZWQpLgorICovCitpbnQgZmRfbXNnX3NlYXJjaF9hdnAgKCBzdHJ1Y3QgbXNnICogbXNnLCBzdHJ1Y3QgZGljdF9vYmplY3QgKiB3aGF0LCBzdHJ1Y3QgYXZwICoqIGF2cCApOworCisvKgorICogRlVOQ1RJT046CWZkX21zZ19mcmVlCisgKgorICogUEFSQU1FVEVSUzoKKyAqICBvYmplY3QgICAgICA6IHBvaW50ZXIgdG8gdGhlIG1lc3NhZ2Ugb3IgQVZQIG9iamVjdCB0aGF0IG11c3QgYmUgdW5saW5rZWQgYW5kIGZyZWVkLgorICoKKyAqIERFU0NSSVBUSU9OOiAKKyAqICAgVW5saW5rIGFuZCBmcmVlIGEgbWVzc2FnZSBvciBBVlAgb2JqZWN0IGFuZCBpdHMgY2hpbGRyZW4uCisgKiAgSWYgdGhlIG9iamVjdCBpcyBhbiBBVlAgbGlua2VkIGludG8gYSBtZXNzYWdlLCB0aGUgQVZQIGlzIHJlbW92ZWQgYmVmb3JlIGJlaW5nIGZyZWVkLgorICoKKyAqIFJFVFVSTiBWQUxVRToKKyAqICAwICAgICAgCTogVGhlIG1lc3NhZ2UgaGFzIGJlZW4gZnJlZWQuCisgKiAgRUlOVkFMIAk6IEEgcGFyYW1ldGVyIGlzIGludmFsaWQuCisgKi8KK2ludCBmZF9tc2dfZnJlZSAoIG1zZ19vcl9hdnAgKiBvYmplY3QgKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgRHVtcCBmdW5jdGlvbnMgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIEZVTkNUSU9OOglmZF9tc2dfZHVtcF8qCisgKgorICogUEFSQU1FVEVSUzoKKyAqICBzZWUgZGVmaW5pdGlvbiBvZiBERUNMQVJFX0ZEX0RVTVBfUFJPVE9UWVBFLAorICogIG9iagkJIDogQSBtc2cgb3IgYXZwIG9iamVjdCB0byBkdW1wLgorICogIGRpY3QgICAgICAgICA6IHRoZSBkaWN0aW9uYXJ5IHRvIHVzZSBpZiBwYXJzaW5nIGlzIHJlcXVlc3RlZCAob3B0aW9uYWwpCisgKiAgZm9yY2VfcGFyc2luZzogYnkgZGVmYXVsdCB0aGVzZSBmdW5jdGlvbnMgZG8gbm90IHBhcnNlIHRoZSBvYmplY3QgYnV0IGR1bXAgaGV4YSB2YWx1ZXMgaW4gdGhhdCBjYXNlLgorICogICAgICAgICAgICAgICAgIHVzZSAhMCB0byBmb3JjZSBwYXJzaW5nLiBJZiBwYXJzaW5nIGZhaWxzLCB0aGUgaGV4YSBkdW1wIGlzIHN0aWxsIHByb3ZpZGVkLgorICogIHJlY3Vyc2UgICAgICA6IGFsbG93IHRoZSBmdW5jdGlvbiB0byBnbyB0aHJvdWdoIHRoZSBjaGlsZHJlbiBvYmplY3RzIGlmIGFueSB0byBkdW1wIG1vcmUgaW5mb3JtYXRpb24uIG1pZ2h0IHJlcXVpcmUgcGFyc2luZy4KKyAqCisgKiBERVNDUklQVElPTjogCisgKiAgIFRoZXNlIGZ1bmN0aW9ucyBkdW1wIHRoZSBjb250ZW50IG9mIGEgbWVzc2FnZSBvciBhdnAgaW50byBhIGJ1ZmZlcgorICogZWl0aGVyIHJlY3Vyc2l2ZWx5IG9yIG9ubHkgdGhlIG9iamVjdCBpdHNlbGYuCisgKgorICogUkVUVVJOIFZBTFVFOgorICogICAtIHNlZSBERUNMQVJFX0ZEX0RVTVBfUFJPVE9UWVBFLAorICovCisvKiBvbmUtbGluZSBkdW1wIHdpdGggb25seSBzaG9ydCBpbmZvcm1hdGlvbiAqLworREVDTEFSRV9GRF9EVU1QX1BST1RPVFlQRSggZmRfbXNnX2R1bXBfc3VtbWFyeSwgbXNnX29yX2F2cCAqb2JqLCBzdHJ1Y3QgZGljdGlvbmFyeSAqZGljdCwgaW50IGZvcmNlX3BhcnNpbmcsIGludCByZWN1cnNlICk7CisvKiBvbmUtbGluZSBkdW1wIHdpdGggYWxsIHRoZSBjb250ZW50cyBvZiB0aGUgbWVzc2FnZSAqLworREVDTEFSRV9GRF9EVU1QX1BST1RPVFlQRSggZmRfbXNnX2R1bXBfZnVsbCwgbXNnX29yX2F2cCAqb2JqLCBzdHJ1Y3QgZGljdGlvbmFyeSAqZGljdCwgaW50IGZvcmNlX3BhcnNpbmcsIGludCByZWN1cnNlICk7CisvKiBtdWx0aS1saW5lIGh1bWFuLXJlYWRhYmxlIGR1bXAgc2ltaWxhciB0byB3aXJlc2hhcmsgb3V0cHV0ICovCitERUNMQVJFX0ZEX0RVTVBfUFJPVE9UWVBFKCBmZF9tc2dfZHVtcF90cmVldmlldywgbXNnX29yX2F2cCAqb2JqLCBzdHJ1Y3QgZGljdGlvbmFyeSAqZGljdCwgaW50IGZvcmNlX3BhcnNpbmcsIGludCByZWN1cnNlICk7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgTWVzc2FnZSBtZXRhZGF0YSBtYW5hZ2VtZW50IGZ1bmN0aW9ucyAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIEZVTkNUSU9OOglmZF9tc2dfbW9kZWwKKyAqCisgKiBQQVJBTUVURVJTOgorICogIHJlZmVyZW5jZSAJOiBQb2ludGVyIHRvIGEgdmFsaWQgbXNnIG9yIGF2cC4KKyAqICBtb2RlbCAgICAgICA6IG9uIHN1Y2Nlc3MsIHBvaW50ZXIgdG8gdGhlIGRpY3Rpb25hcnkgbW9kZWwgb2YgdGhpcyBjb21tYW5kIG9yIEFWUC4gTlVMTCBpZiB0aGUgbW9kZWwgaXMgdW5rbm93bi4KKyAqCisgKiBERVNDUklQVElPTjogCisgKiAgIFJldHJpZXZlIHRoZSBkaWN0aW9uYXJ5IG9iamVjdCBkZXNjcmliaW5nIHRoaXMgbWVzc2FnZSBvciBhdnAuIElmIHRoZSBvYmplY3QgaXMgdW5rbm93biBvciB0aGUgZmRfbXNnX3BhcnNlX2RpY3QgaGFzIG5vdCBiZWVuIGNhbGxlZCwKKyAqICAqbW9kZWwgaXMgc2V0IHRvIE5VTEwuCisgKgorICogUkVUVVJOIFZBTFVFOgorICogIDAgICAgICAJOiBUaGUgbW9kZWwgaGFzIGJlZW4gc2V0LgorICogIEVJTlZBTCAJOiBBIHBhcmFtZXRlciBpcyBpbnZhbGlkLgorICovCitpbnQgZmRfbXNnX21vZGVsICggbXNnX29yX2F2cCAqIHJlZmVyZW5jZSwgc3RydWN0IGRpY3Rfb2JqZWN0ICoqIG1vZGVsICk7CisKKy8qCisgKiBGVU5DVElPTjoJZmRfbXNnX2hkcgorICoKKyAqIFBBUkFNRVRFUlM6CisgKiAgbXNnIAk6IFBvaW50ZXIgdG8gYSB2YWxpZCBtZXNzYWdlIG9iamVjdC4KKyAqICBwZGF0YSAJOiBVcG9uIHN1Y2Nlc3MsIHBvaW50ZXIgdG8gdGhlIG1zZ19oZHIgc3RydWN0dXJlIG9mIHRoaXMgbWVzc2FnZS4gVGhlIGZpZWxkcyBtYXkgYmUgbW9kaWZpZWQuCisgKgorICogREVTQ1JJUFRJT046IAorICogICBSZXRyaWV2ZSBsb2NhdGlvbiBvZiBtb2RpZmlhYmxlIHNlY3Rpb24gb2YgYSBtZXNzYWdlLiAKKyAqCisgKiBSRVRVUk4gVkFMVUU6CisgKiAgMCAgICAgIAk6IFRoZSBsb2NhdGlvbiBoYXMgYmVlbiB3cml0dGVuLgorICogIEVJTlZBTCAJOiBBIHBhcmFtZXRlciBpcyBpbnZhbGlkLgorICovCitpbnQgZmRfbXNnX2hkciAoIHN0cnVjdCBtc2cgKm1zZywgc3RydWN0IG1zZ19oZHIgKiogcGRhdGEgKTsKKworLyoKKyAqIEZVTkNUSU9OOglmZF9tc2dfYXZwX2hkcgorICoKKyAqIFBBUkFNRVRFUlM6CisgKiAgYXZwIAk6IFBvaW50ZXIgdG8gYSB2YWxpZCBhdnAgb2JqZWN0LgorICogIHBkYXRhIAk6IFVwb24gc3VjY2VzcywgcG9pbnRlciB0byB0aGUgYXZwX2hkciBzdHJ1Y3R1cmUgb2YgdGhpcyBhdnAuIFRoZSBmaWVsZHMgbWF5IGJlIG1vZGlmaWVkLgorICoKKyAqIERFU0NSSVBUSU9OOiAKKyAqICAgUmV0cmlldmUgbG9jYXRpb24gb2YgbW9kaWZpYWJsZSBkYXRhIG9mIGFuIGF2cC4gCisgKgorICogUkVUVVJOIFZBTFVFOgorICogIDAgICAgICAJOiBUaGUgbG9jYXRpb24gaGFzIGJlZW4gd3JpdHRlbi4KKyAqICBFSU5WQUwgCTogQSBwYXJhbWV0ZXIgaXMgaW52YWxpZC4KKyAqLworaW50IGZkX21zZ19hdnBfaGRyICggc3RydWN0IGF2cCAqYXZwLCBzdHJ1Y3QgYXZwX2hkciAqKiBwZGF0YSApOworCisvKgorICogRlVOQ1RJT046CWZkX21zZ19hbnN3X2Fzc29jaWF0ZSwgZmRfbXNnX2Fuc3dfZ2V0cSwgZmRfbXNnX2Fuc3dfZGV0YWNoCisgKgorICogUEFSQU1FVEVSUzoKKyAqICBhbnN3ZXIJOiB0aGUgcmVjZWl2ZWQgYW5zd2VyIG1lc3NhZ2UKKyAqICBxdWVyeQk6IHRoZSBjb3JyZXNwb25kaW5nIHF1ZXJ5IHRoYXQgaGFkIGJlZW4gc2VudAorICoKKyAqIERFU0NSSVBUSU9OOgorICogIGZkX21zZ19hbnN3X2Fzc29jaWF0ZSBhc3NvY2lhdGVzIGEgcXVlcnkgbXNnIHdpdGggdGhlIHJlY2VpdmVkIGFuc3dlci4gCisgKiBRdWVyeSBpcyByZXRyaWV2ZWQgd2l0aCBmZF9tc2dfYW5zd19nZXRxLgorICogSWYgYW5zd2VyIG1lc3NhZ2UgaXMgZnJlZWQsIHRoZSBxdWVyeSBpcyBhbHNvIGZyZWVkLgorICogSWYgdGhlIG1zZ19hbnN3X2RldGFjaCBmdW5jdGlvbiBpcyBjYWxsZWQsIHRoZSBhc3NvY2lhdGlvbiBpcyByZW1vdmVkLgorICogVGhpcyBpcyBtZWFudCB0byBiZSBjYWxsZWQgZnJvbSB0aGUgZGFlbW9uIG9ubHkuCisgKgorICogUkVUVVJOIFZBTFVFOgorICogIDAgCSAgOiBvaworICogIEVJTlZBTDogYSBwYXJhbWV0ZXIgaXMgaW52YWxpZAorICovCitpbnQgZmRfbXNnX2Fuc3dfYXNzb2NpYXRlKCBzdHJ1Y3QgbXNnICogYW5zd2VyLCBzdHJ1Y3QgbXNnICogcXVlcnkgKTsKK2ludCBmZF9tc2dfYW5zd19nZXRxICAgICAoIHN0cnVjdCBtc2cgKiBhbnN3ZXIsIHN0cnVjdCBtc2cgKiogcXVlcnkgKTsKK2ludCBmZF9tc2dfYW5zd19kZXRhY2ggICAoIHN0cnVjdCBtc2cgKiBhbnN3ZXIgKTsKKworLyoKKyAqIEZVTkNUSU9OOglmZF9tc2dfYW5zY2JfYXNzb2NpYXRlLCBmZF9tc2dfYW5zY2JfZ2V0CisgKgorICogUEFSQU1FVEVSUzoKKyAqICBtc2cJCTogdGhlIHJlcXVlc3QgbWVzc2FnZQorICogIGFuc2NiCTogdGhlIGNhbGxiYWNrIHRvIGFzc29jaWF0ZSB3aXRoIHRoZSBtZXNzYWdlCisgKiAgZGF0YQk6IHRoZSBkYXRhIHRvIHBhc3MgdG8gdGhlIGNhbGxiYWNrCisgKiAgZXhwaXJlY2IgICAgOiB0aGUgZXhwaXJhdGlvbiBjYWxsYmFjayB0byBhc3NvY2lhdGUgd2l0aCB0aGUgbWVzc2FnZQorICogIHRpbWVvdXQgICAgIDogKG9wdGlvbmFsLCB1c2UgTlVMTCBpZiBubyB0aW1lb3V0KSBhIHRpbWVvdXQgYXNzb2NpYXRlZCB3aXRoIGNhbGxpbmcgdGhlIGNiLgorICoKKyAqIERFU0NSSVBUSU9OOgorICogIEFzc29jaWF0ZSBvciByZXRyaWV2ZSBjYWxsYmFja3Mgd2l0aCBhbiBtZXNzYWdlLgorICogVGhpcyBpcyBtZWFudCB0byBiZSBjYWxsZWQgZnJvbSB0aGUgZGFlbW9uIG9ubHkuCisgKgorICogUkVUVVJOIFZBTFVFOgorICogIDAgCSAgOiBvaworICogIEVJTlZBTDogYSBwYXJhbWV0ZXIgaXMgaW52YWxpZAorICovCitpbnQgZmRfbXNnX2Fuc2NiX2Fzc29jaWF0ZSggc3RydWN0IG1zZyAqIG1zZywgdm9pZCAoICphbnNjYikodm9pZCAqLCBzdHJ1Y3QgbXNnICoqKSwgdm9pZCAgKiBkYXRhLCB2b2lkICgqZXhwaXJlY2IpKHZvaWQgKiwgRGlhbUlkX3QsIHNpemVfdCwgc3RydWN0IG1zZyAqKiksIGNvbnN0IHN0cnVjdCB0aW1lc3BlYyAqdGltZW91dCApOworaW50IGZkX21zZ19hbnNjYl9nZXQoIHN0cnVjdCBtc2cgKiBtc2csIHZvaWQgKCoqYW5zY2IpKHZvaWQgKiwgc3RydWN0IG1zZyAqKiksIHZvaWQgKCoqZXhwaXJlY2IpKHZvaWQgKiwgRGlhbUlkX3QsIHNpemVfdCwgc3RydWN0IG1zZyAqKiksIHZvaWQgKiogZGF0YSApOworaW50IGZkX21zZ19hbnNjYl9yZXNldChzdHJ1Y3QgbXNnICogbXNnLCBpbnQgY2xlYXJfYW5zY2IsIGludCBjbGVhcl9leHBpcmVjYik7CitzdHJ1Y3QgdGltZXNwZWMgKmZkX21zZ19hbnNjYl9nZXR0aW1lb3V0KCBzdHJ1Y3QgbXNnICogbXNnICk7IC8qIHJldHVybnMgTlVMTCBvciBhIHZhbGlkIG5vbi0wIHRpbWVzcGVjICovCisKKy8qCisgKiBGVU5DVElPTjoJZmRfbXNnX3J0X2Fzc29jaWF0ZSwgZmRfbXNnX3J0X2dldAorICoKKyAqIFBBUkFNRVRFUlM6CisgKiAgbXNnCQk6IHRoZSBxdWVyeSBtZXNzYWdlIHRvIGJlIHNlbnQKKyAqICBsaXN0CTogdGhlIG9yZGVyZWQgbGlzdCBvZiBwb3NzaWJsZSBuZXh0LXBlZXJzCisgKgorICogREVTQ1JJUFRJT046CisgKiAgQXNzb2NpYXRlIGEgcm91dGluZyBsaXN0IHdpdGggYSBxdWVyeSwgYW5kIHJldHJpZXZlIGl0LgorICogSWYgdGhlIG1lc3NhZ2UgaXMgZnJlZWQsIHRoZSBsaXN0IGlzIGFsc28gZnJlZWQuCisgKgorICogUkVUVVJOIFZBTFVFOgorICogIDAgCSAgOiBvaworICogIEVJTlZBTDogYSBwYXJhbWV0ZXIgaXMgaW52YWxpZAorICovCitpbnQgZmRfbXNnX3J0X2Fzc29jaWF0ZSggc3RydWN0IG1zZyAqIG1zZywgc3RydWN0IHJ0X2RhdGEgKiBydGQgKTsKK2ludCBmZF9tc2dfcnRfZ2V0ICAgICAgKCBzdHJ1Y3QgbXNnICogbXNnLCBzdHJ1Y3QgcnRfZGF0YSAqKiBydGQgKTsKKworLyoKKyAqIEZVTkNUSU9OOglmZF9tc2dfaXNfcm91dGFibGUKKyAqCisgKiBQQVJBTUVURVJTOgorICogIG1zZwkJOiBBIG1zZyBvYmplY3QuCisgKgorICogREVTQ1JJUFRJT046IAorICogICBUaGlzIGZ1bmN0aW9uIHJldHVybnMgYSBib29sZWFuIHRlbGxpbmcgaWYgYSBnaXZlbiBtZXNzYWdlIGlzIHJvdXRhYmxlIGluIHRoZSBEaWFtZXRlciBuZXR3b3JrLCAKKyAqICBvciBpZiBpdCBpcyBhIGxvY2FsIGxpbmsgbWVzc2FnZSBvbmx5IChleDogQ0VSL0NFQSwgRFdSL0RXQSwgLi4uKS4KKyAqCisgKiBSRVRVUk4gVkFMVUU6CisgKiAgMCAgICAgIAk6IFRoZSBtZXNzYWdlIGlzIG5vdCByb3V0YWJsZSAvIGFuIGVycm9yIG9jY3VycmVkLgorICogIDEgICAgICAJOiBUaGUgbWVzc2FnZSBpcyByb3V0YWJsZS4KKyAqLworaW50IGZkX21zZ19pc19yb3V0YWJsZSAoIHN0cnVjdCBtc2cgKiBtc2cgKTsKKworLyoKKyAqIEZVTkNUSU9OOglmZF9tc2dfc291cmNlXyhnL3MpZXQKKyAqCisgKiBQQVJBTUVURVJTOgorICogIG1zZwkJOiBBIG1zZyBvYmplY3QuCisgKiAgZGlhbWlkLGxlbgk6IFRoZSBkaWFtZXRlciBpZCBvZiB0aGUgcGVlciBmcm9tIHdoaWNoIHRoaXMgbWVzc2FnZSB3YXMgcmVjZWl2ZWQuCisgKiAgZGljdAk6IGEgZGljdGlvbmFyeSB3aXRoIGRlZmluaXRpb24gb2YgUm91dGUtUmVjb3JkIEFWUCAoZm9yIGZkX21zZ19zb3VyY2Vfc2V0cnIpCisgKgorICogREVTQ1JJUFRJT046IAorICogICBTdG9yZSBvciByZXRyaWV2ZSB0aGUgZGlhbWV0ZWQgaWQgb2YgdGhlIHBlZXIgZnJvbSB3aGljaCB0aGlzIG1lc3NhZ2Ugd2FzIHJlY2VpdmVkLgorICogV2lsbCBiZSB1c2VkIGZvciBleGFtcGxlIGJ5IHRoZSByb3V0aW5nIG1vZHVsZSB0byBhZGQgdGhlIFJvdXRlLVJlY29yZCBBVlAgaW4gZm9yd2FyZGVkIHJlcXVlc3RzLAorICogb3IgdG8gZGlyZWN0IGFuc3dlcnMgdG8gdGhlIGFwcHJvcHJpYXRlIHBlZXIuCisgKgorICogUkVUVVJOIFZBTFVFOgorICogIDAgICAgICAJOiBPcGVyYXRpb24gY29tcGxldGUuCisgKiAgITAgICAgICAJOiBhbiBlcnJvciBvY2N1cnJlZC4KKyAqLworaW50IGZkX21zZ19zb3VyY2Vfc2V0KCBzdHJ1Y3QgbXNnICogbXNnLCBEaWFtSWRfdCBkaWFtaWQsIHNpemVfdCBkaWFtaWRsZW4gKTsKK2ludCBmZF9tc2dfc291cmNlX3NldHJyKCBzdHJ1Y3QgbXNnICogbXNnLCBEaWFtSWRfdCBkaWFtaWQsIHNpemVfdCBkaWFtaWRsZW4sIHN0cnVjdCBkaWN0aW9uYXJ5ICogZGljdCApOworaW50IGZkX21zZ19zb3VyY2VfZ2V0KCBzdHJ1Y3QgbXNnICogbXNnLCBEaWFtSWRfdCAqZGlhbWlkLCBzaXplX3QgKiBkaWFtaWRsZW4gKTsKKworLyoKKyAqIEZVTkNUSU9OOglmZF9tc2dfZXRlaWRfZ2V0CisgKgorICogUEFSQU1FVEVSUzoKKyAqICAtCisgKgorICogREVTQ1JJUFRJT046IAorICogICBHZXQgYSBuZXcgdW5pcXVlIGVuZC10by1lbmQgaWQgdmFsdWUgZm9yIHRoZSBsb2NhbCBwZWVyLgorICoKKyAqIFJFVFVSTiBWQUxVRToKKyAqICBUaGUgbmV3IGFzc2lnbmVkIHZhbHVlLiBObyBlcnJvciBjb2RlIGlzIGRlZmluZWQuCisgKi8KK3VpbnQzMl90IGZkX21zZ19ldGVpZF9nZXQgKCB2b2lkICk7CisKKworLyoKKyAqIEZVTkNUSU9OOglmZF9tc2dfc2Vzc19nZXQKKyAqCisgKiBQQVJBTUVURVJTOgorICogIGRpY3QJOiB0aGUgZGljdGlvbmFyeSB0aGF0IGNvbnRhaW5zIHRoZSBTZXNzaW9uLUlkIEFWUCBkZWZpbml0aW9uCisgKiAgbXNnCQk6IEEgdmFsaWQgbWVzc2FnZS4KKyAqICBzZXNzaW9uCTogTG9jYXRpb24gdG8gc3RvcmUgdGhlIHNlc3Npb24gcG9pbnRlciB3aGVuIHJldHJpZXZlZC4KKyAqICBpc25ldwk6IEluZGljYXRlcyBpZiB0aGUgc2Vzc2lvbiBoYXMgYmVlbiBjcmVhdGVkLgorICoKKyAqIERFU0NSSVBUSU9OOgorICogIFRoaXMgZnVuY3Rpb24gcmV0cmlldmVzIG9yIGNyZWF0ZXMgdGhlIHNlc3Npb24gb2JqZWN0IGNvcnJlc3BvbmRpbmcgdG8gYSBtZXNzYWdlLgorICogSWYgdGhlIG1lc3NhZ2UgZG9lcyBub3QgY29udGFpbiBhIFNlc3Npb24tSWQgQVZQLCAqc2Vzc2lvbiA9PSBOVUxMIG9uIHJldHVybi4KKyAqIE5vdGUgdGhhdCB0aGUgU2Vzc2lvbi1JZCBBVlAgbXVzdCBuZXZlciBiZSBtb2RpZmllZCBhZnRlciBjcmVhdGVkIGluIGEgbWVzc2FnZS4KKyAqCisgKiBSRVRVUk4gVkFMVUU6CisgKiAgMCA6IHN1Y2Nlc3MKKyAqICEwIDogc3RhbmRhcmQgZXJyb3IgY29kZS4KKyAqLworaW50IGZkX21zZ19zZXNzX2dldChzdHJ1Y3QgZGljdGlvbmFyeSAqIGRpY3QsIHN0cnVjdCBtc2cgKiBtc2csIHN0cnVjdCBzZXNzaW9uICoqIHNlc3Npb24sIGludCAqIGlzbmV3KTsKKworLyogVGhpcyBvbmUgaXMgdXNlZCBieSB0aGUgbGliZmRjb3JlLCB5b3Ugc2hvdWxkIHVzZSBmZF9tc2dfbmV3X3Nlc3Npb24gcmF0aGVyIHRoYW4gZmRfc2Vzc19uZXcsIHdoZW4gcG9zc2libGUgKi8KK2ludCBmZF9tc2dfc2Vzc19zZXQoc3RydWN0IG1zZyAqIG1zZywgc3RydWN0IHNlc3Npb24gKiBzZXNzaW9uKTsKKworCisvKiBIZWxwZXIgZm9yIHRoZSBob29rcyBtZWNoYW5pc20sIGZvciB1c2UgZnJvbSBsaWJmZGNvcmUgKi8KK3N0cnVjdCBmZF9tc2dfcG1kbCB7CisJc3RydWN0IGZkX2xpc3Qgc2VudGluZWw7IC8qIGlmIHRoZSBzZW50aW5lbC5vIGZpZWxkIGlzIE5VTEwsIHRoZSBzdHJ1Y3R1cmUgaXMgbm90IGluaXRpYWxpemVkLiBPdGhlcndpc2UgaXQgcG9pbnRzIHRvIHRoZSBjbGVhbnVwIGZ1bmN0aW9uIGluIGxpYmZkY29yZS4gKi8KKwlwdGhyZWFkX211dGV4X3QgbG9jazsKK307CitzdHJ1Y3QgZmRfbXNnX3BtZGwgKiBmZF9tc2dfcG1kbF9nZXQoc3RydWN0IG1zZyAqIG1zZyk7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgTWFuYWdlIEFWUCB2YWx1ZXMgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICogRlVOQ1RJT046CWZkX21zZ19hdnBfc2V0dmFsdWUKKyAqCisgKiBQQVJBTUVURVJTOgorICogIGF2cCAJOiBQb2ludGVyIHRvIGEgdmFsaWQgYXZwIG9iamVjdCB3aXRoIGEgTlVMTCBhdnBfdmFsdWUgcG9pbnRlci4gVGhlIG1vZGVsIG11c3QgYmUga25vd24uCisgKiAgdmFsdWUgCTogcG9pbnRlciB0byBhbiBhdnBfdmFsdWUuIFRoZSBjb250ZW50IHdpbGwgYmUgQ09QSUVEIGludG8gdGhlIGludGVybmFsIHN0b3JhZ2UgYXJlYS4gCisgKgkJIElmIGRhdGEgdHlwZSBpcyBhbiBvY3RldHN0cmluZywgdGhlIGRhdGEgaXMgYWxzbyBjb3BpZWQuCisgKiAJCSBJZiB2YWx1ZSBpcyBhIE5VTEwgcG9pbnRlciwgdGhlIHByZXZpb3VzIGRhdGEgaXMgZXJhc2VkIGFuZCB2YWx1ZSBpcyB1bnNldCBpbiB0aGUgQVZQLgorICoKKyAqIERFU0NSSVBUSU9OOiAKKyAqICAgSW5pdGlhbGl6ZSB0aGUgYXZwX3ZhbHVlIGZpZWxkIG9mIGFuIEFWUCBoZWFkZXIuCisgKgorICogUkVUVVJOIFZBTFVFOgorICogIDAgICAgICAJOiBUaGUgYXZwX3ZhbHVlIHBvaW50ZXIgaGFzIGJlZW4gc2V0LgorICogIEVJTlZBTCAJOiBBIHBhcmFtZXRlciBpcyBpbnZhbGlkLgorICovCitpbnQgZmRfbXNnX2F2cF9zZXR2YWx1ZSAoIHN0cnVjdCBhdnAgKmF2cCwgdW5pb24gYXZwX3ZhbHVlICp2YWx1ZSApOworCisvKgorICogRlVOQ1RJT046CWZkX21zZ19hdnBfdmFsdWVfZW5jb2RlCisgKgorICogUEFSQU1FVEVSUzoKKyAqICBhdnAgCTogUG9pbnRlciB0byBhIHZhbGlkIGF2cCBvYmplY3Qgd2l0aCBhIE5VTEwgYXZwX3ZhbHVlLiBUaGUgbW9kZWwgbXVzdCBiZSBrbm93bi4KKyAqICBkYXRhIAk6IFBvaW50ZXIgdG8gdGhlIGRhdGEgdGhhdCBtdXN0IGJlIGVuY29kZWQgYXMgQVZQIHZhbHVlIGFuZCBzdG9yZWQgaW4gdGhlIEFWUC4KKyAqCQkgVGhpcyBpcyBvbmx5IHZhbGlkIGZvciBBVlBzIG9mIGRlcml2ZWQgdHlwZSBmb3Igd2hpY2ggdHlwZV9kYXRhX2VuY29kZSBjYWxsYmFjayBpcyBzZXQuIChleDogQWRkcmVzcyB0eXBlKQorICoKKyAqIERFU0NSSVBUSU9OOiAKKyAqICAgSW5pdGlhbGl6ZSB0aGUgYXZwX3ZhbHVlIGZpZWxkIG9mIGFuIEFWUCBvYmplY3QgZnJvbSBmb3JtYXR0ZWQgZGF0YSwgdXNpbmcgdGhlIEFWUCdzIHR5cGUgInR5cGVfZGF0YV9lbmNvZGUiIGNhbGxiYWNrLgorICoKKyAqIFJFVFVSTiBWQUxVRToKKyAqICAwICAgICAgCTogVGhlIGF2cF92YWx1ZSBoYXMgYmVlbiBzZXQuCisgKiAgRUlOVkFMIAk6IEEgcGFyYW1ldGVyIGlzIGludmFsaWQuCisgKiAgRU5PVFNVUCAJOiBUaGVyZSBpcyBubyBhcHByb3ByaWF0ZSBjYWxsYmFjayByZWdpc3RlcmVkIHdpdGggdGhpcyBBVlAncyB0eXBlLgorICovCitpbnQgZmRfbXNnX2F2cF92YWx1ZV9lbmNvZGUgKCB2b2lkICpkYXRhLCBzdHJ1Y3QgYXZwICphdnAgKTsKKy8qCisgKiBGVU5DVElPTjoJZmRfbXNnX2F2cF92YWx1ZV9pbnRlcnByZXQKKyAqCisgKiBQQVJBTUVURVJTOgorICogIGF2cCAJOiBQb2ludGVyIHRvIGEgdmFsaWQgYXZwIG9iamVjdCB3aXRoIGEgbm9uLU5VTEwgYXZwX3ZhbHVlIHZhbHVlLgorICogIGRhdGEgCTogVXBvbiBzdWNjZXNzLCBmb3JtYXR0ZWQgaW50ZXJwcmV0YXRpb24gb2YgdGhlIEFWUCB2YWx1ZSBpcyBzdG9yZWQgaGVyZS4KKyAqCisgKiBERVNDUklQVElPTjogCisgKiAgIEludGVycHJldCB0aGUgY29udGVudCBvZiBhbiBBVlAgb2YgRGVyaXZlZCB0eXBlIGFuZCBzdG9yZSB0aGUgcmVzdWx0IGluIGRhdGEgcG9pbnRlci4gVGhlIHN0cnVjdHVyZQorICogb2YgdGhlIGRhdGEgcG9pbnRlciBpcyBkZXBlbmRlbnQgb24gdGhlIEFWUCB0eXBlLiBUaGlzIGZ1bmN0aW9uIGNhbGxzIHRoZSAidHlwZV9kYXRhX2ludGVycHJldCIgY2FsbGJhY2sgCisgKiBvZiB0aGUgdHlwZS4KKyAqCisgKiBSRVRVUk4gVkFMVUU6CisgKiAgMCAgICAgIAk6IFRoZSBhdnBfdmFsdWUgaGFzIGJlZW4gc2V0LgorICogIEVJTlZBTCAJOiBBIHBhcmFtZXRlciBpcyBpbnZhbGlkLgorICogIEVOT1RTVVAgCTogVGhlcmUgaXMgbm8gYXBwcm9wcmlhdGUgY2FsbGJhY2sgcmVnaXN0ZXJlZCB3aXRoIHRoaXMgQVZQJ3MgdHlwZS4KKyAqLworaW50IGZkX21zZ19hdnBfdmFsdWVfaW50ZXJwcmV0ICggc3RydWN0IGF2cCAqYXZwLCB2b2lkICpkYXRhICk7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgTWVzc2FnZSBwYXJzaW5nIGZ1bmN0aW9ucyAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICogRlVOQ1RJT046CWZkX21zZ19idWZmZXJpemUKKyAqCisgKiBQQVJBTUVURVJTOgorICogIG1zZwkJOiBBIHZhbGlkIG1zZyBvYmplY3QuIEFsbCBBVlBzIG11c3QgaGF2ZSBhIHZhbHVlIHNldC4gCisgKiAgYnVmZmVyIAk6IFVwb24gc3VjY2VzcywgdGhpcyBwb2ludHMgdG8gYSBidWZmZXIgKG1hbGxvYydkKSBjb250YWluaW5nIHRoZSBtZXNzYWdlIHJlYWR5IGZvciBuZXR3b3JrIHRyYW5zbWlzc2lvbiAob3Igc2VjdXJpdHkgdHJhbnNmb3JtYXRpb25zKS4gCisgKgkJIFRoZSBidWZmZXIgbWF5IGJlIGZyZWVkIGFmdGVyIHVzZS4KKyAqICBsZW4JCTogaWYgbm90IE5VTEwsIHRoZSBzaXplIG9mIHRoZSBidWZmZXIgaXMgd3JpdHRlbiBoZXJlLiBJbiBhbnkgY2FzZSwgdGhpcyBzaXplIGlzIHVwZGF0ZWQgaW4gdGhlIG1zZyBoZWFkZXIuCisgKgorICogREVTQ1JJUFRJT046IAorICogICBSZW5kZXJzIGEgbWVzc2FnZSBpbiBtZW1vcnkgYXMgYSBidWZmZXIgdGhhdCBjYW4gYmUgc2VudCBvdmVyIHRoZSBuZXR3b3JrIHRvIHRoZSBuZXh0IHBlZXIuCisgKgorICogUkVUVVJOIFZBTFVFOgorICogIDAgICAgICAJOiBUaGUgbG9jYXRpb24gaGFzIGJlZW4gd3JpdHRlbi4KKyAqICBFSU5WQUwgCTogVGhlIGJ1ZmZlciBkb2VzIG5vdCBjb250YWluIGEgdmFsaWQgRGlhbWV0ZXIgbWVzc2FnZS4KKyAqICBFTk9NRU0JOiBVbmFibGUgdG8gYWxsb2NhdGUgZW5vdWdoIG1lbW9yeSB0byBjcmVhdGUgdGhlIGJ1ZmZlciBvYmplY3QuCisgKi8KK2ludCBmZF9tc2dfYnVmZmVyaXplICggc3RydWN0IG1zZyAqIG1zZywgdWludDhfdCAqKiBidWZmZXIsIHNpemVfdCAqIGxlbiApOworCisvKgorICogRlVOQ1RJT046CWZkX21zZ19wYXJzZV9idWZmZXIKKyAqCisgKiBQQVJBTUVURVJTOgorICogIGJ1ZmZlciAJOiBQb2ludGVyIHRvIGEgYnVmZmVyIGNvbnRhaW5pbmcgYSBtZXNzYWdlIHJlY2VpdmVkIGZyb20gdGhlIG5ldHdvcmsuIAorICogIGJ1Zmxlbgk6IHRoZSBzaXplIGluIGJ5dGVzIG9mIHRoZSBidWZmZXIuCisgKiAgbXNnCQk6IFVwb24gc3VjY2VzcywgdGhpcyBwb2ludHMgdG8gYSB2YWxpZCBtc2cgb2JqZWN0LiBObyBBVlAgdmFsdWUgaXMgcmVzb2x2ZWQgaW4gdGhpcyBvYmplY3QsIG5vciBncm91cGVkIEFWUC4KKyAqCisgKiBERVNDUklQVElPTjogCisgKiAgIFRoaXMgZnVuY3Rpb24gcGFyc2VzIGEgYnVmZmVyIGFuIGNyZWF0ZXMgYSBtc2cgb2JqZWN0IHRvIHJlcHJlc2VudCB0aGUgc3RydWN0dXJlIG9mIHRoZSBtZXNzYWdlLgorICogIFNpbmNlIG5vIGRpY3Rpb25hcnkgbG9va3VwIGlzIHBlcmZvcm1lZCwgdGhlIHZhbHVlcyBvZiB0aGUgQVZQcyBhcmUgbm90IGludGVycHJldGVkLiBUbyBpbnRlcnByZXQgdGhlIHZhbHVlcywKKyAqICB0aGUgcmV0dXJuZWQgbWVzc2FnZSBvYmplY3QgbXVzdCBiZSBwYXNzZWQgdG8gZmRfbXNnX3BhcnNlX2RpY3QgZnVuY3Rpb24uCisgKiAgVGhlIGJ1ZmZlciBwb2ludGVyIGlzIHNhdmVkIGluc2lkZSB0aGUgbWVzc2FnZSBhbmQgd2lsbCBiZSBmcmVlZCB3aGVuIG5vdCBuZWVkZWQgYW55bW9yZS4KKyAqCisgKiBSRVRVUk4gVkFMVUU6CisgKiAgMCAgICAgIAk6IFRoZSBsb2NhdGlvbiBoYXMgYmVlbiB3cml0dGVuLgorICogIEVOT01FTQk6IFVuYWJsZSB0byBhbGxvY2F0ZSBlbm91Z2ggbWVtb3J5IHRvIGNyZWF0ZSB0aGUgbXNnIG9iamVjdC4KKyAqICBFQkFETVNHCTogVGhlIGJ1ZmZlciBkb2VzIG5vdCBjb250YWluIGEgdmFsaWQgRGlhbWV0ZXIgbWVzc2FnZSAob3IgaXMgdHJ1bmNhdGVkKS4KKyAqICBFSU5WQUwgCTogQSBwYXJhbWV0ZXIgaXMgaW52YWxpZC4KKyAqLworaW50IGZkX21zZ19wYXJzZV9idWZmZXIgKCB1aW50OF90ICoqIGJ1ZmZlciwgc2l6ZV90IGJ1Zmxlbiwgc3RydWN0IG1zZyAqKiBtc2cgKTsKKworLyogUGFyc2luZyBFcnJvciBJbmZvcm1hdGlvbiBzdHJ1Y3R1cmUgKi8KK3N0cnVjdCBmZF9wZWkgeworCWNoYXIgKgkJcGVpX2VycmNvZGU7CS8qIG5hbWUgb2YgdGhlIGVycm9yIGNvZGUgdG8gdXNlICovCisJc3RydWN0IGF2cCAqCXBlaV9hdnA7CS8qIHBvaW50ZXIgdG8gaW52YWxpZCAoaW4gb3JpZ2luYWwgbWVzc2FnZSkgb3IgbWlzc2luZyBBVlAgKHRvIGJlIGZyZWVkKSAqLworCWludAkJcGVpX2F2cF9mcmVlOwkvKiBTZXQgdG8gMSBpZiB0aGUgcGVpX2F2cCBtdXN0IGJlIGZyZWVkICovCisJY2hhciAqCQlwZWlfbWVzc2FnZTsJLyogT3ZlcndyaXRlIGRlZmF1bHQgbWVzc2FnZSBpZiBuZWVkZWQgKi8KKwlpbnQJCXBlaV9wcm90b2VycjsgCS8qIGRvIHdlIHNldCB0aGUgJ0UnIGJpdCBpbiB0aGUgZXJyb3IgbWVzc2FnZSA/ICovCit9OworCisvKgorICogRlVOQ1RJT046CWZkX21zZ19wYXJzZV9kaWN0CisgKgorICogUEFSQU1FVEVSUzoKKyAqICBvYmplY3QJOiBBIG1zZyBvciBBVlAgb2JqZWN0IGFzIHJldHVybmVkIGJ5IGZkX21zZ19wYXJzZV9idWZmZXIuCisgKiAgZGljdAk6IHRoZSBkaWN0aW9uYXJ5IGNvbnRhaW5pbmcgdGhlIG9iamVjdHMgZGVmaW5pdGlvbnMgdG8gdXNlIGZvciByZXNvbHZpbmcgYWxsIEFWUHMuCisgKiAgZXJyb3JfaW5mbwk6IElmIG5vdCBOVUxMLCB3aWxsIGNvbnRhaW4gdGhlIGRldGFpbCBhYm91dCBlcnJvciB1cG9uIHJldHVybi4gTWF5IGJlIHVzZWQgdG8gZ2VuZXJhdGUgYW4gZXJyb3IgcmVwbHkuCisgKgorICogREVTQ1JJUFRJT046IAorICogICBUaGlzIGZ1bmN0aW9uIGxvb2tzIHVwIGZvciB0aGUgY29tbWFuZCBhbmQgZWFjaCBjaGlsZHJlbiBBVlAgZGVmaW5pdGlvbnMgaW4gdGhlIGRpY3Rpb25hcnkuCisgKiAgSWYgdGhlIGRpY3Rpb25hcnkgZGVmaW5pdGlvbiBpcyBmb3VuZCwgYXZwX21vZGVsIGlzIHNldCBhbmQgdGhlIHZhbHVlIG9mIHRoZSBBVlAgaXMgaW50ZXJwcmV0ZWQgYWNjb3JkaW5nbHkgYW5kOgorICogICAtIGZvciBncm91cGVkIEFWUHMsIHRoZSBjaGlsZHJlbiBBVlAgYXJlIGNyZWF0ZWQgYW5kIGludGVycHJldGVkIGFsc28uCisgKiAgIC0gZm9yIG51bWVyaWNhbCBBVlBzLCB0aGUgdmFsdWUgaXMgY29udmVydGVkIHRvIGhvc3QgYnl0ZSBvcmRlciBhbmQgc2F2ZWQgaW4gdGhlIGF2cF92YWx1ZSBmaWVsZC4KKyAqICAgLSBmb3Igb2N0ZXRzdHJpbmcgQVZQcywgdGhlIHN0cmluZyBpcyBjb3BpZWQgaW50byBhIG5ldyBidWZmZXIgYW5kIGl0cyBhZGRyZXNzIGlzIHNhdmVkIGluIGF2cF92YWx1ZS4gCisgKiAgSWYgdGhlIGRpY3Rpb25hcnkgZGVmaW5pdGlvbiBpcyBub3QgZm91bmQsIGF2cF9tb2RlbCBpcyBzZXQgdG8gTlVMTCBhbmQKKyAqICB0aGUgY29udGVudCBvZiB0aGUgQVZQIGlzIHNhdmVkIGFzIGFuIG9jdGV0c3RyaW5nIGluIGFuIGludGVybmFsIHN0cnVjdHVyZS4gYXZwX3ZhbHVlIGlzIE5VTEwuCisgKiAgQXMgYSByZXN1bHQsIGFmdGVyIHRoaXMgZnVuY3Rpb24gaGFzIGJlZW4gY2FsbGVkLCB0aGVyZSBpcyBubyBtb3JlIGRlcGVuZGVuY3kgb2YgdGhlIG1zZyBvYmplY3QgdG8gdGhlIG1lc3NhZ2UgYnVmZmVyLCB0aGF0IGlzIGZyZWVkLgorICoKKyAqIFJFVFVSTiBWQUxVRToKKyAqICAwICAgICAgCTogVGhlIG1lc3NhZ2UgaGFzIGJlZW4gZnVsbHkgcGFyc2VkIGFzIGRlc2NyaWJlZC4KKyAqICBFSU5WQUwgCTogVGhlIG1zZyBwYXJhbWV0ZXIgaXMgaW52YWxpZCBmb3IgdGhpcyBvcGVyYXRpb24uCisgKiAgRU5PTUVNCTogVW5hYmxlIHRvIGFsbG9jYXRlIGVub3VnaCBtZW1vcnkgdG8gY29tcGxldGUgdGhlIG9wZXJhdGlvbi4KKyAqICBFTk9UU1VQCTogTm8gZGljdGlvbmFyeSBkZWZpbml0aW9uIGZvciB0aGUgY29tbWFuZCBvciBvbmUgb2YgdGhlIG1hbmRhdG9yeSBBVlAgd2FzIGZvdW5kLgorICovCitpbnQgZmRfbXNnX3BhcnNlX2RpY3QgKCBtc2dfb3JfYXZwICogb2JqZWN0LCBzdHJ1Y3QgZGljdGlvbmFyeSAqIGRpY3QsIHN0cnVjdCBmZF9wZWkgKiBlcnJvcl9pbmZvICk7CisKKy8qCisgKiBGVU5DVElPTjoJZmRfbXNnX3BhcnNlX3J1bGVzCisgKgorICogUEFSQU1FVEVSUzoKKyAqICBvYmplY3QJOiBBIG1zZyBvciBncm91cGVkIGF2cCBvYmplY3QgdGhhdCBtdXN0IGJlIHZlcmlmaWVkLgorICogIGRpY3QJOiBUaGUgZGljdGlvbmFyeSBjb250YWluaW5nIHRoZSBydWxlcyBkZWZpbml0aW9ucy4KKyAqICBlcnJvcl9pbmZvCTogSWYgbm90IE5VTEwsIHRoZSBmaXJzdCBwcm9ibGVtIGluZm9ybWF0aW9uIHdpbGwgYmUgc2F2ZWQgaGVyZS4KKyAqCisgKiBERVNDUklQVElPTjogCisgKiAgIENoZWNrIHRoYXQgdGhlIGNoaWxkcmVuIG9mIHRoZSBvYmplY3QgZG8gbm90IGNvbmZsaWN0IHdpdGggdGhlIGRpY3Rpb25hcnkgcnVsZXMgKEFCTkYgY29tcGxpYW5jZSkuCisgKgorICogUkVUVVJOIFZBTFVFOgorICogIDAgICAgICAJOiBUaGUgbWVzc2FnZSBoYXMgYmVlbiBmdWxseSBwYXJzZWQgYW5kIGNvbXBsaWVzIHRvIHRoZSBkZWZpbmVkIHJ1bGVzLgorICogIEVCQURNU0cJOiBBIGNvbmZsaWN0IHdhcyBkZXRlY3RlZCwgb3IgYSBtYW5kYXRvcnkgQVZQIGlzIHVua25vd24gaW4gdGhlIGRpY3Rpb25hcnkuCisgKiAgRUlOVkFMIAk6IFRoZSBtc2cgb3IgYXZwIG9iamVjdCBpcyBpbnZhbGlkIGZvciB0aGlzIG9wZXJhdGlvbi4KKyAqICBFTk9NRU0JOiBVbmFibGUgdG8gYWxsb2NhdGUgZW5vdWdoIG1lbW9yeSB0byBjb21wbGV0ZSB0aGUgb3BlcmF0aW9uLgorICovCitpbnQgZmRfbXNnX3BhcnNlX3J1bGVzICggbXNnX29yX2F2cCAqIG9iamVjdCwgc3RydWN0IGRpY3Rpb25hcnkgKiBkaWN0LCBzdHJ1Y3QgZmRfcGVpICogZXJyb3JfaW5mbyk7CisKKworCisvKgorICogRlVOQ1RJT046CWZkX21zZ191cGRhdGVfbGVuZ3RoCisgKgorICogUEFSQU1FVEVSUzoKKyAqICBvYmplY3QgCTogUG9pbnRlciB0byBhIHZhbGlkIG1zZyBvciBhdnAuIAorICoKKyAqIERFU0NSSVBUSU9OOiAKKyAqICAgVXBkYXRlIHRoZSBsZW5ndGggZmllbGQgb2YgdGhlIG9iamVjdCBwYXNzZWQgYXMgcGFyYW1ldGVyLgorICogQXMgYSBzaWRlIGVmZmVjdCwgYWxsIGNoaWxkcmVuIG9iamVjdHMgYXJlIGFsc28gdXBkYXRlZC4gVGhlcmVmb3JlLCBhbGwgYXZwX3ZhbHVlIGZpZWxkcyBvZgorICogdGhlIGNoaWxkcmVuIEFWUHMgbXVzdCBiZSBzZXQsIG9yIGFuIGVycm9yIHdpbGwgb2NjdXIuCisgKgorICogUkVUVVJOIFZBTFVFOgorICogIDAgICAgICAJOiBUaGUgc2l6ZSBoYXMgYmVlbiByZWNvbXB1dGVkLgorICogIEVJTlZBTCAJOiBBIHBhcmFtZXRlciBpcyBpbnZhbGlkLgorICovCitpbnQgZmRfbXNnX3VwZGF0ZV9sZW5ndGggKCBtc2dfb3JfYXZwICogb2JqZWN0ICk7CisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworLyogICAgICAgICAgICAgICAgICAgICAgICAgRElTUEFUQ0ggICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisvKiBEaXNwYXRjaCBtb2R1bGUgKHBhc3NpbmcgaW5jb21pbmcgbWVzc2FnZXMgdG8gZXh0ZW5zaW9ucyByZWdpc3RlcmVkIGNhbGxiYWNrcykKKyAqIGlzIHNwbGl0IGJldHdlZW4gdGhlIGxpYnJhcnkgYW5kIHRoZSBkYWVtb24uCisgKgorICogVGhlIGxpYnJhcnkgcHJvdmlkZXMgdGhlIHN1cHBvcnQgZm9yIGFzc29jaWF0aW5nIGRpc3BhdGNoIGNhbGxiYWNrcyB3aXRoCisgKiBkaWN0aW9uYXJ5IG9iamVjdHMuCisgKgorICogVGhlIGRhZW1vbiBpcyByZXNwb25zaWJsZSBmb3IgY2FsbGluZyB0aGUgY2FsbGJhY2tzIGZvciBhIG1lc3NhZ2Ugd2hlbiBhcHByb3ByaWF0ZS4KKyAqCisgKgorICogVGhlIGRpc3BhdGNoIG1vZHVsZSBoYXMgdHdvIG1haW4gcm9sZXM6CisgKiAgLSBoZWxwIGRldGVybWluZSBpZiBhIG1lc3NhZ2UgY2FuIGJlIGhhbmRsZWQgbG9jYWxseSAoZHVyaW5nIHRoZSByb3V0aW5nIHN0ZXApCisgKiAgICAgICAgVGhpcyBkZWNpc2lvbiBpbnZvbHZlcyBvbmx5IHRoZSBhcHBsaWNhdGlvbi1pZCBvZiB0aGUgbWVzc2FnZS4KKyAqICAtIHBhc3MgdGhlIG1lc3NhZ2UgdG8gdGhlIGNhbGxiYWNrKHMpIHRoYXQgd2lsbCBoYW5kbGUgaXQgKGR1cmluZyB0aGUgZGlzcGF0Y2ggc3RlcCkKKyAqCisgKiBUaGUgZmlyc3Qgcm9sZSBpcyBoYW5kbGVkIGJ5IHRoZSBkYWVtb24uCisgKgorICogQWJvdXQgdGhlIHNlY29uZCwgdGhlc2UgYXJlIHRoZSBwb3NzaWJpbGl0aWVzIGZvciByZWdpc3RlcmluZyBhIGRpc3BhdGNoIGNhbGxiYWNrOgorICoKKyAqIC0+IEZvciBBbGwgbWVzc2FnZXMuCisgKiAgVGhpcyBjYWxsYmFjayBpcyBjYWxsZWQgZm9yIGFsbCBtZXNzYWdlcyB0aGF0IGFyZSBoYW5kbGVkIGxvY2FsbHkuIFRoaXMgc2hvdWxkIGJlIHVzZWQgb25seQorICogIGZvciBkZWJ1ZyBwdXJwb3NlLgorICoKKyAqIC0+IGJ5IEFWUCB2YWx1ZSAoY29uc3RhbnRzIG9ubHkpLgorICogIFRoaXMgY2FsbGJhY2sgd2lsbCBiZSBjYWxsZWQgd2hlbiBhIG1lc3NhZ2UgaXMgcmVjZWl2ZWQgYW5kIGNvbnRhaW5zIGFuIEFWUCB3aXRoIGEgc3BlY2lmaWVkIGVudW1lcmF0ZWQgdmFsdWUuCisgKgorICogLT4gYnkgQVZQLgorICogIFRoaXMgY2FsbGJhY2sgd2lsbCBiZSBjYWxsZWQgd2hlbiB0aGUgcmVjZWl2ZWQgbWVzc2FnZSBjb250YWlucyBhIGNlcnRhaW4gQVZQLgorICoKKyAqIC0+IGJ5IGNvbW1hbmQtY29kZS4KKyAqICBUaGlzIGNhbGxiYWNrIHdpbGwgYmUgY2FsbGVkIHdoZW4gdGhlIG1lc3NhZ2UgaXMgYSBzcGVjaWZpYyBjb21tYW5kIChhbmQgJ1InIGZsYWcpLgorICoKKyAqIC0+IGJ5IGFwcGxpY2F0aW9uLgorICogIFRoaXMgY2FsbGJhY2sgd2lsbCBiZSBjYWxsZWQgd2hlbiB0aGUgbWVzc2FnZSBoYXMgYSBzcGVjaWZpYyBhcHBsaWNhdGlvbi1pZC4KKyAqCisgKiAoIGJ5IHZlbmRvcjogd291bGQgdGhpcyBiZSB1c2VmdWw/IGl0IG1heSBiZSBhZGRlZCBsYXRlcikKKyAqLworZW51bSBkaXNwX2hvdyB7CisJRElTUF9IT1dfQU5ZID0gMSwJCS8qIEFueSBtZXNzYWdlLiBUaGlzIHNob3VsZCBiZSBvbmx5IHVzZWQgZm9yIGRlYnVnLiAqLworCURJU1BfSE9XX0FQUElELAkJCS8qIEFueSBtZXNzYWdlIHdpdGggdGhlIHNwZWNpZmllZCBhcHBsaWNhdGlvbi1pZCAqLworCURJU1BfSE9XX0NDLAkJCS8qIE1lc3NhZ2VzIG9mIHRoZSBzcGVjaWZpZWQgY29tbWFuZC1jb2RlIChyZXF1ZXN0IG9yIGFuc3dlcikuIEFwcCBpZCBtYXkgYmUgc3BlY2lmaWVkLiAqLworCURJU1BfSE9XX0FWUCwJCQkvKiBNZXNzYWdlcyBjb250YWluaW5nIGEgc3BlY2lmaWMgQVZQLiBDb21tYW5kLWNvZGUgYW5kIEFwcCBpZCBtYXkgYmUgc3BlY2lmaWVkLiAqLworCURJU1BfSE9XX0FWUF9FTlVNVkFMCQkvKiBNZXNzYWdlcyBjb250YWluaW5nIGEgc3BlY2lmaWMgQVZQIHdpdGggYSBzcGVjaWZpYyBlbnVtZXJhdGVkIHZhbHVlLiBDb21tYW5kLWNvZGUgYW5kIEFwcCBpZCBtYXkgYmUgc3BlY2lmaWVkLiAqLworfTsKKy8qCisgKiBTZXZlcmFsIGNyaXRlcmlhIG1heSBiZSBzZWxlY3RlZCBhdCB0aGUgc2FtZSB0aW1lLCBmb3IgZXhhbXBsZSBjb21tYW5kLWNvZGUgQU5EIGFwcGxpY2F0aW9uIGlkLgorICoKKyAqIElmIHNldmVyYWwgY2FsbGJhY2tzIGFyZSByZWdpc3RlcmVkIGZvciB0aGUgc2FtZSBvYmplY3QsIHRoZXkgYXJlIGNhbGxlZCBpbiB0aGUgb3JkZXIgdGhleSB3ZXJlIHJlZ2lzdGVyZWQuCisgKiBUaGUgb3JkZXIgaW4gd2hpY2ggdGhlIGNhbGxiYWNrcyBhcmUgY2FsbGVkIGlzOgorICogIERJU1BfSE9XX0FOWQorICogIERJU1BfSE9XX0FWUF9FTlVNVkFMICYgRElTUF9IT1dfQVZQCisgKiAgRElTUF9IT1dfQ0MKKyAqICBESVNQX0hPV19BUFBJRAorICovCisKKy8qIFdoZW4gYSBjYWxsYmFjayBpcyByZWdpc3RlcmVkLCBhICJ3aGVuIiBhcmd1bWVudCBpcyBwYXNzZWQgaW4gYWRkaXRpb24gdG8gdGhlIGRpc3BfaG93IHZhbHVlLAorICogdG8gc3BlY2lmeSB3aGljaCB2YWx1ZXMgdGhlIGNyaXRlcmlhIG11c3QgbWF0Y2guICovCitzdHJ1Y3QgZGlzcF93aGVuIHsKKwlzdHJ1Y3QgZGljdF9vYmplY3QgKglhcHA7CisJc3RydWN0IGRpY3Rfb2JqZWN0ICoJY29tbWFuZDsKKwlzdHJ1Y3QgZGljdF9vYmplY3QgKglhdnA7CisJc3RydWN0IGRpY3Rfb2JqZWN0ICoJdmFsdWU7Cit9OworCisvKiBOb3RlIHRoYXQgYWxsIHRoZSBkaWN0aW9uYXJ5IG9iamVjdHMgc2hvdWxkIHJlYWxseSBiZWxvbmcgdG8gdGhlIHNhbWUgZGljdGlvbmFyeSEKKyAqCisgKiBIZXJlIGlzIHRoZSBkZXRhaWxzIG9uIHRoaXMgIndoZW4iIGFyZ3VtZW50LCBkZXBlbmRpbmcgb24gdGhlIGRpc3BfaG93IHZhbHVlLgorICoKKyAqIERJU1BfSE9XX0FOWS4KKyAqICBJbiB0aGlzIGNhc2UsICJ3aGVuIiBtdXN0IGJlIE5VTEwuCisgKgorICogRElTUF9IT1dfQVBQSUQuCisgKiAgT25seSB0aGUgImFwcF9pZCIgZmllbGQgbXVzdCBiZSBzZXQsIG90aGVyIGZpZWxkcyBhcmUgaWdub3JlZC4gSXQgcG9pbnRzIHRvIGEgZGljdGlvbmFyeSBvYmplY3Qgb2YgdHlwZSBESUNUX0FQUExJQ0FUSU9OLgorICoKKyAqIERJU1BfSE9XX0NDLgorICogIFRoZSAiY29tbWFuZCIgZmllbGQgbXVzdCBiZSBkZWZpbmVkIGFuZCBwb2ludCB0byBhIGRpY3Rpb25hcnkgb2JqZWN0IG9mIHR5cGUgRElDVF9DT01NQU5ELgorICogIFRoZSAiYXBwX2lkIiBtYXkgYmUgYWxzbyBzZXQuIEluIHRoZSBjYXNlIGl0IGlzIHNldCwgaXQgcmVzdHJpY3RzIHRoZSBjYWxsYmFjayB0byBiZSBjYWxsZWQgb25seSB3aXRoIHRoaXMgY29tbWFuZC1jb2RlIGFuZCBhcHAgaWQuCisgKiAgVGhlIG90aGVyIGZpZWxkcyBhcmUgaWdub3JlZC4KKyAqCisgKiBESVNQX0hPV19BVlAuCisgKiAgVGhlICJhdnAiIGZpZWxkIG9mIHRoZSBzdHJ1Y3R1cmUgbXVzdCBiZSBzZXQgYW5kIHBvaW50IHRvIGEgZGljdGlvbmFyeSBvYmplY3Qgb2YgdHlwZSBESUNUX0FWUC4KKyAqICBUaGUgImFwcF9pZCIgZmllbGQgbWF5IGJlIHNldCB0byByZXN0cmljdCB0aGUgbWVzc2FnZXMgbWF0Y2hpbmcgdG8gYSBzcGVjaWZpYyBhcHAgaWQuCisgKiAgVGhlICJjb21tYW5kIiBmaWVsZCBtYXkgYWxzbyBiZSBzZXQgdG8gYSB2YWxpZCBESUNUX0NPTU1BTkQgb2JqZWN0LgorICogIFRoZSBjb250ZW50IG9mIHRoZSAidmFsdWUiIGZpZWxkIGlzIGlnbm9yZWQuCisgKgorICogRElTUF9IT1dfQVZQX0VOVU1WQUwuCisgKiAgQWxsIGZpZWxkcyBoYXZlIHRoZSBzYW1lIGNvbnN0cmFpbnRzIGFuZCBtZWFuaW5nIGFzIGluIERJU1BfUkVHX0FWUC4gSW4gYWRkaXRpb24sIHRoZSAidmFsdWUiIGZpZWxkIG11c3QgYmUgc2V0CisgKiAgYW5kIHBvaW50cyB0byBhIHZhbGlkIERJQ1RfRU5VTVZBTCBvYmplY3QuIAorICoKKyAqIEhlcmUgaXMgYSBzdW1hcnkgb2YgdGhlIGZpZWxkczogKCBNIDogbXVzdCBiZSBzZXQ7IG0gOiBtYXkgYmUgc2V0OyAwIDogaWdub3JlZCApCisgKiAgZmllbGQ6ICAgICBhcHBfaWQgICAgY29tbWFuZCAgICAgYXZwICAgIHZhbHVlCisgKiBBUFBJRCA6ICAgICAgIE0gICAgICAgICAgMCAgICAgICAgIDAgICAgICAgMAorICogQ0MgICAgOiAgICAgICBtICAgICAgICAgIE0gICAgICAgICAwICAgICAgIDAKKyAqIEFWUCAgIDogICAgICAgbSAgICAgICAgICBtICAgICAgICAgTSAgICAgICAwCisgKiBFTlVNVkE6ICAgICAgIG0gICAgICAgICAgbSAgICAgICAgIE0gICAgICAgTQorICovCisKK2VudW0gZGlzcF9hY3Rpb24geworCURJU1BfQUNUX0NPTlQsCS8qIFRoZSBuZXh0IGhhbmRsZXIgc2hvdWxkIGJlIGNhbGxlZCwgdW5sZXNzICptc2cgPT0gTlVMTC4gKi8KKwlESVNQX0FDVF9TRU5ELAkvKiBUaGUgdXBkYXRlZCBtZXNzYWdlIG11c3QgYmUgc2VudC4gTm8gZnVydGhlciBjYWxsYmFjayBpcyBjYWxsZWQuICovCisJRElTUF9BQ1RfRVJST1IJLyogQW4gZXJyb3IgbXVzdCBiZSBjcmVhdGVkIGFuZCBzZW50IGFzIGEgcmVwbHkgLS0gbm90IHZhbGlkIGZvciBjYWxsYmFja3MsIG9ubHkgZm9yIGZkX21zZ19kaXNwYXRjaC4gKi8KK307CisvKiBUaGUgY2FsbGJhY2tzIHRoYXQgYXJlIHJlZ2lzdGVyZWQgaGF2ZSB0aGUgZm9sbG93aW5nIHByb3RvdHlwZToKKyAqICAJaW50IGRpc3BhdGNoX2NhbGxiYWNrKCBzdHJ1Y3QgbXNnICoqIG1zZywgc3RydWN0IGF2cCAqIGF2cCwgc3RydWN0IHNlc3Npb24gKiBzZXNzaW9uLCBlbnVtIGRpc3BfYWN0aW9uICogYWN0aW9uICk7CisgKgorICogQ0FMTEJBQ0s6CWRpc3BhdGNoX2NhbGxiYWNrCisgKgorICogUEFSQU1FVEVSUzoKKyAqICBtc2cgCTogdGhlIHJlY2VpdmVkIG1lc3NhZ2Ugb24gZnVuY3Rpb24gZW50cnkuIG1heSBiZSB1cGRhdGVkIHRvIGFuc3dlciBvbiByZXR1cm4gKHNlZSBkZXNjcmlwdGlvbikKKyAqICBhdnAgCTogZm9yIGNhbGxiYWNrcyByZWdpc3RlcmVkIHdpdGggRElTUF9IT1dfQVZQIG9yIERJU1BfSE9XX0FWUF9FTlVNVkFMLCBkaXJlY3QgbGluayB0byB0aGUgdHJpZ2dlcmluZyBBVlAuCisgKiAgc2Vzc2lvbgk6IGlmIHRoZSBtZXNzYWdlIGNvbnRhaW5zIGEgU2Vzc2lvbi1JZCBBVlAsIHRoZSBjb3JyZXNwb25kaW5nIHNlc3Npb24gb2JqZWN0LCBOVUxMIG90aGVyd2lzZS4KKyAqICBvcGFxdWUgICAgICA6IEFuIG9wYXF1ZSBwb2ludGVyIHRoYXQgaXMgcmVnaXN0ZXJlZCBhbG9uZyB0aGUgc2Vzc2lvbiBoYW5kbGVyLgorICogIGFjdGlvbgk6IHVwb24gcmV0dXJuLCB0aGlzIHRlbGxzIHRoZSBkYWVtb24gd2hhdCB0byBkbyBuZXh0LgorICoKKyAqIERFU0NSSVBUSU9OOiAKKyAqICAgQ2FsbGVkIHdoZW4gYSByZWNlaXZlZCBtZXNzYWdlIG1hdGNocyB0aGUgY29uZGl0aW9uIGZvciB3aGljaCB0aGUgY2FsbGJhY2sgd2FzIHJlZ2lzdGVyZWQuCisgKiBUaGlzIGNhbGxiYWNrIG1heSBkbyBhbnkga2luZCBvZiBwcm9jZXNzaW5nIG9uIHRoZSBtZXNzYWdlLCBpbmNsdWRpbmc6CisgKiAgLSBjcmVhdGUgYW4gYW5zd2VyIGZvciBhIHJlcXVlc3QuCisgKiAgLSBwcm94eSBhIHJlcXVlc3Qgb3IgbWVzc2FnZSwgYWRkIC8gcmVtb3ZlIHRoZSBQcm94eS1JbmZvIEFWUCwgdGhlbiBmb3J3YXJkIHRoZSBtZXNzYWdlLgorICogIC0gdXBkYXRlIGEgcm91dGluZyB0YWJsZSBvciBzdGFydCBhIGNvbm5lY3Rpb24gd2l0aCBhIG5ldyBwZWVyLCB0aGVuIGZvcndhcmQgdGhlIG1lc3NhZ2UuCisgKiAgLSAuLi4KKyAqIAorICogV2hlbiAqYWN0aW9uID09IERJU1BfQUNUX1NFTkQgb24gY2FsbGJhY2sgcmV0dXJuLCB0aGUgbXNnIHBvaW50ZWQgYnkgKm1zZyBpcyBwYXNzZWQgdG8gdGhlIHJvdXRpbmcgbW9kdWxlIGZvciBzZW5kaW5nLgorICogV2hlbiAqYWN0aW9uID09IERJU1BfQUNUX0NPTlQsIHRoZSBuZXh0IHJlZ2lzdGVyZWQgY2FsbGJhY2sgaXMgY2FsbGVkLgorICogIFdoZW4gdGhlIGxhc3QgY2FsbGJhY2sgZ2l2ZXMgYWxzbyBESVNQX0FDVF9DT05UIGFjdGlvbiB2YWx1ZSwgYSBkZWZhdWx0IGhhbmRsZXIgaXMgY2FsbGVkLiBJdCdzIGJlaGF2aW9yIGlzIGFzIGZvbGxvdzoKKyAqICAgLSBpZiB0aGUgbWVzc2FnZSBpcyBhbiBhbnN3ZXIsIGl0IGlzIGRpc2NhcmRlZC4KKyAqICAgLSBpZiB0aGUgbWVzc2FnZSBpcyBhIHJlcXVlc3QsIGl0IGlzIHBhc3NlZCBhZ2FpbiB0byB0aGUgcm91dGluZyBzdGFjaywgYW5kIG1hcmtlZCBhcyBub24tbG9jYWwgaGFuZGxpbmcuCisgKgorICogUkVUVVJOIFZBTFVFOgorICogIDAgICAgICAJOiBUaGUgY2FsbGJhY2sgZXhlY3V0ZWQgc3VjY2Vzc2Z1bGx5IGFuZCB1cGRhdGVkICphY3Rpb24gYXBwcm9wcmlhdGVseS4KKyAqICAhMAkJOiBzdGFuZGFyZCBlcnJvcnMuIEluIGNhc2Ugb2YgZXJyb3IsIHRoZSBtZXNzYWdlIGlzIGRpc2NhcmRlZC4KKyAqLworCisvKiBUaGlzIHN0cnVjdHVyZSByZXByZXNlbnRzIGEgaGFuZGxlciBmb3IgYSByZWdpc3RlcmVkIGNhbGxiYWNrLCBhbGxvd2luZyBpdHMgZGUtcmVnaXN0cmF0aW9uICovCitzdHJ1Y3QgZGlzcF9oZGw7CisKKy8qCisgKiBGVU5DVElPTjoJZmRfZGlzcF9yZWdpc3RlcgorICoKKyAqIFBBUkFNRVRFUlM6CisgKiAgY2IgCQkgIDogVGhlIGNhbGxiYWNrIGZ1bmN0aW9uIHRvIHJlZ2lzdGVyIChzZWUgZGlzcGF0Y2hfY2FsbGJhY2sgZGVzY3JpcHRpb24gYWJvdmUpLgorICogIGhvdwkgIAkgIDogSG93IHRoZSBjYWxsYmFjayBtdXN0IGJlIHJlZ2lzdGVyZWQuCisgKiAgd2hlbiAgICAgICAgICA6IFZhbHVlcyB0aGF0IG11c3QgbWF0Y2gsIGRlcGVuZGluZyBvbiB0aGUgaG93IGFyZ3VtZW50LgorICogIG9wYXF1ZSAgICAgICAgOiBBIHBvaW50ZXIgdGhhdCBpcyBwYXNzZWQgYmFjayB0byB0aGUgaGFuZGxlci4gVGhlIGNvbnRlbnQgaXMgbm90IGludGVycHJldGVkIGJ5IHRoZSBmcmFtZXdvcmsuCisgKiAgaGFuZGxlICAgICAgICA6IE9uIHN1Y2Nlc3MsIGEgaGFuZGxlciB0byB0aGUgcmVnaXN0ZXJlZCBjYWxsYmFjayBpcyBzdG9yZWQgaGVyZSBpZiBub3QgTlVMTC4gCisgKgkJICAgVGhpcyBoYW5kbGVyIGNhbiBiZSB1c2VkIHRvIHVucmVnaXN0ZXIgdGhlIGNiLgorICoKKyAqIERFU0NSSVBUSU9OOiAKKyAqICAgUmVnaXN0ZXIgYSBuZXcgY2FsbGJhY2sgdG8gaGFuZGxlIG1lc3NhZ2VzIGRlbGl2ZXJlZCBsb2NhbGx5LgorICoKKyAqIFJFVFVSTiBWQUxVRToKKyAqICAwICAgICAgCTogVGhlIGNhbGxiYWNrIGlzIHJlZ2lzdGVyZWQuCisgKiAgRUlOVkFMIAk6IEEgcGFyYW1ldGVyIGlzIGludmFsaWQuCisgKiAgRU5PTUVNCTogTm90IGVub3VnaCBtZW1vcnkgdG8gY29tcGxldGUgdGhlIG9wZXJhdGlvbgorICovCitpbnQgZmRfZGlzcF9yZWdpc3RlciAoIGludCAoKmNiKSggc3RydWN0IG1zZyAqKiwgc3RydWN0IGF2cCAqLCBzdHJ1Y3Qgc2Vzc2lvbiAqLCB2b2lkICosIGVudW0gZGlzcF9hY3Rpb24gKiksIAorCQkJZW51bSBkaXNwX2hvdyBob3csIHN0cnVjdCBkaXNwX3doZW4gKiB3aGVuLCB2b2lkICogb3BhcXVlLCBzdHJ1Y3QgZGlzcF9oZGwgKiogaGFuZGxlICk7CisKKy8qCisgKiBGVU5DVElPTjoJZmRfZGlzcF91bnJlZ2lzdGVyCisgKgorICogUEFSQU1FVEVSUzoKKyAqICBoYW5kbGUgICAgICAgOiBMb2NhdGlvbiBvZiB0aGUgaGFuZGxlIG9mIHRoZSBjYWxsYmFjayB0aGF0IG11c3QgYmUgdW5yZWdpc3RlcmVkLgorICogIG9wYXF1ZSAgICAgICA6IElmIG5vdCBOVUxMLCB0aGUgb3BhcXVlIGRhdGEgdGhhdCB3YXMgcmVnaXN0ZXJlZCBpcyByZXN0b3JlZCBoZXJlLgorICoKKyAqIERFU0NSSVBUSU9OOiAKKyAqICAgUmVtb3ZlcyBhIGNhbGxiYWNrIHByZXZpb3VzbHkgcmVnaXN0ZXJlZCBieSBmZF9kaXNwX3JlZ2lzdGVyLgorICoKKyAqIFJFVFVSTiBWQUxVRToKKyAqICAwICAgICAgCTogVGhlIGNhbGxiYWNrIGlzIHVucmVnaXN0ZXJlZC4KKyAqICBFSU5WQUwgCTogQSBwYXJhbWV0ZXIgaXMgaW52YWxpZC4KKyAqLworaW50IGZkX2Rpc3BfdW5yZWdpc3RlciAoIHN0cnVjdCBkaXNwX2hkbCAqKiBoYW5kbGUsIHZvaWQgKiogb3BhcXVlICk7CisKKy8qIERlc3Ryb3kgYWxsIGhhbmRsZXJzICovCit2b2lkIGZkX2Rpc3BfdW5yZWdpc3Rlcl9hbGwgKCB2b2lkICk7CisKKy8qCisgKiBGVU5DVElPTjoJZmRfbXNnX2Rpc3BhdGNoCisgKgorICogUEFSQU1FVEVSUzoKKyAqICBtc2cgCTogQSBtc2cgb2JqZWN0IHRoYXQgaGF2ZSBhbHJlYWR5IGJlZW4gZmRfbXNnX3BhcnNlX2RpY3QuCisgKiAgc2Vzc2lvbgk6IFRoZSBzZXNzaW9uIGNvcnJlc3BvbmRpbmcgdG8gdGhpcyBvYmplY3QsIGlmIGFueS4KKyAqICBhY3Rpb24JOiBVcG9uIHJldHVybiwgdGhlIGFjdGlvbiB0aGF0IG11c3QgYmUgdGFrZW4gb24gdGhlIG1lc3NhZ2UKKyAqICBlcnJvcl9jb2RlCTogVXBvbiByZXR1cm4gd2l0aCBhY3Rpb24gPT0gRElTUF9BQ1RfRVJST1IsIGNvbnRhaW5zIHRoZSBlcnJvciAoc3VjaCBhcyAiRElBTUVURVJfVU5BQkxFX1RPX0NPTVBMWSIpCisgKiAgZHJvcF9yZWFzb24gOiBpZiBzZXQgb24gcmV0dXJuLCB0aGUgbWVzc2FnZSBtdXN0IGJlIGZyZWVkIGZvciB0aGlzIHJlYXNvbi4KKyAqICBkcm9wX21zZyAgICA6IGlmIGRyb3BfcmVhc29uIGlzIHNldCwgdGhpcyBwb2ludHMgdG8gdGhlIG1lc3NhZ2UgdG8gYmUgZnJlZWQgd2hpbGUgKm1zZyBpcyBOVUxMLgorICoKKyAqIERFU0NSSVBUSU9OOiAKKyAqICAgQ2FsbCBhbGwgaGFuZGxlcnMgcmVnaXN0ZXJlZCBmb3IgYSBnaXZlbiBtZXNzYWdlLgorICogIFRoZSBzZXNzaW9uIG11c3QgaGF2ZSBhbHJlYWR5IGJlZW4gcmVzb2x2ZWQgb24gZW50cnkuCisgKiAgVGhlIG1zZyBwb2ludGVkIG1heSBiZSB1cGRhdGVkIGR1cmluZyB0aGlzIHByb2Nlc3MuCisgKiAgVXBvbiByZXR1cm4sIHRoZSBhY3Rpb24gcGFyYW1ldGVyIHBvaW50cyB0byB3aGF0IG11c3QgYmUgZG9uZSBuZXh0LgorICoKKyAqIFJFVFVSTiBWQUxVRToKKyAqICAwICAgICAgCTogU3VjY2Vzcy4KKyAqICBFSU5WQUwgCTogQSBwYXJhbWV0ZXIgaXMgaW52YWxpZC4KKyAqICAob3RoZXIgZXJyb3JzKQorICovCitpbnQgZmRfbXNnX2Rpc3BhdGNoICggc3RydWN0IG1zZyAqKiBtc2csIHN0cnVjdCBzZXNzaW9uICogc2Vzc2lvbiwgZW51bSBkaXNwX2FjdGlvbiAqYWN0aW9uLCBjaGFyICoqIGVycm9yX2NvZGUsIGNoYXIgKiogZHJvcF9yZWFzb24sIHN0cnVjdCBtc2cgKiogZHJvcF9tc2cgKTsKKworCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKy8qICAgICAgICAgICAgICAgICAgICAgUVVFVUVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworLyogTWFuYWdlbWVudCBvZiBGSUZPIHF1ZXVlcyBvZiBlbGVtZW50cyAqLworCisvKiBBIHF1ZXVlIGlzIGFuIG9wYXF1ZSBvYmplY3QgKi8KK3N0cnVjdCBmaWZvOworCisvKgorICogRlVOQ1RJT046CWZkX2ZpZm9fbmV3CisgKgorICogUEFSQU1FVEVSUzoKKyAqICBxdWV1ZQk6IFVwb24gc3VjY2VzcywgYSBwb2ludGVyIHRvIHRoZSBuZXcgcXVldWUgaXMgc2F2ZWQgaGVyZS4KKyAqICBtYXgJCTogbWF4IG51bWJlciBvZiBpdGVtcyBpbiB0aGUgcXVldWUuIEFib3ZlIHRoaXMgbnVtYmVyLCBhZGRpbmcgYSBuZXcgaXRlbSBiZWNvbWVzIGEKKyAqCQkgIGJsb2NraW5nIG9wZXJhdGlvbi4gVXNlIDAgdG8gZGlzYWJsZSB0aGlzIG1heGltdW0uCisgKgorICogREVTQ1JJUFRJT046IAorICogIENyZWF0ZSBhIG5ldyBlbXB0eSBxdWV1ZS4KKyAqCisgKiBSRVRVUk4gVkFMVUUgOgorICogIDAJCTogVGhlIHF1ZXVlIGhhcyBiZWVuIGluaXRpYWxpemVkIHN1Y2Nlc3NmdWxseS4KKyAqICBFSU5WQUwgCTogVGhlIHBhcmFtZXRlciBpcyBpbnZhbGlkLgorICogIEVOT01FTQk6IE5vdCBlbm91Z2ggbWVtb3J5IHRvIGNvbXBsZXRlIHRoZSBjcmVhdGlvbi4gIAorICovCitpbnQgZmRfZmlmb19uZXcgKCBzdHJ1Y3QgZmlmbyAqKiBxdWV1ZSwgaW50IG1heCApOworCisvKgorICogRlVOQ1RJT046CWZkX2ZpZm9fZGVsCisgKgorICogUEFSQU1FVEVSUzoKKyAqICBxdWV1ZQk6IFBvaW50ZXIgdG8gYW4gZW1wdHkgcXVldWUgdG8gZGVsZXRlLgorICoKKyAqIERFU0NSSVBUSU9OOiAKKyAqICBEZXN0cm95cyBhIHF1ZXVlLiBUaGlzIGlzIG9ubHkgcG9zc2libGUgaWYgbm8gdGhyZWFkIGlzIHdhaXRpbmcgZm9yIGFuIGVsZW1lbnQsCisgKiBhbmQgdGhlIHF1ZXVlIGlzIGVtcHR5LgorICoKKyAqIFJFVFVSTiBWQUxVRToKKyAqICAwCQk6IFRoZSBxdWV1ZSBoYXMgYmVlbiBkZXN0cm95ZWQgc3VjY2Vzc2Z1bGx5LgorICogIEVJTlZBTCAJOiBUaGUgcGFyYW1ldGVyIGlzIGludmFsaWQuCisgKi8KK2ludCBmZF9maWZvX2RlbCAoIHN0cnVjdCBmaWZvICAqKiBxdWV1ZSApOworCisvKgorICogRlVOQ1RJT046CWZkX2ZpZm9fbW92ZQorICoKKyAqIFBBUkFNRVRFUlM6CisgKiAgb2xkcQk6IExvY2F0aW9uIG9mIGEgRklGTyB0aGF0IGlzIHRvIGJlIGVtcHRpZWQuCisgKiAgbmV3cQk6IEEgRklGTyB0aGF0IHdpbGwgcmVjZWl2ZSB0aGUgb2xkIGRhdGEuCisgKiAgbG9jX3VwZGF0ZQk6IGlmIG5vbiBOVUxMLCBhIHBsYWNlIHRvIHN0b3JlIHRoZSBwb2ludGVyIHRvIG5ldyBGSUZPIGF0b21pY2FsbHkgd2l0aCB0aGUgbW92ZS4KKyAqCisgKiBERVNDUklQVElPTjogCisgKiAgRW1wdGllcyBhIHF1ZXVlIGFuZCBtb3ZlIGl0cyBjb250ZW50IHRvIGFub3RoZXIgb25lIGF0b21pY2FsbHkuCisgKgorICogUkVUVVJOIFZBTFVFOgorICogIDAJCTogVGhlIHF1ZXVlIGhhcyBiZWVuIGRlc3Ryb3llZCBzdWNjZXNzZnVsbHkuCisgKiAgRUlOVkFMIAk6IEEgcGFyYW1ldGVyIGlzIGludmFsaWQuCisgKi8KK2ludCBmZF9maWZvX21vdmUgKCBzdHJ1Y3QgZmlmbyAqIG9sZHEsIHN0cnVjdCBmaWZvICogbmV3cSwgc3RydWN0IGZpZm8gKiogbG9jX3VwZGF0ZSApOworCisvKgorICogRlVOQ1RJT046CWZkX2ZpZm9fZ2V0c3RhdHMKKyAqCisgKiBQQVJBTUVURVJTOgorICogIHF1ZXVlCSAgOiBUaGUgcXVldWUgZnJvbSB3aGljaCB0byByZXRyaWV2ZSB0aGUgaW5mb3JtYXRpb24uCisgKiAgY3VycmVudF9jb3VudCA6IEhvdyBtYW55IGl0ZW1zIGluIHRoZSBxdWV1ZSBhdCB0aGUgdGltZSBvZiBleGVjdXRpb24uIFRoaXMgY2hhbmdlcyBlYWNoIHRpbWUgYW4gaXRlbSBpcyBwdXNoZWQgb3IgcG9wZWQuCisgKiAgbGltaXRfY291bnQgICA6IFRoZSBtYXhpbXVtIG51bWJlciBvZiBpdGVtcyBhbGxvd2VkIGluIHRoaXMgcXVldWUuIFRoaXMgaXMgc3BlY2lmaWVkIGR1cmluZyBxdWV1ZSBjcmVhdGlvbi4KKyAqICBoaWdoZXN0X2NvdW50IDogVGhlIG1heGltdW0gbnVtYmVyIG9mIGl0ZW1zIHRoaXMgcXVldWUgaGFzIGNvbnRhaW5lZC4gVGhpcyBlbmFibGVzIHRvIHNlZSBpZiBsaW1pdF9jb3VudCBjb3VudCB3YXMgcmVhY2hlZC4KKyAqICB0b3RhbF9jb3VudCAgIDogdGhlIHRvdGFsIG51bWJlciBvZiBpdGVtcyB0aGF0IHdlbnQgdGhyb3VnaCB0aGUgcXVldWUgKGFscmVhZHkgcG9wJ2QpLiBBbHdheXMgaW5jcmVhc2luZy4KKyAqICB0b3RhbAkgIDogQ3VtdWxhdGVkIHRpbWUgYWxsIGl0ZW1zIHNwZW50IGluIHRoaXMgcXVldWUsIGluY2x1ZGluZyBibG9ja2luZyB0aW1lIChhbHdheXMgZ3Jvd2luZywgdXNlIGRlbHRhcyBmb3IgbW9uaXRvcmluZykKKyAqICBibG9ja2luZyAgICAgIDogQ3VtdWxhdGVkIHRpbWUgdGhyZWFkcyB0cnlpbmcgdG8gcG9zdCBuZXcgaXRlbXMgd2VyZSBibG9ja2VkIChxdWV1ZSBmdWxsKS4KKyAqICBsYXN0ICAgICAgICAgIDogRm9yIHRoZSBsYXN0IGVsZW1lbnQgcmV0cmlldmVkIGZyb20gdGhlIHF1ZXVlLCBob3cgbG9uZyBpdCB0YWtlIGJldHdlZW4gcG9zdGluZyAoaW5jbHVkaW5nIGJsb2NraW5nKSBhbmQgcG9waW5nCisgKiAgCisgKiBERVNDUklQVElPTjogCisgKiAgUmV0cmlldmUgdGhlIHRpbWluZyBpbmZvcm1hdGlvbiBhc3NvY2lhdGVkIHdpdGggYSBxdWV1ZSwgZm9yIG1vbml0b3JpbmcgcHVycG9zZS4KKyAqCisgKiBSRVRVUk4gVkFMVUU6CisgKiAgMAkJOiBUaGUgc3RhdGlzdGljcyBoYXZlIGJlZW4gdXBkYXRlZC4KKyAqICBFSU5WQUwgCTogQSBwYXJhbWV0ZXIgaXMgaW52YWxpZC4KKyAqLworaW50IGZkX2ZpZm9fZ2V0c3RhdHMoIHN0cnVjdCBmaWZvICogcXVldWUsIGludCAqIGN1cnJlbnRfY291bnQsIGludCAqIGxpbWl0X2NvdW50LCBpbnQgKiBoaWdoZXN0X2NvdW50LCBsb25nIGxvbmcgKiB0b3RhbF9jb3VudCwgCisJCQkJICAgICAgICAgICBzdHJ1Y3QgdGltZXNwZWMgKiB0b3RhbCwgc3RydWN0IHRpbWVzcGVjICogYmxvY2tpbmcsIHN0cnVjdCB0aW1lc3BlYyAqIGxhc3QpOworCisvKgorICogRlVOQ1RJT046CWZkX2ZpZm9fbGVuZ3RoCisgKgorICogUEFSQU1FVEVSUzoKKyAqICBxdWV1ZQk6IFRoZSBxdWV1ZSBmcm9tIHdoaWNoIHRvIHJldHJpZXZlIHRoZSBudW1iZXIgb2YgZWxlbWVudHMuCisgKgorICogREVTQ1JJUFRJT046IAorICogIFJldHJpZXZlIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gYSBxdWV1ZSwgd2l0aG91dCBlcnJvciBjaGVja2luZy4KKyAqCisgKiBSRVRVUk4gVkFMVUU6CisgKiAgVGhlIG51bWJlciBvZiBpdGVtcyBjdXJyZW50bHkgcXVldWVkLgorICovCitpbnQgZmRfZmlmb19sZW5ndGggKCBzdHJ1Y3QgZmlmbyAqIHF1ZXVlICk7CisKKy8qCisgKiBGVU5DVElPTjoJZmRfZmlmb19zZXR0aHJoZAorICoKKyAqIFBBUkFNRVRFUlM6CisgKiAgcXVldWUJOiBUaGUgcXVldWUgZm9yIHdoaWNoIHRoZSB0aHJlc2hvbGRzIGFyZSBiZWluZyBzZXQuCisgKiAgZGF0YQk6IEFuIG9wYXF1ZSBwb2ludGVyIHRoYXQgaXMgcGFzc2VkIHRvIGhfY2IgYW5kIGxfY2IgY2FsbGJhY2tzLgorICogIGhpZ2ggICAgICAgIDogVGhlIGhpZ2gtbGV2ZWwgdGhyZXNob2xkLiBJZiB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBxdWV1ZSBpbmNyZWFzZSB0byB0aGlzIHZhbHVlLCBoX2NiIGlzIGNhbGxlZC4KKyAqICBoX2NiICAgICAgICA6IGlmIG5vdCBOVUxMLCBhIGNhbGxiYWNrIHRvIGNhbGwgd2hlbiB0aGUgcXVldWUgbGVuZ2ggaXMgYmlnZ2VyIHRoYW4gImhpZ2giLgorICogIGxvdyAgICAgICAgIDogVGhlIGxvdy1sZXZlbCB0aHJlc2hvbGQuIE11c3QgYmUgPCBoaWdoLgorICogIGxfY2IgICAgICAgIDogSWYgdGhlIG51bWJlciBvZiBlbGVtZW50cyBkZWNyZWFzZSB0byBsb3csIHRoaXMgY2FsbGJhY2sgaXMgY2FsbGVkLgorICoKKyAqIERFU0NSSVBUSU9OOiAKKyAqICBUaGlzIGZ1bmN0aW9uIGFsbG93cyB0byBhZGp1c3QgdGhlIG51bWJlciBvZiBwcm9kdWNlciAvIGNvbnN1bWVyIHRocmVhZHMgb2YgYSBxdWV1ZS4KKyAqIElmIHRoZSBjb25zdW1lciBhcmUgc2xvd2VyIHRoYW4gdGhlIHByb2R1Y2VycywgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgcXVldWUgaW5jcmVhc2UuCisgKiBCeSBzZXR0aW5nIGEgImhpZ2giIHZhbHVlLCB3ZSBhbGxvdyBhIGNhbGxiYWNrIHRvIGJlIGNhbGxlZCB3aGVuIHRoaXMgbnVtYmVyIGlzIHRvbyBoaWdoLgorICogVGhlIHR5cGljYWwgdXNlIHdvdWxkIGJlIHRvIGNyZWF0ZSBhbiBhZGRpdGlvbmFsIGNvbnN1bWVyIHRocmVhZCBpbiB0aGlzIGNhbGxiYWNrLgorICogSWYgdGhlIHF1ZXVlIGNvbnRpbnVlcyB0byBncm93LCB0aGUgY2FsbGJhY2sgd2lsbCBiZSBjYWxsZWQgYWdhaW4gd2hlbiB0aGUgbGVuZ3RoIGlzIDIgKiBoaWdoLCB0aGVuIDMqaGlnaCwgLi4uIE4gKiBoaWdoCisgKiAodGhlIGNhbGxiYWNrIGl0c2VsZiBzaG91bGQgaW1wbGVtZW50IGEgbGltaXQgb24gdGhlIG51bWJlciBvZiBjb25zdW1lcnMgdGhhdCBjYW4gYmUgY3JlYXRlZCkKKyAqIFdoZW4gdGhlIHF1ZXVlIHN0YXJ0cyB0byBkZWNyZWFzZSwgYW5kIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgZ28gdW5kZXIgKChOIC0gMSkgKiBoaWdoICsgbG93LCB0aGUgbF9jYiBjYWxsYmFjayBpcyBjYWxsZWQKKyAqIGFuZCB3b3VsZCB0eXBpYWxseSBzdG9wIG9uZSBvZiB0aGUgY29uc3VtZXIgdGhyZWFkcy4gSWYgdGhlIHF1ZXVlIGNvbnRpbnVlcyB0byByZWR1Y2UsIGxfY2IgaXMgYWdhaW4gY2FsbGVkIGF0IChOLTIpKmhpZ2ggKyBsb3csCisgKiBhbmQgc28gb24uCisgKgorICogU2luY2UgdGhlcmUgaXMgbm8gZGVzdHJ1Y3RvciBmb3IgdGhlIGRhdGEgcG9pbnRlciwgaWYgY2xlYW51cCBvcGVyYXRpb25zIGFyZSByZXF1aXJlZCwgdGhleSBzaG91bGQgYmUgcGVyZm9ybWVkIGluCisgKiBsX2NiIHdoZW4gdGhlIGxlbmd0aCBvZiB0aGUgcXVldWUgaXMgYmVjb21pbmcgPCBsb3cuCisgKgorICogTm90ZSB0aGF0IHRoZSBjYWxsYmFja3MgYXJlIGNhbGxlZCBzeW5jaHJvbm91c2x5LCBkdXJpbmcgZmRfZmlmb19wb3N0IG9yIGZkX2ZpZm9fZ2V0LiBUaGVpciBvcGVyYXRpb24gc2hvdWxkIGJlIHF1aWNrLgorICoKKyAqIFJFVFVSTiBWQUxVRToKKyAqICAwCQk6IFRoZSB0aHJlc2hvbGRzIGhhdmUgYmVlbiBzZXQKKyAqICBFSU5WQUwgCTogQSBwYXJhbWV0ZXIgaXMgaW52YWxpZC4KKyAqLworaW50IGZkX2ZpZm9fc2V0dGhyaGQgKCBzdHJ1Y3QgZmlmbyAqIHF1ZXVlLCB2b2lkICogZGF0YSwgdWludDE2X3QgaGlnaCwgdm9pZCAoKmhfY2IpKHN0cnVjdCBmaWZvICosIHZvaWQgKiopLCB1aW50MTZfdCBsb3csIHZvaWQgKCpsX2NiKShzdHJ1Y3QgZmlmbyAqLCB2b2lkICoqKSApOworCisvKgorICogRlVOQ1RJT046CWZkX2ZpZm9fcG9zdAorICoKKyAqIFBBUkFNRVRFUlM6CisgKiAgcXVldWUJOiBUaGUgcXVldWUgaW4gd2hpY2ggdGhlIGVsZW1lbnQgbXVzdCBiZSBwb3N0ZWQuCisgKiAgaXRlbQk6IFRoZSBlbGVtZW50IHRoYXQgaXMgcHV0IGluIHRoZSBxdWV1ZS4KKyAqCisgKiBERVNDUklQVElPTjogCisgKiAgQW4gZWxlbWVudCBpcyBhZGRlZCBpbiBhIHF1ZXVlLiBFbGVtZW50cyBhcmUgcmV0cmlldmVkIGZyb20gdGhlIHF1ZXVlIGluIEZJRk8gb3JkZXIKKyAqICB3aXRoIHRoZSBmZF9maWZvX2dldCwgZmRfZmlmb190cnlnZXQsIG9yIGZkX2ZpZm9fdGltZWRnZXQgZnVuY3Rpb25zLgorICoKKyAqIFJFVFVSTiBWQUxVRToKKyAqICAwCQk6IFRoZSBlbGVtZW50IGlzIHF1ZXVlZC4KKyAqICBFSU5WQUwgCTogQSBwYXJhbWV0ZXIgaXMgaW52YWxpZC4KKyAqICBFTk9NRU0gCTogTm90IGVub3VnaCBtZW1vcnkgdG8gY29tcGxldGUgdGhlIG9wZXJhdGlvbi4KKyAqLworaW50IGZkX2ZpZm9fcG9zdF9pbnQgKCBzdHJ1Y3QgZmlmbyAqIHF1ZXVlLCB2b2lkICoqIGl0ZW0gKTsKKyNkZWZpbmUgZmRfZmlmb19wb3N0KHF1ZXVlLCBpdGVtKSBcCisJZmRfZmlmb19wb3N0X2ludCgocXVldWUpLCAodm9pZCAqKShpdGVtKSkKKworLyogU2ltaWxhciBmdW5jdGlvbiBidXQgZG9lcyBub3QgYmxvY2suIEl0IGNhbiBjYXVzZSB0aGUgbnVtYmVyIG9mIGl0ZW1zIGluIHRoZSBxdWV1ZSB0byBleGNlZWQgdGhlIG1heGltdW0gc2V0LiBEbyBub3QgdXNlIGZvciBub3JtYWwgb3BlcmF0aW9uLAorb25seSBmb3IgZmFpbHVyZSByZWNvdmVyeSBmb3IgZXhhbXBsZS4gKi8KK2ludCBmZF9maWZvX3Bvc3Rfbm9ibG9jayggc3RydWN0IGZpZm8gKiBxdWV1ZSwgdm9pZCAqKiBpdGVtICk7CisKKy8qCisgKiBGVU5DVElPTjoJZmRfZmlmb19nZXQKKyAqCisgKiBQQVJBTUVURVJTOgorICogIHF1ZXVlCTogVGhlIHF1ZXVlIGZyb20gd2hpY2ggdGhlIGZpcnN0IGVsZW1lbnQgbXVzdCBiZSByZXRyaWV2ZWQuCisgKiAgaXRlbQk6IE9uIHJldHVybiwgdGhlIGZpcnN0IGVsZW1lbnQgb2YgdGhlIHF1ZXVlIGlzIHN0b3JlZCBoZXJlLgorICoKKyAqIERFU0NSSVBUSU9OOiAKKyAqICBUaGlzIGZ1bmN0aW9uIHJldHJpZXZlcyB0aGUgZmlyc3QgZWxlbWVudCBmcm9tIGEgcXVldWUuIElmIHRoZSBxdWV1ZSBpcyBlbXB0eSwgdGhlIGZ1bmN0aW9uIHdpbGwgYmxvY2sgdGhlIAorICogdGhyZWFkIHVudGlsIGEgbmV3IGVsZW1lbnQgaXMgcG9zdGVkIHRvIHRoZSBxdWV1ZSwgb3IgdW50aWwgdGhlIHRocmVhZCBpcyBjYW5jZWxlZCAoaW4gd2hpY2ggY2FzZSB0aGUgCisgKiBmdW5jdGlvbiBkb2VzIG5vdCByZXR1cm4pLgorICoKKyAqIFJFVFVSTiBWQUxVRToKKyAqICAwCQk6IEEgbmV3IGVsZW1lbnQgaGFzIGJlZW4gcmV0cmlldmVkLgorICogIEVJTlZBTCAJOiBBIHBhcmFtZXRlciBpcyBpbnZhbGlkLgorICovCitpbnQgZmRfZmlmb19nZXRfaW50ICggc3RydWN0IGZpZm8gKiBxdWV1ZSwgdm9pZCAqKiBpdGVtICk7CisjZGVmaW5lIGZkX2ZpZm9fZ2V0KHF1ZXVlLCBpdGVtKSBcCisJZmRfZmlmb19nZXRfaW50KChxdWV1ZSksICh2b2lkICopKGl0ZW0pKQorCisvKgorICogRlVOQ1RJT046CWZkX2ZpZm9fdHJ5Z2V0CisgKgorICogUEFSQU1FVEVSUzoKKyAqICBxdWV1ZQk6IFRoZSBxdWV1ZSBmcm9tIHdoaWNoIHRoZSBlbGVtZW50IG11c3QgYmUgcmV0cmlldmVkLgorICogIGl0ZW0JOiBPbiByZXR1cm4sIHRoZSBmaXJzdCBlbGVtZW50IG9mIHRoZSBxdWV1ZSBpcyBzdG9yZWQgaGVyZS4KKyAqCisgKiBERVNDUklQVElPTjogCisgKiAgVGhpcyBmdW5jdGlvbiBpcyBzaW1pbGFyIHRvIGZkX2ZpZm9fZ2V0LCBleGNlcHQgdGhhdCBpdCB3aWxsIG5vdCBibG9jayBpZiAKKyAqIHRoZSBxdWV1ZSBpcyBlbXB0eSwgYnV0IHJldHVybiBFV09VTERCTE9DSyBpbnN0ZWFkLgorICoKKyAqIFJFVFVSTiBWQUxVRToKKyAqICAwCQk6IEEgbmV3IGVsZW1lbnQgaGFzIGJlZW4gcmV0cmlldmVkLgorICogIEVJTlZBTCAJOiBBIHBhcmFtZXRlciBpcyBpbnZhbGlkLgorICogIEVXT1VMREJMT0NLIDogVGhlIHF1ZXVlIHdhcyBlbXB0eS4KKyAqLworaW50IGZkX2ZpZm9fdHJ5Z2V0X2ludCAoIHN0cnVjdCBmaWZvICogcXVldWUsIHZvaWQgKiogaXRlbSApOworI2RlZmluZSBmZF9maWZvX3RyeWdldChxdWV1ZSwgaXRlbSkgXAorCWZkX2ZpZm9fdHJ5Z2V0X2ludCgocXVldWUpLCAodm9pZCAqKShpdGVtKSkKKworLyoKKyAqIEZVTkNUSU9OOglmZF9maWZvX3RpbWVkZ2V0CisgKgorICogUEFSQU1FVEVSUzoKKyAqICBxdWV1ZQk6IFRoZSBxdWV1ZSBmcm9tIHdoaWNoIHRoZSBlbGVtZW50IG11c3QgYmUgcmV0cmlldmVkLgorICogIGl0ZW0JOiBPbiByZXR1cm4sIHRoZSBlbGVtZW50IGlzIHN0b3JlZCBoZXJlLgorICogIGFic3RpbWUJOiB0aGUgYWJzb2x1dGUgdGltZSB1bnRpbCB3aGljaCB3ZSBhbGxvdyB3YWl0aW5nIGZvciBhbiBpdGVtLgorICoKKyAqIERFU0NSSVBUSU9OOiAKKyAqICBUaGlzIGZ1bmN0aW9uIGlzIHNpbWlsYXIgdG8gZmRfZmlmb19nZXQsIGV4Y2VwdCB0aGF0IGl0IHdpbGwgYmxvY2sgaWYgdGhlIHF1ZXVlIGlzIGVtcHR5IAorICogb25seSB1bnRpbCB0aGUgYWJzb2x1dGUgdGltZSBhYnN0aW1lIChzZWUgcHRocmVhZF9jb25kX3RpbWVkd2FpdCBmb3IgKyBpbmZvKS4KKyAqIElmIHRoZSBxdWV1ZSBpcyBzdGlsbCBlbXB0eSB3aGVuIHRoZSB0aW1lIGV4cGlyZXMsIHRoZSBmdW5jdGlvbiByZXR1cm5zIEVUSU1FRE9VVAorICoKKyAqIFJFVFVSTiBWQUxVRToKKyAqICAwCQk6IEEgbmV3IGl0ZW0gaGFzIGJlZW4gcmV0cmlldmVkLgorICogIEVJTlZBTCAJOiBBIHBhcmFtZXRlciBpcyBpbnZhbGlkLgorICogIEVUSU1FRE9VVCAgIDogVGhlIHRpbWUgb3V0IGhhcyBwYXNzZWQgYW5kIG5vIGl0ZW0gaGFzIGJlZW4gcmVjZWl2ZWQuCisgKi8KK2ludCBmZF9maWZvX3RpbWVkZ2V0X2ludCAoIHN0cnVjdCBmaWZvICogcXVldWUsIHZvaWQgKiogaXRlbSwgY29uc3Qgc3RydWN0IHRpbWVzcGVjICphYnN0aW1lICk7CisjZGVmaW5lIGZkX2ZpZm9fdGltZWRnZXQocXVldWUsIGl0ZW0sIGFic3RpbWUpIFwKKwlmZF9maWZvX3RpbWVkZ2V0X2ludCgocXVldWUpLCAodm9pZCAqKShpdGVtKSwgKGFic3RpbWUpKQorCisKKy8qCisgKiBGVU5DVElPTjoJZmRfZmlmb19zZWxlY3QKKyAqCisgKiBQQVJBTUVURVJTOgorICogIHF1ZXVlCTogVGhlIHF1ZXVlIHRvIHRlc3QuCisgKiAgYWJzdGltZQk6IHRoZSBhYnNvbHV0ZSB0aW1lIHVudGlsIHdoaWNoIHdlIGNhbiBibG9jayB3YWl0aW5nIGZvciBhbiBpdGVtLiBJZiBOVUxMLCB0aGUgZnVuY3Rpb24gcmV0dXJucyBpbW1lZGlhdGx5LgorICoKKyAqIERFU0NSSVBUSU9OOiAKKyAqICBUaGlzIGZ1bmN0aW9uIGlzIHNpbWlsYXIgdG8gc2VsZWN0KCksIGl0IHdhaXRzIGZvciBkYXRhIHRvIGJlIGF2YWlsYWJsZSBpbiB0aGUgcXVldWUKKyAqIHVudGlsIHRoZSBhYnN0aW1lIGlzIGV4cGlyZWQuCisgKiBVcG9uIGZ1bmN0aW9uIGVudHJ5LCBldmVuIGlmIGFic3RpbWUgaXMgYWxyZWFkeSBleHBpcmVkIHRoZSBkYXRhIGF2YWlsYWJpbGl0eSBpcyB0ZXN0ZWQuCisgKgorICogUkVUVVJOIFZBTFVFOgorICogIDAJCTogdGltZW91dCBleHBpcmVkIHdpdGhvdXQgYXZhaWxhYmxlIGRhdGEuCisgKiAgPDAJCTogQW4gZXJyb3Igb2NjdXJyZWQgKGUuZy4sIC1FSU5WQUwuLi4pCisgKiAgPjAJCTogZGF0YSBpcyBhdmFpbGFibGUuIFRoZSBuZXh0IGNhbGwgdG8gZmRfZmlmb19nZXQgd2lsbCBub3QgYmxvY2suCisgKi8KK2ludCBmZF9maWZvX3NlbGVjdCAoIHN0cnVjdCBmaWZvICogcXVldWUsIGNvbnN0IHN0cnVjdCB0aW1lc3BlYyAqYWJzdGltZSApOworCisKKworLyogRHVtcCBhIGZpZm8gbGlzdCBhbmQgb3B0aW9uYWxseSBpdHMgaW5uZXIgZWxlbWVudHMgLS0gYmV3YXJlIG9mIGRlYWRsb2NrcyEgKi8KK3R5cGVkZWYgREVDTEFSRV9GRF9EVU1QX1BST1RPVFlQRSgoKmZkX2ZpZm9fZHVtcF9pdGVtX2NiKSwgdm9pZCAqIGl0ZW0pOyAvKiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBiZSAxIGxpbmUgaWYgcG9zc2libGUsIG9yIHVzZSBpbmRlbnQgbGV2ZWwuIEVuZHMgd2l0aCAnXG4nICovCitERUNMQVJFX0ZEX0RVTVBfUFJPVE9UWVBFKGZkX2ZpZm9fZHVtcCwgY2hhciAqIG5hbWUsIHN0cnVjdCBmaWZvICogcXVldWUsIGZkX2ZpZm9fZHVtcF9pdGVtX2NiIGR1bXBfaXRlbSk7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBfTElCRkRQUk9UT19IICovCg==