LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBDb3B5cmlnaHQgKEMpIDIwMTctMjAxOCBieSBTYXZvaXItZmFpcmUgTGludXggICAgICAgICAgICAgICAgICAgICAgICAgICAqCiAqIEF1dGhvcjogQWxleGFuZHJlIFZpYXUgPGFsZXhhbmRyZS52aWF1QHNhdm9pcmZhaXJlbGludXguY29tPiAgICAgICAgICAgICoKICogQXV0aG9yOiBT6WJhc3RpZW4gQmxpbiA8c2ViYXN0aWVuLmJsaW5Ac2F2b2lyZmFpcmVsaW51eC5jb20+ICAgICAgICAgICAgKgogKiBBdXRob3I6IEh1Z28gTGVmZXV2cmUgPGh1Z28ubGVmZXV2cmVAc2F2b2lyZmFpcmVsaW51eC5jb20+ICAgICAgICAgICAgICAqCiAqIEF1dGhvcjogQW5kcmVhcyBUcmFjenlrIDxhbmRyZWFzLnRyYWN6eWtAc2F2b2lyZmFpcmVsaW51eC5jb20+ICAgICAgICAgICoKCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICAgKgogKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgICAqCiAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAgICoKICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAgICoKICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICAgKgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgICAqCiAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgICAqCiAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKI2luY2x1ZGUgIndlYmNoYXRoZWxwZXJzLmgiCgpRSnNvbk9iamVjdApidWlsZEludGVyYWN0aW9uSnNvbihscmM6OmFwaTo6Q29udmVyc2F0aW9uTW9kZWwmIGNvbnZlcnNhdGlvbk1vZGVsLAogICAgY29uc3QgdWludDY0X3QgbXNnSWQsCiAgICBjb25zdCBscmM6OmFwaTo6aW50ZXJhY3Rpb246OkluZm8mIGludGVyYWN0aW9uKQp7CiAgICBhdXRvIHNlbmRlciA9IFFTdHJpbmcoaW50ZXJhY3Rpb24uYXV0aG9yVXJpLmNfc3RyKCkpOwogICAgYXV0byB0aW1lc3RhbXAgPSBRU3RyaW5nOjpudW1iZXIoaW50ZXJhY3Rpb24udGltZXN0YW1wKTsKICAgIGF1dG8gZGlyZWN0aW9uID0gbHJjOjphcGk6OmludGVyYWN0aW9uOjppc091dGdvaW5nKGludGVyYWN0aW9uKSA/IFFTdHJpbmcoIm91dCIpIDogUVN0cmluZygiaW4iKTsKCiAgICBRSnNvbk9iamVjdCBpbnRlcmFjdGlvbk9iamVjdCA9IFFKc29uT2JqZWN0KCk7CiAgICBpbnRlcmFjdGlvbk9iamVjdC5pbnNlcnQoInRleHQiLCBRSnNvblZhbHVlKFFTdHJpbmcoaW50ZXJhY3Rpb24uYm9keS5jX3N0cigpKSkpOwogICAgaW50ZXJhY3Rpb25PYmplY3QuaW5zZXJ0KCJpZCIsIFFKc29uVmFsdWUoUVN0cmluZzo6bnVtYmVyKG1zZ0lkKSkpOwogICAgaW50ZXJhY3Rpb25PYmplY3QuaW5zZXJ0KCJzZW5kZXIiLCBRSnNvblZhbHVlKHNlbmRlcikpOwogICAgaW50ZXJhY3Rpb25PYmplY3QuaW5zZXJ0KCJzZW5kZXJfY29udGFjdF9tZXRob2QiLCBRSnNvblZhbHVlKHNlbmRlcikpOwogICAgaW50ZXJhY3Rpb25PYmplY3QuaW5zZXJ0KCJ0aW1lc3RhbXAiLCBRSnNvblZhbHVlKHRpbWVzdGFtcCkpOwogICAgaW50ZXJhY3Rpb25PYmplY3QuaW5zZXJ0KCJkaXJlY3Rpb24iLCBRSnNvblZhbHVlKGRpcmVjdGlvbikpOwoKICAgIHN3aXRjaCAoaW50ZXJhY3Rpb24udHlwZSkKICAgIHsKICAgIGNhc2UgbHJjOjphcGk6OmludGVyYWN0aW9uOjpUeXBlOjpURVhUOgogICAgICAgIGludGVyYWN0aW9uT2JqZWN0Lmluc2VydCgidHlwZSIsIFFKc29uVmFsdWUoInRleHQiKSk7CiAgICAgICAgYnJlYWs7CiAgICBjYXNlIGxyYzo6YXBpOjppbnRlcmFjdGlvbjo6VHlwZTo6Q0FMTDoKICAgICAgICBpbnRlcmFjdGlvbk9iamVjdC5pbnNlcnQoInR5cGUiLCBRSnNvblZhbHVlKCJjYWxsIikpOwogICAgICAgIGJyZWFrOwogICAgY2FzZSBscmM6OmFwaTo6aW50ZXJhY3Rpb246OlR5cGU6OkNPTlRBQ1Q6CiAgICAgICAgaW50ZXJhY3Rpb25PYmplY3QuaW5zZXJ0KCJ0eXBlIiwgUUpzb25WYWx1ZSgiY29udGFjdCIpKTsKICAgICAgICBicmVhazsKICAgIGNhc2UgbHJjOjphcGk6OmludGVyYWN0aW9uOjpUeXBlOjpPVVRHT0lOR19EQVRBX1RSQU5TRkVSOgogICAgY2FzZSBscmM6OmFwaTo6aW50ZXJhY3Rpb246OlR5cGU6OklOQ09NSU5HX0RBVEFfVFJBTlNGRVI6IHsKICAgICAgICBpbnRlcmFjdGlvbk9iamVjdC5pbnNlcnQoInR5cGUiLCBRSnNvblZhbHVlKCJkYXRhX3RyYW5zZmVyIikpOwogICAgICAgIGxyYzo6YXBpOjpkYXRhdHJhbnNmZXI6OkluZm8gaW5mbyA9IHt9OwogICAgICAgIGNvbnZlcnNhdGlvbk1vZGVsLmdldFRyYW5zZmVySW5mbyhtc2dJZCwgaW5mbyk7CiAgICAgICAgaWYgKGluZm8uc3RhdHVzICE9IGxyYzo6YXBpOjpkYXRhdHJhbnNmZXI6OlN0YXR1czo6SU5WQUxJRCkgewogICAgICAgICAgICBpbnRlcmFjdGlvbk9iamVjdC5pbnNlcnQoInRvdGFsU2l6ZSIsIFFKc29uVmFsdWUocWludDY0KGluZm8udG90YWxTaXplKSkpOwogICAgICAgICAgICBpbnRlcmFjdGlvbk9iamVjdC5pbnNlcnQoInByb2dyZXNzIiwgUUpzb25WYWx1ZShxaW50NjQoaW5mby5wcm9ncmVzcykpKTsKICAgICAgICB9CiAgICAgICAgYnJlYWs7CiAgICB9CiAgICBjYXNlIGxyYzo6YXBpOjppbnRlcmFjdGlvbjo6VHlwZTo6SU5WQUxJRDoKICAgIGRlZmF1bHQ6CiAgICAgICAgaW50ZXJhY3Rpb25PYmplY3QuaW5zZXJ0KCJ0eXBlIiwgUUpzb25WYWx1ZSgiIikpOwogICAgICAgIGJyZWFrOwogICAgfQoKICAgIHN3aXRjaCAoaW50ZXJhY3Rpb24uc3RhdHVzKQogICAgewogICAgY2FzZSBscmM6OmFwaTo6aW50ZXJhY3Rpb246OlN0YXR1czo6UkVBRDoKICAgICAgICBpbnRlcmFjdGlvbk9iamVjdC5pbnNlcnQoImRlbGl2ZXJ5X3N0YXR1cyIsIFFKc29uVmFsdWUoInJlYWQiKSk7CiAgICAgICAgYnJlYWs7CiAgICBjYXNlIGxyYzo6YXBpOjppbnRlcmFjdGlvbjo6U3RhdHVzOjpTVUNDRUVEOgogICAgICAgIGludGVyYWN0aW9uT2JqZWN0Lmluc2VydCgiZGVsaXZlcnlfc3RhdHVzIiwgUUpzb25WYWx1ZSgic2VudCIpKTsKICAgICAgICBicmVhazsKICAgIGNhc2UgbHJjOjphcGk6OmludGVyYWN0aW9uOjpTdGF0dXM6OkZBSUxFRDoKICAgIGNhc2UgbHJjOjphcGk6OmludGVyYWN0aW9uOjpTdGF0dXM6OlRSQU5TRkVSX0VSUk9SOgogICAgICAgIGludGVyYWN0aW9uT2JqZWN0Lmluc2VydCgiZGVsaXZlcnlfc3RhdHVzIiwgUUpzb25WYWx1ZSgiZmFpbHVyZSIpKTsKICAgICAgICBicmVhazsKICAgIGNhc2UgbHJjOjphcGk6OmludGVyYWN0aW9uOjpTdGF0dXM6OlRSQU5TRkVSX1VOSk9JTkFCTEVfUEVFUjoKICAgICAgICBpbnRlcmFjdGlvbk9iamVjdC5pbnNlcnQoImRlbGl2ZXJ5X3N0YXR1cyIsIFFKc29uVmFsdWUoInVuam9pbmFibGUgcGVlciIpKTsKICAgICAgICBicmVhazsKICAgIGNhc2UgbHJjOjphcGk6OmludGVyYWN0aW9uOjpTdGF0dXM6OlNFTkRJTkc6CiAgICAgICAgaW50ZXJhY3Rpb25PYmplY3QuaW5zZXJ0KCJkZWxpdmVyeV9zdGF0dXMiLCBRSnNvblZhbHVlKCJzZW5kaW5nIikpOwogICAgICAgIGJyZWFrOwogICAgY2FzZSBscmM6OmFwaTo6aW50ZXJhY3Rpb246OlN0YXR1czo6VFJBTlNGRVJfQ1JFQVRFRDoKICAgICAgICBpbnRlcmFjdGlvbk9iamVjdC5pbnNlcnQoImRlbGl2ZXJ5X3N0YXR1cyIsIFFKc29uVmFsdWUoImNvbm5lY3RpbmciKSk7CiAgICAgICAgYnJlYWs7CiAgICBjYXNlIGxyYzo6YXBpOjppbnRlcmFjdGlvbjo6U3RhdHVzOjpUUkFOU0ZFUl9BQ0NFUFRFRDoKICAgICAgICBpbnRlcmFjdGlvbk9iamVjdC5pbnNlcnQoImRlbGl2ZXJ5X3N0YXR1cyIsIFFKc29uVmFsdWUoImFjY2VwdGVkIikpOwogICAgICAgIGJyZWFrOwogICAgY2FzZSBscmM6OmFwaTo6aW50ZXJhY3Rpb246OlN0YXR1czo6VFJBTlNGRVJfQ0FOQ0VMRUQ6CiAgICAgICAgaW50ZXJhY3Rpb25PYmplY3QuaW5zZXJ0KCJkZWxpdmVyeV9zdGF0dXMiLCBRSnNvblZhbHVlKCJjYW5jZWxlZCIpKTsKICAgICAgICBicmVhazsKICAgIGNhc2UgbHJjOjphcGk6OmludGVyYWN0aW9uOjpTdGF0dXM6OlRSQU5TRkVSX09OR09JTkc6CiAgICAgICAgaW50ZXJhY3Rpb25PYmplY3QuaW5zZXJ0KCJkZWxpdmVyeV9zdGF0dXMiLCBRSnNvblZhbHVlKCJvbmdvaW5nIikpOwogICAgICAgIGJyZWFrOwogICAgY2FzZSBscmM6OmFwaTo6aW50ZXJhY3Rpb246OlN0YXR1czo6VFJBTlNGRVJfQVdBSVRJTkdfUEVFUjoKICAgICAgICBpbnRlcmFjdGlvbk9iamVjdC5pbnNlcnQoImRlbGl2ZXJ5X3N0YXR1cyIsIFFKc29uVmFsdWUoImF3YWl0aW5nIHBlZXIiKSk7CiAgICAgICAgYnJlYWs7CiAgICBjYXNlIGxyYzo6YXBpOjppbnRlcmFjdGlvbjo6U3RhdHVzOjpUUkFOU0ZFUl9BV0FJVElOR19IT1NUOgogICAgICAgIGludGVyYWN0aW9uT2JqZWN0Lmluc2VydCgiZGVsaXZlcnlfc3RhdHVzIiwgUUpzb25WYWx1ZSgiYXdhaXRpbmcgaG9zdCIpKTsKICAgICAgICBicmVhazsKICAgIGNhc2UgbHJjOjphcGk6OmludGVyYWN0aW9uOjpTdGF0dXM6OlRSQU5TRkVSX1RJTUVPVVRfRVhQSVJFRDoKICAgICAgICBpbnRlcmFjdGlvbk9iamVjdC5pbnNlcnQoImRlbGl2ZXJ5X3N0YXR1cyIsIFFKc29uVmFsdWUoImF3YWl0aW5nIHBlZXIgdGltZW91dCIpKTsKICAgICAgICBicmVhazsKICAgIGNhc2UgbHJjOjphcGk6OmludGVyYWN0aW9uOjpTdGF0dXM6OlRSQU5TRkVSX0ZJTklTSEVEOgogICAgICAgIGludGVyYWN0aW9uT2JqZWN0Lmluc2VydCgiZGVsaXZlcnlfc3RhdHVzIiwgUUpzb25WYWx1ZSgiZmluaXNoZWQiKSk7CiAgICAgICAgYnJlYWs7CiAgICBjYXNlIGxyYzo6YXBpOjppbnRlcmFjdGlvbjo6U3RhdHVzOjpJTlZBTElEOgogICAgY2FzZSBscmM6OmFwaTo6aW50ZXJhY3Rpb246OlN0YXR1czo6VU5LTk9XTjoKICAgIGNhc2UgbHJjOjphcGk6OmludGVyYWN0aW9uOjpTdGF0dXM6OlVOUkVBRDoKICAgIGRlZmF1bHQ6CiAgICAgICAgaW50ZXJhY3Rpb25PYmplY3QuaW5zZXJ0KCJkZWxpdmVyeV9zdGF0dXMiLCBRSnNvblZhbHVlKCJ1bmtub3duIikpOwogICAgICAgIGJyZWFrOwogICAgfQogICAgcmV0dXJuIGludGVyYWN0aW9uT2JqZWN0Owp9CgpRU3RyaW5nCmludGVyYWN0aW9uVG9Kc29uSW50ZXJhY3Rpb25PYmplY3QobHJjOjphcGk6OkNvbnZlcnNhdGlvbk1vZGVsJiBjb252ZXJzYXRpb25Nb2RlbCwKICAgIGNvbnN0IHVpbnQ2NF90IG1zZ0lkLAogICAgY29uc3QgbHJjOjphcGk6OmludGVyYWN0aW9uOjpJbmZvJiBpbnRlcmFjdGlvbikKewogICAgYXV0byBpbnRlcmFjdGlvbk9iamVjdCA9IGJ1aWxkSW50ZXJhY3Rpb25Kc29uKGNvbnZlcnNhdGlvbk1vZGVsLCBtc2dJZCwgaW50ZXJhY3Rpb24pOwogICAgcmV0dXJuIFFTdHJpbmcoUUpzb25Eb2N1bWVudChpbnRlcmFjdGlvbk9iamVjdCkudG9Kc29uKFFKc29uRG9jdW1lbnQ6OkNvbXBhY3QpKTsKfQoKUVN0cmluZwppbnRlcmFjdGlvbnNUb0pzb25BcnJheU9iamVjdChscmM6OmFwaTo6Q29udmVyc2F0aW9uTW9kZWwmIGNvbnZlcnNhdGlvbk1vZGVsLAogICAgY29uc3Qgc3RkOjptYXA8dWludDY0X3QsCiAgICBscmM6OmFwaTo6aW50ZXJhY3Rpb246OkluZm8+IGludGVyYWN0aW9ucykKewogICAgUUpzb25BcnJheSBhcnJheTsKICAgIGZvciAoY29uc3QgYXV0byYgaW50ZXJhY3Rpb24gOiBpbnRlcmFjdGlvbnMpIHsKICAgICAgICBhcnJheS5hcHBlbmQoYnVpbGRJbnRlcmFjdGlvbkpzb24oY29udmVyc2F0aW9uTW9kZWwsIGludGVyYWN0aW9uLmZpcnN0LCBpbnRlcmFjdGlvbi5zZWNvbmQpKTsKICAgIH0KICAgIHJldHVybiBRU3RyaW5nKFFKc29uRG9jdW1lbnQoYXJyYXkpLnRvSnNvbihRSnNvbkRvY3VtZW50OjpDb21wYWN0KSk7Cn0=