IyEvYmluL2Jhc2gKIyBXSU5FIEluc3RhbGxhdGlvbiBzY3JpcHQKIyBDYW4gZG8gYWxtb3N0IGV2ZXJ5dGhpbmcgZnJvbSBjb21waWxpbmcgdG8gY29uZmlndXJpbmcuLi4KIwojIENvcHlyaWdodCAxOTk5IE92ZSBL5XZlbgojCiMgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgojIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKIyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKIyB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KIwojIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAojIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKIyBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgojCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwojIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKIyBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBCiMKCiMtLS0gZGVmYXVsdHMgKGNoYW5nZSB0aGVzZSBpZiB5b3UgYXJlIGEgcGFja2FnZXIpCkNPTkZBUkdTPSIiICAgICAgICAgICAgICAgICAgICMgY29uZmlndXJlIGFyZ3MsIGUuZy4gLS1wcmVmaXg9L3VzcgoKIyBmdW5jdGlvbnMKCmZ1bmN0aW9uIHN0ZF9zbGVlcCB7CiAgc2xlZXAgMQp9CgpmdW5jdGlvbiBjb25mX3llc25vX2Fuc3dlciB7CiAgdW5zZXQgQU5TV0VSCiAgd2hpbGUgWyAiJEFOU1dFUiIgIT0gJ3llcycgXSAmJiBbICIkQU5TV0VSIiAhPSAnbm8nIF0KICBkbyB7CiAgICBlY2hvIC1uICIkMSIKICAgIHJlYWQgQU5TV0VSCiAgfQogIGRvbmUKfQoKIyBzdGFydHVwLi4uCgplY2hvICJXaW5lIEluc3RhbGxlciB2MS4wIgplY2hvCgppZiAhIFsgLWYgY29uZmlndXJlIF0KdGhlbgogICAgaWYgWyAtZiAuLi9jb25maWd1cmUgXQogICAgdGhlbiB7CiAgICAgIGNkIC4uCiAgICB9CiAgICBlbHNlIHsKICAgICAgZWNobyAiWW91J3JlIHJ1bm5pbmcgdGhpcyBmcm9tIHRoZSB3cm9uZyBkaXJlY3RvcnkuIgogICAgICBlY2hvICJDaGFuZ2UgdG8gdGhlIFdpbmUgc291cmNlJ3MgbWFpbiBkaXJlY3RvcnkgYW5kIHRyeSBhZ2Fpbi4iCiAgICAgIGV4aXQgMQogICAgfQogICAgZmkKZmkKCmlmIFsgYHdob2FtaWAgPSAncm9vdCcgXQp0aGVuCiAgICBlY2hvICJZb3UgYXJlIHJ1bm5pbmcgd2luZWluc3RhbGwgYXMgcm9vdCwgdGhpcyBpcyBub3QgYWR2aXNhYmxlLiBQbGVhc2UgcmVydW4gYXMgYSB1c2VyLiIKICAgIGVjaG8gIkFib3J0aW5nLiIKICAgIGV4aXQgMQpmaQoKaWYgWyAhIC13IC4gXQp0aGVuCiAgICBlY2hvICJUaGUgc291cmNlIGRpcmVjdG9yeSBpcyBub3Qgd3JpdGFibGUuIFlvdSBwcm9iYWJseSBleHRyYWN0ZWQgdGhlIHNvdXJjZXMgYXMgcm9vdC4iCiAgICBlY2hvICJZb3Ugc2hvdWxkIHJlbW92ZSB0aGUgc291cmNlIHRyZWUgYW5kIGV4dHJhY3QgaXQgYWdhaW4gYXMgYSBub3JtYWwgdXNlci4iCiAgICBleGl0IDEKZmkKCiMgY2hlY2sgd2hldGhlciBSUE0gaW5zdGFsbGVkLCBhbmQgaWYgaXQgaXMsIHJlbW92ZSBhbnkgb2xkIHdpbmUgcnBtLgpoYXNoIHJwbSAmPi9kZXYvbnVsbApSRVQ9JD8KaWYgWyAkUkVUIC1lcSAwIF07IHRoZW4KICAgIGlmIFsgLW4gImBycG0gLXFpIHdpbmUgMj4vZGV2L251bGx8Z3JlcCAiXk5hbWUiYCIgXTsgdGhlbgogICAgICBlY2hvICJXYXJuaW5nOiBPbGQgV2luZSBSUE0gaW5zdGFsbCBkZXRlY3RlZC4gRG8geW91IHdhbnQgdG8gcmVtb3ZlIGl0IGZpcnN0PyIKICAgICAgY29uZl95ZXNub19hbnN3ZXIgIih5ZXMvbm8pICIKICAgICAgaWYgWyAiJEFOU1dFUiIgPSAneWVzJyBdOyB0aGVuCiAgICAgICAgZWNobyAiV2UgbmVlZCB0byByZW1vdmUgdGhlIHJwbSBhcyByb290LCBwbGVhc2UgZW50ZXIgeW91ciByb290IHBhc3N3b3JkIgogICAgICAgIGVjaG8KICAgICAgICBlY2hvIFN0YXJ0aW5nIHdpbmUgcnBtIHJlbW92YWwuLi4KICAgICAgICBzdSAtYyAicnBtIC1lIHdpbmU7IFJFVD0kPyIKICAgICAgICBpZiBbICRSRVQgLWVxIDAgXTsgdGhlbgogICAgICAgICAgZWNobyBEb25lLgogICAgICAgIGVsc2UKICAgICAgICAgIGVjaG8gIkZBSUxFRC4gUHJvYmFibHkgeW91IGFyZW4ndCBpbnN0YWxsaW5nIGFzIHJvb3QuIgogICAgICAgICAgZWNobyAiRXhwZWN0IHByb2JsZW1zIChsaWJyYXJ5IGNvbmZsaWN0cyB3aXRoIGV4aXN0aW5nIGluc3RhbGwgZXRjLikuIgogICAgICAgIGZpCiAgICAgIGVsc2UKICAgICAgICBlY2hvICJTb3JyeSwgSSB3b24ndCBpbnN0YWxsIFdpbmUgd2hlbiBhbiBycG0gdmVyc2lvbiBpcyBzdGlsbCBpbnN0YWxsZWQuIgogICAgICAgIGVjaG8gIihXaW5lIHN1cHBvcnQgc3VmZmVyZWQgZnJvbSB3YXkgdG9vIG1hbnkgY29uZmxpY3RzIGJldHdlZW4gUlBNIgogICAgICAgIGVjaG8gImFuZCBzb3VyY2UgaW5zdGFsbHMpIgogICAgICAgIGVjaG8gIkhhdmUgYSBuaWNlIGRheSAhIgogICAgICAgIGV4aXQgMQogICAgICBmaQogICAgZmkKZmkKCiMgY2hlY2sgd2hldGhlciB3aW5lIGJpbmFyeSBzdGlsbCBhdmFpbGFibGUKaWYgWyAtbiAiYHdpbmUgLS12ZXJzaW9uIDI+L2Rldi9udWxsYCIgXQp0aGVuCiAgICBlY2hvICJXYXJuaW5nICEhIHdpbmUgYmluYXJ5IChzdGlsbCkgZm91bmQsIHdoaWNoIG1heSBpbmRpY2F0ZSIKICAgIGVjaG8gImEgKGNvbmZsaWN0aW5nKSBwcmV2aW91cyBpbnN0YWxsYXRpb24uIgogICAgZWNobyAiWW91IG1pZ2h0IHdhbnQgdG8gYWJvcnQgYW5kIHVuaW5zdGFsbCBXaW5lIGZpcnN0LiIKICAgIGVjaG8gIihJZiB5b3UgcHJldmlvdXNseSB0cmllZCB0byBpbnN0YWxsIGZyb20gc291cmNlIG1hbnVhbGx5LCAiCiAgICBlY2hvICJydW4gJ21ha2UgdW5pbnN0YWxsJyBmcm9tIHRoZSB3aW5lIHJvb3QgZGlyZWN0b3J5KSIKICAgIHN0ZF9zbGVlcApmaQoKIyBydW4gdGhlIGNvbmZpZ3VyZSBzY3JpcHQsIGlmIG5lY2Vzc2FyeQoKaWYgWyAtZiBNYWtlZmlsZSBdCnRoZW4KICAgIGVjaG8gIkkgc2VlIHRoYXQgV2luZSBoYXMgYWxyZWFkeSBiZWVuIGNvbmZpZ3VyZWQsIHNvIEknbGwgc2tpcCB0aGF0LiIKICAgIHN0ZF9zbGVlcAplbHNlCiAgICBlY2hvICJSdW5uaW5nIGNvbmZpZ3VyZS4uLiIKICAgIGVjaG8KICAgIGlmICEgLi9jb25maWd1cmUgJENPTkZBUkdTCiAgICB0aGVuIHsKICAgICAgZWNobwogICAgICBlY2hvICJDb25maWd1cmUgZmFpbGVkLCBhYm9ydGluZyBpbnN0YWxsLiIKICAgICAgZXhpdCAxCiAgICB9CiAgICBmaQpmaQoKIyBub3cgZG8gdGhlIGNvbXBpbGF0aW9uIGFuZCBpbnN0YWxsLCB3ZSBuZWVkIHRvIGFsd2F5cyBkbyB0aGlzIGJlY2F1c2Ugd2UKIyBkb24ndCB3YW50IHRoZSAnbWFrZSBpbnN0YWxsJyBjb21tYW5kIHdlIG1pZ2h0IHJ1biB0byBydW4gJ21ha2UnIGFzIHJvb3QKCiMgYXNrIHRoZSB1c2VyIGlmIHRoZXkgd2FudCB0byBidWlsZCBhbmQgaW5zdGFsbCB3aW5lCmVjaG8KZWNobyAiV2UgbmVlZCB0byBpbnN0YWxsIHdpbmUgYXMgcm9vdCB1c2VyLCBkbyB5b3Ugd2FudCB1cyB0byBidWlsZCB3aW5lLCIKZWNobyAiJ3N1IHJvb3QnIGFuZCBpbnN0YWxsIFdpbmU/ICBFbnRlciAnbm8nIHRvIGNvbnRpbnVlIHdpdGhvdXQgaW5zdGFsbGluZyIKY29uZl95ZXNub19hbnN3ZXIgIih5ZXMvbm8pICIKUk9PVElOU1RBTEw9IiRBTlNXRVIiCgppZiBbICIkUk9PVElOU1RBTEwiID0gInllcyIgXQp0aGVuIHN1Y29tbWFuZD0ibWFrZSBpbnN0YWxsIgpmaQoKZWNobwplY2hvICJDb21waWxpbmcgV2luZS4gR3JhYiBhIGx1bmNoIG9yIHR3bywgcmVudCBhIHZpZGVvLCBvciB3aGF0ZXZlciwiCmVjaG8gImluIHRoZSBtZWFudGltZS4uLiIKZWNobwpzdGRfc2xlZXAKCiMgdHJ5IHRvIGp1c3QgbWFrZSB3aW5lLCBpZiB0aGlzIGZhaWxzICdtYWtlIGRlcGVuZCcgYW5kIHRyeSB0byByZW1ha2UKaWYgISB7IG1ha2U7IH0KdGhlbgogICAgaWYgISB7IG1ha2UgZGVwZW5kICYmIG1ha2U7IH0KICAgIHRoZW4KICAgICAgZWNobwogICAgICBlY2hvICJDb21waWxhdGlvbiBmYWlsZWQsIGFib3J0aW5nIGluc3RhbGwuIgogICAgICBleGl0IDEKICAgIGZpCmZpCgppZiBbICIkUk9PVElOU1RBTEwiID0gIm5vIiBdCnRoZW4KICAgIGV4aXQgMApmaQoKZWNobwplY2hvICJQZXJmb3JtaW5nICdtYWtlIGluc3RhbGwnIGFzIHJvb3QgdG8gaW5zdGFsbCBiaW5hcmllcywgZW50ZXIgcm9vdCBwYXNzd29yZCIKCmlmICEgc3Ugcm9vdCAtYyAiJHN1Y29tbWFuZCIKdGhlbgogICAgZWNobwogICAgZWNobyAiSW5jb3JyZWN0IHJvb3QgcGFzc3dvcmQuIElmIHlvdSBhcmUgcnVubmluZyBVYnVudHUgb3IgYSBzaW1pbGFyIGRpc3RyaWJ1dGlvbiwiCiAgICBlY2hvICInbWFrZSBpbnN0YWxsJyBuZWVkcyB0byBiZSBydW4gdmlhIHRoZSBzdWRvIHdyYXBwZXIsIHNvIHRyeWluZyB0aGF0IG9uZSBub3ciCiAgICBpZiAhIHN1ZG8gc3Ugcm9vdCAtYyAiJHN1Y29tbWFuZCIKICAgIHRoZW4KICAgICAgICAgZWNobwogICAgICAgICBlY2hvICJFaXRoZXIgeW91IGVudGVyZWQgYW4gaW5jb3JyZWN0IHBhc3N3b3JkIG9yIHdlIGZhaWxlZCB0byIKICAgICAgICAgZWNobyAicnVuICckc3Vjb21tYW5kJyBjb3JyZWN0bHkuIgogICAgICAgICBlY2hvICJJZiB5b3UgZGlkbid0IGVudGVyIGFuIGluY29ycmVjdCBwYXNzd29yZCB0aGVuIHBsZWFzZSIKICAgICAgICAgZWNobyAicmVwb3J0IHRoaXMgZXJyb3IgYW5kIGFueSBzdGVwcyB0byBwb3NzaWJseSByZXByb2R1Y2UgaXQgdG8iCiAgICAgICAgIGVjaG8gImh0dHA6Ly9idWdzLndpbmVocS5vcmcvIgogICAgICAgICBlY2hvCiAgICAgICAgIGVjaG8gIkluc3RhbGxhdGlvbiBmYWlsZWQsIGFib3J0aW5nLiIKICAgICAgICAgZXhpdCAxCiAgICBmaQpmaQoKIyBpdCdzIGEgd3JhcAplY2hvCmVjaG8gIkluc3RhbGxhdGlvbiBjb21wbGV0ZS4iCmVjaG8gIklmIHlvdSBoYXZlIHByb2JsZW1zIHdpdGggV2luZSwgcGxlYXNlIHJlYWQgdGhlIGRvY3VtZW50YXRpb24gZmlyc3QsIgplY2hvICJhcyBtYW55IGtpbmRzIG9mIHBvdGVudGlhbCBwcm9ibGVtcyBhcmUgZXhwbGFpbmVkIHRoZXJlLiIKCmV4aXQgMAo=