IyEvYmluL2Jhc2gKIyBXSU5FIEluc3RhbGxhdGlvbiBzY3JpcHQKCiMgTWFyIDMxIDE5OTkgLSBPdmUgS+V2ZW4KIyAgRmlyc3QgdmVyc2lvbgoKIyBkZWZhdWx0cwoKc3lzY29uZmRpcj0vdXNyL2xvY2FsL2V0YwpET0NPTkY9YXV0bwpET1JFRz15ZXMKCiMgc3RhcnR1cC4uLgoKZWNobyAiV0lORSBJbnN0YWxsZXIgdjAuMSIKZWNobwppZiAhIFsgLWYgY29uZmlndXJlIF0KdGhlbiB7CiAgZWNobyAiWW91J3JlIHJ1bm5pbmcgdGhpcyBmcm9tIHRoZSB3cm9uZyBkaXJlY3RvcnkuIgogIGVjaG8gIkNoYW5nZSB0byB0aGUgV2luZSBkaXJlY3RvcnkgYW5kIHRyeSBhZ2Fpbi4iCiAgZXhpdCAxCn0KZmkKCiMgcnVuIHRoZSBjb25maWd1cmUgc2NyaXB0LCBpZiBuZWNlc3NhcnkKCmlmIFsgLWYgTWFrZWZpbGUgXSAmJiBbIE1ha2VmaWxlIC1udCBjb25maWd1cmUgXQp0aGVuIHsKICBlY2hvICJJIHNlZSB0aGF0IFdJTkUgaGFzIGFscmVhZHkgYmVlbiBjb25maWd1cmVkLCBzbyBJJ2xsIHNraXAgdGhhdC4iCn0KZWxzZSB7CiAgIyB3ZSdsbCBydW4gd2l0aCBkZWZhdWx0cyAod2UgbmVlZCBsaWJ3aW5lLmEgbGF0ZXIpCiAgZWNobyAiUnVubmluZyBjb25maWd1cmUuLi4iCiAgZWNobwogIGlmICEgLi9jb25maWd1cmUKICB0aGVuIHsKICAgIGVjaG8KICAgIGVjaG8gIkNvbmZpZ3VyZSBmYWlsZWQsIGFib3J0aW5nIGluc3RhbGwuIgogICAgcm0gLWYgY29uZmlnLmNhY2hlCiAgICBleGl0IDEKICB9CiAgZmkKICAjIG1ha2Ugc3VyZSBYIHdhcyBmb3VuZAogIGlmICEgZ3JlcCAtcXMgImhhdmVfeD15ZXMiIGNvbmZpZy5jYWNoZQogIHRoZW4gewogICAgZWNobyAiSW5zdGFsbCB0aGUgWCBkZXZlbG9wbWVudCBoZWFkZXJzIGFuZCB0cnkgYWdhaW4uIgogICAgcm0gLWYgY29uZmlnLmNhY2hlCiAgICBleGl0IDEKICB9CiAgZmkKfQpmaQoKIyBub3cgZG8gdGhlIGNvbXBpbGF0aW9uCgppZiBbIC1mIHdpbmUgXSAmJiBbIHdpbmUgLW50IE1ha2VmaWxlIF0KdGhlbiB7CiAgZWNobyAiSG1tLCBsb29rcyBsaWtlIFdJTkUgaXMgYWxyZWFkeSBjb21waWxlZC4gSSdsbCBza2lwIHRoYXQgdG9vLCBJIGd1ZXNzLiIKfQplbHNlIHsKICBlY2hvICJDb21waWxpbmcgV0lORS4gR3JhYiBhIGx1bmNoIG9yIHR3bywgcmVudCBhIHZpZGVvLCBvciB3aGF0ZXZlciwgaW4gdGhlIG1lYW50aW1lLi4uIgogIGVjaG8KICBpZiAhIHsgbWFrZSBkZXBlbmQgJiYgbWFrZTsgfQogIHRoZW4gewogICAgZWNobwogICAgZWNobyAiQ29tcGlsYXRpb24gZmFpbGVkLCBhYm9ydGluZyBpbnN0YWxsLiIKICAgIGV4aXQgMQogIH0KICBmaQogIGVjaG8KfQpmaQoKIyBhbmQgaW5zdGFsbGF0aW9uLCBpZiByb290CgppZiBbIGB3aG9hbWlgICE9ICdyb290JyBdCnRoZW4gewogIGVjaG8gIllvdSBhcmVuJ3Qgcm9vdCwgc28gSSdsbCBza2lwIHRoZSBtYWtlIGluc3RhbGwuIgp9CmVsc2UgewogIGVjaG8gIk5vdyBpbnN0YWxsaW5nIGJpbmFyaWVzIG9udG8gdGhlIHN5c3RlbS4uLiIKICBlY2hvCiAgaWYgISBtYWtlIGluc3RhbGwKICB0aGVuIHsKICAgIGVjaG8KICAgIGVjaG8gIkluc3RhbGxhdGlvbiBmYWlsZWQsIGFib3J0aW5nLiIKICAgIGV4aXQgMQogIH0KICBmaQp9CmZpCmVjaG8KCiMgbm93IGNoZWNrIHdoZXRoZXIgd2Ugc2hvdWxkIGdlbmVyYXRlIHdpbmUuY29uZgppZiBbIC16ICIkRE9DT05GIiBdCnRoZW4gRE9DT05GPWF1dG8KZmkKCmlmIFsgIiRET0NPTkYiID0gJ2F1dG8nIF0KdGhlbiB7CiAgIyBzZWUgaWYgd2UgYWxyZWFkeSBoYXZlIGEgc3lzdGVtIHdpbmUuY29uZgogIGlmIFsgLWYgJHN5c2NvbmZkaXIvd2luZS5jb25mIF0gfHwgWyAtZiAvZXRjL3dpbmUuY29uZiBdCiAgdGhlbiBET0NPTkY9bm8KICBmaQp9CmZpCgppZiBbICIkRE9DT05GIiAhPSAnbm8nIF0KdGhlbiB7CiAgaWYgWyBgd2hvYW1pYCAhPSAncm9vdCcgXQogIHRoZW4gewogICAgQ09ORj1+Ly53aW5lcmMKICAgIGlmICEgWyAtZiAkQ09ORiBdCiAgICB0aGVuIHsKICAgICAgaWYgWyAiJERPQ09ORiIgIT0gJ3llcycgXQogICAgICB0aGVuIHsKICAgICAgICBlY2hvICJTaW5jZSB5b3UgYXJlbid0IHJvb3QsIGFuZCB0aGVyZSdzIG5vIHN5c3RlbSB3aW5lLmNvbmYsIEkgYXNzdW1lIgogICAgICAgIGVjaG8gInlvdSB3YW50IGEgdXNlci1zcGVjaWZpYyAud2luZXJjLiBBbSBJIGNvcnJlY3Q/ICh5ZXMvbm8pIgogICAgICAgIHdoaWxlIFsgIiRET0NPTkYiICE9ICd5ZXMnIF0gJiYgWyAiJERPQ09ORiIgIT0gJ25vJyBdCiAgICAgICAgZG8gcmVhZCBET0NPTkYKICAgICAgICBkb25lCiAgICAgIH0KICAgICAgZmkKICAgICAgaWYgWyAiJERPQ09ORiIgPSAnbm8nIF0KICAgICAgdGhlbiBlY2hvICJTa2lwcGluZyBnZW5lcmF0aW9uIG9mIC53aW5lcmMuIgogICAgICBmaQogICAgfQogICAgZmkKICB9CiAgZWxzZSB7CiAgICBDT05GPSRzeXNjb25mZGlyL3dpbmUuY29uZgogICAgbWtkaXIgLXAgJHN5c2NvbmZkaXIKICAgIERPQ09ORj15ZXMKICB9CiAgZmkKfQpmaQoKaWYgWyAiJERPQ09ORiIgPSAneWVzJyBdCnRoZW4gewogIGVjaG8gIk5vdyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRpbmcgJENPTkYgZm9yIHlvdS4uLiIKICBlY2hvCiAgdG9vbHMvd2luZWNvbmYgPiAkQ09ORgogIGVjaG8KICBlY2hvICJEb25lLiBZb3UgcHJvYmFibHkgd2FudCB0byByZXZpZXcgdGhlIGZpbGUsIHRob3VnaC4iCn0KZmkKZWNobwoKIyBpbnN0YWxsIGRlZmF1bHQgcmVnaXN0cnkgZW50cmllcwppZiBbICIkRE9SRUciID0gJ3llcycgXQp0aGVuIHsKICBlY2hvICJDb21waWxpbmcgcmVnYXBpLi4uIgogIGVjaG8KICAoY2QgcHJvZ3JhbXMvcmVnYXBpOyBtYWtlKQogIGVjaG8KICBlY2hvICJJbnN0YWxsaW5nIGRlZmF1bHQgcmVnaXN0cnkgZW50cmllcywgcGxlYXNlIHdhaXQuLi4iCiAgZWNobwogIGlmICEgcHJvZ3JhbXMvcmVnYXBpL3JlZ2FwaSBzZXRWYWx1ZSA8IHdpbmVkZWZhdWx0LnJlZwogIHRoZW4gewogICAgZWNobwogICAgZWNobyAiUmVnaXN0cnkgaW5zdGFsbCBmYWlsZWQuIFBlcmhhcHMgeW91IHdlcmVuJ3QgcnVubmluZyBYLiIKICB9CiAgZmkKfQpmaQplY2hvCmVjaG8gIkluc3RhbGxhdGlvbiBjb21wbGV0ZSBmb3Igbm93LiBHb29kIGx1Y2sgKHRoaXMgaXMgc3RpbGwgYWxwaGEgc29mdHdhcmUpLiIKZWNobyAiSWYgeW91IGhhdmUgcHJvYmxlbXMgd2l0aCBXSU5FLCBwbGVhc2UgcmVhZCB0aGUgZG9jdW1lbnRhdGlvbiBmaXJzdC4iCg==