ZGlmZiAtLWdpdCBhL3NyYy90ZXJtLmMgYi9zcmMvdGVybS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1NmE0MGUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVybS5jCkBAIC0wLDAgKzEsNTM4MSBAQAorLyogdmk6c2V0IHRzPTggc3RzPTQgc3c9NDoKKyAqCisgKiBWSU0gLSBWaSBJTXByb3ZlZAlieSBCcmFtIE1vb2xlbmFhcgorICoKKyAqIERvICI6aGVscCB1Z2FuZGEiICBpbiBWaW0gdG8gcmVhZCBjb3B5aW5nIGFuZCB1c2FnZSBjb25kaXRpb25zLgorICogRG8gIjpoZWxwIGNyZWRpdHMiIGluIFZpbSB0byBzZWUgYSBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQuCisgKiBTZWUgUkVBRE1FLnR4dCBmb3IgYW4gb3ZlcnZpZXcgb2YgdGhlIFZpbSBzb3VyY2UgY29kZS4KKyAqLworLyoKKyAqCisgKiB0ZXJtLmM6IGZ1bmN0aW9ucyBmb3IgY29udHJvbGxpbmcgdGhlIHRlcm1pbmFsCisgKgorICogcHJpbWl0aXZlIHRlcm1jYXAgc3VwcG9ydCBmb3IgQW1pZ2EsIE1TRE9TLCBhbmQgV2luMzIgaW5jbHVkZWQKKyAqCisgKiBOT1RFOiBwYWRkaW5nIGFuZCB2YXJpYWJsZSBzdWJzdGl0dXRpb24gaXMgbm90IHBlcmZvcm1lZCwKKyAqIHdoZW4gY29tcGlsaW5nIHdpdGhvdXQgSEFWRV9UR0VURU5ULCB3ZSB1c2UgdHB1dHMoKSBhbmQgdGdvdG8oKSBkdW1taWVzLgorICovCisKKy8qCisgKiBTb21lIHN5c3RlbXMgaGF2ZSBhIHByb3RvdHlwZSBmb3IgdGdldHN0cigpIHdpdGggKGNoYXIgKikgaW5zdGVhZCBvZgorICogKGNoYXIgKiopLiBUaGlzIGRlZmluZSByZW1vdmVzIHRoYXQgcHJvdG90eXBlLiBXZSBpbmNsdWRlIG91ciBvd24gcHJvdG90eXBlCisgKiBiZWxvdy4KKyAqLworCisjZGVmaW5lIHRnZXRzdHIgdGdldHN0cl9kZWZpbmVkX3dyb25nCisjaW5jbHVkZSAidmltLmgiCisKKyNpZmRlZiBIQVZFX1RHRVRFTlQKKyMgaWZkZWYgSEFWRV9URVJNSU9TX0gKKyMgIGluY2x1ZGUgPHRlcm1pb3MuaD4JICAgIC8qIHNlZW1zIHRvIGJlIHJlcXVpcmVkIGZvciBzb21lIExpbnV4ICovCisjIGVuZGlmCisjIGlmZGVmIEhBVkVfVEVSTUNBUF9ICisjICBpbmNsdWRlIDx0ZXJtY2FwLmg+CisjIGVuZGlmCisKKy8qCisgKiBBIGZldyBsaW51eCBzeXN0ZW1zIGRlZmluZSBvdXRmdW50eXBlIGluIHRlcm1jYXAuaCB0byBiZSB1c2VkIGFzIHRoZSB0aGlyZAorICogYXJndW1lbnQgZm9yIHRwdXRzKCkuCisgKi8KKyMgaWZkZWYgVk1TCisjICBkZWZpbmUgVFBVVFNGVU5DQVNUCisjIGVsc2UKKyMgIGlmZGVmIEhBVkVfT1VURlVOVFlQRQorIyAgIGRlZmluZSBUUFVUU0ZVTkNBU1QgKG91dGZ1bnR5cGUpCisjICBlbHNlCisjICAgZGVmaW5lIFRQVVRTRlVOQ0FTVCAoaW50ICgqKSgpKQorIyAgZW5kaWYKKyMgZW5kaWYKKyNlbmRpZgorCisjdW5kZWYgdGdldHN0cgorCisvKgorICogSGVyZSBhcmUgdGhlIGJ1aWx0aW4gdGVybWNhcCBlbnRyaWVzLiAgVGhleSBhcmUgbm90IHN0b3JlZCBhcyBjb21wbGV0ZQorICogVGNhcnIgc3RydWN0dXJlcywgYXMgc3VjaCBhIHN0cnVjdHVyZSBpcyB0b28gYmlnLgorICoKKyAqIFRoZSBlbnRyaWVzIGFyZSBjb21wYWN0LCB0aGVyZWZvcmUgdGhleSBub3JtYWxseSBhcmUgaW5jbHVkZWQgZXZlbiB3aGVuCisgKiBIQVZFX1RHRVRFTlQgaXMgZGVmaW5lZC4gV2hlbiBIQVZFX1RHRVRFTlQgaXMgZGVmaW5lZCwgdGhlIGJ1aWx0aW4gZW50cmllcworICogY2FuIGJlIGFjY2Vzc2VkIHdpdGggImJ1aWx0aW5fYW1pZ2EiLCAiYnVpbHRpbl9hbnNpIiwgImJ1aWx0aW5fZGVidWciLCBldGMuCisgKgorICogRWFjaCB0ZXJtY2FwIGlzIGEgbGlzdCBvZiBidWlsdGluX3Rlcm0gc3RydWN0dXJlcy4gSXQgYWx3YXlzIHN0YXJ0cyB3aXRoCisgKiBLU19OQU1FLCB3aGljaCBzZXBhcmF0ZXMgdGhlIGVudHJpZXMuICBTZWUgcGFyc2VfYnVpbHRpbl90Y2FwKCkgZm9yIGFsbAorICogZGV0YWlscy4KKyAqIGJ0X2VudHJ5IGlzIGVpdGhlciBhIEtTX3h4eCBjb2RlICg+PSAwKSwgb3IgYSBLX3h4eCBjb2RlLgorICoKKyAqIEVudHJpZXMgbWFya2VkIHdpdGggImd1ZXNzZWQiIG1heSBiZSB3cm9uZy4KKyAqLworc3RydWN0IGJ1aWx0aW5fdGVybQoreworICAgIGludAkJYnRfZW50cnk7CisgICAgY2hhcgkqYnRfc3RyaW5nOworfTsKKworLyogc3RhcnQgb2Yga2V5cyB0aGF0IGFyZSBub3QgZGlyZWN0bHkgdXNlZCBieSBWaW0gYnV0IGNhbiBiZSBtYXBwZWQgKi8KKyNkZWZpbmUgQlRfRVhUUkFfS0VZUwkweDEwMQorCitzdGF0aWMgc3RydWN0IGJ1aWx0aW5fdGVybSAqZmluZF9idWlsdGluX3Rlcm0gX19BUkdTKChjaGFyX3UgKm5hbWUpKTsKK3N0YXRpYyB2b2lkIHBhcnNlX2J1aWx0aW5fdGNhcCBfX0FSR1MoKGNoYXJfdSAqcykpOworc3RhdGljIHZvaWQgdGVybV9jb2xvciBfX0FSR1MoKGNoYXJfdSAqcywgaW50IG4pKTsKK3N0YXRpYyB2b2lkIGdhdGhlcl90ZXJtbGVhZGVyIF9fQVJHUygodm9pZCkpOworI2lmZGVmIEZFQVRfVEVSTVJFU1BPTlNFCitzdGF0aWMgdm9pZCByZXFfY29kZXNfZnJvbV90ZXJtIF9fQVJHUygodm9pZCkpOworc3RhdGljIHZvaWQgcmVxX21vcmVfY29kZXNfZnJvbV90ZXJtIF9fQVJHUygodm9pZCkpOworc3RhdGljIHZvaWQgZ290X2NvZGVfZnJvbV90ZXJtIF9fQVJHUygoY2hhcl91ICpjb2RlLCBpbnQgbGVuKSk7CitzdGF0aWMgdm9pZCBjaGVja19mb3JfY29kZXNfZnJvbV90ZXJtIF9fQVJHUygodm9pZCkpOworI2VuZGlmCisjaWYgZGVmaW5lZChGRUFUX0dVSSkgXAorICAgIHx8IChkZWZpbmVkKEZFQVRfTU9VU0UpICYmICghZGVmaW5lZChVTklYKSB8fCBkZWZpbmVkKEZFQVRfTU9VU0VfWFRFUk0pKSkKK3N0YXRpYyBpbnQgZ2V0X2J5dGVzX2Zyb21fYnVmIF9fQVJHUygoY2hhcl91ICosIGNoYXJfdSAqLCBpbnQpKTsKKyNlbmRpZgorI2lmZGVmIEZFQVRfVEVSTVJFU1BPTlNFCitzdGF0aWMgdm9pZCBtYXlfcmVxX3Rlcm1yZXNwb25zZSBfX0FSR1MoKHZvaWQpKTsKKyNlbmRpZgorc3RhdGljIHZvaWQgZGVsX3Rlcm1jb2RlX2lkeCBfX0FSR1MoKGludCBpZHgpKTsKK3N0YXRpYyBpbnQgdGVybV9pc19idWlsdGluIF9fQVJHUygoY2hhcl91ICpuYW1lKSk7CitzdGF0aWMgaW50IHRlcm1fN3RvOGJpdCBfX0FSR1MoKGNoYXJfdSAqcCkpOworI2lmZGVmIEZFQVRfVEVSTVJFU1BPTlNFCitzdGF0aWMgdm9pZCBzd2l0Y2hfdG9fOGJpdCBfX0FSR1MoKHZvaWQpKTsKKyNlbmRpZgorCisjaWZkZWYgSEFWRV9UR0VURU5UCitzdGF0aWMgY2hhcl91ICp0Z2V0ZW50X2Vycm9yIF9fQVJHUygoY2hhcl91ICosIGNoYXJfdSAqKSk7CisKKy8qCisgKiBIZXJlIGlzIG91ciBvd24gcHJvdG90eXBlIGZvciB0Z2V0c3RyKCksIGFueSBwcm90b3R5cGVzIGZyb20gdGhlIGluY2x1ZGUKKyAqIGZpbGVzIGhhdmUgYmVlbiBkaXNhYmxlZCBieSB0aGUgZGVmaW5lIGF0IHRoZSBzdGFydCBvZiB0aGlzIGZpbGUuCisgKi8KK2NoYXIJCSp0Z2V0c3RyIF9fQVJHUygoY2hhciAqLCBjaGFyICoqKSk7CisKKyMgaWZkZWYgRkVBVF9URVJNUkVTUE9OU0UKKy8qIFJlcXVlc3QgVGVybWluYWwgVmVyc2lvbiBzdGF0dXM6ICovCisjICBkZWZpbmUgQ1JWX0dFVAkxCS8qIHNlbmQgVF9DUlYgd2hlbiBzd2l0Y2hlZCB0byBSQVcgbW9kZSAqLworIyAgZGVmaW5lIENSVl9TRU5UCTIJLyogZGlkIHNlbmQgVF9DUlYsIHdhaXRpbmcgZm9yIGFuc3dlciAqLworIyAgZGVmaW5lIENSVl9HT1QJMwkvKiByZWNlaXZlZCBUX0NSViByZXNwb25zZSAqLworc3RhdGljIGludCBjcnZfc3RhdHVzID0gQ1JWX0dFVDsKKyMgZW5kaWYKKworLyoKKyAqIERvbid0IGRlY2xhcmUgdGhlc2UgdmFyaWFibGVzIGlmIHRlcm1jYXAuaCBjb250YWlucyB0aGVtLgorICogQXV0b2NvbmYgY2hlY2tzIGlmIHRoZXNlIHZhcmlhYmxlcyBzaG91bGQgYmUgZGVjbGFyZWQgZXh0ZXJuIChub3QgYWxsCisgKiBzeXN0ZW1zIGhhdmUgdGhlbSkuCisgKiBTb21lIHZlcnNpb25zIGRlZmluZSBvc3BlZWQgdG8gYmUgc3BlZWRfdCwgYnV0IHRoYXQgaXMgaW5jb21wYXRpYmxlIHdpdGgKKyAqIEJTRCwgd2hlcmUgb3NwZWVkIGlzIHNob3J0IGFuZCBzcGVlZF90IGlzIGxvbmcuCisgKi8KKyMgaWZuZGVmIEhBVkVfT1NQRUVECisjICBpZmRlZiBPU1BFRURfRVhURVJOCitleHRlcm4gc2hvcnQgb3NwZWVkOworIyAgIGVsc2UKK3Nob3J0IG9zcGVlZDsKKyMgICBlbmRpZgorIyBlbmRpZgorIyBpZm5kZWYgSEFWRV9VUF9CQ19QQworIyAgaWZkZWYgVVBfQkNfUENfRVhURVJOCitleHRlcm4gY2hhciAqVVAsICpCQywgUEM7CisjICBlbHNlCitjaGFyICpVUCwgKkJDLCBQQzsKKyMgIGVuZGlmCisjIGVuZGlmCisKKyMgZGVmaW5lIFRHRVRTVFIocywgcCkJdmltX3RnZXRzdHIoKHMpLCAocCkpCisjIGRlZmluZSBUR0VURU5UKGIsIHQpCXRnZXRlbnQoKGNoYXIgKikoYiksIChjaGFyICopKHQpKQorc3RhdGljIGNoYXJfdSAqdmltX3RnZXRzdHIgX19BUkdTKChjaGFyICpzLCBjaGFyX3UgKipwcCkpOworI2VuZGlmIC8qIEhBVkVfVEdFVEVOVCAqLworCitzdGF0aWMgaW50ICBkZXRlY3RlZF84Yml0ID0gRkFMU0U7CS8qIGRldGVjdGVkIDgtYml0IHRlcm1pbmFsICovCisKK3N0cnVjdCBidWlsdGluX3Rlcm0gYnVpbHRpbl90ZXJtY2Fwc1tdID0KK3sKKworI2lmIGRlZmluZWQoRkVBVF9HVUkpCisvKgorICogR1VJIHBzZXVkbyB0ZXJtLWNhcC4KKyAqLworICAgIHsoaW50KUtTX05BTUUsCSJndWkifSwKKyAgICB7KGludClLU19DRSwJSUZfRUIoIlwwMzN8JCIsIEVTQ19TVFIgInwkIil9LAorICAgIHsoaW50KUtTX0FMLAlJRl9FQigiXDAzM3xpIiwgRVNDX1NUUiAifGkiKX0sCisjIGlmZGVmIFRFUk1JTkZPCisgICAgeyhpbnQpS1NfQ0FMLAlJRl9FQigiXDAzM3wlcDElZEkiLCBFU0NfU1RSICJ8JXAxJWRJIil9LAorIyBlbHNlCisgICAgeyhpbnQpS1NfQ0FMLAlJRl9FQigiXDAzM3wlZEkiLCBFU0NfU1RSICJ8JWRJIil9LAorIyBlbmRpZgorICAgIHsoaW50KUtTX0RMLAlJRl9FQigiXDAzM3xkIiwgRVNDX1NUUiAifGQiKX0sCisjIGlmZGVmIFRFUk1JTkZPCisgICAgeyhpbnQpS1NfQ0RMLAlJRl9FQigiXDAzM3wlcDElZEQiLCBFU0NfU1RSICJ8JXAxJWREIil9LAorICAgIHsoaW50KUtTX0NTLAlJRl9FQigiXDAzM3wlcDElZDslcDIlZFIiLCBFU0NfU1RSICJ8JXAxJWQ7JXAyJWRSIil9LAorIyAgaWZkZWYgRkVBVF9WRVJUU1BMSVQKKyAgICB7KGludClLU19DU1YsCUlGX0VCKCJcMDMzfCVwMSVkOyVwMiVkViIsIEVTQ19TVFIgInwlcDElZDslcDIlZFYiKX0sCisjICBlbmRpZgorIyBlbHNlCisgICAgeyhpbnQpS1NfQ0RMLAlJRl9FQigiXDAzM3wlZEQiLCBFU0NfU1RSICJ8JWREIil9LAorICAgIHsoaW50KUtTX0NTLAlJRl9FQigiXDAzM3wlZDslZFIiLCBFU0NfU1RSICJ8JWQ7JWRSIil9LAorIyAgaWZkZWYgRkVBVF9WRVJUU1BMSVQKKyAgICB7KGludClLU19DU1YsCUlGX0VCKCJcMDMzfCVkOyVkViIsIEVTQ19TVFIgInwlZDslZFYiKX0sCisjICBlbmRpZgorIyBlbmRpZgorICAgIHsoaW50KUtTX0NMLAlJRl9FQigiXDAzM3xDIiwgRVNDX1NUUiAifEMiKX0sCisJCQkvKiBhdHRyaWJ1dGVzIHN3aXRjaGVkIG9uIHdpdGggJ2gnLCBvZmYgd2l0aCAqICdIJyAqLworICAgIHsoaW50KUtTX01FLAlJRl9FQigiXDAzM3wzMUgiLCBFU0NfU1RSICJ8MzFIIil9LCAvKiBITF9BTEwgKi8KKyAgICB7KGludClLU19NUiwJSUZfRUIoIlwwMzN8MWgiLCBFU0NfU1RSICJ8MWgiKX0sICAgLyogSExfSU5WRVJTRSAqLworICAgIHsoaW50KUtTX01ELAlJRl9FQigiXDAzM3wyaCIsIEVTQ19TVFIgInwyaCIpfSwgICAvKiBITF9CT0xEICovCisgICAgeyhpbnQpS1NfU0UsCUlGX0VCKCJcMDMzfDE2SCIsIEVTQ19TVFIgInwxNkgiKX0sIC8qIEhMX1NUQU5ET1VUICovCisgICAgeyhpbnQpS1NfU08sCUlGX0VCKCJcMDMzfDE2aCIsIEVTQ19TVFIgInwxNmgiKX0sIC8qIEhMX1NUQU5ET1VUICovCisgICAgeyhpbnQpS1NfVUUsCUlGX0VCKCJcMDMzfDhIIiwgRVNDX1NUUiAifDhIIil9LCAgIC8qIEhMX1VOREVSTElORSAqLworICAgIHsoaW50KUtTX1VTLAlJRl9FQigiXDAzM3w4aCIsIEVTQ19TVFIgInw4aCIpfSwgICAvKiBITF9VTkRFUkxJTkUgKi8KKyAgICB7KGludClLU19DWlIsCUlGX0VCKCJcMDMzfDRIIiwgRVNDX1NUUiAifDRIIil9LCAgIC8qIEhMX0lUQUxJQyAqLworICAgIHsoaW50KUtTX0NaSCwJSUZfRUIoIlwwMzN8NGgiLCBFU0NfU1RSICJ8NGgiKX0sICAgLyogSExfSVRBTElDICovCisgICAgeyhpbnQpS1NfVkIsCUlGX0VCKCJcMDMzfGYiLCBFU0NfU1RSICJ8ZiIpfSwKKyAgICB7KGludClLU19NUywJInkifSwKKyAgICB7KGludClLU19VVCwJInkifSwKKyAgICB7KGludClLU19MRSwJIlxiIn0sCQkvKiBjdXJzb3ItbGVmdCA9IEJTICovCisgICAgeyhpbnQpS1NfTkQsCSJcMDE0In0sCS8qIGN1cnNvci1yaWdodCA9IENUUkwtTCAqLworIyBpZmRlZiBURVJNSU5GTworICAgIHsoaW50KUtTX0NNLAlJRl9FQigiXDAzM3wlcDElZDslcDIlZE0iLCBFU0NfU1RSICJ8JXAxJWQ7JXAyJWRNIil9LAorIyBlbHNlCisgICAgeyhpbnQpS1NfQ00sCUlGX0VCKCJcMDMzfCVkOyVkTSIsIEVTQ19TVFIgInwlZDslZE0iKX0sCisjIGVuZGlmCisJLyogdGhlcmUgYXJlIG5vIGtleSBzZXF1ZW5jZXMgaGVyZSwgdGhlIEdVSSBzZXF1ZW5jZXMgYXJlIHJlY29nbml6ZWQKKwkgKiBpbiBjaGVja190ZXJtY29kZXMoKSAqLworI2VuZGlmCisKKyNpZm5kZWYgTk9fQlVJTFRJTl9UQ0FQUworIyBpZiBkZWZpbmVkKFJJU0NPUykgfHwgZGVmaW5lZChBTExfQlVJTFRJTl9UQ0FQUykKKy8qCisgKiBEZWZhdWx0IGZvciB0aGUgQWNvcm4uCisgKi8KKyAgICB7KGludClLU19OQU1FLAkicmlzY29zIn0sCisgICAgeyhpbnQpS1NfQ0wsCSJcMDE0In0sCQkvKiBDbHMgYW5kIEhvbWUgQ3Vyc29yICovCisgICAgeyhpbnQpS1NfQ00sCSJcMDAxJWRcMDAxJWRcMDAyIn0sCS8qIFBvc2l0aW9uIGN1cnNvciAqLworCisgICAgeyhpbnQpS1NfQ0NPLAkiMTYifSwJCQkvKiBBbGxvdyAxNiBjb2xvcnMgKi8KKworICAgIHsoaW50KUtTX0NBRiwJIlwwMDElZFwwMjEifSwJCS8qIFNldCBmb3JlZ3JvdW5kIGNvbG91ciAqLworICAgIHsoaW50KUtTX0NBQiwJIlwwMDElZFwwMjIifSwJCS8qIFNldCBiYWNrZ3JvdW5kIGNvbG91ciAqLworCisKKyAgICB7KGludClLU19NRSwJIlwwMDQifSwJCS8qIE5vcm1hbCBtb2RlICovCisgICAgeyhpbnQpS1NfTVIsCSJcMDA1In0sCQkvKiBSZXZlcnNlICovCisKKyAgICB7KGludClLU19WSSwJIlwwMTYifSwJCS8qIEN1cnNvciBpbnZpc2libGUgKi8KKyAgICB7KGludClLU19WRSwJIlwwMTcifSwJCS8qIEN1cnNvciB2aXNpYmxlICovCisgICAgeyhpbnQpS1NfVlMsCSJcMDIwIn0sCQkvKiBDdXJzb3IgdmVyeSB2aXNpYmxlICovCisKKyAgICB7KGludClLU19DUywJIlwwMDElZFwwMDElZFwwMDMifSwJLyogU2V0IHNjcm9sbCByZWdpb24gKi8KKyAgICB7KGludClLU19TUiwJIlwwMjMifSwJCS8qIFNjcm9sbCB0ZXh0IGRvd24gKi8KKyAgICB7S19VUCwJCSJcMjE3In0sCisgICAge0tfRE9XTiwJCSJcMjE2In0sCisgICAge0tfTEVGVCwJCSJcMjE0In0sCisgICAge0tfUklHSFQsCQkiXDIxNSJ9LAorICAgIHtLX1NfVVAsCQkiXDIzNyJ9LAorICAgIHtLX1NfRE9XTiwJCSJcMjM2In0sCisgICAge0tfU19MRUZULAkJIlwyMzQifSwKKyAgICB7S19TX1JJR0hULAkJIlwyMzUifSwKKworICAgIHtLX0YxLAkJIlwyMDEifSwKKyAgICB7S19GMiwJCSJcMjAyIn0sCisgICAge0tfRjMsCQkiXDIwMyJ9LAorICAgIHtLX0Y0LAkJIlwyMDQifSwKKyAgICB7S19GNSwJCSJcMjA1In0sCisgICAge0tfRjYsCQkiXDIwNiJ9LAorICAgIHtLX0Y3LAkJIlwyMDcifSwKKyAgICB7S19GOCwJCSJcMjEwIn0sCisgICAge0tfRjksCQkiXDIxMSJ9LAorICAgIHtLX0YxMCwJCSJcMzEyIn0sCisgICAge0tfRjExLAkJIlwzMTMifSwKKyAgICB7S19GMTIsCQkiXDMxNCJ9LAorICAgIHtLX1NfRjEsCQkiXDIyMSJ9LAorICAgIHtLX1NfRjIsCQkiXDIyMiJ9LAorICAgIHtLX1NfRjMsCQkiXDIyMyJ9LAorICAgIHtLX1NfRjQsCQkiXDIyNCJ9LAorICAgIHtLX1NfRjUsCQkiXDIyNSJ9LAorICAgIHtLX1NfRjYsCQkiXDIyNiJ9LAorICAgIHtLX1NfRjcsCQkiXDIyNyJ9LAorICAgIHtLX1NfRjgsCQkiXDIzMCJ9LAorICAgIHtLX1NfRjksCQkiXDIzMSJ9LAorICAgIHtLX1NfRjEwLAkJIlwzMzIifSwKKyAgICB7S19TX0YxMSwJCSJcMzMzIn0sCisgICAge0tfU19GMTIsCQkiXDMzNCJ9LAorICAgIHtLX0JTLAkJIlwwMTAifSwKKyAgICB7S19JTlMsCQkiXDMxNSJ9LAorICAgIHtLX0RFTCwJCSJcMTc3In0sCisgICAge0tfSE9NRSwJCSJcMDM2In0sCisgICAge0tfRU5ELAkJIlwyMTMifSwKKyAgICB7S19QQUdFVVAsCQkiXDIzNyJ9LAorICAgIHtLX1BBR0VET1dOLAkiXDIzNiJ9LAorIyBlbmRpZgkvKiBBY29ybiB0ZXJtaW5hbCAqLworCisKKyMgaWYgZGVmaW5lZChBTUlHQSkgfHwgZGVmaW5lZChBTExfQlVJTFRJTl9UQ0FQUykKKy8qCisgKiBBbWlnYSBjb25zb2xlIHdpbmRvdywgZGVmYXVsdCBmb3IgQW1pZ2EKKyAqLworICAgIHsoaW50KUtTX05BTUUsCSJhbWlnYSJ9LAorICAgIHsoaW50KUtTX0NFLAkiXDAzM1tLIn0sCisgICAgeyhpbnQpS1NfQ0QsCSJcMDMzW0oifSwKKyAgICB7KGludClLU19BTCwJIlwwMzNbTCJ9LAorIyAgaWZkZWYgVEVSTUlORk8KKyAgICB7KGludClLU19DQUwsCSJcMDMzWyVwMSVkTCJ9LAorIyAgZWxzZQorICAgIHsoaW50KUtTX0NBTCwJIlwwMzNbJWRMIn0sCisjICBlbmRpZgorICAgIHsoaW50KUtTX0RMLAkiXDAzM1tNIn0sCisjICBpZmRlZiBURVJNSU5GTworICAgIHsoaW50KUtTX0NETCwJIlwwMzNbJXAxJWRNIn0sCisjICBlbHNlCisgICAgeyhpbnQpS1NfQ0RMLAkiXDAzM1slZE0ifSwKKyMgIGVuZGlmCisgICAgeyhpbnQpS1NfQ0wsCSJcMDE0In0sCisgICAgeyhpbnQpS1NfVkksCSJcMDMzWzAgcCJ9LAorICAgIHsoaW50KUtTX1ZFLAkiXDAzM1sxIHAifSwKKyAgICB7KGludClLU19NRSwJIlwwMzNbMG0ifSwKKyAgICB7KGludClLU19NUiwJIlwwMzNbN20ifSwKKyAgICB7KGludClLU19NRCwJIlwwMzNbMW0ifSwKKyAgICB7KGludClLU19TRSwJIlwwMzNbMG0ifSwKKyAgICB7KGludClLU19TTywJIlwwMzNbMzNtIn0sCisgICAgeyhpbnQpS1NfVVMsCSJcMDMzWzRtIn0sCisgICAgeyhpbnQpS1NfVUUsCSJcMDMzWzBtIn0sCisgICAgeyhpbnQpS1NfQ1pILAkiXDAzM1szbSJ9LAorICAgIHsoaW50KUtTX0NaUiwJIlwwMzNbMG0ifSwKKyNpZiBkZWZpbmVkKF9fTU9SUEhPU19fKSB8fCBkZWZpbmVkKF9fQVJPU19fKQorICAgIHsoaW50KUtTX0NDTywJIjgifSwJCS8qIGFsbG93IDggY29sb3JzICovCisjICBpZmRlZiBURVJNSU5GTworICAgIHsoaW50KUtTX0NBQiwJIlwwMzNbNCVwMSVkbSJ9LC8qIHNldCBiYWNrZ3JvdW5kIGNvbG9yICovCisgICAgeyhpbnQpS1NfQ0FGLAkiXDAzM1szJXAxJWRtIn0sLyogc2V0IGZvcmVncm91bmQgY29sb3IgKi8KKyMgIGVsc2UKKyAgICB7KGludClLU19DQUIsCSJcMDMzWzQlZG0ifSwJLyogc2V0IGJhY2tncm91bmQgY29sb3IgKi8KKyAgICB7KGludClLU19DQUYsCSJcMDMzWzMlZG0ifSwJLyogc2V0IGZvcmVncm91bmQgY29sb3IgKi8KKyMgIGVuZGlmCisgICAgeyhpbnQpS1NfT1AsCSJcMDMzW20ifSwJLyogcmVzZXQgY29sb3JzICovCisjZW5kaWYKKyAgICB7KGludClLU19NUywJInkifSwKKyAgICB7KGludClLU19VVCwJInkifSwJCS8qIGd1ZXNzZWQgKi8KKyAgICB7KGludClLU19MRSwJIlxiIn0sCisjICBpZmRlZiBURVJNSU5GTworICAgIHsoaW50KUtTX0NNLAkiXDAzM1slaSVwMSVkOyVwMiVkSCJ9LAorIyAgZWxzZQorICAgIHsoaW50KUtTX0NNLAkiXDAzM1slaSVkOyVkSCJ9LAorIyAgZW5kaWYKKyNpZiBkZWZpbmVkKF9fTU9SUEhPU19fKQorICAgIHsoaW50KUtTX1NSLAkiXDAzM00ifSwKKyNlbmRpZgorIyAgaWZkZWYgVEVSTUlORk8KKyAgICB7KGludClLU19DUkksCSJcMDMzWyVwMSVkQyJ9LAorIyAgZWxzZQorICAgIHsoaW50KUtTX0NSSSwJIlwwMzNbJWRDIn0sCisjICBlbmRpZgorICAgIHtLX1VQLAkJIlwyMzNBIn0sCisgICAge0tfRE9XTiwJCSJcMjMzQiJ9LAorICAgIHtLX0xFRlQsCQkiXDIzM0QifSwKKyAgICB7S19SSUdIVCwJCSJcMjMzQyJ9LAorICAgIHtLX1NfVVAsCQkiXDIzM1QifSwKKyAgICB7S19TX0RPV04sCQkiXDIzM1MifSwKKyAgICB7S19TX0xFRlQsCQkiXDIzMyBBIn0sCisgICAge0tfU19SSUdIVCwJCSJcMjMzIEAifSwKKyAgICB7S19TX1RBQiwJCSJcMjMzWiJ9LAorICAgIHtLX0YxLAkJIlwyMzNcMDYwfiJ9LC8qIHNvbWUgY29tcGlsZXJzIGRvbid0IGRpZyAiXDIzMzAiICovCisgICAge0tfRjIsCQkiXDIzM1wwNjF+In0sCisgICAge0tfRjMsCQkiXDIzM1wwNjJ+In0sCisgICAge0tfRjQsCQkiXDIzM1wwNjN+In0sCisgICAge0tfRjUsCQkiXDIzM1wwNjR+In0sCisgICAge0tfRjYsCQkiXDIzM1wwNjV+In0sCisgICAge0tfRjcsCQkiXDIzM1wwNjZ+In0sCisgICAge0tfRjgsCQkiXDIzM1wwNjd+In0sCisgICAge0tfRjksCQkiXDIzM1wwNzB+In0sCisgICAge0tfRjEwLAkJIlwyMzNcMDcxfiJ9LAorICAgIHtLX1NfRjEsCQkiXDIzM1wwNjFcMDYwfiJ9LAorICAgIHtLX1NfRjIsCQkiXDIzM1wwNjFcMDYxfiJ9LAorICAgIHtLX1NfRjMsCQkiXDIzM1wwNjFcMDYyfiJ9LAorICAgIHtLX1NfRjQsCQkiXDIzM1wwNjFcMDYzfiJ9LAorICAgIHtLX1NfRjUsCQkiXDIzM1wwNjFcMDY0fiJ9LAorICAgIHtLX1NfRjYsCQkiXDIzM1wwNjFcMDY1fiJ9LAorICAgIHtLX1NfRjcsCQkiXDIzM1wwNjFcMDY2fiJ9LAorICAgIHtLX1NfRjgsCQkiXDIzM1wwNjFcMDY3fiJ9LAorICAgIHtLX1NfRjksCQkiXDIzM1wwNjFcMDcwfiJ9LAorICAgIHtLX1NfRjEwLAkJIlwyMzNcMDYxXDA3MX4ifSwKKyAgICB7S19IRUxQLAkJIlwyMzM/fiJ9LAorICAgIHtLX0lOUywJCSJcMjMzXDA2NFwwNjB+In0sCS8qIDEwMSBrZXkga2V5Ym9hcmQgKi8KKyAgICB7S19QQUdFVVAsCQkiXDIzM1wwNjRcMDYxfiJ9LAkvKiAxMDEga2V5IGtleWJvYXJkICovCisgICAge0tfUEFHRURPV04sCSJcMjMzXDA2NFwwNjJ+In0sCS8qIDEwMSBrZXkga2V5Ym9hcmQgKi8KKyAgICB7S19IT01FLAkJIlwyMzNcMDY0XDA2NH4ifSwJLyogMTAxIGtleSBrZXlib2FyZCAqLworICAgIHtLX0VORCwJCSJcMjMzXDA2NFwwNjV+In0sCS8qIDEwMSBrZXkga2V5Ym9hcmQgKi8KKworICAgIHtCVF9FWFRSQV9LRVlTLAkiIn0sCisgICAge1RFUk1DQVAyS0VZKCcjJywgJzInKSwgIlwyMzNcMDY1XDA2NH4ifSwJLyogc2hpZnRlZCBob21lIGtleSAqLworICAgIHtURVJNQ0FQMktFWSgnIycsICczJyksICJcMjMzXDA2NVwwNjB+In0sCS8qIHNoaWZ0ZWQgaW5zZXJ0IGtleSAqLworICAgIHtURVJNQ0FQMktFWSgnKicsICc3JyksICJcMjMzXDA2NVwwNjV+In0sCS8qIHNoaWZ0ZWQgZW5kIGtleSAqLworIyBlbmRpZgorCisjIGlmIGRlZmluZWQoX19CRU9TX18pIHx8IGRlZmluZWQoQUxMX0JVSUxUSU5fVENBUFMpCisvKgorICogYWxtb3N0IHN0YW5kYXJkIEFOU0kgdGVybWluYWwsIGRlZmF1bHQgZm9yIGJlYm94CisgKi8KKyAgICB7KGludClLU19OQU1FLAkiYmVvcy1hbnNpIn0sCisgICAgeyhpbnQpS1NfQ0UsCSJcMDMzW0sifSwKKyAgICB7KGludClLU19DRCwJIlwwMzNbSiJ9LAorICAgIHsoaW50KUtTX0FMLAkiXDAzM1tMIn0sCisjICBpZmRlZiBURVJNSU5GTworICAgIHsoaW50KUtTX0NBTCwJIlwwMzNbJXAxJWRMIn0sCisjICBlbHNlCisgICAgeyhpbnQpS1NfQ0FMLAkiXDAzM1slZEwifSwKKyMgIGVuZGlmCisgICAgeyhpbnQpS1NfREwsCSJcMDMzW00ifSwKKyMgIGlmZGVmIFRFUk1JTkZPCisgICAgeyhpbnQpS1NfQ0RMLAkiXDAzM1slcDElZE0ifSwKKyMgIGVsc2UKKyAgICB7KGludClLU19DREwsCSJcMDMzWyVkTSJ9LAorIyAgZW5kaWYKKyNpZmRlZiBCRU9TX1BSX09SX0JFVFRFUgorIyAgaWZkZWYgVEVSTUlORk8KKyAgICB7KGludClLU19DUywJIlwwMzNbJWklcDElZDslcDIlZHIifSwKKyMgIGVsc2UKKyAgICB7KGludClLU19DUywJIlwwMzNbJWklZDslZHIifSwJLyogc2Nyb2xsIHJlZ2lvbiAqLworIyAgZW5kaWYKKyNlbmRpZgorICAgIHsoaW50KUtTX0NMLAkiXDAzM1tIXDAzM1sySiJ9LAorI2lmZGVmIG5vdHlldAorICAgIHsoaW50KUtTX1ZJLAkiW1ZJXSJ9LCAvKiBjdXJzb3IgaW52aXNpYmxlLCBWVDMyMDogQ1NJID8gMjUgbCAqLworICAgIHsoaW50KUtTX1ZFLAkiW1ZFXSJ9LCAvKiBjdXJzb3IgdmlzaWJsZSwgVlQzMjA6IENTSSA/IDI1IGggKi8KKyNlbmRpZgorICAgIHsoaW50KUtTX01FLAkiXDAzM1ttIn0sCS8qIG5vcm1hbCBtb2RlICovCisgICAgeyhpbnQpS1NfTVIsCSJcMDMzWzdtIn0sCS8qIHJldmVyc2UgKi8KKyAgICB7KGludClLU19NRCwJIlwwMzNbMW0ifSwJLyogYm9sZCAqLworICAgIHsoaW50KUtTX1NPLAkiXDAzM1szMW0ifSwJLyogc3RhbmRvdXQgbW9kZTogcmVkICovCisgICAgeyhpbnQpS1NfU0UsCSJcMDMzW20ifSwJLyogc3RhbmRvdXQgZW5kICovCisgICAgeyhpbnQpS1NfQ1pILAkiXDAzM1szNW0ifSwJLyogaXRhbGljOiBwdXJwbGUgKi8KKyAgICB7KGludClLU19DWlIsCSJcMDMzW20ifSwJLyogaXRhbGljIGVuZCAqLworICAgIHsoaW50KUtTX1VTLAkiXDAzM1s0bSJ9LAkvKiB1bmRlcnNjb3JlIG1vZGUgKi8KKyAgICB7KGludClLU19VRSwJIlwwMzNbbSJ9LAkvKiB1bmRlcnNjb3JlIGVuZCAqLworICAgIHsoaW50KUtTX0NDTywJIjgifSwJCS8qIGFsbG93IDggY29sb3JzICovCisjICBpZmRlZiBURVJNSU5GTworICAgIHsoaW50KUtTX0NBQiwJIlwwMzNbNCVwMSVkbSJ9LC8qIHNldCBiYWNrZ3JvdW5kIGNvbG9yICovCisgICAgeyhpbnQpS1NfQ0FGLAkiXDAzM1szJXAxJWRtIn0sLyogc2V0IGZvcmVncm91bmQgY29sb3IgKi8KKyMgIGVsc2UKKyAgICB7KGludClLU19DQUIsCSJcMDMzWzQlZG0ifSwJLyogc2V0IGJhY2tncm91bmQgY29sb3IgKi8KKyAgICB7KGludClLU19DQUYsCSJcMDMzWzMlZG0ifSwJLyogc2V0IGZvcmVncm91bmQgY29sb3IgKi8KKyMgIGVuZGlmCisgICAgeyhpbnQpS1NfT1AsCSJcMDMzW20ifSwJLyogcmVzZXQgY29sb3JzICovCisgICAgeyhpbnQpS1NfTVMsCSJ5In0sCQkvKiBzYWZlIHRvIG1vdmUgY3VyIGluIHJldmVyc2UgbW9kZSAqLworICAgIHsoaW50KUtTX1VULAkieSJ9LAkJLyogZ3Vlc3NlZCAqLworICAgIHsoaW50KUtTX0xFLAkiXGIifSwKKyMgIGlmZGVmIFRFUk1JTkZPCisgICAgeyhpbnQpS1NfQ00sCSJcMDMzWyVpJXAxJWQ7JXAyJWRIIn0sCisjICBlbHNlCisgICAgeyhpbnQpS1NfQ00sCSJcMDMzWyVpJWQ7JWRIIn0sCisjICBlbmRpZgorICAgIHsoaW50KUtTX1NSLAkiXDAzM00ifSwKKyMgIGlmZGVmIFRFUk1JTkZPCisgICAgeyhpbnQpS1NfQ1JJLAkiXDAzM1slcDElZEMifSwKKyMgIGVsc2UKKyAgICB7KGludClLU19DUkksCSJcMDMzWyVkQyJ9LAorIyAgZW5kaWYKKyNpZiBkZWZpbmVkKEJFT1NfRFI4KQorICAgIHsoaW50KUtTX0RCLAkiIn0sCQkvKiBoYWNrISBzZWUgc2NyZWVuLmMgKi8KKyNlbmRpZgorCisgICAge0tfVVAsCQkiXDAzM1tBIn0sCisgICAge0tfRE9XTiwJCSJcMDMzW0IifSwKKyAgICB7S19MRUZULAkJIlwwMzNbRCJ9LAorICAgIHtLX1JJR0hULAkJIlwwMzNbQyJ9LAorIyBlbmRpZgorCisjIGlmIGRlZmluZWQoVU5JWCkgfHwgZGVmaW5lZChBTExfQlVJTFRJTl9UQ0FQUykgfHwgZGVmaW5lZChTT01FX0JVSUxUSU5fVENBUFMpIHx8IGRlZmluZWQoX19FTVhfXykKKy8qCisgKiBzdGFuZGFyZCBBTlNJIHRlcm1pbmFsLCBkZWZhdWx0IGZvciB1bml4CisgKi8KKyAgICB7KGludClLU19OQU1FLAkiYW5zaSJ9LAorICAgIHsoaW50KUtTX0NFLAlJRl9FQigiXDAzM1tLIiwgRVNDX1NUUiAiW0siKX0sCisgICAgeyhpbnQpS1NfQUwsCUlGX0VCKCJcMDMzW0wiLCBFU0NfU1RSICJbTCIpfSwKKyMgIGlmZGVmIFRFUk1JTkZPCisgICAgeyhpbnQpS1NfQ0FMLAlJRl9FQigiXDAzM1slcDElZEwiLCBFU0NfU1RSICJbJXAxJWRMIil9LAorIyAgZWxzZQorICAgIHsoaW50KUtTX0NBTCwJSUZfRUIoIlwwMzNbJWRMIiwgRVNDX1NUUiAiWyVkTCIpfSwKKyMgIGVuZGlmCisgICAgeyhpbnQpS1NfREwsCUlGX0VCKCJcMDMzW00iLCBFU0NfU1RSICJbTSIpfSwKKyMgIGlmZGVmIFRFUk1JTkZPCisgICAgeyhpbnQpS1NfQ0RMLAlJRl9FQigiXDAzM1slcDElZE0iLCBFU0NfU1RSICJbJXAxJWRNIil9LAorIyAgZWxzZQorICAgIHsoaW50KUtTX0NETCwJSUZfRUIoIlwwMzNbJWRNIiwgRVNDX1NUUiAiWyVkTSIpfSwKKyMgIGVuZGlmCisgICAgeyhpbnQpS1NfQ0wsCUlGX0VCKCJcMDMzW0hcMDMzWzJKIiwgRVNDX1NUUiAiW0giIEVTQ19TVFJfbmMgIlsySiIpfSwKKyAgICB7KGludClLU19NRSwJSUZfRUIoIlwwMzNbMG0iLCBFU0NfU1RSICJbMG0iKX0sCisgICAgeyhpbnQpS1NfTVIsCUlGX0VCKCJcMDMzWzdtIiwgRVNDX1NUUiAiWzdtIil9LAorICAgIHsoaW50KUtTX01TLAkieSJ9LAorICAgIHsoaW50KUtTX1VULAkieSJ9LAkJLyogZ3Vlc3NlZCAqLworICAgIHsoaW50KUtTX0xFLAkiXGIifSwKKyMgIGlmZGVmIFRFUk1JTkZPCisgICAgeyhpbnQpS1NfQ00sCUlGX0VCKCJcMDMzWyVpJXAxJWQ7JXAyJWRIIiwgRVNDX1NUUiAiWyVpJXAxJWQ7JXAyJWRIIil9LAorIyAgZWxzZQorICAgIHsoaW50KUtTX0NNLAlJRl9FQigiXDAzM1slaSVkOyVkSCIsIEVTQ19TVFIgIlslaSVkOyVkSCIpfSwKKyMgIGVuZGlmCisjICBpZmRlZiBURVJNSU5GTworICAgIHsoaW50KUtTX0NSSSwJSUZfRUIoIlwwMzNbJXAxJWRDIiwgRVNDX1NUUiAiWyVwMSVkQyIpfSwKKyMgIGVsc2UKKyAgICB7KGludClLU19DUkksCUlGX0VCKCJcMDMzWyVkQyIsIEVTQ19TVFIgIlslZEMiKX0sCisjICBlbmRpZgorIyBlbmRpZgorCisjIGlmIGRlZmluZWQoTVNET1MpIHx8IGRlZmluZWQoQUxMX0JVSUxUSU5fVENBUFMpIHx8IGRlZmluZWQoX19FTVhfXykKKy8qCisgKiBUaGVzZSBjb2RlcyBhcmUgdmFsaWQgd2hlbiBuYW5zaS5zeXMgb3IgZXF1aXZhbGVudCBoYXMgYmVlbiBpbnN0YWxsZWQuCisgKiBGdW5jdGlvbiBrZXlzIG9uIGEgUEMgYXJlIHByZWNlZGVkIHdpdGggYSBOVUwuIFRoZXNlIGFyZSBjb252ZXJ0ZWQgaW50bworICogS19OVUwgJ1wzMTYnIGluIG1jaF9pbmNoYXIoKSwgYmVjYXVzZSB3ZSBjYW5ub3QgaGFuZGxlIE5VTHMgaW4ga2V5IGNvZGVzLgorICogQ1RSTC1hcnJvdyBpcyB1c2VkIGluc3RlYWQgb2YgU0hJRlQtYXJyb3cuCisgKi8KKyNpZmRlZiBfX0VNWF9fCisgICAgeyhpbnQpS1NfTkFNRSwJIm9zMmFuc2kifSwKKyNlbHNlCisgICAgeyhpbnQpS1NfTkFNRSwJInBjYW5zaSJ9LAorICAgIHsoaW50KUtTX0RMLAkiXDAzM1tNIn0sCisgICAgeyhpbnQpS1NfQUwsCSJcMDMzW0wifSwKKyNlbmRpZgorICAgIHsoaW50KUtTX0NFLAkiXDAzM1tLIn0sCisgICAgeyhpbnQpS1NfQ0wsCSJcMDMzWzJKIn0sCisgICAgeyhpbnQpS1NfTUUsCSJcMDMzWzBtIn0sCisgICAgeyhpbnQpS1NfTVIsCSJcMDMzWzVtIn0sCS8qIHJldmVyc2U6IGJsYWNrIG9uIGxpZ2h0Z3JleSAqLworICAgIHsoaW50KUtTX01ELAkiXDAzM1sxbSJ9LAkvKiBib2xkOiB3aGl0ZSB0ZXh0ICovCisgICAgeyhpbnQpS1NfU0UsCSJcMDMzWzBtIn0sCS8qIHN0YW5kb3V0IGVuZCAqLworICAgIHsoaW50KUtTX1NPLAkiXDAzM1szMW0ifSwJLyogc3RhbmRvdXQ6IHdoaXRlIG9uIGJsdWUgKi8KKyAgICB7KGludClLU19DWkgsCSJcMDMzWzM0OzQzbSJ9LAkvKiBpdGFsaWMgbW9kZTogYmx1ZSB0ZXh0IG9uIHllbGxvdyAqLworICAgIHsoaW50KUtTX0NaUiwJIlwwMzNbMG0ifSwJLyogaXRhbGljIG1vZGUgZW5kICovCisgICAgeyhpbnQpS1NfVVMsCSJcMDMzWzM2OzQxbSJ9LAkvKiB1bmRlcnNjb3JlIG1vZGU6IGN5YW4gdGV4dCBvbiByZWQgKi8KKyAgICB7KGludClLU19VRSwJIlwwMzNbMG0ifSwJLyogdW5kZXJzY29yZSBtb2RlIGVuZCAqLworICAgIHsoaW50KUtTX0NDTywJIjgifSwJCS8qIGFsbG93IDggY29sb3JzICovCisjICBpZmRlZiBURVJNSU5GTworICAgIHsoaW50KUtTX0NBQiwJIlwwMzNbNCVwMSVkbSJ9LC8qIHNldCBiYWNrZ3JvdW5kIGNvbG9yICovCisgICAgeyhpbnQpS1NfQ0FGLAkiXDAzM1szJXAxJWRtIn0sLyogc2V0IGZvcmVncm91bmQgY29sb3IgKi8KKyMgIGVsc2UKKyAgICB7KGludClLU19DQUIsCSJcMDMzWzQlZG0ifSwJLyogc2V0IGJhY2tncm91bmQgY29sb3IgKi8KKyAgICB7KGludClLU19DQUYsCSJcMDMzWzMlZG0ifSwJLyogc2V0IGZvcmVncm91bmQgY29sb3IgKi8KKyMgIGVuZGlmCisgICAgeyhpbnQpS1NfT1AsCSJcMDMzWzBtIn0sCS8qIHJlc2V0IGNvbG9ycyAqLworICAgIHsoaW50KUtTX01TLAkieSJ9LAorICAgIHsoaW50KUtTX1VULAkieSJ9LAkJLyogZ3Vlc3NlZCAqLworICAgIHsoaW50KUtTX0xFLAkiXGIifSwKKyMgIGlmZGVmIFRFUk1JTkZPCisgICAgeyhpbnQpS1NfQ00sCSJcMDMzWyVpJXAxJWQ7JXAyJWRIIn0sCisjICBlbHNlCisgICAgeyhpbnQpS1NfQ00sCSJcMDMzWyVpJWQ7JWRIIn0sCisjICBlbmRpZgorIyAgaWZkZWYgVEVSTUlORk8KKyAgICB7KGludClLU19DUkksCSJcMDMzWyVwMSVkQyJ9LAorIyAgZWxzZQorICAgIHsoaW50KUtTX0NSSSwJIlwwMzNbJWRDIn0sCisjICBlbmRpZgorICAgIHtLX1VQLAkJIlwzMTZIIn0sCisgICAge0tfRE9XTiwJCSJcMzE2UCJ9LAorICAgIHtLX0xFRlQsCQkiXDMxNksifSwKKyAgICB7S19SSUdIVCwJCSJcMzE2TSJ9LAorICAgIHtLX1NfTEVGVCwJCSJcMzE2cyJ9LAorICAgIHtLX1NfUklHSFQsCQkiXDMxNnQifSwKKyAgICB7S19GMSwJCSJcMzE2OyJ9LAorICAgIHtLX0YyLAkJIlwzMTY8In0sCisgICAge0tfRjMsCQkiXDMxNj0ifSwKKyAgICB7S19GNCwJCSJcMzE2PiJ9LAorICAgIHtLX0Y1LAkJIlwzMTY/In0sCisgICAge0tfRjYsCQkiXDMxNkAifSwKKyAgICB7S19GNywJCSJcMzE2QSJ9LAorICAgIHtLX0Y4LAkJIlwzMTZCIn0sCisgICAge0tfRjksCQkiXDMxNkMifSwKKyAgICB7S19GMTAsCQkiXDMxNkQifSwKKyAgICB7S19GMTEsCQkiXDMxNlwyMDUifSwJLyogZ3Vlc3NlZCAqLworICAgIHtLX0YxMiwJCSJcMzE2XDIwNiJ9LAkvKiBndWVzc2VkICovCisgICAge0tfU19GMSwJCSJcMzE2VCJ9LAorICAgIHtLX1NfRjIsCQkiXDMxNlUifSwKKyAgICB7S19TX0YzLAkJIlwzMTZWIn0sCisgICAge0tfU19GNCwJCSJcMzE2VyJ9LAorICAgIHtLX1NfRjUsCQkiXDMxNlgifSwKKyAgICB7S19TX0Y2LAkJIlwzMTZZIn0sCisgICAge0tfU19GNywJCSJcMzE2WiJ9LAorICAgIHtLX1NfRjgsCQkiXDMxNlsifSwKKyAgICB7S19TX0Y5LAkJIlwzMTZcXCJ9LAorICAgIHtLX1NfRjEwLAkJIlwzMTZdIn0sCisgICAge0tfU19GMTEsCQkiXDMxNlwyMDcifSwJLyogZ3Vlc3NlZCAqLworICAgIHtLX1NfRjEyLAkJIlwzMTZcMjEwIn0sCS8qIGd1ZXNzZWQgKi8KKyAgICB7S19JTlMsCQkiXDMxNlIifSwKKyAgICB7S19ERUwsCQkiXDMxNlMifSwKKyAgICB7S19IT01FLAkJIlwzMTZHIn0sCisgICAge0tfRU5ELAkJIlwzMTZPIn0sCisgICAge0tfUEFHRURPV04sCSJcMzE2USJ9LAorICAgIHtLX1BBR0VVUCwJCSJcMzE2SSJ9LAorIyBlbmRpZgorCisjIGlmIGRlZmluZWQoTVNET1MpCisvKgorICogVGhlc2UgY29kZXMgYXJlIHZhbGlkIGZvciB0aGUgcGMgdmlkZW8uICBUaGUgZW50cmllcyB0aGF0IHN0YXJ0IHdpdGggRVNDIHwKKyAqIGFyZSB0cmFuc2xhdGVkIGludG8gY29uaW8gY2FsbHMgaW4gb3NfbXNkb3MuYy4gRGVmYXVsdCBmb3IgTVNET1MuCisgKi8KKyAgICB7KGludClLU19OQU1FLAkicGN0ZXJtIn0sCisgICAgeyhpbnQpS1NfQ0UsCSJcMDMzfEsifSwKKyAgICB7KGludClLU19BTCwJIlwwMzN8TCJ9LAorICAgIHsoaW50KUtTX0RMLAkiXDAzM3xNIn0sCisjICBpZmRlZiBURVJNSU5GTworICAgIHsoaW50KUtTX0NTLAkiXDAzM3wlaSVwMSVkOyVwMiVkciJ9LAorIyAgIGlmZGVmIEZFQVRfVkVSVFNQTElUCisgICAgeyhpbnQpS1NfQ1NWLAkiXDAzM3wlaSVwMSVkOyVwMiVkViJ9LAorIyAgIGVuZGlmCisjICBlbHNlCisgICAgeyhpbnQpS1NfQ1MsCSJcMDMzfCVpJWQ7JWRyIn0sCisjICAgaWZkZWYgRkVBVF9WRVJUU1BMSVQKKyAgICB7KGludClLU19DU1YsCSJcMDMzfCVpJWQ7JWRWIn0sCisjICAgZW5kaWYKKyMgIGVuZGlmCisgICAgeyhpbnQpS1NfQ0wsCSJcMDMzfEoifSwKKyAgICB7KGludClLU19NRSwJIlwwMzN8MG0ifSwJLyogbm9ybWFsICovCisgICAgeyhpbnQpS1NfTVIsCSJcMDMzfDExMm0ifSwJLyogcmV2ZXJzZTogYmxhY2sgb24gbGlnaHRncmV5ICovCisgICAgeyhpbnQpS1NfTUQsCSJcMDMzfDE1bSJ9LAkvKiBib2xkOiB3aGl0ZSB0ZXh0ICovCisgICAgeyhpbnQpS1NfU0UsCSJcMDMzfDBtIn0sCS8qIHN0YW5kb3V0IGVuZCAqLworICAgIHsoaW50KUtTX1NPLAkiXDAzM3wzMW0ifSwJLyogc3RhbmRvdXQ6IHdoaXRlIG9uIGJsdWUgKi8KKyAgICB7KGludClLU19DWkgsCSJcMDMzfDIyNW0ifSwJLyogaXRhbGljIG1vZGU6IGJsdWUgdGV4dCBvbiB5ZWxsb3cgKi8KKyAgICB7KGludClLU19DWlIsCSJcMDMzfDBtIn0sCS8qIGl0YWxpYyBtb2RlIGVuZCAqLworICAgIHsoaW50KUtTX1VTLAkiXDAzM3w2N20ifSwJLyogdW5kZXJzY29yZSBtb2RlOiBjeWFuIHRleHQgb24gcmVkICovCisgICAgeyhpbnQpS1NfVUUsCSJcMDMzfDBtIn0sCS8qIHVuZGVyc2NvcmUgbW9kZSBlbmQgKi8KKyAgICB7KGludClLU19DQ08sCSIxNiJ9LAkJLyogYWxsb3cgMTYgY29sb3JzICovCisjICBpZmRlZiBURVJNSU5GTworICAgIHsoaW50KUtTX0NBQiwJIlwwMzN8JXAxJWRiIn0sCS8qIHNldCBiYWNrZ3JvdW5kIGNvbG9yICovCisgICAgeyhpbnQpS1NfQ0FGLAkiXDAzM3wlcDElZGYifSwJLyogc2V0IGZvcmVncm91bmQgY29sb3IgKi8KKyMgIGVsc2UKKyAgICB7KGludClLU19DQUIsCSJcMDMzfCVkYiJ9LAkvKiBzZXQgYmFja2dyb3VuZCBjb2xvciAqLworICAgIHsoaW50KUtTX0NBRiwJIlwwMzN8JWRmIn0sCS8qIHNldCBmb3JlZ3JvdW5kIGNvbG9yICovCisjICBlbmRpZgorICAgIHsoaW50KUtTX01TLAkieSJ9LAorICAgIHsoaW50KUtTX1VULAkieSJ9LAorICAgIHsoaW50KUtTX0xFLAkiXGIifSwKKyMgIGlmZGVmIFRFUk1JTkZPCisgICAgeyhpbnQpS1NfQ00sCSJcMDMzfCVpJXAxJWQ7JXAyJWRIIn0sCisjICBlbHNlCisgICAgeyhpbnQpS1NfQ00sCSJcMDMzfCVpJWQ7JWRIIn0sCisjICBlbmRpZgorI2lmZGVmIERKR1BQCisgICAgeyhpbnQpS1NfVkIsCSJcMDMzfEIifSwJLyogdmlzdWFsIGJlbGwgKi8KKyNlbmRpZgorICAgIHtLX1VQLAkJIlwzMTZIIn0sCisgICAge0tfRE9XTiwJCSJcMzE2UCJ9LAorICAgIHtLX0xFRlQsCQkiXDMxNksifSwKKyAgICB7S19SSUdIVCwJCSJcMzE2TSJ9LAorICAgIHtLX1NfTEVGVCwJCSJcMzE2cyJ9LAorICAgIHtLX1NfUklHSFQsCQkiXDMxNnQifSwKKyAgICB7S19TX1RBQiwJCSJcMzE2XDAxNyJ9LAorICAgIHtLX0YxLAkJIlwzMTY7In0sCisgICAge0tfRjIsCQkiXDMxNjwifSwKKyAgICB7S19GMywJCSJcMzE2PSJ9LAorICAgIHtLX0Y0LAkJIlwzMTY+In0sCisgICAge0tfRjUsCQkiXDMxNj8ifSwKKyAgICB7S19GNiwJCSJcMzE2QCJ9LAorICAgIHtLX0Y3LAkJIlwzMTZBIn0sCisgICAge0tfRjgsCQkiXDMxNkIifSwKKyAgICB7S19GOSwJCSJcMzE2QyJ9LAorICAgIHtLX0YxMCwJCSJcMzE2RCJ9LAorICAgIHtLX0YxMSwJCSJcMzE2XDIwNSJ9LAorICAgIHtLX0YxMiwJCSJcMzE2XDIwNiJ9LAorICAgIHtLX1NfRjEsCQkiXDMxNlQifSwKKyAgICB7S19TX0YyLAkJIlwzMTZVIn0sCisgICAge0tfU19GMywJCSJcMzE2ViJ9LAorICAgIHtLX1NfRjQsCQkiXDMxNlcifSwKKyAgICB7S19TX0Y1LAkJIlwzMTZYIn0sCisgICAge0tfU19GNiwJCSJcMzE2WSJ9LAorICAgIHtLX1NfRjcsCQkiXDMxNloifSwKKyAgICB7S19TX0Y4LAkJIlwzMTZbIn0sCisgICAge0tfU19GOSwJCSJcMzE2XFwifSwKKyAgICB7S19TX0YxMCwJCSJcMzE2XSJ9LAorICAgIHtLX1NfRjExLAkJIlwzMTZcMjA3In0sCisgICAge0tfU19GMTIsCQkiXDMxNlwyMTAifSwKKyAgICB7S19JTlMsCQkiXDMxNlIifSwKKyAgICB7S19ERUwsCQkiXDMxNlMifSwKKyAgICB7S19IT01FLAkJIlwzMTZHIn0sCisgICAge0tfRU5ELAkJIlwzMTZPIn0sCisgICAge0tfUEFHRURPV04sCSJcMzE2USJ9LAorICAgIHtLX1BBR0VVUCwJCSJcMzE2SSJ9LAorICAgIHtLX0tQTFVTLAkJIlwzMTZOIn0sCisgICAge0tfS01JTlVTLAkJIlwzMTZKIn0sCisgICAge0tfS01VTFRJUExZLAkiXDMxNjcifSwKKyAgICB7S19LMCwJCSJcMzE2XDMzMiJ9LAorICAgIHtLX0sxLAkJIlwzMTZcMzM2In0sCisgICAge0tfSzIsCQkiXDMxNlwzNDIifSwKKyAgICB7S19LMywJCSJcMzE2XDM0NiJ9LAorICAgIHtLX0s0LAkJIlwzMTZcMzUyIn0sCisgICAge0tfSzUsCQkiXDMxNlwzNTYifSwKKyAgICB7S19LNiwJCSJcMzE2XDM2MiJ9LAorICAgIHtLX0s3LAkJIlwzMTZcMzY2In0sCisgICAge0tfSzgsCQkiXDMxNlwzNzIifSwKKyAgICB7S19LOSwJCSJcMzE2XDM3NiJ9LAorIyBlbmRpZgorCisjIGlmIGRlZmluZWQoV0lOMzI2NCkgfHwgZGVmaW5lZChBTExfQlVJTFRJTl9UQ0FQUykgfHwgZGVmaW5lZChfX0VNWF9fKQorLyoKKyAqIFRoZXNlIGNvZGVzIGFyZSB2YWxpZCBmb3IgdGhlIFdpbjMyIENvbnNvbGUgLiAgVGhlIGVudHJpZXMgdGhhdCBzdGFydCB3aXRoCisgKiBFU0MgfCBhcmUgdHJhbnNsYXRlZCBpbnRvIGNvbnNvbGUgY2FsbHMgaW4gb3Nfd2luMzIuYy4gIFRoZSBmdW5jdGlvbiBrZXlzCisgKiBhcmUgYWxzbyB0cmFuc2xhdGVkIGluIG9zX3dpbjMyLmMuCisgKi8KKyAgICB7KGludClLU19OQU1FLAkid2luMzIifSwKKyAgICB7KGludClLU19DRSwJIlwwMzN8SyJ9LAkvKiBjbGVhciB0byBlbmQgb2YgbGluZSAqLworICAgIHsoaW50KUtTX0FMLAkiXDAzM3xMIn0sCS8qIGFkZCBuZXcgYmxhbmsgbGluZSAqLworIyAgaWZkZWYgVEVSTUlORk8KKyAgICB7KGludClLU19DQUwsCSJcMDMzfCVwMSVkTCJ9LAkvKiBhZGQgbnVtYmVyIG9mIG5ldyBibGFuayBsaW5lcyAqLworIyAgZWxzZQorICAgIHsoaW50KUtTX0NBTCwJIlwwMzN8JWRMIn0sCS8qIGFkZCBudW1iZXIgb2YgbmV3IGJsYW5rIGxpbmVzICovCisjICBlbmRpZgorICAgIHsoaW50KUtTX0RMLAkiXDAzM3xNIn0sCS8qIGRlbGV0ZSBsaW5lICovCisjICBpZmRlZiBURVJNSU5GTworICAgIHsoaW50KUtTX0NETCwJIlwwMzN8JXAxJWRNIn0sCS8qIGRlbGV0ZSBudW1iZXIgb2YgbGluZXMgKi8KKyMgIGVsc2UKKyAgICB7KGludClLU19DREwsCSJcMDMzfCVkTSJ9LAkvKiBkZWxldGUgbnVtYmVyIG9mIGxpbmVzICovCisjICBlbmRpZgorICAgIHsoaW50KUtTX0NMLAkiXDAzM3xKIn0sCS8qIGNsZWFyIHNjcmVlbiAqLworICAgIHsoaW50KUtTX0NELAkiXDAzM3xqIn0sCS8qIGNsZWFyIHRvIGVuZCBvZiBkaXNwbGF5ICovCisgICAgeyhpbnQpS1NfVkksCSJcMDMzfHYifSwJLyogY3Vyc29yIGludmlzaWJsZSAqLworICAgIHsoaW50KUtTX1ZFLAkiXDAzM3xWIn0sCS8qIGN1cnNvciB2aXNpYmxlICovCisKKyAgICB7KGludClLU19NRSwJIlwwMzN8MG0ifSwJLyogbm9ybWFsICovCisgICAgeyhpbnQpS1NfTVIsCSJcMDMzfDExMm0ifSwJLyogcmV2ZXJzZTogYmxhY2sgb24gbGlnaHRncmF5ICovCisgICAgeyhpbnQpS1NfTUQsCSJcMDMzfDE1bSJ9LAkvKiBib2xkOiB3aGl0ZSBvbiBibGFjayAqLworI2lmIDEKKyAgICB7KGludClLU19TTywJIlwwMzN8MzFtIn0sCS8qIHN0YW5kb3V0OiB3aGl0ZSBvbiBibHVlICovCisgICAgeyhpbnQpS1NfU0UsCSJcMDMzfDBtIn0sCS8qIHN0YW5kb3V0IGVuZCAqLworI2Vsc2UKKyAgICB7KGludClLU19TTywJIlwwMzN8RiJ9LAkvKiBzdGFuZG91dDogaGlnaCBpbnRlbnNpdHkgKi8KKyAgICB7KGludClLU19TRSwJIlwwMzN8ZiJ9LAkvKiBzdGFuZG91dCBlbmQgKi8KKyNlbmRpZgorICAgIHsoaW50KUtTX0NaSCwJIlwwMzN8MjI1bSJ9LAkvKiBpdGFsaWM6IGJsdWUgdGV4dCBvbiB5ZWxsb3cgKi8KKyAgICB7KGludClLU19DWlIsCSJcMDMzfDBtIn0sCS8qIGl0YWxpYyBlbmQgKi8KKyAgICB7KGludClLU19VUywJIlwwMzN8NjdtIn0sCS8qIHVuZGVyc2NvcmU6IGN5YW4gdGV4dCBvbiByZWQgKi8KKyAgICB7KGludClLU19VRSwJIlwwMzN8MG0ifSwJLyogdW5kZXJzY29yZSBlbmQgKi8KKyAgICB7KGludClLU19DQ08sCSIxNiJ9LAkJLyogYWxsb3cgMTYgY29sb3JzICovCisjICBpZmRlZiBURVJNSU5GTworICAgIHsoaW50KUtTX0NBQiwJIlwwMzN8JXAxJWRiIn0sCS8qIHNldCBiYWNrZ3JvdW5kIGNvbG9yICovCisgICAgeyhpbnQpS1NfQ0FGLAkiXDAzM3wlcDElZGYifSwJLyogc2V0IGZvcmVncm91bmQgY29sb3IgKi8KKyMgIGVsc2UKKyAgICB7KGludClLU19DQUIsCSJcMDMzfCVkYiJ9LAkvKiBzZXQgYmFja2dyb3VuZCBjb2xvciAqLworICAgIHsoaW50KUtTX0NBRiwJIlwwMzN8JWRmIn0sCS8qIHNldCBmb3JlZ3JvdW5kIGNvbG9yICovCisjICBlbmRpZgorCisgICAgeyhpbnQpS1NfTVMsCSJ5In0sCQkvKiBzYXZlIHRvIG1vdmUgY3VyIGluIHJldmVyc2UgbW9kZSAqLworICAgIHsoaW50KUtTX1VULAkieSJ9LAorICAgIHsoaW50KUtTX0xFLAkiXGIifSwKKyMgIGlmZGVmIFRFUk1JTkZPCisgICAgeyhpbnQpS1NfQ00sCSJcMDMzfCVpJXAxJWQ7JXAyJWRIIn0sLyogY3Vyc29yIG1vdGlvbiAqLworIyAgZWxzZQorICAgIHsoaW50KUtTX0NNLAkiXDAzM3wlaSVkOyVkSCJ9LC8qIGN1cnNvciBtb3Rpb24gKi8KKyMgIGVuZGlmCisgICAgeyhpbnQpS1NfVkIsCSJcMDMzfEIifSwJLyogdmlzdWFsIGJlbGwgKi8KKyAgICB7KGludClLU19USSwJIlwwMzN8UyJ9LAkvKiBwdXQgdGVybWluYWwgaW4gdGVybWNhcCBtb2RlICovCisgICAgeyhpbnQpS1NfVEUsCSJcMDMzfEUifSwJLyogb3V0IG9mIHRlcm1jYXAgbW9kZSAqLworIyAgaWZkZWYgVEVSTUlORk8KKyAgICB7KGludClLU19DUywJIlwwMzN8JWklcDElZDslcDIlZHIifSwvKiBzY3JvbGwgcmVnaW9uICovCisjICBlbHNlCisgICAgeyhpbnQpS1NfQ1MsCSJcMDMzfCVpJWQ7JWRyIn0sLyogc2Nyb2xsIHJlZ2lvbiAqLworIyAgZW5kaWYKKworICAgIHtLX1VQLAkJIlwzMTZIIn0sCisgICAge0tfRE9XTiwJCSJcMzE2UCJ9LAorICAgIHtLX0xFRlQsCQkiXDMxNksifSwKKyAgICB7S19SSUdIVCwJCSJcMzE2TSJ9LAorICAgIHtLX1NfVVAsCQkiXDMxNlwzMDQifSwKKyAgICB7S19TX0RPV04sCQkiXDMxNlwzMTcifSwKKyAgICB7S19TX0xFRlQsCQkiXDMxNlwzMTEifSwKKyAgICB7S19DX0xFRlQsCQkiXDMxNnMifSwKKyAgICB7S19TX1JJR0hULAkJIlwzMTZcMzEzIn0sCisgICAge0tfQ19SSUdIVCwJCSJcMzE2dCJ9LAorICAgIHtLX1NfVEFCLAkJIlwzMTZcMDE3In0sCisgICAge0tfRjEsCQkiXDMxNjsifSwKKyAgICB7S19GMiwJCSJcMzE2PCJ9LAorICAgIHtLX0YzLAkJIlwzMTY9In0sCisgICAge0tfRjQsCQkiXDMxNj4ifSwKKyAgICB7S19GNSwJCSJcMzE2PyJ9LAorICAgIHtLX0Y2LAkJIlwzMTZAIn0sCisgICAge0tfRjcsCQkiXDMxNkEifSwKKyAgICB7S19GOCwJCSJcMzE2QiJ9LAorICAgIHtLX0Y5LAkJIlwzMTZDIn0sCisgICAge0tfRjEwLAkJIlwzMTZEIn0sCisgICAge0tfRjExLAkJIlwzMTZcMjA1In0sCisgICAge0tfRjEyLAkJIlwzMTZcMjA2In0sCisgICAge0tfU19GMSwJCSJcMzE2VCJ9LAorICAgIHtLX1NfRjIsCQkiXDMxNlUifSwKKyAgICB7S19TX0YzLAkJIlwzMTZWIn0sCisgICAge0tfU19GNCwJCSJcMzE2VyJ9LAorICAgIHtLX1NfRjUsCQkiXDMxNlgifSwKKyAgICB7S19TX0Y2LAkJIlwzMTZZIn0sCisgICAge0tfU19GNywJCSJcMzE2WiJ9LAorICAgIHtLX1NfRjgsCQkiXDMxNlsifSwKKyAgICB7S19TX0Y5LAkJIlwzMTZcXCJ9LAorICAgIHtLX1NfRjEwLAkJIlwzMTZdIn0sCisgICAge0tfU19GMTEsCQkiXDMxNlwyMDcifSwKKyAgICB7S19TX0YxMiwJCSJcMzE2XDIxMCJ9LAorICAgIHtLX0lOUywJCSJcMzE2UiJ9LAorICAgIHtLX0RFTCwJCSJcMzE2UyJ9LAorICAgIHtLX0hPTUUsCQkiXDMxNkcifSwKKyAgICB7S19TX0hPTUUsCQkiXDMxNlwzMDIifSwKKyAgICB7S19DX0hPTUUsCQkiXDMxNncifSwKKyAgICB7S19FTkQsCQkiXDMxNk8ifSwKKyAgICB7S19TX0VORCwJCSJcMzE2XDMxNSJ9LAorICAgIHtLX0NfRU5ELAkJIlwzMTZ1In0sCisgICAge0tfUEFHRURPV04sCSJcMzE2USJ9LAorICAgIHtLX1BBR0VVUCwJCSJcMzE2SSJ9LAorICAgIHtLX0tQTFVTLAkJIlwzMTZOIn0sCisgICAge0tfS01JTlVTLAkJIlwzMTZKIn0sCisgICAge0tfS01VTFRJUExZLAkiXDMxNlwwNjcifSwKKyAgICB7S19LMCwJCSJcMzE2XDMzMiJ9LAorICAgIHtLX0sxLAkJIlwzMTZcMzM2In0sCisgICAge0tfSzIsCQkiXDMxNlwzNDIifSwKKyAgICB7S19LMywJCSJcMzE2XDM0NiJ9LAorICAgIHtLX0s0LAkJIlwzMTZcMzUyIn0sCisgICAge0tfSzUsCQkiXDMxNlwzNTYifSwKKyAgICB7S19LNiwJCSJcMzE2XDM2MiJ9LAorICAgIHtLX0s3LAkJIlwzMTZcMzY2In0sCisgICAge0tfSzgsCQkiXDMxNlwzNzIifSwKKyAgICB7S19LOSwJCSJcMzE2XDM3NiJ9LAorIyBlbmRpZgorCisjIGlmIGRlZmluZWQoVk1TKSB8fCBkZWZpbmVkKEFMTF9CVUlMVElOX1RDQVBTKQorLyoKKyAqIFZUMzIwIGlzIHdvcmtpbmcgYXMgYW4gQU5TSSB0ZXJtaW5hbCBjb21wYXRpYmxlIERFQyB0ZXJtaW5hbC4KKyAqIChpdCBjb3ZlcnMgVlQxeDAsIFZUMngwIGFuZCBWVDN4MCB1cCB0byBWVDMyMCBvbiBWTVMgYXMgd2VsbCkKKyAqIE5vdGU6IEtfRjEuLi5LX0Y1IGFyZSBmb3IgaW50ZXJuYWwgdXNlLCBzaG91bGQgbm90IGJlIGRlZmluZWQuCisgKiBUT0RPOi0gcmV3cml0ZSBFU0NbIGNvZGVzIHRvIENTSQorICogICAgICAtIGtleWJvYXJkIGxhbmd1YWdlcyAoQ1NJID8gMjYgbikKKyAqLworICAgIHsoaW50KUtTX05BTUUsCSJ2dDMyMCJ9LAorICAgIHsoaW50KUtTX0NFLAlJRl9FQigiXDAzM1tLIiwgRVNDX1NUUiAiW0siKX0sCisgICAgeyhpbnQpS1NfQUwsCUlGX0VCKCJcMDMzW0wiLCBFU0NfU1RSICJbTCIpfSwKKyMgIGlmZGVmIFRFUk1JTkZPCisgICAgeyhpbnQpS1NfQ0FMLAlJRl9FQigiXDAzM1slcDElZEwiLCBFU0NfU1RSICJbJXAxJWRMIil9LAorIyAgZWxzZQorICAgIHsoaW50KUtTX0NBTCwJSUZfRUIoIlwwMzNbJWRMIiwgRVNDX1NUUiAiWyVkTCIpfSwKKyMgIGVuZGlmCisgICAgeyhpbnQpS1NfREwsCUlGX0VCKCJcMDMzW00iLCBFU0NfU1RSICJbTSIpfSwKKyMgIGlmZGVmIFRFUk1JTkZPCisgICAgeyhpbnQpS1NfQ0RMLAlJRl9FQigiXDAzM1slcDElZE0iLCBFU0NfU1RSICJbJXAxJWRNIil9LAorIyAgZWxzZQorICAgIHsoaW50KUtTX0NETCwJSUZfRUIoIlwwMzNbJWRNIiwgRVNDX1NUUiAiWyVkTSIpfSwKKyMgIGVuZGlmCisgICAgeyhpbnQpS1NfQ0wsCUlGX0VCKCJcMDMzW0hcMDMzWzJKIiwgRVNDX1NUUiAiW0giIEVTQ19TVFJfbmMgIlsySiIpfSwKKyAgICB7KGludClLU19NRSwJSUZfRUIoIlwwMzNbMG0iLCBFU0NfU1RSICJbMG0iKX0sCisgICAgeyhpbnQpS1NfTVIsCUlGX0VCKCJcMDMzWzdtIiwgRVNDX1NUUiAiWzdtIil9LAorICAgIHsoaW50KUtTX01TLAkieSJ9LAorICAgIHsoaW50KUtTX1VULAkieSJ9LAorICAgIHsoaW50KUtTX0xFLAkiXGIifSwKKyMgIGlmZGVmIFRFUk1JTkZPCisgICAgeyhpbnQpS1NfQ00sCUlGX0VCKCJcMDMzWyVpJXAxJWQ7JXAyJWRIIiwKKwkJCQkJCSAgRVNDX1NUUiAiWyVpJXAxJWQ7JXAyJWRIIil9LAorIyAgZWxzZQorICAgIHsoaW50KUtTX0NNLAlJRl9FQigiXDAzM1slaSVkOyVkSCIsIEVTQ19TVFIgIlslaSVkOyVkSCIpfSwKKyMgIGVuZGlmCisjICBpZmRlZiBURVJNSU5GTworICAgIHsoaW50KUtTX0NSSSwJSUZfRUIoIlwwMzNbJXAxJWRDIiwgRVNDX1NUUiAiWyVwMSVkQyIpfSwKKyMgIGVsc2UKKyAgICB7KGludClLU19DUkksCUlGX0VCKCJcMDMzWyVkQyIsIEVTQ19TVFIgIlslZEMiKX0sCisjICBlbmRpZgorICAgIHtLX1VQLAkJSUZfRUIoIlwwMzNbQSIsIEVTQ19TVFIgIltBIil9LAorICAgIHtLX0RPV04sCQlJRl9FQigiXDAzM1tCIiwgRVNDX1NUUiAiW0IiKX0sCisgICAge0tfUklHSFQsCQlJRl9FQigiXDAzM1tDIiwgRVNDX1NUUiAiW0MiKX0sCisgICAge0tfTEVGVCwJCUlGX0VCKCJcMDMzW0QiLCBFU0NfU1RSICJbRCIpfSwKKyAgICB7S19GNiwJCUlGX0VCKCJcMDMzWzE3fiIsIEVTQ19TVFIgIlsxN34iKX0sCisgICAge0tfRjcsCQlJRl9FQigiXDAzM1sxOH4iLCBFU0NfU1RSICJbMTh+Iil9LAorICAgIHtLX0Y4LAkJSUZfRUIoIlwwMzNbMTl+IiwgRVNDX1NUUiAiWzE5fiIpfSwKKyAgICB7S19GOSwJCUlGX0VCKCJcMDMzWzIwfiIsIEVTQ19TVFIgIlsyMH4iKX0sCisgICAge0tfRjEwLAkJSUZfRUIoIlwwMzNbMjF+IiwgRVNDX1NUUiAiWzIxfiIpfSwKKy8qICB7S19GMTEsCQlJRl9FQigiXDAzM1syM34iLCBFU0NfU1RSICJbMjN+Iil9LAorCQkJKiAgKEVTQykgc2hvdWxkIG5vdCBkZWZpbmUsIHNvbWV0aW1lcyBkb2VzIG5vdCB3b3JrICovCisgICAge0tfRjEyLAkJSUZfRUIoIlwwMzNbMjR+IiwgRVNDX1NUUiAiWzI0fiIpfSwKKyAgICB7S19GMTMsCQlJRl9FQigiXDAzM1syNX4iLCBFU0NfU1RSICJbMjV+Iil9LAorICAgIHtLX0YxNCwJCUlGX0VCKCJcMDMzWzI2fiIsIEVTQ19TVFIgIlsyNn4iKX0sCisgICAge0tfRjE1LAkJSUZfRUIoIlwwMzNbMjh+IiwgRVNDX1NUUiAiWzI4fiIpfSwJLyogSGVscCAqLworICAgIHtLX0YxNiwJCUlGX0VCKCJcMDMzWzI5fiIsIEVTQ19TVFIgIlsyOX4iKX0sCS8qIFNlbGVjdCAqLworICAgIHtLX0YxNywJCUlGX0VCKCJcMDMzWzMxfiIsIEVTQ19TVFIgIlszMX4iKX0sCisgICAge0tfRjE4LAkJSUZfRUIoIlwwMzNbMzJ+IiwgRVNDX1NUUiAiWzMyfiIpfSwKKyAgICB7S19GMTksCQlJRl9FQigiXDAzM1szM34iLCBFU0NfU1RSICJbMzN+Iil9LAorICAgIHtLX0YyMCwJCUlGX0VCKCJcMDMzWzM0fiIsIEVTQ19TVFIgIlszNH4iKX0sCisgICAge0tfSU5TLAkJSUZfRUIoIlwwMzNbMn4iLCBFU0NfU1RSICJbMn4iKX0sCisgICAge0tfREVMLAkJSUZfRUIoIlwwMzNbM34iLCBFU0NfU1RSICJbM34iKX0sCisgICAge0tfSE9NRSwJCUlGX0VCKCJcMDMzWzF+IiwgRVNDX1NUUiAiWzF+Iil9LAorICAgIHtLX0VORCwJCUlGX0VCKCJcMDMzWzR+IiwgRVNDX1NUUiAiWzR+Iil9LAorICAgIHtLX1BBR0VVUCwJCUlGX0VCKCJcMDMzWzV+IiwgRVNDX1NUUiAiWzV+Iil9LAorICAgIHtLX1BBR0VET1dOLAlJRl9FQigiXDAzM1s2fiIsIEVTQ19TVFIgIls2fiIpfSwKKyAgICB7S19LUExVUywJCUlGX0VCKCJcMDMzT2siLCBFU0NfU1RSICJPayIpfSwJLyoga2V5cGFkIHBsdXMgKi8KKyAgICB7S19LTUlOVVMsCQlJRl9FQigiXDAzM09tIiwgRVNDX1NUUiAiT20iKX0sCS8qIGtleXBhZCBtaW51cyAqLworICAgIHtLX0tESVZJREUsCQlJRl9FQigiXDAzM09vIiwgRVNDX1NUUiAiT28iKX0sCS8qIGtleXBhZCAvICovCisgICAge0tfS01VTFRJUExZLAlJRl9FQigiXDAzM09qIiwgRVNDX1NUUiAiT2oiKX0sCS8qIGtleXBhZCAqICovCisgICAge0tfS0VOVEVSLAkJSUZfRUIoIlwwMzNPTSIsIEVTQ19TVFIgIk9NIil9LAkvKiBrZXlwYWQgRW50ZXIgKi8KKyAgICB7S19CUywJCSJceDdmIn0sCS8qIGZvciBzb21lIHJlYXNvbiAwMTc3IGRvZXNuJ3Qgd29yayAqLworIyBlbmRpZgorCisjIGlmIGRlZmluZWQoQUxMX0JVSUxUSU5fVENBUFMpIHx8IGRlZmluZWQoX19NSU5UX18pCisvKgorICogT3JkaW5hcnkgdnQ1MgorICovCisgICAgeyhpbnQpS1NfTkFNRSwJInZ0NTIifSwKKyAgICB7KGludClLU19DRSwJSUZfRUIoIlwwMzNLIiwgRVNDX1NUUiAiSyIpfSwKKyAgICB7KGludClLU19DRCwJSUZfRUIoIlwwMzNKIiwgRVNDX1NUUiAiSiIpfSwKKyAgICB7KGludClLU19DTSwJSUZfRUIoIlwwMzNZJSsgJSsgIiwgRVNDX1NUUiAiWSUrICUrICIpfSwKKyAgICB7KGludClLU19MRSwJIlxiIn0sCisjICBpZmRlZiBfX01JTlRfXworICAgIHsoaW50KUtTX0FMLAlJRl9FQigiXDAzM0wiLCBFU0NfU1RSICJMIil9LAorICAgIHsoaW50KUtTX0RMLAlJRl9FQigiXDAzM00iLCBFU0NfU1RSICJNIil9LAorICAgIHsoaW50KUtTX0NMLAlJRl9FQigiXDAzM0UiLCBFU0NfU1RSICJFIil9LAorICAgIHsoaW50KUtTX1NSLAlJRl9FQigiXDAzM0kiLCBFU0NfU1RSICJJIil9LAorICAgIHsoaW50KUtTX1ZFLAlJRl9FQigiXDAzM2UiLCBFU0NfU1RSICJlIil9LAorICAgIHsoaW50KUtTX1ZJLAlJRl9FQigiXDAzM2YiLCBFU0NfU1RSICJmIil9LAorICAgIHsoaW50KUtTX1NPLAlJRl9FQigiXDAzM3AiLCBFU0NfU1RSICJwIil9LAorICAgIHsoaW50KUtTX1NFLAlJRl9FQigiXDAzM3EiLCBFU0NfU1RSICJxIil9LAorICAgIHtLX1VQLAkJSUZfRUIoIlwwMzNBIiwgRVNDX1NUUiAiQSIpfSwKKyAgICB7S19ET1dOLAkJSUZfRUIoIlwwMzNCIiwgRVNDX1NUUiAiQiIpfSwKKyAgICB7S19MRUZULAkJSUZfRUIoIlwwMzNEIiwgRVNDX1NUUiAiRCIpfSwKKyAgICB7S19SSUdIVCwJCUlGX0VCKCJcMDMzQyIsIEVTQ19TVFIgIkMiKX0sCisgICAge0tfU19VUCwJCUlGX0VCKCJcMDMzYSIsIEVTQ19TVFIgImEiKX0sCisgICAge0tfU19ET1dOLAkJSUZfRUIoIlwwMzNiIiwgRVNDX1NUUiAiYiIpfSwKKyAgICB7S19TX0xFRlQsCQlJRl9FQigiXDAzM2QiLCBFU0NfU1RSICJkIil9LAorICAgIHtLX1NfUklHSFQsCQlJRl9FQigiXDAzM2MiLCBFU0NfU1RSICJjIil9LAorICAgIHtLX0YxLAkJSUZfRUIoIlwwMzNQIiwgRVNDX1NUUiAiUCIpfSwKKyAgICB7S19GMiwJCUlGX0VCKCJcMDMzUSIsIEVTQ19TVFIgIlEiKX0sCisgICAge0tfRjMsCQlJRl9FQigiXDAzM1IiLCBFU0NfU1RSICJSIil9LAorICAgIHtLX0Y0LAkJSUZfRUIoIlwwMzNTIiwgRVNDX1NUUiAiUyIpfSwKKyAgICB7S19GNSwJCUlGX0VCKCJcMDMzVCIsIEVTQ19TVFIgIlQiKX0sCisgICAge0tfRjYsCQlJRl9FQigiXDAzM1UiLCBFU0NfU1RSICJVIil9LAorICAgIHtLX0Y3LAkJSUZfRUIoIlwwMzNWIiwgRVNDX1NUUiAiViIpfSwKKyAgICB7S19GOCwJCUlGX0VCKCJcMDMzVyIsIEVTQ19TVFIgIlciKX0sCisgICAge0tfRjksCQlJRl9FQigiXDAzM1giLCBFU0NfU1RSICJYIil9LAorICAgIHtLX0YxMCwJCUlGX0VCKCJcMDMzWSIsIEVTQ19TVFIgIlkiKX0sCisgICAge0tfU19GMSwJCUlGX0VCKCJcMDMzcCIsIEVTQ19TVFIgInAiKX0sCisgICAge0tfU19GMiwJCUlGX0VCKCJcMDMzcSIsIEVTQ19TVFIgInEiKX0sCisgICAge0tfU19GMywJCUlGX0VCKCJcMDMzciIsIEVTQ19TVFIgInIiKX0sCisgICAge0tfU19GNCwJCUlGX0VCKCJcMDMzcyIsIEVTQ19TVFIgInMiKX0sCisgICAge0tfU19GNSwJCUlGX0VCKCJcMDMzdCIsIEVTQ19TVFIgInQiKX0sCisgICAge0tfU19GNiwJCUlGX0VCKCJcMDMzdSIsIEVTQ19TVFIgInUiKX0sCisgICAge0tfU19GNywJCUlGX0VCKCJcMDMzdiIsIEVTQ19TVFIgInYiKX0sCisgICAge0tfU19GOCwJCUlGX0VCKCJcMDMzdyIsIEVTQ19TVFIgInciKX0sCisgICAge0tfU19GOSwJCUlGX0VCKCJcMDMzeCIsIEVTQ19TVFIgIngiKX0sCisgICAge0tfU19GMTAsCQlJRl9FQigiXDAzM3kiLCBFU0NfU1RSICJ5Iil9LAorICAgIHtLX0lOUywJCUlGX0VCKCJcMDMzSSIsIEVTQ19TVFIgIkkiKX0sCisgICAge0tfSE9NRSwJCUlGX0VCKCJcMDMzRSIsIEVTQ19TVFIgIkUiKX0sCisgICAge0tfUEFHRURPV04sCUlGX0VCKCJcMDMzYiIsIEVTQ19TVFIgImIiKX0sCisgICAge0tfUEFHRVVQLAkJSUZfRUIoIlwwMzNhIiwgRVNDX1NUUiAiYSIpfSwKKyMgIGVsc2UKKyAgICB7KGludClLU19BTCwJSUZfRUIoIlwwMzNUIiwgRVNDX1NUUiAiVCIpfSwKKyAgICB7KGludClLU19ETCwJSUZfRUIoIlwwMzNVIiwgRVNDX1NUUiAiVSIpfSwKKyAgICB7KGludClLU19DTCwJSUZfRUIoIlwwMzNIXDAzM0oiLCBFU0NfU1RSICJIIiBFU0NfU1RSX25jICJKIil9LAorICAgIHsoaW50KUtTX01FLAlJRl9FQigiXDAzM1NPIiwgRVNDX1NUUiAiU08iKX0sCisgICAgeyhpbnQpS1NfTVIsCUlGX0VCKCJcMDMzUzIiLCBFU0NfU1RSICJTMiIpfSwKKyAgICB7KGludClLU19NUywJInkifSwKKyMgIGVuZGlmCisjIGVuZGlmCisKKyMgaWYgZGVmaW5lZChVTklYKSB8fCBkZWZpbmVkKEFMTF9CVUlMVElOX1RDQVBTKSB8fCBkZWZpbmVkKFNPTUVfQlVJTFRJTl9UQ0FQUykgfHwgZGVmaW5lZChfX0VNWF9fKQorLyoKKyAqIFRoZSB4dGVybSB0ZXJtY2FwIGlzIG1pc3NpbmcgRjE0IGFuZCBGMTUsIGJlY2F1c2UgdGhleSBzZW5kIHRoZSBzYW1lCisgKiBjb2RlcyBhcyB0aGUgdW5kbyBhbmQgaGVscCBrZXksIGFsdGhvdWdoIHRoZXkgZG9uJ3Qgd29yayBvbiBhbGwga2V5Ym9hcmRzLgorICovCisgICAgeyhpbnQpS1NfTkFNRSwJInh0ZXJtIn0sCisgICAgeyhpbnQpS1NfQ0UsCUlGX0VCKCJcMDMzW0siLCBFU0NfU1RSICJbSyIpfSwKKyAgICB7KGludClLU19BTCwJSUZfRUIoIlwwMzNbTCIsIEVTQ19TVFIgIltMIil9LAorIyAgaWZkZWYgVEVSTUlORk8KKyAgICB7KGludClLU19DQUwsCUlGX0VCKCJcMDMzWyVwMSVkTCIsIEVTQ19TVFIgIlslcDElZEwiKX0sCisjICBlbHNlCisgICAgeyhpbnQpS1NfQ0FMLAlJRl9FQigiXDAzM1slZEwiLCBFU0NfU1RSICJbJWRMIil9LAorIyAgZW5kaWYKKyAgICB7KGludClLU19ETCwJSUZfRUIoIlwwMzNbTSIsIEVTQ19TVFIgIltNIil9LAorIyAgaWZkZWYgVEVSTUlORk8KKyAgICB7KGludClLU19DREwsCUlGX0VCKCJcMDMzWyVwMSVkTSIsIEVTQ19TVFIgIlslcDElZE0iKX0sCisjICBlbHNlCisgICAgeyhpbnQpS1NfQ0RMLAlJRl9FQigiXDAzM1slZE0iLCBFU0NfU1RSICJbJWRNIil9LAorIyAgZW5kaWYKKyMgIGlmZGVmIFRFUk1JTkZPCisgICAgeyhpbnQpS1NfQ1MsCUlGX0VCKCJcMDMzWyVpJXAxJWQ7JXAyJWRyIiwKKwkJCQkJCSAgRVNDX1NUUiAiWyVpJXAxJWQ7JXAyJWRyIil9LAorIyAgZWxzZQorICAgIHsoaW50KUtTX0NTLAlJRl9FQigiXDAzM1slaSVkOyVkciIsIEVTQ19TVFIgIlslaSVkOyVkciIpfSwKKyMgIGVuZGlmCisgICAgeyhpbnQpS1NfQ0wsCUlGX0VCKCJcMDMzW0hcMDMzWzJKIiwgRVNDX1NUUiAiW0giIEVTQ19TVFJfbmMgIlsySiIpfSwKKyAgICB7KGludClLU19DRCwJSUZfRUIoIlwwMzNbSiIsIEVTQ19TVFIgIltKIil9LAorICAgIHsoaW50KUtTX01FLAlJRl9FQigiXDAzM1ttIiwgRVNDX1NUUiAiW20iKX0sCisgICAgeyhpbnQpS1NfTVIsCUlGX0VCKCJcMDMzWzdtIiwgRVNDX1NUUiAiWzdtIil9LAorICAgIHsoaW50KUtTX01ELAlJRl9FQigiXDAzM1sxbSIsIEVTQ19TVFIgIlsxbSIpfSwKKyAgICB7KGludClLU19VRSwJSUZfRUIoIlwwMzNbbSIsIEVTQ19TVFIgIlttIil9LAorICAgIHsoaW50KUtTX1VTLAlJRl9FQigiXDAzM1s0bSIsIEVTQ19TVFIgIls0bSIpfSwKKyAgICB7KGludClLU19NUywJInkifSwKKyAgICB7KGludClLU19VVCwJInkifSwKKyAgICB7KGludClLU19MRSwJIlxiIn0sCisjICBpZmRlZiBURVJNSU5GTworICAgIHsoaW50KUtTX0NNLAlJRl9FQigiXDAzM1slaSVwMSVkOyVwMiVkSCIsCisJCQkJCQkgIEVTQ19TVFIgIlslaSVwMSVkOyVwMiVkSCIpfSwKKyMgIGVsc2UKKyAgICB7KGludClLU19DTSwJSUZfRUIoIlwwMzNbJWklZDslZEgiLCBFU0NfU1RSICJbJWklZDslZEgiKX0sCisjICBlbmRpZgorICAgIHsoaW50KUtTX1NSLAlJRl9FQigiXDAzM00iLCBFU0NfU1RSICJNIil9LAorIyAgaWZkZWYgVEVSTUlORk8KKyAgICB7KGludClLU19DUkksCUlGX0VCKCJcMDMzWyVwMSVkQyIsIEVTQ19TVFIgIlslcDElZEMiKX0sCisjICBlbHNlCisgICAgeyhpbnQpS1NfQ1JJLAlJRl9FQigiXDAzM1slZEMiLCBFU0NfU1RSICJbJWRDIil9LAorIyAgZW5kaWYKKyAgICB7KGludClLU19LUywJSUZfRUIoIlwwMzNbPzFoXDAzMz0iLCBFU0NfU1RSICJbPzFoIiBFU0NfU1RSX25jICI9Iil9LAorICAgIHsoaW50KUtTX0tFLAlJRl9FQigiXDAzM1s/MWxcMDMzPiIsIEVTQ19TVFIgIls/MWwiIEVTQ19TVFJfbmMgIj4iKX0sCisjICBpZmRlZiBGRUFUX1hURVJNX1NBVkUKKyAgICB7KGludClLU19USSwJSUZfRUIoIlwwMzM3XDAzM1s/NDdoIiwgRVNDX1NUUiAiNyIgRVNDX1NUUl9uYyAiWz80N2giKX0sCisgICAgeyhpbnQpS1NfVEUsCUlGX0VCKCJcMDMzWzJKXDAzM1s/NDdsXDAzMzgiLAorCQkJCSAgRVNDX1NUUiAiWzJKIiBFU0NfU1RSX25jICJbPzQ3bCIgRVNDX1NUUl9uYyAiOCIpfSwKKyMgIGVuZGlmCisgICAgeyhpbnQpS1NfQ0lTLAlJRl9FQigiXDAzM10xOyIsIEVTQ19TVFIgIl0xOyIpfSwKKyAgICB7KGludClLU19DSUUsCSJcMDA3In0sCisgICAgeyhpbnQpS1NfVFMsCUlGX0VCKCJcMDMzXTI7IiwgRVNDX1NUUiAiXTI7Iil9LAorICAgIHsoaW50KUtTX0ZTLAkiXDAwNyJ9LAorIyAgaWZkZWYgVEVSTUlORk8KKyAgICB7KGludClLU19DV1MsCUlGX0VCKCJcMDMzWzg7JXAxJWQ7JXAyJWR0IiwKKwkJCQkJCSAgRVNDX1NUUiAiWzg7JXAxJWQ7JXAyJWR0Iil9LAorICAgIHsoaW50KUtTX0NXUCwJSUZfRUIoIlwwMzNbMzslcDElZDslcDIlZHQiLAorCQkJCQkJICBFU0NfU1RSICJbMzslcDElZDslcDIlZHQiKX0sCisjICBlbHNlCisgICAgeyhpbnQpS1NfQ1dTLAlJRl9FQigiXDAzM1s4OyVkOyVkdCIsIEVTQ19TVFIgIls4OyVkOyVkdCIpfSwKKyAgICB7KGludClLU19DV1AsCUlGX0VCKCJcMDMzWzM7JWQ7JWR0IiwgRVNDX1NUUiAiWzM7JWQ7JWR0Iil9LAorIyAgZW5kaWYKKyAgICB7KGludClLU19DUlYsCUlGX0VCKCJcMDMzWz5jIiwgRVNDX1NUUiAiWz5jIil9LAorICAgIHtLX1VQLAkJSUZfRUIoIlwwMzNPQSIsIEVTQ19TVFIgIk9BIil9LAorICAgIHtLX0RPV04sCQlJRl9FQigiXDAzM09CIiwgRVNDX1NUUiAiT0IiKX0sCisgICAge0tfUklHSFQsCQlJRl9FQigiXDAzM09DIiwgRVNDX1NUUiAiT0MiKX0sCisgICAge0tfTEVGVCwJCUlGX0VCKCJcMDMzT0QiLCBFU0NfU1RSICJPRCIpfSwKKyAgICB7S19TX1VQLAkJSUZfRUIoIlwwMzNPMkEiLCBFU0NfU1RSICJPMkEiKX0sCisgICAge0tfU19ET1dOLAkJSUZfRUIoIlwwMzNPMkIiLCBFU0NfU1RSICJPMkIiKX0sCisgICAge0tfU19SSUdIVCwJCUlGX0VCKCJcMDMzTzJDIiwgRVNDX1NUUiAiTzJDIil9LAorICAgIHtLX0NfUklHSFQsCQlJRl9FQigiXDAzM081QyIsIEVTQ19TVFIgIk81QyIpfSwKKyAgICB7S19TX0xFRlQsCQlJRl9FQigiXDAzM08yRCIsIEVTQ19TVFIgIk8yRCIpfSwKKyAgICB7S19DX0xFRlQsCQlJRl9FQigiXDAzM081RCIsIEVTQ19TVFIgIk81RCIpfSwKKyAgICAvKiBBbiBleHRyYSBzZXQgb2YgZnVuY3Rpb24ga2V5cyBmb3IgdnQxMDAgbW9kZSAqLworICAgIHtLX1hGMSwJCUlGX0VCKCJcMDMzT1AiLCBFU0NfU1RSICJPUCIpfSwKKyAgICB7S19YRjIsCQlJRl9FQigiXDAzM09RIiwgRVNDX1NUUiAiT1EiKX0sCisgICAge0tfWEYzLAkJSUZfRUIoIlwwMzNPUiIsIEVTQ19TVFIgIk9SIil9LAorICAgIHtLX1hGNCwJCUlGX0VCKCJcMDMzT1MiLCBFU0NfU1RSICJPUyIpfSwKKyAgICB7S19GMSwJCUlGX0VCKCJcMDMzWzExfiIsIEVTQ19TVFIgIlsxMX4iKX0sCisgICAge0tfRjIsCQlJRl9FQigiXDAzM1sxMn4iLCBFU0NfU1RSICJbMTJ+Iil9LAorICAgIHtLX0YzLAkJSUZfRUIoIlwwMzNbMTN+IiwgRVNDX1NUUiAiWzEzfiIpfSwKKyAgICB7S19GNCwJCUlGX0VCKCJcMDMzWzE0fiIsIEVTQ19TVFIgIlsxNH4iKX0sCisgICAge0tfRjUsCQlJRl9FQigiXDAzM1sxNX4iLCBFU0NfU1RSICJbMTV+Iil9LAorICAgIHtLX0Y2LAkJSUZfRUIoIlwwMzNbMTd+IiwgRVNDX1NUUiAiWzE3fiIpfSwKKyAgICB7S19GNywJCUlGX0VCKCJcMDMzWzE4fiIsIEVTQ19TVFIgIlsxOH4iKX0sCisgICAge0tfRjgsCQlJRl9FQigiXDAzM1sxOX4iLCBFU0NfU1RSICJbMTl+Iil9LAorICAgIHtLX0Y5LAkJSUZfRUIoIlwwMzNbMjB+IiwgRVNDX1NUUiAiWzIwfiIpfSwKKyAgICB7S19GMTAsCQlJRl9FQigiXDAzM1syMX4iLCBFU0NfU1RSICJbMjF+Iil9LAorICAgIHtLX0YxMSwJCUlGX0VCKCJcMDMzWzIzfiIsIEVTQ19TVFIgIlsyM34iKX0sCisgICAge0tfRjEyLAkJSUZfRUIoIlwwMzNbMjR+IiwgRVNDX1NUUiAiWzI0fiIpfSwKKyAgICB7S19TX1hGMSwJCUlGX0VCKCJcMDMzTzJQIiwgRVNDX1NUUiAiTzJQIil9LAorICAgIHtLX1NfWEYyLAkJSUZfRUIoIlwwMzNPMlEiLCBFU0NfU1RSICJPMlEiKX0sCisgICAge0tfU19YRjMsCQlJRl9FQigiXDAzM08yUiIsIEVTQ19TVFIgIk8yUiIpfSwKKyAgICB7S19TX1hGNCwJCUlGX0VCKCJcMDMzTzJTIiwgRVNDX1NUUiAiTzJTIil9LAorICAgIHtLX1NfRjEsCQlJRl9FQigiXDAzM1sxMTsyfiIsIEVTQ19TVFIgIlsxMTsyfiIpfSwKKyAgICB7S19TX0YyLAkJSUZfRUIoIlwwMzNbMTI7Mn4iLCBFU0NfU1RSICJbMTI7Mn4iKX0sCisgICAge0tfU19GMywJCUlGX0VCKCJcMDMzWzEzOzJ+IiwgRVNDX1NUUiAiWzEzOzJ+Iil9LAorICAgIHtLX1NfRjQsCQlJRl9FQigiXDAzM1sxNDsyfiIsIEVTQ19TVFIgIlsxNDsyfiIpfSwKKyAgICB7S19TX0Y1LAkJSUZfRUIoIlwwMzNbMTU7Mn4iLCBFU0NfU1RSICJbMTU7Mn4iKX0sCisgICAge0tfU19GNiwJCUlGX0VCKCJcMDMzWzE3OzJ+IiwgRVNDX1NUUiAiWzE3OzJ+Iil9LAorICAgIHtLX1NfRjcsCQlJRl9FQigiXDAzM1sxODsyfiIsIEVTQ19TVFIgIlsxODsyfiIpfSwKKyAgICB7S19TX0Y4LAkJSUZfRUIoIlwwMzNbMTk7Mn4iLCBFU0NfU1RSICJbMTk7Mn4iKX0sCisgICAge0tfU19GOSwJCUlGX0VCKCJcMDMzWzIwOzJ+IiwgRVNDX1NUUiAiWzIwOzJ+Iil9LAorICAgIHtLX1NfRjEwLAkJSUZfRUIoIlwwMzNbMjE7Mn4iLCBFU0NfU1RSICJbMjE7Mn4iKX0sCisgICAge0tfU19GMTEsCQlJRl9FQigiXDAzM1syMzsyfiIsIEVTQ19TVFIgIlsyMzsyfiIpfSwKKyAgICB7S19TX0YxMiwJCUlGX0VCKCJcMDMzWzI0OzJ+IiwgRVNDX1NUUiAiWzI0OzJ+Iil9LAorICAgIHtLX1NfVEFCLAkJSUZfRUIoIlwwMzNbWiIsIEVTQ19TVFIgIltaIil9LAorICAgIHtLX0hFTFAsCQlJRl9FQigiXDAzM1syOH4iLCBFU0NfU1RSICJbMjh+Iil9LAorICAgIHtLX1VORE8sCQlJRl9FQigiXDAzM1syNn4iLCBFU0NfU1RSICJbMjZ+Iil9LAorICAgIHtLX0lOUywJCUlGX0VCKCJcMDMzWzJ+IiwgRVNDX1NUUiAiWzJ+Iil9LAorICAgIHtLX0hPTUUsCQlJRl9FQigiXDAzM1s3fiIsIEVTQ19TVFIgIls3fiIpfSwKKyAgICB7S19TX0hPTUUsCQlJRl9FQigiXDAzM08ySCIsIEVTQ19TVFIgIk8ySCIpfSwKKyAgICB7S19DX0hPTUUsCQlJRl9FQigiXDAzM081SCIsIEVTQ19TVFIgIk81SCIpfSwKKyAgICB7S19LSE9NRSwJCUlGX0VCKCJcMDMzWzF+IiwgRVNDX1NUUiAiWzF+Iil9LAorICAgIHtLX1hIT01FLAkJSUZfRUIoIlwwMzNPSCIsIEVTQ19TVFIgIk9IIil9LAkvKiBhbHRlcm5hdGUgSG9tZSAqLworICAgIHtLX0VORCwJCUlGX0VCKCJcMDMzWzh+IiwgRVNDX1NUUiAiWzh+Iil9LAorICAgIHtLX1NfRU5ELAkJSUZfRUIoIlwwMzNPMkYiLCBFU0NfU1RSICJPMkYiKX0sCisgICAge0tfQ19FTkQsCQlJRl9FQigiXDAzM081RiIsIEVTQ19TVFIgIk81RiIpfSwKKyAgICB7S19LRU5ELAkJSUZfRUIoIlwwMzNbNH4iLCBFU0NfU1RSICJbNH4iKX0sCisgICAge0tfWEVORCwJCUlGX0VCKCJcMDMzT0YiLCBFU0NfU1RSICJPRiIpfSwJLyogYWx0ZXJuYXRlIEVuZCAqLworICAgIHtLX1BBR0VVUCwJCUlGX0VCKCJcMDMzWzV+IiwgRVNDX1NUUiAiWzV+Iil9LAorICAgIHtLX1BBR0VET1dOLAlJRl9FQigiXDAzM1s2fiIsIEVTQ19TVFIgIls2fiIpfSwKKyAgICB7S19LUExVUywJCUlGX0VCKCJcMDMzT2siLCBFU0NfU1RSICJPayIpfSwJLyoga2V5cGFkIHBsdXMgKi8KKyAgICB7S19LTUlOVVMsCQlJRl9FQigiXDAzM09tIiwgRVNDX1NUUiAiT20iKX0sCS8qIGtleXBhZCBtaW51cyAqLworICAgIHtLX0tESVZJREUsCQlJRl9FQigiXDAzM09vIiwgRVNDX1NUUiAiT28iKX0sCS8qIGtleXBhZCAvICovCisgICAge0tfS01VTFRJUExZLAlJRl9FQigiXDAzM09qIiwgRVNDX1NUUiAiT2oiKX0sCS8qIGtleXBhZCAqICovCisgICAge0tfS0VOVEVSLAkJSUZfRUIoIlwwMzNPTSIsIEVTQ19TVFIgIk9NIil9LAkvKiBrZXlwYWQgRW50ZXIgKi8KKyAgICB7S19LREVMLAkJSUZfRUIoIlwwMzNbM34iLCBFU0NfU1RSICJbM34iKX0sCS8qIGtleXBhZCBEZWwgKi8KKworICAgIHtCVF9FWFRSQV9LRVlTLCAgICIifSwKKyAgICB7VEVSTUNBUDJLRVkoJ2snLCAnMCcpLCBJRl9FQigiXDAzM1sxMH4iLCBFU0NfU1RSICJbMTB+Iil9LAkvKiBGMCAqLworICAgIHtURVJNQ0FQMktFWSgnRicsICczJyksIElGX0VCKCJcMDMzWzI1fiIsIEVTQ19TVFIgIlsyNX4iKX0sCS8qIEYxMyAqLworICAgIHtURVJNQ0FQMktFWSgnRicsICc2JyksIElGX0VCKCJcMDMzWzI5fiIsIEVTQ19TVFIgIlsyOX4iKX0sCS8qIEYxNiAqLworICAgIHtURVJNQ0FQMktFWSgnRicsICc3JyksIElGX0VCKCJcMDMzWzMxfiIsIEVTQ19TVFIgIlszMX4iKX0sCS8qIEYxNyAqLworICAgIHtURVJNQ0FQMktFWSgnRicsICc4JyksIElGX0VCKCJcMDMzWzMyfiIsIEVTQ19TVFIgIlszMn4iKX0sCS8qIEYxOCAqLworICAgIHtURVJNQ0FQMktFWSgnRicsICc5JyksIElGX0VCKCJcMDMzWzMzfiIsIEVTQ19TVFIgIlszM34iKX0sCS8qIEYxOSAqLworICAgIHtURVJNQ0FQMktFWSgnRicsICdBJyksIElGX0VCKCJcMDMzWzM0fiIsIEVTQ19TVFIgIlszNH4iKX0sCS8qIEYyMCAqLworIyBlbmRpZgorCisjIGlmIGRlZmluZWQoVU5JWCkgfHwgZGVmaW5lZChBTExfQlVJTFRJTl9UQ0FQUykKKy8qCisgKiBpcmlzLWFuc2kgZm9yIFNpbGljb24gR3JhcGhpY3MgbWFjaGluZXMuCisgKi8KKyAgICB7KGludClLU19OQU1FLAkiaXJpcy1hbnNpIn0sCisgICAgeyhpbnQpS1NfQ0UsCSJcMDMzW0sifSwKKyAgICB7KGludClLU19DRCwJIlwwMzNbSiJ9LAorICAgIHsoaW50KUtTX0FMLAkiXDAzM1tMIn0sCisjICBpZmRlZiBURVJNSU5GTworICAgIHsoaW50KUtTX0NBTCwJIlwwMzNbJXAxJWRMIn0sCisjICBlbHNlCisgICAgeyhpbnQpS1NfQ0FMLAkiXDAzM1slZEwifSwKKyMgIGVuZGlmCisgICAgeyhpbnQpS1NfREwsCSJcMDMzW00ifSwKKyMgIGlmZGVmIFRFUk1JTkZPCisgICAgeyhpbnQpS1NfQ0RMLAkiXDAzM1slcDElZE0ifSwKKyMgIGVsc2UKKyAgICB7KGludClLU19DREwsCSJcMDMzWyVkTSJ9LAorIyAgZW5kaWYKKyNpZiAwCS8qIFRoZSBzY3JvbGwgcmVnaW9uIGlzIG5vdCB3b3JraW5nIGFzIFZpbSBleHBlY3RzLiAqLworIyAgaWZkZWYgVEVSTUlORk8KKyAgICB7KGludClLU19DUywJIlwwMzNbJWklcDElZDslcDIlZHIifSwKKyMgIGVsc2UKKyAgICB7KGludClLU19DUywJIlwwMzNbJWklZDslZHIifSwKKyMgIGVuZGlmCisjZW5kaWYKKyAgICB7KGludClLU19DTCwJIlwwMzNbSFwwMzNbMkoifSwKKyAgICB7KGludClLU19WRSwJIlwwMzNbOS95XDAzM1sxMi95In0sCS8qIFRoZXNlIGFyZW4ndCBkb2N1bWVudGVkICovCisgICAgeyhpbnQpS1NfVlMsCSJcMDMzWzEwL3lcMDMzWz0xaFwwMzNbPTJsIn0sIC8qIFRoZXNlIGFyZW4ndCBkb2N1bWVudGVkICovCisgICAgeyhpbnQpS1NfVEksCSJcMDMzWz02aCJ9LAorICAgIHsoaW50KUtTX1RFLAkiXDAzM1s9NmwifSwKKyAgICB7KGludClLU19TRSwJIlwwMzNbMjE7MjdtIn0sCisgICAgeyhpbnQpS1NfU08sCSJcMDMzWzE7N20ifSwKKyAgICB7KGludClLU19NRSwJIlwwMzNbbSJ9LAorICAgIHsoaW50KUtTX01SLAkiXDAzM1s3bSJ9LAorICAgIHsoaW50KUtTX01ELAkiXDAzM1sxbSJ9LAorICAgIHsoaW50KUtTX0NDTywJIjgifSwJCQkvKiBhbGxvdyA4IGNvbG9ycyAqLworICAgIHsoaW50KUtTX0NaSCwJIlwwMzNbM20ifSwJCS8qIGl0YWxpYyBtb2RlIG9uICovCisgICAgeyhpbnQpS1NfQ1pSLAkiXDAzM1syM20ifSwJCS8qIGl0YWxpYyBtb2RlIG9mZiAqLworICAgIHsoaW50KUtTX1VTLAkiXDAzM1s0bSJ9LAkJLyogdW5kZXJsaW5lIG9uICovCisgICAgeyhpbnQpS1NfVUUsCSJcMDMzWzI0bSJ9LAkJLyogdW5kZXJsaW5lIG9mZiAqLworIyAgaWZkZWYgVEVSTUlORk8KKyAgICB7KGludClLU19DQUIsCSJcMDMzWzQlcDElZG0ifSwgICAgLyogc2V0IGJhY2tncm91bmQgY29sb3IgKEFOU0kpICovCisgICAgeyhpbnQpS1NfQ0FGLAkiXDAzM1szJXAxJWRtIn0sICAgIC8qIHNldCBmb3JlZ3JvdW5kIGNvbG9yIChBTlNJKSAqLworICAgIHsoaW50KUtTX0NTQiwJIlwwMzNbMTAyOyVwMSVkbSJ9LCAvKiBzZXQgc2NyZWVuIGJhY2tncm91bmQgY29sb3IgKi8KKyAgICB7KGludClLU19DU0YsCSJcMDMzWzEwMTslcDElZG0ifSwgLyogc2V0IHNjcmVlbiBmb3JlZ3JvdW5kIGNvbG9yICovCisjICBlbHNlCisgICAgeyhpbnQpS1NfQ0FCLAkiXDAzM1s0JWRtIn0sCSAgICAvKiBzZXQgYmFja2dyb3VuZCBjb2xvciAoQU5TSSkgKi8KKyAgICB7KGludClLU19DQUYsCSJcMDMzWzMlZG0ifSwJICAgIC8qIHNldCBmb3JlZ3JvdW5kIGNvbG9yIChBTlNJKSAqLworICAgIHsoaW50KUtTX0NTQiwJIlwwMzNbMTAyOyVkbSJ9LCAgICAvKiBzZXQgc2NyZWVuIGJhY2tncm91bmQgY29sb3IgKi8KKyAgICB7KGludClLU19DU0YsCSJcMDMzWzEwMTslZG0ifSwgICAgLyogc2V0IHNjcmVlbiBmb3JlZ3JvdW5kIGNvbG9yICovCisjICBlbmRpZgorICAgIHsoaW50KUtTX01TLAkieSJ9LAkJLyogZ3Vlc3NlZCAqLworICAgIHsoaW50KUtTX1VULAkieSJ9LAkJLyogZ3Vlc3NlZCAqLworICAgIHsoaW50KUtTX0xFLAkiXGIifSwKKyMgIGlmZGVmIFRFUk1JTkZPCisgICAgeyhpbnQpS1NfQ00sCSJcMDMzWyVpJXAxJWQ7JXAyJWRIIn0sCisjICBlbHNlCisgICAgeyhpbnQpS1NfQ00sCSJcMDMzWyVpJWQ7JWRIIn0sCisjICBlbmRpZgorICAgIHsoaW50KUtTX1NSLAkiXDAzM00ifSwKKyMgIGlmZGVmIFRFUk1JTkZPCisgICAgeyhpbnQpS1NfQ1JJLAkiXDAzM1slcDElZEMifSwKKyMgIGVsc2UKKyAgICB7KGludClLU19DUkksCSJcMDMzWyVkQyJ9LAorIyAgZW5kaWYKKyAgICB7KGludClLU19DSVMsCSJcMDMzUDMueSJ9LAorICAgIHsoaW50KUtTX0NJRSwJIlwyMzQifSwgICAgLyogU1QgIlN0cmluZyBUZXJtaW5hdG9yIiAqLworICAgIHsoaW50KUtTX1RTLAkiXDAzM1AxLnkifSwKKyAgICB7KGludClLU19GUywJIlwyMzQifSwgICAgLyogU1QgIlN0cmluZyBUZXJtaW5hdG9yIiAqLworIyAgaWZkZWYgVEVSTUlORk8KKyAgICB7KGludClLU19DV1MsCSJcMDMzWzIwMzslcDElZDslcDIlZC95In0sCisgICAgeyhpbnQpS1NfQ1dQLAkiXDAzM1syMDU7JXAxJWQ7JXAyJWQveSJ9LAorIyAgZWxzZQorICAgIHsoaW50KUtTX0NXUywJIlwwMzNbMjAzOyVkOyVkL3kifSwKKyAgICB7KGludClLU19DV1AsCSJcMDMzWzIwNTslZDslZC95In0sCisjICBlbmRpZgorICAgIHtLX1VQLAkJIlwwMzNbQSJ9LAorICAgIHtLX0RPV04sCQkiXDAzM1tCIn0sCisgICAge0tfTEVGVCwJCSJcMDMzW0QifSwKKyAgICB7S19SSUdIVCwJCSJcMDMzW0MifSwKKyAgICB7S19TX1VQLAkJIlwwMzNbMTYxcSJ9LAorICAgIHtLX1NfRE9XTiwJCSJcMDMzWzE2NHEifSwKKyAgICB7S19TX0xFRlQsCQkiXDAzM1sxNThxIn0sCisgICAge0tfU19SSUdIVCwJCSJcMDMzWzE2N3EifSwKKyAgICB7S19GMSwJCSJcMDMzWzAwMXEifSwKKyAgICB7S19GMiwJCSJcMDMzWzAwMnEifSwKKyAgICB7S19GMywJCSJcMDMzWzAwM3EifSwKKyAgICB7S19GNCwJCSJcMDMzWzAwNHEifSwKKyAgICB7S19GNSwJCSJcMDMzWzAwNXEifSwKKyAgICB7S19GNiwJCSJcMDMzWzAwNnEifSwKKyAgICB7S19GNywJCSJcMDMzWzAwN3EifSwKKyAgICB7S19GOCwJCSJcMDMzWzAwOHEifSwKKyAgICB7S19GOSwJCSJcMDMzWzAwOXEifSwKKyAgICB7S19GMTAsCQkiXDAzM1swMTBxIn0sCisgICAge0tfRjExLAkJIlwwMzNbMDExcSJ9LAorICAgIHtLX0YxMiwJCSJcMDMzWzAxMnEifSwKKyAgICB7S19TX0YxLAkJIlwwMzNbMDEzcSJ9LAorICAgIHtLX1NfRjIsCQkiXDAzM1swMTRxIn0sCisgICAge0tfU19GMywJCSJcMDMzWzAxNXEifSwKKyAgICB7S19TX0Y0LAkJIlwwMzNbMDE2cSJ9LAorICAgIHtLX1NfRjUsCQkiXDAzM1swMTdxIn0sCisgICAge0tfU19GNiwJCSJcMDMzWzAxOHEifSwKKyAgICB7S19TX0Y3LAkJIlwwMzNbMDE5cSJ9LAorICAgIHtLX1NfRjgsCQkiXDAzM1swMjBxIn0sCisgICAge0tfU19GOSwJCSJcMDMzWzAyMXEifSwKKyAgICB7S19TX0YxMCwJCSJcMDMzWzAyMnEifSwKKyAgICB7S19TX0YxMSwJCSJcMDMzWzAyM3EifSwKKyAgICB7S19TX0YxMiwJCSJcMDMzWzAyNHEifSwKKyAgICB7S19JTlMsCQkiXDAzM1sxMzlxIn0sCisgICAge0tfSE9NRSwJCSJcMDMzW0gifSwKKyAgICB7S19FTkQsCQkiXDAzM1sxNDZxIn0sCisgICAge0tfUEFHRVVQLAkJIlwwMzNbMTUwcSJ9LAorICAgIHtLX1BBR0VET1dOLAkiXDAzM1sxNTRxIn0sCisjIGVuZGlmCisKKyMgaWYgZGVmaW5lZChERUJVRykgfHwgZGVmaW5lZChBTExfQlVJTFRJTl9UQ0FQUykKKy8qCisgKiBmb3IgZGVidWdnaW5nCisgKi8KKyAgICB7KGludClLU19OQU1FLAkiZGVidWcifSwKKyAgICB7KGludClLU19DRSwJIltDRV0ifSwKKyAgICB7KGludClLU19DRCwJIltDRF0ifSwKKyAgICB7KGludClLU19BTCwJIltBTF0ifSwKKyMgIGlmZGVmIFRFUk1JTkZPCisgICAgeyhpbnQpS1NfQ0FMLAkiW0NBTCVwMSVkXSJ9LAorIyAgZWxzZQorICAgIHsoaW50KUtTX0NBTCwJIltDQUwlZF0ifSwKKyMgIGVuZGlmCisgICAgeyhpbnQpS1NfREwsCSJbRExdIn0sCisjICBpZmRlZiBURVJNSU5GTworICAgIHsoaW50KUtTX0NETCwJIltDREwlcDElZF0ifSwKKyMgIGVsc2UKKyAgICB7KGludClLU19DREwsCSJbQ0RMJWRdIn0sCisjICBlbmRpZgorIyAgaWZkZWYgVEVSTUlORk8KKyAgICB7KGludClLU19DUywJIlslcDElZENTJXAyJWRdIn0sCisjICBlbHNlCisgICAgeyhpbnQpS1NfQ1MsCSJbJWRDUyVkXSJ9LAorIyAgZW5kaWYKKyMgIGlmZGVmIEZFQVRfVkVSVFNQTElUCisjICAgaWZkZWYgVEVSTUlORk8KKyAgICB7KGludClLU19DU1YsCSJbJXAxJWRDU1YlcDIlZF0ifSwKKyMgICBlbHNlCisgICAgeyhpbnQpS1NfQ1NWLAkiWyVkQ1NWJWRdIn0sCisjICAgZW5kaWYKKyMgIGVuZGlmCisjICBpZmRlZiBURVJNSU5GTworICAgIHsoaW50KUtTX0NBQiwJIltDQUIlcDElZF0ifSwKKyAgICB7KGludClLU19DQUYsCSJbQ0FGJXAxJWRdIn0sCisgICAgeyhpbnQpS1NfQ1NCLAkiW0NTQiVwMSVkXSJ9LAorICAgIHsoaW50KUtTX0NTRiwJIltDU0YlcDElZF0ifSwKKyMgIGVsc2UKKyAgICB7KGludClLU19DQUIsCSJbQ0FCJWRdIn0sCisgICAgeyhpbnQpS1NfQ0FGLAkiW0NBRiVkXSJ9LAorICAgIHsoaW50KUtTX0NTQiwJIltDU0IlZF0ifSwKKyAgICB7KGludClLU19DU0YsCSJbQ1NGJWRdIn0sCisjICBlbmRpZgorICAgIHsoaW50KUtTX09QLAkiW09QXSJ9LAorICAgIHsoaW50KUtTX0xFLAkiW0xFXSJ9LAorICAgIHsoaW50KUtTX0NMLAkiW0NMXSJ9LAorICAgIHsoaW50KUtTX1ZJLAkiW1ZJXSJ9LAorICAgIHsoaW50KUtTX1ZFLAkiW1ZFXSJ9LAorICAgIHsoaW50KUtTX1ZTLAkiW1ZTXSJ9LAorICAgIHsoaW50KUtTX01FLAkiW01FXSJ9LAorICAgIHsoaW50KUtTX01SLAkiW01SXSJ9LAorICAgIHsoaW50KUtTX01CLAkiW01CXSJ9LAorICAgIHsoaW50KUtTX01ELAkiW01EXSJ9LAorICAgIHsoaW50KUtTX1NFLAkiW1NFXSJ9LAorICAgIHsoaW50KUtTX1NPLAkiW1NPXSJ9LAorICAgIHsoaW50KUtTX1VFLAkiW1VFXSJ9LAorICAgIHsoaW50KUtTX1VTLAkiW1VTXSJ9LAorICAgIHsoaW50KUtTX01TLAkiW01TXSJ9LAorICAgIHsoaW50KUtTX1VULAkiW1VUXSJ9LAorIyAgaWZkZWYgVEVSTUlORk8KKyAgICB7KGludClLU19DTSwJIlslcDElZENNJXAyJWRdIn0sCisjICBlbHNlCisgICAgeyhpbnQpS1NfQ00sCSJbJWRDTSVkXSJ9LAorIyAgZW5kaWYKKyAgICB7KGludClLU19TUiwJIltTUl0ifSwKKyMgIGlmZGVmIFRFUk1JTkZPCisgICAgeyhpbnQpS1NfQ1JJLAkiW0NSSSVwMSVkXSJ9LAorIyAgZWxzZQorICAgIHsoaW50KUtTX0NSSSwJIltDUkklZF0ifSwKKyMgIGVuZGlmCisgICAgeyhpbnQpS1NfVkIsCSJbVkJdIn0sCisgICAgeyhpbnQpS1NfS1MsCSJbS1NdIn0sCisgICAgeyhpbnQpS1NfS0UsCSJbS0VdIn0sCisgICAgeyhpbnQpS1NfVEksCSJbVEldIn0sCisgICAgeyhpbnQpS1NfVEUsCSJbVEVdIn0sCisgICAgeyhpbnQpS1NfQ0lTLAkiW0NJU10ifSwKKyAgICB7KGludClLU19DSUUsCSJbQ0lFXSJ9LAorICAgIHsoaW50KUtTX1RTLAkiW1RTXSJ9LAorICAgIHsoaW50KUtTX0ZTLAkiW0ZTXSJ9LAorIyAgaWZkZWYgVEVSTUlORk8KKyAgICB7KGludClLU19DV1MsCSJbJXAxJWRDV1MlcDIlZF0ifSwKKyAgICB7KGludClLU19DV1AsCSJbJXAxJWRDV1AlcDIlZF0ifSwKKyMgIGVsc2UKKyAgICB7KGludClLU19DV1MsCSJbJWRDV1MlZF0ifSwKKyAgICB7KGludClLU19DV1AsCSJbJWRDV1AlZF0ifSwKKyMgIGVuZGlmCisgICAgeyhpbnQpS1NfQ1JWLAkiW0NSVl0ifSwKKyAgICB7S19VUCwJCSJbS1VdIn0sCisgICAge0tfRE9XTiwJCSJbS0RdIn0sCisgICAge0tfTEVGVCwJCSJbS0xdIn0sCisgICAge0tfUklHSFQsCQkiW0tSXSJ9LAorICAgIHtLX1NfVVAsCQkiW1MtS1VdIn0sCisgICAge0tfU19ET1dOLAkJIltTLUtEXSJ9LAorICAgIHtLX1NfTEVGVCwJCSJbUy1LTF0ifSwKKyAgICB7S19DX0xFRlQsCQkiW0MtS0xdIn0sCisgICAge0tfU19SSUdIVCwJCSJbUy1LUl0ifSwKKyAgICB7S19DX1JJR0hULAkJIltDLUtSXSJ9LAorICAgIHtLX0YxLAkJIltGMV0ifSwKKyAgICB7S19YRjEsCQkiW3hGMV0ifSwKKyAgICB7S19GMiwJCSJbRjJdIn0sCisgICAge0tfWEYyLAkJIlt4RjJdIn0sCisgICAge0tfRjMsCQkiW0YzXSJ9LAorICAgIHtLX1hGMywJCSJbeEYzXSJ9LAorICAgIHtLX0Y0LAkJIltGNF0ifSwKKyAgICB7S19YRjQsCQkiW3hGNF0ifSwKKyAgICB7S19GNSwJCSJbRjVdIn0sCisgICAge0tfRjYsCQkiW0Y2XSJ9LAorICAgIHtLX0Y3LAkJIltGN10ifSwKKyAgICB7S19GOCwJCSJbRjhdIn0sCisgICAge0tfRjksCQkiW0Y5XSJ9LAorICAgIHtLX0YxMCwJCSJbRjEwXSJ9LAorICAgIHtLX0YxMSwJCSJbRjExXSJ9LAorICAgIHtLX0YxMiwJCSJbRjEyXSJ9LAorICAgIHtLX1NfRjEsCQkiW1MtRjFdIn0sCisgICAge0tfU19YRjEsCQkiW1MteEYxXSJ9LAorICAgIHtLX1NfRjIsCQkiW1MtRjJdIn0sCisgICAge0tfU19YRjIsCQkiW1MteEYyXSJ9LAorICAgIHtLX1NfRjMsCQkiW1MtRjNdIn0sCisgICAge0tfU19YRjMsCQkiW1MteEYzXSJ9LAorICAgIHtLX1NfRjQsCQkiW1MtRjRdIn0sCisgICAge0tfU19YRjQsCQkiW1MteEY0XSJ9LAorICAgIHtLX1NfRjUsCQkiW1MtRjVdIn0sCisgICAge0tfU19GNiwJCSJbUy1GNl0ifSwKKyAgICB7S19TX0Y3LAkJIltTLUY3XSJ9LAorICAgIHtLX1NfRjgsCQkiW1MtRjhdIn0sCisgICAge0tfU19GOSwJCSJbUy1GOV0ifSwKKyAgICB7S19TX0YxMCwJCSJbUy1GMTBdIn0sCisgICAge0tfU19GMTEsCQkiW1MtRjExXSJ9LAorICAgIHtLX1NfRjEyLAkJIltTLUYxMl0ifSwKKyAgICB7S19IRUxQLAkJIltIRUxQXSJ9LAorICAgIHtLX1VORE8sCQkiW1VORE9dIn0sCisgICAge0tfQlMsCQkiW0JTXSJ9LAorICAgIHtLX0lOUywJCSJbSU5TXSJ9LAorICAgIHtLX0tJTlMsCQkiW0tJTlNdIn0sCisgICAge0tfREVMLAkJIltERUxdIn0sCisgICAge0tfS0RFTCwJCSJbS0RFTF0ifSwKKyAgICB7S19IT01FLAkJIltIT01FXSJ9LAorICAgIHtLX1NfSE9NRSwJCSJbQy1IT01FXSJ9LAorICAgIHtLX0NfSE9NRSwJCSJbQy1IT01FXSJ9LAorICAgIHtLX0tIT01FLAkJIltLSE9NRV0ifSwKKyAgICB7S19YSE9NRSwJCSJbWEhPTUVdIn0sCisgICAge0tfRU5ELAkJIltFTkRdIn0sCisgICAge0tfU19FTkQsCQkiW0MtRU5EXSJ9LAorICAgIHtLX0NfRU5ELAkJIltDLUVORF0ifSwKKyAgICB7S19LRU5ELAkJIltLRU5EXSJ9LAorICAgIHtLX1hFTkQsCQkiW1hFTkRdIn0sCisgICAge0tfUEFHRVVQLAkJIltQQUdFVVBdIn0sCisgICAge0tfUEFHRURPV04sCSJbUEFHRURPV05dIn0sCisgICAge0tfS1BBR0VVUCwJCSJbS1BBR0VVUF0ifSwKKyAgICB7S19LUEFHRURPV04sCSJbS1BBR0VET1dOXSJ9LAorICAgIHtLX01PVVNFLAkJIltNT1VTRV0ifSwKKyAgICB7S19LUExVUywJCSJbS1BMVVNdIn0sCisgICAge0tfS01JTlVTLAkJIltLTUlOVVNdIn0sCisgICAge0tfS0RJVklERSwJCSJbS0RJVklERV0ifSwKKyAgICB7S19LTVVMVElQTFksCSJbS01VTFRJUExZXSJ9LAorICAgIHtLX0tFTlRFUiwJCSJbS0VOVEVSXSJ9LAorICAgIHtLX0tQT0lOVCwJCSJbS1BPSU5UXSJ9LAorICAgIHtLX0swLAkJIltLMF0ifSwKKyAgICB7S19LMSwJCSJbSzFdIn0sCisgICAge0tfSzIsCQkiW0syXSJ9LAorICAgIHtLX0szLAkJIltLM10ifSwKKyAgICB7S19LNCwJCSJbSzRdIn0sCisgICAge0tfSzUsCQkiW0s1XSJ9LAorICAgIHtLX0s2LAkJIltLNl0ifSwKKyAgICB7S19LNywJCSJbSzddIn0sCisgICAge0tfSzgsCQkiW0s4XSJ9LAorICAgIHtLX0s5LAkJIltLOV0ifSwKKyMgZW5kaWYKKworI2VuZGlmIC8qIE5PX0JVSUxUSU5fVENBUFMgKi8KKworLyoKKyAqIFRoZSBtb3N0IG1pbmltYWwgdGVybWluYWw6IG9ubHkgY2xlYXIgc2NyZWVuIGFuZCBjdXJzb3IgcG9zaXRpb25pbmcKKyAqIEFsd2F5cyBpbmNsdWRlZC4KKyAqLworICAgIHsoaW50KUtTX05BTUUsCSJkdW1iIn0sCisgICAgeyhpbnQpS1NfQ0wsCSJcMDE0In0sCisjaWZkZWYgVEVSTUlORk8KKyAgICB7KGludClLU19DTSwJSUZfRUIoIlwwMzNbJWklcDElZDslcDIlZEgiLAorCQkJCQkJICBFU0NfU1RSICJbJWklcDElZDslcDIlZEgiKX0sCisjZWxzZQorICAgIHsoaW50KUtTX0NNLAlJRl9FQigiXDAzM1slaSVkOyVkSCIsIEVTQ19TVFIgIlslaSVkOyVkSCIpfSwKKyNlbmRpZgorCisvKgorICogZW5kIG1hcmtlcgorICovCisgICAgeyhpbnQpS1NfTkFNRSwJTlVMTH0KKworfTsJLyogZW5kIG9mIGJ1aWx0aW5fdGVybWNhcHMgKi8KKworLyoKKyAqIERFRkFVTFRfVEVSTSBpcyB1c2VkLCB3aGVuIG5vIHRlcm1pbmFsIGlzIHNwZWNpZmllZCB3aXRoIC1UIG9wdGlvbiBvciAkVEVSTS4KKyAqLworI2lmZGVmIFJJU0NPUworIyBkZWZpbmUgREVGQVVMVF9URVJNCShjaGFyX3UgKikicmlzY29zIgorI2VuZGlmCisKKyNpZmRlZiBBTUlHQQorIyBkZWZpbmUgREVGQVVMVF9URVJNCShjaGFyX3UgKikiYW1pZ2EiCisjZW5kaWYKKworI2lmZGVmIE1TV0lOCisjIGRlZmluZSBERUZBVUxUX1RFUk0JKGNoYXJfdSAqKSJ3aW4zMiIKKyNlbmRpZgorCisjaWZkZWYgTVNET1MKKyMgZGVmaW5lIERFRkFVTFRfVEVSTQkoY2hhcl91ICopInBjdGVybSIKKyNlbmRpZgorCisjaWYgZGVmaW5lZChVTklYKSAmJiAhZGVmaW5lZChfX01JTlRfXykKKyMgZGVmaW5lIERFRkFVTFRfVEVSTQkoY2hhcl91ICopImFuc2kiCisjZW5kaWYKKworI2lmZGVmIF9fTUlOVF9fCisjIGRlZmluZSBERUZBVUxUX1RFUk0JKGNoYXJfdSAqKSJ2dDUyIgorI2VuZGlmCisKKyNpZmRlZiBfX0VNWF9fCisjIGRlZmluZSBERUZBVUxUX1RFUk0JKGNoYXJfdSAqKSJvczJhbnNpIgorI2VuZGlmCisKKyNpZmRlZiBWTVMKKyMgZGVmaW5lIERFRkFVTFRfVEVSTQkoY2hhcl91ICopInZ0MzIwIgorI2VuZGlmCisKKyNpZmRlZiBfX0JFT1NfXworIyB1bmRlZiBERUZBVUxUX1RFUk0KKyMgZGVmaW5lIERFRkFVTFRfVEVSTQkoY2hhcl91ICopImJlb3MtYW5zaSIKKyNlbmRpZgorCisjaWZuZGVmIERFRkFVTFRfVEVSTQorIyBkZWZpbmUgREVGQVVMVF9URVJNCShjaGFyX3UgKikiZHVtYiIKKyNlbmRpZgorCisvKgorICogVGVybV9zdHJpbmdzIGNvbnRhaW5zIGN1cnJlbnRseSB1c2VkIHRlcm1pbmFsIG91dHB1dCBzdHJpbmdzLgorICogSXQgaXMgaW5pdGlhbGl6ZWQgd2l0aCB0aGUgZGVmYXVsdCB2YWx1ZXMgYnkgcGFyc2VfYnVpbHRpbl90Y2FwKCkuCisgKiBUaGUgdmFsdWVzIGNhbiBiZSBjaGFuZ2VkIGJ5IHNldHRpbmcgdGhlIG9wdGlvbiB3aXRoIHRoZSBzYW1lIG5hbWUuCisgKi8KK2NoYXJfdSAqKHRlcm1fc3RyaW5nc1soaW50KUtTX0xBU1QgKyAxXSk7CisKK3N0YXRpYyBpbnQJbmVlZF9nYXRoZXIgPSBGQUxTRTsJCS8qIG5lZWQgdG8gZmlsbCB0ZXJtbGVhZGVyW10gKi8KK3N0YXRpYyBjaGFyX3UJdGVybWxlYWRlclsyNTYgKyAxXTsJCS8qIGZvciBjaGVja190ZXJtY29kZSgpICovCisjaWZkZWYgRkVBVF9URVJNUkVTUE9OU0UKK3N0YXRpYyBpbnQJY2hlY2tfZm9yX2NvZGVzID0gRkFMU0U7CS8qIGNoZWNrIGZvciBrZXkgY29kZSByZXBvbnNlICovCisjZW5kaWYKKworICAgIHN0YXRpYyBzdHJ1Y3QgYnVpbHRpbl90ZXJtICoKK2ZpbmRfYnVpbHRpbl90ZXJtKHRlcm0pCisgICAgY2hhcl91CSp0ZXJtOworeworICAgIHN0cnVjdCBidWlsdGluX3Rlcm0gKnA7CisKKyAgICBwID0gYnVpbHRpbl90ZXJtY2FwczsKKyAgICB3aGlsZSAocC0+YnRfc3RyaW5nICE9IE5VTEwpCisgICAgeworCWlmIChwLT5idF9lbnRyeSA9PSAoaW50KUtTX05BTUUpCisJeworI2lmZGVmIFVOSVgKKwkgICAgaWYgKFNUUkNNUChwLT5idF9zdHJpbmcsICJpcmlzLWFuc2kiKSA9PSAwICYmIHZpbV9pc19pcmlzKHRlcm0pKQorCQlyZXR1cm4gcDsKKwkgICAgZWxzZSBpZiAoU1RSQ01QKHAtPmJ0X3N0cmluZywgInh0ZXJtIikgPT0gMCAmJiB2aW1faXNfeHRlcm0odGVybSkpCisJCXJldHVybiBwOworCSAgICBlbHNlCisjZW5kaWYKKyNpZmRlZiBWTVMKKwkJaWYgKFNUUkNNUChwLT5idF9zdHJpbmcsICJ2dDMyMCIpID09IDAgJiYgdmltX2lzX3Z0MzAwKHRlcm0pKQorCQkgICAgcmV0dXJuIHA7CisJCWVsc2UKKyNlbmRpZgorCQkgIGlmIChTVFJDTVAodGVybSwgcC0+YnRfc3RyaW5nKSA9PSAwKQorCQkgICAgcmV0dXJuIHA7CisJfQorCSsrcDsKKyAgICB9CisgICAgcmV0dXJuIHA7Cit9CisKKy8qCisgKiBQYXJzaW5nIG9mIHRoZSBidWlsdGluIHRlcm1jYXAgZW50cmllcy4KKyAqIENhbGxlciBzaG91bGQgY2hlY2sgaWYgJ25hbWUnIGlzIGEgdmFsaWQgYnVpbHRpbiB0ZXJtLgorICogVGhlIHRlcm1pbmFsJ3MgbmFtZSBpcyBub3Qgc2V0LCBhcyB0aGlzIGlzIGFscmVhZHkgZG9uZSBpbiB0ZXJtY2FwaW5pdCgpLgorICovCisgICAgc3RhdGljIHZvaWQKK3BhcnNlX2J1aWx0aW5fdGNhcCh0ZXJtKQorICAgIGNoYXJfdSAgKnRlcm07Cit7CisgICAgc3RydWN0IGJ1aWx0aW5fdGVybQkgICAgKnA7CisgICAgY2hhcl91CQkgICAgbmFtZVsyXTsKKyAgICBpbnQJCQkgICAgdGVybV84Yml0OworCisgICAgcCA9IGZpbmRfYnVpbHRpbl90ZXJtKHRlcm0pOworICAgIHRlcm1fOGJpdCA9IHRlcm1faXNfOGJpdCh0ZXJtKTsKKworICAgIC8qIERvIG5vdCBwYXJzZSBpZiBidWlsdGluIHRlcm0gbm90IGZvdW5kICovCisgICAgaWYgKHAtPmJ0X3N0cmluZyA9PSBOVUxMKQorCXJldHVybjsKKworICAgIGZvciAoKytwOyBwLT5idF9lbnRyeSAhPSAoaW50KUtTX05BTUUgJiYgcC0+YnRfZW50cnkgIT0gQlRfRVhUUkFfS0VZUzsgKytwKQorICAgIHsKKwlpZiAoKGludClwLT5idF9lbnRyeSA+PSAwKQkvKiBLU194eCBlbnRyeSAqLworCXsKKwkgICAgLyogT25seSBzZXQgdGhlIHZhbHVlIGlmIGl0IHdhc24ndCBzZXQgeWV0LiAqLworCSAgICBpZiAodGVybV9zdHJpbmdzW3AtPmJ0X2VudHJ5XSA9PSBOVUxMCisJCQkJIHx8IHRlcm1fc3RyaW5nc1twLT5idF9lbnRyeV0gPT0gZW1wdHlfb3B0aW9uKQorCSAgICB7CisJCS8qIDhiaXQgdGVybWluYWw6IHVzZSBDU0kgaW5zdGVhZCBvZiA8RXNjPlsgKi8KKwkJaWYgKHRlcm1fOGJpdCAmJiB0ZXJtXzd0bzhiaXQoKGNoYXJfdSAqKXAtPmJ0X3N0cmluZykgIT0gMCkKKwkJeworCQkgICAgY2hhcl91ICAqcywgKnQ7CisKKwkJICAgIHMgPSB2aW1fc3Ryc2F2ZSgoY2hhcl91ICopcC0+YnRfc3RyaW5nKTsKKwkJICAgIGlmIChzICE9IE5VTEwpCisJCSAgICB7CisJCQlmb3IgKHQgPSBzOyAqdDsgKyt0KQorCQkJICAgIGlmICh0ZXJtXzd0bzhiaXQodCkpCisJCQkgICAgeworCQkJCSp0ID0gdGVybV83dG84Yml0KHQpOworCQkJCVNUUkNQWSh0ICsgMSwgdCArIDIpOworCQkJICAgIH0KKwkJCXRlcm1fc3RyaW5nc1twLT5idF9lbnRyeV0gPSBzOworCQkJc2V0X3Rlcm1fb3B0aW9uX2FsbG9jZWQoJnRlcm1fc3RyaW5nc1twLT5idF9lbnRyeV0pOworCQkgICAgfQorCQl9CisJCWVsc2UKKwkJICAgIHRlcm1fc3RyaW5nc1twLT5idF9lbnRyeV0gPSAoY2hhcl91ICopcC0+YnRfc3RyaW5nOworCSAgICB9CisJfQorCWVsc2UKKwl7CisJICAgIG5hbWVbMF0gPSBLRVkyVEVSTUNBUDAoKGludClwLT5idF9lbnRyeSk7CisJICAgIG5hbWVbMV0gPSBLRVkyVEVSTUNBUDEoKGludClwLT5idF9lbnRyeSk7CisJICAgIGlmIChmaW5kX3Rlcm1jb2RlKG5hbWUpID09IE5VTEwpCisJCWFkZF90ZXJtY29kZShuYW1lLCAoY2hhcl91ICopcC0+YnRfc3RyaW5nLCB0ZXJtXzhiaXQpOworCX0KKyAgICB9Cit9CisjaWYgZGVmaW5lZChIQVZFX1RHRVRFTlQpIHx8IGRlZmluZWQoRkVBVF9URVJNUkVTUE9OU0UpCitzdGF0aWMgdm9pZCBzZXRfY29sb3JfY291bnQgX19BUkdTKChpbnQgbnIpKTsKKworLyoKKyAqIFNldCBudW1iZXIgb2YgY29sb3JzLgorICogU3RvcmUgaXQgYXMgYSBudW1iZXIgaW4gdF9jb2xvcnMuCisgKiBTdG9yZSBpdCBhcyBhIHN0cmluZyBpbiBUX0NDTyAodXNpbmcgbnJfY29sb3JzW10pLgorICovCisgICAgc3RhdGljIHZvaWQKK3NldF9jb2xvcl9jb3VudChucikKKyAgICBpbnQJCW5yOworeworICAgIGNoYXJfdQlucl9jb2xvcnNbMjBdOwkJLyogc3RyaW5nIGZvciBudW1iZXIgb2YgY29sb3JzICovCisKKyAgICB0X2NvbG9ycyA9IG5yOworICAgIGlmICh0X2NvbG9ycyA+IDEpCisJc3ByaW50ZigoY2hhciAqKW5yX2NvbG9ycywgIiVkIiwgdF9jb2xvcnMpOworICAgIGVsc2UKKwkqbnJfY29sb3JzID0gTlVMOworICAgIHNldF9zdHJpbmdfb3B0aW9uX2RpcmVjdCgoY2hhcl91ICopInRfQ28iLCAtMSwgbnJfY29sb3JzLCBPUFRfRlJFRSk7Cit9CisjZW5kaWYKKworI2lmZGVmIEhBVkVfVEdFVEVOVAorc3RhdGljIGNoYXIgKihrZXlfbmFtZXNbXSkgPQoreworI2lmZGVmIEZFQVRfVEVSTVJFU1BPTlNFCisgICAgLyogRG8gdGhpcyBvbmUgZmlyc3QsIGl0IG1heSBjYXVzZSBhIHNjcmVlbiByZWRyYXcuICovCisgICAgIkNvIiwKKyNlbmRpZgorICAgICJrdSIsICJrZCIsICJrciIsICJrbCIsCisjIGlmZGVmIEFSQ0hJRQorICAgICJzdSIsICJzZCIsCQkvKiBUZXJtY2FwIGNvZGUgbWFkZSB1cCEgKi8KKyMgZW5kaWYKKyAgICAiIzIiLCAiIzQiLCAiJWkiLCAiKjciLAorICAgICJrMSIsICJrMiIsICJrMyIsICJrNCIsICJrNSIsICJrNiIsCisgICAgIms3IiwgIms4IiwgIms5IiwgIms7IiwgIkYxIiwgIkYyIiwKKyAgICAiJTEiLCAiJjgiLCAia2IiLCAia0kiLCAia0QiLCAia2giLAorICAgICJANyIsICJrUCIsICJrTiIsICJLMSIsICJLMyIsICJLNCIsICJLNSIsICJrQiIsCisgICAgTlVMTAorfTsKKyNlbmRpZgorCisvKgorICogU2V0IHRlcm1pbmFsIG9wdGlvbnMgZm9yIHRlcm1pbmFsICJ0ZXJtIi4KKyAqIFJldHVybiBPSyBpZiB0ZXJtaW5hbCAndGVybScgd2FzIGZvdW5kIGluIGEgdGVybWNhcCwgRkFJTCBvdGhlcndpc2UuCisgKgorICogV2hpbGUgZG9pbmcgdGhpcywgdW50aWwgdHRlc3QoKSwgc29tZSBvcHRpb25zIG1heSBiZSBOVUxMLCBiZSBjYXJlZnVsLgorICovCisgICAgaW50CitzZXRfdGVybW5hbWUodGVybSkKKyAgICBjaGFyX3UgKnRlcm07Cit7CisgICAgc3RydWN0IGJ1aWx0aW5fdGVybSAqdGVybXA7CisjaWZkZWYgSEFWRV9UR0VURU5UCisgICAgaW50CQlidWlsdGluX2ZpcnN0ID0gcF90Ymk7CisgICAgaW50CQl0cnk7CisgICAgaW50CQl0ZXJtY2FwX2NsZWFyZWQgPSBGQUxTRTsKKyNlbmRpZgorICAgIGludAkJd2lkdGggPSAwLCBoZWlnaHQgPSAwOworICAgIGNoYXJfdQkqZXJyb3JfbXNnID0gTlVMTDsKKyAgICBjaGFyX3UJKmJzX3AsICpkZWxfcDsKKworICAgIGRldGVjdGVkXzhiaXQgPSBGQUxTRTsJCS8qIHJlc2V0IDgtYml0IGRldGVjdGlvbiAqLworCisgICAgaWYgKHRlcm1faXNfYnVpbHRpbih0ZXJtKSkKKyAgICB7CisJdGVybSArPSA4OworI2lmZGVmIEhBVkVfVEdFVEVOVAorCWJ1aWx0aW5fZmlyc3QgPSAxOworI2VuZGlmCisgICAgfQorCisvKgorICogSWYgSEFWRV9UR0VURU5UIGlzIG5vdCBkZWZpbmVkLCBvbmx5IHRoZSBidWlsdGluIHRlcm1jYXAgaXMgdXNlZCwgb3RoZXJ3aXNlOgorICogICBJZiBidWlsdGluX2ZpcnN0IGlzIFRSVUU6CisgKiAgICAgMC4gdHJ5IGJ1aWx0aW4gdGVybWNhcAorICogICAgIDEuIHRyeSBleHRlcm5hbCB0ZXJtY2FwCisgKiAgICAgMi4gaWYgYm90aCBmYWlsIGRlZmF1bHQgdG8gYSBidWlsdGluIHRlcm1pbmFsCisgKiAgIElmIGJ1aWx0aW5fZmlyc3QgaXMgRkFMU0U6CisgKiAgICAgMS4gdHJ5IGV4dGVybmFsIHRlcm1jYXAKKyAqICAgICAyLiB0cnkgYnVpbHRpbiB0ZXJtY2FwLCBpZiBib3RoIGZhaWwgZGVmYXVsdCB0byBhIGJ1aWx0aW4gdGVybWluYWwKKyAqLworI2lmZGVmIEhBVkVfVEdFVEVOVAorICAgIGZvciAodHJ5ID0gYnVpbHRpbl9maXJzdCA/IDAgOiAxOyB0cnkgPCAzOyArK3RyeSkKKyAgICB7CisJLyoKKwkgKiBVc2UgZXh0ZXJuYWwgdGVybWNhcAorCSAqLworCWlmICh0cnkgPT0gMSkKKwl7CisJICAgIGNoYXJfdQkgICAgKnA7CisJICAgIHN0YXRpYyBjaGFyX3UgICB0c3RyYnVmW1RCVUZTWl07CisJICAgIGludAkJICAgIGk7CisJICAgIGNoYXJfdQkgICAgdGJ1ZltUQlVGU1pdOworCSAgICBjaGFyX3UJICAgICp0cDsKKwkgICAgc3RhdGljIHN0cnVjdCB7CisJCQkgICAgZW51bSBTcGVjaWFsS2V5IGRlc3Q7IC8qIGluZGV4IGluIHRlcm1fc3RyaW5nc1tdICovCisJCQkgICAgY2hhciAqbmFtZTsJCSAgLyogdGVybWNhcCBuYW1lIGZvciBzdHJpbmcgKi8KKwkJCSAgfSBzdHJpbmdfbmFtZXNbXSA9CisJCQkgICAgewl7S1NfQ0UsICJjZSJ9LCB7S1NfQUwsICJhbCJ9LCB7S1NfQ0FMLCJBTCJ9LAorCQkJCXtLU19ETCwgImRsIn0sIHtLU19DREwsIkRMIn0sIHtLU19DUywgImNzIn0sCisJCQkJe0tTX0NMLCAiY2wifSwge0tTX0NELCAiY2QifSwKKwkJCQl7S1NfVkksICJ2aSJ9LCB7S1NfVkUsICJ2ZSJ9LCB7S1NfTUIsICJtYiJ9LAorCQkJCXtLU19WUywgInZzIn0sIHtLU19NRSwgIm1lIn0sIHtLU19NUiwgIm1yIn0sCisJCQkJe0tTX01ELCAibWQifSwge0tTX1NFLCAic2UifSwge0tTX1NPLCAic28ifSwKKwkJCQl7S1NfQ1pILCJaSCJ9LCB7S1NfQ1pSLCJaUiJ9LCB7S1NfVUUsICJ1ZSJ9LAorCQkJCXtLU19VUywgInVzIn0sIHtLU19DTSwgImNtIn0sIHtLU19TUiwgInNyIn0sCisJCQkJe0tTX0NSSSwiUkkifSwge0tTX1ZCLCAidmIifSwge0tTX0tTLCAia3MifSwKKwkJCQl7S1NfS0UsICJrZSJ9LCB7S1NfVEksICJ0aSJ9LCB7S1NfVEUsICJ0ZSJ9LAorCQkJCXtLU19CQywgImJjIn0sIHtLU19DU0IsIlNiIn0sIHtLU19DU0YsIlNmIn0sCisJCQkJe0tTX0NBQiwiQUIifSwge0tTX0NBRiwiQUYifSwge0tTX0xFLCAibGUifSwKKwkJCQl7S1NfTkQsICJuZCJ9LCB7S1NfT1AsICJvcCJ9LCB7S1NfQ1JWLCAiUlYifSwKKwkJCQl7S1NfQ0lTLCAiSVMifSwge0tTX0NJRSwgIklFIn0sCisJCQkJe0tTX1RTLCAidHMifSwge0tTX0ZTLCAiZnMifSwKKwkJCQl7S1NfQ1dQLCAiV1AifSwge0tTX0NXUywgIldTIn0sCisJCQkJeyhlbnVtIFNwZWNpYWxLZXkpMCwgTlVMTH0KKwkJCSAgICB9OworCisJICAgIC8qCisJICAgICAqIElmIHRoZSBleHRlcm5hbCB0ZXJtY2FwIGRvZXMgbm90IGhhdmUgYSBtYXRjaGluZyBlbnRyeSwgdHJ5IHRoZQorCSAgICAgKiBidWlsdGluIG9uZXMuCisJICAgICAqLworCSAgICBpZiAoKGVycm9yX21zZyA9IHRnZXRlbnRfZXJyb3IodGJ1ZiwgdGVybSkpID09IE5VTEwpCisJICAgIHsKKwkJdHAgPSB0c3RyYnVmOworCQlpZiAoIXRlcm1jYXBfY2xlYXJlZCkKKwkJeworCQkgICAgY2xlYXJfdGVybW9wdGlvbnMoKTsJLyogY2xlYXIgb2xkIG9wdGlvbnMgKi8KKwkJICAgIHRlcm1jYXBfY2xlYXJlZCA9IFRSVUU7CisJCX0KKworCSAgICAvKiBnZXQgb3V0cHV0IHN0cmluZ3MgKi8KKwkJZm9yIChpID0gMDsgc3RyaW5nX25hbWVzW2ldLm5hbWUgIT0gTlVMTDsgKytpKQorCQl7CisJCSAgICBpZiAodGVybV9zdHIoc3RyaW5nX25hbWVzW2ldLmRlc3QpID09IE5VTEwKKwkJCSAgICB8fCB0ZXJtX3N0cihzdHJpbmdfbmFtZXNbaV0uZGVzdCkgPT0gZW1wdHlfb3B0aW9uKQorCQkJdGVybV9zdHIoc3RyaW5nX25hbWVzW2ldLmRlc3QpID0KKwkJCQkJICAgVEdFVFNUUihzdHJpbmdfbmFtZXNbaV0ubmFtZSwgJnRwKTsKKwkJfQorCisJCS8qIHRnZXRmbGFnKCkgcmV0dXJucyAxIGlmIHRoZSBmbGFnIGlzIHByZXNlbnQsIDAgaWYgbm90IGFuZAorCQkgKiBwb3NzaWJseSAtMSBpZiB0aGUgZmxhZyBkb2Vzbid0IGV4aXN0LiAqLworCQlpZiAoKFRfTVMgPT0gTlVMTCB8fCBUX01TID09IGVtcHR5X29wdGlvbikKKwkJCQkJCQkmJiB0Z2V0ZmxhZygibXMiKSA+IDApCisJCSAgICBUX01TID0gKGNoYXJfdSAqKSJ5IjsKKwkJaWYgKChUX1hTID09IE5VTEwgfHwgVF9YUyA9PSBlbXB0eV9vcHRpb24pCisJCQkJCQkJJiYgdGdldGZsYWcoInhzIikgPiAwKQorCQkgICAgVF9YUyA9IChjaGFyX3UgKikieSI7CisJCWlmICgoVF9EQiA9PSBOVUxMIHx8IFRfREIgPT0gZW1wdHlfb3B0aW9uKQorCQkJCQkJCSYmIHRnZXRmbGFnKCJkYiIpID4gMCkKKwkJICAgIFRfREIgPSAoY2hhcl91ICopInkiOworCQlpZiAoKFRfREEgPT0gTlVMTCB8fCBUX0RBID09IGVtcHR5X29wdGlvbikKKwkJCQkJCQkmJiB0Z2V0ZmxhZygiZGEiKSA+IDApCisJCSAgICBUX0RBID0gKGNoYXJfdSAqKSJ5IjsKKwkJaWYgKChUX1VUID09IE5VTEwgfHwgVF9VVCA9PSBlbXB0eV9vcHRpb24pCisJCQkJCQkJJiYgdGdldGZsYWcoInV0IikgPiAwKQorCQkgICAgVF9VVCA9IChjaGFyX3UgKikieSI7CisKKworCQkvKgorCQkgKiBnZXQga2V5IGNvZGVzCisJCSAqLworCQlmb3IgKGkgPSAwOyBrZXlfbmFtZXNbaV0gIT0gTlVMTDsgKytpKQorCQl7CisJCSAgICBpZiAoZmluZF90ZXJtY29kZSgoY2hhcl91ICopa2V5X25hbWVzW2ldKSA9PSBOVUxMKQorCQkgICAgeworCQkJcCA9IFRHRVRTVFIoa2V5X25hbWVzW2ldLCAmdHApOworCQkJLyogaWYgY3Vyc29yLWxlZnQgPT0gYmFja3NwYWNlLCBpZ25vcmUgaXQgKHRlbGV2aWRlbworCQkJICogOTI1KSAqLworCQkJaWYgKHAgIT0gTlVMTAorCQkJCSYmICgqcCAhPSBDdHJsX0gKKwkJCQkgICAgfHwga2V5X25hbWVzW2ldWzBdICE9ICdrJworCQkJCSAgICB8fCBrZXlfbmFtZXNbaV1bMV0gIT0gJ2wnKSkKKwkJCSAgICBhZGRfdGVybWNvZGUoKGNoYXJfdSAqKWtleV9uYW1lc1tpXSwgcCwgRkFMU0UpOworCQkgICAgfQorCQl9CisKKwkJaWYgKGhlaWdodCA9PSAwKQorCQkgICAgaGVpZ2h0ID0gdGdldG51bSgibGkiKTsKKwkJaWYgKHdpZHRoID09IDApCisJCSAgICB3aWR0aCA9IHRnZXRudW0oImNvIik7CisKKwkJLyoKKwkJICogR2V0IG51bWJlciBvZiBjb2xvcnMgKGlmIG5vdCBkb25lIGFscmVhZHkpLgorCQkgKi8KKwkJaWYgKHRlcm1fc3RyKEtTX0NDTykgPT0gTlVMTAorCQkJfHwgdGVybV9zdHIoS1NfQ0NPKSA9PSBlbXB0eV9vcHRpb24pCisJCSAgICBzZXRfY29sb3JfY291bnQodGdldG51bSgiQ28iKSk7CisKKyMgaWZuZGVmIGhwdXgKKwkJQkMgPSAoY2hhciAqKVRHRVRTVFIoImJjIiwgJnRwKTsKKwkJVVAgPSAoY2hhciAqKVRHRVRTVFIoInVwIiwgJnRwKTsKKwkJcCA9IFRHRVRTVFIoInBjIiwgJnRwKTsKKwkJaWYgKHApCisJCSAgICBQQyA9ICpwOworIyBlbmRpZiAvKiBocHV4ICovCisJICAgIH0KKwl9CisJZWxzZQkgICAgLyogdHJ5ID09IDAgfHwgdHJ5ID09IDIgKi8KKyNlbmRpZiAvKiBIQVZFX1RHRVRFTlQgKi8KKwkvKgorCSAqIFVzZSBidWlsdGluIHRlcm1jYXAKKwkgKi8KKwl7CisjaWZkZWYgSEFWRV9UR0VURU5UCisJICAgIC8qCisJICAgICAqIElmIGJ1aWx0aW4gdGVybWNhcCB3YXMgYWxyZWFkeSB1c2VkLCB0aGVyZSBpcyBubyBuZWVkIHRvIHNlYXJjaAorCSAgICAgKiBmb3IgdGhlIGJ1aWx0aW4gdGVybWNhcCBhZ2FpbiwgcXVpdCBub3cuCisJICAgICAqLworCSAgICBpZiAodHJ5ID09IDIgJiYgYnVpbHRpbl9maXJzdCAmJiB0ZXJtY2FwX2NsZWFyZWQpCisJCWJyZWFrOworI2VuZGlmCisJICAgIC8qCisJICAgICAqIHNlYXJjaCBmb3IgJ3Rlcm0nIGluIGJ1aWx0aW5fdGVybWNhcHNbXQorCSAgICAgKi8KKwkgICAgdGVybXAgPSBmaW5kX2J1aWx0aW5fdGVybSh0ZXJtKTsKKwkgICAgaWYgKHRlcm1wLT5idF9zdHJpbmcgPT0gTlVMTCkJLyogZGlkIG5vdCBmaW5kIGl0ICovCisJICAgIHsKKyNpZmRlZiBIQVZFX1RHRVRFTlQKKwkJLyoKKwkJICogSWYgdHJ5ID09IDAsIGZpcnN0IHRyeSB0aGUgZXh0ZXJuYWwgdGVybWNhcC4gSWYgdGhhdCBpcyBub3QKKwkJICogZm91bmQgd2UnbGwgZ2V0IGJhY2sgaGVyZSB3aXRoIHRyeSA9PSAyLgorCQkgKiBJZiB0ZXJtY2FwX2NsZWFyZWQgaXMgc2V0IHdlIHVzZWQgdGhlIGV4dGVybmFsIHRlcm1jYXAsCisJCSAqIGRvbid0IGNvbXBsYWluIGFib3V0IG5vdCBmaW5kaW5nIHRoZSB0ZXJtIGluIHRoZSBidWlsdGluCisJCSAqIHRlcm1jYXAuCisJCSAqLworCQlpZiAodHJ5ID09IDApCQkJLyogdHJ5IGV4dGVybmFsIG9uZSAqLworCQkgICAgY29udGludWU7CisJCWlmICh0ZXJtY2FwX2NsZWFyZWQpCQkvKiBmb3VuZCBpbiBleHRlcm5hbCB0ZXJtY2FwICovCisJCSAgICBicmVhazsKKyNlbmRpZgorCisJCW1jaF9lcnJtc2coIlxyXG4iKTsKKwkJaWYgKGVycm9yX21zZyAhPSBOVUxMKQorCQl7CisJCSAgICBtY2hfZXJybXNnKChjaGFyICopZXJyb3JfbXNnKTsKKwkJICAgIG1jaF9lcnJtc2coIlxyXG4iKTsKKwkJfQorCQltY2hfZXJybXNnKCInIik7CisJCW1jaF9lcnJtc2coKGNoYXIgKil0ZXJtKTsKKwkJbWNoX2Vycm1zZyhfKCInIG5vdCBrbm93bi4gQXZhaWxhYmxlIGJ1aWx0aW4gdGVybWluYWxzIGFyZToiKSk7CisJCW1jaF9lcnJtc2coIlxyXG4iKTsKKwkJZm9yICh0ZXJtcCA9ICYoYnVpbHRpbl90ZXJtY2Fwc1swXSk7IHRlcm1wLT5idF9zdHJpbmcgIT0gTlVMTDsKKwkJCQkJCQkJICAgICAgKyt0ZXJtcCkKKwkJeworCQkgICAgaWYgKHRlcm1wLT5idF9lbnRyeSA9PSAoaW50KUtTX05BTUUpCisJCSAgICB7CisjaWZkZWYgSEFWRV9UR0VURU5UCisJCQltY2hfZXJybXNnKCIgICAgYnVpbHRpbl8iKTsKKyNlbHNlCisJCQltY2hfZXJybXNnKCIgICAgIik7CisjZW5kaWYKKwkJCW1jaF9lcnJtc2codGVybXAtPmJ0X3N0cmluZyk7CisJCQltY2hfZXJybXNnKCJcclxuIik7CisJCSAgICB9CisJCX0KKwkJLyogd2hlbiB1c2VyIHR5cGVkIDpzZXQgdGVybT14eHgsIHF1aXQgaGVyZSAqLworCQlpZiAoc3RhcnRpbmcgIT0gTk9fU0NSRUVOKQorCQl7CisJCSAgICBzY3JlZW5fc3RhcnQoKTsJLyogZG9uJ3Qga25vdyB3aGVyZSBjdXJzb3IgaXMgbm93ICovCisJCSAgICB3YWl0X3JldHVybihUUlVFKTsKKwkJICAgIHJldHVybiBGQUlMOworCQl9CisJCXRlcm0gPSBERUZBVUxUX1RFUk07CisJCW1jaF9lcnJtc2coXygiZGVmYXVsdGluZyB0byAnIikpOworCQltY2hfZXJybXNnKChjaGFyICopdGVybSk7CisJCW1jaF9lcnJtc2coIidcclxuIik7CisJCWlmIChlbXNnX3NpbGVudCA9PSAwKQorCQl7CisJCSAgICBzY3JlZW5fc3RhcnQoKTsJLyogZG9uJ3Qga25vdyB3aGVyZSBjdXJzb3IgaXMgbm93ICovCisJCSAgICBvdXRfZmx1c2goKTsKKwkJICAgIHVpX2RlbGF5KDIwMDBMLCBUUlVFKTsKKwkJfQorCQlzZXRfc3RyaW5nX29wdGlvbl9kaXJlY3QoKGNoYXJfdSAqKSJ0ZXJtIiwgLTEsIHRlcm0sIE9QVF9GUkVFKTsKKwkJZGlzcGxheV9lcnJvcnMoKTsKKwkgICAgfQorCSAgICBvdXRfZmx1c2goKTsKKyNpZmRlZiBIQVZFX1RHRVRFTlQKKwkgICAgaWYgKCF0ZXJtY2FwX2NsZWFyZWQpCisJICAgIHsKKyNlbmRpZgorCQljbGVhcl90ZXJtb3B0aW9ucygpOwkgICAgLyogY2xlYXIgb2xkIG9wdGlvbnMgKi8KKyNpZmRlZiBIQVZFX1RHRVRFTlQKKwkJdGVybWNhcF9jbGVhcmVkID0gVFJVRTsKKwkgICAgfQorI2VuZGlmCisJICAgIHBhcnNlX2J1aWx0aW5fdGNhcCh0ZXJtKTsKKyNpZmRlZiBGRUFUX0dVSQorCSAgICBpZiAodGVybV9pc19ndWkodGVybSkpCisJICAgIHsKKwkJb3V0X2ZsdXNoKCk7CisJCWd1aV9pbml0KCk7CisJCS8qIElmIHN0YXJ0aW5nIHRoZSBHVUkgZmFpbGVkLCBkb24ndCBkbyBhbnkgb2YgdGhlIG90aGVyCisJCSAqIHRoaW5ncyBmb3IgdGhpcyB0ZXJtaW5hbCAqLworCQlpZiAoIWd1aS5pbl91c2UpCisJCSAgICByZXR1cm4gRkFJTDsKKyNpZmRlZiBIQVZFX1RHRVRFTlQKKwkJYnJlYWs7CQkvKiBkb24ndCB0cnkgdXNpbmcgZXh0ZXJuYWwgdGVybWNhcCAqLworI2VuZGlmCisJICAgIH0KKyNlbmRpZiAvKiBGRUFUX0dVSSAqLworCX0KKyNpZmRlZiBIQVZFX1RHRVRFTlQKKyAgICB9CisjZW5kaWYKKworLyoKKyAqIHNwZWNpYWw6IFRoZXJlIGlzIG5vIGluZm8gaW4gdGhlIHRlcm1jYXAgYWJvdXQgd2hldGhlciB0aGUgY3Vyc29yCisgKiBwb3NpdGlvbmluZyBpcyByZWxhdGl2ZSB0byB0aGUgc3RhcnQgb2YgdGhlIHNjcmVlbiBvciB0byB0aGUgc3RhcnQgb2YgdGhlCisgKiBzY3JvbGxpbmcgcmVnaW9uLiAgV2UganVzdCBndWVzcyBoZXJlLiBPbmx5IG1zZG9zIHBjdGVybSBpcyBrbm93biB0byBkbyBpdAorICogcmVsYXRpdmUuCisgKi8KKyAgICBpZiAoU1RSQ01QKHRlcm0sICJwY3Rlcm0iKSA9PSAwKQorCVRfQ0NTID0gKGNoYXJfdSAqKSJ5ZXMiOworICAgIGVsc2UKKwlUX0NDUyA9IGVtcHR5X29wdGlvbjsKKworI2lmZGVmIFVOSVgKKy8qCisgKiBBbnkgInN0dHkiIHNldHRpbmdzIG92ZXJyaWRlIHRoZSBkZWZhdWx0IGZvciB0X2tiIGZyb20gdGhlIHRlcm1jYXAuCisgKiBUaGlzIGlzIGluIG9zX3VuaXguYywgYmVjYXVzZSBpdCBkZXBlbmRzIGEgbG90IG9uIHRoZSB2ZXJzaW9uIG9mIHVuaXggdGhhdAorICogaXMgYmVpbmcgdXNlZC4KKyAqIERvbid0IGRvIHRoaXMgd2hlbiB0aGUgR1VJIGlzIGFjdGl2ZSwgaXQgdXNlcyAidF9rYiIgYW5kICJ0X2tEIiBkaXJlY3RseS4KKyAqLworI2lmZGVmIEZFQVRfR1VJCisgICAgaWYgKCFndWkuaW5fdXNlKQorI2VuZGlmCisJZ2V0X3N0dHkoKTsKKyNlbmRpZgorCisvKgorICogSWYgdGhlIHRlcm1jYXAgaGFzIG5vIGVudHJ5IGZvciAnYnMnIGFuZC9vciAnZGVsJyBhbmQgdGhlIGlvY3RsKCkgYWxzbworICogZGlkbid0IHdvcmssIHVzZSB0aGUgZGVmYXVsdCBDVFJMLUgKKyAqIFRoZSBkZWZhdWx0IGZvciB0X2tEIGlzIERFTCwgdW5sZXNzIHRfa2IgaXMgREVMLgorICogVGhlIHZpbV9zdHJzYXZlJ2Qgc3RyaW5ncyBhcmUgcHJvYmFibHkgbG9zdCBmb3JldmVyLCB3ZWxsIGl0J3Mgb25seSB0d28KKyAqIGJ5dGVzLiAgRG9uJ3QgZG8gdGhpcyB3aGVuIHRoZSBHVUkgaXMgYWN0aXZlLCBpdCB1c2VzICJ0X2tiIiBhbmQgInRfa0QiCisgKiBkaXJlY3RseS4KKyAqLworI2lmZGVmIEZFQVRfR1VJCisgICAgaWYgKCFndWkuaW5fdXNlKQorI2VuZGlmCisgICAgeworCWJzX3AgPSBmaW5kX3Rlcm1jb2RlKChjaGFyX3UgKikia2IiKTsKKwlkZWxfcCA9IGZpbmRfdGVybWNvZGUoKGNoYXJfdSAqKSJrRCIpOworCWlmIChic19wID09IE5VTEwgfHwgKmJzX3AgPT0gTlVMKQorCSAgICBhZGRfdGVybWNvZGUoKGNoYXJfdSAqKSJrYiIsIChic19wID0gKGNoYXJfdSAqKUNUUkxfSF9TVFIpLCBGQUxTRSk7CisJaWYgKChkZWxfcCA9PSBOVUxMIHx8ICpkZWxfcCA9PSBOVUwpICYmCisJCQkJCSAgICAoYnNfcCA9PSBOVUxMIHx8ICpic19wICE9IERFTCkpCisJICAgIGFkZF90ZXJtY29kZSgoY2hhcl91ICopImtEIiwgKGNoYXJfdSAqKURFTF9TVFIsIEZBTFNFKTsKKyAgICB9CisKKyNpZiBkZWZpbmVkKFVOSVgpIHx8IGRlZmluZWQoVk1TKQorICAgIHRlcm1faXNfeHRlcm0gPSB2aW1faXNfeHRlcm0odGVybSk7CisjZW5kaWYKKworI2lmZGVmIEZFQVRfTU9VU0UKKyMgaWYgZGVmaW5lZChVTklYKSB8fCBkZWZpbmVkKFZNUykKKyMgIGlmZGVmIEZFQVRfTU9VU0VfVFRZCisgICAgLyoKKyAgICAgKiBGb3IgVW5peCwgc2V0IHRoZSAndHR5bW91c2UnIG9wdGlvbiB0byB0aGUgdHlwZSBvZiBtb3VzZSB0byBiZSB1c2VkLgorICAgICAqIFRoZSB0ZXJtY29kZSBmb3IgdGhlIG1vdXNlIGlzIGFkZGVkIGFzIGEgc2lkZSBlZmZlY3QgaW4gb3B0aW9uLmMuCisgICAgICovCisgICAgeworCWNoYXJfdQkqcDsKKworCXAgPSAoY2hhcl91ICopIiI7CisjICBpZmRlZiBGRUFUX01PVVNFX1hURVJNCisjICAgaWZkZWYgRkVBVF9DTElQQk9BUkQKKyMgICAgaWZkZWYgRkVBVF9HVUkKKwlpZiAoIWd1aS5pbl91c2UpCisjICAgIGVuZGlmCisJICAgIGNsaXBfaW5pdChGQUxTRSk7CisjICAgZW5kaWYKKwlpZiAodGVybV9pc194dGVybSkKKwl7CisJICAgIGlmICh1c2VfeHRlcm1fbW91c2UoKSkKKwkJcCA9IE5VTEw7CS8qIGtlZXAgZXhpc3RpbmcgdmFsdWUsIG1pZ2h0IGJlICJ4dGVybTIiICovCisJICAgIGVsc2UKKwkJcCA9IChjaGFyX3UgKikieHRlcm0iOworCX0KKyMgIGVuZGlmCisJaWYgKHAgIT0gTlVMTCkKKwkgICAgc2V0X29wdGlvbl92YWx1ZSgoY2hhcl91ICopInR0eW0iLCAwTCwgcCwgMCk7CisJaWYgKHAgPT0gTlVMTAorIyAgIGlmZGVmIEZFQVRfR1VJCisJCXx8IGd1aS5pbl91c2UKKyMgICBlbmRpZgorCQkpCisJICAgIGNoZWNrX21vdXNlX3Rlcm1jb2RlKCk7CS8qIHNldCBtb3VzZSB0ZXJtY29kZSBhbnl3YXkgKi8KKyAgICB9CisjICBlbmRpZgorIyBlbHNlCisgICAgc2V0X21vdXNlX3Rlcm1jb2RlKEtTX01PVVNFLCAoY2hhcl91ICopIlwyMzNNIik7CisjIGVuZGlmCisjZW5kaWYJLyogRkVBVF9NT1VTRSAqLworCisjaWZkZWYgRkVBVF9TTklGRgorICAgIHsKKwljaGFyX3UJbmFtZVsyXTsKKworCW5hbWVbMF0gPSAoaW50KUtTX0VYVFJBOworCW5hbWVbMV0gPSAoaW50KUtFX1NOSUZGOworCWFkZF90ZXJtY29kZShuYW1lLCAoY2hhcl91ICopIlwyMzNzbmlmZiIsIEZBTFNFKTsKKyAgICB9CisjZW5kaWYKKworI2lmZGVmIFVTRV9URVJNX0NPTlNPTEUKKyAgICAvKiBERUZBVUxUX1RFUk0gaW5kaWNhdGVzIHRoYXQgaXQgaXMgdGhlIG1hY2hpbmUgY29uc29sZS4gKi8KKyAgICBpZiAoU1RSQ01QKHRlcm0sIERFRkFVTFRfVEVSTSkgIT0gMCkKKwl0ZXJtX2NvbnNvbGUgPSBGQUxTRTsKKyAgICBlbHNlCisgICAgeworCXRlcm1fY29uc29sZSA9IFRSVUU7CisjIGlmZGVmIEFNSUdBCisJd2luX3Jlc2l6ZV9vbigpOwkvKiBlbmFibGUgd2luZG93IHJlc2l6aW5nIHJlcG9ydHMgKi8KKyMgZW5kaWYKKyAgICB9CisjZW5kaWYKKworI2lmIGRlZmluZWQoVU5JWCkgfHwgZGVmaW5lZChWTVMpCisgICAgLyoKKyAgICAgKiAndHR5ZmFzdCcgaXMgZGVmYXVsdCBvbiBmb3IgeHRlcm0sIGlyaXMtYW5zaSBhbmQgYSBmZXcgb3RoZXJzLgorICAgICAqLworICAgIGlmICh2aW1faXNfZmFzdHRlcm0odGVybSkpCisJcF90ZiA9IFRSVUU7CisjZW5kaWYKKyNpZmRlZiBVU0VfVEVSTV9DT05TT0xFCisgICAgLyoKKyAgICAgKiAndHR5ZmFzdCcgaXMgZGVmYXVsdCBvbiBjb25zb2xlcworICAgICAqLworICAgIGlmICh0ZXJtX2NvbnNvbGUpCisJcF90ZiA9IFRSVUU7CisjZW5kaWYKKworICAgIHR0ZXN0KFRSVUUpOwkvKiBtYWtlIHN1cmUgd2UgaGF2ZSBhIHZhbGlkIHNldCBvZiB0ZXJtaW5hbCBjb2RlcyAqLworCisgICAgZnVsbF9zY3JlZW4gPSBUUlVFOwkJLyogd2UgY2FuIHVzZSB0ZXJtY2FwIGNvZGVzIGZyb20gbm93IG9uICovCisgICAgc2V0X3Rlcm1fZGVmYXVsdHMoKTsJLyogdXNlIGN1cnJlbnQgdmFsdWVzIGFzIGRlZmF1bHRzICovCisjaWZkZWYgRkVBVF9URVJNUkVTUE9OU0UKKyAgICBjcnZfc3RhdHVzID0gQ1JWX0dFVDsJLyogR2V0IHRlcm1pbmFsIHZlcnNpb24gbGF0ZXIgKi8KKyNlbmRpZgorCisgICAgLyoKKyAgICAgKiBJbml0aWFsaXplIHRoZSB0ZXJtaW5hbCB3aXRoIHRoZSBhcHByb3ByaWF0ZSB0ZXJtY2FwIGNvZGVzLgorICAgICAqIFNldCB0aGUgbW91c2UgYW5kIHdpbmRvdyB0aXRsZSBpZiBwb3NzaWJsZS4KKyAgICAgKiBEb24ndCBkbyB0aGlzIHdoZW4gc3RhcnRpbmcsIG5lZWQgdG8gcGFyc2UgdGhlIC52aW1yYyBmaXJzdCwgYmVjYXVzZSBpdAorICAgICAqIG1heSByZWRlZmluZSB0X1RJIGV0Yy4KKyAgICAgKi8KKyAgICBpZiAoc3RhcnRpbmcgIT0gTk9fU0NSRUVOKQorICAgIHsKKwlzdGFydHRlcm1jYXAoKTsJCS8qIG1heSBjaGFuZ2UgdGVybWluYWwgbW9kZSAqLworI2lmZGVmIEZFQVRfTU9VU0UKKwlzZXRtb3VzZSgpOwkJLyogbWF5IHN0YXJ0IHVzaW5nIHRoZSBtb3VzZSAqLworI2VuZGlmCisjaWZkZWYgRkVBVF9USVRMRQorCW1ha2V0aXRsZSgpOwkJLyogbWF5IGRpc3BsYXkgd2luZG93IHRpdGxlICovCisjZW5kaWYKKyAgICB9CisKKwkvKiBkaXNwbGF5IGluaXRpYWwgc2NyZWVuIGFmdGVyIHR0ZXN0KCkgY2hlY2tpbmcuIGp3LiAqLworICAgIGlmICh3aWR0aCA8PSAwIHx8IGhlaWdodCA8PSAwKQorICAgIHsKKwkvKiB0ZXJtY2FwIGZhaWxlZCB0byByZXBvcnQgc2l6ZSAqLworCS8qIHNldCBkZWZhdWx0cywgaW4gY2FzZSB1aV9nZXRfc2hlbGxzaXplKCkgYWxzbyBmYWlscyAqLworCXdpZHRoID0gODA7CisjaWYgZGVmaW5lZChNU0RPUykgfHwgZGVmaW5lZChXSU4zMjY0KQorCWhlaWdodCA9IDI1OwkgICAgLyogY29uc29sZSBpcyBvZnRlbiAyNSBsaW5lcyAqLworI2Vsc2UKKwloZWlnaHQgPSAyNDsJICAgIC8qIG1vc3QgdGVybWluYWxzIGFyZSAyNCBsaW5lcyAqLworI2VuZGlmCisgICAgfQorICAgIHNldF9zaGVsbHNpemUod2lkdGgsIGhlaWdodCwgRkFMU0UpOwkvKiBtYXkgY2hhbmdlIFJvd3MgKi8KKyAgICBpZiAoc3RhcnRpbmcgIT0gTk9fU0NSRUVOKQorICAgIHsKKwlpZiAoc2Nyb2xsX3JlZ2lvbikKKwkgICAgc2Nyb2xsX3JlZ2lvbl9yZXNldCgpOwkJLyogSW4gY2FzZSBSb3dzIGNoYW5nZWQgKi8KKwljaGVja19tYXBfa2V5Y29kZXMoKTsJLyogY2hlY2sgbWFwcGluZ3MgZm9yIHRlcm1pbmFsIGNvZGVzIHVzZWQgKi8KKworI2lmZGVmIEZFQVRfQVVUT0NNRAorCXsKKwkgICAgYnVmX1QJKm9sZF9jdXJidWY7CisKKwkgICAgLyoKKwkgICAgICogRXhlY3V0ZSB0aGUgVGVybUNoYW5nZWQgYXV0b2NvbW1hbmRzIGZvciBlYWNoIGJ1ZmZlciB0aGF0IGlzCisJICAgICAqIGxvYWRlZC4KKwkgICAgICovCisJICAgIG9sZF9jdXJidWYgPSBjdXJidWY7CisJICAgIGZvciAoY3VyYnVmID0gZmlyc3RidWY7IGN1cmJ1ZiAhPSBOVUxMOyBjdXJidWYgPSBjdXJidWYtPmJfbmV4dCkKKwkgICAgeworCQlpZiAoY3VyYnVmLT5iX21sLm1sX21mcCAhPSBOVUxMKQorCQkgICAgYXBwbHlfYXV0b2NtZHMoRVZFTlRfVEVSTUNIQU5HRUQsIE5VTEwsIE5VTEwsIEZBTFNFLAorCQkJCQkJCQkgICAgICBjdXJidWYpOworCSAgICB9CisJICAgIGlmIChidWZfdmFsaWQob2xkX2N1cmJ1ZikpCisJCWN1cmJ1ZiA9IG9sZF9jdXJidWY7CisJfQorI2VuZGlmCisgICAgfQorCisjaWZkZWYgRkVBVF9URVJNUkVTUE9OU0UKKyAgICBtYXlfcmVxX3Rlcm1yZXNwb25zZSgpOworI2VuZGlmCisKKyAgICByZXR1cm4gT0s7Cit9CisKKyNpZiBkZWZpbmVkKEZFQVRfTU9VU0UpIHx8IGRlZmluZWQoUFJPVE8pCisKKyMgaWZkZWYgRkVBVF9NT1VTRV9UVFkKKyMgIGRlZmluZSBITVRfTk9STUFMCTEKKyMgIGRlZmluZSBITVRfTkVUVEVSTQkyCisjICBkZWZpbmUgSE1UX0RFQwk0CisjICBkZWZpbmUgSE1UX0pTQlRFUk0JOAorIyAgZGVmaW5lIEhNVF9QVEVSTQkxNgorc3RhdGljIGludCBoYXNfbW91c2VfdGVybWNvZGUgPSAwOworIyBlbmRpZgorCisjIGlmICghZGVmaW5lZChVTklYKSB8fCBkZWZpbmVkKEZFQVRfTU9VU0VfWFRFUk0pIHx8IGRlZmluZWQoRkVBVF9NT1VTRV9ORVQpIFwKKwl8fCBkZWZpbmVkKEZFQVRfTU9VU0VfREVDKSkgfHwgZGVmaW5lZChGRUFUX01PVVNFX0pTQikgXAorCXx8IGRlZmluZWQoRkVBVF9NT1VTRV9QVEVSTSkgfHwgZGVmaW5lZChQUk9UTykKKyAgICB2b2lkCitzZXRfbW91c2VfdGVybWNvZGUobiwgcykKKyAgICBpbnQJCW47CS8qIEtTX01PVVNFLCBLU19ORVRURVJNX01PVVNFIG9yIEtTX0RFQ19NT1VTRSAqLworICAgIGNoYXJfdQkqczsKK3sKKyAgICBjaGFyX3UJbmFtZVsyXTsKKworICAgIG5hbWVbMF0gPSBuOworICAgIG5hbWVbMV0gPSBLRV9GSUxMRVI7CisgICAgYWRkX3Rlcm1jb2RlKG5hbWUsIHMsIEZBTFNFKTsKKyMgIGlmZGVmIEZFQVRfTU9VU0VfVFRZCisjICAgaWZkZWYgRkVBVF9NT1VTRV9KU0IKKyAgICBpZiAobiA9PSBLU19KU0JURVJNX01PVVNFKQorCWhhc19tb3VzZV90ZXJtY29kZSB8PSBITVRfSlNCVEVSTTsKKyAgICBlbHNlCisjICAgZW5kaWYKKyMgICBpZmRlZiBGRUFUX01PVVNFX05FVAorICAgIGlmIChuID09IEtTX05FVFRFUk1fTU9VU0UpCisJaGFzX21vdXNlX3Rlcm1jb2RlIHw9IEhNVF9ORVRURVJNOworICAgIGVsc2UKKyMgICBlbmRpZgorIyAgIGlmZGVmIEZFQVRfTU9VU0VfREVDCisgICAgaWYgKG4gPT0gS1NfREVDX01PVVNFKQorCWhhc19tb3VzZV90ZXJtY29kZSB8PSBITVRfREVDOworICAgIGVsc2UKKyMgICBlbmRpZgorIyAgIGlmZGVmIEZFQVRfTU9VU0VfUFRFUk0KKyAgICBpZiAobiA9PSBLU19QVEVSTV9NT1VTRSkKKwloYXNfbW91c2VfdGVybWNvZGUgfD0gSE1UX1BURVJNOworICAgIGVsc2UKKyMgICBlbmRpZgorCWhhc19tb3VzZV90ZXJtY29kZSB8PSBITVRfTk9STUFMOworIyAgZW5kaWYKK30KKyMgZW5kaWYKKworIyBpZiAoKGRlZmluZWQoVU5JWCkgfHwgZGVmaW5lZChWTVMpIHx8IGRlZmluZWQoT1MyKSkgXAorCSYmIChkZWZpbmVkKEZFQVRfTU9VU0VfWFRFUk0pIHx8IGRlZmluZWQoRkVBVF9NT1VTRV9ERUMpIFwKKwkgICAgfHwgZGVmaW5lZChGRUFUX01PVVNFX0dQTSkgfHwgZGVmaW5lZChGRUFUX01PVVNFX1BURVJNKSkpIFwKKwkgICAgfHwgZGVmaW5lZChQUk9UTykKKyAgICB2b2lkCitkZWxfbW91c2VfdGVybWNvZGUobikKKyAgICBpbnQJCW47CS8qIEtTX01PVVNFLCBLU19ORVRURVJNX01PVVNFIG9yIEtTX0RFQ19NT1VTRSAqLworeworICAgIGNoYXJfdQluYW1lWzJdOworCisgICAgbmFtZVswXSA9IG47CisgICAgbmFtZVsxXSA9IEtFX0ZJTExFUjsKKyAgICBkZWxfdGVybWNvZGUobmFtZSk7CisjICBpZmRlZiBGRUFUX01PVVNFX1RUWQorIyAgIGlmZGVmIEZFQVRfTU9VU0VfSlNCCisgICAgaWYgKG4gPT0gS1NfSlNCVEVSTV9NT1VTRSkKKwloYXNfbW91c2VfdGVybWNvZGUgJj0gfkhNVF9KU0JURVJNOworICAgIGVsc2UKKyMgICBlbmRpZgorIyAgIGlmZGVmIEZFQVRfTU9VU0VfTkVUCisgICAgaWYgKG4gPT0gS1NfTkVUVEVSTV9NT1VTRSkKKwloYXNfbW91c2VfdGVybWNvZGUgJj0gfkhNVF9ORVRURVJNOworICAgIGVsc2UKKyMgICBlbmRpZgorIyAgIGlmZGVmIEZFQVRfTU9VU0VfREVDCisgICAgaWYgKG4gPT0gS1NfREVDX01PVVNFKQorCWhhc19tb3VzZV90ZXJtY29kZSAmPSB+SE1UX0RFQzsKKyAgICBlbHNlCisjICAgZW5kaWYKKyMgICBpZmRlZiBGRUFUX01PVVNFX1BURVJNCisgICAgaWYgKG4gPT0gS1NfUFRFUk1fTU9VU0UpCisJaGFzX21vdXNlX3Rlcm1jb2RlICY9IH5ITVRfUFRFUk07CisgICAgZWxzZQorIyAgIGVuZGlmCisJaGFzX21vdXNlX3Rlcm1jb2RlICY9IH5ITVRfTk9STUFMOworIyAgZW5kaWYKK30KKyMgZW5kaWYKKyNlbmRpZgorCisjaWZkZWYgSEFWRV9UR0VURU5UCisvKgorICogQ2FsbCB0Z2V0ZW50KCkKKyAqIFJldHVybiBlcnJvciBtZXNzYWdlIGlmIGl0IGZhaWxzLCBOVUxMIGlmIGl0J3MgT0suCisgKi8KKyAgICBzdGF0aWMgY2hhcl91ICoKK3RnZXRlbnRfZXJyb3IodGJ1ZiwgdGVybSkKKyAgICBjaGFyX3UgICp0YnVmOworICAgIGNoYXJfdSAgKnRlcm07Cit7CisgICAgaW50CSAgICBpOworCisgICAgaSA9IFRHRVRFTlQodGJ1ZiwgdGVybSk7CisgICAgaWYgKGkgPCAwCQkgICAgLyogLTEgaXMgYWx3YXlzIGFuIGVycm9yICovCisjIGlmZGVmIFRHRVRFTlRfWkVST19FUlIKKwkgICAgfHwgaSA9PSAwCSAgICAvKiBzb21ldGltZXMgemVybyBpcyBhbHNvIGFuIGVycm9yICovCisjIGVuZGlmCisgICAgICAgKQorICAgIHsKKwkvKiBPbiBGcmVlQlNEIHRwdXRzKCkgZ2V0cyBhIFNFR1YgYWZ0ZXIgYSB0Z2V0ZW50KCkgd2hpY2ggZmFpbHMuICBDYWxsCisJICogdGdldGVudCgpIHdpdGggdGhlIGFsd2F5cyBleGlzdGluZyAiZHVtYiIgZW50cnkgdG8gYXZvaWQgYSBjcmFzaCBvcgorCSAqIGhhbmcuICovCisJKHZvaWQpVEdFVEVOVCh0YnVmLCAiZHVtYiIpOworCisJaWYgKGkgPCAwKQorIyBpZmRlZiBUR0VURU5UX1pFUk9fRVJSCisJICAgIHJldHVybiAoY2hhcl91ICopXygiRTU1NzogQ2Fubm90IG9wZW4gdGVybWNhcCBmaWxlIik7CisJaWYgKGkgPT0gMCkKKyMgZW5kaWYKKyNpZmRlZiBURVJNSU5GTworCSAgICByZXR1cm4gKGNoYXJfdSAqKV8oIkU1NTg6IFRlcm1pbmFsIGVudHJ5IG5vdCBmb3VuZCBpbiB0ZXJtaW5mbyIpOworI2Vsc2UKKwkgICAgcmV0dXJuIChjaGFyX3UgKilfKCJFNTU5OiBUZXJtaW5hbCBlbnRyeSBub3QgZm91bmQgaW4gdGVybWNhcCIpOworI2VuZGlmCisgICAgfQorICAgIHJldHVybiBOVUxMOworfQorCisvKgorICogU29tZSB2ZXJzaW9ucyBvZiB0Z2V0c3RyKCkgaGF2ZSBiZWVuIHJlcG9ydGVkIHRvIHJldHVybiAtMSBpbnN0ZWFkIG9mIE5VTEwuCisgKiBGaXggdGhhdCBoZXJlLgorICovCisgICAgc3RhdGljIGNoYXJfdSAqCit2aW1fdGdldHN0cihzLCBwcCkKKyAgICBjaGFyCSpzOworICAgIGNoYXJfdQkqKnBwOworeworICAgIGNoYXIJKnA7CisKKyAgICBwID0gdGdldHN0cihzLCAoY2hhciAqKilwcCk7CisgICAgaWYgKHAgPT0gKGNoYXIgKiktMSkKKwlwID0gTlVMTDsKKyAgICByZXR1cm4gKGNoYXJfdSAqKXA7Cit9CisjZW5kaWYgLyogSEFWRV9UR0VURU5UICovCisKKyNpZiBkZWZpbmVkKEhBVkVfVEdFVEVOVCkgJiYgKGRlZmluZWQoVU5JWCkgfHwgZGVmaW5lZChfX0VNWF9fKSB8fCBkZWZpbmVkKFZNUykgfHwgZGVmaW5lZChNQUNPU19YKSkKKy8qCisgKiBHZXQgQ29sdW1ucyBhbmQgUm93cyBmcm9tIHRoZSB0ZXJtY2FwLiBVc2VkIGFmdGVyIGEgd2luZG93IHNpZ25hbCBpZiB0aGUKKyAqIGlvY3RsKCkgZmFpbHMuIEl0IGRvZXNuJ3QgbWFrZSBzZW5zZSB0byBjYWxsIHRnZXRlbnQgZWFjaCB0aW1lIGlmIHRoZSAiY28iCisgKiBhbmQgImxpIiBlbnRyaWVzIG5ldmVyIGNoYW5nZS4gQnV0IG9uIHNvbWUgc3lzdGVtcyB0aGlzIHdvcmtzLgorICogRXJyb3JzIHdoaWxlIGdldHRpbmcgdGhlIGVudHJpZXMgYXJlIGlnbm9yZWQuCisgKi8KKyAgICB2b2lkCitnZXRsaW5lY29sKGNwLCBycCkKKyAgICBsb25nCSpjcDsJLyogcG9pbnRlciB0byBjb2x1bW5zICovCisgICAgbG9uZwkqcnA7CS8qIHBvaW50ZXIgdG8gcm93cyAqLworeworICAgIGNoYXJfdQl0YnVmW1RCVUZTWl07CisKKyAgICBpZiAoVF9OQU1FICE9IE5VTEwgJiYgKlRfTkFNRSAhPSBOVUwgJiYgdGdldGVudF9lcnJvcih0YnVmLCBUX05BTUUpID09IE5VTEwpCisgICAgeworCWlmICgqY3AgPT0gMCkKKwkgICAgKmNwID0gdGdldG51bSgiY28iKTsKKwlpZiAoKnJwID09IDApCisJICAgICpycCA9IHRnZXRudW0oImxpIik7CisgICAgfQorfQorI2VuZGlmIC8qIGRlZmluZWQoSEFWRV9UR0VURU5UKSAmJiBkZWZpbmVkKFVOSVgpICovCisKKy8qCisgKiBHZXQgYSBzdHJpbmcgZW50cnkgZnJvbSB0aGUgdGVybWNhcCBhbmQgYWRkIGl0IHRvIHRoZSBsaXN0IG9mIHRlcm1jb2Rlcy4KKyAqIFVzZWQgZm9yIDx0X3h4PiBzcGVjaWFsIGtleXMuCisgKiBHaXZlIGFuIGVycm9yIG1lc3NhZ2UgZm9yIGZhaWx1cmUgd2hlbiBub3Qgc291cmNpbmcuCisgKiBJZiBmb3JjZSBnaXZlbiwgcmVwbGFjZSBhbiBleGlzdGluZyBlbnRyeS4KKyAqIFJldHVybiBGQUlMIGlmIHRoZSBlbnRyeSB3YXMgbm90IGZvdW5kLCBPSyBpZiB0aGUgZW50cnkgd2FzIGFkZGVkLgorICovCisgICAgaW50CithZGRfdGVybWNhcF9lbnRyeShuYW1lLCBmb3JjZSkKKyAgICBjaGFyX3UgICpuYW1lOworICAgIGludAkgICAgZm9yY2U7Cit7CisgICAgY2hhcl91ICAqdGVybTsKKyAgICBpbnQJICAgIGtleTsKKyAgICBzdHJ1Y3QgYnVpbHRpbl90ZXJtICp0ZXJtcDsKKyNpZmRlZiBIQVZFX1RHRVRFTlQKKyAgICBjaGFyX3UgICpzdHJpbmc7CisgICAgaW50CSAgICBpOworICAgIGludAkgICAgYnVpbHRpbl9maXJzdDsKKyAgICBjaGFyX3UgIHRidWZbVEJVRlNaXTsKKyAgICBjaGFyX3UgIHRzdHJidWZbVEJVRlNaXTsKKyAgICBjaGFyX3UgICp0cCA9IHRzdHJidWY7CisgICAgY2hhcl91ICAqZXJyb3JfbXNnID0gTlVMTDsKKyNlbmRpZgorCisvKgorICogSWYgdGhlIEdVSSBpcyBydW5uaW5nIG9yIHdpbGwgc3RhcnQgaW4gYSBtb21lbnQsIHdlIG9ubHkgc3VwcG9ydCB0aGUga2V5cworICogdGhhdCB0aGUgR1VJIGNhbiBwcm9kdWNlLgorICovCisjaWZkZWYgRkVBVF9HVUkKKyAgICBpZiAoZ3VpLmluX3VzZSB8fCBndWkuc3RhcnRpbmcpCisJcmV0dXJuIGd1aV9tY2hfaGFza2V5KG5hbWUpOworI2VuZGlmCisKKyAgICBpZiAoIWZvcmNlICYmIGZpbmRfdGVybWNvZGUobmFtZSkgIT0gTlVMTCkJICAgIC8qIGl0J3MgYWxyZWFkeSB0aGVyZSAqLworCXJldHVybiBPSzsKKworICAgIHRlcm0gPSBUX05BTUU7CisgICAgaWYgKHRlcm0gPT0gTlVMTCB8fCAqdGVybSA9PSBOVUwpCSAgICAvKiAndGVybScgbm90IGRlZmluZWQgeWV0ICovCisJcmV0dXJuIEZBSUw7CisKKyAgICBpZiAodGVybV9pc19idWlsdGluKHRlcm0pKQkJICAgIC8qIG5hbWUgc3RhcnRzIHdpdGggImJ1aWx0aW5fIiAqLworICAgIHsKKwl0ZXJtICs9IDg7CisjaWZkZWYgSEFWRV9UR0VURU5UCisJYnVpbHRpbl9maXJzdCA9IFRSVUU7CisjZW5kaWYKKyAgICB9CisjaWZkZWYgSEFWRV9UR0VURU5UCisgICAgZWxzZQorCWJ1aWx0aW5fZmlyc3QgPSBwX3RiaTsKKyNlbmRpZgorCisjaWZkZWYgSEFWRV9UR0VURU5UCisvKgorICogV2UgY2FuIGdldCB0aGUgZW50cnkgZnJvbSB0aGUgYnVpbHRpbiB0ZXJtY2FwIGFuZCBmcm9tIHRoZSBleHRlcm5hbCBvbmUuCisgKiBJZiAndHR5YnVpbHRpbicgaXMgb24gb3IgdGhlIHRlcm1pbmFsIG5hbWUgc3RhcnRzIHdpdGggImJ1aWx0aW5fIiwgdHJ5CisgKiBidWlsdGluIHRlcm1jYXAgZmlyc3QuCisgKiBJZiAndHR5YnVpbHRpbicgaXMgb2ZmLCB0cnkgZXh0ZXJuYWwgdGVybWNhcCBmaXJzdC4KKyAqLworICAgIGZvciAoaSA9IDA7IGkgPCAyOyArK2kpCisgICAgeworCWlmICghYnVpbHRpbl9maXJzdCA9PSBpKQorI2VuZGlmCisJLyoKKwkgKiBTZWFyY2ggaW4gYnVpbHRpbiB0ZXJtY2FwCisJICovCisJeworCSAgICB0ZXJtcCA9IGZpbmRfYnVpbHRpbl90ZXJtKHRlcm0pOworCSAgICBpZiAodGVybXAtPmJ0X3N0cmluZyAhPSBOVUxMKQkvKiBmb3VuZCBpdCAqLworCSAgICB7CisJCWtleSA9IFRFUk1DQVAyS0VZKG5hbWVbMF0sIG5hbWVbMV0pOworCQl3aGlsZSAodGVybXAtPmJ0X2VudHJ5ICE9IChpbnQpS1NfTkFNRSkKKwkJeworCQkgICAgaWYgKChpbnQpdGVybXAtPmJ0X2VudHJ5ID09IGtleSkKKwkJICAgIHsKKwkJCWFkZF90ZXJtY29kZShuYW1lLCAoY2hhcl91ICopdGVybXAtPmJ0X3N0cmluZywKKwkJCQkJCQkgIHRlcm1faXNfOGJpdCh0ZXJtKSk7CisJCQlyZXR1cm4gT0s7CisJCSAgICB9CisJCSAgICArK3Rlcm1wOworCQl9CisJICAgIH0KKwl9CisjaWZkZWYgSEFWRV9UR0VURU5UCisJZWxzZQorCS8qCisJICogU2VhcmNoIGluIGV4dGVybmFsIHRlcm1jYXAKKwkgKi8KKwl7CisJICAgIGVycm9yX21zZyA9IHRnZXRlbnRfZXJyb3IodGJ1ZiwgdGVybSk7CisJICAgIGlmIChlcnJvcl9tc2cgPT0gTlVMTCkKKwkgICAgeworCQlzdHJpbmcgPSBUR0VUU1RSKChjaGFyICopbmFtZSwgJnRwKTsKKwkJaWYgKHN0cmluZyAhPSBOVUxMICYmICpzdHJpbmcgIT0gTlVMKQorCQl7CisJCSAgICBhZGRfdGVybWNvZGUobmFtZSwgc3RyaW5nLCBGQUxTRSk7CisJCSAgICByZXR1cm4gT0s7CisJCX0KKwkgICAgfQorCX0KKyAgICB9CisjZW5kaWYKKworICAgIGlmIChzb3VyY2luZ19uYW1lID09IE5VTEwpCisgICAgeworI2lmZGVmIEhBVkVfVEdFVEVOVAorCWlmIChlcnJvcl9tc2cgIT0gTlVMTCkKKwkgICAgRU1TRyhlcnJvcl9tc2cpOworCWVsc2UKKyNlbmRpZgorCSAgICBFTVNHMihfKCJFNDM2OiBObyBcIiVzXCIgZW50cnkgaW4gdGVybWNhcCIpLCBuYW1lKTsKKyAgICB9CisgICAgcmV0dXJuIEZBSUw7Cit9CisKKyAgICBzdGF0aWMgaW50Cit0ZXJtX2lzX2J1aWx0aW4obmFtZSkKKyAgICBjaGFyX3UgICpuYW1lOworeworICAgIHJldHVybiAoU1RSTkNNUChuYW1lLCAiYnVpbHRpbl8iLCAoc2l6ZV90KTgpID09IDApOworfQorCisvKgorICogUmV0dXJuIFRSVUUgaWYgdGVybWluYWwgIm5hbWUiIHVzZXMgQ1NJIGluc3RlYWQgb2YgPEVzYz5bLgorICogQXNzdW1lIHRoYXQgdGhlIHRlcm1pbmFsIGlzIHVzaW5nIDgtYml0IGNvbnRyb2xzIHdoZW4gdGhlIG5hbWUgY29udGFpbnMKKyAqICI4Yml0IiwgbGlrZSBpbiAieHRlcm0tOGJpdCIuCisgKi8KKyAgICBpbnQKK3Rlcm1faXNfOGJpdChuYW1lKQorICAgIGNoYXJfdSAgKm5hbWU7Cit7CisgICAgcmV0dXJuIChkZXRlY3RlZF84Yml0IHx8IHN0cnN0cigoY2hhciAqKW5hbWUsICI4Yml0IikgIT0gTlVMTCk7Cit9CisKKy8qCisgKiBUcmFuc2xhdGUgdGVybWluYWwgY29udHJvbCBjaGFycyBmcm9tIDctYml0IHRvIDgtYml0OgorICogPEVzYz5bIC0+IENTSQorICogPEVzYz5dIC0+IDxNLUMtXT4KKyAqIDxFc2M+TyAtPiA8TS1DLU8+CisgKi8KKyAgICBzdGF0aWMgaW50Cit0ZXJtXzd0bzhiaXQocCkKKyAgICBjaGFyX3UgICpwOworeworICAgIGlmICgqcCA9PSBFU0MpCisgICAgeworCWlmIChwWzFdID09ICdbJykKKwkgICAgcmV0dXJuIENTSTsKKwlpZiAocFsxXSA9PSAnXScpCisJICAgIHJldHVybiAweDlkOworCWlmIChwWzFdID09ICdPJykKKwkgICAgcmV0dXJuIDB4OGY7CisgICAgfQorICAgIHJldHVybiAwOworfQorCisjaWZkZWYgRkVBVF9HVUkKKyAgICBpbnQKK3Rlcm1faXNfZ3VpKG5hbWUpCisgICAgY2hhcl91ICAqbmFtZTsKK3sKKyAgICByZXR1cm4gKFNUUkNNUChuYW1lLCAiYnVpbHRpbl9ndWkiKSA9PSAwIHx8IFNUUkNNUChuYW1lLCAiZ3VpIikgPT0gMCk7Cit9CisjZW5kaWYKKworI2lmICFkZWZpbmVkKEhBVkVfVEdFVEVOVCkgfHwgZGVmaW5lZChBTUlHQSkgfHwgZGVmaW5lZChQUk9UTykKKworICAgIGNoYXJfdSAqCit0bHRvYShpKQorICAgIHVuc2lnbmVkIGxvbmcgaTsKK3sKKyAgICBzdGF0aWMgY2hhcl91IGJ1ZlsxNl07CisgICAgY2hhcl91CSpwOworCisgICAgcCA9IGJ1ZiArIDE1OworICAgICpwID0gJ1wwJzsKKyAgICBkbworICAgIHsKKwktLXA7CisJKnAgPSAoY2hhcl91KSAoaSAlIDEwICsgJzAnKTsKKwlpIC89IDEwOworICAgIH0KKyAgICB3aGlsZSAoaSA+IDAgJiYgcCA+IGJ1Zik7CisgICAgcmV0dXJuIHA7Cit9CisjZW5kaWYKKworI2lmbmRlZiBIQVZFX1RHRVRFTlQKKworLyoKKyAqIG1pbmltYWwgdGdvdG8oKSBpbXBsZW1lbnRhdGlvbi4KKyAqIG5vIHBhZGRpbmcgYW5kIHdlIG9ubHkgcGFyc2UgZm9yICVpICVkIGFuZCAlK2NoYXIKKyAqLworY2hhciAqdGdvdG8gX19BUkdTKChjaGFyICosIGludCwgaW50KSk7CisKKyAgICBjaGFyICoKK3Rnb3RvKGNtLCB4LCB5KQorICAgIGNoYXIgKmNtOworICAgIGludCB4LCB5OworeworICAgIHN0YXRpYyBjaGFyIGJ1ZlszMF07CisgICAgY2hhciAqcCwgKnMsICplOworCisgICAgaWYgKCFjbSkKKwlyZXR1cm4gIk9PUFMiOworICAgIGUgPSBidWYgKyAyOTsKKyAgICBmb3IgKHMgPSBidWY7IHMgPCBlICYmICpjbTsgY20rKykKKyAgICB7CisJaWYgKCpjbSAhPSAnJScpCisJeworCSAgICAqcysrID0gKmNtOworCSAgICBjb250aW51ZTsKKwl9CisJc3dpdGNoICgqKytjbSkKKwl7CisJY2FzZSAnZCc6CisJICAgIHAgPSAoY2hhciAqKXRsdG9hKCh1bnNpZ25lZCBsb25nKXkpOworCSAgICB5ID0geDsKKwkgICAgd2hpbGUgKCpwKQorCQkqcysrID0gKnArKzsKKwkgICAgYnJlYWs7CisJY2FzZSAnaSc6CisJICAgIHgrKzsKKwkgICAgeSsrOworCSAgICBicmVhazsKKwljYXNlICcrJzoKKwkgICAgKnMrKyA9IChjaGFyKSgqKytjbSArIHkpOworCSAgICB5ID0geDsKKwkgICAgYnJlYWs7CisJY2FzZSAnJSc6CisJICAgICpzKysgPSAqY207CisJICAgIGJyZWFrOworCWRlZmF1bHQ6CisJICAgIHJldHVybiAiT09QUyI7CisJfQorICAgIH0KKyAgICAqcyA9ICdcMCc7CisgICAgcmV0dXJuIGJ1ZjsKK30KKworI2VuZGlmIC8qIEhBVkVfVEdFVEVOVCAqLworCisvKgorICogU2V0IHRoZSB0ZXJtaW5hbCBuYW1lIGFuZCBpbml0aWFsaXplIHRoZSB0ZXJtaW5hbCBvcHRpb25zLgorICogSWYgIm5hbWUiIGlzIE5VTEwgb3IgZW1wdHksIGdldCB0aGUgdGVybWluYWwgbmFtZSBmcm9tIHRoZSBlbnZpcm9ubWVudC4KKyAqIElmIHRoYXQgZmFpbHMsIHVzZSB0aGUgZGVmYXVsdCB0ZXJtaW5hbCBuYW1lLgorICovCisgICAgdm9pZAordGVybWNhcGluaXQobmFtZSkKKyAgICBjaGFyX3UgKm5hbWU7Cit7CisgICAgY2hhcl91CSp0ZXJtOworCisgICAgaWYgKG5hbWUgIT0gTlVMTCAmJiAqbmFtZSA9PSBOVUwpCisJbmFtZSA9IE5VTEw7CSAgICAvKiBlbXB0eSBuYW1lIGlzIGVxdWFsIHRvIG5vIG5hbWUgKi8KKyAgICB0ZXJtID0gbmFtZTsKKworI2lmZGVmIF9fQkVPU19fCisgICAgLyoKKyAgICAgKiBURVJNIGVudmlyb25tZW50IHZhcmlhYmxlIGlzIG5vcm1hbGx5IHNldCB0byAnYW5zaScgb24gdGhlIEJlYm94OworICAgICAqIFNpbmNlIHRoZSBCZUJveCBkb2Vzbid0IHF1aXRlIHN1cHBvcnQgZnVsbCBBTlNJIHlldCwgd2UgdXNlIG91cgorICAgICAqIG93biBjdXN0b20gJ2Fuc2ktYmVvcycgdGVybWNhcCBpbnN0ZWFkLCB1bmxlc3MgdGhlIC1UIG9wdGlvbiBoYXMKKyAgICAgKiBiZWVuIGdpdmVuIG9uIHRoZSBjb21tYW5kIGxpbmUuCisgICAgICovCisgICAgaWYgKHRlcm0gPT0gTlVMTAorCQkgJiYgc3RyY21wKChjaGFyICopbWNoX2dldGVudigoY2hhcl91ICopIlRFUk0iKSwgImFuc2kiKSA9PSAwKQorCXRlcm0gPSBERUZBVUxUX1RFUk07CisjZW5kaWYKKyNpZm5kZWYgTVNXSU4KKyAgICBpZiAodGVybSA9PSBOVUxMKQorCXRlcm0gPSBtY2hfZ2V0ZW52KChjaGFyX3UgKikiVEVSTSIpOworI2VuZGlmCisgICAgaWYgKHRlcm0gPT0gTlVMTCB8fCAqdGVybSA9PSBOVUwpCisJdGVybSA9IERFRkFVTFRfVEVSTTsKKyAgICBzZXRfc3RyaW5nX29wdGlvbl9kaXJlY3QoKGNoYXJfdSAqKSJ0ZXJtIiwgLTEsIHRlcm0sIE9QVF9GUkVFKTsKKworICAgIC8qIFNldCB0aGUgZGVmYXVsdCB0ZXJtaW5hbCBuYW1lLiAqLworICAgIHNldF9zdHJpbmdfZGVmYXVsdCgidGVybSIsIHRlcm0pOworICAgIHNldF9zdHJpbmdfZGVmYXVsdCgidHR5dHlwZSIsIHRlcm0pOworCisgICAgLyoKKyAgICAgKiBBdm9pZCB1c2luZyAidGVybSIgaGVyZSwgYmVjYXVzZSB0aGUgbmV4dCBtY2hfZ2V0ZW52KCkgbWF5IG92ZXJ3cml0ZSBpdC4KKyAgICAgKi8KKyAgICBzZXRfdGVybW5hbWUoVF9OQU1FICE9IE5VTEwgPyBUX05BTUUgOiB0ZXJtKTsKK30KKworLyoKKyAqIHRoZSBudW1iZXIgb2YgY2FsbHMgdG8gdWlfd3JpdGUgaXMgcmVkdWNlZCBieSB1c2luZyB0aGUgYnVmZmVyICJvdXRfYnVmIgorICovCisjaWZkZWYgRE9TMTYKKyMgZGVmaW5lIE9VVF9TSVpFCTI1NQkJLyogb25seSBoYXZlIDY0MEsgdG90YWwuLi4gKi8KKyNlbHNlCisjIGlmZGVmIEZFQVRfR1VJX1cxNgorIyAgZGVmaW5lIE9VVF9TSVpFCTEwMjMJCS8qIFNhdmUgcHJlY2lvdXMgMUsgbmVhciBkYXRhICovCisjIGVsc2UKKyMgIGRlZmluZSBPVVRfU0laRQkyMDQ3CisjIGVuZGlmCisjZW5kaWYKKwkgICAgLyogQWRkIG9uZSB0byBhbGxvdyBtY2hfd3JpdGUoKSBpbiBvc193aW4zMi5jIHRvIGFwcGVuZCBhIE5VTCAqLworc3RhdGljIGNoYXJfdQkJb3V0X2J1ZltPVVRfU0laRSArIDFdOworc3RhdGljIGludAkJb3V0X3BvcyA9IDA7CS8qIG51bWJlciBvZiBjaGFycyBpbiBvdXRfYnVmICovCisKKy8qCisgKiBvdXRfZmx1c2goKTogZmx1c2ggdGhlIG91dHB1dCBidWZmZXIKKyAqLworICAgIHZvaWQKK291dF9mbHVzaCgpCit7CisgICAgaW50CSAgICBsZW47CisKKyAgICBpZiAob3V0X3BvcyAhPSAwKQorICAgIHsKKwkvKiBzZXQgb3V0X3BvcyB0byAwIGJlZm9yZSB1aV93cml0ZSwgdG8gYXZvaWQgcmVjdXJzaXZlbmVzcyAqLworCWxlbiA9IG91dF9wb3M7CisJb3V0X3BvcyA9IDA7CisJdWlfd3JpdGUob3V0X2J1ZiwgbGVuKTsKKyAgICB9Cit9CisKKyNpZiBkZWZpbmVkKEZFQVRfTUJZVEUpIHx8IGRlZmluZWQoUFJPVE8pCisvKgorICogU29tZXRpbWVzIGEgYnl0ZSBvdXQgb2YgYSBtdWx0aS1ieXRlIGNoYXJhY3RlciBpcyB3cml0dGVuIHdpdGggb3V0X2NoYXIoKS4KKyAqIFRvIGF2b2lkIGZsdXNoaW5nIGhhbGYgb2YgdGhlIGNoYXJhY3RlciwgY2FsbCB0aGlzIGZ1bmN0aW9uIGZpcnN0LgorICovCisgICAgdm9pZAorb3V0X2ZsdXNoX2NoZWNrKCkKK3sKKyAgICBpZiAoZW5jX2RiY3MgIT0gMCAmJiBvdXRfcG9zID49IE9VVF9TSVpFIC0gTUJfTUFYQllURVMpCisJb3V0X2ZsdXNoKCk7Cit9CisjZW5kaWYKKworI2lmZGVmIEZFQVRfR1VJCisvKgorICogb3V0X3RyYXNoKCk6IFRocm93IGF3YXkgdGhlIGNvbnRlbnRzIG9mIHRoZSBvdXRwdXQgYnVmZmVyCisgKi8KKyAgICB2b2lkCitvdXRfdHJhc2goKQoreworICAgIG91dF9wb3MgPSAwOworfQorI2VuZGlmCisKKy8qCisgKiBvdXRfY2hhcihjKTogcHV0IGEgYnl0ZSBpbnRvIHRoZSBvdXRwdXQgYnVmZmVyLgorICoJCUZsdXNoIGl0IGlmIGl0IGJlY29tZXMgZnVsbC4KKyAqIFRoaXMgc2hvdWxkIG5vdCBiZSB1c2VkIGZvciBvdXRwdXR0aW5nIHRleHQgb24gdGhlIHNjcmVlbiAodXNlIGZ1bmN0aW9ucworICogbGlrZSBtc2dfcHV0cygpIGFuZCBzY3JlZW5fcHV0Y2hhcigpIGZvciB0aGF0KS4KKyAqLworICAgIHZvaWQKK291dF9jaGFyKGMpCisgICAgdW5zaWduZWQJYzsKK3sKKyNpZiBkZWZpbmVkKFVOSVgpIHx8IGRlZmluZWQoVk1TKSB8fCBkZWZpbmVkKEFNSUdBKSB8fCBkZWZpbmVkKE1BQ09TX1hfVU5JWCkKKyAgICBpZiAoYyA9PSAnXG4nKQkvKiB0dXJuIExGIGludG8gQ1ItTEYgKENSTU9EIGRvZXNuJ3Qgc2VlbSB0byBkbyB0aGlzKSAqLworCW91dF9jaGFyKCdccicpOworI2VuZGlmCisKKyAgICBvdXRfYnVmW291dF9wb3MrK10gPSBjOworCisgICAgLyogRm9yIHRlc3Rpbmcgd2UgZmx1c2ggZWFjaCB0aW1lLiAqLworICAgIGlmIChvdXRfcG9zID49IE9VVF9TSVpFIHx8IHBfd2QpCisJb3V0X2ZsdXNoKCk7Cit9CisKK3N0YXRpYyB2b2lkIG91dF9jaGFyX25mIF9fQVJHUygodW5zaWduZWQpKTsKKworLyoKKyAqIG91dF9jaGFyX25mKGMpOiBsaWtlIG91dF9jaGFyKCksIGJ1dCBkb24ndCBmbHVzaCB3aGVuIHBfd2QgaXMgc2V0CisgKi8KKyAgICBzdGF0aWMgdm9pZAorb3V0X2NoYXJfbmYoYykKKyAgICB1bnNpZ25lZAljOworeworI2lmIGRlZmluZWQoVU5JWCkgfHwgZGVmaW5lZChWTVMpIHx8IGRlZmluZWQoQU1JR0EpIHx8IGRlZmluZWQoTUFDT1NfWF9VTklYKQorICAgIGlmIChjID09ICdcbicpCS8qIHR1cm4gTEYgaW50byBDUi1MRiAoQ1JNT0QgZG9lc24ndCBzZWVtIHRvIGRvIHRoaXMpICovCisJb3V0X2NoYXJfbmYoJ1xyJyk7CisjZW5kaWYKKworICAgIG91dF9idWZbb3V0X3BvcysrXSA9IGM7CisKKyAgICBpZiAob3V0X3BvcyA+PSBPVVRfU0laRSkKKwlvdXRfZmx1c2goKTsKK30KKworLyoKKyAqIEEgbmV2ZXItcGFkZGluZyBvdXRfc3RyLgorICogdXNlIHRoaXMgd2hlbmV2ZXIgeW91IGRvbid0IHdhbnQgdG8gcnVuIHRoZSBzdHJpbmcgdGhyb3VnaCB0cHV0cy4KKyAqIHRwdXRzIGFib3ZlIGlzIGhhcm1sZXNzLCBidXQgdHB1dHMgZnJvbSB0aGUgdGVybWNhcCBsaWJyYXJ5CisgKiBpcyBsaWtlbHkgdG8gc3RyaXAgb2ZmIGxlYWRpbmcgZGlnaXRzLCB0aGF0IGl0IG1pc3Rha2VzIGZvciBwYWRkaW5nCisgKiBpbmZvcm1hdGlvbiwgYW5kICIlaSIsICIlZCIsIGV0Yy4KKyAqIFRoaXMgc2hvdWxkIG9ubHkgYmUgdXNlZCBmb3Igd3JpdGluZyB0ZXJtaW5hbCBjb2Rlcywgbm90IGZvciBvdXRwdXR0aW5nCisgKiBub3JtYWwgdGV4dCAodXNlIGZ1bmN0aW9ucyBsaWtlIG1zZ19wdXRzKCkgYW5kIHNjcmVlbl9wdXRjaGFyKCkgZm9yIHRoYXQpLgorICovCisgICAgdm9pZAorb3V0X3N0cl9uZihzKQorICAgIGNoYXJfdSAqczsKK3sKKyAgICBpZiAob3V0X3BvcyA+IE9VVF9TSVpFIC0gMjApICAvKiBhdm9pZCB0ZXJtaW5hbCBzdHJpbmdzIGJlaW5nIHNwbGl0IHVwICovCisJb3V0X2ZsdXNoKCk7CisgICAgd2hpbGUgKCpzKQorCW91dF9jaGFyX25mKCpzKyspOworCisgICAgLyogRm9yIHRlc3Rpbmcgd2Ugd3JpdGUgb25lIHN0cmluZyBhdCBhIHRpbWUuICovCisgICAgaWYgKHBfd2QpCisJb3V0X2ZsdXNoKCk7Cit9CisKKy8qCisgKiBvdXRfc3RyKHMpOiBQdXQgYSBjaGFyYWN0ZXIgc3RyaW5nIGEgYnl0ZSBhdCBhIHRpbWUgaW50byB0aGUgb3V0cHV0IGJ1ZmZlci4KKyAqIElmIEhBVkVfVEdFVEVOVCBpcyBkZWZpbmVkIHVzZSB0aGUgdGVybWNhcCBwYXJzZXIuIChqdykKKyAqIFRoaXMgc2hvdWxkIG9ubHkgYmUgdXNlZCBmb3Igd3JpdGluZyB0ZXJtaW5hbCBjb2Rlcywgbm90IGZvciBvdXRwdXR0aW5nCisgKiBub3JtYWwgdGV4dCAodXNlIGZ1bmN0aW9ucyBsaWtlIG1zZ19wdXRzKCkgYW5kIHNjcmVlbl9wdXRjaGFyKCkgZm9yIHRoYXQpLgorICovCisgICAgdm9pZAorb3V0X3N0cihzKQorICAgIGNoYXJfdQkgKnM7Cit7CisgICAgaWYgKHMgIT0gTlVMTCAmJiAqcykKKyAgICB7CisjaWZkZWYgRkVBVF9HVUkKKwkvKiBEb24ndCB1c2UgdHB1dHMoKSB3aGVuIEdVSSBpcyB1c2VkLCBuY3Vyc2VzIGNyYXNoZXMuICovCisJaWYgKGd1aS5pbl91c2UpCisJeworCSAgICBvdXRfc3RyX25mKHMpOworCSAgICByZXR1cm47CisJfQorI2VuZGlmCisJLyogYXZvaWQgdGVybWluYWwgc3RyaW5ncyBiZWluZyBzcGxpdCB1cCAqLworCWlmIChvdXRfcG9zID4gT1VUX1NJWkUgLSAyMCkKKwkgICAgb3V0X2ZsdXNoKCk7CisjaWZkZWYgSEFWRV9UR0VURU5UCisJdHB1dHMoKGNoYXIgKilzLCAxLCBUUFVUU0ZVTkNBU1Qgb3V0X2NoYXJfbmYpOworI2Vsc2UKKwl3aGlsZSAoKnMpCisJICAgIG91dF9jaGFyX25mKCpzKyspOworI2VuZGlmCisKKwkvKiBGb3IgdGVzdGluZyB3ZSB3cml0ZSBvbmUgc3RyaW5nIGF0IGEgdGltZS4gKi8KKwlpZiAocF93ZCkKKwkgICAgb3V0X2ZsdXNoKCk7CisgICAgfQorfQorCisvKgorICogY3Vyc29yIHBvc2l0aW9uaW5nIHVzaW5nIHRlcm1jYXAgcGFyc2VyLiAoancpCisgKi8KKyAgICB2b2lkCit0ZXJtX3dpbmRnb3RvKHJvdywgY29sKQorICAgIGludAkgICAgcm93OworICAgIGludAkgICAgY29sOworeworICAgIE9VVF9TVFIodGdvdG8oKGNoYXIgKilUX0NNLCBjb2wsIHJvdykpOworfQorCisgICAgdm9pZAordGVybV9jdXJzb3JfcmlnaHQoaSkKKyAgICBpbnQJICAgIGk7Cit7CisgICAgT1VUX1NUUih0Z290bygoY2hhciAqKVRfQ1JJLCAwLCBpKSk7Cit9CisKKyAgICB2b2lkCit0ZXJtX2FwcGVuZF9saW5lcyhsaW5lX2NvdW50KQorICAgIGludAkgICAgbGluZV9jb3VudDsKK3sKKyAgICBPVVRfU1RSKHRnb3RvKChjaGFyICopVF9DQUwsIDAsIGxpbmVfY291bnQpKTsKK30KKworICAgIHZvaWQKK3Rlcm1fZGVsZXRlX2xpbmVzKGxpbmVfY291bnQpCisgICAgaW50CSAgICBsaW5lX2NvdW50OworeworICAgIE9VVF9TVFIodGdvdG8oKGNoYXIgKilUX0NETCwgMCwgbGluZV9jb3VudCkpOworfQorCisjaWYgZGVmaW5lZChIQVZFX1RHRVRFTlQpIHx8IGRlZmluZWQoUFJPVE8pCisgICAgdm9pZAordGVybV9zZXRfd2lucG9zKHgsIHkpCisgICAgaW50CSAgICB4OworICAgIGludAkgICAgeTsKK3sKKyAgICAvKiBDYW4ndCBoYW5kbGUgYSBuZWdhdGl2ZSB2YWx1ZSBoZXJlICovCisgICAgaWYgKHggPCAwKQorCXggPSAwOworICAgIGlmICh5IDwgMCkKKwl5ID0gMDsKKyAgICBPVVRfU1RSKHRnb3RvKChjaGFyICopVF9DV1AsIHksIHgpKTsKK30KKworICAgIHZvaWQKK3Rlcm1fc2V0X3dpbnNpemUod2lkdGgsIGhlaWdodCkKKyAgICBpbnQJICAgIHdpZHRoOworICAgIGludAkgICAgaGVpZ2h0OworeworICAgIE9VVF9TVFIodGdvdG8oKGNoYXIgKilUX0NXUywgaGVpZ2h0LCB3aWR0aCkpOworfQorI2VuZGlmCisKKyAgICB2b2lkCit0ZXJtX2ZnX2NvbG9yKG4pCisgICAgaW50CSAgICBuOworeworICAgIC8qIFVzZSAiQUYiIHRlcm1jYXAgZW50cnkgaWYgcHJlc2VudCwgIlNmIiBlbnRyeSBvdGhlcndpc2UgKi8KKyAgICBpZiAoKlRfQ0FGKQorCXRlcm1fY29sb3IoVF9DQUYsIG4pOworICAgIGVsc2UgaWYgKCpUX0NTRikKKwl0ZXJtX2NvbG9yKFRfQ1NGLCBuKTsKK30KKworICAgIHZvaWQKK3Rlcm1fYmdfY29sb3IobikKKyAgICBpbnQJICAgIG47Cit7CisgICAgLyogVXNlICJBQiIgdGVybWNhcCBlbnRyeSBpZiBwcmVzZW50LCAiU2IiIGVudHJ5IG90aGVyd2lzZSAqLworICAgIGlmICgqVF9DQUIpCisJdGVybV9jb2xvcihUX0NBQiwgbik7CisgICAgZWxzZSBpZiAoKlRfQ1NCKQorCXRlcm1fY29sb3IoVF9DU0IsIG4pOworfQorCisgICAgc3RhdGljIHZvaWQKK3Rlcm1fY29sb3IocywgbikKKyAgICBjaGFyX3UJKnM7CisgICAgaW50CQluOworeworICAgIGNoYXIJYnVmWzIwXTsKKyAgICBpbnQgaSA9IDI7CS8qIGluZGV4IGluIHNbXSBqdXN0IGFmdGVyIDxFc2M+WyBvciBDU0kgKi8KKworICAgIC8qIFNwZWNpYWwgaGFuZGxpbmcgb2YgMTYgY29sb3JzLCBiZWNhdXNlIHRlcm1jYXAgY2FuJ3QgaGFuZGxlIGl0ICovCisgICAgLyogQWxzbyBhY2NlcHQgIlxlWzMlZG0iIGZvciBURVJNSU5GTywgaXQgaXMgc29tZXRpbWVzIHVzZWQgKi8KKyAgICAvKiBBbHNvIGFjY2VwdCBDU0kgaW5zdGVhZCBvZiA8RXNjPlsgKi8KKyAgICBpZiAobiA+PSA4ICYmIHRfY29sb3JzID49IDE2CisJICAgICAgJiYgKChzWzBdID09IEVTQyAmJiBzWzFdID09ICdbJykgfHwgKHNbMF0gPT0gQ1NJICYmIChpID0gMSkgPT0gMSkpCisJICAgICAgJiYgc1tpXSAhPSBOVUwKKwkgICAgICAmJiAoU1RSQ01QKHMgKyBpICsgMSwgIiVwMSVkbSIpID09IDAKKwkJICB8fCBTVFJDTVAocyArIGkgKyAxLCAiJWRtIikgPT0gMCkKKwkgICAgICAmJiAoc1tpXSA9PSAnMycgfHwgc1tpXSA9PSAnNCcpKQorICAgIHsKKwlzcHJpbnRmKGJ1ZiwKKyNpZmRlZiBURVJNSU5GTworCQkiJXMlcyUlcDElJWRtIiwKKyNlbHNlCisJCSIlcyVzJSVkbSIsCisjZW5kaWYKKwkJaSA9PSAyID8gSUZfRUIoIlwwMzNbIiwgRVNDX1NUUiAiWyIpIDogIlwyMzMiLAorCQlzW2ldID09ICczJyA/IChuID49IDE2ID8gIjM4OzU7IiA6ICI5IikKKwkJCSAgICA6IChuID49IDE2ID8gIjQ4OzU7IiA6ICIxMCIpKTsKKwlPVVRfU1RSKHRnb3RvKGJ1ZiwgMCwgbiA+PSAxNiA/IG4gOiBuIC0gOCkpOworICAgIH0KKyAgICBlbHNlCisJT1VUX1NUUih0Z290bygoY2hhciAqKXMsIDAsIG4pKTsKK30KKworI2lmIChkZWZpbmVkKEZFQVRfVElUTEUpICYmIChkZWZpbmVkKFVOSVgpIHx8IGRlZmluZWQoT1MyKSB8fCBkZWZpbmVkKFZNUykgfHwgZGVmaW5lZChNQUNPU19YKSkpIHx8IGRlZmluZWQoUFJPVE8pCisvKgorICogR2VuZXJpYyBmdW5jdGlvbiB0byBzZXQgd2luZG93IHRpdGxlLCB1c2luZyB0X3RzIGFuZCB0X2ZzLgorICovCisgICAgdm9pZAordGVybV9zZXR0aXRsZSh0aXRsZSkKKyAgICBjaGFyX3UJKnRpdGxlOworeworICAgIC8qIHRfdHMgdGFrZXMgb25lIGFyZ3VtZW50OiBjb2x1bW4gaW4gc3RhdHVzIGxpbmUgKi8KKyAgICBPVVRfU1RSKHRnb3RvKChjaGFyICopVF9UUywgMCwgMCkpOwkvKiBzZXQgdGl0bGUgc3RhcnQgKi8KKyAgICBvdXRfc3RyX25mKHRpdGxlKTsKKyAgICBvdXRfc3RyKFRfRlMpOwkJCS8qIHNldCB0aXRsZSBlbmQgKi8KKyAgICBvdXRfZmx1c2goKTsKK30KKyNlbmRpZgorCisvKgorICogTWFrZSBzdXJlIHdlIGhhdmUgYSB2YWxpZCBzZXQgb3IgdGVybWluYWwgb3B0aW9ucy4KKyAqIFJlcGxhY2UgYWxsIGVudHJpZXMgdGhhdCBhcmUgTlVMTCBieSBlbXB0eV9vcHRpb24KKyAqLworICAgIHZvaWQKK3R0ZXN0KHBhaXJzKQorICAgIGludAlwYWlyczsKK3sKKyAgICBjaGVja19vcHRpb25zKCk7CQkgICAgLyogbWFrZSBzdXJlIG5vIG9wdGlvbnMgYXJlIE5VTEwgKi8KKworICAgIC8qCisgICAgICogTVVTVCBoYXZlICJjbSI6IGN1cnNvciBtb3Rpb24uCisgICAgICovCisgICAgaWYgKCpUX0NNID09IE5VTCkKKwlFTVNHKF8oIkU0Mzc6IHRlcm1pbmFsIGNhcGFiaWxpdHkgXCJjbVwiIHJlcXVpcmVkIikpOworCisgICAgLyoKKyAgICAgKiBpZiAiY3MiIGRlZmluZWQsIHVzZSBhIHNjcm9sbCByZWdpb24sIGl0J3MgZmFzdGVyLgorICAgICAqLworICAgIGlmICgqVF9DUyAhPSBOVUwpCisJc2Nyb2xsX3JlZ2lvbiA9IFRSVUU7CisgICAgZWxzZQorCXNjcm9sbF9yZWdpb24gPSBGQUxTRTsKKworICAgIGlmIChwYWlycykKKyAgICB7CisJLyoKKwkgKiBvcHRpb25hbCBwYWlycworCSAqLworCS8qIFRQIGdvZXMgdG8gbm9ybWFsIG1vZGUgZm9yIFRJIChpbnZlcnQpIGFuZCBUQiAoYm9sZCkgKi8KKwlpZiAoKlRfTUUgPT0gTlVMKQorCSAgICBUX01FID0gVF9NUiA9IFRfTUQgPSBUX01CID0gZW1wdHlfb3B0aW9uOworCWlmICgqVF9TTyA9PSBOVUwgfHwgKlRfU0UgPT0gTlVMKQorCSAgICBUX1NPID0gVF9TRSA9IGVtcHR5X29wdGlvbjsKKwlpZiAoKlRfVVMgPT0gTlVMIHx8ICpUX1VFID09IE5VTCkKKwkgICAgVF9VUyA9IFRfVUUgPSBlbXB0eV9vcHRpb247CisJaWYgKCpUX0NaSCA9PSBOVUwgfHwgKlRfQ1pSID09IE5VTCkKKwkgICAgVF9DWkggPSBUX0NaUiA9IGVtcHR5X29wdGlvbjsKKworCS8qIFRfVkUgaXMgbmVlZGVkIGV2ZW4gdGhvdWdoIFRfVkkgaXMgbm90IGRlZmluZWQgKi8KKwlpZiAoKlRfVkUgPT0gTlVMKQorCSAgICBUX1ZJID0gZW1wdHlfb3B0aW9uOworCisJLyogaWYgJ21yJyBvciAnbWUnIGlzIG5vdCBkZWZpbmVkIHVzZSAnc28nIGFuZCAnc2UnICovCisJaWYgKCpUX01FID09IE5VTCkKKwl7CisJICAgIFRfTUUgPSBUX1NFOworCSAgICBUX01SID0gVF9TTzsKKwkgICAgVF9NRCA9IFRfU087CisJfQorCisJLyogaWYgJ3NvJyBvciAnc2UnIGlzIG5vdCBkZWZpbmVkIHVzZSAnbXInIGFuZCAnbWUnICovCisJaWYgKCpUX1NPID09IE5VTCkKKwl7CisJICAgIFRfU0UgPSBUX01FOworCSAgICBpZiAoKlRfTVIgPT0gTlVMKQorCQlUX1NPID0gVF9NRDsKKwkgICAgZWxzZQorCQlUX1NPID0gVF9NUjsKKwl9CisKKwkvKiBpZiAnWkgnIG9yICdaUicgaXMgbm90IGRlZmluZWQgdXNlICdtcicgYW5kICdtZScgKi8KKwlpZiAoKlRfQ1pIID09IE5VTCkKKwl7CisJICAgIFRfQ1pSID0gVF9NRTsKKwkgICAgaWYgKCpUX01SID09IE5VTCkKKwkJVF9DWkggPSBUX01EOworCSAgICBlbHNlCisJCVRfQ1pIID0gVF9NUjsKKwl9CisKKwkvKiAiU2IiIGFuZCAiU2YiIGNvbWUgaW4gcGFpcnMgKi8KKwlpZiAoKlRfQ1NCID09IE5VTCB8fCAqVF9DU0YgPT0gTlVMKQorCXsKKwkgICAgVF9DU0IgPSBlbXB0eV9vcHRpb247CisJICAgIFRfQ1NGID0gZW1wdHlfb3B0aW9uOworCX0KKworCS8qICJBQiIgYW5kICJBRiIgY29tZSBpbiBwYWlycyAqLworCWlmICgqVF9DQUIgPT0gTlVMIHx8ICpUX0NBRiA9PSBOVUwpCisJeworCSAgICBUX0NBQiA9IGVtcHR5X29wdGlvbjsKKwkgICAgVF9DQUYgPSBlbXB0eV9vcHRpb247CisJfQorCisJLyogaWYgJ1NiJyBhbmQgJ0FCJyBhcmUgbm90IGRlZmluZWQsIHJlc2V0ICJDbyIgKi8KKwlpZiAoKlRfQ1NCID09IE5VTCAmJiAqVF9DQUIgPT0gTlVMKQorCSAgICBUX0NDTyA9IGVtcHR5X29wdGlvbjsKKworCS8qIFNldCAnd2VpcmRpbnZlcnQnIGFjY29yZGluZyB0byB2YWx1ZSBvZiAndF94cycgKi8KKwlwX3dpdiA9ICgqVF9YUyAhPSBOVUwpOworICAgIH0KKyAgICBuZWVkX2dhdGhlciA9IFRSVUU7CisKKyAgICAvKiBTZXQgdF9jb2xvcnMgdG8gdGhlIHZhbHVlIG9mIHRfQ28uICovCisgICAgdF9jb2xvcnMgPSBhdG9pKChjaGFyICopVF9DQ08pOworfQorCisjaWYgKGRlZmluZWQoRkVBVF9HVUkpICYmIChkZWZpbmVkKEZFQVRfTUVOVSkgfHwgIWRlZmluZWQoVVNFX09OX0ZMWV9TQ1JPTEwpKSkgXAorCXx8IGRlZmluZWQoUFJPVE8pCisvKgorICogUmVwcmVzZW50IHRoZSBnaXZlbiBsb25nX3UgYXMgaW5kaXZpZHVhbCBieXRlcywgd2l0aCB0aGUgbW9zdCBzaWduaWZpY2FudAorICogYnl0ZSBmaXJzdCwgYW5kIHN0b3JlIHRoZW0gaW4gZHN0LgorICovCisgICAgdm9pZAorYWRkX2xvbmdfdG9fYnVmKHZhbCwgZHN0KQorICAgIGxvbmdfdSAgdmFsOworICAgIGNoYXJfdSAgKmRzdDsKK3sKKyAgICBpbnQJICAgIGk7CisgICAgaW50CSAgICBzaGlmdDsKKworICAgIGZvciAoaSA9IDE7IGkgPD0gc2l6ZW9mKGxvbmdfdSk7IGkrKykKKyAgICB7CisJc2hpZnQgPSA4ICogKHNpemVvZihsb25nX3UpIC0gaSk7CisJZHN0W2kgLSAxXSA9IChjaGFyX3UpICgodmFsID4+IHNoaWZ0KSAmIDB4ZmYpOworICAgIH0KK30KKworc3RhdGljIGludCBnZXRfbG9uZ19mcm9tX2J1ZiBfX0FSR1MoKGNoYXJfdSAqYnVmLCBsb25nX3UgKnZhbCkpOworCisvKgorICogSW50ZXJwcmV0IHRoZSBuZXh0IHN0cmluZyBvZiBieXRlcyBpbiBidWYgYXMgYSBsb25nIGludGVnZXIsIHdpdGggdGhlIG1vc3QKKyAqIHNpZ25pZmljYW50IGJ5dGUgZmlyc3QuICBOb3RlIHRoYXQgaXQgaXMgYXNzdW1lZCB0aGF0IGJ1ZiBoYXMgYmVlbiB0aHJvdWdoCisgKiBpbmNoYXIoKSwgc28gdGhhdCBOVUwgYW5kIEtfU1BFQ0lBTCB3aWxsIGJlIHJlcHJlc2VudGVkIGFzIHRocmVlIGJ5dGVzIGVhY2guCisgKiBQdXRzIHJlc3VsdCBpbiB2YWwsIGFuZCByZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVhZCBmcm9tIGJ1ZgorICogKGJldHdlZW4gc2l6ZW9mKGxvbmdfdSkgYW5kIDIgKiBzaXplb2YobG9uZ191KSksIG9yIC0xIGlmIG5vdCBlbm91Z2ggYnl0ZXMKKyAqIHdlcmUgcHJlc2VudC4KKyAqLworICAgIHN0YXRpYyBpbnQKK2dldF9sb25nX2Zyb21fYnVmKGJ1ZiwgdmFsKQorICAgIGNoYXJfdSAgKmJ1ZjsKKyAgICBsb25nX3UgICp2YWw7Cit7CisgICAgaW50CSAgICBsZW47CisgICAgY2hhcl91ICBieXRlc1tzaXplb2YobG9uZ191KV07CisgICAgaW50CSAgICBpOworICAgIGludAkgICAgc2hpZnQ7CisKKyAgICAqdmFsID0gMDsKKyAgICBsZW4gPSBnZXRfYnl0ZXNfZnJvbV9idWYoYnVmLCBieXRlcywgKGludClzaXplb2YobG9uZ191KSk7CisgICAgaWYgKGxlbiAhPSAtMSkKKyAgICB7CisJZm9yIChpID0gMDsgaSA8IHNpemVvZihsb25nX3UpOyBpKyspCisJeworCSAgICBzaGlmdCA9IDggKiAoc2l6ZW9mKGxvbmdfdSkgLSAxIC0gaSk7CisJICAgICp2YWwgKz0gKGxvbmdfdSlieXRlc1tpXSA8PCBzaGlmdDsKKwl9CisgICAgfQorICAgIHJldHVybiBsZW47Cit9CisjZW5kaWYKKworI2lmIGRlZmluZWQoRkVBVF9HVUkpIFwKKyAgICB8fCAoZGVmaW5lZChGRUFUX01PVVNFKSAmJiAoIWRlZmluZWQoVU5JWCkgfHwgZGVmaW5lZChGRUFUX01PVVNFX1hURVJNKSkpCisvKgorICogUmVhZCB0aGUgbmV4dCBudW1fYnl0ZXMgYnl0ZXMgZnJvbSBidWYsIGFuZCBzdG9yZSB0aGVtIGluIGJ5dGVzLiAgQXNzdW1lCisgKiB0aGF0IGJ1ZiBoYXMgYmVlbiB0aHJvdWdoIGluY2hhcigpLglSZXR1cm5zIHRoZSBhY3R1YWwgbnVtYmVyIG9mIGJ5dGVzIHVzZWQKKyAqIGZyb20gYnVmIChiZXR3ZWVuIG51bV9ieXRlcyBhbmQgbnVtX2J5dGVzKjIpLCBvciAtMSBpZiBub3QgZW5vdWdoIGJ5dGVzIHdlcmUKKyAqIGF2YWlsYWJsZS4KKyAqLworICAgIHN0YXRpYyBpbnQKK2dldF9ieXRlc19mcm9tX2J1ZihidWYsIGJ5dGVzLCBudW1fYnl0ZXMpCisgICAgY2hhcl91ICAqYnVmOworICAgIGNoYXJfdSAgKmJ5dGVzOworICAgIGludAkgICAgbnVtX2J5dGVzOworeworICAgIGludAkgICAgbGVuID0gMDsKKyAgICBpbnQJICAgIGk7CisgICAgY2hhcl91ICBjOworCisgICAgZm9yIChpID0gMDsgaSA8IG51bV9ieXRlczsgaSsrKQorICAgIHsKKwlpZiAoKGMgPSBidWZbbGVuKytdKSA9PSBOVUwpCisJICAgIHJldHVybiAtMTsKKwlpZiAoYyA9PSBLX1NQRUNJQUwpCisJeworCSAgICBpZiAoYnVmW2xlbl0gPT0gTlVMIHx8IGJ1ZltsZW4gKyAxXSA9PSBOVUwpCSAgICAvKiBjYW5ub3QgaGFwcGVuPyAqLworCQlyZXR1cm4gLTE7CisJICAgIGlmIChidWZbbGVuKytdID09IChpbnQpS1NfWkVSTykKKwkJYyA9IE5VTDsKKwkgICAgKytsZW47CS8qIHNraXAgS0VfRklMTEVSICovCisJICAgIC8qIGVsc2UgaXQgc2hvdWxkIGJlIEtTX1NQRUNJQUwsIGFuZCBjIGFscmVhZHkgZXF1YWxzIEtfU1BFQ0lBTCAqLworCX0KKwlieXRlc1tpXSA9IGM7CisgICAgfQorICAgIHJldHVybiBsZW47Cit9CisjZW5kaWYKKworLyoKKyAqIENoZWNrIGlmIHRoZSBuZXcgc2hlbGwgc2l6ZSBpcyB2YWxpZCwgY29ycmVjdCBpdCBpZiBpdCdzIHRvbyBzbWFsbC4KKyAqLworICAgIHZvaWQKK2NoZWNrX3NoZWxsc2l6ZSgpCit7CisgICAgaWYgKENvbHVtbnMgPCBNSU5fQ09MVU1OUykKKwlDb2x1bW5zID0gTUlOX0NPTFVNTlM7CisgICAgaWYgKFJvd3MgPCBtaW5fcm93cygpKQkvKiBuZWVkIHJvb20gZm9yIG9uZSB3aW5kb3cgYW5kIGNvbW1hbmQgbGluZSAqLworCVJvd3MgPSBtaW5fcm93cygpOworfQorCisgICAgdm9pZAord2luX25ld19zaGVsbHNpemUoKQoreworICAgIHN0YXRpYyBpbnQJb2xkX1Jvd3MgPSAwOworICAgIHN0YXRpYyBpbnQJb2xkX0NvbHVtbnMgPSAwOworCisgICAgaWYgKG9sZF9Sb3dzICE9IFJvd3MgfHwgb2xkX0NvbHVtbnMgIT0gQ29sdW1ucykKKwl1aV9uZXdfc2hlbGxzaXplKCk7CisgICAgaWYgKG9sZF9Sb3dzICE9IFJvd3MpCisgICAgeworCW9sZF9Sb3dzID0gUm93czsKKwlzaGVsbF9uZXdfcm93cygpOwkvKiB1cGRhdGUgd2luZG93IHNpemVzICovCisgICAgfQorICAgIGlmIChvbGRfQ29sdW1ucyAhPSBDb2x1bW5zKQorICAgIHsKKwlvbGRfQ29sdW1ucyA9IENvbHVtbnM7CisjaWZkZWYgRkVBVF9WRVJUU1BMSVQKKwlzaGVsbF9uZXdfY29sdW1ucygpOwkvKiB1cGRhdGUgd2luZG93IHNpemVzICovCisjZW5kaWYKKyAgICB9Cit9CisKKy8qCisgKiBDYWxsIHRoaXMgZnVuY3Rpb24gd2hlbiB0aGUgVmltIHNoZWxsIGhhcyBiZWVuIHJlc2l6ZWQgaW4gYW55IHdheS4KKyAqIFdpbGwgb2J0YWluIHRoZSBjdXJyZW50IHNpemUgYW5kIHJlZHJhdyAoYWxzbyB3aGVuIHNpemUgZGlkbid0IGNoYW5nZSkuCisgKi8KKyAgICB2b2lkCitzaGVsbF9yZXNpemVkKCkKK3sKKyAgICBzZXRfc2hlbGxzaXplKDAsIDAsIEZBTFNFKTsKK30KKworLyoKKyAqIENoZWNrIGlmIHRoZSBzaGVsbCBzaXplIGNoYW5nZWQuICBIYW5kbGUgYSByZXNpemUuCisgKiBXaGVuIHRoZSBzaXplIGRpZG4ndCBjaGFuZ2UsIG5vdGhpbmcgaGFwcGVucy4KKyAqLworICAgIHZvaWQKK3NoZWxsX3Jlc2l6ZWRfY2hlY2soKQoreworICAgIGludAkJb2xkX1Jvd3MgPSBSb3dzOworICAgIGludAkJb2xkX0NvbHVtbnMgPSBDb2x1bW5zOworCisgICAgKHZvaWQpdWlfZ2V0X3NoZWxsc2l6ZSgpOworICAgIGNoZWNrX3NoZWxsc2l6ZSgpOworICAgIGlmIChvbGRfUm93cyAhPSBSb3dzIHx8IG9sZF9Db2x1bW5zICE9IENvbHVtbnMpCisJc2hlbGxfcmVzaXplZCgpOworfQorCisvKgorICogU2V0IHNpemUgb2YgdGhlIFZpbSBzaGVsbC4KKyAqIElmICdtdXN0c2V0JyBpcyBUUlVFLCB3ZSBtdXN0IHNldCBSb3dzIGFuZCBDb2x1bW5zLCBkbyBub3QgZ2V0IHRoZSByZWFsCisgKiB3aW5kb3cgc2l6ZSAodGhpcyBpcyB1c2VkIGZvciB0aGUgOndpbiBjb21tYW5kKS4KKyAqIElmICdtdXN0c2V0JyBpcyBGQUxTRSwgd2UgbWF5IHRyeSB0byBnZXQgdGhlIHJlYWwgd2luZG93IHNpemUgYW5kIGlmCisgKiBpdCBmYWlscyB1c2UgJ3dpZHRoJyBhbmQgJ2hlaWdodCcuCisgKi8KKyAgICB2b2lkCitzZXRfc2hlbGxzaXplKHdpZHRoLCBoZWlnaHQsIG11c3RzZXQpCisgICAgaW50CSAgICB3aWR0aCwgaGVpZ2h0OworICAgIGludAkgICAgbXVzdHNldDsKK3sKKyAgICBzdGF0aWMgaW50CQlidXN5ID0gRkFMU0U7CisKKyAgICAvKgorICAgICAqIEF2b2lkIHJlY3Vyc2l2ZW5lc3MsIGNhbiBoYXBwZW4gd2hlbiBzZXR0aW5nIHRoZSB3aW5kb3cgc2l6ZSBjYXVzZXMKKyAgICAgKiBhbm90aGVyIHdpbmRvdy1jaGFuZ2VkIHNpZ25hbC4KKyAgICAgKi8KKyAgICBpZiAoYnVzeSkKKwlyZXR1cm47CisKKyAgICBpZiAod2lkdGggPCAwIHx8IGhlaWdodCA8IDApICAgIC8qIGp1c3QgY2hlY2tpbmcuLi4gKi8KKwlyZXR1cm47CisKKyAgICBpZiAoU3RhdGUgPT0gSElUUkVUVVJOIHx8IFN0YXRlID09IFNFVFdTSVpFKSAvKiBwb3N0cG9uZSB0aGUgcmVzaXppbmcgKi8KKyAgICB7CisJU3RhdGUgPSBTRVRXU0laRTsKKwlyZXR1cm47CisgICAgfQorCisgICAgKytidXN5OworCisjaWZkZWYgQU1JR0EKKyAgICBvdXRfZmx1c2goKTsJICAgIC8qIG11c3QgZG8gdGhpcyBiZWZvcmUgbWNoX2dldF9zaGVsbHNpemUoKSBmb3IKKwkJCSAgICAgICBzb21lIG9ic2N1cmUgcmVhc29uICovCisjZW5kaWYKKworICAgIGlmIChtdXN0c2V0IHx8ICh1aV9nZXRfc2hlbGxzaXplKCkgPT0gRkFJTCAmJiBoZWlnaHQgIT0gMCkpCisgICAgeworCVJvd3MgPSBoZWlnaHQ7CisJQ29sdW1ucyA9IHdpZHRoOworCWNoZWNrX3NoZWxsc2l6ZSgpOworCXVpX3NldF9zaGVsbHNpemUobXVzdHNldCk7CisgICAgfQorICAgIGVsc2UKKwljaGVja19zaGVsbHNpemUoKTsKKworICAgIC8qIFRoZSB3aW5kb3cgbGF5b3V0IHVzZWQgdG8gYmUgYWRqdXN0ZWQgaGVyZSwgYnV0IGl0IG5vdyBoYXBwZW5zIGluCisgICAgICogc2NyZWVuYWxsb2MoKSAoYWxzbyBpbnZva2VkIGZyb20gc2NyZWVuY2xlYXIoKSkuICBUaGF0IGlzIGJlY2F1c2UgdGhlCisgICAgICogImJ1c3kiIGNoZWNrIGFib3ZlIG1heSBza2lwIHRoaXMsIGJ1dCBub3Qgc2NyZWVuYWxsb2MoKS4gKi8KKworICAgIGlmIChTdGF0ZSAhPSBBU0tNT1JFICYmIFN0YXRlICE9IEVYVEVSTkNNRCAmJiBTdGF0ZSAhPSBDT05GSVJNKQorCXNjcmVlbmNsZWFyKCk7CisgICAgZWxzZQorCXNjcmVlbl9zdGFydCgpOwkgICAgLyogZG9uJ3Qga25vdyB3aGVyZSBjdXJzb3IgaXMgbm93ICovCisKKyAgICBpZiAoc3RhcnRpbmcgIT0gTk9fU0NSRUVOKQorICAgIHsKKyNpZmRlZiBGRUFUX1RJVExFCisJbWFrZXRpdGxlKCk7CisjZW5kaWYKKwljaGFuZ2VkX2xpbmVfYWJ2X2N1cnMoKTsKKwlpbnZhbGlkYXRlX2JvdGxpbmUoKTsKKworCS8qCisJICogV2Ugb25seSByZWRyYXcgd2hlbiBpdCdzIG5lZWRlZDoKKwkgKiAtIFdoaWxlIGF0IHRoZSBtb3JlIHByb21wdCBvciBleGVjdXRpbmcgYW4gZXh0ZXJuYWwgY29tbWFuZCwgZG9uJ3QKKwkgKiAgIHJlZHJhdywgYnV0IHBvc2l0aW9uIHRoZSBjdXJzb3IuCisJICogLSBXaGlsZSBlZGl0aW5nIHRoZSBjb21tYW5kIGxpbmUsIG9ubHkgcmVkcmF3IHRoYXQuCisJICogLSBpbiBFeCBtb2RlLCBkb24ndCByZWRyYXcgYW55dGhpbmcuCisJICogLSBPdGhlcndpc2UsIHJlZHJhdyByaWdodCBub3csIGFuZCBwb3NpdGlvbiB0aGUgY3Vyc29yLgorCSAqIEFsd2F5cyBuZWVkIHRvIGNhbGwgdXBkYXRlX3NjcmVlbigpIG9yIHNjcmVlbmFsbG9jKCksIHRvIG1ha2UKKwkgKiBzdXJlIFJvd3MvQ29sdW1ucyBhbmQgdGhlIHNpemUgb2YgU2NyZWVuTGluZXNbXSBpcyBjb3JyZWN0IQorCSAqLworCWlmIChTdGF0ZSA9PSBBU0tNT1JFIHx8IFN0YXRlID09IEVYVEVSTkNNRCB8fCBTdGF0ZSA9PSBDT05GSVJNCisJCQkJCQkJICAgICB8fCBleG1vZGVfYWN0aXZlKQorCXsKKwkgICAgc2NyZWVuYWxsb2MoRkFMU0UpOworCSAgICByZXBlYXRfbWVzc2FnZSgpOworCX0KKwllbHNlIGlmIChTdGF0ZSAmIENNRExJTkUpCisJeworCSAgICB1cGRhdGVfc2NyZWVuKE5PVF9WQUxJRCk7CisJICAgIHJlZHJhd2NtZGxpbmUoKTsKKwl9CisJZWxzZQorCXsKKwkgICAgdXBkYXRlX3RvcGxpbmUoKTsKKwkgICAgdXBkYXRlX3NjcmVlbihOT1RfVkFMSUQpOworCSAgICBpZiAocmVkcmF3aW5nKCkpCisJCXNldGN1cnNvcigpOworCX0KKwljdXJzb3Jfb24oKTsJICAgIC8qIHJlZHJhd2luZyBtYXkgaGF2ZSBzd2l0Y2hlZCBpdCBvZmYgKi8KKyAgICB9CisgICAgb3V0X2ZsdXNoKCk7CisgICAgLS1idXN5OworfQorCisvKgorICogU2V0IHRoZSB0ZXJtaW5hbCB0byBUTU9ERV9SQVcgKGZvciBOb3JtYWwgbW9kZSkgb3IgVE1PREVfQ09PSyAoZm9yIGV4dGVybmFsCisgKiBjb21tYW5kcyBhbmQgRXggbW9kZSkuCisgKi8KKyAgICB2b2lkCitzZXR0bW9kZSh0bW9kZSkKKyAgICBpbnQJIHRtb2RlOworeworI2lmZGVmIEZFQVRfR1VJCisgICAgLyogZG9uJ3Qgc2V0IHRoZSB0ZXJtIHdoZXJlIGd2aW0gd2FzIHN0YXJ0ZWQgdG8gYW55IG1vZGUgKi8KKyAgICBpZiAoZ3VpLmluX3VzZSkKKwlyZXR1cm47CisjZW5kaWYKKworICAgIGlmIChmdWxsX3NjcmVlbikKKyAgICB7CisJLyogSW4gRXggbW9kZSwgbmV2ZXIgc2V0IHRvIFJBVyAqLworCWlmIChleG1vZGVfYWN0aXZlID09IEVYTU9ERV9OT1JNQUwpCisJICAgIHRtb2RlID0gVE1PREVfQ09PSzsKKworCS8qCisJICogV2hlbiByZXR1cm5pbmcgYWZ0ZXIgY2FsbGluZyBhIHNoZWxsIHdlIHdhbnQgdG8gcmVhbGx5IHNldCB0aGUKKwkgKiB0ZXJtaW5hbCB0byByYXcgbW9kZSwgZXZlbiB0aG91Z2ggd2UgdGhpbmsgaXQgYWxyZWFkeSBpcywgYmVjYXVzZQorCSAqIHRoZSBzaGVsbCBwcm9ncmFtIG1heSBoYXZlIHJlc2V0IHRoZSB0ZXJtaW5hbCBtb2RlLgorCSAqIFdoZW4gd2UgdGhpbmsgdGhlIHRlcm1pbmFsIGlzIG5vcm1hbCwgZG9uJ3QgdHJ5IHRvIHNldCBpdCB0bworCSAqIG5vcm1hbCBhZ2FpbiwgYmVjYXVzZSB0aGF0IGNhdXNlcyBwcm9ibGVtcyAobG9nb3V0ISkgb24gc29tZQorCSAqIG1hY2hpbmVzLgorCSAqLworCWlmICh0bW9kZSAhPSBUTU9ERV9DT09LIHx8IGN1cl90bW9kZSAhPSBUTU9ERV9DT09LKQorCXsKKyNpZmRlZiBGRUFUX1RFUk1SRVNQT05TRQorCSAgICAvKiBNYXkgbmVlZCB0byBjaGVjayBmb3IgVF9DUlYgcmVzcG9uc2UgYW5kIHRlcm1jb2RlcywgaXQgZG9lc24ndAorCSAgICAgKiB3b3JrIGluIENvb2tlZCBtb2RlLCBhbiBleHRlcm5hbCBwcm9ncmFtIG1heSBnZXQgdGhlbS4gKi8KKwkgICAgaWYgKHRtb2RlICE9IFRNT0RFX1JBVyAmJiBjcnZfc3RhdHVzID09IENSVl9TRU5UKQorCQkodm9pZCl2cGVla2Nfbm9tYXAoKTsKKwkgICAgY2hlY2tfZm9yX2NvZGVzX2Zyb21fdGVybSgpOworI2VuZGlmCisjaWZkZWYgRkVBVF9NT1VTRV9UVFkKKwkgICAgaWYgKHRtb2RlICE9IFRNT0RFX1JBVykKKwkJbWNoX3NldG1vdXNlKEZBTFNFKTsJCS8qIHN3aXRjaCBtb3VzZSBvZmYgKi8KKyNlbmRpZgorCSAgICBvdXRfZmx1c2goKTsKKwkgICAgbWNoX3NldHRtb2RlKHRtb2RlKTsgICAgLyogbWFjaGluZSBzcGVjaWZpYyBmdW5jdGlvbiAqLworCSAgICBjdXJfdG1vZGUgPSB0bW9kZTsKKyNpZmRlZiBGRUFUX01PVVNFCisJICAgIGlmICh0bW9kZSA9PSBUTU9ERV9SQVcpCisJCXNldG1vdXNlKCk7CQkJLyogbWF5IHN3aXRjaCBtb3VzZSBvbiAqLworI2VuZGlmCisJICAgIG91dF9mbHVzaCgpOworCX0KKyNpZmRlZiBGRUFUX1RFUk1SRVNQT05TRQorCW1heV9yZXFfdGVybXJlc3BvbnNlKCk7CisjZW5kaWYKKyAgICB9Cit9CisKKyAgICB2b2lkCitzdGFydHRlcm1jYXAoKQoreworICAgIGlmIChmdWxsX3NjcmVlbiAmJiAhdGVybWNhcF9hY3RpdmUpCisgICAgeworCW91dF9zdHIoVF9USSk7CQkJLyogc3RhcnQgdGVybWNhcCBtb2RlICovCisJb3V0X3N0cihUX0tTKTsJCQkvKiBzdGFydCAia2V5cGFkIHRyYW5zbWl0IiBtb2RlICovCisJb3V0X2ZsdXNoKCk7CisJdGVybWNhcF9hY3RpdmUgPSBUUlVFOworCXNjcmVlbl9zdGFydCgpOwkJCS8qIGRvbid0IGtub3cgd2hlcmUgY3Vyc29yIGlzIG5vdyAqLworI2lmZGVmIEZFQVRfVEVSTVJFU1BPTlNFCisJbWF5X3JlcV90ZXJtcmVzcG9uc2UoKTsKKwkvKiBJbW1lZGlhdGVseSBjaGVjayBmb3IgYSByZXNwb25zZS4gIElmIHRfQ28gY2hhbmdlcywgd2UgZG9uJ3Qgd2FudAorCSAqIHRvIHJlZHJhdyB3aXRoIHdyb25nIGNvbG9ycyBmaXJzdC4gKi8KKwljaGVja19mb3JfY29kZXNfZnJvbV90ZXJtKCk7CisjZW5kaWYKKyAgICB9Cit9CisKKyAgICB2b2lkCitzdG9wdGVybWNhcCgpCit7CisgICAgc2NyZWVuX3N0b3BfaGlnaGxpZ2h0KCk7CisgICAgcmVzZXRfY3Rlcm1fY29sb3JzKCk7CisgICAgaWYgKHRlcm1jYXBfYWN0aXZlKQorICAgIHsKKyNpZmRlZiBGRUFUX1RFUk1SRVNQT05TRQorCS8qIE1heSBuZWVkIHRvIGNoZWNrIGZvciBUX0NSViByZXNwb25zZS4gKi8KKwlpZiAoY3J2X3N0YXR1cyA9PSBDUlZfU0VOVCkKKwkgICAgKHZvaWQpdnBlZWtjX25vbWFwKCk7CisJLyogQ2hlY2sgZm9yIHRlcm1jb2RlcyBmaXJzdCwgb3RoZXJ3aXNlIGFuIGV4dGVybmFsIHByb2dyYW0gbWF5IGdldAorCSAqIHRoZW0uICovCisJY2hlY2tfZm9yX2NvZGVzX2Zyb21fdGVybSgpOworI2VuZGlmCisJb3V0X3N0cihUX0tFKTsJCQkvKiBzdG9wICJrZXlwYWQgdHJhbnNtaXQiIG1vZGUgKi8KKwlvdXRfZmx1c2goKTsKKwl0ZXJtY2FwX2FjdGl2ZSA9IEZBTFNFOworCWN1cnNvcl9vbigpOwkJCS8qIGp1c3QgaW4gY2FzZSBpdCBpcyBzdGlsbCBvZmYgKi8KKwlvdXRfc3RyKFRfVEUpOwkJCS8qIHN0b3AgdGVybWNhcCBtb2RlICovCisJc2NyZWVuX3N0YXJ0KCk7CQkJLyogZG9uJ3Qga25vdyB3aGVyZSBjdXJzb3IgaXMgbm93ICovCisJb3V0X2ZsdXNoKCk7CisgICAgfQorfQorCisjaWZkZWYgRkVBVF9URVJNUkVTUE9OU0UKKy8qCisgKiBSZXF1ZXN0IHZlcnNpb24gc3RyaW5nIChmb3IgeHRlcm0pIHdoZW4gbmVlZGVkLgorICogT25seSBkbyB0aGlzIGFmdGVyIHN3aXRjaGluZyB0byByYXcgbW9kZSwgb3RoZXJ3aXNlIHRoZSByZXN1bHQgd2lsbCBiZQorICogZWNob2VkLgorICogT25seSBkbyB0aGlzIGFmdGVyIHRlcm1jYXAgbW9kZSBoYXMgYmVlbiBzdGFydGVkLCBvdGhlcndpc2UgdGhlIGNvZGVzIGZvcgorICogdGhlIGN1cnNvciBrZXlzIG1heSBiZSB3cm9uZy4KKyAqIFRoZSByZXN1bHQgaXMgY2F1Z2h0IGluIGNoZWNrX3Rlcm1jb2RlKCkuCisgKi8KKyAgICBzdGF0aWMgdm9pZAorbWF5X3JlcV90ZXJtcmVzcG9uc2UoKQoreworICAgIGlmIChjcnZfc3RhdHVzID09IENSVl9HRVQKKwkgICAgJiYgY3VyX3Rtb2RlID09IFRNT0RFX1JBVworCSAgICAmJiB0ZXJtY2FwX2FjdGl2ZQorI2lmZGVmIFVOSVgKKwkgICAgJiYgaXNhdHR5KDEpCisjZW5kaWYKKwkgICAgJiYgKlRfQ1JWICE9IE5VTCkKKyAgICB7CisJb3V0X3N0cihUX0NSVik7CisJY3J2X3N0YXR1cyA9IENSVl9TRU5UOworCS8qIGNoZWNrIGZvciB0aGUgY2hhcmFjdGVycyBub3csIG90aGVyd2lzZSB0aGV5IG1pZ2h0IGJlIGVhdGVuIGJ5CisJICogZ2V0X2tleXN0cm9rZSgpICovCisJb3V0X2ZsdXNoKCk7CisJKHZvaWQpdnBlZWtjX25vbWFwKCk7CisgICAgfQorfQorI2VuZGlmCisKKy8qCisgKiBSZXR1cm4gVFJVRSB3aGVuIHNhdmluZyBhbmQgcmVzdG9yaW5nIHRoZSBzY3JlZW4uCisgKi8KKyAgICBpbnQKK3N3YXBwaW5nX3NjcmVlbigpCit7CisgICAgcmV0dXJuIChmdWxsX3NjcmVlbiAmJiAqVF9USSAhPSBOVUwpOworfQorCisjaWZkZWYgRkVBVF9NT1VTRQorLyoKKyAqIHNldG1vdXNlKCkgLSBzd2l0Y2ggbW91c2Ugb24vb2ZmIGRlcGVuZGluZyBvbiBjdXJyZW50IG1vZGUgYW5kICdtb3VzZScKKyAqLworICAgIHZvaWQKK3NldG1vdXNlKCkKK3sKKyMgaWZkZWYgRkVBVF9NT1VTRV9UVFkKKyAgICBpbnQJICAgIGNoZWNrZm9yOworIyBlbmRpZgorCisjIGlmZGVmIEZFQVRfTU9VU0VTSEFQRQorICAgIHVwZGF0ZV9tb3VzZXNoYXBlKC0xKTsKKyMgZW5kaWYKKworIyBpZmRlZiBGRUFUX01PVVNFX1RUWSAvKiBTaG91bGQgYmUgb3V0c2lkZSBwcm9jLCBidXQgbWF5IGJyZWFrIE1PVVNFU0hBUEUgKi8KKyMgIGlmZGVmIEZFQVRfR1VJCisgICAgLyogSW4gdGhlIEdVSSB0aGUgbW91c2UgaXMgYWx3YXlzIGVuYWJsZWQuICovCisgICAgaWYgKGd1aS5pbl91c2UpCisJcmV0dXJuOworIyAgZW5kaWYKKyAgICAvKiBiZSBxdWljayB3aGVuIG1vdXNlIGlzIG9mZiAqLworICAgIGlmICgqcF9tb3VzZSA9PSBOVUwgfHwgaGFzX21vdXNlX3Rlcm1jb2RlID09IDApCisJcmV0dXJuOworCisgICAgLyogZG9uJ3Qgc3dpdGNoIG1vdXNlIG9uIHdoZW4gbm90IGluIHJhdyBtb2RlIChFeCBtb2RlKSAqLworICAgIGlmIChjdXJfdG1vZGUgIT0gVE1PREVfUkFXKQorICAgIHsKKwltY2hfc2V0bW91c2UoRkFMU0UpOworCXJldHVybjsKKyAgICB9CisKKyMgIGlmZGVmIEZFQVRfVklTVUFMCisgICAgaWYgKFZJc3VhbF9hY3RpdmUpCisJY2hlY2tmb3IgPSBNT1VTRV9WSVNVQUw7CisgICAgZWxzZQorIyAgZW5kaWYKKwlpZiAoU3RhdGUgPT0gSElUUkVUVVJOIHx8IFN0YXRlID09IEFTS01PUkUgfHwgU3RhdGUgPT0gU0VUV1NJWkUpCisJY2hlY2tmb3IgPSBNT1VTRV9SRVRVUk47CisgICAgZWxzZSBpZiAoU3RhdGUgJiBJTlNFUlQpCisJY2hlY2tmb3IgPSBNT1VTRV9JTlNFUlQ7CisgICAgZWxzZSBpZiAoU3RhdGUgJiBDTURMSU5FKQorCWNoZWNrZm9yID0gTU9VU0VfQ09NTUFORDsKKyAgICBlbHNlIGlmIChTdGF0ZSA9PSBDT05GSVJNIHx8IFN0YXRlID09IEVYVEVSTkNNRCkKKwljaGVja2ZvciA9ICcgJzsgLyogZG9uJ3QgdXNlIG1vdXNlIGZvciAiOmNvbmZpcm0iIG9yICI6IWNtZCIgKi8KKyAgICBlbHNlCisJY2hlY2tmb3IgPSBNT1VTRV9OT1JNQUw7ICAgIC8qIGFzc3VtZSBub3JtYWwgbW9kZSAqLworCisgICAgaWYgKG1vdXNlX2hhcyhjaGVja2ZvcikpCisJbWNoX3NldG1vdXNlKFRSVUUpOworICAgIGVsc2UKKwltY2hfc2V0bW91c2UoRkFMU0UpOworIyBlbmRpZgorfQorCisvKgorICogUmV0dXJuIFRSVUUgaWYKKyAqIC0gImMiIGlzIGluICdtb3VzZScsIG9yCisgKiAtICdhJyBpcyBpbiAnbW91c2UnIGFuZCAiYyIgaXMgaW4gTU9VU0VfQSwgb3IKKyAqIC0gdGhlIGN1cnJlbnQgYnVmZmVyIGlzIGEgaGVscCBmaWxlIGFuZCAnaCcgaXMgaW4gJ21vdXNlJyBhbmQgd2UgYXJlIGluIGEKKyAqICAgbm9ybWFsIGVkaXRpbmcgbW9kZSAobm90IGF0IGhpdC1yZXR1cm4gbWVzc2FnZSkuCisgKi8KKyAgICBpbnQKK21vdXNlX2hhcyhjKQorICAgIGludAkgICAgYzsKK3sKKyAgICBjaGFyX3UJKnA7CisKKyAgICBmb3IgKHAgPSBwX21vdXNlOyAqcDsgKytwKQorCXN3aXRjaCAoKnApCisJeworCSAgICBjYXNlICdhJzogaWYgKHZpbV9zdHJjaHIoKGNoYXJfdSAqKU1PVVNFX0EsIGMpICE9IE5VTEwpCisJCQkgIHJldHVybiBUUlVFOworCQkgICAgICBicmVhazsKKwkgICAgY2FzZSBNT1VTRV9IRUxQOiBpZiAoYyAhPSBNT1VTRV9SRVRVUk4gJiYgY3VyYnVmLT5iX2hlbHApCisJCQkJIHJldHVybiBUUlVFOworCQkJICAgICBicmVhazsKKwkgICAgZGVmYXVsdDogaWYgKGMgPT0gKnApIHJldHVybiBUUlVFOyBicmVhazsKKwl9CisgICAgcmV0dXJuIEZBTFNFOworfQorCisvKgorICogUmV0dXJuIFRSVUUgd2hlbiAnbW91c2Vtb2RlbCcgaXMgc2V0IHRvICJwb3B1cCIgb3IgInBvcHVwX3NldHBvcyIuCisgKi8KKyAgICBpbnQKK21vdXNlX21vZGVsX3BvcHVwKCkKK3sKKyAgICByZXR1cm4gKHBfbW91c2VtWzBdID09ICdwJyk7Cit9CisjZW5kaWYKKworLyoKKyAqIEJ5IG91dHB1dHRpbmcgdGhlICdjdXJzb3IgdmVyeSB2aXNpYmxlJyB0ZXJtY2FwIGNvZGUsIGZvciBzb21lIHdpbmRvd2VkCisgKiB0ZXJtaW5hbHMgdGhpcyBtYWtlcyB0aGUgc2NyZWVuIHNjcm9sbGVkIHRvIHRoZSBjb3JyZWN0IHBvc2l0aW9uLgorICogVXNlZCB3aGVuIHN0YXJ0aW5nIFZpbSBvciByZXR1cm5pbmcgZnJvbSBhIHNoZWxsLgorICovCisgICAgdm9pZAorc2Nyb2xsX3N0YXJ0KCkKK3sKKyAgICBpZiAoKlRfVlMgIT0gTlVMKQorICAgIHsKKwlvdXRfc3RyKFRfVlMpOworCW91dF9zdHIoVF9WRSk7CisJc2NyZWVuX3N0YXJ0KCk7CQkJLyogZG9uJ3Qga25vdyB3aGVyZSBjdXJzb3IgaXMgbm93ICovCisgICAgfQorfQorCitzdGF0aWMgaW50IGN1cnNvcl9pc19vZmYgPSBGQUxTRTsKKworLyoKKyAqIEVuYWJsZSB0aGUgY3Vyc29yLgorICovCisgICAgdm9pZAorY3Vyc29yX29uKCkKK3sKKyAgICBpZiAoY3Vyc29yX2lzX29mZikKKyAgICB7CisJb3V0X3N0cihUX1ZFKTsKKwljdXJzb3JfaXNfb2ZmID0gRkFMU0U7CisgICAgfQorfQorCisvKgorICogRGlzYWJsZSB0aGUgY3Vyc29yLgorICovCisgICAgdm9pZAorY3Vyc29yX29mZigpCit7CisgICAgaWYgKGZ1bGxfc2NyZWVuKQorICAgIHsKKwlpZiAoIWN1cnNvcl9pc19vZmYpCisJICAgIG91dF9zdHIoVF9WSSk7CSAgICAvKiBkaXNhYmxlIGN1cnNvciAqLworCWN1cnNvcl9pc19vZmYgPSBUUlVFOworICAgIH0KK30KKworLyoKKyAqIFNldCBzY3JvbGxpbmcgcmVnaW9uIGZvciB3aW5kb3cgJ3dwJy4KKyAqIFRoZSByZWdpb24gc3RhcnRzICdvZmYnIGxpbmVzIGZyb20gdGhlIHN0YXJ0IG9mIHRoZSB3aW5kb3cuCisgKiBBbHNvIHNldCB0aGUgdmVydGljYWwgc2Nyb2xsIHJlZ2lvbiBmb3IgYSB2ZXJ0aWNhbGx5IHNwbGl0IHdpbmRvdy4gIEFsd2F5cworICogdGhlIGZ1bGwgd2lkdGggb2YgdGhlIHdpbmRvdywgZXhjbHVkaW5nIHRoZSB2ZXJ0aWNhbCBzZXBhcmF0b3IuCisgKi8KKyAgICB2b2lkCitzY3JvbGxfcmVnaW9uX3NldCh3cCwgb2ZmKQorICAgIHdpbl9UCSp3cDsKKyAgICBpbnQJCW9mZjsKK3sKKyAgICBPVVRfU1RSKHRnb3RvKChjaGFyICopVF9DUywgV19XSU5ST1cod3ApICsgd3AtPndfaGVpZ2h0IC0gMSwKKwkJCQkJCQkgV19XSU5ST1cod3ApICsgb2ZmKSk7CisjaWZkZWYgRkVBVF9WRVJUU1BMSVQKKyAgICBpZiAoKlRfQ1NWICE9IE5VTCAmJiB3cC0+d193aWR0aCAhPSBDb2x1bW5zKQorCU9VVF9TVFIodGdvdG8oKGNoYXIgKilUX0NTViwgV19XSU5DT0wod3ApICsgd3AtPndfd2lkdGggLSAxLAorCQkJCQkJCSAgICAgICBXX1dJTkNPTCh3cCkpKTsKKyNlbmRpZgorICAgIHNjcmVlbl9zdGFydCgpOwkJICAgIC8qIGRvbid0IGtub3cgd2hlcmUgY3Vyc29yIGlzIG5vdyAqLworfQorCisvKgorICogUmVzZXQgc2Nyb2xsaW5nIHJlZ2lvbiB0byB0aGUgd2hvbGUgc2NyZWVuLgorICovCisgICAgdm9pZAorc2Nyb2xsX3JlZ2lvbl9yZXNldCgpCit7CisgICAgT1VUX1NUUih0Z290bygoY2hhciAqKVRfQ1MsIChpbnQpUm93cyAtIDEsIDApKTsKKyNpZmRlZiBGRUFUX1ZFUlRTUExJVAorICAgIGlmICgqVF9DU1YgIT0gTlVMKQorCU9VVF9TVFIodGdvdG8oKGNoYXIgKilUX0NTViwgKGludClDb2x1bW5zIC0gMSwgMCkpOworI2VuZGlmCisgICAgc2NyZWVuX3N0YXJ0KCk7CQkgICAgLyogZG9uJ3Qga25vdyB3aGVyZSBjdXJzb3IgaXMgbm93ICovCit9CisKKworLyoKKyAqIExpc3Qgb2YgdGVybWluYWwgY29kZXMgdGhhdCBhcmUgY3VycmVudGx5IHJlY29nbml6ZWQuCisgKi8KKworc3RydWN0IHRlcm1jb2RlCit7CisgICAgY2hhcl91ICBuYW1lWzJdOwkgICAgLyogdGVybWNhcCBuYW1lIG9mIGVudHJ5ICovCisgICAgY2hhcl91ICAqY29kZTsJICAgIC8qIHRlcm1pbmFsIGNvZGUgKGluIGFsbG9jYXRlZCBtZW1vcnkpICovCisgICAgaW50CSAgICBsZW47CSAgICAvKiBTVFJMRU4oY29kZSkgKi8KK30gKnRlcm1jb2RlcyA9IE5VTEw7CisKK3N0YXRpYyBpbnQgIHRjX21heF9sZW4gPSAwOyAvKiBudW1iZXIgb2YgZW50cmllcyB0aGF0IHRlcm1jb2Rlc1tdIGNhbiBob2xkICovCitzdGF0aWMgaW50ICB0Y19sZW4gPSAwOwkgICAgLyogY3VycmVudCBudW1iZXIgb2YgZW50cmllcyBpbiB0ZXJtY29kZXNbXSAqLworCisgICAgdm9pZAorY2xlYXJfdGVybWNvZGVzKCkKK3sKKyAgICB3aGlsZSAodGNfbGVuID4gMCkKKwl2aW1fZnJlZSh0ZXJtY29kZXNbLS10Y19sZW5dLmNvZGUpOworICAgIHZpbV9mcmVlKHRlcm1jb2Rlcyk7CisgICAgdGVybWNvZGVzID0gTlVMTDsKKyAgICB0Y19tYXhfbGVuID0gMDsKKworI2lmZGVmIEhBVkVfVEdFVEVOVAorICAgIEJDID0gKGNoYXIgKillbXB0eV9vcHRpb247CisgICAgVVAgPSAoY2hhciAqKWVtcHR5X29wdGlvbjsKKyAgICBQQyA9IE5VTDsJCQkvKiBzZXQgcGFkIGNoYXJhY3RlciB0byBOVUwgKi8KKyAgICBvc3BlZWQgPSAwOworI2VuZGlmCisKKyAgICBuZWVkX2dhdGhlciA9IFRSVUU7CQkvKiBuZWVkIHRvIGZpbGwgdGVybWxlYWRlcltdICovCit9CisKKy8qCisgKiBBZGQgYSBuZXcgZW50cnkgdG8gdGhlIGxpc3Qgb2YgdGVybWluYWwgY29kZXMuCisgKiBUaGUgbGlzdCBpcyBrZXB0IGFscGhhYmV0aWNhbCBmb3IgIjpzZXQgdGVybWNhcCIKKyAqLworICAgIHZvaWQKK2FkZF90ZXJtY29kZShuYW1lLCBzdHJpbmcsIHVzZV84Yml0KQorICAgIGNoYXJfdQkqbmFtZTsKKyAgICBjaGFyX3UJKnN0cmluZzsKKyAgICBpbnQJCXVzZV84Yml0OwkvKiByZXBsYWNlIDctYml0IGNvbnRyb2wgYnkgOC1iaXQgb25lICovCit7CisgICAgc3RydWN0IHRlcm1jb2RlICpuZXdfdGM7CisgICAgaW50CQkgICAgaSwgajsKKyAgICBjaGFyX3UJICAgICpzOworCisgICAgaWYgKHN0cmluZyA9PSBOVUxMIHx8ICpzdHJpbmcgPT0gTlVMKQorICAgIHsKKwlkZWxfdGVybWNvZGUobmFtZSk7CisJcmV0dXJuOworICAgIH0KKworICAgIHMgPSB2aW1fc3Ryc2F2ZShzdHJpbmcpOworICAgIGlmIChzID09IE5VTEwpCisJcmV0dXJuOworCisgICAgLyogQ2hhbmdlIGxlYWRpbmcgPEVzYz5bIHRvIENTSSwgY2hhbmdlIDxFc2M+TyB0byA8TS1PPi4gKi8KKyAgICBpZiAodXNlXzhiaXQgJiYgdGVybV83dG84Yml0KHN0cmluZykgIT0gMCkKKyAgICB7CisJbWNoX21lbW1vdmUocywgcyArIDEsIFNUUkxFTihzKSk7CisJc1swXSA9IHRlcm1fN3RvOGJpdChzdHJpbmcpOworICAgIH0KKworICAgIG5lZWRfZ2F0aGVyID0gVFJVRTsJCS8qIG5lZWQgdG8gZmlsbCB0ZXJtbGVhZGVyW10gKi8KKworICAgIC8qCisgICAgICogbmVlZCB0byBtYWtlIHNwYWNlIGZvciBtb3JlIGVudHJpZXMKKyAgICAgKi8KKyAgICBpZiAodGNfbGVuID09IHRjX21heF9sZW4pCisgICAgeworCXRjX21heF9sZW4gKz0gMjA7CisJbmV3X3RjID0gKHN0cnVjdCB0ZXJtY29kZSAqKWFsbG9jKAorCQkJICAgICh1bnNpZ25lZCkodGNfbWF4X2xlbiAqIHNpemVvZihzdHJ1Y3QgdGVybWNvZGUpKSk7CisJaWYgKG5ld190YyA9PSBOVUxMKQorCXsKKwkgICAgdGNfbWF4X2xlbiAtPSAyMDsKKwkgICAgcmV0dXJuOworCX0KKwlmb3IgKGkgPSAwOyBpIDwgdGNfbGVuOyArK2kpCisJICAgIG5ld190Y1tpXSA9IHRlcm1jb2Rlc1tpXTsKKwl2aW1fZnJlZSh0ZXJtY29kZXMpOworCXRlcm1jb2RlcyA9IG5ld190YzsKKyAgICB9CisKKyAgICAvKgorICAgICAqIExvb2sgZm9yIGV4aXN0aW5nIGVudHJ5IHdpdGggdGhlIHNhbWUgbmFtZSwgaXQgaXMgcmVwbGFjZWQuCisgICAgICogTG9vayBmb3IgYW4gZXhpc3RpbmcgZW50cnkgdGhhdCBpcyBhbHBoYWJldGljYWwgaGlnaGVyLCB0aGUgbmV3IGVudHJ5CisgICAgICogaXMgaW5zZXJ0ZWQgaW4gZnJvbnQgb2YgaXQuCisgICAgICovCisgICAgZm9yIChpID0gMDsgaSA8IHRjX2xlbjsgKytpKQorICAgIHsKKwlpZiAodGVybWNvZGVzW2ldLm5hbWVbMF0gPCBuYW1lWzBdKQorCSAgICBjb250aW51ZTsKKwlpZiAodGVybWNvZGVzW2ldLm5hbWVbMF0gPT0gbmFtZVswXSkKKwl7CisJICAgIGlmICh0ZXJtY29kZXNbaV0ubmFtZVsxXSA8IG5hbWVbMV0pCisJCWNvbnRpbnVlOworCSAgICAvKgorCSAgICAgKiBFeGFjdCBtYXRjaDogUmVwbGFjZSBvbGQgY29kZS4KKwkgICAgICovCisJICAgIGlmICh0ZXJtY29kZXNbaV0ubmFtZVsxXSA9PSBuYW1lWzFdKQorCSAgICB7CisJCXZpbV9mcmVlKHRlcm1jb2Rlc1tpXS5jb2RlKTsKKwkJLS10Y19sZW47CisJCWJyZWFrOworCSAgICB9CisJfQorCS8qCisJICogRm91bmQgYWxwaGFiZXRpY2FsIGxhcmdlciBlbnRyeSwgbW92ZSByZXN0IHRvIGluc2VydCBuZXcgZW50cnkKKwkgKi8KKwlmb3IgKGogPSB0Y19sZW47IGogPiBpOyAtLWopCisJICAgIHRlcm1jb2Rlc1tqXSA9IHRlcm1jb2Rlc1tqIC0gMV07CisJYnJlYWs7CisgICAgfQorCisgICAgdGVybWNvZGVzW2ldLm5hbWVbMF0gPSBuYW1lWzBdOworICAgIHRlcm1jb2Rlc1tpXS5uYW1lWzFdID0gbmFtZVsxXTsKKyAgICB0ZXJtY29kZXNbaV0uY29kZSA9IHM7CisgICAgdGVybWNvZGVzW2ldLmxlbiA9IChpbnQpU1RSTEVOKHMpOworICAgICsrdGNfbGVuOworfQorCisgICAgY2hhcl91ICAqCitmaW5kX3Rlcm1jb2RlKG5hbWUpCisgICAgY2hhcl91ICAqbmFtZTsKK3sKKyAgICBpbnQJICAgIGk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgdGNfbGVuOyArK2kpCisJaWYgKHRlcm1jb2Rlc1tpXS5uYW1lWzBdID09IG5hbWVbMF0gJiYgdGVybWNvZGVzW2ldLm5hbWVbMV0gPT0gbmFtZVsxXSkKKwkgICAgcmV0dXJuIHRlcm1jb2Rlc1tpXS5jb2RlOworICAgIHJldHVybiBOVUxMOworfQorCisjaWYgZGVmaW5lZChGRUFUX0NNRExfQ09NUEwpIHx8IGRlZmluZWQoUFJPVE8pCisgICAgY2hhcl91ICoKK2dldF90ZXJtY29kZShpKQorICAgIGludAkgICAgaTsKK3sKKyAgICBpZiAoaSA+PSB0Y19sZW4pCisJcmV0dXJuIE5VTEw7CisgICAgcmV0dXJuICZ0ZXJtY29kZXNbaV0ubmFtZVswXTsKK30KKyNlbmRpZgorCisgICAgdm9pZAorZGVsX3Rlcm1jb2RlKG5hbWUpCisgICAgY2hhcl91ICAqbmFtZTsKK3sKKyAgICBpbnQJICAgIGk7CisKKyAgICBpZiAodGVybWNvZGVzID09IE5VTEwpCS8qIG5vdGhpbmcgdGhlcmUgeWV0ICovCisJcmV0dXJuOworCisgICAgbmVlZF9nYXRoZXIgPSBUUlVFOwkJLyogbmVlZCB0byBmaWxsIHRlcm1sZWFkZXJbXSAqLworCisgICAgZm9yIChpID0gMDsgaSA8IHRjX2xlbjsgKytpKQorCWlmICh0ZXJtY29kZXNbaV0ubmFtZVswXSA9PSBuYW1lWzBdICYmIHRlcm1jb2Rlc1tpXS5uYW1lWzFdID09IG5hbWVbMV0pCisJeworCSAgICBkZWxfdGVybWNvZGVfaWR4KGkpOworCSAgICByZXR1cm47CisJfQorICAgIC8qIG5vdCBmb3VuZC4gR2l2ZSBlcnJvciBtZXNzYWdlPyAqLworfQorCisgICAgc3RhdGljIHZvaWQKK2RlbF90ZXJtY29kZV9pZHgoaWR4KQorICAgIGludAkJaWR4OworeworICAgIGludAkJaTsKKworICAgIHZpbV9mcmVlKHRlcm1jb2Rlc1tpZHhdLmNvZGUpOworICAgIC0tdGNfbGVuOworICAgIGZvciAoaSA9IGlkeDsgaSA8IHRjX2xlbjsgKytpKQorCXRlcm1jb2Rlc1tpXSA9IHRlcm1jb2Rlc1tpICsgMV07Cit9CisKKyNpZmRlZiBGRUFUX1RFUk1SRVNQT05TRQorLyoKKyAqIENhbGxlZCB3aGVuIGRldGVjdGVkIHRoYXQgdGhlIHRlcm1pbmFsIHNlbmRzIDgtYml0IGNvZGVzLgorICogQ29udmVydCBhbGwgNy1iaXQgY29kZXMgdG8gdGhlaXIgOC1iaXQgZXF1aXZhbGVudC4KKyAqLworICAgIHN0YXRpYyB2b2lkCitzd2l0Y2hfdG9fOGJpdCgpCit7CisgICAgaW50CQlpOworICAgIGludAkJYzsKKworICAgIC8qIE9ubHkgbmVlZCB0byBkbyBzb21ldGhpbmcgd2hlbiBub3QgYWxyZWFkeSB1c2luZyA4LWJpdCBjb2Rlcy4gKi8KKyAgICBpZiAoIXRlcm1faXNfOGJpdChUX05BTUUpKQorICAgIHsKKwlmb3IgKGkgPSAwOyBpIDwgdGNfbGVuOyArK2kpCisJeworCSAgICBjID0gdGVybV83dG84Yml0KHRlcm1jb2Rlc1tpXS5jb2RlKTsKKwkgICAgaWYgKGMgIT0gMCkKKwkgICAgeworCQltY2hfbWVtbW92ZSh0ZXJtY29kZXNbaV0uY29kZSArIDEsIHRlcm1jb2Rlc1tpXS5jb2RlICsgMiwKKwkJCQkJICAgICAgIFNUUkxFTih0ZXJtY29kZXNbaV0uY29kZSArIDEpKTsKKwkJdGVybWNvZGVzW2ldLmNvZGVbMF0gPSBjOworCSAgICB9CisJfQorCW5lZWRfZ2F0aGVyID0gVFJVRTsJCS8qIG5lZWQgdG8gZmlsbCB0ZXJtbGVhZGVyW10gKi8KKyAgICB9CisgICAgZGV0ZWN0ZWRfOGJpdCA9IFRSVUU7Cit9CisjZW5kaWYKKworI2lmZGVmIENIRUNLX0RPVUJMRV9DTElDSworc3RhdGljIGxpbmVucl9UIG9yaWdfdG9wbGluZSA9IDA7CisjIGlmZGVmIEZFQVRfRElGRgorc3RhdGljIGludCBvcmlnX3RvcGZpbGwgPSAwOworIyBlbmRpZgorI2VuZGlmCisjaWYgKGRlZmluZWQoRkVBVF9XSU5ET1dTKSAmJiBkZWZpbmVkKENIRUNLX0RPVUJMRV9DTElDSykpIHx8IGRlZmluZWQoUFJPVE8pCisvKgorICogQ2hlY2tpbmcgZm9yIGRvdWJsZSBjbGlja3Mgb3Vyc2VsdmVzLgorICogIm9yaWdfdG9wbGluZSIgaXMgdXNlZCB0byBhdm9pZCBkZXRlY3RpbmcgYSBkb3VibGUtY2xpY2sgd2hlbiB0aGUgd2luZG93CisgKiBjb250ZW50cyBzY3JvbGxlZCAoZS5nLiwgd2hlbiAnc2Nyb2xsb2ZmJyBpcyBub24temVybykuCisgKi8KKy8qCisgKiBTZXQgb3JpZ190b3BsaW5lLiAgVXNlZCB3aGVuIGp1bXBpbmcgdG8gYW5vdGhlciB3aW5kb3csIHNvIHRoYXQgYSBkb3VibGUKKyAqIGNsaWNrIHN0aWxsIHdvcmtzLgorICovCisgICAgdm9pZAorc2V0X21vdXNlX3RvcGxpbmUod3ApCisgICAgd2luX1QJKndwOworeworICAgIG9yaWdfdG9wbGluZSA9IHdwLT53X3RvcGxpbmU7CisjIGlmZGVmIEZFQVRfRElGRgorICAgIG9yaWdfdG9wZmlsbCA9IHdwLT53X3RvcGZpbGw7CisjIGVuZGlmCit9CisjZW5kaWYKKworLyoKKyAqIENoZWNrIGlmIHR5cGVidWYudGJfYnVmW10gY29udGFpbnMgYSB0ZXJtaW5hbCBrZXkgY29kZS4KKyAqIENoZWNrIGZyb20gdHlwZWJ1Zi50Yl9idWZbdHlwZWJ1Zi50Yl9vZmZdIHRvIHR5cGVidWYudGJfYnVmW3R5cGVidWYudGJfb2ZmCisgKiArIG1heF9vZmZzZXRdLgorICogUmV0dXJuIDAgZm9yIG5vIG1hdGNoLCAtMSBmb3IgcGFydGlhbCBtYXRjaCwgPiAwIGZvciBmdWxsIG1hdGNoLgorICogV2l0aCBhIG1hdGNoLCB0aGUgbWF0Y2ggaXMgcmVtb3ZlZCwgdGhlIHJlcGxhY2VtZW50IGNvZGUgaXMgaW5zZXJ0ZWQgaW4KKyAqIHR5cGVidWYudGJfYnVmW10gYW5kIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBpbiB0eXBlYnVmLnRiX2J1ZltdIGlzCisgKiByZXR1cm5lZC4KKyAqIFdoZW4gImJ1ZiIgaXMgbm90IE5VTEwsIGl0IGlzIHVzZWQgaW5zdGVhZCBvZiB0eXBlYnVmLnRiX2J1ZltdLiAiYnVmbGVuIiBpcworICogdGhlbiB0aGUgbGVuZ3RoIG9mIHRoZSBzdHJpbmcgaW4gYnVmW10uCisgKi8KKyAgICBpbnQKK2NoZWNrX3Rlcm1jb2RlKG1heF9vZmZzZXQsIGJ1ZiwgYnVmbGVuKQorICAgIGludAkJbWF4X29mZnNldDsKKyAgICBjaGFyX3UJKmJ1ZjsKKyAgICBpbnQJCWJ1ZmxlbjsKK3sKKyAgICBjaGFyX3UJKnRwOworICAgIGNoYXJfdQkqcDsKKyAgICBpbnQJCXNsZW4gPSAwOwkvKiBpbml0IGZvciBHQ0MgKi8KKyAgICBpbnQJCWxlbjsKKyAgICBpbnQJCW9mZnNldDsKKyAgICBjaGFyX3UJa2V5X25hbWVbMl07CisgICAgaW50CQluZXdfc2xlbjsKKyAgICBpbnQJCWV4dHJhOworICAgIGNoYXJfdQlzdHJpbmdbTUFYX0tFWV9DT0RFX0xFTiArIDFdOworICAgIGludAkJaSwgajsKKyAgICBpbnQJCWlkeCA9IDA7CisjaWZkZWYgRkVBVF9NT1VTRQorIyBpZiAhZGVmaW5lZChVTklYKSB8fCBkZWZpbmVkKEZFQVRfTU9VU0VfWFRFUk0pIHx8IGRlZmluZWQoRkVBVF9HVUkpCisgICAgY2hhcl91CWJ5dGVzWzZdOworICAgIGludAkJbnVtX2J5dGVzOworIyBlbmRpZgorICAgIGludAkJbW91c2VfY29kZSA9IDA7CSAgICAvKiBpbml0IGZvciBHQ0MgKi8KKyAgICBpbnQJCW1vZGlmaWVyczsKKyAgICBpbnQJCWlzX2NsaWNrLCBpc19kcmFnOworICAgIGludAkJd2hlZWxfY29kZSA9IDA7CisgICAgaW50CQljdXJyZW50X2J1dHRvbjsKKyAgICBzdGF0aWMgaW50CWhlbGRfYnV0dG9uID0gTU9VU0VfUkVMRUFTRTsKKyAgICBzdGF0aWMgaW50CW9yaWdfbnVtX2NsaWNrcyA9IDE7CisgICAgc3RhdGljIGludAlvcmlnX21vdXNlX2NvZGUgPSAweDA7CisjIGlmZGVmIENIRUNLX0RPVUJMRV9DTElDSworICAgIHN0YXRpYyBpbnQJb3JpZ19tb3VzZV9jb2wgPSAwOworICAgIHN0YXRpYyBpbnQJb3JpZ19tb3VzZV9yb3cgPSAwOworICAgIHN0YXRpYyBzdHJ1Y3QgdGltZXZhbCAgb3JpZ19tb3VzZV90aW1lID0gezAsIDB9OworCQkJCQkvKiB0aW1lIG9mIHByZXZpb3VzIG1vdXNlIGNsaWNrICovCisgICAgc3RydWN0IHRpbWV2YWwgIG1vdXNlX3RpbWU7CQkvKiB0aW1lIG9mIGN1cnJlbnQgbW91c2UgY2xpY2sgKi8KKyAgICBsb25nCXRpbWVkaWZmOwkJLyogZWxhcHNlZCB0aW1lIGluIG1zZWMgKi8KKyMgZW5kaWYKKyNlbmRpZgorICAgIGludAkJY3BvX2tvZmZzZXQ7CisjaWZkZWYgRkVBVF9NT1VTRV9HUE0KKyAgICBleHRlcm4gaW50CWdwbV9mbGFnOyAvKiBncG0gbGlicmFyeSB2YXJpYWJsZSAqLworI2VuZGlmCisKKyAgICBjcG9fa29mZnNldCA9ICh2aW1fc3RyY2hyKHBfY3BvLCBDUE9fS09GRlNFVCkgIT0gTlVMTCk7CisKKyAgICAvKgorICAgICAqIFNwZWVkIHVwIHRoZSBjaGVja3MgZm9yIHRlcm1pbmFsIGNvZGVzIGJ5IGdhdGhlcmluZyBhbGwgZmlyc3QgYnl0ZXMKKyAgICAgKiB1c2VkIGluIHRlcm1sZWFkZXJbXS4gIE9mdGVuIHRoaXMgaXMganVzdCBhIHNpbmdsZSA8RXNjPi4KKyAgICAgKi8KKyAgICBpZiAobmVlZF9nYXRoZXIpCisJZ2F0aGVyX3Rlcm1sZWFkZXIoKTsKKworICAgIC8qCisgICAgICogQ2hlY2sgYXQgc2V2ZXJhbCBwb3NpdGlvbnMgaW4gdHlwZWJ1Zi50Yl9idWZbXSwgdG8gY2F0Y2ggc29tZXRoaW5nIGxpa2UKKyAgICAgKiAieDxVcD4iIHRoYXQgY2FuIGJlIG1hcHBlZC4gU3RvcCBhdCBtYXhfb2Zmc2V0LCBiZWNhdXNlIGNoYXJhY3RlcnMKKyAgICAgKiBhZnRlciB0aGF0IGNhbm5vdCBiZSB1c2VkIGZvciBtYXBwaW5nLCBhbmQgd2l0aCBAciBjb21tYW5kcworICAgICAqIHR5cGVidWYudGJfYnVmW10KKyAgICAgKiBjYW4gYmVjb21lIHZlcnkgbG9uZy4KKyAgICAgKiBUaGlzIGlzIHVzZWQgb2Z0ZW4sIEtFRVAgSVQgRkFTVCEKKyAgICAgKi8KKyAgICBmb3IgKG9mZnNldCA9IDA7IG9mZnNldCA8IG1heF9vZmZzZXQ7ICsrb2Zmc2V0KQorICAgIHsKKwlpZiAoYnVmID09IE5VTEwpCisJeworCSAgICBpZiAob2Zmc2V0ID49IHR5cGVidWYudGJfbGVuKQorCQlicmVhazsKKwkgICAgdHAgPSB0eXBlYnVmLnRiX2J1ZiArIHR5cGVidWYudGJfb2ZmICsgb2Zmc2V0OworCSAgICBsZW4gPSB0eXBlYnVmLnRiX2xlbiAtIG9mZnNldDsJLyogbGVuZ3RoIG9mIHRoZSBpbnB1dCAqLworCX0KKwllbHNlCisJeworCSAgICBpZiAob2Zmc2V0ID49IGJ1ZmxlbikKKwkJYnJlYWs7CisJICAgIHRwID0gYnVmICsgb2Zmc2V0OworCSAgICBsZW4gPSBidWZsZW4gLSBvZmZzZXQ7CisJfQorCisJLyoKKwkgKiBEb24ndCBjaGVjayBjaGFyYWN0ZXJzIGFmdGVyIEtfU1BFQ0lBTCwgdGhvc2UgYXJlIGFscmVhZHkKKwkgKiB0cmFuc2xhdGVkIHRlcm1pbmFsIGNoYXJzIChhdm9pZCB0cmFuc2xhdGluZyB+QF5IeCkuCisJICovCisJaWYgKCp0cCA9PSBLX1NQRUNJQUwpCisJeworCSAgICBvZmZzZXQgKz0gMjsJLyogdGhlcmUgYXJlIGFsd2F5cyAyIGV4dHJhIGNoYXJhY3RlcnMgKi8KKwkgICAgY29udGludWU7CisJfQorCisJLyoKKwkgKiBTa2lwIHRoaXMgcG9zaXRpb24gaWYgdGhlIGNoYXJhY3RlciBkb2VzIG5vdCBhcHBlYXIgYXMgdGhlIGZpcnN0CisJICogY2hhcmFjdGVyIGluIHRlcm1fc3RyaW5ncy4gVGhpcyBzcGVlZHMgdXAgYSBsb3QsIHNpbmNlIG1vc3QKKwkgKiB0ZXJtY29kZXMgc3RhcnQgd2l0aCB0aGUgc2FtZSBjaGFyYWN0ZXIgKEVTQyBvciBDU0kpLgorCSAqLworCWkgPSAqdHA7CisJZm9yIChwID0gdGVybWxlYWRlcjsgKnAgJiYgKnAgIT0gaTsgKytwKQorCSAgICA7CisJaWYgKCpwID09IE5VTCkKKwkgICAgY29udGludWU7CisKKwkvKgorCSAqIFNraXAgdGhpcyBwb3NpdGlvbiBpZiBwX2VrIGlzIG5vdCBzZXQgYW5kIHRwWzBdIGlzIGFuIEVTQyBhbmQgd2UKKwkgKiBhcmUgaW4gSW5zZXJ0IG1vZGUuCisJICovCisJaWYgKCp0cCA9PSBFU0MgJiYgIXBfZWsgJiYgKFN0YXRlICYgSU5TRVJUKSkKKwkgICAgY29udGludWU7CisKKwluZXdfc2xlbiA9IDA7CQkvKiBMZW5ndGggb2Ygd2hhdCB3aWxsIHJlcGxhY2UgdGhlIHRlcm1jb2RlICovCisJa2V5X25hbWVbMF0gPSBOVUw7CS8qIG5vIGtleSBuYW1lIGZvdW5kIHlldCAqLworCisjaWZkZWYgRkVBVF9HVUkKKwlpZiAoZ3VpLmluX3VzZSkKKwl7CisJICAgIC8qCisJICAgICAqIEdVSSBzcGVjaWFsIGtleSBjb2RlcyBhcmUgYWxsIG9mIHRoZSBmb3JtIFtDU0kgeHhdLgorCSAgICAgKi8KKwkgICAgaWYgKCp0cCA9PSBDU0kpCSAgICAvKiBTcGVjaWFsIGtleSBmcm9tIEdVSSAqLworCSAgICB7CisJCWlmIChsZW4gPCAzKQorCQkgICAgcmV0dXJuIC0xOwkgICAgLyogU2hvdWxkbid0IGhhcHBlbiAqLworCQlzbGVuID0gMzsKKwkJa2V5X25hbWVbMF0gPSB0cFsxXTsKKwkJa2V5X25hbWVbMV0gPSB0cFsyXTsKKwkgICAgfQorCX0KKwllbHNlCisjZW5kaWYgLyogRkVBVF9HVUkgKi8KKwl7CisJICAgIGZvciAoaWR4ID0gMDsgaWR4IDwgdGNfbGVuOyArK2lkeCkKKwkgICAgeworCQkvKgorCQkgKiBJZ25vcmUgdGhlIGVudHJ5IGlmIHdlIGFyZSBub3QgYXQgdGhlIHN0YXJ0IG9mCisJCSAqIHR5cGVidWYudGJfYnVmW10KKwkJICogYW5kIHRoZXJlIGFyZSBub3QgZW5vdWdoIGNoYXJhY3RlcnMgdG8gbWFrZSBhIG1hdGNoLgorCQkgKiBCdXQgb25seSB3aGVuIHRoZSAnSycgZmxhZyBpcyBpbiAnY3BvcHRpb25zJy4KKwkJICovCisJCXNsZW4gPSB0ZXJtY29kZXNbaWR4XS5sZW47CisJCWlmIChjcG9fa29mZnNldCAmJiBvZmZzZXQgJiYgbGVuIDwgc2xlbikKKwkJICAgIGNvbnRpbnVlOworCQlpZiAoU1RSTkNNUCh0ZXJtY29kZXNbaWR4XS5jb2RlLCB0cCwKKwkJCQkgICAgIChzaXplX3QpKHNsZW4gPiBsZW4gPyBsZW4gOiBzbGVuKSkgPT0gMCkKKwkJeworCQkgICAgaWYgKGxlbiA8IHNsZW4pCQkvKiBnb3QgYSBwYXJ0aWFsIHNlcXVlbmNlICovCisJCQlyZXR1cm4gLTE7CQkvKiBuZWVkIHRvIGdldCBtb3JlIGNoYXJzICovCisKKwkJICAgIC8qCisJCSAgICAgKiBXaGVuIGZvdW5kIGEga2V5cGFkIGtleSwgY2hlY2sgaWYgdGhlcmUgaXMgYW5vdGhlciBrZXkKKwkJICAgICAqIHRoYXQgbWF0Y2hlcyBhbmQgdXNlIHRoYXQgb25lLiAgVGhpcyBtYWtlcyA8SG9tZT4gdG8gYmUKKwkJICAgICAqIGZvdW5kIGluc3RlYWQgb2YgPGtIb21lPiB3aGVuIHRoZXkgcHJvZHVjZSB0aGUgc2FtZQorCQkgICAgICoga2V5IGNvZGUuCisJCSAgICAgKi8KKwkJICAgIGlmICh0ZXJtY29kZXNbaWR4XS5uYW1lWzBdID09ICdLJworCQkJCSAgICAgICAmJiBWSU1fSVNESUdJVCh0ZXJtY29kZXNbaWR4XS5uYW1lWzFdKSkKKwkJICAgIHsKKwkJCWZvciAoaiA9IGlkeCArIDE7IGogPCB0Y19sZW47ICsraikKKwkJCSAgICBpZiAodGVybWNvZGVzW2pdLmxlbiA9PSBzbGVuICYmCisJCQkJICAgIFNUUk5DTVAodGVybWNvZGVzW2lkeF0uY29kZSwKKwkJCQkJICAgIHRlcm1jb2Rlc1tqXS5jb2RlLCBzbGVuKSA9PSAwKQorCQkJICAgIHsKKwkJCQlpZHggPSBqOworCQkJCWJyZWFrOworCQkJICAgIH0KKwkJICAgIH0KKworCQkgICAga2V5X25hbWVbMF0gPSB0ZXJtY29kZXNbaWR4XS5uYW1lWzBdOworCQkgICAga2V5X25hbWVbMV0gPSB0ZXJtY29kZXNbaWR4XS5uYW1lWzFdOworCisJCSAgICBicmVhazsKKwkJfQorCSAgICB9CisJfQorCisjaWZkZWYgRkVBVF9URVJNUkVTUE9OU0UKKwlpZiAoa2V5X25hbWVbMF0gPT0gTlVMKQorCXsKKwkgICAgLyogQ2hlY2sgZm9yIHh0ZXJtIHZlcnNpb24gc3RyaW5nOiAiPEVzYz5bPnt4fTt7dmVyc307e3l9YyIuICBBbHNvCisJICAgICAqIGVhdCBvdGhlciBwb3NzaWJsZSByZXNwb25zZXMgdG8gdF9SViwgcnh2dCByZXR1cm5zCisJICAgICAqICI8RXNjPls/MTsyYyIuICBBbHNvIGFjY2VwdCBDU0kgaW5zdGVhZCBvZiA8RXNjPlsuICovCisJICAgIGlmICgqVF9DUlYgIT0gTlVMICYmICgodHBbMF0gPT0gRVNDICYmIHRwWzFdID09ICdbJyAmJiBsZW4gPj0gMykKKwkJCQkJICAgICAgIHx8ICh0cFswXSA9PSBDU0kgJiYgbGVuID49IDIpKSkKKwkgICAgeworCQlqID0gMDsKKwkJZXh0cmEgPSAwOworCQlmb3IgKGkgPSAyICsgKHRwWzBdICE9IENTSSk7CisJCQlpIDwgbGVuICYmIChWSU1fSVNESUdJVCh0cFtpXSkKKwkJCSAgICB8fCB0cFtpXSA9PSAnOycgfHwgdHBbaV0gPT0gJy4nKTsgKytpKQorCQkgICAgaWYgKHRwW2ldID09ICc7JyAmJiArK2ogPT0gMSkKKwkJCWV4dHJhID0gYXRvaSgoY2hhciAqKXRwICsgaSArIDEpOworCQlpZiAoaSA9PSBsZW4pCisJCSAgICByZXR1cm4gLTE7CQkvKiBub3QgZW5vdWdoIGNoYXJhY3RlcnMgKi8KKworCQkvKiBlYXQgaXQgd2hlbiBhdCBsZWFzdCBvbmUgZGlnaXQgYW5kIGVuZGluZyBpbiAnYycgKi8KKwkJaWYgKGkgPiAyICsgKHRwWzBdICE9IENTSSkgJiYgdHBbaV0gPT0gJ2MnKQorCQl7CisJCSAgICBjcnZfc3RhdHVzID0gQ1JWX0dPVDsKKworCQkgICAgLyogSWYgdGhpcyBjb2RlIHN0YXJ0cyB3aXRoIENTSSwgeW91IGNhbiBiZXQgdGhhdCB0aGUKKwkJICAgICAqIHRlcm1pbmFsIHVzZXMgOC1iaXQgY29kZXMuICovCisJCSAgICBpZiAodHBbMF0gPT0gQ1NJKQorCQkJc3dpdGNoX3RvXzhiaXQoKTsKKworCQkgICAgLyogcnh2dCBzZW5kcyBpdHMgdmVyc2lvbiBudW1iZXI6ICIyMDcwMyIgaXMgMi43LjMuCisJCSAgICAgKiBJZ25vcmUgaXQgZm9yIHdoZW4gdGhlIHVzZXIgaGFzIHNldCAndGVybScgdG8geHRlcm0sCisJCSAgICAgKiBldmVuIHRob3VnaCBpdCdzIGFuIHJ4dnQuICovCisJCSAgICBpZiAoZXh0cmEgPiAyMDAwMCkKKwkJCWV4dHJhID0gMDsKKworCQkgICAgaWYgKHRwWzEgKyAodHBbMF0gIT0gQ1NJKV0gPT0gJz4nICYmIGogPT0gMikKKwkJICAgIHsKKwkJCS8qIGlmIHh0ZXJtIHZlcnNpb24gPj0gOTUgdXNlIG1vdXNlIGRyYWdnaW5nICovCisJCQlpZiAoZXh0cmEgPj0gOTUpCisJCQkgICAgc2V0X29wdGlvbl92YWx1ZSgoY2hhcl91ICopInR0eW0iLCAwTCwKKwkJCQkJCSAgICAgICAoY2hhcl91ICopInh0ZXJtMiIsIDApOworCQkJLyogaWYgeHRlcm0gdmVyc2lvbiA+PSAxNDEgdHJ5IHRvIGdldCB0ZXJtY2FwIGNvZGVzICovCisJCQlpZiAoZXh0cmEgPj0gMTQxKQorCQkJeworCQkJICAgIGNoZWNrX2Zvcl9jb2RlcyA9IFRSVUU7CisJCQkgICAgbmVlZF9nYXRoZXIgPSBUUlVFOworCQkJICAgIHJlcV9jb2Rlc19mcm9tX3Rlcm0oKTsKKwkJCX0KKwkJICAgIH0KKyMgaWZkZWYgRkVBVF9FVkFMCisJCSAgICBzZXRfdmltX3Zhcl9zdHJpbmcoVlZfVEVSTVJFU1BPTlNFLCB0cCwgaSArIDEpOworIyBlbmRpZgorIyBpZmRlZiBGRUFUX0FVVE9DTUQKKwkJICAgIGFwcGx5X2F1dG9jbWRzKEVWRU5UX1RFUk1SRVNQT05TRSwKKwkJCQkJCSAgIE5VTEwsIE5VTEwsIEZBTFNFLCBjdXJidWYpOworIyBlbmRpZgorCQkgICAga2V5X25hbWVbMF0gPSAoaW50KUtTX0VYVFJBOworCQkgICAga2V5X25hbWVbMV0gPSAoaW50KUtFX0lHTk9SRTsKKwkJICAgIHNsZW4gPSBpICsgMTsKKwkJfQorCSAgICB9CisKKwkgICAgLyogQ2hlY2sgZm9yICc8RXNjPlAxK3I8aGV4IGJ5dGVzPjxFc2M+XCcuICBBICIwIiBpbnN0ZWFkIG9mIHRoZQorCSAgICAgKiAiMSIgbWVhbnMgYW4gaW52YWxpZCByZXF1ZXN0LiAqLworCSAgICBlbHNlIGlmIChjaGVja19mb3JfY29kZXMKKwkJICAgICYmICgodHBbMF0gPT0gRVNDICYmIHRwWzFdID09ICdQJyAmJiBsZW4gPj0gMikKKwkJCXx8IHRwWzBdID09IERDUykpCisJICAgIHsKKwkJaiA9IDEgKyAodHBbMF0gIT0gRENTKTsKKwkJZm9yIChpID0gajsgaSA8IGxlbjsgKytpKQorCQkgICAgaWYgKCh0cFtpXSA9PSBFU0MgJiYgdHBbaSArIDFdID09ICdcXCcgJiYgaSArIDEgPCBsZW4pCisJCQkgICAgfHwgdHBbaV0gPT0gU1RFUk0pCisJCSAgICB7CisJCQlpZiAoaSAtIGogPj0gMyAmJiB0cFtqICsgMV0gPT0gJysnICYmIHRwW2ogKyAyXSA9PSAncicpCisJCQkgICAgZ290X2NvZGVfZnJvbV90ZXJtKHRwICsgaiwgaSk7CisJCQlrZXlfbmFtZVswXSA9IChpbnQpS1NfRVhUUkE7CisJCQlrZXlfbmFtZVsxXSA9IChpbnQpS0VfSUdOT1JFOworCQkJc2xlbiA9IGkgKyAxICsgKHRwW2ldID09IEVTQyk7CisJCQlicmVhazsKKwkJICAgIH0KKworCQlpZiAoaSA9PSBsZW4pCisJCSAgICByZXR1cm4gLTE7CQkvKiBub3QgZW5vdWdoIGNoYXJhY3RlcnMgKi8KKwkgICAgfQorCX0KKyNlbmRpZgorCisJaWYgKGtleV9uYW1lWzBdID09IE5VTCkKKwkgICAgY29udGludWU7CSAgICAvKiBObyBtYXRjaCBhdCB0aGlzIHBvc2l0aW9uLCB0cnkgbmV4dCBvbmUgKi8KKworCS8qIFdlIG9ubHkgZ2V0IGhlcmUgd2hlbiB3ZSBoYXZlIGEgY29tcGxldGUgdGVybWNvZGUgbWF0Y2ggKi8KKworI2lmZGVmIEZFQVRfTU9VU0UKKyMgaWZkZWYgRkVBVF9HVUkKKwkvKgorCSAqIE9ubHkgaW4gdGhlIEdVSTogRmV0Y2ggdGhlIHBvaW50ZXIgY29vcmRpbmF0ZXMgb2YgdGhlIHNjcm9sbCBldmVudAorCSAqIHNvIHRoYXQgd2Uga25vdyB3aGljaCB3aW5kb3cgdG8gc2Nyb2xsIGxhdGVyLgorCSAqLworCWlmIChndWkuaW5fdXNlCisJCSYmIGtleV9uYW1lWzBdID09IChpbnQpS1NfRVhUUkEKKwkJJiYgKGtleV9uYW1lWzFdID09IChpbnQpS0VfWDFNT1VTRQorCQkgICAgfHwga2V5X25hbWVbMV0gPT0gKGludClLRV9YMk1PVVNFCisJCSAgICB8fCBrZXlfbmFtZVsxXSA9PSAoaW50KUtFX01PVVNFRE9XTgorCQkgICAgfHwga2V5X25hbWVbMV0gPT0gKGludClLRV9NT1VTRVVQKSkKKwl7CisJICAgIG51bV9ieXRlcyA9IGdldF9ieXRlc19mcm9tX2J1Zih0cCArIHNsZW4sIGJ5dGVzLCA0KTsKKwkgICAgaWYgKG51bV9ieXRlcyA9PSAtMSkJLyogbm90IGVub3VnaCBjb29yZGluYXRlcyAqLworCQlyZXR1cm4gLTE7CisJICAgIG1vdXNlX2NvbCA9IDEyOCAqIChieXRlc1swXSAtICcgJyAtIDEpICsgYnl0ZXNbMV0gLSAnICcgLSAxOworCSAgICBtb3VzZV9yb3cgPSAxMjggKiAoYnl0ZXNbMl0gLSAnICcgLSAxKSArIGJ5dGVzWzNdIC0gJyAnIC0gMTsKKwkgICAgc2xlbiArPSBudW1fYnl0ZXM7CisJfQorCWVsc2UKKyMgZW5kaWYKKwkvKgorCSAqIElmIGl0IGlzIGEgbW91c2UgY2xpY2ssIGdldCB0aGUgY29vcmRpbmF0ZXMuCisJICovCisJaWYgKGtleV9uYW1lWzBdID09IChpbnQpS1NfTU9VU0UKKyMgaWZkZWYgRkVBVF9NT1VTRV9KU0IKKwkJfHwga2V5X25hbWVbMF0gPT0gKGludClLU19KU0JURVJNX01PVVNFCisjIGVuZGlmCisjIGlmZGVmIEZFQVRfTU9VU0VfTkVUCisJCXx8IGtleV9uYW1lWzBdID09IChpbnQpS1NfTkVUVEVSTV9NT1VTRQorIyBlbmRpZgorIyBpZmRlZiBGRUFUX01PVVNFX0RFQworCQl8fCBrZXlfbmFtZVswXSA9PSAoaW50KUtTX0RFQ19NT1VTRQorIyBlbmRpZgorIyBpZmRlZiBGRUFUX01PVVNFX1BURVJNCisJCXx8IGtleV9uYW1lWzBdID09IChpbnQpS1NfUFRFUk1fTU9VU0UKKyMgZW5kaWYKKwkJKQorCXsKKwkgICAgaXNfY2xpY2sgPSBpc19kcmFnID0gRkFMU0U7CisKKyMgaWYgIWRlZmluZWQoVU5JWCkgfHwgZGVmaW5lZChGRUFUX01PVVNFX1hURVJNKSB8fCBkZWZpbmVkKEZFQVRfR1VJKQorCSAgICBpZiAoa2V5X25hbWVbMF0gPT0gKGludClLU19NT1VTRSkKKwkgICAgeworCQkvKgorCQkgKiBGb3IgeHRlcm0gYW5kIE1TRE9TIHdlIGdldCAiPHRfbW91c2U+c2NyIiwgd2hlcmUKKwkJICogIHMgPT0gZW5jb2RlZCBidXR0b24gc3RhdGU6CisJCSAqCSAgIDB4MjAgPSBsZWZ0IGJ1dHRvbiBkb3duCisJCSAqCSAgIDB4MjEgPSBtaWRkbGUgYnV0dG9uIGRvd24KKwkJICoJICAgMHgyMiA9IHJpZ2h0IGJ1dHRvbiBkb3duCisJCSAqCSAgIDB4MjMgPSBhbnkgYnV0dG9uIHJlbGVhc2UKKwkJICoJICAgMHg2MCA9IGJ1dHRvbiA0IGRvd24gKHNjcm9sbCB3aGVlbCBkb3duKQorCQkgKgkgICAweDYxID0gYnV0dG9uIDUgZG93biAoc2Nyb2xsIHdoZWVsIHVwKQorCQkgKglhZGQgMHgwNCBmb3IgU0hJRlQKKwkJICoJYWRkIDB4MDggZm9yIEFMVAorCQkgKglhZGQgMHgxMCBmb3IgQ1RSTAorCQkgKglhZGQgMHgyMCBmb3IgbW91c2UgZHJhZyAoMHg0MCBpcyBkcmFnIHdpdGggbGVmdCBidXR0b24pCisJCSAqICBjID09IGNvbHVtbiArICcgJyArIDEgPT0gY29sdW1uICsgMzMKKwkJICogIHIgPT0gcm93ICsgJyAnICsgMSA9PSByb3cgKyAzMworCQkgKgorCQkgKiBUaGUgY29vcmRpbmF0ZXMgYXJlIHBhc3NlZCBvbiB0aHJvdWdoIGdsb2JhbCB2YXJpYWJsZXMuCisJCSAqIFVnbHksIGJ1dCB0aGlzIGF2b2lkcyB0cm91YmxlIHdpdGggbW91c2UgY2xpY2tzIGF0IGFuCisJCSAqIHVuZXhwZWN0ZWQgbW9tZW50IGFuZCBhbGxvd3MgZm9yIG1hcHBpbmcgdGhlbS4KKwkJICovCisJCWZvciAoOzspCisJCXsKKyNpZmRlZiBGRUFUX0dVSQorCQkgICAgaWYgKGd1aS5pbl91c2UpCisJCSAgICB7CisJCQkvKiBHVUkgdXNlcyBtb3JlIGJpdHMgZm9yIGNvbHVtbnMgPiAyMjMgKi8KKwkJCW51bV9ieXRlcyA9IGdldF9ieXRlc19mcm9tX2J1Zih0cCArIHNsZW4sIGJ5dGVzLCA1KTsKKwkJCWlmIChudW1fYnl0ZXMgPT0gLTEpCS8qIG5vdCBlbm91Z2ggY29vcmRpbmF0ZXMgKi8KKwkJCSAgICByZXR1cm4gLTE7CisJCQltb3VzZV9jb2RlID0gYnl0ZXNbMF07CisJCQltb3VzZV9jb2wgPSAxMjggKiAoYnl0ZXNbMV0gLSAnICcgLSAxKQorCQkJCQkJCSArIGJ5dGVzWzJdIC0gJyAnIC0gMTsKKwkJCW1vdXNlX3JvdyA9IDEyOCAqIChieXRlc1szXSAtICcgJyAtIDEpCisJCQkJCQkJICsgYnl0ZXNbNF0gLSAnICcgLSAxOworCQkgICAgfQorCQkgICAgZWxzZQorI2VuZGlmCisJCSAgICB7CisJCQludW1fYnl0ZXMgPSBnZXRfYnl0ZXNfZnJvbV9idWYodHAgKyBzbGVuLCBieXRlcywgMyk7CisJCQlpZiAobnVtX2J5dGVzID09IC0xKQkvKiBub3QgZW5vdWdoIGNvb3JkaW5hdGVzICovCisJCQkgICAgcmV0dXJuIC0xOworCQkJbW91c2VfY29kZSA9IGJ5dGVzWzBdOworCQkJbW91c2VfY29sID0gYnl0ZXNbMV0gLSAnICcgLSAxOworCQkJbW91c2Vfcm93ID0gYnl0ZXNbMl0gLSAnICcgLSAxOworCQkgICAgfQorCQkgICAgc2xlbiArPSBudW1fYnl0ZXM7CisKKwkJICAgIC8qIElmIHRoZSBmb2xsb3dpbmcgYnl0ZXMgaXMgYWxzbyBhIG1vdXNlIGNvZGUgYW5kIGl0IGhhcworCQkgICAgICogdGhlIHNhbWUgY29kZSwgZHVtcCB0aGlzIG9uZSBhbmQgZ2V0IHRoZSBuZXh0LiAgVGhpcworCQkgICAgICogbWFrZXMgZHJhZ2dpbmcgYSB3aG9sZSBsb3QgZmFzdGVyLiAqLworI2lmZGVmIEZFQVRfR1VJCisJCSAgICBpZiAoZ3VpLmluX3VzZSkKKwkJCWogPSAzOworCQkgICAgZWxzZQorI2VuZGlmCisJCQlqID0gdGVybWNvZGVzW2lkeF0ubGVuOworCQkgICAgaWYgKFNUUk5DTVAodHAsIHRwICsgc2xlbiwgKHNpemVfdClqKSA9PSAwCisJCQkgICAgJiYgdHBbc2xlbiArIGpdID09IG1vdXNlX2NvZGUKKwkJCSAgICAmJiB0cFtzbGVuICsgaiArIDFdICE9IE5VTAorCQkJICAgICYmIHRwW3NsZW4gKyBqICsgMl0gIT0gTlVMCisjaWZkZWYgRkVBVF9HVUkKKwkJCSAgICAmJiAoIWd1aS5pbl91c2UKKwkJCQl8fCAodHBbc2xlbiArIGogKyAzXSAhPSBOVUwKKwkJCQkJJiYgdHBbc2xlbiArIGogKyA0XSAhPSBOVUwpKQorI2VuZGlmCisJCQkgICAgKQorCQkJc2xlbiArPSBqOworCQkgICAgZWxzZQorCQkJYnJlYWs7CisJCX0KKworIyAgaWYgIWRlZmluZWQoTVNXSU4pICYmICFkZWZpbmVkKE1TRE9TKQorCQkvKgorCQkgKiBIYW5kbGUgbW91c2UgZXZlbnRzLgorCQkgKiBSZWNvZ25pemUgdGhlIHh0ZXJtIG1vdXNlIHdoZWVsLCBidXQgbm90IGluIHRoZSBHVUksIHRoZQorCQkgKiBMaW51eCBjb25zb2xlIHdpdGggR1BNIGFuZCB0aGUgTVMtRE9TIG9yIFdpbjMyIGNvbnNvbGUKKwkJICogKG11bHRpLWNsaWNrcyB1c2UgPj0gMHg2MCkuCisJCSAqLworCQlpZiAobW91c2VfY29kZSA+PSBNT1VTRVdIRUVMX0xPVworIyAgIGlmZGVmIEZFQVRfR1VJCisJCQkmJiAhZ3VpLmluX3VzZQorIyAgIGVuZGlmCisjICAgaWZkZWYgRkVBVF9NT1VTRV9HUE0KKwkJCSYmIGdwbV9mbGFnID09IDAKKyMgICBlbmRpZgorCQkJKQorCQl7CisJCSAgICAvKiBLZWVwIHRoZSBtb3VzZV9jb2RlIGJlZm9yZSBpdCdzIGNoYW5nZWQsIHNvIHRoYXQgd2UKKwkJICAgICAqIHJlbWVtYmVyIHRoYXQgaXQgd2FzIGEgbW91c2Ugd2hlZWwgY2xpY2suICovCisJCSAgICB3aGVlbF9jb2RlID0gbW91c2VfY29kZTsKKwkJfQorIyAgIGlmZGVmIEZFQVRfTU9VU0VfWFRFUk0KKwkJZWxzZSBpZiAoaGVsZF9idXR0b24gPT0gTU9VU0VfUkVMRUFTRQorIyAgICBpZmRlZiBGRUFUX0dVSQorCQkJJiYgIWd1aS5pbl91c2UKKyMgICAgZW5kaWYKKwkJCSYmIChtb3VzZV9jb2RlID09IDB4MjMgfHwgbW91c2VfY29kZSA9PSAweDI0KSkKKwkJeworCQkgICAgLyogQXBwYXJlbnRseSB1c2VkIGJ5IHJ4dnQgc2Nyb2xsIHdoZWVsLiAqLworCQkgICAgd2hlZWxfY29kZSA9IG1vdXNlX2NvZGUgLSAweDIzICsgTU9VU0VXSEVFTF9MT1c7CisJCX0KKyMgICBlbmRpZgorCisjICAgaWYgZGVmaW5lZChVTklYKSAmJiBkZWZpbmVkKEZFQVRfTU9VU0VfVFRZKQorCQllbHNlIGlmICh1c2VfeHRlcm1fbW91c2UoKSA+IDEpCisJCXsKKwkJICAgIGlmIChtb3VzZV9jb2RlICYgTU9VU0VfRFJBR19YVEVSTSkKKwkJCW1vdXNlX2NvZGUgfD0gTU9VU0VfRFJBRzsKKwkJfQorIyAgIGVuZGlmCisjICAgaWZkZWYgRkVBVF9YQ0xJUEJPQVJECisJCWVsc2UgaWYgKCEobW91c2VfY29kZSAmIE1PVVNFX0RSQUcgJiB+TU9VU0VfQ0xJQ0tfTUFTSykpCisJCXsKKwkJICAgIGlmICgobW91c2VfY29kZSAmIE1PVVNFX1JFTEVBU0UpID09IE1PVVNFX1JFTEVBU0UpCisJCQlzdG9wX3h0ZXJtX3RyYWNlKCk7CisJCSAgICBlbHNlCisJCQlzdGFydF94dGVybV90cmFjZShtb3VzZV9jb2RlKTsKKwkJfQorIyAgIGVuZGlmCisjICBlbmRpZgorCSAgICB9CisjIGVuZGlmIC8qICFVTklYIHx8IEZFQVRfTU9VU0VfWFRFUk0gKi8KKyMgaWZkZWYgRkVBVF9NT1VTRV9ORVQKKwkgICAgaWYgKGtleV9uYW1lWzBdID09IChpbnQpS1NfTkVUVEVSTV9NT1VTRSkKKwkgICAgeworCQlpbnQgbWMsIG1yOworCisJCS8qIGV4cGVjdCBhIHJhdGhlciBsaW1pdGVkIHNlcXVlbmNlIGxpa2U6IGJhbGFuY2luZyB7CisJCSAqIFwwMzN9Niw0NVxyCisJCSAqICc2JyBpcyB0aGUgcm93LCA0NSBpcyB0aGUgY29sdW1uCisJCSAqLworCQlwID0gdHAgKyBzbGVuOworCQltciA9IGdldGRpZ2l0cygmcCk7CisJCWlmICgqcCsrICE9ICcsJykKKwkJICAgIHJldHVybiAtMTsKKwkJbWMgPSBnZXRkaWdpdHMoJnApOworCQlpZiAoKnArKyAhPSAnXHInKQorCQkgICAgcmV0dXJuIC0xOworCisJCW1vdXNlX2NvbCA9IG1jIC0gMTsKKwkJbW91c2Vfcm93ID0gbXIgLSAxOworCQltb3VzZV9jb2RlID0gTU9VU0VfTEVGVDsKKwkJc2xlbiArPSAoaW50KShwIC0gKHRwICsgc2xlbikpOworCSAgICB9CisjIGVuZGlmCS8qIEZFQVRfTU9VU0VfTkVUICovCisjIGlmZGVmIEZFQVRfTU9VU0VfSlNCCisJICAgIGlmIChrZXlfbmFtZVswXSA9PSAoaW50KUtTX0pTQlRFUk1fTU9VU0UpCisJICAgIHsKKwkJaW50IG11bHQsIHZhbCwgaXRlciwgYnV0dG9uLCBzdGF0dXM7CisKKwkJLyogSlNCVEVSTSBJbnB1dCBNb2RlbAorCQkgKiBcMDMzWzB+encgdW5pcSBlc2NhcGUgc2VxdWVuY2UKKwkJICogKEwteCkgIExlZnQgYnV0dG9uIHByZXNzZWQgLSBub3QgcHJlc3NlZCB4IG5vdCByZXBvcnRpbmcKKwkJICogKE0teCkgIE1pZGRsZSBidXR0b24gcHJlc3NlZCAtIG5vdCBwcmVzc2VkIHggbm90IHJlcG9ydGluZworCQkgKiAoUi14KSAgUmlnaHQgYnV0dG9uIHByZXNzZWQgLSBub3QgcHJlc3NlZCB4IG5vdCByZXBvcnRpbmcKKwkJICogKFNEbWR1KSAgU2luZ2xlICwgRG91YmxlIGNsaWNrLCBtIG1vdXNlIG1vdmUgZCBidXR0b24gZG93bgorCQkgKgkJCQkJCSAgIHUgYnV0dG9uIHVwCisJCSAqICAjIyMgICBYIGN1cnNvciBwb3NpdGlvbiBwYWRkZWQgdG8gMyBkaWdpdHMKKwkJICogICMjIyAgIFkgY3Vyc29yIHBvc2l0aW9uIHBhZGRlZCB0byAzIGRpZ2l0cworCQkgKiAocy14KSAgU0hJRlQga2V5IHByZXNzZWQgLSBub3QgcHJlc3NlZCB4IG5vdCByZXBvcnRpbmcKKwkJICogKGMteCkgIENUUkwga2V5IHByZXNzZWQgLSBub3QgcHJlc3NlZCB4IG5vdCByZXBvcnRpbmcKKwkJICogXDAzM1xcIHRlcm1pbmF0ZWluZyBzZXF1ZW5jZQorCQkgKi8KKworCQlwID0gdHAgKyBzbGVuOworCQlidXR0b24gPSBtb3VzZV9jb2RlID0gMDsKKwkJc3dpdGNoICgqcCsrKQorCQl7CisJCSAgICBjYXNlICdMJzogYnV0dG9uID0gMTsgYnJlYWs7CisJCSAgICBjYXNlICctJzogYnJlYWs7CisJCSAgICBjYXNlICd4JzogYnJlYWs7IC8qIGlnbm9yZSBzZXF1ZW5jZSAqLworCQkgICAgZGVmYXVsdDogIHJldHVybiAtMTsgLyogVW5rbm93biBSZXN1bHQgKi8KKwkJfQorCQlzd2l0Y2ggKCpwKyspCisJCXsKKwkJICAgIGNhc2UgJ00nOiBidXR0b24gfD0gMjsgYnJlYWs7CisJCSAgICBjYXNlICctJzogYnJlYWs7CisJCSAgICBjYXNlICd4JzogYnJlYWs7IC8qIGlnbm9yZSBzZXF1ZW5jZSAqLworCQkgICAgZGVmYXVsdDogIHJldHVybiAtMTsgLyogVW5rbm93biBSZXN1bHQgKi8KKwkJfQorCQlzd2l0Y2ggKCpwKyspCisJCXsKKwkJICAgIGNhc2UgJ1InOiBidXR0b24gfD0gNDsgYnJlYWs7CisJCSAgICBjYXNlICctJzogYnJlYWs7CisJCSAgICBjYXNlICd4JzogYnJlYWs7IC8qIGlnbm9yZSBzZXF1ZW5jZSAqLworCQkgICAgZGVmYXVsdDogIHJldHVybiAtMTsgLyogVW5rbm93biBSZXN1bHQgKi8KKwkJfQorCQlzdGF0dXMgPSAqcCsrOworCQlmb3IgKHZhbCA9IDAsIG11bHQgPSAxMDAsIGl0ZXIgPSAwOyBpdGVyIDwgMzsgaXRlcisrLAorCQkJCQkJCSAgICAgIG11bHQgLz0gMTAsIHArKykKKwkJICAgIGlmICgqcCA+PSAnMCcgJiYgKnAgPD0gJzknKQorCQkJdmFsICs9ICgqcCAtICcwJykgKiBtdWx0OworCQkgICAgZWxzZQorCQkJcmV0dXJuIC0xOworCQltb3VzZV9jb2wgPSB2YWw7CisJCWZvciAodmFsID0gMCwgbXVsdCA9IDEwMCwgaXRlciA9IDA7IGl0ZXIgPCAzOyBpdGVyKyssCisJCQkJCQkJICAgICAgbXVsdCAvPSAxMCwgcCsrKQorCQkgICAgaWYgKCpwID49ICcwJyAmJiAqcCA8PSAnOScpCisJCQl2YWwgKz0gKCpwIC0gJzAnKSAqIG11bHQ7CisJCSAgICBlbHNlCisJCQlyZXR1cm4gLTE7CisJCW1vdXNlX3JvdyA9IHZhbDsKKwkJc3dpdGNoICgqcCsrKQorCQl7CisJCSAgICBjYXNlICdzJzogYnV0dG9uIHw9IDg7IGJyZWFrOyAgLyogU0hJRlQga2V5IFByZXNzZWQgKi8KKwkJICAgIGNhc2UgJy0nOiBicmVhazsgIC8qIE5vdCBQcmVzc2VkICovCisJCSAgICBjYXNlICd4JzogYnJlYWs7ICAvKiBOb3QgUmVwb3J0aW5nICovCisJCSAgICBkZWZhdWx0OiAgcmV0dXJuIC0xOyAvKiBVbmtub3duIFJlc3VsdCAqLworCQl9CisJCXN3aXRjaCAoKnArKykKKwkJeworCQkgICAgY2FzZSAnYyc6IGJ1dHRvbiB8PSAxNjsgYnJlYWs7ICAvKiBDVFJMIGtleSBQcmVzc2VkICovCisJCSAgICBjYXNlICctJzogYnJlYWs7ICAvKiBOb3QgUHJlc3NlZCAqLworCQkgICAgY2FzZSAneCc6IGJyZWFrOyAgLyogTm90IFJlcG9ydGluZyAqLworCQkgICAgZGVmYXVsdDogIHJldHVybiAtMTsgLyogVW5rbm93biBSZXN1bHQgKi8KKwkJfQorCQlpZiAoKnArKyAhPSAnXDAzMycpCisJCSAgICByZXR1cm4gLTE7CisJCWlmICgqcCsrICE9ICdcXCcpCisJCSAgICByZXR1cm4gLTE7CisJCXN3aXRjaCAoc3RhdHVzKQorCQl7CisJCSAgICBjYXNlICdEJzogLyogRG91YmxlIENsaWNrICovCisJCSAgICBjYXNlICdTJzogLyogU2luZ2xlIENsaWNrICovCisJCQlpZiAoYnV0dG9uICYgMSkgbW91c2VfY29kZSB8PSBNT1VTRV9MRUZUOworCQkJaWYgKGJ1dHRvbiAmIDIpIG1vdXNlX2NvZGUgfD0gTU9VU0VfTUlERExFOworCQkJaWYgKGJ1dHRvbiAmIDQpIG1vdXNlX2NvZGUgfD0gTU9VU0VfUklHSFQ7CisJCQlpZiAoYnV0dG9uICYgOCkgbW91c2VfY29kZSB8PSBNT1VTRV9TSElGVDsKKwkJCWlmIChidXR0b24gJiAxNikgbW91c2VfY29kZSB8PSBNT1VTRV9DVFJMOworCQkJYnJlYWs7CisJCSAgICBjYXNlICdtJzogLyogTW91c2UgbW92ZSAqLworCQkJaWYgKGJ1dHRvbiAmIDEpIG1vdXNlX2NvZGUgfD0gTU9VU0VfTEVGVDsKKwkJCWlmIChidXR0b24gJiAyKSBtb3VzZV9jb2RlIHw9IE1PVVNFX01JRERMRTsKKwkJCWlmIChidXR0b24gJiA0KSBtb3VzZV9jb2RlIHw9IE1PVVNFX1JJR0hUOworCQkJaWYgKGJ1dHRvbiAmIDgpIG1vdXNlX2NvZGUgfD0gTU9VU0VfU0hJRlQ7CisJCQlpZiAoYnV0dG9uICYgMTYpIG1vdXNlX2NvZGUgfD0gTU9VU0VfQ1RSTDsKKwkJCWlmICgoYnV0dG9uICYgNykgIT0gMCkKKwkJCXsKKwkJCSAgICBoZWxkX2J1dHRvbiA9IG1vdXNlX2NvZGU7CisJCQkgICAgbW91c2VfY29kZSB8PSBNT1VTRV9EUkFHOworCQkJfQorCQkJaXNfZHJhZyA9IFRSVUU7CisJCQlzaG93bW9kZSgpOworCQkJYnJlYWs7CisJCSAgICBjYXNlICdkJzogLyogQnV0dG9uIERvd24gKi8KKwkJCWlmIChidXR0b24gJiAxKSBtb3VzZV9jb2RlIHw9IE1PVVNFX0xFRlQ7CisJCQlpZiAoYnV0dG9uICYgMikgbW91c2VfY29kZSB8PSBNT1VTRV9NSURETEU7CisJCQlpZiAoYnV0dG9uICYgNCkgbW91c2VfY29kZSB8PSBNT1VTRV9SSUdIVDsKKwkJCWlmIChidXR0b24gJiA4KSBtb3VzZV9jb2RlIHw9IE1PVVNFX1NISUZUOworCQkJaWYgKGJ1dHRvbiAmIDE2KSBtb3VzZV9jb2RlIHw9IE1PVVNFX0NUUkw7CisJCQlicmVhazsKKwkJICAgIGNhc2UgJ3UnOiAvKiBCdXR0b24gVXAgKi8KKwkJCWlmIChidXR0b24gJiAxKQorCQkJICAgIG1vdXNlX2NvZGUgfD0gTU9VU0VfTEVGVCB8IE1PVVNFX1JFTEVBU0U7CisJCQlpZiAoYnV0dG9uICYgMikKKwkJCSAgICBtb3VzZV9jb2RlIHw9IE1PVVNFX01JRERMRSB8IE1PVVNFX1JFTEVBU0U7CisJCQlpZiAoYnV0dG9uICYgNCkKKwkJCSAgICBtb3VzZV9jb2RlIHw9IE1PVVNFX1JJR0hUIHwgTU9VU0VfUkVMRUFTRTsKKwkJCWlmIChidXR0b24gJiA4KQorCQkJICAgIG1vdXNlX2NvZGUgfD0gTU9VU0VfU0hJRlQ7CisJCQlpZiAoYnV0dG9uICYgMTYpCisJCQkgICAgbW91c2VfY29kZSB8PSBNT1VTRV9DVFJMOworCQkJYnJlYWs7CisJCSAgICBkZWZhdWx0OiByZXR1cm4gLTE7IC8qIFVua25vd24gUmVzdWx0ICovCisJCX0KKworCQlzbGVuICs9IChwIC0gKHRwICsgc2xlbikpOworCSAgICB9CisjIGVuZGlmIC8qIEZFQVRfTU9VU0VfSlNCICovCisjIGlmZGVmIEZFQVRfTU9VU0VfREVDCisJICAgIGlmIChrZXlfbmFtZVswXSA9PSAoaW50KUtTX0RFQ19NT1VTRSkKKwkgICAgeworCSAgICAgICAvKiBUaGUgREVDIExvY2F0b3IgSW5wdXQgTW9kZWwKKwkJKiBOZXR0ZXJtIGRlbGl2ZXJzIHRoZSBjb2RlIHNlcXVlbmNlOgorCQkqICBcMDMzWzI7NDsyNDs4MCZ3ICAobGVmdCBidXR0b24gZG93bikKKwkJKiAgXDAzM1szOzA7MjQ7ODAmdyAgKGxlZnQgYnV0dG9uIHVwKQorCQkqICBcMDMzWzY7MTsyNDs4MCZ3ICAocmlnaHQgYnV0dG9uIGRvd24pCisJCSogIFwwMzNbNzswOzI0OzgwJncgIChyaWdodCBidXR0b24gdXApCisJCSogQ1NJIFBlIDsgUGIgOyBQciA7IFBjIDsgUHAgJiB3CisJCSogUGUgaXMgdGhlIGV2ZW50IGNvZGUKKwkJKiBQYiBpcyB0aGUgYnV0dG9uIGNvZGUKKwkJKiBQciBpcyB0aGUgcm93IGNvb3JkaW5hdGUKKwkJKiBQYyBpcyB0aGUgY29sdW1uIGNvb3JkaW5hdGUKKwkJKiBQcCBpcyB0aGUgdGhpcmQgY29vcmRpbmF0ZSAocGFnZSBudW1iZXIpCisJCSogUGUsIHRoZSBldmVudCBjb2RlIGluZGljYXRlcyB3aGF0IGV2ZW50IGNhdXNlZCB0aGlzIHJlcG9ydAorCQkqICAgIFRoZSBmb2xsb3dpbmcgZXZlbnQgY29kZXMgYXJlIGRlZmluZWQ6CisJCSogICAgMCAtIHJlcXVlc3QsIHRoZSB0ZXJtaW5hbCByZWNlaXZlZCBhbiBleHBsaWNpdCByZXF1ZXN0CisJCSoJIGZvciBhIGxvY2F0b3IgcmVwb3J0LCBidXQgdGhlIGxvY2F0b3IgaXMgdW5hdmFpbGFibGUKKwkJKiAgICAxIC0gcmVxdWVzdCwgdGhlIHRlcm1pbmFsIHJlY2VpdmVkIGFuIGV4cGxpY2l0IHJlcXVlc3QKKwkJKgkgZm9yIGEgbG9jYXRvciByZXBvcnQKKwkJKiAgICAyIC0gbGVmdCBidXR0b24gZG93bgorCQkqICAgIDMgLSBsZWZ0IGJ1dHRvbiB1cAorCQkqICAgIDQgLSBtaWRkbGUgYnV0dG9uIGRvd24KKwkJKiAgICA1IC0gbWlkZGxlIGJ1dHRvbiB1cAorCQkqICAgIDYgLSByaWdodCBidXR0b24gZG93bgorCQkqICAgIDcgLSByaWdodCBidXR0b24gdXAKKwkJKiAgICA4IC0gZm91cnRoIGJ1dHRvbiBkb3duCisJCSogICAgOSAtIGZvdXJ0aCBidXR0b24gdXAKKwkJKiAgICAxMCAtIGxvY2F0b3Igb3V0c2lkZSBmaWx0ZXIgcmVjdGFuZ2xlCisJCSogUGIsIHRoZSBidXR0b24gY29kZSwgQVNDSUkgZGVjaW1hbCAwLTE1IGluZGljYXRpbmcgd2hpY2gKKwkJKiAgIGJ1dHRvbnMgYXJlIGRvd24gaWYgYW55LiBUaGUgc3RhdGUgb2YgdGhlIGZvdXIgYnV0dG9ucworCQkqICAgb24gdGhlIGxvY2F0b3IgY29ycmVzcG9uZCB0byB0aGUgbG93IGZvdXIgYml0cyBvZiB0aGUKKwkJKiAgIGRlY2ltYWwgdmFsdWUsCisJCSogICAiMSIgbWVhbnMgYnV0dG9uIGRlcHJlc3NlZAorCQkqICAgMCAtIG5vIGJ1dHRvbnMgZG93biwKKwkJKiAgIDEgLSByaWdodCwKKwkJKiAgIDIgLSBtaWRkbGUsCisJCSogICA0IC0gbGVmdCwKKwkJKiAgIDggLSBmb3VydGgKKwkJKiBQciBpcyB0aGUgcm93IGNvb3JkaW5hdGUgb2YgdGhlIGxvY2F0b3IgcG9zaXRpb24gaW4gdGhlIHBhZ2UsCisJCSogICBlbmNvZGVkIGFzIGFuIEFTQ0lJIGRlY2ltYWwgdmFsdWUuCisJCSogICBJZiBQciBpcyBvbWl0dGVkLCB0aGUgbG9jYXRvciBwb3NpdGlvbiBpcyB1bmRlZmluZWQKKwkJKiAgIChvdXRzaWRlIHRoZSB0ZXJtaW5hbCB3aW5kb3cgZm9yIGV4YW1wbGUpLgorCQkqIFBjIGlzIHRoZSBjb2x1bW4gY29vcmRpbmF0ZSBvZiB0aGUgbG9jYXRvciBwb3NpdGlvbiBpbiB0aGUKKwkJKiAgIHBhZ2UsIGVuY29kZWQgYXMgYW4gQVNDSUkgZGVjaW1hbCB2YWx1ZS4KKwkJKiAgIElmIFBjIGlzIG9taXR0ZWQsIHRoZSBsb2NhdG9yIHBvc2l0aW9uIGlzIHVuZGVmaW5lZAorCQkqICAgKG91dHNpZGUgdGhlIHRlcm1pbmFsIHdpbmRvdyBmb3IgZXhhbXBsZSkuCisJCSogUHAgaXMgdGhlIHBhZ2UgY29vcmRpbmF0ZSBvZiB0aGUgbG9jYXRvciBwb3NpdGlvbgorCQkqICAgZW5jb2RlZCBhcyBhbiBBU0NJSSBkZWNpbWFsIHZhbHVlLgorCQkqICAgVGhlIHBhZ2UgY29vcmRpbmF0ZSBtYXkgYmUgb21pdHRlZCBpZiB0aGUgbG9jYXRvciBpcyBvbgorCQkqICAgcGFnZSBvbmUgKHRoZSBkZWZhdWx0KS4gIFdlIGlnbm9yZSBpdCBhbnl3YXkuCisJCSovCisJCWludCBQZSwgUGIsIFByLCBQYzsKKworCQlwID0gdHAgKyBzbGVuOworCisJCS8qIGdldCBldmVudCBzdGF0dXMgKi8KKwkJUGUgPSBnZXRkaWdpdHMoJnApOworCQlpZiAoKnArKyAhPSAnOycpCisJCSAgICByZXR1cm4gLTE7CisKKwkJLyogZ2V0IGJ1dHRvbiBzdGF0dXMgKi8KKwkJUGIgPSBnZXRkaWdpdHMoJnApOworCQlpZiAoKnArKyAhPSAnOycpCisJCSAgICByZXR1cm4gLTE7CisKKwkJLyogZ2V0IHJvdyBzdGF0dXMgKi8KKwkJUHIgPSBnZXRkaWdpdHMoJnApOworCQlpZiAoKnArKyAhPSAnOycpCisJCSAgICByZXR1cm4gLTE7CisKKwkJLyogZ2V0IGNvbHVtbiBzdGF0dXMgKi8KKwkJUGMgPSBnZXRkaWdpdHMoJnApOworCisJCS8qIHRoZSBwYWdlIHBhcmFtZXRlciBpcyBvcHRpb25hbCAqLworCQlpZiAoKnAgPT0gJzsnKQorCQl7CisJCSAgICBwKys7CisJCSAgICAodm9pZClnZXRkaWdpdHMoJnApOworCQl9CisJCWlmICgqcCsrICE9ICcmJykKKwkJICAgIHJldHVybiAtMTsKKwkJaWYgKCpwKysgIT0gJ3cnKQorCQkgICAgcmV0dXJuIC0xOworCisJCW1vdXNlX2NvZGUgPSAwOworCQlzd2l0Y2ggKFBlKQorCQl7CisJCWNhc2UgIDA6IHJldHVybiAtMTsgLyogcG9zaXRpb24gcmVxdWVzdCB3aGlsZSB1bmF2YWlsYWJsZSAqLworCQljYXNlICAxOiAvKiBhIHJlc3BvbnNlIHRvIGEgbG9jYXRvciBwb3NpdGlvbiByZXF1ZXN0IGluY2x1ZGVzCisJCQkgICAgdGhlIHN0YXR1cyBvZiBhbGwgYnV0dG9ucyAqLworCQkJIFBiICY9IDc7ICAgLyogbWFzayBvZmYgYW5kIGlnbm9yZSBmb3VydGggYnV0dG9uICovCisJCQkgaWYgKFBiICYgNCkKKwkJCSAgICAgbW91c2VfY29kZSAgPSBNT1VTRV9MRUZUOworCQkJIGlmIChQYiAmIDIpCisJCQkgICAgIG1vdXNlX2NvZGUgID0gTU9VU0VfTUlERExFOworCQkJIGlmIChQYiAmIDEpCisJCQkgICAgIG1vdXNlX2NvZGUgID0gTU9VU0VfUklHSFQ7CisJCQkgaWYgKFBiKQorCQkJIHsKKwkJCSAgICAgaGVsZF9idXR0b24gPSBtb3VzZV9jb2RlOworCQkJICAgICBtb3VzZV9jb2RlIHw9IE1PVVNFX0RSQUc7CisJCQkgICAgIFdhbnRRdWVyeU1vdXNlID0gMTsKKwkJCSB9CisJCQkgaXNfZHJhZyA9IFRSVUU7CisJCQkgc2hvd21vZGUoKTsKKwkJCSBicmVhazsKKwkJY2FzZSAgMjogbW91c2VfY29kZSA9IE1PVVNFX0xFRlQ7CisJCQkgV2FudFF1ZXJ5TW91c2UgPSAxOworCQkJIGJyZWFrOworCQljYXNlICAzOiBtb3VzZV9jb2RlID0gTU9VU0VfUkVMRUFTRSB8IE1PVVNFX0xFRlQ7CisJCQkgYnJlYWs7CisJCWNhc2UgIDQ6IG1vdXNlX2NvZGUgPSBNT1VTRV9NSURETEU7CisJCQkgV2FudFF1ZXJ5TW91c2UgPSAxOworCQkJIGJyZWFrOworCQljYXNlICA1OiBtb3VzZV9jb2RlID0gTU9VU0VfUkVMRUFTRSB8IE1PVVNFX01JRERMRTsKKwkJCSBicmVhazsKKwkJY2FzZSAgNjogbW91c2VfY29kZSA9IE1PVVNFX1JJR0hUOworCQkJIFdhbnRRdWVyeU1vdXNlID0gMTsKKwkJCSBicmVhazsKKwkJY2FzZSAgNzogbW91c2VfY29kZSA9IE1PVVNFX1JFTEVBU0UgfCBNT1VTRV9SSUdIVDsKKwkJCSBicmVhazsKKwkJY2FzZSAgODogcmV0dXJuIC0xOyAvKiBmb3VydGggYnV0dG9uIGRvd24gKi8KKwkJY2FzZSAgOTogcmV0dXJuIC0xOyAvKiBmb3VydGggYnV0dG9uIHVwICovCisJCWNhc2UgMTA6IHJldHVybiAtMTsgLyogbW91c2Ugb3V0c2lkZSBvZiBmaWx0ZXIgcmVjdGFuZ2xlICovCisJCWRlZmF1bHQ6IHJldHVybiAtMTsgLyogc2hvdWxkIG5ldmVyIG9jY3VyICovCisJCX0KKworCQltb3VzZV9jb2wgPSBQYyAtIDE7CisJCW1vdXNlX3JvdyA9IFByIC0gMTsKKworCQlzbGVuICs9IChpbnQpKHAgLSAodHAgKyBzbGVuKSk7CisJICAgIH0KKyMgZW5kaWYgLyogRkVBVF9NT1VTRV9ERUMgKi8KKyMgaWZkZWYgRkVBVF9NT1VTRV9QVEVSTQorCSAgICBpZiAoa2V5X25hbWVbMF0gPT0gKGludClLU19QVEVSTV9NT1VTRSkKKwkgICAgeworCQlpbnQgYnV0dG9uLCBudW1fY2xpY2tzLCBhY3Rpb24sIG1jLCBtcjsKKworCQlwID0gdHAgKyBzbGVuOworCisJCWFjdGlvbiA9IGdldGRpZ2l0cygmcCk7CisJCWlmICgqcCsrICE9ICc7JykKKwkJICAgIHJldHVybiAtMTsKKworCQltb3VzZV9yb3cgPSBnZXRkaWdpdHMoJnApOworCQlpZiAoKnArKyAhPSAnOycpCisJCSAgICByZXR1cm4gLTE7CisJCW1vdXNlX2NvbCA9IGdldGRpZ2l0cygmcCk7CisJCWlmICgqcCsrICE9ICc7JykKKwkJICAgIHJldHVybiAtMTsKKworCQlidXR0b24gPSBnZXRkaWdpdHMoJnApOworCQltb3VzZV9jb2RlID0gMDsKKworCQlzd2l0Y2goIGJ1dHRvbiApCisJCXsKKwkJICAgIGNhc2UgNDogbW91c2VfY29kZSA9IE1PVVNFX0xFRlQ7IGJyZWFrOworCQkgICAgY2FzZSAxOiBtb3VzZV9jb2RlID0gTU9VU0VfUklHSFQ7IGJyZWFrOworCQkgICAgY2FzZSAyOiBtb3VzZV9jb2RlID0gTU9VU0VfTUlERExFOyBicmVhazsKKwkJICAgIGRlZmF1bHQ6IHJldHVybiAtMTsKKwkJfQorCisJCXN3aXRjaCggYWN0aW9uICkKKwkJeworCQkgICAgY2FzZSAzMTogLyogSW5pdGlhbCBwcmVzcyAqLworCQkJaWYgKCpwKysgIT0gJzsnKQorCQkJICAgIHJldHVybiAtMTsKKworCQkJbnVtX2NsaWNrcyA9IGdldGRpZ2l0cygmcCk7IC8qIE5vdCB1c2VkICovCisJCQlicmVhazsKKworCQkgICAgY2FzZSAzMjogLyogUmVsZWFzZSAqLworCQkJbW91c2VfY29kZSB8PSBNT1VTRV9SRUxFQVNFOworCQkJYnJlYWs7CisKKwkJICAgIGNhc2UgMzM6IC8qIERyYWcgKi8KKwkJCWhlbGRfYnV0dG9uID0gbW91c2VfY29kZTsKKwkJCW1vdXNlX2NvZGUgfD0gTU9VU0VfRFJBRzsKKwkJCWJyZWFrOworCisJCSAgICBkZWZhdWx0OgorCQkJcmV0dXJuIC0xOworCQl9CisKKwkJaWYgKCpwKysgIT0gJ3QnKQorCQkgICAgcmV0dXJuIC0xOworCisJCXNsZW4gKz0gKHAgLSAodHAgKyBzbGVuKSk7CisJICAgIH0KKyMgZW5kaWYgLyogRkVBVF9NT1VTRV9QVEVSTSAqLworCisJICAgIC8qIEludGVycHJldCB0aGUgbW91c2UgY29kZSAqLworCSAgICBjdXJyZW50X2J1dHRvbiA9IChtb3VzZV9jb2RlICYgTU9VU0VfQ0xJQ0tfTUFTSyk7CisJICAgIGlmIChjdXJyZW50X2J1dHRvbiA9PSBNT1VTRV9SRUxFQVNFCisjIGlmZGVmIEZFQVRfTU9VU0VfWFRFUk0KKwkJICAgICYmIHdoZWVsX2NvZGUgPT0gMAorIyBlbmRpZgorCQkgICAgKQorCSAgICB7CisJCS8qCisJCSAqIElmIHdlIGdldCBhIG1vdXNlIGRyYWcgb3IgcmVsZWFzZSBldmVudCB3aGVuCisJCSAqIHRoZXJlIGlzIG5vIG1vdXNlIGJ1dHRvbiBoZWxkIGRvd24gKGhlbGRfYnV0dG9uID09CisJCSAqIE1PVVNFX1JFTEVBU0UpLCBwcm9kdWNlIGEgS19JR05PUkUgYmVsb3cuCisJCSAqIChjYW4gaGFwcGVuIHdoZW4geW91IGhvbGQgZG93biB0d28gYnV0dG9ucworCQkgKiBhbmQgdGhlbiBsZXQgdGhlbSBnbywgb3IgY2xpY2sgaW4gdGhlIG1lbnUgYmFyLCBidXQgbm90CisJCSAqIG9uIGEgbWVudSwgYW5kIGRyYWcgaW50byB0aGUgdGV4dCkuCisJCSAqLworCQlpZiAoKG1vdXNlX2NvZGUgJiBNT1VTRV9EUkFHKSA9PSBNT1VTRV9EUkFHKQorCQkgICAgaXNfZHJhZyA9IFRSVUU7CisJCWN1cnJlbnRfYnV0dG9uID0gaGVsZF9idXR0b247CisJICAgIH0KKwkgICAgZWxzZSBpZiAod2hlZWxfY29kZSA9PSAwKQorCSAgICB7CisjIGlmZGVmIENIRUNLX0RPVUJMRV9DTElDSworIyAgaWZkZWYgRkVBVF9NT1VTRV9HUE0KKyMgICBpZmRlZiBGRUFUX0dVSQorCQkvKgorCQkgKiBPbmx5IGZvciBVbml4LCB3aGVuIEdVSSBvciBncG0gaXMgbm90IGFjdGl2ZSwgd2UgaGFuZGxlCisJCSAqIG11bHRpLWNsaWNrcyBoZXJlLgorCQkgKi8KKwkJaWYgKGdwbV9mbGFnID09IDAgJiYgIWd1aS5pbl91c2UpCisjICAgZWxzZQorCQlpZiAoZ3BtX2ZsYWcgPT0gMCkKKyMgICBlbmRpZgorIyAgZWxzZQorIyAgIGlmZGVmIEZFQVRfR1VJCisJCWlmICghZ3VpLmluX3VzZSkKKyMgICBlbmRpZgorIyAgZW5kaWYKKwkJeworCQkgICAgLyoKKwkJICAgICAqIENvbXB1dGUgdGhlIHRpbWUgZWxhcHNlZCBzaW5jZSB0aGUgcHJldmlvdXMgbW91c2UgY2xpY2suCisJCSAgICAgKi8KKwkJICAgIGdldHRpbWVvZmRheSgmbW91c2VfdGltZSwgTlVMTCk7CisJCSAgICB0aW1lZGlmZiA9IChtb3VzZV90aW1lLnR2X3VzZWMKKwkJCQkJICAgIC0gb3JpZ19tb3VzZV90aW1lLnR2X3VzZWMpIC8gMTAwMDsKKwkJICAgIGlmICh0aW1lZGlmZiA8IDApCisJCQktLW9yaWdfbW91c2VfdGltZS50dl9zZWM7CisJCSAgICB0aW1lZGlmZiArPSAobW91c2VfdGltZS50dl9zZWMKKwkJCQkJICAgICAtIG9yaWdfbW91c2VfdGltZS50dl9zZWMpICogMTAwMDsKKwkJICAgIG9yaWdfbW91c2VfdGltZSA9IG1vdXNlX3RpbWU7CisJCSAgICBpZiAobW91c2VfY29kZSA9PSBvcmlnX21vdXNlX2NvZGUKKwkJCSAgICAmJiB0aW1lZGlmZiA8IHBfbW91c2V0CisJCQkgICAgJiYgb3JpZ19udW1fY2xpY2tzICE9IDQKKwkJCSAgICAmJiBvcmlnX21vdXNlX2NvbCA9PSBtb3VzZV9jb2wKKwkJCSAgICAmJiBvcmlnX21vdXNlX3JvdyA9PSBtb3VzZV9yb3cKKyNpZmRlZiBGRUFUX0RJRkYKKwkJCSAgICAmJiBvcmlnX3RvcGZpbGwgPT0gY3Vyd2luLT53X3RvcGZpbGwKKyNlbmRpZgorCQkJICAgICYmIG9yaWdfdG9wbGluZSA9PSBjdXJ3aW4tPndfdG9wbGluZSkKKwkJCSsrb3JpZ19udW1fY2xpY2tzOworCQkgICAgZWxzZQorCQkJb3JpZ19udW1fY2xpY2tzID0gMTsKKwkJICAgIG9yaWdfbW91c2VfY29sID0gbW91c2VfY29sOworCQkgICAgb3JpZ19tb3VzZV9yb3cgPSBtb3VzZV9yb3c7CisJCSAgICBvcmlnX3RvcGxpbmUgPSBjdXJ3aW4tPndfdG9wbGluZTsKKyNpZmRlZiBGRUFUX0RJRkYKKwkJICAgIG9yaWdfdG9wZmlsbCA9IGN1cndpbi0+d190b3BmaWxsOworI2VuZGlmCisJCX0KKyMgIGlmIGRlZmluZWQoRkVBVF9HVUkpIHx8IGRlZmluZWQoRkVBVF9NT1VTRV9HUE0pCisJCWVsc2UKKwkJICAgIG9yaWdfbnVtX2NsaWNrcyA9IE5VTV9NT1VTRV9DTElDS1MobW91c2VfY29kZSk7CisjICBlbmRpZgorIyBlbHNlCisJCW9yaWdfbnVtX2NsaWNrcyA9IE5VTV9NT1VTRV9DTElDS1MobW91c2VfY29kZSk7CisjIGVuZGlmCisJCWlzX2NsaWNrID0gVFJVRTsKKwkJb3JpZ19tb3VzZV9jb2RlID0gbW91c2VfY29kZTsKKwkgICAgfQorCSAgICBpZiAoIWlzX2RyYWcpCisJCWhlbGRfYnV0dG9uID0gbW91c2VfY29kZSAmIE1PVVNFX0NMSUNLX01BU0s7CisKKwkgICAgLyoKKwkgICAgICogVHJhbnNsYXRlIHRoZSBhY3R1YWwgbW91c2UgZXZlbnQgaW50byBhIHBzZXVkbyBtb3VzZSBldmVudC4KKwkgICAgICogRmlyc3Qgd29yayBvdXQgd2hhdCBtb2RpZmllcnMgYXJlIHRvIGJlIHVzZWQuCisJICAgICAqLworCSAgICBtb2RpZmllcnMgPSAweDA7CisJICAgIGlmIChvcmlnX21vdXNlX2NvZGUgJiBNT1VTRV9TSElGVCkKKwkJbW9kaWZpZXJzIHw9IE1PRF9NQVNLX1NISUZUOworCSAgICBpZiAob3JpZ19tb3VzZV9jb2RlICYgTU9VU0VfQ1RSTCkKKwkJbW9kaWZpZXJzIHw9IE1PRF9NQVNLX0NUUkw7CisJICAgIGlmIChvcmlnX21vdXNlX2NvZGUgJiBNT1VTRV9BTFQpCisJCW1vZGlmaWVycyB8PSBNT0RfTUFTS19BTFQ7CisJICAgIGlmIChvcmlnX251bV9jbGlja3MgPT0gMikKKwkJbW9kaWZpZXJzIHw9IE1PRF9NQVNLXzJDTElDSzsKKwkgICAgZWxzZSBpZiAob3JpZ19udW1fY2xpY2tzID09IDMpCisJCW1vZGlmaWVycyB8PSBNT0RfTUFTS18zQ0xJQ0s7CisJICAgIGVsc2UgaWYgKG9yaWdfbnVtX2NsaWNrcyA9PSA0KQorCQltb2RpZmllcnMgfD0gTU9EX01BU0tfNENMSUNLOworCisJICAgIC8qIEFkZCB0aGUgbW9kaWZpZXIgY29kZXMgdG8gb3VyIHN0cmluZyAqLworCSAgICBpZiAobW9kaWZpZXJzICE9IDApCisJICAgIHsKKwkJc3RyaW5nW25ld19zbGVuKytdID0gS19TUEVDSUFMOworCQlzdHJpbmdbbmV3X3NsZW4rK10gPSAoaW50KUtTX01PRElGSUVSOworCQlzdHJpbmdbbmV3X3NsZW4rK10gPSBtb2RpZmllcnM7CisJICAgIH0KKworCSAgICAvKiBXb3JrIG91dCBvdXIgcHNldWRvIG1vdXNlIGV2ZW50ICovCisJICAgIGtleV9uYW1lWzBdID0gKGludClLU19FWFRSQTsKKwkgICAgaWYgKHdoZWVsX2NvZGUgIT0gMCkKKwkJa2V5X25hbWVbMV0gPSAod2hlZWxfY29kZSAmIDEpCisJCQkJCT8gKGludClLRV9NT1VTRVVQIDogKGludClLRV9NT1VTRURPV047CisJICAgIGVsc2UKKwkJa2V5X25hbWVbMV0gPSBnZXRfcHNldWRvX21vdXNlX2NvZGUoY3VycmVudF9idXR0b24sCisJCQkJCQkJICAgaXNfY2xpY2ssIGlzX2RyYWcpOworCX0KKyNlbmRpZiAvKiBGRUFUX01PVVNFICovCisKKyNpZmRlZiBGRUFUX0dVSQorCS8qCisJICogSWYgdXNpbmcgdGhlIEdVSSwgdGhlbiB3ZSBnZXQgbWVudSBhbmQgc2Nyb2xsYmFyIGV2ZW50cy4KKwkgKgorCSAqIEEgbWVudSBldmVudCBpcyBlbmNvZGVkIGFzIEtfU1BFQ0lBTCwgS1NfTUVOVSwgS0VfRklMTEVSIGZvbGxvd2VkIGJ5CisJICogZm91ciBieXRlcyB3aGljaCBhcmUgdG8gYmUgdGFrZW4gYXMgYSBwb2ludGVyIHRvIHRoZSB2aW1tZW51X1QKKwkgKiBzdHJ1Y3R1cmUuCisJICoKKwkgKiBBIHNjcm9sbGJhciBldmVudCBpcyBLX1NQRUNJQUwsIEtTX1ZFUl9TQ1JPTExCQVIsIEtFX0ZJTExFUiBmb2xsb3dlZAorCSAqIGJ5IG9uZSBieXRlIHJlcHJlc2VudGluZyB0aGUgc2Nyb2xsYmFyIG51bWJlciwgYW5kIHRoZW4gZm91ciBieXRlcworCSAqIHJlcHJlc2VudGluZyBhIGxvbmdfdSB3aGljaCBpcyB0aGUgbmV3IHZhbHVlIG9mIHRoZSBzY3JvbGxiYXIuCisJICoKKwkgKiBBIGhvcml6b250YWwgc2Nyb2xsYmFyIGV2ZW50IGlzIEtfU1BFQ0lBTCwgS1NfSE9SX1NDUk9MTEJBUiwKKwkgKiBLRV9GSUxMRVIgZm9sbG93ZWQgYnkgZm91ciBieXRlcyByZXByZXNlbnRpbmcgYSBsb25nX3Ugd2hpY2ggaXMgdGhlCisJICogbmV3IHZhbHVlIG9mIHRoZSBzY3JvbGxiYXIuCisJICovCisjIGlmZGVmIEZFQVRfTUVOVQorCWVsc2UgaWYgKGtleV9uYW1lWzBdID09IChpbnQpS1NfTUVOVSkKKwl7CisJICAgIGxvbmdfdQl2YWw7CisKKwkgICAgbnVtX2J5dGVzID0gZ2V0X2xvbmdfZnJvbV9idWYodHAgKyBzbGVuLCAmdmFsKTsKKwkgICAgaWYgKG51bV9ieXRlcyA9PSAtMSkKKwkJcmV0dXJuIC0xOworCSAgICBjdXJyZW50X21lbnUgPSAodmltbWVudV9UICopdmFsOworCSAgICBzbGVuICs9IG51bV9ieXRlczsKKwl9CisjIGVuZGlmCisjIGlmbmRlZiBVU0VfT05fRkxZX1NDUk9MTAorCWVsc2UgaWYgKGtleV9uYW1lWzBdID09IChpbnQpS1NfVkVSX1NDUk9MTEJBUikKKwl7CisJICAgIGxvbmdfdQl2YWw7CisKKwkgICAgLyogR2V0IHRoZSBsYXN0IHNjcm9sbGJhciBldmVudCBpbiB0aGUgcXVldWUgb2YgdGhlIHNhbWUgdHlwZSAqLworCSAgICBqID0gMDsKKwkgICAgZm9yIChpID0gMDsgdHBbal0gPT0gQ1NJICYmIHRwW2ogKyAxXSA9PSBLU19WRVJfU0NST0xMQkFSCisJCQkJCQkgICAgICYmIHRwW2ogKyAyXSAhPSBOVUw7ICsraSkKKwkgICAgeworCQlqICs9IDM7CisJCW51bV9ieXRlcyA9IGdldF9ieXRlc19mcm9tX2J1Zih0cCArIGosIGJ5dGVzLCAxKTsKKwkJaWYgKG51bV9ieXRlcyA9PSAtMSkKKwkJICAgIGJyZWFrOworCQlpZiAoaSA9PSAwKQorCQkgICAgY3VycmVudF9zY3JvbGxiYXIgPSAoaW50KWJ5dGVzWzBdOworCQllbHNlIGlmIChjdXJyZW50X3Njcm9sbGJhciAhPSAoaW50KWJ5dGVzWzBdKQorCQkgICAgYnJlYWs7CisJCWogKz0gbnVtX2J5dGVzOworCQludW1fYnl0ZXMgPSBnZXRfbG9uZ19mcm9tX2J1Zih0cCArIGosICZ2YWwpOworCQlpZiAobnVtX2J5dGVzID09IC0xKQorCQkgICAgYnJlYWs7CisJCXNjcm9sbGJhcl92YWx1ZSA9IHZhbDsKKwkJaiArPSBudW1fYnl0ZXM7CisJCXNsZW4gPSBqOworCSAgICB9CisJICAgIGlmIChpID09IDApCQkvKiBub3QgZW5vdWdoIGNoYXJhY3RlcnMgdG8gbWFrZSBvbmUgKi8KKwkJcmV0dXJuIC0xOworCX0KKwllbHNlIGlmIChrZXlfbmFtZVswXSA9PSAoaW50KUtTX0hPUl9TQ1JPTExCQVIpCisJeworCSAgICBsb25nX3UJdmFsOworCisJICAgIC8qIEdldCB0aGUgbGFzdCBob3Jpei4gc2Nyb2xsYmFyIGV2ZW50IGluIHRoZSBxdWV1ZSAqLworCSAgICBqID0gMDsKKwkgICAgZm9yIChpID0gMDsgdHBbal0gPT0gQ1NJICYmIHRwW2ogKyAxXSA9PSBLU19IT1JfU0NST0xMQkFSCisJCQkJCQkgICAgICYmIHRwW2ogKyAyXSAhPSBOVUw7ICsraSkKKwkgICAgeworCQlqICs9IDM7CisJCW51bV9ieXRlcyA9IGdldF9sb25nX2Zyb21fYnVmKHRwICsgaiwgJnZhbCk7CisJCWlmIChudW1fYnl0ZXMgPT0gLTEpCisJCSAgICBicmVhazsKKwkJc2Nyb2xsYmFyX3ZhbHVlID0gdmFsOworCQlqICs9IG51bV9ieXRlczsKKwkJc2xlbiA9IGo7CisJICAgIH0KKwkgICAgaWYgKGkgPT0gMCkJCS8qIG5vdCBlbm91Z2ggY2hhcmFjdGVycyB0byBtYWtlIG9uZSAqLworCQlyZXR1cm4gLTE7CisJfQorIyBlbmRpZiAvKiAhVVNFX09OX0ZMWV9TQ1JPTEwgKi8KKyNlbmRpZiAvKiBGRUFUX0dVSSAqLworCisJLyogRmluYWxseSwgYWRkIHRoZSBzcGVjaWFsIGtleSBjb2RlIHRvIG91ciBzdHJpbmcgKi8KKwlpZiAoa2V5X25hbWVbMF0gPT0gS1NfS0VZKQorCSAgICBzdHJpbmdbbmV3X3NsZW4rK10gPSBrZXlfbmFtZVsxXTsJLyogZnJvbSAiOnNldCA8TS1iPj14eCIgKi8KKwllbHNlCisJeworCSAgICBzdHJpbmdbbmV3X3NsZW4rK10gPSBLX1NQRUNJQUw7CisJICAgIHN0cmluZ1tuZXdfc2xlbisrXSA9IGtleV9uYW1lWzBdOworCSAgICBzdHJpbmdbbmV3X3NsZW4rK10gPSBrZXlfbmFtZVsxXTsKKwl9CisJc3RyaW5nW25ld19zbGVuXSA9IE5VTDsKKwlleHRyYSA9IG5ld19zbGVuIC0gc2xlbjsKKwlpZiAoYnVmID09IE5VTEwpCisJeworCSAgICBpZiAoZXh0cmEgPCAwKQorCQkvKiByZW1vdmUgbWF0Y2hlZCBjaGFycywgdGFraW5nIGNhcmUgb2Ygbm9yZW1hcCAqLworCQlkZWxfdHlwZWJ1ZigtZXh0cmEsIG9mZnNldCk7CisJICAgIGVsc2UgaWYgKGV4dHJhID4gMCkKKwkJLyogaW5zZXJ0IHRoZSBleHRyYSBzcGFjZSB3ZSBuZWVkICovCisJCWluc190eXBlYnVmKHN0cmluZyArIHNsZW4sIFJFTUFQX1lFUywgb2Zmc2V0LCBGQUxTRSwgRkFMU0UpOworCisJICAgIC8qCisJICAgICAqIENhcmVmdWw6IGRlbF90eXBlYnVmKCkgYW5kIGluc190eXBlYnVmKCkgbWF5IGhhdmUgcmVhbGxvY2F0ZWQKKwkgICAgICogdHlwZWJ1Zi50Yl9idWZbXSEKKwkgICAgICovCisJICAgIG1jaF9tZW1tb3ZlKHR5cGVidWYudGJfYnVmICsgdHlwZWJ1Zi50Yl9vZmYgKyBvZmZzZXQsIHN0cmluZywKKwkJCQkJCQkgICAgKHNpemVfdCluZXdfc2xlbik7CisJfQorCWVsc2UKKwl7CisJICAgIGlmIChleHRyYSA8IDApCisJCS8qIHJlbW92ZSBtYXRjaGVkIGNoYXJhY3RlcnMgKi8KKwkJbWNoX21lbW1vdmUoYnVmICsgb2Zmc2V0LCBidWYgKyBvZmZzZXQgLSBleHRyYSwKKwkJCQkJICAgKHNpemVfdCkoYnVmbGVuICsgb2Zmc2V0ICsgZXh0cmEpKTsKKwkgICAgZWxzZSBpZiAoZXh0cmEgPiAwKQorCQkvKiBpbnNlcnQgdGhlIGV4dHJhIHNwYWNlIHdlIG5lZWQgKi8KKwkJbWNoX21lbW1vdmUoYnVmICsgb2Zmc2V0ICsgZXh0cmEsIGJ1ZiArIG9mZnNldCwKKwkJCQkJCSAgIChzaXplX3QpKGJ1ZmxlbiAtIG9mZnNldCkpOworCSAgICBtY2hfbWVtbW92ZShidWYgKyBvZmZzZXQsIHN0cmluZywgKHNpemVfdCluZXdfc2xlbik7CisJfQorCXJldHVybiAobGVuICsgZXh0cmEgKyBvZmZzZXQpOworICAgIH0KKworICAgIHJldHVybiAwOwkJCSAgICAvKiBubyBtYXRjaCBmb3VuZCAqLworfQorCisvKgorICogUmVwbGFjZSBhbnkgdGVybWluYWwgY29kZSBzdHJpbmdzIGluIGZyb21bXSB3aXRoIHRoZSBlcXVpdmFsZW50IGludGVybmFsCisgKiB2aW0gcmVwcmVzZW50YXRpb24uCVRoaXMgaXMgdXNlZCBmb3IgdGhlICJmcm9tIiBhbmQgInRvIiBwYXJ0IG9mIGEKKyAqIG1hcHBpbmcsIGFuZCB0aGUgInRvIiBwYXJ0IG9mIGEgbWVudSBjb21tYW5kLgorICogQW55IHN0cmluZ3MgbGlrZSAiPEMtVVA+IiBhcmUgYWxzbyByZXBsYWNlZCwgdW5sZXNzICdjcG9wdGlvbnMnIGNvbnRhaW5zCisgKiAnPCcuCisgKiBLX1NQRUNJQUwgYnkgaXRzZWxmIGlzIHJlcGxhY2VkIGJ5IEtfU1BFQ0lBTCBLU19TUEVDSUFMIEtFX0ZJTExFUi4KKyAqCisgKiBUaGUgcmVwbGFjZW1lbnQgaXMgZG9uZSBpbiByZXN1bHRbXSBhbmQgZmluYWxseSBjb3BpZWQgaW50byBhbGxvY2F0ZWQKKyAqIG1lbW9yeS4gSWYgdGhpcyBhbGwgd29ya3Mgd2VsbCAqYnVmcCBpcyBzZXQgdG8gdGhlIGFsbG9jYXRlZCBtZW1vcnkgYW5kIGEKKyAqIHBvaW50ZXIgdG8gaXQgaXMgcmV0dXJuZWQuIElmIHNvbWV0aGluZyBmYWlscyAqYnVmcCBpcyBzZXQgdG8gTlVMTCBhbmQgZnJvbQorICogaXMgcmV0dXJuZWQuCisgKgorICogQ1RSTC1WIGNoYXJhY3RlcnMgYXJlIHJlbW92ZWQuICBXaGVuICJmcm9tX3BhcnQiIGlzIFRSVUUsIGEgdHJhaWxpbmcgQ1RSTC1WCisgKiBpcyBpbmNsdWRlZCwgb3RoZXJ3aXNlIGl0IGlzIHJlbW92ZWQgKGZvciAiOm1hcCB4eCBeViIsIG1hcHMgeHggdG8KKyAqIG5vdGhpbmcpLiAgV2hlbiAnY3BvcHRpb25zJyBkb2VzIG5vdCBjb250YWluICdCJywgYSBiYWNrc2xhc2ggY2FuIGJlIHVzZWQKKyAqIGluc3RlYWQgb2YgYSBDVFJMLVYuCisgKi8KKyAgICBjaGFyX3UgICoKK3JlcGxhY2VfdGVybWNvZGVzKGZyb20sIGJ1ZnAsIGZyb21fcGFydCwgZG9fbHQpCisgICAgY2hhcl91CSpmcm9tOworICAgIGNoYXJfdQkqKmJ1ZnA7CisgICAgaW50CQlmcm9tX3BhcnQ7CisgICAgaW50CQlkb19sdDsJCS8qIGFsc28gdHJhbnNsYXRlIDxsdD4gKi8KK3sKKyAgICBpbnQJCWk7CisgICAgaW50CQlzbGVuOworICAgIGludAkJa2V5OworICAgIGludAkJZGxlbiA9IDA7CisgICAgY2hhcl91CSpzcmM7CisgICAgaW50CQlkb19iYWNrc2xhc2g7CS8qIGJhY2tzbGFzaCBpcyBhIHNwZWNpYWwgY2hhcmFjdGVyICovCisgICAgaW50CQlkb19zcGVjaWFsOwkvKiByZWNvZ25pemUgPD4ga2V5IGNvZGVzICovCisgICAgaW50CQlkb19rZXlfY29kZTsJLyogcmVjb2duaXplIHJhdyBrZXkgY29kZXMgKi8KKyAgICBjaGFyX3UJKnJlc3VsdDsJLyogYnVmZmVyIGZvciByZXN1bHRpbmcgc3RyaW5nICovCisKKyAgICBkb19iYWNrc2xhc2ggPSAodmltX3N0cmNocihwX2NwbywgQ1BPX0JTTEFTSCkgPT0gTlVMTCk7CisgICAgZG9fc3BlY2lhbCA9ICh2aW1fc3RyY2hyKHBfY3BvLCBDUE9fU1BFQ0kpID09IE5VTEwpOworICAgIGRvX2tleV9jb2RlID0gKHZpbV9zdHJjaHIocF9jcG8sIENQT19LRVlDT0RFKSA9PSBOVUxMKTsKKworICAgIC8qCisgICAgICogQWxsb2NhdGUgc3BhY2UgZm9yIHRoZSB0cmFuc2xhdGlvbi4gIFdvcnN0IGNhc2UgYSBzaW5nbGUgY2hhcmFjdGVyIGlzCisgICAgICogcmVwbGFjZWQgYnkgNiBieXRlcyAoc2hpZnRlZCBzcGVjaWFsIGtleSksIHBsdXMgYSBOVUwgYXQgdGhlIGVuZC4KKyAgICAgKi8KKyAgICByZXN1bHQgPSBhbGxvYygodW5zaWduZWQpU1RSTEVOKGZyb20pICogNiArIDEpOworICAgIGlmIChyZXN1bHQgPT0gTlVMTCkJCS8qIG91dCBvZiBtZW1vcnkgKi8KKyAgICB7CisJKmJ1ZnAgPSBOVUxMOworCXJldHVybiBmcm9tOworICAgIH0KKworICAgIHNyYyA9IGZyb207CisKKyAgICAvKgorICAgICAqIENoZWNrIGZvciAjbiBhdCBzdGFydCBvbmx5OiBmdW5jdGlvbiBrZXkgbgorICAgICAqLworICAgIGlmIChmcm9tX3BhcnQgJiYgc3JjWzBdID09ICcjJyAmJiBWSU1fSVNESUdJVChzcmNbMV0pKSAgLyogZnVuY3Rpb24ga2V5ICovCisgICAgeworCXJlc3VsdFtkbGVuKytdID0gS19TUEVDSUFMOworCXJlc3VsdFtkbGVuKytdID0gJ2snOworCWlmIChzcmNbMV0gPT0gJzAnKQorCSAgICByZXN1bHRbZGxlbisrXSA9ICc7JzsJLyogIzAgaXMgRjEwIGlzICJrOyIgKi8KKwllbHNlCisJICAgIHJlc3VsdFtkbGVuKytdID0gc3JjWzFdOwkvKiAjMyBpcyBGMyBpcyAiazMiICovCisJc3JjICs9IDI7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBDb3B5IGVhY2ggYnl0ZSBmcm9tICpmcm9tIHRvIHJlc3VsdFtkbGVuXQorICAgICAqLworICAgIHdoaWxlICgqc3JjICE9IE5VTCkKKyAgICB7CisJLyoKKwkgKiBJZiAnY3BvcHRpb25zJyBkb2VzIG5vdCBjb250YWluICc8JywgY2hlY2sgZm9yIHNwZWNpYWwga2V5IGNvZGVzLAorCSAqIGxpa2UgIjxDLVMtTW91c2VMZWZ0PiIKKwkgKi8KKwlpZiAoZG9fc3BlY2lhbCAmJiAoZG9fbHQgfHwgU1RSTkNNUChzcmMsICI8bHQ+IiwgNCkgIT0gMCkpCisJeworI2lmZGVmIEZFQVRfRVZBTAorCSAgICAvKgorCSAgICAgKiBSZXBsYWNlIDxTSUQ+IGJ5IEtfU05SIDxzY3JpcHQtbnI+IF8uCisJICAgICAqIChyb29tOiA1ICogNiA9IDMwIGJ5dGVzOyBuZWVkZWQ6IDMgKyA8bnI+ICsgMSA8PSAxNCkKKwkgICAgICovCisJICAgIGlmIChTVFJOSUNNUChzcmMsICI8U0lEPiIsIDUpID09IDApCisJICAgIHsKKwkJaWYgKGN1cnJlbnRfU0lEIDw9IDApCisJCSAgICBFTVNHKF8oZV91c2luZ3NpZCkpOworCQllbHNlCisJCXsKKwkJICAgIHNyYyArPSA1OworCQkgICAgcmVzdWx0W2RsZW4rK10gPSBLX1NQRUNJQUw7CisJCSAgICByZXN1bHRbZGxlbisrXSA9IChpbnQpS1NfRVhUUkE7CisJCSAgICByZXN1bHRbZGxlbisrXSA9IChpbnQpS0VfU05SOworCQkgICAgc3ByaW50ZigoY2hhciAqKXJlc3VsdCArIGRsZW4sICIlbGQiLCAobG9uZyljdXJyZW50X1NJRCk7CisJCSAgICBkbGVuICs9IChpbnQpU1RSTEVOKHJlc3VsdCArIGRsZW4pOworCQkgICAgcmVzdWx0W2RsZW4rK10gPSAnXyc7CisJCSAgICBjb250aW51ZTsKKwkJfQorCSAgICB9CisjZW5kaWYKKworCSAgICBzbGVuID0gdHJhbnNfc3BlY2lhbCgmc3JjLCByZXN1bHQgKyBkbGVuLCBUUlVFKTsKKwkgICAgaWYgKHNsZW4pCisJICAgIHsKKwkJZGxlbiArPSBzbGVuOworCQljb250aW51ZTsKKwkgICAgfQorCX0KKworCS8qCisJICogSWYgJ2Nwb3B0aW9ucycgZG9lcyBub3QgY29udGFpbiAnaycsIHNlZSBpZiBpdCdzIGFuIGFjdHVhbCBrZXktY29kZS4KKwkgKiBOb3RlIHRoYXQgdGhpcyBpcyBhbHNvIGNoZWNrZWQgYWZ0ZXIgcmVwbGFjaW5nIHRoZSA8PiBmb3JtLgorCSAqIFNpbmdsZSBjaGFyYWN0ZXIgY29kZXMgYXJlIE5PVCByZXBsYWNlZCAoZS5nLiBeSCBvciBERUwpLCBiZWNhdXNlCisJICogaXQgY291bGQgYmUgYSBjaGFyYWN0ZXIgaW4gdGhlIGZpbGUuCisJICovCisJaWYgKGRvX2tleV9jb2RlKQorCXsKKwkgICAgaSA9IGZpbmRfdGVybV9ieWtleXMoc3JjKTsKKwkgICAgaWYgKGkgPj0gMCkKKwkgICAgeworCQlyZXN1bHRbZGxlbisrXSA9IEtfU1BFQ0lBTDsKKwkJcmVzdWx0W2RsZW4rK10gPSB0ZXJtY29kZXNbaV0ubmFtZVswXTsKKwkJcmVzdWx0W2RsZW4rK10gPSB0ZXJtY29kZXNbaV0ubmFtZVsxXTsKKwkJc3JjICs9IHRlcm1jb2Rlc1tpXS5sZW47CisJCS8qIElmIHRlcm1pbmFsIGNvZGUgbWF0Y2hlZCwgY29udGludWUgYWZ0ZXIgaXQuICovCisJCWNvbnRpbnVlOworCSAgICB9CisJfQorCisjaWZkZWYgRkVBVF9FVkFMCisJaWYgKGRvX3NwZWNpYWwpCisJeworCSAgICBjaGFyX3UJKnAsICpzLCBsZW47CisKKwkgICAgLyoKKwkgICAgICogUmVwbGFjZSA8TGVhZGVyPiBieSB0aGUgdmFsdWUgb2YgIm1hcGxlYWRlciIuCisJICAgICAqIFJlcGxhY2UgPExvY2FsTGVhZGVyPiBieSB0aGUgdmFsdWUgb2YgIm1hcGxvY2FsbGVhZGVyIi4KKwkgICAgICogSWYgIm1hcGxlYWRlciIgb3IgIm1hcGxvY2FsbGVhZGVyIiBpc24ndCBzZXQgdXNlIGEgYmFja3NsYXNoLgorCSAgICAgKi8KKwkgICAgaWYgKFNUUk5JQ01QKHNyYywgIjxMZWFkZXI+IiwgOCkgPT0gMCkKKwkgICAgeworCQlsZW4gPSA4OworCQlwID0gZ2V0X3Zhcl92YWx1ZSgoY2hhcl91ICopImc6bWFwbGVhZGVyIik7CisJICAgIH0KKwkgICAgZWxzZSBpZiAoU1RSTklDTVAoc3JjLCAiPExvY2FsTGVhZGVyPiIsIDEzKSA9PSAwKQorCSAgICB7CisJCWxlbiA9IDEzOworCQlwID0gZ2V0X3Zhcl92YWx1ZSgoY2hhcl91ICopImc6bWFwbG9jYWxsZWFkZXIiKTsKKwkgICAgfQorCSAgICBlbHNlCisJICAgIHsKKwkJbGVuID0gMDsKKwkJcCA9IE5VTEw7CisJICAgIH0KKwkgICAgaWYgKGxlbiAhPSAwKQorCSAgICB7CisJCS8qIEFsbG93IHVwIHRvIDggKiA2IGNoYXJhY3RlcnMgZm9yICJtYXBsZWFkZXIiLiAqLworCQlpZiAocCA9PSBOVUxMIHx8ICpwID09IE5VTCB8fCBTVFJMRU4ocCkgPiA4ICogNikKKwkJICAgIHMgPSAoY2hhcl91ICopIlxcIjsKKwkJZWxzZQorCQkgICAgcyA9IHA7CisJCXdoaWxlICgqcyAhPSBOVUwpCisJCSAgICByZXN1bHRbZGxlbisrXSA9ICpzKys7CisJCXNyYyArPSBsZW47CisJCWNvbnRpbnVlOworCSAgICB9CisJfQorI2VuZGlmCisKKwkvKgorCSAqIFJlbW92ZSBDVFJMLVYgYW5kIGlnbm9yZSB0aGUgbmV4dCBjaGFyYWN0ZXIuCisJICogRm9yICJmcm9tIiBzaWRlIHRoZSBDVFJMLVYgYXQgdGhlIGVuZCBpcyBpbmNsdWRlZCwgZm9yIHRoZSAidG8iCisJICogcGFydCBpdCBpcyByZW1vdmVkLgorCSAqIElmICdjcG9wdGlvbnMnIGRvZXMgbm90IGNvbnRhaW4gJ0InLCBhbHNvIGFjY2VwdCBhIGJhY2tzbGFzaC4KKwkgKi8KKwlrZXkgPSAqc3JjOworCWlmIChrZXkgPT0gQ3RybF9WIHx8IChkb19iYWNrc2xhc2ggJiYga2V5ID09ICdcXCcpKQorCXsKKwkgICAgKytzcmM7CQkJCS8qIHNraXAgQ1RSTC1WIG9yIGJhY2tzbGFzaCAqLworCSAgICBpZiAoKnNyYyA9PSBOVUwpCisJICAgIHsKKwkJaWYgKGZyb21fcGFydCkKKwkJICAgIHJlc3VsdFtkbGVuKytdID0ga2V5OworCQlicmVhazsKKwkgICAgfQorCX0KKworI2lmZGVmIEZFQVRfTUJZVEUKKwkvKiBza2lwIG11bHRpYnl0ZSBjaGFyIGNvcnJlY3RseSAqLworCWZvciAoaSA9ICgqbWJfcHRyMmxlbl9jaGVjaykoc3JjKTsgaSA+IDA7IC0taSkKKyNlbmRpZgorCXsKKwkgICAgLyoKKwkgICAgICogSWYgdGhlIGNoYXJhY3RlciBpcyBLX1NQRUNJQUwsIHJlcGxhY2UgaXQgd2l0aCBLX1NQRUNJQUwKKwkgICAgICogS1NfU1BFQ0lBTCBLRV9GSUxMRVIuCisJICAgICAqIElmIGNvbXBpbGVkIHdpdGggdGhlIEdVSSByZXBsYWNlIENTSSB3aXRoIEtfQ1NJLgorCSAgICAgKi8KKwkgICAgaWYgKCpzcmMgPT0gS19TUEVDSUFMKQorCSAgICB7CisJCXJlc3VsdFtkbGVuKytdID0gS19TUEVDSUFMOworCQlyZXN1bHRbZGxlbisrXSA9IEtTX1NQRUNJQUw7CisJCXJlc3VsdFtkbGVuKytdID0gS0VfRklMTEVSOworCSAgICB9CisjIGlmZGVmIEZFQVRfR1VJCisJICAgIGVsc2UgaWYgKCpzcmMgPT0gQ1NJKQorCSAgICB7CisJCXJlc3VsdFtkbGVuKytdID0gS19TUEVDSUFMOworCQlyZXN1bHRbZGxlbisrXSA9IEtTX0VYVFJBOworCQlyZXN1bHRbZGxlbisrXSA9IChpbnQpS0VfQ1NJOworCSAgICB9CisjIGVuZGlmCisJICAgIGVsc2UKKwkJcmVzdWx0W2RsZW4rK10gPSAqc3JjOworCSAgICArK3NyYzsKKwl9CisgICAgfQorICAgIHJlc3VsdFtkbGVuXSA9IE5VTDsKKworICAgIC8qCisgICAgICogQ29weSB0aGUgbmV3IHN0cmluZyB0byBhbGxvY2F0ZWQgbWVtb3J5LgorICAgICAqIElmIHRoaXMgZmFpbHMsIGp1c3QgcmV0dXJuIGZyb20uCisgICAgICovCisgICAgaWYgKCgqYnVmcCA9IHZpbV9zdHJzYXZlKHJlc3VsdCkpICE9IE5VTEwpCisJZnJvbSA9ICpidWZwOworICAgIHZpbV9mcmVlKHJlc3VsdCk7CisgICAgcmV0dXJuIGZyb207Cit9CisKKy8qCisgKiBGaW5kIGEgdGVybWNvZGUgd2l0aCBrZXlzICdzcmMnIChtdXN0IGJlIE5VTCB0ZXJtaW5hdGVkKS4KKyAqIFJldHVybiB0aGUgaW5kZXggaW4gdGVybWNvZGVzW10sIG9yIC0xIGlmIG5vdCBmb3VuZC4KKyAqLworICAgIGludAorZmluZF90ZXJtX2J5a2V5cyhzcmMpCisgICAgY2hhcl91CSpzcmM7Cit7CisgICAgaW50CQlpOworICAgIGludAkJc2xlbjsKKworICAgIGZvciAoaSA9IDA7IGkgPCB0Y19sZW47ICsraSkKKyAgICB7CisJc2xlbiA9IHRlcm1jb2Rlc1tpXS5sZW47CisJaWYgKHNsZW4gPiAxICYmIFNUUk5DTVAodGVybWNvZGVzW2ldLmNvZGUsIHNyYywgKHNpemVfdClzbGVuKSA9PSAwKQorCSAgICByZXR1cm4gaTsKKyAgICB9CisgICAgcmV0dXJuIC0xOworfQorCisvKgorICogR2F0aGVyIHRoZSBmaXJzdCBjaGFyYWN0ZXJzIGluIHRoZSB0ZXJtaW5hbCBrZXkgY29kZXMgaW50byBhIHN0cmluZy4KKyAqIFVzZWQgdG8gc3BlZWQgdXAgY2hlY2tfdGVybWNvZGUoKS4KKyAqLworICAgIHN0YXRpYyB2b2lkCitnYXRoZXJfdGVybWxlYWRlcigpCit7CisgICAgaW50CSAgICBpOworICAgIGludAkgICAgbGVuID0gMDsKKworI2lmZGVmIEZFQVRfR1VJCisgICAgaWYgKGd1aS5pbl91c2UpCisJdGVybWxlYWRlcltsZW4rK10gPSBDU0k7ICAgIC8qIHRoZSBHVUkgY29kZXMgYXJlIG5vdCBpbiB0ZXJtY29kZXNbXSAqLworI2VuZGlmCisjaWZkZWYgRkVBVF9URVJNUkVTUE9OU0UKKyAgICBpZiAoY2hlY2tfZm9yX2NvZGVzKQorCXRlcm1sZWFkZXJbbGVuKytdID0gRENTOyAgICAvKiB0aGUgdGVybWNvZGUgcmVzcG9uc2Ugc3RhcnRzIHdpdGggRENTCisJCQkJICAgICAgIGluIDgtYml0IG1vZGUgKi8KKyNlbmRpZgorICAgIHRlcm1sZWFkZXJbbGVuXSA9IE5VTDsKKworICAgIGZvciAoaSA9IDA7IGkgPCB0Y19sZW47ICsraSkKKwlpZiAodmltX3N0cmNocih0ZXJtbGVhZGVyLCB0ZXJtY29kZXNbaV0uY29kZVswXSkgPT0gTlVMTCkKKwl7CisJICAgIHRlcm1sZWFkZXJbbGVuKytdID0gdGVybWNvZGVzW2ldLmNvZGVbMF07CisJICAgIHRlcm1sZWFkZXJbbGVuXSA9IE5VTDsKKwl9CisKKyAgICBuZWVkX2dhdGhlciA9IEZBTFNFOworfQorCisvKgorICogU2hvdyBhbGwgdGVybWNvZGVzIChmb3IgIjpzZXQgdGVybWNhcCIpCisgKiBUaGlzIGNvZGUgbG9va3MgYSBsb3QgbGlrZSBzaG93b3B0aW9ucygpLCBidXQgaXMgZGlmZmVyZW50LgorICovCisgICAgdm9pZAorc2hvd190ZXJtY29kZXMoKQoreworICAgIGludAkJY29sOworICAgIGludAkJKml0ZW1zOworICAgIGludAkJaXRlbV9jb3VudDsKKyAgICBpbnQJCXJ1bjsKKyAgICBpbnQJCXJvdywgcm93czsKKyAgICBpbnQJCWNvbHM7CisgICAgaW50CQlpOworICAgIGludAkJbGVuOworCisjZGVmaW5lIElOQyAyNwkgICAgLyogdHJ5IHRvIG1ha2UgdGhyZWUgY29sdW1ucyAqLworI2RlZmluZSBHQVAgMgkgICAgLyogc3BhY2VzIGJldHdlZW4gY29sdW1ucyAqLworCisgICAgaWYgKHRjX2xlbiA9PSAwKQkgICAgLyogbm8gdGVybWluYWwgY29kZXMgKG11c3QgYmUgR1VJKSAqLworCXJldHVybjsKKyAgICBpdGVtcyA9IChpbnQgKilhbGxvYygodW5zaWduZWQpKHNpemVvZihpbnQpICogdGNfbGVuKSk7CisgICAgaWYgKGl0ZW1zID09IE5VTEwpCisJcmV0dXJuOworCisgICAgLyogSGlnaGxpZ2h0IHRpdGxlICovCisgICAgTVNHX1BVVFNfVElUTEUoXygiXG4tLS0gVGVybWluYWwga2V5cyAtLS0iKSk7CisKKyAgICAvKgorICAgICAqIGRvIHRoZSBsb29wIHR3byB0aW1lczoKKyAgICAgKiAxLiBkaXNwbGF5IHRoZSBzaG9ydCBpdGVtcyAobm9uLXN0cmluZ3MgYW5kIHNob3J0IHN0cmluZ3MpCisgICAgICogMi4gZGlzcGxheSB0aGUgbG9uZyBpdGVtcyAoc3RyaW5ncykKKyAgICAgKi8KKyAgICBmb3IgKHJ1biA9IDE7IHJ1biA8PSAyICYmICFnb3RfaW50OyArK3J1bikKKyAgICB7CisJLyoKKwkgKiBjb2xsZWN0IHRoZSBpdGVtcyBpbiBpdGVtc1tdCisJICovCisJaXRlbV9jb3VudCA9IDA7CisJZm9yIChpID0gMDsgaSA8IHRjX2xlbjsgaSsrKQorCXsKKwkgICAgbGVuID0gc2hvd19vbmVfdGVybWNvZGUodGVybWNvZGVzW2ldLm5hbWUsCisJCQkJCQkgICAgdGVybWNvZGVzW2ldLmNvZGUsIEZBTFNFKTsKKwkgICAgaWYgKChsZW4gPD0gSU5DIC0gR0FQICYmIHJ1biA9PSAxKSB8fCAobGVuID4gSU5DIC0gR0FQICYmIHJ1biA9PSAyKSkKKwkJaXRlbXNbaXRlbV9jb3VudCsrXSA9IGk7CisJfQorCisJLyoKKwkgKiBkaXNwbGF5IHRoZSBpdGVtcworCSAqLworCWlmIChydW4gPT0gMSkKKwl7CisJICAgIGNvbHMgPSAoQ29sdW1ucyArIEdBUCkgLyBJTkM7CisJICAgIGlmIChjb2xzID09IDApCisJCWNvbHMgPSAxOworCSAgICByb3dzID0gKGl0ZW1fY291bnQgKyBjb2xzIC0gMSkgLyBjb2xzOworCX0KKwllbHNlCS8qIHJ1biA9PSAyICovCisJICAgIHJvd3MgPSBpdGVtX2NvdW50OworCWZvciAocm93ID0gMDsgcm93IDwgcm93cyAmJiAhZ290X2ludDsgKytyb3cpCisJeworCSAgICBtc2dfcHV0Y2hhcignXG4nKTsJCQkvKiBnbyB0byBuZXh0IGxpbmUgKi8KKwkgICAgaWYgKGdvdF9pbnQpCQkJLyogJ3EnIHR5cGVkIGluIG1vcmUgKi8KKwkJYnJlYWs7CisJICAgIGNvbCA9IDA7CisJICAgIGZvciAoaSA9IHJvdzsgaSA8IGl0ZW1fY291bnQ7IGkgKz0gcm93cykKKwkgICAgeworCQltc2dfY29sID0gY29sOwkJCS8qIG1ha2UgY29sdW1ucyAqLworCQlzaG93X29uZV90ZXJtY29kZSh0ZXJtY29kZXNbaXRlbXNbaV1dLm5hbWUsCisJCQkJCSAgICAgIHRlcm1jb2Rlc1tpdGVtc1tpXV0uY29kZSwgVFJVRSk7CisJCWNvbCArPSBJTkM7CisJICAgIH0KKwkgICAgb3V0X2ZsdXNoKCk7CisJICAgIHVpX2JyZWFrY2hlY2soKTsKKwl9CisgICAgfQorICAgIHZpbV9mcmVlKGl0ZW1zKTsKK30KKworLyoKKyAqIFNob3cgb25lIHRlcm1jb2RlIGVudHJ5LgorICogT3V0cHV0IGdvZXMgaW50byBJT2J1ZmZbXQorICovCisgICAgaW50CitzaG93X29uZV90ZXJtY29kZShuYW1lLCBjb2RlLCBwcmludGl0KQorICAgIGNoYXJfdSAgKm5hbWU7CisgICAgY2hhcl91ICAqY29kZTsKKyAgICBpbnQJICAgIHByaW50aXQ7Cit7CisgICAgY2hhcl91CSpwOworICAgIGludAkJbGVuOworCisgICAgaWYgKG5hbWVbMF0gPiAnficpCisgICAgeworCUlPYnVmZlswXSA9ICcgJzsKKwlJT2J1ZmZbMV0gPSAnICc7CisJSU9idWZmWzJdID0gJyAnOworCUlPYnVmZlszXSA9ICcgJzsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKwlJT2J1ZmZbMF0gPSAndCc7CisJSU9idWZmWzFdID0gJ18nOworCUlPYnVmZlsyXSA9IG5hbWVbMF07CisJSU9idWZmWzNdID0gbmFtZVsxXTsKKyAgICB9CisgICAgSU9idWZmWzRdID0gJyAnOworCisgICAgcCA9IGdldF9zcGVjaWFsX2tleV9uYW1lKFRFUk1DQVAyS0VZKG5hbWVbMF0sIG5hbWVbMV0pLCAwKTsKKyAgICBpZiAocFsxXSAhPSAndCcpCisJU1RSQ1BZKElPYnVmZiArIDUsIHApOworICAgIGVsc2UKKwlJT2J1ZmZbNV0gPSBOVUw7CisgICAgbGVuID0gKGludClTVFJMRU4oSU9idWZmKTsKKyAgICBkbworCUlPYnVmZltsZW4rK10gPSAnICc7CisgICAgd2hpbGUgKGxlbiA8IDE3KTsKKyAgICBJT2J1ZmZbbGVuXSA9IE5VTDsKKyAgICBpZiAoY29kZSA9PSBOVUxMKQorCWxlbiArPSA0OworICAgIGVsc2UKKwlsZW4gKz0gdmltX3N0cnNpemUoY29kZSk7CisKKyAgICBpZiAocHJpbnRpdCkKKyAgICB7CisJbXNnX3B1dHMoSU9idWZmKTsKKwlpZiAoY29kZSA9PSBOVUxMKQorCSAgICBtc2dfcHV0cygoY2hhcl91ICopIk5VTEwiKTsKKwllbHNlCisJICAgIG1zZ19vdXR0cmFucyhjb2RlKTsKKyAgICB9CisgICAgcmV0dXJuIGxlbjsKK30KKworI2lmIGRlZmluZWQoRkVBVF9URVJNUkVTUE9OU0UpIHx8IGRlZmluZWQoUFJPVE8pCisvKgorICogRm9yIFh0ZXJtID49IDE0MCBjb21waWxlZCB3aXRoIE9QVF9UQ0FQX1FVRVJZOiBPYnRhaW4gdGhlIGFjdHVhbGx5IHVzZWQKKyAqIHRlcm1jYXAgY29kZXMgZnJvbSB0aGUgdGVybWluYWwgaXRzZWxmLgorICogV2UgZ2V0IHRoZW0gb25lIGJ5IG9uZSB0byBhdm9pZCBhIHZlcnkgbG9uZyByZXNwb25zZSBzdHJpbmcuCisgKi8KK3N0YXRpYyBpbnQgeHRfaW5kZXhfaW4gPSAwOworc3RhdGljIGludCB4dF9pbmRleF9vdXQgPSAwOworCisgICAgc3RhdGljIHZvaWQKK3JlcV9jb2Rlc19mcm9tX3Rlcm0oKQoreworICAgIHh0X2luZGV4X291dCA9IDA7CisgICAgeHRfaW5kZXhfaW4gPSAwOworICAgIHJlcV9tb3JlX2NvZGVzX2Zyb21fdGVybSgpOworfQorCisgICAgc3RhdGljIHZvaWQKK3JlcV9tb3JlX2NvZGVzX2Zyb21fdGVybSgpCit7CisgICAgY2hhcglidWZbMTFdOworICAgIGludAkJb2xkX2lkeCA9IHh0X2luZGV4X291dDsKKworICAgIC8qIERvbid0IGRvIGFueXRoaW5nIHdoZW4gZ29pbmcgdG8gZXhpdC4gKi8KKyAgICBpZiAoZXhpdGluZykKKwlyZXR1cm47CisKKyAgICAvKiBTZW5kIHVwIHRvIDEwIG1vcmUgcmVxdWVzdHMgb3V0IHRoYW4gd2UgcmVjZWl2ZWQuICBBdm9pZCBzZW5kaW5nIHRvbworICAgICAqIG1hbnksIHRoZXJlIGNhbiBiZSBhIGJ1ZmZlciBvdmVyZmxvdyBzb21ld2hlcmUuICovCisgICAgd2hpbGUgKHh0X2luZGV4X291dCA8IHh0X2luZGV4X2luICsgMTAgJiYga2V5X25hbWVzW3h0X2luZGV4X291dF0gIT0gTlVMTCkKKyAgICB7CisJc3ByaW50ZihidWYsICJcMDMzUCtxJTAyeCUwMnhcMDMzXFwiLAorCQkgICAgICBrZXlfbmFtZXNbeHRfaW5kZXhfb3V0XVswXSwga2V5X25hbWVzW3h0X2luZGV4X291dF1bMV0pOworCW91dF9zdHJfbmYoKGNoYXJfdSAqKWJ1Zik7CisJKyt4dF9pbmRleF9vdXQ7CisgICAgfQorCisgICAgLyogU2VuZCB0aGUgY29kZXMgb3V0IHJpZ2h0IGF3YXkuICovCisgICAgaWYgKHh0X2luZGV4X291dCAhPSBvbGRfaWR4KQorCW91dF9mbHVzaCgpOworfQorCisvKgorICogRGVjb2RlIGtleSBjb2RlIHJlc3BvbnNlIGZyb20geHRlcm06ICc8RXNjPlAxK3I8bmFtZT49PHN0cmluZz48RXNjPlwnLgorICogQSAiMCIgaW5zdGVhZCBvZiB0aGUgIjEiIGluZGljYXRlcyBhIGNvZGUgdGhhdCBpc24ndCBzdXBwb3J0ZWQuCisgKiBCb3RoIDxuYW1lPiBhbmQgPHN0cmluZz4gYXJlIGVuY29kZWQgaW4gaGV4LgorICogImNvZGUiIHBvaW50cyB0byB0aGUgIjAiIG9yICIxIi4KKyAqLworICAgIHN0YXRpYyB2b2lkCitnb3RfY29kZV9mcm9tX3Rlcm0oY29kZSwgbGVuKQorICAgIGNoYXJfdQkqY29kZTsKKyAgICBpbnQJCWxlbjsKK3sKKyNkZWZpbmUgWFRfTEVOIDEwMAorICAgIGNoYXJfdQluYW1lWzNdOworICAgIGNoYXJfdQlzdHJbWFRfTEVOXTsKKyAgICBpbnQJCWk7CisgICAgaW50CQlqID0gMDsKKyAgICBpbnQJCWM7CisKKyAgICAvKiBBICcxJyBtZWFucyB0aGUgY29kZSBpcyBzdXBwb3J0ZWQsIGEgJzAnIG1lYW5zIGl0IGlzbid0LgorICAgICAqIFdoZW4gaGFsZiB0aGUgbGVuZ3RoIGlzID4gWFRfTEVOIHdlIGNhbid0IHVzZSBpdC4KKyAgICAgKiBPdXIgbmFtZXMgYXJlIGN1cnJlbnRseSBhbGwgMiBjaGFyYWN0ZXJzLiAqLworICAgIGlmIChjb2RlWzBdID09ICcxJyAmJiBjb2RlWzddID09ICc9JyAmJiBsZW4gLyAyIDwgWFRfTEVOKQorICAgIHsKKwkvKiBHZXQgdGhlIG5hbWUgZnJvbSB0aGUgcmVzcG9uc2UgYW5kIGZpbmQgaXQgaW4gdGhlIHRhYmxlLiAqLworCW5hbWVbMF0gPSBoZXhoZXgybnIoY29kZSArIDMpOworCW5hbWVbMV0gPSBoZXhoZXgybnIoY29kZSArIDUpOworCW5hbWVbMl0gPSBOVUw7CisJZm9yIChpID0gMDsga2V5X25hbWVzW2ldICE9IE5VTEw7ICsraSkKKwl7CisJICAgIGlmIChTVFJDTVAoa2V5X25hbWVzW2ldLCBuYW1lKSA9PSAwKQorCSAgICB7CisJCXh0X2luZGV4X2luID0gaTsKKwkJYnJlYWs7CisJICAgIH0KKwl9CisJaWYgKGtleV9uYW1lc1tpXSAhPSBOVUxMKQorCXsKKwkgICAgZm9yIChpID0gODsgKGMgPSBoZXhoZXgybnIoY29kZSArIGkpKSA+PSAwOyBpICs9IDIpCisJCXN0cltqKytdID0gYzsKKwkgICAgc3RyW2pdID0gTlVMOworCSAgICBpZiAobmFtZVswXSA9PSAnQycgJiYgbmFtZVsxXSA9PSAnbycpCisJICAgIHsKKwkJLyogQ29sb3IgY291bnQgaXMgbm90IGEga2V5IGNvZGUuICovCisJCWkgPSBhdG9pKChjaGFyICopc3RyKTsKKwkJaWYgKGkgIT0gdF9jb2xvcnMpCisJCXsKKwkJICAgIC8qIE5yIG9mIGNvbG9ycyBjaGFuZ2VkLCBpbml0aWFsaXplIGhpZ2hsaWdodGluZyBhbmQKKwkJICAgICAqIHJlZHJhdyBldmVyeXRoaW5nLiAqLworCQkgICAgc2V0X2NvbG9yX2NvdW50KGkpOworCQkgICAgaW5pdF9oaWdobGlnaHQoVFJVRSwgRkFMU0UpOworCQkgICAgcmVkcmF3X2xhdGVyKENMRUFSKTsKKwkJfQorCSAgICB9CisJICAgIGVsc2UKKwkgICAgeworCQkvKiBGaXJzdCBkZWxldGUgYW55IGV4aXN0aW5nIGVudHJ5IHdpdGggdGhlIHNhbWUgY29kZS4gKi8KKwkJaSA9IGZpbmRfdGVybV9ieWtleXMoc3RyKTsKKwkJaWYgKGkgPj0gMCkKKwkJICAgIGRlbF90ZXJtY29kZV9pZHgoaSk7CisJCWFkZF90ZXJtY29kZShuYW1lLCBzdHIsIEZBTFNFKTsKKwkgICAgfQorCX0KKyAgICB9CisKKyAgICAvKiBNYXkgcmVxdWVzdCBtb3JlIGNvZGVzIG5vdyB0aGF0IHdlIHJlY2VpdmVkIG9uZS4gKi8KKyAgICArK3h0X2luZGV4X2luOworICAgIHJlcV9tb3JlX2NvZGVzX2Zyb21fdGVybSgpOworfQorCisvKgorICogQ2hlY2sgaWYgdGhlcmUgYXJlIGFueSB1bmFuc3dlcmVkIHJlcXVlc3RzIGFuZCBkZWFsIHdpdGggdGhlbS4KKyAqIFRoaXMgaXMgY2FsbGVkIGJlZm9yZSBzdGFydGluZyBhbiBleHRlcm5hbCBwcm9ncmFtIG9yIGdldHRpbmcgZGlyZWN0CisgKiBrZXlib2FyZCBpbnB1dC4gIFdlIGRvbid0IHdhbnQgcmVzcG9uc2VzIHRvIGJlIHNlbmQgdG8gdGhhdCBwcm9ncmFtIG9yCisgKiBoYW5kbGVkIGFzIHR5cGVkIHRleHQuCisgKi8KKyAgICBzdGF0aWMgdm9pZAorY2hlY2tfZm9yX2NvZGVzX2Zyb21fdGVybSgpCit7CisgICAgaW50CQljOworCisgICAgLyogSWYgbm8gY29kZXMgcmVxdWVzdGVkIG9yIGFsbCBhcmUgYW5zd2VyZWQsIG5vIG5lZWQgdG8gd2FpdC4gKi8KKyAgICBpZiAoeHRfaW5kZXhfb3V0ID09IDAgfHwgeHRfaW5kZXhfb3V0ID09IHh0X2luZGV4X2luKQorCXJldHVybjsKKworICAgIC8qIFZnZXRjKCkgd2lsbCBjaGVjayBmb3IgYW5kIGhhbmRsZSBhbnkgcmVzcG9uc2UuCisgICAgICogS2VlcCBjYWxsaW5nIHZwZWVrYygpIHVudGlsIHdlIGRvbid0IGdldCBhbnkgcmVzcG9uc2VzLiAqLworICAgICsrbm9fbWFwcGluZzsKKyAgICArK2FsbG93X2tleXM7CisgICAgZm9yICg7OykKKyAgICB7CisJYyA9IHZwZWVrYygpOworCWlmIChjID09IE5VTCkJICAgIC8qIG5vdGhpbmcgYXZhaWxhYmxlICovCisJICAgIGJyZWFrOworCisJLyogSWYgYSByZXNwb25zZSBpcyByZWNvZ25pemVkIGl0J3MgcmVwbGFjZWQgd2l0aCBLX0lHTk9SRSwgbXVzdCByZWFkCisJICogaXQgZnJvbSB0aGUgaW5wdXQgc3RyZWFtLiAgSWYgdGhlcmUgaXMgbm8gS19JR05PUkUgd2UgY2FuJ3QgZG8KKwkgKiBhbnl0aGluZywgYnJlYWsgaGVyZSAodGhlcmUgbWlnaHQgYmUgc29tZSByZXNwb25zZXMgZnVydGhlciBvbiwgYnV0CisJICogd2UgZG9uJ3Qgd2FudCB0byB0aHJvdyBhd2F5IGFueSB0eXBlZCBjaGFycykuICovCisJaWYgKGMgIT0gS19TUEVDSUFMICYmIGMgIT0gS19JR05PUkUpCisJICAgIGJyZWFrOworCWMgPSB2Z2V0YygpOworCWlmIChjICE9IEtfSUdOT1JFKQorCXsKKwkgICAgdnVuZ2V0YyhjKTsKKwkgICAgYnJlYWs7CisJfQorICAgIH0KKyAgICAtLW5vX21hcHBpbmc7CisgICAgLS1hbGxvd19rZXlzOworfQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKEZFQVRfQ01ETF9DT01QTCkgfHwgZGVmaW5lZChQUk9UTykKKy8qCisgKiBUcmFuc2xhdGUgYW4gaW50ZXJuYWwgbWFwcGluZy9hYmJyZXZpYXRpb24gcmVwcmVzZW50YXRpb24gaW50byB0aGUKKyAqIGNvcnJlc3BvbmRpbmcgZXh0ZXJuYWwgb25lIHJlY29nbml6ZWQgYnkgOm1hcC86YWJicmV2IGNvbW1hbmRzOworICogcmVzcGVjdHMgdGhlIGN1cnJlbnQgQi9rLzwgc2V0dGluZ3Mgb2YgJ2Nwb3B0aW9uJy4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIGV4cGFuZGluZyBtYXBwaW5ncy9hYmJyZXZpYXRpb25zIG9uIHRoZQorICogY29tbWFuZC1saW5lLCBhbmQgZm9yIGJ1aWxkaW5nIHRoZSAiQW1iaWd1b3VzIG1hcHBpbmcuLi4iIGVycm9yIG1lc3PmZ2UuCisgKgorICogSXQgdXNlcyBhIGdyb3dhcnJheSB0byBidWlsZCB0aGUgdHJhbnNsYXRpb24gc3RyaW5nIHNpbmNlIHRoZQorICogbGF0dGVyIGNhbiBiZSB3aWRlciB0aGFuIHRoZSBvcmlnaW5hbCBkZXNjcmlwdGlvbi4gVGhlIGNhbGxlciBoYXMgdG8KKyAqIGZyZWUgdGhlIHN0cmluZyBhZnRlcndhcmRzLgorICoKKyAqIFJldHVybnMgTlVMTCB3aGVuIHRoZXJlIGlzIGEgcHJvYmxlbS4KKyAqLworICAgIGNoYXJfdSAqCit0cmFuc2xhdGVfbWFwcGluZyhzdHIsIGV4cG1hcCkKKyAgICBjaGFyX3UJKnN0cjsKKyAgICBpbnQJCWV4cG1hcDsgIC8qIFRSVUUgd2hlbiBleHBhbmRpbmcgbWFwcGluZ3Mgb24gY29tbWFuZC1saW5lICovCit7CisgICAgZ2FycmF5X1QJZ2E7CisgICAgaW50CQljOworICAgIGludAkJbW9kaWZpZXJzOworICAgIGludAkJY3BvX2JzbGFzaDsKKyAgICBpbnQJCWNwb19zcGVjaWFsOworICAgIGludAkJY3BvX2tleWNvZGU7CisKKyAgICBnYV9pbml0KCZnYSk7CisgICAgZ2EuZ2FfaXRlbXNpemUgPSAxOworICAgIGdhLmdhX2dyb3dzaXplID0gNDA7CisKKyAgICBjcG9fYnNsYXNoID0gKHZpbV9zdHJjaHIocF9jcG8sIENQT19CU0xBU0gpICE9IE5VTEwpOworICAgIGNwb19zcGVjaWFsID0gKHZpbV9zdHJjaHIocF9jcG8sIENQT19TUEVDSSkgIT0gTlVMTCk7CisgICAgY3BvX2tleWNvZGUgPSAodmltX3N0cmNocihwX2NwbywgQ1BPX0tFWUNPREUpID09IE5VTEwpOworCisgICAgZm9yICg7ICpzdHI7ICsrc3RyKQorICAgIHsKKwljID0gKnN0cjsKKwlpZiAoYyA9PSBLX1NQRUNJQUwgJiYgc3RyWzFdICE9IE5VTCAmJiBzdHJbMl0gIT0gTlVMKQorCXsKKwkgICAgbW9kaWZpZXJzID0gMDsKKwkgICAgaWYgKHN0clsxXSA9PSBLU19NT0RJRklFUikKKwkgICAgeworCQlzdHIrKzsKKwkJbW9kaWZpZXJzID0gKisrc3RyOworCQljID0gKisrc3RyOworCSAgICB9CisJICAgIGlmIChjcG9fc3BlY2lhbCAmJiBjcG9fa2V5Y29kZSAmJiBjID09IEtfU1BFQ0lBTCAmJiAhbW9kaWZpZXJzKQorCSAgICB7CisJCWludAlpOworCisJCS8qIHRyeSB0byBmaW5kIHNwZWNpYWwga2V5IGluIHRlcm1jb2RlcyAqLworCQlmb3IgKGkgPSAwOyBpIDwgdGNfbGVuOyArK2kpCisJCSAgICBpZiAodGVybWNvZGVzW2ldLm5hbWVbMF0gPT0gc3RyWzFdCisJCQkJCSAgICAmJiB0ZXJtY29kZXNbaV0ubmFtZVsxXSA9PSBzdHJbMl0pCisJCQlicmVhazsKKwkJaWYgKGkgPCB0Y19sZW4pCisJCXsKKwkJICAgIGdhX2NvbmNhdCgmZ2EsIHRlcm1jb2Rlc1tpXS5jb2RlKTsKKwkJICAgIHN0ciArPSAyOworCQkgICAgY29udGludWU7IC8qIGZvciAoc3RyKSAqLworCQl9CisJICAgIH0KKwkgICAgaWYgKGMgPT0gS19TUEVDSUFMICYmIHN0clsxXSAhPSBOVUwgJiYgc3RyWzJdICE9IE5VTCkKKwkgICAgeworCQlpZiAoZXhwbWFwICYmIGNwb19zcGVjaWFsKQorCQl7CisJCSAgICBnYV9jbGVhcigmZ2EpOworCQkgICAgcmV0dXJuIE5VTEw7CisJCX0KKwkJYyA9IFRPX1NQRUNJQUwoc3RyWzFdLCBzdHJbMl0pOworCQlpZiAoYyA9PSBLX1pFUk8pCS8qIGRpc3BsYXkgPE51bD4gYXMgXkAgKi8KKwkJICAgIGMgPSBOVUw7CisJCXN0ciArPSAyOworCSAgICB9CisJICAgIGlmIChJU19TUEVDSUFMKGMpIHx8IG1vZGlmaWVycykJLyogc3BlY2lhbCBrZXkgKi8KKwkgICAgeworCQlpZiAoZXhwbWFwICYmIGNwb19zcGVjaWFsKQorCQl7CisJCSAgICBnYV9jbGVhcigmZ2EpOworCQkgICAgcmV0dXJuIE5VTEw7CisJCX0KKwkJZ2FfY29uY2F0KCZnYSwgZ2V0X3NwZWNpYWxfa2V5X25hbWUoYywgbW9kaWZpZXJzKSk7CisJCWNvbnRpbnVlOyAvKiBmb3IgKHN0cikgKi8KKwkgICAgfQorCX0KKwlpZiAoYyA9PSAnICcgfHwgYyA9PSAnXHQnIHx8IGMgPT0gQ3RybF9KIHx8IGMgPT0gQ3RybF9WCisJICAgIHx8IChjID09ICc8JyAmJiAhY3BvX3NwZWNpYWwpIHx8IChjID09ICdcXCcgJiYgIWNwb19ic2xhc2gpKQorCSAgICBnYV9hcHBlbmQoJmdhLCBjcG9fYnNsYXNoID8gQ3RybF9WIDogJ1xcJyk7CisJaWYgKGMpCisJICAgIGdhX2FwcGVuZCgmZ2EsIGMpOworICAgIH0KKyAgICBnYV9hcHBlbmQoJmdhLCBOVUwpOworICAgIHJldHVybiAoY2hhcl91ICopKGdhLmdhX2RhdGEpOworfQorI2VuZGlmCisKKyNpZiAoZGVmaW5lZChXSU4zMjY0KSAmJiAhZGVmaW5lZChGRUFUX0dVSSkpIHx8IGRlZmluZWQoUFJPVE8pCitzdGF0aWMgY2hhciBrc21lX3N0clsyMF07CitzdGF0aWMgY2hhciBrc21yX3N0clsyMF07CitzdGF0aWMgY2hhciBrc21kX3N0clsyMF07CisKKy8qCisgKiBGb3IgV2luMzIgY29uc29sZTogdXBkYXRlIHRlcm1jYXAgY29kZXMgZm9yIGV4aXN0aW5nIGNvbnNvbGUgYXR0cmlidXRlcy4KKyAqLworICAgIHZvaWQKK3VwZGF0ZV90Y2FwKGF0dHIpCisgICAgaW50IGF0dHI7Cit7CisgICAgc3RydWN0IGJ1aWx0aW5fdGVybSAqcDsKKworICAgIHAgPSBmaW5kX2J1aWx0aW5fdGVybShERUZBVUxUX1RFUk0pOworICAgIHNwcmludGYoa3NtZV9zdHIsIElGX0VCKCJcMDMzfCVkbSIsIEVTQ19TVFIgInwlZG0iKSwgYXR0cik7CisgICAgc3ByaW50Zihrc21kX3N0ciwgSUZfRUIoIlwwMzN8JWRtIiwgRVNDX1NUUiAifCVkbSIpLAorCQkJCSAgICAgYXR0ciB8IDB4MDgpOyAgLyogRk9SRUdST1VORF9JTlRFTlNJVFkgKi8KKyAgICBzcHJpbnRmKGtzbXJfc3RyLCBJRl9FQigiXDAzM3wlZG0iLCBFU0NfU1RSICJ8JWRtIiksCisJCQkJICgoYXR0ciAmIDB4MEYpIDw8IDQpIHwgKChhdHRyICYgMHhGMCkgPj4gNCkpOworCisgICAgd2hpbGUgKHAtPmJ0X3N0cmluZyAhPSBOVUxMKQorICAgIHsKKyAgICAgIGlmIChwLT5idF9lbnRyeSA9PSAoaW50KUtTX01FKQorCSAgcC0+YnRfc3RyaW5nID0gJmtzbWVfc3RyWzBdOworICAgICAgZWxzZSBpZiAocC0+YnRfZW50cnkgPT0gKGludClLU19NUikKKwkgIHAtPmJ0X3N0cmluZyA9ICZrc21yX3N0clswXTsKKyAgICAgIGVsc2UgaWYgKHAtPmJ0X2VudHJ5ID09IChpbnQpS1NfTUQpCisJICBwLT5idF9zdHJpbmcgPSAma3NtZF9zdHJbMF07CisgICAgICArK3A7CisgICAgfQorfQorI2VuZGlmCg==