LyoKICogbWliLmMKICoKICogJElkJAogKgogKiBVcGRhdGU6IDE5OTgtMDctMTcgPGpoeUBnc3UuZWR1PgogKiBBZGRlZCBwcmludF9vaWRfcmVwb3J0KiBmdW5jdGlvbnMuCiAqCiAqLwovKiBQb3J0aW9ucyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb3B5cmlnaHRzLiAgU2VlCiAqIHRoZSBOZXQtU05NUCdzIENPUFlJTkcgZmlsZSBmb3IgbW9yZSBkZXRhaWxzIGFuZCBvdGhlciBjb3B5cmlnaHRzCiAqIHRoYXQgbWF5IGFwcGx5OgogKi8KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKCUNvcHlyaWdodCAxOTg4LCAxOTg5LCAxOTkxLCAxOTkyIGJ5IENhcm5lZ2llIE1lbGxvbiBVbml2ZXJzaXR5CgogICAgICAgICAgICAgICAgICAgICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAoKUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzCmRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGFuZCB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwKcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdApib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4Kc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLCBhbmQgdGhhdCB0aGUgbmFtZSBvZiBDTVUgbm90IGJlCnVzZWQgaW4gYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uIG9mIHRoZQpzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljLCB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uCgpDTVUgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUsIElOQ0xVRElORwpBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUywgSU4gTk8gRVZFTlQgU0hBTEwKQ01VIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIElORElSRUNUIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUgpBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsCldIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwKQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUwpTT0ZUV0FSRS4KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKgogKiBDb3B5cmlnaHQgqSAyMDAzIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICogVXNlIGlzIHN1YmplY3QgdG8gbGljZW5zZSB0ZXJtcyBzcGVjaWZpZWQgaW4gdGhlIENPUFlJTkcgZmlsZQogKiBkaXN0cmlidXRlZCB3aXRoIHRoZSBOZXQtU05NUCBwYWNrYWdlLgogKi8KI2luY2x1ZGUgPG5ldC1zbm1wL25ldC1zbm1wLWNvbmZpZy5oPgoKI2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxjdHlwZS5oPgojaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiNpZiBIQVZFX05FVElORVRfSU5fSAojaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgojZW5kaWYKI2lmIFRJTUVfV0lUSF9TWVNfVElNRQojIGlmZGVmIFdJTjMyCiMgIGluY2x1ZGUgPHN5cy90aW1lYi5oPgojIGVsc2UKIyAgaW5jbHVkZSA8c3lzL3RpbWUuaD4KIyBlbmRpZgojIGluY2x1ZGUgPHRpbWUuaD4KI2Vsc2UKIyBpZiBIQVZFX1NZU19USU1FX0gKIyAgaW5jbHVkZSA8c3lzL3RpbWUuaD4KIyBlbHNlCiMgIGluY2x1ZGUgPHRpbWUuaD4KIyBlbmRpZgojZW5kaWYKI2lmIEhBVkVfU1RSSU5HX0gKI2luY2x1ZGUgPHN0cmluZy5oPgojZWxzZQojaW5jbHVkZSA8c3RyaW5ncy5oPgojZW5kaWYKI2lmIEhBVkVfU1RETElCX0gKI2luY2x1ZGUgPHN0ZGxpYi5oPgojZW5kaWYKI2lmIEhBVkVfU1lTX1NFTEVDVF9ICiNpbmNsdWRlIDxzeXMvc2VsZWN0Lmg+CiNlbmRpZgoKI2lmIEhBVkVfV0lOU09DS19ICiNpbmNsdWRlIDx3aW5zb2NrLmg+CiNlbmRpZgoKI2lmIEhBVkVfVU5JU1REX0gKI2luY2x1ZGUgPHVuaXN0ZC5oPgojZW5kaWYKI2lmIEhBVkVfRE1BTExPQ19ICiNpbmNsdWRlIDxkbWFsbG9jLmg+CiNlbmRpZgoKI2luY2x1ZGUgPG5ldC1zbm1wL3R5cGVzLmg+CiNpbmNsdWRlIDxuZXQtc25tcC9vdXRwdXRfYXBpLmg+CiNpbmNsdWRlIDxuZXQtc25tcC9jb25maWdfYXBpLmg+CiNpbmNsdWRlIDxuZXQtc25tcC91dGlsaXRpZXMuaD4KCiNpbmNsdWRlIDxuZXQtc25tcC9saWJyYXJ5L2FzbjEuaD4KI2luY2x1ZGUgPG5ldC1zbm1wL2xpYnJhcnkvc25tcF9hcGkuaD4KI2luY2x1ZGUgPG5ldC1zbm1wL2xpYnJhcnkvbWliLmg+CiNpbmNsdWRlIDxuZXQtc25tcC9saWJyYXJ5L3BhcnNlLmg+CiNpbmNsdWRlIDxuZXQtc25tcC9saWJyYXJ5L2ludDY0Lmg+CiNpbmNsdWRlIDxuZXQtc25tcC9saWJyYXJ5L3NubXBfY2xpZW50Lmg+CgovKiogQGRlZmdyb3VwIG1pYl91dGlsaXRpZXMgbWliIHBhcnNpbmcgYW5kIGRhdGF0eXBlIG1hbmlwdWxhdGlvbiByb3V0aW5lcy4KICogIEBpbmdyb3VwIGxpYnJhcnkKICoKICogIEB7CiAqLwoKc3RhdGljIGNoYXIgICAgKnVwdGltZVN0cmluZyh1X2xvbmcsIGNoYXIgKiwgc2l6ZV90KTsKCnN0YXRpYyBzdHJ1Y3QgdHJlZSAqX2dldF9yZWFsbG9jX3N5bWJvbChjb25zdCBvaWQgKiBvYmppZCwgc2l6ZV90IG9iamlkbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHRyZWUgKnN1YnRyZWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1X2NoYXIgKiogYnVmLCBzaXplX3QgKiBidWZfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICogb3V0X2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpidWZfb3ZlcmZsb3csCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaW5kZXhfbGlzdCAqaW5fZGljZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgKiBlbmRfb2Zfa25vd24pOwoKc3RhdGljIGludCAgICAgIHByaW50X3RyZWVfbm9kZSh1X2NoYXIgKiogYnVmLCBzaXplX3QgKiBidWZfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAqIG91dF9sZW4sIGludCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCB0cmVlICp0cCwgaW50IHdpZHRoKTsKc3RhdGljIHZvaWQgICAgIGhhbmRsZV9taWJkaXJzX2NvbmYoY29uc3QgY2hhciAqdG9rZW4sIGNoYXIgKmxpbmUpOwpzdGF0aWMgdm9pZCAgICAgaGFuZGxlX21pYnNfY29uZihjb25zdCBjaGFyICp0b2tlbiwgY2hhciAqbGluZSk7CnN0YXRpYyB2b2lkICAgICBoYW5kbGVfbWliZmlsZV9jb25mKGNvbnN0IGNoYXIgKnRva2VuLCBjaGFyICpsaW5lKTsKCnN0YXRpYyB2b2lkICAgICBfb2lkX2ZpbmlzaF9wcmludGluZyhjb25zdCBvaWQgKiBvYmppZCwgc2l6ZV90IG9iamlkbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdV9jaGFyICoqIGJ1Ziwgc2l6ZV90ICogYnVmX2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAqIG91dF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxsb3dfcmVhbGxvYywgaW50ICpidWZfb3ZlcmZsb3cpOwoKLyoKICogaGVscGVyIGZ1bmN0aW9ucyBmb3IgZ2V0X21vZHVsZV9ub2RlIAogKi8Kc3RhdGljIGludCAgICAgIG5vZGVfdG9fb2lkKHN0cnVjdCB0cmVlICosIG9pZCAqLCBzaXplX3QgKik7CiNpZm5kZWYgTkVUU05NUF9ESVNBQkxFX01JQl9MT0FESU5HCnN0YXRpYyBpbnQgICAgICBfYWRkX3N0cmluZ3NfdG9fb2lkKHN0cnVjdCB0cmVlICosIGNoYXIgKiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2lkICosIHNpemVfdCAqLCBzaXplX3QpOwojZWxzZQpzdGF0aWMgaW50ICAgICAgX2FkZF9zdHJpbmdzX3RvX29pZCh2b2lkICosIGNoYXIgKiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2lkICosIHNpemVfdCAqLCBzaXplX3QpOwojZW5kaWYgLyogTkVUU05NUF9ESVNBQkxFX01JQl9MT0FESU5HICovCgojaWZuZGVmIE5FVFNOTVBfRElTQUJMRV9NSUJfTE9BRElORwpleHRlcm4gc3RydWN0IHRyZWUgKnRyZWVfaGVhZDsKc3RhdGljIHN0cnVjdCB0cmVlICp0cmVlX3RvcDsKCnN0cnVjdCB0cmVlICAgICpNaWI7ICAgICAgICAgICAgLyogQmFja3dhcmRzIGNvbXBhdGliaWxpdHkgKi8KI2VuZGlmIC8qIE5FVFNOTVBfRElTQUJMRV9NSUJfTE9BRElORyAqLwoKb2lkICAgICAgICAgICAgIFJGQzEyMTNfTUlCW10gPSB7IDEsIDMsIDYsIDEsIDIsIDEgfTsKc3RhdGljIGNoYXIgICAgIFN0YW5kYXJkX1ByZWZpeFtdID0gIi4xLjMuNi4xLjIuMSI7CgovKgogKiBTZXQgZGVmYXVsdCBoZXJlIGFzIHNvbWUgdXNlcyBvZiByZWFkX29iamlkIHJlcXVpcmUgdmFsaWQgcG9pbnRlci4gCiAqLwpzdGF0aWMgY2hhciAgICAqUHJlZml4ID0gJlN0YW5kYXJkX1ByZWZpeFswXTsKdHlwZWRlZiBzdHJ1Y3QgX1ByZWZpeExpc3QgewogICAgY29uc3QgY2hhciAgICAgKnN0cjsKICAgIGludCAgICAgICAgICAgICBsZW47Cn0gICAgICAgICAgICAgICpQcmVmaXhMaXN0UHRyLCBQcmVmaXhMaXN0OwoKLyoKICogSGVyZSBhcmUgdGhlIHByZWZpeCBzdHJpbmdzLgogKiBOb3RlIHRoYXQgdGhlIGZpcnN0IG9uZSBmaW5kcyB0aGUgdmFsdWUgb2YgUHJlZml4IG9yIFN0YW5kYXJkX1ByZWZpeC4KICogQW55IG9mIHRoZXNlIE1BWSBzdGFydCB3aXRoIHBlcmlvZDsgYWxsIHdpbGwgTk9UIGVuZCB3aXRoIHBlcmlvZC4KICogUGVyaW9kIGlzIGFkZGVkIHdoZXJlIG5lZWRlZC4gIFNlZSB1c2Ugb2YgUHJlZml4IGluIHRoaXMgbW9kdWxlLgogKi8KUHJlZml4TGlzdCAgICAgIG1pYl9wcmVmaXhlc1tdID0gewogICAgeyZTdGFuZGFyZF9QcmVmaXhbMF19LCAgICAgIC8qIHBsYWNlaG9sZGVyIGZvciBQcmVmaXggZGF0YSAqLwogICAgeyIuaXNvLm9yZy5kb2QuaW50ZXJuZXQubWdtdC5taWItMiJ9LAogICAgeyIuaXNvLm9yZy5kb2QuaW50ZXJuZXQuZXhwZXJpbWVudGFsIn0sCiAgICB7Ii5pc28ub3JnLmRvZC5pbnRlcm5ldC5wcml2YXRlIn0sCiAgICB7Ii5pc28ub3JnLmRvZC5pbnRlcm5ldC5zbm1wUGFydGllcyJ9LAogICAgeyIuaXNvLm9yZy5kb2QuaW50ZXJuZXQuc25tcFNlY3JldHMifSwKICAgIHtOVUxMLCAwfSAgICAgICAgICAgICAgICAgICAvKiBlbmQgb2YgbGlzdCAqLwp9OwoKZW51bSBpbmV0X2FkZHJlc3NfdHlwZSB7CiAgICBJUFY0ID0gMSwKICAgIElQVjYgPSAyLAogICAgSVBWNFogPSAzLAogICAgSVBWNlogPSA0LAogICAgRE5TID0gMTYKfTsKCgovKioKICogQGludGVybmFsCiAqIENvbnZlcnRzIHRpbWV0aWNrcyB0byBob3VycywgbWludXRlcywgc2Vjb25kcyBzdHJpbmcuCiAqCiAqIEBwYXJhbSB0aW1ldGlja3MgICAgVGhlIHRpbWV0aWNrcyB0byBjb252ZXJ0LgogKiBAcGFyYW0gYnVmICAgICAgICAgIEJ1ZmZlciB0byB3cml0ZSB0bywgaGFzIHRvIGJlIGF0IAogKiAgICAgICAgICAgICAgICAgICAgIGxlYXN0IDQwIEJ5dGVzIGxhcmdlLgogKiAgICAgICAKICogQHJldHVybiBUaGUgYnVmZmVyLgogKi8Kc3RhdGljIGNoYXIgICAgKgp1cHRpbWVTdHJpbmcodV9sb25nIHRpbWV0aWNrcywgY2hhciAqYnVmLCBzaXplX3QgYnVmbGVuKQp7CiAgICBpbnQgICAgICAgICAgICAgY2VudGlzZWNzLCBzZWNvbmRzLCBtaW51dGVzLCBob3VycywgZGF5czsKCiAgICBpZiAobmV0c25tcF9kc19nZXRfYm9vbGVhbihORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX05VTUVSSUNfVElNRVRJQ0tTKSkgewogICAgICAgIHNucHJpbnRmKGJ1ZiwgYnVmbGVuLCAiJWx1IiwgdGltZXRpY2tzKTsKICAgICAgICByZXR1cm4gYnVmOwogICAgfQoKCiAgICBjZW50aXNlY3MgPSB0aW1ldGlja3MgJSAxMDA7CiAgICB0aW1ldGlja3MgLz0gMTAwOwogICAgZGF5cyA9IHRpbWV0aWNrcyAvICg2MCAqIDYwICogMjQpOwogICAgdGltZXRpY2tzICU9ICg2MCAqIDYwICogMjQpOwoKICAgIGhvdXJzID0gdGltZXRpY2tzIC8gKDYwICogNjApOwogICAgdGltZXRpY2tzICU9ICg2MCAqIDYwKTsKCiAgICBtaW51dGVzID0gdGltZXRpY2tzIC8gNjA7CiAgICBzZWNvbmRzID0gdGltZXRpY2tzICUgNjA7CgogICAgaWYgKG5ldHNubXBfZHNfZ2V0X2Jvb2xlYW4oTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9RVUlDS19QUklOVCkpCiAgICAgICAgc25wcmludGYoYnVmLCBidWZsZW4sICIlZDolZDolMDJkOiUwMmQuJTAyZCIsCiAgICAgICAgICAgICAgICBkYXlzLCBob3VycywgbWludXRlcywgc2Vjb25kcywgY2VudGlzZWNzKTsKICAgIGVsc2UgewogICAgICAgIGlmIChkYXlzID09IDApIHsKICAgICAgICAgICAgc25wcmludGYoYnVmLCBidWZsZW4sICIlZDolMDJkOiUwMmQuJTAyZCIsCiAgICAgICAgICAgICAgICAgICAgaG91cnMsIG1pbnV0ZXMsIHNlY29uZHMsIGNlbnRpc2Vjcyk7CiAgICAgICAgfSBlbHNlIGlmIChkYXlzID09IDEpIHsKICAgICAgICAgICAgc25wcmludGYoYnVmLCBidWZsZW4sICIlZCBkYXksICVkOiUwMmQ6JTAyZC4lMDJkIiwKICAgICAgICAgICAgICAgICAgICBkYXlzLCBob3VycywgbWludXRlcywgc2Vjb25kcywgY2VudGlzZWNzKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBzbnByaW50ZihidWYsIGJ1ZmxlbiwgIiVkIGRheXMsICVkOiUwMmQ6JTAyZC4lMDJkIiwKICAgICAgICAgICAgICAgICAgICBkYXlzLCBob3VycywgbWludXRlcywgc2Vjb25kcywgY2VudGlzZWNzKTsKICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gYnVmOwp9CgoKCi8qKgogKiBAaW50ZXJuYWwKICogUHJpbnRzIHRoZSBjaGFyYWN0ZXIgcG9pbnRlZCB0byBpZiBpbiBodW1hbi1yZWFkYWJsZSBBU0NJSSByYW5nZSwKICogb3RoZXJ3aXNlIHByaW50cyBhIGRvdC4KICoKICogQHBhcmFtIGJ1ZiBCdWZmZXIgdG8gcHJpbnQgdGhlIGNoYXJhY3RlciB0by4KICogQHBhcmFtIGNoICBDaGFyYWN0ZXIgdG8gcHJpbnQuCiAqLwpzdGF0aWMgdm9pZApzcHJpbnRfY2hhcihjaGFyICpidWYsIGNvbnN0IHVfY2hhciBjaCkKewogICAgaWYgKGlzcHJpbnQoY2gpIHx8IGlzc3BhY2UoY2gpKSB7CiAgICAgICAgc3ByaW50ZihidWYsICIlYyIsIChpbnQpIGNoKTsKICAgIH0gZWxzZSB7CiAgICAgICAgc3ByaW50ZihidWYsICIuIik7CiAgICB9Cn0KCgoKLyoqCiAqIFByaW50cyBhIGhleGFkZWNpbWFsIHN0cmluZyBpbnRvIGEgYnVmZmVyLgogKgogKiBUaGUgY2hhcmFjdGVycyBwb2ludGVkIGJ5ICpjcCBhcmUgZW5jb2RlZCBhcyBoZXhhZGVjaW1hbCBzdHJpbmcuCiAqCiAqIElmIGFsbG93X3JlYWxsb2MgaXMgdHJ1ZSB0aGUgYnVmZmVyIHdpbGwgYmUgKHJlKWFsbG9jYXRlZCB0byBmaXQgaW4gdGhlIAogKiBuZWVkZWQgc2l6ZS4gKE5vdGU6ICpidWYgbWF5IGNoYW5nZSBkdWUgdG8gdGhpcy4pCiAqIAogKiBAcGFyYW0gYnVmICAgICAgYWRkcmVzcyBvZiB0aGUgYnVmZmVyIHRvIHByaW50IHRvLgogKiBAcGFyYW0gYnVmX2xlbiAgYWRkcmVzcyB0byBhbiBpbnRlZ2VyIGNvbnRhaW5pbmcgdGhlIHNpemUgb2YgYnVmLgogKiBAcGFyYW0gb3V0X2xlbiAgaW5jcmVtZW50ZWQgYnkgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHByaW50ZWQuCiAqIEBwYXJhbSBhbGxvd19yZWFsbG9jIGlmIG5vdCB6ZXJvIHJlYWxsb2NhdGUgdGhlIGJ1ZmZlciB0byBmaXQgdGhlIAogKiAgICAgICAgICAgICAgICAgICAgICBuZWVkZWQgc2l6ZS4KICogQHBhcmFtIGNwICAgICAgIHRoZSBhcnJheSBvZiBjaGFyYWN0ZXJzIHRvIGVuY29kZS4KICogQHBhcmFtIGxpbmVfbGVuIHRoZSBhcnJheSBsZW5ndGggb2YgY3AuCiAqIAogKiBAcmV0dXJuIDEgb24gc3VjY2Vzcywgb3IgMCBvbiBmYWlsdXJlIChvdXQgb2YgbWVtb3J5LCBvciBidWZmZXIgdG8KICogICAgICAgICBzbWFsbCB3aGVuIG5vdCBhbGxvd2VkIHRvIHJlYWxsb2MuKQogKi8KaW50Cl9zcHJpbnRfaGV4c3RyaW5nX2xpbmUodV9jaGFyICoqIGJ1Ziwgc2l6ZV90ICogYnVmX2xlbiwgc2l6ZV90ICogb3V0X2xlbiwKICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxsb3dfcmVhbGxvYywgY29uc3QgdV9jaGFyICogY3AsIHNpemVfdCBsaW5lX2xlbikKewogICAgY29uc3QgdV9jaGFyICAgKnRwOwogICAgY29uc3QgdV9jaGFyICAgKmNwMiA9IGNwOwogICAgc2l6ZV90ICAgICAgICAgIGxlbmxlZnQgPSBsaW5lX2xlbjsKCiAgICAvKgogICAgICogTWFrZSBzdXJlIHRoZXJlJ3MgZW5vdWdoIHJvb20gZm9yIHRoZSBoZXggb3V0cHV0Li4uLgogICAgICovCiAgICB3aGlsZSAoKCpvdXRfbGVuICsgbGluZV9sZW4qMysxKSA+PSAqYnVmX2xlbikgewogICAgICAgIGlmICghKGFsbG93X3JlYWxsb2MgJiYgc25tcF9yZWFsbG9jKGJ1ZiwgYnVmX2xlbikpKSB7CiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KICAgIH0KCiAgICAvKgogICAgICogLi4uLiBhbmQgZGlzcGxheSB0aGUgaGV4IHZhbHVlcyB0aGVtc2VsdmVzLi4uLgogICAgICovCiAgICBmb3IgKDsgbGVubGVmdCA+PSA4OyBsZW5sZWZ0LT04KSB7CiAgICAgICAgc3ByaW50ZigoY2hhciAqKSAoKmJ1ZiArICpvdXRfbGVuKSwKICAgICAgICAgICAgICAgICIlMDJYICUwMlggJTAyWCAlMDJYICUwMlggJTAyWCAlMDJYICUwMlggIiwgY3BbMF0sIGNwWzFdLAogICAgICAgICAgICAgICAgY3BbMl0sIGNwWzNdLCBjcFs0XSwgY3BbNV0sIGNwWzZdLCBjcFs3XSk7CiAgICAgICAgKm91dF9sZW4gKz0gc3RybGVuKChjaGFyICopICgqYnVmICsgKm91dF9sZW4pKTsKICAgICAgICBjcCAgICAgICArPSA4OwogICAgfQogICAgZm9yICg7IGxlbmxlZnQgPiAwOyBsZW5sZWZ0LS0pIHsKICAgICAgICBzcHJpbnRmKChjaGFyICopICgqYnVmICsgKm91dF9sZW4pLCAiJTAyWCAiLCAqY3ArKyk7CiAgICAgICAgKm91dF9sZW4gKz0gc3RybGVuKChjaGFyICopICgqYnVmICsgKm91dF9sZW4pKTsKICAgIH0KCiAgICAvKgogICAgICogLi4uLiBwbHVzIChvcHRpb25hbGx5KSBkbyB0aGUgc2FtZSBmb3IgdGhlIEFTQ0lJIGVxdWl2YWxlbnQuCiAgICAgKi8KICAgIGlmIChuZXRzbm1wX2RzX2dldF9ib29sZWFuKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfUFJJTlRfSEVYX1RFWFQpKSB7CiAgICAgICAgd2hpbGUgKCgqb3V0X2xlbiArIGxpbmVfbGVuKzUpID49ICpidWZfbGVuKSB7CiAgICAgICAgICAgIGlmICghKGFsbG93X3JlYWxsb2MgJiYgc25tcF9yZWFsbG9jKGJ1ZiwgYnVmX2xlbikpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBzcHJpbnRmKChjaGFyICopICgqYnVmICsgKm91dF9sZW4pLCAiICBbIik7CiAgICAgICAgKm91dF9sZW4gKz0gc3RybGVuKChjaGFyICopICgqYnVmICsgKm91dF9sZW4pKTsKICAgICAgICBmb3IgKHRwID0gY3AyOyB0cCA8IGNwOyB0cCsrKSB7CiAgICAgICAgICAgIHNwcmludF9jaGFyKChjaGFyICopICgqYnVmICsgKm91dF9sZW4pLCAqdHApOwogICAgICAgICAgICAoKm91dF9sZW4pKys7CiAgICAgICAgfQogICAgICAgIHNwcmludGYoKGNoYXIgKikgKCpidWYgKyAqb3V0X2xlbiksICJdIik7CiAgICAgICAgKm91dF9sZW4gKz0gc3RybGVuKChjaGFyICopICgqYnVmICsgKm91dF9sZW4pKTsKICAgIH0KICAgIHJldHVybiAxOwp9CgppbnQKc3ByaW50X3JlYWxsb2NfaGV4c3RyaW5nKHVfY2hhciAqKiBidWYsIHNpemVfdCAqIGJ1Zl9sZW4sIHNpemVfdCAqIG91dF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxsb3dfcmVhbGxvYywgY29uc3QgdV9jaGFyICogY3AsIHNpemVfdCBsZW4pCnsKICAgIGludCBsaW5lX2xlbiA9IG5ldHNubXBfZHNfZ2V0X2ludChORVRTTk1QX0RTX0xJQlJBUllfSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkVUU05NUF9EU19MSUJfSEVYX09VVFBVVF9MRU5HVEgpOwogICAgaWYgKCFsaW5lX2xlbikKICAgICAgICBsaW5lX2xlbj1sZW47CgogICAgZm9yICg7IChpbnQpbGVuID4gbGluZV9sZW47IGxlbiAtPSBsaW5lX2xlbikgewogICAgICAgIGlmKCFfc3ByaW50X2hleHN0cmluZ19saW5lKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgY3AsIGxpbmVfbGVuKSkKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgKigqYnVmICsgKCpvdXRfbGVuKSsrKSA9ICdcbic7CiAgICAgICAgKigqYnVmICsgKm91dF9sZW4pID0gMDsKICAgICAgICBjcCArPSBsaW5lX2xlbjsKICAgIH0KICAgIGlmKCFfc3ByaW50X2hleHN0cmluZ19saW5lKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgY3AsIGxlbikpCiAgICAgICAgcmV0dXJuIDA7CiAgICAqKCpidWYgKyAqb3V0X2xlbikgPSAwOwogICAgcmV0dXJuIDE7Cn0KCgoKLyoqCiAqIFByaW50cyBhbiBhc2NpaSBzdHJpbmcgaW50byBhIGJ1ZmZlci4KICoKICogVGhlIGNoYXJhY3RlcnMgcG9pbnRlZCBieSAqY3AgYXJlIGVuY29kZWQgYXMgYW4gYXNjaWkgc3RyaW5nLgogKiAKICogSWYgYWxsb3dfcmVhbGxvYyBpcyB0cnVlIHRoZSBidWZmZXIgd2lsbCBiZSAocmUpYWxsb2NhdGVkIHRvIGZpdCBpbiB0aGUgCiAqIG5lZWRlZCBzaXplLiAoTm90ZTogKmJ1ZiBtYXkgY2hhbmdlIGR1ZSB0byB0aGlzLikKICogCiAqIEBwYXJhbSBidWYgICAgICBhZGRyZXNzIG9mIHRoZSBidWZmZXIgdG8gcHJpbnQgdG8uCiAqIEBwYXJhbSBidWZfbGVuICBhZGRyZXNzIHRvIGFuIGludGVnZXIgY29udGFpbmluZyB0aGUgc2l6ZSBvZiBidWYuCiAqIEBwYXJhbSBvdXRfbGVuICBpbmNyZW1lbnRlZCBieSB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgcHJpbnRlZC4KICogQHBhcmFtIGFsbG93X3JlYWxsb2MgaWYgbm90IHplcm8gcmVhbGxvY2F0ZSB0aGUgYnVmZmVyIHRvIGZpdCB0aGUgCiAqICAgICAgICAgICAgICAgICAgICAgIG5lZWRlZCBzaXplLgogKiBAcGFyYW0gY3AgICAgICAgdGhlIGFycmF5IG9mIGNoYXJhY3RlcnMgdG8gZW5jb2RlLgogKiBAcGFyYW0gbGVuICAgICAgdGhlIGFycmF5IGxlbmd0aCBvZiBjcC4KICogCiAqIEByZXR1cm4gMSBvbiBzdWNjZXNzLCBvciAwIG9uIGZhaWx1cmUgKG91dCBvZiBtZW1vcnksIG9yIGJ1ZmZlciB0bwogKiAgICAgICAgIHNtYWxsIHdoZW4gbm90IGFsbG93ZWQgdG8gcmVhbGxvYy4pCiAqLwppbnQKc3ByaW50X3JlYWxsb2NfYXNjaWlzdHJpbmcodV9jaGFyICoqIGJ1Ziwgc2l6ZV90ICogYnVmX2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICogb3V0X2xlbiwgaW50IGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVfY2hhciAqIGNwLCBzaXplX3QgbGVuKQp7CiAgICBpbnQgICAgICAgICAgICAgaTsKCiAgICBmb3IgKGkgPSAwOyBpIDwgKGludCkgbGVuOyBpKyspIHsKICAgICAgICBpZiAoaXNwcmludCgqY3ApIHx8IGlzc3BhY2UoKmNwKSkgewogICAgICAgICAgICBpZiAoKmNwID09ICdcXCcgfHwgKmNwID09ICciJykgewogICAgICAgICAgICAgICAgaWYgKCgqb3V0X2xlbiA+PSAqYnVmX2xlbikgJiYKICAgICAgICAgICAgICAgICAgICAhKGFsbG93X3JlYWxsb2MgJiYgc25tcF9yZWFsbG9jKGJ1ZiwgYnVmX2xlbikpKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAqKCpidWYgKyAoKm91dF9sZW4pKyspID0gJ1xcJzsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoKCpvdXRfbGVuID49ICpidWZfbGVuKSAmJgogICAgICAgICAgICAgICAgIShhbGxvd19yZWFsbG9jICYmIHNubXBfcmVhbGxvYyhidWYsIGJ1Zl9sZW4pKSkgewogICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgKigqYnVmICsgKCpvdXRfbGVuKSsrKSA9ICpjcCsrOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGlmICgoKm91dF9sZW4gPj0gKmJ1Zl9sZW4pICYmCiAgICAgICAgICAgICAgICAhKGFsbG93X3JlYWxsb2MgJiYgc25tcF9yZWFsbG9jKGJ1ZiwgYnVmX2xlbikpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgfQogICAgICAgICAgICAqKCpidWYgKyAoKm91dF9sZW4pKyspID0gJy4nOwogICAgICAgICAgICBjcCsrOwogICAgICAgIH0KICAgIH0KICAgIGlmICgoKm91dF9sZW4gPj0gKmJ1Zl9sZW4pICYmCiAgICAgICAgIShhbGxvd19yZWFsbG9jICYmIHNubXBfcmVhbGxvYyhidWYsIGJ1Zl9sZW4pKSkgewogICAgICAgIHJldHVybiAwOwogICAgfQogICAgKigqYnVmICsgKm91dF9sZW4pID0gJ1wwJzsKICAgIHJldHVybiAxOwp9CgovKioKICogUHJpbnRzIGFuIG9jdGV0IHN0cmluZyBpbnRvIGEgYnVmZmVyLgogKgogKiBUaGUgdmFyaWFibGUgdmFyIGlzIGVuY29kZWQgYXMgb2N0ZXQgc3RyaW5nLgogKiAKICogSWYgYWxsb3dfcmVhbGxvYyBpcyB0cnVlIHRoZSBidWZmZXIgd2lsbCBiZSAocmUpYWxsb2NhdGVkIHRvIGZpdCBpbiB0aGUgCiAqIG5lZWRlZCBzaXplLiAoTm90ZTogKmJ1ZiBtYXkgY2hhbmdlIGR1ZSB0byB0aGlzLikKICogCiAqIEBwYXJhbSBidWYgICAgICBBZGRyZXNzIG9mIHRoZSBidWZmZXIgdG8gcHJpbnQgdG8uCiAqIEBwYXJhbSBidWZfbGVuICBBZGRyZXNzIHRvIGFuIGludGVnZXIgY29udGFpbmluZyB0aGUgc2l6ZSBvZiBidWYuCiAqIEBwYXJhbSBvdXRfbGVuICBJbmNyZW1lbnRlZCBieSB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgcHJpbnRlZC4KICogQHBhcmFtIGFsbG93X3JlYWxsb2MgaWYgbm90IHplcm8gcmVhbGxvY2F0ZSB0aGUgYnVmZmVyIHRvIGZpdCB0aGUgCiAqICAgICAgICAgICAgICAgICAgICAgIG5lZWRlZCBzaXplLgogKiBAcGFyYW0gdmFyICAgICAgVGhlIHZhcmlhYmxlIHRvIGVuY29kZS4KICogQHBhcmFtIGVudW1zICAgIFRoZSBlbnVtZXJhdGlvbiBmZiB0aGlzIHZhcmlhYmxlIGlzIGVudW1lcmF0ZWQuIG1heSBiZSBOVUxMLgogKiBAcGFyYW0gaGludCAgICAgQ29udGVudHMgb2YgdGhlIERJU1BMQVktSElOVCBjbGF1c2Ugb2YgdGhlIE1JQi4KICogICAgICAgICAgICAgICAgIFNlZSBSRkMgMTkwMyBTZWN0aW9uIDMuMSBmb3IgZGV0YWlscy4gbWF5IGJlIE5VTEwuCiAqIEBwYXJhbSB1bml0cyAgICBDb250ZW50cyBvZiB0aGUgVU5JVFMgY2xhdXNlIG9mIHRoZSBNSUIuIG1heSBiZSBOVUxMLgogKiAKICogQHJldHVybiAxIG9uIHN1Y2Nlc3MsIG9yIDAgb24gZmFpbHVyZSAob3V0IG9mIG1lbW9yeSwgb3IgYnVmZmVyIHRvCiAqICAgICAgICAgc21hbGwgd2hlbiBub3QgYWxsb3dlZCB0byByZWFsbG9jLikKICovCmludApzcHJpbnRfcmVhbGxvY19vY3RldF9zdHJpbmcodV9jaGFyICoqIGJ1Ziwgc2l6ZV90ICogYnVmX2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAqIG91dF9sZW4sIGludCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV0c25tcF92YXJpYWJsZV9saXN0ICogdmFyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGVudW1fbGlzdCAqZW51bXMsIGNvbnN0IGNoYXIgKmhpbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICp1bml0cykKewogICAgc2l6ZV90ICAgICAgICAgIHNhdmVkX291dF9sZW4gPSAqb3V0X2xlbjsKICAgIGNvbnN0IGNoYXIgICAgICpzYXZlZF9oaW50ID0gaGludDsKICAgIGludCAgICAgICAgICAgICBoZXggPSAwLCB4ID0gMDsKICAgIHVfY2hhciAgICAgICAgICpjcDsKICAgIGludCAgICAgICAgICAgICBvdXRwdXRfZm9ybWF0LCBjbnQ7CgogICAgaWYgKHZhci0+dHlwZSAhPSBBU05fT0NURVRfU1RSKSB7CiAgICAgICAgaWYgKCFuZXRzbm1wX2RzX2dldF9ib29sZWFuKAogICAgICAgICAgICAgICAgICAgIE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfUVVJQ0tFX1BSSU5UKSkgewogICAgICAgICAgICBjb25zdCBjaGFyICAgICAgc3RyW10gPSAiV3JvbmcgVHlwZSAoc2hvdWxkIGJlIE9DVEVUIFNUUklORyk6ICI7CiAgICAgICAgICAgIGlmICghc25tcF9jc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgc3RyKSkKICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KICAgICAgICByZXR1cm4gc3ByaW50X3JlYWxsb2NfYnlfdHlwZShidWYsIGJ1Zl9sZW4sIG91dF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93X3JlYWxsb2MsIHZhciwgTlVMTCwgTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CiAgICB9CgoKICAgIGlmIChoaW50KSB7CiAgICAgICAgaW50ICAgICAgICAgICAgIHJlcGVhdCwgd2lkdGggPSAxOwogICAgICAgIGxvbmcgICAgICAgICAgICB2YWx1ZTsKICAgICAgICBjaGFyICAgICAgICAgICAgY29kZSA9ICdkJywgc2VwYXIgPSAwLCB0ZXJtID0gMCwgY2gsIGludGJ1ZlszMl07CiAgICAgICAgdV9jaGFyICAgICAgICAgKmVjcDsKCiAgICAgICAgaWYgKCFuZXRzbm1wX2RzX2dldF9ib29sZWFuKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfUVVJQ0tfUFJJTlQpKSB7CiAgICAgICAgICAgIGlmICghc25tcF9jc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgIlNUUklORzogIikpIHsKICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGNwID0gdmFyLT52YWwuc3RyaW5nOwogICAgICAgIGVjcCA9IGNwICsgdmFyLT52YWxfbGVuOwoKICAgICAgICB3aGlsZSAoY3AgPCBlY3ApIHsKICAgICAgICAgICAgcmVwZWF0ID0gMTsKICAgICAgICAgICAgaWYgKCpoaW50KSB7CiAgICAgICAgICAgICAgICBpZiAoKmhpbnQgPT0gJyonKSB7CiAgICAgICAgICAgICAgICAgICAgcmVwZWF0ID0gKmNwKys7CiAgICAgICAgICAgICAgICAgICAgaGludCsrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgd2lkdGggPSAwOwogICAgICAgICAgICAgICAgd2hpbGUgKCcwJyA8PSAqaGludCAmJiAqaGludCA8PSAnOScpCiAgICAgICAgICAgICAgICAgICAgd2lkdGggPSAod2lkdGggKiAxMCkgKyAoKmhpbnQrKyAtICcwJyk7CiAgICAgICAgICAgICAgICBjb2RlID0gKmhpbnQrKzsKICAgICAgICAgICAgICAgIGlmICgoY2ggPSAqaGludCkgJiYgY2ggIT0gJyonICYmIChjaCA8ICcwJyB8fCBjaCA+ICc5JykKICAgICAgICAgICAgICAgICAgICAmJiAod2lkdGggIT0gMAogICAgICAgICAgICAgICAgICAgICAgICB8fCAoY2ggIT0gJ3gnICYmIGNoICE9ICdkJyAmJiBjaCAhPSAnbycpKSkKICAgICAgICAgICAgICAgICAgICBzZXBhciA9ICpoaW50Kys7CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgc2VwYXIgPSAwOwogICAgICAgICAgICAgICAgaWYgKChjaCA9ICpoaW50KSAmJiBjaCAhPSAnKicgJiYgKGNoIDwgJzAnIHx8IGNoID4gJzknKQogICAgICAgICAgICAgICAgICAgICYmICh3aWR0aCAhPSAwCiAgICAgICAgICAgICAgICAgICAgICAgIHx8IChjaCAhPSAneCcgJiYgY2ggIT0gJ2QnICYmIGNoICE9ICdvJykpKQogICAgICAgICAgICAgICAgICAgIHRlcm0gPSAqaGludCsrOwogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgIHRlcm0gPSAwOwogICAgICAgICAgICAgICAgaWYgKHdpZHRoID09IDApICAvKiBIYW5kbGUgbWFsZm9ybWVkIGhpbnQgc3RyaW5ncyAqLwogICAgICAgICAgICAgICAgICAgIHdpZHRoID0gMTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgd2hpbGUgKHJlcGVhdCAmJiBjcCA8IGVjcCkgewogICAgICAgICAgICAgICAgdmFsdWUgPSAwOwogICAgICAgICAgICAgICAgaWYgKGNvZGUgIT0gJ2EnICYmIGNvZGUgIT0gJ3QnKSB7CiAgICAgICAgICAgICAgICAgICAgZm9yICh4ID0gMDsgeCA8IHdpZHRoOyB4KyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZSAqIDI1NiArICpjcCsrOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHN3aXRjaCAoY29kZSkgewogICAgICAgICAgICAgICAgY2FzZSAneCc6CiAgICAgICAgICAgICAgICAgICAgaWYgKG5ldHNubXBfZHNfZ2V0X2Jvb2xlYW4oTkVUU05NUF9EU19MSUJSQVJZX0lELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5FVFNOTVBfRFNfTElCXzJESUdJVF9IRVhfT1VUUFVUKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiB2YWx1ZSA8IDE2KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNwcmludGYoaW50YnVmLCAiMCVseCIsIHZhbHVlKTsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBzcHJpbnRmKGludGJ1ZiwgIiVseCIsIHZhbHVlKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKCFzbm1wX2NzdHJjYXQKICAgICAgICAgICAgICAgICAgICAgICAgKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgaW50YnVmKSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlICdkJzoKICAgICAgICAgICAgICAgICAgICBzcHJpbnRmKGludGJ1ZiwgIiVsZCIsIHZhbHVlKTsKICAgICAgICAgICAgICAgICAgICBpZiAoIXNubXBfY3N0cmNhdAogICAgICAgICAgICAgICAgICAgICAgICAoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCBpbnRidWYpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgJ28nOgogICAgICAgICAgICAgICAgICAgIHNwcmludGYoaW50YnVmLCAiJWxvIiwgdmFsdWUpOwogICAgICAgICAgICAgICAgICAgIGlmICghc25tcF9jc3RyY2F0CiAgICAgICAgICAgICAgICAgICAgICAgIChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsIGludGJ1ZikpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSAndCc6IC8qIG5ldyBpbiByZmMgMzQxMSAqLwogICAgICAgICAgICAgICAgY2FzZSAnYSc6CiAgICAgICAgICAgICAgICAgICAgY250ID0gU05NUF9NSU4od2lkdGgsIGVjcCAtIGNwKTsKICAgICAgICAgICAgICAgICAgICBpZiAoIXNwcmludF9yZWFsbG9jX2FzY2lpc3RyaW5nKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93X3JlYWxsb2MsIGNwLCBjbnQpKQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgICAgICAgICBjcCArPSBjbnQ7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgICpvdXRfbGVuID0gc2F2ZWRfb3V0X2xlbjsKICAgICAgICAgICAgICAgICAgICBpZiAoc25tcF9jc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIoQmFkIGhpbnQgaWdub3JlZDogIikKICAgICAgICAgICAgICAgICAgICAgICAgJiYgc25tcF9jc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dfcmVhbGxvYywgc2F2ZWRfaGludCkKICAgICAgICAgICAgICAgICAgICAgICAgJiYgc25tcF9jc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dfcmVhbGxvYywgIikgIikpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNwcmludF9yZWFsbG9jX29jdGV0X3N0cmluZyhidWYsIGJ1Zl9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0X2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciwgZW51bXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgTlVMTCk7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmIChjcCA8IGVjcCAmJiBzZXBhcikgewogICAgICAgICAgICAgICAgICAgIHdoaWxlICgoKm91dF9sZW4gKyAxKSA+PSAqYnVmX2xlbikgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIShhbGxvd19yZWFsbG9jICYmIHNubXBfcmVhbGxvYyhidWYsIGJ1Zl9sZW4pKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgKigqYnVmICsgKm91dF9sZW4pID0gc2VwYXI7CiAgICAgICAgICAgICAgICAgICAgKCpvdXRfbGVuKSsrOwogICAgICAgICAgICAgICAgICAgICooKmJ1ZiArICpvdXRfbGVuKSA9ICdcMCc7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXBlYXQtLTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHRlcm0gJiYgY3AgPCBlY3ApIHsKICAgICAgICAgICAgICAgIHdoaWxlICgoKm91dF9sZW4gKyAxKSA+PSAqYnVmX2xlbikgewogICAgICAgICAgICAgICAgICAgIGlmICghKGFsbG93X3JlYWxsb2MgJiYgc25tcF9yZWFsbG9jKGJ1ZiwgYnVmX2xlbikpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICooKmJ1ZiArICpvdXRfbGVuKSA9IHRlcm07CiAgICAgICAgICAgICAgICAoKm91dF9sZW4pKys7CiAgICAgICAgICAgICAgICAqKCpidWYgKyAqb3V0X2xlbikgPSAnXDAnOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBpZiAodW5pdHMpIHsKICAgICAgICAgICAgcmV0dXJuIChzbm1wX2NzdHJjYXQKICAgICAgICAgICAgICAgICAgICAoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCAiICIpCiAgICAgICAgICAgICAgICAgICAgJiYgc25tcF9jc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgdW5pdHMpKTsKICAgICAgICB9CiAgICAgICAgaWYgKCgqb3V0X2xlbiA+PSAqYnVmX2xlbikgJiYKICAgICAgICAgICAgIShhbGxvd19yZWFsbG9jICYmIHNubXBfcmVhbGxvYyhidWYsIGJ1Zl9sZW4pKSkgewogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CiAgICAgICAgKigqYnVmICsgKm91dF9sZW4pID0gJ1wwJzsKCiAgICAgICAgcmV0dXJuIDE7CiAgICB9CgogICAgb3V0cHV0X2Zvcm1hdCA9IG5ldHNubXBfZHNfZ2V0X2ludChORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX1NUUklOR19PVVRQVVRfRk9STUFUKTsKICAgIGlmICgwID09IG91dHB1dF9mb3JtYXQpIHsKICAgICAgICBvdXRwdXRfZm9ybWF0ID0gTkVUU05NUF9TVFJJTkdfT1VUUFVUX0dVRVNTOwogICAgfQogICAgc3dpdGNoIChvdXRwdXRfZm9ybWF0KSB7CiAgICBjYXNlIE5FVFNOTVBfU1RSSU5HX09VVFBVVF9HVUVTUzoKICAgICAgICBoZXggPSAwOwogICAgICAgIGZvciAoY3AgPSB2YXItPnZhbC5zdHJpbmcsIHggPSAwOyB4IDwgKGludCkgdmFyLT52YWxfbGVuOyB4KyssIGNwKyspIHsKICAgICAgICAgICAgaWYgKCFpc3ByaW50KCpjcCkgJiYgIWlzc3BhY2UoKmNwKSkgewogICAgICAgICAgICAgICAgaGV4ID0gMTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBicmVhazsKCiAgICBjYXNlIE5FVFNOTVBfU1RSSU5HX09VVFBVVF9BU0NJSToKICAgICAgICBoZXggPSAwOwogICAgICAgIGJyZWFrOwoKICAgIGNhc2UgTkVUU05NUF9TVFJJTkdfT1VUUFVUX0hFWDoKICAgICAgICBoZXggPSAxOwogICAgICAgIGJyZWFrOwogICAgfQoKICAgIGlmICh2YXItPnZhbF9sZW4gPT0gMCkgewogICAgICAgIHJldHVybiBzbm1wX2NzdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCAiXCJcIiIpOwogICAgfQoKICAgIGlmIChoZXgpIHsKICAgICAgICBpZiAobmV0c25tcF9kc19nZXRfYm9vbGVhbihORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX1FVSUNLX1BSSU5UKSkgewogICAgICAgICAgICBpZiAoIXNubXBfY3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsICJcIiIpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGlmICghc25tcF9jc3RyY2F0CiAgICAgICAgICAgICAgICAoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCAiSGV4LVNUUklORzogIikpIHsKICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBpZiAoIXNwcmludF9yZWFsbG9jX2hleHN0cmluZyhidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyLT52YWwuc3RyaW5nLCB2YXItPnZhbF9sZW4pKSB7CiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KCiAgICAgICAgaWYgKG5ldHNubXBfZHNfZ2V0X2Jvb2xlYW4oTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9RVUlDS19QUklOVCkpIHsKICAgICAgICAgICAgaWYgKCFzbm1wX2NzdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCAiXCIiKSkgewogICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9IGVsc2UgewogICAgICAgIGlmICghbmV0c25tcF9kc19nZXRfYm9vbGVhbihORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX1FVSUNLX1BSSU5UKSkgewogICAgICAgICAgICBpZiAoIXNubXBfY3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNUUklORzogIikpIHsKICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmICghc25tcF9jc3RyY2F0CiAgICAgICAgICAgIChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsICJcIiIpKSB7CiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KICAgICAgICBpZiAoIXNwcmludF9yZWFsbG9jX2FzY2lpc3RyaW5nCiAgICAgICAgICAgIChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsIHZhci0+dmFsLnN0cmluZywKICAgICAgICAgICAgIHZhci0+dmFsX2xlbikpIHsKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQogICAgICAgIGlmICghc25tcF9jc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgIlwiIikpIHsKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQogICAgfQoKICAgIGlmICh1bml0cykgewogICAgICAgIHJldHVybiAoc25tcF9jc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgIiAiKQogICAgICAgICAgICAgICAgJiYgc25tcF9jc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgdW5pdHMpKTsKICAgIH0KICAgIHJldHVybiAxOwp9CgojaWZkZWYgTkVUU05NUF9XSVRIX09QQVFVRV9TUEVDSUFMX1RZUEVTCgovKioKICogUHJpbnRzIGEgZmxvYXQgaW50byBhIGJ1ZmZlci4KICoKICogVGhlIHZhcmlhYmxlIHZhciBpcyBlbmNvZGVkIGFzIGEgZmxvYXRpbmcgcG9pbnQgdmFsdWUuCiAqIAogKiBJZiBhbGxvd19yZWFsbG9jIGlzIHRydWUgdGhlIGJ1ZmZlciB3aWxsIGJlIChyZSlhbGxvY2F0ZWQgdG8gZml0IGluIHRoZSAKICogbmVlZGVkIHNpemUuIChOb3RlOiAqYnVmIG1heSBjaGFuZ2UgZHVlIHRvIHRoaXMuKQogKiAKICogQHBhcmFtIGJ1ZiAgICAgIEFkZHJlc3Mgb2YgdGhlIGJ1ZmZlciB0byBwcmludCB0by4KICogQHBhcmFtIGJ1Zl9sZW4gIEFkZHJlc3MgdG8gYW4gaW50ZWdlciBjb250YWluaW5nIHRoZSBzaXplIG9mIGJ1Zi4KICogQHBhcmFtIG91dF9sZW4gIEluY3JlbWVudGVkIGJ5IHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBwcmludGVkLgogKiBAcGFyYW0gYWxsb3dfcmVhbGxvYyBpZiBub3QgemVybyByZWFsbG9jYXRlIHRoZSBidWZmZXIgdG8gZml0IHRoZSAKICogICAgICAgICAgICAgICAgICAgICAgbmVlZGVkIHNpemUuCiAqIEBwYXJhbSB2YXIgICAgICBUaGUgdmFyaWFibGUgdG8gZW5jb2RlLgogKiBAcGFyYW0gZW51bXMgICAgVGhlIGVudW1lcmF0aW9uIGZmIHRoaXMgdmFyaWFibGUgaXMgZW51bWVyYXRlZC4gbWF5IGJlIE5VTEwuCiAqIEBwYXJhbSBoaW50ICAgICBDb250ZW50cyBvZiB0aGUgRElTUExBWS1ISU5UIGNsYXVzZSBvZiB0aGUgTUlCLgogKiAgICAgICAgICAgICAgICAgU2VlIFJGQyAxOTAzIFNlY3Rpb24gMy4xIGZvciBkZXRhaWxzLiBtYXkgYmUgTlVMTC4KICogQHBhcmFtIHVuaXRzICAgIENvbnRlbnRzIG9mIHRoZSBVTklUUyBjbGF1c2Ugb2YgdGhlIE1JQi4gbWF5IGJlIE5VTEwuCiAqIAogKiBAcmV0dXJuIDEgb24gc3VjY2Vzcywgb3IgMCBvbiBmYWlsdXJlIChvdXQgb2YgbWVtb3J5LCBvciBidWZmZXIgdG8KICogICAgICAgICBzbWFsbCB3aGVuIG5vdCBhbGxvd2VkIHRvIHJlYWxsb2MuKQogKi8KaW50CnNwcmludF9yZWFsbG9jX2Zsb2F0KHVfY2hhciAqKiBidWYsIHNpemVfdCAqIGJ1Zl9sZW4sCiAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAqIG91dF9sZW4sIGludCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXRzbm1wX3ZhcmlhYmxlX2xpc3QgKiB2YXIsCiAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBlbnVtX2xpc3QgKmVudW1zLAogICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpoaW50LCBjb25zdCBjaGFyICp1bml0cykKewogICAgaWYgKHZhci0+dHlwZSAhPSBBU05fT1BBUVVFX0ZMT0FUKSB7CiAgICAgICAgaWYgKCFuZXRzbm1wX2RzX2dldF9ib29sZWFuKAogICAgICAgICAgICAgICAgTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9RVUlDS0VfUFJJTlQpKSB7CiAgICAgICAgICAgIHVfY2hhciAgICAgICAgICBzdHJbXSA9ICJXcm9uZyBUeXBlIChzaG91bGQgYmUgRmxvYXQpOiAiOwogICAgICAgICAgICBpZiAoIXNubXBfc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgc3RyKSkKICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KICAgICAgICByZXR1cm4gc3ByaW50X3JlYWxsb2NfYnlfdHlwZShidWYsIGJ1Zl9sZW4sIG91dF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93X3JlYWxsb2MsIHZhciwgTlVMTCwgTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CiAgICB9CgogICAgaWYgKCFuZXRzbm1wX2RzX2dldF9ib29sZWFuKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfUVVJQ0tfUFJJTlQpKSB7CiAgICAgICAgaWYgKCFzbm1wX2NzdHJjYXQKICAgICAgICAgICAgKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgIk9wYXF1ZTogRmxvYXQ6ICIpKSB7CiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KICAgIH0KCgogICAgLyoKICAgICAqIEhvdyBtdWNoIHNwYWNlIG5lZWRlZCBmb3IgbWF4LiBsZW5ndGggZmxvYXQ/ICAxMjggaXMgb3ZlcmtpbGwuICAKICAgICAqLwoKICAgIHdoaWxlICgoKm91dF9sZW4gKyAxMjggKyAxKSA+PSAqYnVmX2xlbikgewogICAgICAgIGlmICghKGFsbG93X3JlYWxsb2MgJiYgc25tcF9yZWFsbG9jKGJ1ZiwgYnVmX2xlbikpKSB7CiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KICAgIH0KCiAgICBzcHJpbnRmKChjaGFyICopICgqYnVmICsgKm91dF9sZW4pLCAiJWYiLCAqdmFyLT52YWwuZmxvYXRWYWwpOwogICAgKm91dF9sZW4gKz0gc3RybGVuKChjaGFyICopICgqYnVmICsgKm91dF9sZW4pKTsKCiAgICBpZiAodW5pdHMpIHsKICAgICAgICByZXR1cm4gKHNubXBfY3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsICIgIikKICAgICAgICAgICAgICAgICYmIHNubXBfY3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsIHVuaXRzKSk7CiAgICB9CiAgICByZXR1cm4gMTsKfQoKCi8qKgogKiBQcmludHMgYSBkb3VibGUgaW50byBhIGJ1ZmZlci4KICoKICogVGhlIHZhcmlhYmxlIHZhciBpcyBlbmNvZGVkIGFzIGEgZG91YmxlIHByZWNpc2lvbiBmbG9hdGluZyBwb2ludCB2YWx1ZS4KICogCiAqIElmIGFsbG93X3JlYWxsb2MgaXMgdHJ1ZSB0aGUgYnVmZmVyIHdpbGwgYmUgKHJlKWFsbG9jYXRlZCB0byBmaXQgaW4gdGhlIAogKiBuZWVkZWQgc2l6ZS4gKE5vdGU6ICpidWYgbWF5IGNoYW5nZSBkdWUgdG8gdGhpcy4pCiAqIAogKiBAcGFyYW0gYnVmICAgICAgQWRkcmVzcyBvZiB0aGUgYnVmZmVyIHRvIHByaW50IHRvLgogKiBAcGFyYW0gYnVmX2xlbiAgQWRkcmVzcyB0byBhbiBpbnRlZ2VyIGNvbnRhaW5pbmcgdGhlIHNpemUgb2YgYnVmLgogKiBAcGFyYW0gb3V0X2xlbiAgSW5jcmVtZW50ZWQgYnkgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHByaW50ZWQuCiAqIEBwYXJhbSBhbGxvd19yZWFsbG9jIGlmIG5vdCB6ZXJvIHJlYWxsb2NhdGUgdGhlIGJ1ZmZlciB0byBmaXQgdGhlIAogKiAgICAgICAgICAgICAgICAgICAgICBuZWVkZWQgc2l6ZS4KICogQHBhcmFtIHZhciAgICAgIFRoZSB2YXJpYWJsZSB0byBlbmNvZGUuCiAqIEBwYXJhbSBlbnVtcyAgICBUaGUgZW51bWVyYXRpb24gZmYgdGhpcyB2YXJpYWJsZSBpcyBlbnVtZXJhdGVkLiBtYXkgYmUgTlVMTC4KICogQHBhcmFtIGhpbnQgICAgIENvbnRlbnRzIG9mIHRoZSBESVNQTEFZLUhJTlQgY2xhdXNlIG9mIHRoZSBNSUIuCiAqICAgICAgICAgICAgICAgICBTZWUgUkZDIDE5MDMgU2VjdGlvbiAzLjEgZm9yIGRldGFpbHMuIG1heSBiZSBOVUxMLgogKiBAcGFyYW0gdW5pdHMgICAgQ29udGVudHMgb2YgdGhlIFVOSVRTIGNsYXVzZSBvZiB0aGUgTUlCLiBtYXkgYmUgTlVMTC4KICogCiAqIEByZXR1cm4gMSBvbiBzdWNjZXNzLCBvciAwIG9uIGZhaWx1cmUgKG91dCBvZiBtZW1vcnksIG9yIGJ1ZmZlciB0bwogKiAgICAgICAgIHNtYWxsIHdoZW4gbm90IGFsbG93ZWQgdG8gcmVhbGxvYy4pCiAqLwppbnQKc3ByaW50X3JlYWxsb2NfZG91YmxlKHVfY2hhciAqKiBidWYsIHNpemVfdCAqIGJ1Zl9sZW4sCiAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgKiBvdXRfbGVuLCBpbnQgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5ldHNubXBfdmFyaWFibGVfbGlzdCAqIHZhciwKICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBlbnVtX2xpc3QgKmVudW1zLAogICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqaGludCwgY29uc3QgY2hhciAqdW5pdHMpCnsKICAgIGlmICh2YXItPnR5cGUgIT0gQVNOX09QQVFVRV9ET1VCTEUpIHsKICAgICAgICBpZiAoIW5ldHNubXBfZHNfZ2V0X2Jvb2xlYW4oCiAgICAgICAgICAgICAgICBORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX1FVSUNLRV9QUklOVCkpIHsKICAgICAgICAgICAgdV9jaGFyICAgICAgICAgIHN0cltdID0gIldyb25nIFR5cGUgKHNob3VsZCBiZSBEb3VibGUpOiAiOwogICAgICAgICAgICBpZiAoIXNubXBfc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgc3RyKSkKICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KICAgICAgICByZXR1cm4gc3ByaW50X3JlYWxsb2NfYnlfdHlwZShidWYsIGJ1Zl9sZW4sIG91dF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93X3JlYWxsb2MsIHZhciwgTlVMTCwgTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CiAgICB9CgogICAgaWYgKCFuZXRzbm1wX2RzX2dldF9ib29sZWFuKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfUVVJQ0tfUFJJTlQpKSB7CiAgICAgICAgaWYgKCFzbm1wX2NzdHJjYXQKICAgICAgICAgICAgKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgIk9wYXF1ZTogRmxvYXQ6ICIpKSB7CiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KICAgIH0KCiAgICAvKgogICAgICogSG93IG11Y2ggc3BhY2UgbmVlZGVkIGZvciBtYXguIGxlbmd0aCBkb3VibGU/ICAxMjggaXMgb3ZlcmtpbGwuICAKICAgICAqLwoKICAgIHdoaWxlICgoKm91dF9sZW4gKyAxMjggKyAxKSA+PSAqYnVmX2xlbikgewogICAgICAgIGlmICghKGFsbG93X3JlYWxsb2MgJiYgc25tcF9yZWFsbG9jKGJ1ZiwgYnVmX2xlbikpKSB7CiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KICAgIH0KCiAgICBzcHJpbnRmKChjaGFyICopICgqYnVmICsgKm91dF9sZW4pLCAiJWYiLCAqdmFyLT52YWwuZG91YmxlVmFsKTsKICAgICpvdXRfbGVuICs9IHN0cmxlbigoY2hhciAqKSAoKmJ1ZiArICpvdXRfbGVuKSk7CgogICAgaWYgKHVuaXRzKSB7CiAgICAgICAgcmV0dXJuIChzbm1wX2NzdHJjYXQKICAgICAgICAgICAgICAgIChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsICIgIikKICAgICAgICAgICAgICAgICYmIHNubXBfY3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsIHVuaXRzKSk7CiAgICB9CiAgICByZXR1cm4gMTsKfQoKI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBORVRTTk1QX1dJVEhfT1BBUVVFX1NQRUNJQUxfVFlQRVMgKi8KCgovKioKICogUHJpbnRzIGEgY291bnRlciBpbnRvIGEgYnVmZmVyLgogKgogKiBUaGUgdmFyaWFibGUgdmFyIGlzIGVuY29kZWQgYXMgYSBjb3VudGVyIHZhbHVlLgogKiAKICogSWYgYWxsb3dfcmVhbGxvYyBpcyB0cnVlIHRoZSBidWZmZXIgd2lsbCBiZSAocmUpYWxsb2NhdGVkIHRvIGZpdCBpbiB0aGUgCiAqIG5lZWRlZCBzaXplLiAoTm90ZTogKmJ1ZiBtYXkgY2hhbmdlIGR1ZSB0byB0aGlzLikKICogCiAqIEBwYXJhbSBidWYgICAgICBBZGRyZXNzIG9mIHRoZSBidWZmZXIgdG8gcHJpbnQgdG8uCiAqIEBwYXJhbSBidWZfbGVuICBBZGRyZXNzIHRvIGFuIGludGVnZXIgY29udGFpbmluZyB0aGUgc2l6ZSBvZiBidWYuCiAqIEBwYXJhbSBvdXRfbGVuICBJbmNyZW1lbnRlZCBieSB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgcHJpbnRlZC4KICogQHBhcmFtIGFsbG93X3JlYWxsb2MgaWYgbm90IHplcm8gcmVhbGxvY2F0ZSB0aGUgYnVmZmVyIHRvIGZpdCB0aGUgCiAqICAgICAgICAgICAgICAgICAgICAgIG5lZWRlZCBzaXplLgogKiBAcGFyYW0gdmFyICAgICAgVGhlIHZhcmlhYmxlIHRvIGVuY29kZS4KICogQHBhcmFtIGVudW1zICAgIFRoZSBlbnVtZXJhdGlvbiBmZiB0aGlzIHZhcmlhYmxlIGlzIGVudW1lcmF0ZWQuIG1heSBiZSBOVUxMLgogKiBAcGFyYW0gaGludCAgICAgQ29udGVudHMgb2YgdGhlIERJU1BMQVktSElOVCBjbGF1c2Ugb2YgdGhlIE1JQi4KICogICAgICAgICAgICAgICAgIFNlZSBSRkMgMTkwMyBTZWN0aW9uIDMuMSBmb3IgZGV0YWlscy4gbWF5IGJlIE5VTEwuCiAqIEBwYXJhbSB1bml0cyAgICBDb250ZW50cyBvZiB0aGUgVU5JVFMgY2xhdXNlIG9mIHRoZSBNSUIuIG1heSBiZSBOVUxMLgogKiAKICogQHJldHVybiAxIG9uIHN1Y2Nlc3MsIG9yIDAgb24gZmFpbHVyZSAob3V0IG9mIG1lbW9yeSwgb3IgYnVmZmVyIHRvCiAqICAgICAgICAgc21hbGwgd2hlbiBub3QgYWxsb3dlZCB0byByZWFsbG9jLikKICovCmludApzcHJpbnRfcmVhbGxvY19jb3VudGVyNjQodV9jaGFyICoqIGJ1Ziwgc2l6ZV90ICogYnVmX2xlbiwgc2l6ZV90ICogb3V0X2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV0c25tcF92YXJpYWJsZV9saXN0ICogdmFyLAogICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGVudW1fbGlzdCAqZW51bXMsCiAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpoaW50LCBjb25zdCBjaGFyICp1bml0cykKewogICAgY2hhciAgICAgICAgICAgIGE2NGJ1ZltJNjRDSEFSU1ogKyAxXTsKCiAgICBpZiAodmFyLT50eXBlICE9IEFTTl9DT1VOVEVSNjQKI2lmZGVmIE5FVFNOTVBfV0lUSF9PUEFRVUVfU1BFQ0lBTF9UWVBFUwogICAgICAgICYmIHZhci0+dHlwZSAhPSBBU05fT1BBUVVFX0NPVU5URVI2NAogICAgICAgICYmIHZhci0+dHlwZSAhPSBBU05fT1BBUVVFX0k2NCAmJiB2YXItPnR5cGUgIT0gQVNOX09QQVFVRV9VNjQKI2VuZGlmCiAgICAgICAgKSB7CiAgICAgICAgaWYgKCFuZXRzbm1wX2RzX2dldF9ib29sZWFuKAogICAgICAgICAgICAgICAgTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9RVUlDS0VfUFJJTlQpKSB7CiAgICAgICAgICAgIHVfY2hhciAgICAgICAgICBzdHJbXSA9ICJXcm9uZyBUeXBlIChzaG91bGQgYmUgQ291bnRlcjY0KTogIjsKICAgICAgICAgICAgaWYgKCFzbm1wX3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsIHN0cikpCiAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHNwcmludF9yZWFsbG9jX2J5X3R5cGUoYnVmLCBidWZfbGVuLCBvdXRfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd19yZWFsbG9jLCB2YXIsIE5VTEwsIE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOwogICAgfQoKICAgIGlmICghbmV0c25tcF9kc19nZXRfYm9vbGVhbihORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX1FVSUNLX1BSSU5UKSkgewojaWZkZWYgTkVUU05NUF9XSVRIX09QQVFVRV9TUEVDSUFMX1RZUEVTCiAgICAgICAgaWYgKHZhci0+dHlwZSAhPSBBU05fQ09VTlRFUjY0KSB7CiAgICAgICAgICAgIGlmICghc25tcF9jc3RyY2F0CiAgICAgICAgICAgICAgICAoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCAiT3BhcXVlOiAiKSkgewogICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgIH0KICAgICAgICB9CiNlbmRpZgojaWZkZWYgTkVUU05NUF9XSVRIX09QQVFVRV9TUEVDSUFMX1RZUEVTCiAgICAgICAgc3dpdGNoICh2YXItPnR5cGUpIHsKICAgICAgICBjYXNlIEFTTl9PUEFRVUVfVTY0OgogICAgICAgICAgICBpZiAoIXNubXBfY3N0cmNhdAogICAgICAgICAgICAgICAgKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgIlVJbnQ2NDogIikpIHsKICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgQVNOX09QQVFVRV9JNjQ6CiAgICAgICAgICAgIGlmICghc25tcF9jc3RyY2F0CiAgICAgICAgICAgICAgICAoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCAiSW50NjQ6ICIpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgfQogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIEFTTl9DT1VOVEVSNjQ6CiAgICAgICAgY2FzZSBBU05fT1BBUVVFX0NPVU5URVI2NDoKI2VuZGlmCiAgICAgICAgICAgIGlmICghc25tcF9jc3RyY2F0CiAgICAgICAgICAgICAgICAoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCAiQ291bnRlcjY0OiAiKSkgewogICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgIH0KI2lmZGVmIE5FVFNOTVBfV0lUSF9PUEFRVUVfU1BFQ0lBTF9UWVBFUwogICAgICAgIH0KI2VuZGlmCiAgICB9CiNpZmRlZiBORVRTTk1QX1dJVEhfT1BBUVVFX1NQRUNJQUxfVFlQRVMKICAgIGlmICh2YXItPnR5cGUgPT0gQVNOX09QQVFVRV9JNjQpIHsKICAgICAgICBwcmludEk2NChhNjRidWYsIHZhci0+dmFsLmNvdW50ZXI2NCk7CiAgICAgICAgaWYgKCFzbm1wX2NzdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCBhNjRidWYpKSB7CiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KICAgIH0gZWxzZSB7CiNlbmRpZgogICAgICAgIHByaW50VTY0KGE2NGJ1ZiwgdmFyLT52YWwuY291bnRlcjY0KTsKICAgICAgICBpZiAoIXNubXBfY3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsIGE2NGJ1ZikpIHsKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQojaWZkZWYgTkVUU05NUF9XSVRIX09QQVFVRV9TUEVDSUFMX1RZUEVTCiAgICB9CiNlbmRpZgoKICAgIGlmICh1bml0cykgewogICAgICAgIHJldHVybiAoc25tcF9jc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgIiAiKQogICAgICAgICAgICAgICAgJiYgc25tcF9jc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgdW5pdHMpKTsKICAgIH0KICAgIHJldHVybiAxOwp9CgoKLyoqCiAqIFByaW50cyBhbiBvYmplY3QgaWRlbnRpZmllciBpbnRvIGEgYnVmZmVyLgogKgogKiBJZiBhbGxvd19yZWFsbG9jIGlzIHRydWUgdGhlIGJ1ZmZlciB3aWxsIGJlIChyZSlhbGxvY2F0ZWQgdG8gZml0IGluIHRoZSAKICogbmVlZGVkIHNpemUuIChOb3RlOiAqYnVmIG1heSBjaGFuZ2UgZHVlIHRvIHRoaXMuKQogKiAKICogQHBhcmFtIGJ1ZiAgICAgIEFkZHJlc3Mgb2YgdGhlIGJ1ZmZlciB0byBwcmludCB0by4KICogQHBhcmFtIGJ1Zl9sZW4gIEFkZHJlc3MgdG8gYW4gaW50ZWdlciBjb250YWluaW5nIHRoZSBzaXplIG9mIGJ1Zi4KICogQHBhcmFtIG91dF9sZW4gIEluY3JlbWVudGVkIGJ5IHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBwcmludGVkLgogKiBAcGFyYW0gYWxsb3dfcmVhbGxvYyBpZiBub3QgemVybyByZWFsbG9jYXRlIHRoZSBidWZmZXIgdG8gZml0IHRoZSAKICogICAgICAgICAgICAgICAgICAgICAgbmVlZGVkIHNpemUuCiAqIEBwYXJhbSB2YXIgICAgICBUaGUgdmFyaWFibGUgdG8gZW5jb2RlLgogKiBAcGFyYW0gZW51bXMgICAgVGhlIGVudW1lcmF0aW9uIGZmIHRoaXMgdmFyaWFibGUgaXMgZW51bWVyYXRlZC4gbWF5IGJlIE5VTEwuCiAqIEBwYXJhbSBoaW50ICAgICBDb250ZW50cyBvZiB0aGUgRElTUExBWS1ISU5UIGNsYXVzZSBvZiB0aGUgTUlCLgogKiAgICAgICAgICAgICAgICAgU2VlIFJGQyAxOTAzIFNlY3Rpb24gMy4xIGZvciBkZXRhaWxzLiBtYXkgYmUgTlVMTC4KICogQHBhcmFtIHVuaXRzICAgIENvbnRlbnRzIG9mIHRoZSBVTklUUyBjbGF1c2Ugb2YgdGhlIE1JQi4gbWF5IGJlIE5VTEwuCiAqIAogKiBAcmV0dXJuIDEgb24gc3VjY2Vzcywgb3IgMCBvbiBmYWlsdXJlIChvdXQgb2YgbWVtb3J5LCBvciBidWZmZXIgdG8KICogICAgICAgICBzbWFsbCB3aGVuIG5vdCBhbGxvd2VkIHRvIHJlYWxsb2MuKQogKi8KaW50CnNwcmludF9yZWFsbG9jX29wYXF1ZSh1X2NoYXIgKiogYnVmLCBzaXplX3QgKiBidWZfbGVuLAogICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICogb3V0X2xlbiwgaW50IGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXRzbm1wX3ZhcmlhYmxlX2xpc3QgKiB2YXIsCiAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgZW51bV9saXN0ICplbnVtcywKICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmhpbnQsIGNvbnN0IGNoYXIgKnVuaXRzKQp7CiAgICBpZiAodmFyLT50eXBlICE9IEFTTl9PUEFRVUUKI2lmZGVmIE5FVFNOTVBfV0lUSF9PUEFRVUVfU1BFQ0lBTF9UWVBFUwogICAgICAgICYmIHZhci0+dHlwZSAhPSBBU05fT1BBUVVFX0NPVU5URVI2NAogICAgICAgICYmIHZhci0+dHlwZSAhPSBBU05fT1BBUVVFX1U2NAogICAgICAgICYmIHZhci0+dHlwZSAhPSBBU05fT1BBUVVFX0k2NAogICAgICAgICYmIHZhci0+dHlwZSAhPSBBU05fT1BBUVVFX0ZMT0FUICYmIHZhci0+dHlwZSAhPSBBU05fT1BBUVVFX0RPVUJMRQojZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE5FVFNOTVBfV0lUSF9PUEFRVUVfU1BFQ0lBTF9UWVBFUyAqLwogICAgICAgICkgewogICAgICAgIGlmICghbmV0c25tcF9kc19nZXRfYm9vbGVhbigKICAgICAgICAgICAgICAgIE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfUVVJQ0tFX1BSSU5UKSkgewogICAgICAgICAgICB1X2NoYXIgICAgICAgICAgc3RyW10gPSAiV3JvbmcgVHlwZSAoc2hvdWxkIGJlIE9wYXF1ZSk6ICI7CiAgICAgICAgICAgIGlmICghc25tcF9zdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCBzdHIpKQogICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQogICAgICAgIHJldHVybiBzcHJpbnRfcmVhbGxvY19ieV90eXBlKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dfcmVhbGxvYywgdmFyLCBOVUxMLCBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKICAgIH0KCiNpZmRlZiBORVRTTk1QX1dJVEhfT1BBUVVFX1NQRUNJQUxfVFlQRVMKICAgIHN3aXRjaCAodmFyLT50eXBlKSB7CiAgICBjYXNlIEFTTl9PUEFRVUVfQ09VTlRFUjY0OgogICAgY2FzZSBBU05fT1BBUVVFX1U2NDoKICAgIGNhc2UgQVNOX09QQVFVRV9JNjQ6CiAgICAgICAgcmV0dXJuIHNwcmludF9yZWFsbG9jX2NvdW50ZXI2NChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd19yZWFsbG9jLCB2YXIsIGVudW1zLCBoaW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pdHMpOwogICAgICAgIGJyZWFrOwoKICAgIGNhc2UgQVNOX09QQVFVRV9GTE9BVDoKICAgICAgICByZXR1cm4gc3ByaW50X3JlYWxsb2NfZmxvYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIsIGVudW1zLCBoaW50LCB1bml0cyk7CiAgICAgICAgYnJlYWs7CgogICAgY2FzZSBBU05fT1BBUVVFX0RPVUJMRToKICAgICAgICByZXR1cm4gc3ByaW50X3JlYWxsb2NfZG91YmxlKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciwgZW51bXMsIGhpbnQsIHVuaXRzKTsKICAgICAgICBicmVhazsKCiAgICBjYXNlIEFTTl9PUEFRVUU6CiNlbmRpZgogICAgICAgIGlmICghbmV0c25tcF9kc19nZXRfYm9vbGVhbihORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX1FVSUNLX1BSSU5UKSkgewogICAgICAgICAgICB1X2NoYXIgICAgICAgICAgc3RyW10gPSAiT1BBUVVFOiAiOwogICAgICAgICAgICBpZiAoIXNubXBfc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgc3RyKSkgewogICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKCFzcHJpbnRfcmVhbGxvY19oZXhzdHJpbmcoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhci0+dmFsLnN0cmluZywgdmFyLT52YWxfbGVuKSkgewogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CiNpZmRlZiBORVRTTk1QX1dJVEhfT1BBUVVFX1NQRUNJQUxfVFlQRVMKICAgIH0KI2VuZGlmCiAgICBpZiAodW5pdHMpIHsKICAgICAgICByZXR1cm4gKHNubXBfc3RyY2F0CiAgICAgICAgICAgICAgICAoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgIChjb25zdCB1X2NoYXIgKikgIiAiKQogICAgICAgICAgICAgICAgJiYgc25tcF9zdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IHVfY2hhciAqKSB1bml0cykpOwogICAgfQogICAgcmV0dXJuIDE7Cn0KCgovKioKICogUHJpbnRzIGFuIG9iamVjdCBpZGVudGlmaWVyIGludG8gYSBidWZmZXIuCiAqCiAqIElmIGFsbG93X3JlYWxsb2MgaXMgdHJ1ZSB0aGUgYnVmZmVyIHdpbGwgYmUgKHJlKWFsbG9jYXRlZCB0byBmaXQgaW4gdGhlIAogKiBuZWVkZWQgc2l6ZS4gKE5vdGU6ICpidWYgbWF5IGNoYW5nZSBkdWUgdG8gdGhpcy4pCiAqIAogKiBAcGFyYW0gYnVmICAgICAgQWRkcmVzcyBvZiB0aGUgYnVmZmVyIHRvIHByaW50IHRvLgogKiBAcGFyYW0gYnVmX2xlbiAgQWRkcmVzcyB0byBhbiBpbnRlZ2VyIGNvbnRhaW5pbmcgdGhlIHNpemUgb2YgYnVmLgogKiBAcGFyYW0gb3V0X2xlbiAgSW5jcmVtZW50ZWQgYnkgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHByaW50ZWQuCiAqIEBwYXJhbSBhbGxvd19yZWFsbG9jIGlmIG5vdCB6ZXJvIHJlYWxsb2NhdGUgdGhlIGJ1ZmZlciB0byBmaXQgdGhlIAogKiAgICAgICAgICAgICAgICAgICAgICBuZWVkZWQgc2l6ZS4KICogQHBhcmFtIHZhciAgICAgIFRoZSB2YXJpYWJsZSB0byBlbmNvZGUuCiAqIEBwYXJhbSBlbnVtcyAgICBUaGUgZW51bWVyYXRpb24gZmYgdGhpcyB2YXJpYWJsZSBpcyBlbnVtZXJhdGVkLiBtYXkgYmUgTlVMTC4KICogQHBhcmFtIGhpbnQgICAgIENvbnRlbnRzIG9mIHRoZSBESVNQTEFZLUhJTlQgY2xhdXNlIG9mIHRoZSBNSUIuCiAqICAgICAgICAgICAgICAgICBTZWUgUkZDIDE5MDMgU2VjdGlvbiAzLjEgZm9yIGRldGFpbHMuIG1heSBiZSBOVUxMLgogKiBAcGFyYW0gdW5pdHMgICAgQ29udGVudHMgb2YgdGhlIFVOSVRTIGNsYXVzZSBvZiB0aGUgTUlCLiBtYXkgYmUgTlVMTC4KICogCiAqIEByZXR1cm4gMSBvbiBzdWNjZXNzLCBvciAwIG9uIGZhaWx1cmUgKG91dCBvZiBtZW1vcnksIG9yIGJ1ZmZlciB0bwogKiAgICAgICAgIHNtYWxsIHdoZW4gbm90IGFsbG93ZWQgdG8gcmVhbGxvYy4pCiAqLwppbnQKc3ByaW50X3JlYWxsb2Nfb2JqZWN0X2lkZW50aWZpZXIodV9jaGFyICoqIGJ1Ziwgc2l6ZV90ICogYnVmX2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICogb3V0X2xlbiwgaW50IGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5ldHNubXBfdmFyaWFibGVfbGlzdCAqIHZhciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGVudW1fbGlzdCAqZW51bXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmhpbnQsIGNvbnN0IGNoYXIgKnVuaXRzKQp7CiAgICBpbnQgICAgICAgICAgICAgYnVmX292ZXJmbG93ID0gMDsKCiAgICBpZiAodmFyLT50eXBlICE9IEFTTl9PQkpFQ1RfSUQpIHsKICAgICAgICBpZiAoIW5ldHNubXBfZHNfZ2V0X2Jvb2xlYW4oCiAgICAgICAgICAgICAgICBORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX1FVSUNLRV9QUklOVCkpIHsKICAgICAgICAgICAgdV9jaGFyICAgICAgICAgIHN0cltdID0gIldyb25nIFR5cGUgKHNob3VsZCBiZSBPQkpFQ1QgSURFTlRJRklFUik6ICI7CiAgICAgICAgICAgIGlmICghc25tcF9zdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCBzdHIpKQogICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQogICAgICAgIHJldHVybiBzcHJpbnRfcmVhbGxvY19ieV90eXBlKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dfcmVhbGxvYywgdmFyLCBOVUxMLCBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKICAgIH0KCiAgICBpZiAoIW5ldHNubXBfZHNfZ2V0X2Jvb2xlYW4oTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9RVUlDS19QUklOVCkpIHsKICAgICAgICB1X2NoYXIgICAgICAgICAgc3RyW10gPSAiT0lEOiAiOwogICAgICAgIGlmICghc25tcF9zdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCBzdHIpKSB7CiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KICAgIH0KCiAgICBuZXRzbm1wX3NwcmludF9yZWFsbG9jX29iamlkX3RyZWUoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZidWZfb3ZlcmZsb3csCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9pZCAqKSAodmFyLT52YWwub2JqaWQpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhci0+dmFsX2xlbiAvIHNpemVvZihvaWQpKTsKCiAgICBpZiAoYnVmX292ZXJmbG93KSB7CiAgICAgICAgcmV0dXJuIDA7CiAgICB9CgogICAgaWYgKHVuaXRzKSB7CiAgICAgICAgcmV0dXJuIChzbm1wX3N0cmNhdAogICAgICAgICAgICAgICAgKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAoY29uc3QgdV9jaGFyICopICIgIikKICAgICAgICAgICAgICAgICYmIHNubXBfc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCB1X2NoYXIgKikgdW5pdHMpKTsKICAgIH0KICAgIHJldHVybiAxOwp9CgoKCi8qKgogKiBQcmludHMgYSB0aW1ldGljayB2YXJpYWJsZSBpbnRvIGEgYnVmZmVyLgogKgogKiBJZiBhbGxvd19yZWFsbG9jIGlzIHRydWUgdGhlIGJ1ZmZlciB3aWxsIGJlIChyZSlhbGxvY2F0ZWQgdG8gZml0IGluIHRoZSAKICogbmVlZGVkIHNpemUuIChOb3RlOiAqYnVmIG1heSBjaGFuZ2UgZHVlIHRvIHRoaXMuKQogKiAKICogQHBhcmFtIGJ1ZiAgICAgIEFkZHJlc3Mgb2YgdGhlIGJ1ZmZlciB0byBwcmludCB0by4KICogQHBhcmFtIGJ1Zl9sZW4gIEFkZHJlc3MgdG8gYW4gaW50ZWdlciBjb250YWluaW5nIHRoZSBzaXplIG9mIGJ1Zi4KICogQHBhcmFtIG91dF9sZW4gIEluY3JlbWVudGVkIGJ5IHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBwcmludGVkLgogKiBAcGFyYW0gYWxsb3dfcmVhbGxvYyBpZiBub3QgemVybyByZWFsbG9jYXRlIHRoZSBidWZmZXIgdG8gZml0IHRoZSAKICogICAgICAgICAgICAgICAgICAgICAgbmVlZGVkIHNpemUuCiAqIEBwYXJhbSB2YXIgICAgICBUaGUgdmFyaWFibGUgdG8gZW5jb2RlLgogKiBAcGFyYW0gZW51bXMgICAgVGhlIGVudW1lcmF0aW9uIGZmIHRoaXMgdmFyaWFibGUgaXMgZW51bWVyYXRlZC4gbWF5IGJlIE5VTEwuCiAqIEBwYXJhbSBoaW50ICAgICBDb250ZW50cyBvZiB0aGUgRElTUExBWS1ISU5UIGNsYXVzZSBvZiB0aGUgTUlCLgogKiAgICAgICAgICAgICAgICAgU2VlIFJGQyAxOTAzIFNlY3Rpb24gMy4xIGZvciBkZXRhaWxzLiBtYXkgYmUgTlVMTC4KICogQHBhcmFtIHVuaXRzICAgIENvbnRlbnRzIG9mIHRoZSBVTklUUyBjbGF1c2Ugb2YgdGhlIE1JQi4gbWF5IGJlIE5VTEwuCiAqIAogKiBAcmV0dXJuIDEgb24gc3VjY2Vzcywgb3IgMCBvbiBmYWlsdXJlIChvdXQgb2YgbWVtb3J5LCBvciBidWZmZXIgdG8KICogICAgICAgICBzbWFsbCB3aGVuIG5vdCBhbGxvd2VkIHRvIHJlYWxsb2MuKQogKi8KaW50CnNwcmludF9yZWFsbG9jX3RpbWV0aWNrcyh1X2NoYXIgKiogYnVmLCBzaXplX3QgKiBidWZfbGVuLCBzaXplX3QgKiBvdXRfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXRzbm1wX3ZhcmlhYmxlX2xpc3QgKiB2YXIsCiAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgZW51bV9saXN0ICplbnVtcywKICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmhpbnQsIGNvbnN0IGNoYXIgKnVuaXRzKQp7CiAgICBjaGFyICAgICAgICAgICAgdGltZWJ1Zls0MF07CgogICAgaWYgKHZhci0+dHlwZSAhPSBBU05fVElNRVRJQ0tTKSB7CiAgICAgICAgaWYgKCFuZXRzbm1wX2RzX2dldF9ib29sZWFuKAogICAgICAgICAgICAgICAgTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9RVUlDS0VfUFJJTlQpKSB7CiAgICAgICAgICAgIHVfY2hhciAgICAgICAgICBzdHJbXSA9ICJXcm9uZyBUeXBlIChzaG91bGQgYmUgVGltZXRpY2tzKTogIjsKICAgICAgICAgICAgaWYgKCFzbm1wX3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsIHN0cikpCiAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHNwcmludF9yZWFsbG9jX2J5X3R5cGUoYnVmLCBidWZfbGVuLCBvdXRfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd19yZWFsbG9jLCB2YXIsIE5VTEwsIE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOwogICAgfQoKICAgIGlmIChuZXRzbm1wX2RzX2dldF9ib29sZWFuKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfTlVNRVJJQ19USU1FVElDS1MpKSB7CiAgICAgICAgY2hhciAgICAgICAgICAgIHN0clszMl07CiAgICAgICAgc3ByaW50ZihzdHIsICIlbHUiLCAqKHVfbG9uZyAqKSB2YXItPnZhbC5pbnRlZ2VyKTsKICAgICAgICBpZiAoIXNubXBfc3RyY2F0CiAgICAgICAgICAgIChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsIChjb25zdCB1X2NoYXIgKikgc3RyKSkgewogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIDE7CiAgICB9CiAgICBpZiAoIW5ldHNubXBfZHNfZ2V0X2Jvb2xlYW4oTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9RVUlDS19QUklOVCkpIHsKICAgICAgICBjaGFyICAgICAgICAgICAgc3RyWzMyXTsKICAgICAgICBzcHJpbnRmKHN0ciwgIlRpbWV0aWNrczogKCVsdSkgIiwgKih1X2xvbmcgKikgdmFyLT52YWwuaW50ZWdlcik7CiAgICAgICAgaWYgKCFzbm1wX3N0cmNhdAogICAgICAgICAgICAoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCAoY29uc3QgdV9jaGFyICopIHN0cikpIHsKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQogICAgfQogICAgdXB0aW1lU3RyaW5nKCoodV9sb25nICopICh2YXItPnZhbC5pbnRlZ2VyKSwgdGltZWJ1Ziwgc2l6ZW9mKHRpbWVidWYpKTsKICAgIGlmICghc25tcF9zdHJjYXQKICAgICAgICAoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCAoY29uc3QgdV9jaGFyICopIHRpbWVidWYpKSB7CiAgICAgICAgcmV0dXJuIDA7CiAgICB9CiAgICBpZiAodW5pdHMpIHsKICAgICAgICByZXR1cm4gKHNubXBfc3RyY2F0CiAgICAgICAgICAgICAgICAoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgIChjb25zdCB1X2NoYXIgKikgIiAiKQogICAgICAgICAgICAgICAgJiYgc25tcF9zdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IHVfY2hhciAqKSB1bml0cykpOwogICAgfQogICAgcmV0dXJuIDE7Cn0KCgovKioKICogUHJpbnRzIGFuIGludGVnZXIgYWNjb3JkaW5nIHRvIHRoZSBoaW50IGludG8gYSBidWZmZXIuCiAqCiAqIElmIGFsbG93X3JlYWxsb2MgaXMgdHJ1ZSB0aGUgYnVmZmVyIHdpbGwgYmUgKHJlKWFsbG9jYXRlZCB0byBmaXQgaW4gdGhlIAogKiBuZWVkZWQgc2l6ZS4gKE5vdGU6ICpidWYgbWF5IGNoYW5nZSBkdWUgdG8gdGhpcy4pCiAqIAogKiBAcGFyYW0gYnVmICAgICAgQWRkcmVzcyBvZiB0aGUgYnVmZmVyIHRvIHByaW50IHRvLgogKiBAcGFyYW0gYnVmX2xlbiAgQWRkcmVzcyB0byBhbiBpbnRlZ2VyIGNvbnRhaW5pbmcgdGhlIHNpemUgb2YgYnVmLgogKiBAcGFyYW0gb3V0X2xlbiAgSW5jcmVtZW50ZWQgYnkgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHByaW50ZWQuCiAqIEBwYXJhbSBhbGxvd19yZWFsbG9jIGlmIG5vdCB6ZXJvIHJlYWxsb2NhdGUgdGhlIGJ1ZmZlciB0byBmaXQgdGhlIAogKiAgICAgICAgICAgICAgICAgICAgICBuZWVkZWQgc2l6ZS4KICogQHBhcmFtIHZhbCAgICAgIFRoZSB2YXJpYWJsZSB0byBlbmNvZGUuCiAqIEBwYXJhbSBkZWNpbWFsdHlwZSAnZCcgb3IgJ3UnIGRlcGVuZGluZyBvbiBpbnRlZ2VyIHR5cGUKICogQHBhcmFtIGhpbnQgICAgIENvbnRlbnRzIG9mIHRoZSBESVNQTEFZLUhJTlQgY2xhdXNlIG9mIHRoZSBNSUIuCiAqICAgICAgICAgICAgICAgICBTZWUgUkZDIDE5MDMgU2VjdGlvbiAzLjEgZm9yIGRldGFpbHMuIG1heSBfTk9UXyBiZSBOVUxMLgogKiBAcGFyYW0gdW5pdHMgICAgQ29udGVudHMgb2YgdGhlIFVOSVRTIGNsYXVzZSBvZiB0aGUgTUlCLiBtYXkgYmUgTlVMTC4KICogCiAqIEByZXR1cm4gMSBvbiBzdWNjZXNzLCBvciAwIG9uIGZhaWx1cmUgKG91dCBvZiBtZW1vcnksIG9yIGJ1ZmZlciB0bwogKiAgICAgICAgIHNtYWxsIHdoZW4gbm90IGFsbG93ZWQgdG8gcmVhbGxvYy4pCiAqLwppbnQKc3ByaW50X3JlYWxsb2NfaGludGVkX2ludGVnZXIodV9jaGFyICoqIGJ1Ziwgc2l6ZV90ICogYnVmX2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICogb3V0X2xlbiwgaW50IGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgdmFsLCBjb25zdCBjaGFyIGRlY2ltYWx0eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpoaW50LCBjb25zdCBjaGFyICp1bml0cykKewogICAgY2hhciAgICAgICAgICAgIGZtdFsxMF0gPSAiJWxAIiwgdG1wWzI1Nl07CiAgICBpbnQgICAgICAgICAgICAgc2hpZnQgPSAwLCBsZW4sIG5lZ2F0aXZlID0gMDsKCiAgICBpZiAoaGludFswXSA9PSAnZCcpIHsKICAgICAgICAvKgogICAgICAgICAqIFdlIG1pZ2h0ICphY3R1YWxseSogd2FudCBhICd1JyBoZXJlLiAgCiAgICAgICAgICovCiAgICAgICAgaWYgKGhpbnRbMV0gPT0gJy0nKQogICAgICAgICAgICBzaGlmdCA9IGF0b2koaGludCArIDIpOwogICAgICAgIGZtdFsyXSA9IGRlY2ltYWx0eXBlOwogICAgICAgIGlmICh2YWwgPCAwKSB7CiAgICAgICAgICAgIG5lZ2F0aXZlID0gMTsKICAgICAgICAgICAgdmFsID0gLXZhbDsKICAgICAgICB9CiAgICB9IGVsc2UgewogICAgICAgIC8qCiAgICAgICAgICogRElTUExBWS1ISU5UIGNoYXJhY3RlciBpcyAnYicsICdvJywgb3IgJ3gnLiAgCiAgICAgICAgICovCiAgICAgICAgZm10WzJdID0gaGludFswXTsKICAgIH0KCiAgICBpZiAoaGludFswXSA9PSAnYicpIHsKCXVuc2lnbmVkIGxvbmcgaW50IGJpdCA9IDB4ODAwMDAwMDBMVTsKCWNoYXIgKmJwID0gdG1wOwoJd2hpbGUgKGJpdCkgewoJICAgICpicCsrID0gdmFsICYgYml0ID8gJzEnIDogJzAnOwoJICAgIGJpdCA+Pj0gMTsKCX0KCSpicCA9IDA7CiAgICB9CiAgICBlbHNlCglzcHJpbnRmKHRtcCwgZm10LCB2YWwpOwoKICAgIGlmIChzaGlmdCAhPSAwKSB7CiAgICAgICAgbGVuID0gc3RybGVuKHRtcCk7CiAgICAgICAgaWYgKHNoaWZ0IDw9IGxlbikgewogICAgICAgICAgICB0bXBbbGVuICsgMV0gPSAwOwogICAgICAgICAgICB3aGlsZSAoc2hpZnQtLSkgewogICAgICAgICAgICAgICAgdG1wW2xlbl0gPSB0bXBbbGVuIC0gMV07CiAgICAgICAgICAgICAgICBsZW4tLTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0bXBbbGVuXSA9ICcuJzsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB0bXBbc2hpZnQgKyAxXSA9IDA7CiAgICAgICAgICAgIHdoaWxlIChzaGlmdCkgewogICAgICAgICAgICAgICAgaWYgKGxlbi0tID4gMCkgewogICAgICAgICAgICAgICAgICAgIHRtcFtzaGlmdF0gPSB0bXBbbGVuXTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgdG1wW3NoaWZ0XSA9ICcwJzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHNoaWZ0LS07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdG1wWzBdID0gJy4nOwogICAgICAgIH0KICAgIH0KICAgIGlmIChuZWdhdGl2ZSkgewogICAgICAgIGxlbiA9IHN0cmxlbih0bXApKzE7CiAgICAgICAgd2hpbGUgKGxlbikgewogICAgICAgICAgICB0bXBbbGVuXSA9IHRtcFtsZW4tMV07CiAgICAgICAgICAgIGxlbi0tOwogICAgICAgIH0KICAgICAgICB0bXBbMF0gPSAnLSc7CiAgICB9CiAgICByZXR1cm4gc25tcF9zdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCAodV9jaGFyICopdG1wKTsKfQoKCi8qKgogKiBQcmludHMgYW4gaW50ZWdlciBpbnRvIGEgYnVmZmVyLgogKgogKiBJZiBhbGxvd19yZWFsbG9jIGlzIHRydWUgdGhlIGJ1ZmZlciB3aWxsIGJlIChyZSlhbGxvY2F0ZWQgdG8gZml0IGluIHRoZSAKICogbmVlZGVkIHNpemUuIChOb3RlOiAqYnVmIG1heSBjaGFuZ2UgZHVlIHRvIHRoaXMuKQogKiAKICogQHBhcmFtIGJ1ZiAgICAgIEFkZHJlc3Mgb2YgdGhlIGJ1ZmZlciB0byBwcmludCB0by4KICogQHBhcmFtIGJ1Zl9sZW4gIEFkZHJlc3MgdG8gYW4gaW50ZWdlciBjb250YWluaW5nIHRoZSBzaXplIG9mIGJ1Zi4KICogQHBhcmFtIG91dF9sZW4gIEluY3JlbWVudGVkIGJ5IHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBwcmludGVkLgogKiBAcGFyYW0gYWxsb3dfcmVhbGxvYyBpZiBub3QgemVybyByZWFsbG9jYXRlIHRoZSBidWZmZXIgdG8gZml0IHRoZSAKICogICAgICAgICAgICAgICAgICAgICAgbmVlZGVkIHNpemUuCiAqIEBwYXJhbSB2YXIgICAgICBUaGUgdmFyaWFibGUgdG8gZW5jb2RlLgogKiBAcGFyYW0gZW51bXMgICAgVGhlIGVudW1lcmF0aW9uIGZmIHRoaXMgdmFyaWFibGUgaXMgZW51bWVyYXRlZC4gbWF5IGJlIE5VTEwuCiAqIEBwYXJhbSBoaW50ICAgICBDb250ZW50cyBvZiB0aGUgRElTUExBWS1ISU5UIGNsYXVzZSBvZiB0aGUgTUlCLgogKiAgICAgICAgICAgICAgICAgU2VlIFJGQyAxOTAzIFNlY3Rpb24gMy4xIGZvciBkZXRhaWxzLiBtYXkgYmUgTlVMTC4KICogQHBhcmFtIHVuaXRzICAgIENvbnRlbnRzIG9mIHRoZSBVTklUUyBjbGF1c2Ugb2YgdGhlIE1JQi4gbWF5IGJlIE5VTEwuCiAqIAogKiBAcmV0dXJuIDEgb24gc3VjY2Vzcywgb3IgMCBvbiBmYWlsdXJlIChvdXQgb2YgbWVtb3J5LCBvciBidWZmZXIgdG8KICogICAgICAgICBzbWFsbCB3aGVuIG5vdCBhbGxvd2VkIHRvIHJlYWxsb2MuKQogKi8KaW50CnNwcmludF9yZWFsbG9jX2ludGVnZXIodV9jaGFyICoqIGJ1Ziwgc2l6ZV90ICogYnVmX2xlbiwgc2l6ZV90ICogb3V0X2xlbiwKICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXRzbm1wX3ZhcmlhYmxlX2xpc3QgKiB2YXIsCiAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGVudW1fbGlzdCAqZW51bXMsCiAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqaGludCwgY29uc3QgY2hhciAqdW5pdHMpCnsKICAgIGNoYXIgICAgICAgICAgICplbnVtX3N0cmluZyA9IE5VTEw7CgogICAgaWYgKHZhci0+dHlwZSAhPSBBU05fSU5URUdFUikgewogICAgICAgIGlmICghbmV0c25tcF9kc19nZXRfYm9vbGVhbigKICAgICAgICAgICAgICAgIE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfUVVJQ0tFX1BSSU5UKSkgewogICAgICAgICAgICB1X2NoYXIgICAgICAgICAgc3RyW10gPSAiV3JvbmcgVHlwZSAoc2hvdWxkIGJlIElOVEVHRVIpOiAiOwogICAgICAgICAgICBpZiAoIXNubXBfc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgc3RyKSkKICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KICAgICAgICByZXR1cm4gc3ByaW50X3JlYWxsb2NfYnlfdHlwZShidWYsIGJ1Zl9sZW4sIG91dF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93X3JlYWxsb2MsIHZhciwgTlVMTCwgTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CiAgICB9CgogICAgZm9yICg7IGVudW1zOyBlbnVtcyA9IGVudW1zLT5uZXh0KSB7CiAgICAgICAgaWYgKGVudW1zLT52YWx1ZSA9PSAqdmFyLT52YWwuaW50ZWdlcikgewogICAgICAgICAgICBlbnVtX3N0cmluZyA9IGVudW1zLT5sYWJlbDsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgfQoKICAgIGlmICghbmV0c25tcF9kc19nZXRfYm9vbGVhbihORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX1FVSUNLX1BSSU5UKSkgewogICAgICAgIGlmICghc25tcF9zdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IHVfY2hhciAqKSAiSU5URUdFUjogIikpIHsKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQogICAgfQoKICAgIGlmIChlbnVtX3N0cmluZyA9PSBOVUxMIHx8CiAgICAgICAgbmV0c25tcF9kc19nZXRfYm9vbGVhbihORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX1BSSU5UX05VTUVSSUNfRU5VTSkpIHsKICAgICAgICBpZiAoaGludCkgewogICAgICAgICAgICBpZiAoIShzcHJpbnRfcmVhbGxvY19oaW50ZWRfaW50ZWdlcihidWYsIGJ1Zl9sZW4sIG91dF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp2YXItPnZhbC5pbnRlZ2VyLCAnZCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhpbnQsIHVuaXRzKSkpIHsKICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgY2hhciAgICAgICAgICAgIHN0clszMl07CiAgICAgICAgICAgIHNwcmludGYoc3RyLCAiJWxkIiwgKnZhci0+dmFsLmludGVnZXIpOwogICAgICAgICAgICBpZiAoIXNubXBfc3RyY2F0CiAgICAgICAgICAgICAgICAoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgIChjb25zdCB1X2NoYXIgKikgc3RyKSkgewogICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9IGVsc2UgaWYgKG5ldHNubXBfZHNfZ2V0X2Jvb2xlYW4oTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9RVUlDS19QUklOVCkpIHsKICAgICAgICBpZiAoIXNubXBfc3RyY2F0CiAgICAgICAgICAgIChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAoY29uc3QgdV9jaGFyICopIGVudW1fc3RyaW5nKSkgewogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CiAgICB9IGVsc2UgewogICAgICAgIGNoYXIgICAgICAgICAgICBzdHJbMzJdOwogICAgICAgIHNwcmludGYoc3RyLCAiKCVsZCkiLCAqdmFyLT52YWwuaW50ZWdlcik7CiAgICAgICAgaWYgKCFzbm1wX3N0cmNhdAogICAgICAgICAgICAoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgKGNvbnN0IHVfY2hhciAqKSBlbnVtX3N0cmluZykpIHsKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQogICAgICAgIGlmICghc25tcF9zdHJjYXQKICAgICAgICAgICAgKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgKGNvbnN0IHVfY2hhciAqKSBzdHIpKSB7CiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KICAgIH0KCiAgICBpZiAodW5pdHMpIHsKICAgICAgICByZXR1cm4gKHNubXBfc3RyY2F0CiAgICAgICAgICAgICAgICAoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgIChjb25zdCB1X2NoYXIgKikgIiAiKQogICAgICAgICAgICAgICAgJiYgc25tcF9zdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IHVfY2hhciAqKSB1bml0cykpOwogICAgfQogICAgcmV0dXJuIDE7Cn0KCgovKioKICogUHJpbnRzIGFuIHVuc2lnbmVkIGludGVnZXIgaW50byBhIGJ1ZmZlci4KICoKICogSWYgYWxsb3dfcmVhbGxvYyBpcyB0cnVlIHRoZSBidWZmZXIgd2lsbCBiZSAocmUpYWxsb2NhdGVkIHRvIGZpdCBpbiB0aGUgCiAqIG5lZWRlZCBzaXplLiAoTm90ZTogKmJ1ZiBtYXkgY2hhbmdlIGR1ZSB0byB0aGlzLikKICogCiAqIEBwYXJhbSBidWYgICAgICBBZGRyZXNzIG9mIHRoZSBidWZmZXIgdG8gcHJpbnQgdG8uCiAqIEBwYXJhbSBidWZfbGVuICBBZGRyZXNzIHRvIGFuIGludGVnZXIgY29udGFpbmluZyB0aGUgc2l6ZSBvZiBidWYuCiAqIEBwYXJhbSBvdXRfbGVuICBJbmNyZW1lbnRlZCBieSB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgcHJpbnRlZC4KICogQHBhcmFtIGFsbG93X3JlYWxsb2MgaWYgbm90IHplcm8gcmVhbGxvY2F0ZSB0aGUgYnVmZmVyIHRvIGZpdCB0aGUgCiAqICAgICAgICAgICAgICAgICAgICAgIG5lZWRlZCBzaXplLgogKiBAcGFyYW0gdmFyICAgICAgVGhlIHZhcmlhYmxlIHRvIGVuY29kZS4KICogQHBhcmFtIGVudW1zICAgIFRoZSBlbnVtZXJhdGlvbiBmZiB0aGlzIHZhcmlhYmxlIGlzIGVudW1lcmF0ZWQuIG1heSBiZSBOVUxMLgogKiBAcGFyYW0gaGludCAgICAgQ29udGVudHMgb2YgdGhlIERJU1BMQVktSElOVCBjbGF1c2Ugb2YgdGhlIE1JQi4KICogICAgICAgICAgICAgICAgIFNlZSBSRkMgMTkwMyBTZWN0aW9uIDMuMSBmb3IgZGV0YWlscy4gbWF5IGJlIE5VTEwuCiAqIEBwYXJhbSB1bml0cyAgICBDb250ZW50cyBvZiB0aGUgVU5JVFMgY2xhdXNlIG9mIHRoZSBNSUIuIG1heSBiZSBOVUxMLgogKiAKICogQHJldHVybiAxIG9uIHN1Y2Nlc3MsIG9yIDAgb24gZmFpbHVyZSAob3V0IG9mIG1lbW9yeSwgb3IgYnVmZmVyIHRvCiAqICAgICAgICAgc21hbGwgd2hlbiBub3QgYWxsb3dlZCB0byByZWFsbG9jLikKICovCmludApzcHJpbnRfcmVhbGxvY191aW50ZWdlcih1X2NoYXIgKiogYnVmLCBzaXplX3QgKiBidWZfbGVuLCBzaXplX3QgKiBvdXRfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV0c25tcF92YXJpYWJsZV9saXN0ICogdmFyLAogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgZW51bV9saXN0ICplbnVtcywKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqaGludCwgY29uc3QgY2hhciAqdW5pdHMpCnsKICAgIGNoYXIgICAgICAgICAgICplbnVtX3N0cmluZyA9IE5VTEw7CgogICAgaWYgKHZhci0+dHlwZSAhPSBBU05fVUlOVEVHRVIpIHsKICAgICAgICBpZiAoIW5ldHNubXBfZHNfZ2V0X2Jvb2xlYW4oCiAgICAgICAgICAgICAgICBORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX1FVSUNLRV9QUklOVCkpIHsKICAgICAgICAgICAgdV9jaGFyICAgICAgICAgIHN0cltdID0gIldyb25nIFR5cGUgKHNob3VsZCBiZSBVSW50ZWdlcjMyKTogIjsKICAgICAgICAgICAgaWYgKCFzbm1wX3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsIHN0cikpCiAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHNwcmludF9yZWFsbG9jX2J5X3R5cGUoYnVmLCBidWZfbGVuLCBvdXRfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd19yZWFsbG9jLCB2YXIsIE5VTEwsIE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOwogICAgfQoKICAgIGZvciAoOyBlbnVtczsgZW51bXMgPSBlbnVtcy0+bmV4dCkgewogICAgICAgIGlmIChlbnVtcy0+dmFsdWUgPT0gKnZhci0+dmFsLmludGVnZXIpIHsKICAgICAgICAgICAgZW51bV9zdHJpbmcgPSBlbnVtcy0+bGFiZWw7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgIH0KCiAgICBpZiAoZW51bV9zdHJpbmcgPT0gTlVMTCB8fAogICAgICAgIG5ldHNubXBfZHNfZ2V0X2Jvb2xlYW4oTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9QUklOVF9OVU1FUklDX0VOVU0pKSB7CiAgICAgICAgaWYgKGhpbnQpIHsKICAgICAgICAgICAgaWYgKCEoc3ByaW50X3JlYWxsb2NfaGludGVkX2ludGVnZXIoYnVmLCBidWZfbGVuLCBvdXRfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqdmFyLT52YWwuaW50ZWdlciwgJ3UnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoaW50LCB1bml0cykpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGNoYXIgICAgICAgICAgICBzdHJbMzJdOwogICAgICAgICAgICBzcHJpbnRmKHN0ciwgIiVsdSIsICp2YXItPnZhbC5pbnRlZ2VyKTsKICAgICAgICAgICAgaWYgKCFzbm1wX3N0cmNhdAogICAgICAgICAgICAgICAgKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAoY29uc3QgdV9jaGFyICopIHN0cikpIHsKICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfSBlbHNlIGlmIChuZXRzbm1wX2RzX2dldF9ib29sZWFuKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfUVVJQ0tfUFJJTlQpKSB7CiAgICAgICAgaWYgKCFzbm1wX3N0cmNhdAogICAgICAgICAgICAoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgKGNvbnN0IHVfY2hhciAqKSBlbnVtX3N0cmluZykpIHsKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgICBjaGFyICAgICAgICAgICAgc3RyWzMyXTsKICAgICAgICBzcHJpbnRmKHN0ciwgIiglbHUpIiwgKnZhci0+dmFsLmludGVnZXIpOwogICAgICAgIGlmICghc25tcF9zdHJjYXQKICAgICAgICAgICAgKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgIChjb25zdCB1X2NoYXIgKikgZW51bV9zdHJpbmcpKSB7CiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KICAgICAgICBpZiAoIXNubXBfc3RyY2F0CiAgICAgICAgICAgIChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsIChjb25zdCB1X2NoYXIgKikgc3RyKSkgewogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CiAgICB9CgogICAgaWYgKHVuaXRzKSB7CiAgICAgICAgcmV0dXJuIChzbm1wX3N0cmNhdAogICAgICAgICAgICAgICAgKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAoY29uc3QgdV9jaGFyICopICIgIikKICAgICAgICAgICAgICAgICYmIHNubXBfc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCB1X2NoYXIgKikgdW5pdHMpKTsKICAgIH0KICAgIHJldHVybiAxOwp9CgoKLyoqCiAqIFByaW50cyBhIGdhdWdlIHZhbHVlIGludG8gYSBidWZmZXIuCiAqCiAqIElmIGFsbG93X3JlYWxsb2MgaXMgdHJ1ZSB0aGUgYnVmZmVyIHdpbGwgYmUgKHJlKWFsbG9jYXRlZCB0byBmaXQgaW4gdGhlIAogKiBuZWVkZWQgc2l6ZS4gKE5vdGU6ICpidWYgbWF5IGNoYW5nZSBkdWUgdG8gdGhpcy4pCiAqIAogKiBAcGFyYW0gYnVmICAgICAgQWRkcmVzcyBvZiB0aGUgYnVmZmVyIHRvIHByaW50IHRvLgogKiBAcGFyYW0gYnVmX2xlbiAgQWRkcmVzcyB0byBhbiBpbnRlZ2VyIGNvbnRhaW5pbmcgdGhlIHNpemUgb2YgYnVmLgogKiBAcGFyYW0gb3V0X2xlbiAgSW5jcmVtZW50ZWQgYnkgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHByaW50ZWQuCiAqIEBwYXJhbSBhbGxvd19yZWFsbG9jIGlmIG5vdCB6ZXJvIHJlYWxsb2NhdGUgdGhlIGJ1ZmZlciB0byBmaXQgdGhlIAogKiAgICAgICAgICAgICAgICAgICAgICBuZWVkZWQgc2l6ZS4KICogQHBhcmFtIHZhciAgICAgIFRoZSB2YXJpYWJsZSB0byBlbmNvZGUuCiAqIEBwYXJhbSBlbnVtcyAgICBUaGUgZW51bWVyYXRpb24gZmYgdGhpcyB2YXJpYWJsZSBpcyBlbnVtZXJhdGVkLiBtYXkgYmUgTlVMTC4KICogQHBhcmFtIGhpbnQgICAgIENvbnRlbnRzIG9mIHRoZSBESVNQTEFZLUhJTlQgY2xhdXNlIG9mIHRoZSBNSUIuCiAqICAgICAgICAgICAgICAgICBTZWUgUkZDIDE5MDMgU2VjdGlvbiAzLjEgZm9yIGRldGFpbHMuIG1heSBiZSBOVUxMLgogKiBAcGFyYW0gdW5pdHMgICAgQ29udGVudHMgb2YgdGhlIFVOSVRTIGNsYXVzZSBvZiB0aGUgTUlCLiBtYXkgYmUgTlVMTC4KICogCiAqIEByZXR1cm4gMSBvbiBzdWNjZXNzLCBvciAwIG9uIGZhaWx1cmUgKG91dCBvZiBtZW1vcnksIG9yIGJ1ZmZlciB0bwogKiAgICAgICAgIHNtYWxsIHdoZW4gbm90IGFsbG93ZWQgdG8gcmVhbGxvYy4pCiAqLwppbnQKc3ByaW50X3JlYWxsb2NfZ2F1Z2UodV9jaGFyICoqIGJ1Ziwgc2l6ZV90ICogYnVmX2xlbiwgc2l6ZV90ICogb3V0X2xlbiwKICAgICAgICAgICAgICAgICAgICAgaW50IGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5ldHNubXBfdmFyaWFibGVfbGlzdCAqIHZhciwKICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGVudW1fbGlzdCAqZW51bXMsCiAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmhpbnQsIGNvbnN0IGNoYXIgKnVuaXRzKQp7CiAgICBjaGFyICAgICAgICAgICAgdG1wWzMyXTsKCiAgICBpZiAodmFyLT50eXBlICE9IEFTTl9HQVVHRSkgewogICAgICAgIGlmICghbmV0c25tcF9kc19nZXRfYm9vbGVhbigKICAgICAgICAgICAgICAgIE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfUVVJQ0tFX1BSSU5UKSkgewogICAgICAgICAgICB1X2NoYXIgICAgICAgICAgc3RyW10gPSAiV3JvbmcgVHlwZSAoc2hvdWxkIGJlIEdhdWdlMzIgb3IgVW5zaWduZWQzMik6ICI7CiAgICAgICAgICAgIGlmICghc25tcF9zdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCBzdHIpKQogICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQogICAgICAgIHJldHVybiBzcHJpbnRfcmVhbGxvY19ieV90eXBlKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dfcmVhbGxvYywgdmFyLCBOVUxMLCBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKICAgIH0KCiAgICBpZiAoIW5ldHNubXBfZHNfZ2V0X2Jvb2xlYW4oTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9RVUlDS19QUklOVCkpIHsKICAgICAgICB1X2NoYXIgICAgICAgICAgc3RyW10gPSAiR2F1Z2UzMjogIjsKICAgICAgICBpZiAoIXNubXBfc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgc3RyKSkgewogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CiAgICB9CiAgICBpZiAoaGludCkgewogICAgICAgIGlmICghc3ByaW50X3JlYWxsb2NfaGludGVkX2ludGVnZXIoYnVmLCBidWZfbGVuLCBvdXRfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp2YXItPnZhbC5pbnRlZ2VyLCAndScsIGhpbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bml0cykpIHsKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgICBzcHJpbnRmKHRtcCwgIiV1IiwgKHVuc2lnbmVkIGludCkoKnZhci0+dmFsLmludGVnZXIgJiAweGZmZmZmZmZmKSk7CiAgICAgICAgaWYgKCFzbm1wX3N0cmNhdAogICAgICAgICAgICAoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCAoY29uc3QgdV9jaGFyICopIHRtcCkpIHsKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQogICAgfQogICAgaWYgKHVuaXRzKSB7CiAgICAgICAgcmV0dXJuIChzbm1wX3N0cmNhdAogICAgICAgICAgICAgICAgKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAoY29uc3QgdV9jaGFyICopICIgIikKICAgICAgICAgICAgICAgICYmIHNubXBfc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCB1X2NoYXIgKikgdW5pdHMpKTsKICAgIH0KICAgIHJldHVybiAxOwp9CgoKLyoqCiAqIFByaW50cyBhIGNvdW50ZXIgdmFsdWUgaW50byBhIGJ1ZmZlci4KICoKICogSWYgYWxsb3dfcmVhbGxvYyBpcyB0cnVlIHRoZSBidWZmZXIgd2lsbCBiZSAocmUpYWxsb2NhdGVkIHRvIGZpdCBpbiB0aGUgCiAqIG5lZWRlZCBzaXplLiAoTm90ZTogKmJ1ZiBtYXkgY2hhbmdlIGR1ZSB0byB0aGlzLikKICogCiAqIEBwYXJhbSBidWYgICAgICBBZGRyZXNzIG9mIHRoZSBidWZmZXIgdG8gcHJpbnQgdG8uCiAqIEBwYXJhbSBidWZfbGVuICBBZGRyZXNzIHRvIGFuIGludGVnZXIgY29udGFpbmluZyB0aGUgc2l6ZSBvZiBidWYuCiAqIEBwYXJhbSBvdXRfbGVuICBJbmNyZW1lbnRlZCBieSB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgcHJpbnRlZC4KICogQHBhcmFtIGFsbG93X3JlYWxsb2MgaWYgbm90IHplcm8gcmVhbGxvY2F0ZSB0aGUgYnVmZmVyIHRvIGZpdCB0aGUgCiAqICAgICAgICAgICAgICAgICAgICAgIG5lZWRlZCBzaXplLgogKiBAcGFyYW0gdmFyICAgICAgVGhlIHZhcmlhYmxlIHRvIGVuY29kZS4KICogQHBhcmFtIGVudW1zICAgIFRoZSBlbnVtZXJhdGlvbiBmZiB0aGlzIHZhcmlhYmxlIGlzIGVudW1lcmF0ZWQuIG1heSBiZSBOVUxMLgogKiBAcGFyYW0gaGludCAgICAgQ29udGVudHMgb2YgdGhlIERJU1BMQVktSElOVCBjbGF1c2Ugb2YgdGhlIE1JQi4KICogICAgICAgICAgICAgICAgIFNlZSBSRkMgMTkwMyBTZWN0aW9uIDMuMSBmb3IgZGV0YWlscy4gbWF5IGJlIE5VTEwuCiAqIEBwYXJhbSB1bml0cyAgICBDb250ZW50cyBvZiB0aGUgVU5JVFMgY2xhdXNlIG9mIHRoZSBNSUIuIG1heSBiZSBOVUxMLgogKiAKICogQHJldHVybiAxIG9uIHN1Y2Nlc3MsIG9yIDAgb24gZmFpbHVyZSAob3V0IG9mIG1lbW9yeSwgb3IgYnVmZmVyIHRvCiAqICAgICAgICAgc21hbGwgd2hlbiBub3QgYWxsb3dlZCB0byByZWFsbG9jLikKICovCmludApzcHJpbnRfcmVhbGxvY19jb3VudGVyKHVfY2hhciAqKiBidWYsIHNpemVfdCAqIGJ1Zl9sZW4sIHNpemVfdCAqIG91dF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgaW50IGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV0c25tcF92YXJpYWJsZV9saXN0ICogdmFyLAogICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBlbnVtX2xpc3QgKmVudW1zLAogICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmhpbnQsIGNvbnN0IGNoYXIgKnVuaXRzKQp7CiAgICBjaGFyICAgICAgICAgICAgdG1wWzMyXTsKCiAgICBpZiAodmFyLT50eXBlICE9IEFTTl9DT1VOVEVSKSB7CiAgICAgICAgaWYgKCFuZXRzbm1wX2RzX2dldF9ib29sZWFuKAogICAgICAgICAgICAgICAgTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9RVUlDS0VfUFJJTlQpKSB7CiAgICAgICAgICAgIHVfY2hhciAgICAgICAgICBzdHJbXSA9ICJXcm9uZyBUeXBlIChzaG91bGQgYmUgQ291bnRlcjMyKTogIjsKICAgICAgICAgICAgaWYgKCFzbm1wX3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsIHN0cikpCiAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHNwcmludF9yZWFsbG9jX2J5X3R5cGUoYnVmLCBidWZfbGVuLCBvdXRfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd19yZWFsbG9jLCB2YXIsIE5VTEwsIE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOwogICAgfQoKICAgIGlmICghbmV0c25tcF9kc19nZXRfYm9vbGVhbihORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX1FVSUNLX1BSSU5UKSkgewogICAgICAgIHVfY2hhciAgICAgICAgICBzdHJbXSA9ICJDb3VudGVyMzI6ICI7CiAgICAgICAgaWYgKCFzbm1wX3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsIHN0cikpIHsKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQogICAgfQogICAgc3ByaW50Zih0bXAsICIldSIsICh1bnNpZ25lZCBpbnQpKCp2YXItPnZhbC5pbnRlZ2VyICYgMHhmZmZmZmZmZikpOwogICAgaWYgKCFzbm1wX3N0cmNhdAogICAgICAgIChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsIChjb25zdCB1X2NoYXIgKikgdG1wKSkgewogICAgICAgIHJldHVybiAwOwogICAgfQogICAgaWYgKHVuaXRzKSB7CiAgICAgICAgcmV0dXJuIChzbm1wX3N0cmNhdAogICAgICAgICAgICAgICAgKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAoY29uc3QgdV9jaGFyICopICIgIikKICAgICAgICAgICAgICAgICYmIHNubXBfc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCB1X2NoYXIgKikgdW5pdHMpKTsKICAgIH0KICAgIHJldHVybiAxOwp9CgoKLyoqCiAqIFByaW50cyBhIG5ldHdvcmsgYWRkcmVzcyBpbnRvIGEgYnVmZmVyLgogKgogKiBJZiBhbGxvd19yZWFsbG9jIGlzIHRydWUgdGhlIGJ1ZmZlciB3aWxsIGJlIChyZSlhbGxvY2F0ZWQgdG8gZml0IGluIHRoZSAKICogbmVlZGVkIHNpemUuIChOb3RlOiAqYnVmIG1heSBjaGFuZ2UgZHVlIHRvIHRoaXMuKQogKiAKICogQHBhcmFtIGJ1ZiAgICAgIEFkZHJlc3Mgb2YgdGhlIGJ1ZmZlciB0byBwcmludCB0by4KICogQHBhcmFtIGJ1Zl9sZW4gIEFkZHJlc3MgdG8gYW4gaW50ZWdlciBjb250YWluaW5nIHRoZSBzaXplIG9mIGJ1Zi4KICogQHBhcmFtIG91dF9sZW4gIEluY3JlbWVudGVkIGJ5IHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBwcmludGVkLgogKiBAcGFyYW0gYWxsb3dfcmVhbGxvYyBpZiBub3QgemVybyByZWFsbG9jYXRlIHRoZSBidWZmZXIgdG8gZml0IHRoZSAKICogICAgICAgICAgICAgICAgICAgICAgbmVlZGVkIHNpemUuCiAqIEBwYXJhbSB2YXIgICAgICBUaGUgdmFyaWFibGUgdG8gZW5jb2RlLgogKiBAcGFyYW0gZW51bXMgICAgVGhlIGVudW1lcmF0aW9uIGZmIHRoaXMgdmFyaWFibGUgaXMgZW51bWVyYXRlZC4gbWF5IGJlIE5VTEwuCiAqIEBwYXJhbSBoaW50ICAgICBDb250ZW50cyBvZiB0aGUgRElTUExBWS1ISU5UIGNsYXVzZSBvZiB0aGUgTUlCLgogKiAgICAgICAgICAgICAgICAgU2VlIFJGQyAxOTAzIFNlY3Rpb24gMy4xIGZvciBkZXRhaWxzLiBtYXkgYmUgTlVMTC4KICogQHBhcmFtIHVuaXRzICAgIENvbnRlbnRzIG9mIHRoZSBVTklUUyBjbGF1c2Ugb2YgdGhlIE1JQi4gbWF5IGJlIE5VTEwuCiAqIAogKiBAcmV0dXJuIDEgb24gc3VjY2Vzcywgb3IgMCBvbiBmYWlsdXJlIChvdXQgb2YgbWVtb3J5LCBvciBidWZmZXIgdG8KICogICAgICAgICBzbWFsbCB3aGVuIG5vdCBhbGxvd2VkIHRvIHJlYWxsb2MuKQogKi8KaW50CnNwcmludF9yZWFsbG9jX25ldHdvcmthZGRyZXNzKHVfY2hhciAqKiBidWYsIHNpemVfdCAqIGJ1Zl9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAqIG91dF9sZW4sIGludCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXRzbm1wX3ZhcmlhYmxlX2xpc3QgKiB2YXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBlbnVtX2xpc3QgKmVudW1zLCBjb25zdCBjaGFyICpoaW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICp1bml0cykKewogICAgc2l6ZV90ICAgICAgICAgIGk7CgogICAgaWYgKHZhci0+dHlwZSAhPSBBU05fSVBBRERSRVNTKSB7CiAgICAgICAgaWYgKCFuZXRzbm1wX2RzX2dldF9ib29sZWFuKAogICAgICAgICAgICAgICAgTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9RVUlDS0VfUFJJTlQpKSB7CiAgICAgICAgICAgIHVfY2hhciAgICAgICAgICBzdHJbXSA9ICJXcm9uZyBUeXBlIChzaG91bGQgYmUgTmV0d29ya0FkZHJlc3MpOiAiOwogICAgICAgICAgICBpZiAoIXNubXBfc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgc3RyKSkKICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KICAgICAgICByZXR1cm4gc3ByaW50X3JlYWxsb2NfYnlfdHlwZShidWYsIGJ1Zl9sZW4sIG91dF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93X3JlYWxsb2MsIHZhciwgTlVMTCwgTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CiAgICB9CgogICAgaWYgKCFuZXRzbm1wX2RzX2dldF9ib29sZWFuKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfUVVJQ0tfUFJJTlQpKSB7CiAgICAgICAgdV9jaGFyICAgICAgICAgIHN0cltdID0gIk5ldHdvcmsgQWRkcmVzczogIjsKICAgICAgICBpZiAoIXNubXBfc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgc3RyKSkgewogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CiAgICB9CgogICAgd2hpbGUgKCgqb3V0X2xlbiArICh2YXItPnZhbF9sZW4gKiAzKSArIDIpID49ICpidWZfbGVuKSB7CiAgICAgICAgaWYgKCEoYWxsb3dfcmVhbGxvYyAmJiBzbm1wX3JlYWxsb2MoYnVmLCBidWZfbGVuKSkpIHsKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQogICAgfQoKICAgIGZvciAoaSA9IDA7IGkgPCB2YXItPnZhbF9sZW47IGkrKykgewogICAgICAgIHNwcmludGYoKGNoYXIgKikgKCpidWYgKyAqb3V0X2xlbiksICIlMDJYIiwgdmFyLT52YWwuc3RyaW5nW2ldKTsKICAgICAgICAqb3V0X2xlbiArPSAyOwogICAgICAgIGlmIChpIDwgdmFyLT52YWxfbGVuIC0gMSkgewogICAgICAgICAgICAqKCpidWYgKyAqb3V0X2xlbikgPSAnOic7CiAgICAgICAgICAgICgqb3V0X2xlbikrKzsKICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gMTsKfQoKCi8qKgogKiBQcmludHMgYW4gaXAtYWRkcmVzcyBpbnRvIGEgYnVmZmVyLgogKgogKiBJZiBhbGxvd19yZWFsbG9jIGlzIHRydWUgdGhlIGJ1ZmZlciB3aWxsIGJlIChyZSlhbGxvY2F0ZWQgdG8gZml0IGluIHRoZSAKICogbmVlZGVkIHNpemUuIChOb3RlOiAqYnVmIG1heSBjaGFuZ2UgZHVlIHRvIHRoaXMuKQogKiAKICogQHBhcmFtIGJ1ZiAgICAgIEFkZHJlc3Mgb2YgdGhlIGJ1ZmZlciB0byBwcmludCB0by4KICogQHBhcmFtIGJ1Zl9sZW4gIEFkZHJlc3MgdG8gYW4gaW50ZWdlciBjb250YWluaW5nIHRoZSBzaXplIG9mIGJ1Zi4KICogQHBhcmFtIG91dF9sZW4gIEluY3JlbWVudGVkIGJ5IHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBwcmludGVkLgogKiBAcGFyYW0gYWxsb3dfcmVhbGxvYyBpZiBub3QgemVybyByZWFsbG9jYXRlIHRoZSBidWZmZXIgdG8gZml0IHRoZSAKICogICAgICAgICAgICAgICAgICAgICAgbmVlZGVkIHNpemUuCiAqIEBwYXJhbSB2YXIgICAgICBUaGUgdmFyaWFibGUgdG8gZW5jb2RlLgogKiBAcGFyYW0gZW51bXMgICAgVGhlIGVudW1lcmF0aW9uIGZmIHRoaXMgdmFyaWFibGUgaXMgZW51bWVyYXRlZC4gbWF5IGJlIE5VTEwuCiAqIEBwYXJhbSBoaW50ICAgICBDb250ZW50cyBvZiB0aGUgRElTUExBWS1ISU5UIGNsYXVzZSBvZiB0aGUgTUlCLgogKiAgICAgICAgICAgICAgICAgU2VlIFJGQyAxOTAzIFNlY3Rpb24gMy4xIGZvciBkZXRhaWxzLiBtYXkgYmUgTlVMTC4KICogQHBhcmFtIHVuaXRzICAgIENvbnRlbnRzIG9mIHRoZSBVTklUUyBjbGF1c2Ugb2YgdGhlIE1JQi4gbWF5IGJlIE5VTEwuCiAqIAogKiBAcmV0dXJuIDEgb24gc3VjY2Vzcywgb3IgMCBvbiBmYWlsdXJlIChvdXQgb2YgbWVtb3J5LCBvciBidWZmZXIgdG8KICogICAgICAgICBzbWFsbCB3aGVuIG5vdCBhbGxvd2VkIHRvIHJlYWxsb2MuKQogKi8KaW50CnNwcmludF9yZWFsbG9jX2lwYWRkcmVzcyh1X2NoYXIgKiogYnVmLCBzaXplX3QgKiBidWZfbGVuLCBzaXplX3QgKiBvdXRfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXRzbm1wX3ZhcmlhYmxlX2xpc3QgKiB2YXIsCiAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgZW51bV9saXN0ICplbnVtcywKICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmhpbnQsIGNvbnN0IGNoYXIgKnVuaXRzKQp7CiAgICB1X2NoYXIgICAgICAgICAqaXAgPSB2YXItPnZhbC5zdHJpbmc7CgogICAgaWYgKHZhci0+dHlwZSAhPSBBU05fSVBBRERSRVNTKSB7CiAgICAgICAgaWYgKCFuZXRzbm1wX2RzX2dldF9ib29sZWFuKAogICAgICAgICAgICAgICAgTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9RVUlDS0VfUFJJTlQpKSB7CiAgICAgICAgICAgIHVfY2hhciAgICAgICAgICBzdHJbXSA9ICJXcm9uZyBUeXBlIChzaG91bGQgYmUgSXBBZGRyZXNzKTogIjsKICAgICAgICAgICAgaWYgKCFzbm1wX3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsIHN0cikpCiAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHNwcmludF9yZWFsbG9jX2J5X3R5cGUoYnVmLCBidWZfbGVuLCBvdXRfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd19yZWFsbG9jLCB2YXIsIE5VTEwsIE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOwogICAgfQoKICAgIGlmICghbmV0c25tcF9kc19nZXRfYm9vbGVhbihORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX1FVSUNLX1BSSU5UKSkgewogICAgICAgIHVfY2hhciAgICAgICAgICBzdHJbXSA9ICJJcEFkZHJlc3M6ICI7CiAgICAgICAgaWYgKCFzbm1wX3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsIHN0cikpIHsKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQogICAgfQogICAgd2hpbGUgKCgqb3V0X2xlbiArIDE3KSA+PSAqYnVmX2xlbikgewogICAgICAgIGlmICghKGFsbG93X3JlYWxsb2MgJiYgc25tcF9yZWFsbG9jKGJ1ZiwgYnVmX2xlbikpKSB7CiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KICAgIH0KICAgIGlmIChpcCkKICAgICAgICBzcHJpbnRmKChjaGFyICopICgqYnVmICsgKm91dF9sZW4pLCAiJWQuJWQuJWQuJWQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlwWzBdLCBpcFsxXSwgaXBbMl0sIGlwWzNdKTsKICAgICpvdXRfbGVuICs9IHN0cmxlbigoY2hhciAqKSAoKmJ1ZiArICpvdXRfbGVuKSk7CiAgICByZXR1cm4gMTsKfQoKCi8qKgogKiBQcmludHMgYSBudWxsIHZhbHVlIGludG8gYSBidWZmZXIuCiAqCiAqIElmIGFsbG93X3JlYWxsb2MgaXMgdHJ1ZSB0aGUgYnVmZmVyIHdpbGwgYmUgKHJlKWFsbG9jYXRlZCB0byBmaXQgaW4gdGhlIAogKiBuZWVkZWQgc2l6ZS4gKE5vdGU6ICpidWYgbWF5IGNoYW5nZSBkdWUgdG8gdGhpcy4pCiAqIAogKiBAcGFyYW0gYnVmICAgICAgQWRkcmVzcyBvZiB0aGUgYnVmZmVyIHRvIHByaW50IHRvLgogKiBAcGFyYW0gYnVmX2xlbiAgQWRkcmVzcyB0byBhbiBpbnRlZ2VyIGNvbnRhaW5pbmcgdGhlIHNpemUgb2YgYnVmLgogKiBAcGFyYW0gb3V0X2xlbiAgSW5jcmVtZW50ZWQgYnkgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHByaW50ZWQuCiAqIEBwYXJhbSBhbGxvd19yZWFsbG9jIGlmIG5vdCB6ZXJvIHJlYWxsb2NhdGUgdGhlIGJ1ZmZlciB0byBmaXQgdGhlIAogKiAgICAgICAgICAgICAgICAgICAgICBuZWVkZWQgc2l6ZS4KICogQHBhcmFtIHZhciAgICAgIFRoZSB2YXJpYWJsZSB0byBlbmNvZGUuCiAqIEBwYXJhbSBlbnVtcyAgICBUaGUgZW51bWVyYXRpb24gZmYgdGhpcyB2YXJpYWJsZSBpcyBlbnVtZXJhdGVkLiBtYXkgYmUgTlVMTC4KICogQHBhcmFtIGhpbnQgICAgIENvbnRlbnRzIG9mIHRoZSBESVNQTEFZLUhJTlQgY2xhdXNlIG9mIHRoZSBNSUIuCiAqICAgICAgICAgICAgICAgICBTZWUgUkZDIDE5MDMgU2VjdGlvbiAzLjEgZm9yIGRldGFpbHMuIG1heSBiZSBOVUxMLgogKiBAcGFyYW0gdW5pdHMgICAgQ29udGVudHMgb2YgdGhlIFVOSVRTIGNsYXVzZSBvZiB0aGUgTUlCLiBtYXkgYmUgTlVMTC4KICogCiAqIEByZXR1cm4gMSBvbiBzdWNjZXNzLCBvciAwIG9uIGZhaWx1cmUgKG91dCBvZiBtZW1vcnksIG9yIGJ1ZmZlciB0bwogKiAgICAgICAgIHNtYWxsIHdoZW4gbm90IGFsbG93ZWQgdG8gcmVhbGxvYy4pCiAqLwppbnQKc3ByaW50X3JlYWxsb2NfbnVsbCh1X2NoYXIgKiogYnVmLCBzaXplX3QgKiBidWZfbGVuLCBzaXplX3QgKiBvdXRfbGVuLAogICAgICAgICAgICAgICAgICAgIGludCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgIGNvbnN0IG5ldHNubXBfdmFyaWFibGVfbGlzdCAqIHZhciwKICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgZW51bV9saXN0ICplbnVtcywKICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpoaW50LCBjb25zdCBjaGFyICp1bml0cykKewogICAgaWYgKHZhci0+dHlwZSAhPSBBU05fTlVMTCkgewogICAgICAgIGlmICghbmV0c25tcF9kc19nZXRfYm9vbGVhbigKICAgICAgICAgICAgICAgIE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfUVVJQ0tFX1BSSU5UKSkgewogICAgICAgICAgICB1X2NoYXIgICAgICAgICAgc3RyW10gPSAiV3JvbmcgVHlwZSAoc2hvdWxkIGJlIE5VTEwpOiAiOwogICAgICAgICAgICBpZiAoIXNubXBfc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgc3RyKSkKICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KICAgICAgICByZXR1cm4gc3ByaW50X3JlYWxsb2NfYnlfdHlwZShidWYsIGJ1Zl9sZW4sIG91dF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93X3JlYWxsb2MsIHZhciwgTlVMTCwgTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CiAgICB9CgogICAgdV9jaGFyICAgICAgICAgIHN0cltdID0gIk5VTEwiOwogICAgcmV0dXJuIHNubXBfc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgc3RyKTsKfQoKCi8qKgogKiBQcmludHMgYSBiaXQgc3RyaW5nIGludG8gYSBidWZmZXIuCiAqCiAqIElmIGFsbG93X3JlYWxsb2MgaXMgdHJ1ZSB0aGUgYnVmZmVyIHdpbGwgYmUgKHJlKWFsbG9jYXRlZCB0byBmaXQgaW4gdGhlIAogKiBuZWVkZWQgc2l6ZS4gKE5vdGU6ICpidWYgbWF5IGNoYW5nZSBkdWUgdG8gdGhpcy4pCiAqIAogKiBAcGFyYW0gYnVmICAgICAgQWRkcmVzcyBvZiB0aGUgYnVmZmVyIHRvIHByaW50IHRvLgogKiBAcGFyYW0gYnVmX2xlbiAgQWRkcmVzcyB0byBhbiBpbnRlZ2VyIGNvbnRhaW5pbmcgdGhlIHNpemUgb2YgYnVmLgogKiBAcGFyYW0gb3V0X2xlbiAgSW5jcmVtZW50ZWQgYnkgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHByaW50ZWQuCiAqIEBwYXJhbSBhbGxvd19yZWFsbG9jIGlmIG5vdCB6ZXJvIHJlYWxsb2NhdGUgdGhlIGJ1ZmZlciB0byBmaXQgdGhlIAogKiAgICAgICAgICAgICAgICAgICAgICBuZWVkZWQgc2l6ZS4KICogQHBhcmFtIHZhciAgICAgIFRoZSB2YXJpYWJsZSB0byBlbmNvZGUuCiAqIEBwYXJhbSBlbnVtcyAgICBUaGUgZW51bWVyYXRpb24gZmYgdGhpcyB2YXJpYWJsZSBpcyBlbnVtZXJhdGVkLiBtYXkgYmUgTlVMTC4KICogQHBhcmFtIGhpbnQgICAgIENvbnRlbnRzIG9mIHRoZSBESVNQTEFZLUhJTlQgY2xhdXNlIG9mIHRoZSBNSUIuCiAqICAgICAgICAgICAgICAgICBTZWUgUkZDIDE5MDMgU2VjdGlvbiAzLjEgZm9yIGRldGFpbHMuIG1heSBiZSBOVUxMLgogKiBAcGFyYW0gdW5pdHMgICAgQ29udGVudHMgb2YgdGhlIFVOSVRTIGNsYXVzZSBvZiB0aGUgTUlCLiBtYXkgYmUgTlVMTC4KICogCiAqIEByZXR1cm4gMSBvbiBzdWNjZXNzLCBvciAwIG9uIGZhaWx1cmUgKG91dCBvZiBtZW1vcnksIG9yIGJ1ZmZlciB0bwogKiAgICAgICAgIHNtYWxsIHdoZW4gbm90IGFsbG93ZWQgdG8gcmVhbGxvYy4pCiAqLwppbnQKc3ByaW50X3JlYWxsb2NfYml0c3RyaW5nKHVfY2hhciAqKiBidWYsIHNpemVfdCAqIGJ1Zl9sZW4sIHNpemVfdCAqIG91dF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5ldHNubXBfdmFyaWFibGVfbGlzdCAqIHZhciwKICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBlbnVtX2xpc3QgKmVudW1zLAogICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqaGludCwgY29uc3QgY2hhciAqdW5pdHMpCnsKICAgIGludCAgICAgICAgICAgICBsZW4sIGJpdDsKICAgIHVfY2hhciAgICAgICAgICpjcDsKICAgIGNoYXIgICAgICAgICAgICplbnVtX3N0cmluZzsKCiAgICBpZiAodmFyLT50eXBlICE9IEFTTl9CSVRfU1RSICYmIHZhci0+dHlwZSAhPSBBU05fT0NURVRfU1RSKSB7CiAgICAgICAgaWYgKCFuZXRzbm1wX2RzX2dldF9ib29sZWFuKAogICAgICAgICAgICAgICAgTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9RVUlDS0VfUFJJTlQpKSB7CiAgICAgICAgICAgIHVfY2hhciAgICAgICAgICBzdHJbXSA9ICJXcm9uZyBUeXBlIChzaG91bGQgYmUgQklUUyk6ICI7CiAgICAgICAgICAgIGlmICghc25tcF9zdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCBzdHIpKQogICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQogICAgICAgIHJldHVybiBzcHJpbnRfcmVhbGxvY19ieV90eXBlKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dfcmVhbGxvYywgdmFyLCBOVUxMLCBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKICAgIH0KCiAgICBpZiAobmV0c25tcF9kc19nZXRfYm9vbGVhbihORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX1FVSUNLX1BSSU5UKSkgewogICAgICAgIHVfY2hhciAgICAgICAgICBzdHJbXSA9ICJcIiI7CiAgICAgICAgaWYgKCFzbm1wX3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsIHN0cikpIHsKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgICB1X2NoYXIgICAgICAgICAgc3RyW10gPSAiQklUUzogIjsKICAgICAgICBpZiAoIXNubXBfc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgc3RyKSkgewogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CiAgICB9CiAgICBpZiAoIXNwcmludF9yZWFsbG9jX2hleHN0cmluZyhidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXItPnZhbC5iaXRzdHJpbmcsIHZhci0+dmFsX2xlbikpIHsKICAgICAgICByZXR1cm4gMDsKICAgIH0KCiAgICBpZiAobmV0c25tcF9kc19nZXRfYm9vbGVhbihORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX1FVSUNLX1BSSU5UKSkgewogICAgICAgIHVfY2hhciAgICAgICAgICBzdHJbXSA9ICJcIiI7CiAgICAgICAgaWYgKCFzbm1wX3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsIHN0cikpIHsKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgICBjcCA9IHZhci0+dmFsLmJpdHN0cmluZzsKICAgICAgICBmb3IgKGxlbiA9IDA7IGxlbiA8IChpbnQpIHZhci0+dmFsX2xlbjsgbGVuKyspIHsKICAgICAgICAgICAgZm9yIChiaXQgPSAwOyBiaXQgPCA4OyBiaXQrKykgewogICAgICAgICAgICAgICAgaWYgKCpjcCAmICgweDgwID4+IGJpdCkpIHsKICAgICAgICAgICAgICAgICAgICBlbnVtX3N0cmluZyA9IE5VTEw7CiAgICAgICAgICAgICAgICAgICAgZm9yICg7IGVudW1zOyBlbnVtcyA9IGVudW1zLT5uZXh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbnVtcy0+dmFsdWUgPT0gKGxlbiAqIDgpICsgYml0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtX3N0cmluZyA9IGVudW1zLT5sYWJlbDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmIChlbnVtX3N0cmluZyA9PSBOVUxMIHx8CiAgICAgICAgICAgICAgICAgICAgICAgIG5ldHNubXBfZHNfZ2V0X2Jvb2xlYW4oTkVUU05NUF9EU19MSUJSQVJZX0lELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBORVRTTk1QX0RTX0xJQl9QUklOVF9OVU1FUklDX0VOVU0pKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgICAgICAgICAgICBzdHJbMzJdOwogICAgICAgICAgICAgICAgICAgICAgICBzcHJpbnRmKHN0ciwgIiVkICIsIChsZW4gKiA4KSArIGJpdCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc25tcF9zdHJjYXQKICAgICAgICAgICAgICAgICAgICAgICAgICAgIChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IHVfY2hhciAqKSBzdHIpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgICAgICAgICAgICBzdHJbMzJdOwogICAgICAgICAgICAgICAgICAgICAgICBzcHJpbnRmKHN0ciwgIiglZCkgIiwgKGxlbiAqIDgpICsgYml0KTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFzbm1wX3N0cmNhdAogICAgICAgICAgICAgICAgICAgICAgICAgICAgKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgdV9jaGFyICopIGVudW1fc3RyaW5nKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFzbm1wX3N0cmNhdAogICAgICAgICAgICAgICAgICAgICAgICAgICAgKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgdV9jaGFyICopIHN0cikpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGNwKys7CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIDE7Cn0KCmludApzcHJpbnRfcmVhbGxvY19uc2FwYWRkcmVzcyh1X2NoYXIgKiogYnVmLCBzaXplX3QgKiBidWZfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgKiBvdXRfbGVuLCBpbnQgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV0c25tcF92YXJpYWJsZV9saXN0ICogdmFyLAogICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgZW51bV9saXN0ICplbnVtcywgY29uc3QgY2hhciAqaGludCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqdW5pdHMpCnsKICAgIGlmICh2YXItPnR5cGUgIT0gQVNOX05TQVApIHsKICAgICAgICBpZiAoIW5ldHNubXBfZHNfZ2V0X2Jvb2xlYW4oCiAgICAgICAgICAgICAgICBORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX1FVSUNLRV9QUklOVCkpIHsKICAgICAgICAgICAgdV9jaGFyICAgICAgICAgIHN0cltdID0gIldyb25nIFR5cGUgKHNob3VsZCBiZSBOc2FwQWRkcmVzcyk6ICI7CiAgICAgICAgICAgIGlmICghc25tcF9zdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCBzdHIpKQogICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQogICAgICAgIHJldHVybiBzcHJpbnRfcmVhbGxvY19ieV90eXBlKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dfcmVhbGxvYywgdmFyLCBOVUxMLCBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKICAgIH0KCiAgICBpZiAoIW5ldHNubXBfZHNfZ2V0X2Jvb2xlYW4oTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9RVUlDS19QUklOVCkpIHsKICAgICAgICB1X2NoYXIgICAgICAgICAgc3RyW10gPSAiTnNhcEFkZHJlc3M6ICI7CiAgICAgICAgaWYgKCFzbm1wX3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsIHN0cikpIHsKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiBzcHJpbnRfcmVhbGxvY19oZXhzdHJpbmcoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXItPnZhbC5zdHJpbmcsIHZhci0+dmFsX2xlbik7Cn0KCgovKioKICogRmFsbGJhY2sgcm91dGluZSBmb3IgYSBiYWQgdHlwZSwgcHJpbnRzICJWYXJpYWJsZSBoYXMgYmFkIHR5cGUiIGludG8gYSBidWZmZXIuCiAqCiAqIElmIGFsbG93X3JlYWxsb2MgaXMgdHJ1ZSB0aGUgYnVmZmVyIHdpbGwgYmUgKHJlKWFsbG9jYXRlZCB0byBmaXQgaW4gdGhlIAogKiBuZWVkZWQgc2l6ZS4gKE5vdGU6ICpidWYgbWF5IGNoYW5nZSBkdWUgdG8gdGhpcy4pCiAqIAogKiBAcGFyYW0gYnVmICAgICAgQWRkcmVzcyBvZiB0aGUgYnVmZmVyIHRvIHByaW50IHRvLgogKiBAcGFyYW0gYnVmX2xlbiAgQWRkcmVzcyB0byBhbiBpbnRlZ2VyIGNvbnRhaW5pbmcgdGhlIHNpemUgb2YgYnVmLgogKiBAcGFyYW0gb3V0X2xlbiAgSW5jcmVtZW50ZWQgYnkgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHByaW50ZWQuCiAqIEBwYXJhbSBhbGxvd19yZWFsbG9jIGlmIG5vdCB6ZXJvIHJlYWxsb2NhdGUgdGhlIGJ1ZmZlciB0byBmaXQgdGhlIAogKiAgICAgICAgICAgICAgICAgICAgICBuZWVkZWQgc2l6ZS4KICogQHBhcmFtIHZhciAgICAgIFRoZSB2YXJpYWJsZSB0byBlbmNvZGUuCiAqIEBwYXJhbSBlbnVtcyAgICBUaGUgZW51bWVyYXRpb24gZmYgdGhpcyB2YXJpYWJsZSBpcyBlbnVtZXJhdGVkLiBtYXkgYmUgTlVMTC4KICogQHBhcmFtIGhpbnQgICAgIENvbnRlbnRzIG9mIHRoZSBESVNQTEFZLUhJTlQgY2xhdXNlIG9mIHRoZSBNSUIuCiAqICAgICAgICAgICAgICAgICBTZWUgUkZDIDE5MDMgU2VjdGlvbiAzLjEgZm9yIGRldGFpbHMuIG1heSBiZSBOVUxMLgogKiBAcGFyYW0gdW5pdHMgICAgQ29udGVudHMgb2YgdGhlIFVOSVRTIGNsYXVzZSBvZiB0aGUgTUlCLiBtYXkgYmUgTlVMTC4KICogCiAqIEByZXR1cm4gMSBvbiBzdWNjZXNzLCBvciAwIG9uIGZhaWx1cmUgKG91dCBvZiBtZW1vcnksIG9yIGJ1ZmZlciB0bwogKiAgICAgICAgIHNtYWxsIHdoZW4gbm90IGFsbG93ZWQgdG8gcmVhbGxvYy4pCiAqLwppbnQKc3ByaW50X3JlYWxsb2NfYmFkdHlwZSh1X2NoYXIgKiogYnVmLCBzaXplX3QgKiBidWZfbGVuLCBzaXplX3QgKiBvdXRfbGVuLAogICAgICAgICAgICAgICAgICAgICAgIGludCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5ldHNubXBfdmFyaWFibGVfbGlzdCAqIHZhciwKICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgZW51bV9saXN0ICplbnVtcywKICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpoaW50LCBjb25zdCBjaGFyICp1bml0cykKewogICAgdV9jaGFyICAgICAgICAgIHN0cltdID0gIlZhcmlhYmxlIGhhcyBiYWQgdHlwZSI7CgogICAgcmV0dXJuIHNubXBfc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgc3RyKTsKfQoKCgovKioKICogVW5pdmVyc2FsIHByaW50IHJvdXRpbmUsIHByaW50cyBhIHZhcmlhYmxlIGludG8gYSBidWZmZXIgYWNjb3JkaW5nIHRvIHRoZSB2YXJpYWJsZSAKICogdHlwZS4KICoKICogSWYgYWxsb3dfcmVhbGxvYyBpcyB0cnVlIHRoZSBidWZmZXIgd2lsbCBiZSAocmUpYWxsb2NhdGVkIHRvIGZpdCBpbiB0aGUgCiAqIG5lZWRlZCBzaXplLiAoTm90ZTogKmJ1ZiBtYXkgY2hhbmdlIGR1ZSB0byB0aGlzLikKICogCiAqIEBwYXJhbSBidWYgICAgICBBZGRyZXNzIG9mIHRoZSBidWZmZXIgdG8gcHJpbnQgdG8uCiAqIEBwYXJhbSBidWZfbGVuICBBZGRyZXNzIHRvIGFuIGludGVnZXIgY29udGFpbmluZyB0aGUgc2l6ZSBvZiBidWYuCiAqIEBwYXJhbSBvdXRfbGVuICBJbmNyZW1lbnRlZCBieSB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgcHJpbnRlZC4KICogQHBhcmFtIGFsbG93X3JlYWxsb2MgaWYgbm90IHplcm8gcmVhbGxvY2F0ZSB0aGUgYnVmZmVyIHRvIGZpdCB0aGUgCiAqICAgICAgICAgICAgICAgICAgICAgIG5lZWRlZCBzaXplLgogKiBAcGFyYW0gdmFyICAgICAgVGhlIHZhcmlhYmxlIHRvIGVuY29kZS4KICogQHBhcmFtIGVudW1zICAgIFRoZSBlbnVtZXJhdGlvbiBmZiB0aGlzIHZhcmlhYmxlIGlzIGVudW1lcmF0ZWQuIG1heSBiZSBOVUxMLgogKiBAcGFyYW0gaGludCAgICAgQ29udGVudHMgb2YgdGhlIERJU1BMQVktSElOVCBjbGF1c2Ugb2YgdGhlIE1JQi4KICogICAgICAgICAgICAgICAgIFNlZSBSRkMgMTkwMyBTZWN0aW9uIDMuMSBmb3IgZGV0YWlscy4gbWF5IGJlIE5VTEwuCiAqIEBwYXJhbSB1bml0cyAgICBDb250ZW50cyBvZiB0aGUgVU5JVFMgY2xhdXNlIG9mIHRoZSBNSUIuIG1heSBiZSBOVUxMLgogKiAKICogQHJldHVybiAxIG9uIHN1Y2Nlc3MsIG9yIDAgb24gZmFpbHVyZSAob3V0IG9mIG1lbW9yeSwgb3IgYnVmZmVyIHRvCiAqICAgICAgICAgc21hbGwgd2hlbiBub3QgYWxsb3dlZCB0byByZWFsbG9jLikKICovCmludApzcHJpbnRfcmVhbGxvY19ieV90eXBlKHVfY2hhciAqKiBidWYsIHNpemVfdCAqIGJ1Zl9sZW4sIHNpemVfdCAqIG91dF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgaW50IGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV0c25tcF92YXJpYWJsZV9saXN0ICogdmFyLAogICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBlbnVtX2xpc3QgKmVudW1zLAogICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmhpbnQsIGNvbnN0IGNoYXIgKnVuaXRzKQp7CiAgICBERUJVR01TR1RMKCgib3V0cHV0IiwgInNwcmludF9ieV90eXBlLCB0eXBlICVkXG4iLCB2YXItPnR5cGUpKTsKCiAgICBzd2l0Y2ggKHZhci0+dHlwZSkgewogICAgY2FzZSBBU05fSU5URUdFUjoKICAgICAgICByZXR1cm4gc3ByaW50X3JlYWxsb2NfaW50ZWdlcihidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyLCBlbnVtcywgaGludCwgdW5pdHMpOwogICAgY2FzZSBBU05fT0NURVRfU1RSOgogICAgICAgIHJldHVybiBzcHJpbnRfcmVhbGxvY19vY3RldF9zdHJpbmcoYnVmLCBidWZfbGVuLCBvdXRfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dfcmVhbGxvYywgdmFyLCBlbnVtcywgaGludCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaXRzKTsKICAgIGNhc2UgQVNOX0JJVF9TVFI6CiAgICAgICAgcmV0dXJuIHNwcmludF9yZWFsbG9jX2JpdHN0cmluZyhidWYsIGJ1Zl9sZW4sIG91dF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd19yZWFsbG9jLCB2YXIsIGVudW1zLCBoaW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pdHMpOwogICAgY2FzZSBBU05fT1BBUVVFOgogICAgICAgIHJldHVybiBzcHJpbnRfcmVhbGxvY19vcGFxdWUoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyLCBlbnVtcywgaGludCwgdW5pdHMpOwogICAgY2FzZSBBU05fT0JKRUNUX0lEOgogICAgICAgIHJldHVybiBzcHJpbnRfcmVhbGxvY19vYmplY3RfaWRlbnRpZmllcihidWYsIGJ1Zl9sZW4sIG91dF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93X3JlYWxsb2MsIHZhciwgZW51bXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhpbnQsIHVuaXRzKTsKICAgIGNhc2UgQVNOX1RJTUVUSUNLUzoKICAgICAgICByZXR1cm4gc3ByaW50X3JlYWxsb2NfdGltZXRpY2tzKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93X3JlYWxsb2MsIHZhciwgZW51bXMsIGhpbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bml0cyk7CiAgICBjYXNlIEFTTl9HQVVHRToKICAgICAgICByZXR1cm4gc3ByaW50X3JlYWxsb2NfZ2F1Z2UoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIsIGVudW1zLCBoaW50LCB1bml0cyk7CiAgICBjYXNlIEFTTl9DT1VOVEVSOgogICAgICAgIHJldHVybiBzcHJpbnRfcmVhbGxvY19jb3VudGVyKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIsIGVudW1zLCBoaW50LCB1bml0cyk7CiAgICBjYXNlIEFTTl9JUEFERFJFU1M6CiAgICAgICAgcmV0dXJuIHNwcmludF9yZWFsbG9jX2lwYWRkcmVzcyhidWYsIGJ1Zl9sZW4sIG91dF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd19yZWFsbG9jLCB2YXIsIGVudW1zLCBoaW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pdHMpOwogICAgY2FzZSBBU05fTlVMTDoKICAgICAgICByZXR1cm4gc3ByaW50X3JlYWxsb2NfbnVsbChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyLCBlbnVtcywgaGludCwgdW5pdHMpOwogICAgY2FzZSBBU05fVUlOVEVHRVI6CiAgICAgICAgcmV0dXJuIHNwcmludF9yZWFsbG9jX3VpbnRlZ2VyKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dfcmVhbGxvYywgdmFyLCBlbnVtcywgaGludCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pdHMpOwogICAgY2FzZSBBU05fQ09VTlRFUjY0OgojaWZkZWYgTkVUU05NUF9XSVRIX09QQVFVRV9TUEVDSUFMX1RZUEVTCiAgICBjYXNlIEFTTl9PUEFRVUVfVTY0OgogICAgY2FzZSBBU05fT1BBUVVFX0k2NDoKICAgIGNhc2UgQVNOX09QQVFVRV9DT1VOVEVSNjQ6CiNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTkVUU05NUF9XSVRIX09QQVFVRV9TUEVDSUFMX1RZUEVTICovCiAgICAgICAgcmV0dXJuIHNwcmludF9yZWFsbG9jX2NvdW50ZXI2NChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd19yZWFsbG9jLCB2YXIsIGVudW1zLCBoaW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pdHMpOwojaWZkZWYgTkVUU05NUF9XSVRIX09QQVFVRV9TUEVDSUFMX1RZUEVTCiAgICBjYXNlIEFTTl9PUEFRVUVfRkxPQVQ6CiAgICAgICAgcmV0dXJuIHNwcmludF9yZWFsbG9jX2Zsb2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyLCBlbnVtcywgaGludCwgdW5pdHMpOwogICAgY2FzZSBBU05fT1BBUVVFX0RPVUJMRToKICAgICAgICByZXR1cm4gc3ByaW50X3JlYWxsb2NfZG91YmxlKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciwgZW51bXMsIGhpbnQsIHVuaXRzKTsKI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBORVRTTk1QX1dJVEhfT1BBUVVFX1NQRUNJQUxfVFlQRVMgKi8KICAgIGRlZmF1bHQ6CiAgICAgICAgREVCVUdNU0dUTCgoInNwcmludF9ieV90eXBlIiwgImJhZCB0eXBlOiAlZFxuIiwgdmFyLT50eXBlKSk7CiAgICAgICAgcmV0dXJuIHNwcmludF9yZWFsbG9jX2JhZHR5cGUoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciwgZW51bXMsIGhpbnQsIHVuaXRzKTsKICAgIH0KfQoKCiNpZm5kZWYgTkVUU05NUF9ESVNBQkxFX01JQl9MT0FESU5HCi8qKgogKiBSZXRyaWV2ZXMgdGhlIHRyZWUgaGVhZC4KICoKICogQHJldHVybiB0aGUgdHJlZSBoZWFkLgogKi8Kc3RydWN0IHRyZWUgICAgKgpnZXRfdHJlZV9oZWFkKHZvaWQpCnsKICAgIHJldHVybiAodHJlZV9oZWFkKTsKfQoKc3RhdGljIGNoYXIgICAgKmNvbmZtaWJkaXIgPSBOVUxMOwpzdGF0aWMgY2hhciAgICAqY29uZm1pYnMgPSBOVUxMOwoKc3RhdGljIHZvaWQKaGFuZGxlX21pYmRpcnNfY29uZihjb25zdCBjaGFyICp0b2tlbiwgY2hhciAqbGluZSkKewogICAgY2hhciAgICAgICAgICAgKmN0bXA7CgogICAgaWYgKGNvbmZtaWJkaXIpIHsKICAgICAgICBpZiAoKCpsaW5lID09ICcrJykgfHwgKCpsaW5lID09ICctJykpIHsKICAgICAgICAgICAgY3RtcCA9IChjaGFyICopIG1hbGxvYyhzdHJsZW4oY29uZm1pYmRpcikgKyBzdHJsZW4obGluZSkgKyAyKTsKICAgICAgICAgICAgaWYgKCFjdG1wKSB7CiAgICAgICAgICAgICAgICBERUJVR01TR1RMKCgicmVhZF9jb25maWc6aW5pdG1pYiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWliZGlyIGNvbmYgbWFsbG9jIGZhaWxlZCIpKTsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZigqbGluZSsrID09ICcrJykKICAgICAgICAgICAgICAgIHNwcmludGYoY3RtcCwgIiVzJWMlcyIsIGNvbmZtaWJkaXIsIEVOVl9TRVBBUkFUT1JfQ0hBUiwgbGluZSk7CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHNwcmludGYoY3RtcCwgIiVzJWMlcyIsIGxpbmUsIEVOVl9TRVBBUkFUT1JfQ0hBUiwgY29uZm1pYmRpcik7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgY3RtcCA9IHN0cmR1cChsaW5lKTsKICAgICAgICAgICAgaWYgKCFjdG1wKSB7CiAgICAgICAgICAgICAgICBERUJVR01TR1RMKCgicmVhZF9jb25maWc6aW5pdG1pYiIsICJtaWJzIGNvbmYgbWFsbG9jIGZhaWxlZCIpKTsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBTTk1QX0ZSRUUoY29uZm1pYmRpcik7CiAgICB9IGVsc2UgewogICAgICAgIGN0bXAgPSBzdHJkdXAobGluZSk7CiAgICAgICAgaWYgKCFjdG1wKSB7CiAgICAgICAgICAgIERFQlVHTVNHVEwoKCJyZWFkX2NvbmZpZzppbml0bWliIiwgIm1pYnMgY29uZiBtYWxsb2MgZmFpbGVkIikpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQogICAgY29uZm1pYmRpciA9IGN0bXA7CiAgICBERUJVR01TR1RMKCgicmVhZF9jb25maWc6aW5pdG1pYiIsICJ1c2luZyBtaWJkaXJzOiAlc1xuIiwgY29uZm1pYmRpcikpOwp9CgpzdGF0aWMgdm9pZApoYW5kbGVfbWlic19jb25mKGNvbnN0IGNoYXIgKnRva2VuLCBjaGFyICpsaW5lKQp7CiAgICBjaGFyICAgICAgICAgICAqY3RtcDsKCiAgICBpZiAoY29uZm1pYnMpIHsKICAgICAgICBpZiAoKCpsaW5lID09ICcrJykgfHwgKCpsaW5lID09ICctJykpIHsKICAgICAgICAgICAgY3RtcCA9IChjaGFyICopIG1hbGxvYyhzdHJsZW4oY29uZm1pYnMpICsgc3RybGVuKGxpbmUpICsgMik7CiAgICAgICAgICAgIGlmICghY3RtcCkgewogICAgICAgICAgICAgICAgREVCVUdNU0dUTCgoInJlYWRfY29uZmlnOmluaXRtaWIiLCAibWlicyBjb25mIG1hbGxvYyBmYWlsZWQiKSk7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYoKmxpbmUrKyA9PSAnKycpCiAgICAgICAgICAgICAgICBzcHJpbnRmKGN0bXAsICIlcyVjJXMiLCBjb25mbWlicywgRU5WX1NFUEFSQVRPUl9DSEFSLCBsaW5lKTsKICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgc3ByaW50ZihjdG1wLCAiJXMlYyVzIiwgbGluZSwgRU5WX1NFUEFSQVRPUl9DSEFSLCBjb25mbWliZGlyKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBjdG1wID0gc3RyZHVwKGxpbmUpOwogICAgICAgICAgICBpZiAoIWN0bXApIHsKICAgICAgICAgICAgICAgIERFQlVHTVNHVEwoKCJyZWFkX2NvbmZpZzppbml0bWliIiwgIm1pYnMgY29uZiBtYWxsb2MgZmFpbGVkIikpOwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIFNOTVBfRlJFRShjb25mbWlicyk7CiAgICB9IGVsc2UgewogICAgICAgIGN0bXAgPSBzdHJkdXAobGluZSk7CiAgICAgICAgaWYgKCFjdG1wKSB7CiAgICAgICAgICAgIERFQlVHTVNHVEwoKCJyZWFkX2NvbmZpZzppbml0bWliIiwgIm1pYnMgY29uZiBtYWxsb2MgZmFpbGVkIikpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQogICAgY29uZm1pYnMgPSBjdG1wOwogICAgREVCVUdNU0dUTCgoInJlYWRfY29uZmlnOmluaXRtaWIiLCAidXNpbmcgbWliczogJXNcbiIsIGNvbmZtaWJzKSk7Cn0KCgpzdGF0aWMgdm9pZApoYW5kbGVfbWliZmlsZV9jb25mKGNvbnN0IGNoYXIgKnRva2VuLCBjaGFyICpsaW5lKQp7CiAgICBERUJVR01TR1RMKCgicmVhZF9jb25maWc6aW5pdG1pYiIsICJyZWFkaW5nIG1pYmZpbGU6ICVzXG4iLCBsaW5lKSk7CiAgICByZWFkX21pYihsaW5lKTsKfQojZW5kaWYKCnN0YXRpYyB2b2lkCmhhbmRsZV9wcmludF9udW1lcmljKGNvbnN0IGNoYXIgKnRva2VuLCBjaGFyICpsaW5lKQp7CiAgICBjb25zdCBjaGFyICp2YWx1ZTsKICAgIGNoYXIgICAgICAgKnN0OwoKICAgIHZhbHVlID0gc3RydG9rX3IobGluZSwgIiBcdFxuIiwgJnN0KTsKICAgIGlmICh2YWx1ZSAmJiAoCgkgICAgKHN0cmNhc2VjbXAodmFsdWUsICJ5ZXMiKSAgPT0gMCkgfHwgCgkgICAgKHN0cmNhc2VjbXAodmFsdWUsICJ0cnVlIikgPT0gMCkgfHwKCSAgICAoKnZhbHVlID09ICcxJykgKSkgewoKICAgICAgICBuZXRzbm1wX2RzX3NldF9pbnQoTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9PSURfT1VUUFVUX0ZPUk1BVCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBORVRTTk1QX09JRF9PVVRQVVRfTlVNRVJJQyk7CiAgICB9Cn0KCmNoYXIgICAgICAgICAgICoKc25tcF9vdXRfdG9nZ2xlX29wdGlvbnMoY2hhciAqb3B0aW9ucykKewogICAgd2hpbGUgKCpvcHRpb25zKSB7CiAgICAgICAgc3dpdGNoICgqb3B0aW9ucysrKSB7CiAgICAgICAgY2FzZSAnMCc6CiAgICAgICAgICAgIG5ldHNubXBfZHNfdG9nZ2xlX2Jvb2xlYW4oTkVUU05NUF9EU19MSUJSQVJZX0lELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5FVFNOTVBfRFNfTElCXzJESUdJVF9IRVhfT1VUUFVUKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAnYSc6CiAgICAgICAgICAgIG5ldHNubXBfZHNfc2V0X2ludChORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX1NUUklOR19PVVRQVVRfRk9STUFULAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBORVRTTk1QX1NUUklOR19PVVRQVVRfQVNDSUkpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICdiJzoKICAgICAgICAgICAgbmV0c25tcF9kc190b2dnbGVfYm9vbGVhbihORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX0RPTlRfQlJFQUtET1dOX09JRFMpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICdlJzoKICAgICAgICAgICAgbmV0c25tcF9kc190b2dnbGVfYm9vbGVhbihORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX1BSSU5UX05VTUVSSUNfRU5VTSk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgJ0UnOgogICAgICAgICAgICBuZXRzbm1wX2RzX3RvZ2dsZV9ib29sZWFuKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfRVNDQVBFX1FVT1RFUyk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgJ2YnOgogICAgICAgICAgICBuZXRzbm1wX2RzX3NldF9pbnQoTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9PSURfT1VUUFVUX0ZPUk1BVCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkVUU05NUF9PSURfT1VUUFVUX0ZVTEwpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICduJzoKICAgICAgICAgICAgbmV0c25tcF9kc19zZXRfaW50KE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfT0lEX09VVFBVVF9GT1JNQVQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5FVFNOTVBfT0lEX09VVFBVVF9OVU1FUklDKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAncSc6CiAgICAgICAgICAgIG5ldHNubXBfZHNfdG9nZ2xlX2Jvb2xlYW4oTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9RVUlDS19QUklOVCk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgJ1EnOgogICAgICAgICAgICBuZXRzbm1wX2RzX3NldF9ib29sZWFuKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfUVVJQ0tFX1BSSU5ULCAxKTsKICAgICAgICAgICAgbmV0c25tcF9kc190b2dnbGVfYm9vbGVhbihORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX1FVSUNLX1BSSU5UKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAncyc6CiAgICAgICAgICAgIG5ldHNubXBfZHNfc2V0X2ludChORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX09JRF9PVVRQVVRfRk9STUFULAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBORVRTTk1QX09JRF9PVVRQVVRfU1VGRklYKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAnUyc6CiAgICAgICAgICAgIG5ldHNubXBfZHNfc2V0X2ludChORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX09JRF9PVVRQVVRfRk9STUFULAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBORVRTTk1QX09JRF9PVVRQVVRfTU9EVUxFKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAndCc6CiAgICAgICAgICAgIG5ldHNubXBfZHNfdG9nZ2xlX2Jvb2xlYW4oTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9OVU1FUklDX1RJTUVUSUNLUyk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgJ1QnOgogICAgICAgICAgICBuZXRzbm1wX2RzX3RvZ2dsZV9ib29sZWFuKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfUFJJTlRfSEVYX1RFWFQpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICd1JzoKICAgICAgICAgICAgbmV0c25tcF9kc19zZXRfaW50KE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfT0lEX09VVFBVVF9GT1JNQVQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5FVFNOTVBfT0lEX09VVFBVVF9VQ0QpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICdVJzoKICAgICAgICAgICAgbmV0c25tcF9kc190b2dnbGVfYm9vbGVhbihORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX0RPTlRfUFJJTlRfVU5JVFMpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICd2JzoKICAgICAgICAgICAgbmV0c25tcF9kc190b2dnbGVfYm9vbGVhbihORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX1BSSU5UX0JBUkVfVkFMVUUpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICd4JzoKICAgICAgICAgICAgbmV0c25tcF9kc19zZXRfaW50KE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfU1RSSU5HX09VVFBVVF9GT1JNQVQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5FVFNOTVBfU1RSSU5HX09VVFBVVF9IRVgpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICdYJzoKICAgICAgICAgICAgbmV0c25tcF9kc190b2dnbGVfYm9vbGVhbihORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX0VYVEVOREVEX0lOREVYKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgcmV0dXJuIG9wdGlvbnMgLSAxOwogICAgICAgIH0KICAgIH0KICAgIHJldHVybiBOVUxMOwp9Cgp2b2lkCnNubXBfb3V0X3RvZ2dsZV9vcHRpb25zX3VzYWdlKGNvbnN0IGNoYXIgKmxlYWQsIEZJTEUgKiBvdXRmKQp7CiAgICBmcHJpbnRmKG91dGYsICIlczA6ICBwcmludCBsZWFkaW5nIDAgZm9yIHNpbmdsZS1kaWdpdCBoZXggY2hhcmFjdGVyc1xuIiwgbGVhZCk7CiAgICBmcHJpbnRmKG91dGYsICIlc2E6ICBwcmludCBhbGwgc3RyaW5ncyBpbiBhc2NpaSBmb3JtYXRcbiIsIGxlYWQpOwogICAgZnByaW50ZihvdXRmLCAiJXNiOiAgZG8gbm90IGJyZWFrIE9JRCBpbmRleGVzIGRvd25cbiIsIGxlYWQpOwogICAgZnByaW50ZihvdXRmLCAiJXNlOiAgcHJpbnQgZW51bXMgbnVtZXJpY2FsbHlcbiIsIGxlYWQpOwogICAgZnByaW50ZihvdXRmLCAiJXNFOiAgZXNjYXBlIHF1b3RlcyBpbiBzdHJpbmcgaW5kaWNlc1xuIiwgbGVhZCk7CiAgICBmcHJpbnRmKG91dGYsICIlc2Y6ICBwcmludCBmdWxsIE9JRHMgb24gb3V0cHV0XG4iLCBsZWFkKTsKICAgIGZwcmludGYob3V0ZiwgIiVzbjogIHByaW50IE9JRHMgbnVtZXJpY2FsbHlcbiIsIGxlYWQpOwogICAgZnByaW50ZihvdXRmLCAiJXNxOiAgcXVpY2sgcHJpbnQgZm9yIGVhc2llciBwYXJzaW5nXG4iLCBsZWFkKTsKICAgIGZwcmludGYob3V0ZiwgIiVzUTogIHF1aWNrIHByaW50IHdpdGggZXF1YWwtc2lnbnNcbiIsIGxlYWQpOyAgICAvKiBAQEpEVyAqLwogICAgZnByaW50ZihvdXRmLCAiJXNzOiAgcHJpbnQgb25seSBsYXN0IHN5bWJvbGljIGVsZW1lbnQgb2YgT0lEXG4iLCBsZWFkKTsKICAgIGZwcmludGYob3V0ZiwgIiVzUzogIHByaW50IE1JQiBtb2R1bGUtaWQgcGx1cyBsYXN0IGVsZW1lbnRcbiIsIGxlYWQpOwogICAgZnByaW50ZihvdXRmLCAiJXN0OiAgcHJpbnQgdGltZXRpY2tzIHVucGFyc2VkIGFzIG51bWVyaWMgaW50ZWdlcnNcbiIsCiAgICAgICAgICAgIGxlYWQpOwogICAgZnByaW50ZihvdXRmLAogICAgICAgICAgICAiJXNUOiAgcHJpbnQgaHVtYW4tcmVhZGFibGUgdGV4dCBhbG9uZyB3aXRoIGhleCBzdHJpbmdzXG4iLAogICAgICAgICAgICBsZWFkKTsKICAgIGZwcmludGYob3V0ZiwgIiVzdTogIHByaW50IE9JRHMgdXNpbmcgVUNELXN0eWxlIHByZWZpeCBzdXBwcmVzc2lvblxuIiwKICAgICAgICAgICAgbGVhZCk7CiAgICBmcHJpbnRmKG91dGYsICIlc1U6ICBkb24ndCBwcmludCB1bml0c1xuIiwgbGVhZCk7CiAgICBmcHJpbnRmKG91dGYsICIlc3Y6ICBwcmludCB2YWx1ZXMgb25seSAobm90IE9JRCA9IHZhbHVlKVxuIiwgbGVhZCk7CiAgICBmcHJpbnRmKG91dGYsICIlc3g6ICBwcmludCBhbGwgc3RyaW5ncyBpbiBoZXggZm9ybWF0XG4iLCBsZWFkKTsKICAgIGZwcmludGYob3V0ZiwgIiVzWDogIGV4dGVuZGVkIGluZGV4IGZvcm1hdFxuIiwgbGVhZCk7Cn0KCmNoYXIgKgpzbm1wX2luX29wdGlvbnMoY2hhciAqb3B0YXJnLCBpbnQgYXJnYywgY2hhciAqY29uc3QgKmFyZ3YpCnsKICAgIGNoYXIgKmNwOwoKICAgIGZvciAoY3AgPSBvcHRhcmc7ICpjcDsgY3ArKykgewogICAgICAgIHN3aXRjaCAoKmNwKSB7CiAgICAgICAgY2FzZSAnYic6CiAgICAgICAgICAgIG5ldHNubXBfZHNfdG9nZ2xlX2Jvb2xlYW4oTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9SRUdFWF9BQ0NFU1MpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICdSJzoKICAgICAgICAgICAgbmV0c25tcF9kc190b2dnbGVfYm9vbGVhbihORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX1JBTkRPTV9BQ0NFU1MpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICdyJzoKICAgICAgICAgICAgbmV0c25tcF9kc190b2dnbGVfYm9vbGVhbihORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX0RPTlRfQ0hFQ0tfUkFOR0UpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICdoJzoKICAgICAgICAgICAgbmV0c25tcF9kc190b2dnbGVfYm9vbGVhbihORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX05PX0RJU1BMQVlfSElOVCk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgJ3UnOgogICAgICAgICAgICBuZXRzbm1wX2RzX3RvZ2dsZV9ib29sZWFuKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfUkVBRF9VQ0RfU1RZTEVfT0lEKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAncyc6CiAgICAgICAgICAgIC8qIFdoYXQgaWYgYXJnYy9hcmd2IGFyZSBudWxsID8gKi8KICAgICAgICAgICAgaWYgKCEqKCsrY3ApKQogICAgICAgICAgICAgICAgY3AgPSBhcmd2W29wdGluZCsrXTsKICAgICAgICAgICAgbmV0c25tcF9kc19zZXRfc3RyaW5nKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5FVFNOTVBfRFNfTElCX09JRFNVRkZJWCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNwKTsKICAgICAgICAgICAgcmV0dXJuIE5VTEw7CgogICAgICAgIGNhc2UgJ1MnOgogICAgICAgICAgICAvKiBXaGF0IGlmIGFyZ2MvYXJndiBhcmUgbnVsbCA/ICovCiAgICAgICAgICAgIGlmICghKigrK2NwKSkKICAgICAgICAgICAgICAgIGNwID0gYXJndltvcHRpbmQrK107CiAgICAgICAgICAgIG5ldHNubXBfZHNfc2V0X3N0cmluZyhORVRTTk1QX0RTX0xJQlJBUllfSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBORVRTTk1QX0RTX0xJQl9PSURQUkVGSVgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcCk7CiAgICAgICAgICAgIHJldHVybiBOVUxMOwoKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgIC8qCiAgICAgICAgICAgICogIEhlcmU/ICBPciBpbiBzbm1wX3BhcnNlX2FyZ3M/CiAgICAgICAgICAgIHNubXBfbG9nKExPR19FUlIsICJVbmtub3duIGlucHV0IG9wdGlvbiBwYXNzZWQgdG8gLUk6ICVjLlxuIiwgKmNwKTsKICAgICAgICAgICAgKi8KICAgICAgICAgICAgcmV0dXJuIGNwOwogICAgICAgIH0KICAgIH0KICAgIHJldHVybiBOVUxMOwp9CgpjaGFyICAgICAgICAgICAqCnNubXBfaW5fdG9nZ2xlX29wdGlvbnMoY2hhciAqb3B0aW9ucykKewogICAgcmV0dXJuIHNubXBfaW5fb3B0aW9ucyggb3B0aW9ucywgMCwgTlVMTCApOwp9CgoKLyoqCiAqIFByaW50cyBvdXQgYSBoZWxwIHVzYWdlIGZvciB0aGUgaW4qIHRvZ2dsZSBvcHRpb25zLgogKgogKiBAcGFyYW0gbGVhZCAgICAgIFRoZSBsZWFkIHRvIHByaW50IGZvciBldmVyeSBsaW5lLgogKiBAcGFyYW0gb3V0ZiAgICAgIFRoZSBmaWxlIGRlc2NyaXB0b3IgdG8gd3JpdGUgdG8uCiAqIAogKi8Kdm9pZApzbm1wX2luX3RvZ2dsZV9vcHRpb25zX3VzYWdlKGNvbnN0IGNoYXIgKmxlYWQsIEZJTEUgKiBvdXRmKQp7CiAgICBmcHJpbnRmKG91dGYsICIlc2I6ICBkbyBiZXN0L3JlZ2V4IG1hdGNoaW5nIHRvIGZpbmQgYSBNSUIgbm9kZVxuIiwgbGVhZCk7CiAgICBmcHJpbnRmKG91dGYsICIlc2g6ICBkb24ndCBhcHBseSBESVNQTEFZLUhJTlRzXG4iLCBsZWFkKTsKICAgIGZwcmludGYob3V0ZiwgIiVzcjogIGRvIG5vdCBjaGVjayB2YWx1ZXMgZm9yIHJhbmdlL3R5cGUgbGVnYWxpdHlcbiIsIGxlYWQpOwogICAgZnByaW50ZihvdXRmLCAiJXNSOiAgZG8gcmFuZG9tIGFjY2VzcyB0byBPSUQgbGFiZWxzXG4iLCBsZWFkKTsKICAgIGZwcmludGYob3V0ZiwKICAgICAgICAgICAgIiVzdTogIHRvcC1sZXZlbCBPSURzIG11c3QgaGF2ZSAnLicgcHJlZml4IChVQ0Qtc3R5bGUpXG4iLCBsZWFkKTsKICAgIGZwcmludGYob3V0ZiwKICAgICAgICAgICAgIiVzcyBTVUZGSVg6ICBBcHBlbmQgYWxsIHRleHR1YWwgT0lEcyB3aXRoIFNVRkZJWCBiZWZvcmUgcGFyc2luZ1xuIiwKICAgICAgICAgICAgbGVhZCk7CiAgICBmcHJpbnRmKG91dGYsCiAgICAgICAgICAgICIlc1MgUFJFRklYOiAgUHJlcGVuZCBhbGwgdGV4dHVhbCBPSURzIHdpdGggUFJFRklYIGJlZm9yZSBwYXJzaW5nXG4iLAogICAgICAgICAgICBsZWFkKTsKfQoKLyoqKgogKgogKi8gCnZvaWQKcmVnaXN0ZXJfbWliX2hhbmRsZXJzKHZvaWQpCnsKI2lmbmRlZiBORVRTTk1QX0RJU0FCTEVfTUlCX0xPQURJTkcKICAgIHJlZ2lzdGVyX3ByZW5ldHNubXBfbWliX2hhbmRsZXIoInNubXAiLCAibWliZGlycyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZV9taWJkaXJzX2NvbmYsIE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJbbWliLWRpcnN8K21pYi1kaXJzfC1taWItZGlyc10iKTsKICAgIHJlZ2lzdGVyX3ByZW5ldHNubXBfbWliX2hhbmRsZXIoInNubXAiLCAibWlicyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZV9taWJzX2NvbmYsIE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJbbWliLXRva2Vuc3wrbWliLXRva2Vuc10iKTsKICAgIHJlZ2lzdGVyX2NvbmZpZ19oYW5kbGVyKCJzbm1wIiwgIm1pYmZpbGUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlX21pYmZpbGVfY29uZiwgTlVMTCwgIm1pYmZpbGUtdG8tcmVhZCIpOwogICAgLyoKICAgICAqIHJlZ2lzdGVyIHRoZSBzbm1wLmNvbmYgY29uZmlndXJhdGlvbiBoYW5kbGVycyBmb3IgZGVmYXVsdAogICAgICogcGFyc2luZyBiZWhhdmlvdXIgCiAgICAgKi8KCiAgICBuZXRzbm1wX2RzX3JlZ2lzdGVyX3ByZW1pYihBU05fQk9PTEVBTiwgInNubXAiLCAic2hvd01pYkVycm9ycyIsCiAgICAgICAgICAgICAgICAgICAgICAgTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9NSUJfRVJST1JTKTsKICAgIG5ldHNubXBfZHNfcmVnaXN0ZXJfcHJlbWliKEFTTl9CT09MRUFOLCAic25tcCIsICJzdHJpY3RDb21tZW50VGVybSIsCiAgICAgICAgICAgICAgICAgICAgICAgTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9NSUJfQ09NTUVOVF9URVJNKTsKICAgIG5ldHNubXBfZHNfcmVnaXN0ZXJfcHJlbWliKEFTTl9CT09MRUFOLCAic25tcCIsICJtaWJBbGxvd1VuZGVybGluZSIsCiAgICAgICAgICAgICAgICAgICAgICAgTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9NSUJfUEFSU0VfTEFCRUwpOwogICAgbmV0c25tcF9kc19yZWdpc3Rlcl9wcmVtaWIoQVNOX0lOVEVHRVIsICJzbm1wIiwgIm1pYldhcm5pbmdMZXZlbCIsCiAgICAgICAgICAgICAgICAgICAgICAgTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9NSUJfV0FSTklOR1MpOwogICAgbmV0c25tcF9kc19yZWdpc3Rlcl9wcmVtaWIoQVNOX0JPT0xFQU4sICJzbm1wIiwgIm1pYlJlcGxhY2VXaXRoTGF0ZXN0IiwKICAgICAgICAgICAgICAgICAgICAgICBORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX01JQl9SRVBMQUNFKTsKI2VuZGlmCgogICAgbmV0c25tcF9kc19yZWdpc3Rlcl9wcmVtaWIoQVNOX0JPT0xFQU4sICJzbm1wIiwgInByaW50TnVtZXJpY0VudW1zIiwKICAgICAgICAgICAgICAgICAgICAgICBORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX1BSSU5UX05VTUVSSUNfRU5VTSk7CiAgICByZWdpc3Rlcl9wcmVuZXRzbm1wX21pYl9oYW5kbGVyKCJzbm1wIiwgInByaW50TnVtZXJpY09pZHMiLAogICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZV9wcmludF9udW1lcmljLCBOVUxMLCAiKDF8eWVzfHRydWV8MHxub3xmYWxzZSkiKTsKICAgIG5ldHNubXBfZHNfcmVnaXN0ZXJfcHJlbWliKEFTTl9CT09MRUFOLCAic25tcCIsICJlc2NhcGVRdW90ZXMiLAogICAgICAgICAgICAgICAgICAgICAgIE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfRVNDQVBFX1FVT1RFUyk7CiAgICBuZXRzbm1wX2RzX3JlZ2lzdGVyX3ByZW1pYihBU05fQk9PTEVBTiwgInNubXAiLCAiZG9udEJyZWFrZG93bk9pZHMiLAogICAgICAgICAgICAgICAgICAgICAgIE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfRE9OVF9CUkVBS0RPV05fT0lEUyk7CiAgICBuZXRzbm1wX2RzX3JlZ2lzdGVyX3ByZW1pYihBU05fQk9PTEVBTiwgInNubXAiLCAicXVpY2tQcmludGluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9RVUlDS19QUklOVCk7CiAgICBuZXRzbm1wX2RzX3JlZ2lzdGVyX3ByZW1pYihBU05fQk9PTEVBTiwgInNubXAiLCAibnVtZXJpY1RpbWV0aWNrcyIsCiAgICAgICAgICAgICAgICAgICAgICAgTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9OVU1FUklDX1RJTUVUSUNLUyk7CiAgICBuZXRzbm1wX2RzX3JlZ2lzdGVyX3ByZW1pYihBU05fSU5URUdFUiwgInNubXAiLCAib2lkT3V0cHV0Rm9ybWF0IiwKICAgICAgICAgICAgICAgICAgICAgICBORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX09JRF9PVVRQVVRfRk9STUFUKTsKICAgIG5ldHNubXBfZHNfcmVnaXN0ZXJfcHJlbWliKEFTTl9JTlRFR0VSLCAic25tcCIsICJzdWZmaXhQcmludGluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9PSURfT1VUUFVUX0ZPUk1BVCk7CiAgICBuZXRzbm1wX2RzX3JlZ2lzdGVyX3ByZW1pYihBU05fQk9PTEVBTiwgInNubXAiLCAiZXh0ZW5kZWRJbmRleCIsCiAgICAgICAgICAgICAgICAgICAgICAgTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9FWFRFTkRFRF9JTkRFWCk7CiAgICBuZXRzbm1wX2RzX3JlZ2lzdGVyX3ByZW1pYihBU05fQk9PTEVBTiwgInNubXAiLCAicHJpbnRIZXhUZXh0IiwKICAgICAgICAgICAgICAgICAgICAgICBORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX1BSSU5UX0hFWF9URVhUKTsKICAgIG5ldHNubXBfZHNfcmVnaXN0ZXJfcHJlbWliKEFTTl9CT09MRUFOLCAic25tcCIsICJwcmludFZhbHVlT25seSIsCiAgICAgICAgICAgICAgICAgICAgICAgTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9QUklOVF9CQVJFX1ZBTFVFKTsKICAgIG5ldHNubXBfZHNfcmVnaXN0ZXJfcHJlbWliKEFTTl9CT09MRUFOLCAic25tcCIsICJkb250UHJpbnRVbml0cyIsCiAgICAgICAgICAgICAgICAgICAgICAgTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9ET05UX1BSSU5UX1VOSVRTKTsKICAgIG5ldHNubXBfZHNfcmVnaXN0ZXJfcHJlbWliKEFTTl9JTlRFR0VSLCAic25tcCIsICJoZXhPdXRwdXRMZW5ndGgiLAogICAgICAgICAgICAgICAgICAgICAgIE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfSEVYX09VVFBVVF9MRU5HVEgpOwp9CgojaWZuZGVmIE5FVFNOTVBfRElTQUJMRV9NSUJfTE9BRElORwovKgogKiBmdW5jdGlvbiA6IG5ldHNubXBfc2V0X21pYl9kaXJlY3RvcnkKICogICAgICAgICAgICAtIFRoaXMgZnVuY3Rpb24gc2V0cyB0aGUgc3RyaW5nIG9mIHRoZSBkaXJlY3RvcmllcwogKiAgICAgICAgICAgICAgZnJvbSB3aGljaCB0aGUgTUlCIG1vZHVsZXMgd2lsbCBiZSBzZWFyY2hlZCBvcgogKiAgICAgICAgICAgICAgbG9hZGVkLgogKiBhcmd1bWVudHM6IGNvbnN0IGNoYXIgKmRpciwgd2hpY2ggYXJlIHRoZSBkaXJlY3RvcmllcwogKiAgICAgICAgICAgICAgZnJvbSB3aGljaCB0aGUgTUlCIG1vZHVsZXMgd2lsbCBiZSBzZWFyY2hlZCBvcgogKiAgICAgICAgICAgICAgbG9hZGVkLgogKiByZXR1cm5zICA6IC0KICovCnZvaWQKbmV0c25tcF9zZXRfbWliX2RpcmVjdG9yeShjb25zdCBjaGFyICpkaXIpCnsKICAgIGNvbnN0IGNoYXIgKm5ld2RpcjsKICAgIGNoYXIgKm9sZGRpciwgKnRtcGRpciA9IE5VTEw7CgogICAgREVCVUdUUkFDRTsKICAgIGlmIChOVUxMID09IGRpcikgewogICAgICAgIHJldHVybjsKICAgIH0KICAgIAogICAgb2xkZGlyID0gbmV0c25tcF9kc19nZXRfc3RyaW5nKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwKCQkJCSAgIE5FVFNOTVBfRFNfTElCX01JQkRJUlMpOwogICAgaWYgKG9sZGRpcikgewogICAgICAgIGlmICgoKmRpciA9PSAnKycpIHx8ICgqZGlyID09ICctJykpIHsKICAgICAgICAgICAgLyoqIE5ldyBkaXIgc3RhcnRzIHdpdGggJysnLCB0aHVzIHdlIGFkZCBpdC4gKi8KICAgICAgICAgICAgdG1wZGlyID0gKGNoYXIgKiltYWxsb2Moc3RybGVuKGRpcikgKyBzdHJsZW4ob2xkZGlyKSArIDIpOwogICAgICAgICAgICBpZiAoIXRtcGRpcikgewogICAgICAgICAgICAgICAgREVCVUdNU0dUTCgoInJlYWRfY29uZmlnOmluaXRtaWIiLCAic2V0IG1pYmRpciBtYWxsb2MgZmFpbGVkIikpOwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICgqZGlyKysgPT0gJysnKQogICAgICAgICAgICAgICAgc3ByaW50Zih0bXBkaXIsICIlcyVjJXMiLCBvbGRkaXIsIEVOVl9TRVBBUkFUT1JfQ0hBUiwgZGlyKTsKICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgc3ByaW50Zih0bXBkaXIsICIlcyVjJXMiLCBkaXIsIEVOVl9TRVBBUkFUT1JfQ0hBUiwgb2xkZGlyKTsKICAgICAgICAgICAgbmV3ZGlyID0gdG1wZGlyOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIG5ld2RpciA9IGRpcjsKICAgICAgICB9CiAgICB9IGVsc2UgewogICAgICAgIC8qKiBJZiBkaXIgc3RhcnRzIHdpdGggJysnIHNraXAgJysnIGl0LiAqLwogICAgICAgIG5ld2RpciA9ICgoKmRpciA9PSAnKycpID8gKytkaXIgOiBkaXIpOwogICAgfQogICAgbmV0c25tcF9kc19zZXRfc3RyaW5nKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfTUlCRElSUywKICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdkaXIpOwoKICAgIC8qKiBzZXRfc3RyaW5nIGNhbGxzIHN0cmR1cCwgc28gaWYgd2UgYWxsb2NhdGVkIG1lbW9yeSwgZnJlZSBpdCAqLwogICAgaWYgKHRtcGRpciA9PSBuZXdkaXIpIHsKICAgICAgICBTTk1QX0ZSRUUodG1wZGlyKTsKICAgIH0KfQoKLyoKICogZnVuY3Rpb24gOiBuZXRzbm1wX2dldF9taWJfZGlyZWN0b3J5CiAqICAgICAgICAgICAgLSBUaGlzIGZ1bmN0aW9uIHJldHVybnMgYSBzdHJpbmcgb2YgdGhlIGRpcmVjdG9yaWVzCiAqICAgICAgICAgICAgICBmcm9tIHdoaWNoIHRoZSBNSUIgbW9kdWxlcyB3aWxsIGJlIHNlYXJjaGVkIG9yCiAqICAgICAgICAgICAgICBsb2FkZWQuCiAqICAgICAgICAgICAgICBJZiB0aGUgdmFsdWUgc3RpbGwgZG9lcyBub3QgZXhpc3RzLCBpdCB3aWxsIGJlIG1hZGUKICogICAgICAgICAgICAgIGZyb20gdGhlIGV2aXJvbm1lbnQgdmFyaWFibGUgJ01JQkRJUlMnIGFuZC9vciB0aGUKICogICAgICAgICAgICAgIGRlZmF1bHQuCiAqIGFyZ3VtZW50czogLQogKiByZXR1cm5zICA6IGNoYXIgKiBvZiB0aGUgZGlyZWN0b3JpZXMgaW4gd2hpY2ggdGhlIE1JQiBtb2R1bGVzCiAqICAgICAgICAgICAgd2lsbCBiZSBzZWFyY2hlZC9sb2FkZWQuCiAqLwoKY2hhciAqCm5ldHNubXBfZ2V0X21pYl9kaXJlY3Rvcnkodm9pZCkKewogICAgY2hhciAqZGlyOwoKICAgIERFQlVHVFJBQ0U7CiAgICBkaXIgPSBuZXRzbm1wX2RzX2dldF9zdHJpbmcoTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9NSUJESVJTKTsKICAgIGlmIChkaXIgPT0gTlVMTCkgewogICAgICAgIERFQlVHTVNHVEwoKCJnZXRfbWliX2RpcmVjdG9yeSIsICJubyBtaWIgZGlyZWN0b3JpZXMgc2V0XG4iKSk7CgogICAgICAgIC8qKiBDaGVjayBpZiB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgaXMgc2V0ICovCiAgICAgICAgZGlyID0gbmV0c25tcF9nZXRlbnYoIk1JQkRJUlMiKTsKICAgICAgICBpZiAoZGlyID09IE5VTEwpIHsKICAgICAgICAgICAgREVCVUdNU0dUTCgoImdldF9taWJfZGlyZWN0b3J5IiwgIm5vIG1pYiBkaXJlY3RvcmllcyBzZXQgYnkgZW52aXJvbm1lbnRcbiIpKTsKICAgICAgICAgICAgLyoqIE5vdCBzZXQgdXNlIGhhcmQgY29kZWQgcGF0aCAqLwogICAgICAgICAgICBpZiAoY29uZm1pYmRpciA9PSBOVUxMKSB7CiAgICAgICAgICAgICAgICBERUJVR01TR1RMKCgiZ2V0X21pYl9kaXJlY3RvcnkiLCAibm8gbWliIGRpcmVjdG9yaWVzIHNldCBieSBjb25maWdcbiIpKTsKICAgICAgICAgICAgICAgIG5ldHNubXBfc2V0X21pYl9kaXJlY3RvcnkoTkVUU05NUF9ERUZBVUxUX01JQkRJUlMpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKCgqY29uZm1pYmRpciA9PSAnKycpIHx8ICgqY29uZm1pYmRpciA9PSAnLScpKSB7CiAgICAgICAgICAgICAgICBERUJVR01TR1RMKCgiZ2V0X21pYl9kaXJlY3RvcnkiLCAibWliIGRpcmVjdG9yaWVzIHNldCBieSBjb25maWcgKGJ1dCBhZGRlZClcbiIpKTsKICAgICAgICAgICAgICAgIG5ldHNubXBfc2V0X21pYl9kaXJlY3RvcnkoTkVUU05NUF9ERUZBVUxUX01JQkRJUlMpOwogICAgICAgICAgICAgICAgbmV0c25tcF9zZXRfbWliX2RpcmVjdG9yeShjb25mbWliZGlyKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIERFQlVHTVNHVEwoKCJnZXRfbWliX2RpcmVjdG9yeSIsICJtaWIgZGlyZWN0b3JpZXMgc2V0IGJ5IGNvbmZpZ1xuIikpOwogICAgICAgICAgICAgICAgbmV0c25tcF9zZXRfbWliX2RpcmVjdG9yeShjb25mbWliZGlyKTsKICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZSBpZiAoKCpkaXIgPT0gJysnKSB8fCAoKmRpciA9PSAnLScpKSB7CiAgICAgICAgICAgIERFQlVHTVNHVEwoKCJnZXRfbWliX2RpcmVjdG9yeSIsICJtaWIgZGlyZWN0b3JpZXMgc2V0IGJ5IGVudmlyb25tZW50IChidXQgYWRkZWQpXG4iKSk7CiAgICAgICAgICAgIG5ldHNubXBfc2V0X21pYl9kaXJlY3RvcnkoTkVUU05NUF9ERUZBVUxUX01JQkRJUlMpOwogICAgICAgICAgICBuZXRzbm1wX3NldF9taWJfZGlyZWN0b3J5KGRpcik7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgREVCVUdNU0dUTCgoImdldF9taWJfZGlyZWN0b3J5IiwgIm1pYiBkaXJlY3RvcmllcyBzZXQgYnkgZW52aXJvbm1lbnRcbiIpKTsKICAgICAgICAgICAgbmV0c25tcF9zZXRfbWliX2RpcmVjdG9yeShkaXIpOwogICAgICAgIH0KICAgICAgICBkaXIgPSBuZXRzbm1wX2RzX2dldF9zdHJpbmcoTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9NSUJESVJTKTsKICAgIH0KICAgIERFQlVHTVNHVEwoKCJnZXRfbWliX2RpcmVjdG9yeSIsICJtaWIgZGlyZWN0b3JpZXMgc2V0ICclcydcbiIsIGRpcikpOwogICAgcmV0dXJuKGRpcik7Cn0KCi8qCiAqIGZ1bmN0aW9uIDogbmV0c25tcF9maXh1cF9taWJfZGlyZWN0b3J5CiAqIGFyZ3VtZW50czogLQogKiByZXR1cm5zICA6IC0KICovCnZvaWQKbmV0c25tcF9maXh1cF9taWJfZGlyZWN0b3J5KHZvaWQpCnsKICAgIGNoYXIgKmhvbWVwYXRoID0gbmV0c25tcF9nZXRlbnYoIkhPTUUiKTsKICAgIGNoYXIgKm1pYnBhdGggPSBuZXRzbm1wX2dldF9taWJfZGlyZWN0b3J5KCk7CiAgICBjaGFyICpvbGRtaWJwYXRoID0gTlVMTDsKICAgIGNoYXIgKnB0cl9ob21lOwogICAgY2hhciAqbmV3X21pYnBhdGg7CgogICAgREVCVUdUUkFDRTsKICAgIGlmIChob21lcGF0aCAmJiBtaWJwYXRoKSB7CiAgICAgICAgREVCVUdNU0dUTCgoImZpeHVwX21pYl9kaXJlY3RvcnkiLCAibWliIGRpcmVjdG9yaWVzICclcydcbiIsIG1pYnBhdGgpKTsKICAgICAgICB3aGlsZSAoKHB0cl9ob21lID0gc3Ryc3RyKG1pYnBhdGgsICIkSE9NRSIpKSkgewogICAgICAgICAgICBuZXdfbWlicGF0aCA9IChjaGFyICopbWFsbG9jKHN0cmxlbihtaWJwYXRoKSAtIHN0cmxlbigiJEhPTUUiKSArCgkJCQkJIHN0cmxlbihob21lcGF0aCkrMSk7CiAgICAgICAgICAgIGlmIChuZXdfbWlicGF0aCkgewogICAgICAgICAgICAgICAgKnB0cl9ob21lID0gMDsgLyogbnVsbCBvdXQgdGhlIHNwb3Qgd2hlcmUgd2Ugc3RvcCBjb3B5aW5nICovCiAgICAgICAgICAgICAgICBzcHJpbnRmKG5ld19taWJwYXRoLCAiJXMlcyVzIiwgbWlicGF0aCwgaG9tZXBhdGgsCgkJCXB0cl9ob21lICsgc3RybGVuKCIkSE9NRSIpKTsKICAgICAgICAgICAgICAgIC8qKiBzd2FwIGluIHRoZSBuZXcgdmFsdWUgYW5kIHJlcGVhdCAqLwogICAgICAgICAgICAgICAgbWlicGF0aCA9IG5ld19taWJwYXRoOwoJCWlmIChvbGRtaWJwYXRoICE9IE5VTEwpIHsKCQkgICAgU05NUF9GUkVFKG9sZG1pYnBhdGgpOwoJCX0KCQlvbGRtaWJwYXRoID0gbmV3X21pYnBhdGg7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgbmV0c25tcF9zZXRfbWliX2RpcmVjdG9yeShtaWJwYXRoKTsKCQoJLyogIFRoZSBhYm92ZSBjb3BpZXMgdGhlIG1pYnBhdGggZm9yIHVzLCBzby4uLiAgKi8KCglpZiAob2xkbWlicGF0aCAhPSBOVUxMKSB7CgkgICAgU05NUF9GUkVFKG9sZG1pYnBhdGgpOwoJfQoKICAgIH0KCn0KCi8qKgogKiBJbml0aWFsaXNlcyB0aGUgbWliIHJlYWRlci4KICoKICogUmVhZHMgaW4gYWxsIHNldHRpbmdzIGZyb20gdGhlIGVudmlyb25tZW50LgogKi8Kdm9pZApuZXRzbm1wX2luaXRfbWliKHZvaWQpCnsKICAgIGNvbnN0IGNoYXIgICAgICpwcmVmaXg7CiAgICBjaGFyICAgICAgICAgICAqZW52X3ZhciwgKmVudHJ5OwogICAgUHJlZml4TGlzdFB0ciAgIHBwID0gJm1pYl9wcmVmaXhlc1swXTsKICAgIGNoYXIgICAgICAgICAgICpzdCA9IE5VTEw7CgogICAgaWYgKE1pYikKICAgICAgICByZXR1cm47CiAgICBuZXRzbm1wX2luaXRfbWliX2ludGVybmFscygpOwoKICAgIC8qCiAgICAgKiBJbml0aWFsaXNlIHRoZSBNSUIgZGlyZWN0b3J5L2llcyAKICAgICAqLwogICAgbmV0c25tcF9maXh1cF9taWJfZGlyZWN0b3J5KCk7CiAgICBlbnZfdmFyID0gc3RyZHVwKG5ldHNubXBfZ2V0X21pYl9kaXJlY3RvcnkoKSk7CgogICAgREVCVUdNU0dUTCgoImluaXRfbWliIiwKICAgICAgICAgICAgICAgICJTZWVuIE1JQkRJUlM6IExvb2tpbmcgaW4gJyVzJyBmb3IgbWliIGRpcnMgLi4uXG4iLAogICAgICAgICAgICAgICAgZW52X3ZhcikpOwoKICAgIGVudHJ5ID0gc3RydG9rX3IoZW52X3ZhciwgRU5WX1NFUEFSQVRPUiwgJnN0KTsKICAgIHdoaWxlIChlbnRyeSkgewogICAgICAgIGFkZF9taWJkaXIoZW50cnkpOwogICAgICAgIGVudHJ5ID0gc3RydG9rX3IoTlVMTCwgRU5WX1NFUEFSQVRPUiwgJnN0KTsKICAgIH0KICAgIFNOTVBfRlJFRShlbnZfdmFyKTsKCiAgICBlbnZfdmFyID0gbmV0c25tcF9nZXRlbnYoIk1JQkZJTEVTIik7CiAgICBpZiAoZW52X3ZhciAhPSBOVUxMKSB7CiAgICAgICAgaWYgKCplbnZfdmFyID09ICcrJykKICAgICAgICAgICAgZW50cnkgPSBzdHJ0b2tfcihlbnZfdmFyKzEsIEVOVl9TRVBBUkFUT1IsICZzdCk7CiAgICAgICAgZWxzZQogICAgICAgICAgICBlbnRyeSA9IHN0cnRva19yKGVudl92YXIsIEVOVl9TRVBBUkFUT1IsICZzdCk7CiAgICAgICAgd2hpbGUgKGVudHJ5KSB7CiAgICAgICAgICAgIGFkZF9taWJmaWxlKGVudHJ5LCBOVUxMLCBOVUxMKTsKICAgICAgICAgICAgZW50cnkgPSBzdHJ0b2tfcihOVUxMLCBFTlZfU0VQQVJBVE9SLCAmc3QpOwogICAgICAgIH0KICAgIH0KCiAgICBuZXRzbm1wX2luaXRfbWliX2ludGVybmFscygpOwoKICAgIC8qCiAgICAgKiBSZWFkIGluIGFueSBtb2R1bGVzIG9yIG1pYnMgcmVxdWVzdGVkIAogICAgICovCgogICAgZW52X3ZhciA9IG5ldHNubXBfZ2V0ZW52KCJNSUJTIik7CiAgICBpZiAoZW52X3ZhciA9PSBOVUxMKSB7CiAgICAgICAgaWYgKGNvbmZtaWJzICE9IE5VTEwpCiAgICAgICAgICAgIGVudl92YXIgPSBzdHJkdXAoY29uZm1pYnMpOwogICAgICAgIGVsc2UKICAgICAgICAgICAgZW52X3ZhciA9IHN0cmR1cChORVRTTk1QX0RFRkFVTFRfTUlCUyk7CiAgICB9IGVsc2UgewogICAgICAgIGVudl92YXIgPSBzdHJkdXAoZW52X3Zhcik7CiAgICB9CiAgICBpZiAoZW52X3ZhciAmJiAoKCplbnZfdmFyID09ICcrJykgfHwgKCplbnZfdmFyID09ICctJykpKSB7CiAgICAgICAgZW50cnkgPQogICAgICAgICAgICAoY2hhciAqKSBtYWxsb2Moc3RybGVuKE5FVFNOTVBfREVGQVVMVF9NSUJTKSArIHN0cmxlbihlbnZfdmFyKSArIDIpOwogICAgICAgIGlmICghZW50cnkpIHsKICAgICAgICAgICAgREVCVUdNU0dUTCgoImluaXRfbWliIiwgImVudiBtaWJzIG1hbGxvYyBmYWlsZWQiKSk7CiAgICAgICAgICAgIFNOTVBfRlJFRShlbnZfdmFyKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGlmICgqZW52X3ZhciA9PSAnKycpCiAgICAgICAgICAgICAgICBzcHJpbnRmKGVudHJ5LCAiJXMlYyVzIiwgTkVUU05NUF9ERUZBVUxUX01JQlMsIEVOVl9TRVBBUkFUT1JfQ0hBUiwKICAgICAgICAgICAgICAgICAgICAgICAgZW52X3ZhcisxKTsKICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgc3ByaW50ZihlbnRyeSwgIiVzJWMlcyIsIGVudl92YXIrMSwgRU5WX1NFUEFSQVRPUl9DSEFSLAogICAgICAgICAgICAgICAgICAgICAgICBORVRTTk1QX0RFRkFVTFRfTUlCUyApOwogICAgICAgIH0KICAgICAgICBTTk1QX0ZSRUUoZW52X3Zhcik7CiAgICAgICAgZW52X3ZhciA9IGVudHJ5OwogICAgfQoKICAgIERFQlVHTVNHVEwoKCJpbml0X21pYiIsCiAgICAgICAgICAgICAgICAiU2VlbiBNSUJTOiBMb29raW5nIGluICclcycgZm9yIG1pYiBmaWxlcyAuLi5cbiIsCiAgICAgICAgICAgICAgICBlbnZfdmFyKSk7CiAgICBlbnRyeSA9IHN0cnRva19yKGVudl92YXIsIEVOVl9TRVBBUkFUT1IsICZzdCk7CiAgICB3aGlsZSAoZW50cnkpIHsKICAgICAgICBpZiAoc3RyY2FzZWNtcChlbnRyeSwgREVCVUdfQUxXQVlTX1RPS0VOKSA9PSAwKSB7CiAgICAgICAgICAgIHJlYWRfYWxsX21pYnMoKTsKICAgICAgICB9IGVsc2UgaWYgKHN0cnN0cihlbnRyeSwgIi8iKSAhPSAwKSB7CiAgICAgICAgICAgIHJlYWRfbWliKGVudHJ5KTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBuZXRzbm1wX3JlYWRfbW9kdWxlKGVudHJ5KTsKICAgICAgICB9CiAgICAgICAgZW50cnkgPSBzdHJ0b2tfcihOVUxMLCBFTlZfU0VQQVJBVE9SLCAmc3QpOwogICAgfQogICAgYWRvcHRfb3JwaGFucygpOwogICAgU05NUF9GUkVFKGVudl92YXIpOwoKICAgIGVudl92YXIgPSBuZXRzbm1wX2dldGVudigiTUlCRklMRVMiKTsKICAgIGlmIChlbnZfdmFyICE9IE5VTEwpIHsKICAgICAgICBpZiAoKCplbnZfdmFyID09ICcrJykgfHwgKCplbnZfdmFyID09ICctJykpIHsKI2lmZGVmIE5FVFNOTVBfREVGQVVMVF9NSUJGSUxFUwogICAgICAgICAgICBlbnRyeSA9CiAgICAgICAgICAgICAgICAoY2hhciAqKSBtYWxsb2Moc3RybGVuKE5FVFNOTVBfREVGQVVMVF9NSUJGSUxFUykgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmxlbihlbnZfdmFyKSArIDIpOwogICAgICAgICAgICBpZiAoIWVudHJ5KSB7CiAgICAgICAgICAgICAgICBERUJVR01TR1RMKCgiaW5pdF9taWIiLCAiZW52IG1pYmZpbGVzIG1hbGxvYyBmYWlsZWQiKSk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBpZiAoKmVudl92YXIrKyA9PSAnKycpCiAgICAgICAgICAgICAgICAgICAgc3ByaW50ZihlbnRyeSwgIiVzJWMlcyIsIE5FVFNOTVBfREVGQVVMVF9NSUJGSUxFUywgRU5WX1NFUEFSQVRPUl9DSEFSLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZW52X3ZhciApOwogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgIHNwcmludGYoZW50cnksICIlcyVjJXMiLCBlbnZfdmFyLCBFTlZfU0VQQVJBVE9SX0NIQVIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBORVRTTk1QX0RFRkFVTFRfTUlCRklMRVMgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBTTk1QX0ZSRUUoZW52X3Zhcik7CiAgICAgICAgICAgIGVudl92YXIgPSBlbnRyeTsKI2Vsc2UKICAgICAgICAgICAgZW52X3ZhciA9IHN0cmR1cChlbnZfdmFyICsgMSk7CiNlbmRpZgogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGVudl92YXIgPSBzdHJkdXAoZW52X3Zhcik7CiAgICAgICAgfQogICAgfSBlbHNlIHsKI2lmZGVmIE5FVFNOTVBfREVGQVVMVF9NSUJGSUxFUwogICAgICAgIGVudl92YXIgPSBzdHJkdXAoTkVUU05NUF9ERUZBVUxUX01JQkZJTEVTKTsKI2VuZGlmCiAgICB9CgogICAgaWYgKGVudl92YXIgIT0gMCkgewogICAgICAgIERFQlVHTVNHVEwoKCJpbml0X21pYiIsCiAgICAgICAgICAgICAgICAgICAgIlNlZW4gTUlCRklMRVM6IExvb2tpbmcgaW4gJyVzJyBmb3IgbWliIGZpbGVzIC4uLlxuIiwKICAgICAgICAgICAgICAgICAgICBlbnZfdmFyKSk7CiAgICAgICAgZW50cnkgPSBzdHJ0b2tfcihlbnZfdmFyLCBFTlZfU0VQQVJBVE9SLCAmc3QpOwogICAgICAgIHdoaWxlIChlbnRyeSkgewogICAgICAgICAgICByZWFkX21pYihlbnRyeSk7CiAgICAgICAgICAgIGVudHJ5ID0gc3RydG9rX3IoTlVMTCwgRU5WX1NFUEFSQVRPUiwgJnN0KTsKICAgICAgICB9CiAgICAgICAgU05NUF9GUkVFKGVudl92YXIpOwogICAgfQoKICAgIHByZWZpeCA9IG5ldHNubXBfZ2V0ZW52KCJQUkVGSVgiKTsKCiAgICBpZiAoIXByZWZpeCkKICAgICAgICBwcmVmaXggPSBTdGFuZGFyZF9QcmVmaXg7CgogICAgUHJlZml4ID0gKGNoYXIgKikgbWFsbG9jKHN0cmxlbihwcmVmaXgpICsgMik7CiAgICBpZiAoIVByZWZpeCkKICAgICAgICBERUJVR01TR1RMKCgiaW5pdF9taWIiLCAiUHJlZml4IG1hbGxvYyBmYWlsZWQiKSk7CiAgICBlbHNlCiAgICAgICAgc3RyY3B5KFByZWZpeCwgcHJlZml4KTsKCiAgICBERUJVR01TR1RMKCgiaW5pdF9taWIiLAogICAgICAgICAgICAgICAgIlNlZW4gUFJFRklYOiBMb29raW5nIGluICclcycgZm9yIHByZWZpeCAuLi5cbiIsIFByZWZpeCkpOwoKICAgIC8qCiAgICAgKiByZW1vdmUgdHJhaWxpbmcgZG90IAogICAgICovCiAgICBpZiAoUHJlZml4KSB7CiAgICAgICAgZW52X3ZhciA9ICZQcmVmaXhbc3RybGVuKFByZWZpeCkgLSAxXTsKICAgICAgICBpZiAoKmVudl92YXIgPT0gJy4nKQogICAgICAgICAgICAqZW52X3ZhciA9ICdcMCc7CiAgICB9CgogICAgcHAtPnN0ciA9IFByZWZpeDsgICAgICAgICAgIC8qIGZpeHVwIGZpcnN0IG1pYl9wcmVmaXggZW50cnkgKi8KICAgIC8qCiAgICAgKiBub3cgdGhhdCB0aGUgbGlzdCBvZiBwcmVmaXhlcyBpcyBidWlsdCwgc2F2ZSBlYWNoIHN0cmluZyBsZW5ndGguIAogICAgICovCiAgICB3aGlsZSAocHAtPnN0cikgewogICAgICAgIHBwLT5sZW4gPSBzdHJsZW4ocHAtPnN0cik7CiAgICAgICAgcHArKzsKICAgIH0KCiAgICBNaWIgPSB0cmVlX2hlYWQ7ICAgICAgICAgICAgLyogQmFja3dhcmRzIGNvbXBhdGliaWxpdHkgKi8KICAgIHRyZWVfdG9wID0gKHN0cnVjdCB0cmVlICopIGNhbGxvYygxLCBzaXplb2Yoc3RydWN0IHRyZWUpKTsKICAgIC8qCiAgICAgKiBYWCBlcnJvciBjaGVjayA/IAogICAgICovCiAgICBpZiAodHJlZV90b3ApIHsKICAgICAgICB0cmVlX3RvcC0+bGFiZWwgPSBzdHJkdXAoIih0b3ApIik7CiAgICAgICAgdHJlZV90b3AtPmNoaWxkX2xpc3QgPSB0cmVlX2hlYWQ7CiAgICB9Cn0KCiNpZm5kZWYgTkVUU05NUF9DTEVBTl9OQU1FU1BBQ0UKdm9pZAppbml0X21pYih2b2lkKQp7CiAgICBuZXRzbm1wX2luaXRfbWliKCk7Cn0KI2VuZGlmCgoKLyoqCiAqIFVubG9hZHMgYWxsIG1pYnMuCiAqLwp2b2lkCnNodXRkb3duX21pYih2b2lkKQp7CiAgICB1bmxvYWRfYWxsX21pYnMoKTsKICAgIGlmICh0cmVlX3RvcCkgewogICAgICAgIGlmICh0cmVlX3RvcC0+bGFiZWwpCiAgICAgICAgICAgIFNOTVBfRlJFRSh0cmVlX3RvcC0+bGFiZWwpOwogICAgICAgIFNOTVBfRlJFRSh0cmVlX3RvcCk7CiAgICAgICAgdHJlZV90b3AgPSBOVUxMOwogICAgfQogICAgdHJlZV9oZWFkID0gTlVMTDsKICAgIE1pYiA9IE5VTEw7CiAgICBpZiAoUHJlZml4ICE9IE5VTEwgJiYgUHJlZml4ICE9ICZTdGFuZGFyZF9QcmVmaXhbMF0pCiAgICAgICAgU05NUF9GUkVFKFByZWZpeCk7CiAgICBpZiAoUHJlZml4KQogICAgICAgIFByZWZpeCA9IE5VTEw7CiAgICBTTk1QX0ZSRUUoY29uZm1pYnMpOwogICAgU05NUF9GUkVFKGNvbmZtaWJkaXIpOwp9CgovKioKICogUHJpbnRzIHRoZSBNSUJzIHRvIHRoZSBmaWxlIGZwLgogKgogKiBAcGFyYW0gZnAgICBUaGUgZmlsZSBkZXNjcmlwdG9yIHRvIHByaW50IHRvLgogKi8Kdm9pZApwcmludF9taWIoRklMRSAqIGZwKQp7CiAgICBwcmludF9zdWJ0cmVlKGZwLCB0cmVlX2hlYWQsIDApOwp9Cgp2b2lkCnByaW50X2FzY2lpX2R1bXAoRklMRSAqIGZwKQp7CiAgICBmcHJpbnRmKGZwLCAiZHVtcCBERUZJTklUSU9OUyA6Oj0gQkVHSU5cbiIpOwogICAgcHJpbnRfYXNjaWlfZHVtcF90cmVlKGZwLCB0cmVlX2hlYWQsIDApOwogICAgZnByaW50ZihmcCwgIkVORFxuIik7Cn0KCgovKioKICogU2V0J3MgdGhlIHByaW50aW5nIGZ1bmN0aW9uIHByaW50b21hdCBpbiBhIHN1YnRyZWUgYWNjb3JkaW5nCiAqIGl0J3MgdHlwZQogKgogKiBAcGFyYW0gc3VidHJlZSAgICBUaGUgc3VidHJlZSB0byBzZXQuCiAqLwp2b2lkCnNldF9mdW5jdGlvbihzdHJ1Y3QgdHJlZSAqc3VidHJlZSkKewogICAgc3VidHJlZS0+cHJpbnRlciA9IE5VTEw7CiAgICBzd2l0Y2ggKHN1YnRyZWUtPnR5cGUpIHsKICAgIGNhc2UgVFlQRV9PQkpJRDoKICAgICAgICBzdWJ0cmVlLT5wcmludG9tYXQgPSBzcHJpbnRfcmVhbGxvY19vYmplY3RfaWRlbnRpZmllcjsKICAgICAgICBicmVhazsKICAgIGNhc2UgVFlQRV9PQ1RFVFNUUjoKICAgICAgICBzdWJ0cmVlLT5wcmludG9tYXQgPSBzcHJpbnRfcmVhbGxvY19vY3RldF9zdHJpbmc7CiAgICAgICAgYnJlYWs7CiAgICBjYXNlIFRZUEVfSU5URUdFUjoKICAgICAgICBzdWJ0cmVlLT5wcmludG9tYXQgPSBzcHJpbnRfcmVhbGxvY19pbnRlZ2VyOwogICAgICAgIGJyZWFrOwogICAgY2FzZSBUWVBFX0lOVEVHRVIzMjoKICAgICAgICBzdWJ0cmVlLT5wcmludG9tYXQgPSBzcHJpbnRfcmVhbGxvY19pbnRlZ2VyOwogICAgICAgIGJyZWFrOwogICAgY2FzZSBUWVBFX05FVEFERFI6CiAgICAgICAgc3VidHJlZS0+cHJpbnRvbWF0ID0gc3ByaW50X3JlYWxsb2NfbmV0d29ya2FkZHJlc3M7CiAgICAgICAgYnJlYWs7CiAgICBjYXNlIFRZUEVfSVBBRERSOgogICAgICAgIHN1YnRyZWUtPnByaW50b21hdCA9IHNwcmludF9yZWFsbG9jX2lwYWRkcmVzczsKICAgICAgICBicmVhazsKICAgIGNhc2UgVFlQRV9DT1VOVEVSOgogICAgICAgIHN1YnRyZWUtPnByaW50b21hdCA9IHNwcmludF9yZWFsbG9jX2NvdW50ZXI7CiAgICAgICAgYnJlYWs7CiAgICBjYXNlIFRZUEVfR0FVR0U6CiAgICAgICAgc3VidHJlZS0+cHJpbnRvbWF0ID0gc3ByaW50X3JlYWxsb2NfZ2F1Z2U7CiAgICAgICAgYnJlYWs7CiAgICBjYXNlIFRZUEVfVElNRVRJQ0tTOgogICAgICAgIHN1YnRyZWUtPnByaW50b21hdCA9IHNwcmludF9yZWFsbG9jX3RpbWV0aWNrczsKICAgICAgICBicmVhazsKICAgIGNhc2UgVFlQRV9PUEFRVUU6CiAgICAgICAgc3VidHJlZS0+cHJpbnRvbWF0ID0gc3ByaW50X3JlYWxsb2Nfb3BhcXVlOwogICAgICAgIGJyZWFrOwogICAgY2FzZSBUWVBFX05VTEw6CiAgICAgICAgc3VidHJlZS0+cHJpbnRvbWF0ID0gc3ByaW50X3JlYWxsb2NfbnVsbDsKICAgICAgICBicmVhazsKICAgIGNhc2UgVFlQRV9CSVRTVFJJTkc6CiAgICAgICAgc3VidHJlZS0+cHJpbnRvbWF0ID0gc3ByaW50X3JlYWxsb2NfYml0c3RyaW5nOwogICAgICAgIGJyZWFrOwogICAgY2FzZSBUWVBFX05TQVBBRERSRVNTOgogICAgICAgIHN1YnRyZWUtPnByaW50b21hdCA9IHNwcmludF9yZWFsbG9jX25zYXBhZGRyZXNzOwogICAgICAgIGJyZWFrOwogICAgY2FzZSBUWVBFX0NPVU5URVI2NDoKICAgICAgICBzdWJ0cmVlLT5wcmludG9tYXQgPSBzcHJpbnRfcmVhbGxvY19jb3VudGVyNjQ7CiAgICAgICAgYnJlYWs7CiAgICBjYXNlIFRZUEVfVUlOVEVHRVI6CiAgICAgICAgc3VidHJlZS0+cHJpbnRvbWF0ID0gc3ByaW50X3JlYWxsb2NfdWludGVnZXI7CiAgICAgICAgYnJlYWs7CiAgICBjYXNlIFRZUEVfVU5TSUdORUQzMjoKICAgICAgICBzdWJ0cmVlLT5wcmludG9tYXQgPSBzcHJpbnRfcmVhbGxvY19nYXVnZTsKICAgICAgICBicmVhazsKICAgIGNhc2UgVFlQRV9PVEhFUjoKICAgIGRlZmF1bHQ6CiAgICAgICAgc3VidHJlZS0+cHJpbnRvbWF0ID0gc3ByaW50X3JlYWxsb2NfYnlfdHlwZTsKICAgICAgICBicmVhazsKICAgIH0KfQoKI2VuZGlmIC8qIE5FVFNOTVBfRElTQUJMRV9NSUJfTE9BRElORyAqLwoKLyoqCiAqIFJlYWRzIGFuIG9iamVjdCBpZGVudGlmaWVyIGZyb20gYW4gaW5wdXQgc3RyaW5nIGludG8gaW50ZXJuYWwgT0lEIGZvcm0uCiAqIAogKiBXaGVuIGNhbGxlZCwgb3V0X2xlbiBtdXN0IGhvbGQgdGhlIG1heGltdW0gbGVuZ3RoIG9mIHRoZSBvdXRwdXQgYXJyYXkuCiAqCiAqIEBwYXJhbSBpbnB1dCAgICAgdGhlIGlucHV0IHN0cmluZy4KICogQHBhcmFtIG91dHB1dCAgICB0aGUgb2lkIHdpcnRlLgogKiBAcGFyYW0gb3V0X2xlbiAgIG51bWJlciBvZiBzdWJpZCdzIGluIG91dHB1dC4KICogCiAqIEByZXR1cm4gMSBpZiBzdWNjZXNzZnVsLgogKiAKICogSWYgYW4gZXJyb3Igb2NjdXJzLCB0aGlzIGZ1bmN0aW9uIHJldHVybnMgMCBhbmQgTUFZIHNldCBzbm1wX2Vycm5vLgogKiBzbm1wX2Vycm5vIGlzIE5PVCBzZXQgaWYgU0VUX1NOTVBfRVJST1IgZXZhbHVhdGVzIHRvIG5vdGhpbmcuCiAqIFRoaXMgY2FuIG1ha2UgbXVsdGktdGhyZWFkZWQgdXNlIGEgdGlueSBiaXQgbW9yZSByb2J1c3QuCiAqLwppbnQKcmVhZF9vYmppZChjb25zdCBjaGFyICppbnB1dCwgb2lkICogb3V0cHV0LCBzaXplX3QgKiBvdXRfbGVuKQp7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG51bWJlciBvZiBzdWJpZCdzIGluICJvdXRwdXQiICovCiNpZm5kZWYgTkVUU05NUF9ESVNBQkxFX01JQl9MT0FESU5HCiAgICBzdHJ1Y3QgdHJlZSAgICAqcm9vdCA9IHRyZWVfdG9wOwojZW5kaWYgLyogTkVUU05NUF9ESVNBQkxFX01JQl9MT0FESU5HICovCiAgICBjaGFyICAgICAgICAgICAgYnVmW1NQUklOVF9NQVhfTEVOXTsKICAgIGludCAgICAgICAgICAgICByZXQsIG1heF9vdXRfbGVuOwogICAgY2hhciAgICAgICAgICAgKm5hbWUsIGNoOwogICAgY29uc3QgY2hhciAgICAgKmNwOwoKICAgIGNwID0gaW5wdXQ7CiAgICB3aGlsZSAoKGNoID0gKmNwKSkgewogICAgICAgIGlmICgoJzAnIDw9IGNoICYmIGNoIDw9ICc5JykKICAgICAgICAgICAgfHwgKCdhJyA8PSBjaCAmJiBjaCA8PSAneicpCiAgICAgICAgICAgIHx8ICgnQScgPD0gY2ggJiYgY2ggPD0gJ1onKQogICAgICAgICAgICB8fCBjaCA9PSAnLScpCiAgICAgICAgICAgIGNwKys7CiAgICAgICAgZWxzZQogICAgICAgICAgICBicmVhazsKICAgIH0KI2lmbmRlZiBORVRTTk1QX0RJU0FCTEVfTUlCX0xPQURJTkcKICAgIGlmIChjaCA9PSAnOicpCiAgICAgICAgcmV0dXJuIGdldF9ub2RlKGlucHV0LCBvdXRwdXQsIG91dF9sZW4pOwojZW5kaWYgLyogTkVUU05NUF9ESVNBQkxFX01JQl9MT0FESU5HICovCgogICAgaWYgKCppbnB1dCA9PSAnLicpCiAgICAgICAgaW5wdXQrKzsKI2lmbmRlZiBORVRTTk1QX0RJU0FCTEVfTUlCX0xPQURJTkcKICAgIGVsc2UgaWYgKG5ldHNubXBfZHNfZ2V0X2Jvb2xlYW4oTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9SRUFEX1VDRF9TVFlMRV9PSUQpKSB7CiAgICAgICAgLyoKICAgICAgICAgKiBnZXQgcGFzdCBsZWFkaW5nICcuJywgYXBwZW5kICcuJyB0byBQcmVmaXguIAogICAgICAgICAqLwogICAgICAgIGlmICgqUHJlZml4ID09ICcuJykKICAgICAgICAgICAgc3RybGNweShidWYsIFByZWZpeCArIDEsIHNpemVvZihidWYpKTsKICAgICAgICBlbHNlCiAgICAgICAgICAgIHN0cmxjcHkoYnVmLCBQcmVmaXgsIHNpemVvZihidWYpKTsKICAgICAgICBzdHJsY2F0KGJ1ZiwgIi4iLCBzaXplb2YoYnVmKSk7CiAgICAgICAgc3RybGNhdChidWYsIGlucHV0LCBzaXplb2YoYnVmKSk7CiAgICAgICAgaW5wdXQgPSBidWY7CiAgICB9CiNlbmRpZiAvKiBORVRTTk1QX0RJU0FCTEVfTUlCX0xPQURJTkcgKi8KCiNpZm5kZWYgTkVUU05NUF9ESVNBQkxFX01JQl9MT0FESU5HCiAgICBpZiAoKHJvb3QgPT0gTlVMTCkgJiYgKHRyZWVfaGVhZCAhPSBOVUxMKSkgewogICAgICAgIHJvb3QgPSB0cmVlX2hlYWQ7CiAgICB9CiAgICBlbHNlIGlmIChyb290ID09IE5VTEwpIHsKICAgICAgICBTRVRfU05NUF9FUlJPUihTTk1QRVJSX05PTUlCKTsKICAgICAgICAqb3V0X2xlbiA9IDA7CiAgICAgICAgcmV0dXJuIDA7CiAgICB9CiNlbmRpZiAvKiBORVRTTk1QX0RJU0FCTEVfTUlCX0xPQURJTkcgKi8KICAgIG5hbWUgPSBzdHJkdXAoaW5wdXQpOwogICAgbWF4X291dF9sZW4gPSAqb3V0X2xlbjsKICAgICpvdXRfbGVuID0gMDsKI2lmbmRlZiBORVRTTk1QX0RJU0FCTEVfTUlCX0xPQURJTkcKICAgIGlmICgocmV0ID0KICAgICAgICAgX2FkZF9zdHJpbmdzX3RvX29pZChyb290LCBuYW1lLCBvdXRwdXQsIG91dF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4X291dF9sZW4pKSA8PSAwKQojZWxzZQogICAgaWYgKChyZXQgPQogICAgICAgICBfYWRkX3N0cmluZ3NfdG9fb2lkKE5VTEwsIG5hbWUsIG91dHB1dCwgb3V0X2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhfb3V0X2xlbikpIDw9IDApCiNlbmRpZiAvKiBORVRTTk1QX0RJU0FCTEVfTUlCX0xPQURJTkcgKi8KICAgIHsKICAgICAgICBpZiAocmV0ID09IDApCiAgICAgICAgICAgIHJldCA9IFNOTVBFUlJfVU5LTk9XTl9PQkpJRDsKICAgICAgICBTRVRfU05NUF9FUlJPUihyZXQpOwogICAgICAgIFNOTVBfRlJFRShuYW1lKTsKICAgICAgICByZXR1cm4gMDsKICAgIH0KICAgIFNOTVBfRlJFRShuYW1lKTsKCiAgICByZXR1cm4gMTsKfQoKLyoqCiAqIAogKi8Kdm9pZApuZXRzbm1wX3NwcmludF9yZWFsbG9jX29iamlkKHVfY2hhciAqKiBidWYsIHNpemVfdCAqIGJ1Zl9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICogb3V0X2xlbiwgaW50IGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpidWZfb3ZlcmZsb3csCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgb2lkICogb2JqaWQsIHNpemVfdCBvYmppZGxlbikKewogICAgdV9jaGFyICAgICAgICAgKnRidWYgPSBOVUxMLCAqY3AgPSBOVUxMOwogICAgc2l6ZV90ICAgICAgICAgIHRidWZfbGVuID0gMjU2LCB0b3V0X2xlbiA9IDA7CiAgICBpbnQgICAgICAgICAgICAgdGJ1Zl9vdmVyZmxvdyA9IDA7CiAgICBpbnQgICAgICAgICAgICAgb3V0cHV0X2Zvcm1hdDsKCiAgICBpZiAoKHRidWYgPSAodV9jaGFyICopIGNhbGxvYyh0YnVmX2xlbiwgMSkpID09IE5VTEwpIHsKICAgICAgICB0YnVmX292ZXJmbG93ID0gMTsKICAgIH0gZWxzZSB7CiAgICAgICAgKnRidWYgPSAnLic7CiAgICAgICAgdG91dF9sZW4gPSAxOwogICAgfQoKICAgIF9vaWRfZmluaXNoX3ByaW50aW5nKG9iamlkLCBvYmppZGxlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICZ0YnVmLCAmdGJ1Zl9sZW4sICZ0b3V0X2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93X3JlYWxsb2MsICZ0YnVmX292ZXJmbG93KTsKCiAgICBpZiAodGJ1Zl9vdmVyZmxvdykgewogICAgICAgIGlmICghKmJ1Zl9vdmVyZmxvdykgewogICAgICAgICAgICBzbm1wX3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsIHRidWYpOwogICAgICAgICAgICAqYnVmX292ZXJmbG93ID0gMTsKICAgICAgICB9CiAgICAgICAgU05NUF9GUkVFKHRidWYpOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICBvdXRwdXRfZm9ybWF0ID0gbmV0c25tcF9kc19nZXRfaW50KE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfT0lEX09VVFBVVF9GT1JNQVQpOwogICAgaWYgKDAgPT0gb3V0cHV0X2Zvcm1hdCkgewogICAgICAgIG91dHB1dF9mb3JtYXQgPSBORVRTTk1QX09JRF9PVVRQVVRfTlVNRVJJQzsKICAgIH0KICAgIHN3aXRjaCAob3V0cHV0X2Zvcm1hdCkgewogICAgY2FzZSBORVRTTk1QX09JRF9PVVRQVVRfRlVMTDoKICAgIGNhc2UgTkVUU05NUF9PSURfT1VUUFVUX05VTUVSSUM6CiAgICBjYXNlIE5FVFNOTVBfT0lEX09VVFBVVF9TVUZGSVg6CiAgICBjYXNlIE5FVFNOTVBfT0lEX09VVFBVVF9NT0RVTEU6CiAgICAgICAgY3AgPSB0YnVmOwogICAgICAgIGJyZWFrOwoKICAgIGNhc2UgTkVUU05NUF9PSURfT1VUUFVUX05PTkU6CiAgICBkZWZhdWx0OgogICAgICAgIGNwID0gTlVMTDsKICAgIH0KCiAgICBpZiAoISpidWZfb3ZlcmZsb3cgJiYKICAgICAgICAhc25tcF9zdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCBjcCkpIHsKICAgICAgICAqYnVmX292ZXJmbG93ID0gMTsKICAgIH0KICAgIFNOTVBfRlJFRSh0YnVmKTsKfQoKLyoqCiAqIAogKi8KI2lmZGVmIE5FVFNOTVBfRElTQUJMRV9NSUJfTE9BRElORwp2b2lkCm5ldHNubXBfc3ByaW50X3JlYWxsb2Nfb2JqaWRfdHJlZSh1X2NoYXIgKiogYnVmLCBzaXplX3QgKiBidWZfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICogb3V0X2xlbiwgaW50IGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmJ1Zl9vdmVyZmxvdywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG9pZCAqIG9iamlkLCBzaXplX3Qgb2JqaWRsZW4pCnsKICAgIG5ldHNubXBfc3ByaW50X3JlYWxsb2Nfb2JqaWQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZfb3ZlcmZsb3csIG9iamlkLCBvYmppZGxlbik7Cn0KI2Vsc2UKc3RydWN0IHRyZWUgICAgKgpuZXRzbm1wX3NwcmludF9yZWFsbG9jX29iamlkX3RyZWUodV9jaGFyICoqIGJ1Ziwgc2l6ZV90ICogYnVmX2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAqIG91dF9sZW4sIGludCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpidWZfb3ZlcmZsb3csCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBvaWQgKiBvYmppZCwgc2l6ZV90IG9iamlkbGVuKQp7CiAgICB1X2NoYXIgICAgICAgICAqdGJ1ZiA9IE5VTEwsICpjcCA9IE5VTEw7CiAgICBzaXplX3QgICAgICAgICAgdGJ1Zl9sZW4gPSA1MTIsIHRvdXRfbGVuID0gMDsKICAgIHN0cnVjdCB0cmVlICAgICpzdWJ0cmVlID0gdHJlZV9oZWFkOwogICAgc2l6ZV90ICAgICAgICAgIG1pZHBvaW50X29mZnNldCA9IDA7CiAgICBpbnQgICAgICAgICAgICAgdGJ1Zl9vdmVyZmxvdyA9IDA7CiAgICBpbnQgICAgICAgICAgICAgb3V0cHV0X2Zvcm1hdDsKCiAgICBpZiAoKHRidWYgPSAodV9jaGFyICopIGNhbGxvYyh0YnVmX2xlbiwgMSkpID09IE5VTEwpIHsKICAgICAgICB0YnVmX292ZXJmbG93ID0gMTsKICAgIH0gZWxzZSB7CiAgICAgICAgKnRidWYgPSAnLic7CiAgICAgICAgdG91dF9sZW4gPSAxOwogICAgfQoKICAgIHN1YnRyZWUgPSBfZ2V0X3JlYWxsb2Nfc3ltYm9sKG9iamlkLCBvYmppZGxlbiwgc3VidHJlZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0YnVmLCAmdGJ1Zl9sZW4sICZ0b3V0X2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93X3JlYWxsb2MsICZ0YnVmX292ZXJmbG93LCBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1pZHBvaW50X29mZnNldCk7CgogICAgaWYgKHRidWZfb3ZlcmZsb3cpIHsKICAgICAgICBpZiAoISpidWZfb3ZlcmZsb3cpIHsKICAgICAgICAgICAgc25tcF9zdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCB0YnVmKTsKICAgICAgICAgICAgKmJ1Zl9vdmVyZmxvdyA9IDE7CiAgICAgICAgfQogICAgICAgIFNOTVBfRlJFRSh0YnVmKTsKICAgICAgICByZXR1cm4gc3VidHJlZTsKICAgIH0KCiAgICBvdXRwdXRfZm9ybWF0ID0gbmV0c25tcF9kc19nZXRfaW50KE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfT0lEX09VVFBVVF9GT1JNQVQpOwogICAgaWYgKDAgPT0gb3V0cHV0X2Zvcm1hdCkgewogICAgICAgIG91dHB1dF9mb3JtYXQgPSBORVRTTk1QX09JRF9PVVRQVVRfTU9EVUxFOwogICAgfQogICAgc3dpdGNoIChvdXRwdXRfZm9ybWF0KSB7CiAgICBjYXNlIE5FVFNOTVBfT0lEX09VVFBVVF9GVUxMOgogICAgY2FzZSBORVRTTk1QX09JRF9PVVRQVVRfTlVNRVJJQzoKICAgICAgICBjcCA9IHRidWY7CiAgICAgICAgYnJlYWs7CgogICAgY2FzZSBORVRTTk1QX09JRF9PVVRQVVRfU1VGRklYOgogICAgY2FzZSBORVRTTk1QX09JRF9PVVRQVVRfTU9EVUxFOgogICAgICAgIGZvciAoY3AgPSB0YnVmOyAqY3A7IGNwKyspOwoKICAgICAgICBpZiAobWlkcG9pbnRfb2Zmc2V0ICE9IDApIHsKICAgICAgICAgICAgY3AgPSB0YnVmICsgbWlkcG9pbnRfb2Zmc2V0IC0gMjsgICAgLyogIGJleW9uZCB0aGUgJy4nICAqLwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHdoaWxlIChjcCA+PSB0YnVmKSB7CiAgICAgICAgICAgICAgICBpZiAoaXNhbHBoYSgqY3ApKSB7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjcC0tOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICB3aGlsZSAoY3AgPj0gdGJ1ZikgewogICAgICAgICAgICBpZiAoKmNwID09ICcuJykgewogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY3AtLTsKICAgICAgICB9CgogICAgICAgIGNwKys7CgogICAgICAgIGlmICgoTkVUU05NUF9PSURfT1VUUFVUX01PRFVMRSA9PSBvdXRwdXRfZm9ybWF0KQogICAgICAgICAgICAmJiBjcCA+IHRidWYpIHsKICAgICAgICAgICAgY2hhciAgICAgICAgICAgIG1vZGJ1ZlsyNTZdID0geyAwIH0sICptb2QgPQogICAgICAgICAgICAgICAgbW9kdWxlX25hbWUoc3VidHJlZS0+bW9kaWQsIG1vZGJ1Zik7CgogICAgICAgICAgICAvKgogICAgICAgICAgICAgKiBEb24ndCBhZGQgdGhlIG1vZHVsZSBJRCBpZiBpdCdzIGp1c3QgbnVtZXJpYyAoaS5lLiB3ZSBjb3VsZG4ndCBsb29rCiAgICAgICAgICAgICAqIGl0IHVwIHByb3Blcmx5LiAgCiAgICAgICAgICAgICAqLwoKICAgICAgICAgICAgaWYgKCEqYnVmX292ZXJmbG93ICYmIG1vZGJ1ZlswXSAhPSAnIycpIHsKICAgICAgICAgICAgICAgIGlmICghc25tcF9zdHJjYXQKICAgICAgICAgICAgICAgICAgICAoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAoY29uc3QgdV9jaGFyICopIG1vZCkKICAgICAgICAgICAgICAgICAgICB8fCAhc25tcF9zdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgdV9jaGFyICopICI6OiIpKSB7CiAgICAgICAgICAgICAgICAgICAgKmJ1Zl9vdmVyZmxvdyA9IDE7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgYnJlYWs7CgogICAgY2FzZSBORVRTTk1QX09JRF9PVVRQVVRfVUNEOgogICAgewogICAgICAgIFByZWZpeExpc3RQdHIgICBwcCA9ICZtaWJfcHJlZml4ZXNbMF07CiAgICAgICAgc2l6ZV90ICAgICAgICAgIGlsZW4sIHRsZW47CiAgICAgICAgY29uc3QgY2hhciAgICAgKnRlc3RjcDsKCiAgICAgICAgY3AgPSB0YnVmOwogICAgICAgIHRsZW4gPSBzdHJsZW4oKGNoYXIgKikgdGJ1Zik7CgogICAgICAgIHdoaWxlIChwcC0+c3RyKSB7CiAgICAgICAgICAgIGlsZW4gPSBwcC0+bGVuOwogICAgICAgICAgICB0ZXN0Y3AgPSBwcC0+c3RyOwoKICAgICAgICAgICAgaWYgKCh0bGVuID4gaWxlbikgJiYgbWVtY21wKHRidWYsIHRlc3RjcCwgaWxlbikgPT0gMCkgewogICAgICAgICAgICAgICAgY3AgKz0gKGlsZW4gKyAxKTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHBwKys7CiAgICAgICAgfQogICAgICAgIGJyZWFrOwogICAgfQoKICAgIGNhc2UgTkVUU05NUF9PSURfT1VUUFVUX05PTkU6CiAgICBkZWZhdWx0OgogICAgICAgIGNwID0gTlVMTDsKICAgIH0KCiAgICBpZiAoISpidWZfb3ZlcmZsb3cgJiYKICAgICAgICAhc25tcF9zdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCBjcCkpIHsKICAgICAgICAqYnVmX292ZXJmbG93ID0gMTsKICAgIH0KICAgIFNOTVBfRlJFRSh0YnVmKTsKICAgIHJldHVybiBzdWJ0cmVlOwp9CiNlbmRpZiAvKiBORVRTTk1QX0RJU0FCTEVfTUlCX0xPQURJTkcgKi8KCmludApzcHJpbnRfcmVhbGxvY19vYmppZCh1X2NoYXIgKiogYnVmLCBzaXplX3QgKiBidWZfbGVuLAogICAgICAgICAgICAgICAgICAgICBzaXplX3QgKiBvdXRfbGVuLCBpbnQgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgY29uc3Qgb2lkICogb2JqaWQsIHNpemVfdCBvYmppZGxlbikKewogICAgaW50ICAgICAgICAgICAgIGJ1Zl9vdmVyZmxvdyA9IDA7CgogICAgbmV0c25tcF9zcHJpbnRfcmVhbGxvY19vYmppZF90cmVlKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYnVmX292ZXJmbG93LCBvYmppZCwgb2JqaWRsZW4pOwogICAgcmV0dXJuICFidWZfb3ZlcmZsb3c7Cn0KCmludApzbnByaW50X29iamlkKGNoYXIgKmJ1Ziwgc2l6ZV90IGJ1Zl9sZW4sCiAgICAgICAgICAgICAgY29uc3Qgb2lkICogb2JqaWQsIHNpemVfdCBvYmppZGxlbikKewogICAgc2l6ZV90ICAgICAgICAgIG91dF9sZW4gPSAwOwoKICAgIGlmIChzcHJpbnRfcmVhbGxvY19vYmppZCgodV9jaGFyICoqKSAmIGJ1ZiwgJmJ1Zl9sZW4sICZvdXRfbGVuLCAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamlkLCBvYmppZGxlbikpIHsKICAgICAgICByZXR1cm4gKGludCkgb3V0X2xlbjsKICAgIH0gZWxzZSB7CiAgICAgICAgcmV0dXJuIC0xOwogICAgfQp9CgovKioKICogUHJpbnRzIGFuIG9pZCB0byBzdGRvdXQuCiAqCiAqIEBwYXJhbSBvYmppZCAgICAgIFRoZSBvaWQgdG8gcHJpbnQKICogQHBhcmFtIG9iamlkbGVuICAgVGhlIGxlbmd0aCBvZiBvaWRpZC4KICovCnZvaWQKcHJpbnRfb2JqaWQoY29uc3Qgb2lkICogb2JqaWQsIHNpemVfdCBvYmppZGxlbikKeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBudW1iZXIgb2Ygc3ViaWRlbnRpZmllcnMgKi8KICAgIGZwcmludF9vYmppZChzdGRvdXQsIG9iamlkLCBvYmppZGxlbik7Cn0KCgovKioKICogUHJpbnRzIGFuIG9pZCB0byBhIGZpbGUgZGVzY3JpcHRvci4KICoKICogQHBhcmFtIGYgICAgICAgICAgVGhlIGZpbGUgZGVzY3JpcHRvciB0byBwcmludCB0by4KICogQHBhcmFtIG9iamlkICAgICAgVGhlIG9pZCB0byBwcmludAogKiBAcGFyYW0gb2JqaWRsZW4gICBUaGUgbGVuZ3RoIG9mIG9pZGlkLgogKi8Kdm9pZApmcHJpbnRfb2JqaWQoRklMRSAqIGYsIGNvbnN0IG9pZCAqIG9iamlkLCBzaXplX3Qgb2JqaWRsZW4pCnsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIHN1YmlkZW50aWZpZXJzICovCiAgICB1X2NoYXIgICAgICAgICAqYnVmID0gTlVMTDsKICAgIHNpemVfdCAgICAgICAgICBidWZfbGVuID0gMjU2LCBvdXRfbGVuID0gMDsKICAgIGludCAgICAgICAgICAgICBidWZfb3ZlcmZsb3cgPSAwOwoKICAgIGlmICgoYnVmID0gKHVfY2hhciAqKSBjYWxsb2MoYnVmX2xlbiwgMSkpID09IE5VTEwpIHsKICAgICAgICBmcHJpbnRmKGYsICJbVFJVTkNBVEVEXVxuIik7CiAgICAgICAgcmV0dXJuOwogICAgfSBlbHNlIHsKICAgICAgICBuZXRzbm1wX3NwcmludF9yZWFsbG9jX29iamlkX3RyZWUoJmJ1ZiwgJmJ1Zl9sZW4sICZvdXRfbGVuLCAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYnVmX292ZXJmbG93LCBvYmppZCwgb2JqaWRsZW4pOwogICAgICAgIGlmIChidWZfb3ZlcmZsb3cpIHsKICAgICAgICAgICAgZnByaW50ZihmLCAiJXMgW1RSVU5DQVRFRF1cbiIsIGJ1Zik7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgZnByaW50ZihmLCAiJXNcbiIsIGJ1Zik7CiAgICAgICAgfQogICAgfQoKICAgIFNOTVBfRlJFRShidWYpOwp9CgppbnQKc3ByaW50X3JlYWxsb2NfdmFyaWFibGUodV9jaGFyICoqIGJ1Ziwgc2l6ZV90ICogYnVmX2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICogb3V0X2xlbiwgaW50IGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG9pZCAqIG9iamlkLCBzaXplX3Qgb2JqaWRsZW4sCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5ldHNubXBfdmFyaWFibGVfbGlzdCAqIHZhcmlhYmxlKQp7CiAgICBpbnQgICAgICAgICAgICAgYnVmX292ZXJmbG93ID0gMDsKCiNpZm5kZWYgTkVUU05NUF9ESVNBQkxFX01JQl9MT0FESU5HCiAgICBzdHJ1Y3QgdHJlZSAgICAqc3VidHJlZSA9IHRyZWVfaGVhZDsKCiAgICBzdWJ0cmVlID0KI2VuZGlmIC8qIE5FVFNOTVBfRElTQUJMRV9NSUJfTE9BRElORyAqLwogICAgICAgIG5ldHNubXBfc3ByaW50X3JlYWxsb2Nfb2JqaWRfdHJlZShidWYsIGJ1Zl9sZW4sIG91dF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93X3JlYWxsb2MsICZidWZfb3ZlcmZsb3csCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamlkLCBvYmppZGxlbik7CgogICAgaWYgKGJ1Zl9vdmVyZmxvdykgewogICAgICAgIHJldHVybiAwOwogICAgfQogICAgaWYgKCFuZXRzbm1wX2RzX2dldF9ib29sZWFuKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfUFJJTlRfQkFSRV9WQUxVRSkpIHsKICAgICAgICBpZiAobmV0c25tcF9kc19nZXRfYm9vbGVhbihORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX1FVSUNLRV9QUklOVCkpIHsKICAgICAgICAgICAgaWYgKCFzbm1wX3N0cmNhdAogICAgICAgICAgICAgICAgKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAoY29uc3QgdV9jaGFyICopICIgPSAiKSkgewogICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBpZiAobmV0c25tcF9kc19nZXRfYm9vbGVhbihORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX1FVSUNLX1BSSU5UKSkgewogICAgICAgICAgICAgICAgaWYgKCFzbm1wX3N0cmNhdAogICAgICAgICAgICAgICAgICAgIChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgIChjb25zdCB1X2NoYXIgKikgIiAiKSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgaWYgKCFzbm1wX3N0cmNhdAogICAgICAgICAgICAgICAgICAgIChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgIChjb25zdCB1X2NoYXIgKikgIiA9ICIpKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgLyogZW5kIGlmLWVsc2UgTkVUU05NUF9EU19MSUJfUVVJQ0tfUFJJTlQgKi8KICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAvKiBlbmQgaWYtZWxzZSBORVRTTk1QX0RTX0xJQl9RVUlDS0VfUFJJTlQgKi8KICAgIH0gZWxzZSB7CiAgICAgICAgKm91dF9sZW4gPSAwOwogICAgfQoKICAgIGlmICh2YXJpYWJsZS0+dHlwZSA9PSBTTk1QX05PU1VDSE9CSkVDVCkgewogICAgICAgIHJldHVybiBzbm1wX3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCB1X2NoYXIgKikKICAgICAgICAgICAgICAgICAgICAgICAgICAgIk5vIFN1Y2ggT2JqZWN0IGF2YWlsYWJsZSBvbiB0aGlzIGFnZW50IGF0IHRoaXMgT0lEIik7CiAgICB9IGVsc2UgaWYgKHZhcmlhYmxlLT50eXBlID09IFNOTVBfTk9TVUNISU5TVEFOQ0UpIHsKICAgICAgICByZXR1cm4gc25tcF9zdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgdV9jaGFyICopCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJObyBTdWNoIEluc3RhbmNlIGN1cnJlbnRseSBleGlzdHMgYXQgdGhpcyBPSUQiKTsKICAgIH0gZWxzZSBpZiAodmFyaWFibGUtPnR5cGUgPT0gU05NUF9FTkRPRk1JQlZJRVcpIHsKICAgICAgICByZXR1cm4gc25tcF9zdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgdV9jaGFyICopCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJObyBtb3JlIHZhcmlhYmxlcyBsZWZ0IGluIHRoaXMgTUlCIFZpZXcgKEl0IGlzIHBhc3QgdGhlIGVuZCBvZiB0aGUgTUlCIHRyZWUpIik7CiNpZm5kZWYgTkVUU05NUF9ESVNBQkxFX01JQl9MT0FESU5HCiAgICB9IGVsc2UgaWYgKHN1YnRyZWUpIHsKICAgICAgICBjb25zdCBjaGFyICp1bml0cyA9IE5VTEw7CiAgICAgICAgY29uc3QgY2hhciAqaGludCA9IE5VTEw7CiAgICAgICAgaWYgKCFuZXRzbm1wX2RzX2dldF9ib29sZWFuKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkVUU05NUF9EU19MSUJfRE9OVF9QUklOVF9VTklUUykpIHsKICAgICAgICAgICAgdW5pdHMgPSBzdWJ0cmVlLT51bml0czsKICAgICAgICB9CgoJCWlmICghbmV0c25tcF9kc19nZXRfYm9vbGVhbihORVRTTk1QX0RTX0xJQlJBUllfSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5FVFNOTVBfRFNfTElCX05PX0RJU1BMQVlfSElOVCkpIHsKCQkJaGludCA9IHN1YnRyZWUtPmhpbnQ7CiAgICAgICAgfQoKICAgICAgICBpZiAoc3VidHJlZS0+cHJpbnRvbWF0KSB7CiAgICAgICAgICAgIHJldHVybiAoKnN1YnRyZWUtPnByaW50b21hdCkgKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dfcmVhbGxvYywgdmFyaWFibGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YnRyZWUtPmVudW1zLCBoaW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bml0cyk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcmV0dXJuIHNwcmludF9yZWFsbG9jX2J5X3R5cGUoYnVmLCBidWZfbGVuLCBvdXRfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd19yZWFsbG9jLCB2YXJpYWJsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VidHJlZS0+ZW51bXMsIGhpbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaXRzKTsKICAgICAgICB9CiNlbmRpZiAvKiBORVRTTk1QX0RJU0FCTEVfTUlCX0xPQURJTkcgKi8KICAgIH0gZWxzZSB7CiAgICAgICAgLyoKICAgICAgICAgKiBIYW5kbGUgcmFyZSBjYXNlIHdoZXJlIHRyZWUgaXMgZW1wdHkuICAKICAgICAgICAgKi8KICAgICAgICByZXR1cm4gc3ByaW50X3JlYWxsb2NfYnlfdHlwZShidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFibGUsIDAsIDAsIDApOwogICAgfQp9CgppbnQKc25wcmludF92YXJpYWJsZShjaGFyICpidWYsIHNpemVfdCBidWZfbGVuLAogICAgICAgICAgICAgICAgIGNvbnN0IG9pZCAqIG9iamlkLCBzaXplX3Qgb2JqaWRsZW4sCiAgICAgICAgICAgICAgICAgY29uc3QgbmV0c25tcF92YXJpYWJsZV9saXN0ICogdmFyaWFibGUpCnsKICAgIHNpemVfdCAgICAgICAgICBvdXRfbGVuID0gMDsKCiAgICBpZiAoc3ByaW50X3JlYWxsb2NfdmFyaWFibGUoKHVfY2hhciAqKikgJiBidWYsICZidWZfbGVuLCAmb3V0X2xlbiwgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmppZCwgb2JqaWRsZW4sIHZhcmlhYmxlKSkgewogICAgICAgIHJldHVybiAoaW50KSBvdXRfbGVuOwogICAgfSBlbHNlIHsKICAgICAgICByZXR1cm4gLTE7CiAgICB9Cn0KCi8qKgogKiBQcmludHMgYSB2YXJpYWJsZSB0byBzdGRvdXQuCiAqCiAqIEBwYXJhbSBvYmppZCAgICAgVGhlIG9iamVjdCBpZC4KICogQHBhcmFtIG9iamlkbGVuICBUaGUgbGVuZ3RoIG9mIHRlaCBvYmplY3QgaWQuCiAqIEBwYXJhbSB2YXJpYWJsZSAgVGhlIHZhcmlhYmxlIHRvIHByaW50LgogKi8Kdm9pZApwcmludF92YXJpYWJsZShjb25zdCBvaWQgKiBvYmppZCwKICAgICAgICAgICAgICAgc2l6ZV90IG9iamlkbGVuLCBjb25zdCBuZXRzbm1wX3ZhcmlhYmxlX2xpc3QgKiB2YXJpYWJsZSkKewogICAgZnByaW50X3ZhcmlhYmxlKHN0ZG91dCwgb2JqaWQsIG9iamlkbGVuLCB2YXJpYWJsZSk7Cn0KCgovKioKICogUHJpbnRzIGEgdmFyaWFibGUgdG8gYSBmaWxlIGRlc2NyaXB0b3IuCiAqCiAqIEBwYXJhbSBmICAgICAgICAgVGhlIGZpbGUgZGVzY3JpcHRvciB0byBwcmludCB0by4KICogQHBhcmFtIG9iamlkICAgICBUaGUgb2JqZWN0IGlkLgogKiBAcGFyYW0gb2JqaWRsZW4gIFRoZSBsZW5ndGggb2YgdGVoIG9iamVjdCBpZC4KICogQHBhcmFtIHZhcmlhYmxlICBUaGUgdmFyaWFibGUgdG8gcHJpbnQuCiAqLwp2b2lkCmZwcmludF92YXJpYWJsZShGSUxFICogZiwKICAgICAgICAgICAgICAgIGNvbnN0IG9pZCAqIG9iamlkLAogICAgICAgICAgICAgICAgc2l6ZV90IG9iamlkbGVuLCBjb25zdCBuZXRzbm1wX3ZhcmlhYmxlX2xpc3QgKiB2YXJpYWJsZSkKewogICAgdV9jaGFyICAgICAgICAgKmJ1ZiA9IE5VTEw7CiAgICBzaXplX3QgICAgICAgICAgYnVmX2xlbiA9IDI1Niwgb3V0X2xlbiA9IDA7CgogICAgaWYgKChidWYgPSAodV9jaGFyICopIGNhbGxvYyhidWZfbGVuLCAxKSkgPT0gTlVMTCkgewogICAgICAgIGZwcmludGYoZiwgIltUUlVOQ0FURURdXG4iKTsKICAgICAgICByZXR1cm47CiAgICB9IGVsc2UgewogICAgICAgIGlmIChzcHJpbnRfcmVhbGxvY192YXJpYWJsZSgmYnVmLCAmYnVmX2xlbiwgJm91dF9sZW4sIDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamlkLCBvYmppZGxlbiwgdmFyaWFibGUpKSB7CiAgICAgICAgICAgIGZwcmludGYoZiwgIiVzXG4iLCBidWYpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGZwcmludGYoZiwgIiVzIFtUUlVOQ0FURURdXG4iLCBidWYpOwogICAgICAgIH0KICAgIH0KCiAgICBTTk1QX0ZSRUUoYnVmKTsKfQoKaW50CnNwcmludF9yZWFsbG9jX3ZhbHVlKHVfY2hhciAqKiBidWYsIHNpemVfdCAqIGJ1Zl9sZW4sCiAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAqIG91dF9sZW4sIGludCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICBjb25zdCBvaWQgKiBvYmppZCwgc2l6ZV90IG9iamlkbGVuLAogICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXRzbm1wX3ZhcmlhYmxlX2xpc3QgKiB2YXJpYWJsZSkKewogICAgaWYgKHZhcmlhYmxlLT50eXBlID09IFNOTVBfTk9TVUNIT0JKRUNUKSB7CiAgICAgICAgcmV0dXJuIHNubXBfc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IHVfY2hhciAqKQogICAgICAgICAgICAgICAgICAgICAgICAgICAiTm8gU3VjaCBPYmplY3QgYXZhaWxhYmxlIG9uIHRoaXMgYWdlbnQgYXQgdGhpcyBPSUQiKTsKICAgIH0gZWxzZSBpZiAodmFyaWFibGUtPnR5cGUgPT0gU05NUF9OT1NVQ0hJTlNUQU5DRSkgewogICAgICAgIHJldHVybiBzbm1wX3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCB1X2NoYXIgKikKICAgICAgICAgICAgICAgICAgICAgICAgICAgIk5vIFN1Y2ggSW5zdGFuY2UgY3VycmVudGx5IGV4aXN0cyBhdCB0aGlzIE9JRCIpOwogICAgfSBlbHNlIGlmICh2YXJpYWJsZS0+dHlwZSA9PSBTTk1QX0VORE9GTUlCVklFVykgewogICAgICAgIHJldHVybiBzbm1wX3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCB1X2NoYXIgKikKICAgICAgICAgICAgICAgICAgICAgICAgICAgIk5vIG1vcmUgdmFyaWFibGVzIGxlZnQgaW4gdGhpcyBNSUIgVmlldyAoSXQgaXMgcGFzdCB0aGUgZW5kIG9mIHRoZSBNSUIgdHJlZSkiKTsKICAgIH0gZWxzZSB7CiNpZm5kZWYgTkVUU05NUF9ESVNBQkxFX01JQl9MT0FESU5HCiAgICAgICAgY29uc3QgY2hhciAqdW5pdHMgPSBOVUxMOwogICAgICAgIHN0cnVjdCB0cmVlICpzdWJ0cmVlID0gdHJlZV9oZWFkOwoJc3VidHJlZSA9IGdldF90cmVlKG9iamlkLCBvYmppZGxlbiwgc3VidHJlZSk7CiAgICAgICAgaWYgKHN1YnRyZWUgJiYgIW5ldHNubXBfZHNfZ2V0X2Jvb2xlYW4oTkVUU05NUF9EU19MSUJSQVJZX0lELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5FVFNOTVBfRFNfTElCX0RPTlRfUFJJTlRfVU5JVFMpKSB7CiAgICAgICAgICAgIHVuaXRzID0gc3VidHJlZS0+dW5pdHM7CiAgICAgICAgfQogICAgICAgIGlmIChzdWJ0cmVlKSB7CgkgICAgaWYoc3VidHJlZS0+cHJpbnRvbWF0KSB7CgkJcmV0dXJuICgqc3VidHJlZS0+cHJpbnRvbWF0KSAoYnVmLCBidWZfbGVuLCBvdXRfbGVuLAoJCQkJCSAgICAgIGFsbG93X3JlYWxsb2MsIHZhcmlhYmxlLAoJCQkJCSAgICAgIHN1YnRyZWUtPmVudW1zLCBzdWJ0cmVlLT5oaW50LAoJCQkJCSAgICAgIHVuaXRzKTsKCSAgICB9IGVsc2UgewoJCXJldHVybiBzcHJpbnRfcmVhbGxvY19ieV90eXBlKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwKCQkJCQkgICAgICBhbGxvd19yZWFsbG9jLCB2YXJpYWJsZSwKCQkJCQkgICAgICBzdWJ0cmVlLT5lbnVtcywgc3VidHJlZS0+aGludCwKCQkJCQkgICAgICB1bml0cyk7CgkgICAgfQoJfQojZW5kaWYgLyogTkVUU05NUF9ESVNBQkxFX01JQl9MT0FESU5HICovCiAgICAgICAgcmV0dXJuIHNwcmludF9yZWFsbG9jX2J5X3R5cGUoYnVmLCBidWZfbGVuLCBvdXRfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93X3JlYWxsb2MsIHZhcmlhYmxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIE5VTEwsIE5VTEwpOwogICAgfQp9CgppbnQKc25wcmludF92YWx1ZShjaGFyICpidWYsIHNpemVfdCBidWZfbGVuLAogICAgICAgICAgICAgIGNvbnN0IG9pZCAqIG9iamlkLCBzaXplX3Qgb2JqaWRsZW4sCiAgICAgICAgICAgICAgY29uc3QgbmV0c25tcF92YXJpYWJsZV9saXN0ICogdmFyaWFibGUpCnsKICAgIHNpemVfdCAgICAgICAgICBvdXRfbGVuID0gMDsKCiAgICBpZiAoc3ByaW50X3JlYWxsb2NfdmFsdWUoKHVfY2hhciAqKikgJiBidWYsICZidWZfbGVuLCAmb3V0X2xlbiwgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmppZCwgb2JqaWRsZW4sIHZhcmlhYmxlKSkgewogICAgICAgIHJldHVybiAoaW50KSBvdXRfbGVuOwogICAgfSBlbHNlIHsKICAgICAgICByZXR1cm4gLTE7CiAgICB9Cn0KCnZvaWQKcHJpbnRfdmFsdWUoY29uc3Qgb2lkICogb2JqaWQsCiAgICAgICAgICAgIHNpemVfdCBvYmppZGxlbiwgY29uc3QgbmV0c25tcF92YXJpYWJsZV9saXN0ICogdmFyaWFibGUpCnsKICAgIGZwcmludF92YWx1ZShzdGRvdXQsIG9iamlkLCBvYmppZGxlbiwgdmFyaWFibGUpOwp9Cgp2b2lkCmZwcmludF92YWx1ZShGSUxFICogZiwKICAgICAgICAgICAgIGNvbnN0IG9pZCAqIG9iamlkLAogICAgICAgICAgICAgc2l6ZV90IG9iamlkbGVuLCBjb25zdCBuZXRzbm1wX3ZhcmlhYmxlX2xpc3QgKiB2YXJpYWJsZSkKewogICAgdV9jaGFyICAgICAgICAgKmJ1ZiA9IE5VTEw7CiAgICBzaXplX3QgICAgICAgICAgYnVmX2xlbiA9IDI1Niwgb3V0X2xlbiA9IDA7CgogICAgaWYgKChidWYgPSAodV9jaGFyICopIGNhbGxvYyhidWZfbGVuLCAxKSkgPT0gTlVMTCkgewogICAgICAgIGZwcmludGYoZiwgIltUUlVOQ0FURURdXG4iKTsKICAgICAgICByZXR1cm47CiAgICB9IGVsc2UgewogICAgICAgIGlmIChzcHJpbnRfcmVhbGxvY192YWx1ZSgmYnVmLCAmYnVmX2xlbiwgJm91dF9sZW4sIDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamlkLCBvYmppZGxlbiwgdmFyaWFibGUpKSB7CiAgICAgICAgICAgIGZwcmludGYoZiwgIiVzXG4iLCBidWYpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGZwcmludGYoZiwgIiVzIFtUUlVOQ0FURURdXG4iLCBidWYpOwogICAgICAgIH0KICAgIH0KCiAgICBTTk1QX0ZSRUUoYnVmKTsKfQoKCi8qKgogKiBUYWtlcyB0aGUgdmFsdWUgaW4gVkFSIGFuZCB0dXJucyBpdCBpbnRvIGFuIE9JRCBzZWdtZW50IGluIHZhci0+bmFtZS4KICogIAogKiBAcGFyYW0gdmFyICAgIFRoZSB2YXJpYWJsZS4KICoKICogQHJldHVybiBTTk1QRVJSX1NVQ0NFU1Mgb3IgU05NUEVSUl9HRU5FUlIgCiAqLwppbnQKYnVpbGRfb2lkX3NlZ21lbnQobmV0c25tcF92YXJpYWJsZV9saXN0ICogdmFyKQp7CiAgICBpbnQgICAgICAgICAgICAgaTsKICAgIHVpbnQzMl90ICAgICAgICBpcGFkZHI7CgogICAgaWYgKHZhci0+bmFtZSAmJiB2YXItPm5hbWUgIT0gdmFyLT5uYW1lX2xvYykKICAgICAgICBTTk1QX0ZSRUUodmFyLT5uYW1lKTsKICAgIHN3aXRjaCAodmFyLT50eXBlKSB7CiAgICBjYXNlIEFTTl9JTlRFR0VSOgogICAgY2FzZSBBU05fQ09VTlRFUjoKICAgIGNhc2UgQVNOX0dBVUdFOgogICAgY2FzZSBBU05fVElNRVRJQ0tTOgogICAgICAgIHZhci0+bmFtZV9sZW5ndGggPSAxOwogICAgICAgIHZhci0+bmFtZSA9IHZhci0+bmFtZV9sb2M7CiAgICAgICAgdmFyLT5uYW1lWzBdID0gKih2YXItPnZhbC5pbnRlZ2VyKTsKICAgICAgICBicmVhazsKCiAgICBjYXNlIEFTTl9JUEFERFJFU1M6CiAgICAgICAgdmFyLT5uYW1lX2xlbmd0aCA9IDQ7CiAgICAgICAgdmFyLT5uYW1lID0gdmFyLT5uYW1lX2xvYzsKICAgICAgICBtZW1jcHkoJmlwYWRkciwgdmFyLT52YWwuc3RyaW5nLCBzaXplb2YoaXBhZGRyKSk7CiAgICAgICAgdmFyLT5uYW1lWzBdID0gKGlwYWRkciA+PiAyNCkgJiAweGZmOwogICAgICAgIHZhci0+bmFtZVsxXSA9IChpcGFkZHIgPj4gMTYpICYgMHhmZjsKICAgICAgICB2YXItPm5hbWVbMl0gPSAoaXBhZGRyID4+ICA4KSAmIDB4ZmY7CiAgICAgICAgdmFyLT5uYW1lWzNdID0gKGlwYWRkciA+PiAgMCkgJiAweGZmOwogICAgICAgIGJyZWFrOwogICAgICAgIAogICAgY2FzZSBBU05fUFJJVl9JTVBMSUVEX09CSkVDVF9JRDoKICAgICAgICB2YXItPm5hbWVfbGVuZ3RoID0gdmFyLT52YWxfbGVuIC8gc2l6ZW9mKG9pZCk7CiAgICAgICAgaWYgKHZhci0+bmFtZV9sZW5ndGggPiAoc2l6ZW9mKHZhci0+bmFtZV9sb2MpIC8gc2l6ZW9mKG9pZCkpKQogICAgICAgICAgICB2YXItPm5hbWUgPSAob2lkICopIG1hbGxvYyhzaXplb2Yob2lkKSAqICh2YXItPm5hbWVfbGVuZ3RoKSk7CiAgICAgICAgZWxzZQogICAgICAgICAgICB2YXItPm5hbWUgPSB2YXItPm5hbWVfbG9jOwogICAgICAgIGlmICh2YXItPm5hbWUgPT0gTlVMTCkKICAgICAgICAgICAgcmV0dXJuIFNOTVBFUlJfR0VORVJSOwoKICAgICAgICBmb3IgKGkgPSAwOyBpIDwgKGludCkgdmFyLT5uYW1lX2xlbmd0aDsgaSsrKQogICAgICAgICAgICB2YXItPm5hbWVbaV0gPSB2YXItPnZhbC5vYmppZFtpXTsKICAgICAgICBicmVhazsKCiAgICBjYXNlIEFTTl9PQkpFQ1RfSUQ6CiAgICAgICAgdmFyLT5uYW1lX2xlbmd0aCA9IHZhci0+dmFsX2xlbiAvIHNpemVvZihvaWQpICsgMTsKICAgICAgICBpZiAodmFyLT5uYW1lX2xlbmd0aCA+IChzaXplb2YodmFyLT5uYW1lX2xvYykgLyBzaXplb2Yob2lkKSkpCiAgICAgICAgICAgIHZhci0+bmFtZSA9IChvaWQgKikgbWFsbG9jKHNpemVvZihvaWQpICogKHZhci0+bmFtZV9sZW5ndGgpKTsKICAgICAgICBlbHNlCiAgICAgICAgICAgIHZhci0+bmFtZSA9IHZhci0+bmFtZV9sb2M7CiAgICAgICAgaWYgKHZhci0+bmFtZSA9PSBOVUxMKQogICAgICAgICAgICByZXR1cm4gU05NUEVSUl9HRU5FUlI7CgogICAgICAgIHZhci0+bmFtZVswXSA9IHZhci0+bmFtZV9sZW5ndGggLSAxOwogICAgICAgIGZvciAoaSA9IDA7IGkgPCAoaW50KSB2YXItPm5hbWVfbGVuZ3RoIC0gMTsgaSsrKQogICAgICAgICAgICB2YXItPm5hbWVbaSArIDFdID0gdmFyLT52YWwub2JqaWRbaV07CiAgICAgICAgYnJlYWs7CgogICAgY2FzZSBBU05fUFJJVl9JTVBMSUVEX09DVEVUX1NUUjoKICAgICAgICB2YXItPm5hbWVfbGVuZ3RoID0gdmFyLT52YWxfbGVuOwogICAgICAgIGlmICh2YXItPm5hbWVfbGVuZ3RoID4gKHNpemVvZih2YXItPm5hbWVfbG9jKSAvIHNpemVvZihvaWQpKSkKICAgICAgICAgICAgdmFyLT5uYW1lID0gKG9pZCAqKSBtYWxsb2Moc2l6ZW9mKG9pZCkgKiAodmFyLT5uYW1lX2xlbmd0aCkpOwogICAgICAgIGVsc2UKICAgICAgICAgICAgdmFyLT5uYW1lID0gdmFyLT5uYW1lX2xvYzsKICAgICAgICBpZiAodmFyLT5uYW1lID09IE5VTEwpCiAgICAgICAgICAgIHJldHVybiBTTk1QRVJSX0dFTkVSUjsKCiAgICAgICAgZm9yIChpID0gMDsgaSA8IChpbnQpIHZhci0+dmFsX2xlbjsgaSsrKQogICAgICAgICAgICB2YXItPm5hbWVbaV0gPSAob2lkKSB2YXItPnZhbC5zdHJpbmdbaV07CiAgICAgICAgYnJlYWs7CgogICAgY2FzZSBBU05fT1BBUVVFOgogICAgY2FzZSBBU05fT0NURVRfU1RSOgogICAgICAgIHZhci0+bmFtZV9sZW5ndGggPSB2YXItPnZhbF9sZW4gKyAxOwogICAgICAgIGlmICh2YXItPm5hbWVfbGVuZ3RoID4gKHNpemVvZih2YXItPm5hbWVfbG9jKSAvIHNpemVvZihvaWQpKSkKICAgICAgICAgICAgdmFyLT5uYW1lID0gKG9pZCAqKSBtYWxsb2Moc2l6ZW9mKG9pZCkgKiAodmFyLT5uYW1lX2xlbmd0aCkpOwogICAgICAgIGVsc2UKICAgICAgICAgICAgdmFyLT5uYW1lID0gdmFyLT5uYW1lX2xvYzsKICAgICAgICBpZiAodmFyLT5uYW1lID09IE5VTEwpCiAgICAgICAgICAgIHJldHVybiBTTk1QRVJSX0dFTkVSUjsKCiAgICAgICAgdmFyLT5uYW1lWzBdID0gKG9pZCkgdmFyLT52YWxfbGVuOwogICAgICAgIGZvciAoaSA9IDA7IGkgPCAoaW50KSB2YXItPnZhbF9sZW47IGkrKykKICAgICAgICAgICAgdmFyLT5uYW1lW2kgKyAxXSA9IChvaWQpIHZhci0+dmFsLnN0cmluZ1tpXTsKICAgICAgICBicmVhazsKCiAgICBkZWZhdWx0OgogICAgICAgIERFQlVHTVNHVEwoKCJidWlsZF9vaWRfc2VnbWVudCIsCiAgICAgICAgICAgICAgICAgICAgImludmFsaWQgYXNuIHR5cGU6ICVkXG4iLCB2YXItPnR5cGUpKTsKICAgICAgICByZXR1cm4gU05NUEVSUl9HRU5FUlI7CiAgICB9CgogICAgaWYgKHZhci0+bmFtZV9sZW5ndGggPiBNQVhfT0lEX0xFTikgewogICAgICAgIERFQlVHTVNHVEwoKCJidWlsZF9vaWRfc2VnbWVudCIsCiAgICAgICAgICAgICAgICAgICAgIlNvbWV0aGluZyB0ZXJyaWJseSB3cm9uZywgbmFtZWxlbiA9ICVkXG4iLAogICAgICAgICAgICAgICAgICAgIHZhci0+bmFtZV9sZW5ndGgpKTsKICAgICAgICByZXR1cm4gU05NUEVSUl9HRU5FUlI7CiAgICB9CgogICAgcmV0dXJuIFNOTVBFUlJfU1VDQ0VTUzsKfQoKCmludApidWlsZF9vaWRfbm9hbGxvYyhvaWQgKiBpbiwgc2l6ZV90IGluX2xlbiwgc2l6ZV90ICogb3V0X2xlbiwKICAgICAgICAgICAgICAgICAgb2lkICogcHJlZml4LCBzaXplX3QgcHJlZml4X2xlbiwKICAgICAgICAgICAgICAgICAgbmV0c25tcF92YXJpYWJsZV9saXN0ICogaW5kZXhlcykKewogICAgbmV0c25tcF92YXJpYWJsZV9saXN0ICp2YXI7CgogICAgaWYgKHByZWZpeCkgewogICAgICAgIGlmIChpbl9sZW4gPCBwcmVmaXhfbGVuKQogICAgICAgICAgICByZXR1cm4gU05NUEVSUl9HRU5FUlI7CiAgICAgICAgbWVtY3B5KGluLCBwcmVmaXgsIHByZWZpeF9sZW4gKiBzaXplb2Yob2lkKSk7CiAgICAgICAgKm91dF9sZW4gPSBwcmVmaXhfbGVuOwogICAgfSBlbHNlIHsKICAgICAgICAqb3V0X2xlbiA9IDA7CiAgICB9CgogICAgZm9yICh2YXIgPSBpbmRleGVzOyB2YXIgIT0gTlVMTDsgdmFyID0gdmFyLT5uZXh0X3ZhcmlhYmxlKSB7CiAgICAgICAgaWYgKGJ1aWxkX29pZF9zZWdtZW50KHZhcikgIT0gU05NUEVSUl9TVUNDRVNTKQogICAgICAgICAgICByZXR1cm4gU05NUEVSUl9HRU5FUlI7CiAgICAgICAgaWYgKHZhci0+bmFtZV9sZW5ndGggKyAqb3V0X2xlbiA8PSBpbl9sZW4pIHsKICAgICAgICAgICAgbWVtY3B5KCYoaW5bKm91dF9sZW5dKSwgdmFyLT5uYW1lLAogICAgICAgICAgICAgICAgICAgc2l6ZW9mKG9pZCkgKiB2YXItPm5hbWVfbGVuZ3RoKTsKICAgICAgICAgICAgKm91dF9sZW4gKz0gdmFyLT5uYW1lX2xlbmd0aDsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICByZXR1cm4gU05NUEVSUl9HRU5FUlI7CiAgICAgICAgfQogICAgfQoKICAgIERFQlVHTVNHVEwoKCJidWlsZF9vaWRfbm9hbGxvYyIsICJnZW5lcmF0ZWQ6ICIpKTsKICAgIERFQlVHTVNHT0lEKCgiYnVpbGRfb2lkX25vYWxsb2MiLCBpbiwgKm91dF9sZW4pKTsKICAgIERFQlVHTVNHKCgiYnVpbGRfb2lkX25vYWxsb2MiLCAiXG4iKSk7CiAgICByZXR1cm4gU05NUEVSUl9TVUNDRVNTOwp9CgppbnQKYnVpbGRfb2lkKG9pZCAqKiBvdXQsIHNpemVfdCAqIG91dF9sZW4sCiAgICAgICAgICBvaWQgKiBwcmVmaXgsIHNpemVfdCBwcmVmaXhfbGVuLCBuZXRzbm1wX3ZhcmlhYmxlX2xpc3QgKiBpbmRleGVzKQp7CiAgICBvaWQgICAgICAgICAgICAgdG1wb3V0W01BWF9PSURfTEVOXTsKCiAgICAvKgogICAgICogeHh4LXJrczogaW5lZmZpY2VudC4gdHJ5IG9ubHkgYnVpbGRpbmcgc2VnbWVudHMgdG8gZmluZCBpbmRleCBsZW46CiAgICAgKiAgIGZvciAodmFyID0gaW5kZXhlczsgdmFyICE9IE5VTEw7IHZhciA9IHZhci0+bmV4dF92YXJpYWJsZSkgewogICAgICogICAgICBpZiAoYnVpbGRfb2lkX3NlZ21lbnQodmFyKSAhPSBTTk1QRVJSX1NVQ0NFU1MpCiAgICAgKiAgICAgICAgIHJldHVybiBTTk1QRVJSX0dFTkVSUjsKICAgICAqICAgICAgKm91dF9sZW4gKz0gdmFyLT5uYW1lX2xlbmd0aDsKICAgICAqCiAgICAgKiB0aGVuIHNlZSBpZiBpdCBmaXRzIGluIGV4aXN0aW5nIGJ1ZmZlciwgb3IgcmVhbGxvYyBidWZmZXIuCiAgICAgKi8KICAgIGlmIChidWlsZF9vaWRfbm9hbGxvYyh0bXBvdXQsIHNpemVvZih0bXBvdXQpLCBvdXRfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCwgcHJlZml4X2xlbiwgaW5kZXhlcykgIT0gU05NUEVSUl9TVUNDRVNTKQogICAgICAgIHJldHVybiBTTk1QRVJSX0dFTkVSUjsKCiAgICAvKiogeHh4LXJrczogc2hvdWxkIGZyZWUgcHJldmlvdXMgdmFsdWU/ICovCiAgICBzbm1wX2Nsb25lX21lbSgodm9pZCAqKikgb3V0LCAodm9pZCAqKSB0bXBvdXQsICpvdXRfbGVuICogc2l6ZW9mKG9pZCkpOwoKICAgIHJldHVybiBTTk1QRVJSX1NVQ0NFU1M7Cn0KCi8qCiAqIHZibGlzdF9vdXQgbXVzdCBjb250YWluIGEgcHJlLWFsbG9jYXRlZCBzdHJpbmcgb2YgdmFyaWFibGVzIGludG8KICogd2hpY2ggaW5kZXhlcyBjYW4gYmUgZXh0cmFjdGVkIGJhc2VkIG9uIHRoZSBwcmV2aW91c2x5IGV4aXN0aW5nCiAqIHR5cGVzIGluIHRoZSB2YXJpYWJsZSBjaGFpbgogKiByZXR1cm5zOgogKiBTTk1QRVJSX0dFTkVSUiAgb24gZXJyb3IKICogU05NUEVSUl9TVUNDRVNTIG9uIHN1Y2Nlc3MKICovCgppbnQKcGFyc2Vfb2lkX2luZGV4ZXMob2lkICogb2lkSW5kZXgsIHNpemVfdCBvaWRMZW4sCiAgICAgICAgICAgICAgICAgIG5ldHNubXBfdmFyaWFibGVfbGlzdCAqIGRhdGEpCnsKICAgIG5ldHNubXBfdmFyaWFibGVfbGlzdCAqdmFyID0gZGF0YTsKCiAgICB3aGlsZSAodmFyICYmIG9pZExlbiA+IDApIHsKCiAgICAgICAgaWYgKHBhcnNlX29uZV9vaWRfaW5kZXgoJm9pZEluZGV4LCAmb2lkTGVuLCB2YXIsIDApICE9CiAgICAgICAgICAgIFNOTVBFUlJfU1VDQ0VTUykKICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIHZhciA9IHZhci0+bmV4dF92YXJpYWJsZTsKICAgIH0KCiAgICBpZiAodmFyICE9IE5VTEwgfHwgb2lkTGVuICE9IDApCiAgICAgICAgcmV0dXJuIFNOTVBFUlJfR0VORVJSOwogICAgcmV0dXJuIFNOTVBFUlJfU1VDQ0VTUzsKfQoKCmludApwYXJzZV9vbmVfb2lkX2luZGV4KG9pZCAqKiBvaWRTdGFydCwgc2l6ZV90ICogb2lkTGVuLAogICAgICAgICAgICAgICAgICAgIG5ldHNubXBfdmFyaWFibGVfbGlzdCAqIGRhdGEsIGludCBjb21wbGV0ZSkKewogICAgbmV0c25tcF92YXJpYWJsZV9saXN0ICp2YXIgPSBkYXRhOwogICAgb2lkICAgICAgICAgICAgIHRtcG91dFtNQVhfT0lEX0xFTl07CiAgICB1bnNpZ25lZCBpbnQgICAgaTsKICAgIHVuc2lnbmVkIGludCAgICB1aXRtcCA9IDA7CgogICAgb2lkICAgICAgICAgICAgKm9pZEluZGV4ID0gKm9pZFN0YXJ0OwoKICAgIGlmICh2YXIgPT0gTlVMTCB8fCAoKCpvaWRMZW4gPT0gMCkgJiYgKGNvbXBsZXRlID09IDApKSkKICAgICAgICByZXR1cm4gU05NUEVSUl9HRU5FUlI7CiAgICBlbHNlIHsKICAgICAgICBzd2l0Y2ggKHZhci0+dHlwZSkgewogICAgICAgIGNhc2UgQVNOX0lOVEVHRVI6CiAgICAgICAgY2FzZSBBU05fQ09VTlRFUjoKICAgICAgICBjYXNlIEFTTl9HQVVHRToKICAgICAgICBjYXNlIEFTTl9USU1FVElDS1M6CiAgICAgICAgICAgIGlmICgqb2lkTGVuKSB7CiAgICAgICAgICAgICAgICBzbm1wX3NldF92YXJfdmFsdWUodmFyLCAodV9jaGFyICopIG9pZEluZGV4KyssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGxvbmcpKTsKICAgICAgICAgICAgICAgIC0tKCpvaWRMZW4pOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgc25tcF9zZXRfdmFyX3ZhbHVlKHZhciwgKHVfY2hhciAqKSBvaWRMZW4sIHNpemVvZihsb25nKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgREVCVUdNU0dUTCgoInBhcnNlX29pZF9pbmRleGVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgIlBhcnNlZCBpbnQoJWQpOiAlZFxuIiwgdmFyLT50eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAqdmFyLT52YWwuaW50ZWdlcikpOwogICAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSBBU05fSVBBRERSRVNTOgogICAgICAgICAgICBpZiAoKDQgPiAqb2lkTGVuKSAmJiAoY29tcGxldGUgPT0gMCkpCiAgICAgICAgICAgICAgICByZXR1cm4gU05NUEVSUl9HRU5FUlI7CiAgICAgICAgICAgIAogICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNCAmJiBpIDwgKm9pZExlbjsgKytpKSB7CiAgICAgICAgICAgICAgICBpZiAob2lkSW5kZXhbaV0gPiAyNTUpIHsKICAgICAgICAgICAgICAgICAgICBERUJVR01TR1RMKCgicGFyc2Vfb2lkX2luZGV4ZXMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbGxlZ2FsIG9pZCBpbiBpbmRleDogJWRcbiIsIG9pZEluZGV4WzBdKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBTTk1QRVJSX0dFTkVSUjsgIC8qIHN1Yi1pZGVudGlmaWVyIHRvbyBsYXJnZSAqLwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB1aXRtcCA9IHVpdG1wICsgKG9pZEluZGV4W2ldIDw8ICg4KigzLWkpKSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICg0ID4gKGludCkgKCpvaWRMZW4pKSB7CiAgICAgICAgICAgICAgICBvaWRJbmRleCArPSAqb2lkTGVuOwogICAgICAgICAgICAgICAgKCpvaWRMZW4pID0gMDsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIG9pZEluZGV4ICs9IDQ7CiAgICAgICAgICAgICAgICAoKm9pZExlbikgLT0gNDsKICAgICAgICAgICAgfQogICAgICAgICAgICB1aXRtcCA9IGh0b25sKHVpdG1wKTsgLyogcHV0IGl0IGluIHByb3BlciBvcmRlciBmb3IgYnl0ZSBjb3BpZXMgKi8KICAgICAgICAgICAgdWl0bXAgPSAKICAgICAgICAgICAgICAgIHNubXBfc2V0X3Zhcl92YWx1ZSh2YXIsICh1X2NoYXIgKikgJnVpdG1wLCA0KTsKICAgICAgICAgICAgREVCVUdNU0dUTCgoInBhcnNlX29pZF9pbmRleGVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgIlBhcnNlZCBpcGFkZHIoJWQpOiAlZC4lZC4lZC4lZFxuIiwgdmFyLT50eXBlLAogICAgICAgICAgICAgICAgICAgICAgICB2YXItPnZhbC5zdHJpbmdbMF0sIHZhci0+dmFsLnN0cmluZ1sxXSwKICAgICAgICAgICAgICAgICAgICAgICAgdmFyLT52YWwuc3RyaW5nWzJdLCB2YXItPnZhbC5zdHJpbmdbM10pKTsKICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgQVNOX09CSkVDVF9JRDoKICAgICAgICBjYXNlIEFTTl9QUklWX0lNUExJRURfT0JKRUNUX0lEOgogICAgICAgICAgICBpZiAodmFyLT50eXBlID09IEFTTl9QUklWX0lNUExJRURfT0JKRUNUX0lEKSB7CiAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICogbWlnaHQgbm90IGJlIGltcGxpZWQsIG1pZ2h0IGJlIGZpeGVkIGxlbi4gY2hlY2sgaWYKICAgICAgICAgICAgICAgICAqIGNhbGxlciBzZXQgdXAgdmFsIGxlbiwgYW5kIHVzZSBpdCBpZiB0aGV5IGRpZC4KICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgaWYgKDAgPT0gdmFyLT52YWxfbGVuKQogICAgICAgICAgICAgICAgICAgIHVpdG1wID0gKm9pZExlbjsKICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIERFQlVHTVNHVEwoKCJwYXJzZV9vaWRfaW5kZXhlczpmaXgiLCAiZml4ZWQgbGVuIG9pZFxuIikpOwogICAgICAgICAgICAgICAgICAgIHVpdG1wID0gdmFyLT52YWxfbGVuOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgaWYgKCpvaWRMZW4pIHsKICAgICAgICAgICAgICAgICAgICB1aXRtcCA9ICpvaWRJbmRleCsrOwogICAgICAgICAgICAgICAgICAgIC0tKCpvaWRMZW4pOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICB1aXRtcCA9IDA7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoKHVpdG1wID4gKm9pZExlbikgJiYgKGNvbXBsZXRlID09IDApKQogICAgICAgICAgICAgICAgICAgIHJldHVybiBTTk1QRVJSX0dFTkVSUjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHVpdG1wID4gTUFYX09JRF9MRU4pCiAgICAgICAgICAgICAgICByZXR1cm4gU05NUEVSUl9HRU5FUlI7ICAvKiB0b28gYmlnIGFuZCBpbGxlZ2FsICovCgogICAgICAgICAgICBpZiAodWl0bXAgPiAqb2lkTGVuKSB7CiAgICAgICAgICAgICAgICBtZW1jcHkodG1wb3V0LCBvaWRJbmRleCwgc2l6ZW9mKG9pZCkgKiAoKm9pZExlbikpOwogICAgICAgICAgICAgICAgbWVtc2V0KCZ0bXBvdXRbKm9pZExlbl0sIDB4MDAsCiAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKG9pZCkgKiAodWl0bXAgLSAqb2lkTGVuKSk7CiAgICAgICAgICAgICAgICBzbm1wX3NldF92YXJfdmFsdWUodmFyLCAodV9jaGFyICopIHRtcG91dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yob2lkKSAqIHVpdG1wKTsKICAgICAgICAgICAgICAgIG9pZEluZGV4ICs9ICpvaWRMZW47CiAgICAgICAgICAgICAgICAoKm9pZExlbikgPSAwOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgc25tcF9zZXRfdmFyX3ZhbHVlKHZhciwgKHVfY2hhciAqKSBvaWRJbmRleCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yob2lkKSAqIHVpdG1wKTsKICAgICAgICAgICAgICAgIG9pZEluZGV4ICs9IHVpdG1wOwogICAgICAgICAgICAgICAgKCpvaWRMZW4pIC09IHVpdG1wOwogICAgICAgICAgICB9CgogICAgICAgICAgICBERUJVR01TR1RMKCgicGFyc2Vfb2lkX2luZGV4ZXMiLCAiUGFyc2VkIG9pZDogIikpOwogICAgICAgICAgICBERUJVR01TR09JRCgoInBhcnNlX29pZF9pbmRleGVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgIHZhci0+dmFsLm9iamlkLCB2YXItPnZhbF9sZW4gLyBzaXplb2Yob2lkKSkpOwogICAgICAgICAgICBERUJVR01TRygoInBhcnNlX29pZF9pbmRleGVzIiwgIlxuIikpOwogICAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSBBU05fT1BBUVVFOgogICAgICAgIGNhc2UgQVNOX09DVEVUX1NUUjoKICAgICAgICBjYXNlIEFTTl9QUklWX0lNUExJRURfT0NURVRfU1RSOgogICAgICAgICAgICBpZiAodmFyLT50eXBlID09IEFTTl9QUklWX0lNUExJRURfT0NURVRfU1RSKSB7CiAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICogbWlnaHQgbm90IGJlIGltcGxpZWQsIG1pZ2h0IGJlIGZpeGVkIGxlbi4gY2hlY2sgaWYKICAgICAgICAgICAgICAgICAqIGNhbGxlciBzZXQgdXAgdmFsIGxlbiwgYW5kIHVzZSBpdCBpZiB0aGV5IGRpZC4KICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgaWYgKDAgPT0gdmFyLT52YWxfbGVuKQogICAgICAgICAgICAgICAgICAgIHVpdG1wID0gKm9pZExlbjsKICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIERFQlVHTVNHVEwoKCJwYXJzZV9vaWRfaW5kZXhlczpmaXgiLCAiZml4ZWQgbGVuIHN0clxuIikpOwogICAgICAgICAgICAgICAgICAgIHVpdG1wID0gdmFyLT52YWxfbGVuOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgaWYgKCpvaWRMZW4pIHsKICAgICAgICAgICAgICAgICAgICB1aXRtcCA9ICpvaWRJbmRleCsrOwogICAgICAgICAgICAgICAgICAgIC0tKCpvaWRMZW4pOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICB1aXRtcCA9IDA7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoKHVpdG1wID4gKm9pZExlbikgJiYgKGNvbXBsZXRlID09IDApKQogICAgICAgICAgICAgICAgICAgIHJldHVybiBTTk1QRVJSX0dFTkVSUjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLyoKICAgICAgICAgICAgICogd2UgaGFuZGxlIHRoaXMgb25lIG91cnNlbHZlcyBzaW5jZSB3ZSBkb24ndCBoYXZlCiAgICAgICAgICAgICAqIHByZS1hbGxvY2F0ZWQgbWVtb3J5IHRvIGNvcHkgZnJvbSB1c2luZwogICAgICAgICAgICAgKiBzbm1wX3NldF92YXJfdmFsdWUoKSAKICAgICAgICAgICAgICovCgogICAgICAgICAgICBpZiAodWl0bXAgPT0gMCkKICAgICAgICAgICAgICAgIGJyZWFrOyAgICAgICAgICAvKiB6ZXJvIGxlbmd0aCBzdHJpbmdzIHNob3VsZG4ndCBtYWxsb2MgKi8KCiAgICAgICAgICAgIGlmICh1aXRtcCA+IE1BWF9PSURfTEVOKQogICAgICAgICAgICAgICAgcmV0dXJuIFNOTVBFUlJfR0VORVJSOyAgLyogdG9vIGJpZyBhbmQgaWxsZWdhbCAqLwoKICAgICAgICAgICAgLyoKICAgICAgICAgICAgICogbWFsbG9jIGJ5IHNpemUrMSB0byBhbGxvdyBhIG51bGwgdG8gYmUgYXBwZW5kZWQuIAogICAgICAgICAgICAgKi8KICAgICAgICAgICAgdmFyLT52YWxfbGVuID0gdWl0bXA7CiAgICAgICAgICAgIHZhci0+dmFsLnN0cmluZyA9ICh1X2NoYXIgKikgY2FsbG9jKDEsIHVpdG1wICsgMSk7CiAgICAgICAgICAgIGlmICh2YXItPnZhbC5zdHJpbmcgPT0gTlVMTCkKICAgICAgICAgICAgICAgIHJldHVybiBTTk1QRVJSX0dFTkVSUjsKCiAgICAgICAgICAgIGlmICgoc2l6ZV90KXVpdG1wID4gKCpvaWRMZW4pKSB7CiAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgKm9pZExlbjsgKytpKQogICAgICAgICAgICAgICAgICAgIHZhci0+dmFsLnN0cmluZ1tpXSA9ICh1X2NoYXIpICogb2lkSW5kZXgrKzsKICAgICAgICAgICAgICAgIGZvciAoaSA9ICpvaWRMZW47IGkgPCB1aXRtcDsgKytpKQogICAgICAgICAgICAgICAgICAgIHZhci0+dmFsLnN0cmluZ1tpXSA9ICdcMCc7CiAgICAgICAgICAgICAgICAoKm9pZExlbikgPSAwOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHVpdG1wOyArK2kpCiAgICAgICAgICAgICAgICAgICAgdmFyLT52YWwuc3RyaW5nW2ldID0gKHVfY2hhcikgKiBvaWRJbmRleCsrOwogICAgICAgICAgICAgICAgKCpvaWRMZW4pIC09IHVpdG1wOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhci0+dmFsLnN0cmluZ1t1aXRtcF0gPSAnXDAnOwoKICAgICAgICAgICAgREVCVUdNU0dUTCgoInBhcnNlX29pZF9pbmRleGVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgIlBhcnNlZCBzdHIoJWQpOiAlc1xuIiwgdmFyLT50eXBlLAogICAgICAgICAgICAgICAgICAgICAgICB2YXItPnZhbC5zdHJpbmcpKTsKICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIERFQlVHTVNHVEwoKCJwYXJzZV9vaWRfaW5kZXhlcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJpbnZhbGlkIGFzbiB0eXBlOiAlZFxuIiwgdmFyLT50eXBlKSk7CiAgICAgICAgICAgIHJldHVybiBTTk1QRVJSX0dFTkVSUjsKICAgICAgICB9CiAgICB9CiAgICAoKm9pZFN0YXJ0KSA9IG9pZEluZGV4OwogICAgcmV0dXJuIFNOTVBFUlJfU1VDQ0VTUzsKfQoKLyoKICogZHVtcF9yZWFsbG9jX29pZF90b19pbmV0YWRkcmVzczoKICogICByZXR1cm4gMCBmb3IgZmFpbHVyZSwKICogICByZXR1cm4gMSBmb3Igc3VjY2VzcywKICogICByZXR1cm4gMiBmb3Igbm90IGhhbmRsZWQKICovCgppbnQgCmR1bXBfcmVhbGxvY19vaWRfdG9faW5ldGFkZHJlc3MoY29uc3QgaW50IGFkZHJfdHlwZSwgY29uc3Qgb2lkICogb2JqaWQsIHNpemVfdCBvYmppZGxlbiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdV9jaGFyICoqIGJ1Ziwgc2l6ZV90ICogYnVmX2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgKiBvdXRfbGVuLCBpbnQgYWxsb3dfcmVhbGxvYywgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciBxdW90ZWNoYXIpCnsKICAgIGludCAgICAgICAgICAgICBpLCBsZW47CiAgICBjaGFyICAgICAgICAgICAgaW50YnVmWzY0XSwgKnA7CiAgICBjaGFyICpjb25zdCAgICAgZW5kID0gaW50YnVmICsgc2l6ZW9mKGludGJ1Zik7CiAgICB1bnNpZ25lZCBjaGFyICAqemM7CiAgICB1bnNpZ25lZCBsb25nICAgem9uZTsKCiAgICBpZiAoIWJ1ZikKICAgICAgICByZXR1cm4gMTsKCiAgICBmb3IgKGkgPSAwOyBpIDwgb2JqaWRsZW47IGkrKykKICAgICAgICBpZiAob2JqaWRbaV0gPCAwIHx8IG9iamlkW2ldID4gMjU1KQogICAgICAgICAgICByZXR1cm4gMjsKCiAgICBwID0gaW50YnVmOwogICAgKnArKyA9IHF1b3RlY2hhcjsKCiAgICBzd2l0Y2ggKGFkZHJfdHlwZSkgewogICAgY2FzZSBJUFY0OgogICAgY2FzZSBJUFY0WjoKICAgICAgICBpZiAoKGFkZHJfdHlwZSA9PSBJUFY0ICAmJiBvYmppZGxlbiAhPSA0KSB8fAogICAgICAgICAgICAoYWRkcl90eXBlID09IElQVjRaICYmIG9iamlkbGVuICE9IDgpKQogICAgICAgICAgICByZXR1cm4gMjsKCiAgICAgICAgbGVuID0gc25wcmludGYocCwgZW5kIC0gcCwgIiUiIE5FVFNOTVBfUFJJbyAidS4lIiBORVRTTk1QX1BSSW8gInUuIgogICAgICAgICAgICAgICAgICAgICAgIiUiIE5FVFNOTVBfUFJJbyAidS4lIiBORVRTTk1QX1BSSW8gInUiLAogICAgICAgICAgICAgICAgICAgICAgb2JqaWRbMF0sIG9iamlkWzFdLCBvYmppZFsyXSwgb2JqaWRbM10pOwogICAgICAgIHAgKz0gbGVuOwogICAgICAgIGlmIChwID49IGVuZCkKICAgICAgICAgICAgcmV0dXJuIDI7CiAgICAgICAgaWYgKGFkZHJfdHlwZSA9PSBJUFY0WikgewogICAgICAgICAgICB6YyA9ICh1bnNpZ25lZCBjaGFyKikmem9uZTsKICAgICAgICAgICAgemNbMF0gPSBvYmppZFs0XTsKICAgICAgICAgICAgemNbMV0gPSBvYmppZFs1XTsKICAgICAgICAgICAgemNbMl0gPSBvYmppZFs2XTsKICAgICAgICAgICAgemNbM10gPSBvYmppZFs3XTsKICAgICAgICAgICAgem9uZSA9IG50b2hsKHpvbmUpOwogICAgICAgICAgICBsZW4gPSBzbnByaW50ZihwLCBlbmQgLSBwLCAiJSUlbHUiLCB6b25lKTsKICAgICAgICAgICAgcCArPSBsZW47CiAgICAgICAgICAgIGlmIChwID49IGVuZCkKICAgICAgICAgICAgICAgIHJldHVybiAyOwogICAgICAgIH0KCiAgICAgICAgYnJlYWs7CgogICAgY2FzZSBJUFY2OgogICAgY2FzZSBJUFY2WjoKICAgICAgICBpZiAoKGFkZHJfdHlwZSA9PSBJUFY2ICYmIG9iamlkbGVuICE9IDE2KSB8fAogICAgICAgICAgICAoYWRkcl90eXBlID09IElQVjZaICYmIG9iamlkbGVuICE9IDIwKSkKICAgICAgICAgICAgcmV0dXJuIDI7CgogICAgICAgIGxlbiA9IDA7CiAgICAgICAgZm9yIChpID0gMDsgaSA8IDE2OyBpICsrKSB7CiAgICAgICAgICAgIGxlbiA9IHNucHJpbnRmKHAsIGVuZCAtIHAsICIlcyUwMiIgTkVUU05NUF9QUklvICJ4IiwgaSA/ICI6IiA6ICIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICBvYmppZFtpXSk7CiAgICAgICAgICAgIHAgKz0gbGVuOwogICAgICAgICAgICBpZiAocCA+PSBlbmQpCiAgICAgICAgICAgICAgICByZXR1cm4gMjsKICAgICAgICB9CgogICAgICAgIGlmIChhZGRyX3R5cGUgPT0gSVBWNlopIHsKICAgICAgICAgICAgemMgPSAodW5zaWduZWQgY2hhciopJnpvbmU7CiAgICAgICAgICAgIHpjWzBdID0gb2JqaWRbMTZdOwogICAgICAgICAgICB6Y1sxXSA9IG9iamlkWzE3XTsKICAgICAgICAgICAgemNbMl0gPSBvYmppZFsxOF07CiAgICAgICAgICAgIHpjWzNdID0gb2JqaWRbMTldOwogICAgICAgICAgICB6b25lID0gbnRvaGwoem9uZSk7CiAgICAgICAgICAgIGxlbiA9IHNucHJpbnRmKHAsIGVuZCAtIHAsICIlJSVsdSIsIHpvbmUpOwogICAgICAgICAgICBwICs9IGxlbjsKICAgICAgICAgICAgaWYgKHAgPj0gZW5kKQogICAgICAgICAgICAgICAgcmV0dXJuIDI7CiAgICAgICAgfQoKICAgICAgICBicmVhazsKCiAgICBjYXNlIEROUzoKICAgIGRlZmF1bHQ6IAogICAgICAgIC8qIEROUyBjYW4ganVzdCBiZSBoYW5kbGVkIGJ5IGR1bXBfcmVhbGxvY19vaWRfdG9fc3RyaW5nKCkgKi8KICAgICAgICByZXR1cm4gMjsKICAgIH0KCiAgICAqcCsrID0gcXVvdGVjaGFyOwogICAgaWYgKHAgPj0gZW5kKQogICAgICAgIHJldHVybiAyOwoKICAgICpwKysgPSAnXDAnOwogICAgaWYgKHAgPj0gZW5kKQogICAgICAgIHJldHVybiAyOwoKICAgIHJldHVybiBzbm1wX2NzdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCBpbnRidWYpOwp9CgppbnQKZHVtcF9yZWFsbG9jX29pZF90b19zdHJpbmcoY29uc3Qgb2lkICogb2JqaWQsIHNpemVfdCBvYmppZGxlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgdV9jaGFyICoqIGJ1Ziwgc2l6ZV90ICogYnVmX2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICogb3V0X2xlbiwgaW50IGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgcXVvdGVjaGFyKQp7CiAgICBpZiAoYnVmKSB7CiAgICAgICAgaW50ICAgICAgICAgICAgIGksIGFsZW47CgogICAgICAgIGZvciAoaSA9IDAsIGFsZW4gPSAwOyBpIDwgKGludCkgb2JqaWRsZW47IGkrKykgewogICAgICAgICAgICBvaWQgICAgICAgICAgICAgdHN0ID0gb2JqaWRbaV07CiAgICAgICAgICAgIGlmICgodHN0ID4gMjU0KSB8fCAoIWlzcHJpbnQodHN0KSkpIHsKICAgICAgICAgICAgICAgIHRzdCA9IChvaWQpICcuJzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKGFsZW4gPT0gMCkgewogICAgICAgICAgICAgICAgaWYgKG5ldHNubXBfZHNfZ2V0X2Jvb2xlYW4oTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9FU0NBUEVfUVVPVEVTKSkgewogICAgICAgICAgICAgICAgICAgIHdoaWxlICgoKm91dF9sZW4gKyAyKSA+PSAqYnVmX2xlbikgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIShhbGxvd19yZWFsbG9jICYmIHNubXBfcmVhbGxvYyhidWYsIGJ1Zl9sZW4pKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgKigqYnVmICsgKm91dF9sZW4pID0gJ1xcJzsKICAgICAgICAgICAgICAgICAgICAoKm91dF9sZW4pKys7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB3aGlsZSAoKCpvdXRfbGVuICsgMikgPj0gKmJ1Zl9sZW4pIHsKICAgICAgICAgICAgICAgICAgICBpZiAoIShhbGxvd19yZWFsbG9jICYmIHNubXBfcmVhbGxvYyhidWYsIGJ1Zl9sZW4pKSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAqKCpidWYgKyAqb3V0X2xlbikgPSBxdW90ZWNoYXI7CiAgICAgICAgICAgICAgICAoKm91dF9sZW4pKys7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHdoaWxlICgoKm91dF9sZW4gKyAyKSA+PSAqYnVmX2xlbikgewogICAgICAgICAgICAgICAgaWYgKCEoYWxsb3dfcmVhbGxvYyAmJiBzbm1wX3JlYWxsb2MoYnVmLCBidWZfbGVuKSkpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICAqKCpidWYgKyAqb3V0X2xlbikgPSAoY2hhcikgdHN0OwogICAgICAgICAgICAoKm91dF9sZW4pKys7CiAgICAgICAgICAgIGFsZW4rKzsKICAgICAgICB9CgogICAgICAgIGlmIChhbGVuKSB7CiAgICAgICAgICAgIGlmIChuZXRzbm1wX2RzX2dldF9ib29sZWFuKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfRVNDQVBFX1FVT1RFUykpIHsKICAgICAgICAgICAgICAgIHdoaWxlICgoKm91dF9sZW4gKyAyKSA+PSAqYnVmX2xlbikgewogICAgICAgICAgICAgICAgICAgIGlmICghKGFsbG93X3JlYWxsb2MgJiYgc25tcF9yZWFsbG9jKGJ1ZiwgYnVmX2xlbikpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICooKmJ1ZiArICpvdXRfbGVuKSA9ICdcXCc7CiAgICAgICAgICAgICAgICAoKm91dF9sZW4pKys7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgd2hpbGUgKCgqb3V0X2xlbiArIDIpID49ICpidWZfbGVuKSB7CiAgICAgICAgICAgICAgICBpZiAoIShhbGxvd19yZWFsbG9jICYmIHNubXBfcmVhbGxvYyhidWYsIGJ1Zl9sZW4pKSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgICooKmJ1ZiArICpvdXRfbGVuKSA9IHF1b3RlY2hhcjsKICAgICAgICAgICAgKCpvdXRfbGVuKSsrOwogICAgICAgIH0KCiAgICAgICAgKigqYnVmICsgKm91dF9sZW4pID0gJ1wwJzsKICAgIH0KCiAgICByZXR1cm4gMTsKfQoKdm9pZApfb2lkX2ZpbmlzaF9wcmludGluZyhjb25zdCBvaWQgKiBvYmppZCwgc2l6ZV90IG9iamlkbGVuLAogICAgICAgICAgICAgICAgICAgICB1X2NoYXIgKiogYnVmLCBzaXplX3QgKiBidWZfbGVuLCBzaXplX3QgKiBvdXRfbGVuLAogICAgICAgICAgICAgICAgICAgICBpbnQgYWxsb3dfcmVhbGxvYywgaW50ICpidWZfb3ZlcmZsb3cpIHsKICAgIGNoYXIgICAgICAgICAgICBpbnRidWZbNjRdOwogICAgaWYgKCpidWYgIT0gTlVMTCAmJiAqKCpidWYgKyAqb3V0X2xlbiAtIDEpICE9ICcuJykgewogICAgICAgIGlmICghKmJ1Zl9vdmVyZmxvdyAmJiAhc25tcF9zdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCB1X2NoYXIgKikgIi4iKSkgewogICAgICAgICAgICAqYnVmX292ZXJmbG93ID0gMTsKICAgICAgICB9CiAgICB9CgogICAgd2hpbGUgKG9iamlkbGVuLS0gPiAwKSB7ICAgIC8qIG91dHB1dCByZXN0IG9mIG5hbWUsIHVuaW50ZXJwcmV0ZWQgKi8KICAgICAgICBzcHJpbnRmKGludGJ1ZiwgIiVsdS4iLCAqb2JqaWQrKyk7CiAgICAgICAgaWYgKCEqYnVmX292ZXJmbG93ICYmICFzbm1wX3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IHVfY2hhciAqKSBpbnRidWYpKSB7CiAgICAgICAgICAgICpidWZfb3ZlcmZsb3cgPSAxOwogICAgICAgIH0KICAgIH0KCiAgICBpZiAoKmJ1ZiAhPSBOVUxMKSB7CiAgICAgICAgKigqYnVmICsgKm91dF9sZW4gLSAxKSA9ICdcMCc7ICAvKiByZW1vdmUgdHJhaWxpbmcgZG90ICovCiAgICAgICAgKm91dF9sZW4gPSAqb3V0X2xlbiAtIDE7CiAgICB9Cn0KCiNpZm5kZWYgTkVUU05NUF9ESVNBQkxFX01JQl9MT0FESU5HCnN0YXRpYyBzdHJ1Y3QgdHJlZSAqCl9nZXRfcmVhbGxvY19zeW1ib2woY29uc3Qgb2lkICogb2JqaWQsIHNpemVfdCBvYmppZGxlbiwKICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgdHJlZSAqc3VidHJlZSwKICAgICAgICAgICAgICAgICAgICB1X2NoYXIgKiogYnVmLCBzaXplX3QgKiBidWZfbGVuLCBzaXplX3QgKiBvdXRfbGVuLAogICAgICAgICAgICAgICAgICAgIGludCBhbGxvd19yZWFsbG9jLCBpbnQgKmJ1Zl9vdmVyZmxvdywKICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaW5kZXhfbGlzdCAqaW5fZGljZXMsIHNpemVfdCAqIGVuZF9vZl9rbm93bikKewogICAgc3RydWN0IHRyZWUgICAgKnJldHVybl90cmVlID0gTlVMTDsKICAgIGludCAgICAgICAgICAgICBleHRlbmRlZF9pbmRleCA9CiAgICAgICAgbmV0c25tcF9kc19nZXRfYm9vbGVhbihORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX0VYVEVOREVEX0lOREVYKTsKICAgIGludCAgICAgICAgICAgICBvdXRwdXRfZm9ybWF0ID0KICAgICAgICBuZXRzbm1wX2RzX2dldF9pbnQoTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9PSURfT1VUUFVUX0ZPUk1BVCk7CiAgICBjaGFyICAgICAgICAgICAgaW50YnVmWzY0XTsKCiAgICBpZiAoIW9iamlkIHx8ICFidWYpIHsKICAgICAgICByZXR1cm4gTlVMTDsKICAgIH0KCiAgICBmb3IgKDsgc3VidHJlZTsgc3VidHJlZSA9IHN1YnRyZWUtPm5leHRfcGVlcikgewogICAgICAgIGlmICgqb2JqaWQgPT0gc3VidHJlZS0+c3ViaWQpIHsKCSAgICB3aGlsZSAoc3VidHJlZS0+bmV4dF9wZWVyICYmIHN1YnRyZWUtPm5leHRfcGVlci0+c3ViaWQgPT0gKm9iamlkKQoJCXN1YnRyZWUgPSBzdWJ0cmVlLT5uZXh0X3BlZXI7CiAgICAgICAgICAgIGlmIChzdWJ0cmVlLT5pbmRleGVzKSB7CiAgICAgICAgICAgICAgICBpbl9kaWNlcyA9IHN1YnRyZWUtPmluZGV4ZXM7CiAgICAgICAgICAgIH0gZWxzZSBpZiAoc3VidHJlZS0+YXVnbWVudHMpIHsKICAgICAgICAgICAgICAgIHN0cnVjdCB0cmVlICAgICp0cDIgPQogICAgICAgICAgICAgICAgICAgIGZpbmRfdHJlZV9ub2RlKHN1YnRyZWUtPmF1Z21lbnRzLCAtMSk7CiAgICAgICAgICAgICAgICBpZiAodHAyKSB7CiAgICAgICAgICAgICAgICAgICAgaW5fZGljZXMgPSB0cDItPmluZGV4ZXM7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICghc3RybmNtcChzdWJ0cmVlLT5sYWJlbCwgQU5PTiwgQU5PTl9MRU4pIHx8CiAgICAgICAgICAgICAgICAoTkVUU05NUF9PSURfT1VUUFVUX05VTUVSSUMgPT0gb3V0cHV0X2Zvcm1hdCkpIHsKICAgICAgICAgICAgICAgIHNwcmludGYoaW50YnVmLCAiJWx1Iiwgc3VidHJlZS0+c3ViaWQpOwogICAgICAgICAgICAgICAgaWYgKCEqYnVmX292ZXJmbG93ICYmICFzbm1wX3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCB1X2NoYXIgKikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50YnVmKSkgewogICAgICAgICAgICAgICAgICAgICpidWZfb3ZlcmZsb3cgPSAxOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgaWYgKCEqYnVmX292ZXJmbG93ICYmICFzbm1wX3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCB1X2NoYXIgKikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VidHJlZS0+bGFiZWwpKSB7CiAgICAgICAgICAgICAgICAgICAgKmJ1Zl9vdmVyZmxvdyA9IDE7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChvYmppZGxlbiA+IDEpIHsKICAgICAgICAgICAgICAgIGlmICghKmJ1Zl9vdmVyZmxvdyAmJiAhc25tcF9zdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgdV9jaGFyICopICIuIikpIHsKICAgICAgICAgICAgICAgICAgICAqYnVmX292ZXJmbG93ID0gMTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICByZXR1cm5fdHJlZSA9IF9nZXRfcmVhbGxvY19zeW1ib2wob2JqaWQgKyAxLCBvYmppZGxlbiAtIDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VidHJlZS0+Y2hpbGRfbGlzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWYsIGJ1Zl9sZW4sIG91dF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZfb3ZlcmZsb3csIGluX2RpY2VzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZF9vZl9rbm93bik7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChyZXR1cm5fdHJlZSAhPSBOVUxMKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gcmV0dXJuX3RyZWU7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICByZXR1cm4gc3VidHJlZTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCgogICAgaWYgKGVuZF9vZl9rbm93bikgewogICAgICAgICplbmRfb2Zfa25vd24gPSAqb3V0X2xlbjsKICAgIH0KCiAgICAvKgogICAgICogU3VidHJlZSBub3QgZm91bmQuICAKICAgICAqLwoKICAgIHdoaWxlIChpbl9kaWNlcyAmJiAob2JqaWRsZW4gPiAwKSAmJgogICAgICAgICAgIChORVRTTk1QX09JRF9PVVRQVVRfTlVNRVJJQyAhPSBvdXRwdXRfZm9ybWF0KSAmJgogICAgICAgICAgICFuZXRzbm1wX2RzX2dldF9ib29sZWFuKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfRE9OVF9CUkVBS0RPV05fT0lEUykpIHsKICAgICAgICBzaXplX3QgICAgICAgICAgbnVtaWRzOwogICAgICAgIHN0cnVjdCB0cmVlICAgICp0cDsKCiAgICAgICAgdHAgPSBmaW5kX3RyZWVfbm9kZShpbl9kaWNlcy0+aWxhYmVsLCAtMSk7CgogICAgICAgIGlmICghdHApIHsKICAgICAgICAgICAgLyoKICAgICAgICAgICAgICogQ2FuJ3QgZmluZCBhbiBpbmRleCBpbiB0aGUgbWliIHRyZWUuICBCYWlsLiAgCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBnb3RvIGZpbmlzaF9pdDsKICAgICAgICB9CgogICAgICAgIGlmIChleHRlbmRlZF9pbmRleCkgewogICAgICAgICAgICBpZiAoKmJ1ZiAhPSBOVUxMICYmICooKmJ1ZiArICpvdXRfbGVuIC0gMSkgPT0gJy4nKSB7CiAgICAgICAgICAgICAgICAoKm91dF9sZW4pLS07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCEqYnVmX292ZXJmbG93ICYmICFzbm1wX3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgdV9jaGFyICopICJbIikpIHsKICAgICAgICAgICAgICAgICpidWZfb3ZlcmZsb3cgPSAxOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBzd2l0Y2ggKHRwLT50eXBlKSB7CiAgICAgICAgY2FzZSBUWVBFX09DVEVUU1RSOgogICAgICAgICAgICBpZiAoZXh0ZW5kZWRfaW5kZXggJiYgdHAtPmhpbnQpIHsKICAgICAgICAgICAgICAgIG5ldHNubXBfdmFyaWFibGVfbGlzdCB2YXI7CiAgICAgICAgICAgICAgICB1X2NoYXIgICAgICAgICAgYnVmZmVyWzEwMjRdOwogICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgIGk7CgogICAgICAgICAgICAgICAgbWVtc2V0KCZ2YXIsIDAsIHNpemVvZiB2YXIpOwogICAgICAgICAgICAgICAgaWYgKGluX2RpY2VzLT5pc2ltcGxpZWQpIHsKICAgICAgICAgICAgICAgICAgICBudW1pZHMgPSBvYmppZGxlbjsKICAgICAgICAgICAgICAgICAgICBpZiAobnVtaWRzID4gb2JqaWRsZW4pCiAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gZmluaXNoX2l0OwogICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0cC0+cmFuZ2VzICYmICF0cC0+cmFuZ2VzLT5uZXh0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIHRwLT5yYW5nZXMtPmxvdyA9PSB0cC0+cmFuZ2VzLT5oaWdoKSB7CiAgICAgICAgICAgICAgICAgICAgbnVtaWRzID0gdHAtPnJhbmdlcy0+bG93OwogICAgICAgICAgICAgICAgICAgIGlmIChudW1pZHMgPiBvYmppZGxlbikKICAgICAgICAgICAgICAgICAgICAgICAgZ290byBmaW5pc2hfaXQ7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIG51bWlkcyA9ICpvYmppZDsKICAgICAgICAgICAgICAgICAgICBpZiAobnVtaWRzID49IG9iamlkbGVuKQogICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGZpbmlzaF9pdDsKICAgICAgICAgICAgICAgICAgICBvYmppZCsrOwogICAgICAgICAgICAgICAgICAgIG9iamlkbGVuLS07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAobnVtaWRzID4gb2JqaWRsZW4pCiAgICAgICAgICAgICAgICAgICAgZ290byBmaW5pc2hfaXQ7CiAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgKGludCkgbnVtaWRzOyBpKyspCiAgICAgICAgICAgICAgICAgICAgYnVmZmVyW2ldID0gKHVfY2hhcikgb2JqaWRbaV07CiAgICAgICAgICAgICAgICB2YXIudHlwZSA9IEFTTl9PQ1RFVF9TVFI7CiAgICAgICAgICAgICAgICB2YXIudmFsLnN0cmluZyA9IGJ1ZmZlcjsKICAgICAgICAgICAgICAgIHZhci52YWxfbGVuID0gbnVtaWRzOwogICAgICAgICAgICAgICAgaWYgKCEqYnVmX292ZXJmbG93KSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCFzcHJpbnRfcmVhbGxvY19vY3RldF9zdHJpbmcoYnVmLCBidWZfbGVuLCBvdXRfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93X3JlYWxsb2MsICZ2YXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgdHAtPmhpbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgKmJ1Zl9vdmVyZmxvdyA9IDE7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgaWYgKGluX2RpY2VzLT5pc2ltcGxpZWQpIHsKICAgICAgICAgICAgICAgIG51bWlkcyA9IG9iamlkbGVuOwogICAgICAgICAgICAgICAgaWYgKG51bWlkcyA+IG9iamlkbGVuKQogICAgICAgICAgICAgICAgICAgIGdvdG8gZmluaXNoX2l0OwoKICAgICAgICAgICAgICAgIGlmICghKmJ1Zl9vdmVyZmxvdykgewogICAgICAgICAgICAgICAgICAgIGlmICghZHVtcF9yZWFsbG9jX29pZF90b19zdHJpbmcKICAgICAgICAgICAgICAgICAgICAgICAgKG9iamlkLCBudW1pZHMsIGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93X3JlYWxsb2MsICdcJycpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICpidWZfb3ZlcmZsb3cgPSAxOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIGlmICh0cC0+cmFuZ2VzICYmICF0cC0+cmFuZ2VzLT5uZXh0CiAgICAgICAgICAgICAgICAgICAgICAgJiYgdHAtPnJhbmdlcy0+bG93ID09IHRwLT5yYW5nZXMtPmhpZ2gpIHsKICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgKiBhIGZpeGVkLWxlbmd0aCBvY3RldCBzdHJpbmcgCiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIG51bWlkcyA9IHRwLT5yYW5nZXMtPmxvdzsKICAgICAgICAgICAgICAgIGlmIChudW1pZHMgPiBvYmppZGxlbikKICAgICAgICAgICAgICAgICAgICBnb3RvIGZpbmlzaF9pdDsKCiAgICAgICAgICAgICAgICBpZiAoISpidWZfb3ZlcmZsb3cpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoIWR1bXBfcmVhbGxvY19vaWRfdG9fc3RyaW5nCiAgICAgICAgICAgICAgICAgICAgICAgIChvYmppZCwgbnVtaWRzLCBidWYsIGJ1Zl9sZW4sIG91dF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd19yZWFsbG9jLCAnXCcnKSkgewogICAgICAgICAgICAgICAgICAgICAgICAqYnVmX292ZXJmbG93ID0gMTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBudW1pZHMgPSAoc2l6ZV90KSAqIG9iamlkICsgMTsKICAgICAgICAgICAgICAgIGlmIChudW1pZHMgPiBvYmppZGxlbikKICAgICAgICAgICAgICAgICAgICBnb3RvIGZpbmlzaF9pdDsKICAgICAgICAgICAgICAgIGlmIChudW1pZHMgPT0gMSkgewogICAgICAgICAgICAgICAgICAgIGlmIChuZXRzbm1wX2RzX2dldF9ib29sZWFuCiAgICAgICAgICAgICAgICAgICAgICAgIChORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX0VTQ0FQRV9RVU9URVMpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKmJ1Zl9vdmVyZmxvdwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgIXNubXBfc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCB1X2NoYXIgKikgIlxcIikpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICpidWZfb3ZlcmZsb3cgPSAxOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmICghKmJ1Zl9vdmVyZmxvdwogICAgICAgICAgICAgICAgICAgICAgICAmJiAhc25tcF9zdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCB1X2NoYXIgKikgIlwiIikpIHsKICAgICAgICAgICAgICAgICAgICAgICAgKmJ1Zl9vdmVyZmxvdyA9IDE7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmIChuZXRzbm1wX2RzX2dldF9ib29sZWFuCiAgICAgICAgICAgICAgICAgICAgICAgIChORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX0VTQ0FQRV9RVU9URVMpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKmJ1Zl9vdmVyZmxvdwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgIXNubXBfc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCB1X2NoYXIgKikgIlxcIikpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICpidWZfb3ZlcmZsb3cgPSAxOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmICghKmJ1Zl9vdmVyZmxvdwogICAgICAgICAgICAgICAgICAgICAgICAmJiAhc25tcF9zdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCB1X2NoYXIgKikgIlwiIikpIHsKICAgICAgICAgICAgICAgICAgICAgICAgKmJ1Zl9vdmVyZmxvdyA9IDE7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBpZiAoISpidWZfb3ZlcmZsb3cpIHsKICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHRyZWUgKiBuZXh0X3BlZXI7CiAgICAgICAgICAgICAgICAgICAgICAgIGludCBub3JtYWxfaGFuZGxpbmcgPSAxOwoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRwLT5uZXh0X3BlZXIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHRfcGVlciA9IHRwLT5uZXh0X3BlZXI7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIC8qIFRyeSBoYW5kbGluZyB0aGUgSW5ldEFkZHJlc3MgaW4gdGhlIE9JRCwgaW4gY2FzZSBvZiBmYWlsdXJlLAogICAgICAgICAgICAgICAgICAgICAgICAgKiB1c2UgdGhlIG5vcm1hbF9oYW5kbGluZy4gCiAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgICAgICAgICBpZiAodHAtPm5leHRfcGVlciAmJgogICAgICAgICAgICAgICAgICAgICAgICAgICAgdHAtPnRjX2luZGV4ICE9IC0xICYmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0X3BlZXItPnRjX2luZGV4ICE9IC0xICYmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJjbXAoZ2V0X3RjX2Rlc2NyaXB0b3IodHAtPnRjX2luZGV4KSwgIkluZXRBZGRyZXNzIikgPT0gMCAmJgogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyY21wKGdldF90Y19kZXNjcmlwdG9yKG5leHRfcGVlci0+dGNfaW5kZXgpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkluZXRBZGRyZXNzVHlwZSIpID09IDAgKSB7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJldDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhZGRyX3R5cGUgPSAqKG9iamlkIC0gMSk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0ID0gZHVtcF9yZWFsbG9jX29pZF90b19pbmV0YWRkcmVzcyhhZGRyX3R5cGUsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqaWQgKyAxLCBudW1pZHMgLSAxLCBidWYsIGJ1Zl9sZW4sIG91dF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd19yZWFsbG9jLCAnIicpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJldCAhPSAyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9ybWFsX2hhbmRsaW5nID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmV0ID09IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmJ1Zl9vdmVyZmxvdyA9IDE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSAKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5vcm1hbF9oYW5kbGluZyAmJiAhZHVtcF9yZWFsbG9jX29pZF90b19zdHJpbmcKICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvYmppZCArIDEsIG51bWlkcyAtIDEsIGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd19yZWFsbG9jLCAnIicpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqYnVmX292ZXJmbG93ID0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBvYmppZCArPSBudW1pZHM7CiAgICAgICAgICAgIG9iamlkbGVuIC09IG51bWlkczsKICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgVFlQRV9JTlRFR0VSMzI6CiAgICAgICAgY2FzZSBUWVBFX1VJTlRFR0VSOgogICAgICAgIGNhc2UgVFlQRV9VTlNJR05FRDMyOgogICAgICAgIGNhc2UgVFlQRV9HQVVHRToKICAgICAgICBjYXNlIFRZUEVfSU5URUdFUjoKICAgICAgICAgICAgaWYgKHRwLT5lbnVtcykgewogICAgICAgICAgICAgICAgc3RydWN0IGVudW1fbGlzdCAqZXAgPSB0cC0+ZW51bXM7CiAgICAgICAgICAgICAgICB3aGlsZSAoZXAgJiYgZXAtPnZhbHVlICE9IChpbnQpICgqb2JqaWQpKSB7CiAgICAgICAgICAgICAgICAgICAgZXAgPSBlcC0+bmV4dDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChlcCkgewogICAgICAgICAgICAgICAgICAgIGlmICghKmJ1Zl9vdmVyZmxvdwogICAgICAgICAgICAgICAgICAgICAgICAmJiAhc25tcF9zdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCB1X2NoYXIgKikgZXAtPmxhYmVsKSkgewogICAgICAgICAgICAgICAgICAgICAgICAqYnVmX292ZXJmbG93ID0gMTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIHNwcmludGYoaW50YnVmLCAiJWx1IiwgKm9iamlkKTsKICAgICAgICAgICAgICAgICAgICBpZiAoISpidWZfb3ZlcmZsb3cKICAgICAgICAgICAgICAgICAgICAgICAgJiYgIXNubXBfc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgdV9jaGFyICopIGludGJ1ZikpIHsKICAgICAgICAgICAgICAgICAgICAgICAgKmJ1Zl9vdmVyZmxvdyA9IDE7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgc3ByaW50ZihpbnRidWYsICIlbHUiLCAqb2JqaWQpOwogICAgICAgICAgICAgICAgaWYgKCEqYnVmX292ZXJmbG93ICYmICFzbm1wX3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCB1X2NoYXIgKikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50YnVmKSkgewogICAgICAgICAgICAgICAgICAgICpidWZfb3ZlcmZsb3cgPSAxOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIG9iamlkKys7CiAgICAgICAgICAgIG9iamlkbGVuLS07CiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlIFRZUEVfVElNRVRJQ0tTOgogICAgICAgICAgICAvKiBJbiBhbiBpbmRleCwgdGhpcyBpcyBwcm9iYWJseSBhIHRpbWVmaWx0ZXIgKi8KICAgICAgICAgICAgaWYgKGV4dGVuZGVkX2luZGV4KSB7CiAgICAgICAgICAgICAgICB1cHRpbWVTdHJpbmcoICpvYmppZCwgaW50YnVmLCBzaXplb2YoIGludGJ1ZiApICk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBzcHJpbnRmKGludGJ1ZiwgIiUiIE5FVFNOTVBfUFJJbyAidSIsICpvYmppZCk7CiAgICAgICAgICAgIH0gICAKICAgICAgICAgICAgaWYgKCEqYnVmX292ZXJmbG93ICYmICFzbm1wX3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgdV9jaGFyICopCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50YnVmKSkgewogICAgICAgICAgICAgICAgKmJ1Zl9vdmVyZmxvdyA9IDE7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgb2JqaWQrKzsKICAgICAgICAgICAgb2JqaWRsZW4tLTsKICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgVFlQRV9PQkpJRDoKICAgICAgICAgICAgaWYgKGluX2RpY2VzLT5pc2ltcGxpZWQpIHsKICAgICAgICAgICAgICAgIG51bWlkcyA9IG9iamlkbGVuOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgbnVtaWRzID0gKHNpemVfdCkgKiBvYmppZCArIDE7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKG51bWlkcyA+IG9iamlkbGVuKQogICAgICAgICAgICAgICAgZ290byBmaW5pc2hfaXQ7CiAgICAgICAgICAgIGlmIChleHRlbmRlZF9pbmRleCkgewogICAgICAgICAgICAgICAgaWYgKGluX2RpY2VzLT5pc2ltcGxpZWQpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoISpidWZfb3ZlcmZsb3cKICAgICAgICAgICAgICAgICAgICAgICAgJiYgIW5ldHNubXBfc3ByaW50X3JlYWxsb2Nfb2JqaWRfdHJlZShidWYsIGJ1Zl9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0X2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1Zl9vdmVyZmxvdywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmppZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1pZHMpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICpidWZfb3ZlcmZsb3cgPSAxOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCEqYnVmX292ZXJmbG93CiAgICAgICAgICAgICAgICAgICAgICAgICYmICFuZXRzbm1wX3NwcmludF9yZWFsbG9jX29iamlkX3RyZWUoYnVmLCBidWZfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZfb3ZlcmZsb3csCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqaWQgKyAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bWlkcyAtCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgKmJ1Zl9vdmVyZmxvdyA9IDE7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgX2dldF9yZWFsbG9jX3N5bWJvbChvYmppZCwgbnVtaWRzLCBOVUxMLCBidWYsIGJ1Zl9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsIGJ1Zl9vdmVyZmxvdywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgTlVMTCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgb2JqaWQgKz0gKG51bWlkcyk7CiAgICAgICAgICAgIG9iamlkbGVuIC09IChudW1pZHMpOwogICAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSBUWVBFX0lQQUREUjoKICAgICAgICAgICAgaWYgKG9iamlkbGVuIDwgNCkKICAgICAgICAgICAgICAgIGdvdG8gZmluaXNoX2l0OwogICAgICAgICAgICBzcHJpbnRmKGludGJ1ZiwgIiVsdS4lbHUuJWx1LiVsdSIsCiAgICAgICAgICAgICAgICAgICAgb2JqaWRbMF0sIG9iamlkWzFdLCBvYmppZFsyXSwgb2JqaWRbM10pOwogICAgICAgICAgICBvYmppZCArPSA0OwogICAgICAgICAgICBvYmppZGxlbiAtPSA0OwogICAgICAgICAgICBpZiAoISpidWZfb3ZlcmZsb3cgJiYgIXNubXBfc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCB1X2NoYXIgKikgaW50YnVmKSkgewogICAgICAgICAgICAgICAgKmJ1Zl9vdmVyZmxvdyA9IDE7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgVFlQRV9ORVRBRERSOnsKICAgICAgICAgICAgICAgIG9pZCAgICAgICAgICAgICBudHlwZSA9ICpvYmppZCsrOwoKICAgICAgICAgICAgICAgIG9iamlkbGVuLS07CiAgICAgICAgICAgICAgICBzcHJpbnRmKGludGJ1ZiwgIiVsdS4iLCBudHlwZSk7CiAgICAgICAgICAgICAgICBpZiAoISpidWZfb3ZlcmZsb3cgJiYgIXNubXBfc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IHVfY2hhciAqKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRidWYpKSB7CiAgICAgICAgICAgICAgICAgICAgKmJ1Zl9vdmVyZmxvdyA9IDE7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKG50eXBlID09IDEgJiYgb2JqaWRsZW4gPj0gNCkgewogICAgICAgICAgICAgICAgICAgIHNwcmludGYoaW50YnVmLCAiJWx1LiVsdS4lbHUuJWx1IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamlkWzBdLCBvYmppZFsxXSwgb2JqaWRbMl0sIG9iamlkWzNdKTsKICAgICAgICAgICAgICAgICAgICBpZiAoISpidWZfb3ZlcmZsb3cKICAgICAgICAgICAgICAgICAgICAgICAgJiYgIXNubXBfc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgdV9jaGFyICopIGludGJ1ZikpIHsKICAgICAgICAgICAgICAgICAgICAgICAgKmJ1Zl9vdmVyZmxvdyA9IDE7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIG9iamlkICs9IDQ7CiAgICAgICAgICAgICAgICAgICAgb2JqaWRsZW4gLT0gNDsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgZ290byBmaW5pc2hfaXQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgVFlQRV9OU0FQQUREUkVTUzoKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICBnb3RvIGZpbmlzaF9pdDsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQoKICAgICAgICBpZiAoZXh0ZW5kZWRfaW5kZXgpIHsKICAgICAgICAgICAgaWYgKCEqYnVmX292ZXJmbG93ICYmICFzbm1wX3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgdV9jaGFyICopICJdIikpIHsKICAgICAgICAgICAgICAgICpidWZfb3ZlcmZsb3cgPSAxOwogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgaWYgKCEqYnVmX292ZXJmbG93ICYmICFzbm1wX3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgdV9jaGFyICopICIuIikpIHsKICAgICAgICAgICAgICAgICpidWZfb3ZlcmZsb3cgPSAxOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGluX2RpY2VzID0gaW5fZGljZXMtPm5leHQ7CiAgICB9CgogIGZpbmlzaF9pdDoKICAgIF9vaWRfZmluaXNoX3ByaW50aW5nKG9iamlkLCBvYmppZGxlbiwKICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93X3JlYWxsb2MsIGJ1Zl9vdmVyZmxvdyk7CiAgICByZXR1cm4gTlVMTDsKfQoKc3RydWN0IHRyZWUgICAgKgpnZXRfdHJlZShjb25zdCBvaWQgKiBvYmppZCwgc2l6ZV90IG9iamlkbGVuLCBzdHJ1Y3QgdHJlZSAqc3VidHJlZSkKewogICAgc3RydWN0IHRyZWUgICAgKnJldHVybl90cmVlID0gTlVMTDsKCiAgICBmb3IgKDsgc3VidHJlZTsgc3VidHJlZSA9IHN1YnRyZWUtPm5leHRfcGVlcikgewogICAgICAgIGlmICgqb2JqaWQgPT0gc3VidHJlZS0+c3ViaWQpCiAgICAgICAgICAgIGdvdG8gZm91bmQ7CiAgICB9CgogICAgcmV0dXJuIE5VTEw7CgogIGZvdW5kOgogICAgd2hpbGUgKHN1YnRyZWUtPm5leHRfcGVlciAmJiBzdWJ0cmVlLT5uZXh0X3BlZXItPnN1YmlkID09ICpvYmppZCkKCXN1YnRyZWUgPSBzdWJ0cmVlLT5uZXh0X3BlZXI7CiAgICBpZiAob2JqaWRsZW4gPiAxKQogICAgICAgIHJldHVybl90cmVlID0KICAgICAgICAgICAgZ2V0X3RyZWUob2JqaWQgKyAxLCBvYmppZGxlbiAtIDEsIHN1YnRyZWUtPmNoaWxkX2xpc3QpOwogICAgaWYgKHJldHVybl90cmVlICE9IE5VTEwpCiAgICAgICAgcmV0dXJuIHJldHVybl90cmVlOwogICAgZWxzZQogICAgICAgIHJldHVybiBzdWJ0cmVlOwp9CgovKioKICogUHJpbnRzIG9uIG9pZCBkZXNjcmlwdGlvbiBvbiBzdGRvdXQuCiAqCiAqIEBzZWUgZnByaW50X2Rlc2NyaXB0aW9uCiAqLwp2b2lkCnByaW50X2Rlc2NyaXB0aW9uKG9pZCAqIG9iamlkLCBzaXplX3Qgb2JqaWRsZW4sIC8qIG51bWJlciBvZiBzdWJpZGVudGlmaWVycyAqLwogICAgICAgICAgICAgICAgICBpbnQgd2lkdGgpCnsKICAgIGZwcmludF9kZXNjcmlwdGlvbihzdGRvdXQsIG9iamlkLCBvYmppZGxlbiwgd2lkdGgpOwp9CgoKLyoqCiAqIFByaW50cyBvbiBvaWQgZGVzY3JpcHRpb24gaW50byBhIGZpbGUgZGVzY3JpcHRvci4KICogCiAqIEBwYXJhbSBmICAgICAgICAgVGhlIGZpbGUgZGVzY3JpcHRvciB0byBwcmludCB0by4KICogQHBhcmFtIG9iamlkICAgICBUaGUgb2JqZWN0IGlkZW50aWZpZXIuCiAqIEBwYXJhbSBvYmppZGxlbiAgVGhlIG9iamVjdCBpZCBsZW5ndGguCiAqIEBwYXJhbSB3aWR0aCAgICAgTnVtYmVyIG9mIHN1YmlkZW50aWZpZXJzLgogKi8Kdm9pZApmcHJpbnRfZGVzY3JpcHRpb24oRklMRSAqIGYsIG9pZCAqIG9iamlkLCBzaXplX3Qgb2JqaWRsZW4sCiAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgpCnsKICAgIHVfY2hhciAgICAgICAgICpidWYgPSBOVUxMOwogICAgc2l6ZV90ICAgICAgICAgIGJ1Zl9sZW4gPSAyNTYsIG91dF9sZW4gPSAwOwoKICAgIGlmICgoYnVmID0gKHVfY2hhciAqKSBjYWxsb2MoYnVmX2xlbiwgMSkpID09IE5VTEwpIHsKICAgICAgICBmcHJpbnRmKGYsICJbVFJVTkNBVEVEXVxuIik7CiAgICAgICAgcmV0dXJuOwogICAgfSBlbHNlIHsKICAgICAgICBpZiAoIXNwcmludF9yZWFsbG9jX2Rlc2NyaXB0aW9uKCZidWYsICZidWZfbGVuLCAmb3V0X2xlbiwgMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmppZCwgb2JqaWRsZW4sIHdpZHRoKSkgewogICAgICAgICAgICBmcHJpbnRmKGYsICIlcyBbVFJVTkNBVEVEXVxuIiwgYnVmKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBmcHJpbnRmKGYsICIlc1xuIiwgYnVmKTsKICAgICAgICB9CiAgICB9CgogICAgU05NUF9GUkVFKGJ1Zik7Cn0KCmludApzbnByaW50X2Rlc2NyaXB0aW9uKGNoYXIgKmJ1Ziwgc2l6ZV90IGJ1Zl9sZW4sCiAgICAgICAgICAgICAgICAgICAgb2lkICogb2JqaWQsIHNpemVfdCBvYmppZGxlbiwgaW50IHdpZHRoKQp7CiAgICBzaXplX3QgICAgICAgICAgb3V0X2xlbiA9IDA7CgogICAgaWYgKHNwcmludF9yZWFsbG9jX2Rlc2NyaXB0aW9uKCh1X2NoYXIgKiopICYgYnVmLCAmYnVmX2xlbiwgJm91dF9sZW4sIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamlkLCBvYmppZGxlbiwgd2lkdGgpKSB7CiAgICAgICAgcmV0dXJuIChpbnQpIG91dF9sZW47CiAgICB9IGVsc2UgewogICAgICAgIHJldHVybiAtMTsKICAgIH0KfQoKaW50CnNwcmludF9yZWFsbG9jX2Rlc2NyaXB0aW9uKHVfY2hhciAqKiBidWYsIHNpemVfdCAqIGJ1Zl9sZW4sCiAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAqIG91dF9sZW4sIGludCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICBvaWQgKiBvYmppZCwgc2l6ZV90IG9iamlkbGVuLCBpbnQgd2lkdGgpCnsKICAgIHN0cnVjdCB0cmVlICAgICp0cCA9IGdldF90cmVlKG9iamlkLCBvYmppZGxlbiwgdHJlZV9oZWFkKTsKICAgIHN0cnVjdCB0cmVlICAgICpzdWJ0cmVlID0gdHJlZV9oZWFkOwogICAgaW50ICAgICAgICAgICAgIHBvcywgbGVuOwogICAgY2hhciAgICAgICAgICAgIHRtcGJ1ZlsxMjhdOwogICAgY29uc3QgY2hhciAgICAgKmNwOwoKICAgIGlmIChOVUxMID09IHRwKQogICAgICAgIHJldHVybiAwOwoKICAgIGlmICh0cC0+dHlwZSA8PSBUWVBFX1NJTVBMRV9MQVNUKQogICAgICAgIGNwID0gIiBPQkpFQ1QtVFlQRSI7CiAgICBlbHNlCiAgICAgICAgc3dpdGNoICh0cC0+dHlwZSkgewogICAgICAgIGNhc2UgVFlQRV9UUkFQVFlQRToKICAgICAgICAgICAgY3AgPSAiIFRSQVAtVFlQRSI7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgVFlQRV9OT1RJRlRZUEU6CiAgICAgICAgICAgIGNwID0gIiBOT1RJRklDQVRJT04tVFlQRSI7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgVFlQRV9PQkpHUk9VUDoKICAgICAgICAgICAgY3AgPSAiIE9CSkVDVC1HUk9VUCI7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgVFlQRV9BR0VOVENBUDoKICAgICAgICAgICAgY3AgPSAiIEFHRU5ULUNBUEFCSUxJVElFUyI7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgVFlQRV9NT0RJRDoKICAgICAgICAgICAgY3AgPSAiIE1PRFVMRS1JREVOVElUWSI7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgVFlQRV9PQkpJREVOVElUWToKICAgICAgICAgICAgY3AgPSAiIE9CSkVDVC1JREVOVElUWSI7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgVFlQRV9NT0RDT01QOgogICAgICAgICAgICBjcCA9ICIgTU9EVUxFLUNPTVBMSUFOQ0UiOwogICAgICAgICAgICBicmVhazsKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICBzcHJpbnRmKHRtcGJ1ZiwgIiB0eXBlXyVkIiwgdHAtPnR5cGUpOwogICAgICAgICAgICBjcCA9IHRtcGJ1ZjsKICAgICAgICB9CgogICAgaWYgKCFzbm1wX2NzdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCB0cC0+bGFiZWwpIHx8CiAgICAgICAgIXNubXBfY3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsIGNwKSB8fAogICAgICAgICFzbm1wX2NzdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCAiXG4iKSkgewogICAgICAgIHJldHVybiAwOwogICAgfQogICAgaWYgKCFwcmludF90cmVlX25vZGUoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCB0cCwgd2lkdGgpKQogICAgICAgIHJldHVybiAwOwogICAgaWYgKCFzbm1wX2NzdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCAiOjo9IHsiKSkKICAgICAgICByZXR1cm4gMDsKICAgIHBvcyA9IDU7CiAgICB3aGlsZSAob2JqaWRsZW4gPiAxKSB7CiAgICAgICAgZm9yICg7IHN1YnRyZWU7IHN1YnRyZWUgPSBzdWJ0cmVlLT5uZXh0X3BlZXIpIHsKICAgICAgICAgICAgaWYgKCpvYmppZCA9PSBzdWJ0cmVlLT5zdWJpZCkgewogICAgICAgICAgICAgICAgd2hpbGUgKHN1YnRyZWUtPm5leHRfcGVlciAmJiBzdWJ0cmVlLT5uZXh0X3BlZXItPnN1YmlkID09ICpvYmppZCkKICAgICAgICAgICAgICAgICAgICBzdWJ0cmVlID0gc3VidHJlZS0+bmV4dF9wZWVyOwogICAgICAgICAgICAgICAgaWYgKHN0cm5jbXAoc3VidHJlZS0+bGFiZWwsIEFOT04sIEFOT05fTEVOKSkgewogICAgICAgICAgICAgICAgICAgIHNucHJpbnRmKHRtcGJ1Ziwgc2l6ZW9mKHRtcGJ1ZiksICIgJXMoJWx1KSIsIHN1YnRyZWUtPmxhYmVsLCBzdWJ0cmVlLT5zdWJpZCk7CiAgICAgICAgICAgICAgICAgICAgdG1wYnVmWyBzaXplb2YodG1wYnVmKS0xIF0gPSAwOwogICAgICAgICAgICAgICAgfSBlbHNlCiAgICAgICAgICAgICAgICAgICAgc3ByaW50Zih0bXBidWYsICIgJWx1Iiwgc3VidHJlZS0+c3ViaWQpOwogICAgICAgICAgICAgICAgbGVuID0gc3RybGVuKHRtcGJ1Zik7CiAgICAgICAgICAgICAgICBpZiAocG9zICsgbGVuICsgMiA+IHdpZHRoKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCFzbm1wX2NzdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dfcmVhbGxvYywgIlxuICAgICAiKSkKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgICAgICAgICAgcG9zID0gNTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICghc25tcF9jc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgdG1wYnVmKSkKICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgICAgIHBvcyArPSBsZW47CiAgICAgICAgICAgICAgICBvYmppZCsrOwogICAgICAgICAgICAgICAgb2JqaWRsZW4tLTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmIChzdWJ0cmVlKQogICAgICAgICAgICBzdWJ0cmVlID0gc3VidHJlZS0+Y2hpbGRfbGlzdDsKICAgICAgICBlbHNlCiAgICAgICAgICAgIGJyZWFrOwogICAgfQogICAgd2hpbGUgKG9iamlkbGVuID4gMSkgewogICAgICAgIHNwcmludGYodG1wYnVmLCAiICVsdSIsICpvYmppZCk7CiAgICAgICAgbGVuID0gc3RybGVuKHRtcGJ1Zik7CiAgICAgICAgaWYgKHBvcyArIGxlbiArIDIgPiB3aWR0aCkgewogICAgICAgICAgICBpZiAoIXNubXBfY3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsICJcbiAgICAgIikpCiAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgcG9zID0gNTsKICAgICAgICB9CiAgICAgICAgaWYgKCFzbm1wX2NzdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCB0bXBidWYpKQogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICBwb3MgKz0gbGVuOwogICAgICAgIG9iamlkKys7CiAgICAgICAgb2JqaWRsZW4tLTsKICAgIH0KICAgIHNwcmludGYodG1wYnVmLCAiICVsdSB9IiwgKm9iamlkKTsKICAgIGxlbiA9IHN0cmxlbih0bXBidWYpOwogICAgaWYgKHBvcyArIGxlbiArIDIgPiB3aWR0aCkgewogICAgICAgIGlmICghc25tcF9jc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgIlxuICAgICAiKSkKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgcG9zID0gNTsKICAgIH0KICAgIGlmICghc25tcF9jc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgdG1wYnVmKSkKICAgICAgICByZXR1cm4gMDsKICAgIHJldHVybiAxOwp9CgpzdGF0aWMgaW50CnByaW50X3RyZWVfbm9kZSh1X2NoYXIgKiogYnVmLCBzaXplX3QgKiBidWZfbGVuLAogICAgICAgICAgICAgICAgICAgICBzaXplX3QgKiBvdXRfbGVuLCBpbnQgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHRyZWUgKnRwLCBpbnQgd2lkdGgpCnsKICAgIGNvbnN0IGNoYXIgICAgICpjcDsKICAgIGNoYXIgICAgICAgICAgICBzdHJbTUFYVE9LRU5dOwogICAgaW50ICAgICAgICAgICAgIGksIHByZXZtb2QsIHBvcywgbGVuOwoKICAgIGlmICh0cCkgewogICAgICAgIG1vZHVsZV9uYW1lKHRwLT5tb2RpZCwgc3RyKTsKICAgICAgICBpZiAoIXNubXBfY3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsICIgIC0tIEZST01cdCIpIHx8CiAgICAgICAgICAgICFzbm1wX2NzdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCBzdHIpKQogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICBwb3MgPSAxNitzdHJsZW4oc3RyKTsKICAgICAgICBmb3IgKGkgPSAxLCBwcmV2bW9kID0gdHAtPm1vZGlkOyBpIDwgdHAtPm51bWJlcl9tb2R1bGVzOyBpKyspIHsKICAgICAgICAgICAgaWYgKHByZXZtb2QgIT0gdHAtPm1vZHVsZV9saXN0W2ldKSB7CiAgICAgICAgICAgICAgICBtb2R1bGVfbmFtZSh0cC0+bW9kdWxlX2xpc3RbaV0sIHN0cik7CiAgICAgICAgICAgICAgICBsZW4gPSBzdHJsZW4oc3RyKTsKICAgICAgICAgICAgICAgIGlmIChwb3MgKyBsZW4gKyAyID4gd2lkdGgpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoIXNubXBfY3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLFxuICAtLVx0XHQiKSkKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgICAgICAgICAgcG9zID0gMTY7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBpZiAoIXNubXBfY3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsICIsICIpKQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgICAgICAgICBwb3MgKz0gMjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICghc25tcF9jc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgc3RyKSkKICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgICAgIHBvcyArPSBsZW47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcHJldm1vZCA9IHRwLT5tb2R1bGVfbGlzdFtpXTsKICAgICAgICB9CiAgICAgICAgaWYgKCFzbm1wX2NzdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCAiXG4iKSkKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgaWYgKHRwLT50Y19pbmRleCAhPSAtMSkgewogICAgICAgICAgICBpZiAoIXNubXBfY3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIC0tIFRFWFRVQUwgQ09OVkVOVElPTiAiKSB8fAogICAgICAgICAgICAgICAgIXNubXBfY3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldF90Y19kZXNjcmlwdG9yKHRwLT50Y19pbmRleCkpIHx8CiAgICAgICAgICAgICAgICAhc25tcF9jc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgIlxuIikpCiAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CiAgICAgICAgc3dpdGNoICh0cC0+dHlwZSkgewogICAgICAgIGNhc2UgVFlQRV9PQkpJRDoKICAgICAgICAgICAgY3AgPSAiT0JKRUNUIElERU5USUZJRVIiOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIFRZUEVfT0NURVRTVFI6CiAgICAgICAgICAgIGNwID0gIk9DVEVUIFNUUklORyI7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgVFlQRV9JTlRFR0VSOgogICAgICAgICAgICBjcCA9ICJJTlRFR0VSIjsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBUWVBFX05FVEFERFI6CiAgICAgICAgICAgIGNwID0gIk5ldHdvcmtBZGRyZXNzIjsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBUWVBFX0lQQUREUjoKICAgICAgICAgICAgY3AgPSAiSXBBZGRyZXNzIjsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBUWVBFX0NPVU5URVI6CiAgICAgICAgICAgIGNwID0gIkNvdW50ZXIzMiI7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgVFlQRV9HQVVHRToKICAgICAgICAgICAgY3AgPSAiR2F1Z2UzMiI7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgVFlQRV9USU1FVElDS1M6CiAgICAgICAgICAgIGNwID0gIlRpbWVUaWNrcyI7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgVFlQRV9PUEFRVUU6CiAgICAgICAgICAgIGNwID0gIk9wYXF1ZSI7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgVFlQRV9OVUxMOgogICAgICAgICAgICBjcCA9ICJOVUxMIjsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBUWVBFX0NPVU5URVI2NDoKICAgICAgICAgICAgY3AgPSAiQ291bnRlcjY0IjsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBUWVBFX0JJVFNUUklORzoKICAgICAgICAgICAgY3AgPSAiQklUUyI7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgVFlQRV9OU0FQQUREUkVTUzoKICAgICAgICAgICAgY3AgPSAiTnNhcEFkZHJlc3MiOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIFRZUEVfVUlOVEVHRVI6CiAgICAgICAgICAgIGNwID0gIlVJbnRlZ2VyMzIiOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIFRZUEVfVU5TSUdORUQzMjoKICAgICAgICAgICAgY3AgPSAiVW5zaWduZWQzMiI7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgVFlQRV9JTlRFR0VSMzI6CiAgICAgICAgICAgIGNwID0gIkludGVnZXIzMiI7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIGNwID0gTlVMTDsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQojaWYgTkVUU05NUF9FTkFCTEVfVEVTVElOR19DT0RFCiAgICAgICAgaWYgKCFjcCAmJiAodHAtPnJhbmdlcyB8fCB0cC0+ZW51bXMpKSB7IC8qIHJhbmdlcyB3aXRob3V0IHR5cGUgPyAqLwogICAgICAgICAgICBzcHJpbnRmKHN0ciwgIj8wIHdpdGggJXMgJXMgPyIsCiAgICAgICAgICAgICAgICAgICAgdHAtPnJhbmdlcyA/ICJSYW5nZSIgOiAiIiwgdHAtPmVudW1zID8gIkVudW0iIDogIiIpOwogICAgICAgICAgICBjcCA9IHN0cjsKICAgICAgICB9CiNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTkVUU05NUF9FTkFCTEVfVEVTVElOR19DT0RFICovCiAgICAgICAgaWYgKGNwKQogICAgICAgICAgICBpZiAoIXNubXBfY3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgU1lOVEFYXHQiKSB8fAogICAgICAgICAgICAgICAgIXNubXBfY3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsIGNwKSkKICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIGlmICh0cC0+cmFuZ2VzKSB7CiAgICAgICAgICAgIHN0cnVjdCByYW5nZV9saXN0ICpycCA9IHRwLT5yYW5nZXM7CiAgICAgICAgICAgIGludCAgICAgICAgICAgICBmaXJzdCA9IDE7CiAgICAgICAgICAgIGlmICghc25tcF9jc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgIiAoIikpCiAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgd2hpbGUgKHJwKSB7CiAgICAgICAgICAgICAgICBzd2l0Y2ggKHRwLT50eXBlKSB7CiAgICAgICAgICAgICAgICBjYXNlIFRZUEVfSU5URUdFUjoKICAgICAgICAgICAgICAgIGNhc2UgVFlQRV9JTlRFR0VSMzI6CiAgICAgICAgICAgICAgICAgICAgaWYgKHJwLT5sb3cgPT0gcnAtPmhpZ2gpCiAgICAgICAgICAgICAgICAgICAgICAgIHNwcmludGYoc3RyLCAiJXMlZCIsIChmaXJzdCA/ICIiIDogIiB8ICIpLCBycC0+bG93ICk7CiAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICBzcHJpbnRmKHN0ciwgIiVzJWQuLiVkIiwgKGZpcnN0ID8gIiIgOiAiIHwgIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnAtPmxvdywgcnAtPmhpZ2gpOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSBUWVBFX1VOU0lHTkVEMzI6CiAgICAgICAgICAgICAgICBjYXNlIFRZUEVfT0NURVRTVFI6CiAgICAgICAgICAgICAgICBjYXNlIFRZUEVfR0FVR0U6CiAgICAgICAgICAgICAgICBjYXNlIFRZUEVfVUlOVEVHRVI6CiAgICAgICAgICAgICAgICAgICAgaWYgKHJwLT5sb3cgPT0gcnAtPmhpZ2gpCiAgICAgICAgICAgICAgICAgICAgICAgIHNwcmludGYoc3RyLCAiJXMldSIsIChmaXJzdCA/ICIiIDogIiB8ICIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZClycC0+bG93ICk7CiAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICBzcHJpbnRmKHN0ciwgIiVzJXUuLiV1IiwgKGZpcnN0ID8gIiIgOiAiIHwgIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkKXJwLT5sb3csICh1bnNpZ25lZClycC0+aGlnaCk7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgIC8qIE5vIG90aGVyIHJhbmdlIHR5cGVzIGFsbG93ZWQgKi8KICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICghc25tcF9jc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgc3RyKSkKICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgICAgIGlmIChmaXJzdCkKICAgICAgICAgICAgICAgICAgICBmaXJzdCA9IDA7CiAgICAgICAgICAgICAgICBycCA9IHJwLT5uZXh0OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghc25tcF9jc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgIikgIikpCiAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CiAgICAgICAgaWYgKHRwLT5lbnVtcykgewogICAgICAgICAgICBzdHJ1Y3QgZW51bV9saXN0ICplcCA9IHRwLT5lbnVtczsKICAgICAgICAgICAgaW50ICAgICAgICAgICAgIGZpcnN0ID0gMTsKICAgICAgICAgICAgaWYgKCFzbm1wX2NzdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCAiIHsiKSkKICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICBwb3MgPSAxNiArIHN0cmxlbihjcCkgKyAyOwogICAgICAgICAgICB3aGlsZSAoZXApIHsKICAgICAgICAgICAgICAgIGlmIChmaXJzdCkKICAgICAgICAgICAgICAgICAgICBmaXJzdCA9IDA7CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgaWYgKCFzbm1wX2NzdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCAiLCAiKSkKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgICAgICBzbnByaW50ZihzdHIsIHNpemVvZihzdHIpLCAiJXMoJWQpIiwgZXAtPmxhYmVsLCBlcC0+dmFsdWUpOwogICAgICAgICAgICAgICAgc3RyWyBzaXplb2Yoc3RyKS0xIF0gPSAwOwogICAgICAgICAgICAgICAgbGVuID0gc3RybGVuKHN0cik7CiAgICAgICAgICAgICAgICBpZiAocG9zICsgbGVuICsgMiA+IHdpZHRoKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCFzbm1wX2NzdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dfcmVhbGxvYywgIlxuXHRcdCAgIikpCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICAgICAgICAgIHBvcyA9IDE4OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKCFzbm1wX2NzdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCBzdHIpKQogICAgICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICAgICAgcG9zICs9IGxlbiArIDI7CiAgICAgICAgICAgICAgICBlcCA9IGVwLT5uZXh0OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghc25tcF9jc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgIn0gIikpCiAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CiAgICAgICAgaWYgKGNwKQogICAgICAgICAgICBpZiAoIXNubXBfY3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsICJcbiIpKQogICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgaWYgKHRwLT5oaW50KQogICAgICAgICAgICBpZiAoIXNubXBfY3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgRElTUExBWS1ISU5UXHRcIiIpIHx8CiAgICAgICAgICAgICAgICAhc25tcF9jc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgdHAtPmhpbnQpIHx8CiAgICAgICAgICAgICAgICAhc25tcF9jc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgIlwiXG4iKSkKICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIGlmICh0cC0+dW5pdHMpCiAgICAgICAgICAgIGlmICghc25tcF9jc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICBVTklUU1x0XHRcIiIpIHx8CiAgICAgICAgICAgICAgICAhc25tcF9jc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgdHAtPnVuaXRzKSB8fAogICAgICAgICAgICAgICAgIXNubXBfY3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsICJcIlxuIikpCiAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICBzd2l0Y2ggKHRwLT5hY2Nlc3MpIHsKICAgICAgICBjYXNlIE1JQl9BQ0NFU1NfUkVBRE9OTFk6CiAgICAgICAgICAgIGNwID0gInJlYWQtb25seSI7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgTUlCX0FDQ0VTU19SRUFEV1JJVEU6CiAgICAgICAgICAgIGNwID0gInJlYWQtd3JpdGUiOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIE1JQl9BQ0NFU1NfV1JJVEVPTkxZOgogICAgICAgICAgICBjcCA9ICJ3cml0ZS1vbmx5IjsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBNSUJfQUNDRVNTX05PQUNDRVNTOgogICAgICAgICAgICBjcCA9ICJub3QtYWNjZXNzaWJsZSI7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgTUlCX0FDQ0VTU19OT1RJRlk6CiAgICAgICAgICAgIGNwID0gImFjY2Vzc2libGUtZm9yLW5vdGlmeSI7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgTUlCX0FDQ0VTU19DUkVBVEU6CiAgICAgICAgICAgIGNwID0gInJlYWQtY3JlYXRlIjsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAwOgogICAgICAgICAgICBjcCA9IE5VTEw7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIHNwcmludGYoc3RyLCAiYWNjZXNzXyVkIiwgdHAtPmFjY2Vzcyk7CiAgICAgICAgICAgIGNwID0gc3RyOwogICAgICAgIH0KICAgICAgICBpZiAoY3ApCiAgICAgICAgICAgIGlmICghc25tcF9jc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICBNQVgtQUNDRVNTXHQiKSB8fAogICAgICAgICAgICAgICAgIXNubXBfY3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsIGNwKSB8fAogICAgICAgICAgICAgICAgIXNubXBfY3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsICJcbiIpKQogICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgc3dpdGNoICh0cC0+c3RhdHVzKSB7CiAgICAgICAgY2FzZSBNSUJfU1RBVFVTX01BTkRBVE9SWToKICAgICAgICAgICAgY3AgPSAibWFuZGF0b3J5IjsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBNSUJfU1RBVFVTX09QVElPTkFMOgogICAgICAgICAgICBjcCA9ICJvcHRpb25hbCI7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgTUlCX1NUQVRVU19PQlNPTEVURToKICAgICAgICAgICAgY3AgPSAib2Jzb2xldGUiOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIE1JQl9TVEFUVVNfREVQUkVDQVRFRDoKICAgICAgICAgICAgY3AgPSAiZGVwcmVjYXRlZCI7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgTUlCX1NUQVRVU19DVVJSRU5UOgogICAgICAgICAgICBjcCA9ICJjdXJyZW50IjsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAwOgogICAgICAgICAgICBjcCA9IE5VTEw7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIHNwcmludGYoc3RyLCAic3RhdHVzXyVkIiwgdHAtPnN0YXR1cyk7CiAgICAgICAgICAgIGNwID0gc3RyOwogICAgICAgIH0KI2lmIE5FVFNOTVBfRU5BQkxFX1RFU1RJTkdfQ09ERQogICAgICAgIGlmICghY3AgJiYgKHRwLT5pbmRleGVzKSkgeyAgICAgLyogaW5kZXggd2l0aG91dCBzdGF0dXMgPyAqLwogICAgICAgICAgICBzcHJpbnRmKHN0ciwgIj8wIHdpdGggJXMgPyIsIHRwLT5pbmRleGVzID8gIkluZGV4IiA6ICIiKTsKICAgICAgICAgICAgY3AgPSBzdHI7CiAgICAgICAgfQojZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE5FVFNOTVBfRU5BQkxFX1RFU1RJTkdfQ09ERSAqLwogICAgICAgIGlmIChjcCkKICAgICAgICAgICAgaWYgKCFzbm1wX2NzdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIFNUQVRVU1x0IikgfHwKICAgICAgICAgICAgICAgICFzbm1wX2NzdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCBjcCkgfHwKICAgICAgICAgICAgICAgICFzbm1wX2NzdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCAiXG4iKSkKICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIGlmICh0cC0+YXVnbWVudHMpCiAgICAgICAgICAgIGlmICghc25tcF9jc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICBBVUdNRU5UU1x0eyAiKSB8fAogICAgICAgICAgICAgICAgIXNubXBfY3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsIHRwLT5hdWdtZW50cykgfHwKICAgICAgICAgICAgICAgICFzbm1wX2NzdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCAiIH1cbiIpKQogICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgaWYgKHRwLT5pbmRleGVzKSB7CiAgICAgICAgICAgIHN0cnVjdCBpbmRleF9saXN0ICppcCA9IHRwLT5pbmRleGVzOwogICAgICAgICAgICBpbnQgICAgICAgICAgICAgZmlyc3QgPSAxOwogICAgICAgICAgICBpZiAoIXNubXBfY3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgSU5ERVhcdFx0eyAiKSkKICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICBwb3MgPSAxNiArIDI7CiAgICAgICAgICAgIHdoaWxlIChpcCkgewogICAgICAgICAgICAgICAgaWYgKGZpcnN0KQogICAgICAgICAgICAgICAgICAgIGZpcnN0ID0gMDsKICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICBpZiAoIXNubXBfY3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsICIsICIpKQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgICAgIHNucHJpbnRmKHN0ciwgc2l6ZW9mKHN0ciksICIlcyVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgaXAtPmlzaW1wbGllZCA/ICJJTVBMSUVEICIgOiAiIiwKICAgICAgICAgICAgICAgICAgICAgICAgaXAtPmlsYWJlbCk7CiAgICAgICAgICAgICAgICBzdHJbIHNpemVvZihzdHIpLTEgXSA9IDA7CiAgICAgICAgICAgICAgICBsZW4gPSBzdHJsZW4oc3RyKTsKICAgICAgICAgICAgICAgIGlmIChwb3MgKyBsZW4gKyAyID4gd2lkdGgpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoIXNubXBfY3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsICJcblx0XHQgICIpKQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgICAgICAgICBwb3MgPSAxNiArIDI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoIXNubXBfY3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsIHN0cikpCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgICAgICBwb3MgKz0gbGVuICsgMjsKICAgICAgICAgICAgICAgIGlwID0gaXAtPm5leHQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCFzbm1wX2NzdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCAiIH1cbiIpKQogICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQogICAgICAgIGlmICh0cC0+dmFyYmluZHMpIHsKICAgICAgICAgICAgc3RydWN0IHZhcmJpbmRfbGlzdCAqdnAgPSB0cC0+dmFyYmluZHM7CiAgICAgICAgICAgIGludCAgICAgICAgICAgICBmaXJzdCA9IDE7CgogICAgICAgICAgICBpZiAodHAtPnR5cGUgPT0gVFlQRV9UUkFQVFlQRSkgewogICAgICAgICAgICAgICAgaWYgKCFzbm1wX2NzdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICIgIFZBUklBQkxFU1x0eyAiKSkKICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGlmICghc25tcF9jc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAiICBPQkpFQ1RTXHR7ICIpKQogICAgICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHBvcyA9IDE2ICsgMjsKICAgICAgICAgICAgd2hpbGUgKHZwKSB7CiAgICAgICAgICAgICAgICBpZiAoZmlyc3QpCiAgICAgICAgICAgICAgICAgICAgZmlyc3QgPSAwOwogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgIGlmICghc25tcF9jc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgIiwgIikpCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICAgICAgc3RybGNweShzdHIsIHZwLT52YmxhYmVsLCBzaXplb2Yoc3RyKSk7CiAgICAgICAgICAgICAgICBsZW4gPSBzdHJsZW4oc3RyKTsKICAgICAgICAgICAgICAgIGlmIChwb3MgKyBsZW4gKyAyID4gd2lkdGgpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoIXNubXBfY3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcblx0XHQgICIpKQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgICAgICAgICBwb3MgPSAxNiArIDI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoIXNubXBfY3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsIHN0cikpCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgICAgICBwb3MgKz0gbGVuICsgMjsKICAgICAgICAgICAgICAgIHZwID0gdnAtPm5leHQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCFzbm1wX2NzdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCAiIH1cbiIpKQogICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQogICAgICAgIGlmICh0cC0+ZGVzY3JpcHRpb24pCiAgICAgICAgICAgIGlmICghc25tcF9jc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgREVTQ1JJUFRJT05cdFwiIikgfHwKICAgICAgICAgICAgICAgICFzbm1wX2NzdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCB0cC0+ZGVzY3JpcHRpb24pIHx8CiAgICAgICAgICAgICAgICAhc25tcF9jc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgIlwiXG4iKSkKICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIGlmICh0cC0+ZGVmYXVsdFZhbHVlKQogICAgICAgICAgICBpZiAoIXNubXBfY3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIERFRlZBTFx0eyAiKSB8fAogICAgICAgICAgICAgICAgIXNubXBfY3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsIHRwLT5kZWZhdWx0VmFsdWUpIHx8CiAgICAgICAgICAgICAgICAhc25tcF9jc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgIiB9XG4iKSkKICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgfSBlbHNlCiAgICAgICAgaWYgKCFzbm1wX2NzdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCAiTm8gZGVzY3JpcHRpb25cbiIpKQogICAgICAgICAgICByZXR1cm4gMDsKICAgIHJldHVybiAxOwp9CgppbnQKZ2V0X21vZHVsZV9ub2RlKGNvbnN0IGNoYXIgKmZuYW1lLAogICAgICAgICAgICAgICAgY29uc3QgY2hhciAqbW9kdWxlLCBvaWQgKiBvYmppZCwgc2l6ZV90ICogb2JqaWRsZW4pCnsKICAgIGludCAgICAgICAgICAgICBtb2RpZCwgcmMgPSAwOwogICAgc3RydWN0IHRyZWUgICAgKnRwOwogICAgY2hhciAgICAgICAgICAgKm5hbWUsICpjcDsKCiAgICBpZiAoIXN0cmNtcChtb2R1bGUsICJBTlkiKSkKICAgICAgICBtb2RpZCA9IC0xOwogICAgZWxzZSB7CiAgICAgICAgbmV0c25tcF9yZWFkX21vZHVsZShtb2R1bGUpOwogICAgICAgIG1vZGlkID0gd2hpY2hfbW9kdWxlKG1vZHVsZSk7CiAgICAgICAgaWYgKG1vZGlkID09IC0xKQogICAgICAgICAgICByZXR1cm4gMDsKICAgIH0KCiAgICAvKgogICAgICogSXNvbGF0ZSB0aGUgZmlyc3QgY29tcG9uZW50IG9mIHRoZSBuYW1lIC4uLiAKICAgICAqLwogICAgbmFtZSA9IHN0cmR1cChmbmFtZSk7CiAgICBjcCA9IHN0cmNocihuYW1lLCAnLicpOwogICAgaWYgKGNwICE9IE5VTEwpIHsKICAgICAgICAqY3AgPSAnXDAnOwogICAgICAgIGNwKys7CiAgICB9CiAgICAvKgogICAgICogLi4uIGFuZCBsb2NhdGUgaXQgaW4gdGhlIHRyZWUuIAogICAgICovCiAgICB0cCA9IGZpbmRfdHJlZV9ub2RlKG5hbWUsIG1vZGlkKTsKICAgIGlmICh0cCkgewogICAgICAgIHNpemVfdCAgICAgICAgICBtYXhsZW4gPSAqb2JqaWRsZW47CgogICAgICAgIC8qCiAgICAgICAgICogU2V0IHRoZSBmaXJzdCBlbGVtZW50IG9mIHRoZSBvYmplY3QgSUQgCiAgICAgICAgICovCiAgICAgICAgaWYgKG5vZGVfdG9fb2lkKHRwLCBvYmppZCwgb2JqaWRsZW4pKSB7CiAgICAgICAgICAgIHJjID0gMTsKCiAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAqIElmIHRoZSBuYW1lIHJlcXVlc3RlZCB3YXMgbW9yZSB0aGFuIG9uZSBlbGVtZW50LAogICAgICAgICAgICAgKiB0YWcgb24gdGhlIHJlc3Qgb2YgdGhlIGNvbXBvbmVudHMgCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBpZiAoY3AgIT0gTlVMTCkKICAgICAgICAgICAgICAgIHJjID0gX2FkZF9zdHJpbmdzX3RvX29pZCh0cCwgY3AsIG9iamlkLCBvYmppZGxlbiwgbWF4bGVuKTsKICAgICAgICB9CiAgICB9CgogICAgU05NUF9GUkVFKG5hbWUpOwogICAgcmV0dXJuIChyYyk7Cn0KCgovKioKICogQGludGVybmFsCiAqCiAqIFBvcHVsYXRlcyB0aGUgb2JqZWN0IGlkZW50aWZpZXIgZnJvbSBhIG5vZGUgaW4gdGhlIE1JQiBoaWVyYXJjaHkuCiAqIEJ1aWxkcyB1cCB0aGUgb2JqZWN0IElELCB3b3JraW5nIGJhY2t3YXJkcywKICogc3RhcnRpbmcgZnJvbSB0aGUgZW5kIG9mIHRoZSBvYmppZCBidWZmZXIuCiAqIFdoZW4gdGhlIHRvcCBvZiB0aGUgTUlCIHRyZWUgaXMgcmVhY2hlZCwgdGhlIGJ1ZmZlciBpcyBhZGp1c3RlZC4KICoKICogVGhlIGJ1ZmZlciBsZW5ndGggaXMgc2V0IHRvIHRoZSBudW1iZXIgb2Ygc3ViaWRlbnRpZmllcnMKICogZm9yIHRoZSBvYmplY3QgaWRlbnRpZmllciBhc3NvY2lhdGVkIHdpdGggdGhlIE1JQiBub2RlLgogKiAKICogQHJldHVybiB0aGUgbnVtYmVyIG9mIHN1YmlkZW50aWZpZXJzIGNvcGllZC4KICoKICogSWYgMCBpcyByZXR1cm5lZCwgdGhlIG9iamlkIGJ1ZmZlciBpcyB0b28gc21hbGwsCiAqIGFuZCB0aGUgYnVmZmVyIGNvbnRlbnRzIGFyZSBpbmRldGVybWluYXRlLgogKiBUaGUgYnVmZmVyIGxlbmd0aCBjYW4gYmUgdXNlZCB0byBjcmVhdGUgYSBsYXJnZXIgYnVmZmVyLgogKi8Kc3RhdGljIGludApub2RlX3RvX29pZChzdHJ1Y3QgdHJlZSAqdHAsIG9pZCAqIG9iamlkLCBzaXplX3QgKiBvYmppZGxlbikKewogICAgaW50ICAgICAgICAgICAgIG51bWlkcywgbGVuaWRzOwogICAgb2lkICAgICAgICAgICAgKm9wOwoKICAgIGlmICghdHAgfHwgIW9iamlkIHx8ICFvYmppZGxlbikKICAgICAgICByZXR1cm4gMDsKCiAgICBsZW5pZHMgPSAoaW50KSAqb2JqaWRsZW47CiAgICBvcCA9IG9iamlkICsgbGVuaWRzOyAgICAgICAgLyogcG9pbnRzIGFmdGVyIHRoZSBsYXN0IGVsZW1lbnQgKi8KCiAgICBmb3IgKG51bWlkcyA9IDA7IHRwOyB0cCA9IHRwLT5wYXJlbnQsIG51bWlkcysrKSB7CiAgICAgICAgaWYgKG51bWlkcyA+PSBsZW5pZHMpCiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIC0tb3A7CiAgICAgICAgKm9wID0gdHAtPnN1YmlkOwogICAgfQoKICAgICpvYmppZGxlbiA9IChzaXplX3QpIG51bWlkczsKICAgIGlmIChudW1pZHMgPiBsZW5pZHMpIHsKICAgICAgICByZXR1cm4gMDsKICAgIH0KCiAgICBpZiAobnVtaWRzIDwgbGVuaWRzKQogICAgICAgIG1lbW1vdmUob2JqaWQsIG9wLCBudW1pZHMgKiBzaXplb2Yob2lkKSk7CgogICAgcmV0dXJuIChudW1pZHMpOwp9CiNlbmRpZiAvKiBORVRTTk1QX0RJU0FCTEVfTUlCX0xPQURJTkcgKi8KCi8qCiAqIFJlcGxhY2UgXHggd2l0aCB4IHN0b3AgYXQgZW9zX21hcmtlcgogKiByZXR1cm4gTlVMTCBpZiBlb3NfbWFya2VyIG5vdCBmb3VuZAogKi8Kc3RhdGljIGNoYXIgKl9hcHBseV9lc2NhcGVzKGNoYXIgKnNyYywgY2hhciBlb3NfbWFya2VyKQp7CiAgICBjaGFyICpkc3Q7CiAgICBpbnQgYmFja3NsYXNoID0gMDsKICAgIAogICAgZHN0ID0gc3JjOwogICAgd2hpbGUgKCpzcmMpIHsKCWlmIChiYWNrc2xhc2gpIHsKCSAgICBiYWNrc2xhc2ggPSAwOwoJICAgICpkc3QrKyA9ICpzcmM7Cgl9IGVsc2UgewoJICAgIGlmIChlb3NfbWFya2VyID09ICpzcmMpIGJyZWFrOwoJICAgIGlmICgnXFwnID09ICpzcmMpIHsKCQliYWNrc2xhc2ggPSAxOwoJICAgIH0gZWxzZSB7CgkJKmRzdCsrID0gKnNyYzsKCSAgICB9Cgl9CglzcmMrKzsKICAgIH0KICAgIGlmICghKnNyYykgewoJLyogbmV2ZXIgZm91bmQgZW9zX21hcmtlciAqLwoJcmV0dXJuIE5VTEw7CiAgICB9IGVsc2UgewoJKmRzdCA9IDA7CglyZXR1cm4gc3JjOwogICAgfQp9CgpzdGF0aWMgaW50CiNpZm5kZWYgTkVUU05NUF9ESVNBQkxFX01JQl9MT0FESU5HCl9hZGRfc3RyaW5nc190b19vaWQoc3RydWN0IHRyZWUgKnRwLCBjaGFyICpjcCwKICAgICAgICAgICAgICAgICAgICBvaWQgKiBvYmppZCwgc2l6ZV90ICogb2JqaWRsZW4sIHNpemVfdCBtYXhsZW4pCiNlbHNlCl9hZGRfc3RyaW5nc190b19vaWQodm9pZCAqdHAsIGNoYXIgKmNwLAogICAgICAgICAgICAgICAgICAgIG9pZCAqIG9iamlkLCBzaXplX3QgKiBvYmppZGxlbiwgc2l6ZV90IG1heGxlbikKI2VuZGlmIC8qIE5FVFNOTVBfRElTQUJMRV9NSUJfTE9BRElORyAqLwp7CiAgICBvaWQgICAgICAgICAgICAgc3ViaWQ7CiAgICBpbnQgICAgICAgICAgICAgbGVuX2luZGV4ID0gMTAwMDAwMDsKI2lmbmRlZiBORVRTTk1QX0RJU0FCTEVfTUlCX0xPQURJTkcKICAgIHN0cnVjdCB0cmVlICAgICp0cDIgPSBOVUxMOwogICAgc3RydWN0IGluZGV4X2xpc3QgKmluX2RpY2VzID0gTlVMTDsKI2VuZGlmIC8qIE5FVFNOTVBfRElTQUJMRV9NSUJfTE9BRElORyAqLwogICAgY2hhciAgICAgICAgICAgKmZjcCwgKmVjcCwgKmNwMiA9IE5VTEw7CiAgICBjaGFyICAgICAgICAgICAgZG9pbmdxdW90ZTsKICAgIGludCAgICAgICAgICAgICBsZW4gPSAtMSwgcG9zID0gLTE7CiNpZm5kZWYgTkVUU05NUF9ESVNBQkxFX01JQl9MT0FESU5HCiAgICBpbnQgICAgICAgICAgICAgY2hlY2sgPQogICAgICAgICFuZXRzbm1wX2RzX2dldF9ib29sZWFuKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfRE9OVF9DSEVDS19SQU5HRSk7CiAgICBpbnQgICAgICAgICAgICAgZG9faGludCA9ICFuZXRzbm1wX2RzX2dldF9ib29sZWFuKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfTk9fRElTUExBWV9ISU5UKTsKCiAgICB3aGlsZSAoY3AgJiYgdHAgJiYgdHAtPmNoaWxkX2xpc3QpIHsKICAgICAgICBmY3AgPSBjcDsKICAgICAgICB0cDIgPSB0cC0+Y2hpbGRfbGlzdDsKICAgICAgICAvKgogICAgICAgICAqIElzb2xhdGUgdGhlIG5leHQgZW50cnkgCiAgICAgICAgICovCiAgICAgICAgY3AyID0gc3RyY2hyKGNwLCAnLicpOwogICAgICAgIGlmIChjcDIpCiAgICAgICAgICAgICpjcDIrKyA9ICdcMCc7CgogICAgICAgIC8qCiAgICAgICAgICogU2VhcmNoIGZvciB0aGUgYXBwcm9wcmlhdGUgY2hpbGQgCiAgICAgICAgICovCiAgICAgICAgaWYgKGlzZGlnaXQoKmNwKSkgewogICAgICAgICAgICBzdWJpZCA9IHN0cnRvdWwoY3AsICZlY3AsIDApOwogICAgICAgICAgICBpZiAoKmVjcCkKICAgICAgICAgICAgICAgIGdvdG8gYmFkX2lkOwogICAgICAgICAgICB3aGlsZSAodHAyICYmIHRwMi0+c3ViaWQgIT0gc3ViaWQpCiAgICAgICAgICAgICAgICB0cDIgPSB0cDItPm5leHRfcGVlcjsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB3aGlsZSAodHAyICYmIHN0cmNtcCh0cDItPmxhYmVsLCBmY3ApKQogICAgICAgICAgICAgICAgdHAyID0gdHAyLT5uZXh0X3BlZXI7CiAgICAgICAgICAgIGlmICghdHAyKQogICAgICAgICAgICAgICAgZ290byBiYWRfaWQ7CiAgICAgICAgICAgIHN1YmlkID0gdHAyLT5zdWJpZDsKICAgICAgICB9CiAgICAgICAgaWYgKCpvYmppZGxlbiA+PSBtYXhsZW4pCiAgICAgICAgICAgIGdvdG8gYmFkX2lkOwoJd2hpbGUgKHRwMiAmJiB0cDItPm5leHRfcGVlciAmJiB0cDItPm5leHRfcGVlci0+c3ViaWQgPT0gc3ViaWQpCgkgICAgdHAyID0gdHAyLT5uZXh0X3BlZXI7CiAgICAgICAgb2JqaWRbKm9iamlkbGVuXSA9IHN1YmlkOwogICAgICAgICgqb2JqaWRsZW4pKys7CgogICAgICAgIGNwID0gY3AyOwogICAgICAgIGlmICghdHAyKQogICAgICAgICAgICBicmVhazsKICAgICAgICB0cCA9IHRwMjsKICAgIH0KCiAgICBpZiAodHAgJiYgIXRwLT5jaGlsZF9saXN0KSB7CiAgICAgICAgaWYgKCh0cDIgPSB0cC0+cGFyZW50KSkgewogICAgICAgICAgICBpZiAodHAyLT5pbmRleGVzKQogICAgICAgICAgICAgICAgaW5fZGljZXMgPSB0cDItPmluZGV4ZXM7CiAgICAgICAgICAgIGVsc2UgaWYgKHRwMi0+YXVnbWVudHMpIHsKICAgICAgICAgICAgICAgIHRwMiA9IGZpbmRfdHJlZV9ub2RlKHRwMi0+YXVnbWVudHMsIC0xKTsKICAgICAgICAgICAgICAgIGlmICh0cDIpCiAgICAgICAgICAgICAgICAgICAgaW5fZGljZXMgPSB0cDItPmluZGV4ZXM7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgdHAgPSBOVUxMOwogICAgfQoKICAgIHdoaWxlIChjcCAmJiBpbl9kaWNlcykgewogICAgICAgIGZjcCA9IGNwOwoKICAgICAgICB0cCA9IGZpbmRfdHJlZV9ub2RlKGluX2RpY2VzLT5pbGFiZWwsIC0xKTsKICAgICAgICBpZiAoIXRwKQogICAgICAgICAgICBicmVhazsKICAgICAgICBzd2l0Y2ggKHRwLT50eXBlKSB7CiAgICAgICAgY2FzZSBUWVBFX0lOVEVHRVI6CiAgICAgICAgY2FzZSBUWVBFX0lOVEVHRVIzMjoKICAgICAgICBjYXNlIFRZUEVfVUlOVEVHRVI6CiAgICAgICAgY2FzZSBUWVBFX1VOU0lHTkVEMzI6CiAgICAgICAgY2FzZSBUWVBFX1RJTUVUSUNLUzoKICAgICAgICAgICAgLyoKICAgICAgICAgICAgICogSXNvbGF0ZSB0aGUgbmV4dCBlbnRyeSAKICAgICAgICAgICAgICovCiAgICAgICAgICAgIGNwMiA9IHN0cmNocihjcCwgJy4nKTsKICAgICAgICAgICAgaWYgKGNwMikKICAgICAgICAgICAgICAgICpjcDIrKyA9ICdcMCc7CiAgICAgICAgICAgIGlmIChpc2RpZ2l0KCpjcCkpIHsKICAgICAgICAgICAgICAgIHN1YmlkID0gc3RydG91bChjcCwgJmVjcCwgMCk7CiAgICAgICAgICAgICAgICBpZiAoKmVjcCkKICAgICAgICAgICAgICAgICAgICBnb3RvIGJhZF9pZDsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGlmICh0cC0+ZW51bXMpIHsKICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZW51bV9saXN0ICplcCA9IHRwLT5lbnVtczsKICAgICAgICAgICAgICAgICAgICB3aGlsZSAoZXAgJiYgc3RyY21wKGVwLT5sYWJlbCwgY3ApKQogICAgICAgICAgICAgICAgICAgICAgICBlcCA9IGVwLT5uZXh0OwogICAgICAgICAgICAgICAgICAgIGlmICghZXApCiAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gYmFkX2lkOwogICAgICAgICAgICAgICAgICAgIHN1YmlkID0gZXAtPnZhbHVlOwogICAgICAgICAgICAgICAgfSBlbHNlCiAgICAgICAgICAgICAgICAgICAgZ290byBiYWRfaWQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGNoZWNrICYmIHRwLT5yYW5nZXMpIHsKICAgICAgICAgICAgICAgIHN0cnVjdCByYW5nZV9saXN0ICpycCA9IHRwLT5yYW5nZXM7CiAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgb2sgPSAwOwogICAgICAgICAgICAgICAgaWYgKHRwLT50eXBlID09IFRZUEVfSU5URUdFUiB8fAogICAgICAgICAgICAgICAgICAgIHRwLT50eXBlID09IFRZUEVfSU5URUdFUjMyKSB7CiAgICAgICAgICAgICAgICAgIHdoaWxlICghb2sgJiYgcnApIHsKICAgICAgICAgICAgICAgICAgICBpZiAoKHJwLT5sb3cgPD0gKGludCkgc3ViaWQpCiAgICAgICAgICAgICAgICAgICAgICAgICYmICgoaW50KSBzdWJpZCA8PSBycC0+aGlnaCkpCiAgICAgICAgICAgICAgICAgICAgICAgIG9rID0gMTsKICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgIHJwID0gcnAtPm5leHQ7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0gZWxzZSB7IC8qIGNoZWNrIHVuc2lnbmVkIHJhbmdlICovCiAgICAgICAgICAgICAgICAgIHdoaWxlICghb2sgJiYgcnApIHsKICAgICAgICAgICAgICAgICAgICBpZiAoKCh1bnNpZ25lZCBpbnQpcnAtPmxvdyA8PSBzdWJpZCkKICAgICAgICAgICAgICAgICAgICAgICAgJiYgKHN1YmlkIDw9ICh1bnNpZ25lZCBpbnQpcnAtPmhpZ2gpKQogICAgICAgICAgICAgICAgICAgICAgICBvayA9IDE7CiAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICBycCA9IHJwLT5uZXh0OwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoIW9rKQogICAgICAgICAgICAgICAgICAgIGdvdG8gYmFkX2lkOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICgqb2JqaWRsZW4gPj0gbWF4bGVuKQogICAgICAgICAgICAgICAgZ290byBiYWRfaWQ7CiAgICAgICAgICAgIG9iamlkWypvYmppZGxlbl0gPSBzdWJpZDsKICAgICAgICAgICAgKCpvYmppZGxlbikrKzsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBUWVBFX0lQQUREUjoKICAgICAgICAgICAgaWYgKCpvYmppZGxlbiArIDQgPiBtYXhsZW4pCiAgICAgICAgICAgICAgICBnb3RvIGJhZF9pZDsKICAgICAgICAgICAgZm9yIChzdWJpZCA9IDA7IGNwICYmIHN1YmlkIDwgNDsgc3ViaWQrKykgewogICAgICAgICAgICAgICAgZmNwID0gY3A7CiAgICAgICAgICAgICAgICBjcDIgPSBzdHJjaHIoY3AsICcuJyk7CiAgICAgICAgICAgICAgICBpZiAoY3AyKQogICAgICAgICAgICAgICAgICAgICpjcDIrKyA9IDA7CiAgICAgICAgICAgICAgICBvYmppZFsqb2JqaWRsZW5dID0gc3RydG91bChjcCwgJmVjcCwgMCk7CiAgICAgICAgICAgICAgICBpZiAoKmVjcCkKICAgICAgICAgICAgICAgICAgICBnb3RvIGJhZF9pZDsKICAgICAgICAgICAgICAgIGlmIChjaGVjayAmJiBvYmppZFsqb2JqaWRsZW5dID4gMjU1KQogICAgICAgICAgICAgICAgICAgIGdvdG8gYmFkX2lkOwogICAgICAgICAgICAgICAgKCpvYmppZGxlbikrKzsKICAgICAgICAgICAgICAgIGNwID0gY3AyOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgVFlQRV9PQ1RFVFNUUjoKICAgICAgICAgICAgaWYgKHRwLT5yYW5nZXMgJiYgIXRwLT5yYW5nZXMtPm5leHQKICAgICAgICAgICAgICAgICYmIHRwLT5yYW5nZXMtPmxvdyA9PSB0cC0+cmFuZ2VzLT5oaWdoKQogICAgICAgICAgICAgICAgbGVuID0gdHAtPnJhbmdlcy0+bG93OwogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICBsZW4gPSAtMTsKICAgICAgICAgICAgcG9zID0gMDsKICAgICAgICAgICAgaWYgKCpjcCA9PSAnIicgfHwgKmNwID09ICdcJycpIHsKICAgICAgICAgICAgICAgIGRvaW5ncXVvdGUgPSAqY3ArKzsKICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgKiBpbnNlcnQgbGVuZ3RoIGlmIHJlcXVlc3RlZCAKICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgaWYgKCFpbl9kaWNlcy0+aXNpbXBsaWVkICYmIGxlbiA9PSAtMSkgewogICAgICAgICAgICAgICAgICAgIGlmIChkb2luZ3F1b3RlID09ICdcJycpIHsKICAgICAgICAgICAgICAgICAgICAgICAgc25tcF9zZXRfZGV0YWlsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoIictcXVvdGUgaXMgZm9yIGZpeGVkIGxlbmd0aCBzdHJpbmdzIik7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoKm9iamlkbGVuID49IG1heGxlbikKICAgICAgICAgICAgICAgICAgICAgICAgZ290byBiYWRfaWQ7CiAgICAgICAgICAgICAgICAgICAgbGVuX2luZGV4ID0gKm9iamlkbGVuOwogICAgICAgICAgICAgICAgICAgICgqb2JqaWRsZW4pKys7CiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGRvaW5ncXVvdGUgPT0gJyInKSB7CiAgICAgICAgICAgICAgICAgICAgc25tcF9zZXRfZGV0YWlsCiAgICAgICAgICAgICAgICAgICAgICAgICgiXCItcXVvdGUgaXMgZm9yIHZhcmlhYmxlIGxlbmd0aCBzdHJpbmdzIik7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgICAgICB9CgoJCWNwMiA9IF9hcHBseV9lc2NhcGVzKGNwLCBkb2luZ3F1b3RlKTsKCQlpZiAoIWNwMikgZ290byBiYWRfaWQ7CgkJZWxzZSB7CgkJICAgIHVuc2lnbmVkIGNoYXIgKm5ld192YWw7CgkJICAgIGludCBuZXdfdmFsX2xlbjsKCQkgICAgaW50IHBhcnNlZF9oaW50ID0gMDsKCQkgICAgY29uc3QgY2hhciAqcGFyc2VkX3ZhbHVlOwoKCQkgICAgaWYgKGRvX2hpbnQgJiYgdHAtPmhpbnQpIHsKCQkJcGFyc2VkX3ZhbHVlID0gcGFyc2Vfb2N0ZXRfaGludCh0cC0+aGludCwgY3AsCgkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm5ld192YWwsICZuZXdfdmFsX2xlbik7CgkJCXBhcnNlZF9oaW50ID0gcGFyc2VkX3ZhbHVlID09IE5VTEw7CgkJICAgIH0KCQkgICAgaWYgKHBhcnNlZF9oaW50KSB7CgkJCWludCBpOwoJCQlmb3IgKGkgPSAwOyBpIDwgbmV3X3ZhbF9sZW47IGkrKykgewoJCQkgICAgaWYgKCpvYmppZGxlbiA+PSBtYXhsZW4pIGdvdG8gYmFkX2lkOwoJCQkgICAgb2JqaWRbICpvYmppZGxlbiBdID0gbmV3X3ZhbFtpXTsKCQkJICAgICgqb2JqaWRsZW4pKys7CgkJCSAgICBwb3MrKzsKCQkJfQoJCQlTTk1QX0ZSRUUobmV3X3ZhbCk7CgkJICAgIH0gZWxzZSB7CgkJCXdoaWxlKCpjcCkgewoJCQkgICAgaWYgKCpvYmppZGxlbiA+PSBtYXhsZW4pIGdvdG8gYmFkX2lkOwoJCQkgICAgb2JqaWRbICpvYmppZGxlbiBdID0gKmNwKys7CgkJCSAgICAoKm9iamlkbGVuKSsrOwoJCQkgICAgcG9zKys7CgkJCX0KCQkgICAgfQoJCX0KCQkKCQljcDIrKzsKICAgICAgICAgICAgICAgIGlmICghKmNwMikKICAgICAgICAgICAgICAgICAgICBjcDIgPSBOVUxMOwogICAgICAgICAgICAgICAgZWxzZSBpZiAoKmNwMiAhPSAnLicpCiAgICAgICAgICAgICAgICAgICAgZ290byBiYWRfaWQ7CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgY3AyKys7CgkJaWYgKGNoZWNrKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGxlbiA9PSAtMSkgewogICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgcmFuZ2VfbGlzdCAqcnAgPSB0cC0+cmFuZ2VzOwogICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgb2sgPSAwOwogICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAocnAgJiYgIW9rKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJwLT5sb3cgPD0gcG9zICYmIHBvcyA8PSBycC0+aGlnaCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvayA9IDE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnAgPSBycC0+bmV4dDsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFvaykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gYmFkX2lkOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWluX2RpY2VzLT5pc2ltcGxpZWQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmppZFtsZW5faW5kZXhdID0gcG9zOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocG9zICE9IGxlbikKICAgICAgICAgICAgICAgICAgICAgICAgZ290byBiYWRfaWQ7CgkJfQoJCWVsc2UgaWYgKGxlbiA9PSAtMSAmJiAhaW5fZGljZXMtPmlzaW1wbGllZCkKCQkgICAgb2JqaWRbbGVuX2luZGV4XSA9IHBvczsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGlmICghaW5fZGljZXMtPmlzaW1wbGllZCAmJiBsZW4gPT0gLTEpIHsKICAgICAgICAgICAgICAgICAgICBmY3AgPSBjcDsKICAgICAgICAgICAgICAgICAgICBjcDIgPSBzdHJjaHIoY3AsICcuJyk7CiAgICAgICAgICAgICAgICAgICAgaWYgKGNwMikKICAgICAgICAgICAgICAgICAgICAgICAgKmNwMisrID0gMDsKICAgICAgICAgICAgICAgICAgICBsZW4gPSBzdHJ0b3VsKGNwLCAmZWNwLCAwKTsKICAgICAgICAgICAgICAgICAgICBpZiAoKmVjcCkKICAgICAgICAgICAgICAgICAgICAgICAgZ290byBiYWRfaWQ7CiAgICAgICAgICAgICAgICAgICAgaWYgKCpvYmppZGxlbiArIGxlbiArIDEgPj0gbWF4bGVuKQogICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGJhZF9pZDsKICAgICAgICAgICAgICAgICAgICBvYmppZFsqb2JqaWRsZW5dID0gbGVuOwogICAgICAgICAgICAgICAgICAgICgqb2JqaWRsZW4pKys7CiAgICAgICAgICAgICAgICAgICAgY3AgPSBjcDI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB3aGlsZSAobGVuICYmIGNwKSB7CiAgICAgICAgICAgICAgICAgICAgZmNwID0gY3A7CiAgICAgICAgICAgICAgICAgICAgY3AyID0gc3RyY2hyKGNwLCAnLicpOwogICAgICAgICAgICAgICAgICAgIGlmIChjcDIpCiAgICAgICAgICAgICAgICAgICAgICAgICpjcDIrKyA9IDA7CiAgICAgICAgICAgICAgICAgICAgb2JqaWRbKm9iamlkbGVuXSA9IHN0cnRvdWwoY3AsICZlY3AsIDApOwogICAgICAgICAgICAgICAgICAgIGlmICgqZWNwKQogICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGJhZF9pZDsKICAgICAgICAgICAgICAgICAgICBpZiAoY2hlY2sgJiYgb2JqaWRbKm9iamlkbGVuXSA+IDI1NSkKICAgICAgICAgICAgICAgICAgICAgICAgZ290byBiYWRfaWQ7CiAgICAgICAgICAgICAgICAgICAgKCpvYmppZGxlbikrKzsKICAgICAgICAgICAgICAgICAgICBsZW4tLTsKICAgICAgICAgICAgICAgICAgICBjcCA9IGNwMjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIFRZUEVfT0JKSUQ6CiAgICAgICAgICAgIGluX2RpY2VzID0gTlVMTDsKICAgICAgICAgICAgY3AyID0gY3A7CiAgICAgICAgICAgIGJyZWFrOwoJY2FzZSBUWVBFX05FVEFERFI6CgkgICAgZmNwID0gY3A7CgkgICAgY3AyID0gc3RyY2hyKGNwLCAnLicpOwoJICAgIGlmIChjcDIpCgkJKmNwMisrID0gMDsKCSAgICBzdWJpZCA9IHN0cnRvdWwoY3AsICZlY3AsIDApOwoJICAgIGlmICgqZWNwKQoJCWdvdG8gYmFkX2lkOwoJICAgIGlmICgqb2JqaWRsZW4gKyAxID49IG1heGxlbikKCQlnb3RvIGJhZF9pZDsKCSAgICBvYmppZFsqb2JqaWRsZW5dID0gc3ViaWQ7CgkgICAgKCpvYmppZGxlbikrKzsKCSAgICBjcCA9IGNwMjsKCSAgICBpZiAoc3ViaWQgPT0gMSkgewoJCWZvciAobGVuID0gMDsgY3AgJiYgbGVuIDwgNDsgbGVuKyspIHsKCQkgICAgZmNwID0gY3A7CgkJICAgIGNwMiA9IHN0cmNocihjcCwgJy4nKTsKCQkgICAgaWYgKGNwMikKCQkJKmNwMisrID0gMDsKCQkgICAgc3ViaWQgPSBzdHJ0b3VsKGNwLCAmZWNwLCAwKTsKCQkgICAgaWYgKCplY3ApCgkJCWdvdG8gYmFkX2lkOwoJCSAgICBpZiAoKm9iamlkbGVuICsgMSA+PSBtYXhsZW4pCgkJCWdvdG8gYmFkX2lkOwoJCSAgICBpZiAoY2hlY2sgJiYgc3ViaWQgPiAyNTUpCgkJCWdvdG8gYmFkX2lkOwoJCSAgICBvYmppZFsqb2JqaWRsZW5dID0gc3ViaWQ7CgkJICAgICgqb2JqaWRsZW4pKys7CgkJICAgIGNwID0gY3AyOwoJCX0KCSAgICB9CgkgICAgZWxzZSB7CgkJaW5fZGljZXMgPSBOVUxMOwoJICAgIH0KCSAgICBicmVhazsKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICBzbm1wX2xvZyhMT0dfRVJSLCAiVW5leHBlY3RlZCBpbmRleCB0eXBlOiAlZCAlcyAlc1xuIiwKICAgICAgICAgICAgICAgICAgICAgdHAtPnR5cGUsIGluX2RpY2VzLT5pbGFiZWwsIGNwKTsKICAgICAgICAgICAgaW5fZGljZXMgPSBOVUxMOwogICAgICAgICAgICBjcDIgPSBjcDsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIGNwID0gY3AyOwogICAgICAgIGlmIChpbl9kaWNlcykKICAgICAgICAgICAgaW5fZGljZXMgPSBpbl9kaWNlcy0+bmV4dDsKICAgIH0KCiNlbmRpZiAvKiBORVRTTk1QX0RJU0FCTEVfTUlCX0xPQURJTkcgKi8KICAgIHdoaWxlIChjcCkgewogICAgICAgIGZjcCA9IGNwOwogICAgICAgIHN3aXRjaCAoKmNwKSB7CiAgICAgICAgY2FzZSAnMCc6CiAgICAgICAgY2FzZSAnMSc6CiAgICAgICAgY2FzZSAnMic6CiAgICAgICAgY2FzZSAnMyc6CiAgICAgICAgY2FzZSAnNCc6CiAgICAgICAgY2FzZSAnNSc6CiAgICAgICAgY2FzZSAnNic6CiAgICAgICAgY2FzZSAnNyc6CiAgICAgICAgY2FzZSAnOCc6CiAgICAgICAgY2FzZSAnOSc6CiAgICAgICAgICAgIGNwMiA9IHN0cmNocihjcCwgJy4nKTsKICAgICAgICAgICAgaWYgKGNwMikKICAgICAgICAgICAgICAgICpjcDIrKyA9IDA7CiAgICAgICAgICAgIHN1YmlkID0gc3RydG91bChjcCwgJmVjcCwgMCk7CiAgICAgICAgICAgIGlmICgqZWNwKQogICAgICAgICAgICAgICAgZ290byBiYWRfaWQ7CiAgICAgICAgICAgIGlmICgqb2JqaWRsZW4gPj0gbWF4bGVuKQogICAgICAgICAgICAgICAgZ290byBiYWRfaWQ7CiAgICAgICAgICAgIG9iamlkWypvYmppZGxlbl0gPSBzdWJpZDsKICAgICAgICAgICAgKCpvYmppZGxlbikrKzsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAnIic6CiAgICAgICAgY2FzZSAnXCcnOgogICAgICAgICAgICBkb2luZ3F1b3RlID0gKmNwKys7CiAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAqIGluc2VydCBsZW5ndGggaWYgcmVxdWVzdGVkIAogICAgICAgICAgICAgKi8KICAgICAgICAgICAgaWYgKGRvaW5ncXVvdGUgPT0gJyInKSB7CiAgICAgICAgICAgICAgICBpZiAoKm9iamlkbGVuID49IG1heGxlbikKICAgICAgICAgICAgICAgICAgICBnb3RvIGJhZF9pZDsKICAgICAgICAgICAgICAgIG9iamlkWypvYmppZGxlbl0gPSBsZW4gPSBzdHJjaHIoY3AsIGRvaW5ncXVvdGUpIC0gY3A7CiAgICAgICAgICAgICAgICAoKm9iamlkbGVuKSsrOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoIWNwKQogICAgICAgICAgICAgICAgZ290byBiYWRfaWQ7CiAgICAgICAgICAgIHdoaWxlICgqY3AgJiYgKmNwICE9IGRvaW5ncXVvdGUpIHsKICAgICAgICAgICAgICAgIGlmICgqb2JqaWRsZW4gPj0gbWF4bGVuKQogICAgICAgICAgICAgICAgICAgIGdvdG8gYmFkX2lkOwogICAgICAgICAgICAgICAgb2JqaWRbKm9iamlkbGVuXSA9ICpjcCsrOwogICAgICAgICAgICAgICAgKCpvYmppZGxlbikrKzsKICAgICAgICAgICAgfQogICAgICAgICAgICBjcDIgPSBjcCArIDE7CiAgICAgICAgICAgIGlmICghKmNwMikKICAgICAgICAgICAgICAgIGNwMiA9IE5VTEw7CiAgICAgICAgICAgIGVsc2UgaWYgKCpjcDIgPT0gJy4nKQogICAgICAgICAgICAgICAgY3AyKys7CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIGdvdG8gYmFkX2lkOwogICAgICAgICAgICBicmVhazsKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICBnb3RvIGJhZF9pZDsKICAgICAgICB9CiAgICAgICAgY3AgPSBjcDI7CiAgICB9CiAgICByZXR1cm4gMTsKCiAgYmFkX2lkOgogICAgewogICAgICAgIGNoYXIgICAgICAgICAgICBidWZbMjU2XTsKI2lmbmRlZiBORVRTTk1QX0RJU0FCTEVfTUlCX0xPQURJTkcKICAgICAgICBpZiAoaW5fZGljZXMpCiAgICAgICAgICAgIHNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICJJbmRleCBvdXQgb2YgcmFuZ2U6ICVzICglcykiLAogICAgICAgICAgICAgICAgICAgIGZjcCwgaW5fZGljZXMtPmlsYWJlbCk7CiAgICAgICAgZWxzZSBpZiAodHApCiAgICAgICAgICAgIHNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICJTdWItaWQgbm90IGZvdW5kOiAlcyAtPiAlcyIsIHRwLT5sYWJlbCwgZmNwKTsKICAgICAgICBlbHNlCiNlbmRpZiAvKiBORVRTTk1QX0RJU0FCTEVfTUlCX0xPQURJTkcgKi8KICAgICAgICAgICAgc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgIiVzIiwgZmNwKTsKICAgICAgICBidWZbIHNpemVvZihidWYpLTEgXSA9IDA7CgogICAgICAgIHNubXBfc2V0X2RldGFpbChidWYpOwogICAgfQogICAgcmV0dXJuIDA7Cn0KCgojaWZuZGVmIE5FVFNOTVBfRElTQUJMRV9NSUJfTE9BRElORwovKioKICogQHNlZSBjb21tZW50cyBvbiBmaW5kX2Jlc3RfdHJlZV9ub2RlIGZvciB1c2FnZSBhZnRlciBmaXJzdCB0aW1lLgogKi8KaW50CmdldF93aWxkX25vZGUoY29uc3QgY2hhciAqbmFtZSwgb2lkICogb2JqaWQsIHNpemVfdCAqIG9iamlkbGVuKQp7CiAgICBzdHJ1Y3QgdHJlZSAgICAqdHAgPSBmaW5kX2Jlc3RfdHJlZV9ub2RlKG5hbWUsIHRyZWVfaGVhZCwgTlVMTCk7CiAgICBpZiAoIXRwKQogICAgICAgIHJldHVybiAwOwogICAgcmV0dXJuIGdldF9ub2RlKHRwLT5sYWJlbCwgb2JqaWQsIG9iamlkbGVuKTsKfQoKaW50CmdldF9ub2RlKGNvbnN0IGNoYXIgKm5hbWUsIG9pZCAqIG9iamlkLCBzaXplX3QgKiBvYmppZGxlbikKewogICAgY29uc3QgY2hhciAgICAgKmNwOwogICAgY2hhciAgICAgICAgICAgIGNoOwogICAgaW50ICAgICAgICAgICAgIHJlczsKCiAgICBjcCA9IG5hbWU7CiAgICB3aGlsZSAoKGNoID0gKmNwKSkKICAgICAgICBpZiAoKCcwJyA8PSBjaCAmJiBjaCA8PSAnOScpCiAgICAgICAgICAgIHx8ICgnYScgPD0gY2ggJiYgY2ggPD0gJ3onKQogICAgICAgICAgICB8fCAoJ0EnIDw9IGNoICYmIGNoIDw9ICdaJykKICAgICAgICAgICAgfHwgY2ggPT0gJy0nKQogICAgICAgICAgICBjcCsrOwogICAgICAgIGVsc2UKICAgICAgICAgICAgYnJlYWs7CiAgICBpZiAoY2ggIT0gJzonKQogICAgICAgIGlmICgqbmFtZSA9PSAnLicpCiAgICAgICAgICAgIHJlcyA9IGdldF9tb2R1bGVfbm9kZShuYW1lICsgMSwgIkFOWSIsIG9iamlkLCBvYmppZGxlbik7CiAgICAgICAgZWxzZQogICAgICAgICAgICByZXMgPSBnZXRfbW9kdWxlX25vZGUobmFtZSwgIkFOWSIsIG9iamlkLCBvYmppZGxlbik7CiAgICBlbHNlIHsKICAgICAgICBjaGFyICAgICAgICAgICAqbW9kdWxlOwogICAgICAgIC8qCiAgICAgICAgICogIHJlcXVlc3RlZCBuYW1lIGlzIG9mIHRoZSBmb3JtCiAgICAgICAgICogICAgICAibW9kdWxlOnN1YmlkZW50aWZpZXIiCiAgICAgICAgICovCiAgICAgICAgbW9kdWxlID0gKGNoYXIgKikgbWFsbG9jKChzaXplX3QpIChjcCAtIG5hbWUgKyAxKSk7CiAgICAgICAgaWYgKCFtb2R1bGUpCiAgICAgICAgICAgIHJldHVybiBTTk1QRVJSX0dFTkVSUjsKICAgICAgICBzcHJpbnRmKG1vZHVsZSwgIiUuKnMiLCAoaW50KSAoY3AgLSBuYW1lKSwgbmFtZSk7CiAgICAgICAgY3ArKzsgICAgICAgICAgICAgICAgICAgLyogY3Agbm93IHBvaW50IHRvIHRoZSBzdWJpZGVudGlmaWVyICovCiAgICAgICAgaWYgKCpjcCA9PSAnOicpCiAgICAgICAgICAgIGNwKys7CgogICAgICAgIC8qCiAgICAgICAgICogJ2NwJyBhbmQgJ25hbWUnICpkbyogZ28gdGhhdCB3YXkgcm91bmQhIAogICAgICAgICAqLwogICAgICAgIHJlcyA9IGdldF9tb2R1bGVfbm9kZShjcCwgbW9kdWxlLCBvYmppZCwgb2JqaWRsZW4pOwogICAgICAgIFNOTVBfRlJFRShtb2R1bGUpOwogICAgfQogICAgaWYgKHJlcyA9PSAwKSB7CiAgICAgICAgU0VUX1NOTVBfRVJST1IoU05NUEVSUl9VTktOT1dOX09CSklEKTsKICAgIH0KCiAgICByZXR1cm4gcmVzOwp9CiNlbmRpZiAvKiBORVRTTk1QX0RJU0FCTEVfTUlCX0xPQURJTkcgKi8KCiNpZmRlZiB0ZXN0aW5nCgptYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCnsKICAgIG9pZCAgICAgICAgICAgICBvYmppZFtNQVhfT0lEX0xFTl07CiAgICBpbnQgICAgICAgICAgICAgb2JqaWRsZW4gPSBNQVhfT0lEX0xFTjsKICAgIGludCAgICAgICAgICAgICBjb3VudDsKICAgIG5ldHNubXBfdmFyaWFibGVfbGlzdCB2YXJpYWJsZTsKCiAgICBuZXRzbm1wX2luaXRfbWliKCk7CiAgICBpZiAoYXJnYyA8IDIpCiAgICAgICAgcHJpbnRfc3VidHJlZShzdGRvdXQsIHRyZWVfaGVhZCwgMCk7CiAgICB2YXJpYWJsZS50eXBlID0gQVNOX0lOVEVHRVI7CiAgICB2YXJpYWJsZS52YWwuaW50ZWdlciA9IDM7CiAgICB2YXJpYWJsZS52YWxfbGVuID0gNDsKICAgIGZvciAoYXJnYy0tOyBhcmdjOyBhcmdjLS0sIGFyZ3YrKykgewogICAgICAgIG9iamlkbGVuID0gTUFYX09JRF9MRU47CiAgICAgICAgcHJpbnRmKCJyZWFkX29iamlkKCVzKSA9ICVkXG4iLAogICAgICAgICAgICAgICBhcmd2WzFdLCByZWFkX29iamlkKGFyZ3ZbMV0sIG9iamlkLCAmb2JqaWRsZW4pKTsKICAgICAgICBmb3IgKGNvdW50ID0gMDsgY291bnQgPCBvYmppZGxlbjsgY291bnQrKykKICAgICAgICAgICAgcHJpbnRmKCIlZC4iLCBvYmppZFtjb3VudF0pOwogICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICBwcmludF92YXJpYWJsZShvYmppZCwgb2JqaWRsZW4sICZ2YXJpYWJsZSk7CiAgICB9Cn0KCiNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdGVzdGluZyAqLwoKI2lmbmRlZiBORVRTTk1QX0RJU0FCTEVfTUlCX0xPQURJTkcKLyoKICogaW5pdGlhbGl6ZTogbm8gcGVlcnMgaW5jbHVkZWQgaW4gdGhlIHJlcG9ydC4gCiAqLwp2b2lkCmNsZWFyX3RyZWVfZmxhZ3MocmVnaXN0ZXIgc3RydWN0IHRyZWUgKnRwKQp7CiAgICBmb3IgKDsgdHA7IHRwID0gdHAtPm5leHRfcGVlcikgewogICAgICAgIHRwLT5yZXBvcnRlZCA9IDA7CiAgICAgICAgaWYgKHRwLT5jaGlsZF9saXN0KQogICAgICAgICAgICBjbGVhcl90cmVlX2ZsYWdzKHRwLT5jaGlsZF9saXN0KTsKICAgICAvKlJFQ1VSU0UqL30KfQoKLyoKICogVXBkYXRlOiAxOTk4LTA3LTE3IDxqaHlAZ3N1LmVkdT4KICogQWRkZWQgcHJpbnRfb2lkX3JlcG9ydCogZnVuY3Rpb25zLgogKi8Kc3RhdGljIGludCAgICAgIHByaW50X3N1YnRyZWVfb2lkX3JlcG9ydF9sYWJlbGVkb2lkID0gMDsKc3RhdGljIGludCAgICAgIHByaW50X3N1YnRyZWVfb2lkX3JlcG9ydF9vaWQgPSAwOwpzdGF0aWMgaW50ICAgICAgcHJpbnRfc3VidHJlZV9vaWRfcmVwb3J0X3N5bWJvbGljID0gMDsKc3RhdGljIGludCAgICAgIHByaW50X3N1YnRyZWVfb2lkX3JlcG9ydF9taWJjaGlsZG9pZCA9IDA7CnN0YXRpYyBpbnQgICAgICBwcmludF9zdWJ0cmVlX29pZF9yZXBvcnRfc3VmZml4ID0gMDsKCi8qCiAqIFRoZXNlIG1ldGhvZHMgcmVjdXJzZS4gCiAqLwpzdGF0aWMgdm9pZCAgICAgcHJpbnRfcGFyZW50X2xhYmVsZWRvaWQoRklMRSAqLCBzdHJ1Y3QgdHJlZSAqKTsKc3RhdGljIHZvaWQgICAgIHByaW50X3BhcmVudF9vaWQoRklMRSAqLCBzdHJ1Y3QgdHJlZSAqKTsKc3RhdGljIHZvaWQgICAgIHByaW50X3BhcmVudF9taWJjaGlsZG9pZChGSUxFICosIHN0cnVjdCB0cmVlICopOwpzdGF0aWMgdm9pZCAgICAgcHJpbnRfcGFyZW50X2xhYmVsKEZJTEUgKiwgc3RydWN0IHRyZWUgKik7CnN0YXRpYyB2b2lkICAgICBwcmludF9zdWJ0cmVlX29pZF9yZXBvcnQoRklMRSAqLCBzdHJ1Y3QgdHJlZSAqLCBpbnQpOwoKCnZvaWQKcHJpbnRfb2lkX3JlcG9ydChGSUxFICogZnApCnsKICAgIHN0cnVjdCB0cmVlICAgICp0cDsKICAgIGNsZWFyX3RyZWVfZmxhZ3ModHJlZV9oZWFkKTsKICAgIGZvciAodHAgPSB0cmVlX2hlYWQ7IHRwOyB0cCA9IHRwLT5uZXh0X3BlZXIpCiAgICAgICAgcHJpbnRfc3VidHJlZV9vaWRfcmVwb3J0KGZwLCB0cCwgMCk7Cn0KCnZvaWQKcHJpbnRfb2lkX3JlcG9ydF9lbmFibGVfbGFiZWxlZG9pZCh2b2lkKQp7CiAgICBwcmludF9zdWJ0cmVlX29pZF9yZXBvcnRfbGFiZWxlZG9pZCA9IDE7Cn0KCnZvaWQKcHJpbnRfb2lkX3JlcG9ydF9lbmFibGVfb2lkKHZvaWQpCnsKICAgIHByaW50X3N1YnRyZWVfb2lkX3JlcG9ydF9vaWQgPSAxOwp9Cgp2b2lkCnByaW50X29pZF9yZXBvcnRfZW5hYmxlX3N1ZmZpeCh2b2lkKQp7CiAgICBwcmludF9zdWJ0cmVlX29pZF9yZXBvcnRfc3VmZml4ID0gMTsKfQoKdm9pZApwcmludF9vaWRfcmVwb3J0X2VuYWJsZV9zeW1ib2xpYyh2b2lkKQp7CiAgICBwcmludF9zdWJ0cmVlX29pZF9yZXBvcnRfc3ltYm9saWMgPSAxOwp9Cgp2b2lkCnByaW50X29pZF9yZXBvcnRfZW5hYmxlX21pYmNoaWxkb2lkKHZvaWQpCnsKICAgIHByaW50X3N1YnRyZWVfb2lkX3JlcG9ydF9taWJjaGlsZG9pZCA9IDE7Cn0KCi8qCiAqIGhlbHBlciBtZXRob2RzIGZvciBwcmludF9zdWJ0cmVlX29pZF9yZXBvcnQoKQogKiBlYWNoIG9uZSB0cmF2ZXJzZXMgYmFjayB1cCB0aGUgbm9kZSB0cmVlCiAqIHVudGlsIHRoZXJlIGlzIG5vIHBhcmVudC4gIFRoZW4sIHRoZSBsYWJlbCBjb21iaW5hdGlvbgogKiBpcyBvdXRwdXQsIHN1Y2ggdGhhdCB0aGUgcGFyZW50IGlzIGRpc3BsYXllZCBmaXJzdC4KICoKICogV2FybmluZzogdGhlc2UgbWV0aG9kcyBhcmUgYWxsIHJlY3Vyc2l2ZS4KICovCgpzdGF0aWMgdm9pZApwcmludF9wYXJlbnRfbGFiZWxlZG9pZChGSUxFICogZiwgc3RydWN0IHRyZWUgKnRwKQp7CiAgICBpZiAodHApIHsKICAgICAgICBpZiAodHAtPnBhcmVudCkgewogICAgICAgICAgICBwcmludF9wYXJlbnRfbGFiZWxlZG9pZChmLCB0cC0+cGFyZW50KTsKICAgICAgICAgLypSRUNVUlNFKi99CiAgICAgICAgZnByaW50ZihmLCAiLiVzKCVsdSkiLCB0cC0+bGFiZWwsIHRwLT5zdWJpZCk7CiAgICB9Cn0KCnN0YXRpYyB2b2lkCnByaW50X3BhcmVudF9vaWQoRklMRSAqIGYsIHN0cnVjdCB0cmVlICp0cCkKewogICAgaWYgKHRwKSB7CiAgICAgICAgaWYgKHRwLT5wYXJlbnQpIHsKICAgICAgICAgICAgcHJpbnRfcGFyZW50X29pZChmLCB0cC0+cGFyZW50KTsKICAgICAgICAgLypSRUNVUlNFKi99CiAgICAgICAgZnByaW50ZihmLCAiLiVsdSIsIHRwLT5zdWJpZCk7CiAgICB9Cn0KCgpzdGF0aWMgdm9pZCBwcmludF9wYXJlbnRfbWliY2hpbGRvaWQoRklMRSAqIGYsIHN0cnVjdCB0cmVlICp0cCkKewogICAgc3RhdGljIHN0cnVjdCB0cmVlICp0ZW1wOwogICAgdW5zaWduZWQgbG9uZyBlbGVtc1sxMDBdOwogICAgaW50IGVsZW1fY250ID0gMDsKICAgIGludCBpID0gMDsKICAgIHRlbXAgPSB0cDsKICAgIGlmICh0ZW1wKSB7CiAgICAgICAgd2hpbGUgKHRlbXAtPnBhcmVudCkgewogICAgICAgICAgICAgICAgZWxlbXNbZWxlbV9jbnQrK10gPSB0ZW1wLT5zdWJpZDsKICAgICAgICAgICAgICAgIHRlbXAgPSB0ZW1wLT5wYXJlbnQ7CiAgICAgICAgfQogICAgICAgIGVsZW1zW2VsZW1fY250KytdID0gdGVtcC0+c3ViaWQ7CiAgICB9CiAgICBmb3IgKGkgPSBlbGVtX2NudCAtIDE7IGkgPj0gMDsgaS0tKSB7CiAgICAgICAgaWYgKGkgPT0gZWxlbV9jbnQgLSAxKSB7CiAgICAgICAgICAgIGZwcmludGYoZiwgIiVsdSIsIGVsZW1zW2ldKTsgICAgICAgICAgIAogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBmcHJpbnRmKGYsICIuJWx1IiwgZWxlbXNbaV0pOyAgICAgICAgICAKICAgICAgICB9CiAgICB9Cn0KCnN0YXRpYyB2b2lkCnByaW50X3BhcmVudF9sYWJlbChGSUxFICogZiwgc3RydWN0IHRyZWUgKnRwKQp7CiAgICBpZiAodHApIHsKICAgICAgICBpZiAodHAtPnBhcmVudCkgewogICAgICAgICAgICBwcmludF9wYXJlbnRfbGFiZWwoZiwgdHAtPnBhcmVudCk7CiAgICAgICAgIC8qUkVDVVJTRSovfQogICAgICAgIGZwcmludGYoZiwgIi4lcyIsIHRwLT5sYWJlbCk7CiAgICB9Cn0KCi8qKgogKiBAaW50ZXJuYWwKICogVGhpcyBtZXRob2RzIGdlbmVyYXRlcyB2YXJpYXRpb25zIG9uIHRoZSBvcmlnaW5hbCBwcmludF9zdWJ0cmVlKCkgcmVwb3J0LgogKiBUcmF2ZXJzZSB0aGUgdHJlZSBkZXB0aCBmaXJzdCwgZnJvbSBsZWFzdCB0byBncmVhdGVzdCBzdWItaWRlbnRpZmllci4KICogV2FybmluZzogdGhpcyBtZXRob2RzIHJlY3Vyc2VzIGFuZCBjYWxscyBtZXRob2RzIHRoYXQgcmVjdXJzZS4KICoKICogQHBhcmFtIGYgICAgICAgRmlsZSBkZXNjcmlwdG9yIHRvIHByaW50IHRvLgogKiBAcGFyYW0gdHJlZSAgICA/Pz8KICogQHBhcmFtIGNvdW50ICAgPz8/CiAqLwoKc3RhdGljIHZvaWQKcHJpbnRfc3VidHJlZV9vaWRfcmVwb3J0KEZJTEUgKiBmLCBzdHJ1Y3QgdHJlZSAqdHJlZSwgaW50IGNvdW50KQp7CiAgICBzdHJ1Y3QgdHJlZSAgICAqdHA7CgogICAgY291bnQrKzsKCiAgICAvKgogICAgICogc2FuaXR5IGNoZWNrIAogICAgICovCiAgICBpZiAoIXRyZWUpIHsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgLyoKICAgICAqIGZpbmQgdGhlIG5vdCByZXBvcnRlZCBwZWVyIHdpdGggdGhlIGxvd2VzdCBzdWItaWRlbnRpZmllci4KICAgICAqIGlmIG5vIG1vcmUsIGJyZWFrIHRoZSBsb29wIGFuZCBjbGVhbnVwLgogICAgICogc2V0ICJyZXBvcnRlZCIgZmxhZywgYW5kIGNyZWF0ZSByZXBvcnQgZm9yIHRoaXMgcGVlci4KICAgICAqIHJlY3Vyc2UgdXNpbmcgdGhlIGNoaWxkcmVuIG9mIHRoaXMgcGVlciwgaWYgYW55LgogICAgICovCiAgICB3aGlsZSAoMSkgewogICAgICAgIHJlZ2lzdGVyIHN0cnVjdCB0cmVlICpudHA7CgogICAgICAgIHRwID0gMDsKICAgICAgICBmb3IgKG50cCA9IHRyZWUtPmNoaWxkX2xpc3Q7IG50cDsgbnRwID0gbnRwLT5uZXh0X3BlZXIpIHsKICAgICAgICAgICAgaWYgKG50cC0+cmVwb3J0ZWQpCiAgICAgICAgICAgICAgICBjb250aW51ZTsKCiAgICAgICAgICAgIGlmICghdHAgfHwgKHRwLT5zdWJpZCA+IG50cC0+c3ViaWQpKQogICAgICAgICAgICAgICAgdHAgPSBudHA7CiAgICAgICAgfQogICAgICAgIGlmICghdHApCiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICB0cC0+cmVwb3J0ZWQgPSAxOwoKICAgICAgICBpZiAocHJpbnRfc3VidHJlZV9vaWRfcmVwb3J0X2xhYmVsZWRvaWQpIHsKICAgICAgICAgICAgcHJpbnRfcGFyZW50X2xhYmVsZWRvaWQoZiwgdHApOwogICAgICAgICAgICBmcHJpbnRmKGYsICJcbiIpOwogICAgICAgIH0KICAgICAgICBpZiAocHJpbnRfc3VidHJlZV9vaWRfcmVwb3J0X29pZCkgewogICAgICAgICAgICBwcmludF9wYXJlbnRfb2lkKGYsIHRwKTsKICAgICAgICAgICAgZnByaW50ZihmLCAiXG4iKTsKICAgICAgICB9CiAgICAgICAgaWYgKHByaW50X3N1YnRyZWVfb2lkX3JlcG9ydF9zeW1ib2xpYykgewogICAgICAgICAgICBwcmludF9wYXJlbnRfbGFiZWwoZiwgdHApOwogICAgICAgICAgICBmcHJpbnRmKGYsICJcbiIpOwogICAgICAgIH0KICAgICAgICBpZiAocHJpbnRfc3VidHJlZV9vaWRfcmVwb3J0X21pYmNoaWxkb2lkKSB7CgkgICAgZnByaW50ZihmLCAiXCIlc1wiXHQiLCB0cC0+bGFiZWwpOwogICAgICAgICAgICBmcHJpbnRmKGYsICJcdFx0XCIiKTsKICAgICAgICAgICAgcHJpbnRfcGFyZW50X21pYmNoaWxkb2lkKGYsIHRwKTsKICAgICAgICAgICAgZnByaW50ZihmLCAiXCJcbiIpOwogICAgICAgIH0KICAgICAgICBpZiAocHJpbnRfc3VidHJlZV9vaWRfcmVwb3J0X3N1ZmZpeCkgewogICAgICAgICAgICBpbnQgICAgICAgICAgICAgaTsKICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspCiAgICAgICAgICAgICAgICBmcHJpbnRmKGYsICIgICIpOwogICAgICAgICAgICBmcHJpbnRmKGYsICIlcyglbGQpIHR5cGU9JWQiLCB0cC0+bGFiZWwsIHRwLT5zdWJpZCwgdHAtPnR5cGUpOwogICAgICAgICAgICBpZiAodHAtPnRjX2luZGV4ICE9IC0xKQogICAgICAgICAgICAgICAgZnByaW50ZihmLCAiIHRjPSVkIiwgdHAtPnRjX2luZGV4KTsKICAgICAgICAgICAgaWYgKHRwLT5oaW50KQogICAgICAgICAgICAgICAgZnByaW50ZihmLCAiIGhpbnQ9JXMiLCB0cC0+aGludCk7CiAgICAgICAgICAgIGlmICh0cC0+dW5pdHMpCiAgICAgICAgICAgICAgICBmcHJpbnRmKGYsICIgdW5pdHM9JXMiLCB0cC0+dW5pdHMpOwoKICAgICAgICAgICAgZnByaW50ZihmLCAiXG4iKTsKICAgICAgICB9CiAgICAgICAgcHJpbnRfc3VidHJlZV9vaWRfcmVwb3J0KGYsIHRwLCBjb3VudCk7CiAgICAgLypSRUNVUlNFKi99Cn0KI2VuZGlmIC8qIE5FVFNOTVBfRElTQUJMRV9NSUJfTE9BRElORyAqLwoKCi8qKgogKiBDb252ZXJ0cyB0aW1ldGlja3MgdG8gaG91cnMsIG1pbnV0ZXMsIHNlY29uZHMgc3RyaW5nLgogKiBDTVUgY29tcGF0aWJsZSBkb2VzIG5vdCBzaG93IGNlbnRpc2Vjb25kcy4KICoKICogQHBhcmFtIHRpbWV0aWNrcyAgICBUaGUgdGltZXRpY2tzIHRvIGNvbnZlcnQuCiAqIEBwYXJhbSBidWYgICAgICAgICAgQnVmZmVyIHRvIHdyaXRlIHRvLCBoYXMgdG8gYmUgYXQgCiAqICAgICAgICAgICAgICAgICAgICAgbGVhc3QgNDAgQnl0ZXMgbGFyZ2UuCiAqICAgICAgIAogKiBAcmV0dXJuIFRoZSBidWZmZXIKICoKICogQHNlZSB1cHRpbWVTdHJpbmcKICovCmNoYXIgICAgICAgICAgICoKdXB0aW1lX3N0cmluZyh1X2xvbmcgdGltZXRpY2tzLCBjaGFyICpidWYpCnsKICAgIHJldHVybiB1cHRpbWVfc3RyaW5nX24oIHRpbWV0aWNrcywgYnVmLCA0MCk7Cn0KCmNoYXIgICAgICAgICAgICoKdXB0aW1lX3N0cmluZ19uKHVfbG9uZyB0aW1ldGlja3MsIGNoYXIgKmJ1Ziwgc2l6ZV90IGJ1ZmxlbikKewogICAgdXB0aW1lU3RyaW5nKHRpbWV0aWNrcywgYnVmLCBidWZsZW4pOwojaWZkZWYgQ01VX0NPTVBBVElCTEUKICAgIHsKICAgIGNoYXIgKmNwID0gc3RycmNocihidWYsICcuJyk7CiAgICBpZiAoY3ApCiAgICAgICAgKmNwID0gJ1wwJzsKICAgIH0KI2VuZGlmCiAgICByZXR1cm4gYnVmOwp9CgovKioKICogR2l2ZW4gYSBzdHJpbmcsIHBhcnNlcyBhbiBvaWQgb3V0IG9mIGl0IChpZiBwb3NzaWJsZSkuCiAqIEl0IHdpbGwgdHJ5IHRvIHBhcnNlIGl0IGJhc2VkIG9uIHByZWRldGVybWluZWQgY29uZmlndXJhdGlvbiBpZgogKiBwcmVzZW50IG9yIGJ5IGV2ZXJ5IG1ldGhvZCBwb3NzaWJsZSBvdGhlcndpc2UuCiAqIElmIGEgc3VmZml4IGhhcyBiZWVuIHJlZ2lzdGVyZWQgdXNpbmcgTkVUU05NUF9EU19MSUJfT0lEU1VGRklYLCBpdAogKiB3aWxsIGJlIGFwcGVuZGVkIHRvIHRoZSBpbnB1dCBzdHJpbmcgYmVmb3JlIHByb2Nlc3NpbmcuCiAqCiAqIEBwYXJhbSBhcmd2ICAgIFRoZSBPSUQgdG8gc3RyaW5nIHBhcnNlCiAqIEBwYXJhbSByb290ICAgIEFuIE9JRCBhcnJheSB3aGVyZSB0aGUgcmVzdWx0cyBhcmUgc3RvcmVkLgogKiBAcGFyYW0gcm9vdGxlbiBUaGUgbWF4IGxlbmd0aCBvZiB0aGUgYXJyYXkgZ29pbmcgaW4gYW5kIHRoZSBkYXRhCiAqICAgICAgICAgICAgICAgIGxlbmd0aCBjb21pbmcgb3V0LgogKgogKiBAcmV0dXJuICAgICAgICBUaGUgcm9vdCBvaWQgcG9pbnRlciBpZiBzdWNjZXNzZnVsLCBvciBOVUxMIG90aGVyd2lzZS4KICovCiAKb2lkICAgICAgICAgICAgKgpzbm1wX3BhcnNlX29pZChjb25zdCBjaGFyICphcmd2LCBvaWQgKiByb290LCBzaXplX3QgKiByb290bGVuKQp7CiAgICBzaXplX3QgICAgICAgICAgc2F2bGVuID0gKnJvb3RsZW47CiAgICBzdGF0aWMgc2l6ZV90ICAgdG1wYnVmX2xlbiA9IDA7CiAgICBzdGF0aWMgY2hhciAgICAqdG1wYnVmOwogICAgY29uc3QgY2hhciAgICAgKnN1ZmZpeCwgKnByZWZpeDsKCiAgICBzdWZmaXggPSBuZXRzbm1wX2RzX2dldF9zdHJpbmcoTkVUU05NUF9EU19MSUJSQVJZX0lELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5FVFNOTVBfRFNfTElCX09JRFNVRkZJWCk7CiAgICBwcmVmaXggPSBuZXRzbm1wX2RzX2dldF9zdHJpbmcoTkVUU05NUF9EU19MSUJSQVJZX0lELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5FVFNOTVBfRFNfTElCX09JRFBSRUZJWCk7CiAgICBpZiAoKHN1ZmZpeCAmJiBzdWZmaXhbMF0pIHx8IChwcmVmaXggJiYgcHJlZml4WzBdKSkgewogICAgICAgIGlmICghc3VmZml4KQogICAgICAgICAgICBzdWZmaXggPSAiIjsKICAgICAgICBpZiAoIXByZWZpeCkKICAgICAgICAgICAgcHJlZml4ID0gIiI7CiAgICAgICAgaWYgKChzdHJsZW4oc3VmZml4KSArIHN0cmxlbihwcmVmaXgpICsgc3RybGVuKGFyZ3YpICsgMikgPiB0bXBidWZfbGVuKSB7CiAgICAgICAgICAgIHRtcGJ1Zl9sZW4gPSBzdHJsZW4oc3VmZml4KSArIHN0cmxlbihhcmd2KSArIHN0cmxlbihwcmVmaXgpICsgMjsKICAgICAgICAgICAgdG1wYnVmID0gKGNoYXIgKilyZWFsbG9jKHRtcGJ1ZiwgdG1wYnVmX2xlbik7CiAgICAgICAgfQogICAgICAgIHNucHJpbnRmKHRtcGJ1ZiwgdG1wYnVmX2xlbiwgIiVzJXMlcyVzIiwgcHJlZml4LCBhcmd2LAogICAgICAgICAgICAgICAgICgoc3VmZml4WzBdID09ICcuJyB8fCBzdWZmaXhbMF0gPT0gJ1wwJykgPyAiIiA6ICIuIiksCiAgICAgICAgICAgICAgICAgc3VmZml4KTsKICAgICAgICBhcmd2ID0gdG1wYnVmOwogICAgICAgIERFQlVHTVNHVEwoKCJzbm1wX3BhcnNlX29pZCIsIlBhcnNpbmc6ICVzXG4iLGFyZ3YpKTsKICAgIH0KCiNpZm5kZWYgTkVUU05NUF9ESVNBQkxFX01JQl9MT0FESU5HCiAgICBpZiAobmV0c25tcF9kc19nZXRfYm9vbGVhbihORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX1JBTkRPTV9BQ0NFU1MpCiAgICAgICAgfHwgc3RyY2hyKGFyZ3YsICc6JykpIHsKICAgICAgICBpZiAoZ2V0X25vZGUoYXJndiwgcm9vdCwgcm9vdGxlbikpIHsKICAgICAgICAgICAgcmV0dXJuIHJvb3Q7CiAgICAgICAgfQogICAgfSBlbHNlIGlmIChuZXRzbm1wX2RzX2dldF9ib29sZWFuKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfUkVHRVhfQUNDRVNTKSkgewoJY2xlYXJfdHJlZV9mbGFncyh0cmVlX2hlYWQpOwogICAgICAgIGlmIChnZXRfd2lsZF9ub2RlKGFyZ3YsIHJvb3QsIHJvb3RsZW4pKSB7CiAgICAgICAgICAgIHJldHVybiByb290OwogICAgICAgIH0KICAgIH0gZWxzZSB7CiNlbmRpZiAvKiBORVRTTk1QX0RJU0FCTEVfTUlCX0xPQURJTkcgKi8KICAgICAgICBpZiAocmVhZF9vYmppZChhcmd2LCByb290LCByb290bGVuKSkgewogICAgICAgICAgICByZXR1cm4gcm9vdDsKICAgICAgICB9CiNpZm5kZWYgTkVUU05NUF9ESVNBQkxFX01JQl9MT0FESU5HCiAgICAgICAgKnJvb3RsZW4gPSBzYXZsZW47CiAgICAgICAgaWYgKGdldF9ub2RlKGFyZ3YsIHJvb3QsIHJvb3RsZW4pKSB7CiAgICAgICAgICAgIHJldHVybiByb290OwogICAgICAgIH0KICAgICAgICAqcm9vdGxlbiA9IHNhdmxlbjsKICAgICAgICBERUJVR01TR1RMKCgicGFyc2Vfb2lkIiwgIndpbGRseSBwYXJzaW5nXG4iKSk7CgljbGVhcl90cmVlX2ZsYWdzKHRyZWVfaGVhZCk7CiAgICAgICAgaWYgKGdldF93aWxkX25vZGUoYXJndiwgcm9vdCwgcm9vdGxlbikpIHsKICAgICAgICAgICAgcmV0dXJuIHJvb3Q7CiAgICAgICAgfQogICAgfQojZW5kaWYgLyogTkVUU05NUF9ESVNBQkxFX01JQl9MT0FESU5HICovCiAgICByZXR1cm4gTlVMTDsKfQoKI2lmbmRlZiBORVRTTk1QX0RJU0FCTEVfTUlCX0xPQURJTkcKLyoKICogVXNlIERJU1BMQVktSElOVCB0byBwYXJzZSBhIHZhbHVlIGludG8gYW4gb2N0ZXQgc3RyaW5nLgogKgogKiBub3RlIHRoYXQgIjFkMWQiLCAiMTEiIGNvdWxkIGhhdmUgY29tZSBmcm9tIGFuIG9jdGV0IHN0cmluZyB0aGF0CiAqIGxvb2tlZCBsaWtlIHsgMSwgMSB9IG9yIGFuIG9jdGV0IHN0cmluZyB0aGF0IGxvb2tlZCBsaWtlIHsgMTEgfQogKiBiZWNhdXNlIG9mIHRoaXMsIGl0J3MgZG91YnRmdWwgdGhhdCBhbnlvbmUgd291bGQgdXNlIHN1Y2ggYSBkaXNwbGF5CiAqIHN0cmluZy4gVGhlcmVmb3JlLCB0aGUgcGFyc2VyIGlnbm9yZXMgdGhpcyBjYXNlLgogKi8KCnN0cnVjdCBwYXJzZV9oaW50cyB7CiAgICBpbnQgbGVuZ3RoOwogICAgaW50IHJlcGVhdDsKICAgIGludCBmb3JtYXQ7CiAgICBpbnQgc2VwYXJhdG9yOwogICAgaW50IHRlcm1pbmF0b3I7CiAgICB1bnNpZ25lZCBjaGFyICpyZXN1bHQ7CiAgICBpbnQgcmVzdWx0X21heDsKICAgIGludCByZXN1bHRfbGVuOwp9OwoKc3RhdGljIHZvaWQgcGFyc2VfaGludHNfcmVzZXQoc3RydWN0IHBhcnNlX2hpbnRzICpwaCkKewogICAgcGgtPmxlbmd0aCA9IDA7CiAgICBwaC0+cmVwZWF0ID0gMDsKICAgIHBoLT5mb3JtYXQgPSAwOwogICAgcGgtPnNlcGFyYXRvciA9IDA7CiAgICBwaC0+dGVybWluYXRvciA9IDA7Cn0KCnN0YXRpYyB2b2lkIHBhcnNlX2hpbnRzX2N0b3Ioc3RydWN0IHBhcnNlX2hpbnRzICpwaCkKewogICAgcGFyc2VfaGludHNfcmVzZXQocGgpOwogICAgcGgtPnJlc3VsdCA9IE5VTEw7CiAgICBwaC0+cmVzdWx0X21heCA9IDA7CiAgICBwaC0+cmVzdWx0X2xlbiA9IDA7Cn0KCnN0YXRpYyBpbnQgcGFyc2VfaGludHNfYWRkX3Jlc3VsdF9vY3RldChzdHJ1Y3QgcGFyc2VfaGludHMgKnBoLCB1bnNpZ25lZCBjaGFyIG9jdGV0KQp7CiAgICBpZiAoIShwaC0+cmVzdWx0X2xlbiA8IHBoLT5yZXN1bHRfbWF4KSkgewoJcGgtPnJlc3VsdF9tYXggPSBwaC0+cmVzdWx0X2xlbiArIDMyOwoJaWYgKCFwaC0+cmVzdWx0KSB7CgkgICAgcGgtPnJlc3VsdCA9ICh1bnNpZ25lZCBjaGFyICopbWFsbG9jKHBoLT5yZXN1bHRfbWF4KTsKCX0gZWxzZSB7CgkgICAgcGgtPnJlc3VsdCA9ICh1bnNpZ25lZCBjaGFyICopcmVhbGxvYyhwaC0+cmVzdWx0LCBwaC0+cmVzdWx0X21heCk7Cgl9CiAgICB9CiAgICAKICAgIGlmICghcGgtPnJlc3VsdCkgewoJcmV0dXJuIDA7CQkvKiBmYWlsZWQgKi8KICAgIH0KCiAgICBwaC0+cmVzdWx0W3BoLT5yZXN1bHRfbGVuKytdID0gb2N0ZXQ7CiAgICByZXR1cm4gMTsJCQkvKiBzdWNjZXNzICovCn0KCnN0YXRpYyBpbnQgcGFyc2VfaGludHNfcGFyc2Uoc3RydWN0IHBhcnNlX2hpbnRzICpwaCwgY29uc3QgY2hhciAqKnZfaW5fb3V0KQp7CiAgICBjb25zdCBjaGFyICp2ID0gKnZfaW5fb3V0OwogICAgY2hhciAqbnY7CiAgICBpbnQgYmFzZTsKICAgIGludCByZXBlYXRzID0gMDsKICAgIGludCByZXBlYXRfZml4dXAgPSBwaC0+cmVzdWx0X2xlbjsKICAgIAogICAgaWYgKHBoLT5yZXBlYXQpIHsKCWlmICghcGFyc2VfaGludHNfYWRkX3Jlc3VsdF9vY3RldChwaCwgMCkpIHsKCSAgICByZXR1cm4gMDsKCX0KICAgIH0KICAgIGRvIHsKCWJhc2UgPSAwOwoJc3dpdGNoIChwaC0+Zm9ybWF0KSB7CgljYXNlICd4JzogYmFzZSArPSA2OwkvKiBmYWxsIHRocm91Z2ggKi8KCWNhc2UgJ2QnOiBiYXNlICs9IDI7CS8qIGZhbGwgdGhyb3VnaCAqLwoJY2FzZSAnbyc6IGJhc2UgKz0gODsJLyogZmFsbCB0aHJvdWdoICovCgkgICAgewoJCWludCBpOwoJCXVuc2lnbmVkIGxvbmcgbnVtYmVyID0gc3RydG9sKHYsICZudiwgYmFzZSk7CgkJaWYgKG52ID09IHYpIHJldHVybiAwOwoJCXYgPSBudjsKCQlmb3IgKGkgPSAwOyBpIDwgcGgtPmxlbmd0aDsgaSsrKSB7CgkJICAgIGludCBzaGlmdCA9IDggKiAocGgtPmxlbmd0aCAtIDEgLSBpKTsKCQkgICAgaWYgKCFwYXJzZV9oaW50c19hZGRfcmVzdWx0X29jdGV0KHBoLCAodV9jaGFyKShudW1iZXIgPj4gc2hpZnQpICkpIHsKCQkJcmV0dXJuIDA7IC8qIGZhaWxlZCAqLwoJCSAgICB9CgkJfQoJICAgIH0KCSAgICBicmVhazsKCgljYXNlICdhJzoKCSAgICB7CgkJaW50IGk7CgkJICAgIAoJCWZvciAoaSA9IDA7IGkgPCBwaC0+bGVuZ3RoICYmICp2OyBpKyspIHsKCQkgICAgaWYgKCFwYXJzZV9oaW50c19hZGRfcmVzdWx0X29jdGV0KHBoLCAqdisrKSkgewoJCQlyZXR1cm4gMDsJLyogZmFpbGVkICovCgkJICAgIH0KCQl9CgkgICAgfQoJICAgIGJyZWFrOwoJfQoKCXJlcGVhdHMrKzsKCglpZiAocGgtPnNlcGFyYXRvciAmJiAqdikgewoJICAgIGlmICgqdiA9PSBwaC0+c2VwYXJhdG9yKSB7CgkJdisrOwoJICAgIH0gZWxzZSB7CgkJcmV0dXJuIDA7CQkvKiBmYWlsZWQgKi8KCSAgICB9Cgl9CgoJaWYgKHBoLT50ZXJtaW5hdG9yKSB7CgkgICAgaWYgKCp2ID09IHBoLT50ZXJtaW5hdG9yKSB7CgkJdisrOwoJCWJyZWFrOwoJICAgIH0KCX0KICAgIH0gd2hpbGUgKHBoLT5yZXBlYXQgJiYgKnYpOwogICAgaWYgKHBoLT5yZXBlYXQpIHsKCXBoLT5yZXN1bHRbcmVwZWF0X2ZpeHVwXSA9IHJlcGVhdHM7CiAgICB9CgogICAgKnZfaW5fb3V0ID0gdjsKICAgIHJldHVybiAxOwp9CgpzdGF0aWMgdm9pZCBwYXJzZV9oaW50c19sZW5ndGhfYWRkX2RpZ2l0KHN0cnVjdCBwYXJzZV9oaW50cyAqcGgsIGludCBkaWdpdCkKewogICAgcGgtPmxlbmd0aCAqPSAxMDsKICAgIHBoLT5sZW5ndGggKz0gZGlnaXQgLSAnMCc7Cn0KCmNvbnN0IGNoYXIgKnBhcnNlX29jdGV0X2hpbnQoY29uc3QgY2hhciAqaGludCwgY29uc3QgY2hhciAqdmFsdWUsIHVuc2lnbmVkIGNoYXIgKipuZXdfdmFsLCBpbnQgKm5ld192YWxfbGVuKQp7CiAgICBjb25zdCBjaGFyICpoID0gaGludDsKICAgIGNvbnN0IGNoYXIgKnYgPSB2YWx1ZTsKICAgIHN0cnVjdCBwYXJzZV9oaW50cyBwaDsKICAgIGludCByZXR2YWwgPSAxOwogICAgLyogU2VlIFJGQyAxNDQzICovCiAgICBlbnVtIHsKCUhJTlRfMV8yLAoJSElOVF8yXzMsCglISU5UXzFfMl80LAoJSElOVF8xXzJfNQogICAgfSBzdGF0ZSA9IEhJTlRfMV8yOwoKICAgIHBhcnNlX2hpbnRzX2N0b3IoJnBoKTsKICAgIHdoaWxlICgqaCAmJiAqdiAmJiByZXR2YWwpIHsKCXN3aXRjaCAoc3RhdGUpIHsKCWNhc2UgSElOVF8xXzI6CgkgICAgaWYgKCcqJyA9PSAqaCkgewoJCXBoLnJlcGVhdCA9IDE7CgkJc3RhdGUgPSBISU5UXzJfMzsKCSAgICB9IGVsc2UgaWYgKGlzZGlnaXQoKmgpKSB7CgkJcGFyc2VfaGludHNfbGVuZ3RoX2FkZF9kaWdpdCgmcGgsICpoKTsKCQlzdGF0ZSA9IEhJTlRfMl8zOwoJICAgIH0gZWxzZSB7CgkJcmV0dXJuIHY7CS8qIGZhaWxlZCAqLwoJICAgIH0KCSAgICBicmVhazsKCgljYXNlIEhJTlRfMl8zOgoJICAgIGlmIChpc2RpZ2l0KCpoKSkgewoJCXBhcnNlX2hpbnRzX2xlbmd0aF9hZGRfZGlnaXQoJnBoLCAqaCk7CgkJLyogc3RhdGUgPSBISU5UXzJfMyAqLwoJICAgIH0gZWxzZSBpZiAoJ3gnID09ICpoIHx8ICdkJyA9PSAqaCB8fCAnbycgPT0gKmggfHwgJ2EnID09ICpoKSB7CgkJcGguZm9ybWF0ID0gKmg7CgkJc3RhdGUgPSBISU5UXzFfMl80OwoJICAgIH0gZWxzZSB7CgkJcmV0dXJuIHY7CS8qIGZhaWxlZCAqLwoJICAgIH0KCSAgICBicmVhazsKCgljYXNlIEhJTlRfMV8yXzQ6CgkgICAgaWYgKCcqJyA9PSAqaCkgewoJCXJldHZhbCA9IHBhcnNlX2hpbnRzX3BhcnNlKCZwaCwgJnYpOwoJCXBhcnNlX2hpbnRzX3Jlc2V0KCZwaCk7CgkJCgkJcGgucmVwZWF0ID0gMTsKCQlzdGF0ZSA9IEhJTlRfMl8zOwoJICAgIH0gZWxzZSBpZiAoaXNkaWdpdCgqaCkpIHsKCQlyZXR2YWwgPSBwYXJzZV9oaW50c19wYXJzZSgmcGgsICZ2KTsKCQlwYXJzZV9oaW50c19yZXNldCgmcGgpOwoJCQoJCXBhcnNlX2hpbnRzX2xlbmd0aF9hZGRfZGlnaXQoJnBoLCAqaCk7CgkJc3RhdGUgPSBISU5UXzJfMzsKCSAgICB9IGVsc2UgewoJCXBoLnNlcGFyYXRvciA9ICpoOwoJCXN0YXRlID0gSElOVF8xXzJfNTsKCSAgICB9CgkgICAgYnJlYWs7CgoJY2FzZSBISU5UXzFfMl81OgoJICAgIGlmICgnKicgPT0gKmgpIHsKCQlyZXR2YWwgPSBwYXJzZV9oaW50c19wYXJzZSgmcGgsICZ2KTsKCQlwYXJzZV9oaW50c19yZXNldCgmcGgpOwoJCQoJCXBoLnJlcGVhdCA9IDE7CgkJc3RhdGUgPSBISU5UXzJfMzsKCSAgICB9IGVsc2UgaWYgKGlzZGlnaXQoKmgpKSB7CgkJcmV0dmFsID0gcGFyc2VfaGludHNfcGFyc2UoJnBoLCAmdik7CgkJcGFyc2VfaGludHNfcmVzZXQoJnBoKTsKCQkKCQlwYXJzZV9oaW50c19sZW5ndGhfYWRkX2RpZ2l0KCZwaCwgKmgpOwoJCXN0YXRlID0gSElOVF8yXzM7CgkgICAgfSBlbHNlIHsKCQlwaC50ZXJtaW5hdG9yID0gKmg7CgoJCXJldHZhbCA9IHBhcnNlX2hpbnRzX3BhcnNlKCZwaCwgJnYpOwoJCXBhcnNlX2hpbnRzX3Jlc2V0KCZwaCk7CgoJCXN0YXRlID0gSElOVF8xXzI7CgkgICAgfQoJICAgIGJyZWFrOwoJfQoJaCsrOwogICAgfQogICAgd2hpbGUgKCp2ICYmIHJldHZhbCkgewoJcmV0dmFsID0gcGFyc2VfaGludHNfcGFyc2UoJnBoLCAmdik7CiAgICB9CiAgICBpZiAocmV0dmFsKSB7CgkqbmV3X3ZhbCA9IHBoLnJlc3VsdDsKCSpuZXdfdmFsX2xlbiA9IHBoLnJlc3VsdF9sZW47CiAgICB9IGVsc2UgewoJaWYgKHBoLnJlc3VsdCkgewoJICAgIFNOTVBfRlJFRShwaC5yZXN1bHQpOwoJfQoJKm5ld192YWwgPSBOVUxMOwoJKm5ld192YWxfbGVuID0gMDsKICAgIH0KICAgIHJldHVybiByZXR2YWwgPyBOVUxMIDogdjsKfQojZW5kaWYgLyogTkVUU05NUF9ESVNBQkxFX01JQl9MT0FESU5HICovCgojaWZkZWYgdGVzdF9kaXNwbGF5X2hpbnQKCmludCBtYWluKGludCBhcmdjLCBjb25zdCBjaGFyICoqYXJndikKewogICAgY29uc3QgY2hhciAqaGludDsKICAgIGNvbnN0IGNoYXIgKnZhbHVlOwogICAgdW5zaWduZWQgY2hhciAqbmV3X3ZhbDsKICAgIGludCBuZXdfdmFsX2xlbjsKICAgIGNoYXIgKnI7CiAgICAKICAgIGlmIChhcmdjIDwgMykgewoJZnByaW50ZihzdGRlcnIsICJ1c2FnZTogZGggPGhpbnQ+IDx2YWx1ZT5cbiIpOwoJZXhpdCgyKTsKICAgIH0KICAgIGhpbnQgPSBhcmd2WzFdOwogICAgdmFsdWUgPSBhcmd2WzJdOwogICAgciA9IHBhcnNlX29jdGV0X2hpbnQoaGludCwgdmFsdWUsICZuZXdfdmFsLCAmbmV3X3ZhbF9sZW4pOwogICAgcHJpbnRmKCJ7XCIlc1wiLCBcIiVzXCJ9OiBcblx0IiwgaGludCwgdmFsdWUpOwogICAgaWYgKHIpIHsKICAgICAgICAqciA9IDA7CiAgICAJcHJpbnRmKCJyZXR1cm5lZCBmYWlsZWRcbiIpOwoJcHJpbnRmKCJ2YWx1ZSBzeW50YXggZXJyb3IgYXQ6ICVzXG4iLCB2YWx1ZSk7CiAgICB9CiAgICBlbHNlIHsKCWludCBpOwoJcHJpbnRmKCJyZXR1cm5lZCBzdWNjZXNzXG4iKTsKCWZvciAoaSA9IDA7IGkgPCBuZXdfdmFsX2xlbjsgaSsrKSB7CgkgICAgaW50IGMgPSBuZXdfdmFsW2ldICYgMHhGRjsKCSAgICBwcmludGYoIiUwMlgoJWMpICIsIGMsIGlzcHJpbnQoYykgPyBjIDogJyAnKTsKCX0KCVNOTVBfRlJFRShuZXdfdmFsKTsKICAgIH0KICAgIHByaW50ZigiXG4iKTsKICAgIGV4aXQoMCk7Cn0KCiNlbmRpZiAvKiB0ZXN0X2Rpc3BsYXlfaGludCAqLwoKdV9jaGFyCm1pYl90b19hc25fdHlwZShpbnQgbWliX3R5cGUpCnsKICAgIHN3aXRjaCAobWliX3R5cGUpIHsKICAgIGNhc2UgVFlQRV9PQkpJRDoKICAgICAgICByZXR1cm4gQVNOX09CSkVDVF9JRDsKCiAgICBjYXNlIFRZUEVfT0NURVRTVFI6CiAgICAgICAgcmV0dXJuIEFTTl9PQ1RFVF9TVFI7CgogICAgY2FzZSBUWVBFX05FVEFERFI6CiAgICBjYXNlIFRZUEVfSVBBRERSOgogICAgICAgIHJldHVybiBBU05fSVBBRERSRVNTOwoKICAgIGNhc2UgVFlQRV9JTlRFR0VSMzI6CiAgICBjYXNlIFRZUEVfSU5URUdFUjoKICAgICAgICByZXR1cm4gQVNOX0lOVEVHRVI7CgogICAgY2FzZSBUWVBFX0NPVU5URVI6CiAgICAgICAgcmV0dXJuIEFTTl9DT1VOVEVSOwoKICAgIGNhc2UgVFlQRV9HQVVHRToKICAgICAgICByZXR1cm4gQVNOX0dBVUdFOwoKICAgIGNhc2UgVFlQRV9USU1FVElDS1M6CiAgICAgICAgcmV0dXJuIEFTTl9USU1FVElDS1M7CgogICAgY2FzZSBUWVBFX09QQVFVRToKICAgICAgICByZXR1cm4gQVNOX09QQVFVRTsKCiAgICBjYXNlIFRZUEVfTlVMTDoKICAgICAgICByZXR1cm4gQVNOX05VTEw7CgogICAgY2FzZSBUWVBFX0NPVU5URVI2NDoKICAgICAgICByZXR1cm4gQVNOX0NPVU5URVI2NDsKCiAgICBjYXNlIFRZUEVfQklUU1RSSU5HOgogICAgICAgIHJldHVybiBBU05fQklUX1NUUjsKCiAgICBjYXNlIFRZUEVfVUlOVEVHRVI6CiAgICBjYXNlIFRZUEVfVU5TSUdORUQzMjoKICAgICAgICByZXR1cm4gQVNOX1VOU0lHTkVEOwoKICAgIGNhc2UgVFlQRV9OU0FQQUREUkVTUzoKICAgICAgICByZXR1cm4gQVNOX05TQVA7CgogICAgfQogICAgcmV0dXJuIC0xOwp9CgovKioKICogQ29udmVydHMgYSBzdHJpbmcgdG8gaXRzIE9JRCBmb3JtLgogKiBpbiBleGFtcGxlICAiaGVsbG8iID0gNSAuICdoJyAuICdlJyAuICdsJyAuICdsJyAuICdvJwogKgogKiBAcGFyYW0gUyAgIFRoZSBzdHJpbmcuCiAqIEBwYXJhbSBPICAgVGhlIG9pZC4KICogQHBhcmFtIEwgICBUaGUgbGVuZ3RoIG9mIHRoZSBvaWQuCiAqCiAqIEByZXR1cm4gMCBvbiBTdWNlc3MsIDEgb24gZmFpbHVyZS4KICovCmludApuZXRzbm1wX3N0cjJvaWQoY29uc3QgY2hhciAqUywgb2lkICogTywgaW50IEwpCnsKICAgIGNvbnN0IGNoYXIgICAgICpjID0gUzsKICAgIG9pZCAgICAgICAgICAgICpvID0gJk9bMV07CgogICAgLS1MOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIGxlYXZlIHJvb20gZm9yIGxlbmd0aCBwcmVmaXggKi8KCiAgICBmb3IgKDsgKmMgJiYgTDsgLS1MLCArK28sICsrYykKICAgICAgICAqbyA9ICpjOwoKICAgIC8qCiAgICAgKiBtYWtlIHN1cmUgd2UgZ290IHRvIHRoZSBlbmQgb2YgdGhlIHN0cmluZyAKICAgICAqLwogICAgaWYgKCpjICE9IDApCiAgICAgICAgcmV0dXJuIDE7CgogICAgLyoKICAgICAqIHNldCB0aGUgbGVuZ3RoIG9mIHRoZSBvaWQgCiAgICAgKi8KICAgICpPID0gYyAtIFM7CgogICAgcmV0dXJuIDA7Cn0KCi8qKgogKiBDb252ZXJ0cyBhbiBPSUQgdG8gaXRzIGNoYXJhY3RlciBmb3JtLgogKiBpbiBleGFtcGxlICA1IC4gMSAuIDIgLiAzIC4gNCAuIDUgPSAxMjM0NQogKgogKiBAcGFyYW0gQyAgIFRoZSBjaGFyYWN0ZXIgYnVmZmVyLgogKiBAcGFyYW0gTCAgIFRoZSBsZW5ndGggb2YgdGhlIGJ1ZmZlci4KICogQHBhcmFtIE8gICBUaGUgb2lkLgogKgogKiBAcmV0dXJuIDAgb24gU3VjZXNzLCAxIG9uIGZhaWx1cmUuCiAqLwppbnQKbmV0c25tcF9vaWQyY2hhcnMoY2hhciAqQywgaW50IEwsIGNvbnN0IG9pZCAqIE8pCnsKICAgIGNoYXIgICAgICAgICAgICpjID0gQzsKICAgIGNvbnN0IG9pZCAgICAgICpvID0gJk9bMV07CgogICAgaWYgKEwgPCAoaW50KSpPKQogICAgICAgIHJldHVybiAxOwoKICAgIEwgPSAqTzsgLyoqIGxlbmd0aCAqLwogICAgZm9yICg7IEw7IC0tTCwgKytvLCArK2MpIHsKICAgICAgICBpZiAoKm8gPiAweEZGKQogICAgICAgICAgICByZXR1cm4gMTsKICAgICAgICAqYyA9IChjaGFyKSpvOwogICAgfQogICAgcmV0dXJuIDA7Cn0KCi8qKgogKiBDb252ZXJ0cyBhbiBPSUQgdG8gaXRzIHN0cmluZyBmb3JtLgogKiBpbiBleGFtcGxlICA1IC4gJ2gnIC4gJ2UnIC4gJ2wnIC4gJ2wnIC4gJ28nID0gImhlbGxvXDAiIChudWxsIHRlcm1pbmF0ZWQpCiAqCiAqIEBwYXJhbSBTICAgVGhlIGNoYXJhY3RlciBzdHJpbmcgYnVmZmVyLgogKiBAcGFyYW0gTCAgIFRoZSBsZW5ndGggb2YgdGhlIHN0cmluZyBidWZmZXIuCiAqIEBwYXJhbSBPICAgVGhlIG9pZC4KICoKICogQHJldHVybiAwIG9uIFN1Y2VzcywgMSBvbiBmYWlsdXJlLgogKi8KaW50Cm5ldHNubXBfb2lkMnN0cihjaGFyICpTLCBpbnQgTCwgb2lkICogTykKewogICAgaW50ICAgICAgICAgICAgcmM7CgogICAgaWYgKEwgPD0gKGludCkqTykKICAgICAgICByZXR1cm4gMTsKCiAgICByYyA9IG5ldHNubXBfb2lkMmNoYXJzKFMsIEwsIE8pOwogICAgaWYgKHJjKQogICAgICAgIHJldHVybiAxOwoKICAgIFNbICpPIF0gPSAwOwoKICAgIHJldHVybiAwOwp9CgppbnQKc25wcmludF9ieV90eXBlKGNoYXIgKmJ1Ziwgc2l6ZV90IGJ1Zl9sZW4sCiAgICAgICAgICAgICAgICBuZXRzbm1wX3ZhcmlhYmxlX2xpc3QgKiB2YXIsCiAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgZW51bV9saXN0ICplbnVtcywKICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmhpbnQsIGNvbnN0IGNoYXIgKnVuaXRzKQp7CiAgICBzaXplX3QgICAgICAgICAgb3V0X2xlbiA9IDA7CiAgICBpZiAoc3ByaW50X3JlYWxsb2NfYnlfdHlwZSgodV9jaGFyICoqKSAmIGJ1ZiwgJmJ1Zl9sZW4sICZvdXRfbGVuLCAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyLCBlbnVtcywgaGludCwgdW5pdHMpKQogICAgICAgIHJldHVybiAoaW50KSBvdXRfbGVuOwogICAgZWxzZQogICAgICAgIHJldHVybiAtMTsKfQoKaW50CnNucHJpbnRfaGV4c3RyaW5nKGNoYXIgKmJ1Ziwgc2l6ZV90IGJ1Zl9sZW4sIGNvbnN0IHVfY2hhciAqIGNwLCBzaXplX3QgbGVuKQp7CiAgICBzaXplX3QgICAgICAgICAgb3V0X2xlbiA9IDA7CiAgICBpZiAoc3ByaW50X3JlYWxsb2NfaGV4c3RyaW5nKCh1X2NoYXIgKiopICYgYnVmLCAmYnVmX2xlbiwgJm91dF9sZW4sIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNwLCBsZW4pKQogICAgICAgIHJldHVybiAoaW50KSBvdXRfbGVuOwogICAgZWxzZQogICAgICAgIHJldHVybiAtMTsKfQoKaW50CnNucHJpbnRfYXNjaWlzdHJpbmcoY2hhciAqYnVmLCBzaXplX3QgYnVmX2xlbiwKICAgICAgICAgICAgICAgICAgICBjb25zdCB1X2NoYXIgKiBjcCwgc2l6ZV90IGxlbikKewogICAgc2l6ZV90ICAgICAgICAgIG91dF9sZW4gPSAwOwogICAgaWYgKHNwcmludF9yZWFsbG9jX2FzY2lpc3RyaW5nCiAgICAgICAgKCh1X2NoYXIgKiopICYgYnVmLCAmYnVmX2xlbiwgJm91dF9sZW4sIDAsIGNwLCBsZW4pKQogICAgICAgIHJldHVybiAoaW50KSBvdXRfbGVuOwogICAgZWxzZQogICAgICAgIHJldHVybiAtMTsKfQoKaW50CnNucHJpbnRfb2N0ZXRfc3RyaW5nKGNoYXIgKmJ1Ziwgc2l6ZV90IGJ1Zl9sZW4sCiAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5ldHNubXBfdmFyaWFibGVfbGlzdCAqIHZhciwgY29uc3Qgc3RydWN0IGVudW1fbGlzdCAqZW51bXMsCiAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmhpbnQsIGNvbnN0IGNoYXIgKnVuaXRzKQp7CiAgICBzaXplX3QgICAgICAgICAgb3V0X2xlbiA9IDA7CiAgICBpZiAoc3ByaW50X3JlYWxsb2Nfb2N0ZXRfc3RyaW5nCiAgICAgICAgKCh1X2NoYXIgKiopICYgYnVmLCAmYnVmX2xlbiwgJm91dF9sZW4sIDAsIHZhciwgZW51bXMsIGhpbnQsCiAgICAgICAgIHVuaXRzKSkKICAgICAgICByZXR1cm4gKGludCkgb3V0X2xlbjsKICAgIGVsc2UKICAgICAgICByZXR1cm4gLTE7Cn0KCmludApzbnByaW50X29wYXF1ZShjaGFyICpidWYsIHNpemVfdCBidWZfbGVuLAogICAgICAgICAgICAgICBjb25zdCBuZXRzbm1wX3ZhcmlhYmxlX2xpc3QgKiB2YXIsIGNvbnN0IHN0cnVjdCBlbnVtX2xpc3QgKmVudW1zLAogICAgICAgICAgICAgICBjb25zdCBjaGFyICpoaW50LCBjb25zdCBjaGFyICp1bml0cykKewogICAgc2l6ZV90ICAgICAgICAgIG91dF9sZW4gPSAwOwogICAgaWYgKHNwcmludF9yZWFsbG9jX29wYXF1ZSgodV9jaGFyICoqKSAmIGJ1ZiwgJmJ1Zl9sZW4sICZvdXRfbGVuLCAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIsIGVudW1zLCBoaW50LCB1bml0cykpCiAgICAgICAgcmV0dXJuIChpbnQpIG91dF9sZW47CiAgICBlbHNlCiAgICAgICAgcmV0dXJuIC0xOwp9CgppbnQKc25wcmludF9vYmplY3RfaWRlbnRpZmllcihjaGFyICpidWYsIHNpemVfdCBidWZfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5ldHNubXBfdmFyaWFibGVfbGlzdCAqIHZhciwKICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgZW51bV9saXN0ICplbnVtcywgY29uc3QgY2hhciAqaGludCwKICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICp1bml0cykKewogICAgc2l6ZV90ICAgICAgICAgIG91dF9sZW4gPSAwOwogICAgaWYgKHNwcmludF9yZWFsbG9jX29iamVjdF9pZGVudGlmaWVyCiAgICAgICAgKCh1X2NoYXIgKiopICYgYnVmLCAmYnVmX2xlbiwgJm91dF9sZW4sIDAsIHZhciwgZW51bXMsIGhpbnQsCiAgICAgICAgIHVuaXRzKSkKICAgICAgICByZXR1cm4gKGludCkgb3V0X2xlbjsKICAgIGVsc2UKICAgICAgICByZXR1cm4gLTE7Cn0KCmludApzbnByaW50X3RpbWV0aWNrcyhjaGFyICpidWYsIHNpemVfdCBidWZfbGVuLAogICAgICAgICAgICAgICAgICBjb25zdCBuZXRzbm1wX3ZhcmlhYmxlX2xpc3QgKiB2YXIsIGNvbnN0IHN0cnVjdCBlbnVtX2xpc3QgKmVudW1zLAogICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpoaW50LCBjb25zdCBjaGFyICp1bml0cykKewogICAgc2l6ZV90ICAgICAgICAgIG91dF9sZW4gPSAwOwogICAgaWYgKHNwcmludF9yZWFsbG9jX3RpbWV0aWNrcygodV9jaGFyICoqKSAmIGJ1ZiwgJmJ1Zl9sZW4sICZvdXRfbGVuLCAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIsIGVudW1zLCBoaW50LCB1bml0cykpCiAgICAgICAgcmV0dXJuIChpbnQpIG91dF9sZW47CiAgICBlbHNlCiAgICAgICAgcmV0dXJuIC0xOwp9CgppbnQKc25wcmludF9oaW50ZWRfaW50ZWdlcihjaGFyICpidWYsIHNpemVfdCBidWZfbGVuLAogICAgICAgICAgICAgICAgICAgICAgIGxvbmcgdmFsLCBjb25zdCBjaGFyICpoaW50LCBjb25zdCBjaGFyICp1bml0cykKewogICAgc2l6ZV90ICAgICAgICAgIG91dF9sZW4gPSAwOwogICAgaWYgKHNwcmludF9yZWFsbG9jX2hpbnRlZF9pbnRlZ2VyCiAgICAgICAgKCh1X2NoYXIgKiopICYgYnVmLCAmYnVmX2xlbiwgJm91dF9sZW4sIDAsIHZhbCwgJ2QnLCBoaW50LCB1bml0cykpCiAgICAgICAgcmV0dXJuIChpbnQpIG91dF9sZW47CiAgICBlbHNlCiAgICAgICAgcmV0dXJuIC0xOwp9CgppbnQKc25wcmludF9pbnRlZ2VyKGNoYXIgKmJ1Ziwgc2l6ZV90IGJ1Zl9sZW4sCiAgICAgICAgICAgICAgICBjb25zdCBuZXRzbm1wX3ZhcmlhYmxlX2xpc3QgKiB2YXIsIGNvbnN0IHN0cnVjdCBlbnVtX2xpc3QgKmVudW1zLAogICAgICAgICAgICAgICAgY29uc3QgY2hhciAqaGludCwgY29uc3QgY2hhciAqdW5pdHMpCnsKICAgIHNpemVfdCAgICAgICAgICBvdXRfbGVuID0gMDsKICAgIGlmIChzcHJpbnRfcmVhbGxvY19pbnRlZ2VyKCh1X2NoYXIgKiopICYgYnVmLCAmYnVmX2xlbiwgJm91dF9sZW4sIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIsIGVudW1zLCBoaW50LCB1bml0cykpCiAgICAgICAgcmV0dXJuIChpbnQpIG91dF9sZW47CiAgICBlbHNlCiAgICAgICAgcmV0dXJuIC0xOwp9CgppbnQKc25wcmludF91aW50ZWdlcihjaGFyICpidWYsIHNpemVfdCBidWZfbGVuLAogICAgICAgICAgICAgICAgIGNvbnN0IG5ldHNubXBfdmFyaWFibGVfbGlzdCAqIHZhciwgY29uc3Qgc3RydWN0IGVudW1fbGlzdCAqZW51bXMsCiAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqaGludCwgY29uc3QgY2hhciAqdW5pdHMpCnsKICAgIHNpemVfdCAgICAgICAgICBvdXRfbGVuID0gMDsKICAgIGlmIChzcHJpbnRfcmVhbGxvY191aW50ZWdlcigodV9jaGFyICoqKSAmIGJ1ZiwgJmJ1Zl9sZW4sICZvdXRfbGVuLCAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciwgZW51bXMsIGhpbnQsIHVuaXRzKSkKICAgICAgICByZXR1cm4gKGludCkgb3V0X2xlbjsKICAgIGVsc2UKICAgICAgICByZXR1cm4gLTE7Cn0KCmludApzbnByaW50X2dhdWdlKGNoYXIgKmJ1Ziwgc2l6ZV90IGJ1Zl9sZW4sCiAgICAgICAgICAgICAgY29uc3QgbmV0c25tcF92YXJpYWJsZV9saXN0ICogdmFyLCBjb25zdCBzdHJ1Y3QgZW51bV9saXN0ICplbnVtcywKICAgICAgICAgICAgICBjb25zdCBjaGFyICpoaW50LCBjb25zdCBjaGFyICp1bml0cykKewogICAgc2l6ZV90ICAgICAgICAgIG91dF9sZW4gPSAwOwogICAgaWYgKHNwcmludF9yZWFsbG9jX2dhdWdlKCh1X2NoYXIgKiopICYgYnVmLCAmYnVmX2xlbiwgJm91dF9sZW4sIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyLCBlbnVtcywgaGludCwgdW5pdHMpKQogICAgICAgIHJldHVybiAoaW50KSBvdXRfbGVuOwogICAgZWxzZQogICAgICAgIHJldHVybiAtMTsKfQoKaW50CnNucHJpbnRfY291bnRlcihjaGFyICpidWYsIHNpemVfdCBidWZfbGVuLAogICAgICAgICAgICAgICAgY29uc3QgbmV0c25tcF92YXJpYWJsZV9saXN0ICogdmFyLCBjb25zdCBzdHJ1Y3QgZW51bV9saXN0ICplbnVtcywKICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmhpbnQsIGNvbnN0IGNoYXIgKnVuaXRzKQp7CiAgICBzaXplX3QgICAgICAgICAgb3V0X2xlbiA9IDA7CiAgICBpZiAoc3ByaW50X3JlYWxsb2NfY291bnRlcigodV9jaGFyICoqKSAmIGJ1ZiwgJmJ1Zl9sZW4sICZvdXRfbGVuLCAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyLCBlbnVtcywgaGludCwgdW5pdHMpKQogICAgICAgIHJldHVybiAoaW50KSBvdXRfbGVuOwogICAgZWxzZQogICAgICAgIHJldHVybiAtMTsKfQoKaW50CnNucHJpbnRfbmV0d29ya2FkZHJlc3MoY2hhciAqYnVmLCBzaXplX3QgYnVmX2xlbiwKICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXRzbm1wX3ZhcmlhYmxlX2xpc3QgKiB2YXIsCiAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGVudW1fbGlzdCAqZW51bXMsIGNvbnN0IGNoYXIgKmhpbnQsCiAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqdW5pdHMpCnsKICAgIHNpemVfdCAgICAgICAgICBvdXRfbGVuID0gMDsKICAgIGlmIChzcHJpbnRfcmVhbGxvY19uZXR3b3JrYWRkcmVzcwogICAgICAgICgodV9jaGFyICoqKSAmIGJ1ZiwgJmJ1Zl9sZW4sICZvdXRfbGVuLCAwLCB2YXIsIGVudW1zLCBoaW50LAogICAgICAgICB1bml0cykpCiAgICAgICAgcmV0dXJuIChpbnQpIG91dF9sZW47CiAgICBlbHNlCiAgICAgICAgcmV0dXJuIC0xOwp9CgppbnQKc25wcmludF9pcGFkZHJlc3MoY2hhciAqYnVmLCBzaXplX3QgYnVmX2xlbiwKICAgICAgICAgICAgICAgICAgY29uc3QgbmV0c25tcF92YXJpYWJsZV9saXN0ICogdmFyLCBjb25zdCBzdHJ1Y3QgZW51bV9saXN0ICplbnVtcywKICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqaGludCwgY29uc3QgY2hhciAqdW5pdHMpCnsKICAgIHNpemVfdCAgICAgICAgICBvdXRfbGVuID0gMDsKICAgIGlmIChzcHJpbnRfcmVhbGxvY19pcGFkZHJlc3MoKHVfY2hhciAqKikgJiBidWYsICZidWZfbGVuLCAmb3V0X2xlbiwgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyLCBlbnVtcywgaGludCwgdW5pdHMpKQogICAgICAgIHJldHVybiAoaW50KSBvdXRfbGVuOwogICAgZWxzZQogICAgICAgIHJldHVybiAtMTsKfQoKaW50CnNucHJpbnRfbnVsbChjaGFyICpidWYsIHNpemVfdCBidWZfbGVuLAogICAgICAgICAgICAgY29uc3QgbmV0c25tcF92YXJpYWJsZV9saXN0ICogdmFyLCBjb25zdCBzdHJ1Y3QgZW51bV9saXN0ICplbnVtcywKICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmhpbnQsIGNvbnN0IGNoYXIgKnVuaXRzKQp7CiAgICBzaXplX3QgICAgICAgICAgb3V0X2xlbiA9IDA7CiAgICBpZiAoc3ByaW50X3JlYWxsb2NfbnVsbCgodV9jaGFyICoqKSAmIGJ1ZiwgJmJ1Zl9sZW4sICZvdXRfbGVuLCAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyLCBlbnVtcywgaGludCwgdW5pdHMpKQogICAgICAgIHJldHVybiAoaW50KSBvdXRfbGVuOwogICAgZWxzZQogICAgICAgIHJldHVybiAtMTsKfQoKaW50CnNucHJpbnRfYml0c3RyaW5nKGNoYXIgKmJ1Ziwgc2l6ZV90IGJ1Zl9sZW4sCiAgICAgICAgICAgICAgICAgIGNvbnN0IG5ldHNubXBfdmFyaWFibGVfbGlzdCAqIHZhciwgY29uc3Qgc3RydWN0IGVudW1fbGlzdCAqZW51bXMsCiAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmhpbnQsIGNvbnN0IGNoYXIgKnVuaXRzKQp7CiAgICBzaXplX3QgICAgICAgICAgb3V0X2xlbiA9IDA7CiAgICBpZiAoc3ByaW50X3JlYWxsb2NfYml0c3RyaW5nKCh1X2NoYXIgKiopICYgYnVmLCAmYnVmX2xlbiwgJm91dF9sZW4sIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciwgZW51bXMsIGhpbnQsIHVuaXRzKSkKICAgICAgICByZXR1cm4gKGludCkgb3V0X2xlbjsKICAgIGVsc2UKICAgICAgICByZXR1cm4gLTE7Cn0KCmludApzbnByaW50X25zYXBhZGRyZXNzKGNoYXIgKmJ1Ziwgc2l6ZV90IGJ1Zl9sZW4sCiAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV0c25tcF92YXJpYWJsZV9saXN0ICogdmFyLCBjb25zdCBzdHJ1Y3QgZW51bV9saXN0ICplbnVtcywKICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpoaW50LCBjb25zdCBjaGFyICp1bml0cykKewogICAgc2l6ZV90ICAgICAgICAgIG91dF9sZW4gPSAwOwogICAgaWYgKHNwcmludF9yZWFsbG9jX25zYXBhZGRyZXNzCiAgICAgICAgKCh1X2NoYXIgKiopICYgYnVmLCAmYnVmX2xlbiwgJm91dF9sZW4sIDAsIHZhciwgZW51bXMsIGhpbnQsCiAgICAgICAgIHVuaXRzKSkKICAgICAgICByZXR1cm4gKGludCkgb3V0X2xlbjsKICAgIGVsc2UKICAgICAgICByZXR1cm4gLTE7Cn0KCmludApzbnByaW50X2NvdW50ZXI2NChjaGFyICpidWYsIHNpemVfdCBidWZfbGVuLAogICAgICAgICAgICAgICAgICBjb25zdCBuZXRzbm1wX3ZhcmlhYmxlX2xpc3QgKiB2YXIsIGNvbnN0IHN0cnVjdCBlbnVtX2xpc3QgKmVudW1zLAogICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpoaW50LCBjb25zdCBjaGFyICp1bml0cykKewogICAgc2l6ZV90ICAgICAgICAgIG91dF9sZW4gPSAwOwogICAgaWYgKHNwcmludF9yZWFsbG9jX2NvdW50ZXI2NCgodV9jaGFyICoqKSAmIGJ1ZiwgJmJ1Zl9sZW4sICZvdXRfbGVuLCAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIsIGVudW1zLCBoaW50LCB1bml0cykpCiAgICAgICAgcmV0dXJuIChpbnQpIG91dF9sZW47CiAgICBlbHNlCiAgICAgICAgcmV0dXJuIC0xOwp9CgppbnQKc25wcmludF9iYWR0eXBlKGNoYXIgKmJ1Ziwgc2l6ZV90IGJ1Zl9sZW4sCiAgICAgICAgICAgICAgICBjb25zdCBuZXRzbm1wX3ZhcmlhYmxlX2xpc3QgKiB2YXIsIGNvbnN0IHN0cnVjdCBlbnVtX2xpc3QgKmVudW1zLAogICAgICAgICAgICAgICAgY29uc3QgY2hhciAqaGludCwgY29uc3QgY2hhciAqdW5pdHMpCnsKICAgIHNpemVfdCAgICAgICAgICBvdXRfbGVuID0gMDsKICAgIGlmIChzcHJpbnRfcmVhbGxvY19iYWR0eXBlKCh1X2NoYXIgKiopICYgYnVmLCAmYnVmX2xlbiwgJm91dF9sZW4sIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIsIGVudW1zLCBoaW50LCB1bml0cykpCiAgICAgICAgcmV0dXJuIChpbnQpIG91dF9sZW47CiAgICBlbHNlCiAgICAgICAgcmV0dXJuIC0xOwp9CgojaWZkZWYgTkVUU05NUF9XSVRIX09QQVFVRV9TUEVDSUFMX1RZUEVTCmludApzbnByaW50X2Zsb2F0KGNoYXIgKmJ1Ziwgc2l6ZV90IGJ1Zl9sZW4sCiAgICAgICAgICAgICAgY29uc3QgbmV0c25tcF92YXJpYWJsZV9saXN0ICogdmFyLCBjb25zdCBzdHJ1Y3QgZW51bV9saXN0ICplbnVtcywKICAgICAgICAgICAgICBjb25zdCBjaGFyICpoaW50LCBjb25zdCBjaGFyICp1bml0cykKewogICAgc2l6ZV90ICAgICAgICAgIG91dF9sZW4gPSAwOwogICAgaWYgKHNwcmludF9yZWFsbG9jX2Zsb2F0KCh1X2NoYXIgKiopICYgYnVmLCAmYnVmX2xlbiwgJm91dF9sZW4sIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyLCBlbnVtcywgaGludCwgdW5pdHMpKQogICAgICAgIHJldHVybiAoaW50KSBvdXRfbGVuOwogICAgZWxzZQogICAgICAgIHJldHVybiAtMTsKfQoKaW50CnNucHJpbnRfZG91YmxlKGNoYXIgKmJ1Ziwgc2l6ZV90IGJ1Zl9sZW4sCiAgICAgICAgICAgICAgIGNvbnN0IG5ldHNubXBfdmFyaWFibGVfbGlzdCAqIHZhciwgY29uc3Qgc3RydWN0IGVudW1fbGlzdCAqZW51bXMsCiAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmhpbnQsIGNvbnN0IGNoYXIgKnVuaXRzKQp7CiAgICBzaXplX3QgICAgICAgICAgb3V0X2xlbiA9IDA7CiAgICBpZiAoc3ByaW50X3JlYWxsb2NfZG91YmxlKCh1X2NoYXIgKiopICYgYnVmLCAmYnVmX2xlbiwgJm91dF9sZW4sIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciwgZW51bXMsIGhpbnQsIHVuaXRzKSkKICAgICAgICByZXR1cm4gKGludCkgb3V0X2xlbjsKICAgIGVsc2UKICAgICAgICByZXR1cm4gLTE7Cn0KI2VuZGlmCi8qKiBAfSAqLwoK