LyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgogICB1bmljb2RlZGF0YSAtLSBQcm92aWRlcyBhY2Nlc3MgdG8gdGhlIFVuaWNvZGUgNS4yIGRhdGEgYmFzZS4KCiAgIERhdGEgd2FzIGV4dHJhY3RlZCBmcm9tIHRoZSBVbmljb2RlIDUuMiBVbmljb2RlRGF0YS50eHQgZmlsZS4KCiAgIFdyaXR0ZW4gYnkgTWFyYy1BbmRyZSBMZW1idXJnIChtYWxAbGVtYnVyZy5jb20pLgogICBNb2RpZmllZCBmb3IgUHl0aG9uIDIuMCBieSBGcmVkcmlrIEx1bmRoIChmcmVkcmlrQHB5dGhvbndhcmUuY29tKQogICBNb2RpZmllZCBieSBNYXJ0aW4gdi4gTPZ3aXMgKG1hcnRpbkB2LmxvZXdpcy5kZSkKCiAgIENvcHlyaWdodCAoYykgQ29ycG9yYXRpb24gZm9yIE5hdGlvbmFsIFJlc2VhcmNoIEluaXRpYXRpdmVzLgoKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgojaW5jbHVkZSAiUHl0aG9uLmgiCiNpbmNsdWRlICJ1Y25oYXNoLmgiCiNpbmNsdWRlICJzdHJ1Y3RtZW1iZXIuaCIKCi8qIGNoYXJhY3RlciBwcm9wZXJ0aWVzICovCgp0eXBlZGVmIHN0cnVjdCB7CiAgICBjb25zdCB1bnNpZ25lZCBjaGFyIGNhdGVnb3J5OyAgICAgICAvKiBpbmRleCBpbnRvCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfUHlVbmljb2RlX0NhdGVnb3J5TmFtZXMgKi8KICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgY29tYmluaW5nOyAgICAgIC8qIGNvbWJpbmluZyBjbGFzcyB2YWx1ZSAwIC0gMjU1ICovCiAgICBjb25zdCB1bnNpZ25lZCBjaGFyIGJpZGlyZWN0aW9uYWw7ICAvKiBpbmRleCBpbnRvCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfUHlVbmljb2RlX0JpZGlyZWN0aW9uYWxOYW1lcyAqLwogICAgY29uc3QgdW5zaWduZWQgY2hhciBtaXJyb3JlZDsgICAgICAgLyogdHJ1ZSBpZiBtaXJyb3JlZCBpbiBiaWRpciBtb2RlICovCiAgICBjb25zdCB1bnNpZ25lZCBjaGFyIGVhc3RfYXNpYW5fd2lkdGg7ICAgICAgIC8qIGluZGV4IGludG8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1B5VW5pY29kZV9FYXN0QXNpYW5XaWR0aCAqLwogICAgY29uc3QgdW5zaWduZWQgY2hhciBub3JtYWxpemF0aW9uX3F1aWNrX2NoZWNrOyAvKiBzZWUgaXNfbm9ybWFsaXplZCgpICovCn0gX1B5VW5pY29kZV9EYXRhYmFzZVJlY29yZDsKCnR5cGVkZWYgc3RydWN0IGNoYW5nZV9yZWNvcmQgewogICAgLyogc2VxdWVuY2Ugb2YgZmllbGRzIHNob3VsZCBiZSB0aGUgc2FtZSBhcyBpbiBtZXJnZV9vbGRfdmVyc2lvbiAqLwogICAgY29uc3QgdW5zaWduZWQgY2hhciBiaWRpcl9jaGFuZ2VkOwogICAgY29uc3QgdW5zaWduZWQgY2hhciBjYXRlZ29yeV9jaGFuZ2VkOwogICAgY29uc3QgdW5zaWduZWQgY2hhciBkZWNpbWFsX2NoYW5nZWQ7CiAgICBjb25zdCB1bnNpZ25lZCBjaGFyIG1pcnJvcmVkX2NoYW5nZWQ7CiAgICBjb25zdCBkb3VibGUgbnVtZXJpY19jaGFuZ2VkOwp9IGNoYW5nZV9yZWNvcmQ7CgovKiBkYXRhIGZpbGUgZ2VuZXJhdGVkIGJ5IFRvb2xzL3VuaWNvZGUvbWFrZXVuaWNvZGVkYXRhLnB5ICovCiNpbmNsdWRlICJ1bmljb2RlZGF0YV9kYi5oIgoKc3RhdGljIGNvbnN0IF9QeVVuaWNvZGVfRGF0YWJhc2VSZWNvcmQqCl9nZXRyZWNvcmRfZXgoUHlfVUNTNCBjb2RlKQp7CiAgICBpbnQgaW5kZXg7CiAgICBpZiAoY29kZSA+PSAweDExMDAwMCkKICAgICAgICBpbmRleCA9IDA7CiAgICBlbHNlIHsKICAgICAgICBpbmRleCA9IGluZGV4MVsoY29kZT4+U0hJRlQpXTsKICAgICAgICBpbmRleCA9IGluZGV4MlsoaW5kZXg8PFNISUZUKSsoY29kZSYoKDE8PFNISUZUKS0xKSldOwogICAgfQoKICAgIHJldHVybiAmX1B5VW5pY29kZV9EYXRhYmFzZV9SZWNvcmRzW2luZGV4XTsKfQoKLyogLS0tLS0tLS0tLS0tLSBQcmV2aW91cy12ZXJzaW9uIEFQSSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCnR5cGVkZWYgc3RydWN0IHByZXZpb3VzX3ZlcnNpb24gewogICAgUHlPYmplY3RfSEVBRAogICAgY29uc3QgY2hhciAqbmFtZTsKICAgIGNvbnN0IGNoYW5nZV9yZWNvcmQqICgqZ2V0cmVjb3JkKShQeV9VQ1M0KTsKICAgIFB5X1VDUzQgKCpub3JtYWxpemF0aW9uKShQeV9VQ1M0KTsKfSBQcmV2aW91c0RCVmVyc2lvbjsKCiNkZWZpbmUgZ2V0X29sZF9yZWNvcmQoc2VsZiwgdikgICAgKCgoKFByZXZpb3VzREJWZXJzaW9uKilzZWxmKS0+Z2V0cmVjb3JkKSh2KSkKCnN0YXRpYyBQeU1lbWJlckRlZiBEQl9tZW1iZXJzW10gPSB7CiAgICAgICAgeyJ1bmlkYXRhX3ZlcnNpb24iLCBUX1NUUklORywgb2Zmc2V0b2YoUHJldmlvdXNEQlZlcnNpb24sIG5hbWUpLCBSRUFET05MWX0sCiAgICAgICAge05VTEx9Cn07CgovKiBmb3J3YXJkIGRlY2xhcmF0aW9uICovCnN0YXRpYyBQeVR5cGVPYmplY3QgVUNEX1R5cGU7CgpzdGF0aWMgUHlPYmplY3QqCm5ld19wcmV2aW91c192ZXJzaW9uKGNvbnN0IGNoYXIqbmFtZSwgY29uc3QgY2hhbmdlX3JlY29yZCogKCpnZXRyZWNvcmQpKFB5X1VDUzQpLAogICAgICAgICAgICAgICAgICAgICBQeV9VQ1M0ICgqbm9ybWFsaXphdGlvbikoUHlfVUNTNCkpCnsKICAgICAgICBQcmV2aW91c0RCVmVyc2lvbiAqc2VsZjsKICAgICAgICBzZWxmID0gUHlPYmplY3RfTmV3KFByZXZpb3VzREJWZXJzaW9uLCAmVUNEX1R5cGUpOwogICAgICAgIGlmIChzZWxmID09IE5VTEwpCiAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICBzZWxmLT5uYW1lID0gbmFtZTsKICAgICAgICBzZWxmLT5nZXRyZWNvcmQgPSBnZXRyZWNvcmQ7CiAgICAgICAgc2VsZi0+bm9ybWFsaXphdGlvbiA9IG5vcm1hbGl6YXRpb247CiAgICAgICAgcmV0dXJuIChQeU9iamVjdCopc2VsZjsKfQoKCnN0YXRpYyBQeV9VQ1M0IGdldHVjaGFyKFB5VW5pY29kZU9iamVjdCAqb2JqKQp7CiAgICBQeV9VTklDT0RFICp2ID0gUHlVbmljb2RlX0FTX1VOSUNPREUob2JqKTsKCiAgICBpZiAoUHlVbmljb2RlX0dFVF9TSVpFKG9iaikgPT0gMSkKICAgICAgICByZXR1cm4gKnY7CiNpZm5kZWYgUHlfVU5JQ09ERV9XSURFCiAgICBlbHNlIGlmICgoUHlVbmljb2RlX0dFVF9TSVpFKG9iaikgPT0gMikgJiYKICAgICAgICAgICAgICgweEQ4MDAgPD0gdlswXSAmJiB2WzBdIDw9IDB4REJGRikgJiYKICAgICAgICAgICAgICgweERDMDAgPD0gdlsxXSAmJiB2WzFdIDw9IDB4REZGRikpCiAgICAgICAgcmV0dXJuICgoKHZbMF0gJiAweDNGRik8PDEwKSB8ICh2WzFdICYgMHgzRkYpKSArIDB4MTAwMDA7CiNlbmRpZgogICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKICAgICAgICAgICAgICAgICAgICAibmVlZCBhIHNpbmdsZSBVbmljb2RlIGNoYXJhY3RlciBhcyBwYXJhbWV0ZXIiKTsKICAgIHJldHVybiAoUHlfVUNTNCktMTsKfQoKLyogLS0tIE1vZHVsZSBBUEkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgpQeURvY19TVFJWQVIodW5pY29kZWRhdGFfZGVjaW1hbF9fZG9jX18sCiJkZWNpbWFsKHVuaWNoclssIGRlZmF1bHRdKVxuXApcblwKUmV0dXJucyB0aGUgZGVjaW1hbCB2YWx1ZSBhc3NpZ25lZCB0byB0aGUgVW5pY29kZSBjaGFyYWN0ZXIgdW5pY2hyXG5cCmFzIGludGVnZXIuIElmIG5vIHN1Y2ggdmFsdWUgaXMgZGVmaW5lZCwgZGVmYXVsdCBpcyByZXR1cm5lZCwgb3IsIGlmXG5cCm5vdCBnaXZlbiwgVmFsdWVFcnJvciBpcyByYWlzZWQuIik7CgpzdGF0aWMgUHlPYmplY3QgKgp1bmljb2RlZGF0YV9kZWNpbWFsKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKewogICAgUHlVbmljb2RlT2JqZWN0ICp2OwogICAgUHlPYmplY3QgKmRlZm9iaiA9IE5VTEw7CiAgICBpbnQgaGF2ZV9vbGQgPSAwOwogICAgbG9uZyByYzsKICAgIFB5X1VDUzQgYzsKCiAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk8hfE86ZGVjaW1hbCIsICZQeVVuaWNvZGVfVHlwZSwgJnYsICZkZWZvYmopKQogICAgICAgIHJldHVybiBOVUxMOwogICAgYyA9IGdldHVjaGFyKHYpOwogICAgaWYgKGMgPT0gKFB5X1VDUzQpLTEpCiAgICAgICAgcmV0dXJuIE5VTEw7CgogICAgaWYgKHNlbGYpIHsKICAgICAgICBjb25zdCBjaGFuZ2VfcmVjb3JkICpvbGQgPSBnZXRfb2xkX3JlY29yZChzZWxmLCBjKTsKICAgICAgICBpZiAob2xkLT5jYXRlZ29yeV9jaGFuZ2VkID09IDApIHsKICAgICAgICAgICAgLyogdW5hc3NpZ25lZCAqLwogICAgICAgICAgICBoYXZlX29sZCA9IDE7CiAgICAgICAgICAgIHJjID0gLTE7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKG9sZC0+ZGVjaW1hbF9jaGFuZ2VkICE9IDB4RkYpIHsKICAgICAgICAgICAgaGF2ZV9vbGQgPSAxOwogICAgICAgICAgICByYyA9IG9sZC0+ZGVjaW1hbF9jaGFuZ2VkOwogICAgICAgIH0KICAgIH0KCiAgICBpZiAoIWhhdmVfb2xkKQogICAgICAgIHJjID0gUHlfVU5JQ09ERV9UT0RFQ0lNQUwoYyk7CiAgICBpZiAocmMgPCAwKSB7CiAgICAgICAgaWYgKGRlZm9iaiA9PSBOVUxMKSB7CiAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5vdCBhIGRlY2ltYWwiKTsKICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBQeV9JTkNSRUYoZGVmb2JqKTsKICAgICAgICAgICAgcmV0dXJuIGRlZm9iajsKICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcocmMpOwp9CgpQeURvY19TVFJWQVIodW5pY29kZWRhdGFfZGlnaXRfX2RvY19fLAoiZGlnaXQodW5pY2hyWywgZGVmYXVsdF0pXG5cClxuXApSZXR1cm5zIHRoZSBkaWdpdCB2YWx1ZSBhc3NpZ25lZCB0byB0aGUgVW5pY29kZSBjaGFyYWN0ZXIgdW5pY2hyIGFzXG5cCmludGVnZXIuIElmIG5vIHN1Y2ggdmFsdWUgaXMgZGVmaW5lZCwgZGVmYXVsdCBpcyByZXR1cm5lZCwgb3IsIGlmXG5cCm5vdCBnaXZlbiwgVmFsdWVFcnJvciBpcyByYWlzZWQuIik7CgpzdGF0aWMgUHlPYmplY3QgKgp1bmljb2RlZGF0YV9kaWdpdChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCnsKICAgIFB5VW5pY29kZU9iamVjdCAqdjsKICAgIFB5T2JqZWN0ICpkZWZvYmogPSBOVUxMOwogICAgbG9uZyByYzsKICAgIFB5X1VDUzQgYzsKCiAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk8hfE86ZGlnaXQiLCAmUHlVbmljb2RlX1R5cGUsICZ2LCAmZGVmb2JqKSkKICAgICAgICByZXR1cm4gTlVMTDsKICAgIGMgPSBnZXR1Y2hhcih2KTsKICAgIGlmIChjID09IChQeV9VQ1M0KS0xKQogICAgICAgIHJldHVybiBOVUxMOwogICAgcmMgPSBQeV9VTklDT0RFX1RPRElHSVQoYyk7CiAgICBpZiAocmMgPCAwKSB7CiAgICAgICAgaWYgKGRlZm9iaiA9PSBOVUxMKSB7CiAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAibm90IGEgZGlnaXQiKTsKICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBQeV9JTkNSRUYoZGVmb2JqKTsKICAgICAgICAgICAgcmV0dXJuIGRlZm9iajsKICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcocmMpOwp9CgpQeURvY19TVFJWQVIodW5pY29kZWRhdGFfbnVtZXJpY19fZG9jX18sCiJudW1lcmljKHVuaWNoclssIGRlZmF1bHRdKVxuXApcblwKUmV0dXJucyB0aGUgbnVtZXJpYyB2YWx1ZSBhc3NpZ25lZCB0byB0aGUgVW5pY29kZSBjaGFyYWN0ZXIgdW5pY2hyXG5cCmFzIGZsb2F0LiBJZiBubyBzdWNoIHZhbHVlIGlzIGRlZmluZWQsIGRlZmF1bHQgaXMgcmV0dXJuZWQsIG9yLCBpZlxuXApub3QgZ2l2ZW4sIFZhbHVlRXJyb3IgaXMgcmFpc2VkLiIpOwoKc3RhdGljIFB5T2JqZWN0ICoKdW5pY29kZWRhdGFfbnVtZXJpYyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCnsKICAgIFB5VW5pY29kZU9iamVjdCAqdjsKICAgIFB5T2JqZWN0ICpkZWZvYmogPSBOVUxMOwogICAgaW50IGhhdmVfb2xkID0gMDsKICAgIGRvdWJsZSByYzsKICAgIFB5X1VDUzQgYzsKCiAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk8hfE86bnVtZXJpYyIsICZQeVVuaWNvZGVfVHlwZSwgJnYsICZkZWZvYmopKQogICAgICAgIHJldHVybiBOVUxMOwogICAgYyA9IGdldHVjaGFyKHYpOwogICAgaWYgKGMgPT0gKFB5X1VDUzQpLTEpCiAgICAgICAgcmV0dXJuIE5VTEw7CgogICAgaWYgKHNlbGYpIHsKICAgICAgICBjb25zdCBjaGFuZ2VfcmVjb3JkICpvbGQgPSBnZXRfb2xkX3JlY29yZChzZWxmLCBjKTsKICAgICAgICBpZiAob2xkLT5jYXRlZ29yeV9jaGFuZ2VkID09IDApIHsKICAgICAgICAgICAgLyogdW5hc3NpZ25lZCAqLwogICAgICAgICAgICBoYXZlX29sZCA9IDE7CiAgICAgICAgICAgIHJjID0gLTEuMDsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAob2xkLT5kZWNpbWFsX2NoYW5nZWQgIT0gMHhGRikgewogICAgICAgICAgICBoYXZlX29sZCA9IDE7CiAgICAgICAgICAgIHJjID0gb2xkLT5kZWNpbWFsX2NoYW5nZWQ7CiAgICAgICAgfQogICAgfQoKICAgIGlmICghaGF2ZV9vbGQpCiAgICAgICAgcmMgPSBQeV9VTklDT0RFX1RPTlVNRVJJQyhjKTsKICAgIGlmIChyYyA9PSAtMS4wKSB7CiAgICAgICAgaWYgKGRlZm9iaiA9PSBOVUxMKSB7CiAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAibm90IGEgbnVtZXJpYyBjaGFyYWN0ZXIiKTsKICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBQeV9JTkNSRUYoZGVmb2JqKTsKICAgICAgICAgICAgcmV0dXJuIGRlZm9iajsKICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gUHlGbG9hdF9Gcm9tRG91YmxlKHJjKTsKfQoKUHlEb2NfU1RSVkFSKHVuaWNvZGVkYXRhX2NhdGVnb3J5X19kb2NfXywKImNhdGVnb3J5KHVuaWNocilcblwKXG5cClJldHVybnMgdGhlIGdlbmVyYWwgY2F0ZWdvcnkgYXNzaWduZWQgdG8gdGhlIFVuaWNvZGUgY2hhcmFjdGVyXG5cCnVuaWNociBhcyBzdHJpbmcuIik7CgpzdGF0aWMgUHlPYmplY3QgKgp1bmljb2RlZGF0YV9jYXRlZ29yeShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCnsKICAgIFB5VW5pY29kZU9iamVjdCAqdjsKICAgIGludCBpbmRleDsKICAgIFB5X1VDUzQgYzsKCiAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk8hOmNhdGVnb3J5IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAmUHlVbmljb2RlX1R5cGUsICZ2KSkKICAgICAgICByZXR1cm4gTlVMTDsKICAgIGMgPSBnZXR1Y2hhcih2KTsKICAgIGlmIChjID09IChQeV9VQ1M0KS0xKQogICAgICAgIHJldHVybiBOVUxMOwogICAgaW5kZXggPSAoaW50KSBfZ2V0cmVjb3JkX2V4KGMpLT5jYXRlZ29yeTsKICAgIGlmIChzZWxmKSB7CiAgICAgICAgY29uc3QgY2hhbmdlX3JlY29yZCAqb2xkID0gZ2V0X29sZF9yZWNvcmQoc2VsZiwgYyk7CiAgICAgICAgaWYgKG9sZC0+Y2F0ZWdvcnlfY2hhbmdlZCAhPSAweEZGKQogICAgICAgICAgICBpbmRleCA9IG9sZC0+Y2F0ZWdvcnlfY2hhbmdlZDsKICAgIH0KICAgIHJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKF9QeVVuaWNvZGVfQ2F0ZWdvcnlOYW1lc1tpbmRleF0pOwp9CgpQeURvY19TVFJWQVIodW5pY29kZWRhdGFfYmlkaXJlY3Rpb25hbF9fZG9jX18sCiJiaWRpcmVjdGlvbmFsKHVuaWNocilcblwKXG5cClJldHVybnMgdGhlIGJpZGlyZWN0aW9uYWwgY2xhc3MgYXNzaWduZWQgdG8gdGhlIFVuaWNvZGUgY2hhcmFjdGVyXG5cCnVuaWNociBhcyBzdHJpbmcuIElmIG5vIHN1Y2ggdmFsdWUgaXMgZGVmaW5lZCwgYW4gZW1wdHkgc3RyaW5nIGlzXG5cCnJldHVybmVkLiIpOwoKc3RhdGljIFB5T2JqZWN0ICoKdW5pY29kZWRhdGFfYmlkaXJlY3Rpb25hbChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCnsKICAgIFB5VW5pY29kZU9iamVjdCAqdjsKICAgIGludCBpbmRleDsKICAgIFB5X1VDUzQgYzsKCiAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk8hOmJpZGlyZWN0aW9uYWwiLAogICAgICAgICAgICAgICAgICAgICAgICAgICZQeVVuaWNvZGVfVHlwZSwgJnYpKQogICAgICAgIHJldHVybiBOVUxMOwogICAgYyA9IGdldHVjaGFyKHYpOwogICAgaWYgKGMgPT0gKFB5X1VDUzQpLTEpCiAgICAgICAgcmV0dXJuIE5VTEw7CiAgICBpbmRleCA9IChpbnQpIF9nZXRyZWNvcmRfZXgoYyktPmJpZGlyZWN0aW9uYWw7CiAgICBpZiAoc2VsZikgewogICAgICAgIGNvbnN0IGNoYW5nZV9yZWNvcmQgKm9sZCA9IGdldF9vbGRfcmVjb3JkKHNlbGYsIGMpOwogICAgICAgIGlmIChvbGQtPmNhdGVnb3J5X2NoYW5nZWQgPT0gMCkKICAgICAgICAgICAgaW5kZXggPSAwOyAvKiB1bmFzc2lnbmVkICovCiAgICAgICAgZWxzZSBpZiAob2xkLT5iaWRpcl9jaGFuZ2VkICE9IDB4RkYpCiAgICAgICAgICAgIGluZGV4ID0gb2xkLT5iaWRpcl9jaGFuZ2VkOwogICAgfQogICAgcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmcoX1B5VW5pY29kZV9CaWRpcmVjdGlvbmFsTmFtZXNbaW5kZXhdKTsKfQoKUHlEb2NfU1RSVkFSKHVuaWNvZGVkYXRhX2NvbWJpbmluZ19fZG9jX18sCiJjb21iaW5pbmcodW5pY2hyKVxuXApcblwKUmV0dXJucyB0aGUgY2Fub25pY2FsIGNvbWJpbmluZyBjbGFzcyBhc3NpZ25lZCB0byB0aGUgVW5pY29kZVxuXApjaGFyYWN0ZXIgdW5pY2hyIGFzIGludGVnZXIuIFJldHVybnMgMCBpZiBubyBjb21iaW5pbmcgY2xhc3MgaXNcblwKZGVmaW5lZC4iKTsKCnN0YXRpYyBQeU9iamVjdCAqCnVuaWNvZGVkYXRhX2NvbWJpbmluZyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCnsKICAgIFB5VW5pY29kZU9iamVjdCAqdjsKICAgIGludCBpbmRleDsKICAgIFB5X1VDUzQgYzsKCiAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk8hOmNvbWJpbmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgJlB5VW5pY29kZV9UeXBlLCAmdikpCiAgICAgICAgcmV0dXJuIE5VTEw7CiAgICBjID0gZ2V0dWNoYXIodik7CiAgICBpZiAoYyA9PSAoUHlfVUNTNCktMSkKICAgICAgICByZXR1cm4gTlVMTDsKICAgIGluZGV4ID0gKGludCkgX2dldHJlY29yZF9leChjKS0+Y29tYmluaW5nOwogICAgaWYgKHNlbGYpIHsKICAgICAgICBjb25zdCBjaGFuZ2VfcmVjb3JkICpvbGQgPSBnZXRfb2xkX3JlY29yZChzZWxmLCBjKTsKICAgICAgICBpZiAob2xkLT5jYXRlZ29yeV9jaGFuZ2VkID09IDApCiAgICAgICAgICAgIGluZGV4ID0gMDsgLyogdW5hc3NpZ25lZCAqLwogICAgfQogICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKGluZGV4KTsKfQoKUHlEb2NfU1RSVkFSKHVuaWNvZGVkYXRhX21pcnJvcmVkX19kb2NfXywKIm1pcnJvcmVkKHVuaWNocilcblwKXG5cClJldHVybnMgdGhlIG1pcnJvcmVkIHByb3BlcnR5IGFzc2lnbmVkIHRvIHRoZSBVbmljb2RlIGNoYXJhY3RlclxuXAp1bmljaHIgYXMgaW50ZWdlci4gUmV0dXJucyAxIGlmIHRoZSBjaGFyYWN0ZXIgaGFzIGJlZW4gaWRlbnRpZmllZCBhc1xuXAphIFwibWlycm9yZWRcIiBjaGFyYWN0ZXIgaW4gYmlkaXJlY3Rpb25hbCB0ZXh0LCAwIG90aGVyd2lzZS4iKTsKCnN0YXRpYyBQeU9iamVjdCAqCnVuaWNvZGVkYXRhX21pcnJvcmVkKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKewogICAgUHlVbmljb2RlT2JqZWN0ICp2OwogICAgaW50IGluZGV4OwogICAgUHlfVUNTNCBjOwoKICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiTyE6bWlycm9yZWQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICZQeVVuaWNvZGVfVHlwZSwgJnYpKQogICAgICAgIHJldHVybiBOVUxMOwogICAgYyA9IGdldHVjaGFyKHYpOwogICAgaWYgKGMgPT0gKFB5X1VDUzQpLTEpCiAgICAgICAgcmV0dXJuIE5VTEw7CiAgICBpbmRleCA9IChpbnQpIF9nZXRyZWNvcmRfZXgoYyktPm1pcnJvcmVkOwogICAgaWYgKHNlbGYpIHsKICAgICAgICBjb25zdCBjaGFuZ2VfcmVjb3JkICpvbGQgPSBnZXRfb2xkX3JlY29yZChzZWxmLCBjKTsKICAgICAgICBpZiAob2xkLT5jYXRlZ29yeV9jaGFuZ2VkID09IDApCiAgICAgICAgICAgIGluZGV4ID0gMDsgLyogdW5hc3NpZ25lZCAqLwogICAgICAgIGVsc2UgaWYgKG9sZC0+bWlycm9yZWRfY2hhbmdlZCAhPSAweEZGKQogICAgICAgICAgICBpbmRleCA9IG9sZC0+bWlycm9yZWRfY2hhbmdlZDsKICAgIH0KICAgIHJldHVybiBQeUludF9Gcm9tTG9uZyhpbmRleCk7Cn0KClB5RG9jX1NUUlZBUih1bmljb2RlZGF0YV9lYXN0X2FzaWFuX3dpZHRoX19kb2NfXywKImVhc3RfYXNpYW5fd2lkdGgodW5pY2hyKVxuXApcblwKUmV0dXJucyB0aGUgZWFzdCBhc2lhbiB3aWR0aCBhc3NpZ25lZCB0byB0aGUgVW5pY29kZSBjaGFyYWN0ZXJcblwKdW5pY2hyIGFzIHN0cmluZy4iKTsKCnN0YXRpYyBQeU9iamVjdCAqCnVuaWNvZGVkYXRhX2Vhc3RfYXNpYW5fd2lkdGgoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQp7CiAgICBQeVVuaWNvZGVPYmplY3QgKnY7CiAgICBpbnQgaW5kZXg7CiAgICBQeV9VQ1M0IGM7CgogICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPITplYXN0X2FzaWFuX3dpZHRoIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAmUHlVbmljb2RlX1R5cGUsICZ2KSkKICAgICAgICByZXR1cm4gTlVMTDsKICAgIGMgPSBnZXR1Y2hhcih2KTsKICAgIGlmIChjID09IChQeV9VQ1M0KS0xKQogICAgICAgIHJldHVybiBOVUxMOwogICAgaW5kZXggPSAoaW50KSBfZ2V0cmVjb3JkX2V4KGMpLT5lYXN0X2FzaWFuX3dpZHRoOwogICAgaWYgKHNlbGYpIHsKICAgICAgICBjb25zdCBjaGFuZ2VfcmVjb3JkICpvbGQgPSBnZXRfb2xkX3JlY29yZChzZWxmLCBjKTsKICAgICAgICBpZiAob2xkLT5jYXRlZ29yeV9jaGFuZ2VkID09IDApCiAgICAgICAgICAgIGluZGV4ID0gMDsgLyogdW5hc3NpZ25lZCAqLwogICAgfQogICAgcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmcoX1B5VW5pY29kZV9FYXN0QXNpYW5XaWR0aE5hbWVzW2luZGV4XSk7Cn0KClB5RG9jX1NUUlZBUih1bmljb2RlZGF0YV9kZWNvbXBvc2l0aW9uX19kb2NfXywKImRlY29tcG9zaXRpb24odW5pY2hyKVxuXApcblwKUmV0dXJucyB0aGUgY2hhcmFjdGVyIGRlY29tcG9zaXRpb24gbWFwcGluZyBhc3NpZ25lZCB0byB0aGUgVW5pY29kZVxuXApjaGFyYWN0ZXIgdW5pY2hyIGFzIHN0cmluZy4gQW4gZW1wdHkgc3RyaW5nIGlzIHJldHVybmVkIGluIGNhc2Ugbm9cblwKc3VjaCBtYXBwaW5nIGlzIGRlZmluZWQuIik7CgpzdGF0aWMgUHlPYmplY3QgKgp1bmljb2RlZGF0YV9kZWNvbXBvc2l0aW9uKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKewogICAgUHlVbmljb2RlT2JqZWN0ICp2OwogICAgY2hhciBkZWNvbXBbMjU2XTsKICAgIGludCBjb2RlLCBpbmRleCwgY291bnQsIGk7CiAgICB1bnNpZ25lZCBpbnQgcHJlZml4X2luZGV4OwogICAgUHlfVUNTNCBjOwoKICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiTyE6ZGVjb21wb3NpdGlvbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgJlB5VW5pY29kZV9UeXBlLCAmdikpCiAgICAgICAgcmV0dXJuIE5VTEw7CiAgICBjID0gZ2V0dWNoYXIodik7CiAgICBpZiAoYyA9PSAoUHlfVUNTNCktMSkKICAgICAgICByZXR1cm4gTlVMTDsKCiAgICBjb2RlID0gKGludCljOwoKICAgIGlmIChzZWxmKSB7CiAgICAgICAgY29uc3QgY2hhbmdlX3JlY29yZCAqb2xkID0gZ2V0X29sZF9yZWNvcmQoc2VsZiwgYyk7CiAgICAgICAgaWYgKG9sZC0+Y2F0ZWdvcnlfY2hhbmdlZCA9PSAwKQogICAgICAgICAgICByZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZygiIik7IC8qIHVuYXNzaWduZWQgKi8KICAgIH0KCiAgICBpZiAoY29kZSA8IDAgfHwgY29kZSA+PSAweDExMDAwMCkKICAgICAgICBpbmRleCA9IDA7CiAgICBlbHNlIHsKICAgICAgICBpbmRleCA9IGRlY29tcF9pbmRleDFbKGNvZGU+PkRFQ09NUF9TSElGVCldOwogICAgICAgIGluZGV4ID0gZGVjb21wX2luZGV4MlsoaW5kZXg8PERFQ09NUF9TSElGVCkrCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvZGUmKCgxPDxERUNPTVBfU0hJRlQpLTEpKV07CiAgICB9CgogICAgLyogaGlnaCBieXRlIGlzIG51bWJlciBvZiBoZXggYnl0ZXMgKHVzdWFsbHkgb25lIG9yIHR3byksIGxvdyBieXRlCiAgICAgICBpcyBwcmVmaXggY29kZSAoZnJvbSovCiAgICBjb3VudCA9IGRlY29tcF9kYXRhW2luZGV4XSA+PiA4OwoKICAgIC8qIFhYWDogY291bGQgYWxsb2NhdGUgdGhlIFB5U3RyaW5nIHVwIGZyb250IGluc3RlYWQKICAgICAgIChzdHJsZW4ocHJlZml4KSArIDUgKiBjb3VudCArIDEgYnl0ZXMpICovCgogICAgLyogQmFzZWQgb24gaG93IGluZGV4IGlzIGNhbGN1bGF0ZWQgYWJvdmUgYW5kIGRlY29tcF9kYXRhIGlzIGdlbmVyYXRlZAogICAgICAgZnJvbSBUb29scy91bmljb2RlL21ha2V1bmljb2RlZGF0YS5weSwgaXQgc2hvdWxkIG5vdCBiZSBwb3NzaWJsZQogICAgICAgdG8gb3ZlcmZsb3cgZGVjb21wX3ByZWZpeC4gKi8KICAgIHByZWZpeF9pbmRleCA9IGRlY29tcF9kYXRhW2luZGV4XSAmIDI1NTsKICAgIGFzc2VydChwcmVmaXhfaW5kZXggPCAoc2l6ZW9mKGRlY29tcF9wcmVmaXgpL3NpemVvZigqZGVjb21wX3ByZWZpeCkpKTsKCiAgICAvKiBjb3B5IHByZWZpeCAqLwogICAgaSA9IHN0cmxlbihkZWNvbXBfcHJlZml4W3ByZWZpeF9pbmRleF0pOwogICAgbWVtY3B5KGRlY29tcCwgZGVjb21wX3ByZWZpeFtwcmVmaXhfaW5kZXhdLCBpKTsKCiAgICB3aGlsZSAoY291bnQtLSA+IDApIHsKICAgICAgICBpZiAoaSkKICAgICAgICAgICAgZGVjb21wW2krK10gPSAnICc7CiAgICAgICAgYXNzZXJ0KChzaXplX3QpaSA8IHNpemVvZihkZWNvbXApKTsKICAgICAgICBQeU9TX3NucHJpbnRmKGRlY29tcCArIGksIHNpemVvZihkZWNvbXApIC0gaSwgIiUwNFgiLAogICAgICAgICAgICAgICAgICAgICAgZGVjb21wX2RhdGFbKytpbmRleF0pOwogICAgICAgIGkgKz0gc3RybGVuKGRlY29tcCArIGkpOwogICAgfQoKICAgIGRlY29tcFtpXSA9ICdcMCc7CgogICAgcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmcoZGVjb21wKTsKfQoKc3RhdGljIHZvaWQKZ2V0X2RlY29tcF9yZWNvcmQoUHlPYmplY3QgKnNlbGYsIFB5X1VDUzQgY29kZSwgaW50ICppbmRleCwgaW50ICpwcmVmaXgsIGludCAqY291bnQpCnsKICAgIGlmIChjb2RlID49IDB4MTEwMDAwKSB7CiAgICAgICAgKmluZGV4ID0gMDsKICAgIH0gZWxzZSBpZiAoc2VsZiAmJiBnZXRfb2xkX3JlY29yZChzZWxmLCBjb2RlKS0+Y2F0ZWdvcnlfY2hhbmdlZD09MCkgewogICAgICAgIC8qIHVuYXNzaWduZWQgaW4gb2xkIHZlcnNpb24gKi8KICAgICAgICAqaW5kZXggPSAwOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgKmluZGV4ID0gZGVjb21wX2luZGV4MVsoY29kZT4+REVDT01QX1NISUZUKV07CiAgICAgICAgKmluZGV4ID0gZGVjb21wX2luZGV4MlsoKmluZGV4PDxERUNPTVBfU0hJRlQpKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvZGUmKCgxPDxERUNPTVBfU0hJRlQpLTEpKV07CiAgICB9CgogICAgLyogaGlnaCBieXRlIGlzIG51bWJlciBvZiBoZXggYnl0ZXMgKHVzdWFsbHkgb25lIG9yIHR3byksIGxvdyBieXRlCiAgICAgICBpcyBwcmVmaXggY29kZSAoZnJvbSovCiAgICAqY291bnQgPSBkZWNvbXBfZGF0YVsqaW5kZXhdID4+IDg7CiAgICAqcHJlZml4ID0gZGVjb21wX2RhdGFbKmluZGV4XSAmIDI1NTsKCiAgICAoKmluZGV4KSsrOwp9CgojZGVmaW5lIFNCYXNlICAgMHhBQzAwCiNkZWZpbmUgTEJhc2UgICAweDExMDAKI2RlZmluZSBWQmFzZSAgIDB4MTE2MQojZGVmaW5lIFRCYXNlICAgMHgxMUE3CiNkZWZpbmUgTENvdW50ICAxOQojZGVmaW5lIFZDb3VudCAgMjEKI2RlZmluZSBUQ291bnQgIDI4CiNkZWZpbmUgTkNvdW50ICAoVkNvdW50KlRDb3VudCkKI2RlZmluZSBTQ291bnQgIChMQ291bnQqTkNvdW50KQoKc3RhdGljIFB5T2JqZWN0KgpuZmRfbmZrZChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmlucHV0LCBpbnQgaykKewogICAgUHlPYmplY3QgKnJlc3VsdDsKICAgIFB5X1VOSUNPREUgKmksICplbmQsICpvOwogICAgLyogTG9uZ2VzdCBkZWNvbXBvc2l0aW9uIGluIFVuaWNvZGUgMy4yOiBVK0ZERkEgKi8KICAgIFB5X1VOSUNPREUgc3RhY2tbMjBdOwogICAgUHlfc3NpemVfdCBzcGFjZSwgaXNpemU7CiAgICBpbnQgaW5kZXgsIHByZWZpeCwgY291bnQsIHN0YWNrcHRyOwogICAgdW5zaWduZWQgY2hhciBwcmV2LCBjdXI7CgogICAgc3RhY2twdHIgPSAwOwogICAgaXNpemUgPSBQeVVuaWNvZGVfR0VUX1NJWkUoaW5wdXQpOwogICAgc3BhY2UgPSBpc2l6ZTsKICAgIC8qIE92ZXJhbGxvY2F0ZSBhdCBtb3N0IDEwIGNoYXJhY3RlcnMuICovCiAgICBpZiAoc3BhY2UgPiAxMCkgewogICAgICAgIGlmIChzcGFjZSA8PSBQWV9TU0laRV9UX01BWCAtIDEwKQogICAgICAgICAgICBzcGFjZSArPSAxMDsKICAgIH0KICAgIGVsc2UgewogICAgICAgIHNwYWNlICo9IDI7CiAgICB9CiAgICByZXN1bHQgPSBQeVVuaWNvZGVfRnJvbVVuaWNvZGUoTlVMTCwgc3BhY2UpOwogICAgaWYgKCFyZXN1bHQpCiAgICAgICAgcmV0dXJuIE5VTEw7CiAgICBpID0gUHlVbmljb2RlX0FTX1VOSUNPREUoaW5wdXQpOwogICAgZW5kID0gaSArIGlzaXplOwogICAgbyA9IFB5VW5pY29kZV9BU19VTklDT0RFKHJlc3VsdCk7CgogICAgd2hpbGUgKGkgPCBlbmQpIHsKICAgICAgICBzdGFja1tzdGFja3B0cisrXSA9ICppKys7CiAgICAgICAgd2hpbGUoc3RhY2twdHIpIHsKICAgICAgICAgICAgUHlfVU5JQ09ERSBjb2RlID0gc3RhY2tbLS1zdGFja3B0cl07CiAgICAgICAgICAgIC8qIEhhbmd1bCBEZWNvbXBvc2l0aW9uIGFkZHMgdGhyZWUgY2hhcmFjdGVycyBpbgogICAgICAgICAgICAgICBhIHNpbmdsZSBzdGVwLCBzbyB3ZSBuZWVkIGF0IGxlYXN0IHRoYXQgbXVjaCByb29tLiAqLwogICAgICAgICAgICBpZiAoc3BhY2UgPCAzKSB7CiAgICAgICAgICAgICAgICBQeV9zc2l6ZV90IG5ld3NpemUgPSBQeVN0cmluZ19HRVRfU0laRShyZXN1bHQpICsgMTA7CiAgICAgICAgICAgICAgICBzcGFjZSArPSAxMDsKICAgICAgICAgICAgICAgIGlmIChQeVVuaWNvZGVfUmVzaXplKCZyZXN1bHQsIG5ld3NpemUpID09IC0xKQogICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICAgICAgICAgbyA9IFB5VW5pY29kZV9BU19VTklDT0RFKHJlc3VsdCkgKyBuZXdzaXplIC0gc3BhY2U7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLyogSGFuZ3VsIERlY29tcG9zaXRpb24uICovCiAgICAgICAgICAgIGlmIChTQmFzZSA8PSBjb2RlICYmIGNvZGUgPCAoU0Jhc2UrU0NvdW50KSkgewogICAgICAgICAgICAgICAgaW50IFNJbmRleCA9IGNvZGUgLSBTQmFzZTsKICAgICAgICAgICAgICAgIGludCBMID0gTEJhc2UgKyBTSW5kZXggLyBOQ291bnQ7CiAgICAgICAgICAgICAgICBpbnQgViA9IFZCYXNlICsgKFNJbmRleCAlIE5Db3VudCkgLyBUQ291bnQ7CiAgICAgICAgICAgICAgICBpbnQgVCA9IFRCYXNlICsgU0luZGV4ICUgVENvdW50OwogICAgICAgICAgICAgICAgKm8rKyA9IEw7CiAgICAgICAgICAgICAgICAqbysrID0gVjsKICAgICAgICAgICAgICAgIHNwYWNlIC09IDI7CiAgICAgICAgICAgICAgICBpZiAoVCAhPSBUQmFzZSkgewogICAgICAgICAgICAgICAgICAgICpvKysgPSBUOwogICAgICAgICAgICAgICAgICAgIHNwYWNlIC0tOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLyogbm9ybWFsaXphdGlvbiBjaGFuZ2VzICovCiAgICAgICAgICAgIGlmIChzZWxmKSB7CiAgICAgICAgICAgICAgICBQeV9VQ1M0IHZhbHVlID0gKChQcmV2aW91c0RCVmVyc2lvbiopc2VsZiktPm5vcm1hbGl6YXRpb24oY29kZSk7CiAgICAgICAgICAgICAgICBpZiAodmFsdWUgIT0gMCkgewogICAgICAgICAgICAgICAgICAgIHN0YWNrW3N0YWNrcHRyKytdID0gdmFsdWU7CiAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8qIE90aGVyIGRlY29tcG9zaXRpb25zLiAqLwogICAgICAgICAgICBnZXRfZGVjb21wX3JlY29yZChzZWxmLCBjb2RlLCAmaW5kZXgsICZwcmVmaXgsICZjb3VudCk7CgogICAgICAgICAgICAvKiBDb3B5IGNoYXJhY3RlciBpZiBpdCBpcyBub3QgZGVjb21wb3NhYmxlLCBvciBoYXMgYQogICAgICAgICAgICAgICBjb21wYXRpYmlsaXR5IGRlY29tcG9zaXRpb24sIGJ1dCB3ZSBkbyBORkQuICovCiAgICAgICAgICAgIGlmICghY291bnQgfHwgKHByZWZpeCAmJiAhaykpIHsKICAgICAgICAgICAgICAgICpvKysgPSBjb2RlOwogICAgICAgICAgICAgICAgc3BhY2UtLTsKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8qIENvcHkgZGVjb21wb3NpdGlvbiBvbnRvIHRoZSBzdGFjaywgaW4gcmV2ZXJzZQogICAgICAgICAgICAgICBvcmRlci4gICovCiAgICAgICAgICAgIHdoaWxlKGNvdW50KSB7CiAgICAgICAgICAgICAgICBjb2RlID0gZGVjb21wX2RhdGFbaW5kZXggKyAoLS1jb3VudCldOwogICAgICAgICAgICAgICAgc3RhY2tbc3RhY2twdHIrK10gPSBjb2RlOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIC8qIERyb3Agb3ZlcmFsbG9jYXRpb24uIENhbm5vdCBmYWlsLiAqLwogICAgUHlVbmljb2RlX1Jlc2l6ZSgmcmVzdWx0LCBQeVVuaWNvZGVfR0VUX1NJWkUocmVzdWx0KSAtIHNwYWNlKTsKCiAgICAvKiBTb3J0IGNhbm9uaWNhbGx5LiAqLwogICAgaSA9IFB5VW5pY29kZV9BU19VTklDT0RFKHJlc3VsdCk7CiAgICBwcmV2ID0gX2dldHJlY29yZF9leCgqaSktPmNvbWJpbmluZzsKICAgIGVuZCA9IGkgKyBQeVVuaWNvZGVfR0VUX1NJWkUocmVzdWx0KTsKICAgIGZvciAoaSsrOyBpIDwgZW5kOyBpKyspIHsKICAgICAgICBjdXIgPSBfZ2V0cmVjb3JkX2V4KCppKS0+Y29tYmluaW5nOwogICAgICAgIGlmIChwcmV2ID09IDAgfHwgY3VyID09IDAgfHwgcHJldiA8PSBjdXIpIHsKICAgICAgICAgICAgcHJldiA9IGN1cjsKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgfQogICAgICAgIC8qIE5vbi1jYW5vbmljYWwgb3JkZXIuIE5lZWQgdG8gc3dpdGNoICppIHdpdGggcHJldmlvdXMuICovCiAgICAgICAgbyA9IGkgLSAxOwogICAgICAgIHdoaWxlICgxKSB7CiAgICAgICAgICAgIFB5X1VOSUNPREUgdG1wID0gb1sxXTsKICAgICAgICAgICAgb1sxXSA9IG9bMF07CiAgICAgICAgICAgIG9bMF0gPSB0bXA7CiAgICAgICAgICAgIG8tLTsKICAgICAgICAgICAgaWYgKG8gPCBQeVVuaWNvZGVfQVNfVU5JQ09ERShyZXN1bHQpKQogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIHByZXYgPSBfZ2V0cmVjb3JkX2V4KCpvKS0+Y29tYmluaW5nOwogICAgICAgICAgICBpZiAocHJldiA9PSAwIHx8IHByZXYgPD0gY3VyKQogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIHByZXYgPSBfZ2V0cmVjb3JkX2V4KCppKS0+Y29tYmluaW5nOwogICAgfQogICAgcmV0dXJuIHJlc3VsdDsKfQoKc3RhdGljIGludApmaW5kX25mY19pbmRleChQeU9iamVjdCAqc2VsZiwgc3RydWN0IHJlaW5kZXgqIG5mYywgUHlfVU5JQ09ERSBjb2RlKQp7CiAgICBpbnQgaW5kZXg7CiAgICBmb3IgKGluZGV4ID0gMDsgbmZjW2luZGV4XS5zdGFydDsgaW5kZXgrKykgewogICAgICAgIGludCBzdGFydCA9IG5mY1tpbmRleF0uc3RhcnQ7CiAgICAgICAgaWYgKGNvZGUgPCBzdGFydCkKICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgIGlmIChjb2RlIDw9IHN0YXJ0ICsgbmZjW2luZGV4XS5jb3VudCkgewogICAgICAgICAgICBpbnQgZGVsdGEgPSBjb2RlIC0gc3RhcnQ7CiAgICAgICAgICAgIHJldHVybiBuZmNbaW5kZXhdLmluZGV4ICsgZGVsdGE7CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIC0xOwp9CgpzdGF0aWMgUHlPYmplY3QqCm5mY19uZmtjKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqaW5wdXQsIGludCBrKQp7CiAgICBQeU9iamVjdCAqcmVzdWx0OwogICAgUHlfVU5JQ09ERSAqaSwgKmkxLCAqbywgKmVuZDsKICAgIGludCBmLGwsaW5kZXgsaW5kZXgxLGNvbWI7CiAgICBQeV9VTklDT0RFIGNvZGU7CiAgICBQeV9VTklDT0RFICpza2lwcGVkWzIwXTsKICAgIGludCBjc2tpcHBlZCA9IDA7CgogICAgcmVzdWx0ID0gbmZkX25ma2Qoc2VsZiwgaW5wdXQsIGspOwogICAgaWYgKCFyZXN1bHQpCiAgICAgICAgcmV0dXJuIE5VTEw7CgogICAgLyogV2UgYXJlIGdvaW5nIHRvIG1vZGlmeSByZXN1bHQgaW4tcGxhY2UuCiAgICAgICBJZiBuZmRfbmZrZCBpcyBjaGFuZ2VkIHRvIHNvbWV0aW1lcyByZXR1cm4gdGhlIGlucHV0LAogICAgICAgdGhpcyBjb2RlIG5lZWRzIHRvIGJlIHJldmlld2VkLiAqLwogICAgYXNzZXJ0KHJlc3VsdCAhPSBpbnB1dCk7CgogICAgaSA9IFB5VW5pY29kZV9BU19VTklDT0RFKHJlc3VsdCk7CiAgICBlbmQgPSBpICsgUHlVbmljb2RlX0dFVF9TSVpFKHJlc3VsdCk7CiAgICBvID0gUHlVbmljb2RlX0FTX1VOSUNPREUocmVzdWx0KTsKCiAgYWdhaW46CiAgICB3aGlsZSAoaSA8IGVuZCkgewogICAgICBmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBjc2tpcHBlZDsgaW5kZXgrKykgewogICAgICAgICAgaWYgKHNraXBwZWRbaW5kZXhdID09IGkpIHsKICAgICAgICAgICAgICAvKiAqaSBjaGFyYWN0ZXIgaXMgc2tpcHBlZC4KICAgICAgICAgICAgICAgICBSZW1vdmUgZnJvbSBsaXN0LiAqLwogICAgICAgICAgICAgIHNraXBwZWRbaW5kZXhdID0gc2tpcHBlZFtjc2tpcHBlZC0xXTsKICAgICAgICAgICAgICBjc2tpcHBlZC0tOwogICAgICAgICAgICAgIGkrKzsKICAgICAgICAgICAgICBnb3RvIGFnYWluOyAvKiBjb250aW51ZSB3aGlsZSAqLwogICAgICAgICAgfQogICAgICB9CiAgICAgIC8qIEhhbmd1bCBDb21wb3NpdGlvbi4gV2UgZG9uJ3QgbmVlZCB0byBjaGVjayBmb3IgPExWLFQ+CiAgICAgICAgIHBhaXJzLCBzaW5jZSB3ZSBhbHdheXMgaGF2ZSBkZWNvbXBvc2VkIGRhdGEuICovCiAgICAgIGlmIChMQmFzZSA8PSAqaSAmJiAqaSA8IChMQmFzZStMQ291bnQpICYmCiAgICAgICAgICBpICsgMSA8IGVuZCAmJgogICAgICAgICAgVkJhc2UgPD0gaVsxXSAmJiBpWzFdIDw9IChWQmFzZStWQ291bnQpKSB7CiAgICAgICAgICBpbnQgTEluZGV4LCBWSW5kZXg7CiAgICAgICAgICBMSW5kZXggPSBpWzBdIC0gTEJhc2U7CiAgICAgICAgICBWSW5kZXggPSBpWzFdIC0gVkJhc2U7CiAgICAgICAgICBjb2RlID0gU0Jhc2UgKyAoTEluZGV4KlZDb3VudCtWSW5kZXgpKlRDb3VudDsKICAgICAgICAgIGkrPTI7CiAgICAgICAgICBpZiAoaSA8IGVuZCAmJgogICAgICAgICAgICAgIFRCYXNlIDw9ICppICYmICppIDw9IChUQmFzZStUQ291bnQpKSB7CiAgICAgICAgICAgICAgY29kZSArPSAqaS1UQmFzZTsKICAgICAgICAgICAgICBpKys7CiAgICAgICAgICB9CiAgICAgICAgICAqbysrID0gY29kZTsKICAgICAgICAgIGNvbnRpbnVlOwogICAgICB9CgogICAgICBmID0gZmluZF9uZmNfaW5kZXgoc2VsZiwgbmZjX2ZpcnN0LCAqaSk7CiAgICAgIGlmIChmID09IC0xKSB7CiAgICAgICAgICAqbysrID0gKmkrKzsKICAgICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIC8qIEZpbmQgbmV4dCB1bmJsb2NrZWQgY2hhcmFjdGVyLiAqLwogICAgICBpMSA9IGkrMTsKICAgICAgY29tYiA9IDA7CiAgICAgIHdoaWxlIChpMSA8IGVuZCkgewogICAgICAgICAgaW50IGNvbWIxID0gX2dldHJlY29yZF9leCgqaTEpLT5jb21iaW5pbmc7CiAgICAgICAgICBpZiAoY29tYikgewogICAgICAgICAgICAgIGlmIChjb21iMSA9PSAwKQogICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICBpZiAoY29tYiA+PSBjb21iMSkgewogICAgICAgICAgICAgICAgICAvKiBDaGFyYWN0ZXIgaXMgYmxvY2tlZC4gKi8KICAgICAgICAgICAgICAgICAgaTErKzsKICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgbCA9IGZpbmRfbmZjX2luZGV4KHNlbGYsIG5mY19sYXN0LCAqaTEpOwogICAgICAgICAgLyogKmkxIGNhbm5vdCBiZSBjb21iaW5lZCB3aXRoICppLiBJZiAqaTEKICAgICAgICAgICAgIGlzIGEgc3RhcnRlciwgd2UgZG9uJ3QgbmVlZCB0byBsb29rIGZ1cnRoZXIuCiAgICAgICAgICAgICBPdGhlcndpc2UsIHJlY29yZCB0aGUgY29tYmluaW5nIGNsYXNzLiAqLwogICAgICAgICAgaWYgKGwgPT0gLTEpIHsKICAgICAgICAgICAgbm90X2NvbWJpbmFibGU6CiAgICAgICAgICAgICAgaWYgKGNvbWIxID09IDApCiAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgIGNvbWIgPSBjb21iMTsKICAgICAgICAgICAgICBpMSsrOwogICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgfQogICAgICAgICAgaW5kZXggPSBmKlRPVEFMX0xBU1QgKyBsOwogICAgICAgICAgaW5kZXgxID0gY29tcF9pbmRleFtpbmRleCA+PiBDT01QX1NISUZUXTsKICAgICAgICAgIGNvZGUgPSBjb21wX2RhdGFbKGluZGV4MTw8Q09NUF9TSElGVCkrCiAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbmRleCYoKDE8PENPTVBfU0hJRlQpLTEpKV07CiAgICAgICAgICBpZiAoY29kZSA9PSAwKQogICAgICAgICAgICAgIGdvdG8gbm90X2NvbWJpbmFibGU7CgogICAgICAgICAgLyogUmVwbGFjZSB0aGUgb3JpZ2luYWwgY2hhcmFjdGVyLiAqLwogICAgICAgICAgKmkgPSBjb2RlOwogICAgICAgICAgLyogTWFyayB0aGUgc2Vjb25kIGNoYXJhY3RlciB1bnVzZWQuICovCiAgICAgICAgICBhc3NlcnQoY3NraXBwZWQgPCAyMCk7CiAgICAgICAgICBza2lwcGVkW2Nza2lwcGVkKytdID0gaTE7CiAgICAgICAgICBpMSsrOwogICAgICAgICAgZiA9IGZpbmRfbmZjX2luZGV4KHNlbGYsIG5mY19maXJzdCwgKmkpOwogICAgICAgICAgaWYgKGYgPT0gLTEpCiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgICAgKm8rKyA9ICppKys7CiAgICB9CiAgICBpZiAobyAhPSBlbmQpCiAgICAgICAgUHlVbmljb2RlX1Jlc2l6ZSgmcmVzdWx0LCBvIC0gUHlVbmljb2RlX0FTX1VOSUNPREUocmVzdWx0KSk7CiAgICByZXR1cm4gcmVzdWx0Owp9CgovKiBSZXR1cm4gMSBpZiB0aGUgaW5wdXQgaXMgY2VydGFpbmx5IG5vcm1hbGl6ZWQsIDAgaWYgaXQgbWlnaHQgbm90IGJlLiAqLwpzdGF0aWMgaW50CmlzX25vcm1hbGl6ZWQoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICppbnB1dCwgaW50IG5mYywgaW50IGspCnsKICAgIFB5X1VOSUNPREUgKmksICplbmQ7CiAgICB1bnNpZ25lZCBjaGFyIHByZXZfY29tYmluaW5nID0gMCwgcXVpY2tjaGVja19tYXNrOwoKICAgIC8qIEFuIG9sZGVyIHZlcnNpb24gb2YgdGhlIGRhdGFiYXNlIGlzIHJlcXVlc3RlZCwgcXVpY2tjaGVja3MgbXVzdCBiZQogICAgICAgZGlzYWJsZWQuICovCiAgICBpZiAoc2VsZiAhPSBOVUxMKQogICAgICAgIHJldHVybiAwOwoKICAgIC8qIFRoZSB0d28gcXVpY2tjaGVjayBiaXRzIGF0IHRoaXMgc2hpZnQgbWVhbiAwPVllcywgMT1NYXliZSwgMj1ObywKICAgICAgIGFzIGRlc2NyaWJlZCBpbiBodHRwOi8vdW5pY29kZS5vcmcvcmVwb3J0cy90cjE1LyNBbm5leDguICovCiAgICBxdWlja2NoZWNrX21hc2sgPSAzIDw8ICgobmZjID8gNCA6IDApICsgKGsgPyAyIDogMCkpOwoKICAgIGkgPSBQeVVuaWNvZGVfQVNfVU5JQ09ERShpbnB1dCk7CiAgICBlbmQgPSBpICsgUHlVbmljb2RlX0dFVF9TSVpFKGlucHV0KTsKICAgIHdoaWxlIChpIDwgZW5kKSB7CiAgICAgICAgY29uc3QgX1B5VW5pY29kZV9EYXRhYmFzZVJlY29yZCAqcmVjb3JkID0gX2dldHJlY29yZF9leCgqaSsrKTsKICAgICAgICB1bnNpZ25lZCBjaGFyIGNvbWJpbmluZyA9IHJlY29yZC0+Y29tYmluaW5nOwogICAgICAgIHVuc2lnbmVkIGNoYXIgcXVpY2tjaGVjayA9IHJlY29yZC0+bm9ybWFsaXphdGlvbl9xdWlja19jaGVjazsKCiAgICAgICAgaWYgKHF1aWNrY2hlY2sgJiBxdWlja2NoZWNrX21hc2spCiAgICAgICAgICAgIHJldHVybiAwOyAvKiB0aGlzIHN0cmluZyBtaWdodCBuZWVkIG5vcm1hbGl6YXRpb24gKi8KICAgICAgICBpZiAoY29tYmluaW5nICYmIHByZXZfY29tYmluaW5nID4gY29tYmluaW5nKQogICAgICAgICAgICByZXR1cm4gMDsgLyogbm9uLWNhbm9uaWNhbCBzb3J0IG9yZGVyLCBub3Qgbm9ybWFsaXplZCAqLwogICAgICAgIHByZXZfY29tYmluaW5nID0gY29tYmluaW5nOwogICAgfQogICAgcmV0dXJuIDE7IC8qIGNlcnRhaW5seSBub3JtYWxpemVkICovCn0KClB5RG9jX1NUUlZBUih1bmljb2RlZGF0YV9ub3JtYWxpemVfX2RvY19fLAoibm9ybWFsaXplKGZvcm0sIHVuaXN0cilcblwKXG5cClJldHVybiB0aGUgbm9ybWFsIGZvcm0gJ2Zvcm0nIGZvciB0aGUgVW5pY29kZSBzdHJpbmcgdW5pc3RyLiAgVmFsaWRcblwKdmFsdWVzIGZvciBmb3JtIGFyZSAnTkZDJywgJ05GS0MnLCAnTkZEJywgYW5kICdORktEJy4iKTsKCnN0YXRpYyBQeU9iamVjdCoKdW5pY29kZWRhdGFfbm9ybWFsaXplKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKewogICAgY2hhciAqZm9ybTsKICAgIFB5T2JqZWN0ICppbnB1dDsKCiAgICBpZighUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAic08hOm5vcm1hbGl6ZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAmZm9ybSwgJlB5VW5pY29kZV9UeXBlLCAmaW5wdXQpKQogICAgICAgIHJldHVybiBOVUxMOwoKICAgIGlmIChQeVVuaWNvZGVfR2V0U2l6ZShpbnB1dCkgPT0gMCkgewogICAgICAgIC8qIFNwZWNpYWwgY2FzZSBlbXB0eSBpbnB1dCBzdHJpbmdzLCBzaW5jZSByZXNpemluZwogICAgICAgICAgIHRoZW0gIGxhdGVyIHdvdWxkIGNhdXNlIGludGVybmFsIGVycm9ycy4gKi8KICAgICAgICBQeV9JTkNSRUYoaW5wdXQpOwogICAgICAgIHJldHVybiBpbnB1dDsKICAgIH0KCiAgICBpZiAoc3RyY21wKGZvcm0sICJORkMiKSA9PSAwKSB7CiAgICAgICAgaWYgKGlzX25vcm1hbGl6ZWQoc2VsZiwgaW5wdXQsIDEsIDApKSB7CiAgICAgICAgICAgIFB5X0lOQ1JFRihpbnB1dCk7CiAgICAgICAgICAgIHJldHVybiBpbnB1dDsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIG5mY19uZmtjKHNlbGYsIGlucHV0LCAwKTsKICAgIH0KICAgIGlmIChzdHJjbXAoZm9ybSwgIk5GS0MiKSA9PSAwKSB7CiAgICAgICAgaWYgKGlzX25vcm1hbGl6ZWQoc2VsZiwgaW5wdXQsIDEsIDEpKSB7CiAgICAgICAgICAgIFB5X0lOQ1JFRihpbnB1dCk7CiAgICAgICAgICAgIHJldHVybiBpbnB1dDsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIG5mY19uZmtjKHNlbGYsIGlucHV0LCAxKTsKICAgIH0KICAgIGlmIChzdHJjbXAoZm9ybSwgIk5GRCIpID09IDApIHsKICAgICAgICBpZiAoaXNfbm9ybWFsaXplZChzZWxmLCBpbnB1dCwgMCwgMCkpIHsKICAgICAgICAgICAgUHlfSU5DUkVGKGlucHV0KTsKICAgICAgICAgICAgcmV0dXJuIGlucHV0OwogICAgICAgIH0KICAgICAgICByZXR1cm4gbmZkX25ma2Qoc2VsZiwgaW5wdXQsIDApOwogICAgfQogICAgaWYgKHN0cmNtcChmb3JtLCAiTkZLRCIpID09IDApIHsKICAgICAgICBpZiAoaXNfbm9ybWFsaXplZChzZWxmLCBpbnB1dCwgMCwgMSkpIHsKICAgICAgICAgICAgUHlfSU5DUkVGKGlucHV0KTsKICAgICAgICAgICAgcmV0dXJuIGlucHV0OwogICAgICAgIH0KICAgICAgICByZXR1cm4gbmZkX25ma2Qoc2VsZiwgaW5wdXQsIDEpOwogICAgfQogICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJpbnZhbGlkIG5vcm1hbGl6YXRpb24gZm9ybSIpOwogICAgcmV0dXJuIE5VTEw7Cn0KCi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi8qIHVuaWNvZGUgY2hhcmFjdGVyIG5hbWUgdGFibGVzICovCgovKiBkYXRhIGZpbGUgZ2VuZXJhdGVkIGJ5IFRvb2xzL3VuaWNvZGUvbWFrZXVuaWNvZGVkYXRhLnB5ICovCiNpbmNsdWRlICJ1bmljb2RlbmFtZV9kYi5oIgoKLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLyogZGF0YWJhc2UgY29kZSAoY3V0IGFuZCBwYXN0ZWQgZnJvbSB0aGUgdW5pZGIgcGFja2FnZSkgKi8KCnN0YXRpYyB1bnNpZ25lZCBsb25nCl9nZXRoYXNoKGNvbnN0IGNoYXIgKnMsIGludCBsZW4sIGludCBzY2FsZSkKewogICAgaW50IGk7CiAgICB1bnNpZ25lZCBsb25nIGggPSAwOwogICAgdW5zaWduZWQgbG9uZyBpeDsKICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgewogICAgICAgIGggPSAoaCAqIHNjYWxlKSArICh1bnNpZ25lZCBjaGFyKSBQeV9UT1VQUEVSKFB5X0NIQVJNQVNLKHNbaV0pKTsKICAgICAgICBpeCA9IGggJiAweGZmMDAwMDAwOwogICAgICAgIGlmIChpeCkKICAgICAgICAgICAgaCA9IChoIF4gKChpeD4+MjQpICYgMHhmZikpICYgMHgwMGZmZmZmZjsKICAgIH0KICAgIHJldHVybiBoOwp9CgpzdGF0aWMgY2hhciAqaGFuZ3VsX3N5bGxhYmxlc1tdWzNdID0gewogICAgeyAiRyIsICAiQSIsICAgIiIgICB9LAogICAgeyAiR0ciLCAiQUUiLCAgIkciICB9LAogICAgeyAiTiIsICAiWUEiLCAgIkdHIiB9LAogICAgeyAiRCIsICAiWUFFIiwgIkdTIiB9LAogICAgeyAiREQiLCAiRU8iLCAgIk4iLCB9LAogICAgeyAiUiIsICAiRSIsICAgIk5KIiB9LAogICAgeyAiTSIsICAiWUVPIiwgIk5IIiB9LAogICAgeyAiQiIsICAiWUUiLCAgIkQiICB9LAogICAgeyAiQkIiLCAiTyIsICAgIkwiICB9LAogICAgeyAiUyIsICAiV0EiLCAgIkxHIiB9LAogICAgeyAiU1MiLCAiV0FFIiwgIkxNIiB9LAogICAgeyAiIiwgICAiT0UiLCAgIkxCIiB9LAogICAgeyAiSiIsICAiWU8iLCAgIkxTIiB9LAogICAgeyAiSkoiLCAiVSIsICAgIkxUIiB9LAogICAgeyAiQyIsICAiV0VPIiwgIkxQIiB9LAogICAgeyAiSyIsICAiV0UiLCAgIkxIIiB9LAogICAgeyAiVCIsICAiV0kiLCAgIk0iICB9LAogICAgeyAiUCIsICAiWVUiLCAgIkIiICB9LAogICAgeyAiSCIsICAiRVUiLCAgIkJTIiB9LAogICAgeyAwLCAgICAiWUkiLCAgIlMiICB9LAogICAgeyAwLCAgICAiSSIsICAgIlNTIiB9LAogICAgeyAwLCAgICAwLCAgICAgIk5HIiB9LAogICAgeyAwLCAgICAwLCAgICAgIkoiICB9LAogICAgeyAwLCAgICAwLCAgICAgIkMiICB9LAogICAgeyAwLCAgICAwLCAgICAgIksiICB9LAogICAgeyAwLCAgICAwLCAgICAgIlQiICB9LAogICAgeyAwLCAgICAwLCAgICAgIlAiICB9LAogICAgeyAwLCAgICAwLCAgICAgIkgiICB9Cn07CgpzdGF0aWMgaW50CmlzX3VuaWZpZWRfaWRlb2dyYXBoKFB5X1VDUzQgY29kZSkKewogICAgcmV0dXJuICgKICAgICAgICAoMHgzNDAwIDw9IGNvZGUgJiYgY29kZSA8PSAweDREQjUpIHx8IC8qIENKSyBJZGVvZ3JhcGggRXh0ZW5zaW9uIEEgKi8KICAgICAgICAoMHg0RTAwIDw9IGNvZGUgJiYgY29kZSA8PSAweDlGQ0IpIHx8IC8qIENKSyBJZGVvZ3JhcGgsIFVuaWNvZGUgNS4yICovCiAgICAgICAgKDB4MjAwMDAgPD0gY29kZSAmJiBjb2RlIDw9IDB4MkE2RDYpIHx8IC8qIENKSyBJZGVvZ3JhcGggRXh0ZW5zaW9uIEIgKi8KICAgICAgICAoMHgyQTcwMCA8PSBjb2RlICYmIGNvZGUgPD0gMHgyQjczNCkpOyAgLyogQ0pLIElkZW9ncmFwaCBFeHRlbnNpb24gQyAqLwp9CgpzdGF0aWMgaW50Cl9nZXR1Y25hbWUoUHlPYmplY3QgKnNlbGYsIFB5X1VDUzQgY29kZSwgY2hhciogYnVmZmVyLCBpbnQgYnVmbGVuKQp7CiAgICBpbnQgb2Zmc2V0OwogICAgaW50IGk7CiAgICBpbnQgd29yZDsKICAgIHVuc2lnbmVkIGNoYXIqIHc7CgogICAgaWYgKGNvZGUgPj0gMHgxMTAwMDApCiAgICAgICAgcmV0dXJuIDA7CgogICAgaWYgKHNlbGYpIHsKICAgICAgICBjb25zdCBjaGFuZ2VfcmVjb3JkICpvbGQgPSBnZXRfb2xkX3JlY29yZChzZWxmLCBjb2RlKTsKICAgICAgICBpZiAob2xkLT5jYXRlZ29yeV9jaGFuZ2VkID09IDApIHsKICAgICAgICAgICAgLyogdW5hc3NpZ25lZCAqLwogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CiAgICB9CgogICAgaWYgKFNCYXNlIDw9IGNvZGUgJiYgY29kZSA8IFNCYXNlK1NDb3VudCkgewogICAgICAgIC8qIEhhbmd1bCBzeWxsYWJsZS4gKi8KICAgICAgICBpbnQgU0luZGV4ID0gY29kZSAtIFNCYXNlOwogICAgICAgIGludCBMID0gU0luZGV4IC8gTkNvdW50OwogICAgICAgIGludCBWID0gKFNJbmRleCAlIE5Db3VudCkgLyBUQ291bnQ7CiAgICAgICAgaW50IFQgPSBTSW5kZXggJSBUQ291bnQ7CgogICAgICAgIGlmIChidWZsZW4gPCAyNykKICAgICAgICAgICAgLyogV29yc3QgY2FzZTogSEFOR1VMIFNZTExBQkxFIDwxMGNoYXJzPi4gKi8KICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgc3RyY3B5KGJ1ZmZlciwgIkhBTkdVTCBTWUxMQUJMRSAiKTsKICAgICAgICBidWZmZXIgKz0gMTY7CiAgICAgICAgc3RyY3B5KGJ1ZmZlciwgaGFuZ3VsX3N5bGxhYmxlc1tMXVswXSk7CiAgICAgICAgYnVmZmVyICs9IHN0cmxlbihoYW5ndWxfc3lsbGFibGVzW0xdWzBdKTsKICAgICAgICBzdHJjcHkoYnVmZmVyLCBoYW5ndWxfc3lsbGFibGVzW1ZdWzFdKTsKICAgICAgICBidWZmZXIgKz0gc3RybGVuKGhhbmd1bF9zeWxsYWJsZXNbVl1bMV0pOwogICAgICAgIHN0cmNweShidWZmZXIsIGhhbmd1bF9zeWxsYWJsZXNbVF1bMl0pOwogICAgICAgIGJ1ZmZlciArPSBzdHJsZW4oaGFuZ3VsX3N5bGxhYmxlc1tUXVsyXSk7CiAgICAgICAgKmJ1ZmZlciA9ICdcMCc7CiAgICAgICAgcmV0dXJuIDE7CiAgICB9CgogICAgaWYgKGlzX3VuaWZpZWRfaWRlb2dyYXBoKGNvZGUpKSB7CiAgICAgICAgaWYgKGJ1ZmxlbiA8IDI4KQogICAgICAgICAgICAvKiBXb3JzdCBjYXNlOiBDSksgVU5JRklFRCBJREVPR1JBUEgtMjAwMDAgKi8KICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgc3ByaW50ZihidWZmZXIsICJDSksgVU5JRklFRCBJREVPR1JBUEgtJVgiLCBjb2RlKTsKICAgICAgICByZXR1cm4gMTsKICAgIH0KCiAgICAvKiBnZXQgb2Zmc2V0IGludG8gcGhyYXNlYm9vayAqLwogICAgb2Zmc2V0ID0gcGhyYXNlYm9va19vZmZzZXQxWyhjb2RlPj5waHJhc2Vib29rX3NoaWZ0KV07CiAgICBvZmZzZXQgPSBwaHJhc2Vib29rX29mZnNldDJbKG9mZnNldDw8cGhyYXNlYm9va19zaGlmdCkgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvZGUmKCgxPDxwaHJhc2Vib29rX3NoaWZ0KS0xKSldOwogICAgaWYgKCFvZmZzZXQpCiAgICAgICAgcmV0dXJuIDA7CgogICAgaSA9IDA7CgogICAgZm9yICg7OykgewogICAgICAgIC8qIGdldCB3b3JkIGluZGV4ICovCiAgICAgICAgd29yZCA9IHBocmFzZWJvb2tbb2Zmc2V0XSAtIHBocmFzZWJvb2tfc2hvcnQ7CiAgICAgICAgaWYgKHdvcmQgPj0gMCkgewogICAgICAgICAgICB3b3JkID0gKHdvcmQgPDwgOCkgKyBwaHJhc2Vib29rW29mZnNldCsxXTsKICAgICAgICAgICAgb2Zmc2V0ICs9IDI7CiAgICAgICAgfSBlbHNlCiAgICAgICAgICAgIHdvcmQgPSBwaHJhc2Vib29rW29mZnNldCsrXTsKICAgICAgICBpZiAoaSkgewogICAgICAgICAgICBpZiAoaSA+IGJ1ZmxlbikKICAgICAgICAgICAgICAgIHJldHVybiAwOyAvKiBidWZmZXIgb3ZlcmZsb3cgKi8KICAgICAgICAgICAgYnVmZmVyW2krK10gPSAnICc7CiAgICAgICAgfQogICAgICAgIC8qIGNvcHkgd29yZCBzdHJpbmcgZnJvbSBsZXhpY29uLiAgdGhlIGxhc3QgY2hhcmFjdGVyIGluIHRoZQogICAgICAgICAgIHdvcmQgaGFzIGJpdCA3IHNldC4gIHRoZSBsYXN0IHdvcmQgaW4gYSBzdHJpbmcgZW5kcyB3aXRoCiAgICAgICAgICAgMHg4MCAqLwogICAgICAgIHcgPSBsZXhpY29uICsgbGV4aWNvbl9vZmZzZXRbd29yZF07CiAgICAgICAgd2hpbGUgKCp3IDwgMTI4KSB7CiAgICAgICAgICAgIGlmIChpID49IGJ1ZmxlbikKICAgICAgICAgICAgICAgIHJldHVybiAwOyAvKiBidWZmZXIgb3ZlcmZsb3cgKi8KICAgICAgICAgICAgYnVmZmVyW2krK10gPSAqdysrOwogICAgICAgIH0KICAgICAgICBpZiAoaSA+PSBidWZsZW4pCiAgICAgICAgICAgIHJldHVybiAwOyAvKiBidWZmZXIgb3ZlcmZsb3cgKi8KICAgICAgICBidWZmZXJbaSsrXSA9ICp3ICYgMTI3OwogICAgICAgIGlmICgqdyA9PSAxMjgpCiAgICAgICAgICAgIGJyZWFrOyAvKiBlbmQgb2Ygd29yZCAqLwogICAgfQoKICAgIHJldHVybiAxOwp9CgpzdGF0aWMgaW50Cl9jbXBuYW1lKFB5T2JqZWN0ICpzZWxmLCBpbnQgY29kZSwgY29uc3QgY2hhciogbmFtZSwgaW50IG5hbWVsZW4pCnsKICAgIC8qIGNoZWNrIGlmIGNvZGUgY29ycmVzcG9uZHMgdG8gdGhlIGdpdmVuIG5hbWUgKi8KICAgIGludCBpOwogICAgY2hhciBidWZmZXJbTkFNRV9NQVhMRU5dOwogICAgaWYgKCFfZ2V0dWNuYW1lKHNlbGYsIGNvZGUsIGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlcikpKQogICAgICAgIHJldHVybiAwOwogICAgZm9yIChpID0gMDsgaSA8IG5hbWVsZW47IGkrKykgewogICAgICAgIGlmIChQeV9UT1VQUEVSKFB5X0NIQVJNQVNLKG5hbWVbaV0pKSAhPSBidWZmZXJbaV0pCiAgICAgICAgICAgIHJldHVybiAwOwogICAgfQogICAgcmV0dXJuIGJ1ZmZlcltuYW1lbGVuXSA9PSAnXDAnOwp9CgpzdGF0aWMgdm9pZApmaW5kX3N5bGxhYmxlKGNvbnN0IGNoYXIgKnN0ciwgaW50ICpsZW4sIGludCAqcG9zLCBpbnQgY291bnQsIGludCBjb2x1bW4pCnsKICAgIGludCBpLCBsZW4xOwogICAgKmxlbiA9IC0xOwogICAgZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKICAgICAgICBjaGFyICpzID0gaGFuZ3VsX3N5bGxhYmxlc1tpXVtjb2x1bW5dOwogICAgICAgIGxlbjEgPSBzdHJsZW4ocyk7CiAgICAgICAgaWYgKGxlbjEgPD0gKmxlbikKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgaWYgKHN0cm5jbXAoc3RyLCBzLCBsZW4xKSA9PSAwKSB7CiAgICAgICAgICAgICpsZW4gPSBsZW4xOwogICAgICAgICAgICAqcG9zID0gaTsKICAgICAgICB9CiAgICB9CiAgICBpZiAoKmxlbiA9PSAtMSkgewogICAgICAgICpsZW4gPSAwOwogICAgfQp9CgpzdGF0aWMgaW50Cl9nZXRjb2RlKFB5T2JqZWN0KiBzZWxmLCBjb25zdCBjaGFyKiBuYW1lLCBpbnQgbmFtZWxlbiwgUHlfVUNTNCogY29kZSkKewogICAgdW5zaWduZWQgaW50IGgsIHY7CiAgICB1bnNpZ25lZCBpbnQgbWFzayA9IGNvZGVfc2l6ZS0xOwogICAgdW5zaWduZWQgaW50IGksIGluY3I7CgogICAgLyogQ2hlY2sgZm9yIGhhbmd1bCBzeWxsYWJsZXMuICovCiAgICBpZiAoc3RybmNtcChuYW1lLCAiSEFOR1VMIFNZTExBQkxFICIsIDE2KSA9PSAwKSB7CiAgICAgICAgaW50IGxlbiwgTCA9IC0xLCBWID0gLTEsIFQgPSAtMTsKICAgICAgICBjb25zdCBjaGFyICpwb3MgPSBuYW1lICsgMTY7CiAgICAgICAgZmluZF9zeWxsYWJsZShwb3MsICZsZW4sICZMLCBMQ291bnQsIDApOwogICAgICAgIHBvcyArPSBsZW47CiAgICAgICAgZmluZF9zeWxsYWJsZShwb3MsICZsZW4sICZWLCBWQ291bnQsIDEpOwogICAgICAgIHBvcyArPSBsZW47CiAgICAgICAgZmluZF9zeWxsYWJsZShwb3MsICZsZW4sICZULCBUQ291bnQsIDIpOwogICAgICAgIHBvcyArPSBsZW47CiAgICAgICAgaWYgKEwgIT0gLTEgJiYgViAhPSAtMSAmJiBUICE9IC0xICYmIHBvcy1uYW1lID09IG5hbWVsZW4pIHsKICAgICAgICAgICAgKmNvZGUgPSBTQmFzZSArIChMKlZDb3VudCtWKSpUQ291bnQgKyBUOwogICAgICAgICAgICByZXR1cm4gMTsKICAgICAgICB9CiAgICAgICAgLyogT3RoZXJ3aXNlLCBpdCdzIGFuIGlsbGVnYWwgc3lsbGFibGUgbmFtZS4gKi8KICAgICAgICByZXR1cm4gMDsKICAgIH0KCiAgICAvKiBDaGVjayBmb3IgdW5pZmllZCBpZGVvZ3JhcGhzLiAqLwogICAgaWYgKHN0cm5jbXAobmFtZSwgIkNKSyBVTklGSUVEIElERU9HUkFQSC0iLCAyMikgPT0gMCkgewogICAgICAgIC8qIEZvdXIgb3IgZml2ZSBoZXhkaWdpdHMgbXVzdCBmb2xsb3cuICovCiAgICAgICAgdiA9IDA7CiAgICAgICAgbmFtZSArPSAyMjsKICAgICAgICBuYW1lbGVuIC09IDIyOwogICAgICAgIGlmIChuYW1lbGVuICE9IDQgJiYgbmFtZWxlbiAhPSA1KQogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB3aGlsZSAobmFtZWxlbi0tKSB7CiAgICAgICAgICAgIHYgKj0gMTY7CiAgICAgICAgICAgIGlmICgqbmFtZSA+PSAnMCcgJiYgKm5hbWUgPD0gJzknKQogICAgICAgICAgICAgICAgdiArPSAqbmFtZSAtICcwJzsKICAgICAgICAgICAgZWxzZSBpZiAoKm5hbWUgPj0gJ0EnICYmICpuYW1lIDw9ICdGJykKICAgICAgICAgICAgICAgIHYgKz0gKm5hbWUgLSAnQScgKyAxMDsKICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgIG5hbWUrKzsKICAgICAgICB9CiAgICAgICAgaWYgKCFpc191bmlmaWVkX2lkZW9ncmFwaCh2KSkKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgKmNvZGUgPSB2OwogICAgICAgIHJldHVybiAxOwogICAgfQoKICAgIC8qIHRoZSBmb2xsb3dpbmcgaXMgdGhlIHNhbWUgYXMgcHl0aG9uJ3MgZGljdGlvbmFyeSBsb29rdXAsIHdpdGgKICAgICAgIG9ubHkgbWlub3IgY2hhbmdlcy4gIHNlZSB0aGUgbWFrZXVuaWNvZGVkYXRhIHNjcmlwdCBmb3IgbW9yZQogICAgICAgZGV0YWlscyAqLwoKICAgIGggPSAodW5zaWduZWQgaW50KSBfZ2V0aGFzaChuYW1lLCBuYW1lbGVuLCBjb2RlX21hZ2ljKTsKICAgIGkgPSAofmgpICYgbWFzazsKICAgIHYgPSBjb2RlX2hhc2hbaV07CiAgICBpZiAoIXYpCiAgICAgICAgcmV0dXJuIDA7CiAgICBpZiAoX2NtcG5hbWUoc2VsZiwgdiwgbmFtZSwgbmFtZWxlbikpIHsKICAgICAgICAqY29kZSA9IHY7CiAgICAgICAgcmV0dXJuIDE7CiAgICB9CiAgICBpbmNyID0gKGggXiAoaCA+PiAzKSkgJiBtYXNrOwogICAgaWYgKCFpbmNyKQogICAgICAgIGluY3IgPSBtYXNrOwogICAgZm9yICg7OykgewogICAgICAgIGkgPSAoaSArIGluY3IpICYgbWFzazsKICAgICAgICB2ID0gY29kZV9oYXNoW2ldOwogICAgICAgIGlmICghdikKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgaWYgKF9jbXBuYW1lKHNlbGYsIHYsIG5hbWUsIG5hbWVsZW4pKSB7CiAgICAgICAgICAgICpjb2RlID0gdjsKICAgICAgICAgICAgcmV0dXJuIDE7CiAgICAgICAgfQogICAgICAgIGluY3IgPSBpbmNyIDw8IDE7CiAgICAgICAgaWYgKGluY3IgPiBtYXNrKQogICAgICAgICAgICBpbmNyID0gaW5jciBeIGNvZGVfcG9seTsKICAgIH0KfQoKc3RhdGljIGNvbnN0IF9QeVVuaWNvZGVfTmFtZV9DQVBJIGhhc2hBUEkgPQp7CiAgICBzaXplb2YoX1B5VW5pY29kZV9OYW1lX0NBUEkpLAogICAgX2dldHVjbmFtZSwKICAgIF9nZXRjb2RlCn07CgovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwovKiBQeXRob24gYmluZGluZ3MgKi8KClB5RG9jX1NUUlZBUih1bmljb2RlZGF0YV9uYW1lX19kb2NfXywKIm5hbWUodW5pY2hyWywgZGVmYXVsdF0pXG5cClJldHVybnMgdGhlIG5hbWUgYXNzaWduZWQgdG8gdGhlIFVuaWNvZGUgY2hhcmFjdGVyIHVuaWNociBhcyBhXG5cCnN0cmluZy4gSWYgbm8gbmFtZSBpcyBkZWZpbmVkLCBkZWZhdWx0IGlzIHJldHVybmVkLCBvciwgaWYgbm90XG5cCmdpdmVuLCBWYWx1ZUVycm9yIGlzIHJhaXNlZC4iKTsKCnN0YXRpYyBQeU9iamVjdCAqCnVuaWNvZGVkYXRhX25hbWUoUHlPYmplY3QqIHNlbGYsIFB5T2JqZWN0KiBhcmdzKQp7CiAgICBjaGFyIG5hbWVbTkFNRV9NQVhMRU5dOwogICAgUHlfVUNTNCBjOwoKICAgIFB5VW5pY29kZU9iamVjdCogdjsKICAgIFB5T2JqZWN0KiBkZWZvYmogPSBOVUxMOwogICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPIXxPOm5hbWUiLCAmUHlVbmljb2RlX1R5cGUsICZ2LCAmZGVmb2JqKSkKICAgICAgICByZXR1cm4gTlVMTDsKCiAgICBjID0gZ2V0dWNoYXIodik7CiAgICBpZiAoYyA9PSAoUHlfVUNTNCktMSkKICAgICAgICByZXR1cm4gTlVMTDsKCiAgICBpZiAoIV9nZXR1Y25hbWUoc2VsZiwgYywgbmFtZSwgc2l6ZW9mKG5hbWUpKSkgewogICAgICAgIGlmIChkZWZvYmogPT0gTlVMTCkgewogICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgIm5vIHN1Y2ggbmFtZSIpOwogICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIFB5X0lOQ1JFRihkZWZvYmopOwogICAgICAgICAgICByZXR1cm4gZGVmb2JqOwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgicyIsIG5hbWUpOwp9CgpQeURvY19TVFJWQVIodW5pY29kZWRhdGFfbG9va3VwX19kb2NfXywKImxvb2t1cChuYW1lKVxuXApcblwKTG9vayB1cCBjaGFyYWN0ZXIgYnkgbmFtZS4gIElmIGEgY2hhcmFjdGVyIHdpdGggdGhlXG5cCmdpdmVuIG5hbWUgaXMgZm91bmQsIHJldHVybiB0aGUgY29ycmVzcG9uZGluZyBVbmljb2RlXG5cCmNoYXJhY3Rlci4gIElmIG5vdCBmb3VuZCwgS2V5RXJyb3IgaXMgcmFpc2VkLiIpOwoKc3RhdGljIFB5T2JqZWN0ICoKdW5pY29kZWRhdGFfbG9va3VwKFB5T2JqZWN0KiBzZWxmLCBQeU9iamVjdCogYXJncykKewogICAgUHlfVUNTNCBjb2RlOwogICAgUHlfVU5JQ09ERSBzdHJbMl07CgogICAgY2hhciogbmFtZTsKICAgIGludCBuYW1lbGVuOwogICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzIzpsb29rdXAiLCAmbmFtZSwgJm5hbWVsZW4pKQogICAgICAgIHJldHVybiBOVUxMOwoKICAgIGlmICghX2dldGNvZGUoc2VsZiwgbmFtZSwgbmFtZWxlbiwgJmNvZGUpKSB7CiAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX0tleUVycm9yLCAidW5kZWZpbmVkIGNoYXJhY3RlciBuYW1lICclcyciLAogICAgICAgICAgICAgICAgICAgICBuYW1lKTsKICAgICAgICByZXR1cm4gTlVMTDsKICAgIH0KCiNpZm5kZWYgUHlfVU5JQ09ERV9XSURFCiAgICBpZiAoY29kZSA+PSAweDEwMDAwKSB7CiAgICAgICAgc3RyWzBdID0gMHhkODAwICsgKChjb2RlIC0gMHgxMDAwMCkgPj4gMTApOwogICAgICAgIHN0clsxXSA9IDB4ZGMwMCArICgoY29kZSAtIDB4MTAwMDApICYgMHgzZmYpOwogICAgICAgIHJldHVybiBQeVVuaWNvZGVfRnJvbVVuaWNvZGUoc3RyLCAyKTsKICAgIH0KI2VuZGlmCiAgICBzdHJbMF0gPSAoUHlfVU5JQ09ERSkgY29kZTsKICAgIHJldHVybiBQeVVuaWNvZGVfRnJvbVVuaWNvZGUoc3RyLCAxKTsKfQoKLyogWFhYIEFkZCBkb2Mgc3RyaW5ncy4gKi8KCnN0YXRpYyBQeU1ldGhvZERlZiB1bmljb2RlZGF0YV9mdW5jdGlvbnNbXSA9IHsKICAgIHsiZGVjaW1hbCIsIHVuaWNvZGVkYXRhX2RlY2ltYWwsIE1FVEhfVkFSQVJHUywgdW5pY29kZWRhdGFfZGVjaW1hbF9fZG9jX199LAogICAgeyJkaWdpdCIsIHVuaWNvZGVkYXRhX2RpZ2l0LCBNRVRIX1ZBUkFSR1MsIHVuaWNvZGVkYXRhX2RpZ2l0X19kb2NfX30sCiAgICB7Im51bWVyaWMiLCB1bmljb2RlZGF0YV9udW1lcmljLCBNRVRIX1ZBUkFSR1MsIHVuaWNvZGVkYXRhX251bWVyaWNfX2RvY19ffSwKICAgIHsiY2F0ZWdvcnkiLCB1bmljb2RlZGF0YV9jYXRlZ29yeSwgTUVUSF9WQVJBUkdTLAogICAgICAgICAgICAgICAgIHVuaWNvZGVkYXRhX2NhdGVnb3J5X19kb2NfX30sCiAgICB7ImJpZGlyZWN0aW9uYWwiLCB1bmljb2RlZGF0YV9iaWRpcmVjdGlvbmFsLCBNRVRIX1ZBUkFSR1MsCiAgICAgICAgICAgICAgICAgICAgICB1bmljb2RlZGF0YV9iaWRpcmVjdGlvbmFsX19kb2NfX30sCiAgICB7ImNvbWJpbmluZyIsIHVuaWNvZGVkYXRhX2NvbWJpbmluZywgTUVUSF9WQVJBUkdTLAogICAgICAgICAgICAgICAgICB1bmljb2RlZGF0YV9jb21iaW5pbmdfX2RvY19ffSwKICAgIHsibWlycm9yZWQiLCB1bmljb2RlZGF0YV9taXJyb3JlZCwgTUVUSF9WQVJBUkdTLAogICAgICAgICAgICAgICAgIHVuaWNvZGVkYXRhX21pcnJvcmVkX19kb2NfX30sCiAgICB7ImVhc3RfYXNpYW5fd2lkdGgiLCB1bmljb2RlZGF0YV9lYXN0X2FzaWFuX3dpZHRoLCBNRVRIX1ZBUkFSR1MsCiAgICAgICAgICAgICAgICAgICAgICAgICB1bmljb2RlZGF0YV9lYXN0X2FzaWFuX3dpZHRoX19kb2NfX30sCiAgICB7ImRlY29tcG9zaXRpb24iLCB1bmljb2RlZGF0YV9kZWNvbXBvc2l0aW9uLCBNRVRIX1ZBUkFSR1MsCiAgICAgICAgICAgICAgICAgICAgICB1bmljb2RlZGF0YV9kZWNvbXBvc2l0aW9uX19kb2NfX30sCiAgICB7Im5hbWUiLCB1bmljb2RlZGF0YV9uYW1lLCBNRVRIX1ZBUkFSR1MsIHVuaWNvZGVkYXRhX25hbWVfX2RvY19ffSwKICAgIHsibG9va3VwIiwgdW5pY29kZWRhdGFfbG9va3VwLCBNRVRIX1ZBUkFSR1MsIHVuaWNvZGVkYXRhX2xvb2t1cF9fZG9jX199LAogICAgeyJub3JtYWxpemUiLCB1bmljb2RlZGF0YV9ub3JtYWxpemUsIE1FVEhfVkFSQVJHUywKICAgICAgICAgICAgICAgICAgdW5pY29kZWRhdGFfbm9ybWFsaXplX19kb2NfX30sCiAgICB7TlVMTCwgTlVMTH0gICAgICAgICAgICAgICAgLyogc2VudGluZWwgKi8KfTsKCnN0YXRpYyBQeVR5cGVPYmplY3QgVUNEX1R5cGUgPSB7CiAgICAgICAgLyogVGhlIG9iX3R5cGUgZmllbGQgbXVzdCBiZSBpbml0aWFsaXplZCBpbiB0aGUgbW9kdWxlIGluaXQgZnVuY3Rpb24KICAgICAgICAgKiB0byBiZSBwb3J0YWJsZSB0byBXaW5kb3dzIHdpdGhvdXQgdXNpbmcgQysrLiAqLwogICAgICAgIFB5VmFyT2JqZWN0X0hFQURfSU5JVChOVUxMLCAwKQogICAgICAgICJ1bmljb2RlZGF0YS5VQ0QiLCAgICAgICAgICAgICAgLyp0cF9uYW1lKi8KICAgICAgICBzaXplb2YoUHJldmlvdXNEQlZlcnNpb24pLCAgICAgIC8qdHBfYmFzaWNzaXplKi8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2l0ZW1zaXplKi8KICAgICAgICAvKiBtZXRob2RzICovCiAgICAgICAgKGRlc3RydWN0b3IpUHlPYmplY3RfRGVsLCAvKnRwX2RlYWxsb2MqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfcHJpbnQqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfZ2V0YXR0ciovCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9zZXRhdHRyKi8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2NvbXBhcmUqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfcmVwciovCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9hc19udW1iZXIqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfYXNfc2VxdWVuY2UqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfYXNfbWFwcGluZyovCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9oYXNoKi8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2NhbGwqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfc3RyKi8KICAgICAgICBQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwvKnRwX2dldGF0dHJvKi8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX3NldGF0dHJvKi8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2FzX2J1ZmZlciovCiAgICAgICAgUHlfVFBGTEFHU19ERUZBVUxULCAgICAgLyp0cF9mbGFncyovCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9kb2MqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfdHJhdmVyc2UqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfY2xlYXIqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfcmljaGNvbXBhcmUqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfd2Vha2xpc3RvZmZzZXQqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfaXRlciovCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9pdGVybmV4dCovCiAgICAgICAgdW5pY29kZWRhdGFfZnVuY3Rpb25zLCAgLyp0cF9tZXRob2RzKi8KICAgICAgICBEQl9tZW1iZXJzLCAgICAgICAgICAgICAvKnRwX21lbWJlcnMqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfZ2V0c2V0Ki8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2Jhc2UqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfZGljdCovCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9kZXNjcl9nZXQqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfZGVzY3Jfc2V0Ki8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2RpY3RvZmZzZXQqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfaW5pdCovCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9hbGxvYyovCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9uZXcqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfZnJlZSovCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9pc19nYyovCn07CgpQeURvY19TVFJWQVIodW5pY29kZWRhdGFfZG9jc3RyaW5nLAoiVGhpcyBtb2R1bGUgcHJvdmlkZXMgYWNjZXNzIHRvIHRoZSBVbmljb2RlIENoYXJhY3RlciBEYXRhYmFzZSB3aGljaFxuXApkZWZpbmVzIGNoYXJhY3RlciBwcm9wZXJ0aWVzIGZvciBhbGwgVW5pY29kZSBjaGFyYWN0ZXJzLiBUaGUgZGF0YSBpblxuXAp0aGlzIGRhdGFiYXNlIGlzIGJhc2VkIG9uIHRoZSBVbmljb2RlRGF0YS50eHQgZmlsZSB2ZXJzaW9uXG5cCjUuMi4wIHdoaWNoIGlzIHB1YmxpY2FsbHkgYXZhaWxhYmxlIGZyb20gZnRwOi8vZnRwLnVuaWNvZGUub3JnLy5cblwKXG5cClRoZSBtb2R1bGUgdXNlcyB0aGUgc2FtZSBuYW1lcyBhbmQgc3ltYm9scyBhcyBkZWZpbmVkIGJ5IHRoZVxuXApVbmljb2RlRGF0YSBGaWxlIEZvcm1hdCA1LjIuMCAoc2VlXG5cCmh0dHA6Ly93d3cudW5pY29kZS5vcmcvcmVwb3J0cy90cjQ0L3RyNDQtNC5odG1sKS4iKTsKClB5TU9ESU5JVF9GVU5DCmluaXR1bmljb2RlZGF0YSh2b2lkKQp7CiAgICBQeU9iamVjdCAqbSwgKnY7CgogICAgUHlfVFlQRSgmVUNEX1R5cGUpID0gJlB5VHlwZV9UeXBlOwoKICAgIG0gPSBQeV9Jbml0TW9kdWxlMygKICAgICAgICAidW5pY29kZWRhdGEiLCB1bmljb2RlZGF0YV9mdW5jdGlvbnMsIHVuaWNvZGVkYXRhX2RvY3N0cmluZyk7CiAgICBpZiAoIW0pCiAgICAgICAgcmV0dXJuOwoKICAgIFB5TW9kdWxlX0FkZFN0cmluZ0NvbnN0YW50KG0sICJ1bmlkYXRhX3ZlcnNpb24iLCBVTklEQVRBX1ZFUlNJT04pOwogICAgUHlfSU5DUkVGKCZVQ0RfVHlwZSk7CiAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgIlVDRCIsIChQeU9iamVjdCopJlVDRF9UeXBlKTsKCiAgICAvKiBQcmV2aW91cyB2ZXJzaW9ucyAqLwogICAgdiA9IG5ld19wcmV2aW91c192ZXJzaW9uKCIzLjIuMCIsIGdldF9jaGFuZ2VfM18yXzAsIG5vcm1hbGl6YXRpb25fM18yXzApOwogICAgaWYgKHYgIT0gTlVMTCkKICAgICAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgInVjZF8zXzJfMCIsIHYpOwoKICAgIC8qIEV4cG9ydCBDIEFQSSAqLwogICAgdiA9IFB5Q2Fwc3VsZV9OZXcoKHZvaWQgKikmaGFzaEFQSSwgUHlVbmljb2RlRGF0YV9DQVBTVUxFX05BTUUsIE5VTEwpOwogICAgaWYgKHYgIT0gTlVMTCkKICAgICAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgInVjbmhhc2hfQ0FQSSIsIHYpOwp9CgovKgpMb2NhbCB2YXJpYWJsZXM6CmMtYmFzaWMtb2Zmc2V0OiA0CmluZGVudC10YWJzLW1vZGU6IG5pbApFbmQ6CiovCg==