IyEvYmluL2Jhc2gKIyBXSU5FIEluc3RhbGxhdGlvbiBzY3JpcHQKIyBDYW4gZG8gYWxtb3N0IGV2ZXJ5dGhpbmcgZnJvbSBjb21waWxpbmcgdG8gY29uZmlndXJpbmcuLi4KCiMgTWFyIDMxIDE5OTkgLSBPdmUgS+V2ZW4KIyAgRmlyc3QgdmVyc2lvbgojIERlYyA5IDE5OTkgLSBPdmUgS+V2ZW4KIyAgcmVxdWlyZSBYcG0KIyBGZWIgMjUgMjAwMCAtIE92ZSBL5XZlbgojICBhdXRvLWFkZCAvdXNyL2xvY2FsL2xpYiB0byAvZXRjL2xkLnNvLmNvbmYKIyBNYXIgMiAyMDAwIC0gT3ZlIEvldmVuCiMgIHNvdXJjZSByYXRoZXIgdGhhbiBncmVwIGNvbmZpZy5jYWNoZQojICB1c2Ugc291cmNlZCBjb25maWcuY2FjaGUgdG8gc3RhcnQgbGRjb25maWcKIyAgcmVjb25maWd1cmUgaWYgY29uZmlnLmNhY2hlIGRvZXNuJ3QgZXhpc3QKIyBNYXIgMzAgMjAwMCAtIE92ZSBL5XZlbgojICBhdXRvY29uZmlndXJlIG5vLXdpbmRvd3MgaW5zdGFsbHMKIyAgZG8gbm90IGluc3RhbGwgcmVnaXN0cnkgb24gcmVhbC13aW5kb3dzIGluc3RhbGxzCiMgIHNvbWUgc3VwcG9ydCBmb3IgYmluYXJ5IHBhY2thZ2UgaW5zdGFsbHMKIyAgc2V0IGFuZCB0ZWxsIHVzZXIgYWJvdXQgTERfTElCUkFSWV9QQVRIIGlmIG5lY2Vzc2FyeQojICBzZXQgRVhUUkFfTERfTElCUkFSWV9QQVRIIGluIHdpbmUuY29uZgojIEFwciA5IDIwMDAgLSBPdmUgS+V2ZW4KIyAgbWFrZSByb290J3MgcmVnaXN0cnkgZ2xvYmFsIChzeXN0ZW0tZGVmYXVsdCkKIyBNYXkgOSAyMDAwIC0gT3ZlIEvldmVuCiMgIHVzZSB0dHlkcnYgd2hlbiBydW5uaW5nIHJlZ2FwaSwgc28gd2UgZG9uJ3QgaGF2ZSB0byBydW4gZnJvbSBYCiMgIGNoYW5nZSBkZWJ1Z2dlciBwYXRoIGluIHJlZ2lzdHJ5CiMgT2N0IDI5IDIwMDAgLSBPdmUgS+V2ZW4KIyAgYWRkZWQgLS1lbmFibGUtb3BlbmdsIHRvIGRlZmF1bHQgY29uZmFyZ3MKIyAgYWRkZWQgY29uZl9xdWVzdGlvbiwgY29uZl95ZXNub19hbnN3ZXIsIGFuZCBjb25mX3N0cmluZ19hbnN3ZXIgZnVuY3Rpb25zCiMgIGFkZGVkIERFRkNBVCB2YXJpYWJsZQojIChsYXRlciB0aGF0IGRheS4uLikKIyAgYWRkZWQgY29uZl9yZXNldF9xdWVzdGlvbiBmdW5jdGlvbgojICBhZGRlZCBmaWxlIGV4aXN0ZW5jZSBjaGVja3MgdG8gdGhlIHJlZ2lzdHJ5IGNvcHlpbmcKIyAgZml4ZWQgcHJvYmxlbSB3aXRoIG5vLXdpbmRvd3MgZGlyZWN0b3J5IGNyZWF0aW9uCiMgIHNvbWUgdGV4dCByZWZvcm1hdHRpbmcgZnJvbSBFcmljIE1hcnluaWFrCgojLS0tIGRlZmF1bHRzIChjaGFuZ2UgdGhlc2UgaWYgeW91IGFyZSBhIHBhY2thZ2VyKQpDT05GQVJHUz0tLWVuYWJsZS1vcGVuZ2wgICAgICAjIGNvbmZpZ3VyZSBhcmdzLCBlLmcuIC0tcHJlZml4PS91c3IgLS1zeXNjb25mZGlyPS9ldGMKcHJlZml4PS91c3IvbG9jYWwgICAgICAgICAgICAgIyBpbnN0YWxsYXRpb24gcHJlZml4CnN5c2NvbmZkaXI9JHByZWZpeC9ldGMgICAgICAgICMgd2hlcmUgd2luZS5jb25mIGFuZCBnbG9iYWwgcmVnaXN0cnkgaXMgc3VwcG9zZWQgdG8gYmUKYmluZGlyPSRwcmVmaXgvYmluICAgICAgICAgICAgIyB3aGVyZSB3aW5lbGliIGFwcHMgd2lsbCBiZSAob3IgaXMpIGluc3RhbGxlZApsaWJkaXI9JHByZWZpeC9saWIgICAgICAgICAgICAjIHdoZXJlIGxpYndpbmUuc28gd2lsbCBiZSAob3IgaXMpIGluc3RhbGxlZApleGRpcj1kb2N1bWVudGF0aW9uL3NhbXBsZXMgICAjIHdoZXJlIHRoZSBleGFtcGxlIHN5c3RlbS5pbmkgcmVzaWRlcwpDT05GPSRzeXNjb25mZGlyL3dpbmUuY29uZiAgICAjIGRlZmF1bHQgcGF0aCBvZiB0aGUgd2luZS5jb25mCkJJTkRJU1Q9bm8gICAgICAgICAgICAgICAgICAgICMgd2hldGhlciBjYWxsZWQgZnJvbSBhIGJpbmFyeSBwYWNrYWdlIGNvbmZpZyBzY3JpcHQKRE9DT05GPWF1dG8gICAgICAgICAgICAgICAgICAgIyB3aGV0aGVyIHRvIGF1dG9nZW5lcmF0ZSB3aW5lLmNvbmYKRE9XQ0hLPWF1dG8gICAgICAgICAgICAgICAgICAgIyB3aGV0aGVyIHRvIGF1dG9jb25maWd1cmUgZXhpc3Rpbmctd2luZG93cyBpbnN0YWxsYXRpb24KRE9XSU5FPWF1dG8gICAgICAgICAgICAgICAgICAgIyB3aGV0aGVyIHRvIGF1dG9jb25maWd1cmUgbm8td2luZG93cyBpbnN0YWxsYXRpb24KRE9SRUc9YXV0byAgICAgICAgICAgICAgICAgICAgIyB3aGV0aGVyIHRvIGluc3RhbGwgZGVmYXVsdCByZWdpc3RyeQpTWVNSRUc9eWVzICAgICAgICAgICAgICAgICAgICAjIHdoZXRoZXIgdG8gbWFrZSByb290J3MgcmVnaXN0cnkgZ2xvYmFsIChzeXN0ZW0tZGVmYXVsdCkKCiMgIm1ha2UgaW5zdGFsbCIgc3RpbGwgaW5zdGFsbHMgdGhlIGRsbHMgaW50byAkbGliZGlyLCBidXQgdGhpcyBtYXkgY2hhbmdlIGluIHRoZSBmdXR1cmUKIyAoRExMUEFUSCBzaG91bGQgcG9pbnQgdG8gdGhlbSBpZi93aGVuIHRoZXkgYXJlIG5vdCBpbiBzdGFuZGFyZCBsZC5zbyBwYXRocykKRExMUEFUSD0kbGliZGlyL3dpbmUgICAgICAgICAgIyBkZWZhdWx0IHBhdGggb2YgdGhlIGRsbCAuc28gZmlsZXMgKGV4Y2VwdCBsaWJ3aW5lLnNvKQoKIyBoYXZpbmcgdGhlIFdpbmUgZGVidWdnZXIgbGF1bmNoZWQgYXV0b21hdGljYWxseSB3aWxsIGJlIGEgcGx1cyBmb3IgdXMKREVCVUdHRVI9JGJpbmRpci93aW5lZGJnICAgICAgIyB0aGUgKGluc3RhbGxlZCkgcGF0aCBvZiB3aW5lZGJnCkhERUJVR0dFUj1kZWJ1Z2dlci93aW5lZGJnICAgICMgdGhlIChub24taW5zdGFsbGVkKSBwYXRoIG9mIHdpbmVkYmcKCiMgdGhpcyBpcyBvbmx5IGZvciBleGlzdGluZy13aW5kb3dzIGluc3RhbGxzCldJTkVDT05GPXRvb2xzL3dpbmVjb25mICAgICAgICMgdGhlIHBhdGggb2Ygd2luZWNvbmYgcGVybCBzY3JpcHQKCiMgdGhpcyBpcyBvbmx5IGZvciBuby13aW5kb3dzIGluc3RhbGxzCldJTkVJTkk9d2luZS5pbmkgICAgICAgICAgICAgICMgdGhlIHBhdGggb2YgZGVmYXVsdCB3aW5lLmluaSAoYWxzbyB1c2VkIGJ5IHdpbmVjb25mKQpXSU5JTkk9L2Rldi9udWxsICAgICAgICAgICAgICAjIHRoZSBwYXRoIG9mIGRlZmF1bHQgd2luLmluaQpTWVNURU1JTkk9JGV4ZGlyL3N5c3RlbS5pbmkgICAjIHRoZSBwYXRoIG9mIGRlZmF1bHQgc3lzdGVtLmluaQpSRUdBUEk9cHJvZ3JhbXMvcmVnYXBpL3JlZ2FwaSAjIHRoZSBwYXRoIG9mIHJlZ2FwaSB3aW5lbGliIGFwcGxpY2F0aW9uCkRFRlJFRz13aW5lZGVmYXVsdC5yZWcgICAgICAgICMgdGhlIHBhdGggb2YgdGhlIHJlZ2lzdHJ5IGZpbGUgdG8gYmUgZmVkIHRvIHJlZ2FwaQojIENST09UPS92YXIvd2luZSAgICAgICAgICAgICAjIHRoZSBwYXRoIG9mIHRoZSBmYWtlIERyaXZlIEMgKGFza3MgdXNlciBpZiBub3Qgc2V0KQpERUZDQVQ9Y2F0ICAgICAgICAgICAgICAgICAgICAjIHByb2dyYW0gdG8gY2F0ICRERUZSRUcgd2l0aCAoc29tZSBwYWNrYWdlcyBuZWVkIHpjYXQpCiMtLS0gZW5kIG9mIGRlZmF1bHRzCgojIHRlbXBvcmFyeSBmaWxlcyB1c2VkIGJ5IHRoZSBpbnN0YWxsZXIKVE1QQ09ORj0vdG1wL3dpbmVpbnN0YWxsLmNvbmYKVE1QUkVHPS90bXAvd2luZWluc3RhbGwucmVnCgojIGZ1bmN0aW9ucwoKZnVuY3Rpb24gY29uZl9xdWVzdGlvbiB7CiAgIyBwYXJhbWV0ZXJzOiAkMSA9IGltcG9ydGFuY2UsICQyID0gcXVlc3Rpb24taWQsICQzKyA9IG1lc3NhZ2UgbGluZXMKICAjIHRoZSBmaXJzdCB0d28gcGFyYW1ldGVycyBjYW4gYmUgdXNlZCBieSBlLmcuIGRlYmNvbmYgaW4gZGViaWFuIHBhY2thZ2VzCiAgIyBidXQgaGVyZSB3ZSBqdXN0IHByaW50IHRoZSBtZXNzYWdlCiAgc2hpZnQgMgogIGVjaG8KICBsb2NhbCBMSU5FPSIkMSIKICB3aGlsZSBzaGlmdAogIGRvIHsKICAgIGVjaG8gIiRMSU5FIgogICAgTElORT0iJDEiCiAgfQogIGRvbmUKfQoKZnVuY3Rpb24gY29uZl9yZXNldF9xdWVzdGlvbiB7CiAgIyBwYXJhbWV0ZXJzOiAkMSA9IHF1ZXN0aW9uLWlkCiAgIyB0aGlzIGlzIHVzZWQgdG8gZmx1c2ggYW55IGNhY2hlZCBhbnN3ZXJzIGFuZCAiYWxyZWFkeS1kaXNwbGF5ZWQiIGZsYWdzCiAgc2hpZnQgIyBkdW1teSBjb21tYW5kCn0KCmZ1bmN0aW9uIGNvbmZfeWVzbm9fYW5zd2VyIHsKICB1bnNldCBBTlNXRVIKICB3aGlsZSBbICIkQU5TV0VSIiAhPSAneWVzJyBdICYmIFsgIiRBTlNXRVIiICE9ICdubycgXQogIGRvIHsKICAgIGVjaG8gLW4gIiQxIgogICAgcmVhZCBBTlNXRVIKICB9CiAgZG9uZQp9CgpmdW5jdGlvbiBjb25mX3N0cmluZ19hbnN3ZXIgewogIGVjaG8gLW4gIiQxIgogIHJlYWQgQU5TV0VSCn0KCiMgc3RhcnR1cC4uLgoKZWNobyAiV0lORSBJbnN0YWxsZXIgdjAuNSIKZWNobwoKaWYgWyAiJEJJTkRJU1QiID0gJ25vJyBdCnRoZW4gewoKaWYgISBbIC1mIGNvbmZpZ3VyZSBdCnRoZW4gewogIGVjaG8gIllvdSdyZSBydW5uaW5nIHRoaXMgZnJvbSB0aGUgd3JvbmcgZGlyZWN0b3J5LiIKICBlY2hvICJDaGFuZ2UgdG8gdGhlIFdpbmUgc291cmNlJ3MgbWFpbiBkaXJlY3RvcnkgYW5kIHRyeSBhZ2Fpbi4iCiAgZXhpdCAxCn0KZmkKCiMgY2hlY2sgd2hldGhlciBSUE0gaW5zdGFsbGVkLCBhbmQgaWYgaXQgaXMsIHJlbW92ZSBhbnkgb2xkIHdpbmUgcnBtLgpoYXNoIHJwbSAmPi9kZXYvbnVsbApSRVQ9JD8KaWYgWyAkUkVUIC1lcSAwIF07IHRoZW4KICBpZiBbIC1uICJgcnBtIC1xaSB3aW5lIDI+L2Rldi9udWxsfGdyZXAgIl5OYW1lImAiIF07IHRoZW4KICAgIGVjaG8gIldhcm5pbmc6IE9sZCBXaW5lIFJQTSBpbnN0YWxsIGRldGVjdGVkLiBEbyB5b3Ugd2FudCB0byByZW1vdmUgaXQgZmlyc3Q/IgogICAgY29uZl95ZXNub19hbnN3ZXIgIih5ZXMvbm8pICIKICAgIGlmIFsgIiRBTlNXRVIiID0gJ3llcycgXTsgdGhlbgogICAgICBlY2hvIFN0YXJ0aW5nIHdpbmUgcnBtIHJlbW92YWwuLi4KICAgICAgcnBtIC1lIHdpbmU7IFJFVD0kPwogICAgICBpZiBbICRSRVQgLWVxIDAgXTsgdGhlbgogICAgICAgIGVjaG8gRG9uZS4KICAgICAgZWxzZQogICAgICAgIGVjaG8gIkZBSUxFRC4gUHJvYmFibHkgeW91IGFyZW4ndCBpbnN0YWxsaW5nIGFzIHJvb3QuIgoJZWNobyAiRXhwZWN0IHByb2JsZW1zIChsaWJyYXJ5IGNvbmZsaWN0cyB3aXRoIGV4aXN0aW5nIGluc3RhbGwgZXRjLikuIgogICAgICBmaQogICAgZWxzZQogICAgICBlY2hvICJTb3JyeSwgSSB3b24ndCBpbnN0YWxsIFdpbmUgd2hlbiBhbiBycG0gdmVyc2lvbiBpcyBzdGlsbCBpbnN0YWxsZWQuIgogICAgICBlY2hvICIoV2luZSBzdXBwb3J0IHN1ZmZlcmVkIGZyb20gd2F5IHRvbyBtYW55IGNvbmZsaWN0cykiCiAgICAgIGVjaG8gIkhhdmUgYSBuaWNlIGRheSAhIgogICAgICBleGl0IDEKICAgIGZpIAogIGZpCmZpCgojIHJ1biB0aGUgY29uZmlndXJlIHNjcmlwdCwgaWYgbmVjZXNzYXJ5CgppZiBbIC1mIGNvbmZpZy5jYWNoZSBdICYmIFsgLWYgTWFrZWZpbGUgXSAmJiBbIE1ha2VmaWxlIC1udCBjb25maWd1cmUgXQp0aGVuIHsKICBlY2hvICJJIHNlZSB0aGF0IFdJTkUgaGFzIGFscmVhZHkgYmVlbiBjb25maWd1cmVkLCBzbyBJJ2xsIHNraXAgdGhhdC4iCiAgIyBsb2FkIGNvbmZpZ3VyZSByZXN1bHRzCiAgLiAuL2NvbmZpZy5jYWNoZQp9CmVsc2UgewogIGVjaG8gIlJ1bm5pbmcgY29uZmlndXJlLi4uIgogIGVjaG8KICBpZiAhIC4vY29uZmlndXJlICRDT05GQVJHUwogIHRoZW4gewogICAgZWNobwogICAgZWNobyAiQ29uZmlndXJlIGZhaWxlZCwgYWJvcnRpbmcgaW5zdGFsbC4iCiAgICBybSAtZiBjb25maWcuY2FjaGUKICAgIGV4aXQgMQogIH0KICBmaQogICMgbG9hZCBjb25maWd1cmUgcmVzdWx0cwogIC4gLi9jb25maWcuY2FjaGUKICAjIG1ha2Ugc3VyZSBYIHdhcyBmb3VuZAogIGV2YWwgIiRhY19jdl9oYXZlX3giCiAgaWYgWyAiJGhhdmVfeCIgIT0gInllcyIgXQogIHRoZW4gewogICAgZWNobyAiSW5zdGFsbCB0aGUgWCBkZXZlbG9wbWVudCBoZWFkZXJzIGFuZCB0cnkgYWdhaW4uIgogICAgcm0gLWYgY29uZmlnLmNhY2hlCiAgICBleGl0IDEKICB9CiAgZWxpZiBbICIkYWNfY3ZfaGVhZGVyX1gxMV94cG1faCIgIT0gInllcyIgXQogIHRoZW4gewogICAgZWNobyAiSW5zdGFsbCB0aGUgWHBtIGRldmVsb3BtZW50IGhlYWRlcnMgYW5kIHRyeSBhZ2Fpbi4iCiAgICBybSAtZiBjb25maWcuY2FjaGUKICAgIGV4aXQgMQogIH0KICBmaQp9CmZpCgojIG5vdyBkbyB0aGUgY29tcGlsYXRpb24KCmlmIFsgLWYgd2luZSBdICYmIFsgd2luZSAtbnQgTWFrZWZpbGUgXQp0aGVuIHsKICBlY2hvICJIbW0sIGxvb2tzIGxpa2UgV0lORSBpcyBhbHJlYWR5IGNvbXBpbGVkLiBJJ2xsIHNraXAgdGhhdCB0b28sIEkgZ3Vlc3MuIgp9CmVsc2UgewogIGVjaG8gIkNvbXBpbGluZyBXSU5FLiBHcmFiIGEgbHVuY2ggb3IgdHdvLCByZW50IGEgdmlkZW8sIG9yIHdoYXRldmVyLCIKICBlY2hvICJpbiB0aGUgbWVhbnRpbWUuLi4iCiAgZWNobwogIGlmICEgeyBtYWtlIGRlcGVuZCAmJiBtYWtlOyB9CiAgdGhlbiB7CiAgICBlY2hvCiAgICBlY2hvICJDb21waWxhdGlvbiBmYWlsZWQsIGFib3J0aW5nIGluc3RhbGwuIgogICAgZXhpdCAxCiAgfQogIGZpCiAgZWNobwp9CmZpCgojIGFuZCBpbnN0YWxsYXRpb24sIGlmIHJvb3QKCmlmIFsgYHdob2FtaWAgIT0gJ3Jvb3QnIF0KdGhlbiB7CiAgZWNobyAiWW91IGFyZW4ndCByb290LCBzbyBJJ2xsIHNraXAgdGhlIG1ha2UgaW5zdGFsbC4iCiAgIyBzZXR1cCB0byBydW4gZnJvbSBjdXJyZW50IGRpcmVjdG9yeQogIERMTFBBVEg9IiRQV0QvZGxscyIKICBpZiBbIC16ICIkTERfTElCUkFSWV9QQVRIIiBdCiAgdGhlbiBMRF9MSUJSQVJZX1BBVEg9IiRQV0Q6JERMTFBBVEgiCiAgZWxzZSBMRF9MSUJSQVJZX1BBVEg9IiRMRF9MSUJSQVJZX1BBVEg6JFBXRDokRExMUEFUSCIKICBmaQogIGV4cG9ydCBMRF9MSUJSQVJZX1BBVEgKICBERUJVR0dFUj0iJFBXRC8kSERFQlVHR0VSIgogIGVjaG8KICBlY2hvICJOT1RFISBUbyBydW4gV2luZSB3aXRob3V0IGluc3RhbGxpbmcsIHlvdSBtdXN0IHNldCB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUiCiAgZWNobyAiTERfTElCUkFSWV9QQVRIIHRvICRQV0Q6JERMTFBBVEgiCiAgZWNobyAiaW4geW91ciBsb2dvbiBzY3JpcHRzLiIKfQplbHNlIHsKICBlY2hvICJOb3cgaW5zdGFsbGluZyBiaW5hcmllcyBvbnRvIHRoZSBzeXN0ZW0uLi4iCiAgZWNobwogIGlmICEgbWFrZSBpbnN0YWxsCiAgdGhlbiB7CiAgICBlY2hvCiAgICBlY2hvICJJbnN0YWxsYXRpb24gZmFpbGVkLCBhYm9ydGluZy4iCiAgICBleGl0IDEKICB9CiAgZmkKICBpZiBbIC1mIC9ldGMvbGQuc28uY29uZiBdICYmICEgZ3JlcCAtcXMgIiRsaWJkaXIiIC9ldGMvbGQuc28uY29uZgogIHRoZW4gewogICAgZWNobwogICAgZWNobyAiJGxpYmRpciBkaWRuJ3QgZXhpc3QgaW4geW91ciAvZXRjL2xkLnNvLmNvbmYsIGFkZGluZyBpdCBub3cuLi4iCiAgICBlY2hvICIkbGliZGlyIiA+Pi9ldGMvbGQuc28uY29uZgogICAgZWNobyAiUmUtcnVubmluZyBsZGNvbmZpZy4uLiIKICAgIGV2YWwgIiRhY19jdl9wYXRoX0xEQ09ORklHIgogIH0KICBmaQp9CmZpCgp9CmZpICMgQklORElTVAoKIyBub3cgY2hlY2sgd2hldGhlciB3ZSBzaG91bGQgZ2VuZXJhdGUgd2luZS5jb25mCmlmIFsgLXogIiRET0NPTkYiIF0KdGhlbiBET0NPTkY9YXV0bwpmaQoKaWYgWyAiJERPQ09ORiIgPSAnYXV0bycgXQp0aGVuIHsKICAjIHNlZSBpZiB3ZSBhbHJlYWR5IGhhdmUgYSBzeXN0ZW0gd2luZS5jb25mCiAgaWYgWyAtZiAkQ09ORiBdCiAgdGhlbiBET0NPTkY9bm8KICBmaQp9CmZpCgppZiBbICIkRE9DT05GIiAhPSAnbm8nIF0KdGhlbiB7CiAgaWYgWyBgd2hvYW1pYCAhPSAncm9vdCcgXQogIHRoZW4gewogICAgQ09ORj1+Ly53aW5lcmMKICAgIGlmICEgWyAtZiAkQ09ORiBdCiAgICB0aGVuIHsKICAgICAgaWYgWyAiJERPQ09ORiIgIT0gJ3llcycgXQogICAgICB0aGVuIHsKICAgICAgICBjb25mX3F1ZXN0aW9uIG1lZGl1bSBtYWtlX3VzZXJfd2luZXJjIFwKICAgICAgICAgIlNpbmNlIHlvdSBhcmVuJ3Qgcm9vdCwgYW5kIHRoZXJlJ3Mgbm8gc3lzdGVtIHdpbmUuY29uZiwgSSBhc3N1bWUiIFwKICAgICAgICAgInlvdSB3YW50IGEgdXNlci1zcGVjaWZpYyAud2luZXJjLiBBbSBJIGNvcnJlY3Q/IgogICAgICAgIGNvbmZfeWVzbm9fYW5zd2VyICIoeWVzL25vKSAiCiAgICAgICAgRE9DT05GPSIkQU5TV0VSIgogICAgICB9CiAgICAgIGZpCiAgICAgIGlmIFsgIiRET0NPTkYiID0gJ25vJyBdCiAgICAgIHRoZW4gewogICAgICAgIGNvbmZfcXVlc3Rpb24gaGlnaCBuZWVkX3Jvb3QgXAogICAgICAgICAiQWJvcnRpbmcgaW5zdGFsbC4gVHJ5IGFnYWluIGFzIHJvb3QgdG8gZ2VuZXJhdGUgYSBzeXN0ZW0gd2luZS5jb25mLiIKICAgICAgICBleGl0IDEKICAgICAgfQogICAgICBmaQogICAgICBlY2hvCiAgICB9CiAgICBmaQogIH0KICBlbHNlIHsKICAgIG1rZGlyIC1wICRzeXNjb25mZGlyCiAgICBET0NPTkY9eWVzCiAgfQogIGZpCn0KZmkKCiMgZ2VuZXJhdGUgd2luZS5jb25mIGZyb20gZXhpc3Rpbmcgd2luZG93cyBpbnN0YWxsLCBpZiBhbnkKaWYgWyAiJERPQ09ORiIgPSAneWVzJyBdCnRoZW4gewogIGlmIFsgIiRET1dDSEsiID0gJ3llcycgXSB8fCBbICIkRE9XQ0hLIiA9ICdhdXRvJyBdCiAgdGhlbiB7CiAgICBlY2hvCiAgICBlY2hvIC1uICJTZWFyY2hpbmcgZm9yIGFuIGV4aXN0aW5nIFdpbmRvd3MgaW5zdGFsbGF0aW9uLi4uIgogICAgaWYgISAkV0lORUNPTkYgLWluaWZpbGUgIiRXSU5FSU5JIiA+ICRDT05GIDI+L2Rldi9udWxsCiAgICB0aGVuIHsKICAgICAgcm0gLWYgJENPTkYKICAgICAgZWNobyAiIG5vdCBmb3VuZC4iCiAgICAgIGNvbmZfcXVlc3Rpb24gbG93IGRvX3dpdGhvdXRfd2luZG93cyBcCiAgICAgICAiV2luZG93cyB3YXMgbm90IGZvdW5kIG9uIHlvdXIgc3lzdGVtLCBzbyBJIGFzc3VtZSB5b3Ugd2FudCIgXAogICAgICAgImEgV2luZS1vbmx5IGluc3RhbGxhdGlvbi4gQW0gSSBjb3JyZWN0PyIKICAgICAgY29uZl95ZXNub19hbnN3ZXIgIih5ZXMvbm8pICIKICAgICAgaWYgWyAiJEFOU1dFUiIgPSAnbm8nIF0KICAgICAgdGhlbiB7CiAgICAgICAgY29uZl9xdWVzdGlvbiBoaWdoIHdpbmRvd3Nfbm90X2ZvdW5kIFwKICAgICAgICAgIkFib3J0aW5nIGluc3RhbGwuIE1ha2Ugc3VyZSB5b3VyIFdpbmRvd3MgcGFydGl0aW9uIGlzIG1vdW50ZWQgYW5kIHRyeSBhZ2FpbiwiIFwKICAgICAgICAgIm9yIGNyZWF0ZSAkQ09ORiBtYW51YWxseSBieSBjb3B5aW5nIGZyb20gJFdJTkVJTkkgYW5kIGFkYXB0aW5nIHRoZSBkcml2ZSBwYXRocy4iCiAgICAgICAgZXhpdCAxCiAgICAgIH0KICAgICAgZmkKICAgICAgRE9XSU5FPXllcwogICAgfQogICAgZWxzZSB7CiAgICAgIGVjaG8gIiBmb3VuZC4iCiAgICAgIGNvbmZfcmVzZXRfcXVlc3Rpb24gd2luZG93c19mb3VuZAogICAgICBjb25mX3F1ZXN0aW9uIGxvdyB3aW5kb3dzX2ZvdW5kIFwKICAgICAgICJDcmVhdGVkICRDT05GIHVzaW5nIHlvdXIgZXhpc3RpbmcgV2luZG93cyBpbnN0YWxsYXRpb24uIiBcCiAgICAgICAiWW91IHByb2JhYmx5IHdhbnQgdG8gcmV2aWV3IHRoZSBmaWxlLCB0aG91Z2guIgogICAgICBET1dJTkU9bm8KICAgIH0KICAgIGZpCiAgfQogIGVsaWYgWyAiJERPV0lORSIgPSAnYXV0bycgXQogIHRoZW4gRE9XSU5FPXllcwogIGZpCn0KZWxpZiBbICIkRE9XSU5FIiA9ICdhdXRvJyBdCnRoZW4gRE9XSU5FPW5vCmZpCgojIHNldHVwIGEgbm8td2luZG93cyBpbnN0YWxsYXRpb24sIGlmIG5lY2Vzc2FyeQppZiBbICIkRE9XSU5FIiA9ICd5ZXMnIF0KdGhlbiB7CiAgaWYgWyBgd2hvYW1pYCAhPSAncm9vdCcgXQogIHRoZW4gRENST09UPX4vYwogIGVsc2UgRENST09UPS9jCiAgZmkKICBjb25mX3F1ZXN0aW9uIGxvdyBkcml2ZWNfcGF0aCBcCiAgICJDb25maWd1cmluZyBXaW5lIHdpdGhvdXQgV2luZG93cy4iIFwKICAgIlNvbWUgZmFrZSBXaW5kb3dzIGRpcmVjdG9yaWVzIG11c3QgYmUgY3JlYXRlZCwgdG8gaG9sZCBhbnkgLmluaSBmaWxlcywgRExMcywiIFwKICAgInN0YXJ0IG1lbnUgZW50cmllcywgYW5kIG90aGVyIHRoaW5ncyB5b3VyIGFwcGxpY2F0aW9ucyBtYXkgbmVlZCB0byBpbnN0YWxsLiIgXAogICAiV2hlcmUgd291bGQgb3l1IGxpa2UgeW91ciBmYWtlIEMgZHJpdmUgdG8gYmUgcGxhY2VkPyIKICB3aGlsZSBbIC16ICIkQ1JPT1QiIF0KICBkbyB7CiAgICBjb25mX3N0cmluZ19hbnN3ZXIgIihkZWZhdWx0IGlzICREQ1JPT1QpICIKICAgIGlmIFsgLXogIiRBTlNXRVIiIF0KICAgIHRoZW4gQ1JPT1Q9IiREQ1JPT1QiCiAgICBlbGlmICEgWyAtZCAiJEFOU1dFUiIgXQogICAgdGhlbiB7CiAgICAgIGlmIG1rZGlyIC1wICIkQU5TV0VSIgogICAgICB0aGVuIENST09UPSIkQU5TV0VSIgogICAgICBlbHNlIGNvbmZfcmVzZXRfcXVlc3Rpb24gZHJpdmVjX3BhdGgKICAgICAgZmkKICAgIH0KICAgIGVsc2UgQ1JPT1Q9IiRBTlNXRVIiCiAgICBmaQogIH0KICBkb25lCiAgZWNobyAiQ29uZmlndXJpbmcgV2luZSBmb3IgYSBuby13aW5kb3dzIGluc3RhbGwgaW4gJENST09ULi4uIgogIGZvciB0ZGlyIGluICIkQ1JPT1Qvd2luZG93cyIgIiRDUk9PVC93aW5kb3dzL3N5c3RlbSIgXAogICAgICAgICAgICAgICIkQ1JPT1Qvd2luZG93cy9TdGFydCBNZW51IiAiJENST09UL3dpbmRvd3MvU3RhcnQgTWVudS9Qcm9ncmFtcyIgXAogICAgICAgICAgICAgICIkQ1JPT1QvQ29tbW9uIEZpbGVzIiAiJENST09UL1Byb2dyYW0gRmlsZXMiIFwKICAgICAgICAgICAgICAiJENST09UL3dpbmRvd3MvUHJvZmlsZXMiICIkQ1JPT1Qvd2luZG93cy9Qcm9maWxlcy9BZG1pbmlzdHJhdG9yIgogIGRvIFsgLWQgIiR0ZGlyIiBdIHx8IG1rZGlyICIkdGRpciIKICBkb25lCiAgWyAtZiAiJENST09UL3dpbmRvd3Mvd2luLmluaSIgXSAgICB8fCBjcCAiJFdJTklOSSIgICAgIiRDUk9PVC93aW5kb3dzL3dpbi5pbmkiCiAgWyAtZiAiJENST09UL3dpbmRvd3Mvc3lzdGVtLmluaSIgXSB8fCBjcCAiJFNZU1RFTUlOSSIgIiRDUk9PVC93aW5kb3dzL3N5c3RlbS5pbmkiCiAgaWYgWyAiJERPQ09ORiIgPSAneWVzJyBdCiAgdGhlbiB7CiAgICBzZWQgInN8UGF0aD0vY1wkfFBhdGg9JHtDUk9PVH18IiAkV0lORUlOSSA+ICRDT05GCiAgICBjb25mX3Jlc2V0X3F1ZXN0aW9uIGRlZmF1bHRfY29uZmlnCiAgICBjb25mX3F1ZXN0aW9uIGxvdyBkZWZhdWx0X2NvbmZpZyBcCiAgICAgIkNyZWF0ZWQgJENPTkYgdXNpbmcgZGVmYXVsdCBXaW5lIGNvbmZpZ3VyYXRpb24uIiBcCiAgICAgIllvdSBwcm9iYWJseSB3YW50IHRvIHJldmlldyB0aGUgZmlsZSwgdGhvdWdoLiIKICB9CiAgZmkKICAjIG5vdyB3ZSByZWFsbHkgc2hvdWxkIGluc3RhbGwgdGhlIHJlZ2lzdHJ5CiAgaWYgWyAiJERPUkVHIiA9ICdhdXRvJyBdCiAgdGhlbiBET1JFRz15ZXMKICBmaQp9CmVsaWYgWyAteiAiJENST09UIiBdCnRoZW4gewogIGVjaG8KICBlY2hvICJSZWFkaW5nIGN1cnJlbnQgV2luZSBjb25maWd1cmF0aW9uIGZyb20gJENPTkYuLi4iCiAgQ1JPT1Q9YHNlZCAtbiAnL15cW0RyaXZlIENcXSQvLC9eXFsuKlxdJC8gcy9eUGF0aD1cKC4qXCkvXDEvcCcgJENPTkZgCiAgZWNobyAiRHJpdmUgQyBpcyBjb25maWd1cmVkIGF0ICRDUk9PVC4iCn0KZmkKZWNobwoKIyBmaXh1cCBFWFRSQV9MRF9MSUJSQVJZX1BBVEgKaWYgWyAiJERPQ09ORiIgPSAneWVzJyBdCnRoZW4gewogIGVjaG8gIlNldHRpbmcgRVhUUkFfTERfTElCUkFSWV9QQVRIIGluIC53aW5lcmMgdG8gJERMTFBBVEguLi4iCiAgc2VkICJzfEVYVFJBX0xEX0xJQlJBUllfUEFUSD0uKnxFWFRSQV9MRF9MSUJSQVJZX1BBVEg9JHtETExQQVRIfXwiICRDT05GID4gJENPTkYubmV3CiAgbXYgLWYgJENPTkYubmV3ICRDT05GCiAgZWNobwp9CmZpCgojIGNoZWNrIHdoZXRoZXIgd2UgbmVlZCB0byBpbnN0YWxsIGRlZmF1bHQgcmVnaXN0cnkKIyAobm90IHRvIGJlIGRvbmUgaWYgd2luZG93cyByZWdpc3RyeSBleGlzdHMpCmlmIFsgIiRET1JFRyIgPSAnYXV0bycgXQp0aGVuIHsKICBlY2hvICJDaGVja2luZyBmb3IgcmVhbCBXaW5kb3dzIHJlZ2lzdHJ5Li4uIgogIGlmIFsgLWYgIiRDUk9PVC93aW5kb3dzL3N5c3RlbS5kYXQiIF0KICB0aGVuIERPUkVHPW5vCiAgZWxpZiBbIC1mICIkQ1JPT1Qvd2luZG93cy9zeXN0ZW0zMi9jb25maWcvc3lzdGVtIiBdCiAgdGhlbiBET1JFRz1ubwogIGVsc2UgRE9SRUc9eWVzCiAgZmkKICBpZiBbICIkRE9SRUciID0gJ3llcycgXQogIHRoZW4gZWNobyAiTm90IGZvdW5kLCBkZWZhdWx0IFdpbmUgcmVnaXN0cnkgd2lsbCBiZSBpbnN0YWxsZWQuIgogIGVsc2UgZWNobyAiV2luZG93cyByZWdpc3RyeSBmb3VuZCwgd2lsbCBub3QgaW5zdGFsbCBkZWZhdWx0IFdpbmUgcmVnaXN0cnkuIgogIGZpCiAgZWNobwp9CmZpCgojIGluc3RhbGwgZGVmYXVsdCByZWdpc3RyeSBlbnRyaWVzCmlmIFsgIiRET1JFRyIgPSAneWVzJyBdCnRoZW4gewogIGlmIFsgIiRCSU5ESVNUIiA9ICdubycgXQogIHRoZW4gewogICAgZWNobyAiQ29tcGlsaW5nIHJlZ2FwaS4uLiIKICAgIGVjaG8KICAgIChjZCBwcm9ncmFtcy9yZWdhcGk7IG1ha2UpCiAgICBlY2hvCiAgfQogIGZpCiAgZWNobyAiUHJlcGFyaW5nIHRvIGluc3RhbGwgZGVmYXVsdCBXaW5lIHJlZ2lzdHJ5IGVudHJpZXMuLi4iCgogICMgY3JlYXRlIGEgdGVtcG9yYXJ5IHdpbmVpbnN0YWxsLmNvbmYgZmlsZSB1c2luZyB0dHlkcnYsCiAgIyBzbyB0aGF0IHdlIGRvbid0IGhhdmUgdG8gcnVuIHJlZ2FwaSB1bmRlciBYCiAgc2VkICJzL0dyYXBoaWNzRHJpdmVyPS4qL0dyYXBoaWNzRHJpdmVyPXR0eWRydi8iICRDT05GID4gJFRNUENPTkYKCiAgIyBjcmVhdGUgYSB0ZW1wb3Jhcnkgd2luZWluc3RhbGwucmVnIHdpdGggZml4ZWQgZGVidWdnZXIgcGF0aAogICRERUZDQVQgJERFRlJFRyB8IHNlZCAic3xkZWJ1Z2dlci93aW5lZGJnfCR7REVCVUdHRVJ9fCIgPiAkVE1QUkVHCgogIGVjaG8gIkluc3RhbGxpbmcgZGVmYXVsdCBXaW5lIHJlZ2lzdHJ5IGVudHJpZXMuLi4iCiAgZWNobwogIGlmICEgJFJFR0FQSSAtLWNvbmZpZyAkVE1QQ09ORiBzZXRWYWx1ZSA8ICRUTVBSRUcgPiAvZGV2L251bGwKICB0aGVuIHsKICAgIHJtIC1mICRUTVBDT05GICRUTVBSRUcKICAgIGVjaG8gIlJlZ2lzdHJ5IGluc3RhbGwgZmFpbGVkLiIKICAgIGNvbmZfcmVzZXRfcXVlc3Rpb24gcmVnYXBpX2Vycm9yCiAgICBjb25mX3F1ZXN0aW9uIGhpZ2ggcmVnYXBpX2Vycm9yCiAgICBleGl0IDEKICB9CiAgZWxzZSBlY2hvICJSZWdpc3RyeSBlbnRyaWVzIHN1Y2Nlc3NmdWxseSBpbnN0YWxsZWQuIgogIGZpCiAgcm0gLWYgJFRNUENPTkYgJFRNUFJFRwogIGlmIFsgIiRTWVNSRUciID0gJ2F1dG8nIF0KICB0aGVuIFNZU1JFRz15ZXMKICBmaQp9CmZpCgojIG1ha2Ugcm9vdCdzIHJlZ2lzdHJ5IGdsb2JhbCwgaWYgZGVzaXJlZAppZiBbIGB3aG9hbWlgID0gJ3Jvb3QnIF0gJiYgWyAiJFNZU1JFRyIgPSAneWVzJyBdCnRoZW4gewogIFsgLWQgfi8ud2luZSBdIHx8IG1rZGlyIH4vLndpbmUKICBpZiAhIFsgLWYgJHN5c2NvbmZkaXIvd2luZS51c2VycmVnIF0KICB0aGVuIHsKICAgIGVjaG8gIkxpbmtpbmcgcm9vdCdzIHVzZXIgcmVnaXN0cnkgaGl2ZSB0byB0aGUgZ2xvYmFsIHJlZ2lzdHJ5Li4uIgogICAgWyAtZiB+Ly53aW5lL3dpbmUudXNlcnJlZyBdICYmIGNwIH4vLndpbmUvd2luZS51c2VycmVnICRzeXNjb25mZGlyL3dpbmUudXNlcnJlZwogICAgbG4gLXNmICRzeXNjb25mZGlyL3dpbmUudXNlcnJlZyB+Ly53aW5lL3dpbmUudXNlcnJlZwogIH0KICBmaQogIGlmICEgWyAtZiAkc3lzY29uZmRpci93aW5lLnN5c3RlbXJlZyBdCiAgdGhlbiB7CiAgICBlY2hvICJMaW5raW5nIHJvb3QncyBzeXN0ZW0gcmVnaXN0cnkgaGl2ZSB0byB0aGUgZ2xvYmFsIHJlZ2lzdHJ5Li4uIgogICAgWyAtZiB+Ly53aW5lL3N5c3RlbS5yZWcgXSAmJiBjcCB+Ly53aW5lL3N5c3RlbS5yZWcgJHN5c2NvbmZkaXIvd2luZS5zeXN0ZW1yZWcKICAgIGxuIC1zZiAkc3lzY29uZmRpci93aW5lLnN5c3RlbXJlZyB+Ly53aW5lL3N5c3RlbS5yZWcKICB9CiAgZmkKfQpmaQoKIyBpdCdzIGEgd3JhcAplY2hvCmVjaG8gIkluc3RhbGxhdGlvbiBjb21wbGV0ZSBmb3Igbm93LiBHb29kIGx1Y2sgKHRoaXMgaXMgc3RpbGwgYWxwaGEgc29mdHdhcmUpLiIKZWNobyAiSWYgeW91IGhhdmUgcHJvYmxlbXMgd2l0aCBXSU5FLCBwbGVhc2UgcmVhZCB0aGUgZG9jdW1lbnRhdGlvbiBmaXJzdCwiCmVjaG8gImFzIG1hbnkga2luZHMgb2YgcG90ZW50aWFsIHByb2JsZW1zIGFyZSBleHBsYWluZWQgdGhlcmUuIgoKZXhpdCAwCg==