IyEvdXNyL2Jpbi9weXRob24gLXUKIyAtKi0gY29kaW5nOiBJU08tODg1OS0xIC0qLQojCiMgdGhpcyB0ZXN0cyB0aGUgYmFzaWMgQVBJcyBvZiB0aGUgWG1sVGV4dFJlYWRlciBpbnRlcmZhY2UKIwppbXBvcnQgbGlieG1sMgppbXBvcnQgc3lzCnRyeToKICAgIGltcG9ydCBTdHJpbmdJTwogICAgc3RyX2lvID0gU3RyaW5nSU8uU3RyaW5nSU8KZXhjZXB0OgogICAgaW1wb3J0IGlvCiAgICBzdHJfaW8gPSBpby5TdHJpbmdJTwoKIyBNZW1vcnkgZGVidWcgc3BlY2lmaWMKbGlieG1sMi5kZWJ1Z01lbW9yeSgxKQoKZiA9IHN0cl9pbygiIiI8YT48YiBiMT0iYjEiLz48Yz5jb250ZW50IG9mIGM8L2M+PC9hPiIiIikKaW5wdXQgPSBsaWJ4bWwyLmlucHV0QnVmZmVyKGYpCnJlYWRlciA9IGlucHV0Lm5ld1RleHRSZWFkZXIoInRlc3QxIikKcmV0ID0gcmVhZGVyLlJlYWQoKQppZiByZXQgIT0gMToKICAgIHByaW50KCJ0ZXN0MTogRXJyb3IgcmVhZGluZyB0byBmaXJzdCBlbGVtZW50IikKICAgIHN5cy5leGl0KDEpCmlmIHJlYWRlci5OYW1lKCkgIT0gImEiIG9yIHJlYWRlci5Jc0VtcHR5RWxlbWVudCgpICE9IDAgb3IgXAogICByZWFkZXIuTm9kZVR5cGUoKSAhPSAxIG9yIHJlYWRlci5IYXNBdHRyaWJ1dGVzKCkgIT0gMDoKICAgIHByaW50KCJ0ZXN0MTogRXJyb3IgcmVhZGluZyB0aGUgZmlyc3QgZWxlbWVudCIpCiAgICBzeXMuZXhpdCgxKQpyZXQgPSByZWFkZXIuUmVhZCgpCmlmIHJldCAhPSAxOgogICAgcHJpbnQoInRlc3QxOiBFcnJvciByZWFkaW5nIHRvIHNlY29uZCBlbGVtZW50IikKICAgIHN5cy5leGl0KDEpCmlmIHJlYWRlci5OYW1lKCkgIT0gImIiIG9yIHJlYWRlci5Jc0VtcHR5RWxlbWVudCgpICE9IDEgb3IgXAogICByZWFkZXIuTm9kZVR5cGUoKSAhPSAxIG9yIHJlYWRlci5IYXNBdHRyaWJ1dGVzKCkgIT0gMToKICAgIHByaW50KCJ0ZXN0MTogRXJyb3IgcmVhZGluZyB0aGUgc2Vjb25kIGVsZW1lbnQiKQogICAgc3lzLmV4aXQoMSkKcmV0ID0gcmVhZGVyLlJlYWQoKQppZiByZXQgIT0gMToKICAgIHByaW50KCJ0ZXN0MTogRXJyb3IgcmVhZGluZyB0byB0aGlyZCBlbGVtZW50IikKICAgIHN5cy5leGl0KDEpCmlmIHJlYWRlci5OYW1lKCkgIT0gImMiIG9yIHJlYWRlci5Jc0VtcHR5RWxlbWVudCgpICE9IDAgb3IgXAogICByZWFkZXIuTm9kZVR5cGUoKSAhPSAxIG9yIHJlYWRlci5IYXNBdHRyaWJ1dGVzKCkgIT0gMDoKICAgIHByaW50KCJ0ZXN0MTogRXJyb3IgcmVhZGluZyB0aGUgdGhpcmQgZWxlbWVudCIpCiAgICBzeXMuZXhpdCgxKQpyZXQgPSByZWFkZXIuUmVhZCgpCmlmIHJldCAhPSAxOgogICAgcHJpbnQoInRlc3QxOiBFcnJvciByZWFkaW5nIHRvIHRleHQgbm9kZSIpCiAgICBzeXMuZXhpdCgxKQppZiByZWFkZXIuTmFtZSgpICE9ICIjdGV4dCIgb3IgcmVhZGVyLklzRW1wdHlFbGVtZW50KCkgIT0gMCBvciBcCiAgIHJlYWRlci5Ob2RlVHlwZSgpICE9IDMgb3IgcmVhZGVyLkhhc0F0dHJpYnV0ZXMoKSAhPSAwIG9yIFwKICAgcmVhZGVyLlZhbHVlKCkgIT0gImNvbnRlbnQgb2YgYyI6CiAgICBwcmludCgidGVzdDE6IEVycm9yIHJlYWRpbmcgdGhlIHRleHQgbm9kZSIpCiAgICBzeXMuZXhpdCgxKQpyZXQgPSByZWFkZXIuUmVhZCgpCmlmIHJldCAhPSAxOgogICAgcHJpbnQoInRlc3QxOiBFcnJvciByZWFkaW5nIHRvIGVuZCBvZiB0aGlyZCBlbGVtZW50IikKICAgIHN5cy5leGl0KDEpCmlmIHJlYWRlci5OYW1lKCkgIT0gImMiIG9yIHJlYWRlci5Jc0VtcHR5RWxlbWVudCgpICE9IDAgb3IgXAogICByZWFkZXIuTm9kZVR5cGUoKSAhPSAxNSBvciByZWFkZXIuSGFzQXR0cmlidXRlcygpICE9IDA6CiAgICBwcmludCgidGVzdDE6IEVycm9yIHJlYWRpbmcgdGhlIGVuZCBvZiB0aGlyZCBlbGVtZW50IikKICAgIHN5cy5leGl0KDEpCnJldCA9IHJlYWRlci5SZWFkKCkKaWYgcmV0ICE9IDE6CiAgICBwcmludCgidGVzdDE6IEVycm9yIHJlYWRpbmcgdG8gZW5kIG9mIGZpcnN0IGVsZW1lbnQiKQogICAgc3lzLmV4aXQoMSkKaWYgcmVhZGVyLk5hbWUoKSAhPSAiYSIgb3IgcmVhZGVyLklzRW1wdHlFbGVtZW50KCkgIT0gMCBvciBcCiAgIHJlYWRlci5Ob2RlVHlwZSgpICE9IDE1IG9yIHJlYWRlci5IYXNBdHRyaWJ1dGVzKCkgIT0gMDoKICAgIHByaW50KCJ0ZXN0MTogRXJyb3IgcmVhZGluZyB0aGUgZW5kIG9mIGZpcnN0IGVsZW1lbnQiKQogICAgc3lzLmV4aXQoMSkKcmV0ID0gcmVhZGVyLlJlYWQoKQppZiByZXQgIT0gMDoKICAgIHByaW50KCJ0ZXN0MTogRXJyb3IgcmVhZGluZyB0byBlbmQgb2YgZG9jdW1lbnQiKQogICAgc3lzLmV4aXQoMSkKCiMKIyBleGFtcGxlIGZyb20gdGhlIFhtbFRleHRSZWFkZXIgZG9jcwojCmYgPSBzdHJfaW8oIiIiPHRlc3QgeG1sbnM6ZHQ9InVybjpkYXRhdHlwZXMiIGR0OnR5cGU9ImludCIvPiIiIikKaW5wdXQgPSBsaWJ4bWwyLmlucHV0QnVmZmVyKGYpCnJlYWRlciA9IGlucHV0Lm5ld1RleHRSZWFkZXIoInRlc3QyIikKCnJldCA9IHJlYWRlci5SZWFkKCkKaWYgcmV0ICE9IDE6CiAgICBwcmludCgiRXJyb3IgcmVhZGluZyB0ZXN0IGVsZW1lbnQiKQogICAgc3lzLmV4aXQoMSkKaWYgcmVhZGVyLkdldEF0dHJpYnV0ZU5vKDApICE9ICJ1cm46ZGF0YXR5cGVzIiBvciBcCiAgIHJlYWRlci5HZXRBdHRyaWJ1dGVObygxKSAhPSAiaW50IiBvciBcCiAgIHJlYWRlci5HZXRBdHRyaWJ1dGVOcygidHlwZSIsICJ1cm46ZGF0YXR5cGVzIikgIT0gImludCIgb3IgXAogICByZWFkZXIuR2V0QXR0cmlidXRlKCJkdDp0eXBlIikgIT0gImludCI6CiAgICBwcmludCgiZXJyb3IgcmVhZGluZyB0ZXN0IGF0dHJpYnV0ZXMiKQogICAgc3lzLmV4aXQoMSkKCiMKIyBleGFtcGxlIGZyb20gdGhlIFhtbFRleHRSZWFkZXIgZG9jcwojCmYgPSBzdHJfaW8oIiIiPHJvb3QgeG1sbnM6YT0idXJuOjQ1NiI+CjxpdGVtPgo8cmVmIGhyZWY9ImE6YiIvPgo8L2l0ZW0+Cjwvcm9vdD4iIiIpCmlucHV0ID0gbGlieG1sMi5pbnB1dEJ1ZmZlcihmKQpyZWFkZXIgPSBpbnB1dC5uZXdUZXh0UmVhZGVyKCJ0ZXN0MyIpCgpyZXQgPSByZWFkZXIuUmVhZCgpCndoaWxlIHJldCA9PSAxOgogICAgaWYgcmVhZGVyLk5hbWUoKSA9PSAicmVmIjoKICAgICAgICBpZiByZWFkZXIuTG9va3VwTmFtZXNwYWNlKCJhIikgIT0gInVybjo0NTYiOgogICAgICAgICAgICBwcmludCgiZXJyb3IgcmVzb2x2aW5nIG5hbWVzcGFjZSBwcmVmaXgiKQogICAgICAgICAgICBzeXMuZXhpdCgxKQogICAgICAgIGJyZWFrCiAgICByZXQgPSByZWFkZXIuUmVhZCgpCmlmIHJldCAhPSAxOgogICAgcHJpbnQoIkVycm9yIGZpbmRpbmcgdGhlIHJlZiBlbGVtZW50IikKICAgIHN5cy5leGl0KDEpCgojCiMgSG9tZSBtYWRlIGV4YW1wbGUgZm9yIHRoZSB2YXJpb3VzIGF0dHJpYnV0ZSBhY2Nlc3MgZnVuY3Rpb25zCiMKZiA9IHN0cl9pbygiIiI8dGVzdGF0dHIgeG1sbnM9InVybjoxIiB4bWxuczphPSJ1cm46MiIgYj0iYiIgYTpiPSJhOmIiLz4iIiIpCmlucHV0ID0gbGlieG1sMi5pbnB1dEJ1ZmZlcihmKQpyZWFkZXIgPSBpbnB1dC5uZXdUZXh0UmVhZGVyKCJ0ZXN0NCIpCnJldCA9IHJlYWRlci5SZWFkKCkKaWYgcmV0ICE9IDE6CiAgICBwcmludCgiRXJyb3IgcmVhZGluZyB0aGUgdGVzdGF0dHIgZWxlbWVudCIpCiAgICBzeXMuZXhpdCgxKQojCiMgQXR0cmlidXRlIGV4cGxvcmF0aW9uIGJ5IGluZGV4CiMKaWYgcmVhZGVyLk1vdmVUb0F0dHJpYnV0ZU5vKDApICE9IDE6CiAgICBwcmludCgiRmFpbGVkIG1vdmVUb0F0dHJpYnV0ZSgwKSIpCiAgICBzeXMuZXhpdCgxKQppZiByZWFkZXIuVmFsdWUoKSAhPSAidXJuOjEiOgogICAgcHJpbnQoIkZhaWxlZCB0byByZWFkIGF0dHJpYnV0ZSgwKSIpCiAgICBzeXMuZXhpdCgxKQppZiByZWFkZXIuTmFtZSgpICE9ICJ4bWxucyI6CiAgICBwcmludCgiRmFpbGVkIHRvIHJlYWQgYXR0cmlidXRlKDApIG5hbWUiKQogICAgc3lzLmV4aXQoMSkKaWYgcmVhZGVyLk1vdmVUb0F0dHJpYnV0ZU5vKDEpICE9IDE6CiAgICBwcmludCgiRmFpbGVkIG1vdmVUb0F0dHJpYnV0ZSgxKSIpCiAgICBzeXMuZXhpdCgxKQppZiByZWFkZXIuVmFsdWUoKSAhPSAidXJuOjIiOgogICAgcHJpbnQoIkZhaWxlZCB0byByZWFkIGF0dHJpYnV0ZSgxKSIpCiAgICBzeXMuZXhpdCgxKQppZiByZWFkZXIuTmFtZSgpICE9ICJ4bWxuczphIjoKICAgIHByaW50KCJGYWlsZWQgdG8gcmVhZCBhdHRyaWJ1dGUoMSkgbmFtZSIpCiAgICBzeXMuZXhpdCgxKQppZiByZWFkZXIuTW92ZVRvQXR0cmlidXRlTm8oMikgIT0gMToKICAgIHByaW50KCJGYWlsZWQgbW92ZVRvQXR0cmlidXRlKDIpIikKICAgIHN5cy5leGl0KDEpCmlmIHJlYWRlci5WYWx1ZSgpICE9ICJiIjoKICAgIHByaW50KCJGYWlsZWQgdG8gcmVhZCBhdHRyaWJ1dGUoMikiKQogICAgc3lzLmV4aXQoMSkKaWYgcmVhZGVyLk5hbWUoKSAhPSAiYiI6CiAgICBwcmludCgiRmFpbGVkIHRvIHJlYWQgYXR0cmlidXRlKDIpIG5hbWUiKQogICAgc3lzLmV4aXQoMSkKaWYgcmVhZGVyLk1vdmVUb0F0dHJpYnV0ZU5vKDMpICE9IDE6CiAgICBwcmludCgiRmFpbGVkIG1vdmVUb0F0dHJpYnV0ZSgzKSIpCiAgICBzeXMuZXhpdCgxKQppZiByZWFkZXIuVmFsdWUoKSAhPSAiYTpiIjoKICAgIHByaW50KCJGYWlsZWQgdG8gcmVhZCBhdHRyaWJ1dGUoMykiKQogICAgc3lzLmV4aXQoMSkKaWYgcmVhZGVyLk5hbWUoKSAhPSAiYTpiIjoKICAgIHByaW50KCJGYWlsZWQgdG8gcmVhZCBhdHRyaWJ1dGUoMykgbmFtZSIpCiAgICBzeXMuZXhpdCgxKQojCiMgQXR0cmlidXRlIGV4cGxvcmF0aW9uIGJ5IG5hbWUKIwppZiByZWFkZXIuTW92ZVRvQXR0cmlidXRlKCJ4bWxucyIpICE9IDE6CiAgICBwcmludCgiRmFpbGVkIG1vdmVUb0F0dHJpYnV0ZSgneG1sbnMnKSIpCiAgICBzeXMuZXhpdCgxKQppZiByZWFkZXIuVmFsdWUoKSAhPSAidXJuOjEiOgogICAgcHJpbnQoIkZhaWxlZCB0byByZWFkIGF0dHJpYnV0ZSgneG1sbnMnKSIpCiAgICBzeXMuZXhpdCgxKQppZiByZWFkZXIuTW92ZVRvQXR0cmlidXRlKCJ4bWxuczphIikgIT0gMToKICAgIHByaW50KCJGYWlsZWQgbW92ZVRvQXR0cmlidXRlKCd4bWxucycpIikKICAgIHN5cy5leGl0KDEpCmlmIHJlYWRlci5WYWx1ZSgpICE9ICJ1cm46MiI6CiAgICBwcmludCgiRmFpbGVkIHRvIHJlYWQgYXR0cmlidXRlKCd4bWxuczphJykiKQogICAgc3lzLmV4aXQoMSkKaWYgcmVhZGVyLk1vdmVUb0F0dHJpYnV0ZSgiYiIpICE9IDE6CiAgICBwcmludCgiRmFpbGVkIG1vdmVUb0F0dHJpYnV0ZSgnYicpIikKICAgIHN5cy5leGl0KDEpCmlmIHJlYWRlci5WYWx1ZSgpICE9ICJiIjoKICAgIHByaW50KCJGYWlsZWQgdG8gcmVhZCBhdHRyaWJ1dGUoJ2InKSIpCiAgICBzeXMuZXhpdCgxKQppZiByZWFkZXIuTW92ZVRvQXR0cmlidXRlKCJhOmIiKSAhPSAxOgogICAgcHJpbnQoIkZhaWxlZCBtb3ZlVG9BdHRyaWJ1dGUoJ2E6YicpIikKICAgIHN5cy5leGl0KDEpCmlmIHJlYWRlci5WYWx1ZSgpICE9ICJhOmIiOgogICAgcHJpbnQoIkZhaWxlZCB0byByZWFkIGF0dHJpYnV0ZSgnYTpiJykiKQogICAgc3lzLmV4aXQoMSkKaWYgcmVhZGVyLk1vdmVUb0F0dHJpYnV0ZU5zKCJiIiwgInVybjoyIikgIT0gMToKICAgIHByaW50KCJGYWlsZWQgbW92ZVRvQXR0cmlidXRlKCdiJywgJ3VybjoyJykiKQogICAgc3lzLmV4aXQoMSkKaWYgcmVhZGVyLlZhbHVlKCkgIT0gImE6YiI6CiAgICBwcmludCgiRmFpbGVkIHRvIHJlYWQgYXR0cmlidXRlKCdiJywgJ3VybjoyJykiKQogICAgc3lzLmV4aXQoMSkKIwojIEdvIGJhY2sgYW5kIHJlYWQgaW4gc2VxdWVuY2UKIwppZiByZWFkZXIuTW92ZVRvRWxlbWVudCgpICE9IDE6CiAgICBwcmludCgiRmFpbGVkIHRvIG1vdmUgYmFjayB0byBlbGVtZW50IikKICAgIHN5cy5leGl0KDEpCmlmIHJlYWRlci5Nb3ZlVG9GaXJzdEF0dHJpYnV0ZSgpICE9IDE6CiAgICBwcmludCgiRmFpbGVkIHRvIG1vdmUgdG8gZmlyc3QgYXR0cmlidXRlIikKICAgIHN5cy5leGl0KDEpCmlmIHJlYWRlci5WYWx1ZSgpICE9ICJ1cm46MSI6CiAgICBwcmludCgiRmFpbGVkIHRvIHJlYWQgYXR0cmlidXRlKDApIikKICAgIHN5cy5leGl0KDEpCmlmIHJlYWRlci5OYW1lKCkgIT0gInhtbG5zIjoKICAgIHByaW50KCJGYWlsZWQgdG8gcmVhZCBhdHRyaWJ1dGUoMCkgbmFtZSIpCiAgICBzeXMuZXhpdCgxKQppZiByZWFkZXIuTW92ZVRvTmV4dEF0dHJpYnV0ZSgpICE9IDE6CiAgICBwcmludCgiRmFpbGVkIHRvIG1vdmUgdG8gbmV4dCBhdHRyaWJ1dGUiKQogICAgc3lzLmV4aXQoMSkKaWYgcmVhZGVyLlZhbHVlKCkgIT0gInVybjoyIjoKICAgIHByaW50KCJGYWlsZWQgdG8gcmVhZCBhdHRyaWJ1dGUoMSkiKQogICAgc3lzLmV4aXQoMSkKaWYgcmVhZGVyLk5hbWUoKSAhPSAieG1sbnM6YSI6CiAgICBwcmludCgiRmFpbGVkIHRvIHJlYWQgYXR0cmlidXRlKDEpIG5hbWUiKQogICAgc3lzLmV4aXQoMSkKaWYgcmVhZGVyLk1vdmVUb05leHRBdHRyaWJ1dGUoKSAhPSAxOgogICAgcHJpbnQoIkZhaWxlZCB0byBtb3ZlIHRvIG5leHQgYXR0cmlidXRlIikKICAgIHN5cy5leGl0KDEpCmlmIHJlYWRlci5WYWx1ZSgpICE9ICJiIjoKICAgIHByaW50KCJGYWlsZWQgdG8gcmVhZCBhdHRyaWJ1dGUoMikiKQogICAgc3lzLmV4aXQoMSkKaWYgcmVhZGVyLk5hbWUoKSAhPSAiYiI6CiAgICBwcmludCgiRmFpbGVkIHRvIHJlYWQgYXR0cmlidXRlKDIpIG5hbWUiKQogICAgc3lzLmV4aXQoMSkKaWYgcmVhZGVyLk1vdmVUb05leHRBdHRyaWJ1dGUoKSAhPSAxOgogICAgcHJpbnQoIkZhaWxlZCB0byBtb3ZlIHRvIG5leHQgYXR0cmlidXRlIikKICAgIHN5cy5leGl0KDEpCmlmIHJlYWRlci5WYWx1ZSgpICE9ICJhOmIiOgogICAgcHJpbnQoIkZhaWxlZCB0byByZWFkIGF0dHJpYnV0ZSgzKSIpCiAgICBzeXMuZXhpdCgxKQppZiByZWFkZXIuTmFtZSgpICE9ICJhOmIiOgogICAgcHJpbnQoIkZhaWxlZCB0byByZWFkIGF0dHJpYnV0ZSgzKSBuYW1lIikKICAgIHN5cy5leGl0KDEpCmlmIHJlYWRlci5Nb3ZlVG9OZXh0QXR0cmlidXRlKCkgIT0gMDoKICAgIHByaW50KCJGYWlsZWQgdG8gZGV0ZWN0IGxhc3QgYXR0cmlidXRlIikKICAgIHN5cy5leGl0KDEpCgogICAgCiMKIyBhIGNvdXBsZSBvZiB0ZXN0cyBmb3IgbmFtZXNwYWNlIG5vZGVzCiMKZiA9IHN0cl9pbygiIiI8YSB4bWxucz0iaHR0cDovL2V4YW1wbGUuY29tL2ZvbyIvPiIiIikKaW5wdXQgPSBsaWJ4bWwyLmlucHV0QnVmZmVyKGYpCnJlYWRlciA9IGlucHV0Lm5ld1RleHRSZWFkZXIoInRlc3Q2IikKcmV0ID0gcmVhZGVyLlJlYWQoKQppZiByZXQgIT0gMToKICAgIHByaW50KCJ0ZXN0NjogZmFpbGVkIHRvIFJlYWQoKSIpCiAgICBzeXMuZXhpdCgxKQpyZXQgPSByZWFkZXIuTW92ZVRvRmlyc3RBdHRyaWJ1dGUoKQppZiByZXQgIT0gMToKICAgIHByaW50KCJ0ZXN0NjogZmFpbGVkIHRvIE1vdmVUb0ZpcnN0QXR0cmlidXRlKCkiKQogICAgc3lzLmV4aXQoMSkKaWYgcmVhZGVyLk5hbWVzcGFjZVVyaSgpICE9ICJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3htbG5zLyIgb3IgXAogICByZWFkZXIuTG9jYWxOYW1lKCkgIT0gInhtbG5zIiBvciByZWFkZXIuTmFtZSgpICE9ICJ4bWxucyIgb3IgXAogICByZWFkZXIuVmFsdWUoKSAhPSAiaHR0cDovL2V4YW1wbGUuY29tL2ZvbyIgb3IgcmVhZGVyLk5vZGVUeXBlKCkgIT0gMjoKICAgIHByaW50KCJ0ZXN0NjogZmFpbGVkIHRvIHJlYWQgdGhlIG5hbWVzcGFjZSBub2RlIikKICAgIHN5cy5leGl0KDEpCgpmID0gc3RyX2lvKCIiIjxhIHhtbG5zOnByZWZpeD0iaHR0cDovL2V4YW1wbGUuY29tL2ZvbyIvPiIiIikKaW5wdXQgPSBsaWJ4bWwyLmlucHV0QnVmZmVyKGYpCnJlYWRlciA9IGlucHV0Lm5ld1RleHRSZWFkZXIoInRlc3Q3IikKcmV0ID0gcmVhZGVyLlJlYWQoKQppZiByZXQgIT0gMToKICAgIHByaW50KCJ0ZXN0NzogZmFpbGVkIHRvIFJlYWQoKSIpCiAgICBzeXMuZXhpdCgxKQpyZXQgPSByZWFkZXIuTW92ZVRvRmlyc3RBdHRyaWJ1dGUoKQppZiByZXQgIT0gMToKICAgIHByaW50KCJ0ZXN0NzogZmFpbGVkIHRvIE1vdmVUb0ZpcnN0QXR0cmlidXRlKCkiKQogICAgc3lzLmV4aXQoMSkKaWYgcmVhZGVyLk5hbWVzcGFjZVVyaSgpICE9ICJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3htbG5zLyIgb3IgXAogICByZWFkZXIuTG9jYWxOYW1lKCkgIT0gInByZWZpeCIgb3IgcmVhZGVyLk5hbWUoKSAhPSAieG1sbnM6cHJlZml4IiBvciBcCiAgIHJlYWRlci5WYWx1ZSgpICE9ICJodHRwOi8vZXhhbXBsZS5jb20vZm9vIiBvciByZWFkZXIuTm9kZVR5cGUoKSAhPSAyOgogICAgcHJpbnQoInRlc3Q3OiBmYWlsZWQgdG8gcmVhZCB0aGUgbmFtZXNwYWNlIG5vZGUiKQogICAgc3lzLmV4aXQoMSkKCiMKIyBUZXN0IGZvciBhIGxpbWl0IGNhc2U6CiMKZiA9IHN0cl9pbygiIiI8YS8+IiIiKQppbnB1dCA9IGxpYnhtbDIuaW5wdXRCdWZmZXIoZikKcmVhZGVyID0gaW5wdXQubmV3VGV4dFJlYWRlcigidGVzdDgiKQpyZXQgPSByZWFkZXIuUmVhZCgpCmlmIHJldCAhPSAxOgogICAgcHJpbnQoInRlc3Q4OiBmYWlsZWQgdG8gcmVhZCB0aGUgbm9kZSIpCiAgICBzeXMuZXhpdCgxKQppZiByZWFkZXIuTmFtZSgpICE9ICJhIiBvciByZWFkZXIuSXNFbXB0eUVsZW1lbnQoKSAhPSAxOgogICAgcHJpbnQoInRlc3Q4OiBmYWlsZWQgdG8gYW5hbHl6ZSB0aGUgbm9kZSIpCiAgICBzeXMuZXhpdCgxKQpyZXQgPSByZWFkZXIuUmVhZCgpCmlmIHJldCAhPSAwOgogICAgcHJpbnQoInRlc3Q4OiBmYWlsZWQgdG8gZGV0ZWN0IHRoZSBFT0YiKQogICAgc3lzLmV4aXQoMSkKCiMKIyBBbm90aGVyIHRlc3QgcHJvdmlkZWQgYnkgU3TpcGhhbmUgQmlkb3VsIGFuZCBjaGVja2VkIHdpdGggQyMKIwpkZWYgdHN0X3JlYWRlcihzKToKICAgIGYgPSBzdHJfaW8ocykKICAgIGlucHV0ID0gbGlieG1sMi5pbnB1dEJ1ZmZlcihmKQogICAgcmVhZGVyID0gaW5wdXQubmV3VGV4dFJlYWRlcigidHN0IikKICAgIHJlcyA9ICIiCiAgICB3aGlsZSByZWFkZXIuUmVhZCgpOgogICAgICAgIHJlcz1yZXMgKyAiJXMgKCVzKSBbJXNdICVkICVkXG4iICUgKHJlYWRlci5Ob2RlVHlwZSgpLHJlYWRlci5OYW1lKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZGVyLlZhbHVlKCksIHJlYWRlci5Jc0VtcHR5RWxlbWVudCgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRlci5EZXB0aCgpKQogICAgICAgIGlmIHJlYWRlci5Ob2RlVHlwZSgpID09IDE6ICMgRWxlbWVudAogICAgICAgICAgICB3aGlsZSByZWFkZXIuTW92ZVRvTmV4dEF0dHJpYnV0ZSgpOgogICAgICAgICAgICAgICAgcmVzID0gcmVzICsgIi0tICVzICglcykgWyVzXSAlZCAlZFxuIiAlIChyZWFkZXIuTm9kZVR5cGUoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZGVyLk5hbWUoKSxyZWFkZXIuVmFsdWUoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZGVyLklzRW1wdHlFbGVtZW50KCksIHJlYWRlci5EZXB0aCgpKQogICAgcmV0dXJuIHJlcwogICAgCmRvYz0iIiI8YT48YiBiMT0iYjEiLz48Yz5jb250ZW50IG9mIGM8L2M+PC9hPiIiIgpleHBlY3Q9IiIiMSAoYSkgW05vbmVdIDAgMAoxIChiKSBbTm9uZV0gMSAxCi0tIDIgKGIxKSBbYjFdIDAgMgoxIChjKSBbTm9uZV0gMCAxCjMgKCN0ZXh0KSBbY29udGVudCBvZiBjXSAwIDIKMTUgKGMpIFtOb25lXSAwIDEKMTUgKGEpIFtOb25lXSAwIDAKIiIiCnJlcyA9IHRzdF9yZWFkZXIoZG9jKQppZiByZXMgIT0gZXhwZWN0OgogICAgcHJpbnQoInRlc3Q1IGZhaWxlZCIpCiAgICBwcmludChyZXMpCiAgICBzeXMuZXhpdCgxKQoKZG9jPSIiIjx0ZXN0PjxiLz48Yy8+PC90ZXN0PiIiIgpleHBlY3Q9IiIiMSAodGVzdCkgW05vbmVdIDAgMAoxIChiKSBbTm9uZV0gMSAxCjEgKGMpIFtOb25lXSAxIDEKMTUgKHRlc3QpIFtOb25lXSAwIDAKIiIiCnJlcyA9IHRzdF9yZWFkZXIoZG9jKQppZiByZXMgIT0gZXhwZWN0OgogICAgcHJpbnQoInRlc3Q5IGZhaWxlZCIpCiAgICBwcmludChyZXMpCiAgICBzeXMuZXhpdCgxKQoKZG9jPSIiIjxhPjxiPmJiYjwvYj48Yz5jY2M8L2M+PC9hPiIiIgpleHBlY3Q9IiIiMSAoYSkgW05vbmVdIDAgMAoxIChiKSBbTm9uZV0gMCAxCjMgKCN0ZXh0KSBbYmJiXSAwIDIKMTUgKGIpIFtOb25lXSAwIDEKMSAoYykgW05vbmVdIDAgMQozICgjdGV4dCkgW2NjY10gMCAyCjE1IChjKSBbTm9uZV0gMCAxCjE1IChhKSBbTm9uZV0gMCAwCiIiIgpyZXMgPSB0c3RfcmVhZGVyKGRvYykKaWYgcmVzICE9IGV4cGVjdDoKICAgIHByaW50KCJ0ZXN0MTAgZmFpbGVkIikKICAgIHByaW50KHJlcykKICAgIHN5cy5leGl0KDEpCgpkb2M9IiIiPHRlc3QgYT0iYSIvPiIiIgpleHBlY3Q9IiIiMSAodGVzdCkgW05vbmVdIDEgMAotLSAyIChhKSBbYV0gMCAxCiIiIgpyZXMgPSB0c3RfcmVhZGVyKGRvYykKaWYgcmVzICE9IGV4cGVjdDoKICAgIHByaW50KCJ0ZXN0MTEgZmFpbGVkIikKICAgIHByaW50KHJlcykKICAgIHN5cy5leGl0KDEpCgpkb2M9IiIiPHRlc3Q+PGE+YWFhPC9hPjxiLz48L3Rlc3Q+IiIiCmV4cGVjdD0iIiIxICh0ZXN0KSBbTm9uZV0gMCAwCjEgKGEpIFtOb25lXSAwIDEKMyAoI3RleHQpIFthYWFdIDAgMgoxNSAoYSkgW05vbmVdIDAgMQoxIChiKSBbTm9uZV0gMSAxCjE1ICh0ZXN0KSBbTm9uZV0gMCAwCiIiIgpyZXMgPSB0c3RfcmVhZGVyKGRvYykKaWYgcmVzICE9IGV4cGVjdDoKICAgIHByaW50KCJ0ZXN0MTIgZmFpbGVkIikKICAgIHByaW50KHJlcykKICAgIHN5cy5leGl0KDEpCgpkb2M9IiIiPHRlc3Q+PHA+PC9wPjwvdGVzdD4iIiIKZXhwZWN0PSIiIjEgKHRlc3QpIFtOb25lXSAwIDAKMSAocCkgW05vbmVdIDAgMQoxNSAocCkgW05vbmVdIDAgMQoxNSAodGVzdCkgW05vbmVdIDAgMAoiIiIKcmVzID0gdHN0X3JlYWRlcihkb2MpCmlmIHJlcyAhPSBleHBlY3Q6CiAgICBwcmludCgidGVzdDEzIGZhaWxlZCIpCiAgICBwcmludChyZXMpCiAgICBzeXMuZXhpdCgxKQoKZG9jPSIiIjxwPjwvcD4iIiIKZXhwZWN0PSIiIjEgKHApIFtOb25lXSAwIDAKMTUgKHApIFtOb25lXSAwIDAKIiIiCnJlcyA9IHRzdF9yZWFkZXIoZG9jKQppZiByZXMgIT0gZXhwZWN0OgogICAgcHJpbnQoInRlc3QxNCBmYWlsZWQiKQogICAgcHJpbnQocmVzKQogICAgc3lzLmV4aXQoMSkKCiMKIyB0ZXN0IGZyb20gYnVnICMxMDg4MDEgCiMKZG9jPSIiIjw/eG1sIHZlcnNpb249IjEuMCIgc3RhbmRhbG9uZT0ibm8iPz4KPCFET0NUWVBFIGFydGljbGUgUFVCTElDICItLy9PQVNJUy8vRFREIERvY0Jvb2sgWE1MIFY0LjEuMi8vRU4iCiAgICAgICAgICAgICAgICAgICJodHRwOi8vd3d3Lm9hc2lzLW9wZW4ub3JnL2RvY2Jvb2sveG1sLzQuMS4yL2RvY2Jvb2t4LmR0ZCIgWwpdPgoKPGFydGljbGU+Cnh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4CjwvYXJ0aWNsZT4KIiIiCmV4cGVjdD0iIiIxMCAoYXJ0aWNsZSkgW05vbmVdIDAgMAoxIChhcnRpY2xlKSBbTm9uZV0gMCAwCjMgKCN0ZXh0KSBbCnh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4Cl0gMCAxCjE1IChhcnRpY2xlKSBbTm9uZV0gMCAwCiIiIgpyZXMgPSB0c3RfcmVhZGVyKGRvYykKaWYgcmVzICE9IGV4cGVjdDoKICAgIHByaW50KCJ0ZXN0MTUgZmFpbGVkIikKICAgIHByaW50KHJlcykKICAgIHN5cy5leGl0KDEpCgojCiMgY2xlYW51cCBmb3IgbWVtb3J5IGFsbG9jYXRpb24gY291bnRpbmcKIwpkZWwgZgpkZWwgaW5wdXQKZGVsIHJlYWRlcgoKIyBNZW1vcnkgZGVidWcgc3BlY2lmaWMKbGlieG1sMi5jbGVhbnVwUGFyc2VyKCkKaWYgbGlieG1sMi5kZWJ1Z01lbW9yeSgxKSA9PSAwOgogICAgcHJpbnQoIk9LIikKZWxzZToKICAgIHByaW50KCJNZW1vcnkgbGVhayAlZCBieXRlcyIgJSAobGlieG1sMi5kZWJ1Z01lbW9yeSgxKSkpCiAgICBsaWJ4bWwyLmR1bXBNZW1vcnkoKQo=