Lyogdmk6IHNldCBzdz00IHRzPTQ6ICovCi8qCiAqIG5mc21vdW50LmMgLS0gTGludXggTkZTIG1vdW50CiAqIENvcHlyaWdodCAoQykgMTk5MyBSaWNrIFNsYWRrZXkgPGpyc0B3b3JsZC5zdGQuY29tPgogKgogKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQogKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCiAqIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQogKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKgogKiBXZWQgRmViICA4IDEyOjUxOjQ4IDE5OTUsIGJpcm9AeWdnZHJhc2lsLmNvbSAoUm9zcyBCaXJvKTogYWxsb3cgYWxsIHBvcnQKICogbnVtYmVycyB0byBiZSBzcGVjaWZpZWQgb24gdGhlIGNvbW1hbmQgbGluZS4KICoKICogRnJpLCA4IE1hciAxOTk2IDE4OjAxOjM5LCBTd2VuIFRodWVtbWxlciA8c3dlbkB1bmktcGFkZXJib3JuLmRlPjoKICogT21pdCB0aGUgY2FsbCB0byBjb25uZWN0KCkgZm9yIExpbnV4IHZlcnNpb24gMS4zLjExIG9yIGxhdGVyLgogKgogKiBXZWQgT2N0ICAxIDIzOjU1OjI4IDE5OTc6IERpY2sgU3RyZWVmbGFuZCA8ZGlja19zdHJlZWZsYW5kQHRhc2tpbmcuY29tPgogKiBJbXBsZW1lbnRlZCB0aGUgImJnIiwgImZnIiBhbmQgInJldHJ5IiBtb3VudCBvcHRpb25zIGZvciBORlMuCiAqCiAqIDE5OTktMDItMjIgQXJrYWRpdXN6IE1ptmtpZXdpY3ogPG1pc2lla0BtaXNpZWsuZXUub3JnPgogKiAtIGFkZGVkIE5hdGl2ZSBMYW5ndWFnZSBTdXBwb3J0CiAqIAogKiBNb2RpZmllZCBieSBPbGFmIEtpcmNoIGFuZCBUcm9uZCBNeWtsZWJ1c3QgZm9yIG5ldyBORlMgY29kZSwKICogcGx1cyBORlN2MyBzdHVmZi4KICovCgovKgogKiBuZnNtb3VudC5jLHYgMS4xLjEuMSAxOTkzLzExLzE4IDA4OjQwOjUxIGpycyBFeHAKICovCgojaW5jbHVkZSAiYnVzeWJveC5oIgojdW5kZWYgRkFMU0UKI3VuZGVmIFRSVUUKI2luY2x1ZGUgPHVuaXN0ZC5oPgojaW5jbHVkZSA8c3RkaW8uaD4KI2luY2x1ZGUgPHN0cmluZy5oPgojaW5jbHVkZSA8ZXJybm8uaD4KI2luY2x1ZGUgPG5ldGRiLmg+CiNpbmNsdWRlIDxycGMvcnBjLmg+CiNpbmNsdWRlIDxycGMvcG1hcF9wcm90Lmg+CiNpbmNsdWRlIDxycGMvcG1hcF9jbG50Lmg+CiNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CiNpbmNsdWRlIDxzeXMvdGltZS5oPgojaW5jbHVkZSA8c3lzL3V0c25hbWUuaD4KI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KI2luY2x1ZGUgPGFycGEvaW5ldC5oPgoKI2luY2x1ZGUgIm5mc21vdW50LmgiCiNpbmNsdWRlIDxsaW51eC9uZnMuaD4gIC8qIEZvciB0aGUga2VybmVscyBuZnMgc3R1ZmYgKi8KCgovKiBEaXNhYmxlIHRoZSBubHMgc3R1ZmYgKi8KIyB1bmRlZiBiaW5kdGV4dGRvbWFpbgojIGRlZmluZSBiaW5kdGV4dGRvbWFpbihEb21haW4sIERpcmVjdG9yeSkgLyogZW1wdHkgKi8KIyB1bmRlZiB0ZXh0ZG9tYWluCiMgZGVmaW5lIHRleHRkb21haW4oRG9tYWluKSAvKiBlbXB0eSAqLwojIGRlZmluZSBfKFRleHQpIChUZXh0KQojIGRlZmluZSBOXyhUZXh0KSAoVGV4dCkKCiNkZWZpbmUgTVNfTUdDX1ZBTAkJMHhjMGVkMDAwMCAvKiBNYWdpYyBudW1iZXIgaW5kaWNhdG5nICJuZXciIGZsYWdzICovCiNkZWZpbmUgTVNfUkRPTkxZICAgICAgICAxICAgICAgLyogTW91bnQgcmVhZC1vbmx5ICovCiNkZWZpbmUgTVNfTk9TVUlEICAgICAgICAyICAgICAgLyogSWdub3JlIHN1aWQgYW5kIHNnaWQgYml0cyAqLwojZGVmaW5lIE1TX05PREVWICAgICAgICAgNCAgICAgIC8qIERpc2FsbG93IGFjY2VzcyB0byBkZXZpY2Ugc3BlY2lhbCBmaWxlcyAqLwojZGVmaW5lIE1TX05PRVhFQyAgICAgICAgOCAgICAgIC8qIERpc2FsbG93IHByb2dyYW0gZXhlY3V0aW9uICovCiNkZWZpbmUgTVNfU1lOQ0hST05PVVMgIDE2ICAgICAgLyogV3JpdGVzIGFyZSBzeW5jZWQgYXQgb25jZSAqLwojZGVmaW5lIE1TX1JFTU9VTlQgICAgICAzMiAgICAgIC8qIEFsdGVyIGZsYWdzIG9mIGEgbW91bnRlZCBGUyAqLwojZGVmaW5lIE1TX01BTkRMT0NLICAgICA2NCAgICAgIC8qIEFsbG93IG1hbmRhdG9yeSBsb2NrcyBvbiBhbiBGUyAqLwojZGVmaW5lIFNfUVVPVEEgICAgICAgICAxMjggICAgIC8qIFF1b3RhIGluaXRpYWxpemVkIGZvciBmaWxlL2RpcmVjdG9yeS9zeW1saW5rICovCiNkZWZpbmUgU19BUFBFTkQgICAgICAgIDI1NiAgICAgLyogQXBwZW5kLW9ubHkgZmlsZSAqLwojZGVmaW5lIFNfSU1NVVRBQkxFICAgICA1MTIgICAgIC8qIEltbXV0YWJsZSBmaWxlICovCiNkZWZpbmUgTVNfTk9BVElNRSAgICAgIDEwMjQgICAgLyogRG8gbm90IHVwZGF0ZSBhY2Nlc3MgdGltZXMuICovCiNkZWZpbmUgTVNfTk9ESVJBVElNRSAgIDIwNDggICAgLyogRG8gbm90IHVwZGF0ZSBkaXJlY3RvcnkgYWNjZXNzIHRpbWVzICovCgoKLyoKICogV2Ugd2FudCB0byBiZSBhYmxlIHRvIGNvbXBpbGUgbW91bnQgb24gb2xkIGtlcm5lbHMgaW4gc3VjaCBhIHdheQogKiB0aGF0IHRoZSBiaW5hcnkgd2lsbCB3b3JrIHdlbGwgb24gbW9yZSByZWNlbnQga2VybmVscy4KICogVGh1cywgaWYgbmVjZXNzYXJ5IHdlIHRlYWNoIG5mc21vdW50LmMgdGhlIHN0cnVjdHVyZSBvZiBuZXcgZmllbGRzCiAqIHRoYXQgd2lsbCBjb21lIGxhdGVyLgogKgogKiBNb3Jlb3ZlciwgdGhlIG5ldyBrZXJuZWwgaW5jbHVkZXMgY29uZmxpY3Qgd2l0aCBnbGliYyBpbmNsdWRlcwogKiBzbyBpdCBpcyBlYXNpZXN0IHRvIGlnbm9yZSB0aGUga2VybmVsIGFsdG9nZXRoZXIgKGF0IGNvbXBpbGUgdGltZSkuCiAqLwoKI2RlZmluZSBORlNfTU9VTlRfVkVSU0lPTgk0CgpzdHJ1Y3QgbmZzMl9maCB7CiAgICAgICAgY2hhciAgICAgICAgICAgICAgICAgICAgZGF0YVszMl07Cn07CnN0cnVjdCBuZnMzX2ZoIHsKICAgICAgICB1bnNpZ25lZCBzaG9ydCAgICAgICAgICBzaXplOwogICAgICAgIHVuc2lnbmVkIGNoYXIgICAgICAgICAgIGRhdGFbNjRdOwp9OwoKc3RydWN0IG5mc19tb3VudF9kYXRhIHsKCWludAkJdmVyc2lvbjsJCS8qIDEgKi8KCWludAkJZmQ7CQkJLyogMSAqLwoJc3RydWN0IG5mczJfZmgJb2xkX3Jvb3Q7CQkvKiAxICovCglpbnQJCWZsYWdzOwkJCS8qIDEgKi8KCWludAkJcnNpemU7CQkJLyogMSAqLwoJaW50CQl3c2l6ZTsJCQkvKiAxICovCglpbnQJCXRpbWVvOwkJCS8qIDEgKi8KCWludAkJcmV0cmFuczsJCS8qIDEgKi8KCWludAkJYWNyZWdtaW47CQkvKiAxICovCglpbnQJCWFjcmVnbWF4OwkJLyogMSAqLwoJaW50CQlhY2Rpcm1pbjsJCS8qIDEgKi8KCWludAkJYWNkaXJtYXg7CQkvKiAxICovCglzdHJ1Y3Qgc29ja2FkZHJfaW4gYWRkcjsJCS8qIDEgKi8KCWNoYXIJCWhvc3RuYW1lWzI1Nl07CQkvKiAxICovCglpbnQJCW5hbWxlbjsJCQkvKiAyICovCgl1bnNpZ25lZCBpbnQJYnNpemU7CQkJLyogMyAqLwoJc3RydWN0IG5mczNfZmgJcm9vdDsJCQkvKiA0ICovCn07CgovKiBiaXRzIGluIHRoZSBmbGFncyBmaWVsZCAqLwoKI2RlZmluZSBORlNfTU9VTlRfU09GVAkJMHgwMDAxCS8qIDEgKi8KI2RlZmluZSBORlNfTU9VTlRfSU5UUgkJMHgwMDAyCS8qIDEgKi8KI2RlZmluZSBORlNfTU9VTlRfU0VDVVJFCTB4MDAwNAkvKiAxICovCiNkZWZpbmUgTkZTX01PVU5UX1BPU0lYCQkweDAwMDgJLyogMSAqLwojZGVmaW5lIE5GU19NT1VOVF9OT0NUTwkJMHgwMDEwCS8qIDEgKi8KI2RlZmluZSBORlNfTU9VTlRfTk9BQwkJMHgwMDIwCS8qIDEgKi8KI2RlZmluZSBORlNfTU9VTlRfVENQCQkweDAwNDAJLyogMiAqLwojZGVmaW5lIE5GU19NT1VOVF9WRVIzCQkweDAwODAJLyogMyAqLwojZGVmaW5lIE5GU19NT1VOVF9LRVJCRVJPUwkweDAxMDAJLyogMyAqLwojZGVmaW5lIE5GU19NT1VOVF9OT05MTQkJMHgwMjAwCS8qIDMgKi8KCgojZGVmaW5lIFVUSUxfTElOVVhfVkVSU0lPTiAiMi4xMG0iCiNkZWZpbmUgdXRpbF9saW51eF92ZXJzaW9uICJ1dGlsLWxpbnV4LTIuMTBtIgoKI2RlZmluZSBIQVZFX2luZXRfYXRvbgojZGVmaW5lIEhBVkVfc2NzaV9oCiNkZWZpbmUgSEFWRV9ibGtwZ19oCiNkZWZpbmUgSEFWRV9rZF9oCiNkZWZpbmUgSEFWRV90ZXJtY2FwCiNkZWZpbmUgSEFWRV9sb2NhbGVfaAojZGVmaW5lIEhBVkVfbGliaW50bF9oCiNkZWZpbmUgRU5BQkxFX05MUwojZGVmaW5lIEhBVkVfbGFuZ2luZm9faAojZGVmaW5lIEhBVkVfcHJvZ25hbWUKI2RlZmluZSBIQVZFX29wZW5wdHkKI2RlZmluZSBIQVZFX25hbm9zbGVlcAojZGVmaW5lIEhBVkVfcGVyc29uYWxpdHkKI2RlZmluZSBIQVZFX3RtX2dtdG9mZgoKZXh0ZXJuIGNoYXIgKnhzdHJkdXAgKGNvbnN0IGNoYXIgKnMpOwpleHRlcm4gY2hhciAqeHN0cm5kdXAgKGNvbnN0IGNoYXIgKnMsIGludCBuKTsKc3RhdGljIGNoYXIgKm5mc19zdHJlcnJvcihpbnQgc3RhdCk7CgojZGVmaW5lIE1BS0VfVkVSU0lPTihwLHEscikJKDY1NTM2KihwKSArIDI1NioocSkgKyAocikpCiNkZWZpbmUgTUFYX05GU1BST1QgKChuZnNfbW91bnRfdmVyc2lvbiA+PSA0KSA/IDMgOiAyKQoKI2RlZmluZSBFWF9GQUlMCQkJMzIgICAgICAgLyogbW91bnQgZmFpbHVyZSAqLwojZGVmaW5lIEVYX0JHCQkJMjU2ICAgICAgIC8qIHJldHJ5IGluIGJhY2tncm91bmQgKGludGVybmFsIG9ubHkpICovCgoKLyoKICogbmZzX21vdW50X3ZlcnNpb24gYWNjb3JkaW5nIHRvIHRoZSBzb3VyY2VzIHNlZW4gYXQgY29tcGlsZSB0aW1lLgogKi8KaW50IG5mc19tb3VudF92ZXJzaW9uID0gTkZTX01PVU5UX1ZFUlNJT047CgovKgogKiBVbmZvcnR1bmF0ZWx5LCB0aGUga2VybmVsIHByaW50cyBhbm5veWluZyBjb25zb2xlIG1lc3NhZ2VzCiAqIGluIGNhc2Ugb2YgYW4gdW5leHBlY3RlZCBuZnMgbW91bnQgdmVyc2lvbiAoaW5zdGVhZCBvZgogKiBqdXN0IHJldHVybmluZyBzb21lIGVycm9yKS4gIFRoZXJlZm9yZSB3ZSdsbCBoYXZlIHRvIHRyeQogKiBhbmQgZmlndXJlIG91dCB3aGF0IHZlcnNpb24gdGhlIGtlcm5lbCBleHBlY3RzLgogKgogKiBWYXJpYWJsZXM6CiAqCUtFUk5FTF9ORlNfTU9VTlRfVkVSU0lPTjoga2VybmVsIHNvdXJjZXMgYXQgY29tcGlsZSB0aW1lCiAqCU5GU19NT1VOVF9WRVJTSU9OOiB0aGVzZSBuZnNtb3VudCBzb3VyY2VzIGF0IGNvbXBpbGUgdGltZQogKgluZnNfbW91bnRfdmVyc2lvbjogdmVyc2lvbiB0aGlzIHNvdXJjZSBhbmQgcnVubmluZyBrZXJuZWwgY2FuIGhhbmRsZQogKi8Kc3RhdGljIHZvaWQKZmluZF9rZXJuZWxfbmZzX21vdW50X3ZlcnNpb24odm9pZCkgewoJc3RhdGljIGludCBrZXJuZWxfdmVyc2lvbiA9IDA7CgoJaWYgKGtlcm5lbF92ZXJzaW9uKQoJCXJldHVybjsKCglrZXJuZWxfdmVyc2lvbiA9IGdldF9rZXJuZWxfcmV2aXNpb24oKTsKCglpZiAoa2VybmVsX3ZlcnNpb24pIHsKCSAgICAgaWYgKGtlcm5lbF92ZXJzaW9uIDwgTUFLRV9WRVJTSU9OKDIsMSwzMikpCgkJICBuZnNfbW91bnRfdmVyc2lvbiA9IDE7CgkgICAgIGVsc2UgaWYgKGtlcm5lbF92ZXJzaW9uIDwgTUFLRV9WRVJTSU9OKDIsMyw5OSkpCgkJICBuZnNfbW91bnRfdmVyc2lvbiA9IDM7CgkgICAgIGVsc2UKCQkgIG5mc19tb3VudF92ZXJzaW9uID0gNDsgLyogc2luY2UgMi4zLjk5cHJlNCAqLwoJfQoJaWYgKG5mc19tb3VudF92ZXJzaW9uID4gTkZTX01PVU5UX1ZFUlNJT04pCgkgICAgIG5mc19tb3VudF92ZXJzaW9uID0gTkZTX01PVU5UX1ZFUlNJT047Cn0KCnN0YXRpYyBzdHJ1Y3QgcG1hcCAqCmdldF9tb3VudHBvcnQoc3RydWN0IHNvY2thZGRyX2luICpzZXJ2ZXJfYWRkciwKICAgICAgbG9uZyB1bnNpZ25lZCBwcm9nLAogICAgICBsb25nIHVuc2lnbmVkIHZlcnNpb24sCiAgICAgIGxvbmcgdW5zaWduZWQgcHJvdG8sCiAgICAgIGxvbmcgdW5zaWduZWQgcG9ydCkKewpzdHJ1Y3QgcG1hcGxpc3QgKnBtYXA7CnN0YXRpYyBzdHJ1Y3QgcG1hcCBwID0gezAsIDAsIDAsIDB9OwoKc2VydmVyX2FkZHItPnNpbl9wb3J0ID0gUE1BUFBPUlQ7CnBtYXAgPSBwbWFwX2dldG1hcHMoc2VydmVyX2FkZHIpOwoKaWYgKHZlcnNpb24gPiBNQVhfTkZTUFJPVCkKCXZlcnNpb24gPSBNQVhfTkZTUFJPVDsKaWYgKCFwcm9nKQoJcHJvZyA9IE1PVU5UUFJPRzsKcC5wbV9wcm9nID0gcHJvZzsKcC5wbV92ZXJzID0gdmVyc2lvbjsKcC5wbV9wcm90ID0gcHJvdG87CnAucG1fcG9ydCA9IHBvcnQ7Cgp3aGlsZSAocG1hcCkgewoJaWYgKHBtYXAtPnBtbF9tYXAucG1fcHJvZyAhPSBwcm9nKQoJCWdvdG8gbmV4dDsKCWlmICghdmVyc2lvbiAmJiBwLnBtX3ZlcnMgPiBwbWFwLT5wbWxfbWFwLnBtX3ZlcnMpCgkJZ290byBuZXh0OwoJaWYgKHZlcnNpb24gPiAyICYmIHBtYXAtPnBtbF9tYXAucG1fdmVycyAhPSB2ZXJzaW9uKQoJCWdvdG8gbmV4dDsKCWlmICh2ZXJzaW9uICYmIHZlcnNpb24gPD0gMiAmJiBwbWFwLT5wbWxfbWFwLnBtX3ZlcnMgPiAyKQoJCWdvdG8gbmV4dDsKCWlmIChwbWFwLT5wbWxfbWFwLnBtX3ZlcnMgPiBNQVhfTkZTUFJPVCB8fAoJICAgIChwcm90byAmJiBwLnBtX3Byb3QgJiYgcG1hcC0+cG1sX21hcC5wbV9wcm90ICE9IHByb3RvKSB8fAoJICAgIChwb3J0ICYmIHBtYXAtPnBtbF9tYXAucG1fcG9ydCAhPSBwb3J0KSkKCQlnb3RvIG5leHQ7CgltZW1jcHkoJnAsICZwbWFwLT5wbWxfbWFwLCBzaXplb2YocCkpOwpuZXh0OgoJcG1hcCA9IHBtYXAtPnBtbF9uZXh0Owp9CmlmICghcC5wbV92ZXJzKQoJcC5wbV92ZXJzID0gTU9VTlRWRVJTOwppZiAoIXAucG1fcG9ydCkKCXAucG1fcG9ydCA9IE1PVU5UUE9SVDsKaWYgKCFwLnBtX3Byb3QpCglwLnBtX3Byb3QgPSBJUFBST1RPX1RDUDsKcmV0dXJuICZwOwp9CgppbnQgbmZzbW91bnQoY29uc3QgY2hhciAqc3BlYywgY29uc3QgY2hhciAqbm9kZSwgaW50ICpmbGFncywKCSAgICAgY2hhciAqKmV4dHJhX29wdHMsIGNoYXIgKiptb3VudF9vcHRzLCBpbnQgcnVubmluZ19iZykKewoJc3RhdGljIGNoYXIgKnByZXZfYmdfaG9zdDsKCWNoYXIgaG9zdGRpclsxMDI0XTsKCUNMSUVOVCAqbWNsaWVudDsKCWNoYXIgKmhvc3RuYW1lOwoJY2hhciAqZGlybmFtZTsKCWNoYXIgKm9sZF9vcHRzOwoJY2hhciAqbW91bnRob3N0PU5VTEw7CgljaGFyIG5ld19vcHRzWzEwMjRdOwoJc3RydWN0IHRpbWV2YWwgdG90YWxfdGltZW91dDsKCWVudW0gY2xudF9zdGF0IGNsbnRfc3RhdDsKCXN0YXRpYyBzdHJ1Y3QgbmZzX21vdW50X2RhdGEgZGF0YTsKCWNoYXIgKm9wdCwgKm9wdGVxOwoJaW50IHZhbDsKCXN0cnVjdCBob3N0ZW50ICpocDsKCXN0cnVjdCBzb2NrYWRkcl9pbiBzZXJ2ZXJfYWRkcjsKCXN0cnVjdCBzb2NrYWRkcl9pbiBtb3VudF9zZXJ2ZXJfYWRkcjsKCXN0cnVjdCBwbWFwKiBwbV9tbnQ7CglpbnQgbXNvY2ssIGZzb2NrOwoJc3RydWN0IHRpbWV2YWwgcmV0cnlfdGltZW91dDsKCXVuaW9uIHsKCQlzdHJ1Y3QgZmhzdGF0dXMgbmZzdjI7CgkJc3RydWN0IG1vdW50cmVzMyBuZnN2MzsKCX0gc3RhdHVzOwoJc3RydWN0IHN0YXQgc3RhdGJ1ZjsKCWNoYXIgKnM7CglpbnQgcG9ydDsKCWludCBtb3VudHBvcnQ7CglpbnQgcHJvdG87CglpbnQgYmc7CglpbnQgc29mdDsKCWludCBpbnRyOwoJaW50IHBvc2l4OwoJaW50IG5vY3RvOwoJaW50IG5vYWM7CglpbnQgbm9sb2NrOwoJaW50IHJldHJ5OwoJaW50IHRjcDsKCWludCBtb3VudHByb2c7CglpbnQgbW91bnR2ZXJzOwoJaW50IG5mc3Byb2c7CglpbnQgbmZzdmVyczsKCWludCByZXR2YWw7Cgl0aW1lX3QgdDsKCXRpbWVfdCBwcmV2dDsKCXRpbWVfdCB0aW1lb3V0OwoKCWZpbmRfa2VybmVsX25mc19tb3VudF92ZXJzaW9uKCk7CgoJcmV0dmFsID0gRVhfRkFJTDsKCW1zb2NrID0gZnNvY2sgPSAtMTsKCW1jbGllbnQgPSBOVUxMOwoJaWYgKHN0cmxlbihzcGVjKSA+PSBzaXplb2YoaG9zdGRpcikpIHsKCQllcnJvck1zZygiZXhjZXNzaXZlbHkgbG9uZyBob3N0OmRpciBhcmd1bWVudFxuIik7CgkJZ290byBmYWlsOwoJfQoJc3RyY3B5KGhvc3RkaXIsIHNwZWMpOwoJaWYgKChzID0gc3RyY2hyKGhvc3RkaXIsICc6JykpKSB7CgkJaG9zdG5hbWUgPSBob3N0ZGlyOwoJCWRpcm5hbWUgPSBzICsgMTsKCQkqcyA9ICdcMCc7CgkJLyogSWdub3JlIGFsbCBidXQgZmlyc3QgaG9zdG5hbWUgaW4gcmVwbGljYXRlZCBtb3VudHMKCQkgICB1bnRpbCB0aGV5IGNhbiBiZSBmdWxseSBzdXBwb3J0ZWQuIChtYWNrQHNnaS5jb20pICovCgkJaWYgKChzID0gc3RyY2hyKGhvc3RkaXIsICcsJykpKSB7CgkJCSpzID0gJ1wwJzsKCQkJZXJyb3JNc2coIndhcm5pbmc6IG11bHRpcGxlIGhvc3RuYW1lcyBub3Qgc3VwcG9ydGVkXG4iKTsKCQl9Cgl9IGVsc2UgewoJCWVycm9yTXNnKCJkaXJlY3RvcnkgdG8gbW91bnQgbm90IGluIGhvc3Q6ZGlyIGZvcm1hdFxuIik7CgkJZ290byBmYWlsOwoJfQoKCXNlcnZlcl9hZGRyLnNpbl9mYW1pbHkgPSBBRl9JTkVUOwojaWZkZWYgSEFWRV9pbmV0X2F0b24KCWlmICghaW5ldF9hdG9uKGhvc3RuYW1lLCAmc2VydmVyX2FkZHIuc2luX2FkZHIpKQojZW5kaWYKCXsKCQlpZiAoKGhwID0gZ2V0aG9zdGJ5bmFtZShob3N0bmFtZSkpID09IE5VTEwpIHsKCQkJZXJyb3JNc2coImNhbid0IGdldCBhZGRyZXNzIGZvciAlc1xuIiwgaG9zdG5hbWUpOwoJCQlnb3RvIGZhaWw7CgkJfSBlbHNlIHsKCQkJaWYgKGhwLT5oX2xlbmd0aCA+IHNpemVvZihzdHJ1Y3QgaW5fYWRkcikpIHsKCQkJCWVycm9yTXNnKCJnb3QgYmFkIGhwLT5oX2xlbmd0aFxuIik7CgkJCQlocC0+aF9sZW5ndGggPSBzaXplb2Yoc3RydWN0IGluX2FkZHIpOwoJCQl9CgkJCW1lbWNweSgmc2VydmVyX2FkZHIuc2luX2FkZHIsCgkJCSAgICAgICBocC0+aF9hZGRyLCBocC0+aF9sZW5ndGgpOwoJCX0KCX0KCgltZW1jcHkgKCZtb3VudF9zZXJ2ZXJfYWRkciwgJnNlcnZlcl9hZGRyLCBzaXplb2YgKG1vdW50X3NlcnZlcl9hZGRyKSk7CgoJLyogYWRkIElQIGFkZHJlc3MgdG8gbXRhYiBvcHRpb25zIGZvciB1c2Ugd2hlbiB1bm1vdW50aW5nICovCgoJcyA9IGluZXRfbnRvYShzZXJ2ZXJfYWRkci5zaW5fYWRkcik7CglvbGRfb3B0cyA9ICpleHRyYV9vcHRzOwoJaWYgKCFvbGRfb3B0cykKCQlvbGRfb3B0cyA9ICIiOwoJaWYgKHN0cmxlbihvbGRfb3B0cykgKyBzdHJsZW4ocykgKyAxMCA+PSBzaXplb2YobmV3X29wdHMpKSB7CgkJZXJyb3JNc2coImV4Y2Vzc2l2ZWx5IGxvbmcgb3B0aW9uIGFyZ3VtZW50XG4iKTsKCQlnb3RvIGZhaWw7Cgl9CglzcHJpbnRmKG5ld19vcHRzLCAiJXMlc2FkZHI9JXMiLAoJCW9sZF9vcHRzLCAqb2xkX29wdHMgPyAiLCIgOiAiIiwgcyk7CgkqZXh0cmFfb3B0cyA9IHhzdHJkdXAobmV3X29wdHMpOwoKCS8qIFNldCBkZWZhdWx0IG9wdGlvbnMuCgkgKiByc2l6ZS93c2l6ZSAoYW5kIGJzaXplLCBmb3IgdmVyID49IDMpIGFyZSBsZWZ0IDAgaW4gb3JkZXIgdG8KCSAqIGxldCB0aGUga2VybmVsIGRlY2lkZS4KCSAqIHRpbWVvIGlzIGZpbGxlZCBpbiBhZnRlciB3ZSBrbm93IHdoZXRoZXIgaXQnbGwgYmUgVENQIG9yIFVEUC4gKi8KCW1lbXNldCgmZGF0YSwgMCwgc2l6ZW9mKGRhdGEpKTsKCWRhdGEucmV0cmFucwk9IDM7CglkYXRhLmFjcmVnbWluCT0gMzsKCWRhdGEuYWNyZWdtYXgJPSA2MDsKCWRhdGEuYWNkaXJtaW4JPSAzMDsKCWRhdGEuYWNkaXJtYXgJPSA2MDsKI2lmIE5GU19NT1VOVF9WRVJTSU9OID49IDIKCWRhdGEubmFtbGVuCT0gTkFNRV9NQVg7CiNlbmRpZgoKCWJnID0gMDsKCXNvZnQgPSAwOwoJaW50ciA9IDA7Cglwb3NpeCA9IDA7Cglub2N0byA9IDA7Cglub2xvY2sgPSAwOwoJbm9hYyA9IDA7CglyZXRyeSA9IDEwMDAwOwkJLyogMTAwMDAgbWludXRlcyB+IDEgd2VlayAqLwoJdGNwID0gMDsKCgltb3VudHByb2cgPSBNT1VOVFBST0c7Cgltb3VudHZlcnMgPSAwOwoJcG9ydCA9IDA7Cgltb3VudHBvcnQgPSAwOwoJbmZzcHJvZyA9IE5GU19QUk9HUkFNOwoJbmZzdmVycyA9IDA7CgoJLyogcGFyc2Ugb3B0aW9ucyAqLwoKCWZvciAob3B0ID0gc3RydG9rKG9sZF9vcHRzLCAiLCIpOyBvcHQ7IG9wdCA9IHN0cnRvayhOVUxMLCAiLCIpKSB7CgkJaWYgKChvcHRlcSA9IHN0cmNocihvcHQsICc9JykpKSB7CgkJCXZhbCA9IGF0b2kob3B0ZXEgKyAxKTsJCgkJCSpvcHRlcSA9ICdcMCc7CgkJCWlmICghc3RyY21wKG9wdCwgInJzaXplIikpCgkJCQlkYXRhLnJzaXplID0gdmFsOwoJCQllbHNlIGlmICghc3RyY21wKG9wdCwgIndzaXplIikpCgkJCQlkYXRhLndzaXplID0gdmFsOwoJCQllbHNlIGlmICghc3RyY21wKG9wdCwgInRpbWVvIikpCgkJCQlkYXRhLnRpbWVvID0gdmFsOwoJCQllbHNlIGlmICghc3RyY21wKG9wdCwgInJldHJhbnMiKSkKCQkJCWRhdGEucmV0cmFucyA9IHZhbDsKCQkJZWxzZSBpZiAoIXN0cmNtcChvcHQsICJhY3JlZ21pbiIpKQoJCQkJZGF0YS5hY3JlZ21pbiA9IHZhbDsKCQkJZWxzZSBpZiAoIXN0cmNtcChvcHQsICJhY3JlZ21heCIpKQoJCQkJZGF0YS5hY3JlZ21heCA9IHZhbDsKCQkJZWxzZSBpZiAoIXN0cmNtcChvcHQsICJhY2Rpcm1pbiIpKQoJCQkJZGF0YS5hY2Rpcm1pbiA9IHZhbDsKCQkJZWxzZSBpZiAoIXN0cmNtcChvcHQsICJhY2Rpcm1heCIpKQoJCQkJZGF0YS5hY2Rpcm1heCA9IHZhbDsKCQkJZWxzZSBpZiAoIXN0cmNtcChvcHQsICJhY3RpbWVvIikpIHsKCQkJCWRhdGEuYWNyZWdtaW4gPSB2YWw7CgkJCQlkYXRhLmFjcmVnbWF4ID0gdmFsOwoJCQkJZGF0YS5hY2Rpcm1pbiA9IHZhbDsKCQkJCWRhdGEuYWNkaXJtYXggPSB2YWw7CgkJCX0KCQkJZWxzZSBpZiAoIXN0cmNtcChvcHQsICJyZXRyeSIpKQoJCQkJcmV0cnkgPSB2YWw7CgkJCWVsc2UgaWYgKCFzdHJjbXAob3B0LCAicG9ydCIpKQoJCQkJcG9ydCA9IHZhbDsKCQkJZWxzZSBpZiAoIXN0cmNtcChvcHQsICJtb3VudHBvcnQiKSkKCQkJICAgICAgICBtb3VudHBvcnQgPSB2YWw7CgkJCWVsc2UgaWYgKCFzdHJjbXAob3B0LCAibW91bnRob3N0IikpCgkJCSAgICAgICAgbW91bnRob3N0PXhzdHJuZHVwKG9wdGVxKzEsCgkJCQkJCSAgc3RyY3NwbihvcHRlcSsxLCIgXHRcblxyLCIpKTsKCQkJZWxzZSBpZiAoIXN0cmNtcChvcHQsICJtb3VudHByb2ciKSkKCQkJCW1vdW50cHJvZyA9IHZhbDsKCQkJZWxzZSBpZiAoIXN0cmNtcChvcHQsICJtb3VudHZlcnMiKSkKCQkJCW1vdW50dmVycyA9IHZhbDsKCQkJZWxzZSBpZiAoIXN0cmNtcChvcHQsICJuZnNwcm9nIikpCgkJCQluZnNwcm9nID0gdmFsOwoJCQllbHNlIGlmICghc3RyY21wKG9wdCwgIm5mc3ZlcnMiKSB8fAoJCQkJICFzdHJjbXAob3B0LCAidmVycyIpKQoJCQkJbmZzdmVycyA9IHZhbDsKCQkJZWxzZSBpZiAoIXN0cmNtcChvcHQsICJwcm90byIpKSB7CgkJCQlpZiAoIXN0cm5jbXAob3B0ZXErMSwgInRjcCIsIDMpKQoJCQkJCXRjcCA9IDE7CgkJCQllbHNlIGlmICghc3RybmNtcChvcHRlcSsxLCAidWRwIiwgMykpCgkJCQkJdGNwID0gMDsKCQkJCWVsc2UKCQkJCQlwcmludGYoXygiV2FybmluZzogVW5yZWNvZ25pemVkIHByb3RvPSBvcHRpb24uXG4iKSk7CgkJCX0gZWxzZSBpZiAoIXN0cmNtcChvcHQsICJuYW1sZW4iKSkgewojaWYgTkZTX01PVU5UX1ZFUlNJT04gPj0gMgoJCQkJaWYgKG5mc19tb3VudF92ZXJzaW9uID49IDIpCgkJCQkJZGF0YS5uYW1sZW4gPSB2YWw7CgkJCQllbHNlCiNlbmRpZgoJCQkJcHJpbnRmKF8oIldhcm5pbmc6IE9wdGlvbiBuYW1sZW4gaXMgbm90IHN1cHBvcnRlZC5cbiIpKTsKCQkJfSBlbHNlIGlmICghc3RyY21wKG9wdCwgImFkZHIiKSkKCQkJCS8qIGlnbm9yZSAqLzsKCQkJZWxzZSB7CgkJCQlwcmludGYoXygidW5rbm93biBuZnMgbW91bnQgcGFyYW1ldGVyOiAiCgkJCQkgICAgICAgIiVzPSVkXG4iKSwgb3B0LCB2YWwpOwoJCQkJZ290byBmYWlsOwoJCQl9CgkJfQoJCWVsc2UgewoJCQl2YWwgPSAxOwoJCQlpZiAoIXN0cm5jbXAob3B0LCAibm8iLCAyKSkgewoJCQkJdmFsID0gMDsKCQkJCW9wdCArPSAyOwoJCQl9CgkJCWlmICghc3RyY21wKG9wdCwgImJnIikpIAoJCQkJYmcgPSB2YWw7CgkJCWVsc2UgaWYgKCFzdHJjbXAob3B0LCAiZmciKSkgCgkJCQliZyA9ICF2YWw7CgkJCWVsc2UgaWYgKCFzdHJjbXAob3B0LCAic29mdCIpKQoJCQkJc29mdCA9IHZhbDsKCQkJZWxzZSBpZiAoIXN0cmNtcChvcHQsICJoYXJkIikpCgkJCQlzb2Z0ID0gIXZhbDsKCQkJZWxzZSBpZiAoIXN0cmNtcChvcHQsICJpbnRyIikpCgkJCQlpbnRyID0gdmFsOwoJCQllbHNlIGlmICghc3RyY21wKG9wdCwgInBvc2l4IikpCgkJCQlwb3NpeCA9IHZhbDsKCQkJZWxzZSBpZiAoIXN0cmNtcChvcHQsICJjdG8iKSkKCQkJCW5vY3RvID0gIXZhbDsKCQkJZWxzZSBpZiAoIXN0cmNtcChvcHQsICJhYyIpKQoJCQkJbm9hYyA9ICF2YWw7CgkJCWVsc2UgaWYgKCFzdHJjbXAob3B0LCAidGNwIikpCgkJCQl0Y3AgPSB2YWw7CgkJCWVsc2UgaWYgKCFzdHJjbXAob3B0LCAidWRwIikpCgkJCQl0Y3AgPSAhdmFsOwoJCQllbHNlIGlmICghc3RyY21wKG9wdCwgImxvY2siKSkgewoJCQkJaWYgKG5mc19tb3VudF92ZXJzaW9uID49IDMpCgkJCQkJbm9sb2NrID0gIXZhbDsKCQkJCWVsc2UKCQkJCQlwcmludGYoXygiV2FybmluZzogb3B0aW9uIG5vbG9jayBpcyBub3Qgc3VwcG9ydGVkLlxuIikpOwoJCQl9IGVsc2UgewoJCQkJcHJpbnRmKF8oInVua25vd24gbmZzIG1vdW50IG9wdGlvbjogIgoJCQkJCSAgICIlcyVzXG4iKSwgdmFsID8gIiIgOiAibm8iLCBvcHQpOwoJCQkJZ290byBmYWlsOwoJCQl9CgkJfQoJfQoJcHJvdG8gPSAodGNwKSA/IElQUFJPVE9fVENQIDogSVBQUk9UT19VRFA7CgoJZGF0YS5mbGFncyA9IChzb2Z0ID8gTkZTX01PVU5UX1NPRlQgOiAwKQoJCXwgKGludHIgPyBORlNfTU9VTlRfSU5UUiA6IDApCgkJfCAocG9zaXggPyBORlNfTU9VTlRfUE9TSVggOiAwKQoJCXwgKG5vY3RvID8gTkZTX01PVU5UX05PQ1RPIDogMCkKCQl8IChub2FjID8gTkZTX01PVU5UX05PQUMgOiAwKTsKI2lmIE5GU19NT1VOVF9WRVJTSU9OID49IDIKCWlmIChuZnNfbW91bnRfdmVyc2lvbiA+PSAyKQoJCWRhdGEuZmxhZ3MgfD0gKHRjcCA/IE5GU19NT1VOVF9UQ1AgOiAwKTsKI2VuZGlmCiNpZiBORlNfTU9VTlRfVkVSU0lPTiA+PSAzCglpZiAobmZzX21vdW50X3ZlcnNpb24gPj0gMykKCQlkYXRhLmZsYWdzIHw9IChub2xvY2sgPyBORlNfTU9VTlRfTk9OTE0gOiAwKTsKI2VuZGlmCglpZiAobmZzdmVycyA+IE1BWF9ORlNQUk9UKSB7CgkJZXJyb3JNc2coIk5GU3YlZCBub3Qgc3VwcG9ydGVkIVxuIiwgbmZzdmVycyk7CgkJcmV0dXJuIDA7Cgl9CglpZiAobW91bnR2ZXJzID4gTUFYX05GU1BST1QpIHsKCQllcnJvck1zZygiTkZTdiVkIG5vdCBzdXBwb3J0ZWQhXG4iLCBuZnN2ZXJzKTsKCQlyZXR1cm4gMDsKCX0KCWlmIChuZnN2ZXJzICYmICFtb3VudHZlcnMpCgkJbW91bnR2ZXJzID0gKG5mc3ZlcnMgPCAzKSA/IDEgOiBuZnN2ZXJzOwoJaWYgKG5mc3ZlcnMgJiYgbmZzdmVycyA8IG1vdW50dmVycykgewoJCW1vdW50dmVycyA9IG5mc3ZlcnM7Cgl9CgoJLyogQWRqdXN0IG9wdGlvbnMgaWYgbm9uZSBzcGVjaWZpZWQgKi8KCWlmICghZGF0YS50aW1lbykKCQlkYXRhLnRpbWVvID0gdGNwID8gNzAgOiA3OwoKI2lmZGVmIE5GU19NT1VOVF9ERUJVRwoJcHJpbnRmKCJyc2l6ZSA9ICVkLCB3c2l6ZSA9ICVkLCB0aW1lbyA9ICVkLCByZXRyYW5zID0gJWRcbiIsCgkJZGF0YS5yc2l6ZSwgZGF0YS53c2l6ZSwgZGF0YS50aW1lbywgZGF0YS5yZXRyYW5zKTsKCXByaW50ZigiYWNyZWcgKG1pbiwgbWF4KSA9ICglZCwgJWQpLCBhY2RpciAobWluLCBtYXgpID0gKCVkLCAlZClcbiIsCgkJZGF0YS5hY3JlZ21pbiwgZGF0YS5hY3JlZ21heCwgZGF0YS5hY2Rpcm1pbiwgZGF0YS5hY2Rpcm1heCk7CglwcmludGYoInBvcnQgPSAlZCwgYmcgPSAlZCwgcmV0cnkgPSAlZCwgZmxhZ3MgPSAlLjh4XG4iLAoJCXBvcnQsIGJnLCByZXRyeSwgZGF0YS5mbGFncyk7CglwcmludGYoIm1vdW50cHJvZyA9ICVkLCBtb3VudHZlcnMgPSAlZCwgbmZzcHJvZyA9ICVkLCBuZnN2ZXJzID0gJWRcbiIsCgkJbW91bnRwcm9nLCBtb3VudHZlcnMsIG5mc3Byb2csIG5mc3ZlcnMpOwoJcHJpbnRmKCJzb2Z0ID0gJWQsIGludHIgPSAlZCwgcG9zaXggPSAlZCwgbm9jdG8gPSAlZCwgbm9hYyA9ICVkXG4iLAoJCShkYXRhLmZsYWdzICYgTkZTX01PVU5UX1NPRlQpICE9IDAsCgkJKGRhdGEuZmxhZ3MgJiBORlNfTU9VTlRfSU5UUikgIT0gMCwKCQkoZGF0YS5mbGFncyAmIE5GU19NT1VOVF9QT1NJWCkgIT0gMCwKCQkoZGF0YS5mbGFncyAmIE5GU19NT1VOVF9OT0NUTykgIT0gMCwKCQkoZGF0YS5mbGFncyAmIE5GU19NT1VOVF9OT0FDKSAhPSAwKTsKI2lmIE5GU19NT1VOVF9WRVJTSU9OID49IDIKCXByaW50ZigidGNwID0gJWRcbiIsCgkJKGRhdGEuZmxhZ3MgJiBORlNfTU9VTlRfVENQKSAhPSAwKTsKI2VuZGlmCiNlbmRpZgoKCWRhdGEudmVyc2lvbiA9IG5mc19tb3VudF92ZXJzaW9uOwoJKm1vdW50X29wdHMgPSAoY2hhciAqKSAmZGF0YTsKCglpZiAoKmZsYWdzICYgTVNfUkVNT1VOVCkKCQlyZXR1cm4gMDsKCgkvKgoJICogSWYgdGhlIHByZXZpb3VzIG1vdW50IG9wZXJhdGlvbiBvbiB0aGUgc2FtZSBob3N0IHdhcwoJICogYmFja2dyb3VuZGVkLCBhbmQgdGhlICJiZyIgZm9yIHRoaXMgbW91bnQgaXMgYWxzbyBzZXQsCgkgKiBnaXZlIHVwIGltbWVkaWF0ZWx5LCB0byBhdm9pZCB0aGUgaW5pdGlhbCB0aW1lb3V0LgoJICovCglpZiAoYmcgJiYgIXJ1bm5pbmdfYmcgJiYKCSAgICBwcmV2X2JnX2hvc3QgJiYgc3RyY21wKGhvc3RuYW1lLCBwcmV2X2JnX2hvc3QpID09IDApIHsKCQlpZiAocmV0cnkgPiAwKQoJCQlyZXR2YWwgPSBFWF9CRzsKCQlyZXR1cm4gcmV0dmFsOwoJfQoKCS8qIGNyZWF0ZSBtb3VudCBkZWFtb24gY2xpZW50ICovCgkvKiBTZWUgaWYgdGhlIG5mcyBob3N0ID0gbW91bnQgaG9zdC4gKi8KCWlmIChtb3VudGhvc3QpIHsKCSAgaWYgKG1vdW50aG9zdFswXSA+PSAnMCcgJiYgbW91bnRob3N0WzBdIDw9ICc5JykgewoJICAgIG1vdW50X3NlcnZlcl9hZGRyLnNpbl9mYW1pbHkgPSBBRl9JTkVUOwoJICAgIG1vdW50X3NlcnZlcl9hZGRyLnNpbl9hZGRyLnNfYWRkciA9IGluZXRfYWRkcihob3N0bmFtZSk7CgkgIH0gZWxzZSB7CgkJICBpZiAoKGhwID0gZ2V0aG9zdGJ5bmFtZShtb3VudGhvc3QpKSA9PSBOVUxMKSB7CgkJCSAgZXJyb3JNc2coImNhbid0IGdldCBhZGRyZXNzIGZvciAlc1xuIiwgaG9zdG5hbWUpOwoJCQkgIGdvdG8gZmFpbDsKCQkgIH0gZWxzZSB7CgkJCSAgaWYgKGhwLT5oX2xlbmd0aCA+IHNpemVvZihzdHJ1Y3QgaW5fYWRkcikpIHsKCQkJCSAgZXJyb3JNc2coImdvdCBiYWQgaHAtPmhfbGVuZ3RoP1xuIik7CgkJCQkgIGhwLT5oX2xlbmd0aCA9IHNpemVvZihzdHJ1Y3QgaW5fYWRkcik7CgkJCSAgfQoJCQkgIG1vdW50X3NlcnZlcl9hZGRyLnNpbl9mYW1pbHkgPSBBRl9JTkVUOwoJCQkgIG1lbWNweSgmbW91bnRfc2VydmVyX2FkZHIuc2luX2FkZHIsCgkJCQkgaHAtPmhfYWRkciwgaHAtPmhfbGVuZ3RoKTsKCQkgIH0KCSAgfQoJfQoKCS8qCgkgKiBUaGUgZm9sbG93aW5nIGxvb3AgaW1wbGVtZW50cyB0aGUgbW91bnQgcmV0cmllcy4gT24gdGhlIGZpcnN0CgkgKiBjYWxsLCAicnVubmluZ19iZyIgaXMgMC4gV2hlbiB0aGUgbW91bnQgdGltZXMgb3V0LCBhbmQgdGhlCgkgKiAiYmciIG9wdGlvbiBpcyBzZXQsIHRoZSBleGl0IHN0YXR1cyBFWF9CRyB3aWxsIGJlIHJldHVybmVkLgoJICogRm9yIGEgYmFja2dyb3VuZGVkIG1vdW50LCB0aGVyZSB3aWxsIGJlIGEgc2Vjb25kIGNhbGwgYnkgdGhlCgkgKiBjaGlsZCBwcm9jZXNzIHdpdGggInJ1bm5pbmdfYmciIHNldCB0byAxLgoJICoKCSAqIFRoZSBjYXNlIHdoZXJlIHRoZSBtb3VudCBwb2ludCBpcyBub3QgcHJlc2VudCBhbmQgdGhlICJiZyIKCSAqIG9wdGlvbiBpcyBzZXQsIGlzIHRyZWF0ZWQgYXMgYSB0aW1lb3V0LiBUaGlzIGlzIGRvbmUgdG8KCSAqIHN1cHBvcnQgbmVzdGVkIG1vdW50cy4KCSAqCgkgKiBUaGUgInJldHJ5IiBjb3VudCBzcGVjaWZpZWQgYnkgdGhlIHVzZXIgaXMgdGhlIG51bWJlciBvZgoJICogbWludXRlcyB0byByZXRyeSBiZWZvcmUgZ2l2aW5nIHVwLgoJICoKCSAqIE9ubHkgdGhlIGZpcnN0IGVycm9yIG1lc3NhZ2Ugd2lsbCBiZSBkaXNwbGF5ZWQuCgkgKi8KCXJldHJ5X3RpbWVvdXQudHZfc2VjID0gMzsKCXJldHJ5X3RpbWVvdXQudHZfdXNlYyA9IDA7Cgl0b3RhbF90aW1lb3V0LnR2X3NlYyA9IDIwOwoJdG90YWxfdGltZW91dC50dl91c2VjID0gMDsKCXRpbWVvdXQgPSB0aW1lKE5VTEwpICsgNjAgKiByZXRyeTsKCXByZXZ0ID0gMDsKCXQgPSAzMDsKCXZhbCA9IDE7Cglmb3IgKDs7KSB7CgkJaWYgKGJnICYmIHN0YXQobm9kZSwgJnN0YXRidWYpID09IC0xKSB7CgkJCWlmIChydW5uaW5nX2JnKSB7CgkJCQlzbGVlcCh2YWwpOwkvKiAxLCAyLCA0LCA4LCAxNiwgMzAsIC4uLiAqLwoJCQkJdmFsICo9IDI7CgkJCQlpZiAodmFsID4gMzApCgkJCQkJdmFsID0gMzA7CgkJCX0KCQl9IGVsc2UgewoJCQkvKiBiZSBjYXJlZnVsIG5vdCB0byB1c2UgdG9vIG1hbnkgQ1BVIGN5Y2xlcyAqLwoJCQlpZiAodCAtIHByZXZ0IDwgMzApCgkJCQlzbGVlcCgzMCk7CgoJCQlwbV9tbnQgPSBnZXRfbW91bnRwb3J0KCZtb3VudF9zZXJ2ZXJfYWRkciwKCQkJCSAgICAgICBtb3VudHByb2csCgkJCQkgICAgICAgbW91bnR2ZXJzLAoJCQkJICAgICAgIHByb3RvLAogCQkJCSAgICAgICBtb3VudHBvcnQpOwoKCQkJLyogY29udGFjdCB0aGUgbW91bnQgZGFlbW9uIHZpYSBUQ1AgKi8KCQkJbW91bnRfc2VydmVyX2FkZHIuc2luX3BvcnQgPSBodG9ucyhwbV9tbnQtPnBtX3BvcnQpOwoJCQltc29jayA9IFJQQ19BTllTT0NLOwoKCQkJc3dpdGNoIChwbV9tbnQtPnBtX3Byb3QpIHsKCQkJY2FzZSBJUFBST1RPX1VEUDoKCQkJCW1jbGllbnQgPSBjbG50dWRwX2NyZWF0ZSgmbW91bnRfc2VydmVyX2FkZHIsCgkJCQkJCSBwbV9tbnQtPnBtX3Byb2csCgkJCQkJCSBwbV9tbnQtPnBtX3ZlcnMsCgkJCQkJCSByZXRyeV90aW1lb3V0LAoJCQkJCQkgJm1zb2NrKTsKCQkgIGlmIChtY2xpZW50KQoJCQkgIGJyZWFrOwoJCSAgbW91bnRfc2VydmVyX2FkZHIuc2luX3BvcnQgPSBodG9ucyhwbV9tbnQtPnBtX3BvcnQpOwoJCSAgbXNvY2sgPSBSUENfQU5ZU09DSzsKCQljYXNlIElQUFJPVE9fVENQOgoJCQltY2xpZW50ID0gY2xudHRjcF9jcmVhdGUoJm1vdW50X3NlcnZlcl9hZGRyLAoJCQkJCQkgcG1fbW50LT5wbV9wcm9nLAoJCQkJCQkgcG1fbW50LT5wbV92ZXJzLAoJCQkJCQkgJm1zb2NrLCAwLCAwKTsKCQkJYnJlYWs7CgkJZGVmYXVsdDoKCQkJbWNsaWVudCA9IDA7CgkJCX0KCQkJaWYgKG1jbGllbnQpIHsKCQkJCS8qIHRyeSB0byBtb3VudCBob3N0bmFtZTpkaXJuYW1lICovCgkJCQltY2xpZW50LT5jbF9hdXRoID0gYXV0aHVuaXhfY3JlYXRlX2RlZmF1bHQoKTsKCgkJCS8qIG1ha2UgcG9pbnRlcnMgaW4geGRyX21vdW50cmVzMyBOVUxMIHNvCgkJCSAqIHRoYXQgeGRyX2FycmF5IGFsbG9jYXRlcyBtZW1vcnkgZm9yIHVzCgkJCSAqLwoJCQltZW1zZXQoJnN0YXR1cywgMCwgc2l6ZW9mKHN0YXR1cykpOwoKCQkJaWYgKHBtX21udC0+cG1fdmVycyA9PSAzKQoJCQkJY2xudF9zdGF0ID0gY2xudF9jYWxsKG1jbGllbnQsIE1PVU5UUFJPQzNfTU5ULAoJCQkJCQkgICAgICAoeGRycHJvY190KSB4ZHJfZGlycGF0aCwKCQkJCQkJICAgICAgKGNhZGRyX3QpICZkaXJuYW1lLAoJCQkJCQkgICAgICAoeGRycHJvY190KSB4ZHJfbW91bnRyZXMzLAoJCQkJCQkgICAgICAoY2FkZHJfdCkgJnN0YXR1cywKCQkJCQl0b3RhbF90aW1lb3V0KTsKCQkJZWxzZQoJCQkJY2xudF9zdGF0ID0gY2xudF9jYWxsKG1jbGllbnQsIE1PVU5UUFJPQ19NTlQsCgkJCQkJCSAgICAgICh4ZHJwcm9jX3QpIHhkcl9kaXJwYXRoLAoJCQkJCQkgICAgICAoY2FkZHJfdCkgJmRpcm5hbWUsCgkJCQkJCSAgICAgICh4ZHJwcm9jX3QpIHhkcl9maHN0YXR1cywKCQkJCQkJICAgICAgKGNhZGRyX3QpICZzdGF0dXMsCgkJCQkJCSAgICAgIHRvdGFsX3RpbWVvdXQpOwoKCQkJCWlmIChjbG50X3N0YXQgPT0gUlBDX1NVQ0NFU1MpCgkJCQkJYnJlYWs7CQkvKiB3ZSdyZSBkb25lICovCgkJCQlpZiAoZXJybm8gIT0gRUNPTk5SRUZVU0VEKSB7CgkJCQkJY2xudF9wZXJyb3IobWNsaWVudCwgIm1vdW50Iik7CgkJCQkJZ290byBmYWlsOwkvKiBkb24ndCByZXRyeSAqLwoJCQkJfQoJCQkJaWYgKCFydW5uaW5nX2JnICYmIHByZXZ0ID09IDApCgkJCQkJY2xudF9wZXJyb3IobWNsaWVudCwgIm1vdW50Iik7CgkJCQlhdXRoX2Rlc3Ryb3kobWNsaWVudC0+Y2xfYXV0aCk7CgkJCQljbG50X2Rlc3Ryb3kobWNsaWVudCk7CgkJCQltY2xpZW50ID0gMDsKCQkJCWNsb3NlKG1zb2NrKTsKCQkJfSBlbHNlIHsKCQkJCWlmICghcnVubmluZ19iZyAmJiBwcmV2dCA9PSAwKQoJCQkJCWNsbnRfcGNyZWF0ZWVycm9yKCJtb3VudCIpOwoJCQl9CgkJCXByZXZ0ID0gdDsKCQl9CgkJaWYgKCFiZykKCQkgICAgICAgIGdvdG8gZmFpbDsKCQlpZiAoIXJ1bm5pbmdfYmcpIHsKCQkJcHJldl9iZ19ob3N0ID0geHN0cmR1cChob3N0bmFtZSk7CgkJCWlmIChyZXRyeSA+IDApCgkJCQlyZXR2YWwgPSBFWF9CRzsKCQkJZ290byBmYWlsOwoJCX0KCQl0ID0gdGltZShOVUxMKTsKCQlpZiAodCA+PSB0aW1lb3V0KQoJCQlnb3RvIGZhaWw7Cgl9CgluZnN2ZXJzID0gKHBtX21udC0+cG1fdmVycyA8IDIpID8gMiA6IHBtX21udC0+cG1fdmVyczsKCglpZiAobmZzdmVycyA9PSAyKSB7CgkJaWYgKHN0YXR1cy5uZnN2Mi5maHNfc3RhdHVzICE9IDApIHsKCQkJZXJyb3JNc2coIiVzOiVzIGZhaWxlZCwgcmVhc29uIGdpdmVuIGJ5IHNlcnZlcjogJXNcbiIsCgkJCQlob3N0bmFtZSwgZGlybmFtZSwKCQkJCW5mc19zdHJlcnJvcihzdGF0dXMubmZzdjIuZmhzX3N0YXR1cykpOwoJCQlnb3RvIGZhaWw7CgkJfQoJCW1lbWNweShkYXRhLnJvb3QuZGF0YSwKCQkgICAgICAgKGNoYXIgKikgc3RhdHVzLm5mc3YyLmZoc3RhdHVzX3UuZmhzX2ZoYW5kbGUsCgkJICAgICAgIE5GU19GSFNJWkUpOwojaWYgTkZTX01PVU5UX1ZFUlNJT04gPj0gNAoJCWRhdGEucm9vdC5zaXplID0gTkZTX0ZIU0laRTsKCQltZW1jcHkoZGF0YS5vbGRfcm9vdC5kYXRhLAoJCSAgICAgICAoY2hhciAqKSBzdGF0dXMubmZzdjIuZmhzdGF0dXNfdS5maHNfZmhhbmRsZSwKCQkgICAgICAgTkZTX0ZIU0laRSk7CiNlbmRpZgoJfSBlbHNlIHsKI2lmIE5GU19NT1VOVF9WRVJTSU9OID49IDQKCQlmaGFuZGxlMyAqZmhhbmRsZTsKCQlpZiAoc3RhdHVzLm5mc3YzLmZoc19zdGF0dXMgIT0gMCkgewoJCQllcnJvck1zZygiJXM6JXMgZmFpbGVkLCByZWFzb24gZ2l2ZW4gYnkgc2VydmVyOiAlc1xuIiwKCQkJCWhvc3RuYW1lLCBkaXJuYW1lLAoJCQkJbmZzX3N0cmVycm9yKHN0YXR1cy5uZnN2My5maHNfc3RhdHVzKSk7CgkJCWdvdG8gZmFpbDsKCQl9CgkJZmhhbmRsZSA9ICZzdGF0dXMubmZzdjMubW91bnRyZXMzX3UubW91bnRpbmZvLmZoYW5kbGU7CgkJbWVtc2V0KGRhdGEub2xkX3Jvb3QuZGF0YSwgMCwgTkZTX0ZIU0laRSk7CgkJbWVtc2V0KCZkYXRhLnJvb3QsIDAsIHNpemVvZihkYXRhLnJvb3QpKTsKCQlkYXRhLnJvb3Quc2l6ZSA9IGZoYW5kbGUtPmZoYW5kbGUzX2xlbjsKCQltZW1jcHkoZGF0YS5yb290LmRhdGEsCgkJICAgICAgIChjaGFyICopIGZoYW5kbGUtPmZoYW5kbGUzX3ZhbCwKCQkgICAgICAgZmhhbmRsZS0+ZmhhbmRsZTNfbGVuKTsKCgkJZGF0YS5mbGFncyB8PSBORlNfTU9VTlRfVkVSMzsKI2VuZGlmCgl9CgoJLyogY3JlYXRlIG5mcyBzb2NrZXQgZm9yIGtlcm5lbCAqLwoKCWlmICh0Y3ApIHsKCQlpZiAobmZzX21vdW50X3ZlcnNpb24gPCAzKSB7CgkgICAgIAkJcHJpbnRmKF8oIk5GUyBvdmVyIFRDUCBpcyBub3Qgc3VwcG9ydGVkLlxuIikpOwoJCQlnb3RvIGZhaWw7CgkJfQoJCWZzb2NrID0gc29ja2V0KEFGX0lORVQsIFNPQ0tfU1RSRUFNLCBJUFBST1RPX1RDUCk7Cgl9IGVsc2UKCQlmc29jayA9IHNvY2tldChBRl9JTkVULCBTT0NLX0RHUkFNLCBJUFBST1RPX1VEUCk7CglpZiAoZnNvY2sgPCAwKSB7CgkJcGVycm9yKF8oIm5mcyBzb2NrZXQiKSk7CgkJZ290byBmYWlsOwoJfQoJaWYgKGJpbmRyZXN2cG9ydChmc29jaywgMCkgPCAwKSB7CgkJcGVycm9yKF8oIm5mcyBiaW5kcmVzdnBvcnQiKSk7CgkJZ290byBmYWlsOwoJfQoJaWYgKHBvcnQgPT0gMCkgewoJCXNlcnZlcl9hZGRyLnNpbl9wb3J0ID0gUE1BUFBPUlQ7CgkJcG9ydCA9IHBtYXBfZ2V0cG9ydCgmc2VydmVyX2FkZHIsIG5mc3Byb2csIG5mc3ZlcnMsCgkJCXRjcCA/IElQUFJPVE9fVENQIDogSVBQUk9UT19VRFApOwoJCWlmIChwb3J0ID09IDApCgkJCXBvcnQgPSBORlNfUE9SVDsKI2lmZGVmIE5GU19NT1VOVF9ERUJVRwoJCWVsc2UKCQkJcHJpbnRmKF8oInVzZWQgcG9ydG1hcHBlciB0byBmaW5kIE5GUyBwb3J0XG4iKSk7CiNlbmRpZgoJfQojaWZkZWYgTkZTX01PVU5UX0RFQlVHCglwcmludGYoXygidXNpbmcgcG9ydCAlZCBmb3IgbmZzIGRlYW1vblxuIiksIHBvcnQpOwojZW5kaWYKCXNlcnZlcl9hZGRyLnNpbl9wb3J0ID0gaHRvbnMocG9ydCk7CgkgLyoKCSAgKiBjb25uZWN0KCkgdGhlIHNvY2tldCBmb3Iga2VybmVscyAxLjMuMTAgYW5kIGJlbG93IG9ubHksCgkgICogdG8gYXZvaWQgcHJvYmxlbXMgd2l0aCBtdWx0aWhvbWVkIGhvc3RzLgoJICAqIC0tU3dlbgoJICAqLwoJaWYgKGdldF9rZXJuZWxfcmV2aXNpb24oKSA8PSA2NjMxNAoJICAgICYmIGNvbm5lY3QoZnNvY2ssIChzdHJ1Y3Qgc29ja2FkZHIgKikgJnNlcnZlcl9hZGRyLAoJCSAgICAgICBzaXplb2YgKHNlcnZlcl9hZGRyKSkgPCAwKSB7CgkJcGVycm9yKF8oIm5mcyBjb25uZWN0IikpOwoJCWdvdG8gZmFpbDsKCX0KCgkvKiBwcmVwYXJlIGRhdGEgc3RydWN0dXJlIGZvciBrZXJuZWwgKi8KCglkYXRhLmZkID0gZnNvY2s7CgltZW1jcHkoKGNoYXIgKikgJmRhdGEuYWRkciwgKGNoYXIgKikgJnNlcnZlcl9hZGRyLCBzaXplb2YoZGF0YS5hZGRyKSk7CglzdHJuY3B5KGRhdGEuaG9zdG5hbWUsIGhvc3RuYW1lLCBzaXplb2YoZGF0YS5ob3N0bmFtZSkpOwoKCS8qIGNsZWFuIHVwICovCgoJYXV0aF9kZXN0cm95KG1jbGllbnQtPmNsX2F1dGgpOwoJY2xudF9kZXN0cm95KG1jbGllbnQpOwoJY2xvc2UobXNvY2spOwoJcmV0dXJuIDA7CgoJLyogYWJvcnQgKi8KCmZhaWw6CglpZiAobXNvY2sgIT0gLTEpIHsKCQlpZiAobWNsaWVudCkgewoJCQlhdXRoX2Rlc3Ryb3kobWNsaWVudC0+Y2xfYXV0aCk7CgkJCWNsbnRfZGVzdHJveShtY2xpZW50KTsKCQl9CgkJY2xvc2UobXNvY2spOwoJfQoJaWYgKGZzb2NrICE9IC0xKQoJCWNsb3NlKGZzb2NrKTsKCXJldHVybiByZXR2YWw7Cn0JCgovKgogKiBXZSBuZWVkIHRvIHRyYW5zbGF0ZSBiZXR3ZWVuIG5mcyBzdGF0dXMgcmV0dXJuIHZhbHVlcyBhbmQKICogdGhlIGxvY2FsIGVycm5vIHZhbHVlcyB3aGljaCBtYXkgbm90IGJlIHRoZSBzYW1lLgogKgogKiBBbmRyZWFzIFNjaHdhYiA8c2Nod2FiQExTNS5pbmZvcm1hdGlrLnVuaS1kb3J0bXVuZC5kZT46IGNoYW5nZSBlcnJubzoKICogImFmdGVyICNpbmNsdWRlIDxlcnJuby5oPiB0aGUgc3ltYm9sIGVycm5vIGlzIHJlc2VydmVkIGZvciBhbnkgdXNlLAogKiAgaXQgY2Fubm90IGV2ZW4gYmUgdXNlZCBhcyBhIHN0cnVjdCB0YWcgb3IgZmllbGQgbmFtZSIuCiAqLwoKI2lmbmRlZiBFRFFVT1QKI2RlZmluZSBFRFFVT1QJRU5PU1BDCiNlbmRpZgoKc3RhdGljIHN0cnVjdCB7CgllbnVtIG5mc19zdGF0IHN0YXQ7CglpbnQgZXJybnVtOwp9IG5mc19lcnJ0YmxbXSA9IHsKCXsgTkZTX09LLAkJMAkJfSwKCXsgTkZTRVJSX1BFUk0sCQlFUEVSTQkJfSwKCXsgTkZTRVJSX05PRU5ULAkJRU5PRU5UCQl9LAoJeyBORlNFUlJfSU8sCQlFSU8JCX0sCgl7IE5GU0VSUl9OWElPLAkJRU5YSU8JCX0sCgl7IE5GU0VSUl9BQ0NFUywJCUVBQ0NFUwkJfSwKCXsgTkZTRVJSX0VYSVNULAkJRUVYSVNUCQl9LAoJeyBORlNFUlJfTk9ERVYsCQlFTk9ERVYJCX0sCgl7IE5GU0VSUl9OT1RESVIsCUVOT1RESVIJCX0sCgl7IE5GU0VSUl9JU0RJUiwJCUVJU0RJUgkJfSwKI2lmZGVmIE5GU0VSUl9JTlZBTAoJeyBORlNFUlJfSU5WQUwsCQlFSU5WQUwJCX0sCS8qIHRoYXQgU3VuIGZvcmdvdCAqLwojZW5kaWYKCXsgTkZTRVJSX0ZCSUcsCQlFRkJJRwkJfSwKCXsgTkZTRVJSX05PU1BDLAkJRU5PU1BDCQl9LAoJeyBORlNFUlJfUk9GUywJCUVST0ZTCQl9LAoJeyBORlNFUlJfTkFNRVRPT0xPTkcsCUVOQU1FVE9PTE9ORwl9LAoJeyBORlNFUlJfTk9URU1QVFksCUVOT1RFTVBUWQl9LAoJeyBORlNFUlJfRFFVT1QsCQlFRFFVT1QJCX0sCgl7IE5GU0VSUl9TVEFMRSwJCUVTVEFMRQkJfSwKI2lmZGVmIEVXRkxVU0gKCXsgTkZTRVJSX1dGTFVTSCwJRVdGTFVTSAkJfSwKI2VuZGlmCgkvKiBUaHJvdyBpbiBzb21lIE5GU3YzIHZhbHVlcyBmb3IgZXZlbiBtb3JlIGZ1biAoSFAgcmV0dXJucyB0aGVzZSkgKi8KCXsgNzEsCQkJRVJFTU9URQkJfSwKCgl7IC0xLAkJCUVJTwkJfQp9OwoKc3RhdGljIGNoYXIgKm5mc19zdHJlcnJvcihpbnQgc3RhdCkKewoJaW50IGk7CglzdGF0aWMgY2hhciBidWZbMjU2XTsKCglmb3IgKGkgPSAwOyBuZnNfZXJydGJsW2ldLnN0YXQgIT0gLTE7IGkrKykgewoJCWlmIChuZnNfZXJydGJsW2ldLnN0YXQgPT0gc3RhdCkKCQkJcmV0dXJuIHN0cmVycm9yKG5mc19lcnJ0YmxbaV0uZXJybnVtKTsKCX0KCXNwcmludGYoYnVmLCBfKCJ1bmtub3duIG5mcyBzdGF0dXMgcmV0dXJuIHZhbHVlOiAlZCIpLCBzdGF0KTsKCXJldHVybiBidWY7Cn0KCmJvb2xfdAp4ZHJfZmhhbmRsZSAoWERSICp4ZHJzLCBmaGFuZGxlIG9ianApCnsKCS8vcmVnaXN0ZXIgaW50MzJfdCAqYnVmOwoKCSBpZiAoIXhkcl9vcGFxdWUgKHhkcnMsIG9ianAsIEZIU0laRSkpCgkJIHJldHVybiBGQUxTRTsKCXJldHVybiBUUlVFOwp9Cgpib29sX3QKeGRyX2Zoc3RhdHVzIChYRFIgKnhkcnMsIGZoc3RhdHVzICpvYmpwKQp7CgkvL3JlZ2lzdGVyIGludDMyX3QgKmJ1ZjsKCgkgaWYgKCF4ZHJfdV9pbnQgKHhkcnMsICZvYmpwLT5maHNfc3RhdHVzKSkKCQkgcmV0dXJuIEZBTFNFOwoJc3dpdGNoIChvYmpwLT5maHNfc3RhdHVzKSB7CgljYXNlIDA6CgkJIGlmICgheGRyX2ZoYW5kbGUgKHhkcnMsIG9ianAtPmZoc3RhdHVzX3UuZmhzX2ZoYW5kbGUpKQoJCQkgcmV0dXJuIEZBTFNFOwoJCWJyZWFrOwoJZGVmYXVsdDoKCQlicmVhazsKCX0KCXJldHVybiBUUlVFOwp9Cgpib29sX3QKeGRyX2RpcnBhdGggKFhEUiAqeGRycywgZGlycGF0aCAqb2JqcCkKewoJLy9yZWdpc3RlciBpbnQzMl90ICpidWY7CgoJIGlmICgheGRyX3N0cmluZyAoeGRycywgb2JqcCwgTU5UUEFUSExFTikpCgkJIHJldHVybiBGQUxTRTsKCXJldHVybiBUUlVFOwp9Cgpib29sX3QKeGRyX2ZoYW5kbGUzIChYRFIgKnhkcnMsIGZoYW5kbGUzICpvYmpwKQp7CgkvL3JlZ2lzdGVyIGludDMyX3QgKmJ1ZjsKCgkgaWYgKCF4ZHJfYnl0ZXMgKHhkcnMsIChjaGFyICoqKSZvYmpwLT5maGFuZGxlM192YWwsICh1X2ludCAqKSAmb2JqcC0+ZmhhbmRsZTNfbGVuLCBGSFNJWkUzKSkKCQkgcmV0dXJuIEZBTFNFOwoJcmV0dXJuIFRSVUU7Cn0KCmJvb2xfdAp4ZHJfbW91bnRyZXMzX29rIChYRFIgKnhkcnMsIG1vdW50cmVzM19vayAqb2JqcCkKewoJLy9yZWdpc3RlciBpbnQzMl90ICpidWY7CgoJIGlmICgheGRyX2ZoYW5kbGUzICh4ZHJzLCAmb2JqcC0+ZmhhbmRsZSkpCgkJIHJldHVybiBGQUxTRTsKCSBpZiAoIXhkcl9hcnJheSAoeGRycywgKGNoYXIgKiopJm9ianAtPmF1dGhfZmxhdm91cnMuYXV0aF9mbGF2b3Vyc192YWwsICh1X2ludCAqKSAmb2JqcC0+YXV0aF9mbGF2b3Vycy5hdXRoX2ZsYXZvdXJzX2xlbiwgfjAsCgkJc2l6ZW9mIChpbnQpLCAoeGRycHJvY190KSB4ZHJfaW50KSkKCQkgcmV0dXJuIEZBTFNFOwoJcmV0dXJuIFRSVUU7Cn0KCmJvb2xfdAp4ZHJfbW91bnRzdGF0MyAoWERSICp4ZHJzLCBtb3VudHN0YXQzICpvYmpwKQp7CgkvL3JlZ2lzdGVyIGludDMyX3QgKmJ1ZjsKCgkgaWYgKCF4ZHJfZW51bSAoeGRycywgKGVudW1fdCAqKSBvYmpwKSkKCQkgcmV0dXJuIEZBTFNFOwoJcmV0dXJuIFRSVUU7Cn0KCmJvb2xfdAp4ZHJfbW91bnRyZXMzIChYRFIgKnhkcnMsIG1vdW50cmVzMyAqb2JqcCkKewoJLy9yZWdpc3RlciBpbnQzMl90ICpidWY7CgoJIGlmICgheGRyX21vdW50c3RhdDMgKHhkcnMsICZvYmpwLT5maHNfc3RhdHVzKSkKCQkgcmV0dXJuIEZBTFNFOwoJc3dpdGNoIChvYmpwLT5maHNfc3RhdHVzKSB7CgljYXNlIE1OVF9PSzoKCQkgaWYgKCF4ZHJfbW91bnRyZXMzX29rICh4ZHJzLCAmb2JqcC0+bW91bnRyZXMzX3UubW91bnRpbmZvKSkKCQkJIHJldHVybiBGQUxTRTsKCQlicmVhazsKCWRlZmF1bHQ6CgkJYnJlYWs7Cgl9CglyZXR1cm4gVFJVRTsKfQoK