{"product_id":"georgia-silk-snow-svaneti","title":"Georgia: Silk Snow — 8-Day Ski Touring Expedition in Svaneti","description":"\u003cbody\u003e\n\u003cscript\u003ewindow.__resources = {};\u003c\/script\u003e\n\u003cmeta charset=\"utf-8\"\u003e\n\u003cmeta name=\"viewport\" content=\"width=device-width, initial-scale=1\"\u003e\n\u003cscript src=\"data:text\/javascript;base64,Ly8gR0VORVJBVEVEIGZyb20gZGMtcnVudGltZS9zcmMvKi50cyDigJQgZG8gbm90IGVkaXQuIFJlYnVpbGQgd2l0aCBgY2QgZGMtcnVudGltZSAmJiBidW4gcnVuIGJ1aWxkYC4KInVzZSBzdHJpY3QiOwooKCkgPT4gewogIHZhciBfX2RlZlByb3AgPSBPYmplY3QuZGVmaW5lUHJvcGVydHk7CiAgdmFyIF9fZGVmTm9ybWFsUHJvcCA9IChvYmosIGtleSwgdmFsdWUpID0+IGtleSBpbiBvYmogPyBfX2RlZlByb3Aob2JqLCBrZXksIHsgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlLCB3cml0YWJsZTogdHJ1ZSwgdmFsdWUgfSkgOiBvYmpba2V5XSA9IHZhbHVlOwogIHZhciBfX3B1YmxpY0ZpZWxkID0gKG9iaiwga2V5LCB2YWx1ZSkgPT4gX19kZWZOb3JtYWxQcm9wKG9iaiwgdHlwZW9mIGtleSAhPT0gInN5bWJvbCIgPyBrZXkgKyAiIiA6IGtleSwgdmFsdWUpOwoKICAvLyBzcmMvcmVhY3QudHMKICBmdW5jdGlvbiBnZXRSZWFjdCgpIHsKICAgIGNvbnN0IFIgPSB3aW5kb3cuUmVhY3Q7CiAgICBpZiAoIVIpIHRocm93IG5ldyBFcnJvcigiZGMtcnVudGltZTogd2luZG93LlJlYWN0IGlzIG5vdCBhdmFpbGFibGUgeWV0Iik7CiAgICByZXR1cm4gUjsKICB9CiAgZnVuY3Rpb24gZ2V0UmVhY3RET00oKSB7CiAgICBjb25zdCBSRCA9IHdpbmRvdy5SZWFjdERPTTsKICAgIGlmICghUkQpIHRocm93IG5ldyBFcnJvcigiZGMtcnVudGltZTogd2luZG93LlJlYWN0RE9NIGlzIG5vdCBhdmFpbGFibGUgeWV0Iik7CiAgICByZXR1cm4gUkQ7CiAgfQogIHZhciBoID0gKCguLi5hcmdzKSA9PiBnZXRSZWFjdCgpLmNyZWF0ZUVsZW1lbnQoCiAgICAuLi5hcmdzCiAgKSk7CgogIC8vIHNyYy9wYXJzZS50cwogIGZ1bmN0aW9uIHBhcnNlRGNEb2N1bWVudChkb2MpIHsKICAgIGNvbnN0IGRjID0gZG9jLnF1ZXJ5U2VsZWN0b3IoIngtZGMiKTsKICAgIGlmICghZGMpIHJldHVybiBudWxsOwogICAgY29uc3Qgc2NyaXB0RWwgPSBkb2MucXVlcnlTZWxlY3Rvcigic2NyaXB0W2RhdGEtZGMtc2NyaXB0XSIpOwogICAgY29uc3QgeyBwcm9wcywgcHJldmlldyB9ID0gcGFyc2VEYXRhUHJvcHMoCiAgICAgIHNjcmlwdEVsPy5nZXRBdHRyaWJ1dGUoImRhdGEtcHJvcHMiKSA\/PyBudWxsCiAgICApOwogICAgcmV0dXJuIHsKICAgICAgdGVtcGxhdGU6IGRjLmlubmVySFRNTCwKICAgICAganM6IHNjcmlwdEVsID8gc2NyaXB0RWwudGV4dENvbnRlbnQgfHwgIiIgOiAiIiwKICAgICAgcHJvcHMsCiAgICAgIHByZXZpZXcKICAgIH07CiAgfQogIGZ1bmN0aW9uIHBhcnNlRGNUZXh0KHNyYykgewogICAgY29uc3Qgb3Blbk1hdGNoID0gLzx4LWRjKD86XHNbXj5dKik\/Pi8uZXhlYyhzcmMpOwogICAgaWYgKCFvcGVuTWF0Y2gpIHJldHVybiBudWxsOwogICAgY29uc3QgY2xvc2UgPSBzcmMubGFzdEluZGV4T2YoIjwveC1kYz4iKTsKICAgIGlmIChjbG9zZSA9PT0gLTEgfHwgY2xvc2UgPCBvcGVuTWF0Y2guaW5kZXgpIHJldHVybiBudWxsOwogICAgY29uc3QgdGVtcGxhdGUgPSBzcmMuc2xpY2Uob3Blbk1hdGNoLmluZGV4ICsgb3Blbk1hdGNoWzBdLmxlbmd0aCwgY2xvc2UpOwogICAgY29uc3QgZG9jID0gbmV3IERPTVBhcnNlcigpLnBhcnNlRnJvbVN0cmluZyhzcmMsICJ0ZXh0L2h0bWwiKTsKICAgIGNvbnN0IHNjcmlwdEVsID0gZG9jLnF1ZXJ5U2VsZWN0b3IoInNjcmlwdFtkYXRhLWRjLXNjcmlwdF0iKTsKICAgIGNvbnN0IHsgcHJvcHMsIHByZXZpZXcgfSA9IHBhcnNlRGF0YVByb3BzKAogICAgICBzY3JpcHRFbD8uZ2V0QXR0cmlidXRlKCJkYXRhLXByb3BzIikgPz8gbnVsbAogICAgKTsKICAgIHJldHVybiB7CiAgICAgIHRlbXBsYXRlLAogICAgICBqczogc2NyaXB0RWwgPyBzY3JpcHRFbC50ZXh0Q29udGVudCB8fCAiIiA6ICIiLAogICAgICBwcm9wcywKICAgICAgcHJldmlldwogICAgfTsKICB9CiAgZnVuY3Rpb24gcGFyc2VEYXRhUHJvcHMocmF3KSB7CiAgICBpZiAoIXJhdykgcmV0dXJuIHsgcHJvcHM6IG51bGwsIHByZXZpZXc6IG51bGwgfTsKICAgIGxldCBwYXJzZWQ7CiAgICB0cnkgewogICAgICBwYXJzZWQgPSBKU09OLnBhcnNlKHJhdyk7CiAgICB9IGNhdGNoIHsKICAgICAgcmV0dXJuIHsgcHJvcHM6IG51bGwsIHByZXZpZXc6IG51bGwgfTsKICAgIH0KICAgIGlmICghcGFyc2VkIHx8IHR5cGVvZiBwYXJzZWQgIT09ICJvYmplY3QiIHx8IEFycmF5LmlzQXJyYXkocGFyc2VkKSkgewogICAgICByZXR1cm4geyBwcm9wczogbnVsbCwgcHJldmlldzogbnVsbCB9OwogICAgfQogICAgY29uc3Qgb2JqID0gcGFyc2VkOwogICAgY29uc3QgcHJldmlldyA9IG9iai4kcHJldmlldyAmJiB0eXBlb2Ygb2JqLiRwcmV2aWV3ID09PSAib2JqZWN0IiA\/IG9iai4kcHJldmlldyA6IG51bGw7CiAgICBjb25zdCByZXN0ID0ge307CiAgICBmb3IgKGNvbnN0IGsgb2YgT2JqZWN0LmtleXMob2JqKSkgewogICAgICBpZiAoa1swXSAhPT0gIiQiKSByZXN0W2tdID0gb2JqW2tdOwogICAgfQogICAgcmV0dXJuIHsgcHJvcHM6IE9iamVjdC5rZXlzKHJlc3QpLmxlbmd0aCA\/IHJlc3QgOiBudWxsLCBwcmV2aWV3IH07CiAgfQogIGZ1bmN0aW9uIGRjTmFtZUZyb21QYXRoKHBhdGhuYW1lKSB7CiAgICBsZXQgcCA9IHBhdGhuYW1lIHx8ICIiOwogICAgdHJ5IHsKICAgICAgcCA9IGRlY29kZVVSSUNvbXBvbmVudChwKTsKICAgIH0gY2F0Y2ggewogICAgfQogICAgY29uc3QgYmFzZSA9IHAuc3BsaXQoIi8iKS5wb3AoKSB8fCAiUm9vdCI7CiAgICByZXR1cm4gYmFzZS5yZXBsYWNlKC9cLmRjXC5odG1sJC8sICIiKS5yZXBsYWNlKC9cLmh0bWw\/JC8sICIiKSB8fCAiUm9vdCI7CiAgfQoKICAvLyBzcmMvYm9vdC50cwogIHZhciBCQVNFX0NTUyA9IGAKICAgIC5zYy1wbGFjZWhvbGRlcntiYWNrZ3JvdW5kOnJnYmEoMjU1LDI1NSwyNTUsLjMpO2JvcmRlcjoxcHggc29saWQgcmdiYSgwLDAsMCwuNSk7CiAgICAgIGJvcmRlci1yYWRpdXM6MnB4O2JveC1zaXppbmc6Ym9yZGVyLWJveDtvdmVyZmxvdzpoaWRkZW59CiAgICBAa2V5ZnJhbWVzIHNjLXNoaW5lezAle2JhY2tncm91bmQtcG9zaXRpb246MTAwJSA1MCV9MTAwJXtiYWNrZ3JvdW5kLXBvc2l0aW9uOjAlIDUwJX19CiAgICBodG1sLnNjLWRjLXN0cmVhbWluZyAuc2MtcGxhY2Vob2xkZXIsCiAgICBodG1sLnNjLWRjLXN0cmVhbWluZyAuc2MtaW50ZXJwLnNjLW1pc3Npbmd7cG9zaXRpb246cmVsYXRpdmU7CiAgICAgIGJhY2tncm91bmQ6Y29sb3ItbWl4KGluIHNyZ2IsY3VycmVudENvbG9yIDUlLHRyYW5zcGFyZW50KTsKICAgICAgYm9yZGVyLWNvbG9yOnRyYW5zcGFyZW50fQogICAgaHRtbC5zYy1kYy1zdHJlYW1pbmcgLnNjLXBsYWNlaG9sZGVyOjpiZWZvcmUsCiAgICBodG1sLnNjLWRjLXN0cmVhbWluZyAuc2MtaW50ZXJwLnNjLW1pc3Npbmc6OmJlZm9yZXtjb250ZW50OicnOwogICAgICBwb3NpdGlvbjphYnNvbHV0ZTtpbnNldDowO3BvaW50ZXItZXZlbnRzOm5vbmU7CiAgICAgIGJhY2tncm91bmQ6bGluZWFyLWdyYWRpZW50KDkwZGVnLHJnYmEoMjE3LDExOSw4NywwKSAyNSUscmdiYSgyNDcsMjI1LDIxMSwuOTUpIDM3JSxyZ2JhKDIxNywxMTksODcsMCkgNjMlKTsKICAgICAgYmFja2dyb3VuZC1zaXplOjQwMCUgMTAwJTthbmltYXRpb246c2Mtc2hpbmUgMS40cyBlYXNlIGluZmluaXRlfQogICAgaHRtbC5zYy1kYy1zdHJlYW1pbmcgLnNjLXBsYWNlaG9sZGVyOm50aC1jaGlsZChuKzkgb2YgLnNjLXBsYWNlaG9sZGVyKTo6YmVmb3JlLAogICAgaHRtbC5zYy1kYy1zdHJlYW1pbmcgLnNjLWludGVycC5zYy1taXNzaW5nOm50aC1jaGlsZChuKzkgb2YgLnNjLWludGVycC5zYy1taXNzaW5nKTo6YmVmb3Jle2FuaW1hdGlvbjpub25lOwogICAgICBiYWNrZ3JvdW5kOmNvbG9yLW1peChpbiBzcmdiLGN1cnJlbnRDb2xvciA4JSx0cmFuc3BhcmVudCl9CiAgICAuc2MtcGxhY2Vob2xkZXItZXJyb3J7cGFkZGluZzo0cHggOHB4O2ZvbnQ6MTFweC8xLjQgdWktbW9ub3NwYWNlLG1vbm9zcGFjZTsKICAgICAgY29sb3I6cmdiYSgwLDAsMCwuNyk7d29yZC1icmVhazpicmVhay13b3JkfQogICAgLnNjLWludGVycC5zYy1taXNzaW5ne2Rpc3BsYXk6aW5saW5lLWJsb2NrO3dpZHRoOjJlbTtoZWlnaHQ6MWVtO292ZXJmbG93OmhpZGRlbjsKICAgICAgdmVydGljYWwtYWxpZ246dGV4dC1ib3R0b207YmFja2dyb3VuZDpyZ2JhKDI1NSwyNTUsMjU1LC4zKTtib3JkZXI6MXB4IHNvbGlkIHJnYmEoMCwwLDAsLjUpOwogICAgICBib3JkZXItcmFkaXVzOjJweDtib3gtc2l6aW5nOmJvcmRlci1ib3g7Y29sb3I6dHJhbnNwYXJlbnQ7CiAgICAgIHVzZXItc2VsZWN0Om5vbmV9CiAgICAuc2MtaW50ZXJwLnNjLXVucmVzb2x2ZWR7Zm9udC1mYW1pbHk6dWktbW9ub3NwYWNlLG1vbm9zcGFjZTtmb250LXNpemU6Ljg1ZW07CiAgICAgIGNvbG9yOnJnYmEoMCwwLDAsLjUpO2JhY2tncm91bmQ6cmdiYSgwLDAsMCwuMDUpO2JvcmRlci1yYWRpdXM6M3B4OwogICAgICBwYWRkaW5nOjAgM3B4fQogICAgLnNjLWhvc3Quc2MtaGFzLWVycm9ye3Bvc2l0aW9uOnJlbGF0aXZlfQogICAgLnNjLWxvZ2ljLWVycm9ye3Bvc2l0aW9uOmFic29sdXRlO3RvcDo4cHg7bGVmdDo4cHg7ei1pbmRleDoyMTQ3NDgzNjQ3O21heC13aWR0aDo2MGNoOwogICAgICBwYWRkaW5nOjZweCAxMHB4O2JhY2tncm91bmQ6I2IwMDAyMDtjb2xvcjojZmZmO2ZvbnQ6MTJweC8xLjQgdWktbW9ub3NwYWNlLG1vbm9zcGFjZTsKICAgICAgYm9yZGVyLXJhZGl1czo0cHg7d2hpdGUtc3BhY2U6cHJlLXdyYXA7cG9pbnRlci1ldmVudHM6bm9uZX0KICAgIC8qIE1pcnJvcnMgUFJJTlRfQkFTRUxJTkVfQ1NTIGluIGFwcHMvd2ViIGRlY2stc3RhZ2UtZXhwb3J0LnRzIFx1MjAxNCBrZWVwIGJvdGgKICAgICAgIGluIHN5bmMgdW50aWwgZGMtcnVudGltZSByZWdhaW5zIGEgYnVpbGQgc3RlcC4gKi8KICAgIEBtZWRpYSBwcmludCB7CiAgICAgIEBwYWdlIHsgbWFyZ2luOiAwLjVjbTsgfQogICAgICBmaWd1cmUsIHRhYmxlIHsgYnJlYWstaW5zaWRlOiBhdm9pZDsgfQogICAgICAjZGMtcm9vdCwgI2RjLXJvb3QgPiAuc2MtaG9zdCB7IGhlaWdodDogYXV0bzsgfQogICAgICAqLCAqOjpiZWZvcmUsICo6OmFmdGVyIHsKICAgICAgICBwcmludC1jb2xvci1hZGp1c3Q6IGV4YWN0OyAtd2Via2l0LXByaW50LWNvbG9yLWFkanVzdDogZXhhY3Q7CiAgICAgICAgYmFja2Ryb3AtZmlsdGVyOiBub25lICFpbXBvcnRhbnQ7IC13ZWJraXQtYmFja2Ryb3AtZmlsdGVyOiBub25lICFpbXBvcnRhbnQ7CiAgICAgICAgYW5pbWF0aW9uLWRlbGF5OiAtOTlzICFpbXBvcnRhbnQ7IGFuaW1hdGlvbi1kdXJhdGlvbjogLjAwMXMgIWltcG9ydGFudDsKICAgICAgICBhbmltYXRpb24taXRlcmF0aW9uLWNvdW50OiAxICFpbXBvcnRhbnQ7IGFuaW1hdGlvbi1maWxsLW1vZGU6IGJvdGggIWltcG9ydGFudDsKICAgICAgICBhbmltYXRpb24tcGxheS1zdGF0ZTogcnVubmluZyAhaW1wb3J0YW50OyB0cmFuc2l0aW9uLWR1cmF0aW9uOiAwcyAhaW1wb3J0YW50OwogICAgICB9CiAgICB9CiAgYDsKICB2YXIgRlVMTF9QQUdFX0NTUyA9ICJodG1sLGJvZHl7aGVpZ2h0OjEwMCU7bWFyZ2luOjB9I2RjLXJvb3QsI2RjLXJvb3Q+LnNjLWhvc3R7aGVpZ2h0OjEwMCV9IjsKICBmdW5jdGlvbiByb290TmFtZUZvckRvY3VtZW50KGRvYywgbG9jKSB7CiAgICBsZXQgYm9vdFBhdGggPSBsb2MucGF0aG5hbWUgfHwgIiI7CiAgICBpZiAoIS9cLmRjXC5odG1sPyQvaS50ZXN0KHNhZmVEZWNvZGUoYm9vdFBhdGgpKSkgewogICAgICB0cnkgewogICAgICAgIGJvb3RQYXRoID0gbmV3IFVSTChkb2MuYmFzZVVSSSB8fCAiLyIpLnBhdGhuYW1lOwogICAgICB9IGNhdGNoIHsKICAgICAgfQogICAgfQogICAgcmV0dXJuIGRjTmFtZUZyb21QYXRoKGJvb3RQYXRoKTsKICB9CiAgZnVuY3Rpb24gc2FmZURlY29kZShzKSB7CiAgICB0cnkgewogICAgICByZXR1cm4gZGVjb2RlVVJJQ29tcG9uZW50KHMpOwogICAgfSBjYXRjaCB7CiAgICAgIHJldHVybiBzOwogICAgfQogIH0KICBmdW5jdGlvbiBib290KHJ1bnRpbWUsIGRvYyA9IGRvY3VtZW50KSB7CiAgICBjb25zdCBwYXJzZWQgPSBwYXJzZURjRG9jdW1lbnQoZG9jKTsKICAgIGlmICghcGFyc2VkKSByZXR1cm4gbnVsbDsKICAgIGNvbnN0IFJlYWN0ID0gZ2V0UmVhY3QoKTsKICAgIGNvbnN0IHJvb3ROYW1lID0gcm9vdE5hbWVGb3JEb2N1bWVudChkb2MsIGxvY2F0aW9uKTsKICAgIHJ1bnRpbWUubWFya0ZldGNoZWQocm9vdE5hbWUpOwogICAgcnVudGltZS5zZXRSb290TmFtZShyb290TmFtZSk7CiAgICBydW50aW1lLmFkb3B0UGFyc2VkKHJvb3ROYW1lLCBwYXJzZWQpOwogICAgZmV0Y2gobG9jYXRpb24uaHJlZikudGhlbigocmVzKSA9PiByZXMub2sgPyByZXMudGV4dCgpIDogIiIpLnRoZW4oKHQpID0+IHsKICAgICAgY29uc3QgcmF3ID0gdCA\/IHBhcnNlRGNUZXh0KHQpIDogbnVsbDsKICAgICAgaWYgKHJhdz8udGVtcGxhdGUpIHJ1bnRpbWUudXBkYXRlSHRtbChyb290TmFtZSwgcmF3LnRlbXBsYXRlKTsKICAgIH0pLmNhdGNoKCgpID0+IHsKICAgIH0pOwogICAgY29uc3QgZGMgPSBkb2MucXVlcnlTZWxlY3RvcigieC1kYyIpOwogICAgY29uc3QgaG9zdEVsID0gZG9jLmNyZWF0ZUVsZW1lbnQoImRpdiIpOwogICAgaG9zdEVsLmlkID0gImRjLXJvb3QiOwogICAgZGMucmVwbGFjZVdpdGgoaG9zdEVsKTsKICAgIGlmICghcGFyc2VkLnByZXZpZXcpIHsKICAgICAgY29uc3QgcyA9IGRvYy5jcmVhdGVFbGVtZW50KCJzdHlsZSIpOwogICAgICBzLnRleHRDb250ZW50ID0gRlVMTF9QQUdFX0NTUzsKICAgICAgZG9jLmhlYWQuYXBwZW5kQ2hpbGQocyk7CiAgICB9CiAgICBjb25zdCBSb290ID0gcnVudGltZS5nZXREQyhyb290TmFtZSk7CiAgICBjb25zdCBlbnRyeSA9IHJ1bnRpbWUucmVnaXN0cnkuZ2V0KHJvb3ROYW1lKTsKICAgIGZ1bmN0aW9uIFN0YW5kYWxvbmVSb290KCkgewogICAgICBjb25zdCBbLCBzZXRUaWNrXSA9IFJlYWN0LnVzZVN0YXRlKDApOwogICAgICBSZWFjdC51c2VFZmZlY3QoKCkgPT4gewogICAgICAgIGNvbnN0IHN1YiA9ICgpID0+IHNldFRpY2soKG4pID0+IG4gKyAxKTsKICAgICAgICBlbnRyeS5zdWJzLmFkZChzdWIpOwogICAgICAgIHJldHVybiAoKSA9PiB7CiAgICAgICAgICBlbnRyeS5zdWJzLmRlbGV0ZShzdWIpOwogICAgICAgIH07CiAgICAgIH0sIFtdKTsKICAgICAgY29uc3QgZGVmYXVsdHMgPSBSZWFjdC51c2VNZW1vKCgpID0+IHsKICAgICAgICBjb25zdCBkID0ge307CiAgICAgICAgZm9yIChjb25zdCBrIGluIGVudHJ5LnByb3BzTWV0YSB8fCB7fSkgewogICAgICAgICAgY29uc3QgdiA9IGVudHJ5LnByb3BzTWV0YT8uW2tdPy5kZWZhdWx0OwogICAgICAgICAgaWYgKHYgIT09IHZvaWQgMCkgZFtrXSA9IHY7CiAgICAgICAgfQogICAgICAgIHJldHVybiBkOwogICAgICB9LCBbZW50cnkucHJvcHNNZXRhXSk7CiAgICAgIHJldHVybiBoKFJvb3QsIHsgLi4uZGVmYXVsdHMsIC4uLmVudHJ5LnByb3BPdmVycmlkZXMgfHwge30gfSk7CiAgICB9CiAgICBjb25zdCBSZWFjdERPTSA9IGdldFJlYWN0RE9NKCk7CiAgICBpZiAoUmVhY3RET00uY3JlYXRlUm9vdCkKICAgICAgUmVhY3RET00uY3JlYXRlUm9vdChob3N0RWwpLnJlbmRlcihoKFN0YW5kYWxvbmVSb290KSk7CiAgICBlbHNlIFJlYWN0RE9NLnJlbmRlcihoKFN0YW5kYWxvbmVSb290KSwgaG9zdEVsKTsKICAgIHJldHVybiByb290TmFtZTsKICB9CgogIC8vIHNyYy9leHByLnRzCiAgdmFyIElERU5UX1JFID0gL15bQS1aYS16XyRdW0EtWmEtejAtOV8kXSovOwogIHZhciBOVU1CRVJfUkUgPSAvXi0\/XGQrKFwuXGQrKT8kLzsKICBmdW5jdGlvbiByZXNvbHZlKHZhbHMsIHNyYykgewogICAgY29uc3QgZXhwciA9IFN0cmluZyhzcmMpLnRyaW0oKTsKICAgIGlmICghZXhwcikgcmV0dXJuIHZvaWQgMDsKICAgIGlmIChleHByWzBdID09PSAiKCIgJiYgZXhwcltleHByLmxlbmd0aCAtIDFdID09PSAiKSIgJiYgcGFyZW5zV3JhcFdob2xlKGV4cHIpKSB7CiAgICAgIHJldHVybiByZXNvbHZlKHZhbHMsIGV4cHIuc2xpY2UoMSwgLTEpKTsKICAgIH0KICAgIGNvbnN0IGVxID0gZmluZFRvcExldmVsRXF1YWxpdHkoZXhwcik7CiAgICBpZiAoZXEpIHsKICAgICAgY29uc3QgbHYgPSByZXNvbHZlKHZhbHMsIGV4cHIuc2xpY2UoMCwgZXEuaW5kZXgpKTsKICAgICAgY29uc3QgcnYgPSByZXNvbHZlKHZhbHMsIGV4cHIuc2xpY2UoZXEuaW5kZXggKyBlcS5vcC5sZW5ndGgpKTsKICAgICAgc3dpdGNoIChlcS5vcCkgewogICAgICAgIGNhc2UgIj09PSI6CiAgICAgICAgICByZXR1cm4gbHYgPT09IHJ2OwogICAgICAgIGNhc2UgIiE9PSI6CiAgICAgICAgICByZXR1cm4gbHYgIT09IHJ2OwogICAgICAgIGNhc2UgIj09IjoKICAgICAgICAgIHJldHVybiBsdiA9PSBydjsKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgcmV0dXJuIGx2ICE9IHJ2OwogICAgICB9CiAgICB9CiAgICBpZiAoZXhwclswXSA9PT0gIiEiKSByZXR1cm4gIXJlc29sdmUodmFscywgZXhwci5zbGljZSgxKSk7CiAgICBpZiAoZXhwciA9PT0gInRydWUiKSByZXR1cm4gdHJ1ZTsKICAgIGlmIChleHByID09PSAiZmFsc2UiKSByZXR1cm4gZmFsc2U7CiAgICBpZiAoZXhwciA9PT0gIm51bGwiKSByZXR1cm4gbnVsbDsKICAgIGlmIChleHByID09PSAidW5kZWZpbmVkIikgcmV0dXJuIHZvaWQgMDsKICAgIGlmIChOVU1CRVJfUkUudGVzdChleHByKSkgcmV0dXJuIE51bWJlcihleHByKTsKICAgIGlmIChleHByLmxlbmd0aCA+PSAyICYmIChleHByWzBdID09PSAnIicgfHwgZXhwclswXSA9PT0gIiciKSAmJiBleHByW2V4cHIubGVuZ3RoIC0gMV0gPT09IGV4cHJbMF0pIHsKICAgICAgcmV0dXJuIGV4cHIuc2xpY2UoMSwgLTEpOwogICAgfQogICAgcmV0dXJuIHJlc29sdmVQYXRoKHZhbHMsIGV4cHIpOwogIH0KICBmdW5jdGlvbiBwYXJlbnNXcmFwV2hvbGUoZXhwcikgewogICAgbGV0IGRlcHRoID0gMDsKICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZXhwci5sZW5ndGggLSAxOyBpKyspIHsKICAgICAgaWYgKGV4cHJbaV0gPT09ICIoIikgZGVwdGgrKzsKICAgICAgZWxzZSBpZiAoZXhwcltpXSA9PT0gIikiKSB7CiAgICAgICAgZGVwdGgtLTsKICAgICAgICBpZiAoZGVwdGggPT09IDApIHJldHVybiBmYWxzZTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIHRydWU7CiAgfQogIGZ1bmN0aW9uIGZpbmRUb3BMZXZlbEVxdWFsaXR5KGV4cHIpIHsKICAgIGxldCBkZXB0aCA9IDA7CiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGV4cHIubGVuZ3RoOyBpKyspIHsKICAgICAgY29uc3QgYyA9IGV4cHJbaV07CiAgICAgIGlmIChjID09PSAiWyIgfHwgYyA9PT0gIigiKSBkZXB0aCsrOwogICAgICBlbHNlIGlmIChjID09PSAiXSIgfHwgYyA9PT0gIikiKSBkZXB0aC0tOwogICAgICBlbHNlIGlmIChkZXB0aCA9PT0gMCAmJiAoYyA9PT0gIj0iIHx8IGMgPT09ICIhIikgJiYgZXhwcltpICsgMV0gPT09ICI9IikgewogICAgICAgIGlmIChpID4gMCAmJiAoZXhwcltpIC0gMV0gPT09ICI9IiB8fCBleHByW2kgLSAxXSA9PT0gIiEiKSkgY29udGludWU7CiAgICAgICAgaWYgKCFleHByLnNsaWNlKDAsIGkpLnRyaW0oKSkgY29udGludWU7CiAgICAgICAgY29uc3Qgb3AgPSBleHByW2kgKyAyXSA9PT0gIj0iID8gYyArICI9PSIgOiBjICsgIj0iOwogICAgICAgIHJldHVybiB7IGluZGV4OiBpLCBvcCB9OwogICAgICB9CiAgICB9CiAgICByZXR1cm4gbnVsbDsKICB9CiAgZnVuY3Rpb24gcmVzb2x2ZVBhdGgodmFscywgZXhwcikgewogICAgY29uc3QgaGVhZCA9IGV4cHIubWF0Y2goSURFTlRfUkUpOwogICAgaWYgKCFoZWFkKSByZXR1cm4gdm9pZCAwOwogICAgbGV0IGN1ciA9IHZhbHMgPT0gbnVsbCA\/IHZvaWQgMCA6IHZhbHNbaGVhZFswXV07CiAgICBsZXQgaSA9IGhlYWRbMF0ubGVuZ3RoOwogICAgd2hpbGUgKGkgPCBleHByLmxlbmd0aCkgewogICAgICBpZiAoZXhwcltpXSA9PT0gIi4iKSB7CiAgICAgICAgY29uc3QgbSA9IGV4cHIuc2xpY2UoaSArIDEpLm1hdGNoKElERU5UX1JFKSB8fCBleHByLnNsaWNlKGkgKyAxKS5tYXRjaCgvXlxkKy8pOwogICAgICAgIGlmICghbSkgcmV0dXJuIHZvaWQgMDsKICAgICAgICBjdXIgPSBjdXIgPT0gbnVsbCA\/IHZvaWQgMCA6IGN1clttWzBdXTsKICAgICAgICBpICs9IDEgKyBtWzBdLmxlbmd0aDsKICAgICAgfSBlbHNlIGlmIChleHByW2ldID09PSAiWyIpIHsKICAgICAgICBsZXQgZGVwdGggPSAxOwogICAgICAgIGxldCBqID0gaSArIDE7CiAgICAgICAgd2hpbGUgKGogPCBleHByLmxlbmd0aCAmJiBkZXB0aCA+IDApIHsKICAgICAgICAgIGlmIChleHByW2pdID09PSAiWyIpIGRlcHRoKys7CiAgICAgICAgICBlbHNlIGlmIChleHByW2pdID09PSAiXSIpIHsKICAgICAgICAgICAgZGVwdGgtLTsKICAgICAgICAgICAgaWYgKGRlcHRoID09PSAwKSBicmVhazsKICAgICAgICAgIH0KICAgICAgICAgIGorKzsKICAgICAgICB9CiAgICAgICAgaWYgKGRlcHRoICE9PSAwKSByZXR1cm4gdm9pZCAwOwogICAgICAgIGNvbnN0IGtleSA9IHJlc29sdmUodmFscywgZXhwci5zbGljZShpICsgMSwgaikpOwogICAgICAgIGN1ciA9IGN1ciA9PSBudWxsID8gdm9pZCAwIDogY3VyW2tleV07CiAgICAgICAgaSA9IGogKyAxOwogICAgICB9IGVsc2UgewogICAgICAgIHJldHVybiB2b2lkIDA7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBjdXI7CiAgfQoKICAvLyBzcmMvZW5jb2RlLnRzCiAgdmFyIENBTUVMX0FUVFIgPSAic2MtY2FtZWwtIjsKICB2YXIgUkFXX1dSQVAgPSB7CiAgICBzZWxlY3Q6ICJzYy1yYXctc2VsZWN0IiwKICAgIHRhYmxlOiAic2MtcmF3LXRhYmxlIiwKICAgIHRib2R5OiAic2MtcmF3LXRib2R5IiwKICAgIHRoZWFkOiAic2MtcmF3LXRoZWFkIiwKICAgIHRmb290OiAic2MtcmF3LXRmb290IiwKICAgIHRyOiAic2MtcmF3LXRyIiwKICAgIHRkOiAic2MtcmF3LXRkIiwKICAgIHRoOiAic2MtcmF3LXRoIiwKICAgIGNhcHRpb246ICJzYy1yYXctY2FwdGlvbiIKICB9OwogIHZhciBSQVdfVU5XUkFQID0gT2JqZWN0LmZyb21FbnRyaWVzKAogICAgT2JqZWN0LmVudHJpZXMoUkFXX1dSQVApLm1hcCgoW2ssIHZdKSA9PiBbdiwga10pCiAgKTsKICB2YXIgRVZFTlRfTUFQID0gewogICAgb25jbGljazogIm9uQ2xpY2siLAogICAgb25jaGFuZ2U6ICJvbkNoYW5nZSIsCiAgICBvbmlucHV0OiAib25JbnB1dCIsCiAgICBvbnN1Ym1pdDogIm9uU3VibWl0IiwKICAgIG9ua2V5ZG93bjogIm9uS2V5RG93biIsCiAgICBvbmtleXVwOiAib25LZXlVcCIsCiAgICBvbmtleXByZXNzOiAib25LZXlQcmVzcyIsCiAgICBvbm1vdXNlZG93bjogIm9uTW91c2VEb3duIiwKICAgIG9ubW91c2V1cDogIm9uTW91c2VVcCIsCiAgICBvbm1vdXNlZW50ZXI6ICJvbk1vdXNlRW50ZXIiLAogICAgb25tb3VzZWxlYXZlOiAib25Nb3VzZUxlYXZlIiwKICAgIG9uZm9jdXM6ICJvbkZvY3VzIiwKICAgIG9uYmx1cjogIm9uQmx1ciIsCiAgICBvbmRvdWJsZWNsaWNrOiAib25Eb3VibGVDbGljayIsCiAgICBvbmNvbnRleHRtZW51OiAib25Db250ZXh0TWVudSIKICB9OwogIHZhciBBVFRSUyA9IGAoPzpbXj4iJ118IlteIl0qInwnW14nXSonKSpgOwogIHZhciBJTVBPUlRfU0VMRl9DTE9TRV9SRSA9IG5ldyBSZWdFeHAoCiAgICAiPCh4LWltcG9ydHxkYy1pbXBvcnQpKCIgKyBBVFRSUyArICIpLz4iLAogICAgImdpIgogICk7CiAgdmFyIENBTUVMX0FUVFJfUkUgPSAvKFxzKShbYS16XStbQS1aXVtBLVphLXowLTldKikoXHMqPSkvZzsKICBmdW5jdGlvbiBlbmNvZGVDYXNlKGh0bWwpIHsKICAgIGh0bWwgPSBodG1sLnJlcGxhY2UoCiAgICAgIElNUE9SVF9TRUxGX0NMT1NFX1JFLAogICAgICAoXywgdCwgYSkgPT4gIjwiICsgdCArIGEgKyAiPjwvIiArIHQgKyAiPiIKICAgICk7CiAgICBodG1sID0gaHRtbC5yZXBsYWNlKC88aGVsbWV0KFxzfD4pL2dpLCAiPHNjLWhlbG1ldCQxIik7CiAgICBodG1sID0gaHRtbC5yZXBsYWNlKC88XC9oZWxtZXRccyo+L2dpLCAiPC9zYy1oZWxtZXQ+Iik7CiAgICBodG1sID0gaHRtbC5yZXBsYWNlKAogICAgICBDQU1FTF9BVFRSX1JFLAogICAgICAoXywgc3AsIG5hbWUsIGVxKSA9PiBzcCArIENBTUVMX0FUVFIgKyBuYW1lLnJlcGxhY2UoL1tBLVpdL2csIChjKSA9PiAiLSIgKyBjLnRvTG93ZXJDYXNlKCkpICsgZXEKICAgICk7CiAgICBmb3IgKGNvbnN0IFtyZWFsLCBhbGlhc10gb2YgT2JqZWN0LmVudHJpZXMoUkFXX1dSQVApKSB7CiAgICAgIGh0bWwgPSBodG1sLnJlcGxhY2UoCiAgICAgICAgbmV3IFJlZ0V4cCgiKDwvPykiICsgcmVhbCArICIoPz1bXFxzPl0pIiwgImdpIiksCiAgICAgICAgIiQxIiArIGFsaWFzCiAgICAgICk7CiAgICB9CiAgICByZXR1cm4gaHRtbDsKICB9CiAgZnVuY3Rpb24ga2ViYWJUb0NhbWVsKHMpIHsKICAgIHJldHVybiBzLnJlcGxhY2UoLy0oW2Etel0pL2csIChfLCBjKSA9PiBjLnRvVXBwZXJDYXNlKCkpOwogIH0KICBmdW5jdGlvbiBjc3NUb09iaihjc3MpIHsKICAgIGNvbnN0IG8gPSB7fTsKICAgIGZvciAoY29uc3QgZGVjbCBvZiBjc3Muc3BsaXQoIjsiKSkgewogICAgICBjb25zdCBpID0gZGVjbC5pbmRleE9mKCI6Iik7CiAgICAgIGlmIChpIDwgMCkgY29udGludWU7CiAgICAgIGNvbnN0IHByb3AgPSBkZWNsLnNsaWNlKDAsIGkpLnRyaW0oKTsKICAgICAgb1twcm9wLnN0YXJ0c1dpdGgoIi0tIikgPyBwcm9wIDoga2ViYWJUb0NhbWVsKHByb3ApXSA9IGRlY2wuc2xpY2UoaSArIDEpLnRyaW0oKTsKICAgIH0KICAgIHJldHVybiBvOwogIH0KICBmdW5jdGlvbiBjb21waWxlQXR0cihyYXcpIHsKICAgIGNvbnN0IHdob2xlID0gcmF3Lm1hdGNoKC9eXHMqXHtceyhbXHNcU10rPylcfVx9XHMqJC8pOwogICAgaWYgKHdob2xlKSB7CiAgICAgIGNvbnN0IHBhdGggPSB3aG9sZVsxXTsKICAgICAgcmV0dXJuICh2YWxzKSA9PiByZXNvbHZlKHZhbHMsIHBhdGgpOwogICAgfQogICAgaWYgKHJhdy5pbmNsdWRlcygie3siKSkgewogICAgICBjb25zdCBwYXJ0cyA9IHJhdy5zcGxpdCgvXHtceyhbXHNcU10rPylcfVx9L2cpOwogICAgICByZXR1cm4gKHZhbHMpID0+IHBhcnRzLm1hcCgocywgaSkgPT4gaSAmIDEgPyByZXNvbHZlKHZhbHMsIHMpID8\/ICIiIDogcykuam9pbigiIik7CiAgICB9CiAgICByZXR1cm4gKCkgPT4gcmF3OwogIH0KCiAgLy8gc3JjL2NvbXBpbGUudHMKICBmdW5jdGlvbiBjb2xsZWN0UHJvcHMobm9kZSwga2luZCwgaG9zdCkgewogICAgY29uc3QgcHJvcEdldHRlcnMgPSBbXTsKICAgIGNvbnN0IHBzZXVkb0NsYXNzZXMgPSBbXTsKICAgIGxldCBoaW50U2l6ZSA9IG51bGw7CiAgICBmb3IgKGNvbnN0IHsgbmFtZSwgdmFsdWUgfSBvZiBbLi4ubm9kZS5hdHRyaWJ1dGVzXSkgewogICAgICBpZiAobmFtZSA9PT0gInNjLW5hbWUiIHx8IG5hbWUgPT09ICJkYXRhLWRjLXRwbCIpIGNvbnRpbnVlOwogICAgICBsZXQga2V5ID0gbmFtZTsKICAgICAgaWYgKGtleS5zdGFydHNXaXRoKENBTUVMX0FUVFIpKQogICAgICAgIGtleSA9IGtlYmFiVG9DYW1lbChrZXkuc2xpY2UoQ0FNRUxfQVRUUi5sZW5ndGgpKTsKICAgICAgaWYgKGtleSA9PT0gImhpbnQtc2l6ZSIpIHsKICAgICAgICBoaW50U2l6ZSA9IHZhbHVlOwogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIGlmIChrZXkuc3RhcnRzV2l0aCgic3R5bGUtIikpIHsKICAgICAgICBwc2V1ZG9DbGFzc2VzLnB1c2goaG9zdC5wc2V1ZG9DbGFzcyhrZXkuc2xpY2UoNiksIHZhbHVlKSk7CiAgICAgICAgY29udGludWU7CiAgICAgIH0KICAgICAgaWYgKGtpbmQgIT09ICJkb20iKSB7CiAgICAgICAgaWYgKGtleS5pbmNsdWRlcygiLSIpICYmICEoa2luZCA9PT0gIngtaW1wb3J0IiAmJiAoa2V5LnN0YXJ0c1dpdGgoImFyaWEtIikgfHwga2V5LnN0YXJ0c1dpdGgoImRhdGEtIikpKSkKICAgICAgICAgIGtleSA9IGtlYmFiVG9DYW1lbChrZXkpOwogICAgICB9IGVsc2UgewogICAgICAgIGlmIChrZXkgPT09ICJjbGFzcyIpIGtleSA9ICJjbGFzc05hbWUiOwogICAgICAgIGVsc2UgaWYgKGtleSA9PT0gImZvciIpIGtleSA9ICJodG1sRm9yIjsKICAgICAgICBlbHNlIGlmIChrZXkuc3RhcnRzV2l0aCgib24iKSkKICAgICAgICAgIGtleSA9IEVWRU5UX01BUFtrZXldIHx8ICJvbiIgKyBrZXlbMl0udG9VcHBlckNhc2UoKSArIGtleS5zbGljZSgzKTsKICAgICAgfQogICAgICBwcm9wR2V0dGVycy5wdXNoKFtrZXksIGNvbXBpbGVBdHRyKHZhbHVlKV0pOwogICAgfQogICAgcmV0dXJuIHsgcHJvcEdldHRlcnMsIHBzZXVkb0NsYXNzZXMsIGhpbnRTaXplIH07CiAgfQogIHZhciBIT1NUX1NUWUxFX1BST1BTID0gLyogQF9fUFVSRV9fICovIG5ldyBTZXQoWwogICAgInBvc2l0aW9uIiwKICAgICJsZWZ0IiwKICAgICJyaWdodCIsCiAgICAidG9wIiwKICAgICJib3R0b20iLAogICAgImluc2V0IiwKICAgICJ3aWR0aCIsCiAgICAiaGVpZ2h0IiwKICAgICJ6LWluZGV4IiwKICAgICJ0cmFuc2Zvcm0iCiAgXSk7CiAgZnVuY3Rpb24gaG9zdFBvc2l0aW9uU3R5bGUoc3R5bGUpIHsKICAgIGNvbnN0IGFsbCA9IHR5cGVvZiBzdHlsZSA9PT0gInN0cmluZyIgPyBjc3NUb09iaihzdHlsZSkgOiBzdHlsZSAhPSBudWxsICYmIHR5cGVvZiBzdHlsZSA9PT0gIm9iamVjdCIgPyBzdHlsZSA6IG51bGw7CiAgICBpZiAoIWFsbCkgcmV0dXJuIHZvaWQgMDsKICAgIGNvbnN0IG91dCA9IHt9OwogICAgZm9yIChjb25zdCBbaywgdl0gb2YgT2JqZWN0LmVudHJpZXMoYWxsKSkgewogICAgICBjb25zdCBrZWJhYiA9IGsucmVwbGFjZSgvW0EtWl0vZywgKGMpID0+ICItIiArIGMudG9Mb3dlckNhc2UoKSk7CiAgICAgIGlmIChIT1NUX1NUWUxFX1BST1BTLmhhcyhrZWJhYikpIG91dFtrXSA9IHY7CiAgICB9CiAgICByZXR1cm4gT2JqZWN0LmtleXMob3V0KS5sZW5ndGggPyBvdXQgOiB2b2lkIDA7CiAgfQogIGZ1bmN0aW9uIGNvbXBpbGVUZW1wbGF0ZShodG1sLCBob3N0KSB7CiAgICBjb25zdCB0cGwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0ZW1wbGF0ZSIpOwogICAgLy8hIG5vc2VtZ3JlcDogZGlyZWN0LWlubmVyLWh0bWwtYXNzaWdubWVudAogICAgdHBsLmlubmVySFRNTCA9IGVuY29kZUNhc2UoaHRtbCk7CiAgICBsZXQgdHBsTiA9IDA7CiAgICAoZnVuY3Rpb24gc3RhbXAobm9kZSkgewogICAgICBpZiAobm9kZS5ub2RlVHlwZSA9PT0gTm9kZS5FTEVNRU5UX05PREUpIHsKICAgICAgICBub2RlLnNldEF0dHJpYnV0ZSgiZGF0YS1kYy10cGwiLCBTdHJpbmcodHBsTisrKSk7CiAgICAgIH0KICAgICAgZm9yIChjb25zdCBjIG9mIG5vZGUuY2hpbGROb2Rlcykgc3RhbXAoYyk7CiAgICB9KSh0cGwuY29udGVudCk7CiAgICBjb25zdCBidWlsZGVycyA9IHdhbGtDaGlsZHJlbih0cGwuY29udGVudCwgaG9zdCk7CiAgICBjb25zdCByZW5kZXIgPSAoKHZhbHMsIGN0eCkgPT4gYnVpbGRlcnMubWFwKChiLCBpKSA9PiBiKHZhbHMgfHwge30sIGN0eCwgaSkpKTsKICAgIHJlbmRlci5fX2Fubm90YXRlZCA9IHRwbC5pbm5lckhUTUw7CiAgICByZXR1cm4gcmVuZGVyOwogIH0KICBmdW5jdGlvbiB3YWxrQ2hpbGRyZW4obm9kZSwgaG9zdCkgewogICAgcmV0dXJuIFsuLi5ub2RlLmNoaWxkTm9kZXNdLm1hcCgoYykgPT4gd2FsayhjLCBob3N0KSkuZmlsdGVyKChiKSA9PiBiICE9IG51bGwpOwogIH0KICBmdW5jdGlvbiB3YWxrKG5vZGUsIGhvc3QpIHsKICAgIGlmIChub2RlLm5vZGVUeXBlID09PSBOb2RlLlRFWFRfTk9ERSkgcmV0dXJuIHdhbGtUZXh0KG5vZGUpOwogICAgaWYgKG5vZGUubm9kZVR5cGUgIT09IE5vZGUuRUxFTUVOVF9OT0RFKSByZXR1cm4gbnVsbDsKICAgIGNvbnN0IGVsID0gbm9kZTsKICAgIGNvbnN0IHRhZyA9IGVsLnRhZ05hbWUudG9Mb3dlckNhc2UoKTsKICAgIGlmICh0YWcgPT09ICJzYy1mb3IiKSByZXR1cm4gd2Fsa0ZvcihlbCwgaG9zdCk7CiAgICBpZiAodGFnID09PSAic2MtaWYiKSByZXR1cm4gd2Fsa0lmKGVsLCBob3N0KTsKICAgIGlmICh0YWcgPT09ICJ4LWltcG9ydCIpIHJldHVybiB3YWxrWEltcG9ydChlbCwgaG9zdCk7CiAgICBpZiAodGFnID09PSAic2MtaGVsbWV0IikgcmV0dXJuIGhvc3QuaGVsbWV0KGVsKTsKICAgIGlmICh0YWcgPT09ICJkYy1pbXBvcnQiKSByZXR1cm4gd2Fsa0NvbXBvbmVudChlbCwgaG9zdCk7CiAgICByZXR1cm4gd2Fsa0VsZW1lbnQoZWwsIGhvc3QpOwogIH0KICB2YXIgd2FybmVkSG9sZXMgPSAvKiBAX19QVVJFX18gKi8gbmV3IFNldCgpOwogIGZ1bmN0aW9uIHdhcm5VbnJlc29sdmVkKGN0eCwgd2hhdCkgewogICAgY29uc3Qga2V5ID0gKGN0eD8uX19uYW1lIHx8ICI\/IikgKyAiXDAiICsgd2hhdDsKICAgIGlmICh3YXJuZWRIb2xlcy5oYXMoa2V5KSkgcmV0dXJuOwogICAgd2FybmVkSG9sZXMuYWRkKGtleSk7CiAgICBjb25zb2xlLndhcm4oIltkYy1ydW50aW1lXSAiICsgKGN0eD8uX19uYW1lIHx8ICJ0ZW1wbGF0ZSIpICsgIjogIiArIHdoYXQpOwogIH0KICBmdW5jdGlvbiB3YWxrVGV4dChub2RlKSB7CiAgICBjb25zdCB0eHQgPSBub2RlLm5vZGVWYWx1ZSA\/PyAiIjsKICAgIGlmICghdHh0LmluY2x1ZGVzKCJ7eyIpKSB7CiAgICAgIGlmICghdHh0LnRyaW0oKSAmJiAhdHh0LmluY2x1ZGVzKCIgIikpIHJldHVybiBudWxsOwogICAgICByZXR1cm4gKCkgPT4gdHh0OwogICAgfQogICAgY29uc3QgcGFydHMgPSB0eHQuc3BsaXQoL1x7XHsoW1xzXFNdKz8pXH1cfS9nKTsKICAgIHJldHVybiAodmFscywgY3R4LCBrZXkpID0+IGgoCiAgICAgIGdldFJlYWN0KCkuRnJhZ21lbnQsCiAgICAgIHsga2V5IH0sCiAgICAgIC4uLnBhcnRzLm1hcCgocCwgaSkgPT4gewogICAgICAgIGlmICghKGkgJiAxKSkgcmV0dXJuIHA7CiAgICAgICAgY29uc3QgdiA9IHJlc29sdmUodmFscywgcCk7CiAgICAgICAgaWYgKHYgPT09IHZvaWQgMCkgewogICAgICAgICAgaWYgKCFjdHg\/Ll9fc3RyZWFtaW5nTm93KSB7CiAgICAgICAgICAgIGlmIChkb2N1bWVudC5ib2R5Py5oYXNBdHRyaWJ1dGUoImRhdGEtZGMtZWRpdG9yLW9uIikpIHsKICAgICAgICAgICAgICByZXR1cm4gaCgKICAgICAgICAgICAgICAgICJzcGFuIiwKICAgICAgICAgICAgICAgIHsga2V5OiBpLCBjbGFzc05hbWU6ICJzYy1pbnRlcnAgc2MtdW5yZXNvbHZlZCIgfSwKICAgICAgICAgICAgICAgICJ7eyAiICsgcC50cmltKCkgKyAiIH19IgogICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgd2FyblVucmVzb2x2ZWQoCiAgICAgICAgICAgICAgY3R4LAogICAgICAgICAgICAgICJ7eyAiICsgcC50cmltKCkgKyAiIH19IG5ldmVyIHJlc29sdmVkIFx1MjAxNCByZW5kZXJlZCBhcyBlbXB0eSIKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gaCgKICAgICAgICAgICAgInNwYW4iLAogICAgICAgICAgICB7IGtleTogaSwgY2xhc3NOYW1lOiAic2MtaW50ZXJwIHNjLW1pc3NpbmciIH0sCiAgICAgICAgICAgIHAudHJpbSgpCiAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICBpZiAoZ2V0UmVhY3QoKS5pc1ZhbGlkRWxlbWVudCh2KSB8fCBBcnJheS5pc0FycmF5KHYpKSB7CiAgICAgICAgICByZXR1cm4gaChnZXRSZWFjdCgpLkZyYWdtZW50LCB7IGtleTogaSB9LCB2KTsKICAgICAgICB9CiAgICAgICAgaWYgKHYgPT09IG51bGwgfHwgdHlwZW9mIHYgPT09ICJib29sZWFuIikgcmV0dXJuIG51bGw7CiAgICAgICAgcmV0dXJuIGgoInNwYW4iLCB7IGtleTogaSwgY2xhc3NOYW1lOiAic2MtaW50ZXJwIiB9LCBTdHJpbmcodikpOwogICAgICB9KQogICAgKTsKICB9CiAgZnVuY3Rpb24gd2Fsa0ZvcihlbCwgaG9zdCkgewogICAgY29uc3QgbGlzdEdldCA9IGNvbXBpbGVBdHRyKGVsLmdldEF0dHJpYnV0ZSgibGlzdCIpIHx8ICIiKTsKICAgIGNvbnN0IGFzTmFtZSA9IGVsLmdldEF0dHJpYnV0ZSgiYXMiKSB8fCAiaXRlbSI7CiAgICBjb25zdCBoaW50TiA9IHBhcnNlSW50KGVsLmdldEF0dHJpYnV0ZSgiaGludC1wbGFjZWhvbGRlci1jb3VudCIpIHx8ICIwIiwgMTApOwogICAgY29uc3Qga2lkcyA9IHdhbGtDaGlsZHJlbihlbCwgaG9zdCk7CiAgICBjb25zdCBsaXN0U3JjID0gZWwuZ2V0QXR0cmlidXRlKCJsaXN0IikgfHwgIiI7CiAgICByZXR1cm4gKHZhbHMsIGN0eCwga2V5KSA9PiB7CiAgICAgIGxldCBsaXN0ID0gbGlzdEdldCh2YWxzKTsKICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGxpc3QpKSB7CiAgICAgICAgaWYgKCFjdHg\/Ll9fc3RyZWFtaW5nTm93KSB7CiAgICAgICAgICBpZiAobGlzdCAhPT0gdm9pZCAwICYmIGxpc3QgIT09IG51bGwpIHsKICAgICAgICAgICAgd2FyblVucmVzb2x2ZWQoCiAgICAgICAgICAgICAgY3R4LAogICAgICAgICAgICAgICdzYy1mb3IgbGlzdD0iJyArIGxpc3RTcmMgKyAnIiBpcyBub3QgYW4gYXJyYXkgKCcgKyB0eXBlb2YgbGlzdCArICIpIgogICAgICAgICAgICApOwogICAgICAgICAgfQogICAgICAgICAgbGlzdCA9IFtdOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBsaXN0ID0gaGludE4gPiAwID8gQXJyYXkoaGludE4pLmZpbGwodm9pZCAwKSA6IFtdOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gaCgKICAgICAgICBnZXRSZWFjdCgpLkZyYWdtZW50LAogICAgICAgIHsga2V5IH0sCiAgICAgICAgbGlzdC5tYXAoKGl0ZW0sIGkpID0+IHsKICAgICAgICAgIGNvbnN0IHN1YiA9IHsgLi4udmFscywgW2FzTmFtZV06IGl0ZW0sICRpbmRleDogaSB9OwogICAgICAgICAgcmV0dXJuIGgoCiAgICAgICAgICAgIGdldFJlYWN0KCkuRnJhZ21lbnQsCiAgICAgICAgICAgIHsga2V5OiBpIH0sCiAgICAgICAgICAgIGtpZHMubWFwKChiLCBqKSA9PiBiKHN1YiwgY3R4LCBqKSkKICAgICAgICAgICk7CiAgICAgICAgfSkKICAgICAgKTsKICAgIH07CiAgfQogIGZ1bmN0aW9uIHdhbGtJZihlbCwgaG9zdCkgewogICAgY29uc3QgdmFsR2V0ID0gY29tcGlsZUF0dHIoZWwuZ2V0QXR0cmlidXRlKCJ2YWx1ZSIpIHx8ICIiKTsKICAgIGNvbnN0IGhpbnRSYXcgPSBlbC5nZXRBdHRyaWJ1dGUoImhpbnQtcGxhY2Vob2xkZXItdmFsIik7CiAgICBjb25zdCBoaW50R2V0ID0gaGludFJhdyAhPSBudWxsID8gY29tcGlsZUF0dHIoaGludFJhdykgOiBudWxsOwogICAgY29uc3Qga2lkcyA9IHdhbGtDaGlsZHJlbihlbCwgaG9zdCk7CiAgICByZXR1cm4gKHZhbHMsIGN0eCwga2V5KSA9PiB7CiAgICAgIGxldCB2ID0gdmFsR2V0KHZhbHMpOwogICAgICBpZiAodiA9PT0gdm9pZCAwICYmIGhpbnRHZXQgJiYgY3R4Py5fX3N0cmVhbWluZ05vdykgdiA9IGhpbnRHZXQodmFscyk7CiAgICAgIHJldHVybiB2ID8gaCgKICAgICAgICBnZXRSZWFjdCgpLkZyYWdtZW50LAogICAgICAgIHsga2V5IH0sCiAgICAgICAga2lkcy5tYXAoKGIsIGopID0+IGIodmFscywgY3R4LCBqKSkKICAgICAgKSA6IG51bGw7CiAgICB9OwogIH0KICBmdW5jdGlvbiB3YWxrQ29tcG9uZW50KGVsLCBob3N0KSB7CiAgICBjb25zdCBuYW1lID0gZWwuZ2V0QXR0cmlidXRlKCJuYW1lIikgfHwgZWwuZ2V0QXR0cmlidXRlKCJjb21wb25lbnQiKSB8fCAiIjsKICAgIGVsLnJlbW92ZUF0dHJpYnV0ZSgibmFtZSIpOwogICAgZWwucmVtb3ZlQXR0cmlidXRlKCJjb21wb25lbnQiKTsKICAgIGNvbnN0IHRwbElkID0gZWwuZ2V0QXR0cmlidXRlKCJkYXRhLWRjLXRwbCIpOwogICAgY29uc3Qgc3R5bGVSYXcgPSBlbC5nZXRBdHRyaWJ1dGUoInN0eWxlIik7CiAgICBlbC5yZW1vdmVBdHRyaWJ1dGUoInN0eWxlIik7CiAgICBjb25zdCBzdHlsZUdldCA9IHN0eWxlUmF3ICE9IG51bGwgPyBjb21waWxlQXR0cihzdHlsZVJhdykgOiBudWxsOwogICAgY29uc3QgeyBwcm9wR2V0dGVycywgaGludFNpemUgfSA9IGNvbGxlY3RQcm9wcyhlbCwgImRjLWltcG9ydCIsIGhvc3QpOwogICAgY29uc3Qga2lkcyA9IHdhbGtDaGlsZHJlbihlbCwgaG9zdCk7CiAgICByZXR1cm4gKHZhbHMsIGN0eCwga2V5KSA9PiB7CiAgICAgIGNvbnN0IHByb3BzID0gewogICAgICAgIGtleSwKICAgICAgICBfX2hpbnRTaXplOiBoaW50U2l6ZSwKICAgICAgICBfX3RwbElkOiB0cGxJZCwKICAgICAgICBfX2hvc3RTdHlsZTogc3R5bGVHZXQgPyBob3N0UG9zaXRpb25TdHlsZShzdHlsZUdldCh2YWxzKSkgOiB2b2lkIDAKICAgICAgfTsKICAgICAgZm9yIChjb25zdCBbaywgZ10gb2YgcHJvcEdldHRlcnMpIHsKICAgICAgICBjb25zdCB2ID0gZyh2YWxzKTsKICAgICAgICBpZiAoayA9PT0gImRjUHJvcHMiKSB7CiAgICAgICAgICBpZiAodiAmJiB0eXBlb2YgdiA9PT0gIm9iamVjdCIpIE9iamVjdC5hc3NpZ24ocHJvcHMsIHYpOwogICAgICAgICAgY29udGludWU7CiAgICAgICAgfQogICAgICAgIHByb3BzW2tdID0gdjsKICAgICAgfQogICAgICBpZiAoa2lkcy5sZW5ndGgpIHByb3BzLmNoaWxkcmVuID0ga2lkcy5tYXAoKGIsIGopID0+IGIodmFscywgY3R4LCBqKSk7CiAgICAgIHJldHVybiBoKGhvc3QuY29tcG9uZW50KG5hbWUpLCBwcm9wcyk7CiAgICB9OwogIH0KICBmdW5jdGlvbiB3YWxrWEltcG9ydChlbCwgaG9zdCkgewogICAgY29uc3QgZ2xvYmFsTmFtZUdldCA9IGNvbXBpbGVBdHRyKAogICAgICBlbC5nZXRBdHRyaWJ1dGUoImNvbXBvbmVudC1mcm9tLWdsb2JhbC1zY29wZSIpIHx8ICIiCiAgICApOwogICAgY29uc3QgZXhwb3J0TmFtZUdldCA9IGNvbXBpbGVBdHRyKAogICAgICBlbC5nZXRBdHRyaWJ1dGUoImNvbXBvbmVudCIpIHx8IGVsLmdldEF0dHJpYnV0ZSgibmFtZSIpIHx8ICIiCiAgICApOwogICAgY29uc3QgZnJvbVJhdyA9IGVsLmdldEF0dHJpYnV0ZSgiZnJvbSIpIHx8IGVsLmdldEF0dHJpYnV0ZSgic3JjIikgfHwgZWwuZ2V0QXR0cmlidXRlKCJpbXBvcnQiKSB8fCAiIjsKICAgIGNvbnN0IHVybHMgPSBmcm9tUmF3LnRyaW0oKSA\/IGZyb21SYXcudHJpbSgpLnNwbGl0KC9ccysvKSA6IFtdOwogICAgY29uc3QgdXJsID0gdXJscy5sZW5ndGggPyB1cmxzW3VybHMubGVuZ3RoIC0gMV0gOiAiIjsKICAgIGNvbnN0IGtpbmRPZiA9ICh1KSA9PiAvXC4oanN4fHRzeCkoXD98I3wkKS9pLnRlc3QodSkgPyAianN4IiA6ICJqcyI7CiAgICBjb25zdCB0cGxJZCA9IGVsLmdldEF0dHJpYnV0ZSgiZGF0YS1kYy10cGwiKTsKICAgIGNvbnN0IHN0eWxlUmF3ID0gZWwuZ2V0QXR0cmlidXRlKCJzdHlsZSIpOwogICAgZWwucmVtb3ZlQXR0cmlidXRlKCJzdHlsZSIpOwogICAgY29uc3Qgc3R5bGVHZXQgPSBzdHlsZVJhdyAhPSBudWxsID8gY29tcGlsZUF0dHIoc3R5bGVSYXcpIDogbnVsbDsKICAgIGNvbnN0IHdyYXAgPSB0cGxJZCAhPSBudWxsIHx8IHN0eWxlR2V0ICE9IG51bGw7CiAgICBjb25zdCB7IHByb3BHZXR0ZXJzLCBoaW50U2l6ZSB9ID0gY29sbGVjdFByb3BzKGVsLCAieC1pbXBvcnQiLCBob3N0KTsKICAgIGNvbnN0IGhhc0NvbnRlbnQgPSBlbC5jaGlsZHJlbi5sZW5ndGggPiAwIHx8ICEhKGVsLnRleHRDb250ZW50IHx8ICIiKS50cmltKCk7CiAgICBjb25zdCBraWRzID0gaGFzQ29udGVudCA\/IHdhbGtDaGlsZHJlbihlbCwgaG9zdCkgOiBbXTsKICAgIGNvbnN0IHVybEJpbmRhYmxlID0gZnJvbVJhdy5pbmNsdWRlcygie3siKTsKICAgIGlmICh1cmxzLmxlbmd0aCAmJiAhdXJsQmluZGFibGUpIHsKICAgICAgbGV0IHByZXY7CiAgICAgIGZvciAoY29uc3QgdSBvZiB1cmxzKSBwcmV2ID0gaG9zdC5sb2FkRXh0ZXJuYWwoa2luZE9mKHUpLCB1LCBwcmV2KTsKICAgIH0KICAgIGNvbnN0IGV2YWxOYW1lID0gKGcsIHZhbHMpID0+IHsKICAgICAgY29uc3QgdiA9IGcodmFscyk7CiAgICAgIGNvbnN0IHMgPSB2ID09IG51bGwgPyAiIiA6IFN0cmluZyh2KTsKICAgICAgcmV0dXJuIHMuaW5jbHVkZXMoInt7IikgPyAiIiA6IHM7CiAgICB9OwogICAgcmV0dXJuICh2YWxzLCBjdHgsIGtleSkgPT4gewogICAgICBjb25zdCBnbG9iYWxOYW1lID0gZXZhbE5hbWUoZ2xvYmFsTmFtZUdldCwgdmFscyk7CiAgICAgIGNvbnN0IG5hbWUgPSBnbG9iYWxOYW1lIHx8IGV2YWxOYW1lKGV4cG9ydE5hbWVHZXQsIHZhbHMpOwogICAgICBjb25zdCBDID0gIW5hbWUgfHwgdXJsQmluZGFibGUgPyBudWxsIDogZ2xvYmFsTmFtZSA\/IGhvc3QucmVzb2x2ZUV4dGVybmFsR2xvYmFsKHVybCwgZ2xvYmFsTmFtZSkgOiBob3N0LnJlc29sdmVFeHRlcm5hbCh1cmwsIG5hbWUpOwogICAgICBjb25zdCBob3N0U3R5bGUgPSBzdHlsZUdldCA\/IGhvc3RQb3NpdGlvblN0eWxlKHN0eWxlR2V0KHZhbHMpKSA6IHZvaWQgMDsKICAgICAgY29uc3Qgd3JhcHBlciA9IHdyYXAgPyB7CiAgICAgICAga2V5LAogICAgICAgIGNsYXNzTmFtZTogInNjLWhvc3QteCIsCiAgICAgICAgImRhdGEtZGMtdHBsIjogdHBsSWQsCiAgICAgICAgc3R5bGU6IGhvc3RTdHlsZSB8fCB7IGRpc3BsYXk6ICJjb250ZW50cyIgfQogICAgICB9IDogbnVsbDsKICAgICAgaWYgKCFDKSB7CiAgICAgICAgY29uc3QgZXJyb3IgPSB1cmxCaW5kYWJsZSA\/ICJ4LWltcG9ydCBgZnJvbWAgY2Fubm90IGNvbnRhaW4ge3sgXHUyMDI2IH19IFx1MjAxNCBtb2R1bGUgVVJMcyBhcmUgcmVzb2x2ZWQgYXQgcGFyc2UgdGltZTsgdXNlIGEgbGl0ZXJhbCBVUkwiIDogaG9zdC5yZXNvbHZlRXh0ZXJuYWxFcnJvcih1cmwsIG5hbWUpOwogICAgICAgIGNvbnN0IHBoID0gaG9zdC5wbGFjZWhvbGRlcih7CiAgICAgICAgICBrZXk6IHdyYXBwZXIgPyB2b2lkIDAgOiBrZXksCiAgICAgICAgICBuYW1lLAogICAgICAgICAgaGludFNpemUsCiAgICAgICAgICBlcnJvcgogICAgICAgIH0pOwogICAgICAgIHJldHVybiB3cmFwcGVyID8gaCgiZGl2Iiwgd3JhcHBlciwgcGgpIDogcGg7CiAgICAgIH0KICAgICAgY29uc3QgcHJvcHMgPSB3cmFwcGVyID8ge30gOiB7IGtleSB9OwogICAgICBsZXQgdW5yZXNvbHZlZEhvbGUgPSBmYWxzZTsKICAgICAgZm9yIChjb25zdCBbaywgZ10gb2YgcHJvcEdldHRlcnMpIHsKICAgICAgICBpZiAoayA9PT0gImNvbXBvbmVudCIgfHwgayA9PT0gImNvbXBvbmVudEZyb21HbG9iYWxTY29wZSIgfHwgayA9PT0gImZyb20iKSB7CiAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CiAgICAgICAgY29uc3QgdiA9IGcodmFscyk7CiAgICAgICAgaWYgKHYgPT09IHZvaWQgMCkgdW5yZXNvbHZlZEhvbGUgPSB0cnVlOwogICAgICAgIGlmIChrID09PSAiZGNQcm9wcyIpIHsKICAgICAgICAgIGlmICh2ICYmIHR5cGVvZiB2ID09PSAib2JqZWN0IikgT2JqZWN0LmFzc2lnbihwcm9wcywgdik7CiAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CiAgICAgICAgcHJvcHNba10gPSB2OwogICAgICB9CiAgICAgIGlmICh1bnJlc29sdmVkSG9sZSAmJiBjdHg\/Ll9faHRtbFN0cmVhbWluZ05vdykgewogICAgICAgIGNvbnN0IHBoID0gaG9zdC5wbGFjZWhvbGRlcih7CiAgICAgICAgICBrZXk6IHdyYXBwZXIgPyB2b2lkIDAgOiBrZXksCiAgICAgICAgICBuYW1lLAogICAgICAgICAgaGludFNpemUsCiAgICAgICAgICBlcnJvcjogbnVsbAogICAgICAgIH0pOwogICAgICAgIHJldHVybiB3cmFwcGVyID8gaCgiZGl2Iiwgd3JhcHBlciwgcGgpIDogcGg7CiAgICAgIH0KICAgICAgaWYgKGtpZHMubGVuZ3RoKSBwcm9wcy5jaGlsZHJlbiA9IGtpZHMubWFwKChiLCBqKSA9PiBiKHZhbHMsIGN0eCwgaikpOwogICAgICByZXR1cm4gd3JhcHBlciA\/IGgoImRpdiIsIHdyYXBwZXIsIGgoQywgcHJvcHMpKSA6IGgoQywgcHJvcHMpOwogICAgfTsKICB9CiAgZnVuY3Rpb24gd2Fsa0VsZW1lbnQoZWwsIGhvc3QpIHsKICAgIGNvbnN0IHJlYWxUYWcgPSBSQVdfVU5XUkFQW2VsLmxvY2FsTmFtZV0gfHwgZWwubG9jYWxOYW1lOwogICAgY29uc3QgdHBsSWQgPSBlbC5nZXRBdHRyaWJ1dGUoImRhdGEtZGMtdHBsIik7CiAgICBjb25zdCB7IHByb3BHZXR0ZXJzLCBwc2V1ZG9DbGFzc2VzIH0gPSBjb2xsZWN0UHJvcHMoZWwsICJkb20iLCBob3N0KTsKICAgIGNvbnN0IGtpZHMgPSB3YWxrQ2hpbGRyZW4oZWwsIGhvc3QpOwogICAgcmV0dXJuICh2YWxzLCBjdHgsIGtleSkgPT4gewogICAgICBjb25zdCBwcm9wcyA9IHsga2V5LCAiZGF0YS1kYy10cGwiOiB0cGxJZCB9OwogICAgICBmb3IgKGNvbnN0IFtrLCBnXSBvZiBwcm9wR2V0dGVycykgewogICAgICAgIGxldCB2ID0gZyh2YWxzKTsKICAgICAgICBpZiAoayA9PT0gInN0eWxlIiAmJiB0eXBlb2YgdiA9PT0gInN0cmluZyIpIHYgPSBjc3NUb09iaih2KTsKICAgICAgICBpZiAoKGsgPT09ICJ2YWx1ZSIgfHwgayA9PT0gImNoZWNrZWQiKSAmJiB2ID09PSB2b2lkIDApIHsKICAgICAgICAgIHYgPSBrID09PSAiY2hlY2tlZCIgPyBmYWxzZSA6ICIiOwogICAgICAgIH0KICAgICAgICBwcm9wc1trXSA9IHY7CiAgICAgIH0KICAgICAgaWYgKHBzZXVkb0NsYXNzZXMubGVuZ3RoKSB7CiAgICAgICAgcHJvcHMuY2xhc3NOYW1lID0gW3Byb3BzLmNsYXNzTmFtZSwgLi4ucHNldWRvQ2xhc3Nlc10uZmlsdGVyKEJvb2xlYW4pLmpvaW4oIiAiKTsKICAgICAgfQogICAgICByZXR1cm4gaChyZWFsVGFnLCBwcm9wcywgLi4ua2lkcy5tYXAoKGIsIGopID0+IGIodmFscywgY3R4LCBqKSkpOwogICAgfTsKICB9CgogIC8vIHNyYy9sb2dpYy50cwogIHZhciBTdHJlYW1hYmxlTG9naWMgPSBjbGFzcyB7CiAgICBjb25zdHJ1Y3Rvcihwcm9wcykgewogICAgICBfX3B1YmxpY0ZpZWxkKHRoaXMsICJwcm9wcyIpOwogICAgICBfX3B1YmxpY0ZpZWxkKHRoaXMsICJzdGF0ZSIsIHt9KTsKICAgICAgLyoqIEJhY2stcG9pbnRlciB0byB0aGUgd3JhcHBlciBjb21wb25lbnQsIGluc3RhbGxlZCBhZnRlciBjb25zdHJ1Y3Rpb24uICovCiAgICAgIF9fcHVibGljRmllbGQodGhpcywgIl9faG9zdCIpOwogICAgICB0aGlzLnByb3BzID0gcHJvcHMgfHwge307CiAgICB9CiAgICBzZXRTdGF0ZSh1cGRhdGUsIGNiKSB7CiAgICAgIHRoaXMuX19ob3N0ICYmIHRoaXMuX19ob3N0Ll9fc2V0TG9naWNTdGF0ZSh1cGRhdGUsIGNiKTsKICAgIH0KICAgIGZvcmNlVXBkYXRlKCkgewogICAgICB0aGlzLl9faG9zdCAmJiB0aGlzLl9faG9zdC5mb3JjZVVwZGF0ZSgpOwogICAgfQogICAgY29tcG9uZW50RGlkTW91bnQoKSB7CiAgICB9CiAgICBjb21wb25lbnREaWRVcGRhdGUoX3ByZXZQcm9wcykgewogICAgfQogICAgY29tcG9uZW50V2lsbFVubW91bnQoKSB7CiAgICB9CiAgICAvKiogVGhlIGZsYXQgb2JqZWN0IHRoZSB0ZW1wbGF0ZSByZW5kZXJzIGFnYWluc3QgKG1lcmdlZCBvdmVyIHByb3BzKS4gKi8KICAgIHJlbmRlclZhbHMoKSB7CiAgICAgIHJldHVybiB7fTsKICAgIH0KICB9OwogIGZ1bmN0aW9uIGV2YWxEY0xvZ2ljKHNyYykgewogICAgLy8hIG5vc2VtZ3JlcDogZXZhbC1hbmQtZnVuY3Rpb24tY29uc3RydWN0b3IKICAgIGNvbnN0IGZuID0gbmV3IEZ1bmN0aW9uKAogICAgICAiRENMb2dpYyIsCiAgICAgICJTdHJlYW1hYmxlTG9naWMiLAogICAgICAiUmVhY3QiLAogICAgICBzcmMgKyAnXG47cmV0dXJuICh0eXBlb2YgQ29tcG9uZW50IT09InVuZGVmaW5lZCImJkNvbXBvbmVudCl8fHVuZGVmaW5lZDsnCiAgICApOwogICAgcmV0dXJuIGZuKFN0cmVhbWFibGVMb2dpYywgU3RyZWFtYWJsZUxvZ2ljLCBnZXRSZWFjdCgpKTsKICB9CgogIC8vIHNyYy9jb21wb25lbnQudHMKICBmdW5jdGlvbiBzaGFsbG93RXF1YWwoYSwgYikgewogICAgaWYgKCFiKSByZXR1cm4gZmFsc2U7CiAgICBjb25zdCBhayA9IE9iamVjdC5rZXlzKGEpLmZpbHRlcigoaykgPT4gayAhPT0gImNoaWxkcmVuIik7CiAgICBjb25zdCBiayA9IE9iamVjdC5rZXlzKGIpLmZpbHRlcigoaykgPT4gayAhPT0gImNoaWxkcmVuIik7CiAgICBpZiAoYWsubGVuZ3RoICE9PSBiay5sZW5ndGgpIHJldHVybiBmYWxzZTsKICAgIGZvciAoY29uc3QgayBvZiBhaykgaWYgKGFba10gIT09IGJba10pIHJldHVybiBmYWxzZTsKICAgIHJldHVybiB0cnVlOwogIH0KICBmdW5jdGlvbiBQbGFjZWhvbGRlcih7CiAgICBuYW1lLAogICAgaGludFNpemUsCiAgICBzdHJlYW1pbmcsCiAgICBlcnJvcgogIH0pIHsKICAgIGNvbnN0IFt3LCBoZ3RdID0gKGhpbnRTaXplIHx8ICIxMDAlLDYwcHgiKS5zcGxpdCgiLCIpOwogICAgcmV0dXJuIGgoCiAgICAgICJkaXYiLAogICAgICB7CiAgICAgICAgY2xhc3NOYW1lOiAic2MtcGxhY2Vob2xkZXIiICsgKHN0cmVhbWluZyA\/ICIgc2Mtc3RyZWFtaW5nIiA6ICIiKSwKICAgICAgICBzdHlsZTogeyB3aWR0aDogdy50cmltKCksIGhlaWdodDogaGd0ICYmIGhndC50cmltKCkgfSwKICAgICAgICB0aXRsZTogbmFtZQogICAgICB9LAogICAgICBlcnJvciA\/IGgoCiAgICAgICAgImRpdiIsCiAgICAgICAgeyBjbGFzc05hbWU6ICJzYy1wbGFjZWhvbGRlci1lcnJvciIgfSwKICAgICAgICAobmFtZSA\/IG5hbWUgKyAiOiAiIDogIiIpICsgZXJyb3IKICAgICAgKSA6IG51bGwKICAgICk7CiAgfQogIGZ1bmN0aW9uIGhpbnRUb01pbihoaW50KSB7CiAgICBpZiAoIWhpbnQpIHJldHVybiB2b2lkIDA7CiAgICBjb25zdCBbdywgaGd0XSA9IGhpbnQuc3BsaXQoIiwiKTsKICAgIHJldHVybiB7IG1pbldpZHRoOiB3LnRyaW0oKSwgbWluSGVpZ2h0OiBoZ3QgJiYgaGd0LnRyaW0oKSB9OwogIH0KICBmdW5jdGlvbiBjcmVhdGVDb21wb25lbnRGYWN0b3J5KHJlZ2lzdHJ5LCBlbnN1cmVGZXRjaGVkKSB7CiAgICBjb25zdCBSZWFjdCA9IGdldFJlYWN0KCk7CiAgICBjb25zdCBBbmNlc3RvckNvbnRleHQgPSBSZWFjdC5jcmVhdGVDb250ZXh0KFtdKTsKICAgIGNsYXNzIFN0cmVhbWFibGVDb21wb25lbnQgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQgewogICAgICBjb25zdHJ1Y3Rvcihwcm9wcykgewogICAgICAgIHN1cGVyKHByb3BzKTsKICAgICAgICBfX3B1YmxpY0ZpZWxkKHRoaXMsICJfX25hbWUiKTsKICAgICAgICBfX3B1YmxpY0ZpZWxkKHRoaXMsICJfX3N1YiIpOwogICAgICAgIF9fcHVibGljRmllbGQodGhpcywgIl9fbmVlZHNEaWRNb3VudCIsIGZhbHNlKTsKICAgICAgICAvKiogU25hcHNob3Qgb2YgdGhlIHJlZ2lzdHJ5J3Mgc3RyZWFtaW5nIGZsYWdzIHRha2VuIGF0IHJlbmRlciB0aW1lIOKAlAogICAgICAgICAqICBidWlsZGVycyByZWFkIGl0IG9mZiB0aGUgUmVuZGVyQ3R4ICh0aGlzKSB0byBwaWNrIHBsYWNlaG9sZGVyIHZzCiAgICAgICAgICogIHJlbmRlci1ub3RoaW5nIGZvciB1bnJlc29sdmVkIHZhbHVlcy4gKi8KICAgICAgICBfX3B1YmxpY0ZpZWxkKHRoaXMsICJfX3N0cmVhbWluZ05vdyIsIGZhbHNlKTsKICAgICAgICBfX3B1YmxpY0ZpZWxkKHRoaXMsICJfX2h0bWxTdHJlYW1pbmdOb3ciLCBmYWxzZSk7CiAgICAgICAgLyoqIFdoZW4gYSBjb25zdHJ1Y3QgdGhyb3dzLCByZW1lbWJlciB0aGUgKGNsYXNzLCByZWdpc3RyeS52ZXIsIHByb3BzKQogICAgICAgICAqICB0cmlwbGUgc28gcmVuZGVyLXRpbWUgcmVjb25jaWxlIGRvZXNuJ3QgcmUtYXR0ZW1wdCBpdCBvbiBldmVyeSBwYXJlbnQKICAgICAgICAgKiAgcmUtcmVuZGVyLiBBIHJlZ2lzdHJ5IGJ1bXAgKG5ldyBjbGFzcywgdGVtcGxhdGUsIGV4dGVybmFsIG1vZHVsZQogICAgICAgICAqICByZXNvbHZpbmcgdmlhIGJ1bXBBbGwpIGNoYW5nZXMgYHZlcmAgYW5kIGJyZWFrcyB0aGUgbWVtbyBzbyBhbgogICAgICAgICAqICBlbnYtZGVwZW5kZW50IGNvbnN0cnVjdG9yIGNhbiBzZWxmLWhlYWwuICovCiAgICAgICAgX19wdWJsaWNGaWVsZCh0aGlzLCAiX19mYWlsZWRMb2dpYyIsIG51bGwpOwogICAgICAgIF9fcHVibGljRmllbGQodGhpcywgIl9fZmFpbGVkVXNlclByb3BzIiwgbnVsbCk7CiAgICAgICAgX19wdWJsaWNGaWVsZCh0aGlzLCAiX19mYWlsZWRWZXIiLCAtMSk7CiAgICAgICAgLyoqIFBlci1pbnN0YW5jZSBjb25zdHJ1Y3RvciBlcnJvciDigJQga2VwdCBoZXJlIChub3Qgb24gdGhlIHJlZ2lzdHJ5IGVudHJ5KQogICAgICAgICAqICBzbyBvbmUgaW5zdGFuY2UncyBzdWNjZXNzZnVsIGNvbnN0cnVjdCBjYW4ndCBoaWRlIGEgc2libGluZydzIGZhaWx1cmUsCiAgICAgICAgICogIGFuZCBhIGNvbnN0cnVjdCBjYW4gbmV2ZXIgd2lwZSBhbiBldmFsIGVycm9yIGB1cGRhdGVKc2AgcmVjb3JkZWQgb24KICAgICAgICAgKiAgYHIubG9naWNFcnJvcmAuICovCiAgICAgICAgX19wdWJsaWNGaWVsZCh0aGlzLCAiX19jdG9yRXJyb3IiLCBudWxsKTsKICAgICAgICBfX3B1YmxpY0ZpZWxkKHRoaXMsICJsb2dpYyIpOwogICAgICAgIHRoaXMuX19uYW1lID0gcHJvcHMuX19uYW1lOwogICAgICAgIHRoaXMuc3RhdGUgPSB7IF9fdjogMCwgX19lcnI6IG51bGwgfTsKICAgICAgICB0aGlzLl9fc3ViID0gKCkgPT4gewogICAgICAgICAgaWYgKHRoaXMuc3RhdGUuX19lcnIpIHRoaXMuc2V0U3RhdGUoeyBfX2VycjogbnVsbCB9KTsKICAgICAgICAgIHRoaXMuZm9yY2VVcGRhdGUoKTsKICAgICAgICB9OwogICAgICAgIHRoaXMuX19tYWtlTG9naWMocmVnaXN0cnkuZ2V0KHRoaXMuX19uYW1lKS5Mb2dpYywgbnVsbCk7CiAgICAgICAgZW5zdXJlRmV0Y2hlZCh0aGlzLl9fbmFtZSk7CiAgICAgIH0KICAgICAgLyoqIEVycm9yLWJvdW5kYXJ5IGhvb2s6IGEgcmVuZGVyIGNyYXNoIGFueXdoZXJlIGluIHRoaXMgREMncyBzdWJ0cmVlCiAgICAgICAqICAoaXRzIG93biB0ZW1wbGF0ZSwgYW4geC1pbXBvcnQnZCBjb21wb25lbnQsIGEgY2hpbGQgREMgd2l0aG91dCBpdHMKICAgICAgICogIG93biBkZWVwZXIgYm91bmRhcnkpIGxhbmRzIGhlcmUgaW5zdGVhZCBvZiB1bm1vdW50aW5nIHRoZSBwYWdlLiAqLwogICAgICBzdGF0aWMgZ2V0RGVyaXZlZFN0YXRlRnJvbUVycm9yKGUpIHsKICAgICAgICByZXR1cm4geyBfX2VycjogZSBpbnN0YW5jZW9mIEVycm9yICYmIGUubWVzc2FnZSA\/IGUubWVzc2FnZSA6IFN0cmluZyhlKSB9OwogICAgICB9CiAgICAgIGNvbXBvbmVudERpZENhdGNoKGUsIGluZm8pIHsKICAgICAgICBjb25zb2xlLmVycm9yKAogICAgICAgICAgIltkYy1ydW50aW1lXSByZW5kZXIgZXJyb3IgaW4gPCIgKyB0aGlzLl9fbmFtZSArICI+OiIsCiAgICAgICAgICBlLAogICAgICAgICAgaW5mbz8uY29tcG9uZW50U3RhY2sgfHwgIiIKICAgICAgICApOwogICAgICB9CiAgICAgIC8qKiBJbnN0YW50aWF0ZSB0aGUgbG9naWMgY2xhc3MgKG9yIHRoZSBuby1vcCBiYXNlKSBhbmQgYWRvcHQgYHByZXZTdGF0ZWAKICAgICAgICogIG92ZXIgaXRzIGluaXRpYWwgc3RhdGUg4oCUIHVzZWQgYm90aCBhdCBtb3VudCBhbmQgb24gaG90LXN3YXAuICovCiAgICAgIF9fbWFrZUxvZ2ljKExvZ2ljLCBwcmV2U3RhdGUpIHsKICAgICAgICBjb25zdCBMID0gTG9naWMgfHwgU3RyZWFtYWJsZUxvZ2ljOwogICAgICAgIHRyeSB7CiAgICAgICAgICB0aGlzLmxvZ2ljID0gbmV3IEwodGhpcy5fX3VzZXJQcm9wcygpKTsKICAgICAgICAgIHRoaXMuX19mYWlsZWRMb2dpYyA9IG51bGw7CiAgICAgICAgICB0aGlzLl9fZmFpbGVkVXNlclByb3BzID0gbnVsbDsKICAgICAgICAgIHRoaXMuX19jdG9yRXJyb3IgPSBudWxsOwogICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZSk7CiAgICAgICAgICB0aGlzLl9fZmFpbGVkTG9naWMgPSBMb2dpYzsKICAgICAgICAgIHRoaXMuX19mYWlsZWRVc2VyUHJvcHMgPSB0aGlzLl9fdXNlclByb3BzKCk7CiAgICAgICAgICB0aGlzLl9fZmFpbGVkVmVyID0gcmVnaXN0cnkuZ2V0KHRoaXMuX19uYW1lKS52ZXI7CiAgICAgICAgICB0aGlzLl9fY3RvckVycm9yID0gdGhpcy5fX25hbWUgKyAiOiAiICsgKGUgaW5zdGFuY2VvZiBFcnJvciAmJiBlLm1lc3NhZ2UgPyBlLm1lc3NhZ2UgOiBTdHJpbmcoZSkpOwogICAgICAgICAgdGhpcy5sb2dpYyA9IG5ldyBTdHJlYW1hYmxlTG9naWMoCiAgICAgICAgICAgIHRoaXMuX191c2VyUHJvcHMoKQogICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgdGhpcy5sb2dpYy5fX2hvc3QgPSB0aGlzOwogICAgICAgIGlmIChwcmV2U3RhdGUpCiAgICAgICAgICB0aGlzLmxvZ2ljLnN0YXRlID0geyAuLi50aGlzLmxvZ2ljLnN0YXRlIHx8IHt9LCAuLi5wcmV2U3RhdGUgfTsKICAgICAgfQogICAgICAvKiogVGhlIHByb3BzIHRoZSBhdXRob3IncyBsb2dpYyArIHRlbXBsYXRlIHNlZSDigJQgaW50ZXJuYWwgX18tcHJlZml4ZWQKICAgICAgICogIHdpcmluZyBzdHJpcHBlZC4gKi8KICAgICAgX191c2VyUHJvcHMoKSB7CiAgICAgICAgY29uc3QgeyBfX25hbWUsIF9faGludFNpemUsIF9fdHBsSWQsIF9faG9zdFN0eWxlLCAuLi5yZXN0IH0gPSB0aGlzLnByb3BzOwogICAgICAgIHJldHVybiByZXN0OwogICAgICB9CiAgICAgIF9fc2V0TG9naWNTdGF0ZSh1cGRhdGUsIGNiKSB7CiAgICAgICAgY29uc3QgcHJldiA9IHRoaXMubG9naWMuc3RhdGU7CiAgICAgICAgY29uc3QgcGF0Y2ggPSB0eXBlb2YgdXBkYXRlID09PSAiZnVuY3Rpb24iID8gdXBkYXRlKHByZXYpIDogdXBkYXRlOwogICAgICAgIHRoaXMubG9naWMuc3RhdGUgPSB7IC4uLnByZXYsIC4uLnBhdGNoIH07CiAgICAgICAgdGhpcy5zZXRTdGF0ZSgocykgPT4gKHsgX192OiBzLl9fdiArIDEgfSksIGNiKTsKICAgICAgfQogICAgICAvKiogU3dhcCB0aGUgbG9naWMgaW5zdGFuY2Ugd2hlbiB0aGUgcmVnaXN0cnkncyBMb2dpYyBjbGFzcyBjaGFuZ2VkCiAgICAgICAqICAoc3RyZWFtaW5nIGNvbXBsZXRpb24sIGhvdCByZWxvYWQpLiBTdGF0ZSBjYXJyaWVzIG92ZXI7IGRpZE1vdW50CiAgICAgICAqICByZS1maXJlcyBhZnRlciB0aGUgc3dhcCBjb21taXRzIHNvIHJlZnMgZXhpc3QuICovCiAgICAgIF9fcmVjb25jaWxlTG9naWMoKSB7CiAgICAgICAgY29uc3QgciA9IHJlZ2lzdHJ5LmdldCh0aGlzLl9fbmFtZSk7CiAgICAgICAgY29uc3QgTmV4dCA9IHIuTG9naWM7CiAgICAgICAgY29uc3QgQ3VyID0gdGhpcy5sb2dpYy5jb25zdHJ1Y3RvcjsKICAgICAgICBpZiAoTmV4dCA9PT0gQ3VyIHx8ICFOZXh0ICYmIEN1ciA9PT0gU3RyZWFtYWJsZUxvZ2ljIHx8IE5leHQgPT09IHRoaXMuX19mYWlsZWRMb2dpYyAmJiByLnZlciA9PT0gdGhpcy5fX2ZhaWxlZFZlciAmJiBzaGFsbG93RXF1YWwodGhpcy5fX3VzZXJQcm9wcygpLCB0aGlzLl9fZmFpbGVkVXNlclByb3BzKSkgewogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBpZiAoIXRoaXMuX19uZWVkc0RpZE1vdW50KSB7CiAgICAgICAgICB0cnkgewogICAgICAgICAgICB0aGlzLmxvZ2ljLmNvbXBvbmVudFdpbGxVbm1vdW50KCk7CiAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHRoaXMuX19tYWtlTG9naWMoTmV4dCwgdGhpcy5sb2dpYy5zdGF0ZSk7CiAgICAgICAgdGhpcy5fX25lZWRzRGlkTW91bnQgPSB0cnVlOwogICAgICB9CiAgICAgIGNvbXBvbmVudERpZE1vdW50KCkgewogICAgICAgIHJlZ2lzdHJ5LmdldCh0aGlzLl9fbmFtZSkuc3Vicy5hZGQodGhpcy5fX3N1Yik7CiAgICAgICAgdHJ5IHsKICAgICAgICAgIHRoaXMubG9naWMuY29tcG9uZW50RGlkTW91bnQoKTsKICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICBjb25zb2xlLmVycm9yKGUpOwogICAgICAgIH0KICAgICAgfQogICAgICBjb21wb25lbnREaWRVcGRhdGUocHJldlByb3BzKSB7CiAgICAgICAgdGhpcy5sb2dpYy5wcm9wcyA9IHRoaXMuX191c2VyUHJvcHMoKTsKICAgICAgICBpZiAodGhpcy5fX25lZWRzRGlkTW91bnQpIHsKICAgICAgICAgIGlmICh0aGlzLnN0YXRlLl9fZXJyIHx8ICFyZWdpc3RyeS5nZXQodGhpcy5fX25hbWUpLnRwbCkgcmV0dXJuOwogICAgICAgICAgdGhpcy5fX25lZWRzRGlkTW91bnQgPSBmYWxzZTsKICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgIHRoaXMubG9naWMuY29tcG9uZW50RGlkTW91bnQoKTsKICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgY29uc29sZS5lcnJvcihlKTsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgdGhpcy5sb2dpYy5jb21wb25lbnREaWRVcGRhdGUocHJldlByb3BzKTsKICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgY29uc29sZS5lcnJvcihlKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgY29tcG9uZW50V2lsbFVubW91bnQoKSB7CiAgICAgICAgcmVnaXN0cnkuZ2V0KHRoaXMuX19uYW1lKS5zdWJzLmRlbGV0ZSh0aGlzLl9fc3ViKTsKICAgICAgICBpZiAoIXRoaXMuX19uZWVkc0RpZE1vdW50KSB7CiAgICAgICAgICB0cnkgewogICAgICAgICAgICB0aGlzLmxvZ2ljLmNvbXBvbmVudFdpbGxVbm1vdW50KCk7CiAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIHJlbmRlcigpIHsKICAgICAgICBjb25zdCByID0gcmVnaXN0cnkuZ2V0KHRoaXMuX19uYW1lKTsKICAgICAgICBjb25zdCBjbHMgPSAic2MtaG9zdCIgKyAoci5odG1sU3RyZWFtaW5nID8gIiBzYy1zdHJlYW1pbmctaHRtbCIgOiAiIikgKyAoci5qc1N0cmVhbWluZyA\/ICIgc2Mtc3RyZWFtaW5nLWpzIiA6ICIiKTsKICAgICAgICBjb25zdCBoaW50U3R5bGUgPSByLmh0bWxTdHJlYW1pbmcgPyBoaW50VG9NaW4odGhpcy5wcm9wcy5fX2hpbnRTaXplKSA6IHZvaWQgMDsKICAgICAgICBjb25zdCBob3N0U3R5bGUgPSB0aGlzLnByb3BzLl9faG9zdFN0eWxlIHx8IGhpbnRTdHlsZSA\/IHsgLi4uaGludFN0eWxlIHx8IHt9LCAuLi50aGlzLnByb3BzLl9faG9zdFN0eWxlIHx8IHt9IH0gOiB2b2lkIDA7CiAgICAgICAgY29uc3QgaG9zdEJhc2UgPSB7CiAgICAgICAgICBjbGFzc05hbWU6IGNscywKICAgICAgICAgIHN0eWxlOiBob3N0U3R5bGUsCiAgICAgICAgICAiZGF0YS1zYy1uYW1lIjogdGhpcy5fX25hbWUsCiAgICAgICAgICAiZGF0YS1kYy10cGwiOiB0aGlzLnByb3BzLl9fdHBsSWQKICAgICAgICB9OwogICAgICAgIGNvbnN0IGNoYWluID0gQXJyYXkuaXNBcnJheSh0aGlzLmNvbnRleHQpID8gdGhpcy5jb250ZXh0IDogW107CiAgICAgICAgaWYgKGNoYWluLmluY2x1ZGVzKHRoaXMuX19uYW1lKSkgewogICAgICAgICAgY29uc3QgY3ljbGUgPSBbCiAgICAgICAgICAgIC4uLmNoYWluLnNsaWNlKGNoYWluLmluZGV4T2YodGhpcy5fX25hbWUpKSwKICAgICAgICAgICAgdGhpcy5fX25hbWUKICAgICAgICAgIF0uam9pbigiIFx1MjE5MiAiKTsKICAgICAgICAgIHJldHVybiBoKAogICAgICAgICAgICAiZGl2IiwKICAgICAgICAgICAgeyAuLi5ob3N0QmFzZSwgY2xhc3NOYW1lOiBjbHMgKyAiIHNjLWhhcy1lcnJvciIgfSwKICAgICAgICAgICAgaChQbGFjZWhvbGRlciwgewogICAgICAgICAgICAgIG5hbWU6IHRoaXMuX19uYW1lLAogICAgICAgICAgICAgIGhpbnRTaXplOiB0aGlzLnByb3BzLl9faGludFNpemUsCiAgICAgICAgICAgICAgZXJyb3I6ICJjaXJjdWxhciBpbXBvcnQ6ICIgKyBjeWNsZQogICAgICAgICAgICB9KQogICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgaWYgKHRoaXMuc3RhdGUuX19lcnIpIHsKICAgICAgICAgIHJldHVybiBoKAogICAgICAgICAgICAiZGl2IiwKICAgICAgICAgICAgeyAuLi5ob3N0QmFzZSwgY2xhc3NOYW1lOiBjbHMgKyAiIHNjLWhhcy1lcnJvciIgfSwKICAgICAgICAgICAgaCgKICAgICAgICAgICAgICAiZGl2IiwKICAgICAgICAgICAgICB7IGNsYXNzTmFtZTogInNjLWxvZ2ljLWVycm9yIiwgImRhdGEtb21lbGV0dGUtY2hyb21lIjogIiIgfSwKICAgICAgICAgICAgICB0aGlzLl9fbmFtZSArICI6ICIgKyB0aGlzLnN0YXRlLl9fZXJyCiAgICAgICAgICAgICksCiAgICAgICAgICAgIGgoUGxhY2Vob2xkZXIsIHsKICAgICAgICAgICAgICBuYW1lOiB0aGlzLl9fbmFtZSwKICAgICAgICAgICAgICBoaW50U2l6ZTogdGhpcy5wcm9wcy5fX2hpbnRTaXplLAogICAgICAgICAgICAgIGVycm9yOiB0aGlzLnN0YXRlLl9fZXJyCiAgICAgICAgICAgIH0pCiAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICB0aGlzLl9fcmVjb25jaWxlTG9naWMoKTsKICAgICAgICBpZiAoIXIudHBsKSB7CiAgICAgICAgICByZXR1cm4gaCgKICAgICAgICAgICAgImRpdiIsCiAgICAgICAgICAgIGhvc3RCYXNlLAogICAgICAgICAgICBoKFBsYWNlaG9sZGVyLCB7IG5hbWU6IHRoaXMuX19uYW1lLCBoaW50U2l6ZTogdGhpcy5wcm9wcy5fX2hpbnRTaXplIH0pCiAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICBjb25zdCB1c2VyUHJvcHMgPSB0aGlzLl9fdXNlclByb3BzKCk7CiAgICAgICAgdGhpcy5sb2dpYy5wcm9wcyA9IHVzZXJQcm9wczsKICAgICAgICBsZXQgdmFscyA9IHVzZXJQcm9wczsKICAgICAgICBsZXQgcmVuZGVyRXJyID0gci5sb2dpY0Vycm9yIHx8IHRoaXMuX19jdG9yRXJyb3I7CiAgICAgICAgdHJ5IHsKICAgICAgICAgIHZhbHMgPSB7IC4uLnVzZXJQcm9wcywgLi4udGhpcy5sb2dpYy5yZW5kZXJWYWxzKCkgfHwge30gfTsKICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICBjb25zb2xlLmVycm9yKGUpOwogICAgICAgICAgcmVuZGVyRXJyID0gdGhpcy5fX25hbWUgKyAiLnJlbmRlclZhbHMoKTogIiArIChlIGluc3RhbmNlb2YgRXJyb3IgJiYgZS5tZXNzYWdlID8gZS5tZXNzYWdlIDogU3RyaW5nKGUpKTsKICAgICAgICB9CiAgICAgICAgdGhpcy5fX3N0cmVhbWluZ05vdyA9ICEhKHIuaHRtbFN0cmVhbWluZyB8fCByLmpzU3RyZWFtaW5nKTsKICAgICAgICB0aGlzLl9faHRtbFN0cmVhbWluZ05vdyA9ICEhci5odG1sU3RyZWFtaW5nOwogICAgICAgIHJldHVybiBoKAogICAgICAgICAgImRpdiIsCiAgICAgICAgICB7IC4uLmhvc3RCYXNlLCBjbGFzc05hbWU6IGNscyArIChyZW5kZXJFcnIgPyAiIHNjLWhhcy1lcnJvciIgOiAiIikgfSwKICAgICAgICAgIHJlbmRlckVyciAmJiBoKAogICAgICAgICAgICAiZGl2IiwKICAgICAgICAgICAgeyBjbGFzc05hbWU6ICJzYy1sb2dpYy1lcnJvciIsICJkYXRhLW9tZWxldHRlLWNocm9tZSI6ICIiIH0sCiAgICAgICAgICAgIHJlbmRlckVycgogICAgICAgICAgKSwKICAgICAgICAgIGgoCiAgICAgICAgICAgIEFuY2VzdG9yQ29udGV4dC5Qcm92aWRlciwKICAgICAgICAgICAgeyB2YWx1ZTogWy4uLmNoYWluLCB0aGlzLl9fbmFtZV0gfSwKICAgICAgICAgICAgci50cGwodmFscywgdGhpcykKICAgICAgICAgICkKICAgICAgICApOwogICAgICB9CiAgICB9CiAgICBfX3B1YmxpY0ZpZWxkKFN0cmVhbWFibGVDb21wb25lbnQsICJjb250ZXh0VHlwZSIsIEFuY2VzdG9yQ29udGV4dCk7CiAgICBjb25zdCBuYW1lZCA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCk7CiAgICBmdW5jdGlvbiBnZXREQyhuYW1lKSB7CiAgICAgIGNvbnN0IGhpdCA9IG5hbWVkLmdldChuYW1lKTsKICAgICAgaWYgKGhpdCkgcmV0dXJuIGhpdDsKICAgICAgZnVuY3Rpb24gRGlzcGF0Y2hlcihwKSB7CiAgICAgICAgY29uc3QgWywgc2V0VGlja10gPSBSZWFjdC51c2VTdGF0ZSgwKTsKICAgICAgICBSZWFjdC51c2VFZmZlY3QoKCkgPT4gewogICAgICAgICAgY29uc3Qgc3ViID0gKCkgPT4gc2V0VGljaygobikgPT4gbiArIDEpOwogICAgICAgICAgcmVnaXN0cnkuZ2V0KG5hbWUpLnN1YnMuYWRkKHN1Yik7CiAgICAgICAgICByZXR1cm4gKCkgPT4gewogICAgICAgICAgICByZWdpc3RyeS5nZXQobmFtZSkuc3Vicy5kZWxldGUoc3ViKTsKICAgICAgICAgIH07CiAgICAgICAgfSwgW10pOwogICAgICAgIGVuc3VyZUZldGNoZWQobmFtZSk7CiAgICAgICAgcmV0dXJuIGgoU3RyZWFtYWJsZUNvbXBvbmVudCwgeyAuLi5wLCBfX25hbWU6IG5hbWUgfSk7CiAgICAgIH0KICAgICAgRGlzcGF0Y2hlci5kaXNwbGF5TmFtZSA9IG5hbWU7CiAgICAgIG5hbWVkLnNldChuYW1lLCBEaXNwYXRjaGVyKTsKICAgICAgcmV0dXJuIERpc3BhdGNoZXI7CiAgICB9CiAgICByZXR1cm4gewogICAgICBnZXREQywKICAgICAgU3RyZWFtYWJsZUNvbXBvbmVudAogICAgfTsKICB9CgogIC8vIHNyYy9leHRlcm5hbC50cwogIHZhciBpc0N1c3RvbUVsZW1lbnROYW1lID0gKG4pID0+ICFuLmluY2x1ZGVzKCIuIikgJiYgbi5pbmNsdWRlcygiLSIpOwogIGZ1bmN0aW9uIGlzUmVuZGVyYWJsZVR5cGUoZykgewogICAgaWYgKHR5cGVvZiBnID09PSAiZnVuY3Rpb24iKSByZXR1cm4gIWlzRWxlbWVudENsYXNzKGcpOwogICAgcmV0dXJuIHR5cGVvZiBnID09PSAib2JqZWN0IiAmJiBnICE9PSBudWxsICYmIHR5cGVvZiBnLiQkdHlwZW9mID09PSAic3ltYm9sIjsKICB9CiAgZnVuY3Rpb24gcmVzb2x2ZURvdHRlZFBhdGgocm9vdCwgbmFtZSkgewogICAgbGV0IGN1ciA9IHJvb3Q7CiAgICBmb3IgKGNvbnN0IHNlZyBvZiBuYW1lLnNwbGl0KCIuIikpIHsKICAgICAgaWYgKGN1ciA9PSBudWxsKSByZXR1cm4gdm9pZCAwOwogICAgICBjdXIgPSBjdXJbc2VnXTsKICAgIH0KICAgIHJldHVybiBjdXI7CiAgfQogIHZhciBCQUJFTF9VUkwgPSAiaHR0cHM6Ly91bnBrZy5jb20vQGJhYmVsL3N0YW5kYWxvbmVANy4yNi40L2JhYmVsLm1pbi5qcyI7CiAgdmFyIEdMT0JBTF9QT0xMX0lOVEVSVkFMX01TID0gNTA7CiAgdmFyIEdMT0JBTF9QT0xMX1RJTUVPVVRfTVMgPSAzZTQ7CiAgZnVuY3Rpb24gY3JlYXRlRXh0ZXJuYWxNb2R1bGVzKG9uUmVzb2x2ZWQpIHsKICAgIGNvbnN0IGNhY2hlID0gLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKTsKICAgIGxldCBiYWJlbExvYWRpbmcgPSBudWxsOwogICAgY29uc3QgcmVwb3J0ZWRNaXNzaW5nID0gLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKTsKICAgIGNvbnN0IHBvbGxpbmcgPSAvKiBAX19QVVJFX18gKi8gbmV3IFNldCgpOwogICAgZnVuY3Rpb24gZW5zdXJlQmFiZWwoKSB7CiAgICAgIGlmICh3aW5kb3cuQmFiZWwpIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTsKICAgICAgaWYgKGJhYmVsTG9hZGluZykgcmV0dXJuIGJhYmVsTG9hZGluZzsKICAgICAgYmFiZWxMb2FkaW5nID0gbmV3IFByb21pc2UoKHJlcywgcmVqKSA9PiB7CiAgICAgICAgY29uc3QgcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpOwogICAgICAgIHMuc3JjID0gQkFCRUxfVVJMOwogICAgICAgIHMuY3Jvc3NPcmlnaW4gPSAiYW5vbnltb3VzIjsKICAgICAgICBzLm9ubG9hZCA9ICgpID0+IHJlcygpOwogICAgICAgIHMub25lcnJvciA9IHJlajsKICAgICAgICBkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKHMpOwogICAgICB9KTsKICAgICAgcmV0dXJuIGJhYmVsTG9hZGluZzsKICAgIH0KICAgIGNvbnN0IHBlbmRpbmcgPSAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpOwogICAgZnVuY3Rpb24gbG9hZChraW5kLCB1cmwsIGFmdGVyKSB7CiAgICAgIGNvbnN0IGV4aXN0aW5nID0gcGVuZGluZy5nZXQodXJsKTsKICAgICAgaWYgKGV4aXN0aW5nKSByZXR1cm4gZXhpc3Rpbmc7CiAgICAgIGNhY2hlLnNldCh1cmwsIG51bGwpOwogICAgICBjb25zb2xlLmluZm8oIltkYy1ydW50aW1lXSB4LWltcG9ydDogbG9hZGluZyIsIHVybCwgIigiICsga2luZCArICIpIik7CiAgICAgIGNvbnN0IHJlYWR5ID0gUHJvbWlzZS5hbGwoWwogICAgICAgIGtpbmQgPT09ICJqc3giID8gZW5zdXJlQmFiZWwoKSA6IFByb21pc2UucmVzb2x2ZSgpLAogICAgICAgIGFmdGVyID8\/IFByb21pc2UucmVzb2x2ZSgpCiAgICAgIF0pOwogICAgICBjb25zdCBwID0gcmVhZHkudGhlbigoKSA9PiBmZXRjaCh1cmwpKS50aGVuKChyKSA9PiB7CiAgICAgICAgaWYgKCFyLm9rKSB0aHJvdyBuZXcgRXJyb3IoIkhUVFAgIiArIHIuc3RhdHVzKTsKICAgICAgICByZXR1cm4gci50ZXh0KCk7CiAgICAgIH0pLnRoZW4oKHNyYykgPT4gewogICAgICAgIGNvbnN0IGNvZGUgPSBraW5kID09PSAianN4IiA\/IHdpbmRvdy5CYWJlbC50cmFuc2Zvcm0oc3JjLCB7CiAgICAgICAgICBmaWxlbmFtZTogdXJsLAogICAgICAgICAgcHJlc2V0czogWyJyZWFjdCIsICJ0eXBlc2NyaXB0Il0KICAgICAgICB9KS5jb2RlIDogc3JjOwogICAgICAgIGNvbnN0IG1vZHVsZSA9IHsgZXhwb3J0czoge30gfTsKICAgICAgICBjb25zdCBiZWZvcmUgPSBuZXcgU2V0KE9iamVjdC5rZXlzKHdpbmRvdykpOwogICAgICAgIC8vISBub3NlbWdyZXA6IGV2YWwtYW5kLWZ1bmN0aW9uLWNvbnN0cnVjdG9yCiAgICAgICAgbmV3IEZ1bmN0aW9uKCJSZWFjdCIsICJtb2R1bGUiLCAiZXhwb3J0cyIsICJyZXF1aXJlIiwgY29kZSkoCiAgICAgICAgICBnZXRSZWFjdCgpLAogICAgICAgICAgbW9kdWxlLAogICAgICAgICAgbW9kdWxlLmV4cG9ydHMsCiAgICAgICAgICAoKSA9PiAoe30pCiAgICAgICAgKTsKICAgICAgICBjb25zdCBnbG9iYWxzID0ge307CiAgICAgICAgZm9yIChjb25zdCBrIG9mIE9iamVjdC5rZXlzKHdpbmRvdykpIHsKICAgICAgICAgIGlmICghYmVmb3JlLmhhcyhrKSAmJiB0eXBlb2Ygd2luZG93W2tdID09PSAiZnVuY3Rpb24iKSB7CiAgICAgICAgICAgIGdsb2JhbHNba10gPSB3aW5kb3dba107CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGNhY2hlLnNldCh1cmwsIHsgbW9kOiBtb2R1bGUuZXhwb3J0cywgZ2xvYmFscyB9KTsKICAgICAgICBjb25zb2xlLmluZm8oCiAgICAgICAgICAiW2RjLXJ1bnRpbWVdIHgtaW1wb3J0OiBsb2FkZWQiLAogICAgICAgICAgdXJsLAogICAgICAgICAgIlx1MjAxNCBleHBvcnRzOiIsCiAgICAgICAgICBPYmplY3Qua2V5cyhtb2R1bGUuZXhwb3J0cyksCiAgICAgICAgICAid2luZG93IGdsb2JhbHM6IiwKICAgICAgICAgIE9iamVjdC5rZXlzKGdsb2JhbHMpCiAgICAgICAgKTsKICAgICAgICBvblJlc29sdmVkKCk7CiAgICAgIH0pLmNhdGNoKChlKSA9PiB7CiAgICAgICAgY2FjaGUuc2V0KHVybCwgewogICAgICAgICAgbW9kOiB7fSwKICAgICAgICAgIGdsb2JhbHM6IHt9LAogICAgICAgICAgZXJyb3I6ICJmYWlsZWQgdG8gbG9hZDogIiArIChlIGluc3RhbmNlb2YgRXJyb3IgJiYgZS5tZXNzYWdlID8gZS5tZXNzYWdlIDogU3RyaW5nKGUpKQogICAgICAgIH0pOwogICAgICAgIGNvbnNvbGUuZXJyb3IoCiAgICAgICAgICAiW2RjLXJ1bnRpbWVdIHgtaW1wb3J0OiBGQUlMRUQgdG8gbG9hZCIsCiAgICAgICAgICB1cmwsCiAgICAgICAgICAiKCIgKyBraW5kICsgIikiLAogICAgICAgICAgZQogICAgICAgICk7CiAgICAgICAgb25SZXNvbHZlZCgpOwogICAgICB9KTsKICAgICAgcGVuZGluZy5zZXQodXJsLCBwKTsKICAgICAgcmV0dXJuIHA7CiAgICB9CiAgICBmdW5jdGlvbiByZXNvbHZlMih1cmwsIG5hbWUpIHsKICAgICAgY29uc3QgZW50cnkgPSBjYWNoZS5nZXQodXJsKTsKICAgICAgaWYgKCFlbnRyeSkgcmV0dXJuIG51bGw7CiAgICAgIGNvbnN0IHsgbW9kLCBnbG9iYWxzIH0gPSBlbnRyeTsKICAgICAgY29uc3QgQyA9IG1vZCAmJiBtb2RbbmFtZV0gfHwgZ2xvYmFscyAmJiBnbG9iYWxzW25hbWVdIHx8IHR5cGVvZiB3aW5kb3cgIT09ICJ1bmRlZmluZWQiICYmIHdpbmRvd1tuYW1lXSB8fCBtb2QgJiYgbW9kLmRlZmF1bHQ7CiAgICAgIGlmICh0eXBlb2YgQyA9PT0gImZ1bmN0aW9uIikgcmV0dXJuIEM7CiAgICAgIGNvbnN0IGtleSA9IHVybCArICJcMCIgKyBuYW1lOwogICAgICBpZiAoIXJlcG9ydGVkTWlzc2luZy5oYXMoa2V5KSkgewogICAgICAgIHJlcG9ydGVkTWlzc2luZy5zZXQoCiAgICAgICAgICBrZXksCiAgICAgICAgICBlbnRyeS5lcnJvciB8fCAnbm8gZXhwb3J0IG5hbWVkICInICsgbmFtZSArICciIChoYXM6ICcgKyBPYmplY3Qua2V5cyhtb2QpLmpvaW4oIiwgIikgKyAiKSIKICAgICAgICApOwogICAgICAgIGNvbnNvbGUuZXJyb3IoCiAgICAgICAgICAiW2RjLXJ1bnRpbWVdIHgtaW1wb3J0OiBtb2R1bGUiLAogICAgICAgICAgdXJsLAogICAgICAgICAgImxvYWRlZCBidXQgaGFzIG5vIGNvbXBvbmVudCBuYW1lZCIsCiAgICAgICAgICBKU09OLnN0cmluZ2lmeShuYW1lKSwKICAgICAgICAgICJcdTIwMTQgYXZhaWxhYmxlIGV4cG9ydHM6IiwKICAgICAgICAgIE9iamVjdC5rZXlzKG1vZCksCiAgICAgICAgICAid2luZG93IGdsb2JhbHM6IiwKICAgICAgICAgIE9iamVjdC5rZXlzKGdsb2JhbHMpLAogICAgICAgICAgIi4gVGhlIG1vZHVsZSBtdXN0IGBtb2R1bGUuZXhwb3J0cyA9IHsiICsgbmFtZSArICJ9YCBvciBzZXQgYHdpbmRvdy4iICsgbmFtZSArICJgLiIKICAgICAgICApOwogICAgICB9CiAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgZnVuY3Rpb24gd2FpdEZvckdsb2JhbChuYW1lKSB7CiAgICAgIGlmIChwb2xsaW5nLmhhcyhuYW1lKSkgcmV0dXJuOwogICAgICBwb2xsaW5nLmFkZChuYW1lKTsKICAgICAgY29uc3Qgc3RhcnRlZCA9IERhdGUubm93KCk7CiAgICAgIGNvbnN0IGlzQ0UgPSBpc0N1c3RvbUVsZW1lbnROYW1lKG5hbWUpOwogICAgICBjb25zdCB0aWNrID0gKCkgPT4gewogICAgICAgIGNvbnN0IGZvdW5kID0gaXNDRSA\/IGN1c3RvbUVsZW1lbnRzLmdldChuYW1lKSA6IGlzUmVuZGVyYWJsZVR5cGUocmVzb2x2ZURvdHRlZFBhdGgod2luZG93LCBuYW1lKSk7CiAgICAgICAgaWYgKGZvdW5kKSB7CiAgICAgICAgICBwb2xsaW5nLmRlbGV0ZShuYW1lKTsKICAgICAgICAgIG9uUmVzb2x2ZWQoKTsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgaWYgKERhdGUubm93KCkgLSBzdGFydGVkID49IEdMT0JBTF9QT0xMX1RJTUVPVVRfTVMpIHsKICAgICAgICAgIGNvbnNvbGUud2FybigKICAgICAgICAgICAgIltkYy1ydW50aW1lXSB4LWltcG9ydDogZ2xvYmFsIiwKICAgICAgICAgICAgSlNPTi5zdHJpbmdpZnkobmFtZSksCiAgICAgICAgICAgICJuZXZlciBhcHBlYXJlZCBvbiB3aW5kb3cgYWZ0ZXIgIiArIEdMT0JBTF9QT0xMX1RJTUVPVVRfTVMgKyAibXMiCiAgICAgICAgICApOwogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBzZXRUaW1lb3V0KHRpY2ssIEdMT0JBTF9QT0xMX0lOVEVSVkFMX01TKTsKICAgICAgfTsKICAgICAgc2V0VGltZW91dCh0aWNrLCBHTE9CQUxfUE9MTF9JTlRFUlZBTF9NUyk7CiAgICB9CiAgICBmdW5jdGlvbiByZXNvbHZlR2xvYmFsKHVybCwgbmFtZSkgewogICAgICBjb25zdCBpc0NFID0gaXNDdXN0b21FbGVtZW50TmFtZShuYW1lKTsKICAgICAgaWYgKCF1cmwpIHsKICAgICAgICBpZiAoaXNDRSkgewogICAgICAgICAgaWYgKGN1c3RvbUVsZW1lbnRzLmdldChuYW1lKSkgcmV0dXJuIG5hbWU7CiAgICAgICAgICB3YWl0Rm9yR2xvYmFsKG5hbWUpOwogICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQogICAgICAgIGNvbnN0IGcyID0gcmVzb2x2ZURvdHRlZFBhdGgod2luZG93LCBuYW1lKTsKICAgICAgICBpZiAoaXNSZW5kZXJhYmxlVHlwZShnMikpIHJldHVybiBnMjsKICAgICAgICB3YWl0Rm9yR2xvYmFsKG5hbWUpOwogICAgICAgIHJldHVybiBudWxsOwogICAgICB9CiAgICAgIGNvbnN0IGVudHJ5ID0gY2FjaGUuZ2V0KHVybCk7CiAgICAgIGlmICghZW50cnkpIHJldHVybiBudWxsOwogICAgICBpZiAoaXNDRSAmJiBjdXN0b21FbGVtZW50cy5nZXQobmFtZSkpIHJldHVybiBuYW1lOwogICAgICBjb25zdCBnID0gZW50cnkuZ2xvYmFsc1tuYW1lXSA\/PyByZXNvbHZlRG90dGVkUGF0aCh3aW5kb3csIG5hbWUpOwogICAgICBpZiAoaXNSZW5kZXJhYmxlVHlwZShnKSkgcmV0dXJuIGc7CiAgICAgIGlmIChuYW1lLmluY2x1ZGVzKCIuIikpIHJldHVybiBudWxsOwogICAgICBjb25zdCBrZXkgPSB1cmwgKyAiXDBnbG9iYWxcMCIgKyBuYW1lOwogICAgICBpZiAoIXJlcG9ydGVkTWlzc2luZy5oYXMoa2V5KSkgewogICAgICAgIHJlcG9ydGVkTWlzc2luZy5zZXQoa2V5LCBudWxsKTsKICAgICAgICBpZiAoaXNDRSAmJiAhY3VzdG9tRWxlbWVudHMuZ2V0KG5hbWUpKSB7CiAgICAgICAgICBjb25zb2xlLndhcm4oCiAgICAgICAgICAgICJbZGMtcnVudGltZV0geC1pbXBvcnQ6IiwKICAgICAgICAgICAgdXJsLAogICAgICAgICAgICAibG9hZGVkIGJ1dCBubyBjdXN0b20gZWxlbWVudCIsCiAgICAgICAgICAgIEpTT04uc3RyaW5naWZ5KG5hbWUpLAogICAgICAgICAgICAiaXMgcmVnaXN0ZXJlZCBhbmQgd2luZG93LiIgKyBuYW1lICsgIiBpcyBub3QgYSBmdW5jdGlvbiBcdTIwMTQgcmVuZGVyaW5nIDwiICsgbmFtZSArICI+IGFzIGFuIHVua25vd24gZWxlbWVudC4iCiAgICAgICAgICApOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gbmFtZTsKICAgIH0KICAgIGZ1bmN0aW9uIGdldEVycm9yKHVybCwgbmFtZSkgewogICAgICBjb25zdCBlbnRyeSA9IGNhY2hlLmdldCh1cmwpOwogICAgICBpZiAoZW50cnk\/LmVycm9yKSByZXR1cm4gZW50cnkuZXJyb3I7CiAgICAgIHJldHVybiByZXBvcnRlZE1pc3NpbmcuZ2V0KHVybCArICJcMCIgKyBuYW1lKSB8fCBudWxsOwogICAgfQogICAgcmV0dXJuIHsgbG9hZCwgcmVzb2x2ZTogcmVzb2x2ZTIsIHJlc29sdmVHbG9iYWwsIGdldEVycm9yIH07CiAgfQogIGZ1bmN0aW9uIGlzRWxlbWVudENsYXNzKGcpIHsKICAgIHRyeSB7CiAgICAgIHJldHVybiB0eXBlb2YgZyA9PT0gImZ1bmN0aW9uIiAmJiB0eXBlb2YgSFRNTEVsZW1lbnQgIT09ICJ1bmRlZmluZWQiICYmIGcucHJvdG90eXBlIGluc3RhbmNlb2YgSFRNTEVsZW1lbnQ7CiAgICB9IGNhdGNoIHsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogIH0KCiAgLy8gc3JjL2F0b21pY3MudHMKICB2YXIgQVRPTUlDX0NTUyA9ICgKICAgIC8vIGxheW91dAogICAgIi5meHtkaXNwbGF5OmZsZXh9LmNvbHtkaXNwbGF5OmZsZXg7ZmxleC1kaXJlY3Rpb246Y29sdW1ufS5ncmlke2Rpc3BsYXk6Z3JpZH0uYWN7YWxpZ24taXRlbXM6Y2VudGVyfS5qY3tqdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyfS5qYntqdXN0aWZ5LWNvbnRlbnQ6c3BhY2UtYmV0d2Vlbn0uZjF7ZmxleDoxfS5ub3Nocmlua3tmbGV4LXNocmluazowfS53cmFwe2ZsZXgtd3JhcDp3cmFwfS5mdzV7Zm9udC13ZWlnaHQ6NTAwfS5mdzZ7Zm9udC13ZWlnaHQ6NjAwfS5mdzd7Zm9udC13ZWlnaHQ6NzAwfS5mdzh7Zm9udC13ZWlnaHQ6ODAwfS5mczExe2ZvbnQtc2l6ZToxMXB4fS5mczEye2ZvbnQtc2l6ZToxMnB4fS5mczEze2ZvbnQtc2l6ZToxM3B4fS5mczE0e2ZvbnQtc2l6ZToxNHB4fS5mczE1e2ZvbnQtc2l6ZToxNXB4fS5mczE2e2ZvbnQtc2l6ZToxNnB4fS5mczIwe2ZvbnQtc2l6ZToyMHB4fS5mczIye2ZvbnQtc2l6ZToyMnB4fS51cHBlcnt0ZXh0LXRyYW5zZm9ybTp1cHBlcmNhc2V9LnRje3RleHQtYWxpZ246Y2VudGVyfS5ub3dyYXB7d2hpdGUtc3BhY2U6bm93cmFwfS5nYXA4e2dhcDo4cHh9LmdhcDEwe2dhcDoxMHB4fS5nYXAxMntnYXA6MTJweH0uZ2FwMTZ7Z2FwOjE2cHh9LmdhcDI0e2dhcDoyNHB4fS5tMHttYXJnaW46MH0ubXQ4e21hcmdpbi10b3A6OHB4fS5tdDEye21hcmdpbi10b3A6MTJweH0ubXQxNnttYXJnaW4tdG9wOjE2cHh9Lm1iOHttYXJnaW4tYm90dG9tOjhweH0ubWIxMnttYXJnaW4tYm90dG9tOjEycHh9Lm1iMTZ7bWFyZ2luLWJvdHRvbToxNnB4fS5wb3NyZWx7cG9zaXRpb246cmVsYXRpdmV9LnBvc2Fic3twb3NpdGlvbjphYnNvbHV0ZX0ucm91bmR7Ym9yZGVyLXJhZGl1czo1MCV9Lm9oaWRle292ZXJmbG93OmhpZGRlbn0uYmJveHtib3gtc2l6aW5nOmJvcmRlci1ib3h9LnBvaW50ZXJ7Y3Vyc29yOnBvaW50ZXJ9LncxMDB7d2lkdGg6MTAwJX0uYjB7Ym9yZGVyOm5vbmV9IgogICk7CgogIC8vIHNyYy9oZWxtZXQudHMKICB2YXIgREVTSUdOX0RPQ19NT0RFX1JFID0gLzxtZXRhXGJbXj5dKlxibmFtZVxzKj1ccypbIiddZGVzaWduX2RvY19tb2RlWyInXVtePl0qXGIoPzpjb250ZW50fHZhbHVlKVxzKj1ccypbIiddKFx3KylbIiddL2k7CiAgdmFyIENBTlZBU19CRyA9ICIjZjBlZWU5IjsKICBmdW5jdGlvbiBjcmVhdGVIZWxtZXRNYW5hZ2VyKGRvYywgaXNTdHJlYW1pbmcpIHsKICAgIGNvbnN0IG1vdW50ZWQgPSAvKiBAX19QVVJFX18gKi8gbmV3IFNldCgpOwogICAgY29uc3QgbGl2ZSA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCk7CiAgICBsZXQgZGVzaWduRG9jTW9kZSA9IG51bGw7CiAgICBsZXQgY2FudmFzU3R5bGVFbCA9IG51bGw7CiAgICBmdW5jdGlvbiBwb3N0RGVzaWduTW9kZShtb2RlKSB7CiAgICAgIGlmICh3aW5kb3cucGFyZW50ID09PSB3aW5kb3cpIHJldHVybjsKICAgICAgdHJ5IHsKICAgICAgICB3aW5kb3cucGFyZW50LnBvc3RNZXNzYWdlKHsgdHlwZTogIl9fZGNfZGVzaWduX21vZGUiLCBtb2RlIH0sICIqIik7CiAgICAgIH0gY2F0Y2ggewogICAgICB9CiAgICB9CiAgICBmdW5jdGlvbiBzZXREZXNpZ25Eb2NNb2RlKG1vZGUpIHsKICAgICAgaWYgKG1vZGUgPT09IGRlc2lnbkRvY01vZGUpIHJldHVybjsKICAgICAgZGVzaWduRG9jTW9kZSA9IG1vZGU7CiAgICAgIHBvc3REZXNpZ25Nb2RlKG1vZGUpOwogICAgICBpZiAobW9kZSA9PT0gImNhbnZhcyIpIHsKICAgICAgICBkb2MuZG9jdW1lbnRFbGVtZW50LnNldEF0dHJpYnV0ZSgiZGF0YS1kYy1jYW52YXMiLCAiIik7CiAgICAgICAgY2FudmFzU3R5bGVFbCA9IGRvYy5jcmVhdGVFbGVtZW50KCJzdHlsZSIpOwogICAgICAgIGNhbnZhc1N0eWxlRWwuc2V0QXR0cmlidXRlKCJkYXRhLWRjLWNhbnZhcyIsICIiKTsKICAgICAgICBjYW52YXNTdHlsZUVsLnRleHRDb250ZW50ID0gYGh0bWwsYm9keXtiYWNrZ3JvdW5kOiR7Q0FOVkFTX0JHfX0jZGMtcm9vdD4uc2MtaG9zdHtwb3NpdGlvbjpyZWxhdGl2ZX1gOwogICAgICAgIGRvYy5oZWFkLmFwcGVuZENoaWxkKGNhbnZhc1N0eWxlRWwpOwogICAgICB9IGVsc2UgewogICAgICAgIGRvYy5kb2N1bWVudEVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKCJkYXRhLWRjLWNhbnZhcyIpOwogICAgICAgIGNhbnZhc1N0eWxlRWw\/LnJlbW92ZSgpOwogICAgICAgIGNhbnZhc1N0eWxlRWwgPSBudWxsOwogICAgICB9CiAgICB9CiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsIChlKSA9PiB7CiAgICAgIGlmICghZGVzaWduRG9jTW9kZSB8fCAoZS5kYXRhICYmIGUuZGF0YS50eXBlKSAhPT0gIl9fZGNfcHJvYmUiKSByZXR1cm47CiAgICAgIHBvc3REZXNpZ25Nb2RlKGRlc2lnbkRvY01vZGUpOwogICAgfSk7CiAgICBmdW5jdGlvbiBjb21waWxlKG5vZGUpIHsKICAgICAgY29uc3QgcmF3ID0gWy4uLm5vZGUuY2hpbGRyZW5dOwogICAgICBjb25zdCBoZWxtZXRDbG9zZWQgPSBub2RlLm5leHRTaWJsaW5nICE9IG51bGwgfHwgbm9kZS5wYXJlbnROb2RlPy5uZXh0U2libGluZyAhPSBudWxsOwogICAgICBpZiAobm9kZS5oYXNBdHRyaWJ1dGUoImRhdGEtZGMtYXRvbWljcyIpICYmICFtb3VudGVkLmhhcygiX19kYy1hdG9taWNzIikpIHsKICAgICAgICBtb3VudGVkLmFkZCgiX19kYy1hdG9taWNzIik7CiAgICAgICAgY29uc3QgZWwgPSBkb2MuY3JlYXRlRWxlbWVudCgic3R5bGUiKTsKICAgICAgICBlbC5pZCA9ICJfX2RjLWF0b21pY3MiOwogICAgICAgIGVsLnRleHRDb250ZW50ID0gQVRPTUlDX0NTUzsKICAgICAgICBkb2MuaGVhZC5hcHBlbmRDaGlsZChlbCk7CiAgICAgIH0KICAgICAgcmV0dXJuIChfdmFscywgY3R4KSA9PiB7CiAgICAgICAgY29uc3QgbmFtZSA9IGN0eCAmJiBjdHguX19uYW1lIHx8ICIiOwogICAgICAgIGNvbnN0IHN0cmVhbWluZyA9ICEhKG5hbWUgJiYgaXNTdHJlYW1pbmcobmFtZSkpOwogICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmF3Lmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICBjb25zdCBjaGlsZCA9IHJhd1tpXTsKICAgICAgICAgIGNvbnN0IHRhZyA9IGNoaWxkLnRhZ05hbWU7CiAgICAgICAgICBjb25zdCBtYXlCZVBhcnRpYWwgPSBzdHJlYW1pbmcgJiYgIWhlbG1ldENsb3NlZCAmJiBpID09PSByYXcubGVuZ3RoIC0gMTsKICAgICAgICAgIGlmICh0YWcgPT09ICJTQ1JJUFQiKSB7CiAgICAgICAgICAgIGlmIChtYXlCZVBhcnRpYWwpIGNvbnRpbnVlOwogICAgICAgICAgICBjb25zdCBrZXkgPSAiU0NSSVBUfCIgKyAoY2hpbGQuZ2V0QXR0cmlidXRlKCJzcmMiKSB8fCBjaGlsZC50ZXh0Q29udGVudCB8fCAiIik7CiAgICAgICAgICAgIGlmIChtb3VudGVkLmhhcyhrZXkpKSBjb250aW51ZTsKICAgICAgICAgICAgbW91bnRlZC5hZGQoa2V5KTsKICAgICAgICAgICAgY29uc3QgZWwgPSBkb2MuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7CiAgICAgICAgICAgIGZvciAoY29uc3QgeyBuYW1lOiBhbiwgdmFsdWUgfSBvZiBbLi4uY2hpbGQuYXR0cmlidXRlc10pCiAgICAgICAgICAgICAgZWwuc2V0QXR0cmlidXRlKGFuLCB2YWx1ZSk7CiAgICAgICAgICAgIGlmIChjaGlsZC50ZXh0Q29udGVudCkgZWwudGV4dENvbnRlbnQgPSBjaGlsZC50ZXh0Q29udGVudDsKICAgICAgICAgICAgZG9jLmhlYWQuYXBwZW5kQ2hpbGQoZWwpOwogICAgICAgICAgfSBlbHNlIGlmICh0YWcgPT09ICJMSU5LIiB8fCB0YWcgPT09ICJNRVRBIikgewogICAgICAgICAgICBpZiAobWF5QmVQYXJ0aWFsKSBjb250aW51ZTsKICAgICAgICAgICAgY29uc3Qga2V5ID0gdGFnICsgInwiICsgKGNoaWxkLmdldEF0dHJpYnV0ZSgiaHJlZiIpIHx8IGNoaWxkLmdldEF0dHJpYnV0ZSgic3JjIikgfHwgY2hpbGQub3V0ZXJIVE1MKTsKICAgICAgICAgICAgaWYgKG1vdW50ZWQuaGFzKGtleSkpIGNvbnRpbnVlOwogICAgICAgICAgICBtb3VudGVkLmFkZChrZXkpOwogICAgICAgICAgICBkb2MuaGVhZC5hcHBlbmRDaGlsZChjaGlsZC5jbG9uZU5vZGUodHJ1ZSkpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgY29uc3Qga2V5ID0gbmFtZSArICJ8IiArIGk7CiAgICAgICAgICAgIGxldCBlbCA9IGxpdmUuZ2V0KGtleSk7CiAgICAgICAgICAgIGlmICghZWwgfHwgZWwudGFnTmFtZSAhPT0gdGFnKSB7CiAgICAgICAgICAgICAgaWYgKGVsKSBlbC5yZW1vdmUoKTsKICAgICAgICAgICAgICBlbCA9IGRvYy5jcmVhdGVFbGVtZW50KHRhZy50b0xvd2VyQ2FzZSgpKTsKICAgICAgICAgICAgICBsaXZlLnNldChrZXksIGVsKTsKICAgICAgICAgICAgICBkb2MuaGVhZC5hcHBlbmRDaGlsZChlbCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZm9yIChjb25zdCB7IG5hbWU6IGFuLCB2YWx1ZSB9IG9mIFsuLi5jaGlsZC5hdHRyaWJ1dGVzXSkgewogICAgICAgICAgICAgIGlmIChlbC5nZXRBdHRyaWJ1dGUoYW4pICE9PSB2YWx1ZSkgZWwuc2V0QXR0cmlidXRlKGFuLCB2YWx1ZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGVsLnRleHRDb250ZW50ICE9PSBjaGlsZC50ZXh0Q29udGVudCkKICAgICAgICAgICAgICBlbC50ZXh0Q29udGVudCA9IGNoaWxkLnRleHRDb250ZW50OwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgfTsKICAgIH0KICAgIHJldHVybiB7IGNvbXBpbGUsIHNldERlc2lnbkRvY01vZGUgfTsKICB9CgogIC8vIHNyYy9wc2V1ZG8udHMKICBmdW5jdGlvbiBjcmVhdGVQc2V1ZG9TaGVldChkb2MpIHsKICAgIGxldCBlbCA9IG51bGw7CiAgICBjb25zdCBjYWNoZSA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCk7CiAgICBsZXQgbiA9IDA7CiAgICByZXR1cm4gKHBzZXVkbywgY3NzKSA9PiB7CiAgICAgIGNvbnN0IGsgPSBwc2V1ZG8gKyAifCIgKyBjc3M7CiAgICAgIGNvbnN0IGhpdCA9IGNhY2hlLmdldChrKTsKICAgICAgaWYgKGhpdCkgcmV0dXJuIGhpdDsKICAgICAgaWYgKCFlbCkgewogICAgICAgIGVsID0gZG9jLmNyZWF0ZUVsZW1lbnQoInN0eWxlIik7CiAgICAgICAgZG9jLmhlYWQuYXBwZW5kQ2hpbGQoZWwpOwogICAgICB9CiAgICAgIGNvbnN0IGNscyA9ICJzY3AiICsgKG4rKykudG9TdHJpbmcoMzYpOwogICAgICBjb25zdCBzZWwgPSBwc2V1ZG8gPT09ICJiZWZvcmUiIHx8IHBzZXVkbyA9PT0gImFmdGVyIiA\/ICIuIiArIGNscyArICI6OiIgKyBwc2V1ZG8gOiAiLiIgKyBjbHMgKyAiOiIgKyBwc2V1ZG87CiAgICAgIGVsLnNoZWV0Lmluc2VydFJ1bGUoc2VsICsgInsiICsgY3NzICsgIn0iLCBlbC5zaGVldC5jc3NSdWxlcy5sZW5ndGgpOwogICAgICBjYWNoZS5zZXQoaywgY2xzKTsKICAgICAgcmV0dXJuIGNsczsKICAgIH07CiAgfQoKICAvLyBzcmMvcmVnaXN0cnkudHMKICBmdW5jdGlvbiBjcmVhdGVSZWdpc3RyeSgpIHsKICAgIGNvbnN0IGVudHJpZXMgPSAvKiBAX19QVVJFX18gKi8gT2JqZWN0LmNyZWF0ZShudWxsKTsKICAgIGZ1bmN0aW9uIGdldChuYW1lKSB7CiAgICAgIHJldHVybiBlbnRyaWVzW25hbWVdIHx8IChlbnRyaWVzW25hbWVdID0gewogICAgICAgIGh0bWw6ICIiLAogICAgICAgIHRwbDogbnVsbCwKICAgICAgICBMb2dpYzogbnVsbCwKICAgICAgICBqc1N0cmVhbWluZzogZmFsc2UsCiAgICAgICAgaHRtbFN0cmVhbWluZzogZmFsc2UsCiAgICAgICAgdmVyOiAwLAogICAgICAgIHN1YnM6IC8qIEBfX1BVUkVfXyAqLyBuZXcgU2V0KCksCiAgICAgICAgZmV0Y2hlZDogZmFsc2UKICAgICAgfSk7CiAgICB9CiAgICBmdW5jdGlvbiBidW1wKG5hbWUpIHsKICAgICAgY29uc3QgciA9IGdldChuYW1lKTsKICAgICAgci52ZXIrKzsKICAgICAgZm9yIChjb25zdCBmbiBvZiByLnN1YnMpIGZuKCk7CiAgICB9CiAgICByZXR1cm4gewogICAgICBlbnRyaWVzLAogICAgICBnZXQsCiAgICAgIGJ1bXAsCiAgICAgIGJ1bXBBbGwoKSB7CiAgICAgICAgZm9yIChjb25zdCBuIGluIGVudHJpZXMpIGJ1bXAobik7CiAgICAgIH0KICAgIH07CiAgfQoKICAvLyBzcmMvcnVudGltZS50cwogIHZhciBDT01QT05FTlRfRElSID0gIi4iOwogIGZ1bmN0aW9uIGNyZWF0ZVJ1bnRpbWUoZG9jID0gZG9jdW1lbnQpIHsKICAgIGNvbnN0IHJlZ2lzdHJ5ID0gY3JlYXRlUmVnaXN0cnkoKTsKICAgIGNvbnN0IHBzZXVkb0NsYXNzID0gY3JlYXRlUHNldWRvU2hlZXQoZG9jKTsKICAgIGNvbnN0IGhlbG1ldCA9IGNyZWF0ZUhlbG1ldE1hbmFnZXIoCiAgICAgIGRvYywKICAgICAgKG5hbWUpID0+IHJlZ2lzdHJ5LmdldChuYW1lKS5odG1sU3RyZWFtaW5nCiAgICApOwogICAgY29uc3QgZXh0ZXJuYWwgPSBjcmVhdGVFeHRlcm5hbE1vZHVsZXMoKCkgPT4gcmVnaXN0cnkuYnVtcEFsbCgpKTsKICAgIGNvbnN0IGZhY3RvcnkgPSBjcmVhdGVDb21wb25lbnRGYWN0b3J5KHJlZ2lzdHJ5LCBlbnN1cmVGZXRjaGVkKTsKICAgIGNvbnN0IGhvc3QgPSB7CiAgICAgIGNvbXBvbmVudDogKG5hbWUpID0+IGZhY3RvcnkuZ2V0REMobmFtZSksCiAgICAgIHBsYWNlaG9sZGVyOiAocHJvcHMpID0+IGgoUGxhY2Vob2xkZXIsIHByb3BzKSwKICAgICAgaGVsbWV0OiAobm9kZSkgPT4gaGVsbWV0LmNvbXBpbGUobm9kZSksCiAgICAgIGxvYWRFeHRlcm5hbDogKGtpbmQsIHVybCwgYWZ0ZXIpID0+IGV4dGVybmFsLmxvYWQoa2luZCwgdXJsLCBhZnRlciksCiAgICAgIHJlc29sdmVFeHRlcm5hbDogKHVybCwgbmFtZSkgPT4gZXh0ZXJuYWwucmVzb2x2ZSh1cmwsIG5hbWUpLAogICAgICByZXNvbHZlRXh0ZXJuYWxHbG9iYWw6ICh1cmwsIG5hbWUpID0+IGV4dGVybmFsLnJlc29sdmVHbG9iYWwodXJsLCBuYW1lKSwKICAgICAgcmVzb2x2ZUV4dGVybmFsRXJyb3I6ICh1cmwsIG5hbWUpID0+IGV4dGVybmFsLmdldEVycm9yKHVybCwgbmFtZSksCiAgICAgIHBzZXVkb0NsYXNzCiAgICB9OwogICAgZnVuY3Rpb24gZW5zdXJlRmV0Y2hlZChuYW1lKSB7CiAgICAgIGNvbnN0IHIgPSByZWdpc3RyeS5nZXQobmFtZSk7CiAgICAgIGlmIChyLmZldGNoZWQpIHJldHVybjsKICAgICAgci5mZXRjaGVkID0gdHJ1ZTsKICAgICAgY29uc3QgdXJsID0gQ09NUE9ORU5UX0RJUiArICIvIiArIGVuY29kZVVSSUNvbXBvbmVudChuYW1lKSArICIuZGMuaHRtbCI7CiAgICAgIGZldGNoKHVybCkudGhlbigocmVzKSA9PiB7CiAgICAgICAgaWYgKCFyZXMub2spIHsKICAgICAgICAgIGNvbnNvbGUuZXJyb3IoCiAgICAgICAgICAgICJbZGMtcnVudGltZV0gc2libGluZyBmZXRjaCBmb3IgPCIgKyBuYW1lICsgIi8+IGZhaWxlZDoiLAogICAgICAgICAgICB1cmwsCiAgICAgICAgICAgICJyZXR1cm5lZCIsCiAgICAgICAgICAgIHJlcy5zdGF0dXMsCiAgICAgICAgICAgICJcdTIwMTQgdGhlIHJlZmVyZW5jZSByZW5kZXJzIGFzIGFuIGVtcHR5IHBsYWNlaG9sZGVyLiIKICAgICAgICAgICk7CiAgICAgICAgICByZXR1cm4gIiI7CiAgICAgICAgfQogICAgICAgIHJldHVybiByZXMudGV4dCgpOwogICAgICB9KS50aGVuKCh0KSA9PiB7CiAgICAgICAgaWYgKCF0KSByZXR1cm47CiAgICAgICAgY29uc3QgcGFyc2VkID0gcGFyc2VEY1RleHQodCk7CiAgICAgICAgaWYgKCFwYXJzZWQpIHsKICAgICAgICAgIGNvbnNvbGUuZXJyb3IoCiAgICAgICAgICAgICJbZGMtcnVudGltZV0gc2libGluZyBmZXRjaCBmb3IgPCIgKyBuYW1lICsgIi8+OiIsCiAgICAgICAgICAgIHVybCwKICAgICAgICAgICAgImhhcyBubyA8eC1kYz4gYmxvY2sgXHUyMDE0IG5vdCBhIERlc2lnbiBDb21wb25lbnQuIgogICAgICAgICAgKTsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgaWYgKHBhcnNlZC5wcm9wcykgci5wcm9wc01ldGEgPSBwYXJzZWQucHJvcHM7CiAgICAgICAgaWYgKHBhcnNlZC5wcmV2aWV3KSByLnByZXZpZXcgPSBwYXJzZWQucHJldmlldzsKICAgICAgICBpZiAocGFyc2VkLnRlbXBsYXRlICYmICFyLmh0bWwpIHVwZGF0ZUh0bWwobmFtZSwgcGFyc2VkLnRlbXBsYXRlKTsKICAgICAgICBpZiAocGFyc2VkLmpzICYmICFyLkxvZ2ljKSB1cGRhdGVKcyhuYW1lLCBwYXJzZWQuanMpOwogICAgICB9KS5jYXRjaCgKICAgICAgICAoZSkgPT4gY29uc29sZS5lcnJvcigKICAgICAgICAgICJbZGMtcnVudGltZV0gc2libGluZyBmZXRjaCBmb3IgPCIgKyBuYW1lICsgIi8+IHRocmV3OiIsCiAgICAgICAgICB1cmwsCiAgICAgICAgICBlCiAgICAgICAgKQogICAgICApOwogICAgfQogICAgbGV0IHJvb3ROYW1lID0gbnVsbDsKICAgIGZ1bmN0aW9uIHVwZGF0ZUh0bWwobmFtZSwgaHRtbCkgewogICAgICBjb25zdCByID0gcmVnaXN0cnkuZ2V0KG5hbWUpOwogICAgICByLmh0bWwgPSBodG1sOwogICAgICBpZiAobmFtZSA9PT0gcm9vdE5hbWUpIHsKICAgICAgICBjb25zdCBtb2RlID0gREVTSUdOX0RPQ19NT0RFX1JFLmV4ZWMoaHRtbCk\/LlsxXSA\/PyBudWxsOwogICAgICAgIGlmIChtb2RlIHx8ICFyLmh0bWxTdHJlYW1pbmcpIGhlbG1ldC5zZXREZXNpZ25Eb2NNb2RlKG1vZGUpOwogICAgICB9CiAgICAgIHRyeSB7CiAgICAgICAgci50cGwgPSBjb21waWxlVGVtcGxhdGUoaHRtbCwgaG9zdCk7CiAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICBjb25zb2xlLmVycm9yKCJbZGMtcnVudGltZV0gdGVtcGxhdGUgY29tcGlsZSBGQUlMRUQgZm9yIiwgbmFtZSwgZSk7CiAgICAgIH0KICAgICAgcmVnaXN0cnkuYnVtcChuYW1lKTsKICAgIH0KICAgIGZ1bmN0aW9uIHVwZGF0ZUpzKG5hbWUsIHNyYykgewogICAgICBjb25zdCByID0gcmVnaXN0cnkuZ2V0KG5hbWUpOwogICAgICBjb25zdCBzZXEgPSByLmpzU2VxID0gKHIuanNTZXEgfHwgMCkgKyAxOwogICAgICB0cnkgewogICAgICAgIGNvbnN0IENscyA9IGV2YWxEY0xvZ2ljKHNyYyk7CiAgICAgICAgaWYgKHIuanNTZXEgIT09IHNlcSkgcmV0dXJuOwogICAgICAgIGlmICh0eXBlb2YgQ2xzICE9PSAiZnVuY3Rpb24iKSB7CiAgICAgICAgICByLmxvZ2ljRXJyb3IgPSBuYW1lICsgIi5kYy5odG1sOiA8c2NyaXB0IGRhdGEtZGMtc2NyaXB0PiBtdXN0IGRlZmluZSBgY2xhc3MgQ29tcG9uZW50IGV4dGVuZHMgRENMb2dpY2AiOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICByLmxvZ2ljRXJyb3IgPSBudWxsOwogICAgICAgICAgci5Mb2dpYyA9IENsczsKICAgICAgICB9CiAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICBpZiAoci5qc1NlcSAhPT0gc2VxKSByZXR1cm47CiAgICAgICAgY29uc29sZS5lcnJvcigKICAgICAgICAgICJbZGMtcnVudGltZV0gbG9naWMgY2xhc3MgZXZhbCBGQUlMRUQgZm9yIiwKICAgICAgICAgIG5hbWUsCiAgICAgICAgICAiXHUyMDE0IHRoZSB0ZW1wbGF0ZSByZW5kZXJzIHdpdGggcHJvcHMgb25seS4iLAogICAgICAgICAgZQogICAgICAgICk7CiAgICAgICAgci5sb2dpY0Vycm9yID0gbmFtZSArICI6ICIgKyAoZSBpbnN0YW5jZW9mIEVycm9yICYmIGUubWVzc2FnZSA\/IGUubWVzc2FnZSA6IFN0cmluZyhlKSk7CiAgICAgIH0KICAgICAgcmVnaXN0cnkuYnVtcChuYW1lKTsKICAgIH0KICAgIGZ1bmN0aW9uIHNldFN0cmVhbWluZyhuYW1lLCBraW5kLCBvbikgewogICAgICBjb25zdCByID0gcmVnaXN0cnkuZ2V0KG5hbWUpOwogICAgICBpZiAoa2luZCA9PT0gImh0bWwiKSByLmh0bWxTdHJlYW1pbmcgPSAhIW9uOwogICAgICBlbHNlIHIuanNTdHJlYW1pbmcgPSAhIW9uOwogICAgICBsZXQgYW55ID0gZmFsc2U7CiAgICAgIGZvciAoY29uc3QgbiBpbiByZWdpc3RyeS5lbnRyaWVzKSB7CiAgICAgICAgY29uc3QgZSA9IHJlZ2lzdHJ5LmVudHJpZXNbbl07CiAgICAgICAgaWYgKGUgJiYgKGUuaHRtbFN0cmVhbWluZyB8fCBlLmpzU3RyZWFtaW5nKSkgewogICAgICAgICAgYW55ID0gdHJ1ZTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgfQogICAgICBkb2MuZG9jdW1lbnRFbGVtZW50LmNsYXNzTGlzdC50b2dnbGUoInNjLWRjLXN0cmVhbWluZyIsIGFueSk7CiAgICAgIHJlZ2lzdHJ5LmJ1bXAobmFtZSk7CiAgICB9CiAgICBmdW5jdGlvbiBkY1VwZGF0ZShuYW1lLCBraW5kLCBjb250ZW50LCBzdHJlYW1pbmcpIHsKICAgICAgaWYgKHN0cmVhbWluZykgcmVnaXN0cnkuZ2V0KG5hbWUpLmZldGNoZWQgPSB0cnVlOwogICAgICBpZiAoa2luZCA9PT0gImh0bWwiKSB7CiAgICAgICAgc2V0U3RyZWFtaW5nKG5hbWUsICJodG1sIiwgISFzdHJlYW1pbmcpOwogICAgICAgIHVwZGF0ZUh0bWwobmFtZSwgY29udGVudCk7CiAgICAgIH0gZWxzZSBpZiAoa2luZCA9PT0gImpzIikgewogICAgICAgIHNldFN0cmVhbWluZyhuYW1lLCAianMiLCAhIXN0cmVhbWluZyk7CiAgICAgICAgaWYgKCFzdHJlYW1pbmcpIHVwZGF0ZUpzKG5hbWUsIGNvbnRlbnQpOwogICAgICB9IGVsc2UgaWYgKGtpbmQgPT09ICJwcm9wcyIpIHsKICAgICAgICBjb25zdCB7IHByb3BzLCBwcmV2aWV3IH0gPSBwYXJzZURhdGFQcm9wcyhjb250ZW50KTsKICAgICAgICBjb25zdCByID0gcmVnaXN0cnkuZ2V0KG5hbWUpOwogICAgICAgIHIucHJvcHNNZXRhID0gcHJvcHMgPz8gdm9pZCAwOwogICAgICAgIHIucHJldmlldyA9IHByZXZpZXc7CiAgICAgICAgcmVnaXN0cnkuYnVtcChuYW1lKTsKICAgICAgfQogICAgfQogICAgZnVuY3Rpb24gc2V0UHJvcHMobmFtZSwgb3ZlcnJpZGVzKSB7CiAgICAgIHJlZ2lzdHJ5LmdldChuYW1lKS5wcm9wT3ZlcnJpZGVzID0gb3ZlcnJpZGVzICYmIHR5cGVvZiBvdmVycmlkZXMgPT09ICJvYmplY3QiID8geyAuLi5vdmVycmlkZXMgfSA6IG51bGw7CiAgICAgIHJlZ2lzdHJ5LmJ1bXAobmFtZSk7CiAgICB9CiAgICBmdW5jdGlvbiBhZG9wdFBhcnNlZChuYW1lLCBwYXJzZWQpIHsKICAgICAgaWYgKCFwYXJzZWQpIHJldHVybjsKICAgICAgY29uc3QgciA9IHJlZ2lzdHJ5LmdldChuYW1lKTsKICAgICAgaWYgKHBhcnNlZC5wcm9wcykgci5wcm9wc01ldGEgPSBwYXJzZWQucHJvcHM7CiAgICAgIGlmIChwYXJzZWQucHJldmlldykgci5wcmV2aWV3ID0gcGFyc2VkLnByZXZpZXc7CiAgICAgIGlmIChwYXJzZWQudGVtcGxhdGUpIHVwZGF0ZUh0bWwobmFtZSwgcGFyc2VkLnRlbXBsYXRlKTsKICAgICAgaWYgKHBhcnNlZC5qcykgdXBkYXRlSnMobmFtZSwgcGFyc2VkLmpzKTsKICAgIH0KICAgIHJldHVybiB7CiAgICAgIHJlZ2lzdHJ5LAogICAgICBnZXREQzogZmFjdG9yeS5nZXREQywKICAgICAgdXBkYXRlSHRtbCwKICAgICAgdXBkYXRlSnMsCiAgICAgIGRjVXBkYXRlLAogICAgICBzZXRQcm9wcywKICAgICAgYWRvcHRQYXJzZWQsCiAgICAgIHNldFJvb3ROYW1lOiAobmFtZSkgPT4gewogICAgICAgIHJvb3ROYW1lID0gbmFtZTsKICAgICAgfSwKICAgICAgbWFya0ZldGNoZWQ6IChuYW1lKSA9PiB7CiAgICAgICAgcmVnaXN0cnkuZ2V0KG5hbWUpLmZldGNoZWQgPSB0cnVlOwogICAgICB9LAogICAgICBhbm5vdGF0ZWRUZW1wbGF0ZTogKG5hbWUpID0+IHsKICAgICAgICBjb25zdCByID0gcmVnaXN0cnkuZ2V0KG5hbWUpOwogICAgICAgIHJldHVybiByLnRwbCAmJiByLnRwbC5fX2Fubm90YXRlZCB8fCBudWxsOwogICAgICB9LAogICAgICB0ZW1wbGF0ZVNvdXJjZTogKG5hbWUpID0+IHJlZ2lzdHJ5LmdldChuYW1lKS5odG1sIHx8IG51bGwsCiAgICAgIFN0cmVhbWFibGVMb2dpYwogICAgfTsKICB9CgogIC8vIHNyYy9pbmRleC50cwogIHZhciBSRUFDVF9VUkwgPSAiaHR0cHM6Ly91bnBrZy5jb20vcmVhY3RAMTguMy4xL3VtZC9yZWFjdC5wcm9kdWN0aW9uLm1pbi5qcyI7CiAgdmFyIFJFQUNUX1NSSSA9ICJzaGEzODQtREd5THhBeWpxMGY5U1BwVmV2RDZJZ3p0Q0Zsbk1GNm9XL1hRR21mZStJc1o4VHFFaURyY0hrTUxLSTZmaUIvWiI7CiAgdmFyIFJFQUNUX0RPTV9VUkwgPSAiaHR0cHM6Ly91bnBrZy5jb20vcmVhY3QtZG9tQDE4LjMuMS91bWQvcmVhY3QtZG9tLnByb2R1Y3Rpb24ubWluLmpzIjsKICB2YXIgUkVBQ1RfRE9NX1NSSSA9ICJzaGEzODQtZ1RHeGh6MjFsVkdZTk1jZEpPeXEwMUVkZzBqaG4vYzIybnN4MGt5cVAwVHhhVjVXVmRzU0gxZlNEVWY1WUpqMSI7CiAgZnVuY3Rpb24gaGlkZVJhd1RlbXBsYXRlKCkgewogICAgY29uc3QgcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInN0eWxlIik7CiAgICBzLnRleHRDb250ZW50ID0gIngtZGN7ZGlzcGxheTpub25lIWltcG9ydGFudH0iOwogICAgZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChzKTsKICB9CiAgZnVuY3Rpb24gbG9hZFNjcmlwdChzcmMsIGludGVncml0eSkgewogICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlMiwgcmVqZWN0KSA9PiB7CiAgICAgIC8vISBub3NlbWdyZXA6IGNyZWF0ZS1zY3JpcHQtZWxlbWVudAogICAgICBjb25zdCBzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7CiAgICAgIHMuc3JjID0gc3JjOwogICAgICBzLmludGVncml0eSA9IGludGVncml0eTsKICAgICAgcy5jcm9zc09yaWdpbiA9ICJhbm9ueW1vdXMiOwogICAgICBzLmFzeW5jID0gZmFsc2U7CiAgICAgIHMub25sb2FkID0gKCkgPT4gcmVzb2x2ZTIoKTsKICAgICAgcy5vbmVycm9yID0gKCkgPT4gcmVqZWN0KG5ldyBFcnJvcihgZmFpbGVkIHRvIGxvYWQgJHtzcmN9YCkpOwogICAgICBkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKHMpOwogICAgfSk7CiAgfQogIGZ1bmN0aW9uIGxvYWRSZWFjdFVtZCgpIHsKICAgIGNvbnN0IHcgPSB3aW5kb3c7CiAgICBpZiAody5SZWFjdCAmJiB3LlJlYWN0RE9NKSByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7CiAgICByZXR1cm4gUHJvbWlzZS5hbGwoWwogICAgICBsb2FkU2NyaXB0KFJFQUNUX1VSTCwgUkVBQ1RfU1JJKSwKICAgICAgbG9hZFNjcmlwdChSRUFDVF9ET01fVVJMLCBSRUFDVF9ET01fU1JJKQogICAgXSkudGhlbigoKSA9PiB2b2lkIDApOwogIH0KICBmdW5jdGlvbiBpbml0KCkgewogICAgY29uc3QgcnVudGltZSA9IGNyZWF0ZVJ1bnRpbWUoZG9jdW1lbnQpOwogICAgbGV0IHJvb3ROYW1lID0gIlJvb3QiOwogICAgY29uc3QgYmFzZUNzcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInN0eWxlIik7CiAgICBiYXNlQ3NzLnRleHRDb250ZW50ID0gQkFTRV9DU1M7CiAgICBkb2N1bWVudC5oZWFkLnByZXBlbmQoYmFzZUNzcyk7CiAgICBjb25zdCBub3RpZnlIb3N0ID0gKCkgPT4gewogICAgICBpZiAod2luZG93LnBhcmVudCA9PT0gd2luZG93KSByZXR1cm47CiAgICAgIGNvbnN0IHIgPSBydW50aW1lLnJlZ2lzdHJ5LmVudHJpZXNbcm9vdE5hbWVdOwogICAgICB0cnkgewogICAgICAgIHdpbmRvdy5wYXJlbnQucG9zdE1lc3NhZ2UoCiAgICAgICAgICB7CiAgICAgICAgICAgIHR5cGU6ICJfX2RjX2Jvb3RlZCIsCiAgICAgICAgICAgIHJvb3ROYW1lLAogICAgICAgICAgICBwcm9wc01ldGE6IHIgJiYgci5wcm9wc01ldGEgfHwgbnVsbCwKICAgICAgICAgICAgcHJldmlldzogciAmJiByLnByZXZpZXcgfHwgbnVsbAogICAgICAgICAgfSwKICAgICAgICAgICIqIgogICAgICAgICk7CiAgICAgIH0gY2F0Y2ggewogICAgICB9CiAgICB9OwogICAgY29uc3QgYXBpID0gewogICAgICBfX2RjVXBkYXRlOiAobmFtZSwga2luZCwgY29udGVudCwgc3RyZWFtaW5nKSA9PiB7CiAgICAgICAgcnVudGltZS5kY1VwZGF0ZShuYW1lLCBraW5kLCBjb250ZW50LCBzdHJlYW1pbmcpOwogICAgICAgIGlmIChuYW1lID09PSByb290TmFtZSAmJiAhc3RyZWFtaW5nICYmIGtpbmQgPT09ICJwcm9wcyIpIG5vdGlmeUhvc3QoKTsKICAgICAgfSwKICAgICAgX19kY1NldFByb3BzOiAobmFtZSwgb3ZlcnJpZGVzKSA9PiBydW50aW1lLnNldFByb3BzKG5hbWUsIG92ZXJyaWRlcyksCiAgICAgIC8qKiBOYW1lIG9mIHRoZSBjb21wb25lbnQgY3VycmVudGx5IG1vdW50ZWQgYXMgdGhlIHBhZ2Ugcm9vdCDigJQgREMgdG9vbHMKICAgICAgICogIHB1c2ggdGhlaXIgdGVtcGxhdGUtc3RyZWFtIGhlcmUgd2hlbiB0YXJnZXRpbmcgInRoZSBvcGVuIHBhZ2UiLiAqLwogICAgICBfX2RjUm9vdE5hbWU6ICgpID0+IHJvb3ROYW1lLAogICAgICAvKiogRWRpdG9yIGJyaWRnZSDigJQgdGhlIGVuY29kZWQsIGBkYXRhLWRjLXRwbGAtYW5ub3RhdGVkIHRlbXBsYXRlIHNvdXJjZS4KICAgICAgICogIFRoZSBob3N0IGVkaXRvciBwYXJzZXMgdGhpcyBpbnRvIGl0cyBvd24gdGVtcGxhdGUgRE9NIHNvIGl0IGNhbiBtYXAgYQogICAgICAgKiAgcmVuZGVyZWQgbm9kZSAoY2FycnlpbmcgdGhlIHNhbWUgYGRhdGEtZGMtdHBsYCkgYmFjayB0byB0aGUgc291cmNlCiAgICAgICAqICBub2RlIHRoYXQgZW1pdHRlZCBpdC4gUmV0dXJucyB0aGUgZW5jb2RlZCBmb3JtIChgPHNjLWNvbXA+YCwKICAgICAgICogIGBzYy1jYW1lbC0qYCBhdHRycyk7IHRoZSBlZGl0b3IgZGVjb2RlcyBvbiBzZXJpYWxpemUuICovCiAgICAgIF9fZGNBbm5vdGF0ZWRUZW1wbGF0ZTogKG5hbWUpID0+IHJ1bnRpbWUuYW5ub3RhdGVkVGVtcGxhdGUobmFtZSksCiAgICAgIC8qKiBFZGl0b3IgYnJpZGdlIOKAlCB0aGUgKm9yaWdpbmFsKiAoZGVjb2RlZCkgdGVtcGxhdGUgc291cmNlLiAqLwogICAgICBfX2RjVGVtcGxhdGVTb3VyY2U6IChuYW1lKSA9PiBydW50aW1lLnRlbXBsYXRlU291cmNlKG5hbWUpLAogICAgICBfX2RjQm9vdDogKCkgPT4gewogICAgICAgIHJvb3ROYW1lID0gYm9vdChydW50aW1lLCBkb2N1bWVudCkgPz8gcm9vdE5hbWU7CiAgICAgICAgbm90aWZ5SG9zdCgpOwogICAgICB9LAogICAgICBfX2RjUmVnaXN0cnk6IHJ1bnRpbWUucmVnaXN0cnkuZW50cmllcywKICAgICAgZ2V0REM6IChuYW1lKSA9PiBydW50aW1lLmdldERDKG5hbWUpLAogICAgICAvLyBgRENMb2dpY2AgaXMgdGhlIGRvY3VtZW50ZWQgYmFzZSBjbGFzcyBuYW1lOyBgU3RyZWFtYWJsZUxvZ2ljYCBpcyB0aGUKICAgICAgLy8gaW1wbGVtZW50YXRpb24gYWxpYXMga2VwdCBmb3IgYW55IHByb2plY3QgdGhhdCBhbHJlYWR5IHJlZmVyZW5jZXMgaXQuCiAgICAgIERDTG9naWM6IHJ1bnRpbWUuU3RyZWFtYWJsZUxvZ2ljLAogICAgICBTdHJlYW1hYmxlTG9naWM6IHJ1bnRpbWUuU3RyZWFtYWJsZUxvZ2ljCiAgICB9OwogICAgT2JqZWN0LmFzc2lnbih3aW5kb3csIGFwaSk7CiAgICBpZiAoZG9jdW1lbnQucmVhZHlTdGF0ZSAhPT0gImxvYWRpbmciKSBhcGkuX19kY0Jvb3QoKTsKICAgIGVsc2UgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigiRE9NQ29udGVudExvYWRlZCIsICgpID0+IGFwaS5fX2RjQm9vdCgpKTsKICB9CiAgaGlkZVJhd1RlbXBsYXRlKCk7CiAgbG9hZFJlYWN0VW1kKCkudGhlbihpbml0KS5jYXRjaCgoZXJyKSA9PiB7CiAgICBjb25zb2xlLmVycm9yKCJbZGNdIGZhaWxlZCB0byBsb2FkIFJlYWN0IG9yIGJvb3Q6IiwgZXJyKTsKICAgIHRocm93IGVycjsKICB9KTsKfSkoKTsK\"\u003e\u003c\/script\u003e\n\n\n\u003cx-dc\u003e\n\u003chelmet\u003e\n\u003clink rel=\"preconnect\" href=\"https:\/\/fonts.googleapis.com\"\u003e\n\u003clink rel=\"preconnect\" href=\"https:\/\/fonts.gstatic.com\"\u003e\n\u003cstyle\u003e\/* latin-ext *\/\n@font-face {\n  font-family: 'Figtree';\n  font-style: normal;\n  font-weight: 400 900;\n  font-display: swap;\n  src: url(\"data:font\/woff2;base64,d09GMgABAAAAACgoABQAAAAAV4gAACe4AAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGoJ+G5NGHIFWP0hWQVKECQZgP1NUQVSBHCcqAIQML2oRCAq7NLELC4J6ADCwMgE2AiQDhXAEIAWHQgeLSQwHG39PBePYFOA8gHLiagQeRbBxABELq4r\/ywNTbkcNYcHQARZHY2kgSJrSxmpqOhoxDJuOO3kPSIPpROEAJ9pOHa4+hySESdiHwfhsCoR8bNiVLaJs3bB6d1U22nEPjpBkliiyVWUeWVOzW8cAEgH1HrNGEpAMpJ1GBI91xLvZzz4QyUONYsNGsIIKiCClKUUQQewUETtoR8SaYmI0pbXrlkTzz6Sbcs3zWq6l3N2\/Uoop\/Sfa1r\/ZnS1gqbTBPPGq\/XB3P6Md4H5FXlRYgYFRcLoGghgUz\/N\/7Pt97psoK+CZ5cm1vJOiqYI5vzV+8Larc5ogIdncdZspCuwUr2vXV3vcT9\/7SekuGQAqVP4XgIRvbWqnUbKb36bm9bD7RjTOujJV21ucb\/6lDJKgQoLDe94ZKjroS8oJVCW1Ll00HwTeP180nswgFF6ZyTNPwgFUxiuBUIadqxDTOUP5nbJC6xQ7ks4dVapzSE3hvnKrykVdGp6v6f\/suznZ2V9aJnmfWo18+UJlBoUReGYz+9tmCaUvpXeVAYdqRaiPwzK45jCuNKcQ0qFDdAls30MvVryb6BJZCfzvtDkjHGEUY4zwi3E0nfuQVRBQAaQHyOIwLAgJQkaBBAqChAiDRIiC0MVDEiVCkiVDmNIgbBmQTHxIFhFEQgHJoYJo6CEGJohZEaREGcTCDnGogtSohdRzQ5q0Qtp1Qbr1QPr0QQYshQwaggwbgay2FrLeZshW2yA77IHscxBy2BHIMc9CRo0iGDeB4GXTCM46iwBBwAyIn1HjJjj\/PgjYDwYsDswNgyAwPmC7LCDgqc8f9gbPDEuj4+FYPJFMT\/WcIJOLugUiabFx9PiExKQUVjo7ky+TK7JValNZpaupFRAEtqYCAQYsxbDtdywoh6CTDu\/xQBAiYExrQGAIJx7t80DCAbYh+qDtkgRhQB7NWny5QICuf24qQjEcSTAEB9JFrQ11XwhAFN001+2AI7hbH3d\/wIGpCWjWltnuRL0CISrR10QgyFC3oQ1A3VUCLGk4kRQIisZuCYRaiFHTws\/lrxN4k3+09uEt3Cro4VrBYRhXv6x4ZgoQBglGMAj9RX6EDlzp35OXC5\/NvsItWe73pBoXctnA5ZIg2ghmKyDwF3Ru7ma+LwAtetzP0MjK+vF5dU57JLkgznxzAchQnXsx3LRv0Xr3SDwXd9C35JDk4Tm4WjyTM\/jm7WRjOZKs9rqglhHtQrsw45eWw8Srivdk3i\/U5wkJvFbMg3jp1pYy0\/r4nMq3FJ+s6qSEA4Hag2fEcgEWGBqPWFrW1pH+x1aqPXZB8wqTJA+izlwx3mgfm9GP05YlKQsvZtzJ+OcVasuV4X7ViZdBrhHd5boGOfGw8jpNDxN2+RYcr3y5mx9NwstmsLwxvw4PzFOwWxUlb8nCJkc1wxr1CzmtWc3tSV85uKU8Ybcu1BXxzNdadKiLLp5QdxX4oCHFyOx4hGXO6MLuxGSFUJIuyAAkcAIIJgwaUURDJ4EkmLDhIkCMDCVqdORhoggLNuw4qaUeN62000Xvl\/r5AbsDmwOrX2jDgpBhy1PO6nq\/RYwmq6wO6ftR329tEugeF\/OxS9n0XOVJd8ofZfn2lfpIvSov62fVDjWsfFKvS08S0gUyi1Y\/WALgZDT3HBtBtN6cHMdnifZOEK25pcwstxCk2+EhQFQ\/z9r1FETLD9Y7bh1DKdyYyJHs43CbuCBTuGALuPC6nx\/Fo0tcZV18HScTU3fr9euy+D8P5CwMGZZ+OMwxuSDnJM0CRN3rYzxJ5KOx0Bk1jXiCP1r20+tP3YozOzwsyyfXpI9HJgRDQOQnUJAO5anxLTW0cunoGeQzMjErVMTCysbOoZJTlRoNXPosNmi5FYaN2P38ffY74KDRrwc1AeizHB3TMoQSkNxhJyPYg7ApkWqQpvEWjk19zGkFYXkCTDBky3LYwmGLSUKFbSIINSFFUoPkXdOrbWSLkyc5U5bzTwTxw0QIVS7QedH+gQ6FPlVjsa1w9VyytffppI8BFrOEpWxl23HQJoTQo0ePHj169OjRo5eVrp+XpcadwgrYsOOgEidV1FBLAy7cNNFCK8OMHAKzTaZy7Wx2xXovHbbHXgUMCJ4qMrOc1lGjkzzJkTryyA7v5Z37nQ3tEATm5zdZ6MiEixdIMNZpmY2wkCt1N2A8ziK5dgQcAS+WwYRhCwnyZ8OOUVf7cK\/Jb0C8eIvcAsyvm3oBM3DxrQ6QMPHT\/hpBXhRJJVLiRa0j9AKoitZJTFkWdZJ0rEpUhHpYqA4EFrZXCtbhhEJfwBQtSpgqblqAECgqYdoQ6rYYjLUZAjqFZIUJYdXigoAhaCRVJTkSQdaV5ZvzvxNwOqozcmnOuzN\/x8SwQ1KBgJfe6ZLGolMzibRukKsXjKRFRccyWKkcnkAqU+iNVltNvau7f\/EgIASwNRWw4p6qZ4jPd6UNmx+o68oO7OZNnUPww9bNvw+cqr+Y39X\/G8NVgUs\/2c6MLGiv+xK4HZA\/agZYGgGCkGHA\/MjA8rBzj23uQQB+gMEvRBGQYLHYJHIVc2qGAOYJG2hAwfIBqGeAADI7irppc1LXNedmTpu3McL8bZVgCx2MCYCPP5P8gqtfZ3hkmFjAQq1gQMzzqhMrNgotAoFuFymgHRyHvISYaenjb4mBiC7w76x2zCvRhZn08CJOdgwxpyR1cWd5rpWtxPVmBRqiMc1nXbnkkSX\/Y+Qwzo9pRN4OoAWTFm74kUYdY4pTHlda816ZZ34gNJiQf7+l9xipBxBHta7v\/r95cj4ZSP6VnEoeA\/j0XoBPrvrqJ0BmB2V9DsssN2yTPZ437rhZc\/72mxn\/g8I\/ONSbYkNgQWJH5oBzoqiyQKVANYLUCuVC1SCMW4h6kZpFaBKlFU2LWB1itGPoFM9rEbouiXok68M0INUSLIulWYptENcKHMtlGMI3ItOwLKuJrCW0hsR6cpvIbCS1QY6tcu2isYPeHlo76eyWbz+zwwqVOKbMs0o9g8hKYTOVbUwOMtjH6IAiRyBgbhgkjD\/c0oit9jSrtQk0gxyRmUh2zFtAZkOKxf8gcyAlwImWmAuprb0jyDyhgrY0yHwJE3t\/sgAEjU\/NBfAMIOcBx4Kpc8D0TWDqC9DuAygYwtjVi++rzTQ6DXLASNqLCqyIJibVBZtTWAcKuPp0vq5i0gQUVp7nyVW+0LArbAA2p\/MKipqoBwhjlKYQLd1OP5jT5tJkzyja2XaXDrPzpmNtEktYsbxYC+c1b\/QCDlzWugaLwyzYV4xYHIqlJWdtLT5Rq8XSHbPTG8Amj5z6LCTkcRVvGdjHmyZ8dconWz7lOOYQOReXfWmJl1yecTPcvKnzW7e4uHHjoWByFSFcvy4Qc3Hr1p35ZBUTDEvQ8sjpt2yozm\/eM0BZvdgdz0RlABQIS0sjeZOkUMrQ7Y+MvKGFcVFZl8VLKoElbTbMXrgcnfPvunHDaNIguc9OF714aLKXStQWu6+IMdxDMbLTYBT8etpAXfkSqw\/S7KJlVOc23tCtXC3WwhryotDTlVeg9LgBl0WGgxfH0Qw3r\/3vmbZc6Ses1l9RtYkfGl7+mNrU6CxjKK\/MS8v59Py8Aw7Nv18blmA8EZf4cLecnUxJQJcFL0DTosuN\/dLCGqv11158BbWKNyUWyyxE1LHTZWkWxfLWdpSzkLZ32cap9wvsQHju83rpQlde5gNA+ZfJNExW7YqC\/JPXOQbnqm4Ca1ZUCMYb2sxOV9p8RlosI\/\/4B9dLgU9D1THb3t4SfPrWzup6ycSlTVR6tlJ1VGuYP7Iya2BW330gP\/XibBkUw6gexhGZwI3HAKMDpulqodQEVXke8qpYbCcvOH81NMzKn1UnQOlMnH2RZtdtpvMdkHJZapHliH1kqZnX9Pom+N6u4cjb6N0O7+mER2\/8Aco2IQNlQvJtwrHZJcrbLzEzfzkVrKg+H9AXltaodTMpLyX1NhmlQjacSdmtxMUYW\/A1Vj6vzlH7Tr24RKFU5hgXS5rNi1XsKW9G4lV\/O3WUohP8+Uoc5U5+uH4d6O71zAAirKbdaJuV2fpN7QE0Z+X0EXK6zOXaKk\/q8qbj5qvK2Xur8X5lXb3uii5MIjJ1Md\/5E4Dj57gbEcHfArQNrfHxes4oDf96iD5mHSlvT8RQAgmHrtqjtaYct1n2RdMZWcbu0+PtvIRWXhDZhLTTJ2DoqmXDnW7Jdec+AIzd7UjOrlOP4O3k6Y\/l4aPHjy3QWW\/Pn6pBFGgYu\/ro6kHpuoJ1gGdf1GTDc+2fGG6mkxq9yUZ\/RJQDff2WFf2witKwz2l9trXV8uxeZ73cm1ZZsFJlNKoqk3hFS8y6dRUO3fpl5uLMSpYxz6za5Sjt4oBr5sOa7fbSw02NZ77tFTXbpNtFVey8YmaLQgG5kZ3vqGg7FOXI5LKvc\/geXTM7ZWWP5DI5tUwGhyitzzmdz7a0qazeWoUtifbsUWKpQWiNY9vWmAvWOeyU6dmW36VUeQwn5X\/K7UXrNpvBNaMSjYpUS3cLRguAGJH9KFvz3wqV9Tpn4Cy+qOidlJuvlqoyuCnGJJ7F8LbqZymzTC0qil63pbAYywu5MsWQmWZVaUMjn3a4TAYEQRa+VHZ6NaU8mn2p3KIq+9ZihbCP6S+V7pfiBXUChaBAZ7r7MUfTN1hpfa61zdOeyoaGvc7yZ1tby5\/bXVknLRow52J4hW7dYlVrjZC5ptf8pLZdkXZJwTVzS+POkjiVuhK3KnwyXf8SvTbIfwO9YpSlSmZq0jWO0ry9kE2R22kPV584E9SgNzjdepmkSmOk6kP+X8jO0Amq+5u7dQ1cRe6OF631b5F9XfKUYq2oQx\/cQvO2ZwuF9jYhZFFC1WHX3uxNT1BnG1QqY55GmXPuuvhfkUqpllFVsaW1FfWaMmbE9cttFQSXq8LpboQ\/Pf0ysuz7YahZWNCn0fQWvKl6U86vdAhkcoeAXynv7okCbe+ABr5tuei6UHG6QvW\/issVqs8vnnOi+OViIDke7jV9UJ50U7N4EvBlH+Rdk8XNv2Lwk9xeX2ww1pfYdxGK1EW5nNeENq1ZHcHS2oTpbaUBYqKu0ZRm5eWmJJoksZsN3\/O4KgEkUAweTXav2azs9Wjy8jqyb8lbS3lCUWkW16lUZjjLskSiMlGx6XOPDoLkGrdG2ldglvZSnhkO0ZVExYwUc1yZWW\/w8rNSqxRImVpFRmZWURa7SqnkVOljGCJk4iyxXB+ftoWf3HaNPq8+VzBQtItY7WoukRVL2ulJcyWLfhSaM5h6LZPLMTN5ebCgwWkKFe0qOUNUBSVmlaRyK\/LElx1CqcatlvaYTNIut0ojdQgu2xSzNpWvQ8wjb0P7SoU81ZEvmMQCtkOu4FT+PgfTjCJ8QwlHLLNz+W4oi1RAWYpFQ0\/LK2quRiAXZ4l\/lg1MKZpXzMOn\/cHJCumb70pjSHATmVB0klwOpNxcrqbexoUf\/ik899q1DPM4scQ6ST\/JDIQGyP7yyfasIB6+aV6CmTeWcCSj10PthjNzVmZTrGtYf+lWf8XByqQOjV4kKrEA5q5gh39EwTSvsF+rScsSs4vpAkMODeYp0pL45ENlRCM7XZifzkqqMgdoQgy56TpHgTM9lxZ4xXrnqwXCd1Mj8IBxSi47P5HDURXGw1MKMBu0ygpxxSHFoaPio0rW56kBjdUjU5IBOxNmiSbydBMA8uV2Lr9xD1xKS08tlLmhhAunxv5TbDq0+VBuH9h4QNF7MuXGg5sOQv3HwRff0WcPxRVdZNZ+9F\/29MSpiZx5bVSrB\/hZ0nUy8YZM2cZsMXyAb+HvyjO5Spm8JLlJvIEl\/NnC1rRwyS55pfYlkUy8z6LN2Sc\/J1t9pkankWa71aUuTjabRYWnvTXPJBBbADP84iFUuXK5ZWA5fLu6b9CyYhDGlPWDFW2DD\/oJiAgqlQH38lcsQ+X9g7qbVY46TlimRIuXFa66RfTC+nUheFaSkc84mKJIOMDhbEhQpGw0MGC9gNbXF3ki2on\/WiMtsrFvMJnJSk5hMcEgj0luEwZQQSsOX3IwJur2UksQFUsQd44yH8L2o2wpDL6KKnbaYQjIL67x+k6brxX46rw7pP3LVlP\/NGe0rsnIfW+06qXo\/FW2f14msiYzRaXdbEt9N1+tCg39xM2Zs8LqzyusO2NjjM0b\/3f3lx+YzOMLU4WvOy3r0cakD6SArQgB004aNU7lp4rTTi84mzmA\/7IJdcaLU77KT6ZjcfgAvmwPJFgo2AgOjGFxLAHZtCM2EwSEnz7pC3OwbNK3JpacTh4w4Ox8FT39pnHEpQkhx3GHOY27adN1dF\/v7M8HEtJJt6qklL0+qFIU6qp3juGSE94lN3xm43SDYy6b8pktAw68cNw8ekGaZhqzKYMW+EqJWaTE9WF4pXemj92YDJdC\/OKzY2nz2QzOoU5Puor60eNuUMVp7y07l3VCwv98CuQ9OuECFCcjKY6mPB33LQXFSSPZqKOWD4fiRyckQHHKsXQsMVJ+undy0bxzqn96z5ix122peLQ3AdOmbuhJY67kPlSHE3lEVXWR7hItu3VnDLNp66yOiKvGbLfsI\/TkedNO+RNaUX6ibcFkPWZOPCd7539w+1Y0NkmvdPYFHJ\/m87mIdLf6yV\/O95qBg77flpxX9RfZaz39Pae73TIcnPidmjq1klxh5aPH7aLSaZtY1Z6oL5RCjf\/Yc3qAddMmvhucmi0486meDJosOFptkYsu2b7p5CmW2W1ZK1wwfZudTYy1eLIRyN5W79fQPDzic1Rx1L103JrqUI6NJewZb+Lo4MS31NSMrbd7P+BUqo93hH+FOoD+d+k7N6ovuX95qv\/S6h9OBZe+dDn2NcDacFA3tEYPMZkjuw7XDH6dr5cubkB87b1coM6nUUzj+bcUl8\/fUUe8iDm\/lhZZdMat5gN4Eklq6wQm3uPKwvC95Z+sZ705gUcb3nEUZNHGRB7ZTg8rkUJmLNu\/rPK66JNX1R2UOTUrvh6gnqIyo9lUfOQyNnYaCyQgBv4KgLi1NYfgMyWkqpp\/3tbolxQ16Kjj1eaGwESrKUu8Hg7ao1EgPuKFJgFq2+YjXn8Tfmn7tkanF6fO57y6AQy2svN2AeJ7aUDmfLO1tR1ij4DMwmCrsgIoEDUfOtWROfKWl9nxGMjP7YMxjO\/r5XGMW3GozNLX4hyoubGaSPLkTHVZPqw90oHqgSm4ZM2I5W3XyC4\/O1kUmpAtjlDBHGShjSvHaaItKvHDBZLc6Z8XKAC3AkiYwxJjfjaX1jYKha9UwH+oCC8L7PydebOrGvpvGkUyR2bRJeUt\/Z9h1Dkv4YM8Ly6ggl3l8bqag6L\/OhAQGMhNZgC5DWAeKTJIqOXz6DdkvR0mnXXZV\/5yLwjJkDbK6FIYa6rjycpsyM4cyguZzJlcTyATeVj+lLpoxajMUpexyqqyltX+erZerf4aqVg9aZlN1rTN1Mqbs21uB9pzbaK91epbe+tvIy22OCzDWmzFebgEr8Lr8EX4Knwvfgw\/jz24B5\/BYTzNgF8eU8IsYFYwa5iHmKeYn5hRJsakWJZVseezl7PXs7ez97M+9mf2b3YLu4c9ylazYxzmFFwWV8DN5ZZxLu487hruce55jnBvcv9xB7mTXB3Xz0lclEvwt\/P384\/zL\/Ae\/m3+D\/4038CP8jE+JbCCUjAKxcI8YZngEs4T7hUeFZ4V3hQ+FL4UfhT+EP5Pn77Dwoj7wTiwBsGQPRQNjqFtWDZsGV4cZoeaoXXoG9KURWcTz6aazTBb8daQsjeEgIwGzP6\/bx9xfIZffLHvBzbY7n1o790e1\/jA5cCD+PC5r8g9OdbNTWqUrCUpI\/yek0AFUYi5NnS09CRXivwXMyl5bH4l6zFVBQD22agUtHwjsaTOUVDw96a6iaTtAje8mmKSkdr\/\/rDn56kBJ28aIx2VW\/\/++gOI\/u2GvKt9d8VlVqVmyHwJBx2SUZQ+Jr2HO4gyUsDi94cZx2IJdTDhy8PBhoPbGw42BJ1UiCVeSK9XPM2Q+hwD\/Hbwu7ddVBl8JAP5JQERJT4KJKxMv39sbMOGk4GEKKGJwMnit\/b\/\/eX7DV\/+vd9R4jdHdzmSusYxoUULeY7Vup\/K+q0ljy7PnamgP5hz4LGVeeTcOlNi9g00kcrqElDCfTCPsElDoa2EhqQUmp754IttbZLqHLzV3OBw5SfuOjAOzvj443B4dGgY\/MQLyGdJxCb2\/F8hG+Ve4bFuGoitrSVpqXDUl6qoF\/zU3fCwH2UCj2wsI0mVqwb25ROOv\/dzILSQwGFAobzAR7sZFVyCeWn6fLygVilKoOznXgAAjN9\/eQmkktfpu1aRYlDBUM4524vVLMFUHCiHVBDk0VzKocIx\/MKjzhJdPGvo1eehguH28r1gI2I8bnI1tC5uQy84BSLBSYZFcUONjlyLciE+H\/b7r7Z84WaEYVuaB79QOjyoun3vgfZ7eErywjO+EoBEhoMLQNd6g6Jo\/z501hDvfSEltK1cIMSiJDcHtJbZ\/vvfRYtUq6TTh0u3j9e4J2A43tNORRRpmS3iuHHyv0LmZLDHAHSeEo\/Lda+rSlclvvHpdGRAk5qyx8BxSIMk1RLadXQm1Nr6l6HCriiNk08m+Qce9tAWup8I80Kq0Jwc24QWMX59VErAaIRoisI0xghRSvl4MEwVLig6vaXg7qJkS4WIUql0esyVne\/nXOmFHOsCFqVQUi6NWlC2LOpHK5m5TqiqrXq6mCa\/GNh23rpiC612F78qjYyNXz6cPNNZ+TymLZcDh3iZ6aGenvYGotp\/ADzMDdqme\/Z+6GKSnPVOU5bQ7Ax0gBOq2GUTiamhnuCdlYmpfV4RnZhurq5tYYbCo2Nx4d3v\/HH71Qhm6JdmsnsiGYExQnQUK2qca5vcLmVmrP5YTV2nNBLzaEUh3LDha\/TG0QFZgdNelKOjE1XOuW0svxJ2jRUNwBjlSW3gtqMKJmQ\/2NbhqW2oLePlKn+etfluFFlXNvon3A6TZ79guR52qoPdPmuZFRN4mRB9pPO2uj4OLxWouobbLv37yY62NRBEIy87MyrG0zo8e0ThGaywF\/AZbu0dRuwD+OCykWPkghwDQ3AB8JtMieEOv6DLRTJtYmDfbyhbZBPhLsGhjNJKeOuCm\/osJ79z57RVyWAvpBjUOEVp6dPScdQsMRZrYCL6wQLlaPKFsp7rQw+sLrmV2Qwy4nG5OMtl1uuq5itKKuiBFZSUapd6m5sP0QeempyMu2C4n999r8cD9aQCGAIvEGATRY7DHdl+AO4ciG2HJMn1tKp0EJetl8HcSxXU02+\/Tai3n7647pe4W8q+n8a7mAVhUO5CAC6Axg8p98SLI2F7LTNUf8+UNruoRBoYjGttRc7S4oGQFBGT0iCGFmWsYtiBQYgyDT0Dvu8Io7JpoGfcQyXSwig1OgNLl5Zpo20MHccZS73F\/QPB\/AP91TURZd5Z533TM5ySmea7EfJ+fUOHCb6qGWo31Nky4JBv2CnASfLVvzM2n+wLxTxUAkRNHQzDuefy+cEq3mgI288d0TOyFZyxkyT4ZfNwuDKQN2XL0XhQ2WGQ64oL\/983iLIudMGjkY76d\/3rKNAChXgArdeOtOz+5V2I\/u6EvGu6r2SVZonX84JakFOUapQ6xdWAsSk\/2NsXlPx9vcG2Q3v2LFp06MCxDvlE5U7HubMyLC+8rImvsZgJEYTg+CywjAeZiry6gASPPVYUEVYPbXgfd\/pPF+Re5dUmsAgioOy2KB4ZscUku5X0oJk2OKZmIqIk5zTmTccWeyaWwmm51epSMdlJf40uRI7clZX1ITAvdgOFvCWL9vdrcoxVbBYw4VSqVOA4xJ2+PC41FtyzYylBlTtv3j2NXOrMyR2OfB2+fdeOYyGcfWE9RBKC02lBHiMVaWvTl4IlyVOjOGg0yebduHRzyqtEQT2YKClVhYW006Oux3QhQW35YJGVjQy08AqW0STajln96cCetAKnu3q5iFwCbbxxr9eGWW3ZDd2+7gouMIgplZpOyO69p9ENUVkqG+fNXsV0gqI9SFARnVIrpJ57zpFC9234CHeyoY8uuGEg98g45GTrIaU6uEHg2Kb+\/pskpDBnjdRZVrYtWDurWXDTS4No4kEGhYdKAedhT3353vsfNgpGBqFFFnll1dbXXhYrl6CZ+ANgpdPIY4VCt9WCnvICdtCXk8l4C148b\/EatMXnwGKQ2moxUm3DI2LBRaEpYo+Us5Dwdeh8VjIIiPy3304PpBxgpAZO\/0ZY+cOPdaFNQlCJLTtgZMOxOXhkeCZkGaiEeRDDEnt7b3DcffHpzj+cTc9gMfHAzQSCBH2wt\/SICDyvRtaAAqitcvStul6qvLQaxvpIoPaFIElZ9FOn1mgAJ\/R+1ZLB16G+7N7eq+w2k9IlnlNausWC1dOqeTdUAo0T0\/C0PGwuI7laVxaoHyh3\/EgNPdHXtyVNWvLKUv6dWqLUsgJGLfduB+CyGhx8KoDA0xyFMYMRzQeNcdQP2XcZiR7mUdi+zJUAdxiXkVwC4sqV2lpVzqLKZttlqHmw2VmCX3\/90z19pUYOwq3rHCK1CxepIDcy56R5diZcWqKTxWoteIbh6RkmAqLaYu4ZmhDsayHimpxOu4WlZb1EE09whYvK4SFflez2t\/gHwzMeXXJmOnDqMLy3jk5pzDqdHPM89jknE9Oj0tk5GfD\/XxHc39LV1c+cTatsWTmnG8PyuddDpOPPc5Y62bk8RBGimZ1K5ZVegEXYmnh3a3NT\/wiORCzafHgrU+rHZ\/UWq8123ZKj7VtwBCyUxCfSjDjZhAWh7Pt43BHg2RZFNGRVsdjR3MAquo1eNOyiYmv5mliQEkKrsn78cb1sb7h02cv53S0xppxAsV7W+GVX2h5QweoJXLOZcNWNITYYzLiGXaYBll\/Y7PaWbsnQXUHjIiG0r8OSJUcOHKyy40+nqPSMh116L6Wvy8u5O4L++vvdbDe7Z\/uUlFoglch9A7HbmtW1bEvoHXzY30eQnQH9b0TC3jmHH2FVQycdE\/Zne4BS41wxZO2ZuTcL2fyaYp1emskJvH1pzvygRn\/goM+8Xc9CNyGCSvtYl9d6XGvDicvGWVT5PJ0hImfgydilzqR+2AAhhA4AfOt66ut64fFkFz7\/N9iy\/71Q5DboyrbLcVt9fldHIl4K6IuJldHmFbHryN1OIZhUQBPhmuCbQZJ9s6vqYGK50p7m9+\/\/xl3dSU8b4n5aO9bM\/9FuR2zWwo5IZZ6xUaa4\/O67UE0qFLvSJn5t6v\/JydqfHUSxe\/ehHkd22\/aePrptiwXA4HTDUe\/UoxrPg02dxEY1r+TG9naPXqmLdepgxGc2u9TPLjcdPtwdYewczkS6D8e7Iqwzn410Hc4VYlLRKoeHday6akBCy0fk\/\/1XP0QVzKOG6v8rGwK6R3\/2STLqBYmA5IXQ5EbxmaeA9uTI5VbDDr6G0RXncHIiKbqb0\/5CzQhtQcgycwoOjeZeD16Im8pH0HCUoOEtosM8hihm3FXlD4ZrbaiWxjdfh8bbd0oF4DkgUjRFIcQVQbMidJlOwA2ApgDuSQPvzOw3hRwhRCGKQhRisNyGYzFcdKHDYUp0yhu7I2JOaY4Y6Z5lo966CADMRjnDskghl9U3d43G5Waz3qCRCe5VTq+5rTu60++fUtyUWhTPtL37d6SkR2f1IEq3gH7uYeB6K5Ak+QIjNJonKgeazcBlGSakgXAkPNgZqBdxx7CUE2vODUVeouWZgsK5z1hiE9EsKDmZqEAnDbCb9FmGlMRg1W6dbaXXeflWni8utHuJhjc7bGwUhMz5y8sxf\/mKRCIWeE3G8kVmTLFx3orz1Fpjilq6KDdjtUt7zaejFQaLQWO1qfWOOYtW86pWLk8k30mrC1rKBNINyNYOzeI1AxWzg45yEbxXoIz0l1+11SxU\/Ekm0CHABzcKmwH4YnGVfLSOjq6gbQN6GEDAVxdZ3VmRfv8vyfGz7uE\/U17nKnvgt6XX4BdOcBX+Y+\/SS7hKfwrr+v92FEzFjwrZMR95hztDTv\/ZQk5U70bVRVwYIT11Q4mNdYdiIvAnL61ck24hNjICs2LhMMmjHFNsnIGXVBdF+PCnmNvWmFiJCddLL6KQDv40JgSicdbnivqN4acbSzd9iOlrHsxGpo5pgI8q0r3W2NCECbm6Yi3O6GiY+HH6TOPnI5xirzCF61ZAqY8Mp0tcRNi6Iz1gx7UfyEdopY8LjIO6490GfK6EhfDrGnY2+AXNBJ4AVgbmBhaJF57r4RDwDAuSRv6QmdnIxkWT7S\/VCQAezOcLAw3JqwImKFsEAl5WZRKZhp+QViCRYiGIKNFHhcCjPgECmD04k3cZgkAtkiVXnSAHuh8FBQT4TBAh1mVBCcEmBRUwbBHUyNYIGjQeQYvKKegkkAl6OJ5gEC3CMJLge9gEB\/bVqUMdj3w96rRr0UCvRZMePm5uHBqEuow2352Z0BmgjDoanes6XLRrJA2uEqupjFuHUKDkqkSBGVyX6dVBuLOhNNGktyB5ADYVjOY1VuCrPXk5plc3mQyj02l282jUGR49eql0b3Zz4+rk05RuRVHDKobvYraIdJeBj4uHh++HyhUqUki3qnLpJbixwxmmNvNZi\/lo5d\/RtHGGcgG3q4hRLPFOravZEJdQ69XE7Czh8hlY+iSatPCSe9XjarBVIoM7eWsblzatwHPnLotlaJzPTYXpznD8Bt\/\/WJ8BlvdWKEQjjBhI8diIesQBM2QkwC9YwZEcKZAIae4lCKmQWnpCQsVOqAcJSzhOInATKSO0RCXatzITk9jEhY6fRWEQJj4JSSRKku89THJSwiQOK6kkSUt62OGES5aM8JIZPkUELiaLMkI\/ZonciCOJNDJ6TwJosyjkRRkEhmQnJ6qoGd2PJtrkMkUXvVs5N4bkM8cYk8IUKIo5hSnynZIUpySlKVOa8lhYYo0tdtZU+MGjOFLJFmeq2FOdmtSmLvUcaYgr7jRypinNqtLipzyAkAfTbjgd8aQz3nTFl+70pDd96c9AFmdJlmZZBrM8K3zlm959hM\/d5\/bvPaWFl6nN9VefXNfg6\/T4q09t6vS42yjaP7217F+cbsK1R3X2RNTvsTablHtkXVSp5Emv87CuHtexav11GyO6sLypIy7k8\/G8te6IaDiizkcxwNlY\/q7++Rsi+ZLGpieqCQy+1eOutCyioaIk4XCcOlcBc1MgaT29iXZvR3tdrMafpKkh8ahwPneZCMxFEaM38nt4SZk6qY4k76MrE5uk9uiWgWqsCrUzhynbT+0tkRqSGSPM3HiByS3uf0FCPoY3vrq+MFdNciuqSX7tzXB\/OLqEgxjQ+QcSwlNYCse5KtXrKKqoMnJT0LuJ2mbL9N1T3O3Aul6jN6vXvoqZy5gbs0Oac3NipeQXtcR7bs9cjpGPxz45q5cl6cpf6lIXV\/x0PvqJn84v\/uJf\/2UG5\/A2D6v4kn18Xkq9OTzBGxv82sDdfyGPW3BrfMvYmBTv5OHWtfcE\/AB1lL1lLzi7dpdENcH3uE3DQHl\/1JPtb+8Jeqzb\/yvz2s7+cxnXb+AbAQA=\") format('woff2');\n  unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;\n}\n\/* latin *\/\n@font-face {\n  font-family: 'Figtree';\n  font-style: normal;\n  font-weight: 400 900;\n  font-display: swap;\n  src: url(\"data:font\/woff2;base64,d09GMgABAAAAAE68ABQAAAAAnJQAAE5KAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGoI0G6hGHIY4P0hWQVKFZAZgP1NUQVSBHCcqAIUEL2oRCAr5BN8eC4QUADDgIgE2AiQDiCQEIAWHQgeIaAwHG0CMB2Ruzj+i9Gb12Xunc3hhwo2h9zgYGdxnFNJpPSqa\/f9\/TG6MoT2g2X9gpAglMo1quFjbo3Y3vLua3qiN5u7gXYeNmV0Hh0HYYxGWsrICCUaXbQcyilFkrKowNteGqyLIQK7Y5SA4KLFTTmMcfNlhKjB3OnPjZ\/W9r+FnEi98XGRkRUFX99sH+lCCofinZEqmZMoLHnTG9R8OzxVvega4k6MRcsITj3P1Zn6SpmmqmGyxrohxJsqeen6xE1HO1VhYJT\/w2+x9WkriQ0uVfEAMEBliIRZiFHONte2UVVuX5VXtct0XrltX4fJc6FSooFUtsvqG95OPkiiMwPEbhdFohBHoJaoffuuZd5eFDYCRKcikvsNSXxFS+ZQlhdAUxiDUSbvD09z+WT\/AmIQSOZZ5t4ttt9t2q2RrxihxkhZoAwYqVgJ2gwFGYvzqGPzO+mCSgVofBGWO\/HoUu3deshw017eV32SVbFVOYsaaUTxMQszQhw2DD6OV8yFn9X\/a+\/ef3i1\/bkIq95CasOJCXTITyKw42\/Jc4Df8Vl2mfzf\/O8Frck3bJ+Ksif3tl0mgz0S20ytWp4pZIWgESYgohJAgYe+L++XdLYWkL\/CpA2BLbsJOGLpa29AaqUKXEkiNLp5e3JG3vQO2wcbVQv6vpta1vjr9JGXImjzP9HIHtNsaVAbuiXb5BHwjfPdSVSut6rLGbdpIsp3IdkAOtmQnT3ZI1lA77CxlsuQB4grMvI6Hetge9ALQDRjfffZwuBFcDqfl4f+XObtvb6r81FlFk6tyIhwIhdAYM8ynTR6ld9W6R3MiUaIpThxFxRqEhv\/nOZnu4gQHYp0X\/USj4kAgTTj\/aW3VnX288sEnId7KxIjZxyTEpYpFEvHEWrx4qRyUk7TM6ns3JohDKM1p\/Q9ZsxqQ0M8t1rOch5HGCCGGaRxCwBSpZb1\/P4v9fv8zu4Lac5WMU0hGSt7X54Vgdl0eytx7m1IE8dznq02tO4Kh4IVdzuT3wFENwf93naICQhUehBpyCC1MECZJhjCbA8JcWRDWkQthA0UQNlMLYVcNELpMhXCwGRCOMgvCMRZC+MYVCEOGGJZZzrDaCCOIIuKKiyAI4CO4DFlmudVGCHAwPDAJ0A6ohAcUQYmdhyG5j7nzOAEC9+Ae2wgnkAJB1hiWl+rqqqYb7U63Z1wqyoqq6SGeQAgqKCqllzFYHIFUgWK4RmcwBqsLEAx08gJK205CsvsuQMAYQbi1P+uPgLnka1sAEwcgjp096ryun00B12JyIH7a9VAPKNfo0hveGTjuO1eXfFQ8cviCevdInHNuLToRVO76L+edNQz35GXYJXj6230Fdg2Cs2haHFhtijvrLryC8xk6B+04n\/nK7Z8ZFWGciQ6cNj9kN2g+ZT4A2wr7i4M\/ZM6ZA\/jJ+BALEvLiU4rN+OP4cbyD1KHsdabS1MP4U6Z\/TTv5a9b5mN7QE4zfhQvjQizIQi8uBXcx\/CB8nIObYBp6CN2ALrBjbH83tFGeS0x923stbDqskczYAow8O1e2FPEjMeQPl+A5sydR5Q3ArLfU2cXpp\/FftB929wXA7Mz77Q7Bfb7J+5KWTWxu9UPdLhXmX9vtj58yfzj9bqex1cksmpnEGKZvSrGcUr\/5Ddln1bo3uyDuH6tTp3N\/0NfexLJ6nAK7IuQz7KEf+kb1ktadfDzVU5CGK+fHdz8udQe1NqX84w2fnN+\/kid\/QL9f+esS8Py6FGnfNJWL0y8I6jnYpKBv\/QfDWCLZvH18arMuHzNu1PygPtCImpulU79hPpkuXy5OCPu072uO0oPr11bQhVU9CR4ak1Etd8N4JDhEOMawJS1ca98\/DzT3F5WsUHVXwqQDn9c6Ht\/rRJ5l5wlaXXrmKpuFjHhW5hm3p1Oj822mKJ5yRsGj5bOIxXPL\/mCEalvbEIHqG5Zn+U+xPyme4jHvzdSdaDb10bD+CD3ReE7rgdICMiOPV7B3umZXJMr7R2dfy6QdXqKUxsdnnMijM6rXbfeNR4eMHVJsHU51R09dspVjnqo7G51FbI\/7GuqVEYqJmdujySJKrcXE1BPDGR9OESjYOHYloYURQeB0XMKikqqy\/oRg+sG4s8R7gY1jQUyIxr6avHgDmRz+HLRtcMOpJ1heCyb7i8A7TjJ3FB95v5VhbaAcN5afKwN+hefCST4c5KL5\/DMvLnvEuzKxFDX1z0340MzoKL\/IBvJcPjF4vGwrXpnXpnjoodun4dWxzbq+IP5EkrKLf7KUtk4GfEgLi1j58GvtaOltO6eEG0JJk\/ndNkZUpnBgS+Ui4uYjWe2ndIKvJd7ouWZjNME0L+0y0zxpgAlvAfA\/I31LqWTjFo5ZHHTKAnfPA6Hz38eO\/x1RbPf+wNe5CEeaBc\/RPZF+XukfUCHwUCHwWCHwYiHwciHwakt5w+HygdNnlOxMcWngWt3DM1VyO\/D38azF9y+ozlohszskSY0goPyvCQh7ywZMBMgf+bmOffbNiWOJHWQVSbQGvXK9czf\/7NzWrX0t6OhbuG9dI\/J8eXfCnYrgq7cIbiE46JDTzrjghtuohnNjlwy+F6++qtLoDHe9xO+5PD4sEIrEEh1Z88sdGhmbeO+bXwiy2fDrkRBcPeDY92nKtBmz5swj51+2A7x6u2gMhMURiCQyhUqjM5jjFkiW2Zx0vfTgwwKhSJxJQprdkpmUKrVGz2SB0PRX+AA1b4Hwy+ldHYLMUf3VD8A\/1nE7wO3lrtAYCIsjEElkCpVGZzC5PD4sEIrE0tpg4xzoRjPhxCMVNAbC4ghEEplCpdEZzHFrWM9nc9L10oMPC4QicSYJaXZLZlKq1Bq9Uy2IZh9DI+MyGXb+GTvDml3tojEQFkcgksgUKo3OYHJ5fFggFIml4y1wHX1DI+OTNxGPP3BH7AwigV3QGAiLIxBJZAqVRmcwxy2gA2xOusbjw4IMEYkzSUizWzKTUqXW6HXmG2eccca15KT7V4DKtyADERPOXy4AOR\/qjDNYxZHoypQqtUbPpEO4zBcvG84NHUFjICyOQCSRKVQanTE0W5oJ61CFk66XHnxYIBSJM0lIs1syk1Kl1uiNt0ACfUMj41OTQfQwIBFIMKA8h1qYMJ8xZ1cMjYyXAlIRCLHGoLJ7HImuTKlSa\/RMngTq3gJhk3q4HXjdKKUZlqXRzK97GnQZoBkdqZ+GRsYtg6bO8zVAgio0BsLiCEQSmUKl0RnMsFY6bE64KwMeHxYIReJMEtLslsykVKk1eh+zMqu1RLa1MI1C8KNKR4blAECLG+7zRTtjeGsXNAbC4ghEEplCpdEZzEvPgBxQaklPfFggFImlnaEGDBgw0PmGqHi6xULMsueQzvznQnmaArxlbQj69b7y02a+MrP2WqExEBZHIJLIFCqNzmByeXxYIBSJpRsAjUBCldxbOGo6+Co34vRTwPbMdUTv7xx0wQ1rXnL9soAF2BWwG2B\/QBfgEMChgMMAhwOOABwPEEyQeR6hgaZ\/odFoNBqNRqPRaDQajUYbNKLRaDQajTY83LUAAAD4aKoRqnmoJf0t2M3+uixxiEMd5nBHOL79u7uCsMipBAEZBAABWgE5CEPCVMgD8Xmz6\/91mnSUFwuPRF7ji3CW0F30aApl333woNA99KLqoc7XWzbBg0KbBxqdnpQfXLqLR4Ik\/uOjd\/xm2iSnfD8R3g2Cvb7nFcx+XJQ5RLaNh6H+SYkzGL+SQj3Kn\/XzBgIvXG\/wvxo0BWS\/ybhHTWsOoMCzKykpJSQHTFdDipA0ywNyd4R8TrW0rtrz5cykzwV\/W+9Hv7A4n50G0VMKN6Ayn7sXqxSh30eAB4tujwcoJVQMQgHCJDHPFA+d52vCh8apC6ErLAXpf6MmXstP+cQxKqHCBpplNz\/JG1Dw4tCNcDQJIYWEgLcDIgJejdBMYStnSfm5qWoNyc3bkZlwNRKeHvAMxOZH4PghYZS+4rDSztLO\/V3o3OU6t8jzSY86w02aKmK5ZdAJ\/lMrW6hWJpWk71ZCxwEqJeetOjFU8kfjbfgkj4pHJ7vvMQjk2Vl6SwoVtkpgwhW\/gcl5U3jmyaaRjMpamCSyk1u74ueiiGFmRIAS6f61SKKUXrYLxigj5OSIrDaKg97PZ9yWG2VKLYqCMFfamhHuO1eVNpU3l0izWFqopYhnJmeRiCVrUhMhiiMOjwhbPH0VGk15JtFWvXguowwjq1QoU4Uyb7KS0VKQwVEkEERkFhSFSs4wi6vBYBmf7w2dkAcdULTi60oJiRX07R\/mObQ4fKSCyKwjSQ3wnm\/JoOfhk0eHhkoEOoPeVp6lHE7Nb3Cz+WsCSs6SIsyX1VXL1R0LPk70AST+AJS9p8tW\/zrtnB63kiMEELj4nDiaRNASw\/KCHFebLaPd6SHOlaNr0Q3Tx+agPL7gh2d5u+BLSuksDpcvEIokcghGUFxLGimz1WZ3+IOhcKQikayq+dfwzkjLrLZ59ej11aXrd7SQGRH09FUDNkrbZFf2Unly6AjsBzgQ+ZVo3iGwG6P1rdl4ozDv6wFcAEAGdTugCI\/4EooGULbXDnfM76QlAP6tuCDBZzluz8wpW1CtRtoMed1gihWVc4E6nT9XQhnM9s7o9s6ceO\/CUbRWnk6vGVapASlZp\/1nDACB4PbrfVte2KGI5NO4E6W6mdtMn45WEwqDVyogaYigh368zaNAoB6DyVIttlxUJlMrW\/cu7NJBjGP84ptifbG52FosFecV1y7e0UJvOa9lc2tGa1UcQ5oiG5cfrZSTS0NgzMTXxdpiY+y5f1b\/ATYBALHcjgHsyMKRy0cuG9Y6eofHZgHgm+evPHrlxSu\/utK3d773N70rev4rxvK9gABzAFu7pB8g50teCOnrHZ+ud1jvlG2u+d\/HTvvXf7a6bbXdVtlujbUeuK\/PRmcgBKRIk6USD5+AlIycgpJaPIyFlU3CBOF1pdlnh\/2eeD4IC6YLIXfygGJBJaqba42ZMsw2mjyZH\/ehFjPZbP\/Pa75uPfZ67E4bXHHDVTf1Oh\/gMwsc88jFkPjSQ39ZFhz\/+cTmkLnVQsf97jd\/2ISE4uDjkiBJSAUWNg4JIRExJq30NLSMdO4ySGaXKImL2Wu8RvHIlC5DFp+iCc\/tVylTroLfOOFJT1bfwj3hDBHTTDdXExlv0uAIPzA9HHkQAuS6CpXIBD0ImcmSOvYCBPHZB0lSAnauRKYkBBmcn5YM9OtMVnIPeCIyHweYYqgiFHrMqkqK4p7nEAUgqIWf6QyQvQZU\/QEcBV0FgKKYOCHsq5C0CeXwFjQc6xh5sjbkKZ8d6gtJKhG67q\/6qu\/QuBocucNSSoQVtVJqiAxizCvqpZlRgBJJTKNmdzvCiWFaygQ69PJQklDt0MJU8+YuDgxjMQ2OUZAKjbwOkDsaJUcvnPIg1LpmcJPKAjrTxXBkqYBNasGIzjVOVLfqFgUNzGdNqSlAcgkicgULMiQMZ2Q1bCg792WUx9o7FQXLAYa+w1McTcNpaPvOefRSWpiBLnu84dOiUx\/ud\/p22yLD4igIcfnats5OohwYpiSJldKyINXjtLv7rLs4ujBYPAZBJs3Y7rCJoDA0jlNTrZsss5O+\/LNx23f380nMYYwa2JE9CkrTD3TGfucVENUNpTwmD5nznGizHnM6MKlZSdRd6lEf+L38Lpp\/tEDVRhwbWAUdbXt\/5JQLZ95miyABlMm7IWAyLKTQZxFB8\/N5+hOrfOk\/JTEzPSn9Pv5S\/\/+6V7pmxZmZhn34JKL4Mfe1auU56hUYZc2vMfvSnhFNtojwN4JVkz4Z2\/hP0tCnffTGrOhCTBCJu56GbSLAZtBIZmAp6HHh\/O1zlOTllKyIGA7Yn2vLSb+6cT0UFivJmDAaSvYdw9AwjzgEVG8MawTYGvKqZBv6zXljABA1ylTyjmTNjpSI9fJkxe\/4RUX\/fvwMjGewYdot6RYcIt5dUPpbdS3XFRtRul0OuFO3qbA8ewCj0iWcKHubDoqNdtH+5kFoOYJkK6vUleoozWQsufA9mTUulLq7w2KaKBg5gnY\/dOSPAIc04TbtjdgQxyh60N37fBu6uKcL2kNUIxJlL2Kb2fYNUDxIE8WoLaRfBxMGLPiULzvbm1ekgToF6xQnqSQcRIQG1QH8hn34bD6ctQqcUlw8EhAWoetn24CHtetVtfTU8Mmz9yinNc9VOmy5dT5rx2PULDnjwoPrlp4DAas4E4jSvMOX\/tbc7MGlTuXqLyrvMWpxK1bcPtwRr\/N8mEywVd4sqKaspigQAO5xC17MqDu2VhhMp4DrxilcnaenFm98lmOw+WpOaMosrE1vD1xdN1\/zh7+uO2ye+8JCIAGSIYrrXbS+Bkf0bnzmUlN9zcWVfjjpRdna2KNvfY5UfzoziGFIihukpVQXkCOzxUrD3f2MjIWxiX7zqG7ZRaAmGRPiYopNS7epq\/3Qz2b8Fi2aqa9nL9nToU+378KGx+g+MepuePUBTBG76MjRCDjbcHIBDrtbifDDqemiGsLojHRGHLIG\/Yy+0DuLvb5DK8im6aIc6VuFjdbsp7nie9F1KnkGigXJFkO20GrP6wT7zKxlZ\/vOhiZpxg1iq2Iq8msKOj0vNSufeuO6jU3nzboFTKn3xzIEQEn9YZt7Mr\/ofdnce7PU3nLWCqcqK9KcviaVho\/h8wQy+t4HKK5xOvm+ZgmGQ9gUpBgMCGYAJpSWynDYIET9KsWLtC2CW58ER4SGj822tHNPb6QMXQRvxnFKjb5Ja\/mNqXIzHqYOlLyXVaefNZFk8RoS0faWbQ2zkGaq2edc7DB5gMTDKUG24OMldFfFOoaoyRaORVm5DWjkXKfFuzazYHiU6ss6AtCLkvLdMveoTMnIdQlmLdoZv2w4YdLsbGK2raEmCN21h5Zvd5u3OSm9OMbETTPJM\/Xg71LjnFnLzJbX9RPrVt0RqYliZsKY393JW368NN1zu9MWuRDcCqdxq6\/JaDXWw7cu25a0e7M2kDP2Zua3R6TWSYkDEYVaL4x4ZIsF28lML9tNpXpK\/rqR093T2SHG13RXGv7vJphWTd\/1Cf4eJI7O5vdeKYlTchyj8uRGuodTs85I1ofHumpO5ZowHNFgg0339Dndpda2UfoyNxqwQJRojIlmim\/bKGup\/QcuJiVvVd87Q0n5JlLuaREJ12KqTTqr3Jb8bZ0sVnCKM3c1di+6BrImpvdF8HrJv\/FHP\/+FsV3GlIkhM1VIU6N8oLx1Pu55wCbJo72WebhfP1yfTfkX7VP0EuJS8Glbjfrdgy8d2g0mEzrQbWUMZiG+A1GqvS\/LqNcxRFfjr47YLnznHNL2Z3IsBHthvGTCWIIuY\/LeGNOp2aTbdChIGWKNv8FCs6TWAc633TPhrV\/No2nIIycnPt\/TgEYE2WxThfNuuGmXht2lPra5J\/uHnuvzSCtklD11IrvQoxY0O8eCc03Ev55rlPm+QhiRsRiDML+HIPpP\/v7d8hO4z3HlzWHDQnVJVdX+INR2PaGtS\/+whn6zSVnjLePNM0I7fi50mfq0tNWsU+CcrtY0KL+6dWJLmeVlRhEJ+ZLVWSjiETfvZ2Ww2Wjxe\/YHk09FDao7VCrvsphTzuspx2KMNmF0hTNuWwiocyr\/oA7olE6n2+EOJD2VCsvouvBaVYrXNXzIRJaex\/oXNb6fXWm8NtUQHIczFmM+EsXY48vqHCFbDIRrgSAlEzEhzIp1k7PbIwBMYmmL2DKNUROGerLxjogi\/poajED3GhwJD\/d1xjqyPl3c6RHCZ31B4NLgAPWLWLiu3icODHUoE4bk0AQx6FsnZpzg2BfSea+O830o2RwiJWdhl\/Iq5iEa1Ij0+9htS6AxcHGfBUMYe1VBalZufOUhem1H+B7ikU7dzRZku1c3WO2FdWB2rOFIrR4JOoNZH968uILs7c6Woh8UTApX7OMHhMS3nZ8WEsmn3pOZVZnKyJlFcl\/iJ8476nnnjiRr+FbMp2FXYtEIIG\/thBYVbx3w6PeCrVBQmTOwb61uVnPUtZP2UemgAmuXYzf\/uXkL6bZ3g7TiIXJUDKE3zKfTnJHXE8z9ZVG3z20rX9IG0ga2PUR9\/2AoluFDN79ZuOKN45w\/D0FBePh1UzVf6cNgsWswhPhRTO6r5BvPoectHj1OJsyB7dh5gtLjGj\/p2A6WpVfviAX2p1Ll+7fHqrAWXtTeQVitRJQhcc13GLvDEeOqhQ63NMqxmhzEloi3VQjCwy8mNoa8\/dPqgtvGcGIDshGKC0xu9nQcB444fZlCG4FLi2LoB9pCM2uGN5tQYYNfN1LPu6VLUakafJueOhCL7Z8+I+DoLaWcXhbSHB3rNSsDhYLgCoe9OxIipuegpVVNNJnPYt9hIVf3WgeoGSagoxDhs\/aj9g0+fJ+Kqy4Zn1lCa6NNnns6Zd1k2rTVWRZcKNnzbXwprdj1mPXabS8hFrGsDEm5+RHxBcL26SBXHggP4+VWv1OE4ksdOQFCn6k22+lDX1Sw4P8FRJEXLP5\/oXur7Zq\/nJgaygOYq9HAgdQMT9ui1dXbY\/79qZT\/wNZoEnG1OwxQwsbueQR\/mmEe1ft\/p04fWNgWWdEGhNVDrpqhiYczJzmG28GGhvKD22LV8XV+14E5c4Jrjz+K2GdRuu6aGrJ7DmWXvNO4OhLhcSx0erhN+fN\/nayFVElCK0uGYPR8mvE8ZgtSpkjQtB1Ug2Fi\/nbRE254vNwJZjS2vo6OAV7OLVkWTsxXWOMfDruwY10k6uaIXPlPNTVfaWz+g16vhU51f4YrVDG10VNLZJ\/mU0eKKic+uVoWPsohmGyST0a8pu1Ak46Fcv7uPTU4sZoyx2opVBUnrRnU5LedArFRXtFWP8tYLcINmw4HqnDKGjCpYT3USNGm57Q0aJTK0AwleNh5A30K\/aQTEpPsc0lyjn2EGMFk0YgcxQKODJufKbt+Tjspcun+fe6i8iWLgIQ5RD45Z3DVs4bAR68Pea+GB8LEufD13ss7Q75T7vNukPa79yJc+ALreZY94iQOPCt6TgRIjL8vsb3g16RNlmUAO\/qC6Tm0kH7KgdvpoSq32VrlCW0Z49K5DMI7yqDeoZvC0QeV\/Bne8fBYY52NF5AYWGU2VcFa8ycSESEHnReeDCbyvfOkEgPTGByXUGhrk+0LQi\/cqKhlGL6430cKanY3hqFZqdV8cxOpmeNwqOc0kJSpyiBvd20ZW1FT70HdqoYixgNP8WdKh5hN6dkioYMtMQEoHQlDz4+OIMN42fMPAULWksgchx2Z60UOpcKlEMbVakEcnQqJVcE947DYogCq9ENgdTOZGjWvYymvRAl5FaLY5yHFMZ8CgnyQ2\/ZOkxFMTK9OnWt3IHN2TiIR6EYZPoyMjtyIQPckFteAj4psUoVLIYjv3KIw7qp8hEm1+S2+8TElON6p41dmPfqmRrCeYK+SrFI25nY517s0khQEeQ4siYxakGqO0uPxMbXoWgJO4A6j1UQbeuzdyU1nJaT4TnjnNfD0y0JbJrTFMziWmFim8HBFYRN8PaJEyFodMttmQ1prCRKJyK8H8ftBYmYjLHnKuMIojnEjFnkTKRdEMFwY\/dOkYBjPXu0RwmhIJKsFvqk4KGOVk0U8k6u+YhRw\/YL\/wvE5PrE+fc6uJ9za9gPx1BhX0RHvTiTNnpTjcrvRBlivbRFtQ1z99Efn5jvPiR3Hx3oCp3O\/H8PA9otqtKnezJNi5SqeyY2h3qpm0FqEgzJ6+W6mlqqvGJXRoqfvWOMRqkBXarS4Suoj3DgXZcXgz\/ZNPw+WOk\/FI8POMZEWa5Jt+Y0qO\/Bjuz0r80eWucuKz985UnYjQvu6MOkwDe\/\/6L5rUM\/+KRb8goeeS\/AUsMBdJDdrc0A\/EE8ps8831irgKy18DiPuGE9ONhv4xog9xjfkTLhR+dv7MuUz3Clp44\/TDAJLmVBIOEtBwZOIIhCT4HhUIi9XqcX+gQASwFG5u5JvlGASi0eHEm7KJDKNNdiK3+JiTotG47JhT4L\/ITjMenUYDvfhfXvgPWrOO9zxdRVdZ1QAgIREsjrLjdMXcU3cruLVHhG4\/NLPmounLpzSxlJw8djPeE\/f2r4ut2vNLnx299Rrent6Qdol3PHH5o6bnbvNR3+8OMqy9sV1x0HVy53FjqQVuobYlfs+4jQXTlw8of1lLVGqCcgUSDcKr5aiazQwuLOe0AuPPyvI\/fk6n\/Qlrk5noQ6sf0K5ly\/Yq6znB42y7M8LGLtZPy1Sm8GlbqGBzaJEIhYVOwV6f9DY9tCzBzk5QiHH8CRSAU+6qz1m2J9KeXx2urJSJ4LHHPLucFiwOPHgPyfwUW2rm8dBM099MB8fBjhKb36Hv6f9QNKYy6ogmUKhvnRwHTHh6ihrXIjoq+RQSCWHKhfvmH2Ob2KnUEBOF9vyU4zfnyLbOLZwQCeH9bWlhjQkLd6qxUphslRYWNyXOWCuNWTz8LhY6ZEpUDv1wBjVa9B4rRzMHCSlule0j7enbR+U\/vB\/ACXpbG+2VXz4\/voavsReEbPZozErx1ka7i9saERlWT8\/q8+i62tVaC1JYjX1KmBMt1TCqsSUhcY4a62xIiFG5bUlCxt+s4kYzS2Xn7hybHGjxWqo34xqAmitSI9IbVyeTSrlWQX7pF3BmrTJqIGiyo4OdARNdABZurlZogmgGmP8yGeQF1LB5dViQlclVpWroNz67EhJrEG1gSaJGfHUOTTaUOKBPPTvedzvW5EyagzqYXXQZjTQUsPpDIFxI9YEuKdovfxkUi\/TyK5WmSkL8UTIuYIuZAHyVmONSs3dUbpX7jZ9IH34NfbqwAci7TB4TJPaIV6S0PEqbZBUZoWioiN4ScFTYjRMmbCwWISAifqPBnRP7XLDB3eIVJmz6usz9DwwiXw1c+rUSgfi\/Cq7cEUZfXnd3zNarrF0diPECGNW+KveoS+kn32iAutoCr3g2brzUwuYx0qmLh3FmCyaJHMWvs5hBb4NvSScLE4U5VaXZpN3jYcJWiHrZGkJ45YtVwiCPW8Nc6s+psv8XLgnvsSgOwiGaHktL74RmDKQw\/qWyXyPme05tTD7g0+R9wOavI+6fnBlFaosFkTjcYCrNISECqKwIsvf\/wKn+Cc7XvhOBoxVjE4+fOlNLvdlIQdz235lfMtkfscYcT+MbwE29dbcj4emJ1NIkbQN3KGZvFoF7DWYJG2AFel9RCnYrOKSHA4np6R4Cvsu\/UJB0QCdPlBUcCGHsKqlMquWIKxamdSmBl\/Tij\/qoAuezVChuiJffoPL+VjE9qRDdXBBBJZn+ftvFb7C\/J7B+I45RjGY\/3H8g6GCA0BiQubxzM8VCGZBD03Gh2DWTs4AWu\/ufs2vN5ZPKHpurTf\/Jl4VP1dk0+ck2++qC4MXBKaIW68tdxtkNuHtzYl1pJVIyuEIhsrDMcWd+cV3s3ZmPbeCUixMBgIlu6unPQ1MHir9\/Ur+1ZP5+Sev0HyYen8E8J74mgV1yx4wx0zrahjcK+T2I7+7R9wHAendfmcOqG0cUqDr8pGwLHxvJAu2PdwJmOibrNeSk8u0IOwz3LdFAmw8IkAAA2FRZK9yIhtEV6vfsa3j7wkE+buj13eI920b+X0+L7\/ftkFIgNZqQkRYN2SW11ewWzd+T3xjXVdjBQO1OI4WwLwMzuE0ODChWfulFK3cRktGjXk2quDOYMKX2gnNATjtsIFB5i55VipCq9pWCXRenalg9ZyM0UnJw5XonTXurZ35w5OqIlQVXnPoKtwxqK5e1o2aaWYUnK3+vaUbbLMsH1ptDjZeZXB56h8TaX5lwt73cIj3kKmvx4HnEoSU77QB4suxH2pOrmDUK3XH9AsW6o\/V1emPLliQPNbFd+lbF6iP1jlFbT4DRFtluRZXYu\/sODLDSCHT42josbjiephckLsks6y8MK4OKzYnGrpQV2gjmmpAN4fD6BZ42YiFuInM4utbmnN9hYa47ykdrsK41yB3CAUupULg4WcTIExEI0K5VykuM11hW+V3wtJi\/iYhq5ZV7Lk9d93fUu9Hk1tWWghvIZ9LUmyB2Mbk60Vsrl6PpiyypV+8yoHtBlwVYxkoRhIlKjyb1nnBx0+jIViW1BKyZAhC0fMlcRpBkwUvra+iOAqwMOotZfbfO5ctkWnwnuMw3+P3N9r1qDnuDsko+r217E88PL44yWV+Huq3Z3i9Em08WPmPzES\/vI62bPZWhup7FvNdwe56iRQqbKW\/nHnxFT1PqtgH9NmDHRkenxD0ptk64eoquNNmo1VdnZgt37WqOlBVVWrfD\/lk4hCKyl32yiBpUK565L\/3aKMCNjo0asoJl2z9Zmvno0gIFqamANRV4YhjVS4QWOmIViQsmC5AdQZOcs1mbhJWcSuBE6ZZyaqVKpibxCKYpU1AUFJLQJViaolaSWih5HuYYWbUCTq5BX9fbpytVM9QNuxAsx9lT3krVwmCK9c8q9Ee1Hc\/XLmfPKghfNoZXYgB6ZoBBm4xLqoZDPR8CNxGR6S+CxWdKSk+UVR4orjkDKh++yf0J6rjl9HLCOIuSmDssGN4avLjjMukYcws4Jn5PB5l4Qk0zeNTo8U3L93u5dVR1HLXU+LpUnGdWMSPc+l0yxUTNc1s+lDaO7dX9+XyTLINMKeYKll7bs\/5I+gm3CG1TOLFiEnf7\/JxuYTY31BRrwlxm9atEAWVasKqVkg3fkVMrMiuqVVJJK6EpHbRLGwWmJvuXhAznuHcrPkxlyTKM9t17r9UBMVg4HGHAjdbsarCrmEa2SrqX3e2xRsRbpqgOKU42XV+7wI7WpD9ct4JF+Y6hkgDIQmCBMTSEPElZragqMWGHRvBRvqwSUEUaNji+0tMeSNuwv3wlsKv8NUi9+itPbmFPCj7cChbSyHXfBu5\/e8dpFfBnPHIQtuBBo9nmtcWsOo83rb8xtf2XKZsTONs9ACNLcgGZP3I7WsBn6c0T3SQFmutfSR49cvsAcePILeRW4j8tvyf03cgO0AHD6lHVMlepBdUfJPjGHlv\/q8T815PQvTHZfRSt\/Ldkoz8N9yw\/K0xoGf2PkrfRy3YRZH9FBiV7kk2g9ZFo91RYbbXrGANDePHR9NEI2OiO\/BfqPlhyPnzUM8koYHLsoglLHM0hYFqlohZltJ7XLVYrOZyHKc32mFO7IFwsLuCWWu+zT33rzx\/BOlBPvj93Cz\/GMwSD73gR7KVtp7czf\/IH\/cDQPSD3pRjBgA2d0cgU92xuLx9MfhI\/TlF6R9Llywc5W9bZBwt\/6jnSMB+ldhS0svC6buEwtV0nLXGXALelufMnTs1oJxcXc7Uul1vFyabw2Rx2MCP5TNnKMdngCw4e35vfu6vJ1RMzBhNh6V\/Y3hP+lH5YsZlwPt9ES3ju5yC1IoCw7NHxzyXx1xW3dHasjt7sB70s9tNjVFwJUAAErziD\/6iVlMPPvlz\/n3yl5Q++RB7HmqHKTe0wCO6iKKxQ8PHjMUKxiINgp+D8beyL+MzILUD1KhyTHhD1UNHL9V4RbW+rVYG7zIBu5mAS0zAZE0dM4jG3fO0+RwUZ3AH5\/lRzkvjDB0uwy5yJGojzxlYHRs8oQHoxRe48rJjWKrIi3Wbrf2IN0EfGHw9YF\/GRw1rKg6MxrbkN2P8iwEpscFTGjDwTWj801jSw+MBmtg82YSWFwODxAYPb6jBB6EWvxFzXgx8wfz50StZNCxLxklru7TXSkezdE6U13X\/RjPgEgBnI78+mm\/NL\/xOv\/f4g\/5Y60+wGTLA6\/0b5uhU\/MFov0YMSHBVngYeO\/aarOH3nOgNzJQU64c\/cZV3dT2CVTUGu0ntMZLWDFmU2flNBIc7YDoS9zwE90yR1ieSJ6zpe2ogbk73vAd\/uxy6v4q1WLmj04t8eMTgdzgccf8\/jh8BGPX10M2VzsbR3+ELW07g8X9pud03j3PHUX4FgGFAAHrmqf\/mdEbYMHk78rt9Ju337RMGMhxti5Fkw+1Bv+R5cVN+r++Q4sYoZt9woQPZ3eBOdLW+GWFDjVJoqjelDSOtFvpr6hSbwbZsu7iP3dzx3BupTuqlgg5lOMQhMxT4ABfX4G02gDS3nwHJGR6Qkx9iu\/0Wl6TpCiqo+XtY08f\/lvfJ3f12SHPWDVhg1VsnJO+Tu3FUpcZX9iQB9pCxblmRdj9QKOPWUGOsxqayBcR2hYC28MDmhux39axoRsthgJeyFA\/I3JaxmvRDfcrhs\/AK9CsVisgtZNpYxoP3wJ5m\/LZ\/a2PlYoi69g8sC3UvhTC5Uo\/e2jKrdD7y7PPfmGwqGK7laQGSZOfU3Z4pAchZsDnTMpXQPOX8bmc3PofqZ0HuudJD7J3dzHUDXeRId0B6dQ5bIVU3rHj7wI8srdaCrp15i\/7PYXy1f5EQQFDQMcUA6AQA5OlYOWXIV6bWAkvtd9yDMKW55Dz5K2l87\/ZNS1vbti53awQNtWXYvAuuZrP31X7e8m3YmfVSZ6bjtvjP4mfhvzA\/mc+an1kEhKOEywk3ED5FqCA0E1qdM87Djm3FEYUEiQeIU8QriJvW+zYGjZCcpMWkA7YTtgu267b7dqo4ijyO3ECOkOeSWxNPJV5KvJX4237H\/tiBk1SpF+UblCrKZMp0ynxKh3\/ef8p\/yX\/LjzleOF3Ws4t\/4Chz4pAQoSjFKCmSJ7vJydInj8kbEhRctEZrb21a622zrdIaMGMSulDGQ3gS7+L\/OIMlbCKEBLLAQUFAE1GlatrVpB5t0gE9q7iNmcpKzNpD9rS9Yu\/aJ3bK5s1jXvNa3ii3+7GbPNN38F4\/6QuecCEsLGV1lpylZ9lZLlZmClOdcF7P+zkdT7zJhS\/EBnthy9hWdho7p4GG+mf5c3D+b9VJL9xrro2bxh33n77vVU7QTAqoIcxMvuBdTrNOEmKjPAnPyZu2zr0wzxIrrjZd8C\/42RbZ5DTn2eaDfugJz7mi0XvDQLeNBHxqAeHqXw\/29rjoT\/N\/Oah61wO\/+GsNmw3HaQ34tABynYPFkf3CQBdMa36f6jDkfZ4qouJul8xL5GL\/HvuK2GvEdvxVqGN+Jo1ogoTp8x2y+mHpDnQw6mjgcn7izVV\/QUkHz7wr43f\/GbZfApuunAskkb+E9hjS4akqUZSYNk7LJVsnPfr+Fe1Of2Hh6Xe73NfFSTDW9vSlWTOPw+HzGDMr30jFb8Bl0fUKUwh\/nEAIvPk2u86SdONUb0Kj0y27LyZ7B\/Lr4LVAMqxEZ\/+Y0qpYQLWn7f4\/Hzyz7OUnoPk\/BlSzp3cPF3mNUuqMEiBnIq2o4r0sWO11MUQimmSN1hClbz0hE55zaU+CTKVQwLpB9KS2m1ET03lw3\/Pau7olkFNIUwwRhLnVvkJbZ7Rb8F22f2XZi4+nX\/x4RS8X9Ftzb1rTW5qDCMU2Jbzjuw0a218y9C3lwP8MkrxNhDRp8rG32GGHHXYi5d5lvRYGbHnwygbssGuIQMvoT7T7y8vHUE5zeDQa\/xnXwhxiBDyXJDsmsekSUomoVa\/M\/A8WoCIbDeU0RdKNotkufNl64tKzWXbEV4d7ms16EnwmI26PF\/mfXiBJPM2Ac3AHQHrqhlR58W70c5CytJlfJD\/hfOZy04hUnzE6961lrZb13SCkZxv\/EIhBLvYdwGX9OeD6km1Pa98OFtbU3Sd2\/+8y5MrTNC5ZaEqyPzRXCQ1UfEqlpRk5XWUpaaNX8a5fnUFFzR7BMx2\/Jp2Ghj2M34\/S7p2MKNGN\/FQMJ6mW+S21JTlKkqCjN8MLneZwAwSt7hh7vJMmz5uCz7U2kQE7npUEHbfDVWNQBUrkCL9XcXk4dPKBe\/jGYA0AsSPrAlMtiDL47BM4TYgBHJPE3UKZoZWIVSBOlP4E+R1j41prHfhpRCzI37cjJ53dn47t8RUeiJHAIlVR8JOVr12iX+l9\/5\/rK25vjCwz8KFVPQmQ4u2fzQCcgRAjJGBBgBAZajUpIb3dcPC0rq5YK2pNw2y3F8eyVc9lRVkEpF4mBgAVAZLgnTEC534\/78wRtealSUMOBBBt+pd9LvxUF5Jb2yLHNZoDiFSA\/cMZuIteakeqBVJrbJDt+Ug6OkcSOwPdUOdPouRcfX3AeTKn1ZIsfuEoEdSniSQpIXqQj51yaYHT6wOXTF6XuPLslUPJPeuWZ3D7Dc3C1PdPxE68+sYUdGvDcrhUA9u\/rtIz1mNT2UEP5Vsl+IexThNHWypTiXiBwwbffPJjYJeBEJVxNXJ\/aS8bVyQYP57xMmc3FLAkwo81KkVQpK2v3r+ZoOreTPiXlwCNx\/7T1hToUb1dhGkZMhr10afrg7fCp6EJyJouUPc2KdYCj6lNiJYDQZSPnKiP8qBemh6JVKbHfnd+WBe99\/+evRDtFX0R31OT5gtzU7bsoEaPrQv+Xc4J4nSFMlAM3gytfgkIWbc1TeN4LgHHfv4MAsCqSl7iSx9z9xyNyTOptt3cYCd\/M1o9stwtGq\/2XziaFlJSpWDI71+NGC0roFpRRxxpNDwFPILbJnA23Y9lNdSFR8U9j29FYkWWU60Co68mMfcNdrRZ6ddhaoOCi2+7O6IFXCfO7Qkl9qyJ+biP+Mhykd1GjcvkEaJvaVycocryb+iIRsIAL6wTTYwGbX4De+1sq9b+XGgaMK2C6eBaiwa540+Fbk6S9SWOSwyhZP\/9pD8afqqp+PdaXw5xh0B+6AyDLrfVP18Mg7GHN+zq44NsyMxfnQOWqz\/i7r6r5GzjRkDvVhyyTu67vbFjSPQZxSJLw2CnTBz+NKxjuM1dQiZ6YWPkZJv9HyBbmiygWH7CEIl3ii5tGE7o9Lpf+UNzM1RVICKa35800FYnwUSQFsgfrDMan+ywl\/Vl0PdFT9Pud8\/DpvNHHeWEClBQ3okAdAJiCFhrMmPrJBtOy3QDbwbkBlNfpWoEJAbMbLxJsYo+zFZRdanVLVCDgtlhDjwXgbwNQXCngouWur1koTTeAo6+Fk5\/ltGiIHV0jL1RId0r5XBEMVTp\/qsPmK4iSMhA1NG\/Evk90BupmvJPELgAY3Y4CwirEQi\/LzjlK1GqpS5gsLRQArnr2SnVEE9FW9S5HeZWfwswnfV\/7os5rs64ORKuLkxixaQSgo38rnyh6+IHpYqUtXBNlkeibSOZhmOyhlpRSKcnTalCJU3FsAku3CrjKEanzMoVLYnSxcLrL20tITxTdU3M\/GOrKd6mtsKQDeIyHgvALYWJcZe6jn64EAU6AoQrCuLFi\/BlQTkfxMvlsXSIjMIYC0uYZrawDQ\/FmfRDkQTZoYrcwusFTYVaHwmM8wvbjvnGUejgPvb7jyrgLhbzYXRiGCNhDsfvZ90IfPy1TUxUPxPz7eUf+KsQlg1\/2qC8FjzxO3Y0H6hwLpw91AdzGiFxtLF4IR4v0y4C54hY1Tglm50shcipYiEGYPuHUwtoTHX9CjK3VofhBM5hSpa\/axgTIWxLK6kqv7ag3G1LTrLZkpLp23P0BYI2KS\/CSFtBe0CobYDI1r2XlX4uO0qFvKhYArQKo37VU1VIVhA2j\/kypDy\/YlrHAZotA6S38CC9sPRRaD4uAtWcGcdRmSpjDLoPzQ4gHOXb6CgiSiTdSwSZXVvcfmPS36tb+YGnwQvJfiEoqfpgA4cZ1AOfWYujA5JrSdTQUXGZBZFDi\/lPRu\/NfYhFn6BAOcsjmzPGzKFqrnbX8Wzmox8\/XPaun165jimOGRfQojxqxzA0RYy8nBkvWthT37wtBnPrVOxjw3W4bfoFVUxuLOLtQGc851aueD5cqnd6WomTWaIspzpgSlcuped0djw7dpNlZjvrv3LkTulwUHmUvG62Na324V81atcSVevFXq+e1EAiE2waNPzQL3EKCHtnQLo93aXyKnJXIO3XvdCVY5vbbPX1FlzNd16j5RJ+tfWDLcoiL5gIU5l1Ar0nhX4DgjJW+qG8b6L2CkJ\/E0guqMsl1CRxE2iqnAxUm5jkC5llMFAIMIugl2+Hh6oaGlXuvHn3x5nlALzUrY6muDGjAUmppB10SvxD2S2ZHijcW4XAPHm3aLyJnFfJJa8JPWAJzZg+o8YCClYz0tXa\/Q319XXQlBlJhkPoldFzEd4S2WQVzPGY7t\/mhnT40twn6DZXMutCc80FLFeTX\/4powLpmamYxbJRjep+e+33GPJYGQrTXZoF5LL304sfPP5ksq\/T5FAR8Bljcs0v1C\/HA1UulIrLWCnXGIWnJzjEpjjya+crta\/IgEIaRnyKqcQe\/WcdU4iaClHB1jOoQtP5Jino+v0AQGf9\/SA1l9OVsCqKriuM1jFw9mgs7P+JviTSQiJLPXdToNJtBcFIJfBem03dHJmGBc426SAxERSrcyQ2YWN79YFR\/RewgUSU\/o74cejFP2e1POgcvwaYZy0wxoLbMHLlyRnEiLgJcAL+ZGnh+t3qmsri0sLC4qLsQFZ29iFTCTPPUozOqtywIjV0oyBhZUillkq+GBe4btuUNZID2xJlpVUFo7yOeLN5vbWHNdNWHnJeQz8lrK4GQsT5GSf97JmEOo7riPF\/ftdYf\/xQs+F0+9Xi40s+QKJ6D4LOStvK+w7aODWhlk1Q9dLpEBFx9HyzQiPzotRe4\/Vx0cgrDeN90RW6YhVUYyDm8V4dcCSZ9qQHC699tzKY5tHn2NzlIdLeAm03ZJYrUZq5W0dQw388OFQihBwBgvLOgfZPn1zPdese256Nm5Jp9VgnjtVVfUljQ2NQD0pWOyOHdp3Oc0Fle7Y7RbkSej+ZGZd7ZsaJrDG1ob6qqmEhsR1bh53T\/c8ulmZ8rlwj7yQczyUvI11p4lLVqKk1KwVnhBAQciLhVVqW1VnQWAQYphaJOCS3HXvVtuuTPPCgje1gSBqpShlXxXBLK\/jX4T3DN\/1CLpdmkSThxMRnbY1nP5cuhYvvQl1Jo2hZqPNsg0xxMCmp1hpocuw2zIyJlRQgYnZssNk9bs5HLzP7FZZJ7ZSrtQ2p9dT6GZbERXtSJJZIzk127NBQgyYUELxdZPB8kxs3LVysUX5vhsMRj0eiIIPd7qLjO4oWtVV6BohFpn+5XlkRXNom4rD5XLrZqmyEkq+L\/oeuVmUIF3mrcWPH+cGWq9PqFC01GZRfjjcYPI3PNBuMYk+mFFKZNZtNfrru3n6kv7FThMea0SQR9LbcrTTGEv1WzZfHUMsFN6f8u+oJ0YM1IZ6xvL4N06dFsBduqWqiz7ATSxhbGENosMC6af9f46+mnh9NAr+1nKzsA+Nquw0PeWDWzE\/7mI13TYe2FbZbJ\/3doBMyqEWRCMBLj4wBcpqMN3kvAr7OuE\/aKjSp5nugkDQ6ueUBs31cMMeXmoAxGv9N7\/93JvTSxbu6F2ZZ1mcGItMi9nmPr6K2dbLGmobYuH6ymoMjdNb\/IudMACGI4G0A15zRmc41MG01asn7DazfwcpDsevo+6Uyb\/BMUflAUCG1kYUe8ILKZTKD8e4CooKixWIVMG3Ul6hmknBBq3LSJZ69PT8C8CNAZJWJo5lFVcGwUQgtSgUIYzi\/rQgRpU5oY6pXDba7DMy4\/Zy3fSTQnhL4qZ85xoRAgjBCmsSrSJvpwFnSmNFK9uveDMVn9xxtnpC5W2+GdjCCYGm8eKcbUBY541lex1VvjmgKPXUDFVZzjWltWvu5SDTtxg5Kk2siM58r+ogqKb8cw3Zas2A9f7Ccr830EhCx6Ljfm1dTy6I0Kmjgg4+hfXN+GympcEcOh\/vWvXstlY2NZqE6F6Y1IuS2Y98pSJah988yijiUGOXTJ666JY2IzuErO\/JV1saXWVKhJKcm2rapEYOU2SOxt9dNqDuzyCcw6c1zRBPqi1xw9ps788brzzw1z7ioPF1Zo6gKrcZbKGaTPrQfWbpKd5GNr8UVpfccopytB+F7jfPcdLCwTWxmo4XfZHIG42+Ye7SObZ4T1X0iX252Rq7DqIZYyoJYa0fZ8c7kYCOyKawbk7A3FiRg2rXzR+kOkSphCfeyEsK2qdAK07x4q5S0cJxK+0zt9mVMnlRYkKTXqpTQSGNNRSt\/alZIU1xOyJ4TB0pmbdXCcikcpVxqBPw68CJV+kqLEnWhmSBGYPzuhVqaHF7AEmFZ1RaOH0UD\/\/a5Db\/8wV4R74V9EYhnEXTlXBhsBoK8DW0tHJkuE7FOshjiyBT4H\/4Wd1Eild7JFeiOKVNo1WqRSMoefvmKzoHxuZLldxwtLla8cimm4ikjUgFamSUOwcXcnqKxpIcfPrQpAexrq28mURgTbVhuj5FuBUMT4tXCK2d37qQ43e2Vg8QJuWviXGgmuuSE\/LZr3gJKNjnKE3mJNMEqiEId4TvuUq\/yTsZQxqXuddud3jWPn8rUjYRsLJXArGdO\/TC5SqJWgDIzkVZAvoK7LfUcgjGxqJlga1\/IdfLjhtY3tTk6lZziHyCadpMyIBdkx55bGUSQAS73lln9XE75cw7s\/bDzof1C4UaOKpC0jI21PNbSWOkpVgCufw8YaXja49SMqRGZLJFPOWSJHg\/8DInYn1PwMXuKONlUAF3k9mMEBSQodl1QNDax919v0grT945\/L6BFRwD3pLZP1MfKpbUxigaGbQR6XeQ\/HEQMH8RCqlCRiI4eL5omtvBehTYhoLckOweahi22sQE2Ed\/jdSeteJnS6YBhW\/kahcZsoZgTIuajJl9mZQfacUYs4WVbjGIATa8kA6BRNJ2oGfQoHw+VxRlN2VjP1SGybFqy8KgfHRm5Ck3UsKInXdYhQQ+KmGrTAWLtRezEBJcdqpDcKOWRHqVpht4BT5KKyxPhryni9xUalsfdlCRINW6cwzWTn23ll7siuYjMHZEDGTvyhqA3N0TXboHbN1Ao7PAaVYy8XIyouJeecMUdF15lrESXuQSlWQGtiU2FEIMha0cpu6QSQxIUCUXOl5aqEkv\/6Otm4wrlTYJHsi66BVTmx3tg8H+5WQKviXTdSDY7UFyCRaUSsGKHoEheLabUOgGjOwcY1lptWapS9RONJ6JBZBsRgUYRgRABWzcJSS5wtkzFNsNAeHuD4LvxwP\/KOGcXHBaZP\/kC7IOR214hSmlqbjzdy7Ajz\/E2hU8rDEm+8T2mZjdB2uslRkymWC2KQL\/qHr5kSMZGpbWwUMqyXem9Cq4XTmbjm+QO2cSXIVDlOeshno3wOHQ+hzJsy+u4a4ij9AkxNTI5ynpVVgyfxh2hBoatiFZNFCWqZJqSE170bm+1VSAPGfUEtF4LOkMnozgFqRuqjguf\/f0r7RMBFSiXFhnPDijrA7mnMgZCBYZBepT3z9OL6IM7GJDl0pOFz03Za\/U1inxQYVXOW1TF0zC72KmM4o2YN4D7o7jYCn6L8SA3ngfJpTJX1V6pSg1OFyXoUIwoRx2ByFYC0GKj7505u5l\/FeQ3Z9+DYEtXyQzOKnGpEc2gy+WH6IlU2noq5rhVPLLXpsJka5459SMPomMw4vnoLU2cDruXtxOWRk7eQ8FQkL8d+p6PXYtN0f2G\/FUNoGK4WDgAyGCHYsTtqWeNqTh8u5AukQdMa7652jdgyt3tuQ+sZW67iBwU20p5+aGHmxRyg9pAWV95R+PrrNA6fYECAVJUIAEWFGPAZ+kmIpV+EPO8BE\/\/X0wwLu5LGqOUhHg4yltVgWloDThVng0F7ZT6ehhXVlBoZqqh7astcUxLnIGWSAYjZpFbEeE5v5gDLNZ+pZJHLLJRYaglmfHcERcbT8an9Rn3e\/EXW3PvY8bcVt5OQLlE\/QQwLTfc6OSKi6EN0YSKlILpLrgOHINj88tcm7JkBiySsUhtrihYfrerstqoJRY1wgSirr2kLxYyzA0twGLh+x\/TuQsX2Ww8bHtMwITchCQdvW4\/zPzficMyoIegj73F0W8lxgHRdpsf3JR81Q3L7KgTRDkk1qwKQ409jWIYGUfbZSZUDYF8+QKQTsGl3eChkZ+zUYAzKKmyphPXXBpb\/Wb+RllPuCNdYinHUMEvVonAcwFZkIhIuQ3+ccj3Oi+ES0B5gXFlrQOxIBzXYcixCL07nrNSE5k5LRMdkli1T5Ybk6FgsPSNe5dnwDkYPyIYBAdsrAyOiEhZOg8IyKMQjN6LI5RaT22QPVepWOywyqBGr\/bP7p1zWdqBP4\/yNs654KpNOvZ9y3DarfLQvpY7FpwLrvna8AtyDUhviWw\/KQNeAD875c1VKeDlDZjc38r7HMTdYrN3TV+DLHgB\/AeqWRE5uQuTyS9B69LRoSaw+5Teb4C\/nHhvySLYIw97YeR7aYK9ATB8bhtU22NFx4ydq7KgWvpXzx2c3e0wrtp7AYhukXvwk4y0ZZwXnjOVpJZkwHNgV7S79nEPdRPmD6P8T17o0PWQsGcx6kXiiOdFdWf4lbKLyv3JJiB4FZh5NwuadhxDFhxJgEATVp7WHXCGQgEmIYIhR+88rRjhmMR0FTfPuDteIftQOZ\/SbRPxeEkKPimse1b78TYBj0gZi+VyMV5HE93sNBze3vIfGDdnIgkh5NQYpJWlezf3uFEJsiY2mxoOruUBc3RWVo4PZX6vwsp9Ev9wN0gHwFCrjUVxvkpQu7OxLCUxqNIypUkCkzTRsHqpd2m3HxHZBhElZWowxrgyKzRcA45Bkun0bakGCoixNXgzlTVXoKsXC+BhOTQLYYRgOtpjuPWv76TUIs1qHl0aJJrPeE9uWEnW\/YljsLTfgK\/XtZ6DIOngdAhw5D5IXQfIVldZXGmRFzp1bCBE3BeptMC+GeQvxcBq4eLvAqtnt7Y1NPjJx1RP+s+sOilc3faGEfS5H\/w7JRVqOc3jaXEgHFk9vckCBn7wzX4FdT6+tGle7N19NBLP4K\/9tp4ku1A5TC1Gh5EAXfbuKJeE2kjnSElWchGOEmSuST80Ql5MvZz1JHqjKo1UJmD2+F+8lND7WRIV7EyoupAuYC+laVeBZE6WEj5eC8r20jnqEHV5v4PetbO4qISXSRaW8RLJsPSjF80ydLVK079ZtcrZvrRzGaF7RXWJlmY9nqV7PMOTGc8pvI3XsmRDlxAPSBgNcARus3lGGxA9bHmYEjC0suNy3DYgOFYHrgse\/\/714hwD0F5000piAVVASh8DCx5\/4kc3RASsdilfYEH7gpTCf22jpMYrKR0QE6IlYHBYVQSNkmxqRk+7Ms3zEFnT+Dj0mqyZ9nvOKDR4yEOYch8jSFasa3Vdk0ZaisiSBKalG5IoMBTdGEGsaWhNtdmUBYFj7zmSbCIqKaGa0\/WDcZSqOgcCHE61GXLXo1ITDQuhhcpuh0Qmdz7sABnd+Hn2eWEkOGeu4PsgHb2R5Odn4ATLWrhKk0kZrdxj4DNjKUyEiCNiKcclfwPAX4l52EVaGAa6zcrkojYcktDWnC8C6WeuLV4fZV2fesz70FgbE7tLhnnTdOpbcyZGoif59A9unmaT0ZXG1oxS7xkZfW0Wpt84Mldx8565UGM7dm\/FGMDvkQ5XOx\/ux7Yu\/H8X4WIdFx6huEEBcNtsDUc\/vZDz\/7809Dn6HCYKp1YZ1Tj5vSLp0ObT1ES0WCyREZI8w7XIV7fktAbZULWxV\/Fxw7bF7e2DUrgPxyOQoPgMadWVFUnigUwknSnxvMqhSfk1mYW\/rjFEOlQ6qVzGIXSgIRdK8uPb8gYZuhlRU2aorv5le0Rrctc0YajQKKOONaD+LhzyPlenNcsdQaE9e+R5KbWy9tW\/THablLMikcgEX4qcRwFD9eKhqoVQGEJ+vN6kEvoiVkSBOsXrPfizHE6sZV1d3am01OsFAYsGtrGopflBxd2ezyq7+BGdF2KfSeIX\/Mb607QPjs6rjHdIjxxSndDhInRwwaD+KeigTdKA5HhdQWsEFlqcUut1dyq3n5pbbyTtb86c6uh7f8u1A1JAHfSB8nO9fwOgIUJ\/8vKzYHxB+EsQM4S78jQB\/vc4+Td7sUHXx18CKEvkVg5Lrx2U3XT\/tR\/9o8hGEKZYxE+mqDTdz4+P51NrNX7vTCY+yjGf3qzKIrm2uqk30KWl6cSDACAByGBBMUwrfdmQIAjN439HXBi\/xksNgDLvz2vh+DXai25Bepp9NOv7WLL\/Lkd7k17ITjtZf9XsG3fMDQF6\/waU9APmJNkoPQAa6jGjvB087Kaem3ai0pGyBnt4O7OmpDg0utCfV\/hcGUj0TymAbXzP13w9sW+9x294TD+XwfrIyWewdOkNZ0JIvGoaimXHMmuVMpNKfI5cFH2yfMPIYF5ySP1mMOgAyp4nkLCoIWrOy\/tUOev3y58x48\/mv1\/I1PJsEGUStZotjqsvedvMmYB6ECACNRgiQYAS6ruJ+UDwSPhSnsdlsbuyAhifjwXq6wPIsNTo2NiPMxnRbzSy0zsKCKQ3VasZt2vgHg00A3qKdJslS\/cgBa+3AAkmnO9NehcPGOcO6j8oYj69DIoseufLS9qde+ix82duuKxAmxE8c13b14xPh3nN6iR4cwqUzaEXFIzGIuXHOf2ebrVMLvQ8s2s4uojHXIeztUyXacmBLrpYF7xmXd1XDse4QVIqCzTtXit3+VyJLu9QX7srTpt0i3F0fLbDg35u5uILO3U3fTD0uYHznNWMv8wEoT3ZzmY3NFODtqG8A5bVGWKa4owQceb7CUDQ0fEdENtBY3jnmzmJ5Apgt4GXf1T+2kxjmBpNkbv7RAS1IUFVLYaCUKhAjdGSmKIrzAqGgun08v8eUhuhWSmFmqr8lUJ5QxUKUR6b2jfcjXXUXkgeWUSQpnZaPsZQSfYvFZ2ifBK55+rljqCWrUh1UrVYiIs2z7BHpUJlNOK24xRrG7318zJJGGkpkBVkEkE6lCm06us16uxTLjEh1u97DbE3GjsgHRpdohvb4HsfDfEp8m839Rs8lx32JufJUShXtcVJWqbwDP5eWabAwet15pCSGFYeZ5JZMPcy430EHyhQuv8eOH\/uTHT\/l\/DmFwBf\/FLWA\/DDiZl225a3uis8HwE8FACBb+ZhOUeuBLOegXckX8KS1BeE24W6DJjvD6Z7CvcoO1uWzvsTNm+JMAEJi66jxw2hELRuIMaDFCc0pR9PoxsLFwmuPJn01AlMyzKYGAZ2ZtbVVQ8uRiFM\/kI3cVSKqi8KheqfqOahoG4ib\/zK6mHPMyYGVsvB6lNQCQx8UPRo5B1pJBMVmhS4xEcoRrbAvGxCzXcnixOHGSQaOa7AicAq2K2mp5UFMxUkuM40FwjCQe6IZCrICRYfz2sEWhN3qMkgga4KygtTroz+l2nJI09zXRcn8dcyqierRFYb82DdIhtbObA2cDNezkxlDNAFfmiAJKiBAITAY3enizriPSiFvExkzZt5ZhpLmlyVUvK8xbReeEU0zo3CNZrlhK3WPsXbDWJ5t3R7wDPszsDc4\/PExHrZoxG+8dxPWw5BDdk8T7g4PXydiSrwxY6InQHEN7SUuzrgbAzkEWjKuTHRnsXcIbdwYdB\/sPDWaoxkV78ppTAtrlAFVUhaYCP3ulRC7e3lkrl53XLkQ02HrSCyHMQeHHsvR1Q+rGLBOjj6NrSp7KUS6BJqQAXMTc1LoRm6Uu\/ye7eXzV2JoN17LTLTukooXADin0jY+YTvZWAaHAVMfnd+Y3cYCBHZAVUq2JMjqhMAbxFIXx8EJMk2SOyLjBByw2br41mv4CSBW3IpY1KS\/w4rGXkgbJiSTqcjZq7Ik8GTg+EMsyKelEeV3P4EQnGcfsCTcjrhgU6dhFM0uxUOCfksnKbRznCGnJXhLEUfhHMo9IXzhJrDBRy14QoqrnAlKlPCVcT4rJpyMPIaVGBLLV4zQbM8M00wVZNJfJo05D2nq1MHkykwwTFlXVncnGMuwyaQtbRrCOcqFjd4R0iUL1PnNTGIwR6RolAE4WPM8lpWuQiUYuWzzMBLqCKENba1hWuyxD4yYgYXK2tJnXWa1StrLlKUaI7NmJilsMXpGrSUq2KVeWi6GUS2UMHOwjY47evoNAHFAnKOqJK+wCsVmVLBs+CyecVEjmrUtWUUygXqKsqyoGRaTE58UuHmDLOQ4C3At6xgQKW5QZOw6ywTWUxyJmYVonP+FGFTEILmcw+bx6qedhjhSF5QfCW7D7MkgXb7g+NlE60wyUof0dIJ07vLoM4+BxxkZBLP7JDDjjgKC\/5bQt3+enbHHNfgpI+tslqiB5Ikf7OozCmn9brPSOWSxu2+UbI1BWxye92v+VEOnxa57vGLYFE77RvQu50102xzQuAoRSGK8U2mPrxzlZpngYXm+8kia5R5qFyFSm+rUm2xVm2WqBEyWq0+W43xne9xv9WV\/o2i\/jeWkIYsviQlkJSEkpaMZCUXO07c0HjxEyRMlDhJ0uKSJU+RMlXqNLbrt9RQtOnSw8uYjNhiaSKzDIHrqfzsH29i4FGQHlPxWNZaJxONkF2N5+H1r\/+st8FGm\/zpLzvtQiSgTQynesO73vGeDuPc0WkHskzwuq5gmPztsUcoKMl9aqkJMmJBkcnZSsheYkkll5IjZ6m5fCDL+8657LwLepL2dVLkN+EgXOgXHYpaQdQytUh2bmclzh490OY4LUvL6wJpzZz75duK2mi2LMKX+naYW\/H5htbJaM79dI3Ehs7gaM9eZ0QreiGBNudCwp5Fp+DkW+TLUHNemogEvl8qJ6WZSq8QKVR9oeqniBRd8vEogSYCRYdKoZlCIdBJh6pDodDM58rTxG5GeWnMcjdE7eMeHK7tJYUbuqEFPgEcenRii3T0wpyuQZncn720tLj6HI4H85qmHPYrkjTxQndbl6kNBq6THdjIh7jM\/fVm3G9NIC+l1oZzQWTbyYJ5zErL0vqRHnCVsg8QpwmPbg\/SNlHWUotv4ssVuggAAAA=\") format('woff2');\n  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;\n}\n\/* latin-ext *\/\n\n\/* latin *\/\n\n\/* latin-ext *\/\n\n\/* latin *\/\n\n\/* latin-ext *\/\n\n\/* latin *\/\n\n\/* latin-ext *\/\n\n\/* latin *\/\n\n\/* latin-ext *\/\n\n\/* latin *\/\n\n\u003c\/style\u003e\n\u003cscript src=\"data:text\/javascript;base64,Ly8gQGRzLWFkaGVyZW5jZS1pZ25vcmUgLS0gb21lbGV0dGUgc3RhcnRlciBzY2FmZm9sZCAocmF3IGVsZW1lbnRzL2hleC9weCBieSBkZXNpZ24pCi8qIEJFR0lOIFVTQUdFICovCi8qKgogKiA8aW1hZ2Utc2xvdD4g4oCUIHVzZXItZmlsbGFibGUgaW1hZ2UgcGxhY2Vob2xkZXIuCiAqCiAqIERyb3AgdGhpcyBpbnRvIGEgZGVjaywgbW9ja3VwLCBvciBwYWdlIHdoZXJldmVyIHlvdSB3YW50IHRoZSB1c2VyIHRvCiAqIHN1cHBseSBhbiBpbWFnZS4gWW91IGNvbnRyb2wgdGhlIHNsb3QncyBzaGFwZSBhbmQgc2l6ZTsgdGhlIHVzZXIgZmlsbHMgaXQKICogYnkgZHJhZ2dpbmcgYW4gaW1hZ2UgZmlsZSBvbnRvIGl0IChvciBjbGlja2luZyB0byBicm93c2UpLiBUaGUgZHJvcHBlZAogKiBpbWFnZSBwZXJzaXN0cyBhY3Jvc3MgcmVsb2FkcyB2aWEgYSAuaW1hZ2Utc2xvdHMuc3RhdGUuanNvbiBzaWRlY2FyIOKAlAogKiBzYW1lIHJlYWQtdmlhLWZldGNoIC8gd3JpdGUtdmlhLXdpbmRvdy5vbWVsZXR0ZSBwYXR0ZXJuIGFzCiAqIGRlc2lnbl9jYW52YXMuanN4LCBzbyB0aGUgZmlsbGVkIHNsb3Qgc2hvd3Mgb24gc2hhcmUgbGlua3MsIGRvd25sb2FkZWQKICogemlwcywgYW5kIFBQVFggZXhwb3J0LiBPdXRzaWRlIHRoZSBvbWVsZXR0ZSBydW50aW1lIHRoZSBzbG90IGlzIHJlYWQtb25seS4KICoKICogVGhlIGhvc3QgYnJpZGdlIG9ubHkgYWxsb3dzIHNpZGVjYXIgd3JpdGVzIGF0IHRoZSBwcm9qZWN0IHJvb3QsIHNvIHRoZQogKiBIVE1MIHRoYXQgdXNlcyB0aGlzIGNvbXBvbmVudCBpcyBhc3N1bWVkIHRvIGxpdmUgYXQgdGhlIHByb2plY3Qgcm9vdCB0b28KICogKHNhbWUgY29uc3RyYWludCBhcyBkZXNpZ25fY2FudmFzLmpzeCkuCiAqCiAqIEF0dHJpYnV0ZXM6CiAqICAgaWQgICAgICAgICAgIFBlcnNpc3RlbmNlIGtleS4gUkVRVUlSRUQgZm9yIHRoZSBkcm9wIHRvIHN1cnZpdmUgcmVsb2FkIOKAlAogKiAgICAgICAgICAgICAgICBldmVyeSBzbG90IG9uIHRoZSBwYWdlIG5lZWRzIGEgZGlzdGluY3QgaWQuCiAqICAgc2hhcGUgICAgICAgICdyZWN0JyB8ICdyb3VuZGVkJyB8ICdjaXJjbGUnIHwgJ3BpbGwnICAgKGRlZmF1bHQgJ3JvdW5kZWQnKQogKiAgICAgICAgICAgICAgICAnY2lyY2xlJyBhcHBsaWVzIDUwJSBib3JkZXItcmFkaXVzOyBvbiBhIG5vbi1zcXVhcmUgc2xvdAogKiAgICAgICAgICAgICAgICB0aGF0J3MgYW4gZWxsaXBzZSDigJQgc2V0IGVxdWFsIHdpZHRoIGFuZCBoZWlnaHQgZm9yIGEgdHJ1ZQogKiAgICAgICAgICAgICAgICBjaXJjbGUuCiAqICAgcmFkaXVzICAgICAgIENvcm5lciByYWRpdXMgaW4gcHggZm9yICdyb3VuZGVkJy4gICAgICAgKGRlZmF1bHQgMTIpCiAqICAgbWFzayAgICAgICAgIEFueSBDU1MgY2xpcC1wYXRoIHZhbHVlLiBPdmVycmlkZXMgYHNoYXBlYCDigJQgdXNlIHRoaXMgZm9yCiAqICAgICAgICAgICAgICAgIGhleGFnb25zLCBibG9icywgYXJiaXRyYXJ5IHBvbHlnb25zLgogKiAgIGZpdCAgICAgICAgICBvYmplY3QtZml0OiBjb3ZlciB8IGNvbnRhaW4gfCBmaWxsLiAgICAgICAoZGVmYXVsdCAnY292ZXInKQogKiAgICAgICAgICAgICAgICBXaXRoIGNvdmVyICh0aGUgZGVmYXVsdCkgZG91YmxlLWNsaWNraW5nIHRoZSBmaWxsZWQgc2xvdAogKiAgICAgICAgICAgICAgICBlbnRlcnMgYSByZWZyYW1lIG1vZGU6IHRoZSB3aG9sZSBpbWFnZSBzcGlsbHMgcGFzdCB0aGUgbWFzawogKiAgICAgICAgICAgICAgICAodHJhbnNsdWNlbnQgb3V0c2lkZSwgb3BhcXVlIGluc2lkZSksIGRyYWcgdG8gcmVwb3NpdGlvbiwKICogICAgICAgICAgICAgICAgY29ybmVyLWRyYWcgdG8gc2NhbGUuIFRoZSBjcm9wIHBlcnNpc3RzIGFsb25nc2lkZSB0aGUgaW1hZ2UKICogICAgICAgICAgICAgICAgaW4gdGhlIHNpZGVjYXIuIGNvbnRhaW4vZmlsbCBzdGF5IHN0YXRpYy4KICogICBwb3NpdGlvbiAgICAgb2JqZWN0LXBvc2l0aW9uIGZvciBmaXQ9Y29udGFpbnxmaWxsLiAgICAgKGRlZmF1bHQgJzUwJSA1MCUnKQogKiAgIHBsYWNlaG9sZGVyICBFbXB0eS1zdGF0ZSBjYXB0aW9uLiAgICAgICAgICAgICAgICAgICAgICAoZGVmYXVsdCAnRHJvcCBhbiBpbWFnZScpCiAqICAgc3JjICAgICAgICAgIE9wdGlvbmFsIGluaXRpYWwvZmFsbGJhY2sgaW1hZ2UgVVJMLiBBIHVzZXIgZHJvcCBvdmVycmlkZXMKICogICAgICAgICAgICAgICAgaXQ7IGNsZWFyaW5nIHRoZSBkcm9wIHJldmVhbHMgc3JjIGFnYWluLgogKgogKiBTaXplIGFuZCBsYXlvdXQgY29tZSBmcm9tIG9yZGluYXJ5IENTUyBvbiB0aGUgZWxlbWVudCDigJQgd2lkdGgvaGVpZ2h0CiAqIGlubGluZSBvciBmcm9tIGEgcGFyZW50IGdyaWQg4oCUIHNvIGl0IGNvbXBvc2VzIHdpdGggYW55IGxheW91dC4KICoKICogVXNhZ2U6CiAqICAgPGltYWdlLXNsb3QgaWQ9Imhlcm8iICAgc3R5bGU9IndpZHRoOjgwMHB4O2hlaWdodDo0NTBweCIgc2hhcGU9InJvdW5kZWQiIHJhZGl1cz0iMjAiCiAqICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9IkRyb3AgYSBoZXJvIGltYWdlIj48L2ltYWdlLXNsb3Q+CiAqICAgPGltYWdlLXNsb3QgaWQ9ImF2YXRhciIgc3R5bGU9IndpZHRoOjEyMHB4O2hlaWdodDoxMjBweCIgc2hhcGU9ImNpcmNsZSI+PC9pbWFnZS1zbG90PgogKiAgIDxpbWFnZS1zbG90IGlkPSJraXRlIiAgIHN0eWxlPSJ3aWR0aDozMDBweDtoZWlnaHQ6MzAwcHgiCiAqICAgICAgICAgICAgICAgbWFzaz0icG9seWdvbig1MCUgMCwgMTAwJSA1MCUsIDUwJSAxMDAlLCAwIDUwJSkiPjwvaW1hZ2Utc2xvdD4KICovCi8qIEVORCBVU0FHRSAqLwoKKCgpID0+IHsKICBjb25zdCBTVEFURV9GSUxFID0gJy5pbWFnZS1zbG90cy5zdGF0ZS5qc29uJzsKICAvLyAyw5cgYSB+NjAwcHggc2xvdCBpbiBhIDE5MjAtd2lkZSBkZWNrIOKAlCByZXRpbmEtc2hhcnAgd2l0aG91dCBtYWtpbmcgdGhlCiAgLy8gc2lkZWNhciBlbm9ybW91cy4gQSAxMjAwcHggV2ViUCBhdCBxPTAuODUgaXMgfjE1MC0zMDBLQi4KICBjb25zdCBNQVhfRElNID0gMTIwMDsKICAvLyBSYXN0ZXIgZm9ybWF0cyBvbmx5LiBTVkcgaXMgZXhjbHVkZWQgKGNhbiBjYXJyeSBzY3JpcHQ7IGNyZWF0ZUltYWdlQml0bWFwCiAgLy8gb24gU1ZHIGJsb2JzIGlzIGluY29uc2lzdGVudCkuIEdJRiBpcyBleGNsdWRlZCBiZWNhdXNlIHRoZSBjYW52YXMKICAvLyByZS1lbmNvZGUga2VlcHMgb25seSB0aGUgZmlyc3QgZnJhbWUsIHNvIGFuIGFuaW1hdGVkIEdJRiB3b3VsZCBzaWxlbnRseQogIC8vIGdvIHN0aWxsIOKAlCBiZXR0ZXIgdG8gcmVqZWN0IHRoYW4gc3VycHJpc2UuCiAgY29uc3QgQUNDRVBUID0gWydpbWFnZS9wbmcnLCAnaW1hZ2UvanBlZycsICdpbWFnZS93ZWJwJywgJ2ltYWdlL2F2aWYnXTsKCiAgLy8g4pSA4pSAIFNoYXJlZCBzaWRlY2FyIHN0b3JlIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAogIC8vIE9uZSBmZXRjaCArIGltbWVkaWF0ZSB3cml0ZS1vbi1jaGFuZ2UgZm9yIGV2ZXJ5IDxpbWFnZS1zbG90PiBvbiB0aGUKICAvLyBwYWdlLiBSZWFkcyB2aWEgZmV0Y2goKSBzbyB2aWV3aW5nIHdvcmtzIGFueXdoZXJlIHRoZSBIVE1MIGFuZCBzaWRlY2FyCiAgLy8gYXJlIHNlcnZlZCB0b2dldGhlcjsgd3JpdGVzIGdvIHRocm91Z2ggd2luZG93Lm9tZWxldHRlLndyaXRlRmlsZSwgd2hpY2gKICAvLyB0aGUgaG9zdCBhbGxvd2xpc3RzIHRvICouc3RhdGUuanNvbiBiYXNlbmFtZXMgb25seS4KICBjb25zdCBzdWJzID0gbmV3IFNldCgpOwogIGxldCBzbG90cyA9IHt9OwogIC8vIGlkcyBleHBsaWNpdGx5IGNsZWFyZWQgYmVmb3JlIHRoZSBzaWRlY2FyIGZldGNoIHJlc29sdmVkIOKAlCBvdGhlcndpc2UKICAvLyB0aGUgbWVyZ2UgYmVsb3cgY2FuJ3QgdGVsbCAibmV2ZXIgc2V0IiBmcm9tICJqdXN0IGRlbGV0ZWQiIGFuZCB3b3VsZAogIC8vIHJlc3VycmVjdCB0aGUgc2lkZWNhcidzIHN0YWxlIHZhbHVlLgogIGNvbnN0IHRvbWJzdG9uZXMgPSBuZXcgU2V0KCk7CiAgbGV0IGxvYWRlZCA9IGZhbHNlOwogIGxldCBsb2FkUCA9IG51bGw7CgogIGZ1bmN0aW9uIGxvYWQoKSB7CiAgICBpZiAobG9hZFApIHJldHVybiBsb2FkUDsKICAgIGxvYWRQID0gZmV0Y2goU1RBVEVfRklMRSkKICAgICAgLnRoZW4oKHIpID0+IChyLm9rID8gci5qc29uKCkgOiBudWxsKSkKICAgICAgLnRoZW4oKGopID0+IHsKICAgICAgICAvLyBNZXJnZTogc2lkZWNhciBsb3NlcyB0byBhbnkgaW4tbWVtb3J5IGNoYW5nZSB0aGF0IHJhY2VkIGFoZWFkIG9mCiAgICAgICAgLy8gdGhlIGZldGNoIChkcm9wIG9yIGNsZWFyKSBzbyBuZWl0aGVyIGlzIGNsb2JiZXJlZCBieSBoeWRyYXRpb24uCiAgICAgICAgaWYgKGogJiYgdHlwZW9mIGogPT09ICdvYmplY3QnKSB7CiAgICAgICAgICBjb25zdCBtZXJnZWQgPSBPYmplY3QuYXNzaWduKHt9LCBqLCBzbG90cyk7CiAgICAgICAgICAvLyBBIGZyYW1pbmctb25seSB3cml0ZSB0aGF0IHJhY2VkIGFoZWFkIG9mIGh5ZHJhdGlvbiBtdXN0IG5vdAogICAgICAgICAgLy8gZHJvcCBhIHVzZXIgaW1hZ2UgdGhhdCdzIG9ubHkgb24gZGlzayDigJQgaW5oZXJpdCB1IGZyb20gdGhlCiAgICAgICAgICAvLyBzaWRlY2FyIGZvciBhbnkgaW4tbWVtb3J5IGVudHJ5IHRoYXQgbGFja3Mgb25lLgogICAgICAgICAgZm9yIChjb25zdCBrIGluIHNsb3RzKSB7CiAgICAgICAgICAgIGlmIChtZXJnZWRba10gJiYgIW1lcmdlZFtrXS51ICYmIGpba10pIHsKICAgICAgICAgICAgICBtZXJnZWRba10udSA9IHR5cGVvZiBqW2tdID09PSAnc3RyaW5nJyA\/IGpba10gOiBqW2tdLnU7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIGZvciAoY29uc3QgaWQgb2YgdG9tYnN0b25lcykgZGVsZXRlIG1lcmdlZFtpZF07CiAgICAgICAgICBzbG90cyA9IG1lcmdlZDsKICAgICAgICB9CiAgICAgICAgdG9tYnN0b25lcy5jbGVhcigpOwogICAgICB9KQogICAgICAuY2F0Y2goKCkgPT4ge30pCiAgICAgIC50aGVuKCgpID0+IHsgbG9hZGVkID0gdHJ1ZTsgc3Vicy5mb3JFYWNoKChmbikgPT4gZm4oKSk7IH0pOwogICAgcmV0dXJuIGxvYWRQOwogIH0KCiAgLy8gU2VyaWFsaXplIHdyaXRlcyBzbyB0d28gbmVhci1zaW11bHRhbmVvdXMgZHJvcHMgb24gZGlmZmVyZW50IHNsb3RzCiAgLy8gY2FuJ3QgcmVvcmRlciBhdCB0aGUgYmFja2VuZCBhbmQgbGVhdmUgdGhlIHNpZGVjYXIgd2l0aCBvbmx5IHRoZQogIC8vIGZpcnN0LiBBIHNhdmUgcmVxdWVzdGVkIG1pZC1mbGlnaHQganVzdCBtYXJrcyBkaXJ0eSBhbmQgcmUtZmlyZXMgb24KICAvLyBjb21wbGV0aW9uIHdpdGggdGhlIHRoZW4tY3VycmVudCBzbG90cy4KICBsZXQgc2F2aW5nID0gZmFsc2U7CiAgbGV0IHNhdmVEaXJ0eSA9IGZhbHNlOwogIGZ1bmN0aW9uIHNhdmUoKSB7CiAgICBpZiAoc2F2aW5nKSB7IHNhdmVEaXJ0eSA9IHRydWU7IHJldHVybjsgfQogICAgY29uc3QgdyA9IHdpbmRvdy5vbWVsZXR0ZSAmJiB3aW5kb3cub21lbGV0dGUud3JpdGVGaWxlOwogICAgaWYgKCF3KSByZXR1cm47CiAgICBzYXZpbmcgPSB0cnVlOwogICAgUHJvbWlzZS5yZXNvbHZlKHcoU1RBVEVfRklMRSwgSlNPTi5zdHJpbmdpZnkoc2xvdHMpKSkKICAgICAgLmNhdGNoKCgpID0+IHt9KQogICAgICAudGhlbigoKSA9PiB7IHNhdmluZyA9IGZhbHNlOyBpZiAoc2F2ZURpcnR5KSB7IHNhdmVEaXJ0eSA9IGZhbHNlOyBzYXZlKCk7IH0gfSk7CiAgfQoKICBjb25zdCBTX01BWCA9IDU7CiAgY29uc3QgY2xhbXBTID0gKHMpID0+IE1hdGgubWF4KDEsIE1hdGgubWluKFNfTUFYLCBzKSk7CgogIC8vIE5vcm1hbGl6ZSBhIHN0b3JlZCBzbG90IHZhbHVlLiBQcmUtcmVmcmFtZSBzaWRlY2FycyBzdG9yZWQgYSBiYXJlCiAgLy8gZGF0YS1VUkwgc3RyaW5nOyBuZXdlciBvbmVzIHN0b3JlIHt1LCBzLCB4LCB5fS4gRWl0aGVyIHNoYXBlIGlzIHZhbGlkLgogIGZ1bmN0aW9uIGdldFNsb3QoaWQpIHsKICAgIGNvbnN0IHYgPSBzbG90c1tpZF07CiAgICBpZiAoIXYpIHJldHVybiBudWxsOwogICAgcmV0dXJuIHR5cGVvZiB2ID09PSAnc3RyaW5nJyA\/IHsgdTogdiwgczogMSwgeDogMCwgeTogMCB9IDogdjsKICB9CgogIGZ1bmN0aW9uIHNldFNsb3QoaWQsIHZhbCkgewogICAgaWYgKCFpZCkgcmV0dXJuOwogICAgaWYgKHZhbCkgeyBzbG90c1tpZF0gPSB2YWw7IHRvbWJzdG9uZXMuZGVsZXRlKGlkKTsgfQogICAgZWxzZSB7IGRlbGV0ZSBzbG90c1tpZF07IGlmICghbG9hZGVkKSB0b21ic3RvbmVzLmFkZChpZCk7IH0KICAgIHN1YnMuZm9yRWFjaCgoZm4pID0+IGZuKCkpOwogICAgLy8gQSBkcm9wIGlzIHJhcmUgKyBoaWdoLXZhbHVlIOKAlCB3cml0ZSBpbW1lZGlhdGVseSBzbyBuYXYtYXdheSBjYW4ndCBsb3NlCiAgICAvLyBpdC4gR2F0ZSBvbiB0aGUgaW5pdGlhbCByZWFkIHNvIHdlIGRvbid0IG92ZXJ3cml0ZSBhIHNpZGVjYXIgd2UgaGF2ZW4ndAogICAgLy8gbWVyZ2VkIHlldDsgdGhlIG1lcmdlIGluIGxvYWQoKSBrZWVwcyB0aGlzIGNoYW5nZSBvbmNlIHRoZSByZWFkIGxhbmRzLgogICAgaWYgKGxvYWRlZCkgc2F2ZSgpOyBlbHNlIGxvYWQoKS50aGVuKHNhdmUpOwogIH0KCiAgLy8g4pSA4pSAIEltYWdlIGRvd25zY2FsZSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKICAvLyBFbmNvZGUgdGhyb3VnaCBhIGNhbnZhcyBzbyB0aGUgc2lkZWNhciBjYXJyaWVzIHJlc2l6ZWQgYnl0ZXMsIG5vdCB0aGUKICAvLyByYXcgdXBsb2FkLiBMb25nZXN0IHNpZGUgaXMgY2FwcGVkIGF0IDLDlyB0aGUgc2xvdCdzIHJlbmRlcmVkIHdpZHRoCiAgLy8gKHJldGluYSkgYW5kIGF0IE1BWF9ESU0uIFdlYlAga2VlcHMgYWxwaGEgYW5kIGlzIH4xMMOXIHNtYWxsZXIgdGhhbiBQTkcKICAvLyBmb3IgcGhvdG9zLCBzbyB0aGVyZSdzIG5vIG5lZWQgZm9yIHBlci1pbWFnZSBmb3JtYXQgcGlja2luZy4KICBhc3luYyBmdW5jdGlvbiB0b0RhdGFVcmwoZmlsZSwgdGFyZ2V0VykgewogICAgY29uc3QgYml0bWFwID0gYXdhaXQgY3JlYXRlSW1hZ2VCaXRtYXAoZmlsZSk7CiAgICB0cnkgewogICAgICBjb25zdCBjYXAgPSBNYXRoLm1pbihNQVhfRElNLCBNYXRoLm1heCgxLCBNYXRoLnJvdW5kKHRhcmdldFcgKiAyKSkgfHwgTUFYX0RJTSk7CiAgICAgIGNvbnN0IHNjYWxlID0gTWF0aC5taW4oMSwgY2FwIC8gTWF0aC5tYXgoYml0bWFwLndpZHRoLCBiaXRtYXAuaGVpZ2h0KSk7CiAgICAgIGNvbnN0IHcgPSBNYXRoLm1heCgxLCBNYXRoLnJvdW5kKGJpdG1hcC53aWR0aCAqIHNjYWxlKSk7CiAgICAgIGNvbnN0IGggPSBNYXRoLm1heCgxLCBNYXRoLnJvdW5kKGJpdG1hcC5oZWlnaHQgKiBzY2FsZSkpOwogICAgICBjb25zdCBjYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTsKICAgICAgY2FudmFzLndpZHRoID0gdzsgY2FudmFzLmhlaWdodCA9IGg7CiAgICAgIGNhbnZhcy5nZXRDb250ZXh0KCcyZCcpLmRyYXdJbWFnZShiaXRtYXAsIDAsIDAsIHcsIGgpOwogICAgICByZXR1cm4gY2FudmFzLnRvRGF0YVVSTCgnaW1hZ2Uvd2VicCcsIDAuODUpOwogICAgfSBmaW5hbGx5IHsKICAgICAgYml0bWFwLmNsb3NlICYmIGJpdG1hcC5jbG9zZSgpOwogICAgfQogIH0KCiAgLy8g4pSA4pSAIEN1c3RvbSBlbGVtZW50IOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAogIGNvbnN0IHN0eWxlc2hlZXQgPQogICAgJzpob3N0e2Rpc3BsYXk6aW5saW5lLWJsb2NrO3Bvc2l0aW9uOnJlbGF0aXZlO3ZlcnRpY2FsLWFsaWduOnRvcDsnICsKICAgICcgIGZvbnQ6MTNweC8xLjMgc3lzdGVtLXVpLC1hcHBsZS1zeXN0ZW0sc2Fucy1zZXJpZjtjb2xvcjpyZ2JhKDAsMCwwLC41NSk7d2lkdGg6MjQwcHg7aGVpZ2h0OjE2MHB4fScgKwogICAgJy5mcmFtZXtwb3NpdGlvbjphYnNvbHV0ZTtpbnNldDowO292ZXJmbG93OmhpZGRlbjtiYWNrZ3JvdW5kOnJnYmEoMCwwLDAsLjA0KX0nICsKICAgIC8vIC5mcmFtZSBpbWcgKGNsaXBwZWQpIGFuZCAuc3BpbGwgKHVuY2xpcHBlZCBnaG9zdCArIGhhbmRsZXMpIHNoYXJlIHRoZQogICAgLy8gc2FtZSBsZWZ0L3RvcC93aWR0aC9oZWlnaHQgaW4gZnJhbWUtJSwgY29tcHV0ZWQgYnkgX2FwcGx5VmlldygpLCBzbyB0aGUKICAgIC8vIGluc2lkZS1tYXNrIGNyb3AgYW5kIHRoZSBvdXRzaWRlLW1hc2sgc3BpbGwgc3RheSBwaXhlbC1hbGlnbmVkLgogICAgJy5mcmFtZSBpbWd7cG9zaXRpb246YWJzb2x1dGU7bWF4LXdpZHRoOm5vbmU7dHJhbnNmb3JtOnRyYW5zbGF0ZSgtNTAlLC01MCUpOycgKwogICAgJyAgLXdlYmtpdC11c2VyLWRyYWc6bm9uZTt1c2VyLXNlbGVjdDpub25lO3RvdWNoLWFjdGlvbjpub25lfScgKwogICAgLy8gUmVmcmFtZSBtb2RlIChkb3VibGUtY2xpY2spOiB0aGUgZnVsbCBpbWFnZSBzcGlsbHMgcGFzdCB0aGUgbWFzay4gVGhlCiAgICAvLyBzcGlsbCBsYXllciBpcyBzaXplZCB0byB0aGUgSU1BR0UgYm91bmRzIHNvIGl0cyBjb3JuZXJzIGFyZSB3aGVyZSB0aGUKICAgIC8vIHJlc2l6ZSBoYW5kbGVzIGJlbG9uZy4gVGhlIGdob3N0IDxpbWc+IGluc2lkZSBpcyB0cmFuc2x1Y2VudDsgdGhlIHJlYWwKICAgIC8vIGNsaXBwZWQgPGltZz4gdW5kZXJuZWF0aCBzaG93cyB0aGUgb3BhcXVlIGluLW1hc2sgY3JvcC4KICAgICcuc3BpbGx7cG9zaXRpb246YWJzb2x1dGU7dHJhbnNmb3JtOnRyYW5zbGF0ZSgtNTAlLC01MCUpO2Rpc3BsYXk6bm9uZTt6LWluZGV4OjE7JyArCiAgICAnICBjdXJzb3I6Z3JhYjt0b3VjaC1hY3Rpb246bm9uZX0nICsKICAgICc6aG9zdChbZGF0YS1wYW5uaW5nXSkgLnNwaWxse2N1cnNvcjpncmFiYmluZ30nICsKICAgICcuc3BpbGwgLmdob3N0e3Bvc2l0aW9uOmFic29sdXRlO2luc2V0OjA7d2lkdGg6MTAwJTtoZWlnaHQ6MTAwJTtvcGFjaXR5Oi4zNTsnICsKICAgICcgIHBvaW50ZXItZXZlbnRzOm5vbmU7LXdlYmtpdC11c2VyLWRyYWc6bm9uZTt1c2VyLXNlbGVjdDpub25lOycgKwogICAgJyAgYm94LXNoYWRvdzowIDAgMCAxcHggcmdiYSgwLDAsMCwuMiksMCAxMnB4IDMycHggcmdiYSgwLDAsMCwuMil9JyArCiAgICAnLnNwaWxsIC5oYW5kbGV7cG9zaXRpb246YWJzb2x1dGU7d2lkdGg6MTJweDtoZWlnaHQ6MTJweDtib3JkZXItcmFkaXVzOjUwJTsnICsKICAgICcgIGJhY2tncm91bmQ6I2ZmZjtib3gtc2hhZG93OjAgMCAwIDEuNXB4ICNjOTY0NDIsMCAxcHggM3B4IHJnYmEoMCwwLDAsLjMpOycgKwogICAgJyAgdHJhbnNmb3JtOnRyYW5zbGF0ZSgtNTAlLC01MCUpfScgKwogICAgJy5zcGlsbCAuaGFuZGxlW2RhdGEtYz1ud117bGVmdDowO3RvcDowO2N1cnNvcjpud3NlLXJlc2l6ZX0nICsKICAgICcuc3BpbGwgLmhhbmRsZVtkYXRhLWM9bmVde2xlZnQ6MTAwJTt0b3A6MDtjdXJzb3I6bmVzdy1yZXNpemV9JyArCiAgICAnLnNwaWxsIC5oYW5kbGVbZGF0YS1jPXN3XXtsZWZ0OjA7dG9wOjEwMCU7Y3Vyc29yOm5lc3ctcmVzaXplfScgKwogICAgJy5zcGlsbCAuaGFuZGxlW2RhdGEtYz1zZV17bGVmdDoxMDAlO3RvcDoxMDAlO2N1cnNvcjpud3NlLXJlc2l6ZX0nICsKICAgICc6aG9zdChbZGF0YS1yZWZyYW1lXSl7ei1pbmRleDoxMH0nICsKICAgICc6aG9zdChbZGF0YS1yZWZyYW1lXSkgLnNwaWxse2Rpc3BsYXk6YmxvY2t9JyArCiAgICAnOmhvc3QoW2RhdGEtcmVmcmFtZV0pIC5mcmFtZXtib3gtc2hhZG93OjAgMCAwIDJweCAjYzk2NDQyfScgKwogICAgJy5lbXB0eXtwb3NpdGlvbjphYnNvbHV0ZTtpbnNldDowO2Rpc3BsYXk6ZmxleDtmbGV4LWRpcmVjdGlvbjpjb2x1bW47YWxpZ24taXRlbXM6Y2VudGVyOycgKwogICAgJyAganVzdGlmeS1jb250ZW50OmNlbnRlcjtnYXA6NnB4O3RleHQtYWxpZ246Y2VudGVyO3BhZGRpbmc6MTJweDtib3gtc2l6aW5nOmJvcmRlci1ib3g7JyArCiAgICAnICBjdXJzb3I6cG9pbnRlcjt1c2VyLXNlbGVjdDpub25lfScgKwogICAgJy5lbXB0eSBzdmd7b3BhY2l0eTouNDV9JyArCiAgICAnLmVtcHR5IC5jYXB7bWF4LXdpZHRoOjkwJTtmb250LXdlaWdodDo1MDA7bGV0dGVyLXNwYWNpbmc6LjAxZW19JyArCiAgICAnLmVtcHR5IC5zdWJ7Zm9udC1zaXplOjExcHh9JyArCiAgICAnLmVtcHR5IC5zdWIgdXt0ZXh0LXVuZGVybGluZS1vZmZzZXQ6MnB4O3RleHQtZGVjb3JhdGlvbi1jb2xvcjpyZ2JhKDAsMCwwLC4yNSl9JyArCiAgICAnLmVtcHR5OmhvdmVyIC5zdWIgdXtjb2xvcjpyZ2JhKDAsMCwwLC43NSk7dGV4dC1kZWNvcmF0aW9uLWNvbG9yOmN1cnJlbnRDb2xvcn0nICsKICAgICc6aG9zdChbZGF0YS1vdmVyXSkgLmZyYW1le291dGxpbmU6MnB4IHNvbGlkICNjOTY0NDI7b3V0bGluZS1vZmZzZXQ6LTJweDsnICsKICAgICcgIGJhY2tncm91bmQ6cmdiYSgyMDEsMTAwLDY2LC4xMCl9JyArCiAgICAnLnJpbmd7cG9zaXRpb246YWJzb2x1dGU7aW5zZXQ6MDtwb2ludGVyLWV2ZW50czpub25lO2JvcmRlcjoxLjVweCBkYXNoZWQgcmdiYSgwLDAsMCwuMjUpOycgKwogICAgJyAgdHJhbnNpdGlvbjpib3JkZXItY29sb3IgLjEyc30nICsKICAgICc6aG9zdChbZGF0YS1vdmVyXSkgLnJpbmd7Ym9yZGVyLWNvbG9yOiNjOTY0NDJ9JyArCiAgICAnOmhvc3QoW2RhdGEtZmlsbGVkXSkgLnJpbmd7ZGlzcGxheTpub25lfScgKwogICAgLy8gQ29udHJvbHMgc2l0IEJFTE9XIHRoZSBtYXNrICh0b3A6MTAwJSksIGFic29sdXRlbHkgcG9zaXRpb25lZCBzbyB0aGUKICAgIC8vIGF1dGhvci1kZWNsYXJlZCBzbG90IGhlaWdodCBpcyB1bmFmZmVjdGVkLiBUaGUgZ2FwIGlzIHBhZGRpbmcsIG5vdCBhCiAgICAvLyB0b3Agb2Zmc2V0LCBzbyB0aGUgaG92ZXIgdGFyZ2V0IHN0YXlzIGNvbnRpZ3VvdXMgd2l0aCB0aGUgZnJhbWUuCiAgICAnLmN0bHtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MTAwJTtsZWZ0OjUwJTt0cmFuc2Zvcm06dHJhbnNsYXRlWCgtNTAlKTtwYWRkaW5nLXRvcDo4cHg7JyArCiAgICAnICBkaXNwbGF5OmZsZXg7Z2FwOjZweDtvcGFjaXR5OjA7cG9pbnRlci1ldmVudHM6bm9uZTt0cmFuc2l0aW9uOm9wYWNpdHkgLjEyczt6LWluZGV4OjI7JyArCiAgICAnICB3aGl0ZS1zcGFjZTpub3dyYXB9JyArCiAgICAnOmhvc3QoW2RhdGEtZmlsbGVkXVtkYXRhLWVkaXRhYmxlXTpob3ZlcikgLmN0bCw6aG9zdChbZGF0YS1yZWZyYW1lXSkgLmN0bCcgKwogICAgJyAge29wYWNpdHk6MTtwb2ludGVyLWV2ZW50czphdXRvfScgKwogICAgJy5jdGwgYnV0dG9ue2FwcGVhcmFuY2U6bm9uZTtib3JkZXI6MDtib3JkZXItcmFkaXVzOjZweDtwYWRkaW5nOjVweCAxMHB4O2N1cnNvcjpwb2ludGVyOycgKwogICAgJyAgYmFja2dyb3VuZDpyZ2JhKDAsMCwwLC42NSk7Y29sb3I6I2ZmZjtmb250OjExcHgvMSBzeXN0ZW0tdWksLWFwcGxlLXN5c3RlbSxzYW5zLXNlcmlmOycgKwogICAgJyAgYmFja2Ryb3AtZmlsdGVyOmJsdXIoNnB4KX0nICsKICAgICcuY3RsIGJ1dHRvbjpob3ZlcntiYWNrZ3JvdW5kOnJnYmEoMCwwLDAsLjgpfScgKwogICAgJy5lcnJ7cG9zaXRpb246YWJzb2x1dGU7bGVmdDo4cHg7Ym90dG9tOjhweDtyaWdodDo4cHg7Y29sb3I6I2IzMjYxZTtmb250LXNpemU6MTFweDsnICsKICAgICcgIGJhY2tncm91bmQ6cmdiYSgyNTUsMjU1LDI1NSwuODUpO3BhZGRpbmc6NHB4IDZweDtib3JkZXItcmFkaXVzOjVweDtwb2ludGVyLWV2ZW50czpub25lfSc7CgogIGNvbnN0IGljb24gPQogICAgJzxzdmcgd2lkdGg9IjI4IiBoZWlnaHQ9IjI4IiB2aWV3Qm94PSIwIDAgMjQgMjQiIGZpbGw9Im5vbmUiIHN0cm9rZT0iY3VycmVudENvbG9yIiAnICsKICAgICdzdHJva2Utd2lkdGg9IjEuNiIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIj4nICsKICAgICc8cmVjdCB4PSIzIiB5PSIzIiB3aWR0aD0iMTgiIGhlaWdodD0iMTgiIHJ4PSIyIi8+PGNpcmNsZSBjeD0iOC41IiBjeT0iOC41IiByPSIxLjUiLz4nICsKICAgICc8cGF0aCBkPSJtMjEgMTUtNS01TDUgMjEiLz48L3N2Zz4nOwoKICBjbGFzcyBJbWFnZVNsb3QgZXh0ZW5kcyBIVE1MRWxlbWVudCB7CiAgICBzdGF0aWMgZ2V0IG9ic2VydmVkQXR0cmlidXRlcygpIHsKICAgICAgcmV0dXJuIFsnc2hhcGUnLCAncmFkaXVzJywgJ21hc2snLCAnZml0JywgJ3Bvc2l0aW9uJywgJ3BsYWNlaG9sZGVyJywgJ3NyYycsICdpZCddOwogICAgfQoKICAgIGNvbnN0cnVjdG9yKCkgewogICAgICBzdXBlcigpOwogICAgICBjb25zdCByb290ID0gdGhpcy5hdHRhY2hTaGFkb3coeyBtb2RlOiAnb3BlbicgfSk7CiAgICAgIC8vIC5zcGlsbCBhbmQgLmN0bCBzaXQgT1VUU0lERSAuZnJhbWUgc28gb3ZlcmZsb3c6aGlkZGVuICsgYm9yZGVyLXJhZGl1cwogICAgICAvLyBvbiB0aGUgZnJhbWUgKGNpcmNsZSwgcGlsbCwgcm91bmRlZCkgY2FuJ3QgY2xpcCB0aGVtLgogICAgICByb290LmlubmVySFRNTCA9CiAgICAgICAgJzxzdHlsZT4nICsgc3R5bGVzaGVldCArICc8L3N0eWxlPicgKwogICAgICAgICc8ZGl2IGNsYXNzPSJmcmFtZSIgcGFydD0iZnJhbWUiPicgKwogICAgICAgICcgIDxpbWcgcGFydD0iaW1hZ2UiIGFsdD0iIiBkcmFnZ2FibGU9ImZhbHNlIiBzdHlsZT0iZGlzcGxheTpub25lIj4nICsKICAgICAgICAnICA8ZGl2IGNsYXNzPSJlbXB0eSIgcGFydD0iZW1wdHkiPicgKyBpY29uICsKICAgICAgICAnICAgIDxkaXYgY2xhc3M9ImNhcCI+PC9kaXY+JyArCiAgICAgICAgJyAgICA8ZGl2IGNsYXNzPSJzdWIiPm9yIDx1PmJyb3dzZSBmaWxlczwvdT48L2Rpdj48L2Rpdj4nICsKICAgICAgICAnICA8ZGl2IGNsYXNzPSJyaW5nIiBwYXJ0PSJyaW5nIj48L2Rpdj4nICsKICAgICAgICAnPC9kaXY+JyArCiAgICAgICAgJzxkaXYgY2xhc3M9InNwaWxsIj4nICsKICAgICAgICAnICA8aW1nIGNsYXNzPSJnaG9zdCIgYWx0PSIiIGRyYWdnYWJsZT0iZmFsc2UiPicgKwogICAgICAgICcgIDxkaXYgY2xhc3M9ImhhbmRsZSIgZGF0YS1jPSJudyI+PC9kaXY+PGRpdiBjbGFzcz0iaGFuZGxlIiBkYXRhLWM9Im5lIj48L2Rpdj4nICsKICAgICAgICAnICA8ZGl2IGNsYXNzPSJoYW5kbGUiIGRhdGEtYz0ic3ciPjwvZGl2PjxkaXYgY2xhc3M9ImhhbmRsZSIgZGF0YS1jPSJzZSI+PC9kaXY+JyArCiAgICAgICAgJzwvZGl2PicgKwogICAgICAgICc8ZGl2IGNsYXNzPSJjdGwiPjxidXR0b24gZGF0YS1hY3Q9InJlcGxhY2UiIHRpdGxlPSJSZXBsYWNlIGltYWdlIj5SZXBsYWNlPC9idXR0b24+JyArCiAgICAgICAgJyAgPGJ1dHRvbiBkYXRhLWFjdD0iY2xlYXIiIHRpdGxlPSJSZW1vdmUgaW1hZ2UiPlJlbW92ZTwvYnV0dG9uPjwvZGl2PicgKwogICAgICAgICc8aW5wdXQgdHlwZT0iZmlsZSIgYWNjZXB0PSInICsgQUNDRVBULmpvaW4oJywnKSArICciIGhpZGRlbj4nOwogICAgICB0aGlzLl9mcmFtZSA9IHJvb3QucXVlcnlTZWxlY3RvcignLmZyYW1lJyk7CiAgICAgIHRoaXMuX3JpbmcgPSByb290LnF1ZXJ5U2VsZWN0b3IoJy5yaW5nJyk7CiAgICAgIHRoaXMuX2ltZyA9IHJvb3QucXVlcnlTZWxlY3RvcignLmZyYW1lIGltZycpOwogICAgICB0aGlzLl9lbXB0eSA9IHJvb3QucXVlcnlTZWxlY3RvcignLmVtcHR5Jyk7CiAgICAgIHRoaXMuX2NhcCA9IHJvb3QucXVlcnlTZWxlY3RvcignLmNhcCcpOwogICAgICB0aGlzLl9zdWIgPSByb290LnF1ZXJ5U2VsZWN0b3IoJy5zdWInKTsKICAgICAgdGhpcy5fc3BpbGwgPSByb290LnF1ZXJ5U2VsZWN0b3IoJy5zcGlsbCcpOwogICAgICB0aGlzLl9naG9zdCA9IHJvb3QucXVlcnlTZWxlY3RvcignLmdob3N0Jyk7CiAgICAgIHRoaXMuX2VyciA9IG51bGw7CiAgICAgIHRoaXMuX2lucHV0ID0gcm9vdC5xdWVyeVNlbGVjdG9yKCdpbnB1dCcpOwogICAgICB0aGlzLl9kZXB0aCA9IDA7CiAgICAgIHRoaXMuX2dlbiA9IDA7CiAgICAgIHRoaXMuX3ZpZXcgPSB7IHM6IDEsIHg6IDAsIHk6IDAgfTsKICAgICAgdGhpcy5fc3ViRm4gPSAoKSA9PiB0aGlzLl9yZW5kZXIoKTsKICAgICAgLy8gU2hhZG93LURPTSBsaXN0ZW5lcnMgbGl2ZSB3aXRoIHRoZSBzaGFkb3cgRE9NIOKAlCBib3VuZCBvbmNlIGhlcmUgc28KICAgICAgLy8gZGlzY29ubmVjdC9yZWNvbm5lY3QgKGUuZy4gUmVhY3QgcmVtb3VudCkgZG9lc24ndCBzdGFjayBoYW5kbGVycy4KICAgICAgdGhpcy5fZW1wdHkuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB0aGlzLl9pbnB1dC5jbGljaygpKTsKICAgICAgcm9vdC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChlKSA9PiB7CiAgICAgICAgY29uc3QgYWN0ID0gZS50YXJnZXQgJiYgZS50YXJnZXQuZ2V0QXR0cmlidXRlICYmIGUudGFyZ2V0LmdldEF0dHJpYnV0ZSgnZGF0YS1hY3QnKTsKICAgICAgICBpZiAoYWN0ID09PSAncmVwbGFjZScpIHsgdGhpcy5fZXhpdFJlZnJhbWUodHJ1ZSk7IHRoaXMuX2lucHV0LmNsaWNrKCk7IH0KICAgICAgICBpZiAoYWN0ID09PSAnY2xlYXInKSB7CiAgICAgICAgICB0aGlzLl9leGl0UmVmcmFtZShmYWxzZSk7CiAgICAgICAgICB0aGlzLl9nZW4rKzsKICAgICAgICAgIHRoaXMuX2xvY2FsID0gbnVsbDsKICAgICAgICAgIGlmICh0aGlzLmlkKSBzZXRTbG90KHRoaXMuaWQsIG51bGwpOyBlbHNlIHRoaXMuX3JlbmRlcigpOwogICAgICAgIH0KICAgICAgfSk7CiAgICAgIHRoaXMuX2lucHV0LmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsICgpID0+IHsKICAgICAgICBjb25zdCBmID0gdGhpcy5faW5wdXQuZmlsZXMgJiYgdGhpcy5faW5wdXQuZmlsZXNbMF07CiAgICAgICAgaWYgKGYpIHRoaXMuX2luZ2VzdChmKTsKICAgICAgICB0aGlzLl9pbnB1dC52YWx1ZSA9ICcnOwogICAgICB9KTsKICAgICAgLy8gbmF0dXJhbFdpZHRoL0hlaWdodCBhcmVuJ3Qga25vd24gdW50aWwgbG9hZCDigJQgcmUtYXBwbHkgc28gdGhlIGNvdmVyCiAgICAgIC8vIGJhc2VsaW5lIGlzIGNvbXB1dGVkIGZyb20gcmVhbCBkaW1lbnNpb25zLCBub3QgdGhlIDEwMCXDlzEwMCUgZmFsbGJhY2suCiAgICAgIHRoaXMuX2ltZy5hZGRFdmVudExpc3RlbmVyKCdsb2FkJywgKCkgPT4gdGhpcy5fYXBwbHlWaWV3KCkpOwogICAgICAvLyBHYXRlZCBvbiBlZGl0YWJsZSArIGZpdD1jb3ZlciBzbyBzaGFyZSBsaW5rcyBhbmQgY29udGFpbi9maWxsIHNsb3RzCiAgICAgIC8vIHN0YXkgc3RhdGljLgogICAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoJ2RibGNsaWNrJywgKGUpID0+IHsKICAgICAgICBpZiAoIXRoaXMuaGFzQXR0cmlidXRlKCdkYXRhLWVkaXRhYmxlJykgfHwgIXRoaXMuX3JlZnJhbWVzKCkpIHJldHVybjsKICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgaWYgKHRoaXMuaGFzQXR0cmlidXRlKCdkYXRhLXJlZnJhbWUnKSkgdGhpcy5fZXhpdFJlZnJhbWUodHJ1ZSk7CiAgICAgICAgZWxzZSB0aGlzLl9lbnRlclJlZnJhbWUoKTsKICAgICAgfSk7CiAgICAgIC8vIFBhbiArIHJlc2l6ZSBib3RoIG9yaWdpbmF0ZSBvbiB0aGUgc3BpbGwgbGF5ZXIuIEEgaGFuZGxlIHBvaW50ZXJkb3duCiAgICAgIC8vIGRyaXZlcyBhbiBhc3BlY3QtbG9ja2VkIHJlc2l6ZSBhbmNob3JlZCBhdCB0aGUgb3Bwb3NpdGUgY29ybmVyOyBhbnkKICAgICAgLy8gb3RoZXIgcG9pbnRlcmRvd24gb24gdGhlIHNwaWxsIHBhbnMuIE9mZnNldHMgYXJlIGZyYW1lLSUgc28gYQogICAgICAvLyByZWZyYW1lZCBzbG90IHN1cnZpdmVzIHJlc3BvbnNpdmUgcmVzaXplIC8gUFBUWCBleHBvcnQuCiAgICAgIHRoaXMuX3NwaWxsLmFkZEV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJkb3duJywgKGUpID0+IHsKICAgICAgICBpZiAoZS5idXR0b24gIT09IDAgfHwgIXRoaXMuaGFzQXR0cmlidXRlKCdkYXRhLXJlZnJhbWUnKSkgcmV0dXJuOwogICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpOwogICAgICAgIHRoaXMuX3NwaWxsLnNldFBvaW50ZXJDYXB0dXJlKGUucG9pbnRlcklkKTsKICAgICAgICBjb25zdCByZWN0ID0gdGhpcy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsKICAgICAgICBjb25zdCBmdyA9IHJlY3Qud2lkdGggfHwgMSwgZmggPSByZWN0LmhlaWdodCB8fCAxOwogICAgICAgIGNvbnN0IGNvcm5lciA9IGUudGFyZ2V0LmdldEF0dHJpYnV0ZSAmJiBlLnRhcmdldC5nZXRBdHRyaWJ1dGUoJ2RhdGEtYycpOwogICAgICAgIGxldCBtb3ZlOwogICAgICAgIGlmIChjb3JuZXIpIHsKICAgICAgICAgIC8vIFJlc2l6ZSBhYm91dCB0aGUgT1BQT1NJVEUgY29ybmVyLiBWaWV3cG9ydC1weCB0aHJvdWdob3V0IChyZWN0CiAgICAgICAgICAvLyBmdy9maCwgbm90IGNsaWVudFdpZHRoKSBzbyB0aGUgbWF0aCBzdXJ2aXZlcyBhIHRyYW5zZm9ybTpzY2FsZSgpCiAgICAgICAgICAvLyBhbmNlc3RvciDigJQgZGVja19zdGFnZSByZW5kZXJzIHNsaWRlcyBzY2FsZWQtdG8tZml0LgogICAgICAgICAgY29uc3QgaXcgPSB0aGlzLl9pbWcubmF0dXJhbFdpZHRoIHx8IDEsIGloID0gdGhpcy5faW1nLm5hdHVyYWxIZWlnaHQgfHwgMTsKICAgICAgICAgIGNvbnN0IGJhc2UgPSBNYXRoLm1heChmdyAvIGl3LCBmaCAvIGloKTsKICAgICAgICAgIGNvbnN0IHN4ID0gY29ybmVyLmluY2x1ZGVzKCdlJykgPyAxIDogLTE7CiAgICAgICAgICBjb25zdCBzeSA9IGNvcm5lci5pbmNsdWRlcygncycpID8gMSA6IC0xOwogICAgICAgICAgY29uc3QgczAgPSB0aGlzLl92aWV3LnM7CiAgICAgICAgICBjb25zdCB3MCA9IGl3ICogYmFzZSAqIHMwLCBoMCA9IGloICogYmFzZSAqIHMwOwogICAgICAgICAgY29uc3QgY3gwID0gKDUwICsgdGhpcy5fdmlldy54KSAvIDEwMCAqIGZ3OwogICAgICAgICAgY29uc3QgY3kwID0gKDUwICsgdGhpcy5fdmlldy55KSAvIDEwMCAqIGZoOwogICAgICAgICAgY29uc3Qgb3ggPSBjeDAgLSBzeCAqIHcwIC8gMiwgb3kgPSBjeTAgLSBzeSAqIGgwIC8gMjsKICAgICAgICAgIGNvbnN0IGRpYWcwID0gTWF0aC5oeXBvdCh3MCwgaDApOwogICAgICAgICAgY29uc3QgdXggPSBzeCAqIHcwIC8gZGlhZzAsIHV5ID0gc3kgKiBoMCAvIGRpYWcwOwogICAgICAgICAgbW92ZSA9IChldikgPT4gewogICAgICAgICAgICBjb25zdCBwcm9qID0gKGV2LmNsaWVudFggLSByZWN0LmxlZnQgLSBveCkgKiB1eCArCiAgICAgICAgICAgICAgICAgICAgICAgICAoZXYuY2xpZW50WSAtIHJlY3QudG9wIC0gb3kpICogdXk7CiAgICAgICAgICAgIGNvbnN0IHMgPSBjbGFtcFMoczAgKiBwcm9qIC8gZGlhZzApOwogICAgICAgICAgICBjb25zdCBkID0gZGlhZzAgKiBzIC8gczA7CiAgICAgICAgICAgIHRoaXMuX3ZpZXcucyA9IHM7CiAgICAgICAgICAgIHRoaXMuX3ZpZXcueCA9IChveCArIHV4ICogZCAvIDIpIC8gZncgKiAxMDAgLSA1MDsKICAgICAgICAgICAgdGhpcy5fdmlldy55ID0gKG95ICsgdXkgKiBkIC8gMikgLyBmaCAqIDEwMCAtIDUwOwogICAgICAgICAgICB0aGlzLl9jbGFtcFZpZXcoKTsKICAgICAgICAgICAgdGhpcy5fYXBwbHlWaWV3KCk7CiAgICAgICAgICB9OwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB0aGlzLnNldEF0dHJpYnV0ZSgnZGF0YS1wYW5uaW5nJywgJycpOwogICAgICAgICAgY29uc3Qgc3RhcnQgPSB7IHB4OiBlLmNsaWVudFgsIHB5OiBlLmNsaWVudFksIHg6IHRoaXMuX3ZpZXcueCwgeTogdGhpcy5fdmlldy55IH07CiAgICAgICAgICBtb3ZlID0gKGV2KSA9PiB7CiAgICAgICAgICAgIHRoaXMuX3ZpZXcueCA9IHN0YXJ0LnggKyAoZXYuY2xpZW50WCAtIHN0YXJ0LnB4KSAvIGZ3ICogMTAwOwogICAgICAgICAgICB0aGlzLl92aWV3LnkgPSBzdGFydC55ICsgKGV2LmNsaWVudFkgLSBzdGFydC5weSkgLyBmaCAqIDEwMDsKICAgICAgICAgICAgdGhpcy5fY2xhbXBWaWV3KCk7CiAgICAgICAgICAgIHRoaXMuX2FwcGx5VmlldygpOwogICAgICAgICAgfTsKICAgICAgICB9CiAgICAgICAgY29uc3QgdXAgPSAoKSA9PiB7CiAgICAgICAgICB0cnkgeyB0aGlzLl9zcGlsbC5yZWxlYXNlUG9pbnRlckNhcHR1cmUoZS5wb2ludGVySWQpOyB9IGNhdGNoIHt9CiAgICAgICAgICB0aGlzLl9zcGlsbC5yZW1vdmVFdmVudExpc3RlbmVyKCdwb2ludGVybW92ZScsIG1vdmUpOwogICAgICAgICAgdGhpcy5fc3BpbGwucmVtb3ZlRXZlbnRMaXN0ZW5lcigncG9pbnRlcnVwJywgdXApOwogICAgICAgICAgdGhpcy5fc3BpbGwucmVtb3ZlRXZlbnRMaXN0ZW5lcigncG9pbnRlcmNhbmNlbCcsIHVwKTsKICAgICAgICAgIHRoaXMucmVtb3ZlQXR0cmlidXRlKCdkYXRhLXBhbm5pbmcnKTsKICAgICAgICAgIHRoaXMuX2RyYWdVcCA9IG51bGw7CiAgICAgICAgfTsKICAgICAgICAvLyBTdGFzaGVkIHNvIF9leGl0UmVmcmFtZSAoRXNjYXBlIC8gb3V0c2lkZS1jbGljayBtaWQtZHJhZykgY2FuCiAgICAgICAgLy8gdGVhciB0aGUgY2FwdHVyZSArIGxpc3RlbmVycyBkb3duIHN5bmNocm9ub3VzbHkuCiAgICAgICAgdGhpcy5fZHJhZ1VwID0gdXA7CiAgICAgICAgdGhpcy5fc3BpbGwuYWRkRXZlbnRMaXN0ZW5lcigncG9pbnRlcm1vdmUnLCBtb3ZlKTsKICAgICAgICB0aGlzLl9zcGlsbC5hZGRFdmVudExpc3RlbmVyKCdwb2ludGVydXAnLCB1cCk7CiAgICAgICAgdGhpcy5fc3BpbGwuYWRkRXZlbnRMaXN0ZW5lcigncG9pbnRlcmNhbmNlbCcsIHVwKTsKICAgICAgfSk7CiAgICAgIC8vIFdoZWVsIHpvb20gc3RheXMgYXZhaWxhYmxlIGluc2lkZSByZWZyYW1lIG1vZGUgYXMgYSB0cmFja3BhZCBuaWNldHkg4oCUCiAgICAgIC8vIHpvb21zIHRvd2FyZCB0aGUgY3Vyc29yIChvZmZzZXQnID0gY3Vyc29ywrcoMS1rKSArIG9mZnNldMK3aykuCiAgICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcignd2hlZWwnLCAoZSkgPT4gewogICAgICAgIGlmICghdGhpcy5oYXNBdHRyaWJ1dGUoJ2RhdGEtcmVmcmFtZScpKSByZXR1cm47CiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgIGNvbnN0IHIgPSB0aGlzLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOwogICAgICAgIGNvbnN0IGN4ID0gKGUuY2xpZW50WCAtIHIubGVmdCkgLyByLndpZHRoICogMTAwIC0gNTA7CiAgICAgICAgY29uc3QgY3kgPSAoZS5jbGllbnRZIC0gci50b3ApIC8gci5oZWlnaHQgKiAxMDAgLSA1MDsKICAgICAgICBjb25zdCBwcmV2ID0gdGhpcy5fdmlldy5zOwogICAgICAgIGNvbnN0IG5leHQgPSBjbGFtcFMocHJldiAqIE1hdGgucG93KDEuMDAxNSwgLWUuZGVsdGFZKSk7CiAgICAgICAgaWYgKG5leHQgPT09IHByZXYpIHJldHVybjsKICAgICAgICBjb25zdCBrID0gbmV4dCAvIHByZXY7CiAgICAgICAgdGhpcy5fdmlldy5zID0gbmV4dDsKICAgICAgICB0aGlzLl92aWV3LnggPSBjeCAqICgxIC0gaykgKyB0aGlzLl92aWV3LnggKiBrOwogICAgICAgIHRoaXMuX3ZpZXcueSA9IGN5ICogKDEgLSBrKSArIHRoaXMuX3ZpZXcueSAqIGs7CiAgICAgICAgdGhpcy5fY2xhbXBWaWV3KCk7CiAgICAgICAgdGhpcy5fYXBwbHlWaWV3KCk7CiAgICAgIH0sIHsgcGFzc2l2ZTogZmFsc2UgfSk7CiAgICB9CgogICAgY29ubmVjdGVkQ2FsbGJhY2soKSB7CiAgICAgIC8vIFdhcm4gb25jZSBwZXIgcGFnZSDigJQgYW4gaWQtbGVzcyBzbG90IHdvcmtzIGZvciB0aGUgc2Vzc2lvbiBidXQKICAgICAgLy8gY2Fubm90IHBlcnNpc3QsIGFuZCB0d28gaWQtbGVzcyBzbG90cyB3b3VsZCBzaGFyZSBub3RoaW5nLgogICAgICBpZiAoIXRoaXMuaWQgJiYgIUltYWdlU2xvdC5fd2FybmVkKSB7CiAgICAgICAgSW1hZ2VTbG90Ll93YXJuZWQgPSB0cnVlOwogICAgICAgIGNvbnNvbGUud2FybignPGltYWdlLXNsb3Q+IHdpdGhvdXQgYW4gaWQgd2lsbCBub3QgcGVyc2lzdCBpdHMgZHJvcHBlZCBpbWFnZS4nKTsKICAgICAgfQogICAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoJ2RyYWdlbnRlcicsIHRoaXMpOwogICAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoJ2RyYWdvdmVyJywgdGhpcyk7CiAgICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcignZHJhZ2xlYXZlJywgdGhpcyk7CiAgICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcignZHJvcCcsIHRoaXMpOwogICAgICBzdWJzLmFkZCh0aGlzLl9zdWJGbik7CiAgICAgIC8vIHdpZHRoJS9oZWlnaHQlIGluIF9hcHBseVZpZXcgZW5jb2RlIHRoZSBmcmFtZSBhc3BlY3QgYXQgY2FsbCB0aW1lIOKAlAogICAgICAvLyBhIGhvc3QgcmVzaXplIChyZXNwb25zaXZlIGdyaWQsIHBhbmUgZGl2aWRlcikgd291bGQgc3RyZXRjaCB0aGUKICAgICAgLy8gaW1hZ2UgdW50aWwgdGhlIG5leHQgX3JlbmRlci4gUmUtcmVuZGVyIG9uIHNpemUgY2hhbmdlOiBfcmVuZGVyKCkKICAgICAgLy8gcmUtc2VlZHMgX3ZpZXcgZnJvbSBzdG9yZWQgYmVmb3JlIGNsYW1wL2FwcGx5LCBzbyBhIHNocmlua+KGkmdyb3cKICAgICAgLy8gY3ljbGUgcm91bmQtdHJpcHMgaW5zdGVhZCBvZiByYXRjaGV0aW5nIHgveSB0b3dhcmQgdGhlIG5hcnJvd2VyCiAgICAgIC8vIGZyYW1lJ3MgY2xhbXAgcmFuZ2UuCiAgICAgIHRoaXMuX3JvID0gbmV3IFJlc2l6ZU9ic2VydmVyKCgpID0+IHRoaXMuX3JlbmRlcigpKTsKICAgICAgdGhpcy5fcm8ub2JzZXJ2ZSh0aGlzKTsKICAgICAgbG9hZCgpOwogICAgICB0aGlzLl9yZW5kZXIoKTsKICAgIH0KCiAgICBkaXNjb25uZWN0ZWRDYWxsYmFjaygpIHsKICAgICAgc3Vicy5kZWxldGUodGhpcy5fc3ViRm4pOwogICAgICB0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2RyYWdlbnRlcicsIHRoaXMpOwogICAgICB0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2RyYWdvdmVyJywgdGhpcyk7CiAgICAgIHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcignZHJhZ2xlYXZlJywgdGhpcyk7CiAgICAgIHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcignZHJvcCcsIHRoaXMpOwogICAgICBpZiAodGhpcy5fcm8pIHsgdGhpcy5fcm8uZGlzY29ubmVjdCgpOyB0aGlzLl9ybyA9IG51bGw7IH0KICAgICAgdGhpcy5fZXhpdFJlZnJhbWUoZmFsc2UpOwogICAgfQoKICAgIF9lbnRlclJlZnJhbWUoKSB7CiAgICAgIGlmICh0aGlzLmhhc0F0dHJpYnV0ZSgnZGF0YS1yZWZyYW1lJykpIHJldHVybjsKICAgICAgdGhpcy5zZXRBdHRyaWJ1dGUoJ2RhdGEtcmVmcmFtZScsICcnKTsKICAgICAgdGhpcy5fYXBwbHlWaWV3KCk7CiAgICAgIC8vIENsb3NlIG9uIGNsaWNrIG91dHNpZGUgKHRoZSBzcGlsbCBoYW5kbGVyIHN0b3BQcm9wYWdhdGlvbigpcyBzbwogICAgICAvLyBpbi1pbWFnZSBkcmFncyBkb24ndCByZWFjaCB0aGlzKSBhbmQgb24gRXNjYXBlLiBMaXN0ZW5lcnMgYXJlIGhlbGQKICAgICAgLy8gb24gdGhlIGluc3RhbmNlIHNvIF9leGl0UmVmcmFtZSAvIGRpc2Nvbm5lY3RlZENhbGxiYWNrIGNhbiBkZXRhY2gKICAgICAgLy8gZXhhY3RseSB3aGF0IHdhcyBhdHRhY2hlZC4KICAgICAgdGhpcy5fb3V0c2lkZSA9IChlKSA9PiB7CiAgICAgICAgaWYgKGUuY29tcG9zZWRQYXRoICYmIGUuY29tcG9zZWRQYXRoKCkuaW5jbHVkZXModGhpcykpIHJldHVybjsKICAgICAgICB0aGlzLl9leGl0UmVmcmFtZSh0cnVlKTsKICAgICAgfTsKICAgICAgdGhpcy5fZXNjID0gKGUpID0+IHsgaWYgKGUua2V5ID09PSAnRXNjYXBlJykgdGhpcy5fZXhpdFJlZnJhbWUodHJ1ZSk7IH07CiAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJkb3duJywgdGhpcy5fb3V0c2lkZSwgdHJ1ZSk7CiAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCB0aGlzLl9lc2MsIHRydWUpOwogICAgfQoKICAgIF9leGl0UmVmcmFtZShjb21taXQpIHsKICAgICAgaWYgKCF0aGlzLmhhc0F0dHJpYnV0ZSgnZGF0YS1yZWZyYW1lJykpIHJldHVybjsKICAgICAgaWYgKHRoaXMuX2RyYWdVcCkgdGhpcy5fZHJhZ1VwKCk7CiAgICAgIHRoaXMucmVtb3ZlQXR0cmlidXRlKCdkYXRhLXJlZnJhbWUnKTsKICAgICAgdGhpcy5yZW1vdmVBdHRyaWJ1dGUoJ2RhdGEtcGFubmluZycpOwogICAgICBpZiAodGhpcy5fb3V0c2lkZSkgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigncG9pbnRlcmRvd24nLCB0aGlzLl9vdXRzaWRlLCB0cnVlKTsKICAgICAgaWYgKHRoaXMuX2VzYykgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIHRoaXMuX2VzYywgdHJ1ZSk7CiAgICAgIHRoaXMuX291dHNpZGUgPSB0aGlzLl9lc2MgPSBudWxsOwogICAgICBpZiAoY29tbWl0KSB0aGlzLl9jb21taXRWaWV3KCk7CiAgICB9CgogICAgYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrKCkgeyBpZiAodGhpcy5zaGFkb3dSb290KSB0aGlzLl9yZW5kZXIoKTsgfQoKICAgIC8vIGhhbmRsZUV2ZW50IOKAlCBvbmUgbGlzdGVuZXIgb2JqZWN0IGZvciBhbGwgZm91ciBkcmFnIGV2ZW50cyBrZWVwcyB0aGUKICAgIC8vIGFkZC9yZW1vdmUgc3ltbWV0cmljIGFuZCB0aGUgZGVwdGggY291bnRlciBjb3JyZWN0LgogICAgaGFuZGxlRXZlbnQoZSkgewogICAgICBpZiAoZS50eXBlID09PSAnZHJhZ2VudGVyJyB8fCBlLnR5cGUgPT09ICdkcmFnb3ZlcicpIHsKICAgICAgICAvLyBXaXRob3V0IHByZXZlbnREZWZhdWx0IHRoZSBicm93c2VyIG5ldmVyIGZpcmVzICdkcm9wJy4KICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTsKICAgICAgICBpZiAoZS5kYXRhVHJhbnNmZXIpIGUuZGF0YVRyYW5zZmVyLmRyb3BFZmZlY3QgPSAnY29weSc7CiAgICAgICAgaWYgKGUudHlwZSA9PT0gJ2RyYWdlbnRlcicpIHRoaXMuX2RlcHRoKys7CiAgICAgICAgdGhpcy5zZXRBdHRyaWJ1dGUoJ2RhdGEtb3ZlcicsICcnKTsKICAgICAgfSBlbHNlIGlmIChlLnR5cGUgPT09ICdkcmFnbGVhdmUnKSB7CiAgICAgICAgLy8gZHJhZ2VudGVyL2xlYXZlIGZpcmUgZm9yIGV2ZXJ5IGRlc2NlbmRhbnQgY3Jvc3Npbmcg4oCUIGNvdW50IGRlcHRoCiAgICAgICAgLy8gc28gaG92ZXJpbmcgdGhlIGljb24gaW5zaWRlIHRoZSBlbXB0eSBzdGF0ZSBkb2Vzbid0IGZsaWNrZXIuCiAgICAgICAgaWYgKC0tdGhpcy5fZGVwdGggPD0gMCkgeyB0aGlzLl9kZXB0aCA9IDA7IHRoaXMucmVtb3ZlQXR0cmlidXRlKCdkYXRhLW92ZXInKTsgfQogICAgICB9IGVsc2UgaWYgKGUudHlwZSA9PT0gJ2Ryb3AnKSB7CiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7CiAgICAgICAgdGhpcy5fZGVwdGggPSAwOwogICAgICAgIHRoaXMucmVtb3ZlQXR0cmlidXRlKCdkYXRhLW92ZXInKTsKICAgICAgICBjb25zdCBmID0gZS5kYXRhVHJhbnNmZXIgJiYgZS5kYXRhVHJhbnNmZXIuZmlsZXMgJiYgZS5kYXRhVHJhbnNmZXIuZmlsZXNbMF07CiAgICAgICAgaWYgKGYpIHRoaXMuX2luZ2VzdChmKTsKICAgICAgfQogICAgfQoKICAgIGFzeW5jIF9pbmdlc3QoZmlsZSkgewogICAgICB0aGlzLl9zZXRFcnJvcihudWxsKTsKICAgICAgaWYgKCFmaWxlIHx8IEFDQ0VQVC5pbmRleE9mKGZpbGUudHlwZSkgPCAwKSB7CiAgICAgICAgdGhpcy5fc2V0RXJyb3IoJ0Ryb3AgYSBQTkcsIEpQRUcsIFdlYlAsIG9yIEFWSUYgaW1hZ2UuJyk7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIC8vIHRvRGF0YVVybCBjYW4gdGFrZSBodW5kcmVkcyBvZiBtcyBvbiBhIGxhcmdlIHBob3RvLiBBIENsZWFyIG9yIGEKICAgICAgLy8gbmV3ZXIgZHJvcCBkdXJpbmcgdGhhdCB3aW5kb3cgd291bGQgYmUgY2xvYmJlcmVkIHdoZW4gdGhpcyBhd2FpdAogICAgICAvLyByZXN1bWVzIOKAlCBidW1wICsgY2FwdHVyZSBhIGdlbmVyYXRpb24gc28gc3RhbGUgZW5jb2RlcyBiYWlsLgogICAgICBjb25zdCBnZW4gPSArK3RoaXMuX2dlbjsKICAgICAgdHJ5IHsKICAgICAgICBjb25zdCB3ID0gdGhpcy5jbGllbnRXaWR0aCB8fCB0aGlzLm9mZnNldFdpZHRoIHx8IE1BWF9ESU07CiAgICAgICAgY29uc3QgdXJsID0gYXdhaXQgdG9EYXRhVXJsKGZpbGUsIHcpOwogICAgICAgIGlmIChnZW4gIT09IHRoaXMuX2dlbikgcmV0dXJuOwogICAgICAgIC8vIE9ubHkgZXhpdCByZWZyYW1lIG9uY2UgdGhlIG5ldyBpbWFnZSBpcyBpbiBoYW5kIOKAlCBhIHJlamVjdGVkIHR5cGUKICAgICAgICAvLyBvciBkZWNvZGUgZmFpbHVyZSBsZWF2ZXMgdGhlIGluLXByb2dyZXNzIGNyb3AgdW50b3VjaGVkLgogICAgICAgIHRoaXMuX2V4aXRSZWZyYW1lKGZhbHNlKTsKICAgICAgICBjb25zdCB2YWwgPSB7IHU6IHVybCwgczogMSwgeDogMCwgeTogMCB9OwogICAgICAgIHNldFNsb3QodGhpcy5pZCB8fCAnJywgdmFsKTsKICAgICAgICAvLyBLZWVwIGEgc2Vzc2lvbi1sb2NhbCBjb3B5IGZvciBpZC1sZXNzIHNsb3RzIHNvIHRoZSBkcm9wIHN0aWxsCiAgICAgICAgLy8gc2hvd3MsIGV2ZW4gdGhvdWdoIGl0IGNhbm5vdCBwZXJzaXN0LgogICAgICAgIGlmICghdGhpcy5pZCkgeyB0aGlzLl9sb2NhbCA9IHZhbDsgdGhpcy5fcmVuZGVyKCk7IH0KICAgICAgfSBjYXRjaCAoZXJyKSB7CiAgICAgICAgaWYgKGdlbiAhPT0gdGhpcy5fZ2VuKSByZXR1cm47CiAgICAgICAgdGhpcy5fc2V0RXJyb3IoJ0NvdWxkIG5vdCByZWFkIHRoYXQgaW1hZ2UuJyk7CiAgICAgICAgY29uc29sZS53YXJuKCc8aW1hZ2Utc2xvdD4gaW5nZXN0IGZhaWxlZDonLCBlcnIpOwogICAgICB9CiAgICB9CgogICAgX3NldEVycm9yKG1zZykgewogICAgICBpZiAodGhpcy5fZXJyKSB7IHRoaXMuX2Vyci5yZW1vdmUoKTsgdGhpcy5fZXJyID0gbnVsbDsgfQogICAgICBpZiAoIW1zZykgcmV0dXJuOwogICAgICBjb25zdCBkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CiAgICAgIGQuY2xhc3NOYW1lID0gJ2Vycic7IGQudGV4dENvbnRlbnQgPSBtc2c7CiAgICAgIHRoaXMuc2hhZG93Um9vdC5hcHBlbmRDaGlsZChkKTsKICAgICAgdGhpcy5fZXJyID0gZDsKICAgICAgc2V0VGltZW91dCgoKSA9PiB7IGlmICh0aGlzLl9lcnIgPT09IGQpIHsgZC5yZW1vdmUoKTsgdGhpcy5fZXJyID0gbnVsbDsgfSB9LCAzMDAwKTsKICAgIH0KCiAgICAvLyBSZWZyYW1pbmcgKHBhbi9yZXNpemUpIGlzIG9ubHkgbWVhbmluZ2Z1bCBmb3IgZml0PWNvdmVyIOKAlCBjb250YWluL2ZpbGwKICAgIC8vIGtlZXAgdGhlIG9sZCBvYmplY3QtZml0IHBhdGggYW5kIGRvdWJsZS1jbGljayBpcyBhIG5vLW9wLgogICAgX3JlZnJhbWVzKCkgewogICAgICByZXR1cm4gdGhpcy5oYXNBdHRyaWJ1dGUoJ2RhdGEtZmlsbGVkJykgJiYKICAgICAgICAodGhpcy5nZXRBdHRyaWJ1dGUoJ2ZpdCcpIHx8ICdjb3ZlcicpID09PSAnY292ZXInOwogICAgfQoKICAgIC8vIENvdmVyLWJhc2VsaW5lIGdlb21ldHJ5LCBzaGFyZWQgYnkgY2xhbXAvYXBwbHkvcmVzaXplLiBOdWxsIHVudGlsIHRoZQogICAgLy8gaW1nIGhhcyBsb2FkZWQgKG5hdHVyYWxXaWR0aCBpcyAwIGJlZm9yZSB0aGF0KSBvciB3aGVuIHRoZSBzbG90IGhhcyBubwogICAgLy8gbGF5b3V0IGJveCDigJQgUmVzaXplT2JzZXJ2ZXIgZmlyZXMgd2l0aCBhIDDDlzAgcmVjdCB1bmRlciBkaXNwbGF5Om5vbmUsCiAgICAvLyBhbmQgY2xhbXBpbmcgYWdhaW5zdCBhIGRlZ2VuZXJhdGUgMcOXMSBmcmFtZSB3b3VsZCBzaWxlbnRseSBwdWxsIHRoZQogICAgLy8gc3RvcmVkIHBhbiB0b3dhcmQgemVyby4KICAgIF9nZW9tKCkgewogICAgICBjb25zdCBpdyA9IHRoaXMuX2ltZy5uYXR1cmFsV2lkdGgsIGloID0gdGhpcy5faW1nLm5hdHVyYWxIZWlnaHQ7CiAgICAgIGNvbnN0IGZ3ID0gdGhpcy5jbGllbnRXaWR0aCwgZmggPSB0aGlzLmNsaWVudEhlaWdodDsKICAgICAgaWYgKCFpdyB8fCAhaWggfHwgIWZ3IHx8ICFmaCkgcmV0dXJuIG51bGw7CiAgICAgIHJldHVybiB7IGl3LCBpaCwgZncsIGZoLCBiYXNlOiBNYXRoLm1heChmdyAvIGl3LCBmaCAvIGloKSB9OwogICAgfQoKICAgIF9jbGFtcFZpZXcoKSB7CiAgICAgIC8vIFBhbiByYW5nZSBvbiBlYWNoIGF4aXMgaXMgaGFsZiB0aGUgb3ZlcmZsb3cgcGFzdCB0aGUgZnJhbWUgZWRnZS4KICAgICAgY29uc3QgZyA9IHRoaXMuX2dlb20oKTsKICAgICAgaWYgKCFnKSByZXR1cm47CiAgICAgIGNvbnN0IG14ID0gTWF0aC5tYXgoMCwgKGcuaXcgKiBnLmJhc2UgKiB0aGlzLl92aWV3LnMgLyBnLmZ3IC0gMSkgKiA1MCk7CiAgICAgIGNvbnN0IG15ID0gTWF0aC5tYXgoMCwgKGcuaWggKiBnLmJhc2UgKiB0aGlzLl92aWV3LnMgLyBnLmZoIC0gMSkgKiA1MCk7CiAgICAgIHRoaXMuX3ZpZXcueCA9IE1hdGgubWF4KC1teCwgTWF0aC5taW4obXgsIHRoaXMuX3ZpZXcueCkpOwogICAgICB0aGlzLl92aWV3LnkgPSBNYXRoLm1heCgtbXksIE1hdGgubWluKG15LCB0aGlzLl92aWV3LnkpKTsKICAgIH0KCiAgICBfYXBwbHlWaWV3KCkgewogICAgICBjb25zdCBnID0gdGhpcy5fZ2VvbSgpOwogICAgICBjb25zdCBmaXQgPSB0aGlzLmdldEF0dHJpYnV0ZSgnZml0JykgfHwgJ2NvdmVyJzsKICAgICAgaWYgKGZpdCAhPT0gJ2NvdmVyJyB8fCAhZykgewogICAgICAgIC8vIE5vbi1jb3Zlciwgb3IgZGltZW5zaW9ucyBub3Qga25vd24geWV0IChiZWZvcmUgaW1nIGxvYWQpLgogICAgICAgIHRoaXMuX2ltZy5zdHlsZS53aWR0aCA9ICcxMDAlJzsKICAgICAgICB0aGlzLl9pbWcuc3R5bGUuaGVpZ2h0ID0gJzEwMCUnOwogICAgICAgIHRoaXMuX2ltZy5zdHlsZS5sZWZ0ID0gJzUwJSc7CiAgICAgICAgdGhpcy5faW1nLnN0eWxlLnRvcCA9ICc1MCUnOwogICAgICAgIHRoaXMuX2ltZy5zdHlsZS5vYmplY3RGaXQgPSBmaXQ7CiAgICAgICAgdGhpcy5faW1nLnN0eWxlLm9iamVjdFBvc2l0aW9uID0gdGhpcy5nZXRBdHRyaWJ1dGUoJ3Bvc2l0aW9uJykgfHwgJzUwJSA1MCUnOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICAvLyBDb3ZlciBiYXNlbGluZTogaW1nIGZpbGxzIHRoZSBmcmFtZSBvbiBpdHMgdGlnaHRlciBheGlzIGF0IHM9MSwgc28KICAgICAgLy8gcGFuIHdvcmtzIGltbWVkaWF0ZWx5IG9uIHRoZSBvdmVyZmxvd2luZyBheGlzIHdpdGhvdXQgem9vbWluZyBmaXJzdC4KICAgICAgLy8gV2lkdGgvaGVpZ2h0IGFuZCBsZWZ0L3RvcCBhcmUgYWxsIGZyYW1lLSUg4oCUIGRlcGVuZHMgb25seSBvbiB0aGUKICAgICAgLy8gZnJhbWUgYXNwZWN0IHJhdGlvLCBzbyBhIHJlc3BvbnNpdmUgcmVzaXplIGtlZXBzIHRoZSBzYW1lIGNyb3AuIFRoZQogICAgICAvLyBzcGlsbCBsYXllciBtaXJyb3JzIHRoZSBzYW1lIGJveCBzbyBpdHMgY29ybmVycyA9IGltYWdlIGNvcm5lcnMuCiAgICAgIGNvbnN0IGsgPSBnLmJhc2UgKiB0aGlzLl92aWV3LnM7CiAgICAgIGNvbnN0IHcgPSAoZy5pdyAqIGsgLyBnLmZ3ICogMTAwKSArICclJzsKICAgICAgY29uc3QgaCA9IChnLmloICogayAvIGcuZmggKiAxMDApICsgJyUnOwogICAgICBjb25zdCBsID0gKDUwICsgdGhpcy5fdmlldy54KSArICclJzsKICAgICAgY29uc3QgdCA9ICg1MCArIHRoaXMuX3ZpZXcueSkgKyAnJSc7CiAgICAgIHRoaXMuX2ltZy5zdHlsZS53aWR0aCA9IHc7IHRoaXMuX2ltZy5zdHlsZS5oZWlnaHQgPSBoOwogICAgICB0aGlzLl9pbWcuc3R5bGUubGVmdCA9IGw7IHRoaXMuX2ltZy5zdHlsZS50b3AgPSB0OwogICAgICB0aGlzLl9pbWcuc3R5bGUub2JqZWN0Rml0ID0gJyc7CiAgICAgIHRoaXMuX3NwaWxsLnN0eWxlLndpZHRoID0gdzsgdGhpcy5fc3BpbGwuc3R5bGUuaGVpZ2h0ID0gaDsKICAgICAgdGhpcy5fc3BpbGwuc3R5bGUubGVmdCA9IGw7IHRoaXMuX3NwaWxsLnN0eWxlLnRvcCA9IHQ7CiAgICB9CgogICAgX2NvbW1pdFZpZXcoKSB7CiAgICAgIGNvbnN0IHYgPSB7IHM6IHRoaXMuX3ZpZXcucywgeDogdGhpcy5fdmlldy54LCB5OiB0aGlzLl92aWV3LnkgfTsKICAgICAgaWYgKHRoaXMuX3VzZXJVcmwpIHYudSA9IHRoaXMuX3VzZXJVcmw7CiAgICAgIC8vIEZyYW1pbmctb25seSAobm8gdSkgcGVyc2lzdHMgdG9vIHNvIGFuIGF1dGhvci1zcmMgc2xvdCByZW1lbWJlcnMgaXRzCiAgICAgIC8vIGNyb3A7IGNsZWFyaW5nIHRoZSBzaWRlY2FyIHN0aWxsIGZhbGxzIHRocm91Z2ggdG8gc3JjPS4KICAgICAgaWYgKHRoaXMuaWQpIHNldFNsb3QodGhpcy5pZCwgdik7CiAgICAgIGVsc2UgeyB0aGlzLl9sb2NhbCA9IHY7IH0KICAgIH0KCiAgICBfcmVuZGVyKCkgewogICAgICAvLyBTaGFwZSAvIG1hc2suIFByZXNldHMgdXNlIGJvcmRlci1yYWRpdXMgc28gdGhlIGRhc2hlZCByaW5nIGNhbgogICAgICAvLyBmb2xsb3cgdGhlIHJvdW5kZWQgb3V0bGluZTsgY2xpcC1wYXRoIGlzIG9ubHkgYXBwbGllZCBmb3IgYW4KICAgICAgLy8gZXhwbGljaXQgYG1hc2tgICh0aGUgcmluZyBpcyBoaWRkZW4gdGhlcmUgc2luY2UgYSByZWN0YW5nbGUKICAgICAgLy8gZGFzaGVkIGJvcmRlciBjaG9wcGVkIGJ5IGFuIGFyYml0cmFyeSBwb2x5Z29uIGxvb2tzIGJyb2tlbikuCiAgICAgIGNvbnN0IG1hc2sgPSB0aGlzLmdldEF0dHJpYnV0ZSgnbWFzaycpOwogICAgICBjb25zdCBzaGFwZSA9ICh0aGlzLmdldEF0dHJpYnV0ZSgnc2hhcGUnKSB8fCAncm91bmRlZCcpLnRvTG93ZXJDYXNlKCk7CiAgICAgIGxldCByYWRpdXMgPSAnJzsKICAgICAgaWYgKHNoYXBlID09PSAnY2lyY2xlJykgcmFkaXVzID0gJzUwJSc7CiAgICAgIGVsc2UgaWYgKHNoYXBlID09PSAncGlsbCcpIHJhZGl1cyA9ICc5OTk5cHgnOwogICAgICBlbHNlIGlmIChzaGFwZSA9PT0gJ3JvdW5kZWQnKSB7CiAgICAgICAgY29uc3QgbiA9IHBhcnNlRmxvYXQodGhpcy5nZXRBdHRyaWJ1dGUoJ3JhZGl1cycpKTsKICAgICAgICByYWRpdXMgPSAoTnVtYmVyLmlzRmluaXRlKG4pID8gbiA6IDEyKSArICdweCc7CiAgICAgIH0KICAgICAgdGhpcy5fZnJhbWUuc3R5bGUuYm9yZGVyUmFkaXVzID0gbWFzayA\/ICcnIDogcmFkaXVzOwogICAgICB0aGlzLl9mcmFtZS5zdHlsZS5jbGlwUGF0aCA9IG1hc2sgfHwgJyc7CiAgICAgIHRoaXMuX3Jpbmcuc3R5bGUuYm9yZGVyUmFkaXVzID0gbWFzayA\/ICcnIDogcmFkaXVzOwogICAgICB0aGlzLl9yaW5nLnN0eWxlLmRpc3BsYXkgPSBtYXNrID8gJ25vbmUnIDogJyc7CgogICAgICAvLyBDb250cm9scyBhbmQgcmVmcmFtZSBlbnRyeSBnYXRlIG9uIHRoaXMgc28gc2hhcmUgbGlua3Mgc3RheSByZWFkLW9ubHkuCiAgICAgIGNvbnN0IGVkaXRhYmxlID0gISEod2luZG93Lm9tZWxldHRlICYmIHdpbmRvdy5vbWVsZXR0ZS53cml0ZUZpbGUpOwogICAgICB0aGlzLnRvZ2dsZUF0dHJpYnV0ZSgnZGF0YS1lZGl0YWJsZScsIGVkaXRhYmxlKTsKICAgICAgdGhpcy5fc3ViLnN0eWxlLmRpc3BsYXkgPSBlZGl0YWJsZSA\/ICcnIDogJ25vbmUnOwoKICAgICAgLy8gQ29udGVudC4gVGhlIHNpZGVjYXIgaXMgYWxzbyB3cml0YWJsZSBieSB0aGUgYWdlbnQncyB3cml0ZV9maWxlCiAgICAgIC8vIHRvb2wsIHNvIGl0cyB2YWx1ZSBpc24ndCBndWFyYW50ZWVkIGNhbnZhcy1vcmlnaW5hdGVkIOKAlCBvbmx5IGFjY2VwdAogICAgICAvLyBkYXRhOmltYWdlLyBVUkxzIGZyb20gaXQuIFRoZSBgc3JjYCBhdHRyaWJ1dGUgaXMgYXV0aG9yLWNvbnRyb2xsZWQKICAgICAgLy8gKENsYXVkZSB3cm90ZSBpdCBpbnRvIHRoZSBIVE1MKSBzbyBpdCBwYXNzZXMgdGhyb3VnaCB1bmNoYW5nZWQuCiAgICAgIGxldCBzdG9yZWQgPSB0aGlzLmlkID8gZ2V0U2xvdCh0aGlzLmlkKSA6IHRoaXMuX2xvY2FsOwogICAgICBpZiAoc3RvcmVkICYmIHN0b3JlZC51ICYmICEvXmRhdGE6aW1hZ2VcLy9pLnRlc3Qoc3RvcmVkLnUpKSBzdG9yZWQgPSBudWxsOwogICAgICBjb25zdCBzcmNBdHRyID0gdGhpcy5nZXRBdHRyaWJ1dGUoJ3NyYycpIHx8ICcnOwogICAgICB0aGlzLl91c2VyVXJsID0gKHN0b3JlZCAmJiBzdG9yZWQudSkgfHwgbnVsbDsKICAgICAgY29uc3QgdXJsID0gdGhpcy5fdXNlclVybCB8fCBzcmNBdHRyOwogICAgICAvLyBEb24ndCBjbG9iYmVyIGFuIGluLWZsaWdodCByZWZyYW1lIHdpdGggYSBzdG9yZS10cmlnZ2VyZWQgcmUtcmVuZGVyLgogICAgICBpZiAoIXRoaXMuaGFzQXR0cmlidXRlKCdkYXRhLXJlZnJhbWUnKSkgewogICAgICAgIHRoaXMuX3ZpZXcgPSB7CiAgICAgICAgICBzOiBzdG9yZWQgJiYgTnVtYmVyLmlzRmluaXRlKHN0b3JlZC5zKSA\/IGNsYW1wUyhzdG9yZWQucykgOiAxLAogICAgICAgICAgeDogc3RvcmVkICYmIE51bWJlci5pc0Zpbml0ZShzdG9yZWQueCkgPyBzdG9yZWQueCA6IDAsCiAgICAgICAgICB5OiBzdG9yZWQgJiYgTnVtYmVyLmlzRmluaXRlKHN0b3JlZC55KSA\/IHN0b3JlZC55IDogMCwKICAgICAgICB9OwogICAgICB9CiAgICAgIHRoaXMuX2NhcC50ZXh0Q29udGVudCA9IHRoaXMuZ2V0QXR0cmlidXRlKCdwbGFjZWhvbGRlcicpIHx8ICdEcm9wIGFuIGltYWdlJzsKICAgICAgLy8gVG9nZ2xlIHZpYSBzdHlsZS5kaXNwbGF5IOKAlCB0aGUgW2hpZGRlbl0gYXR0cmlidXRlIGFsb25lIGxvc2VzIHRvCiAgICAgIC8vIHRoZSBkaXNwbGF5OmZsZXggLyBkaXNwbGF5OmJsb2NrIHJ1bGVzIGluIHRoZSBzdHlsZXNoZWV0IGFib3ZlLgogICAgICBpZiAodXJsKSB7CiAgICAgICAgaWYgKHRoaXMuX2ltZy5nZXRBdHRyaWJ1dGUoJ3NyYycpICE9PSB1cmwpIHsKICAgICAgICAgIHRoaXMuX2ltZy5zcmMgPSB1cmw7CiAgICAgICAgICB0aGlzLl9naG9zdC5zcmMgPSB1cmw7CiAgICAgICAgfQogICAgICAgIHRoaXMuX2ltZy5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJzsKICAgICAgICB0aGlzLl9lbXB0eS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOwogICAgICAgIHRoaXMuc2V0QXR0cmlidXRlKCdkYXRhLWZpbGxlZCcsICcnKTsKICAgICAgICB0aGlzLl9jbGFtcFZpZXcoKTsKICAgICAgICB0aGlzLl9hcHBseVZpZXcoKTsKICAgICAgfSBlbHNlIHsKICAgICAgICB0aGlzLl9pbWcuc3R5bGUuZGlzcGxheSA9ICdub25lJzsKICAgICAgICB0aGlzLl9pbWcucmVtb3ZlQXR0cmlidXRlKCdzcmMnKTsKICAgICAgICB0aGlzLl9naG9zdC5yZW1vdmVBdHRyaWJ1dGUoJ3NyYycpOwogICAgICAgIHRoaXMuX2VtcHR5LnN0eWxlLmRpc3BsYXkgPSAnZmxleCc7CiAgICAgICAgdGhpcy5yZW1vdmVBdHRyaWJ1dGUoJ2RhdGEtZmlsbGVkJyk7CiAgICAgIH0KICAgIH0KICB9CgogIGlmICghY3VzdG9tRWxlbWVudHMuZ2V0KCdpbWFnZS1zbG90JykpIHsKICAgIGN1c3RvbUVsZW1lbnRzLmRlZmluZSgnaW1hZ2Utc2xvdCcsIEltYWdlU2xvdCk7CiAgfQp9KSgpOwo=\"\u003e\u003c\/script\u003e\n\u003cstyle\u003e\n*{box-sizing:border-box;}\nhtml,body{margin:0;}\nimage-slot{display:block!important;width:100%!important;height:100%!important;}\n\u003c\/style\u003e\n\u003c\/helmet\u003e\n\n\n\n\u003cdiv style=\"background:#FBF8F1;color:#2A2B2D;font-family:'Figtree',sans-serif;-webkit-font-smoothing:antialiased;padding:48px 24px 64px;\"\u003e\n\u003cdiv style=\"max-width:1140px;margin:0 auto;\"\u003e\n\n  \u003c!-- ===================== LEAD ===================== --\u003e\n  \u003csection\u003e\n    \u003cp style=\"max-width:880px;margin:0 auto;text-align:center;font-family:'Figtree',sans-serif;font-weight:600;font-size:clamp(21px,2.6vw,29px);line-height:1.42;letter-spacing:-.01em;color:#2A2B2D;\"\u003eAn 8-day ski touring expedition into one of the most inaccessible mountain regions in Europe — using the Tetnuldi cable cars as a launchpad to high-alpine terrain no groomed resort can touch. Two backcountry traverses, 1,900 m of combined descent through the powder bowls of Svaneti, and a cultural spine from 2nd-millennium-BC cave cities to the thermal sanctuaries of Tskaltubo.\u003c\/p\u003e\n\n    \u003c!-- stats --\u003e\n    \u003cdiv style=\"display:flex;flex-wrap:wrap;border:1px solid #E7E0D1;border-radius:18px;background:#fff;margin-top:34px;overflow:hidden;box-shadow:0 4px 18px rgba(0,0,0,.03);\"\u003e\n      \u003cdiv style=\"flex:1;min-width:160px;padding:20px 24px;border-right:1px solid #EEE8DA;\"\u003e\n\u003cdiv style=\"font-family:'Figtree',sans-serif;font-weight:700;font-size:11px;letter-spacing:.12em;color:#9A917D;margin-bottom:8px;\"\u003eDIFFICULTY\u003c\/div\u003e\n\u003cdiv style=\"font-family:'Figtree';font-weight:800;font-size:20px;\"\u003e4 \u003cspan style=\"font-size:13px;color:#9A917D;font-weight:600;\"\u003e\/ 5\u003c\/span\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n      \u003cdiv style=\"flex:1;min-width:160px;padding:20px 24px;border-right:1px solid #EEE8DA;\"\u003e\n\u003cdiv style=\"font-family:'Figtree',sans-serif;font-weight:700;font-size:11px;letter-spacing:.12em;color:#9A917D;margin-bottom:8px;\"\u003eDURATION\u003c\/div\u003e\n\u003cdiv style=\"font-family:'Figtree';font-weight:800;font-size:20px;\"\u003e8 Days\u003c\/div\u003e\n\u003c\/div\u003e\n      \u003cdiv style=\"flex:1;min-width:160px;padding:20px 24px;border-right:1px solid #EEE8DA;\"\u003e\n\u003cdiv style=\"font-family:'Figtree',sans-serif;font-weight:700;font-size:11px;letter-spacing:.12em;color:#9A917D;margin-bottom:8px;\"\u003eGROUP\u003c\/div\u003e\n\u003cdiv style=\"font-family:'Figtree';font-weight:800;font-size:20px;\"\u003e6–10 guests\u003c\/div\u003e\n\u003c\/div\u003e\n      \u003cdiv style=\"flex:1;min-width:160px;padding:20px 24px;border-right:1px solid #EEE8DA;\"\u003e\n\u003cdiv style=\"font-family:'Figtree',sans-serif;font-weight:700;font-size:11px;letter-spacing:.12em;color:#9A917D;margin-bottom:8px;\"\u003eSEASON\u003c\/div\u003e\n\u003cdiv style=\"font-family:'Figtree';font-weight:800;font-size:20px;\"\u003eJan – Mar 2027\u003c\/div\u003e\n\u003c\/div\u003e\n      \u003cdiv style=\"flex:1;min-width:160px;padding:20px 24px;\"\u003e\n\u003cdiv style=\"font-family:'Figtree',sans-serif;font-weight:700;font-size:11px;letter-spacing:.12em;color:#9A917D;margin-bottom:8px;\"\u003eFROM\u003c\/div\u003e\n\u003cdiv style=\"font-family:'Figtree';font-weight:800;font-size:20px;color:#E1343F;\"\u003e€3.750\u003c\/div\u003e\n\u003c\/div\u003e\n    \u003c\/div\u003e\n  \u003c\/section\u003e\n\n  \u003c!-- ===================== ITINERARY ===================== --\u003e\n  \u003csection style=\"margin-top:90px;\"\u003e\n    \u003cspan style=\"font-family:'Figtree',sans-serif;font-size:12px;font-weight:700;letter-spacing:.16em;color:#E1343F;\"\u003e01 — THE ITINERARY\u003c\/span\u003e\n    \u003ch2 style=\"margin:12px 0 8px;font-family:'Figtree';font-weight:800;font-size:clamp(28px,4.4vw,44px);letter-spacing:-.015em;line-height:1.02;\"\u003eThe journey, day by day\u003c\/h2\u003e\n    \u003cp style=\"margin:0;max-width:680px;font-size:16px;line-height:1.6;color:#5C5848;\"\u003eThree phases across Georgia — the cultural approach from Tbilisi, the high-alpine ski chapters above Mestia, and the descent back to the spa towns and underground rivers. Tap any day to read each leg.\u003c\/p\u003e\n\n    \u003cdiv style=\"display:flex;gap:16px;margin-top:30px;flex-wrap:wrap;\"\u003e\n      \u003csc-for list=\"{{ phases }}\" as=\"ph\" hint-placeholder-count=\"3\"\u003e\n        \u003cdiv style=\"{{ ph.cardStyle }}\" onclick=\"{{ ph.onClick }}\"\u003e\n          \u003cdiv style=\"height:6px;width:100%;background:{{ ph.color }};\"\u003e\u003c\/div\u003e\n          \u003cdiv style=\"padding:18px 18px 20px;\"\u003e\n            \u003cdiv style=\"font-family:'Figtree',sans-serif;font-weight:700;font-size:11px;letter-spacing:.12em;color:#9A917D;\"\u003e{{ ph.range }}\u003c\/div\u003e\n            \u003ch4 style=\"margin:8px 0 8px;font-family:'Figtree';font-weight:800;font-size:18px;letter-spacing:-.01em;color:#2A2B2D;\"\u003e{{ ph.name }}\u003c\/h4\u003e\n            \u003cp style=\"margin:0;font-size:13.5px;line-height:1.5;color:#5C5848;\"\u003e{{ ph.blurb }}\u003c\/p\u003e\n          \u003c\/div\u003e\n        \u003c\/div\u003e\n      \u003c\/sc-for\u003e\n    \u003c\/div\u003e\n\n    \u003cdiv style=\"display:grid;grid-template-columns:340px 1fr;gap:30px;margin-top:28px;align-items:start;\"\u003e\n      \u003cdiv style=\"display:flex;flex-direction:column;gap:9px;padding:2px 4px 2px 2px;\"\u003e\n        \u003csc-for list=\"{{ days }}\" as=\"row\" hint-placeholder-count=\"8\"\u003e\n          \u003cdiv style=\"{{ row.rowStyle }}\" onclick=\"{{ row.onClick }}\"\u003e\n            \u003cspan style=\"{{ row.numStyle }}\"\u003e{{ row.n2 }}\u003c\/span\u003e\n            \u003cspan style=\"flex:1;min-width:0;\"\u003e\n              \u003cspan style=\"{{ row.titleStyle }};display:block;\"\u003e{{ row.title }}\u003c\/span\u003e\n              \u003cspan style=\"{{ row.placeStyle }};display:block;\"\u003e{{ row.place }}\u003c\/span\u003e\n            \u003c\/span\u003e\n          \u003c\/div\u003e\n        \u003c\/sc-for\u003e\n      \u003c\/div\u003e\n\n      \u003cdiv style=\"position:sticky;top:24px;\"\u003e\n        \u003cdiv style=\"display:flex;align-items:center;justify-content:space-between;gap:12px;margin-bottom:16px;flex-wrap:wrap;\"\u003e\n          \u003cspan style=\"font-family:'Figtree',sans-serif;font-weight:600;font-size:13px;letter-spacing:.02em;color:#5C5848;\"\u003e{{ progress }}\u003c\/span\u003e\n          \u003cdiv style=\"display:flex;gap:8px;align-items:center;\"\u003e\n            \u003cbutton onclick=\"{{ onPrev }}\" style=\"font:inherit;font-size:15px;font-weight:600;cursor:pointer;border:1px solid #DCD5C5;background:#fff;color:#2A2B2D;border-radius:999px;width:36px;height:36px;line-height:1;\"\u003e‹\u003c\/button\u003e\n            \u003cbutton onclick=\"{{ onPlay }}\" style=\"font:inherit;font-size:13px;font-weight:600;cursor:pointer;border:none;background:#2A2B2D;color:#fff;border-radius:999px;padding:0 18px;height:36px;\"\u003e{{ playLabel }}\u003c\/button\u003e\n            \u003cbutton onclick=\"{{ onNext }}\" style=\"font:inherit;font-size:15px;font-weight:600;cursor:pointer;border:1px solid #DCD5C5;background:#fff;color:#2A2B2D;border-radius:999px;width:36px;height:36px;line-height:1;\"\u003e›\u003c\/button\u003e\n          \u003c\/div\u003e\n        \u003c\/div\u003e\n\n        \u003cdiv style=\"background:#fff;border:1px solid #E7E0D1;border-radius:20px;padding:32px 34px;box-shadow:0 10px 30px rgba(0,0,0,.05);\"\u003e\n          \u003cdiv style=\"display:flex;align-items:center;gap:11px;margin-bottom:16px;flex-wrap:wrap;\"\u003e\n            \u003cspan style=\"{{ tagStyle }}\"\u003e{{ active.phaseName }}\u003c\/span\u003e\n            \u003cspan style=\"font-family:'Figtree',sans-serif;font-weight:600;font-size:12px;letter-spacing:.08em;color:#9A917D;\"\u003e{{ active.dayLabel }}\u003c\/span\u003e\n          \u003c\/div\u003e\n          \u003ch3 style=\"margin:0 0 8px;font-family:'Figtree';font-weight:800;font-size:30px;letter-spacing:-.015em;\"\u003e{{ active.place }}\u003c\/h3\u003e\n          \u003cdiv style=\"font-family:'Figtree',sans-serif;font-weight:600;font-size:13px;color:#5C5848;margin-bottom:18px;\"\u003e{{ active.route }}  ·  {{ active.modeLabel }}\u003c\/div\u003e\n          \u003cp style=\"margin:0 0 20px;font-size:16.5px;line-height:1.65;color:#3F3E3A;\"\u003e{{ active.narrative }}\u003c\/p\u003e\n\n          \u003csc-if value=\"{{ active.hasStats }}\" hint-placeholder-val=\"{{ false }}\"\u003e\n            \u003cdiv style=\"display:flex;flex-wrap:wrap;gap:10px;margin-bottom:18px;\"\u003e\n              \u003csc-for list=\"{{ activeStats }}\" as=\"st\" hint-placeholder-count=\"3\"\u003e\n                \u003cdiv style=\"background:#F6F2E8;border:1px solid #EEE8DA;border-radius:12px;padding:10px 14px;min-width:96px;\"\u003e\n                  \u003cdiv style=\"font-family:'Figtree',sans-serif;font-weight:700;font-size:10px;letter-spacing:.1em;color:#9A917D;margin-bottom:4px;\"\u003e{{ st.label }}\u003c\/div\u003e\n                  \u003cdiv style=\"font-family:'Figtree';font-weight:800;font-size:16px;color:#2A2B2D;\"\u003e{{ st.value }}\u003c\/div\u003e\n                \u003c\/div\u003e\n              \u003c\/sc-for\u003e\n            \u003c\/div\u003e\n          \u003c\/sc-if\u003e\n\n          \u003csc-if value=\"{{ active.hasActs }}\" hint-placeholder-val=\"{{ true }}\"\u003e\n            \u003cdiv style=\"display:flex;flex-wrap:wrap;gap:8px;margin-bottom:18px;\"\u003e\n              \u003csc-for list=\"{{ activeActs }}\" as=\"act\" hint-placeholder-count=\"2\"\u003e\n                \u003cspan style=\"display:inline-block;padding:6px 14px;border-radius:999px;background:#F3EEE2;color:#5C5848;font-family:'Figtree',sans-serif;font-size:11.5px;font-weight:700;letter-spacing:.03em;\"\u003e{{ act.name }}\u003c\/span\u003e\n              \u003c\/sc-for\u003e\n            \u003c\/div\u003e\n          \u003c\/sc-if\u003e\n\n          \u003cdiv style=\"border-top:1px solid #EEE8DA;padding-top:16px;font-size:14px;color:#6B6657;\"\u003e\n\u003cspan style=\"font-family:'Figtree',sans-serif;font-weight:700;font-size:11px;letter-spacing:.1em;color:#9A917D;\"\u003eSTAY  \u003c\/span\u003e{{ active.accom }}\u003c\/div\u003e\n        \u003c\/div\u003e\n      \u003c\/div\u003e\n    \u003c\/div\u003e\n  \u003c\/section\u003e\n\n  \u003c!-- ===================== HIGHLIGHTS ===================== --\u003e\n  \u003csection style=\"margin-top:90px;\"\u003e\n    \u003cspan style=\"font-family:'Figtree',sans-serif;font-size:12px;font-weight:700;letter-spacing:.16em;color:#1E8265;\"\u003e02 — HIGHLIGHTS\u003c\/span\u003e\n    \u003ch2 style=\"margin:12px 0 28px;font-family:'Figtree';font-weight:800;font-size:clamp(28px,4.4vw,44px);letter-spacing:-.015em;\"\u003eSix things that define it\u003c\/h2\u003e\n    \u003cdiv style=\"display:grid;grid-template-columns:repeat(3,1fr);gap:16px;\"\u003e\n      \u003cdiv style=\"background:#fff;border:1px solid #E7E0D1;border-radius:18px;padding:26px;border-top:5px solid #E1343F;\"\u003e\n\u003cdiv style=\"font-family:'Figtree',sans-serif;font-weight:800;font-size:22px;color:#E1343F;margin-bottom:14px;\"\u003e01\u003c\/div\u003e\n\u003cp style=\"margin:0;font-size:15.5px;line-height:1.5;color:#3F3E3A;font-weight:600;\"\u003eSki touring traverse of the Latpari Ridge above 2,700 m, with a 1,100 m descent through the untracked north-facing bowls of the Adishi Valley.\u003c\/p\u003e\n\u003c\/div\u003e\n      \u003cdiv style=\"background:#fff;border:1px solid #E7E0D1;border-radius:18px;padding:26px;border-top:5px solid #1CA0DC;\"\u003e\n\u003cdiv style=\"font-family:'Figtree',sans-serif;font-weight:800;font-size:22px;color:#1CA0DC;margin-bottom:14px;\"\u003e02\u003c\/div\u003e\n\u003cp style=\"margin:0;font-size:15.5px;line-height:1.5;color:#3F3E3A;font-weight:600;\"\u003eTetnuldi Ski Resort — one of Europe's least crowded high-altitude resorts, with consistent powder and panoramic Caucasus views.\u003c\/p\u003e\n\u003c\/div\u003e\n      \u003cdiv style=\"background:#fff;border:1px solid #E7E0D1;border-radius:18px;padding:26px;border-top:5px solid #1E8265;\"\u003e\n\u003cdiv style=\"font-family:'Figtree',sans-serif;font-weight:800;font-size:22px;color:#1E8265;margin-bottom:14px;\"\u003e03\u003c\/div\u003e\n\u003cp style=\"margin:0;font-size:15.5px;line-height:1.5;color:#3F3E3A;font-weight:600;\"\u003eThe Tsvirmi descent: 800 vertical metres from the Zuruldi Ridge (2,340 m) into a village that has never seen a ski lift.\u003c\/p\u003e\n\u003c\/div\u003e\n      \u003cdiv style=\"background:#fff;border:1px solid #E7E0D1;border-radius:18px;padding:26px;border-top:5px solid #F6A21E;\"\u003e\n\u003cdiv style=\"font-family:'Figtree',sans-serif;font-weight:800;font-size:22px;color:#F6A21E;margin-bottom:14px;\"\u003e04\u003c\/div\u003e\n\u003cp style=\"margin:0;font-size:15.5px;line-height:1.5;color:#3F3E3A;font-weight:600;\"\u003ePrivate lunch and wine tasting with Nika Vacheishvili, former Georgian Minister of Culture, reviving the ancient Atenuri tradition.\u003c\/p\u003e\n\u003c\/div\u003e\n      \u003cdiv style=\"background:#fff;border:1px solid #E7E0D1;border-radius:18px;padding:26px;border-top:5px solid #1E8265;\"\u003e\n\u003cdiv style=\"font-family:'Figtree',sans-serif;font-weight:800;font-size:22px;color:#1E8265;margin-bottom:14px;\"\u003e05\u003c\/div\u003e\n\u003cp style=\"margin:0;font-size:15.5px;line-height:1.5;color:#3F3E3A;font-weight:600;\"\u003eUplistsikhe Cave City — a rock-hewn settlement carved into sandstone cliffs in the 2nd millennium BC, the grounding day before the mountains.\u003c\/p\u003e\n\u003c\/div\u003e\n      \u003cdiv style=\"background:#fff;border:1px solid #E7E0D1;border-radius:18px;padding:26px;border-top:5px solid #1CA0DC;\"\u003e\n\u003cdiv style=\"font-family:'Figtree',sans-serif;font-weight:800;font-size:22px;color:#1CA0DC;margin-bottom:14px;\"\u003e06\u003c\/div\u003e\n\u003cp style=\"margin:0;font-size:15.5px;line-height:1.5;color:#3F3E3A;font-weight:600;\"\u003ePrometheus Cave: a 3 km subterranean karst system with illuminated stalactites and a silent boat ride on an underground river.\u003c\/p\u003e\n\u003c\/div\u003e\n    \u003c\/div\u003e\n  \u003c\/section\u003e\n\n  \u003c!-- ===================== EXPERIENCE ===================== --\u003e\n  \u003csection style=\"margin-top:90px;\"\u003e\n    \u003cspan style=\"font-family:'Figtree',sans-serif;font-size:12px;font-weight:700;letter-spacing:.16em;color:#F6A21E;\"\u003e03 — THE EXPERIENCE\u003c\/span\u003e\n    \u003ch2 style=\"margin:12px 0 28px;font-family:'Figtree';font-weight:800;font-size:clamp(28px,4.4vw,44px);letter-spacing:-.015em;\"\u003eWhat you're signing up for\u003c\/h2\u003e\n    \u003cdiv style=\"display:grid;grid-template-columns:1fr 1fr;gap:16px;\"\u003e\n      \u003cdiv style=\"background:#fff;border:1px solid #E7E0D1;border-radius:18px;padding:30px;\"\u003e\n        \u003ch4 style=\"margin:0 0 12px;font-family:'Figtree';font-weight:800;font-size:18px;\"\u003eWho this is for\u003c\/h4\u003e\n        \u003cp style=\"margin:0;font-size:15.5px;line-height:1.6;color:#3F3E3A;\"\u003eIntermediate to advanced skiers who want more than groomed runs — physically fit, comfortable in high-alpine conditions, and looking for technical terrain with cultural depth on the rest days. Backcountry experience is an advantage but not a requirement; the lift-assisted start reduces the technical entry on both touring days. What is non-negotiable is stamina — Days 5 and 6 are long, high-altitude commitments. Minimum age 16.\u003c\/p\u003e\n      \u003c\/div\u003e\n      \u003cdiv style=\"background:#fff;border:1px solid #E7E0D1;border-radius:18px;padding:30px;\"\u003e\n        \u003ch4 style=\"margin:0 0 12px;font-family:'Figtree';font-weight:800;font-size:18px;\"\u003eJourney type\u003c\/h4\u003e\n        \u003cp style=\"margin:0 0 14px;font-size:15.5px;line-height:1.6;color:#3F3E3A;\"\u003eA multi-phase winter expedition combining:\u003c\/p\u003e\n        \u003cdiv style=\"display:flex;flex-direction:column;gap:9px;\"\u003e\n          \u003cspan style=\"display:flex;align-items:flex-start;gap:10px;font-size:15px;color:#3F3E3A;line-height:1.45;\"\u003e\u003cspan style=\"width:9px;height:9px;margin-top:6px;background:#1CA0DC;border-radius:2px;flex:0 0 auto;\"\u003e\u003c\/span\u003eResort skiing on uncrowded high-altitude slopes (Tetnuldi)\u003c\/span\u003e\n          \u003cspan style=\"display:flex;align-items:flex-start;gap:10px;font-size:15px;color:#3F3E3A;line-height:1.45;\"\u003e\u003cspan style=\"width:9px;height:9px;margin-top:6px;background:#E1343F;border-radius:2px;flex:0 0 auto;\"\u003e\u003c\/span\u003eTwo backcountry ski touring traverses with 4x4 extraction\u003c\/span\u003e\n          \u003cspan style=\"display:flex;align-items:flex-start;gap:10px;font-size:15px;color:#3F3E3A;line-height:1.45;\"\u003e\u003cspan style=\"width:9px;height:9px;margin-top:6px;background:#1E8265;border-radius:2px;flex:0 0 auto;\"\u003e\u003c\/span\u003eArchaeological \u0026amp; cultural immersion days\u003c\/span\u003e\n          \u003cspan style=\"display:flex;align-items:flex-start;gap:10px;font-size:15px;color:#3F3E3A;line-height:1.45;\"\u003e\u003cspan style=\"width:9px;height:9px;margin-top:6px;background:#F6A21E;border-radius:2px;flex:0 0 auto;\"\u003e\u003c\/span\u003eThermal spa recovery at a Soviet-era wellness sanctuary\u003c\/span\u003e\n        \u003c\/div\u003e\n      \u003c\/div\u003e\n      \u003cdiv style=\"grid-column:1 \/ -1;background:#2A2B2D;color:#F4EFE4;border-radius:18px;padding:36px 40px;\"\u003e\n        \u003ch4 style=\"margin:0 0 12px;font-family:'Figtree';font-weight:800;font-size:20px;color:#fff;\"\u003eWhat makes it unique\u003c\/h4\u003e\n        \u003cp style=\"margin:0;max-width:860px;font-size:16.5px;line-height:1.65;color:#CDC7B8;\"\u003eMost ski itineraries in Georgia use Gudauri. This one goes deeper — to Tetnuldi in the heart of Svaneti, one of the last genuinely remote mountain cultures in Europe. The backcountry terrain here is not a day trip from a resort; it is the entire point. The two touring days access lines that see no other traffic, descending into valleys where the only infrastructure is a 4x4 waiting at the tree line. The cultural programme is not filler between ski days — it is a parallel journey into the same vertical landscape, from ancient cave cities to underground rivers.\u003c\/p\u003e\n      \u003c\/div\u003e\n    \u003c\/div\u003e\n\n    \u003cdiv style=\"display:grid;grid-template-columns:1fr 1fr 1fr;gap:14px;margin-top:18px;\"\u003e\n      \u003cdiv\u003e\n        \u003cdiv style=\"font-family:'Figtree',sans-serif;font-weight:700;font-size:11px;letter-spacing:.12em;color:#9A917D;margin:0 0 8px 2px;\"\u003eTHE APPROACH\u003c\/div\u003e\n        \u003cimg class=\"second-sec-img\" src=\"https:\/\/cdn.shopify.com\/s\/files\/1\/0971\/7166\/9374\/files\/1_lUXUMI8RYRncQUaPNDFdeA.webp\"\u003e\n          \u003c\/div\u003e\n      \u003cdiv\u003e\n        \u003cdiv style=\"font-family:'Figtree',sans-serif;font-weight:700;font-size:11px;letter-spacing:.12em;color:#9A917D;margin:0 0 8px 2px;\"\u003eTHE MOUNTAINS\u003c\/div\u003e\n        \u003cimg class=\"second-sec-img\" src=\"https:\/\/cdn.shopify.com\/s\/files\/1\/0971\/7166\/9374\/files\/00_Latpari.jpg\"\u003e\n      \u003c\/div\u003e\n      \u003cdiv\u003e\n        \u003cdiv style=\"font-family:'Figtree',sans-serif;font-weight:700;font-size:11px;letter-spacing:.12em;color:#9A917D;margin:0 0 8px 2px;\"\u003eTHE RETURN\u003c\/div\u003e\n          \u003cimg class=\"second-sec-img\" src=\"https:\/\/cdn.shopify.com\/s\/files\/1\/0971\/7166\/9374\/files\/6cde2c2435844554ad59b1e4242a7d14dfa4d1b0d4cb0c2be275b2610e030212.avif\"\u003e\n      \u003c\/div\u003e\n    \u003c\/div\u003e\n  \u003c\/section\u003e\n\n  \u003c!-- ===================== WHERE YOU'LL STAY ===================== --\u003e\n  \u003csection style=\"margin-top:90px;\"\u003e\n    \u003cspan style=\"font-family:'Figtree',sans-serif;font-size:12px;font-weight:700;letter-spacing:.16em;color:#1E8265;\"\u003e04 — WHERE YOU'LL STAY\u003c\/span\u003e\n    \u003ch2 style=\"margin:12px 0 8px;font-family:'Figtree';font-weight:800;font-size:clamp(28px,4.4vw,44px);letter-spacing:-.015em;\"\u003eAccommodation\u003c\/h2\u003e\n    \u003cp style=\"margin:0 0 28px;max-width:680px;font-size:16px;line-height:1.6;color:#5C5848;\"\u003eFrom a boutique design hotel in Tbilisi to a three-night mountain base in Mestia and a Soviet-era thermal spa in Tskaltubo — every stay on the expedition, slide by slide. All rooms twin with breakfast.\u003c\/p\u003e\n\n    \u003cdiv style=\"background:#fff;border:1px solid #E7E0D1;border-radius:22px;padding:30px;box-shadow:0 10px 34px rgba(0,0,0,.05);\"\u003e\n      \u003csc-for list=\"{{ hotels }}\" as=\"h\" hint-placeholder-count=\"1\"\u003e\n        \u003cdiv style=\"{{ h.wrapStyle }}\"\u003e\n          \u003cdiv style=\"display:grid;grid-template-columns:0.8fr 1.2fr;gap:34px;align-items:center;\"\u003e\n            \u003cdiv\u003e\n              \u003cdiv style=\"font-family:'Figtree',sans-serif;font-weight:700;font-size:11.5px;letter-spacing:.14em;color:#9A917D;margin-bottom:10px;\"\u003e{{ h.where }}\u003c\/div\u003e\n              \u003ch3 style=\"margin:0 0 12px;font-family:'Figtree';font-weight:800;font-size:29px;letter-spacing:-.015em;line-height:1.04;\"\u003e{{ h.name }}\u003c\/h3\u003e\n              \u003cdiv style=\"display:flex;align-items:center;gap:10px;margin-bottom:18px;flex-wrap:wrap;\"\u003e\n                \u003cspan style=\"display:inline-block;padding:5px 13px;border-radius:999px;background:#F3EEE2;font-family:'Figtree',sans-serif;font-size:11px;font-weight:700;letter-spacing:.06em;color:#5C5848;\"\u003e{{ h.nights }}\u003c\/span\u003e\n                \u003cspan style=\"display:inline-block;padding:5px 13px;border-radius:999px;background:#EAF4EE;font-family:'Figtree',sans-serif;font-size:11px;font-weight:700;letter-spacing:.06em;color:#1E8265;\"\u003e{{ h.tag }}\u003c\/span\u003e\n              \u003c\/div\u003e\n              \u003cp style=\"margin:0;font-size:16px;line-height:1.65;color:#3F3E3A;\"\u003e{{ h.desc }}\u003c\/p\u003e\n            \u003c\/div\u003e\n            \u003cdiv style=\"display:grid;grid-template-columns:1fr 1fr;grid-template-rows:1fr 1fr;gap:12px;height:420px;\"\u003e\n              \u003csc-for list=\"{{ h.imgs }}\" as=\"im\" hint-placeholder-count=\"4\"\u003e\n                \u003cx-import component-from-global-scope=\"image-slot\" from=\"data:text\/javascript;base64,Ly8gQGRzLWFkaGVyZW5jZS1pZ25vcmUgLS0gb21lbGV0dGUgc3RhcnRlciBzY2FmZm9sZCAocmF3IGVsZW1lbnRzL2hleC9weCBieSBkZXNpZ24pCi8qIEJFR0lOIFVTQUdFICovCi8qKgogKiA8aW1hZ2Utc2xvdD4g4oCUIHVzZXItZmlsbGFibGUgaW1hZ2UgcGxhY2Vob2xkZXIuCiAqCiAqIERyb3AgdGhpcyBpbnRvIGEgZGVjaywgbW9ja3VwLCBvciBwYWdlIHdoZXJldmVyIHlvdSB3YW50IHRoZSB1c2VyIHRvCiAqIHN1cHBseSBhbiBpbWFnZS4gWW91IGNvbnRyb2wgdGhlIHNsb3QncyBzaGFwZSBhbmQgc2l6ZTsgdGhlIHVzZXIgZmlsbHMgaXQKICogYnkgZHJhZ2dpbmcgYW4gaW1hZ2UgZmlsZSBvbnRvIGl0IChvciBjbGlja2luZyB0byBicm93c2UpLiBUaGUgZHJvcHBlZAogKiBpbWFnZSBwZXJzaXN0cyBhY3Jvc3MgcmVsb2FkcyB2aWEgYSAuaW1hZ2Utc2xvdHMuc3RhdGUuanNvbiBzaWRlY2FyIOKAlAogKiBzYW1lIHJlYWQtdmlhLWZldGNoIC8gd3JpdGUtdmlhLXdpbmRvdy5vbWVsZXR0ZSBwYXR0ZXJuIGFzCiAqIGRlc2lnbl9jYW52YXMuanN4LCBzbyB0aGUgZmlsbGVkIHNsb3Qgc2hvd3Mgb24gc2hhcmUgbGlua3MsIGRvd25sb2FkZWQKICogemlwcywgYW5kIFBQVFggZXhwb3J0LiBPdXRzaWRlIHRoZSBvbWVsZXR0ZSBydW50aW1lIHRoZSBzbG90IGlzIHJlYWQtb25seS4KICoKICogVGhlIGhvc3QgYnJpZGdlIG9ubHkgYWxsb3dzIHNpZGVjYXIgd3JpdGVzIGF0IHRoZSBwcm9qZWN0IHJvb3QsIHNvIHRoZQogKiBIVE1MIHRoYXQgdXNlcyB0aGlzIGNvbXBvbmVudCBpcyBhc3N1bWVkIHRvIGxpdmUgYXQgdGhlIHByb2plY3Qgcm9vdCB0b28KICogKHNhbWUgY29uc3RyYWludCBhcyBkZXNpZ25fY2FudmFzLmpzeCkuCiAqCiAqIEF0dHJpYnV0ZXM6CiAqICAgaWQgICAgICAgICAgIFBlcnNpc3RlbmNlIGtleS4gUkVRVUlSRUQgZm9yIHRoZSBkcm9wIHRvIHN1cnZpdmUgcmVsb2FkIOKAlAogKiAgICAgICAgICAgICAgICBldmVyeSBzbG90IG9uIHRoZSBwYWdlIG5lZWRzIGEgZGlzdGluY3QgaWQuCiAqICAgc2hhcGUgICAgICAgICdyZWN0JyB8ICdyb3VuZGVkJyB8ICdjaXJjbGUnIHwgJ3BpbGwnICAgKGRlZmF1bHQgJ3JvdW5kZWQnKQogKiAgICAgICAgICAgICAgICAnY2lyY2xlJyBhcHBsaWVzIDUwJSBib3JkZXItcmFkaXVzOyBvbiBhIG5vbi1zcXVhcmUgc2xvdAogKiAgICAgICAgICAgICAgICB0aGF0J3MgYW4gZWxsaXBzZSDigJQgc2V0IGVxdWFsIHdpZHRoIGFuZCBoZWlnaHQgZm9yIGEgdHJ1ZQogKiAgICAgICAgICAgICAgICBjaXJjbGUuCiAqICAgcmFkaXVzICAgICAgIENvcm5lciByYWRpdXMgaW4gcHggZm9yICdyb3VuZGVkJy4gICAgICAgKGRlZmF1bHQgMTIpCiAqICAgbWFzayAgICAgICAgIEFueSBDU1MgY2xpcC1wYXRoIHZhbHVlLiBPdmVycmlkZXMgYHNoYXBlYCDigJQgdXNlIHRoaXMgZm9yCiAqICAgICAgICAgICAgICAgIGhleGFnb25zLCBibG9icywgYXJiaXRyYXJ5IHBvbHlnb25zLgogKiAgIGZpdCAgICAgICAgICBvYmplY3QtZml0OiBjb3ZlciB8IGNvbnRhaW4gfCBmaWxsLiAgICAgICAoZGVmYXVsdCAnY292ZXInKQogKiAgICAgICAgICAgICAgICBXaXRoIGNvdmVyICh0aGUgZGVmYXVsdCkgZG91YmxlLWNsaWNraW5nIHRoZSBmaWxsZWQgc2xvdAogKiAgICAgICAgICAgICAgICBlbnRlcnMgYSByZWZyYW1lIG1vZGU6IHRoZSB3aG9sZSBpbWFnZSBzcGlsbHMgcGFzdCB0aGUgbWFzawogKiAgICAgICAgICAgICAgICAodHJhbnNsdWNlbnQgb3V0c2lkZSwgb3BhcXVlIGluc2lkZSksIGRyYWcgdG8gcmVwb3NpdGlvbiwKICogICAgICAgICAgICAgICAgY29ybmVyLWRyYWcgdG8gc2NhbGUuIFRoZSBjcm9wIHBlcnNpc3RzIGFsb25nc2lkZSB0aGUgaW1hZ2UKICogICAgICAgICAgICAgICAgaW4gdGhlIHNpZGVjYXIuIGNvbnRhaW4vZmlsbCBzdGF5IHN0YXRpYy4KICogICBwb3NpdGlvbiAgICAgb2JqZWN0LXBvc2l0aW9uIGZvciBmaXQ9Y29udGFpbnxmaWxsLiAgICAgKGRlZmF1bHQgJzUwJSA1MCUnKQogKiAgIHBsYWNlaG9sZGVyICBFbXB0eS1zdGF0ZSBjYXB0aW9uLiAgICAgICAgICAgICAgICAgICAgICAoZGVmYXVsdCAnRHJvcCBhbiBpbWFnZScpCiAqICAgc3JjICAgICAgICAgIE9wdGlvbmFsIGluaXRpYWwvZmFsbGJhY2sgaW1hZ2UgVVJMLiBBIHVzZXIgZHJvcCBvdmVycmlkZXMKICogICAgICAgICAgICAgICAgaXQ7IGNsZWFyaW5nIHRoZSBkcm9wIHJldmVhbHMgc3JjIGFnYWluLgogKgogKiBTaXplIGFuZCBsYXlvdXQgY29tZSBmcm9tIG9yZGluYXJ5IENTUyBvbiB0aGUgZWxlbWVudCDigJQgd2lkdGgvaGVpZ2h0CiAqIGlubGluZSBvciBmcm9tIGEgcGFyZW50IGdyaWQg4oCUIHNvIGl0IGNvbXBvc2VzIHdpdGggYW55IGxheW91dC4KICoKICogVXNhZ2U6CiAqICAgPGltYWdlLXNsb3QgaWQ9Imhlcm8iICAgc3R5bGU9IndpZHRoOjgwMHB4O2hlaWdodDo0NTBweCIgc2hhcGU9InJvdW5kZWQiIHJhZGl1cz0iMjAiCiAqICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9IkRyb3AgYSBoZXJvIGltYWdlIj48L2ltYWdlLXNsb3Q+CiAqICAgPGltYWdlLXNsb3QgaWQ9ImF2YXRhciIgc3R5bGU9IndpZHRoOjEyMHB4O2hlaWdodDoxMjBweCIgc2hhcGU9ImNpcmNsZSI+PC9pbWFnZS1zbG90PgogKiAgIDxpbWFnZS1zbG90IGlkPSJraXRlIiAgIHN0eWxlPSJ3aWR0aDozMDBweDtoZWlnaHQ6MzAwcHgiCiAqICAgICAgICAgICAgICAgbWFzaz0icG9seWdvbig1MCUgMCwgMTAwJSA1MCUsIDUwJSAxMDAlLCAwIDUwJSkiPjwvaW1hZ2Utc2xvdD4KICovCi8qIEVORCBVU0FHRSAqLwoKKCgpID0+IHsKICBjb25zdCBTVEFURV9GSUxFID0gJy5pbWFnZS1zbG90cy5zdGF0ZS5qc29uJzsKICAvLyAyw5cgYSB+NjAwcHggc2xvdCBpbiBhIDE5MjAtd2lkZSBkZWNrIOKAlCByZXRpbmEtc2hhcnAgd2l0aG91dCBtYWtpbmcgdGhlCiAgLy8gc2lkZWNhciBlbm9ybW91cy4gQSAxMjAwcHggV2ViUCBhdCBxPTAuODUgaXMgfjE1MC0zMDBLQi4KICBjb25zdCBNQVhfRElNID0gMTIwMDsKICAvLyBSYXN0ZXIgZm9ybWF0cyBvbmx5LiBTVkcgaXMgZXhjbHVkZWQgKGNhbiBjYXJyeSBzY3JpcHQ7IGNyZWF0ZUltYWdlQml0bWFwCiAgLy8gb24gU1ZHIGJsb2JzIGlzIGluY29uc2lzdGVudCkuIEdJRiBpcyBleGNsdWRlZCBiZWNhdXNlIHRoZSBjYW52YXMKICAvLyByZS1lbmNvZGUga2VlcHMgb25seSB0aGUgZmlyc3QgZnJhbWUsIHNvIGFuIGFuaW1hdGVkIEdJRiB3b3VsZCBzaWxlbnRseQogIC8vIGdvIHN0aWxsIOKAlCBiZXR0ZXIgdG8gcmVqZWN0IHRoYW4gc3VycHJpc2UuCiAgY29uc3QgQUNDRVBUID0gWydpbWFnZS9wbmcnLCAnaW1hZ2UvanBlZycsICdpbWFnZS93ZWJwJywgJ2ltYWdlL2F2aWYnXTsKCiAgLy8g4pSA4pSAIFNoYXJlZCBzaWRlY2FyIHN0b3JlIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAogIC8vIE9uZSBmZXRjaCArIGltbWVkaWF0ZSB3cml0ZS1vbi1jaGFuZ2UgZm9yIGV2ZXJ5IDxpbWFnZS1zbG90PiBvbiB0aGUKICAvLyBwYWdlLiBSZWFkcyB2aWEgZmV0Y2goKSBzbyB2aWV3aW5nIHdvcmtzIGFueXdoZXJlIHRoZSBIVE1MIGFuZCBzaWRlY2FyCiAgLy8gYXJlIHNlcnZlZCB0b2dldGhlcjsgd3JpdGVzIGdvIHRocm91Z2ggd2luZG93Lm9tZWxldHRlLndyaXRlRmlsZSwgd2hpY2gKICAvLyB0aGUgaG9zdCBhbGxvd2xpc3RzIHRvICouc3RhdGUuanNvbiBiYXNlbmFtZXMgb25seS4KICBjb25zdCBzdWJzID0gbmV3IFNldCgpOwogIGxldCBzbG90cyA9IHt9OwogIC8vIGlkcyBleHBsaWNpdGx5IGNsZWFyZWQgYmVmb3JlIHRoZSBzaWRlY2FyIGZldGNoIHJlc29sdmVkIOKAlCBvdGhlcndpc2UKICAvLyB0aGUgbWVyZ2UgYmVsb3cgY2FuJ3QgdGVsbCAibmV2ZXIgc2V0IiBmcm9tICJqdXN0IGRlbGV0ZWQiIGFuZCB3b3VsZAogIC8vIHJlc3VycmVjdCB0aGUgc2lkZWNhcidzIHN0YWxlIHZhbHVlLgogIGNvbnN0IHRvbWJzdG9uZXMgPSBuZXcgU2V0KCk7CiAgbGV0IGxvYWRlZCA9IGZhbHNlOwogIGxldCBsb2FkUCA9IG51bGw7CgogIGZ1bmN0aW9uIGxvYWQoKSB7CiAgICBpZiAobG9hZFApIHJldHVybiBsb2FkUDsKICAgIGxvYWRQID0gZmV0Y2goU1RBVEVfRklMRSkKICAgICAgLnRoZW4oKHIpID0+IChyLm9rID8gci5qc29uKCkgOiBudWxsKSkKICAgICAgLnRoZW4oKGopID0+IHsKICAgICAgICAvLyBNZXJnZTogc2lkZWNhciBsb3NlcyB0byBhbnkgaW4tbWVtb3J5IGNoYW5nZSB0aGF0IHJhY2VkIGFoZWFkIG9mCiAgICAgICAgLy8gdGhlIGZldGNoIChkcm9wIG9yIGNsZWFyKSBzbyBuZWl0aGVyIGlzIGNsb2JiZXJlZCBieSBoeWRyYXRpb24uCiAgICAgICAgaWYgKGogJiYgdHlwZW9mIGogPT09ICdvYmplY3QnKSB7CiAgICAgICAgICBjb25zdCBtZXJnZWQgPSBPYmplY3QuYXNzaWduKHt9LCBqLCBzbG90cyk7CiAgICAgICAgICAvLyBBIGZyYW1pbmctb25seSB3cml0ZSB0aGF0IHJhY2VkIGFoZWFkIG9mIGh5ZHJhdGlvbiBtdXN0IG5vdAogICAgICAgICAgLy8gZHJvcCBhIHVzZXIgaW1hZ2UgdGhhdCdzIG9ubHkgb24gZGlzayDigJQgaW5oZXJpdCB1IGZyb20gdGhlCiAgICAgICAgICAvLyBzaWRlY2FyIGZvciBhbnkgaW4tbWVtb3J5IGVudHJ5IHRoYXQgbGFja3Mgb25lLgogICAgICAgICAgZm9yIChjb25zdCBrIGluIHNsb3RzKSB7CiAgICAgICAgICAgIGlmIChtZXJnZWRba10gJiYgIW1lcmdlZFtrXS51ICYmIGpba10pIHsKICAgICAgICAgICAgICBtZXJnZWRba10udSA9IHR5cGVvZiBqW2tdID09PSAnc3RyaW5nJyA\/IGpba10gOiBqW2tdLnU7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIGZvciAoY29uc3QgaWQgb2YgdG9tYnN0b25lcykgZGVsZXRlIG1lcmdlZFtpZF07CiAgICAgICAgICBzbG90cyA9IG1lcmdlZDsKICAgICAgICB9CiAgICAgICAgdG9tYnN0b25lcy5jbGVhcigpOwogICAgICB9KQogICAgICAuY2F0Y2goKCkgPT4ge30pCiAgICAgIC50aGVuKCgpID0+IHsgbG9hZGVkID0gdHJ1ZTsgc3Vicy5mb3JFYWNoKChmbikgPT4gZm4oKSk7IH0pOwogICAgcmV0dXJuIGxvYWRQOwogIH0KCiAgLy8gU2VyaWFsaXplIHdyaXRlcyBzbyB0d28gbmVhci1zaW11bHRhbmVvdXMgZHJvcHMgb24gZGlmZmVyZW50IHNsb3RzCiAgLy8gY2FuJ3QgcmVvcmRlciBhdCB0aGUgYmFja2VuZCBhbmQgbGVhdmUgdGhlIHNpZGVjYXIgd2l0aCBvbmx5IHRoZQogIC8vIGZpcnN0LiBBIHNhdmUgcmVxdWVzdGVkIG1pZC1mbGlnaHQganVzdCBtYXJrcyBkaXJ0eSBhbmQgcmUtZmlyZXMgb24KICAvLyBjb21wbGV0aW9uIHdpdGggdGhlIHRoZW4tY3VycmVudCBzbG90cy4KICBsZXQgc2F2aW5nID0gZmFsc2U7CiAgbGV0IHNhdmVEaXJ0eSA9IGZhbHNlOwogIGZ1bmN0aW9uIHNhdmUoKSB7CiAgICBpZiAoc2F2aW5nKSB7IHNhdmVEaXJ0eSA9IHRydWU7IHJldHVybjsgfQogICAgY29uc3QgdyA9IHdpbmRvdy5vbWVsZXR0ZSAmJiB3aW5kb3cub21lbGV0dGUud3JpdGVGaWxlOwogICAgaWYgKCF3KSByZXR1cm47CiAgICBzYXZpbmcgPSB0cnVlOwogICAgUHJvbWlzZS5yZXNvbHZlKHcoU1RBVEVfRklMRSwgSlNPTi5zdHJpbmdpZnkoc2xvdHMpKSkKICAgICAgLmNhdGNoKCgpID0+IHt9KQogICAgICAudGhlbigoKSA9PiB7IHNhdmluZyA9IGZhbHNlOyBpZiAoc2F2ZURpcnR5KSB7IHNhdmVEaXJ0eSA9IGZhbHNlOyBzYXZlKCk7IH0gfSk7CiAgfQoKICBjb25zdCBTX01BWCA9IDU7CiAgY29uc3QgY2xhbXBTID0gKHMpID0+IE1hdGgubWF4KDEsIE1hdGgubWluKFNfTUFYLCBzKSk7CgogIC8vIE5vcm1hbGl6ZSBhIHN0b3JlZCBzbG90IHZhbHVlLiBQcmUtcmVmcmFtZSBzaWRlY2FycyBzdG9yZWQgYSBiYXJlCiAgLy8gZGF0YS1VUkwgc3RyaW5nOyBuZXdlciBvbmVzIHN0b3JlIHt1LCBzLCB4LCB5fS4gRWl0aGVyIHNoYXBlIGlzIHZhbGlkLgogIGZ1bmN0aW9uIGdldFNsb3QoaWQpIHsKICAgIGNvbnN0IHYgPSBzbG90c1tpZF07CiAgICBpZiAoIXYpIHJldHVybiBudWxsOwogICAgcmV0dXJuIHR5cGVvZiB2ID09PSAnc3RyaW5nJyA\/IHsgdTogdiwgczogMSwgeDogMCwgeTogMCB9IDogdjsKICB9CgogIGZ1bmN0aW9uIHNldFNsb3QoaWQsIHZhbCkgewogICAgaWYgKCFpZCkgcmV0dXJuOwogICAgaWYgKHZhbCkgeyBzbG90c1tpZF0gPSB2YWw7IHRvbWJzdG9uZXMuZGVsZXRlKGlkKTsgfQogICAgZWxzZSB7IGRlbGV0ZSBzbG90c1tpZF07IGlmICghbG9hZGVkKSB0b21ic3RvbmVzLmFkZChpZCk7IH0KICAgIHN1YnMuZm9yRWFjaCgoZm4pID0+IGZuKCkpOwogICAgLy8gQSBkcm9wIGlzIHJhcmUgKyBoaWdoLXZhbHVlIOKAlCB3cml0ZSBpbW1lZGlhdGVseSBzbyBuYXYtYXdheSBjYW4ndCBsb3NlCiAgICAvLyBpdC4gR2F0ZSBvbiB0aGUgaW5pdGlhbCByZWFkIHNvIHdlIGRvbid0IG92ZXJ3cml0ZSBhIHNpZGVjYXIgd2UgaGF2ZW4ndAogICAgLy8gbWVyZ2VkIHlldDsgdGhlIG1lcmdlIGluIGxvYWQoKSBrZWVwcyB0aGlzIGNoYW5nZSBvbmNlIHRoZSByZWFkIGxhbmRzLgogICAgaWYgKGxvYWRlZCkgc2F2ZSgpOyBlbHNlIGxvYWQoKS50aGVuKHNhdmUpOwogIH0KCiAgLy8g4pSA4pSAIEltYWdlIGRvd25zY2FsZSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKICAvLyBFbmNvZGUgdGhyb3VnaCBhIGNhbnZhcyBzbyB0aGUgc2lkZWNhciBjYXJyaWVzIHJlc2l6ZWQgYnl0ZXMsIG5vdCB0aGUKICAvLyByYXcgdXBsb2FkLiBMb25nZXN0IHNpZGUgaXMgY2FwcGVkIGF0IDLDlyB0aGUgc2xvdCdzIHJlbmRlcmVkIHdpZHRoCiAgLy8gKHJldGluYSkgYW5kIGF0IE1BWF9ESU0uIFdlYlAga2VlcHMgYWxwaGEgYW5kIGlzIH4xMMOXIHNtYWxsZXIgdGhhbiBQTkcKICAvLyBmb3IgcGhvdG9zLCBzbyB0aGVyZSdzIG5vIG5lZWQgZm9yIHBlci1pbWFnZSBmb3JtYXQgcGlja2luZy4KICBhc3luYyBmdW5jdGlvbiB0b0RhdGFVcmwoZmlsZSwgdGFyZ2V0VykgewogICAgY29uc3QgYml0bWFwID0gYXdhaXQgY3JlYXRlSW1hZ2VCaXRtYXAoZmlsZSk7CiAgICB0cnkgewogICAgICBjb25zdCBjYXAgPSBNYXRoLm1pbihNQVhfRElNLCBNYXRoLm1heCgxLCBNYXRoLnJvdW5kKHRhcmdldFcgKiAyKSkgfHwgTUFYX0RJTSk7CiAgICAgIGNvbnN0IHNjYWxlID0gTWF0aC5taW4oMSwgY2FwIC8gTWF0aC5tYXgoYml0bWFwLndpZHRoLCBiaXRtYXAuaGVpZ2h0KSk7CiAgICAgIGNvbnN0IHcgPSBNYXRoLm1heCgxLCBNYXRoLnJvdW5kKGJpdG1hcC53aWR0aCAqIHNjYWxlKSk7CiAgICAgIGNvbnN0IGggPSBNYXRoLm1heCgxLCBNYXRoLnJvdW5kKGJpdG1hcC5oZWlnaHQgKiBzY2FsZSkpOwogICAgICBjb25zdCBjYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTsKICAgICAgY2FudmFzLndpZHRoID0gdzsgY2FudmFzLmhlaWdodCA9IGg7CiAgICAgIGNhbnZhcy5nZXRDb250ZXh0KCcyZCcpLmRyYXdJbWFnZShiaXRtYXAsIDAsIDAsIHcsIGgpOwogICAgICByZXR1cm4gY2FudmFzLnRvRGF0YVVSTCgnaW1hZ2Uvd2VicCcsIDAuODUpOwogICAgfSBmaW5hbGx5IHsKICAgICAgYml0bWFwLmNsb3NlICYmIGJpdG1hcC5jbG9zZSgpOwogICAgfQogIH0KCiAgLy8g4pSA4pSAIEN1c3RvbSBlbGVtZW50IOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAogIGNvbnN0IHN0eWxlc2hlZXQgPQogICAgJzpob3N0e2Rpc3BsYXk6aW5saW5lLWJsb2NrO3Bvc2l0aW9uOnJlbGF0aXZlO3ZlcnRpY2FsLWFsaWduOnRvcDsnICsKICAgICcgIGZvbnQ6MTNweC8xLjMgc3lzdGVtLXVpLC1hcHBsZS1zeXN0ZW0sc2Fucy1zZXJpZjtjb2xvcjpyZ2JhKDAsMCwwLC41NSk7d2lkdGg6MjQwcHg7aGVpZ2h0OjE2MHB4fScgKwogICAgJy5mcmFtZXtwb3NpdGlvbjphYnNvbHV0ZTtpbnNldDowO292ZXJmbG93OmhpZGRlbjtiYWNrZ3JvdW5kOnJnYmEoMCwwLDAsLjA0KX0nICsKICAgIC8vIC5mcmFtZSBpbWcgKGNsaXBwZWQpIGFuZCAuc3BpbGwgKHVuY2xpcHBlZCBnaG9zdCArIGhhbmRsZXMpIHNoYXJlIHRoZQogICAgLy8gc2FtZSBsZWZ0L3RvcC93aWR0aC9oZWlnaHQgaW4gZnJhbWUtJSwgY29tcHV0ZWQgYnkgX2FwcGx5VmlldygpLCBzbyB0aGUKICAgIC8vIGluc2lkZS1tYXNrIGNyb3AgYW5kIHRoZSBvdXRzaWRlLW1hc2sgc3BpbGwgc3RheSBwaXhlbC1hbGlnbmVkLgogICAgJy5mcmFtZSBpbWd7cG9zaXRpb246YWJzb2x1dGU7bWF4LXdpZHRoOm5vbmU7dHJhbnNmb3JtOnRyYW5zbGF0ZSgtNTAlLC01MCUpOycgKwogICAgJyAgLXdlYmtpdC11c2VyLWRyYWc6bm9uZTt1c2VyLXNlbGVjdDpub25lO3RvdWNoLWFjdGlvbjpub25lfScgKwogICAgLy8gUmVmcmFtZSBtb2RlIChkb3VibGUtY2xpY2spOiB0aGUgZnVsbCBpbWFnZSBzcGlsbHMgcGFzdCB0aGUgbWFzay4gVGhlCiAgICAvLyBzcGlsbCBsYXllciBpcyBzaXplZCB0byB0aGUgSU1BR0UgYm91bmRzIHNvIGl0cyBjb3JuZXJzIGFyZSB3aGVyZSB0aGUKICAgIC8vIHJlc2l6ZSBoYW5kbGVzIGJlbG9uZy4gVGhlIGdob3N0IDxpbWc+IGluc2lkZSBpcyB0cmFuc2x1Y2VudDsgdGhlIHJlYWwKICAgIC8vIGNsaXBwZWQgPGltZz4gdW5kZXJuZWF0aCBzaG93cyB0aGUgb3BhcXVlIGluLW1hc2sgY3JvcC4KICAgICcuc3BpbGx7cG9zaXRpb246YWJzb2x1dGU7dHJhbnNmb3JtOnRyYW5zbGF0ZSgtNTAlLC01MCUpO2Rpc3BsYXk6bm9uZTt6LWluZGV4OjE7JyArCiAgICAnICBjdXJzb3I6Z3JhYjt0b3VjaC1hY3Rpb246bm9uZX0nICsKICAgICc6aG9zdChbZGF0YS1wYW5uaW5nXSkgLnNwaWxse2N1cnNvcjpncmFiYmluZ30nICsKICAgICcuc3BpbGwgLmdob3N0e3Bvc2l0aW9uOmFic29sdXRlO2luc2V0OjA7d2lkdGg6MTAwJTtoZWlnaHQ6MTAwJTtvcGFjaXR5Oi4zNTsnICsKICAgICcgIHBvaW50ZXItZXZlbnRzOm5vbmU7LXdlYmtpdC11c2VyLWRyYWc6bm9uZTt1c2VyLXNlbGVjdDpub25lOycgKwogICAgJyAgYm94LXNoYWRvdzowIDAgMCAxcHggcmdiYSgwLDAsMCwuMiksMCAxMnB4IDMycHggcmdiYSgwLDAsMCwuMil9JyArCiAgICAnLnNwaWxsIC5oYW5kbGV7cG9zaXRpb246YWJzb2x1dGU7d2lkdGg6MTJweDtoZWlnaHQ6MTJweDtib3JkZXItcmFkaXVzOjUwJTsnICsKICAgICcgIGJhY2tncm91bmQ6I2ZmZjtib3gtc2hhZG93OjAgMCAwIDEuNXB4ICNjOTY0NDIsMCAxcHggM3B4IHJnYmEoMCwwLDAsLjMpOycgKwogICAgJyAgdHJhbnNmb3JtOnRyYW5zbGF0ZSgtNTAlLC01MCUpfScgKwogICAgJy5zcGlsbCAuaGFuZGxlW2RhdGEtYz1ud117bGVmdDowO3RvcDowO2N1cnNvcjpud3NlLXJlc2l6ZX0nICsKICAgICcuc3BpbGwgLmhhbmRsZVtkYXRhLWM9bmVde2xlZnQ6MTAwJTt0b3A6MDtjdXJzb3I6bmVzdy1yZXNpemV9JyArCiAgICAnLnNwaWxsIC5oYW5kbGVbZGF0YS1jPXN3XXtsZWZ0OjA7dG9wOjEwMCU7Y3Vyc29yOm5lc3ctcmVzaXplfScgKwogICAgJy5zcGlsbCAuaGFuZGxlW2RhdGEtYz1zZV17bGVmdDoxMDAlO3RvcDoxMDAlO2N1cnNvcjpud3NlLXJlc2l6ZX0nICsKICAgICc6aG9zdChbZGF0YS1yZWZyYW1lXSl7ei1pbmRleDoxMH0nICsKICAgICc6aG9zdChbZGF0YS1yZWZyYW1lXSkgLnNwaWxse2Rpc3BsYXk6YmxvY2t9JyArCiAgICAnOmhvc3QoW2RhdGEtcmVmcmFtZV0pIC5mcmFtZXtib3gtc2hhZG93OjAgMCAwIDJweCAjYzk2NDQyfScgKwogICAgJy5lbXB0eXtwb3NpdGlvbjphYnNvbHV0ZTtpbnNldDowO2Rpc3BsYXk6ZmxleDtmbGV4LWRpcmVjdGlvbjpjb2x1bW47YWxpZ24taXRlbXM6Y2VudGVyOycgKwogICAgJyAganVzdGlmeS1jb250ZW50OmNlbnRlcjtnYXA6NnB4O3RleHQtYWxpZ246Y2VudGVyO3BhZGRpbmc6MTJweDtib3gtc2l6aW5nOmJvcmRlci1ib3g7JyArCiAgICAnICBjdXJzb3I6cG9pbnRlcjt1c2VyLXNlbGVjdDpub25lfScgKwogICAgJy5lbXB0eSBzdmd7b3BhY2l0eTouNDV9JyArCiAgICAnLmVtcHR5IC5jYXB7bWF4LXdpZHRoOjkwJTtmb250LXdlaWdodDo1MDA7bGV0dGVyLXNwYWNpbmc6LjAxZW19JyArCiAgICAnLmVtcHR5IC5zdWJ7Zm9udC1zaXplOjExcHh9JyArCiAgICAnLmVtcHR5IC5zdWIgdXt0ZXh0LXVuZGVybGluZS1vZmZzZXQ6MnB4O3RleHQtZGVjb3JhdGlvbi1jb2xvcjpyZ2JhKDAsMCwwLC4yNSl9JyArCiAgICAnLmVtcHR5OmhvdmVyIC5zdWIgdXtjb2xvcjpyZ2JhKDAsMCwwLC43NSk7dGV4dC1kZWNvcmF0aW9uLWNvbG9yOmN1cnJlbnRDb2xvcn0nICsKICAgICc6aG9zdChbZGF0YS1vdmVyXSkgLmZyYW1le291dGxpbmU6MnB4IHNvbGlkICNjOTY0NDI7b3V0bGluZS1vZmZzZXQ6LTJweDsnICsKICAgICcgIGJhY2tncm91bmQ6cmdiYSgyMDEsMTAwLDY2LC4xMCl9JyArCiAgICAnLnJpbmd7cG9zaXRpb246YWJzb2x1dGU7aW5zZXQ6MDtwb2ludGVyLWV2ZW50czpub25lO2JvcmRlcjoxLjVweCBkYXNoZWQgcmdiYSgwLDAsMCwuMjUpOycgKwogICAgJyAgdHJhbnNpdGlvbjpib3JkZXItY29sb3IgLjEyc30nICsKICAgICc6aG9zdChbZGF0YS1vdmVyXSkgLnJpbmd7Ym9yZGVyLWNvbG9yOiNjOTY0NDJ9JyArCiAgICAnOmhvc3QoW2RhdGEtZmlsbGVkXSkgLnJpbmd7ZGlzcGxheTpub25lfScgKwogICAgLy8gQ29udHJvbHMgc2l0IEJFTE9XIHRoZSBtYXNrICh0b3A6MTAwJSksIGFic29sdXRlbHkgcG9zaXRpb25lZCBzbyB0aGUKICAgIC8vIGF1dGhvci1kZWNsYXJlZCBzbG90IGhlaWdodCBpcyB1bmFmZmVjdGVkLiBUaGUgZ2FwIGlzIHBhZGRpbmcsIG5vdCBhCiAgICAvLyB0b3Agb2Zmc2V0LCBzbyB0aGUgaG92ZXIgdGFyZ2V0IHN0YXlzIGNvbnRpZ3VvdXMgd2l0aCB0aGUgZnJhbWUuCiAgICAnLmN0bHtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MTAwJTtsZWZ0OjUwJTt0cmFuc2Zvcm06dHJhbnNsYXRlWCgtNTAlKTtwYWRkaW5nLXRvcDo4cHg7JyArCiAgICAnICBkaXNwbGF5OmZsZXg7Z2FwOjZweDtvcGFjaXR5OjA7cG9pbnRlci1ldmVudHM6bm9uZTt0cmFuc2l0aW9uOm9wYWNpdHkgLjEyczt6LWluZGV4OjI7JyArCiAgICAnICB3aGl0ZS1zcGFjZTpub3dyYXB9JyArCiAgICAnOmhvc3QoW2RhdGEtZmlsbGVkXVtkYXRhLWVkaXRhYmxlXTpob3ZlcikgLmN0bCw6aG9zdChbZGF0YS1yZWZyYW1lXSkgLmN0bCcgKwogICAgJyAge29wYWNpdHk6MTtwb2ludGVyLWV2ZW50czphdXRvfScgKwogICAgJy5jdGwgYnV0dG9ue2FwcGVhcmFuY2U6bm9uZTtib3JkZXI6MDtib3JkZXItcmFkaXVzOjZweDtwYWRkaW5nOjVweCAxMHB4O2N1cnNvcjpwb2ludGVyOycgKwogICAgJyAgYmFja2dyb3VuZDpyZ2JhKDAsMCwwLC42NSk7Y29sb3I6I2ZmZjtmb250OjExcHgvMSBzeXN0ZW0tdWksLWFwcGxlLXN5c3RlbSxzYW5zLXNlcmlmOycgKwogICAgJyAgYmFja2Ryb3AtZmlsdGVyOmJsdXIoNnB4KX0nICsKICAgICcuY3RsIGJ1dHRvbjpob3ZlcntiYWNrZ3JvdW5kOnJnYmEoMCwwLDAsLjgpfScgKwogICAgJy5lcnJ7cG9zaXRpb246YWJzb2x1dGU7bGVmdDo4cHg7Ym90dG9tOjhweDtyaWdodDo4cHg7Y29sb3I6I2IzMjYxZTtmb250LXNpemU6MTFweDsnICsKICAgICcgIGJhY2tncm91bmQ6cmdiYSgyNTUsMjU1LDI1NSwuODUpO3BhZGRpbmc6NHB4IDZweDtib3JkZXItcmFkaXVzOjVweDtwb2ludGVyLWV2ZW50czpub25lfSc7CgogIGNvbnN0IGljb24gPQogICAgJzxzdmcgd2lkdGg9IjI4IiBoZWlnaHQ9IjI4IiB2aWV3Qm94PSIwIDAgMjQgMjQiIGZpbGw9Im5vbmUiIHN0cm9rZT0iY3VycmVudENvbG9yIiAnICsKICAgICdzdHJva2Utd2lkdGg9IjEuNiIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIj4nICsKICAgICc8cmVjdCB4PSIzIiB5PSIzIiB3aWR0aD0iMTgiIGhlaWdodD0iMTgiIHJ4PSIyIi8+PGNpcmNsZSBjeD0iOC41IiBjeT0iOC41IiByPSIxLjUiLz4nICsKICAgICc8cGF0aCBkPSJtMjEgMTUtNS01TDUgMjEiLz48L3N2Zz4nOwoKICBjbGFzcyBJbWFnZVNsb3QgZXh0ZW5kcyBIVE1MRWxlbWVudCB7CiAgICBzdGF0aWMgZ2V0IG9ic2VydmVkQXR0cmlidXRlcygpIHsKICAgICAgcmV0dXJuIFsnc2hhcGUnLCAncmFkaXVzJywgJ21hc2snLCAnZml0JywgJ3Bvc2l0aW9uJywgJ3BsYWNlaG9sZGVyJywgJ3NyYycsICdpZCddOwogICAgfQoKICAgIGNvbnN0cnVjdG9yKCkgewogICAgICBzdXBlcigpOwogICAgICBjb25zdCByb290ID0gdGhpcy5hdHRhY2hTaGFkb3coeyBtb2RlOiAnb3BlbicgfSk7CiAgICAgIC8vIC5zcGlsbCBhbmQgLmN0bCBzaXQgT1VUU0lERSAuZnJhbWUgc28gb3ZlcmZsb3c6aGlkZGVuICsgYm9yZGVyLXJhZGl1cwogICAgICAvLyBvbiB0aGUgZnJhbWUgKGNpcmNsZSwgcGlsbCwgcm91bmRlZCkgY2FuJ3QgY2xpcCB0aGVtLgogICAgICByb290LmlubmVySFRNTCA9CiAgICAgICAgJzxzdHlsZT4nICsgc3R5bGVzaGVldCArICc8L3N0eWxlPicgKwogICAgICAgICc8ZGl2IGNsYXNzPSJmcmFtZSIgcGFydD0iZnJhbWUiPicgKwogICAgICAgICcgIDxpbWcgcGFydD0iaW1hZ2UiIGFsdD0iIiBkcmFnZ2FibGU9ImZhbHNlIiBzdHlsZT0iZGlzcGxheTpub25lIj4nICsKICAgICAgICAnICA8ZGl2IGNsYXNzPSJlbXB0eSIgcGFydD0iZW1wdHkiPicgKyBpY29uICsKICAgICAgICAnICAgIDxkaXYgY2xhc3M9ImNhcCI+PC9kaXY+JyArCiAgICAgICAgJyAgICA8ZGl2IGNsYXNzPSJzdWIiPm9yIDx1PmJyb3dzZSBmaWxlczwvdT48L2Rpdj48L2Rpdj4nICsKICAgICAgICAnICA8ZGl2IGNsYXNzPSJyaW5nIiBwYXJ0PSJyaW5nIj48L2Rpdj4nICsKICAgICAgICAnPC9kaXY+JyArCiAgICAgICAgJzxkaXYgY2xhc3M9InNwaWxsIj4nICsKICAgICAgICAnICA8aW1nIGNsYXNzPSJnaG9zdCIgYWx0PSIiIGRyYWdnYWJsZT0iZmFsc2UiPicgKwogICAgICAgICcgIDxkaXYgY2xhc3M9ImhhbmRsZSIgZGF0YS1jPSJudyI+PC9kaXY+PGRpdiBjbGFzcz0iaGFuZGxlIiBkYXRhLWM9Im5lIj48L2Rpdj4nICsKICAgICAgICAnICA8ZGl2IGNsYXNzPSJoYW5kbGUiIGRhdGEtYz0ic3ciPjwvZGl2PjxkaXYgY2xhc3M9ImhhbmRsZSIgZGF0YS1jPSJzZSI+PC9kaXY+JyArCiAgICAgICAgJzwvZGl2PicgKwogICAgICAgICc8ZGl2IGNsYXNzPSJjdGwiPjxidXR0b24gZGF0YS1hY3Q9InJlcGxhY2UiIHRpdGxlPSJSZXBsYWNlIGltYWdlIj5SZXBsYWNlPC9idXR0b24+JyArCiAgICAgICAgJyAgPGJ1dHRvbiBkYXRhLWFjdD0iY2xlYXIiIHRpdGxlPSJSZW1vdmUgaW1hZ2UiPlJlbW92ZTwvYnV0dG9uPjwvZGl2PicgKwogICAgICAgICc8aW5wdXQgdHlwZT0iZmlsZSIgYWNjZXB0PSInICsgQUNDRVBULmpvaW4oJywnKSArICciIGhpZGRlbj4nOwogICAgICB0aGlzLl9mcmFtZSA9IHJvb3QucXVlcnlTZWxlY3RvcignLmZyYW1lJyk7CiAgICAgIHRoaXMuX3JpbmcgPSByb290LnF1ZXJ5U2VsZWN0b3IoJy5yaW5nJyk7CiAgICAgIHRoaXMuX2ltZyA9IHJvb3QucXVlcnlTZWxlY3RvcignLmZyYW1lIGltZycpOwogICAgICB0aGlzLl9lbXB0eSA9IHJvb3QucXVlcnlTZWxlY3RvcignLmVtcHR5Jyk7CiAgICAgIHRoaXMuX2NhcCA9IHJvb3QucXVlcnlTZWxlY3RvcignLmNhcCcpOwogICAgICB0aGlzLl9zdWIgPSByb290LnF1ZXJ5U2VsZWN0b3IoJy5zdWInKTsKICAgICAgdGhpcy5fc3BpbGwgPSByb290LnF1ZXJ5U2VsZWN0b3IoJy5zcGlsbCcpOwogICAgICB0aGlzLl9naG9zdCA9IHJvb3QucXVlcnlTZWxlY3RvcignLmdob3N0Jyk7CiAgICAgIHRoaXMuX2VyciA9IG51bGw7CiAgICAgIHRoaXMuX2lucHV0ID0gcm9vdC5xdWVyeVNlbGVjdG9yKCdpbnB1dCcpOwogICAgICB0aGlzLl9kZXB0aCA9IDA7CiAgICAgIHRoaXMuX2dlbiA9IDA7CiAgICAgIHRoaXMuX3ZpZXcgPSB7IHM6IDEsIHg6IDAsIHk6IDAgfTsKICAgICAgdGhpcy5fc3ViRm4gPSAoKSA9PiB0aGlzLl9yZW5kZXIoKTsKICAgICAgLy8gU2hhZG93LURPTSBsaXN0ZW5lcnMgbGl2ZSB3aXRoIHRoZSBzaGFkb3cgRE9NIOKAlCBib3VuZCBvbmNlIGhlcmUgc28KICAgICAgLy8gZGlzY29ubmVjdC9yZWNvbm5lY3QgKGUuZy4gUmVhY3QgcmVtb3VudCkgZG9lc24ndCBzdGFjayBoYW5kbGVycy4KICAgICAgdGhpcy5fZW1wdHkuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB0aGlzLl9pbnB1dC5jbGljaygpKTsKICAgICAgcm9vdC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChlKSA9PiB7CiAgICAgICAgY29uc3QgYWN0ID0gZS50YXJnZXQgJiYgZS50YXJnZXQuZ2V0QXR0cmlidXRlICYmIGUudGFyZ2V0LmdldEF0dHJpYnV0ZSgnZGF0YS1hY3QnKTsKICAgICAgICBpZiAoYWN0ID09PSAncmVwbGFjZScpIHsgdGhpcy5fZXhpdFJlZnJhbWUodHJ1ZSk7IHRoaXMuX2lucHV0LmNsaWNrKCk7IH0KICAgICAgICBpZiAoYWN0ID09PSAnY2xlYXInKSB7CiAgICAgICAgICB0aGlzLl9leGl0UmVmcmFtZShmYWxzZSk7CiAgICAgICAgICB0aGlzLl9nZW4rKzsKICAgICAgICAgIHRoaXMuX2xvY2FsID0gbnVsbDsKICAgICAgICAgIGlmICh0aGlzLmlkKSBzZXRTbG90KHRoaXMuaWQsIG51bGwpOyBlbHNlIHRoaXMuX3JlbmRlcigpOwogICAgICAgIH0KICAgICAgfSk7CiAgICAgIHRoaXMuX2lucHV0LmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsICgpID0+IHsKICAgICAgICBjb25zdCBmID0gdGhpcy5faW5wdXQuZmlsZXMgJiYgdGhpcy5faW5wdXQuZmlsZXNbMF07CiAgICAgICAgaWYgKGYpIHRoaXMuX2luZ2VzdChmKTsKICAgICAgICB0aGlzLl9pbnB1dC52YWx1ZSA9ICcnOwogICAgICB9KTsKICAgICAgLy8gbmF0dXJhbFdpZHRoL0hlaWdodCBhcmVuJ3Qga25vd24gdW50aWwgbG9hZCDigJQgcmUtYXBwbHkgc28gdGhlIGNvdmVyCiAgICAgIC8vIGJhc2VsaW5lIGlzIGNvbXB1dGVkIGZyb20gcmVhbCBkaW1lbnNpb25zLCBub3QgdGhlIDEwMCXDlzEwMCUgZmFsbGJhY2suCiAgICAgIHRoaXMuX2ltZy5hZGRFdmVudExpc3RlbmVyKCdsb2FkJywgKCkgPT4gdGhpcy5fYXBwbHlWaWV3KCkpOwogICAgICAvLyBHYXRlZCBvbiBlZGl0YWJsZSArIGZpdD1jb3ZlciBzbyBzaGFyZSBsaW5rcyBhbmQgY29udGFpbi9maWxsIHNsb3RzCiAgICAgIC8vIHN0YXkgc3RhdGljLgogICAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoJ2RibGNsaWNrJywgKGUpID0+IHsKICAgICAgICBpZiAoIXRoaXMuaGFzQXR0cmlidXRlKCdkYXRhLWVkaXRhYmxlJykgfHwgIXRoaXMuX3JlZnJhbWVzKCkpIHJldHVybjsKICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgaWYgKHRoaXMuaGFzQXR0cmlidXRlKCdkYXRhLXJlZnJhbWUnKSkgdGhpcy5fZXhpdFJlZnJhbWUodHJ1ZSk7CiAgICAgICAgZWxzZSB0aGlzLl9lbnRlclJlZnJhbWUoKTsKICAgICAgfSk7CiAgICAgIC8vIFBhbiArIHJlc2l6ZSBib3RoIG9yaWdpbmF0ZSBvbiB0aGUgc3BpbGwgbGF5ZXIuIEEgaGFuZGxlIHBvaW50ZXJkb3duCiAgICAgIC8vIGRyaXZlcyBhbiBhc3BlY3QtbG9ja2VkIHJlc2l6ZSBhbmNob3JlZCBhdCB0aGUgb3Bwb3NpdGUgY29ybmVyOyBhbnkKICAgICAgLy8gb3RoZXIgcG9pbnRlcmRvd24gb24gdGhlIHNwaWxsIHBhbnMuIE9mZnNldHMgYXJlIGZyYW1lLSUgc28gYQogICAgICAvLyByZWZyYW1lZCBzbG90IHN1cnZpdmVzIHJlc3BvbnNpdmUgcmVzaXplIC8gUFBUWCBleHBvcnQuCiAgICAgIHRoaXMuX3NwaWxsLmFkZEV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJkb3duJywgKGUpID0+IHsKICAgICAgICBpZiAoZS5idXR0b24gIT09IDAgfHwgIXRoaXMuaGFzQXR0cmlidXRlKCdkYXRhLXJlZnJhbWUnKSkgcmV0dXJuOwogICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpOwogICAgICAgIHRoaXMuX3NwaWxsLnNldFBvaW50ZXJDYXB0dXJlKGUucG9pbnRlcklkKTsKICAgICAgICBjb25zdCByZWN0ID0gdGhpcy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsKICAgICAgICBjb25zdCBmdyA9IHJlY3Qud2lkdGggfHwgMSwgZmggPSByZWN0LmhlaWdodCB8fCAxOwogICAgICAgIGNvbnN0IGNvcm5lciA9IGUudGFyZ2V0LmdldEF0dHJpYnV0ZSAmJiBlLnRhcmdldC5nZXRBdHRyaWJ1dGUoJ2RhdGEtYycpOwogICAgICAgIGxldCBtb3ZlOwogICAgICAgIGlmIChjb3JuZXIpIHsKICAgICAgICAgIC8vIFJlc2l6ZSBhYm91dCB0aGUgT1BQT1NJVEUgY29ybmVyLiBWaWV3cG9ydC1weCB0aHJvdWdob3V0IChyZWN0CiAgICAgICAgICAvLyBmdy9maCwgbm90IGNsaWVudFdpZHRoKSBzbyB0aGUgbWF0aCBzdXJ2aXZlcyBhIHRyYW5zZm9ybTpzY2FsZSgpCiAgICAgICAgICAvLyBhbmNlc3RvciDigJQgZGVja19zdGFnZSByZW5kZXJzIHNsaWRlcyBzY2FsZWQtdG8tZml0LgogICAgICAgICAgY29uc3QgaXcgPSB0aGlzLl9pbWcubmF0dXJhbFdpZHRoIHx8IDEsIGloID0gdGhpcy5faW1nLm5hdHVyYWxIZWlnaHQgfHwgMTsKICAgICAgICAgIGNvbnN0IGJhc2UgPSBNYXRoLm1heChmdyAvIGl3LCBmaCAvIGloKTsKICAgICAgICAgIGNvbnN0IHN4ID0gY29ybmVyLmluY2x1ZGVzKCdlJykgPyAxIDogLTE7CiAgICAgICAgICBjb25zdCBzeSA9IGNvcm5lci5pbmNsdWRlcygncycpID8gMSA6IC0xOwogICAgICAgICAgY29uc3QgczAgPSB0aGlzLl92aWV3LnM7CiAgICAgICAgICBjb25zdCB3MCA9IGl3ICogYmFzZSAqIHMwLCBoMCA9IGloICogYmFzZSAqIHMwOwogICAgICAgICAgY29uc3QgY3gwID0gKDUwICsgdGhpcy5fdmlldy54KSAvIDEwMCAqIGZ3OwogICAgICAgICAgY29uc3QgY3kwID0gKDUwICsgdGhpcy5fdmlldy55KSAvIDEwMCAqIGZoOwogICAgICAgICAgY29uc3Qgb3ggPSBjeDAgLSBzeCAqIHcwIC8gMiwgb3kgPSBjeTAgLSBzeSAqIGgwIC8gMjsKICAgICAgICAgIGNvbnN0IGRpYWcwID0gTWF0aC5oeXBvdCh3MCwgaDApOwogICAgICAgICAgY29uc3QgdXggPSBzeCAqIHcwIC8gZGlhZzAsIHV5ID0gc3kgKiBoMCAvIGRpYWcwOwogICAgICAgICAgbW92ZSA9IChldikgPT4gewogICAgICAgICAgICBjb25zdCBwcm9qID0gKGV2LmNsaWVudFggLSByZWN0LmxlZnQgLSBveCkgKiB1eCArCiAgICAgICAgICAgICAgICAgICAgICAgICAoZXYuY2xpZW50WSAtIHJlY3QudG9wIC0gb3kpICogdXk7CiAgICAgICAgICAgIGNvbnN0IHMgPSBjbGFtcFMoczAgKiBwcm9qIC8gZGlhZzApOwogICAgICAgICAgICBjb25zdCBkID0gZGlhZzAgKiBzIC8gczA7CiAgICAgICAgICAgIHRoaXMuX3ZpZXcucyA9IHM7CiAgICAgICAgICAgIHRoaXMuX3ZpZXcueCA9IChveCArIHV4ICogZCAvIDIpIC8gZncgKiAxMDAgLSA1MDsKICAgICAgICAgICAgdGhpcy5fdmlldy55ID0gKG95ICsgdXkgKiBkIC8gMikgLyBmaCAqIDEwMCAtIDUwOwogICAgICAgICAgICB0aGlzLl9jbGFtcFZpZXcoKTsKICAgICAgICAgICAgdGhpcy5fYXBwbHlWaWV3KCk7CiAgICAgICAgICB9OwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB0aGlzLnNldEF0dHJpYnV0ZSgnZGF0YS1wYW5uaW5nJywgJycpOwogICAgICAgICAgY29uc3Qgc3RhcnQgPSB7IHB4OiBlLmNsaWVudFgsIHB5OiBlLmNsaWVudFksIHg6IHRoaXMuX3ZpZXcueCwgeTogdGhpcy5fdmlldy55IH07CiAgICAgICAgICBtb3ZlID0gKGV2KSA9PiB7CiAgICAgICAgICAgIHRoaXMuX3ZpZXcueCA9IHN0YXJ0LnggKyAoZXYuY2xpZW50WCAtIHN0YXJ0LnB4KSAvIGZ3ICogMTAwOwogICAgICAgICAgICB0aGlzLl92aWV3LnkgPSBzdGFydC55ICsgKGV2LmNsaWVudFkgLSBzdGFydC5weSkgLyBmaCAqIDEwMDsKICAgICAgICAgICAgdGhpcy5fY2xhbXBWaWV3KCk7CiAgICAgICAgICAgIHRoaXMuX2FwcGx5VmlldygpOwogICAgICAgICAgfTsKICAgICAgICB9CiAgICAgICAgY29uc3QgdXAgPSAoKSA9PiB7CiAgICAgICAgICB0cnkgeyB0aGlzLl9zcGlsbC5yZWxlYXNlUG9pbnRlckNhcHR1cmUoZS5wb2ludGVySWQpOyB9IGNhdGNoIHt9CiAgICAgICAgICB0aGlzLl9zcGlsbC5yZW1vdmVFdmVudExpc3RlbmVyKCdwb2ludGVybW92ZScsIG1vdmUpOwogICAgICAgICAgdGhpcy5fc3BpbGwucmVtb3ZlRXZlbnRMaXN0ZW5lcigncG9pbnRlcnVwJywgdXApOwogICAgICAgICAgdGhpcy5fc3BpbGwucmVtb3ZlRXZlbnRMaXN0ZW5lcigncG9pbnRlcmNhbmNlbCcsIHVwKTsKICAgICAgICAgIHRoaXMucmVtb3ZlQXR0cmlidXRlKCdkYXRhLXBhbm5pbmcnKTsKICAgICAgICAgIHRoaXMuX2RyYWdVcCA9IG51bGw7CiAgICAgICAgfTsKICAgICAgICAvLyBTdGFzaGVkIHNvIF9leGl0UmVmcmFtZSAoRXNjYXBlIC8gb3V0c2lkZS1jbGljayBtaWQtZHJhZykgY2FuCiAgICAgICAgLy8gdGVhciB0aGUgY2FwdHVyZSArIGxpc3RlbmVycyBkb3duIHN5bmNocm9ub3VzbHkuCiAgICAgICAgdGhpcy5fZHJhZ1VwID0gdXA7CiAgICAgICAgdGhpcy5fc3BpbGwuYWRkRXZlbnRMaXN0ZW5lcigncG9pbnRlcm1vdmUnLCBtb3ZlKTsKICAgICAgICB0aGlzLl9zcGlsbC5hZGRFdmVudExpc3RlbmVyKCdwb2ludGVydXAnLCB1cCk7CiAgICAgICAgdGhpcy5fc3BpbGwuYWRkRXZlbnRMaXN0ZW5lcigncG9pbnRlcmNhbmNlbCcsIHVwKTsKICAgICAgfSk7CiAgICAgIC8vIFdoZWVsIHpvb20gc3RheXMgYXZhaWxhYmxlIGluc2lkZSByZWZyYW1lIG1vZGUgYXMgYSB0cmFja3BhZCBuaWNldHkg4oCUCiAgICAgIC8vIHpvb21zIHRvd2FyZCB0aGUgY3Vyc29yIChvZmZzZXQnID0gY3Vyc29ywrcoMS1rKSArIG9mZnNldMK3aykuCiAgICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcignd2hlZWwnLCAoZSkgPT4gewogICAgICAgIGlmICghdGhpcy5oYXNBdHRyaWJ1dGUoJ2RhdGEtcmVmcmFtZScpKSByZXR1cm47CiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgIGNvbnN0IHIgPSB0aGlzLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOwogICAgICAgIGNvbnN0IGN4ID0gKGUuY2xpZW50WCAtIHIubGVmdCkgLyByLndpZHRoICogMTAwIC0gNTA7CiAgICAgICAgY29uc3QgY3kgPSAoZS5jbGllbnRZIC0gci50b3ApIC8gci5oZWlnaHQgKiAxMDAgLSA1MDsKICAgICAgICBjb25zdCBwcmV2ID0gdGhpcy5fdmlldy5zOwogICAgICAgIGNvbnN0IG5leHQgPSBjbGFtcFMocHJldiAqIE1hdGgucG93KDEuMDAxNSwgLWUuZGVsdGFZKSk7CiAgICAgICAgaWYgKG5leHQgPT09IHByZXYpIHJldHVybjsKICAgICAgICBjb25zdCBrID0gbmV4dCAvIHByZXY7CiAgICAgICAgdGhpcy5fdmlldy5zID0gbmV4dDsKICAgICAgICB0aGlzLl92aWV3LnggPSBjeCAqICgxIC0gaykgKyB0aGlzLl92aWV3LnggKiBrOwogICAgICAgIHRoaXMuX3ZpZXcueSA9IGN5ICogKDEgLSBrKSArIHRoaXMuX3ZpZXcueSAqIGs7CiAgICAgICAgdGhpcy5fY2xhbXBWaWV3KCk7CiAgICAgICAgdGhpcy5fYXBwbHlWaWV3KCk7CiAgICAgIH0sIHsgcGFzc2l2ZTogZmFsc2UgfSk7CiAgICB9CgogICAgY29ubmVjdGVkQ2FsbGJhY2soKSB7CiAgICAgIC8vIFdhcm4gb25jZSBwZXIgcGFnZSDigJQgYW4gaWQtbGVzcyBzbG90IHdvcmtzIGZvciB0aGUgc2Vzc2lvbiBidXQKICAgICAgLy8gY2Fubm90IHBlcnNpc3QsIGFuZCB0d28gaWQtbGVzcyBzbG90cyB3b3VsZCBzaGFyZSBub3RoaW5nLgogICAgICBpZiAoIXRoaXMuaWQgJiYgIUltYWdlU2xvdC5fd2FybmVkKSB7CiAgICAgICAgSW1hZ2VTbG90Ll93YXJuZWQgPSB0cnVlOwogICAgICAgIGNvbnNvbGUud2FybignPGltYWdlLXNsb3Q+IHdpdGhvdXQgYW4gaWQgd2lsbCBub3QgcGVyc2lzdCBpdHMgZHJvcHBlZCBpbWFnZS4nKTsKICAgICAgfQogICAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoJ2RyYWdlbnRlcicsIHRoaXMpOwogICAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoJ2RyYWdvdmVyJywgdGhpcyk7CiAgICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcignZHJhZ2xlYXZlJywgdGhpcyk7CiAgICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcignZHJvcCcsIHRoaXMpOwogICAgICBzdWJzLmFkZCh0aGlzLl9zdWJGbik7CiAgICAgIC8vIHdpZHRoJS9oZWlnaHQlIGluIF9hcHBseVZpZXcgZW5jb2RlIHRoZSBmcmFtZSBhc3BlY3QgYXQgY2FsbCB0aW1lIOKAlAogICAgICAvLyBhIGhvc3QgcmVzaXplIChyZXNwb25zaXZlIGdyaWQsIHBhbmUgZGl2aWRlcikgd291bGQgc3RyZXRjaCB0aGUKICAgICAgLy8gaW1hZ2UgdW50aWwgdGhlIG5leHQgX3JlbmRlci4gUmUtcmVuZGVyIG9uIHNpemUgY2hhbmdlOiBfcmVuZGVyKCkKICAgICAgLy8gcmUtc2VlZHMgX3ZpZXcgZnJvbSBzdG9yZWQgYmVmb3JlIGNsYW1wL2FwcGx5LCBzbyBhIHNocmlua+KGkmdyb3cKICAgICAgLy8gY3ljbGUgcm91bmQtdHJpcHMgaW5zdGVhZCBvZiByYXRjaGV0aW5nIHgveSB0b3dhcmQgdGhlIG5hcnJvd2VyCiAgICAgIC8vIGZyYW1lJ3MgY2xhbXAgcmFuZ2UuCiAgICAgIHRoaXMuX3JvID0gbmV3IFJlc2l6ZU9ic2VydmVyKCgpID0+IHRoaXMuX3JlbmRlcigpKTsKICAgICAgdGhpcy5fcm8ub2JzZXJ2ZSh0aGlzKTsKICAgICAgbG9hZCgpOwogICAgICB0aGlzLl9yZW5kZXIoKTsKICAgIH0KCiAgICBkaXNjb25uZWN0ZWRDYWxsYmFjaygpIHsKICAgICAgc3Vicy5kZWxldGUodGhpcy5fc3ViRm4pOwogICAgICB0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2RyYWdlbnRlcicsIHRoaXMpOwogICAgICB0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2RyYWdvdmVyJywgdGhpcyk7CiAgICAgIHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcignZHJhZ2xlYXZlJywgdGhpcyk7CiAgICAgIHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcignZHJvcCcsIHRoaXMpOwogICAgICBpZiAodGhpcy5fcm8pIHsgdGhpcy5fcm8uZGlzY29ubmVjdCgpOyB0aGlzLl9ybyA9IG51bGw7IH0KICAgICAgdGhpcy5fZXhpdFJlZnJhbWUoZmFsc2UpOwogICAgfQoKICAgIF9lbnRlclJlZnJhbWUoKSB7CiAgICAgIGlmICh0aGlzLmhhc0F0dHJpYnV0ZSgnZGF0YS1yZWZyYW1lJykpIHJldHVybjsKICAgICAgdGhpcy5zZXRBdHRyaWJ1dGUoJ2RhdGEtcmVmcmFtZScsICcnKTsKICAgICAgdGhpcy5fYXBwbHlWaWV3KCk7CiAgICAgIC8vIENsb3NlIG9uIGNsaWNrIG91dHNpZGUgKHRoZSBzcGlsbCBoYW5kbGVyIHN0b3BQcm9wYWdhdGlvbigpcyBzbwogICAgICAvLyBpbi1pbWFnZSBkcmFncyBkb24ndCByZWFjaCB0aGlzKSBhbmQgb24gRXNjYXBlLiBMaXN0ZW5lcnMgYXJlIGhlbGQKICAgICAgLy8gb24gdGhlIGluc3RhbmNlIHNvIF9leGl0UmVmcmFtZSAvIGRpc2Nvbm5lY3RlZENhbGxiYWNrIGNhbiBkZXRhY2gKICAgICAgLy8gZXhhY3RseSB3aGF0IHdhcyBhdHRhY2hlZC4KICAgICAgdGhpcy5fb3V0c2lkZSA9IChlKSA9PiB7CiAgICAgICAgaWYgKGUuY29tcG9zZWRQYXRoICYmIGUuY29tcG9zZWRQYXRoKCkuaW5jbHVkZXModGhpcykpIHJldHVybjsKICAgICAgICB0aGlzLl9leGl0UmVmcmFtZSh0cnVlKTsKICAgICAgfTsKICAgICAgdGhpcy5fZXNjID0gKGUpID0+IHsgaWYgKGUua2V5ID09PSAnRXNjYXBlJykgdGhpcy5fZXhpdFJlZnJhbWUodHJ1ZSk7IH07CiAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJkb3duJywgdGhpcy5fb3V0c2lkZSwgdHJ1ZSk7CiAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCB0aGlzLl9lc2MsIHRydWUpOwogICAgfQoKICAgIF9leGl0UmVmcmFtZShjb21taXQpIHsKICAgICAgaWYgKCF0aGlzLmhhc0F0dHJpYnV0ZSgnZGF0YS1yZWZyYW1lJykpIHJldHVybjsKICAgICAgaWYgKHRoaXMuX2RyYWdVcCkgdGhpcy5fZHJhZ1VwKCk7CiAgICAgIHRoaXMucmVtb3ZlQXR0cmlidXRlKCdkYXRhLXJlZnJhbWUnKTsKICAgICAgdGhpcy5yZW1vdmVBdHRyaWJ1dGUoJ2RhdGEtcGFubmluZycpOwogICAgICBpZiAodGhpcy5fb3V0c2lkZSkgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigncG9pbnRlcmRvd24nLCB0aGlzLl9vdXRzaWRlLCB0cnVlKTsKICAgICAgaWYgKHRoaXMuX2VzYykgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIHRoaXMuX2VzYywgdHJ1ZSk7CiAgICAgIHRoaXMuX291dHNpZGUgPSB0aGlzLl9lc2MgPSBudWxsOwogICAgICBpZiAoY29tbWl0KSB0aGlzLl9jb21taXRWaWV3KCk7CiAgICB9CgogICAgYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrKCkgeyBpZiAodGhpcy5zaGFkb3dSb290KSB0aGlzLl9yZW5kZXIoKTsgfQoKICAgIC8vIGhhbmRsZUV2ZW50IOKAlCBvbmUgbGlzdGVuZXIgb2JqZWN0IGZvciBhbGwgZm91ciBkcmFnIGV2ZW50cyBrZWVwcyB0aGUKICAgIC8vIGFkZC9yZW1vdmUgc3ltbWV0cmljIGFuZCB0aGUgZGVwdGggY291bnRlciBjb3JyZWN0LgogICAgaGFuZGxlRXZlbnQoZSkgewogICAgICBpZiAoZS50eXBlID09PSAnZHJhZ2VudGVyJyB8fCBlLnR5cGUgPT09ICdkcmFnb3ZlcicpIHsKICAgICAgICAvLyBXaXRob3V0IHByZXZlbnREZWZhdWx0IHRoZSBicm93c2VyIG5ldmVyIGZpcmVzICdkcm9wJy4KICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTsKICAgICAgICBpZiAoZS5kYXRhVHJhbnNmZXIpIGUuZGF0YVRyYW5zZmVyLmRyb3BFZmZlY3QgPSAnY29weSc7CiAgICAgICAgaWYgKGUudHlwZSA9PT0gJ2RyYWdlbnRlcicpIHRoaXMuX2RlcHRoKys7CiAgICAgICAgdGhpcy5zZXRBdHRyaWJ1dGUoJ2RhdGEtb3ZlcicsICcnKTsKICAgICAgfSBlbHNlIGlmIChlLnR5cGUgPT09ICdkcmFnbGVhdmUnKSB7CiAgICAgICAgLy8gZHJhZ2VudGVyL2xlYXZlIGZpcmUgZm9yIGV2ZXJ5IGRlc2NlbmRhbnQgY3Jvc3Npbmcg4oCUIGNvdW50IGRlcHRoCiAgICAgICAgLy8gc28gaG92ZXJpbmcgdGhlIGljb24gaW5zaWRlIHRoZSBlbXB0eSBzdGF0ZSBkb2Vzbid0IGZsaWNrZXIuCiAgICAgICAgaWYgKC0tdGhpcy5fZGVwdGggPD0gMCkgeyB0aGlzLl9kZXB0aCA9IDA7IHRoaXMucmVtb3ZlQXR0cmlidXRlKCdkYXRhLW92ZXInKTsgfQogICAgICB9IGVsc2UgaWYgKGUudHlwZSA9PT0gJ2Ryb3AnKSB7CiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7CiAgICAgICAgdGhpcy5fZGVwdGggPSAwOwogICAgICAgIHRoaXMucmVtb3ZlQXR0cmlidXRlKCdkYXRhLW92ZXInKTsKICAgICAgICBjb25zdCBmID0gZS5kYXRhVHJhbnNmZXIgJiYgZS5kYXRhVHJhbnNmZXIuZmlsZXMgJiYgZS5kYXRhVHJhbnNmZXIuZmlsZXNbMF07CiAgICAgICAgaWYgKGYpIHRoaXMuX2luZ2VzdChmKTsKICAgICAgfQogICAgfQoKICAgIGFzeW5jIF9pbmdlc3QoZmlsZSkgewogICAgICB0aGlzLl9zZXRFcnJvcihudWxsKTsKICAgICAgaWYgKCFmaWxlIHx8IEFDQ0VQVC5pbmRleE9mKGZpbGUudHlwZSkgPCAwKSB7CiAgICAgICAgdGhpcy5fc2V0RXJyb3IoJ0Ryb3AgYSBQTkcsIEpQRUcsIFdlYlAsIG9yIEFWSUYgaW1hZ2UuJyk7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIC8vIHRvRGF0YVVybCBjYW4gdGFrZSBodW5kcmVkcyBvZiBtcyBvbiBhIGxhcmdlIHBob3RvLiBBIENsZWFyIG9yIGEKICAgICAgLy8gbmV3ZXIgZHJvcCBkdXJpbmcgdGhhdCB3aW5kb3cgd291bGQgYmUgY2xvYmJlcmVkIHdoZW4gdGhpcyBhd2FpdAogICAgICAvLyByZXN1bWVzIOKAlCBidW1wICsgY2FwdHVyZSBhIGdlbmVyYXRpb24gc28gc3RhbGUgZW5jb2RlcyBiYWlsLgogICAgICBjb25zdCBnZW4gPSArK3RoaXMuX2dlbjsKICAgICAgdHJ5IHsKICAgICAgICBjb25zdCB3ID0gdGhpcy5jbGllbnRXaWR0aCB8fCB0aGlzLm9mZnNldFdpZHRoIHx8IE1BWF9ESU07CiAgICAgICAgY29uc3QgdXJsID0gYXdhaXQgdG9EYXRhVXJsKGZpbGUsIHcpOwogICAgICAgIGlmIChnZW4gIT09IHRoaXMuX2dlbikgcmV0dXJuOwogICAgICAgIC8vIE9ubHkgZXhpdCByZWZyYW1lIG9uY2UgdGhlIG5ldyBpbWFnZSBpcyBpbiBoYW5kIOKAlCBhIHJlamVjdGVkIHR5cGUKICAgICAgICAvLyBvciBkZWNvZGUgZmFpbHVyZSBsZWF2ZXMgdGhlIGluLXByb2dyZXNzIGNyb3AgdW50b3VjaGVkLgogICAgICAgIHRoaXMuX2V4aXRSZWZyYW1lKGZhbHNlKTsKICAgICAgICBjb25zdCB2YWwgPSB7IHU6IHVybCwgczogMSwgeDogMCwgeTogMCB9OwogICAgICAgIHNldFNsb3QodGhpcy5pZCB8fCAnJywgdmFsKTsKICAgICAgICAvLyBLZWVwIGEgc2Vzc2lvbi1sb2NhbCBjb3B5IGZvciBpZC1sZXNzIHNsb3RzIHNvIHRoZSBkcm9wIHN0aWxsCiAgICAgICAgLy8gc2hvd3MsIGV2ZW4gdGhvdWdoIGl0IGNhbm5vdCBwZXJzaXN0LgogICAgICAgIGlmICghdGhpcy5pZCkgeyB0aGlzLl9sb2NhbCA9IHZhbDsgdGhpcy5fcmVuZGVyKCk7IH0KICAgICAgfSBjYXRjaCAoZXJyKSB7CiAgICAgICAgaWYgKGdlbiAhPT0gdGhpcy5fZ2VuKSByZXR1cm47CiAgICAgICAgdGhpcy5fc2V0RXJyb3IoJ0NvdWxkIG5vdCByZWFkIHRoYXQgaW1hZ2UuJyk7CiAgICAgICAgY29uc29sZS53YXJuKCc8aW1hZ2Utc2xvdD4gaW5nZXN0IGZhaWxlZDonLCBlcnIpOwogICAgICB9CiAgICB9CgogICAgX3NldEVycm9yKG1zZykgewogICAgICBpZiAodGhpcy5fZXJyKSB7IHRoaXMuX2Vyci5yZW1vdmUoKTsgdGhpcy5fZXJyID0gbnVsbDsgfQogICAgICBpZiAoIW1zZykgcmV0dXJuOwogICAgICBjb25zdCBkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CiAgICAgIGQuY2xhc3NOYW1lID0gJ2Vycic7IGQudGV4dENvbnRlbnQgPSBtc2c7CiAgICAgIHRoaXMuc2hhZG93Um9vdC5hcHBlbmRDaGlsZChkKTsKICAgICAgdGhpcy5fZXJyID0gZDsKICAgICAgc2V0VGltZW91dCgoKSA9PiB7IGlmICh0aGlzLl9lcnIgPT09IGQpIHsgZC5yZW1vdmUoKTsgdGhpcy5fZXJyID0gbnVsbDsgfSB9LCAzMDAwKTsKICAgIH0KCiAgICAvLyBSZWZyYW1pbmcgKHBhbi9yZXNpemUpIGlzIG9ubHkgbWVhbmluZ2Z1bCBmb3IgZml0PWNvdmVyIOKAlCBjb250YWluL2ZpbGwKICAgIC8vIGtlZXAgdGhlIG9sZCBvYmplY3QtZml0IHBhdGggYW5kIGRvdWJsZS1jbGljayBpcyBhIG5vLW9wLgogICAgX3JlZnJhbWVzKCkgewogICAgICByZXR1cm4gdGhpcy5oYXNBdHRyaWJ1dGUoJ2RhdGEtZmlsbGVkJykgJiYKICAgICAgICAodGhpcy5nZXRBdHRyaWJ1dGUoJ2ZpdCcpIHx8ICdjb3ZlcicpID09PSAnY292ZXInOwogICAgfQoKICAgIC8vIENvdmVyLWJhc2VsaW5lIGdlb21ldHJ5LCBzaGFyZWQgYnkgY2xhbXAvYXBwbHkvcmVzaXplLiBOdWxsIHVudGlsIHRoZQogICAgLy8gaW1nIGhhcyBsb2FkZWQgKG5hdHVyYWxXaWR0aCBpcyAwIGJlZm9yZSB0aGF0KSBvciB3aGVuIHRoZSBzbG90IGhhcyBubwogICAgLy8gbGF5b3V0IGJveCDigJQgUmVzaXplT2JzZXJ2ZXIgZmlyZXMgd2l0aCBhIDDDlzAgcmVjdCB1bmRlciBkaXNwbGF5Om5vbmUsCiAgICAvLyBhbmQgY2xhbXBpbmcgYWdhaW5zdCBhIGRlZ2VuZXJhdGUgMcOXMSBmcmFtZSB3b3VsZCBzaWxlbnRseSBwdWxsIHRoZQogICAgLy8gc3RvcmVkIHBhbiB0b3dhcmQgemVyby4KICAgIF9nZW9tKCkgewogICAgICBjb25zdCBpdyA9IHRoaXMuX2ltZy5uYXR1cmFsV2lkdGgsIGloID0gdGhpcy5faW1nLm5hdHVyYWxIZWlnaHQ7CiAgICAgIGNvbnN0IGZ3ID0gdGhpcy5jbGllbnRXaWR0aCwgZmggPSB0aGlzLmNsaWVudEhlaWdodDsKICAgICAgaWYgKCFpdyB8fCAhaWggfHwgIWZ3IHx8ICFmaCkgcmV0dXJuIG51bGw7CiAgICAgIHJldHVybiB7IGl3LCBpaCwgZncsIGZoLCBiYXNlOiBNYXRoLm1heChmdyAvIGl3LCBmaCAvIGloKSB9OwogICAgfQoKICAgIF9jbGFtcFZpZXcoKSB7CiAgICAgIC8vIFBhbiByYW5nZSBvbiBlYWNoIGF4aXMgaXMgaGFsZiB0aGUgb3ZlcmZsb3cgcGFzdCB0aGUgZnJhbWUgZWRnZS4KICAgICAgY29uc3QgZyA9IHRoaXMuX2dlb20oKTsKICAgICAgaWYgKCFnKSByZXR1cm47CiAgICAgIGNvbnN0IG14ID0gTWF0aC5tYXgoMCwgKGcuaXcgKiBnLmJhc2UgKiB0aGlzLl92aWV3LnMgLyBnLmZ3IC0gMSkgKiA1MCk7CiAgICAgIGNvbnN0IG15ID0gTWF0aC5tYXgoMCwgKGcuaWggKiBnLmJhc2UgKiB0aGlzLl92aWV3LnMgLyBnLmZoIC0gMSkgKiA1MCk7CiAgICAgIHRoaXMuX3ZpZXcueCA9IE1hdGgubWF4KC1teCwgTWF0aC5taW4obXgsIHRoaXMuX3ZpZXcueCkpOwogICAgICB0aGlzLl92aWV3LnkgPSBNYXRoLm1heCgtbXksIE1hdGgubWluKG15LCB0aGlzLl92aWV3LnkpKTsKICAgIH0KCiAgICBfYXBwbHlWaWV3KCkgewogICAgICBjb25zdCBnID0gdGhpcy5fZ2VvbSgpOwogICAgICBjb25zdCBmaXQgPSB0aGlzLmdldEF0dHJpYnV0ZSgnZml0JykgfHwgJ2NvdmVyJzsKICAgICAgaWYgKGZpdCAhPT0gJ2NvdmVyJyB8fCAhZykgewogICAgICAgIC8vIE5vbi1jb3Zlciwgb3IgZGltZW5zaW9ucyBub3Qga25vd24geWV0IChiZWZvcmUgaW1nIGxvYWQpLgogICAgICAgIHRoaXMuX2ltZy5zdHlsZS53aWR0aCA9ICcxMDAlJzsKICAgICAgICB0aGlzLl9pbWcuc3R5bGUuaGVpZ2h0ID0gJzEwMCUnOwogICAgICAgIHRoaXMuX2ltZy5zdHlsZS5sZWZ0ID0gJzUwJSc7CiAgICAgICAgdGhpcy5faW1nLnN0eWxlLnRvcCA9ICc1MCUnOwogICAgICAgIHRoaXMuX2ltZy5zdHlsZS5vYmplY3RGaXQgPSBmaXQ7CiAgICAgICAgdGhpcy5faW1nLnN0eWxlLm9iamVjdFBvc2l0aW9uID0gdGhpcy5nZXRBdHRyaWJ1dGUoJ3Bvc2l0aW9uJykgfHwgJzUwJSA1MCUnOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICAvLyBDb3ZlciBiYXNlbGluZTogaW1nIGZpbGxzIHRoZSBmcmFtZSBvbiBpdHMgdGlnaHRlciBheGlzIGF0IHM9MSwgc28KICAgICAgLy8gcGFuIHdvcmtzIGltbWVkaWF0ZWx5IG9uIHRoZSBvdmVyZmxvd2luZyBheGlzIHdpdGhvdXQgem9vbWluZyBmaXJzdC4KICAgICAgLy8gV2lkdGgvaGVpZ2h0IGFuZCBsZWZ0L3RvcCBhcmUgYWxsIGZyYW1lLSUg4oCUIGRlcGVuZHMgb25seSBvbiB0aGUKICAgICAgLy8gZnJhbWUgYXNwZWN0IHJhdGlvLCBzbyBhIHJlc3BvbnNpdmUgcmVzaXplIGtlZXBzIHRoZSBzYW1lIGNyb3AuIFRoZQogICAgICAvLyBzcGlsbCBsYXllciBtaXJyb3JzIHRoZSBzYW1lIGJveCBzbyBpdHMgY29ybmVycyA9IGltYWdlIGNvcm5lcnMuCiAgICAgIGNvbnN0IGsgPSBnLmJhc2UgKiB0aGlzLl92aWV3LnM7CiAgICAgIGNvbnN0IHcgPSAoZy5pdyAqIGsgLyBnLmZ3ICogMTAwKSArICclJzsKICAgICAgY29uc3QgaCA9IChnLmloICogayAvIGcuZmggKiAxMDApICsgJyUnOwogICAgICBjb25zdCBsID0gKDUwICsgdGhpcy5fdmlldy54KSArICclJzsKICAgICAgY29uc3QgdCA9ICg1MCArIHRoaXMuX3ZpZXcueSkgKyAnJSc7CiAgICAgIHRoaXMuX2ltZy5zdHlsZS53aWR0aCA9IHc7IHRoaXMuX2ltZy5zdHlsZS5oZWlnaHQgPSBoOwogICAgICB0aGlzLl9pbWcuc3R5bGUubGVmdCA9IGw7IHRoaXMuX2ltZy5zdHlsZS50b3AgPSB0OwogICAgICB0aGlzLl9pbWcuc3R5bGUub2JqZWN0Rml0ID0gJyc7CiAgICAgIHRoaXMuX3NwaWxsLnN0eWxlLndpZHRoID0gdzsgdGhpcy5fc3BpbGwuc3R5bGUuaGVpZ2h0ID0gaDsKICAgICAgdGhpcy5fc3BpbGwuc3R5bGUubGVmdCA9IGw7IHRoaXMuX3NwaWxsLnN0eWxlLnRvcCA9IHQ7CiAgICB9CgogICAgX2NvbW1pdFZpZXcoKSB7CiAgICAgIGNvbnN0IHYgPSB7IHM6IHRoaXMuX3ZpZXcucywgeDogdGhpcy5fdmlldy54LCB5OiB0aGlzLl92aWV3LnkgfTsKICAgICAgaWYgKHRoaXMuX3VzZXJVcmwpIHYudSA9IHRoaXMuX3VzZXJVcmw7CiAgICAgIC8vIEZyYW1pbmctb25seSAobm8gdSkgcGVyc2lzdHMgdG9vIHNvIGFuIGF1dGhvci1zcmMgc2xvdCByZW1lbWJlcnMgaXRzCiAgICAgIC8vIGNyb3A7IGNsZWFyaW5nIHRoZSBzaWRlY2FyIHN0aWxsIGZhbGxzIHRocm91Z2ggdG8gc3JjPS4KICAgICAgaWYgKHRoaXMuaWQpIHNldFNsb3QodGhpcy5pZCwgdik7CiAgICAgIGVsc2UgeyB0aGlzLl9sb2NhbCA9IHY7IH0KICAgIH0KCiAgICBfcmVuZGVyKCkgewogICAgICAvLyBTaGFwZSAvIG1hc2suIFByZXNldHMgdXNlIGJvcmRlci1yYWRpdXMgc28gdGhlIGRhc2hlZCByaW5nIGNhbgogICAgICAvLyBmb2xsb3cgdGhlIHJvdW5kZWQgb3V0bGluZTsgY2xpcC1wYXRoIGlzIG9ubHkgYXBwbGllZCBmb3IgYW4KICAgICAgLy8gZXhwbGljaXQgYG1hc2tgICh0aGUgcmluZyBpcyBoaWRkZW4gdGhlcmUgc2luY2UgYSByZWN0YW5nbGUKICAgICAgLy8gZGFzaGVkIGJvcmRlciBjaG9wcGVkIGJ5IGFuIGFyYml0cmFyeSBwb2x5Z29uIGxvb2tzIGJyb2tlbikuCiAgICAgIGNvbnN0IG1hc2sgPSB0aGlzLmdldEF0dHJpYnV0ZSgnbWFzaycpOwogICAgICBjb25zdCBzaGFwZSA9ICh0aGlzLmdldEF0dHJpYnV0ZSgnc2hhcGUnKSB8fCAncm91bmRlZCcpLnRvTG93ZXJDYXNlKCk7CiAgICAgIGxldCByYWRpdXMgPSAnJzsKICAgICAgaWYgKHNoYXBlID09PSAnY2lyY2xlJykgcmFkaXVzID0gJzUwJSc7CiAgICAgIGVsc2UgaWYgKHNoYXBlID09PSAncGlsbCcpIHJhZGl1cyA9ICc5OTk5cHgnOwogICAgICBlbHNlIGlmIChzaGFwZSA9PT0gJ3JvdW5kZWQnKSB7CiAgICAgICAgY29uc3QgbiA9IHBhcnNlRmxvYXQodGhpcy5nZXRBdHRyaWJ1dGUoJ3JhZGl1cycpKTsKICAgICAgICByYWRpdXMgPSAoTnVtYmVyLmlzRmluaXRlKG4pID8gbiA6IDEyKSArICdweCc7CiAgICAgIH0KICAgICAgdGhpcy5fZnJhbWUuc3R5bGUuYm9yZGVyUmFkaXVzID0gbWFzayA\/ICcnIDogcmFkaXVzOwogICAgICB0aGlzLl9mcmFtZS5zdHlsZS5jbGlwUGF0aCA9IG1hc2sgfHwgJyc7CiAgICAgIHRoaXMuX3Jpbmcuc3R5bGUuYm9yZGVyUmFkaXVzID0gbWFzayA\/ICcnIDogcmFkaXVzOwogICAgICB0aGlzLl9yaW5nLnN0eWxlLmRpc3BsYXkgPSBtYXNrID8gJ25vbmUnIDogJyc7CgogICAgICAvLyBDb250cm9scyBhbmQgcmVmcmFtZSBlbnRyeSBnYXRlIG9uIHRoaXMgc28gc2hhcmUgbGlua3Mgc3RheSByZWFkLW9ubHkuCiAgICAgIGNvbnN0IGVkaXRhYmxlID0gISEod2luZG93Lm9tZWxldHRlICYmIHdpbmRvdy5vbWVsZXR0ZS53cml0ZUZpbGUpOwogICAgICB0aGlzLnRvZ2dsZUF0dHJpYnV0ZSgnZGF0YS1lZGl0YWJsZScsIGVkaXRhYmxlKTsKICAgICAgdGhpcy5fc3ViLnN0eWxlLmRpc3BsYXkgPSBlZGl0YWJsZSA\/ICcnIDogJ25vbmUnOwoKICAgICAgLy8gQ29udGVudC4gVGhlIHNpZGVjYXIgaXMgYWxzbyB3cml0YWJsZSBieSB0aGUgYWdlbnQncyB3cml0ZV9maWxlCiAgICAgIC8vIHRvb2wsIHNvIGl0cyB2YWx1ZSBpc24ndCBndWFyYW50ZWVkIGNhbnZhcy1vcmlnaW5hdGVkIOKAlCBvbmx5IGFjY2VwdAogICAgICAvLyBkYXRhOmltYWdlLyBVUkxzIGZyb20gaXQuIFRoZSBgc3JjYCBhdHRyaWJ1dGUgaXMgYXV0aG9yLWNvbnRyb2xsZWQKICAgICAgLy8gKENsYXVkZSB3cm90ZSBpdCBpbnRvIHRoZSBIVE1MKSBzbyBpdCBwYXNzZXMgdGhyb3VnaCB1bmNoYW5nZWQuCiAgICAgIGxldCBzdG9yZWQgPSB0aGlzLmlkID8gZ2V0U2xvdCh0aGlzLmlkKSA6IHRoaXMuX2xvY2FsOwogICAgICBpZiAoc3RvcmVkICYmIHN0b3JlZC51ICYmICEvXmRhdGE6aW1hZ2VcLy9pLnRlc3Qoc3RvcmVkLnUpKSBzdG9yZWQgPSBudWxsOwogICAgICBjb25zdCBzcmNBdHRyID0gdGhpcy5nZXRBdHRyaWJ1dGUoJ3NyYycpIHx8ICcnOwogICAgICB0aGlzLl91c2VyVXJsID0gKHN0b3JlZCAmJiBzdG9yZWQudSkgfHwgbnVsbDsKICAgICAgY29uc3QgdXJsID0gdGhpcy5fdXNlclVybCB8fCBzcmNBdHRyOwogICAgICAvLyBEb24ndCBjbG9iYmVyIGFuIGluLWZsaWdodCByZWZyYW1lIHdpdGggYSBzdG9yZS10cmlnZ2VyZWQgcmUtcmVuZGVyLgogICAgICBpZiAoIXRoaXMuaGFzQXR0cmlidXRlKCdkYXRhLXJlZnJhbWUnKSkgewogICAgICAgIHRoaXMuX3ZpZXcgPSB7CiAgICAgICAgICBzOiBzdG9yZWQgJiYgTnVtYmVyLmlzRmluaXRlKHN0b3JlZC5zKSA\/IGNsYW1wUyhzdG9yZWQucykgOiAxLAogICAgICAgICAgeDogc3RvcmVkICYmIE51bWJlci5pc0Zpbml0ZShzdG9yZWQueCkgPyBzdG9yZWQueCA6IDAsCiAgICAgICAgICB5OiBzdG9yZWQgJiYgTnVtYmVyLmlzRmluaXRlKHN0b3JlZC55KSA\/IHN0b3JlZC55IDogMCwKICAgICAgICB9OwogICAgICB9CiAgICAgIHRoaXMuX2NhcC50ZXh0Q29udGVudCA9IHRoaXMuZ2V0QXR0cmlidXRlKCdwbGFjZWhvbGRlcicpIHx8ICdEcm9wIGFuIGltYWdlJzsKICAgICAgLy8gVG9nZ2xlIHZpYSBzdHlsZS5kaXNwbGF5IOKAlCB0aGUgW2hpZGRlbl0gYXR0cmlidXRlIGFsb25lIGxvc2VzIHRvCiAgICAgIC8vIHRoZSBkaXNwbGF5OmZsZXggLyBkaXNwbGF5OmJsb2NrIHJ1bGVzIGluIHRoZSBzdHlsZXNoZWV0IGFib3ZlLgogICAgICBpZiAodXJsKSB7CiAgICAgICAgaWYgKHRoaXMuX2ltZy5nZXRBdHRyaWJ1dGUoJ3NyYycpICE9PSB1cmwpIHsKICAgICAgICAgIHRoaXMuX2ltZy5zcmMgPSB1cmw7CiAgICAgICAgICB0aGlzLl9naG9zdC5zcmMgPSB1cmw7CiAgICAgICAgfQogICAgICAgIHRoaXMuX2ltZy5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJzsKICAgICAgICB0aGlzLl9lbXB0eS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOwogICAgICAgIHRoaXMuc2V0QXR0cmlidXRlKCdkYXRhLWZpbGxlZCcsICcnKTsKICAgICAgICB0aGlzLl9jbGFtcFZpZXcoKTsKICAgICAgICB0aGlzLl9hcHBseVZpZXcoKTsKICAgICAgfSBlbHNlIHsKICAgICAgICB0aGlzLl9pbWcuc3R5bGUuZGlzcGxheSA9ICdub25lJzsKICAgICAgICB0aGlzLl9pbWcucmVtb3ZlQXR0cmlidXRlKCdzcmMnKTsKICAgICAgICB0aGlzLl9naG9zdC5yZW1vdmVBdHRyaWJ1dGUoJ3NyYycpOwogICAgICAgIHRoaXMuX2VtcHR5LnN0eWxlLmRpc3BsYXkgPSAnZmxleCc7CiAgICAgICAgdGhpcy5yZW1vdmVBdHRyaWJ1dGUoJ2RhdGEtZmlsbGVkJyk7CiAgICAgIH0KICAgIH0KICB9CgogIGlmICghY3VzdG9tRWxlbWVudHMuZ2V0KCdpbWFnZS1zbG90JykpIHsKICAgIGN1c3RvbUVsZW1lbnRzLmRlZmluZSgnaW1hZ2Utc2xvdCcsIEltYWdlU2xvdCk7CiAgfQp9KSgpOwo=#\/image-slot.js\" id=\"{{ im.id }}\" placeholder=\"{{ im.ph }}\" shape=\"rounded\" radius=\"14\" style=\"width:100%;height:100%;display:block;\" hint-size=\"100%,100%\"\u003e\u003c\/x-import\u003e\n              \u003c\/sc-for\u003e\n            \u003c\/div\u003e\n          \u003c\/div\u003e\n        \u003c\/div\u003e\n      \u003c\/sc-for\u003e\n\n      \u003cdiv style=\"display:flex;align-items:center;justify-content:space-between;gap:16px;margin-top:26px;padding-top:24px;border-top:1px solid #EEE8DA;flex-wrap:wrap;\"\u003e\n        \u003cdiv style=\"display:flex;align-items:center;gap:14px;\"\u003e\n          \u003cbutton onclick=\"{{ onHotelPrev }}\" style=\"font:inherit;font-size:16px;font-weight:600;cursor:pointer;border:1px solid #DCD5C5;background:#fff;color:#2A2B2D;border-radius:999px;width:40px;height:40px;line-height:1;\"\u003e‹\u003c\/button\u003e\n          \u003cbutton onclick=\"{{ onHotelNext }}\" style=\"font:inherit;font-size:16px;font-weight:600;cursor:pointer;border:1px solid #DCD5C5;background:#fff;color:#2A2B2D;border-radius:999px;width:40px;height:40px;line-height:1;\"\u003e›\u003c\/button\u003e\n          \u003cspan style=\"font-family:'Figtree',sans-serif;font-weight:600;font-size:13px;letter-spacing:.08em;color:#5C5848;\"\u003e{{ hotelCounter }}\u003c\/span\u003e\n        \u003c\/div\u003e\n        \u003cdiv style=\"display:flex;gap:8px;align-items:center;\"\u003e\n          \u003csc-for list=\"{{ hotelDots }}\" as=\"dot\" hint-placeholder-count=\"5\"\u003e\n            \u003cspan style=\"{{ dot.style }}\" onclick=\"{{ dot.onClick }}\"\u003e\u003c\/span\u003e\n          \u003c\/sc-for\u003e\n        \u003c\/div\u003e\n      \u003c\/div\u003e\n    \u003c\/div\u003e\n  \u003c\/section\u003e\n\n  \u003c!-- ===================== DIFFICULTY ===================== --\u003e\n  \u003csection style=\"margin-top:60px;background:#fff;border:1px solid #E7E0D1;border-radius:20px;padding:34px;display:grid;grid-template-columns:auto 1fr;gap:38px;align-items:center;\"\u003e\n    \u003cdiv style=\"text-align:center;\"\u003e\n      \u003cdiv style=\"font-family:'Figtree',sans-serif;font-weight:700;font-size:11px;letter-spacing:.14em;color:#9A917D;margin-bottom:8px;\"\u003eDIFFICULTY\u003c\/div\u003e\n      \u003cdiv style=\"font-family:'Figtree';font-weight:800;font-size:56px;line-height:1;color:#E1343F;\"\u003e4\u003cspan style=\"font-size:24px;color:#C9C3B5;\"\u003e\/5\u003c\/span\u003e\n\u003c\/div\u003e\n      \u003cdiv style=\"display:flex;gap:5px;justify-content:center;margin-top:16px;\"\u003e\n        \u003cspan style=\"width:36px;height:9px;border-radius:5px;background:#F6A21E;\"\u003e\u003c\/span\u003e\n        \u003cspan style=\"width:36px;height:9px;border-radius:5px;background:#F6A21E;\"\u003e\u003c\/span\u003e\n        \u003cspan style=\"width:36px;height:9px;border-radius:5px;background:#E1343F;\"\u003e\u003c\/span\u003e\n        \u003cspan style=\"width:36px;height:9px;border-radius:5px;background:#E1343F;\"\u003e\u003c\/span\u003e\n        \u003cspan style=\"width:36px;height:9px;border-radius:5px;background:#E7E0D1;\"\u003e\u003c\/span\u003e\n      \u003c\/div\u003e\n    \u003c\/div\u003e\n    \u003cdiv style=\"display:flex;flex-direction:column;gap:12px;\"\u003e\n      \u003cp style=\"margin:0;font-size:16.5px;line-height:1.55;color:#3F3E3A;\"\u003e\u003cstrong\u003eTwo demanding backcountry ski touring days\u003c\/strong\u003e at altitude (Days 5 and 6) with sustained physical effort and off-piste terrain.\u003c\/p\u003e\n      \u003cp style=\"margin:0;font-size:16.5px;line-height:1.55;color:#3F3E3A;\"\u003e\u003cstrong\u003eThe resort day (Day 4)\u003c\/strong\u003e requires intermediate to advanced ability. Avalanche safety equipment is mandatory on both touring days.\u003c\/p\u003e\n    \u003c\/div\u003e\n  \u003c\/section\u003e\n\n  \u003c!-- ===================== INCLUDED \/ EXCLUDED ===================== --\u003e\n  \u003csection style=\"margin-top:60px;display:grid;grid-template-columns:1fr 1fr;gap:16px;\"\u003e\n    \u003cdiv style=\"background:#fff;border:1px solid #E7E0D1;border-radius:18px;padding:30px;\"\u003e\n      \u003ch4 style=\"margin:0 0 20px;font-family:'Figtree';font-weight:800;font-size:18px;color:#1E8265;\"\u003eWhat's included\u003c\/h4\u003e\n      \u003cdiv style=\"display:flex;flex-direction:column;gap:12px;\"\u003e\n        \u003csc-for list=\"{{ included }}\" as=\"it\" hint-placeholder-count=\"10\"\u003e\n          \u003cspan style=\"display:flex;gap:11px;font-size:14.5px;color:#3F3E3A;line-height:1.4;\"\u003e\u003csvg width=\"17\" height=\"17\" style=\"flex:0 0 auto;margin-top:1px;\"\u003e\u003cpolyline points=\"3,9 7,13 14,4\" fill=\"none\" stroke=\"#1E8265\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\u003e\u003c\/polyline\u003e\u003c\/svg\u003e{{ it.t }}\u003c\/span\u003e\n        \u003c\/sc-for\u003e\n      \u003c\/div\u003e\n    \u003c\/div\u003e\n    \u003cdiv style=\"background:#fff;border:1px solid #E7E0D1;border-radius:18px;padding:30px;\"\u003e\n      \u003ch4 style=\"margin:0 0 20px;font-family:'Figtree';font-weight:800;font-size:18px;color:#E1343F;\"\u003eWhat's not included\u003c\/h4\u003e\n      \u003cdiv style=\"display:flex;flex-direction:column;gap:12px;\"\u003e\n        \u003csc-for list=\"{{ excluded }}\" as=\"it\" hint-placeholder-count=\"9\"\u003e\n          \u003cspan style=\"display:flex;gap:11px;font-size:14.5px;color:#3F3E3A;line-height:1.4;\"\u003e\u003csvg width=\"17\" height=\"17\" style=\"flex:0 0 auto;margin-top:1px;\"\u003e\u003cline x1=\"4\" y1=\"4\" x2=\"13\" y2=\"13\" stroke=\"#E1343F\" stroke-width=\"2.5\" stroke-linecap=\"round\"\u003e\u003c\/line\u003e\u003cline x1=\"13\" y1=\"4\" x2=\"4\" y2=\"13\" stroke=\"#E1343F\" stroke-width=\"2.5\" stroke-linecap=\"round\"\u003e\u003c\/line\u003e\u003c\/svg\u003e{{ it.t }}\u003c\/span\u003e\n        \u003c\/sc-for\u003e\n      \u003c\/div\u003e\n      \u003cdiv style=\"margin-top:24px;border-top:1px solid #EEE8DA;padding-top:20px;\"\u003e\n        \u003ch4 style=\"margin:0 0 16px;font-family:'Figtree';font-weight:800;font-size:16px;color:#2A2B2D;\"\u003eLogistics\u003c\/h4\u003e\n        \u003cdiv style=\"display:grid;grid-template-columns:1fr 1fr;gap:16px;\"\u003e\n          \u003cdiv\u003e\n\u003cdiv style=\"font-family:'Figtree',sans-serif;font-weight:700;font-size:10.5px;letter-spacing:.1em;color:#9A917D;margin-bottom:4px;\"\u003eARRIVAL\u003c\/div\u003e\n\u003cdiv style=\"font-size:14px;color:#3F3E3A;\"\u003eTbilisi Int'l (TBS)\u003c\/div\u003e\n\u003c\/div\u003e\n          \u003cdiv\u003e\n\u003cdiv style=\"font-family:'Figtree',sans-serif;font-weight:700;font-size:10.5px;letter-spacing:.1em;color:#9A917D;margin-bottom:4px;\"\u003eDEPARTURE\u003c\/div\u003e\n\u003cdiv style=\"font-size:14px;color:#3F3E3A;\"\u003eTbilisi Int'l (TBS)\u003c\/div\u003e\n\u003c\/div\u003e\n          \u003cdiv\u003e\n\u003cdiv style=\"font-family:'Figtree',sans-serif;font-weight:700;font-size:10.5px;letter-spacing:.1em;color:#9A917D;margin-bottom:4px;\"\u003eVISA\u003c\/div\u003e\n\u003cdiv style=\"font-size:14px;color:#3F3E3A;\"\u003eCheck for your nationality\u003c\/div\u003e\n\u003c\/div\u003e\n          \u003cdiv\u003e\n\u003cdiv style=\"font-family:'Figtree',sans-serif;font-weight:700;font-size:10.5px;letter-spacing:.1em;color:#9A917D;margin-bottom:4px;\"\u003eINSURANCE\u003c\/div\u003e\n\u003cdiv style=\"font-size:14px;color:#3F3E3A;\"\u003eMandatory · rescue cover\u003c\/div\u003e\n\u003c\/div\u003e\n        \u003c\/div\u003e\n      \u003c\/div\u003e\n    \u003c\/div\u003e\n  \u003c\/section\u003e\n\n  \u003c!-- ===================== WHAT TO BRING ===================== --\u003e\n  \u003csc-if value=\"{{ showPacking }}\" hint-placeholder-val=\"{{ true }}\"\u003e\n  \u003csection style=\"margin-top:60px;background:#2A2B2D;border-radius:20px;padding:36px;\"\u003e\n    \u003cdiv style=\"display:flex;align-items:baseline;justify-content:space-between;gap:16px;flex-wrap:wrap;margin-bottom:6px;\"\u003e\n      \u003cspan style=\"font-family:'Figtree',sans-serif;font-size:12px;font-weight:700;letter-spacing:.16em;color:#F6A21E;\"\u003e05 — WHAT TO BRING\u003c\/span\u003e\n      \u003cspan style=\"font-family:'Figtree',sans-serif;font-weight:600;font-size:12px;color:#9A917D;\"\u003e{{ packStatus }}\u003c\/span\u003e\n    \u003c\/div\u003e\n    \u003ch2 style=\"margin:12px 0 8px;font-family:'Figtree';font-weight:800;font-size:clamp(24px,3.4vw,34px);color:#fff;letter-spacing:-.015em;\"\u003eKit for the ski touring days\u003c\/h2\u003e\n    \u003cp style=\"margin:0 0 24px;max-width:680px;font-size:15.5px;line-height:1.6;color:#CDC7B8;\"\u003eFor the two backcountry touring days (Days 5 and 6). Skis, boots, poles and safety equipment are available to rent on location — tap to check off your kit.\u003c\/p\u003e\n\n    \u003cdiv style=\"display:grid;grid-template-columns:repeat(2,1fr);gap:24px;\"\u003e\n      \u003csc-for list=\"{{ packGroups }}\" as=\"grp\" hint-placeholder-count=\"4\"\u003e\n        \u003cdiv\u003e\n          \u003cdiv style=\"font-family:'Figtree',sans-serif;font-weight:700;font-size:11px;letter-spacing:.12em;color:#F6A21E;margin-bottom:12px;\"\u003e{{ grp.name }}\u003c\/div\u003e\n          \u003cdiv style=\"display:flex;flex-direction:column;gap:8px;\"\u003e\n            \u003csc-for list=\"{{ grp.items }}\" as=\"item\" hint-placeholder-count=\"5\"\u003e\n              \u003cbutton style=\"{{ item.style }}\" onclick=\"{{ item.onClick }}\"\u003e\n                \u003cspan style=\"{{ item.boxStyle }}\"\u003e\n                  \u003csc-if value=\"{{ item.checked }}\" hint-placeholder-val=\"{{ false }}\"\u003e\n                    \u003csvg width=\"13\" height=\"13\"\u003e\u003cpolyline points=\"2,7 5,11 11,3\" fill=\"none\" stroke=\"#fff\" stroke-width=\"2.4\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\u003e\u003c\/polyline\u003e\u003c\/svg\u003e\n                  \u003c\/sc-if\u003e\n                \u003c\/span\u003e\n                \u003cspan style=\"{{ item.textStyle }}\"\u003e{{ item.name }}\u003c\/span\u003e\n              \u003c\/button\u003e\n            \u003c\/sc-for\u003e\n          \u003c\/div\u003e\n        \u003c\/div\u003e\n      \u003c\/sc-for\u003e\n    \u003c\/div\u003e\n  \u003c\/section\u003e\n  \u003c\/sc-if\u003e\n\n  \u003c!-- ===================== FAQ ===================== --\u003e\n  \u003csection style=\"margin-top:90px;\"\u003e\n    \u003cspan style=\"font-family:'Figtree',sans-serif;font-size:12px;font-weight:700;letter-spacing:.16em;color:#1CA0DC;\"\u003e06 — FAQ\u003c\/span\u003e\n    \u003ch2 style=\"margin:12px 0 28px;font-family:'Figtree';font-weight:800;font-size:clamp(28px,4.4vw,44px);letter-spacing:-.015em;\"\u003eFrequently asked questions\u003c\/h2\u003e\n    \u003cdiv style=\"display:flex;flex-direction:column;gap:10px;\"\u003e\n      \u003csc-for list=\"{{ faqs }}\" as=\"f\" hint-placeholder-count=\"7\"\u003e\n        \u003cdiv style=\"background:#fff;border:1px solid #E7E0D1;border-radius:16px;overflow:hidden;\"\u003e\n          \u003cbutton onclick=\"{{ f.onClick }}\" style=\"width:100%;font:inherit;text-align:left;cursor:pointer;background:none;border:none;padding:22px 26px;display:flex;align-items:center;justify-content:space-between;gap:18px;\"\u003e\n            \u003cspan style=\"font-family:'Figtree';font-weight:700;font-size:17px;color:#2A2B2D;line-height:1.3;\"\u003e{{ f.q }}\u003c\/span\u003e\n            \u003cspan style=\"{{ f.signStyle }}\"\u003e{{ f.sign }}\u003c\/span\u003e\n          \u003c\/button\u003e\n          \u003csc-if value=\"{{ f.open }}\" hint-placeholder-val=\"{{ false }}\"\u003e\n            \u003cdiv style=\"padding:0 26px 24px;\"\u003e\n              \u003cp style=\"margin:0;font-size:15.5px;line-height:1.65;color:#3F3E3A;\"\u003e{{ f.a }}\u003c\/p\u003e\n            \u003c\/div\u003e\n          \u003c\/sc-if\u003e\n        \u003c\/div\u003e\n      \u003c\/sc-for\u003e\n    \u003c\/div\u003e\n  \u003c\/section\u003e\n\n  \u003c!-- ===================== FOOTER ===================== --\u003e\n  \u003cfooter style=\"margin-top:56px;padding-top:26px;border-top:1px solid #E7E0D1;\"\u003e\n    \u003cp style=\"margin:0;font-size:13px;color:#9A917D;line-height:1.55;\"\u003eItinerary, timings and accommodation are indicative and may change due to weather, snow, trail and local conditions. Distances and altitudes are approximate. Backcountry skiing and ski touring carry inherent risks; participation is at the guest's own risk with mandatory travel and mountain rescue insurance. Operated by Vital Ingredients \u0026amp; Adventures GmbH (The One Adventure), Wiedner Hauptstraße 142\/1\/5, 1050 Vienna, Austria.\u003c\/p\u003e\n  \u003c\/footer\u003e\n\n\u003c\/div\u003e\n\u003c\/div\u003e\n\u003c\/x-dc\u003e\n\u003cscript type=\"text\/x-dc\" data-dc-script=\"\" data-props='{\"autoPlayOnLoad\":{\"editor\":\"boolean\",\"default\":false,\"tsType\":\"boolean\"},\"showPackingList\":{\"editor\":\"boolean\",\"default\":true,\"tsType\":\"boolean\"}}'\u003e\nclass Component extends DCLogic {\n  constructor(props){\n    super(props);\n    this.PC = {1:'#1E8265',2:'#E1343F',3:'#1CA0DC'};\n    this.PHN = {1:'THE APPROACH',2:'THE MOUNTAINS',3:'THE RETURN'};\n    this.DATA = [\n      {n:1,phase:1,title:'Arrival',place:'Tbilisi',route:'Tbilisi (TBS) \\u2192 Hotel IOTA',modeLabel:'Airport transfer',acts:[],stats:[],accom:'Hotel IOTA, Tbilisi',narrative:'Arrive in Tbilisi and transfer to the boutique Hotel IOTA. The evening is at leisure to explore the Georgian capital \\u2014 its old town, sulphur baths and wine bars \\u2014 before the expedition begins.'},\n      {n:2,phase:1,title:'Cave City \u0026 Atenuri Wine',place:'Uplistsikhe \\u2192 Kutaisi',route:'Tbilisi \\u2192 Uplistsikhe \\u2192 Ateni Valley \\u2192 Kutaisi',modeLabel:'Drive \\u00b7 ~4 hrs',acts:['Walking','Wine tasting'],stats:[],accom:'Newport Hotel, Kutaisi',narrative:'The expedition opens in stone \\u2014 a walk through Uplistsikhe, a rock-hewn city carved into sandstone cliffs in the 2nd millennium BC. Uneven terrain and ancient silence let your legs begin learning what is ahead. We detour into the Ateni Valley for a private lunch and wine tasting with Nika Vacheishvili, former Georgian Minister of Culture, then reach Kutaisi for dinner at Sisters (Debi).'},\n      {n:3,phase:1,title:'Into the High Caucasus',place:'Mestia',route:'Kutaisi \\u2192 Mestia',modeLabel:'Drive \\u00b7 ~5 hrs',acts:[],stats:[],accom:'Hotel Gistola, Mestia',narrative:'We leave the lowlands and climb deep into the High Caucasus. The drive is a deliberate transition: the landscape narrows, the air thins, and the medieval stone towers of Mestia appear on the horizon. The afternoon is free for altitude acclimatisation.'},\n      {n:4,phase:2,title:'Tetnuldi Ski Day',place:'Tetnuldi Resort',route:'Mestia \\u00b7 Tetnuldi Resort',modeLabel:'Downhill skiing',acts:['Downhill skiing'],stats:[{label:'DIFFICULTY',value:'3 \/ 5'}],accom:'Hotel Gistola, Mestia',narrative:'A full day at Tetnuldi, perched high above the Svaneti valley \\u2014 some of the most uncrowded high-altitude slopes in the world, with crystalline air, wide-open terrain and the \\u201csilk snow\\u201d for which the region is famous. Ski with our guide to find the best off-piste lines, or set your own rhythm on the marked trails. This day is the technical warm-up.'},\n      {n:5,phase:2,title:'Latpari Ridge Tour',place:'Latpari Ridge \\u00b7 Adishi Valley',route:'Tetnuldi cable cars \\u2192 Latpari Ridge \\u2192 Adishi Valley',modeLabel:'Lift-assisted touring',acts:['Backcountry touring'],stats:[{label:'TOURING',value:'3\\u20134 hrs'},{label:'ASCENT',value:'~400 m'},{label:'DESCENT',value:'~1,100 m'},{label:'DIFFICULTY',value:'4 \/ 5'}],accom:'Hotel Gistola, Mestia',narrative:'We take the Tetnuldi cable cars to the upper resort and traverse toward the Latpari Ridge, following the spine of the mountains with the \\u201cWall of Svaneti\\u201d \\u2014 a 360\\u00b0 theatre of 5,000-metre peaks \\u2014 in constant view. After a skinning session to the optimal vantage point, the descent opens into the pristine north-facing powder bowls of the Adishi Valley. Our 4x4 support meets us at the valley floor for the drive back to Mestia.'},\n      {n:6,phase:2,title:'Tsvirmi Tour \u0026 Spa',place:'Tsvirmi \\u2192 Tskaltubo',route:'Mestia cable car \\u2192 Zuruldi Ridge \\u2192 Tsvirmi \\u2192 Tskaltubo',modeLabel:'Backcountry + wellness',acts:['Backcountry skiing','Wellness'],stats:[{label:'TOURING',value:'3\\u20134 hrs'},{label:'ASCENT',value:'~300 m'},{label:'DESCENT',value:'~800 m'},{label:'DIFFICULTY',value:'3 \/ 5'}],accom:'Tskaltubo Epic Hotel \u0026 Spa',narrative:'The final mountain chapter. The Mestia cable car carries us to the Zuruldi Ridge at 2,340 m; we follow the snow-covered spine before dropping 700 vertical metres through light forest and open meadows into the hidden village of Tsvirmi, unchanged by time. We then drive to Tskaltubo and the Epic Hotel \u0026 Spa \\u2014 thermal pools, sauna, and the quiet satisfaction of two days of technical skiing.'},\n      {n:7,phase:3,title:'Prometheus Cave',place:'Prometheus Cave \\u2192 Tbilisi',route:'Tskaltubo \\u2192 Prometheus Cave \\u2192 Tbilisi',modeLabel:'Cave \u0026 transit \\u00b7 ~3 hrs',acts:['Cave exploration'],stats:[{label:'DIFFICULTY',value:'1 \/ 5'}],accom:'Hotel IOTA, Tbilisi',narrative:'We descend into the earth before returning to the capital. Prometheus Cave is a subterranean karst system of illuminated stalactites and underground rivers \\u2014 the final contrast in a journey built on vertical transitions. A silent boat ride on the underground river closes the mountain chapter; the evening in Tbilisi is yours.'},\n      {n:8,phase:3,title:'Departure',place:'Tbilisi',route:'Tbilisi \\u2192 Airport (TBS)',modeLabel:'Departure transfer',acts:[],stats:[],accom:'\\u2014',narrative:'Transfer to Tbilisi International Airport for the onward departure flight, closing the expedition.'}\n    ];\n    this.HOTELS = [\n      {name:'Hotel IOTA', where:'TBILISI', nights:'NIGHTS 1 \u0026 7', tag:'Boutique design', desc:'A boutique design hotel in the heart of Tbilisi \\u2014 the base for the first night and the return night, within reach of the old town, sulphur baths and the capital\\u2019s wine bars.', imgs:[{id:'h-iota-1',ph:'Exterior'},{id:'h-iota-2',ph:'Room'},{id:'h-iota-3',ph:'Lounge'},{id:'h-iota-4',ph:'Tbilisi'}]},\n      {name:'Newport Hotel', where:'KUTAISI', nights:'NIGHT 2', tag:'or equivalent', desc:'A comfortable overnight in Kutaisi between the cave city and the climb into the Caucasus \\u2014 the staging point before the long drive up to Mestia.', imgs:[{id:'h-newport-1',ph:'Exterior'},{id:'h-newport-2',ph:'Room'},{id:'h-newport-3',ph:'Dining'},{id:'h-newport-4',ph:'Kutaisi'}]},\n      {name:'Hotel Gistola', where:'MESTIA', nights:'NIGHTS 3\\u20135', tag:'Pool \u0026 sauna', desc:'Three nights at the mountain base in Mestia, with indoor pool and sauna \\u2014 home for the Tetnuldi ski day and the two backcountry touring days, surrounded by the medieval stone towers of Svaneti.', imgs:[{id:'h-gistola-1',ph:'Exterior'},{id:'h-gistola-2',ph:'Room'},{id:'h-gistola-3',ph:'Pool \u0026 sauna'},{id:'h-gistola-4',ph:'Mestia towers'}]},\n      {name:'Tskaltubo Epic Hotel \u0026 Spa', where:'TSKALTUBO', nights:'NIGHT 6', tag:'Thermal spa', desc:'A Soviet-era thermal wellness sanctuary in Tskaltubo \\u2014 outdoor and indoor pools, jacuzzis and saunas after the two ski touring days. (Spa treatments not included.)', imgs:[{id:'h-tska-1',ph:'Exterior'},{id:'h-tska-2',ph:'Room'},{id:'h-tska-3',ph:'Thermal pool'},{id:'h-tska-4',ph:'Spa'}]}\n    ];\n    this.PACKG = [\n      {name:'SKI TOURING ESSENTIALS', items:['Touring \/ all-mountain skis + bindings','Touring boots (binding-compatible)','Climbing skins','Helmet (strongly recommended)','Avalanche transceiver \/ beacon','Avalanche probe','Collapsible avalanche shovel']},\n      {name:'CLOTHING LAYERS', items:['Moisture-wicking base layer','Insulating mid-layer (fleece \/ down)','Waterproof ski jacket \u0026 salopettes','Warm hat \u0026 neck gaiter','Insulated waterproof ski gloves','Goggles (variable-light lens)','Spare gloves']},\n      {name:'ACCESSORIES', items:['High-SPF sunscreen \u0026 lip balm','Ski boot bag','Reusable water bottle (2 L min)','Touring daypack (20\\u201325 L)','Snacks for touring days','Trekking poles (optional)']},\n      {name:'DOCUMENTS \u0026 ADMIN', items:['Valid passport','Insurance docs (rescue cover)','Accommodation confirmations','Emergency contact details']}\n    ];\n    this.INCLUDED = ['Transportation by van throughout','Certified expedition guide + ski mountaineering guides (1 : 4 on touring days)','All accommodation (twin, with breakfast) as listed','All ski passes (Days 4, 5 \u0026 6)','Private wine tasting \u0026 lunch with Nika Vacheishvili','Dinner in Kutaisi','4x4 extraction from the Adishi Valley','Indoor pool \u0026 sauna at Hotel Gistola, Mestia','Pools, jacuzzis \u0026 saunas at Tskaltubo Epic Hotel \u0026 Spa','Entrance fee: Uplistsikhe Cave Town','Entrance fee: Prometheus Cave'];\n    this.EXCLUDED = ['Ski gear rental (~\\u20ac30\/day \\u2014 on location)','Touring safety equipment (~\\u20ac20\/day \\u2014 on location)','Ski instructor (~\\u20ac52\/hr, optional \\u2014 on location)','Single room supplement (+\\u20ac500 if requested)','International flights to\/from Tbilisi','Travel insurance (mandatory)','Visa fees (if applicable)','Personal expenses \u0026 selected meals'];\n    this.FAQ = [\n      {q:'Do I need backcountry ski touring experience for this trip?',a:'Prior touring experience is an advantage but not a strict requirement. Both touring days use the Tetnuldi cable car system to gain altitude before the traverse begins, which eliminates the most technically demanding part of traditional uphill touring. What is required is genuine intermediate-to-advanced ski ability \\u2014 you need to be comfortable managing diverse high-alpine snow conditions on the descent \\u2014 and good physical fitness. Our ski mountaineering guides assess conditions daily and adapt routes accordingly.'},\n      {q:'What is Tetnuldi Ski Resort and how does it compare to Gudauri?',a:'Tetnuldi is a high-altitude resort in the Svaneti region of the Greater Caucasus, sitting above 2,700 m. Unlike Gudauri \\u2014 Georgia\\u2019s most widely known resort \\u2014 Tetnuldi sees significantly lower visitor numbers, meaning uncrowded runs and largely untracked off-piste terrain. The resort is the access point for the backcountry touring on Days 5 and 6; the cable car infrastructure lets us begin traverses at altitude rather than from the valley floor.'},\n      {q:'What is the Latpari Ridge ski tour?',a:'The Latpari traverse begins at the top of the Tetnuldi lift system and follows the natural ridge spine toward the Latpari Ridge at approximately 2,700\\u20132,800 m, keeping the \\u201cWall of Svaneti\\u201d \\u2014 the chain of 5,000-metre Caucasus peaks \\u2014 in full view throughout. After a skinning section of roughly 400 vertical metres, the descent opens into the north-facing powder bowls of the Adishi Valley, covering about 1,100 vertical metres before meeting the 4x4 support vehicles.'},\n      {q:'Is avalanche safety equipment mandatory?',a:'Yes. Transceiver, avalanche probe and shovel are mandatory on both touring days, and all three are available to rent on location for approximately \\u20ac20 per day. Our ski mountaineering guides carry group emergency equipment and conduct a safety briefing on the morning of each touring day. The tour operates with a maximum 1 guide per 4 guests ratio.'},\n      {q:'Who is Nika Vacheishvili and why is the wine tasting significant?',a:'Nika Vacheishvili is a former Georgian Minister of Culture and Heritage Preservation, and a leading practitioner in the revival of Georgia\\u2019s ancient Atenuri winemaking tradition. The Atenuri grape \\u2014 sometimes called the \\u201cWine of the Kings\\u201d \\u2014 is one of Georgia\\u2019s rarest indigenous varieties, produced using traditional qvevri (clay amphora) methods dating back 8,000 years. The private lunch and tasting he hosts is not a standard winery visit; it is a behind-the-scenes encounter with the person preserving this tradition for future generations.'},\n      {q:'What is the minimum fitness requirement?',a:'You should be comfortable with two consecutive days of demanding physical activity in high-alpine conditions, including 3\\u20134 hours of ski touring with elevation gain, exposure to altitude above 2,700 m, and prolonged off-piste skiing. Days 1, 2 and 7 are light, and Day 4 is a resort ski day. Days 5 and 6 are the physically demanding core of the expedition. If you ski regularly and are comfortable on red and black runs, you have the base fitness required.'},\n      {q:'How large are the groups, and what is the guide ratio?',a:'This expedition operates with a maximum of 10 guests and a minimum of 6. On the two ski touring days, the guide-to-guest ratio is 1 : 4 \\u2014 one certified ski mountaineering guide per four guests \\u2014 for safety in backcountry terrain.'}\n    ];\n    this.state = { active:1, phase:0, playing:false, packed:{}, hotel:0, faq:{} };\n  }\n\n  componentDidMount(){\n    try{ const p=JSON.parse(localStorage.getItem('toa_pack_georgia')||'{}'); if(p\u0026\u0026typeof p==='object') this.setState({packed:p}); }catch(e){}\n    if(this.props.autoPlayOnLoad){ this._t=setInterval(()=\u003ethis.next(),1500); this.setState({playing:true}); }\n  }\n  componentWillUnmount(){ if(this._t) clearInterval(this._t); }\n\n  setDay(n){ this.setState({active:n}); }\n  next(){ this.setState(s=\u003e({active:s.active\u003e=8?1:s.active+1})); }\n  prev(){ this.setState(s=\u003e({active:s.active\u003c=1?8:s.active-1})); }\n  togglePlay(){\n    if(this.state.playing){ clearInterval(this._t); this._t=null; this.setState({playing:false}); }\n    else { this._t=setInterval(()=\u003ethis.next(),1500); this.setState({playing:true}); }\n  }\n  setPhase(p){ const start={1:1,2:4,3:7}[p]; this.setState(s=\u003e s.phase===p?{phase:0}:{phase:p,active:start}); }\n  togglePack(key){ this.setState(s=\u003e{ const k=Object.assign({},s.packed); k[key]=!k[key]; try{localStorage.setItem('toa_pack_georgia',JSON.stringify(k));}catch(e){} return {packed:k}; }); }\n  setHotel(i){ this.setState({hotel:i}); }\n  nextHotel(){ this.setState(s=\u003e({hotel:(s.hotel+1)%this.HOTELS.length})); }\n  prevHotel(){ this.setState(s=\u003e({hotel:(s.hotel-1+this.HOTELS.length)%this.HOTELS.length})); }\n  toggleFaq(i){ this.setState(s=\u003e{ const k=Object.assign({},s.faq); k[i]=!k[i]; return {faq:k}; }); }\n\n  renderVals(){\n    const PC=this.PC, a=this.state.active, pf=this.state.phase;\n    const d=this.DATA[a-1];\n    const phaseFull={1:'The Approach \\u00b7 Culture',2:'The Mountains \\u00b7 Svaneti',3:'The Return \\u00b7 Spa \u0026 Caves'};\n\n    const days=this.DATA.map(x=\u003e{\n      const act=x.n===a;\n      return {\n        n2:String(x.n).padStart(2,'0'), title:x.title, place:x.place,\n        onClick:()=\u003ethis.setDay(x.n),\n        rowStyle:{display:'flex',gap:'13px',alignItems:'flex-start',padding:'14px 16px',borderRadius:'14px',cursor:'pointer',border:'1px solid '+(act?PC[x.phase]:'#E7E0D1'),borderLeft:'5px solid '+(act?PC[x.phase]:'#E7E0D1'),background:act?'#fff':'rgba(255,255,255,.4)',boxShadow:act?'0 8px 22px rgba(0,0,0,.07)':'none',transition:'all .18s'},\n        numStyle:{fontFamily:\"'Figtree', sans-serif\",fontWeight:800,fontSize:'14px',color:PC[x.phase],minWidth:'22px',paddingTop:'1px'},\n        titleStyle:{fontFamily:\"'Figtree', sans-serif\",fontWeight:700,fontSize:'15px',color:act?'#2A2B2D':'#54503F',lineHeight:1.2},\n        placeStyle:{fontFamily:\"'Figtree', sans-serif\",fontWeight:600,fontSize:'11px',color:'#9A917D',marginTop:'3px',letterSpacing:'.02em'}\n      };\n    });\n\n    const meta={\n      1:{range:'DAYS 01\\u201303',name:'The Approach \\u2014 Culture',blurb:'Tbilisi, the Uplistsikhe cave city, Atenuri wine, and the climb to Mestia.'},\n      2:{range:'DAYS 04\\u201306',name:'The Mountains \\u2014 Svaneti',blurb:'Tetnuldi resort skiing and two backcountry touring traverses.'},\n      3:{range:'DAYS 07\\u201308',name:'The Return \\u2014 Spa \u0026 Caves',blurb:'Prometheus Cave and the journey back to Tbilisi.'}\n    };\n    const phases=[1,2,3].map(p=\u003e{\n      const act=pf===p;\n      return {\n        onClick:()=\u003ethis.setPhase(p), color:PC[p], range:meta[p].range, name:meta[p].name, blurb:meta[p].blurb,\n        cardStyle:{flex:'1 1 220px',minWidth:'0',background:'#fff',borderRadius:'16px',overflow:'hidden',cursor:'pointer',border:'1.5px solid '+(act?PC[p]:'#E7E0D1'),boxShadow:act?'0 14px 32px rgba(0,0,0,.10)':'0 2px 8px rgba(0,0,0,.03)',transform:act?'translateY(-3px)':'none',transition:'all .2s'}\n      };\n    });\n\n    const packed=this.state.packed;\n    let packCount=0, packTotal=0;\n    const packGroups=this.PACKG.map((g,gi)=\u003e({\n      name:g.name,\n      items:g.items.map((t,ii)=\u003e{\n        const key=gi+'-'+ii; const ck=!!packed[key]; packTotal++; if(ck) packCount++;\n        return {\n          name:t, checked:ck, onClick:()=\u003ethis.togglePack(key),\n          style:{display:'flex',alignItems:'center',gap:'12px',padding:'12px 14px',borderRadius:'12px',border:'1px solid '+(ck?'#1E8265':'rgba(255,255,255,.16)'),background:ck?'rgba(30,130,101,.16)':'rgba(255,255,255,.05)',cursor:'pointer',textAlign:'left',width:'100%',font:'inherit',transition:'all .15s'},\n          boxStyle:{width:'22px',height:'22px',flex:'0 0 auto',borderRadius:'6px',border:'2px solid '+(ck?'#1E8265':'rgba(255,255,255,.35)'),background:ck?'#1E8265':'transparent',display:'flex',alignItems:'center',justifyContent:'center'},\n          textStyle:{fontSize:'13.5px',color:ck?'#fff':'#CDC7B8',fontWeight:ck?600:500,lineHeight:1.3}\n        };\n      })\n    }));\n\n    const hi=this.state.hotel;\n    const hotels=this.HOTELS.map((h,i)=\u003e({\n      name:h.name, where:h.where, desc:h.desc, imgs:h.imgs, nights:h.nights, tag:h.tag,\n      wrapStyle:{display:i===hi?'block':'none'}\n    }));\n    const hotelDots=this.HOTELS.map((h,i)=\u003e({\n      onClick:()=\u003ethis.setHotel(i),\n      style:{width:i===hi?'26px':'9px',height:'9px',borderRadius:'999px',background:i===hi?'#E1343F':'#D8D2C4',cursor:'pointer',transition:'all .2s',display:'inline-block'}\n    }));\n\n    const faqState=this.state.faq;\n    const faqs=this.FAQ.map((f,i)=\u003e{\n      const op=!!faqState[i];\n      return {\n        q:f.q, a:f.a, open:op, sign:op?'\\u2212':'+',\n        onClick:()=\u003ethis.toggleFaq(i),\n        signStyle:{flex:'0 0 auto',width:'30px',height:'30px',borderRadius:'999px',background:op?'#1CA0DC':'#F3EEE2',color:op?'#fff':'#5C5848',display:'flex',alignItems:'center',justifyContent:'center',fontSize:'18px',fontWeight:700,lineHeight:1,transition:'all .15s'}\n      };\n    });\n\n    return {\n      days, phases, packGroups, hotels, hotelDots, faqs,\n      included:this.INCLUDED.map(t=\u003e({t})), excluded:this.EXCLUDED.map(t=\u003e({t})),\n      hotelCounter:String(hi+1).padStart(2,'0')+' \/ '+String(this.HOTELS.length).padStart(2,'0'),\n      onHotelPrev:()=\u003ethis.prevHotel(), onHotelNext:()=\u003ethis.nextHotel(),\n      showPacking:this.props.showPackingList!==false,\n      packStatus:packCount+' \/ '+packTotal+' packed',\n      active:{\n        dayLabel:'DAY '+String(a).padStart(2,'0'), place:d.place, route:d.route, narrative:d.narrative,\n        phaseName:this.PHN[d.phase], modeLabel:d.modeLabel, accom:d.accom, hasActs:d.acts.length\u003e0, hasStats:d.stats.length\u003e0\n      },\n      activeActs:d.acts.map(x=\u003e({name:x})),\n      activeStats:d.stats.map(s=\u003e({label:s.label,value:s.value})),\n      progress:'Day '+a+' of 8 \\u00b7 '+phaseFull[d.phase],\n      onPrev:()=\u003ethis.prev(), onNext:()=\u003ethis.next(), onPlay:()=\u003ethis.togglePlay(),\n      playLabel:this.state.playing?'Pause':'Auto-play',\n      tagStyle:{display:'inline-block',padding:'4px 11px',borderRadius:'999px',background:PC[d.phase],color:'#fff',fontFamily:\"'Figtree', sans-serif\",fontSize:'11px',fontWeight:700,letterSpacing:'.06em'}\n    };\n  }\n}\n\u003c\/script\u003e\n\n\n\u003c\/body\u003e","brand":"The One Adventure","offers":[{"title":"Jan – Mar 2027","offer_id":57625992790398,"sku":null,"price":3750.0,"currency_code":"EUR","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0971\/7166\/9374\/files\/Photo_24.02.24_04_59_10_2_1500pxWEB.webp?v=1782806907","url":"https:\/\/theoneadventure.com\/products\/georgia-silk-snow-svaneti","provider":"The One Adventure","version":"1.0","type":"link"}