cGFja2FnZSB0ZXN0LmVuY29kaW5nOwoKaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKaW1wb3J0IG9yZy5hcGFjaGUuYXhpcy5NZXNzYWdlQ29udGV4dDsKaW1wb3J0IG9yZy5hcGFjaGUuYXhpcy5lbmNvZGluZy5EZXNlcmlhbGl6YXRpb25Db250ZXh0OwppbXBvcnQgb3JnLmFwYWNoZS5heGlzLm1lc3NhZ2UuUlBDRWxlbWVudDsKaW1wb3J0IG9yZy5hcGFjaGUuYXhpcy5tZXNzYWdlLlJQQ1BhcmFtOwppbXBvcnQgb3JnLmFwYWNoZS5heGlzLnNlcnZlci5BeGlzU2VydmVyOwppbXBvcnQgb3JnLnhtbC5zYXguSW5wdXRTb3VyY2U7CgppbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUE1lc3NhZ2U7CmltcG9ydCBqYXZheC54bWwuc29hcC5NZXNzYWdlRmFjdG9yeTsKaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwppbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKCi8qKiBMaXR0bGUgc2VyaWFsaXphdGlvbiB0ZXN0IHdpdGggYSBzdHJ1Y3QuCiAqLwpwdWJsaWMgY2xhc3MgVGVzdFN0cmluZzIgZXh0ZW5kcyBUZXN0Q2FzZSB7CgogICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgbXlOUyA9ICJ1cm46bXlOUyI7CiAgICAKICAgIHB1YmxpYyBUZXN0U3RyaW5nMihTdHJpbmcgbmFtZSkgewogICAgICAgIHN1cGVyKG5hbWUpOwogICAgfQoKICAgIHByaXZhdGUgdm9pZCBydW50ZXN0KFN0cmluZyB2YWx1ZSwgU3RyaW5nIGV4cGVjdGVkKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICBNZXNzYWdlQ29udGV4dCBtc2dDb250ZXh0ID0gbmV3IE1lc3NhZ2VDb250ZXh0KG5ldyBBeGlzU2VydmVyKCkpOwogICAgICAgIE1lc3NhZ2VGYWN0b3J5IGZhY3RvcnkgPSBNZXNzYWdlRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwogICAgICAgIG9yZy5hcGFjaGUuYXhpcy5NZXNzYWdlIG1lc3NhZ2UgPSAob3JnLmFwYWNoZS5heGlzLk1lc3NhZ2UpIGZhY3RvcnkuY3JlYXRlTWVzc2FnZSgpOwogICAgICAgIG1lc3NhZ2Uuc2V0TWVzc2FnZUNvbnRleHQobXNnQ29udGV4dCk7CiAgICAgICAgU3RyaW5nIHJlcXVlc3RFbmNvZGluZyA9ICJVVEYtMTYiOwogICAgICAgIG1zZ0NvbnRleHQuc2V0UHJvcGVydHkoU09BUE1lc3NhZ2UuQ0hBUkFDVEVSX1NFVF9FTkNPRElORywgcmVxdWVzdEVuY29kaW5nKTsKICAgICAgICBtZXNzYWdlLnNldFByb3BlcnR5KFNPQVBNZXNzYWdlLkNIQVJBQ1RFUl9TRVRfRU5DT0RJTkcsIHJlcXVlc3RFbmNvZGluZyk7CiAgICAgICAgUlBDUGFyYW0gaW5wdXQgPSBuZXcgUlBDUGFyYW0oInVybjpteU5hbWVzcGFjZSIsICJ0ZXN0UGFyYW0iLCB2YWx1ZSk7CiAgICAgICAgCiAgICAgICAgUlBDRWxlbWVudCBib2R5ID0gbmV3IFJQQ0VsZW1lbnQoInVybjpteU5hbWVzcGFjZSIsICJtZXRob2QxIiwgbmV3IE9iamVjdFtdeyBpbnB1dCB9KTsKICAgICAgICBtZXNzYWdlLmdldFNPQVBCb2R5KCkuYWRkQ2hpbGRFbGVtZW50KGJvZHkpOwogICAgICAgIAogICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBiYW9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwogICAgICAgIG1lc3NhZ2Uud3JpdGVUbyhiYW9zKTsKICAgICAgICAKICAgICAgICBCeXRlQXJyYXlJbnB1dFN0cmVhbSBiYWlzID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJhb3MudG9CeXRlQXJyYXkoKSk7CiAgICAgICAgRGVzZXJpYWxpemF0aW9uQ29udGV4dCBkc2VyID0gbmV3IERlc2VyaWFsaXphdGlvbkNvbnRleHQoCiAgICAgICAgICAgIG5ldyBJbnB1dFNvdXJjZShiYWlzKSwgbXNnQ29udGV4dCwgb3JnLmFwYWNoZS5heGlzLk1lc3NhZ2UuUkVRVUVTVCk7CiAgICAgICAgZHNlci5wYXJzZSgpOwogICAgICAgIAogICAgICAgIG9yZy5hcGFjaGUuYXhpcy5tZXNzYWdlLlNPQVBFbnZlbG9wZSBlbnYgPSBkc2VyLmdldEVudmVsb3BlKCk7CiAgICAgICAgUlBDRWxlbWVudCBycGNFbGVtID0gKFJQQ0VsZW1lbnQpZW52LmdldEZpcnN0Qm9keSgpOwogICAgICAgIFJQQ1BhcmFtIG91dHB1dCA9IHJwY0VsZW0uZ2V0UGFyYW0oInRlc3RQYXJhbSIpOwogICAgICAgIGFzc2VydE5vdE51bGwoIk5vIDx0ZXN0UGFyYW0+IHBhcmFtIiwgb3V0cHV0KTsKICAgICAgICAKICAgICAgICBTdHJpbmcgcmVzdWx0ID0gKFN0cmluZylvdXRwdXQuZ2V0T2JqZWN0VmFsdWUoKTsKICAgICAgICBhc3NlcnROb3ROdWxsKCJObyB2YWx1ZSBmb3IgdGVzdFBhcmFtIHBhcmFtIiwgcmVzdWx0KTsKICAgICAgICBhc3NlcnRFcXVhbHMoIkV4cGVjdGVkIHJlc3VsdCBub3QgcmVjZWl2ZWQuIiwgZXhwZWN0ZWQsIHJlc3VsdCk7CgogICAgICAgIFN0cmluZyBub2RlVmFsdWUgPSBvdXRwdXQuZ2V0VmFsdWUoKTsKICAgICAgICBhc3NlcnROb3ROdWxsKCJObyBub2RlIHZhbHVlIGZvciB0ZXN0UGFyYW0gcGFyYW0iLCBub2RlVmFsdWUpOwogICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZCwgbm9kZVZhbHVlKTsKICAgIH0KCiAgICBwcml2YXRlIHZvaWQgcnVudGVzdChTdHJpbmcgdmFsdWUpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgIHJ1bnRlc3QodmFsdWUsIHZhbHVlKTsKICAgIH0KCiAgICBwdWJsaWMgdm9pZCB0ZXN0U2ltcGxlU3RyaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgcnVudGVzdCgiYSBzaW1wbGUgc3RyaW5nIik7CiAgICB9CgogICAgcHVibGljIHZvaWQgdGVzdFN0cmluZ1dpdGhBcG9zdHJvcGhlcygpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgIHJ1bnRlc3QoInRoaXMgaXNuJ3QgYSBzaW1wbGUgc3RyaW5nIik7CiAgICB9CgogICAgcHVibGljIHZvaWQgdGVzdFN0cmluZ1dpdGhFbnRpdGllcygpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgIHJ1bnRlc3QoIiZhbXA7Jmx0OyZndDsmYXBvczsmcXVvdDsiLCAiJmFtcDsmbHQ7Jmd0OyZhcG9zOyZxdW90OyIpOwogICAgfQogICAgCiAgICBwdWJsaWMgdm9pZCB0ZXN0U3RyaW5nV2l0aFJhd0VudGl0aWVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgcnVudGVzdCgiJjw+J1wiIiwgIiY8PidcIiIpOwogICAgfQogICAgCiAgICBwdWJsaWMgdm9pZCB0ZXN0U3RyaW5nV2l0aExlYWRpbmdBbmRUcmFpbGluZ1NwYWNlcygpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgIHJ1bnRlc3QoIiAgICAgICAgICBjZW50ZXJlZCAgICAgICAgICAiKTsKICAgIH0KICAgIAogICAgcHVibGljIHZvaWQgdGVzdFdoaXRlc3BhY2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICBydW50ZXN0KCIgXG4gXHQgIik7IC8vIG5vdGU6IFxyIGZhaWxzCiAgICB9CgogICAgcHVibGljIHZvaWQgdGVzdEZyZW5jaEFjY2VudHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICBydW50ZXN0KCJcdTAwZTBcdTAwZTJcdTAwZTRcdTAwZTdcdTAwZThcdTAwZTlcdTAwZWFcdTAwZWJcdTAwZWVcdTAwZWZcdTAwZjRcdTAwZjZcdTAwZjlcdTAwZmJcdTAwZmMiKTsKICAgIH0KICAgIAogICAgcHVibGljIHZvaWQgdGVzdEZyZW5jaEFjY2VudHMyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgcnVudGVzdCgiVW5lIGNoYe5uZSBhdmVjIGRlcyBjYXJhY3TocmVzIGFjY2VudHXpcyIpOwogICAgfQogICAgCiAgICBwdWJsaWMgdm9pZCB0ZXN0R2VybWFuVW1sYXV0cygpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgIHJ1bnRlc3QoIiBTb21lIHRleHQgXHUwMGRmIHdpdGggXHUwMGZjIHNwZWNpYWwgXHUwMGY2IGNoYXJzIFx1MDBlNC4iKTsKICAgIH0KICAgIAogICAgcHVibGljIHZvaWQgdGVzdFdlbGNvbWVVbmljb2RlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgLy8gd2VsY29tZSBpbiBzZXZlcmFsIGxhbmd1YWdlcwogICAgICAgIHJ1bnRlc3QoCiAgICAgICAgICAiQ2hpbmVzZSAodHJhZC4pIDogXHU2YjYxXHU4ZmNlICAiKTsKICAgIH0KCiAgICBwdWJsaWMgdm9pZCB0ZXN0V2VsY29tZVVuaWNvZGUyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgLy8gd2VsY29tZSBpbiBzZXZlcmFsIGxhbmd1YWdlcwogICAgICAgIHJ1bnRlc3QoCiAgICAgICAgICAiR3JlZWsgOiBcdTAzYmFcdTAzYjFcdTAzYmJcdTAzY2VcdTAzYzIgXHUwM2JmXHUwM2MxXHUwM2FmXHUwM2MzXHUwM2IxXHUwM2M0XHUwM2I1Iik7CiAgICB9CgogICAgcHVibGljIHZvaWQgdGVzdFdlbGNvbWVVbmljb2RlMygpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgIC8vIHdlbGNvbWUgaW4gc2V2ZXJhbCBsYW5ndWFnZXMKICAgICAgICBydW50ZXN0KAogICAgICAgICAgIkphcGFuZXNlIDogXHUzMDg4XHUzMDQ2XHUzMDUzXHUzMDVkIik7CiAgICB9Cn0K