LyoKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqIENvcHlyaWdodCAoYykgMjAwMi0yMDA0LCBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzCiogQ29ycG9yYXRpb24gYW5kIG90aGVycy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKiBBdXRob3I6IE1hcmsgRGF2aXMKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqLwpwYWNrYWdlIGNvbS5pYm0uaWN1LmRldi50b29sLmNsZHI7CgppbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7CmltcG9ydCBqYXZhLm5pby5jaGFyc2V0LkNoYXJzZXQ7CmltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwppbXBvcnQgamF2YS51dGlsLkJpdFNldDsKaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwppbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CmltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKaW1wb3J0IGphdmEudXRpbC5MaXN0OwppbXBvcnQgamF2YS51dGlsLk1hcDsKaW1wb3J0IGphdmEudXRpbC5TZXQ7CmltcG9ydCBqYXZhLnV0aWwuVHJlZU1hcDsKaW1wb3J0IGphdmEudXRpbC5UcmVlU2V0OwoKaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKCmltcG9ydCBjb20uaWJtLmljdS5kZXYudGVzdC51dGlsLkJhZ0Zvcm1hdHRlcjsKaW1wb3J0IGNvbS5pYm0uaWN1LmltcGwuVXRpbGl0eTsKaW1wb3J0IGNvbS5pYm0uaWN1LmxhbmcuVUNoYXJhY3RlcjsKaW1wb3J0IGNvbS5pYm0uaWN1LnRleHQuQ29sbGF0aW9uRWxlbWVudEl0ZXJhdG9yOwppbXBvcnQgY29tLmlibS5pY3UudGV4dC5Db2xsYXRvcjsKaW1wb3J0IGNvbS5pYm0uaWN1LnRleHQuTm9ybWFsaXplcjsKaW1wb3J0IGNvbS5pYm0uaWN1LnRleHQuUnVsZUJhc2VkQ29sbGF0b3I7CmltcG9ydCBjb20uaWJtLmljdS50ZXh0LlVURjE2OwppbXBvcnQgY29tLmlibS5pY3UudGV4dC5Vbmljb2RlU2V0OwppbXBvcnQgY29tLmlibS5pY3UudGV4dC5Vbmljb2RlU2V0SXRlcmF0b3I7CmltcG9ydCBjb20uaWJtLmljdS51dGlsLlVMb2NhbGU7CgppbXBvcnQgY29tLmlibS5pY3UuZGV2LnRlc3QudXRpbC5SZWxhdGlvbjsKaW1wb3J0IGNvbS5pYm0uaWN1LmRldi50ZXN0LnV0aWwuU29ydGVkQmFnOwppbXBvcnQgY29tLmlibS5pY3UuZGV2LnRvb2wuVU9wdGlvbjsKCi8qKgogKiBDbGFzcyB0byBnZW5lcmF0ZSBQT1NJWCBmb3JtYXQgZnJvbSBDTERSLiBUaGlzIGlzIGp1c3QgYSBwcm90b3R5cGUgdmVyc2lvbiwKICogdGhhdCBpcyBkcml2ZW4gb2ZmIG9mIElDVTRKLiBUaGUgZXZlbnR1YWwgdmVyc2lvbiB3aWxsIHdhbnQgdG8gdGFrZSBDTERSCiAqIGRhdGEgZGlyZWN0bHkgZnJvbSB0aGUgWE1MLgogKiBUT0RPIEdldCB0aGUgZGF0YSBkaXJlY3RseSBmcm9tIHRoZSBDTERSIHRyZWUuCiAqIEBhdXRob3IgbWVkYXZpcwogKi8KcHVibGljIGNsYXNzIEdlbmVyYXRlUE9TSVggewogICAgLy8gaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29ubGluZXB1YnMvMDA5Njk1Mzk5L2Jhc2VkZWZzL3hiZF9jaGFwMDcuaHRtbAogICAgCiAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgCiAgICAgICAgSEVMUDEgPSAwLAogICAgICAgIEhFTFAyID0gMSwKICAgICAgICBTT1VSQ0VESVIgPSAyLAogICAgICAgIERFU1RESVIgPSAzLAogICAgICAgIE1BVENIID0gNCwKICAgICAgICBVTklDT0RFU0VUID0gNSwKICAgICAgICBDSEFSU0VUID0gNjsKCiAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBVT3B0aW9uW10gb3B0aW9ucyA9IHsKICAgICAgICBVT3B0aW9uLkhFTFBfSCgpLAogICAgICAgIFVPcHRpb24uSEVMUF9RVUVTVElPTl9NQVJLKCksCiAgICAgICAgVU9wdGlvbi5TT1VSQ0VESVIoKS5zZXREZWZhdWx0KCJDOlxcSUNVNENcXGxvY2FsZVxcY29tbW9uXFwiKSwKICAgICAgICBVT3B0aW9uLkRFU1RESVIoKS5zZXREZWZhdWx0KCJDOlxcREFUQVxcR0VOXFwiKSwKICAgICAgICBVT3B0aW9uLmNyZWF0ZSgibWF0Y2giLCAnbScsIFVPcHRpb24uUkVRVUlSRVNfQVJHKS5zZXREZWZhdWx0KCJodSIpLAogICAgICAgIFVPcHRpb24uY3JlYXRlKCJ1bmljb2Rlc2V0IiwgJ3UnLCBVT3B0aW9uLlJFUVVJUkVTX0FSRykuc2V0RGVmYXVsdCgiW1xcdTAwMDAtXFxVMDAxMEZGRkZdIiksCiAgICAgICAgVU9wdGlvbi5jcmVhdGUoImNoYXJzZXQiLCAnYycsIFVPcHRpb24uUkVRVUlSRVNfQVJHKS5zZXREZWZhdWx0KCJpc284ODU5LTIiKSwKICAgIH07CgogICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICBVT3B0aW9uLnBhcnNlQXJncyhhcmdzLCBvcHRpb25zKTsKICAgICAgICAvL3Rlc3RTb3J0ZWRCYWcoKTsKICAgICAgICAvLyBUT0RPIGNoYW5nZSB0byB3YWxrIHRocm91Z2ggYXZhaWxhYmxlIGxvY2FsZXMKICAgICAgICBTdHJpbmcgbG9jYWxlID0gb3B0aW9uc1tNQVRDSF0udmFsdWU7CiAgICAJR2VuZXJhdGVQT1NJWCBncCA9IG5ldyBHZW5lcmF0ZVBPU0lYKG5ldyBVTG9jYWxlKGxvY2FsZSksCi8vICAgICAgICAgICAgICAgICAgICBuZXcgVW5pY29kZVNldCgiW1x1MDAwMC1cdTAwRkZdIikKICAgICAgICAgICAgICBuZXcgVW5pY29kZVNldChvcHRpb25zW1VOSUNPREVTRVRdLnZhbHVlKSwKICAgICAgICAgICAgICBDaGFyc2V0LmZvck5hbWUob3B0aW9uc1tDSEFSU0VUXS52YWx1ZSkKICAgICAgICApOwogICAgICAgIFByaW50V3JpdGVyIG91dCA9IEJhZ0Zvcm1hdHRlci5vcGVuVVRGOFdyaXRlcihvcHRpb25zW0RFU1RESVJdLnZhbHVlLGxvY2FsZSArICJfcG9zaXgudHh0Iik7CiAgICAgICAgZ3Aud3JpdGUob3V0KTsKICAgICAgICBvdXQuY2xvc2UoKTsKICAgIH0KICAgIAoKICAgIAogICAgLyoqCgkgKiAKCSAqLwoJcHJpdmF0ZSBzdGF0aWMgdm9pZCB0ZXN0U29ydGVkQmFnKCkgewoJCVNvcnRlZEJhZyBmb28gPSBuZXcgU29ydGVkQmFnKENvbGxhdG9yLmdldEluc3RhbmNlKCkpOwogICAgICAgIGZvby5hZGQoIlx1MDAwMSIpOwogICAgICAgIGZvby5hZGQoIlx1MDAwMiIpOwogICAgICAgIGZvciAoSXRlcmF0b3IgaXQgPSBmb28uaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewogICAgICAgIAlTeXN0ZW0ub3V0LnByaW50bG4oVXRpbGl0eS5oZXgoKChTdHJpbmcpaXQubmV4dCgpKS5jaGFyQXQoMCksNCkpOwogICAgICAgIH0KCX0KCglTb3J0ZWRCYWcgYWxsSXRlbXM7CiAgICBTb3J0ZWRCYWcgY29udHJhY3Rpb25zOwogICAgLy9QcmludFdyaXRlciBvdXQ7CiAgICAvL01hcCBkZWZpbmVkSUQgPSBuZXcgSGFzaE1hcCgpOwogICAgUnVsZUJhc2VkQ29sbGF0b3IgY29sOwogICAgVW5pY29kZVNldCBjaGFyczsKICAgIENoYXJzZXQgY3M7CiAgICAKICAgIHB1YmxpYyBHZW5lcmF0ZVBPU0lYKFVMb2NhbGUgbG9jYWxlLCBVbmljb2RlU2V0IGNoYXJzLCBDaGFyc2V0IGNzKSB7CiAgICAgICAgdGhpcy5jcyA9IGNzOwogICAgICAgIGlmIChjcyAhPSBudWxsKSB7CiAgICAgICAgICAgIFVuaWNvZGVTZXQgY3NzZXQgPSBuZXcgU2ltcGxlQ29udmVydGVyKGNzKS5nZXRDaGFyc2V0KCk7CiAgICAgICAgCWNoYXJzID0gbmV3IFVuaWNvZGVTZXQoY2hhcnMpLnJldGFpbkFsbChjc3NldCk7CiAgICAgICAgfQogICAgICAgIHRoaXMuY2hhcnMgPSBjaGFyczsKICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkdlbmVyYXRpbmc6ICIgKyBsb2NhbGUuZ2V0RGlzcGxheU5hbWUoKSk7CiAgICAgICAgY29sID0gKFJ1bGVCYXNlZENvbGxhdG9yKSBSdWxlQmFzZWRDb2xsYXRvci5nZXRJbnN0YW5jZShsb2NhbGUpOwogICAgICAgIGFsbEl0ZW1zID0gbmV3IFNvcnRlZEJhZyhjb2wpOwogICAgICAgIGNvbnRyYWN0aW9ucyA9IG5ldyBTb3J0ZWRCYWcoY29sKTsKCiAgICAgICAgLy8gYWRkIGFsbCB0aGUgY2hhcnMKICAgICAgICBmb3IgKFVuaWNvZGVTZXRJdGVyYXRvciBpdCA9IG5ldyBVbmljb2RlU2V0SXRlcmF0b3IoY2hhcnMpOyBpdC5uZXh0KCk7KSB7CiAgICAgICAgICAgIGFsbEl0ZW1zLmFkZChpdC5nZXRTdHJpbmcoKSk7CiAgICAgICAgfQogICAgICAgIC8vIGdldCB0aGUgdGFpbG9yZWQgY29udHJhY3Rpb25zCiAgICAgICAgLy8gd2UgbmVlZCB0byBmaWx0ZXIgb25seSB0aGUgb25lcyBpbiBjaGFycwogICAgICAgIFVuaWNvZGVTZXQgdGFpbG9yZWQgPSBjb2wuZ2V0VGFpbG9yZWRTZXQoKTsKICAgICAgICBnZXRGaWx0ZXJlZFNldChjaGFycywgdGFpbG9yZWQpOwogICAgICAgIGdldEZpbHRlcmVkU2V0KHVjYV9jb250cmFjdGlvbnMsIHRhaWxvcmVkKTsKICAgIH0KICAgIAogICAgLyoqCgkgKiBAcGFyYW0gY2hhcnMKCSAqIEBwYXJhbSB0YWlsb3JlZAoJICovCglwcml2YXRlIHZvaWQgZ2V0RmlsdGVyZWRTZXQoVW5pY29kZVNldCBjaGFycywgVW5pY29kZVNldCB0YWlsb3JlZCkgewoJCWZvciAoVW5pY29kZVNldEl0ZXJhdG9yIGl0ID0gbmV3IFVuaWNvZGVTZXRJdGVyYXRvcih0YWlsb3JlZCk7IGl0Lm5leHQoKTspIHsKICAgICAgICAgICAgaWYgKGl0LmNvZGVwb2ludCAhPSBpdC5JU19TVFJJTkcpIGNvbnRpbnVlOwogICAgICAgICAgICBTdHJpbmcgcyA9IGl0LmdldFN0cmluZygpOwogICAgICAgICAgICBzID0gTm9ybWFsaXplci5jb21wb3NlKHMsZmFsc2UpOyAgICAvLyBub3JtYWxpemUgdG8gbWFrZSBzdXJlCiAgICAgICAgICAgIGlmICghVVRGMTYuaGFzTW9yZUNvZGVQb2ludHNUaGFuKHMsIDEpKSBjb250aW51ZTsKICAgICAgICAgICAgaWYgKCFjaGFycy5jb250YWluc0FsbChzKSkgY29udGludWU7CiAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiQ29udHJhY3Rpb25zOiAiICsgaXQuZ2V0U3RyaW5nKCkpOwogICAgICAgICAgICBjb250cmFjdGlvbnMuYWRkKHMpOwogICAgICAgICAgICBhbGxJdGVtcy5hZGQocyk7CiAgICAgICAgfQoJfQoKCXB1YmxpYyB2b2lkIHdyaXRlKFByaW50V3JpdGVyIG91dCkgewogICAgICAgIG91dC5wcmludGxuKCIjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIik7CiAgICAgICAgb3V0LnByaW50bG4oIiMgUE9TSVggbG9jYWxlIik7CiAgICAgICAgb3V0LnByaW50bG4oIiMgR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgZnJvbSB0aGUgVW5pY29kZSBDaGFyYWN0ZXIgRGF0YWJhc2UgYW5kIENvbW1vbiBMb2NhbGUgRGF0YSBSZXBvc2l0b3J5Iik7CiAgICAgICAgb3V0LnByaW50bG4oIiMgc2VlIGh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vbmxpbmVwdWJzLzAwOTY5NTM5OS9iYXNlZGVmcy94YmRfY2hhcDA3Lmh0bWwiKTsKICAgICAgICBvdXQucHJpbnRsbigiIyBjaGFyc2V0Olx0IiArIGNzKTsKICAgICAgICBvdXQucHJpbnRsbigiIyBjaGFyYWN0ZXJzOlx0IiArIGNoYXJzLnRvUGF0dGVybih0cnVlKSk7CiAgICAgICAgb3V0LnByaW50bG4oIiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMiKTsKICAgICAgICBvdXQucHJpbnRsbigpOwogICAgICAgIGRvQ3R5cGUob3V0KTsgICAgICAgCiAgICAgICAgb3V0LnByaW50bG4oIiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMiKTsKICAgICAgICBvdXQucHJpbnRsbigpOwogICAgICAgIGRvQ29sbGF0ZShvdXQpOwogICAgICAgIG91dC5wcmludGxuKCIjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIik7CiAgICB9CiAgICAKICAgIC8qKgoJICogQHBhcmFtIG91dAoJICovCglwcml2YXRlIHZvaWQgZG9Db2xsYXRlKFByaW50V3JpdGVyIG91dCkgewoJCW91dC5wcmludGxuKCJMQ19DT0xMQVRFIik7CiAgICAgICAgb3V0LnByaW50bG4oKTsKICAgICAgICB3cml0ZURlZmluaXRpb25zKG91dCk7CiAgICAgICAgb3V0LnByaW50bG4oKTsKICAgICAgICBvdXQucHJpbnRsbigib3JkZXJfc3RhcnQgZm9yd2FyZDsiICsgCiAgICAgICAgICAgICAgICAoY29sLmlzRnJlbmNoQ29sbGF0aW9uKCkgPyAiYmFja3dhcmQiIDogImZvcndhcmQiKQogICAgICAgICAgICAgICAgKyAiO2ZvcndhcmQiKTsKICAgICAgICBvdXQucHJpbnRsbigpOwogICAgICAgIG91dC5wcmludGxuKCIjIHdlaWdodHMgdXNlZCwgaW4gb3JkZXIiKTsKICAgICAgICBvdXQucHJpbnRsbigpOwogICAgICAgIHdyaXRlTGlzdChvdXQpOwogICAgICAgIG91dC5wcmludGxuKCk7CiAgICAgICAgb3V0LnByaW50bG4oIiMgYXNzaWdubWVudCBvZiBjaGFyYWN0ZXJzIHRvIHdlaWdodHMiKTsKICAgICAgICBvdXQucHJpbnRsbigpOwogICAgICAgIGZvciAoSXRlcmF0b3IgaXQgPSBhbGxJdGVtcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7CiAgICAgICAgICAgIG91dC5wcmludGxuKHNob3dMaW5lKGNvbCwgKFN0cmluZykgaXQubmV4dCgpKSk7CiAgICAgICAgfQogICAgICAgIG91dC5wcmludGxuKCJVTkRFRklORUQgXHQuLi47IiArIGdldElEKCdYJywgNSkgKyAiOyIgKyBnZXRJRCgnWCcsIDUpKTsKICAgICAgICBvdXQucHJpbnRsbigpOwogICAgICAgIG91dC5wcmludGxuKCJvcmRlcl9lbmQiKTsKICAgICAgICBvdXQucHJpbnRsbigiRU5EIExDX0NPTExBVEUiKTsKCX0KCgkvKioKCSAqIEBwYXJhbSBvdXQKCSAqLwoJcHJpdmF0ZSB2b2lkIGRvQ3R5cGUoUHJpbnRXcml0ZXIgb3V0KSB7CgkJb3V0LnByaW50bG4oIkxDX0NUWVBFIik7Ci8vICAgICAgZGlnaXQgICAgICAgIDx6ZXJvPjtcCi8vICAgICAgLi4gICAgICAgICAgIDxlaWdodD47XAovLyAgICAgICAgICAgICAgICAgICA8bmluZT4KICAgICAgICBTdHJpbmdbXVtdIHR5cGVzID0geyB7ICJhbHBoYSIsICJbOkFscGhhYmV0aWM6XSIgfSwKICAgICAgICAgICAgICAgIHsgInVwcGVyIiwgIls6VXBwZXJjYXNlOl0iIH0sCgkJCQl7ICJsb3dlciIsICJbOkxvd2VyY2FzZTpdIiB9LCAKICAgICAgICAgICAgICAgIHsgInNwYWNlIiwgIls6V2hpdGVzcGFjZTpdIiB9LAoJCQkJeyAiY250cmwiLCAiWzpDb250cm9sOl0iIH0sIAogICAgICAgICAgICAgICAgeyAiZ3JhcGgiLCAiW15bOldoaXRlc3BhY2U6XVs6Q29udHJvbDpdWzpGb3JtYXQ6XVs6U3Vycm9nYXRlOl1bOlVuYXNzaWduZWQ6XV0iIH0sCgkJCQl7ICJwcmludCIsICJbWzpXaGl0ZXNwYWNlOl0tW1s6Q29udHJvbDpdWzpGb3JtYXQ6XVs6U3Vycm9nYXRlOl1bOlVuYXNzaWduZWQ6XV1dIiB9LCAKICAgICAgICAgICAgICAgIHsgInB1bmN0IiwgIls6UHVuY3R1YXRpb246XSIgfSwKCQkJCXsgImRpZ2l0IiwgIls6RGVjaW1hbF9OdW1iZXI6XSIgfSwgCiAgICAgICAgICAgICAgICB7ICJ4ZGlnaXQiLCAiW1s6RGVjaW1hbF9OdW1iZXI6XWEtZiwgQS1GLCDvvT8t772GLCDvvKEt77ymXSIgfSwKCQkJCXsgImJsYW5rIiwgIltbOldoaXRlc3BhY2U6XS1bXFx1MDAwQS1cXHUwMDBEIFxcdTAwODUgWzpMaW5lX1NlcGFyYXRvcjpdWzpQYXJhZ3JhcGhfU2VwYXJhdG9yOl1dXSIgfSB9OwogICAgICAgIC8vIHByaW50IGNoYXJhY3RlciB0eXBlcywgcmVzdHJpY3RlZCB0byB0aGUgY2hhcnNldAogICAgICAgIGludCBpdGVtLCBsYXN0OwogICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdHlwZXMubGVuZ3RoOyArK2kpIHsKICAgICAgICAgICAgVW5pY29kZVNldCB1cyA9IG5ldyBVbmljb2RlU2V0KHR5cGVzW2ldWzFdKS5yZXRhaW5BbGwoY2hhcnMpOwogICAgICAgICAgICBpdGVtID0gMDsKICAgICAgICAgICAgbGFzdCA9IHVzLnNpemUoKSAtIDE7CiAgICAgICAgCWZvciAoVW5pY29kZVNldEl0ZXJhdG9yIGl0ID0gbmV3IFVuaWNvZGVTZXRJdGVyYXRvcih1cyk7IGl0Lm5leHQoKTsgKytpdGVtKSB7CiAgICAgICAgICAgICAgICBpZiAoaXRlbSA9PSAwKSBvdXQucHJpbnQodHlwZXNbaV1bMF0pOwogICAgICAgICAgICAgICAgb3V0LnByaW50KCJcdCIgKyBnZXRJRCgnVScsaXQuY29kZXBvaW50KSk7CiAgICAgICAgICAgICAgICBpZiAoaXRlbSAhPSBsYXN0KSBvdXQucHJpbnQoIjtcXCIpOwogICAgICAgICAgICAgICAgb3V0LnByaW50bG4oIiBcdCMgIiArIGdldE5hbWUoaXQuZ2V0U3RyaW5nKCkpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBvdXQucHJpbnRsbigpOwogICAgICAgIH0KLyogICAgICAKdG91cHBlciAoPGE+LDxBPik7KDxiPiw8Qj4pOyg8Yz4sPEM+KTsoPGQ+LDxEPik7KDxlPiw8RT4pO1wKICAgICAgICAoPGY+LDxGPik7KDxnPiw8Rz4pOyg8aD4sPEg+KTsoPGk+LDxJPik7KDxqPiw8Sj4pO1wKICAgICAgICAoPGs+LDxLPik7KDxsPiw8TD4pOyg8bT4sPE0+KTsoPG4+LDxOPik7KDxvPiw8Tz4pO1wKICAgICAgICAoPHA+LDxQPik7KDxxPiw8UT4pOyg8cj4sPFI+KTsoPHM+LDxTPik7KDx0Piw8VD4pO1wKICAgICAgICAoPHU+LDxVPik7KDx2Piw8Vj4pOyg8dz4sPFc+KTsoPHg+LDxYPik7KDx5Piw8WT4pO1wKICAgICAgICAoPHo+LDxaPik7XAogICAgICAgIC4uLgogICAgICAgICg8dC1jZWRpbGxhPiw8VC1jZWRpbGxhPikKKi8KICAgICAgICBVbmljb2RlU2V0IHVzID0gbmV3IFVuaWNvZGVTZXQoKTsKICAgICAgICBmb3IgKFVuaWNvZGVTZXRJdGVyYXRvciBpdCA9IG5ldyBVbmljb2RlU2V0SXRlcmF0b3IoY2hhcnMpOyBpdC5uZXh0KCk7KSB7CiAgICAgICAgCWludCBsb3cgPSBVQ2hhcmFjdGVyLnRvVXBwZXJDYXNlKGl0LmNvZGVwb2ludCk7CiAgICAgICAgICAgIGlmIChsb3cgIT0gaXQuY29kZXBvaW50KSB1cy5hZGQoaXQuY29kZXBvaW50KTsKICAgICAgICB9CiAgICAgICAgaXRlbSA9IDA7CiAgICAgICAgbGFzdCA9IGNoYXJzLnNpemUoKSAtIDE7CiAgICAgICAgZm9yIChVbmljb2RlU2V0SXRlcmF0b3IgaXQgPSBuZXcgVW5pY29kZVNldEl0ZXJhdG9yKHVzKTsgaXQubmV4dCgpOyArK2l0ZW0pIHsKICAgICAgICAgICAgaWYgKGl0ZW0gPT0gMCkgb3V0LnByaW50KCJ0b3VwcGVyIik7CiAgICAgICAgCW91dC5wcmludCgiXHQoPCIgKyBnZXRJRCgnVScsaXQuY29kZXBvaW50KSArICI+LDwiICsgCiAgICAgICAgICAgICAgICAgICAgZ2V0SUQoJ1UnLFVDaGFyYWN0ZXIudG9VcHBlckNhc2UoaXQuY29kZXBvaW50KSkgKyAiPikiKTsKICAgICAgICAgICAgaWYgKGl0ZW0gIT0gbGFzdCkgb3V0LnByaW50KCI7XFwiKTsKICAgICAgICAgICAgb3V0LnByaW50bG4oIiBcdCMgIiArIGdldE5hbWUoaXQuZ2V0U3RyaW5nKCkpKTsgICAgICAgICAgIAogICAgICAgIH0KICAgICAgICBvdXQucHJpbnRsbigpOwoJfQoKCXByaXZhdGUgdm9pZCB3cml0ZURlZmluaXRpb25zKFByaW50V3JpdGVyIG91dCkgewogICAgICAgIC8vY29sbGF0aW5nLWVsZW1lbnQgPEEtQT4gZnJvbSAiPFUwMDQxPjxVMDA0MT4iCiAgICAgICAgU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ID0gY29udHJhY3Rpb25zLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKICAgICAgICAgICAgYnVmZmVyLnNldExlbmd0aCgwKTsKICAgICAgICAgICAgU3RyaW5nIHMgPSAoU3RyaW5nKSBpdC5uZXh0KCk7CiAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoImNvbGxhdGluZy1lbGVtZW50ICIpCiAgICAgICAgICAgIC5hcHBlbmQoZ2V0SUQocywgdHJ1ZSkpCgkJCS5hcHBlbmQoIiBmcm9tICIpCiAgICAgICAgICAgIC5hcHBlbmQoZ2V0SUQocywgZmFsc2UpKTsKICAgICAgICAgICAgb3V0LnByaW50bG4oYnVmZmVyLnRvU3RyaW5nKCkpOwogICAgICAgIH0gICAgICAgIAogICAgfQogICAgCiAgICBwcml2YXRlIGNsYXNzIEludExpc3QgewogICAgCXByaXZhdGUgQml0U2V0IHN0dWZmID0gbmV3IEJpdFNldCgpOwogICAgICAgIHByaXZhdGUgaW50IGxlYXN0SXRlbSA9IEludGVnZXIuTUFYX1ZBTFVFOwogICAgICAgIHZvaWQgYWRkKGludCBpdGVtKSB7CiAgICAgICAgICAgIHN0dWZmLnNldChpdGVtKTsKICAgICAgICAgICAgaWYgKGl0ZW0gPCBsZWFzdEl0ZW0pIGxlYXN0SXRlbSA9IGl0ZW07CiAgICAgICAgfQogICAgICAgIHZvaWQgcmVtb3ZlKGludCBpdGVtKSB7CiAgICAgICAgICAgIHN0dWZmLmNsZWFyKGl0ZW0pOwogICAgICAgICAgICBpZiAoaXRlbSA9PSBsZWFzdEl0ZW0pIHsKICAgICAgICAgICAgCS8vIHNlYXJjaCBmb3IgbmV3IGxlYXN0CiAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gaXRlbSsxOyBpIDwgc3R1ZmYuc2l6ZSgpOyArK2kpIHsKICAgICAgICAgICAgICAgIAlpZiAoc3R1ZmYuZ2V0KGkpKSB7CiAgICAgICAgICAgICAgICAJCWxlYXN0SXRlbSA9IGk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBsZWFzdEl0ZW0gPSBJbnRlZ2VyLk1BWF9WQUxVRTsgLy8gZmFpbGVkLCBub3cgZW1wdHkKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpbnQgZ2V0TGVhc3QoKSB7CiAgICAgICAgCXJldHVybiBsZWFzdEl0ZW07CiAgICAgICAgfQogICAgfQoKICAgIEludExpc3QgbmVlZFRvV3JpdGVQcmltYXJ5ID0gbmV3IEludExpc3QoKTsKICAgIFNldCBub25VbmlxdWVXZWlnaHRzID0gbmV3IEhhc2hTZXQoKTsKICAgIFNldCBhbGxXZWlnaHRzID0gbmV3IEhhc2hTZXQoKTsKICAgIE1hcCBzdHJpbmdUb1dlaWdodHMgPSBuZXcgSGFzaE1hcCgpOwoKICAgIHByaXZhdGUgdm9pZCB3cml0ZUxpc3QoUHJpbnRXcml0ZXIgb3V0KSB7CiAgICAgICAgQml0U2V0IGFscmVhZHlTZWVuID0gbmV3IEJpdFNldCgpOwogICAgICAgIEJpdFNldCBuZWVkVG9Xcml0ZSA9IG5ldyBCaXRTZXQoKTsKICAgICAgICBuZWVkVG9Xcml0ZS5zZXQoMSk7IC8vIHNwZWNpYWwgd2VpZ2h0IGZvciB1bmlxdWVuZXNzCiAgICAgICAgaW50IG1heFNlZW4gPSAwOwogICAgICAgIGZvciAoSXRlcmF0b3IgaXQxID0gYWxsSXRlbXMuaXRlcmF0b3IoKTsgaXQxLmhhc05leHQoKTspIHsKICAgICAgICAgICAgU3RyaW5nIHN0cmluZyA9IChTdHJpbmcpIGl0MS5uZXh0KCk7CiAgICAgICAgICAgIFdlaWdodHMgdyA9IG5ldyBXZWlnaHRzKGNvbC5nZXRDb2xsYXRpb25FbGVtZW50SXRlcmF0b3Ioc3RyaW5nKSk7CiAgICAgICAgICAgIHcucHJpbWFyaWVzLnNldEJpdHMobmVlZFRvV3JpdGUpOwogICAgICAgICAgICB3LnNlY29uZGFyaWVzLnNldEJpdHMobmVlZFRvV3JpdGUpOwogICAgICAgICAgICB3LnRlcnRpYXJpZXMuc2V0Qml0cyhuZWVkVG9Xcml0ZSk7CiAgICAgICAgICAgIGlmIChhbGxXZWlnaHRzLmNvbnRhaW5zKHcpKSBub25VbmlxdWVXZWlnaHRzLmFkZCh3KTsKICAgICAgICAgICAgYWxsV2VpZ2h0cy5hZGQodyk7CiAgICAgICAgICAgIHN0cmluZ1RvV2VpZ2h0cy5wdXQoc3RyaW5nLCB3KTsKICAgICAgICB9CiAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuZWVkVG9Xcml0ZS5zaXplKCk7ICsraSkgewogICAgICAgIAlpZiAobmVlZFRvV3JpdGUuZ2V0KGkpKSBvdXQucHJpbnRsbihnZXRJRCgnWCcsIGkpKTsKICAgICAgICB9CiAgICB9CgoJLyoqCgkgKiBAcGFyYW0gY29sCgkgKiBAcGFyYW0gc3RyaW5nCgkgKi8KCXByaXZhdGUgU3RyaW5nIHNob3dMaW5lKFJ1bGVCYXNlZENvbGxhdG9yIGNvbCwgU3RyaW5nIHN0cmluZykgewogICAgICAgIFN0cmluZyBwcmVmaXggPSAiIjsKCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcigpOwogICAgICAgIHJlc3VsdC5hcHBlbmQoZ2V0SUQoc3RyaW5nLCB0cnVlKSk7CiAgICAgICAgcmVzdWx0LmFwcGVuZCgiIFx0Iik7CiAgICAgICAgLy8gZ2F0aGVyIGRhdGEKICAgICAgICBXZWlnaHRzIHcgPSAoV2VpZ2h0cykgc3RyaW5nVG9XZWlnaHRzLmdldChzdHJpbmcpOwogICAgICAgIHJlc3VsdC5hcHBlbmQody5wcmltYXJpZXMpCiAgICAgICAgLmFwcGVuZCgiOyIpCiAgICAgICAgLmFwcGVuZCh3LnNlY29uZGFyaWVzKQogICAgICAgIC5hcHBlbmQoIjsiKQogICAgICAgIC5hcHBlbmQody50ZXJ0aWFyaWVzKQogICAgICAgIC5hcHBlbmQoIjsiKQogICAgICAgIC5hcHBlbmQobm9uVW5pcXVlV2VpZ2h0cy5jb250YWlucyh3KQogICAgICAgICAgICAgICAgPyBnZXRJRChOb3JtYWxpemVyLmRlY29tcG9zZShzdHJpbmcsZmFsc2UpLCBmYWxzZSkKICAgICAgICAgICAgICAgIDogZ2V0SUQoJ1gnLCAxKSkKICAgICAgICAuYXBwZW5kKCIgXHQjICIpCiAgICAgICAgLmFwcGVuZChnZXROYW1lKHN0cmluZykpOwogICAgICAgIAoKICAgICAgICBpZiAocHJlZml4Lmxlbmd0aCgpICE9IDApIHJlc3VsdC5pbnNlcnQoMCxwcmVmaXgpOwoJCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKCX0KICAgIAogICAgLyogcHJpbWFyaWVzLnNpemUoKSA9PSAwIAogICAgICAgICAgICAgICAgICAgICYmIHNlY29uZGFyaWVzLnNpemUoKSA9PSAwIAogICAgICAgICAgICAgICAgICAgICYmIHRlcnRpYXJpZXMuc2l6ZSgpID09IDAgCiAgICAgICAgICAgICAgICA/ICJJR05PUkUiIAogICAgICAgICAgICAgICAgICAgICAgICA6ICovCiAgICAKCS8qKgoJICogQHBhcmFtIHN0cmluZwoJICogQHJldHVybgoJICovCglwcml2YXRlIE9iamVjdCBnZXROYW1lKFN0cmluZyBzKSB7CiAgICAgICAgaW50IGNwOwogICAgICAgIFN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CiAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzLmxlbmd0aCgpOyBpICs9IFVURjE2LmdldENoYXJDb3VudChjcCkpIHsKICAgICAgICAgICAgY3AgPSBVVEYxNi5jaGFyQXQocywgaSk7CiAgICAgICAgICAgIGlmIChpICE9IDApIHJlc3VsdC5hcHBlbmQoIiwgIik7CiAgICAgICAgICAgIFN0cmluZyBuID0gVUNoYXJhY3Rlci5nZXRFeHRlbmRlZE5hbWUoY3ApOwogICAgICAgICAgICByZXN1bHQuYXBwZW5kKG4pOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Cgl9CgoJLyoqCgkgKiBAcGFyYW0gbGVhZENoYXIgVE9ETwoJICogQHBhcmFtIGkKCSAqIEBwYXJhbSBpbnRMaXN0CgkgKiBAcmV0dXJuCgkgKi8KCXByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRJRChjaGFyIGxlYWRDaGFyLCBpbnQgaSkgewoJCXJldHVybiAiPCIgKyBsZWFkQ2hhciArIFV0aWxpdHkuaGV4KGksNCkrICI+IjsKCX0KCgkvKioKCSAqIEBwYXJhbSBpCgkgKiBAcGFyYW0gaW50TGlzdAoJICovCglwcml2YXRlIGNsYXNzIFdlaWdodHMgewoJCVdlaWdodExpc3QgcHJpbWFyaWVzID0gbmV3IFdlaWdodExpc3QoKTsKCQlXZWlnaHRMaXN0IHNlY29uZGFyaWVzID0gbmV3IFdlaWdodExpc3QoKTsKCQlXZWlnaHRMaXN0IHRlcnRpYXJpZXMgPSBuZXcgV2VpZ2h0TGlzdCgpOwogICAgICAgIHB1YmxpYyBXZWlnaHRzKENvbGxhdGlvbkVsZW1lbnRJdGVyYXRvciBpdCkgewogICAgICAgICAgICB3aGlsZSAodHJ1ZSkgewogICAgICAgICAgICAgICAgaW50IGNlID0gaXQubmV4dCgpOwogICAgICAgICAgICAgICAgaWYgKGNlID09IGl0Lk5VTExPUkRFUikgYnJlYWs7CiAgICAgICAgICAgICAgICBpbnQgcCA9IGl0LnByaW1hcnlPcmRlcihjZSk7CiAgICAgICAgICAgICAgICBwcmltYXJpZXMuYXBwZW5kKHApOwogICAgICAgICAgICAgICAgc2Vjb25kYXJpZXMuYXBwZW5kKGl0LnNlY29uZGFyeU9yZGVyKGNlKSk7CiAgICAgICAgICAgICAgICB0ZXJ0aWFyaWVzLmFwcGVuZChpdC50ZXJ0aWFyeU9yZGVyKGNlKSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvdGhlcikgewogICAgICAgICAgICBXZWlnaHRzIHRoYXQgPSAoV2VpZ2h0cylvdGhlcjsKICAgICAgICAgICAgcmV0dXJuIHByaW1hcmllcy5lcXVhbHModGhhdC5wcmltYXJpZXMpCiAgICAgICAgICAgICAgICAmJiBzZWNvbmRhcmllcy5lcXVhbHModGhhdC5zZWNvbmRhcmllcykKICAgICAgICAgICAgICAgICYmIHRlcnRpYXJpZXMuZXF1YWxzKHRoYXQudGVydGlhcmllcyk7CiAgICAgICAgfQogICAgICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CiAgICAgICAgCXJldHVybiAocHJpbWFyaWVzLmhhc2hDb2RlKCkqMzcKICAgICAgICAgICAgICAgICsgc2Vjb25kYXJpZXMuaGFzaENvZGUoKSkqMzcKICAgICAgICAgICAgICAgICsgdGVydGlhcmllcy5oYXNoQ29kZSgpOwogICAgICAgIH0KICAgIH0KCglwcml2YXRlIGNsYXNzIFdlaWdodExpc3QgewogICAgICAgIGNoYXJbXSB3ZWlnaHRzID0gbmV3IGNoYXJbNV07CiAgICAgICAgLy8gVE9ETyBsZW5ndGhlbiBvbiBkZW1hbmQKICAgICAgICBpbnQgY291bnQgPSAwOwogICAgICAgIHB1YmxpYyB2b2lkIGFwcGVuZChpbnQgaSkgewogICAgICAgICAgICAvLyBhZGQgZWFjaCAxNi1iaXQgcXVhbnRpdHkKICAgICAgICAgICAgZm9yIChpbnQgaiA9IDE2OyBqID49IDA7IGogLT0gMTYpIHsKICAgICAgICAgICAgICAgIGNoYXIgYiA9IChjaGFyKShpID4+PiBqKTsKICAgICAgICAgICAgICAgIGlmIChiID09IDApIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgd2VpZ2h0c1tjb3VudCsrXSA9IGI7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcHVibGljIHZvaWQgc2V0Qml0cyhCaXRTZXQgcykgewogICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGNvdW50OyArK2opIHMuc2V0KHdlaWdodHNbal0pOyAgIAogICAgICAgIH0KCiAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKICAgICAgICAgICAgaWYgKGNvdW50ID09IDApIHJldHVybiAiSUdOT1JFIjsKICAgICAgICAgICAgaWYgKGNvdW50ID09IDEpIHJldHVybiBnZXRJRCgnWCcsIHdlaWdodHNbMF0pOwogICAgICAgICAgICBTdHJpbmcgcmVzdWx0ID0gIlwiIjsKICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgKytpKSB7CiAgICAgICAgICAgICAgICByZXN1bHQgKz0gZ2V0SUQoJ1gnLCB3ZWlnaHRzW2ldKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gcmVzdWx0ICsgIlwiIjsKICAgICAgICB9CiAgICAgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvdGhlcikgewogICAgICAgICAgICBXZWlnaHRMaXN0IHRoYXQgPSAoV2VpZ2h0TGlzdClvdGhlcjsKICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBjb3VudDsgKytqKSB7CiAgICAgICAgICAgIAlpZiAod2VpZ2h0c1tqXSAhPSB0aGF0LndlaWdodHNbal0pIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKICAgICAgICAgICAgaW50IHJlc3VsdCA9IGNvdW50OwogICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGNvdW50OyArK2opIHJlc3VsdCA9IHJlc3VsdCozNyArIHdlaWdodHNbal07ICAKICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgICB9CiAgICB9CiAgICAKICAgIHByaXZhdGUgU3RyaW5nIGdldElEKFN0cmluZyBzLCBib29sZWFuIGlzU2luZ2xlSUQpIHsKICAgICAgICAvL09iamVjdCBkZWZpbmVkID0gZGVmaW5lZElELmdldChzKTsKICAgICAgICAvL2lmIChkZWZpbmVkICE9IG51bGwpIHJldHVybiAoU3RyaW5nKSBkZWZpbmVkOwogICAgICAgIC8vaWYgKGRlZmluZWQgIT0gbnVsbCkgcmV0dXJuIChTdHJpbmcpIGRlZmluZWQ7CiAgICAgICAgCiAgICAgICAgU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKICAgICAgICBpZiAoIVVURjE2Lmhhc01vcmVDb2RlUG9pbnRzVGhhbihzLCAxKSkgewogICAgICAgIAkvLyBzaW5nbGUgY29kZSBwb2ludAogICAgICAgICAgICBhcHBlbmRJRChVVEYxNi5jaGFyQXQocywwKSwgcmVzdWx0LCBmYWxzZSk7CiAgICAgICAgfSBlbHNlIGlmIChpc1NpbmdsZUlEKSB7CiAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoJzwnKTsKICAgICAgICAgICAgaW50IGNwOwogICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHMubGVuZ3RoKCk7IGkgKz0gVVRGMTYuZ2V0Q2hhckNvdW50KGNwKSkgewogICAgICAgICAgICAgICAgY3AgPSBVVEYxNi5jaGFyQXQocywgaSk7CiAgICAgICAgICAgICAgICBpZiAoaSAhPSAwKSByZXN1bHQuYXBwZW5kKCctJyk7CiAgICAgICAgICAgICAgICBhcHBlbmRJRChjcCwgcmVzdWx0LCB0cnVlKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXN1bHQuYXBwZW5kKCc+Jyk7ICAgICAgICAgICAgCiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgnIicpOwogICAgICAgICAgICBpbnQgY3A7CiAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcy5sZW5ndGgoKTsgaSArPSBVVEYxNi5nZXRDaGFyQ291bnQoY3ApKSB7CiAgICAgICAgICAgICAgICBjcCA9IFVURjE2LmNoYXJBdChzLCBpKTsKICAgICAgICAgICAgICAgIGFwcGVuZElEKGNwLCByZXN1bHQsIGZhbHNlKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXN1bHQuYXBwZW5kKCciJyk7CiAgICAgICAgfQogICAgICAgIHJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKICAgIH0KCglwcml2YXRlIFN0cmluZ0J1ZmZlciBhcHBlbmRJRChpbnQgY3AsIFN0cmluZ0J1ZmZlciByZXN1bHQsIGJvb2xlYW4gbmFrZWRJRCkgewogICAgICAgIGlmICghbmFrZWRJRCkgcmVzdWx0LmFwcGVuZCgnPCcpOwoJCXJlc3VsdC5hcHBlbmQoJ1UnKS5hcHBlbmQoVXRpbGl0eS5oZXgoY3AsNCkpOwogICAgICAgIGlmICghbmFrZWRJRCkgcmVzdWx0LmFwcGVuZCgnPicpOwogICAgICAgIHJldHVybiByZXN1bHQ7Cgl9CiAgICAKICAgIFVuaWNvZGVTZXQgdWNhX2NvbnRyYWN0aW9ucyA9IG5ldyBVbmljb2RlU2V0KCJbe1x1MDQwNlx1MDMwOH17XHUwNDEwXHUwMzA2fXtcdTA0MTBcdTAzMDh9e1x1MDQxM1x1MDMwMX17XHUwNDEzXHUwMzQxfXtcdTA0MTVcdTAzMDZ9e1x1MDQxNlx1MDMwOH17XHUwNDE3XHUwMzA4fXtcdTA0MThcdTAzMDZ9e1x1MDQxOFx1MDMwOH17XHUwNDFBXHUwMzAxfXtcdTA0MUFcdTAzNDF9e1x1MDQxRVx1MDMwOH17XHUwNDIzXHUwMzA2fXtcdTA0MjNcdTAzMDh9e1x1MDQyM1x1MDMwQn17XHUwNDI3XHUwMzA4fXtcdTA0MkJcdTAzMDh9e1x1MDQyRFx1MDMwOH17XHUwNDMwXHUwMzA2fXtcdTA0MzBcdTAzMDh9e1x1MDQzM1x1MDMwMX17XHUwNDMzXHUwMzQxfXtcdTA0MzVcdTAzMDZ9e1x1MDQzNlx1MDMwOH17XHUwNDM3XHUwMzA4fXtcdTA0MzhcdTAzMDZ9e1x1MDQzOFx1MDMwOH17XHUwNDNBXHUwMzAxfXtcdTA0M0FcdTAzNDF9e1x1MDQzRVx1MDMwOH17XHUwNDQzXHUwMzA2fXtcdTA0NDNcdTAzMDh9e1x1MDQ0M1x1MDMwQn17XHUwNDQ3XHUwMzA4fXtcdTA0NEJcdTAzMDh9e1x1MDQ0RFx1MDMwOH17XHUwNDU2XHUwMzA4fXtcdTA0NzRcdTAzMEZ9e1x1MDQ3NVx1MDMwRn17XHUwNEQ4XHUwMzA4fXtcdTA0RDlcdTAzMDh9e1x1MDRFOFx1MDMwOH17XHUwNEU5XHUwMzA4fXtcdTA2MjdcdTA2NTN9e1x1MDYyN1x1MDY1NH17XHUwNjI3XHUwNjU1fXtcdTA2NDhcdTA2NTR9e1x1MDY0QVx1MDY1NH17XHUwOUM3XHUwOUJFfXtcdTA5QzdcdTA5RDd9e1x1MEI0N1x1MEIzRX17XHUwQjQ3XHUwQjU2fXtcdTBCNDdcdTBCNTd9e1x1MEI5Mlx1MEJEN317XHUwQkM2XHUwQkJFfXtcdTBCQzZcdTBCRDd9e1x1MEJDN1x1MEJCRX17XHUwQzQ2XHUwQzU2fXtcdTBDQkZcdTBDRDV9e1x1MENDNlx1MENDMn17XHUwQ0M2XHUwQ0MyXHUwQ0Q1fXtcdTBDQzZcdTBDRDV9e1x1MENDNlx1MENENn17XHUwQ0NBXHUwQ0Q1fXtcdTBENDZcdTBEM0V9e1x1MEQ0Nlx1MEQ1N317XHUwRDQ3XHUwRDNFfXtcdTBERDlcdTBEQ0F9e1x1MEREOVx1MERDRn17XHUwREQ5XHUwRENGXHUwRENBfXtcdTBERDlcdTBEREZ9e1x1MEREQ1x1MERDQX17XHUwRTREXHUwRTMyfXtcdTBFQ0RcdTBFQjJ9e1x1MEY3MVx1MEY3Mn17XHUwRjcxXHUwRjc0fXtcdTBGNzFcdTBGODB9e1x1MEZCMlx1MEY3MX17XHUwRkIyXHUwRjcxXHUwRjgwfXtcdTBGQjJcdTBGODB9e1x1MEZCMlx1MEY4MX17XHUwRkIzXHUwRjcxfXtcdTBGQjNcdTBGNzFcdTBGODB9e1x1MEZCM1x1MEY4MH17XHUwRkIzXHUwRjgxfXtcdTEwMjVcdTEwMkV9XSIpOwp9