IyEvYmluL2Jhc2gKIyBXSU5FIEluc3RhbGxhdGlvbiBzY3JpcHQKIyBDYW4gZG8gYWxtb3N0IGV2ZXJ5dGhpbmcgZnJvbSBjb21waWxpbmcgdG8gY29uZmlndXJpbmcuLi4KIwojIENvcHlyaWdodCAxOTk5IE92ZSBL5XZlbgojCiMgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgojIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKIyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKIyB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KIwojIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAojIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKIyBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgojCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwojIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCiMKCiMtLS0gZGVmYXVsdHMgKGNoYW5nZSB0aGVzZSBpZiB5b3UgYXJlIGEgcGFja2FnZXIpCkNPTkZBUkdTPSIiICAgICAgICAgICAgICAgICAgICMgY29uZmlndXJlIGFyZ3MsIGUuZy4gLS1wcmVmaXg9L3VzciAtLXN5c2NvbmZkaXI9L2V0YwpwcmVmaXg9L3Vzci9sb2NhbCAgICAgICAgICAgICAjIGluc3RhbGxhdGlvbiBwcmVmaXgKc3lzY29uZmRpcj0kcHJlZml4L2V0YyAgICAgICAgIyB3aGVyZSB3aW5lLmNvbmYgYW5kIHRoZSBnbG9iYWwgcmVnaXN0cnkgYXJlIHN1cHBvc2VkIHRvIGJlCmJpbmRpcj0kcHJlZml4L2JpbiAgICAgICAgICAgICMgd2hlcmUgd2luZWxpYiBhcHBzIHdpbGwgYmUgKG9yIGFyZSkgaW5zdGFsbGVkCmxpYmRpcj0kcHJlZml4L2xpYiAgICAgICAgICAgICMgd2hlcmUgbGlid2luZS5zbyB3aWxsIGJlIChvciBpcykgaW5zdGFsbGVkCmV4ZGlyPWRvY3VtZW50YXRpb24vc2FtcGxlcyAgICMgd2hlcmUgdGhlIHNhbXBsZSBzeXN0ZW0uaW5pIHJlc2lkZXMKTENPTkY9fi8ud2luZS9jb25maWcgICAgICAgICAgIyBkZWZhdWx0IHBhdGggb2YgdGhlIGxvY2FsIGNvbmZpZyBmaWxlCkJJTkRJU1Q9bm8gICAgICAgICAgICAgICAgICAgICMgd2hldGhlciBjYWxsZWQgZnJvbSBhIGJpbmFyeSBwYWNrYWdlIGNvbmZpZyBzY3JpcHQKRE9MT0NBTENPTkY9YXV0byAgICAgICAgICAgICAgIyB3aGV0aGVyIHRvIGF1dG9nZW5lcmF0ZSBsb2NhbGNvbmYKRE9XQ0hLPWF1dG8gICAgICAgICAgICAgICAgICAgIyB3aGV0aGVyIHRvIGF1dG9jb25maWd1cmUgZXhpc3Rpbmctd2luZG93cyBpbnN0YWxsYXRpb24KRE9XSU5FPWF1dG8gICAgICAgICAgICAgICAgICAgIyB3aGV0aGVyIHRvIGF1dG9jb25maWd1cmUgbm8td2luZG93cyBpbnN0YWxsYXRpb24KRE9SRUc9YXV0byAgICAgICAgICAgICAgICAgICAgIyB3aGV0aGVyIHRvIGluc3RhbGwgZGVmYXVsdCByZWdpc3RyeQpET0FQUD1hdXRvICAgICAgICAgICAgICAgICAgICAjIHdoZXRoZXIgdG8gaW5zdGFsbCBhcHBsaWNhdGlvbnMsIGRpc3RyaWJ1dGVkIHdpdGggV2luZQpTWVNSRUc9eWVzICAgICAgICAgICAgICAgICAgICAjIHdoZXRoZXIgdG8gbWFrZSByb290J3MgcmVnaXN0cnkgZ2xvYmFsIChzeXN0ZW0tZGVmYXVsdCkKCiMgdGhpcyBpcyBvbmx5IGZvciBleGlzdGluZy13aW5kb3dzIGluc3RhbGxzCldJTkVDT05GPXRvb2xzL3dpbmVjb25mICAgICAgICMgcGF0aCB0byB0aGUgd2luZWNvbmYgcGVybCBzY3JpcHQKCiMgdGhpcyBpcyBvbmx5IGZvciBuby13aW5kb3dzIGluc3RhbGxzCldJTkVJTkk9JGV4ZGlyL2NvbmZpZyAgICAgICAgICMgcGF0aCB0byB0aGUgZGVmYXVsdCB3aW5lIGNvbmZpZyBmaWxlIChhbHNvIHVzZWQgYnkgd2luZWNvbmYpCiMgQ1JPT1Q9L3Zhci93aW5lICAgICAgICAgICAgICMgcGF0aCBvZiB0aGUgZmFrZSBEcml2ZSBDIChhc2tzIHVzZXIgaWYgbm90IHNldCkKIy0tLSBlbmQgb2YgZGVmYXVsdHMKCiMgdGVtcG9yYXJ5IGZpbGVzIHVzZWQgYnkgdGhlIGluc3RhbGxlcgpUTVBDT05GPS90bXAvd2luZWluc3RhbGwuY29uZgoKIyBmdW5jdGlvbnMKCmZ1bmN0aW9uIHN0ZF9zbGVlcCB7CiAgc2xlZXAgMQp9CgpmdW5jdGlvbiBjb25mX3F1ZXN0aW9uIHsKICAjIHBhcmFtZXRlcnM6ICQxID0gaW1wb3J0YW5jZSwgJDIgPSBxdWVzdGlvbi1pZCwgJDMrID0gbWVzc2FnZSBsaW5lcwogICMgdGhlIGZpcnN0IHR3byBwYXJhbWV0ZXJzIGNhbiBiZSB1c2VkIGJ5IGUuZy4gZGViY29uZiBpbiBkZWJpYW4gcGFja2FnZXMKICAjIGJ1dCBoZXJlIHdlIGp1c3QgcHJpbnQgdGhlIG1lc3NhZ2UKICBzaGlmdCAyCiAgZWNobwogIGxvY2FsIExJTkU9IiQxIgogIHdoaWxlIFsgJCMgLWd0IDAgXSAmJiBzaGlmdAogIGRvIHsKICAgIGVjaG8gIiRMSU5FIgogICAgTElORT0iJDEiCiAgfQogIGRvbmUKfQoKZnVuY3Rpb24gY29uZl9yZXNldF9xdWVzdGlvbiB7CiAgIyBwYXJhbWV0ZXJzOiAkMSA9IHF1ZXN0aW9uLWlkCiAgIyB0aGlzIGlzIHVzZWQgdG8gZmx1c2ggYW55IGNhY2hlZCBhbnN3ZXJzIGFuZCAiYWxyZWFkeS1kaXNwbGF5ZWQiIGZsYWdzCiAgc2hpZnQgIyBkdW1teSBjb21tYW5kCn0KCmZ1bmN0aW9uIGNvbmZfeWVzbm9fYW5zd2VyIHsKICB1bnNldCBBTlNXRVIKICB3aGlsZSBbICIkQU5TV0VSIiAhPSAneWVzJyBdICYmIFsgIiRBTlNXRVIiICE9ICdubycgXQogIGRvIHsKICAgIGVjaG8gLW4gIiQxIgogICAgcmVhZCBBTlNXRVIKICB9CiAgZG9uZQp9CgpmdW5jdGlvbiBjb25mX3N0cmluZ19hbnN3ZXIgewogIGVjaG8gLW4gIiQxIgogIHJlYWQgQU5TV0VSCn0KCiMgc3RhcnR1cC4uLgoKZWNobyAiV0lORSBJbnN0YWxsZXIgdjAuNzQiCmVjaG8KCmlmIFsgIiRCSU5ESVNUIiA9ICdubycgXQp0aGVuIHsKCiAgaWYgISBbIC1mIGNvbmZpZ3VyZSBdCiAgdGhlbiB7CiAgICBpZiBbIC1mIC4uL2NvbmZpZ3VyZSBdCiAgICB0aGVuIHsKICAgICAgcHVzaGQgLi4KICAgIH0KICAgIGVsc2UgewogICAgICBlY2hvICJZb3UncmUgcnVubmluZyB0aGlzIGZyb20gdGhlIHdyb25nIGRpcmVjdG9yeS4iCiAgICAgIGVjaG8gIkNoYW5nZSB0byB0aGUgV2luZSBzb3VyY2UncyBtYWluIGRpcmVjdG9yeSBhbmQgdHJ5IGFnYWluLiIKICAgICAgZXhpdCAxCiAgICB9CiAgICBmaQogIH0KICBmaQoKICBpZiBbIGB3aG9hbWlgID0gJ3Jvb3QnIF0KICB0aGVuIHsKICAgIGVjaG8gIllvdSBhcmUgcnVubmluZyB3aW5laW5zdGFsbCBhcyByb290LCB0aGlzIGlzIG5vdCBhZHZpc2FibGUuIFBsZWFzZSByZXJ1biBhcyBhIHVzZXIuIgogICAgZWNobyAiQWJvcnRpbmcuIgogICAgZXhpdCAxCiAgfQogIGZpCgogIGlmIFsgISAtdyAuIF0KICB0aGVuIHsKICAgIGVjaG8gIlRoZSBzb3VyY2UgZGlyZWN0b3J5IGlzIG5vdCB3cml0YWJsZS4gWW91IHByb2JhYmx5IGV4dHJhY3RlZCB0aGUgc291cmNlcyBhcyByb290LiIKICAgIGVjaG8gIllvdSBzaG91bGQgcmVtb3ZlIHRoZSBzb3VyY2UgdHJlZSBhbmQgZXh0cmFjdCBpdCBhZ2FpbiBhcyBhIG5vcm1hbCB1c2VyLiIKICAgIGV4aXQgMQogIH0KICBmaQoKICAjIGNoZWNrIHdoZXRoZXIgUlBNIGluc3RhbGxlZCwgYW5kIGlmIGl0IGlzLCByZW1vdmUgYW55IG9sZCB3aW5lIHJwbS4KICBoYXNoIHJwbSAmPi9kZXYvbnVsbAogIFJFVD0kPwogIGlmIFsgJFJFVCAtZXEgMCBdOyB0aGVuCiAgICBpZiBbIC1uICJgcnBtIC1xaSB3aW5lIDI+L2Rldi9udWxsfGdyZXAgIl5OYW1lImAiIF07IHRoZW4KICAgICAgZWNobyAiV2FybmluZzogT2xkIFdpbmUgUlBNIGluc3RhbGwgZGV0ZWN0ZWQuIERvIHlvdSB3YW50IHRvIHJlbW92ZSBpdCBmaXJzdD8iCiAgICAgIGNvbmZfeWVzbm9fYW5zd2VyICIoeWVzL25vKSAiCiAgICAgIGlmIFsgIiRBTlNXRVIiID0gJ3llcycgXTsgdGhlbgogICAgICAgIGVjaG8gIldlIG5lZWQgdG8gcmVtb3ZlIHRoZSBycG0gYXMgcm9vdCwgcGxlYXNlIGVudGVyIHlvdXIgcm9vdCBwYXNzd29yZCIKICAgICAgICBlY2hvCiAgICAgICAgZWNobyBTdGFydGluZyB3aW5lIHJwbSByZW1vdmFsLi4uCiAgICAgICAgc3UgLWMgInJwbSAtZSB3aW5lOyBSRVQ9JD8iCiAgICAgICAgaWYgWyAkUkVUIC1lcSAwIF07IHRoZW4KICAgICAgICAgIGVjaG8gRG9uZS4KICAgICAgICBlbHNlCiAgICAgICAgICBlY2hvICJGQUlMRUQuIFByb2JhYmx5IHlvdSBhcmVuJ3QgaW5zdGFsbGluZyBhcyByb290LiIKICAgICAgICAgIGVjaG8gIkV4cGVjdCBwcm9ibGVtcyAobGlicmFyeSBjb25mbGljdHMgd2l0aCBleGlzdGluZyBpbnN0YWxsIGV0Yy4pLiIKICAgICAgICBmaQogICAgICBlbHNlCiAgICAgICAgZWNobyAiU29ycnksIEkgd29uJ3QgaW5zdGFsbCBXaW5lIHdoZW4gYW4gcnBtIHZlcnNpb24gaXMgc3RpbGwgaW5zdGFsbGVkLiIKICAgICAgICBlY2hvICIoV2luZSBzdXBwb3J0IHN1ZmZlcmVkIGZyb20gd2F5IHRvbyBtYW55IGNvbmZsaWN0cyBiZXR3ZWVuIFJQTSIKICAgICAgICBlY2hvICJhbmQgc291cmNlIGluc3RhbGxzKSIKICAgICAgICBlY2hvICJIYXZlIGEgbmljZSBkYXkgISIKICAgICAgICBleGl0IDEKICAgICAgZmkKICAgIGZpCiAgZmkKCiAgIyBjaGVjayB3aGV0aGVyIHdpbmUgYmluYXJ5IHN0aWxsIGF2YWlsYWJsZQogIGlmIFsgLW4gImB3aGljaCB3aW5lIDI+L2Rldi9udWxsfGdyZXAgJy93aW5lJ2AiIF07IHRoZW4KICAgIGVjaG8gIldhcm5pbmcgISEgd2luZSBiaW5hcnkgKHN0aWxsKSBmb3VuZCwgd2hpY2ggbWF5IGluZGljYXRlIgogICAgZWNobyAiYSAoY29uZmxpY3RpbmcpIHByZXZpb3VzIGluc3RhbGxhdGlvbi4iCiAgICBlY2hvICJZb3UgbWlnaHQgd2FudCB0byBhYm9ydCBhbmQgdW5pbnN0YWxsIFdpbmUgZmlyc3QuIgogICAgZWNobyAiKElmIHlvdSBwcmV2aW91c2x5IHRyaWVkIHRvIGluc3RhbGwgZnJvbSBzb3VyY2UgbWFudWFsbHksICIKICAgIGVjaG8gInJ1biAnbWFrZSB1bmluc3RhbGwnIGZyb20gdGhlIHdpbmUgcm9vdCBkaXJlY3RvcnkpIgogICAgc3RkX3NsZWVwCiAgZmkKCiAgIyBydW4gdGhlIGNvbmZpZ3VyZSBzY3JpcHQsIGlmIG5lY2Vzc2FyeQoKICBpZiBbIC1mIGNvbmZpZy5jYWNoZSBdICYmIFsgLWYgTWFrZWZpbGUgXSAmJiBbIE1ha2VmaWxlIC1udCBjb25maWd1cmUgXQogIHRoZW4gewogICAgZWNobwogICAgZWNobyAiSSBzZWUgdGhhdCBXSU5FIGhhcyBhbHJlYWR5IGJlZW4gY29uZmlndXJlZCwgc28gSSdsbCBza2lwIHRoYXQuIgogICAgc3RkX3NsZWVwCiAgICAjIGxvYWQgY29uZmlndXJlIHJlc3VsdHMKICAgIC4gLi9jb25maWcuY2FjaGUKICB9CiAgZWxzZSB7CiAgICBlY2hvICJSdW5uaW5nIGNvbmZpZ3VyZS4uLiIKICAgIGVjaG8KICAgIGlmICEgLi9jb25maWd1cmUgLUMgJENPTkZBUkdTIC0tcHJlZml4PSRwcmVmaXgKICAgIHRoZW4gewogICAgICBlY2hvCiAgICAgIGVjaG8gIkNvbmZpZ3VyZSBmYWlsZWQsIGFib3J0aW5nIGluc3RhbGwuIgogICAgICBybSAtZiBjb25maWcuY2FjaGUKICAgICAgZXhpdCAxCiAgICB9CiAgICBmaQogICAgIyBsb2FkIGNvbmZpZ3VyZSByZXN1bHRzCiAgICAuIC4vY29uZmlnLmNhY2hlCiAgICAjIG1ha2Ugc3VyZSBYIHdhcyBmb3VuZAogICAgZXZhbCAiJGFjX2N2X2hhdmVfeCIKICAgIGlmIFsgIiRoYXZlX3giICE9ICJ5ZXMiIF0KICAgIHRoZW4gewogICAgICBlY2hvICJJbnN0YWxsIHRoZSBYIGRldmVsb3BtZW50IGhlYWRlcnMgYW5kIHRyeSBhZ2Fpbi4iCiAgICAgIHJtIC1mIGNvbmZpZy5jYWNoZQogICAgICBleGl0IDEKICAgIH0KICAgIGZpCiAgfQogIGZpCgogICMgbm93IGRvIHRoZSBjb21waWxhdGlvbiBhbmQgaW5zdGFsbCwgd2UgbmVlZCB0byBhbHdheXMgZG8gdGhpcyBiZWNhdXNlIHdlCiAgIyBkb24ndCB3YW50IHRoZSAnbWFrZSBpbnN0YWxsJyBjb21tYW5kIHdlIG1pZ2h0IHJ1biB0byBydW4gJ21ha2UnIGFzIHJvb3QKICBpZiBbIGB3aG9hbWlgICE9ICdyb290JyBdCiAgdGhlbiB7CiAgICAjIGFzayB0aGUgdXNlciBpZiB0aGV5IHdhbnQgdG8gYnVpbGQgYW5kIGluc3RhbGwgd2luZQogICAgZWNobwogICAgZWNobyAiV2UgbmVlZCB0byBpbnN0YWxsIHdpbmUgYXMgcm9vdCB1c2VyLCBkbyB5b3Ugd2FudCB1cyB0byBidWlsZCB3aW5lLCIKICAgIGVjaG8gIidzdSByb290JyBhbmQgaW5zdGFsbCBXaW5lPyAgRW50ZXIgJ25vJyB0byBjb250aW51ZSB3aXRob3V0IGluc3RhbGxpbmciCiAgICBjb25mX3llc25vX2Fuc3dlciAiKHllcy9ubykgIgogICAgUk9PVElOU1RBTEw9IiRBTlNXRVIiCgogICAgaWYgWyAiJFJPT1RJTlNUQUxMIiA9ICJ5ZXMiIF0KICAgIHRoZW4gewogICAgICAjIHN0YXJ0IG91dCB3aXRoIHRoZSBiYXNpYyBjb21tYW5kCiAgICAgIHN1Y29tbWFuZD0ibWFrZSBpbnN0YWxsIgoKICAgICAgIyBpZiB0aGUgdXNlciBkb2Vzbid0IGhhdmUgJGxpYmRpciBpbiB0aGVpciBsZC5zby5jb25mIGFkZCB0aGlzCiAgICAgICMgdG8gb3VyIHN1Y29tbWFuZCBzdHJpbmcKICAgICAgaWYgWyAtZiAvZXRjL2xkLnNvLmNvbmYgXQogICAgICB0aGVuCiAgICAgICAgaWYgISBncmVwIC1zICIkbGliZGlyIiAvZXRjL2xkLnNvLmNvbmYgPi9kZXYvbnVsbCAyPiYxCiAgICAgICAgdGhlbiB7CiAgICAgICAgICBlY2hvCiAgICAgICAgICBlY2hvICIkbGliZGlyIGRvZXNuJ3QgZXhpc3QgaW4geW91ciAvZXRjL2xkLnNvLmNvbmYsIGl0IHdpbGwgYmUgYWRkZWQiCiAgICAgICAgICBlY2hvICJ3aGVuIHdlIHBlcmZvcm0gdGhlIGluc3RhbGwuLi4iCiAgICAgICAgICBzdWNvbW1hbmQ9IiRzdWNvbW1hbmQ7ZWNobyAkbGliZGlyPj4vZXRjL2xkLnNvLmNvbmYiCiAgICAgICAgfQogICAgICAgIGZpCiAgICAgICAgIyBydW4gbGRjb25maWcgYWx3YXlzIGp1c3QgaW4gY2FzZSBzb21lIHVwZGF0ZWQgZmlsZXMgZG9uJ3QgZ2V0IGxpbmtlZAogICAgICAgIHN1Y29tbWFuZD0iJHN1Y29tbWFuZDskYWNfY3ZfcGF0aF9MRENPTkZJRyIKICAgICAgZmkKICAgIH0KICAgIGZpICMgWyAiJFJPT1RJTlNUQUxMIiA9ICJ5ZXMiIF0KCiAgICBlY2hvCgogICAgZWNobyAiQ29tcGlsaW5nIFdJTkUuIEdyYWIgYSBsdW5jaCBvciB0d28sIHJlbnQgYSB2aWRlbywgb3Igd2hhdGV2ZXIsIgogICAgZWNobyAiaW4gdGhlIG1lYW50aW1lLi4uIgogICAgZWNobwogICAgc3RkX3NsZWVwCgogICAgIyB0cnkgdG8ganVzdCBtYWtlIHdpbmUsIGlmIHRoaXMgZmFpbHMgJ21ha2UgZGVwZW5kJyBhbmQgdHJ5IHRvIHJlbWFrZQogICAgaWYgISB7IG1ha2U7IH0KICAgIHRoZW4gewogICAgICBpZiAhIHsgbWFrZSBkZXBlbmQgJiYgbWFrZTsgfQogICAgICB0aGVuIHsKICAgICAgICBlY2hvCiAgICAgICAgZWNobyAiQ29tcGlsYXRpb24gZmFpbGVkLCBhYm9ydGluZyBpbnN0YWxsLiIKICAgICAgICBleGl0IDEKICAgICAgfQogICAgICBmaQogICAgfQogICAgZmkKCiAgICBpZiBbICIkUk9PVElOU1RBTEwiID0gInllcyIgXQogICAgdGhlbiB7CiAgICAgIGVjaG8KCiAgICAgIGVjaG8gIlBlcmZvcm1pbmcgJ21ha2UgaW5zdGFsbCcgYXMgcm9vdCB0byBpbnN0YWxsIGJpbmFyaWVzLCBlbnRlciByb290IHBhc3N3b3JkIgoKICAgICAgc3RkX3NsZWVwCgogICAgICBpZiAhIHN1IHJvb3QgLWMgIiRzdWNvbW1hbmQiCiAgICAgIHRoZW4gewogICAgICAJaWYgISBzdSByb290IC1jICIkc3Vjb21tYW5kIgogICAgICAgIHRoZW4gewogICAgICAJICAgICBlY2hvCiAgICAgICAgICAgICBlY2hvICJFaXRoZXIgeW91IGVudGVyZWQgYW4gaW5jb3JyZWN0IHBhc3N3b3JkIG9yIHdlIGZhaWxlZCB0byIKICAgICAgICAgICAgIGVjaG8gInJ1biAnJHN1Y29tbWFuZCcgY29ycmVjdGx5LiIKICAgICAgICAgICAgIGVjaG8gIklmIHlvdSBkaWRuJ3QgZW50ZXIgYW4gaW5jb3JyZWN0IHBhc3N3b3JkIHRoZW4gcGxlYXNlIgogICAgICAgICAgICAgZWNobyAicmVwb3J0IHRoaXMgZXJyb3IgYW5kIGFueSBzdGVwcyB0byBwb3NzaWJseSByZXByb2R1Y2UgaXQgdG8iCiAgICAgICAgICAgICBlY2hvICJodHRwOi8vYnVncy53aW5laHEub3JnLyIKICAgICAgICAgICAgIGVjaG8KICAgICAgICAgICAgIGVjaG8gIkluc3RhbGxhdGlvbiBmYWlsZWQsIGFib3J0aW5nLiIKICAgICAgICAgICAgIGV4aXQgMQogICAgICAgICB9CiAgICAgICAgIGZpCiAgICAgICB9CiAgICAgIGZpCgogICAgICBlY2hvCgogICAgICAjIHNlZSBpZiB3aW5lIGlzIGluc3RhbGxlZCBvbiB0aGUgdXNlcnMgc3lzdGVtLCBpZiBub3QgcHJvbXB0IHRoZW0KICAgICAgIyBhbmQgdGhlbiBleGl0CiAgICAgIGlmIFsgISBgd2hpY2ggd2luZWAgXQogICAgICB0aGVuCiAgICAgICAgZWNobyAiQ291bGQgbm90IGZpbmQgd2luZSBvbiB5b3VyIHN5c3RlbS4gIFJ1biB3aW5laW5zdGFsbCBhcyByb290IHRvIGluc3RhbGwgd2luZSIKICAgICAgICBlY2hvICJiZWZvcmUgcmUtcnVubmluZyB3aW5laW5zdGFsbCBhcyBhIHVzZXIuIgogICAgICAgIGVjaG8KICAgICAgICBlY2hvICJFeGl0aW5nIHdpbmVpbnN0YWxsIgogICAgICAgIGV4aXQgMTsKICAgICAgZmkKCiAgICAgIFdJTkVJTlNUQUxMRUQ9eWVzCiAgICB9CiAgICBlbHNlIHsKICAgICAgV0lORUlOU1RBTExFRD1ubwogICAgfQogICAgZmkgIyBbICIkUk9PVElOU1RBTEwiID0gInllcyIgXQogIH0KICBmaSAjIFsgYHdob2FtaWAgIT0gJ3Jvb3QnIF0KCn0KZmkgIyBCSU5ESVNUCgojIG5vdyBjaGVjayB3aGV0aGVyIHdlIHNob3VsZCBnZW5lcmF0ZSB3aW5lLmNvbmYKaWYgWyAiJERPTE9DQUxDT05GIiA9ICdhdXRvJyBdCnRoZW4gewogICMgc2VlIGlmIHRoZSB1c2VyIGlzIHJvb3QsIGlmIHNvLCBleHBsaWNpdGx5IGFzayB0aGVtIGlmIHRoZXkgd2FudCBhCiAgIyBsb2NhbCBjb25maWcgZmlsZQogIGlmIFsgYHdob2FtaWAgPSAncm9vdCcgXQogIHRoZW4KICAgIGVjaG8gIllvdSBhcmUgcnVubmluZyBhcyByb290LiAgRG8geW91IHdhbnQgYSBsb2NhbCBjb25maWcgZmlsZSwiCiAgICBlY2hvICJmaWxlLCB+Ly53aW5lL2NvbmZpZywgY3JlYXRlZD8iCiAgICBjb25mX3llc25vX2Fuc3dlciAiKHllcy9ubykgIgogICAgRE9MT0NBTENPTkY9IiRBTlNXRVIiCiAgZWxzZQogICAgIyBpZiB0aGUgdXNlciBoYXMgYW4gZXhpc3RpbmcgY29uZmlnIGZpbGUgYXNrIHRoZW0gaWYgdGhleSB3YW50IHVzIHRvCiAgICAjIG92ZXJ3cml0ZSBpdCwgb3RoZXJ3aXNlIGp1c3QgYXNrIHRoZW0gaWYgdGhleSB3YW50IHRvIGNyZWF0ZSBvbmUKICAgIGlmIFsgLWYgIiRMQ09ORiIgXQogICAgdGhlbgogICAgICBlY2hvICJGb3VuZCBleGlzdGluZyAkTENPTkYsIGRvIHlvdSB3YW50IHRvIG92ZXJ3cml0ZSB0aGlzIgogICAgICBlY2hvICJleGlzdGluZyBXaW5lIGNvbmZpZ3VyYXRpb24gZmlsZT8iCiAgICAgIGNvbmZfeWVzbm9fYW5zd2VyICIoeWVzL25vKSAiCiAgICAgIERPTE9DQUxDT05GPSIkQU5TV0VSIgogICAgICBlY2hvCiAgICAgIGlmIFsgIiRBTlNXRVIiID0gInllcyIgXQogICAgICB0aGVuCiAgICAgIHsKICAgICAgICBlY2hvICJXb3VsZCB5b3UgbGlrZSB0byBtYWtlIGEgYmFja3VwIG9mIHRoaXMgb2xkIGNvbmZpZyBmaWxlPyIKICAgICAgICBjb25mX3llc25vX2Fuc3dlciAiKHllcy9ubykgIgogICAgICAgIGVjaG8KICAgICAgICBpZiBbICIkQU5TV0VSIiA9ICJ5ZXMiIF0KICAgICAgICB0aGVuCiAgICAgICAgewogICAgICAgICAgZWNobyAiUmVuYW1pbmcgJExDT05GIHRvICRMQ09ORi5vbGQiCiAgICAgICAgICBtdiAtZiAiJExDT05GIiAiJExDT05GLm9sZCIKICAgICAgICAgIGVjaG8KICAgICAgICB9CiAgICAgICAgZmkKICAgICAgfQogICAgICBmaQogICAgZWxzZQogICAgewogICAgICBlY2hvICJDcmVhdGUgbG9jYWwgY29uZmlnIGZpbGUgfi8ud2luZS9jb25maWc/IgogICAgICBjb25mX3llc25vX2Fuc3dlciAiKHllcy9ubykgIgogICAgICBET0xPQ0FMQ09ORj0iJEFOU1dFUiIKICAgICAgZWNobwogICAgICBpZiBbICIkQU5TV0VSIiA9ICdubycgXQogICAgICB0aGVuCiAgICAgICAgY29uZl9xdWVzdGlvbiBoaWdoIG5lZWRfcm9vdCBcCiAgICAgICAgICAiQWJvcnRpbmcgaW5zdGFsbC4gVHJ5IGFnYWluIGFzIHJvb3QgdG8gZ2VuZXJhdGUgYSBzeXN0ZW0gd2luZS5jb25mLiIKICAgICAgICBleGl0IDEKICAgICAgZmkKICAgIH0KICAgIGZpCiAgZmkKfQpmaQoKIyBnZW5lcmF0ZSAkVE1QQ09ORiBmcm9tIGV4aXN0aW5nIHdpbmRvd3MgaW5zdGFsbCwgaWYgYW55CmlmIFsgIiRET0xPQ0FMQ09ORiIgPSAneWVzJyBdCnRoZW4gewogIGlmIFsgIiRET1dDSEsiID0gJ3llcycgXSB8fCBbICIkRE9XQ0hLIiA9ICdhdXRvJyBdCiAgdGhlbiB7CiAgICBlY2hvIC1uICJTZWFyY2hpbmcgZm9yIGFuIGV4aXN0aW5nIFdpbmRvd3MgaW5zdGFsbGF0aW9uLi4uIgogICAgaWYgISAkV0lORUNPTkYgLWluaWZpbGUgIiRXSU5FSU5JIiA+ICRUTVBDT05GIDI+L2Rldi9udWxsCiAgICB0aGVuIHsKICAgICAgcm0gLWYgJFRNUENPTkYgPiAvZGV2L251bGwKCiAgICAgIGVjaG8gIiBub3QgZm91bmQuIChubyBtYXRjaGluZyAvZXRjL2ZzdGFiIG1vdW50IGVudHJ5IGZvdW5kKSIKICAgICAgY29uZl9xdWVzdGlvbiBsb3cgZG9fd2l0aG91dF93aW5kb3dzIFwKICAgICAgICJXaW5kb3dzIHdhcyBub3QgZm91bmQgb24geW91ciBzeXN0ZW0sIHNvIEkgYXNzdW1lIHlvdSB3YW50IiBcCiAgICAgICAiYSBXaW5lLW9ubHkgaW5zdGFsbGF0aW9uLiBBbSBJIGNvcnJlY3Q/IgogICAgICBjb25mX3llc25vX2Fuc3dlciAiKHllcy9ubykgIgogICAgICBpZiBbICIkQU5TV0VSIiA9ICdubycgXQogICAgICB0aGVuIHsKICAgICAgICBjb25mX3F1ZXN0aW9uIGhpZ2ggd2luZG93c19ub3RfZm91bmQgXAogICAgICAgICAiQWJvcnRpbmcgaW5zdGFsbC4gTWFrZSBzdXJlIHlvdXIgV2luZG93cyBwYXJ0aXRpb24gaXMgbW91bnRlZCBhbmQgdHJ5IGFnYWluLCIgXAogICAgICAgICAib3IgY3JlYXRlICRMQ09ORiBtYW51YWxseSBieSBjb3B5aW5nIGZyb20gJFdJTkVJTkkgYW5kIGFkYXB0aW5nIHRoZSBkcml2ZSBwYXRocy4iCiAgICAgICAgZXhpdCAxCiAgICAgIH0KICAgICAgZmkKICAgICAgRE9XSU5FPXllcwogICAgfQogICAgZWxzZSB7CiAgICAgIGVjaG8gIiBmb3VuZC4iCgogICAgICBjb25mX3F1ZXN0aW9uIGxvdyBkb193aXRob3V0X3dpbmRvd3MgXAogICAgICAgIldpbmRvd3Mgd2FzIGZvdW5kIG9uIHlvdXIgc3lzdGVtLCBhbmQgc28gd2UgY2FuIHVzZSB0aGUgV2luZG93cyIgXAogICAgICAgIkRyaXZlIGFzIG91ciBXaW5lIGRyaXZlLiBZb3UgbWF5LCBob3dldmVyLCB3aXNoIHRvIGNyZWF0ZSBhIGNsZWFuIiBcCiAgICAgICAiV2luZSBpbnN0YWxsIGFueXdheXMuIgogICAgICBjb25mX3llc25vX2Fuc3dlciAiU2hvdWxkIEkgdXNlIHRoZSBXaW5kb3dzIGRyaXZlIGZvciB0aGUgV2luZSBpbnN0YWxsPyAoeWVzL25vKSAiCiAgICAgIGlmIFsgIiRBTlNXRVIiID0gJ3llcycgXQogICAgICB0aGVuIHsKICAgICAgICBjb25mX3Jlc2V0X3F1ZXN0aW9uIHdpbmRvd3NfZm91bmQKICAgICAgICBjb25mX3F1ZXN0aW9uIGxvdyB3aW5kb3dzX2ZvdW5kIFwKICAgICAgICAgIkNyZWF0ZWQgJExDT05GIHVzaW5nIHlvdXIgZXhpc3RpbmcgV2luZG93cyBpbnN0YWxsYXRpb24uIiBcCiAgICAgICAgICJZb3UgcHJvYmFibHkgd2FudCB0byByZXZpZXcgdGhlIGZpbGUsIHRob3VnaC4iCiAgICAgICAgRE9XSU5FPW5vCiAgICAgIH0KICAgICAgZWxzZSB7CiAgICAgICAgRE9XSU5FPXllcwogICAgICB9CiAgICAgIGZpCiAgICB9CiAgICBmaQogIH0KICBlbGlmIFsgIiRET1dJTkUiID0gJ2F1dG8nIF0KICB0aGVuIERPV0lORT15ZXMKICBmaQp9CmVsaWYgWyAiJERPV0lORSIgPSAnYXV0bycgXQp0aGVuCiAgRE9XSU5FPW5vCmZpCgojIHNldHVwIGEgbm8td2luZG93cyBpbnN0YWxsYXRpb24sIGlmIG5lY2Vzc2FyeQppZiBbICIkRE9XSU5FIiA9ICd5ZXMnIF0KdGhlbiB7CiAgIyBzZXQgYW4gYXBwcm9wcmlhdGUgRENST09UCiAgaWYgWyBgd2hvYW1pYCAhPSAncm9vdCcgXQogIHRoZW4gRENST09UPX4vLndpbmUvZHJpdmVfYwogIGVsc2UgRENST09UPS9jCiAgZmkKCiAgY29uZl9xdWVzdGlvbiBsb3cgZHJpdmVjX3BhdGggXAogICAgICJDb25maWd1cmluZyBXaW5lIHdpdGhvdXQgV2luZG93cy4iIFwKICAgICAiU29tZSBmYWtlIFdpbmRvd3MgZGlyZWN0b3JpZXMgbXVzdCBiZSBjcmVhdGVkLCB0byBob2xkIGFueSAuaW5pIGZpbGVzLCBETExzLCIgXAogICAgICJzdGFydCBtZW51IGVudHJpZXMsIGFuZCBvdGhlciB0aGluZ3MgeW91ciBhcHBsaWNhdGlvbnMgbWF5IG5lZWQgdG8gaW5zdGFsbC4iIFwKICAgICAiV2hlcmUgd291bGQgeW91IGxpa2UgeW91ciBmYWtlIEMgZHJpdmUgdG8gYmUgcGxhY2VkPyIKICB3aGlsZSBbIC16ICIkQ1JPT1QiIF0KICBkbyB7CiAgICBjb25mX3N0cmluZ19hbnN3ZXIgIihkZWZhdWx0IGlzICREQ1JPT1QpICIKICAgIFsgLXogIiRBTlNXRVIiIF0gJiYgQU5TV0VSPSIkRENST09UIgogICAgaWYgISBbIC1kICIkQU5TV0VSIiBdCiAgICB0aGVuIHsKICAgICAgaWYgbWtkaXIgLXAgIiRBTlNXRVIiCiAgICAgIHRoZW4gQ1JPT1Q9IiRBTlNXRVIiCiAgICAgIGVsc2UKICAgICAgICAgIGVjaG8gIkRpcmVjdG9yeSAkQU5TV0VSIGNhbid0IGJlIGNyZWF0ZWQgISIKICAgICAgICAgIGNvbmZfcmVzZXRfcXVlc3Rpb24gZHJpdmVjX3BhdGgKICAgICAgZmkKICAgIH0KICAgIGVsc2UgQ1JPT1Q9IiRBTlNXRVIiCiAgICBmaQogIH0KICBkb25lCiAgZWNobyAiQ29uZmlndXJpbmcgV2luZSBmb3IgYSBuby13aW5kb3dzIGluc3RhbGwgaW4gJENST09ULi4uIgoKICBpZiBbICEgLWQgfi8ud2luZS9kb3NkZXZpY2VzIF0KICB0aGVuCiAgICBbIC1kIH4vLndpbmUgXSB8fCBta2RpciB+Ly53aW5lCiAgICBta2RpciB+Ly53aW5lL2Rvc2RldmljZXMKICAgIGxuIC1zIC9tbnQvZmQwIH4vLndpbmUvZG9zZGV2aWNlcy9hOgogICAgbG4gLXMgJENST09UIH4vLndpbmUvZG9zZGV2aWNlcy9jOgogICAgbG4gLXMgL2Nkcm9tIH4vLndpbmUvZG9zZGV2aWNlcy9kOgogICAgbG4gLXMgL3RtcCB+Ly53aW5lL2Rvc2RldmljZXMvZToKICAgIGxuIC1zIH4gfi8ud2luZS9kb3NkZXZpY2VzL2Y6CiAgICBsbiAtcyAvIH4vLndpbmUvZG9zZGV2aWNlcy96OgogIGZpCgogIGlmIFsgIiRXSU5FSU5TVEFMTEVEIiA9ICdubycgXQogIHRoZW4KICAgICAgdG9vbHMvd2luZXByZWZpeGNyZWF0ZSAtLXVwZGF0ZSAtLXVzZS13aW5lLXRyZWUgLgogIGVsc2UKICAgICAgd2luZXByZWZpeGNyZWF0ZSAtLXVwZGF0ZQogIGZpCgogICMgY3JlYXRlICRMQ09ORiB1c2luZyB0aGUgZGVmYXVsdCBjb25maWcgZmlsZSAkV0lORUlOSQogIGlmIFsgIiRET0xPQ0FMQ09ORiIgPSAneWVzJyBdCiAgdGhlbiB7CiAgICBjcCAkV0lORUlOSSAkVE1QQ09ORgogICAgY29uZl9yZXNldF9xdWVzdGlvbiBkZWZhdWx0X2NvbmZpZwogICAgY29uZl9xdWVzdGlvbiBsb3cgZGVmYXVsdF9jb25maWcgXAogICAgICJDcmVhdGVkICRMQ09ORiB1c2luZyBkZWZhdWx0IFdpbmUgY29uZmlndXJhdGlvbi4iIFwKICAgICAiWW91IHByb2JhYmx5IHdhbnQgdG8gcmV2aWV3IHRoZSBmaWxlLCB0aG91Z2guIgogIH0KICBmaQoKICAjIG5vdyB3ZSByZWFsbHkgc2hvdWxkIGluc3RhbGwgdGhlIHJlZ2lzdHJ5CiAgaWYgWyAiJERPUkVHIiA9ICdhdXRvJyBdCiAgdGhlbiBET1JFRz15ZXMKICBmaQp9CmZpCmVjaG8KCiNpbnN0YWxsIHRoZSBsb2NhbCBjb25maWcgZmlsZSAkTENPTkYKaWYgWyAiJERPTE9DQUxDT05GIiA9ICd5ZXMnIF0KdGhlbgogIGlmIFsgISAtdyB+Ly53aW5lIF0KICB0aGVuCiAgICBta2RpciB+Ly53aW5lCiAgZmkKICBjcCAkVE1QQ09ORiAkTENPTkYgPiAvZGV2L251bGwKZWxzZQogIERPUkVHPW5vCmZpCgojIG1ha2Ugcm9vdCdzIHJlZ2lzdHJ5IGdsb2JhbCwgaWYgZGVzaXJlZAppZiBbIGB3aG9hbWlgID0gJ3Jvb3QnIF0gJiYgWyAiJERPUkVHIiA9ICd5ZXMnIF0gJiYgWyAiJFNZU1JFRyIgPSAneWVzJyBdCnRoZW4gewogIFsgLWQgfi8ud2luZSBdIHx8IG1rZGlyIH4vLndpbmUKICBpZiAhIFsgLWYgJHN5c2NvbmZkaXIvd2luZS51c2VycmVnIF0KICB0aGVuIHsKICAgIGVjaG8gIkxpbmtpbmcgcm9vdCdzIHVzZXIgcmVnaXN0cnkgaGl2ZSB0byB0aGUgZ2xvYmFsIHJlZ2lzdHJ5Li4uIgogICAgWyAtZiB+Ly53aW5lL3dpbmUudXNlcnJlZyBdICYmIGNwIH4vLndpbmUvd2luZS51c2VycmVnICRzeXNjb25mZGlyL3dpbmUudXNlcnJlZwogICAgbG4gLXNmICRzeXNjb25mZGlyL3dpbmUudXNlcnJlZyB+Ly53aW5lL3dpbmUudXNlcnJlZwogIH0KICBmaQogIGlmICEgWyAtZiAkc3lzY29uZmRpci93aW5lLnN5c3RlbXJlZyBdCiAgdGhlbiB7CiAgICBlY2hvICJMaW5raW5nIHJvb3QncyBzeXN0ZW0gcmVnaXN0cnkgaGl2ZSB0byB0aGUgZ2xvYmFsIHJlZ2lzdHJ5Li4uIgogICAgWyAtZiB+Ly53aW5lL3N5c3RlbS5yZWcgXSAmJiBjcCB+Ly53aW5lL3N5c3RlbS5yZWcgJHN5c2NvbmZkaXIvd2luZS5zeXN0ZW1yZWcKICAgIGxuIC1zZiAkc3lzY29uZmRpci93aW5lLnN5c3RlbXJlZyB+Ly53aW5lL3N5c3RlbS5yZWcKICB9CiAgZmkKfQpmaQoKIyBjbGVhbnVwIGFueSB0ZW1wb3JhcnkgZmlsZXMgdGhhdCBtYXkgcmVtYWluCmlmIFsgLWYgJFRNUENPTkYgXQp0aGVuIHJtIC1mICRUTVBDT05GCmZpCgoKIyBpdCdzIGEgd3JhcAplY2hvCmVjaG8gIkluc3RhbGxhdGlvbiBjb21wbGV0ZSBmb3Igbm93LiBHb29kIGx1Y2sgKHRoaXMgaXMgc3RpbGwgYWxwaGEgc29mdHdhcmUpLiIKZWNobyAiSWYgeW91IGhhdmUgcHJvYmxlbXMgd2l0aCBXSU5FLCBwbGVhc2UgcmVhZCB0aGUgZG9jdW1lbnRhdGlvbiBmaXJzdCwiCmVjaG8gImFzIG1hbnkga2luZHMgb2YgcG90ZW50aWFsIHByb2JsZW1zIGFyZSBleHBsYWluZWQgdGhlcmUuIgoKZXhpdCAwCg==